summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
Diffstat (limited to 'indra')
-rw-r--r--indra/CMakeLists.txt21
-rw-r--r--indra/cmake/00-Common.cmake66
-rw-r--r--indra/cmake/APR.cmake16
-rw-r--r--indra/cmake/BerkeleyDB.cmake8
-rw-r--r--indra/cmake/Boost.cmake51
-rw-r--r--indra/cmake/CARes.cmake5
-rw-r--r--indra/cmake/CMakeLists.txt6
-rw-r--r--indra/cmake/CURL.cmake6
-rw-r--r--indra/cmake/Copy3rdPartyLibs.cmake225
-rw-r--r--indra/cmake/DBusGlib.cmake2
-rw-r--r--indra/cmake/DirectX.cmake2
-rw-r--r--indra/cmake/ELFIO.cmake19
-rw-r--r--indra/cmake/FMOD.cmake43
-rw-r--r--indra/cmake/FindAutobuild.cmake41
-rw-r--r--indra/cmake/FindFMOD.cmake2
-rw-r--r--indra/cmake/FindGLH.cmake30
-rw-r--r--indra/cmake/FindJsonCpp.cmake5
-rw-r--r--indra/cmake/FindLLQtWebkit.cmake62
-rw-r--r--indra/cmake/FindNDOF.cmake39
-rw-r--r--indra/cmake/FindTut.cmake31
-rw-r--r--indra/cmake/FindZLIB.cmake46
-rw-r--r--indra/cmake/FreeType.cmake2
-rw-r--r--indra/cmake/GLH.cmake11
-rw-r--r--indra/cmake/GLOD.cmake9
-rw-r--r--indra/cmake/GStreamer010Plugin.cmake6
-rw-r--r--indra/cmake/GetPrerequisites_2_8.cmake1572
-rw-r--r--indra/cmake/GoogleMock.cmake5
-rw-r--r--indra/cmake/GooglePerfTools.cmake15
-rw-r--r--indra/cmake/JPEG.cmake5
-rw-r--r--indra/cmake/JsonCpp.cmake10
-rw-r--r--indra/cmake/LLAddBuildTest.cmake545
-rw-r--r--indra/cmake/LLCommon.cmake9
-rw-r--r--indra/cmake/LLConvexDecomposition.cmake12
-rw-r--r--indra/cmake/LLKDU.cmake22
-rw-r--r--indra/cmake/LLPlugin.cmake8
-rw-r--r--indra/cmake/LLPrimitive.cmake28
-rw-r--r--indra/cmake/LLRender.cmake2
-rw-r--r--indra/cmake/LLSharedLibs.cmake24
-rw-r--r--indra/cmake/LLTestCommand.cmake1
-rw-r--r--indra/cmake/LLWindow.cmake2
-rw-r--r--indra/cmake/LScript.cmake2
-rw-r--r--indra/cmake/Linking.cmake67
-rw-r--r--indra/cmake/MonoEmbed.cmake4
-rw-r--r--indra/cmake/MySQL.cmake6
-rw-r--r--indra/cmake/NDOF.cmake34
-rw-r--r--indra/cmake/OPENAL.cmake16
-rw-r--r--indra/cmake/OpenGL.cmake5
-rw-r--r--indra/cmake/OpenSSL.cmake6
-rw-r--r--indra/cmake/PNG.cmake12
-rw-r--r--indra/cmake/Prebuilt.cmake75
-rw-r--r--indra/cmake/Pth.cmake21
-rw-r--r--indra/cmake/PulseAudio.cmake2
-rw-r--r--indra/cmake/QuickTimePlugin.cmake2
-rw-r--r--indra/cmake/TemplateCheck.cmake7
-rw-r--r--indra/cmake/Tut.cmake10
-rw-r--r--indra/cmake/UI.cmake4
-rw-r--r--indra/cmake/Variables.cmake72
-rw-r--r--indra/cmake/VisualLeakDetector.cmake15
-rw-r--r--indra/cmake/WebKitLibPlugin.cmake97
-rw-r--r--indra/cmake/XmlRpcEpi.cmake5
-rw-r--r--indra/cmake/run_build_test.py4
-rw-r--r--indra/copy_win_scripts/start-client.py24
-rwxr-xr-xindra/develop.py862
-rw-r--r--indra/edit-me-to-trigger-new-build.txt0
-rw-r--r--indra/fix-incredibuild.py23
-rw-r--r--indra/integration_tests/CMakeLists.txt7
-rw-r--r--indra/integration_tests/llimage_libtest/CMakeLists.txt125
-rw-r--r--indra/integration_tests/llimage_libtest/llimage_libtest.cpp561
-rw-r--r--indra/integration_tests/llimage_libtest/llimage_libtest.h29
-rw-r--r--indra/integration_tests/llui_libtest/CMakeLists.txt11
-rw-r--r--indra/integration_tests/llui_libtest/llui_libtest.cpp5
-rw-r--r--indra/integration_tests/llui_libtest/llwidgetreg.cpp2
-rw-r--r--indra/lib/python/indra/base/cllsd_test.py22
-rw-r--r--indra/lib/python/indra/base/lluuid.py6
-rw-r--r--indra/lib/python/indra/ipc/httputil.py21
-rw-r--r--indra/lib/python/indra/ipc/russ.py2
-rw-r--r--indra/lib/python/indra/ipc/siesta_test.py21
-rwxr-xr-xindra/lib/python/indra/util/llperformance.py26
-rw-r--r--indra/lib/python/indra/util/llversion.py57
-rwxr-xr-xindra/lib/python/indra/util/simperf_proc_interface.py2
-rw-r--r--indra/lib/python/indra/util/test_win32_manifest.py73
-rw-r--r--indra/lib/python/uuid.py21
-rw-r--r--indra/linux_crash_logger/CMakeLists.txt1
-rw-r--r--indra/linux_crash_logger/linux_crash_logger.cpp14
-rw-r--r--indra/linux_crash_logger/llcrashloggerlinux.cpp8
-rw-r--r--indra/linux_crash_logger/llcrashloggerlinux.h1
-rw-r--r--indra/linux_updater/linux_updater.cpp24
-rw-r--r--indra/llaudio/CMakeLists.txt1
-rw-r--r--indra/llaudio/llaudiodecodemgr.cpp10
-rw-r--r--indra/llaudio/llaudioengine.cpp29
-rw-r--r--indra/llaudio/llaudioengine.h2
-rw-r--r--indra/llaudio/llaudioengine_openal.cpp2
-rw-r--r--indra/llaudio/llaudioengine_openal.h2
-rw-r--r--indra/llcharacter/CMakeLists.txt15
-rw-r--r--indra/llcharacter/llanimationstates.cpp278
-rw-r--r--indra/llcharacter/llbvhloader.cpp12
-rw-r--r--indra/llcharacter/llcharacter.cpp25
-rw-r--r--indra/llcharacter/llcharacter.h3
-rw-r--r--indra/llcharacter/lljoint.cpp38
-rw-r--r--indra/llcharacter/lljoint.h24
-rw-r--r--indra/llcharacter/llkeyframemotion.cpp75
-rw-r--r--indra/llcharacter/llkeyframemotion.h2
-rw-r--r--indra/llcommon/CMakeLists.txt21
-rw-r--r--indra/llcommon/indra_constants.h10
-rw-r--r--indra/llcommon/linden_common.h23
-rw-r--r--indra/llcommon/llaccountingcost.h86
-rw-r--r--indra/llcommon/llapp.cpp7
-rw-r--r--indra/llcommon/llapr.cpp22
-rw-r--r--indra/llcommon/llapr.h5
-rw-r--r--indra/llcommon/llassettype.cpp4
-rw-r--r--indra/llcommon/llassettype.h8
-rw-r--r--indra/llcommon/llavatarconstants.h8
-rw-r--r--indra/llcommon/llavatarname.cpp17
-rw-r--r--indra/llcommon/llavatarname.h2
-rw-r--r--indra/llcommon/llchat.h3
-rw-r--r--indra/llcommon/lldefs.h8
-rw-r--r--indra/llcommon/llerror.cpp8
-rw-r--r--indra/llcommon/llerror.h14
-rw-r--r--indra/llcommon/llerrorcontrol.h1
-rw-r--r--indra/llcommon/lleventapi.cpp30
-rw-r--r--indra/llcommon/lleventapi.h83
-rw-r--r--indra/llcommon/lleventdispatcher.cpp566
-rw-r--r--indra/llcommon/lleventdispatcher.h393
-rw-r--r--indra/llcommon/llevents.cpp32
-rw-r--r--indra/llcommon/llevents.h14
-rw-r--r--indra/llcommon/lleventtimer.cpp20
-rw-r--r--indra/llcommon/llfasttimer.h135
-rw-r--r--indra/llcommon/llfasttimer_class.cpp226
-rw-r--r--indra/llcommon/llfasttimer_class.h11
-rw-r--r--indra/llcommon/llfile.cpp11
-rw-r--r--indra/llcommon/llfile.h2
-rw-r--r--indra/llcommon/llfoldertype.cpp5
-rw-r--r--indra/llcommon/llfoldertype.h9
-rw-r--r--indra/llcommon/llinstancetracker.cpp18
-rw-r--r--indra/llcommon/llinstancetracker.h266
-rw-r--r--indra/llcommon/lllslconstants.h2
-rw-r--r--indra/llcommon/llmd5.cpp2
-rw-r--r--indra/llcommon/llmd5.h2
-rw-r--r--indra/llcommon/llmemory.cpp2075
-rw-r--r--indra/llcommon/llmemory.h476
-rw-r--r--indra/llcommon/llmemtype.cpp1
-rw-r--r--indra/llcommon/llmetricperformancetester.cpp84
-rw-r--r--indra/llcommon/llmetricperformancetester.h11
-rw-r--r--indra/llcommon/llpreprocessor.h4
-rw-r--r--indra/llcommon/llprocesslauncher.cpp33
-rw-r--r--indra/llcommon/llqueuedthread.cpp11
-rw-r--r--indra/llcommon/llqueuedthread.h8
-rw-r--r--indra/llcommon/llrefcount.cpp110
-rw-r--r--indra/llcommon/llrefcount.h20
-rw-r--r--indra/llcommon/llsd.cpp212
-rw-r--r--indra/llcommon/llsd.h130
-rw-r--r--indra/llcommon/llsdserialize.cpp203
-rw-r--r--indra/llcommon/llsdserialize.h4
-rw-r--r--indra/llcommon/llsdserialize_xml.cpp34
-rw-r--r--indra/llcommon/llsdutil.cpp27
-rw-r--r--indra/llcommon/llsdutil.h285
-rw-r--r--indra/llcommon/llsingleton.h38
-rw-r--r--indra/llcommon/llstat.cpp4
-rw-r--r--indra/llcommon/llstring.cpp13
-rw-r--r--indra/llcommon/llsys.cpp720
-rw-r--r--indra/llcommon/llsys.h22
-rw-r--r--indra/llcommon/llthread.cpp76
-rw-r--r--indra/llcommon/llthread.h30
-rw-r--r--indra/llcommon/lltimer.cpp2
-rw-r--r--indra/llcommon/llversionviewer.h8
-rw-r--r--indra/llcommon/llworkerthread.cpp6
-rw-r--r--indra/llcommon/llworkerthread.h4
-rw-r--r--indra/llcommon/stdenums.h4
-rw-r--r--indra/llcommon/tests/lldependencies_test.cpp12
-rw-r--r--indra/llcommon/tests/llerror_test.cpp16
-rw-r--r--indra/llcommon/tests/lleventdispatcher_test.cpp1324
-rw-r--r--indra/llcommon/tests/llinstancetracker_test.cpp87
-rw-r--r--indra/llcommon/tests/llsdserialize_test.cpp510
-rw-r--r--indra/llcommon/tests/llsingleton_test.cpp76
-rw-r--r--indra/llcommon/tests/llstring_test.cpp8
-rw-r--r--indra/llcommon/tests/setpython.py19
-rw-r--r--indra/llcrashlogger/llcrashlogger.cpp106
-rw-r--r--indra/llcrashlogger/llcrashlogger.h14
-rw-r--r--indra/llimage/CMakeLists.txt14
-rw-r--r--indra/llimage/llimage.cpp87
-rw-r--r--indra/llimage/llimage.h35
-rw-r--r--indra/llimage/llimagedimensionsinfo.cpp83
-rw-r--r--indra/llimage/llimagedimensionsinfo.h3
-rw-r--r--indra/llimage/llimagedxt.cpp3
-rw-r--r--indra/llimage/llimagej2c.cpp188
-rw-r--r--indra/llimage/llimagej2c.h6
-rw-r--r--indra/llimage/llimagepng.cpp12
-rw-r--r--indra/llimage/llimageworker.cpp8
-rw-r--r--indra/llimage/llimageworker.h4
-rw-r--r--indra/llimage/llpngwrapper.cpp18
-rw-r--r--indra/llimage/llpngwrapper.h3
-rw-r--r--indra/llimage/tests/llimageworker_test.cpp18
-rw-r--r--indra/llimagej2coj/llimagej2coj.cpp17
-rw-r--r--indra/llimagej2coj/llimagej2coj.h8
-rw-r--r--indra/llinventory/CMakeLists.txt21
-rw-r--r--indra/llinventory/lleconomy.cpp27
-rw-r--r--indra/llinventory/lleconomy.h16
-rw-r--r--indra/llinventory/llinventory.cpp9
-rw-r--r--indra/llinventory/llinventorytype.cpp80
-rw-r--r--indra/llinventory/llinventorytype.h4
-rw-r--r--indra/llinventory/llnotecard.cpp2
-rw-r--r--indra/llinventory/llparcel.cpp42
-rw-r--r--indra/llinventory/llparcel.h38
-rw-r--r--indra/llinventory/llparcelflags.h2
-rw-r--r--indra/llkdu/CMakeLists.txt65
-rw-r--r--indra/llkdu/llimagej2ckdu.cpp1156
-rw-r--r--indra/llkdu/llimagej2ckdu.h95
-rw-r--r--indra/llkdu/llkdumem.cpp196
-rw-r--r--indra/llkdu/llkdumem.h145
-rw-r--r--indra/llkdu/tests/llimagej2ckdu_test.cpp249
-rw-r--r--indra/llmath/CMakeLists.txt22
-rw-r--r--indra/llmath/llbbox.cpp22
-rw-r--r--indra/llmath/llbbox.h4
-rw-r--r--indra/llmath/llcalc.cpp162
-rw-r--r--indra/llmath/llcalc.h100
-rw-r--r--indra/llmath/llcalcparser.cpp63
-rw-r--r--indra/llmath/llcalcparser.h191
-rw-r--r--indra/llmath/llcamera.cpp276
-rw-r--r--indra/llmath/llcamera.h39
-rw-r--r--indra/llmath/llcoord.h117
-rw-r--r--indra/llmath/llmath.h92
-rw-r--r--indra/llmath/llmatrix3a.cpp134
-rw-r--r--indra/llmath/llmatrix3a.h128
-rw-r--r--indra/llmath/llmatrix3a.inl119
-rw-r--r--indra/llmath/llmatrix4a.h143
-rw-r--r--indra/llmath/lloctree.h360
-rw-r--r--indra/llmath/llplane.h44
-rw-r--r--indra/llmath/llquantize.h6
-rw-r--r--indra/llmath/llquaternion.cpp3
-rw-r--r--indra/llmath/llquaternion.h6
-rw-r--r--indra/llmath/llquaternion2.h105
-rw-r--r--indra/llmath/llquaternion2.inl102
-rw-r--r--indra/llmath/llsimdmath.h93
-rw-r--r--indra/llmath/llsimdtypes.h124
-rw-r--r--indra/llmath/llsimdtypes.inl157
-rw-r--r--indra/llmath/lltreenode.h3
-rw-r--r--indra/llmath/llv4math.h141
-rw-r--r--indra/llmath/llv4matrix3.h220
-rw-r--r--indra/llmath/llv4matrix4.h249
-rw-r--r--indra/llmath/llv4vector3.h80
-rw-r--r--indra/llmath/llvector4a.cpp222
-rw-r--r--indra/llmath/llvector4a.h324
-rw-r--r--indra/llmath/llvector4a.inl593
-rw-r--r--indra/llmath/llvector4logical.h124
-rw-r--r--indra/llmath/llvolume.cpp3153
-rw-r--r--indra/llmath/llvolume.h200
-rw-r--r--indra/llmath/llvolumemgr.cpp15
-rw-r--r--indra/llmath/llvolumemgr.h1
-rw-r--r--indra/llmath/llvolumeoctree.cpp256
-rw-r--r--indra/llmath/llvolumeoctree.h134
-rw-r--r--indra/llmath/m4math.cpp138
-rw-r--r--indra/llmath/m4math.h34
-rw-r--r--indra/llmath/tests/llbbox_test.cpp2
-rw-r--r--indra/llmath/tests/llquaternion_test.cpp2
-rw-r--r--indra/llmath/tests/m3math_test.cpp27
-rw-r--r--indra/llmath/tests/v2math_test.cpp6
-rw-r--r--indra/llmath/tests/v3color_test.cpp6
-rw-r--r--indra/llmath/tests/v3dmath_test.cpp4
-rw-r--r--indra/llmath/tests/v3math_test.cpp26
-rw-r--r--indra/llmath/tests/v4color_test.cpp4
-rw-r--r--indra/llmath/tests/v4coloru_test.cpp2
-rw-r--r--indra/llmath/tests/v4math_test.cpp6
-rw-r--r--indra/llmath/v2math.cpp17
-rw-r--r--indra/llmath/v2math.h11
-rw-r--r--indra/llmath/v3color.h10
-rw-r--r--indra/llmath/v3dmath.h10
-rw-r--r--indra/llmath/v3math.cpp37
-rw-r--r--indra/llmath/v3math.h41
-rw-r--r--indra/llmath/v4color.h26
-rw-r--r--indra/llmath/v4coloru.h4
-rw-r--r--indra/llmath/v4math.h8
-rw-r--r--indra/llmath/xform.h4
-rw-r--r--indra/llmessage/CMakeLists.txt4
-rw-r--r--indra/llmessage/llassetstorage.cpp59
-rw-r--r--indra/llmessage/llavatarnamecache.cpp275
-rw-r--r--indra/llmessage/llavatarnamecache.h3
-rw-r--r--indra/llmessage/llbuffer.cpp90
-rw-r--r--indra/llmessage/llbuffer.h25
-rw-r--r--indra/llmessage/llbufferstream.cpp8
-rw-r--r--indra/llmessage/llcachename.cpp4
-rw-r--r--indra/llmessage/llcircuit.cpp3
-rw-r--r--indra/llmessage/llcircuit.h4
-rw-r--r--indra/llmessage/llcurl.cpp891
-rw-r--r--indra/llmessage/llcurl.h214
-rw-r--r--indra/llmessage/lldatapacker.h5
-rw-r--r--indra/llmessage/llfiltersd2xmlrpc.cpp12
-rw-r--r--indra/llmessage/llhttpassetstorage.cpp23
-rw-r--r--indra/llmessage/llhttpclient.cpp19
-rw-r--r--indra/llmessage/lliohttpserver.cpp13
-rw-r--r--indra/llmessage/lliopipe.cpp6
-rw-r--r--indra/llmessage/lliopipe.h2
-rw-r--r--indra/llmessage/lliosocket.cpp37
-rw-r--r--indra/llmessage/lliosocket.h19
-rw-r--r--indra/llmessage/llioutil.cpp5
-rw-r--r--indra/llmessage/llmime.cpp4
-rw-r--r--indra/llmessage/llpacketring.cpp71
-rw-r--r--indra/llmessage/llpacketring.h9
-rw-r--r--indra/llmessage/llproxy.cpp546
-rw-r--r--indra/llmessage/llproxy.h352
-rw-r--r--indra/llmessage/llpumpio.cpp51
-rw-r--r--indra/llmessage/llpumpio.h13
-rw-r--r--indra/llmessage/llregionflags.h18
-rw-r--r--indra/llmessage/llsdmessage.cpp2
-rw-r--r--indra/llmessage/llsdmessagebuilder.cpp3
-rw-r--r--indra/llmessage/llsdmessagereader.cpp3
-rw-r--r--indra/llmessage/llsdrpcclient.cpp6
-rw-r--r--indra/llmessage/llsdrpcclient.h22
-rw-r--r--indra/llmessage/llsdrpcserver.cpp3
-rw-r--r--indra/llmessage/lltemplatemessagebuilder.cpp1
-rw-r--r--indra/llmessage/lltemplatemessagereader.cpp3
-rw-r--r--indra/llmessage/lltransfermanager.cpp2
-rw-r--r--indra/llmessage/lltransfersourceasset.cpp1
-rw-r--r--indra/llmessage/llurlrequest.cpp77
-rw-r--r--indra/llmessage/llurlrequest.h2
-rw-r--r--indra/llmessage/llxfer.h1
-rw-r--r--indra/llmessage/message.cpp14
-rw-r--r--indra/llmessage/message_prehash.cpp2688
-rw-r--r--indra/llmessage/message_prehash.h2688
-rw-r--r--indra/llmessage/net.cpp39
-rw-r--r--indra/llmessage/net.h4
-rw-r--r--indra/llmessage/tests/commtest.h70
-rw-r--r--indra/llmessage/tests/llhost_test.cpp3
-rw-r--r--indra/llmessage/tests/llsdmessage_test.cpp1
-rw-r--r--indra/llmessage/tests/test_llsdmessage_peer.py61
-rw-r--r--indra/llmessage/tests/testrunner.py210
-rw-r--r--indra/llplugin/CMakeLists.txt18
-rw-r--r--indra/llplugin/llpluginclassmedia.cpp196
-rw-r--r--indra/llplugin/llpluginclassmedia.h56
-rw-r--r--indra/llplugin/llpluginclassmediaowner.h11
-rw-r--r--indra/llplugin/llplugininstance.cpp20
-rw-r--r--indra/llplugin/llplugininstance.h2
-rw-r--r--indra/llplugin/llpluginmessagepipe.cpp51
-rw-r--r--indra/llplugin/llpluginmessagepipe.h2
-rw-r--r--indra/llplugin/llpluginprocesschild.cpp5
-rw-r--r--indra/llplugin/llpluginprocesschild.h1
-rw-r--r--indra/llplugin/llpluginprocessparent.cpp6
-rw-r--r--indra/llplugin/llpluginprocessparent.h2
-rw-r--r--indra/llprimitive/CMakeLists.txt16
-rw-r--r--indra/llprimitive/llmaterialtable.cpp2
-rw-r--r--indra/llprimitive/llmodel.cpp2456
-rw-r--r--indra/llprimitive/llmodel.h281
-rw-r--r--indra/llprimitive/llprimitive.cpp21
-rw-r--r--indra/llprimitive/llprimitive.h9
-rw-r--r--indra/llprimitive/lltextureanim.cpp4
-rw-r--r--indra/llprimitive/lltextureentry.cpp24
-rw-r--r--indra/llprimitive/llvolumemessage.cpp6
-rw-r--r--indra/llprimitive/llvolumemessage.h6
-rw-r--r--indra/llprimitive/llvolumexml.cpp19
-rw-r--r--indra/llprimitive/llvolumexml.h6
-rw-r--r--indra/llrender/llcubemap.cpp37
-rw-r--r--indra/llrender/llfontfreetype.cpp9
-rw-r--r--indra/llrender/llfontgl.cpp108
-rw-r--r--indra/llrender/llfontgl.h9
-rw-r--r--indra/llrender/llgl.cpp866
-rw-r--r--indra/llrender/llgl.h110
-rw-r--r--indra/llrender/llglheaders.h283
-rw-r--r--indra/llrender/llglslshader.cpp171
-rw-r--r--indra/llrender/llglslshader.h27
-rw-r--r--indra/llrender/llglstates.h32
-rw-r--r--indra/llrender/llimagegl.cpp160
-rw-r--r--indra/llrender/llimagegl.h2
-rw-r--r--indra/llrender/llpostprocess.cpp22
-rw-r--r--indra/llrender/llrender.cpp1042
-rw-r--r--indra/llrender/llrender.h103
-rw-r--r--indra/llrender/llrendersphere.cpp98
-rw-r--r--indra/llrender/llrendersphere.h5
-rw-r--r--indra/llrender/llrendertarget.cpp562
-rw-r--r--indra/llrender/llrendertarget.h52
-rw-r--r--indra/llrender/llshadermgr.cpp767
-rw-r--r--indra/llrender/llshadermgr.h135
-rw-r--r--indra/llrender/llvertexbuffer.cpp2313
-rw-r--r--indra/llrender/llvertexbuffer.h265
-rw-r--r--indra/llui/CMakeLists.txt22
-rw-r--r--indra/llui/llaccordionctrltab.cpp11
-rw-r--r--indra/llui/llbadge.cpp381
-rw-r--r--indra/llui/llbadge.h174
-rw-r--r--indra/llui/llbadgeholder.cpp45
-rw-r--r--indra/llui/llbadgeholder.h56
-rw-r--r--indra/llui/llbadgeowner.cpp131
-rw-r--r--indra/llui/llbadgeowner.h61
-rw-r--r--indra/llui/llbutton.cpp253
-rw-r--r--indra/llui/llbutton.h62
-rw-r--r--indra/llui/llcheckboxctrl.cpp57
-rw-r--r--indra/llui/llclipboard.cpp132
-rw-r--r--indra/llui/llclipboard.h69
-rw-r--r--indra/llui/llcombobox.cpp52
-rw-r--r--indra/llui/llcombobox.h9
-rw-r--r--indra/llui/llcommandmanager.cpp172
-rw-r--r--indra/llui/llcommandmanager.h202
-rw-r--r--indra/llui/llconsole.cpp17
-rw-r--r--indra/llui/llconsole.h2
-rw-r--r--indra/llui/llcontainerview.h2
-rw-r--r--indra/llui/lldockablefloater.cpp24
-rw-r--r--indra/llui/lldockablefloater.h4
-rw-r--r--indra/llui/lldockcontrol.cpp96
-rw-r--r--indra/llui/lldockcontrol.h4
-rw-r--r--indra/llui/lldraghandle.cpp2
-rw-r--r--indra/llui/lldraghandle.h4
-rw-r--r--indra/llui/llfiltereditor.h7
-rw-r--r--indra/llui/llflatlistview.cpp3
-rw-r--r--indra/llui/llflatlistview.h3
-rw-r--r--indra/llui/llfloater.cpp768
-rw-r--r--indra/llui/llfloater.h140
-rw-r--r--indra/llui/llfloaterreg.cpp235
-rw-r--r--indra/llui/llfloaterreg.h21
-rw-r--r--indra/llui/llfloaterreglistener.cpp17
-rw-r--r--indra/llui/llfloaterreglistener.h1
-rw-r--r--indra/llui/llflyoutbutton.h2
-rw-r--r--indra/llui/llfocusmgr.cpp33
-rw-r--r--indra/llui/llfocusmgr.h11
-rw-r--r--indra/llui/llfunctorregistry.h4
-rw-r--r--indra/llui/llhandle.h73
-rw-r--r--indra/llui/llhelp.h1
-rw-r--r--indra/llui/lliconctrl.cpp10
-rw-r--r--indra/llui/lliconctrl.h7
-rw-r--r--indra/llui/llkeywords.cpp81
-rw-r--r--indra/llui/llkeywords.h33
-rw-r--r--indra/llui/lllayoutstack.cpp1023
-rw-r--r--indra/llui/lllayoutstack.h159
-rw-r--r--indra/llui/lllineeditor.cpp200
-rw-r--r--indra/llui/lllineeditor.h22
-rw-r--r--indra/llui/llloadingindicator.cpp66
-rw-r--r--indra/llui/llloadingindicator.h33
-rw-r--r--indra/llui/llmenubutton.cpp18
-rw-r--r--indra/llui/llmenubutton.h20
-rw-r--r--indra/llui/llmenugl.cpp124
-rw-r--r--indra/llui/llmenugl.h37
-rw-r--r--indra/llui/llmultislider.cpp9
-rw-r--r--indra/llui/llnotifications.cpp364
-rw-r--r--indra/llui/llnotifications.h33
-rw-r--r--indra/llui/llnotificationtemplate.h35
-rw-r--r--indra/llui/llnotificationvisibilityrule.h104
-rw-r--r--indra/llui/llpanel.cpp19
-rw-r--r--indra/llui/llpanel.h19
-rw-r--r--indra/llui/llprogressbar.cpp7
-rw-r--r--indra/llui/llprogressbar.h9
-rw-r--r--indra/llui/llradiogroup.cpp54
-rw-r--r--indra/llui/llradiogroup.h12
-rw-r--r--indra/llui/llresizebar.cpp4
-rw-r--r--indra/llui/llresizebar.h1
-rw-r--r--indra/llui/llresizehandle.h2
-rw-r--r--indra/llui/llresmgr.cpp2
-rw-r--r--indra/llui/llscrollbar.cpp4
-rw-r--r--indra/llui/llscrollcontainer.cpp128
-rw-r--r--indra/llui/llscrollcontainer.h7
-rw-r--r--indra/llui/llscrollingpanellist.h7
-rw-r--r--indra/llui/llscrolllistcell.cpp6
-rw-r--r--indra/llui/llscrolllistcolumn.cpp5
-rw-r--r--indra/llui/llscrolllistcolumn.h6
-rw-r--r--indra/llui/llscrolllistctrl.cpp69
-rw-r--r--indra/llui/llscrolllistctrl.h4
-rw-r--r--indra/llui/llscrolllistitem.cpp2
-rw-r--r--indra/llui/llscrolllistitem.h2
-rw-r--r--indra/llui/llsdparam.cpp271
-rw-r--r--indra/llui/llsdparam.h64
-rw-r--r--indra/llui/llsearcheditor.h4
-rw-r--r--indra/llui/llslider.cpp4
-rw-r--r--indra/llui/llslider.h1
-rw-r--r--indra/llui/llsliderctrl.cpp65
-rw-r--r--indra/llui/llspinctrl.cpp25
-rw-r--r--indra/llui/llspinctrl.h4
-rw-r--r--indra/llui/llstatbar.h2
-rw-r--r--indra/llui/llstatview.h2
-rw-r--r--indra/llui/llstyle.cpp2
-rw-r--r--indra/llui/llstyle.h5
-rw-r--r--indra/llui/lltabcontainer.cpp217
-rw-r--r--indra/llui/lltabcontainer.h6
-rw-r--r--indra/llui/lltextbase.cpp370
-rw-r--r--indra/llui/lltextbase.h10
-rw-r--r--indra/llui/lltexteditor.cpp68
-rw-r--r--indra/llui/lltexteditor.h6
-rw-r--r--indra/llui/lltextparser.cpp2
-rw-r--r--indra/llui/lltextvalidate.cpp33
-rw-r--r--indra/llui/lltextvalidate.h1
-rw-r--r--indra/llui/lltimectrl.cpp432
-rw-r--r--indra/llui/lltimectrl.h131
-rw-r--r--indra/llui/lltoolbar.cpp1230
-rw-r--r--indra/llui/lltoolbar.h290
-rw-r--r--indra/llui/lltooltip.cpp20
-rw-r--r--indra/llui/lltransutil.cpp5
-rw-r--r--indra/llui/llui.cpp346
-rw-r--r--indra/llui/llui.h237
-rw-r--r--indra/llui/lluicolortable.cpp6
-rw-r--r--indra/llui/lluicolortable.h2
-rw-r--r--indra/llui/lluictrl.cpp102
-rw-r--r--indra/llui/lluictrl.h38
-rw-r--r--indra/llui/lluictrlfactory.cpp24
-rw-r--r--indra/llui/lluictrlfactory.h17
-rw-r--r--indra/llui/lluiimage.cpp14
-rw-r--r--indra/llui/lluiimage.h17
-rw-r--r--indra/llui/lluistring.cpp12
-rw-r--r--indra/llui/lluistring.h1
-rw-r--r--indra/llui/llurlaction.cpp28
-rw-r--r--indra/llui/llurlaction.h21
-rw-r--r--indra/llui/llurlentry.cpp166
-rw-r--r--indra/llui/llurlentry.h53
-rw-r--r--indra/llui/llurlregistry.cpp1
-rw-r--r--indra/llui/llview.cpp1031
-rw-r--r--indra/llui/llview.h137
-rw-r--r--indra/llui/llviewborder.cpp4
-rw-r--r--indra/llui/llviewinject.cpp49
-rw-r--r--indra/llui/llviewinject.h56
-rw-r--r--indra/llui/llwindowshade.cpp392
-rw-r--r--indra/llui/llwindowshade.h78
-rw-r--r--indra/llui/tests/llurlentry_stub.cpp55
-rw-r--r--indra/llui/tests/llurlentry_test.cpp173
-rw-r--r--indra/llui/tests/llurlmatch_test.cpp55
-rw-r--r--indra/llvfs/CMakeLists.txt45
-rw-r--r--indra/llvfs/lldir.cpp31
-rw-r--r--indra/llvfs/lldir.h25
-rw-r--r--indra/llvfs/lldir_linux.cpp68
-rw-r--r--indra/llvfs/lldir_linux.h11
-rw-r--r--indra/llvfs/lldir_mac.cpp99
-rw-r--r--indra/llvfs/lldir_mac.h8
-rw-r--r--indra/llvfs/lldir_solaris.cpp62
-rw-r--r--indra/llvfs/lldir_solaris.h9
-rw-r--r--indra/llvfs/lldir_win32.cpp111
-rw-r--r--indra/llvfs/lldir_win32.h7
-rw-r--r--indra/llvfs/lldiriterator.cpp228
-rw-r--r--indra/llvfs/lldiriterator.h87
-rw-r--r--indra/llvfs/lllfsthread.cpp2
-rw-r--r--indra/llvfs/llvfile.cpp4
-rw-r--r--indra/llvfs/llvfs.cpp10
-rw-r--r--indra/llvfs/llvfsthread.cpp2
-rw-r--r--indra/llvfs/tests/lldir_test.cpp38
-rw-r--r--indra/llvfs/tests/lldiriterator_test.cpp65
-rw-r--r--indra/llwindow/CMakeLists.txt8
-rw-r--r--indra/llwindow/GL/glh_extensions.h4
-rw-r--r--indra/llwindow/GL/glh_genext.h3
-rw-r--r--indra/llwindow/lldragdropwin32.cpp10
-rw-r--r--indra/llwindow/llkeyboard.h2
-rw-r--r--indra/llwindow/llkeyboardheadless.cpp73
-rw-r--r--indra/llwindow/llkeyboardheadless.h45
-rw-r--r--indra/llwindow/llmousehandler.h2
-rw-r--r--indra/llwindow/llwindow.cpp93
-rw-r--r--indra/llwindow/llwindow.h15
-rw-r--r--indra/llwindow/llwindowcallbacks.cpp2
-rw-r--r--indra/llwindow/llwindowcallbacks.h2
-rw-r--r--indra/llwindow/llwindowheadless.cpp4
-rw-r--r--indra/llwindow/llwindowheadless.h5
-rw-r--r--indra/llwindow/llwindowmacosx.cpp381
-rw-r--r--indra/llwindow/llwindowmacosx.h8
-rw-r--r--indra/llwindow/llwindowmesaheadless.h4
-rw-r--r--indra/llwindow/llwindowsdl.cpp68
-rw-r--r--indra/llwindow/llwindowsdl.h6
-rw-r--r--indra/llwindow/llwindowwin32.cpp305
-rw-r--r--indra/llwindow/llwindowwin32.h5
-rw-r--r--indra/llxml/CMakeLists.txt22
-rw-r--r--indra/llxml/llcontrol.cpp25
-rw-r--r--indra/llxml/llcontrol.h12
-rw-r--r--indra/llxml/llxmlnode.cpp65
-rw-r--r--indra/llxml/llxmlnode.h3
-rw-r--r--indra/llxuixml/llinitparam.cpp162
-rw-r--r--indra/llxuixml/llinitparam.h1844
-rw-r--r--indra/llxuixml/llregistry.h5
-rw-r--r--indra/llxuixml/lltrans.cpp56
-rw-r--r--indra/llxuixml/lltrans.h14
-rw-r--r--indra/llxuixml/llxuiparser.cpp500
-rw-r--r--indra/llxuixml/llxuiparser.h45
-rw-r--r--indra/lscript/lscript_byteformat.h2
-rw-r--r--indra/lscript/lscript_compile/bison.bat22
-rw-r--r--indra/lscript/lscript_compile/indra.l10
-rw-r--r--indra/lscript/lscript_compile/windows/unistd.h48
-rw-r--r--indra/lscript/lscript_library/lscript_library.cpp3
-rw-r--r--indra/mac_crash_logger/CrashReporter.nib/objects.xib2
-rw-r--r--indra/mac_crash_logger/llcrashloggermac.cpp6
-rw-r--r--indra/mac_crash_logger/mac_crash_logger.cpp15
-rw-r--r--indra/mac_updater/CMakeLists.txt7
-rw-r--r--indra/mac_updater/mac_updater.cpp10
-rw-r--r--indra/media_plugins/example/CMakeLists.txt2
-rw-r--r--indra/media_plugins/example/media_plugin_example.cpp733
-rw-r--r--indra/media_plugins/quicktime/media_plugin_quicktime.cpp6
-rw-r--r--indra/media_plugins/webkit/CMakeLists.txt5
-rw-r--r--indra/media_plugins/webkit/media_plugin_webkit.cpp273
-rw-r--r--indra/media_plugins/winmmshim/CMakeLists.txt6
-rw-r--r--indra/media_plugins/winmmshim/forwarding_api.cpp173
-rw-r--r--indra/media_plugins/winmmshim/forwarding_api.h1
-rw-r--r--indra/media_plugins/winmmshim/winmm_shim.cpp22
-rw-r--r--indra/newview/CMakeLists.txt443
-rw-r--r--indra/newview/English.lproj/InfoPlist.strings4
-rw-r--r--indra/newview/Info-SecondLife.plist2
-rw-r--r--indra/newview/app_settings/CA.pem9154
-rw-r--r--indra/newview/app_settings/cmd_line.xml32
-rw-r--r--indra/newview/app_settings/commands.xml252
-rw-r--r--indra/newview/app_settings/high_graphics.xml19
-rw-r--r--indra/newview/app_settings/ignorable_dialogs.xml34
-rw-r--r--indra/newview/app_settings/keys.ini357
-rw-r--r--indra/newview/app_settings/keys.xml350
-rw-r--r--indra/newview/app_settings/keywords.ini86
-rw-r--r--indra/newview/app_settings/lindenlab.pem97
-rw-r--r--indra/newview/app_settings/llsd.xsd131
-rw-r--r--indra/newview/app_settings/logcontrol.xml3
-rw-r--r--indra/newview/app_settings/low_graphics.xml23
-rw-r--r--indra/newview/app_settings/mid_graphics.xml19
-rw-r--r--indra/newview/app_settings/settings.xml2902
-rw-r--r--indra/newview/app_settings/settings_crash_behavior.xml2
-rw-r--r--indra/newview/app_settings/settings_files.xml213
-rw-r--r--indra/newview/app_settings/settings_minimal.xml1
-rw-r--r--indra/newview/app_settings/settings_per_account.xml66
-rw-r--r--indra/newview/app_settings/shaders/class1/avatar/avatarF.glsl20
-rw-r--r--indra/newview/app_settings/shaders/class1/avatar/avatarSkinV.glsl21
-rw-r--r--indra/newview/app_settings/shaders/class1/avatar/avatarV.glsl55
-rw-r--r--indra/newview/app_settings/shaders/class1/avatar/eyeballF.glsl20
-rw-r--r--indra/newview/app_settings/shaders/class1/avatar/eyeballV.glsl44
-rw-r--r--indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl47
-rw-r--r--indra/newview/app_settings/shaders/class1/avatar/pickAvatarF.glsl29
-rw-r--r--indra/newview/app_settings/shaders/class1/avatar/pickAvatarV.glsl41
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl74
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/alphaNonIndexedF.glsl89
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/alphaNonIndexedNoColorF.glsl84
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/alphaSkinnedV.glsl144
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl138
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/attachmentShadowF.glsl39
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/attachmentShadowV.glsl45
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/avatarAlphaF.glsl68
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/avatarAlphaNoColorV.glsl148
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl142
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/avatarEyesV.glsl48
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/avatarF.glsl35
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/avatarShadowF.glsl30
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/avatarShadowV.glsl50
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/avatarV.glsl49
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl79
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/blurLightV.glsl28
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/bumpF.glsl45
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/bumpSkinnedV.glsl64
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/bumpV.glsl46
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/cloudsF.glsl107
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/cloudsV.glsl191
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/cofF.glsl90
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskF.glsl54
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskIndexedF.glsl52
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskNoColorF.glsl54
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/diffuseF.glsl39
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/diffuseIndexedF.glsl45
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/diffuseNoColorV.glsl45
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/diffuseSkinnedV.glsl59
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/diffuseV.glsl43
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/dofCombineF.glsl79
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/emissiveF.glsl52
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/emissiveV.glsl63
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl65
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/fullbrightV.glsl55
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/fxaaF.glsl2125
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/giF.glsl30
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/giV.glsl22
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/impostorF.glsl45
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/impostorV.glsl32
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/luminanceF.glsl30
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/luminanceV.glsl33
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl95
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/multiPointLightV.glsl39
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl50
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/normgenF.glsl58
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/normgenV.glsl36
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl51
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/pointLightV.glsl37
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl141
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFF.glsl47
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/postDeferredNoTCV.glsl40
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/postDeferredV.glsl33
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/postgiF.glsl30
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/postgiV.glsl17
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskF.glsl52
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskV.glsl51
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/shadowF.glsl32
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/shadowV.glsl31
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/skyF.glsl66
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/skyV.glsl157
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl179
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/softenLightV.glsl36
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl52
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/starsF.glsl44
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/starsV.glsl42
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/sunLightF.glsl28
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/sunLightNoFragCoordV.glsl37
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl124
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/sunLightV.glsl36
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/terrainF.glsl48
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/terrainV.glsl50
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/treeF.glsl43
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/treeShadowF.glsl51
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/treeShadowV.glsl45
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/treeV.glsl38
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/waterF.glsl40
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/waterV.glsl57
-rw-r--r--indra/newview/app_settings/shaders/class1/effects/glowExtractF.glsl36
-rw-r--r--indra/newview/app_settings/shaders/class1/effects/glowExtractV.glsl28
-rw-r--r--indra/newview/app_settings/shaders/class1/effects/glowF.glsl47
-rw-r--r--indra/newview/app_settings/shaders/class1/effects/glowV.glsl46
-rw-r--r--indra/newview/app_settings/shaders/class1/environment/terrainF.glsl67
-rw-r--r--indra/newview/app_settings/shaders/class1/environment/terrainV.glsl69
-rw-r--r--indra/newview/app_settings/shaders/class1/environment/terrainWaterF.glsl68
-rw-r--r--indra/newview/app_settings/shaders/class1/environment/underWaterF.glsl103
-rw-r--r--indra/newview/app_settings/shaders/class1/environment/waterF.glsl112
-rw-r--r--indra/newview/app_settings/shaders/class1/environment/waterFogF.glsl70
-rw-r--r--indra/newview/app_settings/shaders/class1/environment/waterV.glsl48
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/alphamaskF.glsl48
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/alphamaskV.glsl42
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/customalphaF.glsl44
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/customalphaV.glsl41
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/debugF.glsl37
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/debugV.glsl34
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/glowcombineF.glsl44
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/glowcombineFXAAF.glsl44
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/glowcombineFXAAV.glsl39
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/glowcombineV.glsl41
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/highlightF.glsl29
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/highlightV.glsl41
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/occlusionF.glsl35
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/occlusionV.glsl34
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/onetexturenocolorF.glsl39
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/onetexturenocolorV.glsl38
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/solidcolorF.glsl42
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/solidcolorV.glsl41
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/splattexturerectF.glsl42
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/splattexturerectV.glsl41
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/twotextureaddF.glsl41
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/twotextureaddV.glsl41
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/uiF.glsl40
-rw-r--r--indra/newview/app_settings/shaders/class1/interface/uiV.glsl42
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskF.glsl55
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskNonIndexedF.glsl57
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightF.glsl39
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightFullbrightAlphaMaskF.glsl55
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightFullbrightF.glsl37
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightFullbrightNonIndexedAlphaMaskF.glsl57
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightFullbrightNonIndexedF.glsl50
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyF.glsl48
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyNonIndexedF.glsl58
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyWaterF.glsl55
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyWaterNonIndexedF.glsl56
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterAlphaMaskF.glsl55
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterF.glsl37
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterNonIndexedAlphaMaskF.glsl55
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterNonIndexedF.glsl48
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightFuncSpecularV.glsl20
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightFuncV.glsl20
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightNonIndexedF.glsl50
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightShinyF.glsl47
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightShinyNonIndexedF.glsl57
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightShinyWaterF.glsl44
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightShinyWaterNonIndexedF.glsl54
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightSpecularV.glsl40
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightV.glsl36
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightWaterAlphaMaskF.glsl53
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightWaterAlphaMaskNonIndexedF.glsl57
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightWaterF.glsl39
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/lightWaterNonIndexedF.glsl48
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/sumLightsSpecularV.glsl34
-rw-r--r--indra/newview/app_settings/shaders/class1/lighting/sumLightsV.glsl25
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/bumpF.glsl44
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/bumpV.glsl42
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/emissiveSkinnedV.glsl58
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/emissiveV.glsl56
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/fullbrightF.glsl22
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/fullbrightNoColorV.glsl53
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/fullbrightShinyF.glsl20
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/fullbrightShinySkinnedV.glsl67
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/fullbrightShinyV.glsl54
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/fullbrightShinyWaterF.glsl32
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/fullbrightSkinnedV.glsl57
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/fullbrightV.glsl47
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/fullbrightWaterF.glsl20
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/impostorF.glsl48
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/impostorV.glsl40
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/indexedTextureF.glsl33
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/indexedTextureV.glsl34
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/nonindexedTextureV.glsl31
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/previewV.glsl57
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/shinyF.glsl20
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/shinySimpleSkinnedV.glsl66
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/shinyV.glsl63
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/shinyWaterF.glsl20
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/simpleF.glsl20
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/simpleNoColorV.glsl59
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/simpleNonIndexedV.glsl61
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/simpleSkinnedV.glsl65
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/simpleTexGenV.glsl77
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/simpleV.glsl51
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/simpleWaterF.glsl20
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/treeV.glsl60
-rw-r--r--indra/newview/app_settings/shaders/class1/windlight/atmosphericsF.glsl20
-rw-r--r--indra/newview/app_settings/shaders/class1/windlight/atmosphericsHelpersV.glsl27
-rw-r--r--indra/newview/app_settings/shaders/class1/windlight/atmosphericsV.glsl20
-rw-r--r--indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsF.glsl23
-rw-r--r--indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsV.glsl25
-rw-r--r--indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsWaterF.glsl33
-rw-r--r--indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsWaterV.glsl37
-rw-r--r--indra/newview/app_settings/shaders/class1/windlight/gammaF.glsl20
-rw-r--r--indra/newview/app_settings/shaders/class1/windlight/transportF.glsl20
-rw-r--r--indra/newview/app_settings/shaders/class2/avatar/eyeballV.glsl48
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl119
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedF.glsl180
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedNoColorF.glsl178
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/alphaSkinnedV.glsl155
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl144
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/avatarAlphaF.glsl98
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/avatarAlphaV.glsl138
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/blurLightF.glsl81
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/blurLightV.glsl17
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/edgeF.glsl63
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/edgeV.glsl17
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl54
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/postDeferredF.glsl59
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/postDeferredV.glsl17
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl189
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/softenLightV.glsl36
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl45
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl99
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl200
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/sunLightV.glsl38
-rw-r--r--indra/newview/app_settings/shaders/class2/effects/blurF.glsl31
-rw-r--r--indra/newview/app_settings/shaders/class2/effects/blurV.glsl35
-rw-r--r--indra/newview/app_settings/shaders/class2/effects/colorFilterF.glsl31
-rw-r--r--indra/newview/app_settings/shaders/class2/effects/drawQuadV.glsl14
-rw-r--r--indra/newview/app_settings/shaders/class2/effects/extractF.glsl22
-rw-r--r--indra/newview/app_settings/shaders/class2/effects/nightVisionF.glsl42
-rw-r--r--indra/newview/app_settings/shaders/class2/effects/simpleF.glsl14
-rw-r--r--indra/newview/app_settings/shaders/class2/environment/terrainF.glsl38
-rw-r--r--indra/newview/app_settings/shaders/class2/environment/terrainV.glsl52
-rw-r--r--indra/newview/app_settings/shaders/class2/environment/terrainWaterF.glsl39
-rw-r--r--indra/newview/app_settings/shaders/class2/environment/underWaterF.glsl88
-rw-r--r--indra/newview/app_settings/shaders/class2/environment/waterF.glsl117
-rw-r--r--indra/newview/app_settings/shaders/class2/environment/waterFogF.glsl54
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightF.glsl23
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightFullbrightF.glsl23
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyF.glsl30
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterF.glsl21
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightShinyF.glsl29
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightShinyWaterF.glsl27
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightSpecularV.glsl16
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightV.glsl16
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/lightWaterF.glsl21
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/sumLightsSpecularV.glsl33
-rw-r--r--indra/newview/app_settings/shaders/class2/lighting/sumLightsV.glsl35
-rw-r--r--indra/newview/app_settings/shaders/class2/objects/shinyV.glsl31
-rw-r--r--indra/newview/app_settings/shaders/class2/windlight/atmosphericsF.glsl20
-rw-r--r--indra/newview/app_settings/shaders/class2/windlight/atmosphericsHelpersV.glsl20
-rw-r--r--indra/newview/app_settings/shaders/class2/windlight/atmosphericsV.glsl60
-rw-r--r--indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsF.glsl38
-rw-r--r--indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsV.glsl56
-rw-r--r--indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsWaterF.glsl50
-rw-r--r--indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsWaterV.glsl81
-rw-r--r--indra/newview/app_settings/shaders/class2/windlight/cloudsF.glsl46
-rw-r--r--indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl87
-rw-r--r--indra/newview/app_settings/shaders/class2/windlight/gammaF.glsl20
-rw-r--r--indra/newview/app_settings/shaders/class2/windlight/skyF.glsl30
-rw-r--r--indra/newview/app_settings/shaders/class2/windlight/skyV.glsl62
-rw-r--r--indra/newview/app_settings/shaders/class2/windlight/transportF.glsl20
-rw-r--r--indra/newview/app_settings/shaders/class3/avatar/avatarV.glsl58
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/giDownsampleF.glsl86
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/giDownsampleV.glsl17
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/giF.glsl191
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/giFinalF.glsl25
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/giFinalV.glsl17
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/giV.glsl22
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/luminanceF.glsl19
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/luminanceV.glsl20
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/postDeferredF.glsl80
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/postDeferredV.glsl17
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/postgiF.glsl69
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/postgiV.glsl17
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl356
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/softenLightV.glsl24
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/treeF.glsl19
-rw-r--r--indra/newview/app_settings/shaders/class3/lighting/sumLightsSpecularV.glsl40
-rw-r--r--indra/newview/app_settings/shaders/class3/lighting/sumLightsV.glsl42
-rw-r--r--indra/newview/app_settings/shaders/shader_hierarchy.txt (renamed from indra/newview/app_settings/shaders/shader_heirarchy.txt)0
-rw-r--r--indra/newview/app_settings/toolbars.xml25
-rw-r--r--indra/newview/app_settings/ultra_graphics.xml19
-rw-r--r--indra/newview/app_settings/windlight/days/Colder%20Tones.xml28
-rw-r--r--indra/newview/app_settings/windlight/days/Dynamic%20Richness.xml32
-rw-r--r--indra/newview/app_settings/windlight/days/Pirate%27s%20Dream.xml44
-rw-r--r--indra/newview/app_settings/windlight/days/Psycho%20Strobe%21.xml72
-rw-r--r--indra/newview/app_settings/windlight/days/Tropicalia.xml32
-rw-r--r--indra/newview/app_settings/windlight/days/Weird-O.xml56
-rw-r--r--indra/newview/app_settings/windlight/postprocesseffects.xml1
-rw-r--r--indra/newview/app_settings/windlight/skies/Midday.xml141
-rw-r--r--indra/newview/app_settings/windlight/skies/Midnight.xml141
-rw-r--r--indra/newview/app_settings/windlight/skies/Sunrise.xml141
-rw-r--r--indra/newview/app_settings/windlight/skies/Sunset.xml142
-rw-r--r--indra/newview/character/avatar_lad.xml671
-rw-r--r--indra/newview/featuretable.txt70
-rw-r--r--indra/newview/featuretable_linux.txt54
-rw-r--r--indra/newview/featuretable_mac.txt127
-rw-r--r--indra/newview/featuretable_solaris.txt4
-rw-r--r--indra/newview/featuretable_xp.txt54
-rw-r--r--indra/newview/generate_breakpad_symbols.py52
-rw-r--r--indra/newview/gpu_table.txt827
-rw-r--r--indra/newview/groupchatlistener.cpp76
-rw-r--r--indra/newview/groupchatlistener.h40
-rw-r--r--indra/newview/icons/beta/secondlife.icnsbin0 -> 242261 bytes
-rw-r--r--indra/newview/icons/beta/secondlife.icobin0 -> 78692 bytes
-rw-r--r--indra/newview/icons/beta/secondlife_128.pngbin0 -> 18268 bytes
-rw-r--r--indra/newview/icons/beta/secondlife_16.pngbin0 -> 3536 bytes
-rw-r--r--indra/newview/icons/beta/secondlife_256.BMPbin0 -> 196662 bytes
-rw-r--r--indra/newview/icons/beta/secondlife_256.pngbin0 -> 49418 bytes
-rw-r--r--indra/newview/icons/beta/secondlife_32.pngbin0 -> 4767 bytes
-rw-r--r--indra/newview/icons/beta/secondlife_48.pngbin0 -> 6438 bytes
-rw-r--r--indra/newview/icons/beta/secondlife_512.pngbin0 -> 151779 bytes
-rw-r--r--indra/newview/icons/development/secondlife.icnsbin0 -> 233026 bytes
-rw-r--r--indra/newview/icons/development/secondlife.icobin0 -> 77117 bytes
-rw-r--r--indra/newview/icons/development/secondlife_128.pngbin0 -> 17499 bytes
-rw-r--r--indra/newview/icons/development/secondlife_16.pngbin0 -> 3471 bytes
-rw-r--r--indra/newview/icons/development/secondlife_256.BMPbin0 -> 196662 bytes
-rw-r--r--indra/newview/icons/development/secondlife_256.pngbin0 -> 47952 bytes
-rw-r--r--indra/newview/icons/development/secondlife_32.pngbin0 -> 4649 bytes
-rw-r--r--indra/newview/icons/development/secondlife_48.pngbin0 -> 6190 bytes
-rw-r--r--indra/newview/icons/development/secondlife_512.pngbin0 -> 147689 bytes
-rw-r--r--indra/newview/icons/project/secondlife.icnsbin0 -> 235133 bytes
-rw-r--r--indra/newview/icons/project/secondlife.icobin0 -> 77791 bytes
-rw-r--r--indra/newview/icons/project/secondlife_128.pngbin0 -> 17706 bytes
-rw-r--r--indra/newview/icons/project/secondlife_16.pngbin0 -> 3471 bytes
-rw-r--r--indra/newview/icons/project/secondlife_256.BMPbin0 -> 196662 bytes
-rw-r--r--indra/newview/icons/project/secondlife_256.pngbin0 -> 48488 bytes
-rw-r--r--indra/newview/icons/project/secondlife_32.pngbin0 -> 4675 bytes
-rw-r--r--indra/newview/icons/project/secondlife_48.pngbin0 -> 6195 bytes
-rw-r--r--indra/newview/icons/project/secondlife_512.pngbin0 -> 149145 bytes
-rw-r--r--indra/newview/icons/release/secondlife.icnsbin0 -> 228390 bytes
-rw-r--r--indra/newview/icons/release/secondlife.icobin0 -> 77552 bytes
-rw-r--r--indra/newview/icons/release/secondlife_128.pngbin0 -> 17198 bytes
-rw-r--r--indra/newview/icons/release/secondlife_16.pngbin0 -> 3524 bytes
-rw-r--r--indra/newview/icons/release/secondlife_256.BMPbin0 -> 196662 bytes
-rw-r--r--indra/newview/icons/release/secondlife_256.pngbin0 -> 47946 bytes
-rw-r--r--indra/newview/icons/release/secondlife_32.pngbin0 -> 4746 bytes
-rw-r--r--indra/newview/icons/release/secondlife_48.pngbin0 -> 6249 bytes
-rw-r--r--indra/newview/icons/release/secondlife_512.pngbin0 -> 147963 bytes
-rw-r--r--indra/newview/icons/test/secondlife.icnsbin0 -> 232905 bytes
-rw-r--r--indra/newview/icons/test/secondlife.icobin0 -> 76861 bytes
-rw-r--r--indra/newview/icons/test/secondlife_128.pngbin0 -> 17156 bytes
-rw-r--r--indra/newview/icons/test/secondlife_16.pngbin0 -> 3471 bytes
-rw-r--r--indra/newview/icons/test/secondlife_256.BMPbin0 -> 196662 bytes
-rw-r--r--indra/newview/icons/test/secondlife_256.pngbin0 -> 47522 bytes
-rw-r--r--indra/newview/icons/test/secondlife_32.pngbin0 -> 4644 bytes
-rw-r--r--indra/newview/icons/test/secondlife_48.pngbin0 -> 6115 bytes
-rw-r--r--indra/newview/icons/test/secondlife_512.pngbin0 -> 146971 bytes
-rw-r--r--indra/newview/installers/darwin/dmg-cleanup.applescript2
-rw-r--r--indra/newview/installers/darwin/firstlook-dmg/Applications-alias.r6996
-rw-r--r--indra/newview/installers/darwin/firstlook-dmg/_DS_Storebin12292 -> 0 bytes
-rw-r--r--indra/newview/installers/darwin/firstlook-dmg/_VolumeIcon.icnsbin98049 -> 0 bytes
-rw-r--r--indra/newview/installers/darwin/firstlook-dmg/background.jpgbin75112 -> 0 bytes
-rw-r--r--indra/newview/installers/darwin/fix_application_icon_position.sh2
-rw-r--r--indra/newview/installers/darwin/publicnightly-dmg/Applications-alias.r6996
-rw-r--r--indra/newview/installers/darwin/publicnightly-dmg/_DS_Storebin12292 -> 0 bytes
-rw-r--r--indra/newview/installers/darwin/publicnightly-dmg/_VolumeIcon.icnsbin98049 -> 0 bytes
-rw-r--r--indra/newview/installers/darwin/publicnightly-dmg/background.jpgbin75112 -> 0 bytes
-rw-r--r--indra/newview/installers/darwin/release-dmg/_DS_Storebin12292 -> 12292 bytes
-rw-r--r--indra/newview/installers/darwin/releasecandidate-dmg/Applications-alias.r6996
-rw-r--r--indra/newview/installers/darwin/releasecandidate-dmg/_DS_Storebin12292 -> 0 bytes
-rw-r--r--indra/newview/installers/darwin/releasecandidate-dmg/_VolumeIcon.icnsbin98049 -> 0 bytes
-rw-r--r--indra/newview/installers/darwin/releasecandidate-dmg/background.jpgbin75112 -> 0 bytes
-rw-r--r--indra/newview/installers/windows/installer_template.nsi1876
-rw-r--r--indra/newview/installers/windows/lang_en-us.nsibin7162 -> 7542 bytes
-rw-r--r--indra/newview/installers/windows/lang_ko.nsibin6200 -> 0 bytes
-rw-r--r--indra/newview/installers/windows/lang_nl.nsibin7414 -> 0 bytes
-rw-r--r--indra/newview/installers/windows/lang_ru.nsibin0 -> 7598 bytes
-rw-r--r--indra/newview/installers/windows/lang_tr.nsibin0 -> 7722 bytes
-rw-r--r--indra/newview/installers/windows/lang_zh.nsibin5554 -> 5824 bytes
-rw-r--r--indra/newview/installers/windows/language_menu.nsibin1444 -> 1448 bytes
-rw-r--r--indra/newview/licenses-mac.txt510
-rw-r--r--indra/newview/licenses-win32.txt69
-rwxr-xr-xindra/newview/linux_tools/wrapper.sh34
-rw-r--r--indra/newview/llaccountingcostmanager.cpp181
-rw-r--r--indra/newview/llaccountingcostmanager.h75
-rwxr-xr-x[-rw-r--r--]indra/newview/llagent.cpp362
-rw-r--r--indra/newview/llagent.h75
-rw-r--r--indra/newview/llagentcamera.cpp49
-rw-r--r--indra/newview/llagentlistener.cpp471
-rw-r--r--indra/newview/llagentlistener.h26
-rw-r--r--indra/newview/llagentpilot.cpp195
-rw-r--r--indra/newview/llagentpilot.h47
-rw-r--r--indra/newview/llagentwearables.cpp63
-rw-r--r--indra/newview/llagentwearables.h6
-rw-r--r--indra/newview/llagentwearablesfetch.cpp14
-rw-r--r--indra/newview/llagentwearablesfetch.h2
-rw-r--r--indra/newview/llappearancemgr.cpp231
-rw-r--r--indra/newview/llappearancemgr.h12
-rw-r--r--indra/newview/llappviewer.cpp1484
-rw-r--r--indra/newview/llappviewer.h22
-rw-r--r--indra/newview/llappviewerlinux.cpp70
-rw-r--r--indra/newview/llappviewermacosx.cpp2
-rw-r--r--indra/newview/llappviewerwin32.cpp72
-rw-r--r--indra/newview/llassetuploadqueue.cpp4
-rw-r--r--indra/newview/llassetuploadresponders.cpp792
-rw-r--r--indra/newview/llassetuploadresponders.h54
-rwxr-xr-x[-rw-r--r--]indra/newview/llavataractions.cpp169
-rw-r--r--indra/newview/llavataractions.h6
-rwxr-xr-x[-rw-r--r--]indra/newview/llavatariconctrl.cpp4
-rw-r--r--indra/newview/llavatarlist.cpp35
-rw-r--r--indra/newview/llavatarlist.h2
-rw-r--r--indra/newview/llavatarpropertiesprocessor.cpp25
-rw-r--r--indra/newview/llbottomtray.cpp1733
-rw-r--r--indra/newview/llbottomtray.h489
-rw-r--r--indra/newview/llbreastmotion.cpp396
-rw-r--r--indra/newview/llbreastmotion.h154
-rw-r--r--indra/newview/llbrowsernotification.cpp14
-rw-r--r--indra/newview/llbuycurrencyhtml.cpp4
-rw-r--r--indra/newview/llcallbacklist.cpp65
-rw-r--r--indra/newview/llcallbacklist.h9
-rw-r--r--indra/newview/llcallfloater.cpp36
-rw-r--r--indra/newview/llcallfloater.h1
-rw-r--r--indra/newview/llcapabilityprovider.h2
-rw-r--r--indra/newview/llchannelmanager.cpp51
-rw-r--r--indra/newview/llchannelmanager.h25
-rw-r--r--indra/newview/llchatbar.cpp9
-rw-r--r--indra/newview/llchathistory.cpp102
-rw-r--r--indra/newview/llchathistory.h2
-rw-r--r--indra/newview/llchatitemscontainerctrl.cpp21
-rw-r--r--indra/newview/llchatmsgbox.cpp2
-rw-r--r--indra/newview/llchiclet.cpp52
-rw-r--r--indra/newview/llchiclet.h23
-rw-r--r--indra/newview/llchicletbar.cpp345
-rw-r--r--indra/newview/llchicletbar.h105
-rw-r--r--indra/newview/llcloud.cpp538
-rw-r--r--indra/newview/llcloud.h199
-rw-r--r--indra/newview/llcofwearables.cpp32
-rw-r--r--indra/newview/llcofwearables.h2
-rw-r--r--indra/newview/llcolorswatch.cpp39
-rw-r--r--indra/newview/llcolorswatch.h2
-rw-r--r--indra/newview/llcommanddispatcherlistener.cpp2
-rwxr-xr-x[-rw-r--r--]indra/newview/llcommandhandler.cpp17
-rw-r--r--indra/newview/llcommandhandler.h1
-rw-r--r--indra/newview/llcommandlineparser.cpp5
-rw-r--r--indra/newview/llcompilequeue.cpp16
-rw-r--r--indra/newview/llcylinder.cpp260
-rw-r--r--indra/newview/llcylinder.h33
-rw-r--r--indra/newview/lldateutil.cpp31
-rw-r--r--indra/newview/lldateutil.h14
-rw-r--r--indra/newview/lldaycyclemanager.cpp230
-rw-r--r--indra/newview/lldaycyclemanager.h84
-rw-r--r--indra/newview/lldebugview.cpp58
-rw-r--r--indra/newview/lldebugview.h7
-rw-r--r--indra/newview/lldirpicker.cpp44
-rw-r--r--indra/newview/lldirpicker.h1
-rw-r--r--indra/newview/lldndbutton.cpp9
-rw-r--r--indra/newview/lldndbutton.h5
-rw-r--r--indra/newview/lldrawable.cpp247
-rw-r--r--indra/newview/lldrawable.h93
-rw-r--r--indra/newview/lldrawpool.cpp72
-rw-r--r--indra/newview/lldrawpool.h16
-rw-r--r--indra/newview/lldrawpoolalpha.cpp360
-rw-r--r--indra/newview/lldrawpoolalpha.h1
-rw-r--r--indra/newview/lldrawpoolavatar.cpp1155
-rw-r--r--indra/newview/lldrawpoolavatar.h112
-rw-r--r--indra/newview/lldrawpoolbump.cpp625
-rw-r--r--indra/newview/lldrawpoolbump.h13
-rw-r--r--indra/newview/lldrawpoolclouds.cpp97
-rw-r--r--indra/newview/lldrawpoolclouds.h54
-rw-r--r--indra/newview/lldrawpoolground.cpp6
-rw-r--r--indra/newview/lldrawpoolsimple.cpp166
-rw-r--r--indra/newview/lldrawpoolsimple.h19
-rw-r--r--indra/newview/lldrawpoolsky.cpp27
-rw-r--r--indra/newview/lldrawpoolterrain.cpp234
-rw-r--r--indra/newview/lldrawpoolterrain.h3
-rw-r--r--indra/newview/lldrawpooltree.cpp191
-rw-r--r--indra/newview/lldrawpooltree.h3
-rw-r--r--indra/newview/lldrawpoolwater.cpp73
-rw-r--r--indra/newview/lldrawpoolwater.h1
-rw-r--r--indra/newview/lldrawpoolwlsky.cpp192
-rw-r--r--indra/newview/lldrawpoolwlsky.h8
-rw-r--r--indra/newview/lldriverparam.cpp2
-rw-r--r--indra/newview/lldriverparam.h2
-rw-r--r--indra/newview/lldynamictexture.cpp45
-rw-r--r--indra/newview/llenvmanager.cpp678
-rw-r--r--indra/newview/llenvmanager.h277
-rw-r--r--indra/newview/llestateinfomodel.cpp230
-rw-r--r--indra/newview/llestateinfomodel.h103
-rw-r--r--indra/newview/lleventnotifier.h1
-rw-r--r--indra/newview/llexpandabletextbox.cpp44
-rw-r--r--indra/newview/llexpandabletextbox.h10
-rw-r--r--indra/newview/llexternaleditor.cpp34
-rw-r--r--indra/newview/llexternaleditor.h22
-rw-r--r--indra/newview/llface.cpp1559
-rw-r--r--indra/newview/llface.h60
-rw-r--r--indra/newview/llfasttimerview.cpp652
-rw-r--r--indra/newview/llfasttimerview.h10
-rw-r--r--indra/newview/llfavoritesbar.cpp428
-rw-r--r--indra/newview/llfavoritesbar.h25
-rw-r--r--indra/newview/llfeaturemanager.cpp71
-rw-r--r--indra/newview/llfilepicker.cpp258
-rw-r--r--indra/newview/llfilepicker.h12
-rw-r--r--indra/newview/llfilteredwearablelist.cpp1
-rw-r--r--indra/newview/llfirstuse.cpp20
-rw-r--r--indra/newview/llfirstuse.h4
-rw-r--r--indra/newview/llflexibleobject.cpp22
-rw-r--r--indra/newview/llflexibleobject.h2
-rw-r--r--indra/newview/llfloaterabout.cpp299
-rw-r--r--indra/newview/llfloateranimpreview.cpp1169
-rw-r--r--indra/newview/llfloateranimpreview.h131
-rw-r--r--indra/newview/llfloaterauction.cpp22
-rw-r--r--indra/newview/llfloateravatar.cpp54
-rw-r--r--indra/newview/llfloateravatar.h43
-rw-r--r--indra/newview/llfloateravatarpicker.cpp5
-rw-r--r--indra/newview/llfloaterbeacons.cpp2
-rw-r--r--indra/newview/llfloaterbuildoptions.cpp19
-rw-r--r--indra/newview/llfloaterbuildoptions.h16
-rw-r--r--indra/newview/llfloaterbump.cpp2
-rw-r--r--indra/newview/llfloaterbuy.cpp3
-rw-r--r--indra/newview/llfloaterbuycontents.cpp4
-rw-r--r--indra/newview/llfloaterbuycurrency.cpp6
-rw-r--r--indra/newview/llfloaterbuycurrencyhtml.cpp4
-rw-r--r--indra/newview/llfloaterbuyland.cpp24
-rw-r--r--indra/newview/llfloaterbvhpreview.cpp1174
-rw-r--r--indra/newview/llfloaterbvhpreview.h132
-rw-r--r--indra/newview/llfloatercamera.cpp58
-rw-r--r--indra/newview/llfloatercamera.h8
-rw-r--r--indra/newview/llfloaterchat.cpp484
-rw-r--r--indra/newview/llfloaterchat.h78
-rw-r--r--indra/newview/llfloaterchatterbox.cpp344
-rw-r--r--indra/newview/llfloaterchatterbox.h80
-rw-r--r--indra/newview/llfloatercolorpicker.cpp21
-rw-r--r--indra/newview/llfloatercolorpicker.h1
-rw-r--r--indra/newview/llfloaterdaycycle.cpp531
-rw-r--r--indra/newview/llfloaterdaycycle.h120
-rw-r--r--indra/newview/llfloaterdeleteenvpreset.cpp285
-rw-r--r--indra/newview/llfloaterdeleteenvpreset.h62
-rw-r--r--indra/newview/llfloaterdestinations.cpp54
-rw-r--r--indra/newview/llfloaterdestinations.h43
-rw-r--r--indra/newview/llfloatereditdaycycle.cpp825
-rw-r--r--indra/newview/llfloatereditdaycycle.h137
-rw-r--r--indra/newview/llfloatereditsky.cpp922
-rw-r--r--indra/newview/llfloatereditsky.h113
-rw-r--r--indra/newview/llfloatereditwater.cpp772
-rw-r--r--indra/newview/llfloatereditwater.h115
-rw-r--r--indra/newview/llfloaterenvironmentsettings.cpp282
-rw-r--r--indra/newview/llfloaterenvironmentsettings.h71
-rw-r--r--indra/newview/llfloaterenvsettings.cpp268
-rw-r--r--indra/newview/llfloaterenvsettings.h83
-rw-r--r--indra/newview/llfloaterevent.cpp5
-rw-r--r--indra/newview/llfloaterevent.h1
-rw-r--r--indra/newview/llfloaterfriends.cpp807
-rw-r--r--indra/newview/llfloaterfriends.h140
-rw-r--r--indra/newview/llfloatergesture.cpp29
-rw-r--r--indra/newview/llfloatergodtools.cpp6
-rw-r--r--indra/newview/llfloaterhardwaresettings.cpp41
-rw-r--r--indra/newview/llfloaterhelpbrowser.cpp34
-rw-r--r--indra/newview/llfloaterhelpbrowser.h5
-rw-r--r--indra/newview/llfloaterhud.cpp8
-rw-r--r--indra/newview/llfloaterimagepreview.cpp217
-rw-r--r--indra/newview/llfloaterinspect.cpp39
-rw-r--r--indra/newview/llfloaterinspect.h4
-rw-r--r--indra/newview/llfloaterinventory.cpp9
-rw-r--r--indra/newview/llfloaterinventory.h1
-rw-r--r--indra/newview/llfloaterland.cpp87
-rw-r--r--indra/newview/llfloaterland.h7
-rw-r--r--indra/newview/llfloatermap.cpp110
-rw-r--r--indra/newview/llfloatermap.h11
-rw-r--r--indra/newview/llfloatermediabrowser.cpp458
-rw-r--r--indra/newview/llfloatermediabrowser.h86
-rw-r--r--indra/newview/llfloatermediasettings.cpp17
-rw-r--r--indra/newview/llfloatermediasettings.h1
-rw-r--r--indra/newview/llfloatermemleak.cpp5
-rwxr-xr-xindra/newview/llfloatermodelpreview.cpp5883
-rw-r--r--indra/newview/llfloatermodelpreview.h473
-rw-r--r--indra/newview/llfloatermodeluploadbase.cpp58
-rw-r--r--indra/newview/llfloatermodeluploadbase.h61
-rw-r--r--indra/newview/llfloaternamedesc.cpp40
-rw-r--r--indra/newview/llfloaternamedesc.h17
-rw-r--r--indra/newview/llfloaternotificationsconsole.cpp3
-rw-r--r--indra/newview/llfloaterobjectweights.cpp266
-rw-r--r--indra/newview/llfloaterobjectweights.h93
-rw-r--r--indra/newview/llfloateropenobject.cpp60
-rw-r--r--indra/newview/llfloateropenobject.h11
-rw-r--r--indra/newview/llfloateroutbox.cpp567
-rw-r--r--indra/newview/llfloateroutbox.h114
-rw-r--r--indra/newview/llfloaterpostcard.cpp377
-rw-r--r--indra/newview/llfloaterpostcard.h79
-rwxr-xr-x[-rw-r--r--]indra/newview/llfloaterpreference.cpp706
-rw-r--r--indra/newview/llfloaterpreference.h87
-rw-r--r--indra/newview/llfloaterproperties.cpp20
-rw-r--r--indra/newview/llfloaterregiondebugconsole.cpp43
-rw-r--r--indra/newview/llfloaterregiondebugconsole.h41
-rw-r--r--indra/newview/llfloaterregioninfo.cpp1431
-rw-r--r--indra/newview/llfloaterregioninfo.h138
-rw-r--r--indra/newview/llfloaterreporter.cpp6
-rw-r--r--indra/newview/llfloaterreporter.h1
-rw-r--r--indra/newview/llfloaterscriptdebug.cpp6
-rw-r--r--indra/newview/llfloatersearch.cpp74
-rw-r--r--indra/newview/llfloatersearch.h28
-rw-r--r--indra/newview/llfloatersellland.cpp9
-rw-r--r--indra/newview/llfloatersettingsdebug.cpp2
-rw-r--r--indra/newview/llfloatersidepanelcontainer.cpp114
-rw-r--r--indra/newview/llfloatersidepanelcontainer.h81
-rw-r--r--indra/newview/llfloatersidetraytab.cpp45
-rw-r--r--indra/newview/llfloatersidetraytab.h47
-rw-r--r--indra/newview/llfloatersnapshot.cpp1433
-rw-r--r--indra/newview/llfloatersnapshot.h31
-rw-r--r--indra/newview/llfloatersounddevices.cpp86
-rw-r--r--indra/newview/llfloatersounddevices.h49
-rw-r--r--indra/newview/llfloatertools.cpp262
-rw-r--r--indra/newview/llfloatertools.h11
-rw-r--r--indra/newview/llfloatertopobjects.cpp5
-rw-r--r--indra/newview/llfloatertoybox.cpp191
-rw-r--r--indra/newview/llfloatertoybox.h62
-rw-r--r--indra/newview/llfloatertranslationsettings.cpp298
-rw-r--r--indra/newview/llfloatertranslationsettings.h76
-rw-r--r--indra/newview/llfloateruipreview.cpp53
-rw-r--r--indra/newview/llfloatervoiceeffect.cpp4
-rw-r--r--indra/newview/llfloaterwater.cpp625
-rw-r--r--indra/newview/llfloaterwater.h107
-rw-r--r--indra/newview/llfloaterwebcontent.cpp467
-rw-r--r--indra/newview/llfloaterwebcontent.h113
-rw-r--r--indra/newview/llfloaterwebprofile.cpp79
-rw-r--r--indra/newview/llfloaterwebprofile.h59
-rw-r--r--indra/newview/llfloaterwindlight.cpp875
-rw-r--r--indra/newview/llfloaterwindlight.h112
-rw-r--r--indra/newview/llfloaterwindowsize.cpp35
-rw-r--r--indra/newview/llfloaterwindowsize.h22
-rwxr-xr-x[-rw-r--r--]indra/newview/llfloaterworldmap.cpp435
-rw-r--r--indra/newview/llfloaterworldmap.h10
-rw-r--r--indra/newview/llfolderview.cpp418
-rw-r--r--indra/newview/llfolderview.h90
-rw-r--r--indra/newview/llfoldervieweventlistener.h5
-rw-r--r--indra/newview/llfolderviewitem.cpp703
-rw-r--r--indra/newview/llfolderviewitem.h77
-rw-r--r--indra/newview/llfriendcard.cpp115
-rw-r--r--indra/newview/llfriendcard.h13
-rw-r--r--indra/newview/llgesturelistener.cpp159
-rw-r--r--indra/newview/llgesturelistener.h52
-rw-r--r--indra/newview/llgesturemgr.cpp158
-rw-r--r--indra/newview/llgesturemgr.h17
-rw-r--r--indra/newview/llgiveinventory.cpp3
-rw-r--r--indra/newview/llglsandbox.cpp44
-rw-r--r--indra/newview/llgroupactions.cpp31
-rw-r--r--indra/newview/llgroupactions.h2
-rw-r--r--indra/newview/llgrouplist.cpp18
-rw-r--r--indra/newview/llgrouplist.h1
-rw-r--r--indra/newview/llgroupmgr.cpp82
-rw-r--r--indra/newview/llhints.cpp35
-rw-r--r--indra/newview/llhudeffectbeam.cpp12
-rw-r--r--indra/newview/llhudeffectblob.cpp98
-rw-r--r--indra/newview/llhudeffectblob.h54
-rw-r--r--indra/newview/llhudeffectlookat.cpp13
-rw-r--r--indra/newview/llhudeffectpointat.cpp6
-rw-r--r--indra/newview/llhudicon.cpp42
-rw-r--r--indra/newview/llhudmanager.cpp7
-rw-r--r--indra/newview/llhudnametag.cpp38
-rw-r--r--indra/newview/llhudobject.cpp4
-rw-r--r--indra/newview/llhudobject.h3
-rw-r--r--indra/newview/llhudrender.cpp28
-rw-r--r--indra/newview/llhudtext.cpp9
-rw-r--r--indra/newview/llimfloater.cpp76
-rw-r--r--indra/newview/llimfloater.h6
-rw-r--r--indra/newview/llimfloatercontainer.cpp3
-rw-r--r--indra/newview/llimfloatercontainer.h2
-rw-r--r--indra/newview/llimhandler.cpp12
-rw-r--r--indra/newview/llimpanel.cpp1
-rw-r--r--indra/newview/llimview.cpp298
-rw-r--r--indra/newview/llimview.h49
-rw-r--r--indra/newview/llinspectavatar.cpp88
-rw-r--r--indra/newview/llinspectobject.cpp4
-rw-r--r--indra/newview/llinspectremoteobject.cpp24
-rw-r--r--indra/newview/llinspecttoast.cpp13
-rw-r--r--indra/newview/llinventorybridge.cpp2000
-rw-r--r--indra/newview/llinventorybridge.h83
-rw-r--r--indra/newview/llinventoryfilter.cpp381
-rw-r--r--indra/newview/llinventoryfilter.h30
-rw-r--r--indra/newview/llinventoryfunctions.cpp382
-rw-r--r--indra/newview/llinventoryfunctions.h46
-rw-r--r--indra/newview/llinventoryicon.cpp5
-rw-r--r--indra/newview/llinventoryicon.h5
-rw-r--r--indra/newview/llinventoryitemslist.h1
-rw-r--r--indra/newview/llinventorylistitem.cpp3
-rw-r--r--indra/newview/llinventorymodel.cpp561
-rw-r--r--indra/newview/llinventorymodel.h46
-rw-r--r--indra/newview/llinventorymodelbackgroundfetch.cpp451
-rw-r--r--indra/newview/llinventorymodelbackgroundfetch.h20
-rw-r--r--indra/newview/llinventoryobserver.cpp62
-rw-r--r--indra/newview/llinventoryobserver.h23
-rw-r--r--indra/newview/llinventorypanel.cpp708
-rw-r--r--indra/newview/llinventorypanel.h69
-rw-r--r--indra/newview/lljoystickbutton.h4
-rw-r--r--indra/newview/lllandmarkactions.cpp2
-rw-r--r--indra/newview/lllistcontextmenu.cpp28
-rw-r--r--indra/newview/lllistcontextmenu.h3
-rw-r--r--indra/newview/lllocalbitmaps.cpp942
-rw-r--r--indra/newview/lllocalbitmaps.h136
-rw-r--r--indra/newview/lllocationhistory.h1
-rw-r--r--indra/newview/lllocationinputctrl.cpp32
-rw-r--r--indra/newview/lllocationinputctrl.h16
-rw-r--r--indra/newview/lllogchat.cpp25
-rw-r--r--indra/newview/llloginhandler.cpp6
-rw-r--r--indra/newview/lllogininstance.cpp538
-rw-r--r--indra/newview/lllogininstance.h13
-rw-r--r--indra/newview/llmanip.cpp28
-rw-r--r--indra/newview/llmaniprotate.cpp158
-rw-r--r--indra/newview/llmanipscale.cpp82
-rw-r--r--indra/newview/llmanipscale.h3
-rw-r--r--indra/newview/llmaniptranslate.cpp43
-rw-r--r--indra/newview/llmarketplacefunctions.cpp478
-rw-r--r--indra/newview/llmarketplacefunctions.h94
-rw-r--r--indra/newview/llmarketplacenotifications.cpp90
-rw-r--r--indra/newview/llmarketplacenotifications.h57
-rw-r--r--indra/newview/llmediactrl.cpp446
-rw-r--r--indra/newview/llmediactrl.h69
-rw-r--r--indra/newview/llmemoryview.cpp55
-rw-r--r--indra/newview/llmemoryview.h5
-rw-r--r--indra/newview/llmenucommands.cpp94
-rw-r--r--indra/newview/llmenucommands.h37
-rwxr-xr-xindra/newview/llmeshrepository.cpp3537
-rw-r--r--indra/newview/llmeshrepository.h557
-rw-r--r--indra/newview/llmorphview.h4
-rw-r--r--indra/newview/llmoveview.cpp81
-rw-r--r--indra/newview/llmoveview.h6
-rw-r--r--indra/newview/llmutelist.cpp25
-rw-r--r--indra/newview/llmutelist.h1
-rw-r--r--indra/newview/llnamelistctrl.cpp25
-rw-r--r--indra/newview/llnamelistctrl.h20
-rw-r--r--indra/newview/llnavigationbar.cpp215
-rw-r--r--indra/newview/llnavigationbar.h7
-rw-r--r--indra/newview/llnearbychat.cpp117
-rw-r--r--indra/newview/llnearbychat.h20
-rw-r--r--indra/newview/llnearbychatbar.cpp463
-rw-r--r--indra/newview/llnearbychatbar.h79
-rw-r--r--indra/newview/llnearbychatbarlistener.cpp100
-rw-r--r--indra/newview/llnearbychatbarlistener.h50
-rw-r--r--indra/newview/llnearbychathandler.cpp207
-rw-r--r--indra/newview/llnearbychathandler.h4
-rw-r--r--indra/newview/llnetmap.cpp236
-rw-r--r--indra/newview/llnetmap.h20
-rw-r--r--indra/newview/llnotificationalerthandler.cpp20
-rw-r--r--indra/newview/llnotificationgrouphandler.cpp16
-rw-r--r--indra/newview/llnotificationhandler.h14
-rw-r--r--indra/newview/llnotificationhandlerutil.cpp22
-rw-r--r--indra/newview/llnotificationmanager.cpp28
-rw-r--r--indra/newview/llnotificationmanager.h7
-rw-r--r--indra/newview/llnotificationofferhandler.cpp19
-rw-r--r--indra/newview/llnotificationscripthandler.cpp22
-rw-r--r--indra/newview/llnotificationtiphandler.cpp24
-rw-r--r--indra/newview/lloutfitslist.cpp8
-rw-r--r--indra/newview/lloutputmonitorctrl.h1
-rw-r--r--indra/newview/lloverlaybar.cpp378
-rw-r--r--indra/newview/lloverlaybar.h95
-rw-r--r--indra/newview/llpanelappearancetab.cpp1
-rw-r--r--indra/newview/llpanelavatar.cpp671
-rw-r--r--indra/newview/llpanelavatar.h195
-rw-r--r--indra/newview/llpanelblockedlist.cpp4
-rw-r--r--indra/newview/llpanelcontents.cpp2
-rw-r--r--indra/newview/llpaneleditwearable.cpp2319
-rw-r--r--indra/newview/llpaneleditwearable.h11
-rw-r--r--indra/newview/llpanelface.cpp41
-rw-r--r--indra/newview/llpanelgroup.cpp6
-rw-r--r--indra/newview/llpanelgroupgeneral.cpp6
-rw-r--r--indra/newview/llpanelgroupinvite.cpp12
-rw-r--r--indra/newview/llpanelgrouplandmoney.cpp44
-rw-r--r--indra/newview/llpanelgroupnotices.cpp5
-rw-r--r--indra/newview/llpanelgrouproles.cpp27
-rw-r--r--indra/newview/llpanelgrouproles.h2
-rw-r--r--indra/newview/llpanelimcontrolpanel.cpp98
-rw-r--r--indra/newview/llpanelimcontrolpanel.h8
-rw-r--r--indra/newview/llpanellandaudio.cpp35
-rw-r--r--indra/newview/llpanellandaudio.h2
-rw-r--r--indra/newview/llpanellandmarkinfo.cpp6
-rw-r--r--indra/newview/llpanellandmarks.cpp117
-rw-r--r--indra/newview/llpanellandmarks.h8
-rw-r--r--indra/newview/llpanellandmedia.cpp27
-rw-r--r--indra/newview/llpanellogin.cpp425
-rw-r--r--indra/newview/llpanellogin.h8
-rw-r--r--indra/newview/llpanelmaininventory.cpp190
-rw-r--r--indra/newview/llpanelmaininventory.h5
-rw-r--r--indra/newview/llpanelmarketplaceinbox.cpp255
-rw-r--r--indra/newview/llpanelmarketplaceinbox.h77
-rw-r--r--indra/newview/llpanelmarketplaceinboxinventory.cpp329
-rw-r--r--indra/newview/llpanelmarketplaceinboxinventory.h121
-rw-r--r--indra/newview/llpanelmarketplaceoutboxinventory.cpp156
-rw-r--r--indra/newview/llpanelmarketplaceoutboxinventory.h78
-rw-r--r--indra/newview/llpanelme.cpp357
-rw-r--r--indra/newview/llpanelme.h67
-rw-r--r--indra/newview/llpanelnearbymedia.cpp71
-rw-r--r--indra/newview/llpanelnearbymedia.h1
-rw-r--r--indra/newview/llpanelobject.cpp213
-rw-r--r--indra/newview/llpanelobject.h8
-rw-r--r--indra/newview/llpanelobjectinventory.cpp270
-rw-r--r--indra/newview/llpaneloutfitedit.cpp19
-rw-r--r--indra/newview/llpaneloutfitedit.h1
-rw-r--r--indra/newview/llpaneloutfitsinventory.cpp9
-rw-r--r--indra/newview/llpanelpeople.cpp119
-rw-r--r--indra/newview/llpanelpeople.h2
-rwxr-xr-x[-rw-r--r--]indra/newview/llpanelpicks.cpp279
-rwxr-xr-x[-rw-r--r--]indra/newview/llpanelpicks.h11
-rw-r--r--indra/newview/llpanelplaceprofile.cpp50
-rw-r--r--indra/newview/llpanelplaceprofile.h2
-rw-r--r--indra/newview/llpanelplaces.cpp238
-rw-r--r--indra/newview/llpanelplaces.h11
-rw-r--r--indra/newview/llpanelprimmediacontrols.cpp127
-rw-r--r--indra/newview/llpanelprimmediacontrols.h18
-rwxr-xr-x[-rw-r--r--]indra/newview/llpanelprofile.cpp271
-rwxr-xr-x[-rw-r--r--]indra/newview/llpanelprofile.h38
-rw-r--r--indra/newview/llpanelprofileview.cpp247
-rw-r--r--indra/newview/llpanelprofileview.h108
-rw-r--r--indra/newview/llpanelsnapshot.cpp201
-rw-r--r--indra/newview/llpanelsnapshot.h71
-rw-r--r--indra/newview/llpanelsnapshotinventory.cpp109
-rw-r--r--indra/newview/llpanelsnapshotlocal.cpp168
-rw-r--r--indra/newview/llpanelsnapshotoptions.cpp120
-rw-r--r--indra/newview/llpanelsnapshotpostcard.cpp270
-rw-r--r--indra/newview/llpanelsnapshotprofile.cpp101
-rw-r--r--indra/newview/llpanelteleporthistory.cpp83
-rw-r--r--indra/newview/llpanelteleporthistory.h2
-rw-r--r--indra/newview/llpaneltopinfobar.cpp46
-rw-r--r--indra/newview/llpaneltopinfobar.h21
-rw-r--r--indra/newview/llpanelvoicedevicesettings.cpp128
-rw-r--r--indra/newview/llpanelvoicedevicesettings.h6
-rw-r--r--indra/newview/llpanelvoiceeffect.cpp1
-rw-r--r--indra/newview/llpanelvolume.cpp236
-rw-r--r--indra/newview/llpanelvolume.h19
-rw-r--r--indra/newview/llpanelwearing.cpp30
-rw-r--r--indra/newview/llpanelwearing.h2
-rw-r--r--indra/newview/llparticipantlist.cpp35
-rw-r--r--indra/newview/llparticipantlist.h6
-rw-r--r--indra/newview/llphysicsmotion.cpp732
-rw-r--r--indra/newview/llphysicsmotion.h118
-rw-r--r--indra/newview/llphysicsshapebuilderutil.cpp210
-rw-r--r--indra/newview/llphysicsshapebuilderutil.h138
-rw-r--r--indra/newview/llplacesinventorybridge.cpp4
-rw-r--r--indra/newview/llplacesinventorypanel.cpp85
-rw-r--r--indra/newview/llplacesinventorypanel.h2
-rw-r--r--indra/newview/llpolymesh.cpp1708
-rw-r--r--indra/newview/llpolymesh.h12
-rw-r--r--indra/newview/llpolymorph.cpp70
-rw-r--r--indra/newview/llpolymorph.h1
-rw-r--r--indra/newview/llpopupview.cpp75
-rw-r--r--indra/newview/llpopupview.h2
-rw-r--r--indra/newview/llpostcard.cpp155
-rw-r--r--indra/newview/llpostcard.h48
-rw-r--r--indra/newview/llpreview.cpp26
-rw-r--r--indra/newview/llpreview.h1
-rw-r--r--indra/newview/llpreviewanim.cpp146
-rw-r--r--indra/newview/llpreviewanim.h20
-rw-r--r--indra/newview/llpreviewgesture.cpp4
-rw-r--r--indra/newview/llpreviewnotecard.cpp28
-rw-r--r--indra/newview/llpreviewscript.cpp445
-rw-r--r--indra/newview/llpreviewscript.h55
-rw-r--r--indra/newview/llpreviewtexture.cpp105
-rw-r--r--indra/newview/llprogressview.cpp179
-rw-r--r--indra/newview/llprogressview.h25
-rw-r--r--indra/newview/llrecentpeople.cpp58
-rw-r--r--indra/newview/llrecentpeople.h33
-rw-r--r--indra/newview/llregioninfomodel.cpp217
-rw-r--r--indra/newview/llregioninfomodel.h99
-rw-r--r--indra/newview/llremoteparcelrequest.cpp31
-rw-r--r--indra/newview/llrootview.h22
-rw-r--r--indra/newview/llsceneview.cpp438
-rw-r--r--indra/newview/llsceneview.h48
-rw-r--r--indra/newview/llscreenchannel.cpp566
-rw-r--r--indra/newview/llscreenchannel.h84
-rw-r--r--indra/newview/llscriptfloater.cpp40
-rw-r--r--indra/newview/llscriptfloater.h6
-rw-r--r--indra/newview/llscrollingpanelparam.cpp62
-rw-r--r--indra/newview/llscrollingpanelparam.h11
-rw-r--r--indra/newview/llscrollingpanelparambase.cpp112
-rw-r--r--indra/newview/llscrollingpanelparambase.h62
-rw-r--r--indra/newview/llsearchcombobox.cpp10
-rw-r--r--indra/newview/llsecapi.h14
-rw-r--r--indra/newview/llsechandler_basic.cpp20
-rw-r--r--indra/newview/llselectmgr.cpp757
-rw-r--r--indra/newview/llselectmgr.h29
-rw-r--r--indra/newview/llshareavatarhandler.cpp67
-rw-r--r--indra/newview/llsidepanelappearance.cpp53
-rw-r--r--indra/newview/llsidepanelappearance.h6
-rw-r--r--indra/newview/llsidepanelinventory.cpp414
-rw-r--r--indra/newview/llsidepanelinventory.h35
-rw-r--r--indra/newview/llsidepanelinventorysubpanel.cpp4
-rw-r--r--indra/newview/llsidepanelinventorysubpanel.h2
-rw-r--r--indra/newview/llsidepaneliteminfo.cpp17
-rw-r--r--indra/newview/llsidepaneliteminfo.h3
-rw-r--r--indra/newview/llsidepaneltaskinfo.cpp171
-rw-r--r--indra/newview/llsidepaneltaskinfo.h40
-rw-r--r--indra/newview/llsidetray.cpp1270
-rw-r--r--indra/newview/llsidetray.h228
-rw-r--r--indra/newview/llsidetraypanelcontainer.cpp11
-rw-r--r--indra/newview/llsidetraypanelcontainer.h5
-rw-r--r--indra/newview/llsimplestat.h152
-rw-r--r--indra/newview/llslurl.cpp6
-rw-r--r--indra/newview/llspatialpartition.cpp2146
-rw-r--r--indra/newview/llspatialpartition.h145
-rw-r--r--indra/newview/llspeakbutton.cpp185
-rw-r--r--indra/newview/llspeakbutton.h93
-rw-r--r--indra/newview/llspeakers.cpp16
-rw-r--r--indra/newview/llspeakers.h7
-rw-r--r--indra/newview/llsprite.cpp9
-rw-r--r--indra/newview/llstartup.cpp795
-rw-r--r--indra/newview/llstartup.h4
-rw-r--r--indra/newview/llstatusbar.cpp28
-rw-r--r--indra/newview/llstatusbar.h5
-rw-r--r--indra/newview/llsurface.cpp16
-rw-r--r--indra/newview/llsurface.h3
-rw-r--r--indra/newview/llsurfacepatch.cpp6
-rw-r--r--indra/newview/llsyswellwindow.cpp38
-rw-r--r--indra/newview/llsyswellwindow.h6
-rw-r--r--indra/newview/llteleporthistory.cpp9
-rw-r--r--indra/newview/llteleporthistory.h3
-rw-r--r--indra/newview/llteleporthistorystorage.cpp1
-rw-r--r--indra/newview/llteleporthistorystorage.h6
-rw-r--r--indra/newview/lltexlayer.cpp204
-rw-r--r--indra/newview/lltexlayer.h8
-rw-r--r--indra/newview/lltexturecache.cpp94
-rw-r--r--indra/newview/lltexturecache.h2
-rw-r--r--indra/newview/lltexturectrl.cpp216
-rw-r--r--indra/newview/lltexturectrl.h8
-rw-r--r--indra/newview/lltexturefetch.cpp700
-rw-r--r--indra/newview/lltexturefetch.h94
-rw-r--r--indra/newview/lltexturestats.cpp2
-rw-r--r--indra/newview/lltextureview.cpp32
-rw-r--r--indra/newview/lltoast.cpp226
-rw-r--r--indra/newview/lltoast.h68
-rw-r--r--indra/newview/lltoastalertpanel.cpp30
-rw-r--r--indra/newview/lltoastalertpanel.h1
-rw-r--r--indra/newview/lltoastgroupnotifypanel.cpp1
-rw-r--r--indra/newview/lltoastnotifypanel.cpp43
-rw-r--r--indra/newview/lltoastpanel.cpp2
-rw-r--r--indra/newview/lltoastscripttextbox.cpp16
-rw-r--r--indra/newview/lltoastscripttextbox.h13
-rw-r--r--indra/newview/lltool.cpp8
-rw-r--r--indra/newview/lltool.h2
-rw-r--r--indra/newview/lltoolbar.cpp365
-rw-r--r--indra/newview/lltoolbar.h82
-rw-r--r--indra/newview/lltoolbarview.cpp709
-rw-r--r--indra/newview/lltoolbarview.h140
-rw-r--r--indra/newview/lltoolbrush.cpp8
-rw-r--r--indra/newview/lltooldraganddrop.cpp390
-rw-r--r--indra/newview/lltooldraganddrop.h25
-rw-r--r--indra/newview/lltoolgrab.cpp99
-rw-r--r--indra/newview/lltoolgrab.h7
-rw-r--r--indra/newview/lltoolgun.cpp4
-rw-r--r--indra/newview/lltoolmgr.cpp49
-rw-r--r--indra/newview/lltoolmgr.h2
-rw-r--r--indra/newview/lltoolmorph.cpp23
-rw-r--r--indra/newview/lltoolmorph.h2
-rw-r--r--indra/newview/lltoolpie.cpp506
-rw-r--r--indra/newview/lltoolpie.h32
-rw-r--r--indra/newview/lltracker.cpp20
-rw-r--r--indra/newview/lltracker.h2
-rw-r--r--indra/newview/lltransientfloatermgr.cpp47
-rw-r--r--indra/newview/lltransientfloatermgr.h9
-rwxr-xr-x[-rw-r--r--]indra/newview/lltranslate.cpp431
-rwxr-xr-x[-rw-r--r--]indra/newview/lltranslate.h365
-rw-r--r--indra/newview/lluilistener.cpp28
-rw-r--r--indra/newview/lluilistener.h1
-rw-r--r--indra/newview/lluploaddialog.cpp2
-rw-r--r--indra/newview/lluploadfloaterobservers.cpp56
-rw-r--r--indra/newview/lluploadfloaterobservers.h97
-rw-r--r--indra/newview/llurldispatcher.cpp35
-rw-r--r--indra/newview/llurldispatcher.h3
-rw-r--r--indra/newview/llurldispatcherlistener.cpp2
-rw-r--r--indra/newview/llurllineeditorctrl.cpp2
-rw-r--r--indra/newview/llversioninfo.cpp6
-rw-r--r--indra/newview/llversioninfo.h4
-rw-r--r--indra/newview/llviewerassetstats.cpp612
-rw-r--r--indra/newview/llviewerassetstats.h328
-rw-r--r--indra/newview/llviewerassetstorage.cpp135
-rw-r--r--indra/newview/llviewerassetstorage.h11
-rw-r--r--indra/newview/llviewerassettype.cpp4
-rw-r--r--indra/newview/llvieweraudio.cpp252
-rw-r--r--indra/newview/llvieweraudio.h47
-rw-r--r--indra/newview/llviewercamera.cpp89
-rw-r--r--indra/newview/llviewercamera.h2
-rw-r--r--indra/newview/llviewerchat.cpp76
-rw-r--r--indra/newview/llviewerchat.h10
-rw-r--r--indra/newview/llviewercontrol.cpp158
-rw-r--r--indra/newview/llviewercontrollistener.cpp231
-rw-r--r--indra/newview/llviewercontrollistener.h10
-rw-r--r--indra/newview/llviewerdisplay.cpp283
-rw-r--r--indra/newview/llviewerfloaterreg.cpp112
-rw-r--r--indra/newview/llviewerfoldertype.cpp70
-rw-r--r--indra/newview/llviewerfoldertype.h1
-rw-r--r--indra/newview/llviewerhelp.cpp48
-rw-r--r--indra/newview/llviewerhelp.h6
-rw-r--r--indra/newview/llviewerinventory.cpp236
-rw-r--r--indra/newview/llviewerinventory.h6
-rw-r--r--indra/newview/llviewerjoint.cpp18
-rw-r--r--indra/newview/llviewerjointmesh.cpp524
-rw-r--r--indra/newview/llviewerjointmesh.h19
-rw-r--r--indra/newview/llviewerjointmesh_sse.cpp114
-rw-r--r--indra/newview/llviewerjointmesh_sse2.cpp121
-rw-r--r--indra/newview/llviewerjointmesh_vec.cpp95
-rw-r--r--indra/newview/llviewerjoystick.cpp13
-rw-r--r--indra/newview/llviewerkeyboard.cpp183
-rw-r--r--indra/newview/llviewerkeyboard.h38
-rw-r--r--indra/newview/llviewermedia.cpp746
-rw-r--r--indra/newview/llviewermedia.h32
-rw-r--r--indra/newview/llviewermediafocus.cpp12
-rw-r--r--indra/newview/llviewermenu.cpp1033
-rw-r--r--indra/newview/llviewermenufile.cpp522
-rw-r--r--indra/newview/llviewermenufile.h118
-rwxr-xr-x[-rw-r--r--]indra/newview/llviewermessage.cpp607
-rw-r--r--indra/newview/llviewermessage.h5
-rw-r--r--indra/newview/llviewernetwork.cpp6
-rw-r--r--indra/newview/llviewerobject.cpp567
-rw-r--r--indra/newview/llviewerobject.h99
-rw-r--r--indra/newview/llviewerobjectlist.cpp644
-rw-r--r--indra/newview/llviewerobjectlist.h32
-rw-r--r--indra/newview/llviewerparcelmedia.cpp24
-rw-r--r--indra/newview/llviewerparcelmgr.cpp189
-rw-r--r--indra/newview/llviewerparcelmgr.h2
-rw-r--r--indra/newview/llviewerparceloverlay.cpp129
-rw-r--r--indra/newview/llviewerparceloverlay.h9
-rw-r--r--indra/newview/llviewerpartsim.cpp4
-rw-r--r--indra/newview/llviewerprecompiledheaders.h8
-rw-r--r--indra/newview/llviewerregion.cpp689
-rw-r--r--indra/newview/llviewerregion.h133
-rw-r--r--indra/newview/llviewershadermgr.cpp1773
-rw-r--r--indra/newview/llviewershadermgr.h186
-rw-r--r--indra/newview/llviewerstats.cpp8
-rw-r--r--indra/newview/llviewerstats.h31
-rw-r--r--indra/newview/llviewerstatsrecorder.cpp258
-rw-r--r--indra/newview/llviewerstatsrecorder.h97
-rw-r--r--indra/newview/llviewertexteditor.cpp49
-rw-r--r--indra/newview/llviewertexteditor.h7
-rw-r--r--indra/newview/llviewertexture.cpp358
-rw-r--r--indra/newview/llviewertexture.h7
-rw-r--r--indra/newview/llviewertexturelist.cpp415
-rw-r--r--indra/newview/llviewertexturelist.h18
-rwxr-xr-x[-rw-r--r--]indra/newview/llviewerwindow.cpp1077
-rw-r--r--indra/newview/llviewerwindow.h69
-rw-r--r--indra/newview/llviewerwindowlistener.cpp5
-rw-r--r--indra/newview/llvlmanager.cpp2
-rw-r--r--indra/newview/llvoavatar.cpp807
-rw-r--r--indra/newview/llvoavatar.h61
-rw-r--r--indra/newview/llvoavatarself.cpp155
-rw-r--r--indra/newview/llvoavatarself.h12
-rw-r--r--indra/newview/llvocache.cpp406
-rw-r--r--indra/newview/llvocache.h15
-rw-r--r--indra/newview/llvoclouds.cpp293
-rw-r--r--indra/newview/llvoclouds.h79
-rw-r--r--indra/newview/llvograss.cpp37
-rw-r--r--indra/newview/llvograss.h2
-rw-r--r--indra/newview/llvoground.cpp9
-rw-r--r--indra/newview/llvoicecallhandler.cpp69
-rw-r--r--indra/newview/llvoicechannel.cpp34
-rw-r--r--indra/newview/llvoicechannel.h7
-rw-r--r--indra/newview/llvoiceclient.cpp138
-rw-r--r--indra/newview/llvoiceclient.h34
-rw-r--r--indra/newview/llvoicevivox.cpp512
-rw-r--r--indra/newview/llvoicevivox.h47
-rw-r--r--indra/newview/llvopartgroup.cpp113
-rw-r--r--indra/newview/llvopartgroup.h4
-rw-r--r--indra/newview/llvosky.cpp186
-rw-r--r--indra/newview/llvosky.h46
-rw-r--r--indra/newview/llvosurfacepatch.cpp121
-rw-r--r--indra/newview/llvosurfacepatch.h9
-rw-r--r--indra/newview/llvotextbubble.cpp253
-rw-r--r--indra/newview/llvotextbubble.h66
-rw-r--r--indra/newview/llvotree.cpp171
-rw-r--r--indra/newview/llvotree.h3
-rw-r--r--indra/newview/llvovolume.cpp1691
-rw-r--r--indra/newview/llvovolume.h69
-rw-r--r--indra/newview/llvowater.cpp50
-rw-r--r--indra/newview/llvowater.h2
-rw-r--r--indra/newview/llvowlsky.cpp36
-rw-r--r--indra/newview/llwatchdog.cpp2
-rw-r--r--indra/newview/llwaterparammanager.cpp309
-rw-r--r--indra/newview/llwaterparammanager.h72
-rw-r--r--indra/newview/llwaterparamset.cpp44
-rw-r--r--indra/newview/llwaterparamset.h1
-rw-r--r--indra/newview/llwearable.cpp24
-rw-r--r--indra/newview/llwearable.h1
-rw-r--r--indra/newview/llwearableitemslist.cpp9
-rw-r--r--indra/newview/llwearableitemslist.h1
-rw-r--r--indra/newview/llwearablelist.cpp2
-rw-r--r--indra/newview/llwearabletype.cpp83
-rw-r--r--indra/newview/llwearabletype.h5
-rw-r--r--indra/newview/llweb.cpp20
-rw-r--r--indra/newview/llweb.h15
-rw-r--r--indra/newview/llwebprofile.cpp305
-rw-r--r--indra/newview/llwebprofile.h69
-rw-r--r--indra/newview/llwind.cpp115
-rw-r--r--indra/newview/llwind.h7
-rw-r--r--indra/newview/llwindowlistener.cpp505
-rw-r--r--indra/newview/llwindowlistener.h57
-rw-r--r--indra/newview/llwlanimator.cpp202
-rw-r--r--indra/newview/llwlanimator.h86
-rw-r--r--indra/newview/llwldaycycle.cpp240
-rw-r--r--indra/newview/llwldaycycle.h54
-rw-r--r--indra/newview/llwlhandlers.cpp197
-rw-r--r--indra/newview/llwlhandlers.h100
-rw-r--r--indra/newview/llwlparammanager.cpp578
-rw-r--r--indra/newview/llwlparammanager.h219
-rw-r--r--indra/newview/llwlparamset.cpp160
-rw-r--r--indra/newview/llwlparamset.h5
-rw-r--r--indra/newview/llworld.cpp544
-rw-r--r--indra/newview/llworld.h5
-rw-r--r--indra/newview/llworldmapmessage.cpp5
-rw-r--r--indra/newview/llworldmapview.cpp43
-rw-r--r--indra/newview/llworldmapview.h4
-rw-r--r--indra/newview/llworldmipmap.cpp3
-rw-r--r--indra/newview/llworldview.cpp61
-rw-r--r--indra/newview/llxmlrpclistener.cpp7
-rw-r--r--indra/newview/llxmlrpctransaction.cpp40
-rw-r--r--indra/newview/pipeline.cpp5009
-rw-r--r--indra/newview/pipeline.h223
-rw-r--r--indra/newview/res-sdl/ll_icon.BMPbin262198 -> 0 bytes
-rw-r--r--indra/newview/res/ll_icon.BMPbin262198 -> 0 bytes
-rw-r--r--indra/newview/res/ll_icon.icobin367958 -> 0 bytes
-rw-r--r--indra/newview/res/ll_icon.pngbin29561 -> 0 bytes
-rw-r--r--indra/newview/res/resource.h1
-rw-r--r--indra/newview/res/toolbuy.curbin4286 -> 4286 bytes
-rw-r--r--indra/newview/res/toolopen.curbin4286 -> 4286 bytes
-rw-r--r--indra/newview/res/toolsit.curbin4286 -> 4286 bytes
-rw-r--r--indra/newview/res/viewerRes.rc10
-rw-r--r--indra/newview/skins/default/colors.xml84
-rw-r--r--indra/newview/skins/default/textures/bottomtray/Cam_Pan_Over.pngbin275 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/CameraView_Press.pngbin489 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/ChatBarHandle.pngbin0 -> 2808 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/PanOrbit_Disabled.pngbin50975 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/PanOrbit_Over.pngbin54713 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/PanOrbit_Press.pngbin51053 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl1_Dark.pngbin0 -> 602 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl2_Dark.pngbin0 -> 669 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl3_Dark.pngbin0 -> 639 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/VoicePTT_Off_Dark.pngbin0 -> 547 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/VoicePTT_On_Dark.pngbin0 -> 526 bytes
-rw-r--r--indra/newview/skins/default/textures/checker.pngbin0 -> 130 bytes
-rw-r--r--indra/newview/skins/default/textures/checkerboard_transparency_bg.pngbin1110 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/circle.tgabin1068 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/containers/Accordion_ArrowClosed_Over.pngbin170 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/containers/Accordion_ArrowOpened_Over.pngbin162 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/containers/TabTop_Left_Over.pngbin337 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/containers/TabTop_Middle_Over.pngbin285 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/containers/TabTop_Right_Over.pngbin362 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/green_checkmark.pngbin0 -> 414 bytes
-rw-r--r--indra/newview/skins/default/textures/icn_label_web.tgabin4140 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/icn_media.tgabin4140 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/icn_voice-groupfocus.tgabin1068 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/icn_voice-localchat.tgabin1068 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/icn_voice-pvtfocus.tgabin1068 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/icon_day_cycle.tgabin25682 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/icon_event_adult.tgabin1006 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/icon_lock.tgabin1030 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/AddItem_Over.pngbin165 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/BackArrow_Over.pngbin214 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/DragHandle.pngbin163 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Edit_Wrench.pngbin3713 -> 3000 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Generic_Object.pngbin366 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Inv_Mesh.pngbin0 -> 3263 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Inv_Physics.pngbin0 -> 539 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/OptionsMenu_Over.pngbin277 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/OutboxPush_Disabled.pngbin0 -> 1848 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/OutboxPush_Off.pngbin0 -> 1835 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/OutboxPush_On.pngbin0 -> 1851 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/OutboxPush_On_Over.pngbin0 -> 1863 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/OutboxPush_Over.pngbin0 -> 1826 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/OutboxPush_Press.pngbin0 -> 1891 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/OutboxPush_Progress_1.pngbin0 -> 1848 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/OutboxPush_Progress_2.pngbin0 -> 1807 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/OutboxPush_Progress_3.pngbin0 -> 1819 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/OutboxPush_Progress_4.pngbin0 -> 1894 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/OutboxPush_Progress_5.pngbin0 -> 1921 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/OutboxPush_Progress_6.pngbin0 -> 1853 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/OutboxPush_Selected.pngbin0 -> 1894 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/OutboxPush_Selected_Disabled.pngbin0 -> 1840 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/OutboxPush_Selected_Over.pngbin0 -> 1870 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/OutboxPush_Selected_Press.pngbin0 -> 1912 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Parcel_Damage_Light_Alt.pngbin285 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Parcel_NoScripts_Light.pngbin620 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Parcel_SeeAVsOff_Dark.pngbin0 -> 3194 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Parcel_SeeAVsOff_Light.pngbin0 -> 3189 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Parcel_SeeAVsOn_Dark.pngbin0 -> 3011 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Parcel_SeeAVsOn_Light.pngbin0 -> 3011 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Sync_Disabled.pngbin0 -> 1187 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Sync_Enabled.pngbin0 -> 1168 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Sync_Progress_1.pngbin0 -> 1149 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Sync_Progress_2.pngbin0 -> 1147 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Sync_Progress_3.pngbin0 -> 1211 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Sync_Progress_4.pngbin0 -> 1205 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Sync_Progress_5.pngbin0 -> 1137 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Sync_Progress_6.pngbin0 -> 1164 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/TrashItem_Over.pngbin201 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Web_Profile_Off.pngbin0 -> 2961 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/check_mark.pngbin0 -> 3166 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/parcel_color_EVRY.pngbin393 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/parcel_color_EXP.pngbin272 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/parcel_color_M.pngbin306 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/image_edit_icon.tgabin3116 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/inv_folder_animation.tgabin1068 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/inv_folder_inbox.tgabin2085 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/map_avatar_above_8.tgabin300 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/map_avatar_below_8.tgabin300 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/map_avatar_unknown_32.tgabin0 -> 4140 bytes
-rw-r--r--indra/newview/skins/default/textures/map_event_adult.tgabin1006 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/map_event_mature.tgabin1068 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/map_track_8.tgabin300 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/model_wizard/progress_bar_bg.pngbin0 -> 3180 bytes
-rw-r--r--indra/newview/skins/default/textures/model_wizard/progress_light.pngbin0 -> 2979 bytes
-rw-r--r--indra/newview/skins/default/textures/mute_icon.tgabin1042 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/navbar/Arrow_Left_Over.pngbin381 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/navbar/Arrow_Right_Over.pngbin379 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/navbar/Help_Over.pngbin348 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/navbar/Home_Over.pngbin330 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/navbar/separator.pngbin0 -> 2826 bytes
-rw-r--r--indra/newview/skins/default/textures/places_rating_adult.tgabin648 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/places_rating_mature.tgabin1068 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/places_rating_pg.tgabin1068 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/propertyline.tgabin2092 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/quick_tips/avatar_free_mode.pngbin1447 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/quick_tips/camera_free_mode.pngbin2267 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/quick_tips/camera_orbit_mode.pngbin2381 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/quick_tips/camera_pan_mode.pngbin2418 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/quick_tips/camera_preset_front_view.pngbin2365 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/quick_tips/camera_preset_group_view.pngbin2595 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/quick_tips/camera_preset_rear_view.pngbin2221 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/quick_tips/move_fly_first.pngbin1528 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/quick_tips/move_fly_second.pngbin2128 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/quick_tips/move_run_first.pngbin1554 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/quick_tips/move_run_second.pngbin2534 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/quick_tips/move_walk_first.pngbin2106 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/quick_tips/move_walk_second.pngbin3108 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/red_x.pngbin0 -> 624 bytes
-rw-r--r--indra/newview/skins/default/textures/show_btn.tgabin3884 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/show_btn_selected.tgabin3884 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/smicon_warn.tgabin1068 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/snapshot_download.pngbin0 -> 1226 bytes
-rw-r--r--indra/newview/skins/default/textures/snapshot_email.pngbin0 -> 1231 bytes
-rw-r--r--indra/newview/skins/default/textures/spacer35.tgabin3404 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/square_btn_32x128.tgabin6292 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/square_btn_selected_32x128.tgabin6983 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/startup_logo.j2cbin69118 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/status_busy.tgabin4140 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/taskpanel/TabIcon_Appearance_Off.pngbin273 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/taskpanel/TabIcon_Appearance_Selected.pngbin349 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/taskpanel/TabIcon_Home_Off.pngbin749 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/taskpanel/TabIcon_Me_Selected.pngbin359 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/taskpanel/TabIcon_People_Selected.pngbin536 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/taskpanel/TabIcon_Places_Large.pngbin709 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/taskpanel/TabIcon_Places_Selected.pngbin653 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/taskpanel/TabIcon_Things_Selected.pngbin297 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/textures.xml140
-rw-r--r--indra/newview/skins/default/textures/toolbar_icons/appearance.pngbin0 -> 1205 bytes
-rw-r--r--indra/newview/skins/default/textures/toolbar_icons/avatars.pngbin0 -> 1432 bytes
-rw-r--r--indra/newview/skins/default/textures/toolbar_icons/build.pngbin0 -> 1246 bytes
-rw-r--r--indra/newview/skins/default/textures/toolbar_icons/caret_bottom.pngbin0 -> 195 bytes
-rw-r--r--indra/newview/skins/default/textures/toolbar_icons/caret_left.pngbin0 -> 948 bytes
-rw-r--r--indra/newview/skins/default/textures/toolbar_icons/caret_right.pngbin0 -> 949 bytes
-rw-r--r--indra/newview/skins/default/textures/toolbar_icons/chat.pngbin0 -> 1277 bytes
-rw-r--r--indra/newview/skins/default/textures/toolbar_icons/destinations.pngbin0 -> 1297 bytes
-rw-r--r--indra/newview/skins/default/textures/toolbar_icons/gestures.pngbin0 -> 1675 bytes
-rw-r--r--indra/newview/skins/default/textures/toolbar_icons/howto.pngbin0 -> 1306 bytes
-rw-r--r--indra/newview/skins/default/textures/toolbar_icons/inventory.pngbin0 -> 1114 bytes
-rw-r--r--indra/newview/skins/default/textures/toolbar_icons/land.pngbin0 -> 1123 bytes
-rw-r--r--indra/newview/skins/default/textures/toolbar_icons/map.pngbin0 -> 1206 bytes
-rw-r--r--indra/newview/skins/default/textures/toolbar_icons/marketplace.pngbin0 -> 1311 bytes
-rw-r--r--indra/newview/skins/default/textures/toolbar_icons/mini_cart.pngbin0 -> 2987 bytes
-rw-r--r--indra/newview/skins/default/textures/toolbar_icons/mini_map.pngbin0 -> 1766 bytes
-rw-r--r--indra/newview/skins/default/textures/toolbar_icons/move.pngbin0 -> 1328 bytes
-rw-r--r--indra/newview/skins/default/textures/toolbar_icons/nearbyvoice.pngbin0 -> 1479 bytes
-rw-r--r--indra/newview/skins/default/textures/toolbar_icons/outbox.pngbin0 -> 1521 bytes
-rw-r--r--indra/newview/skins/default/textures/toolbar_icons/people.pngbin0 -> 1313 bytes
-rw-r--r--indra/newview/skins/default/textures/toolbar_icons/picks.pngbin0 -> 1396 bytes
-rw-r--r--indra/newview/skins/default/textures/toolbar_icons/places.pngbin0 -> 1391 bytes
-rw-r--r--indra/newview/skins/default/textures/toolbar_icons/preferences.pngbin0 -> 1587 bytes
-rw-r--r--indra/newview/skins/default/textures/toolbar_icons/profile.pngbin0 -> 1180 bytes
-rw-r--r--indra/newview/skins/default/textures/toolbar_icons/search.pngbin0 -> 1406 bytes
-rw-r--r--indra/newview/skins/default/textures/toolbar_icons/snapshot.pngbin0 -> 1142 bytes
-rw-r--r--indra/newview/skins/default/textures/toolbar_icons/speak.pngbin0 -> 1253 bytes
-rw-r--r--indra/newview/skins/default/textures/toolbar_icons/view.pngbin0 -> 1487 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/Badge_Background.pngbin0 -> 1352 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/Badge_Border.pngbin0 -> 1565 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Left_Disabled.pngbin0 -> 3576 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Left_Off.pngbin0 -> 4309 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Left_Over.pngbin0 -> 4272 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Left_Press.pngbin0 -> 4278 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Middle_Disabled.pngbin0 -> 3425 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Middle_Off.pngbin0 -> 4151 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Middle_Over.pngbin0 -> 4137 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Middle_Press.pngbin0 -> 4200 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Right_Disabled.pngbin0 -> 3169 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Right_Off.pngbin0 -> 3845 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Right_Over.pngbin0 -> 3867 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Right_Press.pngbin0 -> 3915 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/Checkbox_On_Over.pngbin547 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/Checkbox_Over.pngbin318 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/ComboButton_Up_On_Selected.pngbin482 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/DisclosureArrow_Closed_Over.pngbin164 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/DisclosureArrow_Opened_Over.pngbin165 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/Error_Tag_Background.pngbin0 -> 1354 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/MarketplaceBtn_Off.pngbin0 -> 1067 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/MarketplaceBtn_Selected.pngbin0 -> 1086 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/New_Tag_Background.pngbin0 -> 957 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/New_Tag_Border.pngbin0 -> 969 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/ProgressBar.pngbin220 -> 316 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/PushButton_On_Over.pngbin498 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/PushButton_Selected_Over.pngbin498 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/RadioButton_On_Over.pngbin635 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/RadioButton_Over.pngbin575 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/ScrollArrow_Down_Over.pngbin257 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/ScrollArrow_Left_Over.pngbin295 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/ScrollArrow_Right_Over.pngbin283 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/ScrollArrow_Up_Over.pngbin276 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/ScrollThumb_Horiz_Over.pngbin311 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/ScrollThumb_Vert_Over.pngbin311 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On.pngbin404 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On_Disabled.pngbin404 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On_Over.pngbin394 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On_Selected.pngbin495 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_On.pngbin308 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_On_Over.pngbin300 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_On_Press.pngbin393 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Over.pngbin286 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected_Over.pngbin300 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_On.pngbin420 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_On_Over.pngbin416 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Selected_Over.pngbin416 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/SliderThumb_Over.pngbin482 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/Stepper_Down_Over.pngbin310 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/Stepper_Up_Over.pngbin314 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/windows/Flyout.pngbin820 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/windows/Flyout_Left.pngbin0 -> 271 bytes
-rw-r--r--indra/newview/skins/default/textures/windows/Flyout_Pointer_Up.pngbin260 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/windows/Flyout_Right.pngbin0 -> 280 bytes
-rw-r--r--indra/newview/skins/default/textures/windows/Icon_Gear_Over.pngbin293 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/windows/Icon_Undock_Press.pngbin267 -> 0 bytes
-rw-r--r--indra/newview/skins/default/textures/world/CameraDragDot.pngbin0 -> 3101 bytes
-rw-r--r--indra/newview/skins/default/xui/da/floater_about.xml42
-rw-r--r--indra/newview/skins/default/xui/da/floater_about_land.xml18
-rw-r--r--indra/newview/skins/default/xui/da/floater_beacons.xml1
-rw-r--r--indra/newview/skins/default/xui/da/floater_buy_contents.xml2
-rw-r--r--indra/newview/skins/default/xui/da/floater_buy_currency.xml5
-rw-r--r--indra/newview/skins/default/xui/da/floater_camera.xml9
-rw-r--r--indra/newview/skins/default/xui/da/floater_day_cycle_options.xml96
-rw-r--r--indra/newview/skins/default/xui/da/floater_env_settings.xml28
-rw-r--r--indra/newview/skins/default/xui/da/floater_hardware_settings.xml3
-rw-r--r--indra/newview/skins/default/xui/da/floater_import_collada.xml23
-rw-r--r--indra/newview/skins/default/xui/da/floater_inventory_item_properties.xml6
-rw-r--r--indra/newview/skins/default/xui/da/floater_inventory_view_finder.xml39
-rw-r--r--indra/newview/skins/default/xui/da/floater_map.xml3
-rw-r--r--indra/newview/skins/default/xui/da/floater_model_preview.xml231
-rw-r--r--indra/newview/skins/default/xui/da/floater_nearby_chat.xml2
-rw-r--r--indra/newview/skins/default/xui/da/floater_preferences.xml4
-rw-r--r--indra/newview/skins/default/xui/da/floater_price_for_listing.xml18
-rw-r--r--indra/newview/skins/default/xui/da/floater_region_debug_console.xml2
-rw-r--r--indra/newview/skins/default/xui/da/floater_settings_debug.xml4
-rw-r--r--indra/newview/skins/default/xui/da/floater_sound_devices.xml7
-rw-r--r--indra/newview/skins/default/xui/da/floater_tools.xml56
-rw-r--r--indra/newview/skins/default/xui/da/floater_tos.xml2
-rw-r--r--indra/newview/skins/default/xui/da/floater_water.xml103
-rw-r--r--indra/newview/skins/default/xui/da/floater_web_content.xml14
-rw-r--r--indra/newview/skins/default/xui/da/floater_windlight_options.xml228
-rw-r--r--indra/newview/skins/default/xui/da/inspect_avatar.xml2
-rw-r--r--indra/newview/skins/default/xui/da/language_settings.xml1
-rw-r--r--indra/newview/skins/default/xui/da/menu_attachment_self.xml2
-rw-r--r--indra/newview/skins/default/xui/da/menu_avatar_self.xml3
-rw-r--r--indra/newview/skins/default/xui/da/menu_bottomtray.xml2
-rw-r--r--indra/newview/skins/default/xui/da/menu_inspect_avatar_gear.xml6
-rw-r--r--indra/newview/skins/default/xui/da/menu_inspect_self_gear.xml39
-rw-r--r--indra/newview/skins/default/xui/da/menu_inventory.xml1
-rw-r--r--indra/newview/skins/default/xui/da/menu_inventory_add.xml3
-rw-r--r--indra/newview/skins/default/xui/da/menu_inventory_gear_default.xml10
-rw-r--r--indra/newview/skins/default/xui/da/menu_login.xml3
-rw-r--r--indra/newview/skins/default/xui/da/menu_media_ctrl.xml6
-rw-r--r--indra/newview/skins/default/xui/da/menu_mini_map.xml1
-rw-r--r--indra/newview/skins/default/xui/da/menu_model_import_gear_default.xml8
-rw-r--r--indra/newview/skins/default/xui/da/menu_object.xml4
-rw-r--r--indra/newview/skins/default/xui/da/menu_outfit_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/da/menu_places_gear_folder.xml5
-rw-r--r--indra/newview/skins/default/xui/da/menu_places_gear_landmark.xml5
-rw-r--r--indra/newview/skins/default/xui/da/menu_viewer.xml119
-rw-r--r--indra/newview/skins/default/xui/da/notifications.xml213
-rw-r--r--indra/newview/skins/default/xui/da/panel_avatar_list_item.xml2
-rw-r--r--indra/newview/skins/default/xui/da/panel_edit_alpha.xml16
-rw-r--r--indra/newview/skins/default/xui/da/panel_edit_gloves.xml2
-rw-r--r--indra/newview/skins/default/xui/da/panel_edit_jacket.xml4
-rw-r--r--indra/newview/skins/default/xui/da/panel_edit_pants.xml2
-rw-r--r--indra/newview/skins/default/xui/da/panel_edit_physics.xml14
-rw-r--r--indra/newview/skins/default/xui/da/panel_edit_pick.xml2
-rw-r--r--indra/newview/skins/default/xui/da/panel_edit_profile.xml4
-rw-r--r--indra/newview/skins/default/xui/da/panel_edit_shirt.xml2
-rw-r--r--indra/newview/skins/default/xui/da/panel_edit_shoes.xml2
-rw-r--r--indra/newview/skins/default/xui/da/panel_edit_skirt.xml2
-rw-r--r--indra/newview/skins/default/xui/da/panel_edit_socks.xml2
-rw-r--r--indra/newview/skins/default/xui/da/panel_edit_underpants.xml2
-rw-r--r--indra/newview/skins/default/xui/da/panel_edit_undershirt.xml2
-rw-r--r--indra/newview/skins/default/xui/da/panel_edit_wearable.xml6
-rw-r--r--indra/newview/skins/default/xui/da/panel_login.xml12
-rw-r--r--indra/newview/skins/default/xui/da/panel_media_settings_security.xml3
-rw-r--r--indra/newview/skins/default/xui/da/panel_my_profile.xml34
-rw-r--r--indra/newview/skins/default/xui/da/panel_nearby_media.xml2
-rw-r--r--indra/newview/skins/default/xui/da/panel_notes.xml35
-rw-r--r--indra/newview/skins/default/xui/da/panel_notify_textbox.xml11
-rw-r--r--indra/newview/skins/default/xui/da/panel_people.xml38
-rw-r--r--indra/newview/skins/default/xui/da/panel_places.xml4
-rw-r--r--indra/newview/skins/default/xui/da/panel_preferences_advanced.xml29
-rw-r--r--indra/newview/skins/default/xui/da/panel_preferences_chat.xml50
-rw-r--r--indra/newview/skins/default/xui/da/panel_preferences_colors.xml44
-rw-r--r--indra/newview/skins/default/xui/da/panel_preferences_general.xml12
-rw-r--r--indra/newview/skins/default/xui/da/panel_preferences_graphics1.xml19
-rw-r--r--indra/newview/skins/default/xui/da/panel_preferences_move.xml24
-rw-r--r--indra/newview/skins/default/xui/da/panel_preferences_privacy.xml11
-rw-r--r--indra/newview/skins/default/xui/da/panel_preferences_setup.xml14
-rw-r--r--indra/newview/skins/default/xui/da/panel_preferences_sound.xml15
-rw-r--r--indra/newview/skins/default/xui/da/panel_profile.xml53
-rw-r--r--indra/newview/skins/default/xui/da/panel_profile_view.xml22
-rw-r--r--indra/newview/skins/default/xui/da/panel_region_general.xml1
-rw-r--r--indra/newview/skins/default/xui/da/panel_script_ed.xml14
-rw-r--r--indra/newview/skins/default/xui/da/panel_scrolling_param_base.xml4
-rw-r--r--indra/newview/skins/default/xui/da/panel_sound_devices.xml19
-rw-r--r--indra/newview/skins/default/xui/da/panel_status_bar.xml2
-rw-r--r--indra/newview/skins/default/xui/da/sidepanel_task_info.xml6
-rw-r--r--indra/newview/skins/default/xui/da/strings.xml666
-rw-r--r--indra/newview/skins/default/xui/da/teleport_strings.xml4
-rw-r--r--indra/newview/skins/default/xui/de/floater_about.xml77
-rw-r--r--indra/newview/skins/default/xui/de/floater_about_land.xml85
-rw-r--r--indra/newview/skins/default/xui/de/floater_animation_anim_preview.xml11
-rw-r--r--indra/newview/skins/default/xui/de/floater_animation_bvh_preview.xml186
-rw-r--r--indra/newview/skins/default/xui/de/floater_avatar.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_beacons.xml1
-rw-r--r--indra/newview/skins/default/xui/de/floater_build_options.xml27
-rw-r--r--indra/newview/skins/default/xui/de/floater_buy_contents.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_buy_currency.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_buy_land.xml29
-rw-r--r--indra/newview/skins/default/xui/de/floater_camera.xml11
-rw-r--r--indra/newview/skins/default/xui/de/floater_chat_bar.xml7
-rw-r--r--indra/newview/skins/default/xui/de/floater_customize.xml529
-rw-r--r--indra/newview/skins/default/xui/de/floater_day_cycle_options.xml94
-rw-r--r--indra/newview/skins/default/xui/de/floater_delete_env_preset.xml35
-rw-r--r--indra/newview/skins/default/xui/de/floater_destinations.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_edit_day_cycle.xml104
-rw-r--r--indra/newview/skins/default/xui/de/floater_edit_sky_preset.xml143
-rw-r--r--indra/newview/skins/default/xui/de/floater_edit_water_preset.xml72
-rw-r--r--indra/newview/skins/default/xui/de/floater_env_settings.xml26
-rw-r--r--indra/newview/skins/default/xui/de/floater_environment_settings.xml36
-rw-r--r--indra/newview/skins/default/xui/de/floater_fast_timers.xml10
-rw-r--r--indra/newview/skins/default/xui/de/floater_hardware_settings.xml5
-rw-r--r--indra/newview/skins/default/xui/de/floater_how_to.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_import_collada.xml23
-rw-r--r--indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml6
-rw-r--r--indra/newview/skins/default/xui/de/floater_inventory_view_finder.xml1
-rw-r--r--indra/newview/skins/default/xui/de/floater_map.xml31
-rw-r--r--indra/newview/skins/default/xui/de/floater_merchant_outbox.xml27
-rw-r--r--indra/newview/skins/default/xui/de/floater_model_preview.xml277
-rw-r--r--indra/newview/skins/default/xui/de/floater_moveview.xml6
-rw-r--r--indra/newview/skins/default/xui/de/floater_my_appearance.xml4
-rw-r--r--indra/newview/skins/default/xui/de/floater_my_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_nearby_chat.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_object_weights.xml28
-rw-r--r--indra/newview/skins/default/xui/de/floater_outfit_save_as.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_people.xml7
-rw-r--r--indra/newview/skins/default/xui/de/floater_perm_prefs.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_picks.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_places.xml4
-rw-r--r--indra/newview/skins/default/xui/de/floater_postcard.xml16
-rw-r--r--indra/newview/skins/default/xui/de/floater_preferences.xml4
-rw-r--r--indra/newview/skins/default/xui/de/floater_preferences_proxy.xml40
-rw-r--r--indra/newview/skins/default/xui/de/floater_preview_animation.xml4
-rw-r--r--indra/newview/skins/default/xui/de/floater_preview_gesture.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_price_for_listing.xml18
-rw-r--r--indra/newview/skins/default/xui/de/floater_region_debug_console.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_script_search.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_search.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_sell_land.xml18
-rw-r--r--indra/newview/skins/default/xui/de/floater_snapshot.xml122
-rw-r--r--indra/newview/skins/default/xui/de/floater_sound_devices.xml7
-rw-r--r--indra/newview/skins/default/xui/de/floater_stats.xml14
-rw-r--r--indra/newview/skins/default/xui/de/floater_test_layout_stacks.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_test_text_vertical_aligment.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_tools.xml99
-rw-r--r--indra/newview/skins/default/xui/de/floater_top_objects.xml23
-rw-r--r--indra/newview/skins/default/xui/de/floater_tos.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_toybox.xml11
-rw-r--r--indra/newview/skins/default/xui/de/floater_translation_settings.xml58
-rw-r--r--indra/newview/skins/default/xui/de/floater_voice_controls.xml10
-rw-r--r--indra/newview/skins/default/xui/de/floater_voice_effect.xml129
-rw-r--r--indra/newview/skins/default/xui/de/floater_water.xml71
-rw-r--r--indra/newview/skins/default/xui/de/floater_wearable_save_as.xml11
-rw-r--r--indra/newview/skins/default/xui/de/floater_web_content.xml14
-rw-r--r--indra/newview/skins/default/xui/de/floater_windlight_options.xml189
-rw-r--r--indra/newview/skins/default/xui/de/inspect_avatar.xml3
-rw-r--r--indra/newview/skins/default/xui/de/inspect_group.xml5
-rw-r--r--indra/newview/skins/default/xui/de/language_settings.xml1
-rw-r--r--indra/newview/skins/default/xui/de/menu_attachment_self.xml2
-rw-r--r--indra/newview/skins/default/xui/de/menu_avatar_self.xml3
-rw-r--r--indra/newview/skins/default/xui/de/menu_bottomtray.xml4
-rw-r--r--indra/newview/skins/default/xui/de/menu_hide_navbar.xml2
-rw-r--r--indra/newview/skins/default/xui/de/menu_inspect_avatar_gear.xml6
-rw-r--r--indra/newview/skins/default/xui/de/menu_inspect_object_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/de/menu_inspect_self_gear.xml39
-rw-r--r--indra/newview/skins/default/xui/de/menu_inventory.xml4
-rw-r--r--indra/newview/skins/default/xui/de/menu_inventory_add.xml3
-rw-r--r--indra/newview/skins/default/xui/de/menu_inventory_gear_default.xml10
-rw-r--r--indra/newview/skins/default/xui/de/menu_login.xml5
-rw-r--r--indra/newview/skins/default/xui/de/menu_media_ctrl.xml7
-rw-r--r--indra/newview/skins/default/xui/de/menu_mini_map.xml1
-rw-r--r--indra/newview/skins/default/xui/de/menu_mode_change.xml5
-rw-r--r--indra/newview/skins/default/xui/de/menu_model_import_gear_default.xml8
-rw-r--r--indra/newview/skins/default/xui/de/menu_object.xml4
-rw-r--r--indra/newview/skins/default/xui/de/menu_outfit_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/de/menu_people_nearby_view_sort.xml5
-rw-r--r--indra/newview/skins/default/xui/de/menu_places_gear_folder.xml5
-rw-r--r--indra/newview/skins/default/xui/de/menu_places_gear_landmark.xml5
-rw-r--r--indra/newview/skins/default/xui/de/menu_toolbars.xml7
-rw-r--r--indra/newview/skins/default/xui/de/menu_viewer.xml213
-rw-r--r--indra/newview/skins/default/xui/de/menu_wearing_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/de/notifications.xml442
-rw-r--r--indra/newview/skins/default/xui/de/panel_activeim_row.xml6
-rw-r--r--indra/newview/skins/default/xui/de/panel_avatar_list_item.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_chat_header.xml1
-rw-r--r--indra/newview/skins/default/xui/de/panel_chiclet_bar.xml15
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_alpha.xml16
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_gloves.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_jacket.xml4
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_pants.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_physics.xml14
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_pick.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_profile.xml4
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_shirt.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_shoes.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_skin.xml6
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_skirt.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_socks.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_underpants.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_undershirt.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_wearable.xml6
-rw-r--r--indra/newview/skins/default/xui/de/panel_friends.xml31
-rw-r--r--indra/newview/skins/default/xui/de/panel_group_invite.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_group_notices.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_instant_message.xml1
-rw-r--r--indra/newview/skins/default/xui/de/panel_login.xml9
-rw-r--r--indra/newview/skins/default/xui/de/panel_me.xml5
-rw-r--r--indra/newview/skins/default/xui/de/panel_my_profile.xml49
-rw-r--r--indra/newview/skins/default/xui/de/panel_navigation_bar.xml35
-rw-r--r--indra/newview/skins/default/xui/de/panel_nearby_chat.xml8
-rw-r--r--indra/newview/skins/default/xui/de/panel_nearby_media.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_notes.xml35
-rw-r--r--indra/newview/skins/default/xui/de/panel_notify_textbox.xml11
-rw-r--r--indra/newview/skins/default/xui/de/panel_outbox_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_outfit_edit.xml4
-rw-r--r--indra/newview/skins/default/xui/de/panel_outfits_list.xml6
-rw-r--r--indra/newview/skins/default/xui/de/panel_people.xml24
-rw-r--r--indra/newview/skins/default/xui/de/panel_place_profile.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_places.xml4
-rw-r--r--indra/newview/skins/default/xui/de/panel_postcard_message.xml21
-rw-r--r--indra/newview/skins/default/xui/de/panel_postcard_settings.xml23
-rw-r--r--indra/newview/skins/default/xui/de/panel_preferences_advanced.xml40
-rw-r--r--indra/newview/skins/default/xui/de/panel_preferences_chat.xml67
-rw-r--r--indra/newview/skins/default/xui/de/panel_preferences_colors.xml44
-rw-r--r--indra/newview/skins/default/xui/de/panel_preferences_general.xml15
-rw-r--r--indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml21
-rw-r--r--indra/newview/skins/default/xui/de/panel_preferences_move.xml39
-rw-r--r--indra/newview/skins/default/xui/de/panel_preferences_privacy.xml11
-rw-r--r--indra/newview/skins/default/xui/de/panel_preferences_setup.xml35
-rw-r--r--indra/newview/skins/default/xui/de/panel_preferences_sound.xml41
-rw-r--r--indra/newview/skins/default/xui/de/panel_profile.xml68
-rw-r--r--indra/newview/skins/default/xui/de/panel_profile_view.xml22
-rw-r--r--indra/newview/skins/default/xui/de/panel_region_environment.xml33
-rw-r--r--indra/newview/skins/default/xui/de/panel_region_estate.xml6
-rw-r--r--indra/newview/skins/default/xui/de/panel_region_general.xml1
-rw-r--r--indra/newview/skins/default/xui/de/panel_region_terrain.xml74
-rw-r--r--indra/newview/skins/default/xui/de/panel_script_ed.xml16
-rw-r--r--indra/newview/skins/default/xui/de/panel_scrolling_param_base.xml4
-rw-r--r--indra/newview/skins/default/xui/de/panel_snapshot_inventory.xml21
-rw-r--r--indra/newview/skins/default/xui/de/panel_snapshot_local.xml39
-rw-r--r--indra/newview/skins/default/xui/de/panel_snapshot_options.xml7
-rw-r--r--indra/newview/skins/default/xui/de/panel_snapshot_postcard.xml17
-rw-r--r--indra/newview/skins/default/xui/de/panel_snapshot_profile.xml28
-rw-r--r--indra/newview/skins/default/xui/de/panel_sound_devices.xml25
-rw-r--r--indra/newview/skins/default/xui/de/panel_status_bar.xml11
-rw-r--r--indra/newview/skins/default/xui/de/sidepanel_inventory.xml21
-rw-r--r--indra/newview/skins/default/xui/de/sidepanel_task_info.xml6
-rw-r--r--indra/newview/skins/default/xui/de/strings.xml1104
-rw-r--r--indra/newview/skins/default/xui/de/teleport_strings.xml4
-rw-r--r--indra/newview/skins/default/xui/en/floater_aaa.xml158
-rw-r--r--indra/newview/skins/default/xui/en/floater_about.xml133
-rw-r--r--indra/newview/skins/default/xui/en/floater_about_land.xml284
-rw-r--r--indra/newview/skins/default/xui/en/floater_activeim.xml3
-rw-r--r--indra/newview/skins/default/xui/en/floater_animation_anim_preview.xml76
-rw-r--r--indra/newview/skins/default/xui/en/floater_animation_bvh_preview.xml (renamed from indra/newview/skins/default/xui/en/floater_animation_preview.xml)0
-rw-r--r--indra/newview/skins/default/xui/en/floater_avatar.xml27
-rw-r--r--indra/newview/skins/default/xui/en/floater_avatar_picker.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_beacons.xml14
-rw-r--r--indra/newview/skins/default/xui/en/floater_build_options.xml15
-rw-r--r--indra/newview/skins/default/xui/en/floater_buy_contents.xml4
-rw-r--r--indra/newview/skins/default/xui/en/floater_buy_currency.xml18
-rw-r--r--indra/newview/skins/default/xui/en/floater_buy_currency_html.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_buy_land.xml28
-rw-r--r--indra/newview/skins/default/xui/en/floater_buy_object.xml4
-rw-r--r--indra/newview/skins/default/xui/en/floater_camera.xml29
-rw-r--r--indra/newview/skins/default/xui/en/floater_chat_bar.xml84
-rw-r--r--indra/newview/skins/default/xui/en/floater_choose_group.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_color_picker.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_critical.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_day_cycle_options.xml558
-rw-r--r--indra/newview/skins/default/xui/en/floater_delete_env_preset.xml59
-rw-r--r--indra/newview/skins/default/xui/en/floater_destinations.xml28
-rw-r--r--indra/newview/skins/default/xui/en/floater_edit_day_cycle.xml485
-rw-r--r--indra/newview/skins/default/xui/en/floater_edit_sky_preset.xml953
-rw-r--r--indra/newview/skins/default/xui/en/floater_edit_water_preset.xml448
-rw-r--r--indra/newview/skins/default/xui/en/floater_env_settings.xml163
-rw-r--r--indra/newview/skins/default/xui/en/floater_environment_settings.xml162
-rw-r--r--indra/newview/skins/default/xui/en/floater_event.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_fast_timers.xml27
-rw-r--r--indra/newview/skins/default/xui/en/floater_gesture.xml3
-rw-r--r--indra/newview/skins/default/xui/en/floater_hardware_settings.xml6
-rw-r--r--indra/newview/skins/default/xui/en/floater_help_browser.xml5
-rw-r--r--indra/newview/skins/default/xui/en/floater_how_to.xml18
-rw-r--r--indra/newview/skins/default/xui/en/floater_hud.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_im_session.xml11
-rw-r--r--indra/newview/skins/default/xui/en/floater_image_preview.xml6
-rw-r--r--indra/newview/skins/default/xui/en/floater_import_collada.xml42
-rw-r--r--indra/newview/skins/default/xui/en/floater_inventory.xml28
-rw-r--r--indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml7
-rw-r--r--indra/newview/skins/default/xui/en/floater_inventory_view_finder.xml29
-rw-r--r--indra/newview/skins/default/xui/en/floater_joystick.xml50
-rw-r--r--indra/newview/skins/default/xui/en/floater_land_holdings.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_live_lsleditor.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_lsl_guide.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_map.xml39
-rw-r--r--indra/newview/skins/default/xui/en/floater_media_browser.xml9
-rw-r--r--indra/newview/skins/default/xui/en/floater_media_settings.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_mem_leaking.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_merchant_outbox.xml152
-rw-r--r--indra/newview/skins/default/xui/en/floater_model_preview.xml1430
-rw-r--r--indra/newview/skins/default/xui/en/floater_moveview.xml12
-rw-r--r--indra/newview/skins/default/xui/en/floater_my_appearance.xml25
-rw-r--r--indra/newview/skins/default/xui/en/floater_my_inventory.xml22
-rw-r--r--indra/newview/skins/default/xui/en/floater_my_web_profile.xml9
-rw-r--r--indra/newview/skins/default/xui/en/floater_nearby_chat.xml53
-rw-r--r--indra/newview/skins/default/xui/en/floater_object_weights.xml342
-rw-r--r--indra/newview/skins/default/xui/en/floater_openobject.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_outfit_save_as.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_outgoing_call.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_people.xml41
-rw-r--r--indra/newview/skins/default/xui/en/floater_picks.xml21
-rw-r--r--indra/newview/skins/default/xui/en/floater_places.xml24
-rw-r--r--indra/newview/skins/default/xui/en/floater_postcard.xml149
-rw-r--r--indra/newview/skins/default/xui/en/floater_preferences.xml9
-rw-r--r--indra/newview/skins/default/xui/en/floater_preferences_proxy.xml275
-rw-r--r--indra/newview/skins/default/xui/en/floater_preview_animation.xml17
-rw-r--r--indra/newview/skins/default/xui/en/floater_preview_gesture.xml19
-rw-r--r--indra/newview/skins/default/xui/en/floater_preview_notecard.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_preview_sound.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_preview_texture.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_price_for_listing.xml81
-rw-r--r--indra/newview/skins/default/xui/en/floater_publish_classified.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_region_debug_console.xml3
-rw-r--r--indra/newview/skins/default/xui/en/floater_region_info.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_script.xml3
-rw-r--r--indra/newview/skins/default/xui/en/floater_script_debug_panel.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_script_preview.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_script_queue.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_search.xml85
-rw-r--r--indra/newview/skins/default/xui/en/floater_sell_land.xml33
-rw-r--r--indra/newview/skins/default/xui/en/floater_snapshot.xml730
-rw-r--r--indra/newview/skins/default/xui/en/floater_sound_devices.xml48
-rw-r--r--indra/newview/skins/default/xui/en/floater_stats.xml340
-rw-r--r--indra/newview/skins/default/xui/en/floater_sys_well.xml4
-rw-r--r--indra/newview/skins/default/xui/en/floater_telehub.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_test_button.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_test_layout_stacks.xml226
-rw-r--r--indra/newview/skins/default/xui/en/floater_test_text_editor.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_test_text_vertical_aligment.xml112
-rw-r--r--indra/newview/skins/default/xui/en/floater_test_textbox.xml16
-rw-r--r--indra/newview/skins/default/xui/en/floater_test_toolbar.xml62
-rw-r--r--indra/newview/skins/default/xui/en/floater_test_widgets.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_texture_ctrl.xml192
-rw-r--r--indra/newview/skins/default/xui/en/floater_tools.xml491
-rw-r--r--indra/newview/skins/default/xui/en/floater_top_objects.xml12
-rw-r--r--indra/newview/skins/default/xui/en/floater_toybox.xml114
-rw-r--r--indra/newview/skins/default/xui/en/floater_translation_settings.xml244
-rw-r--r--indra/newview/skins/default/xui/en/floater_ui_preview.xml6
-rw-r--r--indra/newview/skins/default/xui/en/floater_voice_controls.xml24
-rw-r--r--indra/newview/skins/default/xui/en/floater_voice_effect.xml48
-rw-r--r--indra/newview/skins/default/xui/en/floater_water.xml503
-rw-r--r--indra/newview/skins/default/xui/en/floater_web_content.xml198
-rw-r--r--indra/newview/skins/default/xui/en/floater_web_profile.xml6
-rw-r--r--indra/newview/skins/default/xui/en/floater_windlight_options.xml1287
-rw-r--r--indra/newview/skins/default/xui/en/floater_window_size.xml60
-rw-r--r--indra/newview/skins/default/xui/en/floater_world_map.xml4
-rw-r--r--indra/newview/skins/default/xui/en/inspect_avatar.xml12
-rw-r--r--indra/newview/skins/default/xui/en/inspect_group.xml3
-rw-r--r--indra/newview/skins/default/xui/en/inspect_object.xml30
-rw-r--r--indra/newview/skins/default/xui/en/inspect_remote_object.xml2
-rw-r--r--indra/newview/skins/default/xui/en/language_settings.xml1
-rw-r--r--indra/newview/skins/default/xui/en/main_view.xml198
-rw-r--r--indra/newview/skins/default/xui/en/menu_attachment_self.xml2
-rw-r--r--indra/newview/skins/default/xui/en/menu_avatar_self.xml14
-rw-r--r--indra/newview/skins/default/xui/en/menu_bottomtray.xml152
-rw-r--r--indra/newview/skins/default/xui/en/menu_edit.xml3
-rw-r--r--indra/newview/skins/default/xui/en/menu_hide_navbar.xml13
-rw-r--r--indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml20
-rw-r--r--indra/newview/skins/default/xui/en/menu_inspect_object_gear.xml9
-rw-r--r--indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml240
-rw-r--r--indra/newview/skins/default/xui/en/menu_inventory.xml37
-rw-r--r--indra/newview/skins/default/xui/en/menu_inventory_add.xml21
-rw-r--r--indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml11
-rw-r--r--indra/newview/skins/default/xui/en/menu_login.xml78
-rw-r--r--indra/newview/skins/default/xui/en/menu_media_ctrl.xml43
-rw-r--r--indra/newview/skins/default/xui/en/menu_mini_map.xml11
-rw-r--r--indra/newview/skins/default/xui/en/menu_model_import_gear_default.xml79
-rw-r--r--indra/newview/skins/default/xui/en/menu_object.xml20
-rw-r--r--indra/newview/skins/default/xui/en/menu_outfit_gear.xml8
-rw-r--r--indra/newview/skins/default/xui/en/menu_people_friends_view_sort.xml2
-rw-r--r--indra/newview/skins/default/xui/en/menu_people_nearby_view_sort.xml10
-rw-r--r--indra/newview/skins/default/xui/en/menu_people_recent_view_sort.xml2
-rw-r--r--indra/newview/skins/default/xui/en/menu_place.xml22
-rw-r--r--indra/newview/skins/default/xui/en/menu_places_gear_folder.xml8
-rw-r--r--indra/newview/skins/default/xui/en/menu_places_gear_landmark.xml8
-rw-r--r--indra/newview/skins/default/xui/en/menu_text_editor.xml15
-rw-r--r--indra/newview/skins/default/xui/en/menu_toolbars.xml35
-rw-r--r--indra/newview/skins/default/xui/en/menu_viewer.xml1150
-rw-r--r--indra/newview/skins/default/xui/en/menu_wearing_gear.xml7
-rw-r--r--indra/newview/skins/default/xui/en/notification_visibility.xml6
-rw-r--r--indra/newview/skins/default/xui/en/notifications.xml1812
-rw-r--r--indra/newview/skins/default/xui/en/outfit_accordion_tab.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_activeim_row.xml4
-rw-r--r--indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml12
-rw-r--r--indra/newview/skins/default/xui/en/panel_avatar_list_item.xml3
-rw-r--r--indra/newview/skins/default/xui/en/panel_block_list_sidetray.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_bottomtray.xml510
-rw-r--r--indra/newview/skins/default/xui/en/panel_bottomtray_lite.xml9
-rw-r--r--indra/newview/skins/default/xui/en/panel_chat_header.xml9
-rw-r--r--indra/newview/skins/default/xui/en/panel_chat_item.xml6
-rw-r--r--indra/newview/skins/default/xui/en/panel_chiclet_bar.xml173
-rw-r--r--indra/newview/skins/default/xui/en/panel_classified_info.xml15
-rw-r--r--indra/newview/skins/default/xui/en/panel_cof_wearables.xml6
-rw-r--r--indra/newview/skins/default/xui/en/panel_dummy_clothing_list_item.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_classified.xml5
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_jacket.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_physics.xml138
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_pick.xml17
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_profile.xml25
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_skin.xml12
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_wearable.xml29
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_control_panel.xml11
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_general.xml6
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml8
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_invite.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_land_money.xml13
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_list_item.xml3
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_notices.xml10
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_roles.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_hint.xml6
-rw-r--r--indra/newview/skins/default/xui/en/panel_hint_image.xml49
-rw-r--r--indra/newview/skins/default/xui/en/panel_im_control_panel.xml23
-rw-r--r--indra/newview/skins/default/xui/en/panel_inbox_inventory.xml18
-rw-r--r--indra/newview/skins/default/xui/en/panel_instant_message.xml10
-rw-r--r--indra/newview/skins/default/xui/en/panel_landmark_info.xml7
-rw-r--r--indra/newview/skins/default/xui/en/panel_login.xml65
-rw-r--r--indra/newview/skins/default/xui/en/panel_main_inventory.xml15
-rw-r--r--indra/newview/skins/default/xui/en/panel_me.xml45
-rw-r--r--indra/newview/skins/default/xui/en/panel_media_settings_general.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_my_profile.xml348
-rw-r--r--indra/newview/skins/default/xui/en/panel_navigation_bar.xml310
-rw-r--r--indra/newview/skins/default/xui/en/panel_nearby_chat.xml63
-rw-r--r--indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml4
-rw-r--r--indra/newview/skins/default/xui/en/panel_nearby_media.xml30
-rw-r--r--indra/newview/skins/default/xui/en/panel_notes.xml236
-rw-r--r--indra/newview/skins/default/xui/en/panel_notification.xml20
-rw-r--r--indra/newview/skins/default/xui/en/panel_notify_textbox.xml66
-rw-r--r--indra/newview/skins/default/xui/en/panel_online_status_toast.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_outbox_inventory.xml17
-rw-r--r--indra/newview/skins/default/xui/en/panel_outfit_edit.xml9
-rw-r--r--indra/newview/skins/default/xui/en/panel_outfits_inventory.xml10
-rw-r--r--indra/newview/skins/default/xui/en/panel_outfits_list.xml11
-rw-r--r--indra/newview/skins/default/xui/en/panel_people.xml109
-rw-r--r--indra/newview/skins/default/xui/en/panel_pick_info.xml8
-rw-r--r--indra/newview/skins/default/xui/en/panel_picks.xml39
-rw-r--r--indra/newview/skins/default/xui/en/panel_place_profile.xml42
-rw-r--r--indra/newview/skins/default/xui/en/panel_places.xml38
-rw-r--r--indra/newview/skins/default/xui/en/panel_postcard_message.xml125
-rw-r--r--indra/newview/skins/default/xui/en/panel_postcard_settings.xml136
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_advanced.xml108
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_alerts.xml4
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_chat.xml125
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_colors.xml52
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_general.xml47
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml76
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_move.xml179
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_privacy.xml28
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_setup.xml226
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_sound.xml219
-rw-r--r--indra/newview/skins/default/xui/en/panel_prim_media_controls.xml35
-rw-r--r--indra/newview/skins/default/xui/en/panel_profile.xml467
-rw-r--r--indra/newview/skins/default/xui/en/panel_profile_view.xml159
-rw-r--r--indra/newview/skins/default/xui/en/panel_progress.xml41
-rw-r--r--indra/newview/skins/default/xui/en/panel_region_covenant.xml12
-rw-r--r--indra/newview/skins/default/xui/en/panel_region_debug.xml24
-rw-r--r--indra/newview/skins/default/xui/en/panel_region_environment.xml149
-rw-r--r--indra/newview/skins/default/xui/en/panel_region_estate.xml334
-rw-r--r--indra/newview/skins/default/xui/en/panel_region_general.xml8
-rw-r--r--indra/newview/skins/default/xui/en/panel_region_terrain.xml349
-rw-r--r--indra/newview/skins/default/xui/en/panel_region_texture.xml327
-rw-r--r--indra/newview/skins/default/xui/en/panel_script_ed.xml27
-rw-r--r--indra/newview/skins/default/xui/en/panel_scrolling_param_base.xml24
-rw-r--r--indra/newview/skins/default/xui/en/panel_side_tray.xml173
-rw-r--r--indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_snapshot_inventory.xml148
-rw-r--r--indra/newview/skins/default/xui/en/panel_snapshot_local.xml235
-rw-r--r--indra/newview/skins/default/xui/en/panel_snapshot_options.xml84
-rw-r--r--indra/newview/skins/default/xui/en/panel_snapshot_postcard.xml99
-rw-r--r--indra/newview/skins/default/xui/en/panel_snapshot_profile.xml199
-rw-r--r--indra/newview/skins/default/xui/en/panel_sound_devices.xml169
-rw-r--r--indra/newview/skins/default/xui/en/panel_status_bar.xml45
-rw-r--r--indra/newview/skins/default/xui/en/panel_sys_well_item.xml4
-rw-r--r--indra/newview/skins/default/xui/en/panel_teleport_history_item.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_toast.xml3
-rw-r--r--indra/newview/skins/default/xui/en/panel_toolbar_view.xml159
-rw-r--r--indra/newview/skins/default/xui/en/panel_topinfo_bar.xml12
-rw-r--r--indra/newview/skins/default/xui/en/sidepanel_appearance.xml2
-rw-r--r--indra/newview/skins/default/xui/en/sidepanel_inventory.xml178
-rw-r--r--indra/newview/skins/default/xui/en/sidepanel_item_info.xml3
-rw-r--r--indra/newview/skins/default/xui/en/sidepanel_task_info.xml22
-rw-r--r--indra/newview/skins/default/xui/en/strings.xml576
-rw-r--r--indra/newview/skins/default/xui/en/teleport_strings.xml4
-rw-r--r--indra/newview/skins/default/xui/en/widgets/accordion.xml2
-rw-r--r--indra/newview/skins/default/xui/en/widgets/avatar_icon.xml5
-rw-r--r--indra/newview/skins/default/xui/en/widgets/avatar_list_item.xml8
-rw-r--r--indra/newview/skins/default/xui/en/widgets/badge.xml21
-rw-r--r--indra/newview/skins/default/xui/en/widgets/bodyparts_list_item.xml2
-rw-r--r--indra/newview/skins/default/xui/en/widgets/button.xml14
-rw-r--r--indra/newview/skins/default/xui/en/widgets/check_box.xml8
-rw-r--r--indra/newview/skins/default/xui/en/widgets/chiclet_im_adhoc.xml21
-rw-r--r--indra/newview/skins/default/xui/en/widgets/chiclet_im_group.xml21
-rw-r--r--indra/newview/skins/default/xui/en/widgets/chiclet_im_p2p.xml22
-rw-r--r--indra/newview/skins/default/xui/en/widgets/clothing_list_item.xml2
-rw-r--r--indra/newview/skins/default/xui/en/widgets/color_swatch.xml2
-rw-r--r--indra/newview/skins/default/xui/en/widgets/combo_box.xml3
-rw-r--r--indra/newview/skins/default/xui/en/widgets/dummy_clothing_list_item.xml2
-rw-r--r--indra/newview/skins/default/xui/en/widgets/filter_editor.xml1
-rw-r--r--indra/newview/skins/default/xui/en/widgets/floater.xml5
-rw-r--r--indra/newview/skins/default/xui/en/widgets/folder_view_item.xml2
-rw-r--r--indra/newview/skins/default/xui/en/widgets/group_icon.xml3
-rw-r--r--indra/newview/skins/default/xui/en/widgets/icon.xml1
-rw-r--r--indra/newview/skins/default/xui/en/widgets/inbox_folder_view_folder.xml21
-rw-r--r--indra/newview/skins/default/xui/en/widgets/inbox_folder_view_item.xml19
-rw-r--r--indra/newview/skins/default/xui/en/widgets/inbox_inventory_panel.xml2
-rw-r--r--indra/newview/skins/default/xui/en/widgets/inventory_panel.xml11
-rw-r--r--indra/newview/skins/default/xui/en/widgets/joystick_rotate.xml7
-rw-r--r--indra/newview/skins/default/xui/en/widgets/layout_stack.xml4
-rw-r--r--indra/newview/skins/default/xui/en/widgets/loading_indicator.xml20
-rw-r--r--indra/newview/skins/default/xui/en/widgets/location_input.xml8
-rw-r--r--indra/newview/skins/default/xui/en/widgets/menu.xml3
-rw-r--r--indra/newview/skins/default/xui/en/widgets/menu_bar.xml7
-rw-r--r--indra/newview/skins/default/xui/en/widgets/menu_item_separator.xml8
-rw-r--r--indra/newview/skins/default/xui/en/widgets/menu_item_tear_off.xml9
-rw-r--r--indra/newview/skins/default/xui/en/widgets/multi_slider.xml9
-rw-r--r--indra/newview/skins/default/xui/en/widgets/multi_slider_bar.xml7
-rw-r--r--indra/newview/skins/default/xui/en/widgets/name_list.xml3
-rw-r--r--indra/newview/skins/default/xui/en/widgets/outbox_folder_view_folder.xml9
-rw-r--r--indra/newview/skins/default/xui/en/widgets/outbox_inventory_panel.xml2
-rw-r--r--indra/newview/skins/default/xui/en/widgets/panel.xml6
-rw-r--r--indra/newview/skins/default/xui/en/widgets/radio_group.xml3
-rw-r--r--indra/newview/skins/default/xui/en/widgets/scroll_bar.xml21
-rw-r--r--indra/newview/skins/default/xui/en/widgets/scroll_column_header.xml7
-rw-r--r--indra/newview/skins/default/xui/en/widgets/scroll_container.xml7
-rw-r--r--indra/newview/skins/default/xui/en/widgets/scroll_list.xml4
-rw-r--r--indra/newview/skins/default/xui/en/widgets/scrolling_panel_list.xml2
-rw-r--r--indra/newview/skins/default/xui/en/widgets/search_editor.xml1
-rw-r--r--indra/newview/skins/default/xui/en/widgets/sidetray_tab.xml4
-rw-r--r--indra/newview/skins/default/xui/en/widgets/slider_bar.xml3
-rw-r--r--indra/newview/skins/default/xui/en/widgets/tab_container.xml6
-rw-r--r--indra/newview/skins/default/xui/en/widgets/talk_button.xml10
-rw-r--r--indra/newview/skins/default/xui/en/widgets/text_editor.xml1
-rw-r--r--indra/newview/skins/default/xui/en/widgets/texture_picker.xml6
-rw-r--r--indra/newview/skins/default/xui/en/widgets/time.xml16
-rw-r--r--indra/newview/skins/default/xui/en/widgets/toolbar.xml57
-rw-r--r--indra/newview/skins/default/xui/en/widgets/view_border.xml7
-rw-r--r--indra/newview/skins/default/xui/en/widgets/web_browser.xml4
-rw-r--r--indra/newview/skins/default/xui/en/widgets/window_shade.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_about.xml77
-rw-r--r--indra/newview/skins/default/xui/es/floater_about_land.xml79
-rw-r--r--indra/newview/skins/default/xui/es/floater_avatar.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_beacons.xml1
-rw-r--r--indra/newview/skins/default/xui/es/floater_build_options.xml27
-rw-r--r--indra/newview/skins/default/xui/es/floater_buy_contents.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_buy_currency.xml9
-rw-r--r--indra/newview/skins/default/xui/es/floater_buy_land.xml12
-rw-r--r--indra/newview/skins/default/xui/es/floater_camera.xml15
-rw-r--r--indra/newview/skins/default/xui/es/floater_chat_bar.xml7
-rw-r--r--indra/newview/skins/default/xui/es/floater_customize.xml530
-rw-r--r--indra/newview/skins/default/xui/es/floater_day_cycle_options.xml94
-rw-r--r--indra/newview/skins/default/xui/es/floater_delete_env_preset.xml35
-rw-r--r--indra/newview/skins/default/xui/es/floater_destinations.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_edit_day_cycle.xml104
-rw-r--r--indra/newview/skins/default/xui/es/floater_edit_sky_preset.xml143
-rw-r--r--indra/newview/skins/default/xui/es/floater_edit_water_preset.xml72
-rw-r--r--indra/newview/skins/default/xui/es/floater_env_settings.xml28
-rw-r--r--indra/newview/skins/default/xui/es/floater_environment_settings.xml36
-rw-r--r--indra/newview/skins/default/xui/es/floater_fast_timers.xml10
-rw-r--r--indra/newview/skins/default/xui/es/floater_hardware_settings.xml5
-rw-r--r--indra/newview/skins/default/xui/es/floater_help_browser.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_how_to.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_import_collada.xml23
-rw-r--r--indra/newview/skins/default/xui/es/floater_inventory_item_properties.xml6
-rw-r--r--indra/newview/skins/default/xui/es/floater_inventory_view_finder.xml5
-rw-r--r--indra/newview/skins/default/xui/es/floater_map.xml7
-rw-r--r--indra/newview/skins/default/xui/es/floater_merchant_outbox.xml27
-rw-r--r--indra/newview/skins/default/xui/es/floater_model_preview.xml277
-rw-r--r--indra/newview/skins/default/xui/es/floater_moveview.xml6
-rw-r--r--indra/newview/skins/default/xui/es/floater_my_appearance.xml4
-rw-r--r--indra/newview/skins/default/xui/es/floater_my_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_nearby_chat.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_object_weights.xml28
-rw-r--r--indra/newview/skins/default/xui/es/floater_outfit_save_as.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_people.xml7
-rw-r--r--indra/newview/skins/default/xui/es/floater_picks.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_places.xml4
-rw-r--r--indra/newview/skins/default/xui/es/floater_postcard.xml20
-rw-r--r--indra/newview/skins/default/xui/es/floater_preferences.xml4
-rw-r--r--indra/newview/skins/default/xui/es/floater_preferences_proxy.xml40
-rw-r--r--indra/newview/skins/default/xui/es/floater_preview_animation.xml4
-rw-r--r--indra/newview/skins/default/xui/es/floater_preview_classified.xml6
-rw-r--r--indra/newview/skins/default/xui/es/floater_preview_event.xml6
-rw-r--r--indra/newview/skins/default/xui/es/floater_preview_gesture.xml18
-rw-r--r--indra/newview/skins/default/xui/es/floater_price_for_listing.xml18
-rw-r--r--indra/newview/skins/default/xui/es/floater_region_debug_console.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_report_abuse.xml4
-rw-r--r--indra/newview/skins/default/xui/es/floater_search.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_sell_land.xml4
-rw-r--r--indra/newview/skins/default/xui/es/floater_settings_debug.xml4
-rw-r--r--indra/newview/skins/default/xui/es/floater_snapshot.xml122
-rw-r--r--indra/newview/skins/default/xui/es/floater_sound_devices.xml7
-rw-r--r--indra/newview/skins/default/xui/es/floater_stats.xml24
-rw-r--r--indra/newview/skins/default/xui/es/floater_test_layout_stacks.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_tools.xml83
-rw-r--r--indra/newview/skins/default/xui/es/floater_top_objects.xml13
-rw-r--r--indra/newview/skins/default/xui/es/floater_tos.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_toybox.xml11
-rw-r--r--indra/newview/skins/default/xui/es/floater_translation_settings.xml58
-rw-r--r--indra/newview/skins/default/xui/es/floater_voice_controls.xml10
-rw-r--r--indra/newview/skins/default/xui/es/floater_voice_effect.xml108
-rw-r--r--indra/newview/skins/default/xui/es/floater_water.xml88
-rw-r--r--indra/newview/skins/default/xui/es/floater_web_content.xml14
-rw-r--r--indra/newview/skins/default/xui/es/floater_windlight_options.xml190
-rw-r--r--indra/newview/skins/default/xui/es/inspect_avatar.xml2
-rw-r--r--indra/newview/skins/default/xui/es/language_settings.xml1
-rw-r--r--indra/newview/skins/default/xui/es/menu_attachment_self.xml2
-rw-r--r--indra/newview/skins/default/xui/es/menu_avatar_self.xml3
-rw-r--r--indra/newview/skins/default/xui/es/menu_bottomtray.xml2
-rw-r--r--indra/newview/skins/default/xui/es/menu_favorites.xml2
-rw-r--r--indra/newview/skins/default/xui/es/menu_hide_navbar.xml2
-rw-r--r--indra/newview/skins/default/xui/es/menu_inspect_avatar_gear.xml8
-rw-r--r--indra/newview/skins/default/xui/es/menu_inspect_object_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/es/menu_inspect_self_gear.xml39
-rw-r--r--indra/newview/skins/default/xui/es/menu_inventory.xml3
-rw-r--r--indra/newview/skins/default/xui/es/menu_inventory_add.xml3
-rw-r--r--indra/newview/skins/default/xui/es/menu_inventory_gear_default.xml10
-rw-r--r--indra/newview/skins/default/xui/es/menu_login.xml5
-rw-r--r--indra/newview/skins/default/xui/es/menu_media_ctrl.xml7
-rw-r--r--indra/newview/skins/default/xui/es/menu_mini_map.xml1
-rw-r--r--indra/newview/skins/default/xui/es/menu_mode_change.xml5
-rw-r--r--indra/newview/skins/default/xui/es/menu_model_import_gear_default.xml8
-rw-r--r--indra/newview/skins/default/xui/es/menu_object.xml4
-rw-r--r--indra/newview/skins/default/xui/es/menu_outfit_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/es/menu_people_nearby_view_sort.xml5
-rw-r--r--indra/newview/skins/default/xui/es/menu_places_gear_folder.xml5
-rw-r--r--indra/newview/skins/default/xui/es/menu_places_gear_landmark.xml5
-rw-r--r--indra/newview/skins/default/xui/es/menu_teleport_history_item.xml2
-rw-r--r--indra/newview/skins/default/xui/es/menu_toolbars.xml7
-rw-r--r--indra/newview/skins/default/xui/es/menu_viewer.xml224
-rw-r--r--indra/newview/skins/default/xui/es/menu_wearing_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/es/notifications.xml438
-rw-r--r--indra/newview/skins/default/xui/es/panel_avatar_list_item.xml2
-rw-r--r--indra/newview/skins/default/xui/es/panel_chiclet_bar.xml15
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_alpha.xml16
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_gloves.xml2
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_jacket.xml4
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_pants.xml2
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_physics.xml14
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_pick.xml2
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_profile.xml4
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_shirt.xml2
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_shoes.xml2
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_skin.xml6
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_skirt.xml2
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_socks.xml2
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_underpants.xml2
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_undershirt.xml2
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_wearable.xml6
-rw-r--r--indra/newview/skins/default/xui/es/panel_friends.xml20
-rw-r--r--indra/newview/skins/default/xui/es/panel_group_general.xml6
-rw-r--r--indra/newview/skins/default/xui/es/panel_im_control_panel.xml2
-rw-r--r--indra/newview/skins/default/xui/es/panel_landmark_info.xml2
-rw-r--r--indra/newview/skins/default/xui/es/panel_login.xml10
-rw-r--r--indra/newview/skins/default/xui/es/panel_me.xml5
-rw-r--r--indra/newview/skins/default/xui/es/panel_media_settings_general.xml3
-rw-r--r--indra/newview/skins/default/xui/es/panel_media_settings_security.xml3
-rw-r--r--indra/newview/skins/default/xui/es/panel_my_profile.xml34
-rw-r--r--indra/newview/skins/default/xui/es/panel_navigation_bar.xml35
-rw-r--r--indra/newview/skins/default/xui/es/panel_nearby_chat.xml4
-rw-r--r--indra/newview/skins/default/xui/es/panel_nearby_media.xml2
-rw-r--r--indra/newview/skins/default/xui/es/panel_notes.xml35
-rw-r--r--indra/newview/skins/default/xui/es/panel_notify_textbox.xml11
-rw-r--r--indra/newview/skins/default/xui/es/panel_outbox_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/es/panel_outfits_list.xml6
-rw-r--r--indra/newview/skins/default/xui/es/panel_people.xml20
-rw-r--r--indra/newview/skins/default/xui/es/panel_pick_info.xml2
-rw-r--r--indra/newview/skins/default/xui/es/panel_place_profile.xml6
-rw-r--r--indra/newview/skins/default/xui/es/panel_places.xml4
-rw-r--r--indra/newview/skins/default/xui/es/panel_postcard_message.xml21
-rw-r--r--indra/newview/skins/default/xui/es/panel_postcard_settings.xml23
-rw-r--r--indra/newview/skins/default/xui/es/panel_preferences_advanced.xml40
-rw-r--r--indra/newview/skins/default/xui/es/panel_preferences_chat.xml69
-rw-r--r--indra/newview/skins/default/xui/es/panel_preferences_colors.xml44
-rw-r--r--indra/newview/skins/default/xui/es/panel_preferences_general.xml21
-rw-r--r--indra/newview/skins/default/xui/es/panel_preferences_graphics1.xml21
-rw-r--r--indra/newview/skins/default/xui/es/panel_preferences_move.xml39
-rw-r--r--indra/newview/skins/default/xui/es/panel_preferences_privacy.xml11
-rw-r--r--indra/newview/skins/default/xui/es/panel_preferences_setup.xml39
-rw-r--r--indra/newview/skins/default/xui/es/panel_preferences_sound.xml43
-rw-r--r--indra/newview/skins/default/xui/es/panel_profile.xml64
-rw-r--r--indra/newview/skins/default/xui/es/panel_profile_view.xml22
-rw-r--r--indra/newview/skins/default/xui/es/panel_region_covenant.xml9
-rw-r--r--indra/newview/skins/default/xui/es/panel_region_environment.xml33
-rw-r--r--indra/newview/skins/default/xui/es/panel_region_estate.xml10
-rw-r--r--indra/newview/skins/default/xui/es/panel_region_general.xml1
-rw-r--r--indra/newview/skins/default/xui/es/panel_region_terrain.xml67
-rw-r--r--indra/newview/skins/default/xui/es/panel_script_ed.xml16
-rw-r--r--indra/newview/skins/default/xui/es/panel_scrolling_param_base.xml4
-rw-r--r--indra/newview/skins/default/xui/es/panel_snapshot_inventory.xml21
-rw-r--r--indra/newview/skins/default/xui/es/panel_snapshot_local.xml39
-rw-r--r--indra/newview/skins/default/xui/es/panel_snapshot_options.xml7
-rw-r--r--indra/newview/skins/default/xui/es/panel_snapshot_postcard.xml17
-rw-r--r--indra/newview/skins/default/xui/es/panel_snapshot_profile.xml28
-rw-r--r--indra/newview/skins/default/xui/es/panel_sound_devices.xml25
-rw-r--r--indra/newview/skins/default/xui/es/panel_status_bar.xml13
-rw-r--r--indra/newview/skins/default/xui/es/sidepanel_inventory.xml21
-rw-r--r--indra/newview/skins/default/xui/es/sidepanel_task_info.xml6
-rw-r--r--indra/newview/skins/default/xui/es/strings.xml1119
-rw-r--r--indra/newview/skins/default/xui/es/teleport_strings.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/floater_about.xml80
-rw-r--r--indra/newview/skins/default/xui/fr/floater_about_land.xml61
-rw-r--r--indra/newview/skins/default/xui/fr/floater_animation_anim_preview.xml11
-rw-r--r--indra/newview/skins/default/xui/fr/floater_animation_bvh_preview.xml186
-rw-r--r--indra/newview/skins/default/xui/fr/floater_avatar.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_beacons.xml1
-rw-r--r--indra/newview/skins/default/xui/fr/floater_build_options.xml25
-rw-r--r--indra/newview/skins/default/xui/fr/floater_buy_contents.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_buy_currency.xml8
-rw-r--r--indra/newview/skins/default/xui/fr/floater_camera.xml11
-rw-r--r--indra/newview/skins/default/xui/fr/floater_chat_bar.xml7
-rw-r--r--indra/newview/skins/default/xui/fr/floater_customize.xml530
-rw-r--r--indra/newview/skins/default/xui/fr/floater_day_cycle_options.xml94
-rw-r--r--indra/newview/skins/default/xui/fr/floater_delete_env_preset.xml35
-rw-r--r--indra/newview/skins/default/xui/fr/floater_destinations.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_edit_day_cycle.xml104
-rw-r--r--indra/newview/skins/default/xui/fr/floater_edit_sky_preset.xml143
-rw-r--r--indra/newview/skins/default/xui/fr/floater_edit_water_preset.xml72
-rw-r--r--indra/newview/skins/default/xui/fr/floater_env_settings.xml29
-rw-r--r--indra/newview/skins/default/xui/fr/floater_environment_settings.xml36
-rw-r--r--indra/newview/skins/default/xui/fr/floater_fast_timers.xml10
-rw-r--r--indra/newview/skins/default/xui/fr/floater_hardware_settings.xml5
-rw-r--r--indra/newview/skins/default/xui/fr/floater_how_to.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_import_collada.xml23
-rw-r--r--indra/newview/skins/default/xui/fr/floater_inventory_item_properties.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/floater_inventory_view_finder.xml1
-rw-r--r--indra/newview/skins/default/xui/fr/floater_map.xml31
-rw-r--r--indra/newview/skins/default/xui/fr/floater_merchant_outbox.xml27
-rw-r--r--indra/newview/skins/default/xui/fr/floater_model_preview.xml277
-rw-r--r--indra/newview/skins/default/xui/fr/floater_moveview.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/floater_my_appearance.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/floater_my_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_nearby_chat.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_object_weights.xml28
-rw-r--r--indra/newview/skins/default/xui/fr/floater_outfit_save_as.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_people.xml7
-rw-r--r--indra/newview/skins/default/xui/fr/floater_picks.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_places.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/floater_postcard.xml9
-rw-r--r--indra/newview/skins/default/xui/fr/floater_preferences.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/floater_preferences_proxy.xml40
-rw-r--r--indra/newview/skins/default/xui/fr/floater_preview_animation.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/floater_preview_gesture.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_price_for_listing.xml18
-rw-r--r--indra/newview/skins/default/xui/fr/floater_region_debug_console.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_search.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_sell_land.xml18
-rw-r--r--indra/newview/skins/default/xui/fr/floater_snapshot.xml124
-rw-r--r--indra/newview/skins/default/xui/fr/floater_sound_devices.xml7
-rw-r--r--indra/newview/skins/default/xui/fr/floater_stats.xml30
-rw-r--r--indra/newview/skins/default/xui/fr/floater_test_layout_stacks.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_test_text_vertical_aligment.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_tools.xml99
-rw-r--r--indra/newview/skins/default/xui/fr/floater_tos.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_toybox.xml11
-rw-r--r--indra/newview/skins/default/xui/fr/floater_translation_settings.xml58
-rw-r--r--indra/newview/skins/default/xui/fr/floater_voice_controls.xml10
-rw-r--r--indra/newview/skins/default/xui/fr/floater_voice_effect.xml129
-rw-r--r--indra/newview/skins/default/xui/fr/floater_water.xml70
-rw-r--r--indra/newview/skins/default/xui/fr/floater_wearable_save_as.xml11
-rw-r--r--indra/newview/skins/default/xui/fr/floater_web_content.xml14
-rw-r--r--indra/newview/skins/default/xui/fr/floater_windlight_options.xml189
-rw-r--r--indra/newview/skins/default/xui/fr/inspect_avatar.xml3
-rw-r--r--indra/newview/skins/default/xui/fr/inspect_group.xml3
-rw-r--r--indra/newview/skins/default/xui/fr/language_settings.xml1
-rw-r--r--indra/newview/skins/default/xui/fr/menu_attachment_self.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/menu_avatar_self.xml3
-rw-r--r--indra/newview/skins/default/xui/fr/menu_bottomtray.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/menu_group_plus.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/menu_hide_navbar.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/menu_inspect_avatar_gear.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/menu_inspect_object_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/fr/menu_inspect_self_gear.xml39
-rw-r--r--indra/newview/skins/default/xui/fr/menu_inventory.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/menu_inventory_add.xml3
-rw-r--r--indra/newview/skins/default/xui/fr/menu_inventory_gear_default.xml10
-rw-r--r--indra/newview/skins/default/xui/fr/menu_login.xml5
-rw-r--r--indra/newview/skins/default/xui/fr/menu_media_ctrl.xml7
-rw-r--r--indra/newview/skins/default/xui/fr/menu_mini_map.xml1
-rw-r--r--indra/newview/skins/default/xui/fr/menu_mode_change.xml5
-rw-r--r--indra/newview/skins/default/xui/fr/menu_model_import_gear_default.xml8
-rw-r--r--indra/newview/skins/default/xui/fr/menu_object.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/menu_outfit_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/fr/menu_people_nearby_view_sort.xml7
-rw-r--r--indra/newview/skins/default/xui/fr/menu_places_gear_folder.xml5
-rw-r--r--indra/newview/skins/default/xui/fr/menu_places_gear_landmark.xml5
-rw-r--r--indra/newview/skins/default/xui/fr/menu_toolbars.xml7
-rw-r--r--indra/newview/skins/default/xui/fr/menu_viewer.xml214
-rw-r--r--indra/newview/skins/default/xui/fr/menu_wearing_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/fr/notifications.xml441
-rw-r--r--indra/newview/skins/default/xui/fr/panel_activeim_row.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/panel_avatar_list_item.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_chat_header.xml1
-rw-r--r--indra/newview/skins/default/xui/fr/panel_chiclet_bar.xml15
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_alpha.xml16
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_gloves.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_jacket.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_pants.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_physics.xml14
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_pick.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_profile.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_shirt.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_shoes.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_skin.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_skirt.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_socks.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_underpants.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_undershirt.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_wearable.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/panel_instant_message.xml1
-rw-r--r--indra/newview/skins/default/xui/fr/panel_login.xml9
-rw-r--r--indra/newview/skins/default/xui/fr/panel_main_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_me.xml5
-rw-r--r--indra/newview/skins/default/xui/fr/panel_my_profile.xml49
-rw-r--r--indra/newview/skins/default/xui/fr/panel_navigation_bar.xml35
-rw-r--r--indra/newview/skins/default/xui/fr/panel_nearby_chat.xml8
-rw-r--r--indra/newview/skins/default/xui/fr/panel_nearby_media.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_notes.xml35
-rw-r--r--indra/newview/skins/default/xui/fr/panel_notify_textbox.xml11
-rw-r--r--indra/newview/skins/default/xui/fr/panel_outbox_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_outfits_list.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/panel_people.xml36
-rw-r--r--indra/newview/skins/default/xui/fr/panel_place_profile.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_places.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/panel_postcard_message.xml21
-rw-r--r--indra/newview/skins/default/xui/fr/panel_postcard_settings.xml23
-rw-r--r--indra/newview/skins/default/xui/fr/panel_preferences_advanced.xml40
-rw-r--r--indra/newview/skins/default/xui/fr/panel_preferences_chat.xml69
-rw-r--r--indra/newview/skins/default/xui/fr/panel_preferences_colors.xml44
-rw-r--r--indra/newview/skins/default/xui/fr/panel_preferences_general.xml15
-rw-r--r--indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml27
-rw-r--r--indra/newview/skins/default/xui/fr/panel_preferences_move.xml39
-rw-r--r--indra/newview/skins/default/xui/fr/panel_preferences_privacy.xml17
-rw-r--r--indra/newview/skins/default/xui/fr/panel_preferences_setup.xml35
-rw-r--r--indra/newview/skins/default/xui/fr/panel_preferences_sound.xml45
-rw-r--r--indra/newview/skins/default/xui/fr/panel_prim_media_controls.xml8
-rw-r--r--indra/newview/skins/default/xui/fr/panel_profile.xml68
-rw-r--r--indra/newview/skins/default/xui/fr/panel_profile_view.xml22
-rw-r--r--indra/newview/skins/default/xui/fr/panel_region_debug.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_region_environment.xml33
-rw-r--r--indra/newview/skins/default/xui/fr/panel_region_estate.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/panel_region_general.xml1
-rw-r--r--indra/newview/skins/default/xui/fr/panel_region_terrain.xml63
-rw-r--r--indra/newview/skins/default/xui/fr/panel_script_ed.xml16
-rw-r--r--indra/newview/skins/default/xui/fr/panel_scrolling_param_base.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/panel_snapshot_inventory.xml21
-rw-r--r--indra/newview/skins/default/xui/fr/panel_snapshot_local.xml39
-rw-r--r--indra/newview/skins/default/xui/fr/panel_snapshot_options.xml7
-rw-r--r--indra/newview/skins/default/xui/fr/panel_snapshot_postcard.xml17
-rw-r--r--indra/newview/skins/default/xui/fr/panel_snapshot_profile.xml28
-rw-r--r--indra/newview/skins/default/xui/fr/panel_sound_devices.xml25
-rw-r--r--indra/newview/skins/default/xui/fr/panel_status_bar.xml17
-rw-r--r--indra/newview/skins/default/xui/fr/panel_teleport_history.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/sidepanel_inventory.xml21
-rw-r--r--indra/newview/skins/default/xui/fr/sidepanel_task_info.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/strings.xml1106
-rw-r--r--indra/newview/skins/default/xui/fr/teleport_strings.xml4
-rw-r--r--indra/newview/skins/default/xui/it/floater_about.xml79
-rw-r--r--indra/newview/skins/default/xui/it/floater_about_land.xml81
-rw-r--r--indra/newview/skins/default/xui/it/floater_animation_anim_preview.xml11
-rw-r--r--indra/newview/skins/default/xui/it/floater_animation_bvh_preview.xml186
-rw-r--r--indra/newview/skins/default/xui/it/floater_animation_preview.xml16
-rw-r--r--indra/newview/skins/default/xui/it/floater_avatar.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_avatar_picker.xml9
-rw-r--r--indra/newview/skins/default/xui/it/floater_beacons.xml1
-rw-r--r--indra/newview/skins/default/xui/it/floater_build_options.xml27
-rw-r--r--indra/newview/skins/default/xui/it/floater_bumps.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_buy_contents.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_buy_currency.xml5
-rw-r--r--indra/newview/skins/default/xui/it/floater_buy_land.xml4
-rw-r--r--indra/newview/skins/default/xui/it/floater_buy_object.xml37
-rw-r--r--indra/newview/skins/default/xui/it/floater_camera.xml11
-rw-r--r--indra/newview/skins/default/xui/it/floater_chat_bar.xml7
-rw-r--r--indra/newview/skins/default/xui/it/floater_day_cycle_options.xml94
-rw-r--r--indra/newview/skins/default/xui/it/floater_delete_env_preset.xml35
-rw-r--r--indra/newview/skins/default/xui/it/floater_destinations.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_display_name.xml18
-rw-r--r--indra/newview/skins/default/xui/it/floater_edit_day_cycle.xml104
-rw-r--r--indra/newview/skins/default/xui/it/floater_edit_sky_preset.xml143
-rw-r--r--indra/newview/skins/default/xui/it/floater_edit_water_preset.xml72
-rw-r--r--indra/newview/skins/default/xui/it/floater_env_settings.xml29
-rw-r--r--indra/newview/skins/default/xui/it/floater_environment_settings.xml36
-rw-r--r--indra/newview/skins/default/xui/it/floater_event.xml45
-rw-r--r--indra/newview/skins/default/xui/it/floater_fast_timers.xml10
-rw-r--r--indra/newview/skins/default/xui/it/floater_hardware_settings.xml5
-rw-r--r--indra/newview/skins/default/xui/it/floater_how_to.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_import_collada.xml23
-rw-r--r--indra/newview/skins/default/xui/it/floater_incoming_call.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_inventory_item_properties.xml6
-rw-r--r--indra/newview/skins/default/xui/it/floater_inventory_view_finder.xml1
-rw-r--r--indra/newview/skins/default/xui/it/floater_map.xml7
-rw-r--r--indra/newview/skins/default/xui/it/floater_merchant_outbox.xml27
-rw-r--r--indra/newview/skins/default/xui/it/floater_model_preview.xml277
-rw-r--r--indra/newview/skins/default/xui/it/floater_moveview.xml6
-rw-r--r--indra/newview/skins/default/xui/it/floater_my_appearance.xml4
-rw-r--r--indra/newview/skins/default/xui/it/floater_my_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_nearby_chat.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_object_weights.xml28
-rw-r--r--indra/newview/skins/default/xui/it/floater_outfit_save_as.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_pay.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_people.xml7
-rw-r--r--indra/newview/skins/default/xui/it/floater_picks.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_places.xml4
-rw-r--r--indra/newview/skins/default/xui/it/floater_preferences.xml4
-rw-r--r--indra/newview/skins/default/xui/it/floater_preferences_proxy.xml40
-rw-r--r--indra/newview/skins/default/xui/it/floater_preview_animation.xml4
-rw-r--r--indra/newview/skins/default/xui/it/floater_preview_gesture.xml4
-rw-r--r--indra/newview/skins/default/xui/it/floater_price_for_listing.xml18
-rw-r--r--indra/newview/skins/default/xui/it/floater_region_debug_console.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_search.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_sell_land.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_settings_debug.xml4
-rw-r--r--indra/newview/skins/default/xui/it/floater_snapshot.xml124
-rw-r--r--indra/newview/skins/default/xui/it/floater_sound_devices.xml7
-rw-r--r--indra/newview/skins/default/xui/it/floater_stats.xml26
-rw-r--r--indra/newview/skins/default/xui/it/floater_test_layout_stacks.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_test_text_vertical_aligment.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_tools.xml97
-rw-r--r--indra/newview/skins/default/xui/it/floater_top_objects.xml8
-rw-r--r--indra/newview/skins/default/xui/it/floater_toybox.xml11
-rw-r--r--indra/newview/skins/default/xui/it/floater_translation_settings.xml58
-rw-r--r--indra/newview/skins/default/xui/it/floater_voice_controls.xml16
-rw-r--r--indra/newview/skins/default/xui/it/floater_voice_effect.xml129
-rw-r--r--indra/newview/skins/default/xui/it/floater_water.xml95
-rw-r--r--indra/newview/skins/default/xui/it/floater_web_content.xml14
-rw-r--r--indra/newview/skins/default/xui/it/floater_windlight_options.xml189
-rw-r--r--indra/newview/skins/default/xui/it/inspect_avatar.xml5
-rw-r--r--indra/newview/skins/default/xui/it/language_settings.xml1
-rw-r--r--indra/newview/skins/default/xui/it/menu_attachment_self.xml2
-rw-r--r--indra/newview/skins/default/xui/it/menu_avatar_self.xml3
-rw-r--r--indra/newview/skins/default/xui/it/menu_bottomtray.xml2
-rw-r--r--indra/newview/skins/default/xui/it/menu_hide_navbar.xml2
-rw-r--r--indra/newview/skins/default/xui/it/menu_inspect_avatar_gear.xml6
-rw-r--r--indra/newview/skins/default/xui/it/menu_inspect_object_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/it/menu_inspect_self_gear.xml39
-rw-r--r--indra/newview/skins/default/xui/it/menu_inventory.xml4
-rw-r--r--indra/newview/skins/default/xui/it/menu_inventory_add.xml3
-rw-r--r--indra/newview/skins/default/xui/it/menu_inventory_gear_default.xml10
-rw-r--r--indra/newview/skins/default/xui/it/menu_login.xml5
-rw-r--r--indra/newview/skins/default/xui/it/menu_media_ctrl.xml7
-rw-r--r--indra/newview/skins/default/xui/it/menu_mini_map.xml1
-rw-r--r--indra/newview/skins/default/xui/it/menu_mode_change.xml5
-rw-r--r--indra/newview/skins/default/xui/it/menu_model_import_gear_default.xml8
-rw-r--r--indra/newview/skins/default/xui/it/menu_object.xml4
-rw-r--r--indra/newview/skins/default/xui/it/menu_outfit_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/it/menu_people_nearby_view_sort.xml5
-rw-r--r--indra/newview/skins/default/xui/it/menu_places_gear_folder.xml5
-rw-r--r--indra/newview/skins/default/xui/it/menu_places_gear_landmark.xml5
-rw-r--r--indra/newview/skins/default/xui/it/menu_toolbars.xml7
-rw-r--r--indra/newview/skins/default/xui/it/menu_viewer.xml222
-rw-r--r--indra/newview/skins/default/xui/it/menu_wearing_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/it/notifications.xml572
-rw-r--r--indra/newview/skins/default/xui/it/panel_avatar_list_item.xml2
-rw-r--r--indra/newview/skins/default/xui/it/panel_chiclet_bar.xml15
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_alpha.xml16
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_gloves.xml2
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_jacket.xml4
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_pants.xml2
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_physics.xml14
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_pick.xml2
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_profile.xml10
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_shirt.xml2
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_shoes.xml2
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_skin.xml6
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_skirt.xml2
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_socks.xml2
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_underpants.xml2
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_undershirt.xml2
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_wearable.xml6
-rw-r--r--indra/newview/skins/default/xui/it/panel_group_land_money.xml1
-rw-r--r--indra/newview/skins/default/xui/it/panel_group_notices.xml9
-rw-r--r--indra/newview/skins/default/xui/it/panel_login.xml11
-rw-r--r--indra/newview/skins/default/xui/it/panel_me.xml5
-rw-r--r--indra/newview/skins/default/xui/it/panel_media_settings_general.xml2
-rw-r--r--indra/newview/skins/default/xui/it/panel_my_profile.xml34
-rw-r--r--indra/newview/skins/default/xui/it/panel_navigation_bar.xml35
-rw-r--r--indra/newview/skins/default/xui/it/panel_nearby_chat.xml8
-rw-r--r--indra/newview/skins/default/xui/it/panel_nearby_media.xml2
-rw-r--r--indra/newview/skins/default/xui/it/panel_notes.xml35
-rw-r--r--indra/newview/skins/default/xui/it/panel_notify_textbox.xml11
-rw-r--r--indra/newview/skins/default/xui/it/panel_outbox_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/it/panel_outfits_list.xml6
-rw-r--r--indra/newview/skins/default/xui/it/panel_people.xml20
-rw-r--r--indra/newview/skins/default/xui/it/panel_place_profile.xml5
-rw-r--r--indra/newview/skins/default/xui/it/panel_places.xml4
-rw-r--r--indra/newview/skins/default/xui/it/panel_postcard_message.xml21
-rw-r--r--indra/newview/skins/default/xui/it/panel_postcard_settings.xml23
-rw-r--r--indra/newview/skins/default/xui/it/panel_preferences_advanced.xml40
-rw-r--r--indra/newview/skins/default/xui/it/panel_preferences_chat.xml67
-rw-r--r--indra/newview/skins/default/xui/it/panel_preferences_colors.xml44
-rw-r--r--indra/newview/skins/default/xui/it/panel_preferences_general.xml21
-rw-r--r--indra/newview/skins/default/xui/it/panel_preferences_graphics1.xml19
-rw-r--r--indra/newview/skins/default/xui/it/panel_preferences_move.xml39
-rw-r--r--indra/newview/skins/default/xui/it/panel_preferences_privacy.xml14
-rw-r--r--indra/newview/skins/default/xui/it/panel_preferences_setup.xml45
-rw-r--r--indra/newview/skins/default/xui/it/panel_preferences_sound.xml41
-rw-r--r--indra/newview/skins/default/xui/it/panel_profile.xml64
-rw-r--r--indra/newview/skins/default/xui/it/panel_profile_view.xml16
-rw-r--r--indra/newview/skins/default/xui/it/panel_region_environment.xml33
-rw-r--r--indra/newview/skins/default/xui/it/panel_region_estate.xml6
-rw-r--r--indra/newview/skins/default/xui/it/panel_region_general.xml1
-rw-r--r--indra/newview/skins/default/xui/it/panel_region_terrain.xml65
-rw-r--r--indra/newview/skins/default/xui/it/panel_script_ed.xml16
-rw-r--r--indra/newview/skins/default/xui/it/panel_scrolling_param_base.xml4
-rw-r--r--indra/newview/skins/default/xui/it/panel_snapshot_inventory.xml21
-rw-r--r--indra/newview/skins/default/xui/it/panel_snapshot_local.xml39
-rw-r--r--indra/newview/skins/default/xui/it/panel_snapshot_options.xml7
-rw-r--r--indra/newview/skins/default/xui/it/panel_snapshot_postcard.xml17
-rw-r--r--indra/newview/skins/default/xui/it/panel_snapshot_profile.xml28
-rw-r--r--indra/newview/skins/default/xui/it/panel_sound_devices.xml25
-rw-r--r--indra/newview/skins/default/xui/it/panel_status_bar.xml13
-rw-r--r--indra/newview/skins/default/xui/it/role_actions.xml87
-rw-r--r--indra/newview/skins/default/xui/it/sidepanel_inventory.xml21
-rw-r--r--indra/newview/skins/default/xui/it/sidepanel_task_info.xml6
-rw-r--r--indra/newview/skins/default/xui/it/strings.xml1128
-rw-r--r--indra/newview/skins/default/xui/it/teleport_strings.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_about.xml77
-rw-r--r--indra/newview/skins/default/xui/ja/floater_about_land.xml51
-rw-r--r--indra/newview/skins/default/xui/ja/floater_animation_anim_preview.xml11
-rw-r--r--indra/newview/skins/default/xui/ja/floater_animation_bvh_preview.xml186
-rw-r--r--indra/newview/skins/default/xui/ja/floater_avatar.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_avatar_picker.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/floater_beacons.xml1
-rw-r--r--indra/newview/skins/default/xui/ja/floater_build_options.xml27
-rw-r--r--indra/newview/skins/default/xui/ja/floater_bumps.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/floater_buy_contents.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_buy_currency.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_buy_object.xml37
-rw-r--r--indra/newview/skins/default/xui/ja/floater_camera.xml11
-rw-r--r--indra/newview/skins/default/xui/ja/floater_chat_bar.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/floater_customize.xml529
-rw-r--r--indra/newview/skins/default/xui/ja/floater_day_cycle_options.xml94
-rw-r--r--indra/newview/skins/default/xui/ja/floater_delete_env_preset.xml35
-rw-r--r--indra/newview/skins/default/xui/ja/floater_destinations.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_display_name.xml18
-rw-r--r--indra/newview/skins/default/xui/ja/floater_edit_day_cycle.xml104
-rw-r--r--indra/newview/skins/default/xui/ja/floater_edit_sky_preset.xml143
-rw-r--r--indra/newview/skins/default/xui/ja/floater_edit_water_preset.xml72
-rw-r--r--indra/newview/skins/default/xui/ja/floater_env_settings.xml25
-rw-r--r--indra/newview/skins/default/xui/ja/floater_environment_settings.xml36
-rw-r--r--indra/newview/skins/default/xui/ja/floater_event.xml45
-rw-r--r--indra/newview/skins/default/xui/ja/floater_fast_timers.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/floater_hardware_settings.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/floater_how_to.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_import_collada.xml23
-rw-r--r--indra/newview/skins/default/xui/ja/floater_incoming_call.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_inventory_item_properties.xml12
-rw-r--r--indra/newview/skins/default/xui/ja/floater_inventory_view_finder.xml3
-rw-r--r--indra/newview/skins/default/xui/ja/floater_map.xml29
-rw-r--r--indra/newview/skins/default/xui/ja/floater_merchant_outbox.xml27
-rw-r--r--indra/newview/skins/default/xui/ja/floater_model_preview.xml277
-rw-r--r--indra/newview/skins/default/xui/ja/floater_moveview.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/floater_my_appearance.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_my_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_nearby_chat.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_object_weights.xml28
-rw-r--r--indra/newview/skins/default/xui/ja/floater_openobject.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_pay.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_people.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/floater_picks.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_places.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_preferences.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_preferences_proxy.xml40
-rw-r--r--indra/newview/skins/default/xui/ja/floater_preview_animation.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_preview_texture.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_price_for_listing.xml18
-rw-r--r--indra/newview/skins/default/xui/ja/floater_region_debug_console.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_search.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_sell_land.xml16
-rw-r--r--indra/newview/skins/default/xui/ja/floater_snapshot.xml122
-rw-r--r--indra/newview/skins/default/xui/ja/floater_sound_devices.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/floater_stats.xml12
-rw-r--r--indra/newview/skins/default/xui/ja/floater_test_layout_stacks.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_test_text_vertical_aligment.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_tools.xml133
-rw-r--r--indra/newview/skins/default/xui/ja/floater_toybox.xml11
-rw-r--r--indra/newview/skins/default/xui/ja/floater_translation_settings.xml58
-rw-r--r--indra/newview/skins/default/xui/ja/floater_voice_controls.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/floater_voice_effect.xml129
-rw-r--r--indra/newview/skins/default/xui/ja/floater_water.xml70
-rw-r--r--indra/newview/skins/default/xui/ja/floater_wearable_save_as.xml11
-rw-r--r--indra/newview/skins/default/xui/ja/floater_web_content.xml14
-rw-r--r--indra/newview/skins/default/xui/ja/floater_windlight_options.xml189
-rw-r--r--indra/newview/skins/default/xui/ja/inspect_avatar.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/inspect_group.xml3
-rw-r--r--indra/newview/skins/default/xui/ja/language_settings.xml1
-rw-r--r--indra/newview/skins/default/xui/ja/menu_attachment_self.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/menu_avatar_self.xml3
-rw-r--r--indra/newview/skins/default/xui/ja/menu_bottomtray.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/menu_hide_navbar.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/menu_inspect_avatar_gear.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/menu_inspect_object_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/menu_inspect_self_gear.xml39
-rw-r--r--indra/newview/skins/default/xui/ja/menu_inventory.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/menu_inventory_add.xml3
-rw-r--r--indra/newview/skins/default/xui/ja/menu_inventory_gear_default.xml12
-rw-r--r--indra/newview/skins/default/xui/ja/menu_login.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/menu_media_ctrl.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/menu_mini_map.xml1
-rw-r--r--indra/newview/skins/default/xui/ja/menu_mode_change.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/menu_model_import_gear_default.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/menu_object.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/menu_outfit_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/menu_people_nearby_view_sort.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/menu_places_gear_folder.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/menu_places_gear_landmark.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/menu_toolbars.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/menu_url_inventory.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/menu_viewer.xml215
-rw-r--r--indra/newview/skins/default/xui/ja/menu_wearing_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/notifications.xml628
-rw-r--r--indra/newview/skins/default/xui/ja/panel_activeim_row.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/panel_avatar_list_item.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_chat_header.xml1
-rw-r--r--indra/newview/skins/default/xui/ja/panel_chiclet_bar.xml15
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_alpha.xml16
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_gloves.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_jacket.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_pants.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_physics.xml14
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_pick.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_profile.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_shirt.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_shoes.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_skin.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_skirt.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_socks.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_underpants.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_undershirt.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_wearable.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/panel_group_control_panel.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_group_info_sidetray.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_group_land_money.xml1
-rw-r--r--indra/newview/skins/default/xui/ja/panel_group_notices.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/panel_instant_message.xml1
-rw-r--r--indra/newview/skins/default/xui/ja/panel_landmarks.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_login.xml11
-rw-r--r--indra/newview/skins/default/xui/ja/panel_main_inventory.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/panel_me.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/panel_my_profile.xml49
-rw-r--r--indra/newview/skins/default/xui/ja/panel_navigation_bar.xml35
-rw-r--r--indra/newview/skins/default/xui/ja/panel_nearby_chat.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/panel_nearby_media.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_notes.xml35
-rw-r--r--indra/newview/skins/default/xui/ja/panel_notify_textbox.xml11
-rw-r--r--indra/newview/skins/default/xui/ja/panel_outbox_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_outfit_edit.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_outfits_inventory.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_outfits_list.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/panel_people.xml26
-rw-r--r--indra/newview/skins/default/xui/ja/panel_place_profile.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/panel_places.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_postcard_message.xml21
-rw-r--r--indra/newview/skins/default/xui/ja/panel_postcard_settings.xml23
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml40
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_chat.xml67
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_colors.xml44
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_general.xml21
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml19
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_move.xml39
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_privacy.xml11
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_setup.xml39
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_sound.xml41
-rw-r--r--indra/newview/skins/default/xui/ja/panel_profile.xml68
-rw-r--r--indra/newview/skins/default/xui/ja/panel_profile_view.xml16
-rw-r--r--indra/newview/skins/default/xui/ja/panel_region_environment.xml33
-rw-r--r--indra/newview/skins/default/xui/ja/panel_region_estate.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/panel_region_general.xml1
-rw-r--r--indra/newview/skins/default/xui/ja/panel_region_terrain.xml74
-rw-r--r--indra/newview/skins/default/xui/ja/panel_script_ed.xml16
-rw-r--r--indra/newview/skins/default/xui/ja/panel_scrolling_param_base.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_snapshot_inventory.xml21
-rw-r--r--indra/newview/skins/default/xui/ja/panel_snapshot_local.xml39
-rw-r--r--indra/newview/skins/default/xui/ja/panel_snapshot_options.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/panel_snapshot_postcard.xml17
-rw-r--r--indra/newview/skins/default/xui/ja/panel_snapshot_profile.xml28
-rw-r--r--indra/newview/skins/default/xui/ja/panel_sound_devices.xml25
-rw-r--r--indra/newview/skins/default/xui/ja/panel_status_bar.xml11
-rw-r--r--indra/newview/skins/default/xui/ja/role_actions.xml19
-rw-r--r--indra/newview/skins/default/xui/ja/sidepanel_inventory.xml23
-rw-r--r--indra/newview/skins/default/xui/ja/sidepanel_item_info.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/sidepanel_task_info.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/strings.xml1136
-rw-r--r--indra/newview/skins/default/xui/ja/teleport_strings.xml8
-rw-r--r--indra/newview/skins/default/xui/nl/floater_about.xml81
-rw-r--r--indra/newview/skins/default/xui/nl/floater_about_land.xml492
-rw-r--r--indra/newview/skins/default/xui/nl/floater_animation_preview.xml85
-rw-r--r--indra/newview/skins/default/xui/nl/floater_auction.xml9
-rw-r--r--indra/newview/skins/default/xui/nl/floater_avatar_picker.xml42
-rw-r--r--indra/newview/skins/default/xui/nl/floater_avatar_textures.xml30
-rw-r--r--indra/newview/skins/default/xui/nl/floater_beacons.xml15
-rw-r--r--indra/newview/skins/default/xui/nl/floater_build_options.xml8
-rw-r--r--indra/newview/skins/default/xui/nl/floater_bulk_perms.xml44
-rw-r--r--indra/newview/skins/default/xui/nl/floater_bumps.xml21
-rw-r--r--indra/newview/skins/default/xui/nl/floater_buy_contents.xml21
-rw-r--r--indra/newview/skins/default/xui/nl/floater_buy_currency.xml68
-rw-r--r--indra/newview/skins/default/xui/nl/floater_buy_land.xml235
-rw-r--r--indra/newview/skins/default/xui/nl/floater_buy_object.xml26
-rw-r--r--indra/newview/skins/default/xui/nl/floater_camera.xml16
-rw-r--r--indra/newview/skins/default/xui/nl/floater_choose_group.xml8
-rw-r--r--indra/newview/skins/default/xui/nl/floater_color_picker.xml31
-rw-r--r--indra/newview/skins/default/xui/nl/floater_critical.xml11
-rw-r--r--indra/newview/skins/default/xui/nl/floater_day_cycle_options.xml94
-rw-r--r--indra/newview/skins/default/xui/nl/floater_env_settings.xml24
-rw-r--r--indra/newview/skins/default/xui/nl/floater_event.xml40
-rw-r--r--indra/newview/skins/default/xui/nl/floater_font_test.xml6
-rw-r--r--indra/newview/skins/default/xui/nl/floater_gesture.xml15
-rw-r--r--indra/newview/skins/default/xui/nl/floater_hardware_settings.xml28
-rw-r--r--indra/newview/skins/default/xui/nl/floater_hud.xml2
-rw-r--r--indra/newview/skins/default/xui/nl/floater_image_preview.xml33
-rw-r--r--indra/newview/skins/default/xui/nl/floater_inspect.xml11
-rw-r--r--indra/newview/skins/default/xui/nl/floater_inventory.xml47
-rw-r--r--indra/newview/skins/default/xui/nl/floater_inventory_item_properties.xml81
-rw-r--r--indra/newview/skins/default/xui/nl/floater_inventory_view_finder.xml24
-rw-r--r--indra/newview/skins/default/xui/nl/floater_joystick.xml80
-rw-r--r--indra/newview/skins/default/xui/nl/floater_lagmeter.xml152
-rw-r--r--indra/newview/skins/default/xui/nl/floater_land_holdings.xml39
-rw-r--r--indra/newview/skins/default/xui/nl/floater_live_lsleditor.xml12
-rw-r--r--indra/newview/skins/default/xui/nl/floater_lsl_guide.xml7
-rw-r--r--indra/newview/skins/default/xui/nl/floater_map.xml51
-rw-r--r--indra/newview/skins/default/xui/nl/floater_media_browser.xml19
-rw-r--r--indra/newview/skins/default/xui/nl/floater_mem_leaking.xml18
-rw-r--r--indra/newview/skins/default/xui/nl/floater_moveview.xml13
-rw-r--r--indra/newview/skins/default/xui/nl/floater_mute_object.xml14
-rw-r--r--indra/newview/skins/default/xui/nl/floater_openobject.xml8
-rw-r--r--indra/newview/skins/default/xui/nl/floater_pay.xml21
-rw-r--r--indra/newview/skins/default/xui/nl/floater_pay_object.xml30
-rw-r--r--indra/newview/skins/default/xui/nl/floater_perm_prefs.xml16
-rw-r--r--indra/newview/skins/default/xui/nl/floater_post_process.xml53
-rw-r--r--indra/newview/skins/default/xui/nl/floater_postcard.xml36
-rw-r--r--indra/newview/skins/default/xui/nl/floater_preferences.xml8
-rw-r--r--indra/newview/skins/default/xui/nl/floater_preview_animation.xml8
-rw-r--r--indra/newview/skins/default/xui/nl/floater_preview_gesture.xml58
-rw-r--r--indra/newview/skins/default/xui/nl/floater_preview_notecard.xml16
-rw-r--r--indra/newview/skins/default/xui/nl/floater_preview_sound.xml8
-rw-r--r--indra/newview/skins/default/xui/nl/floater_preview_texture.xml9
-rw-r--r--indra/newview/skins/default/xui/nl/floater_region_info.xml2
-rw-r--r--indra/newview/skins/default/xui/nl/floater_report_abuse.xml103
-rw-r--r--indra/newview/skins/default/xui/nl/floater_script_debug.xml6
-rw-r--r--indra/newview/skins/default/xui/nl/floater_script_preview.xml6
-rw-r--r--indra/newview/skins/default/xui/nl/floater_script_queue.xml4
-rw-r--r--indra/newview/skins/default/xui/nl/floater_script_search.xml15
-rw-r--r--indra/newview/skins/default/xui/nl/floater_select_key.xml7
-rw-r--r--indra/newview/skins/default/xui/nl/floater_sell_land.xml65
-rw-r--r--indra/newview/skins/default/xui/nl/floater_settings_debug.xml13
-rw-r--r--indra/newview/skins/default/xui/nl/floater_snapshot.xml79
-rw-r--r--indra/newview/skins/default/xui/nl/floater_sound_preview.xml11
-rw-r--r--indra/newview/skins/default/xui/nl/floater_stats.xml71
-rw-r--r--indra/newview/skins/default/xui/nl/floater_telehub.xml33
-rw-r--r--indra/newview/skins/default/xui/nl/floater_texture_ctrl.xml23
-rw-r--r--indra/newview/skins/default/xui/nl/floater_tools.xml573
-rw-r--r--indra/newview/skins/default/xui/nl/floater_top_objects.xml55
-rw-r--r--indra/newview/skins/default/xui/nl/floater_tos.xml16
-rw-r--r--indra/newview/skins/default/xui/nl/floater_url_entry.xml12
-rw-r--r--indra/newview/skins/default/xui/nl/floater_water.xml89
-rw-r--r--indra/newview/skins/default/xui/nl/floater_windlight_options.xml192
-rw-r--r--indra/newview/skins/default/xui/nl/floater_world_map.xml54
-rw-r--r--indra/newview/skins/default/xui/nl/language_settings.xml56
-rw-r--r--indra/newview/skins/default/xui/nl/menu_inventory.xml82
-rw-r--r--indra/newview/skins/default/xui/nl/menu_inventory_add.xml32
-rw-r--r--indra/newview/skins/default/xui/nl/menu_login.xml13
-rw-r--r--indra/newview/skins/default/xui/nl/menu_mini_map.xml8
-rw-r--r--indra/newview/skins/default/xui/nl/menu_picks.xml8
-rw-r--r--indra/newview/skins/default/xui/nl/menu_places_gear_landmark.xml18
-rw-r--r--indra/newview/skins/default/xui/nl/menu_slurl.xml6
-rw-r--r--indra/newview/skins/default/xui/nl/menu_viewer.xml207
-rw-r--r--indra/newview/skins/default/xui/nl/mime_types.xml230
-rw-r--r--indra/newview/skins/default/xui/nl/notifications.xml3047
-rw-r--r--indra/newview/skins/default/xui/nl/panel_block_list_sidetray.xml10
-rw-r--r--indra/newview/skins/default/xui/nl/panel_edit_profile.xml45
-rw-r--r--indra/newview/skins/default/xui/nl/panel_group_general.xml72
-rw-r--r--indra/newview/skins/default/xui/nl/panel_group_invite.xml24
-rw-r--r--indra/newview/skins/default/xui/nl/panel_group_land_money.xml84
-rw-r--r--indra/newview/skins/default/xui/nl/panel_group_notices.xml65
-rw-r--r--indra/newview/skins/default/xui/nl/panel_group_roles.xml101
-rw-r--r--indra/newview/skins/default/xui/nl/panel_login.xml41
-rw-r--r--indra/newview/skins/default/xui/nl/panel_main_inventory.xml64
-rw-r--r--indra/newview/skins/default/xui/nl/panel_preferences_advanced.xml48
-rw-r--r--indra/newview/skins/default/xui/nl/panel_preferences_alerts.xml14
-rw-r--r--indra/newview/skins/default/xui/nl/panel_preferences_chat.xml42
-rw-r--r--indra/newview/skins/default/xui/nl/panel_preferences_general.xml90
-rw-r--r--indra/newview/skins/default/xui/nl/panel_preferences_graphics1.xml145
-rw-r--r--indra/newview/skins/default/xui/nl/panel_preferences_privacy.xml32
-rw-r--r--indra/newview/skins/default/xui/nl/panel_preferences_setup.xml31
-rw-r--r--indra/newview/skins/default/xui/nl/panel_preferences_sound.xml38
-rw-r--r--indra/newview/skins/default/xui/nl/panel_region_covenant.xml84
-rw-r--r--indra/newview/skins/default/xui/nl/panel_region_debug.xml40
-rw-r--r--indra/newview/skins/default/xui/nl/panel_region_estate.xml70
-rw-r--r--indra/newview/skins/default/xui/nl/panel_region_general.xml53
-rw-r--r--indra/newview/skins/default/xui/nl/panel_region_terrain.xml27
-rw-r--r--indra/newview/skins/default/xui/nl/panel_region_texture.xml57
-rw-r--r--indra/newview/skins/default/xui/nl/panel_scrolling_param.xml10
-rw-r--r--indra/newview/skins/default/xui/nl/panel_status_bar.xml38
-rw-r--r--indra/newview/skins/default/xui/nl/panel_world_map.xml57
-rw-r--r--indra/newview/skins/default/xui/nl/role_actions.xml76
-rw-r--r--indra/newview/skins/default/xui/nl/strings.xml3252
-rw-r--r--indra/newview/skins/default/xui/nl/teleport_strings.xml75
-rw-r--r--indra/newview/skins/default/xui/pl/floater_about.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/floater_about_land.xml12
-rw-r--r--indra/newview/skins/default/xui/pl/floater_beacons.xml1
-rw-r--r--indra/newview/skins/default/xui/pl/floater_buy_currency.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/floater_camera.xml9
-rw-r--r--indra/newview/skins/default/xui/pl/floater_day_cycle_options.xml96
-rw-r--r--indra/newview/skins/default/xui/pl/floater_env_settings.xml28
-rw-r--r--indra/newview/skins/default/xui/pl/floater_hardware_settings.xml3
-rw-r--r--indra/newview/skins/default/xui/pl/floater_inventory_item_properties.xml6
-rw-r--r--indra/newview/skins/default/xui/pl/floater_map.xml3
-rw-r--r--indra/newview/skins/default/xui/pl/floater_nearby_chat.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/floater_preferences.xml4
-rw-r--r--indra/newview/skins/default/xui/pl/floater_preview_animation.xml4
-rw-r--r--indra/newview/skins/default/xui/pl/floater_region_debug_console.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/floater_sell_land.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/floater_settings_debug.xml4
-rw-r--r--indra/newview/skins/default/xui/pl/floater_tools.xml10
-rw-r--r--indra/newview/skins/default/xui/pl/floater_tos.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/floater_water.xml103
-rw-r--r--indra/newview/skins/default/xui/pl/floater_web_content.xml14
-rw-r--r--indra/newview/skins/default/xui/pl/floater_windlight_options.xml228
-rw-r--r--indra/newview/skins/default/xui/pl/inspect_avatar.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/language_settings.xml1
-rw-r--r--indra/newview/skins/default/xui/pl/menu_attachment_self.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/menu_avatar_self.xml3
-rw-r--r--indra/newview/skins/default/xui/pl/menu_bottomtray.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/menu_inspect_avatar_gear.xml6
-rw-r--r--indra/newview/skins/default/xui/pl/menu_inspect_self_gear.xml39
-rw-r--r--indra/newview/skins/default/xui/pl/menu_inventory.xml1
-rw-r--r--indra/newview/skins/default/xui/pl/menu_inventory_add.xml1
-rw-r--r--indra/newview/skins/default/xui/pl/menu_inventory_gear_default.xml10
-rw-r--r--indra/newview/skins/default/xui/pl/menu_login.xml3
-rw-r--r--indra/newview/skins/default/xui/pl/menu_media_ctrl.xml6
-rw-r--r--indra/newview/skins/default/xui/pl/menu_mini_map.xml1
-rw-r--r--indra/newview/skins/default/xui/pl/menu_object.xml4
-rw-r--r--indra/newview/skins/default/xui/pl/menu_outfit_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/pl/menu_places_gear_folder.xml5
-rw-r--r--indra/newview/skins/default/xui/pl/menu_places_gear_landmark.xml5
-rw-r--r--indra/newview/skins/default/xui/pl/menu_viewer.xml109
-rw-r--r--indra/newview/skins/default/xui/pl/notifications.xml163
-rw-r--r--indra/newview/skins/default/xui/pl/panel_avatar_list_item.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/panel_edit_alpha.xml16
-rw-r--r--indra/newview/skins/default/xui/pl/panel_edit_gloves.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/panel_edit_jacket.xml4
-rw-r--r--indra/newview/skins/default/xui/pl/panel_edit_pants.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/panel_edit_physics.xml14
-rw-r--r--indra/newview/skins/default/xui/pl/panel_edit_pick.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/panel_edit_profile.xml4
-rw-r--r--indra/newview/skins/default/xui/pl/panel_edit_shirt.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/panel_edit_shoes.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/panel_edit_skirt.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/panel_edit_socks.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/panel_edit_underpants.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/panel_edit_undershirt.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/panel_edit_wearable.xml6
-rw-r--r--indra/newview/skins/default/xui/pl/panel_group_notices.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/panel_login.xml12
-rw-r--r--indra/newview/skins/default/xui/pl/panel_media_settings_security.xml3
-rw-r--r--indra/newview/skins/default/xui/pl/panel_my_profile.xml34
-rw-r--r--indra/newview/skins/default/xui/pl/panel_nearby_media.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/panel_notes.xml35
-rw-r--r--indra/newview/skins/default/xui/pl/panel_notify_textbox.xml11
-rw-r--r--indra/newview/skins/default/xui/pl/panel_people.xml20
-rw-r--r--indra/newview/skins/default/xui/pl/panel_places.xml4
-rw-r--r--indra/newview/skins/default/xui/pl/panel_preferences_advanced.xml29
-rw-r--r--indra/newview/skins/default/xui/pl/panel_preferences_chat.xml50
-rw-r--r--indra/newview/skins/default/xui/pl/panel_preferences_colors.xml41
-rw-r--r--indra/newview/skins/default/xui/pl/panel_preferences_general.xml13
-rw-r--r--indra/newview/skins/default/xui/pl/panel_preferences_graphics1.xml7
-rw-r--r--indra/newview/skins/default/xui/pl/panel_preferences_move.xml24
-rw-r--r--indra/newview/skins/default/xui/pl/panel_preferences_privacy.xml13
-rw-r--r--indra/newview/skins/default/xui/pl/panel_preferences_setup.xml15
-rw-r--r--indra/newview/skins/default/xui/pl/panel_preferences_sound.xml15
-rw-r--r--indra/newview/skins/default/xui/pl/panel_profile.xml53
-rw-r--r--indra/newview/skins/default/xui/pl/panel_profile_view.xml22
-rw-r--r--indra/newview/skins/default/xui/pl/panel_script_ed.xml14
-rw-r--r--indra/newview/skins/default/xui/pl/panel_scrolling_param_base.xml4
-rw-r--r--indra/newview/skins/default/xui/pl/panel_status_bar.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/sidepanel_item_info.xml4
-rw-r--r--indra/newview/skins/default/xui/pl/sidepanel_task_info.xml6
-rw-r--r--indra/newview/skins/default/xui/pl/strings.xml527
-rw-r--r--indra/newview/skins/default/xui/pl/teleport_strings.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/floater_about.xml77
-rw-r--r--indra/newview/skins/default/xui/pt/floater_about_land.xml53
-rw-r--r--indra/newview/skins/default/xui/pt/floater_animation_anim_preview.xml11
-rw-r--r--indra/newview/skins/default/xui/pt/floater_animation_bvh_preview.xml186
-rw-r--r--indra/newview/skins/default/xui/pt/floater_avatar.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_beacons.xml1
-rw-r--r--indra/newview/skins/default/xui/pt/floater_build_options.xml29
-rw-r--r--indra/newview/skins/default/xui/pt/floater_buy_contents.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_buy_currency.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_buy_land.xml14
-rw-r--r--indra/newview/skins/default/xui/pt/floater_camera.xml11
-rw-r--r--indra/newview/skins/default/xui/pt/floater_chat_bar.xml7
-rw-r--r--indra/newview/skins/default/xui/pt/floater_customize.xml530
-rw-r--r--indra/newview/skins/default/xui/pt/floater_day_cycle_options.xml67
-rw-r--r--indra/newview/skins/default/xui/pt/floater_delete_env_preset.xml35
-rw-r--r--indra/newview/skins/default/xui/pt/floater_destinations.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_device_settings.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_edit_day_cycle.xml104
-rw-r--r--indra/newview/skins/default/xui/pt/floater_edit_sky_preset.xml143
-rw-r--r--indra/newview/skins/default/xui/pt/floater_edit_water_preset.xml72
-rw-r--r--indra/newview/skins/default/xui/pt/floater_env_settings.xml27
-rw-r--r--indra/newview/skins/default/xui/pt/floater_environment_settings.xml36
-rw-r--r--indra/newview/skins/default/xui/pt/floater_fast_timers.xml10
-rw-r--r--indra/newview/skins/default/xui/pt/floater_hardware_settings.xml5
-rw-r--r--indra/newview/skins/default/xui/pt/floater_how_to.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_image_preview.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_import_collada.xml23
-rw-r--r--indra/newview/skins/default/xui/pt/floater_inventory_item_properties.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/floater_inventory_view_finder.xml1
-rw-r--r--indra/newview/skins/default/xui/pt/floater_map.xml7
-rw-r--r--indra/newview/skins/default/xui/pt/floater_merchant_outbox.xml27
-rw-r--r--indra/newview/skins/default/xui/pt/floater_model_preview.xml277
-rw-r--r--indra/newview/skins/default/xui/pt/floater_moveview.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/floater_my_appearance.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/floater_my_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_nearby_chat.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_object_weights.xml28
-rw-r--r--indra/newview/skins/default/xui/pt/floater_outfit_save_as.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_pay.xml10
-rw-r--r--indra/newview/skins/default/xui/pt/floater_people.xml7
-rw-r--r--indra/newview/skins/default/xui/pt/floater_picks.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_places.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/floater_preferences.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/floater_preferences_proxy.xml40
-rw-r--r--indra/newview/skins/default/xui/pt/floater_preview_animation.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/floater_preview_classified.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/floater_preview_event.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/floater_preview_gesture.xml23
-rw-r--r--indra/newview/skins/default/xui/pt/floater_price_for_listing.xml18
-rw-r--r--indra/newview/skins/default/xui/pt/floater_region_debug_console.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_search.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_sell_land.xml5
-rw-r--r--indra/newview/skins/default/xui/pt/floater_settings_debug.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/floater_snapshot.xml122
-rw-r--r--indra/newview/skins/default/xui/pt/floater_sound_devices.xml7
-rw-r--r--indra/newview/skins/default/xui/pt/floater_statistics.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_stats.xml26
-rw-r--r--indra/newview/skins/default/xui/pt/floater_test_layout_stacks.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_test_text_vertical_aligment.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_tools.xml95
-rw-r--r--indra/newview/skins/default/xui/pt/floater_top_objects.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/floater_tos.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_toybox.xml11
-rw-r--r--indra/newview/skins/default/xui/pt/floater_translation_settings.xml58
-rw-r--r--indra/newview/skins/default/xui/pt/floater_voice_controls.xml10
-rw-r--r--indra/newview/skins/default/xui/pt/floater_voice_effect.xml129
-rw-r--r--indra/newview/skins/default/xui/pt/floater_water.xml86
-rw-r--r--indra/newview/skins/default/xui/pt/floater_web_content.xml14
-rw-r--r--indra/newview/skins/default/xui/pt/floater_windlight_options.xml187
-rw-r--r--indra/newview/skins/default/xui/pt/inspect_avatar.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/language_settings.xml1
-rw-r--r--indra/newview/skins/default/xui/pt/menu_attachment_self.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/menu_avatar_self.xml3
-rw-r--r--indra/newview/skins/default/xui/pt/menu_bottomtray.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/menu_hide_navbar.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/menu_inspect_avatar_gear.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/menu_inspect_object_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/pt/menu_inspect_self_gear.xml39
-rw-r--r--indra/newview/skins/default/xui/pt/menu_inventory.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/menu_inventory_add.xml3
-rw-r--r--indra/newview/skins/default/xui/pt/menu_inventory_gear_default.xml10
-rw-r--r--indra/newview/skins/default/xui/pt/menu_login.xml5
-rw-r--r--indra/newview/skins/default/xui/pt/menu_media_ctrl.xml7
-rw-r--r--indra/newview/skins/default/xui/pt/menu_mini_map.xml1
-rw-r--r--indra/newview/skins/default/xui/pt/menu_mode_change.xml5
-rw-r--r--indra/newview/skins/default/xui/pt/menu_model_import_gear_default.xml8
-rw-r--r--indra/newview/skins/default/xui/pt/menu_object.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/menu_outfit_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/pt/menu_people_nearby_view_sort.xml5
-rw-r--r--indra/newview/skins/default/xui/pt/menu_places_gear_folder.xml5
-rw-r--r--indra/newview/skins/default/xui/pt/menu_places_gear_landmark.xml5
-rw-r--r--indra/newview/skins/default/xui/pt/menu_toolbars.xml7
-rw-r--r--indra/newview/skins/default/xui/pt/menu_viewer.xml238
-rw-r--r--indra/newview/skins/default/xui/pt/menu_wearing_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/pt/notifications.xml437
-rw-r--r--indra/newview/skins/default/xui/pt/panel_avatar_list_item.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/panel_chiclet_bar.xml15
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_alpha.xml16
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_gloves.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_jacket.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_pants.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_physics.xml14
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_pick.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_profile.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_shirt.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_shoes.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_skin.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_skirt.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_socks.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_underpants.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_undershirt.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_wearable.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/panel_friends.xml20
-rw-r--r--indra/newview/skins/default/xui/pt/panel_group_notices.xml9
-rw-r--r--indra/newview/skins/default/xui/pt/panel_group_roles.xml12
-rw-r--r--indra/newview/skins/default/xui/pt/panel_login.xml9
-rw-r--r--indra/newview/skins/default/xui/pt/panel_me.xml5
-rw-r--r--indra/newview/skins/default/xui/pt/panel_media_settings_security.xml3
-rw-r--r--indra/newview/skins/default/xui/pt/panel_my_profile.xml34
-rw-r--r--indra/newview/skins/default/xui/pt/panel_navigation_bar.xml35
-rw-r--r--indra/newview/skins/default/xui/pt/panel_nearby_chat.xml8
-rw-r--r--indra/newview/skins/default/xui/pt/panel_nearby_media.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/panel_notes.xml35
-rw-r--r--indra/newview/skins/default/xui/pt/panel_notify_textbox.xml11
-rw-r--r--indra/newview/skins/default/xui/pt/panel_outbox_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/panel_outfits_list.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/panel_people.xml20
-rw-r--r--indra/newview/skins/default/xui/pt/panel_place_profile.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/panel_places.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/panel_postcard_message.xml21
-rw-r--r--indra/newview/skins/default/xui/pt/panel_postcard_settings.xml23
-rw-r--r--indra/newview/skins/default/xui/pt/panel_preferences_advanced.xml40
-rw-r--r--indra/newview/skins/default/xui/pt/panel_preferences_chat.xml67
-rw-r--r--indra/newview/skins/default/xui/pt/panel_preferences_colors.xml44
-rw-r--r--indra/newview/skins/default/xui/pt/panel_preferences_general.xml15
-rw-r--r--indra/newview/skins/default/xui/pt/panel_preferences_graphics1.xml19
-rw-r--r--indra/newview/skins/default/xui/pt/panel_preferences_move.xml39
-rw-r--r--indra/newview/skins/default/xui/pt/panel_preferences_privacy.xml11
-rw-r--r--indra/newview/skins/default/xui/pt/panel_preferences_setup.xml35
-rw-r--r--indra/newview/skins/default/xui/pt/panel_preferences_sound.xml41
-rw-r--r--indra/newview/skins/default/xui/pt/panel_profile.xml64
-rw-r--r--indra/newview/skins/default/xui/pt/panel_profile_view.xml22
-rw-r--r--indra/newview/skins/default/xui/pt/panel_region_environment.xml33
-rw-r--r--indra/newview/skins/default/xui/pt/panel_region_estate.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/panel_region_general.xml1
-rw-r--r--indra/newview/skins/default/xui/pt/panel_region_terrain.xml65
-rw-r--r--indra/newview/skins/default/xui/pt/panel_script_ed.xml16
-rw-r--r--indra/newview/skins/default/xui/pt/panel_scrolling_param_base.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/panel_snapshot_inventory.xml21
-rw-r--r--indra/newview/skins/default/xui/pt/panel_snapshot_local.xml39
-rw-r--r--indra/newview/skins/default/xui/pt/panel_snapshot_options.xml7
-rw-r--r--indra/newview/skins/default/xui/pt/panel_snapshot_postcard.xml17
-rw-r--r--indra/newview/skins/default/xui/pt/panel_snapshot_profile.xml28
-rw-r--r--indra/newview/skins/default/xui/pt/panel_sound_devices.xml25
-rw-r--r--indra/newview/skins/default/xui/pt/panel_status_bar.xml11
-rw-r--r--indra/newview/skins/default/xui/pt/sidepanel_inventory.xml21
-rw-r--r--indra/newview/skins/default/xui/pt/sidepanel_task_info.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/strings.xml1088
-rw-r--r--indra/newview/skins/default/xui/pt/teleport_strings.xml4
-rw-r--r--indra/newview/skins/default/xui/ru/floater_aaa.xml9
-rw-r--r--indra/newview/skins/default/xui/ru/floater_about.xml97
-rw-r--r--indra/newview/skins/default/xui/ru/floater_about_land.xml481
-rw-r--r--indra/newview/skins/default/xui/ru/floater_activeim.xml2
-rw-r--r--indra/newview/skins/default/xui/ru/floater_animation_anim_preview.xml11
-rw-r--r--indra/newview/skins/default/xui/ru/floater_animation_bvh_preview.xml186
-rw-r--r--indra/newview/skins/default/xui/ru/floater_animation_preview.xml183
-rw-r--r--indra/newview/skins/default/xui/ru/floater_auction.xml11
-rw-r--r--indra/newview/skins/default/xui/ru/floater_avatar.xml2
-rw-r--r--indra/newview/skins/default/xui/ru/floater_avatar_picker.xml53
-rw-r--r--indra/newview/skins/default/xui/ru/floater_avatar_textures.xml50
-rw-r--r--indra/newview/skins/default/xui/ru/floater_beacons.xml22
-rw-r--r--indra/newview/skins/default/xui/ru/floater_build_options.xml33
-rw-r--r--indra/newview/skins/default/xui/ru/floater_bulk_perms.xml45
-rw-r--r--indra/newview/skins/default/xui/ru/floater_bumps.xml24
-rw-r--r--indra/newview/skins/default/xui/ru/floater_buy_contents.xml21
-rw-r--r--indra/newview/skins/default/xui/ru/floater_buy_currency.xml66
-rw-r--r--indra/newview/skins/default/xui/ru/floater_buy_currency_html.xml2
-rw-r--r--indra/newview/skins/default/xui/ru/floater_buy_land.xml233
-rw-r--r--indra/newview/skins/default/xui/ru/floater_buy_object.xml29
-rw-r--r--indra/newview/skins/default/xui/ru/floater_camera.xml56
-rw-r--r--indra/newview/skins/default/xui/ru/floater_chat_bar.xml7
-rw-r--r--indra/newview/skins/default/xui/ru/floater_choose_group.xml8
-rw-r--r--indra/newview/skins/default/xui/ru/floater_color_picker.xml30
-rw-r--r--indra/newview/skins/default/xui/ru/floater_critical.xml10
-rw-r--r--indra/newview/skins/default/xui/ru/floater_delete_env_preset.xml35
-rw-r--r--indra/newview/skins/default/xui/ru/floater_destinations.xml2
-rw-r--r--indra/newview/skins/default/xui/ru/floater_display_name.xml18
-rw-r--r--indra/newview/skins/default/xui/ru/floater_edit_day_cycle.xml104
-rw-r--r--indra/newview/skins/default/xui/ru/floater_edit_sky_preset.xml143
-rw-r--r--indra/newview/skins/default/xui/ru/floater_edit_water_preset.xml72
-rw-r--r--indra/newview/skins/default/xui/ru/floater_env_settings.xml25
-rw-r--r--indra/newview/skins/default/xui/ru/floater_environment_settings.xml36
-rw-r--r--indra/newview/skins/default/xui/ru/floater_event.xml9
-rw-r--r--indra/newview/skins/default/xui/ru/floater_fast_timers.xml10
-rw-r--r--indra/newview/skins/default/xui/ru/floater_font_test.xml2
-rw-r--r--indra/newview/skins/default/xui/ru/floater_gesture.xml26
-rw-r--r--indra/newview/skins/default/xui/ru/floater_god_tools.xml96
-rw-r--r--indra/newview/skins/default/xui/ru/floater_hardware_settings.xml31
-rw-r--r--indra/newview/skins/default/xui/ru/floater_help_browser.xml6
-rw-r--r--indra/newview/skins/default/xui/ru/floater_how_to.xml2
-rw-r--r--indra/newview/skins/default/xui/ru/floater_hud.xml2
-rw-r--r--indra/newview/skins/default/xui/ru/floater_im_container.xml2
-rw-r--r--indra/newview/skins/default/xui/ru/floater_im_session.xml8
-rw-r--r--indra/newview/skins/default/xui/ru/floater_image_preview.xml31
-rw-r--r--indra/newview/skins/default/xui/ru/floater_import_collada.xml23
-rw-r--r--indra/newview/skins/default/xui/ru/floater_incoming_call.xml33
-rw-r--r--indra/newview/skins/default/xui/ru/floater_inspect.xml14
-rw-r--r--indra/newview/skins/default/xui/ru/floater_inventory.xml4
-rw-r--r--indra/newview/skins/default/xui/ru/floater_inventory_item_properties.xml67
-rw-r--r--indra/newview/skins/default/xui/ru/floater_inventory_view_finder.xml25
-rw-r--r--indra/newview/skins/default/xui/ru/floater_joystick.xml79
-rw-r--r--indra/newview/skins/default/xui/ru/floater_lagmeter.xml151
-rw-r--r--indra/newview/skins/default/xui/ru/floater_land_holdings.xml39
-rw-r--r--indra/newview/skins/default/xui/ru/floater_live_lsleditor.xml15
-rw-r--r--indra/newview/skins/default/xui/ru/floater_lsl_guide.xml7
-rw-r--r--indra/newview/skins/default/xui/ru/floater_map.xml36
-rw-r--r--indra/newview/skins/default/xui/ru/floater_media_browser.xml30
-rw-r--r--indra/newview/skins/default/xui/ru/floater_media_settings.xml6
-rw-r--r--indra/newview/skins/default/xui/ru/floater_mem_leaking.xml18
-rw-r--r--indra/newview/skins/default/xui/ru/floater_merchant_outbox.xml27
-rw-r--r--indra/newview/skins/default/xui/ru/floater_model_preview.xml277
-rw-r--r--indra/newview/skins/default/xui/ru/floater_moveview.xml75
-rw-r--r--indra/newview/skins/default/xui/ru/floater_mute_object.xml14
-rw-r--r--indra/newview/skins/default/xui/ru/floater_my_appearance.xml4
-rw-r--r--indra/newview/skins/default/xui/ru/floater_my_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/ru/floater_nearby_chat.xml4
-rw-r--r--indra/newview/skins/default/xui/ru/floater_notification.xml7
-rw-r--r--indra/newview/skins/default/xui/ru/floater_notifications_console.xml5
-rw-r--r--indra/newview/skins/default/xui/ru/floater_object_weights.xml28
-rw-r--r--indra/newview/skins/default/xui/ru/floater_openobject.xml8
-rw-r--r--indra/newview/skins/default/xui/ru/floater_outfit_save_as.xml12
-rw-r--r--indra/newview/skins/default/xui/ru/floater_outgoing_call.xml40
-rw-r--r--indra/newview/skins/default/xui/ru/floater_pay.xml21
-rw-r--r--indra/newview/skins/default/xui/ru/floater_pay_object.xml28
-rw-r--r--indra/newview/skins/default/xui/ru/floater_people.xml7
-rw-r--r--indra/newview/skins/default/xui/ru/floater_perm_prefs.xml15
-rw-r--r--indra/newview/skins/default/xui/ru/floater_picks.xml2
-rw-r--r--indra/newview/skins/default/xui/ru/floater_places.xml4
-rw-r--r--indra/newview/skins/default/xui/ru/floater_post_process.xml53
-rw-r--r--indra/newview/skins/default/xui/ru/floater_postcard.xml33
-rw-r--r--indra/newview/skins/default/xui/ru/floater_preferences.xml17
-rw-r--r--indra/newview/skins/default/xui/ru/floater_preferences_proxy.xml40
-rw-r--r--indra/newview/skins/default/xui/ru/floater_preview_animation.xml11
-rw-r--r--indra/newview/skins/default/xui/ru/floater_preview_gesture.xml73
-rw-r--r--indra/newview/skins/default/xui/ru/floater_preview_notecard.xml20
-rw-r--r--indra/newview/skins/default/xui/ru/floater_preview_sound.xml11
-rw-r--r--indra/newview/skins/default/xui/ru/floater_preview_texture.xml47
-rw-r--r--indra/newview/skins/default/xui/ru/floater_price_for_listing.xml18
-rw-r--r--indra/newview/skins/default/xui/ru/floater_publish_classified.xml11
-rw-r--r--indra/newview/skins/default/xui/ru/floater_region_debug_console.xml2
-rw-r--r--indra/newview/skins/default/xui/ru/floater_region_info.xml2
-rw-r--r--indra/newview/skins/default/xui/ru/floater_report_abuse.xml94
-rw-r--r--indra/newview/skins/default/xui/ru/floater_script_debug.xml2
-rw-r--r--indra/newview/skins/default/xui/ru/floater_script_debug_panel.xml2
-rw-r--r--indra/newview/skins/default/xui/ru/floater_script_limits.xml2
-rw-r--r--indra/newview/skins/default/xui/ru/floater_script_preview.xml9
-rw-r--r--indra/newview/skins/default/xui/ru/floater_script_queue.xml19
-rw-r--r--indra/newview/skins/default/xui/ru/floater_script_search.xml13
-rw-r--r--indra/newview/skins/default/xui/ru/floater_search.xml16
-rw-r--r--indra/newview/skins/default/xui/ru/floater_select_key.xml7
-rw-r--r--indra/newview/skins/default/xui/ru/floater_sell_land.xml65
-rw-r--r--indra/newview/skins/default/xui/ru/floater_settings_debug.xml13
-rw-r--r--indra/newview/skins/default/xui/ru/floater_snapshot.xml65
-rw-r--r--indra/newview/skins/default/xui/ru/floater_sound_devices.xml7
-rw-r--r--indra/newview/skins/default/xui/ru/floater_sound_preview.xml11
-rw-r--r--indra/newview/skins/default/xui/ru/floater_stats.xml79
-rw-r--r--indra/newview/skins/default/xui/ru/floater_sys_well.xml9
-rw-r--r--indra/newview/skins/default/xui/ru/floater_telehub.xml29
-rw-r--r--indra/newview/skins/default/xui/ru/floater_test_layout_stacks.xml2
-rw-r--r--indra/newview/skins/default/xui/ru/floater_test_text_vertical_aligment.xml2
-rw-r--r--indra/newview/skins/default/xui/ru/floater_texture_ctrl.xml23
-rw-r--r--indra/newview/skins/default/xui/ru/floater_tools.xml511
-rw-r--r--indra/newview/skins/default/xui/ru/floater_top_objects.xml55
-rw-r--r--indra/newview/skins/default/xui/ru/floater_tos.xml15
-rw-r--r--indra/newview/skins/default/xui/ru/floater_toybox.xml11
-rw-r--r--indra/newview/skins/default/xui/ru/floater_translation_settings.xml58
-rw-r--r--indra/newview/skins/default/xui/ru/floater_url_entry.xml12
-rw-r--r--indra/newview/skins/default/xui/ru/floater_voice_controls.xml30
-rw-r--r--indra/newview/skins/default/xui/ru/floater_voice_effect.xml159
-rw-r--r--indra/newview/skins/default/xui/ru/floater_water.xml70
-rw-r--r--indra/newview/skins/default/xui/ru/floater_web_content.xml14
-rw-r--r--indra/newview/skins/default/xui/ru/floater_whitelist_entry.xml9
-rw-r--r--indra/newview/skins/default/xui/ru/floater_windlight_options.xml167
-rw-r--r--indra/newview/skins/default/xui/ru/floater_window_size.xml17
-rw-r--r--indra/newview/skins/default/xui/ru/floater_world_map.xml73
-rw-r--r--indra/newview/skins/default/xui/ru/inspect_avatar.xml25
-rw-r--r--indra/newview/skins/default/xui/ru/inspect_group.xml32
-rw-r--r--indra/newview/skins/default/xui/ru/inspect_object.xml44
-rw-r--r--indra/newview/skins/default/xui/ru/inspect_remote_object.xml22
-rw-r--r--indra/newview/skins/default/xui/ru/menu_add_wearable_gear.xml6
-rw-r--r--indra/newview/skins/default/xui/ru/menu_attachment_other.xml17
-rw-r--r--indra/newview/skins/default/xui/ru/menu_attachment_self.xml16
-rw-r--r--indra/newview/skins/default/xui/ru/menu_avatar_icon.xml7
-rw-r--r--indra/newview/skins/default/xui/ru/menu_avatar_other.xml16
-rw-r--r--indra/newview/skins/default/xui/ru/menu_avatar_self.xml32
-rw-r--r--indra/newview/skins/default/xui/ru/menu_bottomtray.xml17
-rw-r--r--indra/newview/skins/default/xui/ru/menu_cof_attachment.xml4
-rw-r--r--indra/newview/skins/default/xui/ru/menu_cof_body_part.xml5
-rw-r--r--indra/newview/skins/default/xui/ru/menu_cof_clothing.xml6
-rw-r--r--indra/newview/skins/default/xui/ru/menu_cof_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/ru/menu_edit.xml12
-rw-r--r--indra/newview/skins/default/xui/ru/menu_favorites.xml10
-rw-r--r--indra/newview/skins/default/xui/ru/menu_gesture_gear.xml9
-rw-r--r--indra/newview/skins/default/xui/ru/menu_group_plus.xml5
-rw-r--r--indra/newview/skins/default/xui/ru/menu_hide_navbar.xml6
-rw-r--r--indra/newview/skins/default/xui/ru/menu_im_well_button.xml4
-rw-r--r--indra/newview/skins/default/xui/ru/menu_imchiclet_adhoc.xml4
-rw-r--r--indra/newview/skins/default/xui/ru/menu_imchiclet_group.xml6
-rw-r--r--indra/newview/skins/default/xui/ru/menu_imchiclet_p2p.xml7
-rw-r--r--indra/newview/skins/default/xui/ru/menu_inspect_avatar_gear.xml21
-rw-r--r--indra/newview/skins/default/xui/ru/menu_inspect_object_gear.xml19
-rw-r--r--indra/newview/skins/default/xui/ru/menu_inspect_self_gear.xml31
-rw-r--r--indra/newview/skins/default/xui/ru/menu_inv_offer_chiclet.xml4
-rw-r--r--indra/newview/skins/default/xui/ru/menu_inventory.xml90
-rw-r--r--indra/newview/skins/default/xui/ru/menu_inventory_add.xml36
-rw-r--r--indra/newview/skins/default/xui/ru/menu_inventory_gear_default.xml17
-rw-r--r--indra/newview/skins/default/xui/ru/menu_land.xml9
-rw-r--r--indra/newview/skins/default/xui/ru/menu_landmark.xml7
-rw-r--r--indra/newview/skins/default/xui/ru/menu_login.xml25
-rw-r--r--indra/newview/skins/default/xui/ru/menu_media_ctrl.xml7
-rw-r--r--indra/newview/skins/default/xui/ru/menu_mini_map.xml11
-rw-r--r--indra/newview/skins/default/xui/ru/menu_mode_change.xml5
-rw-r--r--indra/newview/skins/default/xui/ru/menu_model_import_gear_default.xml8
-rw-r--r--indra/newview/skins/default/xui/ru/menu_navbar.xml11
-rw-r--r--indra/newview/skins/default/xui/ru/menu_nearby_chat.xml9
-rw-r--r--indra/newview/skins/default/xui/ru/menu_notification_well_button.xml4
-rw-r--r--indra/newview/skins/default/xui/ru/menu_object.xml27
-rw-r--r--indra/newview/skins/default/xui/ru/menu_object_icon.xml5
-rw-r--r--indra/newview/skins/default/xui/ru/menu_outfit_gear.xml28
-rw-r--r--indra/newview/skins/default/xui/ru/menu_outfit_tab.xml9
-rw-r--r--indra/newview/skins/default/xui/ru/menu_participant_list.xml21
-rw-r--r--indra/newview/skins/default/xui/ru/menu_people_friends_view_sort.xml8
-rw-r--r--indra/newview/skins/default/xui/ru/menu_people_groups.xml8
-rw-r--r--indra/newview/skins/default/xui/ru/menu_people_groups_view_sort.xml5
-rw-r--r--indra/newview/skins/default/xui/ru/menu_people_nearby.xml13
-rw-r--r--indra/newview/skins/default/xui/ru/menu_people_nearby_multiselect.xml10
-rw-r--r--indra/newview/skins/default/xui/ru/menu_people_nearby_view_sort.xml9
-rw-r--r--indra/newview/skins/default/xui/ru/menu_people_recent_view_sort.xml7
-rw-r--r--indra/newview/skins/default/xui/ru/menu_picks.xml8
-rw-r--r--indra/newview/skins/default/xui/ru/menu_picks_plus.xml5
-rw-r--r--indra/newview/skins/default/xui/ru/menu_place.xml5
-rw-r--r--indra/newview/skins/default/xui/ru/menu_place_add_button.xml5
-rw-r--r--indra/newview/skins/default/xui/ru/menu_places_gear_folder.xml16
-rw-r--r--indra/newview/skins/default/xui/ru/menu_places_gear_landmark.xml19
-rw-r--r--indra/newview/skins/default/xui/ru/menu_profile_overflow.xml12
-rw-r--r--indra/newview/skins/default/xui/ru/menu_save_outfit.xml5
-rw-r--r--indra/newview/skins/default/xui/ru/menu_script_chiclet.xml4
-rw-r--r--indra/newview/skins/default/xui/ru/menu_slurl.xml6
-rw-r--r--indra/newview/skins/default/xui/ru/menu_teleport_history_gear.xml6
-rw-r--r--indra/newview/skins/default/xui/ru/menu_teleport_history_item.xml6
-rw-r--r--indra/newview/skins/default/xui/ru/menu_teleport_history_tab.xml5
-rw-r--r--indra/newview/skins/default/xui/ru/menu_text_editor.xml8
-rw-r--r--indra/newview/skins/default/xui/ru/menu_toolbars.xml7
-rw-r--r--indra/newview/skins/default/xui/ru/menu_topinfobar.xml7
-rw-r--r--indra/newview/skins/default/xui/ru/menu_url_agent.xml6
-rw-r--r--indra/newview/skins/default/xui/ru/menu_url_group.xml6
-rw-r--r--indra/newview/skins/default/xui/ru/menu_url_http.xml7
-rw-r--r--indra/newview/skins/default/xui/ru/menu_url_inventory.xml6
-rw-r--r--indra/newview/skins/default/xui/ru/menu_url_map.xml6
-rw-r--r--indra/newview/skins/default/xui/ru/menu_url_objectim.xml8
-rw-r--r--indra/newview/skins/default/xui/ru/menu_url_parcel.xml6
-rw-r--r--indra/newview/skins/default/xui/ru/menu_url_slapp.xml5
-rw-r--r--indra/newview/skins/default/xui/ru/menu_url_slurl.xml7
-rw-r--r--indra/newview/skins/default/xui/ru/menu_url_teleport.xml6
-rw-r--r--indra/newview/skins/default/xui/ru/menu_viewer.xml459
-rw-r--r--indra/newview/skins/default/xui/ru/menu_wearable_list_item.xml14
-rw-r--r--indra/newview/skins/default/xui/ru/menu_wearing_gear.xml6
-rw-r--r--indra/newview/skins/default/xui/ru/menu_wearing_tab.xml6
-rw-r--r--indra/newview/skins/default/xui/ru/mime_types.xml217
-rw-r--r--indra/newview/skins/default/xui/ru/mime_types_linux.xml217
-rw-r--r--indra/newview/skins/default/xui/ru/mime_types_mac.xml217
-rw-r--r--indra/newview/skins/default/xui/ru/notifications.xml3125
-rw-r--r--indra/newview/skins/default/xui/ru/panel_active_object_row.xml6
-rw-r--r--indra/newview/skins/default/xui/ru/panel_adhoc_control_panel.xml14
-rw-r--r--indra/newview/skins/default/xui/ru/panel_avatar_list_item.xml31
-rw-r--r--indra/newview/skins/default/xui/ru/panel_avatar_tag.xml12
-rw-r--r--indra/newview/skins/default/xui/ru/panel_block_list_sidetray.xml10
-rw-r--r--indra/newview/skins/default/xui/ru/panel_body_parts_list_item.xml8
-rw-r--r--indra/newview/skins/default/xui/ru/panel_bodyparts_list_button_bar.xml4
-rw-r--r--indra/newview/skins/default/xui/ru/panel_bottomtray.xml47
-rw-r--r--indra/newview/skins/default/xui/ru/panel_bottomtray_lite.xml8
-rw-r--r--indra/newview/skins/default/xui/ru/panel_chat_header.xml4
-rw-r--r--indra/newview/skins/default/xui/ru/panel_chiclet_bar.xml15
-rw-r--r--indra/newview/skins/default/xui/ru/panel_classified_info.xml67
-rw-r--r--indra/newview/skins/default/xui/ru/panel_clothing_list_button_bar.xml4
-rw-r--r--indra/newview/skins/default/xui/ru/panel_clothing_list_item.xml9
-rw-r--r--indra/newview/skins/default/xui/ru/panel_cof_wearables.xml8
-rw-r--r--indra/newview/skins/default/xui/ru/panel_deletable_wearable_list_item.xml5
-rw-r--r--indra/newview/skins/default/xui/ru/panel_dummy_clothing_list_item.xml7
-rw-r--r--indra/newview/skins/default/xui/ru/panel_edit_alpha.xml12
-rw-r--r--indra/newview/skins/default/xui/ru/panel_edit_classified.xml54
-rw-r--r--indra/newview/skins/default/xui/ru/panel_edit_eyes.xml11
-rw-r--r--indra/newview/skins/default/xui/ru/panel_edit_gloves.xml12
-rw-r--r--indra/newview/skins/default/xui/ru/panel_edit_hair.xml14
-rw-r--r--indra/newview/skins/default/xui/ru/panel_edit_jacket.xml13
-rw-r--r--indra/newview/skins/default/xui/ru/panel_edit_pants.xml12
-rw-r--r--indra/newview/skins/default/xui/ru/panel_edit_physics.xml14
-rw-r--r--indra/newview/skins/default/xui/ru/panel_edit_pick.xml37
-rw-r--r--indra/newview/skins/default/xui/ru/panel_edit_profile.xml68
-rw-r--r--indra/newview/skins/default/xui/ru/panel_edit_shape.xml25
-rw-r--r--indra/newview/skins/default/xui/ru/panel_edit_shirt.xml12
-rw-r--r--indra/newview/skins/default/xui/ru/panel_edit_shoes.xml12
-rw-r--r--indra/newview/skins/default/xui/ru/panel_edit_skin.xml16
-rw-r--r--indra/newview/skins/default/xui/ru/panel_edit_skirt.xml12
-rw-r--r--indra/newview/skins/default/xui/ru/panel_edit_socks.xml12
-rw-r--r--indra/newview/skins/default/xui/ru/panel_edit_tattoo.xml9
-rw-r--r--indra/newview/skins/default/xui/ru/panel_edit_underpants.xml12
-rw-r--r--indra/newview/skins/default/xui/ru/panel_edit_undershirt.xml12
-rw-r--r--indra/newview/skins/default/xui/ru/panel_edit_wearable.xml120
-rw-r--r--indra/newview/skins/default/xui/ru/panel_group_control_panel.xml17
-rw-r--r--indra/newview/skins/default/xui/ru/panel_group_general.xml56
-rw-r--r--indra/newview/skins/default/xui/ru/panel_group_info_sidetray.xml41
-rw-r--r--indra/newview/skins/default/xui/ru/panel_group_invite.xml27
-rw-r--r--indra/newview/skins/default/xui/ru/panel_group_land_money.xml85
-rw-r--r--indra/newview/skins/default/xui/ru/panel_group_list_item.xml5
-rw-r--r--indra/newview/skins/default/xui/ru/panel_group_notices.xml61
-rw-r--r--indra/newview/skins/default/xui/ru/panel_group_notify.xml12
-rw-r--r--indra/newview/skins/default/xui/ru/panel_group_roles.xml95
-rw-r--r--indra/newview/skins/default/xui/ru/panel_im_control_panel.xml29
-rw-r--r--indra/newview/skins/default/xui/ru/panel_instant_message.xml9
-rw-r--r--indra/newview/skins/default/xui/ru/panel_inventory_item.xml4
-rw-r--r--indra/newview/skins/default/xui/ru/panel_landmark_info.xml41
-rw-r--r--indra/newview/skins/default/xui/ru/panel_landmarks.xml22
-rw-r--r--indra/newview/skins/default/xui/ru/panel_login.xml48
-rw-r--r--indra/newview/skins/default/xui/ru/panel_main_inventory.xml28
-rw-r--r--indra/newview/skins/default/xui/ru/panel_me.xml4
-rw-r--r--indra/newview/skins/default/xui/ru/panel_media_settings_general.xml32
-rw-r--r--indra/newview/skins/default/xui/ru/panel_media_settings_permissions.xml29
-rw-r--r--indra/newview/skins/default/xui/ru/panel_media_settings_security.xml12
-rw-r--r--indra/newview/skins/default/xui/ru/panel_navigation_bar.xml23
-rw-r--r--indra/newview/skins/default/xui/ru/panel_nearby_chat.xml8
-rw-r--r--indra/newview/skins/default/xui/ru/panel_nearby_chat_bar.xml5
-rw-r--r--indra/newview/skins/default/xui/ru/panel_nearby_media.xml70
-rw-r--r--indra/newview/skins/default/xui/ru/panel_notify_textbox.xml11
-rw-r--r--indra/newview/skins/default/xui/ru/panel_online_status_toast.xml2
-rw-r--r--indra/newview/skins/default/xui/ru/panel_outbox_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/ru/panel_outfit_edit.xml57
-rw-r--r--indra/newview/skins/default/xui/ru/panel_outfits_inventory.xml23
-rw-r--r--indra/newview/skins/default/xui/ru/panel_outfits_inventory_gear_default.xml8
-rw-r--r--indra/newview/skins/default/xui/ru/panel_outfits_list.xml11
-rw-r--r--indra/newview/skins/default/xui/ru/panel_outfits_wearing.xml6
-rw-r--r--indra/newview/skins/default/xui/ru/panel_people.xml94
-rw-r--r--indra/newview/skins/default/xui/ru/panel_pick_info.xml24
-rw-r--r--indra/newview/skins/default/xui/ru/panel_picks.xml29
-rw-r--r--indra/newview/skins/default/xui/ru/panel_place_profile.xml118
-rw-r--r--indra/newview/skins/default/xui/ru/panel_places.xml48
-rw-r--r--indra/newview/skins/default/xui/ru/panel_postcard_message.xml21
-rw-r--r--indra/newview/skins/default/xui/ru/panel_postcard_settings.xml23
-rw-r--r--indra/newview/skins/default/xui/ru/panel_preferences_advanced.xml31
-rw-r--r--indra/newview/skins/default/xui/ru/panel_preferences_alerts.xml14
-rw-r--r--indra/newview/skins/default/xui/ru/panel_preferences_chat.xml33
-rw-r--r--indra/newview/skins/default/xui/ru/panel_preferences_colors.xml44
-rw-r--r--indra/newview/skins/default/xui/ru/panel_preferences_general.xml76
-rw-r--r--indra/newview/skins/default/xui/ru/panel_preferences_graphics1.xml114
-rw-r--r--indra/newview/skins/default/xui/ru/panel_preferences_move.xml39
-rw-r--r--indra/newview/skins/default/xui/ru/panel_preferences_privacy.xml30
-rw-r--r--indra/newview/skins/default/xui/ru/panel_preferences_setup.xml36
-rw-r--r--indra/newview/skins/default/xui/ru/panel_preferences_sound.xml40
-rw-r--r--indra/newview/skins/default/xui/ru/panel_prim_media_controls.xml91
-rw-r--r--indra/newview/skins/default/xui/ru/panel_region_covenant.xml79
-rw-r--r--indra/newview/skins/default/xui/ru/panel_region_debug.xml34
-rw-r--r--indra/newview/skins/default/xui/ru/panel_region_environment.xml33
-rw-r--r--indra/newview/skins/default/xui/ru/panel_region_estate.xml52
-rw-r--r--indra/newview/skins/default/xui/ru/panel_region_general.xml44
-rw-r--r--indra/newview/skins/default/xui/ru/panel_region_terrain.xml60
-rw-r--r--indra/newview/skins/default/xui/ru/panel_region_texture.xml54
-rw-r--r--indra/newview/skins/default/xui/ru/panel_script_ed.xml49
-rw-r--r--indra/newview/skins/default/xui/ru/panel_script_limits_my_avatar.xml16
-rw-r--r--indra/newview/skins/default/xui/ru/panel_script_limits_region_memory.xml20
-rw-r--r--indra/newview/skins/default/xui/ru/panel_scrolling_param.xml10
-rw-r--r--indra/newview/skins/default/xui/ru/panel_scrolling_param_base.xml4
-rw-r--r--indra/newview/skins/default/xui/ru/panel_side_tray.xml29
-rw-r--r--indra/newview/skins/default/xui/ru/panel_side_tray_tab_caption.xml7
-rw-r--r--indra/newview/skins/default/xui/ru/panel_snapshot_inventory.xml21
-rw-r--r--indra/newview/skins/default/xui/ru/panel_snapshot_local.xml39
-rw-r--r--indra/newview/skins/default/xui/ru/panel_snapshot_options.xml7
-rw-r--r--indra/newview/skins/default/xui/ru/panel_snapshot_postcard.xml17
-rw-r--r--indra/newview/skins/default/xui/ru/panel_snapshot_profile.xml28
-rw-r--r--indra/newview/skins/default/xui/ru/panel_sound_devices.xml25
-rw-r--r--indra/newview/skins/default/xui/ru/panel_stand_stop_flying.xml6
-rw-r--r--indra/newview/skins/default/xui/ru/panel_status_bar.xml28
-rw-r--r--indra/newview/skins/default/xui/ru/panel_teleport_history.xml19
-rw-r--r--indra/newview/skins/default/xui/ru/panel_teleport_history_item.xml5
-rw-r--r--indra/newview/skins/default/xui/ru/panel_voice_effect.xml15
-rw-r--r--indra/newview/skins/default/xui/ru/panel_world_map.xml63
-rw-r--r--indra/newview/skins/default/xui/ru/role_actions.xml73
-rw-r--r--indra/newview/skins/default/xui/ru/sidepanel_appearance.xml19
-rw-r--r--indra/newview/skins/default/xui/ru/sidepanel_inventory.xml42
-rw-r--r--indra/newview/skins/default/xui/ru/sidepanel_item_info.xml76
-rw-r--r--indra/newview/skins/default/xui/ru/sidepanel_task_info.xml123
-rw-r--r--indra/newview/skins/default/xui/ru/strings.xml5024
-rw-r--r--indra/newview/skins/default/xui/ru/teleport_strings.xml84
-rw-r--r--indra/newview/skins/default/xui/tr/floater_aaa.xml9
-rw-r--r--indra/newview/skins/default/xui/tr/floater_about.xml98
-rw-r--r--indra/newview/skins/default/xui/tr/floater_about_land.xml481
-rw-r--r--indra/newview/skins/default/xui/tr/floater_activeim.xml2
-rw-r--r--indra/newview/skins/default/xui/tr/floater_animation_anim_preview.xml11
-rw-r--r--indra/newview/skins/default/xui/tr/floater_animation_bvh_preview.xml186
-rw-r--r--indra/newview/skins/default/xui/tr/floater_animation_preview.xml186
-rw-r--r--indra/newview/skins/default/xui/tr/floater_auction.xml11
-rw-r--r--indra/newview/skins/default/xui/tr/floater_avatar.xml2
-rw-r--r--indra/newview/skins/default/xui/tr/floater_avatar_picker.xml53
-rw-r--r--indra/newview/skins/default/xui/tr/floater_avatar_textures.xml50
-rw-r--r--indra/newview/skins/default/xui/tr/floater_beacons.xml22
-rw-r--r--indra/newview/skins/default/xui/tr/floater_build_options.xml33
-rw-r--r--indra/newview/skins/default/xui/tr/floater_bulk_perms.xml45
-rw-r--r--indra/newview/skins/default/xui/tr/floater_bumps.xml24
-rw-r--r--indra/newview/skins/default/xui/tr/floater_buy_contents.xml21
-rw-r--r--indra/newview/skins/default/xui/tr/floater_buy_currency.xml66
-rw-r--r--indra/newview/skins/default/xui/tr/floater_buy_currency_html.xml2
-rw-r--r--indra/newview/skins/default/xui/tr/floater_buy_land.xml233
-rw-r--r--indra/newview/skins/default/xui/tr/floater_buy_object.xml29
-rw-r--r--indra/newview/skins/default/xui/tr/floater_camera.xml56
-rw-r--r--indra/newview/skins/default/xui/tr/floater_chat_bar.xml7
-rw-r--r--indra/newview/skins/default/xui/tr/floater_choose_group.xml8
-rw-r--r--indra/newview/skins/default/xui/tr/floater_color_picker.xml30
-rw-r--r--indra/newview/skins/default/xui/tr/floater_critical.xml10
-rw-r--r--indra/newview/skins/default/xui/tr/floater_delete_env_preset.xml35
-rw-r--r--indra/newview/skins/default/xui/tr/floater_destinations.xml2
-rw-r--r--indra/newview/skins/default/xui/tr/floater_display_name.xml18
-rw-r--r--indra/newview/skins/default/xui/tr/floater_edit_day_cycle.xml104
-rw-r--r--indra/newview/skins/default/xui/tr/floater_edit_sky_preset.xml143
-rw-r--r--indra/newview/skins/default/xui/tr/floater_edit_water_preset.xml72
-rw-r--r--indra/newview/skins/default/xui/tr/floater_env_settings.xml25
-rw-r--r--indra/newview/skins/default/xui/tr/floater_environment_settings.xml36
-rw-r--r--indra/newview/skins/default/xui/tr/floater_event.xml9
-rw-r--r--indra/newview/skins/default/xui/tr/floater_fast_timers.xml10
-rw-r--r--indra/newview/skins/default/xui/tr/floater_font_test.xml2
-rw-r--r--indra/newview/skins/default/xui/tr/floater_gesture.xml26
-rw-r--r--indra/newview/skins/default/xui/tr/floater_god_tools.xml96
-rw-r--r--indra/newview/skins/default/xui/tr/floater_hardware_settings.xml31
-rw-r--r--indra/newview/skins/default/xui/tr/floater_help_browser.xml6
-rw-r--r--indra/newview/skins/default/xui/tr/floater_how_to.xml2
-rw-r--r--indra/newview/skins/default/xui/tr/floater_hud.xml2
-rw-r--r--indra/newview/skins/default/xui/tr/floater_im_container.xml2
-rw-r--r--indra/newview/skins/default/xui/tr/floater_im_session.xml8
-rw-r--r--indra/newview/skins/default/xui/tr/floater_image_preview.xml32
-rw-r--r--indra/newview/skins/default/xui/tr/floater_import_collada.xml23
-rw-r--r--indra/newview/skins/default/xui/tr/floater_incoming_call.xml33
-rw-r--r--indra/newview/skins/default/xui/tr/floater_inspect.xml14
-rw-r--r--indra/newview/skins/default/xui/tr/floater_inventory.xml4
-rw-r--r--indra/newview/skins/default/xui/tr/floater_inventory_item_properties.xml67
-rw-r--r--indra/newview/skins/default/xui/tr/floater_inventory_view_finder.xml25
-rw-r--r--indra/newview/skins/default/xui/tr/floater_joystick.xml79
-rw-r--r--indra/newview/skins/default/xui/tr/floater_lagmeter.xml151
-rw-r--r--indra/newview/skins/default/xui/tr/floater_land_holdings.xml39
-rw-r--r--indra/newview/skins/default/xui/tr/floater_live_lsleditor.xml15
-rw-r--r--indra/newview/skins/default/xui/tr/floater_lsl_guide.xml7
-rw-r--r--indra/newview/skins/default/xui/tr/floater_map.xml36
-rw-r--r--indra/newview/skins/default/xui/tr/floater_media_browser.xml30
-rw-r--r--indra/newview/skins/default/xui/tr/floater_media_settings.xml6
-rw-r--r--indra/newview/skins/default/xui/tr/floater_mem_leaking.xml18
-rw-r--r--indra/newview/skins/default/xui/tr/floater_merchant_outbox.xml27
-rw-r--r--indra/newview/skins/default/xui/tr/floater_model_preview.xml277
-rw-r--r--indra/newview/skins/default/xui/tr/floater_moveview.xml75
-rw-r--r--indra/newview/skins/default/xui/tr/floater_mute_object.xml14
-rw-r--r--indra/newview/skins/default/xui/tr/floater_my_appearance.xml4
-rw-r--r--indra/newview/skins/default/xui/tr/floater_my_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/tr/floater_nearby_chat.xml4
-rw-r--r--indra/newview/skins/default/xui/tr/floater_notification.xml7
-rw-r--r--indra/newview/skins/default/xui/tr/floater_notifications_console.xml5
-rw-r--r--indra/newview/skins/default/xui/tr/floater_object_weights.xml28
-rw-r--r--indra/newview/skins/default/xui/tr/floater_openobject.xml8
-rw-r--r--indra/newview/skins/default/xui/tr/floater_outfit_save_as.xml12
-rw-r--r--indra/newview/skins/default/xui/tr/floater_outgoing_call.xml40
-rw-r--r--indra/newview/skins/default/xui/tr/floater_pay.xml21
-rw-r--r--indra/newview/skins/default/xui/tr/floater_pay_object.xml28
-rw-r--r--indra/newview/skins/default/xui/tr/floater_people.xml7
-rw-r--r--indra/newview/skins/default/xui/tr/floater_perm_prefs.xml15
-rw-r--r--indra/newview/skins/default/xui/tr/floater_picks.xml2
-rw-r--r--indra/newview/skins/default/xui/tr/floater_places.xml4
-rw-r--r--indra/newview/skins/default/xui/tr/floater_post_process.xml53
-rw-r--r--indra/newview/skins/default/xui/tr/floater_postcard.xml33
-rw-r--r--indra/newview/skins/default/xui/tr/floater_preferences.xml17
-rw-r--r--indra/newview/skins/default/xui/tr/floater_preferences_proxy.xml40
-rw-r--r--indra/newview/skins/default/xui/tr/floater_preview_animation.xml11
-rw-r--r--indra/newview/skins/default/xui/tr/floater_preview_gesture.xml73
-rw-r--r--indra/newview/skins/default/xui/tr/floater_preview_notecard.xml20
-rw-r--r--indra/newview/skins/default/xui/tr/floater_preview_sound.xml11
-rw-r--r--indra/newview/skins/default/xui/tr/floater_preview_texture.xml47
-rw-r--r--indra/newview/skins/default/xui/tr/floater_price_for_listing.xml18
-rw-r--r--indra/newview/skins/default/xui/tr/floater_publish_classified.xml11
-rw-r--r--indra/newview/skins/default/xui/tr/floater_region_debug_console.xml2
-rw-r--r--indra/newview/skins/default/xui/tr/floater_region_info.xml2
-rw-r--r--indra/newview/skins/default/xui/tr/floater_report_abuse.xml94
-rw-r--r--indra/newview/skins/default/xui/tr/floater_script_debug.xml2
-rw-r--r--indra/newview/skins/default/xui/tr/floater_script_debug_panel.xml2
-rw-r--r--indra/newview/skins/default/xui/tr/floater_script_limits.xml2
-rw-r--r--indra/newview/skins/default/xui/tr/floater_script_preview.xml9
-rw-r--r--indra/newview/skins/default/xui/tr/floater_script_queue.xml19
-rw-r--r--indra/newview/skins/default/xui/tr/floater_script_search.xml13
-rw-r--r--indra/newview/skins/default/xui/tr/floater_search.xml16
-rw-r--r--indra/newview/skins/default/xui/tr/floater_select_key.xml7
-rw-r--r--indra/newview/skins/default/xui/tr/floater_sell_land.xml65
-rw-r--r--indra/newview/skins/default/xui/tr/floater_settings_debug.xml13
-rw-r--r--indra/newview/skins/default/xui/tr/floater_snapshot.xml65
-rw-r--r--indra/newview/skins/default/xui/tr/floater_sound_devices.xml7
-rw-r--r--indra/newview/skins/default/xui/tr/floater_sound_preview.xml11
-rw-r--r--indra/newview/skins/default/xui/tr/floater_stats.xml79
-rw-r--r--indra/newview/skins/default/xui/tr/floater_sys_well.xml9
-rw-r--r--indra/newview/skins/default/xui/tr/floater_telehub.xml29
-rw-r--r--indra/newview/skins/default/xui/tr/floater_test_layout_stacks.xml2
-rw-r--r--indra/newview/skins/default/xui/tr/floater_test_text_vertical_aligment.xml2
-rw-r--r--indra/newview/skins/default/xui/tr/floater_texture_ctrl.xml23
-rw-r--r--indra/newview/skins/default/xui/tr/floater_tools.xml511
-rw-r--r--indra/newview/skins/default/xui/tr/floater_top_objects.xml55
-rw-r--r--indra/newview/skins/default/xui/tr/floater_tos.xml15
-rw-r--r--indra/newview/skins/default/xui/tr/floater_toybox.xml11
-rw-r--r--indra/newview/skins/default/xui/tr/floater_translation_settings.xml58
-rw-r--r--indra/newview/skins/default/xui/tr/floater_url_entry.xml12
-rw-r--r--indra/newview/skins/default/xui/tr/floater_voice_controls.xml30
-rw-r--r--indra/newview/skins/default/xui/tr/floater_voice_effect.xml159
-rw-r--r--indra/newview/skins/default/xui/tr/floater_water.xml70
-rw-r--r--indra/newview/skins/default/xui/tr/floater_web_content.xml14
-rw-r--r--indra/newview/skins/default/xui/tr/floater_whitelist_entry.xml9
-rw-r--r--indra/newview/skins/default/xui/tr/floater_windlight_options.xml167
-rw-r--r--indra/newview/skins/default/xui/tr/floater_window_size.xml17
-rw-r--r--indra/newview/skins/default/xui/tr/floater_world_map.xml73
-rw-r--r--indra/newview/skins/default/xui/tr/inspect_avatar.xml25
-rw-r--r--indra/newview/skins/default/xui/tr/inspect_group.xml32
-rw-r--r--indra/newview/skins/default/xui/tr/inspect_object.xml44
-rw-r--r--indra/newview/skins/default/xui/tr/inspect_remote_object.xml22
-rw-r--r--indra/newview/skins/default/xui/tr/menu_add_wearable_gear.xml6
-rw-r--r--indra/newview/skins/default/xui/tr/menu_attachment_other.xml17
-rw-r--r--indra/newview/skins/default/xui/tr/menu_attachment_self.xml16
-rw-r--r--indra/newview/skins/default/xui/tr/menu_avatar_icon.xml7
-rw-r--r--indra/newview/skins/default/xui/tr/menu_avatar_other.xml16
-rw-r--r--indra/newview/skins/default/xui/tr/menu_avatar_self.xml32
-rw-r--r--indra/newview/skins/default/xui/tr/menu_bottomtray.xml17
-rw-r--r--indra/newview/skins/default/xui/tr/menu_cof_attachment.xml4
-rw-r--r--indra/newview/skins/default/xui/tr/menu_cof_body_part.xml5
-rw-r--r--indra/newview/skins/default/xui/tr/menu_cof_clothing.xml6
-rw-r--r--indra/newview/skins/default/xui/tr/menu_cof_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/tr/menu_edit.xml12
-rw-r--r--indra/newview/skins/default/xui/tr/menu_favorites.xml10
-rw-r--r--indra/newview/skins/default/xui/tr/menu_gesture_gear.xml9
-rw-r--r--indra/newview/skins/default/xui/tr/menu_group_plus.xml5
-rw-r--r--indra/newview/skins/default/xui/tr/menu_hide_navbar.xml6
-rw-r--r--indra/newview/skins/default/xui/tr/menu_im_well_button.xml4
-rw-r--r--indra/newview/skins/default/xui/tr/menu_imchiclet_adhoc.xml4
-rw-r--r--indra/newview/skins/default/xui/tr/menu_imchiclet_group.xml6
-rw-r--r--indra/newview/skins/default/xui/tr/menu_imchiclet_p2p.xml7
-rw-r--r--indra/newview/skins/default/xui/tr/menu_inspect_avatar_gear.xml21
-rw-r--r--indra/newview/skins/default/xui/tr/menu_inspect_object_gear.xml19
-rw-r--r--indra/newview/skins/default/xui/tr/menu_inspect_self_gear.xml31
-rw-r--r--indra/newview/skins/default/xui/tr/menu_inv_offer_chiclet.xml4
-rw-r--r--indra/newview/skins/default/xui/tr/menu_inventory.xml90
-rw-r--r--indra/newview/skins/default/xui/tr/menu_inventory_add.xml36
-rw-r--r--indra/newview/skins/default/xui/tr/menu_inventory_gear_default.xml17
-rw-r--r--indra/newview/skins/default/xui/tr/menu_land.xml9
-rw-r--r--indra/newview/skins/default/xui/tr/menu_landmark.xml7
-rw-r--r--indra/newview/skins/default/xui/tr/menu_login.xml25
-rw-r--r--indra/newview/skins/default/xui/tr/menu_media_ctrl.xml7
-rw-r--r--indra/newview/skins/default/xui/tr/menu_mini_map.xml11
-rw-r--r--indra/newview/skins/default/xui/tr/menu_mode_change.xml5
-rw-r--r--indra/newview/skins/default/xui/tr/menu_model_import_gear_default.xml8
-rw-r--r--indra/newview/skins/default/xui/tr/menu_navbar.xml11
-rw-r--r--indra/newview/skins/default/xui/tr/menu_nearby_chat.xml9
-rw-r--r--indra/newview/skins/default/xui/tr/menu_notification_well_button.xml4
-rw-r--r--indra/newview/skins/default/xui/tr/menu_object.xml27
-rw-r--r--indra/newview/skins/default/xui/tr/menu_object_icon.xml5
-rw-r--r--indra/newview/skins/default/xui/tr/menu_outfit_gear.xml28
-rw-r--r--indra/newview/skins/default/xui/tr/menu_outfit_tab.xml9
-rw-r--r--indra/newview/skins/default/xui/tr/menu_participant_list.xml21
-rw-r--r--indra/newview/skins/default/xui/tr/menu_people_friends_view_sort.xml8
-rw-r--r--indra/newview/skins/default/xui/tr/menu_people_groups.xml8
-rw-r--r--indra/newview/skins/default/xui/tr/menu_people_groups_view_sort.xml5
-rw-r--r--indra/newview/skins/default/xui/tr/menu_people_nearby.xml13
-rw-r--r--indra/newview/skins/default/xui/tr/menu_people_nearby_multiselect.xml10
-rw-r--r--indra/newview/skins/default/xui/tr/menu_people_nearby_view_sort.xml9
-rw-r--r--indra/newview/skins/default/xui/tr/menu_people_recent_view_sort.xml7
-rw-r--r--indra/newview/skins/default/xui/tr/menu_picks.xml8
-rw-r--r--indra/newview/skins/default/xui/tr/menu_picks_plus.xml5
-rw-r--r--indra/newview/skins/default/xui/tr/menu_place.xml5
-rw-r--r--indra/newview/skins/default/xui/tr/menu_place_add_button.xml5
-rw-r--r--indra/newview/skins/default/xui/tr/menu_places_gear_folder.xml16
-rw-r--r--indra/newview/skins/default/xui/tr/menu_places_gear_landmark.xml19
-rw-r--r--indra/newview/skins/default/xui/tr/menu_profile_overflow.xml12
-rw-r--r--indra/newview/skins/default/xui/tr/menu_save_outfit.xml5
-rw-r--r--indra/newview/skins/default/xui/tr/menu_script_chiclet.xml4
-rw-r--r--indra/newview/skins/default/xui/tr/menu_slurl.xml6
-rw-r--r--indra/newview/skins/default/xui/tr/menu_teleport_history_gear.xml6
-rw-r--r--indra/newview/skins/default/xui/tr/menu_teleport_history_item.xml6
-rw-r--r--indra/newview/skins/default/xui/tr/menu_teleport_history_tab.xml5
-rw-r--r--indra/newview/skins/default/xui/tr/menu_text_editor.xml8
-rw-r--r--indra/newview/skins/default/xui/tr/menu_toolbars.xml7
-rw-r--r--indra/newview/skins/default/xui/tr/menu_topinfobar.xml7
-rw-r--r--indra/newview/skins/default/xui/tr/menu_url_agent.xml6
-rw-r--r--indra/newview/skins/default/xui/tr/menu_url_group.xml6
-rw-r--r--indra/newview/skins/default/xui/tr/menu_url_http.xml7
-rw-r--r--indra/newview/skins/default/xui/tr/menu_url_inventory.xml6
-rw-r--r--indra/newview/skins/default/xui/tr/menu_url_map.xml6
-rw-r--r--indra/newview/skins/default/xui/tr/menu_url_objectim.xml8
-rw-r--r--indra/newview/skins/default/xui/tr/menu_url_parcel.xml6
-rw-r--r--indra/newview/skins/default/xui/tr/menu_url_slapp.xml5
-rw-r--r--indra/newview/skins/default/xui/tr/menu_url_slurl.xml7
-rw-r--r--indra/newview/skins/default/xui/tr/menu_url_teleport.xml6
-rw-r--r--indra/newview/skins/default/xui/tr/menu_viewer.xml459
-rw-r--r--indra/newview/skins/default/xui/tr/menu_wearable_list_item.xml14
-rw-r--r--indra/newview/skins/default/xui/tr/menu_wearing_gear.xml6
-rw-r--r--indra/newview/skins/default/xui/tr/menu_wearing_tab.xml6
-rw-r--r--indra/newview/skins/default/xui/tr/mime_types.xml217
-rw-r--r--indra/newview/skins/default/xui/tr/mime_types_linux.xml217
-rw-r--r--indra/newview/skins/default/xui/tr/mime_types_mac.xml217
-rw-r--r--indra/newview/skins/default/xui/tr/notifications.xml3125
-rw-r--r--indra/newview/skins/default/xui/tr/panel_active_object_row.xml6
-rw-r--r--indra/newview/skins/default/xui/tr/panel_adhoc_control_panel.xml14
-rw-r--r--indra/newview/skins/default/xui/tr/panel_avatar_list_item.xml31
-rw-r--r--indra/newview/skins/default/xui/tr/panel_avatar_tag.xml12
-rw-r--r--indra/newview/skins/default/xui/tr/panel_block_list_sidetray.xml10
-rw-r--r--indra/newview/skins/default/xui/tr/panel_body_parts_list_item.xml8
-rw-r--r--indra/newview/skins/default/xui/tr/panel_bodyparts_list_button_bar.xml4
-rw-r--r--indra/newview/skins/default/xui/tr/panel_bottomtray.xml47
-rw-r--r--indra/newview/skins/default/xui/tr/panel_bottomtray_lite.xml8
-rw-r--r--indra/newview/skins/default/xui/tr/panel_chat_header.xml4
-rw-r--r--indra/newview/skins/default/xui/tr/panel_chiclet_bar.xml15
-rw-r--r--indra/newview/skins/default/xui/tr/panel_classified_info.xml67
-rw-r--r--indra/newview/skins/default/xui/tr/panel_clothing_list_button_bar.xml4
-rw-r--r--indra/newview/skins/default/xui/tr/panel_clothing_list_item.xml9
-rw-r--r--indra/newview/skins/default/xui/tr/panel_cof_wearables.xml8
-rw-r--r--indra/newview/skins/default/xui/tr/panel_deletable_wearable_list_item.xml5
-rw-r--r--indra/newview/skins/default/xui/tr/panel_dummy_clothing_list_item.xml7
-rw-r--r--indra/newview/skins/default/xui/tr/panel_edit_alpha.xml12
-rw-r--r--indra/newview/skins/default/xui/tr/panel_edit_classified.xml54
-rw-r--r--indra/newview/skins/default/xui/tr/panel_edit_eyes.xml11
-rw-r--r--indra/newview/skins/default/xui/tr/panel_edit_gloves.xml12
-rw-r--r--indra/newview/skins/default/xui/tr/panel_edit_hair.xml14
-rw-r--r--indra/newview/skins/default/xui/tr/panel_edit_jacket.xml13
-rw-r--r--indra/newview/skins/default/xui/tr/panel_edit_pants.xml12
-rw-r--r--indra/newview/skins/default/xui/tr/panel_edit_physics.xml14
-rw-r--r--indra/newview/skins/default/xui/tr/panel_edit_pick.xml37
-rw-r--r--indra/newview/skins/default/xui/tr/panel_edit_profile.xml68
-rw-r--r--indra/newview/skins/default/xui/tr/panel_edit_shape.xml25
-rw-r--r--indra/newview/skins/default/xui/tr/panel_edit_shirt.xml12
-rw-r--r--indra/newview/skins/default/xui/tr/panel_edit_shoes.xml12
-rw-r--r--indra/newview/skins/default/xui/tr/panel_edit_skin.xml16
-rw-r--r--indra/newview/skins/default/xui/tr/panel_edit_skirt.xml12
-rw-r--r--indra/newview/skins/default/xui/tr/panel_edit_socks.xml12
-rw-r--r--indra/newview/skins/default/xui/tr/panel_edit_tattoo.xml9
-rw-r--r--indra/newview/skins/default/xui/tr/panel_edit_underpants.xml12
-rw-r--r--indra/newview/skins/default/xui/tr/panel_edit_undershirt.xml12
-rw-r--r--indra/newview/skins/default/xui/tr/panel_edit_wearable.xml120
-rw-r--r--indra/newview/skins/default/xui/tr/panel_group_control_panel.xml17
-rw-r--r--indra/newview/skins/default/xui/tr/panel_group_general.xml57
-rw-r--r--indra/newview/skins/default/xui/tr/panel_group_info_sidetray.xml41
-rw-r--r--indra/newview/skins/default/xui/tr/panel_group_invite.xml27
-rw-r--r--indra/newview/skins/default/xui/tr/panel_group_land_money.xml85
-rw-r--r--indra/newview/skins/default/xui/tr/panel_group_list_item.xml5
-rw-r--r--indra/newview/skins/default/xui/tr/panel_group_notices.xml61
-rw-r--r--indra/newview/skins/default/xui/tr/panel_group_notify.xml12
-rw-r--r--indra/newview/skins/default/xui/tr/panel_group_roles.xml93
-rw-r--r--indra/newview/skins/default/xui/tr/panel_im_control_panel.xml29
-rw-r--r--indra/newview/skins/default/xui/tr/panel_instant_message.xml9
-rw-r--r--indra/newview/skins/default/xui/tr/panel_inventory_item.xml4
-rw-r--r--indra/newview/skins/default/xui/tr/panel_landmark_info.xml41
-rw-r--r--indra/newview/skins/default/xui/tr/panel_landmarks.xml22
-rw-r--r--indra/newview/skins/default/xui/tr/panel_login.xml48
-rw-r--r--indra/newview/skins/default/xui/tr/panel_main_inventory.xml28
-rw-r--r--indra/newview/skins/default/xui/tr/panel_me.xml4
-rw-r--r--indra/newview/skins/default/xui/tr/panel_media_settings_general.xml32
-rw-r--r--indra/newview/skins/default/xui/tr/panel_media_settings_permissions.xml29
-rw-r--r--indra/newview/skins/default/xui/tr/panel_media_settings_security.xml12
-rw-r--r--indra/newview/skins/default/xui/tr/panel_navigation_bar.xml23
-rw-r--r--indra/newview/skins/default/xui/tr/panel_nearby_chat.xml8
-rw-r--r--indra/newview/skins/default/xui/tr/panel_nearby_chat_bar.xml5
-rw-r--r--indra/newview/skins/default/xui/tr/panel_nearby_media.xml70
-rw-r--r--indra/newview/skins/default/xui/tr/panel_notify_textbox.xml11
-rw-r--r--indra/newview/skins/default/xui/tr/panel_online_status_toast.xml2
-rw-r--r--indra/newview/skins/default/xui/tr/panel_outbox_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/tr/panel_outfit_edit.xml57
-rw-r--r--indra/newview/skins/default/xui/tr/panel_outfits_inventory.xml23
-rw-r--r--indra/newview/skins/default/xui/tr/panel_outfits_inventory_gear_default.xml8
-rw-r--r--indra/newview/skins/default/xui/tr/panel_outfits_list.xml11
-rw-r--r--indra/newview/skins/default/xui/tr/panel_outfits_wearing.xml6
-rw-r--r--indra/newview/skins/default/xui/tr/panel_people.xml94
-rw-r--r--indra/newview/skins/default/xui/tr/panel_pick_info.xml24
-rw-r--r--indra/newview/skins/default/xui/tr/panel_picks.xml29
-rw-r--r--indra/newview/skins/default/xui/tr/panel_place_profile.xml118
-rw-r--r--indra/newview/skins/default/xui/tr/panel_places.xml48
-rw-r--r--indra/newview/skins/default/xui/tr/panel_postcard_message.xml21
-rw-r--r--indra/newview/skins/default/xui/tr/panel_postcard_settings.xml23
-rw-r--r--indra/newview/skins/default/xui/tr/panel_preferences_advanced.xml31
-rw-r--r--indra/newview/skins/default/xui/tr/panel_preferences_alerts.xml14
-rw-r--r--indra/newview/skins/default/xui/tr/panel_preferences_chat.xml33
-rw-r--r--indra/newview/skins/default/xui/tr/panel_preferences_colors.xml44
-rw-r--r--indra/newview/skins/default/xui/tr/panel_preferences_general.xml76
-rw-r--r--indra/newview/skins/default/xui/tr/panel_preferences_graphics1.xml114
-rw-r--r--indra/newview/skins/default/xui/tr/panel_preferences_move.xml39
-rw-r--r--indra/newview/skins/default/xui/tr/panel_preferences_privacy.xml30
-rw-r--r--indra/newview/skins/default/xui/tr/panel_preferences_setup.xml36
-rw-r--r--indra/newview/skins/default/xui/tr/panel_preferences_sound.xml40
-rw-r--r--indra/newview/skins/default/xui/tr/panel_prim_media_controls.xml91
-rw-r--r--indra/newview/skins/default/xui/tr/panel_region_covenant.xml79
-rw-r--r--indra/newview/skins/default/xui/tr/panel_region_debug.xml34
-rw-r--r--indra/newview/skins/default/xui/tr/panel_region_environment.xml33
-rw-r--r--indra/newview/skins/default/xui/tr/panel_region_estate.xml52
-rw-r--r--indra/newview/skins/default/xui/tr/panel_region_general.xml44
-rw-r--r--indra/newview/skins/default/xui/tr/panel_region_terrain.xml60
-rw-r--r--indra/newview/skins/default/xui/tr/panel_region_texture.xml54
-rw-r--r--indra/newview/skins/default/xui/tr/panel_script_ed.xml49
-rw-r--r--indra/newview/skins/default/xui/tr/panel_script_limits_my_avatar.xml16
-rw-r--r--indra/newview/skins/default/xui/tr/panel_script_limits_region_memory.xml20
-rw-r--r--indra/newview/skins/default/xui/tr/panel_scrolling_param.xml10
-rw-r--r--indra/newview/skins/default/xui/tr/panel_scrolling_param_base.xml4
-rw-r--r--indra/newview/skins/default/xui/tr/panel_side_tray.xml29
-rw-r--r--indra/newview/skins/default/xui/tr/panel_side_tray_tab_caption.xml7
-rw-r--r--indra/newview/skins/default/xui/tr/panel_snapshot_inventory.xml21
-rw-r--r--indra/newview/skins/default/xui/tr/panel_snapshot_local.xml39
-rw-r--r--indra/newview/skins/default/xui/tr/panel_snapshot_options.xml7
-rw-r--r--indra/newview/skins/default/xui/tr/panel_snapshot_postcard.xml17
-rw-r--r--indra/newview/skins/default/xui/tr/panel_snapshot_profile.xml28
-rw-r--r--indra/newview/skins/default/xui/tr/panel_sound_devices.xml25
-rw-r--r--indra/newview/skins/default/xui/tr/panel_stand_stop_flying.xml6
-rw-r--r--indra/newview/skins/default/xui/tr/panel_status_bar.xml28
-rw-r--r--indra/newview/skins/default/xui/tr/panel_teleport_history.xml19
-rw-r--r--indra/newview/skins/default/xui/tr/panel_teleport_history_item.xml5
-rw-r--r--indra/newview/skins/default/xui/tr/panel_voice_effect.xml15
-rw-r--r--indra/newview/skins/default/xui/tr/panel_world_map.xml63
-rw-r--r--indra/newview/skins/default/xui/tr/role_actions.xml73
-rw-r--r--indra/newview/skins/default/xui/tr/sidepanel_appearance.xml19
-rw-r--r--indra/newview/skins/default/xui/tr/sidepanel_inventory.xml42
-rw-r--r--indra/newview/skins/default/xui/tr/sidepanel_item_info.xml76
-rw-r--r--indra/newview/skins/default/xui/tr/sidepanel_task_info.xml123
-rw-r--r--indra/newview/skins/default/xui/tr/strings.xml5025
-rw-r--r--indra/newview/skins/default/xui/tr/teleport_strings.xml84
-rw-r--r--indra/newview/skins/default/xui/zh/floater_aaa.xml9
-rw-r--r--indra/newview/skins/default/xui/zh/floater_about.xml84
-rw-r--r--indra/newview/skins/default/xui/zh/floater_about_land.xml478
-rw-r--r--indra/newview/skins/default/xui/zh/floater_activeim.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/floater_animation_preview.xml186
-rw-r--r--indra/newview/skins/default/xui/zh/floater_auction.xml11
-rw-r--r--indra/newview/skins/default/xui/zh/floater_avatar_picker.xml53
-rw-r--r--indra/newview/skins/default/xui/zh/floater_avatar_textures.xml50
-rw-r--r--indra/newview/skins/default/xui/zh/floater_beacons.xml22
-rw-r--r--indra/newview/skins/default/xui/zh/floater_build_options.xml10
-rw-r--r--indra/newview/skins/default/xui/zh/floater_bulk_perms.xml45
-rw-r--r--indra/newview/skins/default/xui/zh/floater_bumps.xml24
-rw-r--r--indra/newview/skins/default/xui/zh/floater_buy_contents.xml21
-rw-r--r--indra/newview/skins/default/xui/zh/floater_buy_currency.xml66
-rw-r--r--indra/newview/skins/default/xui/zh/floater_buy_currency_html.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/floater_buy_land.xml233
-rw-r--r--indra/newview/skins/default/xui/zh/floater_buy_object.xml29
-rw-r--r--indra/newview/skins/default/xui/zh/floater_camera.xml56
-rw-r--r--indra/newview/skins/default/xui/zh/floater_choose_group.xml8
-rw-r--r--indra/newview/skins/default/xui/zh/floater_color_picker.xml30
-rw-r--r--indra/newview/skins/default/xui/zh/floater_critical.xml10
-rw-r--r--indra/newview/skins/default/xui/zh/floater_display_name.xml18
-rw-r--r--indra/newview/skins/default/xui/zh/floater_env_settings.xml25
-rw-r--r--indra/newview/skins/default/xui/zh/floater_event.xml9
-rw-r--r--indra/newview/skins/default/xui/zh/floater_font_test.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/floater_gesture.xml26
-rw-r--r--indra/newview/skins/default/xui/zh/floater_god_tools.xml96
-rw-r--r--indra/newview/skins/default/xui/zh/floater_hardware_settings.xml31
-rw-r--r--indra/newview/skins/default/xui/zh/floater_help_browser.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/floater_hud.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/floater_im_container.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/floater_im_session.xml8
-rw-r--r--indra/newview/skins/default/xui/zh/floater_image_preview.xml32
-rw-r--r--indra/newview/skins/default/xui/zh/floater_incoming_call.xml33
-rw-r--r--indra/newview/skins/default/xui/zh/floater_inspect.xml14
-rw-r--r--indra/newview/skins/default/xui/zh/floater_inventory.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/floater_inventory_item_properties.xml67
-rw-r--r--indra/newview/skins/default/xui/zh/floater_inventory_view_finder.xml24
-rw-r--r--indra/newview/skins/default/xui/zh/floater_joystick.xml79
-rw-r--r--indra/newview/skins/default/xui/zh/floater_lagmeter.xml151
-rw-r--r--indra/newview/skins/default/xui/zh/floater_land_holdings.xml39
-rw-r--r--indra/newview/skins/default/xui/zh/floater_live_lsleditor.xml15
-rw-r--r--indra/newview/skins/default/xui/zh/floater_lsl_guide.xml7
-rw-r--r--indra/newview/skins/default/xui/zh/floater_map.xml36
-rw-r--r--indra/newview/skins/default/xui/zh/floater_media_browser.xml30
-rw-r--r--indra/newview/skins/default/xui/zh/floater_media_settings.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/floater_mem_leaking.xml18
-rw-r--r--indra/newview/skins/default/xui/zh/floater_moveview.xml75
-rw-r--r--indra/newview/skins/default/xui/zh/floater_mute_object.xml14
-rw-r--r--indra/newview/skins/default/xui/zh/floater_nearby_chat.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/floater_notification.xml7
-rw-r--r--indra/newview/skins/default/xui/zh/floater_notifications_console.xml5
-rw-r--r--indra/newview/skins/default/xui/zh/floater_openobject.xml8
-rw-r--r--indra/newview/skins/default/xui/zh/floater_outfit_save_as.xml11
-rw-r--r--indra/newview/skins/default/xui/zh/floater_outgoing_call.xml40
-rw-r--r--indra/newview/skins/default/xui/zh/floater_pay.xml21
-rw-r--r--indra/newview/skins/default/xui/zh/floater_pay_object.xml28
-rw-r--r--indra/newview/skins/default/xui/zh/floater_perm_prefs.xml15
-rw-r--r--indra/newview/skins/default/xui/zh/floater_post_process.xml53
-rw-r--r--indra/newview/skins/default/xui/zh/floater_postcard.xml33
-rw-r--r--indra/newview/skins/default/xui/zh/floater_preferences.xml17
-rw-r--r--indra/newview/skins/default/xui/zh/floater_preview_animation.xml11
-rw-r--r--indra/newview/skins/default/xui/zh/floater_preview_gesture.xml73
-rw-r--r--indra/newview/skins/default/xui/zh/floater_preview_notecard.xml20
-rw-r--r--indra/newview/skins/default/xui/zh/floater_preview_sound.xml11
-rw-r--r--indra/newview/skins/default/xui/zh/floater_preview_texture.xml47
-rw-r--r--indra/newview/skins/default/xui/zh/floater_publish_classified.xml11
-rw-r--r--indra/newview/skins/default/xui/zh/floater_region_debug_console.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/floater_region_info.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/floater_report_abuse.xml94
-rw-r--r--indra/newview/skins/default/xui/zh/floater_script_debug.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/floater_script_debug_panel.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/floater_script_limits.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/floater_script_preview.xml9
-rw-r--r--indra/newview/skins/default/xui/zh/floater_script_queue.xml19
-rw-r--r--indra/newview/skins/default/xui/zh/floater_script_search.xml13
-rw-r--r--indra/newview/skins/default/xui/zh/floater_search.xml16
-rw-r--r--indra/newview/skins/default/xui/zh/floater_select_key.xml7
-rw-r--r--indra/newview/skins/default/xui/zh/floater_sell_land.xml65
-rw-r--r--indra/newview/skins/default/xui/zh/floater_settings_debug.xml13
-rw-r--r--indra/newview/skins/default/xui/zh/floater_snapshot.xml74
-rw-r--r--indra/newview/skins/default/xui/zh/floater_sound_preview.xml11
-rw-r--r--indra/newview/skins/default/xui/zh/floater_stats.xml71
-rw-r--r--indra/newview/skins/default/xui/zh/floater_sys_well.xml9
-rw-r--r--indra/newview/skins/default/xui/zh/floater_telehub.xml29
-rw-r--r--indra/newview/skins/default/xui/zh/floater_texture_ctrl.xml23
-rw-r--r--indra/newview/skins/default/xui/zh/floater_tools.xml499
-rw-r--r--indra/newview/skins/default/xui/zh/floater_top_objects.xml55
-rw-r--r--indra/newview/skins/default/xui/zh/floater_tos.xml15
-rw-r--r--indra/newview/skins/default/xui/zh/floater_url_entry.xml12
-rw-r--r--indra/newview/skins/default/xui/zh/floater_voice_controls.xml30
-rw-r--r--indra/newview/skins/default/xui/zh/floater_voice_effect.xml30
-rw-r--r--indra/newview/skins/default/xui/zh/floater_water.xml70
-rw-r--r--indra/newview/skins/default/xui/zh/floater_web_content.xml14
-rw-r--r--indra/newview/skins/default/xui/zh/floater_whitelist_entry.xml9
-rw-r--r--indra/newview/skins/default/xui/zh/floater_windlight_options.xml167
-rw-r--r--indra/newview/skins/default/xui/zh/floater_window_size.xml17
-rw-r--r--indra/newview/skins/default/xui/zh/floater_world_map.xml73
-rw-r--r--indra/newview/skins/default/xui/zh/inspect_avatar.xml25
-rw-r--r--indra/newview/skins/default/xui/zh/inspect_group.xml32
-rw-r--r--indra/newview/skins/default/xui/zh/inspect_object.xml44
-rw-r--r--indra/newview/skins/default/xui/zh/inspect_remote_object.xml22
-rw-r--r--indra/newview/skins/default/xui/zh/menu_add_wearable_gear.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/menu_attachment_other.xml17
-rw-r--r--indra/newview/skins/default/xui/zh/menu_attachment_self.xml16
-rw-r--r--indra/newview/skins/default/xui/zh/menu_avatar_icon.xml7
-rw-r--r--indra/newview/skins/default/xui/zh/menu_avatar_other.xml16
-rw-r--r--indra/newview/skins/default/xui/zh/menu_avatar_self.xml32
-rw-r--r--indra/newview/skins/default/xui/zh/menu_bottomtray.xml17
-rw-r--r--indra/newview/skins/default/xui/zh/menu_cof_attachment.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/menu_cof_body_part.xml5
-rw-r--r--indra/newview/skins/default/xui/zh/menu_cof_clothing.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/menu_cof_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/zh/menu_edit.xml12
-rw-r--r--indra/newview/skins/default/xui/zh/menu_favorites.xml10
-rw-r--r--indra/newview/skins/default/xui/zh/menu_gesture_gear.xml9
-rw-r--r--indra/newview/skins/default/xui/zh/menu_group_plus.xml5
-rw-r--r--indra/newview/skins/default/xui/zh/menu_hide_navbar.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/menu_im_well_button.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/menu_imchiclet_adhoc.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/menu_imchiclet_group.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/menu_imchiclet_p2p.xml7
-rw-r--r--indra/newview/skins/default/xui/zh/menu_inspect_avatar_gear.xml21
-rw-r--r--indra/newview/skins/default/xui/zh/menu_inspect_object_gear.xml18
-rw-r--r--indra/newview/skins/default/xui/zh/menu_inspect_self_gear.xml31
-rw-r--r--indra/newview/skins/default/xui/zh/menu_inv_offer_chiclet.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/menu_inventory.xml87
-rw-r--r--indra/newview/skins/default/xui/zh/menu_inventory_add.xml34
-rw-r--r--indra/newview/skins/default/xui/zh/menu_inventory_gear_default.xml17
-rw-r--r--indra/newview/skins/default/xui/zh/menu_land.xml9
-rw-r--r--indra/newview/skins/default/xui/zh/menu_landmark.xml7
-rw-r--r--indra/newview/skins/default/xui/zh/menu_login.xml25
-rw-r--r--indra/newview/skins/default/xui/zh/menu_media_ctrl.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/menu_mini_map.xml11
-rw-r--r--indra/newview/skins/default/xui/zh/menu_navbar.xml11
-rw-r--r--indra/newview/skins/default/xui/zh/menu_nearby_chat.xml9
-rw-r--r--indra/newview/skins/default/xui/zh/menu_notification_well_button.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/menu_object.xml27
-rw-r--r--indra/newview/skins/default/xui/zh/menu_object_icon.xml5
-rw-r--r--indra/newview/skins/default/xui/zh/menu_outfit_gear.xml28
-rw-r--r--indra/newview/skins/default/xui/zh/menu_outfit_tab.xml9
-rw-r--r--indra/newview/skins/default/xui/zh/menu_participant_list.xml21
-rw-r--r--indra/newview/skins/default/xui/zh/menu_people_friends_view_sort.xml8
-rw-r--r--indra/newview/skins/default/xui/zh/menu_people_groups.xml8
-rw-r--r--indra/newview/skins/default/xui/zh/menu_people_groups_view_sort.xml5
-rw-r--r--indra/newview/skins/default/xui/zh/menu_people_nearby.xml13
-rw-r--r--indra/newview/skins/default/xui/zh/menu_people_nearby_multiselect.xml10
-rw-r--r--indra/newview/skins/default/xui/zh/menu_people_nearby_view_sort.xml8
-rw-r--r--indra/newview/skins/default/xui/zh/menu_people_recent_view_sort.xml7
-rw-r--r--indra/newview/skins/default/xui/zh/menu_picks.xml8
-rw-r--r--indra/newview/skins/default/xui/zh/menu_picks_plus.xml5
-rw-r--r--indra/newview/skins/default/xui/zh/menu_place.xml5
-rw-r--r--indra/newview/skins/default/xui/zh/menu_place_add_button.xml5
-rw-r--r--indra/newview/skins/default/xui/zh/menu_places_gear_folder.xml16
-rw-r--r--indra/newview/skins/default/xui/zh/menu_places_gear_landmark.xml19
-rw-r--r--indra/newview/skins/default/xui/zh/menu_profile_overflow.xml12
-rw-r--r--indra/newview/skins/default/xui/zh/menu_save_outfit.xml5
-rw-r--r--indra/newview/skins/default/xui/zh/menu_script_chiclet.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/menu_slurl.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/menu_teleport_history_gear.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/menu_teleport_history_item.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/menu_teleport_history_tab.xml5
-rw-r--r--indra/newview/skins/default/xui/zh/menu_text_editor.xml8
-rw-r--r--indra/newview/skins/default/xui/zh/menu_topinfobar.xml7
-rw-r--r--indra/newview/skins/default/xui/zh/menu_url_agent.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/menu_url_group.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/menu_url_http.xml7
-rw-r--r--indra/newview/skins/default/xui/zh/menu_url_inventory.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/menu_url_map.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/menu_url_objectim.xml8
-rw-r--r--indra/newview/skins/default/xui/zh/menu_url_parcel.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/menu_url_slapp.xml5
-rw-r--r--indra/newview/skins/default/xui/zh/menu_url_slurl.xml7
-rw-r--r--indra/newview/skins/default/xui/zh/menu_url_teleport.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/menu_viewer.xml416
-rw-r--r--indra/newview/skins/default/xui/zh/menu_wearable_list_item.xml14
-rw-r--r--indra/newview/skins/default/xui/zh/menu_wearing_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/zh/menu_wearing_tab.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/mime_types.xml217
-rw-r--r--indra/newview/skins/default/xui/zh/mime_types_linux.xml217
-rw-r--r--indra/newview/skins/default/xui/zh/mime_types_mac.xml217
-rw-r--r--indra/newview/skins/default/xui/zh/notifications.xml2952
-rw-r--r--indra/newview/skins/default/xui/zh/panel_active_object_row.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/panel_adhoc_control_panel.xml14
-rw-r--r--indra/newview/skins/default/xui/zh/panel_avatar_list_item.xml31
-rw-r--r--indra/newview/skins/default/xui/zh/panel_avatar_tag.xml12
-rw-r--r--indra/newview/skins/default/xui/zh/panel_block_list_sidetray.xml10
-rw-r--r--indra/newview/skins/default/xui/zh/panel_body_parts_list_item.xml8
-rw-r--r--indra/newview/skins/default/xui/zh/panel_bodyparts_list_button_bar.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/panel_bottomtray.xml47
-rw-r--r--indra/newview/skins/default/xui/zh/panel_bottomtray_lite.xml8
-rw-r--r--indra/newview/skins/default/xui/zh/panel_chat_header.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/panel_classified_info.xml67
-rw-r--r--indra/newview/skins/default/xui/zh/panel_clothing_list_button_bar.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/panel_clothing_list_item.xml9
-rw-r--r--indra/newview/skins/default/xui/zh/panel_cof_wearables.xml8
-rw-r--r--indra/newview/skins/default/xui/zh/panel_deletable_wearable_list_item.xml5
-rw-r--r--indra/newview/skins/default/xui/zh/panel_dummy_clothing_list_item.xml7
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_alpha.xml12
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_classified.xml54
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_eyes.xml11
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_gloves.xml12
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_hair.xml14
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_jacket.xml13
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_pants.xml12
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_physics.xml14
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_pick.xml37
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_profile.xml68
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_shape.xml25
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_shirt.xml12
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_shoes.xml12
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_skin.xml16
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_skirt.xml12
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_socks.xml12
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_tattoo.xml9
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_underpants.xml12
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_undershirt.xml12
-rw-r--r--indra/newview/skins/default/xui/zh/panel_edit_wearable.xml120
-rw-r--r--indra/newview/skins/default/xui/zh/panel_group_control_panel.xml17
-rw-r--r--indra/newview/skins/default/xui/zh/panel_group_general.xml57
-rw-r--r--indra/newview/skins/default/xui/zh/panel_group_info_sidetray.xml41
-rw-r--r--indra/newview/skins/default/xui/zh/panel_group_invite.xml27
-rw-r--r--indra/newview/skins/default/xui/zh/panel_group_land_money.xml85
-rw-r--r--indra/newview/skins/default/xui/zh/panel_group_list_item.xml5
-rw-r--r--indra/newview/skins/default/xui/zh/panel_group_notices.xml61
-rw-r--r--indra/newview/skins/default/xui/zh/panel_group_notify.xml12
-rw-r--r--indra/newview/skins/default/xui/zh/panel_group_roles.xml95
-rw-r--r--indra/newview/skins/default/xui/zh/panel_im_control_panel.xml29
-rw-r--r--indra/newview/skins/default/xui/zh/panel_instant_message.xml9
-rw-r--r--indra/newview/skins/default/xui/zh/panel_inventory_item.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/panel_landmark_info.xml41
-rw-r--r--indra/newview/skins/default/xui/zh/panel_landmarks.xml22
-rw-r--r--indra/newview/skins/default/xui/zh/panel_login.xml48
-rw-r--r--indra/newview/skins/default/xui/zh/panel_main_inventory.xml28
-rw-r--r--indra/newview/skins/default/xui/zh/panel_me.xml7
-rw-r--r--indra/newview/skins/default/xui/zh/panel_media_settings_general.xml32
-rw-r--r--indra/newview/skins/default/xui/zh/panel_media_settings_permissions.xml29
-rw-r--r--indra/newview/skins/default/xui/zh/panel_media_settings_security.xml12
-rw-r--r--indra/newview/skins/default/xui/zh/panel_navigation_bar.xml18
-rw-r--r--indra/newview/skins/default/xui/zh/panel_nearby_chat_bar.xml5
-rw-r--r--indra/newview/skins/default/xui/zh/panel_nearby_media.xml70
-rw-r--r--indra/newview/skins/default/xui/zh/panel_notify_textbox.xml11
-rw-r--r--indra/newview/skins/default/xui/zh/panel_online_status_toast.xml2
-rw-r--r--indra/newview/skins/default/xui/zh/panel_outfit_edit.xml57
-rw-r--r--indra/newview/skins/default/xui/zh/panel_outfits_inventory.xml23
-rw-r--r--indra/newview/skins/default/xui/zh/panel_outfits_inventory_gear_default.xml8
-rw-r--r--indra/newview/skins/default/xui/zh/panel_outfits_list.xml7
-rw-r--r--indra/newview/skins/default/xui/zh/panel_outfits_wearing.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/panel_people.xml94
-rw-r--r--indra/newview/skins/default/xui/zh/panel_pick_info.xml24
-rw-r--r--indra/newview/skins/default/xui/zh/panel_picks.xml29
-rw-r--r--indra/newview/skins/default/xui/zh/panel_place_profile.xml116
-rw-r--r--indra/newview/skins/default/xui/zh/panel_places.xml48
-rw-r--r--indra/newview/skins/default/xui/zh/panel_preferences_advanced.xml18
-rw-r--r--indra/newview/skins/default/xui/zh/panel_preferences_alerts.xml14
-rw-r--r--indra/newview/skins/default/xui/zh/panel_preferences_chat.xml57
-rw-r--r--indra/newview/skins/default/xui/zh/panel_preferences_colors.xml41
-rw-r--r--indra/newview/skins/default/xui/zh/panel_preferences_general.xml73
-rw-r--r--indra/newview/skins/default/xui/zh/panel_preferences_graphics1.xml102
-rw-r--r--indra/newview/skins/default/xui/zh/panel_preferences_move.xml24
-rw-r--r--indra/newview/skins/default/xui/zh/panel_preferences_privacy.xml30
-rw-r--r--indra/newview/skins/default/xui/zh/panel_preferences_setup.xml49
-rw-r--r--indra/newview/skins/default/xui/zh/panel_preferences_sound.xml62
-rw-r--r--indra/newview/skins/default/xui/zh/panel_prim_media_controls.xml91
-rw-r--r--indra/newview/skins/default/xui/zh/panel_region_covenant.xml79
-rw-r--r--indra/newview/skins/default/xui/zh/panel_region_debug.xml34
-rw-r--r--indra/newview/skins/default/xui/zh/panel_region_estate.xml52
-rw-r--r--indra/newview/skins/default/xui/zh/panel_region_general.xml43
-rw-r--r--indra/newview/skins/default/xui/zh/panel_region_terrain.xml19
-rw-r--r--indra/newview/skins/default/xui/zh/panel_region_texture.xml54
-rw-r--r--indra/newview/skins/default/xui/zh/panel_script_ed.xml47
-rw-r--r--indra/newview/skins/default/xui/zh/panel_script_limits_my_avatar.xml16
-rw-r--r--indra/newview/skins/default/xui/zh/panel_script_limits_region_memory.xml20
-rw-r--r--indra/newview/skins/default/xui/zh/panel_scrolling_param.xml10
-rw-r--r--indra/newview/skins/default/xui/zh/panel_scrolling_param_base.xml4
-rw-r--r--indra/newview/skins/default/xui/zh/panel_side_tray.xml29
-rw-r--r--indra/newview/skins/default/xui/zh/panel_side_tray_tab_caption.xml7
-rw-r--r--indra/newview/skins/default/xui/zh/panel_stand_stop_flying.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/panel_status_bar.xml27
-rw-r--r--indra/newview/skins/default/xui/zh/panel_teleport_history.xml19
-rw-r--r--indra/newview/skins/default/xui/zh/panel_teleport_history_item.xml5
-rw-r--r--indra/newview/skins/default/xui/zh/panel_voice_effect.xml15
-rw-r--r--indra/newview/skins/default/xui/zh/panel_world_map.xml63
-rw-r--r--indra/newview/skins/default/xui/zh/role_actions.xml73
-rw-r--r--indra/newview/skins/default/xui/zh/sidepanel_appearance.xml19
-rw-r--r--indra/newview/skins/default/xui/zh/sidepanel_inventory.xml21
-rw-r--r--indra/newview/skins/default/xui/zh/sidepanel_item_info.xml76
-rw-r--r--indra/newview/skins/default/xui/zh/sidepanel_task_info.xml123
-rw-r--r--indra/newview/skins/default/xui/zh/strings.xml4454
-rw-r--r--indra/newview/skins/default/xui/zh/teleport_strings.xml84
-rw-r--r--indra/newview/skins/paths.xml2
-rw-r--r--indra/newview/tests/gpus_results.txt1726
-rw-r--r--indra/newview/tests/gpus_seen.txt2422
-rw-r--r--indra/newview/tests/llcapabilitylistener_test.cpp3
-rw-r--r--indra/newview/tests/lldir_stub.cpp62
-rw-r--r--indra/newview/tests/llglslshader_stub.cpp39
-rw-r--r--indra/newview/tests/lllogininstance_test.cpp49
-rw-r--r--indra/newview/tests/llpipeline_stub.cpp32
-rw-r--r--indra/newview/tests/llremoteparcelrequest_test.cpp268
-rw-r--r--indra/newview/tests/llsechandler_basic_test.cpp3
-rw-r--r--indra/newview/tests/llsimplestat_test.cpp580
-rw-r--r--indra/newview/tests/llsky_stub.cpp37
-rw-r--r--indra/newview/tests/lltranslate_test.cpp345
-rw-r--r--indra/newview/tests/llversioninfo_test.cpp12
-rw-r--r--indra/newview/tests/llviewerassetstats_test.cpp984
-rw-r--r--indra/newview/tests/llviewerhelputil_test.cpp4
-rw-r--r--indra/newview/tests/llviewernetwork_test.cpp12
-rw-r--r--indra/newview/tests/llviewershadermgr_stub.cpp50
-rw-r--r--indra/newview/tests/llwlanimator_stub.cpp29
-rw-r--r--indra/newview/tests/llwldaycycle_stub.cpp52
-rw-r--r--indra/newview/tests/llwlparammanager_test.cpp271
-rw-r--r--indra/newview/tests/llwlparamset_stub.cpp41
-rw-r--r--indra/newview/tests/llworldmap_test.cpp42
-rw-r--r--indra/newview/tests/llworldmipmap_test.cpp31
-rw-r--r--indra/newview/tests/llxmlrpclistener_test.cpp11
-rw-r--r--indra/newview/tests/test_llxmlrpc_peer.py23
-rw-r--r--indra/newview/viewer_manifest.py389
-rw-r--r--indra/test/CMakeLists.txt55
-rw-r--r--indra/test/io.cpp2
-rw-r--r--indra/test/llapp_tut.cpp162
-rw-r--r--indra/test/llevents_tut.cpp1384
-rw-r--r--indra/test/llhttpclient_tut.cpp5
-rw-r--r--indra/test/llsd_new_tut.cpp116
-rw-r--r--indra/test/llsdmessagebuilder_tut.cpp7
-rw-r--r--indra/test/lltemplatemessagebuilder_tut.cpp55
-rw-r--r--indra/test/lltut.cpp5
-rw-r--r--indra/test/test.cpp212
-rw-r--r--indra/test/test_llmanifest.py2
-rw-r--r--indra/test_apps/llplugintest/CMakeLists.txt17
-rw-r--r--indra/test_apps/llplugintest/llmediaplugintest.cpp31
-rw-r--r--indra/tools/vstool/VSTool.csproj5
-rwxr-xr-xindra/tools/vstool/VSTool.exebin24576 -> 24576 bytes
-rw-r--r--indra/tools/vstool/VSTool.sln4
-rw-r--r--indra/tools/vstool/main.cs10
-rw-r--r--indra/viewer_components/login/CMakeLists.txt9
-rw-r--r--indra/viewer_components/login/lllogin.cpp2
-rw-r--r--indra/viewer_components/updater/CMakeLists.txt6
-rw-r--r--indra/viewer_components/updater/llupdatedownloader.cpp126
-rw-r--r--indra/viewer_components/updater/llupdatedownloader.h9
-rw-r--r--indra/viewer_components/updater/llupdateinstaller.cpp14
-rw-r--r--indra/viewer_components/updater/llupdateinstaller.h7
-rw-r--r--indra/viewer_components/updater/llupdaterservice.cpp112
-rw-r--r--indra/viewer_components/updater/llupdaterservice.h27
-rw-r--r--indra/viewer_components/updater/scripts/darwin/update_install3
-rw-r--r--indra/viewer_components/updater/scripts/linux/update_install10
-rw-r--r--indra/viewer_components/updater/scripts/windows/update_install.bat2
-rw-r--r--indra/viewer_components/updater/tests/llupdaterservice_test.cpp393
-rw-r--r--indra/win_crash_logger/CMakeLists.txt2
-rw-r--r--indra/win_crash_logger/StdAfx.h1
-rw-r--r--indra/win_crash_logger/llcrashloggerwindows.cpp9
-rw-r--r--indra/win_crash_logger/llcrashloggerwindows.h1
-rw-r--r--indra/win_crash_logger/win_crash_logger.cpp35
4475 files changed, 259946 insertions, 122705 deletions
diff --git a/indra/CMakeLists.txt b/indra/CMakeLists.txt
index d01e1869b6..4b1bf49d07 100644
--- a/indra/CMakeLists.txt
+++ b/indra/CMakeLists.txt
@@ -1,4 +1,3 @@
-
# -*- cmake -*-
# cmake_minimum_required should appear before any
@@ -35,14 +34,17 @@ endif (NOT CMAKE_BUILD_TYPE)
# For the library installation process;
# see cmake/Prebuild.cmake for the counterpart code.
-file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/temp)
-file(WRITE ${CMAKE_BINARY_DIR}/temp/sentinel_installed "0")
+if ("${CMAKE_SOURCE_DIR}/../autobuild.xml" IS_NEWER_THAN "${CMAKE_BINARY_DIR}/temp/sentinel_installed")
+ file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/temp)
+ file(WRITE ${CMAKE_BINARY_DIR}/temp/sentinel_installed "0")
+endif ("${CMAKE_SOURCE_DIR}/../autobuild.xml" IS_NEWER_THAN "${CMAKE_BINARY_DIR}/temp/sentinel_installed")
add_subdirectory(cmake)
add_subdirectory(${LIBS_OPEN_PREFIX}llaudio)
add_subdirectory(${LIBS_OPEN_PREFIX}llcharacter)
add_subdirectory(${LIBS_OPEN_PREFIX}llcommon)
add_subdirectory(${LIBS_OPEN_PREFIX}llimage)
+add_subdirectory(${LIBS_OPEN_PREFIX}llkdu)
add_subdirectory(${LIBS_OPEN_PREFIX}llimagej2coj)
add_subdirectory(${LIBS_OPEN_PREFIX}llinventory)
add_subdirectory(${LIBS_OPEN_PREFIX}llmath)
@@ -53,10 +55,6 @@ add_subdirectory(${LIBS_OPEN_PREFIX}llvfs)
add_subdirectory(${LIBS_OPEN_PREFIX}llwindow)
add_subdirectory(${LIBS_OPEN_PREFIX}llxml)
-if (EXISTS ${LIBS_CLOSED_DIR}llkdu)
- add_subdirectory(${LIBS_CLOSED_PREFIX}llkdu)
-endif (EXISTS ${LIBS_CLOSED_DIR}llkdu)
-
add_subdirectory(${LIBS_OPEN_PREFIX}lscript)
if (WINDOWS AND EXISTS ${LIBS_CLOSED_DIR}copy_win_scripts)
@@ -71,13 +69,16 @@ if (VIEWER)
add_subdirectory(${LIBS_OPEN_PREFIX}llxuixml)
add_subdirectory(${LIBS_OPEN_PREFIX}viewer_components)
+ # Legacy C++ tests. Build always, run if LL_TESTS is true.
+ add_subdirectory(${VIEWER_PREFIX}test)
+
# viewer media plugins
add_subdirectory(${LIBS_OPEN_PREFIX}media_plugins)
# llplugin testbed code (is this the right way to include it?)
- if (NOT LINUX)
+ if (LL_TESTS AND NOT LINUX)
add_subdirectory(${VIEWER_PREFIX}test_apps/llplugintest)
- endif (NOT LINUX)
+ endif (LL_TESTS AND NOT LINUX)
if (LINUX)
add_subdirectory(${VIEWER_PREFIX}linux_crash_logger)
@@ -106,7 +107,7 @@ if (VIEWER)
endif (VIEWER)
# Linux builds the viewer and server in 2 separate projects
-# In order for ./develop.py build server to work on linux,
+# In order for build server to work on linux,
# the viewer project needs a server target.
# This is not true for mac and windows.
if (LINUX)
diff --git a/indra/cmake/00-Common.cmake b/indra/cmake/00-Common.cmake
index db2cdb5ff8..98eeed09b3 100644
--- a/indra/cmake/00-Common.cmake
+++ b/indra/cmake/00-Common.cmake
@@ -4,27 +4,28 @@
include(Variables)
-
# Portable compilation flags.
-
-if (EXISTS ${CMAKE_SOURCE_DIR}/llphysics)
- # The release build should only offer to send crash reports if we're
- # building from a Linden internal source tree.
- set(release_crash_reports 1)
-else (EXISTS ${CMAKE_SOURCE_DIR}/llphysics)
- set(release_crash_reports 0)
-endif (EXISTS ${CMAKE_SOURCE_DIR}/llphysics)
-
set(CMAKE_CXX_FLAGS_DEBUG "-D_DEBUG -DLL_DEBUG=1")
set(CMAKE_CXX_FLAGS_RELEASE
- "-DLL_RELEASE=1 -DLL_RELEASE_FOR_DOWNLOAD=1 -D_SECURE_SCL=0 -DLL_SEND_CRASH_REPORTS=${release_crash_reports} -DNDEBUG")
+ "-DLL_RELEASE=1 -DLL_RELEASE_FOR_DOWNLOAD=1 -DNDEBUG")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO
- "-DLL_RELEASE=1 -D_SECURE_SCL=0 -DLL_SEND_CRASH_REPORTS=0 -DNDEBUG -DLL_RELEASE_WITH_DEBUG_INFO=1")
+ "-DLL_RELEASE=1 -DNDEBUG -DLL_RELEASE_WITH_DEBUG_INFO=1")
+# Configure crash reporting
+set(RELEASE_CRASH_REPORTING OFF CACHE BOOL "Enable use of crash reporting in release builds")
+set(NON_RELEASE_CRASH_REPORTING OFF CACHE BOOL "Enable use of crash reporting in developer builds")
-# Don't bother with a MinSizeRel build.
+if(RELEASE_CRASH_REPORTING)
+ set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -DLL_SEND_CRASH_REPORTS=1")
+endif()
+
+if(NON_RELEASE_CRASH_REPORTING)
+ set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -DLL_SEND_CRASH_REPORTS=1")
+ set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DLL_SEND_CRASH_REPORTS=1")
+endif()
+# Don't bother with a MinSizeRel build.
set(CMAKE_CONFIGURATION_TYPES "RelWithDebInfo;Release;Debug" CACHE STRING
"Supported build types." FORCE)
@@ -35,13 +36,20 @@ if (WINDOWS)
# Don't build DLLs.
set(BUILD_SHARED_LIBS OFF)
- set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Od /Zi /MDd /MP"
+ # for "backwards compatibility", cmake sneaks in the Zm1000 option which royally
+ # screws incredibuild. this hack disables it.
+ # for details see: http://connect.microsoft.com/VisualStudio/feedback/details/368107/clxx-fatal-error-c1027-inconsistent-values-for-ym-between-creation-and-use-of-precompiled-headers
+ # http://www.ogre3d.org/forums/viewtopic.php?f=2&t=60015
+ # http://www.cmake.org/pipermail/cmake/2009-September/032143.html
+ string(REPLACE "/Zm1000" " " CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})
+
+ set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Od /Zi /MDd /MP -D_SCL_SECURE_NO_WARNINGS=1"
CACHE STRING "C++ compiler debug options" FORCE)
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO
- "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /Od /Zi /MD /MP /Ob2"
+ "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /Od /Zi /MD /MP /Ob0 -D_SECURE_STL=0"
CACHE STRING "C++ compiler release-with-debug options" FORCE)
set(CMAKE_CXX_FLAGS_RELEASE
- "${CMAKE_CXX_FLAGS_RELEASE} ${LL_CXX_FLAGS} /O2 /Zi /MD /MP /Ob2"
+ "${CMAKE_CXX_FLAGS_RELEASE} ${LL_CXX_FLAGS} /O2 /Zi /MD /MP /Ob2 -D_SECURE_STL=0 -D_HAS_ITERATOR_DEBUGGING=0"
CACHE STRING "C++ compiler release options" FORCE)
set(CMAKE_CXX_STANDARD_LIBRARIES "")
@@ -49,6 +57,7 @@ if (WINDOWS)
add_definitions(
/DLL_WINDOWS=1
+ /DDOM_DYNAMIC
/DUNICODE
/D_UNICODE
/GS
@@ -58,18 +67,10 @@ if (WINDOWS)
/Zc:forScope
/nologo
/Oy-
- )
-
- if(MSVC80 OR MSVC90)
- set(CMAKE_CXX_FLAGS_RELEASE
- "${CMAKE_CXX_FLAGS_RELEASE} -D_SECURE_STL=0 -D_HAS_ITERATOR_DEBUGGING=0"
- CACHE STRING "C++ compiler release options" FORCE)
-
- add_definitions(
/Zc:wchar_t-
+ /arch:SSE2
)
- endif (MSVC80 OR MSVC90)
-
+
# Are we using the crummy Visual Studio KDU build workaround?
if (NOT VS_DISABLE_FATAL_WARNINGS)
add_definitions(/WX)
@@ -142,6 +143,8 @@ if (LINUX)
-fno-strict-aliasing
-fsigned-char
-g
+ -msse2
+ -mfpmath=sse
-pthread
)
@@ -161,10 +164,6 @@ if (LINUX)
link_directories(/usr/lib/mysql4/mysql)
endif (EXISTS /usr/lib/mysql4/mysql)
- add_definitions(
- -msse2
- -mfpmath=sse
- )
endif (SERVER)
if (VIEWER)
@@ -172,6 +171,11 @@ if (LINUX)
add_definitions(-fvisibility=hidden)
# don't catch SIGCHLD in our base application class for the viewer - some of our 3rd party libs may need their *own* SIGCHLD handler to work. Sigh! The viewer doesn't need to catch SIGCHLD anyway.
add_definitions(-DLL_IGNORE_SIGCHLD)
+ if (WORD_SIZE EQUAL 32)
+ add_definitions(-march=pentium4)
+ endif (WORD_SIZE EQUAL 32)
+ add_definitions(-mfpmath=sse)
+ #add_definitions(-ftree-vectorize) # THIS CRASHES GCC 3.1-3.2
if (NOT STANDALONE)
# this stops us requiring a really recent glibc at runtime
add_definitions(-fno-stack-protector)
@@ -211,7 +215,7 @@ if (LINUX OR DARWIN)
set(GCC_WARNINGS "${GCC_WARNINGS} -Werror")
endif (NOT GCC_DISABLE_FATAL_WARNINGS)
- set(GCC_CXX_WARNINGS "${GCC_WARNINGS} -Wno-reorder -Wno-non-virtual-dtor -Woverloaded-virtual")
+ set(GCC_CXX_WARNINGS "${GCC_WARNINGS} -Wno-reorder -Wno-non-virtual-dtor")
set(CMAKE_C_FLAGS "${GCC_WARNINGS} ${CMAKE_C_FLAGS}")
set(CMAKE_CXX_FLAGS "${GCC_CXX_WARNINGS} ${CMAKE_CXX_FLAGS}")
diff --git a/indra/cmake/APR.cmake b/indra/cmake/APR.cmake
index 180504d286..daafa00fe2 100644
--- a/indra/cmake/APR.cmake
+++ b/indra/cmake/APR.cmake
@@ -32,27 +32,21 @@ else (STANDALONE)
)
elseif (DARWIN)
if (LLCOMMON_LINK_SHARED)
- set(APR_selector "0.3.7.dylib")
- set(APRUTIL_selector "0.3.8.dylib")
+ set(APR_selector "0.dylib")
+ set(APRUTIL_selector "0.dylib")
else (LLCOMMON_LINK_SHARED)
set(APR_selector "a")
set(APRUTIL_selector "a")
endif (LLCOMMON_LINK_SHARED)
- set(APR_LIBRARIES
- debug ${ARCH_PREBUILT_DIRS_DEBUG}/libapr-1.${APR_selector}
- optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libapr-1.${APR_selector}
- )
- set(APRUTIL_LIBRARIES
- debug ${ARCH_PREBUILT_DIRS_DEBUG}/libaprutil-1.${APRUTIL_selector}
- optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libaprutil-1.${APRUTIL_selector}
- )
+ set(APR_LIBRARIES libapr-1.${APR_selector})
+ set(APRUTIL_LIBRARIES libaprutil-1.${APRUTIL_selector})
set(APRICONV_LIBRARIES iconv)
else (WINDOWS)
set(APR_LIBRARIES apr-1)
set(APRUTIL_LIBRARIES aprutil-1)
set(APRICONV_LIBRARIES iconv)
endif (WINDOWS)
- set(APR_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/include/apr-1)
+ set(APR_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include/apr-1)
if (LINUX)
if (VIEWER)
diff --git a/indra/cmake/BerkeleyDB.cmake b/indra/cmake/BerkeleyDB.cmake
index d98e79179d..57b53f46ff 100644
--- a/indra/cmake/BerkeleyDB.cmake
+++ b/indra/cmake/BerkeleyDB.cmake
@@ -6,6 +6,12 @@ set(DB_FIND_REQUIRED ON)
if (STANDALONE)
include(FindBerkeleyDB)
else (STANDALONE)
- set(DB_LIBRARIES db-4.2)
+ if (LINUX)
+ # Need to add dependency pthread explicitely to support ld.gold.
+ use_prebuilt_binary(db)
+ set(DB_LIBRARIES db-5.1 pthread)
+ else (LINUX)
+ set(DB_LIBRARIES db-4.2)
+ endif (LINUX)
set(DB_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include)
endif (STANDALONE)
diff --git a/indra/cmake/Boost.cmake b/indra/cmake/Boost.cmake
index 7ce57a5572..2135f0584c 100644
--- a/indra/cmake/Boost.cmake
+++ b/indra/cmake/Boost.cmake
@@ -10,23 +10,15 @@ if (STANDALONE)
set(BOOST_PROGRAM_OPTIONS_LIBRARY boost_program_options-mt)
set(BOOST_REGEX_LIBRARY boost_regex-mt)
set(BOOST_SIGNALS_LIBRARY boost_signals-mt)
+ set(BOOST_SYSTEM_LIBRARY boost_system-mt)
+ set(BOOST_FILESYSTEM_LIBRARY boost_filesystem-mt)
else (STANDALONE)
use_prebuilt_binary(boost)
set(Boost_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include)
if (WINDOWS)
- set(BOOST_VERSION 1_39)
- if (MSVC71)
- set(BOOST_PROGRAM_OPTIONS_LIBRARY
- optimized libboost_program_options-vc71-mt-s-${BOOST_VERSION}
- debug libboost_program_options-vc71-mt-sgd-${BOOST_VERSION})
- set(BOOST_REGEX_LIBRARY
- optimized libboost_regex-vc71-mt-s-${BOOST_VERSION}
- debug libboost_regex-vc71-mt-sgd-${BOOST_VERSION})
- set(BOOST_SIGNALS_LIBRARY
- optimized libboost_signals-vc71-mt-s-${BOOST_VERSION}
- debug libboost_signals-vc71-mt-sgd-${BOOST_VERSION})
- else (MSVC71)
+ set(BOOST_VERSION 1_45)
+ if(MSVC80)
set(BOOST_PROGRAM_OPTIONS_LIBRARY
optimized libboost_program_options-vc80-mt-${BOOST_VERSION}
debug libboost_program_options-vc80-mt-gd-${BOOST_VERSION})
@@ -36,14 +28,31 @@ else (STANDALONE)
set(BOOST_SIGNALS_LIBRARY
optimized libboost_signals-vc80-mt-${BOOST_VERSION}
debug libboost_signals-vc80-mt-gd-${BOOST_VERSION})
- endif (MSVC71)
- elseif (DARWIN)
- set(BOOST_PROGRAM_OPTIONS_LIBRARY boost_program_options-xgcc40-mt)
- set(BOOST_REGEX_LIBRARY boost_regex-xgcc40-mt)
- set(BOOST_SIGNALS_LIBRARY boost_signals-xgcc40-mt)
- elseif (LINUX)
- set(BOOST_PROGRAM_OPTIONS_LIBRARY boost_program_options-gcc41-mt)
- set(BOOST_REGEX_LIBRARY boost_regex-gcc41-mt)
- set(BOOST_SIGNALS_LIBRARY boost_signals-gcc41-mt)
+ set(BOOST_SYSTEM_LIBRARY
+ optimized libboost_system-vc80-mt-${BOOST_VERSION}
+ debug libboost_system-vc80-mt-gd-${BOOST_VERSION})
+ set(BOOST_FILESYSTEM_LIBRARY
+ optimized libboost_filesystem-vc80-mt-${BOOST_VERSION}
+ debug libboost_filesystem-vc80-mt-gd-${BOOST_VERSION})
+ else(MSVC80)
+ # MSVC 10.0 config
+ set(BOOST_PROGRAM_OPTIONS_LIBRARY
+ optimized libboost_program_options-vc100-mt-${BOOST_VERSION}
+ debug libboost_program_options-vc100-mt-gd-${BOOST_VERSION})
+ set(BOOST_REGEX_LIBRARY
+ optimized libboost_regex-vc100-mt-${BOOST_VERSION}
+ debug libboost_regex-vc100-mt-gd-${BOOST_VERSION})
+ set(BOOST_SYSTEM_LIBRARY
+ optimized libboost_system-vc100-mt-${BOOST_VERSION}
+ debug libboost_system-vc100-mt-gd-${BOOST_VERSION})
+ set(BOOST_FILESYSTEM_LIBRARY
+ optimized libboost_filesystem-vc100-mt-${BOOST_VERSION}
+ debug libboost_filesystem-vc100-mt-gd-${BOOST_VERSION})
+ endif (MSVC80)
+ elseif (DARWIN OR LINUX)
+ set(BOOST_PROGRAM_OPTIONS_LIBRARY boost_program_options)
+ set(BOOST_REGEX_LIBRARY boost_regex)
+ set(BOOST_SYSTEM_LIBRARY boost_system)
+ set(BOOST_FILESYSTEM_LIBRARY boost_filesystem)
endif (WINDOWS)
endif (STANDALONE)
diff --git a/indra/cmake/CARes.cmake b/indra/cmake/CARes.cmake
index 1850b706ac..b0dac5b12f 100644
--- a/indra/cmake/CARes.cmake
+++ b/indra/cmake/CARes.cmake
@@ -13,10 +13,7 @@ else (STANDALONE)
if (WINDOWS)
set(CARES_LIBRARIES areslib)
elseif (DARWIN)
- set(CARES_LIBRARIES
- optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libcares.a
- debug ${ARCH_PREBUILT_DIRS_DEBUG}/libcares.a
- )
+ set(CARES_LIBRARIES cares)
else (WINDOWS)
set(CARES_LIBRARIES cares)
endif (WINDOWS)
diff --git a/indra/cmake/CMakeLists.txt b/indra/cmake/CMakeLists.txt
index 6470836286..279d577a27 100644
--- a/indra/cmake/CMakeLists.txt
+++ b/indra/cmake/CMakeLists.txt
@@ -20,7 +20,6 @@ set(cmake_SOURCE_FILES
CSharpMacros.cmake
DBusGlib.cmake
DirectX.cmake
- ELFIO.cmake
EXPAT.cmake
FindAPR.cmake
FindBerkeleyDB.cmake
@@ -29,12 +28,13 @@ set(cmake_SOURCE_FILES
FindFMOD.cmake
FindGooglePerfTools.cmake
FindMono.cmake
- FindMT.cmake
FindMySQL.cmake
FindOpenJPEG.cmake
FindXmlRpcEpi.cmake
+ FindZLIB.cmake
FMOD.cmake
FreeType.cmake
+ GLOD.cmake
GStreamer010Plugin.cmake
GooglePerfTools.cmake
JPEG.cmake
@@ -42,6 +42,7 @@ set(cmake_SOURCE_FILES
LLAudio.cmake
LLCharacter.cmake
LLCommon.cmake
+ LLConvexDecomposition.cmake
LLCrashLogger.cmake
LLDatabase.cmake
LLImage.cmake
@@ -84,7 +85,6 @@ source_group("Shared Rules" FILES ${cmake_SOURCE_FILES})
set(master_SOURCE_FILES
../CMakeLists.txt
- ../develop.py
)
if (SERVER)
diff --git a/indra/cmake/CURL.cmake b/indra/cmake/CURL.cmake
index 6e5fed4d52..9aba08e573 100644
--- a/indra/cmake/CURL.cmake
+++ b/indra/cmake/CURL.cmake
@@ -10,10 +10,10 @@ else (STANDALONE)
use_prebuilt_binary(curl)
if (WINDOWS)
set(CURL_LIBRARIES
- debug libcurld
- optimized libcurl)
+ debug libcurld.lib
+ optimized libcurl.lib)
else (WINDOWS)
- set(CURL_LIBRARIES curl)
+ set(CURL_LIBRARIES libcurl.a)
endif (WINDOWS)
set(CURL_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include)
endif (STANDALONE)
diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake
index e852cf463c..394db362b1 100644
--- a/indra/cmake/Copy3rdPartyLibs.cmake
+++ b/indra/cmake/Copy3rdPartyLibs.cmake
@@ -5,6 +5,7 @@
# VisualStudio.
include(CMakeCopyIfDifferent)
+include(Linking)
###################################################################
# set up platform specific lists of files that need to be copied
@@ -16,7 +17,7 @@ if(WINDOWS)
#*******************************
# VIVOX - *NOTE: no debug version
- set(vivox_src_dir "${CMAKE_SOURCE_DIR}/newview/vivox-runtime/i686-win32")
+ set(vivox_src_dir "${ARCH_PREBUILT_DIRS_RELEASE}")
set(vivox_files
SLVoice.exe
libsndfile-1.dll
@@ -30,24 +31,28 @@ if(WINDOWS)
#*******************************
# Misc shared libs
- # *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables
- # or ARCH_PREBUILT_DIRS
- set(debug_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/debug")
+ set(debug_src_dir "${ARCH_PREBUILT_DIRS_DEBUG}")
set(debug_files
openjpegd.dll
libapr-1.dll
libaprutil-1.dll
libapriconv-1.dll
+ ssleay32.dll
+ libeay32.dll
+ libcollada14dom22-d.dll
+ glod.dll
)
- # *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables
- # or ARCH_PREBUILT_DIRS
- set(release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/release")
+ set(release_src_dir "${ARCH_PREBUILT_DIRS_RELEASE}")
set(release_files
openjpeg.dll
libapr-1.dll
libaprutil-1.dll
libapriconv-1.dll
+ ssleay32.dll
+ libeay32.dll
+ libcollada14dom22.dll
+ glod.dll
)
if(USE_GOOGLE_PERFTOOLS)
@@ -60,28 +65,13 @@ if(WINDOWS)
set(release_files ${release_files} fmod.dll)
endif (FMOD)
- #*******************************
- # LLKDU
- set(internal_llkdu_path "${CMAKE_SOURCE_DIR}/llkdu")
- if(NOT EXISTS ${internal_llkdu_path})
- if (EXISTS "${debug_src_dir}/llkdu.dll")
- set(debug_llkdu_src "${debug_src_dir}/llkdu.dll")
- set(debug_llkdu_dst "${SHARED_LIB_STAGING_DIR_DEBUG}/llkdu.dll")
- endif (EXISTS "${debug_src_dir}/llkdu.dll")
-
- if (EXISTS "${release_src_dir}/llkdu.dll")
- set(release_llkdu_src "${release_src_dir}/llkdu.dll")
- set(release_llkdu_dst "${SHARED_LIB_STAGING_DIR_RELEASE}/llkdu.dll")
- set(relwithdebinfo_llkdu_dst "${SHARED_LIB_STAGING_DIR_RELWITHDEBINFO}/llkdu.dll")
- endif (EXISTS "${release_src_dir}/llkdu.dll")
- endif (NOT EXISTS ${internal_llkdu_path})
-
#*******************************
# Copy MS C runtime dlls, required for packaging.
# *TODO - Adapt this to support VC9
if (MSVC80)
FIND_PATH(debug_msvc8_redist_path msvcr80d.dll
PATHS
+ ${MSVC_DEBUG_REDIST_PATH}
[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\8.0\\Setup\\VC;ProductDir]/redist/Debug_NonRedist/x86/Microsoft.VC80.DebugCRT
NO_DEFAULT_PATH
NO_DEFAULT_PATH
@@ -106,6 +96,7 @@ if (MSVC80)
FIND_PATH(release_msvc8_redist_path msvcr80.dll
PATHS
+ ${MSVC_REDIST_PATH}
[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\8.0\\Setup\\VC;ProductDir]/redist/x86/Microsoft.VC80.CRT
NO_DEFAULT_PATH
NO_DEFAULT_PATH
@@ -135,6 +126,64 @@ if (MSVC80)
set(third_party_targets ${third_party_targets} ${out_targets})
endif (EXISTS ${release_msvc8_redist_path})
+elseif (MSVC_VERSION EQUAL 1600) # VisualStudio 2010
+ FIND_PATH(debug_msvc10_redist_path msvcr100d.dll
+ PATHS
+ ${MSVC_DEBUG_REDIST_PATH}
+ [HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\10.0\\Setup\\VC;ProductDir]/redist/Debug_NonRedist/x86/Microsoft.VC100.DebugCRT
+ [HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Windows;Directory]/SysWOW64
+ [HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Windows;Directory]/System32
+ NO_DEFAULT_PATH
+ )
+
+ if(EXISTS ${debug_msvc10_redist_path})
+ set(debug_msvc10_files
+ msvcr100d.dll
+ msvcp100d.dll
+ )
+
+ copy_if_different(
+ ${debug_msvc10_redist_path}
+ "${SHARED_LIB_STAGING_DIR_DEBUG}"
+ out_targets
+ ${debug_msvc10_files}
+ )
+ set(third_party_targets ${third_party_targets} ${out_targets})
+
+ endif ()
+
+ FIND_PATH(release_msvc10_redist_path msvcr100.dll
+ PATHS
+ ${MSVC_REDIST_PATH}
+ [HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\10.0\\Setup\\VC;ProductDir]/redist/x86/Microsoft.VC100.CRT
+ [HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Windows;Directory]/SysWOW64
+ [HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Windows;Directory]/System32
+ NO_DEFAULT_PATH
+ )
+
+ if(EXISTS ${release_msvc10_redist_path})
+ set(release_msvc10_files
+ msvcr100.dll
+ msvcp100.dll
+ )
+
+ copy_if_different(
+ ${release_msvc10_redist_path}
+ "${SHARED_LIB_STAGING_DIR_RELEASE}"
+ out_targets
+ ${release_msvc10_files}
+ )
+ set(third_party_targets ${third_party_targets} ${out_targets})
+
+ copy_if_different(
+ ${release_msvc10_redist_path}
+ "${SHARED_LIB_STAGING_DIR_RELWITHDEBINFO}"
+ out_targets
+ ${release_msvc10_files}
+ )
+ set(third_party_targets ${third_party_targets} ${out_targets})
+
+ endif ()
endif (MSVC80)
elseif(DARWIN)
@@ -142,7 +191,7 @@ elseif(DARWIN)
set(SHARED_LIB_STAGING_DIR_RELWITHDEBINFO "${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/Resources")
set(SHARED_LIB_STAGING_DIR_RELEASE "${SHARED_LIB_STAGING_DIR}/Release/Resources")
- set(vivox_src_dir "${CMAKE_SOURCE_DIR}/newview/vivox-runtime/universal-darwin")
+ set(vivox_src_dir "${ARCH_PREBUILT_DIRS_RELEASE}")
set(vivox_files
SLVoice
libsndfile.dylib
@@ -151,44 +200,28 @@ elseif(DARWIN)
libvivoxplatform.dylib
libvivoxsdk.dylib
)
- # *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables
- # or ARCH_PREBUILT_DIRS
- set(debug_src_dir "${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib_debug")
+ set(debug_src_dir "${ARCH_PREBUILT_DIRS_DEBUG}")
set(debug_files
)
- # *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables
- # or ARCH_PREBUILT_DIRS
- set(release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib_release")
+ set(release_src_dir "${ARCH_PREBUILT_DIRS_RELEASE}")
set(release_files
- libapr-1.0.3.7.dylib
+ libapr-1.0.dylib
libapr-1.dylib
- libaprutil-1.0.3.8.dylib
+ libaprutil-1.0.dylib
libaprutil-1.dylib
- libexpat.0.5.0.dylib
+ libexpat.1.5.2.dylib
libexpat.dylib
- libllqtwebkit.dylib
+ libGLOD.dylib
+ libllqtwebkit.dylib
+ libminizip.a
libndofdev.dylib
libexception_handler.dylib
+ libcollada14dom.dylib
)
# fmod is statically linked on darwin
set(fmod_files "")
- #*******************************
- # LLKDU
- set(internal_llkdu_path "${CMAKE_SOURCE_DIR}/llkdu")
- if(NOT EXISTS ${internal_llkdu_path})
- if (EXISTS "${debug_src_dir}/libllkdu.dylib")
- set(debug_llkdu_src "${debug_src_dir}/libllkdu.dylib")
- set(debug_llkdu_dst "${SHARED_LIB_STAGING_DIR_DEBUG}/libllkdu.dylib")
- endif (EXISTS "${debug_src_dir}/libllkdu.dylib")
-
- if (EXISTS "${release_src_dir}/libllkdu.dylib")
- set(release_llkdu_src "${release_src_dir}/libllkdu.dylib")
- set(release_llkdu_dst "${SHARED_LIB_STAGING_DIR_RELEASE}/libllkdu.dylib")
- set(relwithdebinfo_llkdu_dst "${SHARED_LIB_STAGING_DIR_RELWITHDEBINFO}/libllkdu.dylib")
- endif (EXISTS "${release_src_dir}/libllkdu.dylib")
- endif (NOT EXISTS ${internal_llkdu_path})
elseif(LINUX)
# linux is weird, multiple side by side configurations aren't supported
# and we don't seem to have any debug shared libs built yet anyways...
@@ -196,7 +229,7 @@ elseif(LINUX)
set(SHARED_LIB_STAGING_DIR_RELWITHDEBINFO "${SHARED_LIB_STAGING_DIR}")
set(SHARED_LIB_STAGING_DIR_RELEASE "${SHARED_LIB_STAGING_DIR}")
- set(vivox_src_dir "${CMAKE_SOURCE_DIR}/newview/vivox-runtime/i686-linux")
+ set(vivox_src_dir "${ARCH_PREBUILT_DIRS_RELEASE}")
set(vivox_files
libsndfile.so.1
libortp.so
@@ -207,56 +240,45 @@ elseif(LINUX)
)
# *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables
# or ARCH_PREBUILT_DIRS
- set(debug_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-linux/lib_debug")
+ set(debug_src_dir "${ARCH_PREBUILT_DIRS_DEBUG}")
set(debug_files
)
# *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables
# or ARCH_PREBUILT_DIRS
- set(release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-linux/lib_release_client")
+ set(release_src_dir "${ARCH_PREBUILT_DIRS_RELEASE}")
# *FIX - figure out what to do with duplicate libalut.so here -brad
set(release_files
libapr-1.so.0
libaprutil-1.so.0
libatk-1.0.so
libbreakpad_client.so.0
- libcrypto.so.0.9.7
- libdb-4.2.so
+ libcollada14dom.so
+ libcrypto.so.1.0.0
+ libdb-5.1.so
libexpat.so
libexpat.so.1
+ libglod.so
libgmock_main.so
libgmock.so.0
libgmodule-2.0.so
libgobject-2.0.so
libgtest_main.so
libgtest.so.0
+ libminizip.so
libopenal.so
libopenjpeg.so
libssl.so
- libstacktrace.so
- libtcmalloc.so
- libuuid.so.1
- libssl.so.0.9.7
+ libtcmalloc_minimal.so
+ libuuid.so.16
+ libuuid.so.16.0.22
+ libssl.so.1.0.0
+ libfontconfig.so.1.4.4
)
if (FMOD)
set(release_files ${release_files} "libfmod-3.75.so")
endif (FMOD)
- #*******************************
- # LLKDU
- set(internal_llkdu_path "${CMAKE_SOURCE_DIR}/llkdu")
- if(NOT EXISTS ${internal_llkdu_path})
- if (EXISTS "${debug_src_dir}/libllkdu.so")
- set(debug_llkdu_src "${debug_src_dir}/libllkdu.so")
- set(debug_llkdu_dst "${SHARED_LIB_STAGING_DIR_DEBUG}/libllkdu.so")
- endif (EXISTS "${debug_src_dir}/libllkdu.so")
-
- if (EXISTS "${release_src_dir}/libllkdu.so")
- set(release_llkdu_src "${release_src_dir}/libllkdu.so")
- set(release_llkdu_dst "${SHARED_LIB_STAGING_DIR_RELEASE}/libllkdu.so")
- set(relwithdebinfo_llkdu_dst "${SHARED_LIB_STAGING_DIR_RELWITHDEBINFO}/libllkdu.so")
- endif (EXISTS "${release_src_dir}/libllkdu.so")
- endif(NOT EXISTS ${internal_llkdu_path})
else(WINDOWS)
message(STATUS "WARNING: unrecognized platform for staging 3rd party libs, skipping...")
set(vivox_src_dir "${CMAKE_SOURCE_DIR}/newview/vivox-runtime/i686-linux")
@@ -334,40 +356,29 @@ copy_if_different(
)
set(third_party_targets ${third_party_targets} ${out_targets})
-#*******************************
-# LLKDU
-set(internal_llkdu_path "${CMAKE_SOURCE_DIR}/llkdu")
-if(NOT EXISTS ${internal_llkdu_path})
- if (EXISTS "${debug_llkdu_src}")
- ADD_CUSTOM_COMMAND(
- OUTPUT ${debug_llkdu_dst}
- COMMAND ${CMAKE_COMMAND} -E copy_if_different ${debug_llkdu_src} ${debug_llkdu_dst}
- DEPENDS ${debug_llkdu_src}
- COMMENT "Copying llkdu.dll ${SHARED_LIB_STAGING_DIR_DEBUG}"
- )
- set(third_party_targets ${third_party_targets} $} ${debug_llkdu_dst})
- endif (EXISTS "${debug_llkdu_src}")
-
- if (EXISTS "${release_llkdu_src}")
- ADD_CUSTOM_COMMAND(
- OUTPUT ${release_llkdu_dst}
- COMMAND ${CMAKE_COMMAND} -E copy_if_different ${release_llkdu_src} ${release_llkdu_dst}
- DEPENDS ${release_llkdu_src}
- COMMENT "Copying llkdu.dll ${SHARED_LIB_STAGING_DIR_RELEASE}"
- )
- set(third_party_targets ${third_party_targets} ${release_llkdu_dst})
-
- ADD_CUSTOM_COMMAND(
- OUTPUT ${relwithdebinfo_llkdu_dst}
- COMMAND ${CMAKE_COMMAND} -E copy_if_different ${release_llkdu_src} ${relwithdebinfo_llkdu_dst}
- DEPENDS ${release_llkdu_src}
- COMMENT "Copying llkdu.dll ${SHARED_LIB_STAGING_DIR_RELWITHDEBINFO}"
- )
- set(third_party_targets ${third_party_targets} ${relwithdebinfo_llkdu_dst})
- endif (EXISTS "${release_llkdu_src}")
-
-endif (NOT EXISTS ${internal_llkdu_path})
-
+if (FMOD_SDK_DIR)
+ copy_if_different(
+ ${FMOD_SDK_DIR}
+ "${CMAKE_CURRENT_BINARY_DIR}/Debug"
+ out_targets
+ ${fmod_files}
+ )
+ set(all_targets ${all_targets} ${out_targets})
+ copy_if_different(
+ ${FMOD_SDK_DIR}
+ "${CMAKE_CURRENT_BINARY_DIR}/Release"
+ out_targets
+ ${fmod_files}
+ )
+ set(all_targets ${all_targets} ${out_targets})
+ copy_if_different(
+ ${FMOD_SDK_DIR}
+ "${CMAKE_CURRENT_BINARY_DIR}/RelWithDbgInfo"
+ out_targets
+ ${fmod_files}
+ )
+ set(all_targets ${all_targets} ${out_targets})
+endif (FMOD_SDK_DIR)
if(NOT STANDALONE)
add_custom_target(
diff --git a/indra/cmake/DBusGlib.cmake b/indra/cmake/DBusGlib.cmake
index cfc4ccd404..83c08d3350 100644
--- a/indra/cmake/DBusGlib.cmake
+++ b/indra/cmake/DBusGlib.cmake
@@ -10,7 +10,7 @@ elseif (LINUX)
use_prebuilt_binary(dbusglib)
set(DBUSGLIB_FOUND ON FORCE BOOL)
set(DBUSGLIB_INCLUDE_DIRS
- ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/include/glib-2.0
+ ${LIBS_PREBUILT_DIR}/include/dbus
)
# We don't need to explicitly link against dbus-glib itself, because
# the viewer probes for the system's copy at runtime.
diff --git a/indra/cmake/DirectX.cmake b/indra/cmake/DirectX.cmake
index 29724ee2fc..b2a18805d4 100644
--- a/indra/cmake/DirectX.cmake
+++ b/indra/cmake/DirectX.cmake
@@ -3,6 +3,7 @@
if (VIEWER AND WINDOWS)
find_path(DIRECTX_INCLUDE_DIR dxdiag.h
"$ENV{DXSDK_DIR}/Include"
+ "$ENV{PROGRAMFILES}/Microsoft DirectX SDK (August 2009)/Include"
"$ENV{PROGRAMFILES}/Microsoft DirectX SDK (March 2009)/Include"
"$ENV{PROGRAMFILES}/Microsoft DirectX SDK (August 2008)/Include"
"$ENV{PROGRAMFILES}/Microsoft DirectX SDK (June 2008)/Include"
@@ -24,6 +25,7 @@ if (VIEWER AND WINDOWS)
find_path(DIRECTX_LIBRARY_DIR dxguid.lib
"$ENV{DXSDK_DIR}/Lib/x86"
+ "$ENV{PROGRAMFILES}/Microsoft DirectX SDK (August 2009)/Lib/x86"
"$ENV{PROGRAMFILES}/Microsoft DirectX SDK (March 2009)/Lib/x86"
"$ENV{PROGRAMFILES}/Microsoft DirectX SDK (August 2008)/Lib/x86"
"$ENV{PROGRAMFILES}/Microsoft DirectX SDK (June 2008)/Lib/x86"
diff --git a/indra/cmake/ELFIO.cmake b/indra/cmake/ELFIO.cmake
deleted file mode 100644
index e51993b0f7..0000000000
--- a/indra/cmake/ELFIO.cmake
+++ /dev/null
@@ -1,19 +0,0 @@
-# -*- cmake -*-
-include(Prebuilt)
-
-set(ELFIO_FIND_QUIETLY ON)
-
-if (STANDALONE)
- include(FindELFIO)
-elseif (LINUX)
- use_prebuilt_binary(elfio)
- set(ELFIO_LIBRARIES ELFIO)
- set(ELFIO_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include)
- set(ELFIO_FOUND "YES")
-endif (STANDALONE)
-
-if (ELFIO_FOUND)
- add_definitions(-DLL_ELFBIN=1)
-else (ELFIO_FOUND)
- set(ELFIO_INCLUDE_DIR "")
-endif (ELFIO_FOUND)
diff --git a/indra/cmake/FMOD.cmake b/indra/cmake/FMOD.cmake
index dcf44cd642..3586c1160a 100644
--- a/indra/cmake/FMOD.cmake
+++ b/indra/cmake/FMOD.cmake
@@ -1,26 +1,39 @@
# -*- cmake -*-
-set(FMOD ON CACHE BOOL "Use FMOD sound library.")
+# FMOD can be set when launching the make using the argument -DFMOD:BOOL=ON
+# When building using proprietary binaries though (i.e. having access to LL private servers),
+# we always build with FMOD.
+# Open source devs should use the -DFMOD:BOOL=ON then if they want to build with FMOD, whether
+# they are using STANDALONE or not.
+if (INSTALL_PROPRIETARY)
+ set(FMOD ON CACHE BOOL "Use FMOD sound library.")
+endif (INSTALL_PROPRIETARY)
if (FMOD)
if (STANDALONE)
+ # In that case, we use the version of the library installed on the system
set(FMOD_FIND_REQUIRED ON)
include(FindFMOD)
else (STANDALONE)
- if (INSTALL_PROPRIETARY)
+ if (FMOD_LIBRARY AND FMOD_INCLUDE_DIR)
+ # If the path have been specified in the arguments, use that
+ set(FMOD_LIBRARIES ${FMOD_LIBRARY})
+ MESSAGE(STATUS "Using FMOD path: ${FMOD_LIBRARIES}, ${FMOD_INCLUDE_DIR}")
+ else (FMOD_LIBRARY AND FMOD_INCLUDE_DIR)
+ # If not, we're going to try to get the package listed in autobuild.xml
+ # Note: if you're not using INSTALL_PROPRIETARY, the package URL should be local (file:/// URL)
+ # as accessing the private LL location will fail if you don't have the credential
include(Prebuilt)
- use_prebuilt_binary(fmod)
- endif (INSTALL_PROPRIETARY)
-
- if (WINDOWS)
- set(FMOD_LIBRARY fmod)
- elseif (DARWIN)
- set(FMOD_LIBRARY fmod)
- elseif (LINUX)
- set(FMOD_LIBRARY fmod-3.75)
- endif (WINDOWS)
-
- SET(FMOD_LIBRARIES ${FMOD_LIBRARY})
- set(FMOD_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include)
+ use_prebuilt_binary(fmod)
+ if (WINDOWS)
+ set(FMOD_LIBRARY fmod)
+ elseif (DARWIN)
+ set(FMOD_LIBRARY fmod)
+ elseif (LINUX)
+ set(FMOD_LIBRARY fmod-3.75)
+ endif (WINDOWS)
+ set(FMOD_LIBRARIES ${FMOD_LIBRARY})
+ set(FMOD_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include)
+ endif (FMOD_LIBRARY AND FMOD_INCLUDE_DIR)
endif (STANDALONE)
endif (FMOD)
diff --git a/indra/cmake/FindAutobuild.cmake b/indra/cmake/FindAutobuild.cmake
new file mode 100644
index 0000000000..4b5fd484ae
--- /dev/null
+++ b/indra/cmake/FindAutobuild.cmake
@@ -0,0 +1,41 @@
+# -*- cmake -*-
+#
+# Find the autobuild tool
+#
+# Output variables:
+#
+# AUTOBUILD_EXECUTABLE - path to autobuild or pautobuild executable
+
+# *TODO - if cmake was executed by autobuild, autobuild will have set the AUTOBUILD env var
+# update this to check for that case
+
+IF (NOT AUTOBUILD_EXECUTABLE)
+ IF(WIN32)
+ SET(AUTOBUILD_EXE_NAMES autobuild.cmd autobuild.exe)
+ ELSE(WIN32)
+ SET(AUTOBUILD_EXE_NAMES autobuild)
+ ENDIF(WIN32)
+
+ SET(AUTOBUILD_EXECUTABLE)
+ FIND_PROGRAM(
+ AUTOBUILD_EXECUTABLE
+ NAMES ${AUTOBUILD_EXE_NAMES}
+ PATHS
+ ENV PATH
+ ${CMAKE_SOURCE_DIR}/..
+ ${CMAKE_SOURCE_DIR}/../..
+ ${CMAKE_SOURCE_DIR}/../../..
+ PATH_SUFFIXES "/autobuild/bin/"
+ )
+
+ IF (AUTOBUILD_EXECUTABLE)
+ GET_FILENAME_COMPONENT(_autobuild_name ${AUTOBUILD_EXECUTABLE} NAME_WE)
+ MESSAGE(STATUS "Using autobuild at: ${AUTOBUILD_EXECUTABLE}")
+ ELSE (AUTOBUILD_EXECUTABLE)
+ IF (AUTOBUILD_FIND_REQUIRED)
+ MESSAGE(FATAL_ERROR "Could not find autobuild executable")
+ ENDIF (AUTOBUILD_FIND_REQUIRED)
+ ENDIF (AUTOBUILD_EXECUTABLE)
+
+ MARK_AS_ADVANCED(AUTOBUILD_EXECUTABLE)
+ENDIF (NOT AUTOBUILD_EXECUTABLE)
diff --git a/indra/cmake/FindFMOD.cmake b/indra/cmake/FindFMOD.cmake
index e60b386027..1ebbc8c96e 100644
--- a/indra/cmake/FindFMOD.cmake
+++ b/indra/cmake/FindFMOD.cmake
@@ -11,7 +11,7 @@
FIND_PATH(FMOD_INCLUDE_DIR fmod.h PATH_SUFFIXES fmod)
-SET(FMOD_NAMES ${FMOD_NAMES} fmod fmodvc fmod-3.75)
+SET(FMOD_NAMES ${FMOD_NAMES} fmod fmodvc fmodex fmod-3.75)
FIND_LIBRARY(FMOD_LIBRARY
NAMES ${FMOD_NAMES}
PATH_SUFFIXES fmod
diff --git a/indra/cmake/FindGLH.cmake b/indra/cmake/FindGLH.cmake
new file mode 100644
index 0000000000..3d16adaf03
--- /dev/null
+++ b/indra/cmake/FindGLH.cmake
@@ -0,0 +1,30 @@
+# -*- cmake -*-
+
+# - Find GLH
+# Find the Graphic Library Helper includes.
+# This module defines
+# GLH_INCLUDE_DIR, where to find glh/glh_linear.h.
+# GLH_FOUND, If false, do not try to use GLH.
+
+find_path(GLH_INCLUDE_DIR glh/glh_linear.h
+ NO_SYSTEM_ENVIRONMENT_PATH
+ )
+
+if (GLH_INCLUDE_DIR)
+ set(GLH_FOUND "YES")
+else (GLH_INCLUDE_DIR)
+ set(GLH_FOUND "NO")
+endif (GLH_INCLUDE_DIR)
+
+if (GLH_FOUND)
+ if (NOT GLH_FIND_QUIETLY)
+ message(STATUS "Found GLH: ${GLH_INCLUDE_DIR}")
+ set(GLH_FIND_QUIETLY TRUE) # Only alert us the first time
+ endif (NOT GLH_FIND_QUIETLY)
+else (GLH_FOUND)
+ if (GLH_FIND_REQUIRED)
+ message(FATAL_ERROR "Could not find GLH")
+ endif (GLH_FIND_REQUIRED)
+endif (GLH_FOUND)
+
+mark_as_advanced(GLH_INCLUDE_DIR)
diff --git a/indra/cmake/FindJsonCpp.cmake b/indra/cmake/FindJsonCpp.cmake
index 9d16f2aaab..0b056ada58 100644
--- a/indra/cmake/FindJsonCpp.cmake
+++ b/indra/cmake/FindJsonCpp.cmake
@@ -21,7 +21,12 @@ EXEC_PROGRAM(${CMAKE_CXX_COMPILER}
OUTPUT_STRIP_TRAILING_WHITESPACE
)
+# Try to find a library that was compiled with the same compiler version as we currently use.
SET(JSONCPP_NAMES ${JSONCPP_NAMES} libjson_linux-gcc-${_gcc_COMPILER_VERSION}_libmt.so)
+IF (STANDALONE)
+ # On standalone, assume that the system installed library was compiled with the used compiler.
+ SET(JSONCPP_NAMES ${JSONCPP_NAMES} libjson.so)
+ENDIF (STANDALONE)
FIND_LIBRARY(JSONCPP_LIBRARY
NAMES ${JSONCPP_NAMES}
PATHS /usr/lib /usr/local/lib
diff --git a/indra/cmake/FindLLQtWebkit.cmake b/indra/cmake/FindLLQtWebkit.cmake
new file mode 100644
index 0000000000..2f666d3bf0
--- /dev/null
+++ b/indra/cmake/FindLLQtWebkit.cmake
@@ -0,0 +1,62 @@
+# -*- cmake -*-
+
+# - Find llqtwebkit
+# Find the llqtwebkit includes and library
+# This module defines
+# LLQTWEBKIT_INCLUDE_DIR, where to find llqtwebkit.h, etc.
+# LLQTWEBKIT_LIBRARY, the llqtwebkit library with full path.
+# LLQTWEBKIT_FOUND, If false, do not try to use llqtwebkit.
+# also defined, but not for general use are
+# LLQTWEBKIT_LIBRARIES, the libraries needed to use llqtwebkit.
+# LLQTWEBKIT_LIBRARY_DIRS, where to find the llqtwebkit library.
+# LLQTWEBKIT_DEFINITIONS - You should add_definitions(${LLQTWEBKIT_DEFINITIONS})
+# before compiling code that includes llqtwebkit library files.
+
+# Try to use pkg-config first.
+# This allows to have two different libllqtwebkit packages installed:
+# one for viewer 2.x and one for viewer 1.x.
+include(FindPkgConfig)
+if (PKG_CONFIG_FOUND)
+ if (LLQtWebkit_FIND_REQUIRED AND LLQtWebkit_FIND_VERSION)
+ set(_PACKAGE_ARGS libllqtwebkit>=${LLQtWebkit_FIND_VERSION} REQUIRED)
+ else (LLQtWebkit_FIND_REQUIRED AND LLQtWebkit_FIND_VERSION)
+ set(_PACKAGE_ARGS libllqtwebkit)
+ endif (LLQtWebkit_FIND_REQUIRED AND LLQtWebkit_FIND_VERSION)
+ if (NOT "${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION}" VERSION_LESS "2.8.2")
+ # As virtually nobody will have a pkg-config file for this, do this check always quiet.
+ # Unfortunately cmake 2.8.2 or higher is required for pkg_check_modules to have a 'QUIET'.
+ set(_PACKAGE_ARGS ${_PACKAGE_ARGS} QUIET)
+ endif ()
+ pkg_check_modules(LLQTWEBKIT ${_PACKAGE_ARGS})
+endif (PKG_CONFIG_FOUND)
+set(LLQTWEBKIT_DEFINITIONS ${LLQTWEBKIT_CFLAGS_OTHER})
+
+find_path(LLQTWEBKIT_INCLUDE_DIR llqtwebkit.h NO_SYSTEM_ENVIRONMENT_PATH HINTS ${LLQTWEBKIT_INCLUDE_DIRS})
+
+find_library(LLQTWEBKIT_LIBRARY NAMES llqtwebkit NO_SYSTEM_ENVIRONMENT_PATH HINTS ${LLQTWEBKIT_LIBRARY_DIRS})
+
+if (NOT PKG_CONFIG_FOUND OR NOT LLQTWEBKIT_FOUND) # If pkg-config couldn't find it, pretend we don't have pkg-config.
+ set(LLQTWEBKIT_LIBRARIES llqtwebkit)
+ get_filename_component(LLQTWEBKIT_LIBRARY_DIRS ${LLQTWEBKIT_LIBRARY} PATH)
+endif (NOT PKG_CONFIG_FOUND OR NOT LLQTWEBKIT_FOUND)
+
+# Handle the QUIETLY and REQUIRED arguments and set LLQTWEBKIT_FOUND
+# to TRUE if all listed variables are TRUE.
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(
+ LLQTWEBKIT
+ DEFAULT_MSG
+ LLQTWEBKIT_LIBRARY
+ LLQTWEBKIT_INCLUDE_DIR
+ LLQTWEBKIT_LIBRARIES
+ LLQTWEBKIT_LIBRARY_DIRS
+ )
+
+mark_as_advanced(
+ LLQTWEBKIT_LIBRARY
+ LLQTWEBKIT_INCLUDE_DIR
+ LLQTWEBKIT_LIBRARIES
+ LLQTWEBKIT_LIBRARY_DIRS
+ LLQTWEBKIT_DEFINITIONS
+ )
+
diff --git a/indra/cmake/FindNDOF.cmake b/indra/cmake/FindNDOF.cmake
new file mode 100644
index 0000000000..6dcf590a53
--- /dev/null
+++ b/indra/cmake/FindNDOF.cmake
@@ -0,0 +1,39 @@
+# -*- cmake -*-
+
+# - Find NDOF
+# Find the NDOF includes and library
+# This module defines
+# NDOF_INCLUDE_DIR, where to find ndofdev_external.h, etc.
+# NDOF_LIBRARY, the library needed to use NDOF.
+# NDOF_FOUND, If false, do not try to use NDOF.
+
+find_path(NDOF_INCLUDE_DIR ndofdev_external.h
+ PATH_SUFFIXES ndofdev
+ )
+
+set(NDOF_NAMES ${NDOF_NAMES} ndofdev libndofdev)
+find_library(NDOF_LIBRARY
+ NAMES ${NDOF_NAMES}
+ )
+
+if (NDOF_LIBRARY AND NDOF_INCLUDE_DIR)
+ set(NDOF_FOUND "YES")
+else (NDOF_LIBRARY AND NDOF_INCLUDE_DIR)
+ set(NDOF_FOUND "NO")
+endif (NDOF_LIBRARY AND NDOF_INCLUDE_DIR)
+
+
+if (NDOF_FOUND)
+ if (NOT NDOF_FIND_QUIETLY)
+ message(STATUS "Found NDOF: Library in '${NDOF_LIBRARY}' and header in '${NDOF_INCLUDE_DIR}' ")
+ endif (NOT NDOF_FIND_QUIETLY)
+else (NDOF_FOUND)
+ if (NDOF_FIND_REQUIRED)
+ message(FATAL_ERROR " * * *\nCould not find NDOF library!\nIf you don't need Space Navigator Joystick support you can skip this test by configuring with -DNDOF:BOOL=OFF\n * * *")
+ endif (NDOF_FIND_REQUIRED)
+endif (NDOF_FOUND)
+
+mark_as_advanced(
+ NDOF_LIBRARY
+ NDOF_INCLUDE_DIR
+ )
diff --git a/indra/cmake/FindTut.cmake b/indra/cmake/FindTut.cmake
deleted file mode 100644
index b5d58f6396..0000000000
--- a/indra/cmake/FindTut.cmake
+++ /dev/null
@@ -1,31 +0,0 @@
-# -*- cmake -*-
-
-# - Find Tut
-# Find the Tut unit test framework includes and library
-# This module defines
-# TUT_INCLUDE_DIR, where to find tut.h, etc.
-# TUT_FOUND, If false, do not try to use Tut.
-
-find_path(TUT_INCLUDE_DIR tut.h
- /usr/local/include/
- /usr/include
- )
-
-if (TUT_INCLUDE_DIR)
- set(TUT_FOUND "YES")
-else (TUT_INCLUDE_DIR)
- set(TUT_FOUND "NO")
-endif (TUT_INCLUDE_DIR)
-
-if (TUT_FOUND)
- if (NOT TUT_FIND_QUIETLY)
- message(STATUS "Found Tut: ${TUT_INCLUDE_DIR}")
- set(TUT_FIND_QUIETLY TRUE) # Only alert us the first time
- endif (NOT TUT_FIND_QUIETLY)
-else (TUT_FOUND)
- if (TUT_FIND_REQUIRED)
- message(FATAL_ERROR "Could not find Tut")
- endif (TUT_FIND_REQUIRED)
-endif (TUT_FOUND)
-
-mark_as_advanced(TUT_INCLUDE_DIR)
diff --git a/indra/cmake/FindZLIB.cmake b/indra/cmake/FindZLIB.cmake
new file mode 100644
index 0000000000..03a7db9d6f
--- /dev/null
+++ b/indra/cmake/FindZLIB.cmake
@@ -0,0 +1,46 @@
+# -*- cmake -*-
+
+# - Find zlib
+# Find the ZLIB includes and library
+# This module defines
+# ZLIB_INCLUDE_DIRS, where to find zlib.h, etc.
+# ZLIB_LIBRARIES, the libraries needed to use zlib.
+# ZLIB_FOUND, If false, do not try to use zlib.
+#
+# This FindZLIB is about 43 times as fast the one provided with cmake (2.8.x),
+# because it doesn't look up the version of zlib, resulting in a dramatic
+# speed up for configure (from 4 minutes 22 seconds to 6 seconds).
+#
+# Note: Since this file is only used for standalone, the windows
+# specific parts were left out.
+
+FIND_PATH(ZLIB_INCLUDE_DIR zlib.h
+ NO_SYSTEM_ENVIRONMENT_PATH
+ )
+
+FIND_LIBRARY(ZLIB_LIBRARY z)
+
+if (ZLIB_LIBRARY AND ZLIB_INCLUDE_DIR)
+ SET(ZLIB_INCLUDE_DIRS ${ZLIB_INCLUDE_DIR})
+ SET(ZLIB_LIBRARIES ${ZLIB_LIBRARY})
+ SET(ZLIB_FOUND "YES")
+else (ZLIB_LIBRARY AND ZLIB_INCLUDE_DIR)
+ SET(ZLIB_FOUND "NO")
+endif (ZLIB_LIBRARY AND ZLIB_INCLUDE_DIR)
+
+if (ZLIB_FOUND)
+ if (NOT ZLIB_FIND_QUIETLY)
+ message(STATUS "Found ZLIB: ${ZLIB_LIBRARIES}")
+ SET(ZLIB_FIND_QUIETLY TRUE)
+ endif (NOT ZLIB_FIND_QUIETLY)
+else (ZLIB_FOUND)
+ if (ZLIB_FIND_REQUIRED)
+ message(FATAL_ERROR "Could not find ZLIB library")
+ endif (ZLIB_FIND_REQUIRED)
+endif (ZLIB_FOUND)
+
+mark_as_advanced(
+ ZLIB_LIBRARY
+ ZLIB_INCLUDE_DIR
+ )
+
diff --git a/indra/cmake/FreeType.cmake b/indra/cmake/FreeType.cmake
index 5f1aa26e89..43a9d282d0 100644
--- a/indra/cmake/FreeType.cmake
+++ b/indra/cmake/FreeType.cmake
@@ -9,7 +9,7 @@ else (STANDALONE)
use_prebuilt_binary(freetype)
if (LINUX)
set(FREETYPE_INCLUDE_DIRS
- ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/include)
+ ${LIBS_PREBUILT_DIR}/include)
else (LINUX)
set(FREETYPE_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include)
endif (LINUX)
diff --git a/indra/cmake/GLH.cmake b/indra/cmake/GLH.cmake
new file mode 100644
index 0000000000..911dbe4017
--- /dev/null
+++ b/indra/cmake/GLH.cmake
@@ -0,0 +1,11 @@
+# -*- cmake -*-
+include(Prebuilt)
+
+set(GLH_FIND_REQUIRED TRUE)
+set(GLH_FIND_QUIETLY TRUE)
+
+if (STANDALONE)
+ include(FindGLH)
+else (STANDALONE)
+ use_prebuilt_binary(glh_linear)
+endif (STANDALONE)
diff --git a/indra/cmake/GLOD.cmake b/indra/cmake/GLOD.cmake
new file mode 100644
index 0000000000..77221d55ed
--- /dev/null
+++ b/indra/cmake/GLOD.cmake
@@ -0,0 +1,9 @@
+# -*- cmake -*-
+include(Prebuilt)
+
+if (NOT STANDALONE)
+ use_prebuilt_binary(GLOD)
+endif (NOT STANDALONE)
+
+set(GLOD_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include)
+set(GLOD_LIBRARIES glod)
diff --git a/indra/cmake/GStreamer010Plugin.cmake b/indra/cmake/GStreamer010Plugin.cmake
index 0ca432da18..d2d0699bcd 100644
--- a/indra/cmake/GStreamer010Plugin.cmake
+++ b/indra/cmake/GStreamer010Plugin.cmake
@@ -13,9 +13,9 @@ elseif (LINUX)
set(GSTREAMER010_FOUND ON FORCE BOOL)
set(GSTREAMER010_PLUGINS_BASE_FOUND ON FORCE BOOL)
set(GSTREAMER010_INCLUDE_DIRS
- ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/include/gstreamer-0.10
- ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/include/glib-2.0
- ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/include/libxml2
+ ${LIBS_PREBUILT_DIR}/include/gstreamer-0.10
+ ${LIBS_PREBUILT_DIR}/include/glib-2.0
+ ${LIBS_PREBUILT_DIR}/include/libxml2
)
# We don't need to explicitly link against gstreamer itself, because
# LLMediaImplGStreamer probes for the system's copy at runtime.
diff --git a/indra/cmake/GetPrerequisites_2_8.cmake b/indra/cmake/GetPrerequisites_2_8.cmake
index 5a24842c89..05ec1539ba 100644
--- a/indra/cmake/GetPrerequisites_2_8.cmake
+++ b/indra/cmake/GetPrerequisites_2_8.cmake
@@ -1,786 +1,786 @@
-# GetPrerequisites.cmake
-#
-# This script provides functions to list the .dll, .dylib or .so files that an
-# executable or shared library file depends on. (Its prerequisites.)
-#
-# It uses various tools to obtain the list of required shared library files:
-# dumpbin (Windows)
-# ldd (Linux/Unix)
-# otool (Mac OSX)
-#
-# The following functions are provided by this script:
-# gp_append_unique
-# is_file_executable
-# gp_item_default_embedded_path
-# (projects can override with gp_item_default_embedded_path_override)
-# gp_resolve_item
-# (projects can override with gp_resolve_item_override)
-# gp_resolved_file_type
-# gp_file_type
-# get_prerequisites
-# list_prerequisites
-# list_prerequisites_by_glob
-#
-# Requires CMake 2.6 or greater because it uses function, break, return and
-# PARENT_SCOPE.
-
-#=============================================================================
-# Copyright 2008-2009 Kitware, Inc.
-#
-# Distributed under the OSI-approved BSD License (the "License");
-# see accompanying file Copyright.txt for details.
-#
-# This software is distributed WITHOUT ANY WARRANTY; without even the
-# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-# See the License for more information.
-#=============================================================================
-# (To distributed this file outside of CMake, substitute the full
-# License text for the above reference.)
-
-# gp_append_unique list_var value
-#
-# Append value to the list variable ${list_var} only if the value is not
-# already in the list.
-#
-function(gp_append_unique list_var value)
- set(contains 0)
-
- foreach(item ${${list_var}})
- if("${item}" STREQUAL "${value}")
- set(contains 1)
- break()
- endif("${item}" STREQUAL "${value}")
- endforeach(item)
-
- if(NOT contains)
- set(${list_var} ${${list_var}} "${value}" PARENT_SCOPE)
- endif(NOT contains)
-endfunction(gp_append_unique)
-
-
-# is_file_executable file result_var
-#
-# Return 1 in ${result_var} if ${file} is a binary executable.
-#
-# Return 0 in ${result_var} otherwise.
-#
-function(is_file_executable file result_var)
- #
- # A file is not executable until proven otherwise:
- #
- set(${result_var} 0 PARENT_SCOPE)
-
- get_filename_component(file_full "${file}" ABSOLUTE)
- string(TOLOWER "${file_full}" file_full_lower)
-
- # If file name ends in .exe on Windows, *assume* executable:
- #
- if(WIN32)
- if("${file_full_lower}" MATCHES "\\.exe$")
- set(${result_var} 1 PARENT_SCOPE)
- return()
- endif("${file_full_lower}" MATCHES "\\.exe$")
-
- # A clause could be added here that uses output or return value of dumpbin
- # to determine ${result_var}. In 99%+? practical cases, the exe name
- # match will be sufficient...
- #
- endif(WIN32)
-
- # Use the information returned from the Unix shell command "file" to
- # determine if ${file_full} should be considered an executable file...
- #
- # If the file command's output contains "executable" and does *not* contain
- # "text" then it is likely an executable suitable for prerequisite analysis
- # via the get_prerequisites macro.
- #
- if(UNIX)
- if(NOT file_cmd)
- find_program(file_cmd "file")
- endif(NOT file_cmd)
-
- if(file_cmd)
- execute_process(COMMAND "${file_cmd}" "${file_full}"
- OUTPUT_VARIABLE file_ov
- OUTPUT_STRIP_TRAILING_WHITESPACE
- )
-
- # Replace the name of the file in the output with a placeholder token
- # (the string " _file_full_ ") so that just in case the path name of
- # the file contains the word "text" or "executable" we are not fooled
- # into thinking "the wrong thing" because the file name matches the
- # other 'file' command output we are looking for...
- #
- string(REPLACE "${file_full}" " _file_full_ " file_ov "${file_ov}")
- string(TOLOWER "${file_ov}" file_ov)
-
- #message(STATUS "file_ov='${file_ov}'")
- if("${file_ov}" MATCHES "executable")
- #message(STATUS "executable!")
- if("${file_ov}" MATCHES "text")
- #message(STATUS "but text, so *not* a binary executable!")
- else("${file_ov}" MATCHES "text")
- set(${result_var} 1 PARENT_SCOPE)
- return()
- endif("${file_ov}" MATCHES "text")
- endif("${file_ov}" MATCHES "executable")
- else(file_cmd)
- message(STATUS "warning: No 'file' command, skipping execute_process...")
- endif(file_cmd)
- endif(UNIX)
-endfunction(is_file_executable)
-
-
-# gp_item_default_embedded_path item default_embedded_path_var
-#
-# Return the path that others should refer to the item by when the item
-# is embedded inside a bundle.
-#
-# Override on a per-project basis by providing a project-specific
-# gp_item_default_embedded_path_override function.
-#
-function(gp_item_default_embedded_path item default_embedded_path_var)
-
- # On Windows and Linux, "embed" prerequisites in the same directory
- # as the executable by default:
- #
- set(path "@executable_path")
- set(overridden 0)
-
- # On the Mac, relative to the executable depending on the type
- # of the thing we are embedding:
- #
- if(APPLE)
- #
- # The assumption here is that all executables in the bundle will be
- # in same-level-directories inside the bundle. The parent directory
- # of an executable inside the bundle should be MacOS or a sibling of
- # MacOS and all embedded paths returned from here will begin with
- # "@executable_path/../" and will work from all executables in all
- # such same-level-directories inside the bundle.
- #
-
- # By default, embed things right next to the main bundle executable:
- #
- set(path "@executable_path/../../Contents/MacOS")
-
- # Embed .dylibs right next to the main bundle executable:
- #
- if(item MATCHES "\\.dylib$")
- set(path "@executable_path/../MacOS")
- set(overridden 1)
- endif(item MATCHES "\\.dylib$")
-
- # Embed frameworks in the embedded "Frameworks" directory (sibling of MacOS):
- #
- if(NOT overridden)
- if(item MATCHES "[^/]+\\.framework/")
- set(path "@executable_path/../Frameworks")
- set(overridden 1)
- endif(item MATCHES "[^/]+\\.framework/")
- endif(NOT overridden)
- endif()
-
- # Provide a hook so that projects can override the default embedded location
- # of any given library by whatever logic they choose:
- #
- if(COMMAND gp_item_default_embedded_path_override)
- gp_item_default_embedded_path_override("${item}" path)
- endif(COMMAND gp_item_default_embedded_path_override)
-
- set(${default_embedded_path_var} "${path}" PARENT_SCOPE)
-endfunction(gp_item_default_embedded_path)
-
-
-# gp_resolve_item context item exepath dirs resolved_item_var
-#
-# Resolve an item into an existing full path file.
-#
-# Override on a per-project basis by providing a project-specific
-# gp_resolve_item_override function.
-#
-function(gp_resolve_item context item exepath dirs resolved_item_var)
- set(resolved 0)
- set(resolved_item "${item}")
-
- # Is it already resolved?
- #
- if(EXISTS "${resolved_item}")
- set(resolved 1)
- endif(EXISTS "${resolved_item}")
-
- if(NOT resolved)
- if(item MATCHES "@executable_path")
- #
- # @executable_path references are assumed relative to exepath
- #
- string(REPLACE "@executable_path" "${exepath}" ri "${item}")
- get_filename_component(ri "${ri}" ABSOLUTE)
-
- if(EXISTS "${ri}")
- #message(STATUS "info: embedded item exists (${ri})")
- set(resolved 1)
- set(resolved_item "${ri}")
- else(EXISTS "${ri}")
- message(STATUS "warning: embedded item does not exist '${ri}'")
- endif(EXISTS "${ri}")
- endif(item MATCHES "@executable_path")
- endif(NOT resolved)
-
- if(NOT resolved)
- if(item MATCHES "@loader_path")
- #
- # @loader_path references are assumed relative to the
- # PATH of the given "context" (presumably another library)
- #
- get_filename_component(contextpath "${context}" PATH)
- string(REPLACE "@loader_path" "${contextpath}" ri "${item}")
- get_filename_component(ri "${ri}" ABSOLUTE)
-
- if(EXISTS "${ri}")
- #message(STATUS "info: embedded item exists (${ri})")
- set(resolved 1)
- set(resolved_item "${ri}")
- else(EXISTS "${ri}")
- message(STATUS "warning: embedded item does not exist '${ri}'")
- endif(EXISTS "${ri}")
- endif(item MATCHES "@loader_path")
- endif(NOT resolved)
-
- if(NOT resolved)
- set(ri "ri-NOTFOUND")
- find_file(ri "${item}" ${exepath} ${dirs} NO_DEFAULT_PATH)
- find_file(ri "${item}" ${exepath} ${dirs} /usr/lib)
- if(ri)
- #message(STATUS "info: 'find_file' in exepath/dirs (${ri})")
- set(resolved 1)
- set(resolved_item "${ri}")
- set(ri "ri-NOTFOUND")
- endif(ri)
- endif(NOT resolved)
-
- if(NOT resolved)
- if(item MATCHES "[^/]+\\.framework/")
- set(fw "fw-NOTFOUND")
- find_file(fw "${item}"
- "~/Library/Frameworks"
- "/Library/Frameworks"
- "/System/Library/Frameworks"
- )
- if(fw)
- #message(STATUS "info: 'find_file' found framework (${fw})")
- set(resolved 1)
- set(resolved_item "${fw}")
- set(fw "fw-NOTFOUND")
- endif(fw)
- endif(item MATCHES "[^/]+\\.framework/")
- endif(NOT resolved)
-
- # Using find_program on Windows will find dll files that are in the PATH.
- # (Converting simple file names into full path names if found.)
- #
- if(WIN32)
- if(NOT resolved)
- set(ri "ri-NOTFOUND")
- find_program(ri "${item}" PATHS "${exepath};${dirs}" NO_DEFAULT_PATH)
- find_program(ri "${item}" PATHS "${exepath};${dirs}")
- if(ri)
- #message(STATUS "info: 'find_program' in exepath/dirs (${ri})")
- set(resolved 1)
- set(resolved_item "${ri}")
- set(ri "ri-NOTFOUND")
- endif(ri)
- endif(NOT resolved)
- endif(WIN32)
-
- # Provide a hook so that projects can override item resolution
- # by whatever logic they choose:
- #
- if(COMMAND gp_resolve_item_override)
- gp_resolve_item_override("${context}" "${item}" "${exepath}" "${dirs}" resolved_item resolved)
- endif(COMMAND gp_resolve_item_override)
-
- if(NOT resolved)
- message(STATUS "
-warning: cannot resolve item '${item}'
-
- possible problems:
- need more directories?
- need to use InstallRequiredSystemLibraries?
- run in install tree instead of build tree?
-")
-# message(STATUS "
-#******************************************************************************
-#warning: cannot resolve item '${item}'
-#
-# possible problems:
-# need more directories?
-# need to use InstallRequiredSystemLibraries?
-# run in install tree instead of build tree?
-#
-# context='${context}'
-# item='${item}'
-# exepath='${exepath}'
-# dirs='${dirs}'
-# resolved_item_var='${resolved_item_var}'
-#******************************************************************************
-#")
- endif(NOT resolved)
-
- set(${resolved_item_var} "${resolved_item}" PARENT_SCOPE)
-endfunction(gp_resolve_item)
-
-
-# gp_resolved_file_type original_file file exepath dirs type_var
-#
-# Return the type of ${file} with respect to ${original_file}. String
-# describing type of prerequisite is returned in variable named ${type_var}.
-#
-# Use ${exepath} and ${dirs} if necessary to resolve non-absolute ${file}
-# values -- but only for non-embedded items.
-#
-# Possible types are:
-# system
-# local
-# embedded
-# other
-#
-function(gp_resolved_file_type original_file file exepath dirs type_var)
- #message(STATUS "**")
-
- if(NOT IS_ABSOLUTE "${original_file}")
- message(STATUS "warning: gp_resolved_file_type expects absolute full path for first arg original_file")
- endif()
-
- set(is_embedded 0)
- set(is_local 0)
- set(is_system 0)
-
- set(resolved_file "${file}")
-
- if("${file}" MATCHES "^@(executable|loader)_path")
- set(is_embedded 1)
- endif()
-
- if(NOT is_embedded)
- if(NOT IS_ABSOLUTE "${file}")
- gp_resolve_item("${original_file}" "${file}" "${exepath}" "${dirs}" resolved_file)
- endif()
-
- string(TOLOWER "${original_file}" original_lower)
- string(TOLOWER "${resolved_file}" lower)
-
- if(UNIX)
- if(resolved_file MATCHES "^(/lib/|/lib32/|/lib64/|/usr/lib/|/usr/lib32/|/usr/lib64/|/usr/X11R6/)")
- set(is_system 1)
- endif()
- endif()
-
- if(APPLE)
- if(resolved_file MATCHES "^(/System/Library/|/usr/lib/)")
- set(is_system 1)
- endif()
- endif()
-
- if(WIN32)
- string(TOLOWER "$ENV{SystemRoot}" sysroot)
- string(REGEX REPLACE "\\\\" "/" sysroot "${sysroot}")
-
- string(TOLOWER "$ENV{windir}" windir)
- string(REGEX REPLACE "\\\\" "/" windir "${windir}")
-
- if(lower MATCHES "^(${sysroot}/system|${windir}/system|${sysroot}/syswow|${windir}/syswow|(.*/)*msvc[^/]+dll)")
- set(is_system 1)
- endif()
- endif()
-
- if(NOT is_system)
- get_filename_component(original_path "${original_lower}" PATH)
- get_filename_component(path "${lower}" PATH)
- if("${original_path}" STREQUAL "${path}")
- set(is_local 1)
- endif()
- endif()
- endif()
-
- # Return type string based on computed booleans:
- #
- set(type "other")
-
- if(is_system)
- set(type "system")
- elseif(is_embedded)
- set(type "embedded")
- elseif(is_local)
- set(type "local")
- endif()
-
- #message(STATUS "gp_resolved_file_type: '${file}' '${resolved_file}'")
- #message(STATUS " type: '${type}'")
-
- if(NOT is_embedded)
- if(NOT IS_ABSOLUTE "${resolved_file}")
- if(lower MATCHES "^msvc[^/]+dll" AND is_system)
- message(STATUS "info: non-absolute msvc file '${file}' returning type '${type}'")
- else()
- message(STATUS "warning: gp_resolved_file_type non-absolute file '${file}' returning type '${type}' -- possibly incorrect")
- endif()
- endif()
- endif()
-
- set(${type_var} "${type}" PARENT_SCOPE)
-
- #message(STATUS "**")
-endfunction()
-
-
-# gp_file_type original_file file type_var
-#
-# Return the type of ${file} with respect to ${original_file}. String
-# describing type of prerequisite is returned in variable named ${type_var}.
-#
-# Possible types are:
-# system
-# local
-# embedded
-# other
-#
-function(gp_file_type original_file file type_var)
- if(NOT IS_ABSOLUTE "${original_file}")
- message(STATUS "warning: gp_file_type expects absolute full path for first arg original_file")
- endif()
-
- get_filename_component(exepath "${original_file}" PATH)
-
- set(type "")
- gp_resolved_file_type("${original_file}" "${file}" "${exepath}" "" type)
-
- set(${type_var} "${type}" PARENT_SCOPE)
-endfunction(gp_file_type)
-
-
-# get_prerequisites target prerequisites_var exclude_system recurse dirs
-#
-# Get the list of shared library files required by ${target}. The list in
-# the variable named ${prerequisites_var} should be empty on first entry to
-# this function. On exit, ${prerequisites_var} will contain the list of
-# required shared library files.
-#
-# target is the full path to an executable file
-#
-# prerequisites_var is the name of a CMake variable to contain the results
-#
-# exclude_system is 0 or 1: 0 to include "system" prerequisites , 1 to
-# exclude them
-#
-# recurse is 0 or 1: 0 for direct prerequisites only, 1 for all prerequisites
-# recursively
-#
-# exepath is the path to the top level executable used for @executable_path
-# replacment on the Mac
-#
-# dirs is a list of paths where libraries might be found: these paths are
-# searched first when a target without any path info is given. Then standard
-# system locations are also searched: PATH, Framework locations, /usr/lib...
-#
-function(get_prerequisites target prerequisites_var exclude_system recurse exepath dirs)
- set(verbose 0)
- set(eol_char "E")
-
- if(NOT IS_ABSOLUTE "${target}")
- message("warning: target '${target}' is not absolute...")
- endif(NOT IS_ABSOLUTE "${target}")
-
- if(NOT EXISTS "${target}")
- message("warning: target '${target}' does not exist...")
- endif(NOT EXISTS "${target}")
-
- # <setup-gp_tool-vars>
- #
- # Try to choose the right tool by default. Caller can set gp_tool prior to
- # calling this function to force using a different tool.
- #
- if("${gp_tool}" STREQUAL "")
- set(gp_tool "ldd")
- if(APPLE)
- set(gp_tool "otool")
- endif(APPLE)
- if(WIN32)
- set(gp_tool "dumpbin")
- endif(WIN32)
- endif("${gp_tool}" STREQUAL "")
-
- set(gp_tool_known 0)
-
- if("${gp_tool}" STREQUAL "ldd")
- set(gp_cmd_args "")
- set(gp_regex "^[\t ]*[^\t ]+ => ([^\t ]+).*${eol_char}$")
- set(gp_regex_cmp_count 1)
- set(gp_tool_known 1)
- endif("${gp_tool}" STREQUAL "ldd")
-
- if("${gp_tool}" STREQUAL "otool")
- set(gp_cmd_args "-L")
- set(gp_regex "^\t([^\t]+) \\(compatibility version ([0-9]+.[0-9]+.[0-9]+), current version ([0-9]+.[0-9]+.[0-9]+)\\)${eol_char}$")
- set(gp_regex_cmp_count 3)
- set(gp_tool_known 1)
- endif("${gp_tool}" STREQUAL "otool")
-
- if("${gp_tool}" STREQUAL "dumpbin")
- set(gp_cmd_args "/dependents")
- set(gp_regex "^ ([^ ].*[Dd][Ll][Ll])${eol_char}$")
- set(gp_regex_cmp_count 1)
- set(gp_tool_known 1)
- set(ENV{VS_UNICODE_OUTPUT} "") # Block extra output from inside VS IDE.
- endif("${gp_tool}" STREQUAL "dumpbin")
-
- if(NOT gp_tool_known)
- message(STATUS "warning: gp_tool='${gp_tool}' is an unknown tool...")
- message(STATUS "CMake function get_prerequisites needs more code to handle '${gp_tool}'")
- message(STATUS "Valid gp_tool values are dumpbin, ldd and otool.")
- return()
- endif(NOT gp_tool_known)
-
- set(gp_cmd_paths ${gp_cmd_paths}
- "C:/Program Files/Microsoft Visual Studio 9.0/VC/bin"
- "C:/Program Files (x86)/Microsoft Visual Studio 9.0/VC/bin"
- "C:/Program Files/Microsoft Visual Studio 8/VC/BIN"
- "C:/Program Files (x86)/Microsoft Visual Studio 8/VC/BIN"
- "C:/Program Files/Microsoft Visual Studio .NET 2003/VC7/BIN"
- "C:/Program Files (x86)/Microsoft Visual Studio .NET 2003/VC7/BIN"
- "/usr/local/bin"
- "/usr/bin"
- )
-
- find_program(gp_cmd ${gp_tool} PATHS ${gp_cmd_paths})
-
- if(NOT gp_cmd)
- message(STATUS "warning: could not find '${gp_tool}' - cannot analyze prerequisites...")
- return()
- endif(NOT gp_cmd)
-
- if("${gp_tool}" STREQUAL "dumpbin")
- # When running dumpbin, it also needs the "Common7/IDE" directory in the
- # PATH. It will already be in the PATH if being run from a Visual Studio
- # command prompt. Add it to the PATH here in case we are running from a
- # different command prompt.
- #
- get_filename_component(gp_cmd_dir "${gp_cmd}" PATH)
- get_filename_component(gp_cmd_dlls_dir "${gp_cmd_dir}/../../Common7/IDE" ABSOLUTE)
- if(EXISTS "${gp_cmd_dlls_dir}")
- # only add to the path if it is not already in the path
- if(NOT "$ENV{PATH}" MATCHES "${gp_cmd_dlls_dir}")
- set(ENV{PATH} "$ENV{PATH};${gp_cmd_dlls_dir}")
- endif(NOT "$ENV{PATH}" MATCHES "${gp_cmd_dlls_dir}")
- endif(EXISTS "${gp_cmd_dlls_dir}")
- endif("${gp_tool}" STREQUAL "dumpbin")
- #
- # </setup-gp_tool-vars>
-
- if("${gp_tool}" STREQUAL "ldd")
- set(old_ld_env "$ENV{LD_LIBRARY_PATH}")
- foreach(dir ${exepath} ${dirs})
- set(ENV{LD_LIBRARY_PATH} "${dir}:$ENV{LD_LIBRARY_PATH}")
- endforeach(dir)
- endif("${gp_tool}" STREQUAL "ldd")
-
-
- # Track new prerequisites at each new level of recursion. Start with an
- # empty list at each level:
- #
- set(unseen_prereqs)
-
- # Run gp_cmd on the target:
- #
- execute_process(
- COMMAND ${gp_cmd} ${gp_cmd_args} ${target}
- OUTPUT_VARIABLE gp_cmd_ov
- )
-
- if("${gp_tool}" STREQUAL "ldd")
- set(ENV{LD_LIBRARY_PATH} "${old_ld_env}")
- endif("${gp_tool}" STREQUAL "ldd")
-
- if(verbose)
- message(STATUS "<RawOutput cmd='${gp_cmd} ${gp_cmd_args} ${target}'>")
- message(STATUS "gp_cmd_ov='${gp_cmd_ov}'")
- message(STATUS "</RawOutput>")
- endif(verbose)
-
- get_filename_component(target_dir "${target}" PATH)
-
- # Convert to a list of lines:
- #
- string(REGEX REPLACE ";" "\\\\;" candidates "${gp_cmd_ov}")
- string(REGEX REPLACE "\n" "${eol_char};" candidates "${candidates}")
-
- # Analyze each line for file names that match the regular expression:
- #
- foreach(candidate ${candidates})
- if("${candidate}" MATCHES "${gp_regex}")
- # Extract information from each candidate:
- string(REGEX REPLACE "${gp_regex}" "\\1" raw_item "${candidate}")
-
- if(gp_regex_cmp_count GREATER 1)
- string(REGEX REPLACE "${gp_regex}" "\\2" raw_compat_version "${candidate}")
- string(REGEX REPLACE "^([0-9]+)\\.([0-9]+)\\.([0-9]+)$" "\\1" compat_major_version "${raw_compat_version}")
- string(REGEX REPLACE "^([0-9]+)\\.([0-9]+)\\.([0-9]+)$" "\\2" compat_minor_version "${raw_compat_version}")
- string(REGEX REPLACE "^([0-9]+)\\.([0-9]+)\\.([0-9]+)$" "\\3" compat_patch_version "${raw_compat_version}")
- endif(gp_regex_cmp_count GREATER 1)
-
- if(gp_regex_cmp_count GREATER 2)
- string(REGEX REPLACE "${gp_regex}" "\\3" raw_current_version "${candidate}")
- string(REGEX REPLACE "^([0-9]+)\\.([0-9]+)\\.([0-9]+)$" "\\1" current_major_version "${raw_current_version}")
- string(REGEX REPLACE "^([0-9]+)\\.([0-9]+)\\.([0-9]+)$" "\\2" current_minor_version "${raw_current_version}")
- string(REGEX REPLACE "^([0-9]+)\\.([0-9]+)\\.([0-9]+)$" "\\3" current_patch_version "${raw_current_version}")
- endif(gp_regex_cmp_count GREATER 2)
-
- # Use the raw_item as the list entries returned by this function. Use the
- # gp_resolve_item function to resolve it to an actual full path file if
- # necessary.
- #
- set(item "${raw_item}")
-
- # Add each item unless it is excluded:
- #
- set(add_item 1)
-
- if(${exclude_system})
- set(type "")
- gp_resolved_file_type("${target}" "${item}" "${exepath}" "${dirs}" type)
- if("${type}" STREQUAL "system")
- set(add_item 0)
- endif("${type}" STREQUAL "system")
- endif(${exclude_system})
-
- if(add_item)
- list(LENGTH ${prerequisites_var} list_length_before_append)
- gp_append_unique(${prerequisites_var} "${item}")
- list(LENGTH ${prerequisites_var} list_length_after_append)
-
- if(${recurse})
- # If item was really added, this is the first time we have seen it.
- # Add it to unseen_prereqs so that we can recursively add *its*
- # prerequisites...
- #
- # But first: resolve its name to an absolute full path name such
- # that the analysis tools can simply accept it as input.
- #
- if(NOT list_length_before_append EQUAL list_length_after_append)
- gp_resolve_item("${target}" "${item}" "${exepath}" "${dirs}" resolved_item)
- set(unseen_prereqs ${unseen_prereqs} "${resolved_item}")
- endif(NOT list_length_before_append EQUAL list_length_after_append)
- endif(${recurse})
- endif(add_item)
- else("${candidate}" MATCHES "${gp_regex}")
- if(verbose)
- message(STATUS "ignoring non-matching line: '${candidate}'")
- endif(verbose)
- endif("${candidate}" MATCHES "${gp_regex}")
- endforeach(candidate)
-
- list(LENGTH ${prerequisites_var} prerequisites_var_length)
- if(prerequisites_var_length GREATER 0)
- list(SORT ${prerequisites_var})
- endif(prerequisites_var_length GREATER 0)
- if(${recurse})
- set(more_inputs ${unseen_prereqs})
- foreach(input ${more_inputs})
- get_prerequisites("${input}" ${prerequisites_var} ${exclude_system} ${recurse} "${exepath}" "${dirs}")
- endforeach(input)
- endif(${recurse})
-
- set(${prerequisites_var} ${${prerequisites_var}} PARENT_SCOPE)
-endfunction(get_prerequisites)
-
-
-# list_prerequisites target all exclude_system verbose
-#
-# ARGV0 (target) is the full path to an executable file
-#
-# optional ARGV1 (all) is 0 or 1: 0 for direct prerequisites only,
-# 1 for all prerequisites recursively
-#
-# optional ARGV2 (exclude_system) is 0 or 1: 0 to include "system"
-# prerequisites , 1 to exclude them
-#
-# optional ARGV3 (verbose) is 0 or 1: 0 to print only full path
-# names of prerequisites, 1 to print extra information
-#
-function(list_prerequisites target)
- if("${ARGV1}" STREQUAL "")
- set(all 1)
- else("${ARGV1}" STREQUAL "")
- set(all "${ARGV1}")
- endif("${ARGV1}" STREQUAL "")
-
- if("${ARGV2}" STREQUAL "")
- set(exclude_system 0)
- else("${ARGV2}" STREQUAL "")
- set(exclude_system "${ARGV2}")
- endif("${ARGV2}" STREQUAL "")
-
- if("${ARGV3}" STREQUAL "")
- set(verbose 0)
- else("${ARGV3}" STREQUAL "")
- set(verbose "${ARGV3}")
- endif("${ARGV3}" STREQUAL "")
-
- set(count 0)
- set(count_str "")
- set(print_count "${verbose}")
- set(print_prerequisite_type "${verbose}")
- set(print_target "${verbose}")
- set(type_str "")
-
- get_filename_component(exepath "${target}" PATH)
-
- set(prereqs "")
- get_prerequisites("${target}" prereqs ${exclude_system} ${all} "${exepath}" "")
-
- if(print_target)
- message(STATUS "File '${target}' depends on:")
- endif(print_target)
-
- foreach(d ${prereqs})
- math(EXPR count "${count} + 1")
-
- if(print_count)
- set(count_str "${count}. ")
- endif(print_count)
-
- if(print_prerequisite_type)
- gp_file_type("${target}" "${d}" type)
- set(type_str " (${type})")
- endif(print_prerequisite_type)
-
- message(STATUS "${count_str}${d}${type_str}")
- endforeach(d)
-endfunction(list_prerequisites)
-
-
-# list_prerequisites_by_glob glob_arg glob_exp
-#
-# glob_arg is GLOB or GLOB_RECURSE
-#
-# glob_exp is a globbing expression used with "file(GLOB" to retrieve a list
-# of matching files. If a matching file is executable, its prerequisites are
-# listed.
-#
-# Any additional (optional) arguments provided are passed along as the
-# optional arguments to the list_prerequisites calls.
-#
-function(list_prerequisites_by_glob glob_arg glob_exp)
- message(STATUS "=============================================================================")
- message(STATUS "List prerequisites of executables matching ${glob_arg} '${glob_exp}'")
- message(STATUS "")
- file(${glob_arg} file_list ${glob_exp})
- foreach(f ${file_list})
- is_file_executable("${f}" is_f_executable)
- if(is_f_executable)
- message(STATUS "=============================================================================")
- list_prerequisites("${f}" ${ARGN})
- message(STATUS "")
- endif(is_f_executable)
- endforeach(f)
-endfunction(list_prerequisites_by_glob)
+# GetPrerequisites.cmake
+#
+# This script provides functions to list the .dll, .dylib or .so files that an
+# executable or shared library file depends on. (Its prerequisites.)
+#
+# It uses various tools to obtain the list of required shared library files:
+# dumpbin (Windows)
+# ldd (Linux/Unix)
+# otool (Mac OSX)
+#
+# The following functions are provided by this script:
+# gp_append_unique
+# is_file_executable
+# gp_item_default_embedded_path
+# (projects can override with gp_item_default_embedded_path_override)
+# gp_resolve_item
+# (projects can override with gp_resolve_item_override)
+# gp_resolved_file_type
+# gp_file_type
+# get_prerequisites
+# list_prerequisites
+# list_prerequisites_by_glob
+#
+# Requires CMake 2.6 or greater because it uses function, break, return and
+# PARENT_SCOPE.
+
+#=============================================================================
+# Copyright 2008-2009 Kitware, Inc.
+#
+# Distributed under the OSI-approved BSD License (the "License");
+# see accompanying file Copyright.txt for details.
+#
+# This software is distributed WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the License for more information.
+#=============================================================================
+# (To distributed this file outside of CMake, substitute the full
+# License text for the above reference.)
+
+# gp_append_unique list_var value
+#
+# Append value to the list variable ${list_var} only if the value is not
+# already in the list.
+#
+function(gp_append_unique list_var value)
+ set(contains 0)
+
+ foreach(item ${${list_var}})
+ if("${item}" STREQUAL "${value}")
+ set(contains 1)
+ break()
+ endif("${item}" STREQUAL "${value}")
+ endforeach(item)
+
+ if(NOT contains)
+ set(${list_var} ${${list_var}} "${value}" PARENT_SCOPE)
+ endif(NOT contains)
+endfunction(gp_append_unique)
+
+
+# is_file_executable file result_var
+#
+# Return 1 in ${result_var} if ${file} is a binary executable.
+#
+# Return 0 in ${result_var} otherwise.
+#
+function(is_file_executable file result_var)
+ #
+ # A file is not executable until proven otherwise:
+ #
+ set(${result_var} 0 PARENT_SCOPE)
+
+ get_filename_component(file_full "${file}" ABSOLUTE)
+ string(TOLOWER "${file_full}" file_full_lower)
+
+ # If file name ends in .exe on Windows, *assume* executable:
+ #
+ if(WIN32)
+ if("${file_full_lower}" MATCHES "\\.exe$")
+ set(${result_var} 1 PARENT_SCOPE)
+ return()
+ endif("${file_full_lower}" MATCHES "\\.exe$")
+
+ # A clause could be added here that uses output or return value of dumpbin
+ # to determine ${result_var}. In 99%+? practical cases, the exe name
+ # match will be sufficient...
+ #
+ endif(WIN32)
+
+ # Use the information returned from the Unix shell command "file" to
+ # determine if ${file_full} should be considered an executable file...
+ #
+ # If the file command's output contains "executable" and does *not* contain
+ # "text" then it is likely an executable suitable for prerequisite analysis
+ # via the get_prerequisites macro.
+ #
+ if(UNIX)
+ if(NOT file_cmd)
+ find_program(file_cmd "file")
+ endif(NOT file_cmd)
+
+ if(file_cmd)
+ execute_process(COMMAND "${file_cmd}" "${file_full}"
+ OUTPUT_VARIABLE file_ov
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+ )
+
+ # Replace the name of the file in the output with a placeholder token
+ # (the string " _file_full_ ") so that just in case the path name of
+ # the file contains the word "text" or "executable" we are not fooled
+ # into thinking "the wrong thing" because the file name matches the
+ # other 'file' command output we are looking for...
+ #
+ string(REPLACE "${file_full}" " _file_full_ " file_ov "${file_ov}")
+ string(TOLOWER "${file_ov}" file_ov)
+
+ #message(STATUS "file_ov='${file_ov}'")
+ if("${file_ov}" MATCHES "executable")
+ #message(STATUS "executable!")
+ if("${file_ov}" MATCHES "text")
+ #message(STATUS "but text, so *not* a binary executable!")
+ else("${file_ov}" MATCHES "text")
+ set(${result_var} 1 PARENT_SCOPE)
+ return()
+ endif("${file_ov}" MATCHES "text")
+ endif("${file_ov}" MATCHES "executable")
+ else(file_cmd)
+ message(STATUS "warning: No 'file' command, skipping execute_process...")
+ endif(file_cmd)
+ endif(UNIX)
+endfunction(is_file_executable)
+
+
+# gp_item_default_embedded_path item default_embedded_path_var
+#
+# Return the path that others should refer to the item by when the item
+# is embedded inside a bundle.
+#
+# Override on a per-project basis by providing a project-specific
+# gp_item_default_embedded_path_override function.
+#
+function(gp_item_default_embedded_path item default_embedded_path_var)
+
+ # On Windows and Linux, "embed" prerequisites in the same directory
+ # as the executable by default:
+ #
+ set(path "@executable_path")
+ set(overridden 0)
+
+ # On the Mac, relative to the executable depending on the type
+ # of the thing we are embedding:
+ #
+ if(APPLE)
+ #
+ # The assumption here is that all executables in the bundle will be
+ # in same-level-directories inside the bundle. The parent directory
+ # of an executable inside the bundle should be MacOS or a sibling of
+ # MacOS and all embedded paths returned from here will begin with
+ # "@executable_path/../" and will work from all executables in all
+ # such same-level-directories inside the bundle.
+ #
+
+ # By default, embed things right next to the main bundle executable:
+ #
+ set(path "@executable_path/../../Contents/MacOS")
+
+ # Embed .dylibs right next to the main bundle executable:
+ #
+ if(item MATCHES "\\.dylib$")
+ set(path "@executable_path/../MacOS")
+ set(overridden 1)
+ endif(item MATCHES "\\.dylib$")
+
+ # Embed frameworks in the embedded "Frameworks" directory (sibling of MacOS):
+ #
+ if(NOT overridden)
+ if(item MATCHES "[^/]+\\.framework/")
+ set(path "@executable_path/../Frameworks")
+ set(overridden 1)
+ endif(item MATCHES "[^/]+\\.framework/")
+ endif(NOT overridden)
+ endif()
+
+ # Provide a hook so that projects can override the default embedded location
+ # of any given library by whatever logic they choose:
+ #
+ if(COMMAND gp_item_default_embedded_path_override)
+ gp_item_default_embedded_path_override("${item}" path)
+ endif(COMMAND gp_item_default_embedded_path_override)
+
+ set(${default_embedded_path_var} "${path}" PARENT_SCOPE)
+endfunction(gp_item_default_embedded_path)
+
+
+# gp_resolve_item context item exepath dirs resolved_item_var
+#
+# Resolve an item into an existing full path file.
+#
+# Override on a per-project basis by providing a project-specific
+# gp_resolve_item_override function.
+#
+function(gp_resolve_item context item exepath dirs resolved_item_var)
+ set(resolved 0)
+ set(resolved_item "${item}")
+
+ # Is it already resolved?
+ #
+ if(EXISTS "${resolved_item}")
+ set(resolved 1)
+ endif(EXISTS "${resolved_item}")
+
+ if(NOT resolved)
+ if(item MATCHES "@executable_path")
+ #
+ # @executable_path references are assumed relative to exepath
+ #
+ string(REPLACE "@executable_path" "${exepath}" ri "${item}")
+ get_filename_component(ri "${ri}" ABSOLUTE)
+
+ if(EXISTS "${ri}")
+ #message(STATUS "info: embedded item exists (${ri})")
+ set(resolved 1)
+ set(resolved_item "${ri}")
+ else(EXISTS "${ri}")
+ message(STATUS "warning: embedded item does not exist '${ri}'")
+ endif(EXISTS "${ri}")
+ endif(item MATCHES "@executable_path")
+ endif(NOT resolved)
+
+ if(NOT resolved)
+ if(item MATCHES "@loader_path")
+ #
+ # @loader_path references are assumed relative to the
+ # PATH of the given "context" (presumably another library)
+ #
+ get_filename_component(contextpath "${context}" PATH)
+ string(REPLACE "@loader_path" "${contextpath}" ri "${item}")
+ get_filename_component(ri "${ri}" ABSOLUTE)
+
+ if(EXISTS "${ri}")
+ #message(STATUS "info: embedded item exists (${ri})")
+ set(resolved 1)
+ set(resolved_item "${ri}")
+ else(EXISTS "${ri}")
+ message(STATUS "warning: embedded item does not exist '${ri}'")
+ endif(EXISTS "${ri}")
+ endif(item MATCHES "@loader_path")
+ endif(NOT resolved)
+
+ if(NOT resolved)
+ set(ri "ri-NOTFOUND")
+ find_file(ri "${item}" ${exepath} ${dirs} NO_DEFAULT_PATH)
+ find_file(ri "${item}" ${exepath} ${dirs} /usr/lib)
+ if(ri)
+ #message(STATUS "info: 'find_file' in exepath/dirs (${ri})")
+ set(resolved 1)
+ set(resolved_item "${ri}")
+ set(ri "ri-NOTFOUND")
+ endif(ri)
+ endif(NOT resolved)
+
+ if(NOT resolved)
+ if(item MATCHES "[^/]+\\.framework/")
+ set(fw "fw-NOTFOUND")
+ find_file(fw "${item}"
+ "~/Library/Frameworks"
+ "/Library/Frameworks"
+ "/System/Library/Frameworks"
+ )
+ if(fw)
+ #message(STATUS "info: 'find_file' found framework (${fw})")
+ set(resolved 1)
+ set(resolved_item "${fw}")
+ set(fw "fw-NOTFOUND")
+ endif(fw)
+ endif(item MATCHES "[^/]+\\.framework/")
+ endif(NOT resolved)
+
+ # Using find_program on Windows will find dll files that are in the PATH.
+ # (Converting simple file names into full path names if found.)
+ #
+ if(WIN32)
+ if(NOT resolved)
+ set(ri "ri-NOTFOUND")
+ find_program(ri "${item}" PATHS "${exepath};${dirs}" NO_DEFAULT_PATH)
+ find_program(ri "${item}" PATHS "${exepath};${dirs}")
+ if(ri)
+ #message(STATUS "info: 'find_program' in exepath/dirs (${ri})")
+ set(resolved 1)
+ set(resolved_item "${ri}")
+ set(ri "ri-NOTFOUND")
+ endif(ri)
+ endif(NOT resolved)
+ endif(WIN32)
+
+ # Provide a hook so that projects can override item resolution
+ # by whatever logic they choose:
+ #
+ if(COMMAND gp_resolve_item_override)
+ gp_resolve_item_override("${context}" "${item}" "${exepath}" "${dirs}" resolved_item resolved)
+ endif(COMMAND gp_resolve_item_override)
+
+ if(NOT resolved)
+ message(STATUS "
+warning: cannot resolve item '${item}'
+
+ possible problems:
+ need more directories?
+ need to use InstallRequiredSystemLibraries?
+ run in install tree instead of build tree?
+")
+# message(STATUS "
+#******************************************************************************
+#warning: cannot resolve item '${item}'
+#
+# possible problems:
+# need more directories?
+# need to use InstallRequiredSystemLibraries?
+# run in install tree instead of build tree?
+#
+# context='${context}'
+# item='${item}'
+# exepath='${exepath}'
+# dirs='${dirs}'
+# resolved_item_var='${resolved_item_var}'
+#******************************************************************************
+#")
+ endif(NOT resolved)
+
+ set(${resolved_item_var} "${resolved_item}" PARENT_SCOPE)
+endfunction(gp_resolve_item)
+
+
+# gp_resolved_file_type original_file file exepath dirs type_var
+#
+# Return the type of ${file} with respect to ${original_file}. String
+# describing type of prerequisite is returned in variable named ${type_var}.
+#
+# Use ${exepath} and ${dirs} if necessary to resolve non-absolute ${file}
+# values -- but only for non-embedded items.
+#
+# Possible types are:
+# system
+# local
+# embedded
+# other
+#
+function(gp_resolved_file_type original_file file exepath dirs type_var)
+ #message(STATUS "**")
+
+ if(NOT IS_ABSOLUTE "${original_file}")
+ message(STATUS "warning: gp_resolved_file_type expects absolute full path for first arg original_file")
+ endif()
+
+ set(is_embedded 0)
+ set(is_local 0)
+ set(is_system 0)
+
+ set(resolved_file "${file}")
+
+ if("${file}" MATCHES "^@(executable|loader)_path")
+ set(is_embedded 1)
+ endif()
+
+ if(NOT is_embedded)
+ if(NOT IS_ABSOLUTE "${file}")
+ gp_resolve_item("${original_file}" "${file}" "${exepath}" "${dirs}" resolved_file)
+ endif()
+
+ string(TOLOWER "${original_file}" original_lower)
+ string(TOLOWER "${resolved_file}" lower)
+
+ if(UNIX)
+ if(resolved_file MATCHES "^(/lib/|/lib32/|/lib64/|/usr/lib/|/usr/lib32/|/usr/lib64/|/usr/X11R6/)")
+ set(is_system 1)
+ endif()
+ endif()
+
+ if(APPLE)
+ if(resolved_file MATCHES "^(/System/Library/|/usr/lib/)")
+ set(is_system 1)
+ endif()
+ endif()
+
+ if(WIN32)
+ string(TOLOWER "$ENV{SystemRoot}" sysroot)
+ string(REGEX REPLACE "\\\\" "/" sysroot "${sysroot}")
+
+ string(TOLOWER "$ENV{windir}" windir)
+ string(REGEX REPLACE "\\\\" "/" windir "${windir}")
+
+ if(lower MATCHES "^(${sysroot}/system|${windir}/system|${sysroot}/syswow|${windir}/syswow|(.*/)*msvc[^/]+dll)")
+ set(is_system 1)
+ endif()
+ endif()
+
+ if(NOT is_system)
+ get_filename_component(original_path "${original_lower}" PATH)
+ get_filename_component(path "${lower}" PATH)
+ if("${original_path}" STREQUAL "${path}")
+ set(is_local 1)
+ endif()
+ endif()
+ endif()
+
+ # Return type string based on computed booleans:
+ #
+ set(type "other")
+
+ if(is_system)
+ set(type "system")
+ elseif(is_embedded)
+ set(type "embedded")
+ elseif(is_local)
+ set(type "local")
+ endif()
+
+ #message(STATUS "gp_resolved_file_type: '${file}' '${resolved_file}'")
+ #message(STATUS " type: '${type}'")
+
+ if(NOT is_embedded)
+ if(NOT IS_ABSOLUTE "${resolved_file}")
+ if(lower MATCHES "^msvc[^/]+dll" AND is_system)
+ message(STATUS "info: non-absolute msvc file '${file}' returning type '${type}'")
+ else()
+ message(STATUS "warning: gp_resolved_file_type non-absolute file '${file}' returning type '${type}' -- possibly incorrect")
+ endif()
+ endif()
+ endif()
+
+ set(${type_var} "${type}" PARENT_SCOPE)
+
+ #message(STATUS "**")
+endfunction()
+
+
+# gp_file_type original_file file type_var
+#
+# Return the type of ${file} with respect to ${original_file}. String
+# describing type of prerequisite is returned in variable named ${type_var}.
+#
+# Possible types are:
+# system
+# local
+# embedded
+# other
+#
+function(gp_file_type original_file file type_var)
+ if(NOT IS_ABSOLUTE "${original_file}")
+ message(STATUS "warning: gp_file_type expects absolute full path for first arg original_file")
+ endif()
+
+ get_filename_component(exepath "${original_file}" PATH)
+
+ set(type "")
+ gp_resolved_file_type("${original_file}" "${file}" "${exepath}" "" type)
+
+ set(${type_var} "${type}" PARENT_SCOPE)
+endfunction(gp_file_type)
+
+
+# get_prerequisites target prerequisites_var exclude_system recurse dirs
+#
+# Get the list of shared library files required by ${target}. The list in
+# the variable named ${prerequisites_var} should be empty on first entry to
+# this function. On exit, ${prerequisites_var} will contain the list of
+# required shared library files.
+#
+# target is the full path to an executable file
+#
+# prerequisites_var is the name of a CMake variable to contain the results
+#
+# exclude_system is 0 or 1: 0 to include "system" prerequisites , 1 to
+# exclude them
+#
+# recurse is 0 or 1: 0 for direct prerequisites only, 1 for all prerequisites
+# recursively
+#
+# exepath is the path to the top level executable used for @executable_path
+# replacment on the Mac
+#
+# dirs is a list of paths where libraries might be found: these paths are
+# searched first when a target without any path info is given. Then standard
+# system locations are also searched: PATH, Framework locations, /usr/lib...
+#
+function(get_prerequisites target prerequisites_var exclude_system recurse exepath dirs)
+ set(verbose 0)
+ set(eol_char "E")
+
+ if(NOT IS_ABSOLUTE "${target}")
+ message("warning: target '${target}' is not absolute...")
+ endif(NOT IS_ABSOLUTE "${target}")
+
+ if(NOT EXISTS "${target}")
+ message("warning: target '${target}' does not exist...")
+ endif(NOT EXISTS "${target}")
+
+ # <setup-gp_tool-vars>
+ #
+ # Try to choose the right tool by default. Caller can set gp_tool prior to
+ # calling this function to force using a different tool.
+ #
+ if("${gp_tool}" STREQUAL "")
+ set(gp_tool "ldd")
+ if(APPLE)
+ set(gp_tool "otool")
+ endif(APPLE)
+ if(WIN32)
+ set(gp_tool "dumpbin")
+ endif(WIN32)
+ endif("${gp_tool}" STREQUAL "")
+
+ set(gp_tool_known 0)
+
+ if("${gp_tool}" STREQUAL "ldd")
+ set(gp_cmd_args "")
+ set(gp_regex "^[\t ]*[^\t ]+ => ([^\t ]+).*${eol_char}$")
+ set(gp_regex_cmp_count 1)
+ set(gp_tool_known 1)
+ endif("${gp_tool}" STREQUAL "ldd")
+
+ if("${gp_tool}" STREQUAL "otool")
+ set(gp_cmd_args "-L")
+ set(gp_regex "^\t([^\t]+) \\(compatibility version ([0-9]+.[0-9]+.[0-9]+), current version ([0-9]+.[0-9]+.[0-9]+)\\)${eol_char}$")
+ set(gp_regex_cmp_count 3)
+ set(gp_tool_known 1)
+ endif("${gp_tool}" STREQUAL "otool")
+
+ if("${gp_tool}" STREQUAL "dumpbin")
+ set(gp_cmd_args "/dependents")
+ set(gp_regex "^ ([^ ].*[Dd][Ll][Ll])${eol_char}$")
+ set(gp_regex_cmp_count 1)
+ set(gp_tool_known 1)
+ set(ENV{VS_UNICODE_OUTPUT} "") # Block extra output from inside VS IDE.
+ endif("${gp_tool}" STREQUAL "dumpbin")
+
+ if(NOT gp_tool_known)
+ message(STATUS "warning: gp_tool='${gp_tool}' is an unknown tool...")
+ message(STATUS "CMake function get_prerequisites needs more code to handle '${gp_tool}'")
+ message(STATUS "Valid gp_tool values are dumpbin, ldd and otool.")
+ return()
+ endif(NOT gp_tool_known)
+
+ set(gp_cmd_paths ${gp_cmd_paths}
+ "C:/Program Files/Microsoft Visual Studio 9.0/VC/bin"
+ "C:/Program Files (x86)/Microsoft Visual Studio 9.0/VC/bin"
+ "C:/Program Files/Microsoft Visual Studio 8/VC/BIN"
+ "C:/Program Files (x86)/Microsoft Visual Studio 8/VC/BIN"
+ "C:/Program Files/Microsoft Visual Studio .NET 2003/VC7/BIN"
+ "C:/Program Files (x86)/Microsoft Visual Studio .NET 2003/VC7/BIN"
+ "/usr/local/bin"
+ "/usr/bin"
+ )
+
+ find_program(gp_cmd ${gp_tool} PATHS ${gp_cmd_paths})
+
+ if(NOT gp_cmd)
+ message(STATUS "warning: could not find '${gp_tool}' - cannot analyze prerequisites...")
+ return()
+ endif(NOT gp_cmd)
+
+ if("${gp_tool}" STREQUAL "dumpbin")
+ # When running dumpbin, it also needs the "Common7/IDE" directory in the
+ # PATH. It will already be in the PATH if being run from a Visual Studio
+ # command prompt. Add it to the PATH here in case we are running from a
+ # different command prompt.
+ #
+ get_filename_component(gp_cmd_dir "${gp_cmd}" PATH)
+ get_filename_component(gp_cmd_dlls_dir "${gp_cmd_dir}/../../Common7/IDE" ABSOLUTE)
+ if(EXISTS "${gp_cmd_dlls_dir}")
+ # only add to the path if it is not already in the path
+ if(NOT "$ENV{PATH}" MATCHES "${gp_cmd_dlls_dir}")
+ set(ENV{PATH} "$ENV{PATH};${gp_cmd_dlls_dir}")
+ endif(NOT "$ENV{PATH}" MATCHES "${gp_cmd_dlls_dir}")
+ endif(EXISTS "${gp_cmd_dlls_dir}")
+ endif("${gp_tool}" STREQUAL "dumpbin")
+ #
+ # </setup-gp_tool-vars>
+
+ if("${gp_tool}" STREQUAL "ldd")
+ set(old_ld_env "$ENV{LD_LIBRARY_PATH}")
+ foreach(dir ${exepath} ${dirs})
+ set(ENV{LD_LIBRARY_PATH} "${dir}:$ENV{LD_LIBRARY_PATH}")
+ endforeach(dir)
+ endif("${gp_tool}" STREQUAL "ldd")
+
+
+ # Track new prerequisites at each new level of recursion. Start with an
+ # empty list at each level:
+ #
+ set(unseen_prereqs)
+
+ # Run gp_cmd on the target:
+ #
+ execute_process(
+ COMMAND ${gp_cmd} ${gp_cmd_args} ${target}
+ OUTPUT_VARIABLE gp_cmd_ov
+ )
+
+ if("${gp_tool}" STREQUAL "ldd")
+ set(ENV{LD_LIBRARY_PATH} "${old_ld_env}")
+ endif("${gp_tool}" STREQUAL "ldd")
+
+ if(verbose)
+ message(STATUS "<RawOutput cmd='${gp_cmd} ${gp_cmd_args} ${target}'>")
+ message(STATUS "gp_cmd_ov='${gp_cmd_ov}'")
+ message(STATUS "</RawOutput>")
+ endif(verbose)
+
+ get_filename_component(target_dir "${target}" PATH)
+
+ # Convert to a list of lines:
+ #
+ string(REGEX REPLACE ";" "\\\\;" candidates "${gp_cmd_ov}")
+ string(REGEX REPLACE "\n" "${eol_char};" candidates "${candidates}")
+
+ # Analyze each line for file names that match the regular expression:
+ #
+ foreach(candidate ${candidates})
+ if("${candidate}" MATCHES "${gp_regex}")
+ # Extract information from each candidate:
+ string(REGEX REPLACE "${gp_regex}" "\\1" raw_item "${candidate}")
+
+ if(gp_regex_cmp_count GREATER 1)
+ string(REGEX REPLACE "${gp_regex}" "\\2" raw_compat_version "${candidate}")
+ string(REGEX REPLACE "^([0-9]+)\\.([0-9]+)\\.([0-9]+)$" "\\1" compat_major_version "${raw_compat_version}")
+ string(REGEX REPLACE "^([0-9]+)\\.([0-9]+)\\.([0-9]+)$" "\\2" compat_minor_version "${raw_compat_version}")
+ string(REGEX REPLACE "^([0-9]+)\\.([0-9]+)\\.([0-9]+)$" "\\3" compat_patch_version "${raw_compat_version}")
+ endif(gp_regex_cmp_count GREATER 1)
+
+ if(gp_regex_cmp_count GREATER 2)
+ string(REGEX REPLACE "${gp_regex}" "\\3" raw_current_version "${candidate}")
+ string(REGEX REPLACE "^([0-9]+)\\.([0-9]+)\\.([0-9]+)$" "\\1" current_major_version "${raw_current_version}")
+ string(REGEX REPLACE "^([0-9]+)\\.([0-9]+)\\.([0-9]+)$" "\\2" current_minor_version "${raw_current_version}")
+ string(REGEX REPLACE "^([0-9]+)\\.([0-9]+)\\.([0-9]+)$" "\\3" current_patch_version "${raw_current_version}")
+ endif(gp_regex_cmp_count GREATER 2)
+
+ # Use the raw_item as the list entries returned by this function. Use the
+ # gp_resolve_item function to resolve it to an actual full path file if
+ # necessary.
+ #
+ set(item "${raw_item}")
+
+ # Add each item unless it is excluded:
+ #
+ set(add_item 1)
+
+ if(${exclude_system})
+ set(type "")
+ gp_resolved_file_type("${target}" "${item}" "${exepath}" "${dirs}" type)
+ if("${type}" STREQUAL "system")
+ set(add_item 0)
+ endif("${type}" STREQUAL "system")
+ endif(${exclude_system})
+
+ if(add_item)
+ list(LENGTH ${prerequisites_var} list_length_before_append)
+ gp_append_unique(${prerequisites_var} "${item}")
+ list(LENGTH ${prerequisites_var} list_length_after_append)
+
+ if(${recurse})
+ # If item was really added, this is the first time we have seen it.
+ # Add it to unseen_prereqs so that we can recursively add *its*
+ # prerequisites...
+ #
+ # But first: resolve its name to an absolute full path name such
+ # that the analysis tools can simply accept it as input.
+ #
+ if(NOT list_length_before_append EQUAL list_length_after_append)
+ gp_resolve_item("${target}" "${item}" "${exepath}" "${dirs}" resolved_item)
+ set(unseen_prereqs ${unseen_prereqs} "${resolved_item}")
+ endif(NOT list_length_before_append EQUAL list_length_after_append)
+ endif(${recurse})
+ endif(add_item)
+ else("${candidate}" MATCHES "${gp_regex}")
+ if(verbose)
+ message(STATUS "ignoring non-matching line: '${candidate}'")
+ endif(verbose)
+ endif("${candidate}" MATCHES "${gp_regex}")
+ endforeach(candidate)
+
+ list(LENGTH ${prerequisites_var} prerequisites_var_length)
+ if(prerequisites_var_length GREATER 0)
+ list(SORT ${prerequisites_var})
+ endif(prerequisites_var_length GREATER 0)
+ if(${recurse})
+ set(more_inputs ${unseen_prereqs})
+ foreach(input ${more_inputs})
+ get_prerequisites("${input}" ${prerequisites_var} ${exclude_system} ${recurse} "${exepath}" "${dirs}")
+ endforeach(input)
+ endif(${recurse})
+
+ set(${prerequisites_var} ${${prerequisites_var}} PARENT_SCOPE)
+endfunction(get_prerequisites)
+
+
+# list_prerequisites target all exclude_system verbose
+#
+# ARGV0 (target) is the full path to an executable file
+#
+# optional ARGV1 (all) is 0 or 1: 0 for direct prerequisites only,
+# 1 for all prerequisites recursively
+#
+# optional ARGV2 (exclude_system) is 0 or 1: 0 to include "system"
+# prerequisites , 1 to exclude them
+#
+# optional ARGV3 (verbose) is 0 or 1: 0 to print only full path
+# names of prerequisites, 1 to print extra information
+#
+function(list_prerequisites target)
+ if("${ARGV1}" STREQUAL "")
+ set(all 1)
+ else("${ARGV1}" STREQUAL "")
+ set(all "${ARGV1}")
+ endif("${ARGV1}" STREQUAL "")
+
+ if("${ARGV2}" STREQUAL "")
+ set(exclude_system 0)
+ else("${ARGV2}" STREQUAL "")
+ set(exclude_system "${ARGV2}")
+ endif("${ARGV2}" STREQUAL "")
+
+ if("${ARGV3}" STREQUAL "")
+ set(verbose 0)
+ else("${ARGV3}" STREQUAL "")
+ set(verbose "${ARGV3}")
+ endif("${ARGV3}" STREQUAL "")
+
+ set(count 0)
+ set(count_str "")
+ set(print_count "${verbose}")
+ set(print_prerequisite_type "${verbose}")
+ set(print_target "${verbose}")
+ set(type_str "")
+
+ get_filename_component(exepath "${target}" PATH)
+
+ set(prereqs "")
+ get_prerequisites("${target}" prereqs ${exclude_system} ${all} "${exepath}" "")
+
+ if(print_target)
+ message(STATUS "File '${target}' depends on:")
+ endif(print_target)
+
+ foreach(d ${prereqs})
+ math(EXPR count "${count} + 1")
+
+ if(print_count)
+ set(count_str "${count}. ")
+ endif(print_count)
+
+ if(print_prerequisite_type)
+ gp_file_type("${target}" "${d}" type)
+ set(type_str " (${type})")
+ endif(print_prerequisite_type)
+
+ message(STATUS "${count_str}${d}${type_str}")
+ endforeach(d)
+endfunction(list_prerequisites)
+
+
+# list_prerequisites_by_glob glob_arg glob_exp
+#
+# glob_arg is GLOB or GLOB_RECURSE
+#
+# glob_exp is a globbing expression used with "file(GLOB" to retrieve a list
+# of matching files. If a matching file is executable, its prerequisites are
+# listed.
+#
+# Any additional (optional) arguments provided are passed along as the
+# optional arguments to the list_prerequisites calls.
+#
+function(list_prerequisites_by_glob glob_arg glob_exp)
+ message(STATUS "=============================================================================")
+ message(STATUS "List prerequisites of executables matching ${glob_arg} '${glob_exp}'")
+ message(STATUS "")
+ file(${glob_arg} file_list ${glob_exp})
+ foreach(f ${file_list})
+ is_file_executable("${f}" is_f_executable)
+ if(is_f_executable)
+ message(STATUS "=============================================================================")
+ list_prerequisites("${f}" ${ARGN})
+ message(STATUS "")
+ endif(is_f_executable)
+ endforeach(f)
+endfunction(list_prerequisites_by_glob)
diff --git a/indra/cmake/GoogleMock.cmake b/indra/cmake/GoogleMock.cmake
index ca5a8034ba..c4c96a9af7 100644
--- a/indra/cmake/GoogleMock.cmake
+++ b/indra/cmake/GoogleMock.cmake
@@ -8,9 +8,10 @@ set(GOOGLEMOCK_INCLUDE_DIRS
${LIBS_PREBUILT_DIR}/include)
if (LINUX)
+ # VWR-24366: gmock is underlinked, it needs gtest.
set(GOOGLEMOCK_LIBRARIES
- gmock
- gtest)
+ gmock -Wl,--no-as-needed
+ gtest -Wl,--as-needed)
elseif(WINDOWS)
set(GOOGLEMOCK_LIBRARIES
gmock)
diff --git a/indra/cmake/GooglePerfTools.cmake b/indra/cmake/GooglePerfTools.cmake
index 946fc6b375..d9f91193be 100644
--- a/indra/cmake/GooglePerfTools.cmake
+++ b/indra/cmake/GooglePerfTools.cmake
@@ -4,20 +4,20 @@ include(Prebuilt)
if (STANDALONE)
include(FindGooglePerfTools)
else (STANDALONE)
- use_prebuilt_binary(google)
if (WINDOWS)
- use_prebuilt_binary(google-perftools)
+ use_prebuilt_binary(tcmalloc)
set(TCMALLOC_LIBRARIES
debug libtcmalloc_minimal-debug
optimized libtcmalloc_minimal)
set(GOOGLE_PERFTOOLS_FOUND "YES")
endif (WINDOWS)
if (LINUX)
- set(TCMALLOC_LIBRARIES tcmalloc)
- set(STACKTRACE_LIBRARIES stacktrace)
+ use_prebuilt_binary(tcmalloc)
+ set(TCMALLOC_LIBRARIES
+ tcmalloc)
set(PROFILER_LIBRARIES profiler)
set(GOOGLE_PERFTOOLS_INCLUDE_DIR
- ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/include)
+ ${LIBS_PREBUILT_DIR}/include)
set(GOOGLE_PERFTOOLS_FOUND "YES")
endif (LINUX)
endif (STANDALONE)
@@ -29,12 +29,11 @@ if (GOOGLE_PERFTOOLS_FOUND)
endif (GOOGLE_PERFTOOLS_FOUND)
if (WINDOWS)
- # *TODO -reenable this once we get server usage sorted out
- #set(USE_GOOGLE_PERFTOOLS ON)
+ set(USE_GOOGLE_PERFTOOLS ON)
endif (WINDOWS)
if (USE_GOOGLE_PERFTOOLS)
- set(TCMALLOC_FLAG -DLL_USE_TCMALLOC=1)
+ set(TCMALLOC_FLAG -ULL_USE_TCMALLOC=1)
include_directories(${GOOGLE_PERFTOOLS_INCLUDE_DIR})
set(GOOGLE_PERFTOOLS_LIBRARIES ${TCMALLOC_LIBRARIES} ${STACKTRACE_LIBRARIES} ${PROFILER_LIBRARIES})
else (USE_GOOGLE_PERFTOOLS)
diff --git a/indra/cmake/JPEG.cmake b/indra/cmake/JPEG.cmake
index 9514d59f64..4f99efd602 100644
--- a/indra/cmake/JPEG.cmake
+++ b/indra/cmake/JPEG.cmake
@@ -12,10 +12,7 @@ else (STANDALONE)
if (LINUX)
set(JPEG_LIBRARIES jpeg)
elseif (DARWIN)
- set(JPEG_LIBRARIES
- optimized ${ARCH_PREBUILT_DIRS_RELEASE}/liblljpeg.a
- debug ${ARCH_PREBUILT_DIRS_DEBUG}/liblljpeg.a
- )
+ set(JPEG_LIBRARIES jpeg)
elseif (WINDOWS)
set(JPEG_LIBRARIES jpeglib)
endif (LINUX)
diff --git a/indra/cmake/JsonCpp.cmake b/indra/cmake/JsonCpp.cmake
index 7dd565be7c..7ad73e5683 100644
--- a/indra/cmake/JsonCpp.cmake
+++ b/indra/cmake/JsonCpp.cmake
@@ -11,12 +11,12 @@ else (STANDALONE)
use_prebuilt_binary(jsoncpp)
if (WINDOWS)
set(JSONCPP_LIBRARIES
- debug json_vc80d
- optimized json_vc80)
+ debug json_vc100debug_libmt.lib
+ optimized json_vc100_libmt)
elseif (DARWIN)
- set(JSONCPP_LIBRARIES json_mac-universal-gcc_libmt)
+ set(JSONCPP_LIBRARIES libjson_linux-gcc-4.0.1_libmt.a)
elseif (LINUX)
- set(JSONCPP_LIBRARIES jsoncpp)
+ set(JSONCPP_LIBRARIES libjson_linux-gcc-4.1.3_libmt.a)
endif (WINDOWS)
- set(JSONCPP_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/jsoncpp)
+ set(JSONCPP_INCLUDE_DIR "${LIBS_PREBUILT_DIR}/include/jsoncpp" "${LIBS_PREBUILT_DIR}/include/json")
endif (STANDALONE)
diff --git a/indra/cmake/LLAddBuildTest.cmake b/indra/cmake/LLAddBuildTest.cmake
index 29e2492551..08feab6e36 100644
--- a/indra/cmake/LLAddBuildTest.cmake
+++ b/indra/cmake/LLAddBuildTest.cmake
@@ -1,273 +1,272 @@
-# -*- cmake -*-
-include(LLTestCommand)
-include(GoogleMock)
-
-MACRO(LL_ADD_PROJECT_UNIT_TESTS project sources)
- # Given a project name and a list of sourcefiles (with optional properties on each),
- # add targets to build and run the tests specified.
- # ASSUMPTIONS:
- # * this macro is being executed in the project file that is passed in
- # * current working SOURCE dir is that project dir
- # * there is a subfolder tests/ with test code corresponding to the filenames passed in
- # * properties for each sourcefile passed in indicate what libs to link that file with (MAKE NO ASSUMPTIONS ASIDE FROM TUT)
- #
- # More info and examples at: https://wiki.secondlife.com/wiki/How_to_add_unit_tests_to_indra_code
- #
- # WARNING: do NOT modify this code without working with poppy -
- # there is another branch that will conflict heavily with any changes here.
-INCLUDE(GoogleMock)
-
-
- IF(LL_TEST_VERBOSE)
- MESSAGE("LL_ADD_PROJECT_UNIT_TESTS UNITTEST_PROJECT_${project} sources: ${sources}")
- ENDIF(LL_TEST_VERBOSE)
-
- # Start with the header and project-wide setup before making targets
- #project(UNITTEST_PROJECT_${project})
- # Setup includes, paths, etc
- SET(alltest_SOURCE_FILES
- ${CMAKE_SOURCE_DIR}/test/test.cpp
- ${CMAKE_SOURCE_DIR}/test/lltut.cpp
- )
- SET(alltest_DEP_TARGETS
- # needed by the test harness itself
- ${APRUTIL_LIBRARIES}
- ${APR_LIBRARIES}
- llcommon
- )
- IF(NOT "${project}" STREQUAL "llmath")
- # add llmath as a dep unless the tested module *is* llmath!
- LIST(APPEND alltest_DEP_TARGETS
- llmath
- )
- ENDIF(NOT "${project}" STREQUAL "llmath")
- SET(alltest_INCLUDE_DIRS
- ${LLMATH_INCLUDE_DIRS}
- ${LLCOMMON_INCLUDE_DIRS}
- ${LIBS_OPEN_DIR}/test
- ${GOOGLEMOCK_INCLUDE_DIRS}
- )
- SET(alltest_LIBRARIES
- ${GOOGLEMOCK_LIBRARIES}
- ${PTHREAD_LIBRARY}
- ${WINDOWS_LIBRARIES}
- )
- # Headers, for convenience in targets.
- SET(alltest_HEADER_FILES
- ${CMAKE_SOURCE_DIR}/test/test.h
- )
-
- # Use the default flags
- if (LINUX)
- SET(CMAKE_EXE_LINKER_FLAGS "")
- endif (LINUX)
-
- # start the source test executable definitions
- SET(${project}_TEST_OUTPUT "")
- FOREACH (source ${sources})
- STRING( REGEX REPLACE "(.*)\\.[^.]+$" "\\1" name ${source} )
- STRING( REGEX REPLACE ".*\\.([^.]+)$" "\\1" extension ${source} )
- IF(LL_TEST_VERBOSE)
- MESSAGE("LL_ADD_PROJECT_UNIT_TESTS UNITTEST_PROJECT_${project} individual source: ${source} (${name}.${extension})")
- ENDIF(LL_TEST_VERBOSE)
-
- #
- # Per-codefile additional / external source, header, and include dir property extraction
- #
- # Source
- GET_SOURCE_FILE_PROPERTY(${name}_test_additional_SOURCE_FILES ${source} LL_TEST_ADDITIONAL_SOURCE_FILES)
- IF(${name}_test_additional_SOURCE_FILES MATCHES NOTFOUND)
- SET(${name}_test_additional_SOURCE_FILES "")
- ENDIF(${name}_test_additional_SOURCE_FILES MATCHES NOTFOUND)
- SET(${name}_test_SOURCE_FILES ${source} tests/${name}_test.${extension} ${alltest_SOURCE_FILES} ${${name}_test_additional_SOURCE_FILES} )
- IF(LL_TEST_VERBOSE)
- MESSAGE("LL_ADD_PROJECT_UNIT_TESTS ${name}_test_SOURCE_FILES ${${name}_test_SOURCE_FILES}")
- ENDIF(LL_TEST_VERBOSE)
- # Headers
- GET_SOURCE_FILE_PROPERTY(${name}_test_additional_HEADER_FILES ${source} LL_TEST_ADDITIONAL_HEADER_FILES)
- IF(${name}_test_additional_HEADER_FILES MATCHES NOTFOUND)
- SET(${name}_test_additional_HEADER_FILES "")
- ENDIF(${name}_test_additional_HEADER_FILES MATCHES NOTFOUND)
- SET(${name}_test_HEADER_FILES ${name}.h ${${name}_test_additional_HEADER_FILES})
- set_source_files_properties(${${name}_test_HEADER_FILES} PROPERTIES HEADER_FILE_ONLY TRUE)
- LIST(APPEND ${name}_test_SOURCE_FILES ${${name}_test_HEADER_FILES})
- IF(LL_TEST_VERBOSE)
- MESSAGE("LL_ADD_PROJECT_UNIT_TESTS ${name}_test_HEADER_FILES ${${name}_test_HEADER_FILES}")
- ENDIF(LL_TEST_VERBOSE)
- # Include dirs
- GET_SOURCE_FILE_PROPERTY(${name}_test_additional_INCLUDE_DIRS ${source} LL_TEST_ADDITIONAL_INCLUDE_DIRS)
- IF(${name}_test_additional_INCLUDE_DIRS MATCHES NOTFOUND)
- SET(${name}_test_additional_INCLUDE_DIRS "")
- ENDIF(${name}_test_additional_INCLUDE_DIRS MATCHES NOTFOUND)
- INCLUDE_DIRECTORIES(${alltest_INCLUDE_DIRS} ${name}_test_additional_INCLUDE_DIRS )
- IF(LL_TEST_VERBOSE)
- MESSAGE("LL_ADD_PROJECT_UNIT_TESTS ${name}_test_additional_INCLUDE_DIRS ${${name}_test_additional_INCLUDE_DIRS}")
- ENDIF(LL_TEST_VERBOSE)
-
-
- # Setup target
- ADD_EXECUTABLE(PROJECT_${project}_TEST_${name} ${${name}_test_SOURCE_FILES})
- SET_TARGET_PROPERTIES(PROJECT_${project}_TEST_${name} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${EXE_STAGING_DIR}")
-
- #
- # Per-codefile additional / external project dep and lib dep property extraction
- #
- # WARNING: it's REALLY IMPORTANT to not mix these. I guarantee it will not work in the future. + poppy 2009-04-19
- # Projects
- GET_SOURCE_FILE_PROPERTY(${name}_test_additional_PROJECTS ${source} LL_TEST_ADDITIONAL_PROJECTS)
- IF(${name}_test_additional_PROJECTS MATCHES NOTFOUND)
- SET(${name}_test_additional_PROJECTS "")
- ENDIF(${name}_test_additional_PROJECTS MATCHES NOTFOUND)
- # Libraries
- GET_SOURCE_FILE_PROPERTY(${name}_test_additional_LIBRARIES ${source} LL_TEST_ADDITIONAL_LIBRARIES)
- IF(${name}_test_additional_LIBRARIES MATCHES NOTFOUND)
- SET(${name}_test_additional_LIBRARIES "")
- ENDIF(${name}_test_additional_LIBRARIES MATCHES NOTFOUND)
- IF(LL_TEST_VERBOSE)
- MESSAGE("LL_ADD_PROJECT_UNIT_TESTS ${name}_test_additional_PROJECTS ${${name}_test_additional_PROJECTS}")
- MESSAGE("LL_ADD_PROJECT_UNIT_TESTS ${name}_test_additional_LIBRARIES ${${name}_test_additional_LIBRARIES}")
- ENDIF(LL_TEST_VERBOSE)
- # Add to project
- TARGET_LINK_LIBRARIES(PROJECT_${project}_TEST_${name} ${alltest_LIBRARIES} ${alltest_DEP_TARGETS} ${${name}_test_additional_PROJECTS} ${${name}_test_additional_LIBRARIES} )
- # Compile-time Definitions
- GET_SOURCE_FILE_PROPERTY(${name}_test_additional_CFLAGS ${source} LL_TEST_ADDITIONAL_CFLAGS)
- IF(NOT ${name}_test_additional_CFLAGS MATCHES NOTFOUND)
- SET_TARGET_PROPERTIES(PROJECT_${project}_TEST_${name} PROPERTIES COMPILE_FLAGS ${${name}_test_additional_CFLAGS} )
- IF(LL_TEST_VERBOSE)
- MESSAGE("LL_ADD_PROJECT_UNIT_TESTS ${name}_test_additional_CFLAGS ${${name}_test_additional_CFLAGS}")
- ENDIF(LL_TEST_VERBOSE)
- ENDIF(NOT ${name}_test_additional_CFLAGS MATCHES NOTFOUND)
-
- #
- # Setup test targets
- #
- GET_TARGET_PROPERTY(TEST_EXE PROJECT_${project}_TEST_${name} LOCATION)
- SET(TEST_OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/PROJECT_${project}_TEST_${name}_ok.txt)
- SET(TEST_CMD ${TEST_EXE} --touch=${TEST_OUTPUT} --sourcedir=${CMAKE_CURRENT_SOURCE_DIR})
-
- # daveh - what configuration does this use? Debug? it's cmake-time, not build time. + poppy 2009-04-19
- IF(LL_TEST_VERBOSE)
- MESSAGE(STATUS "LL_ADD_PROJECT_UNIT_TESTS ${name} test_cmd = ${TEST_CMD}")
- ENDIF(LL_TEST_VERBOSE)
-
- SET_TEST_PATH(LD_LIBRARY_PATH)
- LL_TEST_COMMAND(TEST_SCRIPT_CMD "${LD_LIBRARY_PATH}" ${TEST_CMD})
- IF(LL_TEST_VERBOSE)
- MESSAGE(STATUS "LL_ADD_PROJECT_UNIT_TESTS ${name} test_script = ${TEST_SCRIPT_CMD}")
- ENDIF(LL_TEST_VERBOSE)
- # Add test
- ADD_CUSTOM_COMMAND(
- OUTPUT ${TEST_OUTPUT}
- COMMAND ${TEST_SCRIPT_CMD}
- DEPENDS PROJECT_${project}_TEST_${name}
- WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
- )
- # Why not add custom target and add POST_BUILD command?
- # Slightly less uncertain behavior
- # (OUTPUT commands run non-deterministically AFAIK) + poppy 2009-04-19
- # > I did not use a post build step as I could not make it notify of a
- # > failure after the first time you build and fail a test. - daveh 2009-04-20
- LIST(APPEND ${project}_TEST_OUTPUT ${TEST_OUTPUT})
- ENDFOREACH (source)
-
- # Add the test runner target per-project
- # (replaces old _test_ok targets all over the place)
- ADD_CUSTOM_TARGET(${project}_tests ALL DEPENDS ${${project}_TEST_OUTPUT})
- ADD_DEPENDENCIES(${project} ${project}_tests)
-ENDMACRO(LL_ADD_PROJECT_UNIT_TESTS)
-
-FUNCTION(LL_ADD_INTEGRATION_TEST
- testname
- additional_source_files
- library_dependencies
-# variable args
- )
- if(TEST_DEBUG)
- message(STATUS "Adding INTEGRATION_TEST_${testname} - debug output is on")
- endif(TEST_DEBUG)
-
- SET(source_files
- tests/${testname}_test.cpp
- ${CMAKE_SOURCE_DIR}/test/test.cpp
- ${CMAKE_SOURCE_DIR}/test/lltut.cpp
- ${additional_source_files}
- )
-
- SET(libraries
- ${library_dependencies}
- ${GOOGLEMOCK_LIBRARIES}
- ${PTHREAD_LIBRARY}
- )
-
- # Add test executable build target
- if(TEST_DEBUG)
- message(STATUS "ADD_EXECUTABLE(INTEGRATION_TEST_${testname} ${source_files})")
- endif(TEST_DEBUG)
- ADD_EXECUTABLE(INTEGRATION_TEST_${testname} ${source_files})
- SET_TARGET_PROPERTIES(INTEGRATION_TEST_${testname} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${EXE_STAGING_DIR}")
-
- # Add link deps to the executable
- if(TEST_DEBUG)
- message(STATUS "TARGET_LINK_LIBRARIES(INTEGRATION_TEST_${testname} ${libraries})")
- endif(TEST_DEBUG)
- TARGET_LINK_LIBRARIES(INTEGRATION_TEST_${testname} ${libraries})
-
- # Create the test running command
- SET(test_command ${ARGN})
- GET_TARGET_PROPERTY(TEST_EXE INTEGRATION_TEST_${testname} LOCATION)
- LIST(FIND test_command "{}" test_exe_pos)
- IF(test_exe_pos LESS 0)
- # The {} marker means "the full pathname of the test executable."
- # test_exe_pos -1 means we didn't find it -- so append the test executable
- # name to $ARGN, the variable part of the arg list. This is convenient
- # shorthand for both straightforward execution of the test program (empty
- # $ARGN) and for running a "wrapper" program of some kind accepting the
- # pathname of the test program as the last of its args. You need specify
- # {} only if the test program's pathname isn't the last argument in the
- # desired command line.
- LIST(APPEND test_command "${TEST_EXE}")
- ELSE (test_exe_pos LESS 0)
- # Found {} marker at test_exe_pos. Remove the {}...
- LIST(REMOVE_AT test_command test_exe_pos)
- # ...and replace it with the actual name of the test executable.
- LIST(INSERT test_command test_exe_pos "${TEST_EXE}")
- ENDIF (test_exe_pos LESS 0)
-
- SET_TEST_PATH(LD_LIBRARY_PATH)
- LL_TEST_COMMAND(TEST_SCRIPT_CMD "${LD_LIBRARY_PATH}" ${test_command})
-
- if(TEST_DEBUG)
- message(STATUS "TEST_SCRIPT_CMD: ${TEST_SCRIPT_CMD}")
- endif(TEST_DEBUG)
-
- ADD_CUSTOM_COMMAND(
- TARGET INTEGRATION_TEST_${testname}
- POST_BUILD
- COMMAND ${TEST_SCRIPT_CMD}
- )
-
- # Use CTEST? Not sure how to yet...
- # ADD_TEST(INTEGRATION_TEST_RUNNER_${testname} ${TEST_SCRIPT_CMD})
-
-ENDFUNCTION(LL_ADD_INTEGRATION_TEST)
-
-MACRO(SET_TEST_PATH LISTVAR)
- IF(WINDOWS)
- # We typically build/package only Release variants of third-party
- # libraries, so append the Release staging dir in case the library being
- # sought doesn't have a debug variant.
- set(${LISTVAR} ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR} ${SHARED_LIB_STAGING_DIR}/Release)
- ELSEIF(DARWIN)
- # We typically build/package only Release variants of third-party
- # libraries, so append the Release staging dir in case the library being
- # sought doesn't have a debug variant.
- set(${LISTVAR} ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/Resources ${SHARED_LIB_STAGING_DIR}/Release/Resources /usr/lib)
- ELSE(WINDOWS)
- # Linux uses a single staging directory anyway.
- IF (STANDALONE)
- set(${LISTVAR} ${CMAKE_BINARY_DIR}/llcommon /usr/lib /usr/local/lib)
- ELSE (STANDALONE)
- set(${LISTVAR} ${SHARED_LIB_STAGING_DIR} /usr/lib)
- ENDIF (STANDALONE)
- ENDIF(WINDOWS)
-ENDMACRO(SET_TEST_PATH)
+# -*- cmake -*-
+include(LLTestCommand)
+include(GoogleMock)
+include(Tut)
+
+MACRO(LL_ADD_PROJECT_UNIT_TESTS project sources)
+ # Given a project name and a list of sourcefiles (with optional properties on each),
+ # add targets to build and run the tests specified.
+ # ASSUMPTIONS:
+ # * this macro is being executed in the project file that is passed in
+ # * current working SOURCE dir is that project dir
+ # * there is a subfolder tests/ with test code corresponding to the filenames passed in
+ # * properties for each sourcefile passed in indicate what libs to link that file with (MAKE NO ASSUMPTIONS ASIDE FROM TUT)
+ #
+ # More info and examples at: https://wiki.secondlife.com/wiki/How_to_add_unit_tests_to_indra_code
+ #
+ # WARNING: do NOT modify this code without working with poppy -
+ # there is another branch that will conflict heavily with any changes here.
+INCLUDE(GoogleMock)
+
+
+ IF(LL_TEST_VERBOSE)
+ MESSAGE("LL_ADD_PROJECT_UNIT_TESTS UNITTEST_PROJECT_${project} sources: ${sources}")
+ ENDIF(LL_TEST_VERBOSE)
+
+ # Start with the header and project-wide setup before making targets
+ #project(UNITTEST_PROJECT_${project})
+ # Setup includes, paths, etc
+ SET(alltest_SOURCE_FILES
+ ${CMAKE_SOURCE_DIR}/test/test.cpp
+ ${CMAKE_SOURCE_DIR}/test/lltut.cpp
+ )
+ SET(alltest_DEP_TARGETS
+ # needed by the test harness itself
+ ${APRUTIL_LIBRARIES}
+ ${APR_LIBRARIES}
+ llcommon
+ )
+ IF(NOT "${project}" STREQUAL "llmath")
+ # add llmath as a dep unless the tested module *is* llmath!
+ LIST(APPEND alltest_DEP_TARGETS
+ llmath
+ )
+ ENDIF(NOT "${project}" STREQUAL "llmath")
+ SET(alltest_INCLUDE_DIRS
+ ${LLMATH_INCLUDE_DIRS}
+ ${LLCOMMON_INCLUDE_DIRS}
+ ${LIBS_OPEN_DIR}/test
+ ${GOOGLEMOCK_INCLUDE_DIRS}
+ )
+ SET(alltest_LIBRARIES
+ ${GOOGLEMOCK_LIBRARIES}
+ ${PTHREAD_LIBRARY}
+ ${WINDOWS_LIBRARIES}
+ )
+ # Headers, for convenience in targets.
+ SET(alltest_HEADER_FILES
+ ${CMAKE_SOURCE_DIR}/test/test.h
+ )
+
+ # start the source test executable definitions
+ SET(${project}_TEST_OUTPUT "")
+ FOREACH (source ${sources})
+ STRING( REGEX REPLACE "(.*)\\.[^.]+$" "\\1" name ${source} )
+ STRING( REGEX REPLACE ".*\\.([^.]+)$" "\\1" extension ${source} )
+ IF(LL_TEST_VERBOSE)
+ MESSAGE("LL_ADD_PROJECT_UNIT_TESTS UNITTEST_PROJECT_${project} individual source: ${source} (${name}.${extension})")
+ ENDIF(LL_TEST_VERBOSE)
+
+ #
+ # Per-codefile additional / external source, header, and include dir property extraction
+ #
+ # Source
+ GET_SOURCE_FILE_PROPERTY(${name}_test_additional_SOURCE_FILES ${source} LL_TEST_ADDITIONAL_SOURCE_FILES)
+ IF(${name}_test_additional_SOURCE_FILES MATCHES NOTFOUND)
+ SET(${name}_test_additional_SOURCE_FILES "")
+ ENDIF(${name}_test_additional_SOURCE_FILES MATCHES NOTFOUND)
+ SET(${name}_test_SOURCE_FILES ${source} tests/${name}_test.${extension} ${alltest_SOURCE_FILES} ${${name}_test_additional_SOURCE_FILES} )
+ IF(LL_TEST_VERBOSE)
+ MESSAGE("LL_ADD_PROJECT_UNIT_TESTS ${name}_test_SOURCE_FILES ${${name}_test_SOURCE_FILES}")
+ ENDIF(LL_TEST_VERBOSE)
+ # Headers
+ GET_SOURCE_FILE_PROPERTY(${name}_test_additional_HEADER_FILES ${source} LL_TEST_ADDITIONAL_HEADER_FILES)
+ IF(${name}_test_additional_HEADER_FILES MATCHES NOTFOUND)
+ SET(${name}_test_additional_HEADER_FILES "")
+ ENDIF(${name}_test_additional_HEADER_FILES MATCHES NOTFOUND)
+ SET(${name}_test_HEADER_FILES ${name}.h ${${name}_test_additional_HEADER_FILES})
+ set_source_files_properties(${${name}_test_HEADER_FILES} PROPERTIES HEADER_FILE_ONLY TRUE)
+ LIST(APPEND ${name}_test_SOURCE_FILES ${${name}_test_HEADER_FILES})
+ IF(LL_TEST_VERBOSE)
+ MESSAGE("LL_ADD_PROJECT_UNIT_TESTS ${name}_test_HEADER_FILES ${${name}_test_HEADER_FILES}")
+ ENDIF(LL_TEST_VERBOSE)
+ # Include dirs
+ GET_SOURCE_FILE_PROPERTY(${name}_test_additional_INCLUDE_DIRS ${source} LL_TEST_ADDITIONAL_INCLUDE_DIRS)
+ IF(${name}_test_additional_INCLUDE_DIRS MATCHES NOTFOUND)
+ SET(${name}_test_additional_INCLUDE_DIRS "")
+ ENDIF(${name}_test_additional_INCLUDE_DIRS MATCHES NOTFOUND)
+ INCLUDE_DIRECTORIES(${alltest_INCLUDE_DIRS} ${${name}_test_additional_INCLUDE_DIRS} )
+ IF(LL_TEST_VERBOSE)
+ MESSAGE("LL_ADD_PROJECT_UNIT_TESTS ${name}_test_additional_INCLUDE_DIRS ${${name}_test_additional_INCLUDE_DIRS}")
+ ENDIF(LL_TEST_VERBOSE)
+
+
+ # Setup target
+ ADD_EXECUTABLE(PROJECT_${project}_TEST_${name} ${${name}_test_SOURCE_FILES})
+ SET_TARGET_PROPERTIES(PROJECT_${project}_TEST_${name} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${EXE_STAGING_DIR}")
+
+ #
+ # Per-codefile additional / external project dep and lib dep property extraction
+ #
+ # WARNING: it's REALLY IMPORTANT to not mix these. I guarantee it will not work in the future. + poppy 2009-04-19
+ # Projects
+ GET_SOURCE_FILE_PROPERTY(${name}_test_additional_PROJECTS ${source} LL_TEST_ADDITIONAL_PROJECTS)
+ IF(${name}_test_additional_PROJECTS MATCHES NOTFOUND)
+ SET(${name}_test_additional_PROJECTS "")
+ ENDIF(${name}_test_additional_PROJECTS MATCHES NOTFOUND)
+ # Libraries
+ GET_SOURCE_FILE_PROPERTY(${name}_test_additional_LIBRARIES ${source} LL_TEST_ADDITIONAL_LIBRARIES)
+ IF(${name}_test_additional_LIBRARIES MATCHES NOTFOUND)
+ SET(${name}_test_additional_LIBRARIES "")
+ ENDIF(${name}_test_additional_LIBRARIES MATCHES NOTFOUND)
+ IF(LL_TEST_VERBOSE)
+ MESSAGE("LL_ADD_PROJECT_UNIT_TESTS ${name}_test_additional_PROJECTS ${${name}_test_additional_PROJECTS}")
+ MESSAGE("LL_ADD_PROJECT_UNIT_TESTS ${name}_test_additional_LIBRARIES ${${name}_test_additional_LIBRARIES}")
+ ENDIF(LL_TEST_VERBOSE)
+ # Add to project
+ TARGET_LINK_LIBRARIES(PROJECT_${project}_TEST_${name} ${alltest_LIBRARIES} ${alltest_DEP_TARGETS} ${${name}_test_additional_PROJECTS} ${${name}_test_additional_LIBRARIES} )
+ # Compile-time Definitions
+ GET_SOURCE_FILE_PROPERTY(${name}_test_additional_CFLAGS ${source} LL_TEST_ADDITIONAL_CFLAGS)
+ IF(NOT ${name}_test_additional_CFLAGS MATCHES NOTFOUND)
+ SET_TARGET_PROPERTIES(PROJECT_${project}_TEST_${name} PROPERTIES COMPILE_FLAGS ${${name}_test_additional_CFLAGS} )
+ IF(LL_TEST_VERBOSE)
+ MESSAGE("LL_ADD_PROJECT_UNIT_TESTS ${name}_test_additional_CFLAGS ${${name}_test_additional_CFLAGS}")
+ ENDIF(LL_TEST_VERBOSE)
+ ENDIF(NOT ${name}_test_additional_CFLAGS MATCHES NOTFOUND)
+
+ #
+ # Setup test targets
+ #
+ GET_TARGET_PROPERTY(TEST_EXE PROJECT_${project}_TEST_${name} LOCATION)
+ SET(TEST_OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/PROJECT_${project}_TEST_${name}_ok.txt)
+ SET(TEST_CMD ${TEST_EXE} --touch=${TEST_OUTPUT} --sourcedir=${CMAKE_CURRENT_SOURCE_DIR})
+
+ # daveh - what configuration does this use? Debug? it's cmake-time, not build time. + poppy 2009-04-19
+ IF(LL_TEST_VERBOSE)
+ MESSAGE(STATUS "LL_ADD_PROJECT_UNIT_TESTS ${name} test_cmd = ${TEST_CMD}")
+ ENDIF(LL_TEST_VERBOSE)
+
+ SET_TEST_PATH(LD_LIBRARY_PATH)
+ LL_TEST_COMMAND(TEST_SCRIPT_CMD "${LD_LIBRARY_PATH}" ${TEST_CMD})
+ IF(LL_TEST_VERBOSE)
+ MESSAGE(STATUS "LL_ADD_PROJECT_UNIT_TESTS ${name} test_script = ${TEST_SCRIPT_CMD}")
+ ENDIF(LL_TEST_VERBOSE)
+ # Add test
+ ADD_CUSTOM_COMMAND(
+ OUTPUT ${TEST_OUTPUT}
+ COMMAND ${TEST_SCRIPT_CMD}
+ DEPENDS PROJECT_${project}_TEST_${name}
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+ )
+ # Why not add custom target and add POST_BUILD command?
+ # Slightly less uncertain behavior
+ # (OUTPUT commands run non-deterministically AFAIK) + poppy 2009-04-19
+ # > I did not use a post build step as I could not make it notify of a
+ # > failure after the first time you build and fail a test. - daveh 2009-04-20
+ LIST(APPEND ${project}_TEST_OUTPUT ${TEST_OUTPUT})
+ ENDFOREACH (source)
+
+ # Add the test runner target per-project
+ # (replaces old _test_ok targets all over the place)
+ ADD_CUSTOM_TARGET(${project}_tests ALL DEPENDS ${${project}_TEST_OUTPUT})
+ ADD_DEPENDENCIES(${project} ${project}_tests)
+ENDMACRO(LL_ADD_PROJECT_UNIT_TESTS)
+
+FUNCTION(LL_ADD_INTEGRATION_TEST
+ testname
+ additional_source_files
+ library_dependencies
+# variable args
+ )
+ if(TEST_DEBUG)
+ message(STATUS "Adding INTEGRATION_TEST_${testname} - debug output is on")
+ endif(TEST_DEBUG)
+
+ SET(source_files
+ tests/${testname}_test.cpp
+ ${CMAKE_SOURCE_DIR}/test/test.cpp
+ ${CMAKE_SOURCE_DIR}/test/lltut.cpp
+ ${additional_source_files}
+ )
+
+ SET(libraries
+ ${library_dependencies}
+ ${GOOGLEMOCK_LIBRARIES}
+ ${PTHREAD_LIBRARY}
+ )
+
+ # Add test executable build target
+ if(TEST_DEBUG)
+ message(STATUS "ADD_EXECUTABLE(INTEGRATION_TEST_${testname} ${source_files})")
+ endif(TEST_DEBUG)
+ ADD_EXECUTABLE(INTEGRATION_TEST_${testname} ${source_files})
+ SET_TARGET_PROPERTIES(INTEGRATION_TEST_${testname} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${EXE_STAGING_DIR}")
+ if(STANDALONE)
+ SET_TARGET_PROPERTIES(INTEGRATION_TEST_${testname} PROPERTIES COMPILE_FLAGS -I"${TUT_INCLUDE_DIR}")
+ endif(STANDALONE)
+
+ # Add link deps to the executable
+ if(TEST_DEBUG)
+ message(STATUS "TARGET_LINK_LIBRARIES(INTEGRATION_TEST_${testname} ${libraries})")
+ endif(TEST_DEBUG)
+ TARGET_LINK_LIBRARIES(INTEGRATION_TEST_${testname} ${libraries})
+
+ # Create the test running command
+ SET(test_command ${ARGN})
+ GET_TARGET_PROPERTY(TEST_EXE INTEGRATION_TEST_${testname} LOCATION)
+ LIST(FIND test_command "{}" test_exe_pos)
+ IF(test_exe_pos LESS 0)
+ # The {} marker means "the full pathname of the test executable."
+ # test_exe_pos -1 means we didn't find it -- so append the test executable
+ # name to $ARGN, the variable part of the arg list. This is convenient
+ # shorthand for both straightforward execution of the test program (empty
+ # $ARGN) and for running a "wrapper" program of some kind accepting the
+ # pathname of the test program as the last of its args. You need specify
+ # {} only if the test program's pathname isn't the last argument in the
+ # desired command line.
+ LIST(APPEND test_command "${TEST_EXE}")
+ ELSE (test_exe_pos LESS 0)
+ # Found {} marker at test_exe_pos. Remove the {}...
+ LIST(REMOVE_AT test_command test_exe_pos)
+ # ...and replace it with the actual name of the test executable.
+ LIST(INSERT test_command test_exe_pos "${TEST_EXE}")
+ ENDIF (test_exe_pos LESS 0)
+
+ SET_TEST_PATH(LD_LIBRARY_PATH)
+ LL_TEST_COMMAND(TEST_SCRIPT_CMD "${LD_LIBRARY_PATH}" ${test_command})
+
+ if(TEST_DEBUG)
+ message(STATUS "TEST_SCRIPT_CMD: ${TEST_SCRIPT_CMD}")
+ endif(TEST_DEBUG)
+
+ ADD_CUSTOM_COMMAND(
+ TARGET INTEGRATION_TEST_${testname}
+ POST_BUILD
+ COMMAND ${TEST_SCRIPT_CMD}
+ )
+
+ # Use CTEST? Not sure how to yet...
+ # ADD_TEST(INTEGRATION_TEST_RUNNER_${testname} ${TEST_SCRIPT_CMD})
+
+ENDFUNCTION(LL_ADD_INTEGRATION_TEST)
+
+MACRO(SET_TEST_PATH LISTVAR)
+ IF(WINDOWS)
+ # We typically build/package only Release variants of third-party
+ # libraries, so append the Release staging dir in case the library being
+ # sought doesn't have a debug variant.
+ set(${LISTVAR} ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR} ${SHARED_LIB_STAGING_DIR}/Release)
+ ELSEIF(DARWIN)
+ # We typically build/package only Release variants of third-party
+ # libraries, so append the Release staging dir in case the library being
+ # sought doesn't have a debug variant.
+ set(${LISTVAR} ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/Resources ${SHARED_LIB_STAGING_DIR}/Release/Resources /usr/lib)
+ ELSE(WINDOWS)
+ # Linux uses a single staging directory anyway.
+ IF (STANDALONE)
+ set(${LISTVAR} ${CMAKE_BINARY_DIR}/llcommon /usr/lib /usr/local/lib)
+ ELSE (STANDALONE)
+ set(${LISTVAR} ${SHARED_LIB_STAGING_DIR} /usr/lib)
+ ENDIF (STANDALONE)
+ ENDIF(WINDOWS)
+ENDMACRO(SET_TEST_PATH)
diff --git a/indra/cmake/LLCommon.cmake b/indra/cmake/LLCommon.cmake
index d1ab264a41..17e211cb99 100644
--- a/indra/cmake/LLCommon.cmake
+++ b/indra/cmake/LLCommon.cmake
@@ -13,7 +13,14 @@ set(LLCOMMON_INCLUDE_DIRS
${Boost_INCLUDE_DIRS}
)
-set(LLCOMMON_LIBRARIES llcommon)
+if (LINUX)
+ # In order to support using ld.gold on linux, we need to explicitely
+ # specify all libraries that llcommon uses.
+ # llcommon uses `clock_gettime' which is provided by librt on linux.
+ set(LLCOMMON_LIBRARIES llcommon rt)
+else (LINUX)
+ set(LLCOMMON_LIBRARIES llcommon)
+endif (LINUX)
add_definitions(${TCMALLOC_FLAG})
diff --git a/indra/cmake/LLConvexDecomposition.cmake b/indra/cmake/LLConvexDecomposition.cmake
new file mode 100644
index 0000000000..8e44504782
--- /dev/null
+++ b/indra/cmake/LLConvexDecomposition.cmake
@@ -0,0 +1,12 @@
+# -*- cmake -*-
+include(Prebuilt)
+
+set(LLCONVEXDECOMP_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include)
+
+if (INSTALL_PROPRIETARY AND NOT STANDALONE)
+ use_prebuilt_binary(llconvexdecomposition)
+ set(LLCONVEXDECOMP_LIBRARY llconvexdecomposition)
+else (INSTALL_PROPRIETARY AND NOT STANDALONE)
+ use_prebuilt_binary(llconvexdecompositionstub)
+ set(LLCONVEXDECOMP_LIBRARY llconvexdecompositionstub)
+endif (INSTALL_PROPRIETARY AND NOT STANDALONE)
diff --git a/indra/cmake/LLKDU.cmake b/indra/cmake/LLKDU.cmake
index 27c8ada686..e478b01f84 100644
--- a/indra/cmake/LLKDU.cmake
+++ b/indra/cmake/LLKDU.cmake
@@ -1,7 +1,21 @@
# -*- cmake -*-
-include(Prebuilt)
-if (INSTALL_PROPRIETARY AND NOT STANDALONE)
+# USE_KDU can be set when launching cmake as an option using the argument -DUSE_KDU:BOOL=ON
+# When building using proprietary binaries though (i.e. having access to LL private servers),
+# we always build with KDU
+if (INSTALL_PROPRIETARY)
+ set(USE_KDU ON CACHE BOOL "Use Kakadu library.")
+endif (INSTALL_PROPRIETARY)
+
+if (USE_KDU)
+ include(Prebuilt)
use_prebuilt_binary(kdu)
- set(LLKDU_LIBRARY llkdu)
-endif (INSTALL_PROPRIETARY AND NOT STANDALONE)
+ if (WINDOWS)
+ set(KDU_LIBRARY kdu.lib)
+ else (WINDOWS)
+ set(KDU_LIBRARY libkdu.a)
+ endif (WINDOWS)
+ set(KDU_INCLUDE_DIR ${AUTOBUILD_INSTALL_DIR}/include/kdu)
+ set(LLKDU_INCLUDE_DIRS ${LIBS_OPEN_DIR}/llkdu)
+ set(LLKDU_LIBRARIES llkdu)
+endif (USE_KDU)
diff --git a/indra/cmake/LLPlugin.cmake b/indra/cmake/LLPlugin.cmake
index 9722f16c3c..399cb332dd 100644
--- a/indra/cmake/LLPlugin.cmake
+++ b/indra/cmake/LLPlugin.cmake
@@ -5,4 +5,10 @@ set(LLPLUGIN_INCLUDE_DIRS
${LIBS_OPEN_DIR}/llplugin
)
-set(LLPLUGIN_LIBRARIES llplugin)
+if (LINUX)
+ # In order to support using ld.gold on linux, we need to explicitely
+ # specify all libraries that llplugin uses.
+ set(LLPLUGIN_LIBRARIES llplugin pthread)
+else (LINUX)
+ set(LLPLUGIN_LIBRARIES llplugin)
+endif (LINUX)
diff --git a/indra/cmake/LLPrimitive.cmake b/indra/cmake/LLPrimitive.cmake
index d397b78f1c..f15a2c2649 100644
--- a/indra/cmake/LLPrimitive.cmake
+++ b/indra/cmake/LLPrimitive.cmake
@@ -1,7 +1,33 @@
# -*- cmake -*-
+# these should be moved to their own cmake file
+include(Prebuilt)
+use_prebuilt_binary(colladadom)
+use_prebuilt_binary(pcre)
+use_prebuilt_binary(libxml)
+
set(LLPRIMITIVE_INCLUDE_DIRS
${LIBS_OPEN_DIR}/llprimitive
)
+if (WINDOWS)
+ set(LLPRIMITIVE_LIBRARIES
+ debug llprimitive
+ optimized llprimitive
+ debug libcollada14dom22-d
+ optimized libcollada14dom22
+ debug libboost_filesystem-vc100-mt-gd-1_45
+ optimized libboost_filesystem-vc100-mt-1_45
+ debug libboost_system-vc100-mt-gd-1_45
+ optimized libboost_system-vc100-mt-1_45
+ )
+else (WINDOWS)
+ set(LLPRIMITIVE_LIBRARIES
+ llprimitive
+ collada14dom
+ minizip
+ xml2
+ pcrecpp
+ pcre
+ )
+endif (WINDOWS)
-set(LLPRIMITIVE_LIBRARIES llprimitive)
diff --git a/indra/cmake/LLRender.cmake b/indra/cmake/LLRender.cmake
index c47e8878e9..8427928151 100644
--- a/indra/cmake/LLRender.cmake
+++ b/indra/cmake/LLRender.cmake
@@ -1,9 +1,11 @@
# -*- cmake -*-
include(FreeType)
+include(GLH)
set(LLRENDER_INCLUDE_DIRS
${LIBS_OPEN_DIR}/llrender
+ ${GLH_INCLUDE_DIR}
)
if (SERVER AND LINUX)
diff --git a/indra/cmake/LLSharedLibs.cmake b/indra/cmake/LLSharedLibs.cmake
index e29076c738..14dd67f32f 100644
--- a/indra/cmake/LLSharedLibs.cmake
+++ b/indra/cmake/LLSharedLibs.cmake
@@ -38,18 +38,17 @@ endmacro(ll_deploy_sharedlibs_command)
# ll_stage_sharedlib
# Performs config and adds a copy command for a sharedlib target.
macro(ll_stage_sharedlib DSO_TARGET)
- if(SHARED_LIB_STAGING_DIR)
- # target gets written to the DLL staging directory.
- # Also this directory is shared with RunBuildTest.cmake, y'know, for the tests.
- set_target_properties(${DSO_TARGET} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${SHARED_LIB_STAGING_DIR})
- if(NOT WINDOWS)
- get_target_property(DSO_PATH ${DSO_TARGET} LOCATION)
- get_filename_component(DSO_FILE ${DSO_PATH} NAME)
- if(DARWIN)
- set(SHARED_LIB_STAGING_DIR_CONFIG ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/Resources)
- else(DARWIN)
- set(SHARED_LIB_STAGING_DIR_CONFIG ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR})
- endif(DARWIN)
+ # target gets written to the DLL staging directory.
+ # Also this directory is shared with RunBuildTest.cmake, y'know, for the tests.
+ set_target_properties(${DSO_TARGET} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${SHARED_LIB_STAGING_DIR})
+ if(NOT WINDOWS)
+ get_target_property(DSO_PATH ${DSO_TARGET} LOCATION)
+ get_filename_component(DSO_FILE ${DSO_PATH} NAME)
+ if(DARWIN)
+ set(SHARED_LIB_STAGING_DIR_CONFIG ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/Resources)
+ else(DARWIN)
+ set(SHARED_LIB_STAGING_DIR_CONFIG ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR})
+ endif(DARWIN)
# *TODO - maybe make this a symbolic link? -brad
add_custom_command(
@@ -63,7 +62,6 @@ macro(ll_stage_sharedlib DSO_TARGET)
COMMENT "Copying llcommon to the staging folder."
)
endif(NOT WINDOWS)
- endif(SHARED_LIB_STAGING_DIR)
if (DARWIN)
set_target_properties(${DSO_TARGET} PROPERTIES
diff --git a/indra/cmake/LLTestCommand.cmake b/indra/cmake/LLTestCommand.cmake
index 554559edbd..b5a0580a90 100644
--- a/indra/cmake/LLTestCommand.cmake
+++ b/indra/cmake/LLTestCommand.cmake
@@ -1,3 +1,4 @@
+include(Python)
MACRO(LL_TEST_COMMAND OUTVAR LD_LIBRARY_PATH)
# nat wonders how Kitware can use the term 'function' for a construct that
# cannot return a value. And yet, variables you set inside a FUNCTION are
diff --git a/indra/cmake/LLWindow.cmake b/indra/cmake/LLWindow.cmake
index a5b9cf47a4..b4bb9a078a 100644
--- a/indra/cmake/LLWindow.cmake
+++ b/indra/cmake/LLWindow.cmake
@@ -18,7 +18,7 @@ else (STANDALONE)
use_prebuilt_binary(SDL)
set (SDL_FOUND TRUE)
set (SDL_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/i686-linux)
- set (SDL_LIBRARY SDL)
+ set (SDL_LIBRARY SDL directfb fusion direct)
endif (LINUX AND VIEWER)
endif (STANDALONE)
diff --git a/indra/cmake/LScript.cmake b/indra/cmake/LScript.cmake
index 86bfcb7440..21e78fc2c0 100644
--- a/indra/cmake/LScript.cmake
+++ b/indra/cmake/LScript.cmake
@@ -13,4 +13,4 @@ set(LSCRIPT_LIBRARIES
lscript_library
)
-set(LSCRIPT_EXECUTE_MONO_LIBRARIES lscript_execute_mono) \ No newline at end of file
+set(LSCRIPT_EXECUTE_MONO_LIBRARIES lscript_execute_mono)
diff --git a/indra/cmake/Linking.cmake b/indra/cmake/Linking.cmake
index bca99caf2a..47f944f9a5 100644
--- a/indra/cmake/Linking.cmake
+++ b/indra/cmake/Linking.cmake
@@ -1,32 +1,47 @@
# -*- cmake -*-
-if (NOT STANDALONE)
- if (WINDOWS)
- set(ARCH_PREBUILT_DIRS ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/lib)
- set(ARCH_PREBUILT_DIRS_RELEASE ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/lib/release)
- set(ARCH_PREBUILT_DIRS_DEBUG ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/lib/debug)
- set(SHARED_LIB_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs CACHE FILEPATH "Location of staged DLLs")
- set(EXE_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs CACHE FILEPATH "Location of staged executables")
- elseif (LINUX)
- if (VIEWER)
- set(ARCH_PREBUILT_DIRS ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/lib_release_client)
- else (VIEWER)
- set(ARCH_PREBUILT_DIRS ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/lib_release)
- endif (VIEWER)
- set(ARCH_PREBUILT_DIRS_RELEASE ${ARCH_PREBUILT_DIRS})
- set(ARCH_PREBUILT_DIRS_DEBUG ${ARCH_PREBUILT_DIRS})
- set(SHARED_LIB_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs/lib CACHE FILEPATH "Location of staged .sos")
- set(EXE_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs/bin CACHE FILEPATH "Location of staged executables")
- elseif (DARWIN)
- set(ARCH_PREBUILT_DIRS_RELEASE ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/lib_release)
- set(ARCH_PREBUILT_DIRS ${ARCH_PREBUILT_DIRS_RELEASE})
- set(ARCH_PREBUILT_DIRS_DEBUG ${ARCH_PREBUILT_DIRS_RELEASE})
- set(SHARED_LIB_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs CACHE FILEPATH "Location of staged DLLs")
- set(EXE_STAGING_DIR "${CMAKE_BINARY_DIR}/sharedlibs/\$(CONFIGURATION)" CACHE FILEPATH "Location of staged executables")
- endif (WINDOWS)
-endif (NOT STANDALONE)
+include(Variables)
-link_directories(${ARCH_PREBUILT_DIRS})
+set(ARCH_PREBUILT_DIRS ${AUTOBUILD_INSTALL_DIR}/lib)
+set(ARCH_PREBUILT_DIRS_RELEASE ${AUTOBUILD_INSTALL_DIR}/lib/release)
+set(ARCH_PREBUILT_DIRS_DEBUG ${AUTOBUILD_INSTALL_DIR}/lib/debug)
+if (WINDOWS)
+ set(SHARED_LIB_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs)
+ set(EXE_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs)
+elseif (LINUX)
+ set(SHARED_LIB_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs/lib)
+ set(EXE_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs/bin)
+elseif (DARWIN)
+ set(SHARED_LIB_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs)
+ set(EXE_STAGING_DIR "${CMAKE_BINARY_DIR}/sharedlibs")
+endif (WINDOWS)
+
+# Autobuild packages must provide 'release' versions of libraries, but may provide versions for
+# specific build types. AUTOBUILD_LIBS_INSTALL_DIRS lists first the build type directory and then
+# the 'release' directory (as a default fallback).
+# *NOTE - we have to take special care to use CMAKE_CFG_INTDIR on IDE generators (like mac and
+# windows) and CMAKE_BUILD_TYPE on Makefile based generators (like linux). The reason for this is
+# that CMAKE_BUILD_TYPE is essentially meaningless at configuration time for IDE generators and
+# CMAKE_CFG_INTDIR is meaningless at build time for Makefile generators
+if(WINDOWS OR DARWIN)
+ # the cmake xcode and VS generators implicitly append ${CMAKE_CFG_INTDIR} to the library paths for us
+ # fortunately both windows and darwin are case insensitive filesystems so this works.
+ set(AUTOBUILD_LIBS_INSTALL_DIRS "${AUTOBUILD_INSTALL_DIR}/lib/")
+else(WINDOWS OR DARWIN)
+ # else block is for linux and any other makefile based generators
+ string(TOLOWER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE_LOWER)
+ set(AUTOBUILD_LIBS_INSTALL_DIRS ${AUTOBUILD_INSTALL_DIR}/lib/${CMAKE_BUILD_TYPE_LOWER})
+endif(WINDOWS OR DARWIN)
+
+if (NOT "${CMAKE_BUILD_TYPE}" STREQUAL "Release")
+ # When we're building something other than Release, append the
+ # packages/lib/release directory to deal with autobuild packages that don't
+ # provide (e.g.) lib/debug libraries.
+ list(APPEND AUTOBUILD_LIBS_INSTALL_DIRS ${ARCH_PREBUILT_DIRS_RELEASE})
+ message(STATUS "CMAKE_BUILD_TYPE = ${CMAKE_BUILD_TYPE}, extending AUTOBUILD_LIBS_INSTALL_DIRS")
+endif (NOT "${CMAKE_BUILD_TYPE}" STREQUAL "Release")
+message(STATUS "For ${CMAKE_BUILD_TYPE}, AUTOBUILD_LIBS_INSTALL_DIRS: ${AUTOBUILD_LIBS_INSTALL_DIRS}")
+link_directories(${AUTOBUILD_LIBS_INSTALL_DIRS})
if (LINUX)
set(DL_LIBRARY dl)
diff --git a/indra/cmake/MonoEmbed.cmake b/indra/cmake/MonoEmbed.cmake
index 0f1f23309c..30890aed21 100644
--- a/indra/cmake/MonoEmbed.cmake
+++ b/indra/cmake/MonoEmbed.cmake
@@ -37,9 +37,9 @@ IF (DARWIN)
ELSE (DARWIN)
- SET(MONO_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/include)
+ SET(MONO_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include)
SET(GLIB_2_0_PLATFORM_INCLUDE_DIR
- ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/include/glib-2.0)
+ ${LIBS_PREBUILT_DIR}/include/glib-2.0)
SET(GLIB_2_0_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include/glib-2.0)
INCLUDE_DIRECTORIES(
diff --git a/indra/cmake/MySQL.cmake b/indra/cmake/MySQL.cmake
index e591fbc3d8..218482449d 100644
--- a/indra/cmake/MySQL.cmake
+++ b/indra/cmake/MySQL.cmake
@@ -7,7 +7,7 @@ use_prebuilt_binary(mysql)
if (LINUX)
if (WORD_SIZE EQUAL 32 OR DEBIAN_VERSION STREQUAL "3.1")
set(MYSQL_LIBRARIES mysqlclient)
- set(MYSQL_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/include)
+ set(MYSQL_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include)
else (WORD_SIZE EQUAL 32 OR DEBIAN_VERSION STREQUAL "3.1")
# Use the native MySQL library on a 64-bit system.
set(MYSQL_FIND_QUIETLY ON)
@@ -16,9 +16,9 @@ if (LINUX)
endif (WORD_SIZE EQUAL 32 OR DEBIAN_VERSION STREQUAL "3.1")
elseif (WINDOWS)
set(MYSQL_LIBRARIES mysqlclient)
- set(MYSQL_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/include)
+ set(MYSQL_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include)
elseif (DARWIN)
- set(MYSQL_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/include)
+ set(MYSQL_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include)
set(MYSQL_LIBRARIES
optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libmysqlclient.a
debug ${ARCH_PREBUILT_DIRS_DEBUG}/libmysqlclient.a
diff --git a/indra/cmake/NDOF.cmake b/indra/cmake/NDOF.cmake
index dad74e99b1..be6fe415f2 100644
--- a/indra/cmake/NDOF.cmake
+++ b/indra/cmake/NDOF.cmake
@@ -1,14 +1,32 @@
# -*- cmake -*-
include(Prebuilt)
-use_prebuilt_binary(ndofdev)
+set(NDOF ON CACHE BOOL "Use NDOF space navigator joystick library.")
-if (WINDOWS OR DARWIN OR LINUX)
+if (NDOF)
+ if (STANDALONE)
+ set(NDOF_FIND_REQUIRED ON)
+ include(FindNDOF)
+ else (STANDALONE)
+ use_prebuilt_binary(ndofdev)
+
+ if (WINDOWS)
+ set(NDOF_LIBRARY libndofdev)
+ elseif (DARWIN OR LINUX)
+ set(NDOF_LIBRARY ndofdev)
+ endif (WINDOWS)
+
+ set(NDOF_INCLUDE_DIR ${ARCH_PREBUILT_DIRS}/include/ndofdev)
+ set(NDOF_FOUND 1)
+ endif (STANDALONE)
+endif (NDOF)
+
+if (NDOF_FOUND)
add_definitions(-DLIB_NDOF=1)
-endif (WINDOWS OR DARWIN OR LINUX)
+ include_directories(${NDOF_INCLUDE_DIR})
+else (NDOF_FOUND)
+ message(STATUS "Building without N-DoF joystick support")
+ set(NDOF_INCLUDE_DIR "")
+ set(NDOF_LIBRARY "")
+endif (NDOF_FOUND)
-if (WINDOWS)
- set(NDOF_LIBRARY libndofdev)
-elseif (DARWIN OR LINUX)
- set(NDOF_LIBRARY ndofdev)
-endif (WINDOWS)
diff --git a/indra/cmake/OPENAL.cmake b/indra/cmake/OPENAL.cmake
index d01c680ed1..a3e1fb924e 100644
--- a/indra/cmake/OPENAL.cmake
+++ b/indra/cmake/OPENAL.cmake
@@ -9,18 +9,26 @@ else (LINUX)
endif (LINUX)
if (OPENAL)
+ set(OPENAL_LIB_INCLUDE_DIRS "${LIBS_PREBUILT_DIR}/include/AL")
if (STANDALONE)
include(FindPkgConfig)
include(FindOpenAL)
pkg_check_modules(OPENAL_LIB REQUIRED openal)
pkg_check_modules(FREEALUT_LIB REQUIRED freealut)
else (STANDALONE)
- use_prebuilt_binary(openal-soft)
+ use_prebuilt_binary(openal_soft)
endif (STANDALONE)
- set(OPENAL_LIBRARIES
- openal
- alut
+ if(WINDOWS)
+ set(OPENAL_LIBRARIES
+ OpenAL32
+ alut
)
+ else()
+ set(OPENAL_LIBRARIES
+ openal
+ alut
+ )
+ endif()
endif (OPENAL)
if (OPENAL)
diff --git a/indra/cmake/OpenGL.cmake b/indra/cmake/OpenGL.cmake
index 6a2b6811af..0a3dd976b4 100644
--- a/indra/cmake/OpenGL.cmake
+++ b/indra/cmake/OpenGL.cmake
@@ -2,8 +2,7 @@
include(Prebuilt)
if (NOT STANDALONE)
- use_prebuilt_binary(GL)
- # possible glh_linear should have its own .cmake file instead
+ use_prebuilt_binary(glext)
use_prebuilt_binary(glh_linear)
- set(GLEXT_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/include)
+ set(GLEXT_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include)
endif (NOT STANDALONE)
diff --git a/indra/cmake/OpenSSL.cmake b/indra/cmake/OpenSSL.cmake
index 81584c09ea..2704912eb5 100644
--- a/indra/cmake/OpenSSL.cmake
+++ b/indra/cmake/OpenSSL.cmake
@@ -11,13 +11,13 @@ else (STANDALONE)
if (WINDOWS)
set(OPENSSL_LIBRARIES ssleay32 libeay32)
else (WINDOWS)
- set(OPENSSL_LIBRARIES ssl)
+ set(OPENSSL_LIBRARIES ssl crypto)
endif (WINDOWS)
- set(OPENSSL_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/include)
+ set(OPENSSL_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include)
endif (STANDALONE)
if (LINUX)
set(CRYPTO_LIBRARIES crypto)
elseif (DARWIN)
- set(CRYPTO_LIBRARIES llcrypto)
+ set(CRYPTO_LIBRARIES crypto)
endif (LINUX)
diff --git a/indra/cmake/PNG.cmake b/indra/cmake/PNG.cmake
index f6522d9e2f..913c575672 100644
--- a/indra/cmake/PNG.cmake
+++ b/indra/cmake/PNG.cmake
@@ -8,6 +8,14 @@ if (STANDALONE)
include(FindPNG)
else (STANDALONE)
use_prebuilt_binary(libpng)
- set(PNG_LIBRARIES png12)
- set(PNG_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/libpng12)
+ if (WINDOWS)
+ set(PNG_LIBRARIES libpng15)
+ set(PNG_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/libpng15)
+ elseif(DARWIN)
+ set(PNG_LIBRARIES png15)
+ set(PNG_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/libpng15)
+ else()
+ set(PNG_LIBRARIES png15)
+ set(PNG_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/libpng15)
+ endif()
endif (STANDALONE)
diff --git a/indra/cmake/Prebuilt.cmake b/indra/cmake/Prebuilt.cmake
index a91519278c..dbb4dfc46c 100644
--- a/indra/cmake/Prebuilt.cmake
+++ b/indra/cmake/Prebuilt.cmake
@@ -1,44 +1,53 @@
# -*- cmake -*-
-include(Python)
-include(FindSCP)
+include(FindAutobuild)
+if(INSTALL_PROPRIETARY)
+ include(FindSCP)
+endif(INSTALL_PROPRIETARY)
+# The use_prebuilt_binary macro handles automated installation of package
+# dependencies using autobuild. The goal is that 'autobuild install' should
+# only be run when we know we need to install a new package. This should be
+# the case in a clean checkout, or if autobuild.xml has been updated since the
+# last run (encapsulated by the file ${CMAKE_BINARY_DIR}/temp/sentinel_installed),
+# or if a previous attempt to install the package has failed (the exit status
+# of previous attempts is serialized in the file
+# ${CMAKE_BINARY_DIR}/temp/${_binary}_installed)
macro (use_prebuilt_binary _binary)
- if (NOT STANDALONE)
- if(${CMAKE_BINARY_DIR}/temp/sentinel_installed IS_NEWER_THAN ${CMAKE_BINARY_DIR}/temp/${_binary}_installed)
- if(INSTALL_PROPRIETARY)
- include(FindSCP)
- if(DEBUG_PREBUILT)
- message("cd ${SCRIPTS_DIR} && ${PYTHON_EXECUTABLE} install.py --install-dir=${CMAKE_SOURCE_DIR}/.. --scp=${SCP_EXECUTABLE} ${_binary}")
- endif(DEBUG_PREBUILT)
- execute_process(COMMAND ${PYTHON_EXECUTABLE}
- install.py
- --install-dir=${CMAKE_SOURCE_DIR}/..
- --scp=${SCP_EXECUTABLE}
- ${_binary}
- WORKING_DIRECTORY ${SCRIPTS_DIR}
- RESULT_VARIABLE ${_binary}_installed
- )
- else(INSTALL_PROPRIETARY)
- if(DEBUG_PREBUILT)
- message("cd ${SCRIPTS_DIR} && ${PYTHON_EXECUTABLE} install.py --install-dir=${CMAKE_SOURCE_DIR}/.. ${_binary}")
- endif(DEBUG_PREBUILT)
- execute_process(COMMAND ${PYTHON_EXECUTABLE}
- install.py
- --install-dir=${CMAKE_SOURCE_DIR}/..
- ${_binary}
- WORKING_DIRECTORY ${SCRIPTS_DIR}
- RESULT_VARIABLE ${_binary}_installed
- )
- endif(INSTALL_PROPRIETARY)
+ if (NOT DEFINED STANDALONE_${_binary})
+ set(STANDALONE_${_binary} ${STANDALONE})
+ endif (NOT DEFINED STANDALONE_${_binary})
+
+ if (NOT STANDALONE_${_binary})
+ if("${${_binary}_installed}" STREQUAL "" AND EXISTS "${CMAKE_BINARY_DIR}/temp/${_binary}_installed")
+ file(READ ${CMAKE_BINARY_DIR}/temp/${_binary}_installed "${_binary}_installed")
+ if(DEBUG_PREBUILT)
+ message(STATUS "${_binary}_installed: \"${${_binary}_installed}\"")
+ endif(DEBUG_PREBUILT)
+ endif("${${_binary}_installed}" STREQUAL "" AND EXISTS "${CMAKE_BINARY_DIR}/temp/${_binary}_installed")
+
+ if(${CMAKE_BINARY_DIR}/temp/sentinel_installed IS_NEWER_THAN ${CMAKE_BINARY_DIR}/temp/${_binary}_installed OR NOT ${${_binary}_installed} EQUAL 0)
+ if(DEBUG_PREBUILT)
+ message("cd ${CMAKE_SOURCE_DIR} && ${AUTOBUILD_EXECUTABLE} install
+ --install-dir=${AUTOBUILD_INSTALL_DIR}
+ --skip-license-check
+ ${_binary} ")
+ endif(DEBUG_PREBUILT)
+ execute_process(COMMAND "${AUTOBUILD_EXECUTABLE}"
+ install
+ --install-dir=${AUTOBUILD_INSTALL_DIR}
+ --skip-license-check
+ ${_binary}
+ WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
+ RESULT_VARIABLE ${_binary}_installed
+ )
file(WRITE ${CMAKE_BINARY_DIR}/temp/${_binary}_installed "${${_binary}_installed}")
- else(${CMAKE_BINARY_DIR}/temp/sentinel_installed IS_NEWER_THAN ${CMAKE_BINARY_DIR}/temp/${_binary}_installed)
- set(${_binary}_installed 0)
- endif(${CMAKE_BINARY_DIR}/temp/sentinel_installed IS_NEWER_THAN ${CMAKE_BINARY_DIR}/temp/${_binary}_installed)
+ endif(${CMAKE_BINARY_DIR}/temp/sentinel_installed IS_NEWER_THAN ${CMAKE_BINARY_DIR}/temp/${_binary}_installed OR NOT ${${_binary}_installed} EQUAL 0)
+
if(NOT ${_binary}_installed EQUAL 0)
message(FATAL_ERROR
"Failed to download or unpack prebuilt '${_binary}'."
" Process returned ${${_binary}_installed}.")
endif (NOT ${_binary}_installed EQUAL 0)
- endif (NOT STANDALONE)
+ endif (NOT STANDALONE_${_binary})
endmacro (use_prebuilt_binary _binary)
diff --git a/indra/cmake/Pth.cmake b/indra/cmake/Pth.cmake
deleted file mode 100644
index a28f6ec696..0000000000
--- a/indra/cmake/Pth.cmake
+++ /dev/null
@@ -1,21 +0,0 @@
-# -*- cmake -*-
-include(Prebuilt)
-
-set(PTH_FIND_QUIETLY ON)
-set(PTH_FIND_REQUIRED ON)
-
-if (STANDALONE)
-# ?? How would I construct FindPTH.cmake? This file was cloned from
-# CURL.cmake, which uses include(FindCURL), but there's no FindCURL.cmake?
-# include(FindPTH)
-else (STANDALONE)
- # This library is only needed to support Boost.Coroutine, and only on Mac.
- if (DARWIN)
- use_prebuilt_binary(pth)
- set(PTH_LIBRARIES pth)
- set(PTH_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include)
- else (DARWIN)
- set(PTH_LIBRARIES)
- set(PTH_INCLUDE_DIRS)
- endif (DARWIN)
-endif (STANDALONE)
diff --git a/indra/cmake/PulseAudio.cmake b/indra/cmake/PulseAudio.cmake
index e918de0198..360a971058 100644
--- a/indra/cmake/PulseAudio.cmake
+++ b/indra/cmake/PulseAudio.cmake
@@ -1,7 +1,7 @@
# -*- cmake -*-
include(Prebuilt)
-set(PULSEAUDIO ON CACHE BOOL "Build with PulseAudio support, if available.")
+set(PULSEAUDIO OFF CACHE BOOL "Build with PulseAudio support, if available.")
if (PULSEAUDIO)
if (STANDALONE)
diff --git a/indra/cmake/QuickTimePlugin.cmake b/indra/cmake/QuickTimePlugin.cmake
index 02f432e3c1..012f4e20d8 100644
--- a/indra/cmake/QuickTimePlugin.cmake
+++ b/indra/cmake/QuickTimePlugin.cmake
@@ -33,7 +33,7 @@ elseif (WINDOWS)
endif (DEBUG_QUICKTIME_LIBRARY AND RELEASE_QUICKTIME_LIBRARY)
include_directories(
- ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/include/quicktime
+ ${LIBS_PREBUILT_DIR}/include/quicktime
"${QUICKTIME_SDK_DIR}\\CIncludes"
)
endif (DARWIN)
diff --git a/indra/cmake/TemplateCheck.cmake b/indra/cmake/TemplateCheck.cmake
index 90d58d93ad..2fada2eda9 100644
--- a/indra/cmake/TemplateCheck.cmake
+++ b/indra/cmake/TemplateCheck.cmake
@@ -5,11 +5,10 @@ include(Python)
macro (check_message_template _target)
add_custom_command(
TARGET ${_target}
- POST_BUILD
+ PRE_LINK
COMMAND ${PYTHON_EXECUTABLE}
- ARGS ${SCRIPTS_DIR}/md5check.py
- 3f19d130400c547de36278a6b6f9b028
- ${SCRIPTS_DIR}/messages/message_template.msg
+ ARGS ${SCRIPTS_DIR}/template_verifier.py
+ --mode=development --cache_master --master_url=${TEMPLATE_VERIFIER_MASTER_URL} ${TEMPLATE_VERIFIER_OPTIONS}
COMMENT "Verifying message template - See http://wiki.secondlife.com/wiki/Template_verifier.py"
)
endmacro (check_message_template)
diff --git a/indra/cmake/Tut.cmake b/indra/cmake/Tut.cmake
index 784560471d..7488e9dcb0 100644
--- a/indra/cmake/Tut.cmake
+++ b/indra/cmake/Tut.cmake
@@ -1,12 +1,6 @@
# -*- cmake -*-
include(Prebuilt)
-set(TUT_FIND_REQUIRED TRUE)
-set(TUT_FIND_QUIETLY TRUE)
-
-if (STANDALONE)
- include(FindTut)
- include_directories(${TUT_INCLUDE_DIR})
-else (STANDALONE)
+if (NOT STANDALONE)
use_prebuilt_binary(tut)
-endif (STANDALONE)
+endif(NOT STANDALONE)
diff --git a/indra/cmake/UI.cmake b/indra/cmake/UI.cmake
index f529f5b644..91e5258fb7 100644
--- a/indra/cmake/UI.cmake
+++ b/indra/cmake/UI.cmake
@@ -51,11 +51,11 @@ else (STANDALONE)
endif (LINUX)
include_directories (
- ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/include
+ ${LIBS_PREBUILT_DIR}/include
${LIBS_PREBUILT_DIR}/include
)
foreach(include ${${LL_ARCH}_INCLUDES})
- include_directories(${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/include/${include})
+ include_directories(${LIBS_PREBUILT_DIR}/include/${include})
endforeach(include)
endif (STANDALONE)
diff --git a/indra/cmake/Variables.cmake b/indra/cmake/Variables.cmake
index 5dc0cabf03..4cbf7aa043 100644
--- a/indra/cmake/Variables.cmake
+++ b/indra/cmake/Variables.cmake
@@ -17,6 +17,10 @@
# Relative and absolute paths to subtrees.
+if(NOT DEFINED COMMON_CMAKE_DIR)
+ set(COMMON_CMAKE_DIR "${CMAKE_SOURCE_DIR}/cmake")
+endif(NOT DEFINED COMMON_CMAKE_DIR)
+
set(LIBS_CLOSED_PREFIX)
set(LIBS_OPEN_PREFIX)
set(LIBS_SERVER_PREFIX)
@@ -25,22 +29,41 @@ set(SERVER_PREFIX)
set(VIEWER_PREFIX)
set(INTEGRATION_TESTS_PREFIX)
set(LL_TESTS ON CACHE BOOL "Build and run unit and integration tests (disable for build timing runs to reduce variation")
+set(INCREMENTAL_LINK OFF CACHE BOOL "Use incremental linking on win32 builds (enable for faster links on some machines)")
+
+if(LIBS_CLOSED_DIR)
+ file(TO_CMAKE_PATH "${LIBS_CLOSED_DIR}" LIBS_CLOSED_DIR)
+else(LIBS_CLOSED_DIR)
+ set(LIBS_CLOSED_DIR ${CMAKE_SOURCE_DIR}/${LIBS_CLOSED_PREFIX})
+endif(LIBS_CLOSED_DIR)
+if(LIBS_COMMON_DIR)
+ file(TO_CMAKE_PATH "${LIBS_COMMON_DIR}" LIBS_COMMON_DIR)
+else(LIBS_COMMON_DIR)
+ set(LIBS_COMMON_DIR ${CMAKE_SOURCE_DIR}/${LIBS_OPEN_PREFIX})
+endif(LIBS_COMMON_DIR)
+set(LIBS_OPEN_DIR ${LIBS_COMMON_DIR})
-set(LIBS_CLOSED_DIR ${CMAKE_SOURCE_DIR}/${LIBS_CLOSED_PREFIX})
-set(LIBS_OPEN_DIR ${CMAKE_SOURCE_DIR}/${LIBS_OPEN_PREFIX})
set(LIBS_SERVER_DIR ${CMAKE_SOURCE_DIR}/${LIBS_SERVER_PREFIX})
set(SCRIPTS_DIR ${CMAKE_SOURCE_DIR}/${SCRIPTS_PREFIX})
set(SERVER_DIR ${CMAKE_SOURCE_DIR}/${SERVER_PREFIX})
set(VIEWER_DIR ${CMAKE_SOURCE_DIR}/${VIEWER_PREFIX})
-set(LIBS_PREBUILT_DIR ${CMAKE_SOURCE_DIR}/../libraries CACHE PATH
+set(AUTOBUILD_INSTALL_DIR ${CMAKE_BINARY_DIR}/packages)
+
+set(LIBS_PREBUILT_DIR ${AUTOBUILD_INSTALL_DIR} CACHE PATH
"Location of prebuilt libraries.")
if (EXISTS ${CMAKE_SOURCE_DIR}/Server.cmake)
# We use this as a marker that you can try to use the proprietary libraries.
set(INSTALL_PROPRIETARY ON CACHE BOOL "Install proprietary binaries")
endif (EXISTS ${CMAKE_SOURCE_DIR}/Server.cmake)
+set(TEMPLATE_VERIFIER_OPTIONS "" CACHE STRING "Options for scripts/template_verifier.py")
+set(TEMPLATE_VERIFIER_MASTER_URL "http://bitbucket.org/lindenlab/master-message-template/raw/tip/message_template.msg" CACHE STRING "Location of the master message template")
+if (NOT CMAKE_BUILD_TYPE)
+ set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
+ "Build type. One of: Debug Release RelWithDebInfo" FORCE)
+endif (NOT CMAKE_BUILD_TYPE)
if (${CMAKE_SYSTEM_NAME} MATCHES "Windows")
set(WINDOWS ON BOOL FORCE)
@@ -54,20 +77,19 @@ if (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
set(LINUX ON BOOl FORCE)
# If someone has specified a word size, use that to determine the
- # architecture. Otherwise, let the compiler specify the word size.
- # Using uname will break under chroots and other cross arch compiles. RC
+ # architecture. Otherwise, let the architecture specify the word size.
if (WORD_SIZE EQUAL 32)
set(ARCH i686)
elseif (WORD_SIZE EQUAL 64)
set(ARCH x86_64)
else (WORD_SIZE EQUAL 32)
- if(CMAKE_SIZEOF_VOID_P MATCHES 4)
- set(ARCH i686)
- set(WORD_SIZE 32)
- else(CMAKE_SIZEOF_VOID_P MATCHES 4)
- set(ARCH x86_64)
+ execute_process(COMMAND uname -m COMMAND sed s/i.86/i686/
+ OUTPUT_VARIABLE ARCH OUTPUT_STRIP_TRAILING_WHITESPACE)
+ if (ARCH STREQUAL x86_64)
set(WORD_SIZE 64)
- endif(CMAKE_SIZEOF_VOID_P MATCHES 4)
+ else (ARCH STREQUAL x86_64)
+ set(WORD_SIZE 32)
+ endif (ARCH STREQUAL x86_64)
endif (WORD_SIZE EQUAL 32)
set(LL_ARCH ${ARCH}_linux)
@@ -76,25 +98,12 @@ endif (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
set(DARWIN 1)
-
- # NOTE: If specifying a different SDK with CMAKE_OSX_SYSROOT at configure
- # time you should also specify CMAKE_OSX_DEPLOYMENT_TARGET explicitly,
- # otherwise CMAKE_OSX_SYSROOT will be overridden here. We can't just check
- # for it being unset, as it gets set to the system default :(
-
- # Default to building against the 10.4 SDK if no deployment target is
- # specified.
- if (NOT CMAKE_OSX_DEPLOYMENT_TARGET)
- # NOTE: setting -isysroot is NOT adequate: http://lists.apple.com/archives/Xcode-users/2007/Oct/msg00696.html
- # see http://public.kitware.com/Bug/view.php?id=9959 + poppy
- set(CMAKE_OSX_SYSROOT /Developer/SDKs/MacOSX10.5.sdk)
- set(CMAKE_OSX_DEPLOYMENT_TARGET 10.4)
- endif (NOT CMAKE_OSX_DEPLOYMENT_TARGET)
-
- # GCC 4.2 is incompatible with the MacOSX 10.4 SDK
- if (${CMAKE_OSX_SYSROOT} MATCHES "10.4u")
- set(CMAKE_XCODE_ATTRIBUTE_GCC_VERSION "4.0")
- endif (${CMAKE_OSX_SYSROOT} MATCHES "10.4u")
+
+ # To support a different SDK update these Xcode settings:
+ set(CMAKE_OSX_DEPLOYMENT_TARGET 10.5)
+ set(CMAKE_OSX_SYSROOT /Developer/SDKs/MacOSX10.5.sdk)
+ set(CMAKE_XCODE_ATTRIBUTE_GCC_VERSION "4.0")
+ set(CMAKE_XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT dwarf-with-dsym)
# NOTE: To attempt an i386/PPC Universal build, add this on the configure line:
# -DCMAKE_OSX_ARCHITECTURES:STRING='i386;ppc'
@@ -125,7 +134,9 @@ set(VIEWER ON CACHE BOOL "Build Second Life viewer.")
set(VIEWER_CHANNEL "LindenDeveloper" CACHE STRING "Viewer Channel Name")
set(VIEWER_LOGIN_CHANNEL ${VIEWER_CHANNEL} CACHE STRING "Fake login channel for A/B Testing")
+set(VERSION_BUILD "0" CACHE STRING "Revision number passed in from the outside")
set(STANDALONE OFF CACHE BOOL "Do not use Linden-supplied prebuilt libraries.")
+set(UNATTENDED OFF CACHE BOOL "Should be set to ON for building with VC Express editions.")
if (NOT STANDALONE AND EXISTS ${CMAKE_SOURCE_DIR}/llphysics)
set(SERVER ON CACHE BOOL "Build Second Life server software.")
@@ -144,3 +155,4 @@ endif (LINUX AND SERVER AND VIEWER)
set(USE_PRECOMPILED_HEADERS ON CACHE BOOL "Enable use of precompiled header directives where supported.")
source_group("CMake Rules" FILES CMakeLists.txt)
+
diff --git a/indra/cmake/VisualLeakDetector.cmake b/indra/cmake/VisualLeakDetector.cmake
new file mode 100644
index 0000000000..d3ba554e46
--- /dev/null
+++ b/indra/cmake/VisualLeakDetector.cmake
@@ -0,0 +1,15 @@
+# -*- cmake -*-
+
+if (VIEWER)
+
+ set(INCLUDE_VLD_CMAKE OFF CACHE BOOL "Build the Windows viewer with Visual Leak Detector turned on or off")
+
+ if (INCLUDE_VLD_CMAKE)
+
+ if (WINDOWS)
+ add_definitions(-DINCLUDE_VLD=1)
+ endif (WINDOWS)
+
+ endif (INCLUDE_VLD_CMAKE)
+
+endif (VIEWER)
diff --git a/indra/cmake/WebKitLibPlugin.cmake b/indra/cmake/WebKitLibPlugin.cmake
index 12ba1b1b35..d9df78bfc8 100644
--- a/indra/cmake/WebKitLibPlugin.cmake
+++ b/indra/cmake/WebKitLibPlugin.cmake
@@ -3,57 +3,84 @@ include(Linking)
include(Prebuilt)
if (STANDALONE)
- set(WEBKITLIBPLUGIN OFF CACHE BOOL
- "WEBKITLIBPLUGIN support for the llplugin/llmedia test apps.")
+ # The minimal version, 4.4.3, is rather arbitrary: it's the version in Debian/Lenny.
+ find_package(Qt4 4.4.3 COMPONENTS QtCore QtGui QtNetwork QtOpenGL QtWebKit REQUIRED)
+ include(${QT_USE_FILE})
+ set(QTDIR $ENV{QTDIR})
+ if (QTDIR AND NOT "${QT_BINARY_DIR}" STREQUAL "${QTDIR}/bin")
+ message(FATAL_ERROR "\"${QT_BINARY_DIR}\" is unequal \"${QTDIR}/bin\"; "
+ "Qt is found by looking for qmake in your PATH. "
+ "Please set your PATH such that 'qmake' is found in \$QTDIR/bin, "
+ "or unset QTDIR if the found Qt is correct.")
+ endif (QTDIR AND NOT "${QT_BINARY_DIR}" STREQUAL "${QTDIR}/bin")
+ find_package(LLQtWebkit REQUIRED QUIET)
+ # Add the plugins.
+ set(QT_PLUGIN_LIBRARIES)
+ foreach(qlibname qgif qjpeg)
+ find_library(QT_PLUGIN_${qlibname} ${qlibname} PATHS ${QT_PLUGINS_DIR}/imageformats NO_DEFAULT_PATH)
+ if (QT_PLUGIN_${qlibname})
+ list(APPEND QT_PLUGIN_LIBRARIES ${QT_PLUGIN_${qlibname}})
+ else (QT_PLUGIN_${qtlibname})
+ message(FATAL_ERROR "Could not find the Qt plugin ${qlibname} in \"${QT_PLUGINS_DIR}/imageformats\"!")
+ endif (QT_PLUGIN_${qlibname})
+ endforeach(qlibname)
+ # qjpeg depends on libjpeg
+ list(APPEND QT_PLUGIN_LIBRARIES jpeg)
+ set(WEBKITLIBPLUGIN OFF CACHE BOOL
+ "WEBKITLIBPLUGIN support for the llplugin/llmedia test apps.")
else (STANDALONE)
- use_prebuilt_binary(llqtwebkit)
- set(WEBKITLIBPLUGIN ON CACHE BOOL
- "WEBKITLIBPLUGIN support for the llplugin/llmedia test apps.")
+ use_prebuilt_binary(llqtwebkit)
+ set(WEBKITLIBPLUGIN ON CACHE BOOL
+ "WEBKITLIBPLUGIN support for the llplugin/llmedia test apps.")
endif (STANDALONE)
if (WINDOWS)
- set(WEBKIT_PLUGIN_LIBRARIES
- debug llqtwebkitd
- debug QtWebKitd4
- debug QtOpenGLd4
- debug QtNetworkd4
- debug QtGuid4
- debug QtCored4
- debug qtmaind
- optimized llqtwebkit
- optimized QtWebKit4
- optimized QtOpenGL4
- optimized QtNetwork4
- optimized QtGui4
- optimized QtCore4
- optimized qtmain
- )
+ set(WEBKIT_PLUGIN_LIBRARIES
+ debug llqtwebkitd
+ debug QtWebKitd4
+ debug QtOpenGLd4
+ debug QtNetworkd4
+ debug QtGuid4
+ debug QtCored4
+ debug qtmaind
+ optimized llqtwebkit
+ optimized QtWebKit4
+ optimized QtOpenGL4
+ optimized QtNetwork4
+ optimized QtGui4
+ optimized QtCore4
+ optimized qtmain
+ )
elseif (DARWIN)
- set(WEBKIT_PLUGIN_LIBRARIES
- optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libllqtwebkit.dylib
- debug ${ARCH_PREBUILT_DIRS_RELEASE}/libllqtwebkit.dylib
- )
+ set(WEBKIT_PLUGIN_LIBRARIES
+ optimized ${ARCH_PREBUILT_DIRS_RELEASE}/libllqtwebkit.dylib
+ debug ${ARCH_PREBUILT_DIRS_RELEASE}/libllqtwebkit.dylib
+ )
elseif (LINUX)
- if (STANDALONE)
- set(WEBKIT_PLUGIN_LIBRARIES llqtwebkit)
- else (STANDALONE)
+ set(WEBKIT_PLUGIN_LIBRARIES ${LLQTWEBKIT_LIBRARY} ${QT_LIBRARIES} ${QT_PLUGIN_LIBRARIES})
set(WEBKIT_PLUGIN_LIBRARIES
llqtwebkit
-
- qgif
- qjpeg
-
+# qico
+# qpng
+# qtiff
+# qsvg
+# QtSvg
QtWebKit
QtOpenGL
QtNetwork
QtGui
QtCore
-
- jpeg
+ jscore
+# qgif
+# qjpeg
+# jpeg
fontconfig
X11
Xrender
GL
+
+# sqlite3
+# Xi
+# SM
)
- endif (STANDALONE)
endif (WINDOWS)
diff --git a/indra/cmake/XmlRpcEpi.cmake b/indra/cmake/XmlRpcEpi.cmake
index 107d1926ba..5bd4848245 100644
--- a/indra/cmake/XmlRpcEpi.cmake
+++ b/indra/cmake/XmlRpcEpi.cmake
@@ -9,7 +9,10 @@ if (STANDALONE)
else (STANDALONE)
use_prebuilt_binary(xmlrpc-epi)
if (WINDOWS)
- set(XMLRPCEPI_LIBRARIES xmlrpcepi)
+ set(XMLRPCEPI_LIBRARIES
+ debug xmlrpc-epid
+ optimized xmlrpc-epi
+ )
else (WINDOWS)
set(XMLRPCEPI_LIBRARIES xmlrpc-epi)
endif (WINDOWS)
diff --git a/indra/cmake/run_build_test.py b/indra/cmake/run_build_test.py
index 37aa75e364..ce2d1e0386 100644
--- a/indra/cmake/run_build_test.py
+++ b/indra/cmake/run_build_test.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/env python
"""\
@file run_build_test.py
@author Nat Goodspeed
@@ -109,6 +109,8 @@ def main(command, libpath=[], vars={}):
os.environ.update(dict([(str(key), str(value)) for key, value in vars.iteritems()]))
# Run the child process.
print "Running: %s" % " ".join(command)
+ # Make sure we see all relevant output *before* child-process output.
+ sys.stdout.flush()
return subprocess.call(command)
if __name__ == "__main__":
diff --git a/indra/copy_win_scripts/start-client.py b/indra/copy_win_scripts/start-client.py
index 5f7ff2f293..5699f5273f 100644
--- a/indra/copy_win_scripts/start-client.py
+++ b/indra/copy_win_scripts/start-client.py
@@ -1,4 +1,28 @@
#!/usr/bin/env python
+"""\
+@file start-client.py
+
+$LicenseInfo:firstyear=2010&license=viewerlgpl$
+Second Life Viewer Source Code
+Copyright (C) 2010-2011, Linden Research, Inc.
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation;
+version 2.1 of the License only.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+$/LicenseInfo$
+"""
import sys, getopt
import os
import llstart
diff --git a/indra/develop.py b/indra/develop.py
deleted file mode 100755
index 36c947327a..0000000000
--- a/indra/develop.py
+++ /dev/null
@@ -1,862 +0,0 @@
-#!/usr/bin/env python
-#
-# @file develop.py
-# @authors Bryan O'Sullivan, Mark Palange, Aaron Brashears
-# @brief Fire and forget script to appropriately configure cmake for SL.
-#
-# $LicenseInfo:firstyear=2007&license=viewerlgpl$
-# Second Life Viewer Source Code
-# Copyright (C) 2010, Linden Research, Inc.
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation;
-# version 2.1 of the License only.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-#
-# Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
-# $/LicenseInfo$
-
-
-import errno
-import getopt
-import os
-import random
-import re
-import shutil
-import socket
-import sys
-import commands
-import subprocess
-
-class CommandError(Exception):
- pass
-
-
-def mkdir(path):
- try:
- os.mkdir(path)
- return path
- except OSError, err:
- if err.errno != errno.EEXIST or not os.path.isdir(path):
- raise
-
-def getcwd():
- cwd = os.getcwd()
- if 'a' <= cwd[0] <= 'z' and cwd[1] == ':':
- # CMake wants DOS drive letters to be in uppercase. The above
- # condition never asserts on platforms whose full path names
- # always begin with a slash, so we don't need to test whether
- # we are running on Windows.
- cwd = cwd[0].upper() + cwd[1:]
- return cwd
-
-def quote(opts):
- return '"' + '" "'.join([ opt.replace('"', '') for opt in opts ]) + '"'
-
-class PlatformSetup(object):
- generator = None
- build_types = {}
- for t in ('Debug', 'Release', 'RelWithDebInfo'):
- build_types[t.lower()] = t
-
- build_type = build_types['relwithdebinfo']
- standalone = 'OFF'
- unattended = 'OFF'
- universal = 'OFF'
- project_name = 'SecondLife'
- distcc = True
- cmake_opts = []
- word_size = 32
- using_express = False
-
- def __init__(self):
- self.script_dir = os.path.realpath(
- os.path.dirname(__import__(__name__).__file__))
-
- def os(self):
- '''Return the name of the OS.'''
-
- raise NotImplemented('os')
-
- def arch(self):
- '''Return the CPU architecture.'''
-
- return None
-
- def platform(self):
- '''Return a stringified two-tuple of the OS name and CPU
- architecture.'''
-
- ret = self.os()
- if self.arch():
- ret += '-' + self.arch()
- return ret
-
- def build_dirs(self):
- '''Return the top-level directories in which builds occur.
-
- This can return more than one directory, e.g. if doing a
- 32-bit viewer and server build on Linux.'''
-
- return ['build-' + self.platform()]
-
- def cmake_commandline(self, src_dir, build_dir, opts, simple):
- '''Return the command line to run cmake with.'''
-
- args = dict(
- dir=src_dir,
- generator=self.generator,
- opts=quote(opts),
- standalone=self.standalone,
- unattended=self.unattended,
- word_size=self.word_size,
- type=self.build_type.upper(),
- )
- #if simple:
- # return 'cmake %(opts)s %(dir)r' % args
- return ('cmake -DCMAKE_BUILD_TYPE:STRING=%(type)s '
- '-DSTANDALONE:BOOL=%(standalone)s '
- '-DUNATTENDED:BOOL=%(unattended)s '
- '-DWORD_SIZE:STRING=%(word_size)s '
- '-G %(generator)r %(opts)s %(dir)r' % args)
-
- def run_cmake(self, args=[]):
- '''Run cmake.'''
-
- # do a sanity check to make sure we have a generator
- if not hasattr(self, 'generator'):
- raise "No generator available for '%s'" % (self.__name__,)
- cwd = getcwd()
- created = []
- try:
- for d in self.build_dirs():
- simple = True
- if mkdir(d):
- created.append(d)
- simple = False
- try:
- os.chdir(d)
- cmd = self.cmake_commandline(cwd, d, args, simple)
- print 'Running %r in %r' % (cmd, d)
- self.run(cmd, 'cmake')
- finally:
- os.chdir(cwd)
- except:
- # If we created a directory in which to run cmake and
- # something went wrong, the directory probably just
- # contains garbage, so delete it.
- os.chdir(cwd)
- for d in created:
- print 'Cleaning %r' % d
- shutil.rmtree(d)
- raise
-
- def parse_build_opts(self, arguments):
- opts, targets = getopt.getopt(arguments, 'o:', ['option='])
- build_opts = []
- for o, a in opts:
- if o in ('-o', '--option'):
- build_opts.append(a)
- return build_opts, targets
-
- def run_build(self, opts, targets):
- '''Build the default targets for this platform.'''
-
- raise NotImplemented('run_build')
-
- def cleanup(self):
- '''Delete all build directories.'''
-
- cleaned = 0
- for d in self.build_dirs():
- if os.path.isdir(d):
- print 'Cleaning %r' % d
- shutil.rmtree(d)
- cleaned += 1
- if not cleaned:
- print 'Nothing to clean up!'
-
- def is_internal_tree(self):
- '''Indicate whether we are building in an internal source tree.'''
-
- return os.path.isdir(os.path.join(self.script_dir, 'newsim'))
-
- def find_in_path(self, name, defval=None, basename=False):
- for ext in self.exe_suffixes:
- name_ext = name + ext
- if os.sep in name_ext:
- path = os.path.abspath(name_ext)
- if os.access(path, os.X_OK):
- return [basename and os.path.basename(path) or path]
- for p in os.getenv('PATH', self.search_path).split(os.pathsep):
- path = os.path.join(p, name_ext)
- if os.access(path, os.X_OK):
- return [basename and os.path.basename(path) or path]
- if defval:
- return [defval]
- return []
-
-
-class UnixSetup(PlatformSetup):
- '''Generic Unixy build instructions.'''
-
- search_path = '/usr/bin:/usr/local/bin'
- exe_suffixes = ('',)
-
- def __init__(self):
- super(UnixSetup, self).__init__()
- self.generator = 'Unix Makefiles'
-
- def os(self):
- return 'unix'
-
- def arch(self):
- cpu = os.uname()[-1]
- if cpu.endswith('386'):
- cpu = 'i386'
- elif cpu.endswith('86'):
- cpu = 'i686'
- elif cpu in ('athlon',):
- cpu = 'i686'
- elif cpu == 'Power Macintosh':
- cpu = 'ppc'
- elif cpu == 'x86_64' and self.word_size == 32:
- cpu = 'i686'
- return cpu
-
- def run(self, command, name=None):
- '''Run a program. If the program fails, raise an exception.'''
- sys.stdout.flush()
- ret = os.system(command)
- if ret:
- if name is None:
- name = command.split(None, 1)[0]
- if os.WIFEXITED(ret):
- st = os.WEXITSTATUS(ret)
- if st == 127:
- event = 'was not found'
- else:
- event = 'exited with status %d' % st
- elif os.WIFSIGNALED(ret):
- event = 'was killed by signal %d' % os.WTERMSIG(ret)
- else:
- event = 'died unexpectedly (!?) with 16-bit status %d' % ret
- raise CommandError('the command %r %s' %
- (name, event))
-
-
-class LinuxSetup(UnixSetup):
- def __init__(self):
- super(LinuxSetup, self).__init__()
- try:
- self.debian_sarge = open('/etc/debian_version').read().strip() == '3.1'
- except:
- self.debian_sarge = False
-
- def os(self):
- return 'linux'
-
- def build_dirs(self):
- # Only build the server code if we have it.
- platform_build = '%s-%s' % (self.platform(), self.build_type.lower())
-
- if self.arch() == 'i686' and self.is_internal_tree():
- return ['viewer-' + platform_build, 'server-' + platform_build]
- elif self.arch() == 'x86_64' and self.is_internal_tree():
- # the viewer does not build in 64bit -- kdu5 issues
- # we can either use openjpeg, or overhaul our viewer to handle kdu5 or higher
- # doug knows about kdu issues
- return ['server-' + platform_build]
- else:
- return ['viewer-' + platform_build]
-
- def cmake_commandline(self, src_dir, build_dir, opts, simple):
- args = dict(
- dir=src_dir,
- generator=self.generator,
- opts=quote(opts),
- standalone=self.standalone,
- unattended=self.unattended,
- type=self.build_type.upper(),
- project_name=self.project_name,
- word_size=self.word_size,
- )
- if not self.is_internal_tree():
- args.update({'cxx':'g++', 'server':'OFF', 'viewer':'ON'})
- else:
- if self.distcc:
- distcc = self.find_in_path('distcc')
- baseonly = True
- else:
- distcc = []
- baseonly = False
- if 'server' in build_dir:
- gcc = distcc + self.find_in_path(
- self.debian_sarge and 'g++-3.3' or 'g++-4.1',
- 'g++', baseonly)
- args.update({'cxx': ' '.join(gcc), 'server': 'ON',
- 'viewer': 'OFF'})
- else:
- gcc41 = distcc + self.find_in_path('g++-4.1', 'g++', baseonly)
- args.update({'cxx': ' '.join(gcc41),
- 'server': 'OFF',
- 'viewer': 'ON'})
- cmd = (('cmake -DCMAKE_BUILD_TYPE:STRING=%(type)s '
- '-G %(generator)r -DSERVER:BOOL=%(server)s '
- '-DVIEWER:BOOL=%(viewer)s -DSTANDALONE:BOOL=%(standalone)s '
- '-DUNATTENDED:BOOL=%(unattended)s '
- '-DWORD_SIZE:STRING=%(word_size)s '
- '-DROOT_PROJECT_NAME:STRING=%(project_name)s '
- '%(opts)s %(dir)r')
- % args)
- if 'CXX' not in os.environ:
- args.update({'cmd':cmd})
- cmd = ('CXX=%(cxx)r %(cmd)s' % args)
- return cmd
-
- def run_build(self, opts, targets):
- job_count = None
-
- for i in range(len(opts)):
- if opts[i].startswith('-j'):
- try:
- job_count = int(opts[i][2:])
- except ValueError:
- try:
- job_count = int(opts[i+1])
- except ValueError:
- job_count = True
-
- def get_cpu_count():
- count = 0
- for line in open('/proc/cpuinfo'):
- if re.match(r'processor\s*:', line):
- count += 1
- return count
-
- def localhost():
- count = get_cpu_count()
- return 'localhost/' + str(count), count
-
- def get_distcc_hosts():
- try:
- hosts = []
- name = os.getenv('DISTCC_DIR', '/etc/distcc') + '/hosts'
- for l in open(name):
- l = l[l.find('#')+1:].strip()
- if l: hosts.append(l)
- return hosts
- except IOError:
- return (os.getenv('DISTCC_HOSTS', '').split() or
- [localhost()[0]])
-
- def count_distcc_hosts():
- cpus = 0
- hosts = 0
- for host in get_distcc_hosts():
- m = re.match(r'.*/(\d+)', host)
- hosts += 1
- cpus += m and int(m.group(1)) or 1
- return hosts, cpus
-
- def mk_distcc_hosts(basename, range, num_cpus):
- '''Generate a list of LL-internal machines to build on.'''
- loc_entry, cpus = localhost()
- hosts = [loc_entry]
- dead = []
- stations = [s for s in xrange(range) if s not in dead]
- random.shuffle(stations)
- hosts += ['%s%d.lindenlab.com/%d,lzo' % (basename, s, num_cpus) for s in stations]
- cpus += 2 * len(stations)
- return ' '.join(hosts), cpus
-
- if job_count is None:
- hosts, job_count = count_distcc_hosts()
- hostname = socket.gethostname()
- if hosts == 1:
- if hostname.startswith('station'):
- hosts, job_count = mk_distcc_hosts('station', 36, 2)
- os.environ['DISTCC_HOSTS'] = hosts
- if hostname.startswith('eniac'):
- hosts, job_count = mk_distcc_hosts('eniac', 71, 2)
- os.environ['DISTCC_HOSTS'] = hosts
- if hostname.startswith('build'):
- max_jobs = 6
- else:
- max_jobs = 12
- if job_count > max_jobs:
- job_count = max_jobs;
- opts.extend(['-j', str(job_count)])
-
- if targets:
- targets = ' '.join(targets)
- else:
- targets = 'all'
-
- for d in self.build_dirs():
- cmd = 'make -C %r %s %s' % (d, ' '.join(opts), targets)
- print 'Running %r' % cmd
- self.run(cmd)
-
-
-class DarwinSetup(UnixSetup):
- def __init__(self):
- super(DarwinSetup, self).__init__()
- self.generator = 'Xcode'
-
- def os(self):
- return 'darwin'
-
- def arch(self):
- if self.universal == 'ON':
- return 'universal'
- else:
- return UnixSetup.arch(self)
-
- def cmake_commandline(self, src_dir, build_dir, opts, simple):
- args = dict(
- dir=src_dir,
- generator=self.generator,
- opts=quote(opts),
- standalone=self.standalone,
- word_size=self.word_size,
- unattended=self.unattended,
- project_name=self.project_name,
- universal=self.universal,
- type=self.build_type.upper(),
- )
- if self.universal == 'ON':
- args['universal'] = '-DCMAKE_OSX_ARCHITECTURES:STRING=\'i386;ppc\''
- #if simple:
- # return 'cmake %(opts)s %(dir)r' % args
- return ('cmake -G %(generator)r '
- '-DCMAKE_BUILD_TYPE:STRING=%(type)s '
- '-DSTANDALONE:BOOL=%(standalone)s '
- '-DUNATTENDED:BOOL=%(unattended)s '
- '-DWORD_SIZE:STRING=%(word_size)s '
- '-DROOT_PROJECT_NAME:STRING=%(project_name)s '
- '%(universal)s '
- '%(opts)s %(dir)r' % args)
-
- def run_build(self, opts, targets):
- cwd = getcwd()
- if targets:
- targets = ' '.join(['-target ' + repr(t) for t in targets])
- else:
- targets = ''
- cmd = ('xcodebuild -configuration %s %s %s | grep -v "^[[:space:]]*setenv" ; exit ${PIPESTATUS[0]}' %
- (self.build_type, ' '.join(opts), targets))
- for d in self.build_dirs():
- try:
- os.chdir(d)
- print 'Running %r in %r' % (cmd, d)
- self.run(cmd)
- finally:
- os.chdir(cwd)
-
-
-class WindowsSetup(PlatformSetup):
- gens = {
- 'vc71' : {
- 'gen' : r'Visual Studio 7 .NET 2003',
- 'ver' : r'7.1'
- },
- 'vc80' : {
- 'gen' : r'Visual Studio 8 2005',
- 'ver' : r'8.0'
- },
- 'vc90' : {
- 'gen' : r'Visual Studio 9 2008',
- 'ver' : r'9.0'
- }
- }
- gens['vs2003'] = gens['vc71']
- gens['vs2005'] = gens['vc80']
- gens['vs2008'] = gens['vc90']
-
- search_path = r'C:\windows'
- exe_suffixes = ('.exe', '.bat', '.com')
-
- def __init__(self):
- super(WindowsSetup, self).__init__()
- self._generator = None
- self.incredibuild = False
-
- def _get_generator(self):
- if self._generator is None:
- for version in 'vc80 vc90 vc71'.split():
- if self.find_visual_studio(version):
- self._generator = version
- print 'Building with ', self.gens[version]['gen']
- break
- else:
- print >> sys.stderr, 'Cannot find a Visual Studio installation, testing for express editions'
- for version in 'vc80 vc90 vc71'.split():
- if self.find_visual_studio_express(version):
- self._generator = version
- self.using_express = True
- print 'Building with ', self.gens[version]['gen'] , "Express edition"
- break
- else:
- print >> sys.stderr, 'Cannot find any Visual Studio installation'
- sys.exit(1)
- return self._generator
-
- def _set_generator(self, gen):
- self._generator = gen
-
- generator = property(_get_generator, _set_generator)
-
- def os(self):
- return 'win32'
-
- def build_dirs(self):
- return ['build-' + self.generator]
-
- def cmake_commandline(self, src_dir, build_dir, opts, simple):
- args = dict(
- dir=src_dir,
- generator=self.gens[self.generator.lower()]['gen'],
- opts=quote(opts),
- standalone=self.standalone,
- unattended=self.unattended,
- project_name=self.project_name,
- word_size=self.word_size,
- )
- #if simple:
- # return 'cmake %(opts)s "%(dir)s"' % args
- return ('cmake -G "%(generator)s" '
- '-DSTANDALONE:BOOL=%(standalone)s '
- '-DUNATTENDED:BOOL=%(unattended)s '
- '-DWORD_SIZE:STRING=%(word_size)s '
- '-DROOT_PROJECT_NAME:STRING=%(project_name)s '
- '%(opts)s "%(dir)s"' % args)
-
- def get_HKLM_registry_value(self, key_str, value_str):
- import _winreg
- reg = _winreg.ConnectRegistry(None, _winreg.HKEY_LOCAL_MACHINE)
- key = _winreg.OpenKey(reg, key_str)
- value = _winreg.QueryValueEx(key, value_str)[0]
- print 'Found: %s' % value
- return value
-
- def find_visual_studio(self, gen=None):
- if gen is None:
- gen = self._generator
- gen = gen.lower()
- value_str = (r'EnvironmentDirectory')
- key_str = (r'SOFTWARE\Microsoft\VisualStudio\%s\Setup\VS' %
- self.gens[gen]['ver'])
- print ('Reading VS environment from HKEY_LOCAL_MACHINE\%s\%s' %
- (key_str, value_str))
- try:
- return self.get_HKLM_registry_value(key_str, value_str)
- except WindowsError, err:
- key_str = (r'SOFTWARE\Wow6432Node\Microsoft\VisualStudio\%s\Setup\VS' %
- self.gens[gen]['ver'])
-
- try:
- return self.get_HKLM_registry_value(key_str, value_str)
- except:
- print >> sys.stderr, "Didn't find ", self.gens[gen]['gen']
-
- return ''
-
- def find_visual_studio_express(self, gen=None):
- if gen is None:
- gen = self._generator
- gen = gen.lower()
- try:
- import _winreg
- key_str = (r'SOFTWARE\Microsoft\VCEXpress\%s\Setup\VC' %
- self.gens[gen]['ver'])
- value_str = (r'ProductDir')
- print ('Reading VS environment from HKEY_LOCAL_MACHINE\%s\%s' %
- (key_str, value_str))
- print key_str
-
- reg = _winreg.ConnectRegistry(None, _winreg.HKEY_LOCAL_MACHINE)
- key = _winreg.OpenKey(reg, key_str)
- value = _winreg.QueryValueEx(key, value_str)[0]+"IDE"
- print 'Found: %s' % value
- return value
- except WindowsError, err:
- print >> sys.stderr, "Didn't find ", self.gens[gen]['gen']
- return ''
-
- def get_build_cmd(self):
- if self.incredibuild:
- config = self.build_type
- if self.gens[self.generator]['ver'] in [ r'8.0', r'9.0' ]:
- config = '\"%s|Win32\"' % config
-
- executable = 'buildconsole'
- cmd = "%(bin)s %(prj)s.sln /build /cfg=%(cfg)s" % {'prj': self.project_name, 'cfg': config, 'bin': executable}
- return (executable, cmd)
-
- environment = self.find_visual_studio()
- if environment == '':
- environment = self.find_visual_studio_express()
- if environment == '':
- print >> sys.stderr, "Something went very wrong during build stage, could not find a Visual Studio installation."
- else:
- build_dirs=self.build_dirs();
- print >> sys.stderr, "\nSolution generation complete, it can can now be found in:", build_dirs[0]
- print >> sys.stderr, "\nPlease see https://wiki.secondlife.com/wiki/Microsoft_Visual_Studio#Extra_steps_for_Visual_Studio_Express_editions for express specific information"
- exit(0)
-
- # devenv.com is CLI friendly, devenv.exe... not so much.
- executable = '%sdevenv.com' % (self.find_visual_studio(),)
- cmd = ('"%s" %s.sln /build %s' %
- (executable, self.project_name, self.build_type))
- return (executable, cmd)
-
- def run(self, command, name=None, retry_on=None, retries=1):
- '''Run a program. If the program fails, raise an exception.'''
- assert name is not None, 'On windows an executable path must be given in name. [DEV-44838]'
- if os.path.isfile(name):
- path = name
- else:
- path = self.find_in_path(name)[0]
- while retries:
- retries = retries - 1
- print "develop.py tries to run:", command
- ret = subprocess.call(command, executable=path)
- print "got ret", ret, "from", command
- if ret == 0:
- break
- else:
- error = 'exited with status %d' % ret
- if retry_on is not None and retry_on == ret:
- print "Retrying... the command %r %s" % (name, error)
- else:
- raise CommandError('the command %r %s' % (name, error))
-
- def run_cmake(self, args=[]):
- '''Override to add the vstool.exe call after running cmake.'''
- PlatformSetup.run_cmake(self, args)
- if self.unattended == 'OFF':
- if self.using_express == False:
- self.run_vstool()
-
- def run_vstool(self):
- for build_dir in self.build_dirs():
- stamp = os.path.join(build_dir, 'vstool.txt')
- try:
- prev_build = open(stamp).read().strip()
- except IOError:
- prev_build = ''
- if prev_build == self.build_type:
- # Only run vstool if the build type has changed.
- continue
- executable = os.path.join('tools','vstool','VSTool.exe')
- vstool_cmd = (executable +
- ' --solution ' +
- os.path.join(build_dir,'SecondLife.sln') +
- ' --config ' + self.build_type +
- ' --startup secondlife-bin')
- print 'Running %r in %r' % (vstool_cmd, getcwd())
- self.run(vstool_cmd, name=executable)
- print >> open(stamp, 'w'), self.build_type
-
- def run_build(self, opts, targets):
- for t in targets:
- assert t.strip(), 'Unexpected empty targets: ' + repr(targets)
- cwd = getcwd()
- executable, build_cmd = self.get_build_cmd()
-
- for d in self.build_dirs():
- try:
- os.chdir(d)
- if targets:
- for t in targets:
- cmd = '%s /project %s %s' % (build_cmd, t, ' '.join(opts))
- print 'Running %r in %r' % (cmd, d)
- self.run(cmd, name=executable, retry_on=4, retries=3)
- else:
- cmd = '%s %s' % (build_cmd, ' '.join(opts))
- print 'Running %r in %r' % (cmd, d)
- self.run(cmd, name=executable, retry_on=4, retries=3)
- finally:
- os.chdir(cwd)
-
-class CygwinSetup(WindowsSetup):
- def __init__(self):
- super(CygwinSetup, self).__init__()
- self.generator = 'vc80'
-
- def cmake_commandline(self, src_dir, build_dir, opts, simple):
- dos_dir = commands.getoutput("cygpath -w %s" % src_dir)
- args = dict(
- dir=dos_dir,
- generator=self.gens[self.generator.lower()]['gen'],
- opts=quote(opts),
- standalone=self.standalone,
- unattended=self.unattended,
- project_name=self.project_name,
- word_size=self.word_size,
- )
- #if simple:
- # return 'cmake %(opts)s "%(dir)s"' % args
- return ('cmake -G "%(generator)s" '
- '-DUNATTENDED:BOOl=%(unattended)s '
- '-DSTANDALONE:BOOL=%(standalone)s '
- '-DWORD_SIZE:STRING=%(word_size)s '
- '-DROOT_PROJECT_NAME:STRING=%(project_name)s '
- '%(opts)s "%(dir)s"' % args)
-
-setup_platform = {
- 'darwin': DarwinSetup,
- 'linux2': LinuxSetup,
- 'win32' : WindowsSetup,
- 'cygwin' : CygwinSetup
- }
-
-
-usage_msg = '''
-Usage: develop.py [options] [command [command-options]]
-
-Options:
- -h | --help print this help message
- --standalone build standalone, without Linden prebuild libraries
- --unattended build unattended, do not invoke any tools requiring
- a human response
- --universal build a universal binary on Mac OS X (unsupported)
- -t | --type=NAME build type ("Debug", "Release", or "RelWithDebInfo")
- -m32 | -m64 build architecture (32-bit or 64-bit)
- -N | --no-distcc disable use of distcc
- -G | --generator=NAME generator name
- Windows: VC71 or VS2003 (default), VC80 (VS2005) or
- VC90 (VS2008)
- Mac OS X: Xcode (default), Unix Makefiles
- Linux: Unix Makefiles (default), KDevelop3
- -p | --project=NAME set the root project name. (Doesn't effect makefiles)
-
-Commands:
- build configure and build default target
- clean delete all build directories, does not affect sources
- configure configure project by running cmake (default if none given)
- printbuilddirs print the build directory that will be used
-
-Command-options for "configure":
- We use cmake variables to change the build configuration.
- -DSERVER:BOOL=OFF Don't configure simulator/dataserver/etc
- -DVIEWER:BOOL=OFF Don't configure the viewer
- -DPACKAGE:BOOL=ON Create "package" target to make installers
- -DLOCALIZESETUP:BOOL=ON Create one win_setup target per supported language
-
-Examples:
- Set up a viewer-only project for your system:
- develop.py configure -DSERVER:BOOL=OFF
-
- Set up a Visual Studio 2005 project with "package" target:
- develop.py -G vc80 configure -DPACKAGE:BOOL=ON
-'''
-
-def main(arguments):
- setup = setup_platform[sys.platform]()
- try:
- opts, args = getopt.getopt(
- arguments,
- '?hNt:p:G:m:',
- ['help', 'standalone', 'no-distcc', 'unattended', 'universal', 'type=', 'incredibuild', 'generator=', 'project='])
- except getopt.GetoptError, err:
- print >> sys.stderr, 'Error:', err
- print >> sys.stderr, """
-Note: You must pass -D options to cmake after the "configure" command
-For example: develop.py configure -DSERVER:BOOL=OFF"""
- print >> sys.stderr, usage_msg.strip()
- sys.exit(1)
-
- for o, a in opts:
- if o in ('-?', '-h', '--help'):
- print usage_msg.strip()
- sys.exit(0)
- elif o in ('--standalone',):
- setup.standalone = 'ON'
- elif o in ('--unattended',):
- setup.unattended = 'ON'
- elif o in ('--universal',):
- setup.universal = 'ON'
- elif o in ('-m',):
- if a in ('32', '64'):
- setup.word_size = int(a)
- else:
- print >> sys.stderr, 'Error: unknown word size', repr(a)
- print >> sys.stderr, 'Supported word sizes: 32, 64'
- sys.exit(1)
- elif o in ('-t', '--type'):
- try:
- setup.build_type = setup.build_types[a.lower()]
- except KeyError:
- print >> sys.stderr, 'Error: unknown build type', repr(a)
- print >> sys.stderr, 'Supported build types:'
- types = setup.build_types.values()
- types.sort()
- for t in types:
- print ' ', t
- sys.exit(1)
- elif o in ('-G', '--generator'):
- setup.generator = a
- elif o in ('-N', '--no-distcc'):
- setup.distcc = False
- elif o in ('-p', '--project'):
- setup.project_name = a
- elif o in ('--incredibuild'):
- setup.incredibuild = True
- else:
- print >> sys.stderr, 'INTERNAL ERROR: unhandled option', repr(o)
- sys.exit(1)
- if not args:
- setup.run_cmake()
- return
- try:
- cmd = args.pop(0)
- if cmd in ('cmake', 'configure'):
- setup.run_cmake(args)
- elif cmd == 'build':
- if os.getenv('DISTCC_DIR') is None:
- distcc_dir = os.path.join(getcwd(), '.distcc')
- if not os.path.exists(distcc_dir):
- os.mkdir(distcc_dir)
- print "setting DISTCC_DIR to %s" % distcc_dir
- os.environ['DISTCC_DIR'] = distcc_dir
- else:
- print "DISTCC_DIR is set to %s" % os.getenv('DISTCC_DIR')
- for d in setup.build_dirs():
- if not os.path.exists(d):
- raise CommandError('run "develop.py cmake" first')
- setup.run_cmake()
- opts, targets = setup.parse_build_opts(args)
- setup.run_build(opts, targets)
- elif cmd == 'clean':
- if args:
- raise CommandError('clean takes no arguments')
- setup.cleanup()
- elif cmd == 'printbuilddirs':
- for d in setup.build_dirs():
- print >> sys.stdout, d
- else:
- print >> sys.stderr, 'Error: unknown subcommand', repr(cmd)
- print >> sys.stderr, "(run 'develop.py --help' for help)"
- sys.exit(1)
- except getopt.GetoptError, err:
- print >> sys.stderr, 'Error with %r subcommand: %s' % (cmd, err)
- sys.exit(1)
-
-
-if __name__ == '__main__':
- try:
- main(sys.argv[1:])
- except CommandError, err:
- print >> sys.stderr, 'Error:', err
- sys.exit(1)
diff --git a/indra/edit-me-to-trigger-new-build.txt b/indra/edit-me-to-trigger-new-build.txt
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/indra/edit-me-to-trigger-new-build.txt
diff --git a/indra/fix-incredibuild.py b/indra/fix-incredibuild.py
index b96b00dc85..98f16e9d97 100644
--- a/indra/fix-incredibuild.py
+++ b/indra/fix-incredibuild.py
@@ -1,3 +1,26 @@
+#!/usr/bin/env python
+##
+## $LicenseInfo:firstyear=2011&license=viewerlgpl$
+## Second Life Viewer Source Code
+## Copyright (C) 2011, Linden Research, Inc.
+##
+## This library is free software; you can redistribute it and/or
+## modify it under the terms of the GNU Lesser General Public
+## License as published by the Free Software Foundation;
+## version 2.1 of the License only.
+##
+## This library is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+## Lesser General Public License for more details.
+##
+## You should have received a copy of the GNU Lesser General Public
+## License along with this library; if not, write to the Free Software
+## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+##
+## Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+## $/LicenseInfo$
+
import sys
import os
import glob
diff --git a/indra/integration_tests/CMakeLists.txt b/indra/integration_tests/CMakeLists.txt
index 67e8fbf1f2..ced2b3dbcf 100644
--- a/indra/integration_tests/CMakeLists.txt
+++ b/indra/integration_tests/CMakeLists.txt
@@ -1,3 +1,8 @@
# -*- cmake -*-
-
add_subdirectory(llui_libtest)
+IF (LLIMAGE_LIBTEST)
+ MESSAGE(STATUS "Build llimage_libtest")
+ add_subdirectory(llimage_libtest)
+ELSE (LLIMAGE_LIBTEST)
+ MESSAGE(STATUS "Skip llimage_libtest")
+ENDIF (LLIMAGE_LIBTEST)
diff --git a/indra/integration_tests/llimage_libtest/CMakeLists.txt b/indra/integration_tests/llimage_libtest/CMakeLists.txt
new file mode 100644
index 0000000000..af5c9fb2e7
--- /dev/null
+++ b/indra/integration_tests/llimage_libtest/CMakeLists.txt
@@ -0,0 +1,125 @@
+# -*- cmake -*-
+
+# Integration tests of the llimage library (JPEG2000, PNG, jpeg, etc... images reading and writing)
+
+project (llimage_libtest)
+
+include(00-Common)
+include(LLCommon)
+include(LLImage)
+include(LLImageJ2COJ)
+include(LLKDU)
+include(LLVFS)
+
+include_directories(
+ ${LLCOMMON_INCLUDE_DIRS}
+ ${LLVFS_INCLUDE_DIRS}
+ ${LLIMAGE_INCLUDE_DIRS}
+ )
+
+set(llimage_libtest_SOURCE_FILES
+ llimage_libtest.cpp
+ )
+
+set(llimage_libtest_HEADER_FILES
+ CMakeLists.txt
+ llimage_libtest.h
+ )
+
+set_source_files_properties(${llimage_libtest_HEADER_FILES}
+ PROPERTIES HEADER_FILE_ONLY TRUE)
+
+list(APPEND llimage_libtest_SOURCE_FILES ${llimage_libtest_HEADER_FILES})
+
+add_executable(llimage_libtest
+ WIN32
+ MACOSX_BUNDLE
+ ${llimage_libtest_SOURCE_FILES}
+)
+
+set_target_properties(llimage_libtest
+ PROPERTIES
+ WIN32_EXECUTABLE
+ FALSE
+)
+
+# OS-specific libraries
+if (DARWIN)
+ include(CMakeFindFrameworks)
+ find_library(COREFOUNDATION_LIBRARY CoreFoundation)
+ set(OS_LIBRARIES ${COREFOUNDATION_LIBRARY})
+elseif (WINDOWS)
+ set(OS_LIBRARIES)
+elseif (LINUX)
+ set(OS_LIBRARIES)
+else (DARWIN)
+ message(FATAL_ERROR "Unknown platform")
+endif (DARWIN)
+
+# Libraries on which this application depends on
+# Sort by high-level to low-level
+target_link_libraries(llimage_libtest
+ ${LLCOMMON_LIBRARIES}
+ ${LLVFS_LIBRARIES}
+ ${LLIMAGE_LIBRARIES}
+ ${LLKDU_LIBRARIES}
+ ${KDU_LIBRARY}
+ ${LLIMAGEJ2COJ_LIBRARIES}
+ ${OS_LIBRARIES}
+ )
+
+if (DARWIN)
+ # Path inside the app bundle where we'll need to copy libraries
+ set(LLIMAGE_LIBTEST_DESTINATION_DIR
+ ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/llimage_libtest.app/Contents/Resources
+ )
+ # Create the Contents/Resources directory
+ add_custom_command(
+ TARGET llimage_libtest POST_BUILD
+ COMMAND ${CMAKE_COMMAND}
+ ARGS
+ -E
+ make_directory
+ ${LLIMAGE_LIBTEST_DESTINATION_DIR}
+ COMMENT "Creating Resources directory in app bundle."
+ )
+else (DARWIN)
+ set(LLIMAGE_LIBTEST_DESTINATION_DIR
+ ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/
+ )
+endif (DARWIN)
+
+get_target_property(BUILT_LLCOMMON llcommon LOCATION)
+add_custom_command(TARGET llimage_libtest POST_BUILD
+ COMMAND ${CMAKE_COMMAND} -E copy ${BUILT_LLCOMMON} ${LLIMAGE_LIBTEST_DESTINATION_DIR}
+ DEPENDS ${BUILT_LLCOMMON}
+)
+
+if (DARWIN)
+ # Copy the required libraries to the package app
+ add_custom_command(TARGET llimage_libtest POST_BUILD
+ COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/../build-darwin-i386/packages/lib/release/libapr-1.0.dylib ${LLIMAGE_LIBTEST_DESTINATION_DIR}
+ DEPENDS ${CMAKE_SOURCE_DIR}/../build-darwin-i386/packages/lib/release/libapr-1.0.dylib
+ )
+ add_custom_command(TARGET llimage_libtest POST_BUILD
+ COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/../build-darwin-i386/packages/lib/release/libaprutil-1.0.dylib ${LLIMAGE_LIBTEST_DESTINATION_DIR}
+ DEPENDS ${CMAKE_SOURCE_DIR}/../build-darwin-i386/packages/lib/release/libaprutil-1.0.dylib
+ )
+ add_custom_command(TARGET llimage_libtest POST_BUILD
+ COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/../build-darwin-i386/packages/lib/release/libexception_handler.dylib ${LLIMAGE_LIBTEST_DESTINATION_DIR}
+ DEPENDS ${CMAKE_SOURCE_DIR}/../build-darwin-i386/packages/lib/release/libexception_handler.dylib
+ )
+ add_custom_command(TARGET llimage_libtest POST_BUILD
+ COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/../build-darwin-i386/packages/lib/release/libexpat.1.5.2.dylib ${LLIMAGE_LIBTEST_DESTINATION_DIR}
+ DEPENDS ${CMAKE_SOURCE_DIR}/../build-darwin-i386/packages/lib/release/libexpat.1.5.2.dylib
+ )
+endif (DARWIN)
+
+if (WINDOWS)
+ # Check indra/test_apps/llplugintest/CMakeLists.txt for an example of what to copy over for Windows and how
+endif (WINDOWS)
+
+# Ensure people working on the viewer don't break this library
+# *NOTE: This could be removed, or only built by TeamCity, if the build
+# and link times become too long.
+add_dependencies(viewer llimage_libtest)
diff --git a/indra/integration_tests/llimage_libtest/llimage_libtest.cpp b/indra/integration_tests/llimage_libtest/llimage_libtest.cpp
new file mode 100644
index 0000000000..48e876429d
--- /dev/null
+++ b/indra/integration_tests/llimage_libtest/llimage_libtest.cpp
@@ -0,0 +1,561 @@
+/**
+ * @file llimage_libtest.cpp
+ * @author Merov Linden
+ * @brief Integration test for the llimage library
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+#include "linden_common.h"
+#include "llpointer.h"
+#include "lltimer.h"
+
+#include "llimage_libtest.h"
+
+// Linden library includes
+#include "llimage.h"
+#include "llimagejpeg.h"
+#include "llimagepng.h"
+#include "llimagebmp.h"
+#include "llimagetga.h"
+#include "llimagej2c.h"
+#include "lldir.h"
+#include "lldiriterator.h"
+
+// system libraries
+#include <iostream>
+
+// doc string provided when invoking the program with --help
+static const char USAGE[] = "\n"
+"usage:\tllimage_libtest [options]\n"
+"\n"
+" -h, --help\n"
+" Print this help\n"
+" -i, --input <file1 .. file2>\n"
+" List of image files to load and convert. Patterns with wild cards can be used.\n"
+" -o, --output <file1 .. file2> OR <type>\n"
+" List of image files to create (assumes same order as for input files)\n"
+" OR 3 letters file type extension to convert each input file into.\n"
+" -r, --region <x0, y0, x1, y1>\n"
+" Crop region applied to the input files in pixels.\n"
+" Only used for j2c images. Default is no region cropping.\n"
+" -d, --discard_level <n>\n"
+" Discard level max used on input. 0 is highest resolution. Max discard level is 5.\n"
+" This allows the input image to be clamped in resolution when loading.\n"
+" Only valid for j2c images. Default is no discard.\n"
+" -p, --precincts <n>\n"
+" Dimension of precincts in pixels. Precincts are assumed square and identical for\n"
+" all levels. Note that this option also add PLT and tile markers to the codestream, \n"
+" and uses RPCL order. Power of 2 must be used.\n"
+" Only valid for output j2c images. Default is no precincts used.\n"
+" -b, --blocks <n>\n"
+" Dimension of coding blocks in pixels. Blocks are assumed square. Power of 2 must\n"
+" be used. Blocks must be smaller than precincts. Like precincts, this option adds\n"
+" PLT, tile markers and uses RPCL.\n"
+" Only valid for output j2c images. Default is 64.\n"
+" -l, --levels <n>\n"
+" Number of decomposition levels (aka discard levels) in the output image.\n"
+" The maximum number of levels authorized is 32.\n"
+" Only valid for output j2c images. Default is 5.\n"
+" -rev, --reversible\n"
+" Set the compression to be lossless (reversible in j2c parlance).\n"
+" Only valid for output j2c images.\n"
+" -log, --logmetrics <metric>\n"
+" Log performance data for <metric>. Results in <metric>.slp\n"
+" Note: so far, only ImageCompressionTester has been tested.\n"
+" -a, --analyzeperformance\n"
+" Create a report comparing <metric>_baseline.slp with current <metric>.slp\n"
+" Results in <metric>_report.csv\n"
+" -s, --image-stats\n"
+" Output stats for each input and output image.\n"
+"\n";
+
+// true when all image loading is done. Used by metric logging thread to know when to stop the thread.
+static bool sAllDone = false;
+
+// Create an empty formatted image instance of the correct type from the filename
+LLPointer<LLImageFormatted> create_image(const std::string &filename)
+{
+ std::string exten = gDirUtilp->getExtension(filename);
+ LLPointer<LLImageFormatted> image = LLImageFormatted::createFromExtension(exten);
+ return image;
+}
+
+void output_image_stats(LLPointer<LLImageFormatted> image, const std::string &filename)
+{
+ // Print out some statistical data on the image
+ std::cout << "Image stats for : " << filename << ", extension : " << image->getExtension() << std::endl;
+
+ std::cout << " with : " << (int)(image->getWidth()) << ", height : " << (int)(image->getHeight()) << std::endl;
+ std::cout << " comp : " << (int)(image->getComponents()) << ", levels : " << (int)(image->getDiscardLevel()) << std::endl;
+ std::cout << " head : " << (int)(image->calcHeaderSize()) << ", data : " << (int)(image->getDataSize()) << std::endl;
+
+ return;
+}
+
+// Load an image from file and return a raw (decompressed) instance of its data
+LLPointer<LLImageRaw> load_image(const std::string &src_filename, int discard_level, int* region, bool output_stats)
+{
+ LLPointer<LLImageFormatted> image = create_image(src_filename);
+
+ // This just loads the image file stream into a buffer. No decoding done.
+ if (!image->load(src_filename))
+ {
+ return NULL;
+ }
+
+ if( (image->getComponents() != 3) && (image->getComponents() != 4) )
+ {
+ std::cout << "Image files with less than 3 or more than 4 components are not supported\n";
+ return NULL;
+ }
+
+ if (output_stats)
+ {
+ output_image_stats(image, src_filename);
+ }
+
+ LLPointer<LLImageRaw> raw_image = new LLImageRaw;
+
+ // Set the image restriction on load in the case of a j2c image
+ if ((image->getCodec() == IMG_CODEC_J2C) && ((discard_level != -1) || (region != NULL)))
+ {
+ // That method doesn't exist (and likely, doesn't make sense) for any other image file format
+ // hence the required cryptic cast.
+ ((LLImageJ2C*)(image.get()))->initDecode(*raw_image, discard_level, region);
+ }
+
+ if (!image->decode(raw_image, 0.0f))
+ {
+ return NULL;
+ }
+
+ return raw_image;
+}
+
+// Save a raw image instance into a file
+bool save_image(const std::string &dest_filename, LLPointer<LLImageRaw> raw_image, int blocks_size, int precincts_size, int levels, bool reversible, bool output_stats)
+{
+ LLPointer<LLImageFormatted> image = create_image(dest_filename);
+
+ // Set the image codestream parameters on output in the case of a j2c image
+ if (image->getCodec() == IMG_CODEC_J2C)
+ {
+ // That method doesn't exist (and likely, doesn't make sense) for any other image file format
+ // hence the required cryptic cast.
+ if ((blocks_size != -1) || (precincts_size != -1) || (levels != 0))
+ {
+ ((LLImageJ2C*)(image.get()))->initEncode(*raw_image, blocks_size, precincts_size, levels);
+ }
+ ((LLImageJ2C*)(image.get()))->setReversible(reversible);
+ }
+
+ if (!image->encode(raw_image, 0.0f))
+ {
+ return false;
+ }
+
+ if (output_stats)
+ {
+ output_image_stats(image, dest_filename);
+ }
+
+ return image->save(dest_filename);
+}
+
+void store_input_file(std::list<std::string> &input_filenames, const std::string &path)
+{
+ // Break the incoming path in its components
+ std::string dir = gDirUtilp->getDirName(path);
+ std::string name = gDirUtilp->getBaseFileName(path);
+ std::string exten = gDirUtilp->getExtension(path);
+
+ // std::cout << "store_input_file : " << path << ", dir : " << dir << ", name : " << name << ", exten : " << exten << std::endl;
+
+ // If extension is not an image type or "*", exit
+ // Note: we don't support complex patterns for the extension like "j??"
+ // Note: on most shells, the pattern expansion is done by the shell so that pattern matching limitation is actually not a problem
+ if ((exten.compare("*") != 0) && (LLImageBase::getCodecFromExtension(exten) == IMG_CODEC_INVALID))
+ {
+ return;
+ }
+
+ if ((name.find('*') != -1) || ((name.find('?') != -1)))
+ {
+ // If file name is a pattern, iterate to get each file name and store
+ std::string next_name;
+ LLDirIterator iter(dir, name);
+ while (iter.next(next_name))
+ {
+ std::string file_name = dir + gDirUtilp->getDirDelimiter() + next_name;
+ input_filenames.push_back(file_name);
+ }
+ }
+ else
+ {
+ // Verify that the file does exist before storing
+ if (gDirUtilp->fileExists(path))
+ {
+ input_filenames.push_back(path);
+ }
+ else
+ {
+ std::cout << "store_input_file : the file " << path << " could not be found" << std::endl;
+ }
+ }
+}
+
+void store_output_file(std::list<std::string> &output_filenames, std::list<std::string> &input_filenames, const std::string &path)
+{
+ // Break the incoming path in its components
+ std::string dir = gDirUtilp->getDirName(path);
+ std::string name = gDirUtilp->getBaseFileName(path);
+ std::string exten = gDirUtilp->getExtension(path);
+
+ // std::cout << "store_output_file : " << path << ", dir : " << dir << ", name : " << name << ", exten : " << exten << std::endl;
+
+ if (dir.empty() && exten.empty())
+ {
+ // If dir and exten are empty, we interpret the name as a file extension type name and will iterate through input list to populate the output list
+ exten = name;
+ // Make sure the extension is an image type
+ if (LLImageBase::getCodecFromExtension(exten) == IMG_CODEC_INVALID)
+ {
+ return;
+ }
+ std::string delim = gDirUtilp->getDirDelimiter();
+ std::list<std::string>::iterator in_file = input_filenames.begin();
+ std::list<std::string>::iterator end = input_filenames.end();
+ for (; in_file != end; ++in_file)
+ {
+ dir = gDirUtilp->getDirName(*in_file);
+ name = gDirUtilp->getBaseFileName(*in_file,true);
+ std::string file_name;
+ if (!dir.empty())
+ {
+ file_name = dir + delim + name + "." + exten;
+ }
+ else
+ {
+ file_name = name + "." + exten;
+ }
+ output_filenames.push_back(file_name);
+ }
+ }
+ else
+ {
+ // Make sure the extension is an image type
+ if (LLImageBase::getCodecFromExtension(exten) == IMG_CODEC_INVALID)
+ {
+ return;
+ }
+ // Store the path
+ output_filenames.push_back(path);
+ }
+}
+
+// Holds the metric gathering output in a thread safe way
+class LogThread : public LLThread
+{
+public:
+ std::string mFile;
+
+ LogThread(std::string& test_name) : LLThread("llimage_libtest log")
+ {
+ std::string file_name = test_name + std::string(".slp");
+ mFile = file_name;
+ }
+
+ void run()
+ {
+ std::ofstream os(mFile.c_str());
+
+ while (!sAllDone)
+ {
+ LLFastTimer::writeLog(os);
+ os.flush();
+ ms_sleep(32);
+ }
+ LLFastTimer::writeLog(os);
+ os.flush();
+ os.close();
+ }
+};
+
+int main(int argc, char** argv)
+{
+ // List of input and output files
+ std::list<std::string> input_filenames;
+ std::list<std::string> output_filenames;
+ // Other optional parsed arguments
+ bool analyze_performance = false;
+ bool image_stats = false;
+ int* region = NULL;
+ int discard_level = -1;
+ int precincts_size = -1;
+ int blocks_size = -1;
+ int levels = 0;
+ bool reversible = false;
+
+ // Init whatever is necessary
+ ll_init_apr();
+ LLImage::initClass();
+ LogThread* fast_timer_log_thread = NULL; // For performance and metric gathering
+
+ // Analyze command line arguments
+ for (int arg = 1; arg < argc; ++arg)
+ {
+ if (!strcmp(argv[arg], "--help") || !strcmp(argv[arg], "-h"))
+ {
+ // Send the usage to standard out
+ std::cout << USAGE << std::endl;
+ return 0;
+ }
+ else if ((!strcmp(argv[arg], "--input") || !strcmp(argv[arg], "-i")) && arg < argc-1)
+ {
+ std::string file_name = argv[arg+1];
+ while (file_name[0] != '-') // if arg starts with '-', we consider it's not a file name but some other argument
+ {
+ // std::cout << "input file name : " << file_name << std::endl;
+ store_input_file(input_filenames, file_name);
+ arg += 1; // Skip that arg now we know it's a file name
+ if ((arg + 1) == argc) // Break out of the loop if we reach the end of the arg list
+ break;
+ file_name = argv[arg+1]; // Next argument and loop over
+ }
+ }
+ else if ((!strcmp(argv[arg], "--output") || !strcmp(argv[arg], "-o")) && arg < argc-1)
+ {
+ std::string file_name = argv[arg+1];
+ while (file_name[0] != '-') // if arg starts with '-', we consider it's not a file name but some other argument
+ {
+ // std::cout << "output file name : " << file_name << std::endl;
+ store_output_file(output_filenames, input_filenames, file_name);
+ arg += 1; // Skip that arg now we know it's a file name
+ if ((arg + 1) == argc) // Break out of the loop if we reach the end of the arg list
+ break;
+ file_name = argv[arg+1]; // Next argument and loop over
+ }
+ }
+ else if ((!strcmp(argv[arg], "--region") || !strcmp(argv[arg], "-r")) && arg < argc-1)
+ {
+ std::string value_str = argv[arg+1];
+ int index = 0;
+ region = new int[4];
+ while (value_str[0] != '-') // if arg starts with '-', it's the next option
+ {
+ int value = atoi(value_str.c_str());
+ region[index++] = value;
+ arg += 1; // Definitely skip that arg now we know it's a number
+ if ((arg + 1) == argc) // Break out of the loop if we reach the end of the arg list
+ break;
+ if (index == 4) // Break out of the loop if we captured 4 values already
+ break;
+ value_str = argv[arg+1]; // Next argument and loop over
+ }
+ if (index != 4)
+ {
+ std::cout << "--region arguments invalid" << std::endl;
+ delete [] region;
+ region = NULL;
+ }
+ }
+ else if (!strcmp(argv[arg], "--discard_level") || !strcmp(argv[arg], "-d"))
+ {
+ std::string value_str;
+ if ((arg + 1) < argc)
+ {
+ value_str = argv[arg+1];
+ }
+ if (((arg + 1) >= argc) || (value_str[0] == '-'))
+ {
+ std::cout << "No valid --discard_level argument given, discard_level ignored" << std::endl;
+ }
+ else
+ {
+ discard_level = atoi(value_str.c_str());
+ // Clamp to the values accepted by the viewer
+ discard_level = llclamp(discard_level,0,5);
+ }
+ }
+ else if (!strcmp(argv[arg], "--precincts") || !strcmp(argv[arg], "-p"))
+ {
+ std::string value_str;
+ if ((arg + 1) < argc)
+ {
+ value_str = argv[arg+1];
+ }
+ if (((arg + 1) >= argc) || (value_str[0] == '-'))
+ {
+ std::cout << "No valid --precincts argument given, precincts ignored" << std::endl;
+ }
+ else
+ {
+ precincts_size = atoi(value_str.c_str());
+ }
+ }
+ else if (!strcmp(argv[arg], "--blocks") || !strcmp(argv[arg], "-b"))
+ {
+ std::string value_str;
+ if ((arg + 1) < argc)
+ {
+ value_str = argv[arg+1];
+ }
+ if (((arg + 1) >= argc) || (value_str[0] == '-'))
+ {
+ std::cout << "No valid --blocks argument given, blocks ignored" << std::endl;
+ }
+ else
+ {
+ blocks_size = atoi(value_str.c_str());
+ }
+ }
+ else if (!strcmp(argv[arg], "--levels") || !strcmp(argv[arg], "-l"))
+ {
+ std::string value_str;
+ if ((arg + 1) < argc)
+ {
+ value_str = argv[arg+1];
+ }
+ if (((arg + 1) >= argc) || (value_str[0] == '-'))
+ {
+ std::cout << "No valid --levels argument given, default (5) will be used" << std::endl;
+ }
+ else
+ {
+ levels = atoi(value_str.c_str());
+ }
+ }
+ else if (!strcmp(argv[arg], "--reversible") || !strcmp(argv[arg], "-rev"))
+ {
+ reversible = true;
+ }
+ else if (!strcmp(argv[arg], "--logmetrics") || !strcmp(argv[arg], "-log"))
+ {
+ // '--logmetrics' needs to be specified with a named test metric argument
+ // Note: for the moment, only ImageCompressionTester has been tested
+ std::string test_name;
+ if ((arg + 1) < argc)
+ {
+ test_name = argv[arg+1];
+ }
+ if (((arg + 1) >= argc) || (test_name[0] == '-'))
+ {
+ // We don't have an argument left in the arg list or the next argument is another option
+ std::cout << "No --logmetrics argument given, no perf data will be gathered" << std::endl;
+ }
+ else
+ {
+ LLFastTimer::sMetricLog = TRUE;
+ LLFastTimer::sLogName = test_name;
+ arg += 1; // Skip that arg now we know it's a valid test name
+ if ((arg + 1) == argc) // Break out of the loop if we reach the end of the arg list
+ break;
+ }
+ }
+ else if (!strcmp(argv[arg], "--analyzeperformance") || !strcmp(argv[arg], "-a"))
+ {
+ analyze_performance = true;
+ }
+ else if (!strcmp(argv[arg], "--image-stats") || !strcmp(argv[arg], "-s"))
+ {
+ image_stats = true;
+ }
+ }
+
+ // Check arguments consistency. Exit with proper message if inconsistent.
+ if (input_filenames.size() == 0)
+ {
+ std::cout << "No input file, nothing to do -> exit" << std::endl;
+ return 0;
+ }
+ if (analyze_performance && !LLFastTimer::sMetricLog)
+ {
+ std::cout << "Cannot create perf report if no perf gathered (i.e. use argument -log <perf> with -a) -> exit" << std::endl;
+ return 0;
+ }
+
+
+ // Create the logging thread if required
+ if (LLFastTimer::sMetricLog)
+ {
+ LLFastTimer::sLogLock = new LLMutex(NULL);
+ fast_timer_log_thread = new LogThread(LLFastTimer::sLogName);
+ fast_timer_log_thread->start();
+ }
+
+ // Perform action on each input file
+ std::list<std::string>::iterator in_file = input_filenames.begin();
+ std::list<std::string>::iterator out_file = output_filenames.begin();
+ std::list<std::string>::iterator in_end = input_filenames.end();
+ std::list<std::string>::iterator out_end = output_filenames.end();
+ for (; in_file != in_end; ++in_file, ++out_file)
+ {
+ // Load file
+ LLPointer<LLImageRaw> raw_image = load_image(*in_file, discard_level, region, image_stats);
+ if (!raw_image)
+ {
+ std::cout << "Error: Image " << *in_file << " could not be loaded" << std::endl;
+ continue;
+ }
+
+ // Save file
+ if (out_file != out_end)
+ {
+ if (!save_image(*out_file, raw_image, blocks_size, precincts_size, levels, reversible, image_stats))
+ {
+ std::cout << "Error: Image " << *out_file << " could not be saved" << std::endl;
+ }
+ else
+ {
+ std::cout << *in_file << " -> " << *out_file << std::endl;
+ }
+ }
+ }
+
+ // Output perf data if requested by user
+ if (analyze_performance)
+ {
+ std::string baseline_name = LLFastTimer::sLogName + "_baseline.slp";
+ std::string current_name = LLFastTimer::sLogName + ".slp";
+ std::string report_name = LLFastTimer::sLogName + "_report.csv";
+
+ std::cout << "Analyzing performance, check report in : " << report_name << std::endl;
+
+ LLMetricPerformanceTesterBasic::doAnalysisMetrics(baseline_name, current_name, report_name);
+ }
+
+ // Stop the perf gathering system if needed
+ if (LLFastTimer::sMetricLog)
+ {
+ LLMetricPerformanceTesterBasic::deleteTester(LLFastTimer::sLogName);
+ sAllDone = true;
+ }
+
+ // Cleanup and exit
+ LLImage::cleanupClass();
+ if (fast_timer_log_thread)
+ {
+ fast_timer_log_thread->shutdown();
+ }
+
+ return 0;
+}
diff --git a/indra/integration_tests/llimage_libtest/llimage_libtest.h b/indra/integration_tests/llimage_libtest/llimage_libtest.h
new file mode 100644
index 0000000000..63f3d46b50
--- /dev/null
+++ b/indra/integration_tests/llimage_libtest/llimage_libtest.h
@@ -0,0 +1,29 @@
+/**
+ * @file llimage_libtest.h
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+#ifndef LLIMAGE_LIBTEST_H
+#define LLIMAGE_LIBTEST_H
+
+
+#endif
diff --git a/indra/integration_tests/llui_libtest/CMakeLists.txt b/indra/integration_tests/llui_libtest/CMakeLists.txt
index 452d37d3be..1180460f4b 100644
--- a/indra/integration_tests/llui_libtest/CMakeLists.txt
+++ b/indra/integration_tests/llui_libtest/CMakeLists.txt
@@ -10,6 +10,7 @@ include(00-Common)
include(LLCommon)
include(LLImage)
include(LLImageJ2COJ) # ugh, needed for images
+include(LLKDU)
include(LLMath)
include(LLMessage)
include(LLRender)
@@ -70,7 +71,13 @@ endif (DARWIN)
# Sort by high-level to low-level
target_link_libraries(llui_libtest
llui
+ llinventory
llmessage
+ ${LLRENDER_LIBRARIES}
+ ${LLIMAGE_LIBRARIES}
+ ${LLKDU_LIBRARIES}
+ ${KDU_LIBRARY}
+ ${LLIMAGEJ2COJ_LIBRARIES}
${OS_LIBRARIES}
${GOOGLE_PERFTOOLS_LIBRARIES}
)
@@ -85,14 +92,14 @@ if (WINDOWS)
# Copy over OpenJPEG.dll
# *NOTE: On Windows with VS2005, only the first comment prints
set(OPENJPEG_RELEASE
- "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/release/openjpeg.dll")
+ "${ARCH_PREBUILT_DIRS_RELEASE}/openjpeg.dll")
add_custom_command( TARGET llui_libtest POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
${OPENJPEG_RELEASE} ${CMAKE_CURRENT_BINARY_DIR}
COMMENT "Copying OpenJPEG DLLs to binary directory"
)
set(OPENJPEG_DEBUG
- "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/debug/openjpegd.dll")
+ "${ARCH_PREBUILT_DIRS_DEBUG}/openjpegd.dll")
add_custom_command( TARGET llui_libtest POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
${OPENJPEG_DEBUG} ${CMAKE_CURRENT_BINARY_DIR}
diff --git a/indra/integration_tests/llui_libtest/llui_libtest.cpp b/indra/integration_tests/llui_libtest/llui_libtest.cpp
index c34115ee80..217e26c3ca 100644
--- a/indra/integration_tests/llui_libtest/llui_libtest.cpp
+++ b/indra/integration_tests/llui_libtest/llui_libtest.cpp
@@ -33,6 +33,7 @@
// linden library includes
#include "llcontrol.h" // LLControlGroup
#include "lldir.h"
+#include "lldiriterator.h"
#include "llerrorcontrol.h"
#include "llfloater.h"
#include "llfontfreetype.h"
@@ -174,7 +175,9 @@ void export_test_floaters()
std::string delim = gDirUtilp->getDirDelimiter();
std::string xui_dir = get_xui_dir() + "en" + delim;
std::string filename;
- while (gDirUtilp->getNextFileInDir(xui_dir, "floater_test_*.xml", filename))
+
+ LLDirIterator iter(xui_dir, "floater_test_*.xml");
+ while (iter.next(filename))
{
if (filename.find("_new.xml") != std::string::npos)
{
diff --git a/indra/integration_tests/llui_libtest/llwidgetreg.cpp b/indra/integration_tests/llui_libtest/llwidgetreg.cpp
index 0d0d9fbff6..cbf6021119 100644
--- a/indra/integration_tests/llui_libtest/llwidgetreg.cpp
+++ b/indra/integration_tests/llui_libtest/llwidgetreg.cpp
@@ -49,6 +49,7 @@
#include "lltabcontainer.h"
#include "lltextbox.h"
#include "lltexteditor.h"
+#include "lltimectrl.h"
#include "llflyoutbutton.h"
#include "llfiltereditor.h"
#include "lllayoutstack.h"
@@ -92,6 +93,7 @@ void LLWidgetReg::initClass(bool register_widgets)
//LLDefaultChildRegistry::Register<LLPlaceHolderPanel> placeholder("placeholder");
LLDefaultChildRegistry::Register<LLTabContainer> tab_container("tab_container");
LLDefaultChildRegistry::Register<LLTextBox> text("text");
+ LLDefaultChildRegistry::Register<LLTimeCtrl> time("time");
LLDefaultChildRegistry::Register<LLTextEditor> simple_text_editor("simple_text_editor");
LLDefaultChildRegistry::Register<LLUICtrl> ui_ctrl("ui_ctrl");
LLDefaultChildRegistry::Register<LLStatView> stat_view("stat_view");
diff --git a/indra/lib/python/indra/base/cllsd_test.py b/indra/lib/python/indra/base/cllsd_test.py
index 0b20d99d80..1f06898ffd 100644
--- a/indra/lib/python/indra/base/cllsd_test.py
+++ b/indra/lib/python/indra/base/cllsd_test.py
@@ -1,3 +1,25 @@
+#!/usr/bin/python
+##
+## $LicenseInfo:firstyear=2011&license=viewerlgpl$
+## Second Life Viewer Source Code
+## Copyright (C) 2011, Linden Research, Inc.
+##
+## This library is free software; you can redistribute it and/or
+## modify it under the terms of the GNU Lesser General Public
+## License as published by the Free Software Foundation;
+## version 2.1 of the License only.
+##
+## This library is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+## Lesser General Public License for more details.
+##
+## You should have received a copy of the GNU Lesser General Public
+## License along with this library; if not, write to the Free Software
+## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+##
+## Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+## $/LicenseInfo$
from indra.base import llsd, lluuid
from datetime import datetime
import cllsd
diff --git a/indra/lib/python/indra/base/lluuid.py b/indra/lib/python/indra/base/lluuid.py
index 1cdd8e915b..369ae4e92f 100644
--- a/indra/lib/python/indra/base/lluuid.py
+++ b/indra/lib/python/indra/base/lluuid.py
@@ -163,7 +163,7 @@ class UUID(object):
def setFromMemoryDump(self, gdb_string):
"""
We expect to get gdb_string as four hex units. eg:
- 0x147d54db 0xc34b3f1b 0x714f989b 0x0a892fd2
+ 0x147d54db 0xc34b3f1b 0x714f989b 0x0a892fd2
Which will be translated to:
db547d14-1b3f4bc3-9b984f71-d22f890a
Returns self.
@@ -187,7 +187,7 @@ class UUID(object):
def getAsString(self):
"""
Return a different string representation of the form
- AAAAAAAA-AAAABBBB-BBBBBBBB-BBCCCCCC (a 128-bit number in hex)
+ AAAAAAAA-AAAABBBB-BBBBBBBB-BBCCCCCC (a 128-bit number in hex)
where A=network address, B=timestamp, C=random.
"""
i1 = _binstr2int(self._bits[0:4])
@@ -233,7 +233,7 @@ NULL = UUID()
def printTranslatedMemory(four_hex_uints):
"""
We expect to get the string as four hex units. eg:
- 0x147d54db 0xc34b3f1b 0x714f989b 0x0a892fd2
+ 0x147d54db 0xc34b3f1b 0x714f989b 0x0a892fd2
Which will be translated to:
db547d14-1b3f4bc3-9b984f71-d22f890a
"""
diff --git a/indra/lib/python/indra/ipc/httputil.py b/indra/lib/python/indra/ipc/httputil.py
index c4ac0a379d..d53f34a771 100644
--- a/indra/lib/python/indra/ipc/httputil.py
+++ b/indra/lib/python/indra/ipc/httputil.py
@@ -1,3 +1,24 @@
+#!/usr/bin/python
+## $LicenseInfo:firstyear=2011&license=viewerlgpl$
+## Second Life Viewer Source Code
+## Copyright (C) 2011, Linden Research, Inc.
+##
+## This library is free software; you can redistribute it and/or
+## modify it under the terms of the GNU Lesser General Public
+## License as published by the Free Software Foundation;
+## version 2.1 of the License only.
+##
+## This library is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+## Lesser General Public License for more details.
+##
+## You should have received a copy of the GNU Lesser General Public
+## License along with this library; if not, write to the Free Software
+## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+##
+## Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+## $/LicenseInfo$
import warnings
diff --git a/indra/lib/python/indra/ipc/russ.py b/indra/lib/python/indra/ipc/russ.py
index 35d8afb158..ac780f128b 100644
--- a/indra/lib/python/indra/ipc/russ.py
+++ b/indra/lib/python/indra/ipc/russ.py
@@ -110,7 +110,7 @@ def format(format_str, context):
def _find_sub_matches(format_str):
"""@brief Find all of the substitution matches.
-@param format_str the RUSS conformant format string.
+@param format_str the RUSS conformant format string.
@return Returns an array of depths of arrays of positional matches in input.
"""
depth = 0
diff --git a/indra/lib/python/indra/ipc/siesta_test.py b/indra/lib/python/indra/ipc/siesta_test.py
index 177ea710d1..a35eed2460 100644
--- a/indra/lib/python/indra/ipc/siesta_test.py
+++ b/indra/lib/python/indra/ipc/siesta_test.py
@@ -1,3 +1,24 @@
+#!/usr/bin/python
+## $LicenseInfo:firstyear=2011&license=viewerlgpl$
+## Second Life Viewer Source Code
+## Copyright (C) 2011, Linden Research, Inc.
+##
+## This library is free software; you can redistribute it and/or
+## modify it under the terms of the GNU Lesser General Public
+## License as published by the Free Software Foundation;
+## version 2.1 of the License only.
+##
+## This library is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+## Lesser General Public License for more details.
+##
+## You should have received a copy of the GNU Lesser General Public
+## License along with this library; if not, write to the Free Software
+## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+##
+## Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+## $/LicenseInfo$
from indra.base import llsd, lluuid
from indra.ipc import siesta
import datetime, math, unittest
diff --git a/indra/lib/python/indra/util/llperformance.py b/indra/lib/python/indra/util/llperformance.py
index 7c52730b5e..57dd64de3f 100755
--- a/indra/lib/python/indra/util/llperformance.py
+++ b/indra/lib/python/indra/util/llperformance.py
@@ -1,4 +1,28 @@
-#!/usr/bin/python
+#!/usr/bin/env python
+"""\
+@file llperformance.py
+
+$LicenseInfo:firstyear=2010&license=viewerlgpl$
+Second Life Viewer Source Code
+Copyright (C) 2010-2011, Linden Research, Inc.
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation;
+version 2.1 of the License only.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+$/LicenseInfo$
+"""
# ------------------------------------------------
# Sim metrics utility functions.
diff --git a/indra/lib/python/indra/util/llversion.py b/indra/lib/python/indra/util/llversion.py
index 2718a85f41..ba6f567b60 100644
--- a/indra/lib/python/indra/util/llversion.py
+++ b/indra/lib/python/indra/util/llversion.py
@@ -1,7 +1,9 @@
-"""@file llversion.py
-@brief Utility for parsing llcommon/llversion${server}.h
- for the version string and channel string
- Utility that parses hg or svn info for branch and revision
+#!/usr/bin/env python
+"""\
+@file llversion.py
+@brief Parses llcommon/llversionserver.h and llcommon/llversionviewer.h
+ for the version string and channel string.
+ Parses hg info for branch and revision.
$LicenseInfo:firstyear=2006&license=mit$
@@ -27,7 +29,7 @@ THE SOFTWARE.
$/LicenseInfo$
"""
-import re, sys, os, commands
+import re, sys, os, subprocess
# Methods for gathering version information from
# llversionviewer.h and llversionserver.h
@@ -73,29 +75,13 @@ def get_viewer_channel():
def get_server_channel():
return get_channel('server')
-# Methods for gathering subversion information
-def get_svn_status_matching(regular_expression):
- # Get the subversion info from the working source tree
- status, output = commands.getstatusoutput('svn info %s' % get_src_root())
- m = regular_expression.search(output)
- if not m:
- print >> sys.stderr, "Failed to parse svn info output, result follows:"
- print >> sys.stderr, output
- raise Exception, "No matching svn status in "+src_root
- return m.group(1)
-
-def get_svn_branch():
- branch_re = re.compile('URL: (\S+)')
- return get_svn_status_matching(branch_re)
-
-def get_svn_revision():
- last_rev_re = re.compile('Last Changed Rev: (\d+)')
- return get_svn_status_matching(last_rev_re)
-
+# Methods for gathering hg information
def get_hg_repo():
- status, output = commands.getstatusoutput('hg showconfig paths.default')
+ child = subprocess.Popen(["hg","showconfig","paths.default"], stdout=subprocess.PIPE)
+ output, error = child.communicate()
+ status = child.returncode
if status:
- print >> sys.stderr, output
+ print >> sys.stderr, error
sys.exit(1)
if not output:
print >> sys.stderr, 'ERROR: cannot find repo we cloned from'
@@ -103,24 +89,19 @@ def get_hg_repo():
return output
def get_hg_changeset():
- # The right thing to do:
- # status, output = commands.getstatusoutput('hg id -i')
- # if status:
- # print >> sys.stderr, output
- # sys.exit(1)
-
- # The temporary hack:
- status, output = commands.getstatusoutput('hg parents --template "{rev}"')
+ # The right thing to do would be to use the *global* revision id:
+ # "hg id -i"
+ # For the moment though, we use the parent revision:
+ child = subprocess.Popen(["hg","parents","--template","{rev}"], stdout=subprocess.PIPE)
+ output, error = child.communicate()
+ status = child.returncode
if status:
- print >> sys.stderr, output
+ print >> sys.stderr, error
sys.exit(1)
lines = output.splitlines()
if len(lines) > 1:
print >> sys.stderr, 'ERROR: working directory has %d parents' % len(lines)
return lines[0]
-def using_svn():
- return os.path.isdir(os.path.join(get_src_root(), '.svn'))
-
def using_hg():
return os.path.isdir(os.path.join(get_src_root(), '.hg'))
diff --git a/indra/lib/python/indra/util/simperf_proc_interface.py b/indra/lib/python/indra/util/simperf_proc_interface.py
index da6304a274..de061f68cc 100755
--- a/indra/lib/python/indra/util/simperf_proc_interface.py
+++ b/indra/lib/python/indra/util/simperf_proc_interface.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/env python
"""\
@file simperf_proc_interface.py
@brief Utility to extract log messages from *.<pid>.llsd files containing performance statistics.
diff --git a/indra/lib/python/indra/util/test_win32_manifest.py b/indra/lib/python/indra/util/test_win32_manifest.py
index 786521c068..0532cb0065 100644
--- a/indra/lib/python/indra/util/test_win32_manifest.py
+++ b/indra/lib/python/indra/util/test_win32_manifest.py
@@ -1,28 +1,29 @@
#!/usr/bin/env python
-# @file test_win32_manifest.py
-# @brief Test an assembly binding version and uniqueness in a windows dll or exe.
-#
-# $LicenseInfo:firstyear=2009&license=viewerlgpl$
-# Second Life Viewer Source Code
-# Copyright (C) 2010, Linden Research, Inc.
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation;
-# version 2.1 of the License only.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-#
-# Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
-# $/LicenseInfo$
-
+"""\
+@file test_win32_manifest.py
+@brief Test an assembly binding version and uniqueness in a windows dll or exe.
+
+$LicenseInfo:firstyear=2009&license=viewerlgpl$
+Second Life Viewer Source Code
+Copyright (C) 2009-2011, Linden Research, Inc.
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation;
+version 2.1 of the License only.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+$/LicenseInfo$
+"""
import sys, os
import tempfile
from xml.dom.minidom import parse
@@ -52,20 +53,22 @@ def get_HKLM_registry_value(key_str, value_str):
def find_vc_dir():
supported_versions = (r'8.0', r'9.0')
+ supported_products = (r'VisualStudio', r'VCExpress')
value_str = (r'ProductDir')
- for version in supported_versions:
- key_str = (r'SOFTWARE\Microsoft\VisualStudio\%s\Setup\VC' %
- version)
- try:
- return get_HKLM_registry_value(key_str, value_str)
- except WindowsError, err:
- x64_key_str = (r'SOFTWARE\Wow6432Node\Microsoft\VisualStudio\%s\Setup\VS' %
- version)
+ for product in supported_products:
+ for version in supported_versions:
+ key_str = (r'SOFTWARE\Microsoft\%s\%s\Setup\VC' %
+ (product, version))
try:
- return get_HKLM_registry_value(x64_key_str, value_str)
- except:
- print >> sys.stderr, "Didn't find MS VC version %s " % version
+ return get_HKLM_registry_value(key_str, value_str)
+ except WindowsError, err:
+ x64_key_str = (r'SOFTWARE\Wow6432Node\Microsoft\VisualStudio\%s\Setup\VS' %
+ version)
+ try:
+ return get_HKLM_registry_value(x64_key_str, value_str)
+ except:
+ print >> sys.stderr, "Didn't find MS %s version %s " % (product,version)
raise
diff --git a/indra/lib/python/uuid.py b/indra/lib/python/uuid.py
index 0bc21a35f8..e956383cca 100644
--- a/indra/lib/python/uuid.py
+++ b/indra/lib/python/uuid.py
@@ -1,3 +1,24 @@
+#!/usr/bin/python
+## $LicenseInfo:firstyear=2011&license=viewerlgpl$
+## Second Life Viewer Source Code
+## Copyright (C) 2011, Linden Research, Inc.
+##
+## This library is free software; you can redistribute it and/or
+## modify it under the terms of the GNU Lesser General Public
+## License as published by the Free Software Foundation;
+## version 2.1 of the License only.
+##
+## This library is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+## Lesser General Public License for more details.
+##
+## You should have received a copy of the GNU Lesser General Public
+## License along with this library; if not, write to the Free Software
+## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+##
+## Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+## $/LicenseInfo$
r"""UUID objects (universally unique identifiers) according to RFC 4122.
This module provides immutable UUID objects (class UUID) and the functions
diff --git a/indra/linux_crash_logger/CMakeLists.txt b/indra/linux_crash_logger/CMakeLists.txt
index ab62a0d0af..98ebdc7487 100644
--- a/indra/linux_crash_logger/CMakeLists.txt
+++ b/indra/linux_crash_logger/CMakeLists.txt
@@ -3,6 +3,7 @@
project(linux_crash_logger)
include(00-Common)
+include(GLH)
include(LLCommon)
include(LLCrashLogger)
include(LLMath)
diff --git a/indra/linux_crash_logger/linux_crash_logger.cpp b/indra/linux_crash_logger/linux_crash_logger.cpp
index 8beae555fb..99d0ad7e14 100644
--- a/indra/linux_crash_logger/linux_crash_logger.cpp
+++ b/indra/linux_crash_logger/linux_crash_logger.cpp
@@ -24,16 +24,24 @@
* $/LicenseInfo$
*/
+#include "linden_common.h"
#include "llcrashloggerlinux.h"
int main(int argc, char **argv)
{
+ llinfos << "Starting crash reporter." << llendl;
+
LLCrashLoggerLinux app;
app.parseCommandOptions(argc, argv);
- app.init();
+
+ if (! app.init())
+ {
+ llwarns << "Unable to initialize application." << llendl;
+ return 1;
+ }
+
app.mainLoop();
app.cleanup();
+ llinfos << "Crash reporter finished normally." << llendl;
return 0;
}
-
-
diff --git a/indra/linux_crash_logger/llcrashloggerlinux.cpp b/indra/linux_crash_logger/llcrashloggerlinux.cpp
index 7449c6426f..62465f9937 100644
--- a/indra/linux_crash_logger/llcrashloggerlinux.cpp
+++ b/indra/linux_crash_logger/llcrashloggerlinux.cpp
@@ -30,8 +30,6 @@
#include "linden_common.h"
-#include "boost/tokenizer.hpp"
-
#include "indra_constants.h" // CRASH_BEHAVIOR_ASK, CRASH_SETTING_NAME
#include "llerror.h"
#include "llfile.h"
@@ -135,6 +133,12 @@ bool LLCrashLoggerLinux::mainLoop()
return true;
}
+bool LLCrashLoggerLinux::cleanup()
+{
+ commonCleanup();
+ return true;
+}
+
void LLCrashLoggerLinux::updateApplication(const std::string& message)
{
LLCrashLogger::updateApplication(message);
diff --git a/indra/linux_crash_logger/llcrashloggerlinux.h b/indra/linux_crash_logger/llcrashloggerlinux.h
index 65d5e4e653..dae6c46651 100644
--- a/indra/linux_crash_logger/llcrashloggerlinux.h
+++ b/indra/linux_crash_logger/llcrashloggerlinux.h
@@ -39,6 +39,7 @@ public:
virtual bool mainLoop();
virtual void updateApplication(const std::string& = LLStringUtil::null);
virtual void gatherPlatformSpecificFiles();
+ virtual bool cleanup();
};
#endif
diff --git a/indra/linux_updater/linux_updater.cpp b/indra/linux_updater/linux_updater.cpp
index d909516bf8..eed00ac06e 100644
--- a/indra/linux_updater/linux_updater.cpp
+++ b/indra/linux_updater/linux_updater.cpp
@@ -33,6 +33,7 @@
#include "llerrorcontrol.h"
#include "llfile.h"
#include "lldir.h"
+#include "lldiriterator.h"
#include "llxmlnode.h"
#include "lltrans.h"
@@ -55,6 +56,8 @@ typedef struct _updater_app_state {
std::string strings_dirs;
std::string strings_file;
+ LLDirIterator *image_dir_iter;
+
GtkWidget *window;
GtkWidget *progress_bar;
GtkWidget *image;
@@ -88,9 +91,16 @@ bool translate_init(std::string comma_delim_path_list,
std::vector<std::string> paths;
LLStringUtil::getTokens(comma_delim_path_list, paths, ","); // split over ','
+ for(std::vector<std::string>::iterator it = paths.begin(), end_it = paths.end();
+ it != end_it;
+ ++it)
+ {
+ (*it) = gDirUtilp->findSkinnedFilename(*it, base_xml_name);
+ }
+
// suck the translation xml files into memory
LLXMLNodePtr root;
- bool success = LLXMLNode::getLayeredXMLNode(base_xml_name, root, paths);
+ bool success = LLXMLNode::getLayeredXMLNode(root, paths);
if (!success)
{
// couldn't load string table XML
@@ -108,7 +118,7 @@ bool translate_init(std::string comma_delim_path_list,
void updater_app_ui_init(void);
void updater_app_quit(UpdaterAppState *app_state);
void parse_args_and_init(int argc, char **argv, UpdaterAppState *app_state);
-std::string next_image_filename(std::string& image_path);
+std::string next_image_filename(std::string& image_path, LLDirIterator& iter);
void display_error(GtkWidget *parent, std::string title, std::string message);
BOOL install_package(std::string package_file, std::string destination);
BOOL spawn_viewer(UpdaterAppState *app_state);
@@ -174,7 +184,7 @@ void updater_app_ui_init(UpdaterAppState *app_state)
// load the first image
app_state->image = gtk_image_new_from_file
- (next_image_filename(app_state->image_dir).c_str());
+ (next_image_filename(app_state->image_dir, *app_state->image_dir_iter).c_str());
gtk_widget_set_size_request(app_state->image, 340, 310);
gtk_container_add(GTK_CONTAINER(frame), app_state->image);
@@ -205,7 +215,7 @@ gboolean rotate_image_cb(gpointer data)
llassert(data != NULL);
app_state = (UpdaterAppState *) data;
- filename = next_image_filename(app_state->image_dir);
+ filename = next_image_filename(app_state->image_dir, *app_state->image_dir_iter);
gdk_threads_enter();
gtk_image_set_from_file(GTK_IMAGE(app_state->image), filename.c_str());
@@ -214,10 +224,10 @@ gboolean rotate_image_cb(gpointer data)
return TRUE;
}
-std::string next_image_filename(std::string& image_path)
+std::string next_image_filename(std::string& image_path, LLDirIterator& iter)
{
std::string image_filename;
- gDirUtilp->getNextFileInDir(image_path, "/*.jpg", image_filename);
+ iter.next(image_filename);
return image_path + "/" + image_filename;
}
@@ -741,6 +751,7 @@ void parse_args_and_init(int argc, char **argv, UpdaterAppState *app_state)
else if ((!strcmp(argv[i], "--image-dir")) && (++i < argc))
{
app_state->image_dir = argv[i];
+ app_state->image_dir_iter = new LLDirIterator(argv[i], "/*.jpg");
}
else if ((!strcmp(argv[i], "--dest")) && (++i < argc))
{
@@ -825,6 +836,7 @@ int main(int argc, char **argv)
}
bool success = !app_state->failure;
+ delete app_state->image_dir_iter;
delete app_state;
return success ? 0 : 1;
}
diff --git a/indra/llaudio/CMakeLists.txt b/indra/llaudio/CMakeLists.txt
index 21ec622819..632e5d46e3 100644
--- a/indra/llaudio/CMakeLists.txt
+++ b/indra/llaudio/CMakeLists.txt
@@ -24,6 +24,7 @@ include_directories(
${VORBIS_INCLUDE_DIRS}
${OPENAL_LIB_INCLUDE_DIRS}
${FREEAULT_LIB_INCLUDE_DIRS}
+ ${FMOD_INCLUDE_DIR}
)
set(llaudio_SOURCE_FILES
diff --git a/indra/llaudio/llaudiodecodemgr.cpp b/indra/llaudio/llaudiodecodemgr.cpp
index 01dfd03c18..7f747c2eca 100644
--- a/indra/llaudio/llaudiodecodemgr.cpp
+++ b/indra/llaudio/llaudiodecodemgr.cpp
@@ -215,7 +215,7 @@ BOOL LLVorbisDecodeState::initDecode()
return(FALSE);
}
- S32 sample_count = ov_pcm_total(&mVF, -1);
+ S32 sample_count = (S32)ov_pcm_total(&mVF, -1);
size_t size_guess = (size_t)sample_count;
vorbis_info* vi = ov_info(&mVF, -1);
size_guess *= (vi? vi->channels : 1);
@@ -680,4 +680,10 @@ BOOL LLAudioDecodeMgr::addDecodeRequest(const LLUUID &uuid)
return FALSE;
}
-
+#if LL_DARWIN || LL_LINUX
+// HACK: to fool the compiler into not emitting unused warnings.
+namespace {
+ const ov_callbacks callback_array[4] = {OV_CALLBACKS_DEFAULT, OV_CALLBACKS_NOCLOSE, OV_CALLBACKS_STREAMONLY,
+ OV_CALLBACKS_STREAMONLY_NOCLOSE};
+}
+#endif
diff --git a/indra/llaudio/llaudioengine.cpp b/indra/llaudio/llaudioengine.cpp
index c9cb1cd6e7..5fa28cb902 100644
--- a/indra/llaudio/llaudioengine.cpp
+++ b/indra/llaudio/llaudioengine.cpp
@@ -97,7 +97,11 @@ void LLAudioEngine::setDefaults()
}
mMasterGain = 1.f;
- mInternalGain = 0.f;
+ // Setting mInternalGain to an out of range value fixes the issue reported in STORM-830.
+ // There is an edge case in setMasterGain during startup which prevents setInternalGain from
+ // being called if the master volume setting and mInternalGain both equal 0, so using -1 forces
+ // the if statement in setMasterGain to execute when the viewer starts up.
+ mInternalGain = -1.f;
mNextWindUpdate = 0.f;
mStreamingAudioImpl = NULL;
@@ -1260,6 +1264,7 @@ LLAudioSource::LLAudioSource(const LLUUID& id, const LLUUID& owner_id, const F32
mSyncSlave(false),
mQueueSounds(false),
mPlayedOnce(false),
+ mCorrupted(false),
mType(type),
mChannelp(NULL),
mCurrentDatap(NULL),
@@ -1292,16 +1297,25 @@ void LLAudioSource::setChannel(LLAudioChannel *channelp)
void LLAudioSource::update()
{
+ if(mCorrupted)
+ {
+ return ; //no need to update
+ }
+
if (!getCurrentBuffer())
{
if (getCurrentData())
{
// Hack - try and load the sound. Will do this as a callback
// on decode later.
- if (getCurrentData()->load())
+ if (getCurrentData()->load() && getCurrentData()->getBuffer())
{
play(getCurrentData()->getID());
- }
+ }
+ else
+ {
+ mCorrupted = true ;
+ }
}
}
}
@@ -1417,6 +1431,11 @@ bool LLAudioSource::play(const LLUUID &audio_uuid)
bool LLAudioSource::isDone() const
{
+ if(mCorrupted)
+ {
+ return true ;
+ }
+
const F32 MAX_AGE = 60.f;
const F32 MAX_UNPLAYED_AGE = 15.f;
const F32 MAX_MUTED_AGE = 11.f;
@@ -1732,7 +1751,7 @@ LLAudioData::LLAudioData(const LLUUID &uuid) :
}
}
-
+//return false when the audio file is corrupted.
bool LLAudioData::load()
{
// For now, just assume we're going to use one buffer per audiodata.
@@ -1748,7 +1767,7 @@ bool LLAudioData::load()
{
// No free buffers, abort.
llinfos << "Not able to allocate a new audio buffer, aborting." << llendl;
- return false;
+ return true;
}
std::string uuid_str;
diff --git a/indra/llaudio/llaudioengine.h b/indra/llaudio/llaudioengine.h
index 30d2490635..28b69e1973 100644
--- a/indra/llaudio/llaudioengine.h
+++ b/indra/llaudio/llaudioengine.h
@@ -37,6 +37,7 @@
#include "lluuid.h"
#include "llframetimer.h"
#include "llassettype.h"
+#include "llextendedstatus.h"
#include "lllistener.h"
@@ -334,6 +335,7 @@ protected:
bool mSyncSlave;
bool mQueueSounds;
bool mPlayedOnce;
+ bool mCorrupted;
S32 mType;
LLVector3d mPositionGlobal;
LLVector3 mVelocity;
diff --git a/indra/llaudio/llaudioengine_openal.cpp b/indra/llaudio/llaudioengine_openal.cpp
index e352045291..34a057dcc0 100644
--- a/indra/llaudio/llaudioengine_openal.cpp
+++ b/indra/llaudio/llaudioengine_openal.cpp
@@ -32,6 +32,8 @@
#include "lllistener_openal.h"
+const float LLAudioEngine_OpenAL::WIND_BUFFER_SIZE_SEC = 0.05f;
+
LLAudioEngine_OpenAL::LLAudioEngine_OpenAL()
:
mWindGen(NULL),
diff --git a/indra/llaudio/llaudioengine_openal.h b/indra/llaudio/llaudioengine_openal.h
index 258febb1a8..6639d9dfe6 100644
--- a/indra/llaudio/llaudioengine_openal.h
+++ b/indra/llaudio/llaudioengine_openal.h
@@ -67,7 +67,7 @@ class LLAudioEngine_OpenAL : public LLAudioEngine
int mNumEmptyWindALBuffers;
static const int MAX_NUM_WIND_BUFFERS = 80;
- static const float WIND_BUFFER_SIZE_SEC = 0.05f; // 1/20th sec
+ static const float WIND_BUFFER_SIZE_SEC; // 1/20th sec
};
class LLAudioChannelOpenAL : public LLAudioChannel
diff --git a/indra/llcharacter/CMakeLists.txt b/indra/llcharacter/CMakeLists.txt
index 14841b5d3d..a1712699eb 100644
--- a/indra/llcharacter/CMakeLists.txt
+++ b/indra/llcharacter/CMakeLists.txt
@@ -77,12 +77,13 @@ list(APPEND llcharacter_SOURCE_FILES ${llcharacter_HEADER_FILES})
add_library (llcharacter ${llcharacter_SOURCE_FILES})
-if(LL_TESTS)
- # Add tests
- include(LLAddBuildTest)
- # UNIT TESTS
- SET(llcharacter_TEST_SOURCE_FILES
+# Add tests
+if (LL_TESTS)
+ include(LLAddBuildTest)
+ # UNIT TESTS
+ SET(llcharacter_TEST_SOURCE_FILES
lljoint.cpp
)
- LL_ADD_PROJECT_UNIT_TESTS(llcharacter "${llcharacter_TEST_SOURCE_FILES}")
-endif(LL_TESTS)
+ LL_ADD_PROJECT_UNIT_TESTS(llcharacter "${llcharacter_TEST_SOURCE_FILES}")
+endif (LL_TESTS)
+
diff --git a/indra/llcharacter/llanimationstates.cpp b/indra/llcharacter/llanimationstates.cpp
index a30113a478..155226cf17 100644
--- a/indra/llcharacter/llanimationstates.cpp
+++ b/indra/llcharacter/llanimationstates.cpp
@@ -33,145 +33,145 @@
#include "llanimationstates.h"
#include "llstring.h"
-const LLUUID ANIM_AGENT_AFRAID = LLUUID("6b61c8e8-4747-0d75-12d7-e49ff207a4ca");
-const LLUUID ANIM_AGENT_AIM_BAZOOKA_R = LLUUID("b5b4a67d-0aee-30d2-72cd-77b333e932ef");
-const LLUUID ANIM_AGENT_AIM_BOW_L = LLUUID("46bb4359-de38-4ed8-6a22-f1f52fe8f506");
-const LLUUID ANIM_AGENT_AIM_HANDGUN_R = LLUUID("3147d815-6338-b932-f011-16b56d9ac18b");
-const LLUUID ANIM_AGENT_AIM_RIFLE_R = LLUUID("ea633413-8006-180a-c3ba-96dd1d756720");
-const LLUUID ANIM_AGENT_ANGRY = LLUUID("5747a48e-073e-c331-f6f3-7c2149613d3e");
-const LLUUID ANIM_AGENT_AWAY = LLUUID("fd037134-85d4-f241-72c6-4f42164fedee");
-const LLUUID ANIM_AGENT_BACKFLIP = LLUUID("c4ca6188-9127-4f31-0158-23c4e2f93304");
-const LLUUID ANIM_AGENT_BELLY_LAUGH = LLUUID("18b3a4b5-b463-bd48-e4b6-71eaac76c515");
-const LLUUID ANIM_AGENT_BLOW_KISS = LLUUID("db84829b-462c-ee83-1e27-9bbee66bd624");
-const LLUUID ANIM_AGENT_BORED = LLUUID("b906c4ba-703b-1940-32a3-0c7f7d791510");
-const LLUUID ANIM_AGENT_BOW = LLUUID("82e99230-c906-1403-4d9c-3889dd98daba");
-const LLUUID ANIM_AGENT_BRUSH = LLUUID("349a3801-54f9-bf2c-3bd0-1ac89772af01");
-const LLUUID ANIM_AGENT_BUSY = LLUUID("efcf670c-2d18-8128-973a-034ebc806b67");
-const LLUUID ANIM_AGENT_CLAP = LLUUID("9b0c1c4e-8ac7-7969-1494-28c874c4f668");
-const LLUUID ANIM_AGENT_COURTBOW = LLUUID("9ba1c942-08be-e43a-fb29-16ad440efc50");
-const LLUUID ANIM_AGENT_CROUCH = LLUUID("201f3fdf-cb1f-dbec-201f-7333e328ae7c");
-const LLUUID ANIM_AGENT_CROUCHWALK = LLUUID("47f5f6fb-22e5-ae44-f871-73aaaf4a6022");
-const LLUUID ANIM_AGENT_CRY = LLUUID("92624d3e-1068-f1aa-a5ec-8244585193ed");
-const LLUUID ANIM_AGENT_CUSTOMIZE = LLUUID("038fcec9-5ebd-8a8e-0e2e-6e71a0a1ac53");
-const LLUUID ANIM_AGENT_CUSTOMIZE_DONE = LLUUID("6883a61a-b27b-5914-a61e-dda118a9ee2c");
-const LLUUID ANIM_AGENT_DANCE1 = LLUUID("b68a3d7c-de9e-fc87-eec8-543d787e5b0d");
-const LLUUID ANIM_AGENT_DANCE2 = LLUUID("928cae18-e31d-76fd-9cc9-2f55160ff818");
-const LLUUID ANIM_AGENT_DANCE3 = LLUUID("30047778-10ea-1af7-6881-4db7a3a5a114");
-const LLUUID ANIM_AGENT_DANCE4 = LLUUID("951469f4-c7b2-c818-9dee-ad7eea8c30b7");
-const LLUUID ANIM_AGENT_DANCE5 = LLUUID("4bd69a1d-1114-a0b4-625f-84e0a5237155");
-const LLUUID ANIM_AGENT_DANCE6 = LLUUID("cd28b69b-9c95-bb78-3f94-8d605ff1bb12");
-const LLUUID ANIM_AGENT_DANCE7 = LLUUID("a54d8ee2-28bb-80a9-7f0c-7afbbe24a5d6");
-const LLUUID ANIM_AGENT_DANCE8 = LLUUID("b0dc417c-1f11-af36-2e80-7e7489fa7cdc");
-const LLUUID ANIM_AGENT_DEAD = LLUUID("57abaae6-1d17-7b1b-5f98-6d11a6411276");
-const LLUUID ANIM_AGENT_DRINK = LLUUID("0f86e355-dd31-a61c-fdb0-3a96b9aad05f");
-const LLUUID ANIM_AGENT_EMBARRASSED = LLUUID("514af488-9051-044a-b3fc-d4dbf76377c6");
-const LLUUID ANIM_AGENT_EXPRESS_AFRAID = LLUUID("aa2df84d-cf8f-7218-527b-424a52de766e");
-const LLUUID ANIM_AGENT_EXPRESS_ANGER = LLUUID("1a03b575-9634-b62a-5767-3a679e81f4de");
-const LLUUID ANIM_AGENT_EXPRESS_BORED = LLUUID("214aa6c1-ba6a-4578-f27c-ce7688f61d0d");
-const LLUUID ANIM_AGENT_EXPRESS_CRY = LLUUID("d535471b-85bf-3b4d-a542-93bea4f59d33");
-const LLUUID ANIM_AGENT_EXPRESS_DISDAIN = LLUUID("d4416ff1-09d3-300f-4183-1b68a19b9fc1");
-const LLUUID ANIM_AGENT_EXPRESS_EMBARRASSED = LLUUID("0b8c8211-d78c-33e8-fa28-c51a9594e424");
-const LLUUID ANIM_AGENT_EXPRESS_FROWN = LLUUID("fee3df48-fa3d-1015-1e26-a205810e3001");
-const LLUUID ANIM_AGENT_EXPRESS_KISS = LLUUID("1e8d90cc-a84e-e135-884c-7c82c8b03a14");
-const LLUUID ANIM_AGENT_EXPRESS_LAUGH = LLUUID("62570842-0950-96f8-341c-809e65110823");
-const LLUUID ANIM_AGENT_EXPRESS_OPEN_MOUTH = LLUUID("d63bc1f9-fc81-9625-a0c6-007176d82eb7");
-const LLUUID ANIM_AGENT_EXPRESS_REPULSED = LLUUID("f76cda94-41d4-a229-2872-e0296e58afe1");
-const LLUUID ANIM_AGENT_EXPRESS_SAD = LLUUID("eb6ebfb2-a4b3-a19c-d388-4dd5c03823f7");
-const LLUUID ANIM_AGENT_EXPRESS_SHRUG = LLUUID("a351b1bc-cc94-aac2-7bea-a7e6ebad15ef");
-const LLUUID ANIM_AGENT_EXPRESS_SMILE = LLUUID("b7c7c833-e3d3-c4e3-9fc0-131237446312");
-const LLUUID ANIM_AGENT_EXPRESS_SURPRISE = LLUUID("728646d9-cc79-08b2-32d6-937f0a835c24");
-const LLUUID ANIM_AGENT_EXPRESS_TONGUE_OUT = LLUUID("835965c6-7f2f-bda2-5deb-2478737f91bf");
-const LLUUID ANIM_AGENT_EXPRESS_TOOTHSMILE = LLUUID("b92ec1a5-e7ce-a76b-2b05-bcdb9311417e");
-const LLUUID ANIM_AGENT_EXPRESS_WINK = LLUUID("da020525-4d94-59d6-23d7-81fdebf33148");
-const LLUUID ANIM_AGENT_EXPRESS_WORRY = LLUUID("9c05e5c7-6f07-6ca4-ed5a-b230390c3950");
-const LLUUID ANIM_AGENT_FALLDOWN = LLUUID("666307d9-a860-572d-6fd4-c3ab8865c094");
-const LLUUID ANIM_AGENT_FEMALE_RUN_NEW = LLUUID("85995026-eade-5d78-d364-94a64512cb66");
-const LLUUID ANIM_AGENT_FEMALE_WALK = LLUUID("f5fc7433-043d-e819-8298-f519a119b688");
-const LLUUID ANIM_AGENT_FEMALE_WALK_NEW = LLUUID("d60c41d2-7c24-7074-d3fa-6101cea22a51");
-const LLUUID ANIM_AGENT_FINGER_WAG = LLUUID("c1bc7f36-3ba0-d844-f93c-93be945d644f");
-const LLUUID ANIM_AGENT_FIST_PUMP = LLUUID("7db00ccd-f380-f3ee-439d-61968ec69c8a");
-const LLUUID ANIM_AGENT_FLY = LLUUID("aec4610c-757f-bc4e-c092-c6e9caf18daf");
-const LLUUID ANIM_AGENT_FLYSLOW = LLUUID("2b5a38b2-5e00-3a97-a495-4c826bc443e6");
-const LLUUID ANIM_AGENT_HELLO = LLUUID("9b29cd61-c45b-5689-ded2-91756b8d76a9");
-const LLUUID ANIM_AGENT_HOLD_BAZOOKA_R = LLUUID("ef62d355-c815-4816-2474-b1acc21094a6");
-const LLUUID ANIM_AGENT_HOLD_BOW_L = LLUUID("8b102617-bcba-037b-86c1-b76219f90c88");
-const LLUUID ANIM_AGENT_HOLD_HANDGUN_R = LLUUID("efdc1727-8b8a-c800-4077-975fc27ee2f2");
-const LLUUID ANIM_AGENT_HOLD_RIFLE_R = LLUUID("3d94bad0-c55b-7dcc-8763-033c59405d33");
-const LLUUID ANIM_AGENT_HOLD_THROW_R = LLUUID("7570c7b5-1f22-56dd-56ef-a9168241bbb6");
-const LLUUID ANIM_AGENT_HOVER = LLUUID("4ae8016b-31b9-03bb-c401-b1ea941db41d");
-const LLUUID ANIM_AGENT_HOVER_DOWN = LLUUID("20f063ea-8306-2562-0b07-5c853b37b31e");
-const LLUUID ANIM_AGENT_HOVER_UP = LLUUID("62c5de58-cb33-5743-3d07-9e4cd4352864");
-const LLUUID ANIM_AGENT_IMPATIENT = LLUUID("5ea3991f-c293-392e-6860-91dfa01278a3");
-const LLUUID ANIM_AGENT_JUMP = LLUUID("2305bd75-1ca9-b03b-1faa-b176b8a8c49e");
-const LLUUID ANIM_AGENT_JUMP_FOR_JOY = LLUUID("709ea28e-1573-c023-8bf8-520c8bc637fa");
-const LLUUID ANIM_AGENT_KISS_MY_BUTT = LLUUID("19999406-3a3a-d58c-a2ac-d72e555dcf51");
-const LLUUID ANIM_AGENT_LAND = LLUUID("7a17b059-12b2-41b1-570a-186368b6aa6f");
-const LLUUID ANIM_AGENT_LAUGH_SHORT = LLUUID("ca5b3f14-3194-7a2b-c894-aa699b718d1f");
-const LLUUID ANIM_AGENT_MEDIUM_LAND = LLUUID("f4f00d6e-b9fe-9292-f4cb-0ae06ea58d57");
-const LLUUID ANIM_AGENT_MOTORCYCLE_SIT = LLUUID("08464f78-3a8e-2944-cba5-0c94aff3af29");
-const LLUUID ANIM_AGENT_MUSCLE_BEACH = LLUUID("315c3a41-a5f3-0ba4-27da-f893f769e69b");
-const LLUUID ANIM_AGENT_NO = LLUUID("5a977ed9-7f72-44e9-4c4c-6e913df8ae74");
-const LLUUID ANIM_AGENT_NO_UNHAPPY = LLUUID("d83fa0e5-97ed-7eb2-e798-7bd006215cb4");
-const LLUUID ANIM_AGENT_NYAH_NYAH = LLUUID("f061723d-0a18-754f-66ee-29a44795a32f");
-const LLUUID ANIM_AGENT_ONETWO_PUNCH = LLUUID("eefc79be-daae-a239-8c04-890f5d23654a");
-const LLUUID ANIM_AGENT_PEACE = LLUUID("b312b10e-65ab-a0a4-8b3c-1326ea8e3ed9");
-const LLUUID ANIM_AGENT_POINT_ME = LLUUID("17c024cc-eef2-f6a0-3527-9869876d7752");
-const LLUUID ANIM_AGENT_POINT_YOU = LLUUID("ec952cca-61ef-aa3b-2789-4d1344f016de");
-const LLUUID ANIM_AGENT_PRE_JUMP = LLUUID("7a4e87fe-de39-6fcb-6223-024b00893244");
-const LLUUID ANIM_AGENT_PUNCH_LEFT = LLUUID("f3300ad9-3462-1d07-2044-0fef80062da0");
-const LLUUID ANIM_AGENT_PUNCH_RIGHT = LLUUID("c8e42d32-7310-6906-c903-cab5d4a34656");
-const LLUUID ANIM_AGENT_REPULSED = LLUUID("36f81a92-f076-5893-dc4b-7c3795e487cf");
-const LLUUID ANIM_AGENT_ROUNDHOUSE_KICK = LLUUID("49aea43b-5ac3-8a44-b595-96100af0beda");
-const LLUUID ANIM_AGENT_RPS_COUNTDOWN = LLUUID("35db4f7e-28c2-6679-cea9-3ee108f7fc7f");
-const LLUUID ANIM_AGENT_RPS_PAPER = LLUUID("0836b67f-7f7b-f37b-c00a-460dc1521f5a");
-const LLUUID ANIM_AGENT_RPS_ROCK = LLUUID("42dd95d5-0bc6-6392-f650-777304946c0f");
-const LLUUID ANIM_AGENT_RPS_SCISSORS = LLUUID("16803a9f-5140-e042-4d7b-d28ba247c325");
-const LLUUID ANIM_AGENT_RUN = LLUUID("05ddbff8-aaa9-92a1-2b74-8fe77a29b445");
-const LLUUID ANIM_AGENT_RUN_NEW = LLUUID("1ab1b236-cd08-21e6-0cbc-0d923fc6eca2");
-const LLUUID ANIM_AGENT_SAD = LLUUID("0eb702e2-cc5a-9a88-56a5-661a55c0676a");
-const LLUUID ANIM_AGENT_SALUTE = LLUUID("cd7668a6-7011-d7e2-ead8-fc69eff1a104");
-const LLUUID ANIM_AGENT_SHOOT_BOW_L = LLUUID("e04d450d-fdb5-0432-fd68-818aaf5935f8");
-const LLUUID ANIM_AGENT_SHOUT = LLUUID("6bd01860-4ebd-127a-bb3d-d1427e8e0c42");
-const LLUUID ANIM_AGENT_SHRUG = LLUUID("70ea714f-3a97-d742-1b01-590a8fcd1db5");
-const LLUUID ANIM_AGENT_SIT = LLUUID("1a5fe8ac-a804-8a5d-7cbd-56bd83184568");
-const LLUUID ANIM_AGENT_SIT_FEMALE = LLUUID("b1709c8d-ecd3-54a1-4f28-d55ac0840782");
-const LLUUID ANIM_AGENT_SIT_GENERIC = LLUUID("245f3c54-f1c0-bf2e-811f-46d8eeb386e7");
-const LLUUID ANIM_AGENT_SIT_GROUND = LLUUID("1c7600d6-661f-b87b-efe2-d7421eb93c86");
-const LLUUID ANIM_AGENT_SIT_GROUND_CONSTRAINED = LLUUID("1a2bd58e-87ff-0df8-0b4c-53e047b0bb6e");
-const LLUUID ANIM_AGENT_SIT_TO_STAND = LLUUID("a8dee56f-2eae-9e7a-05a2-6fb92b97e21e");
-const LLUUID ANIM_AGENT_SLEEP = LLUUID("f2bed5f9-9d44-39af-b0cd-257b2a17fe40");
-const LLUUID ANIM_AGENT_SMOKE_IDLE = LLUUID("d2f2ee58-8ad1-06c9-d8d3-3827ba31567a");
-const LLUUID ANIM_AGENT_SMOKE_INHALE = LLUUID("6802d553-49da-0778-9f85-1599a2266526");
-const LLUUID ANIM_AGENT_SMOKE_THROW_DOWN = LLUUID("0a9fb970-8b44-9114-d3a9-bf69cfe804d6");
-const LLUUID ANIM_AGENT_SNAPSHOT = LLUUID("eae8905b-271a-99e2-4c0e-31106afd100c");
-const LLUUID ANIM_AGENT_STAND = LLUUID("2408fe9e-df1d-1d7d-f4ff-1384fa7b350f");
-const LLUUID ANIM_AGENT_STANDUP = LLUUID("3da1d753-028a-5446-24f3-9c9b856d9422");
-const LLUUID ANIM_AGENT_STAND_1 = LLUUID("15468e00-3400-bb66-cecc-646d7c14458e");
-const LLUUID ANIM_AGENT_STAND_2 = LLUUID("370f3a20-6ca6-9971-848c-9a01bc42ae3c");
-const LLUUID ANIM_AGENT_STAND_3 = LLUUID("42b46214-4b44-79ae-deb8-0df61424ff4b");
-const LLUUID ANIM_AGENT_STAND_4 = LLUUID("f22fed8b-a5ed-2c93-64d5-bdd8b93c889f");
-const LLUUID ANIM_AGENT_STRETCH = LLUUID("80700431-74ec-a008-14f8-77575e73693f");
-const LLUUID ANIM_AGENT_STRIDE = LLUUID("1cb562b0-ba21-2202-efb3-30f82cdf9595");
-const LLUUID ANIM_AGENT_SURF = LLUUID("41426836-7437-7e89-025d-0aa4d10f1d69");
-const LLUUID ANIM_AGENT_SURPRISE = LLUUID("313b9881-4302-73c0-c7d0-0e7a36b6c224");
-const LLUUID ANIM_AGENT_SWORD_STRIKE = LLUUID("85428680-6bf9-3e64-b489-6f81087c24bd");
-const LLUUID ANIM_AGENT_TALK = LLUUID("5c682a95-6da4-a463-0bf6-0f5b7be129d1");
-const LLUUID ANIM_AGENT_TANTRUM = LLUUID("11000694-3f41-adc2-606b-eee1d66f3724");
-const LLUUID ANIM_AGENT_THROW_R = LLUUID("aa134404-7dac-7aca-2cba-435f9db875ca");
-const LLUUID ANIM_AGENT_TRYON_SHIRT = LLUUID("83ff59fe-2346-f236-9009-4e3608af64c1");
-const LLUUID ANIM_AGENT_TURNLEFT = LLUUID("56e0ba0d-4a9f-7f27-6117-32f2ebbf6135");
-const LLUUID ANIM_AGENT_TURNRIGHT = LLUUID("2d6daa51-3192-6794-8e2e-a15f8338ec30");
-const LLUUID ANIM_AGENT_TYPE = LLUUID("c541c47f-e0c0-058b-ad1a-d6ae3a4584d9");
-const LLUUID ANIM_AGENT_WALK = LLUUID("6ed24bd8-91aa-4b12-ccc7-c97c857ab4e0");
-const LLUUID ANIM_AGENT_WALK_NEW = LLUUID("33339176-7ddc-9397-94a4-bf3403cbc8f5");
-const LLUUID ANIM_AGENT_WHISPER = LLUUID("7693f268-06c7-ea71-fa21-2b30d6533f8f");
-const LLUUID ANIM_AGENT_WHISTLE = LLUUID("b1ed7982-c68e-a982-7561-52a88a5298c0");
-const LLUUID ANIM_AGENT_WINK = LLUUID("869ecdad-a44b-671e-3266-56aef2e3ac2e");
-const LLUUID ANIM_AGENT_WINK_HOLLYWOOD = LLUUID("c0c4030f-c02b-49de-24ba-2331f43fe41c");
-const LLUUID ANIM_AGENT_WORRY = LLUUID("9f496bd2-589a-709f-16cc-69bf7df1d36c");
-const LLUUID ANIM_AGENT_YES = LLUUID("15dd911d-be82-2856-26db-27659b142875");
-const LLUUID ANIM_AGENT_YES_HAPPY = LLUUID("b8c8b2a3-9008-1771-3bfc-90924955ab2d");
-const LLUUID ANIM_AGENT_YOGA_FLOAT = LLUUID("42ecd00b-9947-a97c-400a-bbc9174c7aeb");
+LLUUID const ANIM_AGENT_AFRAID ("6b61c8e8-4747-0d75-12d7-e49ff207a4ca");
+LLUUID const ANIM_AGENT_AIM_BAZOOKA_R ("b5b4a67d-0aee-30d2-72cd-77b333e932ef");
+LLUUID const ANIM_AGENT_AIM_BOW_L ("46bb4359-de38-4ed8-6a22-f1f52fe8f506");
+LLUUID const ANIM_AGENT_AIM_HANDGUN_R ("3147d815-6338-b932-f011-16b56d9ac18b");
+LLUUID const ANIM_AGENT_AIM_RIFLE_R ("ea633413-8006-180a-c3ba-96dd1d756720");
+LLUUID const ANIM_AGENT_ANGRY ("5747a48e-073e-c331-f6f3-7c2149613d3e");
+LLUUID const ANIM_AGENT_AWAY ("fd037134-85d4-f241-72c6-4f42164fedee");
+LLUUID const ANIM_AGENT_BACKFLIP ("c4ca6188-9127-4f31-0158-23c4e2f93304");
+LLUUID const ANIM_AGENT_BELLY_LAUGH ("18b3a4b5-b463-bd48-e4b6-71eaac76c515");
+LLUUID const ANIM_AGENT_BLOW_KISS ("db84829b-462c-ee83-1e27-9bbee66bd624");
+LLUUID const ANIM_AGENT_BORED ("b906c4ba-703b-1940-32a3-0c7f7d791510");
+LLUUID const ANIM_AGENT_BOW ("82e99230-c906-1403-4d9c-3889dd98daba");
+LLUUID const ANIM_AGENT_BRUSH ("349a3801-54f9-bf2c-3bd0-1ac89772af01");
+LLUUID const ANIM_AGENT_BUSY ("efcf670c-2d18-8128-973a-034ebc806b67");
+LLUUID const ANIM_AGENT_CLAP ("9b0c1c4e-8ac7-7969-1494-28c874c4f668");
+LLUUID const ANIM_AGENT_COURTBOW ("9ba1c942-08be-e43a-fb29-16ad440efc50");
+LLUUID const ANIM_AGENT_CROUCH ("201f3fdf-cb1f-dbec-201f-7333e328ae7c");
+LLUUID const ANIM_AGENT_CROUCHWALK ("47f5f6fb-22e5-ae44-f871-73aaaf4a6022");
+LLUUID const ANIM_AGENT_CRY ("92624d3e-1068-f1aa-a5ec-8244585193ed");
+LLUUID const ANIM_AGENT_CUSTOMIZE ("038fcec9-5ebd-8a8e-0e2e-6e71a0a1ac53");
+LLUUID const ANIM_AGENT_CUSTOMIZE_DONE ("6883a61a-b27b-5914-a61e-dda118a9ee2c");
+LLUUID const ANIM_AGENT_DANCE1 ("b68a3d7c-de9e-fc87-eec8-543d787e5b0d");
+LLUUID const ANIM_AGENT_DANCE2 ("928cae18-e31d-76fd-9cc9-2f55160ff818");
+LLUUID const ANIM_AGENT_DANCE3 ("30047778-10ea-1af7-6881-4db7a3a5a114");
+LLUUID const ANIM_AGENT_DANCE4 ("951469f4-c7b2-c818-9dee-ad7eea8c30b7");
+LLUUID const ANIM_AGENT_DANCE5 ("4bd69a1d-1114-a0b4-625f-84e0a5237155");
+LLUUID const ANIM_AGENT_DANCE6 ("cd28b69b-9c95-bb78-3f94-8d605ff1bb12");
+LLUUID const ANIM_AGENT_DANCE7 ("a54d8ee2-28bb-80a9-7f0c-7afbbe24a5d6");
+LLUUID const ANIM_AGENT_DANCE8 ("b0dc417c-1f11-af36-2e80-7e7489fa7cdc");
+LLUUID const ANIM_AGENT_DEAD ("57abaae6-1d17-7b1b-5f98-6d11a6411276");
+LLUUID const ANIM_AGENT_DRINK ("0f86e355-dd31-a61c-fdb0-3a96b9aad05f");
+LLUUID const ANIM_AGENT_EMBARRASSED ("514af488-9051-044a-b3fc-d4dbf76377c6");
+LLUUID const ANIM_AGENT_EXPRESS_AFRAID ("aa2df84d-cf8f-7218-527b-424a52de766e");
+LLUUID const ANIM_AGENT_EXPRESS_ANGER ("1a03b575-9634-b62a-5767-3a679e81f4de");
+LLUUID const ANIM_AGENT_EXPRESS_BORED ("214aa6c1-ba6a-4578-f27c-ce7688f61d0d");
+LLUUID const ANIM_AGENT_EXPRESS_CRY ("d535471b-85bf-3b4d-a542-93bea4f59d33");
+LLUUID const ANIM_AGENT_EXPRESS_DISDAIN ("d4416ff1-09d3-300f-4183-1b68a19b9fc1");
+LLUUID const ANIM_AGENT_EXPRESS_EMBARRASSED ("0b8c8211-d78c-33e8-fa28-c51a9594e424");
+LLUUID const ANIM_AGENT_EXPRESS_FROWN ("fee3df48-fa3d-1015-1e26-a205810e3001");
+LLUUID const ANIM_AGENT_EXPRESS_KISS ("1e8d90cc-a84e-e135-884c-7c82c8b03a14");
+LLUUID const ANIM_AGENT_EXPRESS_LAUGH ("62570842-0950-96f8-341c-809e65110823");
+LLUUID const ANIM_AGENT_EXPRESS_OPEN_MOUTH ("d63bc1f9-fc81-9625-a0c6-007176d82eb7");
+LLUUID const ANIM_AGENT_EXPRESS_REPULSED ("f76cda94-41d4-a229-2872-e0296e58afe1");
+LLUUID const ANIM_AGENT_EXPRESS_SAD ("eb6ebfb2-a4b3-a19c-d388-4dd5c03823f7");
+LLUUID const ANIM_AGENT_EXPRESS_SHRUG ("a351b1bc-cc94-aac2-7bea-a7e6ebad15ef");
+LLUUID const ANIM_AGENT_EXPRESS_SMILE ("b7c7c833-e3d3-c4e3-9fc0-131237446312");
+LLUUID const ANIM_AGENT_EXPRESS_SURPRISE ("728646d9-cc79-08b2-32d6-937f0a835c24");
+LLUUID const ANIM_AGENT_EXPRESS_TONGUE_OUT ("835965c6-7f2f-bda2-5deb-2478737f91bf");
+LLUUID const ANIM_AGENT_EXPRESS_TOOTHSMILE ("b92ec1a5-e7ce-a76b-2b05-bcdb9311417e");
+LLUUID const ANIM_AGENT_EXPRESS_WINK ("da020525-4d94-59d6-23d7-81fdebf33148");
+LLUUID const ANIM_AGENT_EXPRESS_WORRY ("9c05e5c7-6f07-6ca4-ed5a-b230390c3950");
+LLUUID const ANIM_AGENT_FALLDOWN ("666307d9-a860-572d-6fd4-c3ab8865c094");
+LLUUID const ANIM_AGENT_FEMALE_RUN_NEW ("85995026-eade-5d78-d364-94a64512cb66");
+LLUUID const ANIM_AGENT_FEMALE_WALK ("f5fc7433-043d-e819-8298-f519a119b688");
+LLUUID const ANIM_AGENT_FEMALE_WALK_NEW ("d60c41d2-7c24-7074-d3fa-6101cea22a51");
+LLUUID const ANIM_AGENT_FINGER_WAG ("c1bc7f36-3ba0-d844-f93c-93be945d644f");
+LLUUID const ANIM_AGENT_FIST_PUMP ("7db00ccd-f380-f3ee-439d-61968ec69c8a");
+LLUUID const ANIM_AGENT_FLY ("aec4610c-757f-bc4e-c092-c6e9caf18daf");
+LLUUID const ANIM_AGENT_FLYSLOW ("2b5a38b2-5e00-3a97-a495-4c826bc443e6");
+LLUUID const ANIM_AGENT_HELLO ("9b29cd61-c45b-5689-ded2-91756b8d76a9");
+LLUUID const ANIM_AGENT_HOLD_BAZOOKA_R ("ef62d355-c815-4816-2474-b1acc21094a6");
+LLUUID const ANIM_AGENT_HOLD_BOW_L ("8b102617-bcba-037b-86c1-b76219f90c88");
+LLUUID const ANIM_AGENT_HOLD_HANDGUN_R ("efdc1727-8b8a-c800-4077-975fc27ee2f2");
+LLUUID const ANIM_AGENT_HOLD_RIFLE_R ("3d94bad0-c55b-7dcc-8763-033c59405d33");
+LLUUID const ANIM_AGENT_HOLD_THROW_R ("7570c7b5-1f22-56dd-56ef-a9168241bbb6");
+LLUUID const ANIM_AGENT_HOVER ("4ae8016b-31b9-03bb-c401-b1ea941db41d");
+LLUUID const ANIM_AGENT_HOVER_DOWN ("20f063ea-8306-2562-0b07-5c853b37b31e");
+LLUUID const ANIM_AGENT_HOVER_UP ("62c5de58-cb33-5743-3d07-9e4cd4352864");
+LLUUID const ANIM_AGENT_IMPATIENT ("5ea3991f-c293-392e-6860-91dfa01278a3");
+LLUUID const ANIM_AGENT_JUMP ("2305bd75-1ca9-b03b-1faa-b176b8a8c49e");
+LLUUID const ANIM_AGENT_JUMP_FOR_JOY ("709ea28e-1573-c023-8bf8-520c8bc637fa");
+LLUUID const ANIM_AGENT_KISS_MY_BUTT ("19999406-3a3a-d58c-a2ac-d72e555dcf51");
+LLUUID const ANIM_AGENT_LAND ("7a17b059-12b2-41b1-570a-186368b6aa6f");
+LLUUID const ANIM_AGENT_LAUGH_SHORT ("ca5b3f14-3194-7a2b-c894-aa699b718d1f");
+LLUUID const ANIM_AGENT_MEDIUM_LAND ("f4f00d6e-b9fe-9292-f4cb-0ae06ea58d57");
+LLUUID const ANIM_AGENT_MOTORCYCLE_SIT ("08464f78-3a8e-2944-cba5-0c94aff3af29");
+LLUUID const ANIM_AGENT_MUSCLE_BEACH ("315c3a41-a5f3-0ba4-27da-f893f769e69b");
+LLUUID const ANIM_AGENT_NO ("5a977ed9-7f72-44e9-4c4c-6e913df8ae74");
+LLUUID const ANIM_AGENT_NO_UNHAPPY ("d83fa0e5-97ed-7eb2-e798-7bd006215cb4");
+LLUUID const ANIM_AGENT_NYAH_NYAH ("f061723d-0a18-754f-66ee-29a44795a32f");
+LLUUID const ANIM_AGENT_ONETWO_PUNCH ("eefc79be-daae-a239-8c04-890f5d23654a");
+LLUUID const ANIM_AGENT_PEACE ("b312b10e-65ab-a0a4-8b3c-1326ea8e3ed9");
+LLUUID const ANIM_AGENT_POINT_ME ("17c024cc-eef2-f6a0-3527-9869876d7752");
+LLUUID const ANIM_AGENT_POINT_YOU ("ec952cca-61ef-aa3b-2789-4d1344f016de");
+LLUUID const ANIM_AGENT_PRE_JUMP ("7a4e87fe-de39-6fcb-6223-024b00893244");
+LLUUID const ANIM_AGENT_PUNCH_LEFT ("f3300ad9-3462-1d07-2044-0fef80062da0");
+LLUUID const ANIM_AGENT_PUNCH_RIGHT ("c8e42d32-7310-6906-c903-cab5d4a34656");
+LLUUID const ANIM_AGENT_REPULSED ("36f81a92-f076-5893-dc4b-7c3795e487cf");
+LLUUID const ANIM_AGENT_ROUNDHOUSE_KICK ("49aea43b-5ac3-8a44-b595-96100af0beda");
+LLUUID const ANIM_AGENT_RPS_COUNTDOWN ("35db4f7e-28c2-6679-cea9-3ee108f7fc7f");
+LLUUID const ANIM_AGENT_RPS_PAPER ("0836b67f-7f7b-f37b-c00a-460dc1521f5a");
+LLUUID const ANIM_AGENT_RPS_ROCK ("42dd95d5-0bc6-6392-f650-777304946c0f");
+LLUUID const ANIM_AGENT_RPS_SCISSORS ("16803a9f-5140-e042-4d7b-d28ba247c325");
+LLUUID const ANIM_AGENT_RUN ("05ddbff8-aaa9-92a1-2b74-8fe77a29b445");
+LLUUID const ANIM_AGENT_RUN_NEW ("1ab1b236-cd08-21e6-0cbc-0d923fc6eca2");
+LLUUID const ANIM_AGENT_SAD ("0eb702e2-cc5a-9a88-56a5-661a55c0676a");
+LLUUID const ANIM_AGENT_SALUTE ("cd7668a6-7011-d7e2-ead8-fc69eff1a104");
+LLUUID const ANIM_AGENT_SHOOT_BOW_L ("e04d450d-fdb5-0432-fd68-818aaf5935f8");
+LLUUID const ANIM_AGENT_SHOUT ("6bd01860-4ebd-127a-bb3d-d1427e8e0c42");
+LLUUID const ANIM_AGENT_SHRUG ("70ea714f-3a97-d742-1b01-590a8fcd1db5");
+LLUUID const ANIM_AGENT_SIT ("1a5fe8ac-a804-8a5d-7cbd-56bd83184568");
+LLUUID const ANIM_AGENT_SIT_FEMALE ("b1709c8d-ecd3-54a1-4f28-d55ac0840782");
+LLUUID const ANIM_AGENT_SIT_GENERIC ("245f3c54-f1c0-bf2e-811f-46d8eeb386e7");
+LLUUID const ANIM_AGENT_SIT_GROUND ("1c7600d6-661f-b87b-efe2-d7421eb93c86");
+LLUUID const ANIM_AGENT_SIT_GROUND_CONSTRAINED("1a2bd58e-87ff-0df8-0b4c-53e047b0bb6e");
+LLUUID const ANIM_AGENT_SIT_TO_STAND ("a8dee56f-2eae-9e7a-05a2-6fb92b97e21e");
+LLUUID const ANIM_AGENT_SLEEP ("f2bed5f9-9d44-39af-b0cd-257b2a17fe40");
+LLUUID const ANIM_AGENT_SMOKE_IDLE ("d2f2ee58-8ad1-06c9-d8d3-3827ba31567a");
+LLUUID const ANIM_AGENT_SMOKE_INHALE ("6802d553-49da-0778-9f85-1599a2266526");
+LLUUID const ANIM_AGENT_SMOKE_THROW_DOWN ("0a9fb970-8b44-9114-d3a9-bf69cfe804d6");
+LLUUID const ANIM_AGENT_SNAPSHOT ("eae8905b-271a-99e2-4c0e-31106afd100c");
+LLUUID const ANIM_AGENT_STAND ("2408fe9e-df1d-1d7d-f4ff-1384fa7b350f");
+LLUUID const ANIM_AGENT_STANDUP ("3da1d753-028a-5446-24f3-9c9b856d9422");
+LLUUID const ANIM_AGENT_STAND_1 ("15468e00-3400-bb66-cecc-646d7c14458e");
+LLUUID const ANIM_AGENT_STAND_2 ("370f3a20-6ca6-9971-848c-9a01bc42ae3c");
+LLUUID const ANIM_AGENT_STAND_3 ("42b46214-4b44-79ae-deb8-0df61424ff4b");
+LLUUID const ANIM_AGENT_STAND_4 ("f22fed8b-a5ed-2c93-64d5-bdd8b93c889f");
+LLUUID const ANIM_AGENT_STRETCH ("80700431-74ec-a008-14f8-77575e73693f");
+LLUUID const ANIM_AGENT_STRIDE ("1cb562b0-ba21-2202-efb3-30f82cdf9595");
+LLUUID const ANIM_AGENT_SURF ("41426836-7437-7e89-025d-0aa4d10f1d69");
+LLUUID const ANIM_AGENT_SURPRISE ("313b9881-4302-73c0-c7d0-0e7a36b6c224");
+LLUUID const ANIM_AGENT_SWORD_STRIKE ("85428680-6bf9-3e64-b489-6f81087c24bd");
+LLUUID const ANIM_AGENT_TALK ("5c682a95-6da4-a463-0bf6-0f5b7be129d1");
+LLUUID const ANIM_AGENT_TANTRUM ("11000694-3f41-adc2-606b-eee1d66f3724");
+LLUUID const ANIM_AGENT_THROW_R ("aa134404-7dac-7aca-2cba-435f9db875ca");
+LLUUID const ANIM_AGENT_TRYON_SHIRT ("83ff59fe-2346-f236-9009-4e3608af64c1");
+LLUUID const ANIM_AGENT_TURNLEFT ("56e0ba0d-4a9f-7f27-6117-32f2ebbf6135");
+LLUUID const ANIM_AGENT_TURNRIGHT ("2d6daa51-3192-6794-8e2e-a15f8338ec30");
+LLUUID const ANIM_AGENT_TYPE ("c541c47f-e0c0-058b-ad1a-d6ae3a4584d9");
+LLUUID const ANIM_AGENT_WALK ("6ed24bd8-91aa-4b12-ccc7-c97c857ab4e0");
+LLUUID const ANIM_AGENT_WALK_NEW ("33339176-7ddc-9397-94a4-bf3403cbc8f5");
+LLUUID const ANIM_AGENT_WHISPER ("7693f268-06c7-ea71-fa21-2b30d6533f8f");
+LLUUID const ANIM_AGENT_WHISTLE ("b1ed7982-c68e-a982-7561-52a88a5298c0");
+LLUUID const ANIM_AGENT_WINK ("869ecdad-a44b-671e-3266-56aef2e3ac2e");
+LLUUID const ANIM_AGENT_WINK_HOLLYWOOD ("c0c4030f-c02b-49de-24ba-2331f43fe41c");
+LLUUID const ANIM_AGENT_WORRY ("9f496bd2-589a-709f-16cc-69bf7df1d36c");
+LLUUID const ANIM_AGENT_YES ("15dd911d-be82-2856-26db-27659b142875");
+LLUUID const ANIM_AGENT_YES_HAPPY ("b8c8b2a3-9008-1771-3bfc-90924955ab2d");
+LLUUID const ANIM_AGENT_YOGA_FLOAT ("42ecd00b-9947-a97c-400a-bbc9174c7aeb");
LLUUID AGENT_WALK_ANIMS[] = {ANIM_AGENT_WALK, ANIM_AGENT_RUN, ANIM_AGENT_CROUCHWALK, ANIM_AGENT_TURNLEFT, ANIM_AGENT_TURNRIGHT};
S32 NUM_AGENT_WALK_ANIMS = LL_ARRAY_SIZE(AGENT_WALK_ANIMS);
diff --git a/indra/llcharacter/llbvhloader.cpp b/indra/llcharacter/llbvhloader.cpp
index 532a2c1b0d..2a0df26384 100644
--- a/indra/llcharacter/llbvhloader.cpp
+++ b/indra/llcharacter/llbvhloader.cpp
@@ -42,10 +42,10 @@ using namespace std;
#define INCHES_TO_METERS 0.02540005f
-const F32 POSITION_KEYFRAME_THRESHOLD = 0.03f;
+const F32 POSITION_KEYFRAME_THRESHOLD_SQUARED = 0.03f * 0.03f;
const F32 ROTATION_KEYFRAME_THRESHOLD = 0.01f;
-const F32 POSITION_MOTION_THRESHOLD = 0.001f;
+const F32 POSITION_MOTION_THRESHOLD_SQUARED = 0.001f * 0.001f;
const F32 ROTATION_MOTION_THRESHOLD = 0.001f;
char gInFile[1024]; /* Flawfinder: ignore */
@@ -1196,7 +1196,7 @@ void LLBVHLoader::optimize()
if (ki_prev == ki_last_good_pos)
{
joint->mNumPosKeys++;
- if (dist_vec(LLVector3(ki_prev->mPos), first_frame_pos) > POSITION_MOTION_THRESHOLD)
+ if (dist_vec_squared(LLVector3(ki_prev->mPos), first_frame_pos) > POSITION_MOTION_THRESHOLD_SQUARED)
{
pos_changed = TRUE;
}
@@ -1209,12 +1209,12 @@ void LLBVHLoader::optimize()
LLVector3 current_pos(ki->mPos);
LLVector3 interp_pos = lerp(current_pos, last_good_pos, 1.f / (F32)numPosFramesConsidered);
- if (dist_vec(current_pos, first_frame_pos) > POSITION_MOTION_THRESHOLD)
+ if (dist_vec_squared(current_pos, first_frame_pos) > POSITION_MOTION_THRESHOLD_SQUARED)
{
pos_changed = TRUE;
}
- if (dist_vec(interp_pos, test_pos) < POSITION_KEYFRAME_THRESHOLD)
+ if (dist_vec_squared(interp_pos, test_pos) < POSITION_KEYFRAME_THRESHOLD_SQUARED)
{
ki_prev->mIgnorePos = TRUE;
numPosFramesConsidered++;
@@ -1570,7 +1570,7 @@ BOOL LLBVHLoader::serialize(LLDataPacker& dp)
constraint_it++)
{
U8 byte = constraint_it->mChainLength;
- dp.packU8(byte, "chain_lenght");
+ dp.packU8(byte, "chain_length");
byte = constraint_it->mConstraintType;
dp.packU8(byte, "constraint_type");
diff --git a/indra/llcharacter/llcharacter.cpp b/indra/llcharacter/llcharacter.cpp
index 5f84be2c5d..c9fb8534f1 100644
--- a/indra/llcharacter/llcharacter.cpp
+++ b/indra/llcharacter/llcharacter.cpp
@@ -38,7 +38,7 @@
LLStringTable LLCharacter::sVisualParamNames(1024);
std::vector< LLCharacter* > LLCharacter::sInstances;
-
+BOOL LLCharacter::sAllowInstancesChange = TRUE ;
//-----------------------------------------------------------------------------
// LLCharacter()
@@ -51,8 +51,10 @@ LLCharacter::LLCharacter()
mAppearanceSerialNum( 0 ),
mSkeletonSerialNum( 0 )
{
- mMotionController.setCharacter( this );
+ llassert_always(sAllowInstancesChange) ;
sInstances.push_back(this);
+
+ mMotionController.setCharacter( this );
mPauseRequest = new LLPauseRequestHandle();
}
@@ -62,18 +64,29 @@ LLCharacter::LLCharacter()
// Class Destructor
//-----------------------------------------------------------------------------
LLCharacter::~LLCharacter()
-{
+{
for (LLVisualParam *param = getFirstVisualParam();
param;
param = getNextVisualParam())
{
delete param;
}
- std::vector<LLCharacter*>::iterator iter = std::find(sInstances.begin(), sInstances.end(), this);
- if (iter != sInstances.end())
+
+ U32 i ;
+ U32 size = sInstances.size() ;
+ for(i = 0 ; i < size ; i++)
{
- sInstances.erase(iter);
+ if(sInstances[i] == this)
+ {
+ break ;
+ }
}
+
+ llassert_always(i < size) ;
+
+ llassert_always(sAllowInstancesChange) ;
+ sInstances[i] = sInstances[size - 1] ;
+ sInstances.pop_back() ;
}
diff --git a/indra/llcharacter/llcharacter.h b/indra/llcharacter/llcharacter.h
index a6347fcc3c..3ebb2bffb0 100644
--- a/indra/llcharacter/llcharacter.h
+++ b/indra/llcharacter/llcharacter.h
@@ -126,7 +126,7 @@ public:
virtual void addDebugText( const std::string& text ) = 0;
- virtual const LLUUID& getID() = 0;
+ virtual const LLUUID& getID() const = 0;
//-------------------------------------------------------------------------
// End Interface
//-------------------------------------------------------------------------
@@ -266,6 +266,7 @@ public:
void setSkeletonSerialNum( U32 num ) { mSkeletonSerialNum = num; }
static std::vector< LLCharacter* > sInstances;
+ static BOOL sAllowInstancesChange ; //debug use
protected:
LLMotionController mMotionController;
diff --git a/indra/llcharacter/lljoint.cpp b/indra/llcharacter/lljoint.cpp
index 5d750c6c96..19907933cb 100644
--- a/indra/llcharacter/lljoint.cpp
+++ b/indra/llcharacter/lljoint.cpp
@@ -50,6 +50,7 @@ LLJoint::LLJoint()
mUpdateXform = TRUE;
mJointNum = -1;
touch();
+ mResetAfterRestoreOldXform = false;
}
@@ -235,6 +236,42 @@ void LLJoint::setPosition( const LLVector3& pos )
//--------------------------------------------------------------------
+// setPosition()
+//--------------------------------------------------------------------
+void LLJoint::setDefaultFromCurrentXform( void )
+{
+ mDefaultXform = mXform;
+ touch(MATRIX_DIRTY | POSITION_DIRTY);
+
+}
+
+//--------------------------------------------------------------------
+// storeCurrentXform()
+//--------------------------------------------------------------------
+void LLJoint::storeCurrentXform( const LLVector3& pos )
+{
+ mOldXform = mXform;
+ mResetAfterRestoreOldXform = true;
+ setPosition( pos );
+}
+//--------------------------------------------------------------------
+// restoreOldXform()
+//--------------------------------------------------------------------
+void LLJoint::restoreOldXform( void )
+{
+ mResetAfterRestoreOldXform = false;
+ mXform = mOldXform;
+}
+//--------------------------------------------------------------------
+// restoreOldXform()
+//--------------------------------------------------------------------
+void LLJoint::restoreToDefaultXform( void )
+{
+ mXform = mDefaultXform;
+ setPosition( mXform.getPosition() );
+}
+
+//--------------------------------------------------------------------
// getWorldPosition()
//--------------------------------------------------------------------
LLVector3 LLJoint::getWorldPosition()
@@ -522,3 +559,4 @@ void LLJoint::clampRotation(LLQuaternion old_rot, LLQuaternion new_rot)
}
// End
+
diff --git a/indra/llcharacter/lljoint.h b/indra/llcharacter/lljoint.h
index 8c8e5930fb..dc3c58cf64 100644
--- a/indra/llcharacter/lljoint.h
+++ b/indra/llcharacter/lljoint.h
@@ -80,11 +80,16 @@ protected:
// explicit transformation members
LLXformMatrix mXform;
+ LLXformMatrix mOldXform;
+ LLXformMatrix mDefaultXform;
+ LLUUID mId;
public:
U32 mDirtyFlags;
BOOL mUpdateXform;
+ BOOL mResetAfterRestoreOldXform;
+
// describes the skin binding pose
LLVector3 mSkinOffset;
@@ -130,7 +135,9 @@ public:
// get/set local position
const LLVector3& getPosition();
void setPosition( const LLVector3& pos );
-
+
+ void setDefaultPosition( const LLVector3& pos );
+
// get/set world position
LLVector3 getWorldPosition();
LLVector3 getLastWorldPosition();
@@ -172,6 +179,21 @@ public:
S32 getJointNum() const { return mJointNum; }
void setJointNum(S32 joint_num) { mJointNum = joint_num; }
+
+ void restoreOldXform( void );
+ void restoreToDefaultXform( void );
+ void setDefaultFromCurrentXform( void );
+ void storeCurrentXform( const LLVector3& pos );
+
+ //Accessor for the joint id
+ LLUUID getId( void ) { return mId; }
+ //Setter for the joints id
+ void setId( const LLUUID& id ) { mId = id;}
+
+ //If the old transform flag has been set, then the reset logic in avatar needs to be aware(test) of it
+ const BOOL doesJointNeedToBeReset( void ) const { return mResetAfterRestoreOldXform; }
+ //Setter for joint reset flag
+ void setJointToBeReset( BOOL val ) { mResetAfterRestoreOldXform = val; }
};
#endif // LL_LLJOINT_H
diff --git a/indra/llcharacter/llkeyframemotion.cpp b/indra/llcharacter/llkeyframemotion.cpp
index 5b0867524e..c6f45bffa2 100644
--- a/indra/llcharacter/llkeyframemotion.cpp
+++ b/indra/llcharacter/llkeyframemotion.cpp
@@ -467,13 +467,15 @@ LLPointer<LLJointState>& LLKeyframeMotion::getJointState(U32 index)
}
//-----------------------------------------------------------------------------
-// getJoin()
+// getJoint()
//-----------------------------------------------------------------------------
LLJoint* LLKeyframeMotion::getJoint(U32 index)
{
llassert_always (index < mJointStates.size());
LLJoint* joint = mJointStates[index]->getJoint();
- llassert_always (joint);
+
+ //Commented out 06-28-11 by Aura.
+ //llassert_always (joint);
return joint;
}
@@ -821,7 +823,11 @@ void LLKeyframeMotion::initializeConstraint(JointConstraint* constraint)
S32 joint_num;
LLVector3 source_pos = mCharacter->getVolumePos(shared_data->mSourceConstraintVolume, shared_data->mSourceConstraintOffset);
LLJoint* cur_joint = getJoint(shared_data->mJointStateIndices[0]);
-
+ if ( !cur_joint )
+ {
+ return;
+ }
+
F32 source_pos_offset = dist_vec(source_pos, cur_joint->getWorldPosition());
constraint->mTotalLength = constraint->mJointLengths[0] = dist_vec(cur_joint->getParent()->getWorldPosition(), source_pos);
@@ -872,6 +878,10 @@ void LLKeyframeMotion::activateConstraint(JointConstraint* constraint)
for (joint_num = 1; joint_num < shared_data->mChainLength; joint_num++)
{
LLJoint* cur_joint = getJoint(shared_data->mJointStateIndices[joint_num]);
+ if ( !cur_joint )
+ {
+ return;
+ }
constraint->mPositions[joint_num] = (cur_joint->getWorldPosition() - mPelvisp->getWorldPosition()) * ~mPelvisp->getWorldRotation();
}
@@ -932,6 +942,11 @@ void LLKeyframeMotion::applyConstraint(JointConstraint* constraint, F32 time, U8
}
LLJoint* root_joint = getJoint(shared_data->mJointStateIndices[shared_data->mChainLength]);
+ if (! root_joint)
+ {
+ return;
+ }
+
LLVector3 root_pos = root_joint->getWorldPosition();
// LLQuaternion root_rot =
root_joint->getParent()->getWorldRotation();
@@ -943,6 +958,11 @@ void LLKeyframeMotion::applyConstraint(JointConstraint* constraint, F32 time, U8
for (joint_num = 0; joint_num <= shared_data->mChainLength; joint_num++)
{
LLJoint* cur_joint = getJoint(shared_data->mJointStateIndices[joint_num]);
+ if (!cur_joint)
+ {
+ return;
+ }
+
if (joint_mask[cur_joint->getJointNum()] >= (0xff >> (7 - getPriority())))
{
// skip constraint
@@ -1033,7 +1053,14 @@ void LLKeyframeMotion::applyConstraint(JointConstraint* constraint, F32 time, U8
if (shared_data->mChainLength)
{
- LLQuaternion end_rot = getJoint(shared_data->mJointStateIndices[0])->getWorldRotation();
+ LLJoint* end_joint = getJoint(shared_data->mJointStateIndices[0]);
+
+ if (!end_joint)
+ {
+ return;
+ }
+
+ LLQuaternion end_rot = end_joint->getWorldRotation();
// slam start and end of chain to the proper positions (rest of chain stays put)
positions[0] = lerp(keyframe_source_pos, target_pos, weight);
@@ -1042,7 +1069,14 @@ void LLKeyframeMotion::applyConstraint(JointConstraint* constraint, F32 time, U8
// grab keyframe-specified positions of joints
for (joint_num = 1; joint_num < shared_data->mChainLength; joint_num++)
{
- LLVector3 kinematic_position = getJoint(shared_data->mJointStateIndices[joint_num])->getWorldPosition() +
+ LLJoint* cur_joint = getJoint(shared_data->mJointStateIndices[joint_num]);
+
+ if (!cur_joint)
+ {
+ return;
+ }
+
+ LLVector3 kinematic_position = cur_joint->getWorldPosition() +
(source_to_target * constraint->mJointLengthFractions[joint_num]);
// convert intermediate joint positions to world coordinates
@@ -1088,7 +1122,17 @@ void LLKeyframeMotion::applyConstraint(JointConstraint* constraint, F32 time, U8
for (joint_num = shared_data->mChainLength; joint_num > 0; joint_num--)
{
LLJoint* cur_joint = getJoint(shared_data->mJointStateIndices[joint_num]);
+
+ if (!cur_joint)
+ {
+ return;
+ }
LLJoint* child_joint = getJoint(shared_data->mJointStateIndices[joint_num - 1]);
+ if (!child_joint)
+ {
+ return;
+ }
+
LLQuaternion parent_rot = cur_joint->getParent()->getWorldRotation();
LLQuaternion cur_rot = cur_joint->getWorldRotation();
@@ -1122,7 +1166,6 @@ void LLKeyframeMotion::applyConstraint(JointConstraint* constraint, F32 time, U8
cur_joint->setRotation(target_rot);
}
- LLJoint* end_joint = getJoint(shared_data->mJointStateIndices[0]);
LLQuaternion end_local_rot = end_rot * ~end_joint->getParent()->getWorldRotation();
if (weight == 1.f)
@@ -1145,12 +1188,18 @@ void LLKeyframeMotion::applyConstraint(JointConstraint* constraint, F32 time, U8
constraint->mPositions[joint_num] = new_pos;
}
constraint->mFixupDistanceRMS *= 1.f / (constraint->mTotalLength * (F32)(shared_data->mChainLength - 1));
- constraint->mFixupDistanceRMS = fsqrtf(constraint->mFixupDistanceRMS);
+ constraint->mFixupDistanceRMS = (F32) sqrt(constraint->mFixupDistanceRMS);
//reset old joint rots
for (joint_num = 0; joint_num <= shared_data->mChainLength; joint_num++)
{
- getJoint(shared_data->mJointStateIndices[joint_num])->setRotation(old_rots[joint_num]);
+ LLJoint* cur_joint = getJoint(shared_data->mJointStateIndices[joint_num]);
+ if (!cur_joint)
+ {
+ return;
+ }
+
+ cur_joint->setRotation(old_rots[joint_num]);
}
}
// simple positional constraint (pelvis only)
@@ -1775,7 +1824,15 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp)
constraintp->mJointStateIndices[i] = -1;
for (U32 j = 0; j < mJointMotionList->getNumJointMotions(); j++)
{
- if(getJoint(j) == joint)
+ LLJoint* constraint_joint = getJoint(j);
+
+ if ( !constraint_joint )
+ {
+ llwarns << "Invalid joint " << j << llendl;
+ return FALSE;
+ }
+
+ if(constraint_joint == joint)
{
constraintp->mJointStateIndices[i] = (S32)j;
break;
diff --git a/indra/llcharacter/llkeyframemotion.h b/indra/llcharacter/llkeyframemotion.h
index 1fe9af40b3..b1422b2b90 100644
--- a/indra/llcharacter/llkeyframemotion.h
+++ b/indra/llcharacter/llkeyframemotion.h
@@ -70,7 +70,7 @@ public:
private:
// private helper functions to wrap some asserts
LLPointer<LLJointState>& getJointState(U32 index);
- LLJoint* getJoint(U32 index);
+ LLJoint* getJoint(U32 index );
public:
//-------------------------------------------------------------------------
diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt
index 9342a22d46..0a3eaec5c5 100644
--- a/indra/llcommon/CMakeLists.txt
+++ b/indra/llcommon/CMakeLists.txt
@@ -7,17 +7,16 @@ include(00-Common)
include(LLCommon)
include(Linking)
include(Boost)
-include(Pth)
include(LLSharedLibs)
include(GoogleBreakpad)
include(GooglePerfTools)
include(Copy3rdPartyLibs)
+include(ZLIB)
include_directories(
${EXPAT_INCLUDE_DIRS}
${LLCOMMON_INCLUDE_DIRS}
${ZLIB_INCLUDE_DIRS}
- ${PTH_INCLUDE_DIRS}
)
# add_executable(lltreeiterators lltreeiterators.cpp)
@@ -62,6 +61,7 @@ set(llcommon_SOURCE_FILES
llformat.cpp
llframetimer.cpp
llheartbeat.cpp
+ llinstancetracker.cpp
llliveappconfig.cpp
lllivefile.cpp
lllog.cpp
@@ -115,6 +115,7 @@ set(llcommon_HEADER_FILES
indra_constants.h
linden_common.h
linked_lists.h
+ llaccountingcost.h
llallocator.h
llallocator_heap_profile.h
llagentconstants.h
@@ -266,6 +267,10 @@ if(LLCOMMON_LINK_SHARED)
add_definitions(-fPIC)
endif(WINDOWS)
endif(NOT WORD_SIZE EQUAL 32)
+ if(WINDOWS)
+ # always generate llcommon.pdb, even for "Release" builds
+ set_target_properties(llcommon PROPERTIES LINK_FLAGS "/DEBUG")
+ endif(WINDOWS)
ll_stage_sharedlib(llcommon)
else(LLCOMMON_LINK_SHARED)
add_library (llcommon ${llcommon_SOURCE_FILES})
@@ -281,10 +286,15 @@ target_link_libraries(
${WINDOWS_LIBRARIES}
${BOOST_PROGRAM_OPTIONS_LIBRARY}
${BOOST_REGEX_LIBRARY}
- ${PTH_LIBRARIES}
${GOOGLE_PERFTOOLS_LIBRARIES}
)
+if (DARWIN)
+ include(CMakeFindFrameworks)
+ find_library(CARBON_LIBRARY Carbon)
+ target_link_libraries(llcommon ${CARBON_LIBRARY})
+endif (DARWIN)
+
add_dependencies(llcommon stage_third_party_libs)
if (LL_TESTS)
@@ -307,12 +317,15 @@ if (LL_TESTS)
LL_ADD_INTEGRATION_TEST(lllazy "" "${test_libs}")
LL_ADD_INTEGRATION_TEST(llprocessor "" "${test_libs}")
LL_ADD_INTEGRATION_TEST(llrand "" "${test_libs}")
- LL_ADD_INTEGRATION_TEST(llsdserialize "" "${test_libs}")
+ LL_ADD_INTEGRATION_TEST(llsdserialize "" "${test_libs}"
+ "${PYTHON_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/tests/setpython.py")
+ LL_ADD_INTEGRATION_TEST(llsingleton "" "${test_libs}")
LL_ADD_INTEGRATION_TEST(llstring "" "${test_libs}")
LL_ADD_INTEGRATION_TEST(lltreeiterators "" "${test_libs}")
LL_ADD_INTEGRATION_TEST(lluri "" "${test_libs}")
LL_ADD_INTEGRATION_TEST(reflection "" "${test_libs}")
LL_ADD_INTEGRATION_TEST(stringize "" "${test_libs}")
+ LL_ADD_INTEGRATION_TEST(lleventdispatcher "" "${test_libs}")
# *TODO - reenable these once tcmalloc libs no longer break the build.
#ADD_BUILD_TEST(llallocator llcommon)
diff --git a/indra/llcommon/indra_constants.h b/indra/llcommon/indra_constants.h
index 95cb606240..0745696ef3 100644
--- a/indra/llcommon/indra_constants.h
+++ b/indra/llcommon/indra_constants.h
@@ -312,6 +312,14 @@ const F32 CHAT_SHOUT_RADIUS = 100.f;
const F32 CHAT_MAX_RADIUS = CHAT_SHOUT_RADIUS;
const F32 CHAT_MAX_RADIUS_BY_TWO = CHAT_MAX_RADIUS / 2.f;
+// squared editions of the above for distance checks
+const F32 CHAT_WHISPER_RADIUS_SQUARED = CHAT_WHISPER_RADIUS * CHAT_WHISPER_RADIUS;
+const F32 CHAT_NORMAL_RADIUS_SQUARED = CHAT_NORMAL_RADIUS * CHAT_NORMAL_RADIUS;
+const F32 CHAT_SHOUT_RADIUS_SQUARED = CHAT_SHOUT_RADIUS * CHAT_SHOUT_RADIUS;
+const F32 CHAT_MAX_RADIUS_SQUARED = CHAT_SHOUT_RADIUS_SQUARED;
+const F32 CHAT_MAX_RADIUS_BY_TWO_SQUARED = CHAT_MAX_RADIUS_BY_TWO * CHAT_MAX_RADIUS_BY_TWO;
+
+
// this times above gives barely audible radius
const F32 CHAT_BARELY_AUDIBLE_FACTOR = 2.0f;
@@ -379,8 +387,6 @@ const S32 MAP_SIM_RETURN_NULL_SIMS = 0x00010000;
const S32 MAP_SIM_PRELUDE = 0x00020000;
// Crash reporter behavior
-const char* const CRASH_SETTINGS_FILE = "settings_crash_behavior.xml";
-const char* const CRASH_BEHAVIOR_SETTING = "CrashSubmitBehavior";
const S32 CRASH_BEHAVIOR_ASK = 0;
const S32 CRASH_BEHAVIOR_ALWAYS_SEND = 1;
const S32 CRASH_BEHAVIOR_NEVER_SEND = 2;
diff --git a/indra/llcommon/linden_common.h b/indra/llcommon/linden_common.h
index bdcc98e402..5cfcdab41c 100644
--- a/indra/llcommon/linden_common.h
+++ b/indra/llcommon/linden_common.h
@@ -52,34 +52,11 @@
#include <ctime>
#include <iosfwd>
-// Work around Microsoft compiler warnings in STL headers
-#ifdef LL_WINDOWS
-#pragma warning (disable : 4702) // unreachable code
-#pragma warning (disable : 4244) // conversion from time_t to S32
-#endif // LL_WINDOWS
-
-// *TODO: Eliminate these, most library .cpp files don't need them.
-// Add them to llviewerprecompiledheaders.h if necessary.
-#include <list>
-#include <map>
-#include <vector>
-#include <string>
-
-#ifdef LL_WINDOWS
-// Reenable warnings we disabled above
-#pragma warning (3 : 4702) // unreachable code, we like level 3, not 4
-// moved msvc warnings to llpreprocessor.h *TODO - delete this comment after merge conflicts are unlikely -brad
-#endif // LL_WINDOWS
-
// Linden only libs in alpha-order other than stdtypes.h
// *NOTE: Please keep includes here to a minimum, see above.
#include "stdtypes.h"
#include "lldefs.h"
#include "llerror.h"
-#include "llextendedstatus.h"
-// Don't do this, adds 15K lines of header code to every library file.
-//#include "llfasttimer.h"
#include "llfile.h"
-#include "llformat.h"
#endif
diff --git a/indra/llcommon/llaccountingcost.h b/indra/llcommon/llaccountingcost.h
new file mode 100644
index 0000000000..0ef3b50c6d
--- /dev/null
+++ b/indra/llcommon/llaccountingcost.h
@@ -0,0 +1,86 @@
+/**
+ * @file llaccountingcost.h
+ * @
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_ACCOUNTINGQUOTA_H
+#define LL_ACCOUNTINGQUOTA_H
+
+struct ParcelQuota
+{
+ ParcelQuota( F32 ownerRenderCost, F32 ownerPhysicsCost, F32 ownerNetworkCost, F32 ownerSimulationCost,
+ F32 groupRenderCost, F32 groupPhysicsCost, F32 groupNetworkCost, F32 groupSimulationCost,
+ F32 otherRenderCost, F32 otherPhysicsCost, F32 otherNetworkCost, F32 otherSimulationCost,
+ F32 tempRenderCost, F32 tempPhysicsCost, F32 tempNetworkCost, F32 tempSimulationCost,
+ F32 selectedRenderCost, F32 selectedPhysicsCost, F32 selectedNetworkCost, F32 selectedSimulationCost,
+ F32 parcelCapacity )
+ : mOwnerRenderCost( ownerRenderCost ), mOwnerPhysicsCost( ownerPhysicsCost )
+ , mOwnerNetworkCost( ownerNetworkCost ), mOwnerSimulationCost( ownerSimulationCost )
+ , mGroupRenderCost( groupRenderCost ), mGroupPhysicsCost( groupPhysicsCost )
+ , mGroupNetworkCost( groupNetworkCost ), mGroupSimulationCost( groupSimulationCost )
+ , mOtherRenderCost( otherRenderCost ), mOtherPhysicsCost( otherPhysicsCost )
+ , mOtherNetworkCost( otherNetworkCost ), mOtherSimulationCost( otherSimulationCost )
+ , mTempRenderCost( tempRenderCost ), mTempPhysicsCost( tempPhysicsCost )
+ , mTempNetworkCost( tempNetworkCost ), mTempSimulationCost( tempSimulationCost )
+ , mSelectedRenderCost( tempRenderCost ), mSelectedPhysicsCost( tempPhysicsCost )
+ , mSelectedNetworkCost( tempNetworkCost ), mSelectedSimulationCost( selectedSimulationCost )
+ , mParcelCapacity( parcelCapacity )
+ {
+ }
+
+ ParcelQuota(){}
+ F32 mOwnerRenderCost, mOwnerPhysicsCost, mOwnerNetworkCost, mOwnerSimulationCost;
+ F32 mGroupRenderCost, mGroupPhysicsCost, mGroupNetworkCost, mGroupSimulationCost;
+ F32 mOtherRenderCost, mOtherPhysicsCost, mOtherNetworkCost, mOtherSimulationCost;
+ F32 mTempRenderCost, mTempPhysicsCost, mTempNetworkCost, mTempSimulationCost;
+ F32 mSelectedRenderCost, mSelectedPhysicsCost, mSelectedNetworkCost, mSelectedSimulationCost;
+ F32 mParcelCapacity;
+};
+
+//SelectionQuota atm does not require a id
+struct SelectionCost
+{
+ SelectionCost( /*LLTransactionID transactionId, */ F32 physicsCost, F32 networkCost, F32 simulationCost )
+ //: mTransactionId( transactionId)
+ : mPhysicsCost( physicsCost )
+ , mNetworkCost( networkCost )
+ , mSimulationCost( simulationCost )
+ {
+ }
+ SelectionCost()
+ : mPhysicsCost( 0.0f )
+ , mNetworkCost( 0.0f )
+ , mSimulationCost( 0.0f )
+ {}
+
+ F32 mPhysicsCost, mNetworkCost, mSimulationCost;
+ //LLTransactionID mTransactionId;
+};
+
+typedef enum { Roots = 0 , Prims } eSelectionType;
+
+#endif
+
+
+
diff --git a/indra/llcommon/llapp.cpp b/indra/llcommon/llapp.cpp
index 39daefd1ad..ed192a9975 100644
--- a/indra/llcommon/llapp.cpp
+++ b/indra/llcommon/llapp.cpp
@@ -24,6 +24,10 @@
* $/LicenseInfo$
*/
+#include "linden_common.h"
+
+#include "llapp.h"
+
#include <cstdlib>
#ifdef LL_DARWIN
@@ -32,9 +36,6 @@
#include <sys/sysctl.h>
#endif
-#include "linden_common.h"
-#include "llapp.h"
-
#include "llcommon.h"
#include "llapr.h"
#include "llerrorcontrol.h"
diff --git a/indra/llcommon/llapr.cpp b/indra/llcommon/llapr.cpp
index 66ec5bad2c..d1c44c9403 100644
--- a/indra/llcommon/llapr.cpp
+++ b/indra/llcommon/llapr.cpp
@@ -28,6 +28,7 @@
#include "linden_common.h"
#include "llapr.h"
+#include "apr_dso.h"
apr_pool_t *gAPRPoolp = NULL; // Global APR memory pool
LLVolatileAPRPool *LLAPRFile::sAPRFilePoolp = NULL ; //global volatile APR memory pool.
@@ -279,14 +280,31 @@ bool ll_apr_warn_status(apr_status_t status)
{
if(APR_SUCCESS == status) return false;
char buf[MAX_STRING]; /* Flawfinder: ignore */
- apr_strerror(status, buf, MAX_STRING);
+ apr_strerror(status, buf, sizeof(buf));
LL_WARNS("APR") << "APR: " << buf << LL_ENDL;
return true;
}
+bool ll_apr_warn_status(apr_status_t status, apr_dso_handle_t *handle)
+{
+ bool result = ll_apr_warn_status(status);
+ // Despite observed truncation of actual Mac dylib load errors, increasing
+ // this buffer to more than MAX_STRING doesn't help: it appears that APR
+ // stores the output in a fixed 255-character internal buffer. (*sigh*)
+ char buf[MAX_STRING]; /* Flawfinder: ignore */
+ apr_dso_error(handle, buf, sizeof(buf));
+ LL_WARNS("APR") << "APR: " << buf << LL_ENDL;
+ return result;
+}
+
void ll_apr_assert_status(apr_status_t status)
{
- llassert(ll_apr_warn_status(status) == false);
+ llassert(! ll_apr_warn_status(status));
+}
+
+void ll_apr_assert_status(apr_status_t status, apr_dso_handle_t *handle)
+{
+ llassert(! ll_apr_warn_status(status, handle));
}
//---------------------------------------------------------------------
diff --git a/indra/llcommon/llapr.h b/indra/llcommon/llapr.h
index 4930270af8..af33ce666f 100644
--- a/indra/llcommon/llapr.h
+++ b/indra/llcommon/llapr.h
@@ -53,6 +53,8 @@
extern LL_COMMON_API apr_thread_mutex_t* gLogMutexp;
extern apr_thread_mutex_t* gCallStacksLogMutexp;
+struct apr_dso_handle_t;
+
/**
* @brief initialize the common apr constructs -- apr itself, the
* global pool, and a mutex.
@@ -259,8 +261,11 @@ public:
* @return Returns <code>true</code> if status is an error condition.
*/
bool LL_COMMON_API ll_apr_warn_status(apr_status_t status);
+/// There's a whole other APR error-message function if you pass a DSO handle.
+bool LL_COMMON_API ll_apr_warn_status(apr_status_t status, apr_dso_handle_t* handle);
void LL_COMMON_API ll_apr_assert_status(apr_status_t status);
+void LL_COMMON_API ll_apr_assert_status(apr_status_t status, apr_dso_handle_t* handle);
extern "C" LL_COMMON_API apr_pool_t* gAPRPoolp; // Global APR memory pool
diff --git a/indra/llcommon/llassettype.cpp b/indra/llcommon/llassettype.cpp
index eb610f625a..5e566d6c7c 100644
--- a/indra/llcommon/llassettype.cpp
+++ b/indra/llcommon/llassettype.cpp
@@ -93,8 +93,10 @@ LLAssetDictionary::LLAssetDictionary()
addEntry(LLAssetType::AT_LINK, new AssetEntry("LINK", "link", "sym link", false, false, true));
addEntry(LLAssetType::AT_LINK_FOLDER, new AssetEntry("FOLDER_LINK", "link_f", "sym folder link", false, false, true));
+ addEntry(LLAssetType::AT_MESH, new AssetEntry("MESH", "mesh", "mesh", false, false, false));
+ addEntry(LLAssetType::AT_WIDGET, new AssetEntry("WIDGET", "widget", "widget", false, false, false));
+ addEntry(LLAssetType::AT_NONE, new AssetEntry("NONE", "-1", NULL, FALSE, FALSE, FALSE));
- addEntry(LLAssetType::AT_NONE, new AssetEntry("NONE", "-1", NULL, false, false, false));
};
// static
diff --git a/indra/llcommon/llassettype.h b/indra/llcommon/llassettype.h
index c5ff2364cc..d538accbf7 100644
--- a/indra/llcommon/llassettype.h
+++ b/indra/llcommon/llassettype.h
@@ -109,7 +109,13 @@ public:
AT_LINK_FOLDER = 25,
// Inventory folder link
- AT_COUNT = 26,
+ AT_WIDGET = 40,
+ // UI Widget: this is *not* an inventory asset type, only a viewer side asset (e.g. button, other ui items...)
+
+ AT_MESH = 49,
+ // Mesh data in our proprietary SLM format
+
+ AT_COUNT = 50,
// +*********************************************************+
// | TO ADD AN ELEMENT TO THIS ENUM: |
diff --git a/indra/llcommon/llavatarconstants.h b/indra/llcommon/llavatarconstants.h
index 596b0643ef..f47f447b45 100644
--- a/indra/llcommon/llavatarconstants.h
+++ b/indra/llcommon/llavatarconstants.h
@@ -46,10 +46,10 @@ const U32 AVATAR_TRANSACTED = 0x1 << 3; // whether avatar has actively used p
const U32 AVATAR_ONLINE = 0x1 << 4; // the online status of this avatar, if known.
const U32 AVATAR_AGEVERIFIED = 0x1 << 5; // whether avatar has been age-verified
-static const std::string VISIBILITY_DEFAULT("default");
-static const std::string VISIBILITY_HIDDEN("hidden");
-static const std::string VISIBILITY_VISIBLE("visible");
-static const std::string VISIBILITY_INVISIBLE("invisible");
+char const* const VISIBILITY_DEFAULT = "default";
+char const* const VISIBILITY_HIDDEN = "hidden";
+char const* const VISIBILITY_VISIBLE = "visible";
+char const* const VISIBILITY_INVISIBLE = "invisible";
#endif
diff --git a/indra/llcommon/llavatarname.cpp b/indra/llcommon/llavatarname.cpp
index b1ec9e9875..3206843bf4 100644
--- a/indra/llcommon/llavatarname.cpp
+++ b/indra/llcommon/llavatarname.cpp
@@ -48,7 +48,7 @@ LLAvatarName::LLAvatarName()
mLegacyFirstName(),
mLegacyLastName(),
mIsDisplayNameDefault(false),
- mIsDummy(false),
+ mIsTemporaryName(false),
mExpires(F64_MAX),
mNextUpdate(0.0)
{ }
@@ -90,20 +90,27 @@ void LLAvatarName::fromLLSD(const LLSD& sd)
std::string LLAvatarName::getCompleteName() const
{
std::string name;
- if (!mUsername.empty())
+ if (mUsername.empty() || mIsDisplayNameDefault)
+ // If the display name feature is off
+ // OR this particular display name is defaulted (i.e. based on user name),
+ // then display only the easier to read instance of the person's name.
{
- name = mDisplayName + " (" + mUsername + ")";
+ name = mDisplayName;
}
else
{
- // ...display names are off, legacy name is in mDisplayName
- name = mDisplayName;
+ name = mDisplayName + " (" + mUsername + ")";
}
return name;
}
std::string LLAvatarName::getLegacyName() const
{
+ if (mLegacyFirstName.empty() && mLegacyLastName.empty()) // display names disabled?
+ {
+ return mDisplayName;
+ }
+
std::string name;
name.reserve( mLegacyFirstName.size() + 1 + mLegacyLastName.size() );
name = mLegacyFirstName;
diff --git a/indra/llcommon/llavatarname.h b/indra/llcommon/llavatarname.h
index 145aeccd35..ba258d6d52 100644
--- a/indra/llcommon/llavatarname.h
+++ b/indra/llcommon/llavatarname.h
@@ -79,7 +79,7 @@ public:
// Under error conditions, we may insert "dummy" records with
// names like "???" into caches as placeholders. These can be
// shown in UI, but are not serialized.
- bool mIsDummy;
+ bool mIsTemporaryName;
// Names can change, so need to keep track of when name was
// last checked.
diff --git a/indra/llcommon/llchat.h b/indra/llcommon/llchat.h
index 87c2d6775b..f5b242fdfc 100644
--- a/indra/llcommon/llchat.h
+++ b/indra/llcommon/llchat.h
@@ -49,7 +49,8 @@ typedef enum e_chat_type
CHAT_TYPE_STOP = 5,
CHAT_TYPE_DEBUG_MSG = 6,
CHAT_TYPE_REGION = 7,
- CHAT_TYPE_OWNER = 8
+ CHAT_TYPE_OWNER = 8,
+ CHAT_TYPE_DIRECT = 9 // From llRegionSayTo()
} EChatType;
typedef enum e_chat_audible_level
diff --git a/indra/llcommon/lldefs.h b/indra/llcommon/lldefs.h
index 6b38de6500..5a4b8325f4 100644
--- a/indra/llcommon/lldefs.h
+++ b/indra/llcommon/lldefs.h
@@ -236,5 +236,13 @@ inline LLDATATYPE llclampb(const LLDATATYPE& a)
return llmin(llmax(a, (LLDATATYPE)0), (LLDATATYPE)255);
}
+template <class LLDATATYPE>
+inline void llswap(LLDATATYPE& lhs, LLDATATYPE& rhs)
+{
+ LLDATATYPE tmp = lhs;
+ lhs = rhs;
+ rhs = tmp;
+}
+
#endif // LL_LLDEFS_H
diff --git a/indra/llcommon/llerror.cpp b/indra/llcommon/llerror.cpp
index bb64152407..e4381dbbd6 100644
--- a/indra/llcommon/llerror.cpp
+++ b/indra/llcommon/llerror.cpp
@@ -379,7 +379,7 @@ namespace
{
/* This pattern, of returning a reference to a static function
variable, is to ensure that this global is constructed before
- it is used, no matter what the global initializeation sequence
+ it is used, no matter what the global initialization sequence
is.
See C++ FAQ Lite, sections 10.12 through 10.14
*/
@@ -617,6 +617,12 @@ namespace LLError
s.defaultLevel = level;
}
+ ELevel getDefaultLevel()
+ {
+ Settings& s = Settings::get();
+ return s.defaultLevel;
+ }
+
void setFunctionLevel(const std::string& function_name, ELevel level)
{
Globals& g = Globals::get();
diff --git a/indra/llcommon/llerror.h b/indra/llcommon/llerror.h
index 4a42241c4f..b3e604f8e8 100644
--- a/indra/llcommon/llerror.h
+++ b/indra/llcommon/llerror.h
@@ -39,7 +39,7 @@
Information for most users:
- Code can log messages with constuctions like this:
+ Code can log messages with constructions like this:
LL_INFOS("StringTag") << "request to fizzbip agent " << agent_id
<< " denied due to timeout" << LL_ENDL;
@@ -47,9 +47,9 @@
Messages can be logged to one of four increasing levels of concern,
using one of four "streams":
- LL_DEBUGS("StringTag") - debug messages that are normally supressed
- LL_INFOS("StringTag") - informational messages that are normall shown
- LL_WARNS("StringTag") - warning messages that singal a problem
+ LL_DEBUGS("StringTag") - debug messages that are normally suppressed
+ LL_INFOS("StringTag") - informational messages that are normal shown
+ LL_WARNS("StringTag") - warning messages that signal a problem
LL_ERRS("StringTag") - error messages that are major, unrecoverable failures
The later (LL_ERRS("StringTag")) automatically crashes the process after the message
@@ -90,7 +90,7 @@
WARN: LLFoo::doSomething: called with a big value for i: 283
- Which messages are logged and which are supressed can be controled at run
+ Which messages are logged and which are suppressed can be controlled at run
time from the live file logcontrol.xml based on function, class and/or
source file. See etc/logcontrol-dev.xml for details.
@@ -106,7 +106,7 @@ namespace LLError
enum ELevel
{
LEVEL_ALL = 0,
- // used to indicate that all messagess should be logged
+ // used to indicate that all messages should be logged
LEVEL_DEBUG = 0,
LEVEL_INFO = 1,
@@ -220,7 +220,7 @@ namespace LLError
// See top of file for example of how to use this
typedef LLError::NoClassInfo _LL_CLASS_TO_LOG;
- // Outside a class declartion, or in class without LOG_CLASS(), this
+ // Outside a class declaration, or in class without LOG_CLASS(), this
// typedef causes the messages to not be associated with any class.
diff --git a/indra/llcommon/llerrorcontrol.h b/indra/llcommon/llerrorcontrol.h
index fb75d45e2c..ed9de002f5 100644
--- a/indra/llcommon/llerrorcontrol.h
+++ b/indra/llcommon/llerrorcontrol.h
@@ -75,6 +75,7 @@ namespace LLError
LL_COMMON_API void setPrintLocation(bool);
LL_COMMON_API void setDefaultLevel(LLError::ELevel);
+ LL_COMMON_API ELevel getDefaultLevel();
LL_COMMON_API void setFunctionLevel(const std::string& function_name, LLError::ELevel);
LL_COMMON_API void setClassLevel(const std::string& class_name, LLError::ELevel);
LL_COMMON_API void setFileLevel(const std::string& file_name, LLError::ELevel);
diff --git a/indra/llcommon/lleventapi.cpp b/indra/llcommon/lleventapi.cpp
index 4270c8b511..ff5459c1eb 100644
--- a/indra/llcommon/lleventapi.cpp
+++ b/indra/llcommon/lleventapi.cpp
@@ -34,6 +34,7 @@
// std headers
// external library headers
// other Linden headers
+#include "llerror.h"
LLEventAPI::LLEventAPI(const std::string& name, const std::string& desc, const std::string& field):
lbase(name, field),
@@ -45,3 +46,32 @@ LLEventAPI::LLEventAPI(const std::string& name, const std::string& desc, const s
LLEventAPI::~LLEventAPI()
{
}
+
+LLEventAPI::Response::Response(const LLSD& seed, const LLSD& request, const LLSD::String& replyKey):
+ mResp(seed),
+ mReq(request),
+ mKey(replyKey)
+{}
+
+LLEventAPI::Response::~Response()
+{
+ // When you instantiate a stack Response object, if the original
+ // request requested a reply, send it when we leave this block, no
+ // matter how.
+ sendReply(mResp, mReq, mKey);
+}
+
+void LLEventAPI::Response::warn(const std::string& warning)
+{
+ LL_WARNS("LLEventAPI::Response") << warning << LL_ENDL;
+ mResp["warnings"].append(warning);
+}
+
+void LLEventAPI::Response::error(const std::string& error)
+{
+ // Use LL_WARNS rather than LL_ERROR: we don't want the viewer to shut
+ // down altogether.
+ LL_WARNS("LLEventAPI::Response") << error << LL_ENDL;
+
+ mResp["error"] = error;
+}
diff --git a/indra/llcommon/lleventapi.h b/indra/llcommon/lleventapi.h
index d75d521e8e..1a37d780b6 100644
--- a/indra/llcommon/lleventapi.h
+++ b/indra/llcommon/lleventapi.h
@@ -76,6 +76,89 @@ public:
LLEventDispatcher::add(name, desc, callable, required);
}
+ /**
+ * Instantiate a Response object in any LLEventAPI subclass method that
+ * wants to guarantee a reply (if requested) will be sent on exit from the
+ * method. The reply will be sent if request.has(@a replyKey), default
+ * "reply". If specified, the value of request[replyKey] is the name of
+ * the LLEventPump on which to send the reply. Conventionally you might
+ * code something like:
+ *
+ * @code
+ * void MyEventAPI::someMethod(const LLSD& request)
+ * {
+ * // Send a reply event as long as request.has("reply")
+ * Response response(LLSD(), request);
+ * // ...
+ * // will be sent in reply event
+ * response["somekey"] = some_data;
+ * }
+ * @endcode
+ */
+ class LL_COMMON_API Response
+ {
+ public:
+ /**
+ * Instantiating a Response object in an LLEventAPI subclass method
+ * ensures that, if desired, a reply event will be sent.
+ *
+ * @a seed is the initial reply LLSD that will be further decorated before
+ * being sent as the reply
+ *
+ * @a request is the incoming request LLSD; we particularly care about
+ * [replyKey] and ["reqid"]
+ *
+ * @a replyKey [default "reply"] is the string name of the LLEventPump
+ * on which the caller wants a reply. If <tt>(!
+ * request.has(replyKey))</tt>, no reply will be sent.
+ */
+ Response(const LLSD& seed, const LLSD& request, const LLSD::String& replyKey="reply");
+ ~Response();
+
+ /**
+ * @code
+ * if (some condition)
+ * {
+ * response.warn("warnings are logged and collected in [\"warnings\"]");
+ * }
+ * @endcode
+ */
+ void warn(const std::string& warning);
+ /**
+ * @code
+ * if (some condition isn't met)
+ * {
+ * // In a function returning void, you can validly 'return
+ * // expression' if the expression is itself of type void. But
+ * // returning is up to you; response.error() has no effect on
+ * // flow of control.
+ * return response.error("error message, logged and also sent as [\"error\"]");
+ * }
+ * @endcode
+ */
+ void error(const std::string& error);
+
+ /**
+ * set other keys...
+ *
+ * @code
+ * // set any attributes you want to be sent in the reply
+ * response["info"] = some_value;
+ * // ...
+ * response["ok"] = went_well;
+ * @endcode
+ */
+ LLSD& operator[](const LLSD::String& key) { return mResp[key]; }
+
+ /**
+ * set the response to the given data
+ */
+ void setResponse(LLSD const & response){ mResp = response; }
+
+ LLSD mResp, mReq;
+ LLSD::String mKey;
+ };
+
private:
std::string mDesc;
};
diff --git a/indra/llcommon/lleventdispatcher.cpp b/indra/llcommon/lleventdispatcher.cpp
index d6e820d793..5b6d4efbe9 100644
--- a/indra/llcommon/lleventdispatcher.cpp
+++ b/indra/llcommon/lleventdispatcher.cpp
@@ -41,6 +41,354 @@
#include "llevents.h"
#include "llerror.h"
#include "llsdutil.h"
+#include "stringize.h"
+#include <memory> // std::auto_ptr
+
+/*****************************************************************************
+* LLSDArgsSource
+*****************************************************************************/
+/**
+ * Store an LLSD array, producing its elements one at a time. Die with LL_ERRS
+ * if the consumer requests more elements than the array contains.
+ */
+class LL_COMMON_API LLSDArgsSource
+{
+public:
+ LLSDArgsSource(const std::string function, const LLSD& args);
+ ~LLSDArgsSource();
+
+ LLSD next();
+
+ void done() const;
+
+private:
+ std::string _function;
+ LLSD _args;
+ LLSD::Integer _index;
+};
+
+LLSDArgsSource::LLSDArgsSource(const std::string function, const LLSD& args):
+ _function(function),
+ _args(args),
+ _index(0)
+{
+ if (! (_args.isUndefined() || _args.isArray()))
+ {
+ LL_ERRS("LLSDArgsSource") << _function << " needs an args array instead of "
+ << _args << LL_ENDL;
+ }
+}
+
+LLSDArgsSource::~LLSDArgsSource()
+{
+ done();
+}
+
+LLSD LLSDArgsSource::next()
+{
+ if (_index >= _args.size())
+ {
+ LL_ERRS("LLSDArgsSource") << _function << " requires more arguments than the "
+ << _args.size() << " provided: " << _args << LL_ENDL;
+ }
+ return _args[_index++];
+}
+
+void LLSDArgsSource::done() const
+{
+ if (_index < _args.size())
+ {
+ LL_WARNS("LLSDArgsSource") << _function << " only consumed " << _index
+ << " of the " << _args.size() << " arguments provided: "
+ << _args << LL_ENDL;
+ }
+}
+
+/*****************************************************************************
+* LLSDArgsMapper
+*****************************************************************************/
+/**
+ * From a formal parameters description and a map of arguments, construct an
+ * arguments array.
+ *
+ * That is, given:
+ * - an LLSD array of length n containing parameter-name strings,
+ * corresponding to the arguments of a function of interest
+ * - an LLSD collection specifying default parameter values, either:
+ * - an LLSD array of length m <= n, matching the rightmost m params, or
+ * - an LLSD map explicitly stating default name=value pairs
+ * - an LLSD map of parameter names and actual values for a particular
+ * function call
+ * construct an LLSD array of actual argument values for this function call.
+ *
+ * The parameter-names array and the defaults collection describe the function
+ * being called. The map might vary with every call, providing argument values
+ * for the described parameters.
+ *
+ * The array of parameter names must match the number of parameters expected
+ * by the function of interest.
+ *
+ * If you pass a map of default parameter values, it provides default values
+ * as you might expect. It is an error to specify a default value for a name
+ * not listed in the parameters array.
+ *
+ * If you pass an array of default parameter values, it is mapped to the
+ * rightmost m of the n parameter names. It is an error if the default-values
+ * array is longer than the parameter-names array. Consider the following
+ * parameter names: ["a", "b", "c", "d"].
+ *
+ * - An empty array of default values (or an isUndefined() value) asserts that
+ * every one of the above parameter names is required.
+ * - An array of four default values [1, 2, 3, 4] asserts that every one of
+ * the above parameters is optional. If the current parameter map is empty,
+ * they will be passed to the function as [1, 2, 3, 4].
+ * - An array of two default values [11, 12] asserts that parameters "a" and
+ * "b" are required, while "c" and "d" are optional, having default values
+ * "c"=11 and "d"=12.
+ *
+ * The arguments array is constructed as follows:
+ *
+ * - Arguments-map keys not found in the parameter-names array are ignored.
+ * - Entries from the map provide values for an improper subset of the
+ * parameters named in the parameter-names array. This results in a
+ * tentative values array with "holes." (size of map) + (number of holes) =
+ * (size of names array)
+ * - Holes are filled with the default values.
+ * - Any remaining holes constitute an error.
+ */
+class LL_COMMON_API LLSDArgsMapper
+{
+public:
+ /// Accept description of function: function name, param names, param
+ /// default values
+ LLSDArgsMapper(const std::string& function, const LLSD& names, const LLSD& defaults);
+
+ /// Given arguments map, return LLSD::Array of parameter values, or LL_ERRS.
+ LLSD map(const LLSD& argsmap) const;
+
+private:
+ static std::string formatlist(const LLSD&);
+
+ // The function-name string is purely descriptive. We want error messages
+ // to be able to indicate which function's LLSDArgsMapper has the problem.
+ std::string _function;
+ // Store the names array pretty much as given.
+ LLSD _names;
+ // Though we're handed an array of name strings, it's more useful to us to
+ // store it as a map from name string to position index. Of course that's
+ // easy to generate from the incoming names array, but why do it more than
+ // once?
+ typedef std::map<LLSD::String, LLSD::Integer> IndexMap;
+ IndexMap _indexes;
+ // Generated array of default values, aligned with the array of param names.
+ LLSD _defaults;
+ // Indicate whether we have a default value for each param.
+ typedef std::vector<char> FilledVector;
+ FilledVector _has_dft;
+};
+
+LLSDArgsMapper::LLSDArgsMapper(const std::string& function,
+ const LLSD& names, const LLSD& defaults):
+ _function(function),
+ _names(names),
+ _has_dft(names.size())
+{
+ if (! (_names.isUndefined() || _names.isArray()))
+ {
+ LL_ERRS("LLSDArgsMapper") << function << " names must be an array, not " << names << LL_ENDL;
+ }
+ LLSD::Integer nparams(_names.size());
+ // From _names generate _indexes.
+ for (LLSD::Integer ni = 0, nend = _names.size(); ni < nend; ++ni)
+ {
+ _indexes[_names[ni]] = ni;
+ }
+
+ // Presize _defaults() array so we don't have to resize it more than once.
+ // All entries are initialized to LLSD(); but since _has_dft is still all
+ // 0, they're all "holes" for now.
+ if (nparams)
+ {
+ _defaults[nparams - 1] = LLSD();
+ }
+
+ if (defaults.isUndefined() || defaults.isArray())
+ {
+ LLSD::Integer ndefaults = defaults.size();
+ // defaults is a (possibly empty) array. Right-align it with names.
+ if (ndefaults > nparams)
+ {
+ LL_ERRS("LLSDArgsMapper") << function << " names array " << names
+ << " shorter than defaults array " << defaults << LL_ENDL;
+ }
+
+ // Offset by which we slide defaults array right to right-align with
+ // _names array
+ LLSD::Integer offset = nparams - ndefaults;
+ // Fill rightmost _defaults entries from defaults, and mark them as
+ // filled
+ for (LLSD::Integer i = 0, iend = ndefaults; i < iend; ++i)
+ {
+ _defaults[i + offset] = defaults[i];
+ _has_dft[i + offset] = 1;
+ }
+ }
+ else if (defaults.isMap())
+ {
+ // defaults is a map. Use it to populate the _defaults array.
+ LLSD bogus;
+ for (LLSD::map_const_iterator mi(defaults.beginMap()), mend(defaults.endMap());
+ mi != mend; ++mi)
+ {
+ IndexMap::const_iterator ixit(_indexes.find(mi->first));
+ if (ixit == _indexes.end())
+ {
+ bogus.append(mi->first);
+ continue;
+ }
+
+ LLSD::Integer pos = ixit->second;
+ // Store default value at that position in the _defaults array.
+ _defaults[pos] = mi->second;
+ // Don't forget to record the fact that we've filled this
+ // position.
+ _has_dft[pos] = 1;
+ }
+ if (bogus.size())
+ {
+ LL_ERRS("LLSDArgsMapper") << function << " defaults specified for nonexistent params "
+ << formatlist(bogus) << LL_ENDL;
+ }
+ }
+ else
+ {
+ LL_ERRS("LLSDArgsMapper") << function << " defaults must be a map or an array, not "
+ << defaults << LL_ENDL;
+ }
+}
+
+LLSD LLSDArgsMapper::map(const LLSD& argsmap) const
+{
+ if (! (argsmap.isUndefined() || argsmap.isMap() || argsmap.isArray()))
+ {
+ LL_ERRS("LLSDArgsMapper") << _function << " map() needs a map or array, not "
+ << argsmap << LL_ENDL;
+ }
+ // Initialize the args array. Indexing a non-const LLSD array grows it
+ // to appropriate size, but we don't want to resize this one on each
+ // new operation. Just make it as big as we need before we start
+ // stuffing values into it.
+ LLSD args(LLSD::emptyArray());
+ if (_defaults.size() == 0)
+ {
+ // If this function requires no arguments, fast exit. (Don't try to
+ // assign to args[-1].)
+ return args;
+ }
+ args[_defaults.size() - 1] = LLSD();
+
+ // Get a vector of chars to indicate holes. It's tempting to just scan
+ // for LLSD::isUndefined() values after filling the args array from
+ // the map, but it's plausible for caller to explicitly pass
+ // isUndefined() as the value of some parameter name. That's legal
+ // since isUndefined() has well-defined conversions (default value)
+ // for LLSD data types. So use a whole separate array for detecting
+ // holes. (Avoid std::vector<bool> which is known to be odd -- can we
+ // iterate?)
+ FilledVector filled(args.size());
+
+ if (argsmap.isArray())
+ {
+ // Fill args from array. If there are too many args in passed array,
+ // ignore the rest.
+ LLSD::Integer size(argsmap.size());
+ if (size > args.size())
+ {
+ // We don't just use std::min() because we want to sneak in this
+ // warning if caller passes too many args.
+ LL_WARNS("LLSDArgsMapper") << _function << " needs " << args.size()
+ << " params, ignoring last " << (size - args.size())
+ << " of passed " << size << ": " << argsmap << LL_ENDL;
+ size = args.size();
+ }
+ for (LLSD::Integer i(0); i < size; ++i)
+ {
+ // Copy the actual argument from argsmap
+ args[i] = argsmap[i];
+ // Note that it's been filled
+ filled[i] = 1;
+ }
+ }
+ else
+ {
+ // argsmap is in fact a map. Walk the map.
+ for (LLSD::map_const_iterator mi(argsmap.beginMap()), mend(argsmap.endMap());
+ mi != mend; ++mi)
+ {
+ // mi->first is a parameter-name string, with mi->second its
+ // value. Look up the name's position index in _indexes.
+ IndexMap::const_iterator ixit(_indexes.find(mi->first));
+ if (ixit == _indexes.end())
+ {
+ // Allow for a map containing more params than were passed in
+ // our names array. Caller typically receives a map containing
+ // the function name, cruft such as reqid, etc. Ignore keys
+ // not defined in _indexes.
+ LL_DEBUGS("LLSDArgsMapper") << _function << " ignoring "
+ << mi->first << "=" << mi->second << LL_ENDL;
+ continue;
+ }
+ LLSD::Integer pos = ixit->second;
+ // Store the value at that position in the args array.
+ args[pos] = mi->second;
+ // Don't forget to record the fact that we've filled this
+ // position.
+ filled[pos] = 1;
+ }
+ }
+
+ // Fill any remaining holes from _defaults.
+ LLSD unfilled(LLSD::emptyArray());
+ for (LLSD::Integer i = 0, iend = args.size(); i < iend; ++i)
+ {
+ if (! filled[i])
+ {
+ // If there's no default value for this parameter, that's an
+ // error.
+ if (! _has_dft[i])
+ {
+ unfilled.append(_names[i]);
+ }
+ else
+ {
+ args[i] = _defaults[i];
+ }
+ }
+ }
+ // If any required args -- args without defaults -- were left unfilled
+ // by argsmap, that's a problem.
+ if (unfilled.size())
+ {
+ LL_ERRS("LLSDArgsMapper") << _function << " missing required arguments "
+ << formatlist(unfilled) << " from " << argsmap << LL_ENDL;
+ }
+
+ // done
+ return args;
+}
+
+std::string LLSDArgsMapper::formatlist(const LLSD& list)
+{
+ std::ostringstream out;
+ const char* delim = "";
+ for (LLSD::array_const_iterator li(list.beginArray()), lend(list.endArray());
+ li != lend; ++li)
+ {
+ out << delim << li->asString();
+ delim = ", ";
+ }
+ return out.str();
+}
LLEventDispatcher::LLEventDispatcher(const std::string& desc, const std::string& key):
mDesc(desc),
@@ -52,12 +400,181 @@ LLEventDispatcher::~LLEventDispatcher()
{
}
+/**
+ * DispatchEntry subclass used for callables accepting(const LLSD&)
+ */
+struct LLEventDispatcher::LLSDDispatchEntry: public LLEventDispatcher::DispatchEntry
+{
+ LLSDDispatchEntry(const std::string& desc, const Callable& func, const LLSD& required):
+ DispatchEntry(desc),
+ mFunc(func),
+ mRequired(required)
+ {}
+
+ Callable mFunc;
+ LLSD mRequired;
+
+ virtual void call(const std::string& desc, const LLSD& event) const
+ {
+ // Validate the syntax of the event itself.
+ std::string mismatch(llsd_matches(mRequired, event));
+ if (! mismatch.empty())
+ {
+ LL_ERRS("LLEventDispatcher") << desc << ": bad request: " << mismatch << LL_ENDL;
+ }
+ // Event syntax looks good, go for it!
+ mFunc(event);
+ }
+
+ virtual LLSD addMetadata(LLSD meta) const
+ {
+ meta["required"] = mRequired;
+ return meta;
+ }
+};
+
+/**
+ * DispatchEntry subclass for passing LLSD to functions accepting
+ * arbitrary argument types (convertible via LLSDParam)
+ */
+struct LLEventDispatcher::ParamsDispatchEntry: public LLEventDispatcher::DispatchEntry
+{
+ ParamsDispatchEntry(const std::string& desc, const invoker_function& func):
+ DispatchEntry(desc),
+ mInvoker(func)
+ {}
+
+ invoker_function mInvoker;
+
+ virtual void call(const std::string& desc, const LLSD& event) const
+ {
+ LLSDArgsSource src(desc, event);
+ mInvoker(boost::bind(&LLSDArgsSource::next, boost::ref(src)));
+ }
+};
+
+/**
+ * DispatchEntry subclass for dispatching LLSD::Array to functions accepting
+ * arbitrary argument types (convertible via LLSDParam)
+ */
+struct LLEventDispatcher::ArrayParamsDispatchEntry: public LLEventDispatcher::ParamsDispatchEntry
+{
+ ArrayParamsDispatchEntry(const std::string& desc, const invoker_function& func,
+ LLSD::Integer arity):
+ ParamsDispatchEntry(desc, func),
+ mArity(arity)
+ {}
+
+ LLSD::Integer mArity;
+
+ virtual LLSD addMetadata(LLSD meta) const
+ {
+ LLSD array(LLSD::emptyArray());
+ // Resize to number of arguments required
+ if (mArity)
+ array[mArity - 1] = LLSD();
+ llassert_always(array.size() == mArity);
+ meta["required"] = array;
+ return meta;
+ }
+};
+
+/**
+ * DispatchEntry subclass for dispatching LLSD::Map to functions accepting
+ * arbitrary argument types (convertible via LLSDParam)
+ */
+struct LLEventDispatcher::MapParamsDispatchEntry: public LLEventDispatcher::ParamsDispatchEntry
+{
+ MapParamsDispatchEntry(const std::string& name, const std::string& desc,
+ const invoker_function& func,
+ const LLSD& params, const LLSD& defaults):
+ ParamsDispatchEntry(desc, func),
+ mMapper(name, params, defaults),
+ mRequired(LLSD::emptyMap())
+ {
+ // Build the set of all param keys, then delete the ones that are
+ // optional. What's left are the ones that are required.
+ for (LLSD::array_const_iterator pi(params.beginArray()), pend(params.endArray());
+ pi != pend; ++pi)
+ {
+ mRequired[pi->asString()] = LLSD();
+ }
+
+ if (defaults.isArray() || defaults.isUndefined())
+ {
+ // Right-align the params and defaults arrays.
+ LLSD::Integer offset = params.size() - defaults.size();
+ // Now the name of every defaults[i] is at params[i + offset].
+ for (LLSD::Integer i(0), iend(defaults.size()); i < iend; ++i)
+ {
+ // Erase this optional param from mRequired.
+ mRequired.erase(params[i + offset].asString());
+ // Instead, make an entry in mOptional with the default
+ // param's name and value.
+ mOptional[params[i + offset].asString()] = defaults[i];
+ }
+ }
+ else if (defaults.isMap())
+ {
+ // if defaults is already a map, then it's already in the form we
+ // intend to deliver in metadata
+ mOptional = defaults;
+ // Just delete from mRequired every key appearing in mOptional.
+ for (LLSD::map_const_iterator mi(mOptional.beginMap()), mend(mOptional.endMap());
+ mi != mend; ++mi)
+ {
+ mRequired.erase(mi->first);
+ }
+ }
+ }
+
+ LLSDArgsMapper mMapper;
+ LLSD mRequired;
+ LLSD mOptional;
+
+ virtual void call(const std::string& desc, const LLSD& event) const
+ {
+ // Just convert from LLSD::Map to LLSD::Array using mMapper, then pass
+ // to base-class call() method.
+ ParamsDispatchEntry::call(desc, mMapper.map(event));
+ }
+
+ virtual LLSD addMetadata(LLSD meta) const
+ {
+ meta["required"] = mRequired;
+ meta["optional"] = mOptional;
+ return meta;
+ }
+};
+
+void LLEventDispatcher::addArrayParamsDispatchEntry(const std::string& name,
+ const std::string& desc,
+ const invoker_function& invoker,
+ LLSD::Integer arity)
+{
+ mDispatch.insert(
+ DispatchMap::value_type(name, DispatchMap::mapped_type(
+ new ArrayParamsDispatchEntry(desc, invoker, arity))));
+}
+
+void LLEventDispatcher::addMapParamsDispatchEntry(const std::string& name,
+ const std::string& desc,
+ const invoker_function& invoker,
+ const LLSD& params,
+ const LLSD& defaults)
+{
+ mDispatch.insert(
+ DispatchMap::value_type(name, DispatchMap::mapped_type(
+ new MapParamsDispatchEntry(name, desc, invoker, params, defaults))));
+}
+
/// Register a callable by name
void LLEventDispatcher::add(const std::string& name, const std::string& desc,
const Callable& callable, const LLSD& required)
{
- mDispatch.insert(DispatchMap::value_type(name,
- DispatchMap::mapped_type(callable, desc, required)));
+ mDispatch.insert(
+ DispatchMap::value_type(name, DispatchMap::mapped_type(
+ new LLSDDispatchEntry(desc, callable, required))));
}
void LLEventDispatcher::addFail(const std::string& name, const std::string& classname) const
@@ -83,7 +600,7 @@ bool LLEventDispatcher::remove(const std::string& name)
/// such callable exists, die with LL_ERRS.
void LLEventDispatcher::operator()(const std::string& name, const LLSD& event) const
{
- if (! attemptCall(name, event))
+ if (! try_call(name, event))
{
LL_ERRS("LLEventDispatcher") << "LLEventDispatcher(" << mDesc << "): '" << name
<< "' not found" << LL_ENDL;
@@ -98,44 +615,29 @@ void LLEventDispatcher::operator()(const LLSD& event) const
// This could/should be implemented in terms of the two-arg overload.
// However -- we can produce a more informative error message.
std::string name(event[mKey]);
- if (! attemptCall(name, event))
+ if (! try_call(name, event))
{
LL_ERRS("LLEventDispatcher") << "LLEventDispatcher(" << mDesc << "): bad " << mKey
<< " value '" << name << "'" << LL_ENDL;
}
}
-bool LLEventDispatcher::attemptCall(const std::string& name, const LLSD& event) const
+bool LLEventDispatcher::try_call(const LLSD& event) const
{
- DispatchMap::const_iterator found = mDispatch.find(name);
- if (found == mDispatch.end())
- {
- // The reason we only return false, leaving it up to our caller to die
- // with LL_ERRS, is that different callers have different amounts of
- // available information.
- return false;
- }
- // Found the name, so it's plausible to even attempt the call. But first,
- // validate the syntax of the event itself.
- std::string mismatch(llsd_matches(found->second.mRequired, event));
- if (! mismatch.empty())
- {
- LL_ERRS("LLEventDispatcher") << "LLEventDispatcher(" << mDesc << ") calling '" << name
- << "': bad request: " << mismatch << LL_ENDL;
- }
- // Event syntax looks good, go for it!
- (found->second.mFunc)(event);
- return true; // tell caller we were able to call
+ return try_call(event[mKey], event);
}
-LLEventDispatcher::Callable LLEventDispatcher::get(const std::string& name) const
+bool LLEventDispatcher::try_call(const std::string& name, const LLSD& event) const
{
DispatchMap::const_iterator found = mDispatch.find(name);
if (found == mDispatch.end())
{
- return Callable();
+ return false;
}
- return found->second.mFunc;
+ // Found the name, so it's plausible to even attempt the call.
+ found->second->call(STRINGIZE("LLEventDispatcher(" << mDesc << ") calling '" << name << "'"),
+ event);
+ return true; // tell caller we were able to call
}
LLSD LLEventDispatcher::getMetadata(const std::string& name) const
@@ -147,9 +649,8 @@ LLSD LLEventDispatcher::getMetadata(const std::string& name) const
}
LLSD meta;
meta["name"] = name;
- meta["desc"] = found->second.mDesc;
- meta["required"] = found->second.mRequired;
- return meta;
+ meta["desc"] = found->second->mDesc;
+ return found->second->addMetadata(meta);
}
LLDispatchListener::LLDispatchListener(const std::string& pumpname, const std::string& key):
@@ -164,3 +665,8 @@ bool LLDispatchListener::process(const LLSD& event)
(*this)(event);
return false;
}
+
+LLEventDispatcher::DispatchEntry::DispatchEntry(const std::string& desc):
+ mDesc(desc)
+{}
+
diff --git a/indra/llcommon/lleventdispatcher.h b/indra/llcommon/lleventdispatcher.h
index dfffd59eb6..7acc61de4e 100644
--- a/indra/llcommon/lleventdispatcher.h
+++ b/indra/llcommon/lleventdispatcher.h
@@ -27,18 +27,56 @@
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
+ *
+ * The invoker machinery that constructs a boost::fusion argument list for use
+ * with boost::fusion::invoke() is derived from
+ * http://www.boost.org/doc/libs/1_45_0/libs/function_types/example/interpreter.hpp
+ * whose license information is copied below:
+ *
+ * "(C) Copyright Tobias Schwinger
+ *
+ * Use modification and distribution are subject to the boost Software License,
+ * Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt)."
*/
#if ! defined(LL_LLEVENTDISPATCHER_H)
#define LL_LLEVENTDISPATCHER_H
+// nil is too generic a term to be allowed to be a global macro. In
+// particular, boost::fusion defines a 'class nil' (properly encapsulated in a
+// namespace) that a global 'nil' macro breaks badly.
+#if defined(nil)
+// Capture the value of the macro 'nil', hoping int is an appropriate type.
+static const int nil_(nil);
+// Now forget the macro.
+#undef nil
+// Finally, reintroduce 'nil' as a properly-scoped alias for the previously-
+// defined const 'nil_'. Make it static since otherwise it produces duplicate-
+// symbol link errors later.
+static const int& nil(nil_);
+#endif
+
#include <string>
-#include <map>
+#include <boost/shared_ptr.hpp>
#include <boost/function.hpp>
#include <boost/bind.hpp>
#include <boost/iterator/transform_iterator.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <boost/function_types/is_nonmember_callable_builtin.hpp>
+#include <boost/function_types/parameter_types.hpp>
+#include <boost/function_types/function_arity.hpp>
+#include <boost/type_traits/remove_cv.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+#include <boost/fusion/include/push_back.hpp>
+#include <boost/fusion/include/cons.hpp>
+#include <boost/fusion/include/invoke.hpp>
+#include <boost/mpl/begin.hpp>
+#include <boost/mpl/end.hpp>
+#include <boost/mpl/next.hpp>
+#include <boost/mpl/deref.hpp>
#include <typeinfo>
#include "llevents.h"
+#include "llsdutil.h"
class LLSD;
@@ -54,12 +92,18 @@ public:
LLEventDispatcher(const std::string& desc, const std::string& key);
virtual ~LLEventDispatcher();
- /// Accept any C++ callable, typically a boost::bind() expression
+ /// @name Register functions accepting(const LLSD&)
+ //@{
+
+ /// Accept any C++ callable with the right signature, typically a
+ /// boost::bind() expression
typedef boost::function<void(const LLSD&)> Callable;
/**
- * Register a @a callable by @a name. The optional @a required parameter
- * is used to validate the structure of each incoming event (see
+ * Register a @a callable by @a name. The passed @a callable accepts a
+ * single LLSD value and uses it in any way desired, e.g. extract
+ * parameters and call some other function. The optional @a required
+ * parameter is used to validate the structure of each incoming event (see
* llsd_matches()).
*/
void add(const std::string& name,
@@ -68,9 +112,23 @@ public:
const LLSD& required=LLSD());
/**
+ * The case of a free function (or static method) accepting(const LLSD&)
+ * could also be intercepted by the arbitrary-args overload below. Ensure
+ * that it's directed to the Callable overload above instead.
+ */
+ void add(const std::string& name,
+ const std::string& desc,
+ void (*f)(const LLSD&),
+ const LLSD& required=LLSD())
+ {
+ add(name, desc, Callable(f), required);
+ }
+
+ /**
* Special case: a subclass of this class can pass an unbound member
- * function pointer without explicitly specifying the
- * <tt>boost::bind()</tt> expression.
+ * function pointer (of an LLEventDispatcher subclass) without explicitly
+ * specifying the <tt>boost::bind()</tt> expression. The passed @a method
+ * accepts a single LLSD value, presumably containing other parameters.
*/
template <class CLASS>
void add(const std::string& name,
@@ -81,7 +139,8 @@ public:
addMethod<CLASS>(name, desc, method, required);
}
- /// Overload for both const and non-const methods
+ /// Overload for both const and non-const methods. The passed @a method
+ /// accepts a single LLSD value, presumably containing other parameters.
template <class CLASS>
void add(const std::string& name,
const std::string& desc,
@@ -91,15 +150,106 @@ public:
addMethod<CLASS>(name, desc, method, required);
}
- /// Convenience: for LLEventDispatcher, not every callable needs a
- /// documentation string.
- template <typename CALLABLE>
- void add(const std::string& name,
- CALLABLE callable,
- const LLSD& required=LLSD())
- {
- add(name, "", callable, required);
- }
+ //@}
+
+ /// @name Register functions with arbitrary param lists
+ //@{
+
+ /**
+ * Register a free function with arbitrary parameters. (This also works
+ * for static class methods.)
+ *
+ * @note This supports functions with up to about 6 parameters -- after
+ * that you start getting dismaying compile errors in which
+ * boost::fusion::joint_view is mentioned a surprising number of times.
+ *
+ * When calling this name, pass an LLSD::Array. Each entry in turn will be
+ * converted to the corresponding parameter type using LLSDParam.
+ */
+ template<typename Function>
+ typename boost::enable_if< boost::function_types::is_nonmember_callable_builtin<Function>
+ >::type add(const std::string& name,
+ const std::string& desc,
+ Function f);
+
+ /**
+ * Register a nonstatic class method with arbitrary parameters.
+ *
+ * @note This supports functions with up to about 6 parameters -- after
+ * that you start getting dismaying compile errors in which
+ * boost::fusion::joint_view is mentioned a surprising number of times.
+ *
+ * To cover cases such as a method on an LLSingleton we don't yet want to
+ * instantiate, instead of directly storing an instance pointer, accept a
+ * nullary callable returning a pointer/reference to the desired class
+ * instance. If you already have an instance in hand,
+ * boost::lambda::var(instance) or boost::lambda::constant(instance_ptr)
+ * produce suitable callables.
+ *
+ * When calling this name, pass an LLSD::Array. Each entry in turn will be
+ * converted to the corresponding parameter type using LLSDParam.
+ */
+ template<typename Method, typename InstanceGetter>
+ typename boost::enable_if< boost::function_types::is_member_function_pointer<Method>
+ >::type add(const std::string& name,
+ const std::string& desc,
+ Method f,
+ const InstanceGetter& getter);
+
+ /**
+ * Register a free function with arbitrary parameters. (This also works
+ * for static class methods.)
+ *
+ * @note This supports functions with up to about 6 parameters -- after
+ * that you start getting dismaying compile errors in which
+ * boost::fusion::joint_view is mentioned a surprising number of times.
+ *
+ * Pass an LLSD::Array of parameter names, and optionally another
+ * LLSD::Array of default parameter values, a la LLSDArgsMapper.
+ *
+ * When calling this name, pass an LLSD::Map. We will internally generate
+ * an LLSD::Array using LLSDArgsMapper and then convert each entry in turn
+ * to the corresponding parameter type using LLSDParam.
+ */
+ template<typename Function>
+ typename boost::enable_if< boost::function_types::is_nonmember_callable_builtin<Function>
+ >::type add(const std::string& name,
+ const std::string& desc,
+ Function f,
+ const LLSD& params,
+ const LLSD& defaults=LLSD());
+
+ /**
+ * Register a nonstatic class method with arbitrary parameters.
+ *
+ * @note This supports functions with up to about 6 parameters -- after
+ * that you start getting dismaying compile errors in which
+ * boost::fusion::joint_view is mentioned a surprising number of times.
+ *
+ * To cover cases such as a method on an LLSingleton we don't yet want to
+ * instantiate, instead of directly storing an instance pointer, accept a
+ * nullary callable returning a pointer/reference to the desired class
+ * instance. If you already have an instance in hand,
+ * boost::lambda::var(instance) or boost::lambda::constant(instance_ptr)
+ * produce suitable callables.
+ *
+ * Pass an LLSD::Array of parameter names, and optionally another
+ * LLSD::Array of default parameter values, a la LLSDArgsMapper.
+ *
+ * When calling this name, pass an LLSD::Map. We will internally generate
+ * an LLSD::Array using LLSDArgsMapper and then convert each entry in turn
+ * to the corresponding parameter type using LLSDParam.
+ */
+ template<typename Method, typename InstanceGetter>
+ typename boost::enable_if< boost::function_types::is_member_function_pointer<Method>
+ >::type add(const std::string& name,
+ const std::string& desc,
+ Method f,
+ const InstanceGetter& getter,
+ const LLSD& params,
+ const LLSD& defaults=LLSD());
+
+ //@}
/// Unregister a callable
bool remove(const std::string& name);
@@ -109,12 +259,25 @@ public:
/// the @a required prototype specified at add() time, die with LL_ERRS.
void operator()(const std::string& name, const LLSD& event) const;
+ /// Call a registered callable with an explicitly-specified name and
+ /// return <tt>true</tt>. If no such callable exists, return
+ /// <tt>false</tt>. If the @a event fails to match the @a required
+ /// prototype specified at add() time, die with LL_ERRS.
+ bool try_call(const std::string& name, const LLSD& event) const;
+
/// Extract the @a key value from the incoming @a event, and call the
/// callable whose name is specified by that map @a key. If no such
/// callable exists, die with LL_ERRS. If the @a event fails to match the
/// @a required prototype specified at add() time, die with LL_ERRS.
void operator()(const LLSD& event) const;
+ /// Extract the @a key value from the incoming @a event, call the callable
+ /// whose name is specified by that map @a key and return <tt>true</tt>.
+ /// If no such callable exists, return <tt>false</tt>. If the @a event
+ /// fails to match the @a required prototype specified at add() time, die
+ /// with LL_ERRS.
+ bool try_call(const LLSD& event) const;
+
/// @name Iterate over defined names
//@{
typedef std::pair<std::string, std::string> NameDesc;
@@ -122,16 +285,22 @@ public:
private:
struct DispatchEntry
{
- DispatchEntry(const Callable& func, const std::string& desc, const LLSD& required):
- mFunc(func),
- mDesc(desc),
- mRequired(required)
- {}
- Callable mFunc;
+ DispatchEntry(const std::string& desc);
+ virtual ~DispatchEntry() {} // suppress MSVC warning, sigh
+
std::string mDesc;
- LLSD mRequired;
+
+ virtual void call(const std::string& desc, const LLSD& event) const = 0;
+ virtual LLSD addMetadata(LLSD) const = 0;
};
- typedef std::map<std::string, DispatchEntry> DispatchMap;
+ // Tried using boost::ptr_map<std::string, DispatchEntry>, but ptr_map<>
+ // wants its value type to be "clonable," even just to dereference an
+ // iterator. I don't want to clone entries -- if I have to copy an entry
+ // around, I want it to continue pointing to the same DispatchEntry
+ // subclass object. However, I definitely want DispatchMap to destroy
+ // DispatchEntry if no references are outstanding at the time an entry is
+ // removed. This looks like a job for boost::shared_ptr.
+ typedef std::map<std::string, boost::shared_ptr<DispatchEntry> > DispatchMap;
public:
/// We want the flexibility to redefine what data we store per name,
@@ -149,10 +318,6 @@ public:
}
//@}
- /// Fetch the Callable for the specified name. If no such name was
- /// registered, return an empty() Callable.
- Callable get(const std::string& name) const;
-
/// Get information about a specific Callable
LLSD getMetadata(const std::string& name) const;
@@ -175,18 +340,184 @@ private:
}
}
void addFail(const std::string& name, const std::string& classname) const;
- /// try to dispatch, return @c true if success
- bool attemptCall(const std::string& name, const LLSD& event) const;
std::string mDesc, mKey;
DispatchMap mDispatch;
static NameDesc makeNameDesc(const DispatchMap::value_type& item)
{
- return NameDesc(item.first, item.second.mDesc);
+ return NameDesc(item.first, item.second->mDesc);
+ }
+
+ struct LLSDDispatchEntry;
+ struct ParamsDispatchEntry;
+ struct ArrayParamsDispatchEntry;
+ struct MapParamsDispatchEntry;
+
+ // Step 2 of parameter analysis. Instantiating invoker<some_function_type>
+ // implicitly sets its From and To parameters to the (compile time) begin
+ // and end iterators over that function's parameter types.
+ template< typename Function
+ , class From = typename boost::mpl::begin< boost::function_types::parameter_types<Function> >::type
+ , class To = typename boost::mpl::end< boost::function_types::parameter_types<Function> >::type
+ >
+ struct invoker;
+
+ // deliver LLSD arguments one at a time
+ typedef boost::function<LLSD()> args_source;
+ // obtain args from an args_source to build param list and call target
+ // function
+ typedef boost::function<void(const args_source&)> invoker_function;
+
+ template <typename Function>
+ invoker_function make_invoker(Function f);
+ template <typename Method, typename InstanceGetter>
+ invoker_function make_invoker(Method f, const InstanceGetter& getter);
+ void addArrayParamsDispatchEntry(const std::string& name,
+ const std::string& desc,
+ const invoker_function& invoker,
+ LLSD::Integer arity);
+ void addMapParamsDispatchEntry(const std::string& name,
+ const std::string& desc,
+ const invoker_function& invoker,
+ const LLSD& params,
+ const LLSD& defaults);
+};
+
+/*****************************************************************************
+* LLEventDispatcher template implementation details
+*****************************************************************************/
+// Step 3 of parameter analysis, the recursive case.
+template<typename Function, class From, class To>
+struct LLEventDispatcher::invoker
+{
+ template<typename T>
+ struct remove_cv_ref
+ : boost::remove_cv< typename boost::remove_reference<T>::type >
+ { };
+
+ // apply() accepts an arbitrary boost::fusion sequence as args. It
+ // examines the next parameter type in the parameter-types sequence
+ // bounded by From and To, obtains the next LLSD object from the passed
+ // args_source and constructs an LLSDParam of appropriate type to try
+ // to convert the value. It then recurs with the next parameter-types
+ // iterator, passing the args sequence thus far.
+ template<typename Args>
+ static inline
+ void apply(Function func, const args_source& argsrc, Args const & args)
+ {
+ typedef typename boost::mpl::deref<From>::type arg_type;
+ typedef typename boost::mpl::next<From>::type next_iter_type;
+ typedef typename remove_cv_ref<arg_type>::type plain_arg_type;
+
+ invoker<Function, next_iter_type, To>::apply
+ ( func, argsrc, boost::fusion::push_back(args, LLSDParam<plain_arg_type>(argsrc())));
+ }
+
+ // Special treatment for instance (first) parameter of a non-static member
+ // function. Accept the instance-getter callable, calling that to produce
+ // the first args value. Since we know we're at the top of the recursion
+ // chain, we need not also require a partial args sequence from our caller.
+ template <typename InstanceGetter>
+ static inline
+ void method_apply(Function func, const args_source& argsrc, const InstanceGetter& getter)
+ {
+ typedef typename boost::mpl::next<From>::type next_iter_type;
+
+ // Instead of grabbing the first item from argsrc and making an
+ // LLSDParam of it, call getter() and pass that as the instance param.
+ invoker<Function, next_iter_type, To>::apply
+ ( func, argsrc, boost::fusion::push_back(boost::fusion::nil(), boost::ref(getter())));
+ }
+};
+
+// Step 4 of parameter analysis, the leaf case. When the general
+// invoker<Function, From, To> logic has advanced From until it matches To,
+// the compiler will pick this template specialization.
+template<typename Function, class To>
+struct LLEventDispatcher::invoker<Function,To,To>
+{
+ // the argument list is complete, now call the function
+ template<typename Args>
+ static inline
+ void apply(Function func, const args_source&, Args const & args)
+ {
+ boost::fusion::invoke(func, args);
}
};
+template<typename Function>
+typename boost::enable_if< boost::function_types::is_nonmember_callable_builtin<Function> >::type
+LLEventDispatcher::add(const std::string& name, const std::string& desc, Function f)
+{
+ // Construct an invoker_function, a callable accepting const args_source&.
+ // Add to DispatchMap an ArrayParamsDispatchEntry that will handle the
+ // caller's LLSD::Array.
+ addArrayParamsDispatchEntry(name, desc, make_invoker(f),
+ boost::function_types::function_arity<Function>::value);
+}
+
+template<typename Method, typename InstanceGetter>
+typename boost::enable_if< boost::function_types::is_member_function_pointer<Method> >::type
+LLEventDispatcher::add(const std::string& name, const std::string& desc, Method f,
+ const InstanceGetter& getter)
+{
+ // Subtract 1 from the compile-time arity because the getter takes care of
+ // the first parameter. We only need (arity - 1) additional arguments.
+ addArrayParamsDispatchEntry(name, desc, make_invoker(f, getter),
+ boost::function_types::function_arity<Method>::value - 1);
+}
+
+template<typename Function>
+typename boost::enable_if< boost::function_types::is_nonmember_callable_builtin<Function> >::type
+LLEventDispatcher::add(const std::string& name, const std::string& desc, Function f,
+ const LLSD& params, const LLSD& defaults)
+{
+ // See comments for previous is_nonmember_callable_builtin add().
+ addMapParamsDispatchEntry(name, desc, make_invoker(f), params, defaults);
+}
+
+template<typename Method, typename InstanceGetter>
+typename boost::enable_if< boost::function_types::is_member_function_pointer<Method> >::type
+LLEventDispatcher::add(const std::string& name, const std::string& desc, Method f,
+ const InstanceGetter& getter,
+ const LLSD& params, const LLSD& defaults)
+{
+ addMapParamsDispatchEntry(name, desc, make_invoker(f, getter), params, defaults);
+}
+
+template <typename Function>
+LLEventDispatcher::invoker_function
+LLEventDispatcher::make_invoker(Function f)
+{
+ // Step 1 of parameter analysis, the top of the recursion. Passing a
+ // suitable f (see add()'s enable_if condition) to this method causes it
+ // to infer the function type; specifying that function type to invoker<>
+ // causes it to fill in the begin/end MPL iterators over the function's
+ // list of parameter types.
+ // While normally invoker::apply() could infer its template type from the
+ // boost::fusion::nil parameter value, here we must be explicit since
+ // we're boost::bind()ing it rather than calling it directly.
+ return boost::bind(&invoker<Function>::template apply<boost::fusion::nil>,
+ f,
+ _1,
+ boost::fusion::nil());
+}
+
+template <typename Method, typename InstanceGetter>
+LLEventDispatcher::invoker_function
+LLEventDispatcher::make_invoker(Method f, const InstanceGetter& getter)
+{
+ // Use invoker::method_apply() to treat the instance (first) arg specially.
+ return boost::bind(&invoker<Method>::template method_apply<InstanceGetter>,
+ f,
+ _1,
+ getter);
+}
+
+/*****************************************************************************
+* LLDispatchListener
+*****************************************************************************/
/**
* Bundle an LLEventPump and a listener with an LLEventDispatcher. A class
* that contains (or derives from) LLDispatchListener need only specify the
diff --git a/indra/llcommon/llevents.cpp b/indra/llcommon/llevents.cpp
index 84a6620a77..0855180dcd 100644
--- a/indra/llcommon/llevents.cpp
+++ b/indra/llcommon/llevents.cpp
@@ -430,13 +430,13 @@ LLBoundListener LLEventPump::listen_impl(const std::string& name, const LLEventL
{
// The new node isn't last. Place it between the previous node and
// the successor.
- newNode = (myprev + mydmi->second)/2.0;
+ newNode = (myprev + mydmi->second)/2.f;
}
else
{
// The new node is last. Bump myprev up to the next integer, add
// 1.0 and use that.
- newNode = std::ceil(myprev) + 1.0;
+ newNode = std::ceil(myprev) + 1.f;
}
// Now that newNode has a value that places it appropriately in mSignal,
// connect it.
@@ -475,7 +475,7 @@ void LLEventPump::stopListening(const std::string& name)
*****************************************************************************/
bool LLEventStream::post(const LLSD& event)
{
- if (! mEnabled)
+ if (! mEnabled || !mSignal)
{
return false;
}
@@ -515,6 +515,8 @@ bool LLEventQueue::post(const LLSD& event)
void LLEventQueue::flush()
{
+ if(!mSignal) return;
+
// Consider the case when a given listener on this LLEventQueue posts yet
// another event on the same queue. If we loop over mEventQueue directly,
// we'll end up processing all those events during the same flush() call
@@ -586,3 +588,27 @@ void LLReqID::stamp(LLSD& response) const
}
response["reqid"] = mReqid;
}
+
+bool sendReply(const LLSD& reply, const LLSD& request, const std::string& replyKey)
+{
+ // If the original request has no value for replyKey, it's pointless to
+ // construct or send a reply event: on which LLEventPump should we send
+ // it? Allow that to be optional: if the caller wants to require replyKey,
+ // it can so specify when registering the operation method.
+ if (! request.has(replyKey))
+ {
+ return false;
+ }
+
+ // Here the request definitely contains replyKey; reasonable to proceed.
+
+ // Copy 'reply' to modify it.
+ LLSD newreply(reply);
+ // Get the ["reqid"] element from request
+ LLReqID reqID(request);
+ // and copy it to 'newreply'.
+ reqID.stamp(newreply);
+ // Send reply on LLEventPump named in request[replyKey]. Don't forget to
+ // send the modified 'newreply' instead of the original 'reply'.
+ return LLEventPumps::instance().obtain(request[replyKey]).post(newreply);
+}
diff --git a/indra/llcommon/llevents.h b/indra/llcommon/llevents.h
index 2491cf1371..65b0fef354 100644
--- a/indra/llcommon/llevents.h
+++ b/indra/llcommon/llevents.h
@@ -692,6 +692,20 @@ private:
};
/**
+ * Conventionally send a reply to a request event.
+ *
+ * @a reply is the LLSD reply event to send
+ * @a request is the corresponding LLSD request event
+ * @a replyKey is the key in the @a request event, conventionally ["reply"],
+ * whose value is the name of the LLEventPump on which to send the reply.
+ *
+ * Before sending the reply event, sendReply() copies the ["reqid"] item from
+ * the request to the reply.
+ */
+LL_COMMON_API bool sendReply(const LLSD& reply, const LLSD& request,
+ const std::string& replyKey="reply");
+
+/**
* Base class for LLListenerWrapper. See visit_and_connect() and llwrap(). We
* provide virtual @c accept_xxx() methods, customization points allowing a
* subclass access to certain data visible at LLEventPump::listen() time.
diff --git a/indra/llcommon/lleventtimer.cpp b/indra/llcommon/lleventtimer.cpp
index 7743826c60..0d96e03da4 100644
--- a/indra/llcommon/lleventtimer.cpp
+++ b/indra/llcommon/lleventtimer.cpp
@@ -58,19 +58,15 @@ LLEventTimer::~LLEventTimer()
void LLEventTimer::updateClass()
{
std::list<LLEventTimer*> completed_timers;
-
+ for (instance_iter iter = beginInstances(); iter != endInstances(); )
{
- LLInstanceTrackerScopedGuard guard;
- for (instance_iter iter = guard.beginInstances(); iter != guard.endInstances(); )
- {
- LLEventTimer& timer = *iter++;
- F32 et = timer.mEventTimer.getElapsedTimeF32();
- if (timer.mEventTimer.getStarted() && et > timer.mPeriod) {
- timer.mEventTimer.reset();
- if ( timer.tick() )
- {
- completed_timers.push_back( &timer );
- }
+ LLEventTimer& timer = *iter++;
+ F32 et = timer.mEventTimer.getElapsedTimeF32();
+ if (timer.mEventTimer.getStarted() && et > timer.mPeriod) {
+ timer.mEventTimer.reset();
+ if ( timer.tick() )
+ {
+ completed_timers.push_back( &timer );
}
}
}
diff --git a/indra/llcommon/llfasttimer.h b/indra/llcommon/llfasttimer.h
index 4ff93a553c..2b25f2fabb 100644
--- a/indra/llcommon/llfasttimer.h
+++ b/indra/llcommon/llfasttimer.h
@@ -27,140 +27,9 @@
#ifndef LL_FASTTIMER_H
#define LL_FASTTIMER_H
+// Implementation of getCPUClockCount32() and getCPUClockCount64 are now in llfastertimer_class.cpp.
+
// pull in the actual class definition
#include "llfasttimer_class.h"
-//
-// Important note: These implementations must be FAST!
-//
-
-#if LL_WINDOWS
-//
-// Windows implementation of CPU clock
-//
-
-//
-// NOTE: put back in when we aren't using platform sdk anymore
-//
-// because MS has different signatures for these functions in winnt.h
-// need to rename them to avoid conflicts
-//#define _interlockedbittestandset _renamed_interlockedbittestandset
-//#define _interlockedbittestandreset _renamed_interlockedbittestandreset
-//#include <intrin.h>
-//#undef _interlockedbittestandset
-//#undef _interlockedbittestandreset
-
-//inline U32 LLFastTimer::getCPUClockCount32()
-//{
-// U64 time_stamp = __rdtsc();
-// return (U32)(time_stamp >> 8);
-//}
-//
-//// return full timer value, *not* shifted by 8 bits
-//inline U64 LLFastTimer::getCPUClockCount64()
-//{
-// return __rdtsc();
-//}
-
-// shift off lower 8 bits for lower resolution but longer term timing
-// on 1Ghz machine, a 32-bit word will hold ~1000 seconds of timing
-inline U32 LLFastTimer::getCPUClockCount32()
-{
- U32 ret_val;
- __asm
- {
- _emit 0x0f
- _emit 0x31
- shr eax,8
- shl edx,24
- or eax, edx
- mov dword ptr [ret_val], eax
- }
- return ret_val;
-}
-
-// return full timer value, *not* shifted by 8 bits
-inline U64 LLFastTimer::getCPUClockCount64()
-{
- U64 ret_val;
- __asm
- {
- _emit 0x0f
- _emit 0x31
- mov eax,eax
- mov edx,edx
- mov dword ptr [ret_val+4], edx
- mov dword ptr [ret_val], eax
- }
- return ret_val;
-}
-#endif
-
-
-#if (LL_LINUX || LL_SOLARIS) && !(defined(__i386__) || defined(__amd64__))
-//
-// Linux and Solaris implementation of CPU clock - non-x86.
-// This is accurate but SLOW! Only use out of desperation.
-//
-// Try to use the MONOTONIC clock if available, this is a constant time counter
-// with nanosecond resolution (but not necessarily accuracy) and attempts are
-// made to synchronize this value between cores at kernel start. It should not
-// be affected by CPU frequency. If not available use the REALTIME clock, but
-// this may be affected by NTP adjustments or other user activity affecting
-// the system time.
-inline U64 LLFastTimer::getCPUClockCount64()
-{
- struct timespec tp;
-
-#ifdef CLOCK_MONOTONIC // MONOTONIC supported at build-time?
- if (-1 == clock_gettime(CLOCK_MONOTONIC,&tp)) // if MONOTONIC isn't supported at runtime then ouch, try REALTIME
-#endif
- clock_gettime(CLOCK_REALTIME,&tp);
-
- return (tp.tv_sec*LLFastTimer::sClockResolution)+tp.tv_nsec;
-}
-
-inline U32 LLFastTimer::getCPUClockCount32()
-{
- return (U32)(LLFastTimer::getCPUClockCount64() >> 8);
-}
-#endif // (LL_LINUX || LL_SOLARIS) && !(defined(__i386__) || defined(__amd64__))
-
-
-#if (LL_LINUX || LL_SOLARIS || LL_DARWIN) && (defined(__i386__) || defined(__amd64__))
-//
-// Mac+Linux+Solaris FAST x86 implementation of CPU clock
-inline U32 LLFastTimer::getCPUClockCount32()
-{
- U64 x;
- __asm__ volatile (".byte 0x0f, 0x31": "=A"(x));
- return (U32)(x >> 8);
-}
-
-inline U64 LLFastTimer::getCPUClockCount64()
-{
- U64 x;
- __asm__ volatile (".byte 0x0f, 0x31": "=A"(x));
- return x;
-}
-#endif
-
-
-#if ( LL_DARWIN && !(defined(__i386__) || defined(__amd64__)))
-//
-// Mac PPC (deprecated) implementation of CPU clock
-//
-// Just use gettimeofday implementation for now
-
-inline U32 LLFastTimer::getCPUClockCount32()
-{
- return (U32)(get_clock_count()>>8);
-}
-
-inline U64 LLFastTimer::getCPUClockCount64()
-{
- return get_clock_count();
-}
-#endif
-
#endif // LL_LLFASTTIMER_H
diff --git a/indra/llcommon/llfasttimer_class.cpp b/indra/llcommon/llfasttimer_class.cpp
index bce87ada96..463f558c2c 100644
--- a/indra/llcommon/llfasttimer_class.cpp
+++ b/indra/llcommon/llfasttimer_class.cpp
@@ -35,10 +35,13 @@
#include <boost/bind.hpp>
+
#if LL_WINDOWS
+#include "lltimer.h"
#elif LL_LINUX || LL_SOLARIS
#include <sys/time.h>
#include <sched.h>
+#include "lltimer.h"
#elif LL_DARWIN
#include <sys/time.h>
#include "lltimer.h" // get_clock_count()
@@ -61,6 +64,8 @@ BOOL LLFastTimer::sMetricLog = FALSE;
LLMutex* LLFastTimer::sLogLock = NULL;
std::queue<LLSD> LLFastTimer::sLogQueue;
+#define USE_RDTSC 0
+
#if LL_LINUX || LL_SOLARIS
U64 LLFastTimer::sClockResolution = 1000000000; // Nanosecond resolution
#else
@@ -214,15 +219,20 @@ LLFastTimer::DeclareTimer::DeclareTimer(const std::string& name)
// static
void LLFastTimer::DeclareTimer::updateCachedPointers()
{
- DeclareTimer::LLInstanceTrackerScopedGuard guard;
// propagate frame state pointers to timer declarations
- for (DeclareTimer::instance_iter it = guard.beginInstances();
- it != guard.endInstances();
- ++it)
+ for (instance_iter it = beginInstances(); it != endInstances(); ++it)
{
// update cached pointer
it->mFrameState = &it->mTimer.getFrameState();
}
+
+ // also update frame states of timers on stack
+ LLFastTimer* cur_timerp = LLFastTimer::sCurTimerData.mCurTimer;
+ while(cur_timerp->mLastTimerData.mCurTimer != cur_timerp)
+ {
+ cur_timerp->mFrameState = &cur_timerp->mFrameState->mTimer->getFrameState();
+ cur_timerp = cur_timerp->mLastTimerData.mCurTimer;
+ }
}
//static
@@ -234,10 +244,23 @@ U64 LLFastTimer::countsPerSecond() // counts per second for the *32-bit* timer
#else // windows or x86-mac or x86-linux or x86-solaris
U64 LLFastTimer::countsPerSecond() // counts per second for the *32-bit* timer
{
+#if USE_RDTSC || !LL_WINDOWS
//getCPUFrequency returns MHz and sCPUClockFrequency wants to be in Hz
static U64 sCPUClockFrequency = U64(LLProcessorInfo().getCPUFrequency()*1000000.0);
// we drop the low-order byte in our timers, so report a lower frequency
+#else
+ // If we're not using RDTSC, each fasttimer tick is just a performance counter tick.
+ // Not redefining the clock frequency itself (in llprocessor.cpp/calculate_cpu_frequency())
+ // since that would change displayed MHz stats for CPUs
+ static bool firstcall = true;
+ static U64 sCPUClockFrequency;
+ if (firstcall)
+ {
+ QueryPerformanceFrequency((LARGE_INTEGER*)&sCPUClockFrequency);
+ firstcall = false;
+ }
+#endif
return sCPUClockFrequency >> 8;
}
#endif
@@ -280,14 +303,15 @@ LLFastTimer::NamedTimer::~NamedTimer()
std::string LLFastTimer::NamedTimer::getToolTip(S32 history_idx)
{
+ F64 ms_multiplier = 1000.0 / (F64)LLFastTimer::countsPerSecond();
if (history_idx < 0)
{
- // by default, show average number of calls
- return llformat("%s (%d calls)", getName().c_str(), (S32)getCallAverage());
+ // by default, show average number of call
+ return llformat("%s (%d ms, %d calls)", getName().c_str(), (S32)(getCountAverage() * ms_multiplier), (S32)getCallAverage());
}
else
{
- return llformat("%s (%d calls)", getName().c_str(), (S32)getHistoricalCalls(history_idx));
+ return llformat("%s (%d ms, %d calls)", getName().c_str(), (S32)(getHistoricalCount(history_idx) * ms_multiplier), (S32)getHistoricalCalls(history_idx));
}
}
@@ -370,10 +394,7 @@ void LLFastTimer::NamedTimer::buildHierarchy()
// set up initial tree
{
- NamedTimer::LLInstanceTrackerScopedGuard guard;
- for (instance_iter it = guard.beginInstances();
- it != guard.endInstances();
- ++it)
+ for (instance_iter it = beginInstances(); it != endInstances(); ++it)
{
NamedTimer& timer = *it;
if (&timer == NamedTimerFactory::instance().getRootTimer()) continue;
@@ -482,16 +503,26 @@ void LLFastTimer::NamedTimer::resetFrame()
{
if (sLog)
{ //output current frame counts to performance log
+
+ static S32 call_count = 0;
+ if (call_count % 100 == 0)
+ {
+ llinfos << "countsPerSecond (32 bit): " << countsPerSecond() << llendl;
+ llinfos << "get_clock_count (64 bit): " << get_clock_count() << llendl;
+ llinfos << "LLProcessorInfo().getCPUFrequency() " << LLProcessorInfo().getCPUFrequency() << llendl;
+ llinfos << "getCPUClockCount32() " << getCPUClockCount32() << llendl;
+ llinfos << "getCPUClockCount64() " << getCPUClockCount64() << llendl;
+ llinfos << "elapsed sec " << ((F64)getCPUClockCount64())/((F64)LLProcessorInfo().getCPUFrequency()*1000000.0) << llendl;
+ }
+ call_count++;
+
F64 iclock_freq = 1000.0 / countsPerSecond(); // good place to calculate clock frequency
F64 total_time = 0;
LLSD sd;
{
- NamedTimer::LLInstanceTrackerScopedGuard guard;
- for (NamedTimer::instance_iter it = guard.beginInstances();
- it != guard.endInstances();
- ++it)
+ for (instance_iter it = beginInstances(); it != endInstances(); ++it)
{
NamedTimer& timer = *it;
FrameState& info = timer.getFrameState();
@@ -528,7 +559,7 @@ void LLFastTimer::NamedTimer::resetFrame()
llassert_always(timerp->mFrameStateIndex < (S32)getFrameStateList().size());
}
- // sort timers by dfs traversal order to improve cache coherency
+ // sort timers by DFS traversal order to improve cache coherency
std::sort(getFrameStateList().begin(), getFrameStateList().end(), SortTimersDFS());
// update pointers into framestatelist now that we've sorted it
@@ -536,10 +567,7 @@ void LLFastTimer::NamedTimer::resetFrame()
// reset for next frame
{
- NamedTimer::LLInstanceTrackerScopedGuard guard;
- for (NamedTimer::instance_iter it = guard.beginInstances();
- it != guard.endInstances();
- ++it)
+ for (instance_iter it = beginInstances(); it != endInstances(); ++it)
{
NamedTimer& timer = *it;
@@ -583,10 +611,7 @@ void LLFastTimer::NamedTimer::reset()
// reset all history
{
- NamedTimer::LLInstanceTrackerScopedGuard guard;
- for (NamedTimer::instance_iter it = guard.beginInstances();
- it != guard.endInstances();
- ++it)
+ for (instance_iter it = beginInstances(); it != endInstances(); ++it)
{
NamedTimer& timer = *it;
if (&timer != NamedTimerFactory::instance().getRootTimer())
@@ -669,17 +694,7 @@ void LLFastTimer::nextFrame()
llinfos << "Slow frame, fast timers inaccurate" << llendl;
}
- if (sPauseHistory)
- {
- sResetHistory = true;
- }
- else if (sResetHistory)
- {
- sLastFrameIndex = 0;
- sCurFrameIndex = 0;
- sResetHistory = false;
- }
- else // not paused
+ if (!sPauseHistory)
{
NamedTimer::processTimes();
sLastFrameIndex = sCurFrameIndex++;
@@ -763,3 +778,144 @@ LLFastTimer::LLFastTimer(LLFastTimer::FrameState* state)
//////////////////////////////////////////////////////////////////////////////
+//
+// Important note: These implementations must be FAST!
+//
+
+
+#if LL_WINDOWS
+//
+// Windows implementation of CPU clock
+//
+
+//
+// NOTE: put back in when we aren't using platform sdk anymore
+//
+// because MS has different signatures for these functions in winnt.h
+// need to rename them to avoid conflicts
+//#define _interlockedbittestandset _renamed_interlockedbittestandset
+//#define _interlockedbittestandreset _renamed_interlockedbittestandreset
+//#include <intrin.h>
+//#undef _interlockedbittestandset
+//#undef _interlockedbittestandreset
+
+//inline U32 LLFastTimer::getCPUClockCount32()
+//{
+// U64 time_stamp = __rdtsc();
+// return (U32)(time_stamp >> 8);
+//}
+//
+//// return full timer value, *not* shifted by 8 bits
+//inline U64 LLFastTimer::getCPUClockCount64()
+//{
+// return __rdtsc();
+//}
+
+// shift off lower 8 bits for lower resolution but longer term timing
+// on 1Ghz machine, a 32-bit word will hold ~1000 seconds of timing
+#if USE_RDTSC
+U32 LLFastTimer::getCPUClockCount32()
+{
+ U32 ret_val;
+ __asm
+ {
+ _emit 0x0f
+ _emit 0x31
+ shr eax,8
+ shl edx,24
+ or eax, edx
+ mov dword ptr [ret_val], eax
+ }
+ return ret_val;
+}
+
+// return full timer value, *not* shifted by 8 bits
+U64 LLFastTimer::getCPUClockCount64()
+{
+ U64 ret_val;
+ __asm
+ {
+ _emit 0x0f
+ _emit 0x31
+ mov eax,eax
+ mov edx,edx
+ mov dword ptr [ret_val+4], edx
+ mov dword ptr [ret_val], eax
+ }
+ return ret_val;
+}
+
+std::string LLFastTimer::sClockType = "rdtsc";
+
+#else
+//LL_COMMON_API U64 get_clock_count(); // in lltimer.cpp
+// These use QueryPerformanceCounter, which is arguably fine and also works on AMD architectures.
+U32 LLFastTimer::getCPUClockCount32()
+{
+ return (U32)(get_clock_count()>>8);
+}
+
+U64 LLFastTimer::getCPUClockCount64()
+{
+ return get_clock_count();
+}
+
+std::string LLFastTimer::sClockType = "QueryPerformanceCounter";
+#endif
+
+#endif
+
+
+#if (LL_LINUX || LL_SOLARIS) && !(defined(__i386__) || defined(__amd64__))
+//
+// Linux and Solaris implementation of CPU clock - non-x86.
+// This is accurate but SLOW! Only use out of desperation.
+//
+// Try to use the MONOTONIC clock if available, this is a constant time counter
+// with nanosecond resolution (but not necessarily accuracy) and attempts are
+// made to synchronize this value between cores at kernel start. It should not
+// be affected by CPU frequency. If not available use the REALTIME clock, but
+// this may be affected by NTP adjustments or other user activity affecting
+// the system time.
+U64 LLFastTimer::getCPUClockCount64()
+{
+ struct timespec tp;
+
+#ifdef CLOCK_MONOTONIC // MONOTONIC supported at build-time?
+ if (-1 == clock_gettime(CLOCK_MONOTONIC,&tp)) // if MONOTONIC isn't supported at runtime then ouch, try REALTIME
+#endif
+ clock_gettime(CLOCK_REALTIME,&tp);
+
+ return (tp.tv_sec*LLFastTimer::sClockResolution)+tp.tv_nsec;
+}
+
+U32 LLFastTimer::getCPUClockCount32()
+{
+ return (U32)(LLFastTimer::getCPUClockCount64() >> 8);
+}
+
+std::string LLFastTimer::sClockType = "clock_gettime";
+
+#endif // (LL_LINUX || LL_SOLARIS) && !(defined(__i386__) || defined(__amd64__))
+
+
+#if (LL_LINUX || LL_SOLARIS || LL_DARWIN) && (defined(__i386__) || defined(__amd64__))
+//
+// Mac+Linux+Solaris FAST x86 implementation of CPU clock
+U32 LLFastTimer::getCPUClockCount32()
+{
+ U64 x;
+ __asm__ volatile (".byte 0x0f, 0x31": "=A"(x));
+ return (U32)(x >> 8);
+}
+
+U64 LLFastTimer::getCPUClockCount64()
+{
+ U64 x;
+ __asm__ volatile (".byte 0x0f, 0x31": "=A"(x));
+ return x;
+}
+
+std::string LLFastTimer::sClockType = "rdtsc";
+#endif
+
diff --git a/indra/llcommon/llfasttimer_class.h b/indra/llcommon/llfasttimer_class.h
index eb9789682b..f481e968a6 100644
--- a/indra/llcommon/llfasttimer_class.h
+++ b/indra/llcommon/llfasttimer_class.h
@@ -31,12 +31,15 @@
#define FAST_TIMER_ON 1
#define TIME_FAST_TIMERS 0
+#define DEBUG_FAST_TIMER_THREADS 1
class LLMutex;
#include <queue>
#include "llsd.h"
+LL_COMMON_API void assert_main_thread();
+
class LL_COMMON_API LLFastTimer
{
public:
@@ -63,7 +66,7 @@ public:
public:
~NamedTimer();
- enum { HISTORY_NUM = 60 };
+ enum { HISTORY_NUM = 300 };
const std::string& getName() const { return mName; }
NamedTimer* getParent() const { return mParent; }
@@ -176,6 +179,11 @@ public:
U64 timer_end = getCPUClockCount64();
sTimerCycles += timer_end - timer_start;
#endif
+#if DEBUG_FAST_TIMER_THREADS
+#if !LL_RELEASE
+ assert_main_thread();
+#endif
+#endif
}
LL_FORCE_INLINE ~LLFastTimer()
@@ -245,6 +253,7 @@ public:
U32 mChildTime;
};
static CurTimerData sCurTimerData;
+ static std::string sClockType;
private:
static U32 getCPUClockCount32();
diff --git a/indra/llcommon/llfile.cpp b/indra/llcommon/llfile.cpp
index 8f02391e75..c32a776c3f 100644
--- a/indra/llcommon/llfile.cpp
+++ b/indra/llcommon/llfile.cpp
@@ -92,6 +92,17 @@ LLFILE* LLFile::_fsopen(const std::string& filename, const char* mode, int shari
#endif
}
+int LLFile::close(LLFILE * file)
+{
+ int ret_value = 0;
+ if (file)
+ {
+ ret_value = fclose(file);
+ }
+ return ret_value;
+}
+
+
int LLFile::remove(const std::string& filename)
{
#if LL_WINDOWS
diff --git a/indra/llcommon/llfile.h b/indra/llcommon/llfile.h
index 4913af7cb5..dd7d36513a 100644
--- a/indra/llcommon/llfile.h
+++ b/indra/llcommon/llfile.h
@@ -71,6 +71,8 @@ public:
static LLFILE* fopen(const std::string& filename,const char* accessmode); /* Flawfinder: ignore */
static LLFILE* _fsopen(const std::string& filename,const char* accessmode,int sharingFlag);
+ static int close(LLFILE * file);
+
// perms is a permissions mask like 0777 or 0700. In most cases it will
// be overridden by the user's umask. It is ignored on Windows.
static int mkdir(const std::string& filename, int perms = 0700);
diff --git a/indra/llcommon/llfoldertype.cpp b/indra/llcommon/llfoldertype.cpp
index ebc79af412..f6d0f5bce8 100644
--- a/indra/llcommon/llfoldertype.cpp
+++ b/indra/llcommon/llfoldertype.cpp
@@ -89,7 +89,12 @@ LLFolderDictionary::LLFolderDictionary()
addEntry(LLFolderType::FT_CURRENT_OUTFIT, new FolderEntry("current", TRUE));
addEntry(LLFolderType::FT_OUTFIT, new FolderEntry("outfit", FALSE));
addEntry(LLFolderType::FT_MY_OUTFITS, new FolderEntry("my_otfts", TRUE));
+
+ addEntry(LLFolderType::FT_MESH, new FolderEntry("mesh", TRUE));
+
addEntry(LLFolderType::FT_INBOX, new FolderEntry("inbox", TRUE));
+ addEntry(LLFolderType::FT_OUTBOX, new FolderEntry("outbox", TRUE));
+ addEntry(LLFolderType::FT_BASIC_ROOT, new FolderEntry("basic_rt", TRUE));
addEntry(LLFolderType::FT_NONE, new FolderEntry("-1", FALSE));
};
diff --git a/indra/llcommon/llfoldertype.h b/indra/llcommon/llfoldertype.h
index 936fbed17d..a0c847914f 100644
--- a/indra/llcommon/llfoldertype.h
+++ b/indra/llcommon/llfoldertype.h
@@ -80,9 +80,14 @@ public:
FT_OUTFIT = 47,
FT_MY_OUTFITS = 48,
- FT_INBOX = 49,
+ FT_MESH = 49,
- FT_COUNT = 50,
+ FT_INBOX = 50,
+ FT_OUTBOX = 51,
+
+ FT_BASIC_ROOT = 52,
+
+ FT_COUNT,
FT_NONE = -1
};
diff --git a/indra/llcommon/llinstancetracker.cpp b/indra/llcommon/llinstancetracker.cpp
index 89bc6cca39..5dc3ea5d7b 100644
--- a/indra/llcommon/llinstancetracker.cpp
+++ b/indra/llcommon/llinstancetracker.cpp
@@ -32,6 +32,18 @@
// external library headers
// other Linden headers
-// llinstancetracker.h is presently header-only. This file exists only because our CMake
-// test macro ADD_BUILD_TEST requires it.
-int dummy = 0;
+//static
+void * & LLInstanceTrackerBase::getInstances(std::type_info const & info)
+{
+ typedef std::map<std::string, void *> InstancesMap;
+ static InstancesMap instances;
+
+ // std::map::insert() is just what we want here. You attempt to insert a
+ // (key, value) pair. If the specified key doesn't yet exist, it inserts
+ // the pair and returns a std::pair of (iterator, true). If the specified
+ // key DOES exist, insert() simply returns (iterator, false). One lookup
+ // handles both cases.
+ return instances.insert(InstancesMap::value_type(info.name(),
+ InstancesMap::mapped_type()))
+ .first->second;
+}
diff --git a/indra/llcommon/llinstancetracker.h b/indra/llcommon/llinstancetracker.h
index 4945461d62..34d841a4e0 100644
--- a/indra/llcommon/llinstancetracker.h
+++ b/indra/llcommon/llinstancetracker.h
@@ -29,6 +29,7 @@
#define LL_LLINSTANCETRACKER_H
#include <map>
+#include <typeinfo>
#include "string_table.h"
#include <boost/utility.hpp>
@@ -37,21 +38,132 @@
#include <boost/iterator/transform_iterator.hpp>
#include <boost/iterator/indirect_iterator.hpp>
+/**
+ * Base class manages "class-static" data that must actually have singleton
+ * semantics: one instance per process, rather than one instance per module as
+ * sometimes happens with data simply declared static.
+ */
+class LL_COMMON_API LLInstanceTrackerBase : public boost::noncopyable
+{
+protected:
+ /// Get a process-unique void* pointer slot for the specified type_info
+ static void * & getInstances(std::type_info const & info);
+
+ /// Find or create a STATICDATA instance for the specified TRACKED class.
+ /// STATICDATA must be default-constructible.
+ template<typename STATICDATA, class TRACKED>
+ static STATICDATA& getStatic()
+ {
+ void *& instances = getInstances(typeid(TRACKED));
+ if (! instances)
+ {
+ instances = new STATICDATA;
+ }
+ return *static_cast<STATICDATA*>(instances);
+ }
+
+ /// It's not essential to derive your STATICDATA (for use with
+ /// getStatic()) from StaticBase; it's just that both known
+ /// implementations do.
+ struct StaticBase
+ {
+ StaticBase():
+ sIterationNestDepth(0)
+ {}
+ S32 sIterationNestDepth;
+ };
+};
+
/// This mix-in class adds support for tracking all instances of the specified class parameter T
/// The (optional) key associates a value of type KEY with a given instance of T, for quick lookup
/// If KEY is not provided, then instances are stored in a simple set
/// @NOTE: see explicit specialization below for default KEY==T* case
template<typename T, typename KEY = T*>
-class LLInstanceTracker : boost::noncopyable
+class LLInstanceTracker : public LLInstanceTrackerBase
{
+ typedef LLInstanceTracker<T, KEY> MyT;
typedef typename std::map<KEY, T*> InstanceMap;
- typedef boost::function<const KEY&(typename InstanceMap::value_type&)> KeyGetter;
- typedef boost::function<T*(typename InstanceMap::value_type&)> InstancePtrGetter;
+ struct StaticData: public StaticBase
+ {
+ InstanceMap sMap;
+ };
+ static StaticData& getStatic() { return LLInstanceTrackerBase::getStatic<StaticData, MyT>(); }
+ static InstanceMap& getMap_() { return getStatic().sMap; }
+
public:
- /// Dereferencing key_iter gives you a const KEY&
- typedef boost::transform_iterator<KeyGetter, typename InstanceMap::iterator> key_iter;
- /// Dereferencing instance_iter gives you a T&
- typedef boost::indirect_iterator< boost::transform_iterator<InstancePtrGetter, typename InstanceMap::iterator> > instance_iter;
+ class instance_iter : public boost::iterator_facade<instance_iter, T, boost::forward_traversal_tag>
+ {
+ public:
+ typedef boost::iterator_facade<instance_iter, T, boost::forward_traversal_tag> super_t;
+
+ instance_iter(const typename InstanceMap::iterator& it)
+ : mIterator(it)
+ {
+ ++getStatic().sIterationNestDepth;
+ }
+
+ ~instance_iter()
+ {
+ --getStatic().sIterationNestDepth;
+ }
+
+
+ private:
+ friend class boost::iterator_core_access;
+
+ void increment() { mIterator++; }
+ bool equal(instance_iter const& other) const
+ {
+ return mIterator == other.mIterator;
+ }
+
+ T& dereference() const
+ {
+ return *(mIterator->second);
+ }
+
+ typename InstanceMap::iterator mIterator;
+ };
+
+ class key_iter : public boost::iterator_facade<key_iter, KEY, boost::forward_traversal_tag>
+ {
+ public:
+ typedef boost::iterator_facade<key_iter, KEY, boost::forward_traversal_tag> super_t;
+
+ key_iter(typename InstanceMap::iterator it)
+ : mIterator(it)
+ {
+ ++getStatic().sIterationNestDepth;
+ }
+
+ key_iter(const key_iter& other)
+ : mIterator(other.mIterator)
+ {
+ ++getStatic().sIterationNestDepth;
+ }
+
+ ~key_iter()
+ {
+ --getStatic().sIterationNestDepth;
+ }
+
+
+ private:
+ friend class boost::iterator_core_access;
+
+ void increment() { mIterator++; }
+ bool equal(key_iter const& other) const
+ {
+ return mIterator == other.mIterator;
+ }
+
+ KEY& dereference() const
+ {
+ return const_cast<KEY&>(mIterator->first);
+ }
+
+ typename InstanceMap::iterator mIterator;
+ };
static T* getInstance(const KEY& k)
{
@@ -59,132 +171,136 @@ public:
return (found == getMap_().end()) ? NULL : found->second;
}
- static key_iter beginKeys()
- {
- return boost::make_transform_iterator(getMap_().begin(),
- boost::bind(&InstanceMap::value_type::first, _1));
+ static instance_iter beginInstances()
+ {
+ return instance_iter(getMap_().begin());
}
- static key_iter endKeys()
+
+ static instance_iter endInstances()
{
- return boost::make_transform_iterator(getMap_().end(),
- boost::bind(&InstanceMap::value_type::first, _1));
+ return instance_iter(getMap_().end());
}
- static instance_iter beginInstances()
+
+ static S32 instanceCount() { return getMap_().size(); }
+
+ static key_iter beginKeys()
{
- return instance_iter(boost::make_transform_iterator(getMap_().begin(),
- boost::bind(&InstanceMap::value_type::second, _1)));
+ return key_iter(getMap_().begin());
}
- static instance_iter endInstances()
+ static key_iter endKeys()
{
- return instance_iter(boost::make_transform_iterator(getMap_().end(),
- boost::bind(&InstanceMap::value_type::second, _1)));
+ return key_iter(getMap_().end());
}
- static S32 instanceCount() { return getMap_().size(); }
+
protected:
- LLInstanceTracker(KEY key) { add_(key); }
- virtual ~LLInstanceTracker() { remove_(); }
+ LLInstanceTracker(KEY key)
+ {
+ // make sure static data outlives all instances
+ getStatic();
+ add_(key);
+ }
+ virtual ~LLInstanceTracker()
+ {
+ // it's unsafe to delete instances of this type while all instances are being iterated over.
+ llassert_always(getStatic().sIterationNestDepth == 0);
+ remove_();
+ }
virtual void setKey(KEY key) { remove_(); add_(key); }
- virtual const KEY& getKey() const { return mKey; }
+ virtual const KEY& getKey() const { return mInstanceKey; }
private:
void add_(KEY key)
{
- mKey = key;
+ mInstanceKey = key;
getMap_()[key] = static_cast<T*>(this);
}
void remove_()
{
- getMap_().erase(mKey);
+ getMap_().erase(mInstanceKey);
}
- static InstanceMap& getMap_()
- {
- if (! sInstances)
- {
- sInstances = new InstanceMap;
- }
- return *sInstances;
- }
-
private:
-
- KEY mKey;
- static InstanceMap* sInstances;
+ KEY mInstanceKey;
};
/// explicit specialization for default case where KEY is T*
/// use a simple std::set<T*>
template<typename T>
-class LLInstanceTracker<T, T*>
+class LLInstanceTracker<T, T*> : public LLInstanceTrackerBase
{
+ typedef LLInstanceTracker<T, T*> MyT;
typedef typename std::set<T*> InstanceSet;
+ struct StaticData: public StaticBase
+ {
+ InstanceSet sSet;
+ };
+ static StaticData& getStatic() { return LLInstanceTrackerBase::getStatic<StaticData, MyT>(); }
+ static InstanceSet& getSet_() { return getStatic().sSet; }
+
public:
- /// Dereferencing key_iter gives you a T* (since T* is the key)
- typedef typename InstanceSet::iterator key_iter;
- /// Dereferencing instance_iter gives you a T&
- typedef boost::indirect_iterator<key_iter> instance_iter;
/// for completeness of analogy with the generic implementation
static T* getInstance(T* k) { return k; }
static S32 instanceCount() { return getSet_().size(); }
- // Instantiate this to get access to iterators for this type. It's a 'guard' in the sense
- // that it treats deletes of this type as errors as long as there is an instance of
- // this class alive in scope somewhere (i.e. deleting while iterating is bad).
- class LLInstanceTrackerScopedGuard
+ class instance_iter : public boost::iterator_facade<instance_iter, T, boost::forward_traversal_tag>
{
public:
- LLInstanceTrackerScopedGuard()
+ instance_iter(const typename InstanceSet::iterator& it)
+ : mIterator(it)
+ {
+ ++getStatic().sIterationNestDepth;
+ }
+
+ instance_iter(const instance_iter& other)
+ : mIterator(other.mIterator)
+ {
+ ++getStatic().sIterationNestDepth;
+ }
+
+ ~instance_iter()
{
- ++sIterationNestDepth;
+ --getStatic().sIterationNestDepth;
}
- ~LLInstanceTrackerScopedGuard()
+ private:
+ friend class boost::iterator_core_access;
+
+ void increment() { mIterator++; }
+ bool equal(instance_iter const& other) const
{
- --sIterationNestDepth;
+ return mIterator == other.mIterator;
}
- static instance_iter beginInstances() { return instance_iter(getSet_().begin()); }
- static instance_iter endInstances() { return instance_iter(getSet_().end()); }
- static key_iter beginKeys() { return getSet_().begin(); }
- static key_iter endKeys() { return getSet_().end(); }
+ T& dereference() const
+ {
+ return **mIterator;
+ }
+
+ typename InstanceSet::iterator mIterator;
};
+ static instance_iter beginInstances() { return instance_iter(getSet_().begin()); }
+ static instance_iter endInstances() { return instance_iter(getSet_().end()); }
+
protected:
LLInstanceTracker()
{
- // it's safe but unpredictable to create instances of this type while all instances are being iterated over. I hate unpredictable. This assert will probably be turned on early in the next development cycle.
- //llassert(sIterationNestDepth == 0);
+ // make sure static data outlives all instances
+ getStatic();
getSet_().insert(static_cast<T*>(this));
}
virtual ~LLInstanceTracker()
{
// it's unsafe to delete instances of this type while all instances are being iterated over.
- llassert(sIterationNestDepth == 0);
+ llassert_always(getStatic().sIterationNestDepth == 0);
getSet_().erase(static_cast<T*>(this));
}
LLInstanceTracker(const LLInstanceTracker& other)
{
- //llassert(sIterationNestDepth == 0);
getSet_().insert(static_cast<T*>(this));
}
-
- static InstanceSet& getSet_()
- {
- if (! sInstances)
- {
- sInstances = new InstanceSet;
- }
- return *sInstances;
- }
-
- static InstanceSet* sInstances;
- static S32 sIterationNestDepth;
};
-template <typename T, typename KEY> typename LLInstanceTracker<T, KEY>::InstanceMap* LLInstanceTracker<T, KEY>::sInstances = NULL;
-template <typename T> typename LLInstanceTracker<T, T*>::InstanceSet* LLInstanceTracker<T, T*>::sInstances = NULL;
-template <typename T> S32 LLInstanceTracker<T, T*>::sIterationNestDepth = 0;
-
#endif
diff --git a/indra/llcommon/lllslconstants.h b/indra/llcommon/lllslconstants.h
index 539c807020..9f32598e61 100644
--- a/indra/llcommon/lllslconstants.h
+++ b/indra/llcommon/lllslconstants.h
@@ -181,7 +181,7 @@ const S32 OBJECT_GROUP = 7;
const S32 OBJECT_CREATOR = 8;
// llTextBox() magic token string - yes this is a hack. sue me.
-const std::string TEXTBOX_MAGIC_TOKEN = "!!llTextBox!!";
+char const* const TEXTBOX_MAGIC_TOKEN = "!!llTextBox!!";
// changed() event flags
const U32 CHANGED_NONE = 0x0;
diff --git a/indra/llcommon/llmd5.cpp b/indra/llcommon/llmd5.cpp
index 75fde8e5ba..1409c55d1c 100644
--- a/indra/llcommon/llmd5.cpp
+++ b/indra/llcommon/llmd5.cpp
@@ -175,7 +175,7 @@ void LLMD5::update(std::istream& stream){
while (stream.good()){
stream.read( (char*)buffer, BLOCK_LEN); /* Flawfinder: ignore */ // note that return value of read is unusable.
- len=stream.gcount();
+ len=(int)stream.gcount();
update(buffer, len);
}
diff --git a/indra/llcommon/llmd5.h b/indra/llcommon/llmd5.h
index c8acbbe591..1526e6ac3c 100644
--- a/indra/llcommon/llmd5.h
+++ b/indra/llcommon/llmd5.h
@@ -103,7 +103,7 @@ public:
void raw_digest(unsigned char *array) const; // provide 16-byte array for binary data
void hex_digest(char *string) const; // provide 33-byte array for ascii-hex string
- friend std::ostream& operator<< (std::ostream&, LLMD5 context);
+ friend LL_COMMON_API std::ostream& operator<< (std::ostream&, LLMD5 context);
private:
diff --git a/indra/llcommon/llmemory.cpp b/indra/llcommon/llmemory.cpp
index a502d1a7eb..3b9758f996 100644
--- a/indra/llcommon/llmemory.cpp
+++ b/indra/llcommon/llmemory.cpp
@@ -26,8 +26,13 @@
#include "linden_common.h"
+
+//#if MEM_TRACK_MEM
+#include "llthread.h"
+//#endif
+
#if defined(LL_WINDOWS)
-# include <windows.h>
+//# include <windows.h>
# include <psapi.h>
#elif defined(LL_DARWIN)
# include <sys/types.h>
@@ -39,10 +44,22 @@
#include "llmemory.h"
+#include "llsys.h"
+#include "llframetimer.h"
//----------------------------------------------------------------------------
//static
char* LLMemory::reserveMem = 0;
+U32 LLMemory::sAvailPhysicalMemInKB = U32_MAX ;
+U32 LLMemory::sMaxPhysicalMemInKB = 0;
+U32 LLMemory::sAllocatedMemInKB = 0;
+U32 LLMemory::sAllocatedPageSizeInKB = 0 ;
+U32 LLMemory::sMaxHeapSizeInKB = U32_MAX ;
+BOOL LLMemory::sEnableMemoryFailurePrevention = FALSE;
+
+#if __DEBUG_PRIVATE_MEM__
+LLPrivateMemoryPoolManager::mem_allocation_info_t LLPrivateMemoryPoolManager::sMemAllocationTracker;
+#endif
//static
void LLMemory::initClass()
@@ -67,6 +84,162 @@ void LLMemory::freeReserve()
reserveMem = NULL;
}
+//static
+void LLMemory::initMaxHeapSizeGB(F32 max_heap_size_gb, BOOL prevent_heap_failure)
+{
+ sMaxHeapSizeInKB = (U32)(max_heap_size_gb * 1024 * 1024) ;
+ sEnableMemoryFailurePrevention = prevent_heap_failure ;
+}
+
+//static
+void LLMemory::updateMemoryInfo()
+{
+#if LL_WINDOWS
+ HANDLE self = GetCurrentProcess();
+ PROCESS_MEMORY_COUNTERS counters;
+
+ if (!GetProcessMemoryInfo(self, &counters, sizeof(counters)))
+ {
+ llwarns << "GetProcessMemoryInfo failed" << llendl;
+ return ;
+ }
+
+ sAllocatedMemInKB = (U32)(counters.WorkingSetSize / 1024) ;
+ sAllocatedPageSizeInKB = (U32)(counters.PagefileUsage / 1024) ;
+
+ U32 avail_phys, avail_virtual;
+ LLMemoryInfo::getAvailableMemoryKB(avail_phys, avail_virtual) ;
+ sMaxPhysicalMemInKB = llmin(avail_phys + sAllocatedMemInKB, sMaxHeapSizeInKB);
+
+ if(sMaxPhysicalMemInKB > sAllocatedMemInKB)
+ {
+ sAvailPhysicalMemInKB = sMaxPhysicalMemInKB - sAllocatedMemInKB ;
+ }
+ else
+ {
+ sAvailPhysicalMemInKB = 0 ;
+ }
+#else
+ //not valid for other systems for now.
+ sAllocatedMemInKB = (U32)(LLMemory::getCurrentRSS() / 1024) ;
+ sMaxPhysicalMemInKB = U32_MAX ;
+ sAvailPhysicalMemInKB = U32_MAX ;
+#endif
+
+ return ;
+}
+
+//
+//this function is to test if there is enough space with the size in the virtual address space.
+//it does not do any real allocation
+//if success, it returns the address where the memory chunk can fit in;
+//otherwise it returns NULL.
+//
+//static
+void* LLMemory::tryToAlloc(void* address, U32 size)
+{
+#if LL_WINDOWS
+ address = VirtualAlloc(address, size, MEM_RESERVE | MEM_TOP_DOWN, PAGE_NOACCESS) ;
+ if(address)
+ {
+ if(!VirtualFree(address, 0, MEM_RELEASE))
+ {
+ llerrs << "error happens when free some memory reservation." << llendl ;
+ }
+ }
+ return address ;
+#else
+ return (void*)0x01 ; //skip checking
+#endif
+}
+
+//static
+void LLMemory::logMemoryInfo(BOOL update)
+{
+ if(update)
+ {
+ updateMemoryInfo() ;
+ LLPrivateMemoryPoolManager::getInstance()->updateStatistics() ;
+ }
+
+ llinfos << "Current allocated physical memory(KB): " << sAllocatedMemInKB << llendl ;
+ llinfos << "Current allocated page size (KB): " << sAllocatedPageSizeInKB << llendl ;
+ llinfos << "Current availabe physical memory(KB): " << sAvailPhysicalMemInKB << llendl ;
+ llinfos << "Current max usable memory(KB): " << sMaxPhysicalMemInKB << llendl ;
+
+ llinfos << "--- private pool information -- " << llendl ;
+ llinfos << "Total reserved (KB): " << LLPrivateMemoryPoolManager::getInstance()->mTotalReservedSize / 1024 << llendl ;
+ llinfos << "Total allocated (KB): " << LLPrivateMemoryPoolManager::getInstance()->mTotalAllocatedSize / 1024 << llendl ;
+}
+
+//return 0: everything is normal;
+//return 1: the memory pool is low, but not in danger;
+//return -1: the memory pool is in danger, is about to crash.
+//static
+bool LLMemory::isMemoryPoolLow()
+{
+ static const U32 LOW_MEMEOY_POOL_THRESHOLD_KB = 64 * 1024 ; //64 MB for emergency use
+ const static U32 MAX_SIZE_CHECKED_MEMORY_BLOCK = 64 * 1024 * 1024 ; //64 MB
+ static void* last_reserved_address = NULL ;
+
+ if(!sEnableMemoryFailurePrevention)
+ {
+ return false ; //no memory failure prevention.
+ }
+
+ if(sAvailPhysicalMemInKB < (LOW_MEMEOY_POOL_THRESHOLD_KB >> 2)) //out of physical memory
+ {
+ return true ;
+ }
+
+ if(sAllocatedPageSizeInKB + (LOW_MEMEOY_POOL_THRESHOLD_KB >> 2) > sMaxHeapSizeInKB) //out of virtual address space.
+ {
+ return true ;
+ }
+
+ bool is_low = (S32)(sAvailPhysicalMemInKB < LOW_MEMEOY_POOL_THRESHOLD_KB ||
+ sAllocatedPageSizeInKB + LOW_MEMEOY_POOL_THRESHOLD_KB > sMaxHeapSizeInKB) ;
+
+ //check the virtual address space fragmentation
+ if(!is_low)
+ {
+ if(!last_reserved_address)
+ {
+ last_reserved_address = LLMemory::tryToAlloc(last_reserved_address, MAX_SIZE_CHECKED_MEMORY_BLOCK) ;
+ }
+ else
+ {
+ last_reserved_address = LLMemory::tryToAlloc(last_reserved_address, MAX_SIZE_CHECKED_MEMORY_BLOCK) ;
+ if(!last_reserved_address) //failed, try once more
+ {
+ last_reserved_address = LLMemory::tryToAlloc(last_reserved_address, MAX_SIZE_CHECKED_MEMORY_BLOCK) ;
+ }
+ }
+
+ is_low = !last_reserved_address ; //allocation failed
+ }
+
+ return is_low ;
+}
+
+//static
+U32 LLMemory::getAvailableMemKB()
+{
+ return sAvailPhysicalMemInKB ;
+}
+
+//static
+U32 LLMemory::getMaxMemKB()
+{
+ return sMaxPhysicalMemInKB ;
+}
+
+//static
+U32 LLMemory::getAllocatedMemKB()
+{
+ return sAllocatedMemInKB ;
+}
+
void* ll_allocate (size_t size)
{
if (size == 0)
@@ -82,11 +255,6 @@ void* ll_allocate (size_t size)
return p;
}
-void ll_release (void *p)
-{
- free(p);
-}
-
//----------------------------------------------------------------------------
#if defined(LL_WINDOWS)
@@ -105,6 +273,20 @@ U64 LLMemory::getCurrentRSS()
return counters.WorkingSetSize;
}
+//static
+U32 LLMemory::getWorkingSetSize()
+{
+ PROCESS_MEMORY_COUNTERS pmc ;
+ U32 ret = 0 ;
+
+ if (GetProcessMemoryInfo( GetCurrentProcess(), &pmc, sizeof(pmc)) )
+ {
+ ret = pmc.WorkingSetSize ;
+ }
+
+ return ret ;
+}
+
#elif defined(LL_DARWIN)
/*
@@ -151,6 +333,11 @@ U64 LLMemory::getCurrentRSS()
return residentSize;
}
+U32 LLMemory::getWorkingSetSize()
+{
+ return 0 ;
+}
+
#elif defined(LL_LINUX)
U64 LLMemory::getCurrentRSS()
@@ -185,6 +372,11 @@ bail:
return rss;
}
+U32 LLMemory::getWorkingSetSize()
+{
+ return 0 ;
+}
+
#elif LL_SOLARIS
#include <sys/types.h>
#include <sys/stat.h>
@@ -213,6 +405,12 @@ U64 LLMemory::getCurrentRSS()
return((U64)proc_psinfo.pr_rssize * 1024);
}
+
+U32 LLMemory::getWorkingSetSize()
+{
+ return 0 ;
+}
+
#else
U64 LLMemory::getCurrentRSS()
@@ -220,4 +418,1869 @@ U64 LLMemory::getCurrentRSS()
return 0;
}
+U32 LLMemory::getWorkingSetSize()
+{
+ return 0;
+}
+
+#endif
+
+//--------------------------------------------------------------------------------------------------
+#if MEM_TRACK_MEM
+#include "llframetimer.h"
+
+//static
+LLMemTracker* LLMemTracker::sInstance = NULL ;
+
+LLMemTracker::LLMemTracker()
+{
+ mLastAllocatedMem = LLMemory::getWorkingSetSize() ;
+ mCapacity = 128 ;
+ mCurIndex = 0 ;
+ mCounter = 0 ;
+ mDrawnIndex = 0 ;
+ mPaused = FALSE ;
+
+ mMutexp = new LLMutex() ;
+ mStringBuffer = new char*[128] ;
+ mStringBuffer[0] = new char[mCapacity * 128] ;
+ for(S32 i = 1 ; i < mCapacity ; i++)
+ {
+ mStringBuffer[i] = mStringBuffer[i-1] + 128 ;
+ }
+}
+
+LLMemTracker::~LLMemTracker()
+{
+ delete[] mStringBuffer[0] ;
+ delete[] mStringBuffer;
+ delete mMutexp ;
+}
+
+//static
+LLMemTracker* LLMemTracker::getInstance()
+{
+ if(!sInstance)
+ {
+ sInstance = new LLMemTracker() ;
+ }
+ return sInstance ;
+}
+
+//static
+void LLMemTracker::release()
+{
+ if(sInstance)
+ {
+ delete sInstance ;
+ sInstance = NULL ;
+ }
+}
+
+//static
+void LLMemTracker::track(const char* function, const int line)
+{
+ static const S32 MIN_ALLOCATION = 0 ; //1KB
+
+ if(mPaused)
+ {
+ return ;
+ }
+
+ U32 allocated_mem = LLMemory::getWorkingSetSize() ;
+
+ LLMutexLock lock(mMutexp) ;
+
+ S32 delta_mem = allocated_mem - mLastAllocatedMem ;
+ mLastAllocatedMem = allocated_mem ;
+
+ if(delta_mem <= 0)
+ {
+ return ; //occupied memory does not grow
+ }
+
+ if(delta_mem < MIN_ALLOCATION)
+ {
+ return ;
+ }
+
+ char* buffer = mStringBuffer[mCurIndex++] ;
+ F32 time = (F32)LLFrameTimer::getElapsedSeconds() ;
+ S32 hours = (S32)(time / (60*60));
+ S32 mins = (S32)((time - hours*(60*60)) / 60);
+ S32 secs = (S32)((time - hours*(60*60) - mins*60));
+ strcpy(buffer, function) ;
+ sprintf(buffer + strlen(function), " line: %d DeltaMem: %d (bytes) Time: %d:%02d:%02d", line, delta_mem, hours,mins,secs) ;
+
+ if(mCounter < mCapacity)
+ {
+ mCounter++ ;
+ }
+ if(mCurIndex >= mCapacity)
+ {
+ mCurIndex = 0 ;
+ }
+}
+
+
+//static
+void LLMemTracker::preDraw(BOOL pause)
+{
+ mMutexp->lock() ;
+
+ mPaused = pause ;
+ mDrawnIndex = mCurIndex - 1;
+ mNumOfDrawn = 0 ;
+}
+
+//static
+void LLMemTracker::postDraw()
+{
+ mMutexp->unlock() ;
+}
+
+//static
+const char* LLMemTracker::getNextLine()
+{
+ if(mNumOfDrawn >= mCounter)
+ {
+ return NULL ;
+ }
+ mNumOfDrawn++;
+
+ if(mDrawnIndex < 0)
+ {
+ mDrawnIndex = mCapacity - 1 ;
+ }
+
+ return mStringBuffer[mDrawnIndex--] ;
+}
+
+#endif //MEM_TRACK_MEM
+//--------------------------------------------------------------------------------------------------
+
+
+//--------------------------------------------------------------------------------------------------
+//--------------------------------------------------------------------------------------------------
+//minimum slot size and minimal slot size interval
+const U32 ATOMIC_MEM_SLOT = 16 ; //bytes
+
+//minimum block sizes (page size) for small allocation, medium allocation, large allocation
+const U32 MIN_BLOCK_SIZES[LLPrivateMemoryPool::SUPER_ALLOCATION] = {2 << 10, 4 << 10, 16 << 10} ; //
+
+//maximum block sizes for small allocation, medium allocation, large allocation
+const U32 MAX_BLOCK_SIZES[LLPrivateMemoryPool::SUPER_ALLOCATION] = {64 << 10, 1 << 20, 4 << 20} ;
+
+//minimum slot sizes for small allocation, medium allocation, large allocation
+const U32 MIN_SLOT_SIZES[LLPrivateMemoryPool::SUPER_ALLOCATION] = {ATOMIC_MEM_SLOT, 2 << 10, 512 << 10};
+
+//maximum slot sizes for small allocation, medium allocation, large allocation
+const U32 MAX_SLOT_SIZES[LLPrivateMemoryPool::SUPER_ALLOCATION] = {(2 << 10) - ATOMIC_MEM_SLOT, (512 - 2) << 10, 4 << 20};
+
+//size of a block with multiple slots can not exceed CUT_OFF_SIZE
+const U32 CUT_OFF_SIZE = (64 << 10) ; //64 KB
+
+//max number of slots in a block
+const U32 MAX_NUM_SLOTS_IN_A_BLOCK = llmin(MIN_BLOCK_SIZES[0] / ATOMIC_MEM_SLOT, ATOMIC_MEM_SLOT * 8) ;
+
+//-------------------------------------------------------------
+//align val to be integer times of ATOMIC_MEM_SLOT
+U32 align(U32 val)
+{
+ U32 aligned = (val / ATOMIC_MEM_SLOT) * ATOMIC_MEM_SLOT ;
+ if(aligned < val)
+ {
+ aligned += ATOMIC_MEM_SLOT ;
+ }
+
+ return aligned ;
+}
+
+//-------------------------------------------------------------
+//class LLPrivateMemoryPool::LLMemoryBlock
+//-------------------------------------------------------------
+//
+//each memory block could fit for two page sizes: 0.75 * mSlotSize, which starts from the beginning of the memory chunk and grow towards the end of the
+//the block; another is mSlotSize, which starts from the end of the block and grows towards the beginning of the block.
+//
+LLPrivateMemoryPool::LLMemoryBlock::LLMemoryBlock()
+{
+ //empty
+}
+
+LLPrivateMemoryPool::LLMemoryBlock::~LLMemoryBlock()
+{
+ //empty
+}
+
+//create and initialize a memory block
+void LLPrivateMemoryPool::LLMemoryBlock::init(char* buffer, U32 buffer_size, U32 slot_size)
+{
+ mBuffer = buffer ;
+ mBufferSize = buffer_size ;
+ mSlotSize = slot_size ;
+ mTotalSlots = buffer_size / mSlotSize ;
+
+ llassert_always(buffer_size / mSlotSize <= MAX_NUM_SLOTS_IN_A_BLOCK) ; //max number is 128
+
+ mAllocatedSlots = 0 ;
+ mDummySize = 0 ;
+
+ //init the bit map.
+ //mark free bits
+ if(mTotalSlots > 32) //reserve extra space from mBuffer to store bitmap if needed.
+ {
+ mDummySize = ATOMIC_MEM_SLOT ;
+ mTotalSlots -= (mDummySize + mSlotSize - 1) / mSlotSize ;
+ mUsageBits = 0 ;
+
+ S32 usage_bit_len = (mTotalSlots + 31) / 32 ;
+
+ for(S32 i = 0 ; i < usage_bit_len - 1 ; i++)
+ {
+ *((U32*)mBuffer + i) = 0 ;
+ }
+ for(S32 i = usage_bit_len - 1 ; i < mDummySize / sizeof(U32) ; i++)
+ {
+ *((U32*)mBuffer + i) = 0xffffffff ;
+ }
+
+ if(mTotalSlots & 31)
+ {
+ *((U32*)mBuffer + usage_bit_len - 2) = (0xffffffff << (mTotalSlots & 31)) ;
+ }
+ }
+ else//no extra bitmap space reserved
+ {
+ mUsageBits = 0 ;
+ if(mTotalSlots & 31)
+ {
+ mUsageBits = (0xffffffff << (mTotalSlots & 31)) ;
+ }
+ }
+
+ mSelf = this ;
+ mNext = NULL ;
+ mPrev = NULL ;
+
+ llassert_always(mTotalSlots > 0) ;
+}
+
+//mark this block to be free with the memory [mBuffer, mBuffer + mBufferSize).
+void LLPrivateMemoryPool::LLMemoryBlock::setBuffer(char* buffer, U32 buffer_size)
+{
+ mBuffer = buffer ;
+ mBufferSize = buffer_size ;
+ mSelf = NULL ;
+ mTotalSlots = 0 ; //set the block is free.
+}
+
+//reserve a slot
+char* LLPrivateMemoryPool::LLMemoryBlock::allocate()
+{
+ llassert_always(mAllocatedSlots < mTotalSlots) ;
+
+ //find a free slot
+ U32* bits = NULL ;
+ U32 k = 0 ;
+ if(mUsageBits != 0xffffffff)
+ {
+ bits = &mUsageBits ;
+ }
+ else if(mDummySize > 0)//go to extra space
+ {
+ for(S32 i = 0 ; i < mDummySize / sizeof(U32); i++)
+ {
+ if(*((U32*)mBuffer + i) != 0xffffffff)
+ {
+ bits = (U32*)mBuffer + i ;
+ k = i + 1 ;
+ break ;
+ }
+ }
+ }
+ S32 idx = 0 ;
+ U32 tmp = *bits ;
+ for(; tmp & 1 ; tmp >>= 1, idx++) ;
+
+ //set the slot reserved
+ if(!idx)
+ {
+ *bits |= 1 ;
+ }
+ else
+ {
+ *bits |= (1 << idx) ;
+ }
+
+ mAllocatedSlots++ ;
+
+ return mBuffer + mDummySize + (k * 32 + idx) * mSlotSize ;
+}
+
+//free a slot
+void LLPrivateMemoryPool::LLMemoryBlock::freeMem(void* addr)
+{
+ //bit index
+ U32 idx = ((U32)addr - (U32)mBuffer - mDummySize) / mSlotSize ;
+
+ U32* bits = &mUsageBits ;
+ if(idx >= 32)
+ {
+ bits = (U32*)mBuffer + (idx - 32) / 32 ;
+ }
+
+ //reset the bit
+ if(idx & 31)
+ {
+ *bits &= ~(1 << (idx & 31)) ;
+ }
+ else
+ {
+ *bits &= ~1 ;
+ }
+
+ mAllocatedSlots-- ;
+}
+
+//for debug use: reset the entire bitmap.
+void LLPrivateMemoryPool::LLMemoryBlock::resetBitMap()
+{
+ for(S32 i = 0 ; i < mDummySize / sizeof(U32) ; i++)
+ {
+ *((U32*)mBuffer + i) = 0 ;
+ }
+ mUsageBits = 0 ;
+}
+//-------------------------------------------------------------------
+//class LLMemoryChunk
+//--------------------------------------------------------------------
+LLPrivateMemoryPool::LLMemoryChunk::LLMemoryChunk()
+{
+ //empty
+}
+
+LLPrivateMemoryPool::LLMemoryChunk::~LLMemoryChunk()
+{
+ //empty
+}
+
+//create and init a memory chunk
+void LLPrivateMemoryPool::LLMemoryChunk::init(char* buffer, U32 buffer_size, U32 min_slot_size, U32 max_slot_size, U32 min_block_size, U32 max_block_size)
+{
+ mBuffer = buffer ;
+ mBufferSize = buffer_size ;
+ mAlloatedSize = 0 ;
+
+ mMetaBuffer = mBuffer + sizeof(LLMemoryChunk) ;
+
+ mMinBlockSize = min_block_size; //page size
+ mMinSlotSize = min_slot_size;
+ mMaxSlotSize = max_slot_size ;
+ mBlockLevels = mMaxSlotSize / mMinSlotSize ;
+ mPartitionLevels = max_block_size / mMinBlockSize + 1 ;
+
+ S32 max_num_blocks = (buffer_size - sizeof(LLMemoryChunk) - mBlockLevels * sizeof(LLMemoryBlock*) - mPartitionLevels * sizeof(LLMemoryBlock*)) /
+ (mMinBlockSize + sizeof(LLMemoryBlock)) ;
+ //meta data space
+ mBlocks = (LLMemoryBlock*)mMetaBuffer ; //space reserved for all memory blocks.
+ mAvailBlockList = (LLMemoryBlock**)((char*)mBlocks + sizeof(LLMemoryBlock) * max_num_blocks) ;
+ mFreeSpaceList = (LLMemoryBlock**)((char*)mAvailBlockList + sizeof(LLMemoryBlock*) * mBlockLevels) ;
+
+ //data buffer, which can be used for allocation
+ mDataBuffer = (char*)mFreeSpaceList + sizeof(LLMemoryBlock*) * mPartitionLevels ;
+
+ //alignmnet
+ mDataBuffer = mBuffer + align(mDataBuffer - mBuffer) ;
+
+ //init
+ for(U32 i = 0 ; i < mBlockLevels; i++)
+ {
+ mAvailBlockList[i] = NULL ;
+ }
+ for(U32 i = 0 ; i < mPartitionLevels ; i++)
+ {
+ mFreeSpaceList[i] = NULL ;
+ }
+
+ //assign the entire chunk to the first block
+ mBlocks[0].mPrev = NULL ;
+ mBlocks[0].mNext = NULL ;
+ mBlocks[0].setBuffer(mDataBuffer, buffer_size - (mDataBuffer - mBuffer)) ;
+ addToFreeSpace(&mBlocks[0]) ;
+
+ mNext = NULL ;
+ mPrev = NULL ;
+}
+
+//static
+U32 LLPrivateMemoryPool::LLMemoryChunk::getMaxOverhead(U32 data_buffer_size, U32 min_slot_size,
+ U32 max_slot_size, U32 min_block_size, U32 max_block_size)
+{
+ //for large allocations, reserve some extra memory for meta data to avoid wasting much
+ if(data_buffer_size / min_slot_size < 64) //large allocations
+ {
+ U32 overhead = sizeof(LLMemoryChunk) + (data_buffer_size / min_block_size) * sizeof(LLMemoryBlock) +
+ sizeof(LLMemoryBlock*) * (max_slot_size / min_slot_size) + sizeof(LLMemoryBlock*) * (max_block_size / min_block_size + 1) ;
+
+ //round to integer times of min_block_size
+ overhead = ((overhead + min_block_size - 1) / min_block_size) * min_block_size ;
+ return overhead ;
+ }
+ else
+ {
+ return 0 ; //do not reserve extra overhead if for small allocations
+ }
+}
+
+char* LLPrivateMemoryPool::LLMemoryChunk::allocate(U32 size)
+{
+ if(mMinSlotSize > size)
+ {
+ size = mMinSlotSize ;
+ }
+ if(mAlloatedSize + size > mBufferSize - (mDataBuffer - mBuffer))
+ {
+ return NULL ; //no enough space in this chunk.
+ }
+
+ char* p = NULL ;
+ U32 blk_idx = getBlockLevel(size);
+
+ LLMemoryBlock* blk = NULL ;
+
+ //check if there is free block available
+ if(mAvailBlockList[blk_idx])
+ {
+ blk = mAvailBlockList[blk_idx] ;
+ p = blk->allocate() ;
+
+ if(blk->isFull())
+ {
+ popAvailBlockList(blk_idx) ;
+ }
+ }
+
+ //ask for a new block
+ if(!p)
+ {
+ blk = addBlock(blk_idx) ;
+ if(blk)
+ {
+ p = blk->allocate() ;
+
+ if(blk->isFull())
+ {
+ popAvailBlockList(blk_idx) ;
+ }
+ }
+ }
+
+ //ask for space from larger blocks
+ if(!p)
+ {
+ for(S32 i = blk_idx + 1 ; i < mBlockLevels; i++)
+ {
+ if(mAvailBlockList[i])
+ {
+ blk = mAvailBlockList[i] ;
+ p = blk->allocate() ;
+
+ if(blk->isFull())
+ {
+ popAvailBlockList(i) ;
+ }
+ break ;
+ }
+ }
+ }
+
+ if(p && blk)
+ {
+ mAlloatedSize += blk->getSlotSize() ;
+ }
+ return p ;
+}
+
+void LLPrivateMemoryPool::LLMemoryChunk::freeMem(void* addr)
+{
+ U32 blk_idx = getPageIndex((U32)addr) ;
+ LLMemoryBlock* blk = (LLMemoryBlock*)(mMetaBuffer + blk_idx * sizeof(LLMemoryBlock)) ;
+ blk = blk->mSelf ;
+
+ bool was_full = blk->isFull() ;
+ blk->freeMem(addr) ;
+ mAlloatedSize -= blk->getSlotSize() ;
+
+ if(blk->empty())
+ {
+ removeBlock(blk) ;
+ }
+ else if(was_full)
+ {
+ addToAvailBlockList(blk) ;
+ }
+}
+
+bool LLPrivateMemoryPool::LLMemoryChunk::empty()
+{
+ return !mAlloatedSize ;
+}
+
+bool LLPrivateMemoryPool::LLMemoryChunk::containsAddress(const char* addr) const
+{
+ return (U32)mBuffer <= (U32)addr && (U32)mBuffer + mBufferSize > (U32)addr ;
+}
+
+//debug use
+void LLPrivateMemoryPool::LLMemoryChunk::dump()
+{
+#if 0
+ //sanity check
+ //for(S32 i = 0 ; i < mBlockLevels ; i++)
+ //{
+ // LLMemoryBlock* blk = mAvailBlockList[i] ;
+ // while(blk)
+ // {
+ // blk_list.push_back(blk) ;
+ // blk = blk->mNext ;
+ // }
+ //}
+ for(S32 i = 0 ; i < mPartitionLevels ; i++)
+ {
+ LLMemoryBlock* blk = mFreeSpaceList[i] ;
+ while(blk)
+ {
+ blk_list.push_back(blk) ;
+ blk = blk->mNext ;
+ }
+ }
+
+ std::sort(blk_list.begin(), blk_list.end(), LLMemoryBlock::CompareAddress());
+
+ U32 total_size = blk_list[0]->getBufferSize() ;
+ for(U32 i = 1 ; i < blk_list.size(); i++)
+ {
+ total_size += blk_list[i]->getBufferSize() ;
+ if((U32)blk_list[i]->getBuffer() < (U32)blk_list[i-1]->getBuffer() + blk_list[i-1]->getBufferSize())
+ {
+ llerrs << "buffer corrupted." << llendl ;
+ }
+ }
+
+ llassert_always(total_size + mMinBlockSize >= mBufferSize - ((U32)mDataBuffer - (U32)mBuffer)) ;
+
+ U32 blk_num = (mBufferSize - (mDataBuffer - mBuffer)) / mMinBlockSize ;
+ for(U32 i = 0 ; i < blk_num ; )
+ {
+ LLMemoryBlock* blk = &mBlocks[i] ;
+ if(blk->mSelf)
+ {
+ U32 end = blk->getBufferSize() / mMinBlockSize ;
+ for(U32 j = 0 ; j < end ; j++)
+ {
+ llassert_always(blk->mSelf == blk || !blk->mSelf) ;
+ }
+ i += end ;
+ }
+ else
+ {
+ llerrs << "gap happens" << llendl ;
+ }
+ }
+#endif
+#if 0
+ llinfos << "---------------------------" << llendl ;
+ llinfos << "Chunk buffer: " << (U32)getBuffer() << " size: " << getBufferSize() << llendl ;
+
+ llinfos << "available blocks ... " << llendl ;
+ for(S32 i = 0 ; i < mBlockLevels ; i++)
+ {
+ LLMemoryBlock* blk = mAvailBlockList[i] ;
+ while(blk)
+ {
+ llinfos << "blk buffer " << (U32)blk->getBuffer() << " size: " << blk->getBufferSize() << llendl ;
+ blk = blk->mNext ;
+ }
+ }
+
+ llinfos << "free blocks ... " << llendl ;
+ for(S32 i = 0 ; i < mPartitionLevels ; i++)
+ {
+ LLMemoryBlock* blk = mFreeSpaceList[i] ;
+ while(blk)
+ {
+ llinfos << "blk buffer " << (U32)blk->getBuffer() << " size: " << blk->getBufferSize() << llendl ;
+ blk = blk->mNext ;
+ }
+ }
+#endif
+}
+
+//compute the size for a block, the size is round to integer times of mMinBlockSize.
+U32 LLPrivateMemoryPool::LLMemoryChunk::calcBlockSize(U32 slot_size)
+{
+ //
+ //Note: we try to make a block to have 32 slots if the size is not over 32 pages
+ //32 is the number of bits of an integer in a 32-bit system
+ //
+
+ U32 block_size;
+ U32 cut_off_size = llmin(CUT_OFF_SIZE, (U32)(mMinBlockSize << 5)) ;
+
+ if((slot_size << 5) <= mMinBlockSize)//for small allocations, return one page
+ {
+ block_size = mMinBlockSize ;
+ }
+ else if(slot_size >= cut_off_size)//for large allocations, return one-slot block
+ {
+ block_size = (slot_size / mMinBlockSize) * mMinBlockSize ;
+ if(block_size < slot_size)
+ {
+ block_size += mMinBlockSize ;
+ }
+ }
+ else //medium allocations
+ {
+ if((slot_size << 5) >= cut_off_size)
+ {
+ block_size = cut_off_size ;
+ }
+ else
+ {
+ block_size = ((slot_size << 5) / mMinBlockSize) * mMinBlockSize ;
+ }
+ }
+
+ llassert_always(block_size >= slot_size) ;
+
+ return block_size ;
+}
+
+//create a new block in the chunk
+LLPrivateMemoryPool::LLMemoryBlock* LLPrivateMemoryPool::LLMemoryChunk::addBlock(U32 blk_idx)
+{
+ U32 slot_size = mMinSlotSize * (blk_idx + 1) ;
+ U32 preferred_block_size = calcBlockSize(slot_size) ;
+ U16 idx = getPageLevel(preferred_block_size);
+ LLMemoryBlock* blk = NULL ;
+
+ if(mFreeSpaceList[idx])//if there is free slot for blk_idx
+ {
+ blk = createNewBlock(mFreeSpaceList[idx], preferred_block_size, slot_size, blk_idx) ;
+ }
+ else if(mFreeSpaceList[mPartitionLevels - 1]) //search free pool
+ {
+ blk = createNewBlock(mFreeSpaceList[mPartitionLevels - 1], preferred_block_size, slot_size, blk_idx) ;
+ }
+ else //search for other non-preferred but enough space slot.
+ {
+ S32 min_idx = 0 ;
+ if(slot_size > mMinBlockSize)
+ {
+ min_idx = getPageLevel(slot_size) ;
+ }
+ for(S32 i = (S32)idx - 1 ; i >= min_idx ; i--) //search the small slots first
+ {
+ if(mFreeSpaceList[i])
+ {
+ U32 new_preferred_block_size = mFreeSpaceList[i]->getBufferSize();
+ new_preferred_block_size = (new_preferred_block_size / mMinBlockSize) * mMinBlockSize ; //round to integer times of mMinBlockSize.
+
+ //create a NEW BLOCK THERE.
+ if(new_preferred_block_size >= slot_size) //at least there is space for one slot.
+ {
+
+ blk = createNewBlock(mFreeSpaceList[i], new_preferred_block_size, slot_size, blk_idx) ;
+ }
+ break ;
+ }
+ }
+
+ if(!blk)
+ {
+ for(U16 i = idx + 1 ; i < mPartitionLevels - 1; i++) //search the large slots
+ {
+ if(mFreeSpaceList[i])
+ {
+ //create a NEW BLOCK THERE.
+ blk = createNewBlock(mFreeSpaceList[i], preferred_block_size, slot_size, blk_idx) ;
+ break ;
+ }
+ }
+ }
+ }
+
+ return blk ;
+}
+
+//create a new block at the designed location
+LLPrivateMemoryPool::LLMemoryBlock* LLPrivateMemoryPool::LLMemoryChunk::createNewBlock(LLMemoryBlock* blk, U32 buffer_size, U32 slot_size, U32 blk_idx)
+{
+ //unlink from the free space
+ removeFromFreeSpace(blk) ;
+
+ //check the rest space
+ U32 new_free_blk_size = blk->getBufferSize() - buffer_size ;
+ if(new_free_blk_size < mMinBlockSize) //can not partition the memory into size smaller than mMinBlockSize
+ {
+ new_free_blk_size = 0 ; //discard the last small extra space.
+ }
+
+ //add the rest space back to the free list
+ if(new_free_blk_size > 0) //blk still has free space
+ {
+ LLMemoryBlock* next_blk = blk + (buffer_size / mMinBlockSize) ;
+ next_blk->mPrev = NULL ;
+ next_blk->mNext = NULL ;
+ next_blk->setBuffer(blk->getBuffer() + buffer_size, new_free_blk_size) ;
+ addToFreeSpace(next_blk) ;
+ }
+
+ blk->init(blk->getBuffer(), buffer_size, slot_size) ;
+ //insert to the available block list...
+ mAvailBlockList[blk_idx] = blk ;
+
+ //mark the address map: all blocks covered by this block space pointing back to this block.
+ U32 end = (buffer_size / mMinBlockSize) ;
+ for(U32 i = 1 ; i < end ; i++)
+ {
+ (blk + i)->mSelf = blk ;
+ }
+
+ return blk ;
+}
+
+//delete a block, release the block to the free pool.
+void LLPrivateMemoryPool::LLMemoryChunk::removeBlock(LLMemoryBlock* blk)
+{
+ //remove from the available block list
+ if(blk->mPrev)
+ {
+ blk->mPrev->mNext = blk->mNext ;
+ }
+ if(blk->mNext)
+ {
+ blk->mNext->mPrev = blk->mPrev ;
+ }
+ U32 blk_idx = getBlockLevel(blk->getSlotSize());
+ if(mAvailBlockList[blk_idx] == blk)
+ {
+ mAvailBlockList[blk_idx] = blk->mNext ;
+ }
+
+ blk->mNext = NULL ;
+ blk->mPrev = NULL ;
+
+ //mark it free
+ blk->setBuffer(blk->getBuffer(), blk->getBufferSize()) ;
+
+#if 1
+ //merge blk with neighbors if possible
+ if(blk->getBuffer() > mDataBuffer) //has the left neighbor
+ {
+ if((blk - 1)->mSelf->isFree())
+ {
+ LLMemoryBlock* left_blk = (blk - 1)->mSelf ;
+ removeFromFreeSpace((blk - 1)->mSelf);
+ left_blk->setBuffer(left_blk->getBuffer(), left_blk->getBufferSize() + blk->getBufferSize()) ;
+ blk = left_blk ;
+ }
+ }
+ if(blk->getBuffer() + blk->getBufferSize() <= mBuffer + mBufferSize - mMinBlockSize) //has the right neighbor
+ {
+ U32 d = blk->getBufferSize() / mMinBlockSize ;
+ if((blk + d)->isFree())
+ {
+ LLMemoryBlock* right_blk = blk + d ;
+ removeFromFreeSpace(blk + d) ;
+ blk->setBuffer(blk->getBuffer(), blk->getBufferSize() + right_blk->getBufferSize()) ;
+ }
+ }
+#endif
+
+ addToFreeSpace(blk) ;
+
+ return ;
+}
+
+//the top block in the list is full, pop it out of the list
+void LLPrivateMemoryPool::LLMemoryChunk::popAvailBlockList(U32 blk_idx)
+{
+ if(mAvailBlockList[blk_idx])
+ {
+ LLMemoryBlock* next = mAvailBlockList[blk_idx]->mNext ;
+ if(next)
+ {
+ next->mPrev = NULL ;
+ }
+ mAvailBlockList[blk_idx]->mPrev = NULL ;
+ mAvailBlockList[blk_idx]->mNext = NULL ;
+ mAvailBlockList[blk_idx] = next ;
+ }
+}
+
+//add the block back to the free pool
+void LLPrivateMemoryPool::LLMemoryChunk::addToFreeSpace(LLMemoryBlock* blk)
+{
+ llassert_always(!blk->mPrev) ;
+ llassert_always(!blk->mNext) ;
+
+ U16 free_idx = blk->getBufferSize() / mMinBlockSize - 1;
+
+ (blk + free_idx)->mSelf = blk ; //mark the end pointing back to the head.
+ free_idx = llmin(free_idx, (U16)(mPartitionLevels - 1)) ;
+
+ blk->mNext = mFreeSpaceList[free_idx] ;
+ if(mFreeSpaceList[free_idx])
+ {
+ mFreeSpaceList[free_idx]->mPrev = blk ;
+ }
+ mFreeSpaceList[free_idx] = blk ;
+ blk->mPrev = NULL ;
+ blk->mSelf = blk ;
+
+ return ;
+}
+
+//remove the space from the free pool
+void LLPrivateMemoryPool::LLMemoryChunk::removeFromFreeSpace(LLMemoryBlock* blk)
+{
+ U16 free_idx = blk->getBufferSize() / mMinBlockSize - 1;
+ free_idx = llmin(free_idx, (U16)(mPartitionLevels - 1)) ;
+
+ if(mFreeSpaceList[free_idx] == blk)
+ {
+ mFreeSpaceList[free_idx] = blk->mNext ;
+ }
+ if(blk->mPrev)
+ {
+ blk->mPrev->mNext = blk->mNext ;
+ }
+ if(blk->mNext)
+ {
+ blk->mNext->mPrev = blk->mPrev ;
+ }
+ blk->mNext = NULL ;
+ blk->mPrev = NULL ;
+ blk->mSelf = NULL ;
+
+ return ;
+}
+
+void LLPrivateMemoryPool::LLMemoryChunk::addToAvailBlockList(LLMemoryBlock* blk)
+{
+ llassert_always(!blk->mPrev) ;
+ llassert_always(!blk->mNext) ;
+
+ U32 blk_idx = getBlockLevel(blk->getSlotSize());
+
+ blk->mNext = mAvailBlockList[blk_idx] ;
+ if(blk->mNext)
+ {
+ blk->mNext->mPrev = blk ;
+ }
+ blk->mPrev = NULL ;
+ mAvailBlockList[blk_idx] = blk ;
+
+ return ;
+}
+
+U32 LLPrivateMemoryPool::LLMemoryChunk::getPageIndex(U32 addr)
+{
+ return (addr - (U32)mDataBuffer) / mMinBlockSize ;
+}
+
+//for mAvailBlockList
+U32 LLPrivateMemoryPool::LLMemoryChunk::getBlockLevel(U32 size)
+{
+ llassert(size >= mMinSlotSize && size <= mMaxSlotSize) ;
+
+ //start from 0
+ return (size + mMinSlotSize - 1) / mMinSlotSize - 1 ;
+}
+
+//for mFreeSpaceList
+U16 LLPrivateMemoryPool::LLMemoryChunk::getPageLevel(U32 size)
+{
+ //start from 0
+ U16 level = size / mMinBlockSize - 1 ;
+ if(level >= mPartitionLevels)
+ {
+ level = mPartitionLevels - 1 ;
+ }
+ return level ;
+}
+
+//-------------------------------------------------------------------
+//class LLPrivateMemoryPool
+//--------------------------------------------------------------------
+const U32 CHUNK_SIZE = 4 << 20 ; //4 MB
+const U32 LARGE_CHUNK_SIZE = 4 * CHUNK_SIZE ; //16 MB
+LLPrivateMemoryPool::LLPrivateMemoryPool(S32 type, U32 max_pool_size) :
+ mMutexp(NULL),
+ mReservedPoolSize(0),
+ mHashFactor(1),
+ mType(type),
+ mMaxPoolSize(max_pool_size)
+{
+ if(type == STATIC_THREADED || type == VOLATILE_THREADED)
+ {
+ mMutexp = new LLMutex(NULL) ;
+ }
+
+ for(S32 i = 0 ; i < SUPER_ALLOCATION ; i++)
+ {
+ mChunkList[i] = NULL ;
+ }
+
+ mNumOfChunks = 0 ;
+}
+
+LLPrivateMemoryPool::~LLPrivateMemoryPool()
+{
+ destroyPool();
+ delete mMutexp ;
+}
+
+char* LLPrivateMemoryPool::allocate(U32 size)
+{
+ if(!size)
+ {
+ return NULL ;
+ }
+
+ //if the asked size larger than MAX_BLOCK_SIZE, fetch from heap directly, the pool does not manage it
+ if(size >= CHUNK_SIZE)
+ {
+ return (char*)malloc(size) ;
+ }
+
+ char* p = NULL ;
+
+ //find the appropriate chunk
+ S32 chunk_idx = getChunkIndex(size) ;
+
+ lock() ;
+
+ LLMemoryChunk* chunk = mChunkList[chunk_idx];
+ while(chunk)
+ {
+ if((p = chunk->allocate(size)))
+ {
+ break ;
+ }
+ chunk = chunk->mNext ;
+ }
+
+ //fetch new memory chunk
+ if(!p)
+ {
+ if(mReservedPoolSize + CHUNK_SIZE > mMaxPoolSize)
+ {
+ chunk = mChunkList[chunk_idx];
+ while(chunk)
+ {
+ if((p = chunk->allocate(size)))
+ {
+ break ;
+ }
+ chunk = chunk->mNext ;
+ }
+ }
+ else
+ {
+ chunk = addChunk(chunk_idx) ;
+ if(chunk)
+ {
+ p = chunk->allocate(size) ;
+ }
+ }
+ }
+
+ unlock() ;
+
+ if(!p) //to get memory from the private pool failed, try the heap directly
+ {
+ static bool to_log = true ;
+
+ if(to_log)
+ {
+ llwarns << "The memory pool overflows, now using heap directly!" << llendl ;
+ to_log = false ;
+ }
+
+ return (char*)malloc(size) ;
+ }
+
+ return p ;
+}
+
+void LLPrivateMemoryPool::freeMem(void* addr)
+{
+ if(!addr)
+ {
+ return ;
+ }
+
+ lock() ;
+
+ LLMemoryChunk* chunk = findChunk((char*)addr) ;
+
+ if(!chunk)
+ {
+ free(addr) ; //release from heap
+ }
+ else
+ {
+ chunk->freeMem(addr) ;
+
+ if(chunk->empty())
+ {
+ removeChunk(chunk) ;
+ }
+ }
+
+ unlock() ;
+}
+
+void LLPrivateMemoryPool::dump()
+{
+}
+
+U32 LLPrivateMemoryPool::getTotalAllocatedSize()
+{
+ U32 total_allocated = 0 ;
+
+ LLMemoryChunk* chunk ;
+ for(S32 i = 0 ; i < SUPER_ALLOCATION ; i++)
+ {
+ chunk = mChunkList[i];
+ while(chunk)
+ {
+ total_allocated += chunk->getAllocatedSize() ;
+ chunk = chunk->mNext ;
+ }
+ }
+
+ return total_allocated ;
+}
+
+void LLPrivateMemoryPool::lock()
+{
+ if(mMutexp)
+ {
+ mMutexp->lock() ;
+ }
+}
+
+void LLPrivateMemoryPool::unlock()
+{
+ if(mMutexp)
+ {
+ mMutexp->unlock() ;
+ }
+}
+
+S32 LLPrivateMemoryPool::getChunkIndex(U32 size)
+{
+ S32 i ;
+ for(i = 0 ; size > MAX_SLOT_SIZES[i]; i++);
+
+ llassert_always(i < SUPER_ALLOCATION);
+
+ return i ;
+}
+
+//destroy the entire pool
+void LLPrivateMemoryPool::destroyPool()
+{
+ lock() ;
+
+ if(mNumOfChunks > 0)
+ {
+ llwarns << "There is some memory not freed when destroy the memory pool!" << llendl ;
+ }
+
+ mNumOfChunks = 0 ;
+ mChunkHashList.clear() ;
+ mHashFactor = 1 ;
+ for(S32 i = 0 ; i < SUPER_ALLOCATION ; i++)
+ {
+ mChunkList[i] = NULL ;
+ }
+
+ unlock() ;
+}
+
+bool LLPrivateMemoryPool::checkSize(U32 asked_size)
+{
+ if(mReservedPoolSize + asked_size > mMaxPoolSize)
+ {
+ llinfos << "Max pool size: " << mMaxPoolSize << llendl ;
+ llinfos << "Total reserved size: " << mReservedPoolSize + asked_size << llendl ;
+ llinfos << "Total_allocated Size: " << getTotalAllocatedSize() << llendl ;
+
+ //llerrs << "The pool is overflowing..." << llendl ;
+
+ return false ;
+ }
+
+ return true ;
+}
+
+LLPrivateMemoryPool::LLMemoryChunk* LLPrivateMemoryPool::addChunk(S32 chunk_index)
+{
+ U32 preferred_size ;
+ U32 overhead ;
+ if(chunk_index < LARGE_ALLOCATION)
+ {
+ preferred_size = CHUNK_SIZE ; //4MB
+ overhead = LLMemoryChunk::getMaxOverhead(preferred_size, MIN_SLOT_SIZES[chunk_index],
+ MAX_SLOT_SIZES[chunk_index], MIN_BLOCK_SIZES[chunk_index], MAX_BLOCK_SIZES[chunk_index]) ;
+ }
+ else
+ {
+ preferred_size = LARGE_CHUNK_SIZE ; //16MB
+ overhead = LLMemoryChunk::getMaxOverhead(preferred_size, MIN_SLOT_SIZES[chunk_index],
+ MAX_SLOT_SIZES[chunk_index], MIN_BLOCK_SIZES[chunk_index], MAX_BLOCK_SIZES[chunk_index]) ;
+ }
+
+ if(!checkSize(preferred_size + overhead))
+ {
+ return NULL ;
+ }
+
+ mReservedPoolSize += preferred_size + overhead ;
+
+ char* buffer = (char*)malloc(preferred_size + overhead) ;
+ if(!buffer)
+ {
+ return NULL ;
+ }
+
+ LLMemoryChunk* chunk = new (buffer) LLMemoryChunk() ;
+ chunk->init(buffer, preferred_size + overhead, MIN_SLOT_SIZES[chunk_index],
+ MAX_SLOT_SIZES[chunk_index], MIN_BLOCK_SIZES[chunk_index], MAX_BLOCK_SIZES[chunk_index]) ;
+
+ //add to the tail of the linked list
+ {
+ if(!mChunkList[chunk_index])
+ {
+ mChunkList[chunk_index] = chunk ;
+ }
+ else
+ {
+ LLMemoryChunk* cur = mChunkList[chunk_index] ;
+ while(cur->mNext)
+ {
+ cur = cur->mNext ;
+ }
+ cur->mNext = chunk ;
+ chunk->mPrev = cur ;
+ }
+ }
+
+ //insert into the hash table
+ addToHashTable(chunk) ;
+
+ mNumOfChunks++;
+
+ return chunk ;
+}
+
+void LLPrivateMemoryPool::removeChunk(LLMemoryChunk* chunk)
+{
+ if(!chunk)
+ {
+ return ;
+ }
+
+ //remove from the linked list
+ for(S32 i = 0 ; i < SUPER_ALLOCATION ; i++)
+ {
+ if(mChunkList[i] == chunk)
+ {
+ mChunkList[i] = chunk->mNext ;
+ }
+ }
+
+ if(chunk->mPrev)
+ {
+ chunk->mPrev->mNext = chunk->mNext ;
+ }
+ if(chunk->mNext)
+ {
+ chunk->mNext->mPrev = chunk->mPrev ;
+ }
+
+ //remove from the hash table
+ removeFromHashTable(chunk) ;
+
+ mNumOfChunks--;
+ mReservedPoolSize -= chunk->getBufferSize() ;
+
+ //release memory
+ free(chunk->getBuffer()) ;
+}
+
+U16 LLPrivateMemoryPool::findHashKey(const char* addr)
+{
+ return (((U32)addr) / CHUNK_SIZE) % mHashFactor ;
+}
+
+LLPrivateMemoryPool::LLMemoryChunk* LLPrivateMemoryPool::findChunk(const char* addr)
+{
+ U16 key = findHashKey(addr) ;
+ if(mChunkHashList.size() <= key)
+ {
+ return NULL ;
+ }
+
+ return mChunkHashList[key].findChunk(addr) ;
+}
+
+void LLPrivateMemoryPool::addToHashTable(LLMemoryChunk* chunk)
+{
+ static const U16 HASH_FACTORS[] = {41, 83, 193, 317, 419, 523, 719, 997, 1523, 0xFFFF};
+
+ U16 i ;
+ if(mChunkHashList.empty())
+ {
+ mHashFactor = HASH_FACTORS[0] ;
+ rehash() ;
+ }
+
+ U16 start_key = findHashKey(chunk->getBuffer()) ;
+ U16 end_key = findHashKey(chunk->getBuffer() + chunk->getBufferSize() - 1) ;
+ bool need_rehash = false ;
+
+ if(mChunkHashList[start_key].hasElement(chunk))
+ {
+ return; //already inserted.
+ }
+ need_rehash = mChunkHashList[start_key].add(chunk) ;
+
+ if(start_key == end_key && !need_rehash)
+ {
+ return ; //done
+ }
+
+ if(!need_rehash)
+ {
+ need_rehash = mChunkHashList[end_key].add(chunk) ;
+ }
+
+ if(!need_rehash)
+ {
+ if(end_key < start_key)
+ {
+ need_rehash = fillHashTable(start_key + 1, mHashFactor, chunk) ;
+ if(!need_rehash)
+ {
+ need_rehash = fillHashTable(0, end_key, chunk) ;
+ }
+ }
+ else
+ {
+ need_rehash = fillHashTable(start_key + 1, end_key, chunk) ;
+ }
+ }
+
+ if(need_rehash)
+ {
+ i = 0 ;
+ while(HASH_FACTORS[i] <= mHashFactor) i++;
+
+ mHashFactor = HASH_FACTORS[i] ;
+ llassert_always(mHashFactor != 0xFFFF) ;//stop point to prevent endlessly recursive calls
+
+ rehash() ;
+ }
+}
+
+void LLPrivateMemoryPool::removeFromHashTable(LLMemoryChunk* chunk)
+{
+ U16 start_key = findHashKey(chunk->getBuffer()) ;
+ U16 end_key = findHashKey(chunk->getBuffer() + chunk->getBufferSize() - 1) ;
+
+ mChunkHashList[start_key].remove(chunk) ;
+ if(start_key == end_key)
+ {
+ return ; //done
+ }
+
+ mChunkHashList[end_key].remove(chunk) ;
+
+ if(end_key < start_key)
+ {
+ for(U16 i = start_key + 1 ; i < mHashFactor; i++)
+ {
+ mChunkHashList[i].remove(chunk) ;
+ }
+ for(U16 i = 0 ; i < end_key; i++)
+ {
+ mChunkHashList[i].remove(chunk) ;
+ }
+ }
+ else
+ {
+ for(U16 i = start_key + 1 ; i < end_key; i++)
+ {
+ mChunkHashList[i].remove(chunk) ;
+ }
+ }
+}
+
+void LLPrivateMemoryPool::rehash()
+{
+ llinfos << "new hash factor: " << mHashFactor << llendl ;
+
+ mChunkHashList.clear() ;
+ mChunkHashList.resize(mHashFactor) ;
+
+ LLMemoryChunk* chunk ;
+ for(U16 i = 0 ; i < SUPER_ALLOCATION ; i++)
+ {
+ chunk = mChunkList[i] ;
+ while(chunk)
+ {
+ addToHashTable(chunk) ;
+ chunk = chunk->mNext ;
+ }
+ }
+}
+
+bool LLPrivateMemoryPool::fillHashTable(U16 start, U16 end, LLMemoryChunk* chunk)
+{
+ for(U16 i = start; i < end; i++)
+ {
+ if(mChunkHashList[i].add(chunk))
+ {
+ return true ;
+ }
+ }
+
+ return false ;
+}
+
+//--------------------------------------------------------------------
+// class LLChunkHashElement
+//--------------------------------------------------------------------
+LLPrivateMemoryPool::LLMemoryChunk* LLPrivateMemoryPool::LLChunkHashElement::findChunk(const char* addr)
+{
+ if(mFirst && mFirst->containsAddress(addr))
+ {
+ return mFirst ;
+ }
+ else if(mSecond && mSecond->containsAddress(addr))
+ {
+ return mSecond ;
+ }
+
+ return NULL ;
+}
+
+//return false if successfully inserted to the hash slot.
+bool LLPrivateMemoryPool::LLChunkHashElement::add(LLPrivateMemoryPool::LLMemoryChunk* chunk)
+{
+ llassert_always(!hasElement(chunk)) ;
+
+ if(!mFirst)
+ {
+ mFirst = chunk ;
+ }
+ else if(!mSecond)
+ {
+ mSecond = chunk ;
+ }
+ else
+ {
+ return true ; //failed
+ }
+
+ return false ;
+}
+
+void LLPrivateMemoryPool::LLChunkHashElement::remove(LLPrivateMemoryPool::LLMemoryChunk* chunk)
+{
+ if(mFirst == chunk)
+ {
+ mFirst = NULL ;
+ }
+ else if(mSecond ==chunk)
+ {
+ mSecond = NULL ;
+ }
+ else
+ {
+ llerrs << "This slot does not contain this chunk!" << llendl ;
+ }
+}
+
+//--------------------------------------------------------------------
+//class LLPrivateMemoryPoolManager
+//--------------------------------------------------------------------
+LLPrivateMemoryPoolManager* LLPrivateMemoryPoolManager::sInstance = NULL ;
+BOOL LLPrivateMemoryPoolManager::sPrivatePoolEnabled = FALSE ;
+std::vector<LLPrivateMemoryPool*> LLPrivateMemoryPoolManager::sDanglingPoolList ;
+
+LLPrivateMemoryPoolManager::LLPrivateMemoryPoolManager(BOOL enabled, U32 max_pool_size)
+{
+ mPoolList.resize(LLPrivateMemoryPool::MAX_TYPES) ;
+
+ for(S32 i = 0 ; i < LLPrivateMemoryPool::MAX_TYPES; i++)
+ {
+ mPoolList[i] = NULL ;
+ }
+
+ sPrivatePoolEnabled = enabled ;
+
+ const U32 MAX_POOL_SIZE = 256 * 1024 * 1024 ; //256 MB
+ mMaxPrivatePoolSize = llmax(max_pool_size, MAX_POOL_SIZE) ;
+}
+
+LLPrivateMemoryPoolManager::~LLPrivateMemoryPoolManager()
+{
+
+#if __DEBUG_PRIVATE_MEM__
+ if(!sMemAllocationTracker.empty())
+ {
+ llwarns << "there is potential memory leaking here. The list of not freed memory blocks are from: " <<llendl ;
+
+ S32 k = 0 ;
+ for(mem_allocation_info_t::iterator iter = sMemAllocationTracker.begin() ; iter != sMemAllocationTracker.end() ; ++iter)
+ {
+ llinfos << k++ << ", " << (U32)iter->first << " : " << iter->second << llendl ;
+ }
+ sMemAllocationTracker.clear() ;
+ }
+#endif
+
+#if 0
+ //all private pools should be released by their owners before reaching here.
+ for(S32 i = 0 ; i < LLPrivateMemoryPool::MAX_TYPES; i++)
+ {
+ llassert_always(!mPoolList[i]) ;
+ }
+ mPoolList.clear() ;
+
+#else
+ //forcefully release all memory
+ for(S32 i = 0 ; i < LLPrivateMemoryPool::MAX_TYPES; i++)
+ {
+ if(mPoolList[i])
+ {
+ if(mPoolList[i]->isEmpty())
+ {
+ delete mPoolList[i] ;
+ }
+ else
+ {
+ //can not delete this pool because it has alloacted memory to be freed.
+ //move it to the dangling list.
+ sDanglingPoolList.push_back(mPoolList[i]) ;
+ }
+
+ mPoolList[i] = NULL ;
+ }
+ }
+ mPoolList.clear() ;
+#endif
+}
+
+//static
+void LLPrivateMemoryPoolManager::initClass(BOOL enabled, U32 max_pool_size)
+{
+ llassert_always(!sInstance) ;
+
+ sInstance = new LLPrivateMemoryPoolManager(enabled, max_pool_size) ;
+}
+
+//static
+LLPrivateMemoryPoolManager* LLPrivateMemoryPoolManager::getInstance()
+{
+ //if(!sInstance)
+ //{
+ // sInstance = new LLPrivateMemoryPoolManager(FALSE) ;
+ //}
+ return sInstance ;
+}
+
+//static
+void LLPrivateMemoryPoolManager::destroyClass()
+{
+ if(sInstance)
+ {
+ delete sInstance ;
+ sInstance = NULL ;
+ }
+}
+
+LLPrivateMemoryPool* LLPrivateMemoryPoolManager::newPool(S32 type)
+{
+ if(!sPrivatePoolEnabled)
+ {
+ return NULL ;
+ }
+
+ if(!mPoolList[type])
+ {
+ mPoolList[type] = new LLPrivateMemoryPool(type, mMaxPrivatePoolSize) ;
+ }
+
+ return mPoolList[type] ;
+}
+
+void LLPrivateMemoryPoolManager::deletePool(LLPrivateMemoryPool* pool)
+{
+ if(pool && pool->isEmpty())
+ {
+ mPoolList[pool->getType()] = NULL ;
+ delete pool;
+ }
+}
+
+//debug
+void LLPrivateMemoryPoolManager::updateStatistics()
+{
+ mTotalReservedSize = 0 ;
+ mTotalAllocatedSize = 0 ;
+
+ for(U32 i = 0; i < mPoolList.size(); i++)
+ {
+ if(mPoolList[i])
+ {
+ mTotalReservedSize += mPoolList[i]->getTotalReservedSize() ;
+ mTotalAllocatedSize += mPoolList[i]->getTotalAllocatedSize() ;
+ }
+ }
+}
+
+#if __DEBUG_PRIVATE_MEM__
+//static
+char* LLPrivateMemoryPoolManager::allocate(LLPrivateMemoryPool* poolp, U32 size, const char* function, const int line)
+{
+ char* p ;
+
+ if(!poolp)
+ {
+ p = (char*)malloc(size) ;
+ }
+ else
+ {
+ p = poolp->allocate(size) ;
+ }
+
+ if(p)
+ {
+ char num[16] ;
+ sprintf(num, " line: %d ", line) ;
+ std::string str(function) ;
+ str += num;
+
+ sMemAllocationTracker[p] = str ;
+ }
+
+ return p ;
+}
+#else
+//static
+char* LLPrivateMemoryPoolManager::allocate(LLPrivateMemoryPool* poolp, U32 size)
+{
+ if(poolp)
+ {
+ return poolp->allocate(size) ;
+ }
+ else
+ {
+ return (char*)malloc(size) ;
+ }
+}
+#endif
+
+//static
+void LLPrivateMemoryPoolManager::freeMem(LLPrivateMemoryPool* poolp, void* addr)
+{
+ if(!addr)
+ {
+ return ;
+ }
+
+#if __DEBUG_PRIVATE_MEM__
+ sMemAllocationTracker.erase((char*)addr) ;
+#endif
+
+ if(poolp)
+ {
+ poolp->freeMem(addr) ;
+ }
+ else
+ {
+ if(!sPrivatePoolEnabled)
+ {
+ free(addr) ; //private pool is disabled.
+ }
+ else if(!sInstance) //the private memory manager is destroyed, try the dangling list
+ {
+ for(S32 i = 0 ; i < sDanglingPoolList.size(); i++)
+ {
+ if(sDanglingPoolList[i]->findChunk((char*)addr))
+ {
+ sDanglingPoolList[i]->freeMem(addr) ;
+ if(sDanglingPoolList[i]->isEmpty())
+ {
+ delete sDanglingPoolList[i] ;
+
+ if(i < sDanglingPoolList.size() - 1)
+ {
+ sDanglingPoolList[i] = sDanglingPoolList[sDanglingPoolList.size() - 1] ;
+ }
+ sDanglingPoolList.pop_back() ;
+ }
+
+ addr = NULL ;
+ break ;
+ }
+ }
+ llassert_always(!addr) ; //addr should be release before hitting here!
+ }
+ else
+ {
+ llerrs << "private pool is used before initialized.!" << llendl ;
+ }
+ }
+}
+
+//--------------------------------------------------------------------
+//class LLPrivateMemoryPoolTester
+//--------------------------------------------------------------------
+#if 0
+LLPrivateMemoryPoolTester* LLPrivateMemoryPoolTester::sInstance = NULL ;
+LLPrivateMemoryPool* LLPrivateMemoryPoolTester::sPool = NULL ;
+LLPrivateMemoryPoolTester::LLPrivateMemoryPoolTester()
+{
+}
+
+LLPrivateMemoryPoolTester::~LLPrivateMemoryPoolTester()
+{
+}
+
+//static
+LLPrivateMemoryPoolTester* LLPrivateMemoryPoolTester::getInstance()
+{
+ if(!sInstance)
+ {
+ sInstance = ::new LLPrivateMemoryPoolTester() ;
+ }
+ return sInstance ;
+}
+
+//static
+void LLPrivateMemoryPoolTester::destroy()
+{
+ if(sInstance)
+ {
+ ::delete sInstance ;
+ sInstance = NULL ;
+ }
+
+ if(sPool)
+ {
+ LLPrivateMemoryPoolManager::getInstance()->deletePool(sPool) ;
+ sPool = NULL ;
+ }
+}
+
+void LLPrivateMemoryPoolTester::run(S32 type)
+{
+ if(sPool)
+ {
+ LLPrivateMemoryPoolManager::getInstance()->deletePool(sPool) ;
+ }
+ sPool = LLPrivateMemoryPoolManager::getInstance()->newPool(type) ;
+
+ //run the test
+ correctnessTest() ;
+ performanceTest() ;
+ //fragmentationtest() ;
+
+ //release pool.
+ LLPrivateMemoryPoolManager::getInstance()->deletePool(sPool) ;
+ sPool = NULL ;
+}
+
+void LLPrivateMemoryPoolTester::test(U32 min_size, U32 max_size, U32 stride, U32 times,
+ bool random_deletion, bool output_statistics)
+{
+ U32 levels = (max_size - min_size) / stride + 1 ;
+ char*** p ;
+ U32 i, j ;
+ U32 total_allocated_size = 0 ;
+
+ //allocate space for p ;
+ if(!(p = ::new char**[times]) || !(*p = ::new char*[times * levels]))
+ {
+ llerrs << "memory initialization for p failed" << llendl ;
+ }
+
+ //init
+ for(i = 0 ; i < times; i++)
+ {
+ p[i] = *p + i * levels ;
+ for(j = 0 ; j < levels; j++)
+ {
+ p[i][j] = NULL ;
+ }
+ }
+
+ //allocation
+ U32 size ;
+ for(i = 0 ; i < times ; i++)
+ {
+ for(j = 0 ; j < levels; j++)
+ {
+ size = min_size + j * stride ;
+ p[i][j] = ALLOCATE_MEM(sPool, size) ;
+
+ total_allocated_size+= size ;
+
+ *(U32*)p[i][j] = i ;
+ *((U32*)p[i][j] + 1) = j ;
+ //p[i][j][size - 1] = '\0' ; //access the last element to verify the success of the allocation.
+
+ //randomly release memory
+ if(random_deletion)
+ {
+ S32 k = rand() % levels ;
+
+ if(p[i][k])
+ {
+ llassert_always(*(U32*)p[i][k] == i && *((U32*)p[i][k] + 1) == k) ;
+ FREE_MEM(sPool, p[i][k]) ;
+ total_allocated_size -= min_size + k * stride ;
+ p[i][k] = NULL ;
+ }
+ }
+ }
+ }
+
+ //output pool allocation statistics
+ if(output_statistics)
+ {
+ }
+
+ //release all memory allocations
+ for(i = 0 ; i < times; i++)
+ {
+ for(j = 0 ; j < levels; j++)
+ {
+ if(p[i][j])
+ {
+ llassert_always(*(U32*)p[i][j] == i && *((U32*)p[i][j] + 1) == j) ;
+ FREE_MEM(sPool, p[i][j]) ;
+ total_allocated_size -= min_size + j * stride ;
+ p[i][j] = NULL ;
+ }
+ }
+ }
+
+ ::delete[] *p ;
+ ::delete[] p ;
+}
+
+void LLPrivateMemoryPoolTester::testAndTime(U32 size, U32 times)
+{
+ LLTimer timer ;
+
+ llinfos << " -**********************- " << llendl ;
+ llinfos << "test size: " << size << " test times: " << times << llendl ;
+
+ timer.reset() ;
+ char** p = new char*[times] ;
+
+ //using the customized memory pool
+ //allocation
+ for(U32 i = 0 ; i < times; i++)
+ {
+ p[i] = ALLOCATE_MEM(sPool, size) ;
+ if(!p[i])
+ {
+ llerrs << "allocation failed" << llendl ;
+ }
+ }
+ //de-allocation
+ for(U32 i = 0 ; i < times; i++)
+ {
+ FREE_MEM(sPool, p[i]) ;
+ p[i] = NULL ;
+ }
+ llinfos << "time spent using customized memory pool: " << timer.getElapsedTimeF32() << llendl ;
+
+ timer.reset() ;
+
+ //using the standard allocator/de-allocator:
+ //allocation
+ for(U32 i = 0 ; i < times; i++)
+ {
+ p[i] = ::new char[size] ;
+ if(!p[i])
+ {
+ llerrs << "allocation failed" << llendl ;
+ }
+ }
+ //de-allocation
+ for(U32 i = 0 ; i < times; i++)
+ {
+ ::delete[] p[i] ;
+ p[i] = NULL ;
+ }
+ llinfos << "time spent using standard allocator/de-allocator: " << timer.getElapsedTimeF32() << llendl ;
+
+ delete[] p;
+}
+
+void LLPrivateMemoryPoolTester::correctnessTest()
+{
+ //try many different sized allocation, and all kinds of edge cases, access the allocated memory
+ //to see if allocation is right.
+
+ //edge case
+ char* p = ALLOCATE_MEM(sPool, 0) ;
+ FREE_MEM(sPool, p) ;
+
+ //small sized
+ // [8 bytes, 2KB), each asks for 256 allocations and deallocations
+ test(8, 2040, 8, 256, true, true) ;
+
+ //medium sized
+ //[2KB, 512KB), each asks for 16 allocations and deallocations
+ test(2048, 512 * 1024 - 2048, 2048, 16, true, true) ;
+
+ //large sized
+ //[512KB, 4MB], each asks for 8 allocations and deallocations
+ test(512 * 1024, 4 * 1024 * 1024, 64 * 1024, 6, true, true) ;
+}
+
+void LLPrivateMemoryPoolTester::performanceTest()
+{
+ U32 test_size[3] = {768, 3* 1024, 3* 1024 * 1024};
+
+ //small sized
+ testAndTime(test_size[0], 8) ;
+
+ //medium sized
+ testAndTime(test_size[1], 8) ;
+
+ //large sized
+ testAndTime(test_size[2], 8) ;
+}
+
+void LLPrivateMemoryPoolTester::fragmentationtest()
+{
+ //for internal fragmentation statistics:
+ //every time when asking for a new chunk during correctness test, and performance test,
+ //print out the chunk usage statistices.
+}
#endif
+//--------------------------------------------------------------------
diff --git a/indra/llcommon/llmemory.h b/indra/llcommon/llmemory.h
index 9bf4248bb7..bbbdaa6497 100644
--- a/indra/llcommon/llmemory.h
+++ b/indra/llcommon/llmemory.h
@@ -1,39 +1,112 @@
-/**
+/**
* @file llmemory.h
* @brief Memory allocation/deallocation header-stuff goes here.
*
* $LicenseInfo:firstyear=2002&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2010, Linden Research, Inc.
- *
+ *
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
- *
+ *
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
+ *
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#ifndef LLMEMORY_H
#define LLMEMORY_H
+#include "llmemtype.h"
+#if LL_DEBUG
+inline void* ll_aligned_malloc( size_t size, int align )
+{
+ void* mem = malloc( size + (align - 1) + sizeof(void*) );
+ char* aligned = ((char*)mem) + sizeof(void*);
+ aligned += align - ((uintptr_t)aligned & (align - 1));
+
+ ((void**)aligned)[-1] = mem;
+ return aligned;
+}
+
+inline void ll_aligned_free( void* ptr )
+{
+ free( ((void**)ptr)[-1] );
+}
+
+inline void* ll_aligned_malloc_16(size_t size) // returned hunk MUST be freed with ll_aligned_free_16().
+{
+#if defined(LL_WINDOWS)
+ return _mm_malloc(size, 16);
+#elif defined(LL_DARWIN)
+ return malloc(size); // default osx malloc is 16 byte aligned.
+#else
+ void *rtn;
+ if (LL_LIKELY(0 == posix_memalign(&rtn, 16, size)))
+ return rtn;
+ else // bad alignment requested, or out of memory
+ return NULL;
+#endif
+}
+
+inline void ll_aligned_free_16(void *p)
+{
+#if defined(LL_WINDOWS)
+ _mm_free(p);
+#elif defined(LL_DARWIN)
+ return free(p);
+#else
+ free(p); // posix_memalign() is compatible with heap deallocator
+#endif
+}
+inline void* ll_aligned_malloc_32(size_t size) // returned hunk MUST be freed with ll_aligned_free_32().
+{
+#if defined(LL_WINDOWS)
+ return _mm_malloc(size, 32);
+#elif defined(LL_DARWIN)
+ return ll_aligned_malloc( size, 32 );
+#else
+ void *rtn;
+ if (LL_LIKELY(0 == posix_memalign(&rtn, 32, size)))
+ return rtn;
+ else // bad alignment requested, or out of memory
+ return NULL;
+#endif
+}
-extern S32 gTotalDAlloc;
-extern S32 gTotalDAUse;
-extern S32 gDACount;
+inline void ll_aligned_free_32(void *p)
+{
+#if defined(LL_WINDOWS)
+ _mm_free(p);
+#elif defined(LL_DARWIN)
+ ll_aligned_free( p );
+#else
+ free(p); // posix_memalign() is compatible with heap deallocator
+#endif
+}
+#else // LL_DEBUG
+// ll_aligned_foo are noops now that we use tcmalloc everywhere (tcmalloc aligns automatically at appropriate intervals)
+#define ll_aligned_malloc( size, align ) malloc(size)
+#define ll_aligned_free( ptr ) free(ptr)
+#define ll_aligned_malloc_16 malloc
+#define ll_aligned_free_16 free
+#define ll_aligned_malloc_32 malloc
+#define ll_aligned_free_32 free
+#endif // LL_DEBUG
-extern void* ll_allocate (size_t size);
-extern void ll_release (void *p);
+#ifndef __DEBUG_PRIVATE_MEM__
+#define __DEBUG_PRIVATE_MEM__ 0
+#endif
class LL_COMMON_API LLMemory
{
@@ -44,10 +117,393 @@ public:
// Return the resident set size of the current process, in bytes.
// Return value is zero if not known.
static U64 getCurrentRSS();
+ static U32 getWorkingSetSize();
+ static void* tryToAlloc(void* address, U32 size);
+ static void initMaxHeapSizeGB(F32 max_heap_size_gb, BOOL prevent_heap_failure);
+ static void updateMemoryInfo() ;
+ static void logMemoryInfo(BOOL update = FALSE);
+ static bool isMemoryPoolLow();
+
+ static U32 getAvailableMemKB() ;
+ static U32 getMaxMemKB() ;
+ static U32 getAllocatedMemKB() ;
private:
static char* reserveMem;
+ static U32 sAvailPhysicalMemInKB ;
+ static U32 sMaxPhysicalMemInKB ;
+ static U32 sAllocatedMemInKB;
+ static U32 sAllocatedPageSizeInKB ;
+
+ static U32 sMaxHeapSizeInKB;
+ static BOOL sEnableMemoryFailurePrevention;
+};
+
+//----------------------------------------------------------------------------
+#if MEM_TRACK_MEM
+class LLMutex ;
+class LL_COMMON_API LLMemTracker
+{
+private:
+ LLMemTracker() ;
+ ~LLMemTracker() ;
+
+public:
+ static void release() ;
+ static LLMemTracker* getInstance() ;
+
+ void track(const char* function, const int line) ;
+ void preDraw(BOOL pause) ;
+ void postDraw() ;
+ const char* getNextLine() ;
+
+private:
+ static LLMemTracker* sInstance ;
+
+ char** mStringBuffer ;
+ S32 mCapacity ;
+ U32 mLastAllocatedMem ;
+ S32 mCurIndex ;
+ S32 mCounter;
+ S32 mDrawnIndex;
+ S32 mNumOfDrawn;
+ BOOL mPaused;
+ LLMutex* mMutexp ;
+};
+
+#define MEM_TRACK_RELEASE LLMemTracker::release() ;
+#define MEM_TRACK LLMemTracker::getInstance()->track(__FUNCTION__, __LINE__) ;
+
+#else // MEM_TRACK_MEM
+
+#define MEM_TRACK_RELEASE
+#define MEM_TRACK
+
+#endif // MEM_TRACK_MEM
+
+//----------------------------------------------------------------------------
+
+
+//
+//class LLPrivateMemoryPool defines a private memory pool for an application to use, so the application does not
+//need to access the heap directly fro each memory allocation. Throught this, the allocation speed is faster,
+//and reduces virtaul address space gragmentation problem.
+//Note: this class is thread-safe by passing true to the constructor function. However, you do not need to do this unless
+//you are sure the memory allocation and de-allocation will happen in different threads. To make the pool thread safe
+//increases allocation and deallocation cost.
+//
+class LL_COMMON_API LLPrivateMemoryPool
+{
+ friend class LLPrivateMemoryPoolManager ;
+
+public:
+ class LL_COMMON_API LLMemoryBlock //each block is devided into slots uniformly
+ {
+ public:
+ LLMemoryBlock() ;
+ ~LLMemoryBlock() ;
+
+ void init(char* buffer, U32 buffer_size, U32 slot_size) ;
+ void setBuffer(char* buffer, U32 buffer_size) ;
+
+ char* allocate() ;
+ void freeMem(void* addr) ;
+
+ bool empty() {return !mAllocatedSlots;}
+ bool isFull() {return mAllocatedSlots == mTotalSlots;}
+ bool isFree() {return !mTotalSlots;}
+
+ U32 getSlotSize()const {return mSlotSize;}
+ U32 getTotalSlots()const {return mTotalSlots;}
+ U32 getBufferSize()const {return mBufferSize;}
+ char* getBuffer() const {return mBuffer;}
+
+ //debug use
+ void resetBitMap() ;
+ private:
+ char* mBuffer;
+ U32 mSlotSize ; //when the block is not initialized, it is the buffer size.
+ U32 mBufferSize ;
+ U32 mUsageBits ;
+ U8 mTotalSlots ;
+ U8 mAllocatedSlots ;
+ U8 mDummySize ; //size of extra bytes reserved for mUsageBits.
+
+ public:
+ LLMemoryBlock* mPrev ;
+ LLMemoryBlock* mNext ;
+ LLMemoryBlock* mSelf ;
+
+ struct CompareAddress
+ {
+ bool operator()(const LLMemoryBlock* const& lhs, const LLMemoryBlock* const& rhs)
+ {
+ return (U32)lhs->getBuffer() < (U32)rhs->getBuffer();
+ }
+ };
+ };
+
+ class LL_COMMON_API LLMemoryChunk //is divided into memory blocks.
+ {
+ public:
+ LLMemoryChunk() ;
+ ~LLMemoryChunk() ;
+
+ void init(char* buffer, U32 buffer_size, U32 min_slot_size, U32 max_slot_size, U32 min_block_size, U32 max_block_size) ;
+ void setBuffer(char* buffer, U32 buffer_size) ;
+
+ bool empty() ;
+
+ char* allocate(U32 size) ;
+ void freeMem(void* addr) ;
+
+ char* getBuffer() const {return mBuffer;}
+ U32 getBufferSize() const {return mBufferSize;}
+ U32 getAllocatedSize() const {return mAlloatedSize;}
+
+ bool containsAddress(const char* addr) const;
+
+ static U32 getMaxOverhead(U32 data_buffer_size, U32 min_slot_size,
+ U32 max_slot_size, U32 min_block_size, U32 max_block_size) ;
+
+ void dump() ;
+
+ private:
+ U32 getPageIndex(U32 addr) ;
+ U32 getBlockLevel(U32 size) ;
+ U16 getPageLevel(U32 size) ;
+ LLMemoryBlock* addBlock(U32 blk_idx) ;
+ void popAvailBlockList(U32 blk_idx) ;
+ void addToFreeSpace(LLMemoryBlock* blk) ;
+ void removeFromFreeSpace(LLMemoryBlock* blk) ;
+ void removeBlock(LLMemoryBlock* blk) ;
+ void addToAvailBlockList(LLMemoryBlock* blk) ;
+ U32 calcBlockSize(U32 slot_size);
+ LLMemoryBlock* createNewBlock(LLMemoryBlock* blk, U32 buffer_size, U32 slot_size, U32 blk_idx) ;
+
+ private:
+ LLMemoryBlock** mAvailBlockList ;//256 by mMinSlotSize
+ LLMemoryBlock** mFreeSpaceList;
+ LLMemoryBlock* mBlocks ; //index of blocks by address.
+
+ char* mBuffer ;
+ U32 mBufferSize ;
+ char* mDataBuffer ;
+ char* mMetaBuffer ;
+ U32 mMinBlockSize ;
+ U32 mMinSlotSize ;
+ U32 mMaxSlotSize ;
+ U32 mAlloatedSize ;
+ U16 mBlockLevels;
+ U16 mPartitionLevels;
+
+ public:
+ //form a linked list
+ LLMemoryChunk* mNext ;
+ LLMemoryChunk* mPrev ;
+ } ;
+
+private:
+ LLPrivateMemoryPool(S32 type, U32 max_pool_size) ;
+ ~LLPrivateMemoryPool() ;
+
+ char *allocate(U32 size) ;
+ void freeMem(void* addr) ;
+
+ void dump() ;
+ U32 getTotalAllocatedSize() ;
+ U32 getTotalReservedSize() {return mReservedPoolSize;}
+ S32 getType() const {return mType; }
+ bool isEmpty() const {return !mNumOfChunks; }
+
+private:
+ void lock() ;
+ void unlock() ;
+ S32 getChunkIndex(U32 size) ;
+ LLMemoryChunk* addChunk(S32 chunk_index) ;
+ bool checkSize(U32 asked_size) ;
+ void removeChunk(LLMemoryChunk* chunk) ;
+ U16 findHashKey(const char* addr);
+ void addToHashTable(LLMemoryChunk* chunk) ;
+ void removeFromHashTable(LLMemoryChunk* chunk) ;
+ void rehash() ;
+ bool fillHashTable(U16 start, U16 end, LLMemoryChunk* chunk) ;
+ LLMemoryChunk* findChunk(const char* addr) ;
+
+ void destroyPool() ;
+
+public:
+ enum
+ {
+ SMALL_ALLOCATION = 0, //from 8 bytes to 2KB(exclusive), page size 2KB, max chunk size is 4MB.
+ MEDIUM_ALLOCATION, //from 2KB to 512KB(exclusive), page size 32KB, max chunk size 4MB
+ LARGE_ALLOCATION, //from 512KB to 4MB(inclusive), page size 64KB, max chunk size 16MB
+ SUPER_ALLOCATION //allocation larger than 4MB.
+ };
+
+ enum
+ {
+ STATIC = 0 , //static pool(each alllocation stays for a long time) without threading support
+ VOLATILE, //Volatile pool(each allocation stays for a very short time) without threading support
+ STATIC_THREADED, //static pool with threading support
+ VOLATILE_THREADED, //volatile pool with threading support
+ MAX_TYPES
+ }; //pool types
+
+private:
+ LLMutex* mMutexp ;
+ U32 mMaxPoolSize;
+ U32 mReservedPoolSize ;
+
+ LLMemoryChunk* mChunkList[SUPER_ALLOCATION] ; //all memory chunks reserved by this pool, sorted by address
+ U16 mNumOfChunks ;
+ U16 mHashFactor ;
+
+ S32 mType ;
+
+ class LLChunkHashElement
+ {
+ public:
+ LLChunkHashElement() {mFirst = NULL ; mSecond = NULL ;}
+
+ bool add(LLMemoryChunk* chunk) ;
+ void remove(LLMemoryChunk* chunk) ;
+ LLMemoryChunk* findChunk(const char* addr) ;
+
+ bool empty() {return !mFirst && !mSecond; }
+ bool full() {return mFirst && mSecond; }
+ bool hasElement(LLMemoryChunk* chunk) {return mFirst == chunk || mSecond == chunk;}
+
+ private:
+ LLMemoryChunk* mFirst ;
+ LLMemoryChunk* mSecond ;
+ };
+ std::vector<LLChunkHashElement> mChunkHashList ;
+};
+
+class LL_COMMON_API LLPrivateMemoryPoolManager
+{
+private:
+ LLPrivateMemoryPoolManager(BOOL enabled, U32 max_pool_size) ;
+ ~LLPrivateMemoryPoolManager() ;
+
+public:
+ static LLPrivateMemoryPoolManager* getInstance() ;
+ static void initClass(BOOL enabled, U32 pool_size) ;
+ static void destroyClass() ;
+
+ LLPrivateMemoryPool* newPool(S32 type) ;
+ void deletePool(LLPrivateMemoryPool* pool) ;
+
+private:
+ std::vector<LLPrivateMemoryPool*> mPoolList ;
+ U32 mMaxPrivatePoolSize;
+
+ static LLPrivateMemoryPoolManager* sInstance ;
+ static BOOL sPrivatePoolEnabled;
+ static std::vector<LLPrivateMemoryPool*> sDanglingPoolList ;
+public:
+ //debug and statistics info.
+ void updateStatistics() ;
+
+ U32 mTotalReservedSize ;
+ U32 mTotalAllocatedSize ;
+
+public:
+#if __DEBUG_PRIVATE_MEM__
+ static char* allocate(LLPrivateMemoryPool* poolp, U32 size, const char* function, const int line) ;
+
+ typedef std::map<char*, std::string> mem_allocation_info_t ;
+ static mem_allocation_info_t sMemAllocationTracker;
+#else
+ static char* allocate(LLPrivateMemoryPool* poolp, U32 size) ;
+#endif
+ static void freeMem(LLPrivateMemoryPool* poolp, void* addr) ;
+};
+
+//-------------------------------------------------------------------------------------
+#if __DEBUG_PRIVATE_MEM__
+#define ALLOCATE_MEM(poolp, size) LLPrivateMemoryPoolManager::allocate((poolp), (size), __FUNCTION__, __LINE__)
+#else
+#define ALLOCATE_MEM(poolp, size) LLPrivateMemoryPoolManager::allocate((poolp), (size))
+#endif
+#define FREE_MEM(poolp, addr) LLPrivateMemoryPoolManager::freeMem((poolp), (addr))
+//-------------------------------------------------------------------------------------
+
+//
+//the below singleton is used to test the private memory pool.
+//
+#if 0
+class LL_COMMON_API LLPrivateMemoryPoolTester
+{
+private:
+ LLPrivateMemoryPoolTester() ;
+ ~LLPrivateMemoryPoolTester() ;
+
+public:
+ static LLPrivateMemoryPoolTester* getInstance() ;
+ static void destroy() ;
+
+ void run(S32 type) ;
+
+private:
+ void correctnessTest() ;
+ void performanceTest() ;
+ void fragmentationtest() ;
+
+ void test(U32 min_size, U32 max_size, U32 stride, U32 times, bool random_deletion, bool output_statistics) ;
+ void testAndTime(U32 size, U32 times) ;
+
+#if 0
+public:
+ void* operator new(size_t size)
+ {
+ return (void*)sPool->allocate(size) ;
+ }
+ void operator delete(void* addr)
+ {
+ sPool->freeMem(addr) ;
+ }
+ void* operator new[](size_t size)
+ {
+ return (void*)sPool->allocate(size) ;
+ }
+ void operator delete[](void* addr)
+ {
+ sPool->freeMem(addr) ;
+ }
+#endif
+
+private:
+ static LLPrivateMemoryPoolTester* sInstance;
+ static LLPrivateMemoryPool* sPool ;
+ static LLPrivateMemoryPool* sThreadedPool ;
};
+#if 0
+//static
+void* LLPrivateMemoryPoolTester::operator new(size_t size)
+{
+ return (void*)sPool->allocate(size) ;
+}
+//static
+void LLPrivateMemoryPoolTester::operator delete(void* addr)
+{
+ sPool->free(addr) ;
+}
+
+//static
+void* LLPrivateMemoryPoolTester::operator new[](size_t size)
+{
+ return (void*)sPool->allocate(size) ;
+}
+
+//static
+void LLPrivateMemoryPoolTester::operator delete[](void* addr)
+{
+ sPool->free(addr) ;
+}
+#endif
+#endif
// LLRefCount moved to llrefcount.h
// LLPointer moved to llpointer.h
diff --git a/indra/llcommon/llmemtype.cpp b/indra/llcommon/llmemtype.cpp
index fe83f87d4b..6290a7158f 100644
--- a/indra/llcommon/llmemtype.cpp
+++ b/indra/llcommon/llmemtype.cpp
@@ -229,3 +229,4 @@ char const * LLMemType::getNameFromID(S32 id)
return DeclareMemType::mNameList[id];
}
+//--------------------------------------------------------------------------------------------------
diff --git a/indra/llcommon/llmetricperformancetester.cpp b/indra/llcommon/llmetricperformancetester.cpp
index 5fa3a5ea07..41d3eb0bf3 100644
--- a/indra/llcommon/llmetricperformancetester.cpp
+++ b/indra/llcommon/llmetricperformancetester.cpp
@@ -63,7 +63,18 @@ BOOL LLMetricPerformanceTesterBasic::addTester(LLMetricPerformanceTesterBasic* t
sTesterMap.insert(std::make_pair(name, tester));
return TRUE;
}
-
+
+/*static*/
+void LLMetricPerformanceTesterBasic::deleteTester(std::string name)
+{
+ name_tester_map_t::iterator tester = sTesterMap.find(name);
+ if (tester != sTesterMap.end())
+ {
+ delete tester->second;
+ sTesterMap.erase(tester);
+ }
+}
+
/*static*/
LLMetricPerformanceTesterBasic* LLMetricPerformanceTesterBasic::getTester(std::string name)
{
@@ -83,7 +94,78 @@ BOOL LLMetricPerformanceTesterBasic::isMetricLogRequested(std::string name)
return (LLFastTimer::sMetricLog && ((LLFastTimer::sLogName == name) || (LLFastTimer::sLogName == DEFAULT_METRIC_NAME)));
}
+/*static*/
+LLSD LLMetricPerformanceTesterBasic::analyzeMetricPerformanceLog(std::istream& is)
+{
+ LLSD ret;
+ LLSD cur;
+
+ while (!is.eof() && LLSDSerialize::fromXML(cur, is))
+ {
+ for (LLSD::map_iterator iter = cur.beginMap(); iter != cur.endMap(); ++iter)
+ {
+ std::string label = iter->first;
+
+ LLMetricPerformanceTesterBasic* tester = LLMetricPerformanceTesterBasic::getTester(iter->second["Name"].asString()) ;
+ if(tester)
+ {
+ ret[label]["Name"] = iter->second["Name"] ;
+
+ S32 num_of_metrics = tester->getNumberOfMetrics() ;
+ for(S32 index = 0 ; index < num_of_metrics ; index++)
+ {
+ ret[label][ tester->getMetricName(index) ] = iter->second[ tester->getMetricName(index) ] ;
+ }
+ }
+ }
+ }
+
+ return ret;
+}
+
+/*static*/
+void LLMetricPerformanceTesterBasic::doAnalysisMetrics(std::string baseline, std::string target, std::string output)
+{
+ if(!LLMetricPerformanceTesterBasic::hasMetricPerformanceTesters())
+ {
+ return ;
+ }
+
+ // Open baseline and current target, exit if one is inexistent
+ std::ifstream base_is(baseline.c_str());
+ std::ifstream target_is(target.c_str());
+ if (!base_is.is_open() || !target_is.is_open())
+ {
+ llwarns << "'-analyzeperformance' error : baseline or current target file inexistent" << llendl;
+ base_is.close();
+ target_is.close();
+ return;
+ }
+ //analyze baseline
+ LLSD base = analyzeMetricPerformanceLog(base_is);
+ base_is.close();
+
+ //analyze current
+ LLSD current = analyzeMetricPerformanceLog(target_is);
+ target_is.close();
+
+ //output comparision
+ std::ofstream os(output.c_str());
+
+ os << "Label, Metric, Base(B), Target(T), Diff(T-B), Percentage(100*T/B)\n";
+ for(LLMetricPerformanceTesterBasic::name_tester_map_t::iterator iter = LLMetricPerformanceTesterBasic::sTesterMap.begin() ;
+ iter != LLMetricPerformanceTesterBasic::sTesterMap.end() ; ++iter)
+ {
+ LLMetricPerformanceTesterBasic* tester = ((LLMetricPerformanceTesterBasic*)iter->second) ;
+ tester->analyzePerformance(&os, &base, &current) ;
+ }
+
+ os.flush();
+ os.close();
+}
+
+
//----------------------------------------------------------------------------------------------
// LLMetricPerformanceTesterBasic : Tester instance methods
//----------------------------------------------------------------------------------------------
diff --git a/indra/llcommon/llmetricperformancetester.h b/indra/llcommon/llmetricperformancetester.h
index 925010ac96..1a18cdf36f 100644
--- a/indra/llcommon/llmetricperformancetester.h
+++ b/indra/llcommon/llmetricperformancetester.h
@@ -27,7 +27,7 @@
#ifndef LL_METRICPERFORMANCETESTER_H
#define LL_METRICPERFORMANCETESTER_H
-const std::string DEFAULT_METRIC_NAME("metric");
+char const* const DEFAULT_METRIC_NAME = "metric";
/**
* @class LLMetricPerformanceTesterBasic
@@ -62,6 +62,8 @@ public:
*/
virtual void analyzePerformance(std::ofstream* os, LLSD* base, LLSD* current) ;
+ static void doAnalysisMetrics(std::string baseline, std::string target, std::string output) ;
+
/**
* @return Returns the number of the test metrics in this tester instance.
*/
@@ -116,6 +118,7 @@ protected:
private:
void preOutputTestResults(LLSD* sd) ;
void postOutputTestResults(LLSD* sd) ;
+ static LLSD analyzeMetricPerformanceLog(std::istream& is) ;
std::string mName ; // Name of this tester instance
S32 mCount ; // Current record count
@@ -135,6 +138,12 @@ public:
static LLMetricPerformanceTesterBasic* getTester(std::string name) ;
/**
+ * @return Delete the named tester from the list
+ * @param[in] name - Name of the tester instance to delete.
+ */
+ static void deleteTester(std::string name);
+
+ /**
* @return Returns TRUE if that metric *or* the default catch all metric has been requested to be logged
* @param[in] name - Name of the tester queried.
*/
diff --git a/indra/llcommon/llpreprocessor.h b/indra/llcommon/llpreprocessor.h
index 17a4287538..7fdb537ab5 100644
--- a/indra/llcommon/llpreprocessor.h
+++ b/indra/llcommon/llpreprocessor.h
@@ -132,7 +132,7 @@
#pragma warning( 3 : 4265 ) // "class has virtual functions, but destructor is not virtual"
#pragma warning( 3 : 4266 ) // 'function' : no override available for virtual member function from base 'type'; function is hidden
#pragma warning (disable : 4180) // qualifier applied to function type has no meaning; ignored
-#pragma warning( disable : 4284 ) // silly MS warning deep inside their <map> include file
+//#pragma warning( disable : 4284 ) // silly MS warning deep inside their <map> include file
#pragma warning( disable : 4503 ) // 'decorated name length exceeded, name was truncated'. Does not seem to affect compilation.
#pragma warning( disable : 4800 ) // 'BOOL' : forcing value to bool 'true' or 'false' (performance warning)
#pragma warning( disable : 4996 ) // warning: deprecated
@@ -151,6 +151,8 @@
#pragma warning (disable : 4251) // member needs to have dll-interface to be used by clients of class
#pragma warning (disable : 4275) // non dll-interface class used as base for dll-interface class
+#pragma warning (disable : 4018) // '<' : signed/unsigned mismatch
+
#endif // LL_MSVC
#if LL_WINDOWS
diff --git a/indra/llcommon/llprocesslauncher.cpp b/indra/llcommon/llprocesslauncher.cpp
index 81e5f8820d..10950181fd 100644
--- a/indra/llcommon/llprocesslauncher.cpp
+++ b/indra/llcommon/llprocesslauncher.cpp
@@ -103,10 +103,30 @@ int LLProcessLauncher::launch(void)
char *args2 = new char[args.size() + 1];
strcpy(args2, args.c_str());
- if( ! CreateProcessA( NULL, args2, NULL, NULL, FALSE, 0, NULL, NULL, &sinfo, &pinfo ) )
+ const char * working_directory = 0;
+ if(!mWorkingDir.empty()) working_directory = mWorkingDir.c_str();
+ if( ! CreateProcessA( NULL, args2, NULL, NULL, FALSE, 0, NULL, working_directory, &sinfo, &pinfo ) )
{
- // TODO: do better than returning the OS-specific error code on failure...
result = GetLastError();
+
+ LPTSTR error_str = 0;
+ if(
+ FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
+ NULL,
+ result,
+ 0,
+ (LPTSTR)&error_str,
+ 0,
+ NULL)
+ != 0)
+ {
+ char message[256];
+ wcstombs(message, error_str, 256);
+ message[255] = 0;
+ llwarns << "CreateProcessA failed: " << message << llendl;
+ LocalFree(error_str);
+ }
+
if(result == 0)
{
// Make absolutely certain we return a non-zero value on failure.
@@ -265,14 +285,7 @@ int LLProcessLauncher::launch(void)
delete[] fake_argv;
mProcessID = id;
-
- // At this point, the child process will have been created (since that's how vfork works -- the child borrowed our execution context until it forked)
- // If the process doesn't exist at this point, the exec failed.
- if(!isRunning())
- {
- result = -1;
- }
-
+
return result;
}
diff --git a/indra/llcommon/llqueuedthread.cpp b/indra/llcommon/llqueuedthread.cpp
index efd9c4b68f..1738c16dea 100644
--- a/indra/llcommon/llqueuedthread.cpp
+++ b/indra/llcommon/llqueuedthread.cpp
@@ -32,7 +32,7 @@
//============================================================================
// MAIN THREAD
-LLQueuedThread::LLQueuedThread(const std::string& name, bool threaded) :
+LLQueuedThread::LLQueuedThread(const std::string& name, bool threaded, bool should_pause) :
LLThread(name),
mThreaded(threaded),
mIdleThread(TRUE),
@@ -41,6 +41,11 @@ LLQueuedThread::LLQueuedThread(const std::string& name, bool threaded) :
{
if (mThreaded)
{
+ if(should_pause)
+ {
+ pause() ; //call this before start the thread.
+ }
+
start();
}
}
@@ -104,7 +109,7 @@ void LLQueuedThread::shutdown()
// MAIN THREAD
// virtual
-S32 LLQueuedThread::update(U32 max_time_ms)
+S32 LLQueuedThread::update(F32 max_time_ms)
{
if (!mStarted)
{
@@ -117,7 +122,7 @@ S32 LLQueuedThread::update(U32 max_time_ms)
return updateQueue(max_time_ms);
}
-S32 LLQueuedThread::updateQueue(U32 max_time_ms)
+S32 LLQueuedThread::updateQueue(F32 max_time_ms)
{
F64 max_time = (F64)max_time_ms * .001;
LLTimer timer;
diff --git a/indra/llcommon/llqueuedthread.h b/indra/llcommon/llqueuedthread.h
index c75e0e2bbf..d3704b0fe2 100644
--- a/indra/llcommon/llqueuedthread.h
+++ b/indra/llcommon/llqueuedthread.h
@@ -149,7 +149,7 @@ public:
static handle_t nullHandle() { return handle_t(0); }
public:
- LLQueuedThread(const std::string& name, bool threaded = true);
+ LLQueuedThread(const std::string& name, bool threaded = true, bool should_pause = false);
virtual ~LLQueuedThread();
virtual void shutdown();
@@ -173,13 +173,13 @@ protected:
public:
bool waitForResult(handle_t handle, bool auto_complete = true);
- virtual S32 update(U32 max_time_ms);
- S32 updateQueue(U32 max_time_ms);
+ virtual S32 update(F32 max_time_ms);
+ S32 updateQueue(F32 max_time_ms);
void waitOnPending();
void printQueueStats();
- S32 getPending();
+ virtual S32 getPending();
bool getThreaded() { return mThreaded ? true : false; }
// Request accessors
diff --git a/indra/llcommon/llrefcount.cpp b/indra/llcommon/llrefcount.cpp
index 55d0c85cbd..e1876599fc 100644
--- a/indra/llcommon/llrefcount.cpp
+++ b/indra/llcommon/llrefcount.cpp
@@ -29,9 +29,25 @@
#include "llerror.h"
+#if LL_REF_COUNT_DEBUG
+#include "llthread.h"
+#include "llapr.h"
+#endif
+
LLRefCount::LLRefCount(const LLRefCount& other)
: mRef(0)
{
+#if LL_REF_COUNT_DEBUG
+ if(gAPRPoolp)
+ {
+ mMutexp = new LLMutex(gAPRPoolp) ;
+ }
+ else
+ {
+ mMutexp = NULL ;
+ }
+ mCrashAtUnlock = FALSE ;
+#endif
}
LLRefCount& LLRefCount::operator=(const LLRefCount&)
@@ -43,6 +59,17 @@ LLRefCount& LLRefCount::operator=(const LLRefCount&)
LLRefCount::LLRefCount() :
mRef(0)
{
+#if LL_REF_COUNT_DEBUG
+ if(gAPRPoolp)
+ {
+ mMutexp = new LLMutex(gAPRPoolp) ;
+ }
+ else
+ {
+ mMutexp = NULL ;
+ }
+ mCrashAtUnlock = FALSE ;
+#endif
}
LLRefCount::~LLRefCount()
@@ -51,4 +78,87 @@ LLRefCount::~LLRefCount()
{
llerrs << "deleting non-zero reference" << llendl;
}
+
+#if LL_REF_COUNT_DEBUG
+ if(gAPRPoolp)
+ {
+ delete mMutexp ;
+ }
+#endif
}
+
+#if LL_REF_COUNT_DEBUG
+void LLRefCount::ref() const
+{
+ if(mMutexp)
+ {
+ if(mMutexp->isLocked())
+ {
+ mCrashAtUnlock = TRUE ;
+ llerrs << "the mutex is locked by the thread: " << mLockedThreadID
+ << " Current thread: " << LLThread::currentID() << llendl ;
+ }
+
+ mMutexp->lock() ;
+ mLockedThreadID = LLThread::currentID() ;
+
+ mRef++;
+
+ if(mCrashAtUnlock)
+ {
+ while(1); //crash here.
+ }
+ mMutexp->unlock() ;
+ }
+ else
+ {
+ mRef++;
+ }
+}
+
+S32 LLRefCount::unref() const
+{
+ if(mMutexp)
+ {
+ if(mMutexp->isLocked())
+ {
+ mCrashAtUnlock = TRUE ;
+ llerrs << "the mutex is locked by the thread: " << mLockedThreadID
+ << " Current thread: " << LLThread::currentID() << llendl ;
+ }
+
+ mMutexp->lock() ;
+ mLockedThreadID = LLThread::currentID() ;
+
+ llassert(mRef >= 1);
+ if (0 == --mRef)
+ {
+ if(mCrashAtUnlock)
+ {
+ while(1); //crash here.
+ }
+ mMutexp->unlock() ;
+
+ delete this;
+ return 0;
+ }
+
+ if(mCrashAtUnlock)
+ {
+ while(1); //crash here.
+ }
+ mMutexp->unlock() ;
+ return mRef;
+ }
+ else
+ {
+ llassert(mRef >= 1);
+ if (0 == --mRef)
+ {
+ delete this;
+ return 0;
+ }
+ return mRef;
+ }
+}
+#endif
diff --git a/indra/llcommon/llrefcount.h b/indra/llcommon/llrefcount.h
index 19f008b15c..8eb5d53f3f 100644
--- a/indra/llcommon/llrefcount.h
+++ b/indra/llcommon/llrefcount.h
@@ -28,6 +28,11 @@
#include <boost/noncopyable.hpp>
+#define LL_REF_COUNT_DEBUG 0
+#if LL_REF_COUNT_DEBUG
+class LLMutex ;
+#endif
+
//----------------------------------------------------------------------------
// RefCount objects should generally only be accessed by way of LLPointer<>'s
// see llthread.h for LLThreadSafeRefCount
@@ -43,12 +48,16 @@ protected:
public:
LLRefCount();
- void ref() const
+#if LL_REF_COUNT_DEBUG
+ void ref() const ;
+ S32 unref() const ;
+#else
+ inline void ref() const
{
mRef++;
}
- S32 unref() const
+ inline S32 unref() const
{
llassert(mRef >= 1);
if (0 == --mRef)
@@ -58,6 +67,7 @@ public:
}
return mRef;
}
+#endif
//NOTE: when passing around a const LLRefCount object, this can return different results
// at different types, since mRef is mutable
@@ -68,6 +78,12 @@ public:
private:
mutable S32 mRef;
+
+#if LL_REF_COUNT_DEBUG
+ LLMutex* mMutexp ;
+ mutable U32 mLockedThreadID ;
+ mutable BOOL mCrashAtUnlock ;
+#endif
};
#endif
diff --git a/indra/llcommon/llsd.cpp b/indra/llcommon/llsd.cpp
index 6ca0737445..e295e3c621 100644
--- a/indra/llcommon/llsd.cpp
+++ b/indra/llcommon/llsd.cpp
@@ -24,6 +24,9 @@
* $/LicenseInfo$
*/
+// Must turn on conditional declarations in header file so definitions end up
+// with proper linkage.
+#define LLSD_DEBUG_INFO
#include "linden_common.h"
#include "llsd.h"
@@ -31,6 +34,7 @@
#include "../llmath/llmath.h"
#include "llformat.h"
#include "llsdserialize.h"
+#include "stringize.h"
#ifndef LL_RELEASE_FOR_DOWNLOAD
#define NAME_UNNAMED_NAMESPACE
@@ -50,6 +54,18 @@ namespace
using namespace LLSDUnnamedNamespace;
#endif
+namespace llsd
+{
+
+// statics
+S32 sLLSDAllocationCount = 0;
+S32 sLLSDNetObjects = 0;
+
+} // namespace llsd
+
+#define ALLOC_LLSD_OBJECT { llsd::sLLSDNetObjects++; llsd::sLLSDAllocationCount++; }
+#define FREE_LLSD_OBJECT { llsd::sLLSDNetObjects--; }
+
class LLSD::Impl
/**< This class is the abstract base class of the implementation of LLSD
It provides the reference counting implementation, and the default
@@ -58,13 +74,10 @@ class LLSD::Impl
*/
{
-private:
- U32 mUseCount;
-
protected:
Impl();
- enum StaticAllocationMarker { STATIC };
+ enum StaticAllocationMarker { STATIC_USAGE_COUNT = 0xFFFFFFFF };
Impl(StaticAllocationMarker);
///< This constructor is used for static objects and causes the
// suppresses adjusting the debugging counters when they are
@@ -72,8 +85,10 @@ protected:
virtual ~Impl();
- bool shared() const { return mUseCount > 1; }
+ bool shared() const { return (mUseCount > 1) && (mUseCount != STATIC_USAGE_COUNT); }
+ U32 mUseCount;
+
public:
static void reset(Impl*& var, Impl* impl);
///< safely set var to refer to the new impl (possibly shared)
@@ -128,6 +143,18 @@ public:
virtual LLSD::array_const_iterator beginArray() const { return endArray(); }
virtual LLSD::array_const_iterator endArray() const { static const std::vector<LLSD> empty; return empty.end(); }
+ virtual void dumpStats() const;
+ virtual void calcStats(S32 type_counts[], S32 share_counts[]) const;
+ // Container subclasses contain LLSD objects, rather than directly
+ // containing Impl objects. This helper forwards through LLSD.
+ void calcStats(const LLSD& llsd, S32 type_counts[], S32 share_counts[]) const
+ {
+ safe(llsd.impl).calcStats(type_counts, share_counts);
+ }
+
+ static const Impl& getImpl(const LLSD& llsd) { return safe(llsd.impl); }
+ static Impl& getImpl(LLSD& llsd) { return safe(llsd.impl); }
+
static const LLSD& undef();
static U32 sAllocationCount;
@@ -360,6 +387,9 @@ namespace
LLSD::map_iterator endMap() { return mData.end(); }
virtual LLSD::map_const_iterator beginMap() const { return mData.begin(); }
virtual LLSD::map_const_iterator endMap() const { return mData.end(); }
+
+ virtual void dumpStats() const;
+ virtual void calcStats(S32 type_counts[], S32 share_counts[]) const;
};
ImplMap& ImplMap::makeMap(LLSD::Impl*& var)
@@ -414,6 +444,34 @@ namespace
return i->second;
}
+ void ImplMap::dumpStats() const
+ {
+ std::cout << "Map size: " << mData.size() << std::endl;
+
+ std::cout << "LLSD Net Objects: " << llsd::sLLSDNetObjects << std::endl;
+ std::cout << "LLSD allocations: " << llsd::sLLSDAllocationCount << std::endl;
+
+ std::cout << "LLSD::Impl Net Objects: " << sOutstandingCount << std::endl;
+ std::cout << "LLSD::Impl allocations: " << sAllocationCount << std::endl;
+
+ Impl::dumpStats();
+ }
+
+ void ImplMap::calcStats(S32 type_counts[], S32 share_counts[]) const
+ {
+ LLSD::map_const_iterator iter = beginMap();
+ while (iter != endMap())
+ {
+ //std::cout << " " << (*iter).first << ": " << (*iter).second << std::endl;
+ Impl::calcStats((*iter).second, type_counts, share_counts);
+ iter++;
+ }
+
+ // Add in the values for this map
+ Impl::calcStats(type_counts, share_counts);
+ }
+
+
class ImplArray : public LLSD::Impl
{
private:
@@ -449,6 +507,8 @@ namespace
LLSD::array_iterator endArray() { return mData.end(); }
virtual LLSD::array_const_iterator beginArray() const { return mData.begin(); }
virtual LLSD::array_const_iterator endArray() const { return mData.end(); }
+
+ virtual void calcStats(S32 type_counts[], S32 share_counts[]) const;
};
ImplArray& ImplArray::makeArray(Impl*& var)
@@ -490,12 +550,13 @@ namespace
void ImplArray::insert(LLSD::Integer i, const LLSD& v)
{
- if (i < 0) {
+ if (i < 0)
+ {
return;
}
DataVector::size_type index = i;
- if (index >= mData.size())
+ if (index >= mData.size()) // tbd - sanity check limit for index ?
{
mData.resize(index + 1);
}
@@ -543,6 +604,19 @@ namespace
return mData[index];
}
+
+ void ImplArray::calcStats(S32 type_counts[], S32 share_counts[]) const
+ {
+ LLSD::array_const_iterator iter = beginArray();
+ while (iter != endArray())
+ { // Add values for all items held in the array
+ Impl::calcStats((*iter), type_counts, share_counts);
+ iter++;
+ }
+
+ // Add in the values for this array
+ Impl::calcStats(type_counts, share_counts);
+ }
}
LLSD::Impl::Impl()
@@ -564,8 +638,11 @@ LLSD::Impl::~Impl()
void LLSD::Impl::reset(Impl*& var, Impl* impl)
{
- if (impl) ++impl->mUseCount;
- if (var && --var->mUseCount == 0)
+ if (impl && impl->mUseCount != STATIC_USAGE_COUNT)
+ {
+ ++impl->mUseCount;
+ }
+ if (var && var->mUseCount != STATIC_USAGE_COUNT && --var->mUseCount == 0)
{
delete var;
}
@@ -574,13 +651,13 @@ void LLSD::Impl::reset(Impl*& var, Impl* impl)
LLSD::Impl& LLSD::Impl::safe(Impl* impl)
{
- static Impl theUndefined(STATIC);
+ static Impl theUndefined(STATIC_USAGE_COUNT);
return impl ? *impl : theUndefined;
}
const LLSD::Impl& LLSD::Impl::safe(const Impl* impl)
{
- static Impl theUndefined(STATIC);
+ static Impl theUndefined(STATIC_USAGE_COUNT);
return impl ? *impl : theUndefined;
}
@@ -656,6 +733,43 @@ const LLSD& LLSD::Impl::undef()
return immutableUndefined;
}
+void LLSD::Impl::dumpStats() const
+{
+ S32 type_counts[LLSD::TypeLLSDNumTypes + 1];
+ memset(&type_counts, 0, sizeof(type_counts));
+
+ S32 share_counts[LLSD::TypeLLSDNumTypes + 1];
+ memset(&share_counts, 0, sizeof(share_counts));
+
+ // Add info from all the values this object has
+ calcStats(type_counts, share_counts);
+
+ S32 type_index = LLSD::TypeLLSDTypeBegin;
+ while (type_index != LLSD::TypeLLSDTypeEnd)
+ {
+ std::cout << LLSD::typeString((LLSD::Type)type_index) << " type "
+ << type_counts[type_index] << " objects, "
+ << share_counts[type_index] << " shared"
+ << std::endl;
+ type_index++;
+ }
+}
+
+
+void LLSD::Impl::calcStats(S32 type_counts[], S32 share_counts[]) const
+{
+ S32 tp = S32(type());
+ if (0 <= tp && tp < LLSD::TypeLLSDNumTypes)
+ {
+ type_counts[tp]++;
+ if (shared())
+ {
+ share_counts[tp]++;
+ }
+ }
+}
+
+
U32 LLSD::Impl::sAllocationCount = 0;
U32 LLSD::Impl::sOutstandingCount = 0;
@@ -681,10 +795,10 @@ namespace
}
-LLSD::LLSD() : impl(0) { }
-LLSD::~LLSD() { Impl::reset(impl, 0); }
+LLSD::LLSD() : impl(0) { ALLOC_LLSD_OBJECT; }
+LLSD::~LLSD() { FREE_LLSD_OBJECT; Impl::reset(impl, 0); }
-LLSD::LLSD(const LLSD& other) : impl(0) { assign(other); }
+LLSD::LLSD(const LLSD& other) : impl(0) { ALLOC_LLSD_OBJECT; assign(other); }
void LLSD::assign(const LLSD& other) { Impl::assign(impl, other.impl); }
@@ -692,18 +806,18 @@ void LLSD::clear() { Impl::assignUndefined(impl); }
LLSD::Type LLSD::type() const { return safe(impl).type(); }
-// Scaler Constructors
-LLSD::LLSD(Boolean v) : impl(0) { assign(v); }
-LLSD::LLSD(Integer v) : impl(0) { assign(v); }
-LLSD::LLSD(Real v) : impl(0) { assign(v); }
-LLSD::LLSD(const UUID& v) : impl(0) { assign(v); }
-LLSD::LLSD(const String& v) : impl(0) { assign(v); }
-LLSD::LLSD(const Date& v) : impl(0) { assign(v); }
-LLSD::LLSD(const URI& v) : impl(0) { assign(v); }
-LLSD::LLSD(const Binary& v) : impl(0) { assign(v); }
+// Scalar Constructors
+LLSD::LLSD(Boolean v) : impl(0) { ALLOC_LLSD_OBJECT; assign(v); }
+LLSD::LLSD(Integer v) : impl(0) { ALLOC_LLSD_OBJECT; assign(v); }
+LLSD::LLSD(Real v) : impl(0) { ALLOC_LLSD_OBJECT; assign(v); }
+LLSD::LLSD(const UUID& v) : impl(0) { ALLOC_LLSD_OBJECT; assign(v); }
+LLSD::LLSD(const String& v) : impl(0) { ALLOC_LLSD_OBJECT; assign(v); }
+LLSD::LLSD(const Date& v) : impl(0) { ALLOC_LLSD_OBJECT; assign(v); }
+LLSD::LLSD(const URI& v) : impl(0) { ALLOC_LLSD_OBJECT; assign(v); }
+LLSD::LLSD(const Binary& v) : impl(0) { ALLOC_LLSD_OBJECT; assign(v); }
// Convenience Constructors
-LLSD::LLSD(F32 v) : impl(0) { assign((Real)v); }
+LLSD::LLSD(F32 v) : impl(0) { ALLOC_LLSD_OBJECT; assign((Real)v); }
// Scalar Assignment
void LLSD::assign(Boolean v) { safe(impl).assign(impl, v); }
@@ -726,7 +840,7 @@ LLSD::URI LLSD::asURI() const { return safe(impl).asURI(); }
LLSD::Binary LLSD::asBinary() const { return safe(impl).asBinary(); }
// const char * helpers
-LLSD::LLSD(const char* v) : impl(0) { assign(v); }
+LLSD::LLSD(const char* v) : impl(0) { ALLOC_LLSD_OBJECT; assign(v); }
void LLSD::assign(const char* v)
{
if(v) assign(std::string(v));
@@ -784,9 +898,6 @@ LLSD& LLSD::operator[](Integer i)
const LLSD& LLSD::operator[](Integer i) const
{ return safe(impl).ref(i); }
-U32 LLSD::allocationCount() { return Impl::sAllocationCount; }
-U32 LLSD::outstandingCount() { return Impl::sOutstandingCount; }
-
static const char *llsd_dump(const LLSD &llsd, bool useXMLFormat)
{
// sStorage is used to hold the string representation of the llsd last
@@ -801,15 +912,9 @@ static const char *llsd_dump(const LLSD &llsd, bool useXMLFormat)
{
std::ostringstream out;
if (useXMLFormat)
- {
- LLSDXMLStreamer xml_streamer(llsd);
- out << xml_streamer;
- }
+ out << LLSDXMLStreamer(llsd);
else
- {
- LLSDNotationStreamer notation_streamer(llsd);
- out << notation_streamer;
- }
+ out << LLSDNotationStreamer(llsd);
out_string = out.str();
}
int len = out_string.length();
@@ -840,3 +945,38 @@ LLSD::array_iterator LLSD::beginArray() { return makeArray(impl).beginArray();
LLSD::array_iterator LLSD::endArray() { return makeArray(impl).endArray(); }
LLSD::array_const_iterator LLSD::beginArray() const{ return safe(impl).beginArray(); }
LLSD::array_const_iterator LLSD::endArray() const { return safe(impl).endArray(); }
+
+namespace llsd
+{
+
+U32 allocationCount() { return LLSD::Impl::sAllocationCount; }
+U32 outstandingCount() { return LLSD::Impl::sOutstandingCount; }
+
+// Diagnostic dump of contents in an LLSD object
+void dumpStats(const LLSD& llsd) { LLSD::Impl::getImpl(llsd).dumpStats(); }
+
+} // namespace llsd
+
+// static
+std::string LLSD::typeString(Type type)
+{
+ static const char * sTypeNameArray[] = {
+ "Undefined",
+ "Boolean",
+ "Integer",
+ "Real",
+ "String",
+ "UUID",
+ "Date",
+ "URI",
+ "Binary",
+ "Map",
+ "Array"
+ };
+
+ if (0 <= type && type < LL_ARRAY_SIZE(sTypeNameArray))
+ {
+ return sTypeNameArray[type];
+ }
+ return STRINGIZE("** invalid type value " << type);
+}
diff --git a/indra/llcommon/llsd.h b/indra/llcommon/llsd.h
index 90d0f97873..5eb69059ac 100644
--- a/indra/llcommon/llsd.h
+++ b/indra/llcommon/llsd.h
@@ -40,10 +40,10 @@
/**
LLSD provides a flexible data system similar to the data facilities of
dynamic languages like Perl and Python. It is created to support exchange
- of structured data between loosly coupled systems. (Here, "loosly coupled"
+ of structured data between loosely coupled systems. (Here, "loosely coupled"
means not compiled together into the same module.)
- Data in such exchanges must be highly tollerant of changes on either side
+ Data in such exchanges must be highly tolerant of changes on either side
such as:
- recompilation
- implementation in a different langauge
@@ -51,19 +51,19 @@
- execution of older versions (with fewer parameters)
To this aim, the C++ API of LLSD strives to be very easy to use, and to
- default to "the right thing" whereever possible. It is extremely tollerant
+ default to "the right thing" wherever possible. It is extremely tolerant
of errors and unexpected situations.
- The fundimental class is LLSD. LLSD is a value holding object. It holds
+ The fundamental class is LLSD. LLSD is a value holding object. It holds
one value that is either undefined, one of the scalar types, or a map or an
array. LLSD objects have value semantics (copying them copies the value,
- though it can be considered efficient, due to shareing.), and mutable.
+ though it can be considered efficient, due to sharing), and mutable.
Undefined is the singular value given to LLSD objects that are not
initialized with any data. It is also used as the return value for
- operations that return an LLSD,
+ operations that return an LLSD.
- The sclar data types are:
+ The scalar data types are:
- Boolean - true or false
- Integer - a 32 bit signed integer
- Real - a 64 IEEE 754 floating point value
@@ -80,9 +80,73 @@
An array is a sequence of zero or more LLSD values.
+ Thread Safety
+
+ In general, these LLSD classes offer *less* safety than STL container
+ classes. Implementations prior to this one were unsafe even when
+ completely unrelated LLSD trees were in two threads due to reference
+ sharing of special 'undefined' values that participated in the reference
+ counting mechanism.
+
+ The dereference-before-refcount and aggressive tree sharing also make
+ it impractical to share an LLSD across threads. A strategy of passing
+ ownership or a copy to another thread is still difficult due to a lack
+ of a cloning interface but it can be done with some care.
+
+ One way of transferring ownership is as follows:
+
+ void method(const LLSD input) {
+ ...
+ LLSD * xfer_tree = new LLSD();
+ {
+ // Top-level values
+ (* xfer_tree)['label'] = "Some text";
+ (* xfer_tree)['mode'] = APP_MODE_CONSTANT;
+
+ // There will be a second-level
+ LLSD subtree(LLSD::emptyMap());
+ (* xfer_tree)['subtree'] = subtree;
+
+ // Do *not* copy from LLSD objects via LLSD
+ // intermediaries. Only use plain-old-data
+ // types as intermediaries to prevent reference
+ // sharing.
+ subtree['value1'] = input['value1'].asInteger();
+ subtree['value2'] = input['value2'].asString();
+
+ // Close scope and drop 'subtree's reference.
+ // Only xfer_tree has a reference to the second
+ // level data.
+ }
+ ...
+ // Transfer the LLSD pointer to another thread. Ownership
+ // transfers, this thread no longer has a reference to any
+ // part of the xfer_tree and there's nothing to free or
+ // release here. Receiving thread does need to delete the
+ // pointer when it is done with the LLSD. Transfer
+ // mechanism must perform correct data ordering operations
+ // as dictated by architecture.
+ other_thread.sendMessageAndPointer("Take This", xfer_tree);
+ xfer_tree = NULL;
+
+
+ Avoid this pattern which provides half of a race condition:
+
+ void method(const LLSD input) {
+ ...
+ LLSD xfer_tree(LLSD::emptyMap());
+ xfer_tree['label'] = "Some text";
+ xfer_tree['mode'] = APP_MODE_CONSTANT;
+ ...
+ other_thread.sendMessageAndPointer("Take This", xfer_tree);
+
+
@nosubgrouping
*/
+// Normally undefined, used for diagnostics
+//#define LLSD_DEBUG_INFO 1
+
class LL_COMMON_API LLSD
{
public:
@@ -202,7 +266,7 @@ public:
//@}
/** @name Character Pointer Helpers
- These are helper routines to make working with char* the same as easy as
+ These are helper routines to make working with char* as easy as
working with strings.
*/
//@{
@@ -266,7 +330,7 @@ public:
/** @name Type Testing */
//@{
enum Type {
- TypeUndefined,
+ TypeUndefined = 0,
TypeBoolean,
TypeInteger,
TypeReal,
@@ -276,7 +340,10 @@ public:
TypeURI,
TypeBinary,
TypeMap,
- TypeArray
+ TypeArray,
+ TypeLLSDTypeEnd,
+ TypeLLSDTypeBegin = TypeUndefined,
+ TypeLLSDNumTypes = (TypeLLSDTypeEnd - TypeLLSDTypeBegin)
};
Type type() const;
@@ -302,7 +369,7 @@ public:
If you get a linker error about these being missing, you have made
mistake in your code. DO NOT IMPLEMENT THESE FUNCTIONS as a fix.
- All of thse problems stem from trying to support char* in LLSD or in
+ All of these problems stem from trying to support char* in LLSD or in
std::string. There are too many automatic casts that will lead to
using an arbitrary pointer or scalar type to std::string.
*/
@@ -311,7 +378,7 @@ public:
void assign(const void*); ///< assign from arbitrary pointers
LLSD& operator=(const void*); ///< assign from arbitrary pointers
- bool has(Integer) const; ///< has only works for Maps
+ bool has(Integer) const; ///< has() only works for Maps
//@}
/** @name Implementation */
@@ -320,13 +387,7 @@ public:
class Impl;
private:
Impl* impl;
- //@}
-
- /** @name Unit Testing Interface */
- //@{
-public:
- static U32 allocationCount(); ///< how many Impls have been made
- static U32 outstandingCount(); ///< how many Impls are still alive
+ friend class LLSD::Impl;
//@}
private:
@@ -338,6 +399,10 @@ private:
/// Returns Notation version of llsd -- only to be called from debugger
static const char *dump(const LLSD &llsd);
//@}
+
+public:
+
+ static std::string typeString(Type type); // Return human-readable type as a string
};
struct llsd_select_bool : public std::unary_function<LLSD, LLSD::Boolean>
@@ -385,9 +450,32 @@ struct llsd_select_string : public std::unary_function<LLSD, LLSD::String>
LL_COMMON_API std::ostream& operator<<(std::ostream& s, const LLSD& llsd);
+namespace llsd
+{
+
+#ifdef LLSD_DEBUG_INFO
+/** @name Unit Testing Interface */
+//@{
+ LL_COMMON_API void dumpStats(const LLSD&); ///< Output information on object and usage
+
+ /// @warn THE FOLLOWING COUNTS WILL NOT BE ACCURATE IN A MULTI-THREADED
+ /// ENVIRONMENT.
+ ///
+ /// These counts track LLSD::Impl (hidden) objects.
+ LL_COMMON_API U32 allocationCount(); ///< how many Impls have been made
+ LL_COMMON_API U32 outstandingCount(); ///< how many Impls are still alive
+
+ /// These counts track LLSD (public) objects.
+ LL_COMMON_API extern S32 sLLSDAllocationCount; ///< Number of LLSD objects ever created
+ LL_COMMON_API extern S32 sLLSDNetObjects; ///< Number of LLSD objects that exist
+#endif
+//@}
+
+} // namespace llsd
+
/** QUESTIONS & TO DOS
- - Would Binary be more convenient as usigned char* buffer semantics?
- - Should Binary be convertable to/from String, and if so how?
+ - Would Binary be more convenient as unsigned char* buffer semantics?
+ - Should Binary be convertible to/from String, and if so how?
- as UTF8 encoded strings (making not like UUID<->String)
- as Base64 or Base96 encoded (making like UUID<->String)
- Conversions to std::string and LLUUID do not result in easy assignment
diff --git a/indra/llcommon/llsdserialize.cpp b/indra/llcommon/llsdserialize.cpp
index 10f460e8a6..b419101b7e 100644
--- a/indra/llcommon/llsdserialize.cpp
+++ b/indra/llcommon/llsdserialize.cpp
@@ -34,6 +34,12 @@
#include <iostream>
#include "apr_base64.h"
+#ifdef LL_STANDALONE
+# include <zlib.h>
+#else
+# include "zlib/zlib.h" // for davep's dirty little zip functions
+#endif
+
#if !LL_WINDOWS
#include <netinet/in.h> // htonl & ntohl
#endif
@@ -104,7 +110,7 @@ bool LLSDSerialize::deserialize(LLSD& sd, std::istream& str, S32 max_bytes)
if (!strncasecmp(LEGACY_NON_HEADER, hdr_buf, strlen(LEGACY_NON_HEADER))) /* Flawfinder: ignore */
{
legacy_no_header = true;
- inbuf = str.gcount();
+ inbuf = (int)str.gcount();
}
else
{
@@ -337,7 +343,7 @@ std::istream& LLSDParser::get(
char delim) const
{
istr.get(s, n, delim);
- if(mCheckLimits) mMaxBytesLeft -= istr.gcount();
+ if(mCheckLimits) mMaxBytesLeft -= (int)istr.gcount();
return istr;
}
@@ -347,7 +353,7 @@ std::istream& LLSDParser::get(
char delim) const
{
istr.get(sb, delim);
- if(mCheckLimits) mMaxBytesLeft -= istr.gcount();
+ if(mCheckLimits) mMaxBytesLeft -= (int)istr.gcount();
return istr;
}
@@ -371,7 +377,7 @@ std::istream& LLSDParser::read(
std::streamsize n) const
{
istr.read(s, n);
- if(mCheckLimits) mMaxBytesLeft -= istr.gcount();
+ if(mCheckLimits) mMaxBytesLeft -= (int)istr.gcount();
return istr;
}
@@ -783,7 +789,7 @@ bool LLSDNotationParser::parseBinary(std::istream& istr, LLSD& data) const
if(len)
{
value.resize(len);
- account(fullread(istr, (char *)&value[0], len));
+ account((int)fullread(istr, (char *)&value[0], len));
}
c = get(istr); // strip off the trailing double-quote
data = value;
@@ -1063,7 +1069,7 @@ S32 LLSDBinaryParser::doParse(std::istream& istr, LLSD& data) const
if(size > 0)
{
value.resize(size);
- account(fullread(istr, (char*)&value[0], size));
+ account((int)fullread(istr, (char*)&value[0], size));
}
data = value;
}
@@ -1194,7 +1200,7 @@ bool LLSDBinaryParser::parseString(
if(size)
{
buf.resize(size);
- account(fullread(istr, &buf[0], size));
+ account((int)fullread(istr, &buf[0], size));
value.assign(buf.begin(), buf.end());
}
return true;
@@ -1636,7 +1642,7 @@ int deserialize_string_raw(
const S32 BUF_LEN = 20;
char buf[BUF_LEN]; /* Flawfinder: ignore */
istr.get(buf, BUF_LEN - 1, ')');
- count += istr.gcount();
+ count += (int)istr.gcount();
int c = istr.get();
c = istr.get();
count += 2;
@@ -1651,7 +1657,7 @@ int deserialize_string_raw(
if(len)
{
buf.resize(len);
- count += fullread(istr, (char *)&buf[0], len);
+ count += (int)fullread(istr, (char *)&buf[0], len);
value.assign(buf.begin(), buf.end());
}
c = istr.get();
@@ -1983,3 +1989,182 @@ std::ostream& operator<<(std::ostream& s, const LLSD& llsd)
return s;
}
+
+//dirty little zippers -- yell at davep if these are horrid
+
+//return a string containing gzipped bytes of binary serialized LLSD
+// VERY inefficient -- creates several copies of LLSD block in memory
+std::string zip_llsd(LLSD& data)
+{
+ std::stringstream llsd_strm;
+
+ LLSDSerialize::toBinary(data, llsd_strm);
+
+ const U32 CHUNK = 65536;
+
+ z_stream strm;
+ strm.zalloc = Z_NULL;
+ strm.zfree = Z_NULL;
+ strm.opaque = Z_NULL;
+
+ S32 ret = deflateInit(&strm, Z_BEST_COMPRESSION);
+ if (ret != Z_OK)
+ {
+ llwarns << "Failed to compress LLSD block." << llendl;
+ return std::string();
+ }
+
+ std::string source = llsd_strm.str();
+
+ U8 out[CHUNK];
+
+ strm.avail_in = source.size();
+ strm.next_in = (U8*) source.data();
+ U8* output = NULL;
+
+ U32 cur_size = 0;
+
+ U32 have = 0;
+
+ do
+ {
+ strm.avail_out = CHUNK;
+ strm.next_out = out;
+
+ ret = deflate(&strm, Z_FINISH);
+ if (ret == Z_OK || ret == Z_STREAM_END)
+ { //copy result into output
+ if (strm.avail_out >= CHUNK)
+ {
+ free(output);
+ llwarns << "Failed to compress LLSD block." << llendl;
+ return std::string();
+ }
+
+ have = CHUNK-strm.avail_out;
+ output = (U8*) realloc(output, cur_size+have);
+ memcpy(output+cur_size, out, have);
+ cur_size += have;
+ }
+ else
+ {
+ free(output);
+ llwarns << "Failed to compress LLSD block." << llendl;
+ return std::string();
+ }
+ }
+ while (ret == Z_OK);
+
+ std::string::size_type size = cur_size;
+
+ std::string result((char*) output, size);
+ deflateEnd(&strm);
+ free(output);
+
+#if 0 //verify results work with unzip_llsd
+ std::istringstream test(result);
+ LLSD test_sd;
+ if (!unzip_llsd(test_sd, test, result.size()))
+ {
+ llerrs << "Invalid compression result!" << llendl;
+ }
+#endif
+
+ return result;
+}
+
+//decompress a block of LLSD from provided istream
+// not very efficient -- creats a copy of decompressed LLSD block in memory
+// and deserializes from that copy using LLSDSerialize
+bool unzip_llsd(LLSD& data, std::istream& is, S32 size)
+{
+ U8* result = NULL;
+ U32 cur_size = 0;
+ z_stream strm;
+
+ const U32 CHUNK = 65536;
+
+ U8 *in = new U8[size];
+ is.read((char*) in, size);
+
+ U8 out[CHUNK];
+
+ strm.zalloc = Z_NULL;
+ strm.zfree = Z_NULL;
+ strm.opaque = Z_NULL;
+ strm.avail_in = size;
+ strm.next_in = in;
+
+ S32 ret = inflateInit(&strm);
+
+ do
+ {
+ strm.avail_out = CHUNK;
+ strm.next_out = out;
+ ret = inflate(&strm, Z_NO_FLUSH);
+ if (ret == Z_STREAM_ERROR)
+ {
+ inflateEnd(&strm);
+ free(result);
+ delete [] in;
+ return false;
+ }
+
+ switch (ret)
+ {
+ case Z_NEED_DICT:
+ ret = Z_DATA_ERROR;
+ case Z_DATA_ERROR:
+ case Z_MEM_ERROR:
+ inflateEnd(&strm);
+ free(result);
+ delete [] in;
+ return false;
+ break;
+ }
+
+ U32 have = CHUNK-strm.avail_out;
+
+ result = (U8*) realloc(result, cur_size + have);
+ memcpy(result+cur_size, out, have);
+ cur_size += have;
+
+ } while (ret == Z_OK);
+
+ inflateEnd(&strm);
+ delete [] in;
+
+ if (ret != Z_STREAM_END)
+ {
+ free(result);
+ return false;
+ }
+
+ //result now points to the decompressed LLSD block
+ {
+ std::string res_str((char*) result, cur_size);
+
+ std::string deprecated_header("<? LLSD/Binary ?>");
+
+ if (res_str.substr(0, deprecated_header.size()) == deprecated_header)
+ {
+ res_str = res_str.substr(deprecated_header.size()+1, cur_size);
+ }
+ cur_size = res_str.size();
+
+ std::istringstream istr(res_str);
+
+ if (!LLSDSerialize::fromBinary(data, istr, cur_size))
+ {
+ llwarns << "Failed to unzip LLSD block" << llendl;
+ free(result);
+ return false;
+ }
+ }
+
+ free(result);
+ return true;
+}
+
+
+
diff --git a/indra/llcommon/llsdserialize.h b/indra/llcommon/llsdserialize.h
index 1f096b5254..99a3ea3cd4 100644
--- a/indra/llcommon/llsdserialize.h
+++ b/indra/llcommon/llsdserialize.h
@@ -790,4 +790,8 @@ public:
}
};
+//dirty little zip functions -- yell at davep
+LL_COMMON_API std::string zip_llsd(LLSD& data);
+LL_COMMON_API bool unzip_llsd(LLSD& data, std::istream& is, S32 size);
+
#endif // LL_LLSDSERIALIZE_H
diff --git a/indra/llcommon/llsdserialize_xml.cpp b/indra/llcommon/llsdserialize_xml.cpp
index c5a7c6fc15..34b3dbb99a 100644
--- a/indra/llcommon/llsdserialize_xml.cpp
+++ b/indra/llcommon/llsdserialize_xml.cpp
@@ -373,10 +373,13 @@ S32 LLSDXMLParser::Impl::parse(std::istream& input, LLSD& data)
{
break;
}
- count = get_till_eol(input, (char *)buffer, BUFFER_SIZE);
- if (!count)
{
- break;
+
+ count = get_till_eol(input, (char *)buffer, BUFFER_SIZE);
+ if (!count)
+ {
+ break;
+ }
}
status = XML_ParseBuffer(mParser, count, false);
@@ -461,7 +464,7 @@ S32 LLSDXMLParser::Impl::parseLines(std::istream& input, LLSD& data)
}
}
- status = XML_ParseBuffer(mParser, num_read, false);
+ status = XML_ParseBuffer(mParser, (int)num_read, false);
if (status == XML_STATUS_ERROR)
{
break;
@@ -716,6 +719,7 @@ void LLSDXMLParser::Impl::endElementHandler(const XML_Char* name)
case ELEMENT_INTEGER:
{
S32 i;
+ // sscanf okay here with different locales - ints don't change for different locale settings like floats do.
if ( sscanf(mCurrentContent.c_str(), "%d", &i ) == 1 )
{ // See if sscanf works - it's faster
value = i;
@@ -729,15 +733,19 @@ void LLSDXMLParser::Impl::endElementHandler(const XML_Char* name)
case ELEMENT_REAL:
{
- F64 r;
- if ( sscanf(mCurrentContent.c_str(), "%lf", &r ) == 1 )
- { // See if sscanf works - it's faster
- value = r;
- }
- else
- {
- value = LLSD(mCurrentContent).asReal();
- }
+ value = LLSD(mCurrentContent).asReal();
+ // removed since this breaks when locale has decimal separator that isn't '.'
+ // investigated changing local to something compatible each time but deemed higher
+ // risk that just using LLSD.asReal() each time.
+ //F64 r;
+ //if ( sscanf(mCurrentContent.c_str(), "%lf", &r ) == 1 )
+ //{ // See if sscanf works - it's faster
+ // value = r;
+ //}
+ //else
+ //{
+ // value = LLSD(mCurrentContent).asReal();
+ //}
}
break;
diff --git a/indra/llcommon/llsdutil.cpp b/indra/llcommon/llsdutil.cpp
index f8f9ece058..803417d368 100644
--- a/indra/llcommon/llsdutil.cpp
+++ b/indra/llcommon/llsdutil.cpp
@@ -41,6 +41,7 @@
#include "llsdserialize.h"
#include "stringize.h"
+#include "is_approx_equal_fraction.h"
#include <map>
#include <set>
@@ -571,7 +572,7 @@ std::string llsd_matches(const LLSD& prototype, const LLSD& data, const std::str
return match_types(prototype.type(), TypeVector(), data.type(), pfx);
}
-bool llsd_equals(const LLSD& lhs, const LLSD& rhs)
+bool llsd_equals(const LLSD& lhs, const LLSD& rhs, unsigned bits)
{
// We're comparing strict equality of LLSD representation rather than
// performing any conversions. So if the types aren't equal, the LLSD
@@ -588,6 +589,20 @@ bool llsd_equals(const LLSD& lhs, const LLSD& rhs)
// Both are TypeUndefined. There's nothing more to know.
return true;
+ case LLSD::TypeReal:
+ // This is where the 'bits' argument comes in handy. If passed
+ // explicitly, it means to use is_approx_equal_fraction() to compare.
+ if (bits >= 0)
+ {
+ return is_approx_equal_fraction(lhs.asReal(), rhs.asReal(), bits);
+ }
+ // Otherwise we compare bit representations, and the usual caveats
+ // about comparing floating-point numbers apply. Omitting 'bits' when
+ // comparing Real values is only useful when we expect identical bit
+ // representation for a given Real value, e.g. for integer-valued
+ // Reals.
+ return (lhs.asReal() == rhs.asReal());
+
#define COMPARE_SCALAR(type) \
case LLSD::Type##type: \
/* LLSD::URI has operator!=() but not operator==() */ \
@@ -596,10 +611,6 @@ bool llsd_equals(const LLSD& lhs, const LLSD& rhs)
COMPARE_SCALAR(Boolean);
COMPARE_SCALAR(Integer);
- // The usual caveats about comparing floating-point numbers apply. This is
- // only useful when we expect identical bit representation for a given
- // Real value, e.g. for integer-valued Reals.
- COMPARE_SCALAR(Real);
COMPARE_SCALAR(String);
COMPARE_SCALAR(UUID);
COMPARE_SCALAR(Date);
@@ -617,7 +628,7 @@ bool llsd_equals(const LLSD& lhs, const LLSD& rhs)
for ( ; lai != laend && rai != raend; ++lai, ++rai)
{
// If any one array element is unequal, the arrays are unequal.
- if (! llsd_equals(*lai, *rai))
+ if (! llsd_equals(*lai, *rai, bits))
return false;
}
// Here we've reached the end of one or the other array. They're equal
@@ -644,7 +655,7 @@ bool llsd_equals(const LLSD& lhs, const LLSD& rhs)
if (rhskeys.erase(lmi->first) != 1)
return false;
// Both maps have the current key. Compare values.
- if (! llsd_equals(lmi->second, rhs[lmi->first]))
+ if (! llsd_equals(lmi->second, rhs[lmi->first], bits))
return false;
}
// We've now established that all the lhs keys have equal values in
@@ -657,7 +668,7 @@ bool llsd_equals(const LLSD& lhs, const LLSD& rhs)
// We expect that every possible type() value is specifically handled
// above. Failing to extend this switch to support a new LLSD type is
// an error that must be brought to the coder's attention.
- LL_ERRS("llsd_equals") << "llsd_equals(" << lhs << ", " << rhs << "): "
+ LL_ERRS("llsd_equals") << "llsd_equals(" << lhs << ", " << rhs << ", " << bits << "): "
"unknown type " << lhs.type() << LL_ENDL;
return false; // pacify the compiler
}
diff --git a/indra/llcommon/llsdutil.h b/indra/llcommon/llsdutil.h
index bb8c0690b1..532d3f9341 100644
--- a/indra/llcommon/llsdutil.h
+++ b/indra/llcommon/llsdutil.h
@@ -123,8 +123,10 @@ LL_COMMON_API BOOL compare_llsd_with_template(
*/
LL_COMMON_API std::string llsd_matches(const LLSD& prototype, const LLSD& data, const std::string& pfx="");
-/// Deep equality
-LL_COMMON_API bool llsd_equals(const LLSD& lhs, const LLSD& rhs);
+/// Deep equality. If you want to compare LLSD::Real values for approximate
+/// equality rather than bitwise equality, pass @a bits as for
+/// is_approx_equal_fraction().
+LL_COMMON_API bool llsd_equals(const LLSD& lhs, const LLSD& rhs, unsigned bits=-1);
// Simple function to copy data out of input & output iterators if
// there is no need for casting.
@@ -138,4 +140,283 @@ template<typename Input> LLSD llsd_copy_array(Input iter, Input end)
return dest;
}
+/*****************************************************************************
+* LLSDArray
+*****************************************************************************/
+/**
+ * Construct an LLSD::Array inline, with implicit conversion to LLSD. Usage:
+ *
+ * @code
+ * void somefunc(const LLSD&);
+ * ...
+ * somefunc(LLSDArray("text")(17)(3.14));
+ * @endcode
+ *
+ * For completeness, LLSDArray() with no args constructs an empty array, so
+ * <tt>LLSDArray()("text")(17)(3.14)</tt> produces an array equivalent to the
+ * above. But for most purposes, LLSD() is already equivalent to an empty
+ * array, and if you explicitly want an empty isArray(), there's
+ * LLSD::emptyArray(). However, supporting a no-args LLSDArray() constructor
+ * follows the principle of least astonishment.
+ */
+class LLSDArray
+{
+public:
+ LLSDArray():
+ _data(LLSD::emptyArray())
+ {}
+
+ /**
+ * Need an explicit copy constructor. Consider the following:
+ *
+ * @code
+ * LLSD array_of_arrays(LLSDArray(LLSDArray(17)(34))
+ * (LLSDArray("x")("y")));
+ * @endcode
+ *
+ * The coder intends to construct [[17, 34], ["x", "y"]].
+ *
+ * With the compiler's implicit copy constructor, s/he gets instead
+ * [17, 34, ["x", "y"]].
+ *
+ * The expression LLSDArray(17)(34) constructs an LLSDArray with those two
+ * values. The reader assumes it should be converted to LLSD, as we always
+ * want with LLSDArray, before passing it to the @em outer LLSDArray
+ * constructor! This copy constructor makes that happen.
+ */
+ LLSDArray(const LLSDArray& inner):
+ _data(LLSD::emptyArray())
+ {
+ _data.append(inner);
+ }
+
+ LLSDArray(const LLSD& value):
+ _data(LLSD::emptyArray())
+ {
+ _data.append(value);
+ }
+
+ LLSDArray& operator()(const LLSD& value)
+ {
+ _data.append(value);
+ return *this;
+ }
+
+ operator LLSD() const { return _data; }
+ LLSD get() const { return _data; }
+
+private:
+ LLSD _data;
+};
+
+/*****************************************************************************
+* LLSDMap
+*****************************************************************************/
+/**
+ * Construct an LLSD::Map inline, with implicit conversion to LLSD. Usage:
+ *
+ * @code
+ * void somefunc(const LLSD&);
+ * ...
+ * somefunc(LLSDMap("alpha", "abc")("number", 17)("pi", 3.14));
+ * @endcode
+ *
+ * For completeness, LLSDMap() with no args constructs an empty map, so
+ * <tt>LLSDMap()("alpha", "abc")("number", 17)("pi", 3.14)</tt> produces a map
+ * equivalent to the above. But for most purposes, LLSD() is already
+ * equivalent to an empty map, and if you explicitly want an empty isMap(),
+ * there's LLSD::emptyMap(). However, supporting a no-args LLSDMap()
+ * constructor follows the principle of least astonishment.
+ */
+class LLSDMap
+{
+public:
+ LLSDMap():
+ _data(LLSD::emptyMap())
+ {}
+ LLSDMap(const LLSD::String& key, const LLSD& value):
+ _data(LLSD::emptyMap())
+ {
+ _data[key] = value;
+ }
+
+ LLSDMap& operator()(const LLSD::String& key, const LLSD& value)
+ {
+ _data[key] = value;
+ return *this;
+ }
+
+ operator LLSD() const { return _data; }
+ LLSD get() const { return _data; }
+
+private:
+ LLSD _data;
+};
+
+/*****************************************************************************
+* LLSDParam
+*****************************************************************************/
+/**
+ * LLSDParam is a customization point for passing LLSD values to function
+ * parameters of more or less arbitrary type. LLSD provides a small set of
+ * native conversions; but if a generic algorithm explicitly constructs an
+ * LLSDParam object in the function's argument list, a consumer can provide
+ * LLSDParam specializations to support more different parameter types than
+ * LLSD's native conversions.
+ *
+ * Usage:
+ *
+ * @code
+ * void somefunc(const paramtype&);
+ * ...
+ * somefunc(..., LLSDParam<paramtype>(someLLSD), ...);
+ * @endcode
+ */
+template <typename T>
+class LLSDParam
+{
+public:
+ /**
+ * Default implementation converts to T on construction, saves converted
+ * value for later retrieval
+ */
+ LLSDParam(const LLSD& value):
+ _value(value)
+ {}
+
+ operator T() const { return _value; }
+
+private:
+ T _value;
+};
+
+/**
+ * Turns out that several target types could accept an LLSD param using any of
+ * a few different conversions, e.g. LLUUID's constructor can accept LLUUID or
+ * std::string. Therefore, the compiler can't decide which LLSD conversion
+ * operator to choose, even though to us it seems obvious. But that's okay, we
+ * can specialize LLSDParam for such target types, explicitly specifying the
+ * desired conversion -- that's part of what LLSDParam is all about. Turns out
+ * we have to do that enough to make it worthwhile generalizing. Use a macro
+ * because I need to specify one of the asReal, etc., explicit conversion
+ * methods as well as a type. If I'm overlooking a clever way to implement
+ * that using a template instead, feel free to reimplement.
+ */
+#define LLSDParam_for(T, AS) \
+template <> \
+class LLSDParam<T> \
+{ \
+public: \
+ LLSDParam(const LLSD& value): \
+ _value((T)value.AS()) \
+ {} \
+ \
+ operator T() const { return _value; } \
+ \
+private: \
+ T _value; \
+}
+
+LLSDParam_for(float, asReal);
+LLSDParam_for(LLUUID, asUUID);
+LLSDParam_for(LLDate, asDate);
+LLSDParam_for(LLURI, asURI);
+LLSDParam_for(LLSD::Binary, asBinary);
+
+/**
+ * LLSDParam<const char*> is an example of the kind of conversion you can
+ * support with LLSDParam beyond native LLSD conversions. Normally you can't
+ * pass an LLSD object to a function accepting const char* -- but you can
+ * safely pass an LLSDParam<const char*>(yourLLSD).
+ */
+template <>
+class LLSDParam<const char*>
+{
+private:
+ // The difference here is that we store a std::string rather than a const
+ // char*. It's important that the LLSDParam object own the std::string.
+ std::string _value;
+ // We don't bother storing the incoming LLSD object, but we do have to
+ // distinguish whether _value is an empty string because the LLSD object
+ // contains an empty string or because it's isUndefined().
+ bool _undefined;
+
+public:
+ LLSDParam(const LLSD& value):
+ _value(value),
+ _undefined(value.isUndefined())
+ {}
+
+ // The const char* we retrieve is for storage owned by our _value member.
+ // That's how we guarantee that the const char* is valid for the lifetime
+ // of this LLSDParam object. Constructing your LLSDParam in the argument
+ // list should ensure that the LLSDParam object will persist for the
+ // duration of the function call.
+ operator const char*() const
+ {
+ if (_undefined)
+ {
+ // By default, an isUndefined() LLSD object's asString() method
+ // will produce an empty string. But for a function accepting
+ // const char*, it's often important to be able to pass NULL, and
+ // isUndefined() seems like the best way. If you want to pass an
+ // empty string, you can still pass LLSD(""). Without this special
+ // case, though, no LLSD value could pass NULL.
+ return NULL;
+ }
+ return _value.c_str();
+ }
+};
+
+namespace llsd
+{
+
+/*****************************************************************************
+* BOOST_FOREACH() helpers for LLSD
+*****************************************************************************/
+/// Usage: BOOST_FOREACH(LLSD item, inArray(someLLSDarray)) { ... }
+class inArray
+{
+public:
+ inArray(const LLSD& array):
+ _array(array)
+ {}
+
+ typedef LLSD::array_const_iterator const_iterator;
+ typedef LLSD::array_iterator iterator;
+
+ iterator begin() { return _array.beginArray(); }
+ iterator end() { return _array.endArray(); }
+ const_iterator begin() const { return _array.beginArray(); }
+ const_iterator end() const { return _array.endArray(); }
+
+private:
+ LLSD _array;
+};
+
+/// MapEntry is what you get from dereferencing an LLSD::map_[const_]iterator.
+typedef std::map<LLSD::String, LLSD>::value_type MapEntry;
+
+/// Usage: BOOST_FOREACH([const] MapEntry& e, inMap(someLLSDmap)) { ... }
+class inMap
+{
+public:
+ inMap(const LLSD& map):
+ _map(map)
+ {}
+
+ typedef LLSD::map_const_iterator const_iterator;
+ typedef LLSD::map_iterator iterator;
+
+ iterator begin() { return _map.beginMap(); }
+ iterator end() { return _map.endMap(); }
+ const_iterator begin() const { return _map.beginMap(); }
+ const_iterator end() const { return _map.endMap(); }
+
+private:
+ LLSD _map;
+};
+
+} // namespace llsd
+
#endif // LL_LLSDUTIL_H
diff --git a/indra/llcommon/llsingleton.h b/indra/llcommon/llsingleton.h
index 7aee1bb85f..49d99f2cd0 100644
--- a/indra/llcommon/llsingleton.h
+++ b/indra/llcommon/llsingleton.h
@@ -100,12 +100,6 @@ private:
DELETED
} EInitState;
- static void deleteSingleton()
- {
- delete getData().mSingletonInstance;
- getData().mSingletonInstance = NULL;
- }
-
// stores pointer to singleton instance
// and tracks initialization state of singleton
struct SingletonInstanceData
@@ -120,7 +114,10 @@ private:
~SingletonInstanceData()
{
- deleteSingleton();
+ if (mInitState != DELETED)
+ {
+ deleteSingleton();
+ }
}
};
@@ -132,6 +129,33 @@ public:
data.mInitState = DELETED;
}
+ /**
+ * @brief Immediately delete the singleton.
+ *
+ * A subsequent call to LLProxy::getInstance() will construct a new
+ * instance of the class.
+ *
+ * LLSingletons are normally destroyed after main() has exited and the C++
+ * runtime is cleaning up statically-constructed objects. Some classes
+ * derived from LLSingleton have objects that are part of a runtime system
+ * that is terminated before main() exits. Calling the destructor of those
+ * objects after the termination of their respective systems can cause
+ * crashes and other problems during termination of the project. Using this
+ * method to destroy the singleton early can prevent these crashes.
+ *
+ * An example where this is needed is for a LLSingleton that has an APR
+ * object as a member that makes APR calls on destruction. The APR system is
+ * shut down explicitly before main() exits. This causes a crash on exit.
+ * Using this method before the call to apr_terminate() and NOT calling
+ * getInstance() again will prevent the crash.
+ */
+ static void deleteSingleton()
+ {
+ delete getData().mSingletonInstance;
+ getData().mSingletonInstance = NULL;
+ getData().mInitState = DELETED;
+ }
+
static SingletonInstanceData& getData()
{
// this is static to cache the lookup results
diff --git a/indra/llcommon/llstat.cpp b/indra/llcommon/llstat.cpp
index 8ba97d7730..057257057f 100644
--- a/indra/llcommon/llstat.cpp
+++ b/indra/llcommon/llstat.cpp
@@ -593,7 +593,7 @@ void LLStatTime::stop()
{
if ( LLStatAccum::SCALE_PER_FRAME == scale )
{
- return mTotalTimeInFrame;
+ return (F32)mTotalTimeInFrame;
}
else
{
@@ -737,7 +737,7 @@ void LLPerfBlock::addStatsToLLSDandReset( LLSD & stats,
}
}
else
- { // WTF? Shouldn't have a NULL pointer in the map.
+ { // Shouldn't have a NULL pointer in the map.
llwarns << "Unexpected NULL dynamic stat at '" << stats_full_path << "'" << llendl;
}
}
diff --git a/indra/llcommon/llstring.cpp b/indra/llcommon/llstring.cpp
index f3b48b0156..e7fe656808 100644
--- a/indra/llcommon/llstring.cpp
+++ b/indra/llcommon/llstring.cpp
@@ -936,13 +936,18 @@ LLStringUtil::size_type LLStringUtil::getSubstitution(const std::string& instr,
{
const std::string delims (",");
- // Find the first ]
- size_type pos2 = instr.find(']', start);
+ // Find the first [
+ size_type pos1 = instr.find('[', start);
+ if (pos1 == std::string::npos)
+ return std::string::npos;
+
+ //Find the first ] after the initial [
+ size_type pos2 = instr.find(']', pos1);
if (pos2 == std::string::npos)
return std::string::npos;
- // Find the last [ before ]
- size_type pos1 = instr.find_last_of('[', pos2-1);
+ // Find the last [ before ] in case of nested [[]]
+ pos1 = instr.find_last_of('[', pos2-1);
if (pos1 == std::string::npos || pos1 < start)
return std::string::npos;
diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp
index 10cdc7087b..6073bcd0a6 100644
--- a/indra/llcommon/llsys.cpp
+++ b/indra/llcommon/llsys.cpp
@@ -1,6 +1,6 @@
/**
* @file llsys.cpp
- * @brief Impelementation of the basic system query functions.
+ * @brief Implementation of the basic system query functions.
*
* $LicenseInfo:firstyear=2002&license=viewerlgpl$
* Second Life Viewer Source Code
@@ -24,6 +24,10 @@
* $/LicenseInfo$
*/
+#if LL_WINDOWS
+#pragma warning (disable : 4355) // 'this' used in initializer list: yes, intentionally
+#endif
+
#include "linden_common.h"
#include "llsys.h"
@@ -36,21 +40,45 @@
#endif
#include "llprocessor.h"
+#include "llerrorcontrol.h"
+#include "llevents.h"
+#include "lltimer.h"
+#include "llsdserialize.h"
+#include "llsdutil.h"
+#include <boost/bind.hpp>
+#include <boost/circular_buffer.hpp>
+#include <boost/regex.hpp>
+#include <boost/foreach.hpp>
+#include <boost/lexical_cast.hpp>
+#include <boost/range.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <boost/type_traits/is_integral.hpp>
+#include <boost/type_traits/is_float.hpp>
+
+using namespace llsd;
#if LL_WINDOWS
# define WIN32_LEAN_AND_MEAN
# include <winsock2.h>
# include <windows.h>
+# include <psapi.h> // GetPerformanceInfo() et al.
#elif LL_DARWIN
# include <errno.h>
# include <sys/sysctl.h>
# include <sys/utsname.h>
# include <stdint.h>
+# include <Carbon/Carbon.h>
+# include <stdexcept>
+# include <mach/host_info.h>
+# include <mach/mach_host.h>
+# include <mach/task.h>
+# include <mach/task_info.h>
#elif LL_LINUX
# include <errno.h>
# include <sys/utsname.h>
# include <unistd.h>
# include <sys/sysinfo.h>
+# include <stdexcept>
const char MEMINFO_FILE[] = "/proc/meminfo";
#elif LL_SOLARIS
# include <stdio.h>
@@ -69,6 +97,15 @@ extern int errno;
static const S32 CPUINFO_BUFFER_SIZE = 16383;
LLCPUInfo gSysCPU;
+// Don't log memory info any more often than this. It also serves as our
+// framerate sample size.
+static const F32 MEM_INFO_THROTTLE = 20;
+// Sliding window of samples. We intentionally limit the length of time we
+// remember "the slowest" framerate because framerate is very slow at login.
+// If we only triggered FrameWatcher logging when the session framerate
+// dropped below the login framerate, we'd have very little additional data.
+static const F32 MEM_INFO_WINDOW = 10*60;
+
#if LL_WINDOWS
#ifndef DLLVERSIONINFO
typedef struct _DllVersionInfo
@@ -187,22 +224,30 @@ LLOSInfo::LLOSInfo() :
if(osvi.wProductType == VER_NT_WORKSTATION)
mOSStringSimple = "Microsoft Windows XP x64 Edition ";
else
- mOSStringSimple = "Microsoft Windows Server 2003 ";
+ mOSStringSimple = "Microsoft Windows Server 2003 ";
}
- else if(osvi.dwMajorVersion == 6 && osvi.dwMinorVersion <= 1)
+ else if(osvi.dwMajorVersion == 6 && osvi.dwMinorVersion <= 2)
{
if(osvi.dwMinorVersion == 0)
{
- mOSStringSimple = "Microsoft Windows Vista ";
+ if(osvi.wProductType == VER_NT_WORKSTATION)
+ mOSStringSimple = "Microsoft Windows Vista ";
+ else
+ mOSStringSimple = "Windows Server 2008 ";
}
else if(osvi.dwMinorVersion == 1)
{
- mOSStringSimple = "Microsoft Windows 7 ";
+ if(osvi.wProductType == VER_NT_WORKSTATION)
+ mOSStringSimple = "Microsoft Windows 7 ";
+ else
+ mOSStringSimple = "Windows Server 2008 R2 ";
}
-
- if(osvi.wProductType != VER_NT_WORKSTATION)
+ else if(osvi.dwMinorVersion == 2)
{
- mOSStringSimple += "Server ";
+ if(osvi.wProductType == VER_NT_WORKSTATION)
+ mOSStringSimple = "Microsoft Windows 8 ";
+ else
+ mOSStringSimple = "Windows Server 2012 ";
}
///get native system info if available..
@@ -307,8 +352,7 @@ LLOSInfo::LLOSInfo() :
std::string compatibility_mode;
if(got_shell32_version)
{
- if(osvi.dwMajorVersion != shell32_major
- || osvi.dwMinorVersion != shell32_minor)
+ if(osvi.dwMajorVersion != shell32_major || osvi.dwMinorVersion != shell32_minor)
{
compatibility_mode = llformat(" compatibility mode. real ver: %d.%d (Build %d)",
shell32_major,
@@ -318,7 +362,58 @@ LLOSInfo::LLOSInfo() :
}
mOSString += compatibility_mode;
+#elif LL_DARWIN
+
+ // Initialize mOSStringSimple to something like:
+ // "Mac OS X 10.6.7"
+ {
+ const char * DARWIN_PRODUCT_NAME = "Mac OS X";
+
+ SInt32 major_version, minor_version, bugfix_version;
+ OSErr r1 = Gestalt(gestaltSystemVersionMajor, &major_version);
+ OSErr r2 = Gestalt(gestaltSystemVersionMinor, &minor_version);
+ OSErr r3 = Gestalt(gestaltSystemVersionBugFix, &bugfix_version);
+
+ if((r1 == noErr) && (r2 == noErr) && (r3 == noErr))
+ {
+ mMajorVer = major_version;
+ mMinorVer = minor_version;
+ mBuild = bugfix_version;
+
+ std::stringstream os_version_string;
+ os_version_string << DARWIN_PRODUCT_NAME << " " << mMajorVer << "." << mMinorVer << "." << mBuild;
+
+ // Put it in the OS string we are compiling
+ mOSStringSimple.append(os_version_string.str());
+ }
+ else
+ {
+ mOSStringSimple.append("Unable to collect OS info");
+ }
+ }
+
+ // Initialize mOSString to something like:
+ // "Mac OS X 10.6.7 Darwin Kernel Version 10.7.0: Sat Jan 29 15:17:16 PST 2011; root:xnu-1504.9.37~1/RELEASE_I386 i386"
+ struct utsname un;
+ if(uname(&un) != -1)
+ {
+ mOSString = mOSStringSimple;
+ mOSString.append(" ");
+ mOSString.append(un.sysname);
+ mOSString.append(" ");
+ mOSString.append(un.release);
+ mOSString.append(" ");
+ mOSString.append(un.version);
+ mOSString.append(" ");
+ mOSString.append(un.machine);
+ }
+ else
+ {
+ mOSString = mOSStringSimple;
+ }
+
#else
+
struct utsname un;
if(uname(&un) != -1)
{
@@ -334,15 +429,7 @@ LLOSInfo::LLOSInfo() :
// Simplify 'Simple'
std::string ostype = mOSStringSimple.substr(0, mOSStringSimple.find_first_of(" ", 0));
- if (ostype == "Darwin")
- {
- // Only care about major Darwin versions, truncate at first '.'
- S32 idx1 = mOSStringSimple.find_first_of(".", 0);
- std::string simple = mOSStringSimple.substr(0, idx1);
- if (simple.length() > 0)
- mOSStringSimple = simple;
- }
- else if (ostype == "Linux")
+ if (ostype == "Linux")
{
// Only care about major and minor Linux versions, truncate at second '.'
std::string::size_type idx1 = mOSStringSimple.find_first_of(".", 0);
@@ -521,6 +608,7 @@ LLCPUInfo::LLCPUInfo()
out << " (" << mCPUMHz << " MHz)";
}
mCPUString = out.str();
+ LLStringUtil::trim(mCPUString);
}
bool LLCPUInfo::hasAltivec() const
@@ -562,8 +650,78 @@ void LLCPUInfo::stream(std::ostream& s) const
s << "->mCPUString: " << mCPUString << std::endl;
}
+// Helper class for LLMemoryInfo: accumulate stats in the form we store for
+// LLMemoryInfo::getStatsMap().
+class Stats
+{
+public:
+ Stats():
+ mStats(LLSD::emptyMap())
+ {}
+
+ // Store every integer type as LLSD::Integer.
+ template <class T>
+ void add(const LLSD::String& name, const T& value,
+ typename boost::enable_if<boost::is_integral<T> >::type* = 0)
+ {
+ mStats[name] = LLSD::Integer(value);
+ }
+
+ // Store every floating-point type as LLSD::Real.
+ template <class T>
+ void add(const LLSD::String& name, const T& value,
+ typename boost::enable_if<boost::is_float<T> >::type* = 0)
+ {
+ mStats[name] = LLSD::Real(value);
+ }
+
+ // Hope that LLSD::Date values are sufficiently unambiguous.
+ void add(const LLSD::String& name, const LLSD::Date& value)
+ {
+ mStats[name] = value;
+ }
+
+ LLSD get() const { return mStats; }
+
+private:
+ LLSD mStats;
+};
+
+// Wrap boost::regex_match() with a function that doesn't throw.
+template <typename S, typename M, typename R>
+static bool regex_match_no_exc(const S& string, M& match, const R& regex)
+{
+ try
+ {
+ return boost::regex_match(string, match, regex);
+ }
+ catch (const std::runtime_error& e)
+ {
+ LL_WARNS("LLMemoryInfo") << "error matching with '" << regex.str() << "': "
+ << e.what() << ":\n'" << string << "'" << LL_ENDL;
+ return false;
+ }
+}
+
+// Wrap boost::regex_search() with a function that doesn't throw.
+template <typename S, typename M, typename R>
+static bool regex_search_no_exc(const S& string, M& match, const R& regex)
+{
+ try
+ {
+ return boost::regex_search(string, match, regex);
+ }
+ catch (const std::runtime_error& e)
+ {
+ LL_WARNS("LLMemoryInfo") << "error searching with '" << regex.str() << "': "
+ << e.what() << ":\n'" << string << "'" << LL_ENDL;
+ return false;
+ }
+}
+
LLMemoryInfo::LLMemoryInfo()
{
+ refresh();
}
#if LL_WINDOWS
@@ -587,11 +745,7 @@ static U32 LLMemoryAdjustKBResult(U32 inKB)
U32 LLMemoryInfo::getPhysicalMemoryKB() const
{
#if LL_WINDOWS
- MEMORYSTATUSEX state;
- state.dwLength = sizeof(state);
- GlobalMemoryStatusEx(&state);
-
- return LLMemoryAdjustKBResult((U32)(state.ullTotalPhys >> 10));
+ return LLMemoryAdjustKBResult(mStatsMap["Total Physical KB"].asInteger());
#elif LL_DARWIN
// This might work on Linux as well. Someone check...
@@ -639,12 +793,82 @@ U32 LLMemoryInfo::getPhysicalMemoryClamped() const
void LLMemoryInfo::getAvailableMemoryKB(U32& avail_physical_mem_kb, U32& avail_virtual_mem_kb)
{
#if LL_WINDOWS
- MEMORYSTATUSEX state;
- state.dwLength = sizeof(state);
- GlobalMemoryStatusEx(&state);
+ // Sigh, this shouldn't be a static method, then we wouldn't have to
+ // reload this data separately from refresh()
+ LLSD statsMap(loadStatsMap());
+
+ avail_physical_mem_kb = statsMap["Avail Physical KB"].asInteger();
+ avail_virtual_mem_kb = statsMap["Avail Virtual KB"].asInteger();
+
+#elif LL_DARWIN
+ // mStatsMap is derived from vm_stat, look for (e.g.) "kb free":
+ // $ vm_stat
+ // Mach Virtual Memory Statistics: (page size of 4096 bytes)
+ // Pages free: 462078.
+ // Pages active: 142010.
+ // Pages inactive: 220007.
+ // Pages wired down: 159552.
+ // "Translation faults": 220825184.
+ // Pages copy-on-write: 2104153.
+ // Pages zero filled: 167034876.
+ // Pages reactivated: 65153.
+ // Pageins: 2097212.
+ // Pageouts: 41759.
+ // Object cache: 841598 hits of 7629869 lookups (11% hit rate)
+ avail_physical_mem_kb = -1 ;
+ avail_virtual_mem_kb = -1 ;
- avail_physical_mem_kb = (U32)(state.ullAvailPhys/1024) ;
- avail_virtual_mem_kb = (U32)(state.ullAvailVirtual/1024) ;
+#elif LL_LINUX
+ // mStatsMap is derived from MEMINFO_FILE:
+ // $ cat /proc/meminfo
+ // MemTotal: 4108424 kB
+ // MemFree: 1244064 kB
+ // Buffers: 85164 kB
+ // Cached: 1990264 kB
+ // SwapCached: 0 kB
+ // Active: 1176648 kB
+ // Inactive: 1427532 kB
+ // Active(anon): 529152 kB
+ // Inactive(anon): 15924 kB
+ // Active(file): 647496 kB
+ // Inactive(file): 1411608 kB
+ // Unevictable: 16 kB
+ // Mlocked: 16 kB
+ // HighTotal: 3266316 kB
+ // HighFree: 721308 kB
+ // LowTotal: 842108 kB
+ // LowFree: 522756 kB
+ // SwapTotal: 6384632 kB
+ // SwapFree: 6384632 kB
+ // Dirty: 28 kB
+ // Writeback: 0 kB
+ // AnonPages: 528820 kB
+ // Mapped: 89472 kB
+ // Shmem: 16324 kB
+ // Slab: 159624 kB
+ // SReclaimable: 145168 kB
+ // SUnreclaim: 14456 kB
+ // KernelStack: 2560 kB
+ // PageTables: 5560 kB
+ // NFS_Unstable: 0 kB
+ // Bounce: 0 kB
+ // WritebackTmp: 0 kB
+ // CommitLimit: 8438844 kB
+ // Committed_AS: 1271596 kB
+ // VmallocTotal: 122880 kB
+ // VmallocUsed: 65252 kB
+ // VmallocChunk: 52356 kB
+ // HardwareCorrupted: 0 kB
+ // HugePages_Total: 0
+ // HugePages_Free: 0
+ // HugePages_Rsvd: 0
+ // HugePages_Surp: 0
+ // Hugepagesize: 2048 kB
+ // DirectMap4k: 434168 kB
+ // DirectMap2M: 477184 kB
+ // (could also run 'free', but easier to read a file than run a program)
+ avail_physical_mem_kb = -1 ;
+ avail_virtual_mem_kb = -1 ;
#else
//do not know how to collect available memory info for other systems.
@@ -657,56 +881,283 @@ void LLMemoryInfo::getAvailableMemoryKB(U32& avail_physical_mem_kb, U32& avail_v
void LLMemoryInfo::stream(std::ostream& s) const
{
+ // We want these memory stats to be easy to grep from the log, along with
+ // the timestamp. So preface each line with the timestamp and a
+ // distinctive marker. Without that, we'd have to search the log for the
+ // introducer line, then read subsequent lines, etc...
+ std::string pfx(LLError::utcTime() + " <mem> ");
+
+ // Max key length
+ size_t key_width(0);
+ BOOST_FOREACH(const MapEntry& pair, inMap(mStatsMap))
+ {
+ size_t len(pair.first.length());
+ if (len > key_width)
+ {
+ key_width = len;
+ }
+ }
+
+ // Now stream stats
+ BOOST_FOREACH(const MapEntry& pair, inMap(mStatsMap))
+ {
+ s << pfx << std::setw(key_width+1) << (pair.first + ':') << ' ';
+ LLSD value(pair.second);
+ if (value.isInteger())
+ s << std::setw(12) << value.asInteger();
+ else if (value.isReal())
+ s << std::fixed << std::setprecision(1) << value.asReal();
+ else if (value.isDate())
+ value.asDate().toStream(s);
+ else
+ s << value; // just use default LLSD formatting
+ s << std::endl;
+ }
+}
+
+LLSD LLMemoryInfo::getStatsMap() const
+{
+ return mStatsMap;
+}
+
+LLMemoryInfo& LLMemoryInfo::refresh()
+{
+ mStatsMap = loadStatsMap();
+
+ LL_DEBUGS("LLMemoryInfo") << "Populated mStatsMap:\n";
+ LLSDSerialize::toPrettyXML(mStatsMap, LL_CONT);
+ LL_ENDL;
+
+ return *this;
+}
+
+LLSD LLMemoryInfo::loadStatsMap()
+{
+ // This implementation is derived from stream() code (as of 2011-06-29).
+ Stats stats;
+
+ // associate timestamp for analysis over time
+ stats.add("timestamp", LLDate::now());
+
#if LL_WINDOWS
MEMORYSTATUSEX state;
state.dwLength = sizeof(state);
GlobalMemoryStatusEx(&state);
- s << "Percent Memory use: " << (U32)state.dwMemoryLoad << '%' << std::endl;
- s << "Total Physical KB: " << (U32)(state.ullTotalPhys/1024) << std::endl;
- s << "Avail Physical KB: " << (U32)(state.ullAvailPhys/1024) << std::endl;
- s << "Total page KB: " << (U32)(state.ullTotalPageFile/1024) << std::endl;
- s << "Avail page KB: " << (U32)(state.ullAvailPageFile/1024) << std::endl;
- s << "Total Virtual KB: " << (U32)(state.ullTotalVirtual/1024) << std::endl;
- s << "Avail Virtual KB: " << (U32)(state.ullAvailVirtual/1024) << std::endl;
+ stats.add("Percent Memory use", state.dwMemoryLoad);
+ stats.add("Total Physical KB", state.ullTotalPhys/1024);
+ stats.add("Avail Physical KB", state.ullAvailPhys/1024);
+ stats.add("Total page KB", state.ullTotalPageFile/1024);
+ stats.add("Avail page KB", state.ullAvailPageFile/1024);
+ stats.add("Total Virtual KB", state.ullTotalVirtual/1024);
+ stats.add("Avail Virtual KB", state.ullAvailVirtual/1024);
+
+ PERFORMANCE_INFORMATION perf;
+ perf.cb = sizeof(perf);
+ GetPerformanceInfo(&perf, sizeof(perf));
+
+ SIZE_T pagekb(perf.PageSize/1024);
+ stats.add("CommitTotal KB", perf.CommitTotal * pagekb);
+ stats.add("CommitLimit KB", perf.CommitLimit * pagekb);
+ stats.add("CommitPeak KB", perf.CommitPeak * pagekb);
+ stats.add("PhysicalTotal KB", perf.PhysicalTotal * pagekb);
+ stats.add("PhysicalAvail KB", perf.PhysicalAvailable * pagekb);
+ stats.add("SystemCache KB", perf.SystemCache * pagekb);
+ stats.add("KernelTotal KB", perf.KernelTotal * pagekb);
+ stats.add("KernelPaged KB", perf.KernelPaged * pagekb);
+ stats.add("KernelNonpaged KB", perf.KernelNonpaged * pagekb);
+ stats.add("PageSize KB", pagekb);
+ stats.add("HandleCount", perf.HandleCount);
+ stats.add("ProcessCount", perf.ProcessCount);
+ stats.add("ThreadCount", perf.ThreadCount);
+
+ PROCESS_MEMORY_COUNTERS_EX pmem;
+ pmem.cb = sizeof(pmem);
+ // GetProcessMemoryInfo() is documented to accept either
+ // PROCESS_MEMORY_COUNTERS* or PROCESS_MEMORY_COUNTERS_EX*, presumably
+ // using the redundant size info to distinguish. But its prototype
+ // specifically accepts PROCESS_MEMORY_COUNTERS*, and since this is a
+ // classic-C API, PROCESS_MEMORY_COUNTERS_EX isn't a subclass. Cast the
+ // pointer.
+ GetProcessMemoryInfo(GetCurrentProcess(), PPROCESS_MEMORY_COUNTERS(&pmem), sizeof(pmem));
+
+ stats.add("Page Fault Count", pmem.PageFaultCount);
+ stats.add("PeakWorkingSetSize KB", pmem.PeakWorkingSetSize/1024);
+ stats.add("WorkingSetSize KB", pmem.WorkingSetSize/1024);
+ stats.add("QutaPeakPagedPoolUsage KB", pmem.QuotaPeakPagedPoolUsage/1024);
+ stats.add("QuotaPagedPoolUsage KB", pmem.QuotaPagedPoolUsage/1024);
+ stats.add("QuotaPeakNonPagedPoolUsage KB", pmem.QuotaPeakNonPagedPoolUsage/1024);
+ stats.add("QuotaNonPagedPoolUsage KB", pmem.QuotaNonPagedPoolUsage/1024);
+ stats.add("PagefileUsage KB", pmem.PagefileUsage/1024);
+ stats.add("PeakPagefileUsage KB", pmem.PeakPagefileUsage/1024);
+ stats.add("PrivateUsage KB", pmem.PrivateUsage/1024);
+
#elif LL_DARWIN
- uint64_t phys = 0;
- size_t len = sizeof(phys);
+ const vm_size_t pagekb(vm_page_size / 1024);
+
+ //
+ // Collect the vm_stat's
+ //
- if(sysctlbyname("hw.memsize", &phys, &len, NULL, 0) == 0)
{
- s << "Total Physical KB: " << phys/1024 << std::endl;
- }
- else
+ vm_statistics_data_t vmstat;
+ mach_msg_type_number_t vmstatCount = HOST_VM_INFO_COUNT;
+
+ if (host_statistics(mach_host_self(), HOST_VM_INFO, (host_info_t) &vmstat, &vmstatCount) != KERN_SUCCESS)
{
- s << "Unable to collect memory information";
+ LL_WARNS("LLMemoryInfo") << "Unable to collect memory information" << LL_ENDL;
+ }
+ else
+ {
+ stats.add("Pages free KB", pagekb * vmstat.free_count);
+ stats.add("Pages active KB", pagekb * vmstat.active_count);
+ stats.add("Pages inactive KB", pagekb * vmstat.inactive_count);
+ stats.add("Pages wired KB", pagekb * vmstat.wire_count);
+
+ stats.add("Pages zero fill", vmstat.zero_fill_count);
+ stats.add("Page reactivations", vmstat.reactivations);
+ stats.add("Page-ins", vmstat.pageins);
+ stats.add("Page-outs", vmstat.pageouts);
+
+ stats.add("Faults", vmstat.faults);
+ stats.add("Faults copy-on-write", vmstat.cow_faults);
+
+ stats.add("Cache lookups", vmstat.lookups);
+ stats.add("Cache hits", vmstat.hits);
+
+ stats.add("Page purgeable count", vmstat.purgeable_count);
+ stats.add("Page purges", vmstat.purges);
+
+ stats.add("Page speculative reads", vmstat.speculative_count);
+ }
}
+
+ //
+ // Collect the misc task info
+ //
+
+ {
+ task_events_info_data_t taskinfo;
+ unsigned taskinfoSize = sizeof(taskinfo);
+
+ if (task_info(mach_task_self(), TASK_EVENTS_INFO, (task_info_t) &taskinfo, &taskinfoSize) != KERN_SUCCESS)
+ {
+ LL_WARNS("LLMemoryInfo") << "Unable to collect task information" << LL_ENDL;
+ }
+ else
+ {
+ stats.add("Task page-ins", taskinfo.pageins);
+ stats.add("Task copy-on-write faults", taskinfo.cow_faults);
+ stats.add("Task messages sent", taskinfo.messages_sent);
+ stats.add("Task messages received", taskinfo.messages_received);
+ stats.add("Task mach system call count", taskinfo.syscalls_mach);
+ stats.add("Task unix system call count", taskinfo.syscalls_unix);
+ stats.add("Task context switch count", taskinfo.csw);
+ }
+ }
+
+ //
+ // Collect the basic task info
+ //
+
+ {
+ task_basic_info_64_data_t taskinfo;
+ unsigned taskinfoSize = sizeof(taskinfo);
+
+ if (task_info(mach_task_self(), TASK_BASIC_INFO_64, (task_info_t) &taskinfo, &taskinfoSize) != KERN_SUCCESS)
+ {
+ LL_WARNS("LLMemoryInfo") << "Unable to collect task information" << LL_ENDL;
+ }
+ else
+ {
+ stats.add("Basic suspend count", taskinfo.suspend_count);
+ stats.add("Basic virtual memory KB", taskinfo.virtual_size / 1024);
+ stats.add("Basic resident memory KB", taskinfo.resident_size / 1024);
+ stats.add("Basic new thread policy", taskinfo.policy);
+ }
+ }
+
#elif LL_SOLARIS
- U64 phys = 0;
+ U64 phys = 0;
- phys = (U64)(sysconf(_SC_PHYS_PAGES)) * (U64)(sysconf(_SC_PAGESIZE)/1024);
+ phys = (U64)(sysconf(_SC_PHYS_PAGES)) * (U64)(sysconf(_SC_PAGESIZE)/1024);
- s << "Total Physical KB: " << phys << std::endl;
-#else
- // *NOTE: This works on linux. What will it do on other systems?
- LLFILE* meminfo = LLFile::fopen(MEMINFO_FILE,"rb");
- if(meminfo)
+ stats.add("Total Physical KB", phys);
+
+#elif LL_LINUX
+ std::ifstream meminfo(MEMINFO_FILE);
+ if (meminfo.is_open())
{
- char line[MAX_STRING]; /* Flawfinder: ignore */
- memset(line, 0, MAX_STRING);
- while(fgets(line, MAX_STRING, meminfo))
+ // MemTotal: 4108424 kB
+ // MemFree: 1244064 kB
+ // Buffers: 85164 kB
+ // Cached: 1990264 kB
+ // SwapCached: 0 kB
+ // Active: 1176648 kB
+ // Inactive: 1427532 kB
+ // ...
+ // VmallocTotal: 122880 kB
+ // VmallocUsed: 65252 kB
+ // VmallocChunk: 52356 kB
+ // HardwareCorrupted: 0 kB
+ // HugePages_Total: 0
+ // HugePages_Free: 0
+ // HugePages_Rsvd: 0
+ // HugePages_Surp: 0
+ // Hugepagesize: 2048 kB
+ // DirectMap4k: 434168 kB
+ // DirectMap2M: 477184 kB
+
+ // Intentionally don't pass the boost::no_except flag. This
+ // boost::regex object is constructed with a string literal, so it
+ // should be valid every time. If it becomes invalid, we WANT an
+ // exception, hopefully even before the dev checks in.
+ boost::regex stat_rx("(.+): +([0-9]+)( kB)?");
+ boost::smatch matched;
+
+ std::string line;
+ while (std::getline(meminfo, line))
{
- line[strlen(line)-1] = ' '; /*Flawfinder: ignore*/
- s << line;
+ LL_DEBUGS("LLMemoryInfo") << line << LL_ENDL;
+ if (regex_match_no_exc(line, matched, stat_rx))
+ {
+ // e.g. "MemTotal: 4108424 kB"
+ LLSD::String key(matched[1].first, matched[1].second);
+ LLSD::String value_str(matched[2].first, matched[2].second);
+ LLSD::Integer value(0);
+ try
+ {
+ value = boost::lexical_cast<LLSD::Integer>(value_str);
+ }
+ catch (const boost::bad_lexical_cast&)
+ {
+ LL_WARNS("LLMemoryInfo") << "couldn't parse '" << value_str
+ << "' in " << MEMINFO_FILE << " line: "
+ << line << LL_ENDL;
+ continue;
+ }
+ // Store this statistic.
+ stats.add(key, value);
+ }
+ else
+ {
+ LL_WARNS("LLMemoryInfo") << "unrecognized " << MEMINFO_FILE << " line: "
+ << line << LL_ENDL;
+ }
}
- fclose(meminfo);
}
else
{
- s << "Unable to collect memory information";
+ LL_WARNS("LLMemoryInfo") << "Unable to collect memory information" << LL_ENDL;
}
+
+#else
+ LL_WARNS("LLMemoryInfo") << "Unknown system; unable to collect memory information" << LL_ENDL;
+
#endif
+
+ return stats.get();
}
std::ostream& operator<<(std::ostream& s, const LLOSInfo& info)
@@ -727,6 +1178,143 @@ std::ostream& operator<<(std::ostream& s, const LLMemoryInfo& info)
return s;
}
+class FrameWatcher
+{
+public:
+ FrameWatcher():
+ // Hooking onto the "mainloop" event pump gets us one call per frame.
+ mConnection(LLEventPumps::instance()
+ .obtain("mainloop")
+ .listen("FrameWatcher", boost::bind(&FrameWatcher::tick, this, _1))),
+ // Initializing mSampleStart to an invalid timestamp alerts us to skip
+ // trying to compute framerate on the first call.
+ mSampleStart(-1),
+ // Initializing mSampleEnd to 0 ensures that we treat the first call
+ // as the completion of a sample window.
+ mSampleEnd(0),
+ mFrames(0),
+ // Both MEM_INFO_WINDOW and MEM_INFO_THROTTLE are in seconds. We need
+ // the number of integer MEM_INFO_THROTTLE sample slots that will fit
+ // in MEM_INFO_WINDOW. Round up.
+ mSamples(int((MEM_INFO_WINDOW / MEM_INFO_THROTTLE) + 0.7)),
+ // Initializing to F32_MAX means that the first real frame will become
+ // the slowest ever, which sounds like a good idea.
+ mSlowest(F32_MAX)
+ {}
+
+ bool tick(const LLSD&)
+ {
+ F32 timestamp(mTimer.getElapsedTimeF32());
+
+ // Count this frame in the interval just completed.
+ ++mFrames;
+
+ // Have we finished a sample window yet?
+ if (timestamp < mSampleEnd)
+ {
+ // no, just keep waiting
+ return false;
+ }
+
+ // Set up for next sample window. Capture values for previous frame in
+ // local variables and reset data members.
+ U32 frames(mFrames);
+ F32 sampleStart(mSampleStart);
+ // No frames yet in next window
+ mFrames = 0;
+ // which starts right now
+ mSampleStart = timestamp;
+ // and ends MEM_INFO_THROTTLE seconds in the future
+ mSampleEnd = mSampleStart + MEM_INFO_THROTTLE;
+
+ // On the very first call, that's all we can do, no framerate
+ // computation is possible.
+ if (sampleStart < 0)
+ {
+ return false;
+ }
+
+ // How long did this actually take? As framerate slows, the duration
+ // of the frame we just finished could push us WELL beyond our desired
+ // sample window size.
+ F32 elapsed(timestamp - sampleStart);
+ F32 framerate(frames/elapsed);
+
+ // Remember previous slowest framerate because we're just about to
+ // update it.
+ F32 slowest(mSlowest);
+ // Remember previous number of samples.
+ boost::circular_buffer<F32>::size_type prevSize(mSamples.size());
+
+ // Capture new framerate in our samples buffer. Once the buffer is
+ // full (after MEM_INFO_WINDOW seconds), this will displace the oldest
+ // sample. ("So they all rolled over, and one fell out...")
+ mSamples.push_back(framerate);
+
+ // Calculate the new minimum framerate. I know of no way to update a
+ // rolling minimum without ever rescanning the buffer. But since there
+ // are only a few tens of items in this buffer, rescanning it is
+ // probably cheaper (and certainly easier to reason about) than
+ // attempting to optimize away some of the scans.
+ mSlowest = framerate; // pick an arbitrary entry to start
+ for (boost::circular_buffer<F32>::const_iterator si(mSamples.begin()), send(mSamples.end());
+ si != send; ++si)
+ {
+ if (*si < mSlowest)
+ {
+ mSlowest = *si;
+ }
+ }
+
+ // We're especially interested in memory as framerate drops. Only log
+ // when framerate drops below the slowest framerate we remember.
+ // (Should always be true for the end of the very first sample
+ // window.)
+ if (framerate >= slowest)
+ {
+ return false;
+ }
+ // Congratulations, we've hit a new low. :-P
+
+ LL_INFOS("FrameWatcher") << ' ';
+ if (! prevSize)
+ {
+ LL_CONT << "initial framerate ";
+ }
+ else
+ {
+ LL_CONT << "slowest framerate for last " << int(prevSize * MEM_INFO_THROTTLE)
+ << " seconds ";
+ }
+ LL_CONT << std::fixed << std::setprecision(1) << framerate << '\n'
+ << LLMemoryInfo() << LL_ENDL;
+
+ return false;
+ }
+
+private:
+ // Storing the connection in an LLTempBoundListener ensures it will be
+ // disconnected when we're destroyed.
+ LLTempBoundListener mConnection;
+ // Track elapsed time
+ LLTimer mTimer;
+ // Some of what you see here is in fact redundant with functionality you
+ // can get from LLTimer. Unfortunately the LLTimer API is missing the
+ // feature we need: has at least the stated interval elapsed, and if so,
+ // exactly how long has passed? So we have to do it by hand, sigh.
+ // Time at start, end of sample window
+ F32 mSampleStart, mSampleEnd;
+ // Frames this sample window
+ U32 mFrames;
+ // Sliding window of framerate samples
+ boost::circular_buffer<F32> mSamples;
+ // Slowest framerate in mSamples
+ F32 mSlowest;
+};
+
+// Need an instance of FrameWatcher before it does any good
+static FrameWatcher sFrameWatcher;
+
BOOL gunzip_file(const std::string& srcfile, const std::string& dstfile)
{
std::string tmpfile;
@@ -776,11 +1364,21 @@ BOOL gzip_file(const std::string& srcfile, const std::string& dstfile)
src = LLFile::fopen(srcfile, "rb"); /* Flawfinder: ignore */
if (! src) goto err;
- do
+ while ((bytes = (S32)fread(buffer, sizeof(U8), COMPRESS_BUFFER_SIZE, src)) > 0)
{
- bytes = (S32)fread(buffer, sizeof(U8), COMPRESS_BUFFER_SIZE,src);
- gzwrite(dst, buffer, bytes);
- } while(feof(src) == 0);
+ if (gzwrite(dst, buffer, bytes) <= 0)
+ {
+ llwarns << "gzwrite failed: " << gzerror(dst, NULL) << llendl;
+ goto err;
+ }
+ }
+
+ if (ferror(src))
+ {
+ llwarns << "Error reading " << srcfile << llendl;
+ goto err;
+ }
+
gzclose(dst);
dst = NULL;
#if LL_WINDOWS
diff --git a/indra/llcommon/llsys.h b/indra/llcommon/llsys.h
index 41a4f25000..739e795d3a 100644
--- a/indra/llcommon/llsys.h
+++ b/indra/llcommon/llsys.h
@@ -36,6 +36,7 @@
// llinfos << info << llendl;
//
+#include "llsd.h"
#include <iosfwd>
#include <string>
@@ -117,6 +118,27 @@ public:
//get the available memory infomation in KiloBytes.
static void getAvailableMemoryKB(U32& avail_physical_mem_kb, U32& avail_virtual_mem_kb);
+
+ // Retrieve a map of memory statistics. The keys of the map are platform-
+ // dependent. The values are in kilobytes to try to avoid integer overflow.
+ LLSD getStatsMap() const;
+
+ // Re-fetch memory data (as reported by stream() and getStatsMap()) from the
+ // system. Normally this is fetched at construction time. Return (*this)
+ // to permit usage of the form:
+ // @code
+ // LLMemoryInfo info;
+ // ...
+ // info.refresh().getStatsMap();
+ // @endcode
+ LLMemoryInfo& refresh();
+
+private:
+ // set mStatsMap
+ static LLSD loadStatsMap();
+
+ // Memory stats for getStatsMap().
+ LLSD mStatsMap;
};
diff --git a/indra/llcommon/llthread.cpp b/indra/llcommon/llthread.cpp
index 49d05ef411..a6ad6b125c 100644
--- a/indra/llcommon/llthread.cpp
+++ b/indra/llcommon/llthread.cpp
@@ -56,6 +56,21 @@
//
//----------------------------------------------------------------------------
+#if !LL_DARWIN
+U32 ll_thread_local sThreadID = 0;
+#endif
+
+U32 LLThread::sIDIter = 0;
+
+LL_COMMON_API void assert_main_thread()
+{
+ static U32 s_thread_id = LLThread::currentID();
+ if (LLThread::currentID() != s_thread_id)
+ {
+ llerrs << "Illegal execution outside main thread." << llendl;
+ }
+}
+
//
// Handed to the APR thread creation function
//
@@ -63,10 +78,14 @@ void *APR_THREAD_FUNC LLThread::staticRun(apr_thread_t *apr_threadp, void *datap
{
LLThread *threadp = (LLThread *)datap;
+#if !LL_DARWIN
+ sThreadID = threadp->mID;
+#endif
+
// Run the user supplied function
threadp->run();
- llinfos << "LLThread::staticRun() Exiting: " << threadp->mName << llendl;
+ //llinfos << "LLThread::staticRun() Exiting: " << threadp->mName << llendl;
// We're done with the run function, this thread is done executing now.
threadp->mStatus = STOPPED;
@@ -81,6 +100,8 @@ LLThread::LLThread(const std::string& name, apr_pool_t *poolp) :
mAPRThreadp(NULL),
mStatus(STOPPED)
{
+ mID = ++sIDIter;
+
// Thread creation probably CAN be paranoid about APR being initialized, if necessary
if (poolp)
{
@@ -121,7 +142,7 @@ void LLThread::shutdown()
// First, set the flag that indicates that we're ready to die
setQuitting();
- llinfos << "LLThread::~LLThread() Killing thread " << mName << " Status: " << mStatus << llendl;
+ //llinfos << "LLThread::~LLThread() Killing thread " << mName << " Status: " << mStatus << llendl;
// Now wait a bit for the thread to exit
// It's unclear whether I should even bother doing this - this destructor
// should netver get called unless we're already stopped, really...
@@ -143,7 +164,7 @@ void LLThread::shutdown()
if (!isStopped())
{
// This thread just wouldn't stop, even though we gave it time
- llwarns << "LLThread::~LLThread() exiting thread before clean exit!" << llendl;
+ //llwarns << "LLThread::~LLThread() exiting thread before clean exit!" << llendl;
// Put a stake in its heart.
apr_thread_exit(mAPRThreadp, -1);
return;
@@ -283,7 +304,7 @@ void LLThread::wakeLocked()
//============================================================================
LLMutex::LLMutex(apr_pool_t *poolp) :
- mAPRMutexp(NULL)
+ mAPRMutexp(NULL), mCount(0), mLockingThread(NO_THREAD)
{
//if (poolp)
//{
@@ -302,7 +323,8 @@ LLMutex::LLMutex(apr_pool_t *poolp) :
LLMutex::~LLMutex()
{
#if MUTEX_DEBUG
- llassert_always(!isLocked()); // better not be locked!
+ //bad assertion, the subclass LLSignal might be "locked", and that's OK
+ //llassert_always(!isLocked()); // better not be locked!
#endif
apr_thread_mutex_destroy(mAPRMutexp);
mAPRMutexp = NULL;
@@ -315,7 +337,14 @@ LLMutex::~LLMutex()
void LLMutex::lock()
{
+ if(isSelfLocked())
+ { //redundant lock
+ mCount++;
+ return;
+ }
+
apr_thread_mutex_lock(mAPRMutexp);
+
#if MUTEX_DEBUG
// Have to have the lock before we can access the debug info
U32 id = LLThread::currentID();
@@ -323,10 +352,22 @@ void LLMutex::lock()
llerrs << "Already locked in Thread: " << id << llendl;
mIsLocked[id] = TRUE;
#endif
+
+#if LL_DARWIN
+ mLockingThread = LLThread::currentID();
+#else
+ mLockingThread = sThreadID;
+#endif
}
void LLMutex::unlock()
{
+ if (mCount > 0)
+ { //not the root unlock
+ mCount--;
+ return;
+ }
+
#if MUTEX_DEBUG
// Access the debug info while we have the lock
U32 id = LLThread::currentID();
@@ -334,6 +375,8 @@ void LLMutex::unlock()
llerrs << "Not locked in Thread: " << id << llendl;
mIsLocked[id] = FALSE;
#endif
+
+ mLockingThread = NO_THREAD;
apr_thread_mutex_unlock(mAPRMutexp);
}
@@ -351,6 +394,20 @@ bool LLMutex::isLocked()
}
}
+bool LLMutex::isSelfLocked()
+{
+#if LL_DARWIN
+ return mLockingThread == LLThread::currentID();
+#else
+ return mLockingThread == sThreadID;
+#endif
+}
+
+U32 LLMutex::lockingThread() const
+{
+ return mLockingThread;
+}
+
//============================================================================
LLCondition::LLCondition(apr_pool_t *poolp) :
@@ -371,6 +428,15 @@ LLCondition::~LLCondition()
void LLCondition::wait()
{
+ if (!isLocked())
+ { //mAPRMutexp MUST be locked before calling apr_thread_cond_wait
+ apr_thread_mutex_lock(mAPRMutexp);
+#if MUTEX_DEBUG
+ // avoid asserts on destruction in non-release builds
+ U32 id = LLThread::currentID();
+ mIsLocked[id] = TRUE;
+#endif
+ }
apr_thread_cond_wait(mAPRCondp, mAPRMutexp);
}
diff --git a/indra/llcommon/llthread.h b/indra/llcommon/llthread.h
index f1c6cd75af..b52e70ab2e 100644
--- a/indra/llcommon/llthread.h
+++ b/indra/llcommon/llthread.h
@@ -35,8 +35,17 @@ class LLThread;
class LLMutex;
class LLCondition;
+#if LL_WINDOWS
+#define ll_thread_local __declspec(thread)
+#else
+#define ll_thread_local __thread
+#endif
+
class LL_COMMON_API LLThread
{
+private:
+ static U32 sIDIter;
+
public:
typedef enum e_thread_status
{
@@ -77,6 +86,8 @@ public:
apr_pool_t *getAPRPool() { return mAPRPoolp; }
LLVolatileAPRPool* getLocalAPRFilePool() { return mLocalAPRFilePoolp ; }
+ U32 getID() const { return mID; }
+
private:
BOOL mPaused;
@@ -91,6 +102,7 @@ protected:
apr_pool_t *mAPRPoolp;
BOOL mIsLocalPool;
EThreadStatus mStatus;
+ U32 mID;
//a local apr_pool for APRFile operations in this thread. If it exists, LLAPRFile::sAPRFilePoolp should not be used.
//Note: this pool is used by APRFile ONLY, do NOT use it for any other purposes.
@@ -128,17 +140,28 @@ protected:
class LL_COMMON_API LLMutex
{
public:
+ typedef enum
+ {
+ NO_THREAD = 0xFFFFFFFF
+ } e_locking_thread;
+
LLMutex(apr_pool_t *apr_poolp); // NULL pool constructs a new pool for the mutex
virtual ~LLMutex();
void lock(); // blocks
void unlock();
bool isLocked(); // non-blocking, but does do a lock/unlock so not free
+ bool isSelfLocked(); //return true if locked in a same thread
+ U32 lockingThread() const; //get ID of locking thread
protected:
apr_thread_mutex_t *mAPRMutexp;
+ mutable U32 mCount;
+ mutable U32 mLockingThread;
+
apr_pool_t *mAPRPoolp;
BOOL mIsLocalPool;
+
#if MUTEX_DEBUG
std::map<U32, BOOL> mIsLocked;
#endif
@@ -165,11 +188,14 @@ public:
LLMutexLock(LLMutex* mutex)
{
mMutex = mutex;
- mMutex->lock();
+
+ if(mMutex)
+ mMutex->lock();
}
~LLMutexLock()
{
- mMutex->unlock();
+ if(mMutex)
+ mMutex->unlock();
}
private:
LLMutex* mMutex;
diff --git a/indra/llcommon/lltimer.cpp b/indra/llcommon/lltimer.cpp
index 38054b636e..9ebc6de7f4 100644
--- a/indra/llcommon/lltimer.cpp
+++ b/indra/llcommon/lltimer.cpp
@@ -83,7 +83,7 @@ U32 micro_sleep(U64 us, U32 max_yields)
{
// max_yields is unused; just fiddle with it to avoid warnings.
max_yields = 0;
- ms_sleep(us / 1000);
+ ms_sleep((U32)(us / 1000));
return 0;
}
#elif LL_LINUX || LL_SOLARIS || LL_DARWIN
diff --git a/indra/llcommon/llversionviewer.h b/indra/llcommon/llversionviewer.h
index d6fa5b1997..fafc750690 100644
--- a/indra/llcommon/llversionviewer.h
+++ b/indra/llcommon/llversionviewer.h
@@ -27,15 +27,15 @@
#ifndef LL_LLVERSIONVIEWER_H
#define LL_LLVERSIONVIEWER_H
-const S32 LL_VERSION_MAJOR = 2;
-const S32 LL_VERSION_MINOR = 5;
-const S32 LL_VERSION_PATCH = 0;
+const S32 LL_VERSION_MAJOR = 3;
+const S32 LL_VERSION_MINOR = 3;
+const S32 LL_VERSION_PATCH = 2;
const S32 LL_VERSION_BUILD = 0;
const char * const LL_CHANNEL = "Second Life Developer";
#if LL_DARWIN
-const char * const LL_VERSION_BUNDLE_ID = "com.secondlife.snowglobe.viewer";
+const char * const LL_VERSION_BUNDLE_ID = "com.secondlife.indra.viewer";
#endif
#endif
diff --git a/indra/llcommon/llworkerthread.cpp b/indra/llcommon/llworkerthread.cpp
index 3ac50832fd..3d05a30ac2 100644
--- a/indra/llcommon/llworkerthread.cpp
+++ b/indra/llcommon/llworkerthread.cpp
@@ -34,8 +34,8 @@
//============================================================================
// Run on MAIN thread
-LLWorkerThread::LLWorkerThread(const std::string& name, bool threaded) :
- LLQueuedThread(name, threaded)
+LLWorkerThread::LLWorkerThread(const std::string& name, bool threaded, bool should_pause) :
+ LLQueuedThread(name, threaded, should_pause)
{
mDeleteMutex = new LLMutex(NULL);
@@ -81,7 +81,7 @@ void LLWorkerThread::clearDeleteList()
}
// virtual
-S32 LLWorkerThread::update(U32 max_time_ms)
+S32 LLWorkerThread::update(F32 max_time_ms)
{
S32 res = LLQueuedThread::update(max_time_ms);
// Delete scheduled workers
diff --git a/indra/llcommon/llworkerthread.h b/indra/llcommon/llworkerthread.h
index 9bff18303e..be46394d6e 100644
--- a/indra/llcommon/llworkerthread.h
+++ b/indra/llcommon/llworkerthread.h
@@ -83,10 +83,10 @@ private:
LLMutex* mDeleteMutex;
public:
- LLWorkerThread(const std::string& name, bool threaded = true);
+ LLWorkerThread(const std::string& name, bool threaded = true, bool should_pause = false);
~LLWorkerThread();
- /*virtual*/ S32 update(U32 max_time_ms);
+ /*virtual*/ S32 update(F32 max_time_ms);
handle_t addWorkRequest(LLWorkerClass* workerclass, S32 param, U32 priority = PRIORITY_NORMAL);
diff --git a/indra/llcommon/stdenums.h b/indra/llcommon/stdenums.h
index 9f86de124e..40b3364b36 100644
--- a/indra/llcommon/stdenums.h
+++ b/indra/llcommon/stdenums.h
@@ -49,7 +49,9 @@ enum EDragAndDropType
DAD_ANIMATION = 12,
DAD_GESTURE = 13,
DAD_LINK = 14,
- DAD_COUNT = 15, // number of types in this enum
+ DAD_MESH = 15,
+ DAD_WIDGET = 16,
+ DAD_COUNT = 17, // number of types in this enum
};
// Reasons for drags to be denied.
diff --git a/indra/llcommon/tests/lldependencies_test.cpp b/indra/llcommon/tests/lldependencies_test.cpp
index e40743ccf7..5395d785b6 100644
--- a/indra/llcommon/tests/lldependencies_test.cpp
+++ b/indra/llcommon/tests/lldependencies_test.cpp
@@ -258,10 +258,10 @@ namespace tut
++const_iterator;
ensure_equals(const_iterator->first, "def");
ensure_equals(const_iterator->second, 2);
- NameIndexDeps::node_range node_range(nideps.get_node_range());
- ensure_equals(instance_from_range<std::vector<int> >(node_range), make< std::vector<int> >(list_of(1)(2)(3)));
- *node_range.begin() = 0;
- *node_range.begin() = 1;
+// NameIndexDeps::node_range node_range(nideps.get_node_range());
+// ensure_equals(instance_from_range<std::vector<int> >(node_range), make< std::vector<int> >(list_of(1)(2)(3)));
+// *node_range.begin() = 0;
+// *node_range.begin() = 1;
NameIndexDeps::const_node_range const_node_range(const_nideps.get_node_range());
ensure_equals(instance_from_range<std::vector<int> >(const_node_range), make< std::vector<int> >(list_of(1)(2)(3)));
NameIndexDeps::const_key_range const_key_range(const_nideps.get_key_range());
@@ -278,8 +278,8 @@ namespace tut
def);
ensure_equals(instance_from_range<StringList>(const_nideps.get_after_range(const_nideps.get_range().begin())),
def);
- ensure_equals(instance_from_range<StringList>(nideps.get_after_range(nideps.get_node_range().begin())),
- def);
+// ensure_equals(instance_from_range<StringList>(nideps.get_after_range(nideps.get_node_range().begin())),
+// def);
ensure_equals(instance_from_range<StringList>(const_nideps.get_after_range(const_nideps.get_node_range().begin())),
def);
ensure_equals(instance_from_range<StringList>(nideps.get_after_range(nideps.get_key_range().begin())),
diff --git a/indra/llcommon/tests/llerror_test.cpp b/indra/llcommon/tests/llerror_test.cpp
index 1ef8fc9712..09a20231de 100644
--- a/indra/llcommon/tests/llerror_test.cpp
+++ b/indra/llcommon/tests/llerror_test.cpp
@@ -48,7 +48,10 @@ namespace
{
static bool fatalWasCalled;
void fatalCall(const std::string&) { fatalWasCalled = true; }
+}
+namespace tut
+{
class TestRecorder : public LLError::Recorder
{
public:
@@ -56,7 +59,7 @@ namespace
~TestRecorder() { LLError::removeRecorder(this); }
void recordMessage(LLError::ELevel level,
- const std::string& message)
+ const std::string& message)
{
mMessages.push_back(message);
}
@@ -66,12 +69,12 @@ namespace
void setWantsTime(bool t) { mWantsTime = t; }
bool wantsTime() { return mWantsTime; }
-
+
std::string message(int n)
{
std::ostringstream test_name;
test_name << "testing message " << n << ", not enough messages";
-
+
tut::ensure(test_name.str(), n < countMessages());
return mMessages[n];
}
@@ -82,10 +85,7 @@ namespace
bool mWantsTime;
};
-}
-
-namespace tut
-{
+
struct ErrorTestData
{
TestRecorder mRecorder;
@@ -381,7 +381,7 @@ namespace
}
typedef std::string (*LogFromFunction)(bool);
- void testLogName(TestRecorder& recorder, LogFromFunction f,
+ void testLogName(tut::TestRecorder& recorder, LogFromFunction f,
const std::string& class_name = "")
{
recorder.clearMessages();
diff --git a/indra/llcommon/tests/lleventdispatcher_test.cpp b/indra/llcommon/tests/lleventdispatcher_test.cpp
new file mode 100644
index 0000000000..263c9b171f
--- /dev/null
+++ b/indra/llcommon/tests/lleventdispatcher_test.cpp
@@ -0,0 +1,1324 @@
+/**
+ * @file lleventdispatcher_test.cpp
+ * @author Nat Goodspeed
+ * @date 2011-01-20
+ * @brief Test for lleventdispatcher.
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Copyright (c) 2011, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+// Precompiled header
+#include "linden_common.h"
+// associated header
+#include "lleventdispatcher.h"
+// STL headers
+// std headers
+// external library headers
+// other Linden headers
+#include "../test/lltut.h"
+#include "llsd.h"
+#include "llsdutil.h"
+#include "stringize.h"
+#include "tests/wrapllerrs.h"
+
+#include <map>
+#include <string>
+#include <stdexcept>
+
+#include <boost/bind.hpp>
+#include <boost/function.hpp>
+#include <boost/range.hpp>
+#include <boost/foreach.hpp>
+#define foreach BOOST_FOREACH
+
+#include <boost/lambda/lambda.hpp>
+
+#include <iostream>
+#include <iomanip>
+
+using boost::lambda::constant;
+using boost::lambda::constant_ref;
+using boost::lambda::var;
+
+using namespace llsd;
+
+/*****************************************************************************
+* Output control
+*****************************************************************************/
+#ifdef DEBUG_ON
+using std::cout;
+#else
+static std::ostringstream cout;
+#endif
+
+/*****************************************************************************
+* Example data, functions, classes
+*****************************************************************************/
+// We don't need a whole lot of different arbitrary-params methods, just (no |
+// (const LLSD&) | arbitrary) args (function | static method | non-static
+// method), where 'arbitrary' is (every LLSD datatype + (const char*)).
+// But we need to register each one under different names for the different
+// registration styles. Don't forget LLEventDispatcher subclass methods(const
+// LLSD&).
+
+// However, the number of target parameter conversions we want to try exceeds
+// boost::fusion::invoke()'s supported parameter-list size. Break out two
+// different lists.
+#define NPARAMSa bool b, int i, float f, double d, const char* cp
+#define NPARAMSb const std::string& s, const LLUUID& uuid, const LLDate& date, \
+ const LLURI& uri, const std::vector<U8>& bin
+#define NARGSa b, i, f, d, cp
+#define NARGSb s, uuid, date, uri, bin
+
+// For some registration methods we need methods on a subclass of
+// LLEventDispatcher. To simplify things, we'll use this Dispatcher subclass
+// for all our testing, including testing its own methods.
+class Dispatcher: public LLEventDispatcher
+{
+public:
+ Dispatcher(const std::string& name, const std::string& key):
+ LLEventDispatcher(name, key)
+ {}
+
+ // sensing member, mutable because we want to know when we've reached our
+ // const method too
+ mutable LLSD llsd;
+
+ void method1(const LLSD& obj) { llsd = obj; }
+ void cmethod1(const LLSD& obj) const { llsd = obj; }
+};
+
+// sensing vars, captured in a struct to make it convenient to clear them
+struct Vars
+{
+ LLSD llsd;
+ bool b;
+ int i;
+ float f;
+ double d;
+ // Capture param passed as char*. But merely storing a char* received from
+ // our caller, possibly the .c_str() from a concatenation expression,
+ // would be Bad: the pointer will be invalidated long before we can query
+ // it. We could allocate a new chunk of memory, copy the string data and
+ // point to that instead -- but hey, guess what, we already have a class
+ // that does that!
+ std::string cp;
+ std::string s;
+ LLUUID uuid;
+ LLDate date;
+ LLURI uri;
+ std::vector<U8> bin;
+
+ Vars():
+ // Only need to initialize the POD types, the rest should take care of
+ // default-constructing themselves.
+ b(false),
+ i(0),
+ f(0),
+ d(0)
+ {}
+
+ // Detect any non-default values for convenient testing
+ LLSD inspect() const
+ {
+ LLSD result;
+
+ if (llsd.isDefined())
+ result["llsd"] = llsd;
+ if (b)
+ result["b"] = b;
+ if (i)
+ result["i"] = i;
+ if (f)
+ result["f"] = f;
+ if (d)
+ result["d"] = d;
+ if (! cp.empty())
+ result["cp"] = cp;
+ if (! s.empty())
+ result["s"] = s;
+ if (uuid != LLUUID())
+ result["uuid"] = uuid;
+ if (date != LLDate())
+ result["date"] = date;
+ if (uri != LLURI())
+ result["uri"] = uri;
+ if (! bin.empty())
+ result["bin"] = bin;
+
+ return result;
+ }
+
+ /*------------- no-args (non-const, const, static) methods -------------*/
+ void method0()
+ {
+ cout << "method0()\n";
+ i = 17;
+ }
+
+ void cmethod0() const
+ {
+ cout << 'c';
+ const_cast<Vars*>(this)->method0();
+ }
+
+ static void smethod0();
+
+ /*------------ Callable (non-const, const, static) methods -------------*/
+ void method1(const LLSD& obj)
+ {
+ cout << "method1(" << obj << ")\n";
+ llsd = obj;
+ }
+
+ void cmethod1(const LLSD& obj) const
+ {
+ cout << 'c';
+ const_cast<Vars*>(this)->method1(obj);
+ }
+
+ static void smethod1(const LLSD& obj);
+
+ /*-------- Arbitrary-params (non-const, const, static) methods ---------*/
+ void methodna(NPARAMSa)
+ {
+ // Because our const char* param cp might be NULL, and because we
+ // intend to capture the value in a std::string, have to distinguish
+ // between the NULL value and any non-NULL value. Use a convention
+ // easy for a human reader: enclose any non-NULL value in single
+ // quotes, reserving the unquoted string "NULL" to represent a NULL ptr.
+ std::string vcp;
+ if (cp == NULL)
+ vcp = "NULL";
+ else
+ vcp = std::string("'") + cp + "'";
+
+ cout << "methodna(" << b
+ << ", " << i
+ << ", " << f
+ << ", " << d
+ << ", " << vcp
+ << ")\n";
+
+ this->b = b;
+ this->i = i;
+ this->f = f;
+ this->d = d;
+ this->cp = vcp;
+ }
+
+ void methodnb(NPARAMSb)
+ {
+ std::ostringstream vbin;
+ foreach(U8 byte, bin)
+ {
+ vbin << std::hex << std::setfill('0') << std::setw(2) << unsigned(byte);
+ }
+
+ cout << "methodnb(" << "'" << s << "'"
+ << ", " << uuid
+ << ", " << date
+ << ", '" << uri << "'"
+ << ", " << vbin.str()
+ << ")\n";
+
+ this->s = s;
+ this->uuid = uuid;
+ this->date = date;
+ this->uri = uri;
+ this->bin = bin;
+ }
+
+ void cmethodna(NPARAMSa) const
+ {
+ cout << 'c';
+ const_cast<Vars*>(this)->methodna(NARGSa);
+ }
+
+ void cmethodnb(NPARAMSb) const
+ {
+ cout << 'c';
+ const_cast<Vars*>(this)->methodnb(NARGSb);
+ }
+
+ static void smethodna(NPARAMSa);
+ static void smethodnb(NPARAMSb);
+};
+/*------- Global Vars instance for free functions and static methods -------*/
+static Vars g;
+
+/*------------ Static Vars method implementations reference 'g' ------------*/
+void Vars::smethod0()
+{
+ cout << "smethod0() -> ";
+ g.method0();
+}
+
+void Vars::smethod1(const LLSD& obj)
+{
+ cout << "smethod1(" << obj << ") -> ";
+ g.method1(obj);
+}
+
+void Vars::smethodna(NPARAMSa)
+{
+ cout << "smethodna(...) -> ";
+ g.methodna(NARGSa);
+}
+
+void Vars::smethodnb(NPARAMSb)
+{
+ cout << "smethodnb(...) -> ";
+ g.methodnb(NARGSb);
+}
+
+/*--------------------------- Reset global Vars ----------------------------*/
+void clear()
+{
+ g = Vars();
+}
+
+/*------------------- Free functions also reference 'g' --------------------*/
+void free0()
+{
+ cout << "free0() -> ";
+ g.method0();
+}
+
+void free1(const LLSD& obj)
+{
+ cout << "free1(" << obj << ") -> ";
+ g.method1(obj);
+}
+
+void freena(NPARAMSa)
+{
+ cout << "freena(...) -> ";
+ g.methodna(NARGSa);
+}
+
+void freenb(NPARAMSb)
+{
+ cout << "freenb(...) -> ";
+ g.methodnb(NARGSb);
+}
+
+/*****************************************************************************
+* TUT
+*****************************************************************************/
+namespace tut
+{
+ struct lleventdispatcher_data
+ {
+ WrapLL_ERRS redirect;
+ Dispatcher work;
+ Vars v;
+ std::string name, desc;
+ // Capture our own copy of all registered functions' descriptions
+ typedef std::map<std::string, std::string> DescMap;
+ DescMap descs;
+ // Capture the Vars instance on which we expect each function to operate
+ typedef std::map<std::string, Vars*> VarsMap;
+ VarsMap funcvars;
+ // Required structure for Callables with requirements
+ LLSD required;
+ // Parameter names for freena(), freenb()
+ LLSD params;
+ // Full, partial defaults arrays for params for freena(), freenb()
+ LLSD dft_array_full, dft_array_partial;
+ // Start index of partial defaults arrays
+ const LLSD::Integer partial_offset;
+ // Full, partial defaults maps for params for freena(), freenb()
+ LLSD dft_map_full, dft_map_partial;
+ // Most of the above are indexed by "a" or "b". Useful to have an
+ // array containing those strings for iterating.
+ std::vector<LLSD::String> ab;
+
+ lleventdispatcher_data():
+ work("test dispatcher", "op"),
+ // map {d=double, array=[3 elements]}
+ required(LLSDMap("d", LLSD::Real(0))("array", LLSDArray(LLSD())(LLSD())(LLSD()))),
+ // first several params are required, last couple optional
+ partial_offset(3)
+ {
+ // This object is reconstructed for every test<n> method. But
+ // clear global variables every time too.
+ ::clear();
+
+ const char* abs[] = { "a", "b" };
+ ab.assign(boost::begin(abs), boost::end(abs));
+
+ // Registration cases:
+ // - (Callable | subclass const method | subclass non-const method |
+ // non-subclass method) (with | without) required
+ // - (Free function | static method | non-static method), (no | arbitrary) params,
+ // array style
+ // - (Free function | static method | non-static method), (no | arbitrary) params,
+ // map style, (empty | partial | full) (array | map) defaults
+ // - Map-style errors:
+ // - (scalar | map) param names
+ // - defaults scalar
+ // - defaults array longer than params array
+ // - defaults map with plural unknown param names
+
+ // I hate to have to write things twice, because of having to keep
+ // them consistent. If we had variadic functions, addf() would be
+ // a variadic method, capturing the name and desc and passing them
+ // plus "everything else" to work.add(). If I could return a pair
+ // and use that pair as the first two args to work.add(), I'd do
+ // that. But the best I can do with present C++ is to set two
+ // instance variables as a side effect of addf(), and pass those
+ // variables to each work.add() call. :-P
+
+ /*------------------------- Callables --------------------------*/
+
+ // Arbitrary Callable with/out required params
+ addf("free1", "free1", &g);
+ work.add(name, desc, free1);
+ addf("free1_req", "free1", &g);
+ work.add(name, desc, free1, required);
+ // Subclass non-const method with/out required params
+ addf("Dmethod1", "method1", NULL);
+ work.add(name, desc, &Dispatcher::method1);
+ addf("Dmethod1_req", "method1", NULL);
+ work.add(name, desc, &Dispatcher::method1, required);
+ // Subclass const method with/out required params
+ addf("Dcmethod1", "cmethod1", NULL);
+ work.add(name, desc, &Dispatcher::cmethod1);
+ addf("Dcmethod1_req", "cmethod1", NULL);
+ work.add(name, desc, &Dispatcher::cmethod1, required);
+ // Non-subclass method with/out required params
+ addf("method1", "method1", &v);
+ work.add(name, desc, boost::bind(&Vars::method1, boost::ref(v), _1));
+ addf("method1_req", "method1", &v);
+ work.add(name, desc, boost::bind(&Vars::method1, boost::ref(v), _1), required);
+
+ /*--------------- Arbitrary params, array style ----------------*/
+
+ // (Free function | static method) with (no | arbitrary) params, array style
+ addf("free0_array", "free0", &g);
+ work.add(name, desc, free0);
+ addf("freena_array", "freena", &g);
+ work.add(name, desc, freena);
+ addf("freenb_array", "freenb", &g);
+ work.add(name, desc, freenb);
+ addf("smethod0_array", "smethod0", &g);
+ work.add(name, desc, &Vars::smethod0);
+ addf("smethodna_array", "smethodna", &g);
+ work.add(name, desc, &Vars::smethodna);
+ addf("smethodnb_array", "smethodnb", &g);
+ work.add(name, desc, &Vars::smethodnb);
+ // Non-static method with (no | arbitrary) params, array style
+ addf("method0_array", "method0", &v);
+ work.add(name, desc, &Vars::method0, boost::lambda::var(v));
+ addf("methodna_array", "methodna", &v);
+ work.add(name, desc, &Vars::methodna, boost::lambda::var(v));
+ addf("methodnb_array", "methodnb", &v);
+ work.add(name, desc, &Vars::methodnb, boost::lambda::var(v));
+
+ /*---------------- Arbitrary params, map style -----------------*/
+
+ // We lay out each params list as an array, also each array of
+ // default values we'll register. We'll zip these into
+ // (param=value) maps. Why not define them as maps and just
+ // extract the keys and values to arrays? Because that wouldn't
+ // give us the right params-list order.
+
+ // freena(), methodna(), cmethodna(), smethodna() all take same param list.
+ // Same for freenb() et al.
+ params = LLSDMap("a", LLSDArray("b")("i")("f")("d")("cp"))
+ ("b", LLSDArray("s")("uuid")("date")("uri")("bin"));
+ cout << "params:\n" << params << "\nparams[\"a\"]:\n" << params["a"] << "\nparams[\"b\"]:\n" << params["b"] << std::endl;
+ // default LLSD::Binary value
+ std::vector<U8> binary;
+ for (size_t ix = 0, h = 0xaa; ix < 6; ++ix, h += 0x11)
+ {
+ binary.push_back(h);
+ }
+ // Full defaults arrays. We actually don't care what the LLUUID or
+ // LLDate values are, as long as they're different from the
+ // LLUUID() and LLDate() default values so inspect() will report
+ // them.
+ dft_array_full = LLSDMap("a", LLSDArray(true)(17)(3.14)(123456.78)("classic"))
+ ("b", LLSDArray("string")
+ (LLUUID::generateNewID())
+ (LLDate::now())
+ (LLURI("http://www.ietf.org/rfc/rfc3986.txt"))
+ (binary));
+ cout << "dft_array_full:\n" << dft_array_full << std::endl;
+ // Partial defaults arrays.
+ foreach(LLSD::String a, ab)
+ {
+ LLSD::Integer partition(std::min(partial_offset, dft_array_full[a].size()));
+ dft_array_partial[a] =
+ llsd_copy_array(dft_array_full[a].beginArray() + partition,
+ dft_array_full[a].endArray());
+ }
+ cout << "dft_array_partial:\n" << dft_array_partial << std::endl;
+
+ foreach(LLSD::String a, ab)
+ {
+ // Generate full defaults maps by zipping (params, dft_array_full).
+ dft_map_full[a] = zipmap(params[a], dft_array_full[a]);
+
+ // Generate partial defaults map by zipping alternate entries from
+ // (params, dft_array_full). Part of the point of using map-style
+ // defaults is to allow any subset of the target function's
+ // parameters to be optional, not just the rightmost.
+ for (LLSD::Integer ix = 0, ixend = params[a].size(); ix < ixend; ix += 2)
+ {
+ dft_map_partial[a][params[a][ix].asString()] = dft_array_full[a][ix];
+ }
+ }
+ cout << "dft_map_full:\n" << dft_map_full << "\ndft_map_partial:\n" << dft_map_partial << '\n';
+
+ // (Free function | static method) with (no | arbitrary) params,
+ // map style, no (empty array) defaults
+ addf("free0_map", "free0", &g);
+ work.add(name, desc, free0, LLSD::emptyArray());
+ addf("smethod0_map", "smethod0", &g);
+ work.add(name, desc, &Vars::smethod0, LLSD::emptyArray());
+ addf("freena_map_allreq", "freena", &g);
+ work.add(name, desc, freena, params["a"]);
+ addf("freenb_map_allreq", "freenb", &g);
+ work.add(name, desc, freenb, params["b"]);
+ addf("smethodna_map_allreq", "smethodna", &g);
+ work.add(name, desc, &Vars::smethodna, params["a"]);
+ addf("smethodnb_map_allreq", "smethodnb", &g);
+ work.add(name, desc, &Vars::smethodnb, params["b"]);
+ // Non-static method with (no | arbitrary) params, map style, no
+ // (empty array) defaults
+ addf("method0_map", "method0", &v);
+ work.add(name, desc, &Vars::method0, var(v), LLSD::emptyArray());
+ addf("methodna_map_allreq", "methodna", &v);
+ work.add(name, desc, &Vars::methodna, var(v), params["a"]);
+ addf("methodnb_map_allreq", "methodnb", &v);
+ work.add(name, desc, &Vars::methodnb, var(v), params["b"]);
+
+ // Except for the "more (array | map) defaults than params" error
+ // cases, tested separately below, the (partial | full)(array |
+ // map) defaults cases don't apply to no-params functions/methods.
+ // So eliminate free0, smethod0, method0 from the cases below.
+
+ // (Free function | static method) with arbitrary params, map
+ // style, partial (array | map) defaults
+ addf("freena_map_leftreq", "freena", &g);
+ work.add(name, desc, freena, params["a"], dft_array_partial["a"]);
+ addf("freenb_map_leftreq", "freenb", &g);
+ work.add(name, desc, freenb, params["b"], dft_array_partial["b"]);
+ addf("smethodna_map_leftreq", "smethodna", &g);
+ work.add(name, desc, &Vars::smethodna, params["a"], dft_array_partial["a"]);
+ addf("smethodnb_map_leftreq", "smethodnb", &g);
+ work.add(name, desc, &Vars::smethodnb, params["b"], dft_array_partial["b"]);
+ addf("freena_map_skipreq", "freena", &g);
+ work.add(name, desc, freena, params["a"], dft_map_partial["a"]);
+ addf("freenb_map_skipreq", "freenb", &g);
+ work.add(name, desc, freenb, params["b"], dft_map_partial["b"]);
+ addf("smethodna_map_skipreq", "smethodna", &g);
+ work.add(name, desc, &Vars::smethodna, params["a"], dft_map_partial["a"]);
+ addf("smethodnb_map_skipreq", "smethodnb", &g);
+ work.add(name, desc, &Vars::smethodnb, params["b"], dft_map_partial["b"]);
+ // Non-static method with arbitrary params, map style, partial
+ // (array | map) defaults
+ addf("methodna_map_leftreq", "methodna", &v);
+ work.add(name, desc, &Vars::methodna, var(v), params["a"], dft_array_partial["a"]);
+ addf("methodnb_map_leftreq", "methodnb", &v);
+ work.add(name, desc, &Vars::methodnb, var(v), params["b"], dft_array_partial["b"]);
+ addf("methodna_map_skipreq", "methodna", &v);
+ work.add(name, desc, &Vars::methodna, var(v), params["a"], dft_map_partial["a"]);
+ addf("methodnb_map_skipreq", "methodnb", &v);
+ work.add(name, desc, &Vars::methodnb, var(v), params["b"], dft_map_partial["b"]);
+
+ // (Free function | static method) with arbitrary params, map
+ // style, full (array | map) defaults
+ addf("freena_map_adft", "freena", &g);
+ work.add(name, desc, freena, params["a"], dft_array_full["a"]);
+ addf("freenb_map_adft", "freenb", &g);
+ work.add(name, desc, freenb, params["b"], dft_array_full["b"]);
+ addf("smethodna_map_adft", "smethodna", &g);
+ work.add(name, desc, &Vars::smethodna, params["a"], dft_array_full["a"]);
+ addf("smethodnb_map_adft", "smethodnb", &g);
+ work.add(name, desc, &Vars::smethodnb, params["b"], dft_array_full["b"]);
+ addf("freena_map_mdft", "freena", &g);
+ work.add(name, desc, freena, params["a"], dft_map_full["a"]);
+ addf("freenb_map_mdft", "freenb", &g);
+ work.add(name, desc, freenb, params["b"], dft_map_full["b"]);
+ addf("smethodna_map_mdft", "smethodna", &g);
+ work.add(name, desc, &Vars::smethodna, params["a"], dft_map_full["a"]);
+ addf("smethodnb_map_mdft", "smethodnb", &g);
+ work.add(name, desc, &Vars::smethodnb, params["b"], dft_map_full["b"]);
+ // Non-static method with arbitrary params, map style, full
+ // (array | map) defaults
+ addf("methodna_map_adft", "methodna", &v);
+ work.add(name, desc, &Vars::methodna, var(v), params["a"], dft_array_full["a"]);
+ addf("methodnb_map_adft", "methodnb", &v);
+ work.add(name, desc, &Vars::methodnb, var(v), params["b"], dft_array_full["b"]);
+ addf("methodna_map_mdft", "methodna", &v);
+ work.add(name, desc, &Vars::methodna, var(v), params["a"], dft_map_full["a"]);
+ addf("methodnb_map_mdft", "methodnb", &v);
+ work.add(name, desc, &Vars::methodnb, var(v), params["b"], dft_map_full["b"]);
+
+ // All the above are expected to succeed, and are setup for the
+ // tests to follow. Registration error cases are exercised as
+ // tests rather than as test setup.
+ }
+
+ void addf(const std::string& n, const std::string& d, Vars* v)
+ {
+ // This method is to capture in our own DescMap the name and
+ // description of every registered function, for metadata query
+ // testing.
+ descs[n] = d;
+ // Also capture the Vars instance on which each function should operate.
+ funcvars[n] = v;
+ // See constructor for rationale for setting these instance vars.
+ this->name = n;
+ this->desc = d;
+ }
+
+ void verify_descs()
+ {
+ // Copy descs to a temp map of same type.
+ DescMap forgotten(descs.begin(), descs.end());
+ // LLEventDispatcher intentionally provides only const_iterator:
+ // since dereferencing that iterator generates values on the fly,
+ // it's meaningless to have a modifiable iterator. But since our
+ // 'work' object isn't const, by default BOOST_FOREACH() wants to
+ // use non-const iterators. Persuade it to use the const_iterator.
+ foreach(LLEventDispatcher::NameDesc nd, const_cast<const Dispatcher&>(work))
+ {
+ DescMap::iterator found = forgotten.find(nd.first);
+ ensure(STRINGIZE("LLEventDispatcher records function '" << nd.first
+ << "' we didn't enter"),
+ found != forgotten.end());
+ ensure_equals(STRINGIZE("LLEventDispatcher desc '" << nd.second <<
+ "' doesn't match what we entered: '" << found->second << "'"),
+ nd.second, found->second);
+ // found in our map the name from LLEventDispatcher, good, erase
+ // our map entry
+ forgotten.erase(found);
+ }
+ if (! forgotten.empty())
+ {
+ std::ostringstream out;
+ out << "LLEventDispatcher failed to report";
+ const char* delim = ": ";
+ foreach(const DescMap::value_type& fme, forgotten)
+ {
+ out << delim << fme.first;
+ delim = ", ";
+ }
+ ensure(out.str(), false);
+ }
+ }
+
+ Vars* varsfor(const std::string& name)
+ {
+ VarsMap::const_iterator found = funcvars.find(name);
+ ensure(STRINGIZE("No Vars* for " << name), found != funcvars.end());
+ ensure(STRINGIZE("NULL Vars* for " << name), found->second);
+ return found->second;
+ }
+
+ void ensure_has(const std::string& outer, const std::string& inner)
+ {
+ ensure(STRINGIZE("'" << outer << "' does not contain '" << inner << "'").c_str(),
+ outer.find(inner) != std::string::npos);
+ }
+
+ void call_exc(const std::string& func, const LLSD& args, const std::string& exc_frag)
+ {
+ std::string threw;
+ try
+ {
+ work(func, args);
+ }
+ catch (const std::runtime_error& e)
+ {
+ cout << "*** " << e.what() << '\n';
+ threw = e.what();
+ }
+ ensure_has(threw, exc_frag);
+ }
+
+ LLSD getMetadata(const std::string& name)
+ {
+ LLSD meta(work.getMetadata(name));
+ ensure(STRINGIZE("No metadata for " << name), meta.isDefined());
+ return meta;
+ }
+
+ // From two related LLSD arrays, e.g. a param-names array and a values
+ // array, zip them together into an LLSD map.
+ LLSD zipmap(const LLSD& keys, const LLSD& values)
+ {
+ LLSD map;
+ for (LLSD::Integer i = 0, iend = keys.size(); i < iend; ++i)
+ {
+ // Have to select asString() since you can index an LLSD
+ // object with either String or Integer.
+ map[keys[i].asString()] = values[i];
+ }
+ return map;
+ }
+
+ // If I call this ensure_equals(), it blocks visibility of all other
+ // ensure_equals() overloads. Normally I could say 'using
+ // baseclass::ensure_equals;' and fix that, but I don't know what the
+ // base class is!
+ void ensure_llsd(const std::string& msg, const LLSD& actual, const LLSD& expected, U32 bits)
+ {
+ std::ostringstream out;
+ if (! msg.empty())
+ {
+ out << msg << ": ";
+ }
+ out << "expected " << expected << ", actual " << actual;
+ ensure(out.str(), llsd_equals(actual, expected, bits));
+ }
+
+ void ensure_llsd(const LLSD& actual, const LLSD& expected, U32 bits)
+ {
+ ensure_llsd("", actual, expected, bits);
+ }
+ };
+ typedef test_group<lleventdispatcher_data> lleventdispatcher_group;
+ typedef lleventdispatcher_group::object object;
+ lleventdispatcher_group lleventdispatchergrp("lleventdispatcher");
+
+ // Call cases:
+ // - (try_call | call) (explicit name | event key) (real | bogus) name
+ // - Callable with args that (do | do not) match required
+ // - (Free function | non-static method), no args, (array | map) style
+ // - (Free function | non-static method), arbitrary args,
+ // (array style with (scalar | map) | map style with scalar)
+ // - (Free function | non-static method), arbitrary args, array style with
+ // array (too short | too long | just right)
+ // [trap LL_WARNS for too-long case?]
+ // - (Free function | non-static method), arbitrary args, map style with
+ // (array | map) (all | too many | holes (with | without) defaults)
+ // - const char* param gets ("" | NULL)
+
+ // Query cases:
+ // - Iterate over all (with | without) remove()
+ // - getDispatchKey()
+ // - Callable style (with | without) required
+ // - (Free function | non-static method), array style, (no | arbitrary) params
+ // - (Free function | non-static method), map style, (no | arbitrary) params,
+ // (empty | full | partial (array | map)) defaults
+
+ template<> template<>
+ void object::test<1>()
+ {
+ set_test_name("map-style registration with non-array params");
+ // Pass "param names" as scalar or as map
+ LLSD attempts(LLSDArray(17)(LLSDMap("pi", 3.14)("two", 2)));
+ foreach(LLSD ae, inArray(attempts))
+ {
+ std::string threw;
+ try
+ {
+ work.add("freena_err", "freena", freena, ae);
+ }
+ catch (const std::exception& e)
+ {
+ threw = e.what();
+ }
+ ensure_has(threw, "must be an array");
+ }
+ }
+
+ template<> template<>
+ void object::test<2>()
+ {
+ set_test_name("map-style registration with badly-formed defaults");
+ std::string threw;
+ try
+ {
+ work.add("freena_err", "freena", freena, LLSDArray("a")("b"), 17);
+ }
+ catch (const std::exception& e)
+ {
+ threw = e.what();
+ }
+ ensure_has(threw, "must be a map or an array");
+ }
+
+ template<> template<>
+ void object::test<3>()
+ {
+ set_test_name("map-style registration with too many array defaults");
+ std::string threw;
+ try
+ {
+ work.add("freena_err", "freena", freena,
+ LLSDArray("a")("b"),
+ LLSDArray(17)(0.9)("gack"));
+ }
+ catch (const std::exception& e)
+ {
+ threw = e.what();
+ }
+ ensure_has(threw, "shorter than");
+ }
+
+ template<> template<>
+ void object::test<4>()
+ {
+ set_test_name("map-style registration with too many map defaults");
+ std::string threw;
+ try
+ {
+ work.add("freena_err", "freena", freena,
+ LLSDArray("a")("b"),
+ LLSDMap("b", 17)("foo", 3.14)("bar", "sinister"));
+ }
+ catch (const std::exception& e)
+ {
+ threw = e.what();
+ }
+ ensure_has(threw, "nonexistent params");
+ ensure_has(threw, "foo");
+ ensure_has(threw, "bar");
+ }
+
+ template<> template<>
+ void object::test<5>()
+ {
+ set_test_name("query all");
+ verify_descs();
+ }
+
+ template<> template<>
+ void object::test<6>()
+ {
+ set_test_name("query all with remove()");
+ ensure("remove('bogus') returned true", ! work.remove("bogus"));
+ ensure("remove('real') returned false", work.remove("free1"));
+ // Of course, remove that from 'descs' too...
+ descs.erase("free1");
+ verify_descs();
+ }
+
+ template<> template<>
+ void object::test<7>()
+ {
+ set_test_name("getDispatchKey()");
+ ensure_equals(work.getDispatchKey(), "op");
+ }
+
+ template<> template<>
+ void object::test<8>()
+ {
+ set_test_name("query Callables with/out required params");
+ LLSD names(LLSDArray("free1")("Dmethod1")("Dcmethod1")("method1"));
+ foreach(LLSD nm, inArray(names))
+ {
+ LLSD metadata(getMetadata(nm));
+ ensure_equals("name mismatch", metadata["name"], nm);
+ ensure_equals(metadata["desc"].asString(), descs[nm]);
+ ensure("should not have required structure", metadata["required"].isUndefined());
+ ensure("should not have optional", metadata["optional"].isUndefined());
+
+ std::string name_req(nm.asString() + "_req");
+ metadata = getMetadata(name_req);
+ ensure_equals(metadata["name"].asString(), name_req);
+ ensure_equals(metadata["desc"].asString(), descs[name_req]);
+ ensure_equals("required mismatch", required, metadata["required"]);
+ ensure("should not have optional", metadata["optional"].isUndefined());
+ }
+ }
+
+ template<> template<>
+ void object::test<9>()
+ {
+ set_test_name("query array-style functions/methods");
+ // Associate each registered name with expected arity.
+ LLSD expected(LLSDArray
+ (LLSDArray
+ (0)(LLSDArray("free0_array")("smethod0_array")("method0_array")))
+ (LLSDArray
+ (5)(LLSDArray("freena_array")("smethodna_array")("methodna_array")))
+ (LLSDArray
+ (5)(LLSDArray("freenb_array")("smethodnb_array")("methodnb_array"))));
+ foreach(LLSD ae, inArray(expected))
+ {
+ LLSD::Integer arity(ae[0].asInteger());
+ LLSD names(ae[1]);
+ LLSD req(LLSD::emptyArray());
+ if (arity)
+ req[arity - 1] = LLSD();
+ foreach(LLSD nm, inArray(names))
+ {
+ LLSD metadata(getMetadata(nm));
+ ensure_equals("name mismatch", metadata["name"], nm);
+ ensure_equals(metadata["desc"].asString(), descs[nm]);
+ ensure_equals(STRINGIZE("mismatched required for " << nm.asString()),
+ metadata["required"], req);
+ ensure("should not have optional", metadata["optional"].isUndefined());
+ }
+ }
+ }
+
+ template<> template<>
+ void object::test<10>()
+ {
+ set_test_name("query map-style no-params functions/methods");
+ // - (Free function | non-static method), map style, no params (ergo
+ // no defaults)
+ LLSD names(LLSDArray("free0_map")("smethod0_map")("method0_map"));
+ foreach(LLSD nm, inArray(names))
+ {
+ LLSD metadata(getMetadata(nm));
+ ensure_equals("name mismatch", metadata["name"], nm);
+ ensure_equals(metadata["desc"].asString(), descs[nm]);
+ ensure("should not have required",
+ (metadata["required"].isUndefined() || metadata["required"].size() == 0));
+ ensure("should not have optional", metadata["optional"].isUndefined());
+ }
+ }
+
+ template<> template<>
+ void object::test<11>()
+ {
+ set_test_name("query map-style arbitrary-params functions/methods: "
+ "full array defaults vs. full map defaults");
+ // With functions registered with no defaults ("_allreq" suffixes),
+ // there is of course no difference between array defaults and map
+ // defaults. (We don't even bother registering with LLSD::emptyArray()
+ // vs. LLSD::emptyMap().) With functions registered with all defaults,
+ // there should (!) be no difference beween array defaults and map
+ // defaults. Verify, so we can ignore the distinction for all other
+ // tests.
+ LLSD equivalences(LLSDArray
+ (LLSDArray("freena_map_adft")("freena_map_mdft"))
+ (LLSDArray("freenb_map_adft")("freenb_map_mdft"))
+ (LLSDArray("smethodna_map_adft")("smethodna_map_mdft"))
+ (LLSDArray("smethodnb_map_adft")("smethodnb_map_mdft"))
+ (LLSDArray("methodna_map_adft")("methodna_map_mdft"))
+ (LLSDArray("methodnb_map_adft")("methodnb_map_mdft")));
+ foreach(LLSD eq, inArray(equivalences))
+ {
+ LLSD adft(eq[0]);
+ LLSD mdft(eq[1]);
+ // We can't just compare the results of the two getMetadata()
+ // calls, because they contain ["name"], which are different. So
+ // capture them, verify that each ["name"] is as expected, then
+ // remove for comparing the rest.
+ LLSD ameta(getMetadata(adft));
+ LLSD mmeta(getMetadata(mdft));
+ ensure_equals("adft name", adft, ameta["name"]);
+ ensure_equals("mdft name", mdft, mmeta["name"]);
+ ameta.erase("name");
+ mmeta.erase("name");
+ ensure_equals(STRINGIZE("metadata for " << adft.asString()
+ << " vs. " << mdft.asString()),
+ ameta, mmeta);
+ }
+ }
+
+ template<> template<>
+ void object::test<12>()
+ {
+ set_test_name("query map-style arbitrary-params functions/methods");
+ // - (Free function | non-static method), map style, arbitrary params,
+ // (empty | full | partial (array | map)) defaults
+
+ // Generate maps containing all parameter names for cases in which all
+ // params are required. Also maps containing left requirements for
+ // partial defaults arrays. Also defaults maps from defaults arrays.
+ LLSD allreq, leftreq, rightdft;
+ foreach(LLSD::String a, ab)
+ {
+ // The map in which all params are required uses params[a] as
+ // keys, with all isUndefined() as values. We can accomplish that
+ // by passing zipmap() an empty values array.
+ allreq[a] = zipmap(params[a], LLSD::emptyArray());
+ // Same for leftreq, save that we use the subset of the params not
+ // supplied by dft_array_partial[a].
+ LLSD::Integer partition(params[a].size() - dft_array_partial[a].size());
+ leftreq[a] = zipmap(llsd_copy_array(params[a].beginArray(),
+ params[a].beginArray() + partition),
+ LLSD::emptyArray());
+ // Generate map pairing dft_array_partial[a] values with their
+ // param names.
+ rightdft[a] = zipmap(llsd_copy_array(params[a].beginArray() + partition,
+ params[a].endArray()),
+ dft_array_partial[a]);
+ }
+ cout << "allreq:\n" << allreq << "\nleftreq:\n" << leftreq << "\nrightdft:\n" << rightdft << std::endl;
+
+ // Generate maps containing parameter names not provided by the
+ // dft_map_partial maps.
+ LLSD skipreq(allreq);
+ foreach(LLSD::String a, ab)
+ {
+ foreach(const MapEntry& me, inMap(dft_map_partial[a]))
+ {
+ skipreq[a].erase(me.first);
+ }
+ }
+ cout << "skipreq:\n" << skipreq << std::endl;
+
+ LLSD groups(LLSDArray // array of groups
+
+ (LLSDArray // group
+ (LLSDArray("freena_map_allreq")("smethodna_map_allreq")("methodna_map_allreq"))
+ (LLSDArray(allreq["a"])(LLSD()))) // required, optional
+
+ (LLSDArray // group
+ (LLSDArray("freenb_map_allreq")("smethodnb_map_allreq")("methodnb_map_allreq"))
+ (LLSDArray(allreq["b"])(LLSD()))) // required, optional
+
+ (LLSDArray // group
+ (LLSDArray("freena_map_leftreq")("smethodna_map_leftreq")("methodna_map_leftreq"))
+ (LLSDArray(leftreq["a"])(rightdft["a"]))) // required, optional
+
+ (LLSDArray // group
+ (LLSDArray("freenb_map_leftreq")("smethodnb_map_leftreq")("methodnb_map_leftreq"))
+ (LLSDArray(leftreq["b"])(rightdft["b"]))) // required, optional
+
+ (LLSDArray // group
+ (LLSDArray("freena_map_skipreq")("smethodna_map_skipreq")("methodna_map_skipreq"))
+ (LLSDArray(skipreq["a"])(dft_map_partial["a"]))) // required, optional
+
+ (LLSDArray // group
+ (LLSDArray("freenb_map_skipreq")("smethodnb_map_skipreq")("methodnb_map_skipreq"))
+ (LLSDArray(skipreq["b"])(dft_map_partial["b"]))) // required, optional
+
+ // We only need mention the full-map-defaults ("_mdft" suffix)
+ // registrations, having established their equivalence with the
+ // full-array-defaults ("_adft" suffix) registrations in another test.
+ (LLSDArray // group
+ (LLSDArray("freena_map_mdft")("smethodna_map_mdft")("methodna_map_mdft"))
+ (LLSDArray(LLSD::emptyMap())(dft_map_full["a"]))) // required, optional
+
+ (LLSDArray // group
+ (LLSDArray("freenb_map_mdft")("smethodnb_map_mdft")("methodnb_map_mdft"))
+ (LLSDArray(LLSD::emptyMap())(dft_map_full["b"])))); // required, optional
+
+ foreach(LLSD grp, inArray(groups))
+ {
+ // Internal structure of each group in 'groups':
+ LLSD names(grp[0]);
+ LLSD required(grp[1][0]);
+ LLSD optional(grp[1][1]);
+ cout << "For " << names << ",\n" << "required:\n" << required << "\noptional:\n" << optional << std::endl;
+
+ // Loop through 'names'
+ foreach(LLSD nm, inArray(names))
+ {
+ LLSD metadata(getMetadata(nm));
+ ensure_equals("name mismatch", metadata["name"], nm);
+ ensure_equals(nm.asString(), metadata["desc"].asString(), descs[nm]);
+ ensure_equals(STRINGIZE(nm << " required mismatch"),
+ metadata["required"], required);
+ ensure_equals(STRINGIZE(nm << " optional mismatch"),
+ metadata["optional"], optional);
+ }
+ }
+ }
+
+ template<> template<>
+ void object::test<13>()
+ {
+ set_test_name("try_call()");
+ ensure("try_call(bogus name, LLSD()) returned true", ! work.try_call("freek", LLSD()));
+ ensure("try_call(bogus name) returned true", ! work.try_call(LLSDMap("op", "freek")));
+ ensure("try_call(real name, LLSD()) returned false", work.try_call("free0_array", LLSD()));
+ ensure("try_call(real name) returned false", work.try_call(LLSDMap("op", "free0_map")));
+ }
+
+ template<> template<>
+ void object::test<14>()
+ {
+ set_test_name("call with bad name");
+ call_exc("freek", LLSD(), "not found");
+ // We don't have a comparable helper function for the one-arg
+ // operator() method, and it's not worth building one just for this
+ // case. Write it out.
+ std::string threw;
+ try
+ {
+ work(LLSDMap("op", "freek"));
+ }
+ catch (const std::runtime_error& e)
+ {
+ cout << "*** " << e.what() << "\n";
+ threw = e.what();
+ }
+ ensure_has(threw, "bad");
+ ensure_has(threw, "op");
+ ensure_has(threw, "freek");
+ }
+
+ template<> template<>
+ void object::test<15>()
+ {
+ set_test_name("call with event key");
+ // We don't need a separate test for operator()(string, LLSD) with
+ // valid name, because all the rest of the tests exercise that case.
+ // The one we don't exercise elsewhere is operator()(LLSD) with valid
+ // name, so here it is.
+ work(LLSDMap("op", "free0_map"));
+ ensure_equals(g.i, 17);
+ }
+
+ // Cannot be defined inside function body... remind me again why we use C++... :-P
+ struct CallablesTriple
+ {
+ std::string name, name_req;
+ LLSD& llsd;
+ };
+
+ template<> template<>
+ void object::test<16>()
+ {
+ set_test_name("call Callables");
+ CallablesTriple tests[] =
+ {
+ { "free1", "free1_req", g.llsd },
+ { "Dmethod1", "Dmethod1_req", work.llsd },
+ { "Dcmethod1", "Dcmethod1_req", work.llsd },
+ { "method1", "method1_req", v.llsd }
+ };
+ // Arbitrary LLSD value that we should be able to pass to Callables
+ // without 'required', but should not be able to pass to Callables
+ // with 'required'.
+ LLSD answer(42);
+ // LLSD value matching 'required' according to llsd_matches() rules.
+ LLSD matching(LLSDMap("d", 3.14)("array", LLSDArray("answer")(true)(answer)));
+ // Okay, walk through 'tests'.
+ foreach(const CallablesTriple& tr, tests)
+ {
+ // Should be able to pass 'answer' to Callables registered
+ // without 'required'.
+ work(tr.name, answer);
+ ensure_equals("answer mismatch", tr.llsd, answer);
+ // Should NOT be able to pass 'answer' to Callables registered
+ // with 'required'.
+ call_exc(tr.name_req, answer, "bad request");
+ // But SHOULD be able to pass 'matching' to Callables registered
+ // with 'required'.
+ work(tr.name_req, matching);
+ ensure_equals("matching mismatch", tr.llsd, matching);
+ }
+ }
+
+ template<> template<>
+ void object::test<17>()
+ {
+ set_test_name("passing wrong args to (map | array)-style registrations");
+
+ // Pass scalar/map to array-style functions, scalar/array to map-style
+ // functions. As that validation happens well before we engage the
+ // argument magic, it seems pointless to repeat this with every
+ // variation: (free function | non-static method), (no | arbitrary)
+ // args. We should only need to engage it for one map-style
+ // registration and one array-style registration.
+ std::string array_exc("needs an args array");
+ call_exc("free0_array", 17, array_exc);
+ call_exc("free0_array", LLSDMap("pi", 3.14), array_exc);
+
+ std::string map_exc("needs a map");
+ call_exc("free0_map", 17, map_exc);
+ // Passing an array to a map-style function works now! No longer an
+ // error case!
+// call_exc("free0_map", LLSDArray("a")("b"), map_exc);
+ }
+
+ template<> template<>
+ void object::test<18>()
+ {
+ set_test_name("call no-args functions");
+ LLSD names(LLSDArray
+ ("free0_array")("free0_map")
+ ("smethod0_array")("smethod0_map")
+ ("method0_array")("method0_map"));
+ foreach(LLSD name, inArray(names))
+ {
+ // Look up the Vars instance for this function.
+ Vars* vars(varsfor(name));
+ // Both the global and stack Vars instances are automatically
+ // cleared at the start of each test<n> method. But since we're
+ // calling these things several different times in the same
+ // test<n> method, manually reset the Vars between each.
+ *vars = Vars();
+ ensure_equals(vars->i, 0);
+ // call function with empty array (or LLSD(), should be equivalent)
+ work(name, LLSD());
+ ensure_equals(vars->i, 17);
+ }
+ }
+
+ // Break out this data because we use it in a couple different tests.
+ LLSD array_funcs(LLSDArray
+ (LLSDMap("a", "freena_array") ("b", "freenb_array"))
+ (LLSDMap("a", "smethodna_array")("b", "smethodnb_array"))
+ (LLSDMap("a", "methodna_array") ("b", "methodnb_array")));
+
+ template<> template<>
+ void object::test<19>()
+ {
+ set_test_name("call array-style functions with too-short arrays");
+ // Could have two different too-short arrays, one for *na and one for
+ // *nb, but since they both take 5 params...
+ LLSD tooshort(LLSDArray("this")("array")("too")("short"));
+ foreach(const LLSD& funcsab, inArray(array_funcs))
+ {
+ foreach(const llsd::MapEntry& e, inMap(funcsab))
+ {
+ call_exc(e.second, tooshort, "requires more arguments");
+ }
+ }
+ }
+
+ template<> template<>
+ void object::test<20>()
+ {
+ set_test_name("call array-style functions with (just right | too long) arrays");
+ std::vector<U8> binary;
+ for (size_t h(0x01), i(0); i < 5; h+= 0x22, ++i)
+ {
+ binary.push_back(h);
+ }
+ LLSD args(LLSDMap("a", LLSDArray(true)(17)(3.14)(123.456)("char*"))
+ ("b", LLSDArray("string")
+ (LLUUID("01234567-89ab-cdef-0123-456789abcdef"))
+ (LLDate("2011-02-03T15:07:00Z"))
+ (LLURI("http://secondlife.com"))
+ (binary)));
+ LLSD argsplus(args);
+ argsplus["a"].append("bogus");
+ argsplus["b"].append("bogus");
+ LLSD expect;
+ foreach(LLSD::String a, ab)
+ {
+ expect[a] = zipmap(params[a], args[a]);
+ }
+ // Adjust expect["a"]["cp"] for special Vars::cp treatment.
+ expect["a"]["cp"] = std::string("'") + expect["a"]["cp"].asString() + "'";
+ cout << "expect: " << expect << '\n';
+
+ // Use substantially the same logic for args and argsplus
+ LLSD argsarrays(LLSDArray(args)(argsplus));
+ // So i==0 selects 'args', i==1 selects argsplus
+ for (LLSD::Integer i(0), iend(argsarrays.size()); i < iend; ++i)
+ {
+ foreach(const LLSD& funcsab, inArray(array_funcs))
+ {
+ foreach(LLSD::String a, ab)
+ {
+ // Reset the Vars instance before each call
+ Vars* vars(varsfor(funcsab[a]));
+ *vars = Vars();
+ work(funcsab[a], argsarrays[i][a]);
+ ensure_llsd(STRINGIZE(funcsab[a].asString() <<
+ ": expect[\"" << a << "\"] mismatch"),
+ vars->inspect(), expect[a], 7); // 7 bits ~= 2 decimal digits
+
+ // TODO: in the i==1 or argsplus case, intercept LL_WARNS
+ // output? Even without that, using argsplus verifies that
+ // passing too many args isn't fatal; it works -- but
+ // would be nice to notice the warning too.
+ }
+ }
+ }
+ }
+
+ template<> template<>
+ void object::test<21>()
+ {
+ set_test_name("verify that passing LLSD() to const char* sends NULL");
+
+ ensure_equals("Vars::cp init", v.cp, "");
+ work("methodna_map_mdft", LLSDMap("cp", LLSD()));
+ ensure_equals("passing LLSD()", v.cp, "NULL");
+ work("methodna_map_mdft", LLSDMap("cp", ""));
+ ensure_equals("passing \"\"", v.cp, "''");
+ work("methodna_map_mdft", LLSDMap("cp", "non-NULL"));
+ ensure_equals("passing \"non-NULL\"", v.cp, "'non-NULL'");
+ }
+
+ template<> template<>
+ void object::test<22>()
+ {
+ set_test_name("call map-style functions with (full | oversized) (arrays | maps)");
+ const char binary[] = "\x99\x88\x77\x66\x55";
+ LLSD array_full(LLSDMap
+ ("a", LLSDArray(false)(255)(98.6)(1024.5)("pointer"))
+ ("b", LLSDArray("object")(LLUUID::generateNewID())(LLDate::now())(LLURI("http://wiki.lindenlab.com/wiki"))(LLSD::Binary(boost::begin(binary), boost::end(binary)))));
+ LLSD array_overfull(array_full);
+ foreach(LLSD::String a, ab)
+ {
+ array_overfull[a].append("bogus");
+ }
+ cout << "array_full: " << array_full << "\narray_overfull: " << array_overfull << std::endl;
+ // We rather hope that LLDate::now() will generate a timestamp
+ // distinct from the one it generated in the constructor, moments ago.
+ ensure_not_equals("Timestamps too close",
+ array_full["b"][2].asDate(), dft_array_full["b"][2].asDate());
+ // We /insist/ that LLUUID::generateNewID() do so.
+ ensure_not_equals("UUID collision",
+ array_full["b"][1].asUUID(), dft_array_full["b"][1].asUUID());
+ LLSD map_full, map_overfull;
+ foreach(LLSD::String a, ab)
+ {
+ map_full[a] = zipmap(params[a], array_full[a]);
+ map_overfull[a] = map_full[a];
+ map_overfull[a]["extra"] = "ignore";
+ }
+ cout << "map_full: " << map_full << "\nmap_overfull: " << map_overfull << std::endl;
+ LLSD expect(map_full);
+ // Twiddle the const char* param.
+ expect["a"]["cp"] = std::string("'") + expect["a"]["cp"].asString() + "'";
+ // Another adjustment. For each data type, we're trying to distinguish
+ // three values: the Vars member's initial value (member wasn't
+ // stored; control never reached the set function), the registered
+ // default param value from dft_array_full, and the array_full value
+ // in this test. But bool can only distinguish two values. In this
+ // case, we want to differentiate the local array_full value from the
+ // dft_array_full value, so we use 'false'. However, that means
+ // Vars::inspect() doesn't differentiate it from the initial value,
+ // so won't bother returning it. Predict that behavior to match the
+ // LLSD values.
+ expect["a"].erase("b");
+ cout << "expect: " << expect << std::endl;
+ // For this test, calling functions registered with different sets of
+ // parameter defaults should make NO DIFFERENCE WHATSOEVER. Every call
+ // should pass all params.
+ LLSD names(LLSDMap
+ ("a", LLSDArray
+ ("freena_map_allreq") ("smethodna_map_allreq") ("methodna_map_allreq")
+ ("freena_map_leftreq")("smethodna_map_leftreq")("methodna_map_leftreq")
+ ("freena_map_skipreq")("smethodna_map_skipreq")("methodna_map_skipreq")
+ ("freena_map_adft") ("smethodna_map_adft") ("methodna_map_adft")
+ ("freena_map_mdft") ("smethodna_map_mdft") ("methodna_map_mdft"))
+ ("b", LLSDArray
+ ("freenb_map_allreq") ("smethodnb_map_allreq") ("methodnb_map_allreq")
+ ("freenb_map_leftreq")("smethodnb_map_leftreq")("methodnb_map_leftreq")
+ ("freenb_map_skipreq")("smethodnb_map_skipreq")("methodnb_map_skipreq")
+ ("freenb_map_adft") ("smethodnb_map_adft") ("methodnb_map_adft")
+ ("freenb_map_mdft") ("smethodnb_map_mdft") ("methodnb_map_mdft")));
+ // Treat (full | overfull) (array | map) the same.
+ LLSD argssets(LLSDArray(array_full)(array_overfull)(map_full)(map_overfull));
+ foreach(const LLSD& args, inArray(argssets))
+ {
+ foreach(LLSD::String a, ab)
+ {
+ foreach(LLSD::String name, inArray(names[a]))
+ {
+ // Reset the Vars instance
+ Vars* vars(varsfor(name));
+ *vars = Vars();
+ work(name, args[a]);
+ ensure_llsd(STRINGIZE(name << ": expect[\"" << a << "\"] mismatch"),
+ vars->inspect(), expect[a], 7); // 7 bits, 2 decimal digits
+ // intercept LL_WARNS for the two overfull cases?
+ }
+ }
+ }
+ }
+} // namespace tut
diff --git a/indra/llcommon/tests/llinstancetracker_test.cpp b/indra/llcommon/tests/llinstancetracker_test.cpp
index c7cb488ca1..b34d1c5fd3 100644
--- a/indra/llcommon/tests/llinstancetracker_test.cpp
+++ b/indra/llcommon/tests/llinstancetracker_test.cpp
@@ -40,6 +40,7 @@
#include <boost/scoped_ptr.hpp>
// other Linden headers
#include "../test/lltut.h"
+#include "wrapllerrs.h"
struct Keyed: public LLInstanceTracker<Keyed, std::string>
{
@@ -151,33 +152,81 @@ namespace tut
{
Unkeyed one, two, three;
typedef std::set<Unkeyed*> KeySet;
- KeySet keys;
- keys.insert(&one);
- keys.insert(&two);
- keys.insert(&three);
- {
- Unkeyed::LLInstanceTrackerScopedGuard guard;
- for (Unkeyed::key_iter ki(guard.beginKeys()), kend(guard.endKeys());
- ki != kend; ++ki)
- {
- ensure_equals("spurious key", keys.erase(*ki), 1);
- }
- }
- ensure_equals("unreported key", keys.size(), 0);
-
+
KeySet instances;
instances.insert(&one);
instances.insert(&two);
instances.insert(&three);
- {
- Unkeyed::LLInstanceTrackerScopedGuard guard;
- for (Unkeyed::instance_iter ii(guard.beginInstances()), iend(guard.endInstances());
- ii != iend; ++ii)
+
+ for (Unkeyed::instance_iter ii(Unkeyed::beginInstances()), iend(Unkeyed::endInstances()); ii != iend; ++ii)
{
Unkeyed& ref = *ii;
ensure_equals("spurious instance", instances.erase(&ref), 1);
}
- }
+
ensure_equals("unreported instance", instances.size(), 0);
}
+
+ template<> template<>
+ void object::test<5>()
+ {
+ set_test_name("delete Keyed with outstanding instance_iter");
+ std::string what;
+ Keyed* keyed = new Keyed("one");
+ {
+ WrapLL_ERRS wrapper;
+ Keyed::instance_iter i(Keyed::beginInstances());
+ try
+ {
+ delete keyed;
+ }
+ catch (const WrapLL_ERRS::FatalException& e)
+ {
+ what = e.what();
+ }
+ }
+ ensure(! what.empty());
+ }
+
+ template<> template<>
+ void object::test<6>()
+ {
+ set_test_name("delete Keyed with outstanding key_iter");
+ std::string what;
+ Keyed* keyed = new Keyed("one");
+ {
+ WrapLL_ERRS wrapper;
+ Keyed::key_iter i(Keyed::beginKeys());
+ try
+ {
+ delete keyed;
+ }
+ catch (const WrapLL_ERRS::FatalException& e)
+ {
+ what = e.what();
+ }
+ }
+ ensure(! what.empty());
+ }
+
+ template<> template<>
+ void object::test<7>()
+ {
+ set_test_name("delete Unkeyed with outstanding instance_iter");
+ std::string what;
+ Unkeyed* unkeyed = new Unkeyed;
+ {
+ WrapLL_ERRS wrapper;
+ Unkeyed::instance_iter i(Unkeyed::beginInstances());
+ try
+ {
+ delete unkeyed;
+ }
+ catch (const WrapLL_ERRS::FatalException& e)
+ {
+ what = e.what();
+ }
+ }
+ ensure(! what.empty());
+ }
} // namespace tut
diff --git a/indra/llcommon/tests/llsdserialize_test.cpp b/indra/llcommon/tests/llsdserialize_test.cpp
index 770443da1d..72322c3b72 100644
--- a/indra/llcommon/tests/llsdserialize_test.cpp
+++ b/indra/llcommon/tests/llsdserialize_test.cpp
@@ -25,35 +25,293 @@
* $/LicenseInfo$
*/
-#if !LL_WINDOWS
+
+#include "linden_common.h"
+
+#if LL_WINDOWS
+#include <winsock2.h>
+typedef U32 uint32_t;
+#include <process.h>
+#include <io.h>
+#else
+#include <unistd.h>
#include <netinet/in.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+#include "llprocesslauncher.h"
#endif
-#include "linden_common.h"
+#include <sstream>
+
+/*==========================================================================*|
+// Whoops, seems Linden's Boost package and the viewer are built with
+// different settings of VC's /Zc:wchar_t switch! Using Boost.Filesystem
+// pathname operations produces Windows link errors:
+// unresolved external symbol "private: static class std::codecvt<unsigned short,
+// char,int> const * & __cdecl boost::filesystem3::path::wchar_t_codecvt_facet()"
+// unresolved external symbol "void __cdecl boost::filesystem3::path_traits::convert()"
+// See:
+// http://boost.2283326.n4.nabble.com/filesystem-v3-unicode-and-std-codecvt-linker-error-td3455549.html
+// which points to:
+// http://msdn.microsoft.com/en-us/library/dh8che7s%28v=VS.100%29.aspx
+
+// As we're not trying to preserve compatibility with old Boost.Filesystem
+// code, but rather writing brand-new code, use the newest available
+// Filesystem API.
+#define BOOST_FILESYSTEM_VERSION 3
+#include "boost/filesystem.hpp"
+#include "boost/filesystem/v3/fstream.hpp"
+|*==========================================================================*/
+#include "boost/range.hpp"
+#include "boost/foreach.hpp"
+#include "boost/function.hpp"
+#include "boost/lambda/lambda.hpp"
+#include "boost/lambda/bind.hpp"
+namespace lambda = boost::lambda;
+/*==========================================================================*|
+// Aaaarrgh, Linden's Boost package doesn't even include Boost.Iostreams!
+#include "boost/iostreams/stream.hpp"
+#include "boost/iostreams/device/file_descriptor.hpp"
+|*==========================================================================*/
+
#include "../llsd.h"
#include "../llsdserialize.h"
+#include "llsdutil.h"
#include "../llformat.h"
#include "../test/lltut.h"
+#include "stringize.h"
+std::vector<U8> string_to_vector(const std::string& str)
+{
+ return std::vector<U8>(str.begin(), str.end());
+}
-#if LL_WINDOWS
-#include <winsock2.h>
-typedef U32 uint32_t;
-#endif
+#if ! LL_WINDOWS
+// We want to call strerror_r(), but alarmingly, there are two different
+// variants. The one that returns int always populates the passed buffer
+// (except in case of error), whereas the other one always returns a valid
+// char* but might or might not populate the passed buffer. How do we know
+// which one we're getting? Define adapters for each and let the compiler
+// select the applicable adapter.
-std::vector<U8> string_to_vector(std::string str)
+// strerror_r() returns char*
+std::string message_from(int /*orig_errno*/, const char* /*buffer*/, const char* strerror_ret)
{
- // bc LLSD can't...
- size_t len = (size_t)str.length();
- std::vector<U8> v(len);
- for (size_t i = 0; i < len ; i++)
- {
- v[i] = str[i];
- }
- return v;
+ return strerror_ret;
}
+// strerror_r() returns int
+std::string message_from(int orig_errno, const char* buffer, int strerror_ret)
+{
+ if (strerror_ret == 0)
+ {
+ return buffer;
+ }
+ // Here strerror_r() has set errno. Since strerror_r() has already failed,
+ // seems like a poor bet to call it again to diagnose its own error...
+ int stre_errno = errno;
+ if (stre_errno == ERANGE)
+ {
+ return STRINGIZE("strerror_r() can't explain errno " << orig_errno
+ << " (buffer too small)");
+ }
+ if (stre_errno == EINVAL)
+ {
+ return STRINGIZE("unknown errno " << orig_errno);
+ }
+ // Here we don't even understand the errno from strerror_r()!
+ return STRINGIZE("strerror_r() can't explain errno " << orig_errno
+ << " (error " << stre_errno << ')');
+}
+#endif // ! LL_WINDOWS
+
+// boost::filesystem::temp_directory_path() isn't yet in Boost 1.45! :-(
+std::string temp_directory_path()
+{
+#if LL_WINDOWS
+ char buffer[4096];
+ GetTempPathA(sizeof(buffer), buffer);
+ return buffer;
+
+#else // LL_DARWIN, LL_LINUX
+ static const char* vars[] = { "TMPDIR", "TMP", "TEMP", "TEMPDIR" };
+ BOOST_FOREACH(const char* var, vars)
+ {
+ const char* found = getenv(var);
+ if (found)
+ return found;
+ }
+ return "/tmp";
+#endif // LL_DARWIN, LL_LINUX
+}
+
+// Windows presents a kinda sorta compatibility layer. Code to the yucky
+// Windows names because they're less likely than the Posix names to collide
+// with any other names in this source.
+#if LL_WINDOWS
+#define _remove DeleteFileA
+#else // ! LL_WINDOWS
+#define _open open
+#define _write write
+#define _close close
+#define _remove remove
+#endif // ! LL_WINDOWS
+
+// Create a text file with specified content "somewhere in the
+// filesystem," cleaning up when it goes out of scope.
+class NamedTempFile
+{
+public:
+ // Function that accepts an ostream ref and (presumably) writes stuff to
+ // it, e.g.:
+ // (lambda::_1 << "the value is " << 17 << '\n')
+ typedef boost::function<void(std::ostream&)> Streamer;
+
+ NamedTempFile(const std::string& ext, const std::string& content):
+ mPath(temp_directory_path())
+ {
+ createFile(ext, lambda::_1 << content);
+ }
+
+ // Disambiguate when passing string literal
+ NamedTempFile(const std::string& ext, const char* content):
+ mPath(temp_directory_path())
+ {
+ createFile(ext, lambda::_1 << content);
+ }
+
+ NamedTempFile(const std::string& ext, const Streamer& func):
+ mPath(temp_directory_path())
+ {
+ createFile(ext, func);
+ }
+
+ ~NamedTempFile()
+ {
+ _remove(mPath.c_str());
+ }
+
+ std::string getName() const { return mPath; }
+
+private:
+ void createFile(const std::string& ext, const Streamer& func)
+ {
+ // Silly maybe, but use 'ext' as the name prefix. Strip off a leading
+ // '.' if present.
+ int pfx_offset = ((! ext.empty()) && ext[0] == '.')? 1 : 0;
+
+#if ! LL_WINDOWS
+ // Make sure mPath ends with a directory separator, if it doesn't already.
+ if (mPath.empty() ||
+ ! (mPath[mPath.length() - 1] == '\\' || mPath[mPath.length() - 1] == '/'))
+ {
+ mPath.append("/");
+ }
+
+ // mkstemp() accepts and modifies a char* template string. Generate
+ // the template string, then copy to modifiable storage.
+ // mkstemp() requires its template string to end in six X's.
+ mPath += ext.substr(pfx_offset) + "XXXXXX";
+ // Copy to vector<char>
+ std::vector<char> pathtemplate(mPath.begin(), mPath.end());
+ // append a nul byte for classic-C semantics
+ pathtemplate.push_back('\0');
+ // std::vector promises that a pointer to the 0th element is the same
+ // as a pointer to a contiguous classic-C array
+ int fd(mkstemp(&pathtemplate[0]));
+ if (fd == -1)
+ {
+ // The documented errno values (http://linux.die.net/man/3/mkstemp)
+ // are used in a somewhat unusual way, so provide context-specific
+ // errors.
+ if (errno == EEXIST)
+ {
+ LL_ERRS("NamedTempFile") << "mkstemp(\"" << mPath
+ << "\") could not create unique file " << LL_ENDL;
+ }
+ if (errno == EINVAL)
+ {
+ LL_ERRS("NamedTempFile") << "bad mkstemp() file path template '"
+ << mPath << "'" << LL_ENDL;
+ }
+ // Shrug, something else
+ int mkst_errno = errno;
+ char buffer[256];
+ LL_ERRS("NamedTempFile") << "mkstemp(\"" << mPath << "\") failed: "
+ << message_from(mkst_errno, buffer,
+ strerror_r(mkst_errno, buffer, sizeof(buffer)))
+ << LL_ENDL;
+ }
+ // mkstemp() seems to have worked! Capture the modified filename.
+ // Avoid the nul byte we appended.
+ mPath.assign(pathtemplate.begin(), (pathtemplate.end()-1));
+
+/*==========================================================================*|
+ // Define an ostream on the open fd. Tell it to close fd on destruction.
+ boost::iostreams::stream<boost::iostreams::file_descriptor_sink>
+ out(fd, boost::iostreams::close_handle);
+|*==========================================================================*/
+
+ // Write desired content.
+ std::ostringstream out;
+ // Stream stuff to it.
+ func(out);
+
+ std::string data(out.str());
+ int written(_write(fd, data.c_str(), data.length()));
+ int closed(_close(fd));
+ llassert_always(written == data.length() && closed == 0);
+
+#else // LL_WINDOWS
+ // GetTempFileName() is documented to require a MAX_PATH buffer.
+ char tempname[MAX_PATH];
+ // Use 'ext' as filename prefix, but skip leading '.' if any.
+ // The 0 param is very important: requests iterating until we get a
+ // unique name.
+ if (0 == GetTempFileNameA(mPath.c_str(), ext.c_str() + pfx_offset, 0, tempname))
+ {
+ // I always have to look up this call... :-P
+ LPSTR msgptr;
+ FormatMessageA(
+ FORMAT_MESSAGE_ALLOCATE_BUFFER |
+ FORMAT_MESSAGE_FROM_SYSTEM |
+ FORMAT_MESSAGE_IGNORE_INSERTS,
+ NULL,
+ GetLastError(),
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+ LPSTR(&msgptr), // have to cast (char**) to (char*)
+ 0, NULL );
+ LL_ERRS("NamedTempFile") << "GetTempFileName(\"" << mPath << "\", \""
+ << (ext.c_str() + pfx_offset) << "\") failed: "
+ << msgptr << LL_ENDL;
+ LocalFree(msgptr);
+ }
+ // GetTempFileName() appears to have worked! Capture the actual
+ // filename.
+ mPath = tempname;
+ // Open the file and stream content to it. Destructor will close.
+ std::ofstream out(tempname);
+ func(out);
+
+#endif // LL_WINDOWS
+ }
+
+ void peep()
+ {
+ std::cout << "File '" << mPath << "' contains:\n";
+ std::ifstream reader(mPath.c_str());
+ std::string line;
+ while (std::getline(reader, line))
+ std::cout << line << '\n';
+ std::cout << "---\n";
+ }
+
+ std::string mPath;
+};
+
namespace tut
{
struct sd_xml_data
@@ -452,7 +710,7 @@ namespace tut
checkRoundTrip(msg + " nested arrays", v);
v = LLSD::emptyMap();
- fillmap(v, 10, 6); // 10^6 maps
+ fillmap(v, 10, 3); // 10^6 maps
checkRoundTrip(msg + " many nested maps", v);
}
@@ -1494,5 +1752,223 @@ namespace tut
ensureBinaryAndNotation("map", test);
ensureBinaryAndXML("map", test);
}
-}
+ struct TestPythonCompatible
+ {
+ TestPythonCompatible():
+ // Note the peculiar insertion of __FILE__ into this string. Since
+ // this script is being written into a platform-dependent temp
+ // directory, we can't locate indra/lib/python relative to
+ // Python's __file__. Use __FILE__ instead, navigating relative
+ // to this C++ source file. Use Python raw-string syntax so
+ // Windows pathname backslashes won't mislead Python's string
+ // scanner.
+ import_llsd("import os.path\n"
+ "import sys\n"
+ "sys.path.insert(0,\n"
+ " os.path.join(os.path.dirname(r'" __FILE__ "'),\n"
+ " os.pardir, os.pardir, 'lib', 'python'))\n"
+ "try:\n"
+ " from llbase import llsd\n"
+ "except ImportError:\n"
+ " from indra.base import llsd\n")
+ {}
+ ~TestPythonCompatible() {}
+
+ std::string import_llsd;
+
+ template <typename CONTENT>
+ void python(const std::string& desc, const CONTENT& script, int expect=0)
+ {
+ const char* PYTHON(getenv("PYTHON"));
+ ensure("Set $PYTHON to the Python interpreter", PYTHON);
+
+ NamedTempFile scriptfile(".py", script);
+
+#if LL_WINDOWS
+ std::string q("\"");
+ std::string qPYTHON(q + PYTHON + q);
+ std::string qscript(q + scriptfile.getName() + q);
+ int rc = _spawnl(_P_WAIT, PYTHON, qPYTHON.c_str(), qscript.c_str(), NULL);
+ if (rc == -1)
+ {
+ char buffer[256];
+ strerror_s(buffer, errno); // C++ can infer the buffer size! :-O
+ ensure(STRINGIZE("Couldn't run Python " << desc << "script: " << buffer), false);
+ }
+ else
+ {
+ ensure_equals(STRINGIZE(desc << " script terminated with rc " << rc), rc, expect);
+ }
+
+#else // LL_DARWIN, LL_LINUX
+ LLProcessLauncher py;
+ py.setExecutable(PYTHON);
+ py.addArgument(scriptfile.getName());
+ ensure_equals(STRINGIZE("Couldn't launch " << desc << " script"), py.launch(), 0);
+ // Implementing timeout would mean messing with alarm() and
+ // catching SIGALRM... later maybe...
+ int status(0);
+ if (waitpid(py.getProcessID(), &status, 0) == -1)
+ {
+ int waitpid_errno(errno);
+ ensure_equals(STRINGIZE("Couldn't retrieve rc from " << desc << " script: "
+ "waitpid() errno " << waitpid_errno),
+ waitpid_errno, ECHILD);
+ }
+ else
+ {
+ if (WIFEXITED(status))
+ {
+ int rc(WEXITSTATUS(status));
+ ensure_equals(STRINGIZE(desc << " script terminated with rc " << rc),
+ rc, expect);
+ }
+ else if (WIFSIGNALED(status))
+ {
+ ensure(STRINGIZE(desc << " script terminated by signal " << WTERMSIG(status)),
+ false);
+ }
+ else
+ {
+ ensure(STRINGIZE(desc << " script produced impossible status " << status),
+ false);
+ }
+ }
+#endif
+ }
+ };
+
+ typedef tut::test_group<TestPythonCompatible> TestPythonCompatibleGroup;
+ typedef TestPythonCompatibleGroup::object TestPythonCompatibleObject;
+ TestPythonCompatibleGroup pycompat("LLSD serialize Python compatibility");
+
+ template<> template<>
+ void TestPythonCompatibleObject::test<1>()
+ {
+ set_test_name("verify python()");
+ python("hello",
+ "import sys\n"
+ "sys.exit(17)\n",
+ 17); // expect nonzero rc
+ }
+
+ template<> template<>
+ void TestPythonCompatibleObject::test<2>()
+ {
+ set_test_name("verify NamedTempFile");
+ python("platform",
+ "import sys\n"
+ "print 'Running on', sys.platform\n");
+ }
+
+ template<> template<>
+ void TestPythonCompatibleObject::test<3>()
+ {
+ set_test_name("verify sequence to Python");
+
+ LLSD cdata(LLSDArray(17)(3.14)
+ ("This string\n"
+ "has several\n"
+ "lines."));
+
+ const char pydata[] =
+ "def verify(iterable):\n"
+ " it = iter(iterable)\n"
+ " assert it.next() == 17\n"
+ " assert abs(it.next() - 3.14) < 0.01\n"
+ " assert it.next() == '''\\\n"
+ "This string\n"
+ "has several\n"
+ "lines.'''\n"
+ " try:\n"
+ " it.next()\n"
+ " except StopIteration:\n"
+ " pass\n"
+ " else:\n"
+ " assert False, 'Too many data items'\n";
+
+ // Create a something.llsd file containing 'data' serialized to
+ // notation. It's important to separate with newlines because Python's
+ // llsd module doesn't support parsing from a file stream, only from a
+ // string, so we have to know how much of the file to read into a
+ // string.
+ NamedTempFile file(".llsd",
+ // NamedTempFile's boost::function constructor
+ // takes a callable. To this callable it passes the
+ // std::ostream with which it's writing the
+ // NamedTempFile. This lambda-based expression
+ // first calls LLSD::Serialize() with that ostream,
+ // then streams a newline to it, etc.
+ (lambda::bind(LLSDSerialize::toNotation, cdata[0], lambda::_1),
+ lambda::_1 << '\n',
+ lambda::bind(LLSDSerialize::toNotation, cdata[1], lambda::_1),
+ lambda::_1 << '\n',
+ lambda::bind(LLSDSerialize::toNotation, cdata[2], lambda::_1),
+ lambda::_1 << '\n'));
+
+ python("read C++ notation",
+ lambda::_1 <<
+ import_llsd <<
+ "def parse_each(iterable):\n"
+ " for item in iterable:\n"
+ " yield llsd.parse(item)\n" <<
+ pydata <<
+ // Don't forget raw-string syntax for Windows pathnames.
+ "verify(parse_each(open(r'" << file.getName() << "')))\n");
+ }
+
+ template<> template<>
+ void TestPythonCompatibleObject::test<4>()
+ {
+ set_test_name("verify sequence from Python");
+
+ // Create an empty data file. This is just a placeholder for our
+ // script to write into. Create it to establish a unique name that
+ // we know.
+ NamedTempFile file(".llsd", "");
+
+ python("write Python notation",
+ lambda::_1 <<
+ "from __future__ import with_statement\n" <<
+ import_llsd <<
+ "DATA = [\n"
+ " 17,\n"
+ " 3.14,\n"
+ " '''\\\n"
+ "This string\n"
+ "has several\n"
+ "lines.''',\n"
+ "]\n"
+ // Don't forget raw-string syntax for Windows pathnames.
+ // N.B. Using 'print' implicitly adds newlines.
+ "with open(r'" << file.getName() << "', 'w') as f:\n"
+ " for item in DATA:\n"
+ " print >>f, llsd.format_notation(item)\n");
+
+ std::ifstream inf(file.getName().c_str());
+ LLSD item;
+ // Notice that we're not doing anything special to parse out the
+ // newlines: LLSDSerialize::fromNotation ignores them. While it would
+ // seem they're not strictly necessary, going in this direction, we
+ // want to ensure that notation-separated-by-newlines works in both
+ // directions -- since in practice, a given file might be read by
+ // either language.
+ ensure_equals("Failed to read LLSD::Integer from Python",
+ LLSDSerialize::fromNotation(item, inf, LLSDSerialize::SIZE_UNLIMITED),
+ 1);
+ ensure_equals(item.asInteger(), 17);
+ ensure_equals("Failed to read LLSD::Real from Python",
+ LLSDSerialize::fromNotation(item, inf, LLSDSerialize::SIZE_UNLIMITED),
+ 1);
+ ensure_approximately_equals("Bad LLSD::Real value from Python",
+ item.asReal(), 3.14, 7); // 7 bits ~= 0.01
+ ensure_equals("Failed to read LLSD::String from Python",
+ LLSDSerialize::fromNotation(item, inf, LLSDSerialize::SIZE_UNLIMITED),
+ 1);
+ ensure_equals(item.asString(),
+ "This string\n"
+ "has several\n"
+ "lines.");
+ }
+}
diff --git a/indra/llcommon/tests/llsingleton_test.cpp b/indra/llcommon/tests/llsingleton_test.cpp
new file mode 100644
index 0000000000..385289aefe
--- /dev/null
+++ b/indra/llcommon/tests/llsingleton_test.cpp
@@ -0,0 +1,76 @@
+/**
+ * @file llsingleton_test.cpp
+ * @date 2011-08-11
+ * @brief Unit test for the LLSingleton class
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+
+#include "llsingleton.h"
+#include "../test/lltut.h"
+
+namespace tut
+{
+ struct singleton
+ {
+ // We need a class created with the LLSingleton template to test with.
+ class LLSingletonTest: public LLSingleton<LLSingletonTest>
+ {
+
+ };
+ };
+
+ typedef test_group<singleton> singleton_t;
+ typedef singleton_t::object singleton_object_t;
+ tut::singleton_t tut_singleton("LLSingleton");
+
+ template<> template<>
+ void singleton_object_t::test<1>()
+ {
+
+ }
+ template<> template<>
+ void singleton_object_t::test<2>()
+ {
+ LLSingletonTest* singleton_test = LLSingletonTest::getInstance();
+ ensure(singleton_test);
+ }
+ template<> template<>
+ void singleton_object_t::test<3>()
+ {
+ //Construct the instance
+ LLSingletonTest::getInstance();
+ ensure(LLSingletonTest::instanceExists());
+
+ //Delete the instance
+ LLSingletonTest::deleteSingleton();
+ ensure(LLSingletonTest::destroyed());
+ ensure(!LLSingletonTest::instanceExists());
+
+ //Construct it again.
+ LLSingletonTest* singleton_test = LLSingletonTest::getInstance();
+ ensure(singleton_test);
+ ensure(LLSingletonTest::instanceExists());
+ }
+}
diff --git a/indra/llcommon/tests/llstring_test.cpp b/indra/llcommon/tests/llstring_test.cpp
index 304e91ed92..6a1cbf652a 100644
--- a/indra/llcommon/tests/llstring_test.cpp
+++ b/indra/llcommon/tests/llstring_test.cpp
@@ -624,6 +624,14 @@ namespace tut
subcount = LLStringUtil::format(s, fmt_map);
ensure_equals("LLStringUtil::format: Assorted Test2 result", s, "?Am I not a long string?short[A]bbbaaaba[A]");
ensure_equals("LLStringUtil::format: Assorted Test2 result count", 9, subcount);
+
+ // Test on nested brackets
+ std::string srcs6 = "[[TRICK1]][[A]][[B]][[AAA]][[BBB]][[TRICK2]][[KEYLONGER]][[KEYSHORTER]]?[[DELETE]]";
+ s = srcs6;
+ subcount = LLStringUtil::format(s, fmt_map);
+ ensure_equals("LLStringUtil::format: Assorted Test2 result", s, "[[A]][a][b][aaa][bbb][[A]][short][Am I not a long string?]?[]");
+ ensure_equals("LLStringUtil::format: Assorted Test2 result count", 9, subcount);
+
// Test an assorted substitution
std::string srcs8 = "foo[DELETE]bar?";
diff --git a/indra/llcommon/tests/setpython.py b/indra/llcommon/tests/setpython.py
new file mode 100644
index 0000000000..df7b90428e
--- /dev/null
+++ b/indra/llcommon/tests/setpython.py
@@ -0,0 +1,19 @@
+#!/usr/bin/python
+"""\
+@file setpython.py
+@author Nat Goodspeed
+@date 2011-07-13
+@brief Set PYTHON environment variable for tests that care.
+
+$LicenseInfo:firstyear=2011&license=viewerlgpl$
+Copyright (c) 2011, Linden Research, Inc.
+$/LicenseInfo$
+"""
+
+import os
+import sys
+import subprocess
+
+if __name__ == "__main__":
+ os.environ["PYTHON"] = sys.executable
+ sys.exit(subprocess.call(sys.argv[1:]))
diff --git a/indra/llcrashlogger/llcrashlogger.cpp b/indra/llcrashlogger/llcrashlogger.cpp
index 68e45f36e4..d6dcde4b9f 100644
--- a/indra/llcrashlogger/llcrashlogger.cpp
+++ b/indra/llcrashlogger/llcrashlogger.cpp
@@ -31,15 +31,18 @@
#include "llcrashlogger.h"
#include "linden_common.h"
#include "llstring.h"
-#include "indra_constants.h" // CRASH_BEHAVIOR_ASK, CRASH_SETTING_NAME
+#include "indra_constants.h" // CRASH_BEHAVIOR_...
#include "llerror.h"
+#include "llerrorcontrol.h"
#include "lltimer.h"
#include "lldir.h"
+#include "llfile.h"
#include "llsdserialize.h"
#include "lliopipe.h"
#include "llpumpio.h"
#include "llhttpclient.h"
#include "llsdserialize.h"
+#include "llproxy.h"
LLPumpIO* gServicePump;
BOOL gBreak = false;
@@ -54,7 +57,7 @@ public:
virtual void error(U32 status, const std::string& reason)
{
- gBreak = true;
+ gBreak = true;
}
virtual void result(const LLSD& content)
@@ -64,21 +67,8 @@ public:
}
};
-bool LLCrashLoggerText::mainLoop()
-{
- std::cout << "Entering main loop" << std::endl;
- sendCrashLogs();
- return true;
-}
-
-void LLCrashLoggerText::updateApplication(const std::string& message)
-{
- LLCrashLogger::updateApplication(message);
- std::cout << message << std::endl;
-}
-
LLCrashLogger::LLCrashLogger() :
- mCrashBehavior(CRASH_BEHAVIOR_ASK),
+ mCrashBehavior(CRASH_BEHAVIOR_ALWAYS_SEND),
mCrashInPreviousExec(false),
mCrashSettings("CrashSettings"),
mSentCrashLogs(false),
@@ -260,7 +250,7 @@ void LLCrashLogger::gatherFiles()
if(minidump_stream.is_open())
{
minidump_stream.seekg(0, std::ios::end);
- size_t length = minidump_stream.tellg();
+ size_t length = (size_t)minidump_stream.tellg();
minidump_stream.seekg(0, std::ios::beg);
LLSD::Binary data;
@@ -281,26 +271,48 @@ LLSD LLCrashLogger::constructPostData()
return mCrashInfo;
}
+const char* const CRASH_SETTINGS_FILE = "settings_crash_behavior.xml";
+
S32 LLCrashLogger::loadCrashBehaviorSetting()
{
+ // First check user_settings (in the user's home dir)
std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE);
+ if (! mCrashSettings.loadFromFile(filename))
+ {
+ // Next check app_settings (in the SL program dir)
+ std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, CRASH_SETTINGS_FILE);
+ mCrashSettings.loadFromFile(filename);
+ }
- mCrashSettings.loadFromFile(filename);
-
- S32 value = mCrashSettings.getS32(CRASH_BEHAVIOR_SETTING);
-
- if (value < CRASH_BEHAVIOR_ASK || CRASH_BEHAVIOR_NEVER_SEND < value) return CRASH_BEHAVIOR_ASK;
+ // If we didn't load any files above, this will return the default
+ S32 value = mCrashSettings.getS32("CrashSubmitBehavior");
+
+ // Whatever value we got, make sure it's valid
+ switch (value)
+ {
+ case CRASH_BEHAVIOR_NEVER_SEND:
+ return CRASH_BEHAVIOR_NEVER_SEND;
+ case CRASH_BEHAVIOR_ALWAYS_SEND:
+ return CRASH_BEHAVIOR_ALWAYS_SEND;
+ }
- return value;
+ return CRASH_BEHAVIOR_ASK;
}
bool LLCrashLogger::saveCrashBehaviorSetting(S32 crash_behavior)
{
- if (crash_behavior != CRASH_BEHAVIOR_ASK && crash_behavior != CRASH_BEHAVIOR_ALWAYS_SEND) return false;
+ switch (crash_behavior)
+ {
+ case CRASH_BEHAVIOR_ASK:
+ case CRASH_BEHAVIOR_NEVER_SEND:
+ case CRASH_BEHAVIOR_ALWAYS_SEND:
+ break;
+ default:
+ return false;
+ }
- mCrashSettings.setS32(CRASH_BEHAVIOR_SETTING, crash_behavior);
+ mCrashSettings.setS32("CrashSubmitBehavior", crash_behavior);
std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE);
-
mCrashSettings.saveToFile(filename, FALSE);
return true;
@@ -309,14 +321,13 @@ bool LLCrashLogger::saveCrashBehaviorSetting(S32 crash_behavior)
bool LLCrashLogger::runCrashLogPost(std::string host, LLSD data, std::string msg, int retries, int timeout)
{
gBreak = false;
- std::string status_message;
for(int i = 0; i < retries; ++i)
{
- status_message = llformat("%s, try %d...", msg.c_str(), i+1);
+ updateApplication(llformat("%s, try %d...", msg.c_str(), i+1));
LLHTTPClient::post(host, data, new LLCrashLoggerResponder(), timeout);
while(!gBreak)
{
- updateApplication(status_message);
+ updateApplication(); // No new message, just pump the IO
}
if(gSent)
{
@@ -336,7 +347,7 @@ bool LLCrashLogger::sendCrashLogs()
updateApplication("Sending reports...");
std::string dump_path = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,
- "SecondLifeCrashReport");
+ "SecondLifeCrashReport");
std::string report_file = dump_path + ".log";
std::ofstream out_file(report_file.c_str());
@@ -365,23 +376,37 @@ void LLCrashLogger::updateApplication(const std::string& message)
{
gServicePump->pump();
gServicePump->callback();
+ if (!message.empty()) llinfos << message << llendl;
}
bool LLCrashLogger::init()
{
- LLCurl::initClass();
+ LLCurl::initClass(false);
// We assume that all the logs we're looking for reside on the current drive
gDirUtilp->initAppDirs("SecondLife");
+ LLError::initForApplication(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, ""));
+
// Default to the product name "Second Life" (this is overridden by the -name argument)
mProductName = "Second Life";
+
+ // Rename current log file to ".old"
+ std::string old_log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "crashreport.log.old");
+ std::string log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "crashreport.log");
+ LLFile::rename(log_file.c_str(), old_log_file.c_str());
+
+ // Set the log file to crashreport.log
+ LLError::logToFile(log_file);
- mCrashSettings.declareS32(CRASH_BEHAVIOR_SETTING, CRASH_BEHAVIOR_ASK, "Controls behavior when viewer crashes "
- "(0 = ask before sending crash report, 1 = always send crash report, 2 = never send crash report)");
+ mCrashSettings.declareS32("CrashSubmitBehavior", CRASH_BEHAVIOR_ALWAYS_SEND,
+ "Controls behavior when viewer crashes "
+ "(0 = ask before sending crash report, "
+ "1 = always send crash report, "
+ "2 = never send crash report)");
- llinfos << "Loading crash behavior setting" << llendl;
- mCrashBehavior = loadCrashBehaviorSetting();
+ // llinfos << "Loading crash behavior setting" << llendl;
+ // mCrashBehavior = loadCrashBehaviorSetting();
// If user doesn't want to send, bail out
if (mCrashBehavior == CRASH_BEHAVIOR_NEVER_SEND)
@@ -394,12 +419,19 @@ bool LLCrashLogger::init()
gServicePump->prime(gAPRPoolp);
LLHTTPClient::setPump(*gServicePump);
- //If we've opened the crash logger, assume we can delete the marker file if it exists
+ //If we've opened the crash logger, assume we can delete the marker file if it exists
if( gDirUtilp )
{
- std::string marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"SecondLife.exec_marker");
+ std::string marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,
+ "SecondLife.exec_marker");
LLAPRFile::remove( marker_file );
}
return true;
}
+
+// For cleanup code common to all platforms.
+void LLCrashLogger::commonCleanup()
+{
+ LLProxy::cleanupClass();
+}
diff --git a/indra/llcrashlogger/llcrashlogger.h b/indra/llcrashlogger/llcrashlogger.h
index a5daa74247..1510d7e0b3 100644
--- a/indra/llcrashlogger/llcrashlogger.h
+++ b/indra/llcrashlogger/llcrashlogger.h
@@ -48,7 +48,8 @@ public:
virtual void updateApplication(const std::string& message = LLStringUtil::null);
virtual bool init();
virtual bool mainLoop() = 0;
- virtual bool cleanup() { return true; }
+ virtual bool cleanup() = 0;
+ void commonCleanup();
void setUserText(const std::string& text) { mCrashInfo["UserNotes"] = text; }
S32 getCrashBehavior() { return mCrashBehavior; }
bool runCrashLogPost(std::string host, LLSD data, std::string msg, int retries, int timeout);
@@ -66,15 +67,4 @@ protected:
bool mSentCrashLogs;
};
-class LLCrashLoggerText : public LLCrashLogger
-{
-public:
- LLCrashLoggerText(void) {}
- ~LLCrashLoggerText(void) {}
-
- virtual bool mainLoop();
- virtual void updateApplication(const std::string& message = LLStringUtil::null);
-};
-
-
#endif //LLCRASHLOGGER_H
diff --git a/indra/llimage/CMakeLists.txt b/indra/llimage/CMakeLists.txt
index a69621a57b..ea8c1a1107 100644
--- a/indra/llimage/CMakeLists.txt
+++ b/indra/llimage/CMakeLists.txt
@@ -3,12 +3,13 @@
project(llimage)
include(00-Common)
-include(LLAddBuildTest)
include(LLCommon)
include(LLImage)
include(LLMath)
include(LLVFS)
include(ZLIB)
+include(LLAddBuildTest)
+include(Tut)
include_directories(
${LLCOMMON_INCLUDE_DIRS}
@@ -57,11 +58,18 @@ add_library (llimage ${llimage_SOURCE_FILES})
# Sort by high-level to low-level
target_link_libraries(llimage
llcommon
- llimagej2coj # *HACK: In theory a noop for KDU builds?
${JPEG_LIBRARIES}
${PNG_LIBRARIES}
${ZLIB_LIBRARIES}
)
# Add tests
-#ADD_BUILD_TEST(llimageworker llimage)
+if (LL_TESTS)
+ SET(llimage_TEST_SOURCE_FILES
+ llimageworker.cpp
+ )
+ LL_ADD_PROJECT_UNIT_TESTS(llimage "${llimage_TEST_SOURCE_FILES}")
+endif (LL_TESTS)
+
+
+
diff --git a/indra/llimage/llimage.cpp b/indra/llimage/llimage.cpp
index 5c33b675ca..56e01ac851 100644
--- a/indra/llimage/llimage.cpp
+++ b/indra/llimage/llimage.cpp
@@ -39,6 +39,7 @@
#include "llimagepng.h"
#include "llimagedxt.h"
#include "llimageworker.h"
+#include "llmemory.h"
//---------------------------------------------------------------------------
// LLImage
@@ -47,20 +48,23 @@
//static
std::string LLImage::sLastErrorMessage;
LLMutex* LLImage::sMutex = NULL;
+LLPrivateMemoryPool* LLImageBase::sPrivatePoolp = NULL ;
//static
void LLImage::initClass()
{
sMutex = new LLMutex(NULL);
- LLImageJ2C::openDSO();
+
+ LLImageBase::createPrivatePool() ;
}
//static
void LLImage::cleanupClass()
{
- LLImageJ2C::closeDSO();
delete sMutex;
sMutex = NULL;
+
+ LLImageBase::destroyPrivatePool() ;
}
//static
@@ -99,6 +103,25 @@ LLImageBase::~LLImageBase()
deleteData(); // virtual
}
+//static
+void LLImageBase::createPrivatePool()
+{
+ if(!sPrivatePoolp)
+ {
+ sPrivatePoolp = LLPrivateMemoryPoolManager::getInstance()->newPool(LLPrivateMemoryPool::STATIC_THREADED) ;
+ }
+}
+
+//static
+void LLImageBase::destroyPrivatePool()
+{
+ if(sPrivatePoolp)
+ {
+ LLPrivateMemoryPoolManager::getInstance()->deletePool(sPrivatePoolp) ;
+ sPrivatePoolp = NULL ;
+ }
+}
+
// virtual
void LLImageBase::dump()
{
@@ -132,7 +155,7 @@ void LLImageBase::sanityCheck()
// virtual
void LLImageBase::deleteData()
{
- delete[] mData;
+ FREE_MEM(sPrivatePoolp, mData) ;
mData = NULL;
mDataSize = 0;
}
@@ -169,10 +192,10 @@ U8* LLImageBase::allocateData(S32 size)
{
deleteData(); // virtual
mBadBufferAllocation = false ;
- mData = new U8[size];
+ mData = (U8*)ALLOCATE_MEM(sPrivatePoolp, size);
if (!mData)
{
- llwarns << "allocate image data: " << size << llendl;
+ llwarns << "Failed to allocate image data size [" << size << "]" << llendl;
size = 0 ;
mWidth = mHeight = 0 ;
mBadBufferAllocation = true ;
@@ -187,7 +210,7 @@ U8* LLImageBase::allocateData(S32 size)
U8* LLImageBase::reallocateData(S32 size)
{
LLMemType mt1(mMemType);
- U8 *new_datap = new U8[size];
+ U8 *new_datap = (U8*)ALLOCATE_MEM(sPrivatePoolp, size);
if (!new_datap)
{
llwarns << "Out of memory in LLImageBase::reallocateData" << llendl;
@@ -197,7 +220,7 @@ U8* LLImageBase::reallocateData(S32 size)
{
S32 bytes = llmin(mDataSize, size);
memcpy(new_datap, mData, bytes); /* Flawfinder: ignore */
- delete[] mData;
+ FREE_MEM(sPrivatePoolp, mData) ;
}
mData = new_datap;
mDataSize = size;
@@ -276,11 +299,11 @@ LLImageRaw::LLImageRaw(U8 *data, U16 width, U16 height, S8 components)
++sRawImageCount;
}
-LLImageRaw::LLImageRaw(const std::string& filename, bool j2c_lowest_mip_only)
- : LLImageBase()
-{
- createFromFile(filename, j2c_lowest_mip_only);
-}
+//LLImageRaw::LLImageRaw(const std::string& filename, bool j2c_lowest_mip_only)
+// : LLImageBase()
+//{
+// createFromFile(filename, j2c_lowest_mip_only);
+//}
LLImageRaw::~LLImageRaw()
{
@@ -343,6 +366,7 @@ BOOL LLImageRaw::resize(U16 width, U16 height, S8 components)
return TRUE;
}
+#if 0
U8 * LLImageRaw::getSubImage(U32 x_pos, U32 y_pos, U32 width, U32 height) const
{
LLMemType mt1(mMemType);
@@ -363,6 +387,7 @@ U8 * LLImageRaw::getSubImage(U32 x_pos, U32 y_pos, U32 width, U32 height) const
}
return data;
}
+#endif
BOOL LLImageRaw::setSubImage(U32 x_pos, U32 y_pos, U32 width, U32 height,
const U8 *data, U32 stride, BOOL reverse_y)
@@ -832,6 +857,7 @@ void LLImageRaw::copyScaled( LLImageRaw* src )
}
}
+#if 0
//scale down image by not blending a pixel with its neighbors.
BOOL LLImageRaw::scaleDownWithoutBlending( S32 new_width, S32 new_height)
{
@@ -855,7 +881,7 @@ BOOL LLImageRaw::scaleDownWithoutBlending( S32 new_width, S32 new_height)
ratio_x -= 1.0f ;
ratio_y -= 1.0f ;
- U8* new_data = new U8[new_data_size] ;
+ U8* new_data = allocateMemory(new_data_size) ;
llassert_always(new_data != NULL) ;
U8* old_data = getData() ;
@@ -877,6 +903,7 @@ BOOL LLImageRaw::scaleDownWithoutBlending( S32 new_width, S32 new_height)
return TRUE ;
}
+#endif
BOOL LLImageRaw::scale( S32 new_width, S32 new_height, BOOL scale_image_data )
{
@@ -1180,7 +1207,7 @@ file_extensions[] =
{ "png", IMG_CODEC_PNG }
};
#define NUM_FILE_EXTENSIONS LL_ARRAY_SIZE(file_extensions)
-
+#if 0
static std::string find_file(std::string &name, S8 *codec)
{
std::string tname;
@@ -1198,7 +1225,7 @@ static std::string find_file(std::string &name, S8 *codec)
}
return std::string("");
}
-
+#endif
EImageCodec LLImageBase::getCodecFromExtension(const std::string& exten)
{
for (int i=0; i<(int)(NUM_FILE_EXTENSIONS); i++)
@@ -1208,7 +1235,7 @@ EImageCodec LLImageBase::getCodecFromExtension(const std::string& exten)
}
return IMG_CODEC_INVALID;
}
-
+#if 0
bool LLImageRaw::createFromFile(const std::string &filename, bool j2c_lowest_mip_only)
{
std::string name = filename;
@@ -1256,28 +1283,7 @@ bool LLImageRaw::createFromFile(const std::string &filename, bool j2c_lowest_mip
return false;
}
- LLPointer<LLImageFormatted> image;
- switch(codec)
- {
- //case IMG_CODEC_RGB:
- case IMG_CODEC_BMP:
- image = new LLImageBMP();
- break;
- case IMG_CODEC_TGA:
- image = new LLImageTGA();
- break;
- case IMG_CODEC_JPEG:
- image = new LLImageJPEG();
- break;
- case IMG_CODEC_J2C:
- image = new LLImageJ2C();
- break;
- case IMG_CODEC_DXT:
- image = new LLImageDXT();
- break;
- default:
- return false;
- }
+ LLPointer<LLImageFormatted> image = LLImageFormatted::createFromType(codec);
llassert(image.notNull());
U8 *buffer = image->allocateData(length);
@@ -1315,7 +1321,7 @@ bool LLImageRaw::createFromFile(const std::string &filename, bool j2c_lowest_mip
return true;
}
-
+#endif
//---------------------------------------------------------------------------
// LLImageFormatted
//---------------------------------------------------------------------------
@@ -1529,6 +1535,7 @@ void LLImageFormatted::setData(U8 *data, S32 size)
{
deleteData();
setDataAndSize(data, size); // Access private LLImageBase members
+
sGlobalFormattedMemory += getDataSize();
}
}
@@ -1547,7 +1554,7 @@ void LLImageFormatted::appendData(U8 *data, S32 size)
S32 newsize = cursize + size;
reallocateData(newsize);
memcpy(getData() + cursize, data, size);
- delete[] data;
+ FREE_MEM(LLImageBase::getPrivatePool(), data);
}
}
}
diff --git a/indra/llimage/llimage.h b/indra/llimage/llimage.h
index bca7e915fa..4469c9e860 100644
--- a/indra/llimage/llimage.h
+++ b/indra/llimage/llimage.h
@@ -29,14 +29,26 @@
#include "lluuid.h"
#include "llstring.h"
-//#include "llmemory.h"
#include "llthread.h"
#include "llmemtype.h"
const S32 MIN_IMAGE_MIP = 2; // 4x4, only used for expand/contract power of 2
const S32 MAX_IMAGE_MIP = 11; // 2048x2048
+
+// *TODO : Use MAX_IMAGE_MIP as max discard level and modify j2c management so that the number
+// of levels is read from the header's file, not inferred from its size.
const S32 MAX_DISCARD_LEVEL = 5;
+// JPEG2000 size constraints
+// Those are declared here as they are germane to other image constraints used in the viewer
+// and declared right here. Some come from the JPEG2000 spec, some conventions specific to SL.
+const S32 MAX_DECOMPOSITION_LEVELS = 32; // Number of decomposition levels cannot exceed 32 according to jpeg2000 spec
+const S32 MIN_DECOMPOSITION_LEVELS = 5; // the SL viewer will *crash* trying to decode images with fewer than 5 decomposition levels (unless image is small that is)
+const S32 MAX_PRECINCT_SIZE = 2048; // No reason to be bigger than MAX_IMAGE_SIZE
+const S32 MIN_PRECINCT_SIZE = 4; // Can't be smaller than MIN_BLOCK_SIZE
+const S32 MAX_BLOCK_SIZE = 64; // Max total block size is 4096, hence 64x64 when using square blocks
+const S32 MIN_BLOCK_SIZE = 4; // Min block dim is 4 according to jpeg2000 spec
+
const S32 MIN_IMAGE_SIZE = (1<<MIN_IMAGE_MIP); // 4, only used for expand/contract power of 2
const S32 MAX_IMAGE_SIZE = (1<<MAX_IMAGE_MIP); // 2048
const S32 MIN_IMAGE_AREA = MIN_IMAGE_SIZE * MIN_IMAGE_SIZE;
@@ -56,6 +68,7 @@ const S32 MAX_IMG_PACKET_SIZE = 1000;
class LLImageFormatted;
class LLImageRaw;
class LLColor4U;
+class LLPrivateMemoryPool;
typedef enum e_image_codec
{
@@ -127,7 +140,7 @@ public:
protected:
// special accessor to allow direct setting of mData and mDataSize by LLImageFormatted
- void setDataAndSize(U8 *data, S32 size) { mData = data; mDataSize = size; }
+ void setDataAndSize(U8 *data, S32 size) { mData = data; mDataSize = size; }
public:
static void generateMip(const U8 *indata, U8* mipdata, int width, int height, S32 nchannels);
@@ -138,6 +151,10 @@ public:
static EImageCodec getCodecFromExtension(const std::string& exten);
+ static void createPrivatePool() ;
+ static void destroyPrivatePool() ;
+ static LLPrivateMemoryPool* getPrivatePool() {return sPrivatePoolp;}
+
private:
U8 *mData;
S32 mDataSize;
@@ -149,6 +166,8 @@ private:
bool mBadBufferAllocation ;
bool mAllowOverSize ;
+
+ static LLPrivateMemoryPool* sPrivatePoolp ;
public:
LLMemType::DeclareMemType& mMemType; // debug
};
@@ -164,7 +183,7 @@ public:
LLImageRaw(U16 width, U16 height, S8 components);
LLImageRaw(U8 *data, U16 width, U16 height, S8 components);
// Construct using createFromFile (used by tools)
- LLImageRaw(const std::string& filename, bool j2c_lowest_mip_only = false);
+ //LLImageRaw(const std::string& filename, bool j2c_lowest_mip_only = false);
/*virtual*/ void deleteData();
/*virtual*/ U8* allocateData(S32 size = -1);
@@ -172,7 +191,7 @@ public:
BOOL resize(U16 width, U16 height, S8 components);
- U8 * getSubImage(U32 x_pos, U32 y_pos, U32 width, U32 height) const;
+ //U8 * getSubImage(U32 x_pos, U32 y_pos, U32 width, U32 height) const;
BOOL setSubImage(U32 x_pos, U32 y_pos, U32 width, U32 height,
const U8 *data, U32 stride = 0, BOOL reverse_y = FALSE);
@@ -184,7 +203,7 @@ public:
void contractToPowerOfTwo(S32 max_dim = MAX_IMAGE_SIZE, BOOL scale_image = TRUE);
void biasedScaleToPowerOfTwo(S32 max_dim = MAX_IMAGE_SIZE);
BOOL scale( S32 new_width, S32 new_height, BOOL scale_image = TRUE );
- BOOL scaleDownWithoutBlending( S32 new_width, S32 new_height) ;
+ //BOOL scaleDownWithoutBlending( S32 new_width, S32 new_height) ;
// Fill the buffer with a constant color
void fill( const LLColor4U& color );
@@ -226,7 +245,7 @@ public:
protected:
// Create an image from a local file (generally used in tools)
- bool createFromFile(const std::string& filename, bool j2c_lowest_mip_only = false);
+ //bool createFromFile(const std::string& filename, bool j2c_lowest_mip_only = false);
void copyLineScaled( U8* in, U8* out, S32 in_pixel_len, S32 out_pixel_len, S32 in_pixel_step, S32 out_pixel_step );
void compositeRowScaled4onto3( U8* in, U8* out, S32 in_pixel_len, S32 out_pixel_len );
@@ -266,13 +285,13 @@ public:
// subclasses must return a prefered file extension (lowercase without a leading dot)
virtual std::string getExtension() = 0;
// calcHeaderSize() returns the maximum size of header;
- // 0 indicates we don't know have a header and have to lead the entire file
+ // 0 indicates we don't have a header and have to read the entire file
virtual S32 calcHeaderSize() { return 0; };
// calcDataSize() returns how many bytes to read to load discard_level (including header)
virtual S32 calcDataSize(S32 discard_level);
// calcDiscardLevelBytes() returns the smallest valid discard level based on the number of input bytes
virtual S32 calcDiscardLevelBytes(S32 bytes);
- // getRawDiscardLevel()by default returns mDiscardLevel, but may be overridden (LLImageJ2C)
+ // getRawDiscardLevel() by default returns mDiscardLevel, but may be overridden (LLImageJ2C)
virtual S8 getRawDiscardLevel() { return mDiscardLevel; }
BOOL load(const std::string& filename);
diff --git a/indra/llimage/llimagedimensionsinfo.cpp b/indra/llimage/llimagedimensionsinfo.cpp
index 835664c60f..c6bfa50b40 100644
--- a/indra/llimage/llimagedimensionsinfo.cpp
+++ b/indra/llimage/llimagedimensionsinfo.cpp
@@ -73,9 +73,28 @@ bool LLImageDimensionsInfo::load(const std::string& src_filename,U32 codec)
bool LLImageDimensionsInfo::getImageDimensionsBmp()
{
- const S32 BMP_FILE_HEADER_SIZE = 14;
+ // Make sure the file is long enough.
+ const S32 DATA_LEN = 26; // BMP header (14) + DIB header size (4) + width (4) + height (4)
+ if (!checkFileLength(DATA_LEN))
+ {
+ llwarns << "Premature end of file" << llendl;
+ return false;
+ }
+
+ // Read BMP signature.
+ U8 signature[2];
+ mInfile.read((void*)signature, sizeof(signature)/sizeof(signature[0]));
+
+ // Make sure this is actually a BMP file.
+ // We only support Windows bitmaps (BM), according to LLImageBMP::updateData().
+ if (signature[0] != 'B' || signature[1] != 'M')
+ {
+ llwarns << "Not a BMP" << llendl;
+ return false;
+ }
- mInfile.seek(APR_CUR,BMP_FILE_HEADER_SIZE+4);
+ // Read image dimensions.
+ mInfile.seek(APR_CUR, 16);
mWidth = read_reverse_s32();
mHeight = read_reverse_s32();
@@ -86,6 +105,14 @@ bool LLImageDimensionsInfo::getImageDimensionsTga()
{
const S32 TGA_FILE_HEADER_SIZE = 12;
+ // Make sure the file is long enough.
+ if (!checkFileLength(TGA_FILE_HEADER_SIZE + 1 /* width */ + 1 /* height */))
+ {
+ llwarns << "Premature end of file" << llendl;
+ return false;
+ }
+
+ // *TODO: Detect non-TGA files somehow.
mInfile.seek(APR_CUR,TGA_FILE_HEADER_SIZE);
mWidth = read_byte() | read_byte() << 8;
mHeight = read_byte() | read_byte() << 8;
@@ -95,9 +122,29 @@ bool LLImageDimensionsInfo::getImageDimensionsTga()
bool LLImageDimensionsInfo::getImageDimensionsPng()
{
- const S32 PNG_FILE_MARKER_SIZE = 8;
+ const S32 PNG_MAGIC_SIZE = 8;
+
+ // Make sure the file is long enough.
+ if (!checkFileLength(PNG_MAGIC_SIZE + 8 + sizeof(S32) * 2 /* width, height */))
+ {
+ llwarns << "Premature end of file" << llendl;
+ return false;
+ }
- mInfile.seek(APR_CUR,PNG_FILE_MARKER_SIZE + 8/*header offset+chunk length+chunk type*/);
+ // Read PNG signature.
+ const U8 png_magic[PNG_MAGIC_SIZE] = {0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A};
+ U8 signature[PNG_MAGIC_SIZE];
+ mInfile.read((void*)signature, PNG_MAGIC_SIZE);
+
+ // Make sure it's a PNG file.
+ if (memcmp(signature, png_magic, PNG_MAGIC_SIZE) != 0)
+ {
+ llwarns << "Not a PNG" << llendl;
+ return false;
+ }
+
+ // Read image dimensions.
+ mInfile.seek(APR_CUR, 8 /* chunk length + chunk type */);
mWidth = read_s32();
mHeight = read_s32();
@@ -122,6 +169,24 @@ bool LLImageDimensionsInfo::getImageDimensionsJpeg()
setLastError("Unable to open file for reading", mSrcFilename);
return false;
}
+
+ /* Make sure this is a JPEG file. */
+ const size_t JPEG_MAGIC_SIZE = 2;
+ const uint8_t jpeg_magic[JPEG_MAGIC_SIZE] = {0xFF, 0xD8};
+ uint8_t signature[JPEG_MAGIC_SIZE];
+
+ if (fread(signature, sizeof(signature), 1, fp) != 1)
+ {
+ llwarns << "Premature end of file" << llendl;
+ return false;
+ }
+ if (memcmp(signature, jpeg_magic, JPEG_MAGIC_SIZE) != 0)
+ {
+ llwarns << "Not a JPEG" << llendl;
+ return false;
+ }
+ fseek(fp, 0, SEEK_SET); // go back to start of the file
+
/* Init jpeg */
jpeg_error_mgr jerr;
jpeg_decompress_struct cinfo;
@@ -145,3 +210,13 @@ bool LLImageDimensionsInfo::getImageDimensionsJpeg()
return !sJpegErrorEncountered;
}
+bool LLImageDimensionsInfo::checkFileLength(S32 min_len)
+{
+ // Make sure the file is not shorter than min_len bytes.
+ // so that we don't have to check value returned by each read() or seek().
+ char* buf = new char[min_len];
+ int nread = mInfile.read(buf, min_len);
+ delete[] buf;
+ mInfile.seek(APR_SET, 0);
+ return nread == min_len;
+}
diff --git a/indra/llimage/llimagedimensionsinfo.h b/indra/llimage/llimagedimensionsinfo.h
index 5384faf3f4..382fdb2a0e 100644
--- a/indra/llimage/llimagedimensionsinfo.h
+++ b/indra/llimage/llimagedimensionsinfo.h
@@ -119,6 +119,9 @@ protected:
return read_byte() << 8 | read_byte();
}
+ /// Check if the file is not shorter than min_len bytes.
+ bool checkFileLength(S32 min_len);
+
protected:
LLAPRFile mInfile ;
std::string mSrcFilename;
diff --git a/indra/llimage/llimagedxt.cpp b/indra/llimage/llimagedxt.cpp
index 4bd3efddaa..34c6793522 100644
--- a/indra/llimage/llimagedxt.cpp
+++ b/indra/llimage/llimagedxt.cpp
@@ -26,6 +26,7 @@
#include "linden_common.h"
#include "llimagedxt.h"
+#include "llmemory.h"
//static
void LLImageDXT::checkMinWidthHeight(EFileFormat format, S32& width, S32& height)
@@ -429,7 +430,7 @@ bool LLImageDXT::convertToDXR()
S32 nmips = calcNumMips(width,height);
S32 total_bytes = getDataSize();
U8* olddata = getData();
- U8* newdata = new U8[total_bytes];
+ U8* newdata = (U8*)ALLOCATE_MEM(LLImageBase::getPrivatePool(), total_bytes);
if (!newdata)
{
llerrs << "Out of memory in LLImageDXT::convertToDXR()" << llendl;
diff --git a/indra/llimage/llimagej2c.cpp b/indra/llimage/llimagej2c.cpp
index d005aaf29f..8241746a74 100644
--- a/indra/llimage/llimagej2c.cpp
+++ b/indra/llimage/llimagej2c.cpp
@@ -24,31 +24,21 @@
*/
#include "linden_common.h"
-#include "apr_pools.h"
-#include "apr_dso.h"
-
#include "lldir.h"
#include "llimagej2c.h"
#include "llmemtype.h"
#include "lltimer.h"
#include "llmath.h"
+#include "llmemory.h"
typedef LLImageJ2CImpl* (*CreateLLImageJ2CFunction)();
typedef void (*DestroyLLImageJ2CFunction)(LLImageJ2CImpl*);
typedef const char* (*EngineInfoLLImageJ2CFunction)();
-//some "private static" variables so we only attempt to load
-//dynamic libaries once
-CreateLLImageJ2CFunction j2cimpl_create_func;
-DestroyLLImageJ2CFunction j2cimpl_destroy_func;
-EngineInfoLLImageJ2CFunction j2cimpl_engineinfo_func;
-apr_pool_t *j2cimpl_dso_memory_pool;
-apr_dso_handle_t *j2cimpl_dso_handle;
-
-//Declare the prototype for theses functions here, their functionality
-//will be implemented in other files which define a derived LLImageJ2CImpl
-//but only ONE static library which has the implementation for this
-//function should ever be included
+// Declare the prototype for theses functions here. Their functionality
+// will be implemented in other files which define a derived LLImageJ2CImpl
+// but only ONE static library which has the implementation for these
+// functions should ever be included.
LLImageJ2CImpl* fallbackCreateLLImageJ2CImpl();
void fallbackDestroyLLImageJ2CImpl(LLImageJ2CImpl* impl);
const char* fallbackEngineInfoLLImageJ2CImpl();
@@ -58,120 +48,9 @@ LLImageCompressionTester* LLImageJ2C::sTesterp = NULL ;
const std::string sTesterName("ImageCompressionTester");
//static
-//Loads the required "create", "destroy" and "engineinfo" functions needed
-void LLImageJ2C::openDSO()
-{
- //attempt to load a DSO and get some functions from it
- std::string dso_name;
- std::string dso_path;
-
- bool all_functions_loaded = false;
- apr_status_t rv;
-
-#if LL_WINDOWS
- dso_name = "llkdu.dll";
-#elif LL_DARWIN
- dso_name = "libllkdu.dylib";
-#else
- dso_name = "libllkdu.so";
-#endif
-
- dso_path = gDirUtilp->findFile(dso_name,
- gDirUtilp->getAppRODataDir(),
- gDirUtilp->getExecutableDir());
-
- j2cimpl_dso_handle = NULL;
- j2cimpl_dso_memory_pool = NULL;
-
- //attempt to load the shared library
- apr_pool_create(&j2cimpl_dso_memory_pool, NULL);
- rv = apr_dso_load(&j2cimpl_dso_handle,
- dso_path.c_str(),
- j2cimpl_dso_memory_pool);
-
- //now, check for success
- if ( rv == APR_SUCCESS )
- {
- //found the dynamic library
- //now we want to load the functions we're interested in
- CreateLLImageJ2CFunction create_func = NULL;
- DestroyLLImageJ2CFunction dest_func = NULL;
- EngineInfoLLImageJ2CFunction engineinfo_func = NULL;
-
- rv = apr_dso_sym((apr_dso_handle_sym_t*)&create_func,
- j2cimpl_dso_handle,
- "createLLImageJ2CKDU");
- if ( rv == APR_SUCCESS )
- {
- //we've loaded the create function ok
- //we need to delete via the DSO too
- //so lets check for a destruction function
- rv = apr_dso_sym((apr_dso_handle_sym_t*)&dest_func,
- j2cimpl_dso_handle,
- "destroyLLImageJ2CKDU");
- if ( rv == APR_SUCCESS )
- {
- //we've loaded the destroy function ok
- rv = apr_dso_sym((apr_dso_handle_sym_t*)&engineinfo_func,
- j2cimpl_dso_handle,
- "engineInfoLLImageJ2CKDU");
- if ( rv == APR_SUCCESS )
- {
- //ok, everything is loaded alright
- j2cimpl_create_func = create_func;
- j2cimpl_destroy_func = dest_func;
- j2cimpl_engineinfo_func = engineinfo_func;
- all_functions_loaded = true;
- }
- }
- }
- }
-
- if ( !all_functions_loaded )
- {
- //something went wrong with the DSO or function loading..
- //fall back onto our satefy impl creation function
-
-#if 0
- // precious verbose debugging, sadly we can't use our
- // 'llinfos' stream etc. this early in the initialisation seq.
- char errbuf[256];
- fprintf(stderr, "failed to load syms from DSO %s (%s)\n",
- dso_name.c_str(), dso_path.c_str());
- apr_strerror(rv, errbuf, sizeof(errbuf));
- fprintf(stderr, "error: %d, %s\n", rv, errbuf);
- apr_dso_error(j2cimpl_dso_handle, errbuf, sizeof(errbuf));
- fprintf(stderr, "dso-error: %d, %s\n", rv, errbuf);
-#endif
-
- if ( j2cimpl_dso_handle )
- {
- apr_dso_unload(j2cimpl_dso_handle);
- j2cimpl_dso_handle = NULL;
- }
-
- if ( j2cimpl_dso_memory_pool )
- {
- apr_pool_destroy(j2cimpl_dso_memory_pool);
- j2cimpl_dso_memory_pool = NULL;
- }
- }
-}
-
-//static
-void LLImageJ2C::closeDSO()
-{
- if ( j2cimpl_dso_handle ) apr_dso_unload(j2cimpl_dso_handle);
- if (j2cimpl_dso_memory_pool) apr_pool_destroy(j2cimpl_dso_memory_pool);
-}
-
-//static
std::string LLImageJ2C::getEngineInfo()
{
- if (!j2cimpl_engineinfo_func)
- j2cimpl_engineinfo_func = fallbackEngineInfoLLImageJ2CImpl;
-
- return j2cimpl_engineinfo_func();
+ return fallbackEngineInfoLLImageJ2CImpl();
}
LLImageJ2C::LLImageJ2C() : LLImageFormatted(IMG_CODEC_J2C),
@@ -181,20 +60,7 @@ LLImageJ2C::LLImageJ2C() : LLImageFormatted(IMG_CODEC_J2C),
mReversible(FALSE),
mAreaUsedForDataSizeCalcs(0)
{
- //We assume here that if we wanted to create via
- //a dynamic library that the approriate open calls were made
- //before any calls to this constructor.
-
- //Therefore, a NULL creation function pointer here means
- //we either did not want to create using functions from the dynamic
- //library or there were issues loading it, either way
- //use our fall back
- if ( !j2cimpl_create_func )
- {
- j2cimpl_create_func = fallbackCreateLLImageJ2CImpl;
- }
-
- mImpl = j2cimpl_create_func();
+ mImpl = fallbackCreateLLImageJ2CImpl();
// Clear data size table
for( S32 i = 0; i <= MAX_DISCARD_LEVEL; i++)
@@ -217,22 +83,9 @@ LLImageJ2C::LLImageJ2C() : LLImageFormatted(IMG_CODEC_J2C),
// virtual
LLImageJ2C::~LLImageJ2C()
{
- //We assume here that if we wanted to destroy via
- //a dynamic library that the approriate open calls were made
- //before any calls to this destructor.
-
- //Therefore, a NULL creation function pointer here means
- //we either did not want to destroy using functions from the dynamic
- //library or there were issues loading it, either way
- //use our fall back
- if ( !j2cimpl_destroy_func )
- {
- j2cimpl_destroy_func = fallbackDestroyLLImageJ2CImpl;
- }
-
if ( mImpl )
{
- j2cimpl_destroy_func(mImpl);
+ fallbackDestroyLLImageJ2CImpl(mImpl);
}
}
@@ -287,6 +140,15 @@ BOOL LLImageJ2C::updateData()
return res;
}
+BOOL LLImageJ2C::initDecode(LLImageRaw &raw_image, int discard_level, int* region)
+{
+ return mImpl->initDecode(*this,raw_image,discard_level,region);
+}
+
+BOOL LLImageJ2C::initEncode(LLImageRaw &raw_image, int blocks_size, int precincts_size, int levels)
+{
+ return mImpl->initEncode(*this,raw_image,blocks_size,precincts_size,levels);
+}
BOOL LLImageJ2C::decode(LLImageRaw *raw_imagep, F32 decode_time)
{
@@ -399,6 +261,9 @@ S32 LLImageJ2C::calcHeaderSizeJ2C()
//static
S32 LLImageJ2C::calcDataSizeJ2C(S32 w, S32 h, S32 comp, S32 discard_level, F32 rate)
{
+ // Note: this only provides an *estimate* of the size in bytes of an image level
+ // *TODO: find a way to read the true size (when available) and convey the fact
+ // that the result is an estimate in the other cases
if (rate <= 0.f) rate = .125f;
while (discard_level > 0)
{
@@ -521,14 +386,14 @@ BOOL LLImageJ2C::loadAndValidate(const std::string &filename)
}
else
{
- U8 *data = new U8[file_size];
+ U8 *data = (U8*)ALLOCATE_MEM(LLImageBase::getPrivatePool(), file_size);
apr_size_t bytes_read = file_size;
apr_status_t s = apr_file_read(apr_file, data, &bytes_read); // modifies bytes_read
infile.close() ;
if (s != APR_SUCCESS || (S32)bytes_read != file_size)
{
- delete[] data;
+ FREE_MEM(LLImageBase::getPrivatePool(), data);
setLastError("Unable to read entire file");
res = FALSE;
}
@@ -622,6 +487,7 @@ LLImageCompressionTester::LLImageCompressionTester() : LLMetricPerformanceTester
LLImageCompressionTester::~LLImageCompressionTester()
{
+ outputTestResults();
LLImageJ2C::sTesterp = NULL;
}
@@ -635,10 +501,10 @@ void LLImageCompressionTester::outputTestRecord(LLSD *sd)
F32 decompressionRate = 0.0f;
F32 compressionRate = 0.0f;
- F32 totalkBInDecompression = (F32)(mTotalBytesInDecompression) / 1000.0;
- F32 totalkBOutDecompression = (F32)(mTotalBytesOutDecompression) / 1000.0;
- F32 totalkBInCompression = (F32)(mTotalBytesInCompression) / 1000.0;
- F32 totalkBOutCompression = (F32)(mTotalBytesOutCompression) / 1000.0;
+ F32 totalkBInDecompression = (F32)(mTotalBytesInDecompression) / 1000.f;
+ F32 totalkBOutDecompression = (F32)(mTotalBytesOutDecompression) / 1000.f;
+ F32 totalkBInCompression = (F32)(mTotalBytesInCompression) / 1000.f;
+ F32 totalkBOutCompression = (F32)(mTotalBytesOutCompression) / 1000.f;
if (!is_approx_zero(mTotalTimeDecompression))
{
diff --git a/indra/llimage/llimagej2c.h b/indra/llimage/llimagej2c.h
index cc3dabd7d8..914174fc57 100644
--- a/indra/llimage/llimagej2c.h
+++ b/indra/llimage/llimagej2c.h
@@ -56,6 +56,8 @@ public:
/*virtual*/ void resetLastError();
/*virtual*/ void setLastError(const std::string& message, const std::string& filename = std::string());
+ BOOL initDecode(LLImageRaw &raw_image, int discard_level, int* region);
+ BOOL initEncode(LLImageRaw &raw_image, int blocks_size, int precincts_size, int levels);
// Encode with comment text
BOOL encode(const LLImageRaw *raw_imagep, const char* comment_text, F32 encode_time=0.0);
@@ -72,8 +74,6 @@ public:
static S32 calcHeaderSizeJ2C();
static S32 calcDataSizeJ2C(S32 w, S32 h, S32 comp, S32 discard_level, F32 rate = 0.f);
- static void openDSO();
- static void closeDSO();
static std::string getEngineInfo();
protected:
@@ -119,6 +119,8 @@ protected:
virtual BOOL decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, S32 first_channel, S32 max_channel_count) = 0;
virtual BOOL encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time=0.0,
BOOL reversible=FALSE) = 0;
+ virtual BOOL initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level = -1, int* region = NULL) = 0;
+ virtual BOOL initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size = -1, int precincts_size = -1, int levels = 0) = 0;
friend class LLImageJ2C;
};
diff --git a/indra/llimage/llimagepng.cpp b/indra/llimage/llimagepng.cpp
index 8d493ecde0..294f68b122 100644
--- a/indra/llimage/llimagepng.cpp
+++ b/indra/llimage/llimagepng.cpp
@@ -60,6 +60,12 @@ BOOL LLImagePNG::updateData()
// Decode the PNG data and extract sizing information
LLPngWrapper pngWrapper;
+ if (!pngWrapper.isValidPng(getData()))
+ {
+ setLastError("LLImagePNG data does not have a valid PNG header!");
+ return FALSE;
+ }
+
LLPngWrapper::ImageInfo infop;
if (! pngWrapper.readPng(getData(), NULL, &infop))
{
@@ -90,6 +96,12 @@ BOOL LLImagePNG::decode(LLImageRaw* raw_image, F32 decode_time)
// Decode the PNG data into the raw image
LLPngWrapper pngWrapper;
+ if (!pngWrapper.isValidPng(getData()))
+ {
+ setLastError("LLImagePNG data does not have a valid PNG header!");
+ return FALSE;
+ }
+
if (! pngWrapper.readPng(getData(), raw_image))
{
setLastError(pngWrapper.getErrorMessage());
diff --git a/indra/llimage/llimageworker.cpp b/indra/llimage/llimageworker.cpp
index d1c74b6fa1..ad2eb0f69c 100644
--- a/indra/llimage/llimageworker.cpp
+++ b/indra/llimage/llimageworker.cpp
@@ -38,9 +38,15 @@ LLImageDecodeThread::LLImageDecodeThread(bool threaded)
mCreationMutex = new LLMutex(getAPRPool());
}
+//virtual
+LLImageDecodeThread::~LLImageDecodeThread()
+{
+ delete mCreationMutex ;
+}
+
// MAIN THREAD
// virtual
-S32 LLImageDecodeThread::update(U32 max_time_ms)
+S32 LLImageDecodeThread::update(F32 max_time_ms)
{
LLMutexLock lock(mCreationMutex);
for (creation_list_t::iterator iter = mCreationList.begin();
diff --git a/indra/llimage/llimageworker.h b/indra/llimage/llimageworker.h
index c3c92ec832..1bfb0ddfd3 100644
--- a/indra/llimage/llimageworker.h
+++ b/indra/llimage/llimageworker.h
@@ -73,10 +73,12 @@ public:
public:
LLImageDecodeThread(bool threaded = true);
+ virtual ~LLImageDecodeThread();
+
handle_t decodeImage(LLImageFormatted* image,
U32 priority, S32 discard, BOOL needs_aux,
Responder* responder);
- S32 update(U32 max_time_ms);
+ S32 update(F32 max_time_ms);
// Used by unit tests to check the consistency of the thread instance
S32 tut_size();
diff --git a/indra/llimage/llpngwrapper.cpp b/indra/llimage/llpngwrapper.cpp
index fe737e2072..2cc7d3c460 100644
--- a/indra/llimage/llpngwrapper.cpp
+++ b/indra/llimage/llpngwrapper.cpp
@@ -50,8 +50,6 @@ LLPngWrapper::LLPngWrapper()
mCompressionType( 0 ),
mFilterMethod( 0 ),
mFinalSize( 0 ),
- mHasBKGD(false),
- mBackgroundColor(),
mGamma(0.f)
{
}
@@ -111,9 +109,9 @@ void LLPngWrapper::writeFlush(png_structp png_ptr)
}
// Read the PNG file using the libpng. The low-level interface is used here
-// because we want to do various transformations (including setting the
-// matte background if any, and applying gama) which can't be done with
-// the high-level interface. The scanline also begins at the bottom of
+// because we want to do various transformations (including applying gama)
+// which can't be done with the high-level interface.
+// The scanline also begins at the bottom of
// the image (per SecondLife conventions) instead of at the top, so we
// must assign row-pointers in "reverse" order.
BOOL LLPngWrapper::readPng(U8* src, LLImageRaw* rawImage, ImageInfo *infop)
@@ -201,8 +199,7 @@ void LLPngWrapper::normalizeImage()
// 2. Convert grayscales to RGB
// 3. Create alpha layer from transparency
// 4. Ensure 8-bpp for all images
- // 5. Apply background matte if any
- // 6. Set (or guess) gamma
+ // 5. Set (or guess) gamma
if (mColorType == PNG_COLOR_TYPE_PALETTE)
{
@@ -229,12 +226,6 @@ void LLPngWrapper::normalizeImage()
{
png_set_strip_16(mReadPngPtr);
}
- mHasBKGD = png_get_bKGD(mReadPngPtr, mReadInfoPtr, &mBackgroundColor);
- if (mHasBKGD)
- {
- png_set_background(mReadPngPtr, mBackgroundColor,
- PNG_BACKGROUND_GAMMA_FILE, 1, 1.0);
- }
#if LL_DARWIN
const F64 SCREEN_GAMMA = 1.8;
@@ -261,7 +252,6 @@ void LLPngWrapper::updateMetaData()
mBitDepth = png_get_bit_depth(mReadPngPtr, mReadInfoPtr);
mColorType = png_get_color_type(mReadPngPtr, mReadInfoPtr);
mChannels = png_get_channels(mReadPngPtr, mReadInfoPtr);
- mHasBKGD = png_get_bKGD(mReadPngPtr, mReadInfoPtr, &mBackgroundColor);
}
// Method to write raw image into PNG at dest. The raw scanline begins
diff --git a/indra/llimage/llpngwrapper.h b/indra/llimage/llpngwrapper.h
index 47a4207d66..739f435996 100644
--- a/indra/llimage/llpngwrapper.h
+++ b/indra/llimage/llpngwrapper.h
@@ -88,9 +88,6 @@ private:
U32 mFinalSize;
- bool mHasBKGD;
- png_color_16p mBackgroundColor;
-
F64 mGamma;
std::string mErrorMessage;
diff --git a/indra/llimage/tests/llimageworker_test.cpp b/indra/llimage/tests/llimageworker_test.cpp
index a109276709..08476fb72c 100644
--- a/indra/llimage/tests/llimageworker_test.cpp
+++ b/indra/llimage/tests/llimageworker_test.cpp
@@ -26,10 +26,8 @@
*/
// Precompiled header: almost always required for newview cpp files
-#include <list>
-#include <map>
-#include <algorithm>
-// Class to test
+#include "linden_common.h"
+// Class to test
#include "../llimageworker.h"
// For timer class
#include "../llcommon/lltimer.h"
@@ -44,7 +42,17 @@
// * Do not make any assumption as to how those classes or methods work (i.e. don't copy/paste code)
// * A simulator for a class can be implemented here. Please comment and document thoroughly.
-LLImageBase::LLImageBase() {}
+LLImageBase::LLImageBase()
+: mData(NULL),
+mDataSize(0),
+mWidth(0),
+mHeight(0),
+mComponents(0),
+mBadBufferAllocation(false),
+mAllowOverSize(false),
+mMemType(LLMemType::MTYPE_IMAGEBASE)
+{
+}
LLImageBase::~LLImageBase() {}
void LLImageBase::dump() { }
void LLImageBase::sanityCheck() { }
diff --git a/indra/llimagej2coj/llimagej2coj.cpp b/indra/llimagej2coj/llimagej2coj.cpp
index 95e0997d5b..d15824ce5a 100644
--- a/indra/llimagej2coj/llimagej2coj.cpp
+++ b/indra/llimagej2coj/llimagej2coj.cpp
@@ -90,6 +90,12 @@ void info_callback(const char* msg, void*)
lldebugs << "LLImageJ2COJ: " << chomp(msg) << llendl;
}
+// Divide a by 2 to the power of b and round upwards
+int ceildivpow2(int a, int b)
+{
+ return (a + (1 << b) - 1) >> b;
+}
+
LLImageJ2COJ::LLImageJ2COJ()
: LLImageJ2CImpl()
@@ -101,6 +107,17 @@ LLImageJ2COJ::~LLImageJ2COJ()
{
}
+BOOL LLImageJ2COJ::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level, int* region)
+{
+ // No specific implementation for this method in the OpenJpeg case
+ return FALSE;
+}
+
+BOOL LLImageJ2COJ::initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size, int precincts_size, int levels)
+{
+ // No specific implementation for this method in the OpenJpeg case
+ return FALSE;
+}
BOOL LLImageJ2COJ::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, S32 first_channel, S32 max_channel_count)
{
diff --git a/indra/llimagej2coj/llimagej2coj.h b/indra/llimagej2coj/llimagej2coj.h
index 7edacbe97c..40ad4edb00 100644
--- a/indra/llimagej2coj/llimagej2coj.h
+++ b/indra/llimagej2coj/llimagej2coj.h
@@ -34,17 +34,13 @@ class LLImageJ2COJ : public LLImageJ2CImpl
public:
LLImageJ2COJ();
virtual ~LLImageJ2COJ();
-
protected:
/*virtual*/ BOOL getMetadata(LLImageJ2C &base);
/*virtual*/ BOOL decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, S32 first_channel, S32 max_channel_count);
/*virtual*/ BOOL encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time=0.0,
BOOL reversible = FALSE);
- int ceildivpow2(int a, int b)
- {
- // Divide a by b to the power of 2 and round upwards.
- return (a + (1 << b) - 1) >> b;
- }
+ /*virtual*/ BOOL initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level = -1, int* region = NULL);
+ /*virtual*/ BOOL initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size = -1, int precincts_size = -1, int levels = 0);
};
#endif
diff --git a/indra/llinventory/CMakeLists.txt b/indra/llinventory/CMakeLists.txt
index 6b2b61f883..e45c809e7e 100644
--- a/indra/llinventory/CMakeLists.txt
+++ b/indra/llinventory/CMakeLists.txt
@@ -59,16 +59,17 @@ list(APPEND llinventory_SOURCE_FILES ${llinventory_HEADER_FILES})
add_library (llinventory ${llinventory_SOURCE_FILES})
-if(LL_TESTS)
- #add unit tests
- INCLUDE(LLAddBuildTest)
- SET(llinventory_TEST_SOURCE_FILES
+
+#add unit tests
+if (LL_TESTS)
+ INCLUDE(LLAddBuildTest)
+ SET(llinventory_TEST_SOURCE_FILES
# no real unit tests yet!
)
- LL_ADD_PROJECT_UNIT_TESTS(llinventory "${llinventory_TEST_SOURCE_FILES}")
+ LL_ADD_PROJECT_UNIT_TESTS(llinventory "${llinventory_TEST_SOURCE_FILES}")
- #set(TEST_DEBUG on)
- set(test_libs llinventory ${LLMESSAGE_LIBRARIES} ${LLVFS_LIBRARIES} ${LLMATH_LIBRARIES} ${LLCOMMON_LIBRARIES} ${WINDOWS_LIBRARIES})
- LL_ADD_INTEGRATION_TEST(inventorymisc "" "${test_libs}")
- LL_ADD_INTEGRATION_TEST(llparcel "" "${test_libs}")
-endif(LL_TESTS)
+ #set(TEST_DEBUG on)
+ set(test_libs llinventory ${LLMESSAGE_LIBRARIES} ${LLVFS_LIBRARIES} ${LLMATH_LIBRARIES} ${LLCOMMON_LIBRARIES} ${WINDOWS_LIBRARIES})
+ LL_ADD_INTEGRATION_TEST(inventorymisc "" "${test_libs}")
+ LL_ADD_INTEGRATION_TEST(llparcel "" "${test_libs}")
+endif (LL_TESTS)
diff --git a/indra/llinventory/lleconomy.cpp b/indra/llinventory/lleconomy.cpp
index c6eaa6d3e1..d643ea6ed9 100644
--- a/indra/llinventory/lleconomy.cpp
+++ b/indra/llinventory/lleconomy.cpp
@@ -48,6 +48,31 @@ LLGlobalEconomy::LLGlobalEconomy()
LLGlobalEconomy::~LLGlobalEconomy()
{ }
+void LLGlobalEconomy::addObserver(LLEconomyObserver* observer)
+{
+ mObservers.push_back(observer);
+}
+
+void LLGlobalEconomy::removeObserver(LLEconomyObserver* observer)
+{
+ std::list<LLEconomyObserver*>::iterator it =
+ std::find(mObservers.begin(), mObservers.end(), observer);
+ if (it != mObservers.end())
+ {
+ mObservers.erase(it);
+ }
+}
+
+void LLGlobalEconomy::notifyObservers()
+{
+ for (std::list<LLEconomyObserver*>::iterator it = mObservers.begin();
+ it != mObservers.end();
+ ++it)
+ {
+ (*it)->onEconomyDataChange();
+ }
+}
+
// static
void LLGlobalEconomy::processEconomyData(LLMessageSystem *msg, LLGlobalEconomy* econ_data)
{
@@ -88,6 +113,8 @@ void LLGlobalEconomy::processEconomyData(LLMessageSystem *msg, LLGlobalEconomy*
econ_data->setTeleportPriceExponent(f);
msg->getS32Fast(_PREHASH_Info, _PREHASH_PriceGroupCreate, i);
econ_data->setPriceGroupCreate(i);
+
+ econ_data->notifyObservers();
}
S32 LLGlobalEconomy::calculateTeleportCost(F32 distance) const
diff --git a/indra/llinventory/lleconomy.h b/indra/llinventory/lleconomy.h
index cc6643f955..eb2ecf71ba 100644
--- a/indra/llinventory/lleconomy.h
+++ b/indra/llinventory/lleconomy.h
@@ -31,6 +31,16 @@
class LLMessageSystem;
class LLVector3;
+/**
+ * Register an observer to be notified of economy data updates coming from server.
+ */
+class LLEconomyObserver
+{
+public:
+ virtual ~LLEconomyObserver() {}
+ virtual void onEconomyDataChange() = 0;
+};
+
class LLGlobalEconomy
{
public:
@@ -46,6 +56,10 @@ public:
virtual void print();
+ void addObserver(LLEconomyObserver* observer);
+ void removeObserver(LLEconomyObserver* observer);
+ void notifyObservers();
+
static void processEconomyData(LLMessageSystem *msg, LLGlobalEconomy* econ_data);
S32 calculateTeleportCost(F32 distance) const;
@@ -89,6 +103,8 @@ private:
S32 mTeleportMinPrice;
F32 mTeleportPriceExponent;
S32 mPriceGroupCreate;
+
+ std::list<LLEconomyObserver*> mObservers;
};
diff --git a/indra/llinventory/llinventory.cpp b/indra/llinventory/llinventory.cpp
index bda76eac80..fbf23bc3f0 100644
--- a/indra/llinventory/llinventory.cpp
+++ b/indra/llinventory/llinventory.cpp
@@ -61,8 +61,6 @@ static const std::string INV_FOLDER_ID_LABEL_WS("category_id");
///----------------------------------------------------------------------------
/// Local function declarations, constants, enums, and typedefs
///----------------------------------------------------------------------------
-const U8 TASK_INVENTORY_ITEM_KEY = 0;
-const U8 TASK_INVENTORY_ASSET_KEY = 1;
const LLUUID MAGIC_ID("3c115e51-04f4-523c-9fa6-98aff1034730");
@@ -407,7 +405,7 @@ U32 LLInventoryItem::getCRC32() const
//lldebugs << "7 crc: " << std::hex << crc << std::dec << llendl;
crc += mSaleInfo.getCRC32();
//lldebugs << "8 crc: " << std::hex << crc << std::dec << llendl;
- crc += mCreationDate;
+ crc += (U32)mCreationDate;
//lldebugs << "9 crc: " << std::hex << crc << std::dec << llendl;
return crc;
}
@@ -523,7 +521,7 @@ void LLInventoryItem::packMessage(LLMessageSystem* msg) const
mSaleInfo.packMessage(msg);
msg->addStringFast(_PREHASH_Name, mName);
msg->addStringFast(_PREHASH_Description, mDescription);
- msg->addS32Fast(_PREHASH_CreationDate, mCreationDate);
+ msg->addS32Fast(_PREHASH_CreationDate, (S32)mCreationDate);
U32 crc = getCRC32();
msg->addU32Fast(_PREHASH_CRC, crc);
}
@@ -1036,8 +1034,11 @@ void LLInventoryItem::asLLSD( LLSD& sd ) const
sd[INV_CREATION_DATE_LABEL] = (S32) mCreationDate;
}
+LLFastTimer::DeclareTimer FTM_INVENTORY_SD_DESERIALIZE("Inventory SD Deserialize");
+
bool LLInventoryItem::fromLLSD(const LLSD& sd)
{
+ LLFastTimer _(FTM_INVENTORY_SD_DESERIALIZE);
mInventoryType = LLInventoryType::IT_NONE;
mAssetUUID.setNull();
std::string w;
diff --git a/indra/llinventory/llinventorytype.cpp b/indra/llinventory/llinventorytype.cpp
index a99be1420b..8282d79b67 100644
--- a/indra/llinventory/llinventorytype.cpp
+++ b/indra/llinventory/llinventorytype.cpp
@@ -83,6 +83,8 @@ LLInventoryDictionary::LLInventoryDictionary()
addEntry(LLInventoryType::IT_WEARABLE, new InventoryEntry("wearable", "wearable", 2, LLAssetType::AT_CLOTHING, LLAssetType::AT_BODYPART));
addEntry(LLInventoryType::IT_ANIMATION, new InventoryEntry("animation", "animation", 1, LLAssetType::AT_ANIMATION));
addEntry(LLInventoryType::IT_GESTURE, new InventoryEntry("gesture", "gesture", 1, LLAssetType::AT_GESTURE));
+ addEntry(LLInventoryType::IT_MESH, new InventoryEntry("mesh", "mesh", 1, LLAssetType::AT_MESH));
+ addEntry(LLInventoryType::IT_WIDGET, new InventoryEntry("widget", "widget", 1, LLAssetType::AT_WIDGET));
}
@@ -91,32 +93,58 @@ LLInventoryDictionary::LLInventoryDictionary()
static const LLInventoryType::EType
DEFAULT_ASSET_FOR_INV_TYPE[LLAssetType::AT_COUNT] =
{
- LLInventoryType::IT_TEXTURE, // AT_TEXTURE
- LLInventoryType::IT_SOUND, // AT_SOUND
- LLInventoryType::IT_CALLINGCARD, // AT_CALLINGCARD
- LLInventoryType::IT_LANDMARK, // AT_LANDMARK
- LLInventoryType::IT_LSL, // AT_SCRIPT
- LLInventoryType::IT_WEARABLE, // AT_CLOTHING
- LLInventoryType::IT_OBJECT, // AT_OBJECT
- LLInventoryType::IT_NOTECARD, // AT_NOTECARD
- LLInventoryType::IT_CATEGORY, // AT_CATEGORY
- LLInventoryType::IT_NONE, // (null entry)
- LLInventoryType::IT_LSL, // AT_LSL_TEXT
- LLInventoryType::IT_LSL, // AT_LSL_BYTECODE
- LLInventoryType::IT_TEXTURE, // AT_TEXTURE_TGA
- LLInventoryType::IT_WEARABLE, // AT_BODYPART
- LLInventoryType::IT_CATEGORY, // AT_TRASH
- LLInventoryType::IT_CATEGORY, // AT_SNAPSHOT_CATEGORY
- LLInventoryType::IT_CATEGORY, // AT_LOST_AND_FOUND
- LLInventoryType::IT_SOUND, // AT_SOUND_WAV
- LLInventoryType::IT_NONE, // AT_IMAGE_TGA
- LLInventoryType::IT_NONE, // AT_IMAGE_JPEG
- LLInventoryType::IT_ANIMATION, // AT_ANIMATION
- LLInventoryType::IT_GESTURE, // AT_GESTURE
- LLInventoryType::IT_NONE, // AT_SIMSTATE
-
- LLInventoryType::IT_NONE, // AT_LINK
- LLInventoryType::IT_NONE, // AT_LINK_FOLDER
+ LLInventoryType::IT_TEXTURE, // 0 AT_TEXTURE
+ LLInventoryType::IT_SOUND, // 1 AT_SOUND
+ LLInventoryType::IT_CALLINGCARD, // 2 AT_CALLINGCARD
+ LLInventoryType::IT_LANDMARK, // 3 AT_LANDMARK
+ LLInventoryType::IT_LSL, // 4 AT_SCRIPT
+ LLInventoryType::IT_WEARABLE, // 5 AT_CLOTHING
+ LLInventoryType::IT_OBJECT, // 6 AT_OBJECT
+ LLInventoryType::IT_NOTECARD, // 7 AT_NOTECARD
+ LLInventoryType::IT_CATEGORY, // 8 AT_CATEGORY
+ LLInventoryType::IT_NONE, // 9 (null entry)
+ LLInventoryType::IT_LSL, // 10 AT_LSL_TEXT
+ LLInventoryType::IT_LSL, // 11 AT_LSL_BYTECODE
+ LLInventoryType::IT_TEXTURE, // 12 AT_TEXTURE_TGA
+ LLInventoryType::IT_WEARABLE, // 13 AT_BODYPART
+ LLInventoryType::IT_CATEGORY, // 14 AT_TRASH
+ LLInventoryType::IT_CATEGORY, // 15 AT_SNAPSHOT_CATEGORY
+ LLInventoryType::IT_CATEGORY, // 16 AT_LOST_AND_FOUND
+ LLInventoryType::IT_SOUND, // 17 AT_SOUND_WAV
+ LLInventoryType::IT_NONE, // 18 AT_IMAGE_TGA
+ LLInventoryType::IT_NONE, // 19 AT_IMAGE_JPEG
+ LLInventoryType::IT_ANIMATION, // 20 AT_ANIMATION
+ LLInventoryType::IT_GESTURE, // 21 AT_GESTURE
+ LLInventoryType::IT_NONE, // 22 AT_SIMSTATE
+
+ LLInventoryType::IT_NONE, // 23 AT_LINK
+ LLInventoryType::IT_NONE, // 24 AT_LINK_FOLDER
+
+ LLInventoryType::IT_NONE, // 25 AT_NONE
+ LLInventoryType::IT_NONE, // 26 AT_NONE
+ LLInventoryType::IT_NONE, // 27 AT_NONE
+ LLInventoryType::IT_NONE, // 28 AT_NONE
+ LLInventoryType::IT_NONE, // 29 AT_NONE
+ LLInventoryType::IT_NONE, // 30 AT_NONE
+ LLInventoryType::IT_NONE, // 31 AT_NONE
+ LLInventoryType::IT_NONE, // 32 AT_NONE
+ LLInventoryType::IT_NONE, // 33 AT_NONE
+ LLInventoryType::IT_NONE, // 34 AT_NONE
+ LLInventoryType::IT_NONE, // 35 AT_NONE
+ LLInventoryType::IT_NONE, // 36 AT_NONE
+ LLInventoryType::IT_NONE, // 37 AT_NONE
+ LLInventoryType::IT_NONE, // 38 AT_NONE
+ LLInventoryType::IT_NONE, // 39 AT_NONE
+ LLInventoryType::IT_WIDGET, // 40 AT_WIDGET
+ LLInventoryType::IT_NONE, // 41 AT_NONE
+ LLInventoryType::IT_NONE, // 42 AT_NONE
+ LLInventoryType::IT_NONE, // 43 AT_NONE
+ LLInventoryType::IT_NONE, // 44 AT_NONE
+ LLInventoryType::IT_NONE, // 45 AT_NONE
+ LLInventoryType::IT_NONE, // 46 AT_NONE
+ LLInventoryType::IT_NONE, // 47 AT_NONE
+ LLInventoryType::IT_NONE, // 48 AT_NONE
+ LLInventoryType::IT_MESH, // 49 AT_MESH
};
// static
diff --git a/indra/llinventory/llinventorytype.h b/indra/llinventory/llinventorytype.h
index d9777a73f2..4d1e0db040 100644
--- a/indra/llinventory/llinventorytype.h
+++ b/indra/llinventory/llinventorytype.h
@@ -61,7 +61,9 @@ public:
IT_WEARABLE = 18,
IT_ANIMATION = 19,
IT_GESTURE = 20,
- IT_COUNT = 21,
+ IT_MESH = 22,
+ IT_WIDGET = 23,
+ IT_COUNT = 24,
IT_NONE = -1
};
diff --git a/indra/llinventory/llnotecard.cpp b/indra/llinventory/llnotecard.cpp
index 62829c284f..69152cefe0 100644
--- a/indra/llinventory/llnotecard.cpp
+++ b/indra/llinventory/llnotecard.cpp
@@ -199,7 +199,7 @@ bool LLNotecard::importStream(std::istream& str)
return FALSE;
}
- if(text_len > mMaxText)
+ if(text_len > mMaxText || text_len < 0)
{
llwarns << "Invalid Linden text length: " << text_len << llendl;
return FALSE;
diff --git a/indra/llinventory/llparcel.cpp b/indra/llinventory/llparcel.cpp
index 488bd45d8f..433076c7a9 100644
--- a/indra/llinventory/llparcel.cpp
+++ b/indra/llinventory/llparcel.cpp
@@ -72,6 +72,7 @@ static const std::string PARCEL_CATEGORY_STRING[LLParcel::C_COUNT] =
"shopping",
"stage",
"other",
+ "rental"
};
static const std::string PARCEL_CATEGORY_UI_STRING[LLParcel::C_COUNT + 1] =
{
@@ -89,6 +90,7 @@ static const std::string PARCEL_CATEGORY_UI_STRING[LLParcel::C_COUNT + 1] =
"Shopping",
"Stage",
"Other",
+ "Rental",
"Any", // valid string for parcel searches
};
@@ -188,8 +190,6 @@ void LLParcel::init(const LLUUID &owner_id,
mMediaID.setNull();
mMediaAutoScale = 0;
mMediaLoop = TRUE;
- mObscureMedia = 1;
- mObscureMusic = 1;
mMediaWidth = 0;
mMediaHeight = 0;
setMediaCurrentURL(LLStringUtil::null);
@@ -226,6 +226,11 @@ void LLParcel::init(const LLUUID &owner_id,
setPreviousOwnerID(LLUUID::null);
setPreviouslyGroupOwned(FALSE);
+
+ setSeeAVs(TRUE);
+ setAllowGroupAVSounds(TRUE);
+ setAllowAnyAVSounds(TRUE);
+ setHaveNewParcelLimitData(FALSE);
}
void LLParcel::overrideOwner(const LLUUID& owner_id, BOOL is_group_owned)
@@ -685,8 +690,8 @@ void LLParcel::packMessage(LLSD& msg)
msg["auto_scale"] = getMediaAutoScale();
msg["media_loop"] = getMediaLoop();
msg["media_current_url"] = getMediaCurrentURL();
- msg["obscure_media"] = getObscureMedia();
- msg["obscure_music"] = getObscureMusic();
+ msg["obscure_media"] = false; // OBSOLETE - no longer used
+ msg["obscure_music"] = false; // OBSOLETE - no longer used
msg["media_id"] = getMediaID();
msg["media_allow_navigate"] = getMediaAllowNavigate();
msg["media_prevent_camera_zoom"] = getMediaPreventCameraZoom();
@@ -702,7 +707,9 @@ void LLParcel::packMessage(LLSD& msg)
msg["user_location"] = ll_sd_from_vector3(mUserLocation);
msg["user_look_at"] = ll_sd_from_vector3(mUserLookAt);
msg["landing_type"] = (U8)mLandingType;
-
+ msg["see_avs"] = (LLSD::Boolean) getSeeAVs();
+ msg["group_av_sounds"] = (LLSD::Boolean) getAllowGroupAVSounds();
+ msg["any_av_sounds"] = (LLSD::Boolean) getAllowAnyAVSounds();
}
@@ -721,6 +728,24 @@ void LLParcel::unpackMessage(LLMessageSystem* msg)
msg->getStringFast( _PREHASH_ParcelData,_PREHASH_MediaURL, buffer );
setMediaURL(buffer);
+ BOOL see_avs = TRUE; // All default to true for legacy server behavior
+ BOOL any_av_sounds = TRUE;
+ BOOL group_av_sounds = TRUE;
+ bool have_new_parcel_limit_data = (msg->getSizeFast(_PREHASH_ParcelData, _PREHASH_SeeAVs) > 0); // New version of server should send all 3 of these values
+ have_new_parcel_limit_data &= (msg->getSizeFast(_PREHASH_ParcelData, _PREHASH_AnyAVSounds) > 0);
+ have_new_parcel_limit_data &= (msg->getSizeFast(_PREHASH_ParcelData, _PREHASH_GroupAVSounds) > 0);
+ if (have_new_parcel_limit_data)
+ {
+ msg->getBOOLFast(_PREHASH_ParcelData, _PREHASH_SeeAVs, see_avs);
+ msg->getBOOLFast(_PREHASH_ParcelData, _PREHASH_AnyAVSounds, any_av_sounds);
+ msg->getBOOLFast(_PREHASH_ParcelData, _PREHASH_GroupAVSounds, group_av_sounds);
+ }
+ setSeeAVs((bool) see_avs);
+ setAllowAnyAVSounds((bool) any_av_sounds);
+ setAllowGroupAVSounds((bool) group_av_sounds);
+
+ setHaveNewParcelLimitData(have_new_parcel_limit_data);
+
// non-optimized version
msg->getU8 ( "ParcelData", "MediaAutoScale", mMediaAutoScale );
@@ -750,16 +775,13 @@ void LLParcel::unpackMessage(LLMessageSystem* msg)
msg->getS32("MediaData", "MediaWidth", mMediaWidth);
msg->getS32("MediaData", "MediaHeight", mMediaHeight);
msg->getU8 ( "MediaData", "MediaLoop", mMediaLoop );
- msg->getU8 ( "MediaData", "ObscureMedia", mObscureMedia );
- msg->getU8 ( "MediaData", "ObscureMusic", mObscureMusic );
+ // the ObscureMedia and ObscureMusic flags previously set here are no longer used
}
else
{
setMediaType(std::string("video/vnd.secondlife.qt.legacy"));
setMediaDesc(std::string("No Description available without Server Upgrade"));
mMediaLoop = true;
- mObscureMedia = true;
- mObscureMusic = true;
}
if(msg->getNumberOfBlocks("MediaLinkSharing") > 0)
@@ -1225,8 +1247,6 @@ void LLParcel::clearParcel()
setMediaDesc(LLStringUtil::null);
setMediaAutoScale(0);
setMediaLoop(TRUE);
- mObscureMedia = 1;
- mObscureMusic = 1;
mMediaWidth = 0;
mMediaHeight = 0;
setMediaCurrentURL(LLStringUtil::null);
diff --git a/indra/llinventory/llparcel.h b/indra/llinventory/llparcel.h
index ae301af9f5..f0b2caca3d 100644
--- a/indra/llinventory/llparcel.h
+++ b/indra/llinventory/llparcel.h
@@ -35,7 +35,6 @@
#include "lltimer.h"
#include "v3math.h"
-
// Grid out of which parcels taken is stepped every 4 meters.
const F32 PARCEL_GRID_STEP_METERS = 4.f;
@@ -46,7 +45,7 @@ const S32 PARCEL_UNIT_AREA = 16;
const F32 PARCEL_HEIGHT = 50.f;
//Height above ground which parcel boundries exist for explicitly banned avatars
-const F32 BAN_HEIGHT = 768.f;
+const F32 BAN_HEIGHT = 5000.f;
// Maximum number of entries in an access list
const S32 PARCEL_MAX_ACCESS_LIST = 300;
@@ -75,7 +74,7 @@ const U8 PARCEL_AUCTION = 0x05;
// unused 0x06
// unused 0x07
// flag, unused 0x08
-// flag, unused 0x10
+const U8 PARCEL_HIDDENAVS = 0x10; // avatars not visible outside of parcel. Used for 'see avs' feature, but must be off for compatibility
const U8 PARCEL_SOUND_LOCAL = 0x20;
const U8 PARCEL_WEST_LINE = 0x40; // flag, property line on west edge
const U8 PARCEL_SOUTH_LINE = 0x80; // flag, property line on south edge
@@ -130,6 +129,12 @@ class LLSD;
class LLAccessEntry
{
public:
+ LLAccessEntry()
+ : mID(),
+ mTime(0),
+ mFlags(0)
+ {}
+
LLUUID mID; // Agent ID
S32 mTime; // Time (unix seconds) when entry expires
U32 mFlags; // Not used - currently should always be zero
@@ -165,6 +170,7 @@ public:
C_SHOPPING,
C_STAGE,
C_OTHER,
+ C_RENTAL,
C_COUNT,
C_ANY = -1 // only useful in queries
};
@@ -238,8 +244,6 @@ public:
void setMediaID(const LLUUID& id) { mMediaID = id; }
void setMediaAutoScale ( U8 flagIn ) { mMediaAutoScale = flagIn; }
void setMediaLoop (U8 loop) { mMediaLoop = loop; }
- void setObscureMedia( U8 flagIn ) { mObscureMedia = flagIn; }
- void setObscureMusic( U8 flagIn ) { mObscureMusic = flagIn; }
void setMediaWidth(S32 width);
void setMediaHeight(S32 height);
void setMediaCurrentURL(const std::string& url);
@@ -266,6 +270,8 @@ public:
void setUserLocation(const LLVector3& pos) { mUserLocation = pos; }
void setUserLookAt(const LLVector3& rot) { mUserLookAt = rot; }
void setLandingType(const ELandingType type) { mLandingType = type; }
+ void setSeeAVs(BOOL see_avs) { mSeeAVs = see_avs; }
+ void setHaveNewParcelLimitData(bool have_new_parcel_data) { mHaveNewParcelLimitData = have_new_parcel_data; } // Remove this once hidden AV feature is fully available grid-wide
void setAuctionID(U32 auction_id) { mAuctionID = auction_id;}
@@ -292,6 +298,8 @@ public:
void setDenyAnonymous(BOOL b) { setParcelFlag(PF_DENY_ANONYMOUS, b); }
void setDenyAgeUnverified(BOOL b) { setParcelFlag(PF_DENY_AGEUNVERIFIED, b); }
void setRestrictPushObject(BOOL b) { setParcelFlag(PF_RESTRICT_PUSHOBJECT, b); }
+ void setAllowGroupAVSounds(BOOL b) { mAllowGroupAVSounds = b; }
+ void setAllowAnyAVSounds(BOOL b) { mAllowAnyAVSounds = b; }
void setDrawDistance(F32 dist) { mDrawDistance = dist; }
void setSalePrice(S32 price) { mSalePrice = price; }
@@ -346,8 +354,6 @@ public:
U8 getMediaAutoScale() const { return mMediaAutoScale; }
U8 getMediaLoop() const { return mMediaLoop; }
const std::string& getMediaCurrentURL() const { return mMediaCurrentURL; }
- U8 getObscureMedia() const { return mObscureMedia; }
- U8 getObscureMusic() const { return mObscureMusic; }
U8 getMediaURLFilterEnable() const { return mMediaURLFilterEnable; }
LLSD getMediaURLFilterList() const { return mMediaURLFilterList; }
U8 getMediaAllowNavigate() const { return mMediaAllowNavigate; }
@@ -370,6 +376,8 @@ public:
const LLVector3& getUserLocation() const { return mUserLocation; }
const LLVector3& getUserLookAt() const { return mUserLookAt; }
ELandingType getLandingType() const { return mLandingType; }
+ BOOL getSeeAVs() const { return mSeeAVs; }
+ BOOL getHaveNewParcelLimitData() const { return mHaveNewParcelLimitData; }
// User-specified snapshot
const LLUUID& getSnapshotID() const { return mSnapshotID; }
@@ -499,6 +507,9 @@ public:
BOOL getRegionDenyAgeUnverifiedOverride() const
{ return mRegionDenyAgeUnverifiedOverride; }
+ BOOL getAllowGroupAVSounds() const { return mAllowGroupAVSounds; }
+ BOOL getAllowAnyAVSounds() const { return mAllowAnyAVSounds; }
+
F32 getDrawDistance() const { return mDrawDistance; }
S32 getSalePrice() const { return mSalePrice; }
time_t getClaimDate() const { return mClaimDate; }
@@ -589,7 +600,8 @@ public:
LLUUID getPreviousOwnerID() const { return mPreviousOwnerID; }
BOOL getPreviouslyGroupOwned() const { return mPreviouslyGroupOwned; }
BOOL getSellWithObjects() const { return (mParcelFlags & PF_SELL_PARCEL_OBJECTS) ? TRUE : FALSE; }
-
+
+
protected:
LLUUID mID;
LLUUID mOwnerID;
@@ -605,6 +617,8 @@ protected:
LLVector3 mUserLocation;
LLVector3 mUserLookAt;
ELandingType mLandingType;
+ BOOL mSeeAVs; // Avatars on this parcel are visible from outside it
+ BOOL mHaveNewParcelLimitData; // Remove once hidden AV feature is grid-wide
LLTimer mSaleTimerExpires;
LLTimer mMediaResetTimer;
@@ -636,8 +650,6 @@ protected:
U8 mMediaAutoScale;
U8 mMediaLoop;
std::string mMediaCurrentURL;
- U8 mObscureMedia;
- U8 mObscureMusic;
LLUUID mMediaID;
U8 mMediaURLFilterEnable;
LLSD mMediaURLFilterList;
@@ -662,8 +674,10 @@ protected:
BOOL mRegionPushOverride;
BOOL mRegionDenyAnonymousOverride;
BOOL mRegionDenyAgeUnverifiedOverride;
-
-
+ BOOL mAllowGroupAVSounds;
+ BOOL mAllowAnyAVSounds;
+
+
public:
// HACK, make private
S32 mLocalID;
diff --git a/indra/llinventory/llparcelflags.h b/indra/llinventory/llparcelflags.h
index a61130132a..b1a917df73 100644
--- a/indra/llinventory/llparcelflags.h
+++ b/indra/llinventory/llparcelflags.h
@@ -126,5 +126,7 @@ const S32 PARCEL_DETAILS_DESC = 1;
const S32 PARCEL_DETAILS_OWNER = 2;
const S32 PARCEL_DETAILS_GROUP = 3;
const S32 PARCEL_DETAILS_AREA = 4;
+const S32 PARCEL_DETAILS_ID = 5;
+const S32 PARCEL_DETAILS_SEE_AVATARS = 6;
#endif
diff --git a/indra/llkdu/CMakeLists.txt b/indra/llkdu/CMakeLists.txt
new file mode 100644
index 0000000000..bdac2eded7
--- /dev/null
+++ b/indra/llkdu/CMakeLists.txt
@@ -0,0 +1,65 @@
+# -*- cmake -*-
+
+project(llkdu)
+
+# Visual Studio 2005 has a dumb bug that causes it to fail compilation
+# of KDU if building with both optimisation and /WS (treat warnings as
+# errors), even when the specific warnings that make it croak are
+# disabled.
+
+#set(VS_DISABLE_FATAL_WARNINGS ON)
+
+include(00-Common)
+include(LLCommon)
+include(LLImage)
+include(LLKDU)
+include(LLMath)
+
+include_directories(
+ ${LLCOMMON_INCLUDE_DIRS}
+ ${LLIMAGE_INCLUDE_DIRS}
+ ${KDU_INCLUDE_DIR}
+ ${LLKDU_INCLUDE_DIRS}
+ ${LLMATH_INCLUDE_DIRS}
+ )
+
+set(llkdu_SOURCE_FILES
+ llimagej2ckdu.cpp
+ llkdumem.cpp
+ )
+
+set(llkdu_HEADER_FILES
+ CMakeLists.txt
+
+ llimagej2ckdu.h
+ llkdumem.h
+ )
+
+set_source_files_properties(${llkdu_HEADER_FILES}
+ PROPERTIES HEADER_FILE_ONLY TRUE)
+
+list(APPEND llkdu_SOURCE_FILES ${llkdu_HEADER_FILES})
+
+if (USE_KDU)
+ add_library (${LLKDU_LIBRARIES} ${llkdu_SOURCE_FILES})
+
+ # Add tests
+ if (LL_TESTS)
+ include(LLAddBuildTest)
+ include(Tut)
+ SET(llkdu_TEST_SOURCE_FILES
+ llimagej2ckdu.cpp
+ )
+ SET(llkdu_test_additional_HEADER_FILES
+ llimagej2ckdu.h
+ llkdumem.h
+ lltut.h
+ )
+ SET(llkdu_test_additional_INCLUDE_DIRS
+ ${KDU_INCLUDE_DIR}
+ ${LLKDU_INCLUDE_DIRS}
+ )
+ LL_ADD_PROJECT_UNIT_TESTS(llkdu "${llkdu_TEST_SOURCE_FILES}")
+ endif (LL_TESTS)
+
+endif (USE_KDU)
diff --git a/indra/llkdu/llimagej2ckdu.cpp b/indra/llkdu/llimagej2ckdu.cpp
new file mode 100644
index 0000000000..c156ed0cef
--- /dev/null
+++ b/indra/llkdu/llimagej2ckdu.cpp
@@ -0,0 +1,1156 @@
+ /**
+ * @file llimagej2ckdu.cpp
+ * @brief This is an implementation of JPEG2000 encode/decode using Kakadu
+ *
+ * $LicenseInfo:firstyear=2010&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+#include "llimagej2ckdu.h"
+
+#include "lltimer.h"
+#include "llpointer.h"
+#include "llmath.h"
+#include "llkdumem.h"
+
+
+class kdc_flow_control {
+
+public:
+ kdc_flow_control(kdu_image_in_base *img_in, kdu_codestream codestream);
+ ~kdc_flow_control();
+ bool advance_components();
+ void process_components();
+
+private:
+
+ struct kdc_component_flow_control {
+ public:
+ kdu_image_in_base *reader;
+ int vert_subsampling;
+ int ratio_counter; /* Initialized to 0, decremented by `count_delta';
+ when < 0, a new line must be processed, after
+ which it is incremented by `vert_subsampling'. */
+ int initial_lines;
+ int remaining_lines;
+ kdu_line_buf *line;
+ };
+
+ kdu_codestream codestream;
+ kdu_dims valid_tile_indices;
+ kdu_coords tile_idx;
+ kdu_tile tile;
+ int num_components;
+ kdc_component_flow_control *components;
+ int count_delta; // Holds the minimum of the `vert_subsampling' fields
+ kdu_multi_analysis engine;
+ kdu_long max_buffer_memory;
+};
+
+//
+// Kakadu specific implementation
+//
+void set_default_colour_weights(kdu_params *siz);
+
+const char* engineInfoLLImageJ2CKDU()
+{
+ static std::string version = llformat("KDU %s", KDU_CORE_VERSION);
+ return version.c_str();
+}
+
+LLImageJ2CKDU* createLLImageJ2CKDU()
+{
+ return new LLImageJ2CKDU();
+}
+
+void destroyLLImageJ2CKDU(LLImageJ2CKDU* kdu)
+{
+ delete kdu;
+ kdu = NULL;
+}
+
+LLImageJ2CImpl* fallbackCreateLLImageJ2CImpl()
+{
+ return new LLImageJ2CKDU();
+}
+
+void fallbackDestroyLLImageJ2CImpl(LLImageJ2CImpl* impl)
+{
+ delete impl;
+ impl = NULL;
+}
+
+const char* fallbackEngineInfoLLImageJ2CImpl()
+{
+ return engineInfoLLImageJ2CKDU();
+}
+
+class LLKDUDecodeState
+{
+public:
+ LLKDUDecodeState(kdu_tile tile, kdu_byte *buf, S32 row_gap);
+ ~LLKDUDecodeState();
+ BOOL processTileDecode(F32 decode_time, BOOL limit_time = TRUE);
+
+private:
+ S32 mNumComponents;
+ BOOL mUseYCC;
+ kdu_dims mDims;
+ kdu_sample_allocator mAllocator;
+ kdu_tile_comp mComps[4];
+ kdu_line_buf mLines[4];
+ kdu_pull_ifc mEngines[4];
+ bool mReversible[4]; // Some components may be reversible and others not
+ int mBitDepths[4]; // Original bit-depth may be quite different from 8
+
+ kdu_tile mTile;
+ kdu_byte *mBuf;
+ S32 mRowGap;
+};
+
+void ll_kdu_error( void )
+{
+ // *FIX: This exception is bad, bad, bad. It gets thrown from a
+ // destructor which can lead to immediate program termination!
+ throw "ll_kdu_error() throwing an exception";
+}
+
+// Stuff for new kdu error handling
+class LLKDUMessageWarning : public kdu_message
+{
+public:
+ /*virtual*/ void put_text(const char *s);
+ /*virtual*/ void put_text(const kdu_uint16 *s);
+
+ static LLKDUMessageWarning sDefaultMessage;
+};
+
+class LLKDUMessageError : public kdu_message
+{
+public:
+ /*virtual*/ void put_text(const char *s);
+ /*virtual*/ void put_text(const kdu_uint16 *s);
+ /*virtual*/ void flush(bool end_of_message = false);
+ static LLKDUMessageError sDefaultMessage;
+};
+
+void LLKDUMessageWarning::put_text(const char *s)
+{
+ llinfos << "KDU Warning: " << s << llendl;
+}
+
+void LLKDUMessageWarning::put_text(const kdu_uint16 *s)
+{
+ llinfos << "KDU Warning: " << s << llendl;
+}
+
+void LLKDUMessageError::put_text(const char *s)
+{
+ llinfos << "KDU Error: " << s << llendl;
+}
+
+void LLKDUMessageError::put_text(const kdu_uint16 *s)
+{
+ llinfos << "KDU Error: " << s << llendl;
+}
+
+void LLKDUMessageError::flush(bool end_of_message)
+{
+ if (end_of_message)
+ {
+ throw "KDU throwing an exception";
+ }
+}
+
+LLKDUMessageWarning LLKDUMessageWarning::sDefaultMessage;
+LLKDUMessageError LLKDUMessageError::sDefaultMessage;
+static bool kdu_message_initialized = false;
+
+LLImageJ2CKDU::LLImageJ2CKDU() : LLImageJ2CImpl(),
+mInputp(NULL),
+mCodeStreamp(NULL),
+mTPosp(NULL),
+mTileIndicesp(NULL),
+mRawImagep(NULL),
+mDecodeState(NULL),
+mBlocksSize(-1),
+mPrecinctsSize(-1),
+mLevels(0)
+{
+}
+
+LLImageJ2CKDU::~LLImageJ2CKDU()
+{
+ cleanupCodeStream(); // in case destroyed before decode completed
+}
+
+// Stuff for new simple decode
+void transfer_bytes(kdu_byte *dest, kdu_line_buf &src, int gap, int precision);
+
+void LLImageJ2CKDU::setupCodeStream(LLImageJ2C &base, BOOL keep_codestream, ECodeStreamMode mode)
+{
+ S32 data_size = base.getDataSize();
+ S32 max_bytes = (base.getMaxBytes() ? base.getMaxBytes() : data_size);
+
+ //
+ // Initialization
+ //
+ if (!kdu_message_initialized)
+ {
+ kdu_message_initialized = true;
+ kdu_customize_errors(&LLKDUMessageError::sDefaultMessage);
+ kdu_customize_warnings(&LLKDUMessageWarning::sDefaultMessage);
+ }
+
+ if (mCodeStreamp)
+ {
+ mCodeStreamp->destroy();
+ delete mCodeStreamp;
+ mCodeStreamp = NULL;
+ }
+
+ if (!mInputp && base.getData())
+ {
+ // The compressed data has been loaded
+ // Setup the source for the codestream
+ mInputp = new LLKDUMemSource(base.getData(), data_size);
+ }
+
+ if (mInputp)
+ {
+ mInputp->reset();
+ }
+ mCodeStreamp = new kdu_codestream;
+
+ mCodeStreamp->create(mInputp);
+
+ // Set the maximum number of bytes to use from the codestream
+ mCodeStreamp->set_max_bytes(max_bytes);
+
+ // If you want to flip or rotate the image for some reason, change
+ // the resolution, or identify a restricted region of interest, this is
+ // the place to do it. You may use "kdu_codestream::change_appearance"
+ // and "kdu_codestream::apply_input_restrictions" for this purpose.
+ // If you wish to truncate the code-stream prior to decompression, you
+ // may use "kdu_codestream::set_max_bytes".
+ // If you wish to retain all compressed data so that the material
+ // can be decompressed multiple times, possibly with different appearance
+ // parameters, you should call "kdu_codestream::set_persistent" here.
+ // There are a variety of other features which must be enabled at
+ // this point if you want to take advantage of them. See the
+ // descriptions appearing with the "kdu_codestream" interface functions
+ // in "kdu_compressed.h" for an itemized account of these capabilities.
+
+ switch (mode)
+ {
+ case MODE_FAST:
+ mCodeStreamp->set_fast();
+ break;
+ case MODE_RESILIENT:
+ mCodeStreamp->set_resilient();
+ break;
+ case MODE_FUSSY:
+ mCodeStreamp->set_fussy();
+ break;
+ default:
+ llassert(0);
+ mCodeStreamp->set_fast();
+ }
+
+ kdu_dims dims;
+ mCodeStreamp->get_dims(0,dims);
+
+ S32 components = mCodeStreamp->get_num_components();
+
+ if (components >= 3)
+ { // Check that components have consistent dimensions (for PPM file)
+ kdu_dims dims1; mCodeStreamp->get_dims(1,dims1);
+ kdu_dims dims2; mCodeStreamp->get_dims(2,dims2);
+ if ((dims1 != dims) || (dims2 != dims))
+ {
+ llerrs << "Components don't have matching dimensions!" << llendl;
+ }
+ }
+
+ base.setSize(dims.size.x, dims.size.y, components);
+
+ if (!keep_codestream)
+ {
+ mCodeStreamp->destroy();
+ delete mCodeStreamp;
+ mCodeStreamp = NULL;
+ delete mInputp;
+ mInputp = NULL;
+ }
+}
+
+void LLImageJ2CKDU::cleanupCodeStream()
+{
+ delete mInputp;
+ mInputp = NULL;
+
+ delete mDecodeState;
+ mDecodeState = NULL;
+
+ if (mCodeStreamp)
+ {
+ mCodeStreamp->destroy();
+ delete mCodeStreamp;
+ mCodeStreamp = NULL;
+ }
+
+ delete mTPosp;
+ mTPosp = NULL;
+
+ delete mTileIndicesp;
+ mTileIndicesp = NULL;
+}
+
+BOOL LLImageJ2CKDU::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level, int* region)
+{
+ return initDecode(base,raw_image,0.0f,MODE_FAST,0,4,discard_level,region);
+}
+
+BOOL LLImageJ2CKDU::initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size, int precincts_size, int levels)
+{
+ mPrecinctsSize = precincts_size;
+ if (mPrecinctsSize != -1)
+ {
+ mPrecinctsSize = get_lower_power_two(mPrecinctsSize,MAX_PRECINCT_SIZE);
+ mPrecinctsSize = llmax(mPrecinctsSize,MIN_PRECINCT_SIZE);
+ }
+ mBlocksSize = blocks_size;
+ if (mBlocksSize != -1)
+ {
+ mBlocksSize = get_lower_power_two(mBlocksSize,MAX_BLOCK_SIZE);
+ mBlocksSize = llmax(mBlocksSize,MIN_BLOCK_SIZE);
+ if (mPrecinctsSize != -1)
+ {
+ mBlocksSize = llmin(mBlocksSize,mPrecinctsSize); // blocks *must* be smaller than precincts
+ }
+ }
+ mLevels = levels;
+ if (mLevels != 0)
+ {
+ mLevels = llclamp(mLevels,MIN_DECOMPOSITION_LEVELS,MIN_DECOMPOSITION_LEVELS);
+ }
+ return TRUE;
+}
+
+BOOL LLImageJ2CKDU::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, ECodeStreamMode mode, S32 first_channel, S32 max_channel_count, int discard_level, int* region)
+{
+ base.resetLastError();
+
+ // *FIX: kdu calls our callback function if there's an error, and then bombs.
+ // To regain control, we throw an exception, and catch it here.
+ try
+ {
+ base.updateRawDiscardLevel();
+ setupCodeStream(base, TRUE, mode);
+
+ mRawImagep = &raw_image;
+ mCodeStreamp->change_appearance(false, true, false);
+
+ // Apply loading discard level and cropping if required
+ kdu_dims* region_kdu = NULL;
+ if (region != NULL)
+ {
+ region_kdu = new kdu_dims;
+ region_kdu->pos.x = region[0];
+ region_kdu->pos.y = region[1];
+ region_kdu->size.x = region[2] - region[0];
+ region_kdu->size.y = region[3] - region[1];
+ }
+ int discard = (discard_level != -1 ? discard_level : base.getRawDiscardLevel());
+
+ // Apply loading restrictions
+ mCodeStreamp->apply_input_restrictions( first_channel, max_channel_count, discard, 0, region_kdu);
+
+ // Clean-up
+ if (region_kdu)
+ {
+ delete region_kdu;
+ region_kdu = NULL;
+ }
+
+ // Resize raw_image according to the image to be decoded
+ kdu_dims dims; mCodeStreamp->get_dims(0,dims);
+ // *TODO: Use the real number of levels read from the file throughout the code instead of relying on an infered value from dimensions
+ //S32 levels = mCodeStreamp->get_min_dwt_levels();
+ S32 channels = base.getComponents() - first_channel;
+ channels = llmin(channels,max_channel_count);
+ raw_image.resize(dims.size.x, dims.size.y, channels);
+ //llinfos << "j2c image dimension: width = " << dims.size.x << ", height = " << dims.size.y << ", channels = " << channels << ", levels = " << levels << llendl;
+
+ if (!mTileIndicesp)
+ {
+ mTileIndicesp = new kdu_dims;
+ }
+ mCodeStreamp->get_valid_tiles(*mTileIndicesp);
+ if (!mTPosp)
+ {
+ mTPosp = new kdu_coords;
+ mTPosp->y = 0;
+ mTPosp->x = 0;
+ }
+ }
+ catch (const char* msg)
+ {
+ base.setLastError(ll_safe_string(msg));
+ return FALSE;
+ }
+ catch (...)
+ {
+ base.setLastError("Unknown J2C error");
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+
+// Returns TRUE to mean done, whether successful or not.
+BOOL LLImageJ2CKDU::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, S32 first_channel, S32 max_channel_count)
+{
+ ECodeStreamMode mode = MODE_FAST;
+
+ LLTimer decode_timer;
+
+ if (!mCodeStreamp)
+ {
+ if (!initDecode(base, raw_image, decode_time, mode, first_channel, max_channel_count))
+ {
+ // Initializing the J2C decode failed, bail out.
+ cleanupCodeStream();
+ return TRUE; // done
+ }
+ }
+
+ // These can probably be grabbed from what's saved in the class.
+ kdu_dims dims;
+ mCodeStreamp->get_dims(0,dims);
+
+ // Now we are ready to walk through the tiles processing them one-by-one.
+ kdu_byte *buffer = raw_image.getData();
+
+ while (mTPosp->y < mTileIndicesp->size.y)
+ {
+ while (mTPosp->x < mTileIndicesp->size.x)
+ {
+ try
+ {
+ if (!mDecodeState)
+ {
+ kdu_tile tile = mCodeStreamp->open_tile(*(mTPosp)+mTileIndicesp->pos);
+
+ // Find the region of the buffer occupied by this
+ // tile. Note that we have no control over
+ // sub-sampling factors which might have been used
+ // during compression and so it can happen that tiles
+ // (at the image component level) actually have
+ // different dimensions. For this reason, we cannot
+ // figure out the buffer region occupied by a tile
+ // directly from the tile indices. Instead, we query
+ // the highest resolution of the first tile-component
+ // concerning its location and size on the canvas --
+ // the `dims' object already holds the location and
+ // size of the entire image component on the same
+ // canvas coordinate system. Comparing the two tells
+ // us where the current tile is in the buffer.
+ S32 channels = base.getComponents() - first_channel;
+ if (channels > max_channel_count)
+ {
+ channels = max_channel_count;
+ }
+ kdu_resolution res = tile.access_component(0).access_resolution();
+ kdu_dims tile_dims; res.get_dims(tile_dims);
+ kdu_coords offset = tile_dims.pos - dims.pos;
+ int row_gap = channels*dims.size.x; // inter-row separation
+ kdu_byte *buf = buffer + offset.y*row_gap + offset.x*channels;
+ mDecodeState = new LLKDUDecodeState(tile, buf, row_gap);
+ }
+ // Do the actual processing
+ F32 remaining_time = decode_time - decode_timer.getElapsedTimeF32();
+ // This is where we do the actual decode. If we run out of time, return false.
+ if (mDecodeState->processTileDecode(remaining_time, (decode_time > 0.0f)))
+ {
+ delete mDecodeState;
+ mDecodeState = NULL;
+ }
+ else
+ {
+ // Not finished decoding yet.
+ // setLastError("Ran out of time while decoding");
+ return FALSE;
+ }
+ }
+ catch (const char* msg)
+ {
+ base.setLastError(ll_safe_string(msg));
+ base.decodeFailed();
+ cleanupCodeStream();
+ return TRUE; // done
+ }
+ catch (...)
+ {
+ base.setLastError( "Unknown J2C error" );
+ base.decodeFailed();
+ cleanupCodeStream();
+ return TRUE; // done
+ }
+
+
+ mTPosp->x++;
+ }
+ mTPosp->y++;
+ mTPosp->x = 0;
+ }
+
+ cleanupCodeStream();
+
+ return TRUE;
+}
+
+
+BOOL LLImageJ2CKDU::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time, BOOL reversible)
+{
+ // Declare and set simple arguments
+ bool transpose = false;
+ bool vflip = true;
+ bool hflip = false;
+
+ try
+ {
+ // Set up input image files
+ siz_params siz;
+
+ // Should set rate someplace here
+ LLKDUMemIn mem_in(raw_image.getData(),
+ raw_image.getDataSize(),
+ raw_image.getWidth(),
+ raw_image.getHeight(),
+ raw_image.getComponents(),
+ &siz);
+
+ base.setSize(raw_image.getWidth(), raw_image.getHeight(), raw_image.getComponents());
+
+ int num_components = raw_image.getComponents();
+
+ siz.set(Scomponents,0,0,num_components);
+ siz.set(Sdims,0,0,base.getHeight()); // Height of first image component
+ siz.set(Sdims,0,1,base.getWidth()); // Width of first image component
+ siz.set(Sprecision,0,0,8); // Image samples have original bit-depth of 8
+ siz.set(Ssigned,0,0,false); // Image samples are originally unsigned
+
+ kdu_params *siz_ref = &siz;
+ siz_ref->finalize();
+ siz_params transformed_siz; // Use this one to construct code-stream
+ transformed_siz.copy_from(&siz,-1,-1,-1,0,transpose,false,false);
+
+ // Construct the `kdu_codestream' object and parse all remaining arguments
+ U32 max_output_size = base.getWidth()*base.getHeight()*base.getComponents();
+ max_output_size = (max_output_size < 1000 ? 1000 : max_output_size);
+ U8 *output_buffer = new U8[max_output_size];
+ U32 output_size = 0; // Address updated by LLKDUMemTarget to give the final compressed buffer size
+ LLKDUMemTarget output(output_buffer, output_size, max_output_size);
+
+ kdu_codestream codestream;
+ codestream.create(&transformed_siz,&output);
+
+ if (comment_text)
+ {
+ // Set the comments for the codestream
+ kdu_codestream_comment comment = codestream.add_comment();
+ comment.put_text(comment_text);
+ }
+
+ // Set codestream options
+ int num_layer_specs = 0;
+
+ kdu_long layer_bytes[64];
+ U32 max_bytes = 0;
+
+ if (num_components >= 3)
+ {
+ // Note that we always use YCC and not YUV
+ // *TODO: Verify this doesn't screws up reversible textures (like sculpties) as YCC is not reversible but YUV is...
+ set_default_colour_weights(codestream.access_siz());
+ }
+
+ if (reversible)
+ {
+ codestream.access_siz()->parse_string("Creversible=yes");
+ // *TODO: we should use yuv in reversible mode and one level since those images are small.
+ // Don't turn this on now though as both create problems on decoding for the moment
+ //codestream.access_siz()->parse_string("Clevels=1");
+ //codestream.access_siz()->parse_string("Cycc=no");
+ // If we're doing reversible (i.e. lossless compression), assumes we're not using quality layers.
+ // *TODO: this is incorrect and unecessary. Try using the regular layer setting.
+ codestream.access_siz()->parse_string("Clayers=1");
+ num_layer_specs = 1;
+ layer_bytes[0] = 0;
+ }
+ else
+ {
+ // Rate is the argument passed into the LLImageJ2C which
+ // specifies the target compression rate. The default is 8:1.
+ // Possibly if max_bytes < 500, we should just use the default setting?
+ // *TODO: mRate is actually always 8:1 in the viewer. Test different values. Also force to reversible for small (< 500 bytes) textures.
+ if (base.mRate != 0.f)
+ {
+ max_bytes = (U32)(base.mRate*base.getWidth()*base.getHeight()*base.getComponents());
+ }
+ else
+ {
+ max_bytes = (U32)(base.getWidth()*base.getHeight()*base.getComponents()*0.125);
+ }
+
+ const U32 min_bytes = FIRST_PACKET_SIZE;
+ if (max_bytes > min_bytes)
+ {
+ U32 i;
+ // This code is where we specify the target number of bytes for
+ // each layer. Not sure if we should do this for small images
+ // or not. The goal is to have this roughly align with
+ // different quality levels that we decode at.
+ for (i = min_bytes; i < max_bytes; i*=4)
+ {
+ if (i == min_bytes * 4)
+ {
+ i = 2000;
+ }
+ layer_bytes[num_layer_specs] = i;
+ num_layer_specs++;
+ }
+ layer_bytes[num_layer_specs] = max_bytes;
+ num_layer_specs++;
+
+ std::string layer_string = llformat("Clayers=%d",num_layer_specs);
+ codestream.access_siz()->parse_string(layer_string.c_str());
+ }
+ else
+ {
+ layer_bytes[0] = min_bytes;
+ num_layer_specs = 1;
+ std::string layer_string = llformat("Clayers=%d",num_layer_specs);
+ codestream.access_siz()->parse_string(layer_string.c_str());
+ }
+ }
+
+ // Set up data ordering, markers, etc... if precincts or blocks specified
+ if ((mBlocksSize != -1) || (mPrecinctsSize != -1))
+ {
+ if (mPrecinctsSize != -1)
+ {
+ std::string precincts_string = llformat("Cprecincts={%d,%d}",mPrecinctsSize,mPrecinctsSize);
+ codestream.access_siz()->parse_string(precincts_string.c_str());
+ }
+ if (mBlocksSize != -1)
+ {
+ std::string blocks_string = llformat("Cblk={%d,%d}",mBlocksSize,mBlocksSize);
+ codestream.access_siz()->parse_string(blocks_string.c_str());
+ }
+ std::string ordering_string = llformat("Corder=RPCL");
+ codestream.access_siz()->parse_string(ordering_string.c_str());
+ std::string PLT_string = llformat("ORGgen_plt=yes");
+ codestream.access_siz()->parse_string(PLT_string.c_str());
+ std::string Parts_string = llformat("ORGtparts=R");
+ codestream.access_siz()->parse_string(Parts_string.c_str());
+ }
+ if (mLevels != 0)
+ {
+ std::string levels_string = llformat("Clevels=%d",mLevels);
+ codestream.access_siz()->parse_string(levels_string.c_str());
+ }
+
+ codestream.access_siz()->finalize_all();
+ codestream.change_appearance(transpose,vflip,hflip);
+
+ // Now we are ready for sample data processing.
+ kdc_flow_control *tile = new kdc_flow_control(&mem_in,codestream);
+ bool done = false;
+ while (!done)
+ {
+ // Process line by line
+ if (tile->advance_components())
+ {
+ tile->process_components();
+ }
+ else
+ {
+ done = true;
+ }
+ }
+
+ // Produce the compressed output
+ codestream.flush(layer_bytes,num_layer_specs);
+
+ // Cleanup
+ delete tile;
+ codestream.destroy();
+
+ // Now that we're done encoding, create the new data buffer for the compressed
+ // image and stick it there.
+ base.copyData(output_buffer, output_size);
+ base.updateData(); // set width, height
+ delete[] output_buffer;
+ }
+ catch(const char* msg)
+ {
+ base.setLastError(ll_safe_string(msg));
+ return FALSE;
+ }
+ catch( ... )
+ {
+ base.setLastError( "Unknown J2C error" );
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+BOOL LLImageJ2CKDU::getMetadata(LLImageJ2C &base)
+{
+ // *FIX: kdu calls our callback function if there's an error, and
+ // then bombs. To regain control, we throw an exception, and
+ // catch it here.
+ try
+ {
+ setupCodeStream(base, FALSE, MODE_FAST);
+ return TRUE;
+ }
+ catch (const char* msg)
+ {
+ base.setLastError(ll_safe_string(msg));
+ return FALSE;
+ }
+ catch (...)
+ {
+ base.setLastError( "Unknown J2C error" );
+ return FALSE;
+ }
+}
+
+void set_default_colour_weights(kdu_params *siz)
+{
+ kdu_params *cod = siz->access_cluster(COD_params);
+ assert(cod != NULL);
+
+ bool can_use_ycc = true;
+ bool rev0 = false;
+ int depth0 = 0, sub_x0 = 1, sub_y0 = 1;
+ for (int c = 0; c < 3; c++)
+ {
+ int depth = 0; siz->get(Sprecision,c,0,depth);
+ int sub_y = 1; siz->get(Ssampling,c,0,sub_y);
+ int sub_x = 1; siz->get(Ssampling,c,1,sub_x);
+ kdu_params *coc = cod->access_relation(-1,c);
+ bool rev = false; coc->get(Creversible,0,0,rev);
+ if (c == 0)
+ {
+ rev0 = rev; depth0 = depth; sub_x0 = sub_x; sub_y0 = sub_y;
+ }
+ else if ((rev != rev0) || (depth != depth0) ||
+ (sub_x != sub_x0) || (sub_y != sub_y0))
+ {
+ can_use_ycc = false;
+ }
+ }
+ if (!can_use_ycc)
+ {
+ return;
+ }
+
+ bool use_ycc;
+ if (!cod->get(Cycc,0,0,use_ycc))
+ {
+ cod->set(Cycc,0,0,use_ycc=true);
+ }
+ if (!use_ycc)
+ {
+ return;
+ }
+ float weight;
+ if (cod->get(Clev_weights,0,0,weight) || cod->get(Cband_weights,0,0,weight))
+ {
+ // Weights already specified explicitly -> nothing to do
+ return;
+ }
+
+ // These example weights are adapted from numbers generated by Marcus Nadenau
+ // at EPFL, for a viewing distance of 15 cm and a display resolution of
+ // 300 DPI.
+
+ cod->parse_string("Cband_weights:C0="
+ "{0.0901},{0.2758},{0.2758},"
+ "{0.7018},{0.8378},{0.8378},{1}");
+ cod->parse_string("Cband_weights:C1="
+ "{0.0263},{0.0863},{0.0863},"
+ "{0.1362},{0.2564},{0.2564},"
+ "{0.3346},{0.4691},{0.4691},"
+ "{0.5444},{0.6523},{0.6523},"
+ "{0.7078},{0.7797},{0.7797},{1}");
+ cod->parse_string("Cband_weights:C2="
+ "{0.0773},{0.1835},{0.1835},"
+ "{0.2598},{0.4130},{0.4130},"
+ "{0.5040},{0.6464},{0.6464},"
+ "{0.7220},{0.8254},{0.8254},"
+ "{0.8769},{0.9424},{0.9424},{1}");
+}
+
+/******************************************************************************/
+/* transfer_bytes */
+/******************************************************************************/
+
+void transfer_bytes(kdu_byte *dest, kdu_line_buf &src, int gap, int precision)
+/* Transfers source samples from the supplied line buffer into the output
+byte buffer, spacing successive output samples apart by `gap' bytes
+(to allow for interleaving of colour components). The function performs
+all necessary level shifting, type conversion, rounding and truncation. */
+{
+ int width = src.get_width();
+ if (src.get_buf32() != NULL)
+ { // Decompressed samples have a 32-bit representation (integer or float)
+ assert(precision >= 8); // Else would have used 16 bit representation
+ kdu_sample32 *sp = src.get_buf32();
+ if (!src.is_absolute())
+ { // Transferring normalized floating point data.
+ float scale16 = (float)(1<<16);
+ kdu_int32 val;
+
+ for (; width > 0; width--, sp++, dest+=gap)
+ {
+ val = (kdu_int32)(sp->fval*scale16);
+ val = (val+128)>>8; // May be faster than true rounding
+ val += 128;
+ if (val & ((-1)<<8))
+ {
+ val = (val < 0 ? 0 : 255);
+ }
+ *dest = (kdu_byte) val;
+ }
+ }
+ else
+ { // Transferring 32-bit absolute integers.
+ kdu_int32 val;
+ kdu_int32 downshift = precision-8;
+ kdu_int32 offset = (1<<downshift)>>1;
+
+ for (; width > 0; width--, sp++, dest+=gap)
+ {
+ val = sp->ival;
+ val = (val+offset)>>downshift;
+ val += 128;
+ if (val & ((-1)<<8))
+ {
+ val = (val < 0 ? 0 : 255);
+ }
+ *dest = (kdu_byte) val;
+ }
+ }
+ }
+ else
+ { // Source data is 16 bits.
+ kdu_sample16 *sp = src.get_buf16();
+ if (!src.is_absolute())
+ { // Transferring 16-bit fixed point quantities
+ kdu_int16 val;
+
+ if (precision >= 8)
+ { // Can essentially ignore the bit-depth.
+ for (; width > 0; width--, sp++, dest+=gap)
+ {
+ val = sp->ival;
+ val += (1<<(KDU_FIX_POINT-8))>>1;
+ val >>= (KDU_FIX_POINT-8);
+ val += 128;
+ if (val & ((-1)<<8))
+ {
+ val = (val < 0 ? 0 : 255);
+ }
+ *dest = (kdu_byte) val;
+ }
+ }
+ else
+ { // Need to force zeros into one or more least significant bits.
+ kdu_int16 downshift = KDU_FIX_POINT-precision;
+ kdu_int16 upshift = 8-precision;
+ kdu_int16 offset = 1<<(downshift-1);
+
+ for (; width > 0; width--, sp++, dest+=gap)
+ {
+ val = sp->ival;
+ val = (val+offset)>>downshift;
+ val <<= upshift;
+ val += 128;
+ if (val & ((-1)<<8))
+ {
+ val = (val < 0 ? 0 : 256 - (1<<upshift));
+ }
+ *dest = (kdu_byte) val;
+ }
+ }
+ }
+ else
+ { // Transferring 16-bit absolute integers.
+ kdu_int16 val;
+
+ if (precision >= 8)
+ {
+ kdu_int16 downshift = precision-8;
+ kdu_int16 offset = (1<<downshift)>>1;
+
+ for (; width > 0; width--, sp++, dest+=gap)
+ {
+ val = sp->ival;
+ val = (val+offset)>>downshift;
+ val += 128;
+ if (val & ((-1)<<8))
+ {
+ val = (val < 0 ? 0 : 255);
+ }
+ *dest = (kdu_byte) val;
+ }
+ }
+ else
+ {
+ kdu_int16 upshift = 8-precision;
+
+ for (; width > 0; width--, sp++, dest+=gap)
+ {
+ val = sp->ival;
+ val <<= upshift;
+ val += 128;
+ if (val & ((-1)<<8))
+ {
+ val = (val < 0 ? 0 : 256 - (1<<upshift));
+ }
+ *dest = (kdu_byte) val;
+ }
+ }
+ }
+ }
+}
+
+LLKDUDecodeState::LLKDUDecodeState(kdu_tile tile, kdu_byte *buf, S32 row_gap)
+{
+ S32 c;
+
+ mTile = tile;
+ mBuf = buf;
+ mRowGap = row_gap;
+
+ mNumComponents = tile.get_num_components();
+
+ llassert(mNumComponents <= 4);
+ mUseYCC = tile.get_ycc();
+
+ for (c = 0; c < 4; ++c)
+ {
+ mReversible[c] = false;
+ mBitDepths[c] = 0;
+ }
+
+ // Open tile-components and create processing engines and resources
+ for (c = 0; c < mNumComponents; c++)
+ {
+ mComps[c] = mTile.access_component(c);
+ mReversible[c] = mComps[c].get_reversible();
+ mBitDepths[c] = mComps[c].get_bit_depth();
+ kdu_resolution res = mComps[c].access_resolution(); // Get top resolution
+ kdu_dims comp_dims; res.get_dims(comp_dims);
+ if (c == 0)
+ {
+ mDims = comp_dims;
+ }
+ else
+ {
+ llassert(mDims == comp_dims); // Safety check; the caller has ensured this
+ }
+ bool use_shorts = (mComps[c].get_bit_depth(true) <= 16);
+ mLines[c].pre_create(&mAllocator,mDims.size.x,mReversible[c],use_shorts);
+ if (res.which() == 0) // No DWT levels used
+ {
+ mEngines[c] = kdu_decoder(res.access_subband(LL_BAND),&mAllocator,use_shorts);
+ }
+ else
+ {
+ mEngines[c] = kdu_synthesis(res,&mAllocator,use_shorts);
+ }
+ }
+ mAllocator.finalize(); // Actually creates buffering resources
+ for (c = 0; c < mNumComponents; c++)
+ {
+ mLines[c].create(); // Grabs resources from the allocator.
+ }
+}
+
+LLKDUDecodeState::~LLKDUDecodeState()
+{
+ // Cleanup
+ for (S32 c = 0; c < mNumComponents; c++)
+ {
+ mEngines[c].destroy(); // engines are interfaces; no default destructors
+ }
+ mTile.close();
+}
+
+BOOL LLKDUDecodeState::processTileDecode(F32 decode_time, BOOL limit_time)
+/* Decompresses a tile, writing the data into the supplied byte buffer.
+The buffer contains interleaved image components, if there are any.
+Although you may think of the buffer as belonging entirely to this tile,
+the `buf' pointer may actually point into a larger buffer representing
+multiple tiles. For this reason, `row_gap' is needed to identify the
+separation between consecutive rows in the real buffer. */
+{
+ S32 c;
+ // Now walk through the lines of the buffer, recovering them from the
+ // relevant tile-component processing engines.
+
+ LLTimer decode_timer;
+ while (mDims.size.y--)
+ {
+ for (c = 0; c < mNumComponents; c++)
+ {
+ mEngines[c].pull(mLines[c],true);
+ }
+ if ((mNumComponents >= 3) && mUseYCC)
+ {
+ kdu_convert_ycc_to_rgb(mLines[0],mLines[1],mLines[2]);
+ }
+ for (c = 0; c < mNumComponents; c++)
+ {
+ transfer_bytes(mBuf+c,mLines[c],mNumComponents,mBitDepths[c]);
+ }
+ mBuf += mRowGap;
+ if (mDims.size.y % 10)
+ {
+ if (limit_time && decode_timer.getElapsedTimeF32() > decode_time)
+ {
+ return FALSE;
+ }
+ }
+ }
+ return TRUE;
+}
+
+// kdc_flow_control
+
+kdc_flow_control::kdc_flow_control (kdu_image_in_base *img_in, kdu_codestream codestream)
+{
+ int n;
+
+ this->codestream = codestream;
+ codestream.get_valid_tiles(valid_tile_indices);
+ tile_idx = valid_tile_indices.pos;
+ tile = codestream.open_tile(tile_idx,NULL);
+
+ // Set up the individual components
+ num_components = codestream.get_num_components(true);
+ components = new kdc_component_flow_control[num_components];
+ count_delta = 0;
+ kdc_component_flow_control *comp = components;
+ for (n = 0; n < num_components; n++, comp++)
+ {
+ comp->line = NULL;
+ comp->reader = img_in;
+ kdu_coords subsampling;
+ codestream.get_subsampling(n,subsampling,true);
+ kdu_dims dims;
+ codestream.get_tile_dims(tile_idx,n,dims,true);
+ comp->vert_subsampling = subsampling.y;
+ if ((n == 0) || (comp->vert_subsampling < count_delta))
+ {
+ count_delta = comp->vert_subsampling;
+ }
+ comp->ratio_counter = 0;
+ comp->remaining_lines = comp->initial_lines = dims.size.y;
+ }
+ assert(num_components >= 0);
+
+ tile.set_components_of_interest(num_components);
+ max_buffer_memory = engine.create(codestream,tile,false,NULL,false,1,NULL,NULL,false);
+}
+
+kdc_flow_control::~kdc_flow_control()
+{
+ if (components != NULL)
+ {
+ delete[] components;
+ }
+ if (engine.exists())
+ {
+ engine.destroy();
+ }
+}
+
+bool kdc_flow_control::advance_components()
+{
+ bool found_line = false;
+ while (!found_line)
+ {
+ bool all_done = true;
+ kdc_component_flow_control *comp = components;
+ for (int n = 0; n < num_components; n++, comp++)
+ {
+ assert(comp->ratio_counter >= 0);
+ if (comp->remaining_lines > 0)
+ {
+ all_done = false;
+ comp->ratio_counter -= count_delta;
+ if (comp->ratio_counter < 0)
+ {
+ found_line = true;
+ comp->line = engine.exchange_line(n,NULL,NULL);
+ assert(comp->line != NULL);
+ if (comp->line->get_width())
+ {
+ comp->reader->get(n,*(comp->line),0);
+ }
+ }
+ }
+ }
+ if (all_done)
+ {
+ return false;
+ }
+ }
+ return true;
+}
+
+void kdc_flow_control::process_components()
+{
+ kdc_component_flow_control *comp = components;
+ for (int n = 0; n < num_components; n++, comp++)
+ {
+ if (comp->ratio_counter < 0)
+ {
+ comp->ratio_counter += comp->vert_subsampling;
+ assert(comp->ratio_counter >= 0);
+ assert(comp->remaining_lines > 0);
+ comp->remaining_lines--;
+ assert(comp->line != NULL);
+ engine.exchange_line(n,comp->line,NULL);
+ comp->line = NULL;
+ }
+ }
+}
diff --git a/indra/llkdu/llimagej2ckdu.h b/indra/llkdu/llimagej2ckdu.h
new file mode 100644
index 0000000000..1489dbf704
--- /dev/null
+++ b/indra/llkdu/llimagej2ckdu.h
@@ -0,0 +1,95 @@
+/**
+ * @file llimagej2ckdu.h
+ * @brief This is an implementation of JPEG2000 encode/decode using Kakadu
+ *
+ * $LicenseInfo:firstyear=2010&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLIMAGEJ2CKDU_H
+#define LL_LLIMAGEJ2CKDU_H
+
+#include "llimagej2c.h"
+
+//
+// KDU core header files
+//
+#include "kdu_elementary.h"
+#include "kdu_messaging.h"
+#include "kdu_params.h"
+#include "kdu_compressed.h"
+#include "kdu_sample_processing.h"
+
+class LLKDUDecodeState;
+class LLKDUMemSource;
+
+class LLImageJ2CKDU : public LLImageJ2CImpl
+{
+public:
+ enum ECodeStreamMode
+ {
+ MODE_FAST = 0,
+ MODE_RESILIENT = 1,
+ MODE_FUSSY = 2
+ };
+ LLImageJ2CKDU();
+ virtual ~LLImageJ2CKDU();
+
+protected:
+ /*virtual*/ BOOL getMetadata(LLImageJ2C &base);
+ /*virtual*/ BOOL decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, S32 first_channel, S32 max_channel_count);
+ /*virtual*/ BOOL encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time=0.0,
+ BOOL reversible=FALSE);
+ /*virtual*/ BOOL initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level = -1, int* region = NULL);
+ /*virtual*/ BOOL initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size = -1, int precincts_size = -1, int levels = 0);
+
+private:
+ BOOL initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, ECodeStreamMode mode, S32 first_channel, S32 max_channel_count, int discard_level = -1, int* region = NULL);
+ void setupCodeStream(LLImageJ2C &base, BOOL keep_codestream, ECodeStreamMode mode);
+ void cleanupCodeStream();
+
+ // Encode variable
+ LLKDUMemSource *mInputp;
+ kdu_codestream *mCodeStreamp;
+ kdu_coords *mTPosp; // tile position
+ kdu_dims *mTileIndicesp;
+ int mBlocksSize;
+ int mPrecinctsSize;
+ int mLevels;
+
+ // Temporary variables for in-progress decodes...
+ LLImageRaw *mRawImagep;
+ LLKDUDecodeState *mDecodeState;
+};
+
+#if LL_WINDOWS
+# define LLSYMEXPORT __declspec(dllexport)
+#elif LL_LINUX
+# define LLSYMEXPORT __attribute__ ((visibility("default")))
+#else
+# define LLSYMEXPORT
+#endif
+
+extern "C" LLSYMEXPORT const char* engineInfoLLImageJ2CKDU();
+extern "C" LLSYMEXPORT LLImageJ2CKDU* createLLImageJ2CKDU();
+extern "C" LLSYMEXPORT void destroyLLImageJ2CKDU(LLImageJ2CKDU* kdu);
+
+#endif
diff --git a/indra/llkdu/llkdumem.cpp b/indra/llkdu/llkdumem.cpp
new file mode 100644
index 0000000000..0347475559
--- /dev/null
+++ b/indra/llkdu/llkdumem.cpp
@@ -0,0 +1,196 @@
+ /**
+ * @file llkdumem.cpp
+ * @brief Helper class for kdu memory management
+ *
+ * $LicenseInfo:firstyear=2010&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+#include "llkdumem.h"
+#include "llerror.h"
+
+#if defined(LL_WINDOWS)
+# pragma warning(disable: 4702) // unreachable code
+#endif
+
+LLKDUMemIn::LLKDUMemIn(const U8 *data,
+ const U32 size,
+ const U16 width,
+ const U16 height,
+ const U8 in_num_components,
+ siz_params *siz)
+{
+ U8 n;
+
+ first_comp_idx = 0;
+ rows = height;
+ cols = width;
+ num_components = in_num_components;
+ alignment_bytes = 0;
+
+ for (n = 0; n < 3; ++n)
+ {
+ precision[n] = 0;
+ }
+
+ for (n = 0; n < num_components; ++n)
+ {
+ siz->set(Sdims,n,0,rows);
+ siz->set(Sdims,n,1,cols);
+ siz->set(Ssigned,n,0,false);
+ siz->set(Sprecision,n,0,8);
+ }
+ incomplete_lines = NULL;
+ free_lines = NULL;
+ num_unread_rows = rows;
+
+ mData = data;
+ mDataSize = size;
+ mCurPos = 0;
+}
+
+LLKDUMemIn::~LLKDUMemIn()
+{
+ if ((num_unread_rows > 0) || (incomplete_lines != NULL))
+ {
+ kdu_warning w;
+ w << "Not all rows of image components "
+ << first_comp_idx << " through "
+ << first_comp_idx+num_components-1
+ << " were consumed!";
+ }
+ image_line_buf *tmp;
+ while ((tmp=incomplete_lines) != NULL)
+ {
+ incomplete_lines = tmp->next;
+ delete tmp;
+ }
+ while ((tmp=free_lines) != NULL)
+ {
+ free_lines = tmp->next;
+ delete tmp;
+ }
+}
+
+
+bool LLKDUMemIn::get(int comp_idx, kdu_line_buf &line, int x_tnum)
+{
+ int idx = comp_idx - this->first_comp_idx;
+ assert((idx >= 0) && (idx < num_components));
+ x_tnum = x_tnum*num_components+idx;
+ image_line_buf *scan, *prev=NULL;
+ for (scan = incomplete_lines; scan != NULL; prev = scan, scan = scan->next)
+ {
+ assert(scan->next_x_tnum >= x_tnum);
+ if (scan->next_x_tnum == x_tnum)
+ {
+ break;
+ }
+ }
+ if (scan == NULL)
+ { // Need to read a new image line.
+ assert(x_tnum == 0); // Must consume in very specific order.
+ if (num_unread_rows == 0)
+ {
+ return false;
+ }
+ if ((scan = free_lines) == NULL)
+ {
+ scan = new image_line_buf(cols+3,num_components);
+ }
+ free_lines = scan->next;
+ if (prev == NULL)
+ {
+ incomplete_lines = scan;
+ }
+ else
+ {
+ prev->next = scan;
+ }
+
+ // Copy from image buffer into scan.
+ memcpy(scan->buf, mData+mCurPos, cols*num_components);
+ mCurPos += cols*num_components;
+
+ num_unread_rows--;
+ scan->accessed_samples = 0;
+ scan->next_x_tnum = 0;
+ }
+
+ assert((cols-scan->accessed_samples) >= line.get_width());
+
+ int comp_offset = idx;
+ kdu_byte *sp = scan->buf+num_components*scan->accessed_samples + comp_offset;
+ int n=line.get_width();
+
+ if (line.get_buf32() != NULL)
+ {
+ kdu_sample32 *dp = line.get_buf32();
+ if (line.is_absolute())
+ { // 32-bit absolute integers
+ for (; n > 0; n--, sp+=num_components, dp++)
+ {
+ dp->ival = ((kdu_int32)(*sp)) - 128;
+ }
+ }
+ else
+ { // true 32-bit floats
+ for (; n > 0; n--, sp+=num_components, dp++)
+ {
+ dp->fval = (((float)(*sp)) / 256.0F) - 0.5F;
+ }
+ }
+ }
+ else
+ {
+ kdu_sample16 *dp = line.get_buf16();
+ if (line.is_absolute())
+ { // 16-bit absolute integers
+ for (; n > 0; n--, sp+=num_components, dp++)
+ {
+ dp->ival = ((kdu_int16)(*sp)) - 128;
+ }
+ }
+ else
+ { // 16-bit normalized representation.
+ for (; n > 0; n--, sp+=num_components, dp++)
+ {
+ dp->ival = (((kdu_int16)(*sp)) - 128) << (KDU_FIX_POINT-8);
+ }
+ }
+ }
+
+ scan->next_x_tnum++;
+ if (idx == (num_components-1))
+ {
+ scan->accessed_samples += line.get_width();
+ }
+ if (scan->accessed_samples == cols)
+ { // Send empty line to free list.
+ assert(scan == incomplete_lines);
+ incomplete_lines = scan->next;
+ scan->next = free_lines;
+ free_lines = scan;
+ }
+
+ return true;
+}
diff --git a/indra/llkdu/llkdumem.h b/indra/llkdu/llkdumem.h
new file mode 100644
index 0000000000..9d923fc367
--- /dev/null
+++ b/indra/llkdu/llkdumem.h
@@ -0,0 +1,145 @@
+/**
+ * @file llkdumem.h
+ * @brief Helper class for kdu memory management
+ *
+ * $LicenseInfo:firstyear=2010&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLKDUMEM_H
+#define LL_LLKDUMEM_H
+
+// Support classes for reading and writing from memory buffers in KDU
+#include "kdu_image.h"
+#include "kdu_elementary.h"
+#include "kdu_messaging.h"
+#include "kdu_params.h"
+#include "kdu_compressed.h"
+#include "kdu_sample_processing.h"
+#include "image_local.h"
+#include "stdtypes.h"
+
+class LLKDUMemSource: public kdu_compressed_source
+{
+public:
+ LLKDUMemSource(U8 *input_buffer, U32 size)
+ {
+ mData = input_buffer;
+ mSize = size;
+ mCurPos = 0;
+ }
+
+ ~LLKDUMemSource()
+ {
+ }
+
+ int read(kdu_byte *buf, int num_bytes)
+ {
+ U32 num_out;
+ num_out = num_bytes;
+
+ if ((mSize - mCurPos) < (U32)num_bytes)
+ {
+ num_out = mSize -mCurPos;
+ }
+ memcpy(buf, mData + mCurPos, num_out);
+ mCurPos += num_out;
+ return num_out;
+ }
+
+ void reset()
+ {
+ mCurPos = 0;
+ }
+
+private:
+ U8 *mData;
+ U32 mSize;
+ U32 mCurPos;
+};
+
+class LLKDUMemTarget: public kdu_compressed_target
+{
+public:
+ LLKDUMemTarget(U8 *output_buffer, U32 &output_size, const U32 buffer_size)
+ {
+ mData = output_buffer;
+ mSize = buffer_size;
+ mCurPos = 0;
+ mOutputSize = &output_size;
+ }
+
+ ~LLKDUMemTarget()
+ {
+ }
+
+ bool write(const kdu_byte *buf, int num_bytes)
+ {
+ U32 num_out;
+ num_out = num_bytes;
+
+ if ((mSize - mCurPos) < (U32)num_bytes)
+ {
+ num_out = mSize - mCurPos;
+ memcpy(mData + mCurPos, buf, num_out);
+ return false;
+ }
+ memcpy(mData + mCurPos, buf, num_out);
+ mCurPos += num_out;
+ *mOutputSize = mCurPos;
+ return true;
+ }
+
+private:
+ U8 *mData;
+ U32 mSize;
+ U32 mCurPos;
+ U32 *mOutputSize;
+};
+
+class LLKDUMemIn : public kdu_image_in_base
+{
+public:
+ LLKDUMemIn(const U8 *data,
+ const U32 size,
+ const U16 rows,
+ const U16 cols,
+ U8 in_num_components,
+ siz_params *siz);
+ ~LLKDUMemIn();
+
+ bool get(int comp_idx, kdu_line_buf &line, int x_tnum);
+
+private:
+ const U8 *mData;
+ int first_comp_idx;
+ int num_components;
+ int rows, cols;
+ int alignment_bytes; // Number of 0's at end of each line.
+ int precision[3];
+ image_line_buf *incomplete_lines; // Each "sample" represents a full pixel
+ image_line_buf *free_lines;
+ int num_unread_rows;
+
+ U32 mCurPos;
+ U32 mDataSize;
+};
+#endif
diff --git a/indra/llkdu/tests/llimagej2ckdu_test.cpp b/indra/llkdu/tests/llimagej2ckdu_test.cpp
new file mode 100644
index 0000000000..ab60ab6d50
--- /dev/null
+++ b/indra/llkdu/tests/llimagej2ckdu_test.cpp
@@ -0,0 +1,249 @@
+/**
+ * @file llimagej2ckdu_test.cpp
+ * @author Merov Linden
+ * @date 2010-12-17
+ *
+ * $LicenseInfo:firstyear=2006&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+// Class to test
+#include "llimagej2ckdu.h"
+#include "llkdumem.h"
+// Tut header
+#include "lltut.h"
+
+// -------------------------------------------------------------------------------------------
+// Stubbing: Declarations required to link and run the class being tested
+// Notes:
+// * Add here stubbed implementation of the few classes and methods used in the class to be tested
+// * Add as little as possible (let the link errors guide you)
+// * Do not make any assumption as to how those classes or methods work (i.e. don't copy/paste code)
+// * A simulator for a class can be implemented here. Please comment and document thoroughly.
+
+// End Stubbing
+// -------------------------------------------------------------------------------------------
+// Stubb the LL Image Classes
+LLImageRaw::LLImageRaw() { }
+LLImageRaw::~LLImageRaw() { }
+U8* LLImageRaw::allocateData(S32 ) { return NULL; }
+void LLImageRaw::deleteData() { }
+U8* LLImageRaw::reallocateData(S32 ) { return NULL; }
+BOOL LLImageRaw::resize(U16, U16, S8) { return TRUE; } // this method always returns TRUE...
+
+LLImageBase::LLImageBase()
+: mData(NULL),
+mDataSize(0),
+mWidth(0),
+mHeight(0),
+mComponents(0),
+mBadBufferAllocation(false),
+mAllowOverSize(false),
+mMemType(LLMemType::MTYPE_IMAGEBASE)
+{ }
+LLImageBase::~LLImageBase() { }
+U8* LLImageBase::allocateData(S32 ) { return NULL; }
+void LLImageBase::deleteData() { }
+void LLImageBase::dump() { }
+const U8* LLImageBase::getData() const { return NULL; }
+U8* LLImageBase::getData() { return NULL; }
+U8* LLImageBase::reallocateData(S32 ) { return NULL; }
+void LLImageBase::sanityCheck() { }
+void LLImageBase::setSize(S32 , S32 , S32 ) { }
+
+LLImageJ2CImpl::~LLImageJ2CImpl() { }
+
+LLImageFormatted::LLImageFormatted(S8 ) { }
+LLImageFormatted::~LLImageFormatted() { }
+U8* LLImageFormatted::allocateData(S32 ) { return NULL; }
+S32 LLImageFormatted::calcDataSize(S32 ) { return 0; }
+S32 LLImageFormatted::calcDiscardLevelBytes(S32 ) { return 0; }
+BOOL LLImageFormatted::decodeChannels(LLImageRaw*, F32, S32, S32) { return FALSE; }
+BOOL LLImageFormatted::copyData(U8 *, S32) { return TRUE; } // this method always returns TRUE...
+void LLImageFormatted::deleteData() { }
+void LLImageFormatted::dump() { }
+U8* LLImageFormatted::reallocateData(S32 ) { return NULL; }
+void LLImageFormatted::resetLastError() { }
+void LLImageFormatted::sanityCheck() { }
+void LLImageFormatted::setLastError(const std::string& , const std::string& ) { }
+
+LLImageJ2C::LLImageJ2C() : LLImageFormatted(IMG_CODEC_J2C) { }
+LLImageJ2C::~LLImageJ2C() { }
+S32 LLImageJ2C::calcDataSize(S32 ) { return 0; }
+S32 LLImageJ2C::calcDiscardLevelBytes(S32 ) { return 0; }
+S32 LLImageJ2C::calcHeaderSize() { return 0; }
+BOOL LLImageJ2C::decode(LLImageRaw*, F32) { return FALSE; }
+BOOL LLImageJ2C::decodeChannels(LLImageRaw*, F32, S32, S32 ) { return FALSE; }
+void LLImageJ2C::decodeFailed() { }
+BOOL LLImageJ2C::encode(const LLImageRaw*, F32) { return FALSE; }
+S8 LLImageJ2C::getRawDiscardLevel() { return 0; }
+void LLImageJ2C::resetLastError() { }
+void LLImageJ2C::setLastError(const std::string&, const std::string&) { }
+BOOL LLImageJ2C::updateData() { return FALSE; }
+void LLImageJ2C::updateRawDiscardLevel() { }
+
+LLKDUMemIn::LLKDUMemIn(const U8*, const U32, const U16, const U16, const U8, siz_params*) { }
+LLKDUMemIn::~LLKDUMemIn() { }
+bool LLKDUMemIn::get(int, kdu_line_buf&, int) { return false; }
+
+// Stub Kakadu Library calls
+kdu_tile_comp kdu_tile::access_component(int ) { kdu_tile_comp a; return a; }
+void kdu_tile::close(kdu_thread_env* ) { }
+int kdu_tile::get_num_components() { return 0; }
+bool kdu_tile::get_ycc() { return false; }
+void kdu_tile::set_components_of_interest(int , const int* ) { }
+kdu_resolution kdu_tile_comp::access_resolution() { kdu_resolution a; return a; }
+int kdu_tile_comp::get_bit_depth(bool ) { return 8; }
+bool kdu_tile_comp::get_reversible() { return false; }
+kdu_subband kdu_resolution::access_subband(int ) { kdu_subband a; return a; }
+void kdu_resolution::get_dims(kdu_dims& ) { }
+int kdu_resolution::which() { return 0; }
+kdu_decoder::kdu_decoder(kdu_subband , kdu_sample_allocator*, bool , float, int, kdu_thread_env*, kdu_thread_queue*) { }
+kdu_synthesis::kdu_synthesis(kdu_resolution, kdu_sample_allocator*, bool, float, kdu_thread_env*, kdu_thread_queue*) { }
+kdu_params::kdu_params(const char*, bool, bool, bool, bool, bool) { }
+kdu_params::~kdu_params() { }
+void kdu_params::set(const char* , int , int , bool ) { }
+void kdu_params::set(const char* , int , int , int ) { }
+void kdu_params::finalize_all(bool ) { }
+void kdu_params::copy_from(kdu_params*, int, int, int, int, int, bool, bool, bool) { }
+bool kdu_params::parse_string(const char*) { return false; }
+bool kdu_params::get(const char*, int, int, bool&, bool, bool, bool) { return false; }
+bool kdu_params::get(const char*, int, int, float&, bool, bool, bool) { return false; }
+bool kdu_params::get(const char*, int, int, int&, bool, bool, bool) { return false; }
+kdu_params* kdu_params::access_relation(int, int, int, bool) { return NULL; }
+kdu_params* kdu_params::access_cluster(const char*) { return NULL; }
+void kdu_codestream::set_fast() { }
+void kdu_codestream::set_fussy() { }
+void kdu_codestream::get_dims(int, kdu_dims&, bool ) { }
+int kdu_codestream::get_min_dwt_levels() { return 5; }
+void kdu_codestream::change_appearance(bool, bool, bool) { }
+void kdu_codestream::get_tile_dims(kdu_coords, int, kdu_dims&, bool ) { }
+void kdu_codestream::destroy() { }
+void kdu_codestream::collect_timing_stats(int ) { }
+void kdu_codestream::set_max_bytes(kdu_long, bool, bool ) { }
+void kdu_codestream::get_valid_tiles(kdu_dims& ) { }
+void kdu_codestream::create(siz_params*, kdu_compressed_target*, kdu_dims*, int, kdu_long ) { }
+void kdu_codestream::create(kdu_compressed_source*, kdu_thread_env*) { }
+void kdu_codestream::apply_input_restrictions( int, int, int, int, kdu_dims*, kdu_component_access_mode ) { }
+void kdu_codestream::get_subsampling(int , kdu_coords&, bool ) { }
+void kdu_codestream::flush(kdu_long *, int , kdu_uint16 *, bool, bool, double, kdu_thread_env*) { }
+void kdu_codestream::set_resilient(bool ) { }
+int kdu_codestream::get_num_components(bool ) { return 0; }
+siz_params* kdu_codestream::access_siz() { return NULL; }
+kdu_tile kdu_codestream::open_tile(kdu_coords , kdu_thread_env* ) { kdu_tile a; return a; }
+kdu_codestream_comment kdu_codestream::add_comment() { kdu_codestream_comment a; return a; }
+bool kdu_codestream_comment::put_text(const char*) { return false; }
+void kdu_customize_warnings(kdu_message*) { }
+void kdu_customize_errors(kdu_message*) { }
+void kdu_convert_ycc_to_rgb(kdu_line_buf&, kdu_line_buf&, kdu_line_buf&, int) { }
+kdu_long kdu_multi_analysis::create(kdu_codestream, kdu_tile, bool, kdu_roi_image*, bool, int, kdu_thread_env*, kdu_thread_queue*, bool ) { kdu_long a = 0; return a; }
+siz_params::siz_params() : kdu_params(NULL, false, false, false, false, false) { }
+void siz_params::finalize(bool ) { }
+void siz_params::copy_with_xforms(kdu_params*, int, int, bool, bool, bool) { }
+int siz_params::write_marker_segment(kdu_output*, kdu_params*, int) { return 0; }
+bool siz_params::check_marker_segment(kdu_uint16, int, kdu_byte a[], int&) { return false; }
+bool siz_params::read_marker_segment(kdu_uint16, int, kdu_byte a[], int) { return false; }
+
+// -------------------------------------------------------------------------------------------
+// TUT
+// -------------------------------------------------------------------------------------------
+
+namespace tut
+{
+ // Test wrapper declarations
+ struct llimagej2ckdu_test
+ {
+ // Derived test class
+ class LLTestImageJ2CKDU : public LLImageJ2CKDU
+ {
+ public:
+ // Provides public access to some protected methods for testing
+ BOOL callGetMetadata(LLImageJ2C &base) { return getMetadata(base); }
+ BOOL callDecodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, S32 first_channel, S32 max_channel_count)
+ {
+ return decodeImpl(base, raw_image, decode_time, first_channel, max_channel_count);
+ }
+ BOOL callEncodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text)
+ {
+ return encodeImpl(base, raw_image, comment_text);
+ }
+ };
+ // Instance to be tested
+ LLTestImageJ2CKDU* mImage;
+
+ // Constructor and destructor of the test wrapper
+ llimagej2ckdu_test()
+ {
+ mImage = new LLTestImageJ2CKDU;
+ }
+ ~llimagej2ckdu_test()
+ {
+ delete mImage;
+ }
+ };
+
+ // Tut templating thingamagic: test group, object and test instance
+ typedef test_group<llimagej2ckdu_test> llimagej2ckdu_t;
+ typedef llimagej2ckdu_t::object llimagej2ckdu_object_t;
+ tut::llimagej2ckdu_t tut_llimagej2ckdu("LLImageJ2CKDU");
+
+ // ---------------------------------------------------------------------------------------
+ // Test functions
+ // Notes:
+ // * Test as many as you possibly can without requiring a full blown simulation of everything
+ // * The tests are executed in sequence so the test instance state may change between calls
+ // * Remember that you cannot test private methods with tut
+ // ---------------------------------------------------------------------------------------
+
+ // Test 1 : test getMetadata()
+ template<> template<>
+ void llimagej2ckdu_object_t::test<1>()
+ {
+ LLImageJ2C* image = new LLImageJ2C();
+ BOOL res = mImage->callGetMetadata(*image);
+ // Trying to set up a data stream with all NIL values and stubbed KDU will "work" and return TRUE
+ // Note that is linking with KDU, that call will throw an exception and fail, returning FALSE
+ ensure("getMetadata() test failed", res == TRUE);
+ }
+
+ // Test 2 : test decodeImpl()
+ template<> template<>
+ void llimagej2ckdu_object_t::test<2>()
+ {
+ LLImageJ2C* image = new LLImageJ2C();
+ LLImageRaw* raw = new LLImageRaw();
+ BOOL res = mImage->callDecodeImpl(*image, *raw, 0.0, 0, 0);
+ // Decoding returns TRUE whenever there's nothing else to do, including if decoding failed, so we'll get TRUE here
+ ensure("decodeImpl() test failed", res == TRUE);
+ }
+
+ // Test 3 : test encodeImpl()
+ template<> template<>
+ void llimagej2ckdu_object_t::test<3>()
+ {
+ LLImageJ2C* image = new LLImageJ2C();
+ LLImageRaw* raw = new LLImageRaw();
+ BOOL res = mImage->callEncodeImpl(*image, *raw, NULL);
+ // Encoding returns TRUE unless an exception was raised, so we'll get TRUE here though nothing really was done
+ ensure("encodeImpl() test failed", res == TRUE);
+ }
+}
diff --git a/indra/llmath/CMakeLists.txt b/indra/llmath/CMakeLists.txt
index e93fe90650..b5e59c1ca3 100644
--- a/indra/llmath/CMakeLists.txt
+++ b/indra/llmath/CMakeLists.txt
@@ -12,16 +12,21 @@ include_directories(
set(llmath_SOURCE_FILES
llbbox.cpp
llbboxlocal.cpp
+ llcalc.cpp
+ llcalcparser.cpp
llcamera.cpp
llcoordframe.cpp
llline.cpp
+ llmatrix3a.cpp
llmodularmath.cpp
llperlin.cpp
llquaternion.cpp
llrect.cpp
llsphere.cpp
+ llvector4a.cpp
llvolume.cpp
llvolumemgr.cpp
+ llvolumeoctree.cpp
llsdutil_math.cpp
m3math.cpp
m4math.cpp
@@ -43,27 +48,36 @@ set(llmath_HEADER_FILES
coordframe.h
llbbox.h
llbboxlocal.h
+ llcalc.h
+ llcalcparser.h
llcamera.h
llcoord.h
llcoordframe.h
llinterp.h
llline.h
llmath.h
+ llmatrix3a.h
+ llmatrix3a.inl
llmodularmath.h
lloctree.h
llperlin.h
llplane.h
llquantize.h
llquaternion.h
+ llquaternion2.h
+ llquaternion2.inl
llrect.h
+ llsimdmath.h
+ llsimdtypes.h
+ llsimdtypes.inl
llsphere.h
lltreenode.h
- llv4math.h
- llv4matrix3.h
- llv4matrix4.h
- llv4vector3.h
+ llvector4a.h
+ llvector4a.inl
+ llvector4logical.h
llvolume.h
llvolumemgr.h
+ llvolumeoctree.h
llsdutil_math.h
m3math.h
m4math.h
diff --git a/indra/llmath/llbbox.cpp b/indra/llmath/llbbox.cpp
index b46a6e03d2..3e2c05a6e6 100644
--- a/indra/llmath/llbbox.cpp
+++ b/indra/llmath/llbbox.cpp
@@ -89,6 +89,19 @@ void LLBBox::addBBoxAgent(const LLBBox& b)
}
}
+LLBBox LLBBox::getAxisAligned() const
+{
+ // no rotation = axis aligned rotation
+ LLBBox aligned(mPosAgent, LLQuaternion(), LLVector3(), LLVector3());
+
+ // add the center point so that it's not empty
+ aligned.addPointAgent(mPosAgent);
+
+ // add our BBox
+ aligned.addBBoxAgent(*this);
+
+ return aligned;
+}
void LLBBox::expand( F32 delta )
{
@@ -147,6 +160,15 @@ BOOL LLBBox::containsPointAgent(const LLVector3& p) const
return containsPointLocal(point_local);
}
+LLVector3 LLBBox::getMinAgent() const
+{
+ return localToAgent(mMinLocal);
+}
+
+LLVector3 LLBBox::getMaxAgent() const
+{
+ return localToAgent(mMaxLocal);
+}
/*
LLBBox operator*(const LLBBox &a, const LLMatrix4 &b)
diff --git a/indra/llmath/llbbox.h b/indra/llmath/llbbox.h
index 5b911793f0..28e69b75e1 100644
--- a/indra/llmath/llbbox.h
+++ b/indra/llmath/llbbox.h
@@ -51,9 +51,11 @@ public:
const LLVector3& getPositionAgent() const { return mPosAgent; }
const LLQuaternion& getRotation() const { return mRotation; }
+ LLVector3 getMinAgent() const;
const LLVector3& getMinLocal() const { return mMinLocal; }
void setMinLocal( const LLVector3& min ) { mMinLocal = min; }
+ LLVector3 getMaxAgent() const;
const LLVector3& getMaxLocal() const { return mMaxLocal; }
void setMaxLocal( const LLVector3& max ) { mMaxLocal = max; }
@@ -80,6 +82,8 @@ public:
LLVector3 localToAgentBasis(const LLVector3& v) const;
LLVector3 agentToLocalBasis(const LLVector3& v) const;
+ // Get the smallest possible axis aligned bbox that contains this bbox
+ LLBBox getAxisAligned() const;
// friend LLBBox operator*(const LLBBox& a, const LLMatrix4& b);
diff --git a/indra/llmath/llcalc.cpp b/indra/llmath/llcalc.cpp
new file mode 100644
index 0000000000..1b2d609b67
--- /dev/null
+++ b/indra/llmath/llcalc.cpp
@@ -0,0 +1,162 @@
+/*
+ * LLCalc.cpp
+ * Copyright 2008 Aimee Walton.
+ * $LicenseInfo:firstyear=2008&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2008, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ *
+ */
+
+#include "linden_common.h"
+
+#include "llcalc.h"
+
+#include "llcalcparser.h"
+#include "llmath.h"
+
+
+// Variable names for use in the build floater
+const char* LLCalc::X_POS = "PX";
+const char* LLCalc::Y_POS = "PY";
+const char* LLCalc::Z_POS = "PZ";
+const char* LLCalc::X_SCALE = "SX";
+const char* LLCalc::Y_SCALE = "SY";
+const char* LLCalc::Z_SCALE = "SZ";
+const char* LLCalc::X_ROT = "RX";
+const char* LLCalc::Y_ROT = "RY";
+const char* LLCalc::Z_ROT = "RZ";
+const char* LLCalc::HOLLOW = "HLW";
+const char* LLCalc::CUT_BEGIN = "CB";
+const char* LLCalc::CUT_END = "CE";
+const char* LLCalc::PATH_BEGIN = "PB";
+const char* LLCalc::PATH_END = "PE";
+const char* LLCalc::TWIST_BEGIN = "TB";
+const char* LLCalc::TWIST_END = "TE";
+const char* LLCalc::X_SHEAR = "SHX";
+const char* LLCalc::Y_SHEAR = "SHY";
+const char* LLCalc::X_TAPER = "TPX";
+const char* LLCalc::Y_TAPER = "TPY";
+const char* LLCalc::RADIUS_OFFSET = "ROF";
+const char* LLCalc::REVOLUTIONS = "REV";
+const char* LLCalc::SKEW = "SKW";
+const char* LLCalc::X_HOLE = "HLX";
+const char* LLCalc::Y_HOLE = "HLY";
+const char* LLCalc::TEX_U_SCALE = "TSU";
+const char* LLCalc::TEX_V_SCALE = "TSV";
+const char* LLCalc::TEX_U_OFFSET = "TOU";
+const char* LLCalc::TEX_V_OFFSET = "TOV";
+const char* LLCalc::TEX_ROTATION = "TROT";
+const char* LLCalc::TEX_TRANSPARENCY = "TRNS";
+const char* LLCalc::TEX_GLOW = "GLOW";
+
+
+LLCalc* LLCalc::sInstance = NULL;
+
+LLCalc::LLCalc() : mLastErrorPos(0)
+{
+ // Init table of constants
+ mConstants["PI"] = F_PI;
+ mConstants["TWO_PI"] = F_TWO_PI;
+ mConstants["PI_BY_TWO"] = F_PI_BY_TWO;
+ mConstants["SQRT_TWO_PI"] = F_SQRT_TWO_PI;
+ mConstants["SQRT2"] = F_SQRT2;
+ mConstants["SQRT3"] = F_SQRT3;
+ mConstants["DEG_TO_RAD"] = DEG_TO_RAD;
+ mConstants["RAD_TO_DEG"] = RAD_TO_DEG;
+ mConstants["GRAVITY"] = GRAVITY;
+}
+
+LLCalc::~LLCalc()
+{
+}
+
+//static
+void LLCalc::cleanUp()
+{
+ delete sInstance;
+ sInstance = NULL;
+}
+
+//static
+LLCalc* LLCalc::getInstance()
+{
+ if (!sInstance) sInstance = new LLCalc();
+ return sInstance;
+}
+
+void LLCalc::setVar(const std::string& name, const F32& value)
+{
+ mVariables[name] = value;
+}
+
+void LLCalc::clearVar(const std::string& name)
+{
+ mVariables.erase(name);
+}
+
+void LLCalc::clearAllVariables()
+{
+ mVariables.clear();
+}
+
+/*
+void LLCalc::updateVariables(LLSD& vars)
+{
+ LLSD::map_iterator cIt = vars.beginMap();
+ for(; cIt != vars.endMap(); cIt++)
+ {
+ setVar(cIt->first, (F32)(LLSD::Real)cIt->second);
+ }
+}
+*/
+
+bool LLCalc::evalString(const std::string& expression, F32& result)
+{
+ std::string expr_upper = expression;
+ LLStringUtil::toUpper(expr_upper);
+
+ LLCalcParser calc(result, &mConstants, &mVariables);
+
+ mLastErrorPos = 0;
+ std::string::iterator start = expr_upper.begin();
+ parse_info<std::string::iterator> info;
+
+ try
+ {
+ info = parse(start, expr_upper.end(), calc, space_p);
+ lldebugs << "Math expression: " << expression << " = " << result << llendl;
+ }
+ catch(parser_error<std::string, std::string::iterator> &e)
+ {
+ mLastErrorPos = e.where - expr_upper.begin();
+
+ llinfos << "Calc parser exception: " << e.descriptor << " at " << mLastErrorPos << " in expression: " << expression << llendl;
+ return false;
+ }
+
+ if (!info.full)
+ {
+ mLastErrorPos = info.stop - expr_upper.begin();
+ llinfos << "Unhandled syntax error at " << mLastErrorPos << " in expression: " << expression << llendl;
+ return false;
+ }
+
+ return true;
+}
diff --git a/indra/llmath/llcalc.h b/indra/llmath/llcalc.h
new file mode 100644
index 0000000000..ceb9dce585
--- /dev/null
+++ b/indra/llmath/llcalc.h
@@ -0,0 +1,100 @@
+/*
+ * LLCalc.h
+ * Copyright 2008 Aimee Walton.
+ * $LicenseInfo:firstyear=2008&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2008, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ *
+ */
+
+#ifndef LL_CALC_H
+#define LL_CALC_H
+
+#include <map>
+#include <string>
+
+class LLCalc
+{
+public:
+ LLCalc();
+ ~LLCalc();
+
+ // Variable name constants
+ static const char* X_POS;
+ static const char* Y_POS;
+ static const char* Z_POS;
+ static const char* X_SCALE;
+ static const char* Y_SCALE;
+ static const char* Z_SCALE;
+ static const char* X_ROT;
+ static const char* Y_ROT;
+ static const char* Z_ROT;
+ static const char* HOLLOW;
+ static const char* CUT_BEGIN;
+ static const char* CUT_END;
+ static const char* PATH_BEGIN;
+ static const char* PATH_END;
+ static const char* TWIST_BEGIN;
+ static const char* TWIST_END;
+ static const char* X_SHEAR;
+ static const char* Y_SHEAR;
+ static const char* X_TAPER;
+ static const char* Y_TAPER;
+ static const char* RADIUS_OFFSET;
+ static const char* REVOLUTIONS;
+ static const char* SKEW;
+ static const char* X_HOLE;
+ static const char* Y_HOLE;
+ static const char* TEX_U_SCALE;
+ static const char* TEX_V_SCALE;
+ static const char* TEX_U_OFFSET;
+ static const char* TEX_V_OFFSET;
+ static const char* TEX_ROTATION;
+ static const char* TEX_TRANSPARENCY;
+ static const char* TEX_GLOW;
+
+ void setVar(const std::string& name, const F32& value);
+ void clearVar(const std::string& name);
+ void clearAllVariables();
+// void updateVariables(LLSD& vars);
+
+ bool evalString(const std::string& expression, F32& result);
+ std::string::size_type getLastErrorPos() { return mLastErrorPos; }
+
+ static LLCalc* getInstance();
+ static void cleanUp();
+
+ typedef std::map<std::string, F32> calc_map_t;
+
+private:
+ std::string::size_type mLastErrorPos;
+
+ calc_map_t mConstants;
+ calc_map_t mVariables;
+
+ // *TODO: Add support for storing user defined variables, and stored functions.
+ // Will need UI work, and a means to save them between sessions.
+// calc_map_t mUserVariables;
+
+ // "There shall be only one"
+ static LLCalc* sInstance;
+};
+
+#endif // LL_CALC_H
diff --git a/indra/llmath/llcalcparser.cpp b/indra/llmath/llcalcparser.cpp
new file mode 100644
index 0000000000..b4ca320659
--- /dev/null
+++ b/indra/llmath/llcalcparser.cpp
@@ -0,0 +1,63 @@
+/*
+ * LLCalcParser.cpp
+ * Copyright 2008 Aimee Walton.
+ * $LicenseInfo:firstyear=2008&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2008, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ *
+ */
+
+#include "linden_common.h"
+
+#include "llcalcparser.h"
+using namespace boost::spirit::classic;
+
+F32 LLCalcParser::lookup(const std::string::iterator& start, const std::string::iterator& end) const
+{
+ LLCalc::calc_map_t::iterator iter;
+
+ std::string name(start, end);
+
+ if (mConstants)
+ {
+ iter = mConstants->find(name);
+ if (iter != mConstants->end())
+ {
+ return (*iter).second;
+ }
+ }
+ else
+ {
+ // This should never happen!
+ throw_(end, std::string("Missing constants table"));
+ }
+
+ if (mVariables)
+ {
+ iter = mVariables->find(name);
+ if (iter != mVariables->end())
+ {
+ return (*iter).second;
+ }
+ }
+
+ throw_(end, std::string("Unknown symbol " + name));
+ return 0.f;
+}
diff --git a/indra/llmath/llcalcparser.h b/indra/llmath/llcalcparser.h
new file mode 100644
index 0000000000..e0ad270266
--- /dev/null
+++ b/indra/llmath/llcalcparser.h
@@ -0,0 +1,191 @@
+/*
+ * LLCalcParser.h
+ * Copyright 2008 Aimee Walton.
+ * $LicenseInfo:firstyear=2008&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2008, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ *
+ */
+
+#ifndef LL_CALCPARSER_H
+#define LL_CALCPARSER_H
+
+#include <boost/spirit/include/classic_attribute.hpp>
+#include <boost/spirit/include/classic_core.hpp>
+#include <boost/spirit/include/classic_error_handling.hpp>
+#include <boost/spirit/include/classic_position_iterator.hpp>
+#include <boost/spirit/include/phoenix1_binders.hpp>
+#include <boost/spirit/include/classic_symbols.hpp>
+using namespace boost::spirit::classic;
+
+#include "llcalc.h"
+#include "llmath.h"
+
+struct LLCalcParser : grammar<LLCalcParser>
+{
+ LLCalcParser(F32& result, LLCalc::calc_map_t* constants, LLCalc::calc_map_t* vars) :
+ mResult(result), mConstants(constants), mVariables(vars) {};
+
+ struct value_closure : closure<value_closure, F32>
+ {
+ member1 value;
+ };
+
+ template <typename ScannerT>
+ struct definition
+ {
+ // Rule declarations
+ rule<ScannerT> statement, identifier;
+ rule<ScannerT, value_closure::context_t> expression, term,
+ power,
+ unary_expr,
+ factor,
+ unary_func,
+ binary_func,
+ group;
+
+ // start() should return the starting symbol
+ rule<ScannerT> const& start() const { return statement; }
+
+ definition(LLCalcParser const& self)
+ {
+ using namespace phoenix;
+
+ assertion<std::string> assert_domain("Domain error");
+// assertion<std::string> assert_symbol("Unknown symbol");
+ assertion<std::string> assert_syntax("Syntax error");
+
+ identifier =
+ lexeme_d[(alpha_p | '_') >> *(alnum_p | '_')]
+ ;
+
+ group =
+ '(' >> expression[group.value = arg1] >> assert_syntax(ch_p(')'))
+ ;
+
+ unary_func =
+ ((str_p("SIN") >> '(' >> expression[unary_func.value = bind(&LLCalcParser::_sin)(self,arg1)]) |
+ (str_p("COS") >> '(' >> expression[unary_func.value = bind(&LLCalcParser::_cos)(self,arg1)]) |
+ (str_p("TAN") >> '(' >> expression[unary_func.value = bind(&LLCalcParser::_tan)(self,arg1)]) |
+ (str_p("ASIN") >> '(' >> expression[unary_func.value = bind(&LLCalcParser::_asin)(self,arg1)]) |
+ (str_p("ACOS") >> '(' >> expression[unary_func.value = bind(&LLCalcParser::_acos)(self,arg1)]) |
+ (str_p("ATAN") >> '(' >> expression[unary_func.value = bind(&LLCalcParser::_atan)(self,arg1)]) |
+ (str_p("SQRT") >> '(' >> expression[unary_func.value = bind(&LLCalcParser::_sqrt)(self,arg1)]) |
+ (str_p("LOG") >> '(' >> expression[unary_func.value = bind(&LLCalcParser::_log)(self,arg1)]) |
+ (str_p("EXP") >> '(' >> expression[unary_func.value = bind(&LLCalcParser::_exp)(self,arg1)]) |
+ (str_p("ABS") >> '(' >> expression[unary_func.value = bind(&LLCalcParser::_fabs)(self,arg1)]) |
+ (str_p("FLR") >> '(' >> expression[unary_func.value = bind(&LLCalcParser::_floor)(self,arg1)]) |
+ (str_p("CEIL") >> '(' >> expression[unary_func.value = bind(&LLCalcParser::_ceil)(self,arg1)])
+ ) >> assert_syntax(ch_p(')'))
+ ;
+
+ binary_func =
+ ((str_p("ATAN2") >> '(' >> expression[binary_func.value = arg1] >> ',' >>
+ expression[binary_func.value = bind(&LLCalcParser::_atan2)(self, binary_func.value, arg1)]) |
+ (str_p("MIN") >> '(' >> expression[binary_func.value = arg1] >> ',' >>
+ expression[binary_func.value = bind(&LLCalcParser::_min)(self, binary_func.value, arg1)]) |
+ (str_p("MAX") >> '(' >> expression[binary_func.value = arg1] >> ',' >>
+ expression[binary_func.value = bind(&LLCalcParser::_max)(self, binary_func.value, arg1)])
+ ) >> assert_syntax(ch_p(')'))
+ ;
+
+ // *TODO: Localisation of the decimal point?
+ // Problem, LLLineEditor::postvalidateFloat accepts a comma when appropriate
+ // for the current locale. However to do that here could clash with using
+ // the comma as a separator when passing arguments to functions.
+ factor =
+ (ureal_p[factor.value = arg1] |
+ group[factor.value = arg1] |
+ unary_func[factor.value = arg1] |
+ binary_func[factor.value = arg1] |
+ // Lookup throws an Unknown Symbol error if it is unknown, while this works fine,
+ // would be "neater" to handle symbol lookup from here with an assertive parser.
+// constants_p[factor.value = arg1]|
+ identifier[factor.value = bind(&LLCalcParser::lookup)(self, arg1, arg2)]
+ ) >>
+ // Detect and throw math errors.
+ assert_domain(eps_p(bind(&LLCalcParser::checkNaN)(self, factor.value)))
+ ;
+
+ unary_expr =
+ !ch_p('+') >> factor[unary_expr.value = arg1] |
+ '-' >> factor[unary_expr.value = -arg1]
+ ;
+
+ power =
+ unary_expr[power.value = arg1] >>
+ *('^' >> assert_syntax(unary_expr[power.value = bind(&powf)(power.value, arg1)]))
+ ;
+
+ term =
+ power[term.value = arg1] >>
+ *(('*' >> assert_syntax(power[term.value *= arg1])) |
+ ('/' >> assert_syntax(power[term.value /= arg1])) |
+ ('%' >> assert_syntax(power[term.value = bind(&fmodf)(term.value, arg1)]))
+ )
+ ;
+
+ expression =
+ assert_syntax(term[expression.value = arg1]) >>
+ *(('+' >> assert_syntax(term[expression.value += arg1])) |
+ ('-' >> assert_syntax(term[expression.value -= arg1]))
+ )
+ ;
+
+ statement =
+ !ch_p('=') >> ( expression )[var(self.mResult) = arg1] >> (end_p)
+ ;
+ }
+ };
+
+private:
+ // Member functions for semantic actions
+ F32 lookup(const std::string::iterator&, const std::string::iterator&) const;
+ F32 _min(const F32& a, const F32& b) const { return llmin(a, b); }
+ F32 _max(const F32& a, const F32& b) const { return llmax(a, b); }
+
+ bool checkNaN(const F32& a) const { return !llisnan(a); }
+
+ //FIX* non ambigious function fix making SIN() work for calc -Cryogenic Blitz
+ F32 _sin(const F32& a) const { return sin(DEG_TO_RAD * a); }
+ F32 _cos(const F32& a) const { return cos(DEG_TO_RAD * a); }
+ F32 _tan(const F32& a) const { return tan(DEG_TO_RAD * a); }
+ F32 _asin(const F32& a) const { return asin(a * RAD_TO_DEG); }
+ F32 _acos(const F32& a) const { return acos(a * RAD_TO_DEG); }
+ F32 _atan(const F32& a) const { return atan(a * RAD_TO_DEG); }
+ F32 _sqrt(const F32& a) const { return sqrt(a); }
+ F32 _log(const F32& a) const { return log(a); }
+ F32 _exp(const F32& a) const { return exp(a); }
+ F32 _fabs(const F32& a) const { return fabs(a); }
+ F32 _floor(const F32& a) const { return (F32)llfloor(a); }
+ F32 _ceil(const F32& a) const { return llceil(a); }
+
+ F32 _atan2(const F32& a,const F32& b) const { return atan2(a,b); }
+
+
+
+ LLCalc::calc_map_t* mConstants;
+ LLCalc::calc_map_t* mVariables;
+// LLCalc::calc_map_t* mUserVariables;
+
+ F32& mResult;
+};
+
+#endif // LL_CALCPARSER_H
diff --git a/indra/llmath/llcamera.cpp b/indra/llmath/llcamera.cpp
index bad4d00fd6..22ba26f99b 100644
--- a/indra/llmath/llcamera.cpp
+++ b/indra/llmath/llcamera.cpp
@@ -45,7 +45,6 @@ LLCamera::LLCamera() :
calculateFrustumPlanes();
}
-
LLCamera::LLCamera(F32 vertical_fov_rads, F32 aspect_ratio, S32 view_height_in_pixels, F32 near_plane, F32 far_plane) :
LLCoordFrame(),
mViewHeightInPixels(view_height_in_pixels),
@@ -61,6 +60,10 @@ LLCamera::LLCamera(F32 vertical_fov_rads, F32 aspect_ratio, S32 view_height_in_p
setView(vertical_fov_rads);
}
+LLCamera::~LLCamera()
+{
+
+}
// ---------------- LLCamera::getFoo() member functions ----------------
@@ -82,11 +85,11 @@ F32 LLCamera::getMaxView() const
// ---------------- LLCamera::setFoo() member functions ----------------
-void LLCamera::setUserClipPlane(LLPlane plane)
+void LLCamera::setUserClipPlane(LLPlane& plane)
{
mPlaneCount = 7;
- mAgentPlanes[6].p = plane;
- mAgentPlanes[6].mask = calcPlaneMask(plane);
+ mAgentPlanes[6] = plane;
+ mPlaneMask[6] = plane.calcPlaneMask();
}
void LLCamera::disableUserClipPlane()
@@ -158,166 +161,91 @@ size_t LLCamera::readFrustumFromBuffer(const char *buffer)
// ---------------- test methods ----------------
-S32 LLCamera::AABBInFrustum(const LLVector3 &center, const LLVector3& radius)
+S32 LLCamera::AABBInFrustum(const LLVector4a &center, const LLVector4a& radius)
{
- static const LLVector3 scaler[] = {
- LLVector3(-1,-1,-1),
- LLVector3( 1,-1,-1),
- LLVector3(-1, 1,-1),
- LLVector3( 1, 1,-1),
- LLVector3(-1,-1, 1),
- LLVector3( 1,-1, 1),
- LLVector3(-1, 1, 1),
- LLVector3( 1, 1, 1)
+ static const LLVector4a scaler[] = {
+ LLVector4a(-1,-1,-1),
+ LLVector4a( 1,-1,-1),
+ LLVector4a(-1, 1,-1),
+ LLVector4a( 1, 1,-1),
+ LLVector4a(-1,-1, 1),
+ LLVector4a( 1,-1, 1),
+ LLVector4a(-1, 1, 1),
+ LLVector4a( 1, 1, 1)
};
U8 mask = 0;
- S32 result = 2;
-
- /*if (mFrustumCornerDist > 0.f && radius.magVecSquared() > mFrustumCornerDist * mFrustumCornerDist)
- { //box is larger than frustum, check frustum quads against box planes
-
- static const LLVector3 dir[] =
- {
- LLVector3(1, 0, 0),
- LLVector3(-1, 0, 0),
- LLVector3(0, 1, 0),
- LLVector3(0, -1, 0),
- LLVector3(0, 0, 1),
- LLVector3(0, 0, -1)
- };
-
- U32 quads[] =
- {
- 0, 1, 2, 3,
- 0, 1, 5, 4,
- 2, 3, 7, 6,
- 3, 0, 7, 4,
- 1, 2, 6, 4,
- 4, 5, 6, 7
- };
-
- result = 0;
-
- BOOL total_inside = TRUE;
- for (U32 i = 0; i < 6; i++)
- {
- LLVector3 p = center + radius.scaledVec(dir[i]);
- F32 d = -p*dir[i];
-
- for (U32 j = 0; j < 6; j++)
- { //for each quad
- F32 dist = mAgentFrustum[quads[j*4+0]]*dir[i] + d;
- if (dist > 0)
- { //at least one frustum point is outside the AABB
- total_inside = FALSE;
- for (U32 k = 1; k < 4; k++)
- { //for each other point on quad
- if ( mAgentFrustum[quads[j*4+k]]*dir[i]+d <= 0.f)
- { //quad is straddling some plane of AABB
- return 1;
- }
- }
- }
- else
- {
- for (U32 k = 1; k < 4; k++)
- {
- if (mAgentFrustum[quads[j*4+k]]*dir[i]+d > 0.f)
- {
- return 1;
- }
- }
- }
- }
- }
-
- if (total_inside)
- {
- result = 1;
- }
- }
- else*/
+ bool result = false;
+ LLVector4a rscale, maxp, minp;
+ LLSimdScalar d;
+ for (U32 i = 0; i < mPlaneCount; i++)
{
- for (U32 i = 0; i < mPlaneCount; i++)
+ mask = mPlaneMask[i];
+ if (mask != 0xff)
{
- mask = mAgentPlanes[i].mask;
- if (mask == 0xff)
- {
- continue;
- }
- LLPlane p = mAgentPlanes[i].p;
- LLVector3 n = LLVector3(p);
- float d = p.mV[3];
- LLVector3 rscale = radius.scaledVec(scaler[mask]);
-
- LLVector3 minp = center - rscale;
- LLVector3 maxp = center + rscale;
-
- if (n * minp > -d)
+ const LLPlane& p(mAgentPlanes[i]);
+ p.getAt<3>(d);
+ rscale.setMul(radius, scaler[mask]);
+ minp.setSub(center, rscale);
+ d = -d;
+ if (p.dot3(minp).getF32() > d)
{
return 0;
}
-
- if (n * maxp > -d)
+
+ if(!result)
{
- result = 1;
+ maxp.setAdd(center, rscale);
+ result = (p.dot3(maxp).getF32() > d);
}
}
}
-
- return result;
+ return result?1:2;
}
-S32 LLCamera::AABBInFrustumNoFarClip(const LLVector3 &center, const LLVector3& radius)
+
+S32 LLCamera::AABBInFrustumNoFarClip(const LLVector4a& center, const LLVector4a& radius)
{
- static const LLVector3 scaler[] = {
- LLVector3(-1,-1,-1),
- LLVector3( 1,-1,-1),
- LLVector3(-1, 1,-1),
- LLVector3( 1, 1,-1),
- LLVector3(-1,-1, 1),
- LLVector3( 1,-1, 1),
- LLVector3(-1, 1, 1),
- LLVector3( 1, 1, 1)
+ static const LLVector4a scaler[] = {
+ LLVector4a(-1,-1,-1),
+ LLVector4a( 1,-1,-1),
+ LLVector4a(-1, 1,-1),
+ LLVector4a( 1, 1,-1),
+ LLVector4a(-1,-1, 1),
+ LLVector4a( 1,-1, 1),
+ LLVector4a(-1, 1, 1),
+ LLVector4a( 1, 1, 1)
};
U8 mask = 0;
- S32 result = 2;
-
+ bool result = false;
+ LLVector4a rscale, maxp, minp;
+ LLSimdScalar d;
for (U32 i = 0; i < mPlaneCount; i++)
{
- if (i == 5)
- {
- continue;
- }
-
- mask = mAgentPlanes[i].mask;
- if (mask == 0xff)
- {
- continue;
- }
- LLPlane p = mAgentPlanes[i].p;
- LLVector3 n = LLVector3(p);
- float d = p.mV[3];
- LLVector3 rscale = radius.scaledVec(scaler[mask]);
-
- LLVector3 minp = center - rscale;
- LLVector3 maxp = center + rscale;
-
- if (n * minp > -d)
+ mask = mPlaneMask[i];
+ if ((i != 5) && (mask != 0xff))
{
- return 0;
- }
-
- if (n * maxp > -d)
- {
- result = 1;
+ const LLPlane& p(mAgentPlanes[i]);
+ p.getAt<3>(d);
+ rscale.setMul(radius, scaler[mask]);
+ minp.setSub(center, rscale);
+ d = -d;
+ if (p.dot3(minp).getF32() > d)
+ {
+ return 0;
+ }
+
+ if(!result)
+ {
+ maxp.setAdd(center, rscale);
+ result = (p.dot3(maxp).getF32() > d);
+ }
}
}
- return result;
+ return result?1:2;
}
int LLCamera::sphereInFrustumQuick(const LLVector3 &sphere_center, const F32 radius)
@@ -438,28 +366,22 @@ int LLCamera::sphereInFrustumOld(const LLVector3 &sphere_center, const F32 radiu
int LLCamera::sphereInFrustum(const LLVector3 &sphere_center, const F32 radius) const
{
// Returns 1 if sphere is in frustum, 0 if not.
- int res = 2;
+ bool res = false;
for (int i = 0; i < 6; i++)
{
- if (mAgentPlanes[i].mask == 0xff)
+ if (mPlaneMask[i] != 0xff)
{
- continue;
- }
-
- float d = mAgentPlanes[i].p.dist(sphere_center);
+ float d = mAgentPlanes[i].dist(sphere_center);
- if (d > radius)
- {
- return 0;
- }
-
- if (d > -radius)
- {
- res = 1;
+ if (d > radius)
+ {
+ return 0;
+ }
+ res = res || (d > -radius);
}
}
- return res;
+ return res?1:2;
}
@@ -611,25 +533,6 @@ LLPlane planeFromPoints(LLVector3 p1, LLVector3 p2, LLVector3 p3)
return LLPlane(p1, n);
}
-U8 LLCamera::calcPlaneMask(const LLPlane& plane)
-{
- U8 mask = 0;
-
- if (plane.mV[0] >= 0)
- {
- mask |= 1;
- }
- if (plane.mV[1] >= 0)
- {
- mask |= 2;
- }
- if (plane.mV[2] >= 0)
- {
- mask |= 4;
- }
-
- return mask;
-}
void LLCamera::ignoreAgentFrustumPlane(S32 idx)
{
@@ -638,12 +541,13 @@ void LLCamera::ignoreAgentFrustumPlane(S32 idx)
return;
}
- mAgentPlanes[idx].mask = 0xff;
- mAgentPlanes[idx].p.clearVec();
+ mPlaneMask[idx] = 0xff;
+ mAgentPlanes[idx].clear();
}
void LLCamera::calcAgentFrustumPlanes(LLVector3* frust)
{
+
for (int i = 0; i < 8; i++)
{
mAgentFrustum[i] = frust[i];
@@ -656,27 +560,27 @@ void LLCamera::calcAgentFrustumPlanes(LLVector3* frust)
//order of planes is important, keep most likely to fail in the front of the list
//near - frust[0], frust[1], frust[2]
- mAgentPlanes[2].p = planeFromPoints(frust[0], frust[1], frust[2]);
+ mAgentPlanes[2] = planeFromPoints(frust[0], frust[1], frust[2]);
//far
- mAgentPlanes[5].p = planeFromPoints(frust[5], frust[4], frust[6]);
+ mAgentPlanes[5] = planeFromPoints(frust[5], frust[4], frust[6]);
//left
- mAgentPlanes[0].p = planeFromPoints(frust[4], frust[0], frust[7]);
+ mAgentPlanes[0] = planeFromPoints(frust[4], frust[0], frust[7]);
//right
- mAgentPlanes[1].p = planeFromPoints(frust[1], frust[5], frust[6]);
+ mAgentPlanes[1] = planeFromPoints(frust[1], frust[5], frust[6]);
//top
- mAgentPlanes[4].p = planeFromPoints(frust[3], frust[2], frust[6]);
+ mAgentPlanes[4] = planeFromPoints(frust[3], frust[2], frust[6]);
//bottom
- mAgentPlanes[3].p = planeFromPoints(frust[1], frust[0], frust[4]);
+ mAgentPlanes[3] = planeFromPoints(frust[1], frust[0], frust[4]);
//cache plane octant facing mask for use in AABBInFrustum
for (U32 i = 0; i < mPlaneCount; i++)
{
- mAgentPlanes[i].mask = calcPlaneMask(mAgentPlanes[i].p);
+ mPlaneMask[i] = mAgentPlanes[i].calcPlaneMask();
}
}
@@ -703,6 +607,7 @@ void LLCamera::calculateFrustumPlanes(F32 left, F32 right, F32 top, F32 bottom)
mLocalPlanes[PLANE_BOTTOM].setVec( a, c, b);
//calculate center and radius squared of frustum in world absolute coordinates
+ static LLVector3 const X_AXIS(1.f, 0.f, 0.f);
mFrustCenter = X_AXIS*mFarPlane*0.5f;
mFrustCenter = transformToAbsolute(mFrustCenter);
mFrustRadiusSquared = mFarPlane*0.5f;
@@ -729,9 +634,10 @@ void LLCamera::calculateWorldFrustumPlanes()
F32 d;
LLVector3 center = mOrigin - mXAxis*mNearPlane;
mWorldPlanePos = center;
+ LLVector3 pnorm;
for (int p=0; p<4; p++)
{
- LLVector3 pnorm = LLVector3(mLocalPlanes[p]);
+ mLocalPlanes[p].getVector3(pnorm);
LLVector3 norm = rotateToAbsolute(pnorm);
norm.normVec();
d = -(center * norm);
@@ -741,13 +647,15 @@ void LLCamera::calculateWorldFrustumPlanes()
LLVector3 zaxis(0, 0, 1.0f);
F32 yaw = getYaw();
{
- LLVector3 tnorm = LLVector3(mLocalPlanes[PLANE_LEFT]);
+ LLVector3 tnorm;
+ mLocalPlanes[PLANE_LEFT].getVector3(tnorm);
tnorm.rotVec(yaw, zaxis);
d = -(mOrigin * tnorm);
mHorizPlanes[HORIZ_PLANE_LEFT] = LLPlane(tnorm, d);
}
{
- LLVector3 tnorm = LLVector3(mLocalPlanes[PLANE_RIGHT]);
+ LLVector3 tnorm;
+ mLocalPlanes[PLANE_RIGHT].getVector3(tnorm);
tnorm.rotVec(yaw, zaxis);
d = -(mOrigin * tnorm);
mHorizPlanes[HORIZ_PLANE_RIGHT] = LLPlane(tnorm, d);
diff --git a/indra/llmath/llcamera.h b/indra/llmath/llcamera.h
index 922d6f9fac..ec67b91d05 100644
--- a/indra/llmath/llcamera.h
+++ b/indra/llmath/llcamera.h
@@ -31,6 +31,7 @@
#include "llmath.h"
#include "llcoordframe.h"
#include "llplane.h"
+#include "llvector4a.h"
const F32 DEFAULT_FIELD_OF_VIEW = 60.f * DEG_TO_RAD;
const F32 DEFAULT_ASPECT_RATIO = 640.f / 480.f;
@@ -50,15 +51,6 @@ const F32 MIN_FAR_PLANE = 0.2f;
static const F32 MIN_FIELD_OF_VIEW = 5.0f * DEG_TO_RAD;
static const F32 MAX_FIELD_OF_VIEW = 175.f * DEG_TO_RAD;
-static const LLVector3 X_AXIS(1.f,0.f,0.f);
-static const LLVector3 Y_AXIS(0.f,1.f,0.f);
-static const LLVector3 Z_AXIS(0.f,0.f,1.f);
-
-static const LLVector3 NEG_X_AXIS(-1.f,0.f,0.f);
-static const LLVector3 NEG_Y_AXIS(0.f,-1.f,0.f);
-static const LLVector3 NEG_Z_AXIS(0.f,0.f,-1.f);
-
-
// An LLCamera is an LLCoorFrame with a view frustum.
// This means that it has several methods for moving it around
// that are inherited from the LLCoordFrame() class :
@@ -73,6 +65,12 @@ class LLCamera
: public LLCoordFrame
{
public:
+
+ LLCamera(const LLCamera& rhs)
+ {
+ *this = rhs;
+ }
+
enum {
PLANE_LEFT = 0,
PLANE_RIGHT = 1,
@@ -110,6 +108,9 @@ public:
};
private:
+ LLPlane mAgentPlanes[7]; //frustum planes in agent space a la gluUnproject (I'm a bastard, I know) - DaveP
+ U8 mPlaneMask[8]; // 8 for alignment
+
F32 mView; // angle between top and bottom frustum planes in radians.
F32 mAspect; // width/height
S32 mViewHeightInPixels; // for ViewHeightInPixels() only
@@ -123,30 +124,22 @@ private:
LLPlane mWorldPlanes[PLANE_NUM];
LLPlane mHorizPlanes[HORIZ_PLANE_NUM];
- struct frustum_plane
- {
- frustum_plane() : mask(0) {}
- LLPlane p;
- U8 mask;
- };
- frustum_plane mAgentPlanes[7]; //frustum planes in agent space a la gluUnproject (I'm a bastard, I know) - DaveP
-
U32 mPlaneCount; //defaults to 6, if setUserClipPlane is called, uses user supplied clip plane in
LLVector3 mWorldPlanePos; // Position of World Planes (may be offset from camera)
public:
LLVector3 mAgentFrustum[8]; //8 corners of 6-plane frustum
F32 mFrustumCornerDist; //distance to corner of frustum against far clip plane
- LLPlane getAgentPlane(U32 idx) { return mAgentPlanes[idx].p; }
+ LLPlane& getAgentPlane(U32 idx) { return mAgentPlanes[idx]; }
public:
LLCamera();
LLCamera(F32 vertical_fov_rads, F32 aspect_ratio, S32 view_height_in_pixels, F32 near_plane, F32 far_plane);
- virtual ~LLCamera(){} // no-op virtual destructor
+ virtual ~LLCamera();
+
- void setUserClipPlane(LLPlane plane);
+ void setUserClipPlane(LLPlane& plane);
void disableUserClipPlane();
- U8 calcPlaneMask(const LLPlane& plane);
virtual void setView(F32 vertical_fov_rads);
void setViewHeightInPixels(S32 height);
void setAspect(F32 new_aspect);
@@ -193,8 +186,8 @@ public:
S32 sphereInFrustum(const LLVector3 &center, const F32 radius) const;
S32 pointInFrustum(const LLVector3 &point) const { return sphereInFrustum(point, 0.0f); }
S32 sphereInFrustumFull(const LLVector3 &center, const F32 radius) const { return sphereInFrustum(center, radius); }
- S32 AABBInFrustum(const LLVector3 &center, const LLVector3& radius);
- S32 AABBInFrustumNoFarClip(const LLVector3 &center, const LLVector3& radius);
+ S32 AABBInFrustum(const LLVector4a& center, const LLVector4a& radius);
+ S32 AABBInFrustumNoFarClip(const LLVector4a& center, const LLVector4a& radius);
//does a quick 'n dirty sphere-sphere check
S32 sphereInFrustumQuick(const LLVector3 &sphere_center, const F32 radius);
diff --git a/indra/llmath/llcoord.h b/indra/llmath/llcoord.h
index 706ad92787..9b76268afd 100644
--- a/indra/llmath/llcoord.h
+++ b/indra/llmath/llcoord.h
@@ -26,80 +26,87 @@
#ifndef LL_LLCOORD_H
#define LL_LLCOORD_H
+template<typename> class LLCoord;
+struct LL_COORD_TYPE_GL;
+struct LL_COORD_TYPE_WINDOW;
+struct LL_COORD_TYPE_SCREEN;
+
+typedef LLCoord<LL_COORD_TYPE_GL> LLCoordGL;
+typedef LLCoord<LL_COORD_TYPE_WINDOW> LLCoordWindow;
+typedef LLCoord<LL_COORD_TYPE_SCREEN> LLCoordScreen;
+
+struct LLCoordCommon
+{
+ LLCoordCommon(S32 x, S32 y) : mX(x), mY(y) {}
+ LLCoordCommon() : mX(0), mY(0) {}
+ S32 mX;
+ S32 mY;
+};
+
// A two-dimensional pixel value
-class LLCoord
+template<typename COORD_FRAME>
+class LLCoord : protected COORD_FRAME
{
public:
- S32 mX;
- S32 mY;
+ typedef LLCoord<COORD_FRAME> self_t;
+ typename COORD_FRAME::value_t mX;
+ typename COORD_FRAME::value_t mY;
LLCoord(): mX(0), mY(0)
{}
- LLCoord(S32 x, S32 y): mX(x), mY(y)
- {}
- virtual ~LLCoord()
+ LLCoord(typename COORD_FRAME::value_t x, typename COORD_FRAME::value_t y): mX(x), mY(y)
{}
- virtual void set(S32 x, S32 y) { mX = x; mY = y; }
-};
+ LLCoord(const LLCoordCommon& other)
+ {
+ COORD_FRAME::convertFromCommon(other);
+ }
+ LLCoordCommon convert() const
+ {
+ return COORD_FRAME::convertToCommon();
+ }
-// GL coordinates start in the client region of a window,
-// with left, bottom = 0, 0
-class LLCoordGL : public LLCoord
-{
-public:
- LLCoordGL() : LLCoord()
- {}
- LLCoordGL(S32 x, S32 y) : LLCoord(x, y)
- {}
- bool operator==(const LLCoordGL& other) const { return mX == other.mX && mY == other.mY; }
- bool operator!=(const LLCoordGL& other) const { return !(*this == other); }
-};
+ void set(typename COORD_FRAME::value_t x, typename COORD_FRAME::value_t y) { mX = x; mY = y;}
+ bool operator==(const self_t& other) const { return mX == other.mX && mY == other.mY; }
+ bool operator!=(const self_t& other) const { return !(*this == other); }
-//bool operator ==(const LLCoordGL& a, const LLCoordGL& b);
+ static const self_t& getTypedCoords(const COORD_FRAME& self) { return static_cast<const self_t&>(self); }
+ static self_t& getTypedCoords(COORD_FRAME& self) { return static_cast<self_t&>(self); }
+};
-// Window coords include things like window borders,
-// menu regions, etc.
-class LLCoordWindow : public LLCoord
+struct LL_COORD_TYPE_GL
{
-public:
- LLCoordWindow() : LLCoord()
- {}
- LLCoordWindow(S32 x, S32 y) : LLCoord(x, y)
- {}
- bool operator==(const LLCoordWindow& other) const { return mX == other.mX && mY == other.mY; }
- bool operator!=(const LLCoordWindow& other) const { return !(*this == other); }
-};
+ typedef S32 value_t;
+ LLCoordCommon convertToCommon() const
+ {
+ const LLCoordGL& self = LLCoordGL::getTypedCoords(*this);
+ return LLCoordCommon(self.mX, self.mY);
+ }
-// Screen coords start at left, top = 0, 0
-class LLCoordScreen : public LLCoord
+ void convertFromCommon(const LLCoordCommon& from)
+ {
+ LLCoordGL& self = LLCoordGL::getTypedCoords(*this);
+ self.mX = from.mX;
+ self.mY = from.mY;
+ }
+};
+
+struct LL_COORD_TYPE_WINDOW
{
-public:
- LLCoordScreen() : LLCoord()
- {}
- LLCoordScreen(S32 x, S32 y) : LLCoord(x, y)
- {}
- bool operator==(const LLCoordScreen& other) const { return mX == other.mX && mY == other.mY; }
- bool operator!=(const LLCoordScreen& other) const { return !(*this == other); }
+ typedef S32 value_t;
+
+ LLCoordCommon convertToCommon() const;
+ void convertFromCommon(const LLCoordCommon& from);
};
-class LLCoordFont : public LLCoord
+struct LL_COORD_TYPE_SCREEN
{
-public:
- F32 mZ;
-
- LLCoordFont() : LLCoord(), mZ(0.f)
- {}
- LLCoordFont(S32 x, S32 y, F32 z = 0) : LLCoord(x,y), mZ(z)
- {}
-
- void set(S32 x, S32 y) { LLCoord::set(x,y); mZ = 0.f; }
- void set(S32 x, S32 y, F32 z) { mX = x; mY = y; mZ = z; }
- bool operator==(const LLCoordFont& other) const { return mX == other.mX && mY == other.mY; }
- bool operator!=(const LLCoordFont& other) const { return !(*this == other); }
+ typedef S32 value_t;
+
+ LLCoordCommon convertToCommon() const;
+ void convertFromCommon(const LLCoordCommon& from);
};
-
#endif
diff --git a/indra/llmath/llmath.h b/indra/llmath/llmath.h
index b86768456d..b93f89d674 100644
--- a/indra/llmath/llmath.h
+++ b/indra/llmath/llmath.h
@@ -29,7 +29,7 @@
#include <cmath>
#include <cstdlib>
-#include <complex>
+#include <vector>
#include "lldefs.h"
//#include "llstl.h" // *TODO: Remove when LLString is gone
//#include "llstring.h" // *TODO: Remove when LLString is gone
@@ -55,32 +55,11 @@
#endif
// Single Precision Floating Point Routines
-#ifndef sqrtf
-#define sqrtf(x) ((F32)sqrt((F64)(x)))
-#endif
-#ifndef fsqrtf
-#define fsqrtf(x) sqrtf(x)
-#endif
-
-#ifndef cosf
-#define cosf(x) ((F32)cos((F64)(x)))
-#endif
-#ifndef sinf
-#define sinf(x) ((F32)sin((F64)(x)))
-#endif
-#ifndef tanf
+// (There used to be more defined here, but they appeared to be redundant and
+// were breaking some other includes. Removed by Falcon, reviewed by Andrew, 11/25/09)
+/*#ifndef tanf
#define tanf(x) ((F32)tan((F64)(x)))
-#endif
-#ifndef acosf
-#define acosf(x) ((F32)acos((F64)(x)))
-#endif
-
-#ifndef powf
-#define powf(x,y) ((F32)pow((F64)(x),(F64)(y)))
-#endif
-#ifndef expf
-#define expf(x) ((F32)exp((F64)(x)))
-#endif
+#endif*/
const F32 GRAVITY = -9.8f;
@@ -200,7 +179,7 @@ inline S32 llfloor( F32 f )
}
return result;
#else
- return (S32)floorf(f);
+ return (S32)floor(f);
#endif
}
@@ -378,11 +357,14 @@ inline F32 snap_to_sig_figs(F32 foo, S32 sig_figs)
bar *= 10.f;
}
- foo = (F32)llround(foo * bar);
+ //F32 new_foo = (F32)llround(foo * bar);
+ // the llround() implementation sucks. Don't us it.
+
+ F32 sign = (foo > 0.f) ? 1.f : -1.f;
+ F32 new_foo = F32( S64(foo * bar + sign * 0.5f));
+ new_foo /= bar;
- // shift back
- foo /= bar;
- return foo;
+ return new_foo;
}
inline F32 lerp(F32 a, F32 b, F32 u)
@@ -516,4 +498,52 @@ inline F32 llgaussian(F32 x, F32 o)
return 1.f/(F_SQRT_TWO_PI*o)*powf(F_E, -(x*x)/(2*o*o));
}
+//helper function for removing outliers
+template <class VEC_TYPE>
+inline void ll_remove_outliers(std::vector<VEC_TYPE>& data, F32 k)
+{
+ if (data.size() < 100)
+ { //not enough samples
+ return;
+ }
+
+ VEC_TYPE Q1 = data[data.size()/4];
+ VEC_TYPE Q3 = data[data.size()-data.size()/4-1];
+
+ if ((F32)(Q3-Q1) < 1.f)
+ {
+ // not enough variation to detect outliers
+ return;
+ }
+
+
+ VEC_TYPE min = (VEC_TYPE) ((F32) Q1-k * (F32) (Q3-Q1));
+ VEC_TYPE max = (VEC_TYPE) ((F32) Q3+k * (F32) (Q3-Q1));
+
+ U32 i = 0;
+ while (i < data.size() && data[i] < min)
+ {
+ i++;
+ }
+
+ S32 j = data.size()-1;
+ while (j > 0 && data[j] > max)
+ {
+ j--;
+ }
+
+ if (j < data.size()-1)
+ {
+ data.erase(data.begin()+j, data.end());
+ }
+
+ if (i > 0)
+ {
+ data.erase(data.begin(), data.begin()+i);
+ }
+}
+
+// Include simd math header
+#include "llsimdmath.h"
+
#endif
diff --git a/indra/llmath/llmatrix3a.cpp b/indra/llmath/llmatrix3a.cpp
new file mode 100644
index 0000000000..ab077abcb0
--- /dev/null
+++ b/indra/llmath/llmatrix3a.cpp
@@ -0,0 +1,134 @@
+/**
+ * @file llvector4a.cpp
+ * @brief SIMD vector implementation
+ *
+ * $LicenseInfo:firstyear=2010&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llmath.h"
+
+static LL_ALIGN_16(const F32 M_IDENT_3A[12]) =
+ { 1.f, 0.f, 0.f, 0.f, // Column 1
+ 0.f, 1.f, 0.f, 0.f, // Column 2
+ 0.f, 0.f, 1.f, 0.f }; // Column 3
+
+extern const LLMatrix3a LL_M3A_IDENTITY = *reinterpret_cast<const LLMatrix3a*> (M_IDENT_3A);
+
+void LLMatrix3a::setMul( const LLMatrix3a& lhs, const LLMatrix3a& rhs )
+{
+ const LLVector4a col0 = lhs.getColumn(0);
+ const LLVector4a col1 = lhs.getColumn(1);
+ const LLVector4a col2 = lhs.getColumn(2);
+
+ for ( int i = 0; i < 3; i++ )
+ {
+ LLVector4a xxxx = _mm_load_ss( rhs.mColumns[i].getF32ptr() );
+ xxxx.splat<0>( xxxx );
+ xxxx.mul( col0 );
+
+ {
+ LLVector4a yyyy = _mm_load_ss( rhs.mColumns[i].getF32ptr() + 1 );
+ yyyy.splat<0>( yyyy );
+ yyyy.mul( col1 );
+ xxxx.add( yyyy );
+ }
+
+ {
+ LLVector4a zzzz = _mm_load_ss( rhs.mColumns[i].getF32ptr() + 2 );
+ zzzz.splat<0>( zzzz );
+ zzzz.mul( col2 );
+ xxxx.add( zzzz );
+ }
+
+ xxxx.store4a( mColumns[i].getF32ptr() );
+ }
+
+}
+
+/*static */void LLMatrix3a::batchTransform( const LLMatrix3a& xform, const LLVector4a* src, int numVectors, LLVector4a* dst )
+{
+ const LLVector4a col0 = xform.getColumn(0);
+ const LLVector4a col1 = xform.getColumn(1);
+ const LLVector4a col2 = xform.getColumn(2);
+ const LLVector4a* maxAddr = src + numVectors;
+
+ if ( numVectors & 0x1 )
+ {
+ LLVector4a xxxx = _mm_load_ss( (const F32*)src );
+ LLVector4a yyyy = _mm_load_ss( (const F32*)src + 1 );
+ LLVector4a zzzz = _mm_load_ss( (const F32*)src + 2 );
+ xxxx.splat<0>( xxxx );
+ yyyy.splat<0>( yyyy );
+ zzzz.splat<0>( zzzz );
+ xxxx.mul( col0 );
+ yyyy.mul( col1 );
+ zzzz.mul( col2 );
+ xxxx.add( yyyy );
+ xxxx.add( zzzz );
+ xxxx.store4a( (F32*)dst );
+ src++;
+ dst++;
+ }
+
+
+ numVectors >>= 1;
+ while ( src < maxAddr )
+ {
+ _mm_prefetch( (const char*)(src + 32 ), _MM_HINT_NTA );
+ _mm_prefetch( (const char*)(dst + 32), _MM_HINT_NTA );
+ LLVector4a xxxx = _mm_load_ss( (const F32*)src );
+ LLVector4a xxxx1= _mm_load_ss( (const F32*)(src + 1) );
+
+ xxxx.splat<0>( xxxx );
+ xxxx1.splat<0>( xxxx1 );
+ xxxx.mul( col0 );
+ xxxx1.mul( col0 );
+
+ {
+ LLVector4a yyyy = _mm_load_ss( (const F32*)src + 1 );
+ LLVector4a yyyy1 = _mm_load_ss( (const F32*)(src + 1) + 1);
+ yyyy.splat<0>( yyyy );
+ yyyy1.splat<0>( yyyy1 );
+ yyyy.mul( col1 );
+ yyyy1.mul( col1 );
+ xxxx.add( yyyy );
+ xxxx1.add( yyyy1 );
+ }
+
+ {
+ LLVector4a zzzz = _mm_load_ss( (const F32*)(src) + 2 );
+ LLVector4a zzzz1 = _mm_load_ss( (const F32*)(++src) + 2 );
+ zzzz.splat<0>( zzzz );
+ zzzz1.splat<0>( zzzz1 );
+ zzzz.mul( col2 );
+ zzzz1.mul( col2 );
+ xxxx.add( zzzz );
+ xxxx1.add( zzzz1 );
+ }
+
+ xxxx.store4a(dst->getF32ptr());
+ src++;
+ dst++;
+
+ xxxx1.store4a((F32*)dst++);
+ }
+}
diff --git a/indra/llmath/llmatrix3a.h b/indra/llmath/llmatrix3a.h
new file mode 100644
index 0000000000..adb7e3389d
--- /dev/null
+++ b/indra/llmath/llmatrix3a.h
@@ -0,0 +1,128 @@
+/**
+ * @file llmatrix3a.h
+ * @brief LLMatrix3a class header file - memory aligned and vectorized 3x3 matrix
+ *
+ * $LicenseInfo:firstyear=2010&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLMATRIX3A_H
+#define LL_LLMATRIX3A_H
+
+/////////////////////////////
+// LLMatrix3a, LLRotation
+/////////////////////////////
+// This class stores a 3x3 (technically 4x3) matrix in column-major order
+/////////////////////////////
+/////////////////////////////
+// These classes are intentionally minimal right now. If you need additional
+// functionality, please contact someone with SSE experience (e.g., Falcon or
+// Huseby).
+/////////////////////////////
+
+// LLMatrix3a is the base class for LLRotation, which should be used instead any time you're dealing with a
+// rotation matrix.
+class LLMatrix3a
+{
+public:
+
+ // Utility function for quickly transforming an array of LLVector4a's
+ // For transforming a single LLVector4a, see LLVector4a::setRotated
+ static void batchTransform( const LLMatrix3a& xform, const LLVector4a* src, int numVectors, LLVector4a* dst );
+
+ // Utility function to obtain the identity matrix
+ static inline const LLMatrix3a& getIdentity();
+
+ //////////////////////////
+ // Ctors
+ //////////////////////////
+
+ // Ctor
+ LLMatrix3a() {}
+
+ // Ctor for setting by columns
+ inline LLMatrix3a( const LLVector4a& c0, const LLVector4a& c1, const LLVector4a& c2 );
+
+ //////////////////////////
+ // Get/Set
+ //////////////////////////
+
+ // Loads from an LLMatrix3
+ inline void loadu(const LLMatrix3& src);
+
+ // Set rows
+ inline void setRows(const LLVector4a& r0, const LLVector4a& r1, const LLVector4a& r2);
+
+ // Set columns
+ inline void setColumns(const LLVector4a& c0, const LLVector4a& c1, const LLVector4a& c2);
+
+ // Get the read-only access to a specified column. Valid columns are 0-2, but the
+ // function is unchecked. You've been warned.
+ inline const LLVector4a& getColumn(const U32 column) const;
+
+ /////////////////////////
+ // Matrix modification
+ /////////////////////////
+
+ // Set this matrix to the product of lhs and rhs ( this = lhs * rhs )
+ void setMul( const LLMatrix3a& lhs, const LLMatrix3a& rhs );
+
+ // Set this matrix to the transpose of src
+ inline void setTranspose(const LLMatrix3a& src);
+
+ // Set this matrix to a*w + b*(1-w)
+ inline void setLerp(const LLMatrix3a& a, const LLMatrix3a& b, F32 w);
+
+ /////////////////////////
+ // Matrix inspection
+ /////////////////////////
+
+ // Sets all 4 elements in 'dest' to the determinant of this matrix.
+ // If you will be using the determinant in subsequent ops with LLVector4a, use this version
+ inline void getDeterminant( LLVector4a& dest ) const;
+
+ // Returns the determinant as an LLSimdScalar. Use this if you will be using the determinant
+ // primary for scalar operations.
+ inline LLSimdScalar getDeterminant() const;
+
+ // Returns nonzero if rows 0-2 and colums 0-2 contain no NaN or INF values. Row 3 is ignored
+ inline LLBool32 isFinite() const;
+
+ // Returns true if this matrix is equal to 'rhs' up to 'tolerance'
+ inline bool isApproximatelyEqual( const LLMatrix3a& rhs, F32 tolerance = F_APPROXIMATELY_ZERO ) const;
+
+protected:
+
+ LLVector4a mColumns[3];
+
+};
+
+class LLRotation : public LLMatrix3a
+{
+public:
+
+ LLRotation() {}
+
+ // Returns true if this rotation is orthonormal with det ~= 1
+ inline bool isOkRotation() const;
+};
+
+#endif
diff --git a/indra/llmath/llmatrix3a.inl b/indra/llmath/llmatrix3a.inl
new file mode 100644
index 0000000000..37819fea3c
--- /dev/null
+++ b/indra/llmath/llmatrix3a.inl
@@ -0,0 +1,119 @@
+/**
+ * @file llmatrix3a.inl
+ * @brief LLMatrix3a inline definitions
+ *
+ * $LicenseInfo:firstyear=2010&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llmatrix3a.h"
+#include "m3math.h"
+
+inline LLMatrix3a::LLMatrix3a( const LLVector4a& c0, const LLVector4a& c1, const LLVector4a& c2 )
+{
+ setColumns( c0, c1, c2 );
+}
+
+inline void LLMatrix3a::loadu(const LLMatrix3& src)
+{
+ mColumns[0].load3(src.mMatrix[0]);
+ mColumns[1].load3(src.mMatrix[1]);
+ mColumns[2].load3(src.mMatrix[2]);
+}
+
+inline void LLMatrix3a::setRows(const LLVector4a& r0, const LLVector4a& r1, const LLVector4a& r2)
+{
+ mColumns[0] = r0;
+ mColumns[1] = r1;
+ mColumns[2] = r2;
+ setTranspose( *this );
+}
+
+inline void LLMatrix3a::setColumns(const LLVector4a& c0, const LLVector4a& c1, const LLVector4a& c2)
+{
+ mColumns[0] = c0;
+ mColumns[1] = c1;
+ mColumns[2] = c2;
+}
+
+inline void LLMatrix3a::setTranspose(const LLMatrix3a& src)
+{
+ const LLQuad srcCol0 = src.mColumns[0];
+ const LLQuad srcCol1 = src.mColumns[1];
+ const LLQuad unpacklo = _mm_unpacklo_ps( srcCol0, srcCol1 );
+ mColumns[0] = _mm_movelh_ps( unpacklo, src.mColumns[2] );
+ mColumns[1] = _mm_shuffle_ps( _mm_movehl_ps( srcCol0, unpacklo ), src.mColumns[2], _MM_SHUFFLE(0, 1, 1, 0) );
+ mColumns[2] = _mm_shuffle_ps( _mm_unpackhi_ps( srcCol0, srcCol1 ), src.mColumns[2], _MM_SHUFFLE(0, 2, 1, 0) );
+}
+
+inline const LLVector4a& LLMatrix3a::getColumn(const U32 column) const
+{
+ llassert( column < 3 );
+ return mColumns[column];
+}
+
+inline void LLMatrix3a::setLerp(const LLMatrix3a& a, const LLMatrix3a& b, F32 w)
+{
+ mColumns[0].setLerp( a.mColumns[0], b.mColumns[0], w );
+ mColumns[1].setLerp( a.mColumns[1], b.mColumns[1], w );
+ mColumns[2].setLerp( a.mColumns[2], b.mColumns[2], w );
+}
+
+inline LLBool32 LLMatrix3a::isFinite() const
+{
+ return mColumns[0].isFinite3() && mColumns[1].isFinite3() && mColumns[2].isFinite3();
+}
+
+inline void LLMatrix3a::getDeterminant( LLVector4a& dest ) const
+{
+ LLVector4a col1xcol2; col1xcol2.setCross3( mColumns[1], mColumns[2] );
+ dest.setAllDot3( col1xcol2, mColumns[0] );
+}
+
+inline LLSimdScalar LLMatrix3a::getDeterminant() const
+{
+ LLVector4a col1xcol2; col1xcol2.setCross3( mColumns[1], mColumns[2] );
+ return col1xcol2.dot3( mColumns[0] );
+}
+
+inline bool LLMatrix3a::isApproximatelyEqual( const LLMatrix3a& rhs, F32 tolerance /*= F_APPROXIMATELY_ZERO*/ ) const
+{
+ return rhs.getColumn(0).equals3(mColumns[0], tolerance)
+ && rhs.getColumn(1).equals3(mColumns[1], tolerance)
+ && rhs.getColumn(2).equals3(mColumns[2], tolerance);
+}
+
+inline const LLMatrix3a& LLMatrix3a::getIdentity()
+{
+ extern const LLMatrix3a LL_M3A_IDENTITY;
+ return LL_M3A_IDENTITY;
+}
+
+inline bool LLRotation::isOkRotation() const
+{
+ LLMatrix3a transpose; transpose.setTranspose( *this );
+ LLMatrix3a product; product.setMul( *this, transpose );
+
+ LLSimdScalar detMinusOne = getDeterminant() - 1.f;
+
+ return product.isApproximatelyEqual( LLMatrix3a::getIdentity() ) && (detMinusOne.getAbs() < F_APPROXIMATELY_ZERO);
+}
+
diff --git a/indra/llmath/llmatrix4a.h b/indra/llmath/llmatrix4a.h
new file mode 100644
index 0000000000..27cf5b79f6
--- /dev/null
+++ b/indra/llmath/llmatrix4a.h
@@ -0,0 +1,143 @@
+/**
+ * @file llmatrix4a.h
+ * @brief LLMatrix4a class header file - memory aligned and vectorized 4x4 matrix
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLMATRIX4A_H
+#define LL_LLMATRIX4A_H
+
+#include "llvector4a.h"
+#include "m4math.h"
+#include "m3math.h"
+
+class LLMatrix4a
+{
+public:
+ LLVector4a mMatrix[4];
+
+ inline void clear()
+ {
+ mMatrix[0].clear();
+ mMatrix[1].clear();
+ mMatrix[2].clear();
+ mMatrix[3].clear();
+ }
+
+ inline void loadu(const LLMatrix4& src)
+ {
+ mMatrix[0] = _mm_loadu_ps(src.mMatrix[0]);
+ mMatrix[1] = _mm_loadu_ps(src.mMatrix[1]);
+ mMatrix[2] = _mm_loadu_ps(src.mMatrix[2]);
+ mMatrix[3] = _mm_loadu_ps(src.mMatrix[3]);
+
+ }
+
+ inline void loadu(const LLMatrix3& src)
+ {
+ mMatrix[0].load3(src.mMatrix[0]);
+ mMatrix[1].load3(src.mMatrix[1]);
+ mMatrix[2].load3(src.mMatrix[2]);
+ mMatrix[3].set(0,0,0,1.f);
+ }
+
+ inline void add(const LLMatrix4a& rhs)
+ {
+ mMatrix[0].add(rhs.mMatrix[0]);
+ mMatrix[1].add(rhs.mMatrix[1]);
+ mMatrix[2].add(rhs.mMatrix[2]);
+ mMatrix[3].add(rhs.mMatrix[3]);
+ }
+
+ inline void setRows(const LLVector4a& r0, const LLVector4a& r1, const LLVector4a& r2)
+ {
+ mMatrix[0] = r0;
+ mMatrix[1] = r1;
+ mMatrix[2] = r2;
+ }
+
+ inline void setMul(const LLMatrix4a& m, const F32 s)
+ {
+ mMatrix[0].setMul(m.mMatrix[0], s);
+ mMatrix[1].setMul(m.mMatrix[1], s);
+ mMatrix[2].setMul(m.mMatrix[2], s);
+ mMatrix[3].setMul(m.mMatrix[3], s);
+ }
+
+ inline void setLerp(const LLMatrix4a& a, const LLMatrix4a& b, F32 w)
+ {
+ LLVector4a d0,d1,d2,d3;
+ d0.setSub(b.mMatrix[0], a.mMatrix[0]);
+ d1.setSub(b.mMatrix[1], a.mMatrix[1]);
+ d2.setSub(b.mMatrix[2], a.mMatrix[2]);
+ d3.setSub(b.mMatrix[3], a.mMatrix[3]);
+
+ // this = a + d*w
+
+ d0.mul(w);
+ d1.mul(w);
+ d2.mul(w);
+ d3.mul(w);
+
+ mMatrix[0].setAdd(a.mMatrix[0],d0);
+ mMatrix[1].setAdd(a.mMatrix[1],d1);
+ mMatrix[2].setAdd(a.mMatrix[2],d2);
+ mMatrix[3].setAdd(a.mMatrix[3],d3);
+ }
+
+ inline void rotate(const LLVector4a& v, LLVector4a& res)
+ {
+ res = _mm_shuffle_ps(v, v, _MM_SHUFFLE(0, 0, 0, 0));
+ res.mul(mMatrix[0]);
+
+ LLVector4a y;
+ y = _mm_shuffle_ps(v, v, _MM_SHUFFLE(1, 1, 1, 1));
+ y.mul(mMatrix[1]);
+
+ LLVector4a z;
+ z = _mm_shuffle_ps(v, v, _MM_SHUFFLE(2, 2, 2, 2));
+ z.mul(mMatrix[2]);
+
+ res.add(y);
+ res.add(z);
+ }
+
+ inline void affineTransform(const LLVector4a& v, LLVector4a& res)
+ {
+ LLVector4a x,y,z;
+
+ x = _mm_shuffle_ps(v, v, _MM_SHUFFLE(0, 0, 0, 0));
+ y = _mm_shuffle_ps(v, v, _MM_SHUFFLE(1, 1, 1, 1));
+ z = _mm_shuffle_ps(v, v, _MM_SHUFFLE(2, 2, 2, 2));
+
+ x.mul(mMatrix[0]);
+ y.mul(mMatrix[1]);
+ z.mul(mMatrix[2]);
+
+ x.add(y);
+ z.add(mMatrix[3]);
+ res.setAdd(x,z);
+ }
+};
+
+#endif
diff --git a/indra/llmath/lloctree.h b/indra/llmath/lloctree.h
index 90d4d742c9..1b11e83b4a 100644
--- a/indra/llmath/lloctree.h
+++ b/indra/llmath/lloctree.h
@@ -29,21 +29,20 @@
#include "lltreenode.h"
#include "v3math.h"
+#include "llvector4a.h"
#include <vector>
#include <set>
-#if LL_RELEASE_WITH_DEBUG_INFO || LL_DEBUG
-#define OCT_ERRS LL_ERRS("OctreeErrors")
-#else
#define OCT_ERRS LL_WARNS("OctreeErrors")
-#endif
-#define LL_OCTREE_PARANOIA_CHECK 0
+
+extern U32 gOctreeMaxCapacity;
+/*#define LL_OCTREE_PARANOIA_CHECK 0
#if LL_DARWIN
#define LL_OCTREE_MAX_CAPACITY 32
#else
#define LL_OCTREE_MAX_CAPACITY 128
-#endif
+#endif*/
template <class T> class LLOctreeNode;
@@ -67,39 +66,56 @@ public:
};
template <class T>
+class LLOctreeTravelerDepthFirst : public LLOctreeTraveler<T>
+{
+public:
+ virtual void traverse(const LLOctreeNode<T>* node);
+};
+
+template <class T>
class LLOctreeNode : public LLTreeNode<T>
{
public:
+
typedef LLOctreeTraveler<T> oct_traveler;
typedef LLTreeTraveler<T> tree_traveler;
typedef typename std::set<LLPointer<T> > element_list;
- typedef typename std::set<LLPointer<T> >::iterator element_iter;
- typedef typename std::set<LLPointer<T> >::const_iterator const_element_iter;
+ typedef typename element_list::iterator element_iter;
+ typedef typename element_list::const_iterator const_element_iter;
typedef typename std::vector<LLTreeListener<T>*>::iterator tree_listener_iter;
typedef typename std::vector<LLOctreeNode<T>* > child_list;
typedef LLTreeNode<T> BaseType;
typedef LLOctreeNode<T> oct_node;
typedef LLOctreeListener<T> oct_listener;
- static const U8 OCTANT_POSITIVE_X = 0x01;
- static const U8 OCTANT_POSITIVE_Y = 0x02;
- static const U8 OCTANT_POSITIVE_Z = 0x04;
-
- LLOctreeNode( LLVector3d center,
- LLVector3d size,
+ /*void* operator new(size_t size)
+ {
+ return ll_aligned_malloc_16(size);
+ }
+
+ void operator delete(void* ptr)
+ {
+ ll_aligned_free_16(ptr);
+ }*/
+
+ LLOctreeNode( const LLVector4a& center,
+ const LLVector4a& size,
BaseType* parent,
U8 octant = 255)
: mParent((oct_node*)parent),
- mCenter(center),
- mSize(size),
mOctant(octant)
{
+ mCenter = center;
+ mSize = size;
+
updateMinMax();
if ((mOctant == 255) && mParent)
{
- mOctant = ((oct_node*) mParent)->getOctant(mCenter.mdV);
+ mOctant = ((oct_node*) mParent)->getOctant(mCenter);
}
+ mElementCount = 0;
+
clearChildren();
}
@@ -114,40 +130,24 @@ public:
}
inline const BaseType* getParent() const { return mParent; }
- inline void setParent(BaseType* parent) { mParent = (oct_node*) parent; }
- inline const LLVector3d& getCenter() const { return mCenter; }
- inline const LLVector3d& getSize() const { return mSize; }
- inline void setCenter(LLVector3d center) { mCenter = center; }
- inline void setSize(LLVector3d size) { mSize = size; }
- inline oct_node* getNodeAt(T* data) { return getNodeAt(data->getPositionGroup(), data->getBinRadius()); }
- inline U8 getOctant() const { return mOctant; }
- inline void setOctant(U8 octant) { mOctant = octant; }
+ inline void setParent(BaseType* parent) { mParent = (oct_node*) parent; }
+ inline const LLVector4a& getCenter() const { return mCenter; }
+ inline const LLVector4a& getSize() const { return mSize; }
+ inline void setCenter(const LLVector4a& center) { mCenter = center; }
+ inline void setSize(const LLVector4a& size) { mSize = size; }
+ inline oct_node* getNodeAt(T* data) { return getNodeAt(data->getPositionGroup(), data->getBinRadius()); }
+ inline U8 getOctant() const { return mOctant; }
inline const oct_node* getOctParent() const { return (const oct_node*) getParent(); }
inline oct_node* getOctParent() { return (oct_node*) getParent(); }
- U8 getOctant(const F64 pos[]) const //get the octant pos is in
+ U8 getOctant(const LLVector4a& pos) const //get the octant pos is in
{
- U8 ret = 0;
-
- if (pos[0] > mCenter.mdV[0])
- {
- ret |= OCTANT_POSITIVE_X;
- }
- if (pos[1] > mCenter.mdV[1])
- {
- ret |= OCTANT_POSITIVE_Y;
- }
- if (pos[2] > mCenter.mdV[2])
- {
- ret |= OCTANT_POSITIVE_Z;
- }
-
- return ret;
+ return (U8) (pos.greaterThan(mCenter).getGatheredBits() & 0x7);
}
- inline bool isInside(const LLVector3d& pos, const F64& rad) const
+ inline bool isInside(const LLVector4a& pos, const F32& rad) const
{
- return rad <= mSize.mdV[0]*2.0 && isInside(pos);
+ return rad <= mSize[0]*2.f && isInside(pos);
}
inline bool isInside(T* data) const
@@ -155,29 +155,27 @@ public:
return isInside(data->getPositionGroup(), data->getBinRadius());
}
- bool isInside(const LLVector3d& pos) const
+ bool isInside(const LLVector4a& pos) const
{
- const F64& x = pos.mdV[0];
- const F64& y = pos.mdV[1];
- const F64& z = pos.mdV[2];
-
- if (x > mMax.mdV[0] || x <= mMin.mdV[0] ||
- y > mMax.mdV[1] || y <= mMin.mdV[1] ||
- z > mMax.mdV[2] || z <= mMin.mdV[2])
+ S32 gt = pos.greaterThan(mMax).getGatheredBits() & 0x7;
+ if (gt)
{
return false;
}
-
+
+ S32 lt = pos.lessEqual(mMin).getGatheredBits() & 0x7;
+ if (lt)
+ {
+ return false;
+ }
+
return true;
}
void updateMinMax()
{
- for (U32 i = 0; i < 3; i++)
- {
- mMax.mdV[i] = mCenter.mdV[i] + mSize.mdV[i];
- mMin.mdV[i] = mCenter.mdV[i] - mSize.mdV[i];
- }
+ mMax.setAdd(mCenter, mSize);
+ mMin.setSub(mCenter, mSize);
}
inline oct_listener* getOctListener(U32 index)
@@ -190,44 +188,44 @@ public:
return contains(xform->getBinRadius());
}
- bool contains(F64 radius)
+ bool contains(F32 radius)
{
if (mParent == NULL)
{ //root node contains nothing
return false;
}
- F64 size = mSize.mdV[0];
- F64 p_size = size * 2.0;
+ F32 size = mSize[0];
+ F32 p_size = size * 2.f;
- return (radius <= 0.001 && size <= 0.001) ||
+ return (radius <= 0.001f && size <= 0.001f) ||
(radius <= p_size && radius > size);
}
- static void pushCenter(LLVector3d &center, const LLVector3d &size, const T* data)
+ static void pushCenter(LLVector4a &center, const LLVector4a &size, const T* data)
{
- const LLVector3d& pos = data->getPositionGroup();
- for (U32 i = 0; i < 3; i++)
- {
- if (pos.mdV[i] > center.mdV[i])
- {
- center.mdV[i] += size.mdV[i];
- }
- else
- {
- center.mdV[i] -= size.mdV[i];
- }
- }
+ const LLVector4a& pos = data->getPositionGroup();
+
+ LLVector4Logical gt = pos.greaterThan(center);
+
+ LLVector4a up;
+ up = _mm_and_ps(size, gt);
+
+ LLVector4a down;
+ down = _mm_andnot_ps(gt, size);
+
+ center.add(up);
+ center.sub(down);
}
void accept(oct_traveler* visitor) { visitor->visit(this); }
virtual bool isLeaf() const { return mChild.empty(); }
- U32 getElementCount() const { return mData.size(); }
+ U32 getElementCount() const { return mElementCount; }
element_list& getData() { return mData; }
const element_list& getData() const { return mData; }
- U32 getChildCount() const { return mChild.size(); }
+ U32 getChildCount() const { return mChildCount; }
oct_node* getChild(U32 index) { return mChild[index]; }
const oct_node* getChild(U32 index) const { return mChild[index]; }
child_list& getChildren() { return mChild; }
@@ -236,32 +234,49 @@ public:
void accept(tree_traveler* visitor) const { visitor->visit(this); }
void accept(oct_traveler* visitor) const { visitor->visit(this); }
- oct_node* getNodeAt(const LLVector3d& pos, const F64& rad)
+ void validateChildMap()
+ {
+ for (U32 i = 0; i < 8; i++)
+ {
+ U8 idx = mChildMap[i];
+ if (idx != 255)
+ {
+ LLOctreeNode<T>* child = mChild[idx];
+
+ if (child->getOctant() != i)
+ {
+ llerrs << "Invalid child map, bad octant data." << llendl;
+ }
+
+ if (getOctant(child->getCenter()) != child->getOctant())
+ {
+ llerrs << "Invalid child octant compared to position data." << llendl;
+ }
+ }
+ }
+ }
+
+
+ oct_node* getNodeAt(const LLVector4a& pos, const F32& rad)
{
LLOctreeNode<T>* node = this;
if (node->isInside(pos, rad))
{
//do a quick search by octant
- U8 octant = node->getOctant(pos.mdV);
- BOOL keep_going = TRUE;
-
+ U8 octant = node->getOctant(pos);
+
//traverse the tree until we find a node that has no node
//at the appropriate octant or is smaller than the object.
//by definition, that node is the smallest node that contains
// the data
- while (keep_going && node->getSize().mdV[0] >= rad)
+ U8 next_node = node->mChildMap[octant];
+
+ while (next_node != 255 && node->getSize()[0] >= rad)
{
- keep_going = FALSE;
- for (U32 i = 0; i < node->getChildCount() && !keep_going; i++)
- {
- if (node->getChild(i)->getOctant() == octant)
- {
- node = node->getChild(i);
- octant = node->getOctant(pos.mdV);
- keep_going = TRUE;
- }
- }
+ node = node->getChild(next_node);
+ octant = node->getOctant(pos);
+ next_node = node->mChildMap[octant];
}
}
else if (!node->contains(rad) && node->getParent())
@@ -276,7 +291,7 @@ public:
{
if (data == NULL)
{
- //OCT_ERRS << "!!! INVALID ELEMENT ADDED TO OCTREE BRANCH !!!" << llendl;
+ OCT_ERRS << "!!! INVALID ELEMENT ADDED TO OCTREE BRANCH !!!" << llendl;
return false;
}
LLOctreeNode<T>* parent = getOctParent();
@@ -284,22 +299,16 @@ public:
//is it here?
if (isInside(data->getPositionGroup()))
{
- if (getElementCount() < LL_OCTREE_MAX_CAPACITY &&
- (contains(data->getBinRadius()) ||
- (data->getBinRadius() > getSize().mdV[0] &&
- parent && parent->getElementCount() >= LL_OCTREE_MAX_CAPACITY)))
+ if ((getElementCount() < gOctreeMaxCapacity && contains(data->getBinRadius()) ||
+ (data->getBinRadius() > getSize()[0] && parent && parent->getElementCount() >= gOctreeMaxCapacity)))
{ //it belongs here
-#if LL_OCTREE_PARANOIA_CHECK
//if this is a redundant insertion, error out (should never happen)
- if (mData.find(data) != mData.end())
- {
- llwarns << "Redundant octree insertion detected. " << data << llendl;
- return false;
- }
-#endif
+ llassert(mData.find(data) == mData.end());
mData.insert(data);
BaseType::insert(data);
+
+ mElementCount = mData.size();
return true;
}
else
@@ -317,19 +326,26 @@ public:
}
//it's here, but no kids are in the right place, make a new kid
- LLVector3d center(getCenter());
- LLVector3d size(getSize()*0.5);
+ LLVector4a center = getCenter();
+ LLVector4a size = getSize();
+ size.mul(0.5f);
//push center in direction of data
LLOctreeNode<T>::pushCenter(center, size, data);
// handle case where floating point number gets too small
- if( llabs(center.mdV[0] - getCenter().mdV[0]) < F_APPROXIMATELY_ZERO &&
- llabs(center.mdV[1] - getCenter().mdV[1]) < F_APPROXIMATELY_ZERO &&
- llabs(center.mdV[2] - getCenter().mdV[2]) < F_APPROXIMATELY_ZERO)
+ LLVector4a val;
+ val.setSub(center, getCenter());
+ val.setAbs(val);
+
+ S32 lt = val.lessThan(LLVector4a::getEpsilon()).getGatheredBits() & 0x7;
+
+ if( lt == 0x7 )
{
mData.insert(data);
BaseType::insert(data);
+
+ mElementCount = mData.size();
return true;
}
@@ -344,7 +360,7 @@ public:
//make sure no existing node matches this position
for (U32 i = 0; i < getChildCount(); i++)
{
- if (mChild[i]->getCenter() == center)
+ if (mChild[i]->getCenter().equals3(center))
{
OCT_ERRS << "Octree detected duplicate child center and gave up." << llendl;
return false;
@@ -362,7 +378,7 @@ public:
else
{
//it's not in here, give it to the root
- //OCT_ERRS << "Octree insertion failed, starting over from root!" << llendl;
+ OCT_ERRS << "Octree insertion failed, starting over from root!" << llendl;
oct_node* node = this;
@@ -383,6 +399,7 @@ public:
if (mData.find(data) != mData.end())
{ //we have data
mData.erase(data);
+ mElementCount = mData.size();
notifyRemoval(data);
checkAlive();
return true;
@@ -420,6 +437,7 @@ public:
if (mData.find(data) != mData.end())
{
mData.erase(data);
+ mElementCount = mData.size();
notifyRemoval(data);
llwarns << "FOUND!" << llendl;
checkAlive();
@@ -436,6 +454,9 @@ public:
void clearChildren()
{
mChild.clear();
+ mChildCount = 0;
+ U32* foo = (U32*) mChildMap;
+ foo[0] = foo[1] = 0xFFFFFFFF;
}
void validate()
@@ -469,13 +490,19 @@ public:
void addChild(oct_node* child, BOOL silent = FALSE)
{
#if LL_OCTREE_PARANOIA_CHECK
+
+ if (child->getSize().equals3(getSize()))
+ {
+ OCT_ERRS << "Child size is same as parent size!" << llendl;
+ }
+
for (U32 i = 0; i < getChildCount(); i++)
{
- if(mChild[i]->getSize() != child->getSize())
+ if(!mChild[i]->getSize().equals3(child->getSize()))
{
OCT_ERRS <<"Invalid octree child size." << llendl;
}
- if (mChild[i]->getCenter() == child->getCenter())
+ if (mChild[i]->getCenter().equals3(child->getCenter()))
{
OCT_ERRS <<"Duplicate octree child position." << llendl;
}
@@ -487,7 +514,10 @@ public:
}
#endif
+ mChildMap[child->getOctant()] = mChildCount;
+
mChild.push_back(child);
+ ++mChildCount;
child->setParent(this);
if (!silent)
@@ -500,20 +530,30 @@ public:
}
}
- void removeChild(U8 index, BOOL destroy = FALSE)
+ void removeChild(S32 index, BOOL destroy = FALSE)
{
for (U32 i = 0; i < this->getListenerCount(); i++)
{
oct_listener* listener = getOctListener(i);
listener->handleChildRemoval(this, getChild(index));
}
-
+
if (destroy)
{
mChild[index]->destroy();
delete mChild[index];
}
mChild.erase(mChild.begin() + index);
+ --mChildCount;
+
+ //rebuild child map
+ U32* foo = (U32*) mChildMap;
+ foo[0] = foo[1] = 0xFFFFFFFF;
+
+ for (U32 i = 0; i < mChildCount; ++i)
+ {
+ mChildMap[mChild[i]->getOctant()] = i;
+ }
checkAlive();
}
@@ -541,19 +581,34 @@ public:
}
}
- //OCT_ERRS << "Octree failed to delete requested child." << llendl;
+ OCT_ERRS << "Octree failed to delete requested child." << llendl;
}
protected:
- child_list mChild;
- element_list mData;
+ typedef enum
+ {
+ CENTER = 0,
+ SIZE = 1,
+ MAX = 2,
+ MIN = 3
+ } eDName;
+
+ LLVector4a mCenter;
+ LLVector4a mSize;
+ LLVector4a mMax;
+ LLVector4a mMin;
+
oct_node* mParent;
- LLVector3d mCenter;
- LLVector3d mSize;
- LLVector3d mMax;
- LLVector3d mMin;
U8 mOctant;
-};
+
+ child_list mChild;
+ U8 mChildMap[8];
+ U32 mChildCount;
+
+ element_list mData;
+ U32 mElementCount;
+
+};
//just like a regular node, except it might expand on insert and compress on balance
template <class T>
@@ -563,9 +618,9 @@ public:
typedef LLOctreeNode<T> BaseType;
typedef LLOctreeNode<T> oct_node;
- LLOctreeRoot( LLVector3d center,
- LLVector3d size,
- BaseType* parent)
+ LLOctreeRoot(const LLVector4a& center,
+ const LLVector4a& size,
+ BaseType* parent)
: BaseType(center, size, parent)
{
}
@@ -596,6 +651,8 @@ public:
//destroy child
child->clearChildren();
delete child;
+
+ return false;
}
return true;
@@ -606,28 +663,33 @@ public:
{
if (data == NULL)
{
- //OCT_ERRS << "!!! INVALID ELEMENT ADDED TO OCTREE ROOT !!!" << llendl;
+ OCT_ERRS << "!!! INVALID ELEMENT ADDED TO OCTREE ROOT !!!" << llendl;
return false;
}
if (data->getBinRadius() > 4096.0)
{
- //OCT_ERRS << "!!! ELEMENT EXCEEDS MAXIMUM SIZE IN OCTREE ROOT !!!" << llendl;
+ OCT_ERRS << "!!! ELEMENT EXCEEDS MAXIMUM SIZE IN OCTREE ROOT !!!" << llendl;
return false;
}
- const F64 MAX_MAG = 1024.0*1024.0;
+ LLVector4a MAX_MAG;
+ MAX_MAG.splat(1024.f*1024.f);
+
+ const LLVector4a& v = data->getPositionGroup();
- const LLVector3d& v = data->getPositionGroup();
- if (!(fabs(v.mdV[0]-this->mCenter.mdV[0]) < MAX_MAG &&
- fabs(v.mdV[1]-this->mCenter.mdV[1]) < MAX_MAG &&
- fabs(v.mdV[2]-this->mCenter.mdV[2]) < MAX_MAG))
+ LLVector4a val;
+ val.setSub(v, BaseType::mCenter);
+ val.setAbs(val);
+ S32 lt = val.lessThan(MAX_MAG).getGatheredBits() & 0x7;
+
+ if (lt != 0x7)
{
//OCT_ERRS << "!!! ELEMENT EXCEEDS RANGE OF SPATIAL PARTITION !!!" << llendl;
return false;
}
- if (this->getSize().mdV[0] > data->getBinRadius() && isInside(data->getPositionGroup()))
+ if (this->getSize()[0] > data->getBinRadius() && isInside(data->getPositionGroup()))
{
//we got it, just act like a branch
oct_node* node = getNodeAt(data);
@@ -643,31 +705,34 @@ public:
else if (this->getChildCount() == 0)
{
//first object being added, just wrap it up
- while (!(this->getSize().mdV[0] > data->getBinRadius() && isInside(data->getPositionGroup())))
+ while (!(this->getSize()[0] > data->getBinRadius() && isInside(data->getPositionGroup())))
{
- LLVector3d center, size;
+ LLVector4a center, size;
center = this->getCenter();
size = this->getSize();
LLOctreeNode<T>::pushCenter(center, size, data);
this->setCenter(center);
- this->setSize(size*2);
+ size.mul(2.f);
+ this->setSize(size);
this->updateMinMax();
}
LLOctreeNode<T>::insert(data);
}
else
{
- while (!(this->getSize().mdV[0] > data->getBinRadius() && isInside(data->getPositionGroup())))
+ while (!(this->getSize()[0] > data->getBinRadius() && isInside(data->getPositionGroup())))
{
//the data is outside the root node, we need to grow
- LLVector3d center(this->getCenter());
- LLVector3d size(this->getSize());
+ LLVector4a center(this->getCenter());
+ LLVector4a size(this->getSize());
//expand this node
- LLVector3d newcenter(center);
+ LLVector4a newcenter(center);
LLOctreeNode<T>::pushCenter(newcenter, size, data);
this->setCenter(newcenter);
- this->setSize(size*2);
+ LLVector4a size2 = size;
+ size2.mul(2.f);
+ this->setSize(size2);
this->updateMinMax();
//copy our children to a new branch
@@ -704,4 +769,15 @@ void LLOctreeTraveler<T>::traverse(const LLOctreeNode<T>* node)
traverse(node->getChild(i));
}
}
+
+template <class T>
+void LLOctreeTravelerDepthFirst<T>::traverse(const LLOctreeNode<T>* node)
+{
+ for (U32 i = 0; i < node->getChildCount(); i++)
+ {
+ traverse(node->getChild(i));
+ }
+ node->accept(this);
+}
+
#endif
diff --git a/indra/llmath/llplane.h b/indra/llmath/llplane.h
index 443f3f46b9..a611894721 100644
--- a/indra/llmath/llplane.h
+++ b/indra/llmath/llplane.h
@@ -36,19 +36,23 @@
// The plane normal = [A, B, C]
// The closest approach = D / sqrt(A*A + B*B + C*C)
-class LLPlane : public LLVector4
+class LLPlane
{
public:
+
+ // Constructors
LLPlane() {}; // no default constructor
LLPlane(const LLVector3 &p0, F32 d) { setVec(p0, d); }
LLPlane(const LLVector3 &p0, const LLVector3 &n) { setVec(p0, n); }
- void setVec(const LLVector3 &p0, F32 d) { LLVector4::setVec(p0[0], p0[1], p0[2], d); }
- void setVec(const LLVector3 &p0, const LLVector3 &n)
+ inline void setVec(const LLVector3 &p0, F32 d) { mV.set(p0[0], p0[1], p0[2], d); }
+
+ // Set
+ inline void setVec(const LLVector3 &p0, const LLVector3 &n)
{
F32 d = -(p0 * n);
setVec(n, d);
}
- void setVec(const LLVector3 &p0, const LLVector3 &p1, const LLVector3 &p2)
+ inline void setVec(const LLVector3 &p0, const LLVector3 &p1, const LLVector3 &p2)
{
LLVector3 u, v, w;
u = p1 - p0;
@@ -58,8 +62,38 @@ public:
F32 d = -(w * p0);
setVec(w, d);
}
- LLPlane& operator=(const LLVector4& v2) { LLVector4::setVec(v2[0],v2[1],v2[2],v2[3]); return *this;}
+
+ inline LLPlane& operator=(const LLVector4& v2) { mV.set(v2[0],v2[1],v2[2],v2[3]); return *this;}
+
+ inline LLPlane& operator=(const LLVector4a& v2) { mV.set(v2[0],v2[1],v2[2],v2[3]); return *this;}
+
+ inline void set(const LLPlane& p2) { mV = p2.mV; }
+
+ //
F32 dist(const LLVector3 &v2) const { return mV[0]*v2[0] + mV[1]*v2[1] + mV[2]*v2[2] + mV[3]; }
+
+ inline LLSimdScalar dot3(const LLVector4a& b) const { return mV.dot3(b); }
+
+ // Read-only access a single float in this vector. Do not use in proximity to any function call that manipulates
+ // the data at the whole vector level or you will incur a substantial penalty. Consider using the splat functions instead
+ inline F32 operator[](const S32 idx) const { return mV[idx]; }
+
+ // preferable when index is known at compile time
+ template <int N> LL_FORCE_INLINE void getAt(LLSimdScalar& v) const { v = mV.getScalarAt<N>(); }
+
+ // reset the vector to 0, 0, 0, 1
+ inline void clear() { mV.set(0, 0, 0, 1); }
+
+ inline void getVector3(LLVector3& vec) const { vec.set(mV[0], mV[1], mV[2]); }
+
+ // Retrieve the mask indicating which of the x, y, or z axis are greater or equal to zero.
+ inline U8 calcPlaneMask()
+ {
+ return mV.greaterEqual(LLVector4a::getZero()).getGatheredBits() & LLVector4Logical::MASK_XYZ;
+ }
+
+private:
+ LLVector4a mV;
};
diff --git a/indra/llmath/llquantize.h b/indra/llmath/llquantize.h
index 7f56ff3448..1595dbecf8 100644
--- a/indra/llmath/llquantize.h
+++ b/indra/llmath/llquantize.h
@@ -29,10 +29,16 @@
#define LL_LLQUANTIZE_H
const U16 U16MAX = 65535;
+LL_ALIGN_16( const F32 F_U16MAX_4A[4] ) = { 65535.f, 65535.f, 65535.f, 65535.f };
+
const F32 OOU16MAX = 1.f/(F32)(U16MAX);
+LL_ALIGN_16( const F32 F_OOU16MAX_4A[4] ) = { OOU16MAX, OOU16MAX, OOU16MAX, OOU16MAX };
const U8 U8MAX = 255;
+LL_ALIGN_16( const F32 F_U8MAX_4A[4] ) = { 255.f, 255.f, 255.f, 255.f };
+
const F32 OOU8MAX = 1.f/(F32)(U8MAX);
+LL_ALIGN_16( const F32 F_OOU8MAX_4A[4] ) = { OOU8MAX, OOU8MAX, OOU8MAX, OOU8MAX };
const U8 FIRSTVALIDCHAR = 54;
const U8 MAXSTRINGVAL = U8MAX - FIRSTVALIDCHAR; //we don't allow newline or null
diff --git a/indra/llmath/llquaternion.cpp b/indra/llmath/llquaternion.cpp
index a51f11072c..7381d5eb99 100644
--- a/indra/llmath/llquaternion.cpp
+++ b/indra/llmath/llquaternion.cpp
@@ -26,9 +26,10 @@
#include "linden_common.h"
+#include "llmath.h" // for F_PI
+
#include "llquaternion.h"
-#include "llmath.h" // for F_PI
//#include "vmath.h"
#include "v3math.h"
#include "v3dmath.h"
diff --git a/indra/llmath/llquaternion.h b/indra/llmath/llquaternion.h
index 26da14ae20..ca0dfe206b 100644
--- a/indra/llmath/llquaternion.h
+++ b/indra/llmath/llquaternion.h
@@ -27,7 +27,11 @@
#ifndef LLQUATERNION_H
#define LLQUATERNION_H
-#include "llmath.h"
+#include <iostream>
+
+#ifndef LLMATH_H //enforce specific include order to avoid tangling inline dependencies
+#error "Please include llmath.h first."
+#endif
class LLVector4;
class LLVector3;
diff --git a/indra/llmath/llquaternion2.h b/indra/llmath/llquaternion2.h
new file mode 100644
index 0000000000..fd9c0cf3ab
--- /dev/null
+++ b/indra/llmath/llquaternion2.h
@@ -0,0 +1,105 @@
+/**
+ * @file llquaternion2.h
+ * @brief LLQuaternion2 class header file - SIMD-enabled quaternion class
+ *
+ * $LicenseInfo:firstyear=2010&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_QUATERNION2_H
+#define LL_QUATERNION2_H
+
+/////////////////////////////
+// LLQuaternion2
+/////////////////////////////
+// This class stores a quaternion x*i + y*j + z*k + w in <x, y, z, w> order
+// (i.e., w in high order element of vector)
+/////////////////////////////
+/////////////////////////////
+// These classes are intentionally minimal right now. If you need additional
+// functionality, please contact someone with SSE experience (e.g., Falcon or
+// Huseby).
+/////////////////////////////
+#include "llquaternion.h"
+
+class LLQuaternion2
+{
+public:
+
+ //////////////////////////
+ // Ctors
+ //////////////////////////
+
+ // Ctor
+ LLQuaternion2() {}
+
+ // Ctor from LLQuaternion
+ explicit LLQuaternion2( const class LLQuaternion& quat );
+
+ //////////////////////////
+ // Get/Set
+ //////////////////////////
+
+ // Load from an LLQuaternion
+ inline void operator=( const LLQuaternion& quat )
+ {
+ mQ.loadua( quat.mQ );
+ }
+
+ // Return the internal LLVector4a representation of the quaternion
+ inline const LLVector4a& getVector4a() const;
+ inline LLVector4a& getVector4aRw();
+
+ /////////////////////////
+ // Quaternion modification
+ /////////////////////////
+
+ // Set this quaternion to the conjugate of src
+ inline void setConjugate(const LLQuaternion2& src);
+
+ // Renormalizes the quaternion. Assumes it has nonzero length.
+ inline void normalize();
+
+ // Quantize this quaternion to 8 bit precision
+ inline void quantize8();
+
+ // Quantize this quaternion to 16 bit precision
+ inline void quantize16();
+
+ /////////////////////////
+ // Quaternion inspection
+ /////////////////////////
+
+ // Return true if this quaternion is equal to 'rhs'.
+ // Note! Quaternions exhibit "double-cover", so any rotation has two equally valid
+ // quaternion representations and they will NOT compare equal.
+ inline bool equals(const LLQuaternion2& rhs, F32 tolerance = F_APPROXIMATELY_ZERO ) const;
+
+ // Return true if all components are finite and the quaternion is normalized
+ inline bool isOkRotation() const;
+
+protected:
+
+ LLVector4a mQ;
+
+};
+
+#endif
diff --git a/indra/llmath/llquaternion2.inl b/indra/llmath/llquaternion2.inl
new file mode 100644
index 0000000000..2a6987552d
--- /dev/null
+++ b/indra/llmath/llquaternion2.inl
@@ -0,0 +1,102 @@
+/**
+ * @file llquaternion2.inl
+ * @brief LLQuaternion2 inline definitions
+ *
+ * $LicenseInfo:firstyear=2010&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llquaternion2.h"
+
+static const LLQuad LL_V4A_PLUS_ONE = {1.f, 1.f, 1.f, 1.f};
+static const LLQuad LL_V4A_MINUS_ONE = {-1.f, -1.f, -1.f, -1.f};
+
+// Ctor from LLQuaternion
+inline LLQuaternion2::LLQuaternion2( const LLQuaternion& quat )
+{
+ mQ.set(quat.mQ[VX], quat.mQ[VY], quat.mQ[VZ], quat.mQ[VW]);
+}
+
+//////////////////////////
+// Get/Set
+//////////////////////////
+
+// Return the internal LLVector4a representation of the quaternion
+inline const LLVector4a& LLQuaternion2::getVector4a() const
+{
+ return mQ;
+}
+
+inline LLVector4a& LLQuaternion2::getVector4aRw()
+{
+ return mQ;
+}
+
+/////////////////////////
+// Quaternion modification
+/////////////////////////
+
+// Set this quaternion to the conjugate of src
+inline void LLQuaternion2::setConjugate(const LLQuaternion2& src)
+{
+ static LL_ALIGN_16( const U32 F_QUAT_INV_MASK_4A[4] ) = { 0x80000000, 0x80000000, 0x80000000, 0x00000000 };
+ mQ = _mm_xor_ps(src.mQ, *reinterpret_cast<const LLQuad*>(&F_QUAT_INV_MASK_4A));
+}
+
+// Renormalizes the quaternion. Assumes it has nonzero length.
+inline void LLQuaternion2::normalize()
+{
+ mQ.normalize4();
+}
+
+// Quantize this quaternion to 8 bit precision
+inline void LLQuaternion2::quantize8()
+{
+ mQ.quantize8( LL_V4A_MINUS_ONE, LL_V4A_PLUS_ONE );
+ normalize();
+}
+
+// Quantize this quaternion to 16 bit precision
+inline void LLQuaternion2::quantize16()
+{
+ mQ.quantize16( LL_V4A_MINUS_ONE, LL_V4A_PLUS_ONE );
+ normalize();
+}
+
+
+/////////////////////////
+// Quaternion inspection
+/////////////////////////
+
+// Return true if this quaternion is equal to 'rhs'.
+// Note! Quaternions exhibit "double-cover", so any rotation has two equally valid
+// quaternion representations and they will NOT compare equal.
+inline bool LLQuaternion2::equals(const LLQuaternion2 &rhs, F32 tolerance/* = F_APPROXIMATELY_ZERO*/) const
+{
+ return mQ.equals4(rhs.mQ, tolerance);
+}
+
+// Return true if all components are finite and the quaternion is normalized
+inline bool LLQuaternion2::isOkRotation() const
+{
+ return mQ.isFinite4() && mQ.isNormalized4();
+}
+
diff --git a/indra/llmath/llsimdmath.h b/indra/llmath/llsimdmath.h
new file mode 100644
index 0000000000..c7cdf7b32c
--- /dev/null
+++ b/indra/llmath/llsimdmath.h
@@ -0,0 +1,93 @@
+/**
+ * @file llsimdmath.h
+ * @brief Common header for SIMD-based math library (llvector4a, llmatrix3a, etc.)
+ *
+ * $LicenseInfo:firstyear=2010&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_SIMD_MATH_H
+#define LL_SIMD_MATH_H
+
+#ifndef LLMATH_H
+#error "Please include llmath.h before this file."
+#endif
+
+#if ( ( LL_DARWIN || LL_LINUX ) && !(__SSE2__) ) || ( LL_WINDOWS && ( _M_IX86_FP < 2 ) )
+#error SSE2 not enabled. LLVector4a and related class will not compile.
+#endif
+
+#if !LL_WINDOWS
+#include <stdint.h>
+#endif
+
+template <typename T> T* LL_NEXT_ALIGNED_ADDRESS(T* address)
+{
+ return reinterpret_cast<T*>(
+ (reinterpret_cast<uintptr_t>(address) + 0xF) & ~0xF);
+}
+
+template <typename T> T* LL_NEXT_ALIGNED_ADDRESS_64(T* address)
+{
+ return reinterpret_cast<T*>(
+ (reinterpret_cast<uintptr_t>(address) + 0x3F) & ~0x3F);
+}
+
+#if LL_LINUX || LL_DARWIN
+
+#define LL_ALIGN_PREFIX(x)
+#define LL_ALIGN_POSTFIX(x) __attribute__((aligned(x)))
+
+#elif LL_WINDOWS
+
+#define LL_ALIGN_PREFIX(x) __declspec(align(x))
+#define LL_ALIGN_POSTFIX(x)
+
+#else
+#error "LL_ALIGN_PREFIX and LL_ALIGN_POSTFIX undefined"
+#endif
+
+#define LL_ALIGN_16(var) LL_ALIGN_PREFIX(16) var LL_ALIGN_POSTFIX(16)
+
+
+
+#include <xmmintrin.h>
+#include <emmintrin.h>
+
+#include "llsimdtypes.h"
+#include "llsimdtypes.inl"
+
+class LLMatrix3a;
+class LLRotation;
+class LLMatrix3;
+
+#include "llquaternion.h"
+
+#include "llvector4logical.h"
+#include "llvector4a.h"
+#include "llmatrix3a.h"
+#include "llquaternion2.h"
+#include "llvector4a.inl"
+#include "llmatrix3a.inl"
+#include "llquaternion2.inl"
+
+
+#endif //LL_SIMD_MATH_H
diff --git a/indra/llmath/llsimdtypes.h b/indra/llmath/llsimdtypes.h
new file mode 100644
index 0000000000..bd991d0e71
--- /dev/null
+++ b/indra/llmath/llsimdtypes.h
@@ -0,0 +1,124 @@
+/**
+ * @file llsimdtypes.h
+ * @brief Declaration of basic SIMD math related types
+ *
+ * $LicenseInfo:firstyear=2010&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_SIMD_TYPES_H
+#define LL_SIMD_TYPES_H
+
+#ifndef LL_SIMD_MATH_H
+#error "Please include llmath.h before this file."
+#endif
+
+typedef __m128 LLQuad;
+
+
+#if LL_WINDOWS
+#pragma warning(push)
+#pragma warning( disable : 4800 3 ) // Disable warning about casting int to bool for this class.
+#if defined(_MSC_VER) && (_MSC_VER < 1500)
+// VC++ 2005 is missing these intrinsics
+// __forceinline is MSVC specific and attempts to override compiler inlining judgment. This is so
+// even in debug builds this call is a NOP.
+__forceinline const __m128 _mm_castsi128_ps( const __m128i a ) { return reinterpret_cast<const __m128&>(a); }
+__forceinline const __m128i _mm_castps_si128( const __m128 a ) { return reinterpret_cast<const __m128i&>(a); }
+#endif // _MSC_VER
+
+#endif // LL_WINDOWS
+
+class LLBool32
+{
+public:
+ inline LLBool32() {}
+ inline LLBool32(int rhs) : m_bool(rhs) {}
+ inline LLBool32(unsigned int rhs) : m_bool(rhs) {}
+ inline LLBool32(bool rhs) { m_bool = static_cast<const int>(rhs); }
+ inline LLBool32& operator= (bool rhs) { m_bool = (int)rhs; return *this; }
+ inline bool operator== (bool rhs) const { return static_cast<const bool&>(m_bool) == rhs; }
+ inline bool operator!= (bool rhs) const { return !operator==(rhs); }
+ inline operator bool() const { return static_cast<const bool&>(m_bool); }
+
+private:
+ int m_bool;
+};
+
+#if LL_WINDOWS
+#pragma warning(pop)
+#endif
+
+class LLSimdScalar
+{
+public:
+ inline LLSimdScalar() {}
+ inline LLSimdScalar(LLQuad q)
+ {
+ mQ = q;
+ }
+
+ inline LLSimdScalar(F32 f)
+ {
+ mQ = _mm_set_ss(f);
+ }
+
+ static inline const LLSimdScalar& getZero()
+ {
+ extern const LLQuad F_ZERO_4A;
+ return reinterpret_cast<const LLSimdScalar&>(F_ZERO_4A);
+ }
+
+ inline F32 getF32() const;
+
+ inline LLBool32 isApproximatelyEqual(const LLSimdScalar& rhs, F32 tolerance = F_APPROXIMATELY_ZERO) const;
+
+ inline LLSimdScalar getAbs() const;
+
+ inline void setMax( const LLSimdScalar& a, const LLSimdScalar& b );
+
+ inline void setMin( const LLSimdScalar& a, const LLSimdScalar& b );
+
+ inline LLSimdScalar& operator=(F32 rhs);
+
+ inline LLSimdScalar& operator+=(const LLSimdScalar& rhs);
+
+ inline LLSimdScalar& operator-=(const LLSimdScalar& rhs);
+
+ inline LLSimdScalar& operator*=(const LLSimdScalar& rhs);
+
+ inline LLSimdScalar& operator/=(const LLSimdScalar& rhs);
+
+ inline operator LLQuad() const
+ {
+ return mQ;
+ }
+
+ inline const LLQuad& getQuad() const
+ {
+ return mQ;
+ }
+
+private:
+ LLQuad mQ;
+};
+
+#endif //LL_SIMD_TYPES_H
diff --git a/indra/llmath/llsimdtypes.inl b/indra/llmath/llsimdtypes.inl
new file mode 100644
index 0000000000..712239e425
--- /dev/null
+++ b/indra/llmath/llsimdtypes.inl
@@ -0,0 +1,157 @@
+/**
+ * @file llsimdtypes.inl
+ * @brief Inlined definitions of basic SIMD math related types
+ *
+ * $LicenseInfo:firstyear=2010&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+
+
+
+//////////////////
+// LLSimdScalar
+//////////////////
+
+inline LLSimdScalar operator+(const LLSimdScalar& a, const LLSimdScalar& b)
+{
+ LLSimdScalar t(a);
+ t += b;
+ return t;
+}
+
+inline LLSimdScalar operator-(const LLSimdScalar& a, const LLSimdScalar& b)
+{
+ LLSimdScalar t(a);
+ t -= b;
+ return t;
+}
+
+inline LLSimdScalar operator*(const LLSimdScalar& a, const LLSimdScalar& b)
+{
+ LLSimdScalar t(a);
+ t *= b;
+ return t;
+}
+
+inline LLSimdScalar operator/(const LLSimdScalar& a, const LLSimdScalar& b)
+{
+ LLSimdScalar t(a);
+ t /= b;
+ return t;
+}
+
+inline LLSimdScalar operator-(const LLSimdScalar& a)
+{
+ static LL_ALIGN_16(const U32 signMask[4]) = {0x80000000, 0x80000000, 0x80000000, 0x80000000 };
+ return _mm_xor_ps(*reinterpret_cast<const LLQuad*>(signMask), a);
+}
+
+inline LLBool32 operator==(const LLSimdScalar& a, const LLSimdScalar& b)
+{
+ return _mm_comieq_ss(a, b);
+}
+
+inline LLBool32 operator!=(const LLSimdScalar& a, const LLSimdScalar& b)
+{
+ return _mm_comineq_ss(a, b);
+}
+
+inline LLBool32 operator<(const LLSimdScalar& a, const LLSimdScalar& b)
+{
+ return _mm_comilt_ss(a, b);
+}
+
+inline LLBool32 operator<=(const LLSimdScalar& a, const LLSimdScalar& b)
+{
+ return _mm_comile_ss(a, b);
+}
+
+inline LLBool32 operator>(const LLSimdScalar& a, const LLSimdScalar& b)
+{
+ return _mm_comigt_ss(a, b);
+}
+
+inline LLBool32 operator>=(const LLSimdScalar& a, const LLSimdScalar& b)
+{
+ return _mm_comige_ss(a, b);
+}
+
+inline LLBool32 LLSimdScalar::isApproximatelyEqual(const LLSimdScalar& rhs, F32 tolerance /* = F_APPROXIMATELY_ZERO */) const
+{
+ const LLSimdScalar tol( tolerance );
+ const LLSimdScalar diff = _mm_sub_ss( mQ, rhs.mQ );
+ const LLSimdScalar absDiff = diff.getAbs();
+ return absDiff <= tol;
+}
+
+inline void LLSimdScalar::setMax( const LLSimdScalar& a, const LLSimdScalar& b )
+{
+ mQ = _mm_max_ss( a, b );
+}
+
+inline void LLSimdScalar::setMin( const LLSimdScalar& a, const LLSimdScalar& b )
+{
+ mQ = _mm_min_ss( a, b );
+}
+
+inline LLSimdScalar& LLSimdScalar::operator=(F32 rhs)
+{
+ mQ = _mm_set_ss(rhs);
+ return *this;
+}
+
+inline LLSimdScalar& LLSimdScalar::operator+=(const LLSimdScalar& rhs)
+{
+ mQ = _mm_add_ss( mQ, rhs );
+ return *this;
+}
+
+inline LLSimdScalar& LLSimdScalar::operator-=(const LLSimdScalar& rhs)
+{
+ mQ = _mm_sub_ss( mQ, rhs );
+ return *this;
+}
+
+inline LLSimdScalar& LLSimdScalar::operator*=(const LLSimdScalar& rhs)
+{
+ mQ = _mm_mul_ss( mQ, rhs );
+ return *this;
+}
+
+inline LLSimdScalar& LLSimdScalar::operator/=(const LLSimdScalar& rhs)
+{
+ mQ = _mm_div_ss( mQ, rhs );
+ return *this;
+}
+
+inline LLSimdScalar LLSimdScalar::getAbs() const
+{
+ static const LL_ALIGN_16(U32 F_ABS_MASK_4A[4]) = { 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF };
+ return _mm_and_ps( mQ, *reinterpret_cast<const LLQuad*>(F_ABS_MASK_4A));
+}
+
+inline F32 LLSimdScalar::getF32() const
+{
+ F32 ret;
+ _mm_store_ss(&ret, mQ);
+ return ret;
+}
diff --git a/indra/llmath/lltreenode.h b/indra/llmath/lltreenode.h
index a462d1659e..c66bc26176 100644
--- a/indra/llmath/lltreenode.h
+++ b/indra/llmath/lltreenode.h
@@ -28,6 +28,9 @@
#include "stdtypes.h"
#include "xform.h"
+#include "llpointer.h"
+#include "llrefcount.h"
+
#include <vector>
template <class T> class LLTreeNode;
diff --git a/indra/llmath/llv4math.h b/indra/llmath/llv4math.h
deleted file mode 100644
index 5f403ba526..0000000000
--- a/indra/llmath/llv4math.h
+++ /dev/null
@@ -1,141 +0,0 @@
-/**
- * @file llv4math.h
- * @brief LLV4* class header file - vector processor enabled math
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLV4MATH_H
-#define LL_LLV4MATH_H
-
-// *NOTE: We do not support SSE acceleration on Windows builds.
-// Our minimum specification for the viewer includes 1 GHz Athlon processors,
-// which covers the Athlon Thunderbird series that does not support SSE.
-//
-// Our header files include statements like this
-// const F32 HAVOK_TIMESTEP = 1.f / 45.f;
-// This creates "globals" that are included in each .obj file. If a single
-// .cpp file has SSE code generation turned on (eg, llviewerjointmesh_sse.cpp)
-// these globals will be initialized using SSE instructions. This causes SL
-// to crash before main() on processors without SSE. Untangling all these
-// headers/variables is too much work for the small performance gains of
-// vectorization.
-//
-// Therefore we only support vectorization on builds where the everything is
-// built with SSE or Altivec. See https://jira.secondlife.com/browse/VWR-1610
-// and https://jira.lindenlab.com/browse/SL-47720 for details.
-//
-// Sorry the code is such a mess. JC
-
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-// LLV4MATH - GNUC
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-
-#if LL_GNUC && __GNUC__ >= 4 && __SSE__
-
-#define LL_VECTORIZE 1
-
-#if LL_DARWIN
-
-#include <Accelerate/Accelerate.h>
-#include <xmmintrin.h>
-typedef vFloat V4F32;
-
-#else
-
-#include <xmmintrin.h>
-typedef float V4F32 __attribute__((vector_size(16)));
-
-#endif
-
-#endif
-#if LL_GNUC
-
-#define LL_LLV4MATH_ALIGN_PREFIX
-#define LL_LLV4MATH_ALIGN_POSTFIX __attribute__((aligned(16)))
-
-#endif
-
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-// LLV4MATH - MSVC
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-
-// Only vectorize if the entire Windows build uses SSE.
-// _M_IX86_FP is set when SSE code generation is turned on, and I have
-// confirmed this in VS2003, VS2003 SP1, and VS2005. JC
-#if LL_MSVC && _M_IX86_FP
-
-#define LL_VECTORIZE 1
-
-#include <xmmintrin.h>
-
-typedef __m128 V4F32;
-
-#endif
-#if LL_MSVC
-
-#define LL_LLV4MATH_ALIGN_PREFIX __declspec(align(16))
-#define LL_LLV4MATH_ALIGN_POSTFIX
-
-#endif
-
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-// LLV4MATH - default - no vectorization
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-
-#if !LL_VECTORIZE
-
-#define LL_VECTORIZE 0
-
-struct V4F32 { F32 __pad__[4]; };
-
-inline F32 llv4lerp(F32 a, F32 b, F32 w) { return ( b - a ) * w + a; }
-
-#endif
-
-#ifndef LL_LLV4MATH_ALIGN_PREFIX
-# define LL_LLV4MATH_ALIGN_PREFIX
-#endif
-#ifndef LL_LLV4MATH_ALIGN_POSTFIX
-# define LL_LLV4MATH_ALIGN_POSTFIX
-#endif
-
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-// LLV4MATH
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-
-
-#define LLV4_NUM_AXIS 4
-
-class LLV4Vector3;
-class LLV4Matrix3;
-class LLV4Matrix4;
-
-#endif
diff --git a/indra/llmath/llv4matrix3.h b/indra/llmath/llv4matrix3.h
deleted file mode 100644
index 270f5d7dae..0000000000
--- a/indra/llmath/llv4matrix3.h
+++ /dev/null
@@ -1,220 +0,0 @@
-/**
- * @file llviewerjointmesh.cpp
- * @brief LLV4* class header file - vector processor enabled math
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLV4MATRIX3_H
-#define LL_LLV4MATRIX3_H
-
-#include "llv4math.h"
-#include "llv4vector3.h"
-#include "m3math.h" // for operator LLMatrix3()
-
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-// LLV4Matrix3
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-
-LL_LLV4MATH_ALIGN_PREFIX
-
-class LLV4Matrix3
-{
-public:
- union {
- F32 mMatrix[LLV4_NUM_AXIS][LLV4_NUM_AXIS];
- V4F32 mV[LLV4_NUM_AXIS];
- };
-
- void lerp(const LLV4Matrix3 &a, const LLV4Matrix3 &b, const F32 &w);
- void multiply(const LLVector3 &a, LLVector3& out) const;
- void multiply(const LLVector4 &a, LLV4Vector3& out) const;
- void multiply(const LLVector3 &a, LLV4Vector3& out) const;
-
- const LLV4Matrix3& transpose();
- const LLV4Matrix3& operator=(const LLMatrix3& a);
-
- operator LLMatrix3() const { return (reinterpret_cast<const LLMatrix4*>(const_cast<const F32*>(&mMatrix[0][0])))->getMat3(); }
-
- friend LLVector3 operator*(const LLVector3& a, const LLV4Matrix3& b);
-}
-
-LL_LLV4MATH_ALIGN_POSTFIX;
-
-
-
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-// LLV4Matrix3 - SSE
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-
-#if LL_VECTORIZE
-
-inline void LLV4Matrix3::lerp(const LLV4Matrix3 &a, const LLV4Matrix3 &b, const F32 &w)
-{
- __m128 vw = _mm_set1_ps(w);
- mV[VX] = _mm_add_ps(_mm_mul_ps(_mm_sub_ps(b.mV[VX], a.mV[VX]), vw), a.mV[VX]); // ( b - a ) * w + a
- mV[VY] = _mm_add_ps(_mm_mul_ps(_mm_sub_ps(b.mV[VY], a.mV[VY]), vw), a.mV[VY]);
- mV[VZ] = _mm_add_ps(_mm_mul_ps(_mm_sub_ps(b.mV[VZ], a.mV[VZ]), vw), a.mV[VZ]);
-}
-
-inline void LLV4Matrix3::multiply(const LLVector3 &a, LLVector3& o) const
-{
- LLV4Vector3 j;
- j.v = _mm_mul_ps(_mm_set1_ps(a.mV[VX]), mV[VX]); // ( ax * vx ) + ...
- j.v = _mm_add_ps(j.v , _mm_mul_ps(_mm_set1_ps(a.mV[VY]), mV[VY]));
- j.v = _mm_add_ps(j.v , _mm_mul_ps(_mm_set1_ps(a.mV[VZ]), mV[VZ]));
- o.setVec(j.mV);
-}
-
-inline void LLV4Matrix3::multiply(const LLVector4 &a, LLV4Vector3& o) const
-{
- o.v = _mm_mul_ps(_mm_set1_ps(a.mV[VX]), mV[VX]); // ( ax * vx ) + ...
- o.v = _mm_add_ps(o.v , _mm_mul_ps(_mm_set1_ps(a.mV[VY]), mV[VY]));
- o.v = _mm_add_ps(o.v , _mm_mul_ps(_mm_set1_ps(a.mV[VZ]), mV[VZ]));
-}
-
-inline void LLV4Matrix3::multiply(const LLVector3 &a, LLV4Vector3& o) const
-{
- o.v = _mm_mul_ps(_mm_set1_ps(a.mV[VX]), mV[VX]); // ( ax * vx ) + ...
- o.v = _mm_add_ps(o.v , _mm_mul_ps(_mm_set1_ps(a.mV[VY]), mV[VY]));
- o.v = _mm_add_ps(o.v , _mm_mul_ps(_mm_set1_ps(a.mV[VZ]), mV[VZ]));
-}
-
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-// LLV4Matrix3
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-
-#else
-
-inline void LLV4Matrix3::lerp(const LLV4Matrix3 &a, const LLV4Matrix3 &b, const F32 &w)
-{
- mMatrix[VX][VX] = llv4lerp(a.mMatrix[VX][VX], b.mMatrix[VX][VX], w);
- mMatrix[VX][VY] = llv4lerp(a.mMatrix[VX][VY], b.mMatrix[VX][VY], w);
- mMatrix[VX][VZ] = llv4lerp(a.mMatrix[VX][VZ], b.mMatrix[VX][VZ], w);
-
- mMatrix[VY][VX] = llv4lerp(a.mMatrix[VY][VX], b.mMatrix[VY][VX], w);
- mMatrix[VY][VY] = llv4lerp(a.mMatrix[VY][VY], b.mMatrix[VY][VY], w);
- mMatrix[VY][VZ] = llv4lerp(a.mMatrix[VY][VZ], b.mMatrix[VY][VZ], w);
-
- mMatrix[VZ][VX] = llv4lerp(a.mMatrix[VZ][VX], b.mMatrix[VZ][VX], w);
- mMatrix[VZ][VY] = llv4lerp(a.mMatrix[VZ][VY], b.mMatrix[VZ][VY], w);
- mMatrix[VZ][VZ] = llv4lerp(a.mMatrix[VZ][VZ], b.mMatrix[VZ][VZ], w);
-}
-
-inline void LLV4Matrix3::multiply(const LLVector3 &a, LLVector3& o) const
-{
- o.setVec( a.mV[VX] * mMatrix[VX][VX] +
- a.mV[VY] * mMatrix[VY][VX] +
- a.mV[VZ] * mMatrix[VZ][VX],
-
- a.mV[VX] * mMatrix[VX][VY] +
- a.mV[VY] * mMatrix[VY][VY] +
- a.mV[VZ] * mMatrix[VZ][VY],
-
- a.mV[VX] * mMatrix[VX][VZ] +
- a.mV[VY] * mMatrix[VY][VZ] +
- a.mV[VZ] * mMatrix[VZ][VZ]);
-}
-
-inline void LLV4Matrix3::multiply(const LLVector4 &a, LLV4Vector3& o) const
-{
- o.setVec( a.mV[VX] * mMatrix[VX][VX] +
- a.mV[VY] * mMatrix[VY][VX] +
- a.mV[VZ] * mMatrix[VZ][VX],
-
- a.mV[VX] * mMatrix[VX][VY] +
- a.mV[VY] * mMatrix[VY][VY] +
- a.mV[VZ] * mMatrix[VZ][VY],
-
- a.mV[VX] * mMatrix[VX][VZ] +
- a.mV[VY] * mMatrix[VY][VZ] +
- a.mV[VZ] * mMatrix[VZ][VZ]);
-}
-
-inline void LLV4Matrix3::multiply(const LLVector3 &a, LLV4Vector3& o) const
-{
- o.setVec( a.mV[VX] * mMatrix[VX][VX] +
- a.mV[VY] * mMatrix[VY][VX] +
- a.mV[VZ] * mMatrix[VZ][VX],
-
- a.mV[VX] * mMatrix[VX][VY] +
- a.mV[VY] * mMatrix[VY][VY] +
- a.mV[VZ] * mMatrix[VZ][VY],
-
- a.mV[VX] * mMatrix[VX][VZ] +
- a.mV[VY] * mMatrix[VY][VZ] +
- a.mV[VZ] * mMatrix[VZ][VZ]);
-}
-
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-// LLV4Matrix3
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-
-#endif
-
-inline const LLV4Matrix3& LLV4Matrix3::transpose()
-{
-#if LL_VECTORIZE && defined(_MM_TRANSPOSE4_PS)
- _MM_TRANSPOSE4_PS(mV[VX], mV[VY], mV[VZ], mV[VW]);
- return *this;
-#else
- F32 temp;
- temp = mMatrix[VX][VY]; mMatrix[VX][VY] = mMatrix[VY][VX]; mMatrix[VY][VX] = temp;
- temp = mMatrix[VX][VZ]; mMatrix[VX][VZ] = mMatrix[VZ][VX]; mMatrix[VZ][VX] = temp;
- temp = mMatrix[VY][VZ]; mMatrix[VY][VZ] = mMatrix[VZ][VY]; mMatrix[VZ][VY] = temp;
-#endif
- return *this;
-}
-
-inline const LLV4Matrix3& LLV4Matrix3::operator=(const LLMatrix3& a)
-{
- memcpy(mMatrix[VX], a.mMatrix[VX], sizeof(F32) * 3 );
- memcpy(mMatrix[VY], a.mMatrix[VY], sizeof(F32) * 3 );
- memcpy(mMatrix[VZ], a.mMatrix[VZ], sizeof(F32) * 3 );
- return *this;
-}
-
-inline LLVector3 operator*(const LLVector3& a, const LLV4Matrix3& b)
-{
- return LLVector3(
- a.mV[VX] * b.mMatrix[VX][VX] +
- a.mV[VY] * b.mMatrix[VY][VX] +
- a.mV[VZ] * b.mMatrix[VZ][VX],
-
- a.mV[VX] * b.mMatrix[VX][VY] +
- a.mV[VY] * b.mMatrix[VY][VY] +
- a.mV[VZ] * b.mMatrix[VZ][VY],
-
- a.mV[VX] * b.mMatrix[VX][VZ] +
- a.mV[VY] * b.mMatrix[VY][VZ] +
- a.mV[VZ] * b.mMatrix[VZ][VZ] );
-}
-
-#endif
diff --git a/indra/llmath/llv4matrix4.h b/indra/llmath/llv4matrix4.h
deleted file mode 100644
index 2eb49d9294..0000000000
--- a/indra/llmath/llv4matrix4.h
+++ /dev/null
@@ -1,249 +0,0 @@
-/**
- * @file llviewerjointmesh.cpp
- * @brief LLV4* class header file - vector processor enabled math
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLV4MATRIX4_H
-#define LL_LLV4MATRIX4_H
-
-#include "llv4math.h"
-#include "llv4matrix3.h" // just for operator LLV4Matrix3()
-#include "llv4vector3.h"
-
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-// LLV4Matrix4
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-
-LL_LLV4MATH_ALIGN_PREFIX
-
-class LLV4Matrix4
-{
-public:
- union {
- F32 mMatrix[LLV4_NUM_AXIS][LLV4_NUM_AXIS];
- V4F32 mV[LLV4_NUM_AXIS];
- };
-
- void lerp(const LLV4Matrix4 &a, const LLV4Matrix4 &b, const F32 &w);
- void multiply(const LLVector3 &a, LLVector3& o) const;
- void multiply(const LLVector3 &a, LLV4Vector3& o) const;
-
- const LLV4Matrix4& transpose();
- const LLV4Matrix4& translate(const LLVector3 &vec);
- const LLV4Matrix4& translate(const LLV4Vector3 &vec);
- const LLV4Matrix4& operator=(const LLMatrix4& a);
-
- operator LLMatrix4() const { return *(reinterpret_cast<const LLMatrix4*>(const_cast<const F32*>(&mMatrix[0][0]))); }
- operator LLV4Matrix3() const { return *(reinterpret_cast<const LLV4Matrix3*>(const_cast<const F32*>(&mMatrix[0][0]))); }
-
- friend LLVector3 operator*(const LLVector3 &a, const LLV4Matrix4 &b);
-}
-
-LL_LLV4MATH_ALIGN_POSTFIX;
-
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-// LLV4Matrix4 - SSE
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-
-#if LL_VECTORIZE
-
-inline void LLV4Matrix4::lerp(const LLV4Matrix4 &a, const LLV4Matrix4 &b, const F32 &w)
-{
- __m128 vw = _mm_set1_ps(w);
- mV[VX] = _mm_add_ps(_mm_mul_ps(_mm_sub_ps(b.mV[VX], a.mV[VX]), vw), a.mV[VX]); // ( b - a ) * w + a
- mV[VY] = _mm_add_ps(_mm_mul_ps(_mm_sub_ps(b.mV[VY], a.mV[VY]), vw), a.mV[VY]);
- mV[VZ] = _mm_add_ps(_mm_mul_ps(_mm_sub_ps(b.mV[VZ], a.mV[VZ]), vw), a.mV[VZ]);
- mV[VW] = _mm_add_ps(_mm_mul_ps(_mm_sub_ps(b.mV[VW], a.mV[VW]), vw), a.mV[VW]);
-}
-
-inline void LLV4Matrix4::multiply(const LLVector3 &a, LLVector3& o) const
-{
- LLV4Vector3 j;
- j.v = _mm_add_ps(mV[VW], _mm_mul_ps(_mm_set1_ps(a.mV[VX]), mV[VX])); // ( ax * vx ) + vw
- j.v = _mm_add_ps(j.v , _mm_mul_ps(_mm_set1_ps(a.mV[VY]), mV[VY]));
- j.v = _mm_add_ps(j.v , _mm_mul_ps(_mm_set1_ps(a.mV[VZ]), mV[VZ]));
- o.setVec(j.mV);
-}
-
-inline void LLV4Matrix4::multiply(const LLVector3 &a, LLV4Vector3& o) const
-{
- o.v = _mm_add_ps(mV[VW], _mm_mul_ps(_mm_set1_ps(a.mV[VX]), mV[VX])); // ( ax * vx ) + vw
- o.v = _mm_add_ps(o.v , _mm_mul_ps(_mm_set1_ps(a.mV[VY]), mV[VY]));
- o.v = _mm_add_ps(o.v , _mm_mul_ps(_mm_set1_ps(a.mV[VZ]), mV[VZ]));
-}
-
-inline const LLV4Matrix4& LLV4Matrix4::translate(const LLV4Vector3 &vec)
-{
- mV[VW] = _mm_add_ps(mV[VW], vec.v);
- return (*this);
-}
-
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-// LLV4Matrix4
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-
-#else
-
-inline void LLV4Matrix4::lerp(const LLV4Matrix4 &a, const LLV4Matrix4 &b, const F32 &w)
-{
- mMatrix[VX][VX] = llv4lerp(a.mMatrix[VX][VX], b.mMatrix[VX][VX], w);
- mMatrix[VX][VY] = llv4lerp(a.mMatrix[VX][VY], b.mMatrix[VX][VY], w);
- mMatrix[VX][VZ] = llv4lerp(a.mMatrix[VX][VZ], b.mMatrix[VX][VZ], w);
-
- mMatrix[VY][VX] = llv4lerp(a.mMatrix[VY][VX], b.mMatrix[VY][VX], w);
- mMatrix[VY][VY] = llv4lerp(a.mMatrix[VY][VY], b.mMatrix[VY][VY], w);
- mMatrix[VY][VZ] = llv4lerp(a.mMatrix[VY][VZ], b.mMatrix[VY][VZ], w);
-
- mMatrix[VZ][VX] = llv4lerp(a.mMatrix[VZ][VX], b.mMatrix[VZ][VX], w);
- mMatrix[VZ][VY] = llv4lerp(a.mMatrix[VZ][VY], b.mMatrix[VZ][VY], w);
- mMatrix[VZ][VZ] = llv4lerp(a.mMatrix[VZ][VZ], b.mMatrix[VZ][VZ], w);
-
- mMatrix[VW][VX] = llv4lerp(a.mMatrix[VW][VX], b.mMatrix[VW][VX], w);
- mMatrix[VW][VY] = llv4lerp(a.mMatrix[VW][VY], b.mMatrix[VW][VY], w);
- mMatrix[VW][VZ] = llv4lerp(a.mMatrix[VW][VZ], b.mMatrix[VW][VZ], w);
-}
-
-inline void LLV4Matrix4::multiply(const LLVector3 &a, LLVector3& o) const
-{
- o.setVec( a.mV[VX] * mMatrix[VX][VX] +
- a.mV[VY] * mMatrix[VY][VX] +
- a.mV[VZ] * mMatrix[VZ][VX] +
- mMatrix[VW][VX],
-
- a.mV[VX] * mMatrix[VX][VY] +
- a.mV[VY] * mMatrix[VY][VY] +
- a.mV[VZ] * mMatrix[VZ][VY] +
- mMatrix[VW][VY],
-
- a.mV[VX] * mMatrix[VX][VZ] +
- a.mV[VY] * mMatrix[VY][VZ] +
- a.mV[VZ] * mMatrix[VZ][VZ] +
- mMatrix[VW][VZ]);
-}
-
-inline void LLV4Matrix4::multiply(const LLVector3 &a, LLV4Vector3& o) const
-{
- o.setVec( a.mV[VX] * mMatrix[VX][VX] +
- a.mV[VY] * mMatrix[VY][VX] +
- a.mV[VZ] * mMatrix[VZ][VX] +
- mMatrix[VW][VX],
-
- a.mV[VX] * mMatrix[VX][VY] +
- a.mV[VY] * mMatrix[VY][VY] +
- a.mV[VZ] * mMatrix[VZ][VY] +
- mMatrix[VW][VY],
-
- a.mV[VX] * mMatrix[VX][VZ] +
- a.mV[VY] * mMatrix[VY][VZ] +
- a.mV[VZ] * mMatrix[VZ][VZ] +
- mMatrix[VW][VZ]);
-}
-
-inline const LLV4Matrix4& LLV4Matrix4::translate(const LLV4Vector3 &vec)
-{
- mMatrix[3][0] += vec.mV[0];
- mMatrix[3][1] += vec.mV[1];
- mMatrix[3][2] += vec.mV[2];
- return (*this);
-}
-
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-// LLV4Matrix4
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-
-#endif
-
-inline const LLV4Matrix4& LLV4Matrix4::operator=(const LLMatrix4& a)
-{
- memcpy(mMatrix, a.mMatrix, sizeof(F32) * 16 );
- return *this;
-}
-
-inline const LLV4Matrix4& LLV4Matrix4::transpose()
-{
-#if LL_VECTORIZE && defined(_MM_TRANSPOSE4_PS)
- _MM_TRANSPOSE4_PS(mV[VX], mV[VY], mV[VZ], mV[VW]);
-#else
- LLV4Matrix4 mat;
- mat.mMatrix[0][0] = mMatrix[0][0];
- mat.mMatrix[1][0] = mMatrix[0][1];
- mat.mMatrix[2][0] = mMatrix[0][2];
- mat.mMatrix[3][0] = mMatrix[0][3];
-
- mat.mMatrix[0][1] = mMatrix[1][0];
- mat.mMatrix[1][1] = mMatrix[1][1];
- mat.mMatrix[2][1] = mMatrix[1][2];
- mat.mMatrix[3][1] = mMatrix[1][3];
-
- mat.mMatrix[0][2] = mMatrix[2][0];
- mat.mMatrix[1][2] = mMatrix[2][1];
- mat.mMatrix[2][2] = mMatrix[2][2];
- mat.mMatrix[3][2] = mMatrix[2][3];
-
- mat.mMatrix[0][3] = mMatrix[3][0];
- mat.mMatrix[1][3] = mMatrix[3][1];
- mat.mMatrix[2][3] = mMatrix[3][2];
- mat.mMatrix[3][3] = mMatrix[3][3];
-
- *this = mat;
-#endif
- return *this;
-}
-
-inline const LLV4Matrix4& LLV4Matrix4::translate(const LLVector3 &vec)
-{
- mMatrix[3][0] += vec.mV[0];
- mMatrix[3][1] += vec.mV[1];
- mMatrix[3][2] += vec.mV[2];
- return (*this);
-}
-
-inline LLVector3 operator*(const LLVector3 &a, const LLV4Matrix4 &b)
-{
- return LLVector3(a.mV[VX] * b.mMatrix[VX][VX] +
- a.mV[VY] * b.mMatrix[VY][VX] +
- a.mV[VZ] * b.mMatrix[VZ][VX] +
- b.mMatrix[VW][VX],
-
- a.mV[VX] * b.mMatrix[VX][VY] +
- a.mV[VY] * b.mMatrix[VY][VY] +
- a.mV[VZ] * b.mMatrix[VZ][VY] +
- b.mMatrix[VW][VY],
-
- a.mV[VX] * b.mMatrix[VX][VZ] +
- a.mV[VY] * b.mMatrix[VY][VZ] +
- a.mV[VZ] * b.mMatrix[VZ][VZ] +
- b.mMatrix[VW][VZ]);
-}
-
-
-#endif
diff --git a/indra/llmath/llv4vector3.h b/indra/llmath/llv4vector3.h
deleted file mode 100644
index a340d53f5a..0000000000
--- a/indra/llmath/llv4vector3.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/**
- * @file llviewerjointmesh.cpp
- * @brief LLV4* class header file - vector processor enabled math
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLV4VECTOR3_H
-#define LL_LLV4VECTOR3_H
-
-#include "llv4math.h"
-
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-// LLV4Vector3
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-
-LL_LLV4MATH_ALIGN_PREFIX
-
-class LLV4Vector3
-{
-public:
- union {
- F32 mV[LLV4_NUM_AXIS];
- V4F32 v;
- };
-
- enum {
- ALIGNMENT = 16
- };
-
- void setVec(F32 x, F32 y, F32 z);
- void setVec(F32 a);
-}
-
-LL_LLV4MATH_ALIGN_POSTFIX;
-
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-// LLV4Vector3
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-
-inline void LLV4Vector3::setVec(F32 x, F32 y, F32 z)
-{
- mV[VX] = x;
- mV[VY] = y;
- mV[VZ] = z;
-}
-
-inline void LLV4Vector3::setVec(F32 a)
-{
-#if LL_VECTORIZE
- v = _mm_set1_ps(a);
-#else
- setVec(a, a, a);
-#endif
-}
-
-#endif
diff --git a/indra/llmath/llvector4a.cpp b/indra/llmath/llvector4a.cpp
new file mode 100644
index 0000000000..b66b7a7076
--- /dev/null
+++ b/indra/llmath/llvector4a.cpp
@@ -0,0 +1,222 @@
+/**
+ * @file llvector4a.cpp
+ * @brief SIMD vector implementation
+ *
+ * $LicenseInfo:firstyear=2010&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llmath.h"
+#include "llquantize.h"
+
+extern const LLQuad F_ZERO_4A = { 0, 0, 0, 0 };
+extern const LLQuad F_APPROXIMATELY_ZERO_4A = {
+ F_APPROXIMATELY_ZERO,
+ F_APPROXIMATELY_ZERO,
+ F_APPROXIMATELY_ZERO,
+ F_APPROXIMATELY_ZERO
+};
+
+extern const LLVector4a LL_V4A_ZERO = reinterpret_cast<const LLVector4a&> ( F_ZERO_4A );
+extern const LLVector4a LL_V4A_EPSILON = reinterpret_cast<const LLVector4a&> ( F_APPROXIMATELY_ZERO_4A );
+
+/*static */void LLVector4a::memcpyNonAliased16(F32* __restrict dst, const F32* __restrict src, size_t bytes)
+{
+ assert(src != NULL);
+ assert(dst != NULL);
+ assert(bytes > 0);
+ assert((bytes % sizeof(F32))== 0);
+
+ F32* end = dst + (bytes / sizeof(F32) );
+
+ if (bytes > 64)
+ {
+ F32* begin_64 = LL_NEXT_ALIGNED_ADDRESS_64(dst);
+
+ //at least 64 (16*4) bytes before the end of the destination, switch to 16 byte copies
+ F32* end_64 = end-16;
+
+ _mm_prefetch((char*)begin_64, _MM_HINT_NTA);
+ _mm_prefetch((char*)begin_64 + 64, _MM_HINT_NTA);
+ _mm_prefetch((char*)begin_64 + 128, _MM_HINT_NTA);
+ _mm_prefetch((char*)begin_64 + 192, _MM_HINT_NTA);
+
+ while (dst < begin_64)
+ {
+ copy4a(dst, src);
+ dst += 4;
+ src += 4;
+ }
+
+ while (dst < end_64)
+ {
+ _mm_prefetch((char*)src + 512, _MM_HINT_NTA);
+ _mm_prefetch((char*)dst + 512, _MM_HINT_NTA);
+ copy4a(dst, src);
+ copy4a(dst+4, src+4);
+ copy4a(dst+8, src+8);
+ copy4a(dst+12, src+12);
+
+ dst += 16;
+ src += 16;
+ }
+ }
+
+ while (dst < end)
+ {
+ copy4a(dst, src);
+ dst += 4;
+ src += 4;
+ }
+}
+
+void LLVector4a::setRotated( const LLRotation& rot, const LLVector4a& vec )
+{
+ const LLVector4a col0 = rot.getColumn(0);
+ const LLVector4a col1 = rot.getColumn(1);
+ const LLVector4a col2 = rot.getColumn(2);
+
+ LLVector4a result = _mm_load_ss( vec.getF32ptr() );
+ result.splat<0>( result );
+ result.mul( col0 );
+
+ {
+ LLVector4a yyyy = _mm_load_ss( vec.getF32ptr() + 1 );
+ yyyy.splat<0>( yyyy );
+ yyyy.mul( col1 );
+ result.add( yyyy );
+ }
+
+ {
+ LLVector4a zzzz = _mm_load_ss( vec.getF32ptr() + 2 );
+ zzzz.splat<0>( zzzz );
+ zzzz.mul( col2 );
+ result.add( zzzz );
+ }
+
+ *this = result;
+}
+
+void LLVector4a::setRotated( const LLQuaternion2& quat, const LLVector4a& vec )
+{
+ const LLVector4a& quatVec = quat.getVector4a();
+ LLVector4a temp; temp.setCross3(quatVec, vec);
+ temp.add( temp );
+
+ const LLVector4a realPart( quatVec.getScalarAt<3>() );
+ LLVector4a tempTimesReal; tempTimesReal.setMul( temp, realPart );
+
+ mQ = vec;
+ add( tempTimesReal );
+
+ LLVector4a imagCrossTemp; imagCrossTemp.setCross3( quatVec, temp );
+ add(imagCrossTemp);
+}
+
+void LLVector4a::quantize8( const LLVector4a& low, const LLVector4a& high )
+{
+ LLVector4a val(mQ);
+ LLVector4a delta; delta.setSub( high, low );
+
+ {
+ val.clamp(low, high);
+ val.sub(low);
+
+ // 8-bit quantization means we can do with just 12 bits of reciprocal accuracy
+ const LLVector4a oneOverDelta = _mm_rcp_ps(delta.mQ);
+// {
+// static LL_ALIGN_16( const F32 F_TWO_4A[4] ) = { 2.f, 2.f, 2.f, 2.f };
+// LLVector4a two; two.load4a( F_TWO_4A );
+//
+// // Here we use _mm_rcp_ps plus one round of newton-raphson
+// // We wish to find 'x' such that x = 1/delta
+// // As a first approximation, we take x0 = _mm_rcp_ps(delta)
+// // Then x1 = 2 * x0 - a * x0^2 or x1 = x0 * ( 2 - a * x0 )
+// // See Intel AP-803 http://ompf.org/!/Intel_application_note_AP-803.pdf
+// const LLVector4a recipApprox = _mm_rcp_ps(delta.mQ);
+// oneOverDelta.setMul( delta, recipApprox );
+// oneOverDelta.setSub( two, oneOverDelta );
+// oneOverDelta.mul( recipApprox );
+// }
+
+ val.mul(oneOverDelta);
+ val.mul(*reinterpret_cast<const LLVector4a*>(F_U8MAX_4A));
+ }
+
+ val = _mm_cvtepi32_ps(_mm_cvtps_epi32( val.mQ ));
+
+ {
+ val.mul(*reinterpret_cast<const LLVector4a*>(F_OOU8MAX_4A));
+ val.mul(delta);
+ val.add(low);
+ }
+
+ {
+ LLVector4a maxError; maxError.setMul(delta, *reinterpret_cast<const LLVector4a*>(F_OOU8MAX_4A));
+ LLVector4a absVal; absVal.setAbs( val );
+ setSelectWithMask( absVal.lessThan( maxError ), F_ZERO_4A, val );
+ }
+}
+
+void LLVector4a::quantize16( const LLVector4a& low, const LLVector4a& high )
+{
+ LLVector4a val(mQ);
+ LLVector4a delta; delta.setSub( high, low );
+
+ {
+ val.clamp(low, high);
+ val.sub(low);
+
+ // 16-bit quantization means we need a round of Newton-Raphson
+ LLVector4a oneOverDelta;
+ {
+ static LL_ALIGN_16( const F32 F_TWO_4A[4] ) = { 2.f, 2.f, 2.f, 2.f };
+ LLVector4a two; two.load4a( F_TWO_4A );
+
+ // Here we use _mm_rcp_ps plus one round of newton-raphson
+ // We wish to find 'x' such that x = 1/delta
+ // As a first approximation, we take x0 = _mm_rcp_ps(delta)
+ // Then x1 = 2 * x0 - a * x0^2 or x1 = x0 * ( 2 - a * x0 )
+ // See Intel AP-803 http://ompf.org/!/Intel_application_note_AP-803.pdf
+ const LLVector4a recipApprox = _mm_rcp_ps(delta.mQ);
+ oneOverDelta.setMul( delta, recipApprox );
+ oneOverDelta.setSub( two, oneOverDelta );
+ oneOverDelta.mul( recipApprox );
+ }
+
+ val.mul(oneOverDelta);
+ val.mul(*reinterpret_cast<const LLVector4a*>(F_U16MAX_4A));
+ }
+
+ val = _mm_cvtepi32_ps(_mm_cvtps_epi32( val.mQ ));
+
+ {
+ val.mul(*reinterpret_cast<const LLVector4a*>(F_OOU16MAX_4A));
+ val.mul(delta);
+ val.add(low);
+ }
+
+ {
+ LLVector4a maxError; maxError.setMul(delta, *reinterpret_cast<const LLVector4a*>(F_OOU16MAX_4A));
+ LLVector4a absVal; absVal.setAbs( val );
+ setSelectWithMask( absVal.lessThan( maxError ), F_ZERO_4A, val );
+ }
+}
diff --git a/indra/llmath/llvector4a.h b/indra/llmath/llvector4a.h
new file mode 100644
index 0000000000..596082509d
--- /dev/null
+++ b/indra/llmath/llvector4a.h
@@ -0,0 +1,324 @@
+/**
+ * @file llvector4a.h
+ * @brief LLVector4a class header file - memory aligned and vectorized 4 component vector
+ *
+ * $LicenseInfo:firstyear=2010&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLVECTOR4A_H
+#define LL_LLVECTOR4A_H
+
+
+class LLRotation;
+
+#include <assert.h>
+#include "llpreprocessor.h"
+
+///////////////////////////////////
+// FIRST TIME USERS PLEASE READ
+//////////////////////////////////
+// This is just the beginning of LLVector4a. There are many more useful functions
+// yet to be implemented. For example, setNeg to negate a vector, rotate() to apply
+// a matrix rotation, various functions to manipulate only the X, Y, and Z elements
+// and many others (including a whole variety of accessors). So if you don't see a
+// function here that you need, please contact Falcon or someone else with SSE
+// experience (Richard, I think, has some and davep has a little as of the time
+// of this writing, July 08, 2010) about getting it implemented before you resort to
+// LLVector3/LLVector4.
+/////////////////////////////////
+
+class LLVector4a
+{
+public:
+
+ ///////////////////////////////////
+ // STATIC METHODS
+ ///////////////////////////////////
+
+ // Call initClass() at startup to avoid 15,000+ cycle penalties from denormalized numbers
+ static void initClass()
+ {
+ _MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON);
+ _MM_SET_ROUNDING_MODE(_MM_ROUND_NEAREST);
+ }
+
+ // Return a vector of all zeros
+ static inline const LLVector4a& getZero()
+ {
+ extern const LLVector4a LL_V4A_ZERO;
+ return LL_V4A_ZERO;
+ }
+
+ // Return a vector of all epsilon, where epsilon is a small float suitable for approximate equality checks
+ static inline const LLVector4a& getEpsilon()
+ {
+ extern const LLVector4a LL_V4A_EPSILON;
+ return LL_V4A_EPSILON;
+ }
+
+ // Copy 16 bytes from src to dst. Source and destination must be 16-byte aligned
+ static inline void copy4a(F32* dst, const F32* src)
+ {
+ _mm_store_ps(dst, _mm_load_ps(src));
+ }
+
+ // Copy words 16-byte blocks from src to dst. Source and destination must not overlap.
+ static void memcpyNonAliased16(F32* __restrict dst, const F32* __restrict src, size_t bytes);
+
+ ////////////////////////////////////
+ // CONSTRUCTORS
+ ////////////////////////////////////
+
+ LLVector4a()
+ { //DO NOT INITIALIZE -- The overhead is completely unnecessary
+ }
+
+ LLVector4a(F32 x, F32 y, F32 z, F32 w = 0.f)
+ {
+ set(x,y,z,w);
+ }
+
+ LLVector4a(F32 x)
+ {
+ splat(x);
+ }
+
+ LLVector4a(const LLSimdScalar& x)
+ {
+ splat(x);
+ }
+
+ LLVector4a(LLQuad q)
+ {
+ mQ = q;
+ }
+
+ ////////////////////////////////////
+ // LOAD/STORE
+ ////////////////////////////////////
+
+ // Load from 16-byte aligned src array (preferred method of loading)
+ inline void load4a(const F32* src);
+
+ // Load from unaligned src array (NB: Significantly slower than load4a)
+ inline void loadua(const F32* src);
+
+ // Load only three floats beginning at address 'src'. Slowest method.
+ inline void load3(const F32* src);
+
+ // Store to a 16-byte aligned memory address
+ inline void store4a(F32* dst) const;
+
+ ////////////////////////////////////
+ // BASIC GET/SET
+ ////////////////////////////////////
+
+ // Return a "this" as an F32 pointer. Do not use unless you have a very good reason. (Not sure? Ask Falcon)
+ inline F32* getF32ptr();
+
+ // Return a "this" as a const F32 pointer. Do not use unless you have a very good reason. (Not sure? Ask Falcon)
+ inline const F32* const getF32ptr() const;
+
+ // Read-only access a single float in this vector. Do not use in proximity to any function call that manipulates
+ // the data at the whole vector level or you will incur a substantial penalty. Consider using the splat functions instead
+ inline F32 operator[](const S32 idx) const;
+
+ // Prefer this method for read-only access to a single element. Prefer the templated version if the elem is known at compile time.
+ inline LLSimdScalar getScalarAt(const S32 idx) const;
+
+ // Prefer this method for read-only access to a single element. Prefer the templated version if the elem is known at compile time.
+ template <int N> LL_FORCE_INLINE LLSimdScalar getScalarAt() const;
+
+ // Set to an x, y, z and optional w provided
+ inline void set(F32 x, F32 y, F32 z, F32 w = 0.f);
+
+ // Set to all zeros. This is preferred to using ::getZero()
+ inline void clear();
+
+ // Set all elements to 'x'
+ inline void splat(const F32 x);
+
+ // Set all elements to 'x'
+ inline void splat(const LLSimdScalar& x);
+
+ // Set all 4 elements to element N of src, with N known at compile time
+ template <int N> void splat(const LLVector4a& src);
+
+ // Set all 4 elements to element i of v, with i NOT known at compile time
+ inline void splat(const LLVector4a& v, U32 i);
+
+ // Select bits from sourceIfTrue and sourceIfFalse according to bits in mask
+ inline void setSelectWithMask( const LLVector4Logical& mask, const LLVector4a& sourceIfTrue, const LLVector4a& sourceIfFalse );
+
+ ////////////////////////////////////
+ // ALGEBRAIC
+ ////////////////////////////////////
+
+ // Set this to the element-wise (a + b)
+ inline void setAdd(const LLVector4a& a, const LLVector4a& b);
+
+ // Set this to element-wise (a - b)
+ inline void setSub(const LLVector4a& a, const LLVector4a& b);
+
+ // Set this to element-wise multiply (a * b)
+ inline void setMul(const LLVector4a& a, const LLVector4a& b);
+
+ // Set this to element-wise quotient (a / b)
+ inline void setDiv(const LLVector4a& a, const LLVector4a& b);
+
+ // Set this to the element-wise absolute value of src
+ inline void setAbs(const LLVector4a& src);
+
+ // Add to each component in this vector the corresponding component in rhs
+ inline void add(const LLVector4a& rhs);
+
+ // Subtract from each component in this vector the corresponding component in rhs
+ inline void sub(const LLVector4a& rhs);
+
+ // Multiply each component in this vector by the corresponding component in rhs
+ inline void mul(const LLVector4a& rhs);
+
+ // Divide each component in this vector by the corresponding component in rhs
+ inline void div(const LLVector4a& rhs);
+
+ // Multiply this vector by x in a scalar fashion
+ inline void mul(const F32 x);
+
+ // Set this to (a x b) (geometric cross-product)
+ inline void setCross3(const LLVector4a& a, const LLVector4a& b);
+
+ // Set all elements to the dot product of the x, y, and z elements in a and b
+ inline void setAllDot3(const LLVector4a& a, const LLVector4a& b);
+
+ // Set all elements to the dot product of the x, y, z, and w elements in a and b
+ inline void setAllDot4(const LLVector4a& a, const LLVector4a& b);
+
+ // Return the 3D dot product of this vector and b
+ inline LLSimdScalar dot3(const LLVector4a& b) const;
+
+ // Return the 4D dot product of this vector and b
+ inline LLSimdScalar dot4(const LLVector4a& b) const;
+
+ // Normalize this vector with respect to the x, y, and z components only. Accurate to 22 bites of precision. W component is destroyed
+ // Note that this does not consider zero length vectors!
+ inline void normalize3();
+
+ // Same as normalize3() but with respect to all 4 components
+ inline void normalize4();
+
+ // Same as normalize3(), but returns length as a SIMD scalar
+ inline LLSimdScalar normalize3withLength();
+
+ // Normalize this vector with respect to the x, y, and z components only. Accurate only to 10-12 bits of precision. W component is destroyed
+ // Note that this does not consider zero length vectors!
+ inline void normalize3fast();
+
+ // Return true if this vector is normalized with respect to x,y,z up to tolerance
+ inline LLBool32 isNormalized3( F32 tolerance = 1e-3 ) const;
+
+ // Return true if this vector is normalized with respect to all components up to tolerance
+ inline LLBool32 isNormalized4( F32 tolerance = 1e-3 ) const;
+
+ // Set all elements to the length of vector 'v'
+ inline void setAllLength3( const LLVector4a& v );
+
+ // Get this vector's length
+ inline LLSimdScalar getLength3() const;
+
+ // Set the components of this vector to the minimum of the corresponding components of lhs and rhs
+ inline void setMin(const LLVector4a& lhs, const LLVector4a& rhs);
+
+ // Set the components of this vector to the maximum of the corresponding components of lhs and rhs
+ inline void setMax(const LLVector4a& lhs, const LLVector4a& rhs);
+
+ // Clamps this vector to be within the component-wise range low to high (inclusive)
+ inline void clamp( const LLVector4a& low, const LLVector4a& high );
+
+ // Set this to (c * lhs) + rhs * ( 1 - c)
+ inline void setLerp(const LLVector4a& lhs, const LLVector4a& rhs, F32 c);
+
+ // Return true (nonzero) if x, y, z (and w for Finite4) are all finite floats
+ inline LLBool32 isFinite3() const;
+ inline LLBool32 isFinite4() const;
+
+ // Set this vector to 'vec' rotated by the LLRotation or LLQuaternion2 provided
+ void setRotated( const LLRotation& rot, const LLVector4a& vec );
+ void setRotated( const class LLQuaternion2& quat, const LLVector4a& vec );
+
+ // Set this vector to 'vec' rotated by the INVERSE of the LLRotation or LLQuaternion2 provided
+ inline void setRotatedInv( const LLRotation& rot, const LLVector4a& vec );
+ inline void setRotatedInv( const class LLQuaternion2& quat, const LLVector4a& vec );
+
+ // Quantize this vector to 8 or 16 bit precision
+ void quantize8( const LLVector4a& low, const LLVector4a& high );
+ void quantize16( const LLVector4a& low, const LLVector4a& high );
+
+ ////////////////////////////////////
+ // LOGICAL
+ ////////////////////////////////////
+ // The functions in this section will compare the elements in this vector
+ // to those in rhs and return an LLVector4Logical with all bits set in elements
+ // where the comparison was true and all bits unset in elements where the comparison
+ // was false. See llvector4logica.h
+ ////////////////////////////////////
+ // WARNING: Other than equals3 and equals4, these functions do NOT account
+ // for floating point tolerance. You should include the appropriate tolerance
+ // in the inputs.
+ ////////////////////////////////////
+
+ inline LLVector4Logical greaterThan(const LLVector4a& rhs) const;
+
+ inline LLVector4Logical lessThan(const LLVector4a& rhs) const;
+
+ inline LLVector4Logical greaterEqual(const LLVector4a& rhs) const;
+
+ inline LLVector4Logical lessEqual(const LLVector4a& rhs) const;
+
+ inline LLVector4Logical equal(const LLVector4a& rhs) const;
+
+ // Returns true if this and rhs are componentwise equal up to the specified absolute tolerance
+ inline bool equals4(const LLVector4a& rhs, F32 tolerance = F_APPROXIMATELY_ZERO ) const;
+
+ inline bool equals3(const LLVector4a& rhs, F32 tolerance = F_APPROXIMATELY_ZERO ) const;
+
+ ////////////////////////////////////
+ // OPERATORS
+ ////////////////////////////////////
+
+ // Do NOT add aditional operators without consulting someone with SSE experience
+ inline const LLVector4a& operator= ( const LLVector4a& rhs );
+
+ inline const LLVector4a& operator= ( const LLQuad& rhs );
+
+ inline operator LLQuad() const;
+
+private:
+ LLQuad mQ;
+};
+
+inline void update_min_max(LLVector4a& min, LLVector4a& max, const LLVector4a& p)
+{
+ min.setMin(min, p);
+ max.setMax(max, p);
+}
+
+#endif
diff --git a/indra/llmath/llvector4a.inl b/indra/llmath/llvector4a.inl
new file mode 100644
index 0000000000..7ad22a5631
--- /dev/null
+++ b/indra/llmath/llvector4a.inl
@@ -0,0 +1,593 @@
+/**
+ * @file llvector4a.inl
+ * @brief LLVector4a inline function implementations
+ *
+ * $LicenseInfo:firstyear=2010&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+////////////////////////////////////
+// LOAD/STORE
+////////////////////////////////////
+
+// Load from 16-byte aligned src array (preferred method of loading)
+inline void LLVector4a::load4a(const F32* src)
+{
+ mQ = _mm_load_ps(src);
+}
+
+// Load from unaligned src array (NB: Significantly slower than load4a)
+inline void LLVector4a::loadua(const F32* src)
+{
+ mQ = _mm_loadu_ps(src);
+}
+
+// Load only three floats beginning at address 'src'. Slowest method.
+inline void LLVector4a::load3(const F32* src)
+{
+ // mQ = { 0.f, src[2], src[1], src[0] } = { W, Z, Y, X }
+ // NB: This differs from the convention of { Z, Y, X, W }
+ mQ = _mm_set_ps(0.f, src[2], src[1], src[0]);
+}
+
+// Store to a 16-byte aligned memory address
+inline void LLVector4a::store4a(F32* dst) const
+{
+ _mm_store_ps(dst, mQ);
+}
+
+////////////////////////////////////
+// BASIC GET/SET
+////////////////////////////////////
+
+// Return a "this" as an F32 pointer. Do not use unless you have a very good reason. (Not sure? Ask Falcon)
+F32* LLVector4a::getF32ptr()
+{
+ return (F32*) &mQ;
+}
+
+// Return a "this" as a const F32 pointer. Do not use unless you have a very good reason. (Not sure? Ask Falcon)
+const F32* const LLVector4a::getF32ptr() const
+{
+ return (const F32* const) &mQ;
+}
+
+// Read-only access a single float in this vector. Do not use in proximity to any function call that manipulates
+// the data at the whole vector level or you will incur a substantial penalty. Consider using the splat functions instead
+inline F32 LLVector4a::operator[](const S32 idx) const
+{
+ return ((F32*)&mQ)[idx];
+}
+
+// Prefer this method for read-only access to a single element. Prefer the templated version if the elem is known at compile time.
+inline LLSimdScalar LLVector4a::getScalarAt(const S32 idx) const
+{
+ // Return appropriate LLQuad. It will be cast to LLSimdScalar automatically (should be effectively a nop)
+ switch (idx)
+ {
+ case 0:
+ return mQ;
+ case 1:
+ return _mm_shuffle_ps(mQ, mQ, _MM_SHUFFLE(1, 1, 1, 1));
+ case 2:
+ return _mm_shuffle_ps(mQ, mQ, _MM_SHUFFLE(2, 2, 2, 2));
+ case 3:
+ default:
+ return _mm_shuffle_ps(mQ, mQ, _MM_SHUFFLE(3, 3, 3, 3));
+ }
+}
+
+// Prefer this method for read-only access to a single element. Prefer the templated version if the elem is known at compile time.
+template <int N> LL_FORCE_INLINE LLSimdScalar LLVector4a::getScalarAt() const
+{
+ return _mm_shuffle_ps(mQ, mQ, _MM_SHUFFLE(N, N, N, N));
+}
+
+template<> LL_FORCE_INLINE LLSimdScalar LLVector4a::getScalarAt<0>() const
+{
+ return mQ;
+}
+
+// Set to an x, y, z and optional w provided
+inline void LLVector4a::set(F32 x, F32 y, F32 z, F32 w)
+{
+ mQ = _mm_set_ps(w, z, y, x);
+}
+
+// Set to all zeros
+inline void LLVector4a::clear()
+{
+ mQ = LLVector4a::getZero().mQ;
+}
+
+inline void LLVector4a::splat(const F32 x)
+{
+ mQ = _mm_set1_ps(x);
+}
+
+inline void LLVector4a::splat(const LLSimdScalar& x)
+{
+ mQ = _mm_shuffle_ps( x.getQuad(), x.getQuad(), _MM_SHUFFLE(0,0,0,0) );
+}
+
+// Set all 4 elements to element N of src, with N known at compile time
+template <int N> void LLVector4a::splat(const LLVector4a& src)
+{
+ mQ = _mm_shuffle_ps(src.mQ, src.mQ, _MM_SHUFFLE(N, N, N, N) );
+}
+
+// Set all 4 elements to element i of v, with i NOT known at compile time
+inline void LLVector4a::splat(const LLVector4a& v, U32 i)
+{
+ switch (i)
+ {
+ case 0:
+ mQ = _mm_shuffle_ps(v.mQ, v.mQ, _MM_SHUFFLE(0, 0, 0, 0));
+ break;
+ case 1:
+ mQ = _mm_shuffle_ps(v.mQ, v.mQ, _MM_SHUFFLE(1, 1, 1, 1));
+ break;
+ case 2:
+ mQ = _mm_shuffle_ps(v.mQ, v.mQ, _MM_SHUFFLE(2, 2, 2, 2));
+ break;
+ case 3:
+ mQ = _mm_shuffle_ps(v.mQ, v.mQ, _MM_SHUFFLE(3, 3, 3, 3));
+ break;
+ }
+}
+
+// Select bits from sourceIfTrue and sourceIfFalse according to bits in mask
+inline void LLVector4a::setSelectWithMask( const LLVector4Logical& mask, const LLVector4a& sourceIfTrue, const LLVector4a& sourceIfFalse )
+{
+ // ((( sourceIfTrue ^ sourceIfFalse ) & mask) ^ sourceIfFalse )
+ // E.g., sourceIfFalse = 1010b, sourceIfTrue = 0101b, mask = 1100b
+ // (sourceIfTrue ^ sourceIfFalse) = 1111b --> & mask = 1100b --> ^ sourceIfFalse = 0110b,
+ // as expected (01 from sourceIfTrue, 10 from sourceIfFalse)
+ // Courtesy of Mark++, http://markplusplus.wordpress.com/2007/03/14/fast-sse-select-operation/
+ mQ = _mm_xor_ps( sourceIfFalse, _mm_and_ps( mask, _mm_xor_ps( sourceIfTrue, sourceIfFalse ) ) );
+}
+
+////////////////////////////////////
+// ALGEBRAIC
+////////////////////////////////////
+
+// Set this to the element-wise (a + b)
+inline void LLVector4a::setAdd(const LLVector4a& a, const LLVector4a& b)
+{
+ mQ = _mm_add_ps(a.mQ, b.mQ);
+}
+
+// Set this to element-wise (a - b)
+inline void LLVector4a::setSub(const LLVector4a& a, const LLVector4a& b)
+{
+ mQ = _mm_sub_ps(a.mQ, b.mQ);
+}
+
+// Set this to element-wise multiply (a * b)
+inline void LLVector4a::setMul(const LLVector4a& a, const LLVector4a& b)
+{
+ mQ = _mm_mul_ps(a.mQ, b.mQ);
+}
+
+// Set this to element-wise quotient (a / b)
+inline void LLVector4a::setDiv(const LLVector4a& a, const LLVector4a& b)
+{
+ mQ = _mm_div_ps( a.mQ, b.mQ );
+}
+
+// Set this to the element-wise absolute value of src
+inline void LLVector4a::setAbs(const LLVector4a& src)
+{
+ static const LL_ALIGN_16(U32 F_ABS_MASK_4A[4]) = { 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF };
+ mQ = _mm_and_ps(src.mQ, *reinterpret_cast<const LLQuad*>(F_ABS_MASK_4A));
+}
+
+// Add to each component in this vector the corresponding component in rhs
+inline void LLVector4a::add(const LLVector4a& rhs)
+{
+ mQ = _mm_add_ps(mQ, rhs.mQ);
+}
+
+// Subtract from each component in this vector the corresponding component in rhs
+inline void LLVector4a::sub(const LLVector4a& rhs)
+{
+ mQ = _mm_sub_ps(mQ, rhs.mQ);
+}
+
+// Multiply each component in this vector by the corresponding component in rhs
+inline void LLVector4a::mul(const LLVector4a& rhs)
+{
+ mQ = _mm_mul_ps(mQ, rhs.mQ);
+}
+
+// Divide each component in this vector by the corresponding component in rhs
+inline void LLVector4a::div(const LLVector4a& rhs)
+{
+ // TODO: Check accuracy, maybe add divFast
+ mQ = _mm_div_ps(mQ, rhs.mQ);
+}
+
+// Multiply this vector by x in a scalar fashion
+inline void LLVector4a::mul(const F32 x)
+{
+ LLVector4a t;
+ t.splat(x);
+
+ mQ = _mm_mul_ps(mQ, t.mQ);
+}
+
+// Set this to (a x b) (geometric cross-product)
+inline void LLVector4a::setCross3(const LLVector4a& a, const LLVector4a& b)
+{
+ // Vectors are stored in memory in w, z, y, x order from high to low
+ // Set vector1 = { a[W], a[X], a[Z], a[Y] }
+ const LLQuad vector1 = _mm_shuffle_ps( a.mQ, a.mQ, _MM_SHUFFLE( 3, 0, 2, 1 ));
+ // Set vector2 = { b[W], b[Y], b[X], b[Z] }
+ const LLQuad vector2 = _mm_shuffle_ps( b.mQ, b.mQ, _MM_SHUFFLE( 3, 1, 0, 2 ));
+ // mQ = { a[W]*b[W], a[X]*b[Y], a[Z]*b[X], a[Y]*b[Z] }
+ mQ = _mm_mul_ps( vector1, vector2 );
+ // vector3 = { a[W], a[Y], a[X], a[Z] }
+ const LLQuad vector3 = _mm_shuffle_ps( a.mQ, a.mQ, _MM_SHUFFLE( 3, 1, 0, 2 ));
+ // vector4 = { b[W], b[X], b[Z], b[Y] }
+ const LLQuad vector4 = _mm_shuffle_ps( b.mQ, b.mQ, _MM_SHUFFLE( 3, 0, 2, 1 ));
+ // mQ = { 0, a[X]*b[Y] - a[Y]*b[X], a[Z]*b[X] - a[X]*b[Z], a[Y]*b[Z] - a[Z]*b[Y] }
+ mQ = _mm_sub_ps( mQ, _mm_mul_ps( vector3, vector4 ));
+}
+
+/* This function works, but may be slightly slower than the one below on older machines
+ inline void LLVector4a::setAllDot3(const LLVector4a& a, const LLVector4a& b)
+ {
+ // ab = { a[W]*b[W], a[Z]*b[Z], a[Y]*b[Y], a[X]*b[X] }
+ const LLQuad ab = _mm_mul_ps( a.mQ, b.mQ );
+ // yzxw = { a[W]*b[W], a[Z]*b[Z], a[X]*b[X], a[Y]*b[Y] }
+ const LLQuad wzxy = _mm_shuffle_ps( ab, ab, _MM_SHUFFLE(3, 2, 0, 1 ));
+ // xPlusY = { 2*a[W]*b[W], 2 * a[Z] * b[Z], a[Y]*b[Y] + a[X] * b[X], a[X] * b[X] + a[Y] * b[Y] }
+ const LLQuad xPlusY = _mm_add_ps(ab, wzxy);
+ // xPlusYSplat = { a[Y]*b[Y] + a[X] * b[X], a[X] * b[X] + a[Y] * b[Y], a[Y]*b[Y] + a[X] * b[X], a[X] * b[X] + a[Y] * b[Y] }
+ const LLQuad xPlusYSplat = _mm_movelh_ps(xPlusY, xPlusY);
+ // zSplat = { a[Z]*b[Z], a[Z]*b[Z], a[Z]*b[Z], a[Z]*b[Z] }
+ const LLQuad zSplat = _mm_shuffle_ps( ab, ab, _MM_SHUFFLE( 2, 2, 2, 2 ));
+ // mQ = { a[Z] * b[Z] + a[Y] * b[Y] + a[X] * b[X], same, same, same }
+ mQ = _mm_add_ps(zSplat, xPlusYSplat);
+ }*/
+
+// Set all elements to the dot product of the x, y, and z elements in a and b
+inline void LLVector4a::setAllDot3(const LLVector4a& a, const LLVector4a& b)
+{
+ // ab = { a[W]*b[W], a[Z]*b[Z], a[Y]*b[Y], a[X]*b[X] }
+ const LLQuad ab = _mm_mul_ps( a.mQ, b.mQ );
+ // yzxw = { a[W]*b[W], a[Z]*b[Z], a[X]*b[X], a[Y]*b[Y] }
+ const __m128i wzxy = _mm_shuffle_epi32(_mm_castps_si128(ab), _MM_SHUFFLE(3, 2, 0, 1 ));
+ // xPlusY = { 2*a[W]*b[W], 2 * a[Z] * b[Z], a[Y]*b[Y] + a[X] * b[X], a[X] * b[X] + a[Y] * b[Y] }
+ const LLQuad xPlusY = _mm_add_ps(ab, _mm_castsi128_ps(wzxy));
+ // xPlusYSplat = { a[Y]*b[Y] + a[X] * b[X], a[X] * b[X] + a[Y] * b[Y], a[Y]*b[Y] + a[X] * b[X], a[X] * b[X] + a[Y] * b[Y] }
+ const LLQuad xPlusYSplat = _mm_movelh_ps(xPlusY, xPlusY);
+ // zSplat = { a[Z]*b[Z], a[Z]*b[Z], a[Z]*b[Z], a[Z]*b[Z] }
+ const __m128i zSplat = _mm_shuffle_epi32(_mm_castps_si128(ab), _MM_SHUFFLE( 2, 2, 2, 2 ));
+ // mQ = { a[Z] * b[Z] + a[Y] * b[Y] + a[X] * b[X], same, same, same }
+ mQ = _mm_add_ps(_mm_castsi128_ps(zSplat), xPlusYSplat);
+}
+
+// Set all elements to the dot product of the x, y, z, and w elements in a and b
+inline void LLVector4a::setAllDot4(const LLVector4a& a, const LLVector4a& b)
+{
+ // ab = { a[W]*b[W], a[Z]*b[Z], a[Y]*b[Y], a[X]*b[X] }
+ const LLQuad ab = _mm_mul_ps( a.mQ, b.mQ );
+ // yzxw = { a[W]*b[W], a[Z]*b[Z], a[X]*b[X], a[Y]*b[Y] }
+ const __m128i zwxy = _mm_shuffle_epi32(_mm_castps_si128(ab), _MM_SHUFFLE(2, 3, 0, 1 ));
+ // zPlusWandXplusY = { a[W]*b[W] + a[Z]*b[Z], a[Z] * b[Z] + a[W]*b[W], a[Y]*b[Y] + a[X] * b[X], a[X] * b[X] + a[Y] * b[Y] }
+ const LLQuad zPlusWandXplusY = _mm_add_ps(ab, _mm_castsi128_ps(zwxy));
+ // xPlusYSplat = { a[Y]*b[Y] + a[X] * b[X], a[X] * b[X] + a[Y] * b[Y], a[Y]*b[Y] + a[X] * b[X], a[X] * b[X] + a[Y] * b[Y] }
+ const LLQuad xPlusYSplat = _mm_movelh_ps(zPlusWandXplusY, zPlusWandXplusY);
+ const LLQuad zPlusWSplat = _mm_movehl_ps(zPlusWandXplusY, zPlusWandXplusY);
+
+ // mQ = { a[W]*b[W] + a[Z] * b[Z] + a[Y] * b[Y] + a[X] * b[X], same, same, same }
+ mQ = _mm_add_ps(xPlusYSplat, zPlusWSplat);
+}
+
+// Return the 3D dot product of this vector and b
+inline LLSimdScalar LLVector4a::dot3(const LLVector4a& b) const
+{
+ const LLQuad ab = _mm_mul_ps( mQ, b.mQ );
+ const LLQuad splatY = _mm_castsi128_ps( _mm_shuffle_epi32( _mm_castps_si128(ab), _MM_SHUFFLE(1, 1, 1, 1) ) );
+ const LLQuad splatZ = _mm_castsi128_ps( _mm_shuffle_epi32( _mm_castps_si128(ab), _MM_SHUFFLE(2, 2, 2, 2) ) );
+ const LLQuad xPlusY = _mm_add_ps( ab, splatY );
+ return _mm_add_ps( xPlusY, splatZ );
+}
+
+// Return the 4D dot product of this vector and b
+inline LLSimdScalar LLVector4a::dot4(const LLVector4a& b) const
+{
+ // ab = { w, z, y, x }
+ const LLQuad ab = _mm_mul_ps( mQ, b.mQ );
+ // upperProdsInLowerElems = { y, x, y, x }
+ const LLQuad upperProdsInLowerElems = _mm_movehl_ps( ab, ab );
+ // sumOfPairs = { w+y, z+x, 2y, 2x }
+ const LLQuad sumOfPairs = _mm_add_ps( upperProdsInLowerElems, ab );
+ // shuffled = { z+x, z+x, z+x, z+x }
+ const LLQuad shuffled = _mm_castsi128_ps( _mm_shuffle_epi32( _mm_castps_si128( sumOfPairs ), _MM_SHUFFLE(1, 1, 1, 1) ) );
+ return _mm_add_ss( sumOfPairs, shuffled );
+}
+
+// Normalize this vector with respect to the x, y, and z components only. Accurate to 22 bites of precision. W component is destroyed
+// Note that this does not consider zero length vectors!
+inline void LLVector4a::normalize3()
+{
+ // lenSqrd = a dot a
+ LLVector4a lenSqrd; lenSqrd.setAllDot3( *this, *this );
+ // rsqrt = approximate reciprocal square (i.e., { ~1/len(a)^2, ~1/len(a)^2, ~1/len(a)^2, ~1/len(a)^2 }
+ const LLQuad rsqrt = _mm_rsqrt_ps(lenSqrd.mQ);
+ static const LLQuad half = { 0.5f, 0.5f, 0.5f, 0.5f };
+ static const LLQuad three = {3.f, 3.f, 3.f, 3.f };
+ // Now we do one round of Newton-Raphson approximation to get full accuracy
+ // According to the Newton-Raphson method, given a first 'w' for the root of f(x) = 1/x^2 - a (i.e., x = 1/sqrt(a))
+ // the next better approximation w[i+1] = w - f(w)/f'(w) = w - (1/w^2 - a)/(-2*w^(-3))
+ // w[i+1] = w + 0.5 * (1/w^2 - a) * w^3 = w + 0.5 * (w - a*w^3) = 1.5 * w - 0.5 * a * w^3
+ // = 0.5 * w * (3 - a*w^2)
+ // Our first approx is w = rsqrt. We need out = a * w[i+1] (this is the input vector 'a', not the 'a' from the above formula
+ // which is actually lenSqrd). So out = a * [0.5*rsqrt * (3 - lenSqrd*rsqrt*rsqrt)]
+ const LLQuad AtimesRsqrt = _mm_mul_ps( lenSqrd.mQ, rsqrt );
+ const LLQuad AtimesRsqrtTimesRsqrt = _mm_mul_ps( AtimesRsqrt, rsqrt );
+ const LLQuad threeMinusAtimesRsqrtTimesRsqrt = _mm_sub_ps(three, AtimesRsqrtTimesRsqrt );
+ const LLQuad nrApprox = _mm_mul_ps(half, _mm_mul_ps(rsqrt, threeMinusAtimesRsqrtTimesRsqrt));
+ mQ = _mm_mul_ps( mQ, nrApprox );
+}
+
+// Normalize this vector with respect to all components. Accurate to 22 bites of precision.
+// Note that this does not consider zero length vectors!
+inline void LLVector4a::normalize4()
+{
+ // lenSqrd = a dot a
+ LLVector4a lenSqrd; lenSqrd.setAllDot4( *this, *this );
+ // rsqrt = approximate reciprocal square (i.e., { ~1/len(a)^2, ~1/len(a)^2, ~1/len(a)^2, ~1/len(a)^2 }
+ const LLQuad rsqrt = _mm_rsqrt_ps(lenSqrd.mQ);
+ static const LLQuad half = { 0.5f, 0.5f, 0.5f, 0.5f };
+ static const LLQuad three = {3.f, 3.f, 3.f, 3.f };
+ // Now we do one round of Newton-Raphson approximation to get full accuracy
+ // According to the Newton-Raphson method, given a first 'w' for the root of f(x) = 1/x^2 - a (i.e., x = 1/sqrt(a))
+ // the next better approximation w[i+1] = w - f(w)/f'(w) = w - (1/w^2 - a)/(-2*w^(-3))
+ // w[i+1] = w + 0.5 * (1/w^2 - a) * w^3 = w + 0.5 * (w - a*w^3) = 1.5 * w - 0.5 * a * w^3
+ // = 0.5 * w * (3 - a*w^2)
+ // Our first approx is w = rsqrt. We need out = a * w[i+1] (this is the input vector 'a', not the 'a' from the above formula
+ // which is actually lenSqrd). So out = a * [0.5*rsqrt * (3 - lenSqrd*rsqrt*rsqrt)]
+ const LLQuad AtimesRsqrt = _mm_mul_ps( lenSqrd.mQ, rsqrt );
+ const LLQuad AtimesRsqrtTimesRsqrt = _mm_mul_ps( AtimesRsqrt, rsqrt );
+ const LLQuad threeMinusAtimesRsqrtTimesRsqrt = _mm_sub_ps(three, AtimesRsqrtTimesRsqrt );
+ const LLQuad nrApprox = _mm_mul_ps(half, _mm_mul_ps(rsqrt, threeMinusAtimesRsqrtTimesRsqrt));
+ mQ = _mm_mul_ps( mQ, nrApprox );
+}
+
+// Normalize this vector with respect to the x, y, and z components only. Accurate to 22 bites of precision. W component is destroyed
+// Note that this does not consider zero length vectors!
+inline LLSimdScalar LLVector4a::normalize3withLength()
+{
+ // lenSqrd = a dot a
+ LLVector4a lenSqrd; lenSqrd.setAllDot3( *this, *this );
+ // rsqrt = approximate reciprocal square (i.e., { ~1/len(a)^2, ~1/len(a)^2, ~1/len(a)^2, ~1/len(a)^2 }
+ const LLQuad rsqrt = _mm_rsqrt_ps(lenSqrd.mQ);
+ static const LLQuad half = { 0.5f, 0.5f, 0.5f, 0.5f };
+ static const LLQuad three = {3.f, 3.f, 3.f, 3.f };
+ // Now we do one round of Newton-Raphson approximation to get full accuracy
+ // According to the Newton-Raphson method, given a first 'w' for the root of f(x) = 1/x^2 - a (i.e., x = 1/sqrt(a))
+ // the next better approximation w[i+1] = w - f(w)/f'(w) = w - (1/w^2 - a)/(-2*w^(-3))
+ // w[i+1] = w + 0.5 * (1/w^2 - a) * w^3 = w + 0.5 * (w - a*w^3) = 1.5 * w - 0.5 * a * w^3
+ // = 0.5 * w * (3 - a*w^2)
+ // Our first approx is w = rsqrt. We need out = a * w[i+1] (this is the input vector 'a', not the 'a' from the above formula
+ // which is actually lenSqrd). So out = a * [0.5*rsqrt * (3 - lenSqrd*rsqrt*rsqrt)]
+ const LLQuad AtimesRsqrt = _mm_mul_ps( lenSqrd.mQ, rsqrt );
+ const LLQuad AtimesRsqrtTimesRsqrt = _mm_mul_ps( AtimesRsqrt, rsqrt );
+ const LLQuad threeMinusAtimesRsqrtTimesRsqrt = _mm_sub_ps(three, AtimesRsqrtTimesRsqrt );
+ const LLQuad nrApprox = _mm_mul_ps(half, _mm_mul_ps(rsqrt, threeMinusAtimesRsqrtTimesRsqrt));
+ mQ = _mm_mul_ps( mQ, nrApprox );
+ return _mm_sqrt_ss(lenSqrd);
+}
+
+// Normalize this vector with respect to the x, y, and z components only. Accurate only to 10-12 bits of precision. W component is destroyed
+// Note that this does not consider zero length vectors!
+inline void LLVector4a::normalize3fast()
+{
+ LLVector4a lenSqrd; lenSqrd.setAllDot3( *this, *this );
+ const LLQuad approxRsqrt = _mm_rsqrt_ps(lenSqrd.mQ);
+ mQ = _mm_mul_ps( mQ, approxRsqrt );
+}
+
+// Return true if this vector is normalized with respect to x,y,z up to tolerance
+inline LLBool32 LLVector4a::isNormalized3( F32 tolerance ) const
+{
+ static LL_ALIGN_16(const U32 ones[4]) = { 0x3f800000, 0x3f800000, 0x3f800000, 0x3f800000 };
+ LLSimdScalar tol = _mm_load_ss( &tolerance );
+ tol = _mm_mul_ss( tol, tol );
+ LLVector4a lenSquared; lenSquared.setAllDot3( *this, *this );
+ lenSquared.sub( *reinterpret_cast<const LLVector4a*>(ones) );
+ lenSquared.setAbs(lenSquared);
+ return _mm_comile_ss( lenSquared, tol );
+}
+
+// Return true if this vector is normalized with respect to all components up to tolerance
+inline LLBool32 LLVector4a::isNormalized4( F32 tolerance ) const
+{
+ static LL_ALIGN_16(const U32 ones[4]) = { 0x3f800000, 0x3f800000, 0x3f800000, 0x3f800000 };
+ LLSimdScalar tol = _mm_load_ss( &tolerance );
+ tol = _mm_mul_ss( tol, tol );
+ LLVector4a lenSquared; lenSquared.setAllDot4( *this, *this );
+ lenSquared.sub( *reinterpret_cast<const LLVector4a*>(ones) );
+ lenSquared.setAbs(lenSquared);
+ return _mm_comile_ss( lenSquared, tol );
+}
+
+// Set all elements to the length of vector 'v'
+inline void LLVector4a::setAllLength3( const LLVector4a& v )
+{
+ LLVector4a lenSqrd;
+ lenSqrd.setAllDot3(v, v);
+
+ mQ = _mm_sqrt_ps(lenSqrd.mQ);
+}
+
+// Get this vector's length
+inline LLSimdScalar LLVector4a::getLength3() const
+{
+ return _mm_sqrt_ss( dot3( (const LLVector4a)mQ ) );
+}
+
+// Set the components of this vector to the minimum of the corresponding components of lhs and rhs
+inline void LLVector4a::setMin(const LLVector4a& lhs, const LLVector4a& rhs)
+{
+ mQ = _mm_min_ps(lhs.mQ, rhs.mQ);
+}
+
+// Set the components of this vector to the maximum of the corresponding components of lhs and rhs
+inline void LLVector4a::setMax(const LLVector4a& lhs, const LLVector4a& rhs)
+{
+ mQ = _mm_max_ps(lhs.mQ, rhs.mQ);
+}
+
+// Set this to (c * lhs) + rhs * ( 1 - c)
+inline void LLVector4a::setLerp(const LLVector4a& lhs, const LLVector4a& rhs, F32 c)
+{
+ LLVector4a a = lhs;
+ a.mul(c);
+
+ LLVector4a b = rhs;
+ b.mul(1.f-c);
+
+ setAdd(a, b);
+}
+
+inline LLBool32 LLVector4a::isFinite3() const
+{
+ static LL_ALIGN_16(const U32 nanOrInfMask[4]) = { 0x7f800000, 0x7f800000, 0x7f800000, 0x7f800000 };
+ const __m128i nanOrInfMaskV = *reinterpret_cast<const __m128i*> (nanOrInfMask);
+ const __m128i maskResult = _mm_and_si128( _mm_castps_si128(mQ), nanOrInfMaskV );
+ const LLVector4Logical equalityCheck = _mm_castsi128_ps(_mm_cmpeq_epi32( maskResult, nanOrInfMaskV ));
+ return !equalityCheck.areAnySet( LLVector4Logical::MASK_XYZ );
+}
+
+inline LLBool32 LLVector4a::isFinite4() const
+{
+ static LL_ALIGN_16(const U32 nanOrInfMask[4]) = { 0x7f800000, 0x7f800000, 0x7f800000, 0x7f800000 };
+ const __m128i nanOrInfMaskV = *reinterpret_cast<const __m128i*> (nanOrInfMask);
+ const __m128i maskResult = _mm_and_si128( _mm_castps_si128(mQ), nanOrInfMaskV );
+ const LLVector4Logical equalityCheck = _mm_castsi128_ps(_mm_cmpeq_epi32( maskResult, nanOrInfMaskV ));
+ return !equalityCheck.areAnySet( LLVector4Logical::MASK_XYZW );
+}
+
+inline void LLVector4a::setRotatedInv( const LLRotation& rot, const LLVector4a& vec )
+{
+ LLRotation inv; inv.setTranspose( rot );
+ setRotated( inv, vec );
+}
+
+inline void LLVector4a::setRotatedInv( const LLQuaternion2& quat, const LLVector4a& vec )
+{
+ LLQuaternion2 invRot; invRot.setConjugate( quat );
+ setRotated(invRot, vec);
+}
+
+inline void LLVector4a::clamp( const LLVector4a& low, const LLVector4a& high )
+{
+ const LLVector4Logical highMask = greaterThan( high );
+ const LLVector4Logical lowMask = lessThan( low );
+
+ setSelectWithMask( highMask, high, *this );
+ setSelectWithMask( lowMask, low, *this );
+}
+
+
+////////////////////////////////////
+// LOGICAL
+////////////////////////////////////
+// The functions in this section will compare the elements in this vector
+// to those in rhs and return an LLVector4Logical with all bits set in elements
+// where the comparison was true and all bits unset in elements where the comparison
+// was false. See llvector4logica.h
+////////////////////////////////////
+// WARNING: Other than equals3 and equals4, these functions do NOT account
+// for floating point tolerance. You should include the appropriate tolerance
+// in the inputs.
+////////////////////////////////////
+
+inline LLVector4Logical LLVector4a::greaterThan(const LLVector4a& rhs) const
+{
+ return _mm_cmpgt_ps(mQ, rhs.mQ);
+}
+
+inline LLVector4Logical LLVector4a::lessThan(const LLVector4a& rhs) const
+{
+ return _mm_cmplt_ps(mQ, rhs.mQ);
+}
+
+inline LLVector4Logical LLVector4a::greaterEqual(const LLVector4a& rhs) const
+{
+ return _mm_cmpge_ps(mQ, rhs.mQ);
+}
+
+inline LLVector4Logical LLVector4a::lessEqual(const LLVector4a& rhs) const
+{
+ return _mm_cmple_ps(mQ, rhs.mQ);
+}
+
+inline LLVector4Logical LLVector4a::equal(const LLVector4a& rhs) const
+{
+ return _mm_cmpeq_ps(mQ, rhs.mQ);
+}
+
+// Returns true if this and rhs are componentwise equal up to the specified absolute tolerance
+inline bool LLVector4a::equals4(const LLVector4a& rhs, F32 tolerance ) const
+{
+ LLVector4a diff; diff.setSub( *this, rhs );
+ diff.setAbs( diff );
+ const LLQuad tol = _mm_set1_ps( tolerance );
+ const LLQuad cmp = _mm_cmplt_ps( diff, tol );
+ return (_mm_movemask_ps( cmp ) & LLVector4Logical::MASK_XYZW) == LLVector4Logical::MASK_XYZW;
+}
+
+inline bool LLVector4a::equals3(const LLVector4a& rhs, F32 tolerance ) const
+{
+ LLVector4a diff; diff.setSub( *this, rhs );
+ diff.setAbs( diff );
+ const LLQuad tol = _mm_set1_ps( tolerance );
+ const LLQuad t = _mm_cmplt_ps( diff, tol );
+ return (_mm_movemask_ps( t ) & LLVector4Logical::MASK_XYZ) == LLVector4Logical::MASK_XYZ;
+
+}
+
+////////////////////////////////////
+// OPERATORS
+////////////////////////////////////
+
+// Do NOT add aditional operators without consulting someone with SSE experience
+inline const LLVector4a& LLVector4a::operator= ( const LLVector4a& rhs )
+{
+ mQ = rhs.mQ;
+ return *this;
+}
+
+inline const LLVector4a& LLVector4a::operator= ( const LLQuad& rhs )
+{
+ mQ = rhs;
+ return *this;
+}
+
+inline LLVector4a::operator LLQuad() const
+{
+ return mQ;
+}
diff --git a/indra/llmath/llvector4logical.h b/indra/llmath/llvector4logical.h
new file mode 100644
index 0000000000..dd66b09d43
--- /dev/null
+++ b/indra/llmath/llvector4logical.h
@@ -0,0 +1,124 @@
+/**
+ * @file llvector4logical.h
+ * @brief LLVector4Logical class header file - Companion class to LLVector4a for logical and bit-twiddling operations
+ *
+ * $LicenseInfo:firstyear=2010&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_VECTOR4LOGICAL_H
+#define LL_VECTOR4LOGICAL_H
+
+
+////////////////////////////
+// LLVector4Logical
+////////////////////////////
+// This class is incomplete. If you need additional functionality,
+// for example setting/unsetting particular elements or performing
+// other boolean operations, feel free to implement. If you need
+// assistance in determining the most optimal implementation,
+// contact someone with SSE experience (Falcon, Richard, Davep, e.g.)
+////////////////////////////
+
+static LL_ALIGN_16(const U32 S_V4LOGICAL_MASK_TABLE[4*4]) =
+{
+ 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0xFFFFFFFF, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0xFFFFFFFF, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF
+};
+
+class LLVector4Logical
+{
+public:
+
+ enum {
+ MASK_X = 1,
+ MASK_Y = 1 << 1,
+ MASK_Z = 1 << 2,
+ MASK_W = 1 << 3,
+ MASK_XYZ = MASK_X | MASK_Y | MASK_Z,
+ MASK_XYZW = MASK_XYZ | MASK_W
+ };
+
+ // Empty default ctor
+ LLVector4Logical() {}
+
+ LLVector4Logical( const LLQuad& quad )
+ {
+ mQ = quad;
+ }
+
+ // Create and return a mask consisting of the lowest order bit of each element
+ inline U32 getGatheredBits() const
+ {
+ return _mm_movemask_ps(mQ);
+ };
+
+ // Invert this mask
+ inline LLVector4Logical& invert()
+ {
+ static const LL_ALIGN_16(U32 allOnes[4]) = { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF };
+ mQ = _mm_andnot_ps( mQ, *(LLQuad*)(allOnes) );
+ return *this;
+ }
+
+ inline LLBool32 areAllSet( U32 mask ) const
+ {
+ return ( getGatheredBits() & mask) == mask;
+ }
+
+ inline LLBool32 areAllSet() const
+ {
+ return areAllSet( MASK_XYZW );
+ }
+
+ inline LLBool32 areAnySet( U32 mask ) const
+ {
+ return getGatheredBits() & mask;
+ }
+
+ inline LLBool32 areAnySet() const
+ {
+ return areAnySet( MASK_XYZW );
+ }
+
+ inline operator LLQuad() const
+ {
+ return mQ;
+ }
+
+ inline void clear()
+ {
+ mQ = _mm_setzero_ps();
+ }
+
+ template<int N> void setElement()
+ {
+ mQ = _mm_or_ps( mQ, *reinterpret_cast<const LLQuad*>(S_V4LOGICAL_MASK_TABLE + 4*N) );
+ }
+
+private:
+
+ LLQuad mQ;
+};
+
+#endif //LL_VECTOR4ALOGICAL_H
diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp
index 14e1ca8d43..cc9744756f 100644
--- a/indra/llmath/llvolume.cpp
+++ b/indra/llmath/llvolume.cpp
@@ -1,4 +1,5 @@
/**
+
* @file llvolume.cpp
*
* $LicenseInfo:firstyear=2002&license=viewerlgpl$
@@ -24,9 +25,14 @@
*/
#include "linden_common.h"
+#include "llmemory.h"
#include "llmath.h"
#include <set>
+#if !LL_WINDOWS
+#include <stdint.h>
+#endif
+#include <cmath>
#include "llerror.h"
#include "llmemtype.h"
@@ -37,9 +43,16 @@
#include "v4math.h"
#include "m4math.h"
#include "m3math.h"
+#include "llmatrix3a.h"
+#include "lloctree.h"
#include "lldarray.h"
#include "llvolume.h"
+#include "llvolumeoctree.h"
#include "llstl.h"
+#include "llsdserialize.h"
+#include "llvector4a.h"
+#include "llmatrix4a.h"
+#include "lltimer.h"
#define DEBUG_SILHOUETTE_BINORMALS 0
#define DEBUG_SILHOUETTE_NORMALS 0 // TomY: Use this to display normals using the silhouette
@@ -80,7 +93,18 @@ const F32 SKEW_MAX = 0.95f;
const F32 SCULPT_MIN_AREA = 0.002f;
const S32 SCULPT_MIN_AREA_DETAIL = 1;
-#define GEN_TRI_STRIP 0
+extern BOOL gDebugGL;
+
+void assert_aligned(void* ptr, uintptr_t alignment)
+{
+#if 0
+ uintptr_t t = (uintptr_t) ptr;
+ if (t%alignment != 0)
+ {
+ llerrs << "Alignment check failed." << llendl;
+ }
+#endif
+}
BOOL check_same_clock_dir( const LLVector3& pt1, const LLVector3& pt2, const LLVector3& pt3, const LLVector3& norm)
{
@@ -99,128 +123,262 @@ BOOL check_same_clock_dir( const LLVector3& pt1, const LLVector3& pt2, const LLV
BOOL LLLineSegmentBoxIntersect(const LLVector3& start, const LLVector3& end, const LLVector3& center, const LLVector3& size)
{
- float fAWdU[3];
- LLVector3 dir;
- LLVector3 diff;
+ return LLLineSegmentBoxIntersect(start.mV, end.mV, center.mV, size.mV);
+}
+
+BOOL LLLineSegmentBoxIntersect(const F32* start, const F32* end, const F32* center, const F32* size)
+{
+ F32 fAWdU[3];
+ F32 dir[3];
+ F32 diff[3];
for (U32 i = 0; i < 3; i++)
{
- dir.mV[i] = 0.5f * (end.mV[i] - start.mV[i]);
- diff.mV[i] = (0.5f * (end.mV[i] + start.mV[i])) - center.mV[i];
- fAWdU[i] = fabsf(dir.mV[i]);
- if(fabsf(diff.mV[i])>size.mV[i] + fAWdU[i]) return false;
+ dir[i] = 0.5f * (end[i] - start[i]);
+ diff[i] = (0.5f * (end[i] + start[i])) - center[i];
+ fAWdU[i] = fabsf(dir[i]);
+ if(fabsf(diff[i])>size[i] + fAWdU[i]) return false;
}
float f;
- f = dir.mV[1] * diff.mV[2] - dir.mV[2] * diff.mV[1]; if(fabsf(f)>size.mV[1]*fAWdU[2] + size.mV[2]*fAWdU[1]) return false;
- f = dir.mV[2] * diff.mV[0] - dir.mV[0] * diff.mV[2]; if(fabsf(f)>size.mV[0]*fAWdU[2] + size.mV[2]*fAWdU[0]) return false;
- f = dir.mV[0] * diff.mV[1] - dir.mV[1] * diff.mV[0]; if(fabsf(f)>size.mV[0]*fAWdU[1] + size.mV[1]*fAWdU[0]) return false;
+ f = dir[1] * diff[2] - dir[2] * diff[1]; if(fabsf(f)>size[1]*fAWdU[2] + size[2]*fAWdU[1]) return false;
+ f = dir[2] * diff[0] - dir[0] * diff[2]; if(fabsf(f)>size[0]*fAWdU[2] + size[2]*fAWdU[0]) return false;
+ f = dir[0] * diff[1] - dir[1] * diff[0]; if(fabsf(f)>size[0]*fAWdU[1] + size[1]*fAWdU[0]) return false;
return true;
}
+
// intersect test between triangle vert0, vert1, vert2 and a ray from orig in direction dir.
// returns TRUE if intersecting and returns barycentric coordinates in intersection_a, intersection_b,
// and returns the intersection point along dir in intersection_t.
// Moller-Trumbore algorithm
-BOOL LLTriangleRayIntersect(const LLVector3& vert0, const LLVector3& vert1, const LLVector3& vert2, const LLVector3& orig, const LLVector3& dir,
- F32* intersection_a, F32* intersection_b, F32* intersection_t, BOOL two_sided)
+BOOL LLTriangleRayIntersect(const LLVector4a& vert0, const LLVector4a& vert1, const LLVector4a& vert2, const LLVector4a& orig, const LLVector4a& dir,
+ F32& intersection_a, F32& intersection_b, F32& intersection_t)
{
- F32 u, v, t;
/* find vectors for two edges sharing vert0 */
- LLVector3 edge1 = vert1 - vert0;
+ LLVector4a edge1;
+ edge1.setSub(vert1, vert0);
- LLVector3 edge2 = vert2 - vert0;;
+ LLVector4a edge2;
+ edge2.setSub(vert2, vert0);
/* begin calculating determinant - also used to calculate U parameter */
- LLVector3 pvec = dir % edge2;
-
- /* if determinant is near zero, ray lies in plane of triangle */
- F32 det = edge1 * pvec;
+ LLVector4a pvec;
+ pvec.setCross3(dir, edge2);
- if (!two_sided)
+ /* if determinant is near zero, ray lies in plane of triangle */
+ LLVector4a det;
+ det.setAllDot3(edge1, pvec);
+
+ if (det.greaterEqual(LLVector4a::getEpsilon()).getGatheredBits() & 0x7)
{
- if (det < F_APPROXIMATELY_ZERO)
- {
- return FALSE;
- }
-
/* calculate distance from vert0 to ray origin */
- LLVector3 tvec = orig - vert0;
+ LLVector4a tvec;
+ tvec.setSub(orig, vert0);
/* calculate U parameter and test bounds */
- u = tvec * pvec;
+ LLVector4a u;
+ u.setAllDot3(tvec,pvec);
- if (u < 0.f || u > det)
+ if ((u.greaterEqual(LLVector4a::getZero()).getGatheredBits() & 0x7) &&
+ (u.lessEqual(det).getGatheredBits() & 0x7))
{
- return FALSE;
+ /* prepare to test V parameter */
+ LLVector4a qvec;
+ qvec.setCross3(tvec, edge1);
+
+ /* calculate V parameter and test bounds */
+ LLVector4a v;
+ v.setAllDot3(dir, qvec);
+
+
+ //if (!(v < 0.f || u + v > det))
+
+ LLVector4a sum_uv;
+ sum_uv.setAdd(u, v);
+
+ S32 v_gequal = v.greaterEqual(LLVector4a::getZero()).getGatheredBits() & 0x7;
+ S32 sum_lequal = sum_uv.lessEqual(det).getGatheredBits() & 0x7;
+
+ if (v_gequal && sum_lequal)
+ {
+ /* calculate t, scale parameters, ray intersects triangle */
+ LLVector4a t;
+ t.setAllDot3(edge2,qvec);
+
+ t.div(det);
+ u.div(det);
+ v.div(det);
+
+ intersection_a = u[0];
+ intersection_b = v[0];
+ intersection_t = t[0];
+ return TRUE;
+ }
}
-
- /* prepare to test V parameter */
- LLVector3 qvec = tvec % edge1;
+ }
- /* calculate V parameter and test bounds */
- v = dir * qvec;
- if (v < 0.f || u + v > det)
- {
- return FALSE;
- }
+ return FALSE;
+}
- /* calculate t, scale parameters, ray intersects triangle */
- t = edge2 * qvec;
- F32 inv_det = 1.0 / det;
- t *= inv_det;
- u *= inv_det;
- v *= inv_det;
- }
+BOOL LLTriangleRayIntersectTwoSided(const LLVector4a& vert0, const LLVector4a& vert1, const LLVector4a& vert2, const LLVector4a& orig, const LLVector4a& dir,
+ F32& intersection_a, F32& intersection_b, F32& intersection_t)
+{
+ F32 u, v, t;
- else // two sided
- {
- if (det > -F_APPROXIMATELY_ZERO && det < F_APPROXIMATELY_ZERO)
- {
- return FALSE;
- }
- F32 inv_det = 1.0 / det;
+ /* find vectors for two edges sharing vert0 */
+ LLVector4a edge1;
+ edge1.setSub(vert1, vert0);
+
+
+ LLVector4a edge2;
+ edge2.setSub(vert2, vert0);
- /* calculate distance from vert0 to ray origin */
- LLVector3 tvec = orig - vert0;
-
- /* calculate U parameter and test bounds */
- u = (tvec * pvec) * inv_det;
- if (u < 0.f || u > 1.f)
- {
- return FALSE;
- }
+ /* begin calculating determinant - also used to calculate U parameter */
+ LLVector4a pvec;
+ pvec.setCross3(dir, edge2);
- /* prepare to test V parameter */
- LLVector3 qvec = tvec - edge1;
-
- /* calculate V parameter and test bounds */
- v = (dir * qvec) * inv_det;
-
- if (v < 0.f || u + v > 1.f)
- {
- return FALSE;
- }
+ /* if determinant is near zero, ray lies in plane of triangle */
+ F32 det = edge1.dot3(pvec).getF32();
+
+
+ if (det > -F_APPROXIMATELY_ZERO && det < F_APPROXIMATELY_ZERO)
+ {
+ return FALSE;
+ }
+
+ F32 inv_det = 1.f / det;
+
+ /* calculate distance from vert0 to ray origin */
+ LLVector4a tvec;
+ tvec.setSub(orig, vert0);
+
+ /* calculate U parameter and test bounds */
+ u = (tvec.dot3(pvec).getF32()) * inv_det;
+ if (u < 0.f || u > 1.f)
+ {
+ return FALSE;
+ }
- /* calculate t, ray intersects triangle */
- t = (edge2 * qvec) * inv_det;
+ /* prepare to test V parameter */
+ tvec.sub(edge1);
+
+ /* calculate V parameter and test bounds */
+ v = (dir.dot3(tvec).getF32()) * inv_det;
+
+ if (v < 0.f || u + v > 1.f)
+ {
+ return FALSE;
}
+
+ /* calculate t, ray intersects triangle */
+ t = (edge2.dot3(tvec).getF32()) * inv_det;
- if (intersection_a != NULL)
- *intersection_a = u;
- if (intersection_b != NULL)
- *intersection_b = v;
- if (intersection_t != NULL)
- *intersection_t = t;
+ intersection_a = u;
+ intersection_b = v;
+ intersection_t = t;
return TRUE;
}
+//helper for non-aligned vectors
+BOOL LLTriangleRayIntersect(const LLVector3& vert0, const LLVector3& vert1, const LLVector3& vert2, const LLVector3& orig, const LLVector3& dir,
+ F32& intersection_a, F32& intersection_b, F32& intersection_t, BOOL two_sided)
+{
+ LLVector4a vert0a, vert1a, vert2a, origa, dira;
+ vert0a.load3(vert0.mV);
+ vert1a.load3(vert1.mV);
+ vert2a.load3(vert2.mV);
+ origa.load3(orig.mV);
+ dira.load3(dir.mV);
+
+ if (two_sided)
+ {
+ return LLTriangleRayIntersectTwoSided(vert0a, vert1a, vert2a, origa, dira,
+ intersection_a, intersection_b, intersection_t);
+ }
+ else
+ {
+ return LLTriangleRayIntersect(vert0a, vert1a, vert2a, origa, dira,
+ intersection_a, intersection_b, intersection_t);
+ }
+}
+
+class LLVolumeOctreeRebound : public LLOctreeTravelerDepthFirst<LLVolumeTriangle>
+{
+public:
+ const LLVolumeFace* mFace;
+
+ LLVolumeOctreeRebound(const LLVolumeFace* face)
+ {
+ mFace = face;
+ }
+
+ virtual void visit(const LLOctreeNode<LLVolumeTriangle>* branch)
+ { //this is a depth first traversal, so it's safe to assum all children have complete
+ //bounding data
+
+ LLVolumeOctreeListener* node = (LLVolumeOctreeListener*) branch->getListener(0);
+
+ LLVector4a& min = node->mExtents[0];
+ LLVector4a& max = node->mExtents[1];
+
+ if (!branch->getData().empty())
+ { //node has data, find AABB that binds data set
+ const LLVolumeTriangle* tri = *(branch->getData().begin());
+
+ //initialize min/max to first available vertex
+ min = *(tri->mV[0]);
+ max = *(tri->mV[0]);
+
+ for (LLOctreeNode<LLVolumeTriangle>::const_element_iter iter =
+ branch->getData().begin(); iter != branch->getData().end(); ++iter)
+ { //for each triangle in node
+
+ //stretch by triangles in node
+ tri = *iter;
+
+ min.setMin(min, *tri->mV[0]);
+ min.setMin(min, *tri->mV[1]);
+ min.setMin(min, *tri->mV[2]);
+
+ max.setMax(max, *tri->mV[0]);
+ max.setMax(max, *tri->mV[1]);
+ max.setMax(max, *tri->mV[2]);
+ }
+ }
+ else if (!branch->getChildren().empty())
+ { //no data, but child nodes exist
+ LLVolumeOctreeListener* child = (LLVolumeOctreeListener*) branch->getChild(0)->getListener(0);
+
+ //initialize min/max to extents of first child
+ min = child->mExtents[0];
+ max = child->mExtents[1];
+ }
+ else
+ {
+ llerrs << "Empty leaf" << llendl;
+ }
+
+ for (S32 i = 0; i < branch->getChildCount(); ++i)
+ { //stretch by child extents
+ LLVolumeOctreeListener* child = (LLVolumeOctreeListener*) branch->getChild(i)->getListener(0);
+ min.setMin(min, child->mExtents[0]);
+ max.setMax(max, child->mExtents[1]);
+ }
+
+ node->mBounds[0].setAdd(min, max);
+ node->mBounds[0].mul(0.5f);
+
+ node->mBounds[1].setSub(max,min);
+ node->mBounds[1].mul(0.5f);
+ }
+};
//-------------------------------------------------------------------
// statics
@@ -259,6 +417,70 @@ LLProfile::Face* LLProfile::addFace(S32 i, S32 count, F32 scaleU, S16 faceID, BO
return face;
}
+//static
+S32 LLProfile::getNumNGonPoints(const LLProfileParams& params, S32 sides, F32 offset, F32 bevel, F32 ang_scale, S32 split)
+{ // this is basically LLProfile::genNGon stripped down to only the operations that influence the number of points
+ LLMemType m1(LLMemType::MTYPE_VOLUME);
+ S32 np = 0;
+
+ // Generate an n-sided "circular" path.
+ // 0 is (1,0), and we go counter-clockwise along a circular path from there.
+ F32 t, t_step, t_first, t_fraction;
+
+ F32 begin = params.getBegin();
+ F32 end = params.getEnd();
+
+ t_step = 1.0f / sides;
+
+ t_first = floor(begin * sides) / (F32)sides;
+
+ // pt1 is the first point on the fractional face.
+ // Starting t and ang values for the first face
+ t = t_first;
+
+ // Increment to the next point.
+ // pt2 is the end point on the fractional face
+ t += t_step;
+
+ t_fraction = (begin - t_first)*sides;
+
+ // Only use if it's not almost exactly on an edge.
+ if (t_fraction < 0.9999f)
+ {
+ np++;
+ }
+
+ // There's lots of potential here for floating point error to generate unneeded extra points - DJS 04/05/02
+ while (t < end)
+ {
+ // Iterate through all the integer steps of t.
+ np++;
+
+ t += t_step;
+ }
+
+ t_fraction = (end - (t - t_step))*sides;
+
+ // Find the fraction that we need to add to the end point.
+ t_fraction = (end - (t - t_step))*sides;
+ if (t_fraction > 0.0001f)
+ {
+ np++;
+ }
+
+ // If we're sliced, the profile is open.
+ if ((end - begin)*ang_scale < 0.99f)
+ {
+ if (params.getHollow() <= 0)
+ {
+ // put center point if not hollow.
+ np++;
+ }
+ }
+
+ return np;
+}
+
// What is the bevel parameter used for? - DJS 04/05/02
// Bevel parameter is currently unused but presumedly would support
// filleted and chamfered corners
@@ -515,6 +737,117 @@ LLProfile::Face* LLProfile::addHole(const LLProfileParams& params, BOOL flat, F3
return face;
}
+//static
+S32 LLProfile::getNumPoints(const LLProfileParams& params, BOOL path_open,F32 detail, S32 split,
+ BOOL is_sculpted, S32 sculpt_size)
+{ // this is basically LLProfile::generate stripped down to only operations that influence the number of points
+ LLMemType m1(LLMemType::MTYPE_VOLUME);
+
+ if (detail < MIN_LOD)
+ {
+ detail = MIN_LOD;
+ }
+
+ // Generate the face data
+ F32 hollow = params.getHollow();
+
+ S32 np = 0;
+
+ switch (params.getCurveType() & LL_PCODE_PROFILE_MASK)
+ {
+ case LL_PCODE_PROFILE_SQUARE:
+ {
+ np = getNumNGonPoints(params, 4,-0.375, 0, 1, split);
+
+ if (hollow)
+ {
+ np *= 2;
+ }
+ }
+ break;
+ case LL_PCODE_PROFILE_ISOTRI:
+ case LL_PCODE_PROFILE_RIGHTTRI:
+ case LL_PCODE_PROFILE_EQUALTRI:
+ {
+ np = getNumNGonPoints(params, 3,0, 0, 1, split);
+
+ if (hollow)
+ {
+ np *= 2;
+ }
+ }
+ break;
+ case LL_PCODE_PROFILE_CIRCLE:
+ {
+ // If this has a square hollow, we should adjust the
+ // number of faces a bit so that the geometry lines up.
+ U8 hole_type=0;
+ F32 circle_detail = MIN_DETAIL_FACES * detail;
+ if (hollow)
+ {
+ hole_type = params.getCurveType() & LL_PCODE_HOLE_MASK;
+ if (hole_type == LL_PCODE_HOLE_SQUARE)
+ {
+ // Snap to the next multiple of four sides,
+ // so that corners line up.
+ circle_detail = llceil(circle_detail / 4.0f) * 4.0f;
+ }
+ }
+
+ S32 sides = (S32)circle_detail;
+
+ if (is_sculpted)
+ sides = sculpt_size;
+
+ np = getNumNGonPoints(params, sides);
+
+ if (hollow)
+ {
+ np *= 2;
+ }
+ }
+ break;
+ case LL_PCODE_PROFILE_CIRCLE_HALF:
+ {
+ // If this has a square hollow, we should adjust the
+ // number of faces a bit so that the geometry lines up.
+ U8 hole_type=0;
+ // Number of faces is cut in half because it's only a half-circle.
+ F32 circle_detail = MIN_DETAIL_FACES * detail * 0.5f;
+ if (hollow)
+ {
+ hole_type = params.getCurveType() & LL_PCODE_HOLE_MASK;
+ if (hole_type == LL_PCODE_HOLE_SQUARE)
+ {
+ // Snap to the next multiple of four sides (div 2),
+ // so that corners line up.
+ circle_detail = llceil(circle_detail / 2.0f) * 2.0f;
+ }
+ }
+ np = getNumNGonPoints(params, llfloor(circle_detail), 0.5f, 0.f, 0.5f);
+
+ if (hollow)
+ {
+ np *= 2;
+ }
+
+ // Special case for openness of sphere
+ if ((params.getEnd() - params.getBegin()) < 1.f)
+ {
+ }
+ else if (!hollow)
+ {
+ np++;
+ }
+ }
+ break;
+ default:
+ break;
+ };
+
+
+ return np;
+}
BOOL LLProfile::generate(const LLProfileParams& params, BOOL path_open,F32 detail, S32 split,
@@ -976,6 +1309,32 @@ LLPath::~LLPath()
{
}
+S32 LLPath::getNumNGonPoints(const LLPathParams& params, S32 sides, F32 startOff, F32 end_scale, F32 twist_scale)
+{ //this is basically LLPath::genNGon stripped down to only operations that influence the number of points added
+ S32 ret = 0;
+
+ F32 step= 1.0f / sides;
+ F32 t = params.getBegin();
+ ret = 1;
+
+ t+=step;
+
+ // Snap to a quantized parameter, so that cut does not
+ // affect most sample points.
+ t = ((S32)(t * sides)) / (F32)sides;
+
+ // Run through the non-cut dependent points.
+ while (t < params.getEnd())
+ {
+ ret++;
+ t+=step;
+ }
+
+ ret++;
+
+ return ret;
+}
+
void LLPath::genNGon(const LLPathParams& params, S32 sides, F32 startOff, F32 end_scale, F32 twist_scale)
{
// Generates a circular path, starting at (1, 0, 0), counterclockwise along the xz plane.
@@ -1153,6 +1512,56 @@ const LLVector2 LLPathParams::getEndScale() const
return end_scale;
}
+S32 LLPath::getNumPoints(const LLPathParams& params, F32 detail)
+{ // this is basically LLPath::generate stripped down to only the operations that influence the number of points
+ LLMemType m1(LLMemType::MTYPE_VOLUME);
+
+ if (detail < MIN_LOD)
+ {
+ detail = MIN_LOD;
+ }
+
+ S32 np = 2; // hardcode for line
+
+ // Is this 0xf0 mask really necessary? DK 03/02/05
+
+ switch (params.getCurveType() & 0xf0)
+ {
+ default:
+ case LL_PCODE_PATH_LINE:
+ {
+ // Take the begin/end twist into account for detail.
+ np = llfloor(fabs(params.getTwistBegin() - params.getTwist()) * 3.5f * (detail-0.5f)) + 2;
+ }
+ break;
+
+ case LL_PCODE_PATH_CIRCLE:
+ {
+ // Increase the detail as the revolutions and twist increase.
+ F32 twist_mag = fabs(params.getTwistBegin() - params.getTwist());
+
+ S32 sides = (S32)llfloor(llfloor((MIN_DETAIL_FACES * detail + twist_mag * 3.5f * (detail-0.5f))) * params.getRevolutions());
+
+ np = sides;
+ }
+ break;
+
+ case LL_PCODE_PATH_CIRCLE2:
+ {
+ //genNGon(params, llfloor(MIN_DETAIL_FACES * detail), 4.f, 0.f);
+ np = getNumNGonPoints(params, llfloor(MIN_DETAIL_FACES * detail));
+ }
+ break;
+
+ case LL_PCODE_PATH_TEST:
+
+ np = 5;
+ break;
+ };
+
+ return np;
+}
+
BOOL LLPath::generate(const LLPathParams& params, F32 detail, S32 split,
BOOL is_sculpted, S32 sculpt_size)
{
@@ -1669,7 +2078,14 @@ LLVolume::LLVolume(const LLVolumeParams &params, const F32 detail, const BOOL ge
mFaceMask = 0x0;
mDetail = detail;
mSculptLevel = -2;
-
+ mSurfaceArea = 1.f; //only calculated for sculpts, defaults to 1 for all other prims
+ mIsMeshAssetLoaded = FALSE;
+ mLODScaleBias.setVec(1,1,1);
+ mHullPoints = NULL;
+ mHullIndices = NULL;
+ mNumHullPoints = 0;
+ mNumHullIndices = 0;
+
// set defaults
if (mParams.getPathParams().getCurveType() == LL_PCODE_PATH_FLEXIBLE)
{
@@ -1684,7 +2100,8 @@ LLVolume::LLVolume(const LLVolumeParams &params, const F32 detail, const BOOL ge
mGenerateSingleFace = generate_single_face;
generate();
- if (mParams.getSculptID().isNull() && params.getSculptType() == LL_SCULPT_TYPE_NONE)
+
+ if (mParams.getSculptID().isNull() && mParams.getSculptType() == LL_SCULPT_TYPE_NONE || mParams.getSculptType() == LL_SCULPT_TYPE_MESH)
{
createVolumeFaces();
}
@@ -1719,6 +2136,11 @@ LLVolume::~LLVolume()
mPathp = NULL;
mProfilep = NULL;
mVolumeFaces.clear();
+
+ ll_aligned_free_16(mHullPoints);
+ mHullPoints = NULL;
+ ll_aligned_free_16(mHullIndices);
+ mHullIndices = NULL;
}
BOOL LLVolume::generate()
@@ -1835,6 +2257,487 @@ BOOL LLVolume::generate()
return FALSE;
}
+void LLVolumeFace::VertexData::init()
+{
+ if (!mData)
+ {
+ mData = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*2);
+ }
+}
+
+LLVolumeFace::VertexData::VertexData()
+{
+ mData = NULL;
+ init();
+}
+
+LLVolumeFace::VertexData::VertexData(const VertexData& rhs)
+{
+ mData = NULL;
+ *this = rhs;
+}
+
+const LLVolumeFace::VertexData& LLVolumeFace::VertexData::operator=(const LLVolumeFace::VertexData& rhs)
+{
+ if (this != &rhs)
+ {
+ init();
+ LLVector4a::memcpyNonAliased16((F32*) mData, (F32*) rhs.mData, 2*sizeof(LLVector4a));
+ mTexCoord = rhs.mTexCoord;
+ }
+ return *this;
+}
+
+LLVolumeFace::VertexData::~VertexData()
+{
+ ll_aligned_free_16(mData);
+ mData = NULL;
+}
+
+LLVector4a& LLVolumeFace::VertexData::getPosition()
+{
+ return mData[POSITION];
+}
+
+LLVector4a& LLVolumeFace::VertexData::getNormal()
+{
+ return mData[NORMAL];
+}
+
+const LLVector4a& LLVolumeFace::VertexData::getPosition() const
+{
+ return mData[POSITION];
+}
+
+const LLVector4a& LLVolumeFace::VertexData::getNormal() const
+{
+ return mData[NORMAL];
+}
+
+
+void LLVolumeFace::VertexData::setPosition(const LLVector4a& pos)
+{
+ mData[POSITION] = pos;
+}
+
+void LLVolumeFace::VertexData::setNormal(const LLVector4a& norm)
+{
+ mData[NORMAL] = norm;
+}
+
+bool LLVolumeFace::VertexData::operator<(const LLVolumeFace::VertexData& rhs)const
+{
+ const F32* lp = this->getPosition().getF32ptr();
+ const F32* rp = rhs.getPosition().getF32ptr();
+
+ if (lp[0] != rp[0])
+ {
+ return lp[0] < rp[0];
+ }
+
+ if (rp[1] != lp[1])
+ {
+ return lp[1] < rp[1];
+ }
+
+ if (rp[2] != lp[2])
+ {
+ return lp[2] < rp[2];
+ }
+
+ lp = getNormal().getF32ptr();
+ rp = rhs.getNormal().getF32ptr();
+
+ if (lp[0] != rp[0])
+ {
+ return lp[0] < rp[0];
+ }
+
+ if (rp[1] != lp[1])
+ {
+ return lp[1] < rp[1];
+ }
+
+ if (rp[2] != lp[2])
+ {
+ return lp[2] < rp[2];
+ }
+
+ if (mTexCoord.mV[0] != rhs.mTexCoord.mV[0])
+ {
+ return mTexCoord.mV[0] < rhs.mTexCoord.mV[0];
+ }
+
+ return mTexCoord.mV[1] < rhs.mTexCoord.mV[1];
+}
+
+bool LLVolumeFace::VertexData::operator==(const LLVolumeFace::VertexData& rhs)const
+{
+ return mData[POSITION].equals3(rhs.getPosition()) &&
+ mData[NORMAL].equals3(rhs.getNormal()) &&
+ mTexCoord == rhs.mTexCoord;
+}
+
+bool LLVolumeFace::VertexData::compareNormal(const LLVolumeFace::VertexData& rhs, F32 angle_cutoff) const
+{
+ bool retval = false;
+
+ const F32 epsilon = 0.00001f;
+
+ if (rhs.mData[POSITION].equals3(mData[POSITION], epsilon) &&
+ fabs(rhs.mTexCoord[0]-mTexCoord[0]) < epsilon &&
+ fabs(rhs.mTexCoord[1]-mTexCoord[1]) < epsilon)
+ {
+ if (angle_cutoff > 1.f)
+ {
+ retval = (mData[NORMAL].equals3(rhs.mData[NORMAL], epsilon));
+ }
+ else
+ {
+ F32 cur_angle = rhs.mData[NORMAL].dot3(mData[NORMAL]).getF32();
+ retval = cur_angle > angle_cutoff;
+ }
+ }
+
+ return retval;
+}
+
+bool LLVolume::unpackVolumeFaces(std::istream& is, S32 size)
+{
+ //input stream is now pointing at a zlib compressed block of LLSD
+ //decompress block
+ LLSD mdl;
+ if (!unzip_llsd(mdl, is, size))
+ {
+ LL_DEBUGS("MeshStreaming") << "Failed to unzip LLSD blob for LoD, will probably fetch from sim again." << llendl;
+ return false;
+ }
+
+ {
+ U32 face_count = mdl.size();
+
+ if (face_count == 0)
+ { //no faces unpacked, treat as failed decode
+ llwarns << "found no faces!" << llendl;
+ return false;
+ }
+
+ mVolumeFaces.resize(face_count);
+
+ for (U32 i = 0; i < face_count; ++i)
+ {
+ LLVolumeFace& face = mVolumeFaces[i];
+
+ if (mdl[i].has("NoGeometry"))
+ { //face has no geometry, continue
+ face.resizeIndices(3);
+ face.resizeVertices(1);
+ memset(face.mPositions, 0, sizeof(LLVector4a));
+ memset(face.mNormals, 0, sizeof(LLVector4a));
+ memset(face.mTexCoords, 0, sizeof(LLVector2));
+ memset(face.mIndices, 0, sizeof(U16)*3);
+ continue;
+ }
+
+ LLSD::Binary pos = mdl[i]["Position"];
+ LLSD::Binary norm = mdl[i]["Normal"];
+ LLSD::Binary tc = mdl[i]["TexCoord0"];
+ LLSD::Binary idx = mdl[i]["TriangleList"];
+
+
+
+ //copy out indices
+ face.resizeIndices(idx.size()/2);
+
+ if (idx.empty() || face.mNumIndices < 3)
+ { //why is there an empty index list?
+ llwarns <<"Empty face present!" << llendl;
+ continue;
+ }
+
+ U16* indices = (U16*) &(idx[0]);
+ U32 count = idx.size()/2;
+ for (U32 j = 0; j < count; ++j)
+ {
+ face.mIndices[j] = indices[j];
+ }
+
+ //copy out vertices
+ U32 num_verts = pos.size()/(3*2);
+ face.resizeVertices(num_verts);
+
+ LLVector3 minp;
+ LLVector3 maxp;
+ LLVector2 min_tc;
+ LLVector2 max_tc;
+
+ minp.setValue(mdl[i]["PositionDomain"]["Min"]);
+ maxp.setValue(mdl[i]["PositionDomain"]["Max"]);
+ LLVector4a min_pos, max_pos;
+ min_pos.load3(minp.mV);
+ max_pos.load3(maxp.mV);
+
+ min_tc.setValue(mdl[i]["TexCoord0Domain"]["Min"]);
+ max_tc.setValue(mdl[i]["TexCoord0Domain"]["Max"]);
+
+ LLVector4a pos_range;
+ pos_range.setSub(max_pos, min_pos);
+ LLVector2 tc_range2 = max_tc - min_tc;
+ LLVector4a tc_range;
+ tc_range.set(tc_range2[0], tc_range2[1], tc_range2[0], tc_range2[1]);
+ LLVector4a min_tc4(min_tc[0], min_tc[1], min_tc[0], min_tc[1]);
+
+ LLVector4a* pos_out = face.mPositions;
+ LLVector4a* norm_out = face.mNormals;
+ LLVector4a* tc_out = (LLVector4a*) face.mTexCoords;
+
+ {
+ U16* v = (U16*) &(pos[0]);
+ for (U32 j = 0; j < num_verts; ++j)
+ {
+ pos_out->set((F32) v[0], (F32) v[1], (F32) v[2]);
+ pos_out->div(65535.f);
+ pos_out->mul(pos_range);
+ pos_out->add(min_pos);
+ pos_out++;
+ v += 3;
+ }
+
+ }
+
+ {
+ if (!norm.empty())
+ {
+ U16* n = (U16*) &(norm[0]);
+ for (U32 j = 0; j < num_verts; ++j)
+ {
+ norm_out->set((F32) n[0], (F32) n[1], (F32) n[2]);
+ norm_out->div(65535.f);
+ norm_out->mul(2.f);
+ norm_out->sub(1.f);
+ norm_out++;
+ n += 3;
+ }
+ }
+ else
+ {
+ memset(norm_out, 0, sizeof(LLVector4a)*num_verts);
+ }
+ }
+
+ {
+ if (!tc.empty())
+ {
+ U16* t = (U16*) &(tc[0]);
+ for (U32 j = 0; j < num_verts; j+=2)
+ {
+ if (j < num_verts-1)
+ {
+ tc_out->set((F32) t[0], (F32) t[1], (F32) t[2], (F32) t[3]);
+ }
+ else
+ {
+ tc_out->set((F32) t[0], (F32) t[1], 0.f, 0.f);
+ }
+
+ t += 4;
+
+ tc_out->div(65535.f);
+ tc_out->mul(tc_range);
+ tc_out->add(min_tc4);
+
+ tc_out++;
+ }
+ }
+ else
+ {
+ memset(tc_out, 0, sizeof(LLVector2)*num_verts);
+ }
+ }
+
+ if (mdl[i].has("Weights"))
+ {
+ face.allocateWeights(num_verts);
+
+ LLSD::Binary weights = mdl[i]["Weights"];
+
+ U32 idx = 0;
+
+ U32 cur_vertex = 0;
+ while (idx < weights.size() && cur_vertex < num_verts)
+ {
+ const U8 END_INFLUENCES = 0xFF;
+ U8 joint = weights[idx++];
+
+ U32 cur_influence = 0;
+ LLVector4 wght(0,0,0,0);
+
+ while (joint != END_INFLUENCES && idx < weights.size())
+ {
+ U16 influence = weights[idx++];
+ influence |= ((U16) weights[idx++] << 8);
+
+ F32 w = llclamp((F32) influence / 65535.f, 0.f, 0.99999f);
+ wght.mV[cur_influence++] = (F32) joint + w;
+
+ if (cur_influence >= 4)
+ {
+ joint = END_INFLUENCES;
+ }
+ else
+ {
+ joint = weights[idx++];
+ }
+ }
+
+ face.mWeights[cur_vertex].loadua(wght.mV);
+
+ cur_vertex++;
+ }
+
+ if (cur_vertex != num_verts || idx != weights.size())
+ {
+ llwarns << "Vertex weight count does not match vertex count!" << llendl;
+ }
+
+ }
+
+ // modifier flags?
+ bool do_mirror = (mParams.getSculptType() & LL_SCULPT_FLAG_MIRROR);
+ bool do_invert = (mParams.getSculptType() &LL_SCULPT_FLAG_INVERT);
+
+
+ // translate to actions:
+ bool do_reflect_x = false;
+ bool do_reverse_triangles = false;
+ bool do_invert_normals = false;
+
+ if (do_mirror)
+ {
+ do_reflect_x = true;
+ do_reverse_triangles = !do_reverse_triangles;
+ }
+
+ if (do_invert)
+ {
+ do_invert_normals = true;
+ do_reverse_triangles = !do_reverse_triangles;
+ }
+
+ // now do the work
+
+ if (do_reflect_x)
+ {
+ LLVector4a* p = (LLVector4a*) face.mPositions;
+ LLVector4a* n = (LLVector4a*) face.mNormals;
+
+ for (S32 i = 0; i < face.mNumVertices; i++)
+ {
+ p[i].mul(-1.0f);
+ n[i].mul(-1.0f);
+ }
+ }
+
+ if (do_invert_normals)
+ {
+ LLVector4a* n = (LLVector4a*) face.mNormals;
+
+ for (S32 i = 0; i < face.mNumVertices; i++)
+ {
+ n[i].mul(-1.0f);
+ }
+ }
+
+ if (do_reverse_triangles)
+ {
+ for (U32 j = 0; j < face.mNumIndices; j += 3)
+ {
+ // swap the 2nd and 3rd index
+ S32 swap = face.mIndices[j+1];
+ face.mIndices[j+1] = face.mIndices[j+2];
+ face.mIndices[j+2] = swap;
+ }
+ }
+
+ //calculate bounding box
+ LLVector4a& min = face.mExtents[0];
+ LLVector4a& max = face.mExtents[1];
+
+ if (face.mNumVertices < 3)
+ { //empty face, use a dummy 1cm (at 1m scale) bounding box
+ min.splat(-0.005f);
+ max.splat(0.005f);
+ }
+ else
+ {
+ min = max = face.mPositions[0];
+
+ for (S32 i = 1; i < face.mNumVertices; ++i)
+ {
+ min.setMin(min, face.mPositions[i]);
+ max.setMax(max, face.mPositions[i]);
+ }
+
+ if (face.mTexCoords)
+ {
+ LLVector2& min_tc = face.mTexCoordExtents[0];
+ LLVector2& max_tc = face.mTexCoordExtents[1];
+
+ min_tc = face.mTexCoords[0];
+ max_tc = face.mTexCoords[0];
+
+ for (U32 j = 1; j < face.mNumVertices; ++j)
+ {
+ update_min_max(min_tc, max_tc, face.mTexCoords[j]);
+ }
+ }
+ else
+ {
+ face.mTexCoordExtents[0].set(0,0);
+ face.mTexCoordExtents[1].set(1,1);
+ }
+ }
+ }
+ }
+
+ mSculptLevel = 0; // success!
+
+ cacheOptimize();
+
+ return true;
+}
+
+
+BOOL LLVolume::isMeshAssetLoaded()
+{
+ return mIsMeshAssetLoaded;
+}
+
+void LLVolume::setMeshAssetLoaded(BOOL loaded)
+{
+ mIsMeshAssetLoaded = loaded;
+}
+
+void LLVolume::copyVolumeFaces(const LLVolume* volume)
+{
+ mVolumeFaces = volume->mVolumeFaces;
+ mSculptLevel = 0;
+}
+
+void LLVolume::cacheOptimize()
+{
+ for (S32 i = 0; i < mVolumeFaces.size(); ++i)
+ {
+ mVolumeFaces[i].cacheOptimize();
+ }
+}
+
+
+S32 LLVolume::getNumFaces() const
+{
+ return mIsMeshAssetLoaded ? getNumVolumeFaces() : (S32)mProfilep->mFaces.size();
+}
+
void LLVolume::createVolumeFaces()
{
@@ -2001,7 +2904,7 @@ F32 LLVolume::sculptGetSurfaceArea()
// compute the area of the quad by taking the length of the cross product of the two triangles
LLVector3 cross1 = (p1 - p2) % (p1 - p3);
LLVector3 cross2 = (p4 - p2) % (p4 - p3);
- area += (cross1.magVec() + cross2.magVec()) / 2.0;
+ area += (cross1.magVec() + cross2.magVec()) / 2.f;
}
}
@@ -2188,7 +3091,7 @@ void sculpt_calc_mesh_resolution(U16 width, U16 height, U8 type, F32 detail, S32
ratio = (F32) width / (F32) height;
- s = (S32)fsqrtf(((F32)vertices / ratio));
+ s = (S32)(F32) sqrt(((F32)vertices / ratio));
s = llmax(s, 4); // no degenerate sizes, please
t = vertices / s;
@@ -2240,7 +3143,13 @@ void LLVolume::sculpt(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components,
// don't test lowest LOD to support legacy content DEV-33670
if (mDetail > SCULPT_MIN_AREA_DETAIL)
{
- if (sculptGetSurfaceArea() < SCULPT_MIN_AREA)
+ F32 area = sculptGetSurfaceArea();
+
+ mSurfaceArea = area;
+
+ const F32 SCULPT_MAX_AREA = 384.f;
+
+ if (area < SCULPT_MIN_AREA || area > SCULPT_MAX_AREA)
{
data_is_empty = TRUE;
}
@@ -2281,6 +3190,16 @@ BOOL LLVolume::isFlat(S32 face)
}
+bool LLVolumeParams::isSculpt() const
+{
+ return mSculptID.notNull();
+}
+
+bool LLVolumeParams::isMeshSculpt() const
+{
+ return isSculpt() && ((mSculptType & LL_SCULPT_TYPE_MASK) == LL_SCULPT_TYPE_MESH);
+}
+
bool LLVolumeParams::operator==(const LLVolumeParams &params) const
{
return ( (getPathParams() == params.getPathParams()) &&
@@ -2314,7 +3233,6 @@ bool LLVolumeParams::operator<(const LLVolumeParams &params) const
return mSculptID < params.mSculptID;
}
-
return mSculptType < params.mSculptType;
@@ -3315,6 +4233,23 @@ S32 *LLVolume::getTriangleIndices(U32 &num_indices) const
return index;
}
+void LLVolume::getLoDTriangleCounts(const LLVolumeParams& params, S32* counts)
+{ //attempt to approximate the number of triangles that will result from generating a volume LoD set for the
+ //supplied LLVolumeParams -- inaccurate, but a close enough approximation for determining streaming cost
+ F32 detail[] = {1.f, 1.5f, 2.5f, 4.f};
+ for (S32 i = 0; i < 4; i++)
+ {
+ S32 count = 0;
+ S32 path_points = LLPath::getNumPoints(params.getPathParams(), detail[i]);
+ S32 profile_points = LLProfile::getNumPoints(params.getProfileParams(), false, detail[i]);
+
+ count = (profile_points-1)*2*(path_points-1);
+ count += profile_points*2;
+
+ counts[i] = count;
+ }
+}
+
S32 LLVolume::getNumTriangleIndices() const
{
BOOL profile_open = getProfile().isOpen();
@@ -3372,34 +4307,72 @@ S32 LLVolume::getNumTriangleIndices() const
return count;
}
+
+S32 LLVolume::getNumTriangles(S32* vcount) const
+{
+ U32 triangle_count = 0;
+ U32 vertex_count = 0;
+
+ for (S32 i = 0; i < getNumVolumeFaces(); ++i)
+ {
+ const LLVolumeFace& face = getVolumeFace(i);
+ triangle_count += face.mNumIndices/3;
+
+ vertex_count += face.mNumVertices;
+ }
+
+
+ if (vcount)
+ {
+ *vcount = vertex_count;
+ }
+
+ return triangle_count;
+}
+
+
//-----------------------------------------------------------------------------
// generateSilhouetteVertices()
//-----------------------------------------------------------------------------
void LLVolume::generateSilhouetteVertices(std::vector<LLVector3> &vertices,
std::vector<LLVector3> &normals,
- std::vector<S32> &segments,
- const LLVector3& obj_cam_vec,
- const LLMatrix4& mat,
- const LLMatrix3& norm_mat,
+ const LLVector3& obj_cam_vec_in,
+ const LLMatrix4& mat_in,
+ const LLMatrix3& norm_mat_in,
S32 face_mask)
{
LLMemType m1(LLMemType::MTYPE_VOLUME);
-
+
+ LLMatrix4a mat;
+ mat.loadu(mat_in);
+
+ LLMatrix4a norm_mat;
+ norm_mat.loadu(norm_mat_in);
+
+ LLVector4a obj_cam_vec;
+ obj_cam_vec.load3(obj_cam_vec_in.mV);
+
vertices.clear();
normals.clear();
- segments.clear();
+ if ((mParams.getSculptType() & LL_SCULPT_TYPE_MASK) == LL_SCULPT_TYPE_MESH)
+ {
+ return;
+ }
+
S32 cur_index = 0;
//for each face
for (face_list_t::iterator iter = mVolumeFaces.begin();
iter != mVolumeFaces.end(); ++iter)
{
- const LLVolumeFace& face = *iter;
+ LLVolumeFace& face = *iter;
- if (!(face_mask & (0x1 << cur_index++)))
+ if (!(face_mask & (0x1 << cur_index++)) ||
+ face.mNumIndices == 0 || face.mEdge.empty())
{
continue;
}
+
if (face.mTypeMask & (LLVolumeFace::CAP_MASK)) {
}
@@ -3412,7 +4385,7 @@ void LLVolume::generateSilhouetteVertices(std::vector<LLVector3> &vertices,
#if DEBUG_SILHOUETTE_EDGE_MAP
//for each triangle
- U32 count = face.mIndices.size();
+ U32 count = face.mNumIndices;
for (U32 j = 0; j < count/3; j++) {
//get vertices
S32 v1 = face.mIndices[j*3+0];
@@ -3420,9 +4393,9 @@ void LLVolume::generateSilhouetteVertices(std::vector<LLVector3> &vertices,
S32 v3 = face.mIndices[j*3+2];
//get current face center
- LLVector3 cCenter = (face.mVertices[v1].mPosition +
- face.mVertices[v2].mPosition +
- face.mVertices[v3].mPosition) / 3.0f;
+ LLVector3 cCenter = (face.mVertices[v1].getPosition() +
+ face.mVertices[v2].getPosition() +
+ face.mVertices[v3].getPosition()) / 3.0f;
//for each edge
for (S32 k = 0; k < 3; k++) {
@@ -3440,9 +4413,9 @@ void LLVolume::generateSilhouetteVertices(std::vector<LLVector3> &vertices,
v3 = face.mIndices[nIndex*3+2];
//get neighbor face center
- LLVector3 nCenter = (face.mVertices[v1].mPosition +
- face.mVertices[v2].mPosition +
- face.mVertices[v3].mPosition) / 3.0f;
+ LLVector3 nCenter = (face.mVertices[v1].getPosition() +
+ face.mVertices[v2].getPosition() +
+ face.mVertices[v3].getPosition()) / 3.0f;
//draw line
vertices.push_back(cCenter);
@@ -3465,15 +4438,15 @@ void LLVolume::generateSilhouetteVertices(std::vector<LLVector3> &vertices,
#elif DEBUG_SILHOUETTE_NORMALS
//for each vertex
- for (U32 j = 0; j < face.mVertices.size(); j++) {
- vertices.push_back(face.mVertices[j].mPosition);
- vertices.push_back(face.mVertices[j].mPosition + face.mVertices[j].mNormal*0.1f);
+ for (U32 j = 0; j < face.mNumVertices; j++) {
+ vertices.push_back(face.mVertices[j].getPosition());
+ vertices.push_back(face.mVertices[j].getPosition() + face.mVertices[j].getNormal()*0.1f);
normals.push_back(LLVector3(0,0,1));
normals.push_back(LLVector3(0,0,1));
segments.push_back(vertices.size());
#if DEBUG_SILHOUETTE_BINORMALS
- vertices.push_back(face.mVertices[j].mPosition);
- vertices.push_back(face.mVertices[j].mPosition + face.mVertices[j].mBinormal*0.1f);
+ vertices.push_back(face.mVertices[j].getPosition());
+ vertices.push_back(face.mVertices[j].getPosition() + face.mVertices[j].mBinormal*0.1f);
normals.push_back(LLVector3(0,0,1));
normals.push_back(LLVector3(0,0,1));
segments.push_back(vertices.size());
@@ -3491,26 +4464,36 @@ void LLVolume::generateSilhouetteVertices(std::vector<LLVector3> &vertices,
//for each triangle
std::vector<U8> fFacing;
- vector_append(fFacing, face.mIndices.size()/3);
- for (U32 j = 0; j < face.mIndices.size()/3; j++)
+ vector_append(fFacing, face.mNumIndices/3);
+
+ LLVector4a* v = (LLVector4a*) face.mPositions;
+ LLVector4a* n = (LLVector4a*) face.mNormals;
+
+ for (U32 j = 0; j < face.mNumIndices/3; j++)
{
//approximate normal
S32 v1 = face.mIndices[j*3+0];
S32 v2 = face.mIndices[j*3+1];
S32 v3 = face.mIndices[j*3+2];
- LLVector3 norm = (face.mVertices[v1].mPosition - face.mVertices[v2].mPosition) %
- (face.mVertices[v2].mPosition - face.mVertices[v3].mPosition);
-
- if (norm.magVecSquared() < 0.00000001f)
+ LLVector4a c1,c2;
+ c1.setSub(v[v1], v[v2]);
+ c2.setSub(v[v2], v[v3]);
+
+ LLVector4a norm;
+
+ norm.setCross3(c1, c2);
+
+ if (norm.dot3(norm) < 0.00000001f)
{
fFacing[j] = AWAY | TOWARDS;
}
else
{
//get view vector
- LLVector3 view = (obj_cam_vec-face.mVertices[v1].mPosition);
- bool away = view * norm > 0.0f;
+ LLVector4a view;
+ view.setSub(obj_cam_vec, v[v1]);
+ bool away = view.dot3(norm) > 0.0f;
if (away)
{
fFacing[j] = AWAY;
@@ -3523,7 +4506,7 @@ void LLVolume::generateSilhouetteVertices(std::vector<LLVector3> &vertices,
}
//for each triangle
- for (U32 j = 0; j < face.mIndices.size()/3; j++)
+ for (U32 j = 0; j < face.mNumIndices/3; j++)
{
if (fFacing[j] == (AWAY | TOWARDS))
{ //this is a degenerate triangle
@@ -3556,17 +4539,21 @@ void LLVolume::generateSilhouetteVertices(std::vector<LLVector3> &vertices,
S32 v1 = face.mIndices[j*3+k];
S32 v2 = face.mIndices[j*3+((k+1)%3)];
- vertices.push_back(face.mVertices[v1].mPosition*mat);
- LLVector3 norm1 = face.mVertices[v1].mNormal * norm_mat;
- norm1.normVec();
- normals.push_back(norm1);
+ LLVector4a t;
+ mat.affineTransform(v[v1], t);
+ vertices.push_back(LLVector3(t[0], t[1], t[2]));
+
+ norm_mat.rotate(n[v1], t);
- vertices.push_back(face.mVertices[v2].mPosition*mat);
- LLVector3 norm2 = face.mVertices[v2].mNormal * norm_mat;
- norm2.normVec();
- normals.push_back(norm2);
+ t.normalize3fast();
+ normals.push_back(LLVector3(t[0], t[1], t[2]));
- segments.push_back(vertices.size());
+ mat.affineTransform(v[v2], t);
+ vertices.push_back(LLVector3(t[0], t[1], t[2]));
+
+ norm_mat.rotate(n[v2], t);
+ t.normalize3fast();
+ normals.push_back(LLVector3(t[0], t[1], t[2]));
}
}
}
@@ -3579,6 +4566,19 @@ S32 LLVolume::lineSegmentIntersect(const LLVector3& start, const LLVector3& end,
S32 face,
LLVector3* intersection,LLVector2* tex_coord, LLVector3* normal, LLVector3* bi_normal)
{
+ LLVector4a starta, enda;
+ starta.load3(start.mV);
+ enda.load3(end.mV);
+
+ return lineSegmentIntersect(starta, enda, face, intersection, tex_coord, normal, bi_normal);
+
+}
+
+
+S32 LLVolume::lineSegmentIntersect(const LLVector4a& start, const LLVector4a& end,
+ S32 face,
+ LLVector3* intersection,LLVector2* tex_coord, LLVector3* normal, LLVector3* bi_normal)
+{
S32 hit_face = -1;
S32 start_face;
@@ -3595,16 +4595,23 @@ S32 LLVolume::lineSegmentIntersect(const LLVector3& start, const LLVector3& end,
end_face = face;
}
- LLVector3 dir = end - start;
+ LLVector4a dir;
+ dir.setSub(end, start);
F32 closest_t = 2.f; // must be larger than 1
+ end_face = llmin(end_face, getNumVolumeFaces()-1);
+
for (S32 i = start_face; i <= end_face; i++)
{
- const LLVolumeFace &face = getVolumeFace((U32)i);
+ LLVolumeFace &face = mVolumeFaces[i];
+
+ LLVector4a box_center;
+ box_center.setAdd(face.mExtents[0], face.mExtents[1]);
+ box_center.mul(0.5f);
- LLVector3 box_center = (face.mExtents[0] + face.mExtents[1]) / 2.f;
- LLVector3 box_size = face.mExtents[1] - face.mExtents[0];
+ LLVector4a box_size;
+ box_size.setSub(face.mExtents[1], face.mExtents[0]);
if (LLLineSegmentBoxIntersect(start, end, box_center, box_size))
{
@@ -3612,57 +4619,85 @@ S32 LLVolume::lineSegmentIntersect(const LLVector3& start, const LLVector3& end,
{
genBinormals(i);
}
-
- for (U32 tri = 0; tri < face.mIndices.size()/3; tri++)
- {
- S32 index1 = face.mIndices[tri*3+0];
- S32 index2 = face.mIndices[tri*3+1];
- S32 index3 = face.mIndices[tri*3+2];
-
- F32 a, b, t;
-
- if (LLTriangleRayIntersect(face.mVertices[index1].mPosition,
- face.mVertices[index2].mPosition,
- face.mVertices[index3].mPosition,
- start, dir, &a, &b, &t, FALSE))
- {
- if ((t >= 0.f) && // if hit is after start
- (t <= 1.f) && // and before end
- (t < closest_t)) // and this hit is closer
- {
- closest_t = t;
- hit_face = i;
-
- if (intersection != NULL)
- {
- *intersection = start + dir * closest_t;
- }
-
- if (tex_coord != NULL)
- {
- *tex_coord = ((1.f - a - b) * face.mVertices[index1].mTexCoord +
- a * face.mVertices[index2].mTexCoord +
- b * face.mVertices[index3].mTexCoord);
- }
+ if (isUnique())
+ { //don't bother with an octree for flexi volumes
+ U32 tri_count = face.mNumIndices/3;
- if (normal != NULL)
+ for (U32 j = 0; j < tri_count; ++j)
{
- *normal = ((1.f - a - b) * face.mVertices[index1].mNormal +
- a * face.mVertices[index2].mNormal +
- b * face.mVertices[index3].mNormal);
- }
+ U16 idx0 = face.mIndices[j*3+0];
+ U16 idx1 = face.mIndices[j*3+1];
+ U16 idx2 = face.mIndices[j*3+2];
+
+ const LLVector4a& v0 = face.mPositions[idx0];
+ const LLVector4a& v1 = face.mPositions[idx1];
+ const LLVector4a& v2 = face.mPositions[idx2];
+
+ F32 a,b,t;
- if (bi_normal != NULL)
+ if (LLTriangleRayIntersect(v0, v1, v2,
+ start, dir, a, b, t))
{
- *bi_normal = ((1.f - a - b) * face.mVertices[index1].mBinormal +
- a * face.mVertices[index2].mBinormal +
- b * face.mVertices[index3].mBinormal);
+ if ((t >= 0.f) && // if hit is after start
+ (t <= 1.f) && // and before end
+ (t < closest_t)) // and this hit is closer
+ {
+ closest_t = t;
+ hit_face = i;
+
+ if (intersection != NULL)
+ {
+ LLVector4a intersect = dir;
+ intersect.mul(closest_t);
+ intersect.add(start);
+ intersection->set(intersect.getF32ptr());
+ }
+
+
+ if (tex_coord != NULL)
+ {
+ LLVector2* tc = (LLVector2*) face.mTexCoords;
+ *tex_coord = ((1.f - a - b) * tc[idx0] +
+ a * tc[idx1] +
+ b * tc[idx2]);
+
+ }
+
+ if (normal!= NULL)
+ {
+ LLVector4* norm = (LLVector4*) face.mNormals;
+
+ *normal = ((1.f - a - b) * LLVector3(norm[idx0]) +
+ a * LLVector3(norm[idx1]) +
+ b * LLVector3(norm[idx2]));
+ }
+
+ if (bi_normal != NULL)
+ {
+ LLVector4* binormal = (LLVector4*) face.mBinormals;
+ *bi_normal = ((1.f - a - b) * LLVector3(binormal[idx0]) +
+ a * LLVector3(binormal[idx1]) +
+ b * LLVector3(binormal[idx2]));
+ }
}
-
}
}
}
+ else
+ {
+ if (!face.mOctree)
+ {
+ face.createOctree();
+ }
+
+ LLOctreeTriangleRayIntersect intersect(start, dir, &face, &closest_t, intersection, tex_coord, normal, bi_normal);
+ intersect.traverse(face.mOctree);
+ if (intersect.mHitFace)
+ {
+ hit_face = i;
+ }
+ }
}
}
@@ -4109,11 +5144,28 @@ BOOL LLVolumeParams::exportLegacyStream(std::ostream& output_stream) const
return TRUE;
}
+LLSD LLVolumeParams::sculptAsLLSD() const
+{
+ LLSD sd = LLSD();
+ sd["id"] = getSculptID();
+ sd["type"] = getSculptType();
+
+ return sd;
+}
+
+bool LLVolumeParams::sculptFromLLSD(LLSD& sd)
+{
+ setSculptID(sd["id"].asUUID(), (U8)sd["type"].asInteger());
+ return true;
+}
+
LLSD LLVolumeParams::asLLSD() const
{
LLSD sd = LLSD();
sd["path"] = mPathParams;
sd["profile"] = mProfileParams;
+ sd["sculpt"] = sculptAsLLSD();
+
return sd;
}
@@ -4121,6 +5173,8 @@ bool LLVolumeParams::fromLLSD(LLSD& sd)
{
mPathParams.fromLLSD(sd["path"]);
mProfileParams.fromLLSD(sd["profile"]);
+ sculptFromLLSD(sd["sculpt"]);
+
return true;
}
@@ -4163,6 +5217,12 @@ const F32 MIN_CONCAVE_PATH_WEDGE = 0.111111f; // 1/9 unity
// for collison purposes
BOOL LLVolumeParams::isConvex() const
{
+ if (!getSculptID().isNull())
+ {
+ // can't determine, be safe and say no:
+ return FALSE;
+ }
+
F32 path_length = mPathParams.getEnd() - mPathParams.getBegin();
F32 hollow = mProfileParams.getHollow();
@@ -4403,22 +5463,866 @@ std::ostream& operator<<(std::ostream &s, const LLVolume *volumep)
return s;
}
+LLVolumeFace::LLVolumeFace() :
+ mID(0),
+ mTypeMask(0),
+ mBeginS(0),
+ mBeginT(0),
+ mNumS(0),
+ mNumT(0),
+ mNumVertices(0),
+ mNumIndices(0),
+ mPositions(NULL),
+ mNormals(NULL),
+ mBinormals(NULL),
+ mTexCoords(NULL),
+ mIndices(NULL),
+ mWeights(NULL),
+ mOctree(NULL)
+{
+ mExtents = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*3);
+ mExtents[0].splat(-0.5f);
+ mExtents[1].splat(0.5f);
+ mCenter = mExtents+2;
+}
+
+LLVolumeFace::LLVolumeFace(const LLVolumeFace& src)
+: mID(0),
+ mTypeMask(0),
+ mBeginS(0),
+ mBeginT(0),
+ mNumS(0),
+ mNumT(0),
+ mNumVertices(0),
+ mNumIndices(0),
+ mPositions(NULL),
+ mNormals(NULL),
+ mBinormals(NULL),
+ mTexCoords(NULL),
+ mIndices(NULL),
+ mWeights(NULL),
+ mOctree(NULL)
+{
+ mExtents = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*3);
+ mCenter = mExtents+2;
+ *this = src;
+}
+
+LLVolumeFace& LLVolumeFace::operator=(const LLVolumeFace& src)
+{
+ if (&src == this)
+ { //self assignment, do nothing
+ return *this;
+ }
+
+ mID = src.mID;
+ mTypeMask = src.mTypeMask;
+ mBeginS = src.mBeginS;
+ mBeginT = src.mBeginT;
+ mNumS = src.mNumS;
+ mNumT = src.mNumT;
+
+ mExtents[0] = src.mExtents[0];
+ mExtents[1] = src.mExtents[1];
+ *mCenter = *src.mCenter;
+
+ mNumVertices = 0;
+ mNumIndices = 0;
+
+ freeData();
+
+ LLVector4a::memcpyNonAliased16((F32*) mExtents, (F32*) src.mExtents, 3*sizeof(LLVector4a));
+
+ resizeVertices(src.mNumVertices);
+ resizeIndices(src.mNumIndices);
+
+ if (mNumVertices)
+ {
+ S32 vert_size = mNumVertices*sizeof(LLVector4a);
+ S32 tc_size = (mNumVertices*sizeof(LLVector2)+0xF) & ~0xF;
+
+ LLVector4a::memcpyNonAliased16((F32*) mPositions, (F32*) src.mPositions, vert_size);
+ LLVector4a::memcpyNonAliased16((F32*) mNormals, (F32*) src.mNormals, vert_size);
+
+ if(src.mTexCoords)
+ {
+ LLVector4a::memcpyNonAliased16((F32*) mTexCoords, (F32*) src.mTexCoords, tc_size);
+ }
+ else
+ {
+ ll_aligned_free_16(mTexCoords) ;
+ mTexCoords = NULL ;
+ }
+
+
+ if (src.mBinormals)
+ {
+ allocateBinormals(src.mNumVertices);
+ LLVector4a::memcpyNonAliased16((F32*) mBinormals, (F32*) src.mBinormals, vert_size);
+ }
+ else
+ {
+ ll_aligned_free_16(mBinormals);
+ mBinormals = NULL;
+ }
+
+ if (src.mWeights)
+ {
+ allocateWeights(src.mNumVertices);
+ LLVector4a::memcpyNonAliased16((F32*) mWeights, (F32*) src.mWeights, vert_size);
+ }
+ else
+ {
+ ll_aligned_free_16(mWeights);
+ mWeights = NULL;
+ }
+ }
+
+ if (mNumIndices)
+ {
+ S32 idx_size = (mNumIndices*sizeof(U16)+0xF) & ~0xF;
+
+ LLVector4a::memcpyNonAliased16((F32*) mIndices, (F32*) src.mIndices, idx_size);
+ }
+
+ //delete
+ return *this;
+}
+
+LLVolumeFace::~LLVolumeFace()
+{
+ ll_aligned_free_16(mExtents);
+ mExtents = NULL;
+
+ freeData();
+}
+
+void LLVolumeFace::freeData()
+{
+ ll_aligned_free_16(mPositions);
+ mPositions = NULL;
+ ll_aligned_free_16( mNormals);
+ mNormals = NULL;
+ ll_aligned_free_16(mTexCoords);
+ mTexCoords = NULL;
+ ll_aligned_free_16(mIndices);
+ mIndices = NULL;
+ ll_aligned_free_16(mBinormals);
+ mBinormals = NULL;
+ ll_aligned_free_16(mWeights);
+ mWeights = NULL;
+
+ delete mOctree;
+ mOctree = NULL;
+}
BOOL LLVolumeFace::create(LLVolume* volume, BOOL partial_build)
{
+ //tree for this face is no longer valid
+ delete mOctree;
+ mOctree = NULL;
+
+ BOOL ret = FALSE ;
if (mTypeMask & CAP_MASK)
{
- return createCap(volume, partial_build);
+ ret = createCap(volume, partial_build);
}
else if ((mTypeMask & END_MASK) || (mTypeMask & SIDE_MASK))
{
- return createSide(volume, partial_build);
+ ret = createSide(volume, partial_build);
}
else
{
llerrs << "Unknown/uninitialized face type!" << llendl;
- return FALSE;
}
+
+ //update the range of the texture coordinates
+ if(ret)
+ {
+ mTexCoordExtents[0].setVec(1.f, 1.f) ;
+ mTexCoordExtents[1].setVec(0.f, 0.f) ;
+
+ for(U32 i = 0 ; i < mNumVertices ; i++)
+ {
+ if(mTexCoordExtents[0].mV[0] > mTexCoords[i].mV[0])
+ {
+ mTexCoordExtents[0].mV[0] = mTexCoords[i].mV[0] ;
+ }
+ if(mTexCoordExtents[1].mV[0] < mTexCoords[i].mV[0])
+ {
+ mTexCoordExtents[1].mV[0] = mTexCoords[i].mV[0] ;
+ }
+
+ if(mTexCoordExtents[0].mV[1] > mTexCoords[i].mV[1])
+ {
+ mTexCoordExtents[0].mV[1] = mTexCoords[i].mV[1] ;
+ }
+ if(mTexCoordExtents[1].mV[1] < mTexCoords[i].mV[1])
+ {
+ mTexCoordExtents[1].mV[1] = mTexCoords[i].mV[1] ;
+ }
+ }
+ mTexCoordExtents[0].mV[0] = llmax(0.f, mTexCoordExtents[0].mV[0]) ;
+ mTexCoordExtents[0].mV[1] = llmax(0.f, mTexCoordExtents[0].mV[1]) ;
+ mTexCoordExtents[1].mV[0] = llmin(1.f, mTexCoordExtents[1].mV[0]) ;
+ mTexCoordExtents[1].mV[1] = llmin(1.f, mTexCoordExtents[1].mV[1]) ;
+ }
+
+ return ret ;
+}
+
+void LLVolumeFace::getVertexData(U16 index, LLVolumeFace::VertexData& cv)
+{
+ cv.setPosition(mPositions[index]);
+ if (mNormals)
+ {
+ cv.setNormal(mNormals[index]);
+ }
+ else
+ {
+ cv.getNormal().clear();
+ }
+
+ if (mTexCoords)
+ {
+ cv.mTexCoord = mTexCoords[index];
+ }
+ else
+ {
+ cv.mTexCoord.clear();
+ }
+}
+
+bool LLVolumeFace::VertexMapData::operator==(const LLVolumeFace::VertexData& rhs) const
+{
+ return getPosition().equals3(rhs.getPosition()) &&
+ mTexCoord == rhs.mTexCoord &&
+ getNormal().equals3(rhs.getNormal());
+}
+
+bool LLVolumeFace::VertexMapData::ComparePosition::operator()(const LLVector3& a, const LLVector3& b) const
+{
+ if (a.mV[0] != b.mV[0])
+ {
+ return a.mV[0] < b.mV[0];
+ }
+
+ if (a.mV[1] != b.mV[1])
+ {
+ return a.mV[1] < b.mV[1];
+ }
+
+ return a.mV[2] < b.mV[2];
+}
+
+void LLVolumeFace::optimize(F32 angle_cutoff)
+{
+ LLVolumeFace new_face;
+
+ //map of points to vector of vertices at that point
+ std::map<U64, std::vector<VertexMapData> > point_map;
+
+ LLVector4a range;
+ range.setSub(mExtents[1],mExtents[0]);
+
+ //remove redundant vertices
+ for (U32 i = 0; i < mNumIndices; ++i)
+ {
+ U16 index = mIndices[i];
+
+ LLVolumeFace::VertexData cv;
+ getVertexData(index, cv);
+
+ BOOL found = FALSE;
+
+ LLVector4a pos;
+ pos.setSub(mPositions[index], mExtents[0]);
+ pos.div(range);
+
+ U64 pos64 = 0;
+
+ pos64 = (U16) (pos[0]*65535);
+ pos64 = pos64 | (((U64) (pos[1]*65535)) << 16);
+ pos64 = pos64 | (((U64) (pos[2]*65535)) << 32);
+
+ std::map<U64, std::vector<VertexMapData> >::iterator point_iter = point_map.find(pos64);
+
+ if (point_iter != point_map.end())
+ { //duplicate point might exist
+ for (U32 j = 0; j < point_iter->second.size(); ++j)
+ {
+ LLVolumeFace::VertexData& tv = (point_iter->second)[j];
+ if (tv.compareNormal(cv, angle_cutoff))
+ {
+ found = TRUE;
+ new_face.pushIndex((point_iter->second)[j].mIndex);
+ break;
+ }
+ }
+ }
+
+ if (!found)
+ {
+ new_face.pushVertex(cv);
+ U16 index = (U16) new_face.mNumVertices-1;
+ new_face.pushIndex(index);
+
+ VertexMapData d;
+ d.setPosition(cv.getPosition());
+ d.mTexCoord = cv.mTexCoord;
+ d.setNormal(cv.getNormal());
+ d.mIndex = index;
+ if (point_iter != point_map.end())
+ {
+ point_iter->second.push_back(d);
+ }
+ else
+ {
+ point_map[pos64].push_back(d);
+ }
+ }
+ }
+
+ llassert(new_face.mNumIndices == mNumIndices);
+ llassert(new_face.mNumVertices <= mNumVertices);
+
+ if (angle_cutoff > 1.f && !mNormals)
+ {
+ ll_aligned_free_16(new_face.mNormals);
+ new_face.mNormals = NULL;
+ }
+
+ if (!mTexCoords)
+ {
+ ll_aligned_free_16(new_face.mTexCoords);
+ new_face.mTexCoords = NULL;
+ }
+
+ swapData(new_face);
+}
+
+class LLVCacheTriangleData;
+
+class LLVCacheVertexData
+{
+public:
+ S32 mIdx;
+ S32 mCacheTag;
+ F32 mScore;
+ U32 mActiveTriangles;
+ std::vector<LLVCacheTriangleData*> mTriangles;
+
+ LLVCacheVertexData()
+ {
+ mCacheTag = -1;
+ mScore = 0.f;
+ mActiveTriangles = 0;
+ mIdx = -1;
+ }
+};
+
+class LLVCacheTriangleData
+{
+public:
+ bool mActive;
+ F32 mScore;
+ LLVCacheVertexData* mVertex[3];
+
+ LLVCacheTriangleData()
+ {
+ mActive = true;
+ mScore = 0.f;
+ mVertex[0] = mVertex[1] = mVertex[2] = NULL;
+ }
+
+ void complete()
+ {
+ mActive = false;
+ for (S32 i = 0; i < 3; ++i)
+ {
+ if (mVertex[i])
+ {
+ llassert_always(mVertex[i]->mActiveTriangles > 0);
+ mVertex[i]->mActiveTriangles--;
+ }
+ }
+ }
+
+ bool operator<(const LLVCacheTriangleData& rhs) const
+ { //highest score first
+ return rhs.mScore < mScore;
+ }
+};
+
+const F32 FindVertexScore_CacheDecayPower = 1.5f;
+const F32 FindVertexScore_LastTriScore = 0.75f;
+const F32 FindVertexScore_ValenceBoostScale = 2.0f;
+const F32 FindVertexScore_ValenceBoostPower = 0.5f;
+const U32 MaxSizeVertexCache = 32;
+
+F32 find_vertex_score(LLVCacheVertexData& data)
+{
+ if (data.mActiveTriangles == 0)
+ { //no triangle references this vertex
+ return -1.f;
+ }
+
+ F32 score = 0.f;
+
+ S32 cache_idx = data.mCacheTag;
+
+ if (cache_idx < 0)
+ {
+ //not in cache
+ }
+ else
+ {
+ if (cache_idx < 3)
+ { //vertex was in the last triangle
+ score = FindVertexScore_LastTriScore;
+ }
+ else
+ { //more points for being higher in the cache
+ F32 scaler = 1.f/(MaxSizeVertexCache-3);
+ score = 1.f-((cache_idx-3)*scaler);
+ score = powf(score, FindVertexScore_CacheDecayPower);
+ }
+ }
+
+ //bonus points for having low valence
+ F32 valence_boost = powf((F32)data.mActiveTriangles, -FindVertexScore_ValenceBoostPower);
+ score += FindVertexScore_ValenceBoostScale * valence_boost;
+
+ return score;
+}
+
+class LLVCacheFIFO
+{
+public:
+ LLVCacheVertexData* mCache[MaxSizeVertexCache];
+ U32 mMisses;
+
+ LLVCacheFIFO()
+ {
+ mMisses = 0;
+ for (U32 i = 0; i < MaxSizeVertexCache; ++i)
+ {
+ mCache[i] = NULL;
+ }
+ }
+
+ void addVertex(LLVCacheVertexData* data)
+ {
+ if (data->mCacheTag == -1)
+ {
+ mMisses++;
+
+ S32 end = MaxSizeVertexCache-1;
+
+ if (mCache[end])
+ {
+ mCache[end]->mCacheTag = -1;
+ }
+
+ for (S32 i = end; i > 0; --i)
+ {
+ mCache[i] = mCache[i-1];
+ if (mCache[i])
+ {
+ mCache[i]->mCacheTag = i;
+ }
+ }
+
+ mCache[0] = data;
+ data->mCacheTag = 0;
+ }
+ }
+};
+
+class LLVCacheLRU
+{
+public:
+ LLVCacheVertexData* mCache[MaxSizeVertexCache+3];
+
+ LLVCacheTriangleData* mBestTriangle;
+
+ U32 mMisses;
+
+ LLVCacheLRU()
+ {
+ for (U32 i = 0; i < MaxSizeVertexCache+3; ++i)
+ {
+ mCache[i] = NULL;
+ }
+
+ mBestTriangle = NULL;
+ mMisses = 0;
+ }
+
+ void addVertex(LLVCacheVertexData* data)
+ {
+ S32 end = MaxSizeVertexCache+2;
+ if (data->mCacheTag != -1)
+ { //just moving a vertex to the front of the cache
+ end = data->mCacheTag;
+ }
+ else
+ {
+ mMisses++;
+ if (mCache[end])
+ { //adding a new vertex, vertex at end of cache falls off
+ mCache[end]->mCacheTag = -1;
+ }
+ }
+
+ for (S32 i = end; i > 0; --i)
+ { //adjust cache pointers and tags
+ mCache[i] = mCache[i-1];
+
+ if (mCache[i])
+ {
+ mCache[i]->mCacheTag = i;
+ }
+ }
+
+ mCache[0] = data;
+ mCache[0]->mCacheTag = 0;
+ }
+
+ void addTriangle(LLVCacheTriangleData* data)
+ {
+ addVertex(data->mVertex[0]);
+ addVertex(data->mVertex[1]);
+ addVertex(data->mVertex[2]);
+ }
+
+ void updateScores()
+ {
+ for (U32 i = MaxSizeVertexCache; i < MaxSizeVertexCache+3; ++i)
+ { //trailing 3 vertices aren't actually in the cache for scoring purposes
+ if (mCache[i])
+ {
+ mCache[i]->mCacheTag = -1;
+ }
+ }
+
+ for (U32 i = 0; i < MaxSizeVertexCache; ++i)
+ { //update scores of vertices in cache
+ if (mCache[i])
+ {
+ mCache[i]->mScore = find_vertex_score(*(mCache[i]));
+ llassert_always(mCache[i]->mCacheTag == i);
+ }
+ }
+
+ mBestTriangle = NULL;
+ //update triangle scores
+ for (U32 i = 0; i < MaxSizeVertexCache+3; ++i)
+ {
+ if (mCache[i])
+ {
+ for (U32 j = 0; j < mCache[i]->mTriangles.size(); ++j)
+ {
+ LLVCacheTriangleData* tri = mCache[i]->mTriangles[j];
+ if (tri->mActive)
+ {
+ tri->mScore = tri->mVertex[0]->mScore;
+ tri->mScore += tri->mVertex[1]->mScore;
+ tri->mScore += tri->mVertex[2]->mScore;
+
+ if (!mBestTriangle || mBestTriangle->mScore < tri->mScore)
+ {
+ mBestTriangle = tri;
+ }
+ }
+ }
+ }
+ }
+
+ //knock trailing 3 vertices off the cache
+ for (U32 i = MaxSizeVertexCache; i < MaxSizeVertexCache+3; ++i)
+ {
+ if (mCache[i])
+ {
+ llassert_always(mCache[i]->mCacheTag == -1);
+ mCache[i] = NULL;
+ }
+ }
+ }
+};
+
+
+void LLVolumeFace::cacheOptimize()
+{ //optimize for vertex cache according to Forsyth method:
+ // http://home.comcast.net/~tom_forsyth/papers/fast_vert_cache_opt.html
+
+ LLVCacheLRU cache;
+
+ if (mNumVertices < 3)
+ { //nothing to do
+ return;
+ }
+
+ //mapping of vertices to triangles and indices
+ std::vector<LLVCacheVertexData> vertex_data;
+
+ //mapping of triangles do vertices
+ std::vector<LLVCacheTriangleData> triangle_data;
+
+ triangle_data.resize(mNumIndices/3);
+ vertex_data.resize(mNumVertices);
+
+ for (U32 i = 0; i < mNumIndices; i++)
+ { //populate vertex data and triangle data arrays
+ U16 idx = mIndices[i];
+ U32 tri_idx = i/3;
+
+ vertex_data[idx].mTriangles.push_back(&(triangle_data[tri_idx]));
+ vertex_data[idx].mIdx = idx;
+ triangle_data[tri_idx].mVertex[i%3] = &(vertex_data[idx]);
+ }
+
+ /*F32 pre_acmr = 1.f;
+ //measure cache misses from before rebuild
+ {
+ LLVCacheFIFO test_cache;
+ for (U32 i = 0; i < mNumIndices; ++i)
+ {
+ test_cache.addVertex(&vertex_data[mIndices[i]]);
+ }
+
+ for (U32 i = 0; i < mNumVertices; i++)
+ {
+ vertex_data[i].mCacheTag = -1;
+ }
+
+ pre_acmr = (F32) test_cache.mMisses/(mNumIndices/3);
+ }*/
+
+ for (U32 i = 0; i < mNumVertices; i++)
+ { //initialize score values (no cache -- might try a fifo cache here)
+ vertex_data[i].mScore = find_vertex_score(vertex_data[i]);
+ vertex_data[i].mActiveTriangles = vertex_data[i].mTriangles.size();
+
+ for (U32 j = 0; j < vertex_data[i].mTriangles.size(); ++j)
+ {
+ vertex_data[i].mTriangles[j]->mScore += vertex_data[i].mScore;
+ }
+ }
+
+ //sort triangle data by score
+ std::sort(triangle_data.begin(), triangle_data.end());
+
+ std::vector<U16> new_indices;
+
+ LLVCacheTriangleData* tri;
+
+ //prime pump by adding first triangle to cache;
+ tri = &(triangle_data[0]);
+ cache.addTriangle(tri);
+ new_indices.push_back(tri->mVertex[0]->mIdx);
+ new_indices.push_back(tri->mVertex[1]->mIdx);
+ new_indices.push_back(tri->mVertex[2]->mIdx);
+ tri->complete();
+
+ U32 breaks = 0;
+ for (U32 i = 1; i < mNumIndices/3; ++i)
+ {
+ cache.updateScores();
+ tri = cache.mBestTriangle;
+ if (!tri)
+ {
+ breaks++;
+ for (U32 j = 0; j < triangle_data.size(); ++j)
+ {
+ if (triangle_data[j].mActive)
+ {
+ tri = &(triangle_data[j]);
+ break;
+ }
+ }
+ }
+
+ cache.addTriangle(tri);
+ new_indices.push_back(tri->mVertex[0]->mIdx);
+ new_indices.push_back(tri->mVertex[1]->mIdx);
+ new_indices.push_back(tri->mVertex[2]->mIdx);
+ tri->complete();
+ }
+
+ for (U32 i = 0; i < mNumIndices; ++i)
+ {
+ mIndices[i] = new_indices[i];
+ }
+
+ /*F32 post_acmr = 1.f;
+ //measure cache misses from after rebuild
+ {
+ LLVCacheFIFO test_cache;
+ for (U32 i = 0; i < mNumVertices; i++)
+ {
+ vertex_data[i].mCacheTag = -1;
+ }
+
+ for (U32 i = 0; i < mNumIndices; ++i)
+ {
+ test_cache.addVertex(&vertex_data[mIndices[i]]);
+ }
+
+ post_acmr = (F32) test_cache.mMisses/(mNumIndices/3);
+ }*/
+
+ //optimize for pre-TnL cache
+
+ //allocate space for new buffer
+ S32 num_verts = mNumVertices;
+ LLVector4a* pos = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts);
+ LLVector4a* norm = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts);
+ S32 size = ((num_verts*sizeof(LLVector2)) + 0xF) & ~0xF;
+ LLVector2* tc = (LLVector2*) ll_aligned_malloc_16(size);
+
+ LLVector4a* wght = NULL;
+ if (mWeights)
+ {
+ wght = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts);
+ }
+
+ LLVector4a* binorm = NULL;
+ if (mBinormals)
+ {
+ binorm = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts);
+ }
+
+ //allocate mapping of old indices to new indices
+ std::vector<S32> new_idx;
+ new_idx.resize(mNumVertices, -1);
+
+ S32 cur_idx = 0;
+ for (U32 i = 0; i < mNumIndices; ++i)
+ {
+ U16 idx = mIndices[i];
+ if (new_idx[idx] == -1)
+ { //this vertex hasn't been added yet
+ new_idx[idx] = cur_idx;
+
+ //copy vertex data
+ pos[cur_idx] = mPositions[idx];
+ norm[cur_idx] = mNormals[idx];
+ tc[cur_idx] = mTexCoords[idx];
+ if (mWeights)
+ {
+ wght[cur_idx] = mWeights[idx];
+ }
+ if (mBinormals)
+ {
+ binorm[cur_idx] = mBinormals[idx];
+ }
+
+ cur_idx++;
+ }
+ }
+
+ for (U32 i = 0; i < mNumIndices; ++i)
+ {
+ mIndices[i] = new_idx[mIndices[i]];
+ }
+
+ ll_aligned_free_16(mPositions);
+ ll_aligned_free_16(mNormals);
+ ll_aligned_free_16(mTexCoords);
+ ll_aligned_free_16(mWeights);
+ ll_aligned_free_16(mBinormals);
+
+ mPositions = pos;
+ mNormals = norm;
+ mTexCoords = tc;
+ mWeights = wght;
+ mBinormals = binorm;
+
+ //std::string result = llformat("ACMR pre/post: %.3f/%.3f -- %d triangles %d breaks", pre_acmr, post_acmr, mNumIndices/3, breaks);
+ //llinfos << result << llendl;
+
+}
+
+void LLVolumeFace::createOctree(F32 scaler, const LLVector4a& center, const LLVector4a& size)
+{
+ if (mOctree)
+ {
+ return;
+ }
+
+ mOctree = new LLOctreeRoot<LLVolumeTriangle>(center, size, NULL);
+ new LLVolumeOctreeListener(mOctree);
+
+ for (U32 i = 0; i < mNumIndices; i+= 3)
+ { //for each triangle
+ LLPointer<LLVolumeTriangle> tri = new LLVolumeTriangle();
+
+ const LLVector4a& v0 = mPositions[mIndices[i]];
+ const LLVector4a& v1 = mPositions[mIndices[i+1]];
+ const LLVector4a& v2 = mPositions[mIndices[i+2]];
+
+ //store pointers to vertex data
+ tri->mV[0] = &v0;
+ tri->mV[1] = &v1;
+ tri->mV[2] = &v2;
+
+ //store indices
+ tri->mIndex[0] = mIndices[i];
+ tri->mIndex[1] = mIndices[i+1];
+ tri->mIndex[2] = mIndices[i+2];
+
+ //get minimum point
+ LLVector4a min = v0;
+ min.setMin(min, v1);
+ min.setMin(min, v2);
+
+ //get maximum point
+ LLVector4a max = v0;
+ max.setMax(max, v1);
+ max.setMax(max, v2);
+
+ //compute center
+ LLVector4a center;
+ center.setAdd(min, max);
+ center.mul(0.5f);
+
+ tri->mPositionGroup = center;
+
+ //compute "radius"
+ LLVector4a size;
+ size.setSub(max,min);
+
+ tri->mRadius = size.getLength3().getF32() * scaler;
+
+ //insert
+ mOctree->insert(tri);
+ }
+
+ //remove unneeded octree layers
+ while (!mOctree->balance()) { }
+
+ //calculate AABB for each node
+ LLVolumeOctreeRebound rebound(this);
+ rebound.traverse(mOctree);
+
+ if (gDebugGL)
+ {
+ LLVolumeOctreeValidate validate;
+ validate.traverse(mOctree);
+ }
+}
+
+
+void LLVolumeFace::swapData(LLVolumeFace& rhs)
+{
+ llswap(rhs.mPositions, mPositions);
+ llswap(rhs.mNormals, mNormals);
+ llswap(rhs.mBinormals, mBinormals);
+ llswap(rhs.mTexCoords, mTexCoords);
+ llswap(rhs.mIndices,mIndices);
+ llswap(rhs.mNumVertices, mNumVertices);
+ llswap(rhs.mNumIndices, mNumIndices);
}
void LerpPlanarVertex(LLVolumeFace::VertexData& v0,
@@ -4428,10 +6332,21 @@ void LerpPlanarVertex(LLVolumeFace::VertexData& v0,
F32 coef01,
F32 coef02)
{
- vout.mPosition = v0.mPosition + ((v1.mPosition-v0.mPosition)*coef01)+((v2.mPosition-v0.mPosition)*coef02);
+
+ LLVector4a lhs;
+ lhs.setSub(v1.getPosition(), v0.getPosition());
+ lhs.mul(coef01);
+ LLVector4a rhs;
+ rhs.setSub(v2.getPosition(), v0.getPosition());
+ rhs.mul(coef02);
+
+ rhs.add(lhs);
+ rhs.add(v0.getPosition());
+
+ vout.setPosition(rhs);
+
vout.mTexCoord = v0.mTexCoord + ((v1.mTexCoord-v0.mTexCoord)*coef01)+((v2.mTexCoord-v0.mTexCoord)*coef02);
- vout.mNormal = v0.mNormal;
- vout.mBinormal = v0.mBinormal;
+ vout.setNormal(v0.getNormal());
}
BOOL LLVolumeFace::createUnCutCubeCap(LLVolume* volume, BOOL partial_build)
@@ -4451,84 +6366,113 @@ BOOL LLVolumeFace::createUnCutCubeCap(LLVolume* volume, BOOL partial_build)
num_vertices = (grid_size+1)*(grid_size+1);
num_indices = quad_count * 4;
- LLVector3& min = mExtents[0];
- LLVector3& max = mExtents[1];
+ LLVector4a& min = mExtents[0];
+ LLVector4a& max = mExtents[1];
S32 offset = 0;
if (mTypeMask & TOP_MASK)
+ {
offset = (max_t-1) * max_s;
+ }
else
+ {
offset = mBeginS;
+ }
- VertexData corners[4];
- VertexData baseVert;
- for(int t = 0; t < 4; t++){
- corners[t].mPosition = mesh[offset + (grid_size*t)].mPos;
- corners[t].mTexCoord.mV[0] = profile[grid_size*t].mV[0]+0.5f;
- corners[t].mTexCoord.mV[1] = 0.5f - profile[grid_size*t].mV[1];
- }
- baseVert.mNormal =
- ((corners[1].mPosition-corners[0].mPosition) %
- (corners[2].mPosition-corners[1].mPosition));
- baseVert.mNormal.normVec();
- if(!(mTypeMask & TOP_MASK)){
- baseVert.mNormal *= -1.0f;
- }else{
- //Swap the UVs on the U(X) axis for top face
- LLVector2 swap;
- swap = corners[0].mTexCoord;
- corners[0].mTexCoord=corners[3].mTexCoord;
- corners[3].mTexCoord=swap;
- swap = corners[1].mTexCoord;
- corners[1].mTexCoord=corners[2].mTexCoord;
- corners[2].mTexCoord=swap;
- }
- baseVert.mBinormal = calc_binormal_from_triangle(
- corners[0].mPosition, corners[0].mTexCoord,
- corners[1].mPosition, corners[1].mTexCoord,
- corners[2].mPosition, corners[2].mTexCoord);
- for(int t = 0; t < 4; t++){
- corners[t].mBinormal = baseVert.mBinormal;
- corners[t].mNormal = baseVert.mNormal;
- }
- mHasBinormals = TRUE;
-
- if (partial_build)
{
- mVertices.clear();
- }
+ VertexData corners[4];
+ VertexData baseVert;
+ for(S32 t = 0; t < 4; t++)
+ {
+ corners[t].getPosition().load3( mesh[offset + (grid_size*t)].mPos.mV);
+ corners[t].mTexCoord.mV[0] = profile[grid_size*t].mV[0]+0.5f;
+ corners[t].mTexCoord.mV[1] = 0.5f - profile[grid_size*t].mV[1];
+ }
- S32 vtop = mVertices.size();
- for(int gx = 0;gx<grid_size+1;gx++){
- for(int gy = 0;gy<grid_size+1;gy++){
- VertexData newVert;
- LerpPlanarVertex(
- corners[0],
- corners[1],
- corners[3],
- newVert,
- (F32)gx/(F32)grid_size,
- (F32)gy/(F32)grid_size);
- mVertices.push_back(newVert);
+ {
+ LLVector4a lhs;
+ lhs.setSub(corners[1].getPosition(), corners[0].getPosition());
+ LLVector4a rhs;
+ rhs.setSub(corners[2].getPosition(), corners[1].getPosition());
+ baseVert.getNormal().setCross3(lhs, rhs);
+ baseVert.getNormal().normalize3fast();
+ }
- if (gx == 0 && gy == 0)
- {
- min = max = newVert.mPosition;
- }
- else
+ if(!(mTypeMask & TOP_MASK))
+ {
+ baseVert.getNormal().mul(-1.0f);
+ }
+ else
+ {
+ //Swap the UVs on the U(X) axis for top face
+ LLVector2 swap;
+ swap = corners[0].mTexCoord;
+ corners[0].mTexCoord=corners[3].mTexCoord;
+ corners[3].mTexCoord=swap;
+ swap = corners[1].mTexCoord;
+ corners[1].mTexCoord=corners[2].mTexCoord;
+ corners[2].mTexCoord=swap;
+ }
+
+ LLVector4a binormal;
+
+ calc_binormal_from_triangle( binormal,
+ corners[0].getPosition(), corners[0].mTexCoord,
+ corners[1].getPosition(), corners[1].mTexCoord,
+ corners[2].getPosition(), corners[2].mTexCoord);
+
+ binormal.normalize3fast();
+
+ S32 size = (grid_size+1)*(grid_size+1);
+ resizeVertices(size);
+ allocateBinormals(size);
+
+ LLVector4a* pos = (LLVector4a*) mPositions;
+ LLVector4a* norm = (LLVector4a*) mNormals;
+ LLVector4a* binorm = (LLVector4a*) mBinormals;
+ LLVector2* tc = (LLVector2*) mTexCoords;
+
+ for(int gx = 0;gx<grid_size+1;gx++)
+ {
+ for(int gy = 0;gy<grid_size+1;gy++)
{
- update_min_max(min,max,newVert.mPosition);
+ VertexData newVert;
+ LerpPlanarVertex(
+ corners[0],
+ corners[1],
+ corners[3],
+ newVert,
+ (F32)gx/(F32)grid_size,
+ (F32)gy/(F32)grid_size);
+
+ *pos++ = newVert.getPosition();
+ *norm++ = baseVert.getNormal();
+ *tc++ = newVert.mTexCoord;
+ *binorm++ = binormal;
+
+ if (gx == 0 && gy == 0)
+ {
+ min = newVert.getPosition();
+ max = min;
+ }
+ else
+ {
+ min.setMin(min, newVert.getPosition());
+ max.setMax(max, newVert.getPosition());
+ }
}
}
- }
- mCenter = (min + max) * 0.5f;
+ mCenter->setAdd(min, max);
+ mCenter->mul(0.5f);
+ }
if (!partial_build)
{
-#if GEN_TRI_STRIP
- mTriStrip.clear();
-#endif
+ resizeIndices(grid_size*grid_size*6);
+
+ U16* out = mIndices;
+
S32 idxs[] = {0,1,(grid_size+1)+1,(grid_size+1)+1,(grid_size+1),0};
for(S32 gx = 0;gx<grid_size;gx++)
{
@@ -4539,61 +6483,18 @@ BOOL LLVolumeFace::createUnCutCubeCap(LLVolume* volume, BOOL partial_build)
{
for(S32 i=5;i>=0;i--)
{
- mIndices.push_back(vtop+(gy*(grid_size+1))+gx+idxs[i]);
- }
-
-#if GEN_TRI_STRIP
- if (gy == 0)
- {
- mTriStrip.push_back((gx+1)*(grid_size+1));
- mTriStrip.push_back((gx+1)*(grid_size+1));
- mTriStrip.push_back(gx*(grid_size+1));
- }
-
- mTriStrip.push_back(gy+1+(gx+1)*(grid_size+1));
- mTriStrip.push_back(gy+1+gx*(grid_size+1));
-
-
- if (gy == grid_size-1)
- {
- mTriStrip.push_back(gy+1+gx*(grid_size+1));
- }
-#endif
+ *out++ = ((gy*(grid_size+1))+gx+idxs[i]);
+ }
}
else
{
for(S32 i=0;i<6;i++)
{
- mIndices.push_back(vtop+(gy*(grid_size+1))+gx+idxs[i]);
- }
-
-#if GEN_TRI_STRIP
- if (gy == 0)
- {
- mTriStrip.push_back(gx*(grid_size+1));
- mTriStrip.push_back(gx*(grid_size+1));
- mTriStrip.push_back((gx+1)*(grid_size+1));
- }
-
- mTriStrip.push_back(gy+1+gx*(grid_size+1));
- mTriStrip.push_back(gy+1+(gx+1)*(grid_size+1));
-
- if (gy == grid_size-1)
- {
- mTriStrip.push_back(gy+1+(gx+1)*(grid_size+1));
+ *out++ = ((gy*(grid_size+1))+gx+idxs[i]);
}
-#endif
}
- }
-
- }
-
-#if GEN_TRI_STRIP
- if (mTriStrip.size()%2 == 1)
- {
- mTriStrip.push_back(mTriStrip[mTriStrip.size()-1]);
+ }
}
-#endif
}
return TRUE;
@@ -4623,17 +6524,31 @@ BOOL LLVolumeFace::createCap(LLVolume* volume, BOOL partial_build)
num_vertices = profile.size();
num_indices = (profile.size() - 2)*3;
- mVertices.resize(num_vertices);
+ if (!(mTypeMask & HOLLOW_MASK) && !(mTypeMask & OPEN_MASK))
+ {
+ resizeVertices(num_vertices+1);
+ allocateBinormals(num_vertices+1);
- if (!partial_build)
+ if (!partial_build)
+ {
+ resizeIndices(num_indices+3);
+ }
+ }
+ else
{
- mIndices.resize(num_indices);
+ resizeVertices(num_vertices);
+ allocateBinormals(num_vertices);
+
+ if (!partial_build)
+ {
+ resizeIndices(num_indices);
+ }
}
S32 max_s = volume->getProfile().getTotal();
S32 max_t = volume->getPath().mPath.size();
- mCenter.clearVec();
+ mCenter->clear();
S32 offset = 0;
if (mTypeMask & TOP_MASK)
@@ -4651,82 +6566,91 @@ BOOL LLVolumeFace::createCap(LLVolume* volume, BOOL partial_build)
LLVector2 cuv;
LLVector2 min_uv, max_uv;
- LLVector3& min = mExtents[0];
- LLVector3& max = mExtents[1];
+ LLVector4a& min = mExtents[0];
+ LLVector4a& max = mExtents[1];
+
+ LLVector2* tc = (LLVector2*) mTexCoords;
+ LLVector4a* pos = (LLVector4a*) mPositions;
+ LLVector4a* norm = (LLVector4a*) mNormals;
+ LLVector4a* binorm = (LLVector4a*) mBinormals;
// Copy the vertices into the array
for (S32 i = 0; i < num_vertices; i++)
{
if (mTypeMask & TOP_MASK)
{
- mVertices[i].mTexCoord.mV[0] = profile[i].mV[0]+0.5f;
- mVertices[i].mTexCoord.mV[1] = profile[i].mV[1]+0.5f;
+ tc[i].mV[0] = profile[i].mV[0]+0.5f;
+ tc[i].mV[1] = profile[i].mV[1]+0.5f;
}
else
{
// Mirror for underside.
- mVertices[i].mTexCoord.mV[0] = profile[i].mV[0]+0.5f;
- mVertices[i].mTexCoord.mV[1] = 0.5f - profile[i].mV[1];
+ tc[i].mV[0] = profile[i].mV[0]+0.5f;
+ tc[i].mV[1] = 0.5f - profile[i].mV[1];
}
- mVertices[i].mPosition = mesh[i + offset].mPos;
+ pos[i].load3(mesh[i + offset].mPos.mV);
if (i == 0)
{
- min = max = mVertices[i].mPosition;
- min_uv = max_uv = mVertices[i].mTexCoord;
+ max = pos[i];
+ min = max;
+ min_uv = max_uv = tc[i];
}
else
{
- update_min_max(min,max, mVertices[i].mPosition);
- update_min_max(min_uv, max_uv, mVertices[i].mTexCoord);
+ update_min_max(min,max,pos[i]);
+ update_min_max(min_uv, max_uv, tc[i]);
}
}
- mCenter = (min+max)*0.5f;
+ mCenter->setAdd(min, max);
+ mCenter->mul(0.5f);
+
cuv = (min_uv + max_uv)*0.5f;
- LLVector3 binormal = calc_binormal_from_triangle(
- mCenter, cuv,
- mVertices[0].mPosition, mVertices[0].mTexCoord,
- mVertices[1].mPosition, mVertices[1].mTexCoord);
- binormal.normVec();
+ LLVector4a binormal;
+ calc_binormal_from_triangle(binormal,
+ *mCenter, cuv,
+ pos[0], tc[0],
+ pos[1], tc[1]);
+ binormal.normalize3fast();
+
+ LLVector4a normal;
+ LLVector4a d0, d1;
+
- LLVector3 d0;
- LLVector3 d1;
- LLVector3 normal;
+ d0.setSub(*mCenter, pos[0]);
+ d1.setSub(*mCenter, pos[1]);
- d0 = mCenter-mVertices[0].mPosition;
- d1 = mCenter-mVertices[1].mPosition;
+ if (mTypeMask & TOP_MASK)
+ {
+ normal.setCross3(d0, d1);
+ }
+ else
+ {
+ normal.setCross3(d1, d0);
+ }
- normal = (mTypeMask & TOP_MASK) ? (d0%d1) : (d1%d0);
- normal.normVec();
+ normal.normalize3fast();
VertexData vd;
- vd.mPosition = mCenter;
- vd.mNormal = normal;
- vd.mBinormal = binormal;
+ vd.setPosition(*mCenter);
vd.mTexCoord = cuv;
if (!(mTypeMask & HOLLOW_MASK) && !(mTypeMask & OPEN_MASK))
{
- mVertices.push_back(vd);
+ pos[num_vertices] = *mCenter;
+ tc[num_vertices] = cuv;
num_vertices++;
- if (!partial_build)
- {
- vector_append(mIndices, 3);
- }
}
-
for (S32 i = 0; i < num_vertices; i++)
{
- mVertices[i].mBinormal = binormal;
- mVertices[i].mNormal = normal;
+ binorm[i].load4a(binormal.getF32ptr());
+ norm[i].load4a(normal.getF32ptr());
}
- mHasBinormals = TRUE;
-
if (partial_build)
{
return TRUE;
@@ -4834,8 +6758,6 @@ BOOL LLVolumeFace::createCap(LLVolume* volume, BOOL partial_build)
pt2--;
}
}
-
- makeTriStrip();
}
else
{
@@ -4940,8 +6862,6 @@ BOOL LLVolumeFace::createCap(LLVolume* volume, BOOL partial_build)
pt2--;
}
}
-
- makeTriStrip();
}
}
else
@@ -4963,131 +6883,277 @@ BOOL LLVolumeFace::createCap(LLVolume* volume, BOOL partial_build)
mIndices[3*i+v2] = i + 1;
}
-#if GEN_TRI_STRIP
- //make tri strip
- if (mTypeMask & OPEN_MASK)
- {
- makeTriStrip();
- }
- else
- {
- S32 j = num_vertices-2;
- if (mTypeMask & TOP_MASK)
- {
- mTriStrip.push_back(0);
- for (S32 i = 0; i <= j; ++i)
- {
- mTriStrip.push_back(i);
- if (i != j)
- {
- mTriStrip.push_back(j);
- }
- --j;
- }
- }
- else
- {
- mTriStrip.push_back(j);
- for (S32 i = 0; i <= j; ++i)
- {
- if (i != j)
- {
- mTriStrip.push_back(j);
- }
- mTriStrip.push_back(i);
- --j;
- }
- }
-
- mTriStrip.push_back(mTriStrip[mTriStrip.size()-1]);
- if (mTriStrip.size()%2 == 1)
- {
- mTriStrip.push_back(mTriStrip[mTriStrip.size()-1]);
- }
- }
-#endif
}
return TRUE;
}
-void LLVolumeFace::makeTriStrip()
+void LLVolumeFace::createBinormals()
{
-#if GEN_TRI_STRIP
- for (U32 i = 0; i < mIndices.size(); i+=3)
+ LLMemType m1(LLMemType::MTYPE_VOLUME);
+
+ if (!mBinormals)
{
- U16 i0 = mIndices[i];
- U16 i1 = mIndices[i+1];
- U16 i2 = mIndices[i+2];
+ allocateBinormals(mNumVertices);
- if ((i/3)%2 == 1)
- {
- mTriStrip.push_back(i0);
- mTriStrip.push_back(i0);
- mTriStrip.push_back(i1);
- mTriStrip.push_back(i2);
- mTriStrip.push_back(i2);
- }
- else
+ //generate binormals
+ LLVector4a* pos = mPositions;
+ LLVector2* tc = (LLVector2*) mTexCoords;
+ LLVector4a* binorm = (LLVector4a*) mBinormals;
+
+ LLVector4a* end = mBinormals+mNumVertices;
+ while (binorm < end)
{
- mTriStrip.push_back(i2);
- mTriStrip.push_back(i2);
- mTriStrip.push_back(i1);
- mTriStrip.push_back(i0);
- mTriStrip.push_back(i0);
+ (*binorm++).clear();
}
- }
- if (mTriStrip.size()%2 == 1)
- {
- mTriStrip.push_back(mTriStrip[mTriStrip.size()-1]);
- }
-#endif
-}
+ binorm = mBinormals;
-void LLVolumeFace::createBinormals()
-{
- LLMemType m1(LLMemType::MTYPE_VOLUME);
-
- if (!mHasBinormals)
- {
- //generate binormals
- for (U32 i = 0; i < mIndices.size()/3; i++)
+ for (U32 i = 0; i < mNumIndices/3; i++)
{ //for each triangle
- const VertexData& v0 = mVertices[mIndices[i*3+0]];
- const VertexData& v1 = mVertices[mIndices[i*3+1]];
- const VertexData& v2 = mVertices[mIndices[i*3+2]];
+ const U16& i0 = mIndices[i*3+0];
+ const U16& i1 = mIndices[i*3+1];
+ const U16& i2 = mIndices[i*3+2];
//calculate binormal
- LLVector3 binorm = calc_binormal_from_triangle(v0.mPosition, v0.mTexCoord,
- v1.mPosition, v1.mTexCoord,
- v2.mPosition, v2.mTexCoord);
+ LLVector4a binormal;
+ calc_binormal_from_triangle(binormal,
+ pos[i0], tc[i0],
+ pos[i1], tc[i1],
+ pos[i2], tc[i2]);
- for (U32 j = 0; j < 3; j++)
- { //add triangle normal to vertices
- mVertices[mIndices[i*3+j]].mBinormal += binorm; // * (weight_sum - d[j])/weight_sum;
- }
+
+ //add triangle normal to vertices
+ binorm[i0].add(binormal);
+ binorm[i1].add(binormal);
+ binorm[i2].add(binormal);
//even out quad contributions
if (i % 2 == 0)
{
- mVertices[mIndices[i*3+2]].mBinormal += binorm;
+ binorm[i2].add(binormal);
}
else
{
- mVertices[mIndices[i*3+1]].mBinormal += binorm;
+ binorm[i1].add(binormal);
}
}
//normalize binormals
- for (U32 i = 0; i < mVertices.size(); i++)
+ for (U32 i = 0; i < mNumVertices; i++)
{
- mVertices[i].mBinormal.normVec();
- mVertices[i].mNormal.normVec();
+ binorm[i].normalize3fast();
+ //bump map/planar projection code requires normals to be normalized
+ mNormals[i].normalize3fast();
}
+ }
+}
+
+void LLVolumeFace::resizeVertices(S32 num_verts)
+{
+ ll_aligned_free_16(mPositions);
+ ll_aligned_free_16(mNormals);
+ ll_aligned_free_16(mBinormals);
+ ll_aligned_free_16(mTexCoords);
+
+ mBinormals = NULL;
+
+ if (num_verts)
+ {
+ mPositions = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts);
+ assert_aligned(mPositions, 16);
+ mNormals = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts);
+ assert_aligned(mNormals, 16);
+
+ //pad texture coordinate block end to allow for QWORD reads
+ S32 size = ((num_verts*sizeof(LLVector2)) + 0xF) & ~0xF;
+ mTexCoords = (LLVector2*) ll_aligned_malloc_16(size);
+ assert_aligned(mTexCoords, 16);
+ }
+ else
+ {
+ mPositions = NULL;
+ mNormals = NULL;
+ mTexCoords = NULL;
+ }
+
+ mNumVertices = num_verts;
+}
+
+void LLVolumeFace::pushVertex(const LLVolumeFace::VertexData& cv)
+{
+ pushVertex(cv.getPosition(), cv.getNormal(), cv.mTexCoord);
+}
- mHasBinormals = TRUE;
+void LLVolumeFace::pushVertex(const LLVector4a& pos, const LLVector4a& norm, const LLVector2& tc)
+{
+ S32 new_verts = mNumVertices+1;
+ S32 new_size = new_verts*16;
+// S32 old_size = mNumVertices*16;
+
+ //positions
+ mPositions = (LLVector4a*) realloc(mPositions, new_size);
+
+ //normals
+ mNormals = (LLVector4a*) realloc(mNormals, new_size);
+
+ //tex coords
+ new_size = ((new_verts*8)+0xF) & ~0xF;
+ mTexCoords = (LLVector2*) realloc(mTexCoords, new_size);
+
+
+ //just clear binormals
+ ll_aligned_free_16(mBinormals);
+ mBinormals = NULL;
+
+ mPositions[mNumVertices] = pos;
+ mNormals[mNumVertices] = norm;
+ mTexCoords[mNumVertices] = tc;
+
+ mNumVertices++;
+}
+
+void LLVolumeFace::allocateBinormals(S32 num_verts)
+{
+ ll_aligned_free_16(mBinormals);
+ mBinormals = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts);
+}
+
+void LLVolumeFace::allocateWeights(S32 num_verts)
+{
+ ll_aligned_free_16(mWeights);
+ mWeights = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts);
+}
+
+void LLVolumeFace::resizeIndices(S32 num_indices)
+{
+ ll_aligned_free_16(mIndices);
+
+ if (num_indices)
+ {
+ //pad index block end to allow for QWORD reads
+ S32 size = ((num_indices*sizeof(U16)) + 0xF) & ~0xF;
+
+ mIndices = (U16*) ll_aligned_malloc_16(size);
+ }
+ else
+ {
+ mIndices = NULL;
+ }
+
+ mNumIndices = num_indices;
+}
+
+void LLVolumeFace::pushIndex(const U16& idx)
+{
+ S32 new_count = mNumIndices + 1;
+ S32 new_size = ((new_count*2)+0xF) & ~0xF;
+
+ S32 old_size = ((mNumIndices*2)+0xF) & ~0xF;
+ if (new_size != old_size)
+ {
+ mIndices = (U16*) realloc(mIndices, new_size);
+ }
+
+ mIndices[mNumIndices++] = idx;
+}
+
+void LLVolumeFace::fillFromLegacyData(std::vector<LLVolumeFace::VertexData>& v, std::vector<U16>& idx)
+{
+ resizeVertices(v.size());
+ resizeIndices(idx.size());
+
+ for (U32 i = 0; i < v.size(); ++i)
+ {
+ mPositions[i] = v[i].getPosition();
+ mNormals[i] = v[i].getNormal();
+ mTexCoords[i] = v[i].mTexCoord;
+ }
+
+ for (U32 i = 0; i < idx.size(); ++i)
+ {
+ mIndices[i] = idx[i];
+ }
+}
+
+void LLVolumeFace::appendFace(const LLVolumeFace& face, LLMatrix4& mat_in, LLMatrix4& norm_mat_in)
+{
+ U16 offset = mNumVertices;
+
+ S32 new_count = face.mNumVertices + mNumVertices;
+
+ if (new_count > 65536)
+ {
+ llerrs << "Cannot append face -- 16-bit overflow will occur." << llendl;
+ }
+
+ if (face.mNumVertices == 0)
+ {
+ llerrs << "Cannot append empty face." << llendl;
+ }
+
+ //allocate new buffer space
+ mPositions = (LLVector4a*) realloc(mPositions, new_count*sizeof(LLVector4a));
+ assert_aligned(mPositions, 16);
+ mNormals = (LLVector4a*) realloc(mNormals, new_count*sizeof(LLVector4a));
+ assert_aligned(mNormals, 16);
+ mTexCoords = (LLVector2*) realloc(mTexCoords, (new_count*sizeof(LLVector2)+0xF) & ~0xF);
+ assert_aligned(mTexCoords, 16);
+
+ mNumVertices = new_count;
+
+ //get destination address of appended face
+ LLVector4a* dst_pos = mPositions+offset;
+ LLVector2* dst_tc = mTexCoords+offset;
+ LLVector4a* dst_norm = mNormals+offset;
+
+ //get source addresses of appended face
+ const LLVector4a* src_pos = face.mPositions;
+ const LLVector2* src_tc = face.mTexCoords;
+ const LLVector4a* src_norm = face.mNormals;
+
+ //load aligned matrices
+ LLMatrix4a mat, norm_mat;
+ mat.loadu(mat_in);
+ norm_mat.loadu(norm_mat_in);
+
+ for (U32 i = 0; i < face.mNumVertices; ++i)
+ {
+ //transform appended face position and store
+ mat.affineTransform(src_pos[i], dst_pos[i]);
+
+ //transform appended face normal and store
+ norm_mat.rotate(src_norm[i], dst_norm[i]);
+ dst_norm[i].normalize3fast();
+
+ //copy appended face texture coordinate
+ dst_tc[i] = src_tc[i];
+
+ if (offset == 0 && i == 0)
+ { //initialize bounding box
+ mExtents[0] = mExtents[1] = dst_pos[i];
+ }
+ else
+ {
+ //stretch bounding box
+ update_min_max(mExtents[0], mExtents[1], dst_pos[i]);
+ }
+ }
+
+
+ new_count = mNumIndices + face.mNumIndices;
+
+ //allocate new index buffer
+ mIndices = (U16*) realloc(mIndices, (new_count*sizeof(U16)+0xF) & ~0xF);
+
+ //get destination address into new index buffer
+ U16* dst_idx = mIndices+mNumIndices;
+ mNumIndices = new_count;
+
+ for (U32 i = 0; i < face.mNumIndices; ++i)
+ { //copy indices, offsetting by old vertex count
+ dst_idx[i] = face.mIndices[i]+offset;
}
}
@@ -5117,18 +7183,20 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build)
num_vertices = mNumS*mNumT;
num_indices = (mNumS-1)*(mNumT-1)*6;
- mVertices.resize(num_vertices);
-
if (!partial_build)
{
- mIndices.resize(num_indices);
- mEdge.resize(num_indices);
- }
- else
- {
- mHasBinormals = FALSE;
+ resizeVertices(num_vertices);
+ resizeIndices(num_indices);
+
+ if (!volume->isMeshAssetLoaded())
+ {
+ mEdge.resize(num_indices);
+ }
}
+ LLVector4a* pos = (LLVector4a*) mPositions;
+ LLVector4a* norm = (LLVector4a*) mNormals;
+ LLVector2* tc = (LLVector2*) mTexCoords;
S32 begin_stex = llfloor( profile[mBeginS].mV[2] );
S32 num_s = ((mTypeMask & INNER_MASK) && (mTypeMask & FLAT_MASK) && mNumS > 2) ? mNumS/2 : mNumS;
@@ -5179,21 +7247,20 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build)
i = mBeginS + s + max_s*t;
}
- mVertices[cur_vertex].mPosition = mesh[i].mPos;
- mVertices[cur_vertex].mTexCoord = LLVector2(ss,tt);
+ pos[cur_vertex].load3(mesh[i].mPos.mV);
+ tc[cur_vertex] = LLVector2(ss,tt);
- mVertices[cur_vertex].mNormal = LLVector3(0,0,0);
- mVertices[cur_vertex].mBinormal = LLVector3(0,0,0);
-
+ norm[cur_vertex].clear();
cur_vertex++;
if ((mTypeMask & INNER_MASK) && (mTypeMask & FLAT_MASK) && mNumS > 2 && s > 0)
{
- mVertices[cur_vertex].mPosition = mesh[i].mPos;
- mVertices[cur_vertex].mTexCoord = LLVector2(ss,tt);
+
+ pos[cur_vertex].load3(mesh[i].mPos.mV);
+ tc[cur_vertex] = LLVector2(ss,tt);
- mVertices[cur_vertex].mNormal = LLVector3(0,0,0);
- mVertices[cur_vertex].mBinormal = LLVector3(0,0,0);
+ norm[cur_vertex].clear();
+
cur_vertex++;
}
}
@@ -5211,29 +7278,29 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build)
i = mBeginS + s + max_s*t;
ss = profile[mBeginS + s].mV[2] - begin_stex;
- mVertices[cur_vertex].mPosition = mesh[i].mPos;
- mVertices[cur_vertex].mTexCoord = LLVector2(ss,tt);
-
- mVertices[cur_vertex].mNormal = LLVector3(0,0,0);
- mVertices[cur_vertex].mBinormal = LLVector3(0,0,0);
-
+ pos[cur_vertex].load3(mesh[i].mPos.mV);
+ tc[cur_vertex] = LLVector2(ss,tt);
+ norm[cur_vertex].clear();
+
cur_vertex++;
}
}
//get bounding box for this side
- LLVector3& face_min = mExtents[0];
- LLVector3& face_max = mExtents[1];
- mCenter.clearVec();
+ LLVector4a& face_min = mExtents[0];
+ LLVector4a& face_max = mExtents[1];
+ mCenter->clear();
+
+ face_min = face_max = pos[0];
- face_min = face_max = mVertices[0].mPosition;
- for (U32 i = 1; i < mVertices.size(); ++i)
+ for (U32 i = 1; i < mNumVertices; ++i)
{
- update_min_max(face_min, face_max, mVertices[i].mPosition);
+ update_min_max(face_min, face_max, pos[i]);
}
- mCenter = (face_min + face_max) * 0.5f;
+ mCenter->setAdd(face_min, face_max);
+ mCenter->mul(0.5f);
S32 cur_index = 0;
S32 cur_edge = 0;
@@ -5241,18 +7308,9 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build)
if (!partial_build)
{
-#if GEN_TRI_STRIP
- mTriStrip.clear();
-#endif
-
// Now we generate the indices.
for (t = 0; t < (mNumT-1); t++)
{
-#if GEN_TRI_STRIP
- //prepend terminating index to strip
- mTriStrip.push_back(mNumS*t);
-#endif
-
for (s = 0; s < (mNumS-1); s++)
{
mIndices[cur_index++] = s + mNumS*t; //bottom left
@@ -5262,16 +7320,6 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build)
mIndices[cur_index++] = s+1 + mNumS*t; //bottom right
mIndices[cur_index++] = s+1 + mNumS*(t+1); //top right
-#if GEN_TRI_STRIP
- if (s == 0)
- {
- mTriStrip.push_back(s+mNumS*t);
- mTriStrip.push_back(s+mNumS*(t+1));
- }
- mTriStrip.push_back(s+1+mNumS*t);
- mTriStrip.push_back(s+1+mNumS*(t+1));
-#endif
-
mEdge[cur_edge++] = (mNumS-1)*2*t+s*2+1; //bottom left/top right neighbor face
if (t < mNumT-2) { //top right/top left neighbor face
mEdge[cur_edge++] = (mNumS-1)*2*(t+1)+s*2+1;
@@ -5312,52 +7360,61 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build)
}
mEdge[cur_edge++] = (mNumS-1)*2*t+s*2; //top right/bottom left neighbor face
}
-#if GEN_TRI_STRIP
- //append terminating vertex to strip
- mTriStrip.push_back(mNumS-1+mNumS*(t+1));
-#endif
}
+ }
-#if GEN_TRI_STRIP
- if (mTriStrip.size()%2 == 1)
- {
- mTriStrip.push_back(mTriStrip[mTriStrip.size()-1]);
- }
-#endif
+ //clear normals
+ for (U32 i = 0; i < mNumVertices; i++)
+ {
+ mNormals[i].clear();
}
//generate normals
- for (U32 i = 0; i < mIndices.size()/3; i++) //for each triangle
+ for (U32 i = 0; i < mNumIndices/3; i++) //for each triangle
{
const U16* idx = &(mIndices[i*3]);
-
- VertexData* v[] =
- { &mVertices[idx[0]], &mVertices[idx[1]], &mVertices[idx[2]] };
-
- //calculate triangle normal
- LLVector3 norm = (v[0]->mPosition-v[1]->mPosition) % (v[0]->mPosition-v[2]->mPosition);
+
- v[0]->mNormal += norm;
- v[1]->mNormal += norm;
- v[2]->mNormal += norm;
+ LLVector4a* v[] =
+ { pos+idx[0], pos+idx[1], pos+idx[2] };
+
+ LLVector4a* n[] =
+ { norm+idx[0], norm+idx[1], norm+idx[2] };
+
+ //calculate triangle normal
+ LLVector4a a, b, c;
+
+ a.setSub(*v[0], *v[1]);
+ b.setSub(*v[0], *v[2]);
+ c.setCross3(a,b);
+ n[0]->add(c);
+ n[1]->add(c);
+ n[2]->add(c);
+
//even out quad contributions
- v[i%2+1]->mNormal += norm;
+ n[i%2+1]->add(c);
}
// adjust normals based on wrapping and stitching
- BOOL s_bottom_converges = ((mVertices[0].mPosition - mVertices[mNumS*(mNumT-2)].mPosition).magVecSquared() < 0.000001f);
- BOOL s_top_converges = ((mVertices[mNumS-1].mPosition - mVertices[mNumS*(mNumT-2)+mNumS-1].mPosition).magVecSquared() < 0.000001f);
+ LLVector4a top;
+ top.setSub(pos[0], pos[mNumS*(mNumT-2)]);
+ BOOL s_bottom_converges = (top.dot3(top) < 0.000001f);
+
+ top.setSub(pos[mNumS-1], pos[mNumS*(mNumT-2)+mNumS-1]);
+ BOOL s_top_converges = (top.dot3(top) < 0.000001f);
+
if (sculpt_stitching == LL_SCULPT_TYPE_NONE) // logic for non-sculpt volumes
{
if (volume->getPath().isOpen() == FALSE)
{ //wrap normals on T
for (S32 i = 0; i < mNumS; i++)
{
- LLVector3 norm = mVertices[i].mNormal + mVertices[mNumS*(mNumT-1)+i].mNormal;
- mVertices[i].mNormal = norm;
- mVertices[mNumS*(mNumT-1)+i].mNormal = norm;
+ LLVector4a n;
+ n.setAdd(norm[i], norm[mNumS*(mNumT-1)+i]);
+ norm[i] = n;
+ norm[mNumS*(mNumT-1)+i] = n;
}
}
@@ -5365,9 +7422,10 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build)
{ //wrap normals on S
for (S32 i = 0; i < mNumT; i++)
{
- LLVector3 norm = mVertices[mNumS*i].mNormal + mVertices[mNumS*i+mNumS-1].mNormal;
- mVertices[mNumS * i].mNormal = norm;
- mVertices[mNumS * i+mNumS-1].mNormal = norm;
+ LLVector4a n;
+ n.setAdd(norm[mNumS*i], norm[mNumS*i+mNumS-1]);
+ norm[mNumS * i] = n;
+ norm[mNumS * i+mNumS-1] = n;
}
}
@@ -5378,7 +7436,7 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build)
{ //all lower S have same normal
for (S32 i = 0; i < mNumT; i++)
{
- mVertices[mNumS*i].mNormal = LLVector3(1,0,0);
+ norm[mNumS*i].set(1,0,0);
}
}
@@ -5386,12 +7444,11 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build)
{ //all upper S have same normal
for (S32 i = 0; i < mNumT; i++)
{
- mVertices[mNumS*i+mNumS-1].mNormal = LLVector3(-1,0,0);
+ norm[mNumS*i+mNumS-1].set(-1,0,0);
}
}
}
}
-
else // logic for sculpt volumes
{
BOOL average_poles = FALSE;
@@ -5414,30 +7471,33 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build)
{
// average normals for north pole
- LLVector3 average(0.0, 0.0, 0.0);
+ LLVector4a average;
+ average.clear();
+
for (S32 i = 0; i < mNumS; i++)
{
- average += mVertices[i].mNormal;
+ average.add(norm[i]);
}
// set average
for (S32 i = 0; i < mNumS; i++)
{
- mVertices[i].mNormal = average;
+ norm[i] = average;
}
// average normals for south pole
- average = LLVector3(0.0, 0.0, 0.0);
+ average.clear();
+
for (S32 i = 0; i < mNumS; i++)
{
- average += mVertices[i + mNumS * (mNumT - 1)].mNormal;
+ average.add(norm[i + mNumS * (mNumT - 1)]);
}
// set average
for (S32 i = 0; i < mNumS; i++)
{
- mVertices[i + mNumS * (mNumT - 1)].mNormal = average;
+ norm[i + mNumS * (mNumT - 1)] = average;
}
}
@@ -5447,23 +7507,22 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build)
{
for (S32 i = 0; i < mNumT; i++)
{
- LLVector3 norm = mVertices[mNumS*i].mNormal + mVertices[mNumS*i+mNumS-1].mNormal;
- mVertices[mNumS * i].mNormal = norm;
- mVertices[mNumS * i+mNumS-1].mNormal = norm;
+ LLVector4a n;
+ n.setAdd(norm[mNumS*i], norm[mNumS*i+mNumS-1]);
+ norm[mNumS * i] = n;
+ norm[mNumS * i+mNumS-1] = n;
}
}
-
-
if (wrap_t)
{
for (S32 i = 0; i < mNumS; i++)
{
- LLVector3 norm = mVertices[i].mNormal + mVertices[mNumS*(mNumT-1)+i].mNormal;
- mVertices[i].mNormal = norm;
- mVertices[mNumS*(mNumT-1)+i].mNormal = norm;
+ LLVector4a n;
+ n.setAdd(norm[i], norm[mNumS*(mNumT-1)+i]);
+ norm[i] = n;
+ norm[mNumS*(mNumT-1)+i] = n;
}
-
}
}
@@ -5473,41 +7532,51 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build)
// Finds binormal based on three vertices with texture coordinates.
// Fills in dummy values if the triangle has degenerate texture coordinates.
-LLVector3 calc_binormal_from_triangle(
- const LLVector3& pos0,
+void calc_binormal_from_triangle(LLVector4a& binormal,
+
+ const LLVector4a& pos0,
const LLVector2& tex0,
- const LLVector3& pos1,
+ const LLVector4a& pos1,
const LLVector2& tex1,
- const LLVector3& pos2,
+ const LLVector4a& pos2,
const LLVector2& tex2)
{
- LLVector3 rx0( pos0.mV[VX], tex0.mV[VX], tex0.mV[VY] );
- LLVector3 rx1( pos1.mV[VX], tex1.mV[VX], tex1.mV[VY] );
- LLVector3 rx2( pos2.mV[VX], tex2.mV[VX], tex2.mV[VY] );
+ LLVector4a rx0( pos0[VX], tex0.mV[VX], tex0.mV[VY] );
+ LLVector4a rx1( pos1[VX], tex1.mV[VX], tex1.mV[VY] );
+ LLVector4a rx2( pos2[VX], tex2.mV[VX], tex2.mV[VY] );
- LLVector3 ry0( pos0.mV[VY], tex0.mV[VX], tex0.mV[VY] );
- LLVector3 ry1( pos1.mV[VY], tex1.mV[VX], tex1.mV[VY] );
- LLVector3 ry2( pos2.mV[VY], tex2.mV[VX], tex2.mV[VY] );
+ LLVector4a ry0( pos0[VY], tex0.mV[VX], tex0.mV[VY] );
+ LLVector4a ry1( pos1[VY], tex1.mV[VX], tex1.mV[VY] );
+ LLVector4a ry2( pos2[VY], tex2.mV[VX], tex2.mV[VY] );
- LLVector3 rz0( pos0.mV[VZ], tex0.mV[VX], tex0.mV[VY] );
- LLVector3 rz1( pos1.mV[VZ], tex1.mV[VX], tex1.mV[VY] );
- LLVector3 rz2( pos2.mV[VZ], tex2.mV[VX], tex2.mV[VY] );
+ LLVector4a rz0( pos0[VZ], tex0.mV[VX], tex0.mV[VY] );
+ LLVector4a rz1( pos1[VZ], tex1.mV[VX], tex1.mV[VY] );
+ LLVector4a rz2( pos2[VZ], tex2.mV[VX], tex2.mV[VY] );
- LLVector3 r0 = (rx0 - rx1) % (rx0 - rx2);
- LLVector3 r1 = (ry0 - ry1) % (ry0 - ry2);
- LLVector3 r2 = (rz0 - rz1) % (rz0 - rz2);
+ LLVector4a lhs, rhs;
+
+ LLVector4a r0;
+ lhs.setSub(rx0, rx1); rhs.setSub(rx0, rx2);
+ r0.setCross3(lhs, rhs);
+
+ LLVector4a r1;
+ lhs.setSub(ry0, ry1); rhs.setSub(ry0, ry2);
+ r1.setCross3(lhs, rhs);
+
+ LLVector4a r2;
+ lhs.setSub(rz0, rz1); rhs.setSub(rz0, rz2);
+ r2.setCross3(lhs, rhs);
- if( r0.mV[VX] && r1.mV[VX] && r2.mV[VX] )
+ if( r0[VX] && r1[VX] && r2[VX] )
{
- LLVector3 binormal(
- -r0.mV[VZ] / r0.mV[VX],
- -r1.mV[VZ] / r1.mV[VX],
- -r2.mV[VZ] / r2.mV[VX]);
+ binormal.set(
+ -r0[VZ] / r0[VX],
+ -r1[VZ] / r1[VX],
+ -r2[VZ] / r2[VX]);
// binormal.normVec();
- return binormal;
}
else
{
- return LLVector3( 0, 1 , 0 );
+ binormal.set( 0, 1 , 0 );
}
}
diff --git a/indra/llmath/llvolume.h b/indra/llmath/llvolume.h
index d48a79ee46..76cf9de613 100644
--- a/indra/llmath/llvolume.h
+++ b/indra/llmath/llvolume.h
@@ -34,8 +34,13 @@ class LLPathParams;
class LLVolumeParams;
class LLProfile;
class LLPath;
+
+template <class T> class LLOctreeNode;
+
+class LLVector4a;
class LLVolumeFace;
class LLVolume;
+class LLVolumeTriangle;
#include "lldarray.h"
#include "lluuid.h"
@@ -43,6 +48,8 @@ class LLVolume;
//#include "vmath.h"
#include "v2math.h"
#include "v3math.h"
+#include "v3dmath.h"
+#include "v4math.h"
#include "llquaternion.h"
#include "llstrider.h"
#include "v4coloru.h"
@@ -177,12 +184,14 @@ const U8 LL_SCULPT_TYPE_SPHERE = 1;
const U8 LL_SCULPT_TYPE_TORUS = 2;
const U8 LL_SCULPT_TYPE_PLANE = 3;
const U8 LL_SCULPT_TYPE_CYLINDER = 4;
-
-const U8 LL_SCULPT_TYPE_MASK = LL_SCULPT_TYPE_SPHERE | LL_SCULPT_TYPE_TORUS | LL_SCULPT_TYPE_PLANE | LL_SCULPT_TYPE_CYLINDER;
+const U8 LL_SCULPT_TYPE_MESH = 5;
+const U8 LL_SCULPT_TYPE_MASK = LL_SCULPT_TYPE_SPHERE | LL_SCULPT_TYPE_TORUS | LL_SCULPT_TYPE_PLANE |
+ LL_SCULPT_TYPE_CYLINDER | LL_SCULPT_TYPE_MESH;
const U8 LL_SCULPT_FLAG_INVERT = 64;
const U8 LL_SCULPT_FLAG_MIRROR = 128;
+const S32 LL_SCULPT_MESH_MAX_FACES = 8;
class LLProfileParams
{
@@ -569,6 +578,9 @@ public:
BOOL importLegacyStream(std::istream& input_stream);
BOOL exportLegacyStream(std::ostream& output_stream) const;
+ LLSD sculptAsLLSD() const;
+ bool sculptFromLLSD(LLSD& sd);
+
LLSD asLLSD() const;
operator LLSD() const { return asLLSD(); }
bool fromLLSD(LLSD& sd);
@@ -628,7 +640,8 @@ public:
const F32& getSkew() const { return mPathParams.getSkew(); }
const LLUUID& getSculptID() const { return mSculptID; }
const U8& getSculptType() const { return mSculptType; }
-
+ bool isSculpt() const;
+ bool isMeshSculpt() const;
BOOL isConvex() const;
// 'begin' and 'end' should be in range [0, 1] (they will be clamped)
@@ -677,6 +690,9 @@ public:
BOOL isFlat(S32 face) const { return (mFaces[face].mCount == 2); }
BOOL isOpen() const { return mOpen; }
void setDirty() { mDirty = TRUE; }
+
+ static S32 getNumPoints(const LLProfileParams& params, BOOL path_open, F32 detail = 1.0f, S32 split = 0,
+ BOOL is_sculpted = FALSE, S32 sculpt_size = 0);
BOOL generate(const LLProfileParams& params, BOOL path_open, F32 detail = 1.0f, S32 split = 0,
BOOL is_sculpted = FALSE, S32 sculpt_size = 0);
BOOL isConcave() const { return mConcave; }
@@ -701,6 +717,7 @@ public:
protected:
void genNormals(const LLProfileParams& params);
+ static S32 getNumNGonPoints(const LLProfileParams& params, S32 sides, F32 offset=0.0f, F32 bevel = 0.0f, F32 ang_scale = 1.f, S32 split = 0);
void genNGon(const LLProfileParams& params, S32 sides, F32 offset=0.0f, F32 bevel = 0.0f, F32 ang_scale = 1.f, S32 split = 0);
Face* addHole(const LLProfileParams& params, BOOL flat, F32 sides, F32 offset, F32 box_hollow, F32 ang_scale, S32 split = 0);
@@ -743,6 +760,9 @@ public:
virtual ~LLPath();
+ static S32 getNumPoints(const LLPathParams& params, F32 detail);
+ static S32 getNumNGonPoints(const LLPathParams& params, S32 sides, F32 offset=0.0f, F32 end_scale = 1.f, F32 twist_scale = 1.f);
+
void genNGon(const LLPathParams& params, S32 sides, F32 offset=0.0f, F32 end_scale = 1.f, F32 twist_scale = 1.f);
virtual BOOL generate(const LLPathParams& params, F32 detail=1.0f, S32 split = 0,
BOOL is_sculpted = FALSE, S32 sculpt_size = 0);
@@ -779,30 +799,88 @@ public:
class LLVolumeFace
{
public:
- LLVolumeFace() :
- mID(0),
- mTypeMask(0),
- mHasBinormals(FALSE),
- mBeginS(0),
- mBeginT(0),
- mNumS(0),
- mNumT(0)
+ class VertexData
{
- }
+ enum
+ {
+ POSITION = 0,
+ NORMAL = 1
+ };
+
+ private:
+ void init();
+ public:
+ VertexData();
+ VertexData(const VertexData& rhs);
+ const VertexData& operator=(const VertexData& rhs);
+
+ ~VertexData();
+ LLVector4a& getPosition();
+ LLVector4a& getNormal();
+ const LLVector4a& getPosition() const;
+ const LLVector4a& getNormal() const;
+ void setPosition(const LLVector4a& pos);
+ void setNormal(const LLVector4a& norm);
+
+
+ LLVector2 mTexCoord;
+
+ bool operator<(const VertexData& rhs) const;
+ bool operator==(const VertexData& rhs) const;
+ bool compareNormal(const VertexData& rhs, F32 angle_cutoff) const;
+
+ private:
+ LLVector4a* mData;
+ };
+
+ LLVolumeFace();
+ LLVolumeFace(const LLVolumeFace& src);
+ LLVolumeFace& operator=(const LLVolumeFace& rhs);
+
+ ~LLVolumeFace();
+private:
+ void freeData();
+public:
BOOL create(LLVolume* volume, BOOL partial_build = FALSE);
void createBinormals();
- void makeTriStrip();
- class VertexData
+ void appendFace(const LLVolumeFace& face, LLMatrix4& transform, LLMatrix4& normal_tranform);
+
+ void resizeVertices(S32 num_verts);
+ void allocateBinormals(S32 num_verts);
+ void allocateWeights(S32 num_verts);
+ void resizeIndices(S32 num_indices);
+ void fillFromLegacyData(std::vector<LLVolumeFace::VertexData>& v, std::vector<U16>& idx);
+
+ void pushVertex(const VertexData& cv);
+ void pushVertex(const LLVector4a& pos, const LLVector4a& norm, const LLVector2& tc);
+ void pushIndex(const U16& idx);
+
+ void swapData(LLVolumeFace& rhs);
+
+ void getVertexData(U16 indx, LLVolumeFace::VertexData& cv);
+
+ class VertexMapData : public LLVolumeFace::VertexData
{
public:
- LLVector3 mPosition;
- LLVector3 mNormal;
- LLVector3 mBinormal;
- LLVector2 mTexCoord;
+ U16 mIndex;
+
+ bool operator==(const LLVolumeFace::VertexData& rhs) const;
+
+ struct ComparePosition
+ {
+ bool operator()(const LLVector3& a, const LLVector3& b) const;
+ };
+
+ typedef std::map<LLVector3, std::vector<VertexMapData>, VertexMapData::ComparePosition > PointMap;
};
+ void optimize(F32 angle_cutoff = 2.f);
+ void cacheOptimize();
+
+ void createOctree(F32 scaler = 0.25f, const LLVector4a& center = LLVector4a(0,0,0), const LLVector4a& size = LLVector4a(0.5f,0.5f,0.5f));
+
enum
{
SINGLE_MASK = 0x0001,
@@ -821,22 +899,35 @@ public:
public:
S32 mID;
U32 mTypeMask;
- LLVector3 mCenter;
- BOOL mHasBinormals;
-
+
// Only used for INNER/OUTER faces
S32 mBeginS;
S32 mBeginT;
S32 mNumS;
S32 mNumT;
- LLVector3 mExtents[2]; //minimum and maximum point of face
+ LLVector4a* mExtents; //minimum and maximum point of face
+ LLVector4a* mCenter;
+ LLVector2 mTexCoordExtents[2]; //minimum and maximum of texture coordinates of the face.
+
+ S32 mNumVertices;
+ S32 mNumIndices;
+
+ LLVector4a* mPositions;
+ LLVector4a* mNormals;
+ LLVector4a* mBinormals;
+ LLVector2* mTexCoords;
+ U16* mIndices;
- std::vector<VertexData> mVertices;
- std::vector<U16> mIndices;
- std::vector<U16> mTriStrip;
std::vector<S32> mEdge;
+ //list of skin weights for rigged volumes
+ // format is mWeights[vertex_index].mV[influence] = <joint_index>.<weight>
+ // mWeights.size() should be empty or match mVertices.size()
+ LLVector4a* mWeights;
+
+ LLOctreeNode<LLVolumeTriangle>* mOctree;
+
private:
BOOL createUnCutCubeCap(LLVolume* volume, BOOL partial_build = FALSE);
BOOL createCap(LLVolume* volume, BOOL partial_build = FALSE);
@@ -847,8 +938,7 @@ class LLVolume : public LLRefCount
{
friend class LLVolumeLODGroup;
-private:
- LLVolume(const LLVolume&); // Don't implement
+protected:
~LLVolume(); // use unref
public:
@@ -870,9 +960,10 @@ public:
U8 getProfileType() const { return mParams.getProfileParams().getCurveType(); }
U8 getPathType() const { return mParams.getPathParams().getCurveType(); }
- S32 getNumFaces() const { return (S32)mProfilep->mFaces.size(); }
+ S32 getNumFaces() const;
S32 getNumVolumeFaces() const { return mVolumeFaces.size(); }
F32 getDetail() const { return mDetail; }
+ F32 getSurfaceArea() const { return mSurfaceArea; }
const LLVolumeParams& getParams() const { return mParams; }
LLVolumeParams getCopyOfParams() const { return mParams; }
const LLProfile& getProfile() const { return *mProfilep; }
@@ -892,15 +983,18 @@ public:
BOOL isUnique() const { return mUnique; }
S32 getSculptLevel() const { return mSculptLevel; }
-
+ void setSculptLevel(S32 level) { mSculptLevel = level; }
+
S32 *getTriangleIndices(U32 &num_indices) const;
// returns number of triangle indeces required for path/profile mesh
S32 getNumTriangleIndices() const;
+ static void getLoDTriangleCounts(const LLVolumeParams& params, S32* counts);
+
+ S32 getNumTriangles(S32* vcount = NULL) const;
void generateSilhouetteVertices(std::vector<LLVector3> &vertices,
std::vector<LLVector3> &normals,
- std::vector<S32> &segments,
const LLVector3& view_vec,
const LLMatrix4& mat,
const LLMatrix3& norm_mat,
@@ -916,6 +1010,13 @@ public:
LLVector3* normal = NULL, // return the surface normal at the intersection point
LLVector3* bi_normal = NULL // return the surface bi-normal at the intersection point
);
+
+ S32 lineSegmentIntersect(const LLVector4a& start, const LLVector4a& end,
+ S32 face = 1,
+ LLVector3* intersection = NULL,
+ LLVector2* tex_coord = NULL,
+ LLVector3* normal = NULL,
+ LLVector3* bi_normal = NULL);
// The following cleans up vertices and triangles,
// getting rid of degenerate triangles and duplicate vertices,
@@ -937,11 +1038,14 @@ public:
friend std::ostream& operator<<(std::ostream &s, const LLVolume *volumep); // HACK to bypass Windoze confusion over
// conversion if *(LLVolume*) to LLVolume&
const LLVolumeFace &getVolumeFace(const S32 f) const {return mVolumeFaces[f];} // DO NOT DELETE VOLUME WHILE USING THIS REFERENCE, OR HOLD A POINTER TO THIS VOLUMEFACE
-
+
U32 mFaceMask; // bit array of which faces exist in this volume
LLVector3 mLODScaleBias; // vector for biasing LOD based on scale
void sculpt(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components, const U8* sculpt_data, S32 sculpt_level);
+ void copyVolumeFaces(const LLVolume* volume);
+ void cacheOptimize();
+
private:
void sculptGenerateMapVertices(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components, const U8* sculpt_data, U8 sculpt_type);
F32 sculptGetSurfaceArea();
@@ -952,35 +1056,57 @@ private:
protected:
BOOL generate();
void createVolumeFaces();
+public:
+ virtual bool unpackVolumeFaces(std::istream& is, S32 size);
+
+ virtual void setMeshAssetLoaded(BOOL loaded);
+ virtual BOOL isMeshAssetLoaded();
protected:
BOOL mUnique;
F32 mDetail;
S32 mSculptLevel;
+ F32 mSurfaceArea; //unscaled surface area
+ BOOL mIsMeshAssetLoaded;
LLVolumeParams mParams;
LLPath *mPathp;
LLProfile *mProfilep;
std::vector<Point> mMesh;
-
+
BOOL mGenerateSingleFace;
typedef std::vector<LLVolumeFace> face_list_t;
face_list_t mVolumeFaces;
+
+public:
+ LLVector4a* mHullPoints;
+ U16* mHullIndices;
+ S32 mNumHullPoints;
+ S32 mNumHullIndices;
};
std::ostream& operator<<(std::ostream &s, const LLVolumeParams &volume_params);
-LLVector3 calc_binormal_from_triangle(
- const LLVector3& pos0,
+void calc_binormal_from_triangle(
+ LLVector4a& binormal,
+ const LLVector4a& pos0,
const LLVector2& tex0,
- const LLVector3& pos1,
+ const LLVector4a& pos1,
const LLVector2& tex1,
- const LLVector3& pos2,
+ const LLVector4a& pos2,
const LLVector2& tex2);
+BOOL LLLineSegmentBoxIntersect(const F32* start, const F32* end, const F32* center, const F32* size);
BOOL LLLineSegmentBoxIntersect(const LLVector3& start, const LLVector3& end, const LLVector3& center, const LLVector3& size);
+BOOL LLLineSegmentBoxIntersect(const LLVector4a& start, const LLVector4a& end, const LLVector4a& center, const LLVector4a& size);
+
BOOL LLTriangleRayIntersect(const LLVector3& vert0, const LLVector3& vert1, const LLVector3& vert2, const LLVector3& orig, const LLVector3& dir,
- F32* intersection_a, F32* intersection_b, F32* intersection_t, BOOL two_sided);
+ F32& intersection_a, F32& intersection_b, F32& intersection_t, BOOL two_sided);
+
+BOOL LLTriangleRayIntersect(const LLVector4a& vert0, const LLVector4a& vert1, const LLVector4a& vert2, const LLVector4a& orig, const LLVector4a& dir,
+ F32& intersection_a, F32& intersection_b, F32& intersection_t);
+BOOL LLTriangleRayIntersectTwoSided(const LLVector4a& vert0, const LLVector4a& vert1, const LLVector4a& vert2, const LLVector4a& orig, const LLVector4a& dir,
+ F32& intersection_a, F32& intersection_b, F32& intersection_t);
diff --git a/indra/llmath/llvolumemgr.cpp b/indra/llmath/llvolumemgr.cpp
index 88c195936c..c60b750088 100644
--- a/indra/llmath/llvolumemgr.cpp
+++ b/indra/llmath/llvolumemgr.cpp
@@ -314,7 +314,7 @@ BOOL LLVolumeLODGroup::derefLOD(LLVolume *volumep)
{
llassert_always(mLODRefs[i] > 0);
mLODRefs[i]--;
-#if 1 // SJB: Possible opt: keep other lods around
+#if 0 // SJB: Possible opt: keep other lods around
if (!mLODRefs[i])
{
mVolumeLODs[i] = NULL;
@@ -369,6 +369,19 @@ F32 LLVolumeLODGroup::getVolumeScaleFromDetail(const S32 detail)
return mDetailScales[detail];
}
+S32 LLVolumeLODGroup::getVolumeDetailFromScale(const F32 detail)
+{
+ for (S32 i = 1; i < 4; i++)
+ {
+ if (mDetailScales[i] > detail)
+ {
+ return i-1;
+ }
+ }
+
+ return 3;
+}
+
F32 LLVolumeLODGroup::dump()
{
F32 usage = 0.f;
diff --git a/indra/llmath/llvolumemgr.h b/indra/llmath/llvolumemgr.h
index 5257da2693..c75906f675 100644
--- a/indra/llmath/llvolumemgr.h
+++ b/indra/llmath/llvolumemgr.h
@@ -53,6 +53,7 @@ public:
static S32 getDetailFromTan(const F32 tan_angle);
static void getDetailProximity(const F32 tan_angle, F32 &to_lower, F32& to_higher);
static F32 getVolumeScaleFromDetail(const S32 detail);
+ static S32 getVolumeDetailFromScale(F32 scale);
LLVolume* refLOD(const S32 detail);
BOOL derefLOD(LLVolume *volumep);
diff --git a/indra/llmath/llvolumeoctree.cpp b/indra/llmath/llvolumeoctree.cpp
new file mode 100644
index 0000000000..b5a935c2b5
--- /dev/null
+++ b/indra/llmath/llvolumeoctree.cpp
@@ -0,0 +1,256 @@
+/**
+
+ * @file llvolumeoctree.cpp
+ *
+ * $LicenseInfo:firstyear=2002&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llvolumeoctree.h"
+#include "llvector4a.h"
+
+BOOL LLLineSegmentBoxIntersect(const LLVector4a& start, const LLVector4a& end, const LLVector4a& center, const LLVector4a& size)
+{
+ LLVector4a fAWdU;
+ LLVector4a dir;
+ LLVector4a diff;
+
+ dir.setSub(end, start);
+ dir.mul(0.5f);
+
+ diff.setAdd(end,start);
+ diff.mul(0.5f);
+ diff.sub(center);
+ fAWdU.setAbs(dir);
+
+ LLVector4a rhs;
+ rhs.setAdd(size, fAWdU);
+
+ LLVector4a lhs;
+ lhs.setAbs(diff);
+
+ U32 grt = lhs.greaterThan(rhs).getGatheredBits();
+
+ if (grt & 0x7)
+ {
+ return false;
+ }
+
+ LLVector4a f;
+ f.setCross3(dir, diff);
+ f.setAbs(f);
+
+ LLVector4a v0, v1;
+
+ v0 = _mm_shuffle_ps(size, size,_MM_SHUFFLE(3,0,0,1));
+ v1 = _mm_shuffle_ps(fAWdU, fAWdU, _MM_SHUFFLE(3,1,2,2));
+ lhs.setMul(v0, v1);
+
+ v0 = _mm_shuffle_ps(size, size, _MM_SHUFFLE(3,1,2,2));
+ v1 = _mm_shuffle_ps(fAWdU, fAWdU, _MM_SHUFFLE(3,0,0,1));
+ rhs.setMul(v0, v1);
+ rhs.add(lhs);
+
+ grt = f.greaterThan(rhs).getGatheredBits();
+
+ return (grt & 0x7) ? false : true;
+}
+
+
+LLVolumeOctreeListener::LLVolumeOctreeListener(LLOctreeNode<LLVolumeTriangle>* node)
+{
+ node->addListener(this);
+}
+
+LLVolumeOctreeListener::~LLVolumeOctreeListener()
+{
+
+}
+
+void LLVolumeOctreeListener::handleChildAddition(const LLOctreeNode<LLVolumeTriangle>* parent,
+ LLOctreeNode<LLVolumeTriangle>* child)
+{
+ new LLVolumeOctreeListener(child);
+}
+
+
+LLOctreeTriangleRayIntersect::LLOctreeTriangleRayIntersect(const LLVector4a& start, const LLVector4a& dir,
+ const LLVolumeFace* face, F32* closest_t,
+ LLVector3* intersection,LLVector2* tex_coord, LLVector3* normal, LLVector3* bi_normal)
+ : mFace(face),
+ mStart(start),
+ mDir(dir),
+ mIntersection(intersection),
+ mTexCoord(tex_coord),
+ mNormal(normal),
+ mBinormal(bi_normal),
+ mClosestT(closest_t),
+ mHitFace(false)
+{
+ mEnd.setAdd(mStart, mDir);
+}
+
+void LLOctreeTriangleRayIntersect::traverse(const LLOctreeNode<LLVolumeTriangle>* node)
+{
+ LLVolumeOctreeListener* vl = (LLVolumeOctreeListener*) node->getListener(0);
+
+ /*const F32* start = mStart.getF32();
+ const F32* end = mEnd.getF32();
+ const F32* center = vl->mBounds[0].getF32();
+ const F32* size = vl->mBounds[1].getF32();*/
+
+ //if (LLLineSegmentBoxIntersect(mStart, mEnd, vl->mBounds[0], vl->mBounds[1]))
+ if (LLLineSegmentBoxIntersect(mStart.getF32ptr(), mEnd.getF32ptr(), vl->mBounds[0].getF32ptr(), vl->mBounds[1].getF32ptr()))
+ {
+ node->accept(this);
+ for (S32 i = 0; i < node->getChildCount(); ++i)
+ {
+ traverse(node->getChild(i));
+ }
+ }
+}
+
+void LLOctreeTriangleRayIntersect::visit(const LLOctreeNode<LLVolumeTriangle>* node)
+{
+ for (LLOctreeNode<LLVolumeTriangle>::const_element_iter iter =
+ node->getData().begin(); iter != node->getData().end(); ++iter)
+ {
+ const LLVolumeTriangle* tri = *iter;
+
+ F32 a, b, t;
+
+ if (LLTriangleRayIntersect(*tri->mV[0], *tri->mV[1], *tri->mV[2],
+ mStart, mDir, a, b, t))
+ {
+ if ((t >= 0.f) && // if hit is after start
+ (t <= 1.f) && // and before end
+ (t < *mClosestT)) // and this hit is closer
+ {
+ *mClosestT = t;
+ mHitFace = true;
+
+ if (mIntersection != NULL)
+ {
+ LLVector4a intersect = mDir;
+ intersect.mul(*mClosestT);
+ intersect.add(mStart);
+ mIntersection->set(intersect.getF32ptr());
+ }
+
+
+ if (mTexCoord != NULL)
+ {
+ LLVector2* tc = (LLVector2*) mFace->mTexCoords;
+ *mTexCoord = ((1.f - a - b) * tc[tri->mIndex[0]] +
+ a * tc[tri->mIndex[1]] +
+ b * tc[tri->mIndex[2]]);
+
+ }
+
+ if (mNormal != NULL)
+ {
+ LLVector4* norm = (LLVector4*) mFace->mNormals;
+
+ *mNormal = ((1.f - a - b) * LLVector3(norm[tri->mIndex[0]]) +
+ a * LLVector3(norm[tri->mIndex[1]]) +
+ b * LLVector3(norm[tri->mIndex[2]]));
+ }
+
+ if (mBinormal != NULL)
+ {
+ LLVector4* binormal = (LLVector4*) mFace->mBinormals;
+ *mBinormal = ((1.f - a - b) * LLVector3(binormal[tri->mIndex[0]]) +
+ a * LLVector3(binormal[tri->mIndex[1]]) +
+ b * LLVector3(binormal[tri->mIndex[2]]));
+ }
+ }
+ }
+ }
+}
+
+const LLVector4a& LLVolumeTriangle::getPositionGroup() const
+{
+ return mPositionGroup;
+}
+
+const F32& LLVolumeTriangle::getBinRadius() const
+{
+ return mRadius;
+}
+
+
+//TEST CODE
+
+void LLVolumeOctreeValidate::visit(const LLOctreeNode<LLVolumeTriangle>* branch)
+{
+ LLVolumeOctreeListener* node = (LLVolumeOctreeListener*) branch->getListener(0);
+
+ //make sure bounds matches extents
+ LLVector4a& min = node->mExtents[0];
+ LLVector4a& max = node->mExtents[1];
+
+ LLVector4a& center = node->mBounds[0];
+ LLVector4a& size = node->mBounds[1];
+
+ LLVector4a test_min, test_max;
+ test_min.setSub(center, size);
+ test_max.setAdd(center, size);
+
+ if (!test_min.equals3(min, 0.001f) ||
+ !test_max.equals3(max, 0.001f))
+ {
+ llerrs << "Bad bounding box data found." << llendl;
+ }
+
+ test_min.sub(LLVector4a(0.001f));
+ test_max.add(LLVector4a(0.001f));
+
+ for (U32 i = 0; i < branch->getChildCount(); ++i)
+ {
+ LLVolumeOctreeListener* child = (LLVolumeOctreeListener*) branch->getChild(i)->getListener(0);
+
+ //make sure all children fit inside this node
+ if (child->mExtents[0].lessThan(test_min).areAnySet(LLVector4Logical::MASK_XYZ) ||
+ child->mExtents[1].greaterThan(test_max).areAnySet(LLVector4Logical::MASK_XYZ))
+ {
+ llerrs << "Child protrudes from bounding box." << llendl;
+ }
+ }
+
+ //children fit, check data
+ for (LLOctreeNode<LLVolumeTriangle>::const_element_iter iter = branch->getData().begin();
+ iter != branch->getData().end(); ++iter)
+ {
+ const LLVolumeTriangle* tri = *iter;
+
+ //validate triangle
+ for (U32 i = 0; i < 3; i++)
+ {
+ if (tri->mV[i]->greaterThan(test_max).areAnySet(LLVector4Logical::MASK_XYZ) ||
+ tri->mV[i]->lessThan(test_min).areAnySet(LLVector4Logical::MASK_XYZ))
+ {
+ llerrs << "Triangle protrudes from node." << llendl;
+ }
+ }
+ }
+}
+
+
diff --git a/indra/llmath/llvolumeoctree.h b/indra/llmath/llvolumeoctree.h
new file mode 100644
index 0000000000..688d91dc40
--- /dev/null
+++ b/indra/llmath/llvolumeoctree.h
@@ -0,0 +1,134 @@
+/**
+ * @file llvolumeoctree.h
+ * @brief LLVolume octree classes.
+ *
+ * $LicenseInfo:firstyear=2002&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLVOLUME_OCTREE_H
+#define LL_LLVOLUME_OCTREE_H
+
+#include "linden_common.h"
+#include "llmemory.h"
+
+#include "lloctree.h"
+#include "llvolume.h"
+#include "llvector4a.h"
+
+class LLVolumeTriangle : public LLRefCount
+{
+public:
+ LLVolumeTriangle()
+ {
+
+ }
+
+ LLVolumeTriangle(const LLVolumeTriangle& rhs)
+ {
+ *this = rhs;
+ }
+
+ const LLVolumeTriangle& operator=(const LLVolumeTriangle& rhs)
+ {
+ llerrs << "Illegal operation!" << llendl;
+ return *this;
+ }
+
+ ~LLVolumeTriangle()
+ {
+
+ }
+
+ LLVector4a mPositionGroup;
+
+ const LLVector4a* mV[3];
+ U16 mIndex[3];
+
+ F32 mRadius;
+
+ virtual const LLVector4a& getPositionGroup() const;
+ virtual const F32& getBinRadius() const;
+};
+
+class LLVolumeOctreeListener : public LLOctreeListener<LLVolumeTriangle>
+{
+public:
+
+ LLVolumeOctreeListener(LLOctreeNode<LLVolumeTriangle>* node);
+ ~LLVolumeOctreeListener();
+
+ LLVolumeOctreeListener(const LLVolumeOctreeListener& rhs)
+ {
+ *this = rhs;
+ }
+
+ const LLVolumeOctreeListener& operator=(const LLVolumeOctreeListener& rhs)
+ {
+ llerrs << "Illegal operation!" << llendl;
+ return *this;
+ }
+
+ //LISTENER FUNCTIONS
+ virtual void handleChildAddition(const LLOctreeNode<LLVolumeTriangle>* parent,
+ LLOctreeNode<LLVolumeTriangle>* child);
+ virtual void handleStateChange(const LLTreeNode<LLVolumeTriangle>* node) { }
+ virtual void handleChildRemoval(const LLOctreeNode<LLVolumeTriangle>* parent,
+ const LLOctreeNode<LLVolumeTriangle>* child) { }
+ virtual void handleInsertion(const LLTreeNode<LLVolumeTriangle>* node, LLVolumeTriangle* tri) { }
+ virtual void handleRemoval(const LLTreeNode<LLVolumeTriangle>* node, LLVolumeTriangle* tri) { }
+ virtual void handleDestruction(const LLTreeNode<LLVolumeTriangle>* node) { }
+
+
+public:
+ LLVector4a mBounds[2]; // bounding box (center, size) of this node and all its children (tight fit to objects)
+ LLVector4a mExtents[2]; // extents (min, max) of this node and all its children
+};
+
+class LLOctreeTriangleRayIntersect : public LLOctreeTraveler<LLVolumeTriangle>
+{
+public:
+ const LLVolumeFace* mFace;
+ LLVector4a mStart;
+ LLVector4a mDir;
+ LLVector4a mEnd;
+ LLVector3* mIntersection;
+ LLVector2* mTexCoord;
+ LLVector3* mNormal;
+ LLVector3* mBinormal;
+ F32* mClosestT;
+ bool mHitFace;
+
+ LLOctreeTriangleRayIntersect(const LLVector4a& start, const LLVector4a& dir,
+ const LLVolumeFace* face, F32* closest_t,
+ LLVector3* intersection,LLVector2* tex_coord, LLVector3* normal, LLVector3* bi_normal);
+
+ void traverse(const LLOctreeNode<LLVolumeTriangle>* node);
+
+ virtual void visit(const LLOctreeNode<LLVolumeTriangle>* node);
+};
+
+class LLVolumeOctreeValidate : public LLOctreeTraveler<LLVolumeTriangle>
+{
+ virtual void visit(const LLOctreeNode<LLVolumeTriangle>* branch);
+};
+
+#endif
diff --git a/indra/llmath/m4math.cpp b/indra/llmath/m4math.cpp
index 946b1553fe..6a1b4143cf 100644
--- a/indra/llmath/m4math.cpp
+++ b/indra/llmath/m4math.cpp
@@ -215,8 +215,33 @@ const LLMatrix4& LLMatrix4::transpose()
F32 LLMatrix4::determinant() const
{
- llerrs << "Not implemented!" << llendl;
- return 0.f;
+ F32 value =
+ mMatrix[0][3] * mMatrix[1][2] * mMatrix[2][1] * mMatrix[3][0] -
+ mMatrix[0][2] * mMatrix[1][3] * mMatrix[2][1] * mMatrix[3][0] -
+ mMatrix[0][3] * mMatrix[1][1] * mMatrix[2][2] * mMatrix[3][0] +
+ mMatrix[0][1] * mMatrix[1][3] * mMatrix[2][2] * mMatrix[3][0] +
+ mMatrix[0][2] * mMatrix[1][1] * mMatrix[2][3] * mMatrix[3][0] -
+ mMatrix[0][1] * mMatrix[1][2] * mMatrix[2][3] * mMatrix[3][0] -
+ mMatrix[0][3] * mMatrix[1][2] * mMatrix[2][0] * mMatrix[3][1] +
+ mMatrix[0][2] * mMatrix[1][3] * mMatrix[2][0] * mMatrix[3][1] +
+ mMatrix[0][3] * mMatrix[1][0] * mMatrix[2][2] * mMatrix[3][1] -
+ mMatrix[0][0] * mMatrix[1][3] * mMatrix[2][2] * mMatrix[3][1] -
+ mMatrix[0][2] * mMatrix[1][0] * mMatrix[2][3] * mMatrix[3][1] +
+ mMatrix[0][0] * mMatrix[1][2] * mMatrix[2][3] * mMatrix[3][1] +
+ mMatrix[0][3] * mMatrix[1][1] * mMatrix[2][0] * mMatrix[3][2] -
+ mMatrix[0][1] * mMatrix[1][3] * mMatrix[2][0] * mMatrix[3][2] -
+ mMatrix[0][3] * mMatrix[1][0] * mMatrix[2][1] * mMatrix[3][2] +
+ mMatrix[0][0] * mMatrix[1][3] * mMatrix[2][1] * mMatrix[3][2] +
+ mMatrix[0][1] * mMatrix[1][0] * mMatrix[2][3] * mMatrix[3][2] -
+ mMatrix[0][0] * mMatrix[1][1] * mMatrix[2][3] * mMatrix[3][2] -
+ mMatrix[0][2] * mMatrix[1][1] * mMatrix[2][0] * mMatrix[3][3] +
+ mMatrix[0][1] * mMatrix[1][2] * mMatrix[2][0] * mMatrix[3][3] +
+ mMatrix[0][2] * mMatrix[1][0] * mMatrix[2][1] * mMatrix[3][3] -
+ mMatrix[0][0] * mMatrix[1][2] * mMatrix[2][1] * mMatrix[3][3] -
+ mMatrix[0][1] * mMatrix[1][0] * mMatrix[2][2] * mMatrix[3][3] +
+ mMatrix[0][0] * mMatrix[1][1] * mMatrix[2][2] * mMatrix[3][3];
+
+ return value;
}
// Only works for pure orthonormal, homogeneous transform matrices.
@@ -422,6 +447,17 @@ const LLMatrix4& LLMatrix4::initRotTrans(const LLQuaternion &q, const LLVector
return (*this);
}
+const LLMatrix4& LLMatrix4::initScale(const LLVector3 &scale)
+{
+ setIdentity();
+
+ mMatrix[VX][VX] = scale.mV[VX];
+ mMatrix[VY][VY] = scale.mV[VY];
+ mMatrix[VZ][VZ] = scale.mV[VZ];
+
+ return (*this);
+}
+
const LLMatrix4& LLMatrix4::initAll(const LLVector3 &scale, const LLQuaternion &q, const LLVector3 &pos)
{
F32 sx, sy, sz;
@@ -642,37 +678,6 @@ const LLMatrix4& LLMatrix4::initMatrix(const LLMatrix3 &mat, const LLVector4 &
// LLMatrix4 Operators
-
-/* Not implemented to help enforce code consistency with the syntax of
- row-major notation. This is a Good Thing.
-LLVector4 operator*(const LLMatrix4 &a, const LLVector4 &b)
-{
- // Operate "to the right" on column-vector b
- LLVector4 vec;
- vec.mV[VX] = a.mMatrix[VX][VX] * b.mV[VX] +
- a.mMatrix[VY][VX] * b.mV[VY] +
- a.mMatrix[VZ][VX] * b.mV[VZ] +
- a.mMatrix[VW][VX] * b.mV[VW];
-
- vec.mV[VY] = a.mMatrix[VX][VY] * b.mV[VX] +
- a.mMatrix[VY][VY] * b.mV[VY] +
- a.mMatrix[VZ][VY] * b.mV[VZ] +
- a.mMatrix[VW][VY] * b.mV[VW];
-
- vec.mV[VZ] = a.mMatrix[VX][VZ] * b.mV[VX] +
- a.mMatrix[VY][VZ] * b.mV[VY] +
- a.mMatrix[VZ][VZ] * b.mV[VZ] +
- a.mMatrix[VW][VZ] * b.mV[VW];
-
- vec.mV[VW] = a.mMatrix[VX][VW] * b.mV[VX] +
- a.mMatrix[VY][VW] * b.mV[VY] +
- a.mMatrix[VZ][VW] * b.mV[VZ] +
- a.mMatrix[VW][VW] * b.mV[VW];
- return vec;
-}
-*/
-
-
LLVector4 operator*(const LLVector4 &a, const LLMatrix4 &b)
{
// Operate "to the left" on row-vector a
@@ -768,6 +773,23 @@ bool operator!=(const LLMatrix4 &a, const LLMatrix4 &b)
return FALSE;
}
+bool operator<(const LLMatrix4& a, const LLMatrix4 &b)
+{
+ U32 i, j;
+ for (i = 0; i < NUM_VALUES_IN_MAT4; i++)
+ {
+ for (j = 0; j < NUM_VALUES_IN_MAT4; j++)
+ {
+ if (a.mMatrix[i][j] != b.mMatrix[i][j])
+ {
+ return a.mMatrix[i][j] < b.mMatrix[i][j];
+ }
+ }
+ }
+
+ return false;
+}
+
const LLMatrix4& operator*=(LLMatrix4 &a, F32 k)
{
U32 i, j;
@@ -807,4 +829,54 @@ std::ostream& operator<<(std::ostream& s, const LLMatrix4 &a)
return s;
}
+LLSD LLMatrix4::getValue() const
+{
+ LLSD ret;
+
+ ret[0] = mMatrix[0][0];
+ ret[1] = mMatrix[0][1];
+ ret[2] = mMatrix[0][2];
+ ret[3] = mMatrix[0][3];
+
+ ret[4] = mMatrix[1][0];
+ ret[5] = mMatrix[1][1];
+ ret[6] = mMatrix[1][2];
+ ret[7] = mMatrix[1][3];
+
+ ret[8] = mMatrix[2][0];
+ ret[9] = mMatrix[2][1];
+ ret[10] = mMatrix[2][2];
+ ret[11] = mMatrix[2][3];
+
+ ret[12] = mMatrix[3][0];
+ ret[13] = mMatrix[3][1];
+ ret[14] = mMatrix[3][2];
+ ret[15] = mMatrix[3][3];
+
+ return ret;
+}
+
+void LLMatrix4::setValue(const LLSD& data)
+{
+ mMatrix[0][0] = (F32)data[0].asReal();
+ mMatrix[0][1] = (F32)data[1].asReal();
+ mMatrix[0][2] = (F32)data[2].asReal();
+ mMatrix[0][3] = (F32)data[3].asReal();
+
+ mMatrix[1][0] = (F32)data[4].asReal();
+ mMatrix[1][1] = (F32)data[5].asReal();
+ mMatrix[1][2] = (F32)data[6].asReal();
+ mMatrix[1][3] = (F32)data[7].asReal();
+
+ mMatrix[2][0] = (F32)data[8].asReal();
+ mMatrix[2][1] = (F32)data[9].asReal();
+ mMatrix[2][2] = (F32)data[10].asReal();
+ mMatrix[2][3] = (F32)data[11].asReal();
+
+ mMatrix[3][0] = (F32)data[12].asReal();
+ mMatrix[3][1] = (F32)data[13].asReal();
+ mMatrix[3][2] = (F32)data[14].asReal();
+ mMatrix[3][3] = (F32)data[15].asReal();
+}
+
diff --git a/indra/llmath/m4math.h b/indra/llmath/m4math.h
index 6ec9958491..a7dce10397 100644
--- a/indra/llmath/m4math.h
+++ b/indra/llmath/m4math.h
@@ -119,6 +119,8 @@ public:
~LLMatrix4(void); // Destructor
+ LLSD getValue() const;
+ void setValue(const LLSD&);
//////////////////////////////
//
@@ -132,6 +134,7 @@ public:
// various useful matrix functions
const LLMatrix4& setIdentity(); // Load identity matrix
+ bool isIdentity() const;
const LLMatrix4& setZero(); // Clears matrix to all zeros.
const LLMatrix4& initRotation(const F32 angle, const F32 x, const F32 y, const F32 z); // Calculate rotation matrix by rotating angle radians about (x, y, z)
@@ -153,6 +156,7 @@ public:
const LLMatrix4& initRotTrans(const F32 roll, const F32 pitch, const F32 yaw, const LLVector4 &pos); // Rotation from Euler + translation
const LLMatrix4& initRotTrans(const LLQuaternion &q, const LLVector4 &pos); // Set with Quaternion and position
+ const LLMatrix4& initScale(const LLVector3 &scale);
// Set all
const LLMatrix4& initAll(const LLVector3 &scale, const LLQuaternion &q, const LLVector3 &pos);
@@ -219,10 +223,7 @@ public:
// Operators
//
-// Not implemented to enforce code that agrees with symbolic syntax
-// friend LLVector4 operator*(const LLMatrix4 &a, const LLVector4 &b); // Apply rotation a to vector b
-
-// friend inline LLMatrix4 operator*(const LLMatrix4 &a, const LLMatrix4 &b); // Return a * b
+ // friend inline LLMatrix4 operator*(const LLMatrix4 &a, const LLMatrix4 &b); // Return a * b
friend LLVector4 operator*(const LLVector4 &a, const LLMatrix4 &b); // Return transform of vector a by matrix b
friend const LLVector3 operator*(const LLVector3 &a, const LLMatrix4 &b); // Return full transform of a by matrix b
friend LLVector4 rotate_vector(const LLVector4 &a, const LLMatrix4 &b); // Rotates a but does not translate
@@ -230,6 +231,7 @@ public:
friend bool operator==(const LLMatrix4 &a, const LLMatrix4 &b); // Return a == b
friend bool operator!=(const LLMatrix4 &a, const LLMatrix4 &b); // Return a != b
+ friend bool operator<(const LLMatrix4 &a, const LLMatrix4& b); // Return a < b
friend const LLMatrix4& operator+=(LLMatrix4 &a, const LLMatrix4 &b); // Return a + b
friend const LLMatrix4& operator-=(LLMatrix4 &a, const LLMatrix4 &b); // Return a - b
@@ -263,6 +265,30 @@ inline const LLMatrix4& LLMatrix4::setIdentity()
return (*this);
}
+inline bool LLMatrix4::isIdentity() const
+{
+ return
+ mMatrix[0][0] == 1.f &&
+ mMatrix[0][1] == 0.f &&
+ mMatrix[0][2] == 0.f &&
+ mMatrix[0][3] == 0.f &&
+
+ mMatrix[1][0] == 0.f &&
+ mMatrix[1][1] == 1.f &&
+ mMatrix[1][2] == 0.f &&
+ mMatrix[1][3] == 0.f &&
+
+ mMatrix[2][0] == 0.f &&
+ mMatrix[2][1] == 0.f &&
+ mMatrix[2][2] == 1.f &&
+ mMatrix[2][3] == 0.f &&
+
+ mMatrix[3][0] == 0.f &&
+ mMatrix[3][1] == 0.f &&
+ mMatrix[3][2] == 0.f &&
+ mMatrix[3][3] == 1.f;
+}
+
/*
inline LLMatrix4 operator*(const LLMatrix4 &a, const LLMatrix4 &b)
diff --git a/indra/llmath/tests/llbbox_test.cpp b/indra/llmath/tests/llbbox_test.cpp
index 8064ab217d..fd0dbb58fc 100644
--- a/indra/llmath/tests/llbbox_test.cpp
+++ b/indra/llmath/tests/llbbox_test.cpp
@@ -34,7 +34,7 @@
#define ANGLE (3.14159265f / 2.0f)
-#define APPROX_EQUAL(a, b) dist_vec((a),(b)) < 1e-5
+#define APPROX_EQUAL(a, b) (dist_vec_squared((a),(b)) < 1e-10)
namespace tut
{
diff --git a/indra/llmath/tests/llquaternion_test.cpp b/indra/llmath/tests/llquaternion_test.cpp
index 9e79b299ff..e69010b2d6 100644
--- a/indra/llmath/tests/llquaternion_test.cpp
+++ b/indra/llmath/tests/llquaternion_test.cpp
@@ -29,12 +29,12 @@
#include "linden_common.h"
#include "../test/lltut.h"
-#include "../llquaternion.h"
#include "../v4math.h"
#include "../v3math.h"
#include "../v3dmath.h"
#include "../m4math.h"
#include "../m3math.h"
+#include "../llquaternion.h"
namespace tut
{
diff --git a/indra/llmath/tests/m3math_test.cpp b/indra/llmath/tests/m3math_test.cpp
index 8abf61b740..1ca2b005d9 100644
--- a/indra/llmath/tests/m3math_test.cpp
+++ b/indra/llmath/tests/m3math_test.cpp
@@ -37,6 +37,16 @@
#include "../test/lltut.h"
+#if LL_WINDOWS
+// disable unreachable code warnings caused by usage of skip.
+#pragma warning(disable: 4702)
+#endif
+
+#if LL_WINDOWS
+// disable unreachable code warnings caused by usage of skip.
+#pragma warning(disable: 4702)
+#endif
+
namespace tut
{
struct m3math_test
@@ -277,20 +287,21 @@ namespace tut
LLVector3 llvec2(1, 2, 0);
LLVector3 llvec3(2, 4, 2);
+ skip("This test fails depending on architecture. Need to fix comparison operation, is_approx_equal, to work on more than one platform.");
+
llmat_obj.setRows(llvec1, llvec2, llvec3);
llmat_obj.orthogonalize();
- skip("Grr, LLMatrix3::orthogonalize test is failing. Has it ever worked?");
ensure("LLMatrix3::orthogonalize failed ",
- is_approx_equal(0.19611613f, llmat_obj.mMatrix[0][0]) &&
+ is_approx_equal(0.19611614f, llmat_obj.mMatrix[0][0]) &&
is_approx_equal(0.78446454f, llmat_obj.mMatrix[0][1]) &&
- is_approx_equal(0.58834839f, llmat_obj.mMatrix[0][2]) &&
- is_approx_equal(0.47628206f, llmat_obj.mMatrix[1][0]) &&
- is_approx_equal(0.44826555f, llmat_obj.mMatrix[1][1]) &&
- is_approx_equal(-0.75644791f, llmat_obj.mMatrix[1][2]) &&
- is_approx_equal(-0.85714287f, llmat_obj.mMatrix[2][0]) &&
+ is_approx_equal(0.58834841f, llmat_obj.mMatrix[0][2]) &&
+ is_approx_equal(0.47628204f, llmat_obj.mMatrix[1][0]) &&
+ is_approx_equal(0.44826545f, llmat_obj.mMatrix[1][1]) &&
+ is_approx_equal(-0.75644795f, llmat_obj.mMatrix[1][2]) &&
+ is_approx_equal(-0.85714286f, llmat_obj.mMatrix[2][0]) &&
is_approx_equal(0.42857143f, llmat_obj.mMatrix[2][1]) &&
- is_approx_equal(-0.28571427f, llmat_obj.mMatrix[2][2]));
+ is_approx_equal(-0.28571429f, llmat_obj.mMatrix[2][2]));
}
//test case for adjointTranspose() fn.
diff --git a/indra/llmath/tests/v2math_test.cpp b/indra/llmath/tests/v2math_test.cpp
index 9747996b25..4d6a2eca93 100644
--- a/indra/llmath/tests/v2math_test.cpp
+++ b/indra/llmath/tests/v2math_test.cpp
@@ -85,7 +85,7 @@ namespace tut
F32 x = 2.2345f, y = 3.5678f ;
LLVector2 vec2(x,y);
ensure("magVecSquared:Fail ", is_approx_equal(vec2.magVecSquared(), (x*x + y*y)));
- ensure("magVec:Fail ", is_approx_equal(vec2.magVec(), fsqrtf(x*x + y*y)));
+ ensure("magVec:Fail ", is_approx_equal(vec2.magVec(), (F32) sqrt(x*x + y*y)));
}
template<> template<>
@@ -407,7 +407,7 @@ namespace tut
ensure_equals("dist_vec_squared values are not equal",val2, val1);
val1 = dist_vec(vec2, vec3);
- val2 = fsqrtf((x1 - x2)*(x1 - x2) + (y1 - y2)* (y1 - y2));
+ val2 = (F32) sqrt((x1 - x2)*(x1 - x2) + (y1 - y2)* (y1 - y2));
ensure_equals("dist_vec values are not equal",val2, val1);
}
@@ -431,7 +431,7 @@ namespace tut
LLVector2 vec2(x1, y1);
F32 vecMag = vec2.normVec();
- F32 mag = fsqrtf(x1*x1 + y1*y1);
+ F32 mag = (F32) sqrt(x1*x1 + y1*y1);
F32 oomag = 1.f / mag;
val1 = x1 * oomag;
diff --git a/indra/llmath/tests/v3color_test.cpp b/indra/llmath/tests/v3color_test.cpp
index 2c00f00ab3..29d1c483ab 100644
--- a/indra/llmath/tests/v3color_test.cpp
+++ b/indra/llmath/tests/v3color_test.cpp
@@ -93,7 +93,7 @@ namespace tut
F32 r = 2.3436212f, g = 1231.f, b = 4.7849321232f;
LLColor3 llcolor3(r,g,b);
ensure("magVecSquared:Fail ", is_approx_equal(llcolor3.magVecSquared(), (r*r + g*g + b*b)));
- ensure("magVec:Fail ", is_approx_equal(llcolor3.magVec(), fsqrtf(r*r + g*g + b*b)));
+ ensure("magVec:Fail ", is_approx_equal(llcolor3.magVec(), (F32) sqrt(r*r + g*g + b*b)));
}
template<> template<>
@@ -103,7 +103,7 @@ namespace tut
F32 val1, val2,val3;
LLColor3 llcolor3(r,g,b);
F32 vecMag = llcolor3.normVec();
- F32 mag = fsqrtf(r*r + g*g + b*b);
+ F32 mag = (F32) sqrt(r*r + g*g + b*b);
F32 oomag = 1.f / mag;
val1 = r * oomag;
val2 = g * oomag;
@@ -286,7 +286,7 @@ namespace tut
F32 r1 =1.f, g1 = 2.f,b1 = 1.2f, r2 = -2.3f, g2 = 1.11f, b2 = 1234.234f;
LLColor3 llcolor3(r1,g1,b1),llcolor3a(r2,g2,b2);
F32 val = distVec(llcolor3,llcolor3a);
- ensure("distVec failed ", is_approx_equal(fsqrtf((r1-r2)*(r1-r2) + (g1-g2)*(g1-g2) + (b1-b2)*(b1-b2)) ,val));
+ ensure("distVec failed ", is_approx_equal((F32) sqrt((r1-r2)*(r1-r2) + (g1-g2)*(g1-g2) + (b1-b2)*(b1-b2)) ,val));
F32 val1 = distVec_squared(llcolor3,llcolor3a);
ensure("distVec_squared failed ", is_approx_equal(((r1-r2)*(r1-r2) + (g1-g2)*(g1-g2) + (b1-b2)*(b1-b2)) ,val1));
diff --git a/indra/llmath/tests/v3dmath_test.cpp b/indra/llmath/tests/v3dmath_test.cpp
index b67346f4e5..20b26faa12 100644
--- a/indra/llmath/tests/v3dmath_test.cpp
+++ b/indra/llmath/tests/v3dmath_test.cpp
@@ -30,11 +30,11 @@
#include "llsd.h"
#include "../test/lltut.h"
-#include "../llquaternion.h"
#include "../m3math.h"
#include "../v4math.h"
#include "../v3dmath.h"
#include "../v3dmath.h"
+#include "../llquaternion.h"
namespace tut
{
@@ -403,7 +403,7 @@ namespace tut
LLVector3d vec3D(x,y,z);
F64 res = (x*x + y*y + z*z) - vec3D.magVecSquared();
ensure("1:magVecSquared:Fail ", ((-F_APPROXIMATELY_ZERO <= res)&& (res <=F_APPROXIMATELY_ZERO)));
- res = fsqrtf(x*x + y*y + z*z) - vec3D.magVec();
+ res = (F32) sqrt(x*x + y*y + z*z) - vec3D.magVec();
ensure("2:magVec: Fail ", ((-F_APPROXIMATELY_ZERO <= res)&& (res <=F_APPROXIMATELY_ZERO)));
}
diff --git a/indra/llmath/tests/v3math_test.cpp b/indra/llmath/tests/v3math_test.cpp
index e4732bf861..e4ae1c10ef 100644
--- a/indra/llmath/tests/v3math_test.cpp
+++ b/indra/llmath/tests/v3math_test.cpp
@@ -30,12 +30,12 @@
#include "../test/lltut.h"
#include "llsd.h"
-#include "../llquaternion.h"
-#include "../llquantize.h"
#include "../v3dmath.h"
#include "../m3math.h"
#include "../v4math.h"
#include "../v3math.h"
+#include "../llquaternion.h"
+#include "../llquantize.h"
namespace tut
@@ -149,7 +149,7 @@ namespace tut
F32 x = 2.32f, y = 1.212f, z = -.12f;
LLVector3 vec3(x,y,z);
ensure("1:magVecSquared:Fail ", is_approx_equal(vec3.magVecSquared(), (x*x + y*y + z*z)));
- ensure("2:magVec:Fail ", is_approx_equal(vec3.magVec(), fsqrtf(x*x + y*y + z*z)));
+ ensure("2:magVec:Fail ", is_approx_equal(vec3.magVec(), (F32) sqrt(x*x + y*y + z*z)));
}
template<> template<>
@@ -509,7 +509,7 @@ namespace tut
F32 val1,val2;
LLVector3 vec3(x1,y1,z1),vec3a(x2,y2,z2);
val1 = dist_vec(vec3,vec3a);
- val2 = fsqrtf((x1 - x2)*(x1 - x2) + (y1 - y2)* (y1 - y2) + (z1 - z2)* (z1 -z2));
+ val2 = (F32) sqrt((x1 - x2)*(x1 - x2) + (y1 - y2)* (y1 - y2) + (z1 - z2)* (z1 -z2));
ensure_equals("1:dist_vec: Fail ",val2, val1);
val1 = dist_vec_squared(vec3,vec3a);
val2 =((x1 - x2)*(x1 - x2) + (y1 - y2)* (y1 - y2) + (z1 - z2)* (z1 -z2));
@@ -564,4 +564,22 @@ namespace tut
z1 = U8_to_F32(F32_to_U8(z, lowerz, upperz), lowerz, upperz);
ensure("2:quantize8: Fail ", is_approx_equal(x1, vec3a.mV[VX]) && is_approx_equal(y1, vec3a.mV[VY]) && is_approx_equal(z1, vec3a.mV[VZ]));
}
+
+ template<> template<>
+ void v3math_object::test<35>()
+ {
+ LLSD sd = LLSD::emptyArray();
+ sd[0] = 1.f;
+
+ LLVector3 parsed_1(sd);
+ ensure("1:LLSD parse: Fail ", is_approx_equal(parsed_1.mV[VX], 1.f) && is_approx_equal(parsed_1.mV[VY], 0.f) && is_approx_equal(parsed_1.mV[VZ], 0.f));
+
+ sd[1] = 2.f;
+ LLVector3 parsed_2(sd);
+ ensure("2:LLSD parse: Fail ", is_approx_equal(parsed_2.mV[VX], 1.f) && is_approx_equal(parsed_2.mV[VY], 2.f) && is_approx_equal(parsed_2.mV[VZ], 0.f));
+
+ sd[2] = 3.f;
+ LLVector3 parsed_3(sd);
+ ensure("3:LLSD parse: Fail ", is_approx_equal(parsed_3.mV[VX], 1.f) && is_approx_equal(parsed_3.mV[VY], 2.f) && is_approx_equal(parsed_3.mV[VZ], 3.f));
+ }
}
diff --git a/indra/llmath/tests/v4color_test.cpp b/indra/llmath/tests/v4color_test.cpp
index fbd43625d1..d7eec3c87f 100644
--- a/indra/llmath/tests/v4color_test.cpp
+++ b/indra/llmath/tests/v4color_test.cpp
@@ -155,7 +155,7 @@ namespace tut
F32 r = 0x20, g = 0xFFFF, b = 0xFF;
LLColor4 llcolor4(r,g,b);
ensure("magVecSquared:Fail ", is_approx_equal(llcolor4.magVecSquared(), (r*r + g*g + b*b)));
- ensure("magVec:Fail ", is_approx_equal(llcolor4.magVec(), fsqrtf(r*r + g*g + b*b)));
+ ensure("magVec:Fail ", is_approx_equal(llcolor4.magVec(), (F32) sqrt(r*r + g*g + b*b)));
}
template<> template<>
@@ -164,7 +164,7 @@ namespace tut
F32 r = 0x20, g = 0xFFFF, b = 0xFF;
LLColor4 llcolor4(r,g,b);
F32 vecMag = llcolor4.normVec();
- F32 mag = fsqrtf(r*r + g*g + b*b);
+ F32 mag = (F32) sqrt(r*r + g*g + b*b);
F32 oomag = 1.f / mag;
F32 val1 = r * oomag, val2 = g * oomag, val3 = b * oomag;
ensure("1:normVec failed ", (is_approx_equal(val1, llcolor4.mV[0]) && is_approx_equal(val2, llcolor4.mV[1]) && is_approx_equal(val3, llcolor4.mV[2]) && is_approx_equal(vecMag, mag)));
diff --git a/indra/llmath/tests/v4coloru_test.cpp b/indra/llmath/tests/v4coloru_test.cpp
index 6d84ba41ef..128f6f3564 100644
--- a/indra/llmath/tests/v4coloru_test.cpp
+++ b/indra/llmath/tests/v4coloru_test.cpp
@@ -135,7 +135,7 @@ namespace tut
U8 r = 0x12, g = 0xFF, b = 0xAF;
LLColor4U llcolor4u(r,g,b);
ensure("magVecSquared:Fail ", is_approx_equal(llcolor4u.magVecSquared(), (F32)(r*r + g*g + b*b)));
- ensure("magVec:Fail ", is_approx_equal(llcolor4u.magVec(), fsqrtf(r*r + g*g + b*b)));
+ ensure("magVec:Fail ", is_approx_equal(llcolor4u.magVec(), (F32) sqrt((F32) (r*r + g*g + b*b))));
}
template<> template<>
diff --git a/indra/llmath/tests/v4math_test.cpp b/indra/llmath/tests/v4math_test.cpp
index b1f934e555..191ac864df 100644
--- a/indra/llmath/tests/v4math_test.cpp
+++ b/indra/llmath/tests/v4math_test.cpp
@@ -30,9 +30,9 @@
#include "../test/lltut.h"
#include "llsd.h"
-#include "../llquaternion.h"
#include "../m4math.h"
#include "../v4math.h"
+#include "../llquaternion.h"
namespace tut
{
@@ -96,7 +96,7 @@ namespace tut
{
F32 x = 10.f, y = -2.3f, z = -.023f;
LLVector4 vec4(x,y,z);
- ensure("magVec:Fail ", is_approx_equal(vec4.magVec(), fsqrtf(x*x + y*y + z*z)));
+ ensure("magVec:Fail ", is_approx_equal(vec4.magVec(), (F32) sqrt(x*x + y*y + z*z)));
ensure("magVecSquared:Fail ", is_approx_equal(vec4.magVecSquared(), (x*x + y*y + z*z)));
}
@@ -337,7 +337,7 @@ namespace tut
F32 val1,val2;
LLVector4 vec4(x1,y1,z1),vec4a(x2,y2,z2);
val1 = dist_vec(vec4,vec4a);
- val2 = fsqrtf((x1 - x2)*(x1 - x2) + (y1 - y2)* (y1 - y2) + (z1 - z2)* (z1 -z2));
+ val2 = (F32) sqrt((x1 - x2)*(x1 - x2) + (y1 - y2)* (y1 - y2) + (z1 - z2)* (z1 -z2));
ensure_equals("dist_vec: Fail ",val2, val1);
val1 = dist_vec_squared(vec4,vec4a);
val2 =((x1 - x2)*(x1 - x2) + (y1 - y2)* (y1 - y2) + (z1 - z2)* (z1 -z2));
diff --git a/indra/llmath/v2math.cpp b/indra/llmath/v2math.cpp
index 0180049b5d..a0cd642853 100644
--- a/indra/llmath/v2math.cpp
+++ b/indra/llmath/v2math.cpp
@@ -86,7 +86,7 @@ F32 dist_vec(const LLVector2 &a, const LLVector2 &b)
{
F32 x = a.mV[0] - b.mV[0];
F32 y = a.mV[1] - b.mV[1];
- return fsqrtf( x*x + y*y );
+ return (F32) sqrt( x*x + y*y );
}
F32 dist_vec_squared(const LLVector2 &a, const LLVector2 &b)
@@ -109,3 +109,18 @@ LLVector2 lerp(const LLVector2 &a, const LLVector2 &b, F32 u)
a.mV[VX] + (b.mV[VX] - a.mV[VX]) * u,
a.mV[VY] + (b.mV[VY] - a.mV[VY]) * u );
}
+
+LLSD LLVector2::getValue() const
+{
+ LLSD ret;
+ ret[0] = mV[0];
+ ret[1] = mV[1];
+ return ret;
+}
+
+void LLVector2::setValue(LLSD& sd)
+{
+ mV[0] = (F32) sd[0].asReal();
+ mV[1] = (F32) sd[1].asReal();
+}
+
diff --git a/indra/llmath/v2math.h b/indra/llmath/v2math.h
index f50a5e6633..8d5db96f5e 100644
--- a/indra/llmath/v2math.h
+++ b/indra/llmath/v2math.h
@@ -60,6 +60,9 @@ class LLVector2
void set(const LLVector2 &vec); // Sets LLVector2 to vec
void set(const F32 *vec); // Sets LLVector2 to vec
+ LLSD getValue() const;
+ void setValue(LLSD& sd);
+
void setVec(F32 x, F32 y); // deprecated
void setVec(const LLVector2 &vec); // deprecated
void setVec(const F32 *vec); // deprecated
@@ -216,7 +219,7 @@ inline void LLVector2::setVec(const F32 *vec)
inline F32 LLVector2::length(void) const
{
- return fsqrtf(mV[0]*mV[0] + mV[1]*mV[1]);
+ return (F32) sqrt(mV[0]*mV[0] + mV[1]*mV[1]);
}
inline F32 LLVector2::lengthSquared(void) const
@@ -226,7 +229,7 @@ inline F32 LLVector2::lengthSquared(void) const
inline F32 LLVector2::normalize(void)
{
- F32 mag = fsqrtf(mV[0]*mV[0] + mV[1]*mV[1]);
+ F32 mag = (F32) sqrt(mV[0]*mV[0] + mV[1]*mV[1]);
F32 oomag;
if (mag > FP_MAG_THRESHOLD)
@@ -253,7 +256,7 @@ inline bool LLVector2::isFinite() const
// deprecated
inline F32 LLVector2::magVec(void) const
{
- return fsqrtf(mV[0]*mV[0] + mV[1]*mV[1]);
+ return (F32) sqrt(mV[0]*mV[0] + mV[1]*mV[1]);
}
// deprecated
@@ -265,7 +268,7 @@ inline F32 LLVector2::magVecSquared(void) const
// deprecated
inline F32 LLVector2::normVec(void)
{
- F32 mag = fsqrtf(mV[0]*mV[0] + mV[1]*mV[1]);
+ F32 mag = (F32) sqrt(mV[0]*mV[0] + mV[1]*mV[1]);
F32 oomag;
if (mag > FP_MAG_THRESHOLD)
diff --git a/indra/llmath/v3color.h b/indra/llmath/v3color.h
index 327e452bf7..56cb2ae73e 100644
--- a/indra/llmath/v3color.h
+++ b/indra/llmath/v3color.h
@@ -278,7 +278,7 @@ inline F32 LLColor3::brightness(void) const
inline F32 LLColor3::length(void) const
{
- return fsqrtf(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]);
+ return (F32) sqrt(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]);
}
inline F32 LLColor3::lengthSquared(void) const
@@ -288,7 +288,7 @@ inline F32 LLColor3::lengthSquared(void) const
inline F32 LLColor3::normalize(void)
{
- F32 mag = fsqrtf(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]);
+ F32 mag = (F32) sqrt(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]);
F32 oomag;
if (mag)
@@ -304,7 +304,7 @@ inline F32 LLColor3::normalize(void)
// deprecated
inline F32 LLColor3::magVec(void) const
{
- return fsqrtf(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]);
+ return (F32) sqrt(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]);
}
// deprecated
@@ -316,7 +316,7 @@ inline F32 LLColor3::magVecSquared(void) const
// deprecated
inline F32 LLColor3::normVec(void)
{
- F32 mag = fsqrtf(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]);
+ F32 mag = (F32) sqrt(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]);
F32 oomag;
if (mag)
@@ -438,7 +438,7 @@ inline F32 distVec(const LLColor3 &a, const LLColor3 &b)
F32 x = a.mV[0] - b.mV[0];
F32 y = a.mV[1] - b.mV[1];
F32 z = a.mV[2] - b.mV[2];
- return fsqrtf( x*x + y*y + z*z );
+ return (F32) sqrt( x*x + y*y + z*z );
}
inline F32 distVec_squared(const LLColor3 &a, const LLColor3 &b)
diff --git a/indra/llmath/v3dmath.h b/indra/llmath/v3dmath.h
index 664c986ad0..578dcdc8ea 100644
--- a/indra/llmath/v3dmath.h
+++ b/indra/llmath/v3dmath.h
@@ -234,7 +234,7 @@ inline const LLVector3d& LLVector3d::setVec(const F64 *vec)
inline F64 LLVector3d::normVec(void)
{
- F64 mag = fsqrtf(mdV[0]*mdV[0] + mdV[1]*mdV[1] + mdV[2]*mdV[2]);
+ F64 mag = (F32) sqrt(mdV[0]*mdV[0] + mdV[1]*mdV[1] + mdV[2]*mdV[2]);
F64 oomag;
if (mag > FP_MAG_THRESHOLD)
@@ -256,7 +256,7 @@ inline F64 LLVector3d::normVec(void)
inline F64 LLVector3d::normalize(void)
{
- F64 mag = fsqrtf(mdV[0]*mdV[0] + mdV[1]*mdV[1] + mdV[2]*mdV[2]);
+ F64 mag = (F32) sqrt(mdV[0]*mdV[0] + mdV[1]*mdV[1] + mdV[2]*mdV[2]);
F64 oomag;
if (mag > FP_MAG_THRESHOLD)
@@ -280,7 +280,7 @@ inline F64 LLVector3d::normalize(void)
inline F64 LLVector3d::magVec(void) const
{
- return fsqrtf(mdV[0]*mdV[0] + mdV[1]*mdV[1] + mdV[2]*mdV[2]);
+ return (F32) sqrt(mdV[0]*mdV[0] + mdV[1]*mdV[1] + mdV[2]*mdV[2]);
}
inline F64 LLVector3d::magVecSquared(void) const
@@ -290,7 +290,7 @@ inline F64 LLVector3d::magVecSquared(void) const
inline F64 LLVector3d::length(void) const
{
- return fsqrtf(mdV[0]*mdV[0] + mdV[1]*mdV[1] + mdV[2]*mdV[2]);
+ return (F32) sqrt(mdV[0]*mdV[0] + mdV[1]*mdV[1] + mdV[2]*mdV[2]);
}
inline F64 LLVector3d::lengthSquared(void) const
@@ -400,7 +400,7 @@ inline F64 dist_vec(const LLVector3d &a, const LLVector3d &b)
F64 x = a.mdV[0] - b.mdV[0];
F64 y = a.mdV[1] - b.mdV[1];
F64 z = a.mdV[2] - b.mdV[2];
- return fsqrtf( x*x + y*y + z*z );
+ return (F32) sqrt( x*x + y*y + z*z );
}
inline F64 dist_vec_squared(const LLVector3d &a, const LLVector3d &b)
diff --git a/indra/llmath/v3math.cpp b/indra/llmath/v3math.cpp
index fd08df02d8..e7107dee16 100644
--- a/indra/llmath/v3math.cpp
+++ b/indra/llmath/v3math.cpp
@@ -134,6 +134,21 @@ BOOL LLVector3::clampLength( F32 length_limit )
return changed;
}
+BOOL LLVector3::clamp(const LLVector3 &min_vec, const LLVector3 &max_vec)
+{
+ BOOL ret = FALSE;
+
+ if (mV[0] < min_vec[0]) { mV[0] = min_vec[0]; ret = TRUE; }
+ if (mV[1] < min_vec[1]) { mV[1] = min_vec[1]; ret = TRUE; }
+ if (mV[2] < min_vec[2]) { mV[2] = min_vec[2]; ret = TRUE; }
+
+ if (mV[0] > max_vec[0]) { mV[0] = max_vec[0]; ret = TRUE; }
+ if (mV[1] > max_vec[1]) { mV[1] = max_vec[1]; ret = TRUE; }
+ if (mV[2] > max_vec[2]) { mV[2] = max_vec[2]; ret = TRUE; }
+
+ return ret;
+}
+
// Sets all values to absolute value of their original values
// Returns TRUE if data changed
@@ -191,6 +206,28 @@ const LLVector3& LLVector3::rotVec(const LLQuaternion &q)
return *this;
}
+const LLVector3& LLVector3::transVec(const LLMatrix4& mat)
+{
+ setVec(
+ mV[VX] * mat.mMatrix[VX][VX] +
+ mV[VY] * mat.mMatrix[VX][VY] +
+ mV[VZ] * mat.mMatrix[VX][VZ] +
+ mat.mMatrix[VX][VW],
+
+ mV[VX] * mat.mMatrix[VY][VX] +
+ mV[VY] * mat.mMatrix[VY][VY] +
+ mV[VZ] * mat.mMatrix[VY][VZ] +
+ mat.mMatrix[VY][VW],
+
+ mV[VX] * mat.mMatrix[VZ][VX] +
+ mV[VY] * mat.mMatrix[VZ][VY] +
+ mV[VZ] * mat.mMatrix[VZ][VZ] +
+ mat.mMatrix[VZ][VW]);
+
+ return *this;
+}
+
+
const LLVector3& LLVector3::rotVec(F32 angle, const LLVector3 &vec)
{
if ( !vec.isExactlyZero() && angle )
diff --git a/indra/llmath/v3math.h b/indra/llmath/v3math.h
index dbd38c1c3f..0432aeba4c 100644
--- a/indra/llmath/v3math.h
+++ b/indra/llmath/v3math.h
@@ -34,6 +34,7 @@
class LLVector2;
class LLVector4;
class LLMatrix3;
+class LLMatrix4;
class LLVector3d;
class LLQuaternion;
@@ -69,6 +70,7 @@ class LLVector3
inline BOOL isFinite() const; // checks to see if all values of LLVector3 are finite
BOOL clamp(F32 min, F32 max); // Clamps all values to (min,max), returns TRUE if data changed
+ BOOL clamp(const LLVector3 &min_vec, const LLVector3 &max_vec); // Scales vector by another vector
BOOL clampLength( F32 length_limit ); // Scales vector to limit length to a value
void quantize16(F32 lowerxy, F32 upperxy, F32 lowerz, F32 upperz); // changes the vector to reflect quatization
@@ -109,6 +111,7 @@ class LLVector3
const LLVector3& rotVec(F32 angle, F32 x, F32 y, F32 z); // Rotates about x,y,z by angle radians
const LLVector3& rotVec(const LLMatrix3 &mat); // Rotates by LLMatrix4 mat
const LLVector3& rotVec(const LLQuaternion &q); // Rotates by LLQuaternion q
+ const LLVector3& transVec(const LLMatrix4& mat); // Transforms by LLMatrix4 mat (mat * v)
const LLVector3& scaleVec(const LLVector3& vec); // scales per component by vec
LLVector3 scaledVec(const LLVector3& vec) const; // get a copy of this vector scaled by vec
@@ -156,6 +159,8 @@ F32 dist_vec(const LLVector3 &a, const LLVector3 &b); // Returns distance betwe
F32 dist_vec_squared(const LLVector3 &a, const LLVector3 &b);// Returns distance squared between a and b
F32 dist_vec_squared2D(const LLVector3 &a, const LLVector3 &b);// Returns distance squared between a and b ignoring Z component
LLVector3 projected_vec(const LLVector3 &a, const LLVector3 &b); // Returns vector a projected on vector b
+LLVector3 parallel_component(const LLVector3 &a, const LLVector3 &b); // Returns vector a projected on vector b (same as projected_vec)
+LLVector3 orthogonal_component(const LLVector3 &a, const LLVector3 &b); // Returns component of vector a not parallel to vector b (same as projected_vec)
LLVector3 lerp(const LLVector3 &a, const LLVector3 &b, F32 u); // Returns a vector that is a linear interpolation between a and b
inline LLVector3::LLVector3(void)
@@ -274,7 +279,7 @@ inline void LLVector3::setVec(const F32 *vec)
inline F32 LLVector3::normalize(void)
{
- F32 mag = fsqrtf(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]);
+ F32 mag = (F32) sqrt(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]);
F32 oomag;
if (mag > FP_MAG_THRESHOLD)
@@ -297,7 +302,7 @@ inline F32 LLVector3::normalize(void)
// deprecated
inline F32 LLVector3::normVec(void)
{
- F32 mag = fsqrtf(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]);
+ F32 mag = (F32) sqrt(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]);
F32 oomag;
if (mag > FP_MAG_THRESHOLD)
@@ -321,7 +326,7 @@ inline F32 LLVector3::normVec(void)
inline F32 LLVector3::length(void) const
{
- return fsqrtf(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]);
+ return (F32) sqrt(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]);
}
inline F32 LLVector3::lengthSquared(void) const
@@ -331,7 +336,7 @@ inline F32 LLVector3::lengthSquared(void) const
inline F32 LLVector3::magVec(void) const
{
- return fsqrtf(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]);
+ return (F32) sqrt(mV[0]*mV[0] + mV[1]*mV[1] + mV[2]*mV[2]);
}
inline F32 LLVector3::magVecSquared(void) const
@@ -465,7 +470,7 @@ inline F32 dist_vec(const LLVector3 &a, const LLVector3 &b)
F32 x = a.mV[0] - b.mV[0];
F32 y = a.mV[1] - b.mV[1];
F32 z = a.mV[2] - b.mV[2];
- return fsqrtf( x*x + y*y + z*z );
+ return (F32) sqrt( x*x + y*y + z*z );
}
inline F32 dist_vec_squared(const LLVector3 &a, const LLVector3 &b)
@@ -490,6 +495,17 @@ inline LLVector3 projected_vec(const LLVector3 &a, const LLVector3 &b)
return project_axis * (a * project_axis);
}
+inline LLVector3 parallel_component(const LLVector3 &a, const LLVector3 &b)
+{
+ return projected_vec(a, b);
+}
+
+inline LLVector3 orthogonal_component(const LLVector3 &a, const LLVector3 &b)
+{
+ return a - projected_vec(a, b);
+}
+
+
inline LLVector3 lerp(const LLVector3 &a, const LLVector3 &b, F32 u)
{
return LLVector3(
@@ -523,6 +539,21 @@ inline void update_min_max(LLVector3& min, LLVector3& max, const LLVector3& pos)
}
}
+inline void update_min_max(LLVector3& min, LLVector3& max, const F32* pos)
+{
+ for (U32 i = 0; i < 3; i++)
+ {
+ if (min.mV[i] > pos[i])
+ {
+ min.mV[i] = pos[i];
+ }
+ if (max.mV[i] < pos[i])
+ {
+ max.mV[i] = pos[i];
+ }
+ }
+}
+
inline F32 angle_between(const LLVector3& a, const LLVector3& b)
{
LLVector3 an = a;
diff --git a/indra/llmath/v4color.h b/indra/llmath/v4color.h
index 60d24e2e11..b047f86e6e 100644
--- a/indra/llmath/v4color.h
+++ b/indra/llmath/v4color.h
@@ -108,6 +108,7 @@ class LLColor4
const LLColor4& operator=(const LLColor3 &a); // Assigns vec3 to vec4 and returns vec4
+ bool operator<(const LLColor4& rhs) const;
friend std::ostream& operator<<(std::ostream& s, const LLColor4 &a); // Print a
friend LLColor4 operator+(const LLColor4 &a, const LLColor4 &b); // Return vector a + b
friend LLColor4 operator-(const LLColor4 &a, const LLColor4 &b); // Return vector a minus b
@@ -385,7 +386,7 @@ inline const LLColor4& LLColor4::setAlpha(F32 a)
inline F32 LLColor4::length(void) const
{
- return fsqrtf(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);
+ return (F32) sqrt(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);
}
inline F32 LLColor4::lengthSquared(void) const
@@ -395,7 +396,7 @@ inline F32 LLColor4::lengthSquared(void) const
inline F32 LLColor4::normalize(void)
{
- F32 mag = fsqrtf(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);
+ F32 mag = (F32) sqrt(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);
F32 oomag;
if (mag)
@@ -411,7 +412,7 @@ inline F32 LLColor4::normalize(void)
// deprecated
inline F32 LLColor4::magVec(void) const
{
- return fsqrtf(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);
+ return (F32) sqrt(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);
}
// deprecated
@@ -423,7 +424,7 @@ inline F32 LLColor4::magVecSquared(void) const
// deprecated
inline F32 LLColor4::normVec(void)
{
- F32 mag = fsqrtf(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);
+ F32 mag = (F32) sqrt(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);
F32 oomag;
if (mag)
@@ -589,6 +590,23 @@ inline LLColor4 lerp(const LLColor4 &a, const LLColor4 &b, F32 u)
a.mV[VW] + (b.mV[VW] - a.mV[VW]) * u);
}
+inline bool LLColor4::operator<(const LLColor4& rhs) const
+{
+ if (mV[0] != rhs.mV[0])
+ {
+ return mV[0] < rhs.mV[0];
+ }
+ if (mV[1] != rhs.mV[1])
+ {
+ return mV[1] < rhs.mV[1];
+ }
+ if (mV[2] != rhs.mV[2])
+ {
+ return mV[2] < rhs.mV[2];
+ }
+
+ return mV[3] < rhs.mV[3];
+}
void LLColor4::clamp()
{
diff --git a/indra/llmath/v4coloru.h b/indra/llmath/v4coloru.h
index 7471aebe02..12da7e2dd7 100644
--- a/indra/llmath/v4coloru.h
+++ b/indra/llmath/v4coloru.h
@@ -294,7 +294,7 @@ inline const LLColor4U& LLColor4U::setAlpha(U8 a)
inline F32 LLColor4U::length(void) const
{
- return fsqrtf( ((F32)mV[VX]) * mV[VX] + ((F32)mV[VY]) * mV[VY] + ((F32)mV[VZ]) * mV[VZ] );
+ return (F32) sqrt( ((F32)mV[VX]) * mV[VX] + ((F32)mV[VY]) * mV[VY] + ((F32)mV[VZ]) * mV[VZ] );
}
inline F32 LLColor4U::lengthSquared(void) const
@@ -305,7 +305,7 @@ inline F32 LLColor4U::lengthSquared(void) const
// deprecated
inline F32 LLColor4U::magVec(void) const
{
- return fsqrtf( ((F32)mV[VX]) * mV[VX] + ((F32)mV[VY]) * mV[VY] + ((F32)mV[VZ]) * mV[VZ] );
+ return (F32) sqrt( ((F32)mV[VX]) * mV[VX] + ((F32)mV[VY]) * mV[VY] + ((F32)mV[VZ]) * mV[VZ] );
}
// deprecated
diff --git a/indra/llmath/v4math.h b/indra/llmath/v4math.h
index e7028626f9..623c8b2003 100644
--- a/indra/llmath/v4math.h
+++ b/indra/llmath/v4math.h
@@ -315,7 +315,7 @@ inline void LLVector4::setVec(const F32 *vec)
inline F32 LLVector4::length(void) const
{
- return fsqrtf(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);
+ return (F32) sqrt(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);
}
inline F32 LLVector4::lengthSquared(void) const
@@ -325,7 +325,7 @@ inline F32 LLVector4::lengthSquared(void) const
inline F32 LLVector4::magVec(void) const
{
- return fsqrtf(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);
+ return (F32) sqrt(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);
}
inline F32 LLVector4::magVecSquared(void) const
@@ -457,7 +457,7 @@ inline LLVector4 lerp(const LLVector4 &a, const LLVector4 &b, F32 u)
inline F32 LLVector4::normalize(void)
{
- F32 mag = fsqrtf(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);
+ F32 mag = (F32) sqrt(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);
F32 oomag;
if (mag > FP_MAG_THRESHOLD)
@@ -480,7 +480,7 @@ inline F32 LLVector4::normalize(void)
// deprecated
inline F32 LLVector4::normVec(void)
{
- F32 mag = fsqrtf(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);
+ F32 mag = (F32) sqrt(mV[VX]*mV[VX] + mV[VY]*mV[VY] + mV[VZ]*mV[VZ]);
F32 oomag;
if (mag > FP_MAG_THRESHOLD)
diff --git a/indra/llmath/xform.h b/indra/llmath/xform.h
index 5159c1cbfe..1b50749b3e 100644
--- a/indra/llmath/xform.h
+++ b/indra/llmath/xform.h
@@ -32,11 +32,11 @@
const F32 MAX_OBJECT_Z = 4096.f; // should match REGION_HEIGHT_METERS, Pre-havok4: 768.f
const F32 MIN_OBJECT_Z = -256.f;
-const F32 DEFAULT_MAX_PRIM_SCALE = 10.f;
+const F32 DEFAULT_MAX_PRIM_SCALE = 64.f;
+const F32 DEFAULT_MAX_PRIM_SCALE_NO_MESH = 10.f;
const F32 MIN_PRIM_SCALE = 0.01f;
const F32 MAX_PRIM_SCALE = 65536.f; // something very high but not near FLT_MAX
-
class LLXform
{
protected:
diff --git a/indra/llmessage/CMakeLists.txt b/indra/llmessage/CMakeLists.txt
index 1cad0f6d22..0f40a670fa 100644
--- a/indra/llmessage/CMakeLists.txt
+++ b/indra/llmessage/CMakeLists.txt
@@ -10,7 +10,9 @@ include(LLMath)
include(LLMessage)
include(LLVFS)
include(LLAddBuildTest)
+include(Python)
include(Tut)
+include(Python)
include_directories (${CMAKE_CURRENT_SOURCE_DIR})
@@ -63,6 +65,7 @@ set(llmessage_SOURCE_FILES
llpacketbuffer.cpp
llpacketring.cpp
llpartdata.cpp
+ llproxy.cpp
llpumpio.cpp
llregionpresenceverifier.cpp
llsdappservices.cpp
@@ -159,6 +162,7 @@ set(llmessage_HEADER_FILES
llpacketring.h
llpartdata.h
llpumpio.h
+ llproxy.h
llqueryflags.h
llregionflags.h
llregionhandle.h
diff --git a/indra/llmessage/llassetstorage.cpp b/indra/llmessage/llassetstorage.cpp
index b26d412e9f..9b86daebe5 100644
--- a/indra/llmessage/llassetstorage.cpp
+++ b/indra/llmessage/llassetstorage.cpp
@@ -149,8 +149,8 @@ void LLAssetInfo::setFromNameValue( const LLNameValue& nv )
setName( buf );
buf.assign( str, pos2, std::string::npos );
setDescription( buf );
- llinfos << "uuid: " << mUuid << llendl;
- llinfos << "creator: " << mCreatorID << llendl;
+ LL_DEBUGS("AssetStorage") << "uuid: " << mUuid << llendl;
+ LL_DEBUGS("AssetStorage") << "creator: " << mCreatorID << llendl;
}
///----------------------------------------------------------------------------
@@ -398,6 +398,12 @@ BOOL LLAssetStorage::hasLocalAsset(const LLUUID &uuid, const LLAssetType::EType
bool LLAssetStorage::findInStaticVFSAndInvokeCallback(const LLUUID& uuid, LLAssetType::EType type,
LLGetAssetCallback callback, void *user_data)
{
+ if (user_data)
+ {
+ // The *user_data should not be passed without a callback to clean it up.
+ llassert(callback != NULL)
+ }
+
BOOL exists = mStaticVFS->getExists(uuid, type);
if (exists)
{
@@ -428,19 +434,30 @@ bool LLAssetStorage::findInStaticVFSAndInvokeCallback(const LLUUID& uuid, LLAsse
// IW - uuid is passed by value to avoid side effects, please don't re-add &
void LLAssetStorage::getAssetData(const LLUUID uuid, LLAssetType::EType type, LLGetAssetCallback callback, void *user_data, BOOL is_priority)
{
- lldebugs << "LLAssetStorage::getAssetData() - " << uuid << "," << LLAssetType::lookup(type) << llendl;
+ LL_DEBUGS("AssetStorage") << "LLAssetStorage::getAssetData() - " << uuid << "," << LLAssetType::lookup(type) << llendl;
- llinfos << "ASSET_TRACE requesting " << uuid << " type " << LLAssetType::lookup(type) << llendl;
+ LL_DEBUGS("AssetStorage") << "ASSET_TRACE requesting " << uuid << " type " << LLAssetType::lookup(type) << llendl;
+
+ if (user_data)
+ {
+ // The *user_data should not be passed without a callback to clean it up.
+ llassert(callback != NULL)
+ }
if (mShutDown)
{
- llinfos << "ASSET_TRACE cancelled " << uuid << " type " << LLAssetType::lookup(type) << " shutting down" << llendl;
- return; // don't get the asset or do any callbacks, we are shutting down
+ LL_DEBUGS("AssetStorage") << "ASSET_TRACE cancelled " << uuid << " type " << LLAssetType::lookup(type) << " shutting down" << llendl;
+
+ if (callback)
+ {
+ callback(mVFS, uuid, type, user_data, LL_ERR_ASSET_REQUEST_FAILED, LL_EXSTAT_NONE);
+ }
+ return;
}
-
+
if (uuid.isNull())
{
- // Special case early out for NULL uuid
+ // Special case early out for NULL uuid and for shutting down
if (callback)
{
callback(mVFS, uuid, type, user_data, LL_ERR_ASSET_REQUEST_NOT_IN_DATABASE, LL_EXSTAT_NULL_UUID);
@@ -451,7 +468,7 @@ void LLAssetStorage::getAssetData(const LLUUID uuid, LLAssetType::EType type, LL
// Try static VFS first.
if (findInStaticVFSAndInvokeCallback(uuid,type,callback,user_data))
{
- llinfos << "ASSET_TRACE asset " << uuid << " found in static VFS" << llendl;
+ LL_DEBUGS("AssetStorage") << "ASSET_TRACE asset " << uuid << " found in static VFS" << llendl;
return;
}
@@ -469,7 +486,7 @@ void LLAssetStorage::getAssetData(const LLUUID uuid, LLAssetType::EType type, LL
callback(mVFS, uuid, type, user_data, LL_ERR_NOERR, LL_EXSTAT_VFS_CACHED);
}
- llinfos << "ASSET_TRACE asset " << uuid << " found in VFS" << llendl;
+ LL_DEBUGS("AssetStorage") << "ASSET_TRACE asset " << uuid << " found in VFS" << llendl;
}
else
{
@@ -503,7 +520,7 @@ void LLAssetStorage::getAssetData(const LLUUID uuid, LLAssetType::EType type, LL
}
if (duplicate)
{
- llinfos << "Adding additional non-duplicate request for asset " << uuid
+ LL_DEBUGS("AssetStorage") << "Adding additional non-duplicate request for asset " << uuid
<< "." << LLAssetType::lookup(type) << llendl;
}
@@ -513,6 +530,10 @@ void LLAssetStorage::getAssetData(const LLUUID uuid, LLAssetType::EType type, LL
}
+//
+// *NOTE: Logic here is replicated in LLViewerAssetStorage::_queueDataRequest.
+// Changes here may need to be replicated in the viewer's derived class.
+//
void LLAssetStorage::_queueDataRequest(const LLUUID& uuid, LLAssetType::EType atype,
LLGetAssetCallback callback,
void *user_data, BOOL duplicate,
@@ -540,7 +561,7 @@ void LLAssetStorage::_queueDataRequest(const LLUUID& uuid, LLAssetType::EType at
tpvf.setAsset(uuid, atype);
tpvf.setCallback(downloadCompleteCallback, req);
- llinfos << "Starting transfer for " << uuid << llendl;
+ //llinfos << "Starting transfer for " << uuid << llendl;
LLTransferTargetChannel *ttcp = gTransferManager.getTargetChannel(mUpstreamHost, LLTCT_ASSET);
ttcp->requestTransfer(spa, tpvf, 100.f + (is_priority ? 1.f : 0.f));
}
@@ -563,9 +584,9 @@ void LLAssetStorage::downloadCompleteCallback(
LLAssetType::EType file_type,
void* user_data, LLExtStat ext_status)
{
- llinfos << "ASSET_TRACE asset " << file_id << " downloadCompleteCallback" << llendl;
+ LL_DEBUGS("AssetStorage") << "ASSET_TRACE asset " << file_id << " downloadCompleteCallback" << llendl;
- lldebugs << "LLAssetStorage::downloadCompleteCallback() for " << file_id
+ LL_DEBUGS("AssetStorage") << "LLAssetStorage::downloadCompleteCallback() for " << file_id
<< "," << LLAssetType::lookup(file_type) << llendl;
LLAssetRequest* req = (LLAssetRequest*)user_data;
if(!req)
@@ -710,7 +731,7 @@ void LLAssetStorage::getEstateAsset(const LLHost &object_sim, const LLUUID &agen
tpvf.setAsset(asset_id, atype);
tpvf.setCallback(downloadEstateAssetCompleteCallback, req);
- llinfos << "Starting transfer for " << asset_id << llendl;
+ LL_DEBUGS("AssetStorage") << "Starting transfer for " << asset_id << llendl;
LLTransferTargetChannel *ttcp = gTransferManager.getTargetChannel(source_host, LLTCT_ASSET);
ttcp->requestTransfer(spe, tpvf, 100.f + (is_priority ? 1.f : 0.f));
}
@@ -850,7 +871,7 @@ void LLAssetStorage::getInvItemAsset(const LLHost &object_sim, const LLUUID &age
tpvf.setAsset(asset_id, atype);
tpvf.setCallback(downloadInvItemCompleteCallback, req);
- llinfos << "Starting transfer for inventory asset "
+ LL_DEBUGS("AssetStorage") << "Starting transfer for inventory asset "
<< item_id << " owned by " << owner_id << "," << task_id
<< llendl;
LLTransferTargetChannel *ttcp = gTransferManager.getTargetChannel(source_host, LLTCT_ASSET);
@@ -1190,7 +1211,7 @@ bool LLAssetStorage::deletePendingRequest(LLAssetStorage::ERequestType rt,
request_list_t* requests = getRequestList(rt);
if (deletePendingRequestImpl(requests, asset_type, asset_id))
{
- llinfos << "Asset " << getRequestName(rt) << " request for "
+ LL_DEBUGS("AssetStorage") << "Asset " << getRequestName(rt) << " request for "
<< asset_id << "." << LLAssetType::lookup(asset_type)
<< " removed from pending queue." << llendl;
return true;
@@ -1286,7 +1307,7 @@ void LLAssetStorage::getAssetData(const LLUUID uuid, LLAssetType::EType type, vo
user_data == ((LLLegacyAssetRequest *)tmp->mUserData)->mUserData)
{
// this is a duplicate from the same subsystem - throw it away
- llinfos << "Discarding duplicate request for UUID " << uuid << llendl;
+ LL_DEBUGS("AssetStorage") << "Discarding duplicate request for UUID " << uuid << llendl;
return;
}
}
@@ -1469,7 +1490,7 @@ void LLAssetStorage::reportMetric( const LLUUID& asset_id, const LLAssetType::ET
{
if( !metric_recipient )
{
- llinfos << "Couldn't store LLAssetStoreage::reportMetric - no metrics_recipient" << llendl;
+ LL_DEBUGS("AssetStorage") << "Couldn't store LLAssetStoreage::reportMetric - no metrics_recipient" << llendl;
return;
}
diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp
index 7396117d84..97f2792686 100644
--- a/indra/llmessage/llavatarnamecache.cpp
+++ b/indra/llmessage/llavatarnamecache.cpp
@@ -81,8 +81,11 @@ namespace LLAvatarNameCache
// only need per-frame timing resolution
LLFrameTimer sRequestTimer;
- // Periodically clean out expired entries from the cache
- //LLFrameTimer sEraseExpiredTimer;
+ /// Maximum time an unrefreshed cache entry is allowed
+ const F64 MAX_UNREFRESHED_TIME = 20.0 * 60.0;
+
+ /// Time when unrefreshed cached names were checked last
+ static F64 sLastExpireCheck;
//-----------------------------------------------------------------------
// Internal methods
@@ -99,8 +102,9 @@ namespace LLAvatarNameCache
// Legacy name system callback
void legacyNameCallback(const LLUUID& agent_id,
- const std::string& full_name,
- bool is_group);
+ const std::string& full_name,
+ bool is_group
+ );
void requestNamesViaLegacy();
@@ -117,7 +121,7 @@ namespace LLAvatarNameCache
bool isRequestPending(const LLUUID& agent_id);
// Erase expired names from cache
- void eraseExpired();
+ void eraseUnrefreshed();
bool expirationFromCacheControl(LLSD headers, F64 *expires);
}
@@ -187,6 +191,7 @@ public:
{
// Pull expiration out of headers if available
F64 expires = LLAvatarNameCache::nameExpirationFromHeaders(mHeaders);
+ F64 now = LLFrameTimer::getTotalSeconds();
LLSD agents = content["agents"];
LLSD::array_const_iterator it = agents.beginArray();
@@ -207,90 +212,91 @@ public:
av_name.mDisplayName = av_name.mUsername;
}
+ LL_DEBUGS("AvNameCache") << "LLAvatarNameResponder::result for " << agent_id << " "
+ << "user '" << av_name.mUsername << "' "
+ << "display '" << av_name.mDisplayName << "' "
+ << "expires in " << expires - now << " seconds"
+ << LL_ENDL;
+
// cache it and fire signals
LLAvatarNameCache::processName(agent_id, av_name, true);
}
// Same logic as error response case
LLSD unresolved_agents = content["bad_ids"];
- if (unresolved_agents.size() > 0)
+ S32 num_unresolved = unresolved_agents.size();
+ if (num_unresolved > 0)
{
- const std::string DUMMY_NAME("\?\?\?");
- LLAvatarName av_name;
- av_name.mUsername = DUMMY_NAME;
- av_name.mDisplayName = DUMMY_NAME;
- av_name.mIsDisplayNameDefault = false;
- av_name.mIsDummy = true;
- av_name.mExpires = expires;
-
+ LL_WARNS("AvNameCache") << "LLAvatarNameResponder::result " << num_unresolved << " unresolved ids; "
+ << "expires in " << expires - now << " seconds"
+ << LL_ENDL;
it = unresolved_agents.beginArray();
for ( ; it != unresolved_agents.endArray(); ++it)
{
const LLUUID& agent_id = *it;
- // cache it and fire signals
- LLAvatarNameCache::processName(agent_id, av_name, true);
+
+ LL_WARNS("AvNameCache") << "LLAvatarNameResponder::result "
+ << "failed id " << agent_id
+ << LL_ENDL;
+
+ LLAvatarNameCache::handleAgentError(agent_id);
}
}
- }
+ LL_DEBUGS("AvNameCache") << "LLAvatarNameResponder::result "
+ << LLAvatarNameCache::sCache.size() << " cached names"
+ << LL_ENDL;
+ }
/*virtual*/ void error(U32 status, const std::string& reason)
{
- // We're going to construct a dummy record and cache it for a while,
- // either briefly for a 503 Service Unavailable, or longer for other
- // errors.
- F64 retry_timestamp = errorRetryTimestamp(status);
-
- // *NOTE: "??" starts trigraphs in C/C++, escape the question marks.
- const std::string DUMMY_NAME("\?\?\?");
- LLAvatarName av_name;
- av_name.mUsername = DUMMY_NAME;
- av_name.mDisplayName = DUMMY_NAME;
- av_name.mIsDisplayNameDefault = false;
- av_name.mIsDummy = true;
- av_name.mExpires = retry_timestamp;
-
- // Add dummy records for all agent IDs in this request
+ // If there's an error, it might be caused by PeopleApi,
+ // or when loading textures on startup and using a very slow
+ // network, this query may time out.
+ // What we should do depends on whether or not we have a cached name
+ LL_WARNS("AvNameCache") << "LLAvatarNameResponder::error " << status << " " << reason
+ << LL_ENDL;
+
+ // Add dummy records for any agent IDs in this request that we do not have cached already
std::vector<LLUUID>::const_iterator it = mAgentIDs.begin();
for ( ; it != mAgentIDs.end(); ++it)
{
const LLUUID& agent_id = *it;
- // cache it and fire signals
- LLAvatarNameCache::processName(agent_id, av_name, true);
- }
- }
-
- // Return time to retry a request that generated an error, based on
- // error type and headers. Return value is seconds-since-epoch.
- F64 errorRetryTimestamp(S32 status)
- {
- F64 now = LLFrameTimer::getTotalSeconds();
-
- // Retry-After takes priority
- LLSD retry_after = mHeaders["retry-after"];
- if (retry_after.isDefined())
- {
- // We only support the delta-seconds type
- S32 delta_seconds = retry_after.asInteger();
- if (delta_seconds > 0)
- {
- // ...valid delta-seconds
- return now + F64(delta_seconds);
- }
+ LLAvatarNameCache::handleAgentError(agent_id);
}
-
- // If no Retry-After, look for Cache-Control max-age
- F64 expires = 0.0;
- if (LLAvatarNameCache::expirationFromCacheControl(mHeaders, &expires))
- {
- return expires;
- }
-
- // No information in header, make a guess
- const F64 DEFAULT_DELAY = 120.0; // 2 mintues
- return now + DEFAULT_DELAY;
}
};
+// Provide some fallback for agents that return errors
+void LLAvatarNameCache::handleAgentError(const LLUUID& agent_id)
+{
+ std::map<LLUUID,LLAvatarName>::iterator existing = sCache.find(agent_id);
+ if (existing == sCache.end())
+ {
+ // there is no existing cache entry, so make a temporary name from legacy
+ LL_WARNS("AvNameCache") << "LLAvatarNameCache get legacy for agent "
+ << agent_id << LL_ENDL;
+ gCacheName->get(agent_id, false, // legacy compatibility
+ boost::bind(&LLAvatarNameCache::legacyNameCallback,
+ _1, _2, _3));
+ }
+ else
+ {
+ // we have a chached (but probably expired) entry - since that would have
+ // been returned by the get method, there is no need to signal anyone
+
+ // Clear this agent from the pending list
+ LLAvatarNameCache::sPendingQueue.erase(agent_id);
+
+ const LLAvatarName& av_name = existing->second;
+ LL_DEBUGS("AvNameCache") << "LLAvatarNameCache use cache for agent "
+ << agent_id
+ << "user '" << av_name.mUsername << "' "
+ << "display '" << av_name.mDisplayName << "' "
+ << "expires in " << av_name.mExpires - LLFrameTimer::getTotalSeconds() << " seconds"
+ << LL_ENDL;
+ }
+}
+
void LLAvatarNameCache::processName(const LLUUID& agent_id,
const LLAvatarName& av_name,
bool add_to_cache)
@@ -332,6 +338,7 @@ void LLAvatarNameCache::requestNamesViaCapability()
std::vector<LLUUID> agent_ids;
agent_ids.reserve(128);
+ U32 ids = 0;
ask_queue_t::const_iterator it = sAskQueue.begin();
for ( ; it != sAskQueue.end(); ++it)
{
@@ -342,11 +349,13 @@ void LLAvatarNameCache::requestNamesViaCapability()
// ...starting new request
url += sNameLookupURL;
url += "?ids=";
+ ids = 1;
}
else
{
// ...continuing existing request
url += "&ids=";
+ ids++;
}
url += agent_id.asString();
agent_ids.push_back(agent_id);
@@ -356,7 +365,9 @@ void LLAvatarNameCache::requestNamesViaCapability()
if (url.size() > NAME_URL_SEND_THRESHOLD)
{
- //llinfos << "requestNames " << url << llendl;
+ LL_DEBUGS("AvNameCache") << "LLAvatarNameCache::requestNamesViaCapability first "
+ << ids << " ids"
+ << LL_ENDL;
LLHTTPClient::get(url, new LLAvatarNameResponder(agent_ids));
url.clear();
agent_ids.clear();
@@ -365,7 +376,9 @@ void LLAvatarNameCache::requestNamesViaCapability()
if (!url.empty())
{
- //llinfos << "requestNames " << url << llendl;
+ LL_DEBUGS("AvNameCache") << "LLAvatarNameCache::requestNamesViaCapability all "
+ << ids << " ids"
+ << LL_ENDL;
LLHTTPClient::get(url, new LLAvatarNameResponder(agent_ids));
url.clear();
agent_ids.clear();
@@ -382,6 +395,11 @@ void LLAvatarNameCache::legacyNameCallback(const LLUUID& agent_id,
// Construct a dummy record for this name. By convention, SLID is blank
// Never expires, but not written to disk, so lasts until end of session.
LLAvatarName av_name;
+ LL_DEBUGS("AvNameCache") << "LLAvatarNameCache::legacyNameCallback "
+ << "agent " << agent_id << " "
+ << "full name '" << full_name << "'"
+ << ( is_group ? " [group]" : "" )
+ << LL_ENDL;
buildLegacyName(full_name, &av_name);
// Don't add to cache, the data already exists in the legacy name system
@@ -403,6 +421,8 @@ void LLAvatarNameCache::requestNamesViaLegacy()
// invoked below. This should never happen in practice.
sPendingQueue[agent_id] = now;
+ LL_DEBUGS("AvNameCache") << "LLAvatarNameCache::requestNamesViaLegacy agent " << agent_id << LL_ENDL;
+
gCacheName->get(agent_id, false, // legacy compatibility
boost::bind(&LLAvatarNameCache::legacyNameCallback,
_1, _2, _3));
@@ -441,21 +461,24 @@ void LLAvatarNameCache::importFile(std::istream& istr)
av_name.fromLLSD( it->second );
sCache[agent_id] = av_name;
}
- // entries may have expired since we last ran the viewer, just
- // clean them out now
- eraseExpired();
- llinfos << "loaded " << sCache.size() << llendl;
+ LL_INFOS("AvNameCache") << "loaded " << sCache.size() << LL_ENDL;
+
+ // Some entries may have expired since the cache was stored,
+ // but they will be flushed in the first call to eraseUnrefreshed
+ // from LLAvatarNameResponder::idle
}
void LLAvatarNameCache::exportFile(std::ostream& ostr)
{
LLSD agents;
+ F64 max_unrefreshed = LLFrameTimer::getTotalSeconds() - MAX_UNREFRESHED_TIME;
cache_t::const_iterator it = sCache.begin();
for ( ; it != sCache.end(); ++it)
{
const LLUUID& agent_id = it->first;
const LLAvatarName& av_name = it->second;
- if (!av_name.mIsDummy)
+ // Do not write temporary or expired entries to the stored cache
+ if (!av_name.mIsTemporaryName && av_name.mExpires >= max_unrefreshed)
{
// key must be a string
agents[agent_id.asString()] = av_name.asLLSD();
@@ -490,62 +513,65 @@ void LLAvatarNameCache::idle()
// return;
//}
- // Must be large relative to above
-
- // No longer deleting expired entries, just re-requesting in the get
- // this way first synchronous get call on an expired entry won't return
- // legacy name. LF
-
- //const F32 ERASE_EXPIRED_TIMEOUT = 60.f; // seconds
- //if (sEraseExpiredTimer.checkExpirationAndReset(ERASE_EXPIRED_TIMEOUT))
- //{
- // eraseExpired();
- //}
-
- if (sAskQueue.empty())
+ if (!sAskQueue.empty())
{
- return;
+ if (useDisplayNames())
+ {
+ requestNamesViaCapability();
+ }
+ else
+ {
+ // ...fall back to legacy name cache system
+ requestNamesViaLegacy();
+ }
}
- if (useDisplayNames())
- {
- requestNamesViaCapability();
- }
- else
- {
- // ...fall back to legacy name cache system
- requestNamesViaLegacy();
- }
+ // erase anything that has not been refreshed for more than MAX_UNREFRESHED_TIME
+ eraseUnrefreshed();
}
bool LLAvatarNameCache::isRequestPending(const LLUUID& agent_id)
{
+ bool isPending = false;
const F64 PENDING_TIMEOUT_SECS = 5.0 * 60.0;
- F64 now = LLFrameTimer::getTotalSeconds();
- F64 expire_time = now - PENDING_TIMEOUT_SECS;
pending_queue_t::const_iterator it = sPendingQueue.find(agent_id);
if (it != sPendingQueue.end())
{
- bool request_expired = (it->second < expire_time);
- return !request_expired;
+ // in the list of requests in flight, retry if too old
+ F64 expire_time = LLFrameTimer::getTotalSeconds() - PENDING_TIMEOUT_SECS;
+ isPending = (it->second > expire_time);
}
- return false;
+ return isPending;
}
-void LLAvatarNameCache::eraseExpired()
+void LLAvatarNameCache::eraseUnrefreshed()
{
F64 now = LLFrameTimer::getTotalSeconds();
- cache_t::iterator it = sCache.begin();
- while (it != sCache.end())
- {
- cache_t::iterator cur = it;
- ++it;
- const LLAvatarName& av_name = cur->second;
- if (av_name.mExpires < now)
- {
- sCache.erase(cur);
- }
+ F64 max_unrefreshed = now - MAX_UNREFRESHED_TIME;
+
+ if (!sLastExpireCheck || sLastExpireCheck < max_unrefreshed)
+ {
+ sLastExpireCheck = now;
+
+ for (cache_t::iterator it = sCache.begin(); it != sCache.end();)
+ {
+ const LLAvatarName& av_name = it->second;
+ if (av_name.mExpires < max_unrefreshed)
+ {
+ const LLUUID& agent_id = it->first;
+ LL_DEBUGS("AvNameCache") << agent_id
+ << " user '" << av_name.mUsername << "' "
+ << "expired " << now - av_name.mExpires << " secs ago"
+ << LL_ENDL;
+ sCache.erase(it++);
+ }
+ else
+ {
+ ++it;
+ }
+ }
+ LL_INFOS("AvNameCache") << sCache.size() << " cached avatar names" << LL_ENDL;
}
}
@@ -556,8 +582,11 @@ void LLAvatarNameCache::buildLegacyName(const std::string& full_name,
av_name->mUsername = "";
av_name->mDisplayName = full_name;
av_name->mIsDisplayNameDefault = true;
- av_name->mIsDummy = true;
- av_name->mExpires = F64_MAX;
+ av_name->mIsTemporaryName = true;
+ av_name->mExpires = F64_MAX; // not used because these are not cached
+ LL_DEBUGS("AvNameCache") << "LLAvatarNameCache::buildLegacyName "
+ << full_name
+ << LL_ENDL;
}
// fills in av_name if it has it in the cache, even if expired (can check expiry time)
@@ -580,6 +609,9 @@ bool LLAvatarNameCache::get(const LLUUID& agent_id, LLAvatarName *av_name)
{
if (!isRequestPending(agent_id))
{
+ LL_DEBUGS("AvNameCache") << "LLAvatarNameCache::get "
+ << "refresh agent " << agent_id
+ << LL_ENDL;
sAskQueue.insert(agent_id);
}
}
@@ -601,6 +633,9 @@ bool LLAvatarNameCache::get(const LLUUID& agent_id, LLAvatarName *av_name)
if (!isRequestPending(agent_id))
{
+ LL_DEBUGS("AvNameCache") << "LLAvatarNameCache::get "
+ << "queue request for agent " << agent_id
+ << LL_ENDL;
sAskQueue.insert(agent_id);
}
@@ -633,7 +668,6 @@ void LLAvatarNameCache::get(const LLUUID& agent_id, callback_slot_t slot)
{
// ...name already exists in cache, fire callback now
fireSignal(agent_id, slot, av_name);
-
return;
}
}
@@ -729,6 +763,9 @@ F64 LLAvatarNameCache::nameExpirationFromHeaders(LLSD headers)
bool LLAvatarNameCache::expirationFromCacheControl(LLSD headers, F64 *expires)
{
+ bool fromCacheControl = false;
+ F64 now = LLFrameTimer::getTotalSeconds();
+
// Allow the header to override the default
LLSD cache_control_header = headers["cache-control"];
if (cache_control_header.isDefined())
@@ -737,12 +774,16 @@ bool LLAvatarNameCache::expirationFromCacheControl(LLSD headers, F64 *expires)
std::string cache_control = cache_control_header.asString();
if (max_age_from_cache_control(cache_control, &max_age))
{
- F64 now = LLFrameTimer::getTotalSeconds();
*expires = now + (F64)max_age;
- return true;
+ fromCacheControl = true;
}
}
- return false;
+ LL_DEBUGS("AvNameCache")
+ << ( fromCacheControl ? "expires based on cache control " : "default expiration " )
+ << "in " << *expires - now << " seconds"
+ << LL_ENDL;
+
+ return fromCacheControl;
}
diff --git a/indra/llmessage/llavatarnamecache.h b/indra/llmessage/llavatarnamecache.h
index 8f21ace96a..59c1329ffa 100644
--- a/indra/llmessage/llavatarnamecache.h
+++ b/indra/llmessage/llavatarnamecache.h
@@ -82,6 +82,9 @@ namespace LLAvatarNameCache
void erase(const LLUUID& agent_id);
+ /// Provide some fallback for agents that return errors
+ void handleAgentError(const LLUUID& agent_id);
+
// Force a re-fetch of the most recent data, but keep the current
// data in cache
void fetch(const LLUUID& agent_id);
diff --git a/indra/llmessage/llbuffer.cpp b/indra/llmessage/llbuffer.cpp
index 0316797f00..250cace6e9 100644
--- a/indra/llmessage/llbuffer.cpp
+++ b/indra/llmessage/llbuffer.cpp
@@ -32,6 +32,9 @@
#include "llmath.h"
#include "llmemtype.h"
#include "llstl.h"
+#include "llthread.h"
+
+#define ASSERT_LLBUFFERARRAY_MUTEX_LOCKED llassert(!mMutexp || mMutexp->isSelfLocked());
/**
* LLSegment
@@ -224,7 +227,8 @@ void LLHeapBuffer::allocate(S32 size)
* LLBufferArray
*/
LLBufferArray::LLBufferArray() :
- mNextBaseChannel(0)
+ mNextBaseChannel(0),
+ mMutexp(NULL)
{
LLMemType m1(LLMemType::MTYPE_IO_BUFFER);
}
@@ -233,6 +237,8 @@ LLBufferArray::~LLBufferArray()
{
LLMemType m1(LLMemType::MTYPE_IO_BUFFER);
std::for_each(mBuffers.begin(), mBuffers.end(), DeletePointer());
+
+ delete mMutexp;
}
// static
@@ -243,14 +249,57 @@ LLChannelDescriptors LLBufferArray::makeChannelConsumer(
return rv;
}
+void LLBufferArray::lock()
+{
+ if(mMutexp)
+ {
+ mMutexp->lock() ;
+ }
+}
+
+void LLBufferArray::unlock()
+{
+ if(mMutexp)
+ {
+ mMutexp->unlock() ;
+ }
+}
+
+LLMutex* LLBufferArray::getMutex()
+{
+ return mMutexp ;
+}
+
+void LLBufferArray::setThreaded(bool threaded)
+{
+ if(threaded)
+ {
+ if(!mMutexp)
+ {
+ mMutexp = new LLMutex(NULL);
+ }
+ }
+ else
+ {
+ if(mMutexp)
+ {
+ delete mMutexp ;
+ mMutexp = NULL ;
+ }
+ }
+}
+
LLChannelDescriptors LLBufferArray::nextChannel()
{
LLChannelDescriptors rv(mNextBaseChannel++);
return rv;
}
+//mMutexp should be locked before calling this.
S32 LLBufferArray::capacity() const
{
+ ASSERT_LLBUFFERARRAY_MUTEX_LOCKED
+
S32 total = 0;
const_buffer_iterator_t iter = mBuffers.begin();
const_buffer_iterator_t end = mBuffers.end();
@@ -263,6 +312,8 @@ S32 LLBufferArray::capacity() const
bool LLBufferArray::append(S32 channel, const U8* src, S32 len)
{
+ LLMutexLock lock(mMutexp) ;
+
LLMemType m1(LLMemType::MTYPE_IO_BUFFER);
std::vector<LLSegment> segments;
if(copyIntoBuffers(channel, src, len, segments))
@@ -273,8 +324,11 @@ bool LLBufferArray::append(S32 channel, const U8* src, S32 len)
return false;
}
+//mMutexp should be locked before calling this.
bool LLBufferArray::prepend(S32 channel, const U8* src, S32 len)
{
+ ASSERT_LLBUFFERARRAY_MUTEX_LOCKED
+
LLMemType m1(LLMemType::MTYPE_IO_BUFFER);
std::vector<LLSegment> segments;
if(copyIntoBuffers(channel, src, len, segments))
@@ -293,6 +347,8 @@ bool LLBufferArray::insertAfter(
{
LLMemType m1(LLMemType::MTYPE_IO_BUFFER);
std::vector<LLSegment> segments;
+
+ LLMutexLock lock(mMutexp) ;
if(mSegments.end() != segment)
{
++segment;
@@ -305,8 +361,11 @@ bool LLBufferArray::insertAfter(
return false;
}
+//mMutexp should be locked before calling this.
LLBufferArray::segment_iterator_t LLBufferArray::splitAfter(U8* address)
{
+ ASSERT_LLBUFFERARRAY_MUTEX_LOCKED
+
LLMemType m1(LLMemType::MTYPE_IO_BUFFER);
segment_iterator_t end = mSegments.end();
segment_iterator_t it = getSegment(address);
@@ -335,20 +394,26 @@ LLBufferArray::segment_iterator_t LLBufferArray::splitAfter(U8* address)
return rv;
}
+//mMutexp should be locked before calling this.
LLBufferArray::segment_iterator_t LLBufferArray::beginSegment()
{
+ ASSERT_LLBUFFERARRAY_MUTEX_LOCKED
return mSegments.begin();
}
+//mMutexp should be locked before calling this.
LLBufferArray::segment_iterator_t LLBufferArray::endSegment()
{
+ ASSERT_LLBUFFERARRAY_MUTEX_LOCKED
return mSegments.end();
}
+//mMutexp should be locked before calling this.
LLBufferArray::segment_iterator_t LLBufferArray::constructSegmentAfter(
U8* address,
LLSegment& segment)
{
+ ASSERT_LLBUFFERARRAY_MUTEX_LOCKED
LLMemType m1(LLMemType::MTYPE_IO_BUFFER);
segment_iterator_t rv = mSegments.begin();
segment_iterator_t end = mSegments.end();
@@ -395,8 +460,10 @@ LLBufferArray::segment_iterator_t LLBufferArray::constructSegmentAfter(
return rv;
}
+//mMutexp should be locked before calling this.
LLBufferArray::segment_iterator_t LLBufferArray::getSegment(U8* address)
{
+ ASSERT_LLBUFFERARRAY_MUTEX_LOCKED
segment_iterator_t end = mSegments.end();
if(!address)
{
@@ -414,9 +481,11 @@ LLBufferArray::segment_iterator_t LLBufferArray::getSegment(U8* address)
return end;
}
+//mMutexp should be locked before calling this.
LLBufferArray::const_segment_iterator_t LLBufferArray::getSegment(
U8* address) const
{
+ ASSERT_LLBUFFERARRAY_MUTEX_LOCKED
const_segment_iterator_t end = mSegments.end();
if(!address)
{
@@ -466,6 +535,8 @@ S32 LLBufferArray::countAfter(S32 channel, U8* start) const
S32 count = 0;
S32 offset = 0;
const_segment_iterator_t it;
+
+ LLMutexLock lock(mMutexp) ;
const_segment_iterator_t end = mSegments.end();
if(start)
{
@@ -517,6 +588,8 @@ U8* LLBufferArray::readAfter(
len = 0;
S32 bytes_to_copy = 0;
const_segment_iterator_t it;
+
+ LLMutexLock lock(mMutexp) ;
const_segment_iterator_t end = mSegments.end();
if(start)
{
@@ -568,6 +641,7 @@ U8* LLBufferArray::seek(
U8* start,
S32 delta) const
{
+ ASSERT_LLBUFFERARRAY_MUTEX_LOCKED
LLMemType m1(LLMemType::MTYPE_IO_BUFFER);
const_segment_iterator_t it;
const_segment_iterator_t end = mSegments.end();
@@ -709,9 +783,14 @@ U8* LLBufferArray::seek(
return rv;
}
+//test use only
bool LLBufferArray::takeContents(LLBufferArray& source)
{
LLMemType m1(LLMemType::MTYPE_IO_BUFFER);
+
+ LLMutexLock lock(mMutexp);
+ source.lock();
+
std::copy(
source.mBuffers.begin(),
source.mBuffers.end(),
@@ -723,13 +802,17 @@ bool LLBufferArray::takeContents(LLBufferArray& source)
std::back_insert_iterator<segment_list_t>(mSegments));
source.mSegments.clear();
source.mNextBaseChannel = 0;
+ source.unlock();
+
return true;
}
+//mMutexp should be locked before calling this.
LLBufferArray::segment_iterator_t LLBufferArray::makeSegment(
S32 channel,
S32 len)
{
+ ASSERT_LLBUFFERARRAY_MUTEX_LOCKED
LLMemType m1(LLMemType::MTYPE_IO_BUFFER);
// start at the end of the buffers, because it is the most likely
// to have free space.
@@ -765,8 +848,10 @@ LLBufferArray::segment_iterator_t LLBufferArray::makeSegment(
return send;
}
+//mMutexp should be locked before calling this.
bool LLBufferArray::eraseSegment(const segment_iterator_t& erase_iter)
{
+ ASSERT_LLBUFFERARRAY_MUTEX_LOCKED
LLMemType m1(LLMemType::MTYPE_IO_BUFFER);
// Find out which buffer contains the segment, and if it is found,
@@ -792,13 +877,14 @@ bool LLBufferArray::eraseSegment(const segment_iterator_t& erase_iter)
return rv;
}
-
+//mMutexp should be locked before calling this.
bool LLBufferArray::copyIntoBuffers(
S32 channel,
const U8* src,
S32 len,
std::vector<LLSegment>& segments)
{
+ ASSERT_LLBUFFERARRAY_MUTEX_LOCKED
LLMemType m1(LLMemType::MTYPE_IO_BUFFER);
if(!src || !len) return false;
S32 copied = 0;
diff --git a/indra/llmessage/llbuffer.h b/indra/llmessage/llbuffer.h
index 1c42b6fbc6..ccdb9fa7ee 100644
--- a/indra/llmessage/llbuffer.h
+++ b/indra/llmessage/llbuffer.h
@@ -39,6 +39,7 @@
#include <list>
#include <vector>
+class LLMutex;
/**
* @class LLChannelDescriptors
* @brief A way simple interface to accesss channels inside a buffer
@@ -564,6 +565,29 @@ public:
* @return Returns true on success.
*/
bool eraseSegment(const segment_iterator_t& iter);
+
+ /**
+ * @brief Lock the mutex if it exists
+ * This method locks mMutexp to make accessing LLBufferArray thread-safe
+ */
+ void lock();
+
+ /**
+ * @brief Unlock the mutex if it exists
+ */
+ void unlock();
+
+ /**
+ * @brief Return mMutexp
+ */
+ LLMutex* getMutex();
+
+ /**
+ * @brief Set LLBufferArray to be shared across threads or not
+ * This method is to create mMutexp if is threaded.
+ * @param threaded Indicates this LLBufferArray instance is shared across threads if true.
+ */
+ void setThreaded(bool threaded);
//@}
protected:
@@ -595,6 +619,7 @@ protected:
S32 mNextBaseChannel;
buffer_list_t mBuffers;
segment_list_t mSegments;
+ LLMutex* mMutexp;
};
#endif // LL_LLBUFFER_H
diff --git a/indra/llmessage/llbufferstream.cpp b/indra/llmessage/llbufferstream.cpp
index 6257983c43..8d8ad05ad5 100644
--- a/indra/llmessage/llbufferstream.cpp
+++ b/indra/llmessage/llbufferstream.cpp
@@ -31,6 +31,7 @@
#include "llbuffer.h"
#include "llmemtype.h"
+#include "llthread.h"
static const S32 DEFAULT_OUTPUT_SEGMENT_SIZE = 1024 * 4;
@@ -62,6 +63,7 @@ int LLBufferStreamBuf::underflow()
return EOF;
}
+ LLMutexLock lock(mBuffer->getMutex());
LLBufferArray::segment_iterator_t iter;
LLBufferArray::segment_iterator_t end = mBuffer->endSegment();
U8* last_pos = (U8*)gptr();
@@ -149,6 +151,7 @@ int LLBufferStreamBuf::overflow(int c)
// since we got here, we have a buffer, and we have a character to
// put on it.
LLBufferArray::segment_iterator_t it;
+ LLMutexLock lock(mBuffer->getMutex());
it = mBuffer->makeSegment(mChannels.out(), DEFAULT_OUTPUT_SEGMENT_SIZE);
if(it != mBuffer->endSegment())
{
@@ -210,6 +213,7 @@ int LLBufferStreamBuf::sync()
// *NOTE: I bet we could just --address if address is not NULL.
// Need to think about that.
+ LLMutexLock lock(mBuffer->getMutex());
address = mBuffer->seek(mChannels.out(), address, -1);
if(address)
{
@@ -273,6 +277,8 @@ streampos LLBufferStreamBuf::seekoff(
// NULL is fine
break;
}
+
+ LLMutexLock lock(mBuffer->getMutex());
address = mBuffer->seek(mChannels.in(), base_addr, off);
if(address)
{
@@ -304,6 +310,8 @@ streampos LLBufferStreamBuf::seekoff(
// NULL is fine
break;
}
+
+ LLMutexLock lock(mBuffer->getMutex());
address = mBuffer->seek(mChannels.out(), base_addr, off);
if(address)
{
diff --git a/indra/llmessage/llcachename.cpp b/indra/llmessage/llcachename.cpp
index caeaaa3be9..479efabb5f 100644
--- a/indra/llmessage/llcachename.cpp
+++ b/indra/llmessage/llcachename.cpp
@@ -975,6 +975,10 @@ void LLCacheName::Impl::processUUIDReply(LLMessageSystem* msg, bool isGroup)
if (entry->mLastName.empty())
{
full_name = cleanFullName(entry->mFirstName);
+
+ //fix what we are putting in the cache
+ entry->mFirstName = full_name;
+ entry->mLastName = "Resident";
}
else
{
diff --git a/indra/llmessage/llcircuit.cpp b/indra/llmessage/llcircuit.cpp
index 3ba2dfb104..e0410906fb 100644
--- a/indra/llmessage/llcircuit.cpp
+++ b/indra/llmessage/llcircuit.cpp
@@ -87,6 +87,7 @@ LLCircuitData::LLCircuitData(const LLHost &host, TPACKETID in_id,
mPingDelayAveraged((F32)INITIAL_PING_VALUE_MSEC),
mUnackedPacketCount(0),
mUnackedPacketBytes(0),
+ mLastPacketInTime(0.0),
mLocalEndPointID(),
mPacketsOut(0),
mPacketsIn(0),
@@ -667,6 +668,8 @@ void LLCircuitData::checkPacketInID(TPACKETID id, BOOL receive_resent)
mHighestPacketID = llmax(mHighestPacketID, id);
}
+ // Save packet arrival time
+ mLastPacketInTime = LLMessageSystem::getMessageTimeSeconds();
// Have we received anything on this circuit yet?
if (0 == mPacketsIn)
diff --git a/indra/llmessage/llcircuit.h b/indra/llmessage/llcircuit.h
index 874c0c0bee..d1c400c6a2 100644
--- a/indra/llmessage/llcircuit.h
+++ b/indra/llmessage/llcircuit.h
@@ -122,7 +122,7 @@ public:
U32 getPacketsLost() const;
TPACKETID getPacketOutID() const;
BOOL getTrusted() const;
- F32 getAgeInSeconds() const;
+ F32 getAgeInSeconds() const;
S32 getUnackedPacketCount() const { return mUnackedPacketCount; }
S32 getUnackedPacketBytes() const { return mUnackedPacketBytes; }
F64 getNextPingSendTime() const { return mNextPingSendTime; }
@@ -130,6 +130,7 @@ public:
{ return mOutOfOrderRate.meanValue(scale); }
U32 getLastPacketGap() const { return mLastPacketGap; }
LLHost getHost() const { return mHost; }
+ F64 getLastPacketInTime() const { return mLastPacketInTime; }
LLThrottleGroup &getThrottleGroup() { return mThrottles; }
@@ -248,6 +249,7 @@ protected:
S32 mUnackedPacketCount;
S32 mUnackedPacketBytes;
+ F64 mLastPacketInTime; // Time of last packet arrival
LLUUID mLocalEndPointID;
diff --git a/indra/llmessage/llcurl.cpp b/indra/llmessage/llcurl.cpp
index a485fa0160..b93d429feb 100644
--- a/indra/llmessage/llcurl.cpp
+++ b/indra/llmessage/llcurl.cpp
@@ -1,5 +1,5 @@
/**
- * @file llcurl.h
+ * @file llcurl.cpp
* @author Zero / Donovan
* @date 2006-10-15
* @brief Implementation of wrapper around libcurl.
@@ -46,9 +46,11 @@
#endif
#include "llbufferstream.h"
-#include "llstl.h"
+#include "llproxy.h"
#include "llsdserialize.h"
+#include "llstl.h"
#include "llthread.h"
+#include "lltimer.h"
//////////////////////////////////////////////////////////////////////////////
/*
@@ -70,7 +72,7 @@
static const U32 EASY_HANDLE_POOL_SIZE = 5;
static const S32 MULTI_PERFORM_CALL_REPEAT = 5;
-static const S32 CURL_REQUEST_TIMEOUT = 30; // seconds
+static const S32 CURL_REQUEST_TIMEOUT = 30; // seconds per operation
static const S32 MAX_ACTIVE_REQUEST_COUNT = 100;
// DEBUG //
@@ -83,6 +85,32 @@ S32 gCurlMultiCount = 0;
std::vector<LLMutex*> LLCurl::sSSLMutex;
std::string LLCurl::sCAPath;
std::string LLCurl::sCAFile;
+LLCurlThread* LLCurl::sCurlThread = NULL ;
+LLMutex* LLCurl::sHandleMutexp = NULL ;
+S32 LLCurl::sTotalHandles = 0 ;
+bool LLCurl::sNotQuitting = true;
+F32 LLCurl::sCurlRequestTimeOut = 120.f; //seonds
+S32 LLCurl::sMaxHandles = 256; //max number of handles, (multi handles and easy handles combined).
+
+void check_curl_code(CURLcode code)
+{
+ if (code != CURLE_OK)
+ {
+ // linux appears to throw a curl error once per session for a bad initialization
+ // at a pretty random time (when enabling cookies).
+ llinfos << "curl error detected: " << curl_easy_strerror(code) << llendl;
+ }
+}
+
+void check_curl_multi_code(CURLMcode code)
+{
+ if (code != CURLM_OK)
+ {
+ // linux appears to throw a curl error once per session for a bad initialization
+ // at a pretty random time (when enabling cookies).
+ llinfos << "curl multi error detected: " << curl_multi_strerror(code) << llendl;
+ }
+}
//static
void LLCurl::setCAPath(const std::string& path)
@@ -183,7 +211,7 @@ namespace boost
void intrusive_ptr_release(LLCurl::Responder* p)
{
- if(p && 0 == --p->mReferenceCount)
+ if (p && 0 == --p->mReferenceCount)
{
delete p;
}
@@ -193,63 +221,68 @@ namespace boost
//////////////////////////////////////////////////////////////////////////////
+std::set<CURL*> LLCurl::Easy::sFreeHandles;
+std::set<CURL*> LLCurl::Easy::sActiveHandles;
+LLMutex* LLCurl::Easy::sHandleMutexp = NULL ;
-class LLCurl::Easy
+//static
+CURL* LLCurl::Easy::allocEasyHandle()
{
- LOG_CLASS(Easy);
+ llassert(LLCurl::getCurlThread()) ;
-private:
- Easy();
-
-public:
- static Easy* getEasy();
- ~Easy();
+ CURL* ret = NULL;
- CURL* getCurlHandle() const { return mCurlEasyHandle; }
+ LLMutexLock lock(sHandleMutexp) ;
- void setErrorBuffer();
- void setCA();
-
- void setopt(CURLoption option, S32 value);
- // These assume the setter does not free value!
- void setopt(CURLoption option, void* value);
- void setopt(CURLoption option, char* value);
- // Copies the string so that it is gauranteed to stick around
- void setoptString(CURLoption option, const std::string& value);
-
- void slist_append(const char* str);
- void setHeaders();
-
- U32 report(CURLcode);
- void getTransferInfo(LLCurl::TransferInfo* info);
+ if (sFreeHandles.empty())
+ {
+ ret = LLCurl::newEasyHandle();
+ }
+ else
+ {
+ ret = *(sFreeHandles.begin());
+ sFreeHandles.erase(ret);
+ curl_easy_reset(ret);
+ }
- void prepRequest(const std::string& url, const std::vector<std::string>& headers, ResponderPtr, bool post = false);
-
- const char* getErrorBuffer();
+ if (ret)
+ {
+ sActiveHandles.insert(ret);
+ }
- std::stringstream& getInput() { return mInput; }
- std::stringstream& getHeaderOutput() { return mHeaderOutput; }
- LLIOPipe::buffer_ptr_t& getOutput() { return mOutput; }
- const LLChannelDescriptors& getChannels() { return mChannels; }
-
- void resetState();
+ return ret;
+}
-private:
- CURL* mCurlEasyHandle;
- struct curl_slist* mHeaders;
-
- std::stringstream mRequest;
- LLChannelDescriptors mChannels;
- LLIOPipe::buffer_ptr_t mOutput;
- std::stringstream mInput;
- std::stringstream mHeaderOutput;
- char mErrorBuffer[CURL_ERROR_SIZE];
-
- // Note: char*'s not strings since we pass pointers to curl
- std::vector<char*> mStrings;
-
- ResponderPtr mResponder;
-};
+//static
+void LLCurl::Easy::releaseEasyHandle(CURL* handle)
+{
+ static const S32 MAX_NUM_FREE_HANDLES = 32 ;
+
+ if (!handle)
+ {
+ return ; //handle allocation failed.
+ //llerrs << "handle cannot be NULL!" << llendl;
+ }
+
+ LLMutexLock lock(sHandleMutexp) ;
+ if (sActiveHandles.find(handle) != sActiveHandles.end())
+ {
+ sActiveHandles.erase(handle);
+
+ if(sFreeHandles.size() < MAX_NUM_FREE_HANDLES)
+ {
+ sFreeHandles.insert(handle);
+ }
+ else
+ {
+ LLCurl::deleteEasyHandle(handle) ;
+ }
+ }
+ else
+ {
+ llerrs << "Invalid handle." << llendl;
+ }
+}
LLCurl::Easy::Easy()
: mHeaders(NULL),
@@ -261,28 +294,39 @@ LLCurl::Easy::Easy()
LLCurl::Easy* LLCurl::Easy::getEasy()
{
Easy* easy = new Easy();
- easy->mCurlEasyHandle = curl_easy_init();
+ easy->mCurlEasyHandle = allocEasyHandle();
+
if (!easy->mCurlEasyHandle)
{
// this can happen if we have too many open files (fails in c-ares/ares_init.c)
- llwarns << "curl_multi_init() returned NULL! Easy handles: " << gCurlEasyCount << " Multi handles: " << gCurlMultiCount << llendl;
+ llwarns << "allocEasyHandle() returned NULL! Easy handles: " << gCurlEasyCount << " Multi handles: " << gCurlMultiCount << llendl;
delete easy;
return NULL;
}
- // set no DMS caching as default for all easy handles. This prevents them adopting a
+ // set no DNS caching as default for all easy handles. This prevents them adopting a
// multi handles cache if they are added to one.
- curl_easy_setopt(easy->mCurlEasyHandle, CURLOPT_DNS_CACHE_TIMEOUT, 0);
+ CURLcode result = curl_easy_setopt(easy->mCurlEasyHandle, CURLOPT_DNS_CACHE_TIMEOUT, 0);
+ check_curl_code(result);
+
++gCurlEasyCount;
return easy;
}
LLCurl::Easy::~Easy()
{
- curl_easy_cleanup(mCurlEasyHandle);
+ releaseEasyHandle(mCurlEasyHandle);
--gCurlEasyCount;
curl_slist_free_all(mHeaders);
for_each(mStrings.begin(), mStrings.end(), DeletePointerArray());
+
+ if (mResponder && LLCurl::sNotQuitting) //aborted
+ {
+ std::string reason("Request timeout, aborted.") ;
+ mResponder->completedRaw(408, //HTTP_REQUEST_TIME_OUT, timeout, abort
+ reason, mChannels, mOutput);
+ }
+ mResponder = NULL;
}
void LLCurl::Easy::resetState()
@@ -321,11 +365,11 @@ const char* LLCurl::Easy::getErrorBuffer()
void LLCurl::Easy::setCA()
{
- if(!sCAPath.empty())
+ if (!sCAPath.empty())
{
setoptString(CURLOPT_CAPATH, sCAPath);
}
- if(!sCAFile.empty())
+ if (!sCAFile.empty())
{
setoptString(CURLOPT_CAINFO, sCAFile);
}
@@ -338,9 +382,9 @@ void LLCurl::Easy::setHeaders()
void LLCurl::Easy::getTransferInfo(LLCurl::TransferInfo* info)
{
- curl_easy_getinfo(mCurlEasyHandle, CURLINFO_SIZE_DOWNLOAD, &info->mSizeDownload);
- curl_easy_getinfo(mCurlEasyHandle, CURLINFO_TOTAL_TIME, &info->mTotalTime);
- curl_easy_getinfo(mCurlEasyHandle, CURLINFO_SPEED_DOWNLOAD, &info->mSpeedDownload);
+ check_curl_code(curl_easy_getinfo(mCurlEasyHandle, CURLINFO_SIZE_DOWNLOAD, &info->mSizeDownload));
+ check_curl_code(curl_easy_getinfo(mCurlEasyHandle, CURLINFO_TOTAL_TIME, &info->mTotalTime));
+ check_curl_code(curl_easy_getinfo(mCurlEasyHandle, CURLINFO_SPEED_DOWNLOAD, &info->mSpeedDownload));
}
U32 LLCurl::Easy::report(CURLcode code)
@@ -350,13 +394,14 @@ U32 LLCurl::Easy::report(CURLcode code)
if (code == CURLE_OK)
{
- curl_easy_getinfo(mCurlEasyHandle, CURLINFO_RESPONSE_CODE, &responseCode);
+ check_curl_code(curl_easy_getinfo(mCurlEasyHandle, CURLINFO_RESPONSE_CODE, &responseCode));
//*TODO: get reason from first line of mHeaderOutput
}
else
{
responseCode = 499;
responseReason = strerror(code) + " : " + mErrorBuffer;
+ setopt(CURLOPT_FRESH_CONNECT, TRUE);
}
if (mResponder)
@@ -372,17 +417,20 @@ U32 LLCurl::Easy::report(CURLcode code)
// Note: these all assume the caller tracks the value (i.e. keeps it persistant)
void LLCurl::Easy::setopt(CURLoption option, S32 value)
{
- curl_easy_setopt(mCurlEasyHandle, option, value);
+ CURLcode result = curl_easy_setopt(mCurlEasyHandle, option, value);
+ check_curl_code(result);
}
void LLCurl::Easy::setopt(CURLoption option, void* value)
{
- curl_easy_setopt(mCurlEasyHandle, option, value);
+ CURLcode result = curl_easy_setopt(mCurlEasyHandle, option, value);
+ check_curl_code(result);
}
void LLCurl::Easy::setopt(CURLoption option, char* value)
{
- curl_easy_setopt(mCurlEasyHandle, option, value);
+ CURLcode result = curl_easy_setopt(mCurlEasyHandle, option, value);
+ check_curl_code(result);
}
// Note: this copies the string so that the caller does not have to keep it around
@@ -391,7 +439,8 @@ void LLCurl::Easy::setoptString(CURLoption option, const std::string& value)
char* tstring = new char[value.length()+1];
strcpy(tstring, value.c_str());
mStrings.push_back(tstring);
- curl_easy_setopt(mCurlEasyHandle, option, tstring);
+ CURLcode result = curl_easy_setopt(mCurlEasyHandle, option, tstring);
+ check_curl_code(result);
}
void LLCurl::Easy::slist_append(const char* str)
@@ -404,9 +453,9 @@ size_t curlReadCallback(char* data, size_t size, size_t nmemb, void* user_data)
LLCurl::Easy* easy = (LLCurl::Easy*)user_data;
S32 n = size * nmemb;
- S32 startpos = easy->getInput().tellg();
+ S32 startpos = (S32)easy->getInput().tellg();
easy->getInput().seekg(0, std::ios::end);
- S32 endpos = easy->getInput().tellg();
+ S32 endpos = (S32)easy->getInput().tellg();
easy->getInput().seekg(startpos, std::ios::beg);
S32 maxn = endpos - startpos;
n = llmin(n, maxn);
@@ -437,16 +486,20 @@ size_t curlHeaderCallback(void* data, size_t size, size_t nmemb, void* user_data
void LLCurl::Easy::prepRequest(const std::string& url,
const std::vector<std::string>& headers,
- ResponderPtr responder, bool post)
+ ResponderPtr responder, S32 time_out, bool post)
{
resetState();
if (post) setoptString(CURLOPT_ENCODING, "");
-// setopt(CURLOPT_VERBOSE, 1); // usefull for debugging
+ //setopt(CURLOPT_VERBOSE, 1); // useful for debugging
setopt(CURLOPT_NOSIGNAL, 1);
+ // Set the CURL options for either Socks or HTTP proxy
+ LLProxy::getInstance()->applyProxySettings(this);
+
mOutput.reset(new LLBufferArray);
+ mOutput->setThreaded(true);
setopt(CURLOPT_WRITEFUNCTION, (void*)&curlWriteCallback);
setopt(CURLOPT_WRITEDATA, (void*)this);
@@ -457,7 +510,7 @@ void LLCurl::Easy::prepRequest(const std::string& url,
setopt(CURLOPT_HEADERDATA, (void*)this);
// Allow up to five redirects
- if(responder && responder->followRedir())
+ if (responder && responder->followRedir())
{
setopt(CURLOPT_FOLLOWLOCATION, 1);
setopt(CURLOPT_MAXREDIRS, MAX_REDIRECTS);
@@ -467,7 +520,10 @@ void LLCurl::Easy::prepRequest(const std::string& url,
setCA();
setopt(CURLOPT_SSL_VERIFYPEER, true);
- setopt(CURLOPT_TIMEOUT, CURL_REQUEST_TIMEOUT);
+
+ //don't verify host name so urls with scrubbed host names will work (improves DNS performance)
+ setopt(CURLOPT_SSL_VERIFYHOST, 0);
+ setopt(CURLOPT_TIMEOUT, llmax(time_out, CURL_REQUEST_TIMEOUT));
setoptString(CURLOPT_URL, url);
@@ -487,63 +543,62 @@ void LLCurl::Easy::prepRequest(const std::string& url,
}
////////////////////////////////////////////////////////////////////////////
-
-class LLCurl::Multi
-{
- LOG_CLASS(Multi);
-public:
-
- Multi();
- ~Multi();
-
- Easy* allocEasy();
- bool addEasy(Easy* easy);
-
- void removeEasy(Easy* easy);
-
- S32 process();
- S32 perform();
-
- CURLMsg* info_read(S32* msgs_in_queue);
-
- S32 mQueued;
- S32 mErrorCount;
-
-private:
- void easyFree(Easy*);
-
- CURLM* mCurlMultiHandle;
-
- typedef std::set<Easy*> easy_active_list_t;
- easy_active_list_t mEasyActiveList;
- typedef std::map<CURL*, Easy*> easy_active_map_t;
- easy_active_map_t mEasyActiveMap;
- typedef std::set<Easy*> easy_free_list_t;
- easy_free_list_t mEasyFreeList;
-};
-
-LLCurl::Multi::Multi()
+LLCurl::Multi::Multi(F32 idle_time_out)
: mQueued(0),
- mErrorCount(0)
-{
- mCurlMultiHandle = curl_multi_init();
+ mErrorCount(0),
+ mState(STATE_READY),
+ mDead(FALSE),
+ mMutexp(NULL),
+ mDeletionMutexp(NULL),
+ mEasyMutexp(NULL)
+{
+ mCurlMultiHandle = LLCurl::newMultiHandle();
if (!mCurlMultiHandle)
{
llwarns << "curl_multi_init() returned NULL! Easy handles: " << gCurlEasyCount << " Multi handles: " << gCurlMultiCount << llendl;
- mCurlMultiHandle = curl_multi_init();
+ mCurlMultiHandle = LLCurl::newMultiHandle();
}
- llassert_always(mCurlMultiHandle);
+
+ //llassert_always(mCurlMultiHandle);
+
+ if(mCurlMultiHandle)
+ {
+ if(LLCurl::getCurlThread()->getThreaded())
+ {
+ mMutexp = new LLMutex(NULL) ;
+ mDeletionMutexp = new LLMutex(NULL) ;
+ mEasyMutexp = new LLMutex(NULL) ;
+ }
+ LLCurl::getCurlThread()->addMulti(this) ;
+
+ mIdleTimeOut = idle_time_out ;
+ if(mIdleTimeOut < LLCurl::sCurlRequestTimeOut)
+ {
+ mIdleTimeOut = LLCurl::sCurlRequestTimeOut ;
+ }
+
++gCurlMultiCount;
}
+}
LLCurl::Multi::~Multi()
{
+ cleanup() ;
+}
+
+void LLCurl::Multi::cleanup()
+{
+ if(!mCurlMultiHandle)
+ {
+ return ; //nothing to clean.
+ }
+
// Clean up active
for(easy_active_list_t::iterator iter = mEasyActiveList.begin();
iter != mEasyActiveList.end(); ++iter)
{
Easy* easy = *iter;
- curl_multi_remove_handle(mCurlMultiHandle, easy->getCurlHandle());
+ check_curl_multi_code(curl_multi_remove_handle(mCurlMultiHandle, easy->getCurlHandle()));
delete easy;
}
mEasyActiveList.clear();
@@ -553,38 +608,161 @@ LLCurl::Multi::~Multi()
for_each(mEasyFreeList.begin(), mEasyFreeList.end(), DeletePointer());
mEasyFreeList.clear();
- curl_multi_cleanup(mCurlMultiHandle);
+ check_curl_multi_code(LLCurl::deleteMultiHandle(mCurlMultiHandle));
+ mCurlMultiHandle = NULL ;
+
+ delete mMutexp ;
+ mMutexp = NULL ;
+ delete mDeletionMutexp ;
+ mDeletionMutexp = NULL ;
+ delete mEasyMutexp ;
+ mEasyMutexp = NULL ;
+
+ mQueued = 0 ;
+ mState = STATE_COMPLETED;
+
--gCurlMultiCount;
+
+ return ;
+}
+
+void LLCurl::Multi::lock()
+{
+ if(mMutexp)
+ {
+ mMutexp->lock() ;
+ }
+}
+
+void LLCurl::Multi::unlock()
+{
+ if(mMutexp)
+ {
+ mMutexp->unlock() ;
+ }
+}
+
+void LLCurl::Multi::markDead()
+{
+ LLMutexLock lock(mDeletionMutexp) ;
+
+ mDead = TRUE ;
+ LLCurl::getCurlThread()->setPriority(mHandle, LLQueuedThread::PRIORITY_URGENT) ;
+}
+
+void LLCurl::Multi::setState(LLCurl::Multi::ePerformState state)
+{
+ lock() ;
+ mState = state ;
+ unlock() ;
+
+ if(mState == STATE_READY)
+ {
+ LLCurl::getCurlThread()->setPriority(mHandle, LLQueuedThread::PRIORITY_NORMAL) ;
+ }
+}
+
+LLCurl::Multi::ePerformState LLCurl::Multi::getState()
+{
+ return mState;
+}
+
+bool LLCurl::Multi::isCompleted()
+{
+ return STATE_COMPLETED == getState() ;
+}
+
+bool LLCurl::Multi::waitToComplete()
+{
+ if(!isValid())
+ {
+ return true ;
+ }
+
+ if(!mMutexp) //not threaded
+ {
+ doPerform() ;
+ return true ;
+ }
+
+ bool completed = (STATE_COMPLETED == mState) ;
+ if(!completed)
+ {
+ LLCurl::getCurlThread()->setPriority(mHandle, LLQueuedThread::PRIORITY_HIGH) ;
+ }
+
+ return completed;
}
CURLMsg* LLCurl::Multi::info_read(S32* msgs_in_queue)
{
+ LLMutexLock lock(mMutexp) ;
+
CURLMsg* curlmsg = curl_multi_info_read(mCurlMultiHandle, msgs_in_queue);
return curlmsg;
}
-
-S32 LLCurl::Multi::perform()
+//return true if dead
+bool LLCurl::Multi::doPerform()
{
- S32 q = 0;
- for (S32 call_count = 0;
- call_count < MULTI_PERFORM_CALL_REPEAT;
- call_count += 1)
+ LLMutexLock lock(mDeletionMutexp) ;
+
+ bool dead = mDead ;
+
+ if(mDead)
{
- CURLMcode code = curl_multi_perform(mCurlMultiHandle, &q);
- if (CURLM_CALL_MULTI_PERFORM != code || q == 0)
+ setState(STATE_COMPLETED);
+ mQueued = 0 ;
+ }
+ else if(getState() != STATE_COMPLETED)
+ {
+ setState(STATE_PERFORMING);
+
+ S32 q = 0;
+ for (S32 call_count = 0;
+ call_count < MULTI_PERFORM_CALL_REPEAT;
+ call_count++)
{
- break;
+ LLMutexLock lock(mMutexp) ;
+
+ //WARNING: curl_multi_perform will block for many hundreds of milliseconds
+ // NEVER call this from the main thread, and NEVER allow the main thread to
+ // wait on a mutex held by this thread while curl_multi_perform is executing
+ CURLMcode code = curl_multi_perform(mCurlMultiHandle, &q);
+ if (CURLM_CALL_MULTI_PERFORM != code || q == 0)
+ {
+ check_curl_multi_code(code);
+
+ break;
+ }
}
+
+ mQueued = q;
+ setState(STATE_COMPLETED) ;
+ mIdleTimer.reset() ;
+ }
+ else if(mIdleTimer.getElapsedTimeF32() > mIdleTimeOut) //idle for too long, remove it.
+ {
+ dead = true ;
}
- mQueued = q;
- return q;
+
+ return dead ;
}
S32 LLCurl::Multi::process()
{
- perform();
-
+ if(!isValid())
+ {
+ return 0 ;
+ }
+
+ waitToComplete() ;
+
+ if (getState() != STATE_COMPLETED)
+ {
+ return 0;
+ }
+
CURLMsg* msg;
int msgs_in_queue;
@@ -595,10 +773,19 @@ S32 LLCurl::Multi::process()
if (msg->msg == CURLMSG_DONE)
{
U32 response = 0;
- easy_active_map_t::iterator iter = mEasyActiveMap.find(msg->easy_handle);
- if (iter != mEasyActiveMap.end())
+ Easy* easy = NULL ;
+
+ {
+ LLMutexLock lock(mEasyMutexp) ;
+ easy_active_map_t::iterator iter = mEasyActiveMap.find(msg->easy_handle);
+ if (iter != mEasyActiveMap.end())
+ {
+ easy = iter->second;
+ }
+ }
+
+ if(easy)
{
- Easy* easy = iter->second;
response = easy->report(msg->data.result);
removeEasy(easy);
}
@@ -615,24 +802,29 @@ S32 LLCurl::Multi::process()
}
}
}
+
+ setState(STATE_READY);
+
return processed;
}
LLCurl::Easy* LLCurl::Multi::allocEasy()
{
- Easy* easy = 0;
+ Easy* easy = 0;
if (mEasyFreeList.empty())
- {
+ {
easy = Easy::getEasy();
}
else
{
+ LLMutexLock lock(mEasyMutexp) ;
easy = *(mEasyFreeList.begin());
mEasyFreeList.erase(easy);
}
if (easy)
{
+ LLMutexLock lock(mEasyMutexp) ;
mEasyActiveList.insert(easy);
mEasyActiveMap[easy->getCurlHandle()] = easy;
}
@@ -641,48 +833,173 @@ LLCurl::Easy* LLCurl::Multi::allocEasy()
bool LLCurl::Multi::addEasy(Easy* easy)
{
+ LLMutexLock lock(mMutexp) ;
CURLMcode mcode = curl_multi_add_handle(mCurlMultiHandle, easy->getCurlHandle());
- if (mcode != CURLM_OK)
- {
- llwarns << "Curl Error: " << curl_multi_strerror(mcode) << llendl;
- return false;
- }
+ check_curl_multi_code(mcode);
+ //if (mcode != CURLM_OK)
+ //{
+ // llwarns << "Curl Error: " << curl_multi_strerror(mcode) << llendl;
+ // return false;
+ //}
return true;
}
void LLCurl::Multi::easyFree(Easy* easy)
{
+ if(mEasyMutexp)
+ {
+ mEasyMutexp->lock() ;
+ }
+
mEasyActiveList.erase(easy);
mEasyActiveMap.erase(easy->getCurlHandle());
+
if (mEasyFreeList.size() < EASY_HANDLE_POOL_SIZE)
- {
- easy->resetState();
+ {
mEasyFreeList.insert(easy);
+
+ if(mEasyMutexp)
+ {
+ mEasyMutexp->unlock() ;
+ }
+
+ easy->resetState();
}
else
{
+ if(mEasyMutexp)
+ {
+ mEasyMutexp->unlock() ;
+ }
delete easy;
}
}
void LLCurl::Multi::removeEasy(Easy* easy)
{
- curl_multi_remove_handle(mCurlMultiHandle, easy->getCurlHandle());
+ {
+ LLMutexLock lock(mMutexp) ;
+ check_curl_multi_code(curl_multi_remove_handle(mCurlMultiHandle, easy->getCurlHandle()));
+ }
easyFree(easy);
}
+//------------------------------------------------------------
+//LLCurlThread
+LLCurlThread::CurlRequest::CurlRequest(handle_t handle, LLCurl::Multi* multi, LLCurlThread* curl_thread) :
+ LLQueuedThread::QueuedRequest(handle, LLQueuedThread::PRIORITY_NORMAL, FLAG_AUTO_COMPLETE),
+ mMulti(multi),
+ mCurlThread(curl_thread)
+{
+}
+
+LLCurlThread::CurlRequest::~CurlRequest()
+{
+ if(mMulti)
+ {
+ mCurlThread->deleteMulti(mMulti) ;
+ mMulti = NULL ;
+ }
+}
+
+bool LLCurlThread::CurlRequest::processRequest()
+{
+ bool completed = true ;
+ if(mMulti)
+ {
+ completed = mCurlThread->doMultiPerform(mMulti) ;
+
+ if(!completed)
+ {
+ setPriority(LLQueuedThread::PRIORITY_LOW) ;
+ }
+ }
+
+ return completed ;
+}
+
+void LLCurlThread::CurlRequest::finishRequest(bool completed)
+{
+ if(mMulti->isDead())
+ {
+ mCurlThread->deleteMulti(mMulti) ;
+ }
+ else
+ {
+ mCurlThread->cleanupMulti(mMulti) ; //being idle too long, remove the request.
+ }
+
+ mMulti = NULL ;
+}
+
+LLCurlThread::LLCurlThread(bool threaded) :
+ LLQueuedThread("curlthread", threaded)
+{
+}
+
+//virtual
+LLCurlThread::~LLCurlThread()
+{
+}
+
+S32 LLCurlThread::update(F32 max_time_ms)
+{
+ return LLQueuedThread::update(max_time_ms);
+}
+
+void LLCurlThread::addMulti(LLCurl::Multi* multi)
+{
+ multi->mHandle = generateHandle() ;
+
+ CurlRequest* req = new CurlRequest(multi->mHandle, multi, this) ;
+
+ if (!addRequest(req))
+ {
+ llwarns << "curl request added when the thread is quitted" << llendl;
+ }
+}
+
+void LLCurlThread::killMulti(LLCurl::Multi* multi)
+{
+ if(!multi)
+ {
+ return ;
+ }
+
+ if(multi->isValid())
+ {
+ multi->markDead() ;
+}
+ else
+ {
+ deleteMulti(multi) ;
+ }
+}
+
+//private
+bool LLCurlThread::doMultiPerform(LLCurl::Multi* multi)
+{
+ return multi->doPerform() ;
+}
+
+//private
+void LLCurlThread::deleteMulti(LLCurl::Multi* multi)
+{
+ delete multi ;
+}
+
+//private
+void LLCurlThread::cleanupMulti(LLCurl::Multi* multi)
+{
+ multi->cleanup() ;
+}
+
+//------------------------------------------------------------
+
//static
std::string LLCurl::strerror(CURLcode errorcode)
{
-#if LL_DARWIN
- // curl_easy_strerror was added in libcurl 7.12.0. Unfortunately, the version in the Mac OS X 10.3.9 SDK is 7.10.2...
- // There's a problem with the custom curl headers in our build that keeps me from #ifdefing this on the libcurl version number
- // (the correct check would be #if LIBCURL_VERSION_NUM >= 0x070c00). We'll fix the header problem soon, but for now
- // just punt and print the numeric error code on the Mac.
- return llformat("%d", errorcode);
-#else // LL_DARWIN
return std::string(curl_easy_strerror(errorcode));
-#endif // LL_DARWIN
}
////////////////////////////////////////////////////////////////////////////
@@ -693,19 +1010,30 @@ LLCurlRequest::LLCurlRequest() :
mActiveMulti(NULL),
mActiveRequestCount(0)
{
- mThreadID = LLThread::currentID();
+ mProcessing = FALSE;
}
LLCurlRequest::~LLCurlRequest()
{
- llassert_always(mThreadID == LLThread::currentID());
- for_each(mMultiSet.begin(), mMultiSet.end(), DeletePointer());
+ //stop all Multi handle background threads
+ for (curlmulti_set_t::iterator iter = mMultiSet.begin(); iter != mMultiSet.end(); ++iter)
+ {
+ LLCurl::getCurlThread()->killMulti(*iter) ;
+ }
+ mMultiSet.clear() ;
}
void LLCurlRequest::addMulti()
{
- llassert_always(mThreadID == LLThread::currentID());
LLCurl::Multi* multi = new LLCurl::Multi();
+ if(!multi->isValid())
+ {
+ LLCurl::getCurlThread()->killMulti(multi) ;
+ mActiveMulti = NULL ;
+ mActiveRequestCount = 0 ;
+ return;
+ }
+
mMultiSet.insert(multi);
mActiveMulti = multi;
mActiveRequestCount = 0;
@@ -719,7 +1047,12 @@ LLCurl::Easy* LLCurlRequest::allocEasy()
{
addMulti();
}
- llassert_always(mActiveMulti);
+ if(!mActiveMulti)
+ {
+ return NULL ;
+ }
+
+ //llassert_always(mActiveMulti);
++mActiveRequestCount;
LLCurl::Easy* easy = mActiveMulti->allocEasy();
return easy;
@@ -728,6 +1061,11 @@ LLCurl::Easy* LLCurlRequest::allocEasy()
bool LLCurlRequest::addEasy(LLCurl::Easy* easy)
{
llassert_always(mActiveMulti);
+
+ if (mProcessing)
+ {
+ llerrs << "Posting to a LLCurlRequest instance from within a responder is not allowed (causes DNS timeouts)." << llendl;
+ }
bool res = mActiveMulti->addEasy(easy);
return res;
}
@@ -762,14 +1100,14 @@ bool LLCurlRequest::getByteRange(const std::string& url,
bool LLCurlRequest::post(const std::string& url,
const headers_t& headers,
const LLSD& data,
- LLCurl::ResponderPtr responder)
+ LLCurl::ResponderPtr responder, S32 time_out)
{
LLCurl::Easy* easy = allocEasy();
if (!easy)
{
return false;
}
- easy->prepRequest(url, headers, responder);
+ easy->prepRequest(url, headers, responder, time_out);
LLSDSerialize::toXML(data, easy->getInput());
S32 bytes = easy->getInput().str().length();
@@ -785,38 +1123,96 @@ bool LLCurlRequest::post(const std::string& url,
bool res = addEasy(easy);
return res;
}
+
+bool LLCurlRequest::post(const std::string& url,
+ const headers_t& headers,
+ const std::string& data,
+ LLCurl::ResponderPtr responder, S32 time_out)
+{
+ LLCurl::Easy* easy = allocEasy();
+ if (!easy)
+ {
+ return false;
+ }
+ easy->prepRequest(url, headers, responder, time_out);
+
+ easy->getInput().write(data.data(), data.size());
+ S32 bytes = easy->getInput().str().length();
+ easy->setopt(CURLOPT_POST, 1);
+ easy->setopt(CURLOPT_POSTFIELDS, (void*)NULL);
+ easy->setopt(CURLOPT_POSTFIELDSIZE, bytes);
+
+ easy->slist_append("Content-Type: application/octet-stream");
+ easy->setHeaders();
+
+ lldebugs << "POSTING: " << bytes << " bytes." << llendl;
+ bool res = addEasy(easy);
+ return res;
+}
+
// Note: call once per frame
S32 LLCurlRequest::process()
{
- llassert_always(mThreadID == LLThread::currentID());
S32 res = 0;
+
+ mProcessing = TRUE;
for (curlmulti_set_t::iterator iter = mMultiSet.begin();
iter != mMultiSet.end(); )
{
curlmulti_set_t::iterator curiter = iter++;
LLCurl::Multi* multi = *curiter;
+
+ if(!multi->isValid())
+ {
+ if(multi == mActiveMulti)
+ {
+ mActiveMulti = NULL ;
+ mActiveRequestCount = 0 ;
+ }
+ mMultiSet.erase(curiter) ;
+ LLCurl::getCurlThread()->killMulti(multi) ;
+ continue ;
+ }
+
S32 tres = multi->process();
res += tres;
if (multi != mActiveMulti && tres == 0 && multi->mQueued == 0)
{
mMultiSet.erase(curiter);
- delete multi;
+ LLCurl::getCurlThread()->killMulti(multi);
}
}
+ mProcessing = FALSE;
return res;
}
S32 LLCurlRequest::getQueued()
{
- llassert_always(mThreadID == LLThread::currentID());
S32 queued = 0;
for (curlmulti_set_t::iterator iter = mMultiSet.begin();
iter != mMultiSet.end(); )
{
curlmulti_set_t::iterator curiter = iter++;
LLCurl::Multi* multi = *curiter;
+
+ if(!multi->isValid())
+ {
+ if(multi == mActiveMulti)
+ {
+ mActiveMulti = NULL ;
+ mActiveRequestCount = 0 ;
+ }
+ LLCurl::getCurlThread()->killMulti(multi);
+ mMultiSet.erase(curiter) ;
+ continue ;
+ }
+
queued += multi->mQueued;
+ if (multi->getState() != LLCurl::Multi::STATE_READY)
+ {
+ ++queued;
+ }
}
return queued;
}
@@ -830,22 +1226,34 @@ LLCurlEasyRequest::LLCurlEasyRequest()
mResultReturned(false)
{
mMulti = new LLCurl::Multi();
+
+ if(mMulti->isValid())
+ {
mEasy = mMulti->allocEasy();
if (mEasy)
{
mEasy->setErrorBuffer();
mEasy->setCA();
+ // Set proxy settings if configured to do so.
+ LLProxy::getInstance()->applyProxySettings(mEasy);
+ }
+}
+ else
+ {
+ LLCurl::getCurlThread()->killMulti(mMulti) ;
+ mEasy = NULL ;
+ mMulti = NULL ;
}
}
LLCurlEasyRequest::~LLCurlEasyRequest()
{
- delete mMulti;
+ LLCurl::getCurlThread()->killMulti(mMulti) ;
}
void LLCurlEasyRequest::setopt(CURLoption option, S32 value)
{
- if (mEasy)
+ if (isValid() && mEasy)
{
mEasy->setopt(option, value);
}
@@ -853,7 +1261,7 @@ void LLCurlEasyRequest::setopt(CURLoption option, S32 value)
void LLCurlEasyRequest::setoptString(CURLoption option, const std::string& value)
{
- if (mEasy)
+ if (isValid() && mEasy)
{
mEasy->setoptString(option, value);
}
@@ -861,7 +1269,7 @@ void LLCurlEasyRequest::setoptString(CURLoption option, const std::string& value
void LLCurlEasyRequest::setPost(char* postdata, S32 size)
{
- if (mEasy)
+ if (isValid() && mEasy)
{
mEasy->setopt(CURLOPT_POST, 1);
mEasy->setopt(CURLOPT_POSTFIELDS, postdata);
@@ -871,7 +1279,7 @@ void LLCurlEasyRequest::setPost(char* postdata, S32 size)
void LLCurlEasyRequest::setHeaderCallback(curl_header_callback callback, void* userdata)
{
- if (mEasy)
+ if (isValid() && mEasy)
{
mEasy->setopt(CURLOPT_HEADERFUNCTION, (void*)callback);
mEasy->setopt(CURLOPT_HEADERDATA, userdata); // aka CURLOPT_WRITEHEADER
@@ -880,7 +1288,7 @@ void LLCurlEasyRequest::setHeaderCallback(curl_header_callback callback, void* u
void LLCurlEasyRequest::setWriteCallback(curl_write_callback callback, void* userdata)
{
- if (mEasy)
+ if (isValid() && mEasy)
{
mEasy->setopt(CURLOPT_WRITEFUNCTION, (void*)callback);
mEasy->setopt(CURLOPT_WRITEDATA, userdata);
@@ -889,7 +1297,7 @@ void LLCurlEasyRequest::setWriteCallback(curl_write_callback callback, void* use
void LLCurlEasyRequest::setReadCallback(curl_read_callback callback, void* userdata)
{
- if (mEasy)
+ if (isValid() && mEasy)
{
mEasy->setopt(CURLOPT_READFUNCTION, (void*)callback);
mEasy->setopt(CURLOPT_READDATA, userdata);
@@ -898,7 +1306,7 @@ void LLCurlEasyRequest::setReadCallback(curl_read_callback callback, void* userd
void LLCurlEasyRequest::setSSLCtxCallback(curl_ssl_ctx_callback callback, void* userdata)
{
- if (mEasy)
+ if (isValid() && mEasy)
{
mEasy->setopt(CURLOPT_SSL_CTX_FUNCTION, (void*)callback);
mEasy->setopt(CURLOPT_SSL_CTX_DATA, userdata);
@@ -907,7 +1315,7 @@ void LLCurlEasyRequest::setSSLCtxCallback(curl_ssl_ctx_callback callback, void*
void LLCurlEasyRequest::slist_append(const char* str)
{
- if (mEasy)
+ if (isValid() && mEasy)
{
mEasy->slist_append(str);
}
@@ -918,7 +1326,7 @@ void LLCurlEasyRequest::sendRequest(const std::string& url)
llassert_always(!mRequestSent);
mRequestSent = true;
lldebugs << url << llendl;
- if (mEasy)
+ if (isValid() && mEasy)
{
mEasy->setHeaders();
mEasy->setoptString(CURLOPT_URL, url);
@@ -930,20 +1338,25 @@ void LLCurlEasyRequest::requestComplete()
{
llassert_always(mRequestSent);
mRequestSent = false;
- if (mEasy)
+ if (isValid() && mEasy)
{
mMulti->removeEasy(mEasy);
}
}
-S32 LLCurlEasyRequest::perform()
-{
- return mMulti->perform();
-}
-
// Usage: Call getRestult until it returns false (no more messages)
bool LLCurlEasyRequest::getResult(CURLcode* result, LLCurl::TransferInfo* info)
{
+ if(!isValid())
+ {
+ return false ;
+ }
+ if (!mMulti->isCompleted())
+ { //we're busy, try again later
+ return false;
+ }
+ mMulti->setState(LLCurl::Multi::STATE_READY) ;
+
if (!mEasy)
{
// Special case - we failed to initialize a curl_easy (can happen if too many open files)
@@ -1002,7 +1415,7 @@ CURLMsg* LLCurlEasyRequest::info_read(S32* q, LLCurl::TransferInfo* info)
std::string LLCurlEasyRequest::getErrorString()
{
- return mEasy ? std::string(mEasy->getErrorBuffer()) : std::string();
+ return isValid() && mEasy ? std::string(mEasy->getErrorBuffer()) : std::string();
}
////////////////////////////////////////////////////////////////////////////
@@ -1028,12 +1441,17 @@ unsigned long LLCurl::ssl_thread_id(void)
}
#endif
-void LLCurl::initClass()
+void LLCurl::initClass(F32 curl_reuest_timeout, S32 max_number_handles, bool multi_threaded)
{
+ sCurlRequestTimeOut = curl_reuest_timeout ; //seconds
+ sMaxHandles = max_number_handles ; //max number of handles, (multi handles and easy handles combined).
+
// Do not change this "unless you are familiar with and mean to control
// internal operations of libcurl"
// - http://curl.haxx.se/libcurl/c/curl_global_init.html
- curl_global_init(CURL_GLOBAL_ALL);
+ CURLcode code = curl_global_init(CURL_GLOBAL_ALL);
+
+ check_curl_code(code);
#if SAFE_SSL
S32 mutex_count = CRYPTO_num_locks();
@@ -1044,15 +1462,126 @@ void LLCurl::initClass()
CRYPTO_set_id_callback(&LLCurl::ssl_thread_id);
CRYPTO_set_locking_callback(&LLCurl::ssl_locking_callback);
#endif
+
+ sCurlThread = new LLCurlThread(multi_threaded) ;
+ if(multi_threaded)
+ {
+ sHandleMutexp = new LLMutex(NULL) ;
+ Easy::sHandleMutexp = new LLMutex(NULL) ;
+ }
}
void LLCurl::cleanupClass()
{
+ sNotQuitting = false; //set quitting
+
+ //shut down curl thread
+ while(1)
+ {
+ if(!sCurlThread->update(1)) //finish all tasks
+ {
+ break ;
+ }
+ }
+ sCurlThread->shutdown() ;
+ delete sCurlThread ;
+ sCurlThread = NULL ;
+
#if SAFE_SSL
CRYPTO_set_locking_callback(NULL);
for_each(sSSLMutex.begin(), sSSLMutex.end(), DeletePointer());
#endif
- curl_global_cleanup();
+
+ for (std::set<CURL*>::iterator iter = Easy::sFreeHandles.begin(); iter != Easy::sFreeHandles.end(); ++iter)
+ {
+ CURL* curl = *iter;
+ LLCurl::deleteEasyHandle(curl);
+ }
+
+ Easy::sFreeHandles.clear();
+
+ delete Easy::sHandleMutexp ;
+ Easy::sHandleMutexp = NULL ;
+
+ delete sHandleMutexp ;
+ sHandleMutexp = NULL ;
+
+ llassert(Easy::sActiveHandles.empty());
+}
+
+//static
+CURLM* LLCurl::newMultiHandle()
+{
+ LLMutexLock lock(sHandleMutexp) ;
+
+ if(sTotalHandles + 1 > sMaxHandles)
+ {
+ llwarns << "no more handles available." << llendl ;
+ return NULL ; //failed
+ }
+ sTotalHandles++;
+
+ CURLM* ret = curl_multi_init() ;
+ if(!ret)
+ {
+ llwarns << "curl_multi_init failed." << llendl ;
+ }
+
+ return ret ;
+}
+
+//static
+CURLMcode LLCurl::deleteMultiHandle(CURLM* handle)
+{
+ if(handle)
+ {
+ LLMutexLock lock(sHandleMutexp) ;
+ sTotalHandles-- ;
+ return curl_multi_cleanup(handle) ;
+ }
+ return CURLM_OK ;
+}
+
+//static
+CURL* LLCurl::newEasyHandle()
+{
+ LLMutexLock lock(sHandleMutexp) ;
+
+ if(sTotalHandles + 1 > sMaxHandles)
+ {
+ llwarns << "no more handles available." << llendl ;
+ return NULL ; //failed
+ }
+ sTotalHandles++;
+
+ CURL* ret = curl_easy_init() ;
+ if(!ret)
+ {
+ llwarns << "curl_easy_init failed." << llendl ;
+ }
+
+ return ret ;
+}
+
+//static
+void LLCurl::deleteEasyHandle(CURL* handle)
+{
+ if(handle)
+ {
+ LLMutexLock lock(sHandleMutexp) ;
+ curl_easy_cleanup(handle) ;
+ sTotalHandles-- ;
+ }
}
const unsigned int LLCurl::MAX_REDIRECTS = 5;
+
+// Provide access to LLCurl free functions outside of llcurl.cpp without polluting the global namespace.
+void LLCurlFF::check_easy_code(CURLcode code)
+{
+ check_curl_code(code);
+}
+void LLCurlFF::check_multi_code(CURLMcode code)
+{
+ check_curl_multi_code(code);
+}
diff --git a/indra/llmessage/llcurl.h b/indra/llmessage/llcurl.h
index 64dadd6640..fd664c0fa1 100644
--- a/indra/llmessage/llcurl.h
+++ b/indra/llmessage/llcurl.h
@@ -41,8 +41,12 @@
#include "llbuffer.h"
#include "lliopipe.h"
#include "llsd.h"
+#include "llthread.h"
+#include "llqueuedthread.h"
+#include "llframetimer.h"
class LLMutex;
+class LLCurlThread;
// For whatever reason, this is not typedef'd in curl.h
typedef size_t (*curl_header_callback)(void *ptr, size_t size, size_t nmemb, void *stream);
@@ -159,7 +163,7 @@ public:
/**
* @ brief Initialize LLCurl class
*/
- static void initClass();
+ static void initClass(F32 curl_reuest_timeout = 120.f, S32 max_number_handles = 256, bool multi_threaded = false);
/**
* @ brief Cleanup LLCurl class
@@ -178,12 +182,201 @@ public:
static void ssl_locking_callback(int mode, int type, const char *file, int line);
static unsigned long ssl_thread_id(void);
+ static LLCurlThread* getCurlThread() { return sCurlThread ;}
+
+ static CURLM* newMultiHandle() ;
+ static CURLMcode deleteMultiHandle(CURLM* handle) ;
+ static CURL* newEasyHandle() ;
+ static void deleteEasyHandle(CURL* handle) ;
+
private:
static std::string sCAPath;
static std::string sCAFile;
static const unsigned int MAX_REDIRECTS;
+ static LLCurlThread* sCurlThread;
+
+ static LLMutex* sHandleMutexp ;
+ static S32 sTotalHandles ;
+ static S32 sMaxHandles;
+public:
+ static bool sNotQuitting;
+ static F32 sCurlRequestTimeOut;
+};
+
+class LLCurl::Easy
+{
+ LOG_CLASS(Easy);
+
+private:
+ Easy();
+
+public:
+ static Easy* getEasy();
+ ~Easy();
+
+ CURL* getCurlHandle() const { return mCurlEasyHandle; }
+
+ void setErrorBuffer();
+ void setCA();
+
+ void setopt(CURLoption option, S32 value);
+ // These assume the setter does not free value!
+ void setopt(CURLoption option, void* value);
+ void setopt(CURLoption option, char* value);
+ // Copies the string so that it is guaranteed to stick around
+ void setoptString(CURLoption option, const std::string& value);
+
+ void slist_append(const char* str);
+ void setHeaders();
+
+ U32 report(CURLcode);
+ void getTransferInfo(LLCurl::TransferInfo* info);
+
+ void prepRequest(const std::string& url, const std::vector<std::string>& headers, LLCurl::ResponderPtr, S32 time_out = 0, bool post = false);
+
+ const char* getErrorBuffer();
+
+ std::stringstream& getInput() { return mInput; }
+ std::stringstream& getHeaderOutput() { return mHeaderOutput; }
+ LLIOPipe::buffer_ptr_t& getOutput() { return mOutput; }
+ const LLChannelDescriptors& getChannels() { return mChannels; }
+
+ void resetState();
+
+ static CURL* allocEasyHandle();
+ static void releaseEasyHandle(CURL* handle);
+
+private:
+ friend class LLCurl;
+ friend class LLCurl::Multi;
+
+ CURL* mCurlEasyHandle;
+ struct curl_slist* mHeaders;
+
+ std::stringstream mRequest;
+ LLChannelDescriptors mChannels;
+ LLIOPipe::buffer_ptr_t mOutput;
+ std::stringstream mInput;
+ std::stringstream mHeaderOutput;
+ char mErrorBuffer[CURL_ERROR_SIZE];
+
+ // Note: char*'s not strings since we pass pointers to curl
+ std::vector<char*> mStrings;
+
+ LLCurl::ResponderPtr mResponder;
+
+ static std::set<CURL*> sFreeHandles;
+ static std::set<CURL*> sActiveHandles;
+ static LLMutex* sHandleMutexp ;
+};
+
+class LLCurl::Multi
+{
+ LOG_CLASS(Multi);
+
+ friend class LLCurlThread ;
+
+private:
+ ~Multi();
+
+ void markDead() ;
+ bool doPerform();
+
+public:
+
+ typedef enum
+ {
+ STATE_READY=0,
+ STATE_PERFORMING=1,
+ STATE_COMPLETED=2
+ } ePerformState;
+
+ Multi(F32 idle_time_out = 0.f);
+
+ LLCurl::Easy* allocEasy();
+ bool addEasy(LLCurl::Easy* easy);
+ void removeEasy(LLCurl::Easy* easy);
+
+ void lock() ;
+ void unlock() ;
+
+ void setState(ePerformState state) ;
+ ePerformState getState() ;
+
+ bool isCompleted() ;
+ bool isValid() {return mCurlMultiHandle != NULL ;}
+ bool isDead() {return mDead;}
+
+ bool waitToComplete() ;
+
+ S32 process();
+
+ CURLMsg* info_read(S32* msgs_in_queue);
+
+ S32 mQueued;
+ S32 mErrorCount;
+
+private:
+ void easyFree(LLCurl::Easy*);
+ void cleanup() ;
+
+ CURLM* mCurlMultiHandle;
+
+ typedef std::set<LLCurl::Easy*> easy_active_list_t;
+ easy_active_list_t mEasyActiveList;
+ typedef std::map<CURL*, LLCurl::Easy*> easy_active_map_t;
+ easy_active_map_t mEasyActiveMap;
+ typedef std::set<LLCurl::Easy*> easy_free_list_t;
+ easy_free_list_t mEasyFreeList;
+
+ LLQueuedThread::handle_t mHandle ;
+ ePerformState mState;
+
+ BOOL mDead ;
+ LLMutex* mMutexp ;
+ LLMutex* mDeletionMutexp ;
+ LLMutex* mEasyMutexp ;
+ LLFrameTimer mIdleTimer ;
+ F32 mIdleTimeOut;
};
+class LLCurlThread : public LLQueuedThread
+{
+public:
+
+ class CurlRequest : public LLQueuedThread::QueuedRequest
+ {
+ protected:
+ virtual ~CurlRequest(); // use deleteRequest()
+
+ public:
+ CurlRequest(handle_t handle, LLCurl::Multi* multi, LLCurlThread* curl_thread);
+
+ /*virtual*/ bool processRequest();
+ /*virtual*/ void finishRequest(bool completed);
+
+ private:
+ // input
+ LLCurl::Multi* mMulti;
+ LLCurlThread* mCurlThread;
+ };
+ friend class CurlRequest;
+
+public:
+ LLCurlThread(bool threaded = true) ;
+ virtual ~LLCurlThread() ;
+
+ S32 update(F32 max_time_ms);
+
+ void addMulti(LLCurl::Multi* multi) ;
+ void killMulti(LLCurl::Multi* multi) ;
+
+private:
+ bool doMultiPerform(LLCurl::Multi* multi) ;
+ void deleteMulti(LLCurl::Multi* multi) ;
+ void cleanupMulti(LLCurl::Multi* multi) ;
+} ;
+
namespace boost
{
void intrusive_ptr_add_ref(LLCurl::Responder* p);
@@ -201,7 +394,9 @@ public:
void get(const std::string& url, LLCurl::ResponderPtr responder);
bool getByteRange(const std::string& url, const headers_t& headers, S32 offset, S32 length, LLCurl::ResponderPtr responder);
- bool post(const std::string& url, const headers_t& headers, const LLSD& data, LLCurl::ResponderPtr responder);
+ bool post(const std::string& url, const headers_t& headers, const LLSD& data, LLCurl::ResponderPtr responder, S32 time_out = 0);
+ bool post(const std::string& url, const headers_t& headers, const std::string& data, LLCurl::ResponderPtr responder, S32 time_out = 0);
+
S32 process();
S32 getQueued();
@@ -215,7 +410,7 @@ private:
curlmulti_set_t mMultiSet;
LLCurl::Multi* mActiveMulti;
S32 mActiveRequestCount;
- U32 mThreadID; // debug
+ BOOL mProcessing;
};
class LLCurlEasyRequest
@@ -233,9 +428,13 @@ public:
void slist_append(const char* str);
void sendRequest(const std::string& url);
void requestComplete();
- S32 perform();
bool getResult(CURLcode* result, LLCurl::TransferInfo* info = NULL);
std::string getErrorString();
+ bool isCompleted() {return mMulti->isCompleted() ;}
+ bool wait() { return mMulti->waitToComplete(); }
+ bool isValid() {return mMulti && mMulti->isValid(); }
+
+ LLCurl::Easy* getEasy() const { return mEasy; }
private:
CURLMsg* info_read(S32* queue, LLCurl::TransferInfo* info);
@@ -247,4 +446,11 @@ private:
bool mResultReturned;
};
+// Provide access to LLCurl free functions outside of llcurl.cpp without polluting the global namespace.
+namespace LLCurlFF
+{
+ void check_easy_code(CURLcode code);
+ void check_multi_code(CURLMcode code);
+}
+
#endif // LL_LLCURL_H
diff --git a/indra/llmessage/lldatapacker.h b/indra/llmessage/lldatapacker.h
index dd9c4eaa38..b0a638c16e 100644
--- a/indra/llmessage/lldatapacker.h
+++ b/indra/llmessage/lldatapacker.h
@@ -168,10 +168,15 @@ public:
S32 getCurrentSize() const { return (S32)(mCurBufferp - mBufferp); }
S32 getBufferSize() const { return mBufferSize; }
+ const U8* getBuffer() const { return mBufferp; }
void reset() { mCurBufferp = mBufferp; mWriteEnabled = (mCurBufferp != NULL); }
void freeBuffer() { delete [] mBufferp; mBufferp = mCurBufferp = NULL; mBufferSize = 0; mWriteEnabled = FALSE; }
void assignBuffer(U8 *bufferp, S32 size)
{
+ if(mBufferp && mBufferp != bufferp)
+ {
+ freeBuffer() ;
+ }
mBufferp = bufferp;
mCurBufferp = bufferp;
mBufferSize = size;
diff --git a/indra/llmessage/llfiltersd2xmlrpc.cpp b/indra/llmessage/llfiltersd2xmlrpc.cpp
index 812ef7c151..e0ca056a5f 100644
--- a/indra/llmessage/llfiltersd2xmlrpc.cpp
+++ b/indra/llmessage/llfiltersd2xmlrpc.cpp
@@ -308,6 +308,7 @@ LLFilterSD2XMLRPCResponse::~LLFilterSD2XMLRPCResponse()
}
+static LLFastTimer::DeclareTimer FTM_PROCESS_SD2XMLRPC_RESPONSE("SD2XMLRPC Response");
// virtual
LLIOPipe::EStatus LLFilterSD2XMLRPCResponse::process_impl(
const LLChannelDescriptors& channels,
@@ -316,6 +317,8 @@ LLIOPipe::EStatus LLFilterSD2XMLRPCResponse::process_impl(
LLSD& context,
LLPumpIO* pump)
{
+ LLFastTimer t(FTM_PROCESS_SD2XMLRPC_RESPONSE);
+
PUMP_DEBUG;
// This pipe does not work if it does not have everyting. This
// could be addressed by making a stream parser for llsd which
@@ -382,6 +385,8 @@ LLFilterSD2XMLRPCRequest::~LLFilterSD2XMLRPCRequest()
{
}
+static LLFastTimer::DeclareTimer FTM_PROCESS_SD2XMLRPC_REQUEST("S22XMLRPC Request");
+
// virtual
LLIOPipe::EStatus LLFilterSD2XMLRPCRequest::process_impl(
const LLChannelDescriptors& channels,
@@ -390,6 +395,7 @@ LLIOPipe::EStatus LLFilterSD2XMLRPCRequest::process_impl(
LLSD& context,
LLPumpIO* pump)
{
+ LLFastTimer t(FTM_PROCESS_SD2XMLRPC_REQUEST);
// This pipe does not work if it does not have everyting. This
// could be addressed by making a stream parser for llsd which
// handled partial information.
@@ -586,6 +592,8 @@ LLFilterXMLRPCResponse2LLSD::~LLFilterXMLRPCResponse2LLSD()
{
}
+static LLFastTimer::DeclareTimer FTM_PROCESS_XMLRPC2LLSD_RESPONSE("XMLRPC2LLSD Response");
+
LLIOPipe::EStatus LLFilterXMLRPCResponse2LLSD::process_impl(
const LLChannelDescriptors& channels,
buffer_ptr_t& buffer,
@@ -593,6 +601,8 @@ LLIOPipe::EStatus LLFilterXMLRPCResponse2LLSD::process_impl(
LLSD& context,
LLPumpIO* pump)
{
+ LLFastTimer t(FTM_PROCESS_XMLRPC2LLSD_RESPONSE);
+
PUMP_DEBUG;
if(!eos) return STATUS_BREAK;
if(!buffer) return STATUS_ERROR;
@@ -668,6 +678,7 @@ LLFilterXMLRPCRequest2LLSD::~LLFilterXMLRPCRequest2LLSD()
{
}
+static LLFastTimer::DeclareTimer FTM_PROCESS_XMLRPC2LLSD_REQUEST("XMLRPC2LLSD Request");
LLIOPipe::EStatus LLFilterXMLRPCRequest2LLSD::process_impl(
const LLChannelDescriptors& channels,
buffer_ptr_t& buffer,
@@ -675,6 +686,7 @@ LLIOPipe::EStatus LLFilterXMLRPCRequest2LLSD::process_impl(
LLSD& context,
LLPumpIO* pump)
{
+ LLFastTimer t(FTM_PROCESS_XMLRPC2LLSD_REQUEST);
PUMP_DEBUG;
if(!eos) return STATUS_BREAK;
if(!buffer) return STATUS_ERROR;
diff --git a/indra/llmessage/llhttpassetstorage.cpp b/indra/llmessage/llhttpassetstorage.cpp
index 9ea2ff4153..612d765969 100644
--- a/indra/llmessage/llhttpassetstorage.cpp
+++ b/indra/llmessage/llhttpassetstorage.cpp
@@ -33,6 +33,7 @@
#include "indra_constants.h"
#include "message.h"
+#include "llproxy.h"
#include "llvfile.h"
#include "llvfs.h"
@@ -174,8 +175,8 @@ LLSD LLHTTPAssetRequest::getFullDetails() const
double curl_total_time = -1.0f;
double curl_size_upload = -1.0f;
double curl_size_download = -1.0f;
- long curl_content_length_upload = -1;
- long curl_content_length_download = -1;
+ double curl_content_length_upload = -1.0f;
+ double curl_content_length_download = -1.0f;
long curl_request_size = -1;
const char* curl_content_type = NULL;
@@ -194,8 +195,8 @@ LLSD LLHTTPAssetRequest::getFullDetails() const
sd["curl_total_time"] = curl_total_time;
sd["curl_size_upload"] = curl_size_upload;
sd["curl_size_download"] = curl_size_download;
- sd["curl_content_length_upload"] = (int) curl_content_length_upload;
- sd["curl_content_length_download"] = (int) curl_content_length_download;
+ sd["curl_content_length_upload"] = curl_content_length_upload;
+ sd["curl_content_length_download"] = curl_content_length_download;
sd["curl_request_size"] = (int) curl_request_size;
if (curl_content_type)
{
@@ -231,7 +232,12 @@ LLSD LLHTTPAssetRequest::getFullDetails() const
void LLHTTPAssetRequest::setupCurlHandle()
{
// *NOTE: Similar code exists in mapserver/llcurlutil.cpp JC
- mCurlHandle = curl_easy_init();
+ mCurlHandle = LLCurl::newEasyHandle();
+ llassert_always(mCurlHandle != NULL) ;
+
+ // Apply proxy settings if configured to do so
+ LLProxy::getInstance()->applyProxySettings(mCurlHandle);
+
curl_easy_setopt(mCurlHandle, CURLOPT_NOSIGNAL, 1);
curl_easy_setopt(mCurlHandle, CURLOPT_NOPROGRESS, 1);
curl_easy_setopt(mCurlHandle, CURLOPT_URL, mURLBuffer.c_str());
@@ -273,7 +279,7 @@ void LLHTTPAssetRequest::setupCurlHandle()
void LLHTTPAssetRequest::cleanupCurlHandle()
{
- curl_easy_cleanup(mCurlHandle);
+ LLCurl::deleteEasyHandle(mCurlHandle);
if (mAssetStoragep)
{
// Terminating a request. Thus upload or download is no longer pending.
@@ -424,12 +430,13 @@ void LLHTTPAssetStorage::_init(const std::string& web_host, const std::string& l
// curl_global_init moved to LLCurl::initClass()
- mCurlMultiHandle = curl_multi_init();
+ mCurlMultiHandle = LLCurl::newMultiHandle() ;
+ llassert_always(mCurlMultiHandle != NULL) ;
}
LLHTTPAssetStorage::~LLHTTPAssetStorage()
{
- curl_multi_cleanup(mCurlMultiHandle);
+ LLCurl::deleteMultiHandle(mCurlMultiHandle);
mCurlMultiHandle = NULL;
// curl_global_cleanup moved to LLCurl::initClass()
diff --git a/indra/llmessage/llhttpclient.cpp b/indra/llmessage/llhttpclient.cpp
index 0e5206a520..0c325a68aa 100644
--- a/indra/llmessage/llhttpclient.cpp
+++ b/indra/llmessage/llhttpclient.cpp
@@ -158,7 +158,7 @@ namespace
if(fstream.is_open())
{
fstream.seekg(0, std::ios::end);
- U32 fileSize = fstream.tellg();
+ U32 fileSize = (U32)fstream.tellg();
fstream.seekg(0, std::ios::beg);
std::vector<char> fileBuffer(fileSize);
fstream.read(&fileBuffer[0], fileSize);
@@ -228,6 +228,12 @@ static void request(
LLPumpIO::chain_t chain;
LLURLRequest* req = new LLURLRequest(method, url);
+ if(!req->isValid())//failed
+ {
+ delete req ;
+ return ;
+ }
+
req->setSSLVerifyCallback(LLHTTPClient::getCertVerifyCallback(), (void *)req);
@@ -423,11 +429,16 @@ static LLSD blocking_request(
{
lldebugs << "blockingRequest of " << url << llendl;
char curl_error_buffer[CURL_ERROR_SIZE] = "\0";
- CURL* curlp = curl_easy_init();
+ CURL* curlp = LLCurl::newEasyHandle();
+ llassert_always(curlp != NULL) ;
+
LLHTTPBuffer http_buffer;
std::string body_str;
// other request method checks root cert first, we skip?
+
+ // Apply configured proxy settings
+ LLProxy::getInstance()->applyProxySettings(curlp);
// * Set curl handle options
curl_easy_setopt(curlp, CURLOPT_NOSIGNAL, 1); // don't use SIGALRM for timeouts
@@ -436,7 +447,7 @@ static LLSD blocking_request(
curl_easy_setopt(curlp, CURLOPT_WRITEDATA, &http_buffer);
curl_easy_setopt(curlp, CURLOPT_URL, url.c_str());
curl_easy_setopt(curlp, CURLOPT_ERRORBUFFER, curl_error_buffer);
-
+
// * Setup headers (don't forget to free them after the call!)
curl_slist* headers_list = NULL;
if (headers.isMap())
@@ -514,7 +525,7 @@ static LLSD blocking_request(
}
// * Cleanup
- curl_easy_cleanup(curlp);
+ LLCurl::deleteEasyHandle(curlp);
return response;
}
diff --git a/indra/llmessage/lliohttpserver.cpp b/indra/llmessage/lliohttpserver.cpp
index 3b18a9177c..987f386aa3 100644
--- a/indra/llmessage/lliohttpserver.cpp
+++ b/indra/llmessage/lliohttpserver.cpp
@@ -140,6 +140,7 @@ private:
LLSD mHeaders;
};
+static LLFastTimer::DeclareTimer FTM_PROCESS_HTTP_PIPE("HTTP Pipe");
LLIOPipe::EStatus LLHTTPPipe::process_impl(
const LLChannelDescriptors& channels,
buffer_ptr_t& buffer,
@@ -147,6 +148,7 @@ LLIOPipe::EStatus LLHTTPPipe::process_impl(
LLSD& context,
LLPumpIO* pump)
{
+ LLFastTimer t(FTM_PROCESS_HTTP_PIPE);
PUMP_DEBUG;
lldebugs << "LLSDHTTPServer::process_impl" << llendl;
@@ -428,6 +430,9 @@ protected:
/**
* LLHTTPResponseHeader
*/
+
+static LLFastTimer::DeclareTimer FTM_PROCESS_HTTP_HEADER("HTTP Header");
+
// virtual
LLIOPipe::EStatus LLHTTPResponseHeader::process_impl(
const LLChannelDescriptors& channels,
@@ -436,6 +441,7 @@ LLIOPipe::EStatus LLHTTPResponseHeader::process_impl(
LLSD& context,
LLPumpIO* pump)
{
+ LLFastTimer t(FTM_PROCESS_HTTP_HEADER);
PUMP_DEBUG;
LLMemType m1(LLMemType::MTYPE_IO_HTTP_SERVER);
if(eos)
@@ -630,6 +636,8 @@ void LLHTTPResponder::markBad(
<< "</body>\n</html>\n";
}
+static LLFastTimer::DeclareTimer FTM_PROCESS_HTTP_RESPONDER("HTTP Responder");
+
// virtual
LLIOPipe::EStatus LLHTTPResponder::process_impl(
const LLChannelDescriptors& channels,
@@ -638,6 +646,7 @@ LLIOPipe::EStatus LLHTTPResponder::process_impl(
LLSD& context,
LLPumpIO* pump)
{
+ LLFastTimer t(FTM_PROCESS_HTTP_RESPONDER);
PUMP_DEBUG;
LLMemType m1(LLMemType::MTYPE_IO_HTTP_SERVER);
LLIOPipe::EStatus status = STATUS_OK;
@@ -809,6 +818,8 @@ LLIOPipe::EStatus LLHTTPResponder::process_impl(
// Copy everything after mLast read to the out.
LLBufferArray::segment_iterator_t seg_iter;
+
+ buffer->lock();
seg_iter = buffer->splitAfter(mLastRead);
if(seg_iter != buffer->endSegment())
{
@@ -829,7 +840,7 @@ LLIOPipe::EStatus LLHTTPResponder::process_impl(
}
#endif
}
-
+ buffer->unlock();
//
// *FIX: get rid of extra bytes off the end
//
diff --git a/indra/llmessage/lliopipe.cpp b/indra/llmessage/lliopipe.cpp
index 6e4eec74a6..8f827f7a30 100644
--- a/indra/llmessage/lliopipe.cpp
+++ b/indra/llmessage/lliopipe.cpp
@@ -75,6 +75,12 @@ LLIOPipe::~LLIOPipe()
//lldebugs << "destroying LLIOPipe" << llendl;
}
+//virtual
+bool LLIOPipe::isValid()
+{
+ return true ;
+}
+
// static
std::string LLIOPipe::lookupStatusString(EStatus status)
{
diff --git a/indra/llmessage/lliopipe.h b/indra/llmessage/lliopipe.h
index 8e656b6da1..cbd17b5a3d 100644
--- a/indra/llmessage/lliopipe.h
+++ b/indra/llmessage/lliopipe.h
@@ -231,6 +231,8 @@ public:
*/
virtual ~LLIOPipe();
+ virtual bool isValid() ;
+
protected:
/**
* @brief Base Constructor.
diff --git a/indra/llmessage/lliosocket.cpp b/indra/llmessage/lliosocket.cpp
index ca84fa8bb8..d5b4d45821 100644
--- a/indra/llmessage/lliosocket.cpp
+++ b/indra/llmessage/lliosocket.cpp
@@ -191,7 +191,7 @@ LLSocket::ptr_t LLSocket::create(apr_pool_t* pool, EType type, U16 port)
port = PORT_EPHEMERAL;
}
rv->mPort = port;
- rv->setOptions();
+ rv->setNonBlocking();
return rv;
}
@@ -206,7 +206,7 @@ LLSocket::ptr_t LLSocket::create(apr_socket_t* socket, apr_pool_t* pool)
}
rv = ptr_t(new LLSocket(socket, pool));
rv->mPort = PORT_EPHEMERAL;
- rv->setOptions();
+ rv->setNonBlocking();
return rv;
}
@@ -227,10 +227,10 @@ bool LLSocket::blockingConnect(const LLHost& host)
{
return false;
}
- apr_socket_timeout_set(mSocket, 1000);
+ setBlocking(1000);
ll_debug_socket("Blocking connect", mSocket);
if(ll_apr_warn_status(apr_socket_connect(mSocket, sa))) return false;
- setOptions();
+ setNonBlocking();
return true;
}
@@ -251,6 +251,7 @@ LLSocket::~LLSocket()
{
ll_debug_socket("Destroying socket", mSocket);
apr_socket_close(mSocket);
+ mSocket = NULL;
}
if(mPool)
{
@@ -258,11 +259,27 @@ LLSocket::~LLSocket()
}
}
-void LLSocket::setOptions()
+// See http://dev.ariel-networks.com/apr/apr-tutorial/html/apr-tutorial-13.html#ss13.4
+// for an explanation of how to get non-blocking sockets and timeouts with
+// consistent behavior across platforms.
+
+void LLSocket::setBlocking(S32 timeout)
+{
+ LLMemType m1(LLMemType::MTYPE_IO_TCP);
+ // set up the socket options
+ ll_apr_warn_status(apr_socket_timeout_set(mSocket, timeout));
+ ll_apr_warn_status(apr_socket_opt_set(mSocket, APR_SO_NONBLOCK, 0));
+ ll_apr_warn_status(apr_socket_opt_set(mSocket, APR_SO_SNDBUF, LL_SEND_BUFFER_SIZE));
+ ll_apr_warn_status(apr_socket_opt_set(mSocket, APR_SO_RCVBUF, LL_RECV_BUFFER_SIZE));
+
+}
+
+void LLSocket::setNonBlocking()
{
LLMemType m1(LLMemType::MTYPE_IO_TCP);
// set up the socket options
ll_apr_warn_status(apr_socket_timeout_set(mSocket, 0));
+ ll_apr_warn_status(apr_socket_opt_set(mSocket, APR_SO_NONBLOCK, 1));
ll_apr_warn_status(apr_socket_opt_set(mSocket, APR_SO_SNDBUF, LL_SEND_BUFFER_SIZE));
ll_apr_warn_status(apr_socket_opt_set(mSocket, APR_SO_RCVBUF, LL_RECV_BUFFER_SIZE));
@@ -285,6 +302,8 @@ LLIOSocketReader::~LLIOSocketReader()
//lldebugs << "Destroying LLIOSocketReader" << llendl;
}
+static LLFastTimer::DeclareTimer FTM_PROCESS_SOCKET_READER("Socket Reader");
+
// virtual
LLIOPipe::EStatus LLIOSocketReader::process_impl(
const LLChannelDescriptors& channels,
@@ -293,6 +312,7 @@ LLIOPipe::EStatus LLIOSocketReader::process_impl(
LLSD& context,
LLPumpIO* pump)
{
+ LLFastTimer t(FTM_PROCESS_SOCKET_READER);
PUMP_DEBUG;
LLMemType m1(LLMemType::MTYPE_IO_TCP);
if(!mSource) return STATUS_PRECONDITION_NOT_MET;
@@ -385,6 +405,7 @@ LLIOSocketWriter::~LLIOSocketWriter()
//lldebugs << "Destroying LLIOSocketWriter" << llendl;
}
+static LLFastTimer::DeclareTimer FTM_PROCESS_SOCKET_WRITER("Socket Writer");
// virtual
LLIOPipe::EStatus LLIOSocketWriter::process_impl(
const LLChannelDescriptors& channels,
@@ -393,6 +414,7 @@ LLIOPipe::EStatus LLIOSocketWriter::process_impl(
LLSD& context,
LLPumpIO* pump)
{
+ LLFastTimer t(FTM_PROCESS_SOCKET_WRITER);
PUMP_DEBUG;
LLMemType m1(LLMemType::MTYPE_IO_TCP);
if(!mDestination) return STATUS_PRECONDITION_NOT_MET;
@@ -423,6 +445,7 @@ LLIOPipe::EStatus LLIOSocketWriter::process_impl(
// efficient - not only because writev() is better, but also
// because we won't have to do as much work to find the start
// address.
+ buffer->lock();
LLBufferArray::segment_iterator_t it;
LLBufferArray::segment_iterator_t end = buffer->endSegment();
LLSegment segment;
@@ -502,6 +525,8 @@ LLIOPipe::EStatus LLIOSocketWriter::process_impl(
}
}
+ buffer->unlock();
+
PUMP_DEBUG;
if(done && eos)
{
@@ -539,6 +564,7 @@ void LLIOServerSocket::setResponseTimeout(F32 timeout_secs)
mResponseTimeout = timeout_secs;
}
+static LLFastTimer::DeclareTimer FTM_PROCESS_SERVER_SOCKET("Server Socket");
// virtual
LLIOPipe::EStatus LLIOServerSocket::process_impl(
const LLChannelDescriptors& channels,
@@ -547,6 +573,7 @@ LLIOPipe::EStatus LLIOServerSocket::process_impl(
LLSD& context,
LLPumpIO* pump)
{
+ LLFastTimer t(FTM_PROCESS_SERVER_SOCKET);
PUMP_DEBUG;
LLMemType m1(LLMemType::MTYPE_IO_TCP);
if(!pump)
diff --git a/indra/llmessage/lliosocket.h b/indra/llmessage/lliosocket.h
index 6806e5084a..be0f7dfcc6 100644
--- a/indra/llmessage/lliosocket.h
+++ b/indra/llmessage/lliosocket.h
@@ -145,18 +145,25 @@ public:
*/
apr_socket_t* getSocket() const { return mSocket; }
-protected:
/**
+ * @brief Set default socket options, with SO_NONBLOCK = 0 and a timeout in us.
+ * @param timeout Number of microseconds to wait on this socket. Any
+ * negative number means block-forever. TIMEOUT OF 0 IS NON-PORTABLE.
+ */
+ void setBlocking(S32 timeout);
+
+ /**
+ * @brief Set default socket options, with SO_NONBLOCK = 1 and timeout = 0.
+ */
+ void setNonBlocking();
+
+protected:
+ /**
* @brief Protected constructor since should only make sockets
* with one of the two <code>create()</code> calls.
*/
LLSocket(apr_socket_t* socket, apr_pool_t* pool);
- /**
- * @brief Set default socket options.
- */
- void setOptions();
-
public:
/**
* @brief Do not call this directly.
diff --git a/indra/llmessage/llioutil.cpp b/indra/llmessage/llioutil.cpp
index 2e6ee59ff2..8c50fd5069 100644
--- a/indra/llmessage/llioutil.cpp
+++ b/indra/llmessage/llioutil.cpp
@@ -43,6 +43,8 @@ LLIOPipe::EStatus LLIOFlush::process_impl(
return STATUS_OK;
}
+
+static LLFastTimer::DeclareTimer FTM_PROCESS_SLEEP("IO Sleep");
/**
* @class LLIOSleep
*/
@@ -53,6 +55,7 @@ LLIOPipe::EStatus LLIOSleep::process_impl(
LLSD& context,
LLPumpIO* pump)
{
+ LLFastTimer t(FTM_PROCESS_SLEEP);
if(mSeconds > 0.0)
{
if(pump) pump->sleepChain(mSeconds);
@@ -62,6 +65,7 @@ LLIOPipe::EStatus LLIOSleep::process_impl(
return STATUS_DONE;
}
+static LLFastTimer::DeclareTimer FTM_PROCESS_ADD_CHAIN("Add Chain");
/**
* @class LLIOAddChain
*/
@@ -72,6 +76,7 @@ LLIOPipe::EStatus LLIOAddChain::process_impl(
LLSD& context,
LLPumpIO* pump)
{
+ LLFastTimer t(FTM_PROCESS_ADD_CHAIN);
pump->addChain(mChain, mTimeout);
return STATUS_DONE;
}
diff --git a/indra/llmessage/llmime.cpp b/indra/llmessage/llmime.cpp
index 943a734927..9d9c4ebd68 100644
--- a/indra/llmessage/llmime.cpp
+++ b/indra/llmessage/llmime.cpp
@@ -388,7 +388,7 @@ bool LLMimeParser::Impl::parseHeaders(
// not to read past limit when we get() the newline.
S32 max_get = llmin((S32)LINE_BUFFER_LENGTH, limit - mScanCount - 1);
istr.getline(mBuffer, max_get, '\r');
- mScanCount += istr.gcount();
+ mScanCount += (S32)istr.gcount();
int c = istr.get();
if(EOF == c)
{
@@ -496,7 +496,7 @@ void LLMimeParser::Impl::scanPastSeparator(
// past limit when we get() the newline.
S32 max_get = llmin((S32)LINE_BUFFER_LENGTH, limit - mScanCount - 1);
istr.getline(mBuffer, max_get, '\r');
- mScanCount += istr.gcount();
+ mScanCount += (S32)istr.gcount();
if(istr.gcount() >= LINE_BUFFER_LENGTH - 1)
{
// that's way too long to be a separator, so ignore it.
diff --git a/indra/llmessage/llpacketring.cpp b/indra/llmessage/llpacketring.cpp
index 8999dec64a..fc6e9c5193 100644
--- a/indra/llmessage/llpacketring.cpp
+++ b/indra/llmessage/llpacketring.cpp
@@ -28,11 +28,20 @@
#include "llpacketring.h"
+#if LL_WINDOWS
+ #include <winsock2.h>
+#else
+ #include <sys/socket.h>
+ #include <netinet/in.h>
+#endif
+
// linden library includes
#include "llerror.h"
#include "lltimer.h"
-#include "timing.h"
+#include "llproxy.h"
#include "llrand.h"
+#include "message.h"
+#include "timing.h"
#include "u64.h"
///////////////////////////////////////////////////////////
@@ -216,8 +225,32 @@ S32 LLPacketRing::receivePacket (S32 socket, char *datap)
else
{
// no delay, pull straight from net
- packet_size = receive_packet(socket, datap);
- mLastSender = ::get_sender();
+ if (LLProxy::isSOCKSProxyEnabled())
+ {
+ U8 buffer[NET_BUFFER_SIZE + SOCKS_HEADER_SIZE];
+ packet_size = receive_packet(socket, static_cast<char*>(static_cast<void*>(buffer)));
+
+ if (packet_size > SOCKS_HEADER_SIZE)
+ {
+ // *FIX We are assuming ATYP is 0x01 (IPv4), not 0x03 (hostname) or 0x04 (IPv6)
+ memcpy(datap, buffer + SOCKS_HEADER_SIZE, packet_size - SOCKS_HEADER_SIZE);
+ proxywrap_t * header = static_cast<proxywrap_t*>(static_cast<void*>(buffer));
+ mLastSender.setAddress(header->addr);
+ mLastSender.setPort(ntohs(header->port));
+
+ packet_size -= SOCKS_HEADER_SIZE; // The unwrapped packet size
+ }
+ else
+ {
+ packet_size = 0;
+ }
+ }
+ else
+ {
+ packet_size = receive_packet(socket, datap);
+ mLastSender = ::get_sender();
+ }
+
mLastReceivingIF = ::get_receiving_interface();
if (packet_size) // did we actually get a packet?
@@ -243,7 +276,7 @@ BOOL LLPacketRing::sendPacket(int h_socket, char * send_buffer, S32 buf_size, LL
BOOL status = TRUE;
if (!mUseOutThrottle)
{
- return send_packet(h_socket, send_buffer, buf_size, host.getAddress(), host.getPort() );
+ return sendPacketImpl(h_socket, send_buffer, buf_size, host );
}
else
{
@@ -264,7 +297,7 @@ BOOL LLPacketRing::sendPacket(int h_socket, char * send_buffer, S32 buf_size, LL
mOutBufferLength -= packetp->getSize();
packet_size = packetp->getSize();
- status = send_packet(h_socket, packetp->getData(), packet_size, packetp->getHost().getAddress(), packetp->getHost().getPort());
+ status = sendPacketImpl(h_socket, packetp->getData(), packet_size, packetp->getHost());
delete packetp;
// Update the throttle
@@ -273,7 +306,7 @@ BOOL LLPacketRing::sendPacket(int h_socket, char * send_buffer, S32 buf_size, LL
else
{
// If the queue's empty, we can just send this packet right away.
- status = send_packet(h_socket, send_buffer, buf_size, host.getAddress(), host.getPort() );
+ status = sendPacketImpl(h_socket, send_buffer, buf_size, host );
packet_size = buf_size;
// Update the throttle
@@ -311,3 +344,29 @@ BOOL LLPacketRing::sendPacket(int h_socket, char * send_buffer, S32 buf_size, LL
return status;
}
+
+BOOL LLPacketRing::sendPacketImpl(int h_socket, const char * send_buffer, S32 buf_size, LLHost host)
+{
+
+ if (!LLProxy::isSOCKSProxyEnabled())
+ {
+ return send_packet(h_socket, send_buffer, buf_size, host.getAddress(), host.getPort());
+ }
+
+ char headered_send_buffer[NET_BUFFER_SIZE + SOCKS_HEADER_SIZE];
+
+ proxywrap_t *socks_header = static_cast<proxywrap_t*>(static_cast<void*>(&headered_send_buffer));
+ socks_header->rsv = 0;
+ socks_header->addr = host.getAddress();
+ socks_header->port = htons(host.getPort());
+ socks_header->atype = ADDRESS_IPV4;
+ socks_header->frag = 0;
+
+ memcpy(headered_send_buffer + SOCKS_HEADER_SIZE, send_buffer, buf_size);
+
+ return send_packet( h_socket,
+ headered_send_buffer,
+ buf_size + SOCKS_HEADER_SIZE,
+ LLProxy::getInstance()->getUDPProxy().getAddress(),
+ LLProxy::getInstance()->getUDPProxy().getPort());
+}
diff --git a/indra/llmessage/llpacketring.h b/indra/llmessage/llpacketring.h
index e6409d2048..b214271e78 100644
--- a/indra/llmessage/llpacketring.h
+++ b/indra/llmessage/llpacketring.h
@@ -30,11 +30,11 @@
#include <queue>
-#include "llpacketbuffer.h"
#include "llhost.h"
-#include "net.h"
+#include "llpacketbuffer.h"
+#include "llproxy.h"
#include "llthrottle.h"
-
+#include "net.h"
class LLPacketRing
{
@@ -82,6 +82,9 @@ protected:
LLHost mLastSender;
LLHost mLastReceivingIF;
+
+private:
+ BOOL sendPacketImpl(int h_socket, const char * send_buffer, S32 buf_size, LLHost host);
};
diff --git a/indra/llmessage/llproxy.cpp b/indra/llmessage/llproxy.cpp
new file mode 100644
index 0000000000..9988fcd9c0
--- /dev/null
+++ b/indra/llmessage/llproxy.cpp
@@ -0,0 +1,546 @@
+/**
+ * @file llproxy.cpp
+ * @brief UDP and HTTP proxy communications
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+
+#include "llproxy.h"
+
+#include <string>
+#include <curl/curl.h>
+
+#include "llapr.h"
+#include "llcurl.h"
+#include "llhost.h"
+
+// Static class variable instances
+
+// We want this to be static to avoid excessive indirection on every
+// incoming packet just to do a simple bool test. The getter for this
+// member is also static
+bool LLProxy::sUDPProxyEnabled = false;
+
+// Some helpful TCP static functions.
+static apr_status_t tcp_blocking_handshake(LLSocket::ptr_t handle, char * dataout, apr_size_t outlen, char * datain, apr_size_t maxinlen); // Do a TCP data handshake
+static LLSocket::ptr_t tcp_open_channel(LLHost host); // Open a TCP channel to a given host
+static void tcp_close_channel(LLSocket::ptr_t* handle_ptr); // Close an open TCP channel
+
+LLProxy::LLProxy():
+ mHTTPProxyEnabled(false),
+ mProxyMutex(NULL),
+ mUDPProxy(),
+ mTCPProxy(),
+ mHTTPProxy(),
+ mProxyType(LLPROXY_SOCKS),
+ mAuthMethodSelected(METHOD_NOAUTH),
+ mSocksUsername(),
+ mSocksPassword()
+{
+}
+
+LLProxy::~LLProxy()
+{
+ stopSOCKSProxy();
+ disableHTTPProxy();
+}
+
+/**
+ * @brief Open the SOCKS 5 TCP control channel.
+ *
+ * Perform a SOCKS 5 authentication and UDP association with the proxy server.
+ *
+ * @param proxy The SOCKS 5 server to connect to.
+ * @return SOCKS_OK if successful, otherwise a socks error code from llproxy.h.
+ */
+S32 LLProxy::proxyHandshake(LLHost proxy)
+{
+ S32 result;
+
+ /* SOCKS 5 Auth request */
+ socks_auth_request_t socks_auth_request;
+ socks_auth_response_t socks_auth_response;
+
+ socks_auth_request.version = SOCKS_VERSION; // SOCKS version 5
+ socks_auth_request.num_methods = 1; // Sending 1 method.
+ socks_auth_request.methods = getSelectedAuthMethod(); // Send only the selected method.
+
+ result = tcp_blocking_handshake(mProxyControlChannel,
+ static_cast<char*>(static_cast<void*>(&socks_auth_request)),
+ sizeof(socks_auth_request),
+ static_cast<char*>(static_cast<void*>(&socks_auth_response)),
+ sizeof(socks_auth_response));
+ if (result != APR_SUCCESS)
+ {
+ LL_WARNS("Proxy") << "SOCKS authentication request failed, error on TCP control channel : " << result << LL_ENDL;
+ stopSOCKSProxy();
+ return SOCKS_CONNECT_ERROR;
+ }
+
+ if (socks_auth_response.method == AUTH_NOT_ACCEPTABLE)
+ {
+ LL_WARNS("Proxy") << "SOCKS 5 server refused all our authentication methods." << LL_ENDL;
+ stopSOCKSProxy();
+ return SOCKS_NOT_ACCEPTABLE;
+ }
+
+ /* SOCKS 5 USERNAME/PASSWORD authentication */
+ if (socks_auth_response.method == METHOD_PASSWORD)
+ {
+ // The server has requested a username/password combination
+ std::string socks_username(getSocksUser());
+ std::string socks_password(getSocksPwd());
+ U32 request_size = socks_username.size() + socks_password.size() + 3;
+ char * password_auth = new char[request_size];
+ password_auth[0] = 0x01;
+ password_auth[1] = socks_username.size();
+ memcpy(&password_auth[2], socks_username.c_str(), socks_username.size());
+ password_auth[socks_username.size() + 2] = socks_password.size();
+ memcpy(&password_auth[socks_username.size() + 3], socks_password.c_str(), socks_password.size());
+
+ authmethod_password_reply_t password_reply;
+
+ result = tcp_blocking_handshake(mProxyControlChannel,
+ password_auth,
+ request_size,
+ static_cast<char*>(static_cast<void*>(&password_reply)),
+ sizeof(password_reply));
+ delete[] password_auth;
+
+ if (result != APR_SUCCESS)
+ {
+ LL_WARNS("Proxy") << "SOCKS authentication failed, error on TCP control channel : " << result << LL_ENDL;
+ stopSOCKSProxy();
+ return SOCKS_CONNECT_ERROR;
+ }
+
+ if (password_reply.status != AUTH_SUCCESS)
+ {
+ LL_WARNS("Proxy") << "SOCKS authentication failed" << LL_ENDL;
+ stopSOCKSProxy();
+ return SOCKS_AUTH_FAIL;
+ }
+ }
+
+ /* SOCKS5 connect request */
+
+ socks_command_request_t connect_request;
+ socks_command_response_t connect_reply;
+
+ connect_request.version = SOCKS_VERSION; // SOCKS V5
+ connect_request.command = COMMAND_UDP_ASSOCIATE; // Associate UDP
+ connect_request.reserved = FIELD_RESERVED;
+ connect_request.atype = ADDRESS_IPV4;
+ connect_request.address = htonl(0); // 0.0.0.0
+ connect_request.port = htons(0); // 0
+ // "If the client is not in possession of the information at the time of the UDP ASSOCIATE,
+ // the client MUST use a port number and address of all zeros. RFC 1928"
+
+ result = tcp_blocking_handshake(mProxyControlChannel,
+ static_cast<char*>(static_cast<void*>(&connect_request)),
+ sizeof(connect_request),
+ static_cast<char*>(static_cast<void*>(&connect_reply)),
+ sizeof(connect_reply));
+ if (result != APR_SUCCESS)
+ {
+ LL_WARNS("Proxy") << "SOCKS connect request failed, error on TCP control channel : " << result << LL_ENDL;
+ stopSOCKSProxy();
+ return SOCKS_CONNECT_ERROR;
+ }
+
+ if (connect_reply.reply != REPLY_REQUEST_GRANTED)
+ {
+ LL_WARNS("Proxy") << "Connection to SOCKS 5 server failed, UDP forward request not granted" << LL_ENDL;
+ stopSOCKSProxy();
+ return SOCKS_UDP_FWD_NOT_GRANTED;
+ }
+
+ mUDPProxy.setPort(ntohs(connect_reply.port)); // reply port is in network byte order
+ mUDPProxy.setAddress(proxy.getAddress());
+ // The connection was successful. We now have the UDP port to send requests that need forwarding to.
+ LL_INFOS("Proxy") << "SOCKS 5 UDP proxy connected on " << mUDPProxy << LL_ENDL;
+
+ return SOCKS_OK;
+}
+
+/**
+ * @brief Initiates a SOCKS 5 proxy session.
+ *
+ * Performs basic checks on host to verify that it is a valid address. Opens the control channel
+ * and then negotiates the proxy connection with the server. Closes any existing SOCKS
+ * connection before proceeding. Also disables an HTTP proxy if it is using SOCKS as the proxy.
+ *
+ *
+ * @param host Socks server to connect to.
+ * @return SOCKS_OK if successful, otherwise a SOCKS error code defined in llproxy.h.
+ */
+S32 LLProxy::startSOCKSProxy(LLHost host)
+{
+ if (host.isOk())
+ {
+ mTCPProxy = host;
+ }
+ else
+ {
+ return SOCKS_INVALID_HOST;
+ }
+
+ // Close any running SOCKS connection.
+ stopSOCKSProxy();
+
+ mProxyControlChannel = tcp_open_channel(mTCPProxy);
+ if (!mProxyControlChannel)
+ {
+ return SOCKS_HOST_CONNECT_FAILED;
+ }
+
+ S32 status = proxyHandshake(mTCPProxy);
+
+ if (status != SOCKS_OK)
+ {
+ // Shut down the proxy if any of the above steps failed.
+ stopSOCKSProxy();
+ }
+ else
+ {
+ // Connection was successful.
+ sUDPProxyEnabled = true;
+ }
+
+ return status;
+}
+
+/**
+ * @brief Stop using the SOCKS 5 proxy.
+ *
+ * This will stop sending UDP packets through the SOCKS 5 proxy
+ * and will also stop the HTTP proxy if it is configured to use SOCKS.
+ * The proxy control channel will also be disconnected.
+ */
+void LLProxy::stopSOCKSProxy()
+{
+ sUDPProxyEnabled = false;
+
+ // If the SOCKS proxy is requested to stop and we are using that for HTTP as well
+ // then we must shut down any HTTP proxy operations. But it is allowable if web
+ // proxy is being used to continue proxying HTTP.
+
+ if (LLPROXY_SOCKS == getHTTPProxyType())
+ {
+ disableHTTPProxy();
+ }
+
+ if (mProxyControlChannel)
+ {
+ tcp_close_channel(&mProxyControlChannel);
+ }
+}
+
+/**
+ * @brief Set the proxy's SOCKS authentication method to none.
+ */
+void LLProxy::setAuthNone()
+{
+ LLMutexLock lock(&mProxyMutex);
+
+ mAuthMethodSelected = METHOD_NOAUTH;
+}
+
+/**
+ * @brief Set the proxy's SOCKS authentication method to password.
+ *
+ * Check whether the lengths of the supplied username
+ * and password conform to the lengths allowed by the
+ * SOCKS protocol.
+ *
+ * @param username The SOCKS username to send.
+ * @param password The SOCKS password to send.
+ * @return Return true if applying the settings was successful. No changes are made if false.
+ *
+ */
+bool LLProxy::setAuthPassword(const std::string &username, const std::string &password)
+{
+ if (username.length() > SOCKSMAXUSERNAMELEN || password.length() > SOCKSMAXPASSWORDLEN ||
+ username.length() < SOCKSMINUSERNAMELEN || password.length() < SOCKSMINPASSWORDLEN)
+ {
+ LL_WARNS("Proxy") << "Invalid SOCKS 5 password or username length." << LL_ENDL;
+ return false;
+ }
+
+ LLMutexLock lock(&mProxyMutex);
+
+ mAuthMethodSelected = METHOD_PASSWORD;
+ mSocksUsername = username;
+ mSocksPassword = password;
+
+ return true;
+}
+
+/**
+ * @brief Enable the HTTP proxy for either SOCKS or HTTP.
+ *
+ * Check the supplied host to see if it is a valid IP and port.
+ *
+ * @param httpHost Proxy server to connect to.
+ * @param type Is the host a SOCKS or HTTP proxy.
+ * @return Return true if applying the setting was successful. No changes are made if false.
+ */
+bool LLProxy::enableHTTPProxy(LLHost httpHost, LLHttpProxyType type)
+{
+ if (!httpHost.isOk())
+ {
+ LL_WARNS("Proxy") << "Invalid SOCKS 5 Server" << LL_ENDL;
+ return false;
+ }
+
+ LLMutexLock lock(&mProxyMutex);
+
+ mHTTPProxy = httpHost;
+ mProxyType = type;
+
+ mHTTPProxyEnabled = true;
+
+ return true;
+}
+
+/**
+ * @brief Enable the HTTP proxy without changing the proxy settings.
+ *
+ * This should not be called unless the proxy has already been set up.
+ *
+ * @return Return true only if the current settings are valid and the proxy was enabled.
+ */
+bool LLProxy::enableHTTPProxy()
+{
+ bool ok;
+
+ LLMutexLock lock(&mProxyMutex);
+
+ ok = (mHTTPProxy.isOk());
+ if (ok)
+ {
+ mHTTPProxyEnabled = true;
+ }
+
+ return ok;
+}
+
+/**
+ * @brief Disable the HTTP proxy.
+ */
+void LLProxy::disableHTTPProxy()
+{
+ LLMutexLock lock(&mProxyMutex);
+
+ mHTTPProxyEnabled = false;
+}
+
+/**
+ * @brief Get the currently selected HTTP proxy type
+ */
+LLHttpProxyType LLProxy::getHTTPProxyType() const
+{
+ LLMutexLock lock(&mProxyMutex);
+ return mProxyType;
+}
+
+/**
+ * @brief Get the SOCKS 5 password.
+ */
+std::string LLProxy::getSocksPwd() const
+{
+ LLMutexLock lock(&mProxyMutex);
+ return mSocksPassword;
+}
+
+/**
+ * @brief Get the SOCKS 5 username.
+ */
+std::string LLProxy::getSocksUser() const
+{
+ LLMutexLock lock(&mProxyMutex);
+ return mSocksUsername;
+}
+
+/**
+ * @brief Get the currently selected SOCKS 5 authentication method.
+ *
+ * @return Returns either none or password.
+ */
+LLSocks5AuthType LLProxy::getSelectedAuthMethod() const
+{
+ LLMutexLock lock(&mProxyMutex);
+ return mAuthMethodSelected;
+}
+
+/**
+ * @brief Stop the LLProxy and make certain that any APR pools and classes are deleted before terminating APR.
+ *
+ * Deletes the LLProxy singleton, destroying the APR pool used by the control channel as well as .
+ */
+//static
+void LLProxy::cleanupClass()
+{
+ getInstance()->stopSOCKSProxy();
+ deleteSingleton();
+}
+
+void LLProxy::applyProxySettings(LLCurlEasyRequest* handle)
+{
+ applyProxySettings(handle->getEasy());
+}
+
+void LLProxy::applyProxySettings(LLCurl::Easy* handle)
+{
+ applyProxySettings(handle->getCurlHandle());
+}
+
+/**
+ * @brief Apply proxy settings to a CuRL request if an HTTP proxy is enabled.
+ *
+ * This method has been designed to be safe to call from
+ * any thread in the viewer. This allows requests in the
+ * texture fetch thread to be aware of the proxy settings.
+ * When the HTTP proxy is enabled, the proxy mutex will
+ * be locked every time this method is called.
+ *
+ * @param handle A pointer to a valid CURL request, before it has been performed.
+ */
+void LLProxy::applyProxySettings(CURL* handle)
+{
+ // Do a faster unlocked check to see if we are supposed to proxy.
+ if (mHTTPProxyEnabled)
+ {
+ // We think we should proxy, lock the proxy mutex.
+ LLMutexLock lock(&mProxyMutex);
+ // Now test again to verify that the proxy wasn't disabled between the first check and the lock.
+ if (mHTTPProxyEnabled)
+ {
+ LLCurlFF::check_easy_code(curl_easy_setopt(handle, CURLOPT_PROXY, mHTTPProxy.getIPString().c_str()));
+ LLCurlFF::check_easy_code(curl_easy_setopt(handle, CURLOPT_PROXYPORT, mHTTPProxy.getPort()));
+
+ if (mProxyType == LLPROXY_SOCKS)
+ {
+ LLCurlFF::check_easy_code(curl_easy_setopt(handle, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5));
+ if (mAuthMethodSelected == METHOD_PASSWORD)
+ {
+ std::string auth_string = mSocksUsername + ":" + mSocksPassword;
+ LLCurlFF::check_easy_code(curl_easy_setopt(handle, CURLOPT_PROXYUSERPWD, auth_string.c_str()));
+ }
+ }
+ else
+ {
+ LLCurlFF::check_easy_code(curl_easy_setopt(handle, CURLOPT_PROXYTYPE, CURLPROXY_HTTP));
+ }
+ }
+ }
+}
+
+/**
+ * @brief Send one TCP packet and receive one in return.
+ *
+ * This operation is done synchronously with a 1000ms timeout. Therefore, it should not be used when a blocking
+ * operation would impact the operation of the viewer.
+ *
+ * @param handle_ptr Pointer to a connected LLSocket of type STREAM_TCP.
+ * @param dataout Data to send.
+ * @param outlen Length of dataout.
+ * @param datain Buffer for received data. Undefined if return value is not APR_SUCCESS.
+ * @param maxinlen Maximum possible length of received data. Short reads are allowed.
+ * @return Indicates APR status code of exchange. APR_SUCCESS if exchange was successful, -1 if invalid data length was received.
+ */
+static apr_status_t tcp_blocking_handshake(LLSocket::ptr_t handle, char * dataout, apr_size_t outlen, char * datain, apr_size_t maxinlen)
+{
+ apr_socket_t* apr_socket = handle->getSocket();
+ apr_status_t rv = APR_SUCCESS;
+
+ apr_size_t expected_len = outlen;
+
+ handle->setBlocking(1000);
+
+ rv = apr_socket_send(apr_socket, dataout, &outlen);
+ if (APR_SUCCESS != rv)
+ {
+ LL_WARNS("Proxy") << "Error sending data to proxy control channel, status: " << rv << LL_ENDL;
+ ll_apr_warn_status(rv);
+ }
+ else if (expected_len != outlen)
+ {
+ LL_WARNS("Proxy") << "Incorrect data length sent. Expected: " << expected_len <<
+ " Sent: " << outlen << LL_ENDL;
+ rv = -1;
+ }
+
+ if (APR_SUCCESS == rv)
+ {
+ expected_len = maxinlen;
+ rv = apr_socket_recv(apr_socket, datain, &maxinlen);
+ if (rv != APR_SUCCESS)
+ {
+ LL_WARNS("Proxy") << "Error receiving data from proxy control channel, status: " << rv << LL_ENDL;
+ ll_apr_warn_status(rv);
+ }
+ else if (expected_len < maxinlen)
+ {
+ LL_WARNS("Proxy") << "Incorrect data length received. Expected: " << expected_len <<
+ " Received: " << maxinlen << LL_ENDL;
+ rv = -1;
+ }
+ }
+
+ handle->setNonBlocking();
+
+ return rv;
+}
+
+/**
+ * @brief Open a LLSocket and do a blocking connect to the chosen host.
+ *
+ * Checks for a successful connection, and makes sure the connection is closed if it fails.
+ *
+ * @param host The host to open the connection to.
+ * @return The created socket. Will evaluate as NULL if the connection is unsuccessful.
+ */
+static LLSocket::ptr_t tcp_open_channel(LLHost host)
+{
+ LLSocket::ptr_t socket = LLSocket::create(NULL, LLSocket::STREAM_TCP);
+ bool connected = socket->blockingConnect(host);
+ if (!connected)
+ {
+ tcp_close_channel(&socket);
+ }
+
+ return socket;
+}
+
+/**
+ * @brief Close the socket.
+ *
+ * @param handle_ptr The handle of the socket being closed. A pointer-to-pointer to avoid increasing the use count.
+ */
+static void tcp_close_channel(LLSocket::ptr_t* handle_ptr)
+{
+ LL_DEBUGS("Proxy") << "Resetting proxy LLSocket handle, use_count == " << handle_ptr->use_count() << LL_ENDL;
+ handle_ptr->reset();
+}
diff --git a/indra/llmessage/llproxy.h b/indra/llmessage/llproxy.h
new file mode 100644
index 0000000000..a919370540
--- /dev/null
+++ b/indra/llmessage/llproxy.h
@@ -0,0 +1,352 @@
+/**
+ * @file llproxy.h
+ * @brief UDP and HTTP proxy communications
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_PROXY_H
+#define LL_PROXY_H
+
+#include "llcurl.h"
+#include "llhost.h"
+#include "lliosocket.h"
+#include "llmemory.h"
+#include "llsingleton.h"
+#include "llthread.h"
+#include <string>
+
+// SOCKS error codes returned from the StartProxy method
+#define SOCKS_OK 0
+#define SOCKS_CONNECT_ERROR (-1)
+#define SOCKS_NOT_PERMITTED (-2)
+#define SOCKS_NOT_ACCEPTABLE (-3)
+#define SOCKS_AUTH_FAIL (-4)
+#define SOCKS_UDP_FWD_NOT_GRANTED (-5)
+#define SOCKS_HOST_CONNECT_FAILED (-6)
+#define SOCKS_INVALID_HOST (-7)
+
+#ifndef MAXHOSTNAMELEN
+#define MAXHOSTNAMELEN (255 + 1) /* socks5: 255, +1 for len. */
+#endif
+
+#define SOCKSMAXUSERNAMELEN 255
+#define SOCKSMAXPASSWORDLEN 255
+
+#define SOCKSMINUSERNAMELEN 1
+#define SOCKSMINPASSWORDLEN 1
+
+#define SOCKS_VERSION 0x05 // we are using SOCKS 5
+
+#define SOCKS_HEADER_SIZE 10
+
+// SOCKS 5 address/hostname types
+#define ADDRESS_IPV4 0x01
+#define ADDRESS_HOSTNAME 0x03
+#define ADDRESS_IPV6 0x04
+
+// Lets just use our own ipv4 struct rather than dragging in system
+// specific headers
+union ipv4_address_t {
+ U8 octets[4];
+ U32 addr32;
+};
+
+// SOCKS 5 control channel commands
+#define COMMAND_TCP_STREAM 0x01
+#define COMMAND_TCP_BIND 0x02
+#define COMMAND_UDP_ASSOCIATE 0x03
+
+// SOCKS 5 command replies
+#define REPLY_REQUEST_GRANTED 0x00
+#define REPLY_GENERAL_FAIL 0x01
+#define REPLY_RULESET_FAIL 0x02
+#define REPLY_NETWORK_UNREACHABLE 0x03
+#define REPLY_HOST_UNREACHABLE 0x04
+#define REPLY_CONNECTION_REFUSED 0x05
+#define REPLY_TTL_EXPIRED 0x06
+#define REPLY_PROTOCOL_ERROR 0x07
+#define REPLY_TYPE_NOT_SUPPORTED 0x08
+
+#define FIELD_RESERVED 0x00
+
+// The standard SOCKS 5 request packet
+// Push current alignment to stack and set alignment to 1 byte boundary
+// This enabled us to use structs directly to set up and receive network packets
+// into the correct fields, without fear of boundary alignment causing issues
+#pragma pack(push,1)
+
+// SOCKS 5 command packet
+struct socks_command_request_t {
+ U8 version;
+ U8 command;
+ U8 reserved;
+ U8 atype;
+ U32 address;
+ U16 port;
+};
+
+// Standard SOCKS 5 reply packet
+struct socks_command_response_t {
+ U8 version;
+ U8 reply;
+ U8 reserved;
+ U8 atype;
+ U8 add_bytes[4];
+ U16 port;
+};
+
+#define AUTH_NOT_ACCEPTABLE 0xFF // reply if preferred methods are not available
+#define AUTH_SUCCESS 0x00 // reply if authentication successful
+
+// SOCKS 5 authentication request, stating which methods the client supports
+struct socks_auth_request_t {
+ U8 version;
+ U8 num_methods;
+ U8 methods; // We are only using a single method currently
+};
+
+// SOCKS 5 authentication response packet, stating server preferred method
+struct socks_auth_response_t {
+ U8 version;
+ U8 method;
+};
+
+// SOCKS 5 password reply packet
+struct authmethod_password_reply_t {
+ U8 version;
+ U8 status;
+};
+
+// SOCKS 5 UDP packet header
+struct proxywrap_t {
+ U16 rsv;
+ U8 frag;
+ U8 atype;
+ U32 addr;
+ U16 port;
+};
+
+#pragma pack(pop) /* restore original alignment from stack */
+
+
+// Currently selected HTTP proxy type
+enum LLHttpProxyType
+{
+ LLPROXY_SOCKS = 0,
+ LLPROXY_HTTP = 1
+};
+
+// Auth types
+enum LLSocks5AuthType
+{
+ METHOD_NOAUTH = 0x00, // Client supports no auth
+ METHOD_GSSAPI = 0x01, // Client supports GSSAPI (Not currently supported)
+ METHOD_PASSWORD = 0x02 // Client supports username/password
+};
+
+/**
+ * @brief Manage SOCKS 5 UDP proxy and HTTP proxy.
+ *
+ * This class is responsible for managing two interconnected tasks,
+ * connecting to a SOCKS 5 proxy for use by LLPacketRing to send UDP
+ * packets and managing proxy settings for HTTP requests.
+ *
+ * <h1>Threading:</h1>
+ * Because HTTP requests can be generated in threads outside the
+ * main thread, it is necessary for some of the information stored
+ * by this class to be available to other threads. The members that
+ * need to be read across threads are in a labeled section below.
+ * To protect those members, a mutex, mProxyMutex should be locked
+ * before reading or writing those members. Methods that can lock
+ * mProxyMutex are in a labeled section below. Those methods should
+ * not be called while the mutex is already locked.
+ *
+ * There is also a LLAtomic type flag (mHTTPProxyEnabled) that is used
+ * to track whether the HTTP proxy is currently enabled. This allows
+ * for faster unlocked checks to see if the proxy is enabled. This
+ * allows us to cut down on the performance hit when the proxy is
+ * disabled compared to before this class was introduced.
+ *
+ * <h1>UDP Proxying:</h1>
+ * UDP datagrams are proxied via a SOCKS 5 proxy with the UDP associate
+ * command. To initiate the proxy, a TCP socket connection is opened
+ * to the SOCKS 5 host, and after a handshake exchange, the server
+ * returns a port and address to send the UDP traffic that is to be
+ * proxied to. The LLProxy class tracks this address and port after the
+ * exchange and provides it to LLPacketRing when required to. All UDP
+ * proxy management occurs in the main thread.
+ *
+ * <h1>HTTP Proxying:</h1>
+ * This class allows all viewer HTTP packets to be sent through a proxy.
+ * The user can select whether to send HTTP packets through a standard
+ * "web" HTTP proxy, through a SOCKS 5 proxy, or to not proxy HTTP
+ * communication. This class does not manage the integrated web browser
+ * proxy, which is handled in llviewermedia.cpp.
+ *
+ * The implementation of HTTP proxying is handled by libcurl. LLProxy
+ * is responsible for managing the HTTP proxy options and provides a
+ * thread-safe method to apply those options to a curl request
+ * (LLProxy::applyProxySettings()). This method is overloaded
+ * to accommodate the various abstraction libcurl layers that exist
+ * throughout the viewer (LLCurlEasyRequest, LLCurl::Easy, and CURL).
+ *
+ * If you are working with LLCurl or LLCurlEasyRequest objects,
+ * the configured proxy settings will be applied in the constructors
+ * of those request handles. If you are working with CURL objects
+ * directly, you will need to pass the handle of the request to
+ * applyProxySettings() before issuing the request.
+ *
+ * To ensure thread safety, all LLProxy members that relate to the HTTP
+ * proxy require the LLProxyMutex to be locked before accessing.
+ */
+class LLProxy: public LLSingleton<LLProxy>
+{
+ LOG_CLASS(LLProxy);
+public:
+ /*###########################################################################################
+ METHODS THAT DO NOT LOCK mProxyMutex!
+ ###########################################################################################*/
+ // Constructor, cannot have parameters due to LLSingleton parent class. Call from main thread only.
+ LLProxy();
+
+ // Static check for enabled status for UDP packets. Call from main thread only.
+ static bool isSOCKSProxyEnabled() { return sUDPProxyEnabled; }
+
+ // Get the UDP proxy address and port. Call from main thread only.
+ LLHost getUDPProxy() const { return mUDPProxy; }
+
+ /*###########################################################################################
+ END OF NON-LOCKING METHODS
+ ###########################################################################################*/
+
+ /*###########################################################################################
+ METHODS THAT LOCK mProxyMutex! DO NOT CALL WHILE mProxyMutex IS LOCKED!
+ ###########################################################################################*/
+ // Destructor, closes open connections. Do not call directly, use cleanupClass().
+ ~LLProxy();
+
+ // Delete LLProxy singleton. Allows the apr_socket used in the SOCKS 5 control channel to be
+ // destroyed before the call to apr_terminate. Call from main thread only.
+ static void cleanupClass();
+
+ // Apply the current proxy settings to a curl request. Doesn't do anything if mHTTPProxyEnabled is false.
+ // Safe to call from any thread.
+ void applyProxySettings(CURL* handle);
+ void applyProxySettings(LLCurl::Easy* handle);
+ void applyProxySettings(LLCurlEasyRequest* handle);
+
+ // Start a connection to the SOCKS 5 proxy. Call from main thread only.
+ S32 startSOCKSProxy(LLHost host);
+
+ // Disconnect and clean up any connection to the SOCKS 5 proxy. Call from main thread only.
+ void stopSOCKSProxy();
+
+ // Use Password auth when connecting to the SOCKS proxy. Call from main thread only.
+ bool setAuthPassword(const std::string &username, const std::string &password);
+
+ // Disable authentication when connecting to the SOCKS proxy. Call from main thread only.
+ void setAuthNone();
+
+ // Proxy HTTP packets via httpHost, which can be a SOCKS 5 or a HTTP proxy.
+ // as specified in type. Call from main thread only.
+ bool enableHTTPProxy(LLHost httpHost, LLHttpProxyType type);
+ bool enableHTTPProxy();
+
+ // Stop proxying HTTP packets. Call from main thread only.
+ void disableHTTPProxy();
+
+ /*###########################################################################################
+ END OF LOCKING METHODS
+ ###########################################################################################*/
+private:
+ /*###########################################################################################
+ METHODS THAT LOCK mProxyMutex! DO NOT CALL WHILE mProxyMutex IS LOCKED!
+ ###########################################################################################*/
+
+ // Perform a SOCKS 5 authentication and UDP association with the proxy server.
+ S32 proxyHandshake(LLHost proxy);
+
+ // Get the currently selected auth method.
+ LLSocks5AuthType getSelectedAuthMethod() const;
+
+ // Get the currently selected HTTP proxy type
+ LLHttpProxyType getHTTPProxyType() const;
+
+ std::string getSocksPwd() const;
+ std::string getSocksUser() const;
+
+ /*###########################################################################################
+ END OF LOCKING METHODS
+ ###########################################################################################*/
+
+private:
+ // Is the HTTP proxy enabled? Safe to read in any thread, but do not write directly.
+ // Instead use enableHTTPProxy() and disableHTTPProxy() instead.
+ mutable LLAtomic32<bool> mHTTPProxyEnabled;
+
+ // Mutex to protect shared members in non-main thread calls to applyProxySettings().
+ mutable LLMutex mProxyMutex;
+
+ /*###########################################################################################
+ MEMBERS READ AND WRITTEN ONLY IN THE MAIN THREAD. DO NOT SHARE!
+ ###########################################################################################*/
+
+ // Is the UDP proxy enabled?
+ static bool sUDPProxyEnabled;
+
+ // UDP proxy address and port
+ LLHost mUDPProxy;
+ // TCP proxy control channel address and port
+ LLHost mTCPProxy;
+
+ // socket handle to proxy TCP control channel
+ LLSocket::ptr_t mProxyControlChannel;
+
+ /*###########################################################################################
+ END OF UNSHARED MEMBERS
+ ###########################################################################################*/
+
+ /*###########################################################################################
+ MEMBERS WRITTEN IN MAIN THREAD AND READ IN ANY THREAD. ONLY READ OR WRITE AFTER LOCKING mProxyMutex!
+ ###########################################################################################*/
+
+ // HTTP proxy address and port
+ LLHost mHTTPProxy;
+
+ // Currently selected HTTP proxy type. Can be web or socks.
+ LLHttpProxyType mProxyType;
+
+ // SOCKS 5 selected authentication method.
+ LLSocks5AuthType mAuthMethodSelected;
+
+ // SOCKS 5 username
+ std::string mSocksUsername;
+ // SOCKS 5 password
+ std::string mSocksPassword;
+
+ /*###########################################################################################
+ END OF SHARED MEMBERS
+ ###########################################################################################*/
+};
+
+#endif
diff --git a/indra/llmessage/llpumpio.cpp b/indra/llmessage/llpumpio.cpp
index a8d2a0a224..f3ef4f2684 100644
--- a/indra/llmessage/llpumpio.cpp
+++ b/indra/llmessage/llpumpio.cpp
@@ -195,7 +195,7 @@ bool LLPumpIO::prime(apr_pool_t* pool)
return ((pool == NULL) ? false : true);
}
-bool LLPumpIO::addChain(const chain_t& chain, F32 timeout)
+bool LLPumpIO::addChain(const chain_t& chain, F32 timeout, bool has_curl_request)
{
LLMemType m1(LLMemType::MTYPE_IO_PUMP);
if(chain.empty()) return false;
@@ -204,8 +204,10 @@ bool LLPumpIO::addChain(const chain_t& chain, F32 timeout)
LLScopedLock lock(mChainsMutex);
#endif
LLChainInfo info;
+ info.mHasCurlRequest = has_curl_request;
info.setTimeoutSeconds(timeout);
info.mData = LLIOPipe::buffer_ptr_t(new LLBufferArray);
+ info.mData->setThreaded(has_curl_request);
LLLinkInfo link;
#if LL_DEBUG_PIPE_TYPE_IN_PUMP
lldebugs << "LLPumpIO::addChain() " << chain[0] << " '"
@@ -440,6 +442,15 @@ void LLPumpIO::pump()
static LLFastTimer::DeclareTimer FTM_PUMP_IO("Pump IO");
+LLPumpIO::current_chain_t LLPumpIO::removeRunningChain(LLPumpIO::current_chain_t& run_chain)
+{
+ std::for_each(
+ (*run_chain).mDescriptors.begin(),
+ (*run_chain).mDescriptors.end(),
+ ll_delete_apr_pollset_fd_client_data());
+ return mRunningChains.erase(run_chain);
+}
+
//timeout is in microseconds
void LLPumpIO::pump(const S32& poll_timeout)
{
@@ -585,10 +596,16 @@ void LLPumpIO::pump(const S32& poll_timeout)
// << (*run_chain).mChainLinks[0].mPipe
// << " because we reached the end." << llendl;
#endif
- run_chain = mRunningChains.erase(run_chain);
+ run_chain = removeRunningChain(run_chain);
continue;
}
}
+ else if(isChainExpired(*run_chain))
+ {
+ run_chain = removeRunningChain(run_chain);
+ continue;
+ }
+
PUMP_DEBUG;
if((*run_chain).mLock)
{
@@ -696,11 +713,7 @@ void LLPumpIO::pump(const S32& poll_timeout)
PUMP_DEBUG;
// This chain is done. Clean up any allocated memory and
// erase the chain info.
- std::for_each(
- (*run_chain).mDescriptors.begin(),
- (*run_chain).mDescriptors.end(),
- ll_delete_apr_pollset_fd_client_data());
- run_chain = mRunningChains.erase(run_chain);
+ run_chain = removeRunningChain(run_chain);
// *NOTE: may not always need to rebuild the pollset.
mRebuildPollset = true;
@@ -1095,6 +1108,24 @@ void LLPumpIO::processChain(LLChainInfo& chain)
PUMP_DEBUG;
}
+bool LLPumpIO::isChainExpired(LLChainInfo& chain)
+{
+ if(!chain.mHasCurlRequest)
+ {
+ return false ;
+ }
+
+ for(links_t::iterator iter = chain.mChainLinks.begin(); iter != chain.mChainLinks.end(); ++iter)
+ {
+ if(!(*iter).mPipe->isValid())
+ {
+ return true ;
+ }
+ }
+
+ return false ;
+}
+
bool LLPumpIO::handleChainError(
LLChainInfo& chain,
LLIOPipe::EStatus error)
@@ -1136,6 +1167,9 @@ bool LLPumpIO::handleChainError(
#endif
keep_going = false;
break;
+ case LLIOPipe::STATUS_EXPIRED:
+ keep_going = false;
+ break ;
default:
if(LLIOPipe::isSuccess(error))
{
@@ -1157,7 +1191,8 @@ bool LLPumpIO::handleChainError(
LLPumpIO::LLChainInfo::LLChainInfo() :
mInit(false),
mLock(0),
- mEOS(false)
+ mEOS(false),
+ mHasCurlRequest(false)
{
LLMemType m1(LLMemType::MTYPE_IO_PUMP);
mTimer.setTimerExpirySec(DEFAULT_CHAIN_EXPIRY_SECS);
diff --git a/indra/llmessage/llpumpio.h b/indra/llmessage/llpumpio.h
index 9303c9d7fc..d2c5d37571 100644
--- a/indra/llmessage/llpumpio.h
+++ b/indra/llmessage/llpumpio.h
@@ -111,9 +111,10 @@ public:
* @param chain The pipes for the chain
* @param timeout The number of seconds in the future to
* expire. Pass in 0.0f to never expire.
+ * @param has_curl_request The chain contains LLURLRequest if true.
* @return Returns true if anything was added to the pump.
*/
- bool addChain(const chain_t& chain, F32 timeout);
+ bool addChain(const chain_t& chain, F32 timeout, bool has_curl_request = false);
/**
* @brief Struct to associate a pipe with it's buffer io indexes.
@@ -356,12 +357,13 @@ protected:
// basic member data
bool mInit;
+ bool mEOS;
+ bool mHasCurlRequest;
S32 mLock;
LLFrameTimer mTimer;
links_t::iterator mHead;
links_t mChainLinks;
- LLIOPipe::buffer_ptr_t mData;
- bool mEOS;
+ LLIOPipe::buffer_ptr_t mData;
LLSD mContext;
// tracking inside the pump
@@ -402,7 +404,7 @@ protected:
protected:
void initialize(apr_pool_t* pool);
void cleanup();
-
+ current_chain_t removeRunningChain(current_chain_t& chain) ;
/**
* @brief Given the internal state of the chains, rebuild the pollset
* @see setConditional()
@@ -429,6 +431,9 @@ protected:
*/
bool handleChainError(LLChainInfo& chain, LLIOPipe::EStatus error);
+ //if the chain is expired, remove it
+ bool isChainExpired(LLChainInfo& chain) ;
+
public:
/**
* @brief Return number of running chains.
diff --git a/indra/llmessage/llregionflags.h b/indra/llmessage/llregionflags.h
index b9b974ec4f..7b796a0fa8 100644
--- a/indra/llmessage/llregionflags.h
+++ b/indra/llmessage/llregionflags.h
@@ -42,9 +42,6 @@ const U32 REGION_FLAGS_RESET_HOME_ON_TELEPORT = (1 << 3);
// Does the sun move?
const U32 REGION_FLAGS_SUN_FIXED = (1 << 4);
-// Tax free zone (no taxes on objects, land, etc.)
-const U32 REGION_FLAGS_TAX_FREE = (1 << 5);
-
// Can't change the terrain heightfield, even on owned parcels,
// but can plant trees and grass.
const U32 REGION_FLAGS_BLOCK_TERRAFORM = (1 << 6);
@@ -54,17 +51,12 @@ const U32 REGION_FLAGS_BLOCK_LAND_RESELL = (1 << 7);
// All content wiped once per night
const U32 REGION_FLAGS_SANDBOX = (1 << 8);
-const U32 REGION_FLAGS_NULL_LAYER = (1 << 9);
-// const U32 REGION_FLAGS_SKIP_AGENT_ACTION = (1 << 10);
-const U32 REGION_FLAGS_HARD_ALLOW_LAND_TRANSFER = (1 << 10); // Region allows land reselling
-// const U32 REGION_FLAGS_SKIP_UPDATE_INTEREST_LIST= (1 << 11);
-const U32 REGION_FLAGS_HARD_ALLOW_POST_CLASSIFIED = (1 << 11); // Region allows posting of classified ads
const U32 REGION_FLAGS_SKIP_COLLISIONS = (1 << 12); // Pin all non agent rigid bodies
const U32 REGION_FLAGS_SKIP_SCRIPTS = (1 << 13);
const U32 REGION_FLAGS_SKIP_PHYSICS = (1 << 14); // Skip all physics
const U32 REGION_FLAGS_EXTERNALLY_VISIBLE = (1 << 15);
-//const U32 REGION_FLAGS_MAINLAND_VISIBLE = (1 << 16);
-const U32 REGION_FLAGS_PUBLIC_ALLOWED = (1 << 17);
+const U32 REGION_FLAGS_ALLOW_RETURN_ENCROACHING_OBJECT = (1 << 16);
+const U32 REGION_FLAGS_ALLOW_RETURN_ENCROACHING_ESTATE_OBJECT = (1 << 17);
const U32 REGION_FLAGS_BLOCK_DWELL = (1 << 18);
// Is flight allowed?
@@ -81,18 +73,13 @@ const U32 REGION_FLAGS_ESTATE_SKIP_SCRIPTS = (1 << 21);
const U32 REGION_FLAGS_RESTRICT_PUSHOBJECT = (1 << 22);
const U32 REGION_FLAGS_DENY_ANONYMOUS = (1 << 23);
-// const U32 REGION_FLAGS_DENY_IDENTIFIED = (1 << 24);
-// const U32 REGION_FLAGS_DENY_TRANSACTED = (1 << 25);
const U32 REGION_FLAGS_ALLOW_PARCEL_CHANGES = (1 << 26);
-// const U32 REGION_FLAGS_ABUSE_EMAIL_TO_ESTATE_OWNER = (1 << 27); // We no longer support ELAR
-
const U32 REGION_FLAGS_ALLOW_VOICE = (1 << 28);
const U32 REGION_FLAGS_BLOCK_PARCEL_SEARCH = (1 << 29);
const U32 REGION_FLAGS_DENY_AGEUNVERIFIED = (1 << 30);
-const U32 REGION_FLAGS_SKIP_MONO_SCRIPTS = (1 << 31);
const U32 REGION_FLAGS_DEFAULT = REGION_FLAGS_ALLOW_LANDMARK |
REGION_FLAGS_ALLOW_SET_HOME |
@@ -105,7 +92,6 @@ const U32 REGION_FLAGS_PRELUDE_UNSET = REGION_FLAGS_ALLOW_LANDMARK
| REGION_FLAGS_ALLOW_SET_HOME;
const U32 REGION_FLAGS_ESTATE_MASK = REGION_FLAGS_EXTERNALLY_VISIBLE
- | REGION_FLAGS_PUBLIC_ALLOWED
| REGION_FLAGS_SUN_FIXED
| REGION_FLAGS_DENY_ANONYMOUS
| REGION_FLAGS_DENY_AGEUNVERIFIED;
diff --git a/indra/llmessage/llsdmessage.cpp b/indra/llmessage/llsdmessage.cpp
index 9148c9dd15..1c93c12d99 100644
--- a/indra/llmessage/llsdmessage.cpp
+++ b/indra/llmessage/llsdmessage.cpp
@@ -88,7 +88,7 @@ bool LLSDMessage::httpListener(const LLSD& request)
request,
url, "POST", reply, error),
LLSD(), // headers
- timeout);
+ (F32)timeout);
return false;
}
diff --git a/indra/llmessage/llsdmessagebuilder.cpp b/indra/llmessage/llsdmessagebuilder.cpp
index 42c179782f..615221e0ad 100644
--- a/indra/llmessage/llsdmessagebuilder.cpp
+++ b/indra/llmessage/llsdmessagebuilder.cpp
@@ -29,6 +29,7 @@
#include "llsdmessagebuilder.h"
#include "llmessagetemplate.h"
+#include "llmath.h"
#include "llquaternion.h"
#include "llsdutil.h"
#include "llsdutil_math.h"
@@ -316,7 +317,7 @@ void LLSDMessageBuilder::copyFromMessageData(const LLMsgData& data)
// S64 not supported in LLSD so we just truncate it
case MVT_S64:
- addS32(varname, *(S64*)mvci.getData());
+ addS32(varname, (S32)*(S64*)mvci.getData());
break;
case MVT_F32:
diff --git a/indra/llmessage/llsdmessagereader.cpp b/indra/llmessage/llsdmessagereader.cpp
index 304a692cdf..3d8ca2ad9f 100644
--- a/indra/llmessage/llsdmessagereader.cpp
+++ b/indra/llmessage/llsdmessagereader.cpp
@@ -291,9 +291,10 @@ S32 getElementSize(const LLSD& llsd)
case LLSD::TypeMap:
case LLSD::TypeArray:
case LLSD::TypeUndefined:
+ default: // TypeLLSDTypeEnd, TypeLLSDNumTypes, etc.
return 0;
}
- return 0;
+ //return 0;
}
//virtual
diff --git a/indra/llmessage/llsdrpcclient.cpp b/indra/llmessage/llsdrpcclient.cpp
index 86fe5c7912..91fd070f07 100644
--- a/indra/llmessage/llsdrpcclient.cpp
+++ b/indra/llmessage/llsdrpcclient.cpp
@@ -82,6 +82,8 @@ bool LLSDRPCResponse::extractResponse(const LLSD& sd)
return rv;
}
+static LLFastTimer::DeclareTimer FTM_SDRPC_RESPONSE("SDRPC Response");
+
// virtual
LLIOPipe::EStatus LLSDRPCResponse::process_impl(
const LLChannelDescriptors& channels,
@@ -90,6 +92,7 @@ LLIOPipe::EStatus LLSDRPCResponse::process_impl(
LLSD& context,
LLPumpIO* pump)
{
+ LLFastTimer t(FTM_SDRPC_RESPONSE);
PUMP_DEBUG;
LLMemType m1(LLMemType::MTYPE_IO_SD_CLIENT);
if(mIsError)
@@ -178,6 +181,8 @@ bool LLSDRPCClient::call(
return true;
}
+static LLFastTimer::DeclareTimer FTM_PROCESS_SDRPC_CLIENT("SDRPC Client");
+
// virtual
LLIOPipe::EStatus LLSDRPCClient::process_impl(
const LLChannelDescriptors& channels,
@@ -186,6 +191,7 @@ LLIOPipe::EStatus LLSDRPCClient::process_impl(
LLSD& context,
LLPumpIO* pump)
{
+ LLFastTimer t(FTM_PROCESS_SDRPC_CLIENT);
PUMP_DEBUG;
LLMemType m1(LLMemType::MTYPE_IO_SD_CLIENT);
if((STATE_NONE == mState) || (!pump))
diff --git a/indra/llmessage/llsdrpcclient.h b/indra/llmessage/llsdrpcclient.h
index 9fb49a5c33..0cecf4f688 100644
--- a/indra/llmessage/llsdrpcclient.h
+++ b/indra/llmessage/llsdrpcclient.h
@@ -240,9 +240,16 @@ public:
virtual bool build(LLPumpIO::chain_t& chain, LLSD context) const
{
lldebugs << "LLSDRPCClientFactory::build" << llendl;
- LLIOPipe::ptr_t service(new Client);
- chain.push_back(service);
LLURLRequest* http(new LLURLRequest(LLURLRequest::HTTP_POST));
+ if(!http->isValid())
+ {
+ llwarns << "Creating LLURLRequest failed." << llendl ;
+ delete http;
+ return false;
+ }
+
+ LLIOPipe::ptr_t service(new Client);
+ chain.push_back(service);
LLIOPipe::ptr_t http_pipe(http);
http->addHeader("Content-Type: text/llsd");
if(mURL.empty())
@@ -283,9 +290,16 @@ public:
virtual bool build(LLPumpIO::chain_t& chain, LLSD context) const
{
lldebugs << "LLXMLSDRPCClientFactory::build" << llendl;
- LLIOPipe::ptr_t service(new Client);
- chain.push_back(service);
+
LLURLRequest* http(new LLURLRequest(LLURLRequest::HTTP_POST));
+ if(!http->isValid())
+ {
+ llwarns << "Creating LLURLRequest failed." << llendl ;
+ delete http;
+ return false ;
+ }
+ LLIOPipe::ptr_t service(new Client);
+ chain.push_back(service);
LLIOPipe::ptr_t http_pipe(http);
http->addHeader("Content-Type: text/xml");
if(mURL.empty())
diff --git a/indra/llmessage/llsdrpcserver.cpp b/indra/llmessage/llsdrpcserver.cpp
index f87c418fb1..9f776aca72 100644
--- a/indra/llmessage/llsdrpcserver.cpp
+++ b/indra/llmessage/llsdrpcserver.cpp
@@ -97,6 +97,8 @@ void LLSDRPCServer::clearLock()
}
}
+static LLFastTimer::DeclareTimer FTM_PROCESS_SDRPC_SERVER("SDRPC Server");
+
// virtual
LLIOPipe::EStatus LLSDRPCServer::process_impl(
const LLChannelDescriptors& channels,
@@ -105,6 +107,7 @@ LLIOPipe::EStatus LLSDRPCServer::process_impl(
LLSD& context,
LLPumpIO* pump)
{
+ LLFastTimer t(FTM_PROCESS_SDRPC_SERVER);
PUMP_DEBUG;
LLMemType m1(LLMemType::MTYPE_IO_SD_SERVER);
// lldebugs << "LLSDRPCServer::process_impl" << llendl;
diff --git a/indra/llmessage/lltemplatemessagebuilder.cpp b/indra/llmessage/lltemplatemessagebuilder.cpp
index 6611d704e6..9e8eb48460 100644
--- a/indra/llmessage/lltemplatemessagebuilder.cpp
+++ b/indra/llmessage/lltemplatemessagebuilder.cpp
@@ -29,6 +29,7 @@
#include "lltemplatemessagebuilder.h"
#include "llmessagetemplate.h"
+#include "llmath.h"
#include "llquaternion.h"
#include "u64.h"
#include "v3dmath.h"
diff --git a/indra/llmessage/lltemplatemessagereader.cpp b/indra/llmessage/lltemplatemessagereader.cpp
index 3bfcd58c69..ab91f74abe 100644
--- a/indra/llmessage/lltemplatemessagereader.cpp
+++ b/indra/llmessage/lltemplatemessagereader.cpp
@@ -30,6 +30,7 @@
#include "llfasttimer.h"
#include "llmessagebuilder.h"
#include "llmessagetemplate.h"
+#include "llmath.h"
#include "llquaternion.h"
#include "message.h"
#include "u64.h"
@@ -794,7 +795,7 @@ const char* LLTemplateMessageReader::getMessageName() const
{
if (!mCurrentRMessageTemplate)
{
- llwarns << "no mCurrentRMessageTemplate" << llendl;
+ // no message currently being read
return "";
}
return mCurrentRMessageTemplate->mName;
diff --git a/indra/llmessage/lltransfermanager.cpp b/indra/llmessage/lltransfermanager.cpp
index 754eb99cbd..034680caf8 100644
--- a/indra/llmessage/lltransfermanager.cpp
+++ b/indra/llmessage/lltransfermanager.cpp
@@ -338,7 +338,7 @@ void LLTransferManager::processTransferInfo(LLMessageSystem *msgp, void **)
}
}
- llinfos << "Receiving " << transfer_id << ", size " << size << " bytes" << llendl;
+ //llinfos << "Receiving " << transfer_id << ", size " << size << " bytes" << llendl;
ttp->setSize(size);
ttp->setGotInfo(TRUE);
diff --git a/indra/llmessage/lltransfersourceasset.cpp b/indra/llmessage/lltransfersourceasset.cpp
index 7e57841580..8537773a3f 100644
--- a/indra/llmessage/lltransfersourceasset.cpp
+++ b/indra/llmessage/lltransfersourceasset.cpp
@@ -251,3 +251,4 @@ BOOL LLTransferSourceParamsAsset::unpackParams(LLDataPacker &dp)
return TRUE;
}
+
diff --git a/indra/llmessage/llurlrequest.cpp b/indra/llmessage/llurlrequest.cpp
index cb9d1c3731..a16f5c7bf0 100644
--- a/indra/llmessage/llurlrequest.cpp
+++ b/indra/llmessage/llurlrequest.cpp
@@ -35,6 +35,7 @@
#include "llcurl.h"
#include "llioutil.h"
#include "llmemtype.h"
+#include "llproxy.h"
#include "llpumpio.h"
#include "llsd.h"
#include "llstring.h"
@@ -63,7 +64,7 @@ public:
~LLURLRequestDetail();
std::string mURL;
LLCurlEasyRequest* mCurlRequest;
- LLBufferArray* mResponseBuffer;
+ LLIOPipe::buffer_ptr_t mResponseBuffer;
LLChannelDescriptors mChannels;
U8* mLastRead;
U32 mBodyLimit;
@@ -74,7 +75,6 @@ public:
LLURLRequestDetail::LLURLRequestDetail() :
mCurlRequest(NULL),
- mResponseBuffer(NULL),
mLastRead(NULL),
mBodyLimit(0),
mByteAccumulator(0),
@@ -83,13 +83,18 @@ LLURLRequestDetail::LLURLRequestDetail() :
{
LLMemType m1(LLMemType::MTYPE_IO_URL_REQUEST);
mCurlRequest = new LLCurlEasyRequest();
+
+ if(!mCurlRequest->isValid()) //failed.
+ {
+ delete mCurlRequest ;
+ mCurlRequest = NULL ;
+ }
}
LLURLRequestDetail::~LLURLRequestDetail()
{
LLMemType m1(LLMemType::MTYPE_IO_URL_REQUEST);
delete mCurlRequest;
- mResponseBuffer = NULL;
mLastRead = NULL;
}
@@ -169,6 +174,7 @@ LLURLRequest::~LLURLRequest()
{
LLMemType m1(LLMemType::MTYPE_IO_URL_REQUEST);
delete mDetail;
+ mDetail = NULL ;
}
void LLURLRequest::setURL(const std::string& url)
@@ -250,12 +256,24 @@ void LLURLRequest::allowCookies()
mDetail->mCurlRequest->setoptString(CURLOPT_COOKIEFILE, "");
}
+//virtual
+bool LLURLRequest::isValid()
+{
+ return mDetail->mCurlRequest && mDetail->mCurlRequest->isValid();
+}
+
// virtual
LLIOPipe::EStatus LLURLRequest::handleError(
LLIOPipe::EStatus status,
LLPumpIO* pump)
{
LLMemType m1(LLMemType::MTYPE_IO_URL_REQUEST);
+
+ if(!isValid())
+ {
+ return STATUS_EXPIRED ;
+ }
+
if(mCompletionCallback && pump)
{
LLURLRequestComplete* complete = NULL;
@@ -270,6 +288,8 @@ LLIOPipe::EStatus LLURLRequest::handleError(
return status;
}
+static LLFastTimer::DeclareTimer FTM_PROCESS_URL_REQUEST("URL Request");
+
// virtual
LLIOPipe::EStatus LLURLRequest::process_impl(
const LLChannelDescriptors& channels,
@@ -278,6 +298,7 @@ LLIOPipe::EStatus LLURLRequest::process_impl(
LLSD& context,
LLPumpIO* pump)
{
+ LLFastTimer t(FTM_PROCESS_URL_REQUEST);
PUMP_DEBUG;
LLMemType m1(LLMemType::MTYPE_IO_URL_REQUEST);
//llinfos << "LLURLRequest::process_impl()" << llendl;
@@ -288,6 +309,8 @@ LLIOPipe::EStatus LLURLRequest::process_impl(
const S32 MIN_ACCUMULATION = 100000;
if(pump && (mDetail->mByteAccumulator > MIN_ACCUMULATION))
{
+ static LLFastTimer::DeclareTimer FTM_URL_ADJUST_TIMEOUT("Adjust Timeout");
+ LLFastTimer t(FTM_URL_ADJUST_TIMEOUT);
// This is a pretty sloppy calculation, but this
// tries to make the gross assumption that if data
// is coming in at 56kb/s, then this transfer will
@@ -319,7 +342,7 @@ LLIOPipe::EStatus LLURLRequest::process_impl(
// *FIX: bit of a hack, but it should work. The configure and
// callback method expect this information to be ready.
- mDetail->mResponseBuffer = buffer.get();
+ mDetail->mResponseBuffer = buffer;
mDetail->mChannels = channels;
if(!configure())
{
@@ -335,16 +358,33 @@ LLIOPipe::EStatus LLURLRequest::process_impl(
{
PUMP_DEBUG;
LLIOPipe::EStatus status = STATUS_BREAK;
- mDetail->mCurlRequest->perform();
+ static LLFastTimer::DeclareTimer FTM_URL_PERFORM("Perform");
+ {
+ LLFastTimer t(FTM_URL_PERFORM);
+ if(!mDetail->mCurlRequest->wait())
+ {
+ return status ;
+ }
+ }
+
while(1)
{
CURLcode result;
- bool newmsg = mDetail->mCurlRequest->getResult(&result);
+
+ static LLFastTimer::DeclareTimer FTM_PROCESS_URL_REQUEST_GET_RESULT("Get Result");
+
+ bool newmsg = false;
+ {
+ LLFastTimer t(FTM_PROCESS_URL_REQUEST_GET_RESULT);
+ newmsg = mDetail->mCurlRequest->getResult(&result);
+ }
+
if(!newmsg)
{
// keep processing
break;
}
+
mState = STATE_HAVE_RESPONSE;
context[CONTEXT_REQUEST][CONTEXT_TRANSFERED_BYTES] = mRequestTransferedBytes;
@@ -370,7 +410,11 @@ LLIOPipe::EStatus LLURLRequest::process_impl(
link.mChannels = LLBufferArray::makeChannelConsumer(
channels);
chain.push_back(link);
- pump->respond(chain, buffer, context);
+ static LLFastTimer::DeclareTimer FTM_PROCESS_URL_PUMP_RESPOND("Pump Respond");
+ {
+ LLFastTimer t(FTM_PROCESS_URL_PUMP_RESPOND);
+ pump->respond(chain, buffer, context);
+ }
mCompletionCallback = NULL;
}
break;
@@ -415,6 +459,12 @@ void LLURLRequest::initialize()
LLMemType m1(LLMemType::MTYPE_IO_URL_REQUEST);
mState = STATE_INITIALIZED;
mDetail = new LLURLRequestDetail;
+
+ if(!isValid())
+ {
+ return ;
+ }
+
mDetail->mCurlRequest->setopt(CURLOPT_NOSIGNAL, 1);
mDetail->mCurlRequest->setWriteCallback(&downCallback, (void*)this);
mDetail->mCurlRequest->setReadCallback(&upCallback, (void*)this);
@@ -422,8 +472,11 @@ void LLURLRequest::initialize()
mResponseTransferedBytes = 0;
}
+static LLFastTimer::DeclareTimer FTM_URL_REQUEST_CONFIGURE("URL Configure");
bool LLURLRequest::configure()
{
+ LLFastTimer t(FTM_URL_REQUEST_CONFIGURE);
+
LLMemType m1(LLMemType::MTYPE_IO_URL_REQUEST);
bool rv = false;
S32 bytes = mDetail->mResponseBuffer->countAfter(
@@ -440,6 +493,9 @@ bool LLURLRequest::configure()
case HTTP_GET:
mDetail->mCurlRequest->setopt(CURLOPT_HTTPGET, 1);
mDetail->mCurlRequest->setopt(CURLOPT_FOLLOWLOCATION, 1);
+
+ // Set Accept-Encoding to allow response compression
+ mDetail->mCurlRequest->setoptString(CURLOPT_ENCODING, "");
rv = true;
break;
@@ -464,6 +520,9 @@ bool LLURLRequest::configure()
// Set the handle for an http post
mDetail->mCurlRequest->setPost(NULL, bytes);
+
+ // Set Accept-Encoding to allow response compression
+ mDetail->mCurlRequest->setoptString(CURLOPT_ENCODING, "");
rv = true;
break;
@@ -618,6 +677,7 @@ static size_t headerCallback(void* data, size_t size, size_t nmemb, void* user)
return header_len;
}
+static LLFastTimer::DeclareTimer FTM_PROCESS_URL_EXTRACTOR("URL Extractor");
/**
* LLContextURLExtractor
*/
@@ -629,6 +689,7 @@ LLIOPipe::EStatus LLContextURLExtractor::process_impl(
LLSD& context,
LLPumpIO* pump)
{
+ LLFastTimer t(FTM_PROCESS_URL_EXTRACTOR);
PUMP_DEBUG;
LLMemType m1(LLMemType::MTYPE_IO_URL_REQUEST);
// The destination host is in the context.
@@ -707,6 +768,7 @@ void LLURLRequestComplete::responseStatus(LLIOPipe::EStatus status)
mRequestStatus = status;
}
+static LLFastTimer::DeclareTimer FTM_PROCESS_URL_COMPLETE("URL Complete");
// virtual
LLIOPipe::EStatus LLURLRequestComplete::process_impl(
const LLChannelDescriptors& channels,
@@ -715,6 +777,7 @@ LLIOPipe::EStatus LLURLRequestComplete::process_impl(
LLSD& context,
LLPumpIO* pump)
{
+ LLFastTimer t(FTM_PROCESS_URL_COMPLETE);
PUMP_DEBUG;
complete(channels, buffer);
return STATUS_OK;
diff --git a/indra/llmessage/llurlrequest.h b/indra/llmessage/llurlrequest.h
index ec5c2c1941..44d358d906 100644
--- a/indra/llmessage/llurlrequest.h
+++ b/indra/llmessage/llurlrequest.h
@@ -188,6 +188,8 @@ public:
*/
void allowCookies();
+ /*virtual*/ bool isValid() ;
+
public:
/**
* @brief Give this pipe a chance to handle a generated error
diff --git a/indra/llmessage/llxfer.h b/indra/llmessage/llxfer.h
index 989e8b2cab..f9348eb11f 100644
--- a/indra/llmessage/llxfer.h
+++ b/indra/llmessage/llxfer.h
@@ -29,6 +29,7 @@
#include "message.h"
#include "lltimer.h"
+#include "llextendedstatus.h"
const S32 LL_XFER_LARGE_PAYLOAD = 7680;
diff --git a/indra/llmessage/message.cpp b/indra/llmessage/message.cpp
index 2f0d815be5..6a425cfe98 100644
--- a/indra/llmessage/message.cpp
+++ b/indra/llmessage/message.cpp
@@ -2441,12 +2441,12 @@ void dump_prehash_files()
" * Generated from message template version number %.3f\n"
" */\n",
gMessageSystem->mMessageFileVersionNumber);
- fprintf(fp, "\n\nextern F32 gPrehashVersionNumber;\n\n");
+ fprintf(fp, "\n\nextern F32 const gPrehashVersionNumber;\n\n");
for (i = 0; i < MESSAGE_NUMBER_OF_HASH_BUCKETS; i++)
{
if (!LLMessageStringTable::getInstance()->mEmpty[i] && LLMessageStringTable::getInstance()->mString[i][0] != '.')
{
- fprintf(fp, "extern char * _PREHASH_%s;\n", LLMessageStringTable::getInstance()->mString[i]);
+ fprintf(fp, "extern char const* const _PREHASH_%s;\n", LLMessageStringTable::getInstance()->mString[i]);
}
}
fprintf(fp, "\n\n#endif\n");
@@ -2471,12 +2471,12 @@ void dump_prehash_files()
gMessageSystem->mMessageFileVersionNumber);
fprintf(fp, "#include \"linden_common.h\"\n");
fprintf(fp, "#include \"message.h\"\n\n");
- fprintf(fp, "\n\nF32 gPrehashVersionNumber = %.3ff;\n\n", gMessageSystem->mMessageFileVersionNumber);
+ fprintf(fp, "\n\nF32 const gPrehashVersionNumber = %.3ff;\n\n", gMessageSystem->mMessageFileVersionNumber);
for (i = 0; i < MESSAGE_NUMBER_OF_HASH_BUCKETS; i++)
{
if (!LLMessageStringTable::getInstance()->mEmpty[i] && LLMessageStringTable::getInstance()->mString[i][0] != '.')
{
- fprintf(fp, "char * _PREHASH_%s = LLMessageStringTable::getInstance()->getString(\"%s\");\n", LLMessageStringTable::getInstance()->mString[i], LLMessageStringTable::getInstance()->mString[i]);
+ fprintf(fp, "char const* const _PREHASH_%s = LLMessageStringTable::getInstance()->getString(\"%s\");\n", LLMessageStringTable::getInstance()->mString[i], LLMessageStringTable::getInstance()->mString[i]);
}
}
fclose(fp);
@@ -3147,7 +3147,7 @@ bool LLMessageSystem::generateDigestForWindowAndUUIDs(char* digest, const S32 wi
LL_ERRS("Messaging") << "Trying to generate complex digest on a machine without a shared secret!" << llendl;
}
- U32 now = time(NULL);
+ U32 now = (U32)time(NULL);
now /= window;
@@ -3167,7 +3167,7 @@ bool LLMessageSystem::isMatchingDigestForWindowAndUUIDs(const char* digest, cons
}
char our_digest[MD5HEX_STR_SIZE]; /* Flawfinder: ignore */
- U32 now = time(NULL);
+ U32 now = (U32)time(NULL);
now /= window;
@@ -3213,7 +3213,7 @@ bool LLMessageSystem::generateDigestForWindow(char* digest, const S32 window) co
LL_ERRS("Messaging") << "Trying to generate simple digest on a machine without a shared secret!" << llendl;
}
- U32 now = time(NULL);
+ U32 now = (U32)time(NULL);
now /= window;
diff --git a/indra/llmessage/message_prehash.cpp b/indra/llmessage/message_prehash.cpp
index eb1e366149..e71fb96540 100644
--- a/indra/llmessage/message_prehash.cpp
+++ b/indra/llmessage/message_prehash.cpp
@@ -32,1346 +32,1350 @@
-F32 gPrehashVersionNumber = 2.000f;
+F32 const gPrehashVersionNumber = 2.000f;
-char* _PREHASH_X = LLMessageStringTable::getInstance()->getString("X");
-char* _PREHASH_Y = LLMessageStringTable::getInstance()->getString("Y");
-char* _PREHASH_Z = LLMessageStringTable::getInstance()->getString("Z");
-char* _PREHASH_AddFlags = LLMessageStringTable::getInstance()->getString("AddFlags");
-char* _PREHASH_FailureInfo = LLMessageStringTable::getInstance()->getString("FailureInfo");
-char* _PREHASH_MapData = LLMessageStringTable::getInstance()->getString("MapData");
-char* _PREHASH_AddItem = LLMessageStringTable::getInstance()->getString("AddItem");
-char* _PREHASH_MeanCollision = LLMessageStringTable::getInstance()->getString("MeanCollision");
-char* _PREHASH_RezScript = LLMessageStringTable::getInstance()->getString("RezScript");
-char* _PREHASH_AvatarSitResponse = LLMessageStringTable::getInstance()->getString("AvatarSitResponse");
-char* _PREHASH_InventoryAssetResponse = LLMessageStringTable::getInstance()->getString("InventoryAssetResponse");
-char* _PREHASH_KillObject = LLMessageStringTable::getInstance()->getString("KillObject");
-char* _PREHASH_ProposalID = LLMessageStringTable::getInstance()->getString("ProposalID");
-char* _PREHASH_SerialNum = LLMessageStringTable::getInstance()->getString("SerialNum");
-char* _PREHASH_Duration = LLMessageStringTable::getInstance()->getString("Duration");
-char* _PREHASH_ScriptQuestion = LLMessageStringTable::getInstance()->getString("ScriptQuestion");
-char* _PREHASH_AddCircuitCode = LLMessageStringTable::getInstance()->getString("AddCircuitCode");
-char* _PREHASH_UseCircuitCode = LLMessageStringTable::getInstance()->getString("UseCircuitCode");
-char* _PREHASH_ViewerCircuitCode = LLMessageStringTable::getInstance()->getString("ViewerCircuitCode");
-char* _PREHASH_ScriptAnswerYes = LLMessageStringTable::getInstance()->getString("ScriptAnswerYes");
-char* _PREHASH_PartnerID = LLMessageStringTable::getInstance()->getString("PartnerID");
-char* _PREHASH_DirLandQuery = LLMessageStringTable::getInstance()->getString("DirLandQuery");
-char* _PREHASH_TeleportStart = LLMessageStringTable::getInstance()->getString("TeleportStart");
-char* _PREHASH_AboutText = LLMessageStringTable::getInstance()->getString("AboutText");
-char* _PREHASH_VisualParam = LLMessageStringTable::getInstance()->getString("VisualParam");
-char* _PREHASH_GroupPrims = LLMessageStringTable::getInstance()->getString("GroupPrims");
-char* _PREHASH_SelectedPrims = LLMessageStringTable::getInstance()->getString("SelectedPrims");
-char* _PREHASH_ID = LLMessageStringTable::getInstance()->getString("ID");
-char* _PREHASH_UUIDNameRequest = LLMessageStringTable::getInstance()->getString("UUIDNameRequest");
-char* _PREHASH_UUIDGroupNameRequest = LLMessageStringTable::getInstance()->getString("UUIDGroupNameRequest");
-char* _PREHASH_GroupAccountTransactionsRequest = LLMessageStringTable::getInstance()->getString("GroupAccountTransactionsRequest");
-char* _PREHASH_MapNameRequest = LLMessageStringTable::getInstance()->getString("MapNameRequest");
-char* _PREHASH_UpdateSimulator = LLMessageStringTable::getInstance()->getString("UpdateSimulator");
-char* _PREHASH_BillableFactor = LLMessageStringTable::getInstance()->getString("BillableFactor");
-char* _PREHASH_ObjectBonusFactor = LLMessageStringTable::getInstance()->getString("ObjectBonusFactor");
-char* _PREHASH_EnableSimulator = LLMessageStringTable::getInstance()->getString("EnableSimulator");
-char* _PREHASH_DisableSimulator = LLMessageStringTable::getInstance()->getString("DisableSimulator");
-char* _PREHASH_ConfirmEnableSimulator = LLMessageStringTable::getInstance()->getString("ConfirmEnableSimulator");
-char* _PREHASH_LayerType = LLMessageStringTable::getInstance()->getString("LayerType");
-char* _PREHASH_OwnerRole = LLMessageStringTable::getInstance()->getString("OwnerRole");
-char* _PREHASH_ParcelOverlay = LLMessageStringTable::getInstance()->getString("ParcelOverlay");
-char* _PREHASH_GroupOwned = LLMessageStringTable::getInstance()->getString("GroupOwned");
-char* _PREHASH_IP = LLMessageStringTable::getInstance()->getString("IP");
-char* _PREHASH_ChatFromViewer = LLMessageStringTable::getInstance()->getString("ChatFromViewer");
-char* _PREHASH_AvgAgentsInView = LLMessageStringTable::getInstance()->getString("AvgAgentsInView");
-char* _PREHASH_AgentsInView = LLMessageStringTable::getInstance()->getString("AgentsInView");
-char* _PREHASH_GroupTitle = LLMessageStringTable::getInstance()->getString("GroupTitle");
-char* _PREHASH_MapLayerReply = LLMessageStringTable::getInstance()->getString("MapLayerReply");
-char* _PREHASH_CompoundMsgID = LLMessageStringTable::getInstance()->getString("CompoundMsgID");
-char* _PREHASH_CameraConstraint = LLMessageStringTable::getInstance()->getString("CameraConstraint");
-char* _PREHASH_DownloadTotals = LLMessageStringTable::getInstance()->getString("DownloadTotals");
-char* _PREHASH_GenCounter = LLMessageStringTable::getInstance()->getString("GenCounter");
-char* _PREHASH_FrozenData = LLMessageStringTable::getInstance()->getString("FrozenData");
-char* _PREHASH_ChildAgentDying = LLMessageStringTable::getInstance()->getString("ChildAgentDying");
-char* _PREHASH_To = LLMessageStringTable::getInstance()->getString("To");
-char* _PREHASH_CopyInventoryFromNotecard = LLMessageStringTable::getInstance()->getString("CopyInventoryFromNotecard");
-char* _PREHASH_RezObjectFromNotecard = LLMessageStringTable::getInstance()->getString("RezObjectFromNotecard");
-char* _PREHASH_ParcelDirFeeCurrent = LLMessageStringTable::getInstance()->getString("ParcelDirFeeCurrent");
-char* _PREHASH_SeedCapability = LLMessageStringTable::getInstance()->getString("SeedCapability");
-char* _PREHASH_ObjectDuplicate = LLMessageStringTable::getInstance()->getString("ObjectDuplicate");
-char* _PREHASH_InventoryData = LLMessageStringTable::getInstance()->getString("InventoryData");
-char* _PREHASH_ReplyData = LLMessageStringTable::getInstance()->getString("ReplyData");
-char* _PREHASH_ResetList = LLMessageStringTable::getInstance()->getString("ResetList");
-char* _PREHASH_MediaID = LLMessageStringTable::getInstance()->getString("MediaID");
-char* _PREHASH_RelatedRights = LLMessageStringTable::getInstance()->getString("RelatedRights");
-char* _PREHASH_RedirectGridX = LLMessageStringTable::getInstance()->getString("RedirectGridX");
-char* _PREHASH_RedirectGridY = LLMessageStringTable::getInstance()->getString("RedirectGridY");
-char* _PREHASH_TransferID = LLMessageStringTable::getInstance()->getString("TransferID");
-char* _PREHASH_TexturesChanged = LLMessageStringTable::getInstance()->getString("TexturesChanged");
-char* _PREHASH_UserLookAt = LLMessageStringTable::getInstance()->getString("UserLookAt");
-char* _PREHASH_TestBlock1 = LLMessageStringTable::getInstance()->getString("TestBlock1");
-char* _PREHASH_SensedData = LLMessageStringTable::getInstance()->getString("SensedData");
-char* _PREHASH_UpdateBlock = LLMessageStringTable::getInstance()->getString("UpdateBlock");
-char* _PREHASH_ClassifiedGodDelete = LLMessageStringTable::getInstance()->getString("ClassifiedGodDelete");
-char* _PREHASH_ObjectGrabUpdate = LLMessageStringTable::getInstance()->getString("ObjectGrabUpdate");
-char* _PREHASH_LocationPos = LLMessageStringTable::getInstance()->getString("LocationPos");
-char* _PREHASH_TaxDate = LLMessageStringTable::getInstance()->getString("TaxDate");
-char* _PREHASH_StartDateTime = LLMessageStringTable::getInstance()->getString("StartDateTime");
-char* _PREHASH_ObjectUpdateCached = LLMessageStringTable::getInstance()->getString("ObjectUpdateCached");
-char* _PREHASH_Packets = LLMessageStringTable::getInstance()->getString("Packets");
-char* _PREHASH_FailureType = LLMessageStringTable::getInstance()->getString("FailureType");
-char* _PREHASH_UpdateGroupInfo = LLMessageStringTable::getInstance()->getString("UpdateGroupInfo");
-char* _PREHASH_ObjectPermissions = LLMessageStringTable::getInstance()->getString("ObjectPermissions");
-char* _PREHASH_RevokePermissions = LLMessageStringTable::getInstance()->getString("RevokePermissions");
-char* _PREHASH_UpdateFlags = LLMessageStringTable::getInstance()->getString("UpdateFlags");
-char* _PREHASH_ObjectExportSelected = LLMessageStringTable::getInstance()->getString("ObjectExportSelected");
-char* _PREHASH_RezSelected = LLMessageStringTable::getInstance()->getString("RezSelected");
-char* _PREHASH_AutoPilot = LLMessageStringTable::getInstance()->getString("AutoPilot");
-char* _PREHASH_UpdateMuteListEntry = LLMessageStringTable::getInstance()->getString("UpdateMuteListEntry");
-char* _PREHASH_RemoveMuteListEntry = LLMessageStringTable::getInstance()->getString("RemoveMuteListEntry");
-char* _PREHASH_SetSimStatusInDatabase = LLMessageStringTable::getInstance()->getString("SetSimStatusInDatabase");
-char* _PREHASH_SetSimPresenceInDatabase = LLMessageStringTable::getInstance()->getString("SetSimPresenceInDatabase");
-char* _PREHASH_CameraProperty = LLMessageStringTable::getInstance()->getString("CameraProperty");
-char* _PREHASH_BrushSize = LLMessageStringTable::getInstance()->getString("BrushSize");
-char* _PREHASH_SimulatorSetMap = LLMessageStringTable::getInstance()->getString("SimulatorSetMap");
-char* _PREHASH_RegionPresenceRequestByRegionID = LLMessageStringTable::getInstance()->getString("RegionPresenceRequestByRegionID");
-char* _PREHASH_ParcelObjectOwnersReply = LLMessageStringTable::getInstance()->getString("ParcelObjectOwnersReply");
-char* _PREHASH_GroupMembersReply = LLMessageStringTable::getInstance()->getString("GroupMembersReply");
-char* _PREHASH_GroupRoleMembersReply = LLMessageStringTable::getInstance()->getString("GroupRoleMembersReply");
-char* _PREHASH_RequestRegionInfo = LLMessageStringTable::getInstance()->getString("RequestRegionInfo");
-char* _PREHASH_AABBMax = LLMessageStringTable::getInstance()->getString("AABBMax");
-char* _PREHASH_RequestPayPrice = LLMessageStringTable::getInstance()->getString("RequestPayPrice");
-char* _PREHASH_SimulatorPresentAtLocation = LLMessageStringTable::getInstance()->getString("SimulatorPresentAtLocation");
-char* _PREHASH_AgentRequestSit = LLMessageStringTable::getInstance()->getString("AgentRequestSit");
-char* _PREHASH_AABBMin = LLMessageStringTable::getInstance()->getString("AABBMin");
-char* _PREHASH_ClassifiedFlags = LLMessageStringTable::getInstance()->getString("ClassifiedFlags");
-char* _PREHASH_ControlFlags = LLMessageStringTable::getInstance()->getString("ControlFlags");
-char* _PREHASH_TeleportRequest = LLMessageStringTable::getInstance()->getString("TeleportRequest");
-char* _PREHASH_ScriptTeleportRequest = LLMessageStringTable::getInstance()->getString("ScriptTeleportRequest");
-char* _PREHASH_EstateCovenantRequest = LLMessageStringTable::getInstance()->getString("EstateCovenantRequest");
-char* _PREHASH_DateUTC = LLMessageStringTable::getInstance()->getString("DateUTC");
-char* _PREHASH_TaskIDs = LLMessageStringTable::getInstance()->getString("TaskIDs");
-char* _PREHASH_RequestResult = LLMessageStringTable::getInstance()->getString("RequestResult");
-char* _PREHASH_CanAcceptAgents = LLMessageStringTable::getInstance()->getString("CanAcceptAgents");
-char* _PREHASH_ObjectSaleInfo = LLMessageStringTable::getInstance()->getString("ObjectSaleInfo");
-char* _PREHASH_KillChildAgents = LLMessageStringTable::getInstance()->getString("KillChildAgents");
-char* _PREHASH_Balance = LLMessageStringTable::getInstance()->getString("Balance");
-char* _PREHASH_DerezContainer = LLMessageStringTable::getInstance()->getString("DerezContainer");
-char* _PREHASH_ObjectData = LLMessageStringTable::getInstance()->getString("ObjectData");
-char* _PREHASH_CameraAtAxis = LLMessageStringTable::getInstance()->getString("CameraAtAxis");
-char* _PREHASH_InfoBlock = LLMessageStringTable::getInstance()->getString("InfoBlock");
-char* _PREHASH_OwnershipCost = LLMessageStringTable::getInstance()->getString("OwnershipCost");
-char* _PREHASH_AvatarNotesUpdate = LLMessageStringTable::getInstance()->getString("AvatarNotesUpdate");
-char* _PREHASH_PID = LLMessageStringTable::getInstance()->getString("PID");
-char* _PREHASH_DirPopularReply = LLMessageStringTable::getInstance()->getString("DirPopularReply");
-char* _PREHASH_TerrainHeightRange00 = LLMessageStringTable::getInstance()->getString("TerrainHeightRange00");
-char* _PREHASH_SimData = LLMessageStringTable::getInstance()->getString("SimData");
-char* _PREHASH_TerrainHeightRange01 = LLMessageStringTable::getInstance()->getString("TerrainHeightRange01");
-char* _PREHASH_TerrainHeightRange10 = LLMessageStringTable::getInstance()->getString("TerrainHeightRange10");
-char* _PREHASH_TerrainHeightRange11 = LLMessageStringTable::getInstance()->getString("TerrainHeightRange11");
-char* _PREHASH_UpdateInventoryItem = LLMessageStringTable::getInstance()->getString("UpdateInventoryItem");
-char* _PREHASH_UpdateCreateInventoryItem = LLMessageStringTable::getInstance()->getString("UpdateCreateInventoryItem");
-char* _PREHASH_MoveInventoryItem = LLMessageStringTable::getInstance()->getString("MoveInventoryItem");
-char* _PREHASH_CopyInventoryItem = LLMessageStringTable::getInstance()->getString("CopyInventoryItem");
-char* _PREHASH_LinkInventoryItem = LLMessageStringTable::getInstance()->getString("LinkInventoryItem");
-char* _PREHASH_RemoveInventoryItem = LLMessageStringTable::getInstance()->getString("RemoveInventoryItem");
-char* _PREHASH_CreateInventoryItem = LLMessageStringTable::getInstance()->getString("CreateInventoryItem");
-char* _PREHASH_PathTwistBegin = LLMessageStringTable::getInstance()->getString("PathTwistBegin");
-char* _PREHASH_CRC = LLMessageStringTable::getInstance()->getString("CRC");
-char* _PREHASH_AttachmentPoint = LLMessageStringTable::getInstance()->getString("AttachmentPoint");
-char* _PREHASH_TelehubBlock = LLMessageStringTable::getInstance()->getString("TelehubBlock");
-char* _PREHASH_FOVBlock = LLMessageStringTable::getInstance()->getString("FOVBlock");
-char* _PREHASH_StartLocationData = LLMessageStringTable::getInstance()->getString("StartLocationData");
-char* _PREHASH_PositionData = LLMessageStringTable::getInstance()->getString("PositionData");
-char* _PREHASH_TimeSinceLast = LLMessageStringTable::getInstance()->getString("TimeSinceLast");
-char* _PREHASH_MapImage = LLMessageStringTable::getInstance()->getString("MapImage");
-char* _PREHASH_Objects = LLMessageStringTable::getInstance()->getString("Objects");
-char* _PREHASH_URL = LLMessageStringTable::getInstance()->getString("URL");
-char* _PREHASH_CreationDate = LLMessageStringTable::getInstance()->getString("CreationDate");
-char* _PREHASH_JointPivot = LLMessageStringTable::getInstance()->getString("JointPivot");
-char* _PREHASH_FPS = LLMessageStringTable::getInstance()->getString("FPS");
-char* _PREHASH_HasTelehub = LLMessageStringTable::getInstance()->getString("HasTelehub");
-char* _PREHASH_PathEnd = LLMessageStringTable::getInstance()->getString("PathEnd");
-char* _PREHASH_ScriptDataReply = LLMessageStringTable::getInstance()->getString("ScriptDataReply");
-char* _PREHASH_MapBlockReply = LLMessageStringTable::getInstance()->getString("MapBlockReply");
-char* _PREHASH_PropertiesData = LLMessageStringTable::getInstance()->getString("PropertiesData");
-char* _PREHASH_ViewerEffect = LLMessageStringTable::getInstance()->getString("ViewerEffect");
-char* _PREHASH_FreezeUser = LLMessageStringTable::getInstance()->getString("FreezeUser");
-char* _PREHASH_OwnerPrims = LLMessageStringTable::getInstance()->getString("OwnerPrims");
-char* _PREHASH_ObjectGrab = LLMessageStringTable::getInstance()->getString("ObjectGrab");
-char* _PREHASH_ToAgentID = LLMessageStringTable::getInstance()->getString("ToAgentID");
-char* _PREHASH_SimulatorMapUpdate = LLMessageStringTable::getInstance()->getString("SimulatorMapUpdate");
-char* _PREHASH_TransferPacket = LLMessageStringTable::getInstance()->getString("TransferPacket");
-char* _PREHASH_ObjectName = LLMessageStringTable::getInstance()->getString("ObjectName");
-char* _PREHASH_GroupPowers = LLMessageStringTable::getInstance()->getString("GroupPowers");
-char* _PREHASH_OriginalName = LLMessageStringTable::getInstance()->getString("OriginalName");
-char* _PREHASH_CompletePingCheck = LLMessageStringTable::getInstance()->getString("CompletePingCheck");
-char* _PREHASH_OnlineStatus = LLMessageStringTable::getInstance()->getString("OnlineStatus");
-char* _PREHASH_ObjectDrop = LLMessageStringTable::getInstance()->getString("ObjectDrop");
-char* _PREHASH_UseBigPackets = LLMessageStringTable::getInstance()->getString("UseBigPackets");
-char* _PREHASH_GroupNoticesListReply = LLMessageStringTable::getInstance()->getString("GroupNoticesListReply");
-char* _PREHASH_ParcelAccessListReply = LLMessageStringTable::getInstance()->getString("ParcelAccessListReply");
-char* _PREHASH_RpcChannelReply = LLMessageStringTable::getInstance()->getString("RpcChannelReply");
-char* _PREHASH_RegionPresenceResponse = LLMessageStringTable::getInstance()->getString("RegionPresenceResponse");
-char* _PREHASH_CharterMember = LLMessageStringTable::getInstance()->getString("CharterMember");
-char* _PREHASH_EdgeData = LLMessageStringTable::getInstance()->getString("EdgeData");
-char* _PREHASH_NameData = LLMessageStringTable::getInstance()->getString("NameData");
-char* _PREHASH_RegionPushOverride = LLMessageStringTable::getInstance()->getString("RegionPushOverride");
-char* _PREHASH_SimName = LLMessageStringTable::getInstance()->getString("SimName");
-char* _PREHASH_UserReport = LLMessageStringTable::getInstance()->getString("UserReport");
-char* _PREHASH_DownloadPriority = LLMessageStringTable::getInstance()->getString("DownloadPriority");
-char* _PREHASH_ToAgentId = LLMessageStringTable::getInstance()->getString("ToAgentId");
-char* _PREHASH_DirPopularQuery = LLMessageStringTable::getInstance()->getString("DirPopularQuery");
-char* _PREHASH_Mag = LLMessageStringTable::getInstance()->getString("Mag");
-char* _PREHASH_ParcelPropertiesRequestByID = LLMessageStringTable::getInstance()->getString("ParcelPropertiesRequestByID");
-char* _PREHASH_ObjectLink = LLMessageStringTable::getInstance()->getString("ObjectLink");
-char* _PREHASH_RpcScriptReplyInbound = LLMessageStringTable::getInstance()->getString("RpcScriptReplyInbound");
-char* _PREHASH_RezData = LLMessageStringTable::getInstance()->getString("RezData");
-char* _PREHASH_RemoveInventoryObjects = LLMessageStringTable::getInstance()->getString("RemoveInventoryObjects");
-char* _PREHASH_GroupProposalBallot = LLMessageStringTable::getInstance()->getString("GroupProposalBallot");
-char* _PREHASH_RPCServerIP = LLMessageStringTable::getInstance()->getString("RPCServerIP");
-char* _PREHASH_Far = LLMessageStringTable::getInstance()->getString("Far");
-char* _PREHASH_GodSessionID = LLMessageStringTable::getInstance()->getString("GodSessionID");
-char* _PREHASH_FLAboutText = LLMessageStringTable::getInstance()->getString("FLAboutText");
-char* _PREHASH_RegionHandshakeReply = LLMessageStringTable::getInstance()->getString("RegionHandshakeReply");
-char* _PREHASH_GroupActiveProposalItemReply = LLMessageStringTable::getInstance()->getString("GroupActiveProposalItemReply");
-char* _PREHASH_MapItemReply = LLMessageStringTable::getInstance()->getString("MapItemReply");
-char* _PREHASH_Seconds = LLMessageStringTable::getInstance()->getString("Seconds");
-char* _PREHASH_UpdateUserInfo = LLMessageStringTable::getInstance()->getString("UpdateUserInfo");
-char* _PREHASH_AggregatePermTexturesOwner = LLMessageStringTable::getInstance()->getString("AggregatePermTexturesOwner");
-char* _PREHASH_Set = LLMessageStringTable::getInstance()->getString("Set");
-char* _PREHASH_NewName = LLMessageStringTable::getInstance()->getString("NewName");
-char* _PREHASH_Key = LLMessageStringTable::getInstance()->getString("Key");
-char* _PREHASH_AgentID = LLMessageStringTable::getInstance()->getString("AgentID");
-char* _PREHASH_EventNotificationRemoveRequest = LLMessageStringTable::getInstance()->getString("EventNotificationRemoveRequest");
-char* _PREHASH_NewFolderID = LLMessageStringTable::getInstance()->getString("NewFolderID");
-char* _PREHASH_Arc = LLMessageStringTable::getInstance()->getString("Arc");
-char* _PREHASH_RegionX = LLMessageStringTable::getInstance()->getString("RegionX");
-char* _PREHASH_RegionY = LLMessageStringTable::getInstance()->getString("RegionY");
-char* _PREHASH_RequestData = LLMessageStringTable::getInstance()->getString("RequestData");
-char* _PREHASH_Msg = LLMessageStringTable::getInstance()->getString("Msg");
-char* _PREHASH_Top = LLMessageStringTable::getInstance()->getString("Top");
-char* _PREHASH_MiscStats = LLMessageStringTable::getInstance()->getString("MiscStats");
-char* _PREHASH_ImageID = LLMessageStringTable::getInstance()->getString("ImageID");
-char* _PREHASH_DataPacket = LLMessageStringTable::getInstance()->getString("DataPacket");
-char* _PREHASH_You = LLMessageStringTable::getInstance()->getString("You");
-char* _PREHASH_ScriptControlChange = LLMessageStringTable::getInstance()->getString("ScriptControlChange");
-char* _PREHASH_LoadURL = LLMessageStringTable::getInstance()->getString("LoadURL");
-char* _PREHASH_SetCPURatio = LLMessageStringTable::getInstance()->getString("SetCPURatio");
-char* _PREHASH_NameValueData = LLMessageStringTable::getInstance()->getString("NameValueData");
-char* _PREHASH_AtomicPassObject = LLMessageStringTable::getInstance()->getString("AtomicPassObject");
-char* _PREHASH_ErrorMessage = LLMessageStringTable::getInstance()->getString("ErrorMessage");
-char* _PREHASH_ViewerFrozenMessage = LLMessageStringTable::getInstance()->getString("ViewerFrozenMessage");
-char* _PREHASH_HealthMessage = LLMessageStringTable::getInstance()->getString("HealthMessage");
-char* _PREHASH_LogTextMessage = LLMessageStringTable::getInstance()->getString("LogTextMessage");
-char* _PREHASH_TimeDilation = LLMessageStringTable::getInstance()->getString("TimeDilation");
-char* _PREHASH_RemoveContribution = LLMessageStringTable::getInstance()->getString("RemoveContribution");
-char* _PREHASH_Contribution = LLMessageStringTable::getInstance()->getString("Contribution");
-char* _PREHASH_SetGroupContribution = LLMessageStringTable::getInstance()->getString("SetGroupContribution");
-char* _PREHASH_Offline = LLMessageStringTable::getInstance()->getString("Offline");
-char* _PREHASH_AgentIsNowWearing = LLMessageStringTable::getInstance()->getString("AgentIsNowWearing");
-char* _PREHASH_Members = LLMessageStringTable::getInstance()->getString("Members");
-char* _PREHASH_FailedResends = LLMessageStringTable::getInstance()->getString("FailedResends");
-char* _PREHASH_SecPerDay = LLMessageStringTable::getInstance()->getString("SecPerDay");
-char* _PREHASH_CameraCenter = LLMessageStringTable::getInstance()->getString("CameraCenter");
-char* _PREHASH_CameraLeftAxis = LLMessageStringTable::getInstance()->getString("CameraLeftAxis");
-char* _PREHASH_ExBlock = LLMessageStringTable::getInstance()->getString("ExBlock");
-char* _PREHASH_Channel = LLMessageStringTable::getInstance()->getString("Channel");
-char* _PREHASH_NetTest = LLMessageStringTable::getInstance()->getString("NetTest");
-char* _PREHASH_DiscardLevel = LLMessageStringTable::getInstance()->getString("DiscardLevel");
-char* _PREHASH_LayerID = LLMessageStringTable::getInstance()->getString("LayerID");
-char* _PREHASH_GrabOffset = LLMessageStringTable::getInstance()->getString("GrabOffset");
-char* _PREHASH_SimPort = LLMessageStringTable::getInstance()->getString("SimPort");
-char* _PREHASH_PricePerMeter = LLMessageStringTable::getInstance()->getString("PricePerMeter");
-char* _PREHASH_RegionFlags = LLMessageStringTable::getInstance()->getString("RegionFlags");
-char* _PREHASH_VoteResult = LLMessageStringTable::getInstance()->getString("VoteResult");
-char* _PREHASH_ParcelDirFeeEstimate = LLMessageStringTable::getInstance()->getString("ParcelDirFeeEstimate");
-char* _PREHASH_ModifyBlock = LLMessageStringTable::getInstance()->getString("ModifyBlock");
-char* _PREHASH_InventoryBlock = LLMessageStringTable::getInstance()->getString("InventoryBlock");
-char* _PREHASH_ReplyBlock = LLMessageStringTable::getInstance()->getString("ReplyBlock");
-char* _PREHASH_ValidUntil = LLMessageStringTable::getInstance()->getString("ValidUntil");
-char* _PREHASH_VelocityInterpolateOn = LLMessageStringTable::getInstance()->getString("VelocityInterpolateOn");
-char* _PREHASH_ClassifiedDelete = LLMessageStringTable::getInstance()->getString("ClassifiedDelete");
-char* _PREHASH_RegionDenyAnonymous = LLMessageStringTable::getInstance()->getString("RegionDenyAnonymous");
-char* _PREHASH_FLImageID = LLMessageStringTable::getInstance()->getString("FLImageID");
-char* _PREHASH_AllowPublish = LLMessageStringTable::getInstance()->getString("AllowPublish");
-char* _PREHASH_SitName = LLMessageStringTable::getInstance()->getString("SitName");
-char* _PREHASH_RegionsVisited = LLMessageStringTable::getInstance()->getString("RegionsVisited");
-char* _PREHASH_DirClassifiedReply = LLMessageStringTable::getInstance()->getString("DirClassifiedReply");
-char* _PREHASH_AvatarClassifiedReply = LLMessageStringTable::getInstance()->getString("AvatarClassifiedReply");
-char* _PREHASH_MediaURL = LLMessageStringTable::getInstance()->getString("MediaURL");
-char* _PREHASH_CompleteAgentMovement = LLMessageStringTable::getInstance()->getString("CompleteAgentMovement");
-char* _PREHASH_ClassifiedID = LLMessageStringTable::getInstance()->getString("ClassifiedID");
-char* _PREHASH_LocalID = LLMessageStringTable::getInstance()->getString("LocalID");
-char* _PREHASH_SpaceIP = LLMessageStringTable::getInstance()->getString("SpaceIP");
-char* _PREHASH_RemoveItem = LLMessageStringTable::getInstance()->getString("RemoveItem");
-char* _PREHASH_LogFailedMoneyTransaction = LLMessageStringTable::getInstance()->getString("LogFailedMoneyTransaction");
-char* _PREHASH_ViewerStartAuction = LLMessageStringTable::getInstance()->getString("ViewerStartAuction");
-char* _PREHASH_StartAuction = LLMessageStringTable::getInstance()->getString("StartAuction");
-char* _PREHASH_DuplicateFlags = LLMessageStringTable::getInstance()->getString("DuplicateFlags");
-char* _PREHASH_RegionInfo2 = LLMessageStringTable::getInstance()->getString("RegionInfo2");
-char* _PREHASH_TextColor = LLMessageStringTable::getInstance()->getString("TextColor");
-char* _PREHASH_SlaveID = LLMessageStringTable::getInstance()->getString("SlaveID");
-char* _PREHASH_Charter = LLMessageStringTable::getInstance()->getString("Charter");
-char* _PREHASH_AlertData = LLMessageStringTable::getInstance()->getString("AlertData");
-char* _PREHASH_AlertInfo = LLMessageStringTable::getInstance()->getString("AlertInfo");
-char* _PREHASH_TargetBlock = LLMessageStringTable::getInstance()->getString("TargetBlock");
-char* _PREHASH_CheckParcelAuctions = LLMessageStringTable::getInstance()->getString("CheckParcelAuctions");
-char* _PREHASH_ParcelAuctions = LLMessageStringTable::getInstance()->getString("ParcelAuctions");
-char* _PREHASH_OwnerIsGroup = LLMessageStringTable::getInstance()->getString("OwnerIsGroup");
-char* _PREHASH_NameValuePair = LLMessageStringTable::getInstance()->getString("NameValuePair");
-char* _PREHASH_RemoveNameValuePair = LLMessageStringTable::getInstance()->getString("RemoveNameValuePair");
-char* _PREHASH_BulkUpdateInventory = LLMessageStringTable::getInstance()->getString("BulkUpdateInventory");
-char* _PREHASH_UpdateTaskInventory = LLMessageStringTable::getInstance()->getString("UpdateTaskInventory");
-char* _PREHASH_RemoveTaskInventory = LLMessageStringTable::getInstance()->getString("RemoveTaskInventory");
-char* _PREHASH_MoveTaskInventory = LLMessageStringTable::getInstance()->getString("MoveTaskInventory");
-char* _PREHASH_RequestTaskInventory = LLMessageStringTable::getInstance()->getString("RequestTaskInventory");
-char* _PREHASH_ReplyTaskInventory = LLMessageStringTable::getInstance()->getString("ReplyTaskInventory");
-char* _PREHASH_AggregatePermInventory = LLMessageStringTable::getInstance()->getString("AggregatePermInventory");
-char* _PREHASH_GroupAccountTransactionsReply = LLMessageStringTable::getInstance()->getString("GroupAccountTransactionsReply");
-char* _PREHASH_SimulatorInfo = LLMessageStringTable::getInstance()->getString("SimulatorInfo");
-char* _PREHASH_WearableData = LLMessageStringTable::getInstance()->getString("WearableData");
-char* _PREHASH_Enabled = LLMessageStringTable::getInstance()->getString("Enabled");
-char* _PREHASH_Savings = LLMessageStringTable::getInstance()->getString("Savings");
-char* _PREHASH_SimulatorLoad = LLMessageStringTable::getInstance()->getString("SimulatorLoad");
-char* _PREHASH_InternalRegionIP = LLMessageStringTable::getInstance()->getString("InternalRegionIP");
-char* _PREHASH_ExternalRegionIP = LLMessageStringTable::getInstance()->getString("ExternalRegionIP");
-char* _PREHASH_TotalPairs = LLMessageStringTable::getInstance()->getString("TotalPairs");
-char* _PREHASH_CreateGroupRequest = LLMessageStringTable::getInstance()->getString("CreateGroupRequest");
-char* _PREHASH_JoinGroupRequest = LLMessageStringTable::getInstance()->getString("JoinGroupRequest");
-char* _PREHASH_LeaveGroupRequest = LLMessageStringTable::getInstance()->getString("LeaveGroupRequest");
-char* _PREHASH_InviteGroupRequest = LLMessageStringTable::getInstance()->getString("InviteGroupRequest");
-char* _PREHASH_LiveHelpGroupRequest = LLMessageStringTable::getInstance()->getString("LiveHelpGroupRequest");
-char* _PREHASH_PriceParcelClaimFactor = LLMessageStringTable::getInstance()->getString("PriceParcelClaimFactor");
-char* _PREHASH_BillableArea = LLMessageStringTable::getInstance()->getString("BillableArea");
-char* _PREHASH_ObjectID = LLMessageStringTable::getInstance()->getString("ObjectID");
-char* _PREHASH_ObjectFlagUpdate = LLMessageStringTable::getInstance()->getString("ObjectFlagUpdate");
-char* _PREHASH_GroupRoleUpdate = LLMessageStringTable::getInstance()->getString("GroupRoleUpdate");
-char* _PREHASH_RequestInventoryAsset = LLMessageStringTable::getInstance()->getString("RequestInventoryAsset");
-char* _PREHASH_ChangedGrid = LLMessageStringTable::getInstance()->getString("ChangedGrid");
-char* _PREHASH_AgentDropGroup = LLMessageStringTable::getInstance()->getString("AgentDropGroup");
-char* _PREHASH_Details = LLMessageStringTable::getInstance()->getString("Details");
-char* _PREHASH_LocationX = LLMessageStringTable::getInstance()->getString("LocationX");
-char* _PREHASH_SaleType = LLMessageStringTable::getInstance()->getString("SaleType");
-char* _PREHASH_LocationY = LLMessageStringTable::getInstance()->getString("LocationY");
-char* _PREHASH_LocationZ = LLMessageStringTable::getInstance()->getString("LocationZ");
-char* _PREHASH_EconomyData = LLMessageStringTable::getInstance()->getString("EconomyData");
-char* _PREHASH_HeadRotation = LLMessageStringTable::getInstance()->getString("HeadRotation");
-char* _PREHASH_DeleteOnCompletion = LLMessageStringTable::getInstance()->getString("DeleteOnCompletion");
-char* _PREHASH_PublicPort = LLMessageStringTable::getInstance()->getString("PublicPort");
-char* _PREHASH_DirClassifiedQuery = LLMessageStringTable::getInstance()->getString("DirClassifiedQuery");
-char* _PREHASH_CallbackID = LLMessageStringTable::getInstance()->getString("CallbackID");
-char* _PREHASH_RequestParcelTransfer = LLMessageStringTable::getInstance()->getString("RequestParcelTransfer");
-char* _PREHASH_RoleCount = LLMessageStringTable::getInstance()->getString("RoleCount");
-char* _PREHASH_ObjectCapacity = LLMessageStringTable::getInstance()->getString("ObjectCapacity");
-char* _PREHASH_RequestID = LLMessageStringTable::getInstance()->getString("RequestID");
-char* _PREHASH_RequestXfer = LLMessageStringTable::getInstance()->getString("RequestXfer");
-char* _PREHASH_ObjectTaxCurrent = LLMessageStringTable::getInstance()->getString("ObjectTaxCurrent");
-char* _PREHASH_LightTaxCurrent = LLMessageStringTable::getInstance()->getString("LightTaxCurrent");
-char* _PREHASH_LandTaxCurrent = LLMessageStringTable::getInstance()->getString("LandTaxCurrent");
-char* _PREHASH_GroupTaxCurrent = LLMessageStringTable::getInstance()->getString("GroupTaxCurrent");
-char* _PREHASH_FetchInventoryDescendents = LLMessageStringTable::getInstance()->getString("FetchInventoryDescendents");
-char* _PREHASH_InventoryDescendents = LLMessageStringTable::getInstance()->getString("InventoryDescendents");
-char* _PREHASH_Descendents = LLMessageStringTable::getInstance()->getString("Descendents");
-char* _PREHASH_PurgeInventoryDescendents = LLMessageStringTable::getInstance()->getString("PurgeInventoryDescendents");
-char* _PREHASH_ShowDir = LLMessageStringTable::getInstance()->getString("ShowDir");
-char* _PREHASH_IsOwner = LLMessageStringTable::getInstance()->getString("IsOwner");
-char* _PREHASH_Timestamp = LLMessageStringTable::getInstance()->getString("Timestamp");
-char* _PREHASH_GlobalPos = LLMessageStringTable::getInstance()->getString("GlobalPos");
-char* _PREHASH_GrabOffsetInitial = LLMessageStringTable::getInstance()->getString("GrabOffsetInitial");
-char* _PREHASH_IsTrial = LLMessageStringTable::getInstance()->getString("IsTrial");
-char* _PREHASH_ObjectDuplicateOnRay = LLMessageStringTable::getInstance()->getString("ObjectDuplicateOnRay");
-char* _PREHASH_GroupMembershipCount = LLMessageStringTable::getInstance()->getString("GroupMembershipCount");
-char* _PREHASH_MethodData = LLMessageStringTable::getInstance()->getString("MethodData");
-char* _PREHASH_ActivateGestures = LLMessageStringTable::getInstance()->getString("ActivateGestures");
-char* _PREHASH_DeactivateGestures = LLMessageStringTable::getInstance()->getString("DeactivateGestures");
-char* _PREHASH_ProposalData = LLMessageStringTable::getInstance()->getString("ProposalData");
-char* _PREHASH_PosGlobal = LLMessageStringTable::getInstance()->getString("PosGlobal");
-char* _PREHASH_SearchID = LLMessageStringTable::getInstance()->getString("SearchID");
-char* _PREHASH_RezMultipleAttachmentsFromInv = LLMessageStringTable::getInstance()->getString("RezMultipleAttachmentsFromInv");
-char* _PREHASH_SearchName = LLMessageStringTable::getInstance()->getString("SearchName");
-char* _PREHASH_VersionString = LLMessageStringTable::getInstance()->getString("VersionString");
-char* _PREHASH_CreateGroupReply = LLMessageStringTable::getInstance()->getString("CreateGroupReply");
-char* _PREHASH_LeaveGroupReply = LLMessageStringTable::getInstance()->getString("LeaveGroupReply");
-char* _PREHASH_ActualArea = LLMessageStringTable::getInstance()->getString("ActualArea");
-char* _PREHASH_Message = LLMessageStringTable::getInstance()->getString("Message");
-char* _PREHASH_ClickAction = LLMessageStringTable::getInstance()->getString("ClickAction");
-char* _PREHASH_AssetUploadComplete = LLMessageStringTable::getInstance()->getString("AssetUploadComplete");
-char* _PREHASH_RequestType = LLMessageStringTable::getInstance()->getString("RequestType");
-char* _PREHASH_UUID = LLMessageStringTable::getInstance()->getString("UUID");
-char* _PREHASH_BaseMask = LLMessageStringTable::getInstance()->getString("BaseMask");
-char* _PREHASH_NetBlock = LLMessageStringTable::getInstance()->getString("NetBlock");
-char* _PREHASH_GlobalX = LLMessageStringTable::getInstance()->getString("GlobalX");
-char* _PREHASH_GlobalY = LLMessageStringTable::getInstance()->getString("GlobalY");
-char* _PREHASH_CopyRotates = LLMessageStringTable::getInstance()->getString("CopyRotates");
-char* _PREHASH_KickUserAck = LLMessageStringTable::getInstance()->getString("KickUserAck");
-char* _PREHASH_TopPick = LLMessageStringTable::getInstance()->getString("TopPick"); //legacy var need to be deleted -angela
-char* _PREHASH_SessionID = LLMessageStringTable::getInstance()->getString("SessionID");
-char* _PREHASH_GlobalZ = LLMessageStringTable::getInstance()->getString("GlobalZ");
-char* _PREHASH_DeclineFriendship = LLMessageStringTable::getInstance()->getString("DeclineFriendship");
-char* _PREHASH_FormFriendship = LLMessageStringTable::getInstance()->getString("FormFriendship");
-char* _PREHASH_TerminateFriendship = LLMessageStringTable::getInstance()->getString("TerminateFriendship");
-char* _PREHASH_TaskData = LLMessageStringTable::getInstance()->getString("TaskData");
-char* _PREHASH_SimWideMaxPrims = LLMessageStringTable::getInstance()->getString("SimWideMaxPrims");
-char* _PREHASH_TotalPrims = LLMessageStringTable::getInstance()->getString("TotalPrims");
-char* _PREHASH_ProfileBegin = LLMessageStringTable::getInstance()->getString("ProfileBegin");
-char* _PREHASH_Request = LLMessageStringTable::getInstance()->getString("Request");
-char* _PREHASH_GroupAccountDetailsRequest = LLMessageStringTable::getInstance()->getString("GroupAccountDetailsRequest");
-char* _PREHASH_GroupActiveProposalsRequest = LLMessageStringTable::getInstance()->getString("GroupActiveProposalsRequest");
-char* _PREHASH_StringValue = LLMessageStringTable::getInstance()->getString("StringValue");
-char* _PREHASH_Version = LLMessageStringTable::getInstance()->getString("Version");
-char* _PREHASH_OtherCount = LLMessageStringTable::getInstance()->getString("OtherCount");
-char* _PREHASH_MemberCount = LLMessageStringTable::getInstance()->getString("MemberCount");
-char* _PREHASH_ChatData = LLMessageStringTable::getInstance()->getString("ChatData");
-char* _PREHASH_IsGroupOwned = LLMessageStringTable::getInstance()->getString("IsGroupOwned");
-char* _PREHASH_EnergyEfficiency = LLMessageStringTable::getInstance()->getString("EnergyEfficiency");
-char* _PREHASH_PickInfoUpdate = LLMessageStringTable::getInstance()->getString("PickInfoUpdate");
-char* _PREHASH_PickDelete = LLMessageStringTable::getInstance()->getString("PickDelete");
-char* _PREHASH_ScriptReset = LLMessageStringTable::getInstance()->getString("ScriptReset");
-char* _PREHASH_Requester = LLMessageStringTable::getInstance()->getString("Requester");
-char* _PREHASH_ForSale = LLMessageStringTable::getInstance()->getString("ForSale");
-char* _PREHASH_NearestLandingRegionReply = LLMessageStringTable::getInstance()->getString("NearestLandingRegionReply");
-char* _PREHASH_ParcelID = LLMessageStringTable::getInstance()->getString("ParcelID");
-char* _PREHASH_Godlike = LLMessageStringTable::getInstance()->getString("Godlike");
-char* _PREHASH_TotalDebits = LLMessageStringTable::getInstance()->getString("TotalDebits");
-char* _PREHASH_Direction = LLMessageStringTable::getInstance()->getString("Direction");
-char* _PREHASH_HealthData = LLMessageStringTable::getInstance()->getString("HealthData");
-char* _PREHASH_LeftAxis = LLMessageStringTable::getInstance()->getString("LeftAxis");
-char* _PREHASH_LocationBlock = LLMessageStringTable::getInstance()->getString("LocationBlock");
-char* _PREHASH_ObjectImage = LLMessageStringTable::getInstance()->getString("ObjectImage");
-char* _PREHASH_TerrainStartHeight00 = LLMessageStringTable::getInstance()->getString("TerrainStartHeight00");
-char* _PREHASH_TerrainStartHeight01 = LLMessageStringTable::getInstance()->getString("TerrainStartHeight01");
-char* _PREHASH_TerrainStartHeight10 = LLMessageStringTable::getInstance()->getString("TerrainStartHeight10");
-char* _PREHASH_TerrainStartHeight11 = LLMessageStringTable::getInstance()->getString("TerrainStartHeight11");
-char* _PREHASH_WaterHeight = LLMessageStringTable::getInstance()->getString("WaterHeight");
-char* _PREHASH_FetchInventoryReply = LLMessageStringTable::getInstance()->getString("FetchInventoryReply");
-char* _PREHASH_GroupAccountSummaryReply = LLMessageStringTable::getInstance()->getString("GroupAccountSummaryReply");
-char* _PREHASH_AttachedSound = LLMessageStringTable::getInstance()->getString("AttachedSound");
-char* _PREHASH_ParamInUse = LLMessageStringTable::getInstance()->getString("ParamInUse");
-char* _PREHASH_GodKickUser = LLMessageStringTable::getInstance()->getString("GodKickUser");
-char* _PREHASH_PickName = LLMessageStringTable::getInstance()->getString("PickName");
-char* _PREHASH_TaskName = LLMessageStringTable::getInstance()->getString("TaskName");
-char* _PREHASH_ObjectCount = LLMessageStringTable::getInstance()->getString("ObjectCount");
-char* _PREHASH_RegionPresenceRequestByHandle = LLMessageStringTable::getInstance()->getString("RegionPresenceRequestByHandle");
-char* _PREHASH_RezSingleAttachmentFromInv = LLMessageStringTable::getInstance()->getString("RezSingleAttachmentFromInv");
-char* _PREHASH_ChildAgentUpdate = LLMessageStringTable::getInstance()->getString("ChildAgentUpdate");
-char* _PREHASH_IsOwnerGroup = LLMessageStringTable::getInstance()->getString("IsOwnerGroup");
-char* _PREHASH_AgentHeightWidth = LLMessageStringTable::getInstance()->getString("AgentHeightWidth");
-char* _PREHASH_VerticalAngle = LLMessageStringTable::getInstance()->getString("VerticalAngle");
-char* _PREHASH_WearableType = LLMessageStringTable::getInstance()->getString("WearableType");
-char* _PREHASH_AggregatePermNextOwner = LLMessageStringTable::getInstance()->getString("AggregatePermNextOwner");
-char* _PREHASH_ShowInList = LLMessageStringTable::getInstance()->getString("ShowInList");
-char* _PREHASH_UpdateParcel = LLMessageStringTable::getInstance()->getString("UpdateParcel");
-char* _PREHASH_SetAlwaysRun = LLMessageStringTable::getInstance()->getString("SetAlwaysRun");
-char* _PREHASH_NVPair = LLMessageStringTable::getInstance()->getString("NVPair");
-char* _PREHASH_SearchType = LLMessageStringTable::getInstance()->getString("SearchType");
-char* _PREHASH_ObjectSpinStart = LLMessageStringTable::getInstance()->getString("ObjectSpinStart");
-char* _PREHASH_UseEstateSun = LLMessageStringTable::getInstance()->getString("UseEstateSun");
-char* _PREHASH_RegionID = LLMessageStringTable::getInstance()->getString("RegionID");
-char* _PREHASH_AbuseRegionID = LLMessageStringTable::getInstance()->getString("AbuseRegionID");
-char* _PREHASH_Creator = LLMessageStringTable::getInstance()->getString("Creator");
-char* _PREHASH_ProposalText = LLMessageStringTable::getInstance()->getString("ProposalText");
-char* _PREHASH_DirEventsReply = LLMessageStringTable::getInstance()->getString("DirEventsReply");
-char* _PREHASH_EventInfoReply = LLMessageStringTable::getInstance()->getString("EventInfoReply");
-char* _PREHASH_UserInfoReply = LLMessageStringTable::getInstance()->getString("UserInfoReply");
-char* _PREHASH_PathRadiusOffset = LLMessageStringTable::getInstance()->getString("PathRadiusOffset");
-char* _PREHASH_TextureData = LLMessageStringTable::getInstance()->getString("TextureData");
-char* _PREHASH_ChatPass = LLMessageStringTable::getInstance()->getString("ChatPass");
-char* _PREHASH_TargetID = LLMessageStringTable::getInstance()->getString("TargetID");
-char* _PREHASH_DefaultPayPrice = LLMessageStringTable::getInstance()->getString("DefaultPayPrice");
-char* _PREHASH_UserLocation = LLMessageStringTable::getInstance()->getString("UserLocation");
-char* _PREHASH_MaxPrims = LLMessageStringTable::getInstance()->getString("MaxPrims");
-char* _PREHASH_LandmarkID = LLMessageStringTable::getInstance()->getString("LandmarkID");
-char* _PREHASH_InitiateDownload = LLMessageStringTable::getInstance()->getString("InitiateDownload");
-char* _PREHASH_Name = LLMessageStringTable::getInstance()->getString("Name");
-char* _PREHASH_OtherCleanTime = LLMessageStringTable::getInstance()->getString("OtherCleanTime");
-char* _PREHASH_ParcelSetOtherCleanTime = LLMessageStringTable::getInstance()->getString("ParcelSetOtherCleanTime");
-char* _PREHASH_TeleportPriceExponent = LLMessageStringTable::getInstance()->getString("TeleportPriceExponent");
-char* _PREHASH_Gain = LLMessageStringTable::getInstance()->getString("Gain");
-char* _PREHASH_PacketAck = LLMessageStringTable::getInstance()->getString("PacketAck");
-char* _PREHASH_PathSkew = LLMessageStringTable::getInstance()->getString("PathSkew");
-char* _PREHASH_SimulatorShutdownRequest = LLMessageStringTable::getInstance()->getString("SimulatorShutdownRequest");
-char* _PREHASH_NearestLandingRegionRequest = LLMessageStringTable::getInstance()->getString("NearestLandingRegionRequest");
-char* _PREHASH_OtherID = LLMessageStringTable::getInstance()->getString("OtherID");
-char* _PREHASH_MemberID = LLMessageStringTable::getInstance()->getString("MemberID");
-char* _PREHASH_MapLayerRequest = LLMessageStringTable::getInstance()->getString("MapLayerRequest");
-char* _PREHASH_ObjectScale = LLMessageStringTable::getInstance()->getString("ObjectScale");
-char* _PREHASH_TargetIP = LLMessageStringTable::getInstance()->getString("TargetIP");
-char* _PREHASH_Redo = LLMessageStringTable::getInstance()->getString("Redo");
-char* _PREHASH_MoneyBalance = LLMessageStringTable::getInstance()->getString("MoneyBalance");
-char* _PREHASH_TrackAgent = LLMessageStringTable::getInstance()->getString("TrackAgent");
-char* _PREHASH_MaxX = LLMessageStringTable::getInstance()->getString("MaxX");
-char* _PREHASH_Data = LLMessageStringTable::getInstance()->getString("Data");
-char* _PREHASH_MaxY = LLMessageStringTable::getInstance()->getString("MaxY");
-char* _PREHASH_TextureAnim = LLMessageStringTable::getInstance()->getString("TextureAnim");
-char* _PREHASH_ReturnIDs = LLMessageStringTable::getInstance()->getString("ReturnIDs");
-char* _PREHASH_Date = LLMessageStringTable::getInstance()->getString("Date");
-char* _PREHASH_AgentWearablesUpdate = LLMessageStringTable::getInstance()->getString("AgentWearablesUpdate");
-char* _PREHASH_AgentDataUpdate = LLMessageStringTable::getInstance()->getString("AgentDataUpdate");
-char* _PREHASH_GroupDataUpdate = LLMessageStringTable::getInstance()->getString("GroupDataUpdate");
-char* _PREHASH_Hash = LLMessageStringTable::getInstance()->getString("Hash");
-char* _PREHASH_AgentGroupDataUpdate = LLMessageStringTable::getInstance()->getString("AgentGroupDataUpdate");
-char* _PREHASH_Left = LLMessageStringTable::getInstance()->getString("Left");
-char* _PREHASH_Mask = LLMessageStringTable::getInstance()->getString("Mask");
-char* _PREHASH_ForceMouselook = LLMessageStringTable::getInstance()->getString("ForceMouselook");
-char* _PREHASH_Success = LLMessageStringTable::getInstance()->getString("Success");
-char* _PREHASH_ObjectGroup = LLMessageStringTable::getInstance()->getString("ObjectGroup");
-char* _PREHASH_SunHour = LLMessageStringTable::getInstance()->getString("SunHour");
-char* _PREHASH_MinX = LLMessageStringTable::getInstance()->getString("MinX");
-char* _PREHASH_ScriptSensorReply = LLMessageStringTable::getInstance()->getString("ScriptSensorReply");
-char* _PREHASH_MinY = LLMessageStringTable::getInstance()->getString("MinY");
-char* _PREHASH_Command = LLMessageStringTable::getInstance()->getString("Command");
-char* _PREHASH_Desc = LLMessageStringTable::getInstance()->getString("Desc");
-char* _PREHASH_AttachmentNeedsSave = LLMessageStringTable::getInstance()->getString("AttachmentNeedsSave");
-char* _PREHASH_HistoryItemData = LLMessageStringTable::getInstance()->getString("HistoryItemData");
-char* _PREHASH_AgentCachedTexture = LLMessageStringTable::getInstance()->getString("AgentCachedTexture");
-char* _PREHASH_Subject = LLMessageStringTable::getInstance()->getString("Subject");
-char* _PREHASH_East = LLMessageStringTable::getInstance()->getString("East");
-char* _PREHASH_QueryReplies = LLMessageStringTable::getInstance()->getString("QueryReplies");
-char* _PREHASH_ObjectCategory = LLMessageStringTable::getInstance()->getString("ObjectCategory");
-char* _PREHASH_Time = LLMessageStringTable::getInstance()->getString("Time");
-char* _PREHASH_CreateLandmarkForEvent = LLMessageStringTable::getInstance()->getString("CreateLandmarkForEvent");
-char* _PREHASH_ParentID = LLMessageStringTable::getInstance()->getString("ParentID");
-char* _PREHASH_Ping = LLMessageStringTable::getInstance()->getString("Ping");
-char* _PREHASH_Perp = LLMessageStringTable::getInstance()->getString("Perp");
-char* _PREHASH_Code = LLMessageStringTable::getInstance()->getString("Code");
-char* _PREHASH_InvType = LLMessageStringTable::getInstance()->getString("InvType");
-char* _PREHASH_AgentFOV = LLMessageStringTable::getInstance()->getString("AgentFOV");
-char* _PREHASH_Audible = LLMessageStringTable::getInstance()->getString("Audible");
-char* _PREHASH_AuctionData = LLMessageStringTable::getInstance()->getString("AuctionData");
-char* _PREHASH_IDBlock = LLMessageStringTable::getInstance()->getString("IDBlock");
-char* _PREHASH_West = LLMessageStringTable::getInstance()->getString("West");
-char* _PREHASH_Undo = LLMessageStringTable::getInstance()->getString("Undo");
-char* _PREHASH_TotalNumItems = LLMessageStringTable::getInstance()->getString("TotalNumItems");
-char* _PREHASH_Info = LLMessageStringTable::getInstance()->getString("Info");
-char* _PREHASH_Area = LLMessageStringTable::getInstance()->getString("Area");
-char* _PREHASH_SimCrashed = LLMessageStringTable::getInstance()->getString("SimCrashed");
-char* _PREHASH_Text = LLMessageStringTable::getInstance()->getString("Text");
-char* _PREHASH_PriceGroupCreate = LLMessageStringTable::getInstance()->getString("PriceGroupCreate");
-char* _PREHASH_ObjectShape = LLMessageStringTable::getInstance()->getString("ObjectShape");
-char* _PREHASH_GroupRoleDataReply = LLMessageStringTable::getInstance()->getString("GroupRoleDataReply");
-char* _PREHASH_MuteCRC = LLMessageStringTable::getInstance()->getString("MuteCRC");
-char* _PREHASH_Size = LLMessageStringTable::getInstance()->getString("Size");
-char* _PREHASH_FromAddress = LLMessageStringTable::getInstance()->getString("FromAddress");
-char* _PREHASH_Body = LLMessageStringTable::getInstance()->getString("Body");
-char* _PREHASH_FileData = LLMessageStringTable::getInstance()->getString("FileData");
-char* _PREHASH_List = LLMessageStringTable::getInstance()->getString("List");
-char* _PREHASH_KickUser = LLMessageStringTable::getInstance()->getString("KickUser");
-char* _PREHASH_OtherPrims = LLMessageStringTable::getInstance()->getString("OtherPrims");
-char* _PREHASH_RunTime = LLMessageStringTable::getInstance()->getString("RunTime");
-char* _PREHASH_GrantUserRights = LLMessageStringTable::getInstance()->getString("GrantUserRights");
-char* _PREHASH_RpcScriptRequestInboundForward = LLMessageStringTable::getInstance()->getString("RpcScriptRequestInboundForward");
-char* _PREHASH_More = LLMessageStringTable::getInstance()->getString("More");
-char* _PREHASH_Majority = LLMessageStringTable::getInstance()->getString("Majority");
-char* _PREHASH_MetersTraveled = LLMessageStringTable::getInstance()->getString("MetersTraveled");
-char* _PREHASH_Stat = LLMessageStringTable::getInstance()->getString("Stat");
-char* _PREHASH_SoundID = LLMessageStringTable::getInstance()->getString("SoundID");
-char* _PREHASH_Item = LLMessageStringTable::getInstance()->getString("Item");
-char* _PREHASH_User = LLMessageStringTable::getInstance()->getString("User");
-char* _PREHASH_Prey = LLMessageStringTable::getInstance()->getString("Prey");
-char* _PREHASH_RayStart = LLMessageStringTable::getInstance()->getString("RayStart");
-char* _PREHASH_UsecSinceStart = LLMessageStringTable::getInstance()->getString("UsecSinceStart");
-char* _PREHASH_ParcelData = LLMessageStringTable::getInstance()->getString("ParcelData");
-char* _PREHASH_CameraUpAxis = LLMessageStringTable::getInstance()->getString("CameraUpAxis");
-char* _PREHASH_ScriptDialog = LLMessageStringTable::getInstance()->getString("ScriptDialog");
-char* _PREHASH_MasterParcelData = LLMessageStringTable::getInstance()->getString("MasterParcelData");
-char* _PREHASH_Invalid = LLMessageStringTable::getInstance()->getString("Invalid");
-char* _PREHASH_ProfileCurve = LLMessageStringTable::getInstance()->getString("ProfileCurve");
-char* _PREHASH_ParcelAccessListUpdate = LLMessageStringTable::getInstance()->getString("ParcelAccessListUpdate");
-char* _PREHASH_MuteListUpdate = LLMessageStringTable::getInstance()->getString("MuteListUpdate");
-char* _PREHASH_SendPacket = LLMessageStringTable::getInstance()->getString("SendPacket");
-char* _PREHASH_SendXferPacket = LLMessageStringTable::getInstance()->getString("SendXferPacket");
-char* _PREHASH_RegionDenyIdentified = LLMessageStringTable::getInstance()->getString("RegionDenyIdentified");
-char* _PREHASH_NotecardItemID = LLMessageStringTable::getInstance()->getString("NotecardItemID");
-char* _PREHASH_LastName = LLMessageStringTable::getInstance()->getString("LastName");
-char* _PREHASH_From = LLMessageStringTable::getInstance()->getString("From");
-char* _PREHASH_RoleChange = LLMessageStringTable::getInstance()->getString("RoleChange");
-char* _PREHASH_Port = LLMessageStringTable::getInstance()->getString("Port");
-char* _PREHASH_MemberTitle = LLMessageStringTable::getInstance()->getString("MemberTitle");
-char* _PREHASH_LogParcelChanges = LLMessageStringTable::getInstance()->getString("LogParcelChanges");
-char* _PREHASH_AgentCachedTextureResponse = LLMessageStringTable::getInstance()->getString("AgentCachedTextureResponse");
-char* _PREHASH_DeRezObject = LLMessageStringTable::getInstance()->getString("DeRezObject");
-char* _PREHASH_IsTemporary = LLMessageStringTable::getInstance()->getString("IsTemporary");
-char* _PREHASH_InsigniaID = LLMessageStringTable::getInstance()->getString("InsigniaID");
-char* _PREHASH_CheckFlags = LLMessageStringTable::getInstance()->getString("CheckFlags");
-char* _PREHASH_EventID = LLMessageStringTable::getInstance()->getString("EventID");
-char* _PREHASH_Selected = LLMessageStringTable::getInstance()->getString("Selected");
-char* _PREHASH_FromAgentId = LLMessageStringTable::getInstance()->getString("FromAgentId");
-char* _PREHASH_Type = LLMessageStringTable::getInstance()->getString("Type");
-char* _PREHASH_ChatType = LLMessageStringTable::getInstance()->getString("ChatType");
-char* _PREHASH_ReportData = LLMessageStringTable::getInstance()->getString("ReportData");
-char* _PREHASH_RequestBlock = LLMessageStringTable::getInstance()->getString("RequestBlock");
-char* _PREHASH_GrantData = LLMessageStringTable::getInstance()->getString("GrantData");
-char* _PREHASH_DetachAttachmentIntoInv = LLMessageStringTable::getInstance()->getString("DetachAttachmentIntoInv");
-char* _PREHASH_ParcelDisableObjects = LLMessageStringTable::getInstance()->getString("ParcelDisableObjects");
-char* _PREHASH_Sections = LLMessageStringTable::getInstance()->getString("Sections");
-char* _PREHASH_GodLevel = LLMessageStringTable::getInstance()->getString("GodLevel");
-char* _PREHASH_PayPriceReply = LLMessageStringTable::getInstance()->getString("PayPriceReply");
-char* _PREHASH_QueryID = LLMessageStringTable::getInstance()->getString("QueryID");
-char* _PREHASH_CameraEyeOffset = LLMessageStringTable::getInstance()->getString("CameraEyeOffset");
-char* _PREHASH_AgentPosition = LLMessageStringTable::getInstance()->getString("AgentPosition");
-char* _PREHASH_GrabPosition = LLMessageStringTable::getInstance()->getString("GrabPosition");
-char* _PREHASH_OnlineNotification = LLMessageStringTable::getInstance()->getString("OnlineNotification");
-char* _PREHASH_OfflineNotification = LLMessageStringTable::getInstance()->getString("OfflineNotification");
-char* _PREHASH_SendPostcard = LLMessageStringTable::getInstance()->getString("SendPostcard");
-char* _PREHASH_RequestFlags = LLMessageStringTable::getInstance()->getString("RequestFlags");
-char* _PREHASH_GroupAccountSummaryRequest = LLMessageStringTable::getInstance()->getString("GroupAccountSummaryRequest");
-char* _PREHASH_GroupVoteHistoryRequest = LLMessageStringTable::getInstance()->getString("GroupVoteHistoryRequest");
-char* _PREHASH_ParamValue = LLMessageStringTable::getInstance()->getString("ParamValue");
-char* _PREHASH_MaxAgents = LLMessageStringTable::getInstance()->getString("MaxAgents");
-char* _PREHASH_CreateNewOutfitAttachments = LLMessageStringTable::getInstance()->getString("CreateNewOutfitAttachments");
-char* _PREHASH_RegionHandle = LLMessageStringTable::getInstance()->getString("RegionHandle");
-char* _PREHASH_TeleportProgress = LLMessageStringTable::getInstance()->getString("TeleportProgress");
-char* _PREHASH_AgentQuitCopy = LLMessageStringTable::getInstance()->getString("AgentQuitCopy");
-char* _PREHASH_AvatarInterestsUpdate = LLMessageStringTable::getInstance()->getString("AvatarInterestsUpdate");
-char* _PREHASH_GroupNoticeID = LLMessageStringTable::getInstance()->getString("GroupNoticeID");
-char* _PREHASH_ParcelName = LLMessageStringTable::getInstance()->getString("ParcelName");
-char* _PREHASH_PriceObjectRent = LLMessageStringTable::getInstance()->getString("PriceObjectRent");
-char* _PREHASH_OfferCallingCard = LLMessageStringTable::getInstance()->getString("OfferCallingCard");
-char* _PREHASH_AcceptCallingCard = LLMessageStringTable::getInstance()->getString("AcceptCallingCard");
-char* _PREHASH_DeclineCallingCard = LLMessageStringTable::getInstance()->getString("DeclineCallingCard");
-char* _PREHASH_AgentAccess = LLMessageStringTable::getInstance()->getString("AgentAccess");
-char* _PREHASH_AgentLegacyAccess = LLMessageStringTable::getInstance()->getString("AgentLegacyAccess");
-char* _PREHASH_AgentMaxAccess = LLMessageStringTable::getInstance()->getString("AgentMaxAccess");
-char* _PREHASH_DataHomeLocationReply = LLMessageStringTable::getInstance()->getString("DataHomeLocationReply");
-char* _PREHASH_EventLocationReply = LLMessageStringTable::getInstance()->getString("EventLocationReply");
-char* _PREHASH_TerseDateID = LLMessageStringTable::getInstance()->getString("TerseDateID");
-char* _PREHASH_ObjectOwner = LLMessageStringTable::getInstance()->getString("ObjectOwner");
-char* _PREHASH_AssetID = LLMessageStringTable::getInstance()->getString("AssetID");
-char* _PREHASH_AlertMessage = LLMessageStringTable::getInstance()->getString("AlertMessage");
-char* _PREHASH_AgentAlertMessage = LLMessageStringTable::getInstance()->getString("AgentAlertMessage");
-char* _PREHASH_EstateOwnerMessage = LLMessageStringTable::getInstance()->getString("EstateOwnerMessage");
-char* _PREHASH_ParcelMediaCommandMessage = LLMessageStringTable::getInstance()->getString("ParcelMediaCommandMessage");
-char* _PREHASH_Auction = LLMessageStringTable::getInstance()->getString("Auction");
-char* _PREHASH_Category = LLMessageStringTable::getInstance()->getString("Category");
-char* _PREHASH_FilePath = LLMessageStringTable::getInstance()->getString("FilePath");
-char* _PREHASH_ItemFlags = LLMessageStringTable::getInstance()->getString("ItemFlags");
-char* _PREHASH_Invoice = LLMessageStringTable::getInstance()->getString("Invoice");
-char* _PREHASH_IntervalDays = LLMessageStringTable::getInstance()->getString("IntervalDays");
-char* _PREHASH_PathScaleX = LLMessageStringTable::getInstance()->getString("PathScaleX");
-char* _PREHASH_FromTaskID = LLMessageStringTable::getInstance()->getString("FromTaskID");
-char* _PREHASH_PathScaleY = LLMessageStringTable::getInstance()->getString("PathScaleY");
-char* _PREHASH_TimeInfo = LLMessageStringTable::getInstance()->getString("TimeInfo");
-char* _PREHASH_PublicCount = LLMessageStringTable::getInstance()->getString("PublicCount");
-char* _PREHASH_ParcelJoin = LLMessageStringTable::getInstance()->getString("ParcelJoin");
-char* _PREHASH_GroupRolesCount = LLMessageStringTable::getInstance()->getString("GroupRolesCount");
-char* _PREHASH_SimulatorBlock = LLMessageStringTable::getInstance()->getString("SimulatorBlock");
-char* _PREHASH_GroupID = LLMessageStringTable::getInstance()->getString("GroupID");
-char* _PREHASH_AgentVel = LLMessageStringTable::getInstance()->getString("AgentVel");
-char* _PREHASH_RequestImage = LLMessageStringTable::getInstance()->getString("RequestImage");
-char* _PREHASH_NetStats = LLMessageStringTable::getInstance()->getString("NetStats");
-char* _PREHASH_AgentPos = LLMessageStringTable::getInstance()->getString("AgentPos");
-char* _PREHASH_AgentSit = LLMessageStringTable::getInstance()->getString("AgentSit");
-char* _PREHASH_Material = LLMessageStringTable::getInstance()->getString("Material");
-char* _PREHASH_ObjectDeGrab = LLMessageStringTable::getInstance()->getString("ObjectDeGrab");
-char* _PREHASH_VelocityInterpolateOff = LLMessageStringTable::getInstance()->getString("VelocityInterpolateOff");
-char* _PREHASH_AuthorizedBuyerID = LLMessageStringTable::getInstance()->getString("AuthorizedBuyerID");
-char* _PREHASH_AvatarPropertiesReply = LLMessageStringTable::getInstance()->getString("AvatarPropertiesReply");
-char* _PREHASH_GroupProfileReply = LLMessageStringTable::getInstance()->getString("GroupProfileReply");
-char* _PREHASH_SimOwner = LLMessageStringTable::getInstance()->getString("SimOwner");
-char* _PREHASH_SalePrice = LLMessageStringTable::getInstance()->getString("SalePrice");
-char* _PREHASH_Animation = LLMessageStringTable::getInstance()->getString("Animation");
-char* _PREHASH_OwnerID = LLMessageStringTable::getInstance()->getString("OwnerID");
-char* _PREHASH_NearestLandingRegionUpdated = LLMessageStringTable::getInstance()->getString("NearestLandingRegionUpdated");
-char* _PREHASH_PassToAgent = LLMessageStringTable::getInstance()->getString("PassToAgent");
-char* _PREHASH_PreyAgent = LLMessageStringTable::getInstance()->getString("PreyAgent");
-char* _PREHASH_SimStats = LLMessageStringTable::getInstance()->getString("SimStats");
-char* _PREHASH_LogoutReply = LLMessageStringTable::getInstance()->getString("LogoutReply");
-char* _PREHASH_FeatureDisabled = LLMessageStringTable::getInstance()->getString("FeatureDisabled");
-char* _PREHASH_PhysicalAvatarEventList = LLMessageStringTable::getInstance()->getString("PhysicalAvatarEventList");
-char* _PREHASH_ObjectLocalID = LLMessageStringTable::getInstance()->getString("ObjectLocalID");
-char* _PREHASH_Dropped = LLMessageStringTable::getInstance()->getString("Dropped");
-char* _PREHASH_WebProfilesDisabled = LLMessageStringTable::getInstance()->getString("WebProfilesDisabled");
-char* _PREHASH_Destination = LLMessageStringTable::getInstance()->getString("Destination");
-char* _PREHASH_MasterID = LLMessageStringTable::getInstance()->getString("MasterID");
-char* _PREHASH_TransferData = LLMessageStringTable::getInstance()->getString("TransferData");
-char* _PREHASH_WantToMask = LLMessageStringTable::getInstance()->getString("WantToMask");
-char* _PREHASH_ParcelSelectObjects = LLMessageStringTable::getInstance()->getString("ParcelSelectObjects");
-char* _PREHASH_ExtraParams = LLMessageStringTable::getInstance()->getString("ExtraParams");
-char* _PREHASH_CreatorID = LLMessageStringTable::getInstance()->getString("CreatorID");
-char* _PREHASH_Summary = LLMessageStringTable::getInstance()->getString("Summary");
-char* _PREHASH_BuyObjectInventory = LLMessageStringTable::getInstance()->getString("BuyObjectInventory");
-char* _PREHASH_FetchInventory = LLMessageStringTable::getInstance()->getString("FetchInventory");
-char* _PREHASH_InventoryID = LLMessageStringTable::getInstance()->getString("InventoryID");
-char* _PREHASH_PacketNumber = LLMessageStringTable::getInstance()->getString("PacketNumber");
-char* _PREHASH_SetFollowCamProperties = LLMessageStringTable::getInstance()->getString("SetFollowCamProperties");
-char* _PREHASH_ClearFollowCamProperties = LLMessageStringTable::getInstance()->getString("ClearFollowCamProperties");
-char* _PREHASH_SequenceID = LLMessageStringTable::getInstance()->getString("SequenceID");
-char* _PREHASH_DataServerLogout = LLMessageStringTable::getInstance()->getString("DataServerLogout");
-char* _PREHASH_NameValue = LLMessageStringTable::getInstance()->getString("NameValue");
-char* _PREHASH_PathShearX = LLMessageStringTable::getInstance()->getString("PathShearX");
-char* _PREHASH_PathShearY = LLMessageStringTable::getInstance()->getString("PathShearY");
-char* _PREHASH_Velocity = LLMessageStringTable::getInstance()->getString("Velocity");
-char* _PREHASH_SecPerYear = LLMessageStringTable::getInstance()->getString("SecPerYear");
-char* _PREHASH_FirstName = LLMessageStringTable::getInstance()->getString("FirstName");
-char* _PREHASH_AttachedSoundGainChange = LLMessageStringTable::getInstance()->getString("AttachedSoundGainChange");
-char* _PREHASH_LocationID = LLMessageStringTable::getInstance()->getString("LocationID");
-char* _PREHASH_Running = LLMessageStringTable::getInstance()->getString("Running");
-char* _PREHASH_AgentThrottle = LLMessageStringTable::getInstance()->getString("AgentThrottle");
-char* _PREHASH_NeighborList = LLMessageStringTable::getInstance()->getString("NeighborList");
-char* _PREHASH_PathTaperX = LLMessageStringTable::getInstance()->getString("PathTaperX");
-char* _PREHASH_PathTaperY = LLMessageStringTable::getInstance()->getString("PathTaperY");
-char* _PREHASH_AgentRelated = LLMessageStringTable::getInstance()->getString("AgentRelated");
-char* _PREHASH_GranterBlock = LLMessageStringTable::getInstance()->getString("GranterBlock");
-char* _PREHASH_UseCachedMuteList = LLMessageStringTable::getInstance()->getString("UseCachedMuteList");
-char* _PREHASH_FailStats = LLMessageStringTable::getInstance()->getString("FailStats");
-char* _PREHASH_Tempfile = LLMessageStringTable::getInstance()->getString("Tempfile");
-char* _PREHASH_BuyerID = LLMessageStringTable::getInstance()->getString("BuyerID");
-char* _PREHASH_DirPeopleReply = LLMessageStringTable::getInstance()->getString("DirPeopleReply");
-char* _PREHASH_TransferInfo = LLMessageStringTable::getInstance()->getString("TransferInfo");
-char* _PREHASH_AvatarPickerRequestBackend = LLMessageStringTable::getInstance()->getString("AvatarPickerRequestBackend");
-char* _PREHASH_AvatarPropertiesRequestBackend = LLMessageStringTable::getInstance()->getString("AvatarPropertiesRequestBackend");
-char* _PREHASH_UpdateData = LLMessageStringTable::getInstance()->getString("UpdateData");
-char* _PREHASH_SimFPS = LLMessageStringTable::getInstance()->getString("SimFPS");
-char* _PREHASH_ReporterID = LLMessageStringTable::getInstance()->getString("ReporterID");
-char* _PREHASH_ButtonLabel = LLMessageStringTable::getInstance()->getString("ButtonLabel");
-char* _PREHASH_GranterID = LLMessageStringTable::getInstance()->getString("GranterID");
-char* _PREHASH_WantToText = LLMessageStringTable::getInstance()->getString("WantToText");
-char* _PREHASH_ReportType = LLMessageStringTable::getInstance()->getString("ReportType");
-char* _PREHASH_SimulatorReady = LLMessageStringTable::getInstance()->getString("SimulatorReady");
-char* _PREHASH_DataBlock = LLMessageStringTable::getInstance()->getString("DataBlock");
-char* _PREHASH_AnimationSourceList = LLMessageStringTable::getInstance()->getString("AnimationSourceList");
-char* _PREHASH_SubscribeLoad = LLMessageStringTable::getInstance()->getString("SubscribeLoad");
-char* _PREHASH_UnsubscribeLoad = LLMessageStringTable::getInstance()->getString("UnsubscribeLoad");
-char* _PREHASH_Packet = LLMessageStringTable::getInstance()->getString("Packet");
-char* _PREHASH_UndoLand = LLMessageStringTable::getInstance()->getString("UndoLand");
-char* _PREHASH_SimAccess = LLMessageStringTable::getInstance()->getString("SimAccess");
-char* _PREHASH_AbuserID = LLMessageStringTable::getInstance()->getString("AbuserID");
-char* _PREHASH_MembershipFee = LLMessageStringTable::getInstance()->getString("MembershipFee");
-char* _PREHASH_InviteGroupResponse = LLMessageStringTable::getInstance()->getString("InviteGroupResponse");
-char* _PREHASH_CreateInventoryFolder = LLMessageStringTable::getInstance()->getString("CreateInventoryFolder");
-char* _PREHASH_UpdateInventoryFolder = LLMessageStringTable::getInstance()->getString("UpdateInventoryFolder");
-char* _PREHASH_MoveInventoryFolder = LLMessageStringTable::getInstance()->getString("MoveInventoryFolder");
-char* _PREHASH_RemoveInventoryFolder = LLMessageStringTable::getInstance()->getString("RemoveInventoryFolder");
-char* _PREHASH_MoneyData = LLMessageStringTable::getInstance()->getString("MoneyData");
-char* _PREHASH_ObjectDeselect = LLMessageStringTable::getInstance()->getString("ObjectDeselect");
-char* _PREHASH_NewAssetID = LLMessageStringTable::getInstance()->getString("NewAssetID");
-char* _PREHASH_ObjectAdd = LLMessageStringTable::getInstance()->getString("ObjectAdd");
-char* _PREHASH_RayEndIsIntersection = LLMessageStringTable::getInstance()->getString("RayEndIsIntersection");
-char* _PREHASH_CompleteAuction = LLMessageStringTable::getInstance()->getString("CompleteAuction");
-char* _PREHASH_CircuitCode = LLMessageStringTable::getInstance()->getString("CircuitCode");
-char* _PREHASH_AgentMovementComplete = LLMessageStringTable::getInstance()->getString("AgentMovementComplete");
-char* _PREHASH_ViewerIP = LLMessageStringTable::getInstance()->getString("ViewerIP");
-char* _PREHASH_Header = LLMessageStringTable::getInstance()->getString("Header");
-char* _PREHASH_GestureFlags = LLMessageStringTable::getInstance()->getString("GestureFlags");
-char* _PREHASH_XferID = LLMessageStringTable::getInstance()->getString("XferID");
-char* _PREHASH_StatValue = LLMessageStringTable::getInstance()->getString("StatValue");
-char* _PREHASH_TaskID = LLMessageStringTable::getInstance()->getString("TaskID");
-char* _PREHASH_PickID = LLMessageStringTable::getInstance()->getString("PickID");
-char* _PREHASH_RayEnd = LLMessageStringTable::getInstance()->getString("RayEnd");
-char* _PREHASH_Throttles = LLMessageStringTable::getInstance()->getString("Throttles");
-char* _PREHASH_RebakeAvatarTextures = LLMessageStringTable::getInstance()->getString("RebakeAvatarTextures");
-char* _PREHASH_UpAxis = LLMessageStringTable::getInstance()->getString("UpAxis");
-char* _PREHASH_AgentTextures = LLMessageStringTable::getInstance()->getString("AgentTextures");
-char* _PREHASH_NotecardData = LLMessageStringTable::getInstance()->getString("NotecardData");
-char* _PREHASH_Radius = LLMessageStringTable::getInstance()->getString("Radius");
-char* _PREHASH_OffCircuit = LLMessageStringTable::getInstance()->getString("OffCircuit");
-char* _PREHASH_Access = LLMessageStringTable::getInstance()->getString("Access");
-char* _PREHASH_TitleRoleID = LLMessageStringTable::getInstance()->getString("TitleRoleID");
-char* _PREHASH_SquareMetersCredit = LLMessageStringTable::getInstance()->getString("SquareMetersCredit");
-char* _PREHASH_Filename = LLMessageStringTable::getInstance()->getString("Filename");
-char* _PREHASH_ClassifiedInfoRequest = LLMessageStringTable::getInstance()->getString("ClassifiedInfoRequest");
-char* _PREHASH_ParcelInfoRequest = LLMessageStringTable::getInstance()->getString("ParcelInfoRequest");
-char* _PREHASH_ParcelObjectOwnersRequest = LLMessageStringTable::getInstance()->getString("ParcelObjectOwnersRequest");
-char* _PREHASH_TeleportLandmarkRequest = LLMessageStringTable::getInstance()->getString("TeleportLandmarkRequest");
-char* _PREHASH_EventInfoRequest = LLMessageStringTable::getInstance()->getString("EventInfoRequest");
-char* _PREHASH_MoneyBalanceRequest = LLMessageStringTable::getInstance()->getString("MoneyBalanceRequest");
-char* _PREHASH_GroupMembersRequest = LLMessageStringTable::getInstance()->getString("GroupMembersRequest");
-char* _PREHASH_GroupRoleMembersRequest = LLMessageStringTable::getInstance()->getString("GroupRoleMembersRequest");
-char* _PREHASH_ChatFromSimulator = LLMessageStringTable::getInstance()->getString("ChatFromSimulator");
-char* _PREHASH_OldFolderID = LLMessageStringTable::getInstance()->getString("OldFolderID");
-char* _PREHASH_UserInfoRequest = LLMessageStringTable::getInstance()->getString("UserInfoRequest");
-char* _PREHASH_TextureID = LLMessageStringTable::getInstance()->getString("TextureID");
-char* _PREHASH_ProfileURL = LLMessageStringTable::getInstance()->getString("ProfileURL");
-char* _PREHASH_Handle = LLMessageStringTable::getInstance()->getString("Handle");
-char* _PREHASH_ButtonIndex = LLMessageStringTable::getInstance()->getString("ButtonIndex");
-char* _PREHASH_GetScriptRunning = LLMessageStringTable::getInstance()->getString("GetScriptRunning");
-char* _PREHASH_SetScriptRunning = LLMessageStringTable::getInstance()->getString("SetScriptRunning");
-char* _PREHASH_Health = LLMessageStringTable::getInstance()->getString("Health");
-char* _PREHASH_CircuitInfo = LLMessageStringTable::getInstance()->getString("CircuitInfo");
-char* _PREHASH_ObjectBuy = LLMessageStringTable::getInstance()->getString("ObjectBuy");
-char* _PREHASH_ProfileEnd = LLMessageStringTable::getInstance()->getString("ProfileEnd");
-char* _PREHASH_Effect = LLMessageStringTable::getInstance()->getString("Effect");
-char* _PREHASH_TestMessage = LLMessageStringTable::getInstance()->getString("TestMessage");
-char* _PREHASH_ScriptMailRegistration = LLMessageStringTable::getInstance()->getString("ScriptMailRegistration");
-char* _PREHASH_AgentSetAppearance = LLMessageStringTable::getInstance()->getString("AgentSetAppearance");
-char* _PREHASH_AvatarAppearance = LLMessageStringTable::getInstance()->getString("AvatarAppearance");
-char* _PREHASH_RegionData = LLMessageStringTable::getInstance()->getString("RegionData");
-char* _PREHASH_RequestingRegionData = LLMessageStringTable::getInstance()->getString("RequestingRegionData");
-char* _PREHASH_LandingRegionData = LLMessageStringTable::getInstance()->getString("LandingRegionData");
-char* _PREHASH_SitTransform = LLMessageStringTable::getInstance()->getString("SitTransform");
-char* _PREHASH_TerrainBase0 = LLMessageStringTable::getInstance()->getString("TerrainBase0");
-char* _PREHASH_SkillsMask = LLMessageStringTable::getInstance()->getString("SkillsMask");
-char* _PREHASH_AtAxis = LLMessageStringTable::getInstance()->getString("AtAxis");
-char* _PREHASH_TerrainBase1 = LLMessageStringTable::getInstance()->getString("TerrainBase1");
-char* _PREHASH_Reason = LLMessageStringTable::getInstance()->getString("Reason");
-char* _PREHASH_TerrainBase2 = LLMessageStringTable::getInstance()->getString("TerrainBase2");
-char* _PREHASH_TerrainBase3 = LLMessageStringTable::getInstance()->getString("TerrainBase3");
-char* _PREHASH_Params = LLMessageStringTable::getInstance()->getString("Params");
-char* _PREHASH_PingID = LLMessageStringTable::getInstance()->getString("PingID");
-char* _PREHASH_Change = LLMessageStringTable::getInstance()->getString("Change");
-char* _PREHASH_Height = LLMessageStringTable::getInstance()->getString("Height");
-char* _PREHASH_Region = LLMessageStringTable::getInstance()->getString("Region");
-char* _PREHASH_TelehubInfo = LLMessageStringTable::getInstance()->getString("TelehubInfo");
-char* _PREHASH_StateSave = LLMessageStringTable::getInstance()->getString("StateSave");
-char* _PREHASH_RoleData = LLMessageStringTable::getInstance()->getString("RoleData");
-char* _PREHASH_AgentAnimation = LLMessageStringTable::getInstance()->getString("AgentAnimation");
-char* _PREHASH_AvatarAnimation = LLMessageStringTable::getInstance()->getString("AvatarAnimation");
-char* _PREHASH_LogDwellTime = LLMessageStringTable::getInstance()->getString("LogDwellTime");
-char* _PREHASH_ParcelGodMarkAsContent = LLMessageStringTable::getInstance()->getString("ParcelGodMarkAsContent");
-char* _PREHASH_UsePhysics = LLMessageStringTable::getInstance()->getString("UsePhysics");
-char* _PREHASH_RegionDenyTransacted = LLMessageStringTable::getInstance()->getString("RegionDenyTransacted");
-char* _PREHASH_JointType = LLMessageStringTable::getInstance()->getString("JointType");
-char* _PREHASH_ObjectTaxEstimate = LLMessageStringTable::getInstance()->getString("ObjectTaxEstimate");
-char* _PREHASH_LightTaxEstimate = LLMessageStringTable::getInstance()->getString("LightTaxEstimate");
-char* _PREHASH_LandTaxEstimate = LLMessageStringTable::getInstance()->getString("LandTaxEstimate");
-char* _PREHASH_TeleportLandingStatusChanged = LLMessageStringTable::getInstance()->getString("TeleportLandingStatusChanged");
-char* _PREHASH_GroupTaxEstimate = LLMessageStringTable::getInstance()->getString("GroupTaxEstimate");
-char* _PREHASH_AvgViewerFPS = LLMessageStringTable::getInstance()->getString("AvgViewerFPS");
-char* _PREHASH_Buttons = LLMessageStringTable::getInstance()->getString("Buttons");
-char* _PREHASH_Sender = LLMessageStringTable::getInstance()->getString("Sender");
-char* _PREHASH_Dialog = LLMessageStringTable::getInstance()->getString("Dialog");
-char* _PREHASH_TargetData = LLMessageStringTable::getInstance()->getString("TargetData");
-char* _PREHASH_DestID = LLMessageStringTable::getInstance()->getString("DestID");
-char* _PREHASH_PricePublicObjectDelete = LLMessageStringTable::getInstance()->getString("PricePublicObjectDelete");
-char* _PREHASH_ObjectDelete = LLMessageStringTable::getInstance()->getString("ObjectDelete");
-char* _PREHASH_Delete = LLMessageStringTable::getInstance()->getString("Delete");
-char* _PREHASH_EventGodDelete = LLMessageStringTable::getInstance()->getString("EventGodDelete");
-char* _PREHASH_LastTaxDate = LLMessageStringTable::getInstance()->getString("LastTaxDate");
-char* _PREHASH_MapImageID = LLMessageStringTable::getInstance()->getString("MapImageID");
-char* _PREHASH_EndDateTime = LLMessageStringTable::getInstance()->getString("EndDateTime");
-char* _PREHASH_TerrainDetail0 = LLMessageStringTable::getInstance()->getString("TerrainDetail0");
-char* _PREHASH_TerrainDetail1 = LLMessageStringTable::getInstance()->getString("TerrainDetail1");
-char* _PREHASH_TerrainDetail2 = LLMessageStringTable::getInstance()->getString("TerrainDetail2");
-char* _PREHASH_TerrainDetail3 = LLMessageStringTable::getInstance()->getString("TerrainDetail3");
-char* _PREHASH_Offset = LLMessageStringTable::getInstance()->getString("Offset");
-char* _PREHASH_ObjectDelink = LLMessageStringTable::getInstance()->getString("ObjectDelink");
-char* _PREHASH_TargetObject = LLMessageStringTable::getInstance()->getString("TargetObject");
-char* _PREHASH_IsEstateManager = LLMessageStringTable::getInstance()->getString("IsEstateManager");
-char* _PREHASH_CancelAuction = LLMessageStringTable::getInstance()->getString("CancelAuction");
-char* _PREHASH_ObjectDetach = LLMessageStringTable::getInstance()->getString("ObjectDetach");
-char* _PREHASH_Compressed = LLMessageStringTable::getInstance()->getString("Compressed");
-char* _PREHASH_PathBegin = LLMessageStringTable::getInstance()->getString("PathBegin");
-char* _PREHASH_BypassRaycast = LLMessageStringTable::getInstance()->getString("BypassRaycast");
-char* _PREHASH_WinnerID = LLMessageStringTable::getInstance()->getString("WinnerID");
-char* _PREHASH_ChannelType = LLMessageStringTable::getInstance()->getString("ChannelType");
-char* _PREHASH_NonExemptMembers = LLMessageStringTable::getInstance()->getString("NonExemptMembers");
-char* _PREHASH_Agents = LLMessageStringTable::getInstance()->getString("Agents");
-char* _PREHASH_MemberData = LLMessageStringTable::getInstance()->getString("MemberData");
-char* _PREHASH_ToGroupID = LLMessageStringTable::getInstance()->getString("ToGroupID");
-char* _PREHASH_ImageNotInDatabase = LLMessageStringTable::getInstance()->getString("ImageNotInDatabase");
-char* _PREHASH_StartDate = LLMessageStringTable::getInstance()->getString("StartDate");
-char* _PREHASH_AnimID = LLMessageStringTable::getInstance()->getString("AnimID");
-char* _PREHASH_Serial = LLMessageStringTable::getInstance()->getString("Serial");
-char* _PREHASH_AbuseRegionName = LLMessageStringTable::getInstance()->getString("AbuseRegionName");
-char* _PREHASH_ModifyLand = LLMessageStringTable::getInstance()->getString("ModifyLand");
-char* _PREHASH_Digest = LLMessageStringTable::getInstance()->getString("Digest");
-char* _PREHASH_Victim = LLMessageStringTable::getInstance()->getString("Victim");
-char* _PREHASH_Script = LLMessageStringTable::getInstance()->getString("Script");
-char* _PREHASH_PickInfoReply = LLMessageStringTable::getInstance()->getString("PickInfoReply");
-char* _PREHASH_MoneyBalanceReply = LLMessageStringTable::getInstance()->getString("MoneyBalanceReply");
-char* _PREHASH_RoutedMoneyBalanceReply = LLMessageStringTable::getInstance()->getString("RoutedMoneyBalanceReply");
-char* _PREHASH_RoleID = LLMessageStringTable::getInstance()->getString("RoleID");
-char* _PREHASH_RegionInfo = LLMessageStringTable::getInstance()->getString("RegionInfo");
-char* _PREHASH_GodUpdateRegionInfo = LLMessageStringTable::getInstance()->getString("GodUpdateRegionInfo");
-char* _PREHASH_StartAnim = LLMessageStringTable::getInstance()->getString("StartAnim");
-char* _PREHASH_Action = LLMessageStringTable::getInstance()->getString("Action");
-char* _PREHASH_Location = LLMessageStringTable::getInstance()->getString("Location");
-char* _PREHASH_Rights = LLMessageStringTable::getInstance()->getString("Rights");
-char* _PREHASH_SearchDir = LLMessageStringTable::getInstance()->getString("SearchDir");
-char* _PREHASH_TransferRequest = LLMessageStringTable::getInstance()->getString("TransferRequest");
-char* _PREHASH_ScriptSensorRequest = LLMessageStringTable::getInstance()->getString("ScriptSensorRequest");
-char* _PREHASH_MoneyTransferRequest = LLMessageStringTable::getInstance()->getString("MoneyTransferRequest");
-char* _PREHASH_EjectGroupMemberRequest = LLMessageStringTable::getInstance()->getString("EjectGroupMemberRequest");
-char* _PREHASH_SkillsText = LLMessageStringTable::getInstance()->getString("SkillsText");
-char* _PREHASH_Resent = LLMessageStringTable::getInstance()->getString("Resent");
-char* _PREHASH_Center = LLMessageStringTable::getInstance()->getString("Center");
-char* _PREHASH_SharedData = LLMessageStringTable::getInstance()->getString("SharedData");
-char* _PREHASH_PSBlock = LLMessageStringTable::getInstance()->getString("PSBlock");
-char* _PREHASH_UUIDNameBlock = LLMessageStringTable::getInstance()->getString("UUIDNameBlock");
-char* _PREHASH_GroupTitleUpdate = LLMessageStringTable::getInstance()->getString("GroupTitleUpdate");
-char* _PREHASH_Method = LLMessageStringTable::getInstance()->getString("Method");
-char* _PREHASH_TouchName = LLMessageStringTable::getInstance()->getString("TouchName");
-char* _PREHASH_UpdateType = LLMessageStringTable::getInstance()->getString("UpdateType");
-char* _PREHASH_KickedFromEstateID = LLMessageStringTable::getInstance()->getString("KickedFromEstateID");
-char* _PREHASH_CandidateID = LLMessageStringTable::getInstance()->getString("CandidateID");
-char* _PREHASH_ParamData = LLMessageStringTable::getInstance()->getString("ParamData");
-char* _PREHASH_GodlikeMessage = LLMessageStringTable::getInstance()->getString("GodlikeMessage");
-char* _PREHASH_SystemMessage = LLMessageStringTable::getInstance()->getString("SystemMessage");
-char* _PREHASH_BodyRotation = LLMessageStringTable::getInstance()->getString("BodyRotation");
-char* _PREHASH_SearchRegions = LLMessageStringTable::getInstance()->getString("SearchRegions");
-char* _PREHASH_AnimationData = LLMessageStringTable::getInstance()->getString("AnimationData");
-char* _PREHASH_StatID = LLMessageStringTable::getInstance()->getString("StatID");
-char* _PREHASH_ItemID = LLMessageStringTable::getInstance()->getString("ItemID");
-char* _PREHASH_ScriptDialogReply = LLMessageStringTable::getInstance()->getString("ScriptDialogReply");
-char* _PREHASH_RegionIDAndHandleReply = LLMessageStringTable::getInstance()->getString("RegionIDAndHandleReply");
-char* _PREHASH_CameraAtOffset = LLMessageStringTable::getInstance()->getString("CameraAtOffset");
-char* _PREHASH_VoteID = LLMessageStringTable::getInstance()->getString("VoteID");
-char* _PREHASH_ParcelGodForceOwner = LLMessageStringTable::getInstance()->getString("ParcelGodForceOwner");
-char* _PREHASH_Filter = LLMessageStringTable::getInstance()->getString("Filter");
-char* _PREHASH_InviteData = LLMessageStringTable::getInstance()->getString("InviteData");
-char* _PREHASH_PCode = LLMessageStringTable::getInstance()->getString("PCode");
-char* _PREHASH_SearchPos = LLMessageStringTable::getInstance()->getString("SearchPos");
-char* _PREHASH_PreyID = LLMessageStringTable::getInstance()->getString("PreyID");
-char* _PREHASH_TerrainLowerLimit = LLMessageStringTable::getInstance()->getString("TerrainLowerLimit");
-char* _PREHASH_EventFlags = LLMessageStringTable::getInstance()->getString("EventFlags");
-char* _PREHASH_TallyVotes = LLMessageStringTable::getInstance()->getString("TallyVotes");
-char* _PREHASH_Result = LLMessageStringTable::getInstance()->getString("Result");
-char* _PREHASH_LookAt = LLMessageStringTable::getInstance()->getString("LookAt");
-char* _PREHASH_SearchOrder = LLMessageStringTable::getInstance()->getString("SearchOrder");
-char* _PREHASH_PayButton = LLMessageStringTable::getInstance()->getString("PayButton");
-char* _PREHASH_SelfCount = LLMessageStringTable::getInstance()->getString("SelfCount");
-char* _PREHASH_PacketCount = LLMessageStringTable::getInstance()->getString("PacketCount");
-char* _PREHASH_ParcelBuyPass = LLMessageStringTable::getInstance()->getString("ParcelBuyPass");
-char* _PREHASH_OldItemID = LLMessageStringTable::getInstance()->getString("OldItemID");
-char* _PREHASH_RegionPort = LLMessageStringTable::getInstance()->getString("RegionPort");
-char* _PREHASH_PriceEnergyUnit = LLMessageStringTable::getInstance()->getString("PriceEnergyUnit");
-char* _PREHASH_Bitmap = LLMessageStringTable::getInstance()->getString("Bitmap");
-char* _PREHASH_CacheMissType = LLMessageStringTable::getInstance()->getString("CacheMissType");
-char* _PREHASH_VFileID = LLMessageStringTable::getInstance()->getString("VFileID");
-char* _PREHASH_GroupInsigniaID = LLMessageStringTable::getInstance()->getString("GroupInsigniaID");
-char* _PREHASH_Online = LLMessageStringTable::getInstance()->getString("Online");
-char* _PREHASH_KickFlags = LLMessageStringTable::getInstance()->getString("KickFlags");
-char* _PREHASH_CovenantID = LLMessageStringTable::getInstance()->getString("CovenantID");
-char* _PREHASH_SysCPU = LLMessageStringTable::getInstance()->getString("SysCPU");
-char* _PREHASH_EMail = LLMessageStringTable::getInstance()->getString("EMail");
-char* _PREHASH_AggregatePermTextures = LLMessageStringTable::getInstance()->getString("AggregatePermTextures");
-char* _PREHASH_ChatChannel = LLMessageStringTable::getInstance()->getString("ChatChannel");
-char* _PREHASH_ReturnID = LLMessageStringTable::getInstance()->getString("ReturnID");
-char* _PREHASH_ObjectAttach = LLMessageStringTable::getInstance()->getString("ObjectAttach");
-char* _PREHASH_TargetPort = LLMessageStringTable::getInstance()->getString("TargetPort");
-char* _PREHASH_ObjectSpinStop = LLMessageStringTable::getInstance()->getString("ObjectSpinStop");
-char* _PREHASH_FullID = LLMessageStringTable::getInstance()->getString("FullID");
-char* _PREHASH_ActivateGroup = LLMessageStringTable::getInstance()->getString("ActivateGroup");
-char* _PREHASH_SysGPU = LLMessageStringTable::getInstance()->getString("SysGPU");
-char* _PREHASH_AvatarInterestsReply = LLMessageStringTable::getInstance()->getString("AvatarInterestsReply");
-char* _PREHASH_StartLure = LLMessageStringTable::getInstance()->getString("StartLure");
-char* _PREHASH_SysRAM = LLMessageStringTable::getInstance()->getString("SysRAM");
-char* _PREHASH_ObjectPosition = LLMessageStringTable::getInstance()->getString("ObjectPosition");
-char* _PREHASH_SitPosition = LLMessageStringTable::getInstance()->getString("SitPosition");
-char* _PREHASH_StartTime = LLMessageStringTable::getInstance()->getString("StartTime");
-char* _PREHASH_BornOn = LLMessageStringTable::getInstance()->getString("BornOn");
-char* _PREHASH_CameraCollidePlane = LLMessageStringTable::getInstance()->getString("CameraCollidePlane");
-char* _PREHASH_EconomyDataRequest = LLMessageStringTable::getInstance()->getString("EconomyDataRequest");
-char* _PREHASH_TeleportLureRequest = LLMessageStringTable::getInstance()->getString("TeleportLureRequest");
-char* _PREHASH_FolderID = LLMessageStringTable::getInstance()->getString("FolderID");
-char* _PREHASH_RegionHandleRequest = LLMessageStringTable::getInstance()->getString("RegionHandleRequest");
-char* _PREHASH_ScriptDataRequest = LLMessageStringTable::getInstance()->getString("ScriptDataRequest");
-char* _PREHASH_GroupRoleDataRequest = LLMessageStringTable::getInstance()->getString("GroupRoleDataRequest");
-char* _PREHASH_GroupTitlesRequest = LLMessageStringTable::getInstance()->getString("GroupTitlesRequest");
-char* _PREHASH_AgentWearablesRequest = LLMessageStringTable::getInstance()->getString("AgentWearablesRequest");
-char* _PREHASH_MapBlockRequest = LLMessageStringTable::getInstance()->getString("MapBlockRequest");
-char* _PREHASH_LureID = LLMessageStringTable::getInstance()->getString("LureID");
-char* _PREHASH_CopyCenters = LLMessageStringTable::getInstance()->getString("CopyCenters");
-char* _PREHASH_ParamList = LLMessageStringTable::getInstance()->getString("ParamList");
-char* _PREHASH_InventorySerial = LLMessageStringTable::getInstance()->getString("InventorySerial");
-char* _PREHASH_EdgeDataPacket = LLMessageStringTable::getInstance()->getString("EdgeDataPacket");
-char* _PREHASH_AvatarPickerReply = LLMessageStringTable::getInstance()->getString("AvatarPickerReply");
-char* _PREHASH_ParcelDwellReply = LLMessageStringTable::getInstance()->getString("ParcelDwellReply");
-char* _PREHASH_IsForSale = LLMessageStringTable::getInstance()->getString("IsForSale");
-char* _PREHASH_MuteID = LLMessageStringTable::getInstance()->getString("MuteID");
-char* _PREHASH_MeanCollisionAlert = LLMessageStringTable::getInstance()->getString("MeanCollisionAlert");
-char* _PREHASH_CanAcceptTasks = LLMessageStringTable::getInstance()->getString("CanAcceptTasks");
-char* _PREHASH_ItemData = LLMessageStringTable::getInstance()->getString("ItemData");
-char* _PREHASH_AnimationList = LLMessageStringTable::getInstance()->getString("AnimationList");
-char* _PREHASH_Reputation = LLMessageStringTable::getInstance()->getString("Reputation");
-char* _PREHASH_IntValue = LLMessageStringTable::getInstance()->getString("IntValue");
-char* _PREHASH_TargetType = LLMessageStringTable::getInstance()->getString("TargetType");
-char* _PREHASH_Amount = LLMessageStringTable::getInstance()->getString("Amount");
-char* _PREHASH_HasAttachment = LLMessageStringTable::getInstance()->getString("HasAttachment");
-char* _PREHASH_UpdateAttachment = LLMessageStringTable::getInstance()->getString("UpdateAttachment");
-char* _PREHASH_RemoveAttachment = LLMessageStringTable::getInstance()->getString("RemoveAttachment");
-char* _PREHASH_HeightWidthBlock = LLMessageStringTable::getInstance()->getString("HeightWidthBlock");
-char* _PREHASH_RequestObjectPropertiesFamily = LLMessageStringTable::getInstance()->getString("RequestObjectPropertiesFamily");
-char* _PREHASH_ObjectPropertiesFamily = LLMessageStringTable::getInstance()->getString("ObjectPropertiesFamily");
-char* _PREHASH_UserData = LLMessageStringTable::getInstance()->getString("UserData");
-char* _PREHASH_IsReadable = LLMessageStringTable::getInstance()->getString("IsReadable");
-char* _PREHASH_PathCurve = LLMessageStringTable::getInstance()->getString("PathCurve");
-char* _PREHASH_Status = LLMessageStringTable::getInstance()->getString("Status");
-char* _PREHASH_FromGroup = LLMessageStringTable::getInstance()->getString("FromGroup");
-char* _PREHASH_AlreadyVoted = LLMessageStringTable::getInstance()->getString("AlreadyVoted");
-char* _PREHASH_PlacesReply = LLMessageStringTable::getInstance()->getString("PlacesReply");
-char* _PREHASH_DirPlacesReply = LLMessageStringTable::getInstance()->getString("DirPlacesReply");
-char* _PREHASH_ParcelBuy = LLMessageStringTable::getInstance()->getString("ParcelBuy");
-char* _PREHASH_DirFindQueryBackend = LLMessageStringTable::getInstance()->getString("DirFindQueryBackend");
-char* _PREHASH_DirPlacesQueryBackend = LLMessageStringTable::getInstance()->getString("DirPlacesQueryBackend");
-char* _PREHASH_DirClassifiedQueryBackend = LLMessageStringTable::getInstance()->getString("DirClassifiedQueryBackend");
-char* _PREHASH_DirLandQueryBackend = LLMessageStringTable::getInstance()->getString("DirLandQueryBackend");
-char* _PREHASH_DirPopularQueryBackend = LLMessageStringTable::getInstance()->getString("DirPopularQueryBackend");
-char* _PREHASH_HistoryData = LLMessageStringTable::getInstance()->getString("HistoryData");
-char* _PREHASH_SnapshotID = LLMessageStringTable::getInstance()->getString("SnapshotID");
-char* _PREHASH_Aspect = LLMessageStringTable::getInstance()->getString("Aspect");
-char* _PREHASH_ParamSize = LLMessageStringTable::getInstance()->getString("ParamSize");
-char* _PREHASH_VoteCast = LLMessageStringTable::getInstance()->getString("VoteCast");
-char* _PREHASH_CastsShadows = LLMessageStringTable::getInstance()->getString("CastsShadows");
-char* _PREHASH_EveryoneMask = LLMessageStringTable::getInstance()->getString("EveryoneMask");
-char* _PREHASH_ObjectSpinUpdate = LLMessageStringTable::getInstance()->getString("ObjectSpinUpdate");
-char* _PREHASH_MaturePublish = LLMessageStringTable::getInstance()->getString("MaturePublish");
-char* _PREHASH_UseExistingAsset = LLMessageStringTable::getInstance()->getString("UseExistingAsset");
-char* _PREHASH_Powers = LLMessageStringTable::getInstance()->getString("Powers");
-char* _PREHASH_ParcelLocalID = LLMessageStringTable::getInstance()->getString("ParcelLocalID");
-char* _PREHASH_TeleportCancel = LLMessageStringTable::getInstance()->getString("TeleportCancel");
-char* _PREHASH_UnixTime = LLMessageStringTable::getInstance()->getString("UnixTime");
-char* _PREHASH_QueryFlags = LLMessageStringTable::getInstance()->getString("QueryFlags");
-char* _PREHASH_AlwaysRun = LLMessageStringTable::getInstance()->getString("AlwaysRun");
-char* _PREHASH_Bottom = LLMessageStringTable::getInstance()->getString("Bottom");
-char* _PREHASH_ButtonData = LLMessageStringTable::getInstance()->getString("ButtonData");
-char* _PREHASH_SoundData = LLMessageStringTable::getInstance()->getString("SoundData");
-char* _PREHASH_ViewerStats = LLMessageStringTable::getInstance()->getString("ViewerStats");
-char* _PREHASH_RegionHandshake = LLMessageStringTable::getInstance()->getString("RegionHandshake");
-char* _PREHASH_ObjectDescription = LLMessageStringTable::getInstance()->getString("ObjectDescription");
-char* _PREHASH_Description = LLMessageStringTable::getInstance()->getString("Description");
-char* _PREHASH_ParamType = LLMessageStringTable::getInstance()->getString("ParamType");
-char* _PREHASH_UUIDNameReply = LLMessageStringTable::getInstance()->getString("UUIDNameReply");
-char* _PREHASH_UUIDGroupNameReply = LLMessageStringTable::getInstance()->getString("UUIDGroupNameReply");
-char* _PREHASH_SaveAssetIntoInventory = LLMessageStringTable::getInstance()->getString("SaveAssetIntoInventory");
-char* _PREHASH_UserInfo = LLMessageStringTable::getInstance()->getString("UserInfo");
-char* _PREHASH_AnimSequenceID = LLMessageStringTable::getInstance()->getString("AnimSequenceID");
-char* _PREHASH_NVPairs = LLMessageStringTable::getInstance()->getString("NVPairs");
-char* _PREHASH_GroupNoticesListRequest = LLMessageStringTable::getInstance()->getString("GroupNoticesListRequest");
-char* _PREHASH_ParcelAccessListRequest = LLMessageStringTable::getInstance()->getString("ParcelAccessListRequest");
-char* _PREHASH_MuteListRequest = LLMessageStringTable::getInstance()->getString("MuteListRequest");
-char* _PREHASH_RpcChannelRequest = LLMessageStringTable::getInstance()->getString("RpcChannelRequest");
-char* _PREHASH_LandStatRequest = LLMessageStringTable::getInstance()->getString("LandStatRequest");
-char* _PREHASH_PlacesQuery = LLMessageStringTable::getInstance()->getString("PlacesQuery");
-char* _PREHASH_DirPlacesQuery = LLMessageStringTable::getInstance()->getString("DirPlacesQuery");
-char* _PREHASH_SortOrder = LLMessageStringTable::getInstance()->getString("SortOrder");
-char* _PREHASH_Hunter = LLMessageStringTable::getInstance()->getString("Hunter");
-char* _PREHASH_SunAngVelocity = LLMessageStringTable::getInstance()->getString("SunAngVelocity");
-char* _PREHASH_BinaryBucket = LLMessageStringTable::getInstance()->getString("BinaryBucket");
-char* _PREHASH_ImagePacket = LLMessageStringTable::getInstance()->getString("ImagePacket");
-char* _PREHASH_StartGroupProposal = LLMessageStringTable::getInstance()->getString("StartGroupProposal");
-char* _PREHASH_EnergyLevel = LLMessageStringTable::getInstance()->getString("EnergyLevel");
-char* _PREHASH_PriceForListing = LLMessageStringTable::getInstance()->getString("PriceForListing");
-char* _PREHASH_Scale = LLMessageStringTable::getInstance()->getString("Scale");
-char* _PREHASH_EstateCovenantReply = LLMessageStringTable::getInstance()->getString("EstateCovenantReply");
-char* _PREHASH_ParentEstateID = LLMessageStringTable::getInstance()->getString("ParentEstateID");
-char* _PREHASH_Extra2 = LLMessageStringTable::getInstance()->getString("Extra2");
-char* _PREHASH_Throttle = LLMessageStringTable::getInstance()->getString("Throttle");
-char* _PREHASH_SimIP = LLMessageStringTable::getInstance()->getString("SimIP");
-char* _PREHASH_GodID = LLMessageStringTable::getInstance()->getString("GodID");
-char* _PREHASH_TeleportMinPrice = LLMessageStringTable::getInstance()->getString("TeleportMinPrice");
-char* _PREHASH_VoteItem = LLMessageStringTable::getInstance()->getString("VoteItem");
-char* _PREHASH_ObjectRotation = LLMessageStringTable::getInstance()->getString("ObjectRotation");
-char* _PREHASH_SitRotation = LLMessageStringTable::getInstance()->getString("SitRotation");
-char* _PREHASH_SnapSelection = LLMessageStringTable::getInstance()->getString("SnapSelection");
-char* _PREHASH_SoundTrigger = LLMessageStringTable::getInstance()->getString("SoundTrigger");
-char* _PREHASH_TerrainRaiseLimit = LLMessageStringTable::getInstance()->getString("TerrainRaiseLimit");
-char* _PREHASH_Quorum = LLMessageStringTable::getInstance()->getString("Quorum");
-char* _PREHASH_AgentBlock = LLMessageStringTable::getInstance()->getString("AgentBlock");
-char* _PREHASH_CommandBlock = LLMessageStringTable::getInstance()->getString("CommandBlock");
-char* _PREHASH_PricePublicObjectDecay = LLMessageStringTable::getInstance()->getString("PricePublicObjectDecay");
-char* _PREHASH_SpawnPointPos = LLMessageStringTable::getInstance()->getString("SpawnPointPos");
-char* _PREHASH_VolumeDetail = LLMessageStringTable::getInstance()->getString("VolumeDetail");
-char* _PREHASH_FromAgentName = LLMessageStringTable::getInstance()->getString("FromAgentName");
-char* _PREHASH_Range = LLMessageStringTable::getInstance()->getString("Range");
-char* _PREHASH_DirectoryVisibility = LLMessageStringTable::getInstance()->getString("DirectoryVisibility");
-char* _PREHASH_PublicIP = LLMessageStringTable::getInstance()->getString("PublicIP");
-char* _PREHASH_TeleportFailed = LLMessageStringTable::getInstance()->getString("TeleportFailed");
-char* _PREHASH_PreloadSound = LLMessageStringTable::getInstance()->getString("PreloadSound");
-char* _PREHASH_ScreenshotID = LLMessageStringTable::getInstance()->getString("ScreenshotID");
-char* _PREHASH_CovenantTimestamp = LLMessageStringTable::getInstance()->getString("CovenantTimestamp");
-char* _PREHASH_OldestUnacked = LLMessageStringTable::getInstance()->getString("OldestUnacked");
-char* _PREHASH_SimulatorIP = LLMessageStringTable::getInstance()->getString("SimulatorIP");
-char* _PREHASH_Value = LLMessageStringTable::getInstance()->getString("Value");
-char* _PREHASH_JointAxisOrAnchor = LLMessageStringTable::getInstance()->getString("JointAxisOrAnchor");
-char* _PREHASH_Test0 = LLMessageStringTable::getInstance()->getString("Test0");
-char* _PREHASH_Test1 = LLMessageStringTable::getInstance()->getString("Test1");
-char* _PREHASH_Test2 = LLMessageStringTable::getInstance()->getString("Test2");
-char* _PREHASH_SunPhase = LLMessageStringTable::getInstance()->getString("SunPhase");
-char* _PREHASH_ParcelDivide = LLMessageStringTable::getInstance()->getString("ParcelDivide");
-char* _PREHASH_PriceObjectClaim = LLMessageStringTable::getInstance()->getString("PriceObjectClaim");
-char* _PREHASH_Field = LLMessageStringTable::getInstance()->getString("Field");
-char* _PREHASH_Ratio = LLMessageStringTable::getInstance()->getString("Ratio");
-char* _PREHASH_JoinGroupReply = LLMessageStringTable::getInstance()->getString("JoinGroupReply");
-char* _PREHASH_LiveHelpGroupReply = LLMessageStringTable::getInstance()->getString("LiveHelpGroupReply");
-char* _PREHASH_Score = LLMessageStringTable::getInstance()->getString("Score");
-char* _PREHASH_Image = LLMessageStringTable::getInstance()->getString("Image");
-char* _PREHASH_ObjectClickAction = LLMessageStringTable::getInstance()->getString("ObjectClickAction");
-char* _PREHASH_Parameter = LLMessageStringTable::getInstance()->getString("Parameter");
-char* _PREHASH_Flags = LLMessageStringTable::getInstance()->getString("Flags");
-char* _PREHASH_Plane = LLMessageStringTable::getInstance()->getString("Plane");
-char* _PREHASH_Width = LLMessageStringTable::getInstance()->getString("Width");
-char* _PREHASH_Right = LLMessageStringTable::getInstance()->getString("Right");
-char* _PREHASH_DirFindQuery = LLMessageStringTable::getInstance()->getString("DirFindQuery");
-char* _PREHASH_Textures = LLMessageStringTable::getInstance()->getString("Textures");
-char* _PREHASH_EventData = LLMessageStringTable::getInstance()->getString("EventData");
-char* _PREHASH_Final = LLMessageStringTable::getInstance()->getString("Final");
-char* _PREHASH_System = LLMessageStringTable::getInstance()->getString("System");
-char* _PREHASH_TelehubPos = LLMessageStringTable::getInstance()->getString("TelehubPos");
-char* _PREHASH_ReportAutosaveCrash = LLMessageStringTable::getInstance()->getString("ReportAutosaveCrash");
-char* _PREHASH_CreateTrustedCircuit = LLMessageStringTable::getInstance()->getString("CreateTrustedCircuit");
-char* _PREHASH_DenyTrustedCircuit = LLMessageStringTable::getInstance()->getString("DenyTrustedCircuit");
-char* _PREHASH_RequestTrustedCircuit = LLMessageStringTable::getInstance()->getString("RequestTrustedCircuit");
-char* _PREHASH_Codec = LLMessageStringTable::getInstance()->getString("Codec");
-char* _PREHASH_Modal = LLMessageStringTable::getInstance()->getString("Modal");
-char* _PREHASH_ChildAgentUnknown = LLMessageStringTable::getInstance()->getString("ChildAgentUnknown");
-char* _PREHASH_LandingType = LLMessageStringTable::getInstance()->getString("LandingType");
-char* _PREHASH_ScriptRunningReply = LLMessageStringTable::getInstance()->getString("ScriptRunningReply");
-char* _PREHASH_Reply = LLMessageStringTable::getInstance()->getString("Reply");
-char* _PREHASH_GroupAccountDetailsReply = LLMessageStringTable::getInstance()->getString("GroupAccountDetailsReply");
-char* _PREHASH_TelehubRot = LLMessageStringTable::getInstance()->getString("TelehubRot");
-char* _PREHASH_AcceptFriendship = LLMessageStringTable::getInstance()->getString("AcceptFriendship");
-char* _PREHASH_ItemType = LLMessageStringTable::getInstance()->getString("ItemType");
-char* _PREHASH_DwellInfo = LLMessageStringTable::getInstance()->getString("DwellInfo");
-char* _PREHASH_AgentResume = LLMessageStringTable::getInstance()->getString("AgentResume");
-char* _PREHASH_MailFilter = LLMessageStringTable::getInstance()->getString("MailFilter");
-char* _PREHASH_Disconnect = LLMessageStringTable::getInstance()->getString("Disconnect");
-char* _PREHASH_SimPosition = LLMessageStringTable::getInstance()->getString("SimPosition");
-char* _PREHASH_SimWideTotalPrims = LLMessageStringTable::getInstance()->getString("SimWideTotalPrims");
-char* _PREHASH_Index = LLMessageStringTable::getInstance()->getString("Index");
-char* _PREHASH_SimFilename = LLMessageStringTable::getInstance()->getString("SimFilename");
-char* _PREHASH_LastOwnerID = LLMessageStringTable::getInstance()->getString("LastOwnerID");
-char* _PREHASH_GroupNoticeRequest = LLMessageStringTable::getInstance()->getString("GroupNoticeRequest");
-char* _PREHASH_EmailMessageRequest = LLMessageStringTable::getInstance()->getString("EmailMessageRequest");
-char* _PREHASH_MapItemRequest = LLMessageStringTable::getInstance()->getString("MapItemRequest");
-char* _PREHASH_AgentCount = LLMessageStringTable::getInstance()->getString("AgentCount");
-char* _PREHASH_MessageBlock = LLMessageStringTable::getInstance()->getString("MessageBlock");
-char* _PREHASH_FuseBlock = LLMessageStringTable::getInstance()->getString("FuseBlock");
-char* _PREHASH_AgentGroupData = LLMessageStringTable::getInstance()->getString("AgentGroupData");
-char* _PREHASH_ClassifiedInfoUpdate = LLMessageStringTable::getInstance()->getString("ClassifiedInfoUpdate");
-char* _PREHASH_RegionPos = LLMessageStringTable::getInstance()->getString("RegionPos");
-char* _PREHASH_ParcelMediaUpdate = LLMessageStringTable::getInstance()->getString("ParcelMediaUpdate");
-char* _PREHASH_NoticeID = LLMessageStringTable::getInstance()->getString("NoticeID");
-char* _PREHASH_GridX = LLMessageStringTable::getInstance()->getString("GridX");
-char* _PREHASH_GridY = LLMessageStringTable::getInstance()->getString("GridY");
-char* _PREHASH_Title = LLMessageStringTable::getInstance()->getString("Title");
-char* _PREHASH_AuctionID = LLMessageStringTable::getInstance()->getString("AuctionID");
-char* _PREHASH_VoteType = LLMessageStringTable::getInstance()->getString("VoteType");
-char* _PREHASH_CategoryID = LLMessageStringTable::getInstance()->getString("CategoryID");
-char* _PREHASH_Token = LLMessageStringTable::getInstance()->getString("Token");
-char* _PREHASH_AggregatePerms = LLMessageStringTable::getInstance()->getString("AggregatePerms");
-char* _PREHASH_ObjectSelect = LLMessageStringTable::getInstance()->getString("ObjectSelect");
-char* _PREHASH_ForceObjectSelect = LLMessageStringTable::getInstance()->getString("ForceObjectSelect");
-char* _PREHASH_Price = LLMessageStringTable::getInstance()->getString("Price");
-char* _PREHASH_SunDirection = LLMessageStringTable::getInstance()->getString("SunDirection");
-char* _PREHASH_FromName = LLMessageStringTable::getInstance()->getString("FromName");
-char* _PREHASH_ChangeInventoryItemFlags = LLMessageStringTable::getInstance()->getString("ChangLLInventoryItemFlags");
-char* _PREHASH_Force = LLMessageStringTable::getInstance()->getString("Force");
-char* _PREHASH_TransactionBlock = LLMessageStringTable::getInstance()->getString("TransactionBlock");
-char* _PREHASH_PowersMask = LLMessageStringTable::getInstance()->getString("PowersMask");
-char* _PREHASH_Stamp = LLMessageStringTable::getInstance()->getString("Stamp");
-char* _PREHASH_TotalCredits = LLMessageStringTable::getInstance()->getString("TotalCredits");
-char* _PREHASH_State = LLMessageStringTable::getInstance()->getString("State");
-char* _PREHASH_TextureIndex = LLMessageStringTable::getInstance()->getString("TextureIndex");
-char* _PREHASH_InviteeID = LLMessageStringTable::getInstance()->getString("InviteeID");
-char* _PREHASH_ParcelReclaim = LLMessageStringTable::getInstance()->getString("ParcelReclaim");
-char* _PREHASH_Money = LLMessageStringTable::getInstance()->getString("Money");
-char* _PREHASH_PathTwist = LLMessageStringTable::getInstance()->getString("PathTwist");
-char* _PREHASH_AuthBuyerID = LLMessageStringTable::getInstance()->getString("AuthBuyerID");
-char* _PREHASH_Color = LLMessageStringTable::getInstance()->getString("Color");
-char* _PREHASH_SourceType = LLMessageStringTable::getInstance()->getString("SourceType");
-char* _PREHASH_World = LLMessageStringTable::getInstance()->getString("World");
-char* _PREHASH_QueryData = LLMessageStringTable::getInstance()->getString("QueryData");
-char* _PREHASH_Users = LLMessageStringTable::getInstance()->getString("Users");
-char* _PREHASH_SysOS = LLMessageStringTable::getInstance()->getString("SysOS");
-char* _PREHASH_Notes = LLMessageStringTable::getInstance()->getString("Notes");
-char* _PREHASH_AvatarID = LLMessageStringTable::getInstance()->getString("AvatarID");
-char* _PREHASH_FounderID = LLMessageStringTable::getInstance()->getString("FounderID");
-char* _PREHASH_EndPointID = LLMessageStringTable::getInstance()->getString("EndPointID");
-char* _PREHASH_LocationLookAt = LLMessageStringTable::getInstance()->getString("LocationLookAt");
-char* _PREHASH_Sound = LLMessageStringTable::getInstance()->getString("Sound");
-char* _PREHASH_Cover = LLMessageStringTable::getInstance()->getString("Cover");
-char* _PREHASH_TotalObjectCount = LLMessageStringTable::getInstance()->getString("TotalObjectCount");
-char* _PREHASH_TextureEntry = LLMessageStringTable::getInstance()->getString("TextureEntry");
-char* _PREHASH_SquareMetersCommitted = LLMessageStringTable::getInstance()->getString("SquareMetersCommitted");
-char* _PREHASH_ChannelID = LLMessageStringTable::getInstance()->getString("ChannelID");
-char* _PREHASH_Dwell = LLMessageStringTable::getInstance()->getString("Dwell");
-char* _PREHASH_North = LLMessageStringTable::getInstance()->getString("North");
-char* _PREHASH_AgentUpdate = LLMessageStringTable::getInstance()->getString("AgentUpdate");
-char* _PREHASH_PickGodDelete = LLMessageStringTable::getInstance()->getString("PickGodDelete");
-char* _PREHASH_HostName = LLMessageStringTable::getInstance()->getString("HostName");
-char* _PREHASH_PriceParcelClaim = LLMessageStringTable::getInstance()->getString("PriceParcelClaim");
-char* _PREHASH_ParcelClaim = LLMessageStringTable::getInstance()->getString("ParcelClaim");
-char* _PREHASH_AgentPowers = LLMessageStringTable::getInstance()->getString("AgentPowers");
-char* _PREHASH_ProfileHollow = LLMessageStringTable::getInstance()->getString("ProfileHollow");
-char* _PREHASH_GroupRoleChanges = LLMessageStringTable::getInstance()->getString("GroupRoleChanges");
-char* _PREHASH_Count = LLMessageStringTable::getInstance()->getString("Count");
-char* _PREHASH_South = LLMessageStringTable::getInstance()->getString("South");
-char* _PREHASH_ObjectUpdateCompressed = LLMessageStringTable::getInstance()->getString("ObjectUpdateCompressed");
-char* _PREHASH_MuteFlags = LLMessageStringTable::getInstance()->getString("MuteFlags");
-char* _PREHASH_Group = LLMessageStringTable::getInstance()->getString("Group");
-char* _PREHASH_AgentPause = LLMessageStringTable::getInstance()->getString("AgentPause");
-char* _PREHASH_LanguagesText = LLMessageStringTable::getInstance()->getString("LanguagesText");
-char* _PREHASH_Error = LLMessageStringTable::getInstance()->getString("Error");
-char* _PREHASH_InternalScriptMail = LLMessageStringTable::getInstance()->getString("InternalScriptMail");
-char* _PREHASH_FindAgent = LLMessageStringTable::getInstance()->getString("FindAgent");
-char* _PREHASH_AgentData = LLMessageStringTable::getInstance()->getString("AgentData");
-char* _PREHASH_FolderData = LLMessageStringTable::getInstance()->getString("FolderData");
-char* _PREHASH_AssetBlock = LLMessageStringTable::getInstance()->getString("AssetBlock");
-char* _PREHASH_AcceptNotices = LLMessageStringTable::getInstance()->getString("AcceptNotices");
-char* _PREHASH_SetGroupAcceptNotices = LLMessageStringTable::getInstance()->getString("SetGroupAcceptNotices");
-char* _PREHASH_CloseCircuit = LLMessageStringTable::getInstance()->getString("CloseCircuit");
-char* _PREHASH_TeleportFinish = LLMessageStringTable::getInstance()->getString("TeleportFinish");
-char* _PREHASH_PathRevolutions = LLMessageStringTable::getInstance()->getString("PathRevolutions");
-char* _PREHASH_ClassifiedInfoReply = LLMessageStringTable::getInstance()->getString("ClassifiedInfoReply");
-char* _PREHASH_ParcelInfoReply = LLMessageStringTable::getInstance()->getString("ParcelInfoReply");
-char* _PREHASH_AutosaveData = LLMessageStringTable::getInstance()->getString("AutosaveData");
-char* _PREHASH_SetStartLocation = LLMessageStringTable::getInstance()->getString("SetStartLocation");
-char* _PREHASH_PassHours = LLMessageStringTable::getInstance()->getString("PassHours");
-char* _PREHASH_AttachmentPt = LLMessageStringTable::getInstance()->getString("AttachmentPt");
-char* _PREHASH_ParcelFlags = LLMessageStringTable::getInstance()->getString("ParcelFlags");
-char* _PREHASH_NumVotes = LLMessageStringTable::getInstance()->getString("NumVotes");
-char* _PREHASH_AvatarPickerRequest = LLMessageStringTable::getInstance()->getString("AvatarPickerRequest");
-char* _PREHASH_TeleportLocationRequest = LLMessageStringTable::getInstance()->getString("TeleportLocationRequest");
-char* _PREHASH_DataHomeLocationRequest = LLMessageStringTable::getInstance()->getString("DataHomeLocationRequest");
-char* _PREHASH_EventNotificationAddRequest = LLMessageStringTable::getInstance()->getString("EventNotificationAddRequest");
-char* _PREHASH_ParcelDwellRequest = LLMessageStringTable::getInstance()->getString("ParcelDwellRequest");
-char* _PREHASH_EventLocationRequest = LLMessageStringTable::getInstance()->getString("EventLocationRequest");
-char* _PREHASH_SetStartLocationRequest = LLMessageStringTable::getInstance()->getString("SetStartLocationRequest");
-char* _PREHASH_QueryStart = LLMessageStringTable::getInstance()->getString("QueryStart");
-char* _PREHASH_EjectData = LLMessageStringTable::getInstance()->getString("EjectData");
-char* _PREHASH_AvatarTextureUpdate = LLMessageStringTable::getInstance()->getString("AvatarTextureUpdate");
-char* _PREHASH_RPCServerPort = LLMessageStringTable::getInstance()->getString("RPCServerPort");
-char* _PREHASH_Bytes = LLMessageStringTable::getInstance()->getString("Bytes");
-char* _PREHASH_Extra = LLMessageStringTable::getInstance()->getString("Extra");
-char* _PREHASH_ForceScriptControlRelease = LLMessageStringTable::getInstance()->getString("ForceScriptControlRelease");
-char* _PREHASH_ParcelRelease = LLMessageStringTable::getInstance()->getString("ParcelRelease");
-char* _PREHASH_VFileType = LLMessageStringTable::getInstance()->getString("VFileType");
-char* _PREHASH_EjectGroupMemberReply = LLMessageStringTable::getInstance()->getString("EjectGroupMemberReply");
-char* _PREHASH_ImageData = LLMessageStringTable::getInstance()->getString("ImageData");
-char* _PREHASH_SimulatorViewerTimeMessage = LLMessageStringTable::getInstance()->getString("SimulatorViewerTimeMessage");
-char* _PREHASH_Rotation = LLMessageStringTable::getInstance()->getString("Rotation");
-char* _PREHASH_Selection = LLMessageStringTable::getInstance()->getString("Selection");
-char* _PREHASH_TransactionData = LLMessageStringTable::getInstance()->getString("TransactionData");
-char* _PREHASH_OperationData = LLMessageStringTable::getInstance()->getString("OperationData");
-char* _PREHASH_ExpirationDate = LLMessageStringTable::getInstance()->getString("ExpirationDate");
-char* _PREHASH_ParcelDeedToGroup = LLMessageStringTable::getInstance()->getString("ParcelDeedToGroup");
-char* _PREHASH_AvatarPicksReply = LLMessageStringTable::getInstance()->getString("AvatarPicksReply");
-char* _PREHASH_GroupTitlesReply = LLMessageStringTable::getInstance()->getString("GroupTitlesReply");
-char* _PREHASH_AgentInfo = LLMessageStringTable::getInstance()->getString("AgentInfo");
-char* _PREHASH_MoneyTransferBackend = LLMessageStringTable::getInstance()->getString("MoneyTransferBackend");
-char* _PREHASH_NextOwnerMask = LLMessageStringTable::getInstance()->getString("NextOwnerMask");
-char* _PREHASH_MuteData = LLMessageStringTable::getInstance()->getString("MuteData");
-char* _PREHASH_PassPrice = LLMessageStringTable::getInstance()->getString("PassPrice");
-char* _PREHASH_SourceID = LLMessageStringTable::getInstance()->getString("SourceID");
-char* _PREHASH_ChangeUserRights = LLMessageStringTable::getInstance()->getString("ChangeUserRights");
-char* _PREHASH_TeleportFlags = LLMessageStringTable::getInstance()->getString("TeleportFlags");
-char* _PREHASH_SlaveParcelData = LLMessageStringTable::getInstance()->getString("SlaveParcelData");
-char* _PREHASH_AssetData = LLMessageStringTable::getInstance()->getString("AssetData");
-char* _PREHASH_MultipleObjectUpdate = LLMessageStringTable::getInstance()->getString("MultipleObjectUpdate");
-char* _PREHASH_ObjectUpdate = LLMessageStringTable::getInstance()->getString("ObjectUpdate");
-char* _PREHASH_ImprovedTerseObjectUpdate = LLMessageStringTable::getInstance()->getString("ImprovedTerseObjectUpdate");
-char* _PREHASH_ConfirmXferPacket = LLMessageStringTable::getInstance()->getString("ConfirmXferPacket");
-char* _PREHASH_StartPingCheck = LLMessageStringTable::getInstance()->getString("StartPingCheck");
-char* _PREHASH_SimWideDeletes = LLMessageStringTable::getInstance()->getString("SimWideDeletes");
-char* _PREHASH_LandStatReply = LLMessageStringTable::getInstance()->getString("LandStatReply");
-char* _PREHASH_IsPhantom = LLMessageStringTable::getInstance()->getString("IsPhantom");
-char* _PREHASH_AgentList = LLMessageStringTable::getInstance()->getString("AgentList");
-char* _PREHASH_SimApproved = LLMessageStringTable::getInstance()->getString("SimApproved");
-char* _PREHASH_RezObject = LLMessageStringTable::getInstance()->getString("RezObject");
-char* _PREHASH_TaskLocalID = LLMessageStringTable::getInstance()->getString("TaskLocalID");
-char* _PREHASH_ClaimDate = LLMessageStringTable::getInstance()->getString("ClaimDate");
-char* _PREHASH_MergeParcel = LLMessageStringTable::getInstance()->getString("MergeParcel");
-char* _PREHASH_Priority = LLMessageStringTable::getInstance()->getString("Priority");
-char* _PREHASH_QueryText = LLMessageStringTable::getInstance()->getString("QueryText");
-char* _PREHASH_GroupNoticeAdd = LLMessageStringTable::getInstance()->getString("GroupNoticeAdd");
-char* _PREHASH_ReturnType = LLMessageStringTable::getInstance()->getString("ReturnType");
-char* _PREHASH_FetchFolders = LLMessageStringTable::getInstance()->getString("FetchFolders");
-char* _PREHASH_SimulatorPublicHostBlock = LLMessageStringTable::getInstance()->getString("SimulatorPublicHostBlock");
-char* _PREHASH_HeaderData = LLMessageStringTable::getInstance()->getString("HeaderData");
-char* _PREHASH_RequestMultipleObjects = LLMessageStringTable::getInstance()->getString("RequestMultipleObjects");
-char* _PREHASH_RetrieveInstantMessages = LLMessageStringTable::getInstance()->getString("RetrieveInstantMessages");
-char* _PREHASH_OpenCircuit = LLMessageStringTable::getInstance()->getString("OpenCircuit");
-char* _PREHASH_CrossedRegion = LLMessageStringTable::getInstance()->getString("CrossedRegion");
-char* _PREHASH_DirGroupsReply = LLMessageStringTable::getInstance()->getString("DirGroupsReply");
-char* _PREHASH_AvatarGroupsReply = LLMessageStringTable::getInstance()->getString("AvatarGroupsReply");
-char* _PREHASH_EmailMessageReply = LLMessageStringTable::getInstance()->getString("EmailMessageReply");
-char* _PREHASH_GroupVoteHistoryItemReply = LLMessageStringTable::getInstance()->getString("GroupVoteHistoryItemReply");
-char* _PREHASH_ViewerPosition = LLMessageStringTable::getInstance()->getString("ViewerPosition");
-char* _PREHASH_Position = LLMessageStringTable::getInstance()->getString("Position");
-char* _PREHASH_ParentEstate = LLMessageStringTable::getInstance()->getString("ParentEstate");
-char* _PREHASH_EstateName = LLMessageStringTable::getInstance()->getString("EstateName");
-char* _PREHASH_MuteName = LLMessageStringTable::getInstance()->getString("MuteName");
-char* _PREHASH_ParcelRename = LLMessageStringTable::getInstance()->getString("ParcelRename");
-char* _PREHASH_ViewerFilename = LLMessageStringTable::getInstance()->getString("ViewerFilename");
-char* _PREHASH_UserReportInternal = LLMessageStringTable::getInstance()->getString("UserReportInternal");
-char* _PREHASH_AvatarPropertiesRequest = LLMessageStringTable::getInstance()->getString("AvatarPropertiesRequest");
-char* _PREHASH_ParcelPropertiesRequest = LLMessageStringTable::getInstance()->getString("ParcelPropertiesRequest");
-char* _PREHASH_GroupProfileRequest = LLMessageStringTable::getInstance()->getString("GroupProfileRequest");
-char* _PREHASH_AgentDataUpdateRequest = LLMessageStringTable::getInstance()->getString("AgentDataUpdateRequest");
-char* _PREHASH_PriceObjectScaleFactor = LLMessageStringTable::getInstance()->getString("PriceObjectScaleFactor");
-char* _PREHASH_OpenEnrollment = LLMessageStringTable::getInstance()->getString("OpenEnrollment");
-char* _PREHASH_GroupData = LLMessageStringTable::getInstance()->getString("GroupData");
-char* _PREHASH_RequestGodlikePowers = LLMessageStringTable::getInstance()->getString("RequestGodlikePowers");
-char* _PREHASH_GrantGodlikePowers = LLMessageStringTable::getInstance()->getString("GrantGodlikePowers");
-char* _PREHASH_TransactionID = LLMessageStringTable::getInstance()->getString("TransactionID");
-char* _PREHASH_DestinationID = LLMessageStringTable::getInstance()->getString("DestinationID");
-char* _PREHASH_Controls = LLMessageStringTable::getInstance()->getString("Controls");
-char* _PREHASH_FirstDetachAll = LLMessageStringTable::getInstance()->getString("FirstDetachAll");
-char* _PREHASH_EstateID = LLMessageStringTable::getInstance()->getString("EstateID");
-char* _PREHASH_ImprovedInstantMessage = LLMessageStringTable::getInstance()->getString("ImprovedInstantMessage");
-char* _PREHASH_CheckParcelSales = LLMessageStringTable::getInstance()->getString("CheckParcelSales");
-char* _PREHASH_ParcelSales = LLMessageStringTable::getInstance()->getString("ParcelSales");
-char* _PREHASH_CurrentInterval = LLMessageStringTable::getInstance()->getString("CurrentInterval");
-char* _PREHASH_PriceRentLight = LLMessageStringTable::getInstance()->getString("PriceRentLight");
-char* _PREHASH_MediaAutoScale = LLMessageStringTable::getInstance()->getString("MediaAutoScale");
-char* _PREHASH_NeighborBlock = LLMessageStringTable::getInstance()->getString("NeighborBlock");
-char* _PREHASH_LayerData = LLMessageStringTable::getInstance()->getString("LayerData");
-char* _PREHASH_NVPairData = LLMessageStringTable::getInstance()->getString("NVPairData");
-char* _PREHASH_TeleportLocal = LLMessageStringTable::getInstance()->getString("TeleportLocal");
-char* _PREHASH_EjecteeID = LLMessageStringTable::getInstance()->getString("EjecteeID");
-char* _PREHASH_VoteInitiator = LLMessageStringTable::getInstance()->getString("VoteInitiator");
-char* _PREHASH_TypeData = LLMessageStringTable::getInstance()->getString("TypeData");
-char* _PREHASH_OwnerIDs = LLMessageStringTable::getInstance()->getString("OwnerIDs");
-char* _PREHASH_SystemKickUser = LLMessageStringTable::getInstance()->getString("SystemKickUser");
-char* _PREHASH_TransactionTime = LLMessageStringTable::getInstance()->getString("TransactionTime");
-char* _PREHASH_TimeToLive = LLMessageStringTable::getInstance()->getString("TimeToLive");
-char* _PREHASH_OldAgentID = LLMessageStringTable::getInstance()->getString("OldAgentID");
-char* _PREHASH_MusicURL = LLMessageStringTable::getInstance()->getString("MusicURL");
-char* _PREHASH_ParcelPrimBonus = LLMessageStringTable::getInstance()->getString("ParcelPrimBonus");
-char* _PREHASH_EjectUser = LLMessageStringTable::getInstance()->getString("EjectUser");
-char* _PREHASH_CoarseLocationUpdate = LLMessageStringTable::getInstance()->getString("CoarseLocationUpdate");
-char* _PREHASH_ChildAgentPositionUpdate = LLMessageStringTable::getInstance()->getString("ChildAgentPositionUpdate");
-char* _PREHASH_StoreLocal = LLMessageStringTable::getInstance()->getString("StoreLocal");
-char* _PREHASH_GroupName = LLMessageStringTable::getInstance()->getString("GroupName");
-char* _PREHASH_PriceParcelRent = LLMessageStringTable::getInstance()->getString("PriceParcelRent");
-char* _PREHASH_SimStatus = LLMessageStringTable::getInstance()->getString("SimStatus");
-char* _PREHASH_TransactionSuccess = LLMessageStringTable::getInstance()->getString("TransactionSuccess");
-char* _PREHASH_LureType = LLMessageStringTable::getInstance()->getString("LureType");
-char* _PREHASH_GroupMask = LLMessageStringTable::getInstance()->getString("GroupMask");
-char* _PREHASH_SitObject = LLMessageStringTable::getInstance()->getString("SitObject");
-char* _PREHASH_Override = LLMessageStringTable::getInstance()->getString("Override");
-char* _PREHASH_LocomotionState = LLMessageStringTable::getInstance()->getString("LocomotionState");
-char* _PREHASH_PriceUpload = LLMessageStringTable::getInstance()->getString("PriceUpload");
-char* _PREHASH_RemoveParcel = LLMessageStringTable::getInstance()->getString("RemoveParcel");
-char* _PREHASH_ConfirmAuctionStart = LLMessageStringTable::getInstance()->getString("ConfirmAuctionStart");
-char* _PREHASH_RpcScriptRequestInbound = LLMessageStringTable::getInstance()->getString("RpcScriptRequestInbound");
-char* _PREHASH_ActiveGroupID = LLMessageStringTable::getInstance()->getString("ActiveGroupID");
-char* _PREHASH_ParcelReturnObjects = LLMessageStringTable::getInstance()->getString("ParcelReturnObjects");
-char* _PREHASH_TotalObjects = LLMessageStringTable::getInstance()->getString("TotalObjects");
-char* _PREHASH_ObjectExtraParams = LLMessageStringTable::getInstance()->getString("ObjectExtraParams");
-char* _PREHASH_Questions = LLMessageStringTable::getInstance()->getString("Questions");
-char* _PREHASH_TransferAbort = LLMessageStringTable::getInstance()->getString("TransferAbort");
-char* _PREHASH_TransferInventory = LLMessageStringTable::getInstance()->getString("TransferInventory");
-char* _PREHASH_RayTargetID = LLMessageStringTable::getInstance()->getString("RayTargetID");
-char* _PREHASH_ClaimPrice = LLMessageStringTable::getInstance()->getString("ClaimPrice");
-char* _PREHASH_ObjectProperties = LLMessageStringTable::getInstance()->getString("ObjectProperties");
-char* _PREHASH_ParcelProperties = LLMessageStringTable::getInstance()->getString("ParcelProperties");
-char* _PREHASH_EstateOwnerID = LLMessageStringTable::getInstance()->getString("EstateOwnerID");
-char* _PREHASH_LogoutRequest = LLMessageStringTable::getInstance()->getString("LogoutRequest");
-char* _PREHASH_AssetUploadRequest = LLMessageStringTable::getInstance()->getString("AssetUploadRequest");
-char* _PREHASH_TransactionType = LLMessageStringTable::getInstance()->getString("TransactionType");
-char* _PREHASH_AvatarPropertiesUpdate = LLMessageStringTable::getInstance()->getString("AvatarPropertiesUpdate");
-char* _PREHASH_ParcelPropertiesUpdate = LLMessageStringTable::getInstance()->getString("ParcelPropertiesUpdate");
-char* _PREHASH_FetchItems = LLMessageStringTable::getInstance()->getString("FetchItems");
-char* _PREHASH_AbortXfer = LLMessageStringTable::getInstance()->getString("AbortXfer");
-char* _PREHASH_DeRezAck = LLMessageStringTable::getInstance()->getString("DeRezAck");
-char* _PREHASH_TakeControls = LLMessageStringTable::getInstance()->getString("TakeControls");
-char* _PREHASH_DirLandReply = LLMessageStringTable::getInstance()->getString("DirLandReply");
-char* _PREHASH_MuteType = LLMessageStringTable::getInstance()->getString("MuteType");
-char* _PREHASH_IMViaEMail = LLMessageStringTable::getInstance()->getString("IMViaEMail");
-char* _PREHASH_RentPrice = LLMessageStringTable::getInstance()->getString("RentPrice");
-char* _PREHASH_GenericMessage = LLMessageStringTable::getInstance()->getString("GenericMessage");
-char* _PREHASH_ChildAgentAlive = LLMessageStringTable::getInstance()->getString("ChildAgentAlive");
-char* _PREHASH_AssetType = LLMessageStringTable::getInstance()->getString("AssetType");
-char* _PREHASH_SpawnPointBlock = LLMessageStringTable::getInstance()->getString("SpawnPointBlock");
-char* _PREHASH_AttachmentBlock = LLMessageStringTable::getInstance()->getString("AttachmentBlock");
-char* _PREHASH_ObjectMaterial = LLMessageStringTable::getInstance()->getString("ObjectMaterial");
-char* _PREHASH_OwnerName = LLMessageStringTable::getInstance()->getString("OwnerName");
-char* _PREHASH_AvatarNotesReply = LLMessageStringTable::getInstance()->getString("AvatarNotesReply");
-char* _PREHASH_CacheID = LLMessageStringTable::getInstance()->getString("CacheID");
-char* _PREHASH_OwnerMask = LLMessageStringTable::getInstance()->getString("OwnerMask");
-char* _PREHASH_TransferInventoryAck = LLMessageStringTable::getInstance()->getString("TransferInventoryAck");
-char* _PREHASH_RegionDenyAgeUnverified = LLMessageStringTable::getInstance()->getString("RegionDenyAgeUnverified");
-char* _PREHASH_AgeVerificationBlock = LLMessageStringTable::getInstance()->getString("AgeVerificationBlock");
-char* _PREHASH_UCoord = LLMessageStringTable::getInstance()->getString("UCoord");
-char* _PREHASH_VCoord = LLMessageStringTable::getInstance()->getString("VCoord");
-char* _PREHASH_FaceIndex = LLMessageStringTable::getInstance()->getString("FaceIndex");
-char* _PREHASH_StatusData = LLMessageStringTable::getInstance()->getString("StatusData");
-char* _PREHASH_ProductSKU = LLMessageStringTable::getInstance()->getString("ProductSKU");
+char const* const _PREHASH_X = LLMessageStringTable::getInstance()->getString("X");
+char const* const _PREHASH_Y = LLMessageStringTable::getInstance()->getString("Y");
+char const* const _PREHASH_Z = LLMessageStringTable::getInstance()->getString("Z");
+char const* const _PREHASH_AddFlags = LLMessageStringTable::getInstance()->getString("AddFlags");
+char const* const _PREHASH_FailureInfo = LLMessageStringTable::getInstance()->getString("FailureInfo");
+char const* const _PREHASH_MapData = LLMessageStringTable::getInstance()->getString("MapData");
+char const* const _PREHASH_AddItem = LLMessageStringTable::getInstance()->getString("AddItem");
+char const* const _PREHASH_MeanCollision = LLMessageStringTable::getInstance()->getString("MeanCollision");
+char const* const _PREHASH_RezScript = LLMessageStringTable::getInstance()->getString("RezScript");
+char const* const _PREHASH_AvatarSitResponse = LLMessageStringTable::getInstance()->getString("AvatarSitResponse");
+char const* const _PREHASH_InventoryAssetResponse = LLMessageStringTable::getInstance()->getString("InventoryAssetResponse");
+char const* const _PREHASH_KillObject = LLMessageStringTable::getInstance()->getString("KillObject");
+char const* const _PREHASH_ProposalID = LLMessageStringTable::getInstance()->getString("ProposalID");
+char const* const _PREHASH_SerialNum = LLMessageStringTable::getInstance()->getString("SerialNum");
+char const* const _PREHASH_Duration = LLMessageStringTable::getInstance()->getString("Duration");
+char const* const _PREHASH_ScriptQuestion = LLMessageStringTable::getInstance()->getString("ScriptQuestion");
+char const* const _PREHASH_AddCircuitCode = LLMessageStringTable::getInstance()->getString("AddCircuitCode");
+char const* const _PREHASH_UseCircuitCode = LLMessageStringTable::getInstance()->getString("UseCircuitCode");
+char const* const _PREHASH_ViewerCircuitCode = LLMessageStringTable::getInstance()->getString("ViewerCircuitCode");
+char const* const _PREHASH_ScriptAnswerYes = LLMessageStringTable::getInstance()->getString("ScriptAnswerYes");
+char const* const _PREHASH_PartnerID = LLMessageStringTable::getInstance()->getString("PartnerID");
+char const* const _PREHASH_DirLandQuery = LLMessageStringTable::getInstance()->getString("DirLandQuery");
+char const* const _PREHASH_TeleportStart = LLMessageStringTable::getInstance()->getString("TeleportStart");
+char const* const _PREHASH_AboutText = LLMessageStringTable::getInstance()->getString("AboutText");
+char const* const _PREHASH_VisualParam = LLMessageStringTable::getInstance()->getString("VisualParam");
+char const* const _PREHASH_GroupPrims = LLMessageStringTable::getInstance()->getString("GroupPrims");
+char const* const _PREHASH_SelectedPrims = LLMessageStringTable::getInstance()->getString("SelectedPrims");
+char const* const _PREHASH_ID = LLMessageStringTable::getInstance()->getString("ID");
+char const* const _PREHASH_UUIDNameRequest = LLMessageStringTable::getInstance()->getString("UUIDNameRequest");
+char const* const _PREHASH_UUIDGroupNameRequest = LLMessageStringTable::getInstance()->getString("UUIDGroupNameRequest");
+char const* const _PREHASH_GroupAccountTransactionsRequest = LLMessageStringTable::getInstance()->getString("GroupAccountTransactionsRequest");
+char const* const _PREHASH_MapNameRequest = LLMessageStringTable::getInstance()->getString("MapNameRequest");
+char const* const _PREHASH_UpdateSimulator = LLMessageStringTable::getInstance()->getString("UpdateSimulator");
+char const* const _PREHASH_BillableFactor = LLMessageStringTable::getInstance()->getString("BillableFactor");
+char const* const _PREHASH_ObjectBonusFactor = LLMessageStringTable::getInstance()->getString("ObjectBonusFactor");
+char const* const _PREHASH_EnableSimulator = LLMessageStringTable::getInstance()->getString("EnableSimulator");
+char const* const _PREHASH_DisableSimulator = LLMessageStringTable::getInstance()->getString("DisableSimulator");
+char const* const _PREHASH_ConfirmEnableSimulator = LLMessageStringTable::getInstance()->getString("ConfirmEnableSimulator");
+char const* const _PREHASH_LayerType = LLMessageStringTable::getInstance()->getString("LayerType");
+char const* const _PREHASH_OwnerRole = LLMessageStringTable::getInstance()->getString("OwnerRole");
+char const* const _PREHASH_ParcelOverlay = LLMessageStringTable::getInstance()->getString("ParcelOverlay");
+char const* const _PREHASH_GroupOwned = LLMessageStringTable::getInstance()->getString("GroupOwned");
+char const* const _PREHASH_IP = LLMessageStringTable::getInstance()->getString("IP");
+char const* const _PREHASH_ChatFromViewer = LLMessageStringTable::getInstance()->getString("ChatFromViewer");
+char const* const _PREHASH_AvgAgentsInView = LLMessageStringTable::getInstance()->getString("AvgAgentsInView");
+char const* const _PREHASH_AgentsInView = LLMessageStringTable::getInstance()->getString("AgentsInView");
+char const* const _PREHASH_GroupTitle = LLMessageStringTable::getInstance()->getString("GroupTitle");
+char const* const _PREHASH_MapLayerReply = LLMessageStringTable::getInstance()->getString("MapLayerReply");
+char const* const _PREHASH_CompoundMsgID = LLMessageStringTable::getInstance()->getString("CompoundMsgID");
+char const* const _PREHASH_CameraConstraint = LLMessageStringTable::getInstance()->getString("CameraConstraint");
+char const* const _PREHASH_DownloadTotals = LLMessageStringTable::getInstance()->getString("DownloadTotals");
+char const* const _PREHASH_GenCounter = LLMessageStringTable::getInstance()->getString("GenCounter");
+char const* const _PREHASH_FrozenData = LLMessageStringTable::getInstance()->getString("FrozenData");
+char const* const _PREHASH_ChildAgentDying = LLMessageStringTable::getInstance()->getString("ChildAgentDying");
+char const* const _PREHASH_To = LLMessageStringTable::getInstance()->getString("To");
+char const* const _PREHASH_CopyInventoryFromNotecard = LLMessageStringTable::getInstance()->getString("CopyInventoryFromNotecard");
+char const* const _PREHASH_RezObjectFromNotecard = LLMessageStringTable::getInstance()->getString("RezObjectFromNotecard");
+char const* const _PREHASH_ParcelDirFeeCurrent = LLMessageStringTable::getInstance()->getString("ParcelDirFeeCurrent");
+char const* const _PREHASH_SeedCapability = LLMessageStringTable::getInstance()->getString("SeedCapability");
+char const* const _PREHASH_ObjectDuplicate = LLMessageStringTable::getInstance()->getString("ObjectDuplicate");
+char const* const _PREHASH_InventoryData = LLMessageStringTable::getInstance()->getString("InventoryData");
+char const* const _PREHASH_ReplyData = LLMessageStringTable::getInstance()->getString("ReplyData");
+char const* const _PREHASH_ResetList = LLMessageStringTable::getInstance()->getString("ResetList");
+char const* const _PREHASH_MediaID = LLMessageStringTable::getInstance()->getString("MediaID");
+char const* const _PREHASH_RelatedRights = LLMessageStringTable::getInstance()->getString("RelatedRights");
+char const* const _PREHASH_RedirectGridX = LLMessageStringTable::getInstance()->getString("RedirectGridX");
+char const* const _PREHASH_RedirectGridY = LLMessageStringTable::getInstance()->getString("RedirectGridY");
+char const* const _PREHASH_TransferID = LLMessageStringTable::getInstance()->getString("TransferID");
+char const* const _PREHASH_TexturesChanged = LLMessageStringTable::getInstance()->getString("TexturesChanged");
+char const* const _PREHASH_UserLookAt = LLMessageStringTable::getInstance()->getString("UserLookAt");
+char const* const _PREHASH_TestBlock1 = LLMessageStringTable::getInstance()->getString("TestBlock1");
+char const* const _PREHASH_SensedData = LLMessageStringTable::getInstance()->getString("SensedData");
+char const* const _PREHASH_UpdateBlock = LLMessageStringTable::getInstance()->getString("UpdateBlock");
+char const* const _PREHASH_ClassifiedGodDelete = LLMessageStringTable::getInstance()->getString("ClassifiedGodDelete");
+char const* const _PREHASH_ObjectGrabUpdate = LLMessageStringTable::getInstance()->getString("ObjectGrabUpdate");
+char const* const _PREHASH_LocationPos = LLMessageStringTable::getInstance()->getString("LocationPos");
+char const* const _PREHASH_TaxDate = LLMessageStringTable::getInstance()->getString("TaxDate");
+char const* const _PREHASH_StartDateTime = LLMessageStringTable::getInstance()->getString("StartDateTime");
+char const* const _PREHASH_ObjectUpdateCached = LLMessageStringTable::getInstance()->getString("ObjectUpdateCached");
+char const* const _PREHASH_Packets = LLMessageStringTable::getInstance()->getString("Packets");
+char const* const _PREHASH_FailureType = LLMessageStringTable::getInstance()->getString("FailureType");
+char const* const _PREHASH_UpdateGroupInfo = LLMessageStringTable::getInstance()->getString("UpdateGroupInfo");
+char const* const _PREHASH_ObjectPermissions = LLMessageStringTable::getInstance()->getString("ObjectPermissions");
+char const* const _PREHASH_RevokePermissions = LLMessageStringTable::getInstance()->getString("RevokePermissions");
+char const* const _PREHASH_UpdateFlags = LLMessageStringTable::getInstance()->getString("UpdateFlags");
+char const* const _PREHASH_ObjectExportSelected = LLMessageStringTable::getInstance()->getString("ObjectExportSelected");
+char const* const _PREHASH_RezSelected = LLMessageStringTable::getInstance()->getString("RezSelected");
+char const* const _PREHASH_AutoPilot = LLMessageStringTable::getInstance()->getString("AutoPilot");
+char const* const _PREHASH_UpdateMuteListEntry = LLMessageStringTable::getInstance()->getString("UpdateMuteListEntry");
+char const* const _PREHASH_RemoveMuteListEntry = LLMessageStringTable::getInstance()->getString("RemoveMuteListEntry");
+char const* const _PREHASH_SetSimStatusInDatabase = LLMessageStringTable::getInstance()->getString("SetSimStatusInDatabase");
+char const* const _PREHASH_SetSimPresenceInDatabase = LLMessageStringTable::getInstance()->getString("SetSimPresenceInDatabase");
+char const* const _PREHASH_CameraProperty = LLMessageStringTable::getInstance()->getString("CameraProperty");
+char const* const _PREHASH_BrushSize = LLMessageStringTable::getInstance()->getString("BrushSize");
+char const* const _PREHASH_SimulatorSetMap = LLMessageStringTable::getInstance()->getString("SimulatorSetMap");
+char const* const _PREHASH_RegionPresenceRequestByRegionID = LLMessageStringTable::getInstance()->getString("RegionPresenceRequestByRegionID");
+char const* const _PREHASH_ParcelObjectOwnersReply = LLMessageStringTable::getInstance()->getString("ParcelObjectOwnersReply");
+char const* const _PREHASH_GroupMembersReply = LLMessageStringTable::getInstance()->getString("GroupMembersReply");
+char const* const _PREHASH_GroupRoleMembersReply = LLMessageStringTable::getInstance()->getString("GroupRoleMembersReply");
+char const* const _PREHASH_RequestRegionInfo = LLMessageStringTable::getInstance()->getString("RequestRegionInfo");
+char const* const _PREHASH_AABBMax = LLMessageStringTable::getInstance()->getString("AABBMax");
+char const* const _PREHASH_RequestPayPrice = LLMessageStringTable::getInstance()->getString("RequestPayPrice");
+char const* const _PREHASH_SimulatorPresentAtLocation = LLMessageStringTable::getInstance()->getString("SimulatorPresentAtLocation");
+char const* const _PREHASH_AgentRequestSit = LLMessageStringTable::getInstance()->getString("AgentRequestSit");
+char const* const _PREHASH_AABBMin = LLMessageStringTable::getInstance()->getString("AABBMin");
+char const* const _PREHASH_ClassifiedFlags = LLMessageStringTable::getInstance()->getString("ClassifiedFlags");
+char const* const _PREHASH_ControlFlags = LLMessageStringTable::getInstance()->getString("ControlFlags");
+char const* const _PREHASH_TeleportRequest = LLMessageStringTable::getInstance()->getString("TeleportRequest");
+char const* const _PREHASH_ScriptTeleportRequest = LLMessageStringTable::getInstance()->getString("ScriptTeleportRequest");
+char const* const _PREHASH_EstateCovenantRequest = LLMessageStringTable::getInstance()->getString("EstateCovenantRequest");
+char const* const _PREHASH_DateUTC = LLMessageStringTable::getInstance()->getString("DateUTC");
+char const* const _PREHASH_TaskIDs = LLMessageStringTable::getInstance()->getString("TaskIDs");
+char const* const _PREHASH_RequestResult = LLMessageStringTable::getInstance()->getString("RequestResult");
+char const* const _PREHASH_CanAcceptAgents = LLMessageStringTable::getInstance()->getString("CanAcceptAgents");
+char const* const _PREHASH_ObjectSaleInfo = LLMessageStringTable::getInstance()->getString("ObjectSaleInfo");
+char const* const _PREHASH_KillChildAgents = LLMessageStringTable::getInstance()->getString("KillChildAgents");
+char const* const _PREHASH_Balance = LLMessageStringTable::getInstance()->getString("Balance");
+char const* const _PREHASH_DerezContainer = LLMessageStringTable::getInstance()->getString("DerezContainer");
+char const* const _PREHASH_ObjectData = LLMessageStringTable::getInstance()->getString("ObjectData");
+char const* const _PREHASH_CameraAtAxis = LLMessageStringTable::getInstance()->getString("CameraAtAxis");
+char const* const _PREHASH_InfoBlock = LLMessageStringTable::getInstance()->getString("InfoBlock");
+char const* const _PREHASH_OwnershipCost = LLMessageStringTable::getInstance()->getString("OwnershipCost");
+char const* const _PREHASH_AvatarNotesUpdate = LLMessageStringTable::getInstance()->getString("AvatarNotesUpdate");
+char const* const _PREHASH_PID = LLMessageStringTable::getInstance()->getString("PID");
+char const* const _PREHASH_DirPopularReply = LLMessageStringTable::getInstance()->getString("DirPopularReply");
+char const* const _PREHASH_TerrainHeightRange00 = LLMessageStringTable::getInstance()->getString("TerrainHeightRange00");
+char const* const _PREHASH_SimData = LLMessageStringTable::getInstance()->getString("SimData");
+char const* const _PREHASH_TerrainHeightRange01 = LLMessageStringTable::getInstance()->getString("TerrainHeightRange01");
+char const* const _PREHASH_TerrainHeightRange10 = LLMessageStringTable::getInstance()->getString("TerrainHeightRange10");
+char const* const _PREHASH_TerrainHeightRange11 = LLMessageStringTable::getInstance()->getString("TerrainHeightRange11");
+char const* const _PREHASH_UpdateInventoryItem = LLMessageStringTable::getInstance()->getString("UpdateInventoryItem");
+char const* const _PREHASH_UpdateCreateInventoryItem = LLMessageStringTable::getInstance()->getString("UpdateCreateInventoryItem");
+char const* const _PREHASH_MoveInventoryItem = LLMessageStringTable::getInstance()->getString("MoveInventoryItem");
+char const* const _PREHASH_CopyInventoryItem = LLMessageStringTable::getInstance()->getString("CopyInventoryItem");
+char const* const _PREHASH_LinkInventoryItem = LLMessageStringTable::getInstance()->getString("LinkInventoryItem");
+char const* const _PREHASH_RemoveInventoryItem = LLMessageStringTable::getInstance()->getString("RemoveInventoryItem");
+char const* const _PREHASH_CreateInventoryItem = LLMessageStringTable::getInstance()->getString("CreateInventoryItem");
+char const* const _PREHASH_PathTwistBegin = LLMessageStringTable::getInstance()->getString("PathTwistBegin");
+char const* const _PREHASH_CRC = LLMessageStringTable::getInstance()->getString("CRC");
+char const* const _PREHASH_AttachmentPoint = LLMessageStringTable::getInstance()->getString("AttachmentPoint");
+char const* const _PREHASH_TelehubBlock = LLMessageStringTable::getInstance()->getString("TelehubBlock");
+char const* const _PREHASH_FOVBlock = LLMessageStringTable::getInstance()->getString("FOVBlock");
+char const* const _PREHASH_StartLocationData = LLMessageStringTable::getInstance()->getString("StartLocationData");
+char const* const _PREHASH_PositionData = LLMessageStringTable::getInstance()->getString("PositionData");
+char const* const _PREHASH_TimeSinceLast = LLMessageStringTable::getInstance()->getString("TimeSinceLast");
+char const* const _PREHASH_MapImage = LLMessageStringTable::getInstance()->getString("MapImage");
+char const* const _PREHASH_Objects = LLMessageStringTable::getInstance()->getString("Objects");
+char const* const _PREHASH_URL = LLMessageStringTable::getInstance()->getString("URL");
+char const* const _PREHASH_CreationDate = LLMessageStringTable::getInstance()->getString("CreationDate");
+char const* const _PREHASH_JointPivot = LLMessageStringTable::getInstance()->getString("JointPivot");
+char const* const _PREHASH_FPS = LLMessageStringTable::getInstance()->getString("FPS");
+char const* const _PREHASH_HasTelehub = LLMessageStringTable::getInstance()->getString("HasTelehub");
+char const* const _PREHASH_PathEnd = LLMessageStringTable::getInstance()->getString("PathEnd");
+char const* const _PREHASH_ScriptDataReply = LLMessageStringTable::getInstance()->getString("ScriptDataReply");
+char const* const _PREHASH_MapBlockReply = LLMessageStringTable::getInstance()->getString("MapBlockReply");
+char const* const _PREHASH_PropertiesData = LLMessageStringTable::getInstance()->getString("PropertiesData");
+char const* const _PREHASH_ViewerEffect = LLMessageStringTable::getInstance()->getString("ViewerEffect");
+char const* const _PREHASH_FreezeUser = LLMessageStringTable::getInstance()->getString("FreezeUser");
+char const* const _PREHASH_OwnerPrims = LLMessageStringTable::getInstance()->getString("OwnerPrims");
+char const* const _PREHASH_ObjectGrab = LLMessageStringTable::getInstance()->getString("ObjectGrab");
+char const* const _PREHASH_ToAgentID = LLMessageStringTable::getInstance()->getString("ToAgentID");
+char const* const _PREHASH_SimulatorMapUpdate = LLMessageStringTable::getInstance()->getString("SimulatorMapUpdate");
+char const* const _PREHASH_TransferPacket = LLMessageStringTable::getInstance()->getString("TransferPacket");
+char const* const _PREHASH_ObjectName = LLMessageStringTable::getInstance()->getString("ObjectName");
+char const* const _PREHASH_GroupPowers = LLMessageStringTable::getInstance()->getString("GroupPowers");
+char const* const _PREHASH_OriginalName = LLMessageStringTable::getInstance()->getString("OriginalName");
+char const* const _PREHASH_CompletePingCheck = LLMessageStringTable::getInstance()->getString("CompletePingCheck");
+char const* const _PREHASH_OnlineStatus = LLMessageStringTable::getInstance()->getString("OnlineStatus");
+char const* const _PREHASH_ObjectDrop = LLMessageStringTable::getInstance()->getString("ObjectDrop");
+char const* const _PREHASH_UseBigPackets = LLMessageStringTable::getInstance()->getString("UseBigPackets");
+char const* const _PREHASH_GroupNoticesListReply = LLMessageStringTable::getInstance()->getString("GroupNoticesListReply");
+char const* const _PREHASH_ParcelAccessListReply = LLMessageStringTable::getInstance()->getString("ParcelAccessListReply");
+char const* const _PREHASH_RpcChannelReply = LLMessageStringTable::getInstance()->getString("RpcChannelReply");
+char const* const _PREHASH_RegionPresenceResponse = LLMessageStringTable::getInstance()->getString("RegionPresenceResponse");
+char const* const _PREHASH_CharterMember = LLMessageStringTable::getInstance()->getString("CharterMember");
+char const* const _PREHASH_EdgeData = LLMessageStringTable::getInstance()->getString("EdgeData");
+char const* const _PREHASH_NameData = LLMessageStringTable::getInstance()->getString("NameData");
+char const* const _PREHASH_RegionPushOverride = LLMessageStringTable::getInstance()->getString("RegionPushOverride");
+char const* const _PREHASH_SimName = LLMessageStringTable::getInstance()->getString("SimName");
+char const* const _PREHASH_UserReport = LLMessageStringTable::getInstance()->getString("UserReport");
+char const* const _PREHASH_DownloadPriority = LLMessageStringTable::getInstance()->getString("DownloadPriority");
+char const* const _PREHASH_ToAgentId = LLMessageStringTable::getInstance()->getString("ToAgentId");
+char const* const _PREHASH_DirPopularQuery = LLMessageStringTable::getInstance()->getString("DirPopularQuery");
+char const* const _PREHASH_Mag = LLMessageStringTable::getInstance()->getString("Mag");
+char const* const _PREHASH_ParcelPropertiesRequestByID = LLMessageStringTable::getInstance()->getString("ParcelPropertiesRequestByID");
+char const* const _PREHASH_ObjectLink = LLMessageStringTable::getInstance()->getString("ObjectLink");
+char const* const _PREHASH_RpcScriptReplyInbound = LLMessageStringTable::getInstance()->getString("RpcScriptReplyInbound");
+char const* const _PREHASH_RezData = LLMessageStringTable::getInstance()->getString("RezData");
+char const* const _PREHASH_RemoveInventoryObjects = LLMessageStringTable::getInstance()->getString("RemoveInventoryObjects");
+char const* const _PREHASH_GroupProposalBallot = LLMessageStringTable::getInstance()->getString("GroupProposalBallot");
+char const* const _PREHASH_RPCServerIP = LLMessageStringTable::getInstance()->getString("RPCServerIP");
+char const* const _PREHASH_Far = LLMessageStringTable::getInstance()->getString("Far");
+char const* const _PREHASH_GodSessionID = LLMessageStringTable::getInstance()->getString("GodSessionID");
+char const* const _PREHASH_FLAboutText = LLMessageStringTable::getInstance()->getString("FLAboutText");
+char const* const _PREHASH_RegionHandshakeReply = LLMessageStringTable::getInstance()->getString("RegionHandshakeReply");
+char const* const _PREHASH_GroupActiveProposalItemReply = LLMessageStringTable::getInstance()->getString("GroupActiveProposalItemReply");
+char const* const _PREHASH_MapItemReply = LLMessageStringTable::getInstance()->getString("MapItemReply");
+char const* const _PREHASH_Seconds = LLMessageStringTable::getInstance()->getString("Seconds");
+char const* const _PREHASH_UpdateUserInfo = LLMessageStringTable::getInstance()->getString("UpdateUserInfo");
+char const* const _PREHASH_AggregatePermTexturesOwner = LLMessageStringTable::getInstance()->getString("AggregatePermTexturesOwner");
+char const* const _PREHASH_Set = LLMessageStringTable::getInstance()->getString("Set");
+char const* const _PREHASH_NewName = LLMessageStringTable::getInstance()->getString("NewName");
+char const* const _PREHASH_Key = LLMessageStringTable::getInstance()->getString("Key");
+char const* const _PREHASH_AgentID = LLMessageStringTable::getInstance()->getString("AgentID");
+char const* const _PREHASH_EventNotificationRemoveRequest = LLMessageStringTable::getInstance()->getString("EventNotificationRemoveRequest");
+char const* const _PREHASH_NewFolderID = LLMessageStringTable::getInstance()->getString("NewFolderID");
+char const* const _PREHASH_Arc = LLMessageStringTable::getInstance()->getString("Arc");
+char const* const _PREHASH_RegionX = LLMessageStringTable::getInstance()->getString("RegionX");
+char const* const _PREHASH_RegionY = LLMessageStringTable::getInstance()->getString("RegionY");
+char const* const _PREHASH_RequestData = LLMessageStringTable::getInstance()->getString("RequestData");
+char const* const _PREHASH_Msg = LLMessageStringTable::getInstance()->getString("Msg");
+char const* const _PREHASH_Top = LLMessageStringTable::getInstance()->getString("Top");
+char const* const _PREHASH_MiscStats = LLMessageStringTable::getInstance()->getString("MiscStats");
+char const* const _PREHASH_ImageID = LLMessageStringTable::getInstance()->getString("ImageID");
+char const* const _PREHASH_DataPacket = LLMessageStringTable::getInstance()->getString("DataPacket");
+char const* const _PREHASH_You = LLMessageStringTable::getInstance()->getString("You");
+char const* const _PREHASH_ScriptControlChange = LLMessageStringTable::getInstance()->getString("ScriptControlChange");
+char const* const _PREHASH_LoadURL = LLMessageStringTable::getInstance()->getString("LoadURL");
+char const* const _PREHASH_SetCPURatio = LLMessageStringTable::getInstance()->getString("SetCPURatio");
+char const* const _PREHASH_NameValueData = LLMessageStringTable::getInstance()->getString("NameValueData");
+char const* const _PREHASH_AtomicPassObject = LLMessageStringTable::getInstance()->getString("AtomicPassObject");
+char const* const _PREHASH_ErrorMessage = LLMessageStringTable::getInstance()->getString("ErrorMessage");
+char const* const _PREHASH_ViewerFrozenMessage = LLMessageStringTable::getInstance()->getString("ViewerFrozenMessage");
+char const* const _PREHASH_HealthMessage = LLMessageStringTable::getInstance()->getString("HealthMessage");
+char const* const _PREHASH_LogTextMessage = LLMessageStringTable::getInstance()->getString("LogTextMessage");
+char const* const _PREHASH_TimeDilation = LLMessageStringTable::getInstance()->getString("TimeDilation");
+char const* const _PREHASH_RemoveContribution = LLMessageStringTable::getInstance()->getString("RemoveContribution");
+char const* const _PREHASH_Contribution = LLMessageStringTable::getInstance()->getString("Contribution");
+char const* const _PREHASH_SetGroupContribution = LLMessageStringTable::getInstance()->getString("SetGroupContribution");
+char const* const _PREHASH_Offline = LLMessageStringTable::getInstance()->getString("Offline");
+char const* const _PREHASH_AgentIsNowWearing = LLMessageStringTable::getInstance()->getString("AgentIsNowWearing");
+char const* const _PREHASH_Members = LLMessageStringTable::getInstance()->getString("Members");
+char const* const _PREHASH_FailedResends = LLMessageStringTable::getInstance()->getString("FailedResends");
+char const* const _PREHASH_SecPerDay = LLMessageStringTable::getInstance()->getString("SecPerDay");
+char const* const _PREHASH_CameraCenter = LLMessageStringTable::getInstance()->getString("CameraCenter");
+char const* const _PREHASH_CameraLeftAxis = LLMessageStringTable::getInstance()->getString("CameraLeftAxis");
+char const* const _PREHASH_ExBlock = LLMessageStringTable::getInstance()->getString("ExBlock");
+char const* const _PREHASH_Channel = LLMessageStringTable::getInstance()->getString("Channel");
+char const* const _PREHASH_NetTest = LLMessageStringTable::getInstance()->getString("NetTest");
+char const* const _PREHASH_DiscardLevel = LLMessageStringTable::getInstance()->getString("DiscardLevel");
+char const* const _PREHASH_LayerID = LLMessageStringTable::getInstance()->getString("LayerID");
+char const* const _PREHASH_GrabOffset = LLMessageStringTable::getInstance()->getString("GrabOffset");
+char const* const _PREHASH_SimPort = LLMessageStringTable::getInstance()->getString("SimPort");
+char const* const _PREHASH_PricePerMeter = LLMessageStringTable::getInstance()->getString("PricePerMeter");
+char const* const _PREHASH_RegionFlags = LLMessageStringTable::getInstance()->getString("RegionFlags");
+char const* const _PREHASH_VoteResult = LLMessageStringTable::getInstance()->getString("VoteResult");
+char const* const _PREHASH_ParcelDirFeeEstimate = LLMessageStringTable::getInstance()->getString("ParcelDirFeeEstimate");
+char const* const _PREHASH_ModifyBlock = LLMessageStringTable::getInstance()->getString("ModifyBlock");
+char const* const _PREHASH_InventoryBlock = LLMessageStringTable::getInstance()->getString("InventoryBlock");
+char const* const _PREHASH_ReplyBlock = LLMessageStringTable::getInstance()->getString("ReplyBlock");
+char const* const _PREHASH_ValidUntil = LLMessageStringTable::getInstance()->getString("ValidUntil");
+char const* const _PREHASH_VelocityInterpolateOn = LLMessageStringTable::getInstance()->getString("VelocityInterpolateOn");
+char const* const _PREHASH_ClassifiedDelete = LLMessageStringTable::getInstance()->getString("ClassifiedDelete");
+char const* const _PREHASH_RegionDenyAnonymous = LLMessageStringTable::getInstance()->getString("RegionDenyAnonymous");
+char const* const _PREHASH_FLImageID = LLMessageStringTable::getInstance()->getString("FLImageID");
+char const* const _PREHASH_AllowPublish = LLMessageStringTable::getInstance()->getString("AllowPublish");
+char const* const _PREHASH_SitName = LLMessageStringTable::getInstance()->getString("SitName");
+char const* const _PREHASH_RegionsVisited = LLMessageStringTable::getInstance()->getString("RegionsVisited");
+char const* const _PREHASH_DirClassifiedReply = LLMessageStringTable::getInstance()->getString("DirClassifiedReply");
+char const* const _PREHASH_AvatarClassifiedReply = LLMessageStringTable::getInstance()->getString("AvatarClassifiedReply");
+char const* const _PREHASH_MediaURL = LLMessageStringTable::getInstance()->getString("MediaURL");
+char const* const _PREHASH_CompleteAgentMovement = LLMessageStringTable::getInstance()->getString("CompleteAgentMovement");
+char const* const _PREHASH_ClassifiedID = LLMessageStringTable::getInstance()->getString("ClassifiedID");
+char const* const _PREHASH_LocalID = LLMessageStringTable::getInstance()->getString("LocalID");
+char const* const _PREHASH_SpaceIP = LLMessageStringTable::getInstance()->getString("SpaceIP");
+char const* const _PREHASH_RemoveItem = LLMessageStringTable::getInstance()->getString("RemoveItem");
+char const* const _PREHASH_LogFailedMoneyTransaction = LLMessageStringTable::getInstance()->getString("LogFailedMoneyTransaction");
+char const* const _PREHASH_ViewerStartAuction = LLMessageStringTable::getInstance()->getString("ViewerStartAuction");
+char const* const _PREHASH_StartAuction = LLMessageStringTable::getInstance()->getString("StartAuction");
+char const* const _PREHASH_DuplicateFlags = LLMessageStringTable::getInstance()->getString("DuplicateFlags");
+char const* const _PREHASH_RegionInfo2 = LLMessageStringTable::getInstance()->getString("RegionInfo2");
+char const* const _PREHASH_TextColor = LLMessageStringTable::getInstance()->getString("TextColor");
+char const* const _PREHASH_SlaveID = LLMessageStringTable::getInstance()->getString("SlaveID");
+char const* const _PREHASH_Charter = LLMessageStringTable::getInstance()->getString("Charter");
+char const* const _PREHASH_AlertData = LLMessageStringTable::getInstance()->getString("AlertData");
+char const* const _PREHASH_AlertInfo = LLMessageStringTable::getInstance()->getString("AlertInfo");
+char const* const _PREHASH_TargetBlock = LLMessageStringTable::getInstance()->getString("TargetBlock");
+char const* const _PREHASH_CheckParcelAuctions = LLMessageStringTable::getInstance()->getString("CheckParcelAuctions");
+char const* const _PREHASH_ParcelAuctions = LLMessageStringTable::getInstance()->getString("ParcelAuctions");
+char const* const _PREHASH_OwnerIsGroup = LLMessageStringTable::getInstance()->getString("OwnerIsGroup");
+char const* const _PREHASH_NameValuePair = LLMessageStringTable::getInstance()->getString("NameValuePair");
+char const* const _PREHASH_RemoveNameValuePair = LLMessageStringTable::getInstance()->getString("RemoveNameValuePair");
+char const* const _PREHASH_BulkUpdateInventory = LLMessageStringTable::getInstance()->getString("BulkUpdateInventory");
+char const* const _PREHASH_UpdateTaskInventory = LLMessageStringTable::getInstance()->getString("UpdateTaskInventory");
+char const* const _PREHASH_RemoveTaskInventory = LLMessageStringTable::getInstance()->getString("RemoveTaskInventory");
+char const* const _PREHASH_MoveTaskInventory = LLMessageStringTable::getInstance()->getString("MoveTaskInventory");
+char const* const _PREHASH_RequestTaskInventory = LLMessageStringTable::getInstance()->getString("RequestTaskInventory");
+char const* const _PREHASH_ReplyTaskInventory = LLMessageStringTable::getInstance()->getString("ReplyTaskInventory");
+char const* const _PREHASH_AggregatePermInventory = LLMessageStringTable::getInstance()->getString("AggregatePermInventory");
+char const* const _PREHASH_GroupAccountTransactionsReply = LLMessageStringTable::getInstance()->getString("GroupAccountTransactionsReply");
+char const* const _PREHASH_SimulatorInfo = LLMessageStringTable::getInstance()->getString("SimulatorInfo");
+char const* const _PREHASH_WearableData = LLMessageStringTable::getInstance()->getString("WearableData");
+char const* const _PREHASH_Enabled = LLMessageStringTable::getInstance()->getString("Enabled");
+char const* const _PREHASH_Savings = LLMessageStringTable::getInstance()->getString("Savings");
+char const* const _PREHASH_SimulatorLoad = LLMessageStringTable::getInstance()->getString("SimulatorLoad");
+char const* const _PREHASH_InternalRegionIP = LLMessageStringTable::getInstance()->getString("InternalRegionIP");
+char const* const _PREHASH_ExternalRegionIP = LLMessageStringTable::getInstance()->getString("ExternalRegionIP");
+char const* const _PREHASH_TotalPairs = LLMessageStringTable::getInstance()->getString("TotalPairs");
+char const* const _PREHASH_CreateGroupRequest = LLMessageStringTable::getInstance()->getString("CreateGroupRequest");
+char const* const _PREHASH_JoinGroupRequest = LLMessageStringTable::getInstance()->getString("JoinGroupRequest");
+char const* const _PREHASH_LeaveGroupRequest = LLMessageStringTable::getInstance()->getString("LeaveGroupRequest");
+char const* const _PREHASH_InviteGroupRequest = LLMessageStringTable::getInstance()->getString("InviteGroupRequest");
+char const* const _PREHASH_LiveHelpGroupRequest = LLMessageStringTable::getInstance()->getString("LiveHelpGroupRequest");
+char const* const _PREHASH_PriceParcelClaimFactor = LLMessageStringTable::getInstance()->getString("PriceParcelClaimFactor");
+char const* const _PREHASH_BillableArea = LLMessageStringTable::getInstance()->getString("BillableArea");
+char const* const _PREHASH_ObjectID = LLMessageStringTable::getInstance()->getString("ObjectID");
+char const* const _PREHASH_ObjectFlagUpdate = LLMessageStringTable::getInstance()->getString("ObjectFlagUpdate");
+char const* const _PREHASH_GroupRoleUpdate = LLMessageStringTable::getInstance()->getString("GroupRoleUpdate");
+char const* const _PREHASH_RequestInventoryAsset = LLMessageStringTable::getInstance()->getString("RequestInventoryAsset");
+char const* const _PREHASH_ChangedGrid = LLMessageStringTable::getInstance()->getString("ChangedGrid");
+char const* const _PREHASH_AgentDropGroup = LLMessageStringTable::getInstance()->getString("AgentDropGroup");
+char const* const _PREHASH_Details = LLMessageStringTable::getInstance()->getString("Details");
+char const* const _PREHASH_LocationX = LLMessageStringTable::getInstance()->getString("LocationX");
+char const* const _PREHASH_SaleType = LLMessageStringTable::getInstance()->getString("SaleType");
+char const* const _PREHASH_LocationY = LLMessageStringTable::getInstance()->getString("LocationY");
+char const* const _PREHASH_LocationZ = LLMessageStringTable::getInstance()->getString("LocationZ");
+char const* const _PREHASH_EconomyData = LLMessageStringTable::getInstance()->getString("EconomyData");
+char const* const _PREHASH_HeadRotation = LLMessageStringTable::getInstance()->getString("HeadRotation");
+char const* const _PREHASH_DeleteOnCompletion = LLMessageStringTable::getInstance()->getString("DeleteOnCompletion");
+char const* const _PREHASH_PublicPort = LLMessageStringTable::getInstance()->getString("PublicPort");
+char const* const _PREHASH_DirClassifiedQuery = LLMessageStringTable::getInstance()->getString("DirClassifiedQuery");
+char const* const _PREHASH_CallbackID = LLMessageStringTable::getInstance()->getString("CallbackID");
+char const* const _PREHASH_RequestParcelTransfer = LLMessageStringTable::getInstance()->getString("RequestParcelTransfer");
+char const* const _PREHASH_RoleCount = LLMessageStringTable::getInstance()->getString("RoleCount");
+char const* const _PREHASH_ObjectCapacity = LLMessageStringTable::getInstance()->getString("ObjectCapacity");
+char const* const _PREHASH_RequestID = LLMessageStringTable::getInstance()->getString("RequestID");
+char const* const _PREHASH_RequestXfer = LLMessageStringTable::getInstance()->getString("RequestXfer");
+char const* const _PREHASH_ObjectTaxCurrent = LLMessageStringTable::getInstance()->getString("ObjectTaxCurrent");
+char const* const _PREHASH_LightTaxCurrent = LLMessageStringTable::getInstance()->getString("LightTaxCurrent");
+char const* const _PREHASH_LandTaxCurrent = LLMessageStringTable::getInstance()->getString("LandTaxCurrent");
+char const* const _PREHASH_GroupTaxCurrent = LLMessageStringTable::getInstance()->getString("GroupTaxCurrent");
+char const* const _PREHASH_FetchInventoryDescendents = LLMessageStringTable::getInstance()->getString("FetchInventoryDescendents");
+char const* const _PREHASH_InventoryDescendents = LLMessageStringTable::getInstance()->getString("InventoryDescendents");
+char const* const _PREHASH_Descendents = LLMessageStringTable::getInstance()->getString("Descendents");
+char const* const _PREHASH_PurgeInventoryDescendents = LLMessageStringTable::getInstance()->getString("PurgeInventoryDescendents");
+char const* const _PREHASH_ShowDir = LLMessageStringTable::getInstance()->getString("ShowDir");
+char const* const _PREHASH_IsOwner = LLMessageStringTable::getInstance()->getString("IsOwner");
+char const* const _PREHASH_Timestamp = LLMessageStringTable::getInstance()->getString("Timestamp");
+char const* const _PREHASH_GlobalPos = LLMessageStringTable::getInstance()->getString("GlobalPos");
+char const* const _PREHASH_GrabOffsetInitial = LLMessageStringTable::getInstance()->getString("GrabOffsetInitial");
+char const* const _PREHASH_IsTrial = LLMessageStringTable::getInstance()->getString("IsTrial");
+char const* const _PREHASH_ObjectDuplicateOnRay = LLMessageStringTable::getInstance()->getString("ObjectDuplicateOnRay");
+char const* const _PREHASH_GroupMembershipCount = LLMessageStringTable::getInstance()->getString("GroupMembershipCount");
+char const* const _PREHASH_MethodData = LLMessageStringTable::getInstance()->getString("MethodData");
+char const* const _PREHASH_ActivateGestures = LLMessageStringTable::getInstance()->getString("ActivateGestures");
+char const* const _PREHASH_DeactivateGestures = LLMessageStringTable::getInstance()->getString("DeactivateGestures");
+char const* const _PREHASH_ProposalData = LLMessageStringTable::getInstance()->getString("ProposalData");
+char const* const _PREHASH_PosGlobal = LLMessageStringTable::getInstance()->getString("PosGlobal");
+char const* const _PREHASH_SearchID = LLMessageStringTable::getInstance()->getString("SearchID");
+char const* const _PREHASH_RezMultipleAttachmentsFromInv = LLMessageStringTable::getInstance()->getString("RezMultipleAttachmentsFromInv");
+char const* const _PREHASH_SearchName = LLMessageStringTable::getInstance()->getString("SearchName");
+char const* const _PREHASH_VersionString = LLMessageStringTable::getInstance()->getString("VersionString");
+char const* const _PREHASH_CreateGroupReply = LLMessageStringTable::getInstance()->getString("CreateGroupReply");
+char const* const _PREHASH_LeaveGroupReply = LLMessageStringTable::getInstance()->getString("LeaveGroupReply");
+char const* const _PREHASH_ActualArea = LLMessageStringTable::getInstance()->getString("ActualArea");
+char const* const _PREHASH_Message = LLMessageStringTable::getInstance()->getString("Message");
+char const* const _PREHASH_ClickAction = LLMessageStringTable::getInstance()->getString("ClickAction");
+char const* const _PREHASH_AssetUploadComplete = LLMessageStringTable::getInstance()->getString("AssetUploadComplete");
+char const* const _PREHASH_RequestType = LLMessageStringTable::getInstance()->getString("RequestType");
+char const* const _PREHASH_UUID = LLMessageStringTable::getInstance()->getString("UUID");
+char const* const _PREHASH_BaseMask = LLMessageStringTable::getInstance()->getString("BaseMask");
+char const* const _PREHASH_NetBlock = LLMessageStringTable::getInstance()->getString("NetBlock");
+char const* const _PREHASH_GlobalX = LLMessageStringTable::getInstance()->getString("GlobalX");
+char const* const _PREHASH_GlobalY = LLMessageStringTable::getInstance()->getString("GlobalY");
+char const* const _PREHASH_CopyRotates = LLMessageStringTable::getInstance()->getString("CopyRotates");
+char const* const _PREHASH_KickUserAck = LLMessageStringTable::getInstance()->getString("KickUserAck");
+char const* const _PREHASH_TopPick = LLMessageStringTable::getInstance()->getString("TopPick"); //legacy var need to be deleted -angela
+char const* const _PREHASH_SessionID = LLMessageStringTable::getInstance()->getString("SessionID");
+char const* const _PREHASH_GlobalZ = LLMessageStringTable::getInstance()->getString("GlobalZ");
+char const* const _PREHASH_DeclineFriendship = LLMessageStringTable::getInstance()->getString("DeclineFriendship");
+char const* const _PREHASH_FormFriendship = LLMessageStringTable::getInstance()->getString("FormFriendship");
+char const* const _PREHASH_TerminateFriendship = LLMessageStringTable::getInstance()->getString("TerminateFriendship");
+char const* const _PREHASH_TaskData = LLMessageStringTable::getInstance()->getString("TaskData");
+char const* const _PREHASH_SimWideMaxPrims = LLMessageStringTable::getInstance()->getString("SimWideMaxPrims");
+char const* const _PREHASH_TotalPrims = LLMessageStringTable::getInstance()->getString("TotalPrims");
+char const* const _PREHASH_ProfileBegin = LLMessageStringTable::getInstance()->getString("ProfileBegin");
+char const* const _PREHASH_Request = LLMessageStringTable::getInstance()->getString("Request");
+char const* const _PREHASH_GroupAccountDetailsRequest = LLMessageStringTable::getInstance()->getString("GroupAccountDetailsRequest");
+char const* const _PREHASH_GroupActiveProposalsRequest = LLMessageStringTable::getInstance()->getString("GroupActiveProposalsRequest");
+char const* const _PREHASH_StringValue = LLMessageStringTable::getInstance()->getString("StringValue");
+char const* const _PREHASH_Version = LLMessageStringTable::getInstance()->getString("Version");
+char const* const _PREHASH_OtherCount = LLMessageStringTable::getInstance()->getString("OtherCount");
+char const* const _PREHASH_MemberCount = LLMessageStringTable::getInstance()->getString("MemberCount");
+char const* const _PREHASH_ChatData = LLMessageStringTable::getInstance()->getString("ChatData");
+char const* const _PREHASH_IsGroupOwned = LLMessageStringTable::getInstance()->getString("IsGroupOwned");
+char const* const _PREHASH_EnergyEfficiency = LLMessageStringTable::getInstance()->getString("EnergyEfficiency");
+char const* const _PREHASH_PickInfoUpdate = LLMessageStringTable::getInstance()->getString("PickInfoUpdate");
+char const* const _PREHASH_PickDelete = LLMessageStringTable::getInstance()->getString("PickDelete");
+char const* const _PREHASH_ScriptReset = LLMessageStringTable::getInstance()->getString("ScriptReset");
+char const* const _PREHASH_Requester = LLMessageStringTable::getInstance()->getString("Requester");
+char const* const _PREHASH_ForSale = LLMessageStringTable::getInstance()->getString("ForSale");
+char const* const _PREHASH_NearestLandingRegionReply = LLMessageStringTable::getInstance()->getString("NearestLandingRegionReply");
+char const* const _PREHASH_ParcelID = LLMessageStringTable::getInstance()->getString("ParcelID");
+char const* const _PREHASH_Godlike = LLMessageStringTable::getInstance()->getString("Godlike");
+char const* const _PREHASH_TotalDebits = LLMessageStringTable::getInstance()->getString("TotalDebits");
+char const* const _PREHASH_Direction = LLMessageStringTable::getInstance()->getString("Direction");
+char const* const _PREHASH_HealthData = LLMessageStringTable::getInstance()->getString("HealthData");
+char const* const _PREHASH_LeftAxis = LLMessageStringTable::getInstance()->getString("LeftAxis");
+char const* const _PREHASH_LocationBlock = LLMessageStringTable::getInstance()->getString("LocationBlock");
+char const* const _PREHASH_ObjectImage = LLMessageStringTable::getInstance()->getString("ObjectImage");
+char const* const _PREHASH_TerrainStartHeight00 = LLMessageStringTable::getInstance()->getString("TerrainStartHeight00");
+char const* const _PREHASH_TerrainStartHeight01 = LLMessageStringTable::getInstance()->getString("TerrainStartHeight01");
+char const* const _PREHASH_TerrainStartHeight10 = LLMessageStringTable::getInstance()->getString("TerrainStartHeight10");
+char const* const _PREHASH_TerrainStartHeight11 = LLMessageStringTable::getInstance()->getString("TerrainStartHeight11");
+char const* const _PREHASH_WaterHeight = LLMessageStringTable::getInstance()->getString("WaterHeight");
+char const* const _PREHASH_FetchInventoryReply = LLMessageStringTable::getInstance()->getString("FetchInventoryReply");
+char const* const _PREHASH_GroupAccountSummaryReply = LLMessageStringTable::getInstance()->getString("GroupAccountSummaryReply");
+char const* const _PREHASH_AttachedSound = LLMessageStringTable::getInstance()->getString("AttachedSound");
+char const* const _PREHASH_ParamInUse = LLMessageStringTable::getInstance()->getString("ParamInUse");
+char const* const _PREHASH_GodKickUser = LLMessageStringTable::getInstance()->getString("GodKickUser");
+char const* const _PREHASH_PickName = LLMessageStringTable::getInstance()->getString("PickName");
+char const* const _PREHASH_TaskName = LLMessageStringTable::getInstance()->getString("TaskName");
+char const* const _PREHASH_ObjectCount = LLMessageStringTable::getInstance()->getString("ObjectCount");
+char const* const _PREHASH_RegionPresenceRequestByHandle = LLMessageStringTable::getInstance()->getString("RegionPresenceRequestByHandle");
+char const* const _PREHASH_RezSingleAttachmentFromInv = LLMessageStringTable::getInstance()->getString("RezSingleAttachmentFromInv");
+char const* const _PREHASH_ChildAgentUpdate = LLMessageStringTable::getInstance()->getString("ChildAgentUpdate");
+char const* const _PREHASH_IsOwnerGroup = LLMessageStringTable::getInstance()->getString("IsOwnerGroup");
+char const* const _PREHASH_AgentHeightWidth = LLMessageStringTable::getInstance()->getString("AgentHeightWidth");
+char const* const _PREHASH_VerticalAngle = LLMessageStringTable::getInstance()->getString("VerticalAngle");
+char const* const _PREHASH_WearableType = LLMessageStringTable::getInstance()->getString("WearableType");
+char const* const _PREHASH_AggregatePermNextOwner = LLMessageStringTable::getInstance()->getString("AggregatePermNextOwner");
+char const* const _PREHASH_ShowInList = LLMessageStringTable::getInstance()->getString("ShowInList");
+char const* const _PREHASH_UpdateParcel = LLMessageStringTable::getInstance()->getString("UpdateParcel");
+char const* const _PREHASH_SetAlwaysRun = LLMessageStringTable::getInstance()->getString("SetAlwaysRun");
+char const* const _PREHASH_NVPair = LLMessageStringTable::getInstance()->getString("NVPair");
+char const* const _PREHASH_SearchType = LLMessageStringTable::getInstance()->getString("SearchType");
+char const* const _PREHASH_ObjectSpinStart = LLMessageStringTable::getInstance()->getString("ObjectSpinStart");
+char const* const _PREHASH_UseEstateSun = LLMessageStringTable::getInstance()->getString("UseEstateSun");
+char const* const _PREHASH_RegionID = LLMessageStringTable::getInstance()->getString("RegionID");
+char const* const _PREHASH_AbuseRegionID = LLMessageStringTable::getInstance()->getString("AbuseRegionID");
+char const* const _PREHASH_Creator = LLMessageStringTable::getInstance()->getString("Creator");
+char const* const _PREHASH_ProposalText = LLMessageStringTable::getInstance()->getString("ProposalText");
+char const* const _PREHASH_DirEventsReply = LLMessageStringTable::getInstance()->getString("DirEventsReply");
+char const* const _PREHASH_EventInfoReply = LLMessageStringTable::getInstance()->getString("EventInfoReply");
+char const* const _PREHASH_UserInfoReply = LLMessageStringTable::getInstance()->getString("UserInfoReply");
+char const* const _PREHASH_PathRadiusOffset = LLMessageStringTable::getInstance()->getString("PathRadiusOffset");
+char const* const _PREHASH_TextureData = LLMessageStringTable::getInstance()->getString("TextureData");
+char const* const _PREHASH_ChatPass = LLMessageStringTable::getInstance()->getString("ChatPass");
+char const* const _PREHASH_TargetID = LLMessageStringTable::getInstance()->getString("TargetID");
+char const* const _PREHASH_DefaultPayPrice = LLMessageStringTable::getInstance()->getString("DefaultPayPrice");
+char const* const _PREHASH_UserLocation = LLMessageStringTable::getInstance()->getString("UserLocation");
+char const* const _PREHASH_MaxPrims = LLMessageStringTable::getInstance()->getString("MaxPrims");
+char const* const _PREHASH_LandmarkID = LLMessageStringTable::getInstance()->getString("LandmarkID");
+char const* const _PREHASH_InitiateDownload = LLMessageStringTable::getInstance()->getString("InitiateDownload");
+char const* const _PREHASH_Name = LLMessageStringTable::getInstance()->getString("Name");
+char const* const _PREHASH_OtherCleanTime = LLMessageStringTable::getInstance()->getString("OtherCleanTime");
+char const* const _PREHASH_ParcelSetOtherCleanTime = LLMessageStringTable::getInstance()->getString("ParcelSetOtherCleanTime");
+char const* const _PREHASH_TeleportPriceExponent = LLMessageStringTable::getInstance()->getString("TeleportPriceExponent");
+char const* const _PREHASH_Gain = LLMessageStringTable::getInstance()->getString("Gain");
+char const* const _PREHASH_PacketAck = LLMessageStringTable::getInstance()->getString("PacketAck");
+char const* const _PREHASH_PathSkew = LLMessageStringTable::getInstance()->getString("PathSkew");
+char const* const _PREHASH_SimulatorShutdownRequest = LLMessageStringTable::getInstance()->getString("SimulatorShutdownRequest");
+char const* const _PREHASH_NearestLandingRegionRequest = LLMessageStringTable::getInstance()->getString("NearestLandingRegionRequest");
+char const* const _PREHASH_OtherID = LLMessageStringTable::getInstance()->getString("OtherID");
+char const* const _PREHASH_MemberID = LLMessageStringTable::getInstance()->getString("MemberID");
+char const* const _PREHASH_MapLayerRequest = LLMessageStringTable::getInstance()->getString("MapLayerRequest");
+char const* const _PREHASH_ObjectScale = LLMessageStringTable::getInstance()->getString("ObjectScale");
+char const* const _PREHASH_TargetIP = LLMessageStringTable::getInstance()->getString("TargetIP");
+char const* const _PREHASH_Redo = LLMessageStringTable::getInstance()->getString("Redo");
+char const* const _PREHASH_MoneyBalance = LLMessageStringTable::getInstance()->getString("MoneyBalance");
+char const* const _PREHASH_TrackAgent = LLMessageStringTable::getInstance()->getString("TrackAgent");
+char const* const _PREHASH_MaxX = LLMessageStringTable::getInstance()->getString("MaxX");
+char const* const _PREHASH_Data = LLMessageStringTable::getInstance()->getString("Data");
+char const* const _PREHASH_MaxY = LLMessageStringTable::getInstance()->getString("MaxY");
+char const* const _PREHASH_TextureAnim = LLMessageStringTable::getInstance()->getString("TextureAnim");
+char const* const _PREHASH_ReturnIDs = LLMessageStringTable::getInstance()->getString("ReturnIDs");
+char const* const _PREHASH_Date = LLMessageStringTable::getInstance()->getString("Date");
+char const* const _PREHASH_AgentWearablesUpdate = LLMessageStringTable::getInstance()->getString("AgentWearablesUpdate");
+char const* const _PREHASH_AgentDataUpdate = LLMessageStringTable::getInstance()->getString("AgentDataUpdate");
+char const* const _PREHASH_GroupDataUpdate = LLMessageStringTable::getInstance()->getString("GroupDataUpdate");
+char const* const _PREHASH_Hash = LLMessageStringTable::getInstance()->getString("Hash");
+char const* const _PREHASH_AgentGroupDataUpdate = LLMessageStringTable::getInstance()->getString("AgentGroupDataUpdate");
+char const* const _PREHASH_Left = LLMessageStringTable::getInstance()->getString("Left");
+char const* const _PREHASH_Mask = LLMessageStringTable::getInstance()->getString("Mask");
+char const* const _PREHASH_ForceMouselook = LLMessageStringTable::getInstance()->getString("ForceMouselook");
+char const* const _PREHASH_Success = LLMessageStringTable::getInstance()->getString("Success");
+char const* const _PREHASH_ObjectGroup = LLMessageStringTable::getInstance()->getString("ObjectGroup");
+char const* const _PREHASH_SunHour = LLMessageStringTable::getInstance()->getString("SunHour");
+char const* const _PREHASH_MinX = LLMessageStringTable::getInstance()->getString("MinX");
+char const* const _PREHASH_ScriptSensorReply = LLMessageStringTable::getInstance()->getString("ScriptSensorReply");
+char const* const _PREHASH_MinY = LLMessageStringTable::getInstance()->getString("MinY");
+char const* const _PREHASH_Command = LLMessageStringTable::getInstance()->getString("Command");
+char const* const _PREHASH_Desc = LLMessageStringTable::getInstance()->getString("Desc");
+char const* const _PREHASH_AttachmentNeedsSave = LLMessageStringTable::getInstance()->getString("AttachmentNeedsSave");
+char const* const _PREHASH_HistoryItemData = LLMessageStringTable::getInstance()->getString("HistoryItemData");
+char const* const _PREHASH_AgentCachedTexture = LLMessageStringTable::getInstance()->getString("AgentCachedTexture");
+char const* const _PREHASH_Subject = LLMessageStringTable::getInstance()->getString("Subject");
+char const* const _PREHASH_East = LLMessageStringTable::getInstance()->getString("East");
+char const* const _PREHASH_QueryReplies = LLMessageStringTable::getInstance()->getString("QueryReplies");
+char const* const _PREHASH_ObjectCategory = LLMessageStringTable::getInstance()->getString("ObjectCategory");
+char const* const _PREHASH_Time = LLMessageStringTable::getInstance()->getString("Time");
+char const* const _PREHASH_CreateLandmarkForEvent = LLMessageStringTable::getInstance()->getString("CreateLandmarkForEvent");
+char const* const _PREHASH_ParentID = LLMessageStringTable::getInstance()->getString("ParentID");
+char const* const _PREHASH_Ping = LLMessageStringTable::getInstance()->getString("Ping");
+char const* const _PREHASH_Perp = LLMessageStringTable::getInstance()->getString("Perp");
+char const* const _PREHASH_Code = LLMessageStringTable::getInstance()->getString("Code");
+char const* const _PREHASH_InvType = LLMessageStringTable::getInstance()->getString("InvType");
+char const* const _PREHASH_AgentFOV = LLMessageStringTable::getInstance()->getString("AgentFOV");
+char const* const _PREHASH_Audible = LLMessageStringTable::getInstance()->getString("Audible");
+char const* const _PREHASH_AuctionData = LLMessageStringTable::getInstance()->getString("AuctionData");
+char const* const _PREHASH_IDBlock = LLMessageStringTable::getInstance()->getString("IDBlock");
+char const* const _PREHASH_West = LLMessageStringTable::getInstance()->getString("West");
+char const* const _PREHASH_Undo = LLMessageStringTable::getInstance()->getString("Undo");
+char const* const _PREHASH_TotalNumItems = LLMessageStringTable::getInstance()->getString("TotalNumItems");
+char const* const _PREHASH_Info = LLMessageStringTable::getInstance()->getString("Info");
+char const* const _PREHASH_Area = LLMessageStringTable::getInstance()->getString("Area");
+char const* const _PREHASH_SimCrashed = LLMessageStringTable::getInstance()->getString("SimCrashed");
+char const* const _PREHASH_Text = LLMessageStringTable::getInstance()->getString("Text");
+char const* const _PREHASH_PriceGroupCreate = LLMessageStringTable::getInstance()->getString("PriceGroupCreate");
+char const* const _PREHASH_ObjectShape = LLMessageStringTable::getInstance()->getString("ObjectShape");
+char const* const _PREHASH_GroupRoleDataReply = LLMessageStringTable::getInstance()->getString("GroupRoleDataReply");
+char const* const _PREHASH_MuteCRC = LLMessageStringTable::getInstance()->getString("MuteCRC");
+char const* const _PREHASH_Size = LLMessageStringTable::getInstance()->getString("Size");
+char const* const _PREHASH_FromAddress = LLMessageStringTable::getInstance()->getString("FromAddress");
+char const* const _PREHASH_Body = LLMessageStringTable::getInstance()->getString("Body");
+char const* const _PREHASH_FileData = LLMessageStringTable::getInstance()->getString("FileData");
+char const* const _PREHASH_List = LLMessageStringTable::getInstance()->getString("List");
+char const* const _PREHASH_KickUser = LLMessageStringTable::getInstance()->getString("KickUser");
+char const* const _PREHASH_OtherPrims = LLMessageStringTable::getInstance()->getString("OtherPrims");
+char const* const _PREHASH_RunTime = LLMessageStringTable::getInstance()->getString("RunTime");
+char const* const _PREHASH_GrantUserRights = LLMessageStringTable::getInstance()->getString("GrantUserRights");
+char const* const _PREHASH_RpcScriptRequestInboundForward = LLMessageStringTable::getInstance()->getString("RpcScriptRequestInboundForward");
+char const* const _PREHASH_More = LLMessageStringTable::getInstance()->getString("More");
+char const* const _PREHASH_Majority = LLMessageStringTable::getInstance()->getString("Majority");
+char const* const _PREHASH_MetersTraveled = LLMessageStringTable::getInstance()->getString("MetersTraveled");
+char const* const _PREHASH_Stat = LLMessageStringTable::getInstance()->getString("Stat");
+char const* const _PREHASH_SoundID = LLMessageStringTable::getInstance()->getString("SoundID");
+char const* const _PREHASH_Item = LLMessageStringTable::getInstance()->getString("Item");
+char const* const _PREHASH_User = LLMessageStringTable::getInstance()->getString("User");
+char const* const _PREHASH_Prey = LLMessageStringTable::getInstance()->getString("Prey");
+char const* const _PREHASH_RayStart = LLMessageStringTable::getInstance()->getString("RayStart");
+char const* const _PREHASH_UsecSinceStart = LLMessageStringTable::getInstance()->getString("UsecSinceStart");
+char const* const _PREHASH_ParcelData = LLMessageStringTable::getInstance()->getString("ParcelData");
+char const* const _PREHASH_CameraUpAxis = LLMessageStringTable::getInstance()->getString("CameraUpAxis");
+char const* const _PREHASH_ScriptDialog = LLMessageStringTable::getInstance()->getString("ScriptDialog");
+char const* const _PREHASH_MasterParcelData = LLMessageStringTable::getInstance()->getString("MasterParcelData");
+char const* const _PREHASH_Invalid = LLMessageStringTable::getInstance()->getString("Invalid");
+char const* const _PREHASH_ProfileCurve = LLMessageStringTable::getInstance()->getString("ProfileCurve");
+char const* const _PREHASH_ParcelAccessListUpdate = LLMessageStringTable::getInstance()->getString("ParcelAccessListUpdate");
+char const* const _PREHASH_MuteListUpdate = LLMessageStringTable::getInstance()->getString("MuteListUpdate");
+char const* const _PREHASH_SendPacket = LLMessageStringTable::getInstance()->getString("SendPacket");
+char const* const _PREHASH_SendXferPacket = LLMessageStringTable::getInstance()->getString("SendXferPacket");
+char const* const _PREHASH_RegionDenyIdentified = LLMessageStringTable::getInstance()->getString("RegionDenyIdentified");
+char const* const _PREHASH_NotecardItemID = LLMessageStringTable::getInstance()->getString("NotecardItemID");
+char const* const _PREHASH_LastName = LLMessageStringTable::getInstance()->getString("LastName");
+char const* const _PREHASH_From = LLMessageStringTable::getInstance()->getString("From");
+char const* const _PREHASH_RoleChange = LLMessageStringTable::getInstance()->getString("RoleChange");
+char const* const _PREHASH_Port = LLMessageStringTable::getInstance()->getString("Port");
+char const* const _PREHASH_MemberTitle = LLMessageStringTable::getInstance()->getString("MemberTitle");
+char const* const _PREHASH_LogParcelChanges = LLMessageStringTable::getInstance()->getString("LogParcelChanges");
+char const* const _PREHASH_AgentCachedTextureResponse = LLMessageStringTable::getInstance()->getString("AgentCachedTextureResponse");
+char const* const _PREHASH_DeRezObject = LLMessageStringTable::getInstance()->getString("DeRezObject");
+char const* const _PREHASH_IsTemporary = LLMessageStringTable::getInstance()->getString("IsTemporary");
+char const* const _PREHASH_InsigniaID = LLMessageStringTable::getInstance()->getString("InsigniaID");
+char const* const _PREHASH_CheckFlags = LLMessageStringTable::getInstance()->getString("CheckFlags");
+char const* const _PREHASH_EventID = LLMessageStringTable::getInstance()->getString("EventID");
+char const* const _PREHASH_Selected = LLMessageStringTable::getInstance()->getString("Selected");
+char const* const _PREHASH_FromAgentId = LLMessageStringTable::getInstance()->getString("FromAgentId");
+char const* const _PREHASH_Type = LLMessageStringTable::getInstance()->getString("Type");
+char const* const _PREHASH_ChatType = LLMessageStringTable::getInstance()->getString("ChatType");
+char const* const _PREHASH_ReportData = LLMessageStringTable::getInstance()->getString("ReportData");
+char const* const _PREHASH_RequestBlock = LLMessageStringTable::getInstance()->getString("RequestBlock");
+char const* const _PREHASH_GrantData = LLMessageStringTable::getInstance()->getString("GrantData");
+char const* const _PREHASH_DetachAttachmentIntoInv = LLMessageStringTable::getInstance()->getString("DetachAttachmentIntoInv");
+char const* const _PREHASH_ParcelDisableObjects = LLMessageStringTable::getInstance()->getString("ParcelDisableObjects");
+char const* const _PREHASH_Sections = LLMessageStringTable::getInstance()->getString("Sections");
+char const* const _PREHASH_GodLevel = LLMessageStringTable::getInstance()->getString("GodLevel");
+char const* const _PREHASH_PayPriceReply = LLMessageStringTable::getInstance()->getString("PayPriceReply");
+char const* const _PREHASH_QueryID = LLMessageStringTable::getInstance()->getString("QueryID");
+char const* const _PREHASH_CameraEyeOffset = LLMessageStringTable::getInstance()->getString("CameraEyeOffset");
+char const* const _PREHASH_AgentPosition = LLMessageStringTable::getInstance()->getString("AgentPosition");
+char const* const _PREHASH_GrabPosition = LLMessageStringTable::getInstance()->getString("GrabPosition");
+char const* const _PREHASH_OnlineNotification = LLMessageStringTable::getInstance()->getString("OnlineNotification");
+char const* const _PREHASH_OfflineNotification = LLMessageStringTable::getInstance()->getString("OfflineNotification");
+char const* const _PREHASH_SendPostcard = LLMessageStringTable::getInstance()->getString("SendPostcard");
+char const* const _PREHASH_RequestFlags = LLMessageStringTable::getInstance()->getString("RequestFlags");
+char const* const _PREHASH_GroupAccountSummaryRequest = LLMessageStringTable::getInstance()->getString("GroupAccountSummaryRequest");
+char const* const _PREHASH_GroupVoteHistoryRequest = LLMessageStringTable::getInstance()->getString("GroupVoteHistoryRequest");
+char const* const _PREHASH_ParamValue = LLMessageStringTable::getInstance()->getString("ParamValue");
+char const* const _PREHASH_MaxAgents = LLMessageStringTable::getInstance()->getString("MaxAgents");
+char const* const _PREHASH_CreateNewOutfitAttachments = LLMessageStringTable::getInstance()->getString("CreateNewOutfitAttachments");
+char const* const _PREHASH_RegionHandle = LLMessageStringTable::getInstance()->getString("RegionHandle");
+char const* const _PREHASH_TeleportProgress = LLMessageStringTable::getInstance()->getString("TeleportProgress");
+char const* const _PREHASH_AgentQuitCopy = LLMessageStringTable::getInstance()->getString("AgentQuitCopy");
+char const* const _PREHASH_AvatarInterestsUpdate = LLMessageStringTable::getInstance()->getString("AvatarInterestsUpdate");
+char const* const _PREHASH_GroupNoticeID = LLMessageStringTable::getInstance()->getString("GroupNoticeID");
+char const* const _PREHASH_ParcelName = LLMessageStringTable::getInstance()->getString("ParcelName");
+char const* const _PREHASH_PriceObjectRent = LLMessageStringTable::getInstance()->getString("PriceObjectRent");
+char const* const _PREHASH_OfferCallingCard = LLMessageStringTable::getInstance()->getString("OfferCallingCard");
+char const* const _PREHASH_AcceptCallingCard = LLMessageStringTable::getInstance()->getString("AcceptCallingCard");
+char const* const _PREHASH_DeclineCallingCard = LLMessageStringTable::getInstance()->getString("DeclineCallingCard");
+char const* const _PREHASH_AgentAccess = LLMessageStringTable::getInstance()->getString("AgentAccess");
+char const* const _PREHASH_AgentLegacyAccess = LLMessageStringTable::getInstance()->getString("AgentLegacyAccess");
+char const* const _PREHASH_AgentMaxAccess = LLMessageStringTable::getInstance()->getString("AgentMaxAccess");
+char const* const _PREHASH_DataHomeLocationReply = LLMessageStringTable::getInstance()->getString("DataHomeLocationReply");
+char const* const _PREHASH_EventLocationReply = LLMessageStringTable::getInstance()->getString("EventLocationReply");
+char const* const _PREHASH_TerseDateID = LLMessageStringTable::getInstance()->getString("TerseDateID");
+char const* const _PREHASH_ObjectOwner = LLMessageStringTable::getInstance()->getString("ObjectOwner");
+char const* const _PREHASH_AssetID = LLMessageStringTable::getInstance()->getString("AssetID");
+char const* const _PREHASH_AlertMessage = LLMessageStringTable::getInstance()->getString("AlertMessage");
+char const* const _PREHASH_AgentAlertMessage = LLMessageStringTable::getInstance()->getString("AgentAlertMessage");
+char const* const _PREHASH_EstateOwnerMessage = LLMessageStringTable::getInstance()->getString("EstateOwnerMessage");
+char const* const _PREHASH_ParcelMediaCommandMessage = LLMessageStringTable::getInstance()->getString("ParcelMediaCommandMessage");
+char const* const _PREHASH_Auction = LLMessageStringTable::getInstance()->getString("Auction");
+char const* const _PREHASH_Category = LLMessageStringTable::getInstance()->getString("Category");
+char const* const _PREHASH_FilePath = LLMessageStringTable::getInstance()->getString("FilePath");
+char const* const _PREHASH_ItemFlags = LLMessageStringTable::getInstance()->getString("ItemFlags");
+char const* const _PREHASH_Invoice = LLMessageStringTable::getInstance()->getString("Invoice");
+char const* const _PREHASH_IntervalDays = LLMessageStringTable::getInstance()->getString("IntervalDays");
+char const* const _PREHASH_PathScaleX = LLMessageStringTable::getInstance()->getString("PathScaleX");
+char const* const _PREHASH_FromTaskID = LLMessageStringTable::getInstance()->getString("FromTaskID");
+char const* const _PREHASH_PathScaleY = LLMessageStringTable::getInstance()->getString("PathScaleY");
+char const* const _PREHASH_TimeInfo = LLMessageStringTable::getInstance()->getString("TimeInfo");
+char const* const _PREHASH_PublicCount = LLMessageStringTable::getInstance()->getString("PublicCount");
+char const* const _PREHASH_ParcelJoin = LLMessageStringTable::getInstance()->getString("ParcelJoin");
+char const* const _PREHASH_GroupRolesCount = LLMessageStringTable::getInstance()->getString("GroupRolesCount");
+char const* const _PREHASH_SimulatorBlock = LLMessageStringTable::getInstance()->getString("SimulatorBlock");
+char const* const _PREHASH_GroupID = LLMessageStringTable::getInstance()->getString("GroupID");
+char const* const _PREHASH_AgentVel = LLMessageStringTable::getInstance()->getString("AgentVel");
+char const* const _PREHASH_RequestImage = LLMessageStringTable::getInstance()->getString("RequestImage");
+char const* const _PREHASH_NetStats = LLMessageStringTable::getInstance()->getString("NetStats");
+char const* const _PREHASH_AgentPos = LLMessageStringTable::getInstance()->getString("AgentPos");
+char const* const _PREHASH_AgentSit = LLMessageStringTable::getInstance()->getString("AgentSit");
+char const* const _PREHASH_Material = LLMessageStringTable::getInstance()->getString("Material");
+char const* const _PREHASH_ObjectDeGrab = LLMessageStringTable::getInstance()->getString("ObjectDeGrab");
+char const* const _PREHASH_VelocityInterpolateOff = LLMessageStringTable::getInstance()->getString("VelocityInterpolateOff");
+char const* const _PREHASH_AuthorizedBuyerID = LLMessageStringTable::getInstance()->getString("AuthorizedBuyerID");
+char const* const _PREHASH_AvatarPropertiesReply = LLMessageStringTable::getInstance()->getString("AvatarPropertiesReply");
+char const* const _PREHASH_GroupProfileReply = LLMessageStringTable::getInstance()->getString("GroupProfileReply");
+char const* const _PREHASH_SimOwner = LLMessageStringTable::getInstance()->getString("SimOwner");
+char const* const _PREHASH_SalePrice = LLMessageStringTable::getInstance()->getString("SalePrice");
+char const* const _PREHASH_Animation = LLMessageStringTable::getInstance()->getString("Animation");
+char const* const _PREHASH_OwnerID = LLMessageStringTable::getInstance()->getString("OwnerID");
+char const* const _PREHASH_NearestLandingRegionUpdated = LLMessageStringTable::getInstance()->getString("NearestLandingRegionUpdated");
+char const* const _PREHASH_PassToAgent = LLMessageStringTable::getInstance()->getString("PassToAgent");
+char const* const _PREHASH_PreyAgent = LLMessageStringTable::getInstance()->getString("PreyAgent");
+char const* const _PREHASH_SimStats = LLMessageStringTable::getInstance()->getString("SimStats");
+char const* const _PREHASH_LogoutReply = LLMessageStringTable::getInstance()->getString("LogoutReply");
+char const* const _PREHASH_FeatureDisabled = LLMessageStringTable::getInstance()->getString("FeatureDisabled");
+char const* const _PREHASH_PhysicalAvatarEventList = LLMessageStringTable::getInstance()->getString("PhysicalAvatarEventList");
+char const* const _PREHASH_ObjectLocalID = LLMessageStringTable::getInstance()->getString("ObjectLocalID");
+char const* const _PREHASH_Dropped = LLMessageStringTable::getInstance()->getString("Dropped");
+char const* const _PREHASH_WebProfilesDisabled = LLMessageStringTable::getInstance()->getString("WebProfilesDisabled");
+char const* const _PREHASH_Destination = LLMessageStringTable::getInstance()->getString("Destination");
+char const* const _PREHASH_MasterID = LLMessageStringTable::getInstance()->getString("MasterID");
+char const* const _PREHASH_TransferData = LLMessageStringTable::getInstance()->getString("TransferData");
+char const* const _PREHASH_WantToMask = LLMessageStringTable::getInstance()->getString("WantToMask");
+char const* const _PREHASH_ParcelSelectObjects = LLMessageStringTable::getInstance()->getString("ParcelSelectObjects");
+char const* const _PREHASH_ExtraParams = LLMessageStringTable::getInstance()->getString("ExtraParams");
+char const* const _PREHASH_CreatorID = LLMessageStringTable::getInstance()->getString("CreatorID");
+char const* const _PREHASH_Summary = LLMessageStringTable::getInstance()->getString("Summary");
+char const* const _PREHASH_BuyObjectInventory = LLMessageStringTable::getInstance()->getString("BuyObjectInventory");
+char const* const _PREHASH_FetchInventory = LLMessageStringTable::getInstance()->getString("FetchInventory");
+char const* const _PREHASH_InventoryID = LLMessageStringTable::getInstance()->getString("InventoryID");
+char const* const _PREHASH_PacketNumber = LLMessageStringTable::getInstance()->getString("PacketNumber");
+char const* const _PREHASH_SetFollowCamProperties = LLMessageStringTable::getInstance()->getString("SetFollowCamProperties");
+char const* const _PREHASH_ClearFollowCamProperties = LLMessageStringTable::getInstance()->getString("ClearFollowCamProperties");
+char const* const _PREHASH_SequenceID = LLMessageStringTable::getInstance()->getString("SequenceID");
+char const* const _PREHASH_DataServerLogout = LLMessageStringTable::getInstance()->getString("DataServerLogout");
+char const* const _PREHASH_NameValue = LLMessageStringTable::getInstance()->getString("NameValue");
+char const* const _PREHASH_PathShearX = LLMessageStringTable::getInstance()->getString("PathShearX");
+char const* const _PREHASH_PathShearY = LLMessageStringTable::getInstance()->getString("PathShearY");
+char const* const _PREHASH_Velocity = LLMessageStringTable::getInstance()->getString("Velocity");
+char const* const _PREHASH_SecPerYear = LLMessageStringTable::getInstance()->getString("SecPerYear");
+char const* const _PREHASH_FirstName = LLMessageStringTable::getInstance()->getString("FirstName");
+char const* const _PREHASH_AttachedSoundGainChange = LLMessageStringTable::getInstance()->getString("AttachedSoundGainChange");
+char const* const _PREHASH_LocationID = LLMessageStringTable::getInstance()->getString("LocationID");
+char const* const _PREHASH_Running = LLMessageStringTable::getInstance()->getString("Running");
+char const* const _PREHASH_AgentThrottle = LLMessageStringTable::getInstance()->getString("AgentThrottle");
+char const* const _PREHASH_NeighborList = LLMessageStringTable::getInstance()->getString("NeighborList");
+char const* const _PREHASH_PathTaperX = LLMessageStringTable::getInstance()->getString("PathTaperX");
+char const* const _PREHASH_PathTaperY = LLMessageStringTable::getInstance()->getString("PathTaperY");
+char const* const _PREHASH_AgentRelated = LLMessageStringTable::getInstance()->getString("AgentRelated");
+char const* const _PREHASH_GranterBlock = LLMessageStringTable::getInstance()->getString("GranterBlock");
+char const* const _PREHASH_UseCachedMuteList = LLMessageStringTable::getInstance()->getString("UseCachedMuteList");
+char const* const _PREHASH_FailStats = LLMessageStringTable::getInstance()->getString("FailStats");
+char const* const _PREHASH_Tempfile = LLMessageStringTable::getInstance()->getString("Tempfile");
+char const* const _PREHASH_BuyerID = LLMessageStringTable::getInstance()->getString("BuyerID");
+char const* const _PREHASH_DirPeopleReply = LLMessageStringTable::getInstance()->getString("DirPeopleReply");
+char const* const _PREHASH_TransferInfo = LLMessageStringTable::getInstance()->getString("TransferInfo");
+char const* const _PREHASH_AvatarPickerRequestBackend = LLMessageStringTable::getInstance()->getString("AvatarPickerRequestBackend");
+char const* const _PREHASH_AvatarPropertiesRequestBackend = LLMessageStringTable::getInstance()->getString("AvatarPropertiesRequestBackend");
+char const* const _PREHASH_UpdateData = LLMessageStringTable::getInstance()->getString("UpdateData");
+char const* const _PREHASH_SimFPS = LLMessageStringTable::getInstance()->getString("SimFPS");
+char const* const _PREHASH_ReporterID = LLMessageStringTable::getInstance()->getString("ReporterID");
+char const* const _PREHASH_ButtonLabel = LLMessageStringTable::getInstance()->getString("ButtonLabel");
+char const* const _PREHASH_GranterID = LLMessageStringTable::getInstance()->getString("GranterID");
+char const* const _PREHASH_WantToText = LLMessageStringTable::getInstance()->getString("WantToText");
+char const* const _PREHASH_ReportType = LLMessageStringTable::getInstance()->getString("ReportType");
+char const* const _PREHASH_SimulatorReady = LLMessageStringTable::getInstance()->getString("SimulatorReady");
+char const* const _PREHASH_DataBlock = LLMessageStringTable::getInstance()->getString("DataBlock");
+char const* const _PREHASH_AnimationSourceList = LLMessageStringTable::getInstance()->getString("AnimationSourceList");
+char const* const _PREHASH_SubscribeLoad = LLMessageStringTable::getInstance()->getString("SubscribeLoad");
+char const* const _PREHASH_UnsubscribeLoad = LLMessageStringTable::getInstance()->getString("UnsubscribeLoad");
+char const* const _PREHASH_Packet = LLMessageStringTable::getInstance()->getString("Packet");
+char const* const _PREHASH_UndoLand = LLMessageStringTable::getInstance()->getString("UndoLand");
+char const* const _PREHASH_SimAccess = LLMessageStringTable::getInstance()->getString("SimAccess");
+char const* const _PREHASH_AbuserID = LLMessageStringTable::getInstance()->getString("AbuserID");
+char const* const _PREHASH_MembershipFee = LLMessageStringTable::getInstance()->getString("MembershipFee");
+char const* const _PREHASH_InviteGroupResponse = LLMessageStringTable::getInstance()->getString("InviteGroupResponse");
+char const* const _PREHASH_CreateInventoryFolder = LLMessageStringTable::getInstance()->getString("CreateInventoryFolder");
+char const* const _PREHASH_UpdateInventoryFolder = LLMessageStringTable::getInstance()->getString("UpdateInventoryFolder");
+char const* const _PREHASH_MoveInventoryFolder = LLMessageStringTable::getInstance()->getString("MoveInventoryFolder");
+char const* const _PREHASH_RemoveInventoryFolder = LLMessageStringTable::getInstance()->getString("RemoveInventoryFolder");
+char const* const _PREHASH_MoneyData = LLMessageStringTable::getInstance()->getString("MoneyData");
+char const* const _PREHASH_ObjectDeselect = LLMessageStringTable::getInstance()->getString("ObjectDeselect");
+char const* const _PREHASH_NewAssetID = LLMessageStringTable::getInstance()->getString("NewAssetID");
+char const* const _PREHASH_ObjectAdd = LLMessageStringTable::getInstance()->getString("ObjectAdd");
+char const* const _PREHASH_SimulatorFeatures = LLMessageStringTable::getInstance()->getString("SimulatorFeatures");
+char const* const _PREHASH_RayEndIsIntersection = LLMessageStringTable::getInstance()->getString("RayEndIsIntersection");
+char const* const _PREHASH_CompleteAuction = LLMessageStringTable::getInstance()->getString("CompleteAuction");
+char const* const _PREHASH_CircuitCode = LLMessageStringTable::getInstance()->getString("CircuitCode");
+char const* const _PREHASH_AgentMovementComplete = LLMessageStringTable::getInstance()->getString("AgentMovementComplete");
+char const* const _PREHASH_ViewerIP = LLMessageStringTable::getInstance()->getString("ViewerIP");
+char const* const _PREHASH_Header = LLMessageStringTable::getInstance()->getString("Header");
+char const* const _PREHASH_GestureFlags = LLMessageStringTable::getInstance()->getString("GestureFlags");
+char const* const _PREHASH_XferID = LLMessageStringTable::getInstance()->getString("XferID");
+char const* const _PREHASH_StatValue = LLMessageStringTable::getInstance()->getString("StatValue");
+char const* const _PREHASH_TaskID = LLMessageStringTable::getInstance()->getString("TaskID");
+char const* const _PREHASH_PickID = LLMessageStringTable::getInstance()->getString("PickID");
+char const* const _PREHASH_RayEnd = LLMessageStringTable::getInstance()->getString("RayEnd");
+char const* const _PREHASH_Throttles = LLMessageStringTable::getInstance()->getString("Throttles");
+char const* const _PREHASH_RebakeAvatarTextures = LLMessageStringTable::getInstance()->getString("RebakeAvatarTextures");
+char const* const _PREHASH_UpAxis = LLMessageStringTable::getInstance()->getString("UpAxis");
+char const* const _PREHASH_AgentTextures = LLMessageStringTable::getInstance()->getString("AgentTextures");
+char const* const _PREHASH_NotecardData = LLMessageStringTable::getInstance()->getString("NotecardData");
+char const* const _PREHASH_Radius = LLMessageStringTable::getInstance()->getString("Radius");
+char const* const _PREHASH_OffCircuit = LLMessageStringTable::getInstance()->getString("OffCircuit");
+char const* const _PREHASH_Access = LLMessageStringTable::getInstance()->getString("Access");
+char const* const _PREHASH_TitleRoleID = LLMessageStringTable::getInstance()->getString("TitleRoleID");
+char const* const _PREHASH_SquareMetersCredit = LLMessageStringTable::getInstance()->getString("SquareMetersCredit");
+char const* const _PREHASH_Filename = LLMessageStringTable::getInstance()->getString("Filename");
+char const* const _PREHASH_ClassifiedInfoRequest = LLMessageStringTable::getInstance()->getString("ClassifiedInfoRequest");
+char const* const _PREHASH_ParcelInfoRequest = LLMessageStringTable::getInstance()->getString("ParcelInfoRequest");
+char const* const _PREHASH_ParcelObjectOwnersRequest = LLMessageStringTable::getInstance()->getString("ParcelObjectOwnersRequest");
+char const* const _PREHASH_TeleportLandmarkRequest = LLMessageStringTable::getInstance()->getString("TeleportLandmarkRequest");
+char const* const _PREHASH_EventInfoRequest = LLMessageStringTable::getInstance()->getString("EventInfoRequest");
+char const* const _PREHASH_MoneyBalanceRequest = LLMessageStringTable::getInstance()->getString("MoneyBalanceRequest");
+char const* const _PREHASH_GroupMembersRequest = LLMessageStringTable::getInstance()->getString("GroupMembersRequest");
+char const* const _PREHASH_GroupRoleMembersRequest = LLMessageStringTable::getInstance()->getString("GroupRoleMembersRequest");
+char const* const _PREHASH_ChatFromSimulator = LLMessageStringTable::getInstance()->getString("ChatFromSimulator");
+char const* const _PREHASH_OldFolderID = LLMessageStringTable::getInstance()->getString("OldFolderID");
+char const* const _PREHASH_UserInfoRequest = LLMessageStringTable::getInstance()->getString("UserInfoRequest");
+char const* const _PREHASH_TextureID = LLMessageStringTable::getInstance()->getString("TextureID");
+char const* const _PREHASH_ProfileURL = LLMessageStringTable::getInstance()->getString("ProfileURL");
+char const* const _PREHASH_Handle = LLMessageStringTable::getInstance()->getString("Handle");
+char const* const _PREHASH_ButtonIndex = LLMessageStringTable::getInstance()->getString("ButtonIndex");
+char const* const _PREHASH_GetScriptRunning = LLMessageStringTable::getInstance()->getString("GetScriptRunning");
+char const* const _PREHASH_SetScriptRunning = LLMessageStringTable::getInstance()->getString("SetScriptRunning");
+char const* const _PREHASH_Health = LLMessageStringTable::getInstance()->getString("Health");
+char const* const _PREHASH_CircuitInfo = LLMessageStringTable::getInstance()->getString("CircuitInfo");
+char const* const _PREHASH_ObjectBuy = LLMessageStringTable::getInstance()->getString("ObjectBuy");
+char const* const _PREHASH_ProfileEnd = LLMessageStringTable::getInstance()->getString("ProfileEnd");
+char const* const _PREHASH_Effect = LLMessageStringTable::getInstance()->getString("Effect");
+char const* const _PREHASH_TestMessage = LLMessageStringTable::getInstance()->getString("TestMessage");
+char const* const _PREHASH_ScriptMailRegistration = LLMessageStringTable::getInstance()->getString("ScriptMailRegistration");
+char const* const _PREHASH_AgentSetAppearance = LLMessageStringTable::getInstance()->getString("AgentSetAppearance");
+char const* const _PREHASH_AvatarAppearance = LLMessageStringTable::getInstance()->getString("AvatarAppearance");
+char const* const _PREHASH_RegionData = LLMessageStringTable::getInstance()->getString("RegionData");
+char const* const _PREHASH_RequestingRegionData = LLMessageStringTable::getInstance()->getString("RequestingRegionData");
+char const* const _PREHASH_LandingRegionData = LLMessageStringTable::getInstance()->getString("LandingRegionData");
+char const* const _PREHASH_SitTransform = LLMessageStringTable::getInstance()->getString("SitTransform");
+char const* const _PREHASH_TerrainBase0 = LLMessageStringTable::getInstance()->getString("TerrainBase0");
+char const* const _PREHASH_SkillsMask = LLMessageStringTable::getInstance()->getString("SkillsMask");
+char const* const _PREHASH_AtAxis = LLMessageStringTable::getInstance()->getString("AtAxis");
+char const* const _PREHASH_TerrainBase1 = LLMessageStringTable::getInstance()->getString("TerrainBase1");
+char const* const _PREHASH_Reason = LLMessageStringTable::getInstance()->getString("Reason");
+char const* const _PREHASH_TerrainBase2 = LLMessageStringTable::getInstance()->getString("TerrainBase2");
+char const* const _PREHASH_TerrainBase3 = LLMessageStringTable::getInstance()->getString("TerrainBase3");
+char const* const _PREHASH_Params = LLMessageStringTable::getInstance()->getString("Params");
+char const* const _PREHASH_PingID = LLMessageStringTable::getInstance()->getString("PingID");
+char const* const _PREHASH_Change = LLMessageStringTable::getInstance()->getString("Change");
+char const* const _PREHASH_Height = LLMessageStringTable::getInstance()->getString("Height");
+char const* const _PREHASH_Region = LLMessageStringTable::getInstance()->getString("Region");
+char const* const _PREHASH_TelehubInfo = LLMessageStringTable::getInstance()->getString("TelehubInfo");
+char const* const _PREHASH_StateSave = LLMessageStringTable::getInstance()->getString("StateSave");
+char const* const _PREHASH_RoleData = LLMessageStringTable::getInstance()->getString("RoleData");
+char const* const _PREHASH_AgentAnimation = LLMessageStringTable::getInstance()->getString("AgentAnimation");
+char const* const _PREHASH_AvatarAnimation = LLMessageStringTable::getInstance()->getString("AvatarAnimation");
+char const* const _PREHASH_LogDwellTime = LLMessageStringTable::getInstance()->getString("LogDwellTime");
+char const* const _PREHASH_ParcelGodMarkAsContent = LLMessageStringTable::getInstance()->getString("ParcelGodMarkAsContent");
+char const* const _PREHASH_UsePhysics = LLMessageStringTable::getInstance()->getString("UsePhysics");
+char const* const _PREHASH_RegionDenyTransacted = LLMessageStringTable::getInstance()->getString("RegionDenyTransacted");
+char const* const _PREHASH_JointType = LLMessageStringTable::getInstance()->getString("JointType");
+char const* const _PREHASH_ObjectTaxEstimate = LLMessageStringTable::getInstance()->getString("ObjectTaxEstimate");
+char const* const _PREHASH_LightTaxEstimate = LLMessageStringTable::getInstance()->getString("LightTaxEstimate");
+char const* const _PREHASH_LandTaxEstimate = LLMessageStringTable::getInstance()->getString("LandTaxEstimate");
+char const* const _PREHASH_TeleportLandingStatusChanged = LLMessageStringTable::getInstance()->getString("TeleportLandingStatusChanged");
+char const* const _PREHASH_GroupTaxEstimate = LLMessageStringTable::getInstance()->getString("GroupTaxEstimate");
+char const* const _PREHASH_AvgViewerFPS = LLMessageStringTable::getInstance()->getString("AvgViewerFPS");
+char const* const _PREHASH_Buttons = LLMessageStringTable::getInstance()->getString("Buttons");
+char const* const _PREHASH_Sender = LLMessageStringTable::getInstance()->getString("Sender");
+char const* const _PREHASH_Dialog = LLMessageStringTable::getInstance()->getString("Dialog");
+char const* const _PREHASH_TargetData = LLMessageStringTable::getInstance()->getString("TargetData");
+char const* const _PREHASH_DestID = LLMessageStringTable::getInstance()->getString("DestID");
+char const* const _PREHASH_PricePublicObjectDelete = LLMessageStringTable::getInstance()->getString("PricePublicObjectDelete");
+char const* const _PREHASH_ObjectDelete = LLMessageStringTable::getInstance()->getString("ObjectDelete");
+char const* const _PREHASH_Delete = LLMessageStringTable::getInstance()->getString("Delete");
+char const* const _PREHASH_EventGodDelete = LLMessageStringTable::getInstance()->getString("EventGodDelete");
+char const* const _PREHASH_LastTaxDate = LLMessageStringTable::getInstance()->getString("LastTaxDate");
+char const* const _PREHASH_MapImageID = LLMessageStringTable::getInstance()->getString("MapImageID");
+char const* const _PREHASH_EndDateTime = LLMessageStringTable::getInstance()->getString("EndDateTime");
+char const* const _PREHASH_TerrainDetail0 = LLMessageStringTable::getInstance()->getString("TerrainDetail0");
+char const* const _PREHASH_TerrainDetail1 = LLMessageStringTable::getInstance()->getString("TerrainDetail1");
+char const* const _PREHASH_TerrainDetail2 = LLMessageStringTable::getInstance()->getString("TerrainDetail2");
+char const* const _PREHASH_TerrainDetail3 = LLMessageStringTable::getInstance()->getString("TerrainDetail3");
+char const* const _PREHASH_Offset = LLMessageStringTable::getInstance()->getString("Offset");
+char const* const _PREHASH_ObjectDelink = LLMessageStringTable::getInstance()->getString("ObjectDelink");
+char const* const _PREHASH_TargetObject = LLMessageStringTable::getInstance()->getString("TargetObject");
+char const* const _PREHASH_IsEstateManager = LLMessageStringTable::getInstance()->getString("IsEstateManager");
+char const* const _PREHASH_CancelAuction = LLMessageStringTable::getInstance()->getString("CancelAuction");
+char const* const _PREHASH_ObjectDetach = LLMessageStringTable::getInstance()->getString("ObjectDetach");
+char const* const _PREHASH_Compressed = LLMessageStringTable::getInstance()->getString("Compressed");
+char const* const _PREHASH_PathBegin = LLMessageStringTable::getInstance()->getString("PathBegin");
+char const* const _PREHASH_BypassRaycast = LLMessageStringTable::getInstance()->getString("BypassRaycast");
+char const* const _PREHASH_WinnerID = LLMessageStringTable::getInstance()->getString("WinnerID");
+char const* const _PREHASH_ChannelType = LLMessageStringTable::getInstance()->getString("ChannelType");
+char const* const _PREHASH_NonExemptMembers = LLMessageStringTable::getInstance()->getString("NonExemptMembers");
+char const* const _PREHASH_Agents = LLMessageStringTable::getInstance()->getString("Agents");
+char const* const _PREHASH_MemberData = LLMessageStringTable::getInstance()->getString("MemberData");
+char const* const _PREHASH_ToGroupID = LLMessageStringTable::getInstance()->getString("ToGroupID");
+char const* const _PREHASH_ImageNotInDatabase = LLMessageStringTable::getInstance()->getString("ImageNotInDatabase");
+char const* const _PREHASH_StartDate = LLMessageStringTable::getInstance()->getString("StartDate");
+char const* const _PREHASH_AnimID = LLMessageStringTable::getInstance()->getString("AnimID");
+char const* const _PREHASH_Serial = LLMessageStringTable::getInstance()->getString("Serial");
+char const* const _PREHASH_AbuseRegionName = LLMessageStringTable::getInstance()->getString("AbuseRegionName");
+char const* const _PREHASH_ModifyLand = LLMessageStringTable::getInstance()->getString("ModifyLand");
+char const* const _PREHASH_Digest = LLMessageStringTable::getInstance()->getString("Digest");
+char const* const _PREHASH_Victim = LLMessageStringTable::getInstance()->getString("Victim");
+char const* const _PREHASH_Script = LLMessageStringTable::getInstance()->getString("Script");
+char const* const _PREHASH_PickInfoReply = LLMessageStringTable::getInstance()->getString("PickInfoReply");
+char const* const _PREHASH_MoneyBalanceReply = LLMessageStringTable::getInstance()->getString("MoneyBalanceReply");
+char const* const _PREHASH_RoutedMoneyBalanceReply = LLMessageStringTable::getInstance()->getString("RoutedMoneyBalanceReply");
+char const* const _PREHASH_RoleID = LLMessageStringTable::getInstance()->getString("RoleID");
+char const* const _PREHASH_RegionInfo = LLMessageStringTable::getInstance()->getString("RegionInfo");
+char const* const _PREHASH_GodUpdateRegionInfo = LLMessageStringTable::getInstance()->getString("GodUpdateRegionInfo");
+char const* const _PREHASH_StartAnim = LLMessageStringTable::getInstance()->getString("StartAnim");
+char const* const _PREHASH_Action = LLMessageStringTable::getInstance()->getString("Action");
+char const* const _PREHASH_Location = LLMessageStringTable::getInstance()->getString("Location");
+char const* const _PREHASH_Rights = LLMessageStringTable::getInstance()->getString("Rights");
+char const* const _PREHASH_SearchDir = LLMessageStringTable::getInstance()->getString("SearchDir");
+char const* const _PREHASH_TransferRequest = LLMessageStringTable::getInstance()->getString("TransferRequest");
+char const* const _PREHASH_ScriptSensorRequest = LLMessageStringTable::getInstance()->getString("ScriptSensorRequest");
+char const* const _PREHASH_MoneyTransferRequest = LLMessageStringTable::getInstance()->getString("MoneyTransferRequest");
+char const* const _PREHASH_EjectGroupMemberRequest = LLMessageStringTable::getInstance()->getString("EjectGroupMemberRequest");
+char const* const _PREHASH_SkillsText = LLMessageStringTable::getInstance()->getString("SkillsText");
+char const* const _PREHASH_Resent = LLMessageStringTable::getInstance()->getString("Resent");
+char const* const _PREHASH_Center = LLMessageStringTable::getInstance()->getString("Center");
+char const* const _PREHASH_SharedData = LLMessageStringTable::getInstance()->getString("SharedData");
+char const* const _PREHASH_PSBlock = LLMessageStringTable::getInstance()->getString("PSBlock");
+char const* const _PREHASH_UUIDNameBlock = LLMessageStringTable::getInstance()->getString("UUIDNameBlock");
+char const* const _PREHASH_GroupTitleUpdate = LLMessageStringTable::getInstance()->getString("GroupTitleUpdate");
+char const* const _PREHASH_Method = LLMessageStringTable::getInstance()->getString("Method");
+char const* const _PREHASH_TouchName = LLMessageStringTable::getInstance()->getString("TouchName");
+char const* const _PREHASH_UpdateType = LLMessageStringTable::getInstance()->getString("UpdateType");
+char const* const _PREHASH_KickedFromEstateID = LLMessageStringTable::getInstance()->getString("KickedFromEstateID");
+char const* const _PREHASH_CandidateID = LLMessageStringTable::getInstance()->getString("CandidateID");
+char const* const _PREHASH_ParamData = LLMessageStringTable::getInstance()->getString("ParamData");
+char const* const _PREHASH_GodlikeMessage = LLMessageStringTable::getInstance()->getString("GodlikeMessage");
+char const* const _PREHASH_SystemMessage = LLMessageStringTable::getInstance()->getString("SystemMessage");
+char const* const _PREHASH_BodyRotation = LLMessageStringTable::getInstance()->getString("BodyRotation");
+char const* const _PREHASH_SearchRegions = LLMessageStringTable::getInstance()->getString("SearchRegions");
+char const* const _PREHASH_AnimationData = LLMessageStringTable::getInstance()->getString("AnimationData");
+char const* const _PREHASH_StatID = LLMessageStringTable::getInstance()->getString("StatID");
+char const* const _PREHASH_ItemID = LLMessageStringTable::getInstance()->getString("ItemID");
+char const* const _PREHASH_ScriptDialogReply = LLMessageStringTable::getInstance()->getString("ScriptDialogReply");
+char const* const _PREHASH_RegionIDAndHandleReply = LLMessageStringTable::getInstance()->getString("RegionIDAndHandleReply");
+char const* const _PREHASH_CameraAtOffset = LLMessageStringTable::getInstance()->getString("CameraAtOffset");
+char const* const _PREHASH_VoteID = LLMessageStringTable::getInstance()->getString("VoteID");
+char const* const _PREHASH_ParcelGodForceOwner = LLMessageStringTable::getInstance()->getString("ParcelGodForceOwner");
+char const* const _PREHASH_Filter = LLMessageStringTable::getInstance()->getString("Filter");
+char const* const _PREHASH_InviteData = LLMessageStringTable::getInstance()->getString("InviteData");
+char const* const _PREHASH_PCode = LLMessageStringTable::getInstance()->getString("PCode");
+char const* const _PREHASH_SearchPos = LLMessageStringTable::getInstance()->getString("SearchPos");
+char const* const _PREHASH_PreyID = LLMessageStringTable::getInstance()->getString("PreyID");
+char const* const _PREHASH_TerrainLowerLimit = LLMessageStringTable::getInstance()->getString("TerrainLowerLimit");
+char const* const _PREHASH_EventFlags = LLMessageStringTable::getInstance()->getString("EventFlags");
+char const* const _PREHASH_TallyVotes = LLMessageStringTable::getInstance()->getString("TallyVotes");
+char const* const _PREHASH_Result = LLMessageStringTable::getInstance()->getString("Result");
+char const* const _PREHASH_LookAt = LLMessageStringTable::getInstance()->getString("LookAt");
+char const* const _PREHASH_SearchOrder = LLMessageStringTable::getInstance()->getString("SearchOrder");
+char const* const _PREHASH_PayButton = LLMessageStringTable::getInstance()->getString("PayButton");
+char const* const _PREHASH_SelfCount = LLMessageStringTable::getInstance()->getString("SelfCount");
+char const* const _PREHASH_PacketCount = LLMessageStringTable::getInstance()->getString("PacketCount");
+char const* const _PREHASH_ParcelBuyPass = LLMessageStringTable::getInstance()->getString("ParcelBuyPass");
+char const* const _PREHASH_OldItemID = LLMessageStringTable::getInstance()->getString("OldItemID");
+char const* const _PREHASH_RegionPort = LLMessageStringTable::getInstance()->getString("RegionPort");
+char const* const _PREHASH_PriceEnergyUnit = LLMessageStringTable::getInstance()->getString("PriceEnergyUnit");
+char const* const _PREHASH_Bitmap = LLMessageStringTable::getInstance()->getString("Bitmap");
+char const* const _PREHASH_CacheMissType = LLMessageStringTable::getInstance()->getString("CacheMissType");
+char const* const _PREHASH_VFileID = LLMessageStringTable::getInstance()->getString("VFileID");
+char const* const _PREHASH_GroupInsigniaID = LLMessageStringTable::getInstance()->getString("GroupInsigniaID");
+char const* const _PREHASH_Online = LLMessageStringTable::getInstance()->getString("Online");
+char const* const _PREHASH_KickFlags = LLMessageStringTable::getInstance()->getString("KickFlags");
+char const* const _PREHASH_CovenantID = LLMessageStringTable::getInstance()->getString("CovenantID");
+char const* const _PREHASH_SysCPU = LLMessageStringTable::getInstance()->getString("SysCPU");
+char const* const _PREHASH_EMail = LLMessageStringTable::getInstance()->getString("EMail");
+char const* const _PREHASH_AggregatePermTextures = LLMessageStringTable::getInstance()->getString("AggregatePermTextures");
+char const* const _PREHASH_ChatChannel = LLMessageStringTable::getInstance()->getString("ChatChannel");
+char const* const _PREHASH_ReturnID = LLMessageStringTable::getInstance()->getString("ReturnID");
+char const* const _PREHASH_ObjectAttach = LLMessageStringTable::getInstance()->getString("ObjectAttach");
+char const* const _PREHASH_TargetPort = LLMessageStringTable::getInstance()->getString("TargetPort");
+char const* const _PREHASH_ObjectSpinStop = LLMessageStringTable::getInstance()->getString("ObjectSpinStop");
+char const* const _PREHASH_FullID = LLMessageStringTable::getInstance()->getString("FullID");
+char const* const _PREHASH_ActivateGroup = LLMessageStringTable::getInstance()->getString("ActivateGroup");
+char const* const _PREHASH_SysGPU = LLMessageStringTable::getInstance()->getString("SysGPU");
+char const* const _PREHASH_AvatarInterestsReply = LLMessageStringTable::getInstance()->getString("AvatarInterestsReply");
+char const* const _PREHASH_StartLure = LLMessageStringTable::getInstance()->getString("StartLure");
+char const* const _PREHASH_SysRAM = LLMessageStringTable::getInstance()->getString("SysRAM");
+char const* const _PREHASH_ObjectPosition = LLMessageStringTable::getInstance()->getString("ObjectPosition");
+char const* const _PREHASH_SitPosition = LLMessageStringTable::getInstance()->getString("SitPosition");
+char const* const _PREHASH_StartTime = LLMessageStringTable::getInstance()->getString("StartTime");
+char const* const _PREHASH_BornOn = LLMessageStringTable::getInstance()->getString("BornOn");
+char const* const _PREHASH_CameraCollidePlane = LLMessageStringTable::getInstance()->getString("CameraCollidePlane");
+char const* const _PREHASH_EconomyDataRequest = LLMessageStringTable::getInstance()->getString("EconomyDataRequest");
+char const* const _PREHASH_TeleportLureRequest = LLMessageStringTable::getInstance()->getString("TeleportLureRequest");
+char const* const _PREHASH_FolderID = LLMessageStringTable::getInstance()->getString("FolderID");
+char const* const _PREHASH_RegionHandleRequest = LLMessageStringTable::getInstance()->getString("RegionHandleRequest");
+char const* const _PREHASH_ScriptDataRequest = LLMessageStringTable::getInstance()->getString("ScriptDataRequest");
+char const* const _PREHASH_GroupRoleDataRequest = LLMessageStringTable::getInstance()->getString("GroupRoleDataRequest");
+char const* const _PREHASH_GroupTitlesRequest = LLMessageStringTable::getInstance()->getString("GroupTitlesRequest");
+char const* const _PREHASH_AgentWearablesRequest = LLMessageStringTable::getInstance()->getString("AgentWearablesRequest");
+char const* const _PREHASH_MapBlockRequest = LLMessageStringTable::getInstance()->getString("MapBlockRequest");
+char const* const _PREHASH_LureID = LLMessageStringTable::getInstance()->getString("LureID");
+char const* const _PREHASH_CopyCenters = LLMessageStringTable::getInstance()->getString("CopyCenters");
+char const* const _PREHASH_ParamList = LLMessageStringTable::getInstance()->getString("ParamList");
+char const* const _PREHASH_InventorySerial = LLMessageStringTable::getInstance()->getString("InventorySerial");
+char const* const _PREHASH_EdgeDataPacket = LLMessageStringTable::getInstance()->getString("EdgeDataPacket");
+char const* const _PREHASH_AvatarPickerReply = LLMessageStringTable::getInstance()->getString("AvatarPickerReply");
+char const* const _PREHASH_ParcelDwellReply = LLMessageStringTable::getInstance()->getString("ParcelDwellReply");
+char const* const _PREHASH_IsForSale = LLMessageStringTable::getInstance()->getString("IsForSale");
+char const* const _PREHASH_MuteID = LLMessageStringTable::getInstance()->getString("MuteID");
+char const* const _PREHASH_MeanCollisionAlert = LLMessageStringTable::getInstance()->getString("MeanCollisionAlert");
+char const* const _PREHASH_CanAcceptTasks = LLMessageStringTable::getInstance()->getString("CanAcceptTasks");
+char const* const _PREHASH_ItemData = LLMessageStringTable::getInstance()->getString("ItemData");
+char const* const _PREHASH_AnimationList = LLMessageStringTable::getInstance()->getString("AnimationList");
+char const* const _PREHASH_Reputation = LLMessageStringTable::getInstance()->getString("Reputation");
+char const* const _PREHASH_IntValue = LLMessageStringTable::getInstance()->getString("IntValue");
+char const* const _PREHASH_TargetType = LLMessageStringTable::getInstance()->getString("TargetType");
+char const* const _PREHASH_Amount = LLMessageStringTable::getInstance()->getString("Amount");
+char const* const _PREHASH_HasAttachment = LLMessageStringTable::getInstance()->getString("HasAttachment");
+char const* const _PREHASH_UpdateAttachment = LLMessageStringTable::getInstance()->getString("UpdateAttachment");
+char const* const _PREHASH_RemoveAttachment = LLMessageStringTable::getInstance()->getString("RemoveAttachment");
+char const* const _PREHASH_HeightWidthBlock = LLMessageStringTable::getInstance()->getString("HeightWidthBlock");
+char const* const _PREHASH_RequestObjectPropertiesFamily = LLMessageStringTable::getInstance()->getString("RequestObjectPropertiesFamily");
+char const* const _PREHASH_ObjectPropertiesFamily = LLMessageStringTable::getInstance()->getString("ObjectPropertiesFamily");
+char const* const _PREHASH_UserData = LLMessageStringTable::getInstance()->getString("UserData");
+char const* const _PREHASH_IsReadable = LLMessageStringTable::getInstance()->getString("IsReadable");
+char const* const _PREHASH_PathCurve = LLMessageStringTable::getInstance()->getString("PathCurve");
+char const* const _PREHASH_Status = LLMessageStringTable::getInstance()->getString("Status");
+char const* const _PREHASH_FromGroup = LLMessageStringTable::getInstance()->getString("FromGroup");
+char const* const _PREHASH_AlreadyVoted = LLMessageStringTable::getInstance()->getString("AlreadyVoted");
+char const* const _PREHASH_PlacesReply = LLMessageStringTable::getInstance()->getString("PlacesReply");
+char const* const _PREHASH_DirPlacesReply = LLMessageStringTable::getInstance()->getString("DirPlacesReply");
+char const* const _PREHASH_ParcelBuy = LLMessageStringTable::getInstance()->getString("ParcelBuy");
+char const* const _PREHASH_DirFindQueryBackend = LLMessageStringTable::getInstance()->getString("DirFindQueryBackend");
+char const* const _PREHASH_DirPlacesQueryBackend = LLMessageStringTable::getInstance()->getString("DirPlacesQueryBackend");
+char const* const _PREHASH_DirClassifiedQueryBackend = LLMessageStringTable::getInstance()->getString("DirClassifiedQueryBackend");
+char const* const _PREHASH_DirLandQueryBackend = LLMessageStringTable::getInstance()->getString("DirLandQueryBackend");
+char const* const _PREHASH_DirPopularQueryBackend = LLMessageStringTable::getInstance()->getString("DirPopularQueryBackend");
+char const* const _PREHASH_HistoryData = LLMessageStringTable::getInstance()->getString("HistoryData");
+char const* const _PREHASH_SnapshotID = LLMessageStringTable::getInstance()->getString("SnapshotID");
+char const* const _PREHASH_Aspect = LLMessageStringTable::getInstance()->getString("Aspect");
+char const* const _PREHASH_ParamSize = LLMessageStringTable::getInstance()->getString("ParamSize");
+char const* const _PREHASH_VoteCast = LLMessageStringTable::getInstance()->getString("VoteCast");
+char const* const _PREHASH_CastsShadows = LLMessageStringTable::getInstance()->getString("CastsShadows");
+char const* const _PREHASH_EveryoneMask = LLMessageStringTable::getInstance()->getString("EveryoneMask");
+char const* const _PREHASH_ObjectSpinUpdate = LLMessageStringTable::getInstance()->getString("ObjectSpinUpdate");
+char const* const _PREHASH_MaturePublish = LLMessageStringTable::getInstance()->getString("MaturePublish");
+char const* const _PREHASH_UseExistingAsset = LLMessageStringTable::getInstance()->getString("UseExistingAsset");
+char const* const _PREHASH_Powers = LLMessageStringTable::getInstance()->getString("Powers");
+char const* const _PREHASH_ParcelLocalID = LLMessageStringTable::getInstance()->getString("ParcelLocalID");
+char const* const _PREHASH_TeleportCancel = LLMessageStringTable::getInstance()->getString("TeleportCancel");
+char const* const _PREHASH_UnixTime = LLMessageStringTable::getInstance()->getString("UnixTime");
+char const* const _PREHASH_QueryFlags = LLMessageStringTable::getInstance()->getString("QueryFlags");
+char const* const _PREHASH_AlwaysRun = LLMessageStringTable::getInstance()->getString("AlwaysRun");
+char const* const _PREHASH_Bottom = LLMessageStringTable::getInstance()->getString("Bottom");
+char const* const _PREHASH_ButtonData = LLMessageStringTable::getInstance()->getString("ButtonData");
+char const* const _PREHASH_SoundData = LLMessageStringTable::getInstance()->getString("SoundData");
+char const* const _PREHASH_ViewerStats = LLMessageStringTable::getInstance()->getString("ViewerStats");
+char const* const _PREHASH_RegionHandshake = LLMessageStringTable::getInstance()->getString("RegionHandshake");
+char const* const _PREHASH_ObjectDescription = LLMessageStringTable::getInstance()->getString("ObjectDescription");
+char const* const _PREHASH_Description = LLMessageStringTable::getInstance()->getString("Description");
+char const* const _PREHASH_ParamType = LLMessageStringTable::getInstance()->getString("ParamType");
+char const* const _PREHASH_UUIDNameReply = LLMessageStringTable::getInstance()->getString("UUIDNameReply");
+char const* const _PREHASH_UUIDGroupNameReply = LLMessageStringTable::getInstance()->getString("UUIDGroupNameReply");
+char const* const _PREHASH_SaveAssetIntoInventory = LLMessageStringTable::getInstance()->getString("SaveAssetIntoInventory");
+char const* const _PREHASH_UserInfo = LLMessageStringTable::getInstance()->getString("UserInfo");
+char const* const _PREHASH_AnimSequenceID = LLMessageStringTable::getInstance()->getString("AnimSequenceID");
+char const* const _PREHASH_NVPairs = LLMessageStringTable::getInstance()->getString("NVPairs");
+char const* const _PREHASH_GroupNoticesListRequest = LLMessageStringTable::getInstance()->getString("GroupNoticesListRequest");
+char const* const _PREHASH_ParcelAccessListRequest = LLMessageStringTable::getInstance()->getString("ParcelAccessListRequest");
+char const* const _PREHASH_MuteListRequest = LLMessageStringTable::getInstance()->getString("MuteListRequest");
+char const* const _PREHASH_RpcChannelRequest = LLMessageStringTable::getInstance()->getString("RpcChannelRequest");
+char const* const _PREHASH_LandStatRequest = LLMessageStringTable::getInstance()->getString("LandStatRequest");
+char const* const _PREHASH_PlacesQuery = LLMessageStringTable::getInstance()->getString("PlacesQuery");
+char const* const _PREHASH_DirPlacesQuery = LLMessageStringTable::getInstance()->getString("DirPlacesQuery");
+char const* const _PREHASH_SortOrder = LLMessageStringTable::getInstance()->getString("SortOrder");
+char const* const _PREHASH_Hunter = LLMessageStringTable::getInstance()->getString("Hunter");
+char const* const _PREHASH_SunAngVelocity = LLMessageStringTable::getInstance()->getString("SunAngVelocity");
+char const* const _PREHASH_BinaryBucket = LLMessageStringTable::getInstance()->getString("BinaryBucket");
+char const* const _PREHASH_ImagePacket = LLMessageStringTable::getInstance()->getString("ImagePacket");
+char const* const _PREHASH_StartGroupProposal = LLMessageStringTable::getInstance()->getString("StartGroupProposal");
+char const* const _PREHASH_EnergyLevel = LLMessageStringTable::getInstance()->getString("EnergyLevel");
+char const* const _PREHASH_PriceForListing = LLMessageStringTable::getInstance()->getString("PriceForListing");
+char const* const _PREHASH_Scale = LLMessageStringTable::getInstance()->getString("Scale");
+char const* const _PREHASH_EstateCovenantReply = LLMessageStringTable::getInstance()->getString("EstateCovenantReply");
+char const* const _PREHASH_ParentEstateID = LLMessageStringTable::getInstance()->getString("ParentEstateID");
+char const* const _PREHASH_Extra2 = LLMessageStringTable::getInstance()->getString("Extra2");
+char const* const _PREHASH_Throttle = LLMessageStringTable::getInstance()->getString("Throttle");
+char const* const _PREHASH_SimIP = LLMessageStringTable::getInstance()->getString("SimIP");
+char const* const _PREHASH_GodID = LLMessageStringTable::getInstance()->getString("GodID");
+char const* const _PREHASH_TeleportMinPrice = LLMessageStringTable::getInstance()->getString("TeleportMinPrice");
+char const* const _PREHASH_VoteItem = LLMessageStringTable::getInstance()->getString("VoteItem");
+char const* const _PREHASH_ObjectRotation = LLMessageStringTable::getInstance()->getString("ObjectRotation");
+char const* const _PREHASH_SitRotation = LLMessageStringTable::getInstance()->getString("SitRotation");
+char const* const _PREHASH_SnapSelection = LLMessageStringTable::getInstance()->getString("SnapSelection");
+char const* const _PREHASH_SoundTrigger = LLMessageStringTable::getInstance()->getString("SoundTrigger");
+char const* const _PREHASH_TerrainRaiseLimit = LLMessageStringTable::getInstance()->getString("TerrainRaiseLimit");
+char const* const _PREHASH_Quorum = LLMessageStringTable::getInstance()->getString("Quorum");
+char const* const _PREHASH_AgentBlock = LLMessageStringTable::getInstance()->getString("AgentBlock");
+char const* const _PREHASH_CommandBlock = LLMessageStringTable::getInstance()->getString("CommandBlock");
+char const* const _PREHASH_PricePublicObjectDecay = LLMessageStringTable::getInstance()->getString("PricePublicObjectDecay");
+char const* const _PREHASH_SpawnPointPos = LLMessageStringTable::getInstance()->getString("SpawnPointPos");
+char const* const _PREHASH_VolumeDetail = LLMessageStringTable::getInstance()->getString("VolumeDetail");
+char const* const _PREHASH_FromAgentName = LLMessageStringTable::getInstance()->getString("FromAgentName");
+char const* const _PREHASH_Range = LLMessageStringTable::getInstance()->getString("Range");
+char const* const _PREHASH_DirectoryVisibility = LLMessageStringTable::getInstance()->getString("DirectoryVisibility");
+char const* const _PREHASH_PublicIP = LLMessageStringTable::getInstance()->getString("PublicIP");
+char const* const _PREHASH_TeleportFailed = LLMessageStringTable::getInstance()->getString("TeleportFailed");
+char const* const _PREHASH_PreloadSound = LLMessageStringTable::getInstance()->getString("PreloadSound");
+char const* const _PREHASH_ScreenshotID = LLMessageStringTable::getInstance()->getString("ScreenshotID");
+char const* const _PREHASH_CovenantTimestamp = LLMessageStringTable::getInstance()->getString("CovenantTimestamp");
+char const* const _PREHASH_OldestUnacked = LLMessageStringTable::getInstance()->getString("OldestUnacked");
+char const* const _PREHASH_SimulatorIP = LLMessageStringTable::getInstance()->getString("SimulatorIP");
+char const* const _PREHASH_Value = LLMessageStringTable::getInstance()->getString("Value");
+char const* const _PREHASH_JointAxisOrAnchor = LLMessageStringTable::getInstance()->getString("JointAxisOrAnchor");
+char const* const _PREHASH_Test0 = LLMessageStringTable::getInstance()->getString("Test0");
+char const* const _PREHASH_Test1 = LLMessageStringTable::getInstance()->getString("Test1");
+char const* const _PREHASH_Test2 = LLMessageStringTable::getInstance()->getString("Test2");
+char const* const _PREHASH_SunPhase = LLMessageStringTable::getInstance()->getString("SunPhase");
+char const* const _PREHASH_ParcelDivide = LLMessageStringTable::getInstance()->getString("ParcelDivide");
+char const* const _PREHASH_PriceObjectClaim = LLMessageStringTable::getInstance()->getString("PriceObjectClaim");
+char const* const _PREHASH_Field = LLMessageStringTable::getInstance()->getString("Field");
+char const* const _PREHASH_Ratio = LLMessageStringTable::getInstance()->getString("Ratio");
+char const* const _PREHASH_JoinGroupReply = LLMessageStringTable::getInstance()->getString("JoinGroupReply");
+char const* const _PREHASH_LiveHelpGroupReply = LLMessageStringTable::getInstance()->getString("LiveHelpGroupReply");
+char const* const _PREHASH_Score = LLMessageStringTable::getInstance()->getString("Score");
+char const* const _PREHASH_Image = LLMessageStringTable::getInstance()->getString("Image");
+char const* const _PREHASH_ObjectClickAction = LLMessageStringTable::getInstance()->getString("ObjectClickAction");
+char const* const _PREHASH_Parameter = LLMessageStringTable::getInstance()->getString("Parameter");
+char const* const _PREHASH_Flags = LLMessageStringTable::getInstance()->getString("Flags");
+char const* const _PREHASH_Plane = LLMessageStringTable::getInstance()->getString("Plane");
+char const* const _PREHASH_Width = LLMessageStringTable::getInstance()->getString("Width");
+char const* const _PREHASH_Right = LLMessageStringTable::getInstance()->getString("Right");
+char const* const _PREHASH_DirFindQuery = LLMessageStringTable::getInstance()->getString("DirFindQuery");
+char const* const _PREHASH_Textures = LLMessageStringTable::getInstance()->getString("Textures");
+char const* const _PREHASH_EventData = LLMessageStringTable::getInstance()->getString("EventData");
+char const* const _PREHASH_Final = LLMessageStringTable::getInstance()->getString("Final");
+char const* const _PREHASH_System = LLMessageStringTable::getInstance()->getString("System");
+char const* const _PREHASH_TelehubPos = LLMessageStringTable::getInstance()->getString("TelehubPos");
+char const* const _PREHASH_ReportAutosaveCrash = LLMessageStringTable::getInstance()->getString("ReportAutosaveCrash");
+char const* const _PREHASH_CreateTrustedCircuit = LLMessageStringTable::getInstance()->getString("CreateTrustedCircuit");
+char const* const _PREHASH_DenyTrustedCircuit = LLMessageStringTable::getInstance()->getString("DenyTrustedCircuit");
+char const* const _PREHASH_RequestTrustedCircuit = LLMessageStringTable::getInstance()->getString("RequestTrustedCircuit");
+char const* const _PREHASH_Codec = LLMessageStringTable::getInstance()->getString("Codec");
+char const* const _PREHASH_Modal = LLMessageStringTable::getInstance()->getString("Modal");
+char const* const _PREHASH_ChildAgentUnknown = LLMessageStringTable::getInstance()->getString("ChildAgentUnknown");
+char const* const _PREHASH_LandingType = LLMessageStringTable::getInstance()->getString("LandingType");
+char const* const _PREHASH_ScriptRunningReply = LLMessageStringTable::getInstance()->getString("ScriptRunningReply");
+char const* const _PREHASH_Reply = LLMessageStringTable::getInstance()->getString("Reply");
+char const* const _PREHASH_GroupAccountDetailsReply = LLMessageStringTable::getInstance()->getString("GroupAccountDetailsReply");
+char const* const _PREHASH_TelehubRot = LLMessageStringTable::getInstance()->getString("TelehubRot");
+char const* const _PREHASH_AcceptFriendship = LLMessageStringTable::getInstance()->getString("AcceptFriendship");
+char const* const _PREHASH_ItemType = LLMessageStringTable::getInstance()->getString("ItemType");
+char const* const _PREHASH_DwellInfo = LLMessageStringTable::getInstance()->getString("DwellInfo");
+char const* const _PREHASH_AgentResume = LLMessageStringTable::getInstance()->getString("AgentResume");
+char const* const _PREHASH_MailFilter = LLMessageStringTable::getInstance()->getString("MailFilter");
+char const* const _PREHASH_Disconnect = LLMessageStringTable::getInstance()->getString("Disconnect");
+char const* const _PREHASH_SimPosition = LLMessageStringTable::getInstance()->getString("SimPosition");
+char const* const _PREHASH_SimWideTotalPrims = LLMessageStringTable::getInstance()->getString("SimWideTotalPrims");
+char const* const _PREHASH_Index = LLMessageStringTable::getInstance()->getString("Index");
+char const* const _PREHASH_SimFilename = LLMessageStringTable::getInstance()->getString("SimFilename");
+char const* const _PREHASH_LastOwnerID = LLMessageStringTable::getInstance()->getString("LastOwnerID");
+char const* const _PREHASH_GroupNoticeRequest = LLMessageStringTable::getInstance()->getString("GroupNoticeRequest");
+char const* const _PREHASH_EmailMessageRequest = LLMessageStringTable::getInstance()->getString("EmailMessageRequest");
+char const* const _PREHASH_MapItemRequest = LLMessageStringTable::getInstance()->getString("MapItemRequest");
+char const* const _PREHASH_AgentCount = LLMessageStringTable::getInstance()->getString("AgentCount");
+char const* const _PREHASH_MessageBlock = LLMessageStringTable::getInstance()->getString("MessageBlock");
+char const* const _PREHASH_FuseBlock = LLMessageStringTable::getInstance()->getString("FuseBlock");
+char const* const _PREHASH_AgentGroupData = LLMessageStringTable::getInstance()->getString("AgentGroupData");
+char const* const _PREHASH_ClassifiedInfoUpdate = LLMessageStringTable::getInstance()->getString("ClassifiedInfoUpdate");
+char const* const _PREHASH_RegionPos = LLMessageStringTable::getInstance()->getString("RegionPos");
+char const* const _PREHASH_ParcelMediaUpdate = LLMessageStringTable::getInstance()->getString("ParcelMediaUpdate");
+char const* const _PREHASH_NoticeID = LLMessageStringTable::getInstance()->getString("NoticeID");
+char const* const _PREHASH_GridX = LLMessageStringTable::getInstance()->getString("GridX");
+char const* const _PREHASH_GridY = LLMessageStringTable::getInstance()->getString("GridY");
+char const* const _PREHASH_Title = LLMessageStringTable::getInstance()->getString("Title");
+char const* const _PREHASH_AuctionID = LLMessageStringTable::getInstance()->getString("AuctionID");
+char const* const _PREHASH_VoteType = LLMessageStringTable::getInstance()->getString("VoteType");
+char const* const _PREHASH_CategoryID = LLMessageStringTable::getInstance()->getString("CategoryID");
+char const* const _PREHASH_Token = LLMessageStringTable::getInstance()->getString("Token");
+char const* const _PREHASH_AggregatePerms = LLMessageStringTable::getInstance()->getString("AggregatePerms");
+char const* const _PREHASH_ObjectSelect = LLMessageStringTable::getInstance()->getString("ObjectSelect");
+char const* const _PREHASH_ForceObjectSelect = LLMessageStringTable::getInstance()->getString("ForceObjectSelect");
+char const* const _PREHASH_Price = LLMessageStringTable::getInstance()->getString("Price");
+char const* const _PREHASH_SunDirection = LLMessageStringTable::getInstance()->getString("SunDirection");
+char const* const _PREHASH_FromName = LLMessageStringTable::getInstance()->getString("FromName");
+char const* const _PREHASH_ChangeInventoryItemFlags = LLMessageStringTable::getInstance()->getString("ChangLLInventoryItemFlags");
+char const* const _PREHASH_Force = LLMessageStringTable::getInstance()->getString("Force");
+char const* const _PREHASH_TransactionBlock = LLMessageStringTable::getInstance()->getString("TransactionBlock");
+char const* const _PREHASH_PowersMask = LLMessageStringTable::getInstance()->getString("PowersMask");
+char const* const _PREHASH_Stamp = LLMessageStringTable::getInstance()->getString("Stamp");
+char const* const _PREHASH_TotalCredits = LLMessageStringTable::getInstance()->getString("TotalCredits");
+char const* const _PREHASH_State = LLMessageStringTable::getInstance()->getString("State");
+char const* const _PREHASH_TextureIndex = LLMessageStringTable::getInstance()->getString("TextureIndex");
+char const* const _PREHASH_InviteeID = LLMessageStringTable::getInstance()->getString("InviteeID");
+char const* const _PREHASH_ParcelReclaim = LLMessageStringTable::getInstance()->getString("ParcelReclaim");
+char const* const _PREHASH_Money = LLMessageStringTable::getInstance()->getString("Money");
+char const* const _PREHASH_PathTwist = LLMessageStringTable::getInstance()->getString("PathTwist");
+char const* const _PREHASH_AuthBuyerID = LLMessageStringTable::getInstance()->getString("AuthBuyerID");
+char const* const _PREHASH_Color = LLMessageStringTable::getInstance()->getString("Color");
+char const* const _PREHASH_SourceType = LLMessageStringTable::getInstance()->getString("SourceType");
+char const* const _PREHASH_World = LLMessageStringTable::getInstance()->getString("World");
+char const* const _PREHASH_QueryData = LLMessageStringTable::getInstance()->getString("QueryData");
+char const* const _PREHASH_Users = LLMessageStringTable::getInstance()->getString("Users");
+char const* const _PREHASH_SysOS = LLMessageStringTable::getInstance()->getString("SysOS");
+char const* const _PREHASH_Notes = LLMessageStringTable::getInstance()->getString("Notes");
+char const* const _PREHASH_AvatarID = LLMessageStringTable::getInstance()->getString("AvatarID");
+char const* const _PREHASH_FounderID = LLMessageStringTable::getInstance()->getString("FounderID");
+char const* const _PREHASH_EndPointID = LLMessageStringTable::getInstance()->getString("EndPointID");
+char const* const _PREHASH_LocationLookAt = LLMessageStringTable::getInstance()->getString("LocationLookAt");
+char const* const _PREHASH_Sound = LLMessageStringTable::getInstance()->getString("Sound");
+char const* const _PREHASH_Cover = LLMessageStringTable::getInstance()->getString("Cover");
+char const* const _PREHASH_TotalObjectCount = LLMessageStringTable::getInstance()->getString("TotalObjectCount");
+char const* const _PREHASH_TextureEntry = LLMessageStringTable::getInstance()->getString("TextureEntry");
+char const* const _PREHASH_SquareMetersCommitted = LLMessageStringTable::getInstance()->getString("SquareMetersCommitted");
+char const* const _PREHASH_ChannelID = LLMessageStringTable::getInstance()->getString("ChannelID");
+char const* const _PREHASH_Dwell = LLMessageStringTable::getInstance()->getString("Dwell");
+char const* const _PREHASH_North = LLMessageStringTable::getInstance()->getString("North");
+char const* const _PREHASH_AgentUpdate = LLMessageStringTable::getInstance()->getString("AgentUpdate");
+char const* const _PREHASH_PickGodDelete = LLMessageStringTable::getInstance()->getString("PickGodDelete");
+char const* const _PREHASH_HostName = LLMessageStringTable::getInstance()->getString("HostName");
+char const* const _PREHASH_PriceParcelClaim = LLMessageStringTable::getInstance()->getString("PriceParcelClaim");
+char const* const _PREHASH_ParcelClaim = LLMessageStringTable::getInstance()->getString("ParcelClaim");
+char const* const _PREHASH_AgentPowers = LLMessageStringTable::getInstance()->getString("AgentPowers");
+char const* const _PREHASH_ProfileHollow = LLMessageStringTable::getInstance()->getString("ProfileHollow");
+char const* const _PREHASH_GroupRoleChanges = LLMessageStringTable::getInstance()->getString("GroupRoleChanges");
+char const* const _PREHASH_Count = LLMessageStringTable::getInstance()->getString("Count");
+char const* const _PREHASH_South = LLMessageStringTable::getInstance()->getString("South");
+char const* const _PREHASH_ObjectUpdateCompressed = LLMessageStringTable::getInstance()->getString("ObjectUpdateCompressed");
+char const* const _PREHASH_MuteFlags = LLMessageStringTable::getInstance()->getString("MuteFlags");
+char const* const _PREHASH_Group = LLMessageStringTable::getInstance()->getString("Group");
+char const* const _PREHASH_AgentPause = LLMessageStringTable::getInstance()->getString("AgentPause");
+char const* const _PREHASH_LanguagesText = LLMessageStringTable::getInstance()->getString("LanguagesText");
+char const* const _PREHASH_Error = LLMessageStringTable::getInstance()->getString("Error");
+char const* const _PREHASH_InternalScriptMail = LLMessageStringTable::getInstance()->getString("InternalScriptMail");
+char const* const _PREHASH_FindAgent = LLMessageStringTable::getInstance()->getString("FindAgent");
+char const* const _PREHASH_AgentData = LLMessageStringTable::getInstance()->getString("AgentData");
+char const* const _PREHASH_FolderData = LLMessageStringTable::getInstance()->getString("FolderData");
+char const* const _PREHASH_AssetBlock = LLMessageStringTable::getInstance()->getString("AssetBlock");
+char const* const _PREHASH_AcceptNotices = LLMessageStringTable::getInstance()->getString("AcceptNotices");
+char const* const _PREHASH_SetGroupAcceptNotices = LLMessageStringTable::getInstance()->getString("SetGroupAcceptNotices");
+char const* const _PREHASH_CloseCircuit = LLMessageStringTable::getInstance()->getString("CloseCircuit");
+char const* const _PREHASH_TeleportFinish = LLMessageStringTable::getInstance()->getString("TeleportFinish");
+char const* const _PREHASH_PathRevolutions = LLMessageStringTable::getInstance()->getString("PathRevolutions");
+char const* const _PREHASH_ClassifiedInfoReply = LLMessageStringTable::getInstance()->getString("ClassifiedInfoReply");
+char const* const _PREHASH_ParcelInfoReply = LLMessageStringTable::getInstance()->getString("ParcelInfoReply");
+char const* const _PREHASH_AutosaveData = LLMessageStringTable::getInstance()->getString("AutosaveData");
+char const* const _PREHASH_SetStartLocation = LLMessageStringTable::getInstance()->getString("SetStartLocation");
+char const* const _PREHASH_PassHours = LLMessageStringTable::getInstance()->getString("PassHours");
+char const* const _PREHASH_AttachmentPt = LLMessageStringTable::getInstance()->getString("AttachmentPt");
+char const* const _PREHASH_ParcelFlags = LLMessageStringTable::getInstance()->getString("ParcelFlags");
+char const* const _PREHASH_NumVotes = LLMessageStringTable::getInstance()->getString("NumVotes");
+char const* const _PREHASH_AvatarPickerRequest = LLMessageStringTable::getInstance()->getString("AvatarPickerRequest");
+char const* const _PREHASH_TeleportLocationRequest = LLMessageStringTable::getInstance()->getString("TeleportLocationRequest");
+char const* const _PREHASH_DataHomeLocationRequest = LLMessageStringTable::getInstance()->getString("DataHomeLocationRequest");
+char const* const _PREHASH_EventNotificationAddRequest = LLMessageStringTable::getInstance()->getString("EventNotificationAddRequest");
+char const* const _PREHASH_ParcelDwellRequest = LLMessageStringTable::getInstance()->getString("ParcelDwellRequest");
+char const* const _PREHASH_EventLocationRequest = LLMessageStringTable::getInstance()->getString("EventLocationRequest");
+char const* const _PREHASH_SetStartLocationRequest = LLMessageStringTable::getInstance()->getString("SetStartLocationRequest");
+char const* const _PREHASH_QueryStart = LLMessageStringTable::getInstance()->getString("QueryStart");
+char const* const _PREHASH_EjectData = LLMessageStringTable::getInstance()->getString("EjectData");
+char const* const _PREHASH_AvatarTextureUpdate = LLMessageStringTable::getInstance()->getString("AvatarTextureUpdate");
+char const* const _PREHASH_RPCServerPort = LLMessageStringTable::getInstance()->getString("RPCServerPort");
+char const* const _PREHASH_Bytes = LLMessageStringTable::getInstance()->getString("Bytes");
+char const* const _PREHASH_Extra = LLMessageStringTable::getInstance()->getString("Extra");
+char const* const _PREHASH_ForceScriptControlRelease = LLMessageStringTable::getInstance()->getString("ForceScriptControlRelease");
+char const* const _PREHASH_ParcelRelease = LLMessageStringTable::getInstance()->getString("ParcelRelease");
+char const* const _PREHASH_VFileType = LLMessageStringTable::getInstance()->getString("VFileType");
+char const* const _PREHASH_EjectGroupMemberReply = LLMessageStringTable::getInstance()->getString("EjectGroupMemberReply");
+char const* const _PREHASH_ImageData = LLMessageStringTable::getInstance()->getString("ImageData");
+char const* const _PREHASH_SimulatorViewerTimeMessage = LLMessageStringTable::getInstance()->getString("SimulatorViewerTimeMessage");
+char const* const _PREHASH_Rotation = LLMessageStringTable::getInstance()->getString("Rotation");
+char const* const _PREHASH_Selection = LLMessageStringTable::getInstance()->getString("Selection");
+char const* const _PREHASH_TransactionData = LLMessageStringTable::getInstance()->getString("TransactionData");
+char const* const _PREHASH_OperationData = LLMessageStringTable::getInstance()->getString("OperationData");
+char const* const _PREHASH_ExpirationDate = LLMessageStringTable::getInstance()->getString("ExpirationDate");
+char const* const _PREHASH_ParcelDeedToGroup = LLMessageStringTable::getInstance()->getString("ParcelDeedToGroup");
+char const* const _PREHASH_AvatarPicksReply = LLMessageStringTable::getInstance()->getString("AvatarPicksReply");
+char const* const _PREHASH_GroupTitlesReply = LLMessageStringTable::getInstance()->getString("GroupTitlesReply");
+char const* const _PREHASH_AgentInfo = LLMessageStringTable::getInstance()->getString("AgentInfo");
+char const* const _PREHASH_MoneyTransferBackend = LLMessageStringTable::getInstance()->getString("MoneyTransferBackend");
+char const* const _PREHASH_NextOwnerMask = LLMessageStringTable::getInstance()->getString("NextOwnerMask");
+char const* const _PREHASH_MuteData = LLMessageStringTable::getInstance()->getString("MuteData");
+char const* const _PREHASH_PassPrice = LLMessageStringTable::getInstance()->getString("PassPrice");
+char const* const _PREHASH_SourceID = LLMessageStringTable::getInstance()->getString("SourceID");
+char const* const _PREHASH_ChangeUserRights = LLMessageStringTable::getInstance()->getString("ChangeUserRights");
+char const* const _PREHASH_TeleportFlags = LLMessageStringTable::getInstance()->getString("TeleportFlags");
+char const* const _PREHASH_SlaveParcelData = LLMessageStringTable::getInstance()->getString("SlaveParcelData");
+char const* const _PREHASH_AssetData = LLMessageStringTable::getInstance()->getString("AssetData");
+char const* const _PREHASH_MultipleObjectUpdate = LLMessageStringTable::getInstance()->getString("MultipleObjectUpdate");
+char const* const _PREHASH_ObjectUpdate = LLMessageStringTable::getInstance()->getString("ObjectUpdate");
+char const* const _PREHASH_ImprovedTerseObjectUpdate = LLMessageStringTable::getInstance()->getString("ImprovedTerseObjectUpdate");
+char const* const _PREHASH_ConfirmXferPacket = LLMessageStringTable::getInstance()->getString("ConfirmXferPacket");
+char const* const _PREHASH_StartPingCheck = LLMessageStringTable::getInstance()->getString("StartPingCheck");
+char const* const _PREHASH_SimWideDeletes = LLMessageStringTable::getInstance()->getString("SimWideDeletes");
+char const* const _PREHASH_LandStatReply = LLMessageStringTable::getInstance()->getString("LandStatReply");
+char const* const _PREHASH_IsPhantom = LLMessageStringTable::getInstance()->getString("IsPhantom");
+char const* const _PREHASH_AgentList = LLMessageStringTable::getInstance()->getString("AgentList");
+char const* const _PREHASH_SimApproved = LLMessageStringTable::getInstance()->getString("SimApproved");
+char const* const _PREHASH_RezObject = LLMessageStringTable::getInstance()->getString("RezObject");
+char const* const _PREHASH_TaskLocalID = LLMessageStringTable::getInstance()->getString("TaskLocalID");
+char const* const _PREHASH_ClaimDate = LLMessageStringTable::getInstance()->getString("ClaimDate");
+char const* const _PREHASH_MergeParcel = LLMessageStringTable::getInstance()->getString("MergeParcel");
+char const* const _PREHASH_Priority = LLMessageStringTable::getInstance()->getString("Priority");
+char const* const _PREHASH_QueryText = LLMessageStringTable::getInstance()->getString("QueryText");
+char const* const _PREHASH_GroupNoticeAdd = LLMessageStringTable::getInstance()->getString("GroupNoticeAdd");
+char const* const _PREHASH_ReturnType = LLMessageStringTable::getInstance()->getString("ReturnType");
+char const* const _PREHASH_FetchFolders = LLMessageStringTable::getInstance()->getString("FetchFolders");
+char const* const _PREHASH_SimulatorPublicHostBlock = LLMessageStringTable::getInstance()->getString("SimulatorPublicHostBlock");
+char const* const _PREHASH_HeaderData = LLMessageStringTable::getInstance()->getString("HeaderData");
+char const* const _PREHASH_RequestMultipleObjects = LLMessageStringTable::getInstance()->getString("RequestMultipleObjects");
+char const* const _PREHASH_RetrieveInstantMessages = LLMessageStringTable::getInstance()->getString("RetrieveInstantMessages");
+char const* const _PREHASH_OpenCircuit = LLMessageStringTable::getInstance()->getString("OpenCircuit");
+char const* const _PREHASH_CrossedRegion = LLMessageStringTable::getInstance()->getString("CrossedRegion");
+char const* const _PREHASH_DirGroupsReply = LLMessageStringTable::getInstance()->getString("DirGroupsReply");
+char const* const _PREHASH_AvatarGroupsReply = LLMessageStringTable::getInstance()->getString("AvatarGroupsReply");
+char const* const _PREHASH_EmailMessageReply = LLMessageStringTable::getInstance()->getString("EmailMessageReply");
+char const* const _PREHASH_GroupVoteHistoryItemReply = LLMessageStringTable::getInstance()->getString("GroupVoteHistoryItemReply");
+char const* const _PREHASH_ViewerPosition = LLMessageStringTable::getInstance()->getString("ViewerPosition");
+char const* const _PREHASH_Position = LLMessageStringTable::getInstance()->getString("Position");
+char const* const _PREHASH_ParentEstate = LLMessageStringTable::getInstance()->getString("ParentEstate");
+char const* const _PREHASH_EstateName = LLMessageStringTable::getInstance()->getString("EstateName");
+char const* const _PREHASH_MuteName = LLMessageStringTable::getInstance()->getString("MuteName");
+char const* const _PREHASH_ParcelRename = LLMessageStringTable::getInstance()->getString("ParcelRename");
+char const* const _PREHASH_ViewerFilename = LLMessageStringTable::getInstance()->getString("ViewerFilename");
+char const* const _PREHASH_UserReportInternal = LLMessageStringTable::getInstance()->getString("UserReportInternal");
+char const* const _PREHASH_AvatarPropertiesRequest = LLMessageStringTable::getInstance()->getString("AvatarPropertiesRequest");
+char const* const _PREHASH_ParcelPropertiesRequest = LLMessageStringTable::getInstance()->getString("ParcelPropertiesRequest");
+char const* const _PREHASH_GroupProfileRequest = LLMessageStringTable::getInstance()->getString("GroupProfileRequest");
+char const* const _PREHASH_AgentDataUpdateRequest = LLMessageStringTable::getInstance()->getString("AgentDataUpdateRequest");
+char const* const _PREHASH_PriceObjectScaleFactor = LLMessageStringTable::getInstance()->getString("PriceObjectScaleFactor");
+char const* const _PREHASH_OpenEnrollment = LLMessageStringTable::getInstance()->getString("OpenEnrollment");
+char const* const _PREHASH_GroupData = LLMessageStringTable::getInstance()->getString("GroupData");
+char const* const _PREHASH_RequestGodlikePowers = LLMessageStringTable::getInstance()->getString("RequestGodlikePowers");
+char const* const _PREHASH_GrantGodlikePowers = LLMessageStringTable::getInstance()->getString("GrantGodlikePowers");
+char const* const _PREHASH_TransactionID = LLMessageStringTable::getInstance()->getString("TransactionID");
+char const* const _PREHASH_DestinationID = LLMessageStringTable::getInstance()->getString("DestinationID");
+char const* const _PREHASH_Controls = LLMessageStringTable::getInstance()->getString("Controls");
+char const* const _PREHASH_FirstDetachAll = LLMessageStringTable::getInstance()->getString("FirstDetachAll");
+char const* const _PREHASH_EstateID = LLMessageStringTable::getInstance()->getString("EstateID");
+char const* const _PREHASH_ImprovedInstantMessage = LLMessageStringTable::getInstance()->getString("ImprovedInstantMessage");
+char const* const _PREHASH_CheckParcelSales = LLMessageStringTable::getInstance()->getString("CheckParcelSales");
+char const* const _PREHASH_ParcelSales = LLMessageStringTable::getInstance()->getString("ParcelSales");
+char const* const _PREHASH_CurrentInterval = LLMessageStringTable::getInstance()->getString("CurrentInterval");
+char const* const _PREHASH_PriceRentLight = LLMessageStringTable::getInstance()->getString("PriceRentLight");
+char const* const _PREHASH_MediaAutoScale = LLMessageStringTable::getInstance()->getString("MediaAutoScale");
+char const* const _PREHASH_NeighborBlock = LLMessageStringTable::getInstance()->getString("NeighborBlock");
+char const* const _PREHASH_LayerData = LLMessageStringTable::getInstance()->getString("LayerData");
+char const* const _PREHASH_NVPairData = LLMessageStringTable::getInstance()->getString("NVPairData");
+char const* const _PREHASH_TeleportLocal = LLMessageStringTable::getInstance()->getString("TeleportLocal");
+char const* const _PREHASH_EjecteeID = LLMessageStringTable::getInstance()->getString("EjecteeID");
+char const* const _PREHASH_VoteInitiator = LLMessageStringTable::getInstance()->getString("VoteInitiator");
+char const* const _PREHASH_TypeData = LLMessageStringTable::getInstance()->getString("TypeData");
+char const* const _PREHASH_OwnerIDs = LLMessageStringTable::getInstance()->getString("OwnerIDs");
+char const* const _PREHASH_SystemKickUser = LLMessageStringTable::getInstance()->getString("SystemKickUser");
+char const* const _PREHASH_TransactionTime = LLMessageStringTable::getInstance()->getString("TransactionTime");
+char const* const _PREHASH_TimeToLive = LLMessageStringTable::getInstance()->getString("TimeToLive");
+char const* const _PREHASH_OldAgentID = LLMessageStringTable::getInstance()->getString("OldAgentID");
+char const* const _PREHASH_MusicURL = LLMessageStringTable::getInstance()->getString("MusicURL");
+char const* const _PREHASH_ParcelPrimBonus = LLMessageStringTable::getInstance()->getString("ParcelPrimBonus");
+char const* const _PREHASH_EjectUser = LLMessageStringTable::getInstance()->getString("EjectUser");
+char const* const _PREHASH_CoarseLocationUpdate = LLMessageStringTable::getInstance()->getString("CoarseLocationUpdate");
+char const* const _PREHASH_ChildAgentPositionUpdate = LLMessageStringTable::getInstance()->getString("ChildAgentPositionUpdate");
+char const* const _PREHASH_StoreLocal = LLMessageStringTable::getInstance()->getString("StoreLocal");
+char const* const _PREHASH_GroupName = LLMessageStringTable::getInstance()->getString("GroupName");
+char const* const _PREHASH_PriceParcelRent = LLMessageStringTable::getInstance()->getString("PriceParcelRent");
+char const* const _PREHASH_SimStatus = LLMessageStringTable::getInstance()->getString("SimStatus");
+char const* const _PREHASH_TransactionSuccess = LLMessageStringTable::getInstance()->getString("TransactionSuccess");
+char const* const _PREHASH_LureType = LLMessageStringTable::getInstance()->getString("LureType");
+char const* const _PREHASH_GroupMask = LLMessageStringTable::getInstance()->getString("GroupMask");
+char const* const _PREHASH_SitObject = LLMessageStringTable::getInstance()->getString("SitObject");
+char const* const _PREHASH_Override = LLMessageStringTable::getInstance()->getString("Override");
+char const* const _PREHASH_LocomotionState = LLMessageStringTable::getInstance()->getString("LocomotionState");
+char const* const _PREHASH_PriceUpload = LLMessageStringTable::getInstance()->getString("PriceUpload");
+char const* const _PREHASH_RemoveParcel = LLMessageStringTable::getInstance()->getString("RemoveParcel");
+char const* const _PREHASH_ConfirmAuctionStart = LLMessageStringTable::getInstance()->getString("ConfirmAuctionStart");
+char const* const _PREHASH_RpcScriptRequestInbound = LLMessageStringTable::getInstance()->getString("RpcScriptRequestInbound");
+char const* const _PREHASH_ActiveGroupID = LLMessageStringTable::getInstance()->getString("ActiveGroupID");
+char const* const _PREHASH_ParcelReturnObjects = LLMessageStringTable::getInstance()->getString("ParcelReturnObjects");
+char const* const _PREHASH_TotalObjects = LLMessageStringTable::getInstance()->getString("TotalObjects");
+char const* const _PREHASH_ObjectExtraParams = LLMessageStringTable::getInstance()->getString("ObjectExtraParams");
+char const* const _PREHASH_Questions = LLMessageStringTable::getInstance()->getString("Questions");
+char const* const _PREHASH_TransferAbort = LLMessageStringTable::getInstance()->getString("TransferAbort");
+char const* const _PREHASH_TransferInventory = LLMessageStringTable::getInstance()->getString("TransferInventory");
+char const* const _PREHASH_RayTargetID = LLMessageStringTable::getInstance()->getString("RayTargetID");
+char const* const _PREHASH_ClaimPrice = LLMessageStringTable::getInstance()->getString("ClaimPrice");
+char const* const _PREHASH_ObjectProperties = LLMessageStringTable::getInstance()->getString("ObjectProperties");
+char const* const _PREHASH_ParcelProperties = LLMessageStringTable::getInstance()->getString("ParcelProperties");
+char const* const _PREHASH_EstateOwnerID = LLMessageStringTable::getInstance()->getString("EstateOwnerID");
+char const* const _PREHASH_LogoutRequest = LLMessageStringTable::getInstance()->getString("LogoutRequest");
+char const* const _PREHASH_AssetUploadRequest = LLMessageStringTable::getInstance()->getString("AssetUploadRequest");
+char const* const _PREHASH_TransactionType = LLMessageStringTable::getInstance()->getString("TransactionType");
+char const* const _PREHASH_AvatarPropertiesUpdate = LLMessageStringTable::getInstance()->getString("AvatarPropertiesUpdate");
+char const* const _PREHASH_ParcelPropertiesUpdate = LLMessageStringTable::getInstance()->getString("ParcelPropertiesUpdate");
+char const* const _PREHASH_FetchItems = LLMessageStringTable::getInstance()->getString("FetchItems");
+char const* const _PREHASH_AbortXfer = LLMessageStringTable::getInstance()->getString("AbortXfer");
+char const* const _PREHASH_DeRezAck = LLMessageStringTable::getInstance()->getString("DeRezAck");
+char const* const _PREHASH_TakeControls = LLMessageStringTable::getInstance()->getString("TakeControls");
+char const* const _PREHASH_DirLandReply = LLMessageStringTable::getInstance()->getString("DirLandReply");
+char const* const _PREHASH_MuteType = LLMessageStringTable::getInstance()->getString("MuteType");
+char const* const _PREHASH_IMViaEMail = LLMessageStringTable::getInstance()->getString("IMViaEMail");
+char const* const _PREHASH_RentPrice = LLMessageStringTable::getInstance()->getString("RentPrice");
+char const* const _PREHASH_GenericMessage = LLMessageStringTable::getInstance()->getString("GenericMessage");
+char const* const _PREHASH_ChildAgentAlive = LLMessageStringTable::getInstance()->getString("ChildAgentAlive");
+char const* const _PREHASH_AssetType = LLMessageStringTable::getInstance()->getString("AssetType");
+char const* const _PREHASH_SpawnPointBlock = LLMessageStringTable::getInstance()->getString("SpawnPointBlock");
+char const* const _PREHASH_AttachmentBlock = LLMessageStringTable::getInstance()->getString("AttachmentBlock");
+char const* const _PREHASH_ObjectMaterial = LLMessageStringTable::getInstance()->getString("ObjectMaterial");
+char const* const _PREHASH_OwnerName = LLMessageStringTable::getInstance()->getString("OwnerName");
+char const* const _PREHASH_AvatarNotesReply = LLMessageStringTable::getInstance()->getString("AvatarNotesReply");
+char const* const _PREHASH_CacheID = LLMessageStringTable::getInstance()->getString("CacheID");
+char const* const _PREHASH_OwnerMask = LLMessageStringTable::getInstance()->getString("OwnerMask");
+char const* const _PREHASH_TransferInventoryAck = LLMessageStringTable::getInstance()->getString("TransferInventoryAck");
+char const* const _PREHASH_RegionDenyAgeUnverified = LLMessageStringTable::getInstance()->getString("RegionDenyAgeUnverified");
+char const* const _PREHASH_AgeVerificationBlock = LLMessageStringTable::getInstance()->getString("AgeVerificationBlock");
+char const* const _PREHASH_UCoord = LLMessageStringTable::getInstance()->getString("UCoord");
+char const* const _PREHASH_VCoord = LLMessageStringTable::getInstance()->getString("VCoord");
+char const* const _PREHASH_FaceIndex = LLMessageStringTable::getInstance()->getString("FaceIndex");
+char const* const _PREHASH_StatusData = LLMessageStringTable::getInstance()->getString("StatusData");
+char const* const _PREHASH_ProductSKU = LLMessageStringTable::getInstance()->getString("ProductSKU");
+char const* const _PREHASH_SeeAVs = LLMessageStringTable::getInstance()->getString("SeeAVs");
+char const* const _PREHASH_AnyAVSounds = LLMessageStringTable::getInstance()->getString("AnyAVSounds");
+char const* const _PREHASH_GroupAVSounds = LLMessageStringTable::getInstance()->getString("GroupAVSounds");
diff --git a/indra/llmessage/message_prehash.h b/indra/llmessage/message_prehash.h
index 08c74d22da..dd2c2dbd64 100644
--- a/indra/llmessage/message_prehash.h
+++ b/indra/llmessage/message_prehash.h
@@ -32,1347 +32,1351 @@
*/
-extern F32 gPrehashVersionNumber;
+extern F32 const gPrehashVersionNumber;
-extern char * _PREHASH_X;
-extern char * _PREHASH_Y;
-extern char * _PREHASH_Z;
-extern char * _PREHASH_AddFlags;
-extern char * _PREHASH_FailureInfo;
-extern char * _PREHASH_MapData;
-extern char * _PREHASH_AddItem;
-extern char * _PREHASH_MeanCollision;
-extern char * _PREHASH_RezScript;
-extern char * _PREHASH_AvatarSitResponse;
-extern char * _PREHASH_InventoryAssetResponse;
-extern char * _PREHASH_KillObject;
-extern char * _PREHASH_ProposalID;
-extern char * _PREHASH_SerialNum;
-extern char * _PREHASH_Duration;
-extern char * _PREHASH_ScriptQuestion;
-extern char * _PREHASH_AddCircuitCode;
-extern char * _PREHASH_UseCircuitCode;
-extern char * _PREHASH_ViewerCircuitCode;
-extern char * _PREHASH_ScriptAnswerYes;
-extern char * _PREHASH_PartnerID;
-extern char * _PREHASH_DirLandQuery;
-extern char * _PREHASH_TeleportStart;
-extern char * _PREHASH_AboutText;
-extern char * _PREHASH_VisualParam;
-extern char * _PREHASH_GroupPrims;
-extern char * _PREHASH_SelectedPrims;
-extern char * _PREHASH_ID;
-extern char * _PREHASH_UUIDNameRequest;
-extern char * _PREHASH_UUIDGroupNameRequest;
-extern char * _PREHASH_GroupAccountTransactionsRequest;
-extern char * _PREHASH_MapNameRequest;
-extern char * _PREHASH_UpdateSimulator;
-extern char * _PREHASH_BillableFactor;
-extern char * _PREHASH_ObjectBonusFactor;
-extern char * _PREHASH_EnableSimulator;
-extern char * _PREHASH_DisableSimulator;
-extern char * _PREHASH_ConfirmEnableSimulator;
-extern char * _PREHASH_LayerType;
-extern char * _PREHASH_OwnerRole;
-extern char * _PREHASH_ParcelOverlay;
-extern char * _PREHASH_GroupOwned;
-extern char * _PREHASH_IP;
-extern char * _PREHASH_ChatFromViewer;
-extern char * _PREHASH_AvgAgentsInView;
-extern char * _PREHASH_AgentsInView;
-extern char * _PREHASH_GroupTitle;
-extern char * _PREHASH_MapLayerReply;
-extern char * _PREHASH_CompoundMsgID;
-extern char * _PREHASH_CameraConstraint;
-extern char * _PREHASH_DownloadTotals;
-extern char * _PREHASH_GenCounter;
-extern char * _PREHASH_FrozenData;
-extern char * _PREHASH_ChildAgentDying;
-extern char * _PREHASH_To;
-extern char * _PREHASH_CopyInventoryFromNotecard;
-extern char * _PREHASH_RezObjectFromNotecard;
-extern char * _PREHASH_ParcelDirFeeCurrent;
-extern char * _PREHASH_SeedCapability;
-extern char * _PREHASH_ObjectDuplicate;
-extern char * _PREHASH_InventoryData;
-extern char * _PREHASH_ReplyData;
-extern char * _PREHASH_ResetList;
-extern char * _PREHASH_MediaID;
-extern char * _PREHASH_RelatedRights;
-extern char * _PREHASH_RedirectGridX;
-extern char * _PREHASH_RedirectGridY;
-extern char * _PREHASH_TransferID;
-extern char * _PREHASH_TexturesChanged;
-extern char * _PREHASH_UserLookAt;
-extern char * _PREHASH_TestBlock1;
-extern char * _PREHASH_SensedData;
-extern char * _PREHASH_UpdateBlock;
-extern char * _PREHASH_ClassifiedGodDelete;
-extern char * _PREHASH_ObjectGrabUpdate;
-extern char * _PREHASH_LocationPos;
-extern char * _PREHASH_TaxDate;
-extern char * _PREHASH_StartDateTime;
-extern char * _PREHASH_ObjectUpdateCached;
-extern char * _PREHASH_Packets;
-extern char * _PREHASH_FailureType;
-extern char * _PREHASH_UpdateGroupInfo;
-extern char * _PREHASH_ObjectPermissions;
-extern char * _PREHASH_RevokePermissions;
-extern char * _PREHASH_UpdateFlags;
-extern char * _PREHASH_ObjectExportSelected;
-extern char * _PREHASH_RezSelected;
-extern char * _PREHASH_AutoPilot;
-extern char * _PREHASH_UpdateMuteListEntry;
-extern char * _PREHASH_RemoveMuteListEntry;
-extern char * _PREHASH_SetSimStatusInDatabase;
-extern char * _PREHASH_SetSimPresenceInDatabase;
-extern char * _PREHASH_CameraProperty;
-extern char * _PREHASH_BrushSize;
-extern char * _PREHASH_SimulatorSetMap;
-extern char * _PREHASH_RegionPresenceRequestByRegionID;
-extern char * _PREHASH_ParcelObjectOwnersReply;
-extern char * _PREHASH_GroupMembersReply;
-extern char * _PREHASH_GroupRoleMembersReply;
-extern char * _PREHASH_RequestRegionInfo;
-extern char * _PREHASH_AABBMax;
-extern char * _PREHASH_RequestPayPrice;
-extern char * _PREHASH_SimulatorPresentAtLocation;
-extern char * _PREHASH_AgentRequestSit;
-extern char * _PREHASH_AABBMin;
-extern char * _PREHASH_ClassifiedFlags;
-extern char * _PREHASH_ControlFlags;
-extern char * _PREHASH_TeleportRequest;
-extern char * _PREHASH_ScriptTeleportRequest;
-extern char * _PREHASH_EstateCovenantRequest;
-extern char * _PREHASH_DateUTC;
-extern char * _PREHASH_TaskIDs;
-extern char * _PREHASH_RequestResult;
-extern char * _PREHASH_CanAcceptAgents;
-extern char * _PREHASH_ObjectSaleInfo;
-extern char * _PREHASH_KillChildAgents;
-extern char * _PREHASH_Balance;
-extern char * _PREHASH_DerezContainer;
-extern char * _PREHASH_ObjectData;
-extern char * _PREHASH_CameraAtAxis;
-extern char * _PREHASH_InfoBlock;
-extern char * _PREHASH_OwnershipCost;
-extern char * _PREHASH_AvatarNotesUpdate;
-extern char * _PREHASH_PID;
-extern char * _PREHASH_DirPopularReply;
-extern char * _PREHASH_TerrainHeightRange00;
-extern char * _PREHASH_SimData;
-extern char * _PREHASH_TerrainHeightRange01;
-extern char * _PREHASH_TerrainHeightRange10;
-extern char * _PREHASH_TerrainHeightRange11;
-extern char * _PREHASH_UpdateInventoryItem;
-extern char * _PREHASH_UpdateCreateInventoryItem;
-extern char * _PREHASH_MoveInventoryItem;
-extern char * _PREHASH_CopyInventoryItem;
-extern char * _PREHASH_LinkInventoryItem;
-extern char * _PREHASH_RemoveInventoryItem;
-extern char * _PREHASH_CreateInventoryItem;
-extern char * _PREHASH_PathTwistBegin;
-extern char * _PREHASH_CRC;
-extern char * _PREHASH_AttachmentPoint;
-extern char * _PREHASH_TelehubBlock;
-extern char * _PREHASH_FOVBlock;
-extern char * _PREHASH_StartLocationData;
-extern char * _PREHASH_PositionData;
-extern char * _PREHASH_TimeSinceLast;
-extern char * _PREHASH_MapImage;
-extern char * _PREHASH_Objects;
-extern char * _PREHASH_URL;
-extern char * _PREHASH_CreationDate;
-extern char * _PREHASH_JointPivot;
-extern char * _PREHASH_FPS;
-extern char * _PREHASH_HasTelehub;
-extern char * _PREHASH_PathEnd;
-extern char * _PREHASH_ScriptDataReply;
-extern char * _PREHASH_MapBlockReply;
-extern char * _PREHASH_PropertiesData;
-extern char * _PREHASH_ViewerEffect;
-extern char * _PREHASH_FreezeUser;
-extern char * _PREHASH_OwnerPrims;
-extern char * _PREHASH_ObjectGrab;
-extern char * _PREHASH_ToAgentID;
-extern char * _PREHASH_SimulatorMapUpdate;
-extern char * _PREHASH_TransferPacket;
-extern char * _PREHASH_ObjectName;
-extern char * _PREHASH_GroupPowers;
-extern char * _PREHASH_OriginalName;
-extern char * _PREHASH_CompletePingCheck;
-extern char * _PREHASH_OnlineStatus;
-extern char * _PREHASH_ObjectDrop;
-extern char * _PREHASH_UseBigPackets;
-extern char * _PREHASH_GroupNoticesListReply;
-extern char * _PREHASH_ParcelAccessListReply;
-extern char * _PREHASH_RpcChannelReply;
-extern char * _PREHASH_RegionPresenceResponse;
-extern char * _PREHASH_CharterMember;
-extern char * _PREHASH_EdgeData;
-extern char * _PREHASH_NameData;
-extern char * _PREHASH_RegionPushOverride;
-extern char * _PREHASH_SimName;
-extern char * _PREHASH_UserReport;
-extern char * _PREHASH_DownloadPriority;
-extern char * _PREHASH_ToAgentId;
-extern char * _PREHASH_DirPopularQuery;
-extern char * _PREHASH_Mag;
-extern char * _PREHASH_ParcelPropertiesRequestByID;
-extern char * _PREHASH_ObjectLink;
-extern char * _PREHASH_RpcScriptReplyInbound;
-extern char * _PREHASH_RezData;
-extern char * _PREHASH_RemoveInventoryObjects;
-extern char * _PREHASH_GroupProposalBallot;
-extern char * _PREHASH_RPCServerIP;
-extern char * _PREHASH_Far;
-extern char * _PREHASH_GodSessionID;
-extern char * _PREHASH_FLAboutText;
-extern char * _PREHASH_RegionHandshakeReply;
-extern char * _PREHASH_GroupActiveProposalItemReply;
-extern char * _PREHASH_MapItemReply;
-extern char * _PREHASH_Seconds;
-extern char * _PREHASH_UpdateUserInfo;
-extern char * _PREHASH_AggregatePermTexturesOwner;
-extern char * _PREHASH_Set;
-extern char * _PREHASH_NewName;
-extern char * _PREHASH_Key;
-extern char * _PREHASH_AgentID;
-extern char * _PREHASH_EventNotificationRemoveRequest;
-extern char * _PREHASH_NewFolderID;
-extern char * _PREHASH_Arc;
-extern char * _PREHASH_RegionX;
-extern char * _PREHASH_RegionY;
-extern char * _PREHASH_RequestData;
-extern char * _PREHASH_Msg;
-extern char * _PREHASH_Top;
-extern char * _PREHASH_MiscStats;
-extern char * _PREHASH_ImageID;
-extern char * _PREHASH_DataPacket;
-extern char * _PREHASH_You;
-extern char * _PREHASH_ScriptControlChange;
-extern char * _PREHASH_LoadURL;
-extern char * _PREHASH_SetCPURatio;
-extern char * _PREHASH_NameValueData;
-extern char * _PREHASH_AtomicPassObject;
-extern char * _PREHASH_ErrorMessage;
-extern char * _PREHASH_ViewerFrozenMessage;
-extern char * _PREHASH_HealthMessage;
-extern char * _PREHASH_LogTextMessage;
-extern char * _PREHASH_TimeDilation;
-extern char * _PREHASH_RemoveContribution;
-extern char * _PREHASH_Contribution;
-extern char * _PREHASH_SetGroupContribution;
-extern char * _PREHASH_Offline;
-extern char * _PREHASH_AgentIsNowWearing;
-extern char * _PREHASH_Members;
-extern char * _PREHASH_FailedResends;
-extern char * _PREHASH_SecPerDay;
-extern char * _PREHASH_CameraCenter;
-extern char * _PREHASH_CameraLeftAxis;
-extern char * _PREHASH_ExBlock;
-extern char * _PREHASH_Channel;
-extern char * _PREHASH_NetTest;
-extern char * _PREHASH_DiscardLevel;
-extern char * _PREHASH_LayerID;
-extern char * _PREHASH_GrabOffset;
-extern char * _PREHASH_SimPort;
-extern char * _PREHASH_PricePerMeter;
-extern char * _PREHASH_RegionFlags;
-extern char * _PREHASH_VoteResult;
-extern char * _PREHASH_ParcelDirFeeEstimate;
-extern char * _PREHASH_ModifyBlock;
-extern char * _PREHASH_InventoryBlock;
-extern char * _PREHASH_ReplyBlock;
-extern char * _PREHASH_ValidUntil;
-extern char * _PREHASH_VelocityInterpolateOn;
-extern char * _PREHASH_ClassifiedDelete;
-extern char * _PREHASH_RegionDenyAnonymous;
-extern char * _PREHASH_FLImageID;
-extern char * _PREHASH_AllowPublish;
-extern char * _PREHASH_SitName;
-extern char * _PREHASH_RegionsVisited;
-extern char * _PREHASH_DirClassifiedReply;
-extern char * _PREHASH_AvatarClassifiedReply;
-extern char * _PREHASH_MediaURL;
-extern char * _PREHASH_CompleteAgentMovement;
-extern char * _PREHASH_ClassifiedID;
-extern char * _PREHASH_LocalID;
-extern char * _PREHASH_SpaceIP;
-extern char * _PREHASH_RemoveItem;
-extern char * _PREHASH_LogFailedMoneyTransaction;
-extern char * _PREHASH_ViewerStartAuction;
-extern char * _PREHASH_StartAuction;
-extern char * _PREHASH_DuplicateFlags;
-extern char * _PREHASH_RegionInfo2;
-extern char * _PREHASH_TextColor;
-extern char * _PREHASH_SlaveID;
-extern char * _PREHASH_Charter;
-extern char * _PREHASH_AlertData;
-extern char * _PREHASH_AlertInfo;
-extern char * _PREHASH_TargetBlock;
-extern char * _PREHASH_CheckParcelAuctions;
-extern char * _PREHASH_ParcelAuctions;
-extern char * _PREHASH_OwnerIsGroup;
-extern char * _PREHASH_NameValuePair;
-extern char * _PREHASH_RemoveNameValuePair;
-extern char * _PREHASH_BulkUpdateInventory;
-extern char * _PREHASH_UpdateTaskInventory;
-extern char * _PREHASH_RemoveTaskInventory;
-extern char * _PREHASH_MoveTaskInventory;
-extern char * _PREHASH_RequestTaskInventory;
-extern char * _PREHASH_ReplyTaskInventory;
-extern char * _PREHASH_AggregatePermInventory;
-extern char * _PREHASH_GroupAccountTransactionsReply;
-extern char * _PREHASH_SimulatorInfo;
-extern char * _PREHASH_WearableData;
-extern char * _PREHASH_Enabled;
-extern char * _PREHASH_Savings;
-extern char * _PREHASH_SimulatorLoad;
-extern char * _PREHASH_InternalRegionIP;
-extern char * _PREHASH_ExternalRegionIP;
-extern char * _PREHASH_TotalPairs;
-extern char * _PREHASH_CreateGroupRequest;
-extern char * _PREHASH_JoinGroupRequest;
-extern char * _PREHASH_LeaveGroupRequest;
-extern char * _PREHASH_InviteGroupRequest;
-extern char * _PREHASH_LiveHelpGroupRequest;
-extern char * _PREHASH_PriceParcelClaimFactor;
-extern char * _PREHASH_BillableArea;
-extern char * _PREHASH_ObjectID;
-extern char * _PREHASH_ObjectFlagUpdate;
-extern char * _PREHASH_GroupRoleUpdate;
-extern char * _PREHASH_RequestInventoryAsset;
-extern char * _PREHASH_ChangedGrid;
-extern char * _PREHASH_AgentDropGroup;
-extern char * _PREHASH_Details;
-extern char * _PREHASH_LocationX;
-extern char * _PREHASH_SaleType;
-extern char * _PREHASH_LocationY;
-extern char * _PREHASH_LocationZ;
-extern char * _PREHASH_EconomyData;
-extern char * _PREHASH_HeadRotation;
-extern char * _PREHASH_DeleteOnCompletion;
-extern char * _PREHASH_PublicPort;
-extern char * _PREHASH_DirClassifiedQuery;
-extern char * _PREHASH_CallbackID;
-extern char * _PREHASH_RequestParcelTransfer;
-extern char * _PREHASH_RoleCount;
-extern char * _PREHASH_ObjectCapacity;
-extern char * _PREHASH_RequestID;
-extern char * _PREHASH_RequestXfer;
-extern char * _PREHASH_ObjectTaxCurrent;
-extern char * _PREHASH_LightTaxCurrent;
-extern char * _PREHASH_LandTaxCurrent;
-extern char * _PREHASH_GroupTaxCurrent;
-extern char * _PREHASH_FetchInventoryDescendents;
-extern char * _PREHASH_InventoryDescendents;
-extern char * _PREHASH_Descendents;
-extern char * _PREHASH_PurgeInventoryDescendents;
-extern char * _PREHASH_ShowDir;
-extern char * _PREHASH_IsOwner;
-extern char * _PREHASH_Timestamp;
-extern char * _PREHASH_GlobalPos;
-extern char * _PREHASH_GrabOffsetInitial;
-extern char * _PREHASH_IsTrial;
-extern char * _PREHASH_ObjectDuplicateOnRay;
-extern char * _PREHASH_GroupMembershipCount;
-extern char * _PREHASH_MethodData;
-extern char * _PREHASH_ActivateGestures;
-extern char * _PREHASH_DeactivateGestures;
-extern char * _PREHASH_ProposalData;
-extern char * _PREHASH_PosGlobal;
-extern char * _PREHASH_SearchID;
-extern char * _PREHASH_RezMultipleAttachmentsFromInv;
-extern char * _PREHASH_SearchName;
-extern char * _PREHASH_VersionString;
-extern char * _PREHASH_CreateGroupReply;
-extern char * _PREHASH_LeaveGroupReply;
-extern char * _PREHASH_ActualArea;
-extern char * _PREHASH_Message;
-extern char * _PREHASH_ClickAction;
-extern char * _PREHASH_AssetUploadComplete;
-extern char * _PREHASH_RequestType;
-extern char * _PREHASH_UUID;
-extern char * _PREHASH_BaseMask;
-extern char * _PREHASH_NetBlock;
-extern char * _PREHASH_GlobalX;
-extern char * _PREHASH_GlobalY;
-extern char * _PREHASH_CopyRotates;
-extern char * _PREHASH_KickUserAck;
-extern char * _PREHASH_TopPick;
-extern char * _PREHASH_SessionID;
-extern char * _PREHASH_GlobalZ;
-extern char * _PREHASH_DeclineFriendship;
-extern char * _PREHASH_FormFriendship;
-extern char * _PREHASH_TerminateFriendship;
-extern char * _PREHASH_TaskData;
-extern char * _PREHASH_SimWideMaxPrims;
-extern char * _PREHASH_TotalPrims;
-extern char * _PREHASH_ProfileBegin;
-extern char * _PREHASH_Request;
-extern char * _PREHASH_GroupAccountDetailsRequest;
-extern char * _PREHASH_GroupActiveProposalsRequest;
-extern char * _PREHASH_StringValue;
-extern char * _PREHASH_Version;
-extern char * _PREHASH_OtherCount;
-extern char * _PREHASH_MemberCount;
-extern char * _PREHASH_ChatData;
-extern char * _PREHASH_IsGroupOwned;
-extern char * _PREHASH_EnergyEfficiency;
-extern char * _PREHASH_PickInfoUpdate;
-extern char * _PREHASH_PickDelete;
-extern char * _PREHASH_ScriptReset;
-extern char * _PREHASH_Requester;
-extern char * _PREHASH_ForSale;
-extern char * _PREHASH_NearestLandingRegionReply;
-extern char * _PREHASH_ParcelID;
-extern char * _PREHASH_Godlike;
-extern char * _PREHASH_TotalDebits;
-extern char * _PREHASH_Direction;
-extern char * _PREHASH_HealthData;
-extern char * _PREHASH_LeftAxis;
-extern char * _PREHASH_LocationBlock;
-extern char * _PREHASH_ObjectImage;
-extern char * _PREHASH_TerrainStartHeight00;
-extern char * _PREHASH_TerrainStartHeight01;
-extern char * _PREHASH_TerrainStartHeight10;
-extern char * _PREHASH_TerrainStartHeight11;
-extern char * _PREHASH_WaterHeight;
-extern char * _PREHASH_FetchInventoryReply;
-extern char * _PREHASH_GroupAccountSummaryReply;
-extern char * _PREHASH_AttachedSound;
-extern char * _PREHASH_ParamInUse;
-extern char * _PREHASH_GodKickUser;
-extern char * _PREHASH_PickName;
-extern char * _PREHASH_TaskName;
-extern char * _PREHASH_ObjectCount;
-extern char * _PREHASH_RegionPresenceRequestByHandle;
-extern char * _PREHASH_RezSingleAttachmentFromInv;
-extern char * _PREHASH_ChildAgentUpdate;
-extern char * _PREHASH_IsOwnerGroup;
-extern char * _PREHASH_AgentHeightWidth;
-extern char * _PREHASH_VerticalAngle;
-extern char * _PREHASH_WearableType;
-extern char * _PREHASH_AggregatePermNextOwner;
-extern char * _PREHASH_ShowInList;
-extern char * _PREHASH_UpdateParcel;
-extern char * _PREHASH_SetAlwaysRun;
-extern char * _PREHASH_NVPair;
-extern char * _PREHASH_SearchType;
-extern char * _PREHASH_ObjectSpinStart;
-extern char * _PREHASH_UseEstateSun;
-extern char * _PREHASH_RegionID;
-extern char * _PREHASH_AbuseRegionID;
-extern char * _PREHASH_Creator;
-extern char * _PREHASH_ProposalText;
-extern char * _PREHASH_DirEventsReply;
-extern char * _PREHASH_EventInfoReply;
-extern char * _PREHASH_UserInfoReply;
-extern char * _PREHASH_PathRadiusOffset;
-extern char * _PREHASH_TextureData;
-extern char * _PREHASH_ChatPass;
-extern char * _PREHASH_TargetID;
-extern char * _PREHASH_DefaultPayPrice;
-extern char * _PREHASH_UserLocation;
-extern char * _PREHASH_MaxPrims;
-extern char * _PREHASH_LandmarkID;
-extern char * _PREHASH_InitiateDownload;
-extern char * _PREHASH_Name;
-extern char * _PREHASH_OtherCleanTime;
-extern char * _PREHASH_ParcelSetOtherCleanTime;
-extern char * _PREHASH_TeleportPriceExponent;
-extern char * _PREHASH_Gain;
-extern char * _PREHASH_PacketAck;
-extern char * _PREHASH_PathSkew;
-extern char * _PREHASH_SimulatorShutdownRequest;
-extern char * _PREHASH_NearestLandingRegionRequest;
-extern char * _PREHASH_OtherID;
-extern char * _PREHASH_MemberID;
-extern char * _PREHASH_MapLayerRequest;
-extern char * _PREHASH_ObjectScale;
-extern char * _PREHASH_TargetIP;
-extern char * _PREHASH_Redo;
-extern char * _PREHASH_MoneyBalance;
-extern char * _PREHASH_TrackAgent;
-extern char * _PREHASH_MaxX;
-extern char * _PREHASH_Data;
-extern char * _PREHASH_MaxY;
-extern char * _PREHASH_TextureAnim;
-extern char * _PREHASH_ReturnIDs;
-extern char * _PREHASH_Date;
-extern char * _PREHASH_AgentWearablesUpdate;
-extern char * _PREHASH_AgentDataUpdate;
-extern char * _PREHASH_GroupDataUpdate;
-extern char * _PREHASH_Hash;
-extern char * _PREHASH_AgentGroupDataUpdate;
-extern char * _PREHASH_Left;
-extern char * _PREHASH_Mask;
-extern char * _PREHASH_ForceMouselook;
-extern char * _PREHASH_Success;
-extern char * _PREHASH_ObjectGroup;
-extern char * _PREHASH_SunHour;
-extern char * _PREHASH_MinX;
-extern char * _PREHASH_ScriptSensorReply;
-extern char * _PREHASH_MinY;
-extern char * _PREHASH_Command;
-extern char * _PREHASH_Desc;
-extern char * _PREHASH_AttachmentNeedsSave;
-extern char * _PREHASH_HistoryItemData;
-extern char * _PREHASH_AgentCachedTexture;
-extern char * _PREHASH_Subject;
-extern char * _PREHASH_East;
-extern char * _PREHASH_QueryReplies;
-extern char * _PREHASH_ObjectCategory;
-extern char * _PREHASH_Time;
-extern char * _PREHASH_CreateLandmarkForEvent;
-extern char * _PREHASH_ParentID;
-extern char * _PREHASH_Ping;
-extern char * _PREHASH_Perp;
-extern char * _PREHASH_Code;
-extern char * _PREHASH_InvType;
-extern char * _PREHASH_AgentFOV;
-extern char * _PREHASH_Audible;
-extern char * _PREHASH_AuctionData;
-extern char * _PREHASH_IDBlock;
-extern char * _PREHASH_West;
-extern char * _PREHASH_Undo;
-extern char * _PREHASH_TotalNumItems;
-extern char * _PREHASH_Info;
-extern char * _PREHASH_Area;
-extern char * _PREHASH_SimCrashed;
-extern char * _PREHASH_Text;
-extern char * _PREHASH_PriceGroupCreate;
-extern char * _PREHASH_ObjectShape;
-extern char * _PREHASH_GroupRoleDataReply;
-extern char * _PREHASH_MuteCRC;
-extern char * _PREHASH_Size;
-extern char * _PREHASH_FromAddress;
-extern char * _PREHASH_Body;
-extern char * _PREHASH_FileData;
-extern char * _PREHASH_List;
-extern char * _PREHASH_KickUser;
-extern char * _PREHASH_OtherPrims;
-extern char * _PREHASH_RunTime;
-extern char * _PREHASH_GrantUserRights;
-extern char * _PREHASH_RpcScriptRequestInboundForward;
-extern char * _PREHASH_More;
-extern char * _PREHASH_Majority;
-extern char * _PREHASH_MetersTraveled;
-extern char * _PREHASH_Stat;
-extern char * _PREHASH_SoundID;
-extern char * _PREHASH_Item;
-extern char * _PREHASH_User;
-extern char * _PREHASH_Prey;
-extern char * _PREHASH_RayStart;
-extern char * _PREHASH_UsecSinceStart;
-extern char * _PREHASH_ParcelData;
-extern char * _PREHASH_CameraUpAxis;
-extern char * _PREHASH_ScriptDialog;
-extern char * _PREHASH_MasterParcelData;
-extern char * _PREHASH_Invalid;
-extern char * _PREHASH_ProfileCurve;
-extern char * _PREHASH_ParcelAccessListUpdate;
-extern char * _PREHASH_MuteListUpdate;
-extern char * _PREHASH_SendPacket;
-extern char * _PREHASH_SendXferPacket;
-extern char * _PREHASH_RegionDenyIdentified;
-extern char * _PREHASH_NotecardItemID;
-extern char * _PREHASH_LastName;
-extern char * _PREHASH_From;
-extern char * _PREHASH_RoleChange;
-extern char * _PREHASH_Port;
-extern char * _PREHASH_MemberTitle;
-extern char * _PREHASH_LogParcelChanges;
-extern char * _PREHASH_AgentCachedTextureResponse;
-extern char * _PREHASH_DeRezObject;
-extern char * _PREHASH_IsTemporary;
-extern char * _PREHASH_InsigniaID;
-extern char * _PREHASH_CheckFlags;
-extern char * _PREHASH_EventID;
-extern char * _PREHASH_Selected;
-extern char * _PREHASH_FromAgentId;
-extern char * _PREHASH_Type;
-extern char * _PREHASH_ChatType;
-extern char * _PREHASH_ReportData;
-extern char * _PREHASH_RequestBlock;
-extern char * _PREHASH_GrantData;
-extern char * _PREHASH_DetachAttachmentIntoInv;
-extern char * _PREHASH_ParcelDisableObjects;
-extern char * _PREHASH_Sections;
-extern char * _PREHASH_GodLevel;
-extern char * _PREHASH_PayPriceReply;
-extern char * _PREHASH_QueryID;
-extern char * _PREHASH_CameraEyeOffset;
-extern char * _PREHASH_AgentPosition;
-extern char * _PREHASH_GrabPosition;
-extern char * _PREHASH_OnlineNotification;
-extern char * _PREHASH_OfflineNotification;
-extern char * _PREHASH_SendPostcard;
-extern char * _PREHASH_RequestFlags;
-extern char * _PREHASH_GroupAccountSummaryRequest;
-extern char * _PREHASH_GroupVoteHistoryRequest;
-extern char * _PREHASH_ParamValue;
-extern char * _PREHASH_MaxAgents;
-extern char * _PREHASH_CreateNewOutfitAttachments;
-extern char * _PREHASH_RegionHandle;
-extern char * _PREHASH_TeleportProgress;
-extern char * _PREHASH_AgentQuitCopy;
-extern char * _PREHASH_AvatarInterestsUpdate;
-extern char * _PREHASH_GroupNoticeID;
-extern char * _PREHASH_ParcelName;
-extern char * _PREHASH_PriceObjectRent;
-extern char * _PREHASH_OfferCallingCard;
-extern char * _PREHASH_AcceptCallingCard;
-extern char * _PREHASH_DeclineCallingCard;
-extern char * _PREHASH_AgentAccess;
-extern char * _PREHASH_AgentLegacyAccess;
-extern char * _PREHASH_AgentMaxAccess;
-extern char * _PREHASH_DataHomeLocationReply;
-extern char * _PREHASH_EventLocationReply;
-extern char * _PREHASH_TerseDateID;
-extern char * _PREHASH_ObjectOwner;
-extern char * _PREHASH_AssetID;
-extern char * _PREHASH_AlertMessage;
-extern char * _PREHASH_AgentAlertMessage;
-extern char * _PREHASH_EstateOwnerMessage;
-extern char * _PREHASH_ParcelMediaCommandMessage;
-extern char * _PREHASH_Auction;
-extern char * _PREHASH_Category;
-extern char * _PREHASH_FilePath;
-extern char * _PREHASH_ItemFlags;
-extern char * _PREHASH_Invoice;
-extern char * _PREHASH_IntervalDays;
-extern char * _PREHASH_PathScaleX;
-extern char * _PREHASH_FromTaskID;
-extern char * _PREHASH_PathScaleY;
-extern char * _PREHASH_TimeInfo;
-extern char * _PREHASH_PublicCount;
-extern char * _PREHASH_ParcelJoin;
-extern char * _PREHASH_GroupRolesCount;
-extern char * _PREHASH_SimulatorBlock;
-extern char * _PREHASH_GroupID;
-extern char * _PREHASH_AgentVel;
-extern char * _PREHASH_RequestImage;
-extern char * _PREHASH_NetStats;
-extern char * _PREHASH_AgentPos;
-extern char * _PREHASH_AgentSit;
-extern char * _PREHASH_Material;
-extern char * _PREHASH_ObjectDeGrab;
-extern char * _PREHASH_VelocityInterpolateOff;
-extern char * _PREHASH_AuthorizedBuyerID;
-extern char * _PREHASH_AvatarPropertiesReply;
-extern char * _PREHASH_GroupProfileReply;
-extern char * _PREHASH_SimOwner;
-extern char * _PREHASH_SalePrice;
-extern char * _PREHASH_Animation;
-extern char * _PREHASH_OwnerID;
-extern char * _PREHASH_NearestLandingRegionUpdated;
-extern char * _PREHASH_PassToAgent;
-extern char * _PREHASH_PreyAgent;
-extern char * _PREHASH_SimStats;
-extern char * _PREHASH_LogoutReply;
-extern char * _PREHASH_FeatureDisabled;
-extern char * _PREHASH_PhysicalAvatarEventList;
-extern char * _PREHASH_ObjectLocalID;
-extern char * _PREHASH_Dropped;
-extern char * _PREHASH_WebProfilesDisabled;
-extern char * _PREHASH_Destination;
-extern char * _PREHASH_MasterID;
-extern char * _PREHASH_TransferData;
-extern char * _PREHASH_WantToMask;
-extern char * _PREHASH_ParcelSelectObjects;
-extern char * _PREHASH_ExtraParams;
-extern char * _PREHASH_CreatorID;
-extern char * _PREHASH_Summary;
-extern char * _PREHASH_BuyObjectInventory;
-extern char * _PREHASH_FetchInventory;
-extern char * _PREHASH_InventoryID;
-extern char * _PREHASH_PacketNumber;
-extern char * _PREHASH_SetFollowCamProperties;
-extern char * _PREHASH_ClearFollowCamProperties;
-extern char * _PREHASH_SequenceID;
-extern char * _PREHASH_DataServerLogout;
-extern char * _PREHASH_NameValue;
-extern char * _PREHASH_PathShearX;
-extern char * _PREHASH_PathShearY;
-extern char * _PREHASH_Velocity;
-extern char * _PREHASH_SecPerYear;
-extern char * _PREHASH_FirstName;
-extern char * _PREHASH_AttachedSoundGainChange;
-extern char * _PREHASH_LocationID;
-extern char * _PREHASH_Running;
-extern char * _PREHASH_AgentThrottle;
-extern char * _PREHASH_NeighborList;
-extern char * _PREHASH_PathTaperX;
-extern char * _PREHASH_PathTaperY;
-extern char * _PREHASH_AgentRelated;
-extern char * _PREHASH_GranterBlock;
-extern char * _PREHASH_UseCachedMuteList;
-extern char * _PREHASH_FailStats;
-extern char * _PREHASH_Tempfile;
-extern char * _PREHASH_BuyerID;
-extern char * _PREHASH_DirPeopleReply;
-extern char * _PREHASH_TransferInfo;
-extern char * _PREHASH_AvatarPickerRequestBackend;
-extern char * _PREHASH_AvatarPropertiesRequestBackend;
-extern char * _PREHASH_UpdateData;
-extern char * _PREHASH_SimFPS;
-extern char * _PREHASH_ReporterID;
-extern char * _PREHASH_ButtonLabel;
-extern char * _PREHASH_GranterID;
-extern char * _PREHASH_WantToText;
-extern char * _PREHASH_ReportType;
-extern char * _PREHASH_SimulatorReady;
-extern char * _PREHASH_DataBlock;
-extern char * _PREHASH_AnimationSourceList;
-extern char * _PREHASH_SubscribeLoad;
-extern char * _PREHASH_UnsubscribeLoad;
-extern char * _PREHASH_Packet;
-extern char * _PREHASH_UndoLand;
-extern char * _PREHASH_SimAccess;
-extern char * _PREHASH_AbuserID;
-extern char * _PREHASH_MembershipFee;
-extern char * _PREHASH_InviteGroupResponse;
-extern char * _PREHASH_CreateInventoryFolder;
-extern char * _PREHASH_UpdateInventoryFolder;
-extern char * _PREHASH_MoveInventoryFolder;
-extern char * _PREHASH_RemoveInventoryFolder;
-extern char * _PREHASH_MoneyData;
-extern char * _PREHASH_ObjectDeselect;
-extern char * _PREHASH_NewAssetID;
-extern char * _PREHASH_ObjectAdd;
-extern char * _PREHASH_RayEndIsIntersection;
-extern char * _PREHASH_CompleteAuction;
-extern char * _PREHASH_CircuitCode;
-extern char * _PREHASH_AgentMovementComplete;
-extern char * _PREHASH_ViewerIP;
-extern char * _PREHASH_Header;
-extern char * _PREHASH_GestureFlags;
-extern char * _PREHASH_XferID;
-extern char * _PREHASH_StatValue;
-extern char * _PREHASH_TaskID;
-extern char * _PREHASH_PickID;
-extern char * _PREHASH_RayEnd;
-extern char * _PREHASH_Throttles;
-extern char * _PREHASH_RebakeAvatarTextures;
-extern char * _PREHASH_UpAxis;
-extern char * _PREHASH_AgentTextures;
-extern char * _PREHASH_NotecardData;
-extern char * _PREHASH_Radius;
-extern char * _PREHASH_OffCircuit;
-extern char * _PREHASH_Access;
-extern char * _PREHASH_TitleRoleID;
-extern char * _PREHASH_SquareMetersCredit;
-extern char * _PREHASH_Filename;
-extern char * _PREHASH_ClassifiedInfoRequest;
-extern char * _PREHASH_ParcelInfoRequest;
-extern char * _PREHASH_ParcelObjectOwnersRequest;
-extern char * _PREHASH_TeleportLandmarkRequest;
-extern char * _PREHASH_EventInfoRequest;
-extern char * _PREHASH_MoneyBalanceRequest;
-extern char * _PREHASH_GroupMembersRequest;
-extern char * _PREHASH_GroupRoleMembersRequest;
-extern char * _PREHASH_ChatFromSimulator;
-extern char * _PREHASH_OldFolderID;
-extern char * _PREHASH_UserInfoRequest;
-extern char * _PREHASH_TextureID;
-extern char * _PREHASH_ProfileURL;
-extern char * _PREHASH_Handle;
-extern char * _PREHASH_ButtonIndex;
-extern char * _PREHASH_GetScriptRunning;
-extern char * _PREHASH_SetScriptRunning;
-extern char * _PREHASH_Health;
-extern char * _PREHASH_CircuitInfo;
-extern char * _PREHASH_ObjectBuy;
-extern char * _PREHASH_ProfileEnd;
-extern char * _PREHASH_Effect;
-extern char * _PREHASH_TestMessage;
-extern char * _PREHASH_ScriptMailRegistration;
-extern char * _PREHASH_AgentSetAppearance;
-extern char * _PREHASH_AvatarAppearance;
-extern char * _PREHASH_RegionData;
-extern char * _PREHASH_RequestingRegionData;
-extern char * _PREHASH_LandingRegionData;
-extern char * _PREHASH_SitTransform;
-extern char * _PREHASH_TerrainBase0;
-extern char * _PREHASH_SkillsMask;
-extern char * _PREHASH_AtAxis;
-extern char * _PREHASH_TerrainBase1;
-extern char * _PREHASH_Reason;
-extern char * _PREHASH_TerrainBase2;
-extern char * _PREHASH_TerrainBase3;
-extern char * _PREHASH_Params;
-extern char * _PREHASH_PingID;
-extern char * _PREHASH_Change;
-extern char * _PREHASH_Height;
-extern char * _PREHASH_Region;
-extern char * _PREHASH_TelehubInfo;
-extern char * _PREHASH_StateSave;
-extern char * _PREHASH_RoleData;
-extern char * _PREHASH_AgentAnimation;
-extern char * _PREHASH_AvatarAnimation;
-extern char * _PREHASH_LogDwellTime;
-extern char * _PREHASH_ParcelGodMarkAsContent;
-extern char * _PREHASH_UsePhysics;
-extern char * _PREHASH_RegionDenyTransacted;
-extern char * _PREHASH_JointType;
-extern char * _PREHASH_ObjectTaxEstimate;
-extern char * _PREHASH_LightTaxEstimate;
-extern char * _PREHASH_LandTaxEstimate;
-extern char * _PREHASH_TeleportLandingStatusChanged;
-extern char * _PREHASH_GroupTaxEstimate;
-extern char * _PREHASH_AvgViewerFPS;
-extern char * _PREHASH_Buttons;
-extern char * _PREHASH_Sender;
-extern char * _PREHASH_Dialog;
-extern char * _PREHASH_TargetData;
-extern char * _PREHASH_DestID;
-extern char * _PREHASH_PricePublicObjectDelete;
-extern char * _PREHASH_ObjectDelete;
-extern char * _PREHASH_Delete;
-extern char * _PREHASH_EventGodDelete;
-extern char * _PREHASH_LastTaxDate;
-extern char * _PREHASH_MapImageID;
-extern char * _PREHASH_EndDateTime;
-extern char * _PREHASH_TerrainDetail0;
-extern char * _PREHASH_TerrainDetail1;
-extern char * _PREHASH_TerrainDetail2;
-extern char * _PREHASH_TerrainDetail3;
-extern char * _PREHASH_Offset;
-extern char * _PREHASH_ObjectDelink;
-extern char * _PREHASH_TargetObject;
-extern char * _PREHASH_IsEstateManager;
-extern char * _PREHASH_CancelAuction;
-extern char * _PREHASH_ObjectDetach;
-extern char * _PREHASH_Compressed;
-extern char * _PREHASH_PathBegin;
-extern char * _PREHASH_BypassRaycast;
-extern char * _PREHASH_WinnerID;
-extern char * _PREHASH_ChannelType;
-extern char * _PREHASH_NonExemptMembers;
-extern char * _PREHASH_Agents;
-extern char * _PREHASH_MemberData;
-extern char * _PREHASH_ToGroupID;
-extern char * _PREHASH_ImageNotInDatabase;
-extern char * _PREHASH_StartDate;
-extern char * _PREHASH_AnimID;
-extern char * _PREHASH_Serial;
-extern char * _PREHASH_AbuseRegionName;
-extern char * _PREHASH_ModifyLand;
-extern char * _PREHASH_Digest;
-extern char * _PREHASH_Victim;
-extern char * _PREHASH_Script;
-extern char * _PREHASH_PickInfoReply;
-extern char * _PREHASH_MoneyBalanceReply;
-extern char * _PREHASH_RoutedMoneyBalanceReply;
-extern char * _PREHASH_RoleID;
-extern char * _PREHASH_RegionInfo;
-extern char * _PREHASH_GodUpdateRegionInfo;
-extern char * _PREHASH_StartAnim;
-extern char * _PREHASH_Action;
-extern char * _PREHASH_Location;
-extern char * _PREHASH_Rights;
-extern char * _PREHASH_SearchDir;
-extern char * _PREHASH_TransferRequest;
-extern char * _PREHASH_ScriptSensorRequest;
-extern char * _PREHASH_MoneyTransferRequest;
-extern char * _PREHASH_EjectGroupMemberRequest;
-extern char * _PREHASH_SkillsText;
-extern char * _PREHASH_Resent;
-extern char * _PREHASH_Center;
-extern char * _PREHASH_SharedData;
-extern char * _PREHASH_PSBlock;
-extern char * _PREHASH_UUIDNameBlock;
-extern char * _PREHASH_GroupTitleUpdate;
-extern char * _PREHASH_Method;
-extern char * _PREHASH_TouchName;
-extern char * _PREHASH_UpdateType;
-extern char * _PREHASH_KickedFromEstateID;
-extern char * _PREHASH_CandidateID;
-extern char * _PREHASH_ParamData;
-extern char * _PREHASH_GodlikeMessage;
-extern char * _PREHASH_SystemMessage;
-extern char * _PREHASH_BodyRotation;
-extern char * _PREHASH_SearchRegions;
-extern char * _PREHASH_AnimationData;
-extern char * _PREHASH_StatID;
-extern char * _PREHASH_ItemID;
-extern char * _PREHASH_ScriptDialogReply;
-extern char * _PREHASH_RegionIDAndHandleReply;
-extern char * _PREHASH_CameraAtOffset;
-extern char * _PREHASH_VoteID;
-extern char * _PREHASH_ParcelGodForceOwner;
-extern char * _PREHASH_Filter;
-extern char * _PREHASH_InviteData;
-extern char * _PREHASH_PCode;
-extern char * _PREHASH_SearchPos;
-extern char * _PREHASH_PreyID;
-extern char * _PREHASH_TerrainLowerLimit;
-extern char * _PREHASH_EventFlags;
-extern char * _PREHASH_TallyVotes;
-extern char * _PREHASH_Result;
-extern char * _PREHASH_LookAt;
-extern char * _PREHASH_SearchOrder;
-extern char * _PREHASH_PayButton;
-extern char * _PREHASH_SelfCount;
-extern char * _PREHASH_PacketCount;
-extern char * _PREHASH_ParcelBuyPass;
-extern char * _PREHASH_OldItemID;
-extern char * _PREHASH_RegionPort;
-extern char * _PREHASH_PriceEnergyUnit;
-extern char * _PREHASH_Bitmap;
-extern char * _PREHASH_CacheMissType;
-extern char * _PREHASH_VFileID;
-extern char * _PREHASH_GroupInsigniaID;
-extern char * _PREHASH_Online;
-extern char * _PREHASH_KickFlags;
-extern char * _PREHASH_CovenantID;
-extern char * _PREHASH_SysCPU;
-extern char * _PREHASH_EMail;
-extern char * _PREHASH_AggregatePermTextures;
-extern char * _PREHASH_ChatChannel;
-extern char * _PREHASH_ReturnID;
-extern char * _PREHASH_ObjectAttach;
-extern char * _PREHASH_TargetPort;
-extern char * _PREHASH_ObjectSpinStop;
-extern char * _PREHASH_FullID;
-extern char * _PREHASH_ActivateGroup;
-extern char * _PREHASH_SysGPU;
-extern char * _PREHASH_AvatarInterestsReply;
-extern char * _PREHASH_StartLure;
-extern char * _PREHASH_SysRAM;
-extern char * _PREHASH_ObjectPosition;
-extern char * _PREHASH_SitPosition;
-extern char * _PREHASH_StartTime;
-extern char * _PREHASH_BornOn;
-extern char * _PREHASH_CameraCollidePlane;
-extern char * _PREHASH_EconomyDataRequest;
-extern char * _PREHASH_TeleportLureRequest;
-extern char * _PREHASH_FolderID;
-extern char * _PREHASH_RegionHandleRequest;
-extern char * _PREHASH_ScriptDataRequest;
-extern char * _PREHASH_GroupRoleDataRequest;
-extern char * _PREHASH_GroupTitlesRequest;
-extern char * _PREHASH_AgentWearablesRequest;
-extern char * _PREHASH_MapBlockRequest;
-extern char * _PREHASH_LureID;
-extern char * _PREHASH_CopyCenters;
-extern char * _PREHASH_ParamList;
-extern char * _PREHASH_InventorySerial;
-extern char * _PREHASH_EdgeDataPacket;
-extern char * _PREHASH_AvatarPickerReply;
-extern char * _PREHASH_ParcelDwellReply;
-extern char * _PREHASH_IsForSale;
-extern char * _PREHASH_MuteID;
-extern char * _PREHASH_MeanCollisionAlert;
-extern char * _PREHASH_CanAcceptTasks;
-extern char * _PREHASH_ItemData;
-extern char * _PREHASH_AnimationList;
-extern char * _PREHASH_Reputation;
-extern char * _PREHASH_IntValue;
-extern char * _PREHASH_TargetType;
-extern char * _PREHASH_Amount;
-extern char * _PREHASH_HasAttachment;
-extern char * _PREHASH_UpdateAttachment;
-extern char * _PREHASH_RemoveAttachment;
-extern char * _PREHASH_HeightWidthBlock;
-extern char * _PREHASH_RequestObjectPropertiesFamily;
-extern char * _PREHASH_ObjectPropertiesFamily;
-extern char * _PREHASH_UserData;
-extern char * _PREHASH_IsReadable;
-extern char * _PREHASH_PathCurve;
-extern char * _PREHASH_Status;
-extern char * _PREHASH_FromGroup;
-extern char * _PREHASH_AlreadyVoted;
-extern char * _PREHASH_PlacesReply;
-extern char * _PREHASH_DirPlacesReply;
-extern char * _PREHASH_ParcelBuy;
-extern char * _PREHASH_DirFindQueryBackend;
-extern char * _PREHASH_DirPlacesQueryBackend;
-extern char * _PREHASH_DirClassifiedQueryBackend;
-extern char * _PREHASH_DirLandQueryBackend;
-extern char * _PREHASH_DirPopularQueryBackend;
-extern char * _PREHASH_HistoryData;
-extern char * _PREHASH_SnapshotID;
-extern char * _PREHASH_Aspect;
-extern char * _PREHASH_ParamSize;
-extern char * _PREHASH_VoteCast;
-extern char * _PREHASH_CastsShadows;
-extern char * _PREHASH_EveryoneMask;
-extern char * _PREHASH_ObjectSpinUpdate;
-extern char * _PREHASH_MaturePublish;
-extern char * _PREHASH_UseExistingAsset;
-extern char * _PREHASH_Powers;
-extern char * _PREHASH_ParcelLocalID;
-extern char * _PREHASH_TeleportCancel;
-extern char * _PREHASH_UnixTime;
-extern char * _PREHASH_QueryFlags;
-extern char * _PREHASH_AlwaysRun;
-extern char * _PREHASH_Bottom;
-extern char * _PREHASH_ButtonData;
-extern char * _PREHASH_SoundData;
-extern char * _PREHASH_ViewerStats;
-extern char * _PREHASH_RegionHandshake;
-extern char * _PREHASH_ObjectDescription;
-extern char * _PREHASH_Description;
-extern char * _PREHASH_ParamType;
-extern char * _PREHASH_UUIDNameReply;
-extern char * _PREHASH_UUIDGroupNameReply;
-extern char * _PREHASH_SaveAssetIntoInventory;
-extern char * _PREHASH_UserInfo;
-extern char * _PREHASH_AnimSequenceID;
-extern char * _PREHASH_NVPairs;
-extern char * _PREHASH_GroupNoticesListRequest;
-extern char * _PREHASH_ParcelAccessListRequest;
-extern char * _PREHASH_MuteListRequest;
-extern char * _PREHASH_RpcChannelRequest;
-extern char * _PREHASH_LandStatRequest;
-extern char * _PREHASH_PlacesQuery;
-extern char * _PREHASH_DirPlacesQuery;
-extern char * _PREHASH_SortOrder;
-extern char * _PREHASH_Hunter;
-extern char * _PREHASH_SunAngVelocity;
-extern char * _PREHASH_BinaryBucket;
-extern char * _PREHASH_ImagePacket;
-extern char * _PREHASH_StartGroupProposal;
-extern char * _PREHASH_EnergyLevel;
-extern char * _PREHASH_PriceForListing;
-extern char * _PREHASH_Scale;
-extern char * _PREHASH_EstateCovenantReply;
-extern char * _PREHASH_ParentEstateID;
-extern char * _PREHASH_Extra2;
-extern char * _PREHASH_Throttle;
-extern char * _PREHASH_SimIP;
-extern char * _PREHASH_GodID;
-extern char * _PREHASH_TeleportMinPrice;
-extern char * _PREHASH_VoteItem;
-extern char * _PREHASH_ObjectRotation;
-extern char * _PREHASH_SitRotation;
-extern char * _PREHASH_SnapSelection;
-extern char * _PREHASH_SoundTrigger;
-extern char * _PREHASH_TerrainRaiseLimit;
-extern char * _PREHASH_Quorum;
-extern char * _PREHASH_AgentBlock;
-extern char * _PREHASH_CommandBlock;
-extern char * _PREHASH_PricePublicObjectDecay;
-extern char * _PREHASH_SpawnPointPos;
-extern char * _PREHASH_VolumeDetail;
-extern char * _PREHASH_FromAgentName;
-extern char * _PREHASH_Range;
-extern char * _PREHASH_DirectoryVisibility;
-extern char * _PREHASH_PublicIP;
-extern char * _PREHASH_TeleportFailed;
-extern char * _PREHASH_PreloadSound;
-extern char * _PREHASH_ScreenshotID;
-extern char * _PREHASH_CovenantTimestamp;
-extern char * _PREHASH_OldestUnacked;
-extern char * _PREHASH_SimulatorIP;
-extern char * _PREHASH_Value;
-extern char * _PREHASH_JointAxisOrAnchor;
-extern char * _PREHASH_Test0;
-extern char * _PREHASH_Test1;
-extern char * _PREHASH_Test2;
-extern char * _PREHASH_SunPhase;
-extern char * _PREHASH_ParcelDivide;
-extern char * _PREHASH_PriceObjectClaim;
-extern char * _PREHASH_Field;
-extern char * _PREHASH_Ratio;
-extern char * _PREHASH_JoinGroupReply;
-extern char * _PREHASH_LiveHelpGroupReply;
-extern char * _PREHASH_Score;
-extern char * _PREHASH_Image;
-extern char * _PREHASH_ObjectClickAction;
-extern char * _PREHASH_Parameter;
-extern char * _PREHASH_Flags;
-extern char * _PREHASH_Plane;
-extern char * _PREHASH_Width;
-extern char * _PREHASH_Right;
-extern char * _PREHASH_DirFindQuery;
-extern char * _PREHASH_Textures;
-extern char * _PREHASH_EventData;
-extern char * _PREHASH_Final;
-extern char * _PREHASH_System;
-extern char * _PREHASH_TelehubPos;
-extern char * _PREHASH_ReportAutosaveCrash;
-extern char * _PREHASH_CreateTrustedCircuit;
-extern char * _PREHASH_DenyTrustedCircuit;
-extern char * _PREHASH_RequestTrustedCircuit;
-extern char * _PREHASH_Codec;
-extern char * _PREHASH_Modal;
-extern char * _PREHASH_ChildAgentUnknown;
-extern char * _PREHASH_LandingType;
-extern char * _PREHASH_ScriptRunningReply;
-extern char * _PREHASH_Reply;
-extern char * _PREHASH_GroupAccountDetailsReply;
-extern char * _PREHASH_TelehubRot;
-extern char * _PREHASH_AcceptFriendship;
-extern char * _PREHASH_ItemType;
-extern char * _PREHASH_DwellInfo;
-extern char * _PREHASH_AgentResume;
-extern char * _PREHASH_MailFilter;
-extern char * _PREHASH_Disconnect;
-extern char * _PREHASH_SimPosition;
-extern char * _PREHASH_SimWideTotalPrims;
-extern char * _PREHASH_Index;
-extern char * _PREHASH_SimFilename;
-extern char * _PREHASH_LastOwnerID;
-extern char * _PREHASH_GroupNoticeRequest;
-extern char * _PREHASH_EmailMessageRequest;
-extern char * _PREHASH_MapItemRequest;
-extern char * _PREHASH_AgentCount;
-extern char * _PREHASH_MessageBlock;
-extern char * _PREHASH_FuseBlock;
-extern char * _PREHASH_AgentGroupData;
-extern char * _PREHASH_ClassifiedInfoUpdate;
-extern char * _PREHASH_RegionPos;
-extern char * _PREHASH_ParcelMediaUpdate;
-extern char * _PREHASH_NoticeID;
-extern char * _PREHASH_GridX;
-extern char * _PREHASH_GridY;
-extern char * _PREHASH_Title;
-extern char * _PREHASH_AuctionID;
-extern char * _PREHASH_VoteType;
-extern char * _PREHASH_CategoryID;
-extern char * _PREHASH_Token;
-extern char * _PREHASH_AggregatePerms;
-extern char * _PREHASH_ObjectSelect;
-extern char * _PREHASH_ForceObjectSelect;
-extern char * _PREHASH_Price;
-extern char * _PREHASH_SunDirection;
-extern char * _PREHASH_FromName;
-extern char * _PREHASH_ChangeInventoryItemFlags;
-extern char * _PREHASH_Force;
-extern char * _PREHASH_TransactionBlock;
-extern char * _PREHASH_PowersMask;
-extern char * _PREHASH_Stamp;
-extern char * _PREHASH_TotalCredits;
-extern char * _PREHASH_State;
-extern char * _PREHASH_TextureIndex;
-extern char * _PREHASH_InviteeID;
-extern char * _PREHASH_ParcelReclaim;
-extern char * _PREHASH_Money;
-extern char * _PREHASH_PathTwist;
-extern char * _PREHASH_AuthBuyerID;
-extern char * _PREHASH_Color;
-extern char * _PREHASH_SourceType;
-extern char * _PREHASH_World;
-extern char * _PREHASH_QueryData;
-extern char * _PREHASH_Users;
-extern char * _PREHASH_SysOS;
-extern char * _PREHASH_Notes;
-extern char * _PREHASH_AvatarID;
-extern char * _PREHASH_FounderID;
-extern char * _PREHASH_EndPointID;
-extern char * _PREHASH_LocationLookAt;
-extern char * _PREHASH_Sound;
-extern char * _PREHASH_Cover;
-extern char * _PREHASH_TotalObjectCount;
-extern char * _PREHASH_TextureEntry;
-extern char * _PREHASH_SquareMetersCommitted;
-extern char * _PREHASH_ChannelID;
-extern char * _PREHASH_Dwell;
-extern char * _PREHASH_North;
-extern char * _PREHASH_AgentUpdate;
-extern char * _PREHASH_PickGodDelete;
-extern char * _PREHASH_HostName;
-extern char * _PREHASH_PriceParcelClaim;
-extern char * _PREHASH_ParcelClaim;
-extern char * _PREHASH_AgentPowers;
-extern char * _PREHASH_ProfileHollow;
-extern char * _PREHASH_GroupRoleChanges;
-extern char * _PREHASH_Count;
-extern char * _PREHASH_South;
-extern char * _PREHASH_ObjectUpdateCompressed;
-extern char * _PREHASH_MuteFlags;
-extern char * _PREHASH_Group;
-extern char * _PREHASH_AgentPause;
-extern char * _PREHASH_LanguagesText;
-extern char * _PREHASH_Error;
-extern char * _PREHASH_InternalScriptMail;
-extern char * _PREHASH_FindAgent;
-extern char * _PREHASH_AgentData;
-extern char * _PREHASH_FolderData;
-extern char * _PREHASH_AssetBlock;
-extern char * _PREHASH_AcceptNotices;
-extern char * _PREHASH_SetGroupAcceptNotices;
-extern char * _PREHASH_CloseCircuit;
-extern char * _PREHASH_TeleportFinish;
-extern char * _PREHASH_PathRevolutions;
-extern char * _PREHASH_ClassifiedInfoReply;
-extern char * _PREHASH_ParcelInfoReply;
-extern char * _PREHASH_AutosaveData;
-extern char * _PREHASH_SetStartLocation;
-extern char * _PREHASH_PassHours;
-extern char * _PREHASH_AttachmentPt;
-extern char * _PREHASH_ParcelFlags;
-extern char * _PREHASH_NumVotes;
-extern char * _PREHASH_AvatarPickerRequest;
-extern char * _PREHASH_TeleportLocationRequest;
-extern char * _PREHASH_DataHomeLocationRequest;
-extern char * _PREHASH_EventNotificationAddRequest;
-extern char * _PREHASH_ParcelDwellRequest;
-extern char * _PREHASH_EventLocationRequest;
-extern char * _PREHASH_SetStartLocationRequest;
-extern char * _PREHASH_QueryStart;
-extern char * _PREHASH_EjectData;
-extern char * _PREHASH_AvatarTextureUpdate;
-extern char * _PREHASH_RPCServerPort;
-extern char * _PREHASH_Bytes;
-extern char * _PREHASH_Extra;
-extern char * _PREHASH_ForceScriptControlRelease;
-extern char * _PREHASH_ParcelRelease;
-extern char * _PREHASH_VFileType;
-extern char * _PREHASH_EjectGroupMemberReply;
-extern char * _PREHASH_ImageData;
-extern char * _PREHASH_SimulatorViewerTimeMessage;
-extern char * _PREHASH_Rotation;
-extern char * _PREHASH_Selection;
-extern char * _PREHASH_TransactionData;
-extern char * _PREHASH_OperationData;
-extern char * _PREHASH_ExpirationDate;
-extern char * _PREHASH_ParcelDeedToGroup;
-extern char * _PREHASH_AvatarPicksReply;
-extern char * _PREHASH_GroupTitlesReply;
-extern char * _PREHASH_AgentInfo;
-extern char * _PREHASH_MoneyTransferBackend;
-extern char * _PREHASH_NextOwnerMask;
-extern char * _PREHASH_MuteData;
-extern char * _PREHASH_PassPrice;
-extern char * _PREHASH_SourceID;
-extern char * _PREHASH_ChangeUserRights;
-extern char * _PREHASH_TeleportFlags;
-extern char * _PREHASH_SlaveParcelData;
-extern char * _PREHASH_AssetData;
-extern char * _PREHASH_MultipleObjectUpdate;
-extern char * _PREHASH_ObjectUpdate;
-extern char * _PREHASH_ImprovedTerseObjectUpdate;
-extern char * _PREHASH_ConfirmXferPacket;
-extern char * _PREHASH_StartPingCheck;
-extern char * _PREHASH_SimWideDeletes;
-extern char * _PREHASH_LandStatReply;
-extern char * _PREHASH_IsPhantom;
-extern char * _PREHASH_AgentList;
-extern char * _PREHASH_SimApproved;
-extern char * _PREHASH_RezObject;
-extern char * _PREHASH_TaskLocalID;
-extern char * _PREHASH_ClaimDate;
-extern char * _PREHASH_MergeParcel;
-extern char * _PREHASH_Priority;
-extern char * _PREHASH_QueryText;
-extern char * _PREHASH_GroupNoticeAdd;
-extern char * _PREHASH_ReturnType;
-extern char * _PREHASH_FetchFolders;
-extern char * _PREHASH_SimulatorPublicHostBlock;
-extern char * _PREHASH_HeaderData;
-extern char * _PREHASH_RequestMultipleObjects;
-extern char * _PREHASH_RetrieveInstantMessages;
-extern char * _PREHASH_OpenCircuit;
-extern char * _PREHASH_CrossedRegion;
-extern char * _PREHASH_DirGroupsReply;
-extern char * _PREHASH_AvatarGroupsReply;
-extern char * _PREHASH_EmailMessageReply;
-extern char * _PREHASH_GroupVoteHistoryItemReply;
-extern char * _PREHASH_ViewerPosition;
-extern char * _PREHASH_Position;
-extern char * _PREHASH_ParentEstate;
-extern char * _PREHASH_EstateName;
-extern char * _PREHASH_MuteName;
-extern char * _PREHASH_ParcelRename;
-extern char * _PREHASH_ViewerFilename;
-extern char * _PREHASH_UserReportInternal;
-extern char * _PREHASH_AvatarPropertiesRequest;
-extern char * _PREHASH_ParcelPropertiesRequest;
-extern char * _PREHASH_GroupProfileRequest;
-extern char * _PREHASH_AgentDataUpdateRequest;
-extern char * _PREHASH_PriceObjectScaleFactor;
-extern char * _PREHASH_OpenEnrollment;
-extern char * _PREHASH_GroupData;
-extern char * _PREHASH_RequestGodlikePowers;
-extern char * _PREHASH_GrantGodlikePowers;
-extern char * _PREHASH_TransactionID;
-extern char * _PREHASH_DestinationID;
-extern char * _PREHASH_Controls;
-extern char * _PREHASH_FirstDetachAll;
-extern char * _PREHASH_EstateID;
-extern char * _PREHASH_ImprovedInstantMessage;
-extern char * _PREHASH_CheckParcelSales;
-extern char * _PREHASH_ParcelSales;
-extern char * _PREHASH_CurrentInterval;
-extern char * _PREHASH_PriceRentLight;
-extern char * _PREHASH_MediaAutoScale;
-extern char * _PREHASH_NeighborBlock;
-extern char * _PREHASH_LayerData;
-extern char * _PREHASH_NVPairData;
-extern char * _PREHASH_TeleportLocal;
-extern char * _PREHASH_EjecteeID;
-extern char * _PREHASH_VoteInitiator;
-extern char * _PREHASH_TypeData;
-extern char * _PREHASH_OwnerIDs;
-extern char * _PREHASH_SystemKickUser;
-extern char * _PREHASH_TransactionTime;
-extern char * _PREHASH_TimeToLive;
-extern char * _PREHASH_OldAgentID;
-extern char * _PREHASH_MusicURL;
-extern char * _PREHASH_ParcelPrimBonus;
-extern char * _PREHASH_EjectUser;
-extern char * _PREHASH_CoarseLocationUpdate;
-extern char * _PREHASH_ChildAgentPositionUpdate;
-extern char * _PREHASH_StoreLocal;
-extern char * _PREHASH_GroupName;
-extern char * _PREHASH_PriceParcelRent;
-extern char * _PREHASH_SimStatus;
-extern char * _PREHASH_TransactionSuccess;
-extern char * _PREHASH_LureType;
-extern char * _PREHASH_GroupMask;
-extern char * _PREHASH_SitObject;
-extern char * _PREHASH_Override;
-extern char * _PREHASH_LocomotionState;
-extern char * _PREHASH_PriceUpload;
-extern char * _PREHASH_RemoveParcel;
-extern char * _PREHASH_ConfirmAuctionStart;
-extern char * _PREHASH_RpcScriptRequestInbound;
-extern char * _PREHASH_ActiveGroupID;
-extern char * _PREHASH_ParcelReturnObjects;
-extern char * _PREHASH_TotalObjects;
-extern char * _PREHASH_ObjectExtraParams;
-extern char * _PREHASH_Questions;
-extern char * _PREHASH_TransferAbort;
-extern char * _PREHASH_TransferInventory;
-extern char * _PREHASH_RayTargetID;
-extern char * _PREHASH_ClaimPrice;
-extern char * _PREHASH_ObjectProperties;
-extern char * _PREHASH_ParcelProperties;
-extern char * _PREHASH_EstateOwnerID;
-extern char * _PREHASH_LogoutRequest;
-extern char * _PREHASH_AssetUploadRequest;
-extern char * _PREHASH_TransactionType;
-extern char * _PREHASH_AvatarPropertiesUpdate;
-extern char * _PREHASH_ParcelPropertiesUpdate;
-extern char * _PREHASH_FetchItems;
-extern char * _PREHASH_AbortXfer;
-extern char * _PREHASH_DeRezAck;
-extern char * _PREHASH_TakeControls;
-extern char * _PREHASH_DirLandReply;
-extern char * _PREHASH_MuteType;
-extern char * _PREHASH_IMViaEMail;
-extern char * _PREHASH_RentPrice;
-extern char * _PREHASH_GenericMessage;
-extern char * _PREHASH_ChildAgentAlive;
-extern char * _PREHASH_AssetType;
-extern char * _PREHASH_SpawnPointBlock;
-extern char * _PREHASH_AttachmentBlock;
-extern char * _PREHASH_ObjectMaterial;
-extern char * _PREHASH_OwnerName;
-extern char * _PREHASH_AvatarNotesReply;
-extern char * _PREHASH_CacheID;
-extern char * _PREHASH_OwnerMask;
-extern char * _PREHASH_TransferInventoryAck;
-extern char * _PREHASH_RegionDenyAgeUnverified;
-extern char * _PREHASH_AgeVerificationBlock;
-extern char * _PREHASH_UCoord;
-extern char * _PREHASH_VCoord;
-extern char * _PREHASH_FaceIndex;
-extern char * _PREHASH_StatusData;
-extern char * _PREHASH_ProductSKU;
+extern char const* const _PREHASH_X;
+extern char const* const _PREHASH_Y;
+extern char const* const _PREHASH_Z;
+extern char const* const _PREHASH_AddFlags;
+extern char const* const _PREHASH_FailureInfo;
+extern char const* const _PREHASH_MapData;
+extern char const* const _PREHASH_AddItem;
+extern char const* const _PREHASH_MeanCollision;
+extern char const* const _PREHASH_RezScript;
+extern char const* const _PREHASH_AvatarSitResponse;
+extern char const* const _PREHASH_InventoryAssetResponse;
+extern char const* const _PREHASH_KillObject;
+extern char const* const _PREHASH_ProposalID;
+extern char const* const _PREHASH_SerialNum;
+extern char const* const _PREHASH_Duration;
+extern char const* const _PREHASH_ScriptQuestion;
+extern char const* const _PREHASH_AddCircuitCode;
+extern char const* const _PREHASH_UseCircuitCode;
+extern char const* const _PREHASH_ViewerCircuitCode;
+extern char const* const _PREHASH_ScriptAnswerYes;
+extern char const* const _PREHASH_PartnerID;
+extern char const* const _PREHASH_DirLandQuery;
+extern char const* const _PREHASH_TeleportStart;
+extern char const* const _PREHASH_AboutText;
+extern char const* const _PREHASH_VisualParam;
+extern char const* const _PREHASH_GroupPrims;
+extern char const* const _PREHASH_SelectedPrims;
+extern char const* const _PREHASH_ID;
+extern char const* const _PREHASH_UUIDNameRequest;
+extern char const* const _PREHASH_UUIDGroupNameRequest;
+extern char const* const _PREHASH_GroupAccountTransactionsRequest;
+extern char const* const _PREHASH_MapNameRequest;
+extern char const* const _PREHASH_UpdateSimulator;
+extern char const* const _PREHASH_BillableFactor;
+extern char const* const _PREHASH_ObjectBonusFactor;
+extern char const* const _PREHASH_EnableSimulator;
+extern char const* const _PREHASH_DisableSimulator;
+extern char const* const _PREHASH_ConfirmEnableSimulator;
+extern char const* const _PREHASH_LayerType;
+extern char const* const _PREHASH_OwnerRole;
+extern char const* const _PREHASH_ParcelOverlay;
+extern char const* const _PREHASH_GroupOwned;
+extern char const* const _PREHASH_IP;
+extern char const* const _PREHASH_ChatFromViewer;
+extern char const* const _PREHASH_AvgAgentsInView;
+extern char const* const _PREHASH_AgentsInView;
+extern char const* const _PREHASH_GroupTitle;
+extern char const* const _PREHASH_MapLayerReply;
+extern char const* const _PREHASH_CompoundMsgID;
+extern char const* const _PREHASH_CameraConstraint;
+extern char const* const _PREHASH_DownloadTotals;
+extern char const* const _PREHASH_GenCounter;
+extern char const* const _PREHASH_FrozenData;
+extern char const* const _PREHASH_ChildAgentDying;
+extern char const* const _PREHASH_To;
+extern char const* const _PREHASH_CopyInventoryFromNotecard;
+extern char const* const _PREHASH_RezObjectFromNotecard;
+extern char const* const _PREHASH_ParcelDirFeeCurrent;
+extern char const* const _PREHASH_SeedCapability;
+extern char const* const _PREHASH_ObjectDuplicate;
+extern char const* const _PREHASH_InventoryData;
+extern char const* const _PREHASH_ReplyData;
+extern char const* const _PREHASH_ResetList;
+extern char const* const _PREHASH_MediaID;
+extern char const* const _PREHASH_RelatedRights;
+extern char const* const _PREHASH_RedirectGridX;
+extern char const* const _PREHASH_RedirectGridY;
+extern char const* const _PREHASH_TransferID;
+extern char const* const _PREHASH_TexturesChanged;
+extern char const* const _PREHASH_UserLookAt;
+extern char const* const _PREHASH_TestBlock1;
+extern char const* const _PREHASH_SensedData;
+extern char const* const _PREHASH_UpdateBlock;
+extern char const* const _PREHASH_ClassifiedGodDelete;
+extern char const* const _PREHASH_ObjectGrabUpdate;
+extern char const* const _PREHASH_LocationPos;
+extern char const* const _PREHASH_TaxDate;
+extern char const* const _PREHASH_StartDateTime;
+extern char const* const _PREHASH_ObjectUpdateCached;
+extern char const* const _PREHASH_Packets;
+extern char const* const _PREHASH_FailureType;
+extern char const* const _PREHASH_UpdateGroupInfo;
+extern char const* const _PREHASH_ObjectPermissions;
+extern char const* const _PREHASH_RevokePermissions;
+extern char const* const _PREHASH_UpdateFlags;
+extern char const* const _PREHASH_ObjectExportSelected;
+extern char const* const _PREHASH_RezSelected;
+extern char const* const _PREHASH_AutoPilot;
+extern char const* const _PREHASH_UpdateMuteListEntry;
+extern char const* const _PREHASH_RemoveMuteListEntry;
+extern char const* const _PREHASH_SetSimStatusInDatabase;
+extern char const* const _PREHASH_SetSimPresenceInDatabase;
+extern char const* const _PREHASH_CameraProperty;
+extern char const* const _PREHASH_BrushSize;
+extern char const* const _PREHASH_SimulatorSetMap;
+extern char const* const _PREHASH_RegionPresenceRequestByRegionID;
+extern char const* const _PREHASH_ParcelObjectOwnersReply;
+extern char const* const _PREHASH_GroupMembersReply;
+extern char const* const _PREHASH_GroupRoleMembersReply;
+extern char const* const _PREHASH_RequestRegionInfo;
+extern char const* const _PREHASH_AABBMax;
+extern char const* const _PREHASH_RequestPayPrice;
+extern char const* const _PREHASH_SimulatorPresentAtLocation;
+extern char const* const _PREHASH_AgentRequestSit;
+extern char const* const _PREHASH_AABBMin;
+extern char const* const _PREHASH_ClassifiedFlags;
+extern char const* const _PREHASH_ControlFlags;
+extern char const* const _PREHASH_TeleportRequest;
+extern char const* const _PREHASH_ScriptTeleportRequest;
+extern char const* const _PREHASH_EstateCovenantRequest;
+extern char const* const _PREHASH_DateUTC;
+extern char const* const _PREHASH_TaskIDs;
+extern char const* const _PREHASH_RequestResult;
+extern char const* const _PREHASH_CanAcceptAgents;
+extern char const* const _PREHASH_ObjectSaleInfo;
+extern char const* const _PREHASH_KillChildAgents;
+extern char const* const _PREHASH_Balance;
+extern char const* const _PREHASH_DerezContainer;
+extern char const* const _PREHASH_ObjectData;
+extern char const* const _PREHASH_CameraAtAxis;
+extern char const* const _PREHASH_InfoBlock;
+extern char const* const _PREHASH_OwnershipCost;
+extern char const* const _PREHASH_AvatarNotesUpdate;
+extern char const* const _PREHASH_PID;
+extern char const* const _PREHASH_DirPopularReply;
+extern char const* const _PREHASH_TerrainHeightRange00;
+extern char const* const _PREHASH_SimData;
+extern char const* const _PREHASH_TerrainHeightRange01;
+extern char const* const _PREHASH_TerrainHeightRange10;
+extern char const* const _PREHASH_TerrainHeightRange11;
+extern char const* const _PREHASH_UpdateInventoryItem;
+extern char const* const _PREHASH_UpdateCreateInventoryItem;
+extern char const* const _PREHASH_MoveInventoryItem;
+extern char const* const _PREHASH_CopyInventoryItem;
+extern char const* const _PREHASH_LinkInventoryItem;
+extern char const* const _PREHASH_RemoveInventoryItem;
+extern char const* const _PREHASH_CreateInventoryItem;
+extern char const* const _PREHASH_PathTwistBegin;
+extern char const* const _PREHASH_CRC;
+extern char const* const _PREHASH_AttachmentPoint;
+extern char const* const _PREHASH_TelehubBlock;
+extern char const* const _PREHASH_FOVBlock;
+extern char const* const _PREHASH_StartLocationData;
+extern char const* const _PREHASH_PositionData;
+extern char const* const _PREHASH_TimeSinceLast;
+extern char const* const _PREHASH_MapImage;
+extern char const* const _PREHASH_Objects;
+extern char const* const _PREHASH_URL;
+extern char const* const _PREHASH_CreationDate;
+extern char const* const _PREHASH_JointPivot;
+extern char const* const _PREHASH_FPS;
+extern char const* const _PREHASH_HasTelehub;
+extern char const* const _PREHASH_PathEnd;
+extern char const* const _PREHASH_ScriptDataReply;
+extern char const* const _PREHASH_MapBlockReply;
+extern char const* const _PREHASH_PropertiesData;
+extern char const* const _PREHASH_ViewerEffect;
+extern char const* const _PREHASH_FreezeUser;
+extern char const* const _PREHASH_OwnerPrims;
+extern char const* const _PREHASH_ObjectGrab;
+extern char const* const _PREHASH_ToAgentID;
+extern char const* const _PREHASH_SimulatorMapUpdate;
+extern char const* const _PREHASH_TransferPacket;
+extern char const* const _PREHASH_ObjectName;
+extern char const* const _PREHASH_GroupPowers;
+extern char const* const _PREHASH_OriginalName;
+extern char const* const _PREHASH_CompletePingCheck;
+extern char const* const _PREHASH_OnlineStatus;
+extern char const* const _PREHASH_ObjectDrop;
+extern char const* const _PREHASH_UseBigPackets;
+extern char const* const _PREHASH_GroupNoticesListReply;
+extern char const* const _PREHASH_ParcelAccessListReply;
+extern char const* const _PREHASH_RpcChannelReply;
+extern char const* const _PREHASH_RegionPresenceResponse;
+extern char const* const _PREHASH_CharterMember;
+extern char const* const _PREHASH_EdgeData;
+extern char const* const _PREHASH_NameData;
+extern char const* const _PREHASH_RegionPushOverride;
+extern char const* const _PREHASH_SimName;
+extern char const* const _PREHASH_UserReport;
+extern char const* const _PREHASH_DownloadPriority;
+extern char const* const _PREHASH_ToAgentId;
+extern char const* const _PREHASH_DirPopularQuery;
+extern char const* const _PREHASH_Mag;
+extern char const* const _PREHASH_ParcelPropertiesRequestByID;
+extern char const* const _PREHASH_ObjectLink;
+extern char const* const _PREHASH_RpcScriptReplyInbound;
+extern char const* const _PREHASH_RezData;
+extern char const* const _PREHASH_RemoveInventoryObjects;
+extern char const* const _PREHASH_GroupProposalBallot;
+extern char const* const _PREHASH_RPCServerIP;
+extern char const* const _PREHASH_Far;
+extern char const* const _PREHASH_GodSessionID;
+extern char const* const _PREHASH_FLAboutText;
+extern char const* const _PREHASH_RegionHandshakeReply;
+extern char const* const _PREHASH_GroupActiveProposalItemReply;
+extern char const* const _PREHASH_MapItemReply;
+extern char const* const _PREHASH_Seconds;
+extern char const* const _PREHASH_UpdateUserInfo;
+extern char const* const _PREHASH_AggregatePermTexturesOwner;
+extern char const* const _PREHASH_Set;
+extern char const* const _PREHASH_NewName;
+extern char const* const _PREHASH_Key;
+extern char const* const _PREHASH_AgentID;
+extern char const* const _PREHASH_EventNotificationRemoveRequest;
+extern char const* const _PREHASH_NewFolderID;
+extern char const* const _PREHASH_Arc;
+extern char const* const _PREHASH_RegionX;
+extern char const* const _PREHASH_RegionY;
+extern char const* const _PREHASH_RequestData;
+extern char const* const _PREHASH_Msg;
+extern char const* const _PREHASH_Top;
+extern char const* const _PREHASH_MiscStats;
+extern char const* const _PREHASH_ImageID;
+extern char const* const _PREHASH_DataPacket;
+extern char const* const _PREHASH_You;
+extern char const* const _PREHASH_ScriptControlChange;
+extern char const* const _PREHASH_LoadURL;
+extern char const* const _PREHASH_SetCPURatio;
+extern char const* const _PREHASH_NameValueData;
+extern char const* const _PREHASH_AtomicPassObject;
+extern char const* const _PREHASH_ErrorMessage;
+extern char const* const _PREHASH_ViewerFrozenMessage;
+extern char const* const _PREHASH_HealthMessage;
+extern char const* const _PREHASH_LogTextMessage;
+extern char const* const _PREHASH_TimeDilation;
+extern char const* const _PREHASH_RemoveContribution;
+extern char const* const _PREHASH_Contribution;
+extern char const* const _PREHASH_SetGroupContribution;
+extern char const* const _PREHASH_Offline;
+extern char const* const _PREHASH_AgentIsNowWearing;
+extern char const* const _PREHASH_Members;
+extern char const* const _PREHASH_FailedResends;
+extern char const* const _PREHASH_SecPerDay;
+extern char const* const _PREHASH_CameraCenter;
+extern char const* const _PREHASH_CameraLeftAxis;
+extern char const* const _PREHASH_ExBlock;
+extern char const* const _PREHASH_Channel;
+extern char const* const _PREHASH_NetTest;
+extern char const* const _PREHASH_DiscardLevel;
+extern char const* const _PREHASH_LayerID;
+extern char const* const _PREHASH_GrabOffset;
+extern char const* const _PREHASH_SimPort;
+extern char const* const _PREHASH_PricePerMeter;
+extern char const* const _PREHASH_RegionFlags;
+extern char const* const _PREHASH_VoteResult;
+extern char const* const _PREHASH_ParcelDirFeeEstimate;
+extern char const* const _PREHASH_ModifyBlock;
+extern char const* const _PREHASH_InventoryBlock;
+extern char const* const _PREHASH_ReplyBlock;
+extern char const* const _PREHASH_ValidUntil;
+extern char const* const _PREHASH_VelocityInterpolateOn;
+extern char const* const _PREHASH_ClassifiedDelete;
+extern char const* const _PREHASH_RegionDenyAnonymous;
+extern char const* const _PREHASH_FLImageID;
+extern char const* const _PREHASH_AllowPublish;
+extern char const* const _PREHASH_SitName;
+extern char const* const _PREHASH_RegionsVisited;
+extern char const* const _PREHASH_DirClassifiedReply;
+extern char const* const _PREHASH_AvatarClassifiedReply;
+extern char const* const _PREHASH_MediaURL;
+extern char const* const _PREHASH_CompleteAgentMovement;
+extern char const* const _PREHASH_ClassifiedID;
+extern char const* const _PREHASH_LocalID;
+extern char const* const _PREHASH_SpaceIP;
+extern char const* const _PREHASH_RemoveItem;
+extern char const* const _PREHASH_LogFailedMoneyTransaction;
+extern char const* const _PREHASH_ViewerStartAuction;
+extern char const* const _PREHASH_StartAuction;
+extern char const* const _PREHASH_DuplicateFlags;
+extern char const* const _PREHASH_RegionInfo2;
+extern char const* const _PREHASH_TextColor;
+extern char const* const _PREHASH_SlaveID;
+extern char const* const _PREHASH_Charter;
+extern char const* const _PREHASH_AlertData;
+extern char const* const _PREHASH_AlertInfo;
+extern char const* const _PREHASH_TargetBlock;
+extern char const* const _PREHASH_CheckParcelAuctions;
+extern char const* const _PREHASH_ParcelAuctions;
+extern char const* const _PREHASH_OwnerIsGroup;
+extern char const* const _PREHASH_NameValuePair;
+extern char const* const _PREHASH_RemoveNameValuePair;
+extern char const* const _PREHASH_BulkUpdateInventory;
+extern char const* const _PREHASH_UpdateTaskInventory;
+extern char const* const _PREHASH_RemoveTaskInventory;
+extern char const* const _PREHASH_MoveTaskInventory;
+extern char const* const _PREHASH_RequestTaskInventory;
+extern char const* const _PREHASH_ReplyTaskInventory;
+extern char const* const _PREHASH_AggregatePermInventory;
+extern char const* const _PREHASH_GroupAccountTransactionsReply;
+extern char const* const _PREHASH_SimulatorInfo;
+extern char const* const _PREHASH_WearableData;
+extern char const* const _PREHASH_Enabled;
+extern char const* const _PREHASH_Savings;
+extern char const* const _PREHASH_SimulatorLoad;
+extern char const* const _PREHASH_InternalRegionIP;
+extern char const* const _PREHASH_ExternalRegionIP;
+extern char const* const _PREHASH_TotalPairs;
+extern char const* const _PREHASH_CreateGroupRequest;
+extern char const* const _PREHASH_JoinGroupRequest;
+extern char const* const _PREHASH_LeaveGroupRequest;
+extern char const* const _PREHASH_InviteGroupRequest;
+extern char const* const _PREHASH_LiveHelpGroupRequest;
+extern char const* const _PREHASH_PriceParcelClaimFactor;
+extern char const* const _PREHASH_BillableArea;
+extern char const* const _PREHASH_ObjectID;
+extern char const* const _PREHASH_ObjectFlagUpdate;
+extern char const* const _PREHASH_GroupRoleUpdate;
+extern char const* const _PREHASH_RequestInventoryAsset;
+extern char const* const _PREHASH_ChangedGrid;
+extern char const* const _PREHASH_AgentDropGroup;
+extern char const* const _PREHASH_Details;
+extern char const* const _PREHASH_LocationX;
+extern char const* const _PREHASH_SaleType;
+extern char const* const _PREHASH_LocationY;
+extern char const* const _PREHASH_LocationZ;
+extern char const* const _PREHASH_EconomyData;
+extern char const* const _PREHASH_HeadRotation;
+extern char const* const _PREHASH_DeleteOnCompletion;
+extern char const* const _PREHASH_PublicPort;
+extern char const* const _PREHASH_DirClassifiedQuery;
+extern char const* const _PREHASH_CallbackID;
+extern char const* const _PREHASH_RequestParcelTransfer;
+extern char const* const _PREHASH_RoleCount;
+extern char const* const _PREHASH_ObjectCapacity;
+extern char const* const _PREHASH_RequestID;
+extern char const* const _PREHASH_RequestXfer;
+extern char const* const _PREHASH_ObjectTaxCurrent;
+extern char const* const _PREHASH_LightTaxCurrent;
+extern char const* const _PREHASH_LandTaxCurrent;
+extern char const* const _PREHASH_GroupTaxCurrent;
+extern char const* const _PREHASH_FetchInventoryDescendents;
+extern char const* const _PREHASH_InventoryDescendents;
+extern char const* const _PREHASH_Descendents;
+extern char const* const _PREHASH_PurgeInventoryDescendents;
+extern char const* const _PREHASH_ShowDir;
+extern char const* const _PREHASH_IsOwner;
+extern char const* const _PREHASH_Timestamp;
+extern char const* const _PREHASH_GlobalPos;
+extern char const* const _PREHASH_GrabOffsetInitial;
+extern char const* const _PREHASH_IsTrial;
+extern char const* const _PREHASH_ObjectDuplicateOnRay;
+extern char const* const _PREHASH_GroupMembershipCount;
+extern char const* const _PREHASH_MethodData;
+extern char const* const _PREHASH_ActivateGestures;
+extern char const* const _PREHASH_DeactivateGestures;
+extern char const* const _PREHASH_ProposalData;
+extern char const* const _PREHASH_PosGlobal;
+extern char const* const _PREHASH_SearchID;
+extern char const* const _PREHASH_RezMultipleAttachmentsFromInv;
+extern char const* const _PREHASH_SearchName;
+extern char const* const _PREHASH_VersionString;
+extern char const* const _PREHASH_CreateGroupReply;
+extern char const* const _PREHASH_LeaveGroupReply;
+extern char const* const _PREHASH_ActualArea;
+extern char const* const _PREHASH_Message;
+extern char const* const _PREHASH_ClickAction;
+extern char const* const _PREHASH_AssetUploadComplete;
+extern char const* const _PREHASH_RequestType;
+extern char const* const _PREHASH_UUID;
+extern char const* const _PREHASH_BaseMask;
+extern char const* const _PREHASH_NetBlock;
+extern char const* const _PREHASH_GlobalX;
+extern char const* const _PREHASH_GlobalY;
+extern char const* const _PREHASH_CopyRotates;
+extern char const* const _PREHASH_KickUserAck;
+extern char const* const _PREHASH_TopPick;
+extern char const* const _PREHASH_SessionID;
+extern char const* const _PREHASH_GlobalZ;
+extern char const* const _PREHASH_DeclineFriendship;
+extern char const* const _PREHASH_FormFriendship;
+extern char const* const _PREHASH_TerminateFriendship;
+extern char const* const _PREHASH_TaskData;
+extern char const* const _PREHASH_SimWideMaxPrims;
+extern char const* const _PREHASH_TotalPrims;
+extern char const* const _PREHASH_ProfileBegin;
+extern char const* const _PREHASH_Request;
+extern char const* const _PREHASH_GroupAccountDetailsRequest;
+extern char const* const _PREHASH_GroupActiveProposalsRequest;
+extern char const* const _PREHASH_StringValue;
+extern char const* const _PREHASH_Version;
+extern char const* const _PREHASH_OtherCount;
+extern char const* const _PREHASH_MemberCount;
+extern char const* const _PREHASH_ChatData;
+extern char const* const _PREHASH_IsGroupOwned;
+extern char const* const _PREHASH_EnergyEfficiency;
+extern char const* const _PREHASH_PickInfoUpdate;
+extern char const* const _PREHASH_PickDelete;
+extern char const* const _PREHASH_ScriptReset;
+extern char const* const _PREHASH_Requester;
+extern char const* const _PREHASH_ForSale;
+extern char const* const _PREHASH_NearestLandingRegionReply;
+extern char const* const _PREHASH_ParcelID;
+extern char const* const _PREHASH_Godlike;
+extern char const* const _PREHASH_TotalDebits;
+extern char const* const _PREHASH_Direction;
+extern char const* const _PREHASH_HealthData;
+extern char const* const _PREHASH_LeftAxis;
+extern char const* const _PREHASH_LocationBlock;
+extern char const* const _PREHASH_ObjectImage;
+extern char const* const _PREHASH_TerrainStartHeight00;
+extern char const* const _PREHASH_TerrainStartHeight01;
+extern char const* const _PREHASH_TerrainStartHeight10;
+extern char const* const _PREHASH_TerrainStartHeight11;
+extern char const* const _PREHASH_WaterHeight;
+extern char const* const _PREHASH_FetchInventoryReply;
+extern char const* const _PREHASH_GroupAccountSummaryReply;
+extern char const* const _PREHASH_AttachedSound;
+extern char const* const _PREHASH_ParamInUse;
+extern char const* const _PREHASH_GodKickUser;
+extern char const* const _PREHASH_PickName;
+extern char const* const _PREHASH_TaskName;
+extern char const* const _PREHASH_ObjectCount;
+extern char const* const _PREHASH_RegionPresenceRequestByHandle;
+extern char const* const _PREHASH_RezSingleAttachmentFromInv;
+extern char const* const _PREHASH_ChildAgentUpdate;
+extern char const* const _PREHASH_IsOwnerGroup;
+extern char const* const _PREHASH_AgentHeightWidth;
+extern char const* const _PREHASH_VerticalAngle;
+extern char const* const _PREHASH_WearableType;
+extern char const* const _PREHASH_AggregatePermNextOwner;
+extern char const* const _PREHASH_ShowInList;
+extern char const* const _PREHASH_UpdateParcel;
+extern char const* const _PREHASH_SetAlwaysRun;
+extern char const* const _PREHASH_NVPair;
+extern char const* const _PREHASH_SearchType;
+extern char const* const _PREHASH_ObjectSpinStart;
+extern char const* const _PREHASH_UseEstateSun;
+extern char const* const _PREHASH_RegionID;
+extern char const* const _PREHASH_AbuseRegionID;
+extern char const* const _PREHASH_Creator;
+extern char const* const _PREHASH_ProposalText;
+extern char const* const _PREHASH_DirEventsReply;
+extern char const* const _PREHASH_EventInfoReply;
+extern char const* const _PREHASH_UserInfoReply;
+extern char const* const _PREHASH_PathRadiusOffset;
+extern char const* const _PREHASH_TextureData;
+extern char const* const _PREHASH_ChatPass;
+extern char const* const _PREHASH_TargetID;
+extern char const* const _PREHASH_DefaultPayPrice;
+extern char const* const _PREHASH_UserLocation;
+extern char const* const _PREHASH_MaxPrims;
+extern char const* const _PREHASH_LandmarkID;
+extern char const* const _PREHASH_InitiateDownload;
+extern char const* const _PREHASH_Name;
+extern char const* const _PREHASH_OtherCleanTime;
+extern char const* const _PREHASH_ParcelSetOtherCleanTime;
+extern char const* const _PREHASH_TeleportPriceExponent;
+extern char const* const _PREHASH_Gain;
+extern char const* const _PREHASH_PacketAck;
+extern char const* const _PREHASH_PathSkew;
+extern char const* const _PREHASH_SimulatorShutdownRequest;
+extern char const* const _PREHASH_NearestLandingRegionRequest;
+extern char const* const _PREHASH_OtherID;
+extern char const* const _PREHASH_MemberID;
+extern char const* const _PREHASH_MapLayerRequest;
+extern char const* const _PREHASH_ObjectScale;
+extern char const* const _PREHASH_TargetIP;
+extern char const* const _PREHASH_Redo;
+extern char const* const _PREHASH_MoneyBalance;
+extern char const* const _PREHASH_TrackAgent;
+extern char const* const _PREHASH_MaxX;
+extern char const* const _PREHASH_Data;
+extern char const* const _PREHASH_MaxY;
+extern char const* const _PREHASH_TextureAnim;
+extern char const* const _PREHASH_ReturnIDs;
+extern char const* const _PREHASH_Date;
+extern char const* const _PREHASH_AgentWearablesUpdate;
+extern char const* const _PREHASH_AgentDataUpdate;
+extern char const* const _PREHASH_GroupDataUpdate;
+extern char const* const _PREHASH_Hash;
+extern char const* const _PREHASH_AgentGroupDataUpdate;
+extern char const* const _PREHASH_Left;
+extern char const* const _PREHASH_Mask;
+extern char const* const _PREHASH_ForceMouselook;
+extern char const* const _PREHASH_Success;
+extern char const* const _PREHASH_ObjectGroup;
+extern char const* const _PREHASH_SunHour;
+extern char const* const _PREHASH_MinX;
+extern char const* const _PREHASH_ScriptSensorReply;
+extern char const* const _PREHASH_MinY;
+extern char const* const _PREHASH_Command;
+extern char const* const _PREHASH_Desc;
+extern char const* const _PREHASH_AttachmentNeedsSave;
+extern char const* const _PREHASH_HistoryItemData;
+extern char const* const _PREHASH_AgentCachedTexture;
+extern char const* const _PREHASH_Subject;
+extern char const* const _PREHASH_East;
+extern char const* const _PREHASH_QueryReplies;
+extern char const* const _PREHASH_ObjectCategory;
+extern char const* const _PREHASH_Time;
+extern char const* const _PREHASH_CreateLandmarkForEvent;
+extern char const* const _PREHASH_ParentID;
+extern char const* const _PREHASH_Ping;
+extern char const* const _PREHASH_Perp;
+extern char const* const _PREHASH_Code;
+extern char const* const _PREHASH_InvType;
+extern char const* const _PREHASH_AgentFOV;
+extern char const* const _PREHASH_Audible;
+extern char const* const _PREHASH_AuctionData;
+extern char const* const _PREHASH_IDBlock;
+extern char const* const _PREHASH_West;
+extern char const* const _PREHASH_Undo;
+extern char const* const _PREHASH_TotalNumItems;
+extern char const* const _PREHASH_Info;
+extern char const* const _PREHASH_Area;
+extern char const* const _PREHASH_SimCrashed;
+extern char const* const _PREHASH_Text;
+extern char const* const _PREHASH_PriceGroupCreate;
+extern char const* const _PREHASH_ObjectShape;
+extern char const* const _PREHASH_GroupRoleDataReply;
+extern char const* const _PREHASH_MuteCRC;
+extern char const* const _PREHASH_Size;
+extern char const* const _PREHASH_FromAddress;
+extern char const* const _PREHASH_Body;
+extern char const* const _PREHASH_FileData;
+extern char const* const _PREHASH_List;
+extern char const* const _PREHASH_KickUser;
+extern char const* const _PREHASH_OtherPrims;
+extern char const* const _PREHASH_RunTime;
+extern char const* const _PREHASH_GrantUserRights;
+extern char const* const _PREHASH_RpcScriptRequestInboundForward;
+extern char const* const _PREHASH_More;
+extern char const* const _PREHASH_Majority;
+extern char const* const _PREHASH_MetersTraveled;
+extern char const* const _PREHASH_Stat;
+extern char const* const _PREHASH_SoundID;
+extern char const* const _PREHASH_Item;
+extern char const* const _PREHASH_User;
+extern char const* const _PREHASH_Prey;
+extern char const* const _PREHASH_RayStart;
+extern char const* const _PREHASH_UsecSinceStart;
+extern char const* const _PREHASH_ParcelData;
+extern char const* const _PREHASH_CameraUpAxis;
+extern char const* const _PREHASH_ScriptDialog;
+extern char const* const _PREHASH_MasterParcelData;
+extern char const* const _PREHASH_Invalid;
+extern char const* const _PREHASH_ProfileCurve;
+extern char const* const _PREHASH_ParcelAccessListUpdate;
+extern char const* const _PREHASH_MuteListUpdate;
+extern char const* const _PREHASH_SendPacket;
+extern char const* const _PREHASH_SendXferPacket;
+extern char const* const _PREHASH_RegionDenyIdentified;
+extern char const* const _PREHASH_NotecardItemID;
+extern char const* const _PREHASH_LastName;
+extern char const* const _PREHASH_From;
+extern char const* const _PREHASH_RoleChange;
+extern char const* const _PREHASH_Port;
+extern char const* const _PREHASH_MemberTitle;
+extern char const* const _PREHASH_LogParcelChanges;
+extern char const* const _PREHASH_AgentCachedTextureResponse;
+extern char const* const _PREHASH_DeRezObject;
+extern char const* const _PREHASH_IsTemporary;
+extern char const* const _PREHASH_InsigniaID;
+extern char const* const _PREHASH_CheckFlags;
+extern char const* const _PREHASH_EventID;
+extern char const* const _PREHASH_Selected;
+extern char const* const _PREHASH_FromAgentId;
+extern char const* const _PREHASH_Type;
+extern char const* const _PREHASH_ChatType;
+extern char const* const _PREHASH_ReportData;
+extern char const* const _PREHASH_RequestBlock;
+extern char const* const _PREHASH_GrantData;
+extern char const* const _PREHASH_DetachAttachmentIntoInv;
+extern char const* const _PREHASH_ParcelDisableObjects;
+extern char const* const _PREHASH_Sections;
+extern char const* const _PREHASH_GodLevel;
+extern char const* const _PREHASH_PayPriceReply;
+extern char const* const _PREHASH_QueryID;
+extern char const* const _PREHASH_CameraEyeOffset;
+extern char const* const _PREHASH_AgentPosition;
+extern char const* const _PREHASH_GrabPosition;
+extern char const* const _PREHASH_OnlineNotification;
+extern char const* const _PREHASH_OfflineNotification;
+extern char const* const _PREHASH_SendPostcard;
+extern char const* const _PREHASH_RequestFlags;
+extern char const* const _PREHASH_GroupAccountSummaryRequest;
+extern char const* const _PREHASH_GroupVoteHistoryRequest;
+extern char const* const _PREHASH_ParamValue;
+extern char const* const _PREHASH_MaxAgents;
+extern char const* const _PREHASH_CreateNewOutfitAttachments;
+extern char const* const _PREHASH_RegionHandle;
+extern char const* const _PREHASH_TeleportProgress;
+extern char const* const _PREHASH_AgentQuitCopy;
+extern char const* const _PREHASH_AvatarInterestsUpdate;
+extern char const* const _PREHASH_GroupNoticeID;
+extern char const* const _PREHASH_ParcelName;
+extern char const* const _PREHASH_PriceObjectRent;
+extern char const* const _PREHASH_OfferCallingCard;
+extern char const* const _PREHASH_AcceptCallingCard;
+extern char const* const _PREHASH_DeclineCallingCard;
+extern char const* const _PREHASH_AgentAccess;
+extern char const* const _PREHASH_AgentLegacyAccess;
+extern char const* const _PREHASH_AgentMaxAccess;
+extern char const* const _PREHASH_DataHomeLocationReply;
+extern char const* const _PREHASH_EventLocationReply;
+extern char const* const _PREHASH_TerseDateID;
+extern char const* const _PREHASH_ObjectOwner;
+extern char const* const _PREHASH_AssetID;
+extern char const* const _PREHASH_AlertMessage;
+extern char const* const _PREHASH_AgentAlertMessage;
+extern char const* const _PREHASH_EstateOwnerMessage;
+extern char const* const _PREHASH_ParcelMediaCommandMessage;
+extern char const* const _PREHASH_Auction;
+extern char const* const _PREHASH_Category;
+extern char const* const _PREHASH_FilePath;
+extern char const* const _PREHASH_ItemFlags;
+extern char const* const _PREHASH_Invoice;
+extern char const* const _PREHASH_IntervalDays;
+extern char const* const _PREHASH_PathScaleX;
+extern char const* const _PREHASH_FromTaskID;
+extern char const* const _PREHASH_PathScaleY;
+extern char const* const _PREHASH_TimeInfo;
+extern char const* const _PREHASH_PublicCount;
+extern char const* const _PREHASH_ParcelJoin;
+extern char const* const _PREHASH_GroupRolesCount;
+extern char const* const _PREHASH_SimulatorBlock;
+extern char const* const _PREHASH_GroupID;
+extern char const* const _PREHASH_AgentVel;
+extern char const* const _PREHASH_RequestImage;
+extern char const* const _PREHASH_NetStats;
+extern char const* const _PREHASH_AgentPos;
+extern char const* const _PREHASH_AgentSit;
+extern char const* const _PREHASH_Material;
+extern char const* const _PREHASH_ObjectDeGrab;
+extern char const* const _PREHASH_VelocityInterpolateOff;
+extern char const* const _PREHASH_AuthorizedBuyerID;
+extern char const* const _PREHASH_AvatarPropertiesReply;
+extern char const* const _PREHASH_GroupProfileReply;
+extern char const* const _PREHASH_SimOwner;
+extern char const* const _PREHASH_SalePrice;
+extern char const* const _PREHASH_Animation;
+extern char const* const _PREHASH_OwnerID;
+extern char const* const _PREHASH_NearestLandingRegionUpdated;
+extern char const* const _PREHASH_PassToAgent;
+extern char const* const _PREHASH_PreyAgent;
+extern char const* const _PREHASH_SimStats;
+extern char const* const _PREHASH_LogoutReply;
+extern char const* const _PREHASH_FeatureDisabled;
+extern char const* const _PREHASH_PhysicalAvatarEventList;
+extern char const* const _PREHASH_ObjectLocalID;
+extern char const* const _PREHASH_Dropped;
+extern char const* const _PREHASH_WebProfilesDisabled;
+extern char const* const _PREHASH_Destination;
+extern char const* const _PREHASH_MasterID;
+extern char const* const _PREHASH_TransferData;
+extern char const* const _PREHASH_WantToMask;
+extern char const* const _PREHASH_ParcelSelectObjects;
+extern char const* const _PREHASH_ExtraParams;
+extern char const* const _PREHASH_CreatorID;
+extern char const* const _PREHASH_Summary;
+extern char const* const _PREHASH_BuyObjectInventory;
+extern char const* const _PREHASH_FetchInventory;
+extern char const* const _PREHASH_InventoryID;
+extern char const* const _PREHASH_PacketNumber;
+extern char const* const _PREHASH_SetFollowCamProperties;
+extern char const* const _PREHASH_ClearFollowCamProperties;
+extern char const* const _PREHASH_SequenceID;
+extern char const* const _PREHASH_DataServerLogout;
+extern char const* const _PREHASH_NameValue;
+extern char const* const _PREHASH_PathShearX;
+extern char const* const _PREHASH_PathShearY;
+extern char const* const _PREHASH_Velocity;
+extern char const* const _PREHASH_SecPerYear;
+extern char const* const _PREHASH_FirstName;
+extern char const* const _PREHASH_AttachedSoundGainChange;
+extern char const* const _PREHASH_LocationID;
+extern char const* const _PREHASH_Running;
+extern char const* const _PREHASH_AgentThrottle;
+extern char const* const _PREHASH_NeighborList;
+extern char const* const _PREHASH_PathTaperX;
+extern char const* const _PREHASH_PathTaperY;
+extern char const* const _PREHASH_AgentRelated;
+extern char const* const _PREHASH_GranterBlock;
+extern char const* const _PREHASH_UseCachedMuteList;
+extern char const* const _PREHASH_FailStats;
+extern char const* const _PREHASH_Tempfile;
+extern char const* const _PREHASH_BuyerID;
+extern char const* const _PREHASH_DirPeopleReply;
+extern char const* const _PREHASH_TransferInfo;
+extern char const* const _PREHASH_AvatarPickerRequestBackend;
+extern char const* const _PREHASH_AvatarPropertiesRequestBackend;
+extern char const* const _PREHASH_UpdateData;
+extern char const* const _PREHASH_SimFPS;
+extern char const* const _PREHASH_ReporterID;
+extern char const* const _PREHASH_ButtonLabel;
+extern char const* const _PREHASH_GranterID;
+extern char const* const _PREHASH_WantToText;
+extern char const* const _PREHASH_ReportType;
+extern char const* const _PREHASH_SimulatorReady;
+extern char const* const _PREHASH_DataBlock;
+extern char const* const _PREHASH_AnimationSourceList;
+extern char const* const _PREHASH_SubscribeLoad;
+extern char const* const _PREHASH_UnsubscribeLoad;
+extern char const* const _PREHASH_Packet;
+extern char const* const _PREHASH_UndoLand;
+extern char const* const _PREHASH_SimAccess;
+extern char const* const _PREHASH_AbuserID;
+extern char const* const _PREHASH_MembershipFee;
+extern char const* const _PREHASH_InviteGroupResponse;
+extern char const* const _PREHASH_CreateInventoryFolder;
+extern char const* const _PREHASH_UpdateInventoryFolder;
+extern char const* const _PREHASH_MoveInventoryFolder;
+extern char const* const _PREHASH_RemoveInventoryFolder;
+extern char const* const _PREHASH_MoneyData;
+extern char const* const _PREHASH_ObjectDeselect;
+extern char const* const _PREHASH_NewAssetID;
+extern char const* const _PREHASH_ObjectAdd;
+extern char const* const _PREHASH_SimulatorFeatures;
+extern char const* const _PREHASH_RayEndIsIntersection;
+extern char const* const _PREHASH_CompleteAuction;
+extern char const* const _PREHASH_CircuitCode;
+extern char const* const _PREHASH_AgentMovementComplete;
+extern char const* const _PREHASH_ViewerIP;
+extern char const* const _PREHASH_Header;
+extern char const* const _PREHASH_GestureFlags;
+extern char const* const _PREHASH_XferID;
+extern char const* const _PREHASH_StatValue;
+extern char const* const _PREHASH_TaskID;
+extern char const* const _PREHASH_PickID;
+extern char const* const _PREHASH_RayEnd;
+extern char const* const _PREHASH_Throttles;
+extern char const* const _PREHASH_RebakeAvatarTextures;
+extern char const* const _PREHASH_UpAxis;
+extern char const* const _PREHASH_AgentTextures;
+extern char const* const _PREHASH_NotecardData;
+extern char const* const _PREHASH_Radius;
+extern char const* const _PREHASH_OffCircuit;
+extern char const* const _PREHASH_Access;
+extern char const* const _PREHASH_TitleRoleID;
+extern char const* const _PREHASH_SquareMetersCredit;
+extern char const* const _PREHASH_Filename;
+extern char const* const _PREHASH_ClassifiedInfoRequest;
+extern char const* const _PREHASH_ParcelInfoRequest;
+extern char const* const _PREHASH_ParcelObjectOwnersRequest;
+extern char const* const _PREHASH_TeleportLandmarkRequest;
+extern char const* const _PREHASH_EventInfoRequest;
+extern char const* const _PREHASH_MoneyBalanceRequest;
+extern char const* const _PREHASH_GroupMembersRequest;
+extern char const* const _PREHASH_GroupRoleMembersRequest;
+extern char const* const _PREHASH_ChatFromSimulator;
+extern char const* const _PREHASH_OldFolderID;
+extern char const* const _PREHASH_UserInfoRequest;
+extern char const* const _PREHASH_TextureID;
+extern char const* const _PREHASH_ProfileURL;
+extern char const* const _PREHASH_Handle;
+extern char const* const _PREHASH_ButtonIndex;
+extern char const* const _PREHASH_GetScriptRunning;
+extern char const* const _PREHASH_SetScriptRunning;
+extern char const* const _PREHASH_Health;
+extern char const* const _PREHASH_CircuitInfo;
+extern char const* const _PREHASH_ObjectBuy;
+extern char const* const _PREHASH_ProfileEnd;
+extern char const* const _PREHASH_Effect;
+extern char const* const _PREHASH_TestMessage;
+extern char const* const _PREHASH_ScriptMailRegistration;
+extern char const* const _PREHASH_AgentSetAppearance;
+extern char const* const _PREHASH_AvatarAppearance;
+extern char const* const _PREHASH_RegionData;
+extern char const* const _PREHASH_RequestingRegionData;
+extern char const* const _PREHASH_LandingRegionData;
+extern char const* const _PREHASH_SitTransform;
+extern char const* const _PREHASH_TerrainBase0;
+extern char const* const _PREHASH_SkillsMask;
+extern char const* const _PREHASH_AtAxis;
+extern char const* const _PREHASH_TerrainBase1;
+extern char const* const _PREHASH_Reason;
+extern char const* const _PREHASH_TerrainBase2;
+extern char const* const _PREHASH_TerrainBase3;
+extern char const* const _PREHASH_Params;
+extern char const* const _PREHASH_PingID;
+extern char const* const _PREHASH_Change;
+extern char const* const _PREHASH_Height;
+extern char const* const _PREHASH_Region;
+extern char const* const _PREHASH_TelehubInfo;
+extern char const* const _PREHASH_StateSave;
+extern char const* const _PREHASH_RoleData;
+extern char const* const _PREHASH_AgentAnimation;
+extern char const* const _PREHASH_AvatarAnimation;
+extern char const* const _PREHASH_LogDwellTime;
+extern char const* const _PREHASH_ParcelGodMarkAsContent;
+extern char const* const _PREHASH_UsePhysics;
+extern char const* const _PREHASH_RegionDenyTransacted;
+extern char const* const _PREHASH_JointType;
+extern char const* const _PREHASH_ObjectTaxEstimate;
+extern char const* const _PREHASH_LightTaxEstimate;
+extern char const* const _PREHASH_LandTaxEstimate;
+extern char const* const _PREHASH_TeleportLandingStatusChanged;
+extern char const* const _PREHASH_GroupTaxEstimate;
+extern char const* const _PREHASH_AvgViewerFPS;
+extern char const* const _PREHASH_Buttons;
+extern char const* const _PREHASH_Sender;
+extern char const* const _PREHASH_Dialog;
+extern char const* const _PREHASH_TargetData;
+extern char const* const _PREHASH_DestID;
+extern char const* const _PREHASH_PricePublicObjectDelete;
+extern char const* const _PREHASH_ObjectDelete;
+extern char const* const _PREHASH_Delete;
+extern char const* const _PREHASH_EventGodDelete;
+extern char const* const _PREHASH_LastTaxDate;
+extern char const* const _PREHASH_MapImageID;
+extern char const* const _PREHASH_EndDateTime;
+extern char const* const _PREHASH_TerrainDetail0;
+extern char const* const _PREHASH_TerrainDetail1;
+extern char const* const _PREHASH_TerrainDetail2;
+extern char const* const _PREHASH_TerrainDetail3;
+extern char const* const _PREHASH_Offset;
+extern char const* const _PREHASH_ObjectDelink;
+extern char const* const _PREHASH_TargetObject;
+extern char const* const _PREHASH_IsEstateManager;
+extern char const* const _PREHASH_CancelAuction;
+extern char const* const _PREHASH_ObjectDetach;
+extern char const* const _PREHASH_Compressed;
+extern char const* const _PREHASH_PathBegin;
+extern char const* const _PREHASH_BypassRaycast;
+extern char const* const _PREHASH_WinnerID;
+extern char const* const _PREHASH_ChannelType;
+extern char const* const _PREHASH_NonExemptMembers;
+extern char const* const _PREHASH_Agents;
+extern char const* const _PREHASH_MemberData;
+extern char const* const _PREHASH_ToGroupID;
+extern char const* const _PREHASH_ImageNotInDatabase;
+extern char const* const _PREHASH_StartDate;
+extern char const* const _PREHASH_AnimID;
+extern char const* const _PREHASH_Serial;
+extern char const* const _PREHASH_AbuseRegionName;
+extern char const* const _PREHASH_ModifyLand;
+extern char const* const _PREHASH_Digest;
+extern char const* const _PREHASH_Victim;
+extern char const* const _PREHASH_Script;
+extern char const* const _PREHASH_PickInfoReply;
+extern char const* const _PREHASH_MoneyBalanceReply;
+extern char const* const _PREHASH_RoutedMoneyBalanceReply;
+extern char const* const _PREHASH_RoleID;
+extern char const* const _PREHASH_RegionInfo;
+extern char const* const _PREHASH_GodUpdateRegionInfo;
+extern char const* const _PREHASH_StartAnim;
+extern char const* const _PREHASH_Action;
+extern char const* const _PREHASH_Location;
+extern char const* const _PREHASH_Rights;
+extern char const* const _PREHASH_SearchDir;
+extern char const* const _PREHASH_TransferRequest;
+extern char const* const _PREHASH_ScriptSensorRequest;
+extern char const* const _PREHASH_MoneyTransferRequest;
+extern char const* const _PREHASH_EjectGroupMemberRequest;
+extern char const* const _PREHASH_SkillsText;
+extern char const* const _PREHASH_Resent;
+extern char const* const _PREHASH_Center;
+extern char const* const _PREHASH_SharedData;
+extern char const* const _PREHASH_PSBlock;
+extern char const* const _PREHASH_UUIDNameBlock;
+extern char const* const _PREHASH_GroupTitleUpdate;
+extern char const* const _PREHASH_Method;
+extern char const* const _PREHASH_TouchName;
+extern char const* const _PREHASH_UpdateType;
+extern char const* const _PREHASH_KickedFromEstateID;
+extern char const* const _PREHASH_CandidateID;
+extern char const* const _PREHASH_ParamData;
+extern char const* const _PREHASH_GodlikeMessage;
+extern char const* const _PREHASH_SystemMessage;
+extern char const* const _PREHASH_BodyRotation;
+extern char const* const _PREHASH_SearchRegions;
+extern char const* const _PREHASH_AnimationData;
+extern char const* const _PREHASH_StatID;
+extern char const* const _PREHASH_ItemID;
+extern char const* const _PREHASH_ScriptDialogReply;
+extern char const* const _PREHASH_RegionIDAndHandleReply;
+extern char const* const _PREHASH_CameraAtOffset;
+extern char const* const _PREHASH_VoteID;
+extern char const* const _PREHASH_ParcelGodForceOwner;
+extern char const* const _PREHASH_Filter;
+extern char const* const _PREHASH_InviteData;
+extern char const* const _PREHASH_PCode;
+extern char const* const _PREHASH_SearchPos;
+extern char const* const _PREHASH_PreyID;
+extern char const* const _PREHASH_TerrainLowerLimit;
+extern char const* const _PREHASH_EventFlags;
+extern char const* const _PREHASH_TallyVotes;
+extern char const* const _PREHASH_Result;
+extern char const* const _PREHASH_LookAt;
+extern char const* const _PREHASH_SearchOrder;
+extern char const* const _PREHASH_PayButton;
+extern char const* const _PREHASH_SelfCount;
+extern char const* const _PREHASH_PacketCount;
+extern char const* const _PREHASH_ParcelBuyPass;
+extern char const* const _PREHASH_OldItemID;
+extern char const* const _PREHASH_RegionPort;
+extern char const* const _PREHASH_PriceEnergyUnit;
+extern char const* const _PREHASH_Bitmap;
+extern char const* const _PREHASH_CacheMissType;
+extern char const* const _PREHASH_VFileID;
+extern char const* const _PREHASH_GroupInsigniaID;
+extern char const* const _PREHASH_Online;
+extern char const* const _PREHASH_KickFlags;
+extern char const* const _PREHASH_CovenantID;
+extern char const* const _PREHASH_SysCPU;
+extern char const* const _PREHASH_EMail;
+extern char const* const _PREHASH_AggregatePermTextures;
+extern char const* const _PREHASH_ChatChannel;
+extern char const* const _PREHASH_ReturnID;
+extern char const* const _PREHASH_ObjectAttach;
+extern char const* const _PREHASH_TargetPort;
+extern char const* const _PREHASH_ObjectSpinStop;
+extern char const* const _PREHASH_FullID;
+extern char const* const _PREHASH_ActivateGroup;
+extern char const* const _PREHASH_SysGPU;
+extern char const* const _PREHASH_AvatarInterestsReply;
+extern char const* const _PREHASH_StartLure;
+extern char const* const _PREHASH_SysRAM;
+extern char const* const _PREHASH_ObjectPosition;
+extern char const* const _PREHASH_SitPosition;
+extern char const* const _PREHASH_StartTime;
+extern char const* const _PREHASH_BornOn;
+extern char const* const _PREHASH_CameraCollidePlane;
+extern char const* const _PREHASH_EconomyDataRequest;
+extern char const* const _PREHASH_TeleportLureRequest;
+extern char const* const _PREHASH_FolderID;
+extern char const* const _PREHASH_RegionHandleRequest;
+extern char const* const _PREHASH_ScriptDataRequest;
+extern char const* const _PREHASH_GroupRoleDataRequest;
+extern char const* const _PREHASH_GroupTitlesRequest;
+extern char const* const _PREHASH_AgentWearablesRequest;
+extern char const* const _PREHASH_MapBlockRequest;
+extern char const* const _PREHASH_LureID;
+extern char const* const _PREHASH_CopyCenters;
+extern char const* const _PREHASH_ParamList;
+extern char const* const _PREHASH_InventorySerial;
+extern char const* const _PREHASH_EdgeDataPacket;
+extern char const* const _PREHASH_AvatarPickerReply;
+extern char const* const _PREHASH_ParcelDwellReply;
+extern char const* const _PREHASH_IsForSale;
+extern char const* const _PREHASH_MuteID;
+extern char const* const _PREHASH_MeanCollisionAlert;
+extern char const* const _PREHASH_CanAcceptTasks;
+extern char const* const _PREHASH_ItemData;
+extern char const* const _PREHASH_AnimationList;
+extern char const* const _PREHASH_Reputation;
+extern char const* const _PREHASH_IntValue;
+extern char const* const _PREHASH_TargetType;
+extern char const* const _PREHASH_Amount;
+extern char const* const _PREHASH_HasAttachment;
+extern char const* const _PREHASH_UpdateAttachment;
+extern char const* const _PREHASH_RemoveAttachment;
+extern char const* const _PREHASH_HeightWidthBlock;
+extern char const* const _PREHASH_RequestObjectPropertiesFamily;
+extern char const* const _PREHASH_ObjectPropertiesFamily;
+extern char const* const _PREHASH_UserData;
+extern char const* const _PREHASH_IsReadable;
+extern char const* const _PREHASH_PathCurve;
+extern char const* const _PREHASH_Status;
+extern char const* const _PREHASH_FromGroup;
+extern char const* const _PREHASH_AlreadyVoted;
+extern char const* const _PREHASH_PlacesReply;
+extern char const* const _PREHASH_DirPlacesReply;
+extern char const* const _PREHASH_ParcelBuy;
+extern char const* const _PREHASH_DirFindQueryBackend;
+extern char const* const _PREHASH_DirPlacesQueryBackend;
+extern char const* const _PREHASH_DirClassifiedQueryBackend;
+extern char const* const _PREHASH_DirLandQueryBackend;
+extern char const* const _PREHASH_DirPopularQueryBackend;
+extern char const* const _PREHASH_HistoryData;
+extern char const* const _PREHASH_SnapshotID;
+extern char const* const _PREHASH_Aspect;
+extern char const* const _PREHASH_ParamSize;
+extern char const* const _PREHASH_VoteCast;
+extern char const* const _PREHASH_CastsShadows;
+extern char const* const _PREHASH_EveryoneMask;
+extern char const* const _PREHASH_ObjectSpinUpdate;
+extern char const* const _PREHASH_MaturePublish;
+extern char const* const _PREHASH_UseExistingAsset;
+extern char const* const _PREHASH_Powers;
+extern char const* const _PREHASH_ParcelLocalID;
+extern char const* const _PREHASH_TeleportCancel;
+extern char const* const _PREHASH_UnixTime;
+extern char const* const _PREHASH_QueryFlags;
+extern char const* const _PREHASH_AlwaysRun;
+extern char const* const _PREHASH_Bottom;
+extern char const* const _PREHASH_ButtonData;
+extern char const* const _PREHASH_SoundData;
+extern char const* const _PREHASH_ViewerStats;
+extern char const* const _PREHASH_RegionHandshake;
+extern char const* const _PREHASH_ObjectDescription;
+extern char const* const _PREHASH_Description;
+extern char const* const _PREHASH_ParamType;
+extern char const* const _PREHASH_UUIDNameReply;
+extern char const* const _PREHASH_UUIDGroupNameReply;
+extern char const* const _PREHASH_SaveAssetIntoInventory;
+extern char const* const _PREHASH_UserInfo;
+extern char const* const _PREHASH_AnimSequenceID;
+extern char const* const _PREHASH_NVPairs;
+extern char const* const _PREHASH_GroupNoticesListRequest;
+extern char const* const _PREHASH_ParcelAccessListRequest;
+extern char const* const _PREHASH_MuteListRequest;
+extern char const* const _PREHASH_RpcChannelRequest;
+extern char const* const _PREHASH_LandStatRequest;
+extern char const* const _PREHASH_PlacesQuery;
+extern char const* const _PREHASH_DirPlacesQuery;
+extern char const* const _PREHASH_SortOrder;
+extern char const* const _PREHASH_Hunter;
+extern char const* const _PREHASH_SunAngVelocity;
+extern char const* const _PREHASH_BinaryBucket;
+extern char const* const _PREHASH_ImagePacket;
+extern char const* const _PREHASH_StartGroupProposal;
+extern char const* const _PREHASH_EnergyLevel;
+extern char const* const _PREHASH_PriceForListing;
+extern char const* const _PREHASH_Scale;
+extern char const* const _PREHASH_EstateCovenantReply;
+extern char const* const _PREHASH_ParentEstateID;
+extern char const* const _PREHASH_Extra2;
+extern char const* const _PREHASH_Throttle;
+extern char const* const _PREHASH_SimIP;
+extern char const* const _PREHASH_GodID;
+extern char const* const _PREHASH_TeleportMinPrice;
+extern char const* const _PREHASH_VoteItem;
+extern char const* const _PREHASH_ObjectRotation;
+extern char const* const _PREHASH_SitRotation;
+extern char const* const _PREHASH_SnapSelection;
+extern char const* const _PREHASH_SoundTrigger;
+extern char const* const _PREHASH_TerrainRaiseLimit;
+extern char const* const _PREHASH_Quorum;
+extern char const* const _PREHASH_AgentBlock;
+extern char const* const _PREHASH_CommandBlock;
+extern char const* const _PREHASH_PricePublicObjectDecay;
+extern char const* const _PREHASH_SpawnPointPos;
+extern char const* const _PREHASH_VolumeDetail;
+extern char const* const _PREHASH_FromAgentName;
+extern char const* const _PREHASH_Range;
+extern char const* const _PREHASH_DirectoryVisibility;
+extern char const* const _PREHASH_PublicIP;
+extern char const* const _PREHASH_TeleportFailed;
+extern char const* const _PREHASH_PreloadSound;
+extern char const* const _PREHASH_ScreenshotID;
+extern char const* const _PREHASH_CovenantTimestamp;
+extern char const* const _PREHASH_OldestUnacked;
+extern char const* const _PREHASH_SimulatorIP;
+extern char const* const _PREHASH_Value;
+extern char const* const _PREHASH_JointAxisOrAnchor;
+extern char const* const _PREHASH_Test0;
+extern char const* const _PREHASH_Test1;
+extern char const* const _PREHASH_Test2;
+extern char const* const _PREHASH_SunPhase;
+extern char const* const _PREHASH_ParcelDivide;
+extern char const* const _PREHASH_PriceObjectClaim;
+extern char const* const _PREHASH_Field;
+extern char const* const _PREHASH_Ratio;
+extern char const* const _PREHASH_JoinGroupReply;
+extern char const* const _PREHASH_LiveHelpGroupReply;
+extern char const* const _PREHASH_Score;
+extern char const* const _PREHASH_Image;
+extern char const* const _PREHASH_ObjectClickAction;
+extern char const* const _PREHASH_Parameter;
+extern char const* const _PREHASH_Flags;
+extern char const* const _PREHASH_Plane;
+extern char const* const _PREHASH_Width;
+extern char const* const _PREHASH_Right;
+extern char const* const _PREHASH_DirFindQuery;
+extern char const* const _PREHASH_Textures;
+extern char const* const _PREHASH_EventData;
+extern char const* const _PREHASH_Final;
+extern char const* const _PREHASH_System;
+extern char const* const _PREHASH_TelehubPos;
+extern char const* const _PREHASH_ReportAutosaveCrash;
+extern char const* const _PREHASH_CreateTrustedCircuit;
+extern char const* const _PREHASH_DenyTrustedCircuit;
+extern char const* const _PREHASH_RequestTrustedCircuit;
+extern char const* const _PREHASH_Codec;
+extern char const* const _PREHASH_Modal;
+extern char const* const _PREHASH_ChildAgentUnknown;
+extern char const* const _PREHASH_LandingType;
+extern char const* const _PREHASH_ScriptRunningReply;
+extern char const* const _PREHASH_Reply;
+extern char const* const _PREHASH_GroupAccountDetailsReply;
+extern char const* const _PREHASH_TelehubRot;
+extern char const* const _PREHASH_AcceptFriendship;
+extern char const* const _PREHASH_ItemType;
+extern char const* const _PREHASH_DwellInfo;
+extern char const* const _PREHASH_AgentResume;
+extern char const* const _PREHASH_MailFilter;
+extern char const* const _PREHASH_Disconnect;
+extern char const* const _PREHASH_SimPosition;
+extern char const* const _PREHASH_SimWideTotalPrims;
+extern char const* const _PREHASH_Index;
+extern char const* const _PREHASH_SimFilename;
+extern char const* const _PREHASH_LastOwnerID;
+extern char const* const _PREHASH_GroupNoticeRequest;
+extern char const* const _PREHASH_EmailMessageRequest;
+extern char const* const _PREHASH_MapItemRequest;
+extern char const* const _PREHASH_AgentCount;
+extern char const* const _PREHASH_MessageBlock;
+extern char const* const _PREHASH_FuseBlock;
+extern char const* const _PREHASH_AgentGroupData;
+extern char const* const _PREHASH_ClassifiedInfoUpdate;
+extern char const* const _PREHASH_RegionPos;
+extern char const* const _PREHASH_ParcelMediaUpdate;
+extern char const* const _PREHASH_NoticeID;
+extern char const* const _PREHASH_GridX;
+extern char const* const _PREHASH_GridY;
+extern char const* const _PREHASH_Title;
+extern char const* const _PREHASH_AuctionID;
+extern char const* const _PREHASH_VoteType;
+extern char const* const _PREHASH_CategoryID;
+extern char const* const _PREHASH_Token;
+extern char const* const _PREHASH_AggregatePerms;
+extern char const* const _PREHASH_ObjectSelect;
+extern char const* const _PREHASH_ForceObjectSelect;
+extern char const* const _PREHASH_Price;
+extern char const* const _PREHASH_SunDirection;
+extern char const* const _PREHASH_FromName;
+extern char const* const _PREHASH_ChangeInventoryItemFlags;
+extern char const* const _PREHASH_Force;
+extern char const* const _PREHASH_TransactionBlock;
+extern char const* const _PREHASH_PowersMask;
+extern char const* const _PREHASH_Stamp;
+extern char const* const _PREHASH_TotalCredits;
+extern char const* const _PREHASH_State;
+extern char const* const _PREHASH_TextureIndex;
+extern char const* const _PREHASH_InviteeID;
+extern char const* const _PREHASH_ParcelReclaim;
+extern char const* const _PREHASH_Money;
+extern char const* const _PREHASH_PathTwist;
+extern char const* const _PREHASH_AuthBuyerID;
+extern char const* const _PREHASH_Color;
+extern char const* const _PREHASH_SourceType;
+extern char const* const _PREHASH_World;
+extern char const* const _PREHASH_QueryData;
+extern char const* const _PREHASH_Users;
+extern char const* const _PREHASH_SysOS;
+extern char const* const _PREHASH_Notes;
+extern char const* const _PREHASH_AvatarID;
+extern char const* const _PREHASH_FounderID;
+extern char const* const _PREHASH_EndPointID;
+extern char const* const _PREHASH_LocationLookAt;
+extern char const* const _PREHASH_Sound;
+extern char const* const _PREHASH_Cover;
+extern char const* const _PREHASH_TotalObjectCount;
+extern char const* const _PREHASH_TextureEntry;
+extern char const* const _PREHASH_SquareMetersCommitted;
+extern char const* const _PREHASH_ChannelID;
+extern char const* const _PREHASH_Dwell;
+extern char const* const _PREHASH_North;
+extern char const* const _PREHASH_AgentUpdate;
+extern char const* const _PREHASH_PickGodDelete;
+extern char const* const _PREHASH_HostName;
+extern char const* const _PREHASH_PriceParcelClaim;
+extern char const* const _PREHASH_ParcelClaim;
+extern char const* const _PREHASH_AgentPowers;
+extern char const* const _PREHASH_ProfileHollow;
+extern char const* const _PREHASH_GroupRoleChanges;
+extern char const* const _PREHASH_Count;
+extern char const* const _PREHASH_South;
+extern char const* const _PREHASH_ObjectUpdateCompressed;
+extern char const* const _PREHASH_MuteFlags;
+extern char const* const _PREHASH_Group;
+extern char const* const _PREHASH_AgentPause;
+extern char const* const _PREHASH_LanguagesText;
+extern char const* const _PREHASH_Error;
+extern char const* const _PREHASH_InternalScriptMail;
+extern char const* const _PREHASH_FindAgent;
+extern char const* const _PREHASH_AgentData;
+extern char const* const _PREHASH_FolderData;
+extern char const* const _PREHASH_AssetBlock;
+extern char const* const _PREHASH_AcceptNotices;
+extern char const* const _PREHASH_SetGroupAcceptNotices;
+extern char const* const _PREHASH_CloseCircuit;
+extern char const* const _PREHASH_TeleportFinish;
+extern char const* const _PREHASH_PathRevolutions;
+extern char const* const _PREHASH_ClassifiedInfoReply;
+extern char const* const _PREHASH_ParcelInfoReply;
+extern char const* const _PREHASH_AutosaveData;
+extern char const* const _PREHASH_SetStartLocation;
+extern char const* const _PREHASH_PassHours;
+extern char const* const _PREHASH_AttachmentPt;
+extern char const* const _PREHASH_ParcelFlags;
+extern char const* const _PREHASH_NumVotes;
+extern char const* const _PREHASH_AvatarPickerRequest;
+extern char const* const _PREHASH_TeleportLocationRequest;
+extern char const* const _PREHASH_DataHomeLocationRequest;
+extern char const* const _PREHASH_EventNotificationAddRequest;
+extern char const* const _PREHASH_ParcelDwellRequest;
+extern char const* const _PREHASH_EventLocationRequest;
+extern char const* const _PREHASH_SetStartLocationRequest;
+extern char const* const _PREHASH_QueryStart;
+extern char const* const _PREHASH_EjectData;
+extern char const* const _PREHASH_AvatarTextureUpdate;
+extern char const* const _PREHASH_RPCServerPort;
+extern char const* const _PREHASH_Bytes;
+extern char const* const _PREHASH_Extra;
+extern char const* const _PREHASH_ForceScriptControlRelease;
+extern char const* const _PREHASH_ParcelRelease;
+extern char const* const _PREHASH_VFileType;
+extern char const* const _PREHASH_EjectGroupMemberReply;
+extern char const* const _PREHASH_ImageData;
+extern char const* const _PREHASH_SimulatorViewerTimeMessage;
+extern char const* const _PREHASH_Rotation;
+extern char const* const _PREHASH_Selection;
+extern char const* const _PREHASH_TransactionData;
+extern char const* const _PREHASH_OperationData;
+extern char const* const _PREHASH_ExpirationDate;
+extern char const* const _PREHASH_ParcelDeedToGroup;
+extern char const* const _PREHASH_AvatarPicksReply;
+extern char const* const _PREHASH_GroupTitlesReply;
+extern char const* const _PREHASH_AgentInfo;
+extern char const* const _PREHASH_MoneyTransferBackend;
+extern char const* const _PREHASH_NextOwnerMask;
+extern char const* const _PREHASH_MuteData;
+extern char const* const _PREHASH_PassPrice;
+extern char const* const _PREHASH_SourceID;
+extern char const* const _PREHASH_ChangeUserRights;
+extern char const* const _PREHASH_TeleportFlags;
+extern char const* const _PREHASH_SlaveParcelData;
+extern char const* const _PREHASH_AssetData;
+extern char const* const _PREHASH_MultipleObjectUpdate;
+extern char const* const _PREHASH_ObjectUpdate;
+extern char const* const _PREHASH_ImprovedTerseObjectUpdate;
+extern char const* const _PREHASH_ConfirmXferPacket;
+extern char const* const _PREHASH_StartPingCheck;
+extern char const* const _PREHASH_SimWideDeletes;
+extern char const* const _PREHASH_LandStatReply;
+extern char const* const _PREHASH_IsPhantom;
+extern char const* const _PREHASH_AgentList;
+extern char const* const _PREHASH_SimApproved;
+extern char const* const _PREHASH_RezObject;
+extern char const* const _PREHASH_TaskLocalID;
+extern char const* const _PREHASH_ClaimDate;
+extern char const* const _PREHASH_MergeParcel;
+extern char const* const _PREHASH_Priority;
+extern char const* const _PREHASH_QueryText;
+extern char const* const _PREHASH_GroupNoticeAdd;
+extern char const* const _PREHASH_ReturnType;
+extern char const* const _PREHASH_FetchFolders;
+extern char const* const _PREHASH_SimulatorPublicHostBlock;
+extern char const* const _PREHASH_HeaderData;
+extern char const* const _PREHASH_RequestMultipleObjects;
+extern char const* const _PREHASH_RetrieveInstantMessages;
+extern char const* const _PREHASH_OpenCircuit;
+extern char const* const _PREHASH_CrossedRegion;
+extern char const* const _PREHASH_DirGroupsReply;
+extern char const* const _PREHASH_AvatarGroupsReply;
+extern char const* const _PREHASH_EmailMessageReply;
+extern char const* const _PREHASH_GroupVoteHistoryItemReply;
+extern char const* const _PREHASH_ViewerPosition;
+extern char const* const _PREHASH_Position;
+extern char const* const _PREHASH_ParentEstate;
+extern char const* const _PREHASH_EstateName;
+extern char const* const _PREHASH_MuteName;
+extern char const* const _PREHASH_ParcelRename;
+extern char const* const _PREHASH_ViewerFilename;
+extern char const* const _PREHASH_UserReportInternal;
+extern char const* const _PREHASH_AvatarPropertiesRequest;
+extern char const* const _PREHASH_ParcelPropertiesRequest;
+extern char const* const _PREHASH_GroupProfileRequest;
+extern char const* const _PREHASH_AgentDataUpdateRequest;
+extern char const* const _PREHASH_PriceObjectScaleFactor;
+extern char const* const _PREHASH_OpenEnrollment;
+extern char const* const _PREHASH_GroupData;
+extern char const* const _PREHASH_RequestGodlikePowers;
+extern char const* const _PREHASH_GrantGodlikePowers;
+extern char const* const _PREHASH_TransactionID;
+extern char const* const _PREHASH_DestinationID;
+extern char const* const _PREHASH_Controls;
+extern char const* const _PREHASH_FirstDetachAll;
+extern char const* const _PREHASH_EstateID;
+extern char const* const _PREHASH_ImprovedInstantMessage;
+extern char const* const _PREHASH_CheckParcelSales;
+extern char const* const _PREHASH_ParcelSales;
+extern char const* const _PREHASH_CurrentInterval;
+extern char const* const _PREHASH_PriceRentLight;
+extern char const* const _PREHASH_MediaAutoScale;
+extern char const* const _PREHASH_NeighborBlock;
+extern char const* const _PREHASH_LayerData;
+extern char const* const _PREHASH_NVPairData;
+extern char const* const _PREHASH_TeleportLocal;
+extern char const* const _PREHASH_EjecteeID;
+extern char const* const _PREHASH_VoteInitiator;
+extern char const* const _PREHASH_TypeData;
+extern char const* const _PREHASH_OwnerIDs;
+extern char const* const _PREHASH_SystemKickUser;
+extern char const* const _PREHASH_TransactionTime;
+extern char const* const _PREHASH_TimeToLive;
+extern char const* const _PREHASH_OldAgentID;
+extern char const* const _PREHASH_MusicURL;
+extern char const* const _PREHASH_ParcelPrimBonus;
+extern char const* const _PREHASH_EjectUser;
+extern char const* const _PREHASH_CoarseLocationUpdate;
+extern char const* const _PREHASH_ChildAgentPositionUpdate;
+extern char const* const _PREHASH_StoreLocal;
+extern char const* const _PREHASH_GroupName;
+extern char const* const _PREHASH_PriceParcelRent;
+extern char const* const _PREHASH_SimStatus;
+extern char const* const _PREHASH_TransactionSuccess;
+extern char const* const _PREHASH_LureType;
+extern char const* const _PREHASH_GroupMask;
+extern char const* const _PREHASH_SitObject;
+extern char const* const _PREHASH_Override;
+extern char const* const _PREHASH_LocomotionState;
+extern char const* const _PREHASH_PriceUpload;
+extern char const* const _PREHASH_RemoveParcel;
+extern char const* const _PREHASH_ConfirmAuctionStart;
+extern char const* const _PREHASH_RpcScriptRequestInbound;
+extern char const* const _PREHASH_ActiveGroupID;
+extern char const* const _PREHASH_ParcelReturnObjects;
+extern char const* const _PREHASH_TotalObjects;
+extern char const* const _PREHASH_ObjectExtraParams;
+extern char const* const _PREHASH_Questions;
+extern char const* const _PREHASH_TransferAbort;
+extern char const* const _PREHASH_TransferInventory;
+extern char const* const _PREHASH_RayTargetID;
+extern char const* const _PREHASH_ClaimPrice;
+extern char const* const _PREHASH_ObjectProperties;
+extern char const* const _PREHASH_ParcelProperties;
+extern char const* const _PREHASH_EstateOwnerID;
+extern char const* const _PREHASH_LogoutRequest;
+extern char const* const _PREHASH_AssetUploadRequest;
+extern char const* const _PREHASH_TransactionType;
+extern char const* const _PREHASH_AvatarPropertiesUpdate;
+extern char const* const _PREHASH_ParcelPropertiesUpdate;
+extern char const* const _PREHASH_FetchItems;
+extern char const* const _PREHASH_AbortXfer;
+extern char const* const _PREHASH_DeRezAck;
+extern char const* const _PREHASH_TakeControls;
+extern char const* const _PREHASH_DirLandReply;
+extern char const* const _PREHASH_MuteType;
+extern char const* const _PREHASH_IMViaEMail;
+extern char const* const _PREHASH_RentPrice;
+extern char const* const _PREHASH_GenericMessage;
+extern char const* const _PREHASH_ChildAgentAlive;
+extern char const* const _PREHASH_AssetType;
+extern char const* const _PREHASH_SpawnPointBlock;
+extern char const* const _PREHASH_AttachmentBlock;
+extern char const* const _PREHASH_ObjectMaterial;
+extern char const* const _PREHASH_OwnerName;
+extern char const* const _PREHASH_AvatarNotesReply;
+extern char const* const _PREHASH_CacheID;
+extern char const* const _PREHASH_OwnerMask;
+extern char const* const _PREHASH_TransferInventoryAck;
+extern char const* const _PREHASH_RegionDenyAgeUnverified;
+extern char const* const _PREHASH_AgeVerificationBlock;
+extern char const* const _PREHASH_UCoord;
+extern char const* const _PREHASH_VCoord;
+extern char const* const _PREHASH_FaceIndex;
+extern char const* const _PREHASH_StatusData;
+extern char const* const _PREHASH_ProductSKU;
+extern char const* const _PREHASH_SeeAVs;
+extern char const* const _PREHASH_AnyAVSounds;
+extern char const* const _PREHASH_GroupAVSounds;
#endif
diff --git a/indra/llmessage/net.cpp b/indra/llmessage/net.cpp
index 97611c3b51..85aef5da00 100644
--- a/indra/llmessage/net.cpp
+++ b/indra/llmessage/net.cpp
@@ -50,7 +50,6 @@
#include "lltimer.h"
#include "indra_constants.h"
-
// Globals
#if LL_WINDOWS
@@ -174,7 +173,7 @@ U32 ip_string_to_u32(const char* ip_string)
// use wildcard addresses. -Ambroff
U32 ip = inet_addr(ip_string);
if (ip == INADDR_NONE
- && strncmp(ip_string, BROADCAST_ADDRESS_STRING, MAXADDRSTR) != 0)
+ && strncmp(ip_string, BROADCAST_ADDRESS_STRING, MAXADDRSTR) != 0)
{
llwarns << "ip_string_to_u32() failed, Error: Invalid IP string '" << ip_string << "'" << llendl;
return INVALID_HOST_IP_ADDRESS;
@@ -188,11 +187,11 @@ U32 ip_string_to_u32(const char* ip_string)
//////////////////////////////////////////////////////////////////////////////////////////
#if LL_WINDOWS
-
+
S32 start_net(S32& socket_out, int& nPort)
{
// Create socket, make non-blocking
- // Init WinSock
+ // Init WinSock
int nRet;
int hSocket;
@@ -201,7 +200,7 @@ S32 start_net(S32& socket_out, int& nPort)
int buff_size = 4;
// Initialize windows specific stuff
- if(WSAStartup(0x0202, &stWSAData))
+ if (WSAStartup(0x0202, &stWSAData))
{
S32 err = WSAGetLastError();
WSACleanup();
@@ -210,8 +209,8 @@ S32 start_net(S32& socket_out, int& nPort)
}
// Get a datagram socket
- hSocket = (int)socket(AF_INET, SOCK_DGRAM, 0);
- if (hSocket == INVALID_SOCKET)
+ hSocket = (int)socket(AF_INET, SOCK_DGRAM, 0);
+ if (hSocket == INVALID_SOCKET)
{
S32 err = WSAGetLastError();
WSACleanup();
@@ -304,7 +303,7 @@ S32 start_net(S32& socket_out, int& nPort)
// Setup a destination address
stDstAddr.sin_family = AF_INET;
stDstAddr.sin_addr.s_addr = INVALID_HOST_IP_ADDRESS;
- stDstAddr.sin_port = htons(nPort);
+ stDstAddr.sin_port = htons(nPort);
socket_out = hSocket;
return 0;
@@ -393,10 +392,10 @@ S32 start_net(S32& socket_out, int& nPort)
int rec_size = RECEIVE_BUFFER_SIZE;
socklen_t buff_size = 4;
-
+
// Create socket
- hSocket = socket(AF_INET, SOCK_DGRAM, 0);
- if (hSocket < 0)
+ hSocket = socket(AF_INET, SOCK_DGRAM, 0);
+ if (hSocket < 0)
{
llwarns << "socket() failed" << llendl;
return 1;
@@ -429,7 +428,7 @@ S32 start_net(S32& socket_out, int& nPort)
}
else
{
- // Name the socket (assign the local port number to receive on)
+ // Name the socket (assign the local port number to receive on)
stLclAddr.sin_family = AF_INET;
stLclAddr.sin_addr.s_addr = htonl(INADDR_ANY);
stLclAddr.sin_port = htons(nPort);
@@ -474,7 +473,7 @@ S32 start_net(S32& socket_out, int& nPort)
nPort = attempt_port;
}
// Set socket to be non-blocking
- fcntl(hSocket, F_SETFL, O_NONBLOCK);
+ fcntl(hSocket, F_SETFL, O_NONBLOCK);
// set a large receive buffer
nRet = setsockopt(hSocket, SOL_SOCKET, SO_RCVBUF, (char *)&rec_size, buff_size);
if (nRet)
@@ -510,8 +509,8 @@ S32 start_net(S32& socket_out, int& nPort)
// Setup a destination address
char achMCAddr[MAXADDRSTR] = "127.0.0.1"; /* Flawfinder: ignore */
stDstAddr.sin_family = AF_INET;
- stDstAddr.sin_addr.s_addr = ip_string_to_u32(achMCAddr);
- stDstAddr.sin_port = htons(nPort);
+ stDstAddr.sin_addr.s_addr = ip_string_to_u32(achMCAddr);
+ stDstAddr.sin_port = htons(nPort);
socket_out = hSocket;
return 0;
@@ -537,7 +536,7 @@ static int recvfrom_destip( int socket, void *buf, int len, struct sockaddr *fro
iov[0].iov_base = buf;
iov[0].iov_len = len;
- memset( &msg, 0, sizeof msg );
+ memset(&msg, 0, sizeof msg);
msg.msg_name = from;
msg.msg_namelen = *fromlen;
msg.msg_iov = iov;
@@ -545,14 +544,14 @@ static int recvfrom_destip( int socket, void *buf, int len, struct sockaddr *fro
msg.msg_control = &cmsg;
msg.msg_controllen = sizeof(cmsg);
- size = recvmsg( socket, &msg, 0 );
+ size = recvmsg(socket, &msg, 0);
- if( size == -1 )
+ if (size == -1)
{
return -1;
}
- for( cmsgptr = CMSG_FIRSTHDR(&msg); cmsgptr != NULL; cmsgptr = CMSG_NXTHDR( &msg, cmsgptr ) )
+ for (cmsgptr = CMSG_FIRSTHDR(&msg); cmsgptr != NULL; cmsgptr = CMSG_NXTHDR( &msg, cmsgptr))
{
if( cmsgptr->cmsg_level == SOL_IP && cmsgptr->cmsg_type == IP_PKTINFO )
{
@@ -650,7 +649,7 @@ BOOL send_packet(int hSocket, const char * sendBuffer, int size, U32 recipient,
}
}
}
- while ( resend && send_attempts < 3);
+ while (resend && send_attempts < 3);
if (send_attempts >= 3)
{
diff --git a/indra/llmessage/net.h b/indra/llmessage/net.h
index 9f4f5c5821..0f2437479d 100644
--- a/indra/llmessage/net.h
+++ b/indra/llmessage/net.h
@@ -46,10 +46,10 @@ S32 receive_packet(int hSocket, char * receiveBuffer);
BOOL send_packet(int hSocket, const char *sendBuffer, int size, U32 recipient, int nPort); // Returns TRUE on success.
//void get_sender(char * tmp);
-LLHost get_sender();
+LLHost get_sender();
U32 get_sender_port();
U32 get_sender_ip(void);
-LLHost get_receiving_interface();
+LLHost get_receiving_interface();
U32 get_receiving_interface_ip(void);
const char* u32_to_ip_string(U32 ip); // Returns pointer to internal string buffer, "(bad IP addr)" on failure, cannot nest calls
diff --git a/indra/llmessage/tests/commtest.h b/indra/llmessage/tests/commtest.h
index 32035783e2..0d149b5258 100644
--- a/indra/llmessage/tests/commtest.h
+++ b/indra/llmessage/tests/commtest.h
@@ -34,7 +34,67 @@
#include "llsd.h"
#include "llhost.h"
#include "stringize.h"
+#include <map>
#include <string>
+#include <stdexcept>
+#include <boost/lexical_cast.hpp>
+
+struct CommtestError: public std::runtime_error
+{
+ CommtestError(const std::string& what): std::runtime_error(what) {}
+};
+
+static bool query_verbose()
+{
+ const char* cbose = getenv("INTEGRATION_TEST_VERBOSE");
+ if (! cbose)
+ {
+ cbose = "1";
+ }
+ std::string strbose(cbose);
+ return (! (strbose == "0" || strbose == "off" ||
+ strbose == "false" || strbose == "quiet"));
+}
+
+bool verbose()
+{
+ // This should only be initialized once.
+ static bool vflag = query_verbose();
+ return vflag;
+}
+
+static int query_port(const std::string& var)
+{
+ const char* cport = getenv(var.c_str());
+ if (! cport)
+ {
+ throw CommtestError(STRINGIZE("missing environment variable" << var));
+ }
+ // This will throw, too, if the value of PORT isn't numeric.
+ int port(boost::lexical_cast<int>(cport));
+ if (verbose())
+ {
+ std::cout << "getport('" << var << "') = " << port << std::endl;
+ }
+ return port;
+}
+
+static int getport(const std::string& var)
+{
+ typedef std::map<std::string, int> portsmap;
+ static portsmap ports;
+ // We can do this with a single map lookup with map::insert(). Either it
+ // returns an existing entry and 'false' (not newly inserted), or it
+ // inserts the specified value and 'true'.
+ std::pair<portsmap::iterator, bool> inserted(ports.insert(portsmap::value_type(var, 0)));
+ if (inserted.second)
+ {
+ // We haven't yet seen this var. Remember its value.
+ inserted.first->second = query_port(var);
+ }
+ // Return the (existing or new) iterator's value.
+ return inserted.first->second;
+}
/**
* This struct is shared by a couple of standalone comm tests (ADD_COMM_BUILD_TEST).
@@ -55,13 +115,21 @@ struct commtest_data
replyPump("reply"),
errorPump("error"),
success(false),
- host("127.0.0.1", 8000),
+ host("127.0.0.1", getport("PORT")),
server(STRINGIZE("http://" << host.getString() << "/"))
{
replyPump.listen("self", boost::bind(&commtest_data::outcome, this, _1, true));
errorPump.listen("self", boost::bind(&commtest_data::outcome, this, _1, false));
}
+ static int getport(const std::string& var)
+ {
+ // We have a couple consumers of commtest_data::getport(). But we've
+ // since moved it out to the global namespace. So this is just a
+ // facade.
+ return ::getport(var);
+ }
+
bool outcome(const LLSD& _result, bool _success)
{
// std::cout << "commtest_data::outcome(" << _result << ", " << _success << ")\n";
diff --git a/indra/llmessage/tests/llhost_test.cpp b/indra/llmessage/tests/llhost_test.cpp
index b20bceae1d..eadf83c428 100644
--- a/indra/llmessage/tests/llhost_test.cpp
+++ b/indra/llmessage/tests/llhost_test.cpp
@@ -151,8 +151,9 @@ namespace tut
template<> template<>
void host_object::test<9>()
{
+ skip("this test is flaky, but we should figure out why...");
// skip("setHostByName(\"google.com\"); getHostName() -> (e.g.) \"yx-in-f100.1e100.net\"");
- std::string hostStr = "linux.org";
+ std::string hostStr = "lindenlab.com";
LLHost host;
host.setHostByName(hostStr);
diff --git a/indra/llmessage/tests/llsdmessage_test.cpp b/indra/llmessage/tests/llsdmessage_test.cpp
index 9998a1b8bb..0f2c069303 100644
--- a/indra/llmessage/tests/llsdmessage_test.cpp
+++ b/indra/llmessage/tests/llsdmessage_test.cpp
@@ -61,6 +61,7 @@ namespace tut
llsdmessage_data():
httpPump(pumps.obtain("LLHTTPClient"))
{
+ LLCurl::initClass();
LLSDMessage::link();
}
};
diff --git a/indra/llmessage/tests/test_llsdmessage_peer.py b/indra/llmessage/tests/test_llsdmessage_peer.py
index 7eb198bb34..22edd9dad8 100644
--- a/indra/llmessage/tests/test_llsdmessage_peer.py
+++ b/indra/llmessage/tests/test_llsdmessage_peer.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/env python
"""\
@file test_llsdmessage_peer.py
@author Nat Goodspeed
@@ -38,7 +38,7 @@ mydir = os.path.dirname(__file__) # expected to be .../indra/llmessage/tes
sys.path.insert(0, os.path.join(mydir, os.pardir, os.pardir, "lib", "python"))
from indra.util.fastest_elementtree import parse as xml_parse
from indra.base import llsd
-from testrunner import run, debug
+from testrunner import freeport, run, debug, VERBOSE
class TestHTTPRequestHandler(BaseHTTPRequestHandler):
"""This subclass of BaseHTTPRequestHandler is to receive and echo
@@ -72,10 +72,10 @@ class TestHTTPRequestHandler(BaseHTTPRequestHandler):
## # assuming that the underlying XML parser reads its input file
## # incrementally. Unfortunately I haven't been able to make it work.
## tree = xml_parse(self.rfile)
-## debug("Finished raw parse\n")
-## debug("parsed XML tree %s\n" % tree)
-## debug("parsed root node %s\n" % tree.getroot())
-## debug("root node tag %s\n" % tree.getroot().tag)
+## debug("Finished raw parse")
+## debug("parsed XML tree %s", tree)
+## debug("parsed root node %s", tree.getroot())
+## debug("root node tag %s", tree.getroot().tag)
## return llsd.to_python(tree.getroot())
def do_GET(self):
@@ -88,8 +88,10 @@ class TestHTTPRequestHandler(BaseHTTPRequestHandler):
self.answer(self.read_xml())
def answer(self, data):
+ debug("%s.answer(%s): self.path = %r", self.__class__.__name__, data, self.path)
if "fail" not in self.path:
response = llsd.format_xml(data.get("reply", llsd.LLSD("success")))
+ debug("success: %s", response)
self.send_response(200)
self.send_header("Content-type", "application/llsd+xml")
self.send_header("Content-Length", str(len(response)))
@@ -97,27 +99,48 @@ class TestHTTPRequestHandler(BaseHTTPRequestHandler):
self.wfile.write(response)
else: # fail requested
status = data.get("status", 500)
+ # self.responses maps an int status to a (short, long) pair of
+ # strings. We want the longer string. That's why we pass a string
+ # pair to get(): the [1] will select the second string, whether it
+ # came from self.responses or from our default pair.
reason = data.get("reason",
self.responses.get(status,
("fail requested",
"Your request specified failure status %s "
"without providing a reason" % status))[1])
+ debug("fail requested: %s: %r", status, reason)
self.send_error(status, reason)
- def log_request(self, code, size=None):
- # For present purposes, we don't want the request splattered onto
- # stderr, as it would upset devs watching the test run
- pass
+ if not VERBOSE:
+ # When VERBOSE is set, skip both these overrides because they exist to
+ # suppress output.
- def log_error(self, format, *args):
- # Suppress error output as well
- pass
+ def log_request(self, code, size=None):
+ # For present purposes, we don't want the request splattered onto
+ # stderr, as it would upset devs watching the test run
+ pass
-class TestHTTPServer(Thread):
- def run(self):
- httpd = HTTPServer(('127.0.0.1', 8000), TestHTTPRequestHandler)
- debug("Starting HTTP server...\n")
- httpd.serve_forever()
+ def log_error(self, format, *args):
+ # Suppress error output as well
+ pass
+
+class Server(HTTPServer):
+ # This pernicious flag is on by default in HTTPServer. But proper
+ # operation of freeport() absolutely depends on it being off.
+ allow_reuse_address = False
if __name__ == "__main__":
- sys.exit(run(server=TestHTTPServer(name="httpd"), *sys.argv[1:]))
+ # Instantiate a Server(TestHTTPRequestHandler) on the first free port
+ # in the specified port range. Doing this inline is better than in a
+ # daemon thread: if it blows up here, we'll get a traceback. If it blew up
+ # in some other thread, the traceback would get eaten and we'd run the
+ # subject test program anyway.
+ httpd, port = freeport(xrange(8000, 8020),
+ lambda port: Server(('127.0.0.1', port), TestHTTPRequestHandler))
+ # Pass the selected port number to the subject test program via the
+ # environment. We don't want to impose requirements on the test program's
+ # command-line parsing -- and anyway, for C++ integration tests, that's
+ # performed in TUT code rather than our own.
+ os.environ["PORT"] = str(port)
+ debug("$PORT = %s", port)
+ sys.exit(run(server=Thread(name="httpd", target=httpd.serve_forever), *sys.argv[1:]))
diff --git a/indra/llmessage/tests/testrunner.py b/indra/llmessage/tests/testrunner.py
index 4d58ef7130..5b9beb359b 100644
--- a/indra/llmessage/tests/testrunner.py
+++ b/indra/llmessage/tests/testrunner.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/env python
"""\
@file testrunner.py
@author Nat Goodspeed
@@ -27,14 +27,118 @@ Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
$/LicenseInfo$
"""
+from __future__ import with_statement
+
import os
import sys
+import re
+import errno
+import socket
+
+VERBOSE = os.environ.get("INTEGRATION_TEST_VERBOSE", "0") # default to quiet
+# Support usage such as INTEGRATION_TEST_VERBOSE=off -- distressing to user if
+# that construct actually turns on verbosity...
+VERBOSE = not re.match(r"(0|off|false|quiet)$", VERBOSE, re.IGNORECASE)
+
+if VERBOSE:
+ def debug(fmt, *args):
+ print fmt % args
+ sys.stdout.flush()
+else:
+ debug = lambda *args: None
+
+def freeport(portlist, expr):
+ """
+ Find a free server port to use. Specifically, evaluate 'expr' (a
+ callable(port)) until it stops raising EADDRINUSE exception.
+
+ Pass:
+
+ portlist: an iterable (e.g. xrange()) of ports to try. If you exhaust the
+ range, freeport() lets the socket.error exception propagate. If you want
+ unbounded, you could pass itertools.count(baseport), though of course in
+ practice the ceiling is 2^16-1 anyway. But it seems prudent to constrain
+ the range much more sharply: if we're iterating an absurd number of times,
+ probably something else is wrong.
+
+ expr: a callable accepting a port number, specifically one of the items
+ from portlist. If calling that callable raises socket.error with
+ EADDRINUSE, freeport() retrieves the next item from portlist and retries.
+
+ Returns: (expr(port), port)
+
+ port: the value from portlist for which expr(port) succeeded
+
+ Raises:
+
+ Any exception raised by expr(port) other than EADDRINUSE.
+
+ socket.error if, for every item from portlist, expr(port) raises
+ socket.error. The exception you see is the one from the last item in
+ portlist.
+
+ StopIteration if portlist is completely empty.
+
+ Example:
+
+ class Server(HTTPServer):
+ # If you use BaseHTTPServer.HTTPServer, turning off this flag is
+ # essential for proper operation of freeport()!
+ allow_reuse_address = False
+ # ...
+ server, port = freeport(xrange(8000, 8010),
+ lambda port: Server(("localhost", port),
+ MyRequestHandler))
+ # pass 'port' to client code
+ # call server.serve_forever()
+ """
+ try:
+ # If portlist is completely empty, let StopIteration propagate: that's an
+ # error because we can't return meaningful values. We have no 'port',
+ # therefore no 'expr(port)'.
+ portiter = iter(portlist)
+ port = portiter.next()
+
+ while True:
+ try:
+ # If this value of port works, return as promised.
+ value = expr(port)
+
+ except socket.error, err:
+ # Anything other than 'Address already in use', propagate
+ if err.args[0] != errno.EADDRINUSE:
+ raise
+
+ # Here we want the next port from portiter. But on StopIteration,
+ # we want to raise the original exception rather than
+ # StopIteration. So save the original exc_info().
+ type, value, tb = sys.exc_info()
+ try:
+ try:
+ port = portiter.next()
+ except StopIteration:
+ raise type, value, tb
+ finally:
+ # Clean up local traceback, see docs for sys.exc_info()
+ del tb
+
+ else:
+ debug("freeport() returning %s on port %s", value, port)
+ return value, port
-def debug(*args):
- sys.stdout.writelines(args)
- sys.stdout.flush()
-# comment out the line below to enable debug output
-debug = lambda *args: None
+ # Recap of the control flow above:
+ # If expr(port) doesn't raise, return as promised.
+ # If expr(port) raises anything but EADDRINUSE, propagate that
+ # exception.
+ # If portiter.next() raises StopIteration -- that is, if the port
+ # value we just passed to expr(port) was the last available -- reraise
+ # the EADDRINUSE exception.
+ # If we've actually arrived at this point, portiter.next() delivered a
+ # new port value. Loop back to pass that to expr(port).
+
+ except Exception, err:
+ debug("*** freeport() raising %s: %s", err.__class__.__name__, err)
+ raise
def run(*args, **kwds):
"""All positional arguments collectively form a command line, executed as
@@ -63,8 +167,96 @@ def run(*args, **kwds):
# - [no p] don't use the PATH because we specifically want to invoke the
# executable passed as our first arg,
# - [no e] child should inherit this process's environment.
- debug("Running %s...\n" % (" ".join(args)))
- sys.stdout.flush()
+ debug("Running %s...", " ".join(args))
rc = os.spawnv(os.P_WAIT, args[0], args)
- debug("%s returned %s\n" % (args[0], rc))
+ debug("%s returned %s", args[0], rc)
return rc
+
+# ****************************************************************************
+# test code -- manual at this point, see SWAT-564
+# ****************************************************************************
+def test_freeport():
+ # ------------------------------- Helpers --------------------------------
+ from contextlib import contextmanager
+ # helper Context Manager for expecting an exception
+ # with exc(SomeError):
+ # raise SomeError()
+ # raises AssertionError otherwise.
+ @contextmanager
+ def exc(exception_class, *args):
+ try:
+ yield
+ except exception_class, err:
+ for i, expected_arg in enumerate(args):
+ assert expected_arg == err.args[i], \
+ "Raised %s, but args[%s] is %r instead of %r" % \
+ (err.__class__.__name__, i, err.args[i], expected_arg)
+ print "Caught expected exception %s(%s)" % \
+ (err.__class__.__name__, ', '.join(repr(arg) for arg in err.args))
+ else:
+ assert False, "Failed to raise " + exception_class.__class__.__name__
+
+ # helper to raise specified exception
+ def raiser(exception):
+ raise exception
+
+ # the usual
+ def assert_equals(a, b):
+ assert a == b, "%r != %r" % (a, b)
+
+ # ------------------------ Sanity check the above ------------------------
+ class SomeError(Exception): pass
+ # Without extra args, accept any err.args value
+ with exc(SomeError):
+ raiser(SomeError("abc"))
+ # With extra args, accept only the specified value
+ with exc(SomeError, "abc"):
+ raiser(SomeError("abc"))
+ with exc(AssertionError):
+ with exc(SomeError, "abc"):
+ raiser(SomeError("def"))
+ with exc(AssertionError):
+ with exc(socket.error, errno.EADDRINUSE):
+ raiser(socket.error(errno.ECONNREFUSED, 'Connection refused'))
+
+ # ----------- freeport() without engaging socket functionality -----------
+ # If portlist is empty, freeport() raises StopIteration.
+ with exc(StopIteration):
+ freeport([], None)
+
+ assert_equals(freeport([17], str), ("17", 17))
+
+ # This is the magic exception that should prompt us to retry
+ inuse = socket.error(errno.EADDRINUSE, 'Address already in use')
+ # Get the iterator to our ports list so we can check later if we've used all
+ ports = iter(xrange(5))
+ with exc(socket.error, errno.EADDRINUSE):
+ freeport(ports, lambda port: raiser(inuse))
+ # did we entirely exhaust 'ports'?
+ with exc(StopIteration):
+ ports.next()
+
+ ports = iter(xrange(2))
+ # Any exception but EADDRINUSE should quit immediately
+ with exc(SomeError):
+ freeport(ports, lambda port: raiser(SomeError()))
+ assert_equals(ports.next(), 1)
+
+ # ----------- freeport() with platform-dependent socket stuff ------------
+ # This is what we should've had unit tests to begin with (see CHOP-661).
+ def newbind(port):
+ sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ sock.bind(('127.0.0.1', port))
+ return sock
+
+ bound0, port0 = freeport(xrange(7777, 7780), newbind)
+ assert_equals(port0, 7777)
+ bound1, port1 = freeport(xrange(7777, 7780), newbind)
+ assert_equals(port1, 7778)
+ bound2, port2 = freeport(xrange(7777, 7780), newbind)
+ assert_equals(port2, 7779)
+ with exc(socket.error, errno.EADDRINUSE):
+ bound3, port3 = freeport(xrange(7777, 7780), newbind)
+
+if __name__ == "__main__":
+ test_freeport()
diff --git a/indra/llplugin/CMakeLists.txt b/indra/llplugin/CMakeLists.txt
index d3a73058c4..1353b7a458 100644
--- a/indra/llplugin/CMakeLists.txt
+++ b/indra/llplugin/CMakeLists.txt
@@ -20,6 +20,7 @@ include_directories(
${LLRENDER_INCLUDE_DIRS}
${LLXML_INCLUDE_DIRS}
${LLWINDOW_INCLUDE_DIRS}
+ ${LLQTWEBKIT_INCLUDE_DIR}
)
set(llplugin_SOURCE_FILES
@@ -65,21 +66,20 @@ add_library (llplugin ${llplugin_SOURCE_FILES})
add_subdirectory(slplugin)
+# Add tests
if (LL_TESTS)
- # Add tests
- include(LLAddBuildTest)
-
- # UNIT TESTS
- SET(llplugin_TEST_SOURCE_FILES
+ include(LLAddBuildTest)
+ # UNIT TESTS
+ SET(llplugin_TEST_SOURCE_FILES
llplugincookiestore.cpp
)
- # llplugincookiestore has a dependency on curl, so we need to link the curl library into the test.
- set_source_files_properties(
+ # llplugincookiestore has a dependency on curl, so we need to link the curl library into the test.
+ set_source_files_properties(
llplugincookiestore.cpp
PROPERTIES
- LL_TEST_ADDITIONAL_LIBRARIES "${CURL_LIBRARIES}"
+ LL_TEST_ADDITIONAL_LIBRARIES "${CURL_LIBRARIES}"
)
- LL_ADD_PROJECT_UNIT_TESTS(llplugin "${llplugin_TEST_SOURCE_FILES}")
+ LL_ADD_PROJECT_UNIT_TESTS(llplugin "${llplugin_TEST_SOURCE_FILES}")
endif (LL_TESTS)
diff --git a/indra/llplugin/llpluginclassmedia.cpp b/indra/llplugin/llpluginclassmedia.cpp
index 69ed0fb09c..dbd96673a1 100644
--- a/indra/llplugin/llpluginclassmedia.cpp
+++ b/indra/llplugin/llpluginclassmedia.cpp
@@ -64,9 +64,10 @@ LLPluginClassMedia::~LLPluginClassMedia()
reset();
}
-bool LLPluginClassMedia::init(const std::string &launcher_filename, const std::string &plugin_filename, bool debug)
+bool LLPluginClassMedia::init(const std::string &launcher_filename, const std::string &plugin_dir, const std::string &plugin_filename, bool debug)
{
LL_DEBUGS("Plugin") << "launcher: " << launcher_filename << LL_ENDL;
+ LL_DEBUGS("Plugin") << "dir: " << plugin_dir << LL_ENDL;
LL_DEBUGS("Plugin") << "plugin: " << plugin_filename << LL_ENDL;
mPlugin = new LLPluginProcessParent(this);
@@ -77,7 +78,7 @@ bool LLPluginClassMedia::init(const std::string &launcher_filename, const std::s
message.setValue("target", mTarget);
sendMessage(message);
- mPlugin->init(launcher_filename, plugin_filename, debug);
+ mPlugin->init(launcher_filename, plugin_dir, plugin_filename, debug);
return true;
}
@@ -143,8 +144,10 @@ void LLPluginClassMedia::reset()
mStatusText.clear();
mProgressPercent = 0;
mClickURL.clear();
+ mClickNavType.clear();
mClickTarget.clear();
mClickUUID.clear();
+ mStatusCode = 0;
// media_time class
mCurrentTime = 0.0f;
@@ -160,7 +163,7 @@ void LLPluginClassMedia::idle(void)
mPlugin->idle();
}
- if((mMediaWidth == -1) || (!mTextureParamsReceived) || (mPlugin == NULL) || (mPlugin->isBlocked()))
+ if((mMediaWidth == -1) || (!mTextureParamsReceived) || (mPlugin == NULL) || (mPlugin->isBlocked()) || (mOwner == NULL))
{
// Can't process a size change at this time
}
@@ -433,6 +436,95 @@ std::string LLPluginClassMedia::translateModifiers(MASK modifiers)
return result;
}
+void LLPluginClassMedia::jsEnableObject( bool enable )
+{
+ if( ! mPlugin || !mPlugin->isRunning() || mPlugin->isBlocked() )
+ {
+ return;
+ }
+
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "js_enable_object");
+ message.setValueBoolean( "enable", enable );
+ sendMessage( message );
+}
+
+void LLPluginClassMedia::jsAgentLocationEvent( double x, double y, double z )
+{
+ if( ! mPlugin || !mPlugin->isRunning() || mPlugin->isBlocked() )
+ {
+ return;
+ }
+
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "js_agent_location");
+ message.setValueReal( "x", x );
+ message.setValueReal( "y", y );
+ message.setValueReal( "z", z );
+ sendMessage( message );
+}
+
+void LLPluginClassMedia::jsAgentGlobalLocationEvent( double x, double y, double z )
+{
+ if( ! mPlugin || !mPlugin->isRunning() || mPlugin->isBlocked() )
+ {
+ return;
+ }
+
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "js_agent_global_location");
+ message.setValueReal( "x", x );
+ message.setValueReal( "y", y );
+ message.setValueReal( "z", z );
+ sendMessage( message );
+}
+
+void LLPluginClassMedia::jsAgentOrientationEvent( double angle )
+{
+ if( ! mPlugin || !mPlugin->isRunning() || mPlugin->isBlocked() )
+ {
+ return;
+ }
+
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "js_agent_orientation");
+ message.setValueReal( "angle", angle );
+
+ sendMessage( message );
+}
+
+void LLPluginClassMedia::jsAgentLanguageEvent( const std::string& language )
+{
+ if( ! mPlugin || !mPlugin->isRunning() || mPlugin->isBlocked() )
+ {
+ return;
+ }
+
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "js_agent_language");
+ message.setValue( "language", language );
+ sendMessage( message );
+}
+
+void LLPluginClassMedia::jsAgentRegionEvent( const std::string& region )
+{
+ if( ! mPlugin || !mPlugin->isRunning() || mPlugin->isBlocked() )
+ {
+ return;
+ }
+
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "js_agent_region");
+ message.setValue( "region", region );
+ sendMessage( message );
+}
+
+void LLPluginClassMedia::jsAgentMaturityEvent( const std::string& maturity )
+{
+ if( ! mPlugin || !mPlugin->isRunning() || mPlugin->isBlocked() )
+ {
+ return;
+ }
+
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "js_agent_maturity");
+ message.setValue( "maturity", maturity );
+ sendMessage( message );
+}
+
void LLPluginClassMedia::mouseEvent(EMouseEventType type, int button, int x, int y, MASK modifiers)
{
if(type == MOUSE_EVENT_MOVE)
@@ -522,7 +614,15 @@ bool LLPluginClassMedia::keyEvent(EKeyEventType type, int key_code, MASK modifie
}
break;
}
-
+
+#if LL_DARWIN
+ if(modifiers & MASK_ALT)
+ {
+ // Option-key modified characters should be handled by the unicode input path instead of this one.
+ result = false;
+ }
+#endif
+
if(result)
{
LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "key_event");
@@ -674,7 +774,21 @@ void LLPluginClassMedia::sendPickFileResponse(const std::string &file)
{
LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "pick_file_response");
message.setValue("file", file);
- if(mPlugin->isBlocked())
+ if(mPlugin && mPlugin->isBlocked())
+ {
+ // If the plugin sent a blocking pick-file request, the response should unblock it.
+ message.setValueBoolean("blocking_response", true);
+ }
+ sendMessage(message);
+}
+
+void LLPluginClassMedia::sendAuthResponse(bool ok, const std::string &username, const std::string &password)
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "auth_response");
+ message.setValueBoolean("ok", ok);
+ message.setValue("username", username);
+ message.setValue("password", password);
+ if(mPlugin && mPlugin->isBlocked())
{
// If the plugin sent a blocking pick-file request, the response should unblock it.
message.setValueBoolean("blocking_response", true);
@@ -728,6 +842,14 @@ void LLPluginClassMedia::setJavascriptEnabled(const bool enabled)
sendMessage(message);
}
+
+void LLPluginClassMedia::enableMediaPluginDebugging( bool enable )
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "enable_media_plugin_debugging");
+ message.setValueBoolean( "enable", enable );
+ sendMessage( message );
+}
+
void LLPluginClassMedia::setTarget(const std::string &target)
{
mTarget = target;
@@ -947,6 +1069,18 @@ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message)
{
mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_PICK_FILE_REQUEST);
}
+ else if(message_name == "auth_request")
+ {
+ mAuthURL = message.getValue("url");
+ mAuthRealm = message.getValue("realm");
+ mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_AUTH_REQUEST);
+ }
+ else if(message_name == "debug_message")
+ {
+ mDebugMessageText = message.getValue("message_text");
+ mDebugMessageLevel = message.getValue("message_level");
+ mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_DEBUG_MESSAGE);
+ }
else
{
LL_WARNS("Plugin") << "Unknown " << message_name << " class message: " << message_name << LL_ENDL;
@@ -995,9 +1129,15 @@ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message)
else if(message_name == "click_nofollow")
{
mClickURL = message.getValue("uri");
+ mClickNavType = message.getValue("nav_type");
mClickTarget.clear();
mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_CLICK_LINK_NOFOLLOW);
}
+ else if(message_name == "navigate_error_page")
+ {
+ mStatusCode = message.getValueS32("status_code");
+ mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_NAVIGATE_ERROR_PAGE);
+ }
else if(message_name == "cookie_set")
{
if(mOwner)
@@ -1019,6 +1159,15 @@ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message)
mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_GEOMETRY_CHANGE);
}
+ else if(message_name == "link_hovered")
+ {
+ // text is not currently used -- the tooltip hover text is taken from the "title".
+ mHoverLink = message.getValue("link");
+ mHoverText = message.getValue("title");
+ // message.getValue("text");
+
+ mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_LINK_HOVERED);
+ }
else
{
LL_WARNS("Plugin") << "Unknown " << message_name << " class message: " << message_name << LL_ENDL;
@@ -1090,6 +1239,14 @@ void LLPluginClassMedia::focus(bool focused)
sendMessage(message);
}
+void LLPluginClassMedia::set_page_zoom_factor( double factor )
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "set_page_zoom_factor");
+
+ message.setValueReal("factor", factor);
+ sendMessage(message);
+}
+
void LLPluginClassMedia::clear_cache()
{
LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "clear_cache");
@@ -1154,22 +1311,19 @@ void LLPluginClassMedia::browse_back()
sendMessage(message);
}
-void LLPluginClassMedia::set_status_redirect(int code, const std::string &url)
+void LLPluginClassMedia::setBrowserUserAgent(const std::string& user_agent)
{
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "set_status_redirect");
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "set_user_agent");
- message.setValueS32("code", code);
- message.setValue("url", url);
+ message.setValue("user_agent", user_agent);
sendMessage(message);
}
-void LLPluginClassMedia::setBrowserUserAgent(const std::string& user_agent)
+void LLPluginClassMedia::showWebInspector( bool show )
{
- LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "set_user_agent");
-
- message.setValue("user_agent", user_agent);
-
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "show_web_inspector");
+ message.setValueBoolean("show", true); // only open for now - closed manually by user
sendMessage(message);
}
@@ -1192,6 +1346,20 @@ void LLPluginClassMedia::proxyWindowClosed(const std::string &uuid)
sendMessage(message);
}
+void LLPluginClassMedia::ignore_ssl_cert_errors(bool ignore)
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "ignore_ssl_cert_errors");
+ message.setValueBoolean("ignore", ignore);
+ sendMessage(message);
+}
+
+void LLPluginClassMedia::addCertificateFilePath(const std::string& path)
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "add_certificate_file_path");
+ message.setValue("path", path);
+ sendMessage(message);
+}
+
void LLPluginClassMedia::crashPlugin()
{
LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_INTERNAL, "crash");
diff --git a/indra/llplugin/llpluginclassmedia.h b/indra/llplugin/llpluginclassmedia.h
index 9cb67fe909..5fe8254331 100644
--- a/indra/llplugin/llpluginclassmedia.h
+++ b/indra/llplugin/llpluginclassmedia.h
@@ -44,12 +44,13 @@ public:
virtual ~LLPluginClassMedia();
// local initialization, called by the media manager when creating a source
- virtual bool init(const std::string &launcher_filename,
+ bool init(const std::string &launcher_filename,
+ const std::string &plugin_dir,
const std::string &plugin_filename,
bool debug);
// undoes everything init() didm called by the media manager when destroying a source
- virtual void reset();
+ void reset();
void idle(void);
@@ -85,6 +86,8 @@ public:
void setBackgroundColor(LLColor4 color) { mBackgroundColor = color; };
+ void setOwner(LLPluginClassMediaOwner *owner) { mOwner = owner; };
+
// Returns true if all of the texture parameters (depth, format, size, and texture size) are set up and consistent.
// This will initially be false, and will also be false for some time after setSize while the resize is processed.
// Note that if this returns true, it is safe to use all the get() functions above without checking for invalid return values
@@ -114,7 +117,19 @@ public:
bool keyEvent(EKeyEventType type, int key_code, MASK modifiers, LLSD native_key_data);
void scrollEvent(int x, int y, MASK modifiers);
-
+
+ // enable/disable media plugin debugging messages and info spam
+ void enableMediaPluginDebugging( bool enable );
+
+ // Javascript <-> viewer events
+ void jsEnableObject( bool enable );
+ void jsAgentLocationEvent( double x, double y, double z );
+ void jsAgentGlobalLocationEvent( double x, double y, double z );
+ void jsAgentOrientationEvent( double angle );
+ void jsAgentLanguageEvent( const std::string& language );
+ void jsAgentRegionEvent( const std::string& region_name );
+ void jsAgentMaturityEvent( const std::string& maturity );
+
// Text may be unicode (utf8 encoded)
bool textInput(const std::string &text, MASK modifiers, LLSD native_key_data);
@@ -159,6 +174,8 @@ public:
void sendPickFileResponse(const std::string &file);
+ void sendAuthResponse(bool ok, const std::string &username, const std::string &password);
+
// Valid after a MEDIA_EVENT_CURSOR_CHANGED event
std::string getCursorName() const { return mCursorName; };
@@ -185,6 +202,7 @@ public:
bool pluginSupportsMediaBrowser(void);
void focus(bool focused);
+ void set_page_zoom_factor( double factor );
void clear_cache();
void clear_cookies();
void set_cookies(const std::string &cookies);
@@ -194,10 +212,12 @@ public:
void browse_reload(bool ignore_cache = false);
void browse_forward();
void browse_back();
- void set_status_redirect(int code, const std::string &url);
void setBrowserUserAgent(const std::string& user_agent);
+ void showWebInspector( bool show );
void proxyWindowOpened(const std::string &target, const std::string &uuid);
void proxyWindowClosed(const std::string &uuid);
+ void ignore_ssl_cert_errors(bool ignore);
+ void addCertificateFilePath(const std::string& path);
// This is valid after MEDIA_EVENT_NAVIGATE_BEGIN or MEDIA_EVENT_NAVIGATE_COMPLETE
std::string getNavigateURI() const { return mNavigateURI; };
@@ -220,19 +240,37 @@ public:
// This is valid after MEDIA_EVENT_CLICK_LINK_HREF or MEDIA_EVENT_CLICK_LINK_NOFOLLOW
std::string getClickURL() const { return mClickURL; };
+ // This is valid after MEDIA_EVENT_CLICK_LINK_NOFOLLOW
+ std::string getClickNavType() const { return mClickNavType; };
+
// This is valid after MEDIA_EVENT_CLICK_LINK_HREF
std::string getClickTarget() const { return mClickTarget; };
// This is valid during MEDIA_EVENT_CLICK_LINK_HREF and MEDIA_EVENT_GEOMETRY_CHANGE
std::string getClickUUID() const { return mClickUUID; };
+
+ // These are valid during MEDIA_EVENT_DEBUG_MESSAGE
+ std::string getDebugMessageText() const { return mDebugMessageText; };
+ std::string getDebugMessageLevel() const { return mDebugMessageLevel; };
+
+ // This is valid after MEDIA_EVENT_NAVIGATE_ERROR_PAGE
+ S32 getStatusCode() const { return mStatusCode; };
// These are valid during MEDIA_EVENT_GEOMETRY_CHANGE
S32 getGeometryX() const { return mGeometryX; };
S32 getGeometryY() const { return mGeometryY; };
S32 getGeometryWidth() const { return mGeometryWidth; };
S32 getGeometryHeight() const { return mGeometryHeight; };
+
+ // These are valid during MEDIA_EVENT_AUTH_REQUEST
+ std::string getAuthURL() const { return mAuthURL; };
+ std::string getAuthRealm() const { return mAuthRealm; };
- std::string getMediaName() const { return mMediaName; };
+ // These are valid during MEDIA_EVENT_LINK_HOVERED
+ std::string getHoverText() const { return mHoverText; };
+ std::string getHoverLink() const { return mHoverLink; };
+
+ const std::string& getMediaName() const { return mMediaName; };
std::string getMediaDescription() const { return mMediaDescription; };
// Crash the plugin. If you use this outside of a testbed, you will be punished.
@@ -363,12 +401,20 @@ protected:
int mProgressPercent;
std::string mLocation;
std::string mClickURL;
+ std::string mClickNavType;
std::string mClickTarget;
std::string mClickUUID;
+ std::string mDebugMessageText;
+ std::string mDebugMessageLevel;
S32 mGeometryX;
S32 mGeometryY;
S32 mGeometryWidth;
S32 mGeometryHeight;
+ S32 mStatusCode;
+ std::string mAuthURL;
+ std::string mAuthRealm;
+ std::string mHoverText;
+ std::string mHoverLink;
/////////////////////////////////////////
// media_time class
diff --git a/indra/llplugin/llpluginclassmediaowner.h b/indra/llplugin/llpluginclassmediaowner.h
index c9efff216c..2f3edba7f3 100644
--- a/indra/llplugin/llpluginclassmediaowner.h
+++ b/indra/llplugin/llpluginclassmediaowner.h
@@ -52,14 +52,21 @@ public:
MEDIA_EVENT_STATUS_TEXT_CHANGED, // browser has updated the status text
MEDIA_EVENT_NAME_CHANGED, // browser has updated the name of the media (typically <title> tag)
MEDIA_EVENT_LOCATION_CHANGED, // browser location (URL) has changed (maybe due to internal navagation/frames/etc)
+ MEDIA_EVENT_NAVIGATE_ERROR_PAGE, // browser navigated to a page that resulted in an HTTP error
MEDIA_EVENT_CLICK_LINK_HREF, // I'm not entirely sure what the semantics of these two are
MEDIA_EVENT_CLICK_LINK_NOFOLLOW,
MEDIA_EVENT_CLOSE_REQUEST, // The plugin requested its window be closed (currently hooked up to javascript window.close in webkit)
MEDIA_EVENT_PICK_FILE_REQUEST, // The plugin wants the user to pick a file
MEDIA_EVENT_GEOMETRY_CHANGE, // The plugin requested its window geometry be changed (per the javascript window interface)
-
+
MEDIA_EVENT_PLUGIN_FAILED_LAUNCH, // The plugin failed to launch
- MEDIA_EVENT_PLUGIN_FAILED // The plugin died unexpectedly
+ MEDIA_EVENT_PLUGIN_FAILED, // The plugin died unexpectedly
+
+ MEDIA_EVENT_AUTH_REQUEST, // The plugin wants to display an auth dialog
+
+ MEDIA_EVENT_DEBUG_MESSAGE, // plugin sending back debug information for host to process
+
+ MEDIA_EVENT_LINK_HOVERED // Got a "link hovered" event from the plugin
} EMediaEvent;
diff --git a/indra/llplugin/llplugininstance.cpp b/indra/llplugin/llplugininstance.cpp
index c326961db4..7cde82a20e 100644
--- a/indra/llplugin/llplugininstance.cpp
+++ b/indra/llplugin/llplugininstance.cpp
@@ -32,6 +32,10 @@
#include "llapr.h"
+#if LL_WINDOWS
+#include "direct.h" // needed for _chdir()
+#endif
+
/** Virtual destructor. */
LLPluginInstanceMessageListener::~LLPluginInstanceMessageListener()
{
@@ -73,10 +77,24 @@ LLPluginInstance::~LLPluginInstance()
* @param[in] plugin_file Name of plugin dll/dylib/so. TODO:DOC is this correct? see .h
* @return 0 if successful, APR error code or error code from the plugin's init function on failure.
*/
-int LLPluginInstance::load(std::string &plugin_file)
+int LLPluginInstance::load(const std::string& plugin_dir, std::string &plugin_file)
{
pluginInitFunction init_function = NULL;
+ if ( plugin_dir.length() )
+ {
+#if LL_WINDOWS
+ // VWR-21275:
+ // *SOME* Windows systems fail to load the Qt plugins if the current working
+ // directory is not the same as the directory with the Qt DLLs in.
+ // This should not cause any run time issues since we are changing the cwd for the
+ // plugin shell process and not the viewer.
+ // Changing back to the previous directory is not necessary since the plugin shell
+ // quits once the plugin exits.
+ _chdir( plugin_dir.c_str() );
+#endif
+ };
+
int result = apr_dso_load(&mDSOHandle,
plugin_file.c_str(),
gAPRPoolp);
diff --git a/indra/llplugin/llplugininstance.h b/indra/llplugin/llplugininstance.h
index 50531ca77f..e6926c3e37 100644
--- a/indra/llplugin/llplugininstance.h
+++ b/indra/llplugin/llplugininstance.h
@@ -56,7 +56,7 @@ public:
// Load a plugin dll/dylib/so
// Returns 0 if successful, APR error code or error code returned from the plugin's init function on failure.
- int load(std::string &plugin_file);
+ int load(const std::string& plugin_dir, std::string &plugin_file);
// Sends a message to the plugin.
void sendMessage(const std::string &message);
diff --git a/indra/llplugin/llpluginmessagepipe.cpp b/indra/llplugin/llpluginmessagepipe.cpp
index 8d13e38ad5..091e93ea4b 100644
--- a/indra/llplugin/llpluginmessagepipe.cpp
+++ b/indra/llplugin/llpluginmessagepipe.cpp
@@ -94,10 +94,10 @@ void LLPluginMessagePipeOwner::killMessagePipe(void)
LLPluginMessagePipe::LLPluginMessagePipe(LLPluginMessagePipeOwner *owner, LLSocket::ptr_t socket):
mInputMutex(gAPRPoolp),
mOutputMutex(gAPRPoolp),
+ mOutputStartIndex(0),
mOwner(owner),
mSocket(socket)
{
-
mOwner->setMessagePipe(this);
}
@@ -113,6 +113,14 @@ bool LLPluginMessagePipe::addMessage(const std::string &message)
{
// queue the message for later output
LLMutexLock lock(&mOutputMutex);
+
+ // If we're starting to use up too much memory, clear
+ if (mOutputStartIndex > 1024 * 1024)
+ {
+ mOutput = mOutput.substr(mOutputStartIndex);
+ mOutputStartIndex = 0;
+ }
+
mOutput += message;
mOutput += MESSAGE_DELIMITER; // message separator
@@ -165,35 +173,44 @@ bool LLPluginMessagePipe::pumpOutput()
if(mSocket)
{
apr_status_t status;
- apr_size_t size;
+ apr_size_t in_size, out_size;
LLMutexLock lock(&mOutputMutex);
- if(!mOutput.empty())
+
+ const char * output_data = &(mOutput.data()[mOutputStartIndex]);
+ if(*output_data != '\0')
{
// write any outgoing messages
- size = (apr_size_t)mOutput.size();
+ in_size = (apr_size_t) (mOutput.size() - mOutputStartIndex);
+ out_size = in_size;
setSocketTimeout(0);
// LL_INFOS("Plugin") << "before apr_socket_send, size = " << size << LL_ENDL;
- status = apr_socket_send(
- mSocket->getSocket(),
- (const char*)mOutput.data(),
- &size);
+ status = apr_socket_send(mSocket->getSocket(),
+ output_data,
+ &out_size);
// LL_INFOS("Plugin") << "after apr_socket_send, size = " << size << LL_ENDL;
- if(status == APR_SUCCESS)
+ if((status == APR_SUCCESS) || APR_STATUS_IS_EAGAIN(status))
{
- // success
- mOutput = mOutput.substr(size);
- }
- else if(APR_STATUS_IS_EAGAIN(status))
- {
- // Socket buffer is full...
- // remove the written part from the buffer and try again later.
- mOutput = mOutput.substr(size);
+ // Success or Socket buffer is full...
+
+ // If we've pumped the entire string, clear it
+ if (out_size == in_size)
+ {
+ mOutputStartIndex = 0;
+ mOutput.clear();
+ }
+ else
+ {
+ llassert(in_size > out_size);
+
+ // Remove the written part from the buffer and try again later.
+ mOutputStartIndex += out_size;
+ }
}
else if(APR_STATUS_IS_EOF(status))
{
diff --git a/indra/llplugin/llpluginmessagepipe.h b/indra/llplugin/llpluginmessagepipe.h
index 627577beb1..c3498beac0 100644
--- a/indra/llplugin/llpluginmessagepipe.h
+++ b/indra/llplugin/llpluginmessagepipe.h
@@ -41,6 +41,7 @@ class LLPluginMessagePipeOwner
public:
LLPluginMessagePipeOwner();
virtual ~LLPluginMessagePipeOwner();
+
// called with incoming messages
virtual void receiveMessageRaw(const std::string &message) = 0;
// called when the socket has an error
@@ -85,6 +86,7 @@ protected:
std::string mInput;
LLMutex mOutputMutex;
std::string mOutput;
+ std::string::size_type mOutputStartIndex;
LLPluginMessagePipeOwner *mOwner;
LLSocket::ptr_t mSocket;
diff --git a/indra/llplugin/llpluginprocesschild.cpp b/indra/llplugin/llpluginprocesschild.cpp
index 45a86476ac..f8a282184e 100644
--- a/indra/llplugin/llpluginprocesschild.cpp
+++ b/indra/llplugin/llpluginprocesschild.cpp
@@ -139,7 +139,7 @@ void LLPluginProcessChild::idle(void)
if(!mPluginFile.empty())
{
mInstance = new LLPluginInstance(this);
- if(mInstance->load(mPluginFile) == 0)
+ if(mInstance->load(mPluginDir, mPluginFile) == 0)
{
mHeartbeat.start();
mHeartbeat.setTimerExpirySec(HEARTBEAT_SECONDS);
@@ -348,6 +348,7 @@ void LLPluginProcessChild::receiveMessageRaw(const std::string &message)
if(message_name == "load_plugin")
{
mPluginFile = parsed.getValue("file");
+ mPluginDir = parsed.getValue("dir");
}
else if(message_name == "shm_add")
{
@@ -409,7 +410,7 @@ void LLPluginProcessChild::receiveMessageRaw(const std::string &message)
}
else if(message_name == "sleep_time")
{
- mSleepTime = parsed.getValueReal("time");
+ mSleepTime = llmax(parsed.getValueReal("time"), 1.0 / 100.0); // clamp to maximum of 100Hz
}
else if(message_name == "crash")
{
diff --git a/indra/llplugin/llpluginprocesschild.h b/indra/llplugin/llpluginprocesschild.h
index 22ff403ad6..a9d6794e40 100644
--- a/indra/llplugin/llpluginprocesschild.h
+++ b/indra/llplugin/llpluginprocesschild.h
@@ -92,6 +92,7 @@ private:
LLSocket::ptr_t mSocket;
std::string mPluginFile;
+ std::string mPluginDir;
LLPluginInstance *mInstance;
diff --git a/indra/llplugin/llpluginprocessparent.cpp b/indra/llplugin/llpluginprocessparent.cpp
index c002de0462..110fac0f23 100644
--- a/indra/llplugin/llpluginprocessparent.cpp
+++ b/indra/llplugin/llpluginprocessparent.cpp
@@ -157,10 +157,12 @@ void LLPluginProcessParent::errorState(void)
setState(STATE_ERROR);
}
-void LLPluginProcessParent::init(const std::string &launcher_filename, const std::string &plugin_filename, bool debug)
+void LLPluginProcessParent::init(const std::string &launcher_filename, const std::string &plugin_dir, const std::string &plugin_filename, bool debug)
{
mProcess.setExecutable(launcher_filename);
+ mProcess.setWorkingDirectory(plugin_dir);
mPluginFile = plugin_filename;
+ mPluginDir = plugin_dir;
mCPUUsage = 0.0f;
mDebug = debug;
setState(STATE_INITIALIZED);
@@ -445,6 +447,7 @@ void LLPluginProcessParent::idle(void)
{
LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_INTERNAL, "load_plugin");
message.setValue("file", mPluginFile);
+ message.setValue("dir", mPluginDir);
sendMessage(message);
}
@@ -924,6 +927,7 @@ void LLPluginProcessParent::receiveMessage(const LLPluginMessage &message)
}
// Send initial sleep time
+ llassert_always(mSleepTime != 0.f);
setSleepTime(mSleepTime, true);
setState(STATE_RUNNING);
diff --git a/indra/llplugin/llpluginprocessparent.h b/indra/llplugin/llpluginprocessparent.h
index 32394809ef..c66723f175 100644
--- a/indra/llplugin/llpluginprocessparent.h
+++ b/indra/llplugin/llpluginprocessparent.h
@@ -57,6 +57,7 @@ public:
~LLPluginProcessParent();
void init(const std::string &launcher_filename,
+ const std::string &plugin_dir,
const std::string &plugin_filename,
bool debug);
@@ -151,6 +152,7 @@ private:
LLProcessLauncher mProcess;
std::string mPluginFile;
+ std::string mPluginDir;
LLPluginProcessParentOwner *mOwner;
diff --git a/indra/llprimitive/CMakeLists.txt b/indra/llprimitive/CMakeLists.txt
index f4d21308b3..7d0e313ff3 100644
--- a/indra/llprimitive/CMakeLists.txt
+++ b/indra/llprimitive/CMakeLists.txt
@@ -13,11 +13,14 @@ include_directories(
${LLMATH_INCLUDE_DIRS}
${LLMESSAGE_INCLUDE_DIRS}
${LLXML_INCLUDE_DIRS}
+ ${LIBS_PREBUILT_DIR}/include/collada
+ ${LIBS_PREBUILT_DIR}/include/collada/1.4
)
set(llprimitive_SOURCE_FILES
llmaterialtable.cpp
llmediaentry.cpp
+ llmodel.cpp
llprimitive.cpp
llprimtexturelist.cpp
lltextureanim.cpp
@@ -34,6 +37,7 @@ set(llprimitive_HEADER_FILES
legacy_object_types.h
llmaterialtable.h
llmediaentry.h
+ llmodel.h
llprimitive.h
llprimtexturelist.h
lltextureanim.h
@@ -53,11 +57,11 @@ list(APPEND llprimitive_SOURCE_FILES ${llprimitive_HEADER_FILES})
add_library (llprimitive ${llprimitive_SOURCE_FILES})
-if(LL_TESTS)
- #add unit tests
- INCLUDE(LLAddBuildTest)
- SET(llprimitive_TEST_SOURCE_FILES
+#add unit tests
+if (LL_TESTS)
+ INCLUDE(LLAddBuildTest)
+ SET(llprimitive_TEST_SOURCE_FILES
llmediaentry.cpp
)
- LL_ADD_PROJECT_UNIT_TESTS(llprimitive "${llprimitive_TEST_SOURCE_FILES}")
-endif(LL_TESTS)
+ LL_ADD_PROJECT_UNIT_TESTS(llprimitive "${llprimitive_TEST_SOURCE_FILES}")
+endif (LL_TESTS)
diff --git a/indra/llprimitive/llmaterialtable.cpp b/indra/llprimitive/llmaterialtable.cpp
index 99f32e4109..b4539ebee9 100644
--- a/indra/llprimitive/llmaterialtable.cpp
+++ b/indra/llprimitive/llmaterialtable.cpp
@@ -538,7 +538,7 @@ std::string LLMaterialTable::getName(U8 mcode)
}
}
- return NULL;
+ return std::string();
}
diff --git a/indra/llprimitive/llmodel.cpp b/indra/llprimitive/llmodel.cpp
new file mode 100644
index 0000000000..cb32a510b8
--- /dev/null
+++ b/indra/llprimitive/llmodel.cpp
@@ -0,0 +1,2456 @@
+/**
+ * @file llmodel.cpp
+ * @brief Model handling implementation
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+
+#include "llmodel.h"
+#include "llmemory.h"
+#include "llconvexdecomposition.h"
+#include "llsdserialize.h"
+#include "llvector4a.h"
+#if LL_MSVC
+#pragma warning (disable : 4263)
+#pragma warning (disable : 4264)
+#endif
+#include "dae.h"
+#include "dae/daeErrorHandler.h"
+#include "dom/domConstants.h"
+#include "dom/domMesh.h"
+#if LL_MSVC
+#pragma warning (default : 4263)
+#pragma warning (default : 4264)
+#endif
+
+#ifdef LL_STANDALONE
+# include <zlib.h>
+#else
+# include "zlib/zlib.h"
+#endif
+
+
+
+std::string model_names[] =
+{
+ "lowest_lod",
+ "low_lod",
+ "medium_lod",
+ "high_lod",
+ "physics_mesh"
+};
+
+const int MODEL_NAMES_LENGTH = sizeof(model_names) / sizeof(std::string);
+
+LLModel::LLModel(LLVolumeParams& params, F32 detail)
+ : LLVolume(params, detail), mNormalizedScale(1,1,1), mNormalizedTranslation(0,0,0)
+ , mPelvisOffset( 0.0f ), mStatus(NO_ERRORS)
+{
+ mDecompID = -1;
+ mLocalID = -1;
+}
+
+LLModel::~LLModel()
+{
+ if (mDecompID >= 0)
+ {
+ LLConvexDecomposition::getInstance()->deleteDecomposition(mDecompID);
+ }
+}
+
+
+bool get_dom_sources(const domInputLocalOffset_Array& inputs, S32& pos_offset, S32& tc_offset, S32& norm_offset, S32 &idx_stride,
+ domSource* &pos_source, domSource* &tc_source, domSource* &norm_source)
+{
+ idx_stride = 0;
+
+ for (U32 j = 0; j < inputs.getCount(); ++j)
+ {
+ idx_stride = llmax((S32) inputs[j]->getOffset(), idx_stride);
+
+ if (strcmp(COMMON_PROFILE_INPUT_VERTEX, inputs[j]->getSemantic()) == 0)
+ { //found vertex array
+ const domURIFragmentType& uri = inputs[j]->getSource();
+ daeElementRef elem = uri.getElement();
+ domVertices* vertices = (domVertices*) elem.cast();
+ if ( !vertices )
+ {
+ return false;
+ }
+
+ domInputLocal_Array& v_inp = vertices->getInput_array();
+
+
+ for (U32 k = 0; k < v_inp.getCount(); ++k)
+ {
+ if (strcmp(COMMON_PROFILE_INPUT_POSITION, v_inp[k]->getSemantic()) == 0)
+ {
+ pos_offset = inputs[j]->getOffset();
+
+ const domURIFragmentType& uri = v_inp[k]->getSource();
+ daeElementRef elem = uri.getElement();
+ pos_source = (domSource*) elem.cast();
+ }
+
+ if (strcmp(COMMON_PROFILE_INPUT_NORMAL, v_inp[k]->getSemantic()) == 0)
+ {
+ norm_offset = inputs[j]->getOffset();
+
+ const domURIFragmentType& uri = v_inp[k]->getSource();
+ daeElementRef elem = uri.getElement();
+ norm_source = (domSource*) elem.cast();
+ }
+ }
+ }
+
+ if (strcmp(COMMON_PROFILE_INPUT_NORMAL, inputs[j]->getSemantic()) == 0)
+ {
+ //found normal array for this triangle list
+ norm_offset = inputs[j]->getOffset();
+ const domURIFragmentType& uri = inputs[j]->getSource();
+ daeElementRef elem = uri.getElement();
+ norm_source = (domSource*) elem.cast();
+ }
+ else if (strcmp(COMMON_PROFILE_INPUT_TEXCOORD, inputs[j]->getSemantic()) == 0)
+ { //found texCoords
+ tc_offset = inputs[j]->getOffset();
+ const domURIFragmentType& uri = inputs[j]->getSource();
+ daeElementRef elem = uri.getElement();
+ tc_source = (domSource*) elem.cast();
+ }
+ }
+
+ idx_stride += 1;
+
+ return true;
+}
+
+LLModel::EModelStatus load_face_from_dom_triangles(std::vector<LLVolumeFace>& face_list, std::vector<std::string>& materials, domTrianglesRef& tri)
+{
+ LLVolumeFace face;
+ std::vector<LLVolumeFace::VertexData> verts;
+ std::vector<U16> indices;
+
+ const domInputLocalOffset_Array& inputs = tri->getInput_array();
+
+ S32 pos_offset = -1;
+ S32 tc_offset = -1;
+ S32 norm_offset = -1;
+
+ domSource* pos_source = NULL;
+ domSource* tc_source = NULL;
+ domSource* norm_source = NULL;
+
+ S32 idx_stride = 0;
+
+ if ( !get_dom_sources(inputs, pos_offset, tc_offset, norm_offset, idx_stride, pos_source, tc_source, norm_source) || !pos_source )
+ {
+ return LLModel::BAD_ELEMENT;
+ }
+
+
+ domPRef p = tri->getP();
+ domListOfUInts& idx = p->getValue();
+
+ domListOfFloats dummy ;
+ domListOfFloats& v = pos_source ? pos_source->getFloat_array()->getValue() : dummy ;
+ domListOfFloats& tc = tc_source ? tc_source->getFloat_array()->getValue() : dummy ;
+ domListOfFloats& n = norm_source ? norm_source->getFloat_array()->getValue() : dummy ;
+
+ if (pos_source)
+ {
+ face.mExtents[0].set(v[0], v[1], v[2]);
+ face.mExtents[1].set(v[0], v[1], v[2]);
+ }
+
+ LLVolumeFace::VertexMapData::PointMap point_map;
+
+ for (U32 i = 0; i < idx.getCount(); i += idx_stride)
+ {
+ LLVolumeFace::VertexData cv;
+ if (pos_source)
+ {
+ cv.setPosition(LLVector4a(v[idx[i+pos_offset]*3+0],
+ v[idx[i+pos_offset]*3+1],
+ v[idx[i+pos_offset]*3+2]));
+ }
+
+ if (tc_source)
+ {
+ cv.mTexCoord.setVec(tc[idx[i+tc_offset]*2+0],
+ tc[idx[i+tc_offset]*2+1]);
+ }
+
+ if (norm_source)
+ {
+ cv.setNormal(LLVector4a(n[idx[i+norm_offset]*3+0],
+ n[idx[i+norm_offset]*3+1],
+ n[idx[i+norm_offset]*3+2]));
+ }
+
+ BOOL found = FALSE;
+
+ LLVolumeFace::VertexMapData::PointMap::iterator point_iter;
+ point_iter = point_map.find(LLVector3(cv.getPosition().getF32ptr()));
+
+ if (point_iter != point_map.end())
+ {
+ for (U32 j = 0; j < point_iter->second.size(); ++j)
+ {
+ if ((point_iter->second)[j] == cv)
+ {
+ found = TRUE;
+ indices.push_back((point_iter->second)[j].mIndex);
+ break;
+ }
+ }
+ }
+
+ if (!found)
+ {
+ update_min_max(face.mExtents[0], face.mExtents[1], cv.getPosition());
+ verts.push_back(cv);
+ if (verts.size() >= 65535)
+ {
+ //llerrs << "Attempted to write model exceeding 16-bit index buffer limitation." << llendl;
+ return LLModel::VERTEX_NUMBER_OVERFLOW ;
+ }
+ U16 index = (U16) (verts.size()-1);
+ indices.push_back(index);
+
+ LLVolumeFace::VertexMapData d;
+ d.setPosition(cv.getPosition());
+ d.mTexCoord = cv.mTexCoord;
+ d.setNormal(cv.getNormal());
+ d.mIndex = index;
+ if (point_iter != point_map.end())
+ {
+ point_iter->second.push_back(d);
+ }
+ else
+ {
+ point_map[LLVector3(d.getPosition().getF32ptr())].push_back(d);
+ }
+ }
+
+ if (indices.size()%3 == 0 && verts.size() >= 65532)
+ {
+ face_list.push_back(face);
+ face_list.rbegin()->fillFromLegacyData(verts, indices);
+ LLVolumeFace& new_face = *face_list.rbegin();
+ if (!norm_source)
+ {
+ ll_aligned_free_16(new_face.mNormals);
+ new_face.mNormals = NULL;
+ }
+
+ if (!tc_source)
+ {
+ ll_aligned_free_16(new_face.mTexCoords);
+ new_face.mTexCoords = NULL;
+ }
+
+ face = LLVolumeFace();
+ point_map.clear();
+ }
+ }
+
+ if (!verts.empty())
+ {
+ std::string material;
+
+ if (tri->getMaterial())
+ {
+ material = std::string(tri->getMaterial());
+ }
+
+ materials.push_back(material);
+ face_list.push_back(face);
+
+ face_list.rbegin()->fillFromLegacyData(verts, indices);
+ LLVolumeFace& new_face = *face_list.rbegin();
+ if (!norm_source)
+ {
+ ll_aligned_free_16(new_face.mNormals);
+ new_face.mNormals = NULL;
+ }
+
+ if (!tc_source)
+ {
+ ll_aligned_free_16(new_face.mTexCoords);
+ new_face.mTexCoords = NULL;
+ }
+ }
+
+ return LLModel::NO_ERRORS ;
+}
+
+LLModel::EModelStatus load_face_from_dom_polylist(std::vector<LLVolumeFace>& face_list, std::vector<std::string>& materials, domPolylistRef& poly)
+{
+ domPRef p = poly->getP();
+ domListOfUInts& idx = p->getValue();
+
+ if (idx.getCount() == 0)
+ {
+ return LLModel::NO_ERRORS ;
+ }
+
+ const domInputLocalOffset_Array& inputs = poly->getInput_array();
+
+
+ domListOfUInts& vcount = poly->getVcount()->getValue();
+
+ S32 pos_offset = -1;
+ S32 tc_offset = -1;
+ S32 norm_offset = -1;
+
+ domSource* pos_source = NULL;
+ domSource* tc_source = NULL;
+ domSource* norm_source = NULL;
+
+ S32 idx_stride = 0;
+
+ if (!get_dom_sources(inputs, pos_offset, tc_offset, norm_offset, idx_stride, pos_source, tc_source, norm_source))
+ {
+ return LLModel::BAD_ELEMENT;
+ }
+
+ LLVolumeFace face;
+
+ std::vector<U16> indices;
+ std::vector<LLVolumeFace::VertexData> verts;
+
+ domListOfFloats v;
+ domListOfFloats tc;
+ domListOfFloats n;
+
+ if (pos_source)
+ {
+ v = pos_source->getFloat_array()->getValue();
+ face.mExtents[0].set(v[0], v[1], v[2]);
+ face.mExtents[1].set(v[0], v[1], v[2]);
+ }
+
+ if (tc_source)
+ {
+ tc = tc_source->getFloat_array()->getValue();
+ }
+
+ if (norm_source)
+ {
+ n = norm_source->getFloat_array()->getValue();
+ }
+
+ LLVolumeFace::VertexMapData::PointMap point_map;
+
+ U32 cur_idx = 0;
+ for (U32 i = 0; i < vcount.getCount(); ++i)
+ { //for each polygon
+ U32 first_index = 0;
+ U32 last_index = 0;
+ for (U32 j = 0; j < vcount[i]; ++j)
+ { //for each vertex
+
+ LLVolumeFace::VertexData cv;
+
+ if (pos_source)
+ {
+ cv.getPosition().set(v[idx[cur_idx+pos_offset]*3+0],
+ v[idx[cur_idx+pos_offset]*3+1],
+ v[idx[cur_idx+pos_offset]*3+2]);
+ }
+
+ if (tc_source)
+ {
+ cv.mTexCoord.setVec(tc[idx[cur_idx+tc_offset]*2+0],
+ tc[idx[cur_idx+tc_offset]*2+1]);
+ }
+
+ if (norm_source)
+ {
+ cv.getNormal().set(n[idx[cur_idx+norm_offset]*3+0],
+ n[idx[cur_idx+norm_offset]*3+1],
+ n[idx[cur_idx+norm_offset]*3+2]);
+ }
+
+ cur_idx += idx_stride;
+
+ BOOL found = FALSE;
+
+ LLVolumeFace::VertexMapData::PointMap::iterator point_iter;
+ LLVector3 pos3(cv.getPosition().getF32ptr());
+ point_iter = point_map.find(pos3);
+
+ if (point_iter != point_map.end())
+ {
+ for (U32 k = 0; k < point_iter->second.size(); ++k)
+ {
+ if ((point_iter->second)[k] == cv)
+ {
+ found = TRUE;
+ U32 index = (point_iter->second)[k].mIndex;
+ if (j == 0)
+ {
+ first_index = index;
+ }
+ else if (j == 1)
+ {
+ last_index = index;
+ }
+ else
+ {
+ indices.push_back(first_index);
+ indices.push_back(last_index);
+ indices.push_back(index);
+ last_index = index;
+ }
+
+ break;
+ }
+ }
+ }
+
+ if (!found)
+ {
+ update_min_max(face.mExtents[0], face.mExtents[1], cv.getPosition());
+ verts.push_back(cv);
+ if (verts.size() >= 65535)
+ {
+ //llerrs << "Attempted to write model exceeding 16-bit index buffer limitation." << llendl;
+ return LLModel::VERTEX_NUMBER_OVERFLOW ;
+ }
+ U16 index = (U16) (verts.size()-1);
+
+ if (j == 0)
+ {
+ first_index = index;
+ }
+ else if (j == 1)
+ {
+ last_index = index;
+ }
+ else
+ {
+ indices.push_back(first_index);
+ indices.push_back(last_index);
+ indices.push_back(index);
+ last_index = index;
+ }
+
+ LLVolumeFace::VertexMapData d;
+ d.setPosition(cv.getPosition());
+ d.mTexCoord = cv.mTexCoord;
+ d.setNormal(cv.getNormal());
+ d.mIndex = index;
+ if (point_iter != point_map.end())
+ {
+ point_iter->second.push_back(d);
+ }
+ else
+ {
+ point_map[pos3].push_back(d);
+ }
+ }
+
+ if (indices.size()%3 == 0 && indices.size() >= 65532)
+ {
+ face_list.push_back(face);
+ face_list.rbegin()->fillFromLegacyData(verts, indices);
+ LLVolumeFace& new_face = *face_list.rbegin();
+ if (!norm_source)
+ {
+ ll_aligned_free_16(new_face.mNormals);
+ new_face.mNormals = NULL;
+ }
+
+ if (!tc_source)
+ {
+ ll_aligned_free_16(new_face.mTexCoords);
+ new_face.mTexCoords = NULL;
+ }
+
+ face = LLVolumeFace();
+ verts.clear();
+ indices.clear();
+ point_map.clear();
+ }
+ }
+ }
+
+ if (!verts.empty())
+ {
+ std::string material;
+
+ if (poly->getMaterial())
+ {
+ material = std::string(poly->getMaterial());
+ }
+
+ materials.push_back(material);
+ face_list.push_back(face);
+ face_list.rbegin()->fillFromLegacyData(verts, indices);
+
+ LLVolumeFace& new_face = *face_list.rbegin();
+ if (!norm_source)
+ {
+ ll_aligned_free_16(new_face.mNormals);
+ new_face.mNormals = NULL;
+ }
+
+ if (!tc_source)
+ {
+ ll_aligned_free_16(new_face.mTexCoords);
+ new_face.mTexCoords = NULL;
+ }
+ }
+
+ return LLModel::NO_ERRORS ;
+}
+
+LLModel::EModelStatus load_face_from_dom_polygons(std::vector<LLVolumeFace>& face_list, std::vector<std::string>& materials, domPolygonsRef& poly)
+{
+ LLVolumeFace face;
+ std::vector<U16> indices;
+ std::vector<LLVolumeFace::VertexData> verts;
+
+ const domInputLocalOffset_Array& inputs = poly->getInput_array();
+
+ S32 v_offset = -1;
+ S32 n_offset = -1;
+ S32 t_offset = -1;
+
+ domListOfFloats* v = NULL;
+ domListOfFloats* n = NULL;
+ domListOfFloats* t = NULL;
+
+ U32 stride = 0;
+ for (U32 i = 0; i < inputs.getCount(); ++i)
+ {
+ stride = llmax((U32) inputs[i]->getOffset()+1, stride);
+
+ if (strcmp(COMMON_PROFILE_INPUT_VERTEX, inputs[i]->getSemantic()) == 0)
+ { //found vertex array
+ v_offset = inputs[i]->getOffset();
+
+ const domURIFragmentType& uri = inputs[i]->getSource();
+ daeElementRef elem = uri.getElement();
+ domVertices* vertices = (domVertices*) elem.cast();
+ if (!vertices)
+ {
+ return LLModel::BAD_ELEMENT;
+ }
+ domInputLocal_Array& v_inp = vertices->getInput_array();
+
+ for (U32 k = 0; k < v_inp.getCount(); ++k)
+ {
+ if (strcmp(COMMON_PROFILE_INPUT_POSITION, v_inp[k]->getSemantic()) == 0)
+ {
+ const domURIFragmentType& uri = v_inp[k]->getSource();
+ daeElementRef elem = uri.getElement();
+ domSource* src = (domSource*) elem.cast();
+ if (!src)
+ {
+ return LLModel::BAD_ELEMENT;
+ }
+ v = &(src->getFloat_array()->getValue());
+ }
+ }
+ }
+ else if (strcmp(COMMON_PROFILE_INPUT_NORMAL, inputs[i]->getSemantic()) == 0)
+ {
+ n_offset = inputs[i]->getOffset();
+ //found normal array for this triangle list
+ const domURIFragmentType& uri = inputs[i]->getSource();
+ daeElementRef elem = uri.getElement();
+ domSource* src = (domSource*) elem.cast();
+ if (!src)
+ {
+ return LLModel::BAD_ELEMENT;
+ }
+ n = &(src->getFloat_array()->getValue());
+ }
+ else if (strcmp(COMMON_PROFILE_INPUT_TEXCOORD, inputs[i]->getSemantic()) == 0 && inputs[i]->getSet() == 0)
+ { //found texCoords
+ t_offset = inputs[i]->getOffset();
+ const domURIFragmentType& uri = inputs[i]->getSource();
+ daeElementRef elem = uri.getElement();
+ domSource* src = (domSource*) elem.cast();
+ if (!src)
+ {
+ return LLModel::BAD_ELEMENT;
+ }
+ t = &(src->getFloat_array()->getValue());
+ }
+ }
+
+ domP_Array& ps = poly->getP_array();
+
+ //make a triangle list in <verts>
+ for (U32 i = 0; i < ps.getCount(); ++i)
+ { //for each polygon
+ domListOfUInts& idx = ps[i]->getValue();
+ for (U32 j = 0; j < idx.getCount()/stride; ++j)
+ { //for each vertex
+ if (j > 2)
+ {
+ U32 size = verts.size();
+ LLVolumeFace::VertexData v0 = verts[size-3];
+ LLVolumeFace::VertexData v1 = verts[size-1];
+
+ verts.push_back(v0);
+ verts.push_back(v1);
+ }
+
+ LLVolumeFace::VertexData vert;
+
+
+ if (v)
+ {
+ U32 v_idx = idx[j*stride+v_offset]*3;
+ vert.getPosition().set(v->get(v_idx),
+ v->get(v_idx+1),
+ v->get(v_idx+2));
+ }
+
+ if (n)
+ {
+ U32 n_idx = idx[j*stride+n_offset]*3;
+ vert.getNormal().set(n->get(n_idx),
+ n->get(n_idx+1),
+ n->get(n_idx+2));
+ }
+
+ if (t)
+ {
+ U32 t_idx = idx[j*stride+t_offset]*2;
+ vert.mTexCoord.setVec(t->get(t_idx),
+ t->get(t_idx+1));
+ }
+
+ verts.push_back(vert);
+ }
+ }
+
+ if (verts.empty())
+ {
+ return LLModel::NO_ERRORS;
+ }
+
+ face.mExtents[0] = verts[0].getPosition();
+ face.mExtents[1] = verts[0].getPosition();
+
+ //create a map of unique vertices to indices
+ std::map<LLVolumeFace::VertexData, U32> vert_idx;
+
+ U32 cur_idx = 0;
+ for (U32 i = 0; i < verts.size(); ++i)
+ {
+ std::map<LLVolumeFace::VertexData, U32>::iterator iter = vert_idx.find(verts[i]);
+ if (iter == vert_idx.end())
+ {
+ vert_idx[verts[i]] = cur_idx++;
+ }
+ }
+
+ //build vertex array from map
+ std::vector<LLVolumeFace::VertexData> new_verts;
+ new_verts.resize(vert_idx.size());
+
+ for (std::map<LLVolumeFace::VertexData, U32>::iterator iter = vert_idx.begin(); iter != vert_idx.end(); ++iter)
+ {
+ new_verts[iter->second] = iter->first;
+ update_min_max(face.mExtents[0], face.mExtents[1], iter->first.getPosition());
+ }
+
+ //build index array from map
+ indices.resize(verts.size());
+
+ for (U32 i = 0; i < verts.size(); ++i)
+ {
+ indices[i] = vert_idx[verts[i]];
+ }
+
+ // DEBUG just build an expanded triangle list
+ /*for (U32 i = 0; i < verts.size(); ++i)
+ {
+ indices.push_back((U16) i);
+ update_min_max(face.mExtents[0], face.mExtents[1], verts[i].getPosition());
+ }*/
+
+ if (!new_verts.empty())
+ {
+ std::string material;
+
+ if (poly->getMaterial())
+ {
+ material = std::string(poly->getMaterial());
+ }
+
+ materials.push_back(material);
+ face_list.push_back(face);
+ face_list.rbegin()->fillFromLegacyData(new_verts, indices);
+
+ LLVolumeFace& new_face = *face_list.rbegin();
+ if (!n)
+ {
+ ll_aligned_free_16(new_face.mNormals);
+ new_face.mNormals = NULL;
+ }
+
+ if (!t)
+ {
+ ll_aligned_free_16(new_face.mTexCoords);
+ new_face.mTexCoords = NULL;
+ }
+ }
+
+ return LLModel::NO_ERRORS ;
+}
+
+//static
+std::string LLModel::getStatusString(U32 status)
+{
+ const static std::string status_strings[(S32)INVALID_STATUS] = {"status_no_error", "status_vertex_number_overflow","bad_element"};
+
+ if(status < INVALID_STATUS)
+ {
+ if(status_strings[status] == std::string())
+ {
+ llerrs << "No valid status string for this status: " << (U32)status << llendl ;
+ }
+ return status_strings[status] ;
+ }
+
+ llerrs << "Invalid model status: " << (U32)status << llendl ;
+
+ return std::string() ;
+}
+
+void LLModel::addVolumeFacesFromDomMesh(domMesh* mesh)
+{
+ domTriangles_Array& tris = mesh->getTriangles_array();
+
+ for (U32 i = 0; i < tris.getCount(); ++i)
+ {
+ domTrianglesRef& tri = tris.get(i);
+
+ mStatus = load_face_from_dom_triangles(mVolumeFaces, mMaterialList, tri);
+
+ if(mStatus != NO_ERRORS)
+ {
+ mVolumeFaces.clear() ;
+ mMaterialList.clear() ;
+ return ; //abort
+ }
+ }
+
+ domPolylist_Array& polys = mesh->getPolylist_array();
+ for (U32 i = 0; i < polys.getCount(); ++i)
+ {
+ domPolylistRef& poly = polys.get(i);
+ mStatus = load_face_from_dom_polylist(mVolumeFaces, mMaterialList, poly);
+
+ if(mStatus != NO_ERRORS)
+ {
+ mVolumeFaces.clear() ;
+ mMaterialList.clear() ;
+ return ; //abort
+ }
+ }
+
+ domPolygons_Array& polygons = mesh->getPolygons_array();
+
+ for (U32 i = 0; i < polygons.getCount(); ++i)
+ {
+ domPolygonsRef& poly = polygons.get(i);
+ mStatus = load_face_from_dom_polygons(mVolumeFaces, mMaterialList, poly);
+
+ if(mStatus != NO_ERRORS)
+ {
+ mVolumeFaces.clear() ;
+ mMaterialList.clear() ;
+ return ; //abort
+ }
+ }
+
+}
+
+BOOL LLModel::createVolumeFacesFromDomMesh(domMesh* mesh)
+{
+ if (mesh)
+ {
+ mVolumeFaces.clear();
+ mMaterialList.clear();
+
+ addVolumeFacesFromDomMesh(mesh);
+
+ if (getNumVolumeFaces() > 0)
+ {
+ normalizeVolumeFaces();
+ optimizeVolumeFaces();
+
+ if (getNumVolumeFaces() > 0)
+ {
+ return TRUE;
+ }
+ }
+ }
+ else
+ {
+ llwarns << "no mesh found" << llendl;
+ }
+
+ return FALSE;
+}
+
+void LLModel::offsetMesh( const LLVector3& pivotPoint )
+{
+ LLVector4a pivot( pivotPoint[VX], pivotPoint[VY], pivotPoint[VZ] );
+
+ for (std::vector<LLVolumeFace>::iterator faceIt = mVolumeFaces.begin(); faceIt != mVolumeFaces.end(); )
+ {
+ std::vector<LLVolumeFace>:: iterator currentFaceIt = faceIt++;
+ LLVolumeFace& face = *currentFaceIt;
+ LLVector4a *pos = (LLVector4a*) face.mPositions;
+
+ for (U32 i=0; i<face.mNumVertices; ++i )
+ {
+ pos[i].add( pivot );
+ }
+ }
+}
+
+void LLModel::optimizeVolumeFaces()
+{
+ for (U32 i = 0; i < getNumVolumeFaces(); ++i)
+ {
+ mVolumeFaces[i].optimize();
+ }
+}
+
+// Shrink the model to fit
+// on a 1x1x1 cube centered at the origin.
+// The positions and extents
+// multiplied by mNormalizedScale
+// and offset by mNormalizedTranslation
+// to be the "original" extents and position.
+// Also, the positions will fit
+// within the unit cube.
+void LLModel::normalizeVolumeFaces()
+{
+
+ // ensure we don't have too many faces
+ if (mVolumeFaces.size() > LL_SCULPT_MESH_MAX_FACES)
+ mVolumeFaces.resize(LL_SCULPT_MESH_MAX_FACES);
+
+ if (!mVolumeFaces.empty())
+ {
+ LLVector4a min, max;
+
+ // For all of the volume faces
+ // in the model, loop over
+ // them and see what the extents
+ // of the volume along each axis.
+ min = mVolumeFaces[0].mExtents[0];
+ max = mVolumeFaces[0].mExtents[1];
+
+ for (U32 i = 1; i < mVolumeFaces.size(); ++i)
+ {
+ LLVolumeFace& face = mVolumeFaces[i];
+
+ update_min_max(min, max, face.mExtents[0]);
+ update_min_max(min, max, face.mExtents[1]);
+
+ if (face.mTexCoords)
+ {
+ LLVector2& min_tc = face.mTexCoordExtents[0];
+ LLVector2& max_tc = face.mTexCoordExtents[1];
+
+ min_tc = face.mTexCoords[0];
+ max_tc = face.mTexCoords[0];
+
+ for (U32 j = 1; j < face.mNumVertices; ++j)
+ {
+ update_min_max(min_tc, max_tc, face.mTexCoords[j]);
+ }
+ }
+ else
+ {
+ face.mTexCoordExtents[0].set(0,0);
+ face.mTexCoordExtents[1].set(1,1);
+ }
+ }
+
+ // Now that we have the extents of the model
+ // we can compute the offset needed to center
+ // the model at the origin.
+
+ // Compute center of the model
+ // and make it negative to get translation
+ // needed to center at origin.
+ LLVector4a trans;
+ trans.setAdd(min, max);
+ trans.mul(-0.5f);
+
+ // Compute the total size along all
+ // axes of the model.
+ LLVector4a size;
+ size.setSub(max, min);
+
+ // Prevent division by zero.
+ F32 x = size[0];
+ F32 y = size[1];
+ F32 z = size[2];
+ F32 w = size[3];
+ if (fabs(x)<F_APPROXIMATELY_ZERO)
+ {
+ x = 1.0;
+ }
+ if (fabs(y)<F_APPROXIMATELY_ZERO)
+ {
+ y = 1.0;
+ }
+ if (fabs(z)<F_APPROXIMATELY_ZERO)
+ {
+ z = 1.0;
+ }
+ size.set(x,y,z,w);
+
+ // Compute scale as reciprocal of size
+ LLVector4a scale;
+ scale.splat(1.f);
+ scale.div(size);
+
+ LLVector4a inv_scale(1.f);
+ inv_scale.div(scale);
+
+ for (U32 i = 0; i < mVolumeFaces.size(); ++i)
+ {
+ LLVolumeFace& face = mVolumeFaces[i];
+
+ // We shrink the extents so
+ // that they fall within
+ // the unit cube.
+ face.mExtents[0].add(trans);
+ face.mExtents[0].mul(scale);
+
+ face.mExtents[1].add(trans);
+ face.mExtents[1].mul(scale);
+
+ // For all the positions, we scale
+ // the positions to fit within the unit cube.
+ LLVector4a* pos = (LLVector4a*) face.mPositions;
+ LLVector4a* norm = (LLVector4a*) face.mNormals;
+
+ for (U32 j = 0; j < face.mNumVertices; ++j)
+ {
+ pos[j].add(trans);
+ pos[j].mul(scale);
+ if (norm && !norm[j].equals3(LLVector4a::getZero()))
+ {
+ norm[j].mul(inv_scale);
+ norm[j].normalize3();
+ }
+ }
+ }
+
+ // mNormalizedScale is the scale at which
+ // we would need to multiply the model
+ // by to get the original size of the
+ // model instead of the normalized size.
+ LLVector4a normalized_scale;
+ normalized_scale.splat(1.f);
+ normalized_scale.div(scale);
+ mNormalizedScale.set(normalized_scale.getF32ptr());
+ mNormalizedTranslation.set(trans.getF32ptr());
+ mNormalizedTranslation *= -1.f;
+ }
+}
+
+void LLModel::getNormalizedScaleTranslation(LLVector3& scale_out, LLVector3& translation_out)
+{
+ scale_out = mNormalizedScale;
+ translation_out = mNormalizedTranslation;
+}
+
+void LLModel::setNumVolumeFaces(S32 count)
+{
+ mVolumeFaces.resize(count);
+}
+
+void LLModel::setVolumeFaceData(
+ S32 f,
+ LLStrider<LLVector3> pos,
+ LLStrider<LLVector3> norm,
+ LLStrider<LLVector2> tc,
+ LLStrider<U16> ind,
+ U32 num_verts,
+ U32 num_indices)
+{
+ LLVolumeFace& face = mVolumeFaces[f];
+
+ face.resizeVertices(num_verts);
+ face.resizeIndices(num_indices);
+
+ LLVector4a::memcpyNonAliased16((F32*) face.mPositions, (F32*) pos.get(), num_verts*4*sizeof(F32));
+ if (norm.get())
+ {
+ LLVector4a::memcpyNonAliased16((F32*) face.mNormals, (F32*) norm.get(), num_verts*4*sizeof(F32));
+ }
+ else
+ {
+ ll_aligned_free_16(face.mNormals);
+ face.mNormals = NULL;
+ }
+
+ if (tc.get())
+ {
+ LLVector4a::memcpyNonAliased16((F32*) face.mTexCoords, (F32*) tc.get(), num_verts*2*sizeof(F32));
+ }
+ else
+ {
+ ll_aligned_free_16(face.mTexCoords);
+ face.mTexCoords = NULL;
+ }
+
+ U32 size = (num_indices*2+0xF)&~0xF;
+ LLVector4a::memcpyNonAliased16((F32*) face.mIndices, (F32*) ind.get(), size);
+}
+
+void LLModel::appendFaces(LLModel *model, LLMatrix4 &transform, LLMatrix4& norm_mat)
+{
+ if (mVolumeFaces.empty())
+ {
+ setNumVolumeFaces(1);
+ }
+
+ LLVolumeFace& face = mVolumeFaces[mVolumeFaces.size()-1];
+
+
+ for (S32 i = 0; i < model->getNumFaces(); ++i)
+ {
+ face.appendFace(model->getVolumeFace(i), transform, norm_mat);
+ }
+
+}
+
+void LLModel::appendFace(const LLVolumeFace& src_face, std::string src_material, LLMatrix4& mat, LLMatrix4& norm_mat)
+{
+ S32 rindex = getNumVolumeFaces()-1;
+ if (rindex == -1 ||
+ mVolumeFaces[rindex].mNumVertices + src_face.mNumVertices >= 65536)
+ { //empty or overflow will occur, append new face
+ LLVolumeFace cur_face;
+ cur_face.appendFace(src_face, mat, norm_mat);
+ addFace(cur_face);
+ mMaterialList.push_back(src_material);
+ }
+ else
+ { //append to existing end face
+ mVolumeFaces.rbegin()->appendFace(src_face, mat, norm_mat);
+ }
+}
+
+void LLModel::addFace(const LLVolumeFace& face)
+{
+ if (face.mNumVertices == 0)
+ {
+ llerrs << "Cannot add empty face." << llendl;
+ }
+
+ mVolumeFaces.push_back(face);
+
+ if (mVolumeFaces.size() > MAX_MODEL_FACES)
+ {
+ llerrs << "Model prims cannot have more than " << MAX_MODEL_FACES << " faces!" << llendl;
+ }
+}
+
+
+void LLModel::generateNormals(F32 angle_cutoff)
+{
+ //generate normals for all faces by:
+ // 1 - Create faceted copy of face with no texture coordinates
+ // 2 - Weld vertices in faceted copy that are shared between triangles with less than "angle_cutoff" difference between normals
+ // 3 - Generate smoothed set of normals based on welding results
+ // 4 - Create faceted copy of face with texture coordinates
+ // 5 - Copy smoothed normals to faceted copy, using closest normal to triangle normal where more than one normal exists for a given position
+ // 6 - Remove redundant vertices from new faceted (now smooth) copy
+
+ angle_cutoff = cosf(angle_cutoff);
+ for (U32 j = 0; j < mVolumeFaces.size(); ++j)
+ {
+ LLVolumeFace& vol_face = mVolumeFaces[j];
+
+ if (vol_face.mNumIndices > 65535)
+ {
+ llwarns << "Too many vertices for normal generation to work." << llendl;
+ continue;
+ }
+
+ //create faceted copy of current face with no texture coordinates (step 1)
+ LLVolumeFace faceted;
+
+ LLVector4a* src_pos = (LLVector4a*) vol_face.mPositions;
+ //LLVector4a* src_norm = (LLVector4a*) vol_face.mNormals;
+
+
+ faceted.resizeVertices(vol_face.mNumIndices);
+ faceted.resizeIndices(vol_face.mNumIndices);
+ //bake out triangles into temporary face, clearing texture coordinates
+ for (U32 i = 0; i < vol_face.mNumIndices; ++i)
+ {
+ U32 idx = vol_face.mIndices[i];
+
+ faceted.mPositions[i] = src_pos[idx];
+ faceted.mTexCoords[i] = LLVector2(0,0);
+ faceted.mIndices[i] = i;
+ }
+
+ //generate normals for temporary face
+ for (U32 i = 0; i < faceted.mNumIndices; i += 3)
+ { //for each triangle
+ U16 i0 = faceted.mIndices[i+0];
+ U16 i1 = faceted.mIndices[i+1];
+ U16 i2 = faceted.mIndices[i+2];
+
+ LLVector4a& p0 = faceted.mPositions[i0];
+ LLVector4a& p1 = faceted.mPositions[i1];
+ LLVector4a& p2 = faceted.mPositions[i2];
+
+ LLVector4a& n0 = faceted.mNormals[i0];
+ LLVector4a& n1 = faceted.mNormals[i1];
+ LLVector4a& n2 = faceted.mNormals[i2];
+
+ LLVector4a lhs, rhs;
+ lhs.setSub(p1, p0);
+ rhs.setSub(p2, p0);
+
+ n0.setCross3(lhs, rhs);
+ n0.normalize3();
+ n1 = n0;
+ n2 = n0;
+ }
+
+ //weld vertices in temporary face, respecting angle_cutoff (step 2)
+ faceted.optimize(angle_cutoff);
+
+ //generate normals for welded face based on new topology (step 3)
+
+ for (U32 i = 0; i < faceted.mNumVertices; i++)
+ {
+ faceted.mNormals[i].clear();
+ }
+
+ for (U32 i = 0; i < faceted.mNumIndices; i += 3)
+ { //for each triangle
+ U16 i0 = faceted.mIndices[i+0];
+ U16 i1 = faceted.mIndices[i+1];
+ U16 i2 = faceted.mIndices[i+2];
+
+ LLVector4a& p0 = faceted.mPositions[i0];
+ LLVector4a& p1 = faceted.mPositions[i1];
+ LLVector4a& p2 = faceted.mPositions[i2];
+
+ LLVector4a& n0 = faceted.mNormals[i0];
+ LLVector4a& n1 = faceted.mNormals[i1];
+ LLVector4a& n2 = faceted.mNormals[i2];
+
+ LLVector4a lhs, rhs;
+ lhs.setSub(p1, p0);
+ rhs.setSub(p2, p0);
+
+ LLVector4a n;
+ n.setCross3(lhs, rhs);
+
+ n0.add(n);
+ n1.add(n);
+ n2.add(n);
+ }
+
+ //normalize normals and build point map
+ LLVolumeFace::VertexMapData::PointMap point_map;
+
+ for (U32 i = 0; i < faceted.mNumVertices; ++i)
+ {
+ faceted.mNormals[i].normalize3();
+
+ LLVolumeFace::VertexMapData v;
+ v.setPosition(faceted.mPositions[i]);
+ v.setNormal(faceted.mNormals[i]);
+
+ point_map[LLVector3(v.getPosition().getF32ptr())].push_back(v);
+ }
+
+ //create faceted copy of current face with texture coordinates (step 4)
+ LLVolumeFace new_face;
+
+ //bake out triangles into new face
+ new_face.resizeIndices(vol_face.mNumIndices);
+ new_face.resizeVertices(vol_face.mNumIndices);
+
+ for (U32 i = 0; i < vol_face.mNumIndices; ++i)
+ {
+ U32 idx = vol_face.mIndices[i];
+ LLVolumeFace::VertexData v;
+ new_face.mPositions[i] = vol_face.mPositions[idx];
+ new_face.mNormals[i].clear();
+ new_face.mIndices[i] = i;
+ }
+
+ if (vol_face.mTexCoords)
+ {
+ for (U32 i = 0; i < vol_face.mNumIndices; i++)
+ {
+ U32 idx = vol_face.mIndices[i];
+ new_face.mTexCoords[i] = vol_face.mTexCoords[idx];
+ }
+ }
+ else
+ {
+ ll_aligned_free_16(new_face.mTexCoords);
+ new_face.mTexCoords = NULL;
+ }
+
+ //generate normals for new face
+ for (U32 i = 0; i < new_face.mNumIndices; i += 3)
+ { //for each triangle
+ U16 i0 = new_face.mIndices[i+0];
+ U16 i1 = new_face.mIndices[i+1];
+ U16 i2 = new_face.mIndices[i+2];
+
+ LLVector4a& p0 = new_face.mPositions[i0];
+ LLVector4a& p1 = new_face.mPositions[i1];
+ LLVector4a& p2 = new_face.mPositions[i2];
+
+ LLVector4a& n0 = new_face.mNormals[i0];
+ LLVector4a& n1 = new_face.mNormals[i1];
+ LLVector4a& n2 = new_face.mNormals[i2];
+
+ LLVector4a lhs, rhs;
+ lhs.setSub(p1, p0);
+ rhs.setSub(p2, p0);
+
+ n0.setCross3(lhs, rhs);
+ n0.normalize3();
+ n1 = n0;
+ n2 = n0;
+ }
+
+ //swap out normals in new_face with best match from point map (step 5)
+ for (U32 i = 0; i < new_face.mNumVertices; ++i)
+ {
+ //LLVolumeFace::VertexData v = new_face.mVertices[i];
+
+ LLVector4a ref_norm = new_face.mNormals[i];
+
+ LLVolumeFace::VertexMapData::PointMap::iterator iter = point_map.find(LLVector3(new_face.mPositions[i].getF32ptr()));
+
+ if (iter != point_map.end())
+ {
+ F32 best = -2.f;
+ for (U32 k = 0; k < iter->second.size(); ++k)
+ {
+ LLVector4a& n = iter->second[k].getNormal();
+
+ F32 cur = n.dot3(ref_norm).getF32();
+
+ if (cur > best)
+ {
+ best = cur;
+ new_face.mNormals[i] = n;
+ }
+ }
+ }
+ }
+
+ //remove redundant vertices from new face (step 6)
+ new_face.optimize();
+
+ mVolumeFaces[j] = new_face;
+ }
+}
+
+//static
+std::string LLModel::getElementLabel(daeElement *element)
+{ // try to get a decent label for this element
+ // if we have a name attribute, use it
+ std::string name = element->getAttribute("name");
+ if (name.length())
+ {
+ return name;
+ }
+
+ // if we have an ID attribute, use it
+ if (element->getID())
+ {
+ return std::string(element->getID());
+ }
+
+ // if we have a parent, use it
+ daeElement* parent = element->getParent();
+ if (parent)
+ {
+ // if parent has a name, use it
+ std::string name = parent->getAttribute("name");
+ if (name.length())
+ {
+ return name;
+ }
+
+ // if parent has an ID, use it
+ if (parent->getID())
+ {
+ return std::string(parent->getID());
+ }
+ }
+
+ // try to use our type
+ daeString element_name = element->getElementName();
+ if (element_name)
+ {
+ return std::string(element_name);
+ }
+
+ // if all else fails, use "object"
+ return std::string("object");
+}
+
+//static
+LLModel* LLModel::loadModelFromDomMesh(domMesh *mesh)
+{
+ LLVolumeParams volume_params;
+ volume_params.setType(LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE);
+ LLModel* ret = new LLModel(volume_params, 0.f);
+ ret->createVolumeFacesFromDomMesh(mesh);
+ ret->mLabel = getElementLabel(mesh);
+ return ret;
+}
+
+std::string LLModel::getName() const
+{
+ if (!mRequestedLabel.empty())
+ return mRequestedLabel;
+ else
+ return mLabel;
+}
+
+//static
+LLSD LLModel::writeModel(
+ std::ostream& ostr,
+ LLModel* physics,
+ LLModel* high,
+ LLModel* medium,
+ LLModel* low,
+ LLModel* impostor,
+ const LLModel::Decomposition& decomp,
+ BOOL upload_skin,
+ BOOL upload_joints,
+ BOOL nowrite,
+ BOOL as_slm)
+{
+ LLSD mdl;
+
+ LLModel* model[] =
+ {
+ impostor,
+ low,
+ medium,
+ high,
+ physics
+ };
+
+ bool skinning = upload_skin && high && !high->mSkinWeights.empty();
+
+ if (skinning)
+ { //write skinning block
+ mdl["skin"] = high->mSkinInfo.asLLSD(upload_joints);
+ }
+
+ if (!decomp.mBaseHull.empty() ||
+ !decomp.mHull.empty())
+ {
+ mdl["physics_convex"] = decomp.asLLSD();
+ if (!decomp.mHull.empty() && !as_slm)
+ { //convex decomposition exists, physics mesh will not be used (unless this is an slm file)
+ model[LLModel::LOD_PHYSICS] = NULL;
+ }
+ }
+
+ if (as_slm)
+ { //save material list names
+ for (U32 i = 0; i < high->mMaterialList.size(); ++i)
+ {
+ mdl["material_list"][i] = high->mMaterialList[i];
+ }
+ }
+
+ for (U32 idx = 0; idx < MODEL_NAMES_LENGTH; ++idx)
+ {
+ if (model[idx] && model[idx]->getNumVolumeFaces() > 0)
+ {
+ LLVector3 min_pos = LLVector3(model[idx]->getVolumeFace(0).mPositions[0].getF32ptr());
+ LLVector3 max_pos = min_pos;
+
+ //find position domain
+ for (S32 i = 0; i < model[idx]->getNumVolumeFaces(); ++i)
+ { //for each face
+ const LLVolumeFace& face = model[idx]->getVolumeFace(i);
+ for (U32 j = 0; j < face.mNumVertices; ++j)
+ {
+ update_min_max(min_pos, max_pos, face.mPositions[j].getF32ptr());
+ }
+ }
+
+ LLVector3 pos_range = max_pos - min_pos;
+
+ for (S32 i = 0; i < model[idx]->getNumVolumeFaces(); ++i)
+ { //for each face
+ const LLVolumeFace& face = model[idx]->getVolumeFace(i);
+ if (face.mNumVertices < 3)
+ { //don't export an empty face
+ mdl[model_names[idx]][i]["NoGeometry"] = true;
+ continue;
+ }
+ LLSD::Binary verts(face.mNumVertices*3*2);
+ LLSD::Binary tc(face.mNumVertices*2*2);
+ LLSD::Binary normals(face.mNumVertices*3*2);
+ LLSD::Binary indices(face.mNumIndices*2);
+
+ U32 vert_idx = 0;
+ U32 norm_idx = 0;
+ U32 tc_idx = 0;
+
+ LLVector2* ftc = (LLVector2*) face.mTexCoords;
+ LLVector2 min_tc;
+ LLVector2 max_tc;
+
+ if (ftc)
+ {
+ min_tc = ftc[0];
+ max_tc = min_tc;
+
+ //get texture coordinate domain
+ for (U32 j = 0; j < face.mNumVertices; ++j)
+ {
+ update_min_max(min_tc, max_tc, ftc[j]);
+ }
+ }
+
+ LLVector2 tc_range = max_tc - min_tc;
+
+ for (U32 j = 0; j < face.mNumVertices; ++j)
+ { //for each vert
+
+ F32* pos = face.mPositions[j].getF32ptr();
+
+ //position
+ for (U32 k = 0; k < 3; ++k)
+ { //for each component
+ //convert to 16-bit normalized across domain
+ U16 val = (U16) (((pos[k]-min_pos.mV[k])/pos_range.mV[k])*65535);
+
+ U8* buff = (U8*) &val;
+ //write to binary buffer
+ verts[vert_idx++] = buff[0];
+ verts[vert_idx++] = buff[1];
+ }
+
+ if (face.mNormals)
+ { //normals
+ F32* norm = face.mNormals[j].getF32ptr();
+
+ for (U32 k = 0; k < 3; ++k)
+ { //for each component
+ //convert to 16-bit normalized
+ U16 val = (U16) ((norm[k]+1.f)*0.5f*65535);
+ U8* buff = (U8*) &val;
+
+ //write to binary buffer
+ normals[norm_idx++] = buff[0];
+ normals[norm_idx++] = buff[1];
+ }
+ }
+
+ F32* src_tc = (F32*) face.mTexCoords[j].mV;
+
+ //texcoord
+ if (face.mTexCoords)
+ {
+ for (U32 k = 0; k < 2; ++k)
+ { //for each component
+ //convert to 16-bit normalized
+ U16 val = (U16) ((src_tc[k]-min_tc.mV[k])/tc_range.mV[k]*65535);
+
+ U8* buff = (U8*) &val;
+ //write to binary buffer
+ tc[tc_idx++] = buff[0];
+ tc[tc_idx++] = buff[1];
+ }
+ }
+ }
+
+ U32 idx_idx = 0;
+ for (U32 j = 0; j < face.mNumIndices; ++j)
+ {
+ U8* buff = (U8*) &(face.mIndices[j]);
+ indices[idx_idx++] = buff[0];
+ indices[idx_idx++] = buff[1];
+ }
+
+ //write out face data
+ mdl[model_names[idx]][i]["PositionDomain"]["Min"] = min_pos.getValue();
+ mdl[model_names[idx]][i]["PositionDomain"]["Max"] = max_pos.getValue();
+ mdl[model_names[idx]][i]["Position"] = verts;
+
+ if (face.mNormals)
+ {
+ mdl[model_names[idx]][i]["Normal"] = normals;
+ }
+
+ if (face.mTexCoords)
+ {
+ mdl[model_names[idx]][i]["TexCoord0Domain"]["Min"] = min_tc.getValue();
+ mdl[model_names[idx]][i]["TexCoord0Domain"]["Max"] = max_tc.getValue();
+ mdl[model_names[idx]][i]["TexCoord0"] = tc;
+ }
+
+ mdl[model_names[idx]][i]["TriangleList"] = indices;
+
+ if (skinning)
+ {
+ //write out skin weights
+
+ //each influence list entry is up to 4 24-bit values
+ // first 8 bits is bone index
+ // last 16 bits is bone influence weight
+ // a bone index of 0xFF signifies no more influences for this vertex
+
+ std::stringstream ostr;
+
+ for (U32 j = 0; j < face.mNumVertices; ++j)
+ {
+ LLVector3 pos(face.mPositions[j].getF32ptr());
+
+ weight_list& weights = high->getJointInfluences(pos);
+
+ S32 count = 0;
+ for (weight_list::iterator iter = weights.begin(); iter != weights.end(); ++iter)
+ {
+ if (iter->mJointIdx < 255 && iter->mJointIdx >= 0)
+ {
+ U8 idx = (U8) iter->mJointIdx;
+ ostr.write((const char*) &idx, 1);
+
+ U16 influence = (U16) (iter->mWeight*65535);
+ ostr.write((const char*) &influence, 2);
+
+ ++count;
+ }
+ }
+ U8 end_list = 0xFF;
+ if (count < 4)
+ {
+ ostr.write((const char*) &end_list, 1);
+ }
+ }
+
+ //copy ostr to binary buffer
+ std::string data = ostr.str();
+ const U8* buff = (U8*) data.data();
+ U32 bytes = data.size();
+
+ LLSD::Binary w(bytes);
+ for (U32 j = 0; j < bytes; ++j)
+ {
+ w[j] = buff[j];
+ }
+
+ mdl[model_names[idx]][i]["Weights"] = w;
+ }
+ }
+ }
+ }
+
+ return writeModelToStream(ostr, mdl, nowrite, as_slm);
+}
+
+LLSD LLModel::writeModelToStream(std::ostream& ostr, LLSD& mdl, BOOL nowrite, BOOL as_slm)
+{
+ U32 bytes = 0;
+
+ std::string::size_type cur_offset = 0;
+
+ LLSD header;
+
+ if (as_slm && mdl.has("material_list"))
+ { //save material binding names to header
+ header["material_list"] = mdl["material_list"];
+ }
+
+ std::string skin;
+
+ if (mdl.has("skin"))
+ { //write out skin block
+ skin = zip_llsd(mdl["skin"]);
+
+ U32 size = skin.size();
+ if (size > 0)
+ {
+ header["skin"]["offset"] = (LLSD::Integer) cur_offset;
+ header["skin"]["size"] = (LLSD::Integer) size;
+ cur_offset += size;
+ bytes += size;
+ }
+ }
+
+ std::string decomposition;
+
+ if (mdl.has("physics_convex"))
+ { //write out convex decomposition
+ decomposition = zip_llsd(mdl["physics_convex"]);
+
+ U32 size = decomposition.size();
+ if (size > 0)
+ {
+ header["physics_convex"]["offset"] = (LLSD::Integer) cur_offset;
+ header["physics_convex"]["size"] = (LLSD::Integer) size;
+ cur_offset += size;
+ bytes += size;
+ }
+ }
+
+ std::string out[MODEL_NAMES_LENGTH];
+
+ for (S32 i = 0; i < MODEL_NAMES_LENGTH; i++)
+ {
+ if (mdl.has(model_names[i]))
+ {
+ out[i] = zip_llsd(mdl[model_names[i]]);
+
+ U32 size = out[i].size();
+
+ header[model_names[i]]["offset"] = (LLSD::Integer) cur_offset;
+ header[model_names[i]]["size"] = (LLSD::Integer) size;
+ cur_offset += size;
+ bytes += size;
+ }
+ }
+
+ if (!nowrite)
+ {
+ LLSDSerialize::toBinary(header, ostr);
+
+ if (!skin.empty())
+ { //write skin block
+ ostr.write((const char*) skin.data(), header["skin"]["size"].asInteger());
+ }
+
+ if (!decomposition.empty())
+ { //write decomposition block
+ ostr.write((const char*) decomposition.data(), header["physics_convex"]["size"].asInteger());
+ }
+
+ for (S32 i = 0; i < MODEL_NAMES_LENGTH; i++)
+ {
+ if (!out[i].empty())
+ {
+ ostr.write((const char*) out[i].data(), header[model_names[i]]["size"].asInteger());
+ }
+ }
+ }
+
+ return header;
+}
+
+LLModel::weight_list& LLModel::getJointInfluences(const LLVector3& pos)
+{
+ //1. If a vertex has been weighted then we'll find it via pos and return it's weight list
+ weight_map::iterator iterPos = mSkinWeights.begin();
+ weight_map::iterator iterEnd = mSkinWeights.end();
+
+ for ( ; iterPos!=iterEnd; ++iterPos )
+ {
+ if ( jointPositionalLookup( iterPos->first, pos ) )
+ {
+ return iterPos->second;
+ }
+ }
+
+ //2. Otherwise we'll use the older implementation
+ weight_map::iterator iter = mSkinWeights.find(pos);
+
+ if (iter != mSkinWeights.end())
+ {
+ if ((iter->first - pos).magVec() > 0.1f)
+ {
+ llerrs << "Couldn't find weight list." << llendl;
+ }
+
+ return iter->second;
+ }
+ else
+ { //no exact match found, get closest point
+ const F32 epsilon = 1e-5f;
+ weight_map::iterator iter_up = mSkinWeights.lower_bound(pos);
+ weight_map::iterator iter_down = ++iter_up;
+
+ weight_map::iterator best = iter_up;
+
+ F32 min_dist = (iter->first - pos).magVec();
+
+ bool done = false;
+ while (!done)
+ { //search up and down mSkinWeights from lower bound of pos until a
+ //match is found within epsilon. If no match is found within epsilon,
+ //return closest match
+ done = true;
+ if (iter_up != mSkinWeights.end() && ++iter_up != mSkinWeights.end())
+ {
+ done = false;
+ F32 dist = (iter_up->first - pos).magVec();
+
+ if (dist < epsilon)
+ {
+ return iter_up->second;
+ }
+
+ if (dist < min_dist)
+ {
+ best = iter_up;
+ min_dist = dist;
+ }
+ }
+
+ if (iter_down != mSkinWeights.begin() && --iter_down != mSkinWeights.begin())
+ {
+ done = false;
+
+ F32 dist = (iter_down->first - pos).magVec();
+
+ if (dist < epsilon)
+ {
+ return iter_down->second;
+ }
+
+ if (dist < min_dist)
+ {
+ best = iter_down;
+ min_dist = dist;
+ }
+
+ }
+ }
+
+ return best->second;
+ }
+}
+
+void LLModel::setConvexHullDecomposition(
+ const LLModel::convex_hull_decomposition& decomp)
+{
+ mPhysics.mHull = decomp;
+ mPhysics.mMesh.clear();
+ updateHullCenters();
+}
+
+void LLModel::updateHullCenters()
+{
+ mHullCenter.resize(mPhysics.mHull.size());
+ mHullPoints = 0;
+ mCenterOfHullCenters.clear();
+
+ for (U32 i = 0; i < mPhysics.mHull.size(); ++i)
+ {
+ LLVector3 cur_center;
+
+ for (U32 j = 0; j < mPhysics.mHull[i].size(); ++j)
+ {
+ cur_center += mPhysics.mHull[i][j];
+ }
+ mCenterOfHullCenters += cur_center;
+ cur_center *= 1.f/mPhysics.mHull[i].size();
+ mHullCenter[i] = cur_center;
+ mHullPoints += mPhysics.mHull[i].size();
+ }
+
+ if (mHullPoints > 0)
+ {
+ mCenterOfHullCenters *= 1.f / mHullPoints;
+ llassert(mPhysics.hasHullList());
+ }
+}
+
+bool LLModel::loadModel(std::istream& is)
+{
+ mSculptLevel = -1; // default is an error occured
+
+ LLSD header;
+ {
+ if (!LLSDSerialize::fromBinary(header, is, 1024*1024*1024))
+ {
+ llwarns << "Mesh header parse error. Not a valid mesh asset!" << llendl;
+ return false;
+ }
+ }
+
+ if (header.has("material_list"))
+ { //load material list names
+ mMaterialList.clear();
+ for (U32 i = 0; i < header["material_list"].size(); ++i)
+ {
+ mMaterialList.push_back(header["material_list"][i].asString());
+ }
+ }
+
+ std::string nm[] =
+ {
+ "lowest_lod",
+ "low_lod",
+ "medium_lod",
+ "high_lod",
+ "physics_mesh",
+ };
+
+ const S32 MODEL_LODS = 5;
+
+ S32 lod = llclamp((S32) mDetail, 0, MODEL_LODS);
+
+ if (header[nm[lod]]["offset"].asInteger() == -1 ||
+ header[nm[lod]]["size"].asInteger() == 0 )
+ { //cannot load requested LOD
+ llwarns << "LoD data is invalid!" << llendl;
+ return false;
+ }
+
+ bool has_skin = header["skin"]["offset"].asInteger() >=0 &&
+ header["skin"]["size"].asInteger() > 0;
+
+ if (lod == LLModel::LOD_HIGH)
+ { //try to load skin info and decomp info
+ std::ios::pos_type cur_pos = is.tellg();
+ loadSkinInfo(header, is);
+ is.seekg(cur_pos);
+ }
+
+ if (lod == LLModel::LOD_HIGH || lod == LLModel::LOD_PHYSICS)
+ {
+ std::ios::pos_type cur_pos = is.tellg();
+ loadDecomposition(header, is);
+ is.seekg(cur_pos);
+ }
+
+ is.seekg(header[nm[lod]]["offset"].asInteger(), std::ios_base::cur);
+
+ if (unpackVolumeFaces(is, header[nm[lod]]["size"].asInteger()))
+ {
+ if (has_skin)
+ {
+ //build out mSkinWeight from face info
+ for (S32 i = 0; i < getNumVolumeFaces(); ++i)
+ {
+ const LLVolumeFace& face = getVolumeFace(i);
+
+ if (face.mWeights)
+ {
+ for (S32 j = 0; j < face.mNumVertices; ++j)
+ {
+ LLVector4a& w = face.mWeights[j];
+
+ std::vector<JointWeight> wght;
+
+ for (S32 k = 0; k < 4; ++k)
+ {
+ S32 idx = (S32) w[k];
+ F32 f = w[k] - idx;
+ if (f > 0.f)
+ {
+ wght.push_back(JointWeight(idx, f));
+ }
+ }
+
+ if (!wght.empty())
+ {
+ LLVector3 pos(face.mPositions[j].getF32ptr());
+ mSkinWeights[pos] = wght;
+ }
+ }
+ }
+ }
+ }
+ return true;
+ }
+ else
+ {
+ llwarns << "unpackVolumeFaces failed!" << llendl;
+ }
+
+ return false;
+
+}
+
+bool LLModel::isMaterialListSubset( LLModel* ref )
+{
+ int refCnt = ref->mMaterialList.size();
+ int modelCnt = mMaterialList.size();
+
+ for (U32 src = 0; src < modelCnt; ++src)
+ {
+ bool foundRef = false;
+
+ for (U32 dst = 0; dst < refCnt; ++dst)
+ {
+ //llinfos<<mMaterialList[src]<<" "<<ref->mMaterialList[dst]<<llendl;
+ foundRef = mMaterialList[src] == ref->mMaterialList[dst];
+
+ if ( foundRef )
+ {
+ break;
+ }
+ }
+ if (!foundRef)
+ {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+bool LLModel::needToAddFaces( LLModel* ref, int& refFaceCnt, int& modelFaceCnt )
+{
+ bool changed = false;
+ if ( refFaceCnt< modelFaceCnt )
+ {
+ refFaceCnt += modelFaceCnt - refFaceCnt;
+ changed = true;
+ }
+ else
+ if ( modelFaceCnt < refFaceCnt )
+ {
+ modelFaceCnt += refFaceCnt - modelFaceCnt;
+ changed = true;
+ }
+
+ return changed;
+}
+
+bool LLModel::matchMaterialOrder(LLModel* ref, int& refFaceCnt, int& modelFaceCnt )
+{
+ //Is this a subset?
+ //LODs cannot currently add new materials, e.g.
+ //1. ref = a,b,c lod1 = d,e => This is not permitted
+ //2. ref = a,b,c lod1 = c => This would be permitted
+
+ bool isASubset = isMaterialListSubset( ref );
+ if ( !isASubset )
+ {
+ llinfos<<"Material of model is not a subset of reference."<<llendl;
+ return false;
+ }
+
+ std::map<std::string, U32> index_map;
+
+ //build a map of material slot names to face indexes
+ bool reorder = false;
+
+ std::set<std::string> base_mat;
+ std::set<std::string> cur_mat;
+
+ for (U32 i = 0; i < mMaterialList.size(); i++)
+ {
+ index_map[ref->mMaterialList[i]] = i;
+ if (!reorder)
+ { //if any material name does not match reference, we need to reorder
+ reorder = ref->mMaterialList[i] != mMaterialList[i];
+ }
+ base_mat.insert(ref->mMaterialList[i]);
+ cur_mat.insert(mMaterialList[i]);
+ }
+
+
+ if (reorder &&
+ base_mat == cur_mat) //don't reorder if material name sets don't match
+ {
+ std::vector<LLVolumeFace> new_face_list;
+ new_face_list.resize(mVolumeFaces.size());
+
+ std::vector<std::string> new_material_list;
+ new_material_list.resize(mVolumeFaces.size());
+
+ //rebuild face list so materials have the same order
+ //as the reference model
+ for (U32 i = 0; i < mMaterialList.size(); ++i)
+ {
+ U32 ref_idx = index_map[mMaterialList[i]];
+ new_face_list[ref_idx] = mVolumeFaces[i];
+
+ new_material_list[ref_idx] = mMaterialList[i];
+ }
+
+ llassert(new_material_list == ref->mMaterialList);
+
+ mVolumeFaces = new_face_list;
+ }
+
+ //override material list with reference model ordering
+ mMaterialList = ref->mMaterialList;
+ return true;
+}
+
+
+bool LLModel::loadSkinInfo(LLSD& header, std::istream &is)
+{
+ S32 offset = header["skin"]["offset"].asInteger();
+ S32 size = header["skin"]["size"].asInteger();
+
+ if (offset >= 0 && size > 0)
+ {
+ is.seekg(offset, std::ios_base::cur);
+
+ LLSD skin_data;
+
+ if (unzip_llsd(skin_data, is, size))
+ {
+ mSkinInfo.fromLLSD(skin_data);
+ return true;
+ }
+ }
+
+ return false;
+}
+
+bool LLModel::loadDecomposition(LLSD& header, std::istream& is)
+{
+ S32 offset = header["physics_convex"]["offset"].asInteger();
+ S32 size = header["physics_convex"]["size"].asInteger();
+
+ if (offset >= 0 && size > 0)
+ {
+ is.seekg(offset, std::ios_base::cur);
+
+ LLSD data;
+
+ if (unzip_llsd(data, is, size))
+ {
+ mPhysics.fromLLSD(data);
+ updateHullCenters();
+ }
+ }
+
+ return true;
+}
+
+
+LLMeshSkinInfo::LLMeshSkinInfo(LLSD& skin)
+{
+ fromLLSD(skin);
+}
+
+void LLMeshSkinInfo::fromLLSD(LLSD& skin)
+{
+ if (skin.has("joint_names"))
+ {
+ for (U32 i = 0; i < skin["joint_names"].size(); ++i)
+ {
+ mJointNames.push_back(skin["joint_names"][i]);
+ }
+ }
+
+ if (skin.has("inverse_bind_matrix"))
+ {
+ for (U32 i = 0; i < skin["inverse_bind_matrix"].size(); ++i)
+ {
+ LLMatrix4 mat;
+ for (U32 j = 0; j < 4; j++)
+ {
+ for (U32 k = 0; k < 4; k++)
+ {
+ mat.mMatrix[j][k] = skin["inverse_bind_matrix"][i][j*4+k].asReal();
+ }
+ }
+
+ mInvBindMatrix.push_back(mat);
+ }
+ }
+
+ if (skin.has("bind_shape_matrix"))
+ {
+ for (U32 j = 0; j < 4; j++)
+ {
+ for (U32 k = 0; k < 4; k++)
+ {
+ mBindShapeMatrix.mMatrix[j][k] = skin["bind_shape_matrix"][j*4+k].asReal();
+ }
+ }
+ }
+
+ if (skin.has("alt_inverse_bind_matrix"))
+ {
+ for (U32 i = 0; i < skin["alt_inverse_bind_matrix"].size(); ++i)
+ {
+ LLMatrix4 mat;
+ for (U32 j = 0; j < 4; j++)
+ {
+ for (U32 k = 0; k < 4; k++)
+ {
+ mat.mMatrix[j][k] = skin["alt_inverse_bind_matrix"][i][j*4+k].asReal();
+ }
+ }
+
+ mAlternateBindMatrix.push_back(mat);
+ }
+ }
+
+ if (skin.has("pelvis_offset"))
+ {
+ mPelvisOffset = skin["pelvis_offset"].asReal();
+ }
+}
+
+LLSD LLMeshSkinInfo::asLLSD(bool include_joints) const
+{
+ LLSD ret;
+
+ for (U32 i = 0; i < mJointNames.size(); ++i)
+ {
+ ret["joint_names"][i] = mJointNames[i];
+
+ for (U32 j = 0; j < 4; j++)
+ {
+ for (U32 k = 0; k < 4; k++)
+ {
+ ret["inverse_bind_matrix"][i][j*4+k] = mInvBindMatrix[i].mMatrix[j][k];
+ }
+ }
+ }
+
+ for (U32 i = 0; i < 4; i++)
+ {
+ for (U32 j = 0; j < 4; j++)
+ {
+ ret["bind_shape_matrix"][i*4+j] = mBindShapeMatrix.mMatrix[i][j];
+ }
+ }
+
+ if ( include_joints && mAlternateBindMatrix.size() > 0 )
+ {
+ for (U32 i = 0; i < mJointNames.size(); ++i)
+ {
+ for (U32 j = 0; j < 4; j++)
+ {
+ for (U32 k = 0; k < 4; k++)
+ {
+ ret["alt_inverse_bind_matrix"][i][j*4+k] = mAlternateBindMatrix[i].mMatrix[j][k];
+ }
+ }
+ }
+
+ ret["pelvis_offset"] = mPelvisOffset;
+ }
+
+ return ret;
+}
+
+LLModel::Decomposition::Decomposition(LLSD& data)
+{
+ fromLLSD(data);
+}
+
+void LLModel::Decomposition::fromLLSD(LLSD& decomp)
+{
+ if (decomp.has("HullList") && decomp.has("Positions"))
+ {
+ // updated for const-correctness. gcc is picky about this type of thing - Nyx
+ const LLSD::Binary& hulls = decomp["HullList"].asBinary();
+ const LLSD::Binary& position = decomp["Positions"].asBinary();
+
+ U16* p = (U16*) &position[0];
+
+ mHull.resize(hulls.size());
+
+ LLVector3 min;
+ LLVector3 max;
+ LLVector3 range;
+
+ if (decomp.has("Min"))
+ {
+ min.setValue(decomp["Min"]);
+ max.setValue(decomp["Max"]);
+ }
+ else
+ {
+ min.set(-0.5f, -0.5f, -0.5f);
+ max.set(0.5f, 0.5f, 0.5f);
+ }
+
+ range = max-min;
+
+ for (U32 i = 0; i < hulls.size(); ++i)
+ {
+ U16 count = (hulls[i] == 0) ? 256 : hulls[i];
+
+ std::set<U64> valid;
+
+ //must have at least 4 points
+ //llassert(count > 3);
+
+ for (U32 j = 0; j < count; ++j)
+ {
+ U64 test = (U64) p[0] | ((U64) p[1] << 16) | ((U64) p[2] << 32);
+ //point must be unique
+ //llassert(valid.find(test) == valid.end());
+ valid.insert(test);
+
+ mHull[i].push_back(LLVector3(
+ (F32) p[0]/65535.f*range.mV[0]+min.mV[0],
+ (F32) p[1]/65535.f*range.mV[1]+min.mV[1],
+ (F32) p[2]/65535.f*range.mV[2]+min.mV[2]));
+ p += 3;
+
+
+ }
+
+ //each hull must contain at least 4 unique points
+ //llassert(valid.size() > 3);
+ }
+ }
+
+ if (decomp.has("BoundingVerts"))
+ {
+ const LLSD::Binary& position = decomp["BoundingVerts"].asBinary();
+
+ U16* p = (U16*) &position[0];
+
+ LLVector3 min;
+ LLVector3 max;
+ LLVector3 range;
+
+ if (decomp.has("Min"))
+ {
+ min.setValue(decomp["Min"]);
+ max.setValue(decomp["Max"]);
+ }
+ else
+ {
+ min.set(-0.5f, -0.5f, -0.5f);
+ max.set(0.5f, 0.5f, 0.5f);
+ }
+
+ range = max-min;
+
+ U16 count = position.size()/6;
+
+ for (U32 j = 0; j < count; ++j)
+ {
+ mBaseHull.push_back(LLVector3(
+ (F32) p[0]/65535.f*range.mV[0]+min.mV[0],
+ (F32) p[1]/65535.f*range.mV[1]+min.mV[1],
+ (F32) p[2]/65535.f*range.mV[2]+min.mV[2]));
+ p += 3;
+ }
+ }
+ else
+ {
+ //empty base hull mesh to indicate decomposition has been loaded
+ //but contains no base hull
+ mBaseHullMesh.clear();
+ }
+}
+
+bool LLModel::Decomposition::hasHullList() const
+{
+ return !mHull.empty() ;
+}
+
+LLSD LLModel::Decomposition::asLLSD() const
+{
+ LLSD ret;
+
+ if (mBaseHull.empty() && mHull.empty())
+ { //nothing to write
+ return ret;
+ }
+
+ //write decomposition block
+ // ["physics_convex"]["HullList"] -- list of 8 bit integers, each entry represents a hull with specified number of points
+ // ["physics_convex"]["Position"] -- list of 16-bit integers to be decoded to given domain, encoded 3D points
+ // ["physics_convex"]["BoundingVerts"] -- list of 16-bit integers to be decoded to given domain, encoded 3D points representing a single hull approximation of given shape
+
+ //get minimum and maximum
+ LLVector3 min;
+
+ if (mHull.empty())
+ {
+ min = mBaseHull[0];
+ }
+ else
+ {
+ min = mHull[0][0];
+ }
+
+ LLVector3 max = min;
+
+ LLSD::Binary hulls(mHull.size());
+
+ U32 total = 0;
+
+ for (U32 i = 0; i < mHull.size(); ++i)
+ {
+ U32 size = mHull[i].size();
+ total += size;
+ hulls[i] = (U8) (size);
+
+ for (U32 j = 0; j < mHull[i].size(); ++j)
+ {
+ update_min_max(min, max, mHull[i][j]);
+ }
+ }
+
+ for (U32 i = 0; i < mBaseHull.size(); ++i)
+ {
+ update_min_max(min, max, mBaseHull[i]);
+ }
+
+ ret["Min"] = min.getValue();
+ ret["Max"] = max.getValue();
+
+ LLVector3 range = max-min;
+
+ if (!hulls.empty())
+ {
+ ret["HullList"] = hulls;
+ }
+
+ if (total > 0)
+ {
+ LLSD::Binary p(total*3*2);
+
+ U32 vert_idx = 0;
+
+ for (U32 i = 0; i < mHull.size(); ++i)
+ {
+ std::set<U64> valid;
+
+ llassert(!mHull[i].empty());
+
+ for (U32 j = 0; j < mHull[i].size(); ++j)
+ {
+ U64 test = 0;
+ const F32* src = mHull[i][j].mV;
+
+ for (U32 k = 0; k < 3; k++)
+ {
+ //convert to 16-bit normalized across domain
+ U16 val = (U16) (((src[k]-min.mV[k])/range.mV[k])*65535);
+
+ if(valid.size() < 3)
+ {
+ switch (k)
+ {
+ case 0: test = test | (U64) val; break;
+ case 1: test = test | ((U64) val << 16); break;
+ case 2: test = test | ((U64) val << 32); break;
+ };
+
+ valid.insert(test);
+ }
+
+ U8* buff = (U8*) &val;
+ //write to binary buffer
+ p[vert_idx++] = buff[0];
+ p[vert_idx++] = buff[1];
+
+ //makes sure we haven't run off the end of the array
+ llassert(vert_idx <= p.size());
+ }
+ }
+
+ //must have at least 3 unique points
+ llassert(valid.size() > 2);
+ }
+
+ ret["Positions"] = p;
+ }
+
+ //llassert(!mBaseHull.empty());
+
+ if (!mBaseHull.empty())
+ {
+ LLSD::Binary p(mBaseHull.size()*3*2);
+
+ U32 vert_idx = 0;
+ for (U32 j = 0; j < mBaseHull.size(); ++j)
+ {
+ const F32* v = mBaseHull[j].mV;
+
+ for (U32 k = 0; k < 3; k++)
+ {
+ //convert to 16-bit normalized across domain
+ U16 val = (U16) (((v[k]-min.mV[k])/range.mV[k])*65535);
+
+ U8* buff = (U8*) &val;
+ //write to binary buffer
+ p[vert_idx++] = buff[0];
+ p[vert_idx++] = buff[1];
+
+ if (vert_idx > p.size())
+ {
+ llerrs << "Index out of bounds" << llendl;
+ }
+ }
+ }
+
+ ret["BoundingVerts"] = p;
+ }
+
+ return ret;
+}
+
+void LLModel::Decomposition::merge(const LLModel::Decomposition* rhs)
+{
+ if (!rhs)
+ {
+ return;
+ }
+
+ if (mMeshID != rhs->mMeshID)
+ {
+ llerrs << "Attempted to merge with decomposition of some other mesh." << llendl;
+ }
+
+ if (mBaseHull.empty())
+ { //take base hull and decomposition from rhs
+ mHull = rhs->mHull;
+ mBaseHull = rhs->mBaseHull;
+ mMesh = rhs->mMesh;
+ mBaseHullMesh = rhs->mBaseHullMesh;
+ }
+
+ if (mPhysicsShapeMesh.empty())
+ { //take physics shape mesh from rhs
+ mPhysicsShapeMesh = rhs->mPhysicsShapeMesh;
+ }
+}
+
diff --git a/indra/llprimitive/llmodel.h b/indra/llprimitive/llmodel.h
new file mode 100644
index 0000000000..1cf528fd9f
--- /dev/null
+++ b/indra/llprimitive/llmodel.h
@@ -0,0 +1,281 @@
+/**
+ * @file llmodel.h
+ * @brief Model handling class definitions
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLMODEL_H
+#define LL_LLMODEL_H
+
+#include "llpointer.h"
+#include "llvolume.h"
+#include "v4math.h"
+#include "m4math.h"
+
+class daeElement;
+class domMesh;
+
+#define MAX_MODEL_FACES 8
+
+
+class LLMeshSkinInfo
+{
+public:
+ LLUUID mMeshID;
+ std::vector<std::string> mJointNames;
+ std::vector<LLMatrix4> mInvBindMatrix;
+ std::vector<LLMatrix4> mAlternateBindMatrix;
+ std::map<std::string, U32> mJointMap;
+
+ LLMeshSkinInfo() { }
+ LLMeshSkinInfo(LLSD& data);
+ void fromLLSD(LLSD& data);
+ LLSD asLLSD(bool include_joints) const;
+ LLMatrix4 mBindShapeMatrix;
+ float mPelvisOffset;
+};
+
+class LLModel : public LLVolume
+{
+public:
+
+ enum
+ {
+ LOD_IMPOSTOR = 0,
+ LOD_LOW,
+ LOD_MEDIUM,
+ LOD_HIGH,
+ LOD_PHYSICS,
+ NUM_LODS
+ };
+
+ enum EModelStatus
+ {
+ NO_ERRORS = 0,
+ VERTEX_NUMBER_OVERFLOW, //vertex number is >= 65535.
+ BAD_ELEMENT,
+ INVALID_STATUS
+ } ;
+
+ //convex_hull_decomposition is a vector of convex hulls
+ //each convex hull is a set of points
+ typedef std::vector<std::vector<LLVector3> > convex_hull_decomposition;
+ typedef std::vector<LLVector3> hull;
+
+ class PhysicsMesh
+ {
+ public:
+ std::vector<LLVector3> mPositions;
+ std::vector<LLVector3> mNormals;
+
+ void clear()
+ {
+ mPositions.clear();
+ mNormals.clear();
+ }
+
+ bool empty() const
+ {
+ return mPositions.empty();
+ }
+ };
+
+ class Decomposition
+ {
+ public:
+ Decomposition() { }
+ Decomposition(LLSD& data);
+ void fromLLSD(LLSD& data);
+ LLSD asLLSD() const;
+ bool hasHullList() const;
+
+ void merge(const Decomposition* rhs);
+
+ LLUUID mMeshID;
+ LLModel::convex_hull_decomposition mHull;
+ LLModel::hull mBaseHull;
+
+ std::vector<LLModel::PhysicsMesh> mMesh;
+ LLModel::PhysicsMesh mBaseHullMesh;
+ LLModel::PhysicsMesh mPhysicsShapeMesh;
+ };
+
+ LLModel(LLVolumeParams& params, F32 detail);
+ ~LLModel();
+
+ bool loadModel(std::istream& is);
+ bool loadSkinInfo(LLSD& header, std::istream& is);
+ bool loadDecomposition(LLSD& header, std::istream& is);
+
+ static LLSD writeModel(
+ std::ostream& ostr,
+ LLModel* physics,
+ LLModel* high,
+ LLModel* medium,
+ LLModel* low,
+ LLModel* imposotr,
+ const LLModel::Decomposition& decomp,
+ BOOL upload_skin,
+ BOOL upload_joints,
+ BOOL nowrite = FALSE,
+ BOOL as_slm = FALSE);
+
+ static LLSD writeModelToStream(
+ std::ostream& ostr,
+ LLSD& mdl,
+ BOOL nowrite = FALSE, BOOL as_slm = FALSE);
+
+ static LLModel* loadModelFromDomMesh(domMesh* mesh);
+ static std::string getElementLabel(daeElement* element);
+ std::string getName() const;
+ std::string getMetric() const {return mMetric;}
+ EModelStatus getStatus() const {return mStatus;}
+ static std::string getStatusString(U32 status) ;
+
+ void appendFaces(LLModel* model, LLMatrix4& transform, LLMatrix4& normal_transform);
+ void appendFace(const LLVolumeFace& src_face, std::string src_material, LLMatrix4& mat, LLMatrix4& norm_mat);
+
+ void setNumVolumeFaces(S32 count);
+ void setVolumeFaceData(
+ S32 f,
+ LLStrider<LLVector3> pos,
+ LLStrider<LLVector3> norm,
+ LLStrider<LLVector2> tc,
+ LLStrider<U16> ind,
+ U32 num_verts,
+ U32 num_indices);
+
+ void generateNormals(F32 angle_cutoff);
+
+ void addFace(const LLVolumeFace& face);
+
+ void normalizeVolumeFaces();
+ void optimizeVolumeFaces();
+ void offsetMesh( const LLVector3& pivotPoint );
+ void getNormalizedScaleTranslation(LLVector3& scale_out, LLVector3& translation_out);
+
+ //reorder face list based on mMaterialList in this and reference so
+ //order matches that of reference (material ordering touchup)
+ bool matchMaterialOrder(LLModel* ref, int& refFaceCnt, int& modelFaceCnt );
+ bool isMaterialListSubset( LLModel* ref );
+ bool needToAddFaces( LLModel* ref, int& refFaceCnt, int& modelFaceCnt );
+
+ std::vector<std::string> mMaterialList;
+
+ //data used for skin weights
+ class JointWeight
+ {
+ public:
+ S32 mJointIdx;
+ F32 mWeight;
+
+ JointWeight()
+ {
+ mJointIdx = 0;
+ mWeight = 0.f;
+ }
+
+ JointWeight(S32 idx, F32 weight)
+ : mJointIdx(idx), mWeight(weight)
+ {
+ }
+
+ bool operator<(const JointWeight& rhs) const
+ {
+ if (mWeight == rhs.mWeight)
+ {
+ return mJointIdx < rhs.mJointIdx;
+ }
+
+ return mWeight < rhs.mWeight;
+ }
+
+ };
+
+ struct CompareWeightGreater
+ {
+ bool operator()(const JointWeight& lhs, const JointWeight& rhs)
+ {
+ return rhs < lhs; // strongest = first
+ }
+ };
+
+
+ //Are the doubles the same w/in epsilon specified tolerance
+ bool areEqual( double a, double b )
+ {
+ const float epsilon = 1e-5f;
+ return (fabs((a - b)) < epsilon) ? true : false ;
+ }
+ //Make sure that we return false for any values that are within the tolerance for equivalence
+ bool jointPositionalLookup( const LLVector3& a, const LLVector3& b )
+ {
+ return ( areEqual( a[0],b[0]) && areEqual( a[1],b[1] ) && areEqual( a[2],b[2]) ) ? true : false;
+ }
+
+ //copy of position array for this model -- mPosition[idx].mV[X,Y,Z]
+ std::vector<LLVector3> mPosition;
+
+ //map of positions to skin weights --- mSkinWeights[pos].mV[0..4] == <joint_index>.<weight>
+ //joint_index corresponds to mJointList
+ typedef std::vector<JointWeight> weight_list;
+ typedef std::map<LLVector3, weight_list > weight_map;
+ weight_map mSkinWeights;
+
+ //get list of weight influences closest to given position
+ weight_list& getJointInfluences(const LLVector3& pos);
+
+ LLMeshSkinInfo mSkinInfo;
+
+ std::string mRequestedLabel; // name requested in UI, if any.
+ std::string mLabel; // name computed from dae.
+
+ std::string mMetric; // user-supplied metric data for upload
+
+ LLVector3 mNormalizedScale;
+ LLVector3 mNormalizedTranslation;
+
+ float mPelvisOffset;
+ // convex hull decomposition
+ S32 mDecompID;
+
+ void setConvexHullDecomposition(
+ const convex_hull_decomposition& decomp);
+ void updateHullCenters();
+
+ LLVector3 mCenterOfHullCenters;
+ std::vector<LLVector3> mHullCenter;
+ U32 mHullPoints;
+
+ //ID for storing this model in a .slm file
+ S32 mLocalID;
+
+ Decomposition mPhysics;
+
+ EModelStatus mStatus ;
+protected:
+ void addVolumeFacesFromDomMesh(domMesh* mesh);
+ virtual BOOL createVolumeFacesFromDomMesh(domMesh *mesh);
+};
+
+#endif //LL_LLMODEL_H
diff --git a/indra/llprimitive/llprimitive.cpp b/indra/llprimitive/llprimitive.cpp
index 258c0c3c15..30532247ac 100644
--- a/indra/llprimitive/llprimitive.cpp
+++ b/indra/llprimitive/llprimitive.cpp
@@ -738,7 +738,11 @@ BOOL LLPrimitive::setVolume(const LLVolumeParams &volume_params, const S32 detai
setNumTEs(mVolumep->getNumFaces());
return TRUE;
}
-
+
+#if 0
+ // #if 0'd out by davep
+ // this is a lot of cruft to set texture entry values that just stay the same for LOD switch
+ // or immediately get overridden by an object update message, also crashes occasionally
U32 old_face_mask = mVolumep->mFaceMask;
S32 face_bit = 0;
@@ -936,6 +940,13 @@ BOOL LLPrimitive::setVolume(const LLVolumeParams &volume_params, const S32 detai
setTE(te_num, *(old_tes.getTexture(face_mapping[face_bit])));
}
}
+#else
+ // build the new object
+ sVolumeManager->unrefVolume(mVolumep);
+ mVolumep = volumep;
+
+ setNumTEs(mVolumep->getNumFaces());
+#endif
return TRUE;
}
@@ -1078,7 +1089,7 @@ BOOL LLPrimitive::packTEMessage(LLMessageSystem *mesgsys) const
U8 packed_buffer[MAX_TE_BUFFER];
U8 *cur_ptr = packed_buffer;
- S32 last_face_index = getNumTEs() - 1;
+ S32 last_face_index = llmin((U32) getNumTEs(), MAX_TES) - 1;
if (last_face_index > -1)
{
@@ -1216,12 +1227,12 @@ BOOL LLPrimitive::packTEMessage(LLDataPacker &dp) const
return FALSE;
}
-S32 LLPrimitive::unpackTEMessage(LLMessageSystem *mesgsys, char *block_name)
+S32 LLPrimitive::unpackTEMessage(LLMessageSystem* mesgsys, char const* block_name)
{
return(unpackTEMessage(mesgsys,block_name,-1));
}
-S32 LLPrimitive::unpackTEMessage(LLMessageSystem *mesgsys, char *block_name, const S32 block_num)
+S32 LLPrimitive::unpackTEMessage(LLMessageSystem* mesgsys, char const* block_name, const S32 block_num)
{
// use a negative block_num to indicate a single-block read (a non-variable block)
S32 retval = 0;
@@ -1359,7 +1370,7 @@ S32 LLPrimitive::unpackTEMessage(LLDataPacker &dp)
return retval;
}
- face_count = getNumTEs();
+ face_count = llmin((U32) getNumTEs(), MAX_TES);
U32 i;
cur_ptr += unpackTEField(cur_ptr, packed_buffer+size, (U8 *)image_data, 16, face_count, MVT_LLUUID);
diff --git a/indra/llprimitive/llprimitive.h b/indra/llprimitive/llprimitive.h
index f535fb1672..998016f8f6 100644
--- a/indra/llprimitive/llprimitive.h
+++ b/indra/llprimitive/llprimitive.h
@@ -103,6 +103,8 @@ public:
PARAMS_LIGHT = 0x20,
PARAMS_SCULPT = 0x30,
PARAMS_LIGHT_IMAGE = 0x40,
+ PARAMS_RESERVED = 0x50, // Used on server-side
+ PARAMS_MESH = 0x60,
};
public:
@@ -323,7 +325,7 @@ public:
const LLVolume *getVolumeConst() const { return mVolumep; } // HACK for Windoze confusion about ostream operator in LLVolume
LLVolume *getVolume() const { return mVolumep; }
virtual BOOL setVolume(const LLVolumeParams &volume_params, const S32 detail, bool unique_volume = false);
-
+
// Modify texture entry properties
inline BOOL validTE(const U8 te_num) const;
LLTextureEntry* getTE(const U8 te_num) const;
@@ -358,8 +360,8 @@ public:
S32 unpackTEField(U8 *cur_ptr, U8 *buffer_end, U8 *data_ptr, U8 data_size, U8 face_count, EMsgVariableType type);
BOOL packTEMessage(LLMessageSystem *mesgsys) const;
BOOL packTEMessage(LLDataPacker &dp) const;
- S32 unpackTEMessage(LLMessageSystem *mesgsys, char *block_name);
- S32 unpackTEMessage(LLMessageSystem *mesgsys, char *block_name, const S32 block_num); // Variable num of blocks
+ S32 unpackTEMessage(LLMessageSystem* mesgsys, char const* block_name);
+ S32 unpackTEMessage(LLMessageSystem* mesgsys, char const* block_name, const S32 block_num); // Variable num of blocks
BOOL unpackTEMessage(LLDataPacker &dp);
#ifdef CHECK_FOR_FINITE
@@ -444,6 +446,7 @@ protected:
U8 mNumTEs; // # of faces on the primitve
U32 mMiscFlags; // home for misc bools
+public:
static LLVolumeMgr* sVolumeManager;
};
diff --git a/indra/llprimitive/lltextureanim.cpp b/indra/llprimitive/lltextureanim.cpp
index 398af4e6e8..185a3f69c0 100644
--- a/indra/llprimitive/lltextureanim.cpp
+++ b/indra/llprimitive/lltextureanim.cpp
@@ -168,8 +168,8 @@ void LLTextureAnim::unpackTAMessage(LLDataPacker &dp)
mMode = data[0];
mFace = data[1];
- mSizeX = llmax((U8)1, data[2]);
- mSizeY = llmax((U8)1, data[3]);
+ mSizeX = data[2];
+ mSizeY = data[3];
htonmemcpy(&mStart, data + 4, MVT_F32, sizeof(F32));
htonmemcpy(&mLength, data + 8, MVT_F32, sizeof(F32));
htonmemcpy(&mRate, data + 12, MVT_F32, sizeof(F32));
diff --git a/indra/llprimitive/lltextureentry.cpp b/indra/llprimitive/lltextureentry.cpp
index 3c1d031ff5..34eff17519 100644
--- a/indra/llprimitive/lltextureentry.cpp
+++ b/indra/llprimitive/lltextureentry.cpp
@@ -403,7 +403,7 @@ S32 LLTextureEntry::setOffsetT(F32 t)
S32 LLTextureEntry::setRotation(F32 theta)
{
- if (mRotation != theta)
+ if (mRotation != theta && llfinite(theta))
{
mRotation = theta;
return TEM_CHANGE_TEXTURE;
@@ -423,24 +423,10 @@ S32 LLTextureEntry::setBumpShinyFullbright(U8 bump)
S32 LLTextureEntry::setMediaTexGen(U8 media)
{
- if (mMediaFlags != media)
- {
- mMediaFlags = media;
-
- // Special code for media handling
- if( hasMedia() && mMediaEntry == NULL)
- {
- mMediaEntry = new LLMediaEntry;
- }
- else if ( ! hasMedia() && mMediaEntry != NULL)
- {
- delete mMediaEntry;
- mMediaEntry = NULL;
- }
-
- return TEM_CHANGE_MEDIA;
- }
- return TEM_CHANGE_NONE;
+ S32 result = TEM_CHANGE_NONE;
+ result |= setTexGen(media & TEM_TEX_GEN_MASK);
+ result |= setMediaFlags(media & TEM_MEDIA_MASK);
+ return result;
}
S32 LLTextureEntry::setBumpmap(U8 bump)
diff --git a/indra/llprimitive/llvolumemessage.cpp b/indra/llprimitive/llvolumemessage.cpp
index b6cae5c4df..58b23bebd2 100644
--- a/indra/llprimitive/llvolumemessage.cpp
+++ b/indra/llprimitive/llvolumemessage.cpp
@@ -94,7 +94,7 @@ bool LLVolumeMessage::packProfileParams(
bool LLVolumeMessage::unpackProfileParams(
LLProfileParams* params,
LLMessageSystem* mesgsys,
- char* block_name,
+ char const* block_name,
S32 block_num)
{
bool ok = true;
@@ -322,7 +322,7 @@ bool LLVolumeMessage::packPathParams(
bool LLVolumeMessage::unpackPathParams(
LLPathParams* params,
LLMessageSystem* mesgsys,
- char* block_name,
+ char const* block_name,
S32 block_num)
{
U8 curve;
@@ -522,7 +522,7 @@ bool LLVolumeMessage::packVolumeParams(const LLVolumeParams* params, LLDataPacke
bool LLVolumeMessage::unpackVolumeParams(
LLVolumeParams* params,
LLMessageSystem* mesgsys,
- char* block_name,
+ char const* block_name,
S32 block_num)
{
bool ok = true;
diff --git a/indra/llprimitive/llvolumemessage.h b/indra/llprimitive/llvolumemessage.h
index 33562323c3..f59ee79c60 100644
--- a/indra/llprimitive/llvolumemessage.h
+++ b/indra/llprimitive/llvolumemessage.h
@@ -49,7 +49,7 @@ protected:
static bool unpackProfileParams(
LLProfileParams* params,
LLMessageSystem* mesgsys,
- char* block_name,
+ char const* block_name,
S32 block_num = 0);
static bool unpackProfileParams(LLProfileParams* params, LLDataPacker& dp);
@@ -60,7 +60,7 @@ protected:
static bool unpackPathParams(
LLPathParams* params,
LLMessageSystem* mesgsys,
- char* block_name,
+ char const* block_name,
S32 block_num = 0);
static bool unpackPathParams(LLPathParams* params, LLDataPacker& dp);
@@ -83,7 +83,7 @@ public:
static bool unpackVolumeParams(
LLVolumeParams* params,
LLMessageSystem* mesgsys,
- char* block_name,
+ char const* block_name,
S32 block_num = 0);
static bool unpackVolumeParams(LLVolumeParams* params, LLDataPacker &dp);
};
diff --git a/indra/llprimitive/llvolumexml.cpp b/indra/llprimitive/llvolumexml.cpp
index f4f9d4d713..bf2297a029 100644
--- a/indra/llprimitive/llvolumexml.cpp
+++ b/indra/llprimitive/llvolumexml.cpp
@@ -34,9 +34,9 @@
//============================================================================
-LLXMLNode *LLVolumeXml::exportProfileParams(const LLProfileParams* params)
+LLPointer<LLXMLNode> LLVolumeXml::exportProfileParams(const LLProfileParams* params)
{
- LLXMLNode *ret = new LLXMLNode("profile", FALSE);
+ LLPointer<LLXMLNode> ret = new LLXMLNode("profile", FALSE);
ret->createChild("curve_type", TRUE)->setByteValue(1, &params->getCurveType());
ret->createChild("interval", FALSE)->setFloatValue(2, &params->getBegin());
@@ -46,9 +46,9 @@ LLXMLNode *LLVolumeXml::exportProfileParams(const LLProfileParams* params)
}
-LLXMLNode *LLVolumeXml::exportPathParams(const LLPathParams* params)
+LLPointer<LLXMLNode> LLVolumeXml::exportPathParams(const LLPathParams* params)
{
- LLXMLNode *ret = new LLXMLNode("path", FALSE);
+ LLPointer<LLXMLNode> ret = new LLXMLNode("path", FALSE);
ret->createChild("curve_type", TRUE)->setByteValue(1, &params->getCurveType());
ret->createChild("interval", FALSE)->setFloatValue(2, &params->getBegin());
ret->createChild("scale", FALSE)->setFloatValue(2, params->getScale().mV);
@@ -63,12 +63,15 @@ LLXMLNode *LLVolumeXml::exportPathParams(const LLPathParams* params)
}
-LLXMLNode *LLVolumeXml::exportVolumeParams(const LLVolumeParams* params)
+LLPointer<LLXMLNode> LLVolumeXml::exportVolumeParams(const LLVolumeParams* params)
{
- LLXMLNode *ret = new LLXMLNode("shape", FALSE);
+ LLPointer<LLXMLNode> ret = new LLXMLNode("shape", FALSE);
- exportPathParams(&params->getPathParams())->setParent(ret);
- exportProfileParams(&params->getProfileParams())->setParent(ret);
+ LLPointer<LLXMLNode> node ;
+ node = exportPathParams(&params->getPathParams()) ;
+ node->setParent(ret);
+ node = exportProfileParams(&params->getProfileParams()) ;
+ node->setParent(ret);
return ret;
}
diff --git a/indra/llprimitive/llvolumexml.h b/indra/llprimitive/llvolumexml.h
index 5e79205d9a..9d4d989475 100644
--- a/indra/llprimitive/llvolumexml.h
+++ b/indra/llprimitive/llvolumexml.h
@@ -34,11 +34,11 @@
class LLVolumeXml
{
public:
- static LLXMLNode* exportProfileParams(const LLProfileParams* params);
+ static LLPointer<LLXMLNode> exportProfileParams(const LLProfileParams* params);
- static LLXMLNode* exportPathParams(const LLPathParams* params);
+ static LLPointer<LLXMLNode> exportPathParams(const LLPathParams* params);
- static LLXMLNode* exportVolumeParams(const LLVolumeParams* params);
+ static LLPointer<LLXMLNode> exportVolumeParams(const LLVolumeParams* params);
};
#endif // LL_LLVOLUMEXML_H
diff --git a/indra/llrender/llcubemap.cpp b/indra/llrender/llcubemap.cpp
index fb22d7f1f5..45a3b18179 100644
--- a/indra/llrender/llcubemap.cpp
+++ b/indra/llrender/llcubemap.cpp
@@ -36,6 +36,7 @@
#include "m4math.h"
#include "llrender.h"
+#include "llglslshader.h"
#include "llglheaders.h"
@@ -195,7 +196,7 @@ void LLCubeMap::enableTexture(S32 stage)
void LLCubeMap::enableTextureCoords(S32 stage)
{
mTextureCoordStage = stage;
- if (gGLManager.mHasCubeMap && stage >= 0 && LLCubeMap::sUseCubeMaps)
+ if (!LLGLSLShader::sNoFixedFunction && gGLManager.mHasCubeMap && stage >= 0 && LLCubeMap::sUseCubeMaps)
{
if (stage > 0)
{
@@ -237,7 +238,7 @@ void LLCubeMap::disableTexture(void)
void LLCubeMap::disableTextureCoords(void)
{
- if (gGLManager.mHasCubeMap && mTextureCoordStage >= 0 && LLCubeMap::sUseCubeMaps)
+ if (!LLGLSLShader::sNoFixedFunction && gGLManager.mHasCubeMap && mTextureCoordStage >= 0 && LLCubeMap::sUseCubeMaps)
{
if (mTextureCoordStage > 0)
{
@@ -259,47 +260,47 @@ void LLCubeMap::setMatrix(S32 stage)
if (mMatrixStage < 0) return;
- if (stage > 0)
+ //if (stage > 0)
{
gGL.getTexUnit(stage)->activate();
}
- LLVector3 x(LLVector3d(gGLModelView+0));
- LLVector3 y(LLVector3d(gGLModelView+4));
- LLVector3 z(LLVector3d(gGLModelView+8));
+ LLVector3 x(gGLModelView+0);
+ LLVector3 y(gGLModelView+4);
+ LLVector3 z(gGLModelView+8);
LLMatrix3 mat3;
mat3.setRows(x,y,z);
LLMatrix4 trans(mat3);
trans.transpose();
- glMatrixMode(GL_TEXTURE);
- glPushMatrix();
- glLoadMatrixf((F32 *)trans.mMatrix);
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.pushMatrix();
+ gGL.loadMatrix((F32 *)trans.mMatrix);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
- if (stage > 0)
+ /*if (stage > 0)
{
gGL.getTexUnit(0)->activate();
- }
+ }*/
}
void LLCubeMap::restoreMatrix()
{
if (mMatrixStage < 0) return;
- if (mMatrixStage > 0)
+ //if (mMatrixStage > 0)
{
gGL.getTexUnit(mMatrixStage)->activate();
}
- glMatrixMode(GL_TEXTURE);
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.popMatrix();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
- if (mMatrixStage > 0)
+ /*if (mMatrixStage > 0)
{
gGL.getTexUnit(0)->activate();
- }
+ }*/
}
void LLCubeMap::setReflection (void)
diff --git a/indra/llrender/llfontfreetype.cpp b/indra/llrender/llfontfreetype.cpp
index b84e696e2d..66d4ad2d87 100644
--- a/indra/llrender/llfontfreetype.cpp
+++ b/indra/llrender/llfontfreetype.cpp
@@ -55,7 +55,10 @@ FT_Library gFTLibrary = NULL;
//static
void LLFontManager::initClass()
{
- gFontManagerp = new LLFontManager;
+ if (!gFontManagerp)
+ {
+ gFontManagerp = new LLFontManager;
+ }
}
//static
@@ -136,7 +139,7 @@ BOOL LLFontFreetype::loadFace(const std::string& filename, F32 point_size, F32 v
FT_Done_Face(mFTFace);
mFTFace = NULL;
}
-
+
int error;
error = FT_New_Face( gFTLibrary,
@@ -482,7 +485,7 @@ void LLFontFreetype::renderGlyph(U32 glyph_index) const
if (mFTFace == NULL)
return;
- int error = FT_Load_Glyph(mFTFace, glyph_index, FT_LOAD_DEFAULT );
+ int error = FT_Load_Glyph(mFTFace, glyph_index, FT_LOAD_FORCE_AUTOHINT );
llassert(!error);
error = FT_Render_Glyph(mFTFace->glyph, gFontRenderMode);
diff --git a/indra/llrender/llfontgl.cpp b/indra/llrender/llfontgl.cpp
index 13008292f6..fccbf37a8d 100644
--- a/indra/llrender/llfontgl.cpp
+++ b/indra/llrender/llfontgl.cpp
@@ -56,8 +56,9 @@ std::string LLFontGL::sAppDir;
LLColor4 LLFontGL::sShadowColor(0.f, 0.f, 0.f, 1.f);
LLFontRegistry* LLFontGL::sFontRegistry = NULL;
-LLCoordFont LLFontGL::sCurOrigin;
-std::vector<LLCoordFont> LLFontGL::sOriginStack;
+LLCoordGL LLFontGL::sCurOrigin;
+F32 LLFontGL::sCurDepth;
+std::vector<std::pair<LLCoordGL, F32> > LLFontGL::sOriginStack;
const F32 EXT_X_BEARING = 1.f;
const F32 EXT_Y_BEARING = 0.f;
@@ -68,20 +69,6 @@ const F32 PIXEL_CORRECTION_DISTANCE = 0.01f;
const F32 PAD_UVY = 0.5f; // half of vertical padding between glyphs in the glyph texture
const F32 DROP_SHADOW_SOFT_STRENGTH = 0.3f;
-static F32 llfont_round_x(F32 x)
-{
- //return llfloor((x-LLFontGL::sCurOrigin.mX)/LLFontGL::sScaleX+0.5f)*LLFontGL::sScaleX+LLFontGL::sCurOrigin.mX;
- //return llfloor(x/LLFontGL::sScaleX+0.5f)*LLFontGL::sScaleY;
- return x;
-}
-
-static F32 llfont_round_y(F32 y)
-{
- //return llfloor((y-LLFontGL::sCurOrigin.mY)/LLFontGL::sScaleY+0.5f)*LLFontGL::sScaleY+LLFontGL::sCurOrigin.mY;
- //return llfloor(y+0.5f);
- return y;
-}
-
LLFontGL::LLFontGL()
{
}
@@ -115,23 +102,23 @@ static LLFastTimer::DeclareTimer FTM_RENDER_FONTS("Fonts");
S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, const LLRect& rect, const LLColor4 &color, HAlign halign, VAlign valign, U8 style,
ShadowType shadow, S32 max_chars, F32* right_x, BOOL use_ellipses) const
{
- F32 x = rect.mLeft;
+ F32 x = (F32)rect.mLeft;
F32 y = 0.f;
switch(valign)
{
case TOP:
- y = rect.mTop;
+ y = (F32)rect.mTop;
break;
case VCENTER:
- y = rect.getCenterY();
+ y = (F32)rect.getCenterY();
break;
case BASELINE:
case BOTTOM:
- y = rect.mBottom;
+ y = (F32)rect.mBottom;
break;
default:
- y = rect.mBottom;
+ y = (F32)rect.mBottom;
break;
}
return render(wstr, begin_offset, x, y, color, halign, valign, style, shadow, max_chars, rect.getWidth(), right_x, use_ellipses);
@@ -177,18 +164,11 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons
gGL.loadUIIdentity();
- //gGL.translateUI(floorf(sCurOrigin.mX*sScaleX), floorf(sCurOrigin.mY*sScaleY), sCurOrigin.mZ);
-
- // this code snaps the text origin to a pixel grid to start with
- //F32 pixel_offset_x = llround((F32)sCurOrigin.mX) - (sCurOrigin.mX);
- //F32 pixel_offset_y = llround((F32)sCurOrigin.mY) - (sCurOrigin.mY);
- //gGL.translateUI(-pixel_offset_x, -pixel_offset_y, 0.f);
-
LLVector2 origin(floorf(sCurOrigin.mX*sScaleX), floorf(sCurOrigin.mY*sScaleY));
- // snap the text origin to a pixel grid to start with
- origin.mV[VX] -= llround((F32)sCurOrigin.mX) - (sCurOrigin.mX);
- origin.mV[VY] -= llround((F32)sCurOrigin.mY) - (sCurOrigin.mY);
+ // Depth translation, so that floating text appears 'in-world'
+ // and is correctly occluded.
+ gGL.translatef(0.f,0.f,sCurDepth);
S32 chars_drawn = 0;
S32 i;
@@ -212,16 +192,17 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons
cur_y = ((F32)y * sScaleY) + origin.mV[VY];
// Offset y by vertical alignment.
+ // use unscaled font metrics here
switch (valign)
{
case TOP:
- cur_y -= mFontFreetype->getAscenderHeight();
+ cur_y -= llceil(mFontFreetype->getAscenderHeight());
break;
case BOTTOM:
- cur_y += mFontFreetype->getDescenderHeight();
+ cur_y += llceil(mFontFreetype->getDescenderHeight());
break;
case VCENTER:
- cur_y -= (mFontFreetype->getAscenderHeight() - mFontFreetype->getDescenderHeight()) / 2.f;
+ cur_y -= llceil((llceil(mFontFreetype->getAscenderHeight()) - llceil(mFontFreetype->getDescenderHeight())) / 2.f);
break;
case BASELINE:
// Baseline, do nothing.
@@ -247,7 +228,7 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons
cur_render_y = cur_y;
cur_render_x = cur_x;
- F32 start_x = llround(cur_x);
+ F32 start_x = (F32)llround(cur_x);
const LLFontBitmapCache* font_bitmap_cache = mFontFreetype->getFontBitmapCache();
@@ -271,7 +252,6 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons
}
}
-
const LLFontGlyphInfo* next_glyph = NULL;
const S32 GLYPH_BATCH_SIZE = 30;
@@ -302,6 +282,18 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons
S32 next_bitmap_num = fgi->mBitmapNum;
if (next_bitmap_num != bitmap_num)
{
+ // Actually draw the queued glyphs before switching their texture;
+ // otherwise the queued glyphs will be taken from wrong textures.
+ if (glyph_count > 0)
+ {
+ gGL.begin(LLRender::QUADS);
+ {
+ gGL.vertexBatchPreTransformed(vertices, uvs, colors, glyph_count * 4);
+ }
+ gGL.end();
+ glyph_count = 0;
+ }
+
bitmap_num = next_bitmap_num;
LLImageGL *font_image = font_bitmap_cache->getImageGL(bitmap_num);
gGL.getTexUnit(0)->bind(font_image);
@@ -320,10 +312,10 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons
(fgi->mXBitmapOffset + fgi->mWidth) * inv_width,
(fgi->mYBitmapOffset - PAD_UVY) * inv_height);
// snap glyph origin to whole screen pixel
- LLRectf screen_rect(llround(cur_render_x + (F32)fgi->mXBearing),
- llround(cur_render_y + (F32)fgi->mYBearing),
- llround(cur_render_x + (F32)fgi->mXBearing) + (F32)fgi->mWidth,
- llround(cur_render_y + (F32)fgi->mYBearing) - (F32)fgi->mHeight);
+ LLRectf screen_rect((F32)llround(cur_render_x + (F32)fgi->mXBearing),
+ (F32)llround(cur_render_y + (F32)fgi->mYBearing),
+ (F32)llround(cur_render_x + (F32)fgi->mXBearing) + (F32)fgi->mWidth,
+ (F32)llround(cur_render_y + (F32)fgi->mYBearing) - (F32)fgi->mHeight);
if (glyph_count >= GLYPH_BATCH_SIZE)
{
@@ -376,12 +368,12 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons
//FIXME: add underline as glyph?
if (style_to_add & UNDERLINE)
{
- F32 descender = mFontFreetype->getDescenderHeight();
+ F32 descender = (F32)llfloor(mFontFreetype->getDescenderHeight());
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
gGL.begin(LLRender::LINES);
- gGL.vertex2f(start_x, cur_y - (descender));
- gGL.vertex2f(cur_x, cur_y - (descender));
+ gGL.vertex2f(start_x, cur_y - descender);
+ gGL.vertex2f(cur_x, cur_y - descender);
gGL.end();
}
@@ -430,19 +422,9 @@ S32 LLFontGL::renderUTF8(const std::string &text, S32 begin_offset, S32 x, S32 y
}
// font metrics - override for LLFontFreetype that returns units of virtual pixels
-F32 LLFontGL::getLineHeight() const
-{
- return (F32)llround(mFontFreetype->getLineHeight() / sScaleY);
-}
-
-F32 LLFontGL::getAscenderHeight() const
+S32 LLFontGL::getLineHeight() const
{
- return (F32)llround(mFontFreetype->getAscenderHeight() / sScaleY);
-}
-
-F32 LLFontGL::getDescenderHeight() const
-{
- return (F32)llround(mFontFreetype->getDescenderHeight() / sScaleY);
+ return llceil(mFontFreetype->getAscenderHeight() / sScaleY) + llceil(mFontFreetype->getDescenderHeight() / sScaleY);
}
S32 LLFontGL::getWidth(const std::string& utf8text) const
@@ -555,7 +537,7 @@ S32 LLFontGL::maxDrawableChars(const llwchar* wchars, F32 max_pixels, S32 max_ch
BOOL in_word = FALSE;
// avoid S32 overflow when max_pixels == S32_MAX by staying in floating point
- F32 scaled_max_pixels = ceil(max_pixels * sScaleX);
+ F32 scaled_max_pixels = max_pixels * sScaleX;
F32 width_padding = 0.f;
LLFontGlyphInfo* next_glyph = NULL;
@@ -631,7 +613,7 @@ S32 LLFontGL::maxDrawableChars(const llwchar* wchars, F32 max_pixels, S32 max_ch
}
// Round after kerning.
- cur_x = llround(cur_x);
+ cur_x = (F32)llround(cur_x);
drawn_x = cur_x;
}
@@ -702,7 +684,7 @@ S32 LLFontGL::firstDrawableChar(const llwchar* wchars, F32 max_pixels, S32 text_
}
// Round after kerning.
- total_width = llround(total_width);
+ total_width = (F32)llround(total_width);
}
if (drawable_chars == 0)
@@ -785,7 +767,7 @@ S32 LLFontGL::charFromPixelOffset(const llwchar* wchars, S32 begin_offset, F32 t
// Round after kerning.
- cur_x = llround(cur_x);
+ cur_x = (F32)llround(cur_x);
}
return llmin(max_chars, pos - begin_offset);
@@ -1132,22 +1114,22 @@ void LLFontGL::renderQuad(LLVector3* vertex_out, LLVector2* uv_out, LLColor4U* c
{
S32 index = 0;
- vertex_out[index] = LLVector3(llfont_round_x(screen_rect.mRight), llfont_round_y(screen_rect.mTop), 0.f);
+ vertex_out[index] = LLVector3(screen_rect.mRight, screen_rect.mTop, 0.f);
uv_out[index] = LLVector2(uv_rect.mRight, uv_rect.mTop);
colors_out[index] = color;
index++;
- vertex_out[index] = LLVector3(llfont_round_x(screen_rect.mLeft), llfont_round_y(screen_rect.mTop), 0.f);
+ vertex_out[index] = LLVector3(screen_rect.mLeft, screen_rect.mTop, 0.f);
uv_out[index] = LLVector2(uv_rect.mLeft, uv_rect.mTop);
colors_out[index] = color;
index++;
- vertex_out[index] = LLVector3(llfont_round_x(screen_rect.mLeft), llfont_round_y(screen_rect.mBottom), 0.f);
+ vertex_out[index] = LLVector3(screen_rect.mLeft, screen_rect.mBottom, 0.f);
uv_out[index] = LLVector2(uv_rect.mLeft, uv_rect.mBottom);
colors_out[index] = color;
index++;
- vertex_out[index] = LLVector3(llfont_round_x(screen_rect.mRight), llfont_round_y(screen_rect.mBottom), 0.f);
+ vertex_out[index] = LLVector3(screen_rect.mRight, screen_rect.mBottom, 0.f);
uv_out[index] = LLVector2(uv_rect.mRight, uv_rect.mBottom);
colors_out[index] = color;
}
diff --git a/indra/llrender/llfontgl.h b/indra/llrender/llfontgl.h
index dc8d848ed2..74bdbb43e7 100644
--- a/indra/llrender/llfontgl.h
+++ b/indra/llrender/llfontgl.h
@@ -115,9 +115,7 @@ public:
S32 renderUTF8(const std::string &text, S32 begin_offset, S32 x, S32 y, const LLColor4 &color, HAlign halign, VAlign valign, U8 style = NORMAL, ShadowType shadow = NO_SHADOW) const;
// font metrics - override for LLFontFreetype that returns units of virtual pixels
- F32 getLineHeight() const;
- F32 getAscenderHeight() const;
- F32 getDescenderHeight() const;
+ S32 getLineHeight() const;
S32 getWidth(const std::string& utf8text) const;
S32 getWidth(const llwchar* wchars) const;
@@ -188,8 +186,9 @@ public:
static std::string getFontPathLocal();
static std::string getFontPathSystem();
- static LLCoordFont sCurOrigin;
- static std::vector<LLCoordFont> sOriginStack;
+ static LLCoordGL sCurOrigin;
+ static F32 sCurDepth;
+ static std::vector<std::pair<LLCoordGL, F32> > sOriginStack;
static LLColor4 sShadowColor;
diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp
index 6ea63809f8..197bc2b422 100644
--- a/indra/llrender/llgl.cpp
+++ b/indra/llrender/llgl.cpp
@@ -48,6 +48,7 @@
#include "llstacktrace.h"
#include "llglheaders.h"
+#include "llglslshader.h"
#ifdef _DEBUG
//#define GL_STATE_VERIFY
@@ -57,12 +58,47 @@
BOOL gDebugSession = FALSE;
BOOL gDebugGL = FALSE;
BOOL gClothRipple = FALSE;
-BOOL gNoRender = FALSE;
+BOOL gHeadlessClient = FALSE;
BOOL gGLActive = FALSE;
+static const std::string HEADLESS_VENDOR_STRING("Linden Lab");
+static const std::string HEADLESS_RENDERER_STRING("Headless");
+static const std::string HEADLESS_VERSION_STRING("1.0");
std::ofstream gFailLog;
+#if GL_ARB_debug_output
+
+#ifndef APIENTRY
+#define APIENTRY
+#endif
+
+void APIENTRY gl_debug_callback(GLenum source,
+ GLenum type,
+ GLuint id,
+ GLenum severity,
+ GLsizei length,
+ const GLchar* message,
+ GLvoid* userParam)
+{
+ if (severity == GL_DEBUG_SEVERITY_HIGH_ARB)
+ {
+ llwarns << "----- GL ERROR --------" << llendl;
+ }
+ else
+ {
+ llwarns << "----- GL WARNING -------" << llendl;
+ }
+ llwarns << "Type: " << std::hex << type << llendl;
+ llwarns << "ID: " << std::hex << id << llendl;
+ llwarns << "Severity: " << std::hex << severity << llendl;
+ llwarns << "Message: " << message << llendl;
+ llwarns << "-----------------------" << llendl;
+}
+#endif
+
+void parse_glsl_version(S32& major, S32& minor);
+
void ll_init_fail_log(std::string filename)
{
gFailLog.open(filename.c_str());
@@ -102,11 +138,15 @@ LLMatrix4 gGLObliqueProjectionInverse;
#define LL_GL_NAME_POOLING 0
-LLGLNamePool::pool_list_t LLGLNamePool::sInstances;
std::list<LLGLUpdate*> LLGLUpdate::sGLQ;
#if (LL_WINDOWS || LL_LINUX || LL_SOLARIS) && !LL_MESA_HEADLESS
// ATI prototypes
+
+#if LL_WINDOWS
+PFNGLGETSTRINGIPROC glGetStringi = NULL;
+#endif
+
// vertex blending prototypes
PFNGLWEIGHTPOINTERARBPROC glWeightPointerARB = NULL;
PFNGLVERTEXBLENDARBPROC glVertexBlendARB = NULL;
@@ -125,6 +165,29 @@ PFNGLUNMAPBUFFERARBPROC glUnmapBufferARB = NULL;
PFNGLGETBUFFERPARAMETERIVARBPROC glGetBufferParameterivARB = NULL;
PFNGLGETBUFFERPOINTERVARBPROC glGetBufferPointervARB = NULL;
+//GL_ARB_vertex_array_object
+PFNGLBINDVERTEXARRAYPROC glBindVertexArray = NULL;
+PFNGLDELETEVERTEXARRAYSPROC glDeleteVertexArrays = NULL;
+PFNGLGENVERTEXARRAYSPROC glGenVertexArrays = NULL;
+PFNGLISVERTEXARRAYPROC glIsVertexArray = NULL;
+
+// GL_ARB_map_buffer_range
+PFNGLMAPBUFFERRANGEPROC glMapBufferRange = NULL;
+PFNGLFLUSHMAPPEDBUFFERRANGEPROC glFlushMappedBufferRange = NULL;
+
+// GL_ARB_sync
+PFNGLFENCESYNCPROC glFenceSync = NULL;
+PFNGLISSYNCPROC glIsSync = NULL;
+PFNGLDELETESYNCPROC glDeleteSync = NULL;
+PFNGLCLIENTWAITSYNCPROC glClientWaitSync = NULL;
+PFNGLWAITSYNCPROC glWaitSync = NULL;
+PFNGLGETINTEGER64VPROC glGetInteger64v = NULL;
+PFNGLGETSYNCIVPROC glGetSynciv = NULL;
+
+// GL_APPLE_flush_buffer_range
+PFNGLBUFFERPARAMETERIAPPLEPROC glBufferParameteriAPPLE = NULL;
+PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC glFlushMappedBufferRangeAPPLE = NULL;
+
// vertex object prototypes
PFNGLNEWOBJECTBUFFERATIPROC glNewObjectBufferATI = NULL;
PFNGLISOBJECTBUFFERATIPROC glIsObjectBufferATI = NULL;
@@ -154,30 +217,39 @@ PFNGLGETQUERYOBJECTUIVARBPROC glGetQueryObjectuivARB = NULL;
PFNGLPOINTPARAMETERFARBPROC glPointParameterfARB = NULL;
PFNGLPOINTPARAMETERFVARBPROC glPointParameterfvARB = NULL;
-// GL_EXT_framebuffer_object
-PFNGLISRENDERBUFFEREXTPROC glIsRenderbufferEXT = NULL;
-PFNGLBINDRENDERBUFFEREXTPROC glBindRenderbufferEXT = NULL;
-PFNGLDELETERENDERBUFFERSEXTPROC glDeleteRenderbuffersEXT = NULL;
-PFNGLGENRENDERBUFFERSEXTPROC glGenRenderbuffersEXT = NULL;
-PFNGLRENDERBUFFERSTORAGEEXTPROC glRenderbufferStorageEXT = NULL;
-PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC glGetRenderbufferParameterivEXT = NULL;
-PFNGLISFRAMEBUFFEREXTPROC glIsFramebufferEXT = NULL;
-PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebufferEXT = NULL;
-PFNGLDELETEFRAMEBUFFERSEXTPROC glDeleteFramebuffersEXT = NULL;
-PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffersEXT = NULL;
-PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glCheckFramebufferStatusEXT = NULL;
-PFNGLFRAMEBUFFERTEXTURE1DEXTPROC glFramebufferTexture1DEXT = NULL;
-PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glFramebufferTexture2DEXT = NULL;
-PFNGLFRAMEBUFFERTEXTURE3DEXTPROC glFramebufferTexture3DEXT = NULL;
-PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC glFramebufferRenderbufferEXT = NULL;
-PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC glGetFramebufferAttachmentParameterivEXT = NULL;
-PFNGLGENERATEMIPMAPEXTPROC glGenerateMipmapEXT = NULL;
-
-// GL_EXT_framebuffer_multisample
-PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC glRenderbufferStorageMultisampleEXT = NULL;
-
-// GL_EXT_framebuffer_blit
-PFNGLBLITFRAMEBUFFEREXTPROC glBlitFramebufferEXT = NULL;
+// GL_ARB_framebuffer_object
+PFNGLISRENDERBUFFERPROC glIsRenderbuffer = NULL;
+PFNGLBINDRENDERBUFFERPROC glBindRenderbuffer = NULL;
+PFNGLDELETERENDERBUFFERSPROC glDeleteRenderbuffers = NULL;
+PFNGLGENRENDERBUFFERSPROC glGenRenderbuffers = NULL;
+PFNGLRENDERBUFFERSTORAGEPROC glRenderbufferStorage = NULL;
+PFNGLGETRENDERBUFFERPARAMETERIVPROC glGetRenderbufferParameteriv = NULL;
+PFNGLISFRAMEBUFFERPROC glIsFramebuffer = NULL;
+PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer = NULL;
+PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers = NULL;
+PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers = NULL;
+PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus = NULL;
+PFNGLFRAMEBUFFERTEXTURE1DPROC glFramebufferTexture1D = NULL;
+PFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D = NULL;
+PFNGLFRAMEBUFFERTEXTURE3DPROC glFramebufferTexture3D = NULL;
+PFNGLFRAMEBUFFERRENDERBUFFERPROC glFramebufferRenderbuffer = NULL;
+PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glGetFramebufferAttachmentParameteriv = NULL;
+PFNGLGENERATEMIPMAPPROC glGenerateMipmap = NULL;
+PFNGLBLITFRAMEBUFFERPROC glBlitFramebuffer = NULL;
+PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glRenderbufferStorageMultisample = NULL;
+PFNGLFRAMEBUFFERTEXTURELAYERPROC glFramebufferTextureLayer = NULL;
+
+//GL_ARB_texture_multisample
+PFNGLTEXIMAGE2DMULTISAMPLEPROC glTexImage2DMultisample = NULL;
+PFNGLTEXIMAGE3DMULTISAMPLEPROC glTexImage3DMultisample = NULL;
+PFNGLGETMULTISAMPLEFVPROC glGetMultisamplefv = NULL;
+PFNGLSAMPLEMASKIPROC glSampleMaski = NULL;
+
+//GL_ARB_debug_output
+PFNGLDEBUGMESSAGECONTROLARBPROC glDebugMessageControlARB = NULL;
+PFNGLDEBUGMESSAGEINSERTARBPROC glDebugMessageInsertARB = NULL;
+PFNGLDEBUGMESSAGECALLBACKARBPROC glDebugMessageCallbackARB = NULL;
+PFNGLGETDEBUGMESSAGELOGARBPROC glGetDebugMessageLogARB = NULL;
// GL_EXT_blend_func_separate
PFNGLBLENDFUNCSEPARATEEXTPROC glBlendFuncSeparateEXT = NULL;
@@ -225,6 +297,11 @@ PFNGLGETACTIVEUNIFORMARBPROC glGetActiveUniformARB = NULL;
PFNGLGETUNIFORMFVARBPROC glGetUniformfvARB = NULL;
PFNGLGETUNIFORMIVARBPROC glGetUniformivARB = NULL;
PFNGLGETSHADERSOURCEARBPROC glGetShaderSourceARB = NULL;
+PFNGLVERTEXATTRIBIPOINTERPROC glVertexAttribIPointer = NULL;
+
+#if LL_WINDOWS
+PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribsARB = NULL;
+#endif
// vertex shader prototypes
#if LL_LINUX || LL_SOLARIS
@@ -316,26 +393,39 @@ LLGLManager::LLGLManager() :
mIsDisabled(FALSE),
mHasMultitexture(FALSE),
+ mHasATIMemInfo(FALSE),
+ mHasNVXMemInfo(FALSE),
mNumTextureUnits(1),
mHasMipMapGeneration(FALSE),
mHasCompressedTextures(FALSE),
mHasFramebufferObject(FALSE),
- mHasFramebufferMultisample(FALSE),
+ mMaxSamples(0),
mHasBlendFuncSeparate(FALSE),
-
+ mHasSync(FALSE),
mHasVertexBufferObject(FALSE),
+ mHasVertexArrayObject(FALSE),
+ mHasMapBufferRange(FALSE),
+ mHasFlushBufferRange(FALSE),
mHasPBuffer(FALSE),
mHasShaderObjects(FALSE),
mHasVertexShader(FALSE),
mHasFragmentShader(FALSE),
+ mNumTextureImageUnits(0),
mHasOcclusionQuery(FALSE),
+ mHasOcclusionQuery2(FALSE),
mHasPointParameters(FALSE),
mHasDrawBuffers(FALSE),
mHasTextureRectangle(FALSE),
+ mHasTextureMultisample(FALSE),
+ mMaxSampleMaskWords(0),
+ mMaxColorTextureSamples(0),
+ mMaxDepthTextureSamples(0),
+ mMaxIntegerSamples(0),
mHasAnisotropic(FALSE),
mHasARBEnvCombine(FALSE),
mHasCubeMap(FALSE),
+ mHasDebugOutput(FALSE),
mIsATI(FALSE),
mIsNVIDIA(FALSE),
@@ -356,7 +446,8 @@ LLGLManager::LLGLManager() :
mDriverVersionMinor(0),
mDriverVersionRelease(0),
mGLVersion(1.0f),
-
+ mGLSLVersionMajor(0),
+ mGLSLVersionMinor(0),
mVRAM(0),
mGLMaxVertexRange(0),
mGLMaxIndexRange(0)
@@ -375,6 +466,15 @@ void LLGLManager::initWGL()
LL_WARNS("RenderInit") << "No ARB pixel format extensions" << LL_ENDL;
}
+ if (ExtensionExists("WGL_ARB_create_context",gGLHExts.mSysExts))
+ {
+ GLH_EXT_NAME(wglCreateContextAttribsARB) = (PFNWGLCREATECONTEXTATTRIBSARBPROC)GLH_EXT_GET_PROC_ADDRESS("wglCreateContextAttribsARB");
+ }
+ else
+ {
+ LL_WARNS("RenderInit") << "No ARB create context extensions" << LL_ENDL;
+ }
+
if (ExtensionExists("WGL_EXT_swap_control", gGLHExts.mSysExts))
{
GLH_EXT_NAME(wglSwapIntervalEXT) = (PFNWGLSWAPINTERVALEXTPROC)GLH_EXT_GET_PROC_ADDRESS("wglSwapIntervalEXT");
@@ -404,13 +504,45 @@ bool LLGLManager::initGL()
LL_ERRS("RenderInit") << "Calling init on LLGLManager after already initialized!" << LL_ENDL;
}
- GLint alpha_bits;
- glGetIntegerv( GL_ALPHA_BITS, &alpha_bits );
- if( 8 != alpha_bits )
+ stop_glerror();
+
+#if LL_WINDOWS
+ if (!glGetStringi)
{
- LL_WARNS("RenderInit") << "Frame buffer has less than 8 bits of alpha. Avatar texture compositing will fail." << LL_ENDL;
+ glGetStringi = (PFNGLGETSTRINGIPROC) GLH_EXT_GET_PROC_ADDRESS("glGetStringi");
}
+ //reload extensions string (may have changed after using wglCreateContextAttrib)
+ if (glGetStringi)
+ {
+ std::stringstream str;
+
+ GLint count = 0;
+ glGetIntegerv(GL_NUM_EXTENSIONS, &count);
+ for (GLint i = 0; i < count; ++i)
+ {
+ std::string ext((const char*) glGetStringi(GL_EXTENSIONS, i));
+ str << ext << " ";
+ LL_DEBUGS("GLExtensions") << ext << llendl;
+ }
+
+ {
+ PFNWGLGETEXTENSIONSSTRINGARBPROC wglGetExtensionsStringARB = 0;
+ wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)wglGetProcAddress("wglGetExtensionsStringARB");
+ if(wglGetExtensionsStringARB)
+ {
+ str << (const char*) wglGetExtensionsStringARB(wglGetCurrentDC());
+ }
+ }
+
+ free(gGLHExts.mSysExts);
+ std::string extensions = str.str();
+ gGLHExts.mSysExts = strdup(extensions.c_str());
+ }
+#endif
+
+ stop_glerror();
+
// Extract video card strings and convert to upper case to
// work around driver-to-driver variation in capitalization.
mGLVendor = std::string((const char *)glGetString(GL_VENDOR));
@@ -425,7 +557,21 @@ bool LLGLManager::initGL()
&mDriverVersionVendorString );
mGLVersion = mDriverVersionMajor + mDriverVersionMinor * .1f;
-
+
+ if (mGLVersion >= 2.f)
+ {
+ parse_glsl_version(mGLSLVersionMajor, mGLSLVersionMinor);
+
+#if LL_DARWIN
+ //never use GLSL greater than 1.20 on OSX
+ if (mGLSLVersionMajor > 1 || mGLSLVersionMinor >= 30)
+ {
+ mGLSLVersionMajor = 1;
+ mGLSLVersionMinor = 20;
+ }
+#endif
+ }
+
// Trailing space necessary to keep "nVidia Corpor_ati_on" cards
// from being recognized as ATI.
if (mGLVendor.substr(0,4) == "ATI ")
@@ -497,10 +643,48 @@ bool LLGLManager::initGL()
mGLVendorShort = "MISC";
}
+ stop_glerror();
// This is called here because it depends on the setting of mIsGF2or4MX, and sets up mHasMultitexture.
initExtensions();
+ stop_glerror();
+
+ S32 old_vram = mVRAM;
+
+ if (mHasATIMemInfo)
+ { //ask the gl how much vram is free at startup and attempt to use no more than half of that
+ S32 meminfo[4];
+ glGetIntegerv(GL_TEXTURE_FREE_MEMORY_ATI, meminfo);
- if (mHasMultitexture)
+ mVRAM = meminfo[0]/1024;
+ }
+ else if (mHasNVXMemInfo)
+ {
+ S32 dedicated_memory;
+ glGetIntegerv(GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX, &dedicated_memory);
+ mVRAM = dedicated_memory/1024;
+ }
+
+ if (mVRAM < 256)
+ { //something likely went wrong using the above extensions, fall back to old method
+ mVRAM = old_vram;
+ }
+
+ stop_glerror();
+
+ stop_glerror();
+
+ if (mHasFragmentShader)
+ {
+ GLint num_tex_image_units;
+ glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS_ARB, &num_tex_image_units);
+ mNumTextureImageUnits = llmin(num_tex_image_units, 32);
+ }
+
+ if (LLRender::sGLCoreProfile)
+ {
+ mNumTextureUnits = llmin(mNumTextureImageUnits, MAX_GL_TEXTURE_UNITS);
+ }
+ else if (mHasMultitexture)
{
GLint num_tex_units;
glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, &num_tex_units);
@@ -519,9 +703,53 @@ bool LLGLManager::initGL()
return false;
}
+ stop_glerror();
+
+ if (mHasTextureMultisample)
+ {
+ glGetIntegerv(GL_MAX_COLOR_TEXTURE_SAMPLES, &mMaxColorTextureSamples);
+ glGetIntegerv(GL_MAX_DEPTH_TEXTURE_SAMPLES, &mMaxDepthTextureSamples);
+ glGetIntegerv(GL_MAX_INTEGER_SAMPLES, &mMaxIntegerSamples);
+ glGetIntegerv(GL_MAX_SAMPLE_MASK_WORDS, &mMaxSampleMaskWords);
+ }
+
+ stop_glerror();
+
+#if LL_WINDOWS
+ if (mHasDebugOutput && gDebugGL)
+ { //setup debug output callback
+ //glDebugMessageControlARB(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_LOW_ARB, 0, NULL, GL_TRUE);
+ glDebugMessageCallbackARB((GLDEBUGPROCARB) gl_debug_callback, NULL);
+ glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB);
+ }
+#endif
+
+ stop_glerror();
+
+ //HACK always disable texture multisample, use FXAA instead
+ mHasTextureMultisample = FALSE;
+#if LL_WINDOWS
+ if (mIsATI)
+ { //using multisample textures on ATI results in black screen for some reason
+ mHasTextureMultisample = FALSE;
+ }
+#endif
+
+ if (mHasFramebufferObject)
+ {
+ glGetIntegerv(GL_MAX_SAMPLES, &mMaxSamples);
+ }
+
+ stop_glerror();
+
setToDebugGPU();
+ stop_glerror();
+
initGLStates();
+
+ stop_glerror();
+
return true;
}
@@ -538,9 +766,19 @@ void LLGLManager::setToDebugGPU()
void LLGLManager::getGLInfo(LLSD& info)
{
- info["GLInfo"]["GLVendor"] = std::string((const char *)glGetString(GL_VENDOR));
- info["GLInfo"]["GLRenderer"] = std::string((const char *)glGetString(GL_RENDERER));
- info["GLInfo"]["GLVersion"] = std::string((const char *)glGetString(GL_VERSION));
+ if (gHeadlessClient)
+ {
+ info["GLInfo"]["GLVendor"] = HEADLESS_VENDOR_STRING;
+ info["GLInfo"]["GLRenderer"] = HEADLESS_RENDERER_STRING;
+ info["GLInfo"]["GLVersion"] = HEADLESS_VERSION_STRING;
+ return;
+ }
+ else
+ {
+ info["GLInfo"]["GLVendor"] = std::string((const char *)glGetString(GL_VENDOR));
+ info["GLInfo"]["GLRenderer"] = std::string((const char *)glGetString(GL_RENDERER));
+ info["GLInfo"]["GLVersion"] = std::string((const char *)glGetString(GL_VERSION));
+ }
#if !LL_MESA_HEADLESS
std::string all_exts = ll_safe_string((const char *)gGLHExts.mSysExts);
@@ -556,14 +794,22 @@ void LLGLManager::getGLInfo(LLSD& info)
std::string LLGLManager::getGLInfoString()
{
std::string info_str;
- std::string all_exts, line;
- info_str += std::string("GL_VENDOR ") + ll_safe_string((const char *)glGetString(GL_VENDOR)) + std::string("\n");
- info_str += std::string("GL_RENDERER ") + ll_safe_string((const char *)glGetString(GL_RENDERER)) + std::string("\n");
- info_str += std::string("GL_VERSION ") + ll_safe_string((const char *)glGetString(GL_VERSION)) + std::string("\n");
+ if (gHeadlessClient)
+ {
+ info_str += std::string("GL_VENDOR ") + HEADLESS_VENDOR_STRING + std::string("\n");
+ info_str += std::string("GL_RENDERER ") + HEADLESS_RENDERER_STRING + std::string("\n");
+ info_str += std::string("GL_VERSION ") + HEADLESS_VERSION_STRING + std::string("\n");
+ }
+ else
+ {
+ info_str += std::string("GL_VENDOR ") + ll_safe_string((const char *)glGetString(GL_VENDOR)) + std::string("\n");
+ info_str += std::string("GL_RENDERER ") + ll_safe_string((const char *)glGetString(GL_RENDERER)) + std::string("\n");
+ info_str += std::string("GL_VERSION ") + ll_safe_string((const char *)glGetString(GL_VERSION)) + std::string("\n");
+ }
#if !LL_MESA_HEADLESS
- all_exts = (const char *)gGLHExts.mSysExts;
+ std::string all_exts= ll_safe_string(((const char *)gGLHExts.mSysExts));
LLStringUtil::replaceChar(all_exts, ' ', '\n');
info_str += std::string("GL_EXTENSIONS:\n") + all_exts + std::string("\n");
#endif
@@ -573,15 +819,21 @@ std::string LLGLManager::getGLInfoString()
void LLGLManager::printGLInfoString()
{
- std::string info_str;
- std::string all_exts, line;
-
- LL_INFOS("RenderInit") << "GL_VENDOR: " << ((const char *)glGetString(GL_VENDOR)) << LL_ENDL;
- LL_INFOS("RenderInit") << "GL_RENDERER: " << ((const char *)glGetString(GL_RENDERER)) << LL_ENDL;
- LL_INFOS("RenderInit") << "GL_VERSION: " << ((const char *)glGetString(GL_VERSION)) << LL_ENDL;
+ if (gHeadlessClient)
+ {
+ LL_INFOS("RenderInit") << "GL_VENDOR: " << HEADLESS_VENDOR_STRING << LL_ENDL;
+ LL_INFOS("RenderInit") << "GL_RENDERER: " << HEADLESS_RENDERER_STRING << LL_ENDL;
+ LL_INFOS("RenderInit") << "GL_VERSION: " << HEADLESS_VERSION_STRING << LL_ENDL;
+ }
+ else
+ {
+ LL_INFOS("RenderInit") << "GL_VENDOR: " << ((const char *)glGetString(GL_VENDOR)) << LL_ENDL;
+ LL_INFOS("RenderInit") << "GL_RENDERER: " << ((const char *)glGetString(GL_RENDERER)) << LL_ENDL;
+ LL_INFOS("RenderInit") << "GL_VERSION: " << ((const char *)glGetString(GL_VERSION)) << LL_ENDL;
+ }
#if !LL_MESA_HEADLESS
- all_exts = std::string(gGLHExts.mSysExts);
+ std::string all_exts= ll_safe_string(((const char *)gGLHExts.mSysExts));
LLStringUtil::replaceChar(all_exts, ' ', '\n');
LL_DEBUGS("RenderInit") << "GL_EXTENSIONS:\n" << all_exts << LL_ENDL;
#endif
@@ -590,7 +842,14 @@ void LLGLManager::printGLInfoString()
std::string LLGLManager::getRawGLString()
{
std::string gl_string;
- gl_string = ll_safe_string((char*)glGetString(GL_VENDOR)) + " " + ll_safe_string((char*)glGetString(GL_RENDERER));
+ if (gHeadlessClient)
+ {
+ gl_string = HEADLESS_VENDOR_STRING + " " + HEADLESS_RENDERER_STRING;
+ }
+ else
+ {
+ gl_string = ll_safe_string((char*)glGetString(GL_VENDOR)) + " " + ll_safe_string((char*)glGetString(GL_RENDERER));
+ }
return gl_string;
}
@@ -614,47 +873,42 @@ void LLGLManager::initExtensions()
mHasMultitexture = TRUE;
# else
mHasMultitexture = FALSE;
-# endif
+# endif // GL_ARB_multitexture
# ifdef GL_ARB_texture_env_combine
mHasARBEnvCombine = TRUE;
# else
mHasARBEnvCombine = FALSE;
-# endif
+# endif // GL_ARB_texture_env_combine
# ifdef GL_ARB_texture_compression
mHasCompressedTextures = TRUE;
# else
mHasCompressedTextures = FALSE;
-# endif
+# endif // GL_ARB_texture_compression
# ifdef GL_ARB_vertex_buffer_object
mHasVertexBufferObject = TRUE;
# else
mHasVertexBufferObject = FALSE;
-# endif
+# endif // GL_ARB_vertex_buffer_object
# ifdef GL_EXT_framebuffer_object
mHasFramebufferObject = TRUE;
# else
mHasFramebufferObject = FALSE;
-# endif
-# ifdef GL_EXT_framebuffer_multisample
- mHasFramebufferMultisample = TRUE;
-# else
- mHasFramebufferMultisample = FALSE;
-# endif
+# endif // GL_EXT_framebuffer_object
# ifdef GL_ARB_draw_buffers
mHasDrawBuffers = TRUE;
#else
mHasDrawBuffers = FALSE;
-# endif
+# endif // GL_ARB_draw_buffers
# if defined(GL_NV_depth_clamp) || defined(GL_ARB_depth_clamp)
mHasDepthClamp = TRUE;
#else
mHasDepthClamp = FALSE;
-#endif
+#endif // defined(GL_NV_depth_clamp) || defined(GL_ARB_depth_clamp)
# if GL_EXT_blend_func_separate
mHasBlendFuncSeparate = TRUE;
#else
mHasBlendFuncSeparate = FALSE;
-# endif
+# endif // GL_EXT_blend_func_separate
mHasMipMapGeneration = FALSE;
mHasSeparateSpecularColor = FALSE;
mHasAnisotropic = FALSE;
@@ -665,8 +919,10 @@ void LLGLManager::initExtensions()
mHasVertexShader = FALSE;
mHasFragmentShader = FALSE;
mHasTextureRectangle = FALSE;
-#else // LL_MESA_HEADLESS
+#else // LL_MESA_HEADLESS //important, gGLHExts.mSysExts is uninitialized until after glh_init_extensions is called
mHasMultitexture = glh_init_extensions("GL_ARB_multitexture");
+ mHasATIMemInfo = ExtensionExists("GL_ATI_meminfo", gGLHExts.mSysExts);
+ mHasNVXMemInfo = ExtensionExists("GL_NVX_gpu_memory_info", gGLHExts.mSysExts);
mHasMipMapGeneration = glh_init_extensions("GL_SGIS_generate_mipmap");
mHasSeparateSpecularColor = glh_init_extensions("GL_EXT_separate_specular_color");
mHasAnisotropic = glh_init_extensions("GL_EXT_texture_filter_anisotropic");
@@ -675,22 +931,35 @@ void LLGLManager::initExtensions()
mHasARBEnvCombine = ExtensionExists("GL_ARB_texture_env_combine", gGLHExts.mSysExts);
mHasCompressedTextures = glh_init_extensions("GL_ARB_texture_compression");
mHasOcclusionQuery = ExtensionExists("GL_ARB_occlusion_query", gGLHExts.mSysExts);
+ mHasOcclusionQuery2 = ExtensionExists("GL_ARB_occlusion_query2", gGLHExts.mSysExts);
mHasVertexBufferObject = ExtensionExists("GL_ARB_vertex_buffer_object", gGLHExts.mSysExts);
+ mHasVertexArrayObject = ExtensionExists("GL_ARB_vertex_array_object", gGLHExts.mSysExts);
+ mHasSync = ExtensionExists("GL_ARB_sync", gGLHExts.mSysExts);
+ mHasMapBufferRange = ExtensionExists("GL_ARB_map_buffer_range", gGLHExts.mSysExts);
+ mHasFlushBufferRange = ExtensionExists("GL_APPLE_flush_buffer_range", gGLHExts.mSysExts);
mHasDepthClamp = ExtensionExists("GL_ARB_depth_clamp", gGLHExts.mSysExts) || ExtensionExists("GL_NV_depth_clamp", gGLHExts.mSysExts);
// mask out FBO support when packed_depth_stencil isn't there 'cause we need it for LLRenderTarget -Brad
- mHasFramebufferObject = ExtensionExists("GL_EXT_framebuffer_object", gGLHExts.mSysExts)
- && ExtensionExists("GL_EXT_packed_depth_stencil", gGLHExts.mSysExts);
- mHasFramebufferMultisample = mHasFramebufferObject && ExtensionExists("GL_EXT_framebuffer_multisample", gGLHExts.mSysExts);
+#ifdef GL_ARB_framebuffer_object
+ mHasFramebufferObject = ExtensionExists("GL_ARB_framebuffer_object", gGLHExts.mSysExts);
+#else
+ mHasFramebufferObject = ExtensionExists("GL_EXT_framebuffer_object", gGLHExts.mSysExts) &&
+ ExtensionExists("GL_EXT_framebuffer_blit", gGLHExts.mSysExts) &&
+ ExtensionExists("GL_EXT_framebuffer_multisample", gGLHExts.mSysExts) &&
+ ExtensionExists("GL_EXT_packed_depth_stencil", gGLHExts.mSysExts);
+#endif
+
mHasDrawBuffers = ExtensionExists("GL_ARB_draw_buffers", gGLHExts.mSysExts);
mHasBlendFuncSeparate = ExtensionExists("GL_EXT_blend_func_separate", gGLHExts.mSysExts);
mHasTextureRectangle = ExtensionExists("GL_ARB_texture_rectangle", gGLHExts.mSysExts);
+ mHasTextureMultisample = ExtensionExists("GL_ARB_texture_multisample", gGLHExts.mSysExts);
+ mHasDebugOutput = ExtensionExists("GL_ARB_debug_output", gGLHExts.mSysExts);
#if !LL_DARWIN
mHasPointParameters = !mIsATI && ExtensionExists("GL_ARB_point_parameters", gGLHExts.mSysExts);
#endif
- mHasShaderObjects = ExtensionExists("GL_ARB_shader_objects", gGLHExts.mSysExts) && ExtensionExists("GL_ARB_shading_language_100", gGLHExts.mSysExts);
+ mHasShaderObjects = ExtensionExists("GL_ARB_shader_objects", gGLHExts.mSysExts) && (LLRender::sGLCoreProfile || ExtensionExists("GL_ARB_shading_language_100", gGLHExts.mSysExts));
mHasVertexShader = ExtensionExists("GL_ARB_vertex_program", gGLHExts.mSysExts) && ExtensionExists("GL_ARB_vertex_shader", gGLHExts.mSysExts)
- && ExtensionExists("GL_ARB_shading_language_100", gGLHExts.mSysExts);
- mHasFragmentShader = ExtensionExists("GL_ARB_fragment_shader", gGLHExts.mSysExts) && ExtensionExists("GL_ARB_shading_language_100", gGLHExts.mSysExts);
+ && (LLRender::sGLCoreProfile || ExtensionExists("GL_ARB_shading_language_100", gGLHExts.mSysExts));
+ mHasFragmentShader = ExtensionExists("GL_ARB_fragment_shader", gGLHExts.mSysExts) && (LLRender::sGLCoreProfile || ExtensionExists("GL_ARB_shading_language_100", gGLHExts.mSysExts));
#endif
#if LL_LINUX || LL_SOLARIS
@@ -705,7 +974,6 @@ void LLGLManager::initExtensions()
mHasCompressedTextures = FALSE;
mHasVertexBufferObject = FALSE;
mHasFramebufferObject = FALSE;
- mHasFramebufferMultisample = FALSE;
mHasDrawBuffers = FALSE;
mHasBlendFuncSeparate = FALSE;
mHasMipMapGeneration = FALSE;
@@ -759,10 +1027,9 @@ void LLGLManager::initExtensions()
if (strchr(blacklist,'p')) mHasPointParameters = FALSE;//S
if (strchr(blacklist,'q')) mHasFramebufferObject = FALSE;//S
if (strchr(blacklist,'r')) mHasDrawBuffers = FALSE;//S
- if (strchr(blacklist,'s')) mHasFramebufferMultisample = FALSE;
- if (strchr(blacklist,'t')) mHasTextureRectangle = FALSE;
- if (strchr(blacklist,'u')) mHasBlendFuncSeparate = FALSE;//S
- if (strchr(blacklist,'v')) mHasDepthClamp = FALSE;
+ if (strchr(blacklist,'s')) mHasTextureRectangle = FALSE;
+ if (strchr(blacklist,'t')) mHasBlendFuncSeparate = FALSE;//S
+ if (strchr(blacklist,'u')) mHasDepthClamp = FALSE;
}
#endif // LL_LINUX || LL_SOLARIS
@@ -795,6 +1062,10 @@ void LLGLManager::initExtensions()
{
LL_INFOS("RenderInit") << "Couldn't initialize GL_ARB_occlusion_query" << LL_ENDL;
}
+ if (!mHasOcclusionQuery2)
+ {
+ LL_INFOS("RenderInit") << "Couldn't initialize GL_ARB_occlusion_query2" << LL_ENDL;
+ }
if (!mHasPointParameters)
{
LL_INFOS("RenderInit") << "Couldn't initialize GL_ARB_point_parameters" << LL_ENDL;
@@ -826,11 +1097,13 @@ void LLGLManager::initExtensions()
LL_INFOS("RenderInit") << "Disabling mip-map generation for Intel GPUs" << LL_ENDL;
mHasMipMapGeneration = FALSE;
}
+#if !LL_DARWIN
if (mIsATI && mHasMipMapGeneration)
{
LL_INFOS("RenderInit") << "Disabling mip-map generation for ATI GPUs (performance opt)" << LL_ENDL;
mHasMipMapGeneration = FALSE;
}
+#endif
// Misc
glGetIntegerv(GL_MAX_ELEMENTS_VERTICES, (GLint*) &mGLMaxVertexRange);
@@ -859,31 +1132,51 @@ void LLGLManager::initExtensions()
mHasVertexBufferObject = FALSE;
}
}
+ if (mHasVertexArrayObject)
+ {
+ glBindVertexArray = (PFNGLBINDVERTEXARRAYPROC) GLH_EXT_GET_PROC_ADDRESS("glBindVertexArray");
+ glDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSPROC) GLH_EXT_GET_PROC_ADDRESS("glDeleteVertexArrays");
+ glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC) GLH_EXT_GET_PROC_ADDRESS("glGenVertexArrays");
+ glIsVertexArray = (PFNGLISVERTEXARRAYPROC) GLH_EXT_GET_PROC_ADDRESS("glIsVertexArray");
+ }
+ if (mHasSync)
+ {
+ glFenceSync = (PFNGLFENCESYNCPROC) GLH_EXT_GET_PROC_ADDRESS("glFenceSync");
+ glIsSync = (PFNGLISSYNCPROC) GLH_EXT_GET_PROC_ADDRESS("glIsSync");
+ glDeleteSync = (PFNGLDELETESYNCPROC) GLH_EXT_GET_PROC_ADDRESS("glDeleteSync");
+ glClientWaitSync = (PFNGLCLIENTWAITSYNCPROC) GLH_EXT_GET_PROC_ADDRESS("glClientWaitSync");
+ glWaitSync = (PFNGLWAITSYNCPROC) GLH_EXT_GET_PROC_ADDRESS("glWaitSync");
+ glGetInteger64v = (PFNGLGETINTEGER64VPROC) GLH_EXT_GET_PROC_ADDRESS("glGetInteger64v");
+ glGetSynciv = (PFNGLGETSYNCIVPROC) GLH_EXT_GET_PROC_ADDRESS("glGetSynciv");
+ }
+ if (mHasMapBufferRange)
+ {
+ glMapBufferRange = (PFNGLMAPBUFFERRANGEPROC) GLH_EXT_GET_PROC_ADDRESS("glMapBufferRange");
+ glFlushMappedBufferRange = (PFNGLFLUSHMAPPEDBUFFERRANGEPROC) GLH_EXT_GET_PROC_ADDRESS("glFlushMappedBufferRange");
+ }
if (mHasFramebufferObject)
{
llinfos << "initExtensions() FramebufferObject-related procs..." << llendl;
- glIsRenderbufferEXT = (PFNGLISRENDERBUFFEREXTPROC) GLH_EXT_GET_PROC_ADDRESS("glIsRenderbufferEXT");
- glBindRenderbufferEXT = (PFNGLBINDRENDERBUFFEREXTPROC) GLH_EXT_GET_PROC_ADDRESS("glBindRenderbufferEXT");
- glDeleteRenderbuffersEXT = (PFNGLDELETERENDERBUFFERSEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glDeleteRenderbuffersEXT");
- glGenRenderbuffersEXT = (PFNGLGENRENDERBUFFERSEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glGenRenderbuffersEXT");
- glRenderbufferStorageEXT = (PFNGLRENDERBUFFERSTORAGEEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glRenderbufferStorageEXT");
- glGetRenderbufferParameterivEXT = (PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glGetRenderbufferParameterivEXT");
- glIsFramebufferEXT = (PFNGLISFRAMEBUFFEREXTPROC) GLH_EXT_GET_PROC_ADDRESS("glIsFramebufferEXT");
- glBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC) GLH_EXT_GET_PROC_ADDRESS("glBindFramebufferEXT");
- glDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glDeleteFramebuffersEXT");
- glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glGenFramebuffersEXT");
- glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glCheckFramebufferStatusEXT");
- glFramebufferTexture1DEXT = (PFNGLFRAMEBUFFERTEXTURE1DEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glFramebufferTexture1DEXT");
- glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glFramebufferTexture2DEXT");
- glFramebufferTexture3DEXT = (PFNGLFRAMEBUFFERTEXTURE3DEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glFramebufferTexture3DEXT");
- glFramebufferRenderbufferEXT = (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) GLH_EXT_GET_PROC_ADDRESS("glFramebufferRenderbufferEXT");
- glGetFramebufferAttachmentParameterivEXT = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glGetFramebufferAttachmentParameterivEXT");
- glGenerateMipmapEXT = (PFNGLGENERATEMIPMAPEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glGenerateMipmapEXT");
- }
- if (mHasFramebufferMultisample)
- {
- glRenderbufferStorageMultisampleEXT = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glRenderbufferStorageMultisampleEXT");
- glBlitFramebufferEXT = (PFNGLBLITFRAMEBUFFEREXTPROC) GLH_EXT_GET_PROC_ADDRESS("glBlitFramebufferEXT");
+ glIsRenderbuffer = (PFNGLISRENDERBUFFERPROC) GLH_EXT_GET_PROC_ADDRESS("glIsRenderbuffer");
+ glBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC) GLH_EXT_GET_PROC_ADDRESS("glBindRenderbuffer");
+ glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC) GLH_EXT_GET_PROC_ADDRESS("glDeleteRenderbuffers");
+ glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC) GLH_EXT_GET_PROC_ADDRESS("glGenRenderbuffers");
+ glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC) GLH_EXT_GET_PROC_ADDRESS("glRenderbufferStorage");
+ glGetRenderbufferParameteriv = (PFNGLGETRENDERBUFFERPARAMETERIVPROC) GLH_EXT_GET_PROC_ADDRESS("glGetRenderbufferParameteriv");
+ glIsFramebuffer = (PFNGLISFRAMEBUFFERPROC) GLH_EXT_GET_PROC_ADDRESS("glIsFramebuffer");
+ glBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC) GLH_EXT_GET_PROC_ADDRESS("glBindFramebuffer");
+ glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC) GLH_EXT_GET_PROC_ADDRESS("glDeleteFramebuffers");
+ glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC) GLH_EXT_GET_PROC_ADDRESS("glGenFramebuffers");
+ glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC) GLH_EXT_GET_PROC_ADDRESS("glCheckFramebufferStatus");
+ glFramebufferTexture1D = (PFNGLFRAMEBUFFERTEXTURE1DPROC) GLH_EXT_GET_PROC_ADDRESS("glFramebufferTexture1D");
+ glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC) GLH_EXT_GET_PROC_ADDRESS("glFramebufferTexture2D");
+ glFramebufferTexture3D = (PFNGLFRAMEBUFFERTEXTURE3DPROC) GLH_EXT_GET_PROC_ADDRESS("glFramebufferTexture3D");
+ glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC) GLH_EXT_GET_PROC_ADDRESS("glFramebufferRenderbuffer");
+ glGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) GLH_EXT_GET_PROC_ADDRESS("glGetFramebufferAttachmentParameteriv");
+ glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC) GLH_EXT_GET_PROC_ADDRESS("glGenerateMipmap");
+ glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC) GLH_EXT_GET_PROC_ADDRESS("glBlitFramebuffer");
+ glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) GLH_EXT_GET_PROC_ADDRESS("glRenderbufferStorageMultisample");
+ glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC) GLH_EXT_GET_PROC_ADDRESS("glFramebufferTextureLayer");
}
if (mHasDrawBuffers)
{
@@ -893,6 +1186,20 @@ void LLGLManager::initExtensions()
{
glBlendFuncSeparateEXT = (PFNGLBLENDFUNCSEPARATEEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glBlendFuncSeparateEXT");
}
+ if (mHasTextureMultisample)
+ {
+ glTexImage2DMultisample = (PFNGLTEXIMAGE2DMULTISAMPLEPROC) GLH_EXT_GET_PROC_ADDRESS("glTexImage2DMultisample");
+ glTexImage3DMultisample = (PFNGLTEXIMAGE3DMULTISAMPLEPROC) GLH_EXT_GET_PROC_ADDRESS("glTexImage3DMultisample");
+ glGetMultisamplefv = (PFNGLGETMULTISAMPLEFVPROC) GLH_EXT_GET_PROC_ADDRESS("glGetMultisamplefv");
+ glSampleMaski = (PFNGLSAMPLEMASKIPROC) GLH_EXT_GET_PROC_ADDRESS("glSampleMaski");
+ }
+ if (mHasDebugOutput)
+ {
+ glDebugMessageControlARB = (PFNGLDEBUGMESSAGECONTROLARBPROC) GLH_EXT_GET_PROC_ADDRESS("glDebugMessageControlARB");
+ glDebugMessageInsertARB = (PFNGLDEBUGMESSAGEINSERTARBPROC) GLH_EXT_GET_PROC_ADDRESS("glDebugMessageInsertARB");
+ glDebugMessageCallbackARB = (PFNGLDEBUGMESSAGECALLBACKARBPROC) GLH_EXT_GET_PROC_ADDRESS("glDebugMessageCallbackARB");
+ glGetDebugMessageLogARB = (PFNGLGETDEBUGMESSAGELOGARBPROC) GLH_EXT_GET_PROC_ADDRESS("glGetDebugMessageLogARB");
+ }
#if (!LL_LINUX && !LL_SOLARIS) || LL_LINUX_NV_GL_HEADERS
// This is expected to be a static symbol on Linux GL implementations, except if we use the nvidia headers - bah
glDrawRangeElements = (PFNGLDRAWRANGEELEMENTSPROC)GLH_EXT_GET_PROC_ADDRESS("glDrawRangeElements");
@@ -1011,6 +1318,7 @@ void LLGLManager::initExtensions()
glVertexAttrib4uivARB = (PFNGLVERTEXATTRIB4UIVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4uivARB");
glVertexAttrib4usvARB = (PFNGLVERTEXATTRIB4USVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib4usvARB");
glVertexAttribPointerARB = (PFNGLVERTEXATTRIBPOINTERARBPROC) GLH_EXT_GET_PROC_ADDRESS("glVertexAttribPointerARB");
+ glVertexAttribIPointer = (PFNGLVERTEXATTRIBIPOINTERPROC) GLH_EXT_GET_PROC_ADDRESS("glVertexAttribIPointer");
glEnableVertexAttribArrayARB = (PFNGLENABLEVERTEXATTRIBARRAYARBPROC) GLH_EXT_GET_PROC_ADDRESS("glEnableVertexAttribArrayARB");
glDisableVertexAttribArrayARB = (PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) GLH_EXT_GET_PROC_ADDRESS("glDisableVertexAttribArrayARB");
glProgramStringARB = (PFNGLPROGRAMSTRINGARBPROC) GLH_EXT_GET_PROC_ADDRESS("glProgramStringARB");
@@ -1047,7 +1355,7 @@ void rotate_quat(LLQuaternion& rotation)
{
F32 angle_radians, x, y, z;
rotation.getAngleAxis(&angle_radians, &x, &y, &z);
- glRotatef(angle_radians * RAD_TO_DEG, x, y, z);
+ gGL.rotatef(angle_radians * RAD_TO_DEG, x, y, z);
}
void flush_glerror()
@@ -1084,10 +1392,6 @@ void log_glerror()
void do_assert_glerror()
{
- if (LL_UNLIKELY(!gGLManager.mInited))
- {
- LL_ERRS("RenderInit") << "GL not initialized" << LL_ENDL;
- }
// Create or update texture to be used with this data
GLenum error;
error = glGetError();
@@ -1145,7 +1449,7 @@ void assert_glerror()
}
}
- if (!gNoRender && gDebugGL)
+ if (gDebugGL)
{
do_assert_glerror();
}
@@ -1180,11 +1484,6 @@ void LLGLState::initClass()
//make sure multisample defaults to disabled
sStateMap[GL_MULTISAMPLE_ARB] = GL_FALSE;
glDisable(GL_MULTISAMPLE_ARB);
-
- sStateMap[GL_MULTISAMPLE_ARB] = GL_FALSE;
- glDisable(GL_MULTISAMPLE_ARB);
-
- glEnableClientState(GL_VERTEX_ARRAY);
}
//static
@@ -1234,6 +1533,8 @@ void LLGLState::checkStates(const std::string& msg)
glGetIntegerv(GL_BLEND_SRC, &src);
glGetIntegerv(GL_BLEND_DST, &dst);
+ stop_glerror();
+
BOOL error = FALSE;
if (src != GL_SRC_ALPHA || dst != GL_ONE_MINUS_SRC_ALPHA)
@@ -1254,7 +1555,9 @@ void LLGLState::checkStates(const std::string& msg)
{
LLGLenum state = iter->first;
LLGLboolean cur_state = iter->second;
+ stop_glerror();
LLGLboolean gl_state = glIsEnabled(state);
+ stop_glerror();
if(cur_state != gl_state)
{
dumpStates();
@@ -1279,11 +1582,11 @@ void LLGLState::checkStates(const std::string& msg)
void LLGLState::checkTextureChannels(const std::string& msg)
{
+#if 0
if (!gDebugGL)
{
return;
}
-
stop_glerror();
GLint activeTexture;
@@ -1310,10 +1613,6 @@ void LLGLState::checkTextureChannels(const std::string& msg)
}
}
- GLint maxTextureUnits = 0;
- glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, &maxTextureUnits);
- stop_glerror();
-
static const char* label[] =
{
"GL_TEXTURE_2D",
@@ -1324,7 +1623,8 @@ void LLGLState::checkTextureChannels(const std::string& msg)
"GL_TEXTURE_GEN_T",
"GL_TEXTURE_GEN_Q",
"GL_TEXTURE_GEN_R",
- "GL_TEXTURE_RECTANGLE_ARB"
+ "GL_TEXTURE_RECTANGLE_ARB",
+ "GL_TEXTURE_2D_MULTISAMPLE"
};
static GLint value[] =
@@ -1337,7 +1637,8 @@ void LLGLState::checkTextureChannels(const std::string& msg)
GL_TEXTURE_GEN_T,
GL_TEXTURE_GEN_Q,
GL_TEXTURE_GEN_R,
- GL_TEXTURE_RECTANGLE_ARB
+ GL_TEXTURE_RECTANGLE_ARB,
+ GL_TEXTURE_2D_MULTISAMPLE
};
GLint stackDepth = 0;
@@ -1346,68 +1647,96 @@ void LLGLState::checkTextureChannels(const std::string& msg)
glh::matrix4f identity;
identity.identity();
- for (GLint i = 1; i < maxTextureUnits; i++)
+ for (GLint i = 1; i < gGLManager.mNumTextureUnits; i++)
{
gGL.getTexUnit(i)->activate();
- glClientActiveTextureARB(GL_TEXTURE0_ARB+i);
- stop_glerror();
- glGetIntegerv(GL_TEXTURE_STACK_DEPTH, &stackDepth);
- stop_glerror();
- if (stackDepth != 1)
+ if (i < gGLManager.mNumTextureUnits)
{
- error = TRUE;
- LL_WARNS("RenderState") << "Texture matrix stack corrupted." << LL_ENDL;
+ glClientActiveTextureARB(GL_TEXTURE0_ARB+i);
+ stop_glerror();
+ glGetIntegerv(GL_TEXTURE_STACK_DEPTH, &stackDepth);
+ stop_glerror();
- if (gDebugSession)
+ if (stackDepth != 1)
{
- gFailLog << "Texture matrix stack corrupted." << std::endl;
+ error = TRUE;
+ LL_WARNS("RenderState") << "Texture matrix stack corrupted." << LL_ENDL;
+
+ if (gDebugSession)
+ {
+ gFailLog << "Texture matrix stack corrupted." << std::endl;
+ }
}
- }
- glGetFloatv(GL_TEXTURE_MATRIX, (GLfloat*) mat.m);
- stop_glerror();
+ glGetFloatv(GL_TEXTURE_MATRIX, (GLfloat*) mat.m);
+ stop_glerror();
- if (mat != identity)
- {
- error = TRUE;
- LL_WARNS("RenderState") << "Texture matrix in channel " << i << " corrupt." << LL_ENDL;
- if (gDebugSession)
+ if (mat != identity)
+ {
+ error = TRUE;
+ LL_WARNS("RenderState") << "Texture matrix in channel " << i << " corrupt." << LL_ENDL;
+ if (gDebugSession)
+ {
+ gFailLog << "Texture matrix in channel " << i << " corrupt." << std::endl;
+ }
+ }
+
+ for (S32 j = (i == 0 ? 1 : 0);
+ j < 9; j++)
{
- gFailLog << "Texture matrix in channel " << i << " corrupt." << std::endl;
+ if (j == 8 && !gGLManager.mHasTextureRectangle ||
+ j == 9 && !gGLManager.mHasTextureMultisample)
+ {
+ continue;
+ }
+
+ if (glIsEnabled(value[j]))
+ {
+ error = TRUE;
+ LL_WARNS("RenderState") << "Texture channel " << i << " still has " << label[j] << " enabled." << LL_ENDL;
+ if (gDebugSession)
+ {
+ gFailLog << "Texture channel " << i << " still has " << label[j] << " enabled." << std::endl;
+ }
+ }
+ stop_glerror();
}
- }
-
- for (S32 j = (i == 0 ? 1 : 0);
- j < (gGLManager.mHasTextureRectangle ? 9 : 8); j++)
- {
- if (glIsEnabled(value[j]))
+ glGetFloatv(GL_TEXTURE_MATRIX, mat.m);
+ stop_glerror();
+
+ if (mat != identity)
{
error = TRUE;
- LL_WARNS("RenderState") << "Texture channel " << i << " still has " << label[j] << " enabled." << LL_ENDL;
+ LL_WARNS("RenderState") << "Texture matrix " << i << " is not identity." << LL_ENDL;
if (gDebugSession)
{
- gFailLog << "Texture channel " << i << " still has " << label[j] << " enabled." << std::endl;
+ gFailLog << "Texture matrix " << i << " is not identity." << std::endl;
}
}
- stop_glerror();
}
- glGetFloatv(GL_TEXTURE_MATRIX, mat.m);
- stop_glerror();
-
- if (mat != identity)
{
- error = TRUE;
- LL_WARNS("RenderState") << "Texture matrix " << i << " is not identity." << LL_ENDL;
- if (gDebugSession)
+ GLint tex = 0;
+ stop_glerror();
+ glGetIntegerv(GL_TEXTURE_BINDING_2D, &tex);
+ stop_glerror();
+
+ if (tex != 0)
{
- gFailLog << "Texture matrix " << i << " is not identity." << std::endl;
+ error = TRUE;
+ LL_WARNS("RenderState") << "Texture channel " << i << " still has texture " << tex << " bound." << llendl;
+
+ if (gDebugSession)
+ {
+ gFailLog << "Texture channel " << i << " still has texture " << tex << " bound." << std::endl;
+ }
}
}
}
+ stop_glerror();
gGL.getTexUnit(0)->activate();
glClientActiveTextureARB(GL_TEXTURE0_ARB);
stop_glerror();
@@ -1423,11 +1752,12 @@ void LLGLState::checkTextureChannels(const std::string& msg)
LL_GL_ERRS << "GL texture state corruption detected. " << msg << LL_ENDL;
}
}
+#endif
}
void LLGLState::checkClientArrays(const std::string& msg, U32 data_mask)
{
- if (!gDebugGL)
+ if (!gDebugGL || LLGLSLShader::sNoFixedFunction)
{
return;
}
@@ -1448,7 +1778,7 @@ void LLGLState::checkClientArrays(const std::string& msg, U32 data_mask)
error = TRUE;
}
- glGetIntegerv(GL_ACTIVE_TEXTURE_ARB, &active_texture);
+ /*glGetIntegerv(GL_ACTIVE_TEXTURE_ARB, &active_texture);
if (active_texture != GL_TEXTURE0_ARB)
{
llwarns << "Active texture corrupted: " << active_texture << llendl;
@@ -1457,7 +1787,7 @@ void LLGLState::checkClientArrays(const std::string& msg, U32 data_mask)
gFailLog << "Active texture corrupted: " << active_texture << std::endl;
}
error = TRUE;
- }
+ }*/
static const char* label[] =
{
@@ -1484,7 +1814,7 @@ void LLGLState::checkClientArrays(const std::string& msg, U32 data_mask)
};
- for (S32 j = 0; j < 4; j++)
+ for (S32 j = 1; j < 4; j++)
{
if (glIsEnabled(value[j]))
{
@@ -1539,7 +1869,7 @@ void LLGLState::checkClientArrays(const std::string& msg, U32 data_mask)
}
}
- if (glIsEnabled(GL_TEXTURE_2D))
+ /*if (glIsEnabled(GL_TEXTURE_2D))
{
if (!(data_mask & 0x0008))
{
@@ -1562,7 +1892,7 @@ void LLGLState::checkClientArrays(const std::string& msg, U32 data_mask)
gFailLog << "GL does not have GL_TEXTURE_2D enabled on channel 1." << std::endl;
}
}
- }
+ }*/
glClientActiveTextureARB(GL_TEXTURE0_ARB);
gGL.getTexUnit(0)->activate();
@@ -1605,8 +1935,27 @@ void LLGLState::checkClientArrays(const std::string& msg, U32 data_mask)
LLGLState::LLGLState(LLGLenum state, S32 enabled) :
mState(state), mWasEnabled(FALSE), mIsEnabled(FALSE)
{
+ if (LLGLSLShader::sNoFixedFunction)
+ { //always ignore state that's deprecated post GL 3.0
+ switch (state)
+ {
+ case GL_ALPHA_TEST:
+ case GL_NORMALIZE:
+ case GL_TEXTURE_GEN_R:
+ case GL_TEXTURE_GEN_S:
+ case GL_TEXTURE_GEN_T:
+ case GL_TEXTURE_GEN_Q:
+ case GL_LIGHTING:
+ case GL_COLOR_MATERIAL:
+ case GL_FOG:
+ case GL_LINE_STIPPLE:
+ mState = 0;
+ break;
+ }
+ }
+
stop_glerror();
- if (state)
+ if (mState)
{
mWasEnabled = sStateMap[state];
llassert(mWasEnabled == glIsEnabled(state));
@@ -1688,79 +2037,6 @@ void LLGLManager::initGLStates()
////////////////////////////////////////////////////////////////////////////////
-void enable_vertex_weighting(const S32 index)
-{
-#if GL_ARB_vertex_program
- if (index > 0) glEnableVertexAttribArrayARB(index); // vertex weights
-#endif
-}
-
-void disable_vertex_weighting(const S32 index)
-{
-#if GL_ARB_vertex_program
- if (index > 0) glDisableVertexAttribArrayARB(index); // vertex weights
-#endif
-}
-
-void enable_binormals(const S32 index)
-{
-#if GL_ARB_vertex_program
- if (index > 0)
- {
- glEnableVertexAttribArrayARB(index); // binormals
- }
-#endif
-}
-
-void disable_binormals(const S32 index)
-{
-#if GL_ARB_vertex_program
- if (index > 0)
- {
- glDisableVertexAttribArrayARB(index); // binormals
- }
-#endif
-}
-
-
-void enable_cloth_weights(const S32 index)
-{
-#if GL_ARB_vertex_program
- if (index > 0) glEnableVertexAttribArrayARB(index);
-#endif
-}
-
-void disable_cloth_weights(const S32 index)
-{
-#if GL_ARB_vertex_program
- if (index > 0) glDisableVertexAttribArrayARB(index);
-#endif
-}
-
-void set_vertex_weights(const S32 index, const U32 stride, const F32 *weights)
-{
-#if GL_ARB_vertex_program
- if (index > 0) glVertexAttribPointerARB(index, 1, GL_FLOAT, FALSE, stride, weights);
- stop_glerror();
-#endif
-}
-
-void set_vertex_clothing_weights(const S32 index, const U32 stride, const LLVector4 *weights)
-{
-#if GL_ARB_vertex_program
- if (index > 0) glVertexAttribPointerARB(index, 4, GL_FLOAT, TRUE, stride, weights);
- stop_glerror();
-#endif
-}
-
-void set_binormals(const S32 index, const U32 stride,const LLVector3 *binormals)
-{
-#if GL_ARB_vertex_program
- if (index > 0) glVertexAttribPointerARB(index, 3, GL_FLOAT, FALSE, stride, binormals);
- stop_glerror();
-#endif
-}
-
void parse_gl_version( S32* major, S32* minor, S32* release, std::string* vendor_specific )
{
// GL_VERSION returns a null-terminated string with the format:
@@ -1841,12 +2117,66 @@ void parse_gl_version( S32* major, S32* minor, S32* release, std::string* vendor
}
}
-LLGLUserClipPlane::LLGLUserClipPlane(const LLPlane& p, const glh::matrix4f& modelview, const glh::matrix4f& projection)
+
+void parse_glsl_version(S32& major, S32& minor)
+{
+ // GL_SHADING_LANGUAGE_VERSION returns a null-terminated string with the format:
+ // <major>.<minor>[.<release>] [<vendor specific>]
+
+ const char* version = (const char*) glGetString(GL_SHADING_LANGUAGE_VERSION);
+ major = 0;
+ minor = 0;
+
+ if( !version )
+ {
+ return;
+ }
+
+ std::string ver_copy( version );
+ S32 len = (S32)strlen( version ); /* Flawfinder: ignore */
+ S32 i = 0;
+ S32 start;
+ // Find the major version
+ start = i;
+ for( ; i < len; i++ )
+ {
+ if( '.' == version[i] )
+ {
+ break;
+ }
+ }
+ std::string major_str = ver_copy.substr(start,i-start);
+ LLStringUtil::convertToS32(major_str, major);
+
+ if( '.' == version[i] )
+ {
+ i++;
+ }
+
+ // Find the minor version
+ start = i;
+ for( ; i < len; i++ )
+ {
+ if( ('.' == version[i]) || isspace(version[i]) )
+ {
+ break;
+ }
+ }
+ std::string minor_str = ver_copy.substr(start,i-start);
+ LLStringUtil::convertToS32(minor_str, minor);
+}
+
+LLGLUserClipPlane::LLGLUserClipPlane(const LLPlane& p, const glh::matrix4f& modelview, const glh::matrix4f& projection, bool apply)
{
- mModelview = modelview;
- mProjection = projection;
+ mApply = apply;
- setPlane(p.mV[0], p.mV[1], p.mV[2], p.mV[3]);
+ if (mApply)
+ {
+ mModelview = modelview;
+ mProjection = projection;
+
+ setPlane(p[0], p[1], p[2], p[3]);
+ }
}
void LLGLUserClipPlane::setPlane(F32 a, F32 b, F32 c, F32 d)
@@ -1868,40 +2198,29 @@ void LLGLUserClipPlane::setPlane(F32 a, F32 b, F32 c, F32 d)
glh::matrix4f suffix;
suffix.set_row(2, cplane);
glh::matrix4f newP = suffix * P;
- glMatrixMode(GL_PROJECTION);
- glPushMatrix();
- glLoadMatrixf(newP.m);
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.pushMatrix();
+ gGL.loadMatrix(newP.m);
gGLObliqueProjectionInverse = LLMatrix4(newP.inverse().transpose().m);
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
}
LLGLUserClipPlane::~LLGLUserClipPlane()
{
- glMatrixMode(GL_PROJECTION);
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW);
+ if (mApply)
+ {
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.popMatrix();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ }
}
LLGLNamePool::LLGLNamePool()
{
}
-void LLGLNamePool::registerPool(LLGLNamePool* pool)
-{
- pool_list_t::iterator iter = std::find(sInstances.begin(), sInstances.end(), pool);
- if (iter == sInstances.end())
- {
- sInstances.push_back(pool);
- }
-}
-
LLGLNamePool::~LLGLNamePool()
{
- pool_list_t::iterator iter = std::find(sInstances.begin(), sInstances.end(), this);
- if (iter != sInstances.end())
- {
- sInstances.erase(iter);
- }
}
void LLGLNamePool::upkeep()
@@ -1970,20 +2289,20 @@ void LLGLNamePool::release(GLuint name)
void LLGLNamePool::upkeepPools()
{
LLMemType mt(LLMemType::MTYPE_UPKEEP_POOLS);
- for (pool_list_t::iterator iter = sInstances.begin(); iter != sInstances.end(); ++iter)
+ for (tracker_t::instance_iter iter = beginInstances(); iter != endInstances(); ++iter)
{
- LLGLNamePool* pool = *iter;
- pool->upkeep();
+ LLGLNamePool & pool = *iter;
+ pool.upkeep();
}
}
//static
void LLGLNamePool::cleanupPools()
{
- for (pool_list_t::iterator iter = sInstances.begin(); iter != sInstances.end(); ++iter)
+ for (tracker_t::instance_iter iter = beginInstances(); iter != endInstances(); ++iter)
{
- LLGLNamePool* pool = *iter;
- pool->cleanup();
+ LLGLNamePool & pool = *iter;
+ pool.cleanup();
}
}
@@ -2072,23 +2391,26 @@ void LLGLDepthTest::checkState()
}
}
-LLGLSquashToFarClip::LLGLSquashToFarClip(glh::matrix4f P)
+LLGLSquashToFarClip::LLGLSquashToFarClip(glh::matrix4f P, U32 layer)
{
+
+ F32 depth = 0.99999f - 0.0001f * layer;
+
for (U32 i = 0; i < 4; i++)
{
- P.element(2, i) = P.element(3, i) * 0.99999f;
+ P.element(2, i) = P.element(3, i) * depth;
}
- glMatrixMode(GL_PROJECTION);
- glPushMatrix();
- glLoadMatrixf(P.m);
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.pushMatrix();
+ gGL.loadMatrix(P.m);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
}
LLGLSquashToFarClip::~LLGLSquashToFarClip()
{
- glMatrixMode(GL_PROJECTION);
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.popMatrix();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
}
diff --git a/indra/llrender/llgl.h b/indra/llrender/llgl.h
index 85fab7a0f8..5a33c98708 100644
--- a/indra/llrender/llgl.h
+++ b/indra/llrender/llgl.h
@@ -40,6 +40,7 @@
#include "v4math.h"
#include "llplane.h"
#include "llgltypes.h"
+#include "llinstancetracker.h"
#include "llglheaders.h"
#include "glh/glh_linear.h"
@@ -76,29 +77,43 @@ public:
// Extensions used by everyone
BOOL mHasMultitexture;
+ BOOL mHasATIMemInfo;
+ BOOL mHasNVXMemInfo;
S32 mNumTextureUnits;
BOOL mHasMipMapGeneration;
BOOL mHasCompressedTextures;
BOOL mHasFramebufferObject;
- BOOL mHasFramebufferMultisample;
+ S32 mMaxSamples;
BOOL mHasBlendFuncSeparate;
-
+
// ARB Extensions
BOOL mHasVertexBufferObject;
+ BOOL mHasVertexArrayObject;
+ BOOL mHasSync;
+ BOOL mHasMapBufferRange;
+ BOOL mHasFlushBufferRange;
BOOL mHasPBuffer;
BOOL mHasShaderObjects;
BOOL mHasVertexShader;
BOOL mHasFragmentShader;
+ S32 mNumTextureImageUnits;
BOOL mHasOcclusionQuery;
+ BOOL mHasOcclusionQuery2;
BOOL mHasPointParameters;
BOOL mHasDrawBuffers;
BOOL mHasDepthClamp;
BOOL mHasTextureRectangle;
+ BOOL mHasTextureMultisample;
+ S32 mMaxSampleMaskWords;
+ S32 mMaxColorTextureSamples;
+ S32 mMaxDepthTextureSamples;
+ S32 mMaxIntegerSamples;
// Other extensions.
BOOL mHasAnisotropic;
BOOL mHasARBEnvCombine;
BOOL mHasCubeMap;
+ BOOL mHasDebugOutput;
// Vendor-specific extensions
BOOL mIsATI;
@@ -123,6 +138,8 @@ public:
S32 mDriverVersionMinor;
S32 mDriverVersionRelease;
F32 mGLVersion; // e.g = 1.4
+ S32 mGLSLVersionMajor;
+ S32 mGLSLVersionMinor;
std::string mDriverVersionVendorString;
S32 mVRAM; // VRAM in MB
@@ -238,7 +255,7 @@ public:
static void dumpStates();
static void checkStates(const std::string& msg = "");
static void checkTextureChannels(const std::string& msg = "");
- static void checkClientArrays(const std::string& msg = "", U32 data_mask = 0x0001);
+ static void checkClientArrays(const std::string& msg = "", U32 data_mask = 0);
protected:
static boost::unordered_map<LLGLenum, LLGLboolean> sStateMap;
@@ -299,12 +316,14 @@ class LLGLUserClipPlane
{
public:
- LLGLUserClipPlane(const LLPlane& plane, const glh::matrix4f& modelview, const glh::matrix4f& projection);
+ LLGLUserClipPlane(const LLPlane& plane, const glh::matrix4f& modelview, const glh::matrix4f& projection, bool apply = true);
~LLGLUserClipPlane();
void setPlane(F32 a, F32 b, F32 c, F32 d);
private:
+ bool mApply;
+
glh::matrix4f mProjection;
glh::matrix4f mModelview;
};
@@ -320,7 +339,7 @@ private:
class LLGLSquashToFarClip
{
public:
- LLGLSquashToFarClip(glh::matrix4f projection);
+ LLGLSquashToFarClip(glh::matrix4f projection, U32 layer = 0);
~LLGLSquashToFarClip();
};
@@ -328,9 +347,11 @@ public:
Generic pooling scheme for things which use GL names (used for occlusion queries and vertex buffer objects).
Prevents thrashing of GL name caches by avoiding calls to glGenFoo and glDeleteFoo.
*/
-class LLGLNamePool
+class LLGLNamePool : public LLInstanceTracker<LLGLNamePool>
{
public:
+ typedef LLInstanceTracker<LLGLNamePool> tracker_t;
+
struct NameEntry
{
GLuint name;
@@ -357,13 +378,11 @@ public:
GLuint allocate();
void release(GLuint name);
- static void registerPool(LLGLNamePool* pool);
static void upkeepPools();
static void cleanupPools();
protected:
typedef std::vector<LLGLNamePool*> pool_list_t;
- static pool_list_t sInstances;
virtual GLuint allocateName() = 0;
virtual void releaseName(GLuint name) = 0;
@@ -403,19 +422,74 @@ extern LLMatrix4 gGLObliqueProjectionInverse;
#include "llglstates.h"
void init_glstates();
-void enable_vertex_weighting(const S32 index);
-void disable_vertex_weighting(const S32 index);
-void enable_binormals(const S32 index);
-void disable_binormals(const S32 index);
-void enable_cloth_weights(const S32 index);
-void disable_cloth_weights(const S32 index);
-void set_vertex_weights(const S32 index, const U32 stride, const F32 *weights);
-void set_vertex_clothing_weights(const S32 index, const U32 stride, const LLVector4 *weights);
-void set_binormals(const S32 index, const U32 stride, const LLVector3 *binormals);
+
void parse_gl_version( S32* major, S32* minor, S32* release, std::string* vendor_specific );
extern BOOL gClothRipple;
-extern BOOL gNoRender;
+extern BOOL gHeadlessClient;
extern BOOL gGLActive;
+// Deal with changing glext.h definitions for newer SDK versions, specifically
+// with MAC OSX 10.5 -> 10.6
+
+
+#ifndef GL_DEPTH_ATTACHMENT
+#define GL_DEPTH_ATTACHMENT GL_DEPTH_ATTACHMENT_EXT
+#endif
+
+#ifndef GL_STENCIL_ATTACHMENT
+#define GL_STENCIL_ATTACHMENT GL_STENCIL_ATTACHMENT_EXT
+#endif
+
+#ifndef GL_FRAMEBUFFER
+#define GL_FRAMEBUFFER GL_FRAMEBUFFER_EXT
+#define GL_DRAW_FRAMEBUFFER GL_DRAW_FRAMEBUFFER_EXT
+#define GL_READ_FRAMEBUFFER GL_READ_FRAMEBUFFER_EXT
+#define GL_FRAMEBUFFER_COMPLETE GL_FRAMEBUFFER_COMPLETE_EXT
+#define GL_FRAMEBUFFER_UNSUPPORTED GL_FRAMEBUFFER_UNSUPPORTED_EXT
+#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT
+#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT
+#define glGenFramebuffers glGenFramebuffersEXT
+#define glBindFramebuffer glBindFramebufferEXT
+#define glCheckFramebufferStatus glCheckFramebufferStatusEXT
+#define glBlitFramebuffer glBlitFramebufferEXT
+#define glDeleteFramebuffers glDeleteFramebuffersEXT
+#define glFramebufferRenderbuffer glFramebufferRenderbufferEXT
+#define glFramebufferTexture2D glFramebufferTexture2DEXT
+#endif
+
+#ifndef GL_RENDERBUFFER
+#define GL_RENDERBUFFER GL_RENDERBUFFER_EXT
+#define glGenRenderbuffers glGenRenderbuffersEXT
+#define glBindRenderbuffer glBindRenderbufferEXT
+#define glRenderbufferStorage glRenderbufferStorageEXT
+#define glRenderbufferStorageMultisample glRenderbufferStorageMultisampleEXT
+#define glDeleteRenderbuffers glDeleteRenderbuffersEXT
+#endif
+
+#ifndef GL_COLOR_ATTACHMENT
+#define GL_COLOR_ATTACHMENT GL_COLOR_ATTACHMENT_EXT
+#endif
+
+#ifndef GL_COLOR_ATTACHMENT0
+#define GL_COLOR_ATTACHMENT0 GL_COLOR_ATTACHMENT0_EXT
+#endif
+
+#ifndef GL_COLOR_ATTACHMENT1
+#define GL_COLOR_ATTACHMENT1 GL_COLOR_ATTACHMENT1_EXT
+#endif
+
+#ifndef GL_COLOR_ATTACHMENT2
+#define GL_COLOR_ATTACHMENT2 GL_COLOR_ATTACHMENT2_EXT
+#endif
+
+#ifndef GL_COLOR_ATTACHMENT3
+#define GL_COLOR_ATTACHMENT3 GL_COLOR_ATTACHMENT3_EXT
+#endif
+
+
+#ifndef GL_DEPTH24_STENCIL8
+#define GL_DEPTH24_STENCIL8 GL_DEPTH24_STENCIL8_EXT
+#endif
+
#endif // LL_LLGL_H
diff --git a/indra/llrender/llglheaders.h b/indra/llrender/llglheaders.h
index 576969b81a..d61ec707f0 100644
--- a/indra/llrender/llglheaders.h
+++ b/indra/llrender/llglheaders.h
@@ -1,25 +1,25 @@
-/**
+/**
* @file llglheaders.h
* @brief LLGL definitions
*
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2010, Linden Research, Inc.
- *
+ *
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
- *
+ *
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
+ *
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
@@ -68,6 +68,29 @@ extern PFNGLUNMAPBUFFERARBPROC glUnmapBufferARB;
extern PFNGLGETBUFFERPARAMETERIVARBPROC glGetBufferParameterivARB;
extern PFNGLGETBUFFERPOINTERVARBPROC glGetBufferPointervARB;
+// GL_ARB_vertex_array_object
+extern PFNGLBINDVERTEXARRAYPROC glBindVertexArray;
+extern PFNGLDELETEVERTEXARRAYSPROC glDeleteVertexArrays;
+extern PFNGLGENVERTEXARRAYSPROC glGenVertexArrays;
+extern PFNGLISVERTEXARRAYPROC glIsVertexArray;
+
+// GL_ARB_sync
+extern PFNGLFENCESYNCPROC glFenceSync;
+extern PFNGLISSYNCPROC glIsSync;
+extern PFNGLDELETESYNCPROC glDeleteSync;
+extern PFNGLCLIENTWAITSYNCPROC glClientWaitSync;
+extern PFNGLWAITSYNCPROC glWaitSync;
+extern PFNGLGETINTEGER64VPROC glGetInteger64v;
+extern PFNGLGETSYNCIVPROC glGetSynciv;
+
+// GL_APPLE_flush_buffer_range
+extern PFNGLBUFFERPARAMETERIAPPLEPROC glBufferParameteriAPPLE;
+extern PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC glFlushMappedBufferRangeAPPLE;
+
+// GL_ARB_map_buffer_range
+extern PFNGLMAPBUFFERRANGEPROC glMapBufferRange;
+extern PFNGLFLUSHMAPPEDBUFFERRANGEPROC glFlushMappedBufferRange;
+
// GL_ATI_vertex_array_object
extern PFNGLNEWOBJECTBUFFERATIPROC glNewObjectBufferATI;
extern PFNGLISOBJECTBUFFERATIPROC glIsObjectBufferATI;
@@ -176,6 +199,7 @@ extern PFNGLVERTEXATTRIB4UBVARBPROC glVertexAttrib4ubvARB;
extern PFNGLVERTEXATTRIB4UIVARBPROC glVertexAttrib4uivARB;
extern PFNGLVERTEXATTRIB4USVARBPROC glVertexAttrib4usvARB;
extern PFNGLVERTEXATTRIBPOINTERARBPROC glVertexAttribPointerARB;
+extern PFNGLVERTEXATTRIBIPOINTERPROC glVertexAttribIPointer;
extern PFNGLENABLEVERTEXATTRIBARRAYARBPROC glEnableVertexAttribArrayARB;
extern PFNGLDISABLEVERTEXATTRIBARRAYARBPROC glDisableVertexAttribArrayARB;
extern PFNGLPROGRAMSTRINGARBPROC glProgramStringARB;
@@ -293,6 +317,12 @@ extern PFNGLCLIENTACTIVETEXTUREARBPROC glClientActiveTextureARB;
extern PFNGLDRAWRANGEELEMENTSPROC glDrawRangeElements;
#endif // LL_LINUX_NV_GL_HEADERS
+// GL_ARB_vertex_array_object
+extern PFNGLBINDVERTEXARRAYPROC glBindVertexArray;
+extern PFNGLDELETEVERTEXARRAYSPROC glDeleteVertexArrays;
+extern PFNGLGENVERTEXARRAYSPROC glGenVertexArrays;
+extern PFNGLISVERTEXARRAYPROC glIsVertexArray;
+
// GL_ARB_vertex_buffer_object
extern PFNGLBINDBUFFERARBPROC glBindBufferARB;
extern PFNGLDELETEBUFFERSARBPROC glDeleteBuffersARB;
@@ -306,6 +336,23 @@ extern PFNGLUNMAPBUFFERARBPROC glUnmapBufferARB;
extern PFNGLGETBUFFERPARAMETERIVARBPROC glGetBufferParameterivARB;
extern PFNGLGETBUFFERPOINTERVARBPROC glGetBufferPointervARB;
+// GL_ARB_sync
+extern PFNGLFENCESYNCPROC glFenceSync;
+extern PFNGLISSYNCPROC glIsSync;
+extern PFNGLDELETESYNCPROC glDeleteSync;
+extern PFNGLCLIENTWAITSYNCPROC glClientWaitSync;
+extern PFNGLWAITSYNCPROC glWaitSync;
+extern PFNGLGETINTEGER64VPROC glGetInteger64v;
+extern PFNGLGETSYNCIVPROC glGetSynciv;
+
+// GL_APPLE_flush_buffer_range
+extern PFNGLBUFFERPARAMETERIAPPLEPROC glBufferParameteriAPPLE;
+extern PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC glFlushMappedBufferRangeAPPLE;
+
+// GL_ARB_map_buffer_range
+extern PFNGLMAPBUFFERRANGEPROC glMapBufferRange;
+extern PFNGLFLUSHMAPPEDBUFFERRANGEPROC glFlushMappedBufferRange;
+
// GL_ATI_vertex_array_object
extern PFNGLNEWOBJECTBUFFERATIPROC glNewObjectBufferATI;
extern PFNGLISOBJECTBUFFERATIPROC glIsObjectBufferATI;
@@ -414,6 +461,7 @@ extern PFNGLVERTEXATTRIB4UBVARBPROC glVertexAttrib4ubvARB;
extern PFNGLVERTEXATTRIB4UIVARBPROC glVertexAttrib4uivARB;
extern PFNGLVERTEXATTRIB4USVARBPROC glVertexAttrib4usvARB;
extern PFNGLVERTEXATTRIBPOINTERARBPROC glVertexAttribPointerARB;
+extern PFNGLVERTEXATTRIBIPOINTERPROC glVertexAttribIPointer;
extern PFNGLENABLEVERTEXATTRIBARRAYARBPROC glEnableVertexAttribArrayARB;
extern PFNGLDISABLEVERTEXATTRIBARRAYARBPROC glDisableVertexAttribArrayARB;
extern PFNGLPROGRAMSTRINGARBPROC glProgramStringARB;
@@ -449,34 +497,36 @@ extern PFNGLGETCOMPRESSEDTEXIMAGEARBPROC glGetCompressedTexImageARB;
//GL_EXT_blend_func_separate
extern PFNGLBLENDFUNCSEPARATEEXTPROC glBlendFuncSeparateEXT;
-//GL_EXT_framebuffer_object
-extern PFNGLISRENDERBUFFEREXTPROC glIsRenderbufferEXT;
-extern PFNGLBINDRENDERBUFFEREXTPROC glBindRenderbufferEXT;
-extern PFNGLDELETERENDERBUFFERSEXTPROC glDeleteRenderbuffersEXT;
-extern PFNGLGENRENDERBUFFERSEXTPROC glGenRenderbuffersEXT;
-extern PFNGLRENDERBUFFERSTORAGEEXTPROC glRenderbufferStorageEXT;
-extern PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC glGetRenderbufferParameterivEXT;
-extern PFNGLISFRAMEBUFFEREXTPROC glIsFramebufferEXT;
-extern PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebufferEXT;
-extern PFNGLDELETEFRAMEBUFFERSEXTPROC glDeleteFramebuffersEXT;
-extern PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffersEXT;
-extern PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glCheckFramebufferStatusEXT;
-extern PFNGLFRAMEBUFFERTEXTURE1DEXTPROC glFramebufferTexture1DEXT;
-extern PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glFramebufferTexture2DEXT;
-extern PFNGLFRAMEBUFFERTEXTURE3DEXTPROC glFramebufferTexture3DEXT;
-extern PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC glFramebufferRenderbufferEXT;
-extern PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC glGetFramebufferAttachmentParameterivEXT;
-extern PFNGLGENERATEMIPMAPEXTPROC glGenerateMipmapEXT;
-
-// GL_EXT_framebuffer_multisample
-extern PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC glRenderbufferStorageMultisampleEXT;
-
-// GL_EXT_framebuffer_blit
-extern PFNGLBLITFRAMEBUFFEREXTPROC glBlitFramebufferEXT;
+//GL_ARB_framebuffer_object
+extern PFNGLISRENDERBUFFERPROC glIsRenderbuffer;
+extern PFNGLBINDRENDERBUFFERPROC glBindRenderbuffer;
+extern PFNGLDELETERENDERBUFFERSPROC glDeleteRenderbuffers;
+extern PFNGLGENRENDERBUFFERSPROC glGenRenderbuffers;
+extern PFNGLRENDERBUFFERSTORAGEPROC glRenderbufferStorage;
+extern PFNGLGETRENDERBUFFERPARAMETERIVPROC glGetRenderbufferParameteriv;
+extern PFNGLISFRAMEBUFFERPROC glIsFramebuffer;
+extern PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer;
+extern PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers;
+extern PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers;
+extern PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus;
+extern PFNGLFRAMEBUFFERTEXTURE1DPROC glFramebufferTexture1D;
+extern PFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D;
+extern PFNGLFRAMEBUFFERTEXTURE3DPROC glFramebufferTexture3D;
+extern PFNGLFRAMEBUFFERRENDERBUFFERPROC glFramebufferRenderbuffer;
+extern PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glGetFramebufferAttachmentParameteriv;
+extern PFNGLGENERATEMIPMAPPROC glGenerateMipmap;
+extern PFNGLBLITFRAMEBUFFERPROC glBlitFramebuffer;
+extern PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glRenderbufferStorageMultisample;
+extern PFNGLFRAMEBUFFERTEXTURELAYERPROC glFramebufferTextureLayer;
//GL_ARB_draw_buffers
extern PFNGLDRAWBUFFERSARBPROC glDrawBuffersARB;
+//GL_ARB_texture_multisample
+extern PFNGLTEXIMAGE2DMULTISAMPLEPROC glTexImage2DMultisample;
+extern PFNGLTEXIMAGE3DMULTISAMPLEPROC glTexImage3DMultisample;
+extern PFNGLGETMULTISAMPLEFVPROC glGetMultisamplefv;
+extern PFNGLSAMPLEMASKIPROC glSampleMaski;
#elif LL_WINDOWS
//----------------------------------------------------------------------------
@@ -495,6 +545,9 @@ extern PFNGLDRAWBUFFERSARBPROC glDrawBuffersARB;
#include "GL/glext.h"
#include "GL/glh_extensions.h"
+// WGL_ARB_create_context
+extern PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribsARB;
+extern PFNGLGETSTRINGIPROC glGetStringi;
// GL_ARB_vertex_buffer_object
extern PFNGLBINDBUFFERARBPROC glBindBufferARB;
@@ -509,6 +562,29 @@ extern PFNGLUNMAPBUFFERARBPROC glUnmapBufferARB;
extern PFNGLGETBUFFERPARAMETERIVARBPROC glGetBufferParameterivARB;
extern PFNGLGETBUFFERPOINTERVARBPROC glGetBufferPointervARB;
+// GL_ARB_vertex_array_object
+extern PFNGLBINDVERTEXARRAYPROC glBindVertexArray;
+extern PFNGLDELETEVERTEXARRAYSPROC glDeleteVertexArrays;
+extern PFNGLGENVERTEXARRAYSPROC glGenVertexArrays;
+extern PFNGLISVERTEXARRAYPROC glIsVertexArray;
+
+// GL_ARB_sync
+extern PFNGLFENCESYNCPROC glFenceSync;
+extern PFNGLISSYNCPROC glIsSync;
+extern PFNGLDELETESYNCPROC glDeleteSync;
+extern PFNGLCLIENTWAITSYNCPROC glClientWaitSync;
+extern PFNGLWAITSYNCPROC glWaitSync;
+extern PFNGLGETINTEGER64VPROC glGetInteger64v;
+extern PFNGLGETSYNCIVPROC glGetSynciv;
+
+// GL_APPLE_flush_buffer_range
+extern PFNGLBUFFERPARAMETERIAPPLEPROC glBufferParameteriAPPLE;
+extern PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC glFlushMappedBufferRangeAPPLE;
+
+// GL_ARB_map_buffer_range
+extern PFNGLMAPBUFFERRANGEPROC glMapBufferRange;
+extern PFNGLFLUSHMAPPEDBUFFERRANGEPROC glFlushMappedBufferRange;
+
// GL_ATI_vertex_array_object
extern PFNGLNEWOBJECTBUFFERATIPROC glNewObjectBufferATI;
extern PFNGLISOBJECTBUFFERATIPROC glIsObjectBufferATI;
@@ -619,6 +695,7 @@ extern PFNGLVERTEXATTRIB4UBVARBPROC glVertexAttrib4ubvARB;
extern PFNGLVERTEXATTRIB4UIVARBPROC glVertexAttrib4uivARB;
extern PFNGLVERTEXATTRIB4USVARBPROC glVertexAttrib4usvARB;
extern PFNGLVERTEXATTRIBPOINTERARBPROC glVertexAttribPointerARB;
+extern PFNGLVERTEXATTRIBIPOINTERPROC glVertexAttribIPointer;
extern PFNGLENABLEVERTEXATTRIBARRAYARBPROC glEnableVertexAttribArrayARB;
extern PFNGLDISABLEVERTEXATTRIBARRAYARBPROC glDisableVertexAttribArrayARB;
extern PFNGLPROGRAMSTRINGARBPROC glProgramStringARB;
@@ -651,34 +728,42 @@ extern PFNGLGETATTRIBLOCATIONARBPROC glGetAttribLocationARB;
//GL_EXT_blend_func_separate
extern PFNGLBLENDFUNCSEPARATEEXTPROC glBlendFuncSeparateEXT;
-//GL_EXT_framebuffer_object
-extern PFNGLISRENDERBUFFEREXTPROC glIsRenderbufferEXT;
-extern PFNGLBINDRENDERBUFFEREXTPROC glBindRenderbufferEXT;
-extern PFNGLDELETERENDERBUFFERSEXTPROC glDeleteRenderbuffersEXT;
-extern PFNGLGENRENDERBUFFERSEXTPROC glGenRenderbuffersEXT;
-extern PFNGLRENDERBUFFERSTORAGEEXTPROC glRenderbufferStorageEXT;
-extern PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC glGetRenderbufferParameterivEXT;
-extern PFNGLISFRAMEBUFFEREXTPROC glIsFramebufferEXT;
-extern PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebufferEXT;
-extern PFNGLDELETEFRAMEBUFFERSEXTPROC glDeleteFramebuffersEXT;
-extern PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffersEXT;
-extern PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glCheckFramebufferStatusEXT;
-extern PFNGLFRAMEBUFFERTEXTURE1DEXTPROC glFramebufferTexture1DEXT;
-extern PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glFramebufferTexture2DEXT;
-extern PFNGLFRAMEBUFFERTEXTURE3DEXTPROC glFramebufferTexture3DEXT;
-extern PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC glFramebufferRenderbufferEXT;
-extern PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC glGetFramebufferAttachmentParameterivEXT;
-extern PFNGLGENERATEMIPMAPEXTPROC glGenerateMipmapEXT;
-
-// GL_EXT_framebuffer_multisample
-extern PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC glRenderbufferStorageMultisampleEXT;
-
-// GL_EXT_framebuffer_blit
-extern PFNGLBLITFRAMEBUFFEREXTPROC glBlitFramebufferEXT;
+//GL_ARB_framebuffer_object
+extern PFNGLISRENDERBUFFERPROC glIsRenderbuffer;
+extern PFNGLBINDRENDERBUFFERPROC glBindRenderbuffer;
+extern PFNGLDELETERENDERBUFFERSPROC glDeleteRenderbuffers;
+extern PFNGLGENRENDERBUFFERSPROC glGenRenderbuffers;
+extern PFNGLRENDERBUFFERSTORAGEPROC glRenderbufferStorage;
+extern PFNGLGETRENDERBUFFERPARAMETERIVPROC glGetRenderbufferParameteriv;
+extern PFNGLISFRAMEBUFFERPROC glIsFramebuffer;
+extern PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer;
+extern PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers;
+extern PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers;
+extern PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus;
+extern PFNGLFRAMEBUFFERTEXTURE1DPROC glFramebufferTexture1D;
+extern PFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D;
+extern PFNGLFRAMEBUFFERTEXTURE3DPROC glFramebufferTexture3D;
+extern PFNGLFRAMEBUFFERRENDERBUFFERPROC glFramebufferRenderbuffer;
+extern PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glGetFramebufferAttachmentParameteriv;
+extern PFNGLGENERATEMIPMAPPROC glGenerateMipmap;
+extern PFNGLBLITFRAMEBUFFERPROC glBlitFramebuffer;
+extern PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glRenderbufferStorageMultisample;
+extern PFNGLFRAMEBUFFERTEXTURELAYERPROC glFramebufferTextureLayer;
//GL_ARB_draw_buffers
extern PFNGLDRAWBUFFERSARBPROC glDrawBuffersARB;
+//GL_ARB_texture_multisample
+extern PFNGLTEXIMAGE2DMULTISAMPLEPROC glTexImage2DMultisample;
+extern PFNGLTEXIMAGE3DMULTISAMPLEPROC glTexImage3DMultisample;
+extern PFNGLGETMULTISAMPLEFVPROC glGetMultisamplefv;
+extern PFNGLSAMPLEMASKIPROC glSampleMaski;
+
+//GL_ARB_debug_output
+extern PFNGLDEBUGMESSAGECONTROLARBPROC glDebugMessageControlARB;
+extern PFNGLDEBUGMESSAGEINSERTARBPROC glDebugMessageInsertARB;
+extern PFNGLDEBUGMESSAGECALLBACKARBPROC glDebugMessageCallbackARB;
+extern PFNGLGETDEBUGMESSAGELOGARBPROC glGetDebugMessageLogARB;
#elif LL_DARWIN
//----------------------------------------------------------------------------
@@ -697,7 +782,7 @@ extern PFNGLDRAWBUFFERSARBPROC glDrawBuffersARB;
#include <AvailabilityMacros.h>
//GL_EXT_blend_func_separate
-extern void glBlendFuncSeparateEXT(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER;
+extern void glBlendFuncSeparateEXT(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) ;
// GL_EXT_framebuffer_object
extern GLboolean glIsRenderbufferEXT(GLuint renderbuffer) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER;
@@ -718,12 +803,57 @@ extern void glFramebufferRenderbufferEXT(GLenum target, GLenum attachment, GLenu
extern void glGetFramebufferAttachmentParameterivEXT(GLenum target, GLenum attachment, GLenum pname, GLint *params) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER;
extern void glGenerateMipmapEXT(GLenum target) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER;
+#ifndef GL_ARB_framebuffer_object
+#define glGenerateMipmap glGenerateMipmapEXT
+#define GL_MAX_SAMPLES 0x8D57
+#endif
+
// GL_ARB_draw_buffers
extern void glDrawBuffersARB(GLsizei n, const GLenum* bufs) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER;
#ifdef __cplusplus
extern "C" {
#endif
+
+//
+// Define map buffer range headers on Mac
+//
+#ifndef GL_ARB_map_buffer_range
+#define GL_MAP_READ_BIT 0x0001
+#define GL_MAP_WRITE_BIT 0x0002
+#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004
+#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008
+#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010
+#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020
+#endif
+
+//
+// Define multisample headers on Mac
+//
+#ifndef GL_ARB_texture_multisample
+#define GL_SAMPLE_POSITION 0x8E50
+#define GL_SAMPLE_MASK 0x8E51
+#define GL_SAMPLE_MASK_VALUE 0x8E52
+#define GL_MAX_SAMPLE_MASK_WORDS 0x8E59
+#define GL_TEXTURE_2D_MULTISAMPLE 0x9100
+#define GL_PROXY_TEXTURE_2D_MULTISAMPLE 0x9101
+#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102
+#define GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9103
+#define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104
+#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 0x9105
+#define GL_TEXTURE_SAMPLES 0x9106
+#define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107
+#define GL_SAMPLER_2D_MULTISAMPLE 0x9108
+#define GL_INT_SAMPLER_2D_MULTISAMPLE 0x9109
+#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A
+#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910B
+#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C
+#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D
+#define GL_MAX_COLOR_TEXTURE_SAMPLES 0x910E
+#define GL_MAX_DEPTH_TEXTURE_SAMPLES 0x910F
+#define GL_MAX_INTEGER_SAMPLES 0x9110
+#endif
+
//
// Define vertex buffer object headers on Mac
//
@@ -760,7 +890,7 @@ extern "C" {
#define GL_DYNAMIC_READ_ARB 0x88E9
#define GL_DYNAMIC_COPY_ARB 0x88EA
#endif
-
+
#ifndef GL_ARB_vertex_buffer_object
@@ -799,6 +929,31 @@ extern void glGetBufferPointervARB (GLenum, GLenum, GLvoid* *);
#endif /* GL_GLEXT_FUNCTION_POINTERS */
#endif
+#ifndef GL_ARB_texture_rg
+#define GL_RG 0x8227
+#define GL_RG_INTEGER 0x8228
+#define GL_R8 0x8229
+#define GL_R16 0x822A
+#define GL_RG8 0x822B
+#define GL_RG16 0x822C
+#define GL_R16F 0x822D
+#define GL_R32F 0x822E
+#define GL_RG16F 0x822F
+#define GL_RG32F 0x8230
+#define GL_R8I 0x8231
+#define GL_R8UI 0x8232
+#define GL_R16I 0x8233
+#define GL_R16UI 0x8234
+#define GL_R32I 0x8235
+#define GL_R32UI 0x8236
+#define GL_RG8I 0x8237
+#define GL_RG8UI 0x8238
+#define GL_RG16I 0x8239
+#define GL_RG16UI 0x823A
+#define GL_RG32I 0x823B
+#define GL_RG32UI 0x823C
+#endif
+
// May be needed for DARWIN...
// #ifndef GL_ARB_compressed_tex_image
// #define GL_ARB_compressed_tex_image 1
@@ -840,4 +995,22 @@ extern void glGetBufferPointervARB (GLenum, GLenum, GLvoid* *);
#define GL_DEPTH_CLAMP 0x864F
#endif
+//GL_NVX_gpu_memory_info constants
+#ifndef GL_NVX_gpu_memory_info
+#define GL_NVX_gpu_memory_info
+#define GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX 0x9047
+#define GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX 0x9048
+#define GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX 0x9049
+#define GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX 0x904A
+#define GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX 0x904B
+#endif
+
+//GL_ATI_meminfo constants
+#ifndef GL_ATI_meminfo
+#define GL_ATI_meminfo
+#define GL_VBO_FREE_MEMORY_ATI 0x87FB
+#define GL_TEXTURE_FREE_MEMORY_ATI 0x87FC
+#define GL_RENDERBUFFER_FREE_MEMORY_ATI 0x87FD
+#endif
+
#endif // LL_LLGLHEADERS_H
diff --git a/indra/llrender/llglslshader.cpp b/indra/llrender/llglslshader.cpp
index 16534fa9a5..4b7e639aed 100644
--- a/indra/llrender/llglslshader.cpp
+++ b/indra/llrender/llglslshader.cpp
@@ -31,6 +31,7 @@
#include "llshadermgr.h"
#include "llfile.h"
#include "llrender.h"
+#include "llvertexbuffer.h"
#if LL_DARWIN
#include "OpenGL/OpenGL.h"
@@ -48,15 +49,38 @@ using std::pair;
using std::make_pair;
using std::string;
+GLhandleARB LLGLSLShader::sCurBoundShader = 0;
+LLGLSLShader* LLGLSLShader::sCurBoundShaderPtr = NULL;
+S32 LLGLSLShader::sIndexedTextureChannels = 0;
+bool LLGLSLShader::sNoFixedFunction = false;
+
+//UI shader -- declared here so llui_libtest will link properly
+LLGLSLShader gUIProgram;
+LLGLSLShader gSolidColorProgram;
+
BOOL shouldChange(const LLVector4& v1, const LLVector4& v2)
{
return v1 != v2;
}
LLShaderFeatures::LLShaderFeatures()
-: calculatesLighting(false), isShiny(false), isFullbright(false), hasWaterFog(false),
-hasTransport(false), hasSkinning(false), hasAtmospherics(false), isSpecular(false),
-hasGamma(false), hasLighting(false), calculatesAtmospherics(false)
+ : atmosphericHelpers(false)
+ , calculatesLighting(false)
+ , calculatesAtmospherics(false)
+ , hasLighting(false)
+ , isAlphaLighting(false)
+ , isShiny(false)
+ , isFullbright(false)
+ , isSpecular(false)
+ , hasWaterFog(false)
+ , hasTransport(false)
+ , hasSkinning(false)
+ , hasObjectSkinning(false)
+ , hasAtmospherics(false)
+ , hasGamma(false)
+ , mIndexedTextureChannels(0)
+ , disableTextureIndex(false)
+ , hasAlphaMask(false)
{
}
@@ -66,6 +90,7 @@ hasGamma(false), hasLighting(false), calculatesAtmospherics(false)
LLGLSLShader::LLGLSLShader()
: mProgramObject(0), mActiveTextureChannels(0), mShaderLevel(0), mShaderGroup(SG_DEFAULT), mUniformsDirty(FALSE)
{
+
}
void LLGLSLShader::unload()
@@ -84,7 +109,12 @@ void LLGLSLShader::unload()
glGetAttachedObjectsARB(mProgramObject, 1024, &count, obj);
for (GLsizei i = 0; i < count; i++)
{
- glDeleteObjectARB(obj[i]);
+#if !LL_DARWIN
+ if (glIsProgramARB(obj[i]))
+#endif
+ {
+ glDeleteObjectARB(obj[i]);
+ }
}
glDeleteObjectARB(mProgramObject);
@@ -101,24 +131,26 @@ void LLGLSLShader::unload()
BOOL LLGLSLShader::createShader(vector<string> * attributes,
vector<string> * uniforms)
{
+ //reloading, reset matrix hash values
+ for (U32 i = 0; i < LLRender::NUM_MATRIX_MODES; ++i)
+ {
+ mMatHash[i] = 0xFFFFFFFF;
+ }
+ mLightHash = 0xFFFFFFFF;
+
llassert_always(!mShaderFiles.empty());
BOOL success = TRUE;
// Create program
mProgramObject = glCreateProgramObjectARB();
- // Attach existing objects
- if (!LLShaderMgr::instance()->attachShaderFeatures(this))
- {
- return FALSE;
- }
-
+ //compile new source
vector< pair<string,GLenum> >::iterator fileIter = mShaderFiles.begin();
for ( ; fileIter != mShaderFiles.end(); fileIter++ )
{
- GLhandleARB shaderhandle = LLShaderMgr::instance()->loadShaderFile((*fileIter).first, mShaderLevel, (*fileIter).second);
+ GLhandleARB shaderhandle = LLShaderMgr::instance()->loadShaderFile((*fileIter).first, mShaderLevel, (*fileIter).second, mFeatures.mIndexedTextureChannels);
LL_DEBUGS("ShaderLoading") << "SHADER FILE: " << (*fileIter).first << " mShaderLevel=" << mShaderLevel << LL_ENDL;
- if (mShaderLevel > 0)
+ if (shaderhandle > 0)
{
attachObject(shaderhandle);
}
@@ -128,6 +160,18 @@ BOOL LLGLSLShader::createShader(vector<string> * attributes,
}
}
+ // Attach existing objects
+ if (!LLShaderMgr::instance()->attachShaderFeatures(this))
+ {
+ return FALSE;
+ }
+
+ if (gGLManager.mGLSLVersionMajor < 2 && gGLManager.mGLSLVersionMinor < 3)
+ { //indexed texture rendering requires GLSL 1.3 or later
+ //attachShaderFeatures may have set the number of indexed texture channels, so set to 1 again
+ mFeatures.mIndexedTextureChannels = llmin(mFeatures.mIndexedTextureChannels, 1);
+ }
+
// Map attributes and uniforms
if (success)
{
@@ -149,6 +193,29 @@ BOOL LLGLSLShader::createShader(vector<string> * attributes,
return createShader(attributes,uniforms);
}
}
+ else if (mFeatures.mIndexedTextureChannels > 0)
+ { //override texture channels for indexed texture rendering
+ bind();
+ S32 channel_count = mFeatures.mIndexedTextureChannels;
+
+ for (S32 i = 0; i < channel_count; i++)
+ {
+ uniform1i(llformat("tex%d", i), i);
+ }
+
+ S32 cur_tex = channel_count; //adjust any texture channels that might have been overwritten
+ for (U32 i = 0; i < mTexture.size(); i++)
+ {
+ if (mTexture[i] > -1 && mTexture[i] < channel_count)
+ {
+ llassert(cur_tex < gGLManager.mNumTextureImageUnits);
+ uniform1i(i, cur_tex);
+ mTexture[i] = cur_tex++;
+ }
+ }
+ unbind();
+ }
+
return success;
}
@@ -192,6 +259,13 @@ void LLGLSLShader::attachObjects(GLhandleARB* objects, S32 count)
BOOL LLGLSLShader::mapAttributes(const vector<string> * attributes)
{
+ //before linking, make sure reserved attributes always have consistent locations
+ for (U32 i = 0; i < LLShaderMgr::instance()->mReservedAttribs.size(); i++)
+ {
+ const char* name = LLShaderMgr::instance()->mReservedAttribs[i].c_str();
+ glBindAttribLocationARB(mProgramObject, i, (const GLcharARB *) name);
+ }
+
//link the program
BOOL res = link();
@@ -265,7 +339,7 @@ void LLGLSLShader::mapUniform(GLint index, const vector<string> * uniforms)
for (S32 i = 0; i < (S32) LLShaderMgr::instance()->mReservedUniforms.size(); i++)
{
if ( (mUniform[i] == -1)
- && (LLShaderMgr::instance()->mReservedUniforms[i].compare(0, length, name, LLShaderMgr::instance()->mReservedUniforms[i].length()) == 0))
+ && (LLShaderMgr::instance()->mReservedUniforms[i] == name))
{
//found it
mUniform[i] = location;
@@ -279,7 +353,7 @@ void LLGLSLShader::mapUniform(GLint index, const vector<string> * uniforms)
for (U32 i = 0; i < uniforms->size(); i++)
{
if ( (mUniform[i+LLShaderMgr::instance()->mReservedUniforms.size()] == -1)
- && ((*uniforms)[i].compare(0, length, name, (*uniforms)[i].length()) == 0))
+ && ((*uniforms)[i] == name))
{
//found it
mUniform[i+LLShaderMgr::instance()->mReservedUniforms.size()] = location;
@@ -293,7 +367,8 @@ void LLGLSLShader::mapUniform(GLint index, const vector<string> * uniforms)
GLint LLGLSLShader::mapUniformTextureChannel(GLint location, GLenum type)
{
- if (type >= GL_SAMPLER_1D_ARB && type <= GL_SAMPLER_2D_RECT_SHADOW_ARB)
+ if (type >= GL_SAMPLER_1D_ARB && type <= GL_SAMPLER_2D_RECT_SHADOW_ARB ||
+ type == GL_SAMPLER_2D_MULTISAMPLE)
{ //this here is a texture
glUniform1iARB(location, mActiveTextureChannels);
LL_DEBUGS("ShaderLoading") << "Assigned to texture channel " << mActiveTextureChannels << LL_ENDL;
@@ -339,10 +414,13 @@ BOOL LLGLSLShader::link(BOOL suppress_errors)
void LLGLSLShader::bind()
{
+ gGL.flush();
if (gGLManager.mHasShaderObjects)
{
+ LLVertexBuffer::unbind();
glUseProgramObjectARB(mProgramObject);
-
+ sCurBoundShader = mProgramObject;
+ sCurBoundShaderPtr = this;
if (mUniformsDirty)
{
LLShaderMgr::instance()->updateShaderUniforms(this);
@@ -353,6 +431,7 @@ void LLGLSLShader::bind()
void LLGLSLShader::unbind()
{
+ gGL.flush();
if (gGLManager.mHasShaderObjects)
{
stop_glerror();
@@ -364,14 +443,23 @@ void LLGLSLShader::unbind()
stop_glerror();
}
}
+ LLVertexBuffer::unbind();
glUseProgramObjectARB(0);
+ sCurBoundShader = 0;
+ sCurBoundShaderPtr = NULL;
stop_glerror();
}
}
void LLGLSLShader::bindNoShader(void)
{
- glUseProgramObjectARB(0);
+ LLVertexBuffer::unbind();
+ if (gGLManager.mHasShaderObjects)
+ {
+ glUseProgramObjectARB(0);
+ sCurBoundShader = 0;
+ sCurBoundShaderPtr = NULL;
+ }
}
S32 LLGLSLShader::enableTexture(S32 uniform, LLTexUnit::eTextureType mode)
@@ -698,17 +786,50 @@ void LLGLSLShader::uniformMatrix4fv(U32 index, U32 count, GLboolean transpose, c
GLint LLGLSLShader::getUniformLocation(const string& uniform)
{
+ GLint ret = -1;
if (mProgramObject > 0)
{
std::map<string, GLint>::iterator iter = mUniformMap.find(uniform);
if (iter != mUniformMap.end())
{
- llassert(iter->second == glGetUniformLocationARB(mProgramObject, uniform.c_str()));
- return iter->second;
+ if (gDebugGL)
+ {
+ stop_glerror();
+ if (iter->second != glGetUniformLocationARB(mProgramObject, uniform.c_str()))
+ {
+ llerrs << "Uniform does not match." << llendl;
+ }
+ stop_glerror();
+ }
+ ret = iter->second;
}
}
- return -1;
+ return ret;
+}
+
+GLint LLGLSLShader::getUniformLocation(U32 index)
+{
+ GLint ret = -1;
+ if (mProgramObject > 0)
+ {
+ llassert(index < mUniform.size());
+ return mUniform[index];
+ }
+
+ return ret;
+}
+
+GLint LLGLSLShader::getAttribLocation(U32 attrib)
+{
+ if (attrib < mAttribute.size())
+ {
+ return mAttribute[attrib];
+ }
+ else
+ {
+ return -1;
+ }
}
void LLGLSLShader::uniform1i(const string& uniform, GLint v)
@@ -850,7 +971,9 @@ void LLGLSLShader::uniform4fv(const string& uniform, U32 count, const GLfloat* v
std::map<GLint, LLVector4>::iterator iter = mValue.find(location);
if (iter == mValue.end() || shouldChange(iter->second,vec) || count != 1)
{
+ stop_glerror();
glUniform4fvARB(location, count, v);
+ stop_glerror();
mValue[location] = vec;
}
}
@@ -882,7 +1005,9 @@ void LLGLSLShader::uniformMatrix4fv(const string& uniform, U32 count, GLboolean
if (location >= 0)
{
+ stop_glerror();
glUniformMatrix4fvARB(location, count, transpose, v);
+ stop_glerror();
}
}
@@ -902,3 +1027,9 @@ void LLGLSLShader::vertexAttrib4fv(U32 index, GLfloat* v)
glVertexAttrib4fvARB(mAttribute[index], v);
}
}
+
+void LLGLSLShader::setMinimumAlpha(F32 minimum)
+{
+ gGL.flush();
+ uniform1f(LLShaderMgr::MINIMUM_ALPHA, minimum);
+}
diff --git a/indra/llrender/llglslshader.h b/indra/llrender/llglslshader.h
index c11bd50716..7873fe3c4e 100644
--- a/indra/llrender/llglslshader.h
+++ b/indra/llrender/llglslshader.h
@@ -33,17 +33,23 @@
class LLShaderFeatures
{
public:
+ bool atmosphericHelpers;
bool calculatesLighting;
bool calculatesAtmospherics;
bool hasLighting; // implies no transport (it's possible to have neither though)
+ bool isAlphaLighting; // indicates lighting shaders need not be linked in (lighting performed directly in alpha shader to match deferred lighting functions)
bool isShiny;
bool isFullbright; // implies no lighting
bool isSpecular;
bool hasWaterFog; // implies no gamma
bool hasTransport; // implies no lighting (it's possible to have neither though)
bool hasSkinning;
+ bool hasObjectSkinning;
bool hasAtmospherics;
bool hasGamma;
+ S32 mIndexedTextureChannels;
+ bool disableTextureIndex;
+ bool hasAlphaMask;
// char numLights;
@@ -63,6 +69,11 @@ public:
LLGLSLShader();
+ static GLhandleARB sCurBoundShader;
+ static LLGLSLShader* sCurBoundShaderPtr;
+ static S32 sIndexedTextureChannels;
+ static bool sNoFixedFunction;
+
void unload();
BOOL createShader(std::vector<std::string> * attributes,
std::vector<std::string> * uniforms);
@@ -99,14 +110,17 @@ public:
void uniformMatrix3fv(const std::string& uniform, U32 count, GLboolean transpose, const GLfloat *v);
void uniformMatrix4fv(const std::string& uniform, U32 count, GLboolean transpose, const GLfloat *v);
+ void setMinimumAlpha(F32 minimum);
+
void vertexAttrib4f(U32 index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
void vertexAttrib4fv(U32 index, GLfloat* v);
GLint getUniformLocation(const std::string& uniform);
-
+ GLint getUniformLocation(U32 index);
+
+ GLint getAttribLocation(U32 attrib);
GLint mapUniformTextureChannel(GLint location, GLenum type);
-
//enable/disable texture channel for specified uniform
//if given texture uniform is active in the shader,
//the corresponding channel will be active upon return
@@ -121,6 +135,9 @@ public:
// Unbinds any previously bound shader by explicitly binding no shader.
static void bindNoShader(void);
+ U32 mMatHash[LLRender::NUM_MATRIX_MODES];
+ U32 mLightHash;
+
GLhandleARB mProgramObject;
std::vector<GLint> mAttribute; //lookup table of attribute enum to attribute channel
std::vector<GLint> mUniform; //lookup table of uniform enum to uniform location
@@ -136,4 +153,10 @@ public:
std::string mName;
};
+//UI shader (declared here so llui_libtest will link properly)
+extern LLGLSLShader gUIProgram;
+//output vec4(color.rgb,color.a*tex0[tc0].a)
+extern LLGLSLShader gSolidColorProgram;
+
+
#endif
diff --git a/indra/llrender/llglstates.h b/indra/llrender/llglstates.h
index d5a29dcd0c..e26aead676 100644
--- a/indra/llrender/llglstates.h
+++ b/indra/llrender/llglstates.h
@@ -238,9 +238,11 @@ public:
class LLGLSSpecular
{
public:
+ F32 mShininess;
LLGLSSpecular(const LLColor4& color, F32 shininess)
{
- if (shininess > 0.0f)
+ mShininess = shininess;
+ if (mShininess > 0.0f)
{
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, color.mV);
S32 shiny = (S32)(shininess*128.f);
@@ -250,32 +252,14 @@ public:
}
~LLGLSSpecular()
{
- glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, LLColor4(0.f,0.f,0.f,0.f).mV);
- glMateriali(GL_FRONT_AND_BACK, GL_SHININESS, 0);
+ if (mShininess > 0.f)
+ {
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, LLColor4(0.f,0.f,0.f,0.f).mV);
+ glMateriali(GL_FRONT_AND_BACK, GL_SHININESS, 0);
+ }
}
};
//----------------------------------------------------------------------------
-
-class LLGLSBlendFunc : public LLGLSPipeline {
-protected:
- GLint mSavedSrc, mSavedDst;
- LLGLEnable mBlend;
-
-public:
- LLGLSBlendFunc(GLenum srcFunc, GLenum dstFunc) :
- mBlend(GL_BLEND)
- {
- glGetIntegerv(GL_BLEND_SRC, &mSavedSrc);
- glGetIntegerv(GL_BLEND_DST, &mSavedDst);
- glBlendFunc(srcFunc, dstFunc);
- }
-
- ~LLGLSBlendFunc(void) {
- glBlendFunc(mSavedSrc, mSavedDst);
- }
-};
-
-
#endif
diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp
index 65940cb067..78591ddd38 100644
--- a/indra/llrender/llimagegl.cpp
+++ b/indra/llrender/llimagegl.cpp
@@ -36,7 +36,9 @@
#include "llmath.h"
#include "llgl.h"
+#include "llglslshader.h"
#include "llrender.h"
+
//----------------------------------------------------------------------------
const F32 MIN_TEXTURE_LIFETIME = 10.f;
@@ -725,7 +727,10 @@ void LLImageGL::setImage(const U8* data_in, BOOL data_hasmips)
{
if (mAutoGenMips)
{
- glTexParameteri(LLTexUnit::getInternalType(mBindTarget), GL_GENERATE_MIPMAP_SGIS, TRUE);
+ if (!gGLManager.mHasFramebufferObject)
+ {
+ glTexParameteri(LLTexUnit::getInternalType(mBindTarget), GL_GENERATE_MIPMAP_SGIS, TRUE);
+ }
stop_glerror();
{
// LLFastTimer t2(FTM_TEMP4);
@@ -754,6 +759,11 @@ void LLImageGL::setImage(const U8* data_in, BOOL data_hasmips)
stop_glerror();
}
}
+
+ if (gGLManager.mHasFramebufferObject)
+ {
+ glGenerateMipmap(LLTexUnit::getInternalType(mBindTarget));
+ }
}
else
{
@@ -875,6 +885,9 @@ void LLImageGL::setImage(const U8* data_in, BOOL data_hasmips)
BOOL LLImageGL::preAddToAtlas(S32 discard_level, const LLImageRaw* raw_image)
{
+ //not compatible with core GL profile
+ llassert(!LLRender::sGLCoreProfile);
+
if (gGLManager.mIsDisabled)
{
llwarns << "Trying to create a texture while GL is disabled!" << llendl;
@@ -901,29 +914,29 @@ BOOL LLImageGL::preAddToAtlas(S32 discard_level, const LLImageRaw* raw_image)
{
switch (mComponents)
{
- case 1:
+ case 1:
// Use luminance alpha (for fonts)
mFormatInternal = GL_LUMINANCE8;
mFormatPrimary = GL_LUMINANCE;
mFormatType = GL_UNSIGNED_BYTE;
break;
- case 2:
+ case 2:
// Use luminance alpha (for fonts)
mFormatInternal = GL_LUMINANCE8_ALPHA8;
mFormatPrimary = GL_LUMINANCE_ALPHA;
mFormatType = GL_UNSIGNED_BYTE;
break;
- case 3:
+ case 3:
mFormatInternal = GL_RGB8;
mFormatPrimary = GL_RGB;
mFormatType = GL_UNSIGNED_BYTE;
break;
- case 4:
+ case 4:
mFormatInternal = GL_RGBA8;
mFormatPrimary = GL_RGBA;
mFormatType = GL_UNSIGNED_BYTE;
break;
- default:
+ default:
llerrs << "Bad number of components for texture: " << (U32)getComponents() << llendl;
}
}
@@ -967,12 +980,14 @@ BOOL LLImageGL::setSubImage(const U8* datap, S32 data_width, S32 data_height, S3
}
if (mTexName == 0)
{
- llwarns << "Setting subimage on image without GL texture" << llendl;
+ // *TODO: Re-enable warning? Ran into thread locking issues? DK 2011-02-18
+ //llwarns << "Setting subimage on image without GL texture" << llendl;
return FALSE;
}
if (datap == NULL)
{
- llwarns << "Setting subimage on image with NULL datap" << llendl;
+ // *TODO: Re-enable warning? Ran into thread locking issues? DK 2011-02-18
+ //llwarns << "Setting subimage on image with NULL datap" << llendl;
return FALSE;
}
@@ -1063,16 +1078,6 @@ BOOL LLImageGL::setSubImageFromFrameBuffer(S32 fb_x, S32 fb_y, S32 x_pos, S32 y_
{
if (gGL.getTexUnit(0)->bind(this, false, true))
{
- if(gGLManager.mDebugGPU)
- {
- llinfos << "Calling glCopyTexSubImage2D(...)" << llendl ;
- checkTexSize(true) ;
- llcallstacks << fb_x << " : " << fb_y << " : " << x_pos << " : " << y_pos << " : " << width << " : " << height <<
- " : " << (S32)mComponents << llcallstacksendl ;
-
- log_glerror() ;
- }
-
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, fb_x, fb_y, x_pos, y_pos, width, height);
mGLTextureCreated = true;
stop_glerror();
@@ -1091,25 +1096,98 @@ void LLImageGL::generateTextures(S32 numTextures, U32 *textures)
}
// static
-void LLImageGL::deleteTextures(S32 numTextures, U32 *textures)
+void LLImageGL::deleteTextures(S32 numTextures, U32 *textures, bool immediate)
{
for (S32 i = 0; i < numTextures; i++)
{
sDeadTextureList.push_back(textures[i]);
}
+
+ if (immediate)
+ {
+ LLImageGL::deleteDeadTextures();
+ }
}
// static
void LLImageGL::setManualImage(U32 target, S32 miplevel, S32 intformat, S32 width, S32 height, U32 pixformat, U32 pixtype, const void *pixels)
{
- glTexImage2D(target, miplevel, intformat, width, height, 0, pixformat, pixtype, pixels);
+ bool use_scratch = false;
+ U32* scratch = NULL;
+ if (LLRender::sGLCoreProfile)
+ {
+ if (pixformat == GL_ALPHA && pixtype == GL_UNSIGNED_BYTE)
+ { //GL_ALPHA is deprecated, convert to RGBA
+ use_scratch = true;
+ scratch = new U32[width*height];
+
+ U32 pixel_count = (U32) (width*height);
+ for (U32 i = 0; i < pixel_count; i++)
+ {
+ U8* pix = (U8*) &scratch[i];
+ pix[0] = pix[1] = pix[2] = 0;
+ pix[3] = ((U8*) pixels)[i];
+ }
+
+ pixformat = GL_RGBA;
+ intformat = GL_RGBA8;
+ }
+
+ if (pixformat == GL_LUMINANCE_ALPHA && pixtype == GL_UNSIGNED_BYTE)
+ { //GL_LUMINANCE_ALPHA is deprecated, convert to RGBA
+ use_scratch = true;
+ scratch = new U32[width*height];
+
+ U32 pixel_count = (U32) (width*height);
+ for (U32 i = 0; i < pixel_count; i++)
+ {
+ U8 lum = ((U8*) pixels)[i*2+0];
+ U8 alpha = ((U8*) pixels)[i*2+1];
+
+ U8* pix = (U8*) &scratch[i];
+ pix[0] = pix[1] = pix[2] = lum;
+ pix[3] = alpha;
+ }
+
+ pixformat = GL_RGBA;
+ intformat = GL_RGBA8;
+ }
+
+ if (pixformat == GL_LUMINANCE && pixtype == GL_UNSIGNED_BYTE)
+ { //GL_LUMINANCE_ALPHA is deprecated, convert to RGB
+ use_scratch = true;
+ scratch = new U32[width*height];
+
+ U32 pixel_count = (U32) (width*height);
+ for (U32 i = 0; i < pixel_count; i++)
+ {
+ U8 lum = ((U8*) pixels)[i];
+
+ U8* pix = (U8*) &scratch[i];
+ pix[0] = pix[1] = pix[2] = lum;
+ pix[3] = 255;
+ }
+
+ pixformat = GL_RGBA;
+ intformat = GL_RGB8;
+ }
+ }
+
stop_glerror();
+ glTexImage2D(target, miplevel, intformat, width, height, 0, pixformat, pixtype, use_scratch ? scratch : pixels);
+ stop_glerror();
+
+ if (use_scratch)
+ {
+ delete [] scratch;
+ }
}
//create an empty GL texture: just create a texture name
//the texture is assiciate with some image by calling glTexImage outside LLImageGL
BOOL LLImageGL::createGLTexture()
{
+ if (gHeadlessClient) return FALSE;
if (gGLManager.mIsDisabled)
{
llwarns << "Trying to create a texture while GL is disabled!" << llendl;
@@ -1138,6 +1216,7 @@ BOOL LLImageGL::createGLTexture()
BOOL LLImageGL::createGLTexture(S32 discard_level, const LLImageRaw* imageraw, S32 usename/*=0*/, BOOL to_create, S32 category)
{
+ if (gHeadlessClient) return FALSE;
if (gGLManager.mIsDisabled)
{
llwarns << "Trying to create a texture while GL is disabled!" << llendl;
@@ -1168,29 +1247,29 @@ BOOL LLImageGL::createGLTexture(S32 discard_level, const LLImageRaw* imageraw, S
{
switch (mComponents)
{
- case 1:
+ case 1:
// Use luminance alpha (for fonts)
mFormatInternal = GL_LUMINANCE8;
mFormatPrimary = GL_LUMINANCE;
mFormatType = GL_UNSIGNED_BYTE;
break;
- case 2:
+ case 2:
// Use luminance alpha (for fonts)
mFormatInternal = GL_LUMINANCE8_ALPHA8;
mFormatPrimary = GL_LUMINANCE_ALPHA;
mFormatType = GL_UNSIGNED_BYTE;
break;
- case 3:
+ case 3:
mFormatInternal = GL_RGB8;
mFormatPrimary = GL_RGB;
mFormatType = GL_UNSIGNED_BYTE;
break;
- case 4:
+ case 4:
mFormatInternal = GL_RGBA8;
mFormatPrimary = GL_RGBA;
mFormatType = GL_UNSIGNED_BYTE;
break;
- default:
+ default:
llerrs << "Bad number of components for texture: " << (U32)getComponents() << llendl;
}
@@ -1213,6 +1292,7 @@ BOOL LLImageGL::createGLTexture(S32 discard_level, const LLImageRaw* imageraw, S
BOOL LLImageGL::createGLTexture(S32 discard_level, const U8* data_in, BOOL data_hasmips, S32 usename)
{
llassert(data_in);
+ stop_glerror();
if (discard_level < 0)
{
@@ -1241,8 +1321,11 @@ BOOL LLImageGL::createGLTexture(S32 discard_level, const U8* data_in, BOOL data_
stop_glerror();
{
llverify(gGL.getTexUnit(0)->bind(this));
+ stop_glerror();
glTexParameteri(LLTexUnit::getInternalType(mBindTarget), GL_TEXTURE_BASE_LEVEL, 0);
+ stop_glerror();
glTexParameteri(LLTexUnit::getInternalType(mBindTarget), GL_TEXTURE_MAX_LEVEL, mMaxDiscardLevel-discard_level);
+ stop_glerror();
}
}
if (!mTexName)
@@ -1415,22 +1498,36 @@ BOOL LLImageGL::readBackRaw(S32 discard_level, LLImageRaw* imageraw, bool compre
void LLImageGL::deleteDeadTextures()
{
+ bool reset = false;
+
while (!sDeadTextureList.empty())
{
GLuint tex = sDeadTextureList.front();
sDeadTextureList.pop_front();
- for (int i = 0; i < gGLManager.mNumTextureUnits; i++)
+ for (int i = 0; i < gGLManager.mNumTextureImageUnits; i++)
{
- if (sCurrentBoundTextures[i] == tex)
+ LLTexUnit* tex_unit = gGL.getTexUnit(i);
+
+ if (tex_unit && tex_unit->getCurrTexture() == tex)
{
- gGL.getTexUnit(i)->unbind(LLTexUnit::TT_TEXTURE);
+ tex_unit->unbind(tex_unit->getCurrType());
stop_glerror();
+
+ if (i > 0)
+ {
+ reset = true;
+ }
}
}
glDeleteTextures(1, &tex);
stop_glerror();
}
+
+ if (reset)
+ {
+ gGL.getTexUnit(0)->activate();
+ }
}
void LLImageGL::destroyGLTexture()
@@ -1716,6 +1813,7 @@ void LLImageGL::analyzeAlpha(const void* data_in, U32 w, U32 h)
sample[asum/(16*4)] += 4;
}
+
rowstart += 2 * w * mAlphaStride;
}
length *= 2; // we sampled everything twice, essentially
@@ -1740,7 +1838,7 @@ void LLImageGL::analyzeAlpha(const void* data_in, U32 w, U32 h)
// this to be an intentional effect and don't treat as a mask.
U32 midrangetotal = 0;
- for (U32 i = 4; i < 11; i++)
+ for (U32 i = 2; i < 13; i++)
{
midrangetotal += sample[i];
}
@@ -1755,7 +1853,7 @@ void LLImageGL::analyzeAlpha(const void* data_in, U32 w, U32 h)
upperhalftotal += sample[i];
}
- if (midrangetotal > length/16 || // lots of midrange, or
+ if (midrangetotal > length/48 || // lots of midrange, or
(lowerhalftotal == length && alphatotal != 0) || // all close to transparent but not all totally transparent, or
(upperhalftotal == length && alphatotal != 255*length)) // all close to opaque but not all totally opaque
{
@@ -1873,6 +1971,7 @@ BOOL LLImageGL::getMask(const LLVector2 &tc)
void LLImageGL::setCategory(S32 category)
{
+#if 0 //turn this off temporarily because it is not in use now.
if(!gAuditTexture)
{
return ;
@@ -1893,6 +1992,7 @@ void LLImageGL::setCategory(S32 category)
mCategory = -1 ;
}
}
+#endif
}
//for debug use
diff --git a/indra/llrender/llimagegl.h b/indra/llrender/llimagegl.h
index 6c980984c0..2cfb15b0d9 100644
--- a/indra/llrender/llimagegl.h
+++ b/indra/llrender/llimagegl.h
@@ -98,7 +98,7 @@ public:
// These 3 functions currently wrap glGenTextures(), glDeleteTextures(), and glTexImage2D()
// for tracking purposes and will be deprecated in the future
static void generateTextures(S32 numTextures, U32 *textures);
- static void deleteTextures(S32 numTextures, U32 *textures);
+ static void deleteTextures(S32 numTextures, U32 *textures, bool immediate = false);
static void setManualImage(U32 target, S32 miplevel, S32 intformat, S32 width, S32 height, U32 pixformat, U32 pixtype, const void *pixels);
BOOL createGLTexture() ;
diff --git a/indra/llrender/llpostprocess.cpp b/indra/llrender/llpostprocess.cpp
index d76b2d9004..c0045c8044 100644
--- a/indra/llrender/llpostprocess.cpp
+++ b/indra/llrender/llpostprocess.cpp
@@ -466,21 +466,21 @@ void LLPostProcess::drawOrthoQuad(unsigned int width, unsigned int height, QuadT
void LLPostProcess::viewOrthogonal(unsigned int width, unsigned int height)
{
- glMatrixMode(GL_PROJECTION);
- glPushMatrix();
- glLoadIdentity();
- glOrtho( 0.f, (GLdouble) width , (GLdouble) height , 0.f, -1.f, 1.f );
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
- glLoadIdentity();
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.pushMatrix();
+ gGL.loadIdentity();
+ gGL.ortho( 0.f, (GLdouble) width , (GLdouble) height , 0.f, -1.f, 1.f );
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.pushMatrix();
+ gGL.loadIdentity();
}
void LLPostProcess::viewPerspective(void)
{
- glMatrixMode( GL_PROJECTION );
- glPopMatrix();
- glMatrixMode( GL_MODELVIEW );
- glPopMatrix();
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.popMatrix();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.popMatrix();
}
void LLPostProcess::changeOrthogonal(unsigned int width, unsigned int height)
diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp
index 8eb160f4e7..b0ddacbb05 100644
--- a/indra/llrender/llrender.cpp
+++ b/indra/llrender/llrender.cpp
@@ -1,4 +1,4 @@
-/**
+ /**
* @file llrender.cpp
* @brief LLRender implementation
*
@@ -30,29 +30,35 @@
#include "llvertexbuffer.h"
#include "llcubemap.h"
+#include "llglslshader.h"
#include "llimagegl.h"
#include "llrendertarget.h"
#include "lltexture.h"
+#include "llshadermgr.h"
LLRender gGL;
// Handy copies of last good GL matrices
-F64 gGLModelView[16];
-F64 gGLLastModelView[16];
-F64 gGLLastProjection[16];
-F64 gGLProjection[16];
+F32 gGLModelView[16];
+F32 gGLLastModelView[16];
+F32 gGLLastProjection[16];
+F32 gGLProjection[16];
S32 gGLViewport[4];
U32 LLRender::sUICalls = 0;
U32 LLRender::sUIVerts = 0;
+U32 LLTexUnit::sWhiteTexture = 0;
+bool LLRender::sGLCoreProfile = false;
-static const U32 LL_NUM_TEXTURE_LAYERS = 16;
+static const U32 LL_NUM_TEXTURE_LAYERS = 32;
+static const U32 LL_NUM_LIGHT_UNITS = 8;
static GLenum sGLTextureType[] =
{
GL_TEXTURE_2D,
GL_TEXTURE_RECTANGLE_ARB,
- GL_TEXTURE_CUBE_MAP_ARB
+ GL_TEXTURE_CUBE_MAP_ARB,
+ GL_TEXTURE_2D_MULTISAMPLE
};
static GLint sGLAddressMode[] =
@@ -118,14 +124,30 @@ void LLTexUnit::refreshState(void)
gGL.flush();
glActiveTextureARB(GL_TEXTURE0_ARB + mIndex);
+
+ //
+ // Per apple spec, don't call glEnable/glDisable when index exceeds max texture units
+ // http://www.mailinglistarchive.com/html/mac-opengl@lists.apple.com/2008-07/msg00653.html
+ //
+ bool enableDisable = !LLGLSLShader::sNoFixedFunction &&
+ (mIndex < gGLManager.mNumTextureUnits) && mCurrTexType != LLTexUnit::TT_MULTISAMPLE_TEXTURE;
+
if (mCurrTexType != TT_NONE)
{
- glEnable(sGLTextureType[mCurrTexType]);
+ if (enableDisable)
+ {
+ glEnable(sGLTextureType[mCurrTexType]);
+ }
+
glBindTexture(sGLTextureType[mCurrTexType], mCurrTexture);
}
else
{
- glDisable(GL_TEXTURE_2D);
+ if (enableDisable)
+ {
+ glDisable(GL_TEXTURE_2D);
+ }
+
glBindTexture(GL_TEXTURE_2D, 0);
}
@@ -158,15 +180,25 @@ void LLTexUnit::enable(eTextureType type)
if ( (mCurrTexType != type || gGL.mDirty) && (type != TT_NONE) )
{
+ stop_glerror();
activate();
+ stop_glerror();
if (mCurrTexType != TT_NONE && !gGL.mDirty)
{
disable(); // Force a disable of a previous texture type if it's enabled.
+ stop_glerror();
}
mCurrTexType = type;
gGL.flush();
- glEnable(sGLTextureType[type]);
+ if (!LLGLSLShader::sNoFixedFunction &&
+ type != LLTexUnit::TT_MULTISAMPLE_TEXTURE &&
+ mIndex < gGLManager.mNumTextureUnits)
+ {
+ stop_glerror();
+ glEnable(sGLTextureType[type]);
+ stop_glerror();
+ }
}
}
@@ -179,7 +211,13 @@ void LLTexUnit::disable(void)
activate();
unbind(mCurrTexType);
gGL.flush();
- glDisable(sGLTextureType[mCurrTexType]);
+ if (!LLGLSLShader::sNoFixedFunction &&
+ mCurrTexType != LLTexUnit::TT_MULTISAMPLE_TEXTURE &&
+ mIndex < gGLManager.mNumTextureUnits)
+ {
+ glDisable(sGLTextureType[mCurrTexType]);
+ }
+
mCurrTexType = TT_NONE;
}
}
@@ -255,26 +293,35 @@ bool LLTexUnit::bind(LLImageGL* texture, bool for_rendering, bool forceBind)
{
return bind(LLImageGL::sDefaultGLTexture) ;
}
+ stop_glerror();
return false ;
}
if ((mCurrTexture != texture->getTexName()) || forceBind)
{
gGL.flush();
+ stop_glerror();
activate();
+ stop_glerror();
enable(texture->getTarget());
+ stop_glerror();
mCurrTexture = texture->getTexName();
glBindTexture(sGLTextureType[texture->getTarget()], mCurrTexture);
+ stop_glerror();
texture->updateBindStats(texture->mTextureMemory);
mHasMipMaps = texture->mHasMipMaps;
if (texture->mTexOptionsDirty)
{
+ stop_glerror();
texture->mTexOptionsDirty = false;
setTextureAddressMode(texture->mAddressMode);
setTextureFilteringOption(texture->mFilterOption);
+ stop_glerror();
}
}
+ stop_glerror();
+
return true;
}
@@ -376,7 +423,15 @@ void LLTexUnit::unbind(eTextureType type)
activate();
mCurrTexture = 0;
- glBindTexture(sGLTextureType[type], 0);
+ if (LLGLSLShader::sNoFixedFunction && type == LLTexUnit::TT_TEXTURE)
+ {
+ glBindTexture(sGLTextureType[type], sWhiteTexture);
+ }
+ else
+ {
+ glBindTexture(sGLTextureType[type], 0);
+ }
+ stop_glerror();
}
}
@@ -398,7 +453,7 @@ void LLTexUnit::setTextureAddressMode(eTextureAddressMode mode)
void LLTexUnit::setTextureFilteringOption(LLTexUnit::eTextureFilterOptions option)
{
- if (mIndex < 0 || mCurrTexture == 0) return;
+ if (mIndex < 0 || mCurrTexture == 0 || mCurrTexType == LLTexUnit::TT_MULTISAMPLE_TEXTURE) return;
gGL.flush();
@@ -446,6 +501,11 @@ void LLTexUnit::setTextureFilteringOption(LLTexUnit::eTextureFilterOptions optio
void LLTexUnit::setTextureBlendType(eTextureBlendType type)
{
+ if (LLGLSLShader::sNoFixedFunction)
+ { //texture blend type means nothing when using shaders
+ return;
+ }
+
if (mIndex < 0) return;
// Do nothing if it's already correctly set.
@@ -566,6 +626,11 @@ GLint LLTexUnit::getTextureSourceType(eTextureBlendSrc src, bool isAlpha)
void LLTexUnit::setTextureCombiner(eTextureBlendOp op, eTextureBlendSrc src1, eTextureBlendSrc src2, bool isAlpha)
{
+ if (LLGLSLShader::sNoFixedFunction)
+ { //register combiners do nothing when not using fixed function
+ return;
+ }
+
if (mIndex < 0) return;
activate();
@@ -747,20 +812,203 @@ void LLTexUnit::debugTextureUnit(void)
}
}
+LLLightState::LLLightState(S32 index)
+: mIndex(index),
+ mEnabled(false),
+ mConstantAtten(1.f),
+ mLinearAtten(0.f),
+ mQuadraticAtten(0.f),
+ mSpotExponent(0.f),
+ mSpotCutoff(180.f)
+{
+ if (mIndex == 0)
+ {
+ mDiffuse.set(1,1,1,1);
+ mSpecular.set(1,1,1,1);
+ }
+
+ mAmbient.set(0,0,0,1);
+ mPosition.set(0,0,1,0);
+ mSpotDirection.set(0,0,-1);
+}
+
+void LLLightState::enable()
+{
+ if (!mEnabled)
+ {
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ glEnable(GL_LIGHT0+mIndex);
+ }
+ mEnabled = true;
+ }
+}
+
+void LLLightState::disable()
+{
+ if (mEnabled)
+ {
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ glDisable(GL_LIGHT0+mIndex);
+ }
+ mEnabled = false;
+ }
+}
+
+void LLLightState::setDiffuse(const LLColor4& diffuse)
+{
+ if (mDiffuse != diffuse)
+ {
+ ++gGL.mLightHash;
+ mDiffuse = diffuse;
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ glLightfv(GL_LIGHT0+mIndex, GL_DIFFUSE, mDiffuse.mV);
+ }
+ }
+}
+
+void LLLightState::setAmbient(const LLColor4& ambient)
+{
+ if (mAmbient != ambient)
+ {
+ ++gGL.mLightHash;
+ mAmbient = ambient;
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ glLightfv(GL_LIGHT0+mIndex, GL_AMBIENT, mAmbient.mV);
+ }
+ }
+}
+
+void LLLightState::setSpecular(const LLColor4& specular)
+{
+ if (mSpecular != specular)
+ {
+ ++gGL.mLightHash;
+ mSpecular = specular;
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ glLightfv(GL_LIGHT0+mIndex, GL_SPECULAR, mSpecular.mV);
+ }
+ }
+}
+
+void LLLightState::setPosition(const LLVector4& position)
+{
+ //always set position because modelview matrix may have changed
+ ++gGL.mLightHash;
+ mPosition = position;
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ glLightfv(GL_LIGHT0+mIndex, GL_POSITION, mPosition.mV);
+ }
+ else
+ { //transform position by current modelview matrix
+ glh::vec4f pos(position.mV);
+
+ const glh::matrix4f& mat = gGL.getModelviewMatrix();
+ mat.mult_matrix_vec(pos);
+
+ mPosition.set(pos.v);
+ }
+
+}
+
+void LLLightState::setConstantAttenuation(const F32& atten)
+{
+ if (mConstantAtten != atten)
+ {
+ mConstantAtten = atten;
+ ++gGL.mLightHash;
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ glLightf(GL_LIGHT0+mIndex, GL_CONSTANT_ATTENUATION, atten);
+ }
+ }
+}
+
+void LLLightState::setLinearAttenuation(const F32& atten)
+{
+ if (mLinearAtten != atten)
+ {
+ ++gGL.mLightHash;
+ mLinearAtten = atten;
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ glLightf(GL_LIGHT0+mIndex, GL_LINEAR_ATTENUATION, atten);
+ }
+ }
+}
+
+void LLLightState::setQuadraticAttenuation(const F32& atten)
+{
+ if (mQuadraticAtten != atten)
+ {
+ ++gGL.mLightHash;
+ mQuadraticAtten = atten;
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ glLightf(GL_LIGHT0+mIndex, GL_QUADRATIC_ATTENUATION, atten);
+ }
+ }
+}
+
+void LLLightState::setSpotExponent(const F32& exponent)
+{
+ if (mSpotExponent != exponent)
+ {
+ ++gGL.mLightHash;
+ mSpotExponent = exponent;
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ glLightf(GL_LIGHT0+mIndex, GL_SPOT_EXPONENT, exponent);
+ }
+ }
+}
+
+void LLLightState::setSpotCutoff(const F32& cutoff)
+{
+ if (mSpotCutoff != cutoff)
+ {
+ ++gGL.mLightHash;
+ mSpotCutoff = cutoff;
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ glLightf(GL_LIGHT0+mIndex, GL_SPOT_CUTOFF, cutoff);
+ }
+ }
+}
+
+void LLLightState::setSpotDirection(const LLVector3& direction)
+{
+ //always set direction because modelview matrix may have changed
+ ++gGL.mLightHash;
+ mSpotDirection = direction;
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ glLightfv(GL_LIGHT0+mIndex, GL_SPOT_DIRECTION, direction.mV);
+ }
+ else
+ { //transform direction by current modelview matrix
+ glh::vec3f dir(direction.mV);
+
+ const glh::matrix4f& mat = gGL.getModelviewMatrix();
+ mat.mult_matrix_dir(dir);
+
+ mSpotDirection.set(dir.v);
+ }
+}
LLRender::LLRender()
: mDirty(false),
mCount(0),
+ mQuadCycle(0),
mMode(LLRender::TRIANGLES),
mCurrTextureUnitIndex(0),
mMaxAnisotropy(0.f)
-{
- mBuffer = new LLVertexBuffer(immediate_mask, 0);
- mBuffer->allocateBuffer(4096, 0, TRUE);
- mBuffer->getVertexStrider(mVerticesp);
- mBuffer->getTexCoord0Strider(mTexcoordsp);
- mBuffer->getColorStrider(mColorsp);
-
+{
mTexUnits.reserve(LL_NUM_TEXTURE_LAYERS);
for (U32 i = 0; i < LL_NUM_TEXTURE_LAYERS; i++)
{
@@ -768,6 +1016,11 @@ LLRender::LLRender()
}
mDummyTexUnit = new LLTexUnit(-1);
+ for (U32 i = 0; i < LL_NUM_LIGHT_UNITS; ++i)
+ {
+ mLightState.push_back(new LLLightState(i));
+ }
+
for (U32 i = 0; i < 4; i++)
{
mCurrColorMask[i] = true;
@@ -779,6 +1032,17 @@ LLRender::LLRender()
mCurrBlendAlphaSFactor = BF_UNDEF;
mCurrBlendColorDFactor = BF_UNDEF;
mCurrBlendAlphaDFactor = BF_UNDEF;
+
+ mMatrixMode = LLRender::MM_MODELVIEW;
+
+ for (U32 i = 0; i < NUM_MATRIX_MODES; ++i)
+ {
+ mMatIdx[i] = 0;
+ mMatHash[i] = 0;
+ mCurMatHash[i] = 0xFFFFFFFF;
+ }
+
+ mLightHash = 0;
}
LLRender::~LLRender()
@@ -786,6 +1050,18 @@ LLRender::~LLRender()
shutdown();
}
+void LLRender::init()
+{
+ llassert_always(mBuffer.isNull()) ;
+ stop_glerror();
+ mBuffer = new LLVertexBuffer(immediate_mask, 0);
+ mBuffer->allocateBuffer(4096, 0, TRUE);
+ mBuffer->getVertexStrider(mVerticesp);
+ mBuffer->getTexCoord0Strider(mTexcoordsp);
+ mBuffer->getColorStrider(mColorsp);
+ stop_glerror();
+}
+
void LLRender::shutdown()
{
for (U32 i = 0; i < mTexUnits.size(); i++)
@@ -795,6 +1071,13 @@ void LLRender::shutdown()
mTexUnits.clear();
delete mDummyTexUnit;
mDummyTexUnit = NULL;
+
+ for (U32 i = 0; i < mLightState.size(); ++i)
+ {
+ delete mLightState[i];
+ }
+ mLightState.clear();
+ mBuffer = NULL ;
}
void LLRender::refreshState(void)
@@ -817,28 +1100,355 @@ void LLRender::refreshState(void)
mDirty = false;
}
+void LLRender::syncLightState()
+{
+ LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr;
+
+ if (!shader)
+ {
+ return;
+ }
+
+ if (shader->mLightHash != mLightHash)
+ {
+ shader->mLightHash = mLightHash;
+
+ LLVector4 position[8];
+ LLVector3 direction[8];
+ LLVector3 attenuation[8];
+ LLVector3 diffuse[8];
+
+ for (U32 i = 0; i < 8; i++)
+ {
+ LLLightState* light = mLightState[i];
+
+ position[i] = light->mPosition;
+ direction[i] = light->mSpotDirection;
+ attenuation[i].set(light->mLinearAtten, light->mQuadraticAtten, light->mSpecular.mV[3]);
+ diffuse[i].set(light->mDiffuse.mV);
+ }
+
+ shader->uniform4fv(LLShaderMgr::LIGHT_POSITION, 8, position[0].mV);
+ shader->uniform3fv(LLShaderMgr::LIGHT_DIRECTION, 8, direction[0].mV);
+ shader->uniform3fv(LLShaderMgr::LIGHT_ATTENUATION, 8, attenuation[0].mV);
+ shader->uniform3fv(LLShaderMgr::LIGHT_DIFFUSE, 8, diffuse[0].mV);
+ shader->uniform4fv(LLShaderMgr::LIGHT_AMBIENT, 1, mAmbientLightColor.mV);
+ //HACK -- duplicate sunlight color for compatibility with drivers that can't deal with multiple shader objects referencing the same uniform
+ shader->uniform4fv(LLShaderMgr::SUNLIGHT_COLOR, 1, diffuse[0].mV);
+ }
+}
+
+void LLRender::syncMatrices()
+{
+ stop_glerror();
+
+ U32 name[] =
+ {
+ LLShaderMgr::MODELVIEW_MATRIX,
+ LLShaderMgr::PROJECTION_MATRIX,
+ LLShaderMgr::TEXTURE_MATRIX0,
+ LLShaderMgr::TEXTURE_MATRIX1,
+ LLShaderMgr::TEXTURE_MATRIX2,
+ LLShaderMgr::TEXTURE_MATRIX3,
+ };
+
+ LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr;
+
+ static glh::matrix4f cached_mvp;
+ static U32 cached_mvp_mdv_hash = 0xFFFFFFFF;
+ static U32 cached_mvp_proj_hash = 0xFFFFFFFF;
+
+ static glh::matrix4f cached_normal;
+ static U32 cached_normal_hash = 0xFFFFFFFF;
+
+ if (shader)
+ {
+ llassert(shader);
+
+ bool mvp_done = false;
+
+ U32 i = MM_MODELVIEW;
+ if (mMatHash[i] != shader->mMatHash[i])
+ { //update modelview, normal, and MVP
+ glh::matrix4f& mat = mMatrix[i][mMatIdx[i]];
+
+ shader->uniformMatrix4fv(name[i], 1, GL_FALSE, mat.m);
+ shader->mMatHash[i] = mMatHash[i];
+
+ //update normal matrix
+ S32 loc = shader->getUniformLocation(LLShaderMgr::NORMAL_MATRIX);
+ if (loc > -1)
+ {
+ if (cached_normal_hash != mMatHash[i])
+ {
+ cached_normal = mat.inverse().transpose();
+ cached_normal_hash = mMatHash[i];
+ }
+
+ glh::matrix4f& norm = cached_normal;
+
+ F32 norm_mat[] =
+ {
+ norm.m[0], norm.m[1], norm.m[2],
+ norm.m[4], norm.m[5], norm.m[6],
+ norm.m[8], norm.m[9], norm.m[10]
+ };
+
+ shader->uniformMatrix3fv(LLShaderMgr::NORMAL_MATRIX, 1, GL_FALSE, norm_mat);
+ }
+
+ //update MVP matrix
+ mvp_done = true;
+ loc = shader->getUniformLocation(LLShaderMgr::MODELVIEW_PROJECTION_MATRIX);
+ if (loc > -1)
+ {
+ U32 proj = MM_PROJECTION;
+
+ if (cached_mvp_mdv_hash != mMatHash[i] || cached_mvp_proj_hash != mMatHash[MM_PROJECTION])
+ {
+ cached_mvp = mat;
+ cached_mvp.mult_left(mMatrix[proj][mMatIdx[proj]]);
+ cached_mvp_mdv_hash = mMatHash[i];
+ cached_mvp_proj_hash = mMatHash[MM_PROJECTION];
+ }
+
+ shader->uniformMatrix4fv(LLShaderMgr::MODELVIEW_PROJECTION_MATRIX, 1, GL_FALSE, cached_mvp.m);
+ }
+ }
+
+
+ i = MM_PROJECTION;
+ if (mMatHash[i] != shader->mMatHash[i])
+ { //update projection matrix, normal, and MVP
+ glh::matrix4f& mat = mMatrix[i][mMatIdx[i]];
+
+ shader->uniformMatrix4fv(name[i], 1, GL_FALSE, mat.m);
+ shader->mMatHash[i] = mMatHash[i];
+
+ if (!mvp_done)
+ {
+ //update MVP matrix
+ S32 loc = shader->getUniformLocation(LLShaderMgr::MODELVIEW_PROJECTION_MATRIX);
+ if (loc > -1)
+ {
+ if (cached_mvp_mdv_hash != mMatHash[i] || cached_mvp_proj_hash != mMatHash[MM_PROJECTION])
+ {
+ U32 mdv = MM_MODELVIEW;
+ cached_mvp = mat;
+ cached_mvp.mult_right(mMatrix[mdv][mMatIdx[mdv]]);
+ cached_mvp_mdv_hash = mMatHash[MM_MODELVIEW];
+ cached_mvp_proj_hash = mMatHash[MM_PROJECTION];
+ }
+
+ shader->uniformMatrix4fv(LLShaderMgr::MODELVIEW_PROJECTION_MATRIX, 1, GL_FALSE, cached_mvp.m);
+ }
+ }
+ }
+
+ for (i = MM_TEXTURE0; i < NUM_MATRIX_MODES; ++i)
+ {
+ if (mMatHash[i] != shader->mMatHash[i])
+ {
+ shader->uniformMatrix4fv(name[i], 1, GL_FALSE, mMatrix[i][mMatIdx[i]].m);
+ shader->mMatHash[i] = mMatHash[i];
+ }
+ }
+
+
+ if (shader->mFeatures.hasLighting || shader->mFeatures.calculatesLighting)
+ { //also sync light state
+ syncLightState();
+ }
+ }
+ else if (!LLGLSLShader::sNoFixedFunction)
+ {
+ GLenum mode[] =
+ {
+ GL_MODELVIEW,
+ GL_PROJECTION,
+ GL_TEXTURE,
+ GL_TEXTURE,
+ GL_TEXTURE,
+ GL_TEXTURE,
+ };
+
+ for (U32 i = 0; i < 2; ++i)
+ {
+ if (mMatHash[i] != mCurMatHash[i])
+ {
+ glMatrixMode(mode[i]);
+ glLoadMatrixf(mMatrix[i][mMatIdx[i]].m);
+ mCurMatHash[i] = mMatHash[i];
+ }
+ }
+
+ for (U32 i = 2; i < NUM_MATRIX_MODES; ++i)
+ {
+ if (mMatHash[i] != mCurMatHash[i])
+ {
+ gGL.getTexUnit(i-2)->activate();
+ glMatrixMode(mode[i]);
+ glLoadMatrixf(mMatrix[i][mMatIdx[i]].m);
+ mCurMatHash[i] = mMatHash[i];
+ }
+ }
+ }
+
+ stop_glerror();
+}
+
void LLRender::translatef(const GLfloat& x, const GLfloat& y, const GLfloat& z)
{
flush();
- glTranslatef(x,y,z);
+
+ {
+ glh::matrix4f trans_mat(1,0,0,x,
+ 0,1,0,y,
+ 0,0,1,z,
+ 0,0,0,1);
+
+ mMatrix[mMatrixMode][mMatIdx[mMatrixMode]].mult_right(trans_mat);
+ mMatHash[mMatrixMode]++;
+ }
}
void LLRender::scalef(const GLfloat& x, const GLfloat& y, const GLfloat& z)
{
flush();
- glScalef(x,y,z);
+
+ {
+ glh::matrix4f scale_mat(x,0,0,0,
+ 0,y,0,0,
+ 0,0,z,0,
+ 0,0,0,1);
+
+ mMatrix[mMatrixMode][mMatIdx[mMatrixMode]].mult_right(scale_mat);
+ mMatHash[mMatrixMode]++;
+ }
+}
+
+void LLRender::ortho(F32 left, F32 right, F32 bottom, F32 top, F32 zNear, F32 zFar)
+{
+ flush();
+
+ {
+
+ glh::matrix4f ortho_mat(2.f/(right-left),0,0, -(right+left)/(right-left),
+ 0,2.f/(top-bottom),0, -(top+bottom)/(top-bottom),
+ 0,0,-2.f/(zFar-zNear), -(zFar+zNear)/(zFar-zNear),
+ 0,0,0,1);
+
+ mMatrix[mMatrixMode][mMatIdx[mMatrixMode]].mult_right(ortho_mat);
+ mMatHash[mMatrixMode]++;
+ }
+}
+
+void LLRender::rotatef(const GLfloat& a, const GLfloat& x, const GLfloat& y, const GLfloat& z)
+{
+ flush();
+
+ {
+ F32 r = a * DEG_TO_RAD;
+
+ F32 c = cosf(r);
+ F32 s = sinf(r);
+
+ F32 ic = 1.f-c;
+
+ glh::matrix4f rot_mat(x*x*ic+c, x*y*ic-z*s, x*z*ic+y*s, 0,
+ x*y*ic+z*s, y*y*ic+c, y*z*ic-x*s, 0,
+ x*z*ic-y*s, y*z*ic+x*s, z*z*ic+c, 0,
+ 0,0,0,1);
+
+ mMatrix[mMatrixMode][mMatIdx[mMatrixMode]].mult_right(rot_mat);
+ mMatHash[mMatrixMode]++;
+ }
}
void LLRender::pushMatrix()
{
flush();
- glPushMatrix();
+
+ {
+ if (mMatIdx[mMatrixMode] < LL_MATRIX_STACK_DEPTH-1)
+ {
+ mMatrix[mMatrixMode][mMatIdx[mMatrixMode]+1] = mMatrix[mMatrixMode][mMatIdx[mMatrixMode]];
+ ++mMatIdx[mMatrixMode];
+ }
+ else
+ {
+ llwarns << "Matrix stack overflow." << llendl;
+ }
+ }
}
void LLRender::popMatrix()
{
flush();
- glPopMatrix();
+ {
+ if (mMatIdx[mMatrixMode] > 0)
+ {
+ --mMatIdx[mMatrixMode];
+ mMatHash[mMatrixMode]++;
+ }
+ else
+ {
+ llwarns << "Matrix stack underflow." << llendl;
+ }
+ }
+}
+
+void LLRender::loadMatrix(const GLfloat* m)
+{
+ flush();
+ {
+ mMatrix[mMatrixMode][mMatIdx[mMatrixMode]].set_value((GLfloat*) m);
+ mMatHash[mMatrixMode]++;
+ }
+}
+
+void LLRender::multMatrix(const GLfloat* m)
+{
+ flush();
+ {
+ glh::matrix4f mat((GLfloat*) m);
+
+ mMatrix[mMatrixMode][mMatIdx[mMatrixMode]].mult_right(mat);
+ mMatHash[mMatrixMode]++;
+ }
+}
+
+void LLRender::matrixMode(U32 mode)
+{
+ if (mode == MM_TEXTURE)
+ {
+ mode = MM_TEXTURE0 + gGL.getCurrentTexUnitIndex();
+ }
+
+ llassert(mode < NUM_MATRIX_MODES);
+ mMatrixMode = mode;
+}
+
+void LLRender::loadIdentity()
+{
+ flush();
+
+ {
+ llassert_always(mMatrixMode < NUM_MATRIX_MODES) ;
+
+ mMatrix[mMatrixMode][mMatIdx[mMatrixMode]].make_identity();
+ mMatHash[mMatrixMode]++;
+ }
+}
+
+const glh::matrix4f& LLRender::getModelviewMatrix()
+{
+ return mMatrix[MM_MODELVIEW][mMatIdx[MM_MODELVIEW]];
+}
+
+const glh::matrix4f& LLRender::getProjectionMatrix()
+{
+ return mMatrix[MM_PROJECTION][mMatIdx[MM_PROJECTION]];
}
void LLRender::translateUI(F32 x, F32 y, F32 z)
@@ -898,7 +1508,7 @@ LLVector3 LLRender::getUITranslation()
{
if (mUIOffset.empty())
{
- return LLVector3::zero;
+ return LLVector3(0,0,0);
}
return mUIOffset.back();
}
@@ -907,7 +1517,7 @@ LLVector3 LLRender::getUIScale()
{
if (mUIScale.empty())
{
- return LLVector3(1.f, 1.f, 1.f);
+ return LLVector3(1,1,1);
}
return mUIScale.back();
}
@@ -932,15 +1542,21 @@ void LLRender::setColorMask(bool writeColorR, bool writeColorG, bool writeColorB
{
flush();
- mCurrColorMask[0] = writeColorR;
- mCurrColorMask[1] = writeColorG;
- mCurrColorMask[2] = writeColorB;
- mCurrColorMask[3] = writeAlpha;
+ if (mCurrColorMask[0] != writeColorR ||
+ mCurrColorMask[1] != writeColorG ||
+ mCurrColorMask[2] != writeColorB ||
+ mCurrColorMask[3] != writeAlpha)
+ {
+ mCurrColorMask[0] = writeColorR;
+ mCurrColorMask[1] = writeColorG;
+ mCurrColorMask[2] = writeColorB;
+ mCurrColorMask[3] = writeAlpha;
- glColorMask(writeColorR ? GL_TRUE : GL_FALSE,
- writeColorG ? GL_TRUE : GL_FALSE,
- writeColorB ? GL_TRUE : GL_FALSE,
- writeAlpha ? GL_TRUE : GL_FALSE);
+ glColorMask(writeColorR ? GL_TRUE : GL_FALSE,
+ writeColorG ? GL_TRUE : GL_FALSE,
+ writeColorB ? GL_TRUE : GL_FALSE,
+ writeAlpha ? GL_TRUE : GL_FALSE);
+ }
}
void LLRender::setSceneBlendType(eBlendType type)
@@ -978,15 +1594,48 @@ void LLRender::setAlphaRejectSettings(eCompareFunc func, F32 value)
{
flush();
- mCurrAlphaFunc = func;
- mCurrAlphaFuncVal = value;
- if (func == CF_DEFAULT)
- {
- glAlphaFunc(GL_GREATER, 0.01f);
- }
- else
+ if (LLGLSLShader::sNoFixedFunction)
+ { //glAlphaFunc is deprecated in OpenGL 3.3
+ return;
+ }
+
+ if (mCurrAlphaFunc != func ||
+ mCurrAlphaFuncVal != value)
{
- glAlphaFunc(sGLCompareFunc[func], value);
+ mCurrAlphaFunc = func;
+ mCurrAlphaFuncVal = value;
+ if (func == CF_DEFAULT)
+ {
+ glAlphaFunc(GL_GREATER, 0.01f);
+ }
+ else
+ {
+ glAlphaFunc(sGLCompareFunc[func], value);
+ }
+ }
+
+ if (gDebugGL)
+ { //make sure cached state is correct
+ GLint cur_func = 0;
+ glGetIntegerv(GL_ALPHA_TEST_FUNC, &cur_func);
+
+ if (func == CF_DEFAULT)
+ {
+ func = CF_GREATER;
+ }
+
+ if (cur_func != sGLCompareFunc[func])
+ {
+ llerrs << "Alpha test function corrupted!" << llendl;
+ }
+
+ F32 ref = 0.f;
+ glGetFloatv(GL_ALPHA_TEST_REF, &ref);
+
+ if (ref != value)
+ {
+ llerrs << "Alpha test value corrupted!" << llendl;
+ }
}
}
@@ -1045,6 +1694,29 @@ LLTexUnit* LLRender::getTexUnit(U32 index)
}
}
+LLLightState* LLRender::getLight(U32 index)
+{
+ if (index < mLightState.size())
+ {
+ return mLightState[index];
+ }
+
+ return NULL;
+}
+
+void LLRender::setAmbientLightColor(const LLColor4& color)
+{
+ if (color != mAmbientLightColor)
+ {
+ ++mLightHash;
+ mAmbientLightColor = color;
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ glLightModelfv(GL_LIGHT_MODEL_AMBIENT, color.mV);
+ }
+ }
+}
+
bool LLRender::verifyTexUnitActive(U32 unitToVerify)
{
if (mCurrTextureUnitIndex == unitToVerify)
@@ -1070,6 +1742,11 @@ void LLRender::begin(const GLuint& mode)
{
if (mode != mMode)
{
+ if (mode == LLRender::QUADS)
+ {
+ mQuadCycle = 1;
+ }
+
if (mMode == LLRender::QUADS ||
mMode == LLRender::LINES ||
mMode == LLRender::TRIANGLES ||
@@ -1157,7 +1834,7 @@ void LLRender::flush()
if (gDebugGL)
{
- if (mMode == LLRender::QUADS)
+ if (mMode == LLRender::QUADS && !sGLCoreProfile)
{
if (mCount%4 != 0)
{
@@ -1182,12 +1859,34 @@ void LLRender::flush()
}
}
+ //store mCount in a local variable to avoid re-entrance (drawArrays may call flush)
+ U32 count = mCount;
+ mCount = 0;
+
+ if (mBuffer->useVBOs() && !mBuffer->isLocked())
+ { //hack to only flush the part of the buffer that was updated (relies on stream draw using buffersubdata)
+ mBuffer->getVertexStrider(mVerticesp, 0, count);
+ mBuffer->getTexCoord0Strider(mTexcoordsp, 0, count);
+ mBuffer->getColorStrider(mColorsp, 0, count);
+ }
+
+ mBuffer->flush();
mBuffer->setBuffer(immediate_mask);
- mBuffer->drawArrays(mMode, 0, mCount);
+
+ if (mMode == LLRender::QUADS && sGLCoreProfile)
+ {
+ mBuffer->drawArrays(LLRender::TRIANGLES, 0, count);
+ mQuadCycle = 1;
+ }
+ else
+ {
+ mBuffer->drawArrays(mMode, 0, count);
+ }
+
+ mVerticesp[0] = mVerticesp[count];
+ mTexcoordsp[0] = mTexcoordsp[count];
+ mColorsp[0] = mColorsp[count];
- mVerticesp[0] = mVerticesp[mCount];
- mTexcoordsp[0] = mTexcoordsp[mCount];
- mColorsp[0] = mColorsp[mCount];
mCount = 0;
}
}
@@ -1195,6 +1894,17 @@ void LLRender::flush()
void LLRender::vertex3f(const GLfloat& x, const GLfloat& y, const GLfloat& z)
{
//the range of mVerticesp, mColorsp and mTexcoordsp is [0, 4095]
+ if (mCount > 2048)
+ { //break when buffer gets reasonably full to keep GL command buffers happy and avoid overflow below
+ switch (mMode)
+ {
+ case LLRender::POINTS: flush(); break;
+ case LLRender::TRIANGLES: if (mCount%3==0) flush(); break;
+ case LLRender::QUADS: if(mCount%4 == 0) flush(); break;
+ case LLRender::LINES: if (mCount%2 == 0) flush(); break;
+ }
+ }
+
if (mCount > 4094)
{
// llwarns << "GL immediate mode overflow. Some geometry not drawn." << llendl;
@@ -1211,10 +1921,29 @@ void LLRender::vertex3f(const GLfloat& x, const GLfloat& y, const GLfloat& z)
mVerticesp[mCount] = vert;
}
+ if (mMode == LLRender::QUADS && LLRender::sGLCoreProfile)
+ {
+ mQuadCycle++;
+ if (mQuadCycle == 4)
+ { //copy two vertices so fourth quad element will add a triangle
+ mQuadCycle = 0;
+
+ mCount++;
+ mVerticesp[mCount] = mVerticesp[mCount-3];
+ mColorsp[mCount] = mColorsp[mCount-3];
+ mTexcoordsp[mCount] = mTexcoordsp[mCount-3];
+
+ mCount++;
+ mVerticesp[mCount] = mVerticesp[mCount-2];
+ mColorsp[mCount] = mColorsp[mCount-2];
+ mTexcoordsp[mCount] = mTexcoordsp[mCount-2];
+ }
+ }
+
mCount++;
mVerticesp[mCount] = mVerticesp[mCount-1];
mColorsp[mCount] = mColorsp[mCount-1];
- mTexcoordsp[mCount] = mTexcoordsp[mCount-1];
+ mTexcoordsp[mCount] = mTexcoordsp[mCount-1];
}
void LLRender::vertexBatchPreTransformed(LLVector3* verts, S32 vert_count)
@@ -1225,13 +1954,50 @@ void LLRender::vertexBatchPreTransformed(LLVector3* verts, S32 vert_count)
return;
}
- for (S32 i = 0; i < vert_count; i++)
+ if (sGLCoreProfile && mMode == LLRender::QUADS)
+ { //quads are deprecated, convert to triangle list
+ S32 i = 0;
+
+ while (i < vert_count)
+ {
+ //read first three
+ mVerticesp[mCount++] = verts[i++];
+ mTexcoordsp[mCount] = mTexcoordsp[mCount-1];
+ mColorsp[mCount] = mColorsp[mCount-1];
+
+ mVerticesp[mCount++] = verts[i++];
+ mTexcoordsp[mCount] = mTexcoordsp[mCount-1];
+ mColorsp[mCount] = mColorsp[mCount-1];
+
+ mVerticesp[mCount++] = verts[i++];
+ mTexcoordsp[mCount] = mTexcoordsp[mCount-1];
+ mColorsp[mCount] = mColorsp[mCount-1];
+
+ //copy two
+ mVerticesp[mCount++] = verts[i-3];
+ mTexcoordsp[mCount] = mTexcoordsp[mCount-1];
+ mColorsp[mCount] = mColorsp[mCount-1];
+
+ mVerticesp[mCount++] = verts[i-1];
+ mTexcoordsp[mCount] = mTexcoordsp[mCount-1];
+ mColorsp[mCount] = mColorsp[mCount-1];
+
+ //copy last one
+ mVerticesp[mCount++] = verts[i++];
+ mTexcoordsp[mCount] = mTexcoordsp[mCount-1];
+ mColorsp[mCount] = mColorsp[mCount-1];
+ }
+ }
+ else
{
- mVerticesp[mCount] = verts[i];
+ for (S32 i = 0; i < vert_count; i++)
+ {
+ mVerticesp[mCount] = verts[i];
- mCount++;
- mTexcoordsp[mCount] = mTexcoordsp[mCount-1];
- mColorsp[mCount] = mColorsp[mCount-1];
+ mCount++;
+ mTexcoordsp[mCount] = mTexcoordsp[mCount-1];
+ mColorsp[mCount] = mColorsp[mCount-1];
+ }
}
mVerticesp[mCount] = mVerticesp[mCount-1];
@@ -1245,13 +2011,50 @@ void LLRender::vertexBatchPreTransformed(LLVector3* verts, LLVector2* uvs, S32 v
return;
}
- for (S32 i = 0; i < vert_count; i++)
+ if (sGLCoreProfile && mMode == LLRender::QUADS)
+ { //quads are deprecated, convert to triangle list
+ S32 i = 0;
+
+ while (i < vert_count)
+ {
+ //read first three
+ mVerticesp[mCount] = verts[i];
+ mTexcoordsp[mCount++] = uvs[i++];
+ mColorsp[mCount] = mColorsp[mCount-1];
+
+ mVerticesp[mCount] = verts[i];
+ mTexcoordsp[mCount++] = uvs[i++];
+ mColorsp[mCount] = mColorsp[mCount-1];
+
+ mVerticesp[mCount] = verts[i];
+ mTexcoordsp[mCount++] = uvs[i++];
+ mColorsp[mCount] = mColorsp[mCount-1];
+
+ //copy last two
+ mVerticesp[mCount] = verts[i-3];
+ mTexcoordsp[mCount++] = uvs[i-3];
+ mColorsp[mCount] = mColorsp[mCount-1];
+
+ mVerticesp[mCount] = verts[i-1];
+ mTexcoordsp[mCount++] = uvs[i-1];
+ mColorsp[mCount] = mColorsp[mCount-1];
+
+ //copy last one
+ mVerticesp[mCount] = verts[i];
+ mTexcoordsp[mCount++] = uvs[i++];
+ mColorsp[mCount] = mColorsp[mCount-1];
+ }
+ }
+ else
{
- mVerticesp[mCount] = verts[i];
- mTexcoordsp[mCount] = uvs[i];
+ for (S32 i = 0; i < vert_count; i++)
+ {
+ mVerticesp[mCount] = verts[i];
+ mTexcoordsp[mCount] = uvs[i];
- mCount++;
- mColorsp[mCount] = mColorsp[mCount-1];
+ mCount++;
+ mColorsp[mCount] = mColorsp[mCount-1];
+ }
}
mVerticesp[mCount] = mVerticesp[mCount-1];
@@ -1266,13 +2069,51 @@ void LLRender::vertexBatchPreTransformed(LLVector3* verts, LLVector2* uvs, LLCol
return;
}
- for (S32 i = 0; i < vert_count; i++)
+
+ if (sGLCoreProfile && mMode == LLRender::QUADS)
+ { //quads are deprecated, convert to triangle list
+ S32 i = 0;
+
+ while (i < vert_count)
+ {
+ //read first three
+ mVerticesp[mCount] = verts[i];
+ mTexcoordsp[mCount] = uvs[i];
+ mColorsp[mCount++] = colors[i++];
+
+ mVerticesp[mCount] = verts[i];
+ mTexcoordsp[mCount] = uvs[i];
+ mColorsp[mCount++] = colors[i++];
+
+ mVerticesp[mCount] = verts[i];
+ mTexcoordsp[mCount] = uvs[i];
+ mColorsp[mCount++] = colors[i++];
+
+ //copy last two
+ mVerticesp[mCount] = verts[i-3];
+ mTexcoordsp[mCount] = uvs[i-3];
+ mColorsp[mCount++] = colors[i-3];
+
+ mVerticesp[mCount] = verts[i-1];
+ mTexcoordsp[mCount] = uvs[i-1];
+ mColorsp[mCount++] = colors[i-1];
+
+ //copy last one
+ mVerticesp[mCount] = verts[i];
+ mTexcoordsp[mCount] = uvs[i];
+ mColorsp[mCount++] = colors[i++];
+ }
+ }
+ else
{
- mVerticesp[mCount] = verts[i];
- mTexcoordsp[mCount] = uvs[i];
- mColorsp[mCount] = colors[i];
+ for (S32 i = 0; i < vert_count; i++)
+ {
+ mVerticesp[mCount] = verts[i];
+ mTexcoordsp[mCount] = uvs[i];
+ mColorsp[mCount] = colors[i];
- mCount++;
+ mCount++;
+ }
}
mVerticesp[mCount] = mVerticesp[mCount-1];
@@ -1347,6 +2188,81 @@ void LLRender::color3fv(const GLfloat* c)
color4f(c[0],c[1],c[2],1);
}
+void LLRender::diffuseColor3f(F32 r, F32 g, F32 b)
+{
+ LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr;
+ llassert(!LLGLSLShader::sNoFixedFunction || shader != NULL);
+
+ if (shader)
+ {
+ shader->uniform4f(LLShaderMgr::DIFFUSE_COLOR, r,g,b,1.f);
+ }
+ else
+ {
+ glColor3f(r,g,b);
+ }
+}
+
+void LLRender::diffuseColor3fv(const F32* c)
+{
+ LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr;
+ llassert(!LLGLSLShader::sNoFixedFunction || shader != NULL);
+
+ if (shader)
+ {
+ shader->uniform4f(LLShaderMgr::DIFFUSE_COLOR, c[0], c[1], c[2], 1.f);
+ }
+ else
+ {
+ glColor3fv(c);
+ }
+}
+
+void LLRender::diffuseColor4f(F32 r, F32 g, F32 b, F32 a)
+{
+ LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr;
+ llassert(!LLGLSLShader::sNoFixedFunction || shader != NULL);
+
+ if (shader)
+ {
+ shader->uniform4f(LLShaderMgr::DIFFUSE_COLOR, r,g,b,a);
+ }
+ else
+ {
+ glColor4f(r,g,b,a);
+ }
+}
+
+void LLRender::diffuseColor4fv(const F32* c)
+{
+ LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr;
+ llassert(!LLGLSLShader::sNoFixedFunction || shader != NULL);
+
+ if (shader)
+ {
+ shader->uniform4fv(LLShaderMgr::DIFFUSE_COLOR, 1, c);
+ }
+ else
+ {
+ glColor4fv(c);
+ }
+}
+
+void LLRender::diffuseColor4ubv(const U8* c)
+{
+ LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr;
+ llassert(!LLGLSLShader::sNoFixedFunction || shader != NULL);
+
+ if (shader)
+ {
+ shader->uniform4f(LLShaderMgr::DIFFUSE_COLOR, c[0]/255.f, c[1]/255.f, c[2]/255.f, c[3]/255.f);
+ }
+ else
+ {
+ glColor4ubv(c);
+ }
+}
+
void LLRender::debugTexUnits(void)
{
LL_INFOS("TextureUnit") << "Active TexUnit: " << mCurrTextureUnitIndex << LL_ENDL;
diff --git a/indra/llrender/llrender.h b/indra/llrender/llrender.h
index 2767aa64a8..fa5f7f311d 100644
--- a/indra/llrender/llrender.h
+++ b/indra/llrender/llrender.h
@@ -37,9 +37,12 @@
#include "v2math.h"
#include "v3math.h"
#include "v4coloru.h"
+#include "v4math.h"
#include "llstrider.h"
#include "llpointer.h"
#include "llglheaders.h"
+#include "llmatrix4a.h"
+#include "glh/glh_linear.h"
class LLVertexBuffer;
class LLCubeMap;
@@ -47,15 +50,20 @@ class LLImageGL;
class LLRenderTarget;
class LLTexture ;
+#define LL_MATRIX_STACK_DEPTH 32
+
class LLTexUnit
{
friend class LLRender;
public:
+ static U32 sWhiteTexture;
+
typedef enum
{
TT_TEXTURE = 0, // Standard 2D Texture
TT_RECT_TEXTURE, // Non power of 2 texture
TT_CUBE_MAP, // 6-sided cube map texture
+ TT_MULTISAMPLE_TEXTURE, // see GL_ARB_texture_multisample
TT_NONE // No texture type is currently enabled
} eTextureType;
@@ -212,6 +220,43 @@ protected:
void setTextureCombiner(eTextureBlendOp op, eTextureBlendSrc src1, eTextureBlendSrc src2, bool isAlpha = false);
};
+class LLLightState
+{
+public:
+ LLLightState(S32 index);
+
+ void enable();
+ void disable();
+ void setDiffuse(const LLColor4& diffuse);
+ void setAmbient(const LLColor4& ambient);
+ void setSpecular(const LLColor4& specular);
+ void setPosition(const LLVector4& position);
+ void setConstantAttenuation(const F32& atten);
+ void setLinearAttenuation(const F32& atten);
+ void setQuadraticAttenuation(const F32& atten);
+ void setSpotExponent(const F32& exponent);
+ void setSpotCutoff(const F32& cutoff);
+ void setSpotDirection(const LLVector3& direction);
+
+protected:
+ friend class LLRender;
+
+ S32 mIndex;
+ bool mEnabled;
+ LLColor4 mDiffuse;
+ LLColor4 mAmbient;
+ LLColor4 mSpecular;
+ LLVector4 mPosition;
+ LLVector3 mSpotDirection;
+
+ F32 mConstantAtten;
+ F32 mLinearAtten;
+ F32 mQuadraticAtten;
+
+ F32 mSpotExponent;
+ F32 mSpotCutoff;
+};
+
class LLRender
{
friend class LLTexUnit;
@@ -269,8 +314,21 @@ public:
BF_UNDEF
} eBlendFactor;
+ typedef enum
+ {
+ MM_MODELVIEW = 0,
+ MM_PROJECTION,
+ MM_TEXTURE0,
+ MM_TEXTURE1,
+ MM_TEXTURE2,
+ MM_TEXTURE3,
+ NUM_MATRIX_MODES,
+ MM_TEXTURE
+ } eMatrixMode;
+
LLRender();
~LLRender();
+ void init() ;
void shutdown();
// Refreshes renderer state to the cached values
@@ -279,8 +337,21 @@ public:
void translatef(const GLfloat& x, const GLfloat& y, const GLfloat& z);
void scalef(const GLfloat& x, const GLfloat& y, const GLfloat& z);
+ void rotatef(const GLfloat& a, const GLfloat& x, const GLfloat& y, const GLfloat& z);
+ void ortho(F32 left, F32 right, F32 bottom, F32 top, F32 zNear, F32 zFar);
+
void pushMatrix();
void popMatrix();
+ void loadMatrix(const GLfloat* m);
+ void loadIdentity();
+ void multMatrix(const GLfloat* m);
+ void matrixMode(U32 mode);
+
+ const glh::matrix4f& getModelviewMatrix();
+ const glh::matrix4f& getProjectionMatrix();
+
+ void syncMatrices();
+ void syncLightState();
void translateUI(F32 x, F32 y, F32 z);
void scaleUI(F32 x, F32 y, F32 z);
@@ -311,6 +382,12 @@ public:
void color3fv(const GLfloat* c);
void color4ubv(const GLubyte* c);
+ void diffuseColor3f(F32 r, F32 g, F32 b);
+ void diffuseColor3fv(const F32* c);
+ void diffuseColor4f(F32 r, F32 g, F32 b, F32 a);
+ void diffuseColor4fv(const F32* c);
+ void diffuseColor4ubv(const U8* c);
+
void vertexBatchPreTransformed(LLVector3* verts, S32 vert_count);
void vertexBatchPreTransformed(LLVector3* verts, LLVector2* uvs, S32 vert_count);
void vertexBatchPreTransformed(LLVector3* verts, LLVector2* uvs, LLColor4U*, S32 vert_count);
@@ -327,6 +404,9 @@ public:
void blendFunc(eBlendFactor color_sfactor, eBlendFactor color_dfactor,
eBlendFactor alpha_sfactor, eBlendFactor alpha_dfactor);
+ LLLightState* getLight(U32 index);
+ void setAmbientLightColor(const LLColor4& color);
+
LLTexUnit* getTexUnit(U32 index);
U32 getCurrentTexUnitIndex(void) const { return mCurrTextureUnitIndex; }
@@ -347,9 +427,21 @@ public:
public:
static U32 sUICalls;
static U32 sUIVerts;
+ static bool sGLCoreProfile;
private:
- bool mDirty;
+ friend class LLLightState;
+
+ U32 mMatrixMode;
+ U32 mMatIdx[NUM_MATRIX_MODES];
+ U32 mMatHash[NUM_MATRIX_MODES];
+ glh::matrix4f mMatrix[NUM_MATRIX_MODES][LL_MATRIX_STACK_DEPTH];
+ U32 mCurMatHash[NUM_MATRIX_MODES];
+ U32 mLightHash;
+ LLColor4 mAmbientLightColor;
+
+ bool mDirty;
+ U32 mQuadCycle;
U32 mCount;
U32 mMode;
U32 mCurrTextureUnitIndex;
@@ -363,6 +455,7 @@ private:
LLStrider<LLColor4U> mColorsp;
std::vector<LLTexUnit*> mTexUnits;
LLTexUnit* mDummyTexUnit;
+ std::vector<LLLightState*> mLightState;
eBlendFactor mCurrBlendColorSFactor;
eBlendFactor mCurrBlendColorDFactor;
@@ -376,10 +469,10 @@ private:
};
-extern F64 gGLModelView[16];
-extern F64 gGLLastModelView[16];
-extern F64 gGLLastProjection[16];
-extern F64 gGLProjection[16];
+extern F32 gGLModelView[16];
+extern F32 gGLLastModelView[16];
+extern F32 gGLLastProjection[16];
+extern F32 gGLProjection[16];
extern S32 gGLViewport[4];
extern LLRender gGL;
diff --git a/indra/llrender/llrendersphere.cpp b/indra/llrender/llrendersphere.cpp
index a5cd70445f..26bfe036e8 100644
--- a/indra/llrender/llrendersphere.cpp
+++ b/indra/llrender/llrendersphere.cpp
@@ -35,106 +35,12 @@
#include "llglheaders.h"
-GLUquadricObj *gQuadObj2 = NULL;
LLRenderSphere gSphere;
-void drawSolidSphere(GLdouble radius, GLint slices, GLint stacks);
-
-void drawSolidSphere(GLdouble radius, GLint slices, GLint stacks)
-{
- if (!gQuadObj2)
- {
- gQuadObj2 = gluNewQuadric();
- if (!gQuadObj2)
- {
- llwarns << "drawSolidSphere couldn't allocate quadric" << llendl;
- return;
- }
- }
-
- gluQuadricDrawStyle(gQuadObj2, GLU_FILL);
- gluQuadricNormals(gQuadObj2, GLU_SMOOTH);
- // If we ever changed/used the texture or orientation state
- // of quadObj, we'd need to change it to the defaults here
- // with gluQuadricTexture and/or gluQuadricOrientation.
- gluQuadricTexture(gQuadObj2, GL_TRUE);
- gluSphere(gQuadObj2, radius, slices, stacks);
-}
-
-
-// A couple thoughts on sphere drawing:
-// 1) You need more slices than stacks, but little less than 2:1
-// 2) At low LOD, setting stacks to an odd number avoids a "band" around the equator, making things look smoother
-void LLRenderSphere::prerender()
-{
- // Create a series of display lists for different LODs
- mDList[0] = glGenLists(1);
- glNewList(mDList[0], GL_COMPILE);
- drawSolidSphere(1.0, 30, 20);
- glEndList();
-
- mDList[1] = glGenLists(1);
- glNewList(mDList[1], GL_COMPILE);
- drawSolidSphere(1.0, 20, 15);
- glEndList();
-
- mDList[2] = glGenLists(1);
- glNewList(mDList[2], GL_COMPILE);
- drawSolidSphere(1.0, 12, 8);
- glEndList();
-
- mDList[3] = glGenLists(1);
- glNewList(mDList[3], GL_COMPILE);
- drawSolidSphere(1.0, 8, 5);
- glEndList();
-}
-
-void LLRenderSphere::cleanupGL()
-{
- for (S32 detail = 0; detail < 4; detail++)
- {
- glDeleteLists(mDList[detail], 1);
- mDList[detail] = 0;
- }
-
- if (gQuadObj2)
- {
- gluDeleteQuadric(gQuadObj2);
- gQuadObj2 = NULL;
- }
-}
-
-// Constants here are empirically derived from my eyeballs, JNC
-//
-// The toughest adjustment is the cutoff for the lowest LOD
-// Maybe we should have more LODs at the low end?
-void LLRenderSphere::render(F32 pixel_area)
-{
- S32 level_of_detail;
-
- if (pixel_area > 10000.f)
- {
- level_of_detail = 0;
- }
- else if (pixel_area > 800.f)
- {
- level_of_detail = 1;
- }
- else if (pixel_area > 100.f)
- {
- level_of_detail = 2;
- }
- else
- {
- level_of_detail = 3;
- }
- glCallList(mDList[level_of_detail]);
-}
-
-
void LLRenderSphere::render()
{
- glCallList(mDList[0]);
+ renderGGL();
+ gGL.flush();
}
inline LLVector3 polar_to_cart(F32 latitude, F32 longitude)
diff --git a/indra/llrender/llrendersphere.h b/indra/llrender/llrendersphere.h
index 96a6bec80c..f8e9e86e7f 100644
--- a/indra/llrender/llrendersphere.h
+++ b/indra/llrender/llrendersphere.h
@@ -40,11 +40,6 @@ void lat2xyz(LLVector3 * result, F32 lat, F32 lon); // utility routine
class LLRenderSphere
{
public:
- LLGLuint mDList[5];
-
- void prerender();
- void cleanupGL();
- void render(F32 pixel_area); // of a box of size 1.0 at that position
void render(); // render at highest LOD
void renderGGL(); // render using LLRender
diff --git a/indra/llrender/llrendertarget.cpp b/indra/llrender/llrendertarget.cpp
index 7205210fcc..ef2a7395da 100644
--- a/indra/llrender/llrendertarget.cpp
+++ b/indra/llrender/llrendertarget.cpp
@@ -31,26 +31,26 @@
#include "llgl.h"
LLRenderTarget* LLRenderTarget::sBoundTarget = NULL;
-
-
+U32 LLRenderTarget::sBytesAllocated = 0;
void check_framebuffer_status()
{
if (gDebugGL)
{
- GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
+ GLenum status = glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER);
switch (status)
{
- case GL_FRAMEBUFFER_COMPLETE_EXT:
+ case GL_FRAMEBUFFER_COMPLETE:
break;
default:
+ llwarns << "check_framebuffer_status failed -- " << std::hex << status << llendl;
ll_fail("check_framebuffer_status failed");
break;
}
}
}
-BOOL LLRenderTarget::sUseFBO = FALSE;
+bool LLRenderTarget::sUseFBO = false;
LLRenderTarget::LLRenderTarget() :
mResX(0),
@@ -59,11 +59,9 @@ LLRenderTarget::LLRenderTarget() :
mFBO(0),
mDepth(0),
mStencil(0),
- mUseDepth(FALSE),
- mRenderDepth(FALSE),
- mUsage(LLTexUnit::TT_TEXTURE),
- mSamples(0),
- mSampleBuffer(NULL)
+ mUseDepth(false),
+ mRenderDepth(false),
+ mUsage(LLTexUnit::TT_TEXTURE)
{
}
@@ -72,15 +70,12 @@ LLRenderTarget::~LLRenderTarget()
release();
}
-
-void LLRenderTarget::setSampleBuffer(LLMultisampleBuffer* buffer)
-{
- mSampleBuffer = buffer;
-}
-
-void LLRenderTarget::allocate(U32 resx, U32 resy, U32 color_fmt, BOOL depth, BOOL stencil, LLTexUnit::eTextureType usage, BOOL use_fbo)
+bool LLRenderTarget::allocate(U32 resx, U32 resy, U32 color_fmt, bool depth, bool stencil, LLTexUnit::eTextureType usage, bool use_fbo, S32 samples)
{
stop_glerror();
+ release();
+ stop_glerror();
+
mResX = resx;
mResY = resy;
@@ -88,48 +83,48 @@ void LLRenderTarget::allocate(U32 resx, U32 resy, U32 color_fmt, BOOL depth, BOO
mUsage = usage;
mUseDepth = depth;
- release();
-
if ((sUseFBO || use_fbo) && gGLManager.mHasFramebufferObject)
{
if (depth)
{
- stop_glerror();
- allocateDepth();
- stop_glerror();
+ if (!allocateDepth())
+ {
+ llwarns << "Failed to allocate depth buffer for render target." << llendl;
+ return false;
+ }
}
- glGenFramebuffersEXT(1, (GLuint *) &mFBO);
+ glGenFramebuffers(1, (GLuint *) &mFBO);
if (mDepth)
{
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mFBO);
+ glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
if (mStencil)
{
- glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, mDepth);
+ glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, mDepth);
stop_glerror();
- glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, mDepth);
+ glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, mDepth);
stop_glerror();
}
else
{
- glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, LLTexUnit::getInternalType(mUsage), mDepth, 0);
+ glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, LLTexUnit::getInternalType(mUsage), mDepth, 0);
stop_glerror();
}
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
+ glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
stop_glerror();
}
- addColorAttachment(color_fmt);
+ return addColorAttachment(color_fmt);
}
-void LLRenderTarget::addColorAttachment(U32 color_fmt)
+bool LLRenderTarget::addColorAttachment(U32 color_fmt)
{
if (color_fmt == 0)
{
- return;
+ return true;
}
U32 offset = mTex.size();
@@ -145,61 +140,102 @@ void LLRenderTarget::addColorAttachment(U32 color_fmt)
stop_glerror();
- LLImageGL::setManualImage(LLTexUnit::getInternalType(mUsage), 0, color_fmt, mResX, mResY, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
+
+ {
+ clear_glerror();
+ LLImageGL::setManualImage(LLTexUnit::getInternalType(mUsage), 0, color_fmt, mResX, mResY, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
+ if (glGetError() != GL_NO_ERROR)
+ {
+ llwarns << "Could not allocate color buffer for render target." << llendl;
+ return false;
+ }
+ }
+
+ sBytesAllocated += mResX*mResY*4;
stop_glerror();
+
if (offset == 0)
- {
+ { //use bilinear filtering on single texture render targets that aren't multisampled
gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR);
+ stop_glerror();
}
else
{ //don't filter data attachments
gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_POINT);
+ stop_glerror();
}
+
if (mUsage != LLTexUnit::TT_RECT_TEXTURE)
{
gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_MIRROR);
+ stop_glerror();
}
else
{
// ATI doesn't support mirrored repeat for rectangular textures.
gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
+ stop_glerror();
}
+
if (mFBO)
{
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mFBO);
- glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT+offset,
+ stop_glerror();
+ glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
+ glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0+offset,
LLTexUnit::getInternalType(mUsage), tex, 0);
stop_glerror();
check_framebuffer_status();
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
+ glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
mTex.push_back(tex);
+ if (gDebugGL)
+ { //bind and unbind to validate target
+ bindTarget();
+ flush();
+ }
+
+ return true;
}
-void LLRenderTarget::allocateDepth()
+bool LLRenderTarget::allocateDepth()
{
if (mStencil)
{
//use render buffers where stencil buffers are in play
- glGenRenderbuffersEXT(1, (GLuint *) &mDepth);
- glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, mDepth);
- glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH24_STENCIL8_EXT, mResX, mResY);
- glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0);
+ glGenRenderbuffers(1, (GLuint *) &mDepth);
+ glBindRenderbuffer(GL_RENDERBUFFER, mDepth);
+ stop_glerror();
+ clear_glerror();
+ glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, mResX, mResY);
+ glBindRenderbuffer(GL_RENDERBUFFER, 0);
}
else
{
LLImageGL::generateTextures(1, &mDepth);
gGL.getTexUnit(0)->bindManual(mUsage, mDepth);
+
U32 internal_type = LLTexUnit::getInternalType(mUsage);
+ stop_glerror();
+ clear_glerror();
+ LLImageGL::setManualImage(internal_type, 0, GL_DEPTH_COMPONENT24, mResX, mResY, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, NULL);
gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_POINT);
- LLImageGL::setManualImage(internal_type, 0, GL_DEPTH_COMPONENT32_ARB, mResX, mResY, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, NULL);
}
+
+ sBytesAllocated += mResX*mResY*4;
+
+ if (glGetError() != GL_NO_ERROR)
+ {
+ llwarns << "Unable to allocate depth buffer for render target." << llendl;
+ return false;
+ }
+
+ return true;
}
void LLRenderTarget::shareDepthBuffer(LLRenderTarget& target)
@@ -209,65 +245,93 @@ void LLRenderTarget::shareDepthBuffer(LLRenderTarget& target)
llerrs << "Cannot share depth buffer between non FBO render targets." << llendl;
}
+ if (target.mDepth)
+ {
+ llerrs << "Attempting to override existing depth buffer. Detach existing buffer first." << llendl;
+ }
+
+ if (target.mUseDepth)
+ {
+ llerrs << "Attempting to override existing shared depth buffer. Detach existing buffer first." << llendl;
+ }
+
if (mDepth)
{
stop_glerror();
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, target.mFBO);
+ glBindFramebuffer(GL_FRAMEBUFFER, target.mFBO);
stop_glerror();
if (mStencil)
{
- glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, mDepth);
+ glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, mDepth);
stop_glerror();
- glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, mDepth);
+ glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, mDepth);
stop_glerror();
+ target.mStencil = true;
}
else
{
- glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, LLTexUnit::getInternalType(mUsage), mDepth, 0);
+ glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, LLTexUnit::getInternalType(mUsage), mDepth, 0);
stop_glerror();
- if (mStencil)
- {
- glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, LLTexUnit::getInternalType(mUsage), mDepth, 0);
- stop_glerror();
- }
}
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
- target.mUseDepth = TRUE;
+ check_framebuffer_status();
+
+ glBindFramebuffer(GL_FRAMEBUFFER, 0);
+
+ target.mUseDepth = true;
}
}
void LLRenderTarget::release()
{
- if (mFBO)
- {
- glDeleteFramebuffersEXT(1, (GLuint *) &mFBO);
- mFBO = 0;
- }
-
- if (mTex.size() > 0)
- {
- LLImageGL::deleteTextures(mTex.size(), &mTex[0]);
- mTex.clear();
- }
-
if (mDepth)
{
if (mStencil)
{
- glDeleteRenderbuffersEXT(1, (GLuint*) &mDepth);
+ glDeleteRenderbuffers(1, (GLuint*) &mDepth);
stop_glerror();
}
else
{
- LLImageGL::deleteTextures(1, &mDepth);
+ LLImageGL::deleteTextures(1, &mDepth, true);
stop_glerror();
}
mDepth = 0;
+
+ sBytesAllocated -= mResX*mResY*4;
+ }
+ else if (mUseDepth && mFBO)
+ { //detach shared depth buffer
+ glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
+ if (mStencil)
+ { //attached as a renderbuffer
+ glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, 0);
+ glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, 0);
+ mStencil = false;
+ }
+ else
+ { //attached as a texture
+ glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, LLTexUnit::getInternalType(mUsage), 0, 0);
+ }
+ mUseDepth = false;
+ }
+
+ if (mFBO)
+ {
+ glDeleteFramebuffers(1, (GLuint *) &mFBO);
+ mFBO = 0;
+ }
+
+ if (mTex.size() > 0)
+ {
+ sBytesAllocated -= mResX*mResY*4*mTex.size();
+ LLImageGL::deleteTextures(mTex.size(), &mTex[0], true);
+ mTex.clear();
}
+
+ mResX = mResY = 0;
- mSampleBuffer = NULL;
sBoundTarget = NULL;
}
@@ -276,34 +340,27 @@ void LLRenderTarget::bindTarget()
if (mFBO)
{
stop_glerror();
- if (mSampleBuffer)
- {
- mSampleBuffer->bindTarget(this);
- stop_glerror();
+
+ glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
+ stop_glerror();
+ if (gGLManager.mHasDrawBuffers)
+ { //setup multiple render targets
+ GLenum drawbuffers[] = {GL_COLOR_ATTACHMENT0,
+ GL_COLOR_ATTACHMENT1,
+ GL_COLOR_ATTACHMENT2,
+ GL_COLOR_ATTACHMENT3};
+ glDrawBuffersARB(mTex.size(), drawbuffers);
}
- else
- {
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mFBO);
- stop_glerror();
- if (gGLManager.mHasDrawBuffers)
- { //setup multiple render targets
- GLenum drawbuffers[] = {GL_COLOR_ATTACHMENT0_EXT,
- GL_COLOR_ATTACHMENT1_EXT,
- GL_COLOR_ATTACHMENT2_EXT,
- GL_COLOR_ATTACHMENT3_EXT};
- glDrawBuffersARB(mTex.size(), drawbuffers);
- }
- if (mTex.empty())
- { //no color buffer to draw to
- glDrawBuffer(GL_NONE);
- glReadBuffer(GL_NONE);
- }
+ if (mTex.empty())
+ { //no color buffer to draw to
+ glDrawBuffer(GL_NONE);
+ glReadBuffer(GL_NONE);
+ }
- check_framebuffer_status();
+ check_framebuffer_status();
- stop_glerror();
- }
+ stop_glerror();
}
glViewport(0, 0, mResX, mResY);
@@ -315,7 +372,7 @@ void LLRenderTarget::unbindTarget()
{
if (gGLManager.mHasFramebufferObject)
{
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
+ glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
sBoundTarget = NULL;
}
@@ -349,19 +406,19 @@ U32 LLRenderTarget::getTexture(U32 attachment) const
{
llerrs << "Invalid attachment index." << llendl;
}
+ if (mTex.empty())
+ {
+ return 0;
+ }
return mTex[attachment];
}
void LLRenderTarget::bindTexture(U32 index, S32 channel)
{
- if (index > mTex.size()-1)
- {
- llerrs << "Invalid attachment index." << llendl;
- }
- gGL.getTexUnit(channel)->bindManual(mUsage, mTex[index]);
+ gGL.getTexUnit(channel)->bindManual(mUsage, getTexture(index));
}
-void LLRenderTarget::flush(BOOL fetch_depth)
+void LLRenderTarget::flush(bool fetch_depth)
{
gGL.flush();
if (!mFBO)
@@ -377,7 +434,7 @@ void LLRenderTarget::flush(BOOL fetch_depth)
}
gGL.getTexUnit(0)->bind(this);
- glCopyTexImage2D(LLTexUnit::getInternalType(mUsage), 0, GL_DEPTH24_STENCIL8_EXT, 0, 0, mResX, mResY, 0);
+ glCopyTexImage2D(LLTexUnit::getInternalType(mUsage), 0, GL_DEPTH24_STENCIL8, 0, 0, mResX, mResY, 0);
}
gGL.getTexUnit(0)->disable();
@@ -385,93 +442,55 @@ void LLRenderTarget::flush(BOOL fetch_depth)
else
{
stop_glerror();
-
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
-
+ glBindFramebuffer(GL_FRAMEBUFFER, 0);
stop_glerror();
-
- if (mSampleBuffer)
- {
- LLGLEnable multisample(GL_MULTISAMPLE_ARB);
- stop_glerror();
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mFBO);
- stop_glerror();
- check_framebuffer_status();
- glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, mSampleBuffer->mFBO);
- check_framebuffer_status();
-
- stop_glerror();
- glBlitFramebufferEXT(0, 0, mResX, mResY, 0, 0, mResX, mResY, GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST);
- stop_glerror();
-
- if (mTex.size() > 1)
- {
- for (U32 i = 1; i < mTex.size(); ++i)
- {
- glFramebufferTexture2DEXT(GL_DRAW_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
- LLTexUnit::getInternalType(mUsage), mTex[i], 0);
- stop_glerror();
- glFramebufferRenderbufferEXT(GL_READ_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_EXT, mSampleBuffer->mTex[i]);
- stop_glerror();
- glBlitFramebufferEXT(0, 0, mResX, mResY, 0, 0, mResX, mResY, GL_COLOR_BUFFER_BIT, GL_NEAREST);
- stop_glerror();
- }
-
- for (U32 i = 0; i < mTex.size(); ++i)
- {
- glFramebufferTexture2DEXT(GL_DRAW_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT+i,
- LLTexUnit::getInternalType(mUsage), mTex[i], 0);
- stop_glerror();
- glFramebufferRenderbufferEXT(GL_READ_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT+i, GL_RENDERBUFFER_EXT, mSampleBuffer->mTex[i]);
- stop_glerror();
- }
- }
- }
-
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
}
}
void LLRenderTarget::copyContents(LLRenderTarget& source, S32 srcX0, S32 srcY0, S32 srcX1, S32 srcY1,
S32 dstX0, S32 dstY0, S32 dstX1, S32 dstY1, U32 mask, U32 filter)
{
+ GLboolean write_depth = mask & GL_DEPTH_BUFFER_BIT ? TRUE : FALSE;
+
+ LLGLDepthTest depth(write_depth, write_depth);
+
gGL.flush();
if (!source.mFBO || !mFBO)
{
- llerrs << "Cannot copy framebuffer contents for non FBO render targets." << llendl;
+ llwarns << "Cannot copy framebuffer contents for non FBO render targets." << llendl;
+ return;
}
- if (mSampleBuffer)
+
+ if (mask == GL_DEPTH_BUFFER_BIT && source.mStencil != mStencil)
{
- mSampleBuffer->copyContents(source, srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
+ stop_glerror();
+
+ glBindFramebuffer(GL_FRAMEBUFFER, source.mFBO);
+ check_framebuffer_status();
+ gGL.getTexUnit(0)->bind(this, true);
+ stop_glerror();
+ glCopyTexSubImage2D(LLTexUnit::getInternalType(mUsage), 0, srcX0, srcY0, dstX0, dstY0, dstX1, dstY1);
+ stop_glerror();
+ glBindFramebuffer(GL_FRAMEBUFFER, 0);
+ stop_glerror();
}
else
{
- if (mask == GL_DEPTH_BUFFER_BIT && source.mStencil != mStencil)
- {
- stop_glerror();
-
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, source.mFBO);
- gGL.getTexUnit(0)->bind(this, true);
- stop_glerror();
- glCopyTexSubImage2D(LLTexUnit::getInternalType(mUsage), 0, srcX0, srcY0, dstX0, dstY0, dstX1, dstY1);
- stop_glerror();
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
- stop_glerror();
- }
- else
- {
- glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, source.mFBO);
- stop_glerror();
- glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, mFBO);
- stop_glerror();
- check_framebuffer_status();
- stop_glerror();
- glBlitFramebufferEXT(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
- stop_glerror();
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
- stop_glerror();
- }
+ glBindFramebuffer(GL_READ_FRAMEBUFFER, source.mFBO);
+ stop_glerror();
+ glBindFramebuffer(GL_DRAW_FRAMEBUFFER, mFBO);
+ stop_glerror();
+ check_framebuffer_status();
+ stop_glerror();
+ glBlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
+ stop_glerror();
+ glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
+ stop_glerror();
+ glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
+ stop_glerror();
+ glBindFramebuffer(GL_FRAMEBUFFER, 0);
+ stop_glerror();
}
}
@@ -484,22 +503,26 @@ void LLRenderTarget::copyContentsToFramebuffer(LLRenderTarget& source, S32 srcX0
llerrs << "Cannot copy framebuffer contents for non FBO render targets." << llendl;
}
{
- glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, source.mFBO);
+ GLboolean write_depth = mask & GL_DEPTH_BUFFER_BIT ? TRUE : FALSE;
+
+ LLGLDepthTest depth(write_depth, write_depth);
+
+ glBindFramebuffer(GL_READ_FRAMEBUFFER, source.mFBO);
stop_glerror();
- glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, 0);
+ glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
stop_glerror();
check_framebuffer_status();
stop_glerror();
- glBlitFramebufferEXT(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
+ glBlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
stop_glerror();
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
+ glBindFramebuffer(GL_FRAMEBUFFER, 0);
stop_glerror();
}
}
-BOOL LLRenderTarget::isComplete() const
+bool LLRenderTarget::isComplete() const
{
- return (!mTex.empty() || mDepth) ? TRUE : FALSE;
+ return (!mTex.empty() || mDepth) ? true : false;
}
void LLRenderTarget::getViewport(S32* viewport)
@@ -510,188 +533,3 @@ void LLRenderTarget::getViewport(S32* viewport)
viewport[3] = mResY;
}
-//==================================================
-// LLMultisampleBuffer implementation
-//==================================================
-LLMultisampleBuffer::LLMultisampleBuffer()
-{
-
-}
-
-LLMultisampleBuffer::~LLMultisampleBuffer()
-{
- releaseSampleBuffer();
-}
-
-void LLMultisampleBuffer::releaseSampleBuffer()
-{
- if (mFBO)
- {
- glDeleteFramebuffersEXT(1, (GLuint *) &mFBO);
- mFBO = 0;
- }
-
- if (mTex.size() > 0)
- {
- glDeleteRenderbuffersEXT(mTex.size(), (GLuint *) &mTex[0]);
- mTex.clear();
- }
-
- if (mDepth)
- {
- glDeleteRenderbuffersEXT(1, (GLuint *) &mDepth);
- mDepth = 0;
- }
-}
-
-void LLMultisampleBuffer::bindTarget()
-{
- bindTarget(this);
-}
-
-void LLMultisampleBuffer::bindTarget(LLRenderTarget* ref)
-{
- if (!ref)
- {
- ref = this;
- }
-
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mFBO);
- if (gGLManager.mHasDrawBuffers)
- { //setup multiple render targets
- GLenum drawbuffers[] = {GL_COLOR_ATTACHMENT0_EXT,
- GL_COLOR_ATTACHMENT1_EXT,
- GL_COLOR_ATTACHMENT2_EXT,
- GL_COLOR_ATTACHMENT3_EXT};
- glDrawBuffersARB(ref->mTex.size(), drawbuffers);
- }
-
- check_framebuffer_status();
-
- glViewport(0, 0, mResX, mResY);
-
- sBoundTarget = this;
-}
-
-void LLMultisampleBuffer::allocate(U32 resx, U32 resy, U32 color_fmt, BOOL depth, BOOL stencil, LLTexUnit::eTextureType usage, BOOL use_fbo )
-{
- allocate(resx,resy,color_fmt,depth,stencil,usage,use_fbo,2);
-}
-
-void LLMultisampleBuffer::allocate(U32 resx, U32 resy, U32 color_fmt, BOOL depth, BOOL stencil, LLTexUnit::eTextureType usage, BOOL use_fbo, U32 samples )
-{
- stop_glerror();
- mResX = resx;
- mResY = resy;
-
- mUsage = usage;
- mUseDepth = depth;
- mStencil = stencil;
-
- releaseSampleBuffer();
-
- if (!gGLManager.mHasFramebufferMultisample)
- {
- llerrs << "Attempting to allocate unsupported render target type!" << llendl;
- }
-
- mSamples = samples;
-
- if (mSamples <= 1)
- {
- llerrs << "Cannot create a multisample buffer with less than 2 samples." << llendl;
- }
-
- stop_glerror();
-
- if ((sUseFBO || use_fbo) && gGLManager.mHasFramebufferObject)
- {
-
- if (depth)
- {
- stop_glerror();
- allocateDepth();
- stop_glerror();
- }
-
- glGenFramebuffersEXT(1, (GLuint *) &mFBO);
-
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mFBO);
-
- if (mDepth)
- {
- glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, mDepth);
- if (mStencil)
- {
- glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, mDepth);
- }
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
- }
-
- stop_glerror();
-
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
- stop_glerror();
- }
-
- addColorAttachment(color_fmt);
-}
-
-void LLMultisampleBuffer::addColorAttachment(U32 color_fmt)
-{
- if (color_fmt == 0)
- {
- return;
- }
-
- U32 offset = mTex.size();
- if (offset >= 4 ||
- (offset > 0 && (mFBO == 0 || !gGLManager.mHasDrawBuffers)))
- {
- llerrs << "Too many color attachments!" << llendl;
- }
-
- U32 tex;
- glGenRenderbuffersEXT(1, &tex);
-
- glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, tex);
- glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, mSamples, color_fmt, mResX, mResY);
- stop_glerror();
-
- if (mFBO)
- {
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mFBO);
- glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT+offset, GL_RENDERBUFFER_EXT, tex);
- stop_glerror();
- GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
- switch (status)
- {
- case GL_FRAMEBUFFER_COMPLETE_EXT:
- break;
- case GL_FRAMEBUFFER_UNSUPPORTED_EXT:
- llerrs << "WTF?" << llendl;
- break;
- default:
- llerrs << "WTF?" << llendl;
- }
-
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
- }
-
- mTex.push_back(tex);
-}
-
-void LLMultisampleBuffer::allocateDepth()
-{
- glGenRenderbuffersEXT(1, (GLuint* ) &mDepth);
- glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, mDepth);
- if (mStencil)
- {
- glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, mSamples, GL_DEPTH24_STENCIL8_EXT, mResX, mResY);
- }
- else
- {
- glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, mSamples, GL_DEPTH_COMPONENT16_ARB, mResX, mResY);
- }
-}
-
diff --git a/indra/llrender/llrendertarget.h b/indra/llrender/llrendertarget.h
index ae8613d9be..2735ab21c5 100644
--- a/indra/llrender/llrendertarget.h
+++ b/indra/llrender/llrendertarget.h
@@ -63,28 +63,26 @@ class LLRenderTarget
{
public:
//whether or not to use FBO implementation
- static BOOL sUseFBO;
+ static bool sUseFBO;
+ static U32 sBytesAllocated;
LLRenderTarget();
- virtual ~LLRenderTarget();
+ ~LLRenderTarget();
//allocate resources for rendering
//must be called before use
//multiple calls will release previously allocated resources
- void allocate(U32 resx, U32 resy, U32 color_fmt, BOOL depth, BOOL stencil, LLTexUnit::eTextureType usage = LLTexUnit::TT_TEXTURE, BOOL use_fbo = FALSE);
-
- //provide this render target with a multisample resource.
- void setSampleBuffer(LLMultisampleBuffer* buffer);
+ bool allocate(U32 resx, U32 resy, U32 color_fmt, bool depth, bool stencil, LLTexUnit::eTextureType usage = LLTexUnit::TT_TEXTURE, bool use_fbo = false, S32 samples = 0);
//add color buffer attachment
//limit of 4 color attachments per render target
- virtual void addColorAttachment(U32 color_fmt);
+ bool addColorAttachment(U32 color_fmt);
//allocate a depth texture
- virtual void allocateDepth();
+ bool allocateDepth();
//share depth buffer with provided render target
- virtual void shareDepthBuffer(LLRenderTarget& target);
+ void shareDepthBuffer(LLRenderTarget& target);
//free any allocated resources
//safe to call redundantly
@@ -92,7 +90,7 @@ public:
//bind target for rendering
//applies appropriate viewport
- virtual void bindTarget();
+ void bindTarget();
//unbind target for rendering
static void unbindTarget();
@@ -115,7 +113,7 @@ public:
U32 getTexture(U32 attachment = 0) const;
U32 getDepth(void) const { return mDepth; }
- BOOL hasStencil() const { return mStencil; }
+ bool hasStencil() const { return mStencil; }
void bindTexture(U32 index, S32 channel);
@@ -125,7 +123,7 @@ public:
// call bindTarget once, do all your rendering, call flush once
// if fetch_depth is TRUE, every effort will be made to copy the depth buffer into
// the current depth texture. A depth texture will be allocated if needed.
- void flush(BOOL fetch_depth = FALSE);
+ void flush(bool fetch_depth = FALSE);
void copyContents(LLRenderTarget& source, S32 srcX0, S32 srcY0, S32 srcX1, S32 srcY1,
S32 dstX0, S32 dstY0, S32 dstX1, S32 dstY1, U32 mask, U32 filter);
@@ -136,42 +134,22 @@ public:
//Returns TRUE if target is ready to be rendered into.
//That is, if the target has been allocated with at least
//one renderable attachment (i.e. color buffer, depth buffer).
- BOOL isComplete() const;
+ bool isComplete() const;
static LLRenderTarget* getCurrentBoundTarget() { return sBoundTarget; }
protected:
- friend class LLMultisampleBuffer;
U32 mResX;
U32 mResY;
std::vector<U32> mTex;
U32 mFBO;
U32 mDepth;
- BOOL mStencil;
- BOOL mUseDepth;
- BOOL mRenderDepth;
+ bool mStencil;
+ bool mUseDepth;
+ bool mRenderDepth;
LLTexUnit::eTextureType mUsage;
- U32 mSamples;
- LLMultisampleBuffer* mSampleBuffer;
-
- static LLRenderTarget* sBoundTarget;
-};
-
-class LLMultisampleBuffer : public LLRenderTarget
-{
-public:
- LLMultisampleBuffer();
- virtual ~LLMultisampleBuffer();
-
- void releaseSampleBuffer();
-
- virtual void bindTarget();
- void bindTarget(LLRenderTarget* ref);
- virtual void allocate(U32 resx, U32 resy, U32 color_fmt, BOOL depth, BOOL stencil, LLTexUnit::eTextureType usage, BOOL use_fbo);
- void allocate(U32 resx, U32 resy, U32 color_fmt, BOOL depth, BOOL stencil, LLTexUnit::eTextureType usage, BOOL use_fbo, U32 samples);
- virtual void addColorAttachment(U32 color_fmt);
- virtual void allocateDepth();
+ static LLRenderTarget* sBoundTarget;
};
#endif //!LL_MESA_HEADLESS
diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp
index c859d41e17..7d384450e6 100644
--- a/indra/llrender/llshadermgr.cpp
+++ b/indra/llrender/llshadermgr.cpp
@@ -81,29 +81,42 @@ BOOL LLShaderMgr::attachShaderFeatures(LLGLSLShader * shader)
// NOTE order of shader object attaching is VERY IMPORTANT!!!
if (features->calculatesAtmospherics)
{
- if (!shader->attachObject("windlight/atmosphericsVarsV.glsl"))
+ if (features->hasWaterFog)
+ {
+ if (!shader->attachObject("windlight/atmosphericsVarsWaterV.glsl"))
+ {
+ return FALSE;
+ }
+ }
+ else if (!shader->attachObject("windlight/atmosphericsVarsV.glsl"))
{
return FALSE;
}
}
- if (features->calculatesLighting)
+ if (features->calculatesLighting || features->atmosphericHelpers)
{
if (!shader->attachObject("windlight/atmosphericsHelpersV.glsl"))
{
return FALSE;
}
+ }
+ if (features->calculatesLighting)
+ {
if (features->isSpecular)
{
if (!shader->attachObject("lighting/lightFuncSpecularV.glsl"))
{
return FALSE;
}
-
- if (!shader->attachObject("lighting/sumLightsSpecularV.glsl"))
+
+ if (!features->isAlphaLighting)
{
- return FALSE;
+ if (!shader->attachObject("lighting/sumLightsSpecularV.glsl"))
+ {
+ return FALSE;
+ }
}
if (!shader->attachObject("lighting/lightSpecularV.glsl"))
@@ -118,9 +131,12 @@ BOOL LLShaderMgr::attachShaderFeatures(LLGLSLShader * shader)
return FALSE;
}
- if (!shader->attachObject("lighting/sumLightsV.glsl"))
+ if (!features->isAlphaLighting)
{
- return FALSE;
+ if (!shader->attachObject("lighting/sumLightsV.glsl"))
+ {
+ return FALSE;
+ }
}
if (!shader->attachObject("lighting/lightV.glsl"))
@@ -146,6 +162,14 @@ BOOL LLShaderMgr::attachShaderFeatures(LLGLSLShader * shader)
return FALSE;
}
}
+
+ if (features->hasObjectSkinning)
+ {
+ if (!shader->attachObject("avatar/objectSkinV.glsl"))
+ {
+ return FALSE;
+ }
+ }
///////////////////////////////////////
// Attach Fragment Shader Features Next
@@ -153,7 +177,14 @@ BOOL LLShaderMgr::attachShaderFeatures(LLGLSLShader * shader)
if(features->calculatesAtmospherics)
{
- if (!shader->attachObject("windlight/atmosphericsVarsF.glsl"))
+ if (features->hasWaterFog)
+ {
+ if (!shader->attachObject("windlight/atmosphericsVarsWaterF.glsl"))
+ {
+ return FALSE;
+ }
+ }
+ else if (!shader->attachObject("windlight/atmosphericsVarsF.glsl"))
{
return FALSE;
}
@@ -198,49 +229,196 @@ BOOL LLShaderMgr::attachShaderFeatures(LLGLSLShader * shader)
if (features->hasLighting)
{
-
if (features->hasWaterFog)
{
- if (!shader->attachObject("lighting/lightWaterF.glsl"))
+ if (features->disableTextureIndex)
{
- return FALSE;
+ if (features->hasAlphaMask)
+ {
+ if (!shader->attachObject("lighting/lightWaterAlphaMaskNonIndexedF.glsl"))
+ {
+ return FALSE;
+ }
+ }
+ else
+ {
+ if (!shader->attachObject("lighting/lightWaterNonIndexedF.glsl"))
+ {
+ return FALSE;
+ }
+ }
+ }
+ else
+ {
+ if (features->hasAlphaMask)
+ {
+ if (!shader->attachObject("lighting/lightWaterAlphaMaskF.glsl"))
+ {
+ return FALSE;
+ }
+ }
+ else
+ {
+ if (!shader->attachObject("lighting/lightWaterF.glsl"))
+ {
+ return FALSE;
+ }
+ }
+ shader->mFeatures.mIndexedTextureChannels = llmax(LLGLSLShader::sIndexedTextureChannels-1, 1);
}
}
else
{
- if (!shader->attachObject("lighting/lightF.glsl"))
+ if (features->disableTextureIndex)
{
- return FALSE;
+ if (features->hasAlphaMask)
+ {
+ if (!shader->attachObject("lighting/lightAlphaMaskNonIndexedF.glsl"))
+ {
+ return FALSE;
+ }
+ }
+ else
+ {
+ if (!shader->attachObject("lighting/lightNonIndexedF.glsl"))
+ {
+ return FALSE;
+ }
+ }
}
- }
+ else
+ {
+ if (features->hasAlphaMask)
+ {
+ if (!shader->attachObject("lighting/lightAlphaMaskF.glsl"))
+ {
+ return FALSE;
+ }
+ }
+ else
+ {
+ if (!shader->attachObject("lighting/lightF.glsl"))
+ {
+ return FALSE;
+ }
+ }
+ shader->mFeatures.mIndexedTextureChannels = llmax(LLGLSLShader::sIndexedTextureChannels-1, 1);
+ }
+ }
}
// NOTE order of shader object attaching is VERY IMPORTANT!!!
else if (features->isFullbright)
{
- if (features->hasWaterFog)
+ if (features->isShiny && features->hasWaterFog)
{
- if (!shader->attachObject("lighting/lightFullbrightWaterF.glsl"))
+ if (features->disableTextureIndex)
{
- return FALSE;
+ if (!shader->attachObject("lighting/lightFullbrightShinyWaterNonIndexedF.glsl"))
+ {
+ return FALSE;
+ }
+ }
+ else
+ {
+ if (!shader->attachObject("lighting/lightFullbrightShinyWaterF.glsl"))
+ {
+ return FALSE;
+ }
+ shader->mFeatures.mIndexedTextureChannels = llmax(LLGLSLShader::sIndexedTextureChannels-1, 1);
+ }
+ }
+ else if (features->hasWaterFog)
+ {
+ if (features->disableTextureIndex)
+ {
+ if (features->hasAlphaMask)
+ {
+ if (!shader->attachObject("lighting/lightFullbrightWaterNonIndexedAlphaMaskF.glsl"))
+ {
+ return FALSE;
+ }
+ }
+ else if (!shader->attachObject("lighting/lightFullbrightWaterNonIndexedF.glsl"))
+ {
+ return FALSE;
+ }
+ }
+ else
+ {
+ if (features->hasAlphaMask)
+ {
+ if (!shader->attachObject("lighting/lightFullbrightWaterAlphaMaskF.glsl"))
+ {
+ return FALSE;
+ }
+ }
+ else if (!shader->attachObject("lighting/lightFullbrightWaterF.glsl"))
+ {
+ return FALSE;
+ }
+ shader->mFeatures.mIndexedTextureChannels = llmax(LLGLSLShader::sIndexedTextureChannels-1, 1);
}
}
else if (features->isShiny)
{
- if (!shader->attachObject("lighting/lightFullbrightShinyF.glsl"))
+ if (features->disableTextureIndex)
{
- return FALSE;
+ if (!shader->attachObject("lighting/lightFullbrightShinyNonIndexedF.glsl"))
+ {
+ return FALSE;
+ }
+ }
+ else
+ {
+ if (!shader->attachObject("lighting/lightFullbrightShinyF.glsl"))
+ {
+ return FALSE;
+ }
+ shader->mFeatures.mIndexedTextureChannels = llmax(LLGLSLShader::sIndexedTextureChannels-1, 1);
}
}
else
{
- if (!shader->attachObject("lighting/lightFullbrightF.glsl"))
+ if (features->disableTextureIndex)
{
- return FALSE;
+
+ if (features->hasAlphaMask)
+ {
+ if (!shader->attachObject("lighting/lightFullbrightNonIndexedAlphaMaskF.glsl"))
+ {
+ return FALSE;
+ }
+ }
+ else
+ {
+ if (!shader->attachObject("lighting/lightFullbrightNonIndexedF.glsl"))
+ {
+ return FALSE;
+ }
+ }
+ }
+ else
+ {
+ if (features->hasAlphaMask)
+ {
+ if (!shader->attachObject("lighting/lightFullbrightAlphaMaskF.glsl"))
+ {
+ return FALSE;
+ }
+ }
+ else
+ {
+ if (!shader->attachObject("lighting/lightFullbrightF.glsl"))
+ {
+ return FALSE;
+ }
+ }
+ shader->mFeatures.mIndexedTextureChannels = llmax(LLGLSLShader::sIndexedTextureChannels-1, 1);
}
}
}
@@ -251,20 +429,58 @@ BOOL LLShaderMgr::attachShaderFeatures(LLGLSLShader * shader)
if (features->hasWaterFog)
{
- if (!shader->attachObject("lighting/lightShinyWaterF.glsl"))
+ if (features->disableTextureIndex)
{
- return FALSE;
+ if (!shader->attachObject("lighting/lightShinyWaterNonIndexedF.glsl"))
+ {
+ return FALSE;
+ }
+ }
+ else
+ {
+ if (!shader->attachObject("lighting/lightShinyWaterF.glsl"))
+ {
+ return FALSE;
+ }
+ shader->mFeatures.mIndexedTextureChannels = llmax(LLGLSLShader::sIndexedTextureChannels-1, 1);
}
}
else
{
- if (!shader->attachObject("lighting/lightShinyF.glsl"))
+ if (features->disableTextureIndex)
{
- return FALSE;
+ if (!shader->attachObject("lighting/lightShinyNonIndexedF.glsl"))
+ {
+ return FALSE;
+ }
}
+ else
+ {
+ if (!shader->attachObject("lighting/lightShinyF.glsl"))
+ {
+ return FALSE;
+ }
+ shader->mFeatures.mIndexedTextureChannels = llmax(LLGLSLShader::sIndexedTextureChannels-1, 1);
+ }
+ }
+ }
+
+ if (features->mIndexedTextureChannels <= 1)
+ {
+ if (!shader->attachObject("objects/nonindexedTextureV.glsl"))
+ {
+ return FALSE;
+ }
+ }
+ else
+ {
+ if (!shader->attachObject("objects/indexedTextureV.glsl"))
+ {
+ return FALSE;
}
}
+
return TRUE;
}
@@ -300,18 +516,21 @@ void LLShaderMgr::dumpObjectLog(GLhandleARB ret, BOOL warns)
}
else
{
- LL_DEBUGS("ShaderLoading") << log << LL_ENDL;
+ LL_INFOS("ShaderLoading") << log << LL_ENDL;
}
}
-}
+ }
-GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shader_level, GLenum type)
+GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shader_level, GLenum type, S32 texture_index_channels)
{
- GLenum error;
- error = glGetError();
- if (error != GL_NO_ERROR)
+ GLenum error = GL_NO_ERROR;
+ if (gDebugGL)
{
- LL_WARNS("ShaderLoading") << "GL ERROR entering loadShaderFile(): " << error << LL_ENDL;
+ error = glGetError();
+ if (error != GL_NO_ERROR)
+ {
+ LL_WARNS("ShaderLoading") << "GL ERROR entering loadShaderFile(): " << error << LL_ENDL;
+ }
}
LL_DEBUGS("ShaderLoading") << "Loading shader file: " << filename << " class " << shader_level << LL_ENDL;
@@ -351,14 +570,176 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade
}
//we can't have any lines longer than 1024 characters
- //or any shaders longer than 1024 lines... deal - DaveP
+ //or any shaders longer than 4096 lines... deal - DaveP
GLcharARB buff[1024];
- GLcharARB* text[1024];
+ GLcharARB* text[4096];
GLuint count = 0;
+ S32 major_version = gGLManager.mGLSLVersionMajor;
+ S32 minor_version = gGLManager.mGLSLVersionMinor;
+
+ if (major_version == 1 && minor_version < 30)
+ {
+ if (minor_version < 10)
+ {
+ //should NEVER get here -- if major version is 1 and minor version is less than 10,
+ // viewer should never attempt to use shaders, continuing will result in undefined behavior
+ llerrs << "Unsupported GLSL Version." << llendl;
+ }
+
+ if (minor_version <= 19)
+ {
+ text[count++] = strdup("#version 110\n");
+ text[count++] = strdup("#define ATTRIBUTE attribute\n");
+ text[count++] = strdup("#define VARYING varying\n");
+ text[count++] = strdup("#define VARYING_FLAT varying\n");
+ }
+ else if (minor_version <= 29)
+ {
+ //set version to 1.20
+ text[count++] = strdup("#version 120\n");
+ text[count++] = strdup("#define FXAA_GLSL_120 1\n");
+ text[count++] = strdup("#define FXAA_FAST_PIXEL_OFFSET 0\n");
+ text[count++] = strdup("#define ATTRIBUTE attribute\n");
+ text[count++] = strdup("#define VARYING varying\n");
+ text[count++] = strdup("#define VARYING_FLAT varying\n");
+ }
+ }
+ else
+ {
+ if (major_version < 4)
+ {
+ //set version to 1.30
+ text[count++] = strdup("#version 130\n");
+
+ //some implementations of GLSL 1.30 require integer precision be explicitly declared
+ text[count++] = strdup("precision mediump int;\n");
+ text[count++] = strdup("precision highp float;\n");
+ }
+ else
+ { //set version to 400
+ text[count++] = strdup("#version 400\n");
+ }
+
+ text[count++] = strdup("#define DEFINE_GL_FRAGCOLOR 1\n");
+ text[count++] = strdup("#define FXAA_GLSL_130 1\n");
+
+ text[count++] = strdup("#define ATTRIBUTE in\n");
+
+ if (type == GL_VERTEX_SHADER_ARB)
+ { //"varying" state is "out" in a vertex program, "in" in a fragment program
+ // ("varying" is deprecated after version 1.20)
+ text[count++] = strdup("#define VARYING out\n");
+ text[count++] = strdup("#define VARYING_FLAT flat out\n");
+ }
+ else
+ {
+ text[count++] = strdup("#define VARYING in\n");
+ text[count++] = strdup("#define VARYING_FLAT flat in\n");
+ }
+
+ //backwards compatibility with legacy texture lookup syntax
+ text[count++] = strdup("#define texture2D texture\n");
+ text[count++] = strdup("#define textureCube texture\n");
+ text[count++] = strdup("#define texture2DLod textureLod\n");
+ text[count++] = strdup("#define shadow2D(a,b) vec2(texture(a,b))\n");
+
+ if (major_version > 1 || minor_version >= 40)
+ { //GLSL 1.40 replaces texture2DRect et al with texture
+ text[count++] = strdup("#define texture2DRect texture\n");
+ text[count++] = strdup("#define shadow2DRect(a,b) vec2(texture(a,b))\n");
+ }
+ }
+
+ //copy preprocessor definitions into buffer
+ for (std::map<std::string,std::string>::iterator iter = mDefinitions.begin(); iter != mDefinitions.end(); ++iter)
+ {
+ std::string define = "#define " + iter->first + " " + iter->second + "\n";
+ text[count++] = (GLcharARB *) strdup(define.c_str());
+ }
+
+ if (texture_index_channels > 0 && type == GL_FRAGMENT_SHADER_ARB)
+ {
+ //use specified number of texture channels for indexed texture rendering
+
+ /* prepend shader code that looks like this:
+
+ uniform sampler2D tex0;
+ uniform sampler2D tex1;
+ uniform sampler2D tex2;
+ .
+ .
+ .
+ uniform sampler2D texN;
+
+ VARYING_FLAT ivec4 vary_texture_index;
+
+ vec4 ret = vec4(1,0,1,1);
+
+ vec4 diffuseLookup(vec2 texcoord)
+ {
+ switch (vary_texture_index.r))
+ {
+ case 0: ret = texture2D(tex0, texcoord); break;
+ case 1: ret = texture2D(tex1, texcoord); break;
+ case 2: ret = texture2D(tex2, texcoord); break;
+ .
+ .
+ .
+ case N: return texture2D(texN, texcoord); break;
+ }
+
+ return ret;
+ }
+ */
+
+ //uniform declartion
+ for (S32 i = 0; i < texture_index_channels; ++i)
+ {
+ std::string decl = llformat("uniform sampler2D tex%d;\n", i);
+ text[count++] = strdup(decl.c_str());
+ }
+
+ if (texture_index_channels > 1)
+ {
+ text[count++] = strdup("VARYING_FLAT ivec4 vary_texture_index;\n");
+ }
+
+ text[count++] = strdup("vec4 diffuseLookup(vec2 texcoord)\n");
+ text[count++] = strdup("{\n");
+
+
+ if (texture_index_channels == 1)
+ { //don't use flow control, that's silly
+ text[count++] = strdup("return texture2D(tex0, texcoord);\n");
+ text[count++] = strdup("}\n");
+ }
+ else if (major_version > 1 || minor_version >= 30)
+ { //switches are supported in GLSL 1.30 and later
+ text[count++] = strdup("\tvec4 ret = vec4(1,0,1,1);\n");
+ text[count++] = strdup("\tswitch (vary_texture_index.r)\n");
+ text[count++] = strdup("\t{\n");
+
+ //switch body
+ for (S32 i = 0; i < texture_index_channels; ++i)
+ {
+ std::string case_str = llformat("\t\tcase %d: ret = texture2D(tex%d, texcoord); break;\n", i, i);
+ text[count++] = strdup(case_str.c_str());
+ }
+
+ text[count++] = strdup("\t}\n");
+ text[count++] = strdup("\treturn ret;\n");
+ text[count++] = strdup("}\n");
+ }
+ else
+ { //should never get here. Indexed texture rendering requires GLSL 1.30 or later
+ // (for passing integers between vertex and fragment shaders)
+ llerrs << "Indexed texture rendering requires GLSL 1.30 or later." << llendl;
+ }
+ }
//copy file into memory
- while( fgets((char *)buff, 1024, file) != NULL && count < LL_ARRAY_SIZE(buff) )
+ while( fgets((char *)buff, 1024, file) != NULL && count < LL_ARRAY_SIZE(text) )
{
text[count++] = (GLcharARB *)strdup((char *)buff);
}
@@ -366,48 +747,74 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade
//create shader object
GLhandleARB ret = glCreateShaderObjectARB(type);
- error = glGetError();
- if (error != GL_NO_ERROR)
+ if (gDebugGL)
{
- LL_WARNS("ShaderLoading") << "GL ERROR in glCreateShaderObjectARB: " << error << LL_ENDL;
+ error = glGetError();
+ if (error != GL_NO_ERROR)
+ {
+ LL_WARNS("ShaderLoading") << "GL ERROR in glCreateShaderObjectARB: " << error << LL_ENDL;
+ }
}
- else
+
+ //load source
+ glShaderSourceARB(ret, count, (const GLcharARB**) text, NULL);
+
+ if (gDebugGL)
{
- //load source
- glShaderSourceARB(ret, count, (const GLcharARB**) text, NULL);
error = glGetError();
if (error != GL_NO_ERROR)
{
LL_WARNS("ShaderLoading") << "GL ERROR in glShaderSourceARB: " << error << LL_ENDL;
}
- else
- {
- //compile source
- glCompileShaderARB(ret);
- error = glGetError();
- if (error != GL_NO_ERROR)
- {
- LL_WARNS("ShaderLoading") << "GL ERROR in glCompileShaderARB: " << error << LL_ENDL;
- }
- }
}
- //free memory
- for (GLuint i = 0; i < count; i++)
+
+ //compile source
+ glCompileShaderARB(ret);
+
+ if (gDebugGL)
{
- free(text[i]);
+ error = glGetError();
+ if (error != GL_NO_ERROR)
+ {
+ LL_WARNS("ShaderLoading") << "GL ERROR in glCompileShaderARB: " << error << LL_ENDL;
+ }
}
+
if (error == GL_NO_ERROR)
{
//check for errors
GLint success = GL_TRUE;
glGetObjectParameterivARB(ret, GL_OBJECT_COMPILE_STATUS_ARB, &success);
- error = glGetError();
- if (error != GL_NO_ERROR || success == GL_FALSE)
+ if (gDebugGL || success == GL_FALSE)
{
- //an error occured, print log
- LL_WARNS("ShaderLoading") << "GLSL Compilation Error: (" << error << ") in " << filename << LL_ENDL;
- dumpObjectLog(ret);
- ret = 0;
+ error = glGetError();
+ if (error != GL_NO_ERROR || success == GL_FALSE)
+ {
+ //an error occured, print log
+ LL_WARNS("ShaderLoading") << "GLSL Compilation Error: (" << error << ") in " << filename << LL_ENDL;
+ dumpObjectLog(ret);
+
+#if LL_WINDOWS
+ std::stringstream ostr;
+ //dump shader source for debugging
+ for (GLuint i = 0; i < count; i++)
+ {
+ ostr << i << ": " << text[i];
+
+ if (i % 128 == 0)
+ { //dump every 128 lines
+
+ LL_WARNS("ShaderLoading") << "\n" << ostr.str() << llendl;
+ ostr = std::stringstream();
+ }
+
+ }
+
+ LL_WARNS("ShaderLoading") << "\n" << ostr.str() << llendl;
+#endif // LL_WINDOWS
+
+ ret = 0;
+ }
}
}
else
@@ -416,6 +823,12 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade
}
stop_glerror();
+ //free memory
+ for (GLuint i = 0; i < count; i++)
+ {
+ free(text[i]);
+ }
+
//successfully loaded, save results
if (ret)
{
@@ -428,7 +841,7 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade
if (shader_level > 1)
{
shader_level--;
- return loadShaderFile(filename,shader_level,type);
+ return loadShaderFile(filename,shader_level,type,texture_index_channels);
}
LL_WARNS("ShaderLoading") << "Failed to load " << filename << LL_ENDL;
}
@@ -447,28 +860,42 @@ BOOL LLShaderMgr::linkProgramObject(GLhandleARB obj, BOOL suppress_errors)
LL_WARNS("ShaderLoading") << "GLSL Linker Error:" << LL_ENDL;
}
-// NOTE: Removing LL_DARWIN block as it doesn't seem to actually give the correct answer,
-// but want it for reference once I move it.
-#if 0
- // Force an evaluation of the gl state so the driver can tell if the shader will run in hardware or software
- // per Apple's suggestion
- glBegin(gGL.mMode);
- glEnd();
+#if LL_DARWIN
- // Query whether the shader can or cannot run in hardware
- // http://developer.apple.com/qa/qa2007/qa1502.html
- long vertexGPUProcessing;
- CGLContextObj ctx = CGLGetCurrentContext();
- CGLGetParameter (ctx, kCGLCPGPUVertexProcessing, &vertexGPUProcessing);
- long fragmentGPUProcessing;
- CGLGetParameter (ctx, kCGLCPGPUFragmentProcessing, &fragmentGPUProcessing);
- if (!fragmentGPUProcessing || !vertexGPUProcessing)
+ // For some reason this absolutely kills the frame rate when VBO's are enabled
+ if (0)
{
- LL_WARNS("ShaderLoading") << "GLSL Linker: Running in Software:" << LL_ENDL;
- success = GL_FALSE;
- suppress_errors = FALSE;
+ // Force an evaluation of the gl state so the driver can tell if the shader will run in hardware or software
+ // per Apple's suggestion
+ LLGLSLShader::sNoFixedFunction = false;
+
+ glUseProgramObjectARB(obj);
+
+ gGL.begin(LLRender::TRIANGLES);
+ gGL.vertex3f(0.0f, 0.0f, 0.0f);
+ gGL.vertex3f(0.0f, 0.0f, 0.0f);
+ gGL.vertex3f(0.0f, 0.0f, 0.0f);
+ gGL.end();
+ gGL.flush();
+
+ glUseProgramObjectARB(0);
+
+ LLGLSLShader::sNoFixedFunction = true;
+
+ // Query whether the shader can or cannot run in hardware
+ // http://developer.apple.com/qa/qa2007/qa1502.html
+ GLint vertexGPUProcessing, fragmentGPUProcessing;
+ CGLContextObj ctx = CGLGetCurrentContext();
+ CGLGetParameter(ctx, kCGLCPGPUVertexProcessing, &vertexGPUProcessing);
+ CGLGetParameter(ctx, kCGLCPGPUFragmentProcessing, &fragmentGPUProcessing);
+ if (!fragmentGPUProcessing || !vertexGPUProcessing)
+ {
+ LL_WARNS("ShaderLoading") << "GLSL Linker: Running in Software:" << LL_ENDL;
+ success = GL_FALSE;
+ suppress_errors = FALSE;
+ }
}
-
+
#else
std::string log = get_object_log(obj);
LLStringUtil::toLower(log);
@@ -506,3 +933,183 @@ BOOL LLShaderMgr::validateProgramObject(GLhandleARB obj)
return success;
}
+//virtual
+void LLShaderMgr::initAttribsAndUniforms()
+{
+ //MUST match order of enum in LLVertexBuffer.h
+ mReservedAttribs.push_back("position");
+ mReservedAttribs.push_back("normal");
+ mReservedAttribs.push_back("texcoord0");
+ mReservedAttribs.push_back("texcoord1");
+ mReservedAttribs.push_back("texcoord2");
+ mReservedAttribs.push_back("texcoord3");
+ mReservedAttribs.push_back("diffuse_color");
+ mReservedAttribs.push_back("emissive");
+ mReservedAttribs.push_back("binormal");
+ mReservedAttribs.push_back("weight");
+ mReservedAttribs.push_back("weight4");
+ mReservedAttribs.push_back("clothing");
+ mReservedAttribs.push_back("texture_index");
+
+ //matrix state
+ mReservedUniforms.push_back("modelview_matrix");
+ mReservedUniforms.push_back("projection_matrix");
+ mReservedUniforms.push_back("inv_proj");
+ mReservedUniforms.push_back("modelview_projection_matrix");
+ mReservedUniforms.push_back("normal_matrix");
+ mReservedUniforms.push_back("texture_matrix0");
+ mReservedUniforms.push_back("texture_matrix1");
+ mReservedUniforms.push_back("texture_matrix2");
+ mReservedUniforms.push_back("texture_matrix3");
+ llassert(mReservedUniforms.size() == LLShaderMgr::TEXTURE_MATRIX3+1);
+
+ mReservedUniforms.push_back("viewport");
+
+ mReservedUniforms.push_back("light_position");
+ mReservedUniforms.push_back("light_direction");
+ mReservedUniforms.push_back("light_attenuation");
+ mReservedUniforms.push_back("light_diffuse");
+ mReservedUniforms.push_back("light_ambient");
+ mReservedUniforms.push_back("light_count");
+ mReservedUniforms.push_back("light");
+ mReservedUniforms.push_back("light_col");
+ mReservedUniforms.push_back("far_z");
+
+ llassert(mReservedUniforms.size() == LLShaderMgr::MULTI_LIGHT_FAR_Z+1);
+
+
+ mReservedUniforms.push_back("proj_mat");
+ mReservedUniforms.push_back("proj_near");
+ mReservedUniforms.push_back("proj_p");
+ mReservedUniforms.push_back("proj_n");
+ mReservedUniforms.push_back("proj_origin");
+ mReservedUniforms.push_back("proj_range");
+ mReservedUniforms.push_back("proj_ambiance");
+ mReservedUniforms.push_back("proj_shadow_idx");
+ mReservedUniforms.push_back("shadow_fade");
+ mReservedUniforms.push_back("proj_focus");
+ mReservedUniforms.push_back("proj_lod");
+ mReservedUniforms.push_back("proj_ambient_lod");
+
+ llassert(mReservedUniforms.size() == LLShaderMgr::PROJECTOR_AMBIENT_LOD+1);
+
+ mReservedUniforms.push_back("color");
+
+ mReservedUniforms.push_back("diffuseMap");
+ mReservedUniforms.push_back("specularMap");
+ mReservedUniforms.push_back("bumpMap");
+ mReservedUniforms.push_back("environmentMap");
+ mReservedUniforms.push_back("cloude_noise_texture");
+ mReservedUniforms.push_back("fullbright");
+ mReservedUniforms.push_back("lightnorm");
+ mReservedUniforms.push_back("sunlight_color_copy");
+ mReservedUniforms.push_back("ambient");
+ mReservedUniforms.push_back("blue_horizon");
+ mReservedUniforms.push_back("blue_density");
+ mReservedUniforms.push_back("haze_horizon");
+ mReservedUniforms.push_back("haze_density");
+ mReservedUniforms.push_back("cloud_shadow");
+ mReservedUniforms.push_back("density_multiplier");
+ mReservedUniforms.push_back("distance_multiplier");
+ mReservedUniforms.push_back("max_y");
+ mReservedUniforms.push_back("glow");
+ mReservedUniforms.push_back("cloud_color");
+ mReservedUniforms.push_back("cloud_pos_density1");
+ mReservedUniforms.push_back("cloud_pos_density2");
+ mReservedUniforms.push_back("cloud_scale");
+ mReservedUniforms.push_back("gamma");
+ mReservedUniforms.push_back("scene_light_strength");
+
+ llassert(mReservedUniforms.size() == LLShaderMgr::SCENE_LIGHT_STRENGTH+1);
+
+ mReservedUniforms.push_back("center");
+ mReservedUniforms.push_back("size");
+ mReservedUniforms.push_back("falloff");
+
+
+ mReservedUniforms.push_back("minLuminance");
+ mReservedUniforms.push_back("maxExtractAlpha");
+ mReservedUniforms.push_back("lumWeights");
+ mReservedUniforms.push_back("warmthWeights");
+ mReservedUniforms.push_back("warmthAmount");
+ mReservedUniforms.push_back("glowStrength");
+ mReservedUniforms.push_back("glowDelta");
+
+ llassert(mReservedUniforms.size() == LLShaderMgr::GLOW_DELTA+1);
+
+
+ mReservedUniforms.push_back("minimum_alpha");
+
+ mReservedUniforms.push_back("shadow_matrix");
+ mReservedUniforms.push_back("env_mat");
+ mReservedUniforms.push_back("shadow_clip");
+ mReservedUniforms.push_back("sun_wash");
+ mReservedUniforms.push_back("shadow_noise");
+ mReservedUniforms.push_back("blur_size");
+ mReservedUniforms.push_back("ssao_radius");
+ mReservedUniforms.push_back("ssao_max_radius");
+ mReservedUniforms.push_back("ssao_factor");
+ mReservedUniforms.push_back("ssao_factor_inv");
+ mReservedUniforms.push_back("ssao_effect_mat");
+ mReservedUniforms.push_back("screen_res");
+ mReservedUniforms.push_back("near_clip");
+ mReservedUniforms.push_back("shadow_offset");
+ mReservedUniforms.push_back("shadow_bias");
+ mReservedUniforms.push_back("spot_shadow_bias");
+ mReservedUniforms.push_back("spot_shadow_offset");
+ mReservedUniforms.push_back("sun_dir");
+ mReservedUniforms.push_back("shadow_res");
+ mReservedUniforms.push_back("proj_shadow_res");
+ mReservedUniforms.push_back("depth_cutoff");
+ mReservedUniforms.push_back("norm_cutoff");
+
+ llassert(mReservedUniforms.size() == LLShaderMgr::DEFERRED_NORM_CUTOFF+1);
+
+ mReservedUniforms.push_back("tc_scale");
+ mReservedUniforms.push_back("rcp_screen_res");
+ mReservedUniforms.push_back("rcp_frame_opt");
+ mReservedUniforms.push_back("rcp_frame_opt2");
+
+ mReservedUniforms.push_back("focal_distance");
+ mReservedUniforms.push_back("blur_constant");
+ mReservedUniforms.push_back("tan_pixel_angle");
+ mReservedUniforms.push_back("magnification");
+ mReservedUniforms.push_back("max_cof");
+ mReservedUniforms.push_back("res_scale");
+ mReservedUniforms.push_back("dof_width");
+ mReservedUniforms.push_back("dof_height");
+
+ mReservedUniforms.push_back("depthMap");
+ mReservedUniforms.push_back("shadowMap0");
+ mReservedUniforms.push_back("shadowMap1");
+ mReservedUniforms.push_back("shadowMap2");
+ mReservedUniforms.push_back("shadowMap3");
+ mReservedUniforms.push_back("shadowMap4");
+ mReservedUniforms.push_back("shadowMap5");
+
+ llassert(mReservedUniforms.size() == LLShaderMgr::DEFERRED_SHADOW5+1);
+
+ mReservedUniforms.push_back("normalMap");
+ mReservedUniforms.push_back("positionMap");
+ mReservedUniforms.push_back("diffuseRect");
+ mReservedUniforms.push_back("specularRect");
+ mReservedUniforms.push_back("noiseMap");
+ mReservedUniforms.push_back("lightFunc");
+ mReservedUniforms.push_back("lightMap");
+ mReservedUniforms.push_back("bloomMap");
+ mReservedUniforms.push_back("projectionMap");
+
+ llassert(mReservedUniforms.size() == END_RESERVED_UNIFORMS);
+
+ std::set<std::string> dupe_check;
+
+ for (U32 i = 0; i < mReservedUniforms.size(); ++i)
+ {
+ if (dupe_check.find(mReservedUniforms[i]) != dupe_check.end())
+ {
+ llerrs << "Duplicate reserved uniform name found: " << mReservedUniforms[i] << llendl;
+ }
+ dupe_check.insert(mReservedUniforms[i]);
+ }
+}
+
diff --git a/indra/llrender/llshadermgr.h b/indra/llrender/llshadermgr.h
index c54c4608d7..e28bda6de2 100644
--- a/indra/llrender/llshadermgr.h
+++ b/indra/llrender/llshadermgr.h
@@ -36,14 +36,144 @@ public:
LLShaderMgr();
virtual ~LLShaderMgr();
+ typedef enum
+ {
+ MODELVIEW_MATRIX = 0,
+ PROJECTION_MATRIX,
+ INVERSE_PROJECTION_MATRIX,
+ MODELVIEW_PROJECTION_MATRIX,
+ NORMAL_MATRIX,
+ TEXTURE_MATRIX0,
+ TEXTURE_MATRIX1,
+ TEXTURE_MATRIX2,
+ TEXTURE_MATRIX3,
+ VIEWPORT,
+ LIGHT_POSITION,
+ LIGHT_DIRECTION,
+ LIGHT_ATTENUATION,
+ LIGHT_DIFFUSE,
+ LIGHT_AMBIENT,
+ MULTI_LIGHT_COUNT,
+ MULTI_LIGHT,
+ MULTI_LIGHT_COL,
+ MULTI_LIGHT_FAR_Z,
+ PROJECTOR_MATRIX,
+ PROJECTOR_NEAR,
+ PROJECTOR_P,
+ PROJECTOR_N,
+ PROJECTOR_ORIGIN,
+ PROJECTOR_RANGE,
+ PROJECTOR_AMBIANCE,
+ PROJECTOR_SHADOW_INDEX,
+ PROJECTOR_SHADOW_FADE,
+ PROJECTOR_FOCUS,
+ PROJECTOR_LOD,
+ PROJECTOR_AMBIENT_LOD,
+ DIFFUSE_COLOR,
+ DIFFUSE_MAP,
+ SPECULAR_MAP,
+ BUMP_MAP,
+ ENVIRONMENT_MAP,
+ CLOUD_NOISE_MAP,
+ FULLBRIGHT,
+ LIGHTNORM,
+ SUNLIGHT_COLOR,
+ AMBIENT,
+ BLUE_HORIZON,
+ BLUE_DENSITY,
+ HAZE_HORIZON,
+ HAZE_DENSITY,
+ CLOUD_SHADOW,
+ DENSITY_MULTIPLIER,
+ DISTANCE_MULTIPLIER,
+ MAX_Y,
+ GLOW,
+ CLOUD_COLOR,
+ CLOUD_POS_DENSITY1,
+ CLOUD_POS_DENSITY2,
+ CLOUD_SCALE,
+ GAMMA,
+ SCENE_LIGHT_STRENGTH,
+ LIGHT_CENTER,
+ LIGHT_SIZE,
+ LIGHT_FALLOFF,
+
+ GLOW_MIN_LUMINANCE,
+ GLOW_MAX_EXTRACT_ALPHA,
+ GLOW_LUM_WEIGHTS,
+ GLOW_WARMTH_WEIGHTS,
+ GLOW_WARMTH_AMOUNT,
+ GLOW_STRENGTH,
+ GLOW_DELTA,
+
+ MINIMUM_ALPHA,
+
+ DEFERRED_SHADOW_MATRIX,
+ DEFERRED_ENV_MAT,
+ DEFERRED_SHADOW_CLIP,
+ DEFERRED_SUN_WASH,
+ DEFERRED_SHADOW_NOISE,
+ DEFERRED_BLUR_SIZE,
+ DEFERRED_SSAO_RADIUS,
+ DEFERRED_SSAO_MAX_RADIUS,
+ DEFERRED_SSAO_FACTOR,
+ DEFERRED_SSAO_FACTOR_INV,
+ DEFERRED_SSAO_EFFECT_MAT,
+ DEFERRED_SCREEN_RES,
+ DEFERRED_NEAR_CLIP,
+ DEFERRED_SHADOW_OFFSET,
+ DEFERRED_SHADOW_BIAS,
+ DEFERRED_SPOT_SHADOW_BIAS,
+ DEFERRED_SPOT_SHADOW_OFFSET,
+ DEFERRED_SUN_DIR,
+ DEFERRED_SHADOW_RES,
+ DEFERRED_PROJ_SHADOW_RES,
+ DEFERRED_DEPTH_CUTOFF,
+ DEFERRED_NORM_CUTOFF,
+
+ FXAA_TC_SCALE,
+ FXAA_RCP_SCREEN_RES,
+ FXAA_RCP_FRAME_OPT,
+ FXAA_RCP_FRAME_OPT2,
+
+ DOF_FOCAL_DISTANCE,
+ DOF_BLUR_CONSTANT,
+ DOF_TAN_PIXEL_ANGLE,
+ DOF_MAGNIFICATION,
+ DOF_MAX_COF,
+ DOF_RES_SCALE,
+ DOF_WIDTH,
+ DOF_HEIGHT,
+
+ DEFERRED_DEPTH,
+ DEFERRED_SHADOW0,
+ DEFERRED_SHADOW1,
+ DEFERRED_SHADOW2,
+ DEFERRED_SHADOW3,
+ DEFERRED_SHADOW4,
+ DEFERRED_SHADOW5,
+ DEFERRED_NORMAL,
+ DEFERRED_POSITION,
+ DEFERRED_DIFFUSE,
+ DEFERRED_SPECULAR,
+ DEFERRED_NOISE,
+ DEFERRED_LIGHTFUNC,
+ DEFERRED_LIGHT,
+ DEFERRED_BLOOM,
+ DEFERRED_PROJECTION,
+ END_RESERVED_UNIFORMS
+ } eGLSLReservedUniforms;
+
// singleton pattern implementation
static LLShaderMgr * instance();
+ virtual void initAttribsAndUniforms(void);
+
BOOL attachShaderFeatures(LLGLSLShader * shader);
void dumpObjectLog(GLhandleARB ret, BOOL warns = TRUE);
BOOL linkProgramObject(GLhandleARB obj, BOOL suppress_errors = FALSE);
BOOL validateProgramObject(GLhandleARB obj);
- GLhandleARB loadShaderFile(const std::string& filename, S32 & shader_level, GLenum type);
+ GLhandleARB loadShaderFile(const std::string& filename, S32 & shader_level, GLenum type, S32 texture_index_channels = -1);
// Implemented in the application to actually point to the shader directory.
virtual std::string getShaderDirPrefix(void) = 0; // Pure Virtual
@@ -60,6 +190,9 @@ public:
std::vector<std::string> mReservedUniforms;
+ //preprocessor definitions (name/value)
+ std::map<std::string, std::string> mDefinitions;
+
protected:
// our parameter manager singleton instance
diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp
index 02160b09c4..8b5503229f 100644
--- a/indra/llrender/llvertexbuffer.cpp
+++ b/indra/llrender/llvertexbuffer.cpp
@@ -33,44 +33,235 @@
#include "llglheaders.h"
#include "llmemtype.h"
#include "llrender.h"
+#include "llvector4a.h"
+#include "llshadermgr.h"
+#include "llglslshader.h"
+#include "llmemory.h"
+
+//Next Highest Power Of Two
+//helper function, returns first number > v that is a power of 2, or v if v is already a power of 2
+U32 nhpo2(U32 v)
+{
+ U32 r = 1;
+ while (r < v) {
+ r *= 2;
+ }
+ return r;
+}
+
//============================================================================
//static
-LLVBOPool LLVertexBuffer::sStreamVBOPool;
-LLVBOPool LLVertexBuffer::sDynamicVBOPool;
-LLVBOPool LLVertexBuffer::sStreamIBOPool;
-LLVBOPool LLVertexBuffer::sDynamicIBOPool;
+LLVBOPool LLVertexBuffer::sStreamVBOPool(GL_STREAM_DRAW_ARB, GL_ARRAY_BUFFER_ARB);
+LLVBOPool LLVertexBuffer::sDynamicVBOPool(GL_DYNAMIC_DRAW_ARB, GL_ARRAY_BUFFER_ARB);
+LLVBOPool LLVertexBuffer::sStreamIBOPool(GL_STREAM_DRAW_ARB, GL_ELEMENT_ARRAY_BUFFER_ARB);
+LLVBOPool LLVertexBuffer::sDynamicIBOPool(GL_DYNAMIC_DRAW_ARB, GL_ELEMENT_ARRAY_BUFFER_ARB);
+U32 LLVBOPool::sBytesPooled = 0;
+LLPrivateMemoryPool* LLVertexBuffer::sPrivatePoolp = NULL;
U32 LLVertexBuffer::sBindCount = 0;
U32 LLVertexBuffer::sSetCount = 0;
S32 LLVertexBuffer::sCount = 0;
S32 LLVertexBuffer::sGLCount = 0;
S32 LLVertexBuffer::sMappedCount = 0;
-BOOL LLVertexBuffer::sEnableVBOs = TRUE;
+bool LLVertexBuffer::sDisableVBOMapping = false;
+bool LLVertexBuffer::sEnableVBOs = true;
U32 LLVertexBuffer::sGLRenderBuffer = 0;
+U32 LLVertexBuffer::sGLRenderArray = 0;
U32 LLVertexBuffer::sGLRenderIndices = 0;
U32 LLVertexBuffer::sLastMask = 0;
-BOOL LLVertexBuffer::sVBOActive = FALSE;
-BOOL LLVertexBuffer::sIBOActive = FALSE;
+bool LLVertexBuffer::sVBOActive = false;
+bool LLVertexBuffer::sIBOActive = false;
U32 LLVertexBuffer::sAllocatedBytes = 0;
-BOOL LLVertexBuffer::sMapped = FALSE;
-BOOL LLVertexBuffer::sUseStreamDraw = TRUE;
+bool LLVertexBuffer::sMapped = false;
+bool LLVertexBuffer::sUseStreamDraw = true;
+bool LLVertexBuffer::sUseVAO = false;
+bool LLVertexBuffer::sPreferStreamDraw = false;
+
+const U32 FENCE_WAIT_TIME_NANOSECONDS = 10000; //1 ms
+
+class LLGLSyncFence : public LLGLFence
+{
+public:
+#ifdef GL_ARB_sync
+ GLsync mSync;
+#endif
+
+ LLGLSyncFence()
+ {
+#ifdef GL_ARB_sync
+ mSync = 0;
+#endif
+ }
+
+ virtual ~LLGLSyncFence()
+ {
+#ifdef GL_ARB_sync
+ if (mSync)
+ {
+ glDeleteSync(mSync);
+ }
+#endif
+ }
+
+ void placeFence()
+ {
+#ifdef GL_ARB_sync
+ if (mSync)
+ {
+ glDeleteSync(mSync);
+ }
+ mSync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
+#endif
+ }
+
+ void wait()
+ {
+#ifdef GL_ARB_sync
+ if (mSync)
+ {
+ while (glClientWaitSync(mSync, 0, FENCE_WAIT_TIME_NANOSECONDS) == GL_TIMEOUT_EXPIRED)
+ { //track the number of times we've waited here
+ static S32 waits = 0;
+ waits++;
+ }
+ }
+#endif
+ }
+
+
+};
+
+
+//which power of 2 is i?
+//assumes i is a power of 2 > 0
+U32 wpo2(U32 i)
+{
+ llassert(i > 0);
+ llassert(nhpo2(i) == i);
+
+ U32 r = 0;
+
+ while (i >>= 1) ++r;
+
+ return r;
+}
+
+volatile U8* LLVBOPool::allocate(U32& name, U32 size)
+{
+ llassert(nhpo2(size) == size);
+
+ U32 i = wpo2(size);
+
+ if (mFreeList.size() <= i)
+ {
+ mFreeList.resize(i+1);
+ }
+
+ volatile U8* ret = NULL;
+
+ if (mFreeList[i].empty())
+ {
+ //make a new buffer
+ glGenBuffersARB(1, &name);
+ glBindBufferARB(mType, name);
+ LLVertexBuffer::sAllocatedBytes += size;
+
+ if (LLVertexBuffer::sDisableVBOMapping || mUsage != GL_DYNAMIC_DRAW_ARB)
+ {
+ glBufferDataARB(mType, size, 0, mUsage);
+ ret = (U8*) ll_aligned_malloc_16(size);
+ }
+ else
+ { //always use a true hint of static draw when allocating non-client-backed buffers
+ glBufferDataARB(mType, size, 0, GL_STATIC_DRAW_ARB);
+ }
-std::vector<U32> LLVertexBuffer::sDeleteList;
+ glBindBufferARB(mType, 0);
+ }
+ else
+ {
+ name = mFreeList[i].front().mGLName;
+ ret = mFreeList[i].front().mClientData;
+
+ sBytesPooled -= size;
+
+ mFreeList[i].pop_front();
+ }
+
+ return ret;
+}
+
+void LLVBOPool::release(U32 name, volatile U8* buffer, U32 size)
+{
+ llassert(nhpo2(size) == size);
+
+ U32 i = wpo2(size);
+
+ llassert(mFreeList.size() > i);
+
+ Record rec;
+ rec.mGLName = name;
+ rec.mClientData = buffer;
+
+ if (buffer == NULL)
+ {
+ glDeleteBuffersARB(1, &rec.mGLName);
+ }
+ else
+ {
+ sBytesPooled += size;
+ mFreeList[i].push_back(rec);
+ }
+}
-S32 LLVertexBuffer::sTypeOffsets[LLVertexBuffer::TYPE_MAX] =
+void LLVBOPool::cleanup()
{
- sizeof(LLVector3), // TYPE_VERTEX,
- sizeof(LLVector3), // TYPE_NORMAL,
+ U32 size = 1;
+
+ for (U32 i = 0; i < mFreeList.size(); ++i)
+ {
+ record_list_t& l = mFreeList[i];
+
+ while (!l.empty())
+ {
+ Record& r = l.front();
+
+ glDeleteBuffersARB(1, &r.mGLName);
+
+ if (r.mClientData)
+ {
+ ll_aligned_free_16((void*) r.mClientData);
+ }
+
+ l.pop_front();
+
+ LLVertexBuffer::sAllocatedBytes -= size;
+ sBytesPooled -= size;
+ }
+
+ size *= 2;
+ }
+}
+
+
+//NOTE: each component must be AT LEAST 4 bytes in size to avoid a performance penalty on AMD hardware
+S32 LLVertexBuffer::sTypeSize[LLVertexBuffer::TYPE_MAX] =
+{
+ sizeof(LLVector4), // TYPE_VERTEX,
+ sizeof(LLVector4), // TYPE_NORMAL,
sizeof(LLVector2), // TYPE_TEXCOORD0,
sizeof(LLVector2), // TYPE_TEXCOORD1,
sizeof(LLVector2), // TYPE_TEXCOORD2,
sizeof(LLVector2), // TYPE_TEXCOORD3,
sizeof(LLColor4U), // TYPE_COLOR,
- sizeof(LLVector3), // TYPE_BINORMAL,
+ sizeof(LLColor4U), // TYPE_EMISSIVE, only alpha is used currently
+ sizeof(LLVector4), // TYPE_BINORMAL,
sizeof(F32), // TYPE_WEIGHT,
+ sizeof(LLVector4), // TYPE_WEIGHT4,
sizeof(LLVector4), // TYPE_CLOTHWEIGHT,
+ sizeof(LLVector4), // TYPE_TEXTURE_INDEX (actually exists as position.w), no extra data, but stride is 16 bytes
};
U32 LLVertexBuffer::sGLMode[LLRender::NUM_MODES] =
@@ -85,155 +276,318 @@ U32 LLVertexBuffer::sGLMode[LLRender::NUM_MODES] =
GL_LINE_LOOP,
};
+
//static
void LLVertexBuffer::setupClientArrays(U32 data_mask)
{
- /*if (LLGLImmediate::sStarted)
- {
- llerrs << "Cannot use LLGLImmediate and LLVertexBuffer simultaneously!" << llendl;
- }*/
-
if (sLastMask != data_mask)
{
- U32 mask[] =
+ bool error = false;
+
+ if (gGLManager.mGLSLVersionMajor < 2 && gGLManager.mGLSLVersionMinor < 30)
{
- MAP_VERTEX,
- MAP_NORMAL,
- MAP_TEXCOORD0,
- MAP_COLOR,
- };
-
- GLenum array[] =
- {
- GL_VERTEX_ARRAY,
- GL_NORMAL_ARRAY,
- GL_TEXTURE_COORD_ARRAY,
- GL_COLOR_ARRAY,
- };
-
- BOOL error = FALSE;
- for (U32 i = 0; i < 4; ++i)
- {
- if (sLastMask & mask[i])
- { //was enabled
- if (!(data_mask & mask[i]) && i > 0)
- { //needs to be disabled
- glDisableClientState(array[i]);
+ //make sure texture index is disabled
+ data_mask = data_mask & ~MAP_TEXTURE_INDEX;
+ }
+
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ for (U32 i = 0; i < TYPE_MAX; ++i)
+ {
+ S32 loc = i;
+
+ U32 mask = 1 << i;
+
+ if (sLastMask & (1 << i))
+ { //was enabled
+ if (!(data_mask & mask))
+ { //needs to be disabled
+ glDisableVertexAttribArrayARB(loc);
+ }
}
- else if (gDebugGL)
- { //needs to be enabled, make sure it was (DEBUG TEMPORARY)
- if (i > 0 && !glIsEnabled(array[i]))
- {
+ else
+ { //was disabled
+ if (data_mask & mask)
+ { //needs to be enabled
+ glEnableVertexAttribArrayARB(loc);
+ }
+ }
+ }
+ }
+ else
+ {
+
+ GLenum array[] =
+ {
+ GL_VERTEX_ARRAY,
+ GL_NORMAL_ARRAY,
+ GL_TEXTURE_COORD_ARRAY,
+ GL_COLOR_ARRAY,
+ };
+
+ GLenum mask[] =
+ {
+ MAP_VERTEX,
+ MAP_NORMAL,
+ MAP_TEXCOORD0,
+ MAP_COLOR
+ };
+
+
+
+ for (U32 i = 0; i < 4; ++i)
+ {
+ if (sLastMask & mask[i])
+ { //was enabled
+ if (!(data_mask & mask[i]))
+ { //needs to be disabled
+ glDisableClientState(array[i]);
+ }
+ else if (gDebugGL)
+ { //needs to be enabled, make sure it was (DEBUG)
+ if (!glIsEnabled(array[i]))
+ {
+ if (gDebugSession)
+ {
+ error = true;
+ gFailLog << "Bad client state! " << array[i] << " disabled." << std::endl;
+ }
+ else
+ {
+ llerrs << "Bad client state! " << array[i] << " disabled." << llendl;
+ }
+ }
+ }
+ }
+ else
+ { //was disabled
+ if (data_mask & mask[i])
+ { //needs to be enabled
+ glEnableClientState(array[i]);
+ }
+ else if (gDebugGL && glIsEnabled(array[i]))
+ { //needs to be disabled, make sure it was (DEBUG TEMPORARY)
if (gDebugSession)
{
- error = TRUE;
- gFailLog << "Bad client state! " << array[i] << " disabled." << std::endl;
+ error = true;
+ gFailLog << "Bad client state! " << array[i] << " enabled." << std::endl;
}
else
{
- llerrs << "Bad client state! " << array[i] << " disabled." << llendl;
+ llerrs << "Bad client state! " << array[i] << " enabled." << llendl;
}
}
}
}
- else
- { //was disabled
- if (data_mask & mask[i])
- { //needs to be enabled
- glEnableClientState(array[i]);
- }
- else if (gDebugGL && glIsEnabled(array[i]))
- { //needs to be disabled, make sure it was (DEBUG TEMPORARY)
- if (gDebugSession)
- {
- error = TRUE;
- gFailLog << "Bad client state! " << array[i] << " enabled." << std::endl;
- }
- else
- {
- llerrs << "Bad client state! " << array[i] << " enabled." << llendl;
+
+ U32 map_tc[] =
+ {
+ MAP_TEXCOORD1,
+ MAP_TEXCOORD2,
+ MAP_TEXCOORD3
+ };
+
+ for (U32 i = 0; i < 3; i++)
+ {
+ if (sLastMask & map_tc[i])
+ {
+ if (!(data_mask & map_tc[i]))
+ { //disable
+ glClientActiveTextureARB(GL_TEXTURE1_ARB+i);
+ glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+ glClientActiveTextureARB(GL_TEXTURE0_ARB);
}
}
+ else if (data_mask & map_tc[i])
+ {
+ glClientActiveTextureARB(GL_TEXTURE1_ARB+i);
+ glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+ glClientActiveTextureARB(GL_TEXTURE0_ARB);
+ }
}
- }
-
- if (error)
- {
- ll_fail("LLVertexBuffer::setupClientArrays failed");
- }
-
- U32 map_tc[] =
- {
- MAP_TEXCOORD1,
- MAP_TEXCOORD2,
- MAP_TEXCOORD3
- };
- for (U32 i = 0; i < 3; i++)
- {
- if (sLastMask & map_tc[i])
+ if (sLastMask & MAP_BINORMAL)
{
- if (!(data_mask & map_tc[i]))
+ if (!(data_mask & MAP_BINORMAL))
{
- glClientActiveTextureARB(GL_TEXTURE1_ARB+i);
+ glClientActiveTextureARB(GL_TEXTURE2_ARB);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glClientActiveTextureARB(GL_TEXTURE0_ARB);
}
}
- else if (data_mask & map_tc[i])
+ else if (data_mask & MAP_BINORMAL)
{
- glClientActiveTextureARB(GL_TEXTURE1_ARB+i);
+ glClientActiveTextureARB(GL_TEXTURE2_ARB);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glClientActiveTextureARB(GL_TEXTURE0_ARB);
}
}
+
+ sLastMask = data_mask;
+ }
+}
- if (sLastMask & MAP_BINORMAL)
+//static
+void LLVertexBuffer::drawArrays(U32 mode, const std::vector<LLVector3>& pos, const std::vector<LLVector3>& norm)
+{
+ llassert(!LLGLSLShader::sNoFixedFunction || LLGLSLShader::sCurBoundShaderPtr != NULL);
+ gGL.syncMatrices();
+
+ U32 count = pos.size();
+ llassert_always(norm.size() >= pos.size());
+ llassert_always(count > 0);
+
+ unbind();
+
+ setupClientArrays(MAP_VERTEX | MAP_NORMAL);
+
+ LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr;
+
+ if (shader)
+ {
+ S32 loc = LLVertexBuffer::TYPE_VERTEX;
+ if (loc > -1)
{
- if (!(data_mask & MAP_BINORMAL))
- {
- glClientActiveTextureARB(GL_TEXTURE2_ARB);
- glDisableClientState(GL_TEXTURE_COORD_ARRAY);
- glClientActiveTextureARB(GL_TEXTURE0_ARB);
- }
+ glVertexAttribPointerARB(loc, 3, GL_FLOAT, GL_FALSE, 0, pos[0].mV);
}
- else if (data_mask & MAP_BINORMAL)
+ loc = LLVertexBuffer::TYPE_NORMAL;
+ if (loc > -1)
{
- glClientActiveTextureARB(GL_TEXTURE2_ARB);
- glEnableClientState(GL_TEXTURE_COORD_ARRAY);
- glClientActiveTextureARB(GL_TEXTURE0_ARB);
+ glVertexAttribPointerARB(loc, 3, GL_FLOAT, GL_FALSE, 0, norm[0].mV);
}
-
- sLastMask = data_mask;
}
+ else
+ {
+ glVertexPointer(3, GL_FLOAT, 0, pos[0].mV);
+ glNormalPointer(GL_FLOAT, 0, norm[0].mV);
+ }
+
+ glDrawArrays(sGLMode[mode], 0, count);
}
-void LLVertexBuffer::drawRange(U32 mode, U32 start, U32 end, U32 count, U32 indices_offset) const
+//static
+void LLVertexBuffer::drawElements(U32 mode, const LLVector4a* pos, const LLVector2* tc, S32 num_indices, const U16* indicesp)
{
- llassert(mRequestedNumVerts >= 0);
+ llassert(!LLGLSLShader::sNoFixedFunction || LLGLSLShader::sCurBoundShaderPtr != NULL);
+
+ gGL.syncMatrices();
+
+ U32 mask = LLVertexBuffer::MAP_VERTEX;
+ if (tc)
+ {
+ mask = mask | LLVertexBuffer::MAP_TEXCOORD0;
+ }
+
+ unbind();
+
+ setupClientArrays(mask);
+
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ S32 loc = LLVertexBuffer::TYPE_VERTEX;
+ glVertexAttribPointerARB(loc, 3, GL_FLOAT, GL_FALSE, 16, pos);
+
+ if (tc)
+ {
+ loc = LLVertexBuffer::TYPE_TEXCOORD0;
+ glVertexAttribPointerARB(loc, 2, GL_FLOAT, GL_FALSE, 0, tc);
+ }
+ }
+ else
+ {
+ glTexCoordPointer(2, GL_FLOAT, 0, tc);
+ glVertexPointer(3, GL_FLOAT, 16, pos);
+ }
+
+ glDrawElements(sGLMode[mode], num_indices, GL_UNSIGNED_SHORT, indicesp);
+}
- if (start >= (U32) mRequestedNumVerts ||
- end >= (U32) mRequestedNumVerts)
+void LLVertexBuffer::validateRange(U32 start, U32 end, U32 count, U32 indices_offset) const
+{
+ if (start >= (U32) mNumVerts ||
+ end >= (U32) mNumVerts)
{
- llerrs << "Bad vertex buffer draw range: [" << start << ", " << end << "]" << llendl;
+ llerrs << "Bad vertex buffer draw range: [" << start << ", " << end << "] vs " << mNumVerts << llendl;
}
- llassert(mRequestedNumIndices >= 0);
+ llassert(mNumIndices >= 0);
- if (indices_offset >= (U32) mRequestedNumIndices ||
- indices_offset + count > (U32) mRequestedNumIndices)
+ if (indices_offset >= (U32) mNumIndices ||
+ indices_offset + count > (U32) mNumIndices)
{
llerrs << "Bad index buffer draw range: [" << indices_offset << ", " << indices_offset+count << "]" << llendl;
}
- if (mGLIndices != sGLRenderIndices)
+ if (gDebugGL && !useVBOs())
{
- llerrs << "Wrong index buffer bound." << llendl;
+ U16* idx = ((U16*) getIndicesPointer())+indices_offset;
+ for (U32 i = 0; i < count; ++i)
+ {
+ if (idx[i] < start || idx[i] > end)
+ {
+ llerrs << "Index out of range: " << idx[i] << " not in [" << start << ", " << end << "]" << llendl;
+ }
+ }
+
+ LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr;
+
+ if (shader && shader->mFeatures.mIndexedTextureChannels > 1)
+ {
+ LLStrider<LLVector4a> v;
+ //hack to get non-const reference
+ LLVertexBuffer* vb = (LLVertexBuffer*) this;
+ vb->getVertexStrider(v);
+
+ for (U32 i = start; i < end; i++)
+ {
+ S32 idx = (S32) (v[i][3]+0.25f);
+ if (idx < 0 || idx >= shader->mFeatures.mIndexedTextureChannels)
+ {
+ llerrs << "Bad texture index found in vertex data stream." << llendl;
+ }
+ }
+ }
}
+}
+
+void LLVertexBuffer::drawRange(U32 mode, U32 start, U32 end, U32 count, U32 indices_offset) const
+{
+ validateRange(start, end, count, indices_offset);
+ mMappable = false;
+ gGL.syncMatrices();
- if (mGLBuffer != sGLRenderBuffer)
+ llassert(mNumVerts >= 0);
+ llassert(!LLGLSLShader::sNoFixedFunction || LLGLSLShader::sCurBoundShaderPtr != NULL);
+
+ if (mGLArray)
{
- llerrs << "Wrong vertex buffer bound." << llendl;
+ if (mGLArray != sGLRenderArray)
+ {
+ llerrs << "Wrong vertex array bound." << llendl;
+ }
+ }
+ else
+ {
+ if (mGLIndices != sGLRenderIndices)
+ {
+ llerrs << "Wrong index buffer bound." << llendl;
+ }
+
+ if (mGLBuffer != sGLRenderBuffer)
+ {
+ llerrs << "Wrong vertex buffer bound." << llendl;
+ }
+ }
+
+ if (gDebugGL && !mGLArray && useVBOs())
+ {
+ GLint elem = 0;
+ glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB, &elem);
+
+ if (elem != mGLIndices)
+ {
+ llerrs << "Wrong index buffer bound!" << llendl;
+ }
}
if (mode >= LLRender::NUM_MODES)
@@ -242,29 +596,46 @@ void LLVertexBuffer::drawRange(U32 mode, U32 start, U32 end, U32 count, U32 indi
return;
}
+ U16* idx = ((U16*) getIndicesPointer())+indices_offset;
+
stop_glerror();
glDrawRangeElements(sGLMode[mode], start, end, count, GL_UNSIGNED_SHORT,
- ((U16*) getIndicesPointer()) + indices_offset);
+ idx);
stop_glerror();
+ placeFence();
}
void LLVertexBuffer::draw(U32 mode, U32 count, U32 indices_offset) const
{
- llassert(mRequestedNumIndices >= 0);
- if (indices_offset >= (U32) mRequestedNumIndices ||
- indices_offset + count > (U32) mRequestedNumIndices)
+ llassert(!LLGLSLShader::sNoFixedFunction || LLGLSLShader::sCurBoundShaderPtr != NULL);
+ mMappable = false;
+ gGL.syncMatrices();
+
+ llassert(mNumIndices >= 0);
+ if (indices_offset >= (U32) mNumIndices ||
+ indices_offset + count > (U32) mNumIndices)
{
llerrs << "Bad index buffer draw range: [" << indices_offset << ", " << indices_offset+count << "]" << llendl;
}
- if (mGLIndices != sGLRenderIndices)
+ if (mGLArray)
{
- llerrs << "Wrong index buffer bound." << llendl;
+ if (mGLArray != sGLRenderArray)
+ {
+ llerrs << "Wrong vertex array bound." << llendl;
+ }
}
-
- if (mGLBuffer != sGLRenderBuffer)
+ else
{
- llerrs << "Wrong vertex buffer bound." << llendl;
+ if (mGLIndices != sGLRenderIndices)
+ {
+ llerrs << "Wrong index buffer bound." << llendl;
+ }
+
+ if (mGLBuffer != sGLRenderBuffer)
+ {
+ llerrs << "Wrong vertex buffer bound." << llendl;
+ }
}
if (mode >= LLRender::NUM_MODES)
@@ -277,20 +648,35 @@ void LLVertexBuffer::draw(U32 mode, U32 count, U32 indices_offset) const
glDrawElements(sGLMode[mode], count, GL_UNSIGNED_SHORT,
((U16*) getIndicesPointer()) + indices_offset);
stop_glerror();
+ placeFence();
}
void LLVertexBuffer::drawArrays(U32 mode, U32 first, U32 count) const
{
- llassert(mRequestedNumVerts >= 0);
- if (first >= (U32) mRequestedNumVerts ||
- first + count > (U32) mRequestedNumVerts)
+ llassert(!LLGLSLShader::sNoFixedFunction || LLGLSLShader::sCurBoundShaderPtr != NULL);
+ mMappable = false;
+ gGL.syncMatrices();
+
+ llassert(mNumVerts >= 0);
+ if (first >= (U32) mNumVerts ||
+ first + count > (U32) mNumVerts)
{
llerrs << "Bad vertex buffer draw range: [" << first << ", " << first+count << "]" << llendl;
}
- if (mGLBuffer != sGLRenderBuffer || useVBOs() != sVBOActive)
+ if (mGLArray)
{
- llerrs << "Wrong vertex buffer bound." << llendl;
+ if (mGLArray != sGLRenderArray)
+ {
+ llerrs << "Wrong vertex array bound." << llendl;
+ }
+ }
+ else
+ {
+ if (mGLBuffer != sGLRenderBuffer || useVBOs() != sVBOActive)
+ {
+ llerrs << "Wrong vertex buffer bound." << llendl;
+ }
}
if (mode >= LLRender::NUM_MODES)
@@ -302,30 +688,43 @@ void LLVertexBuffer::drawArrays(U32 mode, U32 first, U32 count) const
stop_glerror();
glDrawArrays(sGLMode[mode], first, count);
stop_glerror();
+ placeFence();
}
//static
-void LLVertexBuffer::initClass(bool use_vbo)
+void LLVertexBuffer::initClass(bool use_vbo, bool no_vbo_mapping)
{
- sEnableVBOs = use_vbo;
- LLGLNamePool::registerPool(&sDynamicVBOPool);
- LLGLNamePool::registerPool(&sDynamicIBOPool);
- LLGLNamePool::registerPool(&sStreamVBOPool);
- LLGLNamePool::registerPool(&sStreamIBOPool);
+ sEnableVBOs = use_vbo && gGLManager.mHasVertexBufferObject;
+ sDisableVBOMapping = sEnableVBOs && no_vbo_mapping;
+
+ if (!sPrivatePoolp)
+ {
+ sPrivatePoolp = LLPrivateMemoryPoolManager::getInstance()->newPool(LLPrivateMemoryPool::STATIC);
+ }
}
//static
void LLVertexBuffer::unbind()
{
+ if (sGLRenderArray)
+ {
+#if GL_ARB_vertex_array_object
+ glBindVertexArray(0);
+#endif
+ sGLRenderArray = 0;
+ sGLRenderIndices = 0;
+ sIBOActive = false;
+ }
+
if (sVBOActive)
{
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
- sVBOActive = FALSE;
+ sVBOActive = false;
}
if (sIBOActive)
{
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);
- sIBOActive = FALSE;
+ sIBOActive = false;
}
sGLRenderBuffer = 0;
@@ -339,79 +738,140 @@ void LLVertexBuffer::cleanupClass()
{
LLMemType mt2(LLMemType::MTYPE_VERTEX_CLEANUP_CLASS);
unbind();
- clientCopy(); // deletes GL buffers
-}
+
+ sStreamIBOPool.cleanup();
+ sDynamicIBOPool.cleanup();
+ sStreamVBOPool.cleanup();
+ sDynamicVBOPool.cleanup();
-void LLVertexBuffer::clientCopy(F64 max_time)
-{
- if (!sDeleteList.empty())
+ if(sPrivatePoolp)
{
- glDeleteBuffersARB(sDeleteList.size(), (GLuint*) &(sDeleteList[0]));
- sDeleteList.clear();
+ LLPrivateMemoryPoolManager::getInstance()->deletePool(sPrivatePoolp);
+ sPrivatePoolp = NULL;
}
}
//----------------------------------------------------------------------------
+S32 LLVertexBuffer::determineUsage(S32 usage)
+{
+ S32 ret_usage = usage;
+
+ if (!sEnableVBOs)
+ {
+ ret_usage = 0;
+ }
+
+ if (ret_usage == GL_STREAM_DRAW_ARB && !sUseStreamDraw)
+ {
+ ret_usage = 0;
+ }
+
+ if (ret_usage == GL_DYNAMIC_DRAW_ARB && sPreferStreamDraw)
+ {
+ ret_usage = GL_STREAM_DRAW_ARB;
+ }
+
+ if (ret_usage == 0 && LLRender::sGLCoreProfile)
+ { //MUST use VBOs for all rendering
+ ret_usage = GL_STREAM_DRAW_ARB;
+ }
+
+ if (ret_usage && ret_usage != GL_STREAM_DRAW_ARB)
+ { //only stream_draw and dynamic_draw are supported when using VBOs, dynamic draw is the default
+ if (sDisableVBOMapping)
+ { //always use stream draw if VBO mapping is disabled
+ ret_usage = GL_STREAM_DRAW_ARB;
+ }
+ else
+ {
+ ret_usage = GL_DYNAMIC_DRAW_ARB;
+ }
+ }
+
+ return ret_usage;
+}
+
LLVertexBuffer::LLVertexBuffer(U32 typemask, S32 usage) :
LLRefCount(),
mNumVerts(0),
mNumIndices(0),
- mRequestedNumVerts(-1),
- mRequestedNumIndices(-1),
- mUsage(usage),
+ mAlignedOffset(0),
+ mAlignedIndexOffset(0),
+ mSize(0),
+ mIndicesSize(0),
+ mTypeMask(typemask),
+ mUsage(LLVertexBuffer::determineUsage(usage)),
mGLBuffer(0),
- mGLIndices(0),
+ mGLIndices(0),
+ mGLArray(0),
mMappedData(NULL),
- mMappedIndexData(NULL), mLocked(FALSE),
- mFinal(FALSE),
- mFilthy(FALSE),
- mEmpty(TRUE),
- mResized(FALSE),
- mDynamicSize(FALSE)
+ mMappedIndexData(NULL),
+ mMappedDataUsingVBOs(false),
+ mMappedIndexDataUsingVBOs(false),
+ mVertexLocked(false),
+ mIndexLocked(false),
+ mFinal(false),
+ mEmpty(true),
+ mMappable(false),
+ mFence(NULL)
{
LLMemType mt2(LLMemType::MTYPE_VERTEX_CONSTRUCTOR);
- if (!sEnableVBOs)
- {
- mUsage = 0 ;
- }
- if (mUsage == GL_STREAM_DRAW_ARB && !sUseStreamDraw)
- {
- mUsage = 0;
- }
-
- if (mUsage == GL_STREAM_DRAW_ARB && !sUseStreamDraw)
+ mMappable = (mUsage == GL_DYNAMIC_DRAW_ARB && !sDisableVBOMapping);
+
+ //zero out offsets
+ for (U32 i = 0; i < TYPE_MAX; i++)
{
- mUsage = 0;
+ mOffsets[i] = 0;
}
- S32 stride = calcStride(typemask, mOffsets);
-
- mTypeMask = typemask;
- mStride = stride;
sCount++;
}
//static
-S32 LLVertexBuffer::calcStride(const U32& typemask, S32* offsets)
+S32 LLVertexBuffer::calcOffsets(const U32& typemask, S32* offsets, S32 num_vertices)
{
- S32 stride = 0;
- for (S32 i=0; i<TYPE_MAX; i++)
+ S32 offset = 0;
+ for (S32 i=0; i<TYPE_TEXTURE_INDEX; i++)
{
U32 mask = 1<<i;
if (typemask & mask)
{
- if (offsets)
+ if (offsets && LLVertexBuffer::sTypeSize[i])
{
- offsets[i] = stride;
+ offsets[i] = offset;
+ offset += LLVertexBuffer::sTypeSize[i]*num_vertices;
+ offset = (offset + 0xF) & ~0xF;
}
- stride += sTypeOffsets[i];
}
}
- return stride;
+ offsets[TYPE_TEXTURE_INDEX] = offsets[TYPE_VERTEX] + 12;
+
+ return offset+16;
+}
+
+//static
+S32 LLVertexBuffer::calcVertexSize(const U32& typemask)
+{
+ S32 size = 0;
+ for (S32 i = 0; i < TYPE_TEXTURE_INDEX; i++)
+ {
+ U32 mask = 1<<i;
+ if (typemask & mask)
+ {
+ size += LLVertexBuffer::sTypeSize[i];
+ }
+ }
+
+ return size;
+}
+
+S32 LLVertexBuffer::getSize() const
+{
+ return mSize;
}
// protected, use unref()
@@ -421,44 +881,81 @@ LLVertexBuffer::~LLVertexBuffer()
LLMemType mt2(LLMemType::MTYPE_VERTEX_DESTRUCTOR);
destroyGLBuffer();
destroyGLIndices();
+
+ if (mGLArray)
+ {
+#if GL_ARB_vertex_array_object
+ glDeleteVertexArrays(1, &mGLArray);
+#endif
+ }
+
sCount--;
+
+ if (mFence)
+ {
+ delete mFence;
+ }
+
+ mFence = NULL;
+
+ llassert_always(!mMappedData && !mMappedIndexData);
};
+void LLVertexBuffer::placeFence() const
+{
+ /*if (!mFence && useVBOs())
+ {
+ if (gGLManager.mHasSync)
+ {
+ mFence = new LLGLSyncFence();
+ }
+ }
+
+ if (mFence)
+ {
+ mFence->placeFence();
+ }*/
+}
+
+void LLVertexBuffer::waitFence() const
+{
+ /*if (mFence)
+ {
+ mFence->wait();
+ }*/
+}
+
//----------------------------------------------------------------------------
-void LLVertexBuffer::genBuffer()
+void LLVertexBuffer::genBuffer(U32 size)
{
+ mSize = nhpo2(size);
+
if (mUsage == GL_STREAM_DRAW_ARB)
{
- mGLBuffer = sStreamVBOPool.allocate();
- }
- else if (mUsage == GL_DYNAMIC_DRAW_ARB)
- {
- mGLBuffer = sDynamicVBOPool.allocate();
+ mMappedData = sStreamVBOPool.allocate(mGLBuffer, mSize);
}
else
{
- BOOST_STATIC_ASSERT(sizeof(mGLBuffer) == sizeof(GLuint));
- glGenBuffersARB(1, (GLuint*)&mGLBuffer);
+ mMappedData = sDynamicVBOPool.allocate(mGLBuffer, mSize);
}
+
sGLCount++;
}
-void LLVertexBuffer::genIndices()
+void LLVertexBuffer::genIndices(U32 size)
{
+ mIndicesSize = nhpo2(size);
+
if (mUsage == GL_STREAM_DRAW_ARB)
{
- mGLIndices = sStreamIBOPool.allocate();
- }
- else if (mUsage == GL_DYNAMIC_DRAW_ARB)
- {
- mGLIndices = sDynamicIBOPool.allocate();
+ mMappedIndexData = sStreamIBOPool.allocate(mGLIndices, mIndicesSize);
}
else
{
- BOOST_STATIC_ASSERT(sizeof(mGLBuffer) == sizeof(GLuint));
- glGenBuffersARB(1, (GLuint*)&mGLIndices);
+ mMappedIndexData = sDynamicIBOPool.allocate(mGLIndices, mIndicesSize);
}
+
sGLCount++;
}
@@ -466,16 +963,16 @@ void LLVertexBuffer::releaseBuffer()
{
if (mUsage == GL_STREAM_DRAW_ARB)
{
- sStreamVBOPool.release(mGLBuffer);
- }
- else if (mUsage == GL_DYNAMIC_DRAW_ARB)
- {
- sDynamicVBOPool.release(mGLBuffer);
+ sStreamVBOPool.release(mGLBuffer, mMappedData, mSize);
}
else
{
- sDeleteList.push_back(mGLBuffer);
+ sDynamicVBOPool.release(mGLBuffer, mMappedData, mSize);
}
+
+ mGLBuffer = 0;
+ mMappedData = NULL;
+
sGLCount--;
}
@@ -483,24 +980,23 @@ void LLVertexBuffer::releaseIndices()
{
if (mUsage == GL_STREAM_DRAW_ARB)
{
- sStreamIBOPool.release(mGLIndices);
- }
- else if (mUsage == GL_DYNAMIC_DRAW_ARB)
- {
- sDynamicIBOPool.release(mGLIndices);
+ sStreamIBOPool.release(mGLIndices, mMappedIndexData, mIndicesSize);
}
else
{
- sDeleteList.push_back(mGLIndices);
+ sDynamicIBOPool.release(mGLIndices, mMappedIndexData, mIndicesSize);
}
+
+ mGLIndices = 0;
+ mMappedIndexData = NULL;
+
sGLCount--;
}
-void LLVertexBuffer::createGLBuffer()
+void LLVertexBuffer::createGLBuffer(U32 size)
{
LLMemType mt2(LLMemType::MTYPE_VERTEX_CREATE_VERTICES);
- U32 size = getSize();
if (mGLBuffer)
{
destroyGLBuffer();
@@ -511,28 +1007,27 @@ void LLVertexBuffer::createGLBuffer()
return;
}
- mEmpty = TRUE;
+ mEmpty = true;
- if (useVBOs())
+ mMappedDataUsingVBOs = useVBOs();
+
+ if (mMappedDataUsingVBOs)
{
- mMappedData = NULL;
- genBuffer();
- mResized = TRUE;
+ genBuffer(size);
}
else
{
static int gl_buffer_idx = 0;
mGLBuffer = ++gl_buffer_idx;
- mMappedData = new U8[size];
- memset(mMappedData, 0, size);
+ mMappedData = (U8*)ALLOCATE_MEM(sPrivatePoolp, size);
+ mSize = size;
}
}
-void LLVertexBuffer::createGLIndices()
+void LLVertexBuffer::createGLIndices(U32 size)
{
LLMemType mt2(LLMemType::MTYPE_VERTEX_CREATE_INDICES);
- U32 size = getIndicesSize();
-
+
if (mGLIndices)
{
destroyGLIndices();
@@ -543,20 +1038,25 @@ void LLVertexBuffer::createGLIndices()
return;
}
- mEmpty = TRUE;
+ mEmpty = true;
- if (useVBOs())
+ //pad by 16 bytes for aligned copies
+ size += 16;
+
+ mMappedIndexDataUsingVBOs = useVBOs();
+
+ if (mMappedIndexDataUsingVBOs)
{
- mMappedIndexData = NULL;
- genIndices();
- mResized = TRUE;
+ //pad by another 16 bytes for VBO pointer adjustment
+ size += 16;
+ genIndices(size);
}
else
{
- mMappedIndexData = new U8[size];
- memset(mMappedIndexData, 0, size);
+ mMappedIndexData = (U8*)ALLOCATE_MEM(sPrivatePoolp, size);
static int gl_buffer_idx = 0;
mGLIndices = ++gl_buffer_idx;
+ mIndicesSize = size;
}
}
@@ -565,26 +1065,20 @@ void LLVertexBuffer::destroyGLBuffer()
LLMemType mt2(LLMemType::MTYPE_VERTEX_DESTROY_BUFFER);
if (mGLBuffer)
{
- if (useVBOs())
+ if (mMappedDataUsingVBOs)
{
- if (mMappedData || mMappedIndexData)
- {
- llerrs << "Vertex buffer destroyed while mapped!" << llendl;
- }
releaseBuffer();
}
else
{
- delete [] mMappedData;
+ FREE_MEM(sPrivatePoolp, (void*) mMappedData);
mMappedData = NULL;
- mEmpty = TRUE;
+ mEmpty = true;
}
-
- sAllocatedBytes -= getSize();
}
mGLBuffer = 0;
- unbind();
+ //unbind();
}
void LLVertexBuffer::destroyGLIndices()
@@ -592,26 +1086,20 @@ void LLVertexBuffer::destroyGLIndices()
LLMemType mt2(LLMemType::MTYPE_VERTEX_DESTROY_INDICES);
if (mGLIndices)
{
- if (useVBOs())
+ if (mMappedIndexDataUsingVBOs)
{
- if (mMappedData || mMappedIndexData)
- {
- llerrs << "Vertex buffer destroyed while mapped." << llendl;
- }
releaseIndices();
}
else
{
- delete [] mMappedIndexData;
+ FREE_MEM(sPrivatePoolp, (void*) mMappedIndexData);
mMappedIndexData = NULL;
- mEmpty = TRUE;
+ mEmpty = true;
}
-
- sAllocatedBytes -= getIndicesSize();
}
mGLIndices = 0;
- unbind();
+ //unbind();
}
void LLVertexBuffer::updateNumVerts(S32 nverts)
@@ -626,23 +1114,14 @@ void LLVertexBuffer::updateNumVerts(S32 nverts)
nverts = 65535;
}
- mRequestedNumVerts = nverts;
-
- if (!mDynamicSize)
- {
- mNumVerts = nverts;
- }
- else if (mUsage == GL_STATIC_DRAW_ARB ||
- nverts > mNumVerts ||
- nverts < mNumVerts/2)
+ U32 needed_size = calcOffsets(mTypeMask, mOffsets, nverts);
+
+ if (needed_size > mSize || needed_size <= mSize/2)
{
- if (mUsage != GL_STATIC_DRAW_ARB && nverts + nverts/4 <= 65535)
- {
- nverts += nverts/4;
- }
- mNumVerts = nverts;
+ createGLBuffer(needed_size);
}
+ mNumVerts = nverts;
}
void LLVertexBuffer::updateNumIndices(S32 nindices)
@@ -651,42 +1130,163 @@ void LLVertexBuffer::updateNumIndices(S32 nindices)
llassert(nindices >= 0);
- mRequestedNumIndices = nindices;
- if (!mDynamicSize)
+ U32 needed_size = sizeof(U16) * nindices;
+
+ if (needed_size > mIndicesSize || needed_size <= mIndicesSize/2)
{
- mNumIndices = nindices;
+ createGLIndices(needed_size);
}
- else if (mUsage == GL_STATIC_DRAW_ARB ||
- nindices > mNumIndices ||
- nindices < mNumIndices/2)
- {
- if (mUsage != GL_STATIC_DRAW_ARB)
- {
- nindices += nindices/4;
- }
- mNumIndices = nindices;
- }
+ mNumIndices = nindices;
}
void LLVertexBuffer::allocateBuffer(S32 nverts, S32 nindices, bool create)
{
LLMemType mt2(LLMemType::MTYPE_VERTEX_ALLOCATE_BUFFER);
-
+
+ stop_glerror();
+
+ if (nverts < 0 || nindices < 0 ||
+ nverts > 65536)
+ {
+ llerrs << "Bad vertex buffer allocation: " << nverts << " : " << nindices << llendl;
+ }
+
updateNumVerts(nverts);
updateNumIndices(nindices);
- if (mMappedData)
+ if (create && (nverts || nindices))
{
- llerrs << "LLVertexBuffer::allocateBuffer() called redundantly." << llendl;
+ //actually allocate space for the vertex buffer if using VBO mapping
+ flush();
+
+ if (gGLManager.mHasVertexArrayObject && useVBOs() && (LLRender::sGLCoreProfile || sUseVAO))
+ {
+#if GL_ARB_vertex_array_object
+ glGenVertexArrays(1, &mGLArray);
+#endif
+ setupVertexArray();
+ }
}
- if (create && (nverts || nindices))
+}
+
+static LLFastTimer::DeclareTimer FTM_SETUP_VERTEX_ARRAY("Setup VAO");
+
+void LLVertexBuffer::setupVertexArray()
+{
+ if (!mGLArray)
{
- createGLBuffer();
- createGLIndices();
+ return;
}
-
- sAllocatedBytes += getSize() + getIndicesSize();
+
+ LLFastTimer t(FTM_SETUP_VERTEX_ARRAY);
+#if GL_ARB_vertex_array_object
+ glBindVertexArray(mGLArray);
+#endif
+ sGLRenderArray = mGLArray;
+
+ U32 attrib_size[] =
+ {
+ 3, //TYPE_VERTEX,
+ 3, //TYPE_NORMAL,
+ 2, //TYPE_TEXCOORD0,
+ 2, //TYPE_TEXCOORD1,
+ 2, //TYPE_TEXCOORD2,
+ 2, //TYPE_TEXCOORD3,
+ 4, //TYPE_COLOR,
+ 4, //TYPE_EMISSIVE,
+ 3, //TYPE_BINORMAL,
+ 1, //TYPE_WEIGHT,
+ 4, //TYPE_WEIGHT4,
+ 4, //TYPE_CLOTHWEIGHT,
+ 4, //TYPE_TEXTURE_INDEX
+ };
+
+ U32 attrib_type[] =
+ {
+ GL_FLOAT, //TYPE_VERTEX,
+ GL_FLOAT, //TYPE_NORMAL,
+ GL_FLOAT, //TYPE_TEXCOORD0,
+ GL_FLOAT, //TYPE_TEXCOORD1,
+ GL_FLOAT, //TYPE_TEXCOORD2,
+ GL_FLOAT, //TYPE_TEXCOORD3,
+ GL_UNSIGNED_BYTE, //TYPE_COLOR,
+ GL_UNSIGNED_BYTE, //TYPE_EMISSIVE,
+ GL_FLOAT, //TYPE_BINORMAL,
+ GL_FLOAT, //TYPE_WEIGHT,
+ GL_FLOAT, //TYPE_WEIGHT4,
+ GL_FLOAT, //TYPE_CLOTHWEIGHT,
+ GL_UNSIGNED_BYTE, //TYPE_TEXTURE_INDEX
+ };
+
+ bool attrib_integer[] =
+ {
+ false, //TYPE_VERTEX,
+ false, //TYPE_NORMAL,
+ false, //TYPE_TEXCOORD0,
+ false, //TYPE_TEXCOORD1,
+ false, //TYPE_TEXCOORD2,
+ false, //TYPE_TEXCOORD3,
+ false, //TYPE_COLOR,
+ false, //TYPE_EMISSIVE,
+ false, //TYPE_BINORMAL,
+ false, //TYPE_WEIGHT,
+ false, //TYPE_WEIGHT4,
+ false, //TYPE_CLOTHWEIGHT,
+ true, //TYPE_TEXTURE_INDEX
+ };
+
+ U32 attrib_normalized[] =
+ {
+ GL_FALSE, //TYPE_VERTEX,
+ GL_FALSE, //TYPE_NORMAL,
+ GL_FALSE, //TYPE_TEXCOORD0,
+ GL_FALSE, //TYPE_TEXCOORD1,
+ GL_FALSE, //TYPE_TEXCOORD2,
+ GL_FALSE, //TYPE_TEXCOORD3,
+ GL_TRUE, //TYPE_COLOR,
+ GL_TRUE, //TYPE_EMISSIVE,
+ GL_FALSE, //TYPE_BINORMAL,
+ GL_FALSE, //TYPE_WEIGHT,
+ GL_FALSE, //TYPE_WEIGHT4,
+ GL_FALSE, //TYPE_CLOTHWEIGHT,
+ GL_FALSE, //TYPE_TEXTURE_INDEX
+ };
+
+ bindGLBuffer(true);
+ bindGLIndices(true);
+
+ for (U32 i = 0; i < TYPE_MAX; ++i)
+ {
+ if (mTypeMask & (1 << i))
+ {
+ glEnableVertexAttribArrayARB(i);
+
+ if (attrib_integer[i])
+ {
+#if !LL_DARWIN
+ //glVertexattribIPointer requires GLSL 1.30 or later
+ if (gGLManager.mGLSLVersionMajor > 1 || gGLManager.mGLSLVersionMinor >= 30)
+ {
+ glVertexAttribIPointer(i, attrib_size[i], attrib_type[i], sTypeSize[i], (void*) mOffsets[i]);
+ }
+#endif
+ }
+ else
+ {
+ glVertexAttribPointerARB(i, attrib_size[i], attrib_type[i], attrib_normalized[i], sTypeSize[i], (void*) mOffsets[i]);
+ }
+ }
+ else
+ {
+ glDisableVertexAttribArrayARB(i);
+ }
+ }
+
+ //draw a dummy triangle to set index array pointer
+ //glDrawElements(GL_TRIANGLES, 0, GL_UNSIGNED_SHORT, NULL);
+
+ unbind();
}
void LLVertexBuffer::resizeBuffer(S32 newnverts, S32 newnindices)
@@ -694,249 +1294,553 @@ void LLVertexBuffer::resizeBuffer(S32 newnverts, S32 newnindices)
llassert(newnverts >= 0);
llassert(newnindices >= 0);
- mRequestedNumVerts = newnverts;
- mRequestedNumIndices = newnindices;
-
LLMemType mt2(LLMemType::MTYPE_VERTEX_RESIZE_BUFFER);
- mDynamicSize = TRUE;
- if (mUsage == GL_STATIC_DRAW_ARB)
- { //always delete/allocate static buffers on resize
- destroyGLBuffer();
- destroyGLIndices();
- allocateBuffer(newnverts, newnindices, TRUE);
- mFinal = FALSE;
- }
- else if (newnverts > mNumVerts || newnindices > mNumIndices ||
- newnverts < mNumVerts/2 || newnindices < mNumIndices/2)
+
+ updateNumVerts(newnverts);
+ updateNumIndices(newnindices);
+
+ if (useVBOs())
{
- sAllocatedBytes -= getSize() + getIndicesSize();
-
- S32 oldsize = getSize();
- S32 old_index_size = getIndicesSize();
+ flush();
- updateNumVerts(newnverts);
- updateNumIndices(newnindices);
-
- S32 newsize = getSize();
- S32 new_index_size = getIndicesSize();
+ if (mGLArray)
+ { //if size changed, offsets changed
+ setupVertexArray();
+ }
+ }
+}
- sAllocatedBytes += newsize + new_index_size;
+bool LLVertexBuffer::useVBOs() const
+{
+ //it's generally ineffective to use VBO for things that are streaming on apple
+ return (mUsage != 0);
+}
- if (newsize)
+//----------------------------------------------------------------------------
+
+bool expand_region(LLVertexBuffer::MappedRegion& region, S32 index, S32 count)
+{
+ S32 end = index+count;
+ S32 region_end = region.mIndex+region.mCount;
+
+ if (end < region.mIndex ||
+ index > region_end)
+ { //gap exists, do not merge
+ return false;
+ }
+
+ S32 new_end = llmax(end, region_end);
+ S32 new_index = llmin(index, region.mIndex);
+ region.mIndex = new_index;
+ region.mCount = new_end-new_index;
+ return true;
+}
+
+static LLFastTimer::DeclareTimer FTM_VBO_MAP_BUFFER_RANGE("VBO Map Range");
+static LLFastTimer::DeclareTimer FTM_VBO_MAP_BUFFER("VBO Map");
+
+// Map for data access
+volatile U8* LLVertexBuffer::mapVertexBuffer(S32 type, S32 index, S32 count, bool map_range)
+{
+ bindGLBuffer(true);
+ LLMemType mt2(LLMemType::MTYPE_VERTEX_MAP_BUFFER);
+ if (mFinal)
+ {
+ llerrs << "LLVertexBuffer::mapVeretxBuffer() called on a finalized buffer." << llendl;
+ }
+ if (!useVBOs() && !mMappedData && !mMappedIndexData)
+ {
+ llerrs << "LLVertexBuffer::mapVertexBuffer() called on unallocated buffer." << llendl;
+ }
+
+ if (useVBOs())
+ {
+ if (!mMappable || gGLManager.mHasMapBufferRange || gGLManager.mHasFlushBufferRange)
{
- if (!mGLBuffer)
- { //no buffer exists, create a new one
- createGLBuffer();
+ if (count == -1)
+ {
+ count = mNumVerts-index;
}
- else
+
+ bool mapped = false;
+ //see if range is already mapped
+ for (U32 i = 0; i < mMappedVertexRegions.size(); ++i)
{
- //delete old buffer, keep GL buffer for now
- if (!useVBOs())
+ MappedRegion& region = mMappedVertexRegions[i];
+ if (region.mType == type)
{
- U8* old = mMappedData;
- mMappedData = new U8[newsize];
- if (old)
- {
- memcpy(mMappedData, old, llmin(newsize, oldsize));
- if (newsize > oldsize)
- {
- memset(mMappedData+oldsize, 0, newsize-oldsize);
- }
-
- delete [] old;
- }
- else
+ if (expand_region(region, index, count))
{
- memset(mMappedData, 0, newsize);
- mEmpty = TRUE;
+ mapped = true;
+ break;
}
}
- mResized = TRUE;
+ }
+
+ if (!mapped)
+ {
+ //not already mapped, map new region
+ MappedRegion region(type, mMappable && map_range ? -1 : index, count);
+ mMappedVertexRegions.push_back(region);
}
}
- else if (mGLBuffer)
+
+ if (mVertexLocked && map_range)
{
- destroyGLBuffer();
+ llerrs << "Attempted to map a specific range of a buffer that was already mapped." << llendl;
}
-
- if (new_index_size)
+
+ if (!mVertexLocked)
{
- if (!mGLIndices)
+ LLMemType mt_v(LLMemType::MTYPE_VERTEX_MAP_BUFFER_VERTICES);
+ mVertexLocked = true;
+ sMappedCount++;
+ stop_glerror();
+
+ if(!mMappable)
{
- createGLIndices();
+ map_range = false;
}
else
{
- if (!useVBOs())
+ volatile U8* src = NULL;
+ waitFence();
+ if (gGLManager.mHasMapBufferRange)
{
- //delete old buffer, keep GL buffer for now
- U8* old = mMappedIndexData;
- mMappedIndexData = new U8[new_index_size];
-
- if (old)
- {
- memcpy(mMappedIndexData, old, llmin(new_index_size, old_index_size));
- if (new_index_size > old_index_size)
+ if (map_range)
+ {
+#ifdef GL_ARB_map_buffer_range
+ LLFastTimer t(FTM_VBO_MAP_BUFFER_RANGE);
+ S32 offset = mOffsets[type] + sTypeSize[type]*index;
+ S32 length = (sTypeSize[type]*count+0xF) & ~0xF;
+ src = (U8*) glMapBufferRange(GL_ARRAY_BUFFER_ARB, offset, length,
+ GL_MAP_WRITE_BIT |
+ GL_MAP_FLUSH_EXPLICIT_BIT |
+ GL_MAP_INVALIDATE_RANGE_BIT);
+#endif
+ }
+ else
+ {
+#ifdef GL_ARB_map_buffer_range
+
+ if (gDebugGL)
{
- memset(mMappedIndexData+old_index_size, 0, new_index_size - old_index_size);
+ GLint size = 0;
+ glGetBufferParameterivARB(GL_ARRAY_BUFFER_ARB, GL_BUFFER_SIZE_ARB, &size);
+
+ if (size < mSize)
+ {
+ llerrs << "Invalid buffer size." << llendl;
+ }
}
- delete [] old;
+
+ LLFastTimer t(FTM_VBO_MAP_BUFFER);
+ src = (U8*) glMapBufferRange(GL_ARRAY_BUFFER_ARB, 0, mSize,
+ GL_MAP_WRITE_BIT |
+ GL_MAP_FLUSH_EXPLICIT_BIT);
+#endif
+ }
+ }
+ else if (gGLManager.mHasFlushBufferRange)
+ {
+ if (map_range)
+ {
+ glBufferParameteriAPPLE(GL_ARRAY_BUFFER_ARB, GL_BUFFER_SERIALIZED_MODIFY_APPLE, GL_FALSE);
+ glBufferParameteriAPPLE(GL_ARRAY_BUFFER_ARB, GL_BUFFER_FLUSHING_UNMAP_APPLE, GL_FALSE);
+ src = (U8*) glMapBufferARB(GL_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB);
}
else
{
- memset(mMappedIndexData, 0, new_index_size);
- mEmpty = TRUE;
+ src = (U8*) glMapBufferARB(GL_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB);
}
}
- mResized = TRUE;
+ else
+ {
+ map_range = false;
+ src = (U8*) glMapBufferARB(GL_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB);
+ }
+
+ llassert(src != NULL);
+
+ mMappedData = LL_NEXT_ALIGNED_ADDRESS<volatile U8>(src);
+ mAlignedOffset = mMappedData - src;
+
+ stop_glerror();
+ }
+
+ if (!mMappedData)
+ {
+ log_glerror();
+
+ //check the availability of memory
+ LLMemory::logMemoryInfo(true);
+
+ if(mMappable)
+ {
+ //--------------------
+ //print out more debug info before crash
+ llinfos << "vertex buffer size: (num verts : num indices) = " << getNumVerts() << " : " << getNumIndices() << llendl;
+ GLint size;
+ glGetBufferParameterivARB(GL_ARRAY_BUFFER_ARB, GL_BUFFER_SIZE_ARB, &size);
+ llinfos << "GL_ARRAY_BUFFER_ARB size is " << size << llendl;
+ //--------------------
+
+ GLint buff;
+ glGetIntegerv(GL_ARRAY_BUFFER_BINDING_ARB, &buff);
+ if ((GLuint)buff != mGLBuffer)
+ {
+ llerrs << "Invalid GL vertex buffer bound: " << buff << llendl;
+ }
+
+
+ llerrs << "glMapBuffer returned NULL (no vertex data)" << llendl;
+ }
+ else
+ {
+ llerrs << "memory allocation for vertex data failed." << llendl;
+ }
}
- }
- else if (mGLIndices)
- {
- destroyGLIndices();
}
}
-
- if (mResized && useVBOs())
+ else
{
- setBuffer(0);
+ map_range = false;
}
-}
-
-BOOL LLVertexBuffer::useVBOs() const
-{
- //it's generally ineffective to use VBO for things that are streaming on apple
-
-#if LL_DARWIN
- if (!mUsage || mUsage == GL_STREAM_DRAW_ARB)
+
+ if (map_range && gGLManager.mHasMapBufferRange && mMappable)
{
- return FALSE;
+ return mMappedData;
}
-#else
- if (!mUsage)
+ else
{
- return FALSE;
+ return mMappedData+mOffsets[type]+sTypeSize[type]*index;
}
-#endif
- return TRUE;
}
-//----------------------------------------------------------------------------
-// Map for data access
-U8* LLVertexBuffer::mapBuffer(S32 access)
+static LLFastTimer::DeclareTimer FTM_VBO_MAP_INDEX_RANGE("IBO Map Range");
+static LLFastTimer::DeclareTimer FTM_VBO_MAP_INDEX("IBO Map");
+
+volatile U8* LLVertexBuffer::mapIndexBuffer(S32 index, S32 count, bool map_range)
{
LLMemType mt2(LLMemType::MTYPE_VERTEX_MAP_BUFFER);
+ bindGLIndices(true);
if (mFinal)
{
- llerrs << "LLVertexBuffer::mapBuffer() called on a finalized buffer." << llendl;
+ llerrs << "LLVertexBuffer::mapIndexBuffer() called on a finalized buffer." << llendl;
}
if (!useVBOs() && !mMappedData && !mMappedIndexData)
{
- llerrs << "LLVertexBuffer::mapBuffer() called on unallocated buffer." << llendl;
+ llerrs << "LLVertexBuffer::mapIndexBuffer() called on unallocated buffer." << llendl;
}
-
- if (!mLocked && useVBOs())
+
+ if (useVBOs())
{
+ if (!mMappable || gGLManager.mHasMapBufferRange || gGLManager.mHasFlushBufferRange)
{
- LLMemType mt_v(LLMemType::MTYPE_VERTEX_MAP_BUFFER_VERTICES);
- setBuffer(0);
- mLocked = TRUE;
- stop_glerror();
- mMappedData = (U8*) glMapBufferARB(GL_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB);
- stop_glerror();
+ if (count == -1)
+ {
+ count = mNumIndices-index;
+ }
+
+ bool mapped = false;
+ //see if range is already mapped
+ for (U32 i = 0; i < mMappedIndexRegions.size(); ++i)
+ {
+ MappedRegion& region = mMappedIndexRegions[i];
+ if (expand_region(region, index, count))
+ {
+ mapped = true;
+ break;
+ }
+ }
+
+ if (!mapped)
+ {
+ //not already mapped, map new region
+ MappedRegion region(TYPE_INDEX, mMappable && map_range ? -1 : index, count);
+ mMappedIndexRegions.push_back(region);
+ }
}
+
+ if (mIndexLocked && map_range)
{
- LLMemType mt_v(LLMemType::MTYPE_VERTEX_MAP_BUFFER_INDICES);
- mMappedIndexData = (U8*) glMapBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB);
- stop_glerror();
+ llerrs << "Attempted to map a specific range of a buffer that was already mapped." << llendl;
}
- if (!mMappedData)
+ if (!mIndexLocked)
{
- log_glerror();
+ LLMemType mt_v(LLMemType::MTYPE_VERTEX_MAP_BUFFER_INDICES);
- //check the availability of memory
- U32 avail_phy_mem, avail_vir_mem;
- LLMemoryInfo::getAvailableMemoryKB(avail_phy_mem, avail_vir_mem) ;
- llinfos << "Available physical mwmory(KB): " << avail_phy_mem << llendl ;
- llinfos << "Available virtual memory(KB): " << avail_vir_mem << llendl;
+ mIndexLocked = true;
+ sMappedCount++;
+ stop_glerror();
- //--------------------
- //print out more debug info before crash
- llinfos << "vertex buffer size: (num verts : num indices) = " << getNumVerts() << " : " << getNumIndices() << llendl ;
- GLint size ;
- glGetBufferParameterivARB(GL_ARRAY_BUFFER_ARB, GL_BUFFER_SIZE_ARB, &size) ;
- llinfos << "GL_ARRAY_BUFFER_ARB size is " << size << llendl ;
- //--------------------
+ if (gDebugGL && useVBOs())
+ {
+ GLint elem = 0;
+ glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB, &elem);
- GLint buff;
- glGetIntegerv(GL_ARRAY_BUFFER_BINDING_ARB, &buff);
- if ((GLuint)buff != mGLBuffer)
+ if (elem != mGLIndices)
+ {
+ llerrs << "Wrong index buffer bound!" << llendl;
+ }
+ }
+
+ if(!mMappable)
{
- llerrs << "Invalid GL vertex buffer bound: " << buff << llendl;
+ map_range = false;
}
+ else
+ {
+ volatile U8* src = NULL;
+ waitFence();
+ if (gGLManager.mHasMapBufferRange)
+ {
+ if (map_range)
+ {
+#ifdef GL_ARB_map_buffer_range
+ LLFastTimer t(FTM_VBO_MAP_INDEX_RANGE);
+ S32 offset = sizeof(U16)*index;
+ S32 length = sizeof(U16)*count;
+ src = (U8*) glMapBufferRange(GL_ELEMENT_ARRAY_BUFFER_ARB, offset, length,
+ GL_MAP_WRITE_BIT |
+ GL_MAP_FLUSH_EXPLICIT_BIT |
+ GL_MAP_INVALIDATE_RANGE_BIT);
+#endif
+ }
+ else
+ {
+#ifdef GL_ARB_map_buffer_range
+ LLFastTimer t(FTM_VBO_MAP_INDEX);
+ src = (U8*) glMapBufferRange(GL_ELEMENT_ARRAY_BUFFER_ARB, 0, sizeof(U16)*mNumIndices,
+ GL_MAP_WRITE_BIT |
+ GL_MAP_FLUSH_EXPLICIT_BIT);
+#endif
+ }
+ }
+ else if (gGLManager.mHasFlushBufferRange)
+ {
+ if (map_range)
+ {
+ glBufferParameteriAPPLE(GL_ELEMENT_ARRAY_BUFFER_ARB, GL_BUFFER_SERIALIZED_MODIFY_APPLE, GL_FALSE);
+ glBufferParameteriAPPLE(GL_ELEMENT_ARRAY_BUFFER_ARB, GL_BUFFER_FLUSHING_UNMAP_APPLE, GL_FALSE);
+ src = (U8*) glMapBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB);
+ }
+ else
+ {
+ src = (U8*) glMapBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB);
+ }
+ }
+ else
+ {
+ LLFastTimer t(FTM_VBO_MAP_INDEX);
+ map_range = false;
+ src = (U8*) glMapBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB);
+ }
-
- llerrs << "glMapBuffer returned NULL (no vertex data)" << llendl;
+ llassert(src != NULL);
+
+
+ mMappedIndexData = src; //LL_NEXT_ALIGNED_ADDRESS<U8>(src);
+ mAlignedIndexOffset = mMappedIndexData - src;
+ stop_glerror();
+ }
}
if (!mMappedIndexData)
{
log_glerror();
+ LLMemory::logMemoryInfo(true);
- GLint buff;
- glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB, &buff);
- if ((GLuint)buff != mGLIndices)
+ if(mMappable)
{
- llerrs << "Invalid GL index buffer bound: " << buff << llendl;
- }
+ GLint buff;
+ glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB, &buff);
+ if ((GLuint)buff != mGLIndices)
+ {
+ llerrs << "Invalid GL index buffer bound: " << buff << llendl;
+ }
- llerrs << "glMapBuffer returned NULL (no index data)" << llendl;
+ llerrs << "glMapBuffer returned NULL (no index data)" << llendl;
+ }
+ else
+ {
+ llerrs << "memory allocation for Index data failed. " << llendl;
+ }
}
+ }
+ else
+ {
+ map_range = false;
+ }
- sMappedCount++;
+ if (map_range && gGLManager.mHasMapBufferRange && mMappable)
+ {
+ return mMappedIndexData;
+ }
+ else
+ {
+ return mMappedIndexData + sizeof(U16)*index;
}
-
- return mMappedData;
}
+static LLFastTimer::DeclareTimer FTM_VBO_UNMAP("VBO Unmap");
+static LLFastTimer::DeclareTimer FTM_VBO_FLUSH_RANGE("Flush VBO Range");
+
+
+static LLFastTimer::DeclareTimer FTM_IBO_UNMAP("IBO Unmap");
+static LLFastTimer::DeclareTimer FTM_IBO_FLUSH_RANGE("Flush IBO Range");
+
void LLVertexBuffer::unmapBuffer()
{
LLMemType mt2(LLMemType::MTYPE_VERTEX_UNMAP_BUFFER);
- if (mMappedData || mMappedIndexData)
+ if (!useVBOs())
{
- if (useVBOs() && mLocked)
+ return; //nothing to unmap
+ }
+
+ bool updated_all = false;
+
+ if (mMappedData && mVertexLocked)
+ {
+ LLFastTimer t(FTM_VBO_UNMAP);
+ bindGLBuffer(true);
+ updated_all = mIndexLocked; //both vertex and index buffers done updating
+
+ if(!mMappable)
{
+ if (!mMappedVertexRegions.empty())
+ {
+ stop_glerror();
+ for (U32 i = 0; i < mMappedVertexRegions.size(); ++i)
+ {
+ const MappedRegion& region = mMappedVertexRegions[i];
+ S32 offset = region.mIndex >= 0 ? mOffsets[region.mType]+sTypeSize[region.mType]*region.mIndex : 0;
+ S32 length = sTypeSize[region.mType]*region.mCount;
+ glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, offset, length, (U8*) mMappedData+offset);
+ stop_glerror();
+ }
+
+ mMappedVertexRegions.clear();
+ }
+ else
+ {
+ stop_glerror();
+ glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, getSize(), (U8*) mMappedData);
+ stop_glerror();
+ }
+ }
+ else
+ {
+ if (gGLManager.mHasMapBufferRange || gGLManager.mHasFlushBufferRange)
+ {
+ if (!mMappedVertexRegions.empty())
+ {
+ stop_glerror();
+ for (U32 i = 0; i < mMappedVertexRegions.size(); ++i)
+ {
+ const MappedRegion& region = mMappedVertexRegions[i];
+ S32 offset = region.mIndex >= 0 ? mOffsets[region.mType]+sTypeSize[region.mType]*region.mIndex : 0;
+ S32 length = sTypeSize[region.mType]*region.mCount;
+ if (gGLManager.mHasMapBufferRange)
+ {
+ LLFastTimer t(FTM_VBO_FLUSH_RANGE);
+#ifdef GL_ARB_map_buffer_range
+ glFlushMappedBufferRange(GL_ARRAY_BUFFER_ARB, offset, length);
+#endif
+ }
+ else if (gGLManager.mHasFlushBufferRange)
+ {
+ glFlushMappedBufferRangeAPPLE(GL_ARRAY_BUFFER_ARB, offset, length);
+ }
+ stop_glerror();
+ }
+
+ mMappedVertexRegions.clear();
+ }
+ }
stop_glerror();
glUnmapBufferARB(GL_ARRAY_BUFFER_ARB);
stop_glerror();
- glUnmapBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB);
- stop_glerror();
- /*if (!sMapped)
+ mMappedData = NULL;
+ }
+
+ mVertexLocked = false;
+ sMappedCount--;
+ }
+
+ if (mMappedIndexData && mIndexLocked)
+ {
+ LLFastTimer t(FTM_IBO_UNMAP);
+ bindGLIndices();
+ if(!mMappable)
+ {
+ if (!mMappedIndexRegions.empty())
{
- llerrs << "Redundantly unmapped VBO!" << llendl;
- }
- sMapped = FALSE;*/
- sMappedCount--;
-
- if (mUsage == GL_STATIC_DRAW_ARB)
- { //static draw buffers can only be mapped a single time
- //throw out client data (we won't be using it again)
- mEmpty = TRUE;
- mFinal = TRUE;
+ for (U32 i = 0; i < mMappedIndexRegions.size(); ++i)
+ {
+ const MappedRegion& region = mMappedIndexRegions[i];
+ S32 offset = region.mIndex >= 0 ? sizeof(U16)*region.mIndex : 0;
+ S32 length = sizeof(U16)*region.mCount;
+ glBufferSubDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, offset, length, (U8*) mMappedIndexData+offset);
+ stop_glerror();
+ }
+
+ mMappedIndexRegions.clear();
}
else
{
- mEmpty = FALSE;
+ stop_glerror();
+ glBufferSubDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0, getIndicesSize(), (U8*) mMappedIndexData);
+ stop_glerror();
}
+ }
+ else
+ {
+ if (gGLManager.mHasMapBufferRange || gGLManager.mHasFlushBufferRange)
+ {
+ if (!mMappedIndexRegions.empty())
+ {
+ for (U32 i = 0; i < mMappedIndexRegions.size(); ++i)
+ {
+ const MappedRegion& region = mMappedIndexRegions[i];
+ S32 offset = region.mIndex >= 0 ? sizeof(U16)*region.mIndex : 0;
+ S32 length = sizeof(U16)*region.mCount;
+ if (gGLManager.mHasMapBufferRange)
+ {
+ LLFastTimer t(FTM_IBO_FLUSH_RANGE);
+#ifdef GL_ARB_map_buffer_range
+ glFlushMappedBufferRange(GL_ELEMENT_ARRAY_BUFFER_ARB, offset, length);
+#endif
+ }
+ else if (gGLManager.mHasFlushBufferRange)
+ {
+#ifdef GL_APPLE_flush_buffer_range
+ glFlushMappedBufferRangeAPPLE(GL_ELEMENT_ARRAY_BUFFER_ARB, offset, length);
+#endif
+ }
+ stop_glerror();
+ }
+
+ mMappedIndexRegions.clear();
+ }
+ }
+ stop_glerror();
+ glUnmapBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB);
+ stop_glerror();
mMappedIndexData = NULL;
- mMappedData = NULL;
-
- mLocked = FALSE;
}
+
+ mIndexLocked = false;
+ sMappedCount--;
+ }
+
+ if(updated_all)
+ {
+ mEmpty = false;
}
}
@@ -947,140 +1851,241 @@ template <class T,S32 type> struct VertexBufferStrider
typedef LLStrider<T> strider_t;
static bool get(LLVertexBuffer& vbo,
strider_t& strider,
- S32 index)
+ S32 index, S32 count, bool map_range)
{
- if (vbo.mapBuffer() == NULL)
- {
- llwarns << "mapBuffer failed!" << llendl;
- return FALSE;
- }
-
if (type == LLVertexBuffer::TYPE_INDEX)
{
- S32 stride = sizeof(T);
- strider = (T*)(vbo.getMappedIndices() + index*stride);
+ volatile U8* ptr = vbo.mapIndexBuffer(index, count, map_range);
+
+ if (ptr == NULL)
+ {
+ llwarns << "mapIndexBuffer failed!" << llendl;
+ return false;
+ }
+
+ strider = (T*)ptr;
strider.setStride(0);
- return TRUE;
+ return true;
}
else if (vbo.hasDataType(type))
{
- S32 stride = vbo.getStride();
- strider = (T*)(vbo.getMappedData() + vbo.getOffset(type) + index*stride);
+ S32 stride = LLVertexBuffer::sTypeSize[type];
+
+ volatile U8* ptr = vbo.mapVertexBuffer(type, index, count, map_range);
+
+ if (ptr == NULL)
+ {
+ llwarns << "mapVertexBuffer failed!" << llendl;
+ return false;
+ }
+
+ strider = (T*)ptr;
strider.setStride(stride);
- return TRUE;
+ return true;
}
else
{
llerrs << "VertexBufferStrider could not find valid vertex data." << llendl;
}
- return FALSE;
+ return false;
}
};
-
-bool LLVertexBuffer::getVertexStrider(LLStrider<LLVector3>& strider, S32 index)
+bool LLVertexBuffer::getVertexStrider(LLStrider<LLVector3>& strider, S32 index, S32 count, bool map_range)
{
- return VertexBufferStrider<LLVector3,TYPE_VERTEX>::get(*this, strider, index);
+ return VertexBufferStrider<LLVector3,TYPE_VERTEX>::get(*this, strider, index, count, map_range);
}
-bool LLVertexBuffer::getIndexStrider(LLStrider<U16>& strider, S32 index)
+bool LLVertexBuffer::getVertexStrider(LLStrider<LLVector4a>& strider, S32 index, S32 count, bool map_range)
{
- return VertexBufferStrider<U16,TYPE_INDEX>::get(*this, strider, index);
+ return VertexBufferStrider<LLVector4a,TYPE_VERTEX>::get(*this, strider, index, count, map_range);
}
-bool LLVertexBuffer::getTexCoord0Strider(LLStrider<LLVector2>& strider, S32 index)
+bool LLVertexBuffer::getIndexStrider(LLStrider<U16>& strider, S32 index, S32 count, bool map_range)
{
- return VertexBufferStrider<LLVector2,TYPE_TEXCOORD0>::get(*this, strider, index);
+ return VertexBufferStrider<U16,TYPE_INDEX>::get(*this, strider, index, count, map_range);
}
-bool LLVertexBuffer::getTexCoord1Strider(LLStrider<LLVector2>& strider, S32 index)
+bool LLVertexBuffer::getTexCoord0Strider(LLStrider<LLVector2>& strider, S32 index, S32 count, bool map_range)
{
- return VertexBufferStrider<LLVector2,TYPE_TEXCOORD1>::get(*this, strider, index);
+ return VertexBufferStrider<LLVector2,TYPE_TEXCOORD0>::get(*this, strider, index, count, map_range);
}
-/*bool LLVertexBuffer::getTexCoord2Strider(LLStrider<LLVector2>& strider, S32 index)
+bool LLVertexBuffer::getTexCoord1Strider(LLStrider<LLVector2>& strider, S32 index, S32 count, bool map_range)
{
- return VertexBufferStrider<LLVector2,TYPE_TEXCOORD2>::get(*this, strider, index);
+ return VertexBufferStrider<LLVector2,TYPE_TEXCOORD1>::get(*this, strider, index, count, map_range);
}
-bool LLVertexBuffer::getTexCoord3Strider(LLStrider<LLVector2>& strider, S32 index)
+
+bool LLVertexBuffer::getNormalStrider(LLStrider<LLVector3>& strider, S32 index, S32 count, bool map_range)
{
- return VertexBufferStrider<LLVector2,TYPE_TEXCOORD3>::get(*this, strider, index);
-}*/
-bool LLVertexBuffer::getNormalStrider(LLStrider<LLVector3>& strider, S32 index)
+ return VertexBufferStrider<LLVector3,TYPE_NORMAL>::get(*this, strider, index, count, map_range);
+}
+bool LLVertexBuffer::getBinormalStrider(LLStrider<LLVector3>& strider, S32 index, S32 count, bool map_range)
{
- return VertexBufferStrider<LLVector3,TYPE_NORMAL>::get(*this, strider, index);
+ return VertexBufferStrider<LLVector3,TYPE_BINORMAL>::get(*this, strider, index, count, map_range);
}
-bool LLVertexBuffer::getBinormalStrider(LLStrider<LLVector3>& strider, S32 index)
+bool LLVertexBuffer::getColorStrider(LLStrider<LLColor4U>& strider, S32 index, S32 count, bool map_range)
{
- return VertexBufferStrider<LLVector3,TYPE_BINORMAL>::get(*this, strider, index);
+ return VertexBufferStrider<LLColor4U,TYPE_COLOR>::get(*this, strider, index, count, map_range);
}
-bool LLVertexBuffer::getColorStrider(LLStrider<LLColor4U>& strider, S32 index)
+bool LLVertexBuffer::getEmissiveStrider(LLStrider<LLColor4U>& strider, S32 index, S32 count, bool map_range)
{
- return VertexBufferStrider<LLColor4U,TYPE_COLOR>::get(*this, strider, index);
+ return VertexBufferStrider<LLColor4U,TYPE_EMISSIVE>::get(*this, strider, index, count, map_range);
}
-bool LLVertexBuffer::getWeightStrider(LLStrider<F32>& strider, S32 index)
+bool LLVertexBuffer::getWeightStrider(LLStrider<F32>& strider, S32 index, S32 count, bool map_range)
+{
+ return VertexBufferStrider<F32,TYPE_WEIGHT>::get(*this, strider, index, count, map_range);
+}
+
+bool LLVertexBuffer::getWeight4Strider(LLStrider<LLVector4>& strider, S32 index, S32 count, bool map_range)
{
- return VertexBufferStrider<F32,TYPE_WEIGHT>::get(*this, strider, index);
+ return VertexBufferStrider<LLVector4,TYPE_WEIGHT4>::get(*this, strider, index, count, map_range);
}
-bool LLVertexBuffer::getClothWeightStrider(LLStrider<LLVector4>& strider, S32 index)
+
+bool LLVertexBuffer::getClothWeightStrider(LLStrider<LLVector4>& strider, S32 index, S32 count, bool map_range)
{
- return VertexBufferStrider<LLVector4,TYPE_CLOTHWEIGHT>::get(*this, strider, index);
+ return VertexBufferStrider<LLVector4,TYPE_CLOTHWEIGHT>::get(*this, strider, index, count, map_range);
}
-void LLVertexBuffer::setStride(S32 type, S32 new_stride)
+//----------------------------------------------------------------------------
+
+static LLFastTimer::DeclareTimer FTM_BIND_GL_ARRAY("Bind Array");
+bool LLVertexBuffer::bindGLArray()
{
- LLMemType mt2(LLMemType::MTYPE_VERTEX_SET_STRIDE);
- if (mNumVerts)
+ if (mGLArray && sGLRenderArray != mGLArray)
{
- llerrs << "LLVertexBuffer::setOffset called with mNumVerts = " << mNumVerts << llendl;
+ {
+ LLFastTimer t(FTM_BIND_GL_ARRAY);
+#if GL_ARB_vertex_array_object
+ glBindVertexArray(mGLArray);
+#endif
+ sGLRenderArray = mGLArray;
+ }
+
+ //really shouldn't be necessary, but some drivers don't properly restore the
+ //state of GL_ELEMENT_ARRAY_BUFFER_BINDING
+ bindGLIndices();
+
+ return true;
}
- // This code assumes that setStride() will only be called once per VBO per type.
- S32 delta = new_stride - sTypeOffsets[type];
- for (S32 i=type+1; i<TYPE_MAX; i++)
+
+ return false;
+}
+
+static LLFastTimer::DeclareTimer FTM_BIND_GL_BUFFER("Bind Buffer");
+
+bool LLVertexBuffer::bindGLBuffer(bool force_bind)
+{
+ bindGLArray();
+
+ bool ret = false;
+
+ if (useVBOs() && (force_bind || (mGLBuffer && (mGLBuffer != sGLRenderBuffer || !sVBOActive))))
{
- if (mTypeMask & (1<<i))
+ LLFastTimer t(FTM_BIND_GL_BUFFER);
+ /*if (sMapped)
+ {
+ llerrs << "VBO bound while another VBO mapped!" << llendl;
+ }*/
+ glBindBufferARB(GL_ARRAY_BUFFER_ARB, mGLBuffer);
+ sGLRenderBuffer = mGLBuffer;
+ sBindCount++;
+ sVBOActive = true;
+
+ if (mGLArray)
{
- mOffsets[i] += delta;
+ llassert(sGLRenderArray == mGLArray);
+ //mCachedRenderBuffer = mGLBuffer;
}
+
+ ret = true;
}
- mStride += delta;
+
+ return ret;
}
-//----------------------------------------------------------------------------
+static LLFastTimer::DeclareTimer FTM_BIND_GL_INDICES("Bind Indices");
+
+bool LLVertexBuffer::bindGLIndices(bool force_bind)
+{
+ bindGLArray();
+
+ bool ret = false;
+ if (useVBOs() && (force_bind || (mGLIndices && (mGLIndices != sGLRenderIndices || !sIBOActive))))
+ {
+ LLFastTimer t(FTM_BIND_GL_INDICES);
+ /*if (sMapped)
+ {
+ llerrs << "VBO bound while another VBO mapped!" << llendl;
+ }*/
+ glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, mGLIndices);
+ sGLRenderIndices = mGLIndices;
+ stop_glerror();
+ sBindCount++;
+ sIBOActive = true;
+ ret = true;
+ }
+
+ return ret;
+}
+
+void LLVertexBuffer::flush()
+{
+ if (useVBOs())
+ {
+ unmapBuffer();
+ }
+}
// Set for rendering
void LLVertexBuffer::setBuffer(U32 data_mask)
{
+ flush();
+
LLMemType mt2(LLMemType::MTYPE_VERTEX_SET_BUFFER);
//set up pointers if the data mask is different ...
- BOOL setup = (sLastMask != data_mask);
+ bool setup = (sLastMask != data_mask);
+
+ if (gDebugGL && data_mask != 0)
+ { //make sure data requirements are fulfilled
+ LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr;
+ if (shader)
+ {
+ U32 required_mask = 0;
+ for (U32 i = 0; i < LLVertexBuffer::TYPE_TEXTURE_INDEX; ++i)
+ {
+ if (shader->getAttribLocation(i) > -1)
+ {
+ U32 required = 1 << i;
+ if ((data_mask & required) == 0)
+ {
+ llwarns << "Missing attribute: " << LLShaderMgr::instance()->mReservedAttribs[i] << llendl;
+ }
+
+ required_mask |= required;
+ }
+ }
+
+ if ((data_mask & required_mask) != required_mask)
+ {
+ llerrs << "Shader consumption mismatches data provision." << llendl;
+ }
+ }
+ }
if (useVBOs())
{
- if (mGLBuffer && (mGLBuffer != sGLRenderBuffer || !sVBOActive))
+ if (mGLArray)
{
- /*if (sMapped)
- {
- llerrs << "VBO bound while another VBO mapped!" << llendl;
- }*/
- stop_glerror();
- glBindBufferARB(GL_ARRAY_BUFFER_ARB, mGLBuffer);
- stop_glerror();
- sBindCount++;
- sVBOActive = TRUE;
- setup = TRUE; // ... or the bound buffer changed
+ bindGLArray();
+ setup = false; //do NOT perform pointer setup if using VAO
}
- if (mGLIndices && (mGLIndices != sGLRenderIndices || !sIBOActive))
+ else
{
- /*if (sMapped)
- {
- llerrs << "VBO bound while another VBO mapped!" << llendl;
- }*/
- stop_glerror();
- glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, mGLIndices);
- stop_glerror();
- sBindCount++;
- sIBOActive = TRUE;
+ const bool bindBuffer = bindGLBuffer();
+ const bool bindIndices = bindGLIndices();
+
+ setup = setup || bindBuffer || bindIndices;
}
-
- BOOL error = FALSE;
- if (gDebugGL)
+
+ bool error = false;
+ if (gDebugGL && !mGLArray)
{
GLint buff;
glGetIntegerv(GL_ARRAY_BUFFER_BINDING_ARB, &buff);
@@ -1088,7 +2093,7 @@ void LLVertexBuffer::setBuffer(U32 data_mask)
{
if (gDebugSession)
{
- error = TRUE;
+ error = true;
gFailLog << "Invalid GL vertex buffer bound: " << buff << std::endl;
}
else
@@ -1104,7 +2109,7 @@ void LLVertexBuffer::setBuffer(U32 data_mask)
{
if (gDebugSession)
{
- error = TRUE;
+ error = true;
gFailLog << "Invalid GL index buffer bound: " << buff << std::endl;
}
else
@@ -1115,116 +2120,55 @@ void LLVertexBuffer::setBuffer(U32 data_mask)
}
}
- if (mResized)
+
+ }
+ else
+ {
+ if (sGLRenderArray)
{
- if (gDebugGL)
- {
- GLint buff;
- glGetIntegerv(GL_ARRAY_BUFFER_BINDING_ARB, &buff);
- if ((GLuint)buff != mGLBuffer)
- {
- if (gDebugSession)
- {
- error = TRUE;
- gFailLog << "Invalid GL vertex buffer bound: " << std::endl;
- }
- else
- {
- llerrs << "Invalid GL vertex buffer bound: " << buff << llendl;
- }
- }
-
- if (mGLIndices != 0)
- {
- glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB, &buff);
- if ((GLuint)buff != mGLIndices)
- {
- if (gDebugSession)
- {
- error = TRUE;
- gFailLog << "Invalid GL index buffer bound: "<< std::endl;
- }
- else
- {
- llerrs << "Invalid GL index buffer bound: " << buff << llendl;
- }
- }
- }
- }
-
- if (mGLBuffer)
- {
- stop_glerror();
- glBufferDataARB(GL_ARRAY_BUFFER_ARB, getSize(), NULL, mUsage);
- stop_glerror();
- }
- if (mGLIndices)
- {
- stop_glerror();
- glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, getIndicesSize(), NULL, mUsage);
- stop_glerror();
- }
-
- mEmpty = TRUE;
- mResized = FALSE;
-
- if (data_mask != 0)
- {
- if (gDebugSession)
- {
- error = TRUE;
- gFailLog << "Buffer set for rendering before being filled after resize." << std::endl;
- }
- else
- {
- llerrs << "Buffer set for rendering before being filled after resize." << llendl;
- }
- }
+#if GL_ARB_vertex_array_object
+ glBindVertexArray(0);
+#endif
+ sGLRenderArray = 0;
+ sGLRenderIndices = 0;
+ sIBOActive = false;
}
- if (error)
- {
- ll_fail("LLVertexBuffer::mapBuffer failed");
- }
- unmapBuffer();
- }
- else
- {
if (mGLBuffer)
{
if (sVBOActive)
{
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
sBindCount++;
- sVBOActive = FALSE;
- setup = TRUE; // ... or a VBO is deactivated
+ sVBOActive = false;
+ setup = true; // ... or a VBO is deactivated
}
if (sGLRenderBuffer != mGLBuffer)
{
- setup = TRUE; // ... or a client memory pointer changed
+ sGLRenderBuffer = mGLBuffer;
+ setup = true; // ... or a client memory pointer changed
}
}
- if (mGLIndices && sIBOActive)
+ if (mGLIndices)
{
- /*if (sMapped)
+ if (sIBOActive)
{
- llerrs << "VBO unbound while potentially mapped!" << llendl;
- }*/
- glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);
- sBindCount++;
- sIBOActive = FALSE;
+ glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);
+ sBindCount++;
+ sIBOActive = false;
+ }
+
+ sGLRenderIndices = mGLIndices;
}
}
- setupClientArrays(data_mask);
-
- if (mGLIndices)
+ if (!mGLArray)
{
- sGLRenderIndices = mGLIndices;
+ setupClientArrays(data_mask);
}
+
if (mGLBuffer)
{
- sGLRenderBuffer = mGLBuffer;
if (data_mask && setup)
{
setupVertexBuffer(data_mask); // subclass specific setup (virtual function)
@@ -1234,76 +2178,153 @@ void LLVertexBuffer::setBuffer(U32 data_mask)
}
// virtual (default)
-void LLVertexBuffer::setupVertexBuffer(U32 data_mask) const
+void LLVertexBuffer::setupVertexBuffer(U32 data_mask)
{
LLMemType mt2(LLMemType::MTYPE_VERTEX_SETUP_VERTEX_BUFFER);
stop_glerror();
- U8* base = useVBOs() ? NULL : mMappedData;
- S32 stride = mStride;
+ volatile U8* base = useVBOs() ? (U8*) mAlignedOffset : mMappedData;
- if ((data_mask & mTypeMask) != data_mask)
+ /*if ((data_mask & mTypeMask) != data_mask)
{
llerrs << "LLVertexBuffer::setupVertexBuffer missing required components for supplied data mask." << llendl;
- }
+ }*/
- if (data_mask & MAP_NORMAL)
- {
- glNormalPointer(GL_FLOAT, stride, (void*)(base + mOffsets[TYPE_NORMAL]));
- }
- if (data_mask & MAP_TEXCOORD3)
- {
- glClientActiveTextureARB(GL_TEXTURE3_ARB);
- glTexCoordPointer(2,GL_FLOAT, stride, (void*)(base + mOffsets[TYPE_TEXCOORD3]));
- glClientActiveTextureARB(GL_TEXTURE0_ARB);
- }
- if (data_mask & MAP_TEXCOORD2)
- {
- glClientActiveTextureARB(GL_TEXTURE2_ARB);
- glTexCoordPointer(2,GL_FLOAT, stride, (void*)(base + mOffsets[TYPE_TEXCOORD2]));
- glClientActiveTextureARB(GL_TEXTURE0_ARB);
- }
- if (data_mask & MAP_TEXCOORD1)
+ if (LLGLSLShader::sNoFixedFunction)
{
- glClientActiveTextureARB(GL_TEXTURE1_ARB);
- glTexCoordPointer(2,GL_FLOAT, stride, (void*)(base + mOffsets[TYPE_TEXCOORD1]));
- glClientActiveTextureARB(GL_TEXTURE0_ARB);
- }
- if (data_mask & MAP_BINORMAL)
- {
- glClientActiveTextureARB(GL_TEXTURE2_ARB);
- glTexCoordPointer(3,GL_FLOAT, stride, (void*)(base + mOffsets[TYPE_BINORMAL]));
- glClientActiveTextureARB(GL_TEXTURE0_ARB);
- }
- if (data_mask & MAP_TEXCOORD0)
- {
- glTexCoordPointer(2,GL_FLOAT, stride, (void*)(base + mOffsets[TYPE_TEXCOORD0]));
- }
- if (data_mask & MAP_COLOR)
- {
- glColorPointer(4, GL_UNSIGNED_BYTE, stride, (void*)(base + mOffsets[TYPE_COLOR]));
- }
-
- if (data_mask & MAP_WEIGHT)
- {
- glVertexAttribPointerARB(1, 1, GL_FLOAT, FALSE, stride, (void*)(base + mOffsets[TYPE_WEIGHT]));
- }
- if (data_mask & MAP_CLOTHWEIGHT)
- {
- glVertexAttribPointerARB(4, 4, GL_FLOAT, TRUE, stride, (void*)(base + mOffsets[TYPE_CLOTHWEIGHT]));
- }
- if (data_mask & MAP_VERTEX)
+ if (data_mask & MAP_NORMAL)
+ {
+ S32 loc = TYPE_NORMAL;
+ void* ptr = (void*)(base + mOffsets[TYPE_NORMAL]);
+ glVertexAttribPointerARB(loc, 3, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_NORMAL], ptr);
+ }
+ if (data_mask & MAP_TEXCOORD3)
+ {
+ S32 loc = TYPE_TEXCOORD3;
+ void* ptr = (void*)(base + mOffsets[TYPE_TEXCOORD3]);
+ glVertexAttribPointerARB(loc,2,GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD3], ptr);
+ }
+ if (data_mask & MAP_TEXCOORD2)
+ {
+ S32 loc = TYPE_TEXCOORD2;
+ void* ptr = (void*)(base + mOffsets[TYPE_TEXCOORD2]);
+ glVertexAttribPointerARB(loc,2,GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD2], ptr);
+ }
+ if (data_mask & MAP_TEXCOORD1)
+ {
+ S32 loc = TYPE_TEXCOORD1;
+ void* ptr = (void*)(base + mOffsets[TYPE_TEXCOORD1]);
+ glVertexAttribPointerARB(loc,2,GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD1], ptr);
+ }
+ if (data_mask & MAP_BINORMAL)
+ {
+ S32 loc = TYPE_BINORMAL;
+ void* ptr = (void*)(base + mOffsets[TYPE_BINORMAL]);
+ glVertexAttribPointerARB(loc, 3,GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_BINORMAL], ptr);
+ }
+ if (data_mask & MAP_TEXCOORD0)
+ {
+ S32 loc = TYPE_TEXCOORD0;
+ void* ptr = (void*)(base + mOffsets[TYPE_TEXCOORD0]);
+ glVertexAttribPointerARB(loc,2,GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD0], ptr);
+ }
+ if (data_mask & MAP_COLOR)
+ {
+ S32 loc = TYPE_COLOR;
+ void* ptr = (void*)(base + mOffsets[TYPE_COLOR]);
+ glVertexAttribPointerARB(loc, 4, GL_UNSIGNED_BYTE, GL_TRUE, LLVertexBuffer::sTypeSize[TYPE_COLOR], ptr);
+ }
+ if (data_mask & MAP_EMISSIVE)
+ {
+ S32 loc = TYPE_EMISSIVE;
+ void* ptr = (void*)(base + mOffsets[TYPE_EMISSIVE]);
+ glVertexAttribPointerARB(loc, 4, GL_UNSIGNED_BYTE, GL_TRUE, LLVertexBuffer::sTypeSize[TYPE_EMISSIVE], ptr);
+ }
+ if (data_mask & MAP_WEIGHT)
+ {
+ S32 loc = TYPE_WEIGHT;
+ void* ptr = (void*)(base + mOffsets[TYPE_WEIGHT]);
+ glVertexAttribPointerARB(loc, 1, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_WEIGHT], ptr);
+ }
+ if (data_mask & MAP_WEIGHT4)
+ {
+ S32 loc = TYPE_WEIGHT4;
+ void* ptr = (void*)(base+mOffsets[TYPE_WEIGHT4]);
+ glVertexAttribPointerARB(loc, 4, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_WEIGHT4], ptr);
+ }
+ if (data_mask & MAP_CLOTHWEIGHT)
+ {
+ S32 loc = TYPE_CLOTHWEIGHT;
+ void* ptr = (void*)(base + mOffsets[TYPE_CLOTHWEIGHT]);
+ glVertexAttribPointerARB(loc, 4, GL_FLOAT, GL_TRUE, LLVertexBuffer::sTypeSize[TYPE_CLOTHWEIGHT], ptr);
+ }
+ if (data_mask & MAP_TEXTURE_INDEX &&
+ (gGLManager.mGLSLVersionMajor >= 2 || gGLManager.mGLSLVersionMinor >= 30)) //indexed texture rendering requires GLSL 1.30 or later
+ {
+#if !LL_DARWIN
+ S32 loc = TYPE_TEXTURE_INDEX;
+ void *ptr = (void*) (base + mOffsets[TYPE_VERTEX] + 12);
+ glVertexAttribIPointer(loc, 4, GL_UNSIGNED_BYTE, LLVertexBuffer::sTypeSize[TYPE_VERTEX], ptr);
+#endif
+ }
+ if (data_mask & MAP_VERTEX)
+ {
+ S32 loc = TYPE_VERTEX;
+ void* ptr = (void*)(base + mOffsets[TYPE_VERTEX]);
+ glVertexAttribPointerARB(loc, 3,GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_VERTEX], ptr);
+ }
+ }
+ else
{
- glVertexPointer(3,GL_FLOAT, stride, (void*)(base + 0));
+ if (data_mask & MAP_NORMAL)
+ {
+ glNormalPointer(GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_NORMAL], (void*)(base + mOffsets[TYPE_NORMAL]));
+ }
+ if (data_mask & MAP_TEXCOORD3)
+ {
+ glClientActiveTextureARB(GL_TEXTURE3_ARB);
+ glTexCoordPointer(2,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD3], (void*)(base + mOffsets[TYPE_TEXCOORD3]));
+ glClientActiveTextureARB(GL_TEXTURE0_ARB);
+ }
+ if (data_mask & MAP_TEXCOORD2)
+ {
+ glClientActiveTextureARB(GL_TEXTURE2_ARB);
+ glTexCoordPointer(2,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD2], (void*)(base + mOffsets[TYPE_TEXCOORD2]));
+ glClientActiveTextureARB(GL_TEXTURE0_ARB);
+ }
+ if (data_mask & MAP_TEXCOORD1)
+ {
+ glClientActiveTextureARB(GL_TEXTURE1_ARB);
+ glTexCoordPointer(2,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD1], (void*)(base + mOffsets[TYPE_TEXCOORD1]));
+ glClientActiveTextureARB(GL_TEXTURE0_ARB);
+ }
+ if (data_mask & MAP_BINORMAL)
+ {
+ glClientActiveTextureARB(GL_TEXTURE2_ARB);
+ glTexCoordPointer(3,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_BINORMAL], (void*)(base + mOffsets[TYPE_BINORMAL]));
+ glClientActiveTextureARB(GL_TEXTURE0_ARB);
+ }
+ if (data_mask & MAP_TEXCOORD0)
+ {
+ glTexCoordPointer(2,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD0], (void*)(base + mOffsets[TYPE_TEXCOORD0]));
+ }
+ if (data_mask & MAP_COLOR)
+ {
+ glColorPointer(4, GL_UNSIGNED_BYTE, LLVertexBuffer::sTypeSize[TYPE_COLOR], (void*)(base + mOffsets[TYPE_COLOR]));
+ }
+ if (data_mask & MAP_VERTEX)
+ {
+ glVertexPointer(3,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_VERTEX], (void*)(base + 0));
+ }
}
llglassertok();
}
-void LLVertexBuffer::markDirty(U32 vert_index, U32 vert_count, U32 indices_index, U32 indices_count)
-{
- // TODO: use GL_APPLE_flush_buffer_range here
- /*if (useVBOs() && !mFilthy)
- {
-
- }*/
-}
+LLVertexBuffer::MappedRegion::MappedRegion(S32 type, S32 index, S32 count)
+: mType(type), mIndex(index), mCount(count)
+{
+ llassert(mType == LLVertexBuffer::TYPE_INDEX ||
+ mType < LLVertexBuffer::TYPE_TEXTURE_INDEX);
+}
+
+
diff --git a/indra/llrender/llvertexbuffer.h b/indra/llrender/llvertexbuffer.h
index 94fa790957..d859199663 100644
--- a/indra/llrender/llvertexbuffer.h
+++ b/indra/llrender/llvertexbuffer.h
@@ -38,6 +38,8 @@
#include <vector>
#include <list>
+#define LL_MAX_VERTEX_ATTRIB_LOCATION 64
+
//============================================================================
// NOTES
// Threading:
@@ -49,63 +51,123 @@
//============================================================================
// gl name pools for dynamic and streaming buffers
-
-class LLVBOPool : public LLGLNamePool
+class LLVBOPool
{
-protected:
- virtual GLuint allocateName()
- {
- GLuint name;
- glGenBuffersARB(1, &name);
- return name;
- }
+public:
+ static U32 sBytesPooled;
+
+ LLVBOPool(U32 vboUsage, U32 vboType)
+ : mUsage(vboUsage)
+ , mType(vboType)
+ {}
+
+ const U32 mUsage;
+ const U32 mType;
- virtual void releaseName(GLuint name)
+ //size MUST be a power of 2
+ volatile U8* allocate(U32& name, U32 size);
+
+ //size MUST be the size provided to allocate that returned the given name
+ void release(U32 name, volatile U8* buffer, U32 size);
+
+ //destroy all records in mFreeList
+ void cleanup();
+
+ class Record
{
- glDeleteBuffersARB(1, &name);
- }
+ public:
+ U32 mGLName;
+ volatile U8* mClientData;
+ };
+
+ typedef std::list<Record> record_list_t;
+ std::vector<record_list_t> mFreeList;
};
+class LLGLFence
+{
+public:
+ virtual void placeFence() = 0;
+ virtual void wait() = 0;
+};
//============================================================================
-// base class
-
+// base class
+class LLPrivateMemoryPool;
class LLVertexBuffer : public LLRefCount
{
public:
+ class MappedRegion
+ {
+ public:
+ S32 mType;
+ S32 mIndex;
+ S32 mCount;
+
+ MappedRegion(S32 type, S32 index, S32 count);
+ };
+
+ LLVertexBuffer(const LLVertexBuffer& rhs)
+ : mUsage(rhs.mUsage)
+ {
+ *this = rhs;
+ }
+
+ const LLVertexBuffer& operator=(const LLVertexBuffer& rhs)
+ {
+ llerrs << "Illegal operation!" << llendl;
+ return *this;
+ }
+
static LLVBOPool sStreamVBOPool;
static LLVBOPool sDynamicVBOPool;
static LLVBOPool sStreamIBOPool;
static LLVBOPool sDynamicIBOPool;
- static BOOL sUseStreamDraw;
+ static bool sUseStreamDraw;
+ static bool sUseVAO;
+ static bool sPreferStreamDraw;
- static void initClass(bool use_vbo);
+ static void initClass(bool use_vbo, bool no_vbo_mapping);
static void cleanupClass();
static void setupClientArrays(U32 data_mask);
- static void clientCopy(F64 max_time = 0.005); //copy data from client to GL
- static void unbind(); //unbind any bound vertex buffer
+ static void drawArrays(U32 mode, const std::vector<LLVector3>& pos, const std::vector<LLVector3>& norm);
+ static void drawElements(U32 mode, const LLVector4a* pos, const LLVector2* tc, S32 num_indices, const U16* indicesp);
+
+ static void unbind(); //unbind any bound vertex buffer
//get the size of a vertex with the given typemask
- //if offsets is not NULL, its contents will be filled
- //with the offset of each vertex component in the buffer,
+ static S32 calcVertexSize(const U32& typemask);
+
+ //get the size of a buffer with the given typemask and vertex count
+ //fill offsets with the offset of each vertex component array into the buffer
// indexed by the following enum
- static S32 calcStride(const U32& typemask, S32* offsets = NULL);
+ static S32 calcOffsets(const U32& typemask, S32* offsets, S32 num_vertices);
+
+ //WARNING -- when updating these enums you MUST
+ // 1 - update LLVertexBuffer::sTypeSize
+ // 2 - add a strider accessor
+ // 3 - modify LLVertexBuffer::setupVertexBuffer
+ // 4 - modify LLVertexBuffer::setupClientArray
+ // 5 - modify LLViewerShaderMgr::mReservedAttribs
+ // 6 - update LLVertexBuffer::setupVertexArray
enum {
- TYPE_VERTEX,
+ TYPE_VERTEX = 0,
TYPE_NORMAL,
TYPE_TEXCOORD0,
TYPE_TEXCOORD1,
TYPE_TEXCOORD2,
TYPE_TEXCOORD3,
TYPE_COLOR,
- // These use VertexAttribPointer and should possibly be made generic
+ TYPE_EMISSIVE,
TYPE_BINORMAL,
TYPE_WEIGHT,
+ TYPE_WEIGHT4,
TYPE_CLOTHWEIGHT,
+ TYPE_TEXTURE_INDEX,
TYPE_MAX,
- TYPE_INDEX,
+ TYPE_INDEX,
};
enum {
MAP_VERTEX = (1<<TYPE_VERTEX),
@@ -115,10 +177,13 @@ public:
MAP_TEXCOORD2 = (1<<TYPE_TEXCOORD2),
MAP_TEXCOORD3 = (1<<TYPE_TEXCOORD3),
MAP_COLOR = (1<<TYPE_COLOR),
+ MAP_EMISSIVE = (1<<TYPE_EMISSIVE),
// These use VertexAttribPointer and should possibly be made generic
MAP_BINORMAL = (1<<TYPE_BINORMAL),
MAP_WEIGHT = (1<<TYPE_WEIGHT),
+ MAP_WEIGHT4 = (1<<TYPE_WEIGHT4),
MAP_CLOTHWEIGHT = (1<<TYPE_CLOTHWEIGHT),
+ MAP_TEXTURE_INDEX = (1<<TYPE_TEXTURE_INDEX),
};
protected:
@@ -126,32 +191,39 @@ protected:
virtual ~LLVertexBuffer(); // use unref()
- virtual void setupVertexBuffer(U32 data_mask) const; // pure virtual, called from mapBuffer()
+ virtual void setupVertexBuffer(U32 data_mask); // pure virtual, called from mapBuffer()
+ void setupVertexArray();
- void genBuffer();
- void genIndices();
+ void genBuffer(U32 size);
+ void genIndices(U32 size);
+ bool bindGLBuffer(bool force_bind = false);
+ bool bindGLIndices(bool force_bind = false);
+ bool bindGLArray();
void releaseBuffer();
void releaseIndices();
- void createGLBuffer();
- void createGLIndices();
+ void createGLBuffer(U32 size);
+ void createGLIndices(U32 size);
void destroyGLBuffer();
void destroyGLIndices();
void updateNumVerts(S32 nverts);
void updateNumIndices(S32 nindices);
- virtual BOOL useVBOs() const;
+ bool useVBOs() const;
void unmapBuffer();
public:
LLVertexBuffer(U32 typemask, S32 usage);
// map for data access
- U8* mapBuffer(S32 access = -1);
+ volatile U8* mapVertexBuffer(S32 type, S32 index, S32 count, bool map_range);
+ volatile U8* mapIndexBuffer(S32 index, S32 count, bool map_range);
+
// set for rendering
virtual void setBuffer(U32 data_mask); // calls setupVertexBuffer() if data_mask is not 0
+ void flush(); //flush pending data to GL memory
// allocate buffer
void allocateBuffer(S32 nverts, S32 nindices, bool create);
virtual void resizeBuffer(S32 newnverts, S32 newnindices);
-
+
// Only call each getVertexPointer, etc, once before calling unmapBuffer()
// call unmapBuffer() after calls to getXXXStrider() before any cals to setBuffer()
// example:
@@ -159,94 +231,105 @@ public:
// vb->getNormalStrider(norms);
// setVertsNorms(verts, norms);
// vb->unmapBuffer();
- bool getVertexStrider(LLStrider<LLVector3>& strider, S32 index=0);
- bool getIndexStrider(LLStrider<U16>& strider, S32 index=0);
- bool getTexCoord0Strider(LLStrider<LLVector2>& strider, S32 index=0);
- bool getTexCoord1Strider(LLStrider<LLVector2>& strider, S32 index=0);
- bool getNormalStrider(LLStrider<LLVector3>& strider, S32 index=0);
- bool getBinormalStrider(LLStrider<LLVector3>& strider, S32 index=0);
- bool getColorStrider(LLStrider<LLColor4U>& strider, S32 index=0);
- bool getWeightStrider(LLStrider<F32>& strider, S32 index=0);
- bool getClothWeightStrider(LLStrider<LLVector4>& strider, S32 index=0);
+ bool getVertexStrider(LLStrider<LLVector3>& strider, S32 index=0, S32 count = -1, bool map_range = false);
+ bool getVertexStrider(LLStrider<LLVector4a>& strider, S32 index=0, S32 count = -1, bool map_range = false);
+ bool getIndexStrider(LLStrider<U16>& strider, S32 index=0, S32 count = -1, bool map_range = false);
+ bool getTexCoord0Strider(LLStrider<LLVector2>& strider, S32 index=0, S32 count = -1, bool map_range = false);
+ bool getTexCoord1Strider(LLStrider<LLVector2>& strider, S32 index=0, S32 count = -1, bool map_range = false);
+ bool getNormalStrider(LLStrider<LLVector3>& strider, S32 index=0, S32 count = -1, bool map_range = false);
+ bool getBinormalStrider(LLStrider<LLVector3>& strider, S32 index=0, S32 count = -1, bool map_range = false);
+ bool getColorStrider(LLStrider<LLColor4U>& strider, S32 index=0, S32 count = -1, bool map_range = false);
+ bool getEmissiveStrider(LLStrider<LLColor4U>& strider, S32 index=0, S32 count = -1, bool map_range = false);
+ bool getWeightStrider(LLStrider<F32>& strider, S32 index=0, S32 count = -1, bool map_range = false);
+ bool getWeight4Strider(LLStrider<LLVector4>& strider, S32 index=0, S32 count = -1, bool map_range = false);
+ bool getClothWeightStrider(LLStrider<LLVector4>& strider, S32 index=0, S32 count = -1, bool map_range = false);
- BOOL isEmpty() const { return mEmpty; }
- BOOL isLocked() const { return mLocked; }
+
+ bool isEmpty() const { return mEmpty; }
+ bool isLocked() const { return mVertexLocked || mIndexLocked; }
S32 getNumVerts() const { return mNumVerts; }
S32 getNumIndices() const { return mNumIndices; }
- S32 getRequestedVerts() const { return mRequestedNumVerts; }
- S32 getRequestedIndices() const { return mRequestedNumIndices; }
-
- U8* getIndicesPointer() const { return useVBOs() ? NULL : mMappedIndexData; }
- U8* getVerticesPointer() const { return useVBOs() ? NULL : mMappedData; }
- S32 getStride() const { return mStride; }
- S32 getTypeMask() const { return mTypeMask; }
- BOOL hasDataType(S32 type) const { return ((1 << type) & getTypeMask()) ? TRUE : FALSE; }
- S32 getSize() const { return mNumVerts*mStride; }
- S32 getIndicesSize() const { return mNumIndices * sizeof(U16); }
- U8* getMappedData() const { return mMappedData; }
- U8* getMappedIndices() const { return mMappedIndexData; }
+
+ volatile U8* getIndicesPointer() const { return useVBOs() ? (U8*) mAlignedIndexOffset : mMappedIndexData; }
+ volatile U8* getVerticesPointer() const { return useVBOs() ? (U8*) mAlignedOffset : mMappedData; }
+ U32 getTypeMask() const { return mTypeMask; }
+ bool hasDataType(S32 type) const { return ((1 << type) & getTypeMask()); }
+ S32 getSize() const;
+ S32 getIndicesSize() const { return mIndicesSize; }
+ volatile U8* getMappedData() const { return mMappedData; }
+ volatile U8* getMappedIndices() const { return mMappedIndexData; }
S32 getOffset(S32 type) const { return mOffsets[type]; }
S32 getUsage() const { return mUsage; }
-
- void setStride(S32 type, S32 new_stride);
-
- void markDirty(U32 vert_index, U32 vert_count, U32 indices_index, U32 indices_count);
+ bool isWriteable() const { return (mMappable || mUsage == GL_STREAM_DRAW_ARB) ? true : false; }
void draw(U32 mode, U32 count, U32 indices_offset) const;
void drawArrays(U32 mode, U32 offset, U32 count) const;
void drawRange(U32 mode, U32 start, U32 end, U32 count, U32 indices_offset) const;
+ //for debugging, validate data in given range is valid
+ void validateRange(U32 start, U32 end, U32 count, U32 offset) const;
+
+
+
protected:
S32 mNumVerts; // Number of vertices allocated
S32 mNumIndices; // Number of indices allocated
- S32 mRequestedNumVerts; // Number of vertices requested
- S32 mRequestedNumIndices; // Number of indices requested
-
- S32 mStride;
+
+ ptrdiff_t mAlignedOffset;
+ ptrdiff_t mAlignedIndexOffset;
+ S32 mSize;
+ S32 mIndicesSize;
U32 mTypeMask;
- S32 mUsage; // GL usage
+
+ const S32 mUsage; // GL usage
+
U32 mGLBuffer; // GL VBO handle
U32 mGLIndices; // GL IBO handle
- U8* mMappedData; // pointer to currently mapped data (NULL if unmapped)
- U8* mMappedIndexData; // pointer to currently mapped indices (NULL if unmapped)
- BOOL mLocked; // if TRUE, buffer is being or has been written to in client memory
- BOOL mFinal; // if TRUE, buffer can not be mapped again
- BOOL mFilthy; // if TRUE, entire buffer must be copied (used to prevent redundant dirty flags)
- BOOL mEmpty; // if TRUE, client buffer is empty (or NULL). Old values have been discarded.
+ U32 mGLArray; // GL VAO handle
+
+ volatile U8* mMappedData; // pointer to currently mapped data (NULL if unmapped)
+ volatile U8* mMappedIndexData; // pointer to currently mapped indices (NULL if unmapped)
+
+ U32 mMappedDataUsingVBOs : 1;
+ U32 mMappedIndexDataUsingVBOs : 1;
+ U32 mVertexLocked : 1; // if true, vertex buffer is being or has been written to in client memory
+ U32 mIndexLocked : 1; // if true, index buffer is being or has been written to in client memory
+ U32 mFinal : 1; // if true, buffer can not be mapped again
+ U32 mEmpty : 1; // if true, client buffer is empty (or NULL). Old values have been discarded.
+
+ mutable bool mMappable; // if true, use memory mapping to upload data (otherwise doublebuffer and use glBufferSubData)
+
S32 mOffsets[TYPE_MAX];
- BOOL mResized; // if TRUE, client buffer has been resized and GL buffer has not
- BOOL mDynamicSize; // if TRUE, buffer has been resized at least once (and should be padded)
- class DirtyRegion
- {
- public:
- U32 mIndex;
- U32 mCount;
- U32 mIndicesIndex;
- U32 mIndicesCount;
-
- DirtyRegion(U32 vi, U32 vc, U32 ii, U32 ic)
- : mIndex(vi), mCount(vc), mIndicesIndex(ii), mIndicesCount(ic)
- { }
- };
+ std::vector<MappedRegion> mMappedVertexRegions;
+ std::vector<MappedRegion> mMappedIndexRegions;
+
+ mutable LLGLFence* mFence;
+
+ void placeFence() const;
+ void waitFence() const;
+
+ static S32 determineUsage(S32 usage);
- std::vector<DirtyRegion> mDirtyRegions; //vector of dirty regions to rebuild
+private:
+ static LLPrivateMemoryPool* sPrivatePoolp;
public:
static S32 sCount;
static S32 sGLCount;
static S32 sMappedCount;
- static BOOL sMapped;
- static std::vector<U32> sDeleteList;
+ static bool sMapped;
typedef std::list<LLVertexBuffer*> buffer_list_t;
- static BOOL sEnableVBOs;
- static S32 sTypeOffsets[TYPE_MAX];
+ static bool sDisableVBOMapping; //disable glMapBufferARB
+ static bool sEnableVBOs;
+ static S32 sTypeSize[TYPE_MAX];
static U32 sGLMode[LLRender::NUM_MODES];
static U32 sGLRenderBuffer;
+ static U32 sGLRenderArray;
static U32 sGLRenderIndices;
- static BOOL sVBOActive;
- static BOOL sIBOActive;
+ static bool sVBOActive;
+ static bool sIBOActive;
static U32 sLastMask;
static U32 sAllocatedBytes;
static U32 sBindCount;
diff --git a/indra/llui/CMakeLists.txt b/indra/llui/CMakeLists.txt
index e98201ea63..772f173f17 100644
--- a/indra/llui/CMakeLists.txt
+++ b/indra/llui/CMakeLists.txt
@@ -5,6 +5,7 @@ project(llui)
include(00-Common)
include(LLCommon)
include(LLImage)
+include(LLInventory)
include(LLMath)
include(LLMessage)
include(LLRender)
@@ -16,6 +17,7 @@ include(LLXUIXML)
include_directories(
${LLCOMMON_INCLUDE_DIRS}
${LLIMAGE_INCLUDE_DIRS}
+ ${LLINVENTORY_INCLUDE_DIRS}
${LLMATH_INCLUDE_DIRS}
${LLMESSAGE_INCLUDE_DIRS}
${LLRENDER_INCLUDE_DIRS}
@@ -28,10 +30,14 @@ include_directories(
set(llui_SOURCE_FILES
llaccordionctrl.cpp
llaccordionctrltab.cpp
+ llbadge.cpp
+ llbadgeholder.cpp
+ llbadgeowner.cpp
llbutton.cpp
llcheckboxctrl.cpp
llclipboard.cpp
llcombobox.cpp
+ llcommandmanager.cpp
llconsole.cpp
llcontainerview.cpp
llctrlselectioninterface.cpp
@@ -93,8 +99,10 @@ set(llui_SOURCE_FILES
lltextparser.cpp
lltextutil.cpp
lltextvalidate.cpp
+ lltimectrl.cpp
lltransutil.cpp
lltoggleablemenu.cpp
+ lltoolbar.cpp
lltooltip.cpp
llui.cpp
lluicolortable.cpp
@@ -108,9 +116,11 @@ set(llui_SOURCE_FILES
llurlmatch.cpp
llurlregistry.cpp
llviewborder.cpp
+ llviewinject.cpp
llviewmodel.cpp
llview.cpp
llviewquery.cpp
+ llwindowshade.cpp
)
set(llui_HEADER_FILES
@@ -118,11 +128,15 @@ set(llui_HEADER_FILES
llaccordionctrl.h
llaccordionctrltab.h
+ llbadge.h
+ llbadgeholder.h
+ llbadgeowner.h
llbutton.h
llcallbackmap.h
llcheckboxctrl.h
llclipboard.h
llcombobox.h
+ llcommandmanager.h
llconsole.h
llcontainerview.h
llctrlselectioninterface.h
@@ -159,6 +173,7 @@ set(llui_HEADER_FILES
llnotificationslistener.h
llnotificationsutil.h
llnotificationtemplate.h
+ llnotificationvisibilityrule.h
llpanel.h
llprogressbar.h
llradiogroup.h
@@ -189,7 +204,9 @@ set(llui_HEADER_FILES
lltextparser.h
lltextutil.h
lltextvalidate.h
+ lltimectrl.h
lltoggleablemenu.h
+ lltoolbar.h
lltooltip.h
lltransutil.h
lluicolortable.h
@@ -206,9 +223,11 @@ set(llui_HEADER_FILES
llurlmatch.h
llurlregistry.h
llviewborder.h
+ llviewinject.h
llviewmodel.h
llview.h
llviewquery.h
+ llwindowshade.h
)
set_source_files_properties(${llui_HEADER_FILES}
@@ -234,6 +253,7 @@ target_link_libraries(llui
${LLRENDER_LIBRARIES}
${LLWINDOW_LIBRARIES}
${LLIMAGE_LIBRARIES}
+ ${LLINVENTORY_LIBRARIES}
${LLVFS_LIBRARIES} # ugh, just for LLDir
${LLXUIXML_LIBRARIES}
${LLXML_LIBRARIES}
@@ -241,8 +261,8 @@ target_link_libraries(llui
${LLCOMMON_LIBRARIES} # must be after llimage, llwindow, llrender
)
+# Add tests
if(LL_TESTS)
- # Add tests
include(LLAddBuildTest)
SET(llui_TEST_SOURCE_FILES
llurlmatch.cpp
diff --git a/indra/llui/llaccordionctrltab.cpp b/indra/llui/llaccordionctrltab.cpp
index 9d49c1a831..c025cd7939 100644
--- a/indra/llui/llaccordionctrltab.cpp
+++ b/indra/llui/llaccordionctrltab.cpp
@@ -203,7 +203,8 @@ void LLAccordionCtrlTab::LLAccordionCtrlTabHeader::draw()
S32 width = getRect().getWidth();
S32 height = getRect().getHeight();
- gl_rect_2d(0,0,width - 1 ,height - 1,mHeaderBGColor.get(),true);
+ F32 alpha = getCurrentTransparency();
+ gl_rect_2d(0,0,width - 1 ,height - 1,mHeaderBGColor.get() % alpha,true);
LLAccordionCtrlTab* parent = dynamic_cast<LLAccordionCtrlTab*>(getParent());
bool collapsible = (parent && parent->getCollapsible());
@@ -338,7 +339,7 @@ LLAccordionCtrlTab::Params::Params()
,fit_panel("fit_panel",true)
,selection_enabled("selection_enabled", false)
{
- mouse_opaque(false);
+ changeDefault(mouse_opaque, false);
}
LLAccordionCtrlTab::LLAccordionCtrlTab(const LLAccordionCtrlTab::Params&p)
@@ -972,10 +973,10 @@ void LLAccordionCtrlTab::drawChild(const LLRect& root_rect,LLView* child)
if ( root_rect.overlaps(screen_rect) && LLUI::sDirtyRect.overlaps(screen_rect))
{
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
LLUI::pushMatrix();
{
- LLUI::translate((F32)child->getRect().mLeft, (F32)child->getRect().mBottom, 0.f);
+ LLUI::translate((F32)child->getRect().mLeft, (F32)child->getRect().mBottom);
child->draw();
}
@@ -1021,7 +1022,7 @@ void LLAccordionCtrlTab::updateLayout ( const LLRect& child_rect )
S32 panel_width = child_rect.getWidth();
static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0);
- if(mScrollbar->getVisible() != false)
+ if(mScrollbar && mScrollbar->getVisible() != false)
{
panel_top+=mScrollbar->getDocPos();
panel_width-=scrollbar_size;
diff --git a/indra/llui/llbadge.cpp b/indra/llui/llbadge.cpp
new file mode 100644
index 0000000000..8ede4e3468
--- /dev/null
+++ b/indra/llui/llbadge.cpp
@@ -0,0 +1,381 @@
+/**
+ * @file llbadge.cpp
+ * @brief Implementation for badges
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#define LLBADGE_CPP
+#include "llbadge.h"
+
+#include "llscrollcontainer.h"
+#include "lluictrlfactory.h"
+
+
+static LLDefaultChildRegistry::Register<LLBadge> r("badge");
+
+static const S32 BADGE_OFFSET_NOT_SPECIFIED = 0x7FFFFFFF;
+
+// Compiler optimization, generate extern template
+template class LLBadge* LLView::getChild<class LLBadge>(const std::string& name, BOOL recurse) const;
+
+
+LLBadge::Params::Params()
+ : image("image")
+ , border_image("border_image")
+ , border_color("border_color")
+ , image_color("image_color")
+ , label("label")
+ , label_color("label_color")
+ , label_offset_horiz("label_offset_horiz")
+ , label_offset_vert("label_offset_vert")
+ , location("location", LLRelPos::TOP_LEFT)
+ , location_offset_hcenter("location_offset_hcenter")
+ , location_offset_vcenter("location_offset_vcenter")
+ , location_percent_hcenter("location_percent_hcenter")
+ , location_percent_vcenter("location_percent_vcenter")
+ , padding_horiz("padding_horiz")
+ , padding_vert("padding_vert")
+{}
+
+bool LLBadge::Params::equals(const Params& a) const
+{
+ bool comp = true;
+
+ // skip owner in comparison on purpose
+
+ comp &= (border_image() == a.border_image());
+ comp &= (border_color() == a.border_color());
+ comp &= (image() == a.image());
+ comp &= (image_color() == a.image_color());
+ comp &= (label() == a.label());
+ comp &= (label_color() == a.label_color());
+ comp &= (label_offset_horiz() == a.label_offset_horiz());
+ comp &= (label_offset_vert() == a.label_offset_vert());
+ comp &= (location() == a.location());
+ comp &= (location_offset_hcenter() == a.location_offset_hcenter());
+ comp &= (location_offset_vcenter() == a.location_offset_vcenter());
+ comp &= (location_percent_hcenter() == a.location_percent_hcenter());
+ comp &= (location_percent_vcenter() == a.location_percent_vcenter());
+ comp &= (padding_horiz() == a.padding_horiz());
+ comp &= (padding_vert() == a.padding_vert());
+
+ return comp;
+}
+
+LLBadge::LLBadge(const LLBadge::Params& p)
+ : LLUICtrl(p)
+ , mOwner(p.owner)
+ , mBorderImage(p.border_image)
+ , mBorderColor(p.border_color)
+ , mGLFont(p.font)
+ , mImage(p.image)
+ , mImageColor(p.image_color)
+ , mLabel(p.label)
+ , mLabelColor(p.label_color)
+ , mLabelOffsetHoriz(p.label_offset_horiz)
+ , mLabelOffsetVert(p.label_offset_vert)
+ , mLocation(p.location)
+ , mLocationOffsetHCenter(BADGE_OFFSET_NOT_SPECIFIED)
+ , mLocationOffsetVCenter(BADGE_OFFSET_NOT_SPECIFIED)
+ , mLocationPercentHCenter(0.5f)
+ , mLocationPercentVCenter(0.5f)
+ , mPaddingHoriz(p.padding_horiz)
+ , mPaddingVert(p.padding_vert)
+ , mParentScroller(NULL)
+{
+ if (mImage.isNull())
+ {
+ llwarns << "Badge: " << getName() << " with no image!" << llendl;
+ }
+
+ if (p.location_offset_hcenter.isProvided())
+ {
+ mLocationOffsetHCenter = p.location_offset_hcenter();
+ }
+
+ if (p.location_offset_vcenter.isProvided())
+ {
+ mLocationOffsetVCenter = p.location_offset_vcenter();
+ }
+
+ //
+ // The following logic is to set the mLocationPercentHCenter and mLocationPercentVCenter
+ // based on the Location enum and our horizontal and vertical location percentages. The
+ // draw code then uses this on the owner rectangle to compute the screen location for
+ // the badge.
+ //
+
+ if (!LLRelPos::IsCenter(mLocation))
+ {
+ F32 h_center = p.location_percent_hcenter * 0.01f;
+ F32 v_center = p.location_percent_vcenter * 0.01f;
+
+ if (LLRelPos::IsRight(mLocation))
+ {
+ mLocationPercentHCenter = 0.5f * (1.0f + h_center);
+ }
+ else if (LLRelPos::IsLeft(mLocation))
+ {
+ mLocationPercentHCenter = 0.5f * (1.0f - h_center);
+ }
+
+ if (LLRelPos::IsTop(mLocation))
+ {
+ mLocationPercentVCenter = 0.5f * (1.0f + v_center);
+ }
+ else if (LLRelPos::IsBottom(mLocation))
+ {
+ mLocationPercentVCenter = 0.5f * (1.0f - v_center);
+ }
+ }
+}
+
+LLBadge::~LLBadge()
+{
+}
+
+bool LLBadge::addToView(LLView * view)
+{
+ bool child_added = view->addChild(this);
+
+ if (child_added)
+ {
+ setShape(view->getLocalRect());
+
+ // Find a parent scroll container, if there is one in case we need it for positioning
+
+ LLView * parent = mOwner.get();
+
+ while ((parent != NULL) && ((mParentScroller = dynamic_cast<LLScrollContainer *>(parent)) == NULL))
+ {
+ parent = parent->getParent();
+ }
+ }
+
+ return child_added;
+}
+
+void LLBadge::setLabel(const LLStringExplicit& label)
+{
+ mLabel = label;
+}
+
+//
+// This is a fallback function to render a rectangle for badges without a valid image
+//
+void renderBadgeBackground(F32 centerX, F32 centerY, F32 width, F32 height, const LLColor4U &color)
+{
+ gGL.pushUIMatrix();
+ gGL.loadUIIdentity();
+ gGL.setSceneBlendType(LLRender::BT_REPLACE);
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+
+ gGL.color4ubv(color.mV);
+ gGL.texCoord2i(0, 0);
+
+ F32 x = LLFontGL::sCurOrigin.mX + centerX - width * 0.5f;
+ F32 y = LLFontGL::sCurOrigin.mY + centerY - height * 0.5f;
+
+ LLRectf screen_rect(llround(x),
+ llround(y),
+ llround(x) + width,
+ llround(y) + height);
+
+ LLVector3 vertices[4];
+ vertices[0] = LLVector3(screen_rect.mRight, screen_rect.mTop, 1.0f);
+ vertices[1] = LLVector3(screen_rect.mLeft, screen_rect.mTop, 1.0f);
+ vertices[2] = LLVector3(screen_rect.mLeft, screen_rect.mBottom, 1.0f);
+ vertices[3] = LLVector3(screen_rect.mRight, screen_rect.mBottom, 1.0f);
+
+ gGL.begin(LLRender::QUADS);
+ {
+ gGL.vertexBatchPreTransformed(vertices, 4);
+ }
+ gGL.end();
+
+ gGL.popUIMatrix();
+}
+
+
+// virtual
+void LLBadge::draw()
+{
+ if (!mLabel.empty())
+ {
+ LLView* owner_view = mOwner.get();
+
+ if (owner_view)
+ {
+ //
+ // Calculate badge size based on label text
+ //
+
+ LLWString badge_label_wstring = mLabel;
+
+ S32 badge_label_begin_offset = 0;
+ S32 badge_char_length = S32_MAX;
+ S32 badge_pixel_length = S32_MAX;
+ F32 *right_position_out = NULL;
+ BOOL do_not_use_ellipses = false;
+
+ F32 badge_width = (2.0f * mPaddingHoriz) +
+ mGLFont->getWidthF32(badge_label_wstring.c_str(), badge_label_begin_offset, badge_char_length);
+
+ F32 badge_height = (2.0f * mPaddingVert) + mGLFont->getLineHeight();
+
+ //
+ // Calculate badge position based on owner
+ //
+
+ LLRect owner_rect;
+ owner_view->localRectToOtherView(owner_view->getLocalRect(), & owner_rect, this);
+
+ S32 location_offset_horiz = mLocationOffsetHCenter;
+ S32 location_offset_vert = mLocationOffsetVCenter;
+
+ // If we're in a scroll container, do some math to keep us in the same place on screen if applicable
+ if (mParentScroller != NULL)
+ {
+ LLRect visibleRect = mParentScroller->getVisibleContentRect();
+
+ if (mLocationOffsetHCenter != BADGE_OFFSET_NOT_SPECIFIED)
+ {
+ if (LLRelPos::IsRight(mLocation))
+ {
+ location_offset_horiz += visibleRect.mRight;
+ }
+ else if (LLRelPos::IsLeft(mLocation))
+ {
+ location_offset_horiz += visibleRect.mLeft;
+ }
+ else // center
+ {
+ location_offset_horiz += (visibleRect.mLeft + visibleRect.mRight) / 2;
+ }
+ }
+
+ if (mLocationOffsetVCenter != BADGE_OFFSET_NOT_SPECIFIED)
+ {
+ if (LLRelPos::IsTop(mLocation))
+ {
+ location_offset_vert += visibleRect.mTop;
+ }
+ else if (LLRelPos::IsBottom(mLocation))
+ {
+ location_offset_vert += visibleRect.mBottom;
+ }
+ else // center
+ {
+ location_offset_vert += (visibleRect.mBottom + visibleRect.mTop) / 2;
+ }
+ }
+ }
+
+ F32 badge_center_x;
+ F32 badge_center_y;
+
+ // Compute x position
+ if (mLocationOffsetHCenter == BADGE_OFFSET_NOT_SPECIFIED)
+ {
+ badge_center_x = owner_rect.mLeft + owner_rect.getWidth() * mLocationPercentHCenter;
+ }
+ else
+ {
+ badge_center_x = location_offset_horiz;
+ }
+
+ // Compute y position
+ if (mLocationOffsetVCenter == BADGE_OFFSET_NOT_SPECIFIED)
+ {
+ badge_center_y = owner_rect.mBottom + owner_rect.getHeight() * mLocationPercentVCenter;
+ }
+ else
+ {
+ badge_center_y = location_offset_vert;
+ }
+
+ //
+ // Draw button image, if available.
+ // Otherwise draw basic rectangular button.
+ //
+
+ F32 alpha = getDrawContext().mAlpha;
+
+ if (!mImage.isNull())
+ {
+ F32 badge_x = badge_center_x - badge_width * 0.5f;
+ F32 badge_y = badge_center_y - badge_height * 0.5f;
+
+ mImage->drawSolid((S32) badge_x, (S32) badge_y, (S32) badge_width, (S32) badge_height, mImageColor % alpha);
+
+ if (!mBorderImage.isNull())
+ {
+ mBorderImage->drawSolid((S32) badge_x, (S32) badge_y, (S32) badge_width, (S32) badge_height, mBorderColor % alpha);
+ }
+ }
+ else
+ {
+ lldebugs << "No image for badge " << getName() << " on owner " << owner_view->getName() << llendl;
+
+ renderBadgeBackground(badge_center_x, badge_center_y,
+ badge_width, badge_height,
+ mImageColor % alpha);
+ }
+
+ //
+ // Draw the label
+ //
+
+ mGLFont->render(badge_label_wstring,
+ badge_label_begin_offset,
+ badge_center_x + mLabelOffsetHoriz,
+ badge_center_y + mLabelOffsetVert,
+ mLabelColor % alpha,
+ LLFontGL::HCENTER, LLFontGL::VCENTER, // centered around the position
+ LLFontGL::NORMAL, // normal text (not bold, italics, etc.)
+ LLFontGL::DROP_SHADOW_SOFT,
+ badge_char_length, badge_pixel_length,
+ right_position_out, do_not_use_ellipses);
+ }
+ }
+}
+
+
+namespace LLInitParam
+{
+ void TypeValues<LLRelPos::Location>::declareValues()
+ {
+ declare("bottom", LLRelPos::BOTTOM);
+ declare("bottom_left", LLRelPos::BOTTOM_LEFT);
+ declare("bottom_right", LLRelPos::BOTTOM_RIGHT);
+ declare("center", LLRelPos::CENTER);
+ declare("left", LLRelPos::LEFT);
+ declare("right", LLRelPos::RIGHT);
+ declare("top", LLRelPos::TOP);
+ declare("top_left", LLRelPos::TOP_LEFT);
+ declare("top_right", LLRelPos::TOP_RIGHT);
+ }
+}
+
+
+// eof
diff --git a/indra/llui/llbadge.h b/indra/llui/llbadge.h
new file mode 100644
index 0000000000..4b21a71aaa
--- /dev/null
+++ b/indra/llui/llbadge.h
@@ -0,0 +1,174 @@
+/**
+ * @file llbadge.h
+ * @brief Header for badges
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLBADGE_H
+#define LL_LLBADGE_H
+
+#include <string>
+
+#include "lluicolor.h"
+#include "lluictrl.h"
+#include "llstring.h"
+#include "lluiimage.h"
+#include "llview.h"
+
+//
+// Declarations
+//
+
+class LLFontGL;
+class LLScrollContainer;
+class LLUICtrlFactory;
+
+//
+// Relative Position Alignment
+//
+
+namespace LLRelPos
+{
+ enum Location
+ {
+ CENTER = 0,
+
+ LEFT = (1 << 0),
+ RIGHT = (1 << 1),
+
+ TOP = (1 << 2),
+ BOTTOM = (1 << 3),
+
+ BOTTOM_LEFT = (BOTTOM | LEFT),
+ BOTTOM_RIGHT = (BOTTOM | RIGHT),
+
+ TOP_LEFT = (TOP | LEFT),
+ TOP_RIGHT = (TOP | RIGHT),
+ };
+
+ inline bool IsBottom(Location relPos) { return (relPos & BOTTOM) == BOTTOM; }
+ inline bool IsCenter(Location relPos) { return (relPos == CENTER); }
+ inline bool IsLeft(Location relPos) { return (relPos & LEFT) == LEFT; }
+ inline bool IsRight(Location relPos) { return (relPos & RIGHT) == RIGHT; }
+ inline bool IsTop(Location relPos) { return (relPos & TOP) == TOP; }
+}
+
+// NOTE: This needs to occur before Optional<LLRelPos::Location> declaration for proper compilation.
+namespace LLInitParam
+{
+ template<>
+ struct TypeValues<LLRelPos::Location> : public TypeValuesHelper<LLRelPos::Location>
+ {
+ static void declareValues();
+ };
+}
+
+//
+// Classes
+//
+
+class LLBadge
+: public LLUICtrl
+{
+public:
+ struct Params
+ : public LLInitParam::Block<Params, LLUICtrl::Params>
+ {
+ Optional< LLHandle<LLView> > owner; // Mandatory in code but not in xml
+
+ Optional< LLUIImage* > border_image;
+ Optional< LLUIColor > border_color;
+
+ Optional< LLUIImage* > image;
+ Optional< LLUIColor > image_color;
+
+ Optional< std::string > label;
+ Optional< LLUIColor > label_color;
+
+ Optional< S32 > label_offset_horiz;
+ Optional< S32 > label_offset_vert;
+
+ Optional< LLRelPos::Location > location;
+ Optional< S32 > location_offset_hcenter;
+ Optional< S32 > location_offset_vcenter;
+ Optional< U32 > location_percent_hcenter;
+ Optional< U32 > location_percent_vcenter;
+
+ Optional< F32 > padding_horiz;
+ Optional< F32 > padding_vert;
+
+ Params();
+
+ bool equals(const Params&) const;
+ };
+
+protected:
+ friend class LLUICtrlFactory;
+ LLBadge(const Params& p);
+
+public:
+
+ ~LLBadge();
+
+ bool addToView(LLView * view);
+
+ virtual void draw();
+
+ const std::string getLabel() const { return wstring_to_utf8str(mLabel); }
+ void setLabel( const LLStringExplicit& label);
+
+private:
+ LLPointer< LLUIImage > mBorderImage;
+ LLUIColor mBorderColor;
+
+ const LLFontGL* mGLFont;
+
+ LLPointer< LLUIImage > mImage;
+ LLUIColor mImageColor;
+
+ LLUIString mLabel;
+ LLUIColor mLabelColor;
+
+ S32 mLabelOffsetHoriz;
+ S32 mLabelOffsetVert;
+
+ LLRelPos::Location mLocation;
+ S32 mLocationOffsetHCenter;
+ S32 mLocationOffsetVCenter;
+ F32 mLocationPercentHCenter;
+ F32 mLocationPercentVCenter;
+
+ LLHandle< LLView > mOwner;
+
+ F32 mPaddingHoriz;
+ F32 mPaddingVert;
+
+ LLScrollContainer* mParentScroller;
+};
+
+// Build time optimization, generate once in .cpp file
+#ifndef LLBADGE_CPP
+extern template class LLBadge* LLView::getChild<class LLBadge>(const std::string& name, BOOL recurse) const;
+#endif
+
+#endif // LL_LLBADGE_H
diff --git a/indra/llui/llbadgeholder.cpp b/indra/llui/llbadgeholder.cpp
new file mode 100644
index 0000000000..1f786f36ae
--- /dev/null
+++ b/indra/llui/llbadgeholder.cpp
@@ -0,0 +1,45 @@
+/**
+ * @file llbadgeholder.cpp
+ * @brief Source for badge holders
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llbadgeholder.h"
+
+#include "llbadge.h"
+#include "llview.h"
+
+
+bool LLBadgeHolder::addBadge(LLBadge * badge)
+{
+ bool badge_added = false;
+
+ LLView * this_view = dynamic_cast<LLView *>(this);
+
+ if (this_view && mAcceptsBadge)
+ {
+ badge_added = badge->addToView(this_view);
+ }
+
+ return badge_added;
+}
diff --git a/indra/llui/llbadgeholder.h b/indra/llui/llbadgeholder.h
new file mode 100644
index 0000000000..2538eaae91
--- /dev/null
+++ b/indra/llui/llbadgeholder.h
@@ -0,0 +1,56 @@
+/**
+ * @file llbadgeholder.h
+ * @brief Header for badge holders
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLBADGEHOLDER_H
+#define LL_LLBADGEHOLDER_H
+
+//
+// Classes
+//
+
+class LLBadge;
+
+class LLBadgeHolder
+{
+public:
+
+ LLBadgeHolder(bool acceptsBadge)
+ : mAcceptsBadge(acceptsBadge)
+ {
+ }
+
+ void setAcceptsBadge(bool acceptsBadge) { mAcceptsBadge = acceptsBadge; }
+ bool acceptsBadge() const { return mAcceptsBadge; }
+
+ virtual bool addBadge(LLBadge * badge);
+
+private:
+
+ bool mAcceptsBadge;
+
+};
+
+#endif // LL_LLBADGEHOLDER_H
diff --git a/indra/llui/llbadgeowner.cpp b/indra/llui/llbadgeowner.cpp
new file mode 100644
index 0000000000..1860a05edd
--- /dev/null
+++ b/indra/llui/llbadgeowner.cpp
@@ -0,0 +1,131 @@
+/**
+ * @file llbadgeowner.cpp
+ * @brief Class to manage badges attached to a UI control
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+
+#include "llbadgeholder.h"
+#include "llbadgeowner.h"
+#include "llpanel.h"
+
+//
+// Classes
+//
+
+LLBadgeOwner::LLBadgeOwner(LLHandle< LLView > viewHandle)
+ : mBadge(NULL)
+ , mBadgeOwnerView(viewHandle)
+{
+}
+
+void LLBadgeOwner::initBadgeParams(const LLBadge::Params& p)
+{
+ if (!p.equals(LLUICtrlFactory::getDefaultParams<LLBadge>()))
+ {
+ mBadge = createBadge(p);
+ }
+}
+
+void LLBadgeOwner::setBadgeLabel(const LLStringExplicit& label)
+{
+ if (mBadge == NULL)
+ {
+ mBadge = createBadge(LLUICtrlFactory::getDefaultParams<LLBadge>());
+
+ addBadgeToParentPanel();
+ }
+
+ if (mBadge)
+ {
+ mBadge->setLabel(label);
+
+ //
+ // Push the badge to the front so it renders on top
+ //
+
+ LLView * parent = mBadge->getParent();
+
+ if (parent)
+ {
+ parent->sendChildToFront(mBadge);
+ }
+ }
+}
+
+void LLBadgeOwner::setBadgeVisibility(bool visible)
+{
+ if (mBadge)
+ {
+ mBadge->setVisible(visible);
+ }
+}
+
+bool LLBadgeOwner::addBadgeToParentPanel()
+{
+ bool badge_added = false;
+
+ LLView * owner_view = mBadgeOwnerView.get();
+
+ if (mBadge && owner_view)
+ {
+ LLBadgeHolder * badge_holder = NULL;
+
+ // Find the appropriate holder for the badge
+ LLView * parent = owner_view->getParent();
+
+ while (parent)
+ {
+ LLBadgeHolder * badge_holder_panel = dynamic_cast<LLBadgeHolder *>(parent);
+
+ if (badge_holder_panel && badge_holder_panel->acceptsBadge())
+ {
+ badge_holder = badge_holder_panel;
+ break;
+ }
+
+ parent = parent->getParent();
+ }
+
+ if (badge_holder)
+ {
+ badge_added = badge_holder->addBadge(mBadge);
+ }
+ else
+ {
+ // Badge parent is fallback badge owner if no valid holder exists in the hierarchy
+ badge_added = mBadge->addToView(owner_view);
+ }
+ }
+
+ return badge_added;
+}
+
+LLBadge* LLBadgeOwner::createBadge(const LLBadge::Params& p)
+{
+ LLBadge::Params badge_params(p);
+ badge_params.owner = mBadgeOwnerView;
+
+ return LLUICtrlFactory::create<LLBadge>(badge_params);
+}
diff --git a/indra/llui/llbadgeowner.h b/indra/llui/llbadgeowner.h
new file mode 100644
index 0000000000..8d03e30645
--- /dev/null
+++ b/indra/llui/llbadgeowner.h
@@ -0,0 +1,61 @@
+/**
+ * @file llbadgeowner.h
+ * @brief Header for badge owners
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLBADGEOWNER_H
+#define LL_LLBADGEOWNER_H
+
+#include "llbadge.h"
+#include "llview.h"
+
+//
+// Classes
+//
+
+class LLBadgeOwner
+{
+public:
+
+ LLBadgeOwner(LLHandle< LLView > viewHandle);
+
+ void initBadgeParams(const LLBadge::Params& p);
+ bool addBadgeToParentPanel();
+
+ bool badgeHasParent() const { return (mBadge && mBadge->getParent()); }
+
+ void setBadgeLabel(const LLStringExplicit& label);
+ void setBadgeVisibility(bool visible);
+
+private:
+
+ LLBadge* createBadge(const LLBadge::Params& p);
+
+private:
+
+ LLBadge* mBadge;
+ LLHandle< LLView > mBadgeOwnerView;
+};
+
+#endif // LL_LLBADGEOWNER_H
diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp
index 65ef3e5f8f..705fe16559 100644
--- a/indra/llui/llbutton.cpp
+++ b/indra/llui/llbutton.cpp
@@ -83,10 +83,11 @@ LLButton::Params::Params()
label_color_selected("label_color_selected"), // requires is_toggle true
label_color_disabled("label_color_disabled"),
label_color_disabled_selected("label_color_disabled_selected"),
- highlight_color("highlight_color"),
image_color("image_color"),
image_color_disabled("image_color_disabled"),
- image_overlay_color("image_overlay_color", LLColor4::white),
+ image_overlay_color("image_overlay_color", LLColor4::white % 0.75f),
+ image_overlay_disabled_color("image_overlay_disabled_color", LLColor4::white % 0.3f),
+ image_overlay_selected_color("image_overlay_selected_color", LLColor4::white),
flash_color("flash_color"),
pad_right("pad_right", LLUI::sSettingGroups["config"]->getS32("ButtonHPad")),
pad_left("pad_left", LLUI::sSettingGroups["config"]->getS32("ButtonHPad")),
@@ -98,16 +99,23 @@ LLButton::Params::Params()
is_toggle("is_toggle", false),
scale_image("scale_image", true),
hover_glow_amount("hover_glow_amount"),
- commit_on_return("commit_on_return", true)
+ commit_on_return("commit_on_return", true),
+ display_pressed_state("display_pressed_state", true),
+ use_draw_context_alpha("use_draw_context_alpha", true),
+ badge("badge"),
+ handle_right_mouse("handle_right_mouse"),
+ held_down_delay("held_down_delay"),
+ button_flash_count("button_flash_count"),
+ button_flash_rate("button_flash_rate")
{
addSynonym(is_toggle, "toggle");
- held_down_delay.seconds = 0.5f;
- initial_value.set(LLSD(false), false);
+ changeDefault(initial_value, LLSD(false));
}
LLButton::LLButton(const LLButton::Params& p)
: LLUICtrl(p),
+ LLBadgeOwner(getHandle()),
mMouseDownFrame(0),
mMouseHeldDownCount(0),
mBorderEnabled( FALSE ),
@@ -132,12 +140,13 @@ LLButton::LLButton(const LLButton::Params& p)
mSelectedLabelColor(p.label_color_selected()),
mDisabledLabelColor(p.label_color_disabled()),
mDisabledSelectedLabelColor(p.label_color_disabled_selected()),
- mHighlightColor(p.highlight_color()),
mImageColor(p.image_color()),
mFlashBgColor(p.flash_color()),
mDisabledImageColor(p.image_color_disabled()),
mImageOverlay(p.image_overlay()),
mImageOverlayColor(p.image_overlay_color()),
+ mImageOverlayDisabledColor(p.image_overlay_disabled_color()),
+ mImageOverlaySelectedColor(p.image_overlay_selected_color()),
mImageOverlayAlignment(LLFontGL::hAlignFromName(p.image_overlay_alignment)),
mImageOverlayTopPad(p.image_top_pad),
mImageOverlayBottomPad(p.image_bottom_pad),
@@ -155,11 +164,15 @@ LLButton::LLButton(const LLButton::Params& p)
mCommitOnReturn(p.commit_on_return),
mFadeWhenDisabled(FALSE),
mForcePressedState(false),
+ mDisplayPressedState(p.display_pressed_state),
mLastDrawCharsCount(0),
mMouseDownSignal(NULL),
mMouseUpSignal(NULL),
- mHeldDownSignal(NULL)
-
+ mHeldDownSignal(NULL),
+ mUseDrawContextAlpha(p.use_draw_context_alpha),
+ mHandleRightMouse(p.handle_right_mouse),
+ mButtonFlashCount(p.button_flash_count),
+ mButtonFlashRate(p.button_flash_rate)
{
static LLUICachedControl<S32> llbutton_orig_h_pad ("UIButtonOrigHPad", 0);
static Params default_params(LLUICtrlFactory::getDefaultParams<LLButton>());
@@ -242,6 +255,11 @@ LLButton::LLButton(const LLButton::Params& p)
{
setHeldDownCallback(initCommitCallback(p.mouse_held_callback));
}
+
+ if (p.badge.isProvided())
+ {
+ LLBadgeOwner::initBadgeParams(p.badge());
+ }
}
LLButton::~LLButton()
@@ -282,6 +300,24 @@ void LLButton::onCommit()
LLUICtrl::onCommit();
}
+boost::signals2::connection LLButton::setClickedCallback(const CommitCallbackParam& cb)
+{
+ return setClickedCallback(initCommitCallback(cb));
+}
+boost::signals2::connection LLButton::setMouseDownCallback(const CommitCallbackParam& cb)
+{
+ return setMouseDownCallback(initCommitCallback(cb));
+}
+boost::signals2::connection LLButton::setMouseUpCallback(const CommitCallbackParam& cb)
+{
+ return setMouseUpCallback(initCommitCallback(cb));
+}
+boost::signals2::connection LLButton::setHeldDownCallback(const CommitCallbackParam& cb)
+{
+ return setHeldDownCallback(initCommitCallback(cb));
+}
+
+
boost::signals2::connection LLButton::setClickedCallback( const commit_signal_t::slot_type& cb )
{
if (!mCommitSignal) mCommitSignal = new commit_signal_t();
@@ -304,7 +340,7 @@ boost::signals2::connection LLButton::setHeldDownCallback( const commit_signal_t
}
-// *TODO: Deprecate (for backwards compatability only)
+// *TODO: Deprecate (for backwards compatibility only)
boost::signals2::connection LLButton::setClickedCallback( button_callback_t cb, void* data )
{
return setClickedCallback(boost::bind(cb, data));
@@ -325,8 +361,12 @@ boost::signals2::connection LLButton::setHeldDownCallback( button_callback_t cb,
BOOL LLButton::postBuild()
{
autoResize();
- return TRUE;
+
+ addBadgeToParentPanel();
+
+ return LLUICtrl::postBuild();
}
+
BOOL LLButton::handleUnicodeCharHere(llwchar uni_char)
{
BOOL handled = FALSE;
@@ -445,7 +485,7 @@ BOOL LLButton::handleMouseUp(S32 x, S32 y, MASK mask)
BOOL LLButton::handleRightMouseDown(S32 x, S32 y, MASK mask)
{
- if (!childrenHandleRightMouseDown(x, y, mask))
+ if (mHandleRightMouse && !childrenHandleRightMouseDown(x, y, mask))
{
// Route future Mouse messages here preemptively. (Release on mouse up.)
gFocusMgr.setMouseCapture( this );
@@ -458,49 +498,45 @@ BOOL LLButton::handleRightMouseDown(S32 x, S32 y, MASK mask)
// if (pointInView(x, y))
// {
// }
+ // send the mouse down signal
+ LLUICtrl::handleRightMouseDown(x,y,mask);
+ // *TODO: Return result of LLUICtrl call above? Should defer to base class
+ // but this might change the mouse handling of existing buttons in a bad way
+ // if they are not mouse opaque.
}
- // send the mouse down signal
- LLUICtrl::handleRightMouseDown(x,y,mask);
- // *TODO: Return result of LLUICtrl call above? Should defer to base class
- // but this might change the mouse handling of existing buttons in a bad way
- // if they are not mouse opaque.
+
return TRUE;
}
BOOL LLButton::handleRightMouseUp(S32 x, S32 y, MASK mask)
{
- // We only handle the click if the click both started and ended within us
- if( hasMouseCapture() )
+ if (mHandleRightMouse)
{
- // Always release the mouse
- gFocusMgr.setMouseCapture( NULL );
+ // We only handle the click if the click both started and ended within us
+ if( hasMouseCapture() )
+ {
+ // Always release the mouse
+ gFocusMgr.setMouseCapture( NULL );
-// if (pointInView(x, y))
-// {
-// mRightMouseUpSignal(this, x,y,mask);
-// }
- }
- else
- {
- childrenHandleRightMouseUp(x, y, mask);
+ // if (pointInView(x, y))
+ // {
+ // mRightMouseUpSignal(this, x,y,mask);
+ // }
+ }
+ else
+ {
+ childrenHandleRightMouseUp(x, y, mask);
+ }
+
+ // send the mouse up signal
+ LLUICtrl::handleRightMouseUp(x,y,mask);
+ // *TODO: Return result of LLUICtrl call above? Should defer to base class
+ // but this might change the mouse handling of existing buttons in a bad way.
+ // if they are not mouse opaque.
}
- // send the mouse up signal
- LLUICtrl::handleRightMouseUp(x,y,mask);
- // *TODO: Return result of LLUICtrl call above? Should defer to base class
- // but this might change the mouse handling of existing buttons in a bad way.
- // if they are not mouse opaque.
return TRUE;
}
-
-void LLButton::onMouseEnter(S32 x, S32 y, MASK mask)
-{
- LLUICtrl::onMouseEnter(x, y, mask);
-
- if (isInEnabledChain())
- mNeedsHighlight = TRUE;
-}
-
void LLButton::onMouseLeave(S32 x, S32 y, MASK mask)
{
LLUICtrl::onMouseLeave(x, y, mask);
@@ -515,6 +551,10 @@ void LLButton::setHighlight(bool b)
BOOL LLButton::handleHover(S32 x, S32 y, MASK mask)
{
+ if (isInEnabledChain()
+ && (!gFocusMgr.getMouseCapture() || gFocusMgr.getMouseCapture() == this))
+ mNeedsHighlight = TRUE;
+
if (!childrenHandleHover(x, y, mask))
{
if (mMouseDownTimer.getStarted())
@@ -535,21 +575,37 @@ BOOL LLButton::handleHover(S32 x, S32 y, MASK mask)
return TRUE;
}
+void LLButton::getOverlayImageSize(S32& overlay_width, S32& overlay_height)
+{
+ overlay_width = mImageOverlay->getWidth();
+ overlay_height = mImageOverlay->getHeight();
+
+ F32 scale_factor = llmin((F32)getRect().getWidth() / (F32)overlay_width, (F32)getRect().getHeight() / (F32)overlay_height, 1.f);
+ overlay_width = llround((F32)overlay_width * scale_factor);
+ overlay_height = llround((F32)overlay_height * scale_factor);
+}
+
// virtual
void LLButton::draw()
{
- F32 alpha = getDrawContext().mAlpha;
+ static LLCachedControl<bool> sEnableButtonFlashing(*LLUI::sSettingGroups["config"], "EnableButtonFlashing", true);
+ F32 alpha = mUseDrawContextAlpha ? getDrawContext().mAlpha : getCurrentTransparency();
bool flash = FALSE;
- static LLUICachedControl<F32> button_flash_rate("ButtonFlashRate", 0);
- static LLUICachedControl<S32> button_flash_count("ButtonFlashCount", 0);
- if( mFlashing )
+ if( mFlashing)
{
- F32 elapsed = mFlashingTimer.getElapsedTimeF32();
- S32 flash_count = S32(elapsed * button_flash_rate * 2.f);
- // flash on or off?
- flash = (flash_count % 2 == 0) || flash_count > S32((F32)button_flash_count * 2.f);
+ if ( sEnableButtonFlashing)
+ {
+ F32 elapsed = mFlashingTimer.getElapsedTimeF32();
+ S32 flash_count = S32(elapsed * mButtonFlashRate * 2.f);
+ // flash on or off?
+ flash = (flash_count % 2 == 0) || flash_count > S32((F32)mButtonFlashCount * 2.f);
+ }
+ else
+ { // otherwise just highlight button in flash color
+ flash = true;
+ }
}
bool pressed_by_keyboard = FALSE;
@@ -578,7 +634,7 @@ void LLButton::draw()
LLColor4 glow_color = LLColor4::white;
LLRender::eBlendType glow_type = LLRender::BT_ADD_WITH_ALPHA;
LLUIImage* imagep = NULL;
- if (pressed)
+ if (pressed && mDisplayPressedState)
{
imagep = selected ? mImagePressedSelected : mImagePressed;
}
@@ -688,16 +744,7 @@ void LLButton::draw()
}
// Unselected label assignments
- LLWString label;
-
- if( getToggleState() )
- {
- label = mSelectedLabel;
- }
- else
- {
- label = mUnselectedLabel;
- }
+ LLWString label = getCurrentLabel();
// overlay with keyboard focus border
if (hasFocus())
@@ -762,18 +809,16 @@ void LLButton::draw()
if (mImageOverlay.notNull())
{
// get max width and height (discard level 0)
- S32 overlay_width = mImageOverlay->getWidth();
- S32 overlay_height = mImageOverlay->getHeight();
+ S32 overlay_width;
+ S32 overlay_height;
- F32 scale_factor = llmin((F32)getRect().getWidth() / (F32)overlay_width, (F32)getRect().getHeight() / (F32)overlay_height, 1.f);
- overlay_width = llround((F32)overlay_width * scale_factor);
- overlay_height = llround((F32)overlay_height * scale_factor);
+ getOverlayImageSize(overlay_width, overlay_height);
S32 center_x = getLocalRect().getCenterX();
S32 center_y = getLocalRect().getCenterY();
//FUGLY HACK FOR "DEPRESSED" BUTTONS
- if (pressed)
+ if (pressed && mDisplayPressedState)
{
center_y--;
center_x++;
@@ -784,7 +829,11 @@ void LLButton::draw()
LLColor4 overlay_color = mImageOverlayColor.get();
if (!enabled)
{
- overlay_color.mV[VALPHA] = 0.5f;
+ overlay_color = mImageOverlayDisabledColor.get();
+ }
+ else if (getToggleState())
+ {
+ overlay_color = mImageOverlaySelectedColor.get();
}
overlay_color.mV[VALPHA] *= alpha;
@@ -792,6 +841,7 @@ void LLButton::draw()
{
case LLFontGL::LEFT:
text_left += overlay_width + mImgOverlayLabelSpace;
+ text_width -= overlay_width + mImgOverlayLabelSpace;
mImageOverlay->draw(
mLeftHPad,
center_y - (overlay_height / 2),
@@ -809,6 +859,7 @@ void LLButton::draw()
break;
case LLFontGL::RIGHT:
text_right -= overlay_width + mImgOverlayLabelSpace;
+ text_width -= overlay_width + mImgOverlayLabelSpace;
mImageOverlay->draw(
getRect().getWidth() - mRightHPad - overlay_width,
center_y - (overlay_height / 2),
@@ -844,7 +895,7 @@ void LLButton::draw()
S32 y_offset = 2 + (getRect().getHeight() - 20)/2;
- if (pressed)
+ if (pressed && mDisplayPressedState)
{
y_offset--;
x++;
@@ -857,9 +908,9 @@ void LLButton::draw()
// Not sure if it is really needed. Probably S32_MAX should be always passed as max_chars.
mLastDrawCharsCount = mGLFont->render(label, 0,
(F32)x,
- (F32)(mBottomVPad + y_offset),
+ (F32)(getRect().getHeight() / 2 + mBottomVPad),
label_color % alpha,
- mHAlign, LLFontGL::BOTTOM,
+ mHAlign, LLFontGL::VCENTER,
LLFontGL::NORMAL,
mDropShadowedText ? LLFontGL::DROP_SHADOW_SOFT : LLFontGL::NO_SHADOW,
S32_MAX, text_width,
@@ -900,7 +951,7 @@ void LLButton::setToggleState(BOOL b)
void LLButton::setFlashing( BOOL b )
{
- if (b != mFlashing)
+ if ((bool)b != mFlashing)
{
mFlashing = b;
mFlashingTimer.reset();
@@ -940,6 +991,23 @@ void LLButton::setLabelSelected( const LLStringExplicit& label )
mSelectedLabel = label;
}
+bool LLButton::labelIsTruncated() const
+{
+ return getCurrentLabel().getString().size() > mLastDrawCharsCount;
+}
+
+const LLUIString& LLButton::getCurrentLabel() const
+{
+ if( getToggleState() )
+ {
+ return mSelectedLabel;
+ }
+ else
+ {
+ return mUnselectedLabel;
+ }
+}
+
void LLButton::setImageUnselected(LLPointer<LLUIImage> image)
{
mImageUnselected = image;
@@ -951,16 +1019,7 @@ void LLButton::setImageUnselected(LLPointer<LLUIImage> image)
void LLButton::autoResize()
{
- LLUIString label;
- if(getToggleState())
- {
- label = mSelectedLabel;
- }
- else
- {
- label = mUnselectedLabel;
- }
- resize(label);
+ resize(getCurrentLabel());
}
void LLButton::resize(LLUIString label)
@@ -970,11 +1029,32 @@ void LLButton::resize(LLUIString label)
// get current btn length
S32 btn_width =getRect().getWidth();
// check if it need resize
- if (mAutoResize == TRUE)
+ if (mAutoResize)
{
- if (btn_width - (mRightHPad + mLeftHPad) < label_width)
+ S32 min_width = label_width + mLeftHPad + mRightHPad;
+ if (mImageOverlay)
+ {
+ S32 overlay_width = mImageOverlay->getWidth();
+ F32 scale_factor = (getRect().getHeight() - (mImageOverlayBottomPad + mImageOverlayTopPad)) / (F32)mImageOverlay->getHeight();
+ overlay_width = llround((F32)overlay_width * scale_factor);
+
+ switch(mImageOverlayAlignment)
+ {
+ case LLFontGL::LEFT:
+ case LLFontGL::RIGHT:
+ min_width += overlay_width + mImgOverlayLabelSpace;
+ break;
+ case LLFontGL::HCENTER:
+ min_width = llmax(min_width, overlay_width + mLeftHPad + mRightHPad);
+ break;
+ default:
+ // draw nothing
+ break;
+ }
+ }
+ if (btn_width < min_width)
{
- setRect(LLRect( getRect().mLeft, getRect().mTop, getRect().mLeft + label_width + mLeftHPad + mRightHPad , getRect().mBottom));
+ reshape(min_width, getRect().getHeight());
}
}
}
@@ -1121,7 +1201,7 @@ void LLButton::setFloaterToggle(LLUICtrl* ctrl, const LLSD& sdname)
// Set the button control value (toggle state) to the floater visibility control (Sets the value as well)
button->setControlVariable(LLFloater::getControlGroup()->getControl(vis_control_name));
// Set the clicked callback to toggle the floater
- button->setClickedCallback(boost::bind(&LLFloaterReg::toggleFloaterInstance, sdname));
+ button->setClickedCallback(boost::bind(&LLFloaterReg::toggleInstance, sdname, LLSD()));
}
// static
@@ -1162,7 +1242,6 @@ void LLButton::resetMouseDownTimer()
mMouseDownTimer.reset();
}
-
BOOL LLButton::handleDoubleClick(S32 x, S32 y, MASK mask)
{
// just treat a double click as a second click
diff --git a/indra/llui/llbutton.h b/indra/llui/llbutton.h
index 2d5fefa78c..deaa0823c6 100644
--- a/indra/llui/llbutton.h
+++ b/indra/llui/llbutton.h
@@ -28,6 +28,7 @@
#define LL_LLBUTTON_H
#include "lluuid.h"
+#include "llbadgeowner.h"
#include "llcontrol.h"
#include "lluictrl.h"
#include "v4color.h"
@@ -59,7 +60,7 @@ class LLUICtrlFactory;
//
class LLButton
-: public LLUICtrl
+: public LLUICtrl, public LLBadgeOwner
{
public:
struct Params
@@ -90,10 +91,11 @@ public:
label_color_selected,
label_color_disabled,
label_color_disabled_selected,
- highlight_color,
image_color,
image_color_disabled,
image_overlay_color,
+ image_overlay_selected_color,
+ image_overlay_disabled_color,
flash_color;
// layout
@@ -119,11 +121,21 @@ public:
// misc
Optional<bool> is_toggle,
scale_image,
- commit_on_return;
+ commit_on_return,
+ display_pressed_state;
Optional<F32> hover_glow_amount;
Optional<TimeIntervalParam> held_down_delay;
+ Optional<bool> use_draw_context_alpha;
+
+ Optional<LLBadge::Params> badge;
+
+ Optional<bool> handle_right_mouse;
+
+ Optional<S32> button_flash_count;
+ Optional<F32> button_flash_rate;
+
Params();
};
@@ -150,7 +162,6 @@ public:
virtual void draw();
/*virtual*/ BOOL postBuild();
- virtual void onMouseEnter(S32 x, S32 y, MASK mask);
virtual void onMouseLeave(S32 x, S32 y, MASK mask);
virtual void onMouseCaptureLost();
@@ -161,6 +172,11 @@ public:
void setUseEllipses( BOOL use_ellipses ) { mUseEllipses = use_ellipses; }
+ boost::signals2::connection setClickedCallback(const CommitCallbackParam& cb);
+ boost::signals2::connection setMouseDownCallback(const CommitCallbackParam& cb);
+ boost::signals2::connection setMouseUpCallback(const CommitCallbackParam& cb);
+ boost::signals2::connection setHeldDownCallback(const CommitCallbackParam& cb);
+
boost::signals2::connection setClickedCallback( const commit_signal_t::slot_type& cb ); // mouse down and up within button
boost::signals2::connection setMouseDownCallback( const commit_signal_t::slot_type& cb );
boost::signals2::connection setMouseUpCallback( const commit_signal_t::slot_type& cb ); // mouse up, EVEN IF NOT IN BUTTON
@@ -228,6 +244,8 @@ public:
S32 getLastDrawCharsCount() const { return mLastDrawCharsCount; }
+ bool labelIsTruncated() const;
+ const LLUIString& getCurrentLabel() const;
void setScaleImage(BOOL scale) { mScaleImage = scale; }
BOOL getScaleImage() const { return mScaleImage; }
@@ -246,7 +264,7 @@ public:
void setImageDisabledSelected(LLPointer<LLUIImage> image);
void setImageFlash(LLPointer<LLUIImage> image);
void setImagePressed(LLPointer<LLUIImage> image);
-
+
void setCommitOnReturn(BOOL commit) { mCommitOnReturn = commit; }
BOOL getCommitOnReturn() const { return mCommitOnReturn; }
@@ -263,14 +281,16 @@ public:
protected:
LLPointer<LLUIImage> getImageUnselected() const { return mImageUnselected; }
LLPointer<LLUIImage> getImageSelected() const { return mImageSelected; }
+ void getOverlayImageSize(S32& overlay_width, S32& overlay_height);
LLFrameTimer mMouseDownTimer;
+ bool mNeedsHighlight;
+ S32 mButtonFlashCount;
+ F32 mButtonFlashRate;
-private:
void drawBorder(LLUIImage* imagep, const LLColor4& color, S32 size);
void resetMouseDownTimer();
-private:
commit_signal_t* mMouseDownSignal;
commit_signal_t* mMouseUpSignal;
commit_signal_t* mHeldDownSignal;
@@ -286,6 +306,8 @@ private:
LLPointer<LLUIImage> mImageOverlay;
LLFontGL::HAlign mImageOverlayAlignment;
LLUIColor mImageOverlayColor;
+ LLUIColor mImageOverlaySelectedColor;
+ LLUIColor mImageOverlayDisabledColor;
LLPointer<LLUIImage> mImageUnselected;
LLUIString mUnselectedLabel;
@@ -314,21 +336,19 @@ private:
flash icon name is set in attributes(by default it isn't). First way is used otherwise. */
LLPointer<LLUIImage> mImageFlash;
- LLUIColor mHighlightColor;
LLUIColor mFlashBgColor;
LLUIColor mImageColor;
LLUIColor mDisabledImageColor;
- BOOL mIsToggle;
- BOOL mScaleImage;
-
- BOOL mDropShadowedText;
- BOOL mAutoResize;
- BOOL mUseEllipses;
- BOOL mBorderEnabled;
+ bool mIsToggle;
+ bool mScaleImage;
- BOOL mFlashing;
+ bool mDropShadowedText;
+ bool mAutoResize;
+ bool mUseEllipses;
+ bool mBorderEnabled;
+ bool mFlashing;
LLFontGL::HAlign mHAlign;
S32 mLeftHPad;
@@ -338,6 +358,8 @@ private:
S32 mImageOverlayTopPad;
S32 mImageOverlayBottomPad;
+ bool mUseDrawContextAlpha;
+
/*
* Space between image_overlay and label
*/
@@ -346,12 +368,14 @@ private:
F32 mHoverGlowStrength;
F32 mCurGlowStrength;
- BOOL mNeedsHighlight;
- BOOL mCommitOnReturn;
- BOOL mFadeWhenDisabled;
+ bool mCommitOnReturn;
+ bool mFadeWhenDisabled;
bool mForcePressedState;
+ bool mDisplayPressedState;
LLFrameTimer mFlashingTimer;
+
+ bool mHandleRightMouse;
};
// Build time optimization, generate once in .cpp file
diff --git a/indra/llui/llcheckboxctrl.cpp b/indra/llui/llcheckboxctrl.cpp
index bbd8db2645..4fe444c1a4 100644
--- a/indra/llui/llcheckboxctrl.cpp
+++ b/indra/llui/llcheckboxctrl.cpp
@@ -88,27 +88,19 @@ LLCheckBoxCtrl::LLCheckBoxCtrl(const LLCheckBoxCtrl::Params& p)
tbparams.font(p.font);
}
mLabel = LLUICtrlFactory::create<LLTextBox> (tbparams);
+ mLabel->reshapeToFitText();
addChild(mLabel);
- S32 text_width = mLabel->getTextBoundingRect().getWidth();
- S32 text_height = llround(mFont->getLineHeight());
- LLRect label_rect;
- label_rect.setOriginAndSize(
- llcheckboxctrl_hpad + llcheckboxctrl_btn_size + llcheckboxctrl_spacing,
- llcheckboxctrl_vpad + 1, // padding to get better alignment
- text_width + llcheckboxctrl_hpad,
- text_height );
- mLabel->setShape(label_rect);
-
+ LLRect label_rect = mLabel->getRect();
// Button
// Note: button cover the label by extending all the way to the right.
- LLRect btn_rect;
+ LLRect btn_rect = p.check_button.rect();
btn_rect.setOriginAndSize(
- llcheckboxctrl_hpad,
- llcheckboxctrl_vpad,
- llcheckboxctrl_btn_size + llcheckboxctrl_spacing + text_width + llcheckboxctrl_hpad,
- llmax( text_height, llcheckboxctrl_btn_size() ) + llcheckboxctrl_vpad);
+ btn_rect.mLeft,
+ btn_rect.mBottom,
+ llmax(btn_rect.mRight, label_rect.mRight - btn_rect.mLeft),
+ llmax( label_rect.getHeight(), btn_rect.mTop));
std::string active_true_id, active_false_id;
std::string inactive_true_id, inactive_false_id;
@@ -174,31 +166,20 @@ void LLCheckBoxCtrl::clear()
void LLCheckBoxCtrl::reshape(S32 width, S32 height, BOOL called_from_parent)
{
- //stretch or shrink bounding rectangle of label when rebuilding UI at new scale
- static LLUICachedControl<S32> llcheckboxctrl_spacing ("UICheckboxctrlSpacing", 0);
- static LLUICachedControl<S32> llcheckboxctrl_hpad ("UICheckboxctrlHPad", 0);
- static LLUICachedControl<S32> llcheckboxctrl_vpad ("UICheckboxctrlVPad", 0);
- static LLUICachedControl<S32> llcheckboxctrl_btn_size ("UICheckboxctrlBtnSize", 0);
- S32 text_width = mLabel->getTextBoundingRect().getWidth();
- S32 text_height = llround(mFont->getLineHeight());
- LLRect label_rect;
- label_rect.setOriginAndSize(
- llcheckboxctrl_hpad + llcheckboxctrl_btn_size + llcheckboxctrl_spacing,
- llcheckboxctrl_vpad,
- text_width,
- text_height );
- mLabel->setShape(label_rect);
-
- LLRect btn_rect;
+ mLabel->reshapeToFitText();
+
+ LLRect label_rect = mLabel->getRect();
+
+ // Button
+ // Note: button cover the label by extending all the way to the right.
+ LLRect btn_rect = mButton->getRect();
btn_rect.setOriginAndSize(
- llcheckboxctrl_hpad,
- llcheckboxctrl_vpad,
- llcheckboxctrl_btn_size + llcheckboxctrl_spacing + text_width,
- llmax( text_height, llcheckboxctrl_btn_size() ) );
- mButton->setShape( btn_rect );
-
- LLUICtrl::reshape(width, height, called_from_parent);
+ btn_rect.mLeft,
+ btn_rect.mBottom,
+ llmax(btn_rect.getWidth(), label_rect.mRight - btn_rect.mLeft),
+ llmax(label_rect.mTop - btn_rect.mBottom, btn_rect.getHeight()));
+ mButton->setShape(btn_rect);
}
//virtual
diff --git a/indra/llui/llclipboard.cpp b/indra/llui/llclipboard.cpp
index 984c4ec5fb..14173fdbb0 100644
--- a/indra/llui/llclipboard.cpp
+++ b/indra/llui/llclipboard.cpp
@@ -34,103 +34,113 @@
#include "llview.h"
#include "llwindow.h"
-// Global singleton
-LLClipboard gClipboard;
-
-
-LLClipboard::LLClipboard()
+LLClipboard::LLClipboard() :
+ mGeneration(0)
{
+ reset();
}
-
LLClipboard::~LLClipboard()
{
+ reset();
}
-
-void LLClipboard::copyFromSubstring(const LLWString &src, S32 pos, S32 len, const LLUUID& source_id )
+void LLClipboard::reset()
{
- mSourceID = source_id;
- mString = src.substr(pos, len);
- LLView::getWindow()->copyTextToClipboard( mString );
+ // Increment the clipboard count
+ mGeneration++;
+ // Clear the clipboard
+ mObjects.clear();
+ mCutMode = false;
+ mString = LLWString();
}
-void LLClipboard::copyFromString(const LLWString &src, const LLUUID& source_id )
+// Copy the input uuid to the LL clipboard
+bool LLClipboard::copyToClipboard(const LLUUID& src, const LLAssetType::EType type)
{
- mSourceID = source_id;
- mString = src;
- LLView::getWindow()->copyTextToClipboard( mString );
+ reset();
+ return addToClipboard(src, type);
}
-const LLWString& LLClipboard::getPasteWString( LLUUID* source_id )
+// Add the input uuid to the LL clipboard
+// Convert the uuid to string and concatenate that string to the system clipboard if legit
+bool LLClipboard::addToClipboard(const LLUUID& src, const LLAssetType::EType type)
{
- if( mSourceID.notNull() )
+ bool res = false;
+ if (src.notNull())
{
- LLWString temp_string;
- LLView::getWindow()->pasteTextFromClipboard(temp_string);
-
- if( temp_string != mString )
+ res = true;
+ if (LLAssetType::lookupIsAssetIDKnowable(type))
{
- mSourceID.setNull();
- mString = temp_string;
+ LLWString source = utf8str_to_wstring(src.asString());
+ res = addToClipboard(source, 0, source.size());
+ }
+ if (res)
+ {
+ mObjects.push_back(src);
+ mGeneration++;
}
}
- else
- {
- LLView::getWindow()->pasteTextFromClipboard(mString);
- }
+ return res;
+}
- if( source_id )
+bool LLClipboard::pasteFromClipboard(std::vector<LLUUID>& inv_objects) const
+{
+ bool res = false;
+ S32 count = mObjects.size();
+ if (count > 0)
{
- *source_id = mSourceID;
+ res = true;
+ inv_objects.clear();
+ for (S32 i = 0; i < count; i++)
+ {
+ inv_objects.push_back(mObjects[i]);
+ }
}
-
- return mString;
+ return res;
}
+// Returns true if the LL Clipboard has pasteable items in it
+bool LLClipboard::hasContents() const
+{
+ return (mObjects.size() > 0);
+}
-BOOL LLClipboard::canPasteString() const
+// Returns true if the input uuid is in the list of clipboard objects
+bool LLClipboard::isOnClipboard(const LLUUID& object) const
{
- return LLView::getWindow()->isClipboardTextAvailable();
+ std::vector<LLUUID>::const_iterator iter = std::find(mObjects.begin(), mObjects.end(), object);
+ return (iter != mObjects.end());
}
+// Copy the input string to the LL and the system clipboard
+bool LLClipboard::copyToClipboard(const LLWString &src, S32 pos, S32 len, bool use_primary)
+{
+ return addToClipboard(src, pos, len, use_primary);
+}
-void LLClipboard::copyFromPrimarySubstring(const LLWString &src, S32 pos, S32 len, const LLUUID& source_id )
+// Concatenate the input string to the LL and the system clipboard
+bool LLClipboard::addToClipboard(const LLWString &src, S32 pos, S32 len, bool use_primary)
{
- mSourceID = source_id;
mString = src.substr(pos, len);
- LLView::getWindow()->copyTextToPrimary( mString );
+ return (use_primary ? LLView::getWindow()->copyTextToPrimary(mString) : LLView::getWindow()->copyTextToClipboard(mString));
}
-
-const LLWString& LLClipboard::getPastePrimaryWString( LLUUID* source_id )
+// Copy the System clipboard to the output string.
+// Manage the LL Clipboard / System clipboard consistency
+bool LLClipboard::pasteFromClipboard(LLWString &dst, bool use_primary)
{
- if( mSourceID.notNull() )
+ bool res = (use_primary ? LLView::getWindow()->pasteTextFromPrimary(dst) : LLView::getWindow()->pasteTextFromClipboard(dst));
+ if (res)
{
- LLWString temp_string;
- LLView::getWindow()->pasteTextFromPrimary(temp_string);
-
- if( temp_string != mString )
- {
- mSourceID.setNull();
- mString = temp_string;
- }
+ mString = dst;
}
- else
- {
- LLView::getWindow()->pasteTextFromPrimary(mString);
- }
-
- if( source_id )
- {
- *source_id = mSourceID;
- }
-
- return mString;
+ return res;
}
-
-BOOL LLClipboard::canPastePrimaryString() const
+// Return true if there's something on the System clipboard
+bool LLClipboard::isTextAvailable(bool use_primary) const
{
- return LLView::getWindow()->isPrimaryTextAvailable();
+ return (use_primary ? LLView::getWindow()->isPrimaryTextAvailable() : LLView::getWindow()->isClipboardTextAvailable());
}
+
diff --git a/indra/llui/llclipboard.h b/indra/llui/llclipboard.h
index 24cb46c3f4..fd2e7610df 100644
--- a/indra/llui/llclipboard.h
+++ b/indra/llui/llclipboard.h
@@ -27,39 +27,68 @@
#ifndef LL_LLCLIPBOARD_H
#define LL_LLCLIPBOARD_H
+#include <boost/function.hpp>
#include "llstring.h"
#include "lluuid.h"
+#include "stdenums.h"
+#include "llsingleton.h"
+#include "llassettype.h"
+#include "llinventory.h"
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLClipboard
+//
+// This class is used to cut/copy/paste text strings and inventory items around
+// the world. Use LLClipboard::instance().method() to use its methods.
+// Note that the text and UUIDs are loosely coupled only. There are few cases
+// where the viewer does offer a serialized version of the UUID on the clipboard.
+// In those case, the text is overridden when copying/cutting the item.
+// In all other cases, the text and the UUIDs are very much independent.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-class LLClipboard
+class LLClipboard : public LLSingleton<LLClipboard>
{
public:
LLClipboard();
~LLClipboard();
+
+ // Clears the clipboard
+ void reset();
+ // Returns the state of the clipboard so client can know if it has been modified (comparing with tracked state)
+ int getGeneration() const { return mGeneration; }
- /* We support two flavors of clipboard. The default is the explicitly
- copy-and-pasted clipboard. The second is the so-called 'primary' clipboard
- which is implicitly copied upon selection on platforms which expect this
- (i.e. X11/Linux). */
+ // Text strings management:
+ // ------------------------
+ // We support two flavors of text clipboards. The default is the explicitly
+ // copy-and-pasted clipboard. The second is the so-called 'primary' clipboard
+ // which is implicitly copied upon selection on platforms which expect this
+ // (i.e. X11/Linux, Mac).
+ bool copyToClipboard(const LLWString& src, S32 pos, S32 len, bool use_primary = false);
+ bool addToClipboard(const LLWString& src, S32 pos, S32 len, bool use_primary = false);
+ bool pasteFromClipboard(LLWString& dst, bool use_primary = false);
+ bool isTextAvailable(bool use_primary = false) const;
+
+ // Object list management:
+ // -----------------------
+ // Clears and adds one single object to the clipboard
+ bool copyToClipboard(const LLUUID& src, const LLAssetType::EType type = LLAssetType::AT_NONE);
+ // Adds one object to the current list of objects on the clipboard
+ bool addToClipboard(const LLUUID& src, const LLAssetType::EType type = LLAssetType::AT_NONE);
+ // Gets a copy of the objects on the clipboard
+ bool pasteFromClipboard(std::vector<LLUUID>& inventory_objects) const;
+
+ bool hasContents() const; // True if the clipboard has pasteable objects
+ bool isOnClipboard(const LLUUID& object) const; // True if the input object uuid is on the clipboard
- void copyFromSubstring(const LLWString &copy_from, S32 pos, S32 len, const LLUUID& source_id = LLUUID::null );
- void copyFromString(const LLWString &copy_from, const LLUUID& source_id = LLUUID::null );
- BOOL canPasteString() const;
- const LLWString& getPasteWString(LLUUID* source_id = NULL);
-
- void copyFromPrimarySubstring(const LLWString &copy_from, S32 pos, S32 len, const LLUUID& source_id = LLUUID::null );
- BOOL canPastePrimaryString() const;
- const LLWString& getPastePrimaryWString(LLUUID* source_id = NULL);
+ bool isCutMode() const { return mCutMode; }
+ void setCutMode(bool mode) { mCutMode = mode; mGeneration++; }
private:
- LLUUID mSourceID;
- LLWString mString;
+ std::vector<LLUUID> mObjects; // Objects on the clipboard. Can be empty while mString contains something licit (e.g. text from chat)
+ LLWString mString; // The text string. If mObjects is not empty, this string is reflecting them (UUIDs for the moment) if the asset type is knowable.
+ bool mCutMode; // This is a convenience flag for the viewer.
+ int mGeneration; // Incremented when the clipboard changes so that interested parties can check for changes on the clipboard.
};
-
-// Global singleton
-extern LLClipboard gClipboard;
-
-
#endif // LL_LLCLIPBOARD_H
diff --git a/indra/llui/llcombobox.cpp b/indra/llui/llcombobox.cpp
index 2dabbc7767..806d2ef3f6 100644
--- a/indra/llui/llcombobox.cpp
+++ b/indra/llui/llcombobox.cpp
@@ -94,6 +94,7 @@ LLComboBox::LLComboBox(const LLComboBox::Params& p)
mMaxChars(p.max_chars),
mPrearrangeCallback(p.prearrange_callback()),
mTextEntryCallback(p.text_entry_callback()),
+ mTextChangedCallback(p.text_changed_callback()),
mListPosition(p.list_position),
mLastSelectedIndex(-1),
mLabel(p.label)
@@ -230,6 +231,10 @@ void LLComboBox::resetDirty()
}
}
+bool LLComboBox::itemExists(const std::string& name)
+{
+ return mList->getItemByLabel(name);
+}
// add item "name" to menu
LLScrollListItem* LLComboBox::add(const std::string& name, EAddPosition pos, BOOL enabled)
@@ -315,7 +320,7 @@ void LLComboBox::setValue(const LLSD& value)
LLScrollListItem* item = mList->getFirstSelected();
if (item)
{
- setLabel(getSelectedItemLabel());
+ updateLabel();
}
mLastSelectedIndex = mList->getFirstSelectedIndex();
}
@@ -383,6 +388,23 @@ void LLComboBox::setLabel(const LLStringExplicit& name)
}
}
+void LLComboBox::updateLabel()
+{
+ // Update the combo editor with the selected
+ // item label.
+ if (mTextEntry)
+ {
+ mTextEntry->setText(getSelectedItemLabel());
+ mTextEntry->setTentative(FALSE);
+ }
+
+ // If combo box doesn't allow text entry update
+ // the combo button label.
+ if (!mAllowTextEntry)
+ {
+ mButton->setLabel(getSelectedItemLabel());
+ }
+}
BOOL LLComboBox::remove(const std::string& name)
{
@@ -503,15 +525,12 @@ void LLComboBox::createLineEditor(const LLComboBox::Params& p)
else
{
mButton->setRect(rect);
- mButton->setTabStop(TRUE);
- mButton->setHAlign(LLFontGL::LEFT);
mButton->setLabel(mLabel.getString());
if (mTextEntry)
{
mTextEntry->setVisible(FALSE);
}
- mButton->setFollowsAll();
}
}
@@ -594,7 +613,7 @@ void LLComboBox::showList()
}
mList->setOrigin(rect.mLeft, rect.mBottom);
mList->reshape(rect.getWidth(), rect.getHeight());
- mList->translateIntoRect(root_view_local, FALSE);
+ mList->translateIntoRect(root_view_local);
// Make sure we didn't go off bottom of screen
S32 x, y;
@@ -700,13 +719,13 @@ void LLComboBox::onItemSelected(const LLSD& data)
mLastSelectedIndex = getCurrentIndex();
if (mLastSelectedIndex != -1)
{
- setLabel(getSelectedItemLabel());
+ updateLabel();
if (mAllowTextEntry)
- {
- gFocusMgr.setKeyboardFocus(mTextEntry);
- mTextEntry->selectAll();
- }
+ {
+ gFocusMgr.setKeyboardFocus(mTextEntry);
+ mTextEntry->selectAll();
+ }
}
// hiding the list reasserts the old value stored in the text editor/dropdown button
hideList();
@@ -769,7 +788,10 @@ BOOL LLComboBox::handleKeyHere(KEY key, MASK mask)
return FALSE;
}
// if selection has changed, pop open list
- else if (mList->getLastSelectedItem() != last_selected_item)
+ else if (mList->getLastSelectedItem() != last_selected_item
+ || ((key == KEY_DOWN || key == KEY_UP)
+ && mList->getCanSelect()
+ && !mList->isEmpty()))
{
showList();
}
@@ -833,6 +855,10 @@ void LLComboBox::onTextEntry(LLLineEditor* line_editor)
mList->deselectAllItems();
mLastSelectedIndex = -1;
}
+ if (mTextChangedCallback != NULL)
+ {
+ (mTextChangedCallback)(line_editor, LLSD());
+ }
return;
}
@@ -877,6 +903,10 @@ void LLComboBox::onTextEntry(LLLineEditor* line_editor)
// RN: presumably text entry
updateSelection();
}
+ if (mTextChangedCallback != NULL)
+ {
+ (mTextChangedCallback)(line_editor, LLSD());
+ }
}
void LLComboBox::updateSelection()
diff --git a/indra/llui/llcombobox.h b/indra/llui/llcombobox.h
index 5f0e4a6843..64dbaea306 100644
--- a/indra/llui/llcombobox.h
+++ b/indra/llui/llcombobox.h
@@ -73,7 +73,8 @@ public:
allow_new_values;
Optional<S32> max_chars;
Optional<commit_callback_t> prearrange_callback,
- text_entry_callback;
+ text_entry_callback,
+ text_changed_callback;
Optional<EPreferredPosition, PreferredPositionValues> list_position;
@@ -133,6 +134,7 @@ public:
LLScrollListItem* addSeparator(EAddPosition pos = ADD_BOTTOM);
BOOL remove( S32 index ); // remove item by index, return TRUE if found and removed
void removeall() { clearRows(); }
+ bool itemExists(const std::string& name);
void sortByName(BOOL ascending = TRUE); // Sort the entries in the combobox by name
@@ -147,6 +149,9 @@ public:
// This is probably a UI abuse.
void setLabel(const LLStringExplicit& name);
+ // Updates the combobox label to match the selected list item.
+ void updateLabel();
+
BOOL remove(const std::string& name); // remove item "name", return TRUE if found and removed
BOOL setCurrentByIndex( S32 index );
@@ -190,6 +195,7 @@ public:
void setPrearrangeCallback( commit_callback_t cb ) { mPrearrangeCallback = cb; }
void setTextEntryCallback( commit_callback_t cb ) { mTextEntryCallback = cb; }
+ void setTextChangedCallback( commit_callback_t cb ) { mTextChangedCallback = cb; }
void setButtonVisible(BOOL visible);
@@ -220,6 +226,7 @@ private:
BOOL mTextEntryTentative;
commit_callback_t mPrearrangeCallback;
commit_callback_t mTextEntryCallback;
+ commit_callback_t mTextChangedCallback;
commit_callback_t mSelectionCallback;
boost::signals2::connection mTopLostSignalConnection;
S32 mLastSelectedIndex;
diff --git a/indra/llui/llcommandmanager.cpp b/indra/llui/llcommandmanager.cpp
new file mode 100644
index 0000000000..0e2f3f1961
--- /dev/null
+++ b/indra/llui/llcommandmanager.cpp
@@ -0,0 +1,172 @@
+/**
+ * @file llcommandmanager.cpp
+ * @brief LLCommandManager class
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+// A control that displays the name of the chosen item, which when
+// clicked shows a scrolling box of options.
+
+#include "linden_common.h"
+
+#include "llcommandmanager.h"
+#include "lldir.h"
+#include "llerror.h"
+#include "llxuiparser.h"
+
+#include <boost/foreach.hpp>
+
+
+//
+// LLCommandId class
+//
+
+const LLCommandId LLCommandId::null = LLCommandId("null command");
+
+//
+// LLCommand class
+//
+
+LLCommand::Params::Params()
+ : available_in_toybox("available_in_toybox", false)
+ , icon("icon")
+ , label_ref("label_ref")
+ , name("name")
+ , tooltip_ref("tooltip_ref")
+ , execute_function("execute_function")
+ , execute_parameters("execute_parameters")
+ , execute_stop_function("execute_stop_function")
+ , execute_stop_parameters("execute_stop_parameters")
+ , is_enabled_function("is_enabled_function")
+ , is_enabled_parameters("is_enabled_parameters")
+ , is_running_function("is_running_function")
+ , is_running_parameters("is_running_parameters")
+ , is_starting_function("is_starting_function")
+ , is_starting_parameters("is_starting_parameters")
+{
+}
+
+LLCommand::LLCommand(const LLCommand::Params& p)
+ : mIdentifier(p.name)
+ , mAvailableInToybox(p.available_in_toybox)
+ , mIcon(p.icon)
+ , mLabelRef(p.label_ref)
+ , mName(p.name)
+ , mTooltipRef(p.tooltip_ref)
+ , mExecuteFunction(p.execute_function)
+ , mExecuteParameters(p.execute_parameters)
+ , mExecuteStopFunction(p.execute_stop_function)
+ , mExecuteStopParameters(p.execute_stop_parameters)
+ , mIsEnabledFunction(p.is_enabled_function)
+ , mIsEnabledParameters(p.is_enabled_parameters)
+ , mIsRunningFunction(p.is_running_function)
+ , mIsRunningParameters(p.is_running_parameters)
+ , mIsStartingFunction(p.is_starting_function)
+ , mIsStartingParameters(p.is_starting_parameters)
+{
+}
+
+
+//
+// LLCommandManager class
+//
+
+LLCommandManager::LLCommandManager()
+{
+}
+
+LLCommandManager::~LLCommandManager()
+{
+ for (CommandVector::iterator cmdIt = mCommands.begin(); cmdIt != mCommands.end(); ++cmdIt)
+ {
+ LLCommand * command = *cmdIt;
+
+ delete command;
+ }
+}
+
+U32 LLCommandManager::commandCount() const
+{
+ return mCommands.size();
+}
+
+LLCommand * LLCommandManager::getCommand(U32 commandIndex)
+{
+ return mCommands[commandIndex];
+}
+
+LLCommand * LLCommandManager::getCommand(const LLCommandId& commandId)
+{
+ LLCommand * command_match = NULL;
+
+ CommandIndexMap::const_iterator found = mCommandIndices.find(commandId.uuid());
+
+ if (found != mCommandIndices.end())
+ {
+ command_match = mCommands[found->second];
+ }
+
+ return command_match;
+}
+
+void LLCommandManager::addCommand(LLCommand * command)
+{
+ LLCommandId command_id = command->id();
+ mCommandIndices[command_id.uuid()] = mCommands.size();
+ mCommands.push_back(command);
+
+ lldebugs << "Successfully added command: " << command->name() << llendl;
+}
+
+//static
+bool LLCommandManager::load()
+{
+ LLCommandManager& mgr = LLCommandManager::instance();
+
+ std::string commands_file = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "commands.xml");
+
+ LLCommandManager::Params commandsParams;
+
+ LLSimpleXUIParser parser;
+
+ if (!parser.readXUI(commands_file, commandsParams))
+ {
+ llerrs << "Unable to load xml file: " << commands_file << llendl;
+ return false;
+ }
+
+ if (!commandsParams.validateBlock())
+ {
+ llerrs << "Invalid commands file: " << commands_file << llendl;
+ return false;
+ }
+
+ BOOST_FOREACH(LLCommand::Params& commandParams, commandsParams.commands)
+ {
+ LLCommand * command = new LLCommand(commandParams);
+
+ mgr.addCommand(command);
+ }
+
+ return true;
+}
diff --git a/indra/llui/llcommandmanager.h b/indra/llui/llcommandmanager.h
new file mode 100644
index 0000000000..a7276a48aa
--- /dev/null
+++ b/indra/llui/llcommandmanager.h
@@ -0,0 +1,202 @@
+/**
+ * @file llcommandmanager.h
+ * @brief LLCommandManager class to hold commands
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLCOMMANDMANAGER_H
+#define LL_LLCOMMANDMANAGER_H
+
+#include "llinitparam.h"
+#include "llsingleton.h"
+
+
+class LLCommand;
+class LLCommandManager;
+
+
+class LLCommandId
+{
+public:
+ friend class LLCommand;
+ friend class LLCommandManager;
+
+ struct Params : public LLInitParam::Block<Params>
+ {
+ Mandatory<std::string> name;
+
+ Params()
+ : name("name")
+ {}
+ };
+
+ LLCommandId(const std::string& name)
+ {
+ mUUID = LLUUID::generateNewID(name);
+ }
+
+ LLCommandId(const Params& p)
+ {
+ mUUID = LLUUID::generateNewID(p.name);
+ }
+
+ LLCommandId(const LLUUID& uuid)
+ : mUUID(uuid)
+ {}
+
+ const LLUUID& uuid() const { return mUUID; }
+
+ bool operator!=(const LLCommandId& command) const
+ {
+ return (mUUID != command.mUUID);
+ }
+
+ bool operator==(const LLCommandId& command) const
+ {
+ return (mUUID == command.mUUID);
+ }
+
+ static const LLCommandId null;
+
+private:
+ LLUUID mUUID;
+};
+
+typedef std::list<LLCommandId> command_id_list_t;
+
+
+class LLCommand
+{
+public:
+ struct Params : public LLInitParam::Block<Params>
+ {
+ Mandatory<bool> available_in_toybox;
+ Mandatory<std::string> icon;
+ Mandatory<std::string> label_ref;
+ Mandatory<std::string> name;
+ Mandatory<std::string> tooltip_ref;
+
+ Mandatory<std::string> execute_function;
+ Optional<LLSD> execute_parameters;
+
+ Optional<std::string> execute_stop_function;
+ Optional<LLSD> execute_stop_parameters;
+
+ Optional<std::string> is_enabled_function;
+ Optional<LLSD> is_enabled_parameters;
+
+ Optional<std::string> is_running_function;
+ Optional<LLSD> is_running_parameters;
+
+ Optional<std::string> is_starting_function;
+ Optional<LLSD> is_starting_parameters;
+
+ Params();
+ };
+
+ LLCommand(const LLCommand::Params& p);
+
+ const bool availableInToybox() const { return mAvailableInToybox; }
+ const std::string& icon() const { return mIcon; }
+ const LLCommandId& id() const { return mIdentifier; }
+ const std::string& labelRef() const { return mLabelRef; }
+ const std::string& name() const { return mName; }
+ const std::string& tooltipRef() const { return mTooltipRef; }
+
+ const std::string& executeFunctionName() const { return mExecuteFunction; }
+ const LLSD& executeParameters() const { return mExecuteParameters; }
+
+ const std::string& executeStopFunctionName() const { return mExecuteStopFunction; }
+ const LLSD& executeStopParameters() const { return mExecuteStopParameters; }
+
+ const std::string& isEnabledFunctionName() const { return mIsEnabledFunction; }
+ const LLSD& isEnabledParameters() const { return mIsEnabledParameters; }
+
+ const std::string& isRunningFunctionName() const { return mIsRunningFunction; }
+ const LLSD& isRunningParameters() const { return mIsRunningParameters; }
+
+ const std::string& isStartingFunctionName() const { return mIsStartingFunction; }
+ const LLSD& isStartingParameters() const { return mIsStartingParameters; }
+
+private:
+ LLCommandId mIdentifier;
+
+ bool mAvailableInToybox;
+ std::string mIcon;
+ std::string mLabelRef;
+ std::string mName;
+ std::string mTooltipRef;
+
+ std::string mExecuteFunction;
+ LLSD mExecuteParameters;
+
+ std::string mExecuteStopFunction;
+ LLSD mExecuteStopParameters;
+
+ std::string mIsEnabledFunction;
+ LLSD mIsEnabledParameters;
+
+ std::string mIsRunningFunction;
+ LLSD mIsRunningParameters;
+
+ std::string mIsStartingFunction;
+ LLSD mIsStartingParameters;
+};
+
+
+class LLCommandManager
+: public LLSingleton<LLCommandManager>
+{
+public:
+ struct Params : public LLInitParam::Block<Params>
+ {
+ Multiple< LLCommand::Params, AtLeast<1> > commands;
+
+ Params()
+ : commands("command")
+ {
+ }
+ };
+
+ LLCommandManager();
+ ~LLCommandManager();
+
+ U32 commandCount() const;
+ LLCommand * getCommand(U32 commandIndex);
+ LLCommand * getCommand(const LLCommandId& commandId);
+
+ static bool load();
+
+protected:
+ void addCommand(LLCommand * command);
+
+private:
+ typedef std::map<LLUUID, U32> CommandIndexMap;
+ typedef std::vector<LLCommand *> CommandVector;
+
+ CommandVector mCommands;
+ CommandIndexMap mCommandIndices;
+};
+
+
+#endif // LL_LLCOMMANDMANAGER_H
diff --git a/indra/llui/llconsole.cpp b/indra/llui/llconsole.cpp
index 06bad1f371..161496b1f5 100644
--- a/indra/llui/llconsole.cpp
+++ b/indra/llui/llconsole.cpp
@@ -132,6 +132,9 @@ void LLConsole::setFontSize(S32 size_index)
void LLConsole::draw()
{
+ // Units in pixels
+ static const F32 padding_horizontal = 10;
+ static const F32 padding_vertical = 3;
LLGLSUIDefault gls_ui;
// skip lines added more than mLinePersistTime ago
@@ -176,11 +179,9 @@ void LLConsole::draw()
// draw remaining lines
F32 y_pos = 0.f;
- LLUIImagePtr imagep = LLUI::getUIImage("Rounded_Square");
+ LLUIImagePtr imagep = LLUI::getUIImage("transparent");
-// F32 console_opacity = llclamp(gSavedSettings.getF32("ConsoleBackgroundOpacity"), 0.f, 1.f);
F32 console_opacity = llclamp(LLUI::sSettingGroups["config"]->getF32("ConsoleBackgroundOpacity"), 0.f, 1.f);
-// LLColor4 color = LLUIColorTable::instance().getColor("ConsoleBackground");
LLColor4 color = LLUIColorTable::instance().getColor("ConsoleBackground");
color.mV[VALPHA] *= console_opacity;
@@ -188,8 +189,8 @@ void LLConsole::draw()
for(paragraph_it = mParagraphs.rbegin(); paragraph_it != mParagraphs.rend(); paragraph_it++)
{
- S32 target_height = llfloor( (*paragraph_it).mLines.size() * line_height + 8);
- S32 target_width = llfloor( (*paragraph_it).mMaxWidth +15);
+ S32 target_height = llfloor( (*paragraph_it).mLines.size() * line_height + padding_vertical);
+ S32 target_width = llfloor( (*paragraph_it).mMaxWidth + padding_horizontal);
y_pos += ((*paragraph_it).mLines.size()) * line_height;
imagep->drawSolid(-14, (S32)(y_pos + line_height - target_height), target_width, target_height, color);
@@ -234,7 +235,7 @@ void LLConsole::draw()
y_off += line_height;
}
}
- y_pos += 8;
+ y_pos += padding_vertical;
}
}
@@ -371,9 +372,7 @@ LLConsole::Paragraph::Paragraph (LLWString str, const LLColor4 &color, F32 add_t
// static
void LLConsole::updateClass()
{
- LLInstanceTrackerScopedGuard guard;
-
- for (instance_iter it = guard.beginInstances(); it != guard.endInstances(); ++it)
+ for (instance_iter it = beginInstances(); it != endInstances(); ++it)
{
it->update();
}
diff --git a/indra/llui/llconsole.h b/indra/llui/llconsole.h
index bb8ea50bed..f32f1dd74c 100644
--- a/indra/llui/llconsole.h
+++ b/indra/llui/llconsole.h
@@ -54,7 +54,7 @@ public:
persist_time("persist_time", 0.f), // forever
font_size_index("font_size_index")
{
- mouse_opaque(false);
+ changeDefault(mouse_opaque, false);
}
};
protected:
diff --git a/indra/llui/llcontainerview.h b/indra/llui/llcontainerview.h
index 7d3d5cf787..e81600fd6c 100644
--- a/indra/llui/llcontainerview.h
+++ b/indra/llui/llcontainerview.h
@@ -50,7 +50,7 @@ public:
show_label("show_label", FALSE),
display_children("display_children", TRUE)
{
- mouse_opaque(false);
+ changeDefault(mouse_opaque, false);
}
};
diff --git a/indra/llui/lldockablefloater.cpp b/indra/llui/lldockablefloater.cpp
index ca2dc644a4..3396213f1c 100644
--- a/indra/llui/lldockablefloater.cpp
+++ b/indra/llui/lldockablefloater.cpp
@@ -82,7 +82,7 @@ BOOL LLDockableFloater::postBuild()
mForceDocking = true;
}
- mDockTongue = LLUI::getUIImage("windows/Flyout_Pointer.png");
+ mDockTongue = LLUI::getUIImage("Flyout_Pointer");
LLFloater::setDocked(true);
return LLView::postBuild();
}
@@ -162,10 +162,15 @@ void LLDockableFloater::setVisible(BOOL visible)
void LLDockableFloater::setMinimized(BOOL minimize)
{
- if(minimize)
+ if(minimize && isDocked())
{
+ // minimizing a docked floater just hides it
setVisible(FALSE);
}
+ else
+ {
+ LLFloater::setMinimized(minimize);
+ }
}
LLView * LLDockableFloater::getDockWidget()
@@ -234,8 +239,21 @@ void LLDockableFloater::setDockControl(LLDockControl* dockControl)
setDocked(isDocked());
}
-const LLUIImagePtr& LLDockableFloater::getDockTongue()
+const LLUIImagePtr& LLDockableFloater::getDockTongue(LLDockControl::DocAt dock_side)
{
+ switch(dock_side)
+ {
+ case LLDockControl::LEFT:
+ mDockTongue = LLUI::getUIImage("Flyout_Left");
+ break;
+ case LLDockControl::RIGHT:
+ mDockTongue = LLUI::getUIImage("Flyout_Right");
+ break;
+ default:
+ mDockTongue = LLUI::getUIImage("Flyout_Pointer");
+ break;
+ }
+
return mDockTongue;
}
diff --git a/indra/llui/lldockablefloater.h b/indra/llui/lldockablefloater.h
index 8deb6c1159..89c9852f4a 100644
--- a/indra/llui/lldockablefloater.h
+++ b/indra/llui/lldockablefloater.h
@@ -113,6 +113,8 @@ public:
bool getUniqueDocking() { return mUniqueDocking; }
bool getUseTongue() { return mUseTongue; }
+
+ void setUseTongue(bool use_tongue) { mUseTongue = use_tongue;}
private:
/**
* Provides unique of dockable floater.
@@ -122,7 +124,7 @@ private:
protected:
void setDockControl(LLDockControl* dockControl);
- const LLUIImagePtr& getDockTongue();
+ const LLUIImagePtr& getDockTongue(LLDockControl::DocAt dock_side = LLDockControl::TOP);
// Checks if docking should be forced.
// It may be useful e.g. if floater created in mouselook mode (see EXT-5609)
diff --git a/indra/llui/lldockcontrol.cpp b/indra/llui/lldockcontrol.cpp
index d48674f306..af39e41fa6 100644
--- a/indra/llui/lldockcontrol.cpp
+++ b/indra/llui/lldockcontrol.cpp
@@ -92,19 +92,24 @@ void LLDockControl::setDock(LLView* dockWidget)
void LLDockControl::getAllowedRect(LLRect& rect)
{
- rect = mDockableFloater->getRootView()->getRect();
+ rect = mDockableFloater->getRootView()->getChild<LLView>("non_toolbar_panel")->getRect();
}
void LLDockControl::repositionDockable()
{
+ if (!mDockWidget) return;
LLRect dockRect = mDockWidget->calcScreenRect();
LLRect rootRect;
+ LLRect floater_rect = mDockableFloater->calcScreenRect();
mGetAllowedRectCallback(rootRect);
- // recalculate dockable position if dock position changed, dock visibility changed,
- // root view rect changed or recalculation is forced
- if (mPrevDockRect != dockRect || mDockWidgetVisible != isDockVisible()
- || mRootRect != rootRect || mRecalculateDocablePosition)
+ // recalculate dockable position if:
+ if (mPrevDockRect != dockRect //dock position changed
+ || mDockWidgetVisible != isDockVisible() //dock visibility changed
+ || mRootRect != rootRect //root view rect changed
+ || mFloaterRect != floater_rect //floater rect changed
+ || mRecalculateDockablePosition //recalculation is forced
+ )
{
// undock dockable and off() if dock not visible
if (!isDockVisible())
@@ -135,7 +140,8 @@ void LLDockControl::repositionDockable()
mPrevDockRect = dockRect;
mRootRect = rootRect;
- mRecalculateDocablePosition = false;
+ mFloaterRect = floater_rect;
+ mRecalculateDockablePosition = false;
mDockWidgetVisible = isDockVisible();
}
}
@@ -160,8 +166,10 @@ bool LLDockControl::isDockVisible()
case TOP:
{
// check is dock inside parent rect
+ // assume that parent for all dockable floaters
+ // is the root view
LLRect dockParentRect =
- mDockWidget->getParent()->calcScreenRect();
+ mDockWidget->getRootView()->calcScreenRect();
if (dockRect.mRight <= dockParentRect.mLeft
|| dockRect.mLeft >= dockParentRect.mRight)
{
@@ -200,30 +208,47 @@ void LLDockControl::moveDockable()
switch (mDockAt)
{
case LEFT:
- x = dockRect.mLeft;
- y = dockRect.mTop + mDockTongue->getHeight() + dockableRect.getHeight();
- // check is dockable inside root view rect
- if (x < rootRect.mLeft)
+
+ x = dockRect.mLeft - dockableRect.getWidth();
+ y = dockRect.getCenterY() + dockableRect.getHeight() / 2;
+
+ if (use_tongue)
{
- x = rootRect.mLeft;
+ x -= mDockTongue->getWidth();
}
- if (x + dockableRect.getWidth() > rootRect.mRight)
+
+ mDockTongueX = dockableRect.mRight;
+ mDockTongueY = dockableRect.getCenterY() - mDockTongue->getHeight() / 2;
+
+ break;
+
+ case RIGHT:
+
+ x = dockRect.mRight;
+ y = dockRect.getCenterY() + dockableRect.getHeight() / 2;
+
+ if (use_tongue)
{
- x = rootRect.mRight - dockableRect.getWidth();
+ x += mDockTongue->getWidth();
}
-
- mDockTongueX = x + dockableRect.getWidth()/2 - mDockTongue->getWidth() / 2;
-
- mDockTongueY = dockRect.mTop;
+
+ mDockTongueX = dockRect.mRight;
+ mDockTongueY = dockableRect.getCenterY() - mDockTongue->getHeight() / 2;
+
break;
case TOP:
x = dockRect.getCenterX() - dockableRect.getWidth() / 2;
y = dockRect.mTop + dockableRect.getHeight();
- // unique docking used with dock tongue, so add tongue height o the Y coordinate
+ // unique docking used with dock tongue, so add tongue height to the Y coordinate
if (use_tongue)
{
y += mDockTongue->getHeight();
+
+ if ( y > rootRect.mTop)
+ {
+ y = rootRect.mTop;
+ }
}
// check is dockable inside root view rect
@@ -257,7 +282,7 @@ void LLDockControl::moveDockable()
case BOTTOM:
x = dockRect.getCenterX() - dockableRect.getWidth() / 2;
y = dockRect.mBottom;
- // unique docking used with dock tongue, so add tongue height o the Y coordinate
+ // unique docking used with dock tongue, so add tongue height to the Y coordinate
if (use_tongue)
{
y -= mDockTongue->getHeight();
@@ -292,16 +317,27 @@ void LLDockControl::moveDockable()
break;
}
- // move dockable
- dockableRect.setLeftTopAndSize(x, y, dockableRect.getWidth(),
- dockableRect.getHeight());
+ S32 max_available_height = rootRect.getHeight() - (rootRect.mBottom - mDockTongueY) - mDockTongue->getHeight();
+
+ // A floater should be shrunk so it doesn't cover a part of its docking tongue and
+ // there is a space between a dockable floater and a control to which it is docked.
+ if (use_tongue && dockableRect.getHeight() >= max_available_height)
+ {
+ dockableRect.setLeftTopAndSize(x, y, dockableRect.getWidth(), max_available_height);
+ mDockableFloater->reshape(dockableRect.getWidth(), dockableRect.getHeight());
+ }
+ else
+ {
+ // move dockable
+ dockableRect.setLeftTopAndSize(x, y, dockableRect.getWidth(),
+ dockableRect.getHeight());
+ }
+
LLRect localDocableParentRect;
- mDockableFloater->getParent()->screenRectToLocal(dockableRect,
- &localDocableParentRect);
- mDockableFloater->setRect(localDocableParentRect);
- mDockableFloater->screenPointToLocal(mDockTongueX, mDockTongueY,
- &mDockTongueX, &mDockTongueY);
+ mDockableFloater->getParent()->screenRectToLocal(dockableRect, &localDocableParentRect);
+ mDockableFloater->setRect(localDocableParentRect);
+ mDockableFloater->screenPointToLocal(mDockTongueX, mDockTongueY, &mDockTongueX, &mDockTongueY);
}
@@ -310,7 +346,7 @@ void LLDockControl::on()
if (isDockVisible())
{
mEnabled = true;
- mRecalculateDocablePosition = true;
+ mRecalculateDockablePosition = true;
}
}
@@ -321,7 +357,7 @@ void LLDockControl::off()
void LLDockControl::forceRecalculatePosition()
{
- mRecalculateDocablePosition = true;
+ mRecalculateDockablePosition = true;
}
void LLDockControl::drawToungue()
diff --git a/indra/llui/lldockcontrol.h b/indra/llui/lldockcontrol.h
index 2e7359245f..c9602011f6 100644
--- a/indra/llui/lldockcontrol.h
+++ b/indra/llui/lldockcontrol.h
@@ -43,6 +43,7 @@ public:
{
TOP,
LEFT,
+ RIGHT,
BOTTOM
};
@@ -79,12 +80,13 @@ private:
private:
get_allowed_rect_callback_t mGetAllowedRectCallback;
bool mEnabled;
- bool mRecalculateDocablePosition;
+ bool mRecalculateDockablePosition;
bool mDockWidgetVisible;
DocAt mDockAt;
LLView* mDockWidget;
LLRect mPrevDockRect;
LLRect mRootRect;
+ LLRect mFloaterRect;
LLFloater* mDockableFloater;
LLUIImagePtr mDockTongue;
S32 mDockTongueX;
diff --git a/indra/llui/lldraghandle.cpp b/indra/llui/lldraghandle.cpp
index 42e6c3c786..5f69c6af31 100644
--- a/indra/llui/lldraghandle.cpp
+++ b/indra/llui/lldraghandle.cpp
@@ -244,7 +244,7 @@ void LLDragHandleTop::reshapeTitleBox()
const LLFontGL* font = LLFontGL::getFontSansSerif();
S32 title_width = getRect().getWidth();
title_width -= LEFT_PAD + 2 * BORDER_PAD + getButtonsRect().getWidth();
- S32 title_height = llround(font->getLineHeight());
+ S32 title_height = font->getLineHeight();
LLRect title_rect;
title_rect.setLeftTopAndSize(
LEFT_PAD,
diff --git a/indra/llui/lldraghandle.h b/indra/llui/lldraghandle.h
index 7c56475e75..e095e577b1 100644
--- a/indra/llui/lldraghandle.h
+++ b/indra/llui/lldraghandle.h
@@ -51,8 +51,8 @@ public:
drag_highlight_color("drag_highlight_color", LLUIColorTable::instance().getColor("DefaultHighlightLight")),
drag_shadow_color("drag_shadow_color", LLUIColorTable::instance().getColor("DefaultShadowDark"))
{
- mouse_opaque(true);
- follows.flags(FOLLOWS_ALL);
+ changeDefault(mouse_opaque, true);
+ changeDefault(follows.flags, FOLLOWS_ALL);
}
};
void initFromParams(const Params&);
diff --git a/indra/llui/llfiltereditor.h b/indra/llui/llfiltereditor.h
index 710699fdc1..3a05bc05a1 100644
--- a/indra/llui/llfiltereditor.h
+++ b/indra/llui/llfiltereditor.h
@@ -42,12 +42,7 @@ class LLFilterEditor : public LLSearchEditor
{
public:
struct Params : public LLInitParam::Block<Params, LLSearchEditor::Params>
- {
- Params()
- {
- name = "filter_editor";
- }
- };
+ {};
protected:
LLFilterEditor(const Params&);
diff --git a/indra/llui/llflatlistview.cpp b/indra/llui/llflatlistview.cpp
index c57c02f4b1..97a52fada4 100644
--- a/indra/llui/llflatlistview.cpp
+++ b/indra/llui/llflatlistview.cpp
@@ -87,9 +87,6 @@ bool LLFlatListView::addItem(LLPanel * item, const LLSD& value /*= LLUUID::null*
mItemsPanel->addChild(item);
break;
default:
- LL_WARNS("") << "Unsupported position." << LL_ENDL;
- delete new_pair;
- return false;
break;
}
diff --git a/indra/llui/llflatlistview.h b/indra/llui/llflatlistview.h
index 0515853698..92bf429031 100644
--- a/indra/llui/llflatlistview.h
+++ b/indra/llui/llflatlistview.h
@@ -450,8 +450,9 @@ private:
*/
class LLFlatListViewEx : public LLFlatListView
{
- LOG_CLASS(LLFlatListViewEx);
public:
+ LOG_CLASS(LLFlatListViewEx);
+
struct Params : public LLInitParam::Block<Params, LLFlatListView::Params>
{
/**
diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp
index 34d8e9c500..8ca1e685a9 100644
--- a/indra/llui/llfloater.cpp
+++ b/indra/llui/llfloater.cpp
@@ -1,4 +1,5 @@
/**
+
* @file llfloater.cpp
* @brief LLFloater base class
*
@@ -57,13 +58,22 @@
#include "llhelp.h"
#include "llmultifloater.h"
#include "llsdutil.h"
+#include <boost/foreach.hpp>
+
// use this to control "jumping" behavior when Ctrl-Tabbing
const S32 TABBED_FLOATER_OFFSET = 0;
-// static
-F32 LLFloater::sActiveFloaterTransparency = 0.0f;
-F32 LLFloater::sInactiveFloaterTransparency = 0.0f;
+namespace LLInitParam
+{
+ void TypeValues<LLFloaterEnums::EOpenPositioning>::declareValues()
+ {
+ declare("relative", LLFloaterEnums::POSITIONING_RELATIVE);
+ declare("cascading", LLFloaterEnums::POSITIONING_CASCADING);
+ declare("centered", LLFloaterEnums::POSITIONING_CENTERED);
+ declare("specified", LLFloaterEnums::POSITIONING_SPECIFIED);
+ }
+}
std::string LLFloater::sButtonNames[BUTTON_COUNT] =
{
@@ -103,7 +113,6 @@ LLFloater::click_callback LLFloater::sButtonCallbacks[BUTTON_COUNT] =
LLMultiFloater* LLFloater::sHostp = NULL;
BOOL LLFloater::sQuitting = FALSE; // Flag to prevent storing visibility controls while quitting
-LLFloater::handle_map_t LLFloater::sFloaterMap;
LLFloaterView* gFloaterView = NULL;
@@ -157,7 +166,7 @@ LLFloater::Params::Params()
: title("title"),
short_title("short_title"),
single_instance("single_instance", false),
- auto_tile("auto_tile", false),
+ reuse_instance("reuse_instance", false),
can_resize("can_resize", false),
can_minimize("can_minimize", true),
can_close("can_close", true),
@@ -167,7 +176,8 @@ LLFloater::Params::Params()
save_rect("save_rect", false),
save_visibility("save_visibility", false),
can_dock("can_dock", false),
- open_centered("open_centered", false),
+ show_title("show_title", true),
+ positioning("positioning", LLFloaterEnums::POSITIONING_RELATIVE),
header_height("header_height", 0),
legacy_header_height("legacy_header_height", 0),
close_image("close_image"),
@@ -183,9 +193,10 @@ LLFloater::Params::Params()
dock_pressed_image("dock_pressed_image"),
help_pressed_image("help_pressed_image"),
open_callback("open_callback"),
- close_callback("close_callback")
+ close_callback("close_callback"),
+ follows("follows")
{
- visible = false;
+ changeDefault(visible, false);
}
@@ -208,14 +219,14 @@ void LLFloater::initClass()
if (ctrl)
{
ctrl->getSignal()->connect(boost::bind(&LLFloater::updateActiveFloaterTransparency));
- sActiveFloaterTransparency = LLUI::sSettingGroups["config"]->getF32("ActiveFloaterTransparency");
+ updateActiveFloaterTransparency();
}
ctrl = LLUI::sSettingGroups["config"]->getControl("InactiveFloaterTransparency").get();
if (ctrl)
{
ctrl->getSignal()->connect(boost::bind(&LLFloater::updateInactiveFloaterTransparency));
- sInactiveFloaterTransparency = LLUI::sSettingGroups["config"]->getF32("InactiveFloaterTransparency");
+ updateInactiveFloaterTransparency();
}
}
@@ -225,17 +236,18 @@ static LLWidgetNameRegistry::StaticRegistrar sRegisterFloaterParams(&typeid(LLFl
LLFloater::LLFloater(const LLSD& key, const LLFloater::Params& p)
: LLPanel(), // intentionally do not pass params here, see initFromParams
- mDragHandle(NULL),
+ mDragHandle(NULL),
mTitle(p.title),
mShortTitle(p.short_title),
mSingleInstance(p.single_instance),
+ mReuseInstance(p.reuse_instance.isProvided() ? p.reuse_instance : p.single_instance), // reuse single-instance floaters by default
mKey(key),
- mAutoTile(p.auto_tile),
mCanTearOff(p.can_tear_off),
mCanMinimize(p.can_minimize),
mCanClose(p.can_close),
mDragOnLeft(p.can_drag_on_left),
mResizable(p.can_resize),
+ mPositioning(p.positioning),
mMinWidth(p.min_width),
mMinHeight(p.min_height),
mHeaderHeight(p.header_height),
@@ -254,7 +266,7 @@ LLFloater::LLFloater(const LLSD& key, const LLFloater::Params& p)
mMinimizeSignal(NULL)
// mNotificationContext(NULL)
{
- mHandle.bind(this);
+ mPosition.setFloater(*this);
// mNotificationContext = new LLFloaterNotificationContext(getHandle());
// Clicks stop here.
@@ -275,9 +287,6 @@ LLFloater::LLFloater(const LLSD& key, const LLFloater::Params& p)
initFromParams(p);
- // chrome floaters don't take focus at all
- setFocusRoot(!getIsChrome());
-
initFloater(p);
}
@@ -312,9 +321,6 @@ void LLFloater::initFloater(const Params& p)
// Floaters are created in the invisible state
setVisible(FALSE);
- // add self to handle->floater map
- sFloaterMap[mHandle] = this;
-
if (!getParent())
{
gFloaterView->addChild(this);
@@ -368,13 +374,13 @@ void LLFloater::layoutDragHandle()
// static
void LLFloater::updateActiveFloaterTransparency()
{
- sActiveFloaterTransparency = LLUI::sSettingGroups["config"]->getF32("ActiveFloaterTransparency");
+ sActiveControlTransparency = LLUI::sSettingGroups["config"]->getF32("ActiveFloaterTransparency");
}
// static
void LLFloater::updateInactiveFloaterTransparency()
{
- sInactiveFloaterTransparency = LLUI::sSettingGroups["config"]->getF32("InactiveFloaterTransparency");
+ sInactiveControlTransparency = LLUI::sSettingGroups["config"]->getF32("InactiveFloaterTransparency");
}
void LLFloater::addResizeCtrls()
@@ -465,15 +471,24 @@ void LLFloater::layoutResizeCtrls()
mResizeHandle[3]->setRect(rect);
}
-void LLFloater::enableResizeCtrls(bool enable)
+void LLFloater::enableResizeCtrls(bool enable, bool width, bool height)
{
+ mResizeBar[LLResizeBar::LEFT]->setVisible(enable && width);
+ mResizeBar[LLResizeBar::LEFT]->setEnabled(enable && width);
+
+ mResizeBar[LLResizeBar::TOP]->setVisible(enable && height);
+ mResizeBar[LLResizeBar::TOP]->setEnabled(enable && height);
+
+ mResizeBar[LLResizeBar::RIGHT]->setVisible(enable && width);
+ mResizeBar[LLResizeBar::RIGHT]->setEnabled(enable && width);
+
+ mResizeBar[LLResizeBar::BOTTOM]->setVisible(enable && height);
+ mResizeBar[LLResizeBar::BOTTOM]->setEnabled(enable && height);
+
for (S32 i = 0; i < 4; ++i)
{
- mResizeBar[i]->setVisible(enable);
- mResizeBar[i]->setEnabled(enable);
-
- mResizeHandle[i]->setVisible(enable);
- mResizeHandle[i]->setEnabled(enable);
+ mResizeHandle[i]->setVisible(enable && width && height);
+ mResizeHandle[i]->setEnabled(enable && width && height);
}
}
@@ -512,8 +527,6 @@ LLFloater::~LLFloater()
// correct, non-minimized positions.
setMinimized( FALSE );
- sFloaterMap.erase(mHandle);
-
delete mDragHandle;
for (S32 i = 0; i < 4; i++)
{
@@ -521,7 +534,6 @@ LLFloater::~LLFloater()
delete mResizeHandle[i];
}
- storeRectControl();
setVisible(false); // We're not visible if we're destroyed
storeVisibilityControl();
storeDockStateControl();
@@ -531,10 +543,18 @@ LLFloater::~LLFloater()
void LLFloater::storeRectControl()
{
- if( mRectControl.size() > 1 )
+ if (!mRectControl.empty())
{
getControlGroup()->setRect( mRectControl, getRect() );
}
+ if (!mPosXControl.empty() && mPositioning == LLFloaterEnums::POSITIONING_RELATIVE)
+ {
+ getControlGroup()->setF32( mPosXControl, mPosition.mX );
+ }
+ if (!mPosYControl.empty() && mPositioning == LLFloaterEnums::POSITIONING_RELATIVE)
+ {
+ getControlGroup()->setF32( mPosYControl, mPosition.mY );
+ }
}
void LLFloater::storeVisibilityControl()
@@ -553,23 +573,6 @@ void LLFloater::storeDockStateControl()
}
}
-LLRect LLFloater::getSavedRect() const
-{
- LLRect rect;
-
- if (mRectControl.size() > 1)
- {
- rect = getControlGroup()->getRect(mRectControl);
- }
-
- return rect;
-}
-
-bool LLFloater::hasSavedRect() const
-{
- return !getSavedRect().isEmpty();
-}
-
// static
std::string LLFloater::getControlName(const std::string& name, const LLSD& key)
{
@@ -666,6 +669,12 @@ void LLFloater::openFloater(const LLSD& key)
}
else
{
+ LLFloater* floater_to_stack = LLFloaterReg::getLastFloaterInGroup(mInstanceName);
+ if (!floater_to_stack)
+ {
+ floater_to_stack = LLFloaterReg::getLastFloaterCascading();
+ }
+ applyControlsAndPosition(floater_to_stack);
setMinimized(FALSE);
setVisibleAndFrontmost(mAutoFocus);
}
@@ -758,12 +767,19 @@ void LLFloater::closeFloater(bool app_quitting)
else
{
setVisible(FALSE);
+ if (!mReuseInstance)
+ {
+ destroy();
+ }
}
}
else
{
setVisible(FALSE); // hide before destroying (so handleVisibilityChange() gets called)
- destroy();
+ if (!mReuseInstance)
+ {
+ destroy();
+ }
}
}
}
@@ -772,7 +788,6 @@ void LLFloater::closeFloater(bool app_quitting)
void LLFloater::reshape(S32 width, S32 height, BOOL called_from_parent)
{
LLPanel::reshape(width, height, called_from_parent);
- storeRectControl();
}
void LLFloater::releaseFocus()
@@ -829,43 +844,153 @@ LLMultiFloater* LLFloater::getHost()
return (LLMultiFloater*)mHostHandle.get();
}
-void LLFloater::applySavedVariables()
+void LLFloater::applyControlsAndPosition(LLFloater* other)
{
- applyRectControl();
- applyDockState();
+ if (!applyDockState())
+ {
+ if (!applyRectControl())
+ {
+ applyPositioning(other, true);
+ }
+ }
}
-void LLFloater::applyRectControl()
+bool LLFloater::applyRectControl()
{
- // first, center on screen if requested
- if (mOpenCentered)
+ bool saved_rect = false;
+
+ LLRect screen_rect = calcScreenRect();
+ mPosition = LLCoordGL(screen_rect.getCenterX(), screen_rect.getCenterY()).convert();
+
+ LLFloater* last_in_group = LLFloaterReg::getLastFloaterInGroup(mInstanceName);
+ if (last_in_group && last_in_group != this)
{
- center();
+ // other floaters in our group, position ourselves relative to them and don't save the rect
+ mRectControl.clear();
+ mPositioning = LLFloaterEnums::POSITIONING_CASCADE_GROUP;
}
-
- // override center if we have saved rect control
- if (mRectControl.size() > 1)
+ else
{
- const LLRect& rect = getControlGroup()->getRect(mRectControl);
- if (rect.getWidth() > 0 && rect.getHeight() > 0)
+ bool rect_specified = false;
+ if (!mRectControl.empty())
{
- translate( rect.mLeft - getRect().mLeft, rect.mBottom - getRect().mBottom);
- if (mResizable)
+ // If we have a saved rect, use it
+ const LLRect& rect = getControlGroup()->getRect(mRectControl);
+ if (rect.notEmpty()) saved_rect = true;
+ if (saved_rect)
{
- reshape(llmax(mMinWidth, rect.getWidth()), llmax(mMinHeight, rect.getHeight()));
+ setOrigin(rect.mLeft, rect.mBottom);
+
+ if (mResizable)
+ {
+ reshape(llmax(mMinWidth, rect.getWidth()), llmax(mMinHeight, rect.getHeight()));
+ }
+ mPositioning = LLFloaterEnums::POSITIONING_RELATIVE;
+ LLRect screen_rect = calcScreenRect();
+ mPosition = LLCoordGL(screen_rect.getCenterX(), screen_rect.getCenterY()).convert();
+ rect_specified = true;
}
}
+
+ LLControlVariablePtr x_control = getControlGroup()->getControl(mPosXControl);
+ LLControlVariablePtr y_control = getControlGroup()->getControl(mPosYControl);
+ if (x_control.notNull()
+ && y_control.notNull()
+ && !x_control->isDefault()
+ && !y_control->isDefault())
+ {
+ mPosition.mX = x_control->getValue().asReal();
+ mPosition.mY = y_control->getValue().asReal();
+ mPositioning = LLFloaterEnums::POSITIONING_RELATIVE;
+ applyRelativePosition();
+
+ saved_rect = true;
+ }
+
+ // remember updated position
+ if (rect_specified)
+ {
+ storeRectControl();
+ }
}
+
+ if (saved_rect)
+ {
+ // propagate any derived positioning data back to settings file
+ storeRectControl();
+ }
+
+
+ return saved_rect;
}
-void LLFloater::applyDockState()
+bool LLFloater::applyDockState()
{
+ bool docked = false;
+
if (mDocStateControl.size() > 1)
{
- bool dockState = getControlGroup()->getBOOL(mDocStateControl);
- setDocked(dockState);
+ docked = getControlGroup()->getBOOL(mDocStateControl);
+ setDocked(docked);
}
+ return docked;
+}
+
+void LLFloater::applyPositioning(LLFloater* other, bool on_open)
+{
+ // Otherwise position according to the positioning code
+ switch (mPositioning)
+ {
+ case LLFloaterEnums::POSITIONING_CENTERED:
+ center();
+ break;
+
+ case LLFloaterEnums::POSITIONING_SPECIFIED:
+ break;
+
+ case LLFloaterEnums::POSITIONING_CASCADING:
+ if (!on_open)
+ {
+ applyRelativePosition();
+ }
+ // fall through
+ case LLFloaterEnums::POSITIONING_CASCADE_GROUP:
+ if (on_open)
+ {
+ if (other != NULL && other != this)
+ {
+ stackWith(*other);
+ }
+ else
+ {
+ static const U32 CASCADING_FLOATER_HOFFSET = 0;
+ static const U32 CASCADING_FLOATER_VOFFSET = 0;
+
+ const LLRect& snap_rect = gFloaterView->getSnapRect();
+
+ const S32 horizontal_offset = CASCADING_FLOATER_HOFFSET;
+ const S32 vertical_offset = snap_rect.getHeight() - CASCADING_FLOATER_VOFFSET;
+
+ S32 rect_height = getRect().getHeight();
+ setOrigin(horizontal_offset, vertical_offset - rect_height);
+
+ translate(snap_rect.mLeft, snap_rect.mBottom);
+ }
+ setFollows(FOLLOWS_TOP | FOLLOWS_LEFT);
+ }
+ break;
+
+ case LLFloaterEnums::POSITIONING_RELATIVE:
+ {
+ applyRelativePosition();
+
+ break;
+ }
+ default:
+ // Do nothing
+ break;
+ }
}
void LLFloater::applyTitle()
@@ -942,7 +1067,9 @@ BOOL LLFloater::canSnapTo(const LLView* other_view)
if (other_view != getParent())
{
const LLFloater* other_floaterp = dynamic_cast<const LLFloater*>(other_view);
- if (other_floaterp && other_floaterp->getSnapTarget() == getHandle() && mDependents.find(other_floaterp->getHandle()) != mDependents.end())
+ if (other_floaterp
+ && other_floaterp->getSnapTarget() == getHandle()
+ && mDependents.find(other_floaterp->getHandle()) != mDependents.end())
{
// this is a dependent that is already snapped to us, so don't snap back to it
return FALSE;
@@ -974,6 +1101,14 @@ void LLFloater::handleReshape(const LLRect& new_rect, bool by_user)
const LLRect old_rect = getRect();
LLView::handleReshape(new_rect, by_user);
+ if (by_user && !isMinimized())
+ {
+ storeRectControl();
+ mPositioning = LLFloaterEnums::POSITIONING_RELATIVE;
+ LLRect screen_rect = calcScreenRect();
+ mPosition = LLCoordGL(screen_rect.getCenterX(), screen_rect.getCenterY()).convert();
+ }
+
// if not minimized, adjust all snapped dependents to new shape
if (!isMinimized())
{
@@ -1031,7 +1166,7 @@ void LLFloater::setMinimized(BOOL minimize)
if (minimize == mMinimized) return;
- if(mMinimizeSignal)
+ if (mMinimizeSignal)
{
(*mMinimizeSignal)(this, LLSD(minimize));
}
@@ -1063,10 +1198,6 @@ void LLFloater::setMinimized(BOOL minimize)
mButtonsEnabled[BUTTON_RESTORE] = TRUE;
}
- if (mDragHandle)
- {
- mDragHandle->setVisible(TRUE);
- }
setBorderVisible(TRUE);
for(handle_set_iter_t dependent_it = mDependents.begin();
@@ -1153,6 +1284,7 @@ void LLFloater::setMinimized(BOOL minimize)
// Reshape *after* setting mMinimized
reshape( mExpandedRect.getWidth(), mExpandedRect.getHeight(), TRUE );
+ applyPositioning(NULL, false);
}
make_ui_sound("UISndWindowClose");
@@ -1193,6 +1325,7 @@ void LLFloater::setFocus( BOOL b )
last_focus->setFocus(TRUE);
}
}
+ updateTransparency(b ? TT_ACTIVE : TT_INACTIVE);
}
// virtual
@@ -1216,19 +1349,9 @@ void LLFloater::setIsChrome(BOOL is_chrome)
mButtons[BUTTON_CLOSE]->setToolTip(LLStringExplicit(getButtonTooltip(Params(), BUTTON_CLOSE, is_chrome)));
}
- // no titles displayed on "chrome" floaters
- if (mDragHandle)
- mDragHandle->setTitleVisible(!is_chrome);
-
LLPanel::setIsChrome(is_chrome);
}
-void LLFloater::setTitleVisible(bool visible)
-{
- if (mDragHandle)
- mDragHandle->setTitleVisible(visible);
-}
-
// Change the draw style to account for the foreground state.
void LLFloater::setForeground(BOOL front)
{
@@ -1316,7 +1439,10 @@ void LLFloater::moveResizeHandlesToFront()
BOOL LLFloater::isFrontmost()
{
- return gFloaterView && gFloaterView->getFrontmost() == this && getVisible();
+ LLFloaterView* floater_view = getParentByType<LLFloaterView>();
+ return getVisible()
+ && (floater_view
+ && floater_view->getFrontmost() == this);
}
void LLFloater::addDependentFloater(LLFloater* floaterp, BOOL reposition)
@@ -1389,6 +1515,7 @@ BOOL LLFloater::handleMouseDown(S32 x, S32 y, MASK mask)
if(offerClickToButton(x, y, mask, BUTTON_CLOSE)) return TRUE;
if(offerClickToButton(x, y, mask, BUTTON_RESTORE)) return TRUE;
if(offerClickToButton(x, y, mask, BUTTON_TEAR_OFF)) return TRUE;
+ if(offerClickToButton(x, y, mask, BUTTON_DOCK)) return TRUE;
// Otherwise pass to drag handle for movement
return mDragHandle->handleMouseDown(x, y, mask);
@@ -1465,6 +1592,9 @@ void LLFloater::setFrontmost(BOOL take_focus)
// there are more than one floater view
// so we need to query our parent directly
((LLFloaterView*)getParent())->bringToFront(this, take_focus);
+
+ // Make sure to set the appropriate transparency type (STORM-732).
+ updateTransparency(hasFocus() || getIsChrome() ? TT_ACTIVE : TT_INACTIVE);
}
}
@@ -1491,6 +1621,13 @@ void LLFloater::setDocked(bool docked, bool pop_on_undock)
{
mDocked = docked;
mButtonsEnabled[BUTTON_DOCK] = !mDocked;
+
+ if (mDocked)
+ {
+ setMinimized(FALSE);
+ mPositioning = LLFloaterEnums::POSITIONING_RELATIVE;
+ }
+
updateTitleButtons();
storeDockStateControl();
@@ -1522,7 +1659,7 @@ void LLFloater::onClickTearOff(LLFloater* self)
self->openFloater(self->getKey());
// only force position for floaters that don't have that data saved
- if (self->mRectControl.size() <= 1)
+ if (self->mRectControl.empty())
{
new_rect.setLeftTopAndSize(host_floater->getRect().mLeft + 5, host_floater->getRect().mTop - floater_header_size - 5, self->getRect().getWidth(), self->getRect().getHeight());
self->setRect(new_rect);
@@ -1574,18 +1711,19 @@ void LLFloater::onClickHelp( LLFloater* self )
LLFloater* LLFloater::getClosableFloaterFromFocus()
{
LLFloater* focused_floater = NULL;
-
- handle_map_iter_t iter;
- for(iter = sFloaterMap.begin(); iter != sFloaterMap.end(); ++iter)
+ LLInstanceTracker<LLFloater>::instance_iter it = beginInstances();
+ LLInstanceTracker<LLFloater>::instance_iter end_it = endInstances();
+ for (; it != end_it; ++it)
{
- focused_floater = iter->second;
- if (focused_floater->hasFocus())
+ if (it->hasFocus())
{
+ LLFloater& floater = *it;
+ focused_floater = &floater;
break;
}
}
- if (iter == sFloaterMap.end())
+ if (it == endInstances())
{
// nothing found, return
return NULL;
@@ -1652,7 +1790,7 @@ void LLFloater::onClickCloseBtn()
// virtual
void LLFloater::draw()
{
- mCurrentTransparency = hasFocus() ? sActiveFloaterTransparency : sInactiveFloaterTransparency;
+ const F32 alpha = getCurrentTransparency();
// draw background
if( isBackgroundVisible() )
@@ -1684,12 +1822,12 @@ void LLFloater::draw()
if (image)
{
// We're using images for this floater's backgrounds
- image->draw(getLocalRect(), overlay_color % mCurrentTransparency);
+ image->draw(getLocalRect(), overlay_color % alpha);
}
else
{
// We're not using images, use old-school flat colors
- gl_rect_2d( left, top, right, bottom, color % mCurrentTransparency );
+ gl_rect_2d( left, top, right, bottom, color % alpha );
// draw highlight on title bar to indicate focus. RDW
if(hasFocus()
@@ -1700,8 +1838,8 @@ void LLFloater::draw()
const LLFontGL* font = LLFontGL::getFontSansSerif();
LLRect r = getRect();
- gl_rect_2d_offset_local(0, r.getHeight(), r.getWidth(), r.getHeight() - (S32)font->getLineHeight() - 1,
- titlebar_focus_color % mCurrentTransparency, 0, TRUE);
+ gl_rect_2d_offset_local(0, r.getHeight(), r.getWidth(), r.getHeight() - font->getLineHeight() - 1,
+ titlebar_focus_color % alpha, 0, TRUE);
}
}
}
@@ -1729,7 +1867,7 @@ void LLFloater::draw()
{
drawChild(mButtons[i]);
}
- drawChild(mDragHandle);
+ drawChild(mDragHandle, 0, 0, TRUE);
}
else
{
@@ -1767,10 +1905,32 @@ void LLFloater::drawShadow(LLPanel* panel)
shadow_color.mV[VALPHA] *= 0.5f;
}
gl_drop_shadow(left, top, right, bottom,
- shadow_color % mCurrentTransparency,
+ shadow_color % getCurrentTransparency(),
llround(shadow_offset));
}
+void LLFloater::updateTransparency(LLView* view, ETypeTransparency transparency_type)
+{
+ child_list_t children = *view->getChildList();
+ child_list_t::iterator it = children.begin();
+
+ LLUICtrl* ctrl = dynamic_cast<LLUICtrl*>(view);
+ if (ctrl)
+ {
+ ctrl->setTransparencyType(transparency_type);
+ }
+
+ for(; it != children.end(); ++it)
+ {
+ updateTransparency(*it, transparency_type);
+ }
+}
+
+void LLFloater::updateTransparency(ETypeTransparency transparency_type)
+{
+ updateTransparency(this, transparency_type);
+}
+
void LLFloater::setCanMinimize(BOOL can_minimize)
{
// if removing minimize/restore button programmatically,
@@ -1824,6 +1984,12 @@ void LLFloater::setCanDrag(BOOL can_drag)
}
}
+bool LLFloater::getCanDrag()
+{
+ return mDragHandle->getEnabled();
+}
+
+
void LLFloater::updateTitleButtons()
{
static LLUICachedControl<S32> floater_close_box_size ("UIFloaterCloseBoxSize", 0);
@@ -2028,25 +2194,20 @@ static LLDefaultChildRegistry::Register<LLFloaterView> r("floater_view");
LLFloaterView::LLFloaterView (const Params& p)
: LLUICtrl (p),
-
mFocusCycleMode(FALSE),
mMinimizePositionVOffset(0),
mSnapOffsetBottom(0),
mSnapOffsetRight(0)
{
+ mSnapView = getHandle();
}
// By default, adjust vertical.
void LLFloaterView::reshape(S32 width, S32 height, BOOL called_from_parent)
{
- reshapeFloater(width, height, called_from_parent, ADJUST_VERTICAL_YES);
-}
+ LLView::reshape(width, height, called_from_parent);
-// When reshaping this view, make the floaters follow their closest edge.
-void LLFloaterView::reshapeFloater(S32 width, S32 height, BOOL called_from_parent, BOOL adjust_vertical)
-{
- S32 old_width = getRect().getWidth();
- S32 old_height = getRect().getHeight();
+ mLastSnapRect = getSnapRect();
for ( child_list_const_iter_t child_it = getChildList()->begin(); child_it != getChildList()->end(); ++child_it)
{
@@ -2054,70 +2215,52 @@ void LLFloaterView::reshapeFloater(S32 width, S32 height, BOOL called_from_paren
LLFloater* floaterp = (LLFloater*)viewp;
if (floaterp->isDependent())
{
- // dependents use same follow flags as their "dependee"
+ // dependents are moved with their "dependee"
continue;
}
- // Make if follow the edge it is closest to
- U32 follow_flags = 0x0;
-
- if (floaterp->isMinimized())
+ if (!floaterp->isMinimized() && floaterp->getCanDrag())
{
- follow_flags |= (FOLLOWS_LEFT | FOLLOWS_TOP);
- }
- else
- {
- LLRect r = floaterp->getRect();
+ LLRect old_rect = floaterp->getRect();
+ floaterp->applyPositioning(NULL, false);
+ LLRect new_rect = floaterp->getRect();
- // Compute absolute distance from each edge of screen
- S32 left_offset = llabs(r.mLeft - 0);
- S32 right_offset = llabs(old_width - r.mRight);
+ //LLRect r = floaterp->getRect();
- S32 top_offset = llabs(old_height - r.mTop);
- S32 bottom_offset = llabs(r.mBottom - 0);
+ //// Compute absolute distance from each edge of screen
+ //S32 left_offset = llabs(r.mLeft - 0);
+ //S32 right_offset = llabs(old_right - r.mRight);
+ //S32 top_offset = llabs(old_top - r.mTop);
+ //S32 bottom_offset = llabs(r.mBottom - 0);
- if (left_offset < right_offset)
- {
- follow_flags |= FOLLOWS_LEFT;
- }
- else
- {
- follow_flags |= FOLLOWS_RIGHT;
- }
+ S32 translate_x = new_rect.mLeft - old_rect.mLeft;
+ S32 translate_y = new_rect.mBottom - old_rect.mBottom;
- // "No vertical adjustment" usually means that the bottom of the view
- // has been pushed up or down. Hence we want the floaters to follow
- // the top.
- if (!adjust_vertical)
- {
- follow_flags |= FOLLOWS_TOP;
- }
- else if (top_offset < bottom_offset)
- {
- follow_flags |= FOLLOWS_TOP;
- }
- else
- {
- follow_flags |= FOLLOWS_BOTTOM;
- }
- }
+ //if (left_offset > right_offset)
+ //{
+ // translate_x = new_right - old_right;
+ //}
- floaterp->setFollows(follow_flags);
+ //if (top_offset < bottom_offset)
+ //{
+ // translate_y = new_top - old_top;
+ //}
- //RN: all dependent floaters copy follow behavior of "parent"
- for(LLFloater::handle_set_iter_t dependent_it = floaterp->mDependents.begin();
- dependent_it != floaterp->mDependents.end(); ++dependent_it)
- {
- LLFloater* dependent_floaterp = dependent_it->get();
- if (dependent_floaterp)
+ // don't reposition immovable floaters
+ //if (floaterp->getCanDrag())
+ //{
+ // floaterp->translate(translate_x, translate_y);
+ //}
+ BOOST_FOREACH(LLHandle<LLFloater> dependent_floater, floaterp->mDependents)
{
- dependent_floaterp->setFollows(follow_flags);
+ if (dependent_floater.get())
+ {
+ dependent_floater.get()->translate(translate_x, translate_y);
+ }
}
}
}
-
- LLView::reshape(width, height, called_from_parent);
}
@@ -2438,6 +2581,52 @@ void LLFloaterView::closeAllChildren(bool app_quitting)
}
}
+void LLFloaterView::hiddenFloaterClosed(LLFloater* floater)
+{
+ for (hidden_floaters_t::iterator it = mHiddenFloaters.begin(), end_it = mHiddenFloaters.end();
+ it != end_it;
+ ++it)
+ {
+ if (it->first.get() == floater)
+ {
+ it->second.disconnect();
+ mHiddenFloaters.erase(it);
+ break;
+ }
+ }
+}
+
+void LLFloaterView::hideAllFloaters()
+{
+ child_list_t child_list = *(getChildList());
+
+ for (child_list_iter_t it = child_list.begin(); it != child_list.end(); ++it)
+ {
+ LLFloater* floaterp = dynamic_cast<LLFloater*>(*it);
+ if (floaterp && floaterp->getVisible())
+ {
+ floaterp->setVisible(false);
+ boost::signals2::connection connection = floaterp->mCloseSignal.connect(boost::bind(&LLFloaterView::hiddenFloaterClosed, this, floaterp));
+ mHiddenFloaters.push_back(std::make_pair(floaterp->getHandle(), connection));
+ }
+ }
+}
+
+void LLFloaterView::showHiddenFloaters()
+{
+ for (hidden_floaters_t::iterator it = mHiddenFloaters.begin(), end_it = mHiddenFloaters.end();
+ it != end_it;
+ ++it)
+ {
+ LLFloater* floaterp = it->first.get();
+ if (floaterp)
+ {
+ floaterp->setVisible(true);
+ }
+ it->second.disconnect();
+ }
+ mHiddenFloaters.clear();
+}
BOOL LLFloaterView::allChildrenClosed()
{
@@ -2471,6 +2660,12 @@ void LLFloaterView::shiftFloaters(S32 x_offset, S32 y_offset)
void LLFloaterView::refresh()
{
+ LLRect snap_rect = getSnapRect();
+ if (snap_rect != mLastSnapRect)
+ {
+ reshape(getRect().getWidth(), getRect().getHeight(), TRUE);
+ }
+
// Constrain children to be entirely on the screen
for ( child_list_const_iter_t child_it = getChildList()->begin(); child_it != getChildList()->end(); ++child_it)
{
@@ -2483,6 +2678,8 @@ void LLFloaterView::refresh()
}
}
+const S32 FLOATER_MIN_VISIBLE_PIXELS = 16;
+
void LLFloaterView::adjustToFitScreen(LLFloater* floater, BOOL allow_partial_outside)
{
if (floater->getParent() != this)
@@ -2536,7 +2733,7 @@ void LLFloaterView::adjustToFitScreen(LLFloater* floater, BOOL allow_partial_out
}
// move window fully onscreen
- if (floater->translateIntoRect( getLocalRect(), allow_partial_outside ))
+ if (floater->translateIntoRect( getSnapRect(), allow_partial_outside ? FLOATER_MIN_VISIBLE_PIXELS : S32_MAX ))
{
floater->clearSnapTarget();
}
@@ -2570,9 +2767,13 @@ void LLFloaterView::draw()
LLRect LLFloaterView::getSnapRect() const
{
- LLRect snap_rect = getRect();
- snap_rect.mBottom += mSnapOffsetBottom;
- snap_rect.mRight -= mSnapOffsetRight;
+ LLRect snap_rect = getLocalRect();
+
+ LLView* snap_view = mSnapView.get();
+ if (snap_view)
+ {
+ snap_view->localRectToOtherView(snap_view->getLocalRect(), &snap_rect, this);
+ }
return snap_rect;
}
@@ -2746,9 +2947,11 @@ void LLFloater::setInstanceName(const std::string& name)
std::string ctrl_name = getControlName(mInstanceName, mKey);
// save_rect and save_visibility only apply to registered floaters
- if (!mRectControl.empty())
+ if (mSaveRect)
{
mRectControl = LLFloaterReg::declareRectControl(ctrl_name);
+ mPosXControl = LLFloaterReg::declarePosXControl(ctrl_name);
+ mPosYControl = LLFloaterReg::declarePosYControl(ctrl_name);
}
if (!mVisibilityControl.empty())
{
@@ -2758,7 +2961,6 @@ void LLFloater::setInstanceName(const std::string& name)
{
mDocStateControl = LLFloaterReg::declareDockStateControl(ctrl_name);
}
-
}
}
@@ -2805,6 +3007,12 @@ void LLFloater::initFromParams(const LLFloater::Params& p)
// control_name, tab_stop, focus_lost_callback, initial_value, rect, enabled, visible
LLPanel::initFromParams(p);
+ // override any follows flags
+ if (mPositioning != LLFloaterEnums::POSITIONING_SPECIFIED)
+ {
+ setFollows(FOLLOWS_NONE);
+ }
+
mTitle = p.title;
mShortTitle = p.short_title;
applyTitle();
@@ -2820,18 +3028,15 @@ void LLFloater::initFromParams(const LLFloater::Params& p)
mHeaderHeight = p.header_height;
mLegacyHeaderHeight = p.legacy_header_height;
mSingleInstance = p.single_instance;
- mAutoTile = p.auto_tile;
- mOpenCentered = p.open_centered;
+ mReuseInstance = p.reuse_instance.isProvided() ? p.reuse_instance : p.single_instance;
- if (p.save_rect)
- {
- mRectControl = "t"; // flag to build mRectControl name once mInstanceName is set
- }
+ mPositioning = p.positioning;
+
+ mSaveRect = p.save_rect;
if (p.save_visibility)
{
mVisibilityControl = "t"; // flag to build mVisibilityControl name once mInstanceName is set
}
-
if(p.save_dock_state)
{
mDocStateControl = "t"; // flag to build mDocStateControl name once mInstanceName is set
@@ -2840,12 +3045,17 @@ void LLFloater::initFromParams(const LLFloater::Params& p)
// open callback
if (p.open_callback.isProvided())
{
- mOpenSignal.connect(initCommitCallback(p.open_callback));
+ setOpenCallback(initCommitCallback(p.open_callback));
}
// close callback
if (p.close_callback.isProvided())
{
- mCloseSignal.connect(initCommitCallback(p.close_callback));
+ setCloseCallback(initCommitCallback(p.close_callback));
+ }
+
+ if (mDragHandle)
+ {
+ mDragHandle->setTitleVisible(p.show_title);
}
}
@@ -2855,14 +3065,67 @@ boost::signals2::connection LLFloater::setMinimizeCallback( const commit_signal_
return mMinimizeSignal->connect(cb);
}
+boost::signals2::connection LLFloater::setOpenCallback( const commit_signal_t::slot_type& cb )
+{
+ return mOpenSignal.connect(cb);
+}
+
+boost::signals2::connection LLFloater::setCloseCallback( const commit_signal_t::slot_type& cb )
+{
+ return mCloseSignal.connect(cb);
+}
+
LLFastTimer::DeclareTimer POST_BUILD("Floater Post Build");
+static LLFastTimer::DeclareTimer FTM_EXTERNAL_FLOATER_LOAD("Load Extern Floater Reference");
bool LLFloater::initFloaterXML(LLXMLNodePtr node, LLView *parent, const std::string& filename, LLXMLNodePtr output_node)
{
- Params params(LLUICtrlFactory::getDefaultParams<LLFloater>());
+ Params default_params(LLUICtrlFactory::getDefaultParams<LLFloater>());
+ Params params(default_params);
+
LLXUIParser parser;
parser.readXUI(node, params, filename); // *TODO: Error checking
+ std::string xml_filename = params.filename;
+
+ if (!xml_filename.empty())
+ {
+ LLXMLNodePtr referenced_xml;
+
+ if (output_node)
+ {
+ //if we are exporting, we want to export the current xml
+ //not the referenced xml
+ Params output_params;
+ parser.readXUI(node, output_params, LLUICtrlFactory::getInstance()->getCurFileName());
+ setupParamsForExport(output_params, parent);
+ output_node->setName(node->getName()->mString);
+ parser.writeXUI(output_node, output_params, &default_params);
+ return TRUE;
+ }
+
+ LLUICtrlFactory::instance().pushFileName(xml_filename);
+
+ LLFastTimer _(FTM_EXTERNAL_FLOATER_LOAD);
+ if (!LLUICtrlFactory::getLayeredXMLNode(xml_filename, referenced_xml))
+ {
+ llwarns << "Couldn't parse panel from: " << xml_filename << llendl;
+
+ return FALSE;
+ }
+
+ Params referenced_params;
+ parser.readXUI(referenced_xml, referenced_params, LLUICtrlFactory::getInstance()->getCurFileName());
+ params.fillFrom(referenced_params);
+
+ // add children using dimensions from referenced xml for consistent layout
+ setShape(params.rect);
+ LLUICtrlFactory::createChildren(this, referenced_xml, child_registry_t::instance());
+
+ LLUICtrlFactory::instance().popFileName();
+ }
+
+
if (output_node)
{
Params output_params(params);
@@ -2883,11 +3146,10 @@ bool LLFloater::initFloaterXML(LLXMLNodePtr node, LLView *parent, const std::str
{
params.rect.left.set(0);
}
-
params.from_xui = true;
- applyXUILayout(params, parent);
+ applyXUILayout(params, parent, parent == gFloaterView ? gFloaterView->getSnapRect() : parent->getLocalRect());
initFromParams(params);
-
+
initFloater(params);
LLMultiFloater* last_host = LLFloater::getFloaterHost();
@@ -3025,3 +3287,159 @@ bool LLFloater::buildFromFile(const std::string& filename, LLXMLNodePtr output_n
return res;
}
+
+void LLFloater::stackWith(LLFloater& other)
+{
+ static LLUICachedControl<S32> floater_offset ("UIFloaterOffset", 16);
+
+ LLRect next_rect;
+ if (other.getHost())
+ {
+ next_rect = other.getHost()->getRect();
+ }
+ else
+ {
+ next_rect = other.getRect();
+ }
+ next_rect.translate(floater_offset, -floater_offset);
+
+ next_rect.setLeftTopAndSize(next_rect.mLeft, next_rect.mTop, getRect().getWidth(), getRect().getHeight());
+
+ setShape(next_rect);
+
+ if (!other.getHost())
+ {
+ other.mPositioning = LLFloaterEnums::POSITIONING_CASCADE_GROUP;
+ other.setFollows(FOLLOWS_LEFT | FOLLOWS_TOP);
+ }
+}
+
+void LLFloater::applyRelativePosition()
+{
+ LLRect snap_rect = gFloaterView->getSnapRect();
+ LLRect floater_view_screen_rect = gFloaterView->calcScreenRect();
+ snap_rect.translate(floater_view_screen_rect.mLeft, floater_view_screen_rect.mBottom);
+ LLRect floater_screen_rect = calcScreenRect();
+
+ LLCoordGL new_center = mPosition.convert();
+ LLCoordGL cur_center(floater_screen_rect.getCenterX(), floater_screen_rect.getCenterY());
+ translate(new_center.mX - cur_center.mX, new_center.mY - cur_center.mY);
+}
+
+
+LLCoordFloater::LLCoordFloater(F32 x, F32 y, LLFloater& floater)
+: coord_t((S32)x, (S32)y)
+{
+ mFloater = floater.getHandle();
+}
+
+
+LLCoordFloater::LLCoordFloater(const LLCoordCommon& other, LLFloater& floater)
+{
+ mFloater = floater.getHandle();
+ convertFromCommon(other);
+}
+
+LLCoordFloater& LLCoordFloater::operator=(const LLCoordFloater& other)
+{
+ mFloater = other.mFloater;
+ coord_t::operator =(other);
+ return *this;
+}
+
+void LLCoordFloater::setFloater(LLFloater& floater)
+{
+ mFloater = floater.getHandle();
+}
+
+bool LLCoordFloater::operator==(const LLCoordFloater& other) const
+{
+ return mX == other.mX && mY == other.mY && mFloater == other.mFloater;
+}
+
+LLCoordCommon LL_COORD_FLOATER::convertToCommon() const
+{
+ const LLCoordFloater& self = static_cast<const LLCoordFloater&>(LLCoordFloater::getTypedCoords(*this));
+
+ LLRect snap_rect = gFloaterView->getSnapRect();
+ LLRect floater_view_screen_rect = gFloaterView->calcScreenRect();
+ snap_rect.translate(floater_view_screen_rect.mLeft, floater_view_screen_rect.mBottom);
+
+ LLFloater* floaterp = mFloater.get();
+ S32 floater_width = floaterp ? floaterp->getRect().getWidth() : 0;
+ S32 floater_height = floaterp ? floaterp->getRect().getHeight() : 0;
+ LLCoordCommon out;
+ if (self.mX < -0.5f)
+ {
+ out.mX = llround(rescale(self.mX, -1.f, -0.5f, snap_rect.mLeft - (floater_width - FLOATER_MIN_VISIBLE_PIXELS), snap_rect.mLeft));
+ }
+ else if (self.mX > 0.5f)
+ {
+ out.mX = llround(rescale(self.mX, 0.5f, 1.f, snap_rect.mRight - floater_width, snap_rect.mRight - FLOATER_MIN_VISIBLE_PIXELS));
+ }
+ else
+ {
+ out.mX = llround(rescale(self.mX, -0.5f, 0.5f, snap_rect.mLeft, snap_rect.mRight - floater_width));
+ }
+
+ if (self.mY < -0.5f)
+ {
+ out.mY = llround(rescale(self.mY, -1.f, -0.5f, snap_rect.mBottom - (floater_height - FLOATER_MIN_VISIBLE_PIXELS), snap_rect.mBottom));
+ }
+ else if (self.mY > 0.5f)
+ {
+ out.mY = llround(rescale(self.mY, 0.5f, 1.f, snap_rect.mTop - floater_height, snap_rect.mTop - FLOATER_MIN_VISIBLE_PIXELS));
+ }
+ else
+ {
+ out.mY = llround(rescale(self.mY, -0.5f, 0.5f, snap_rect.mBottom, snap_rect.mTop - floater_height));
+ }
+
+ // return center point instead of lower left
+ out.mX += floater_width / 2;
+ out.mY += floater_height / 2;
+
+ return out;
+}
+
+void LL_COORD_FLOATER::convertFromCommon(const LLCoordCommon& from)
+{
+ LLCoordFloater& self = static_cast<LLCoordFloater&>(LLCoordFloater::getTypedCoords(*this));
+ LLRect snap_rect = gFloaterView->getSnapRect();
+ LLRect floater_view_screen_rect = gFloaterView->calcScreenRect();
+ snap_rect.translate(floater_view_screen_rect.mLeft, floater_view_screen_rect.mBottom);
+
+
+ LLFloater* floaterp = mFloater.get();
+ S32 floater_width = floaterp ? floaterp->getRect().getWidth() : 0;
+ S32 floater_height = floaterp ? floaterp->getRect().getHeight() : 0;
+
+ S32 from_x = from.mX - floater_width / 2;
+ S32 from_y = from.mY - floater_height / 2;
+
+ if (from_x < snap_rect.mLeft)
+ {
+ self.mX = rescale(from_x, snap_rect.mLeft - (floater_width - FLOATER_MIN_VISIBLE_PIXELS), snap_rect.mLeft, -1.f, -0.5f);
+ }
+ else if (from_x + floater_width > snap_rect.mRight)
+ {
+ self.mX = rescale(from_x, snap_rect.mRight - floater_width, snap_rect.mRight - FLOATER_MIN_VISIBLE_PIXELS, 0.5f, 1.f);
+ }
+ else
+ {
+ self.mX = rescale(from_x, snap_rect.mLeft, snap_rect.mRight - floater_width, -0.5f, 0.5f);
+ }
+
+ if (from_y < snap_rect.mBottom)
+ {
+ self.mY = rescale(from_y, snap_rect.mBottom - (floater_height - FLOATER_MIN_VISIBLE_PIXELS), snap_rect.mBottom, -1.f, -0.5f);
+ }
+ else if (from_y + floater_height > snap_rect.mTop)
+ {
+ self.mY = rescale(from_y, snap_rect.mTop - floater_height, snap_rect.mTop - FLOATER_MIN_VISIBLE_PIXELS, 0.5f, 1.f);
+ }
+ else
+ {
+ self.mY = rescale(from_y, snap_rect.mBottom, snap_rect.mTop - floater_height, -0.5f, 0.5f);
+ }
+}
diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h
index fa806bb632..64d6dcea04 100644
--- a/indra/llui/llfloater.h
+++ b/indra/llui/llfloater.h
@@ -35,6 +35,7 @@
#include "lluuid.h"
//#include "llnotificationsutil.h"
#include <set>
+#include <boost/signals2.hpp>
class LLDragHandle;
class LLResizeHandle;
@@ -59,11 +60,66 @@ const BOOL CLOSE_NO = FALSE;
const BOOL ADJUST_VERTICAL_YES = TRUE;
const BOOL ADJUST_VERTICAL_NO = FALSE;
-class LLFloater : public LLPanel
+namespace LLFloaterEnums
{
-friend class LLFloaterView;
-friend class LLFloaterReg;
-friend class LLMultiFloater;
+ enum EOpenPositioning
+ {
+ POSITIONING_RELATIVE,
+ POSITIONING_CASCADING,
+ POSITIONING_CASCADE_GROUP,
+ POSITIONING_CENTERED,
+ POSITIONING_SPECIFIED,
+ POSITIONING_COUNT
+ };
+}
+
+namespace LLInitParam
+{
+ template<>
+ struct TypeValues<LLFloaterEnums::EOpenPositioning> : public TypeValuesHelper<LLFloaterEnums::EOpenPositioning>
+ {
+ static void declareValues();
+ };
+}
+
+struct LL_COORD_FLOATER
+{
+ typedef F32 value_t;
+
+ LLCoordCommon convertToCommon() const;
+ void convertFromCommon(const LLCoordCommon& from);
+protected:
+ LLHandle<LLFloater> mFloater;
+};
+
+struct LLCoordFloater : LLCoord<LL_COORD_FLOATER>
+{
+ typedef LLCoord<LL_COORD_FLOATER> coord_t;
+
+ LLCoordFloater() {}
+ LLCoordFloater(F32 x, F32 y, LLFloater& floater);
+ LLCoordFloater(const LLCoordCommon& other, LLFloater& floater);
+
+ LLCoordFloater& operator=(const LLCoordCommon& other)
+ {
+ convertFromCommon(other);
+ return *this;
+ }
+
+ LLCoordFloater& operator=(const LLCoordFloater& other);
+
+ bool operator==(const LLCoordFloater& other) const;
+ bool operator!=(const LLCoordFloater& other) const { return !(*this == other); }
+
+ void setFloater(LLFloater& floater);
+};
+
+class LLFloater : public LLPanel, public LLInstanceTracker<LLFloater>
+{
+ friend class LLFloaterView;
+ friend class LLFloaterReg;
+ friend class LLMultiFloater;
+
public:
struct KeyCompare
{
@@ -95,7 +151,7 @@ public:
short_title;
Optional<bool> single_instance,
- auto_tile,
+ reuse_instance,
can_resize,
can_minimize,
can_close,
@@ -105,7 +161,10 @@ public:
save_visibility,
save_dock_state,
can_dock,
- open_centered;
+ show_title;
+
+ Optional<LLFloaterEnums::EOpenPositioning> positioning;
+
Optional<S32> header_height,
legacy_header_height; // HACK see initFromXML()
@@ -125,6 +184,8 @@ public:
Optional<CommitCallbackParam> open_callback,
close_callback;
+
+ Ignored follows;
Params();
};
@@ -144,12 +205,14 @@ public:
bool buildFromFile(const std::string &filename, LLXMLNodePtr output_node = NULL);
boost::signals2::connection setMinimizeCallback( const commit_signal_t::slot_type& cb );
+ boost::signals2::connection setOpenCallback( const commit_signal_t::slot_type& cb );
+ boost::signals2::connection setCloseCallback( const commit_signal_t::slot_type& cb );
void initFromParams(const LLFloater::Params& p);
bool initFloaterXML(LLXMLNodePtr node, LLView *parent, const std::string& filename, LLXMLNodePtr output_node = NULL);
/*virtual*/ void handleReshape(const LLRect& new_rect, bool by_user = false);
- /*virtual*/ BOOL canSnapTo(const LLView* other_view);
+ /*virtual*/ BOOL canSnapTo(const LLView* other_view);
/*virtual*/ void setSnappedTo(const LLView* snap_view);
/*virtual*/ void setFocus( BOOL b );
/*virtual*/ void setIsChrome(BOOL is_chrome);
@@ -178,7 +241,6 @@ public:
std::string getTitle() const;
void setShortTitle( const std::string& short_title );
std::string getShortTitle() const;
- void setTitleVisible(bool visible);
virtual void setMinimized(BOOL b);
void moveResizeHandlesToFront();
void addDependentFloater(LLFloater* dependent, BOOL reposition = TRUE);
@@ -202,12 +264,11 @@ public:
void setCanTearOff(BOOL can_tear_off);
virtual void setCanResize(BOOL can_resize);
void setCanDrag(BOOL can_drag);
+ bool getCanDrag();
void setHost(LLMultiFloater* host);
BOOL isResizable() const { return mResizable; }
void setResizeLimits( S32 min_width, S32 min_height );
void getResizeLimits( S32* min_width, S32* min_height ) { *min_width = mMinWidth; *min_height = mMinHeight; }
- LLRect getSavedRect() const;
- bool hasSavedRect() const;
static std::string getControlName(const std::string& name, const LLSD& key);
static LLControlGroup* getControlGroup();
@@ -250,9 +311,9 @@ public:
void clearSnapTarget() { mSnappedTo.markDead(); }
LLHandle<LLFloater> getSnapTarget() const { return mSnappedTo; }
- LLHandle<LLFloater> getHandle() const { return mHandle; }
+ LLHandle<LLFloater> getHandle() const { return getDerivedHandle<LLFloater>(); }
const LLSD& getKey() { return mKey; }
- BOOL matchesKey(const LLSD& key) { return mSingleInstance || KeyCompare::equate(key, mKey); }
+ virtual bool matchesKey(const LLSD& key) { return mSingleInstance || KeyCompare::equate(key, mKey); }
const std::string& getInstanceName() { return mInstanceName; }
@@ -284,15 +345,22 @@ public:
static void setFloaterHost(LLMultiFloater* hostp) {sHostp = hostp; }
static LLMultiFloater* getFloaterHost() {return sHostp; }
+
+ void updateTransparency(ETypeTransparency transparency_type);
+ void enableResizeCtrls(bool enable, bool width = true, bool height = true);
+
+ bool isPositioning(LLFloaterEnums::EOpenPositioning p) const { return (p == mPositioning); }
protected:
+ void applyControlsAndPosition(LLFloater* other);
- void setRectControl(const std::string& rectname) { mRectControl = rectname; };
+ void stackWith(LLFloater& other);
- virtual void applySavedVariables();
+ virtual bool applyRectControl();
+ bool applyDockState();
+ void applyPositioning(LLFloater* other, bool on_open);
+ void applyRelativePosition();
- void applyRectControl();
- void applyDockState();
void storeRectControl();
void storeVisibilityControl();
void storeDockStateControl();
@@ -337,12 +405,12 @@ private:
BOOL offerClickToButton(S32 x, S32 y, MASK mask, EFloaterButton index);
void addResizeCtrls();
void layoutResizeCtrls();
- void enableResizeCtrls(bool enable);
void addDragHandle();
void layoutDragHandle(); // repair layout
static void updateActiveFloaterTransparency();
static void updateInactiveFloaterTransparency();
+ void updateTransparency(LLView* view, ETypeTransparency transparency_type);
public:
// Called when floater is opened, passes mKey
@@ -356,7 +424,10 @@ public:
commit_signal_t* mMinimizeSignal;
protected:
+ bool mSaveRect;
std::string mRectControl;
+ std::string mPosXControl;
+ std::string mPosYControl;
std::string mVisibilityControl;
std::string mDocStateControl;
LLSD mKey; // Key used for retrieving instances; set (for now) by LLFLoaterReg
@@ -373,15 +444,17 @@ private:
LLUIString mShortTitle;
BOOL mSingleInstance; // TRUE if there is only ever one instance of the floater
+ bool mReuseInstance; // true if we want to hide the floater when we close it instead of destroying it
std::string mInstanceName; // Store the instance name so we can remove ourselves from the list
- BOOL mAutoTile; // TRUE if placement of new instances tiles
BOOL mCanTearOff;
BOOL mCanMinimize;
BOOL mCanClose;
BOOL mDragOnLeft;
BOOL mResizable;
- bool mOpenCentered;
+
+ LLFloaterEnums::EOpenPositioning mPositioning;
+ LLCoordFloater mPosition;
S32 mMinWidth;
S32 mMinHeight;
@@ -411,11 +484,6 @@ private:
bool mDocked;
bool mTornOff;
- F32 mCurrentTransparency;
-
- static F32 sActiveFloaterTransparency;
- static F32 sInactiveFloaterTransparency;
-
static LLMultiFloater* sHostp;
static BOOL sQuitting;
static std::string sButtonNames[BUTTON_COUNT];
@@ -425,18 +493,9 @@ private:
typedef void(*click_callback)(LLFloater*);
static click_callback sButtonCallbacks[BUTTON_COUNT];
- typedef std::map<LLHandle<LLFloater>, LLFloater*> handle_map_t;
- typedef std::map<LLHandle<LLFloater>, LLFloater*>::iterator handle_map_iter_t;
- static handle_map_t sFloaterMap;
-
- std::vector<LLHandle<LLView> > mMinimizedHiddenChildren;
-
BOOL mHasBeenDraggedWhileMinimized;
S32 mPreviousMinimizedBottom;
S32 mPreviousMinimizedLeft;
-
-// LLFloaterNotificationContext* mNotificationContext;
- LLRootHandle<LLFloater> mHandle;
};
@@ -456,8 +515,6 @@ protected:
public:
/*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
- void reshapeFloater(S32 width, S32 height, BOOL called_from_parent, BOOL adjust_vertical);
-
/*virtual*/ void draw();
/*virtual*/ LLRect getSnapRect() const;
/*virtual*/ void refresh();
@@ -486,6 +543,10 @@ public:
BOOL allChildrenClosed();
void shiftFloaters(S32 x_offset, S32 y_offset);
+ void hideAllFloaters();
+ void showHiddenFloaters();
+
+
LLFloater* getFrontmost() const;
LLFloater* getBackmost() const;
LLFloater* getParentFloater(LLView* viewp) const;
@@ -497,14 +558,19 @@ public:
// value is not defined.
S32 getZOrder(LLFloater* child);
- void setSnapOffsetBottom(S32 offset) { mSnapOffsetBottom = offset; }
- void setSnapOffsetRight(S32 offset) { mSnapOffsetRight = offset; }
+ void setFloaterSnapView(LLHandle<LLView> snap_view) {mSnapView = snap_view; }
private:
+ void hiddenFloaterClosed(LLFloater* floater);
+
+ LLRect mLastSnapRect;
+ LLHandle<LLView> mSnapView;
BOOL mFocusCycleMode;
S32 mSnapOffsetBottom;
S32 mSnapOffsetRight;
S32 mMinimizePositionVOffset;
+ typedef std::vector<std::pair<LLHandle<LLFloater>, boost::signals2::connection> > hidden_floaters_t;
+ hidden_floaters_t mHiddenFloaters;
};
//
diff --git a/indra/llui/llfloaterreg.cpp b/indra/llui/llfloaterreg.cpp
index 4677d535db..9115eb7174 100644
--- a/indra/llui/llfloaterreg.cpp
+++ b/indra/llui/llfloaterreg.cpp
@@ -57,29 +57,59 @@ void LLFloaterReg::add(const std::string& name, const std::string& filename, con
}
//static
-LLRect LLFloaterReg::getFloaterRect(const std::string& name)
+LLFloater* LLFloaterReg::getLastFloaterInGroup(const std::string& name)
{
- LLRect rect;
const std::string& groupname = sGroupMap[name];
if (!groupname.empty())
{
instance_list_t& list = sInstanceMap[groupname];
if (!list.empty())
{
- static LLUICachedControl<S32> floater_offset ("UIFloaterOffset", 16);
- LLFloater* last_floater = list.back();
- if (last_floater->getHost())
+ for (instance_list_t::reverse_iterator iter = list.rbegin(); iter != list.rend(); ++iter)
{
- rect = last_floater->getHost()->getRect();
+ LLFloater* inst = *iter;
+
+ if (inst->getVisible() && !inst->isMinimized())
+ {
+ return inst;
+ }
}
- else
+ }
+ }
+ return NULL;
+}
+
+LLFloater* LLFloaterReg::getLastFloaterCascading()
+{
+ LLRect candidate_rect;
+ candidate_rect.mTop = 100000;
+ LLFloater* candidate_floater = NULL;
+
+ std::map<std::string,std::string>::const_iterator it = sGroupMap.begin(), it_end = sGroupMap.end();
+ for( ; it != it_end; ++it)
+ {
+ const std::string& group_name = it->second;
+
+ instance_list_t& instances = sInstanceMap[group_name];
+
+ for (instance_list_t::const_iterator iter = instances.begin(); iter != instances.end(); ++iter)
+ {
+ LLFloater* inst = *iter;
+
+ if (inst->getVisible()
+ && (inst->isPositioning(LLFloaterEnums::POSITIONING_CASCADING)
+ || inst->isPositioning(LLFloaterEnums::POSITIONING_CASCADE_GROUP)))
{
- rect = last_floater->getRect();
+ if (candidate_rect.mTop > inst->getRect().mTop)
+ {
+ candidate_floater = inst;
+ candidate_rect = inst->getRect();
+ }
}
- rect.translate(floater_offset, -floater_offset);
}
}
- return rect;
+
+ return candidate_floater;
}
//static
@@ -117,34 +147,33 @@ LLFloater* LLFloaterReg::getInstance(const std::string& name, const LLSD& key)
if (!groupname.empty())
{
instance_list_t& list = sInstanceMap[groupname];
- int index = list.size();
res = build_func(key);
-
+ if (!res)
+ {
+ llwarns << "Failed to build floater type: '" << name << "'." << llendl;
+ return NULL;
+ }
bool success = res->buildFromFile(xui_file, NULL);
if (!success)
{
llwarns << "Failed to build floater type: '" << name << "'." << llendl;
return NULL;
}
-
+
// Note: key should eventually be a non optional LLFloater arg; for now, set mKey to be safe
- res->mKey = key;
- res->setInstanceName(name);
- res->applySavedVariables(); // Can't apply rect and dock state until setting instance name
- if (res->mAutoTile && !res->getHost() && index > 0)
+ if (res->mKey.isUndefined())
{
- const LLRect& cur_rect = res->getRect();
- LLRect next_rect = getFloaterRect(groupname);
- next_rect.setLeftTopAndSize(next_rect.mLeft, next_rect.mTop, cur_rect.getWidth(), cur_rect.getHeight());
- res->setRect(next_rect);
- res->setRectControl(LLStringUtil::null); // don't save rect of tiled floaters
- gFloaterView->adjustToFitScreen(res, true);
- }
- else
- {
- gFloaterView->adjustToFitScreen(res, false);
+ res->mKey = key;
}
+ res->setInstanceName(name);
+
+ LLFloater *last_floater = (list.empty() ? NULL : list.back());
+
+ res->applyControlsAndPosition(last_floater);
+
+ gFloaterView->adjustToFitScreen(res, false);
+
list.push_back(res);
}
}
@@ -331,9 +360,7 @@ void LLFloaterReg::restoreVisibleInstances()
//static
std::string LLFloaterReg::getRectControlName(const std::string& name)
{
- std::string res = std::string("floater_rect_") + name;
- LLStringUtil::replaceChar( res, ' ', '_' );
- return res;
+ return std::string("floater_rect_") + getBaseControlName(name);
}
//static
@@ -341,19 +368,48 @@ std::string LLFloaterReg::declareRectControl(const std::string& name)
{
std::string controlname = getRectControlName(name);
LLFloater::getControlGroup()->declareRect(controlname, LLRect(),
- llformat("Window Position and Size for %s", name.c_str()),
+ llformat("Window Size for %s", name.c_str()),
TRUE);
return controlname;
}
+std::string LLFloaterReg::declarePosXControl(const std::string& name)
+{
+ std::string controlname = std::string("floater_pos_") + getBaseControlName(name) + "_x";
+ LLFloater::getControlGroup()->declareF32(controlname,
+ 10.f,
+ llformat("Window X Position for %s", name.c_str()),
+ TRUE);
+ return controlname;
+}
+
+std::string LLFloaterReg::declarePosYControl(const std::string& name)
+{
+ std::string controlname = std::string("floater_pos_") + getBaseControlName(name) + "_y";
+ LLFloater::getControlGroup()->declareF32(controlname,
+ 10.f,
+ llformat("Window Y Position for %s", name.c_str()),
+ TRUE);
+
+ return controlname;
+}
+
+
//static
std::string LLFloaterReg::getVisibilityControlName(const std::string& name)
{
- std::string res = std::string("floater_vis_") + name;
+ return std::string("floater_vis_") + getBaseControlName(name);
+}
+
+//static
+std::string LLFloaterReg::getBaseControlName(const std::string& name)
+{
+ std::string res(name);
LLStringUtil::replaceChar( res, ' ', '_' );
return res;
}
+
//static
std::string LLFloaterReg::declareVisibilityControl(const std::string& name)
{
@@ -410,70 +466,71 @@ void LLFloaterReg::registerControlVariables()
}
}
-// Callbacks
-
-// static
-// Call once (i.e use for init callbacks)
-void LLFloaterReg::initUICtrlToFloaterVisibilityControl(LLUICtrl* ctrl, const LLSD& sdname)
+//static
+void LLFloaterReg::toggleInstanceOrBringToFront(const LLSD& sdname, const LLSD& key)
{
- // Get the visibility control name for the floater
- std::string vis_control_name = LLFloaterReg::declareVisibilityControl(sdname.asString());
- // Set the control value to the floater visibility control (Sets the value as well)
- ctrl->setControlVariable(LLFloater::getControlGroup()->getControl(vis_control_name));
-}
+ //
+ // Floaters controlled by the toolbar behave a bit differently from others.
+ // Namely they have 3-4 states as defined in the design wiki page here:
+ // https://wiki.lindenlab.com/wiki/FUI_Button_states
+ //
+ // The basic idea is this:
+ // * If the target floater is minimized, this button press will un-minimize it.
+ // * Else if the target floater is closed open it.
+ // * Else if the target floater does not have focus, give it focus.
+ // * Also, if it is not on top, bring it forward when focus is given.
+ // * Else the target floater is open, close it.
+ //
-// callback args may use "floatername.key" format
-static void parse_name_key(std::string& name, LLSD& key)
-{
- std::string instname = name;
- std::size_t dotpos = instname.find(".");
- if (dotpos != std::string::npos)
+ std::string name = sdname.asString();
+ LLFloater* instance = getInstance(name, key);
+
+ if (!instance)
+ {
+ lldebugs << "Unable to get instance of floater '" << name << "'" << llendl;
+ }
+ else if (instance->isMinimized())
+ {
+ instance->setMinimized(FALSE);
+ instance->setVisibleAndFrontmost();
+ }
+ else if (!instance->isShown())
+ {
+ instance->openFloater(key);
+ instance->setVisibleAndFrontmost();
+ }
+ else if (!instance->isFrontmost())
+ {
+ instance->setVisibleAndFrontmost();
+ }
+ else
{
- name = instname.substr(0, dotpos);
- key = LLSD(instname.substr(dotpos+1, std::string::npos));
+ instance->closeFloater();
}
}
-//static
-void LLFloaterReg::showFloaterInstance(const LLSD& sdname)
-{
- LLSD key;
- std::string name = sdname.asString();
- parse_name_key(name, key);
- showInstance(name, key, TRUE);
-}
-//static
-void LLFloaterReg::hideFloaterInstance(const LLSD& sdname)
-{
- LLSD key;
- std::string name = sdname.asString();
- parse_name_key(name, key);
- hideInstance(name, key);
-}
-//static
-void LLFloaterReg::toggleFloaterInstance(const LLSD& sdname)
+// static
+U32 LLFloaterReg::getVisibleFloaterInstanceCount()
{
- LLSD key;
- std::string name = sdname.asString();
- parse_name_key(name, key);
- toggleInstance(name, key);
-}
+ U32 count = 0;
-//static
-bool LLFloaterReg::floaterInstanceVisible(const LLSD& sdname)
-{
- LLSD key;
- std::string name = sdname.asString();
- parse_name_key(name, key);
- return instanceVisible(name, key);
-}
+ std::map<std::string,std::string>::const_iterator it = sGroupMap.begin(), it_end = sGroupMap.end();
+ for( ; it != it_end; ++it)
+ {
+ const std::string& group_name = it->second;
-//static
-bool LLFloaterReg::floaterInstanceMinimized(const LLSD& sdname)
-{
- LLSD key;
- std::string name = sdname.asString();
- parse_name_key(name, key);
- LLFloater* instance = findInstance(name, key);
- return LLFloater::isShown(instance);
+ instance_list_t& instances = sInstanceMap[group_name];
+
+ for (instance_list_t::const_iterator iter = instances.begin(); iter != instances.end(); ++iter)
+ {
+ LLFloater* inst = *iter;
+
+ if (inst->getVisible() && !inst->isMinimized())
+ {
+ count++;
+ }
+ }
+ }
+
+ return count;
}
diff --git a/indra/llui/llfloaterreg.h b/indra/llui/llfloaterreg.h
index 94387fb41a..a1e1f8a988 100644
--- a/indra/llui/llfloaterreg.h
+++ b/indra/llui/llfloaterreg.h
@@ -27,14 +27,9 @@
#define LLFLOATERREG_H
/// llcommon
-#include "llboost.h"
#include "llrect.h"
-#include "llstl.h"
#include "llsd.h"
-/// llui
-#include "lluictrl.h"
-
#include <boost/function.hpp>
//*******************************************************
@@ -43,6 +38,7 @@
//
class LLFloater;
+class LLUICtrl;
typedef boost::function<LLFloater* (const LLSD& key)> LLFloaterBuildFunc;
@@ -90,7 +86,8 @@ public:
const std::string& groupname = LLStringUtil::null);
// Helpers
- static LLRect getFloaterRect(const std::string& name);
+ static LLFloater* getLastFloaterInGroup(const std::string& name);
+ static LLFloater* getLastFloaterCascading();
// Find / get (create) / remove / destroy
static LLFloater* findInstance(const std::string& name, const LLSD& key = LLSD());
@@ -118,21 +115,18 @@ public:
// Control Variables
static std::string getRectControlName(const std::string& name);
static std::string declareRectControl(const std::string& name);
+ static std::string declarePosXControl(const std::string& name);
+ static std::string declarePosYControl(const std::string& name);
static std::string getVisibilityControlName(const std::string& name);
static std::string declareVisibilityControl(const std::string& name);
-
+ static std::string getBaseControlName(const std::string& name);
static std::string declareDockStateControl(const std::string& name);
static std::string getDockStateControlName(const std::string& name);
static void registerControlVariables();
// Callback wrappers
- static void initUICtrlToFloaterVisibilityControl(LLUICtrl* ctrl, const LLSD& sdname);
- static void showFloaterInstance(const LLSD& sdname);
- static void hideFloaterInstance(const LLSD& sdname);
- static void toggleFloaterInstance(const LLSD& sdname);
- static bool floaterInstanceVisible(const LLSD& sdname);
- static bool floaterInstanceMinimized(const LLSD& sdname);
+ static void toggleInstanceOrBringToFront(const LLSD& sdname, const LLSD& key = LLSD());
// Typed find / get / show
template <class T>
@@ -155,6 +149,7 @@ public:
static void blockShowFloaters(bool value) { sBlockShowFloaters = value;}
+ static U32 getVisibleFloaterInstanceCount();
};
#endif
diff --git a/indra/llui/llfloaterreglistener.cpp b/indra/llui/llfloaterreglistener.cpp
index 821d4543ae..7525b8cab3 100644
--- a/indra/llui/llfloaterreglistener.cpp
+++ b/indra/llui/llfloaterreglistener.cpp
@@ -60,6 +60,11 @@ LLFloaterRegListener::LLFloaterRegListener():
"Ask to toggle the state of the floater specified in [\"name\"]",
&LLFloaterRegListener::toggleInstance,
requiredName);
+ add("instanceVisible",
+ "Return on [\"reply\"] an event whose [\"visible\"] indicates the visibility "
+ "of the floater specified in [\"name\"]",
+ &LLFloaterRegListener::instanceVisible,
+ requiredName);
LLSD requiredNameButton;
requiredNameButton["name"] = LLSD();
requiredNameButton["button"] = LLSD();
@@ -71,9 +76,7 @@ LLFloaterRegListener::LLFloaterRegListener():
void LLFloaterRegListener::getBuildMap(const LLSD& event) const
{
- // Honor the "reqid" convention by echoing event["reqid"] in our reply packet.
- LLReqID reqID(event);
- LLSD reply(reqID.makeResponse());
+ LLSD reply;
// Build an LLSD map that mirrors sBuildMap. Since we have no good way to
// represent a C++ callable in LLSD, the only part of BuildData we can
// store is the filename. For each LLSD map entry, it would be more
@@ -86,7 +89,7 @@ void LLFloaterRegListener::getBuildMap(const LLSD& event) const
reply[mi->first] = mi->second.mFile;
}
// Send the reply to the LLEventPump named in event["reply"].
- LLEventPumps::instance().obtain(event["reply"]).post(reply);
+ sendReply(reply, event);
}
void LLFloaterRegListener::showInstance(const LLSD& event) const
@@ -104,6 +107,12 @@ void LLFloaterRegListener::toggleInstance(const LLSD& event) const
LLFloaterReg::toggleInstance(event["name"], event["key"]);
}
+void LLFloaterRegListener::instanceVisible(const LLSD& event) const
+{
+ sendReply(LLSDMap("visible", LLFloaterReg::instanceVisible(event["name"], event["key"])),
+ event);
+}
+
void LLFloaterRegListener::clickButton(const LLSD& event) const
{
// If the caller requests a reply, build the reply.
diff --git a/indra/llui/llfloaterreglistener.h b/indra/llui/llfloaterreglistener.h
index 586656667c..24311a2dfa 100644
--- a/indra/llui/llfloaterreglistener.h
+++ b/indra/llui/llfloaterreglistener.h
@@ -47,6 +47,7 @@ private:
void showInstance(const LLSD& event) const;
void hideInstance(const LLSD& event) const;
void toggleInstance(const LLSD& event) const;
+ void instanceVisible(const LLSD& event) const;
void clickButton(const LLSD& event) const;
};
diff --git a/indra/llui/llflyoutbutton.h b/indra/llui/llflyoutbutton.h
index 8d59380a00..36998eba2e 100644
--- a/indra/llui/llflyoutbutton.h
+++ b/indra/llui/llflyoutbutton.h
@@ -46,7 +46,7 @@ public:
: action_button("action_button"),
allow_text_entry("allow_text_entry")
{
- LLComboBox::Params::allow_text_entry = false;
+ changeDefault(LLComboBox::Params::allow_text_entry, false);
}
};
diff --git a/indra/llui/llfocusmgr.cpp b/indra/llui/llfocusmgr.cpp
index 43e5f6b051..724d190307 100644
--- a/indra/llui/llfocusmgr.cpp
+++ b/indra/llui/llfocusmgr.cpp
@@ -113,6 +113,16 @@ boost::signals2::connection LLFocusableElement::setTopLostCallback(const focus_s
+typedef std::list<LLHandle<LLView> > view_handle_list_t;
+typedef std::map<LLHandle<LLView>, LLHandle<LLView> > focus_history_map_t;
+struct LLFocusMgr::Impl
+{
+ // caching list of keyboard focus ancestors for calling onFocusReceived and onFocusLost
+ view_handle_list_t mCachedKeyboardFocusList;
+
+ focus_history_map_t mFocusHistory;
+};
+
LLFocusMgr gFocusMgr;
LLFocusMgr::LLFocusMgr()
@@ -123,10 +133,17 @@ LLFocusMgr::LLFocusMgr()
mDefaultKeyboardFocus( NULL ),
mKeystrokesOnly(FALSE),
mTopCtrl( NULL ),
- mAppHasFocus(TRUE) // Macs don't seem to notify us that we've gotten focus, so default to true
+ mAppHasFocus(TRUE), // Macs don't seem to notify us that we've gotten focus, so default to true
+ mImpl(new LLFocusMgr::Impl)
{
}
+LLFocusMgr::~LLFocusMgr()
+{
+ mImpl->mFocusHistory.clear();
+ delete mImpl;
+ mImpl = NULL;
+}
void LLFocusMgr::releaseFocusIfNeeded( LLView* view )
{
@@ -179,7 +196,7 @@ void LLFocusMgr::setKeyboardFocus(LLFocusableElement* new_focus, BOOL lock, BOOL
mKeyboardFocus = new_focus;
// list of the focus and it's ancestors
- view_handle_list_t old_focus_list = mCachedKeyboardFocusList;
+ view_handle_list_t old_focus_list = mImpl->mCachedKeyboardFocusList;
view_handle_list_t new_focus_list;
// walk up the tree to root and add all views to the new_focus_list
@@ -206,7 +223,7 @@ void LLFocusMgr::setKeyboardFocus(LLFocusableElement* new_focus, BOOL lock, BOOL
LLView* old_focus_view = old_focus_iter->get();
if (old_focus_view)
{
- mCachedKeyboardFocusList.pop_front();
+ mImpl->mCachedKeyboardFocusList.pop_front();
old_focus_view->onFocusLost();
}
}
@@ -219,7 +236,7 @@ void LLFocusMgr::setKeyboardFocus(LLFocusableElement* new_focus, BOOL lock, BOOL
LLView* new_focus_view = new_focus_riter->get();
if (new_focus_view)
{
- mCachedKeyboardFocusList.push_front(new_focus_view->getHandle());
+ mImpl->mCachedKeyboardFocusList.push_front(new_focus_view->getHandle());
new_focus_view->onFocusReceived();
}
}
@@ -254,7 +271,7 @@ void LLFocusMgr::setKeyboardFocus(LLFocusableElement* new_focus, BOOL lock, BOOL
if (focus_subtree)
{
LLView* focused_view = dynamic_cast<LLView*>(mKeyboardFocus);
- mFocusHistory[focus_subtree->getHandle()] = focused_view ? focused_view->getHandle() : LLHandle<LLView>();
+ mImpl->mFocusHistory[focus_subtree->getHandle()] = focused_view ? focused_view->getHandle() : LLHandle<LLView>();
}
}
@@ -456,8 +473,8 @@ LLUICtrl* LLFocusMgr::getLastFocusForGroup(LLView* subtree_root) const
{
if (subtree_root)
{
- focus_history_map_t::const_iterator found_it = mFocusHistory.find(subtree_root->getHandle());
- if (found_it != mFocusHistory.end())
+ focus_history_map_t::const_iterator found_it = mImpl->mFocusHistory.find(subtree_root->getHandle());
+ if (found_it != mImpl->mFocusHistory.end())
{
// found last focus for this subtree
return static_cast<LLUICtrl*>(found_it->second.get());
@@ -470,6 +487,6 @@ void LLFocusMgr::clearLastFocusForGroup(LLView* subtree_root)
{
if (subtree_root)
{
- mFocusHistory.erase(subtree_root->getHandle());
+ mImpl->mFocusHistory.erase(subtree_root->getHandle());
}
}
diff --git a/indra/llui/llfocusmgr.h b/indra/llui/llfocusmgr.h
index 22c1895075..25ae1d2579 100644
--- a/indra/llui/llfocusmgr.h
+++ b/indra/llui/llfocusmgr.h
@@ -74,7 +74,7 @@ class LLFocusMgr
{
public:
LLFocusMgr();
- ~LLFocusMgr() { mFocusHistory.clear(); }
+ ~LLFocusMgr();
// Mouse Captor
void setMouseCapture(LLMouseHandler* new_captor); // new_captor = NULL to release the mouse.
@@ -120,6 +120,8 @@ public:
bool keyboardFocusHasAccelerators() const;
+ struct Impl;
+
private:
LLUICtrl* mLockedView;
@@ -132,10 +134,6 @@ private:
LLFocusableElement* mDefaultKeyboardFocus;
BOOL mKeystrokesOnly;
- // caching list of keyboard focus ancestors for calling onFocusReceived and onFocusLost
- typedef std::list<LLHandle<LLView> > view_handle_list_t;
- view_handle_list_t mCachedKeyboardFocusList;
-
// Top View
LLUICtrl* mTopCtrl;
@@ -143,8 +141,7 @@ private:
BOOL mAppHasFocus;
- typedef std::map<LLHandle<LLView>, LLHandle<LLView> > focus_history_map_t;
- focus_history_map_t mFocusHistory;
+ Impl * mImpl;
};
extern LLFocusMgr gFocusMgr;
diff --git a/indra/llui/llfunctorregistry.h b/indra/llui/llfunctorregistry.h
index 752c7df7ee..899cc3a326 100644
--- a/indra/llui/llfunctorregistry.h
+++ b/indra/llui/llfunctorregistry.h
@@ -103,7 +103,7 @@ public:
}
else
{
- llwarns << "tried to find '" << name << "' in LLFunctorRegistry, but it wasn't there." << llendl;
+ lldebugs << "tried to find '" << name << "' in LLFunctorRegistry, but it wasn't there." << llendl;
return mMap[LOGFUNCTOR];
}
}
@@ -115,7 +115,7 @@ private:
static void log_functor(const LLSD& notification, const LLSD& payload)
{
- llwarns << "log_functor called with payload: " << payload << llendl;
+ lldebugs << "log_functor called with payload: " << payload << llendl;
}
static void do_nothing(const LLSD& notification, const LLSD& payload)
diff --git a/indra/llui/llhandle.h b/indra/llui/llhandle.h
index a43f095d67..37c657dd92 100644
--- a/indra/llui/llhandle.h
+++ b/indra/llui/llhandle.h
@@ -28,17 +28,18 @@
#define LLHANDLE_H
#include "llpointer.h"
+#include <boost/type_traits/is_convertible.hpp>
+#include <boost/utility/enable_if.hpp>
-template <typename T>
class LLTombStone : public LLRefCount
{
public:
- LLTombStone(T* target = NULL) : mTarget(target) {}
+ LLTombStone(void* target = NULL) : mTarget(target) {}
- void setTarget(T* target) { mTarget = target; }
- T* getTarget() const { return mTarget; }
+ void setTarget(void* target) { mTarget = target; }
+ void* getTarget() const { return mTarget; }
private:
- T* mTarget;
+ mutable void* mTarget;
};
// LLHandles are used to refer to objects whose lifetime you do not control or influence.
@@ -53,20 +54,15 @@ private:
template <typename T>
class LLHandle
{
+ template <typename U> friend class LLHandle;
+ template <typename U> friend class LLHandleProvider;
public:
LLHandle() : mTombStone(getDefaultTombStone()) {}
- const LLHandle<T>& operator =(const LLHandle<T>& other)
- {
- mTombStone = other.mTombStone;
- return *this;
- }
- template<typename Subclass>
- LLHandle<T>& operator =(const LLHandle<Subclass>& other)
- {
- mTombStone = other.mTombStone;
- return *this;
- }
+ template<typename U>
+ LLHandle(const LLHandle<U>& other, typename boost::enable_if< typename boost::is_convertible<U*, T*> >::type* dummy = 0)
+ : mTombStone(other.mTombStone)
+ {}
bool isDead() const
{
@@ -80,7 +76,7 @@ public:
T* get() const
{
- return mTombStone->getTarget();
+ return reinterpret_cast<T*>(mTombStone->getTarget());
}
friend bool operator== (const LLHandle<T>& lhs, const LLHandle<T>& rhs)
@@ -99,15 +95,15 @@ public:
{
return lhs.mTombStone > rhs.mTombStone;
}
-protected:
protected:
- LLPointer<LLTombStone<T> > mTombStone;
+ LLPointer<LLTombStone> mTombStone;
private:
- static LLPointer<LLTombStone<T> >& getDefaultTombStone()
+ typedef T* pointer_t;
+ static LLPointer<LLTombStone>& getDefaultTombStone()
{
- static LLPointer<LLTombStone<T> > sDefaultTombStone = new LLTombStone<T>;
+ static LLPointer<LLTombStone> sDefaultTombStone = new LLTombStone;
return sDefaultTombStone;
}
};
@@ -116,23 +112,26 @@ template <typename T>
class LLRootHandle : public LLHandle<T>
{
public:
+ typedef LLRootHandle<T> self_t;
+ typedef LLHandle<T> base_t;
+
LLRootHandle(T* object) { bind(object); }
LLRootHandle() {};
~LLRootHandle() { unbind(); }
- // this is redundant, since a LLRootHandle *is* an LLHandle
- LLHandle<T> getHandle() { return LLHandle<T>(*this); }
+ // this is redundant, since an LLRootHandle *is* an LLHandle
+ //LLHandle<T> getHandle() { return LLHandle<T>(*this); }
void bind(T* object)
{
// unbind existing tombstone
if (LLHandle<T>::mTombStone.notNull())
{
- if (LLHandle<T>::mTombStone->getTarget() == object) return;
+ if (LLHandle<T>::mTombStone->getTarget() == (void*)object) return;
LLHandle<T>::mTombStone->setTarget(NULL);
}
// tombstone reference counted, so no paired delete
- LLHandle<T>::mTombStone = new LLTombStone<T>(object);
+ LLHandle<T>::mTombStone = new LLTombStone((void*)object);
}
void unbind()
@@ -150,6 +149,15 @@ private:
template <typename T>
class LLHandleProvider
{
+public:
+ LLHandle<T> getHandle() const
+ {
+ // perform lazy binding to avoid small tombstone allocations for handle
+ // providers whose handles are never referenced
+ mHandle.bind(static_cast<T*>(const_cast<LLHandleProvider<T>* >(this)));
+ return mHandle;
+ }
+
protected:
typedef LLHandle<T> handle_type_t;
LLHandleProvider()
@@ -157,16 +165,17 @@ protected:
// provided here to enforce T deriving from LLHandleProvider<T>
}
- LLHandle<T> getHandle()
- {
- // perform lazy binding to avoid small tombstone allocations for handle
- // providers whose handles are never referenced
- mHandle.bind(static_cast<T*>(this));
- return mHandle;
+ template <typename U>
+ LLHandle<U> getDerivedHandle(typename boost::enable_if< typename boost::is_convertible<U*, T*> >::type* dummy = 0) const
+ {
+ LLHandle<U> downcast_handle;
+ downcast_handle.mTombStone = getHandle().mTombStone;
+ return downcast_handle;
}
+
private:
- LLRootHandle<T> mHandle;
+ mutable LLRootHandle<T> mHandle;
};
#endif
diff --git a/indra/llui/llhelp.h b/indra/llui/llhelp.h
index 83317bd03c..1726347a78 100644
--- a/indra/llui/llhelp.h
+++ b/indra/llui/llhelp.h
@@ -32,6 +32,7 @@ class LLHelp
{
public:
virtual void showTopic(const std::string &topic) = 0;
+ virtual std::string getURL(const std::string &topic) = 0;
// return default (fallback) topic name suitable for showTopic()
virtual std::string defaultTopic() = 0;
// return topic to use before the user logs in
diff --git a/indra/llui/lliconctrl.cpp b/indra/llui/lliconctrl.cpp
index 627957061d..30b79b4d20 100644
--- a/indra/llui/lliconctrl.cpp
+++ b/indra/llui/lliconctrl.cpp
@@ -41,16 +41,15 @@ static LLDefaultChildRegistry::Register<LLIconCtrl> r("icon");
LLIconCtrl::Params::Params()
: image("image_name"),
color("color"),
+ use_draw_context_alpha("use_draw_context_alpha", true),
scale_image("scale_image")
-{
- tab_stop = false;
- mouse_opaque = false;
-}
+{}
LLIconCtrl::LLIconCtrl(const LLIconCtrl::Params& p)
: LLUICtrl(p),
mColor(p.color()),
mImagep(p.image),
+ mUseDrawContextAlpha(p.use_draw_context_alpha),
mPriority(0),
mDrawWidth(0),
mDrawHeight(0)
@@ -71,7 +70,8 @@ void LLIconCtrl::draw()
{
if( mImagep.notNull() )
{
- mImagep->draw(getLocalRect(), mColor.get() % getDrawContext().mAlpha );
+ const F32 alpha = mUseDrawContextAlpha ? getDrawContext().mAlpha : getCurrentTransparency();
+ mImagep->draw(getLocalRect(), mColor.get() % alpha );
}
LLUICtrl::draw();
diff --git a/indra/llui/lliconctrl.h b/indra/llui/lliconctrl.h
index 79a8b0fb28..efa0925a4a 100644
--- a/indra/llui/lliconctrl.h
+++ b/indra/llui/lliconctrl.h
@@ -30,6 +30,7 @@
#include "lluuid.h"
#include "v4color.h"
#include "lluictrl.h"
+#include "lluiimage.h"
#include "stdenums.h"
class LLTextBox;
@@ -48,6 +49,7 @@ public:
{
Optional<LLUIImage*> image;
Optional<LLUIColor> color;
+ Optional<bool> use_draw_context_alpha;
Ignored scale_image;
Params();
};
@@ -68,6 +70,7 @@ public:
void setColor(const LLColor4& color) { mColor = color; }
void setImage(LLPointer<LLUIImage> image) { mImagep = image; }
+ const LLPointer<LLUIImage> getImage() { return mImagep; }
private:
void setIconImageDrawSize() ;
@@ -79,6 +82,10 @@ protected:
S32 mDrawWidth ;
S32 mDrawHeight ;
+ // If set to true (default), use the draw context transparency.
+ // If false, will use transparency returned by getCurrentTransparency(). See STORM-698.
+ bool mUseDrawContextAlpha;
+
private:
LLUIColor mColor;
LLPointer<LLUIImage> mImagep;
diff --git a/indra/llui/llkeywords.cpp b/indra/llui/llkeywords.cpp
index ceec9c7eb1..c1cd04186b 100644
--- a/indra/llui/llkeywords.cpp
+++ b/indra/llui/llkeywords.cpp
@@ -57,6 +57,22 @@ LLKeywords::LLKeywords() : mLoaded(FALSE)
{
}
+inline BOOL LLKeywordToken::isTail(const llwchar* s) const
+{
+ BOOL res = TRUE;
+ const llwchar* t = mDelimiter.c_str();
+ S32 len = mDelimiter.size();
+ for (S32 i=0; i<len; i++)
+ {
+ if (s[i] != t[i])
+ {
+ res = FALSE;
+ break;
+ }
+ }
+ return res;
+}
+
LLKeywords::~LLKeywords()
{
std::for_each(mWordTokenMap.begin(), mWordTokenMap.end(), DeletePairedPointer());
@@ -106,6 +122,7 @@ BOOL LLKeywords::loadFromFile( const std::string& filename )
std::string SOL_LINE("[line ");
std::string SOL_ONE_SIDED_DELIMITER("[one_sided_delimiter ");
std::string SOL_TWO_SIDED_DELIMITER("[two_sided_delimiter ");
+ std::string SOL_DOUBLE_QUOTATION_MARKS("[double_quotation_marks ");
LLColor3 cur_color( 1, 0, 0 );
LLKeywordToken::TOKEN_TYPE cur_type = LLKeywordToken::WORD;
@@ -137,6 +154,12 @@ BOOL LLKeywords::loadFromFile( const std::string& filename )
cur_type = LLKeywordToken::TWO_SIDED_DELIMITER;
continue;
}
+ else if( line.find(SOL_DOUBLE_QUOTATION_MARKS) == 0 )
+ {
+ cur_color = readColor( line.substr(SOL_DOUBLE_QUOTATION_MARKS.size()) );
+ cur_type = LLKeywordToken::DOUBLE_QUOTATION_MARKS;
+ continue;
+ }
else if( line.find(SOL_ONE_SIDED_DELIMITER) == 0 )
{
cur_color = readColor( line.substr(SOL_ONE_SIDED_DELIMITER.size()) );
@@ -154,10 +177,26 @@ BOOL LLKeywords::loadFromFile( const std::string& filename )
if( !token_buffer.empty() && token_word_iter != word_tokens.end() )
{
- // first word is keyword
+ // first word is the keyword or a left delimiter
std::string keyword = (*token_word_iter);
LLStringUtil::trim(keyword);
+ // second word may be a right delimiter
+ std::string delimiter;
+ if (cur_type == LLKeywordToken::TWO_SIDED_DELIMITER)
+ {
+ while (delimiter.length() == 0 && ++token_word_iter != word_tokens.end())
+ {
+ delimiter = *token_word_iter;
+ LLStringUtil::trim(delimiter);
+ }
+ }
+ else if (cur_type == LLKeywordToken::DOUBLE_QUOTATION_MARKS)
+ {
+ // Closing delimiter is identical to the opening one.
+ delimiter = keyword;
+ }
+
// following words are tooltip
std::string tool_tip;
while (++token_word_iter != word_tokens.end())
@@ -170,11 +209,11 @@ BOOL LLKeywords::loadFromFile( const std::string& filename )
{
// Replace : with \n for multi-line tool tips.
LLStringUtil::replaceChar( tool_tip, ':', '\n' );
- addToken(cur_type, keyword, cur_color, tool_tip );
+ addToken(cur_type, keyword, cur_color, tool_tip, delimiter );
}
else
{
- addToken(cur_type, keyword, cur_color, LLStringUtil::null );
+ addToken(cur_type, keyword, cur_color, LLStringUtil::null, delimiter );
}
}
}
@@ -189,23 +228,26 @@ BOOL LLKeywords::loadFromFile( const std::string& filename )
void LLKeywords::addToken(LLKeywordToken::TOKEN_TYPE type,
const std::string& key_in,
const LLColor3& color,
- const std::string& tool_tip_in )
+ const std::string& tool_tip_in,
+ const std::string& delimiter_in)
{
LLWString key = utf8str_to_wstring(key_in);
LLWString tool_tip = utf8str_to_wstring(tool_tip_in);
+ LLWString delimiter = utf8str_to_wstring(delimiter_in);
switch(type)
{
case LLKeywordToken::WORD:
- mWordTokenMap[key] = new LLKeywordToken(type, color, key, tool_tip);
+ mWordTokenMap[key] = new LLKeywordToken(type, color, key, tool_tip, LLWStringUtil::null);
break;
case LLKeywordToken::LINE:
- mLineTokenList.push_front(new LLKeywordToken(type, color, key, tool_tip));
+ mLineTokenList.push_front(new LLKeywordToken(type, color, key, tool_tip, LLWStringUtil::null));
break;
case LLKeywordToken::TWO_SIDED_DELIMITER:
+ case LLKeywordToken::DOUBLE_QUOTATION_MARKS:
case LLKeywordToken::ONE_SIDED_DELIMITER:
- mDelimiterTokenList.push_front(new LLKeywordToken(type, color, key, tool_tip));
+ mDelimiterTokenList.push_front(new LLKeywordToken(type, color, key, tool_tip, delimiter));
break;
default:
@@ -357,7 +399,7 @@ void LLKeywords::findSegments(std::vector<LLTextSegmentPtr>* seg_list, const LLW
}
// cur is now at the first non-whitespace character of a new line
-
+
// Line start tokens
{
BOOL line_done = FALSE;
@@ -418,14 +460,15 @@ void LLKeywords::findSegments(std::vector<LLTextSegmentPtr>* seg_list, const LLW
S32 seg_end = 0;
seg_start = cur - base;
- cur += cur_delimiter->getLength();
+ cur += cur_delimiter->getLengthHead();
- if( cur_delimiter->getType() == LLKeywordToken::TWO_SIDED_DELIMITER )
+ LLKeywordToken::TOKEN_TYPE type = cur_delimiter->getType();
+ if( type == LLKeywordToken::TWO_SIDED_DELIMITER || type == LLKeywordToken::DOUBLE_QUOTATION_MARKS )
{
- while( *cur && !cur_delimiter->isHead(cur))
+ while( *cur && !cur_delimiter->isTail(cur))
{
// Check for an escape sequence.
- if (*cur == '\\')
+ if (type == LLKeywordToken::DOUBLE_QUOTATION_MARKS && *cur == '\\')
{
// Count the number of backslashes.
S32 num_backslashes = 0;
@@ -435,10 +478,10 @@ void LLKeywords::findSegments(std::vector<LLTextSegmentPtr>* seg_list, const LLW
between_delimiters++;
cur++;
}
- // Is the next character the end delimiter?
- if (cur_delimiter->isHead(cur))
+ // If the next character is the end delimiter?
+ if (cur_delimiter->isTail(cur))
{
- // Is there was an odd number of backslashes, then this delimiter
+ // If there was an odd number of backslashes, then this delimiter
// does not end the sequence.
if (num_backslashes % 2 == 1)
{
@@ -461,13 +504,13 @@ void LLKeywords::findSegments(std::vector<LLTextSegmentPtr>* seg_list, const LLW
if( *cur )
{
- cur += cur_delimiter->getLength();
- seg_end = seg_start + between_delimiters + 2 * cur_delimiter->getLength();
+ cur += cur_delimiter->getLengthHead();
+ seg_end = seg_start + between_delimiters + cur_delimiter->getLengthHead() + cur_delimiter->getLengthTail();
}
else
{
// eof
- seg_end = seg_start + between_delimiters + cur_delimiter->getLength();
+ seg_end = seg_start + between_delimiters + cur_delimiter->getLengthHead();
}
}
else
@@ -479,7 +522,7 @@ void LLKeywords::findSegments(std::vector<LLTextSegmentPtr>* seg_list, const LLW
between_delimiters++;
cur++;
}
- seg_end = seg_start + between_delimiters + cur_delimiter->getLength();
+ seg_end = seg_start + between_delimiters + cur_delimiter->getLengthHead();
}
insertSegments(wtext, *seg_list,cur_delimiter, text_len, seg_start, seg_end, defaultColor, editor);
diff --git a/indra/llui/llkeywords.h b/indra/llui/llkeywords.h
index f6d75b7e75..ac34015393 100644
--- a/indra/llui/llkeywords.h
+++ b/indra/llui/llkeywords.h
@@ -41,23 +41,44 @@ typedef LLPointer<LLTextSegment> LLTextSegmentPtr;
class LLKeywordToken
{
public:
- enum TOKEN_TYPE { WORD, LINE, TWO_SIDED_DELIMITER, ONE_SIDED_DELIMITER };
+ /**
+ * @brief Types of tokens/delimters being parsed.
+ *
+ * @desc Tokens/delimiters that need to be identified/highlighted. All are terminated if an EOF is encountered.
+ * - WORD are keywords in the normal sense, i.e. constants, events, etc.
+ * - LINE are for entire lines (currently only flow control labels use this).
+ * - ONE_SIDED_DELIMITER are for open-ended delimiters which are terminated by EOL.
+ * - TWO_SIDED_DELIMITER are for delimiters that end with a different delimiter than they open with.
+ * - DOUBLE_QUOTATION_MARKS are for delimiting areas using the same delimiter to open and close.
+ */
+ enum TOKEN_TYPE
+ {
+ WORD,
+ LINE,
+ TWO_SIDED_DELIMITER,
+ ONE_SIDED_DELIMITER,
+ DOUBLE_QUOTATION_MARKS
+ };
- LLKeywordToken( TOKEN_TYPE type, const LLColor3& color, const LLWString& token, const LLWString& tool_tip )
+ LLKeywordToken( TOKEN_TYPE type, const LLColor3& color, const LLWString& token, const LLWString& tool_tip, const LLWString& delimiter )
:
mType( type ),
mToken( token ),
mColor( color ),
- mToolTip( tool_tip )
+ mToolTip( tool_tip ),
+ mDelimiter( delimiter ) // right delimiter
{
}
- S32 getLength() const { return mToken.size(); }
+ S32 getLengthHead() const { return mToken.size(); }
+ S32 getLengthTail() const { return mDelimiter.size(); }
BOOL isHead(const llwchar* s) const;
+ BOOL isTail(const llwchar* s) const;
const LLWString& getToken() const { return mToken; }
const LLColor3& getColor() const { return mColor; }
TOKEN_TYPE getType() const { return mType; }
const LLWString& getToolTip() const { return mToolTip; }
+ const LLWString& getDelimiter() const { return mDelimiter; }
#ifdef _DEBUG
void dump();
@@ -68,6 +89,7 @@ private:
LLWString mToken;
LLColor3 mColor;
LLWString mToolTip;
+ LLWString mDelimiter;
};
class LLKeywords
@@ -85,7 +107,8 @@ public:
void addToken(LLKeywordToken::TOKEN_TYPE type,
const std::string& key,
const LLColor3& color,
- const std::string& tool_tip = LLStringUtil::null);
+ const std::string& tool_tip = LLStringUtil::null,
+ const std::string& delimiter = LLStringUtil::null);
// This class is here as a performance optimization.
// The word token map used to be defined as std::map<LLWString, LLKeywordToken*>.
diff --git a/indra/llui/lllayoutstack.cpp b/indra/llui/lllayoutstack.cpp
index 940c7e7e18..4c730286da 100644
--- a/indra/llui/lllayoutstack.cpp
+++ b/indra/llui/lllayoutstack.cpp
@@ -34,60 +34,175 @@
#include "llpanel.h"
#include "llresizebar.h"
#include "llcriticaldamp.h"
+#include "boost/foreach.hpp"
+
+static const F32 MIN_FRACTIONAL_SIZE = 0.0f;
+static const F32 MAX_FRACTIONAL_SIZE = 1.f;
static LLDefaultChildRegistry::Register<LLLayoutStack> register_layout_stack("layout_stack");
static LLLayoutStack::LayoutStackRegistry::Register<LLLayoutPanel> register_layout_panel("layout_panel");
+void LLLayoutStack::OrientationNames::declareValues()
+{
+ declare("horizontal", HORIZONTAL);
+ declare("vertical", VERTICAL);
+}
+
//
// LLLayoutPanel
//
+LLLayoutPanel::Params::Params()
+: expanded_min_dim("expanded_min_dim", 0),
+ min_dim("min_dim", -1),
+ user_resize("user_resize", false),
+ auto_resize("auto_resize", true)
+{
+ addSynonym(min_dim, "min_width");
+ addSynonym(min_dim, "min_height");
+}
+
LLLayoutPanel::LLLayoutPanel(const Params& p)
: LLPanel(p),
+ mExpandedMinDim(p.expanded_min_dim.isProvided() ? p.expanded_min_dim : p.min_dim),
mMinDim(p.min_dim),
- mMaxDim(p.max_dim),
mAutoResize(p.auto_resize),
mUserResize(p.user_resize),
- mCollapsed(FALSE),
- mCollapseAmt(0.f),
- mVisibleAmt(1.f), // default to fully visible
- mResizeBar(NULL)
- {
+ mCollapsed(FALSE),
+ mCollapseAmt(0.f),
+ mVisibleAmt(1.f), // default to fully visible
+ mResizeBar(NULL),
+ mFractionalSize(MIN_FRACTIONAL_SIZE),
+ mTargetDim(0),
+ mIgnoreReshape(false),
+ mOrientation(LLLayoutStack::HORIZONTAL)
+{
// panels initialized as hidden should not start out partially visible
if (!getVisible())
- {
+ {
mVisibleAmt = 0.f;
- }
- }
+ }
+}
void LLLayoutPanel::initFromParams(const Params& p)
- {
+{
LLPanel::initFromParams(p);
setFollowsNone();
- }
+}
LLLayoutPanel::~LLLayoutPanel()
+{
+ // probably not necessary, but...
+ delete mResizeBar;
+ mResizeBar = NULL;
+}
+
+F32 LLLayoutPanel::getAutoResizeFactor() const
+{
+ return mVisibleAmt * (1.f - mCollapseAmt);
+}
+
+F32 LLLayoutPanel::getVisibleAmount() const
+{
+ return mVisibleAmt;
+}
+
+S32 LLLayoutPanel::getLayoutDim() const
+{
+ return llround((F32)((mOrientation == LLLayoutStack::HORIZONTAL)
+ ? getRect().getWidth()
+ : getRect().getHeight()));
+}
+
+S32 LLLayoutPanel::getTargetDim() const
+{
+ return mTargetDim;
+}
+
+void LLLayoutPanel::setTargetDim(S32 value)
+{
+ LLRect new_rect(getRect());
+ if (mOrientation == LLLayoutStack::HORIZONTAL)
{
- // probably not necessary, but...
- delete mResizeBar;
- mResizeBar = NULL;
+ new_rect.mRight = new_rect.mLeft + value;
}
-
-F32 LLLayoutPanel::getCollapseFactor(LLLayoutStack::ELayoutOrientation orientation)
+ else
{
- if (orientation == LLLayoutStack::HORIZONTAL)
+ new_rect.mTop = new_rect.mBottom + value;
+ }
+ setShape(new_rect, true);
+}
+
+S32 LLLayoutPanel::getVisibleDim() const
+{
+ F32 min_dim = getRelevantMinDim();
+ return llround(mVisibleAmt
+ * (min_dim
+ + (((F32)mTargetDim - min_dim) * (1.f - mCollapseAmt))));
+}
+
+void LLLayoutPanel::setOrientation( LLLayoutStack::ELayoutOrientation orientation )
+{
+ mOrientation = orientation;
+ S32 layout_dim = llround((F32)((mOrientation == LLLayoutStack::HORIZONTAL)
+ ? getRect().getWidth()
+ : getRect().getHeight()));
+
+ if (mAutoResize == FALSE
+ && mUserResize == TRUE
+ && mMinDim == -1 )
+ {
+ setMinDim(layout_dim);
+ }
+ mTargetDim = llmax(layout_dim, getMinDim());
+}
+
+void LLLayoutPanel::setVisible( BOOL visible )
+{
+ if (visible != getVisible())
+ {
+ LLLayoutStack* stackp = dynamic_cast<LLLayoutStack*>(getParent());
+ if (stackp)
{
- F32 collapse_amt =
- clamp_rescale(mCollapseAmt, 0.f, 1.f, 1.f, (F32)mMinDim / (F32)llmax(1, getRect().getWidth()));
- return mVisibleAmt * collapse_amt;
+ stackp->mNeedsLayout = true;
}
- else
+ }
+ LLPanel::setVisible(visible);
+}
+
+void LLLayoutPanel::reshape( S32 width, S32 height, BOOL called_from_parent /*= TRUE*/ )
+{
+ if (width == getRect().getWidth() && height == getRect().getHeight()) return;
+
+ if (!mIgnoreReshape && mAutoResize == false)
{
- F32 collapse_amt =
- clamp_rescale(mCollapseAmt, 0.f, 1.f, 1.f, llmin(1.f, (F32)mMinDim / (F32)llmax(1, getRect().getHeight())));
- return mVisibleAmt * collapse_amt;
+ mTargetDim = (mOrientation == LLLayoutStack::HORIZONTAL) ? width : height;
+ LLLayoutStack* stackp = dynamic_cast<LLLayoutStack*>(getParent());
+ if (stackp)
+ {
+ stackp->mNeedsLayout = true;
}
}
+ LLPanel::reshape(width, height, called_from_parent);
+}
+
+void LLLayoutPanel::handleReshape(const LLRect& new_rect, bool by_user)
+{
+ LLLayoutStack* stackp = dynamic_cast<LLLayoutStack*>(getParent());
+ if (stackp)
+ {
+ if (by_user)
+ { // tell layout stack to account for new shape
+
+ // make sure that panels have already been auto resized
+ stackp->updateLayout();
+ // now apply requested size to panel
+ stackp->updatePanelRect(this, new_rect);
+ }
+ stackp->mNeedsLayout = true;
+ }
+ LLPanel::handleReshape(new_rect, by_user);
+}
//
// LLLayoutStack
@@ -97,20 +212,23 @@ LLLayoutStack::Params::Params()
: orientation("orientation"),
animate("animate", true),
clip("clip", true),
+ open_time_constant("open_time_constant", 0.02f),
+ close_time_constant("close_time_constant", 0.03f),
+ resize_bar_overlap("resize_bar_overlap", 1),
border_size("border_size", LLCachedControl<S32>(*LLUI::sSettingGroups["config"], "UIResizeBarHeight", 0))
-{
- name="stack";
-}
+{}
LLLayoutStack::LLLayoutStack(const LLLayoutStack::Params& p)
: LLView(p),
- mMinWidth(0),
- mMinHeight(0),
mPanelSpacing(p.border_size),
- mOrientation((p.orientation() == "vertical") ? VERTICAL : HORIZONTAL),
+ mOrientation(p.orientation),
mAnimate(p.animate),
mAnimatedThisFrame(false),
- mClip(p.clip)
+ mNeedsLayout(true),
+ mClip(p.clip),
+ mOpenTimeConstant(p.open_time_constant),
+ mCloseTimeConstant(p.close_time_constant),
+ mResizeBarOverlap(p.resize_bar_overlap)
{}
LLLayoutStack::~LLLayoutStack()
@@ -124,28 +242,27 @@ void LLLayoutStack::draw()
{
updateLayout();
- e_panel_list_t::iterator panel_it;
- for (panel_it = mPanels.begin(); panel_it != mPanels.end(); ++panel_it)
+ // always clip to stack itself
+ LLLocalClipRect clip(getLocalRect());
+ BOOST_FOREACH(LLLayoutPanel* panelp, mPanels)
{
// clip to layout rectangle, not bounding rectangle
- LLRect clip_rect = (*panel_it)->getRect();
+ LLRect clip_rect = panelp->getRect();
// scale clipping rectangle by visible amount
if (mOrientation == HORIZONTAL)
{
- clip_rect.mRight = clip_rect.mLeft + llround((F32)clip_rect.getWidth() * (*panel_it)->getCollapseFactor(mOrientation));
+ clip_rect.mRight = clip_rect.mLeft + panelp->getVisibleDim();
}
else
{
- clip_rect.mBottom = clip_rect.mTop - llround((F32)clip_rect.getHeight() * (*panel_it)->getCollapseFactor(mOrientation));
+ clip_rect.mBottom = clip_rect.mTop - panelp->getVisibleDim();
}
- LLPanel* panelp = (*panel_it);
-
- LLLocalClipRect clip(clip_rect, mClip);
- // only force drawing invisible children if visible amount is non-zero
- drawChild(panelp, 0, 0, !clip_rect.isEmpty());
+ {LLLocalClipRect clip(clip_rect, mClip);
+ // only force drawing invisible children if visible amount is non-zero
+ drawChild(panelp, 0, 0, !clip_rect.isEmpty());
+ }
}
- mAnimatedThisFrame = false;
}
void LLLayoutStack::removeChild(LLView* view)
@@ -156,12 +273,10 @@ void LLLayoutStack::removeChild(LLView* view)
{
mPanels.erase(std::find(mPanels.begin(), mPanels.end(), embedded_panelp));
delete embedded_panelp;
+ updateFractionalSizes();
+ mNeedsLayout = true;
}
- // need to update resizebars
-
- calcMinExtents();
-
LLView::removeChild(view);
}
@@ -172,54 +287,19 @@ BOOL LLLayoutStack::postBuild()
}
bool LLLayoutStack::addChild(LLView* child, S32 tab_group)
- {
- LLLayoutPanel* panelp = dynamic_cast<LLLayoutPanel*>(child);
- if (panelp)
- {
- mPanels.push_back(panelp);
- }
- return LLView::addChild(child, tab_group);
- }
-
-
-S32 LLLayoutStack::getDefaultHeight(S32 cur_height)
-{
- // if we are spanning our children (crude upward propagation of size)
- // then don't enforce our size on our children
- if (mOrientation == HORIZONTAL)
- {
- cur_height = llmax(mMinHeight, getRect().getHeight());
- }
-
- return cur_height;
-}
-
-S32 LLLayoutStack::getDefaultWidth(S32 cur_width)
{
- // if we are spanning our children (crude upward propagation of size)
- // then don't enforce our size on our children
- if (mOrientation == VERTICAL)
+ LLLayoutPanel* panelp = dynamic_cast<LLLayoutPanel*>(child);
+ if (panelp)
{
- cur_width = llmax(mMinWidth, getRect().getWidth());
+ panelp->setOrientation(mOrientation);
+ mPanels.push_back(panelp);
+ createResizeBar(panelp);
+ mNeedsLayout = true;
}
+ BOOL result = LLView::addChild(child, tab_group);
- return cur_width;
-}
-
-void LLLayoutStack::movePanel(LLPanel* panel_to_move, LLPanel* target_panel, bool move_to_front)
-{
- LLLayoutPanel* embedded_panel_to_move = findEmbeddedPanel(panel_to_move);
- LLLayoutPanel* embedded_target_panel = move_to_front ? *mPanels.begin() : findEmbeddedPanel(target_panel);
-
- if (!embedded_panel_to_move || !embedded_target_panel || embedded_panel_to_move == embedded_target_panel)
- {
- llwarns << "One of the panels was not found in stack or NULL was passed instead of valid panel" << llendl;
- return;
- }
- e_panel_list_t::iterator it = std::find(mPanels.begin(), mPanels.end(), embedded_panel_to_move);
- mPanels.erase(it);
- it = move_to_front ? mPanels.begin() : std::find(mPanels.begin(), mPanels.end(), embedded_target_panel);
- mPanels.insert(it, embedded_panel_to_move);
+ updateFractionalSizes();
+ return result;
}
void LLLayoutStack::addPanel(LLLayoutPanel* panel, EAnimate animate)
@@ -234,483 +314,544 @@ void LLLayoutStack::addPanel(LLLayoutPanel* panel, EAnimate animate)
}
}
-void LLLayoutStack::removePanel(LLPanel* panel)
-{
- removeChild(panel);
-}
-
void LLLayoutStack::collapsePanel(LLPanel* panel, BOOL collapsed)
{
LLLayoutPanel* panel_container = findEmbeddedPanel(panel);
if (!panel_container) return;
panel_container->mCollapsed = collapsed;
+ mNeedsLayout = true;
}
-void LLLayoutStack::updatePanelAutoResize(const std::string& panel_name, BOOL auto_resize)
-{
- LLLayoutPanel* panel = findEmbeddedPanelByName(panel_name);
-
- if (panel)
- {
- panel->mAutoResize = auto_resize;
- }
-}
-
-void LLLayoutStack::setPanelUserResize(const std::string& panel_name, BOOL user_resize)
-{
- LLLayoutPanel* panel = findEmbeddedPanelByName(panel_name);
-
- if (panel)
- {
- panel->mUserResize = user_resize;
- }
-}
-
-bool LLLayoutStack::getPanelMinSize(const std::string& panel_name, S32* min_dimp)
-{
- LLLayoutPanel* panel = findEmbeddedPanelByName(panel_name);
+static LLFastTimer::DeclareTimer FTM_UPDATE_LAYOUT("Update LayoutStacks");
- if (panel)
- {
- if (min_dimp) *min_dimp = panel->mMinDim;
- }
+void LLLayoutStack::updateLayout()
+{
+ LLFastTimer ft(FTM_UPDATE_LAYOUT);
- return NULL != panel;
-}
+ if (!mNeedsLayout) return;
-bool LLLayoutStack::getPanelMaxSize(const std::string& panel_name, S32* max_dimp)
-{
- LLLayoutPanel* panel = findEmbeddedPanelByName(panel_name);
+ bool continue_animating = animatePanels();
+ F32 total_visible_fraction = 0.f;
+ S32 space_to_distribute = (mOrientation == HORIZONTAL)
+ ? getRect().getWidth()
+ : getRect().getHeight();
- if (panel)
+ // first, assign minimum dimensions
+ LLLayoutPanel* panelp = NULL;
+ BOOST_FOREACH(panelp, mPanels)
{
- if (max_dimp) *max_dimp = panel->mMaxDim;
+ if (panelp->mAutoResize)
+ {
+ panelp->mTargetDim = panelp->getRelevantMinDim();
+ }
+ space_to_distribute -= panelp->getVisibleDim() + llround((F32)mPanelSpacing * panelp->getVisibleAmount());
+ total_visible_fraction += panelp->mFractionalSize * panelp->getAutoResizeFactor();
}
- return NULL != panel;
-}
+ llassert(total_visible_fraction < 1.05f);
-static LLFastTimer::DeclareTimer FTM_UPDATE_LAYOUT("Update LayoutStacks");
-void LLLayoutStack::updateLayout(BOOL force_resize)
-{
- LLFastTimer ft(FTM_UPDATE_LAYOUT);
- static LLUICachedControl<S32> resize_bar_overlap ("UIResizeBarOverlap", 0);
- calcMinExtents();
- createResizeBars();
+ // don't need spacing after last panel
+ space_to_distribute += panelp ? llround((F32)mPanelSpacing * panelp->getVisibleAmount()) : 0;
- // calculate current extents
- S32 total_width = 0;
- S32 total_height = 0;
-
- const F32 ANIM_OPEN_TIME = 0.02f;
- const F32 ANIM_CLOSE_TIME = 0.03f;
-
- e_panel_list_t::iterator panel_it;
- for (panel_it = mPanels.begin(); panel_it != mPanels.end(); ++panel_it)
- {
- LLPanel* panelp = (*panel_it);
- if (panelp->getVisible())
+ S32 remaining_space = space_to_distribute;
+ F32 fraction_distributed = 0.f;
+ if (space_to_distribute > 0 && total_visible_fraction > 0.f)
+ { // give space proportionally to visible auto resize panels
+ BOOST_FOREACH(LLLayoutPanel* panelp, mPanels)
{
- if (mAnimate)
- {
- if (!mAnimatedThisFrame)
- {
- (*panel_it)->mVisibleAmt = lerp((*panel_it)->mVisibleAmt, 1.f, LLCriticalDamp::getInterpolant(ANIM_OPEN_TIME));
- if ((*panel_it)->mVisibleAmt > 0.99f)
- {
- (*panel_it)->mVisibleAmt = 1.f;
- }
- }
- }
- else
+ if (panelp->mAutoResize)
{
- (*panel_it)->mVisibleAmt = 1.f;
+ F32 fraction_to_distribute = (panelp->mFractionalSize * panelp->getAutoResizeFactor()) / (total_visible_fraction);
+ S32 delta = llround((F32)space_to_distribute * fraction_to_distribute);
+ fraction_distributed += fraction_to_distribute;
+ panelp->mTargetDim += delta;
+ remaining_space -= delta;
}
}
- else // not visible
+ }
+
+ // distribute any left over pixels to non-collapsed, visible panels
+ BOOST_FOREACH(LLLayoutPanel* panelp, mPanels)
+ {
+ if (remaining_space == 0) break;
+
+ if (panelp->mAutoResize
+ && !panelp->mCollapsed
+ && panelp->getVisible())
{
- if (mAnimate)
- {
- if (!mAnimatedThisFrame)
- {
- (*panel_it)->mVisibleAmt = lerp((*panel_it)->mVisibleAmt, 0.f, LLCriticalDamp::getInterpolant(ANIM_CLOSE_TIME));
- if ((*panel_it)->mVisibleAmt < 0.001f)
- {
- (*panel_it)->mVisibleAmt = 0.f;
- }
- }
- }
- else
- {
- (*panel_it)->mVisibleAmt = 0.f;
- }
+ S32 space_for_panel = remaining_space > 0 ? 1 : -1;
+ panelp->mTargetDim += space_for_panel;
+ remaining_space -= space_for_panel;
}
+ }
+
+ F32 cur_pos = (mOrientation == HORIZONTAL) ? 0.f : (F32)getRect().getHeight();
+
+ BOOST_FOREACH(LLLayoutPanel* panelp, mPanels)
+ {
+ F32 panel_dim = llmax(panelp->getExpandedMinDim(), panelp->mTargetDim);
+ F32 panel_visible_dim = panelp->getVisibleDim();
- if ((*panel_it)->mCollapsed)
+ LLRect panel_rect;
+ if (mOrientation == HORIZONTAL)
{
- (*panel_it)->mCollapseAmt = lerp((*panel_it)->mCollapseAmt, 1.f, LLCriticalDamp::getInterpolant(ANIM_CLOSE_TIME));
+ panel_rect.setLeftTopAndSize(llround(cur_pos),
+ getRect().getHeight(),
+ llround(panel_dim),
+ getRect().getHeight());
}
else
{
- (*panel_it)->mCollapseAmt = lerp((*panel_it)->mCollapseAmt, 0.f, LLCriticalDamp::getInterpolant(ANIM_CLOSE_TIME));
+ panel_rect.setLeftTopAndSize(0,
+ llround(cur_pos),
+ getRect().getWidth(),
+ llround(panel_dim));
}
+ panelp->setIgnoreReshape(true);
+ panelp->setShape(panel_rect);
+ panelp->setIgnoreReshape(false);
+
+ LLRect resize_bar_rect(panel_rect);
+ F32 panel_spacing = (F32)mPanelSpacing * panelp->getVisibleAmount();
if (mOrientation == HORIZONTAL)
{
- // enforce minimize size constraint by default
- if (panelp->getRect().getWidth() < (*panel_it)->mMinDim)
- {
- panelp->reshape((*panel_it)->mMinDim, panelp->getRect().getHeight());
- }
- total_width += llround(panelp->getRect().getWidth() * (*panel_it)->getCollapseFactor(mOrientation));
- // want n-1 panel gaps for n panels
- if (panel_it != mPanels.begin())
- {
- total_width += mPanelSpacing;
- }
+ resize_bar_rect.mLeft = panel_rect.mRight - mResizeBarOverlap;
+ resize_bar_rect.mRight = panel_rect.mRight + (S32)(llround(panel_spacing)) + mResizeBarOverlap;
+
+ cur_pos += panel_visible_dim + panel_spacing;
}
else //VERTICAL
{
- // enforce minimize size constraint by default
- if (panelp->getRect().getHeight() < (*panel_it)->mMinDim)
- {
- panelp->reshape(panelp->getRect().getWidth(), (*panel_it)->mMinDim);
- }
- total_height += llround(panelp->getRect().getHeight() * (*panel_it)->getCollapseFactor(mOrientation));
- if (panel_it != mPanels.begin())
- {
- total_height += mPanelSpacing;
- }
+ resize_bar_rect.mTop = panel_rect.mBottom + mResizeBarOverlap;
+ resize_bar_rect.mBottom = panel_rect.mBottom - (S32)(llround(panel_spacing)) - mResizeBarOverlap;
+
+ cur_pos -= panel_visible_dim + panel_spacing;
}
+ panelp->mResizeBar->setShape(resize_bar_rect);
}
- S32 num_resizable_panels = 0;
- S32 shrink_headroom_available = 0;
- S32 shrink_headroom_total = 0;
- for (panel_it = mPanels.begin(); panel_it != mPanels.end(); ++panel_it)
+ updateResizeBarLimits();
+
+ // clear animation flag at end, since panel resizes will set it
+ // and leave it set if there is any animation in progress
+ mNeedsLayout = continue_animating;
+} // end LLLayoutStack::updateLayout
+
+LLLayoutPanel* LLLayoutStack::findEmbeddedPanel(LLPanel* panelp) const
+{
+ if (!panelp) return NULL;
+
+ e_panel_list_t::const_iterator panel_it;
+ BOOST_FOREACH(LLLayoutPanel* p, mPanels)
{
- // panels that are not fully visible do not count towards shrink headroom
- if ((*panel_it)->getCollapseFactor(mOrientation) < 1.f)
+ if (p == panelp)
{
- continue;
+ return p;
}
+ }
+ return NULL;
+}
+
+LLLayoutPanel* LLLayoutStack::findEmbeddedPanelByName(const std::string& name) const
+{
+ LLLayoutPanel* result = NULL;
- // if currently resizing a panel or the panel is flagged as not automatically resizing
- // only track total available headroom, but don't use it for automatic resize logic
- if ((*panel_it)->mResizeBar->hasMouseCapture()
- || (!(*panel_it)->mAutoResize
- && !force_resize))
+ BOOST_FOREACH(LLLayoutPanel* p, mPanels)
+ {
+ if (p->getName() == name)
{
- if (mOrientation == HORIZONTAL)
- {
- shrink_headroom_total += (*panel_it)->getRect().getWidth() - (*panel_it)->mMinDim;
- }
- else //VERTICAL
- {
- shrink_headroom_total += (*panel_it)->getRect().getHeight() - (*panel_it)->mMinDim;
- }
+ result = p;
+ break;
}
- else
+ }
+
+ return result;
+}
+
+void LLLayoutStack::createResizeBar(LLLayoutPanel* panelp)
+{
+ BOOST_FOREACH(LLLayoutPanel* lp, mPanels)
+ {
+ if (lp->mResizeBar == NULL)
{
- num_resizable_panels++;
- if (mOrientation == HORIZONTAL)
- {
- shrink_headroom_available += (*panel_it)->getRect().getWidth() - (*panel_it)->mMinDim;
- shrink_headroom_total += (*panel_it)->getRect().getWidth() - (*panel_it)->mMinDim;
- }
- else //VERTICAL
- {
- shrink_headroom_available += (*panel_it)->getRect().getHeight() - (*panel_it)->mMinDim;
- shrink_headroom_total += (*panel_it)->getRect().getHeight() - (*panel_it)->mMinDim;
- }
+ LLResizeBar::Side side = (mOrientation == HORIZONTAL) ? LLResizeBar::RIGHT : LLResizeBar::BOTTOM;
+ LLRect resize_bar_rect = getRect();
+
+ LLResizeBar::Params resize_params;
+ resize_params.name("resize");
+ resize_params.resizing_view(lp);
+ resize_params.min_size(lp->getRelevantMinDim());
+ resize_params.side(side);
+ resize_params.snapping_enabled(false);
+ LLResizeBar* resize_bar = LLUICtrlFactory::create<LLResizeBar>(resize_params);
+ lp->mResizeBar = resize_bar;
+ LLView::addChild(resize_bar, 0);
}
}
-
- // calculate how many pixels need to be distributed among layout panels
- // positive means panels need to grow, negative means shrink
- S32 pixels_to_distribute;
- if (mOrientation == HORIZONTAL)
+ // bring all resize bars to the front so that they are clickable even over the panels
+ // with a bit of overlap
+ for (e_panel_list_t::iterator panel_it = mPanels.begin(); panel_it != mPanels.end(); ++panel_it)
{
- pixels_to_distribute = getRect().getWidth() - total_width;
+ LLResizeBar* resize_barp = (*panel_it)->mResizeBar;
+ sendChildToFront(resize_barp);
}
- else //VERTICAL
+}
+
+// update layout stack animations, etc. once per frame
+// NOTE: we use this to size world view based on animating UI, *before* we draw the UI
+// we might still need to call updateLayout during UI draw phase, in case UI elements
+// are resizing themselves dynamically
+//static
+void LLLayoutStack::updateClass()
+{
+ for (instance_iter it = beginInstances(); it != endInstances(); ++it)
{
- pixels_to_distribute = getRect().getHeight() - total_height;
+ it->updateLayout();
+ it->mAnimatedThisFrame = false;
}
+}
+
+void LLLayoutStack::updateFractionalSizes()
+{
+ F32 total_resizable_dim = 0.f;
- // now we distribute the pixels...
- S32 cur_x = 0;
- S32 cur_y = getRect().getHeight();
+ BOOST_FOREACH(LLLayoutPanel* panelp, mPanels)
+ {
+ if (panelp->mAutoResize)
+ {
+ total_resizable_dim += llmax(0, panelp->getLayoutDim() - panelp->getRelevantMinDim());
+ }
+ }
- for (panel_it = mPanels.begin(); panel_it != mPanels.end(); ++panel_it)
+ BOOST_FOREACH(LLLayoutPanel* panelp, mPanels)
{
- LLPanel* panelp = (*panel_it);
+ if (panelp->mAutoResize)
+ {
+ F32 panel_resizable_dim = llmax(MIN_FRACTIONAL_SIZE, (F32)(panelp->getLayoutDim() - panelp->getRelevantMinDim()));
+ panelp->mFractionalSize = panel_resizable_dim > 0.f
+ ? llclamp(panel_resizable_dim / total_resizable_dim, MIN_FRACTIONAL_SIZE, MAX_FRACTIONAL_SIZE)
+ : MIN_FRACTIONAL_SIZE;
+ llassert(!llisnan(panelp->mFractionalSize));
+ }
+ }
- S32 cur_width = panelp->getRect().getWidth();
- S32 cur_height = panelp->getRect().getHeight();
- S32 new_width = cur_width;
- S32 new_height = cur_height;
+ normalizeFractionalSizes();
+}
- if (mOrientation == HORIZONTAL)
+
+void LLLayoutStack::normalizeFractionalSizes()
+{
+ S32 num_auto_resize_panels = 0;
+ F32 total_fractional_size = 0.f;
+
+ BOOST_FOREACH(LLLayoutPanel* panelp, mPanels)
+ {
+ if (panelp->mAutoResize)
{
- new_width = llmax((*panel_it)->mMinDim, new_width);
+ total_fractional_size += panelp->mFractionalSize;
+ num_auto_resize_panels++;
}
- else
+ }
+
+ if (total_fractional_size == 0.f)
+ { // equal distribution
+ BOOST_FOREACH(LLLayoutPanel* panelp, mPanels)
+ {
+ if (panelp->mAutoResize)
+ {
+ panelp->mFractionalSize = MAX_FRACTIONAL_SIZE / (F32)num_auto_resize_panels;
+ }
+ }
+ }
+ else
+ { // renormalize
+ BOOST_FOREACH(LLLayoutPanel* panelp, mPanels)
{
- new_height = llmax((*panel_it)->mMinDim, new_height);
+ if (panelp->mAutoResize)
+ {
+ panelp->mFractionalSize /= total_fractional_size;
+ }
}
- S32 delta_size = 0;
+ }
+}
- // if panel can automatically resize (not animating, and resize flag set)...
- if ((*panel_it)->getCollapseFactor(mOrientation) == 1.f
- && (force_resize || (*panel_it)->mAutoResize)
- && !(*panel_it)->mResizeBar->hasMouseCapture())
+bool LLLayoutStack::animatePanels()
+{
+ bool continue_animating = false;
+
+ //
+ // animate visibility
+ //
+ BOOST_FOREACH(LLLayoutPanel* panelp, mPanels)
+ {
+ if (panelp->getVisible())
{
- if (mOrientation == HORIZONTAL)
+ if (mAnimate && panelp->mVisibleAmt < 1.f)
{
- // if we're shrinking
- if (pixels_to_distribute < 0)
- {
- // shrink proportionally to amount over minimum
- // so we can do this in one pass
- delta_size = (shrink_headroom_available > 0) ? llround((F32)pixels_to_distribute * ((F32)(cur_width - (*panel_it)->mMinDim) / (F32)shrink_headroom_available)) : 0;
- shrink_headroom_available -= (cur_width - (*panel_it)->mMinDim);
- }
- else
+ if (!mAnimatedThisFrame)
{
- // grow all elements equally
- delta_size = llround((F32)pixels_to_distribute / (F32)num_resizable_panels);
- num_resizable_panels--;
+ panelp->mVisibleAmt = lerp(panelp->mVisibleAmt, 1.f, LLCriticalDamp::getInterpolant(mOpenTimeConstant));
+ if (panelp->mVisibleAmt > 0.99f)
+ {
+ panelp->mVisibleAmt = 1.f;
+ }
}
- pixels_to_distribute -= delta_size;
- new_width = llmax((*panel_it)->mMinDim, cur_width + delta_size);
+
+ mAnimatedThisFrame = true;
+ continue_animating = true;
}
else
{
- new_width = getDefaultWidth(new_width);
- }
-
- if (mOrientation == VERTICAL)
- {
- if (pixels_to_distribute < 0)
+ if (panelp->mVisibleAmt != 1.f)
{
- // shrink proportionally to amount over minimum
- // so we can do this in one pass
- delta_size = (shrink_headroom_available > 0) ? llround((F32)pixels_to_distribute * ((F32)(cur_height - (*panel_it)->mMinDim) / (F32)shrink_headroom_available)) : 0;
- shrink_headroom_available -= (cur_height - (*panel_it)->mMinDim);
+ panelp->mVisibleAmt = 1.f;
+ mAnimatedThisFrame = true;
}
- else
+ }
+ }
+ else // not visible
+ {
+ if (mAnimate && panelp->mVisibleAmt > 0.f)
+ {
+ if (!mAnimatedThisFrame)
{
- delta_size = llround((F32)pixels_to_distribute / (F32)num_resizable_panels);
- num_resizable_panels--;
+ panelp->mVisibleAmt = lerp(panelp->mVisibleAmt, 0.f, LLCriticalDamp::getInterpolant(mCloseTimeConstant));
+ if (panelp->mVisibleAmt < 0.001f)
+ {
+ panelp->mVisibleAmt = 0.f;
+ }
}
- pixels_to_distribute -= delta_size;
- new_height = llmax((*panel_it)->mMinDim, cur_height + delta_size);
+
+ continue_animating = true;
+ mAnimatedThisFrame = true;
}
else
{
- new_height = getDefaultHeight(new_height);
+ if (panelp->mVisibleAmt != 0.f)
+ {
+ panelp->mVisibleAmt = 0.f;
+ mAnimatedThisFrame = true;
+ }
}
}
- else
+
+ F32 collapse_state = panelp->mCollapsed ? 1.f : 0.f;
+ if (panelp->mCollapseAmt != collapse_state)
{
- if (mOrientation == HORIZONTAL)
+ if (mAnimate)
{
- new_height = getDefaultHeight(new_height);
+ if (!mAnimatedThisFrame)
+ {
+ panelp->mCollapseAmt = lerp(panelp->mCollapseAmt, collapse_state, LLCriticalDamp::getInterpolant(mCloseTimeConstant));
+ }
+
+ if (llabs(panelp->mCollapseAmt - collapse_state) < 0.001f)
+ {
+ panelp->mCollapseAmt = collapse_state;
+ }
+
+ mAnimatedThisFrame = true;
+ continue_animating = true;
}
- else // VERTICAL
+ else
{
- new_width = getDefaultWidth(new_width);
+ panelp->mCollapseAmt = collapse_state;
+ mAnimatedThisFrame = true;
}
}
+ }
- // adjust running headroom count based on new sizes
- shrink_headroom_total += delta_size;
+ if (mAnimatedThisFrame) mNeedsLayout = true;
+ return continue_animating;
+}
- LLRect panel_rect;
- panel_rect.setLeftTopAndSize(cur_x, cur_y, new_width, new_height);
- panelp->setShape(panel_rect);
+void LLLayoutStack::updatePanelRect( LLLayoutPanel* resized_panel, const LLRect& new_rect )
+{
+ S32 new_dim = (mOrientation == HORIZONTAL)
+ ? new_rect.getWidth()
+ : new_rect.getHeight();
+ S32 delta_dim = new_dim - resized_panel->getVisibleDim();
+ if (delta_dim == 0) return;
- LLRect resize_bar_rect = panel_rect;
- if (mOrientation == HORIZONTAL)
- {
- resize_bar_rect.mLeft = panel_rect.mRight - resize_bar_overlap;
- resize_bar_rect.mRight = panel_rect.mRight + mPanelSpacing + resize_bar_overlap;
- }
- else
- {
- resize_bar_rect.mTop = panel_rect.mBottom + resize_bar_overlap;
- resize_bar_rect.mBottom = panel_rect.mBottom - mPanelSpacing - resize_bar_overlap;
- }
- (*panel_it)->mResizeBar->setRect(resize_bar_rect);
+ F32 total_visible_fraction = 0.f;
+ F32 delta_auto_resize_headroom = 0.f;
+ F32 original_auto_resize_headroom = 0.f;
- if (mOrientation == HORIZONTAL)
- {
- cur_x += llround(new_width * (*panel_it)->getCollapseFactor(mOrientation)) + mPanelSpacing;
- }
- else //VERTICAL
- {
- cur_y -= llround(new_height * (*panel_it)->getCollapseFactor(mOrientation)) + mPanelSpacing;
- }
- }
+ LLLayoutPanel* other_resize_panel = NULL;
+ LLLayoutPanel* following_panel = NULL;
- // update resize bars with new limits
- LLResizeBar* last_resize_bar = NULL;
- for (panel_it = mPanels.begin(); panel_it != mPanels.end(); ++panel_it)
+ BOOST_REVERSE_FOREACH(LLLayoutPanel* panelp, mPanels)
{
- LLPanel* panelp = (*panel_it);
-
- if (mOrientation == HORIZONTAL)
+ if (panelp->mAutoResize)
{
- (*panel_it)->mResizeBar->setResizeLimits(
- (*panel_it)->mMinDim,
- (*panel_it)->mMinDim + shrink_headroom_total);
+ original_auto_resize_headroom += (F32)(panelp->mTargetDim - panelp->getRelevantMinDim());
+ if (panelp->getVisible() && !panelp->mCollapsed)
+ {
+ total_visible_fraction += panelp->mFractionalSize;
+ }
}
- else //VERTICAL
+
+ if (panelp == resized_panel)
{
- (*panel_it)->mResizeBar->setResizeLimits(
- (*panel_it)->mMinDim,
- (*panel_it)->mMinDim + shrink_headroom_total);
+ other_resize_panel = following_panel;
}
- // toggle resize bars based on panel visibility, resizability, etc
- BOOL resize_bar_enabled = panelp->getVisible() && (*panel_it)->mUserResize;
- (*panel_it)->mResizeBar->setVisible(resize_bar_enabled);
-
- if (resize_bar_enabled)
+ if (panelp->getVisible() && !panelp->mCollapsed)
{
- last_resize_bar = (*panel_it)->mResizeBar;
+ following_panel = panelp;
}
}
- // hide last resize bar as there is nothing past it
- // resize bars need to be in between two resizable panels
- if (last_resize_bar)
- {
- last_resize_bar->setVisible(FALSE);
- }
- // not enough room to fit existing contents
- if (force_resize == FALSE
- // layout did not complete by reaching target position
- && ((mOrientation == VERTICAL && cur_y != -mPanelSpacing)
- || (mOrientation == HORIZONTAL && cur_x != getRect().getWidth() + mPanelSpacing)))
+ if (resized_panel->mAutoResize)
{
- // do another layout pass with all stacked elements contributing
- // even those that don't usually resize
- llassert_always(force_resize == FALSE);
- updateLayout(TRUE);
+ if (!other_resize_panel || !other_resize_panel->mAutoResize)
+ {
+ delta_auto_resize_headroom += delta_dim;
+ }
}
-
- mAnimatedThisFrame = true;
-} // end LLLayoutStack::updateLayout
-
-
-LLLayoutPanel* LLLayoutStack::findEmbeddedPanel(LLPanel* panelp) const
-{
- if (!panelp) return NULL;
-
- e_panel_list_t::const_iterator panel_it;
- for (panel_it = mPanels.begin(); panel_it != mPanels.end(); ++panel_it)
+ else
{
- if ((*panel_it) == panelp)
+ if (!other_resize_panel || other_resize_panel->mAutoResize)
{
- return *panel_it;
+ delta_auto_resize_headroom -= delta_dim;
}
}
- return NULL;
-}
-LLLayoutPanel* LLLayoutStack::findEmbeddedPanelByName(const std::string& name) const
-{
- LLLayoutPanel* result = NULL;
+ F32 fraction_given_up = 0.f;
+ F32 fraction_remaining = 1.f;
+ F32 updated_auto_resize_headroom = original_auto_resize_headroom + delta_auto_resize_headroom;
- for (e_panel_list_t::const_iterator panel_it = mPanels.begin(); panel_it != mPanels.end(); ++panel_it)
+ enum
{
- LLLayoutPanel* p = *panel_it;
+ BEFORE_RESIZED_PANEL,
+ RESIZED_PANEL,
+ NEXT_PANEL,
+ AFTER_RESIZED_PANEL
+ } which_panel = BEFORE_RESIZED_PANEL;
- if (p->getName() == name)
+ BOOST_FOREACH(LLLayoutPanel* panelp, mPanels)
+ {
+ if (!panelp->getVisible() || panelp->mCollapsed) continue;
+
+ if (panelp == resized_panel)
{
- result = p;
- break;
+ which_panel = RESIZED_PANEL;
}
- }
-
- return result;
-}
-// Compute sum of min_width or min_height of children
-void LLLayoutStack::calcMinExtents()
-{
- mMinWidth = 0;
- mMinHeight = 0;
-
- e_panel_list_t::iterator panel_it;
- for (panel_it = mPanels.begin(); panel_it != mPanels.end(); ++panel_it)
- {
- if (mOrientation == HORIZONTAL)
+ switch(which_panel)
{
- mMinWidth += (*panel_it)->mMinDim;
- if (panel_it != mPanels.begin())
+ case BEFORE_RESIZED_PANEL:
+ if (panelp->mAutoResize)
+ { // freeze current size as fraction of overall auto_resize space
+ F32 fractional_adjustment_factor = updated_auto_resize_headroom == 0.f
+ ? 1.f
+ : original_auto_resize_headroom / updated_auto_resize_headroom;
+ F32 new_fractional_size = llclamp(panelp->mFractionalSize * fractional_adjustment_factor,
+ MIN_FRACTIONAL_SIZE,
+ MAX_FRACTIONAL_SIZE);
+ fraction_given_up -= new_fractional_size - panelp->mFractionalSize;
+ fraction_remaining -= panelp->mFractionalSize;
+ panelp->mFractionalSize = new_fractional_size;
+ llassert(!llisnan(panelp->mFractionalSize));
+ }
+ else
{
- mMinWidth += mPanelSpacing;
+ // leave non auto-resize panels alone
}
- }
- else //VERTICAL
- {
- mMinHeight += (*panel_it)->mMinDim;
- if (panel_it != mPanels.begin())
+ break;
+ case RESIZED_PANEL:
+ if (panelp->mAutoResize)
+ { // freeze new size as fraction
+ F32 new_fractional_size = (updated_auto_resize_headroom == 0.f)
+ ? MAX_FRACTIONAL_SIZE
+ : llclamp(total_visible_fraction * (F32)(new_dim - panelp->getRelevantMinDim()) / updated_auto_resize_headroom, MIN_FRACTIONAL_SIZE, MAX_FRACTIONAL_SIZE);
+ fraction_given_up -= new_fractional_size - panelp->mFractionalSize;
+ fraction_remaining -= panelp->mFractionalSize;
+ panelp->mFractionalSize = new_fractional_size;
+ llassert(!llisnan(panelp->mFractionalSize));
+ }
+ else
+ { // freeze new size as original size
+ panelp->mTargetDim = new_dim;
+ }
+ which_panel = NEXT_PANEL;
+ break;
+ case NEXT_PANEL:
+ if (panelp->mAutoResize)
{
- mMinHeight += mPanelSpacing;
+ fraction_remaining -= panelp->mFractionalSize;
+ if (resized_panel->mAutoResize)
+ {
+ panelp->mFractionalSize = llclamp(panelp->mFractionalSize + fraction_given_up, MIN_FRACTIONAL_SIZE, MAX_FRACTIONAL_SIZE);
+ fraction_given_up = 0.f;
+ }
+ else
+ {
+ F32 new_fractional_size = llclamp(total_visible_fraction * (F32)(panelp->mTargetDim - panelp->getRelevantMinDim() + delta_auto_resize_headroom)
+ / updated_auto_resize_headroom,
+ MIN_FRACTIONAL_SIZE,
+ MAX_FRACTIONAL_SIZE);
+ fraction_given_up -= new_fractional_size - panelp->mFractionalSize;
+ panelp->mFractionalSize = new_fractional_size;
+ }
}
+ else
+ {
+ panelp->mTargetDim -= delta_dim;
+ }
+ which_panel = AFTER_RESIZED_PANEL;
+ break;
+ case AFTER_RESIZED_PANEL:
+ if (panelp->mAutoResize && fraction_given_up != 0.f)
+ {
+ panelp->mFractionalSize = llclamp(panelp->mFractionalSize + (panelp->mFractionalSize / fraction_remaining) * fraction_given_up,
+ MIN_FRACTIONAL_SIZE,
+ MAX_FRACTIONAL_SIZE);
+ }
+ default:
+ break;
}
}
+ updateLayout();
+ normalizeFractionalSizes();
}
-void LLLayoutStack::createResizeBars()
+void LLLayoutStack::reshape(S32 width, S32 height, BOOL called_from_parent)
{
- for (e_panel_list_t::iterator panel_it = mPanels.begin(); panel_it != mPanels.end(); ++panel_it)
+ mNeedsLayout = true;
+ LLView::reshape(width, height, called_from_parent);
+}
+
+void LLLayoutStack::updateResizeBarLimits()
+{
+ LLLayoutPanel* previous_visible_panelp = NULL;
+ BOOST_REVERSE_FOREACH(LLLayoutPanel* visible_panelp, mPanels)
{
- LLLayoutPanel* lp = (*panel_it);
- if (lp->mResizeBar == NULL)
+ if (!visible_panelp->getVisible() || visible_panelp->mCollapsed)
{
- LLResizeBar::Side side = (mOrientation == HORIZONTAL) ? LLResizeBar::RIGHT : LLResizeBar::BOTTOM;
- LLRect resize_bar_rect = getRect();
-
- LLResizeBar::Params resize_params;
- resize_params.name("resize");
- resize_params.resizing_view(lp);
- resize_params.min_size(lp->mMinDim);
- resize_params.side(side);
- resize_params.snapping_enabled(false);
- LLResizeBar* resize_bar = LLUICtrlFactory::create<LLResizeBar>(resize_params);
- lp->mResizeBar = resize_bar;
- LLView::addChild(resize_bar, 0);
+ visible_panelp->mResizeBar->setVisible(FALSE);
+ continue;
+ }
- // bring all resize bars to the front so that they are clickable even over the panels
- // with a bit of overlap
- for (e_panel_list_t::iterator panel_it = mPanels.begin(); panel_it != mPanels.end(); ++panel_it)
- {
- LLResizeBar* resize_barp = (*panel_it)->mResizeBar;
- sendChildToFront(resize_barp);
- }
+ // toggle resize bars based on panel visibility, resizability, etc
+ if (previous_visible_panelp
+ && (visible_panelp->mUserResize || previous_visible_panelp->mUserResize) // one of the pair is user resizable
+ && (visible_panelp->mAutoResize || visible_panelp->mUserResize) // current panel is resizable
+ && (previous_visible_panelp->mAutoResize || previous_visible_panelp->mUserResize)) // previous panel is resizable
+ {
+ visible_panelp->mResizeBar->setVisible(TRUE);
+ S32 previous_panel_headroom = previous_visible_panelp->getVisibleDim() - previous_visible_panelp->getRelevantMinDim();
+ visible_panelp->mResizeBar->setResizeLimits(visible_panelp->getRelevantMinDim(),
+ visible_panelp->getVisibleDim() + previous_panel_headroom);
+ }
+ else
+ {
+ visible_panelp->mResizeBar->setVisible(FALSE);
}
- }
-}
-// update layout stack animations, etc. once per frame
-// NOTE: we use this to size world view based on animating UI, *before* we draw the UI
-// we might still need to call updateLayout during UI draw phase, in case UI elements
-// are resizing themselves dynamically
-//static
-void LLLayoutStack::updateClass()
-{
- LLInstanceTrackerScopedGuard guard;
- for (LLLayoutStack::instance_iter it = guard.beginInstances();
- it != guard.endInstances();
- ++it)
- {
- it->updateLayout();
+ previous_visible_panelp = visible_panelp;
}
}
diff --git a/indra/llui/lllayoutstack.h b/indra/llui/lllayoutstack.h
index e19ef403ef..648cd5fdce 100644
--- a/indra/llui/lllayoutstack.h
+++ b/indra/llui/lllayoutstack.h
@@ -5,7 +5,7 @@
*
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
* Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
+ * Copyright (C) 2010, Linden Reshasearch, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -30,46 +30,54 @@
#include "llpanel.h"
-class LLPanel;
class LLLayoutPanel;
+
class LLLayoutStack : public LLView, public LLInstanceTracker<LLLayoutStack>
{
public:
+ typedef enum e_layout_orientation
+ {
+ HORIZONTAL,
+ VERTICAL
+ } ELayoutOrientation;
+
+ struct OrientationNames
+ : public LLInitParam::TypeValuesHelper<ELayoutOrientation, OrientationNames>
+ {
+ static void declareValues();
+ };
+
struct LayoutStackRegistry : public LLChildRegistry<LayoutStackRegistry>
{};
struct Params : public LLInitParam::Block<Params, LLView::Params>
{
- Mandatory<std::string> orientation;
+ Mandatory<ELayoutOrientation, OrientationNames> orientation;
Optional<S32> border_size;
Optional<bool> animate,
clip;
+ Optional<F32> open_time_constant,
+ close_time_constant;
+ Optional<S32> resize_bar_overlap;
Params();
};
typedef LayoutStackRegistry child_registry_t;
- typedef enum e_layout_orientation
- {
- HORIZONTAL,
- VERTICAL
- } ELayoutOrientation;
-
virtual ~LLLayoutStack();
/*virtual*/ void draw();
/*virtual*/ void removeChild(LLView*);
/*virtual*/ BOOL postBuild();
- /*virtual*/ bool addChild(LLView* child, S32 tab_group = 0);
+ /*virtual*/ bool addChild(LLView* child, S32 tab_groupdatefractuiona = 0);
+ /*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
+
static LLView* fromXML(LLXMLNodePtr node, LLView *parent, LLXMLNodePtr output_node = NULL);
- S32 getMinWidth() const { return mMinWidth; }
- S32 getMinHeight() const { return mMinHeight; }
-
typedef enum e_animate
{
NO_ANIMATE,
@@ -77,49 +85,24 @@ public:
} EAnimate;
void addPanel(LLLayoutPanel* panel, EAnimate animate = NO_ANIMATE);
- void removePanel(LLPanel* panel);
void collapsePanel(LLPanel* panel, BOOL collapsed = TRUE);
S32 getNumPanels() { return mPanels.size(); }
- /**
- * Moves panel_to_move before target_panel inside layout stack (both panels should already be there).
- * If move_to_front is true target_panel is ignored and panel_to_move is moved to the beginning of mPanels
- */
- void movePanel(LLPanel* panel_to_move, LLPanel* target_panel, bool move_to_front = false);
-
- void updatePanelAutoResize(const std::string& panel_name, BOOL auto_resize);
- void setPanelUserResize(const std::string& panel_name, BOOL user_resize);
-
- /**
- * Gets minimal dimension along layout_stack axis of the specified by name panel.
- *
- * @returns true if specified by panel_name internal panel exists, false otherwise.
- */
- bool getPanelMinSize(const std::string& panel_name, S32* min_dimp);
-
- /**
- * Gets maximal dimension along layout_stack axis of the specified by name panel.
- *
- * @returns true if specified by panel_name internal panel exists, false otherwise.
- */
- bool getPanelMaxSize(const std::string& panel_name, S32* max_dim);
-
- void updateLayout(BOOL force_resize = FALSE);
-
+
+ void updateLayout();
+
S32 getPanelSpacing() const { return mPanelSpacing; }
- BOOL getAnimate () const { return mAnimate; }
- void setAnimate (BOOL animate) { mAnimate = animate; }
static void updateClass();
protected:
LLLayoutStack(const Params&);
friend class LLUICtrlFactory;
+ friend class LLLayoutPanel;
private:
- void createResizeBars();
- void calcMinExtents();
- S32 getDefaultHeight(S32 cur_height);
- S32 getDefaultWidth(S32 cur_width);
+ void updateResizeBarLimits();
+ bool animatePanels();
+ void createResizeBar(LLLayoutPanel* panel);
const ELayoutOrientation mOrientation;
@@ -128,17 +111,23 @@ private:
LLLayoutPanel* findEmbeddedPanel(LLPanel* panelp) const;
LLLayoutPanel* findEmbeddedPanelByName(const std::string& name) const;
+ void updateFractionalSizes();
+ void normalizeFractionalSizes();
+ void updatePanelRect( LLLayoutPanel* param1, const LLRect& new_rect );
- S32 mMinWidth; // calculated by calcMinExtents
- S32 mMinHeight; // calculated by calcMinExtents
S32 mPanelSpacing;
// true if we already applied animation this frame
bool mAnimatedThisFrame;
bool mAnimate;
bool mClip;
+ F32 mOpenTimeConstant;
+ F32 mCloseTimeConstant;
+ bool mNeedsLayout;
+ S32 mResizeBarOverlap;
}; // end class LLLayoutStack
+
class LLLayoutPanel : public LLPanel
{
friend class LLLayoutStack;
@@ -146,41 +135,71 @@ friend class LLUICtrlFactory;
public:
struct Params : public LLInitParam::Block<Params, LLPanel::Params>
{
- Optional<S32> min_dim,
- max_dim;
+ Optional<S32> expanded_min_dim,
+ min_dim;
Optional<bool> user_resize,
auto_resize;
- Params()
- : min_dim("min_dim", 0),
- max_dim("max_dim", 0),
- user_resize("user_resize", true),
- auto_resize("auto_resize", true)
- {
- addSynonym(min_dim, "min_width");
- addSynonym(min_dim, "min_height");
- addSynonym(max_dim, "max_width");
- addSynonym(max_dim, "max_height");
- }
+ Params();
};
~LLLayoutPanel();
void initFromParams(const Params& p);
-protected:
- LLLayoutPanel(const Params& p) ;
+ void handleReshape(const LLRect& new_rect, bool by_user);
+
+ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
+
+
+ void setVisible(BOOL visible);
+
+ S32 getLayoutDim() const;
+ S32 getTargetDim() const;
+ void setTargetDim(S32 value);
+ S32 getMinDim() const { return llmax(0, mMinDim); }
+ void setMinDim(S32 value) { mMinDim = value; }
+
+ S32 getExpandedMinDim() const { return mExpandedMinDim >= 0 ? mExpandedMinDim : getMinDim(); }
+ void setExpandedMinDim(S32 value) { mExpandedMinDim = value; }
- F32 getCollapseFactor(LLLayoutStack::ELayoutOrientation orientation);
+ S32 getRelevantMinDim() const
+ {
+ S32 min_dim = mMinDim;
+
+ if (!mCollapsed)
+ {
+ min_dim = getExpandedMinDim();
+ }
+
+ return min_dim;
+ }
- S32 mMinDim;
- S32 mMaxDim;
- BOOL mAutoResize;
- BOOL mUserResize;
- BOOL mCollapsed;
+ F32 getAutoResizeFactor() const;
+ F32 getVisibleAmount() const;
+ S32 getVisibleDim() const;
+
+ void setOrientation(LLLayoutStack::ELayoutOrientation orientation);
+ void storeOriginalDim();
+
+ void setIgnoreReshape(bool ignore) { mIgnoreReshape = ignore; }
+
+protected:
+ LLLayoutPanel(const Params& p);
+
+ const bool mAutoResize;
+ const bool mUserResize;
+
+ S32 mExpandedMinDim;
+ S32 mMinDim;
+ bool mCollapsed;
+ F32 mVisibleAmt;
+ F32 mCollapseAmt;
+ F32 mFractionalSize;
+ S32 mTargetDim;
+ bool mIgnoreReshape;
+ LLLayoutStack::ELayoutOrientation mOrientation;
class LLResizeBar* mResizeBar;
- F32 mVisibleAmt;
- F32 mCollapseAmt;
};
diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp
index 3eb58e1aec..d0fbf4b913 100644
--- a/indra/llui/lllineeditor.cpp
+++ b/indra/llui/lllineeditor.cpp
@@ -37,6 +37,7 @@
#include "llgl.h"
#include "lltimer.h"
+#include "llcalc.h"
//#include "llclipboard.h"
#include "llcontrol.h"
#include "llbutton.h"
@@ -81,6 +82,7 @@ LLLineEditor::Params::Params()
: max_length(""),
keystroke_callback("keystroke_callback"),
prevalidate_callback("prevalidate_callback"),
+ prevalidate_input_callback("prevalidate_input_callback"),
background_image("background_image"),
background_image_disabled("background_image_disabled"),
background_image_focused("background_image_focused"),
@@ -88,6 +90,7 @@ LLLineEditor::Params::Params()
revert_on_esc("revert_on_esc", true),
commit_on_focus_lost("commit_on_focus_lost", true),
ignore_tab("ignore_tab", true),
+ is_password("is_password", false),
cursor_color("cursor_color"),
text_color("text_color"),
text_readonly_color("text_readonly_color"),
@@ -100,10 +103,11 @@ LLLineEditor::Params::Params()
text_pad_right("text_pad_right"),
default_text("default_text")
{
- mouse_opaque = true;
+ changeDefault(mouse_opaque, true);
addSynonym(select_on_focus, "select_all_on_focus_received");
addSynonym(border, "border");
addSynonym(label, "watermark_text");
+ addSynonym(max_length.chars, "max_length");
}
LLLineEditor::LLLineEditor(const LLLineEditor::Params& p)
@@ -129,8 +133,9 @@ LLLineEditor::LLLineEditor(const LLLineEditor::Params& p)
mBorderThickness( 0 ),
mIgnoreArrowKeys( FALSE ),
mIgnoreTab( p.ignore_tab ),
- mDrawAsterixes( FALSE ),
+ mDrawAsterixes( p.is_password ),
mSelectAllonFocusReceived( p.select_on_focus ),
+ mSelectAllonCommit( TRUE ),
mPassDelete(FALSE),
mReadOnly(FALSE),
mBgImage( p.background_image ),
@@ -172,6 +177,7 @@ LLLineEditor::LLLineEditor(const LLLineEditor::Params& p)
updateTextPadding();
setCursor(mText.length());
+ setPrevalidateInput(p.prevalidate_input_callback());
setPrevalidate(p.prevalidate_callback());
LLContextMenu* menu = LLUICtrlFactory::instance().createFromFile<LLContextMenu>
@@ -192,6 +198,7 @@ LLLineEditor::~LLLineEditor()
void LLLineEditor::onFocusReceived()
{
+ gEditMenuHandler = this;
LLUICtrl::onFocusReceived();
updateAllowingLanguageInput();
}
@@ -227,7 +234,10 @@ void LLLineEditor::onCommit()
setControlValue(getValue());
LLUICtrl::onCommit();
- selectAll();
+
+ // Selection on commit needs to be turned off when evaluating maths
+ // expressions, to allow indication of the error position
+ if (mSelectAllonCommit) selectAll();
}
// Returns TRUE if user changed value at all
@@ -388,7 +398,11 @@ void LLLineEditor::setText(const LLStringExplicit &new_text)
setCursor(llmin((S32)mText.length(), getCursor()));
// Set current history line to end of history.
- if(mLineHistory.end() != mLineHistory.begin())
+ if (mLineHistory.empty())
+ {
+ mCurrentHistoryLine = mLineHistory.end();
+ }
+ else
{
mCurrentHistoryLine = mLineHistory.end() - 1;
}
@@ -400,23 +414,15 @@ void LLLineEditor::setText(const LLStringExplicit &new_text)
// Picks a new cursor position based on the actual screen size of text being drawn.
void LLLineEditor::setCursorAtLocalPos( S32 local_mouse_x )
{
- const llwchar* wtext = mText.getWString().c_str();
- LLWString asterix_text;
- if (mDrawAsterixes)
- {
- for (S32 i = 0; i < mText.length(); i++)
- {
- asterix_text += utf8str_to_wstring(PASSWORD_ASTERISK);
- }
- wtext = asterix_text.c_str();
- }
+ S32 cursor_pos = calcCursorPos(local_mouse_x);
+
+ S32 left_pos = llmin( mSelectionStart, cursor_pos );
+ S32 length = llabs( mSelectionStart - cursor_pos );
+ const LLWString& substr = mText.getWString().substr(left_pos, length);
+
+ if (mIsSelecting && !prevalidateInput(substr))
+ return;
- S32 cursor_pos =
- mScrollHPos +
- mGLFont->charFromPixelOffset(
- wtext, mScrollHPos,
- (F32)(local_mouse_x - mTextLeftEdge),
- (F32)(mTextRightEdge - mTextLeftEdge + 1)); // min-max range is inclusive
setCursor(cursor_pos);
}
@@ -500,6 +506,11 @@ BOOL LLLineEditor::canSelectAll() const
void LLLineEditor::selectAll()
{
+ if (!prevalidateInput(mText.getWString()))
+ {
+ return;
+ }
+
mSelectionStart = mText.length();
mSelectionEnd = 0;
setCursor(mSelectionEnd);
@@ -585,6 +596,9 @@ BOOL LLLineEditor::handleMouseDown(S32 x, S32 y, MASK mask)
if (mask & MASK_SHIFT)
{
+ // assume we're starting a drag select
+ mIsSelecting = TRUE;
+
// Handle selection extension
S32 old_cursor_pos = getCursor();
setCursorAtLocalPos(x);
@@ -619,8 +633,6 @@ BOOL LLLineEditor::handleMouseDown(S32 x, S32 y, MASK mask)
mSelectionStart = old_cursor_pos;
mSelectionEnd = getCursor();
}
- // assume we're starting a drag select
- mIsSelecting = TRUE;
}
else
{
@@ -791,6 +803,9 @@ void LLLineEditor::removeChar()
{
if( getCursor() > 0 )
{
+ if (!prevalidateInput(mText.getWString().substr(getCursor()-1, 1)))
+ return;
+
mText.erase(getCursor() - 1, 1);
setCursor(getCursor() - 1);
@@ -811,6 +826,9 @@ void LLLineEditor::addChar(const llwchar uni_char)
}
else if (LL_KIM_OVERWRITE == gKeyboard->getInsertMode())
{
+ if (!prevalidateInput(mText.getWString().substr(getCursor(), 1)))
+ return;
+
mText.erase(getCursor(), 1);
}
@@ -859,6 +877,13 @@ void LLLineEditor::extendSelection( S32 new_cursor_pos )
startSelection();
}
+ S32 left_pos = llmin( mSelectionStart, new_cursor_pos );
+ S32 selection_length = llabs( mSelectionStart - new_cursor_pos );
+ const LLWString& selection = mText.getWString().substr(left_pos, selection_length);
+
+ if (!prevalidateInput(selection))
+ return;
+
setCursor(new_cursor_pos);
mSelectionEnd = getCursor();
}
@@ -989,8 +1014,12 @@ void LLLineEditor::deleteSelection()
{
if( !mReadOnly && hasSelection() )
{
- S32 left_pos = llmin( mSelectionStart, mSelectionEnd );
- S32 selection_length = llabs( mSelectionStart - mSelectionEnd );
+ S32 left_pos, selection_length;
+ getSelectionRange(&left_pos, &selection_length);
+ const LLWString& selection = mText.getWString().substr(left_pos, selection_length);
+
+ if (!prevalidateInput(selection))
+ return;
mText.erase(left_pos, selection_length);
deselect();
@@ -1008,13 +1037,17 @@ void LLLineEditor::cut()
{
if( canCut() )
{
+ S32 left_pos, length;
+ getSelectionRange(&left_pos, &length);
+ const LLWString& selection = mText.getWString().substr(left_pos, length);
+
+ if (!prevalidateInput(selection))
+ return;
+
// Prepare for possible rollback
LLLineEditorRollback rollback( this );
-
- S32 left_pos = llmin( mSelectionStart, mSelectionEnd );
- S32 length = llabs( mSelectionStart - mSelectionEnd );
- gClipboard.copyFromSubstring( mText.getWString(), left_pos, length );
+ LLClipboard::instance().copyToClipboard( mText.getWString(), left_pos, length );
deleteSelection();
// Validate new string and rollback the if needed.
@@ -1045,13 +1078,13 @@ void LLLineEditor::copy()
{
S32 left_pos = llmin( mSelectionStart, mSelectionEnd );
S32 length = llabs( mSelectionStart - mSelectionEnd );
- gClipboard.copyFromSubstring( mText.getWString(), left_pos, length );
+ LLClipboard::instance().copyToClipboard( mText.getWString(), left_pos, length );
}
}
BOOL LLLineEditor::canPaste() const
{
- return !mReadOnly && gClipboard.canPasteString();
+ return !mReadOnly && LLClipboard::instance().isTextAvailable();
}
void LLLineEditor::paste()
@@ -1082,17 +1115,13 @@ void LLLineEditor::pasteHelper(bool is_primary)
if (can_paste_it)
{
LLWString paste;
- if (is_primary)
- {
- paste = gClipboard.getPastePrimaryWString();
- }
- else
- {
- paste = gClipboard.getPasteWString();
- }
+ LLClipboard::instance().pasteFromClipboard(paste, is_primary);
if (!paste.empty())
{
+ if (!prevalidateInput(paste))
+ return;
+
// Prepare for possible rollback
LLLineEditorRollback rollback(this);
@@ -1173,13 +1202,13 @@ void LLLineEditor::copyPrimary()
{
S32 left_pos = llmin( mSelectionStart, mSelectionEnd );
S32 length = llabs( mSelectionStart - mSelectionEnd );
- gClipboard.copyFromPrimarySubstring( mText.getWString(), left_pos, length );
+ LLClipboard::instance().copyToClipboard( mText.getWString(), left_pos, length, true);
}
}
BOOL LLLineEditor::canPastePrimary() const
{
- return !mReadOnly && gClipboard.canPastePrimaryString();
+ return !mReadOnly && LLClipboard::instance().isTextAvailable(true);
}
void LLLineEditor::updatePrimary()
@@ -1440,6 +1469,13 @@ BOOL LLLineEditor::handleUnicodeCharHere(llwchar uni_char)
LLLineEditorRollback rollback( this );
+ {
+ LLWString u_char;
+ u_char.assign(1, uni_char);
+ if (!prevalidateInput(u_char))
+ return handled;
+ }
+
addChar(uni_char);
mKeystrokeTimer.reset();
@@ -1491,6 +1527,15 @@ void LLLineEditor::doDelete()
}
else if ( getCursor() < mText.length())
{
+ const LLWString& text_to_delete = mText.getWString().substr(getCursor(), 1);
+
+ if (!prevalidateInput(text_to_delete))
+ {
+ if( mKeystrokeCallback )
+ mKeystrokeCallback( this );
+
+ return;
+ }
setCursor(getCursor() + 1);
removeChar();
}
@@ -1529,8 +1574,11 @@ void LLLineEditor::drawBackground()
{
image = mBgImage;
}
+
+ if (!image) return;
- F32 alpha = getDrawContext().mAlpha;
+ F32 alpha = getCurrentTransparency();
+
// optionally draw programmatic border
if (has_focus)
{
@@ -1575,7 +1623,7 @@ void LLLineEditor::draw()
LLRect background( 0, getRect().getHeight(), getRect().getWidth(), 0 );
background.stretch( -mBorderThickness );
- S32 lineeditor_v_pad = llround((background.getHeight() - mGLFont->getLineHeight())/2);
+ S32 lineeditor_v_pad = (background.getHeight() - mGLFont->getLineHeight()) / 2;
drawBackground();
@@ -1835,6 +1883,27 @@ S32 LLLineEditor::findPixelNearestPos(const S32 cursor_offset) const
return result;
}
+S32 LLLineEditor::calcCursorPos(S32 mouse_x)
+{
+ const llwchar* wtext = mText.getWString().c_str();
+ LLWString asterix_text;
+ if (mDrawAsterixes)
+ {
+ for (S32 i = 0; i < mText.length(); i++)
+ {
+ asterix_text += utf8str_to_wstring(PASSWORD_ASTERISK);
+ }
+ wtext = asterix_text.c_str();
+ }
+
+ S32 cur_pos = mScrollHPos +
+ mGLFont->charFromPixelOffset(
+ wtext, mScrollHPos,
+ (F32)(mouse_x - mTextLeftEdge),
+ (F32)(mTextRightEdge - mTextLeftEdge + 1)); // min-max range is inclusive
+
+ return cur_pos;
+}
//virtual
void LLLineEditor::clear()
{
@@ -1928,6 +1997,22 @@ void LLLineEditor::setPrevalidate(LLTextValidate::validate_func_t func)
updateAllowingLanguageInput();
}
+void LLLineEditor::setPrevalidateInput(LLTextValidate::validate_func_t func)
+{
+ mPrevalidateInputFunc = func;
+ updateAllowingLanguageInput();
+}
+
+bool LLLineEditor::prevalidateInput(const LLWString& wstr)
+{
+ if (mPrevalidateInputFunc && !mPrevalidateInputFunc(wstr))
+ {
+ return false;
+ }
+
+ return true;
+}
+
// static
BOOL LLLineEditor::postvalidateFloat(const std::string &str)
{
@@ -1987,6 +2072,32 @@ BOOL LLLineEditor::postvalidateFloat(const std::string &str)
return success;
}
+BOOL LLLineEditor::evaluateFloat()
+{
+ bool success;
+ F32 result = 0.f;
+ std::string expr = getText();
+ LLStringUtil::toUpper(expr);
+
+ success = LLCalc::getInstance()->evalString(expr, result);
+
+ if (!success)
+ {
+ // Move the cursor to near the error on failure
+ setCursor(LLCalc::getInstance()->getLastErrorPos());
+ // *TODO: Translated error message indicating the type of error? Select error text?
+ }
+ else
+ {
+ // Replace the expression with the result
+ std::string result_str = llformat("%f",result);
+ setText(result_str);
+ selectAll();
+ }
+
+ return success;
+}
+
void LLLineEditor::onMouseCaptureLost()
{
endSelection();
@@ -2286,3 +2397,8 @@ void LLLineEditor::setContextMenu(LLContextMenu* new_context_menu)
else
mContextMenuHandle.markDead();
}
+
+void LLLineEditor::setFont(const LLFontGL* font)
+{
+ mGLFont = font;
+}
diff --git a/indra/llui/lllineeditor.h b/indra/llui/lllineeditor.h
index a1aa6b71c6..2518dbe3c7 100644
--- a/indra/llui/lllineeditor.h
+++ b/indra/llui/lllineeditor.h
@@ -41,6 +41,7 @@
#include "lleditmenuhandler.h"
#include "lluictrl.h"
+#include "lluiimage.h"
#include "lluistring.h"
#include "llviewborder.h"
@@ -59,7 +60,7 @@ public:
typedef boost::function<void (LLLineEditor* caller)> keystroke_callback_t;
- struct MaxLength : public LLInitParam::Choice<MaxLength>
+ struct MaxLength : public LLInitParam::ChoiceBlock<MaxLength>
{
Alternative<S32> bytes, chars;
@@ -75,6 +76,7 @@ public:
Optional<keystroke_callback_t> keystroke_callback;
Optional<LLTextValidate::validate_func_t, LLTextValidate::ValidateTextNamedFuncs> prevalidate_callback;
+ Optional<LLTextValidate::validate_func_t, LLTextValidate::ValidateTextNamedFuncs> prevalidate_input_callback;
Optional<LLViewBorder::Params> border;
@@ -85,7 +87,8 @@ public:
Optional<bool> select_on_focus,
revert_on_esc,
commit_on_focus_lost,
- ignore_tab;
+ ignore_tab,
+ is_password;
// colors
Optional<LLUIColor> cursor_color,
@@ -200,6 +203,7 @@ public:
const LLColor4& getTentativeFgColor() const { return mTentativeFgColor.get(); }
const LLFontGL* getFont() const { return mGLFont; }
+ void setFont(const LLFontGL* font);
void setIgnoreArrowKeys(BOOL b) { mIgnoreArrowKeys = b; }
void setIgnoreTab(BOOL b) { mIgnoreTab = b; }
@@ -217,6 +221,7 @@ public:
void deleteSelection();
void setSelectAllonFocusReceived(BOOL b);
+ void setSelectAllonCommit(BOOL b) { mSelectAllonCommit = b; }
typedef boost::function<void (LLLineEditor* caller, void* user_data)> callback_t;
void setKeystrokeCallback(callback_t callback, void* user_data);
@@ -229,8 +234,16 @@ public:
// Prevalidation controls which keystrokes can affect the editor
void setPrevalidate( LLTextValidate::validate_func_t func );
+ // This method sets callback that prevents from:
+ // - deleting, selecting, typing, cutting, pasting characters that are not valid.
+ // Also callback that this method sets differs from setPrevalidate in a way that it validates just inputed
+ // symbols, before existing text is modified, but setPrevalidate validates line after it was modified.
+ void setPrevalidateInput(LLTextValidate::validate_func_t func);
static BOOL postvalidateFloat(const std::string &str);
+ bool prevalidateInput(const LLWString& wstr);
+ BOOL evaluateFloat();
+
// line history support:
void setEnableLineHistory( BOOL enabled ) { mHaveHistory = enabled; } // switches line history on or off
void updateHistory(); // stores current line in history
@@ -248,6 +261,7 @@ private:
void addChar(const llwchar c);
void setCursorAtLocalPos(S32 local_mouse_x);
S32 findPixelNearestPos(S32 cursor_offset = 0) const;
+ S32 calcCursorPos(S32 mouse_x);
BOOL handleSpecialKey(KEY key, MASK mask);
BOOL handleSelectionKey(KEY key, MASK mask);
BOOL handleControlKey(KEY key, MASK mask);
@@ -309,6 +323,7 @@ protected:
S32 mLastSelectionEnd;
LLTextValidate::validate_func_t mPrevalidateFunc;
+ LLTextValidate::validate_func_t mPrevalidateInputFunc;
LLFrameTimer mKeystrokeTimer;
LLTimer mTripleClickTimer;
@@ -327,6 +342,7 @@ protected:
BOOL mDrawAsterixes;
BOOL mSelectAllonFocusReceived;
+ BOOL mSelectAllonCommit;
BOOL mPassDelete;
BOOL mReadOnly;
@@ -336,7 +352,7 @@ protected:
std::vector<S32> mPreeditPositions;
LLPreeditor::standouts_t mPreeditStandouts;
- LLHandle<LLView> mContextMenuHandle;
+ LLHandle<LLContextMenu> mContextMenuHandle;
private:
// Instances that by default point to the statics but can be overidden in XML.
diff --git a/indra/llui/llloadingindicator.cpp b/indra/llui/llloadingindicator.cpp
index 7b29d92ea0..6ac38f5ad4 100644
--- a/indra/llui/llloadingindicator.cpp
+++ b/indra/llui/llloadingindicator.cpp
@@ -34,61 +34,28 @@
// Project includes
#include "lluictrlfactory.h"
#include "lluiimage.h"
+#include "boost/foreach.hpp"
// registered in llui.cpp to avoid being left out by MS linker
//static LLDefaultChildRegistry::Register<LLLoadingIndicator> r("loading_indicator");
///////////////////////////////////////////////////////////////////////////////
-// LLLoadingIndicator::Data class
+// LLLoadingIndicator class
///////////////////////////////////////////////////////////////////////////////
-/**
- * Pre-loaded images shared by all instances of the widget
- */
-class LLLoadingIndicator::Data: public LLSingleton<LLLoadingIndicator::Data>
+LLLoadingIndicator::LLLoadingIndicator(const Params& p)
+: LLUICtrl(p),
+ mImagesPerSec(p.images_per_sec > 0 ? p.images_per_sec : 1.0f),
+ mCurImageIdx(0)
{
-public:
- /*virtual*/ void initSingleton(); // from LLSingleton
-
- LLPointer<LLUIImage> getNextImage(S8& idx) const;
- U8 getImagesCount() const { return NIMAGES; }
-private:
-
- static const U8 NIMAGES = 12;
- LLPointer<LLUIImage> mImages[NIMAGES];
-};
+}
-// virtual
-// Called right after the instance gets constructed.
-void LLLoadingIndicator::Data::initSingleton()
+void LLLoadingIndicator::initFromParams(const Params& p)
{
- // Load images.
- for (U8 i = 0; i < NIMAGES; ++i)
+ BOOST_FOREACH(LLUIImage* image, p.images.image)
{
- std::string img_name = llformat("Progress_%d", i+1);
- mImages[i] = LLUI::getUIImage(img_name, 0);
- llassert(mImages[i]);
+ mImages.push_back(image);
}
-}
-
-LLPointer<LLUIImage> LLLoadingIndicator::Data::getNextImage(S8& idx) const
-{
- // Calculate next index, performing array bounds checking.
- idx = (idx >= NIMAGES || idx < 0) ? 0 : (idx + 1) % NIMAGES;
- return mImages[idx];
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// LLLoadingIndicator class
-///////////////////////////////////////////////////////////////////////////////
-
-LLLoadingIndicator::LLLoadingIndicator(const Params& p)
-: LLUICtrl(p)
- , mRotationsPerSec(p.rotations_per_sec > 0 ? p.rotations_per_sec : 1.0f)
- , mCurImageIdx(-1)
-{
- // Select initial image.
- mCurImagep = Data::instance().getNextImage(mCurImageIdx);
// Start timer for switching images.
start();
@@ -100,16 +67,21 @@ void LLLoadingIndicator::draw()
if (mImageSwitchTimer.getStarted() && mImageSwitchTimer.hasExpired())
{
// Switch to the next image.
- mCurImagep = Data::instance().getNextImage(mCurImageIdx);
+ if (!mImages.empty())
+ {
+ mCurImageIdx = (mCurImageIdx + 1) % mImages.size();
+ }
// Restart timer.
start();
}
+ LLUIImagePtr cur_image = mImages.empty() ? LLUIImagePtr(NULL) : mImages[mCurImageIdx];
+
// Draw current image.
- if( mCurImagep.notNull() )
+ if( cur_image.notNull() )
{
- mCurImagep->draw(getLocalRect(), LLColor4::white % getDrawContext().mAlpha);
+ cur_image->draw(getLocalRect(), LLColor4::white % getDrawContext().mAlpha);
}
LLUICtrl::draw();
@@ -123,6 +95,6 @@ void LLLoadingIndicator::stop()
void LLLoadingIndicator::start()
{
mImageSwitchTimer.start();
- F32 period = 1.0f / (Data::instance().getImagesCount() * mRotationsPerSec);
+ F32 period = 1.0f / (mImages.size() * mImagesPerSec);
mImageSwitchTimer.setTimerExpirySec(period);
}
diff --git a/indra/llui/llloadingindicator.h b/indra/llui/llloadingindicator.h
index 4e4a224ef6..c1f979c111 100644
--- a/indra/llui/llloadingindicator.h
+++ b/indra/llui/llloadingindicator.h
@@ -28,6 +28,7 @@
#define LL_LLLOADINGINDICATOR_H
#include "lluictrl.h"
+#include "lluiimage.h"
///////////////////////////////////////////////////////////////////////////////
// class LLLoadingIndicator
@@ -36,8 +37,8 @@
/**
* Perpetual loading indicator (a la MacOSX or YouTube)
*
- * Number of rotations per second can be overriden
- * with the "roations_per_sec" parameter.
+ * Number of rotations per second can be overridden
+ * with the "images_per_sec" parameter.
*
* Can start/stop spinning.
*
@@ -49,11 +50,24 @@ class LLLoadingIndicator
{
LOG_CLASS(LLLoadingIndicator);
public:
+
+ struct Images : public LLInitParam::BatchBlock<Images>
+ {
+ Multiple<LLUIImage*> image;
+
+ Images()
+ : image("image")
+ {}
+ };
+
struct Params : public LLInitParam::Block<Params, LLUICtrl::Params>
{
- Optional<F32> rotations_per_sec;
+ Optional<F32> images_per_sec;
+ Optional<Images> images;
+
Params()
- : rotations_per_sec("rotations_per_sec", 1.0f)
+ : images_per_sec("images_per_sec", 1.0f),
+ images("images")
{}
};
@@ -72,16 +86,19 @@ public:
*/
void start();
+ void reset() { mCurImageIdx = 0; }
+
private:
LLLoadingIndicator(const Params&);
- friend class LLUICtrlFactory;
+ void initFromParams(const Params&);
- class Data;
+ friend class LLUICtrlFactory;
- F32 mRotationsPerSec;
+ F32 mImagesPerSec;
S8 mCurImageIdx;
- LLPointer<LLUIImage> mCurImagep;
LLFrameTimer mImageSwitchTimer;
+
+ std::vector<LLUIImagePtr> mImages;
};
#endif // LL_LLLOADINGINDICATOR_H
diff --git a/indra/llui/llmenubutton.cpp b/indra/llui/llmenubutton.cpp
index ac568a83e4..50d59f79f4 100644
--- a/indra/llui/llmenubutton.cpp
+++ b/indra/llui/llmenubutton.cpp
@@ -35,9 +35,16 @@
static LLDefaultChildRegistry::Register<LLMenuButton> r("menu_button");
+void LLMenuButton::MenuPositions::declareValues()
+{
+ declare("topleft", MP_TOP_LEFT);
+ declare("topright", MP_TOP_RIGHT);
+ declare("bottomleft", MP_BOTTOM_LEFT);
+}
LLMenuButton::Params::Params()
-: menu_filename("menu_filename")
+: menu_filename("menu_filename"),
+ position("position", MP_BOTTOM_LEFT)
{
}
@@ -45,7 +52,7 @@ LLMenuButton::Params::Params()
LLMenuButton::LLMenuButton(const LLMenuButton::Params& p)
: LLButton(p),
mIsMenuShown(false),
- mMenuPosition(MP_BOTTOM_LEFT)
+ mMenuPosition(p.position)
{
std::string menu_filename = p.menu_filename;
@@ -175,6 +182,13 @@ void LLMenuButton::updateMenuOrigin()
mY = rect.mTop + mMenuHandle.get()->getRect().getHeight();
break;
}
+ case MP_TOP_RIGHT:
+ {
+ const LLRect& menu_rect = mMenuHandle.get()->getRect();
+ mX = rect.mRight - menu_rect.getWidth();
+ mY = rect.mTop + menu_rect.getHeight();
+ break;
+ }
case MP_BOTTOM_LEFT:
{
mX = rect.mLeft;
diff --git a/indra/llui/llmenubutton.h b/indra/llui/llmenubutton.h
index 9e91b9e99d..e2396e7fb2 100644
--- a/indra/llui/llmenubutton.h
+++ b/indra/llui/llmenubutton.h
@@ -35,20 +35,30 @@ class LLMenuButton
: public LLButton
{
public:
+ typedef enum e_menu_position
+ {
+ MP_TOP_LEFT,
+ MP_TOP_RIGHT,
+ MP_BOTTOM_LEFT
+ } EMenuPosition;
+
+ struct MenuPositions
+ : public LLInitParam::TypeValuesHelper<EMenuPosition, MenuPositions>
+ {
+ static void declareValues();
+ };
+
struct Params
: public LLInitParam::Block<Params, LLButton::Params>
{
// filename for it's toggleable menu
Optional<std::string> menu_filename;
+ Optional<EMenuPosition> position;
Params();
};
- typedef enum e_menu_position
- {
- MP_TOP_LEFT,
- MP_BOTTOM_LEFT
- } EMenuPosition;
+
boost::signals2::connection setMouseDownCallback( const mouse_signal_t::slot_type& cb );
diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp
index a6cf86d9b8..ff6928ffda 100644
--- a/indra/llui/llmenugl.cpp
+++ b/indra/llui/llmenugl.cpp
@@ -90,7 +90,6 @@ const S32 TEAROFF_SEPARATOR_HEIGHT_PIXELS = 10;
const S32 MENU_ITEM_PADDING = 4;
const std::string SEPARATOR_NAME("separator");
-const std::string SEPARATOR_LABEL( "-----------" );
const std::string VERTICAL_SEPARATOR_LABEL( "|" );
const std::string LLMenuGL::BOOLEAN_TRUE_PREFIX( "\xE2\x9C\x94" ); // U+2714 HEAVY CHECK MARK
@@ -149,7 +148,7 @@ LLMenuItemGL::Params::Params()
highlight_bg_color("highlight_bg_color"),
highlight_fg_color("highlight_fg_color")
{
- mouse_opaque = true;
+ changeDefault(mouse_opaque, true);
}
// Default constructor
@@ -318,7 +317,7 @@ void LLMenuItemGL::setJumpKey(KEY key)
// virtual
U32 LLMenuItemGL::getNominalHeight( void ) const
{
- return llround(mFont->getLineHeight()) + MENU_ITEM_PADDING;
+ return mFont->getLineHeight() + MENU_ITEM_PADDING;
}
//virtual
@@ -509,19 +508,19 @@ void LLMenuItemGL::draw( void )
{
if( !mDrawBoolLabel.empty() )
{
- mFont->render( mDrawBoolLabel.getWString(), 0, (F32)LEFT_PAD_PIXELS, ((F32)MENU_ITEM_PADDING / 2.f) + 1.f, color,
+ mFont->render( mDrawBoolLabel.getWString(), 0, (F32)LEFT_PAD_PIXELS, ((F32)MENU_ITEM_PADDING / 2.f), color,
LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE );
}
- mFont->render( mLabel.getWString(), 0, (F32)LEFT_PLAIN_PIXELS, ((F32)MENU_ITEM_PADDING / 2.f) + 1.f, color,
+ mFont->render( mLabel.getWString(), 0, (F32)LEFT_PLAIN_PIXELS, ((F32)MENU_ITEM_PADDING / 2.f), color,
LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE );
if( !mDrawAccelLabel.empty() )
{
- mFont->render( mDrawAccelLabel.getWString(), 0, (F32)getRect().mRight - (F32)RIGHT_PLAIN_PIXELS, ((F32)MENU_ITEM_PADDING / 2.f) + 1.f, color,
+ mFont->render( mDrawAccelLabel.getWString(), 0, (F32)getRect().mRight - (F32)RIGHT_PLAIN_PIXELS, ((F32)MENU_ITEM_PADDING / 2.f), color,
LLFontGL::RIGHT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE );
}
if( !mDrawBranchLabel.empty() )
{
- mFont->render( mDrawBranchLabel.getWString(), 0, (F32)getRect().mRight - (F32)RIGHT_PAD_PIXELS, ((F32)MENU_ITEM_PADDING / 2.f) + 1.f, color,
+ mFont->render( mDrawBranchLabel.getWString(), 0, (F32)getRect().mRight - (F32)RIGHT_PAD_PIXELS, ((F32)MENU_ITEM_PADDING / 2.f), color,
LLFontGL::RIGHT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE );
}
}
@@ -566,8 +565,6 @@ void LLMenuItemGL::handleVisibilityChange(BOOL new_visibility)
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
LLMenuItemSeparatorGL::Params::Params()
{
- name = "separator";
- label = SEPARATOR_LABEL;
}
LLMenuItemSeparatorGL::LLMenuItemSeparatorGL(const LLMenuItemSeparatorGL::Params& p) :
@@ -755,30 +752,6 @@ U32 LLMenuItemTearOffGL::getNominalHeight( void ) const
return TEAROFF_SEPARATOR_HEIGHT_PIXELS;
}
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLMenuItemBlankGL
-//
-// This class represents a blank, non-functioning item.
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-class LLMenuItemBlankGL : public LLMenuItemGL
-{
-public:
- struct Params : public LLInitParam::Block<Params, LLMenuItemGL::Params>
- {
- Params()
- {
- name="";
- enabled = false;
- }
- };
- LLMenuItemBlankGL( const Params& p ) : LLMenuItemGL( p )
- {}
- virtual void draw( void ) {}
-};
-
-
///============================================================================
/// Class LLMenuItemCallGL
///============================================================================
@@ -974,9 +947,14 @@ LLMenuItemBranchGL::LLMenuItemBranchGL(const LLMenuItemBranchGL::Params& p)
LLMenuItemBranchGL::~LLMenuItemBranchGL()
{
- LLView::deleteViewByHandle(mBranchHandle);
+ if (mBranchHandle.get())
+ {
+ mBranchHandle.get()->die();
+ }
}
+
+
// virtual
LLView* LLMenuItemBranchGL::getChildView(const std::string& name, BOOL recurse) const
{
@@ -1462,7 +1440,7 @@ BOOL LLMenuItemBranchDownGL::handleAcceleratorKey(KEY key, MASK mask)
{
BOOL branch_visible = getBranch()->getVisible();
BOOL handled = getBranch()->handleAcceleratorKey(key, mask);
- if (handled && !branch_visible && getVisible())
+ if (handled && !branch_visible && isInVisibleChain())
{
// flash this menu entry because we triggered an invisible menu item
LLMenuHolderGL::setActivatedItem(this);
@@ -1637,6 +1615,10 @@ LLMenuScrollItem::LLMenuScrollItem(const Params& p)
}
LLButton::Params bparams;
+
+ // Disabled the Return key handling by LLMenuScrollItem instead of
+ // passing the key press to the currently selected menu item. See STORM-385.
+ bparams.commit_on_return(false);
bparams.mouse_opaque(true);
bparams.scale_image(false);
bparams.click_callback(p.scroll_callback);
@@ -1709,7 +1691,8 @@ LLMenuGL::LLMenuGL(const LLMenuGL::Params& p)
mSpilloverMenu(NULL),
mJumpKey(p.jump_key),
mCreateJumpKeys(p.create_jump_keys),
- mNeedsArrange(FALSE),
+ mNeedsArrange(FALSE),
+ mResetScrollPositionOnShow(true),
mShortcutPad(p.shortcut_pad)
{
typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
@@ -1754,7 +1737,7 @@ void LLMenuGL::setCanTearOff(BOOL tear_off)
{
LLMenuItemTearOffGL::Params p;
mTearOffItem = LLUICtrlFactory::create<LLMenuItemTearOffGL>(p);
- addChildInBack(mTearOffItem);
+ addChild(mTearOffItem);
}
else if (!tear_off && mTearOffItem != NULL)
{
@@ -1932,9 +1915,15 @@ bool LLMenuGL::scrollItems(EScrollingDirection direction)
{
item_list_t::reverse_iterator first_visible_item_iter = mItems.rend();
+ // Need to scroll through number of actual existing items in menu.
+ // Otherwise viewer will hang for a time needed to scroll U32_MAX
+ // times in std::advance(). STORM-659.
+ size_t nitems = mItems.size();
+ U32 scrollable_items = nitems < mMaxScrollableItems ? nitems : mMaxScrollableItems;
+
// Advance by mMaxScrollableItems back from the end of the list
// to make the last item visible.
- std::advance(first_visible_item_iter, mMaxScrollableItems);
+ std::advance(first_visible_item_iter, scrollable_items);
mFirstVisibleItem = *first_visible_item_iter;
break;
}
@@ -1977,7 +1966,7 @@ void LLMenuGL::arrange( void )
// *FIX: create the item first and then ask for its dimensions?
S32 spillover_item_width = PLAIN_PAD_PIXELS + LLFontGL::getFontSansSerif()->getWidth( std::string("More") ); // *TODO: Translate
- S32 spillover_item_height = llround(LLFontGL::getFontSansSerif()->getLineHeight()) + MENU_ITEM_PADDING;
+ S32 spillover_item_height = LLFontGL::getFontSansSerif()->getLineHeight() + MENU_ITEM_PADDING;
// Scrolling support
item_list_t::iterator first_visible_item_iter;
@@ -2611,6 +2600,7 @@ LLMenuItemGL* LLMenuGL::getHighlightedItem()
LLMenuItemGL* LLMenuGL::highlightNextItem(LLMenuItemGL* cur_item, BOOL skip_disabled)
{
+ if (mItems.empty()) return NULL;
// highlighting first item on a torn off menu is the
// same as giving focus to it
if (!cur_item && getTornOff())
@@ -2711,6 +2701,8 @@ LLMenuItemGL* LLMenuGL::highlightNextItem(LLMenuItemGL* cur_item, BOOL skip_disa
LLMenuItemGL* LLMenuGL::highlightPrevItem(LLMenuItemGL* cur_item, BOOL skip_disabled)
{
+ if (mItems.empty()) return NULL;
+
// highlighting first item on a torn off menu is the
// same as giving focus to it
if (!cur_item && getTornOff())
@@ -3045,6 +3037,11 @@ void LLMenuGL::showPopup(LLView* spawning_view, LLMenuGL* menu, S32 x, S32 y)
const S32 CURSOR_HEIGHT = 22; // Approximate "normal" cursor size
const S32 CURSOR_WIDTH = 12;
+ if(menu->getChildList()->empty())
+ {
+ return;
+ }
+
// Save click point for detecting cursor moves before mouse-up.
// Must be in local coords to compare with mouseUp events.
// If the mouse doesn't move, the menu will stay open ala the Mac.
@@ -3052,7 +3049,7 @@ void LLMenuGL::showPopup(LLView* spawning_view, LLMenuGL* menu, S32 x, S32 y)
S32 mouse_x, mouse_y;
// Resetting scrolling position
- if (menu->isScrollable())
+ if (menu->isScrollable() && menu->isScrollPositionOnShowReset())
{
menu->mFirstVisibleItem = NULL;
}
@@ -3085,11 +3082,8 @@ void LLMenuGL::showPopup(LLView* spawning_view, LLMenuGL* menu, S32 x, S32 y)
mouse_y + MOUSE_CURSOR_PADDING,
CURSOR_WIDTH + MOUSE_CURSOR_PADDING * 2,
CURSOR_HEIGHT + MOUSE_CURSOR_PADDING * 2);
- menu->translateIntoRectWithExclusion( menu_region_rect, mouse_rect, FALSE );
+ menu->translateIntoRectWithExclusion( menu_region_rect, mouse_rect );
menu->getParent()->sendChildToFront(menu);
-
-
-
}
///============================================================================
@@ -3125,7 +3119,10 @@ BOOL LLMenuBarGL::handleAcceleratorKey(KEY key, MASK mask)
mAltKeyTrigger = FALSE;
}
- if(!result && (key == KEY_F10 && mask == MASK_CONTROL) && !gKeyboard->getKeyRepeated(key))
+ if(!result
+ && (key == KEY_F10 && mask == MASK_CONTROL)
+ && !gKeyboard->getKeyRepeated(key)
+ && isInVisibleChain())
{
if (getHighlightedItem())
{
@@ -3428,7 +3425,7 @@ void LLMenuHolderGL::draw()
LLUI::pushMatrix();
{
- LLUI::translate((F32)item_rect.mLeft, (F32)item_rect.mBottom, 0.f);
+ LLUI::translate((F32)item_rect.mLeft, (F32)item_rect.mBottom);
selecteditem->getMenu()->drawBackground(selecteditem, interpolant);
selecteditem->draw();
}
@@ -3508,8 +3505,10 @@ BOOL LLMenuHolderGL::handleKey(KEY key, MASK mask, BOOL called_from_parent)
else
{
//highlight first enabled one
- pMenu->highlightNextItem(NULL);
- handled = true;
+ if(pMenu->highlightNextItem(NULL))
+ {
+ handled = true;
+ }
}
}
}
@@ -3742,9 +3741,7 @@ public:
LLContextMenuBranch(const Params&);
virtual ~LLContextMenuBranch()
- {
- delete mBranch;
- }
+ {}
// called to rebuild the draw label
virtual void buildDrawLabel( void );
@@ -3752,21 +3749,21 @@ public:
// onCommit() - do the primary funcationality of the menu item.
virtual void onCommit( void );
- LLContextMenu* getBranch() { return mBranch; }
+ LLContextMenu* getBranch() { return mBranch.get(); }
void setHighlight( BOOL highlight );
protected:
void showSubMenu();
- LLContextMenu* mBranch;
+ LLHandle<LLContextMenu> mBranch;
};
LLContextMenuBranch::LLContextMenuBranch(const LLContextMenuBranch::Params& p)
: LLMenuItemGL(p),
- mBranch( p.branch )
+ mBranch( p.branch()->getHandle() )
{
- mBranch->hide();
- mBranch->setParentMenuItem(this);
+ mBranch.get()->hide();
+ mBranch.get()->setParentMenuItem(this);
}
// called to rebuild the draw label
@@ -3775,12 +3772,12 @@ void LLContextMenuBranch::buildDrawLabel( void )
{
// default enablement is this -- if any of the subitems are
// enabled, this item is enabled. JC
- U32 sub_count = mBranch->getItemCount();
+ U32 sub_count = mBranch.get()->getItemCount();
U32 i;
BOOL any_enabled = FALSE;
for (i = 0; i < sub_count; i++)
{
- LLMenuItemGL* item = mBranch->getItem(i);
+ LLMenuItemGL* item = mBranch.get()->getItem(i);
item->buildDrawLabel();
if (item->getEnabled() && !item->getDrawTextDisabled() )
{
@@ -3802,13 +3799,13 @@ void LLContextMenuBranch::buildDrawLabel( void )
void LLContextMenuBranch::showSubMenu()
{
- LLMenuItemGL* menu_item = mBranch->getParentMenuItem();
+ LLMenuItemGL* menu_item = mBranch.get()->getParentMenuItem();
if (menu_item != NULL && menu_item->getVisible())
{
S32 center_x;
S32 center_y;
localPointToScreen(getRect().getWidth(), getRect().getHeight() , &center_x, &center_y);
- mBranch->show(center_x, center_y);
+ mBranch.get()->show(center_x, center_y);
}
}
@@ -3828,7 +3825,7 @@ void LLContextMenuBranch::setHighlight( BOOL highlight )
}
else
{
- mBranch->hide();
+ mBranch.get()->hide();
}
}
@@ -3859,6 +3856,11 @@ void LLContextMenu::setVisible(BOOL visible)
// Takes cursor position in screen space?
void LLContextMenu::show(S32 x, S32 y)
{
+ if (getChildList()->empty())
+ {
+ // nothing to show, so abort
+ return;
+ }
// Save click point for detecting cursor moves before mouse-up.
// Must be in local coords to compare with mouseUp events.
// If the mouse doesn't move, the menu will stay open ala the Mac.
diff --git a/indra/llui/llmenugl.h b/indra/llui/llmenugl.h
index 35544402f4..36f3ba34b9 100644
--- a/indra/llui/llmenugl.h
+++ b/indra/llui/llmenugl.h
@@ -372,17 +372,16 @@ public:
drop_shadow("drop_shadow", true),
bg_visible("bg_visible", true),
create_jump_keys("create_jump_keys", false),
+ keep_fixed_size("keep_fixed_size", false),
bg_color("bg_color", LLUIColorTable::instance().getColor( "MenuDefaultBgColor" )),
scrollable("scrollable", false),
max_scrollable_items("max_scrollable_items", U32_MAX),
preferred_width("preferred_width", U32_MAX),
shortcut_pad("shortcut_pad")
-
{
addSynonym(bg_visible, "opaque");
addSynonym(bg_color, "color");
-
- name = "menu";
+ addSynonym(can_tear_off, "can_tear_off");
}
};
@@ -517,6 +516,9 @@ public:
static class LLMenuHolderGL* sMenuContainer;
+ void resetScrollPositionOnShow(bool reset_scroll_pos) { mResetScrollPositionOnShow = reset_scroll_pos; }
+ bool isScrollPositionOnShowReset() { return mResetScrollPositionOnShow; }
+
protected:
void createSpilloverBranch();
void cleanupSpilloverBranch();
@@ -566,6 +568,7 @@ private:
KEY mJumpKey;
BOOL mCreateJumpKeys;
S32 mShortcutPad;
+ bool mResetScrollPositionOnShow;
}; // end class LLMenuGL
@@ -650,7 +653,7 @@ public:
{
Params()
{
- visible = false;
+ changeDefault(visible, false);
}
};
@@ -678,9 +681,12 @@ public:
BOOL appendContextSubMenu(LLContextMenu *menu);
+ LLHandle<LLContextMenu> getHandle() { return getDerivedHandle<LLContextMenu>(); }
+
protected:
- BOOL mHoveredAnyItem;
- LLMenuItemGL* mHoverItem;
+ BOOL mHoveredAnyItem;
+ LLMenuItemGL* mHoverItem;
+ LLRootHandle<LLContextMenu> mHandle;
};
@@ -695,16 +701,7 @@ class LLMenuBarGL : public LLMenuGL
{
public:
struct Params : public LLInitParam::Block<Params, LLMenuGL::Params>
- {
- Params()
- {
- can_tear_off = false;
- keep_fixed_size = true;
- horizontal_layout = true;
- visible = true;
- drop_shadow = false;
- }
- };
+ {};
LLMenuBarGL( const Params& p );
virtual ~LLMenuBarGL();
@@ -822,13 +819,7 @@ class LLMenuItemTearOffGL : public LLMenuItemGL
{
public:
struct Params : public LLInitParam::Block<Params, LLMenuItemGL::Params>
- {
- Params()
- {
- name = "tear off";
- label = "~~~~~~~~~~~";
- }
- };
+ {};
LLMenuItemTearOffGL( const Params& );
diff --git a/indra/llui/llmultislider.cpp b/indra/llui/llmultislider.cpp
index d4e6091ee0..70bcfb5b4f 100644
--- a/indra/llui/llmultislider.cpp
+++ b/indra/llui/llmultislider.cpp
@@ -35,6 +35,7 @@
#include "llkeyboard.h" // for the MASK constants
#include "llcontrol.h"
#include "lluictrlfactory.h"
+#include "lluiimage.h"
#include <sstream>
@@ -65,11 +66,7 @@ LLMultiSlider::Params::Params()
mouse_up_callback("mouse_up_callback"),
thumb_width("thumb_width"),
sliders("slider")
-{
- name = "multi_slider_bar";
- mouse_opaque(true);
- follows.flags(FOLLOWS_LEFT | FOLLOWS_TOP);
-}
+{}
LLMultiSlider::LLMultiSlider(const LLMultiSlider::Params& p)
: LLF32UICtrl(p),
@@ -510,7 +507,7 @@ void LLMultiSlider::draw()
mIt->second.mTop + extra_triangle_height,
mIt->second.mLeft + mIt->second.getWidth() / 2,
mIt->second.mBottom - extra_triangle_height,
- mTriangleColor.get(), TRUE);
+ mTriangleColor.get() % opacity, TRUE);
}
}
else if (!thumb_imagep)
diff --git a/indra/llui/llnotifications.cpp b/indra/llui/llnotifications.cpp
index a3df6a3ced..8aa548b974 100644
--- a/indra/llui/llnotifications.cpp
+++ b/indra/llui/llnotifications.cpp
@@ -28,6 +28,7 @@
#include "llnotifications.h"
#include "llnotificationtemplate.h"
+#include "llnotificationvisibilityrule.h"
#include "llavatarnamecache.h"
#include "llinstantmessage.h"
@@ -45,6 +46,7 @@
#include <algorithm>
#include <boost/regex.hpp>
+#include <boost/foreach.hpp>
const std::string NOTIFICATION_PERSIST_VERSION = "0.93";
@@ -81,6 +83,7 @@ LLNotificationForm::FormButton::FormButton()
LLNotificationForm::FormInput::FormInput()
: type("type"),
+ text("text"),
max_length_chars("max_length_chars"),
width("width", 0),
value("value")
@@ -137,12 +140,6 @@ private:
bool filterIgnoredNotifications(LLNotificationPtr notification)
{
- // filter everything if we are to ignore ALL
- if(LLNotifications::instance().getIgnoreAllNotifications())
- {
- return false;
- }
-
LLNotificationFormPtr form = notification->getForm();
// Check to see if the user wants to ignore this alert
return !notification->getForm()->getIgnored();
@@ -177,6 +174,28 @@ bool handleIgnoredNotification(const LLSD& payload)
return false;
}
+bool defaultResponse(const LLSD& payload)
+{
+ if (payload["sigtype"].asString() == "add")
+ {
+ LLNotificationPtr pNotif = LLNotifications::instance().find(payload["id"].asUUID());
+ if (pNotif)
+ {
+ // supply default response
+ pNotif->respond(pNotif->getResponseTemplate(LLNotification::WITH_DEFAULT_BUTTON));
+ }
+ }
+ return false;
+}
+
+bool visibilityRuleMached(const LLSD& payload)
+{
+ // This is needed because LLNotifications::isVisibleByRules may have cancelled the notification.
+ // Returning true here makes LLNotificationChannelBase::updateItem do an early out, which prevents things from happening in the wrong order.
+ return true;
+}
+
+
namespace LLNotificationFilters
{
// a sample filter
@@ -227,7 +246,6 @@ LLNotificationForm::LLNotificationForm(const std::string& name, const LLNotifica
LLParamSDParser parser;
parser.writeSD(mFormData, p.form_elements);
- mFormData = mFormData[""];
if (!mFormData.isArray())
{
// change existing contents to a one element array
@@ -399,17 +417,48 @@ LLNotificationTemplate::LLNotificationTemplate(const LLNotificationTemplate::Par
mSoundEffect = LLUUID(LLUI::sSettingGroups["config"]->getString(p.sound));
}
- for(LLInitParam::ParamIterator<LLNotificationTemplate::UniquenessContext>::const_iterator it = p.unique.contexts.begin(),
- end_it = p.unique.contexts.end();
- it != end_it;
- ++it)
+ BOOST_FOREACH(const LLNotificationTemplate::UniquenessContext& context, p.unique.contexts)
+ {
+ mUniqueContext.push_back(context.value);
+ }
+
+ lldebugs << "notification \"" << mName << "\": tag count is " << p.tags.size() << llendl;
+
+ BOOST_FOREACH(const LLNotificationTemplate::Tag& tag, p.tags)
{
- mUniqueContext.push_back(it->key);
+ lldebugs << " tag \"" << std::string(tag.value) << "\"" << llendl;
+ mTags.push_back(tag.value);
}
mForm = LLNotificationFormPtr(new LLNotificationForm(p.name, p.form_ref.form));
}
+LLNotificationVisibilityRule::LLNotificationVisibilityRule(const LLNotificationVisibilityRule::Rule &p)
+{
+ if (p.show.isChosen())
+ {
+ mType = p.show.type;
+ mTag = p.show.tag;
+ mName = p.show.name;
+ mVisible = true;
+ }
+ else if (p.hide.isChosen())
+ {
+ mType = p.hide.type;
+ mTag = p.hide.tag;
+ mName = p.hide.name;
+ mVisible = false;
+ }
+ else if (p.respond.isChosen())
+ {
+ mType = p.respond.type;
+ mTag = p.respond.tag;
+ mName = p.respond.name;
+ mVisible = false;
+ mResponse = p.respond.response;
+ }
+}
+
LLNotification::LLNotification(const LLNotification::Params& p) :
mTimestamp(p.time_stamp),
mSubstitutions(p.substitutions),
@@ -679,6 +728,25 @@ bool LLNotification::hasUniquenessConstraints() const
return (mTemplatep ? mTemplatep->mUnique : false);
}
+bool LLNotification::matchesTag(const std::string& tag)
+{
+ bool result = false;
+
+ if(mTemplatep)
+ {
+ std::list<std::string>::iterator it;
+ for(it = mTemplatep->mTags.begin(); it != mTemplatep->mTags.end(); it++)
+ {
+ if((*it) == tag)
+ {
+ result = true;
+ break;
+ }
+ }
+ }
+
+ return result;
+}
void LLNotification::setIgnored(bool ignore)
{
@@ -719,13 +787,19 @@ bool LLNotification::isEquivalentTo(LLNotificationPtr that) const
{
const LLSD& these_substitutions = this->getSubstitutions();
const LLSD& those_substitutions = that->getSubstitutions();
+ const LLSD& this_payload = this->getPayload();
+ const LLSD& that_payload = that->getPayload();
// highlander bit sez there can only be one of these
for (std::vector<std::string>::const_iterator it = mTemplatep->mUniqueContext.begin(), end_it = mTemplatep->mUniqueContext.end();
it != end_it;
++it)
{
- if (these_substitutions.get(*it).asString() != those_substitutions.get(*it).asString())
+ // if templates differ in either substitution strings or payload with the given field name
+ // then they are considered inequivalent
+ // use of get() avoids converting the LLSD value to a map as the [] operator would
+ if (these_substitutions.get(*it).asString() != those_substitutions.get(*it).asString()
+ || this_payload.get(*it).asString() != that_payload.get(*it).asString())
{
return false;
}
@@ -1064,12 +1138,12 @@ std::string LLNotificationChannel::summarize()
// LLNotifications implementation
// ---
LLNotifications::LLNotifications() : LLNotificationChannelBase(LLNotificationFilters::includeEverything,
- LLNotificationComparators::orderByUUID()),
- mIgnoreAllNotifications(false)
+ LLNotificationComparators::orderByUUID()),
+ mIgnoreAllNotifications(false)
{
LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("Notification.Show", boost::bind(&LLNotifications::addFromCallback, this, _2));
-
- mListener.reset(new LLNotificationsListener(*this));
+
+ mListener.reset(new LLNotificationsListener(*this));
}
@@ -1115,16 +1189,18 @@ bool LLNotifications::uniqueFilter(LLNotificationPtr pNotif)
bool LLNotifications::uniqueHandler(const LLSD& payload)
{
+ std::string cmd = payload["sigtype"];
+
LLNotificationPtr pNotif = LLNotifications::instance().find(payload["id"].asUUID());
if (pNotif && pNotif->hasUniquenessConstraints())
{
- if (payload["sigtype"].asString() == "add")
+ if (cmd == "add")
{
// not a duplicate according to uniqueness criteria, so we keep it
// and store it for future uniqueness checks
mUniqueNotifications.insert(std::make_pair(pNotif->getName(), pNotif));
}
- else if (payload["sigtype"].asString() == "delete")
+ else if (cmd == "delete")
{
mUniqueNotifications.erase(pNotif->getName());
}
@@ -1137,12 +1213,16 @@ bool LLNotifications::failedUniquenessTest(const LLSD& payload)
{
LLNotificationPtr pNotif = LLNotifications::instance().find(payload["id"].asUUID());
- if (!pNotif || !pNotif->hasUniquenessConstraints())
+ std::string cmd = payload["sigtype"];
+
+ if (!pNotif || cmd != "add")
{
return false;
}
- // checks against existing unique notifications
+ // Update the existing unique notification with the data from this particular instance...
+ // This guarantees that duplicate notifications will be collapsed to the one
+ // most recently triggered
for (LLNotificationMap::iterator existing_it = mUniqueNotifications.find(pNotif->getName());
existing_it != mUniqueNotifications.end();
++existing_it)
@@ -1155,7 +1235,7 @@ bool LLNotifications::failedUniquenessTest(const LLSD& payload)
// of this unique notification and update it
existing_notification->updateFrom(pNotif);
// then delete the new one
- pNotif->cancel();
+ cancel(pNotif);
}
}
@@ -1184,6 +1264,7 @@ LLNotificationChannelPtr LLNotifications::getChannel(const std::string& channelN
void LLNotifications::initSingleton()
{
loadTemplates();
+ loadVisibilityRules();
createDefaultChannels();
}
@@ -1191,15 +1272,19 @@ void LLNotifications::createDefaultChannels()
{
// now construct the various channels AFTER loading the notifications,
// because the history channel is going to rewrite the stored notifications file
- LLNotificationChannel::buildChannel("Expiration", "",
+ LLNotificationChannel::buildChannel("Enabled", "",
+ !boost::bind(&LLNotifications::getIgnoreAllNotifications, this));
+ LLNotificationChannel::buildChannel("Expiration", "Enabled",
boost::bind(&LLNotifications::expirationFilter, this, _1));
- LLNotificationChannel::buildChannel("Unexpired", "",
+ LLNotificationChannel::buildChannel("Unexpired", "Enabled",
!boost::bind(&LLNotifications::expirationFilter, this, _1)); // use negated bind
LLNotificationChannel::buildChannel("Unique", "Unexpired",
boost::bind(&LLNotifications::uniqueFilter, this, _1));
LLNotificationChannel::buildChannel("Ignore", "Unique",
filterIgnoredNotifications);
- LLNotificationChannel::buildChannel("Visible", "Ignore",
+ LLNotificationChannel::buildChannel("VisibilityRules", "Ignore",
+ boost::bind(&LLNotifications::isVisibleByRules, this, _1));
+ LLNotificationChannel::buildChannel("Visible", "VisibilityRules",
&LLNotificationFilters::includeEverything);
// create special persistent notification channel
@@ -1207,30 +1292,22 @@ void LLNotifications::createDefaultChannels()
new LLPersistentNotificationChannel();
// connect action methods to these channels
+ LLNotifications::instance().getChannel("Enabled")->
+ connectFailedFilter(&defaultResponse);
LLNotifications::instance().getChannel("Expiration")->
connectChanged(boost::bind(&LLNotifications::expirationHandler, this, _1));
// uniqueHandler slot should be added as first slot of the signal due to
// usage LLStopWhenHandled combiner in LLStandardSignal
LLNotifications::instance().getChannel("Unique")->
connectAtFrontChanged(boost::bind(&LLNotifications::uniqueHandler, this, _1));
-// failedUniquenessTest slot isn't necessary
-// LLNotifications::instance().getChannel("Unique")->
-// connectFailedFilter(boost::bind(&LLNotifications::failedUniquenessTest, this, _1));
+ LLNotifications::instance().getChannel("Unique")->
+ connectFailedFilter(boost::bind(&LLNotifications::failedUniquenessTest, this, _1));
LLNotifications::instance().getChannel("Ignore")->
connectFailedFilter(&handleIgnoredNotification);
+ LLNotifications::instance().getChannel("VisibilityRules")->
+ connectFailedFilter(&visibilityRuleMached);
}
-bool LLNotifications::addTemplate(const std::string &name,
- LLNotificationTemplatePtr theTemplate)
-{
- if (mTemplates.count(name))
- {
- llwarns << "LLNotifications -- attempted to add template '" << name << "' twice." << llendl;
- return false;
- }
- mTemplates[name] = theTemplate;
- return true;
-}
LLNotificationTemplatePtr LLNotifications::getTemplate(const std::string& name)
{
@@ -1278,7 +1355,6 @@ LLNotifications::TemplateNames LLNotifications::getTemplateNames() const
typedef std::map<std::string, std::string> StringMap;
void replaceSubstitutionStrings(LLXMLNodePtr node, StringMap& replacements)
{
- //llwarns << "replaceSubstitutionStrings" << llendl;
// walk the list of attributes looking for replacements
for (LLXMLAttribList::iterator it=node->mAttributes.begin();
it != node->mAttributes.end(); ++it)
@@ -1292,13 +1368,12 @@ void replaceSubstitutionStrings(LLXMLNodePtr node, StringMap& replacements)
if (found != replacements.end())
{
replacement = found->second;
- //llwarns << "replaceSubstituionStrings: value: " << value << " repl: " << replacement << llendl;
-
+ lldebugs << "replaceSubstitutionStrings: value: \"" << value << "\" repl: \"" << replacement << "\"." << llendl;
it->second->setValue(replacement);
}
else
{
- llwarns << "replaceSubstituionStrings FAILURE: value: " << value << " repl: " << replacement << llendl;
+ llwarns << "replaceSubstitutionStrings FAILURE: could not find replacement \"" << value << "\"." << llendl;
}
}
}
@@ -1317,80 +1392,124 @@ void replaceFormText(LLNotificationForm::Params& form, const std::string& patter
{
form.ignore.text = replace;
}
- for (LLInitParam::ParamIterator<LLNotificationForm::FormElement>::iterator it = form.form_elements.elements.begin(),
- end_it = form.form_elements.elements.end();
- it != end_it;
- ++it)
+
+ BOOST_FOREACH(LLNotificationForm::FormElement& element, form.form_elements.elements)
{
- if (it->button.isChosen() && it->button.text() == pattern)
+ if (element.button.isChosen() && element.button.text() == pattern)
{
- it->button.text = replace;
+ element.button.text = replace;
}
}
}
+void addPathIfExists(const std::string& new_path, std::vector<std::string>& paths)
+{
+ if (gDirUtilp->fileExists(new_path))
+ {
+ paths.push_back(new_path);
+ }
+}
+
bool LLNotifications::loadTemplates()
{
- const std::string xml_filename = "notifications.xml";
- std::string full_filename = gDirUtilp->findSkinnedFilename(LLUI::getXUIPaths().front(), xml_filename);
+ llinfos << "Reading notifications template" << llendl;
+ std::vector<std::string> search_paths;
+
+ std::string skin_relative_path = gDirUtilp->getDirDelimiter() + LLUI::getSkinPath() + gDirUtilp->getDirDelimiter() + "notifications.xml";
+ std::string localized_skin_relative_path = gDirUtilp->getDirDelimiter() + LLUI::getLocalizedSkinPath() + gDirUtilp->getDirDelimiter() + "notifications.xml";
+
+ addPathIfExists(gDirUtilp->getDefaultSkinDir() + skin_relative_path, search_paths);
+ addPathIfExists(gDirUtilp->getDefaultSkinDir() + localized_skin_relative_path, search_paths);
+ addPathIfExists(gDirUtilp->getSkinDir() + skin_relative_path, search_paths);
+ addPathIfExists(gDirUtilp->getSkinDir() + localized_skin_relative_path, search_paths);
+ addPathIfExists(gDirUtilp->getUserSkinDir() + skin_relative_path, search_paths);
+ addPathIfExists(gDirUtilp->getUserSkinDir() + localized_skin_relative_path, search_paths);
+ std::string base_filename = search_paths.front();
LLXMLNodePtr root;
- BOOL success = LLUICtrlFactory::getLayeredXMLNode(xml_filename, root);
+ BOOL success = LLXMLNode::getLayeredXMLNode(root, search_paths);
if (!success || root.isNull() || !root->hasName( "notifications" ))
{
- llerrs << "Problem reading UI Notifications file: " << full_filename << llendl;
+ llerrs << "Problem reading UI Notifications file: " << base_filename << llendl;
return false;
}
LLNotificationTemplate::Notifications params;
LLXUIParser parser;
- parser.readXUI(root, params, full_filename);
+ parser.readXUI(root, params, base_filename);
+
+ if(!params.validateBlock())
+ {
+ llerrs << "Problem reading UI Notifications file: " << base_filename << llendl;
+ return false;
+ }
mTemplates.clear();
- for(LLInitParam::ParamIterator<LLNotificationTemplate::GlobalString>::const_iterator it = params.strings.begin(), end_it = params.strings.end();
- it != end_it;
- ++it)
+ BOOST_FOREACH(LLNotificationTemplate::GlobalString& string, params.strings)
{
- mGlobalStrings[it->name] = it->value;
+ mGlobalStrings[string.name] = string.value;
}
std::map<std::string, LLNotificationForm::Params> form_templates;
- for(LLInitParam::ParamIterator<LLNotificationTemplate::Template>::const_iterator it = params.templates.begin(), end_it = params.templates.end();
- it != end_it;
- ++it)
+ BOOST_FOREACH(LLNotificationTemplate::Template& notification_template, params.templates)
{
- form_templates[it->name] = it->form;
+ form_templates[notification_template.name] = notification_template.form;
}
- for(LLInitParam::ParamIterator<LLNotificationTemplate::Params>::iterator it = params.notifications.begin(), end_it = params.notifications.end();
- it != end_it;
- ++it)
+ BOOST_FOREACH(LLNotificationTemplate::Params& notification, params.notifications)
{
- if (it->form_ref.form_template.isChosen())
+ if (notification.form_ref.form_template.isChosen())
{
// replace form contents from template
- it->form_ref.form = form_templates[it->form_ref.form_template.name];
- if(it->form_ref.form_template.yes_text.isProvided())
+ notification.form_ref.form = form_templates[notification.form_ref.form_template.name];
+ if(notification.form_ref.form_template.yes_text.isProvided())
{
- replaceFormText(it->form_ref.form, "$yestext", it->form_ref.form_template.yes_text);
+ replaceFormText(notification.form_ref.form, "$yestext", notification.form_ref.form_template.yes_text);
}
- if(it->form_ref.form_template.no_text.isProvided())
+ if(notification.form_ref.form_template.no_text.isProvided())
{
- replaceFormText(it->form_ref.form, "$notext", it->form_ref.form_template.no_text);
+ replaceFormText(notification.form_ref.form, "$notext", notification.form_ref.form_template.no_text);
}
- if(it->form_ref.form_template.cancel_text.isProvided())
+ if(notification.form_ref.form_template.cancel_text.isProvided())
{
- replaceFormText(it->form_ref.form, "$canceltext", it->form_ref.form_template.cancel_text);
+ replaceFormText(notification.form_ref.form, "$canceltext", notification.form_ref.form_template.cancel_text);
}
- if(it->form_ref.form_template.ignore_text.isProvided())
+ if(notification.form_ref.form_template.ignore_text.isProvided())
{
- replaceFormText(it->form_ref.form, "$ignoretext", it->form_ref.form_template.ignore_text);
+ replaceFormText(notification.form_ref.form, "$ignoretext", notification.form_ref.form_template.ignore_text);
}
}
- addTemplate(it->name, LLNotificationTemplatePtr(new LLNotificationTemplate(*it)));
+ mTemplates[notification.name] = LLNotificationTemplatePtr(new LLNotificationTemplate(notification));
+ }
+
+ llinfos << "...done" << llendl;
+
+ return true;
+}
+
+bool LLNotifications::loadVisibilityRules()
+{
+ const std::string xml_filename = "notification_visibility.xml";
+ std::string full_filename = gDirUtilp->findSkinnedFilename(LLUI::getXUIPaths().front(), xml_filename);
+
+ LLNotificationVisibilityRule::Rules params;
+ LLSimpleXUIParser parser;
+ parser.readXUI(full_filename, params);
+
+ if(!params.validateBlock())
+ {
+ llerrs << "Problem reading UI Notification Visibility Rules file: " << full_filename << llendl;
+ return false;
+ }
+
+ mVisibilityRules.clear();
+
+ BOOST_FOREACH(LLNotificationVisibilityRule::Rule& rule, params.rules)
+ {
+ mVisibilityRules.push_back(LLNotificationVisibilityRulePtr(new LLNotificationVisibilityRule(rule)));
}
return true;
@@ -1399,7 +1518,7 @@ bool LLNotifications::loadTemplates()
// Add a simple notification (from XUI)
void LLNotifications::addFromCallback(const LLSD& name)
{
- add(LLNotification::Params().name(name.asString()));
+ add(name.asString(), LLSD(), LLSD());
}
LLNotificationPtr LLNotifications::add(const std::string& name,
@@ -1457,7 +1576,7 @@ void LLNotifications::add(const LLNotificationPtr pNotif)
void LLNotifications::cancel(LLNotificationPtr pNotif)
{
- if (pNotif == NULL) return;
+ if (pNotif == NULL || pNotif->isCancelled()) return;
LLNotificationSet::iterator it=mItems.find(pNotif);
if (it == mItems.end())
@@ -1508,7 +1627,7 @@ LLNotificationPtr LLNotifications::find(LLUUID uuid)
LLNotificationSet::iterator it=mItems.find(target);
if (it == mItems.end())
{
- llwarns << "Tried to dereference uuid '" << uuid << "' as a notification key but didn't find it." << llendl;
+ LL_DEBUGS("Notifications") << "Tried to dereference uuid '" << uuid << "' as a notification key but didn't find it." << llendl;
return LLNotificationPtr((LLNotification*)NULL);
}
else
@@ -1546,6 +1665,93 @@ bool LLNotifications::getIgnoreAllNotifications()
return mIgnoreAllNotifications;
}
+bool LLNotifications::isVisibleByRules(LLNotificationPtr n)
+{
+ if(n->isRespondedTo())
+ {
+ // This avoids infinite recursion in the case where the filter calls respond()
+ return true;
+ }
+
+ VisibilityRuleList::iterator it;
+
+ for(it = mVisibilityRules.begin(); it != mVisibilityRules.end(); it++)
+ {
+ // An empty type/tag/name string will match any notification, so only do the comparison when the string is non-empty in the rule.
+ lldebugs
+ << "notification \"" << n->getName() << "\" "
+ << "testing against " << ((*it)->mVisible?"show":"hide") << " rule, "
+ << "name = \"" << (*it)->mName << "\" "
+ << "tag = \"" << (*it)->mTag << "\" "
+ << "type = \"" << (*it)->mType << "\" "
+ << llendl;
+
+ if(!(*it)->mType.empty())
+ {
+ if((*it)->mType != n->getType())
+ {
+ // Type doesn't match, so skip this rule.
+ continue;
+ }
+ }
+
+ if(!(*it)->mTag.empty())
+ {
+ // check this notification's tag(s) against it->mTag and continue if no match is found.
+ if(!n->matchesTag((*it)->mTag))
+ {
+ // This rule's non-empty tag didn't match one of the notification's tags. Skip this rule.
+ continue;
+ }
+ }
+
+ if(!(*it)->mName.empty())
+ {
+ // check this notification's name against the notification's name and continue if no match is found.
+ if((*it)->mName != n->getName())
+ {
+ // This rule's non-empty name didn't match the notification. Skip this rule.
+ continue;
+ }
+ }
+
+ // If we got here, the rule matches. Don't evaluate subsequent rules.
+ if(!(*it)->mVisible)
+ {
+ // This notification is being hidden.
+
+ if((*it)->mResponse.empty())
+ {
+ // Response property is empty. Cancel this notification.
+ lldebugs << "cancelling notification " << n->getName() << llendl;
+
+ cancel(n);
+ }
+ else
+ {
+ // Response property is not empty. Return the specified response.
+ LLSD response = n->getResponseTemplate(LLNotification::WITHOUT_DEFAULT_BUTTON);
+ // TODO: verify that the response template has an item with the correct name
+ response[(*it)->mResponse] = true;
+
+ lldebugs << "responding to notification " << n->getName() << " with response = " << response << llendl;
+
+ n->respond(response);
+ }
+
+ return false;
+ }
+
+ // If we got here, exit the loop and return true.
+ break;
+ }
+
+ lldebugs << "allowing notification " << n->getName() << llendl;
+
+ return true;
+}
+
+
// ---
// END OF LLNotifications implementation
// =========================================================
diff --git a/indra/llui/llnotifications.h b/indra/llui/llnotifications.h
index 524cff70e8..3df2efcac3 100644
--- a/indra/llui/llnotifications.h
+++ b/indra/llui/llnotifications.h
@@ -195,12 +195,13 @@ public:
Mandatory<std::string> type;
Optional<S32> width;
Optional<S32> max_length_chars;
+ Optional<std::string> text;
Optional<std::string> value;
FormInput();
};
- struct FormElement : public LLInitParam::Choice<FormElement>
+ struct FormElement : public LLInitParam::ChoiceBlock<FormElement>
{
Alternative<FormButton> button;
Alternative<FormInput> input;
@@ -270,6 +271,11 @@ struct LLNotificationTemplate;
// with smart pointers
typedef boost::shared_ptr<LLNotificationTemplate> LLNotificationTemplatePtr;
+
+struct LLNotificationVisibilityRule;
+
+typedef boost::shared_ptr<LLNotificationVisibilityRule> LLNotificationVisibilityRulePtr;
+
/**
* @class LLNotification
* @brief The object that expresses the details of a notification
@@ -306,7 +312,7 @@ public:
Optional<LLNotificationContext*> context;
Optional<void*> responder;
- struct Functor : public LLInitParam::Choice<Functor>
+ struct Functor : public LLInitParam::ChoiceBlock<Functor>
{
Alternative<std::string> name;
Alternative<LLNotificationFunctorRegistry::ResponseFunctor> function;
@@ -506,7 +512,7 @@ public:
std::string getLabel() const;
std::string getURL() const;
S32 getURLOption() const;
- S32 getURLOpenExternally() const;
+ S32 getURLOpenExternally() const;
const LLNotificationFormPtr getForm();
@@ -578,6 +584,8 @@ public:
bool hasUniquenessConstraints() const;
+ bool matchesTag(const std::string& tag);
+
virtual ~LLNotification() {}
};
@@ -682,7 +690,7 @@ typedef std::multimap<std::string, LLNotificationPtr> LLNotificationMap;
// Abstract base class (interface) for a channel; also used for the master container.
// This lets us arrange channels into a call hierarchy.
-// We maintain a heirarchy of notification channels; events are always started at the top
+// We maintain a hierarchy of notification channels; events are always started at the top
// and propagated through the hierarchy only if they pass a filter.
// Any channel can be created with a parent. A null parent (empty string) means it's
// tied to the root of the tree (the LLNotifications class itself).
@@ -855,9 +863,14 @@ class LLNotifications :
friend class LLSingleton<LLNotifications>;
public:
- // load notification descriptions from file;
+ // load all notification descriptions from file
+ // calling more than once will overwrite existing templates
+ // but never delete a template
+ bool loadTemplates();
+
+ // load visibility rules from file;
// OK to call more than once because it will reload
- bool loadTemplates();
+ bool loadVisibilityRules();
// Add a simple notification (from XUI)
void addFromCallback(const LLSD& name);
@@ -904,6 +917,8 @@ public:
// test for existence
bool templateExists(const std::string& name);
+ typedef std::list<LLNotificationVisibilityRulePtr> VisibilityRuleList;
+
void forceResponse(const LLNotification::Params& params, S32 option);
void createDefaultChannels();
@@ -919,6 +934,8 @@ public:
void setIgnoreAllNotifications(bool ignore);
bool getIgnoreAllNotifications();
+ bool isVisibleByRules(LLNotificationPtr pNotification);
+
private:
// we're a singleton, so we don't have a public constructor
LLNotifications();
@@ -934,10 +951,10 @@ private:
LLNotificationChannelPtr pHistoryChannel;
LLNotificationChannelPtr pExpirationChannel;
- // put your template in
- bool addTemplate(const std::string& name, LLNotificationTemplatePtr theTemplate);
TemplateMap mTemplates;
+ VisibilityRuleList mVisibilityRules;
+
std::string mFileName;
LLNotificationMap mUniqueNotifications;
diff --git a/indra/llui/llnotificationtemplate.h b/indra/llui/llnotificationtemplate.h
index 6bc0d2aaff..fb50c9c123 100644
--- a/indra/llui/llnotificationtemplate.h
+++ b/indra/llui/llnotificationtemplate.h
@@ -74,11 +74,13 @@ struct LLNotificationTemplate
struct UniquenessContext : public LLInitParam::Block<UniquenessContext>
{
- Mandatory<std::string> key;
+ Mandatory<std::string> value;
UniquenessContext()
- : key("key")
- {}
+ : value("value")
+ {
+ addSynonym(value, "key");
+ }
};
@@ -86,10 +88,10 @@ struct LLNotificationTemplate
{
private:
// this idiom allows
- // <notification unique="true">
+ // <notification> <unique/> </notification>
// as well as
- // <notification> <unique> <context key=""/> </unique>...
- Optional<bool> dummy_val;
+ // <notification> <unique> <context></context> </unique>...
+ Optional<LLInitParam::Flag> dummy_val;
public:
Multiple<UniquenessContext> contexts;
@@ -145,7 +147,7 @@ struct LLNotificationTemplate
{}
};
- struct FormRef : public LLInitParam::Choice<FormRef>
+ struct FormRef : public LLInitParam::ChoiceBlock<FormRef>
{
Alternative<LLNotificationForm::Params> form;
Alternative<TemplateRef> form_template;
@@ -156,6 +158,15 @@ struct LLNotificationTemplate
{}
};
+ struct Tag : public LLInitParam::Block<Tag>
+ {
+ Mandatory<std::string> value;
+
+ Tag()
+ : value("value")
+ {}
+ };
+
struct Params : public LLInitParam::Block<Params>
{
Mandatory<std::string> name;
@@ -173,6 +184,7 @@ struct LLNotificationTemplate
Optional<FormRef> form_ref;
Optional<ENotificationPriority,
NotificationPriorityValues> priority;
+ Multiple<Tag> tags;
Params()
@@ -189,7 +201,8 @@ struct LLNotificationTemplate
expire_option("expireOption", -1),
url("url"),
unique("unique"),
- form_ref("")
+ form_ref(""),
+ tags("tag")
{}
};
@@ -232,8 +245,8 @@ struct LLNotificationTemplate
// (used for things like progress indications, or repeating warnings
// like "the grid is going down in N minutes")
bool mUnique;
- // if we want to be unique only if a certain part of the payload is constant
- // specify the field names for the payload. The notification will only be
+ // if we want to be unique only if a certain part of the payload or substitutions args
+ // are constant specify the field names for the payload. The notification will only be
// combined if all of the fields named in the context are identical in the
// new and the old notification; otherwise, the notification will be
// duplicated. This is to support suppressing duplicate offers from the same
@@ -276,6 +289,8 @@ struct LLNotificationTemplate
// this is loaded as a name, but looked up to get the UUID upon template load.
// If null, it wasn't specified.
LLUUID mSoundEffect;
+ // List of tags that rules can match against.
+ std::list<std::string> mTags;
};
#endif //LL_LLNOTIFICATION_TEMPLATE_H
diff --git a/indra/llui/llnotificationvisibilityrule.h b/indra/llui/llnotificationvisibilityrule.h
new file mode 100644
index 0000000000..78788a275c
--- /dev/null
+++ b/indra/llui/llnotificationvisibilityrule.h
@@ -0,0 +1,104 @@
+/**
+* @file llnotificationvisibility.h
+* @brief Rules for
+* @author Monroe
+*
+* $LicenseInfo:firstyear=2010&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2010, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+* $/LicenseInfo$
+*/
+
+#ifndef LL_LLNOTIFICATION_VISIBILITY_RULE_H
+#define LL_LLNOTIFICATION_VISIBILITY_RULE_H
+
+#include "llinitparam.h"
+//#include "llnotifications.h"
+
+
+
+// This is the class of object read from the XML file (notification_visibility.xml,
+// from the appropriate local language directory).
+struct LLNotificationVisibilityRule
+{
+ struct Filter : public LLInitParam::Block<Filter>
+ {
+ Optional<std::string> type,
+ tag,
+ name;
+
+ Filter()
+ : type("type"),
+ tag("tag"),
+ name("name")
+ {}
+ };
+
+ struct Respond : public LLInitParam::Block<Respond, Filter>
+ {
+ Mandatory<std::string> response;
+
+ Respond()
+ : response("response")
+ {}
+ };
+
+ struct Rule : public LLInitParam::ChoiceBlock<Rule>
+ {
+ Alternative<Filter> show;
+ Alternative<Filter> hide;
+ Alternative<Respond> respond;
+
+ Rule()
+ : show("show"),
+ hide("hide"),
+ respond("respond")
+ {}
+ };
+
+ struct Rules : public LLInitParam::Block<Rules>
+ {
+ Multiple<Rule> rules;
+
+ Rules()
+ : rules("")
+ {}
+ };
+
+ LLNotificationVisibilityRule(const Rule& p);
+
+ // If true, this rule makes matching notifications visible. Otherwise, it makes them invisible.
+ bool mVisible;
+
+ // Which response to give when making a notification invisible. An empty string means the notification should be cancelled instead of responded to.
+ std::string mResponse;
+
+ // String to match against the notification's "type". An empty string matches all notifications.
+ std::string mType;
+
+ // String to match against the notification's tag(s). An empty string matches all notifications.
+ std::string mTag;
+
+ // String to match against the notification's name. An empty string matches all notifications.
+ std::string mName;
+
+};
+
+#endif //LL_LLNOTIFICATION_VISIBILITY_RULE_H
+
diff --git a/indra/llui/llpanel.cpp b/indra/llui/llpanel.cpp
index 900e2c789e..00318cec6b 100644
--- a/indra/llui/llpanel.cpp
+++ b/indra/llui/llpanel.cpp
@@ -87,9 +87,9 @@ LLPanel::Params::Params()
filename("filename"),
class_name("class"),
help_topic("help_topic"),
- visible_callback("visible_callback")
+ visible_callback("visible_callback"),
+ accepts_badge("accepts_badge")
{
- name = "panel";
addSynonym(background_visible, "bg_visible");
addSynonym(has_border, "border_visible");
addSynonym(label, "title");
@@ -98,6 +98,7 @@ LLPanel::Params::Params()
LLPanel::LLPanel(const LLPanel::Params& p)
: LLUICtrl(p),
+ LLBadgeHolder(p.accepts_badge),
mBgVisible(p.background_visible),
mBgOpaque(p.background_opaque),
mBgOpaqueColor(p.bg_opaque_color()),
@@ -121,8 +122,6 @@ LLPanel::LLPanel(const LLPanel::Params& p)
{
addBorder(p.border);
}
-
- mPanelHandle.bind(this);
}
LLPanel::~LLPanel()
@@ -194,6 +193,8 @@ void LLPanel::draw()
// draw background
if( mBgVisible )
{
+ alpha = getCurrentTransparency();
+
LLRect local_rect = getLocalRect();
if (mBgOpaque )
{
@@ -434,7 +435,7 @@ void LLPanel::initFromParams(const LLPanel::Params& p)
//and LLView::initFromParams will use them to set visible and enabled
setVisible(p.visible);
setEnabled(p.enabled);
-
+ setFocusRoot(p.focus_root);
setSoundFlags(p.sound_flags);
// control_name, tab_stop, focus_lost_callback, initial_value, rect, enabled, visible
@@ -483,6 +484,8 @@ void LLPanel::initFromParams(const LLPanel::Params& p)
mBgAlphaImage = p.bg_alpha_image();
mBgOpaqueImageOverlay = p.bg_opaque_image_overlay;
mBgAlphaImageOverlay = p.bg_alpha_image_overlay;
+
+ setAcceptsBadge(p.accepts_badge);
}
static LLFastTimer::DeclareTimer FTM_PANEL_SETUP("Panel Setup");
@@ -509,9 +512,6 @@ BOOL LLPanel::initPanelXML(LLXMLNodePtr node, LLView *parent, LLXMLNodePtr outpu
if (!xml_filename.empty())
{
- LLUICtrlFactory::instance().pushFileName(xml_filename);
-
- LLFastTimer timer(FTM_EXTERNAL_PANEL_LOAD);
if (output_node)
{
//if we are exporting, we want to export the current xml
@@ -524,6 +524,9 @@ BOOL LLPanel::initPanelXML(LLXMLNodePtr node, LLView *parent, LLXMLNodePtr outpu
return TRUE;
}
+ LLUICtrlFactory::instance().pushFileName(xml_filename);
+
+ LLFastTimer timer(FTM_EXTERNAL_PANEL_LOAD);
if (!LLUICtrlFactory::getLayeredXMLNode(xml_filename, referenced_xml))
{
llwarns << "Couldn't parse panel from: " << xml_filename << llendl;
diff --git a/indra/llui/llpanel.h b/indra/llui/llpanel.h
index c1a1a06f39..f620201020 100644
--- a/indra/llui/llpanel.h
+++ b/indra/llui/llpanel.h
@@ -32,8 +32,10 @@
#include "llcallbackmap.h"
#include "lluictrl.h"
#include "llviewborder.h"
+#include "lluiimage.h"
#include "lluistring.h"
#include "v4color.h"
+#include "llbadgeholder.h"
#include <list>
#include <queue>
@@ -50,7 +52,7 @@ class LLUIImage;
* With or without border,
* Can contain LLUICtrls.
*/
-class LLPanel : public LLUICtrl
+class LLPanel : public LLUICtrl, public LLBadgeHolder
{
public:
struct LocalizedString : public LLInitParam::Block<LocalizedString>
@@ -88,13 +90,12 @@ public:
Multiple<LocalizedString> strings;
Optional<CommitCallbackParam> visible_callback;
+
+ Optional<bool> accepts_badge;
Params();
};
- // valid children for LLPanel are stored in this registry
- typedef LLDefaultChildRegistry child_registry_t;
-
protected:
friend class LLUICtrlFactory;
// RN: for some reason you can't just use LLUICtrlFactory::getDefaultParams as a default argument in VC8
@@ -134,6 +135,8 @@ public:
const LLColor4& getBackgroundColor() const { return mBgOpaqueColor; }
void setTransparentColor(const LLColor4& color) { mBgAlphaColor = color; }
const LLColor4& getTransparentColor() const { return mBgAlphaColor; }
+ void setBackgroundImage(LLUIImage* image) { mBgOpaqueImage = image; }
+ void setTransparentImage(LLUIImage* image) { mBgAlphaImage = image; }
LLPointer<LLUIImage> getBackgroundImage() const { return mBgOpaqueImage; }
LLPointer<LLUIImage> getTransparentImage() const { return mBgAlphaImage; }
LLColor4 getBackgroundImageOverlay() { return mBgOpaqueImageOverlay; }
@@ -152,7 +155,7 @@ public:
void setCtrlsEnabled(BOOL b);
- LLHandle<LLPanel> getHandle() const { return mPanelHandle; }
+ LLHandle<LLPanel> getHandle() const { return getDerivedHandle<LLPanel>(); }
const LLCallbackMap::map_t& getFactoryMap() const { return mFactoryMap; }
@@ -261,6 +264,9 @@ protected:
std::string mHelpTopic; // the name of this panel's help topic to display in the Help Viewer
typedef std::deque<const LLCallbackMap::map_t*> factory_stack_t;
static factory_stack_t sFactoryStack;
+
+ // for setting the xml filename when building panel in context dependent cases
+ std::string mXMLFilename;
private:
BOOL mBgVisible; // any background at all?
@@ -274,13 +280,10 @@ private:
LLViewBorder* mBorder;
LLButton* mDefaultBtn;
LLUIString mLabel;
- LLRootHandle<LLPanel> mPanelHandle;
typedef std::map<std::string, std::string> ui_string_map_t;
ui_string_map_t mUIStrings;
- // for setting the xml filename when building panel in context dependent cases
- std::string mXMLFilename;
}; // end class LLPanel
diff --git a/indra/llui/llprogressbar.cpp b/indra/llui/llprogressbar.cpp
index aaa328754d..84a890edfa 100644
--- a/indra/llui/llprogressbar.cpp
+++ b/indra/llui/llprogressbar.cpp
@@ -38,6 +38,7 @@
#include "llfocusmgr.h"
#include "lluictrlfactory.h"
+#include "lluiimage.h"
static LLDefaultChildRegistry::Register<LLProgressBar> r("progress_bar");
@@ -50,7 +51,7 @@ LLProgressBar::Params::Params()
LLProgressBar::LLProgressBar(const LLProgressBar::Params& p)
-: LLView(p),
+: LLUICtrl(p),
mImageBar(p.image_bar),
mImageFill(p.image_fill),
mColorBackground(p.color_bg()),
@@ -80,7 +81,7 @@ void LLProgressBar::draw()
mImageFill->draw(progress_rect, bar_color);
}
-void LLProgressBar::setPercent(const F32 percent)
+void LLProgressBar::setValue(const LLSD& value)
{
- mPercentDone = llclamp(percent, 0.f, 100.f);
+ mPercentDone = llclamp((F32)value.asReal(), 0.f, 100.f);
}
diff --git a/indra/llui/llprogressbar.h b/indra/llui/llprogressbar.h
index 13297f7493..a8ec83ea00 100644
--- a/indra/llui/llprogressbar.h
+++ b/indra/llui/llprogressbar.h
@@ -27,14 +27,15 @@
#ifndef LL_LLPROGRESSBAR_H
#define LL_LLPROGRESSBAR_H
-#include "llview.h"
#include "llframetimer.h"
+#include "lluictrl.h"
+#include "lluiimage.h"
class LLProgressBar
- : public LLView
+ : public LLUICtrl
{
public:
- struct Params : public LLInitParam::Block<Params, LLView::Params>
+ struct Params : public LLInitParam::Block<Params, LLUICtrl::Params>
{
Optional<LLUIImage*> image_bar,
image_fill;
@@ -47,7 +48,7 @@ public:
LLProgressBar(const Params&);
virtual ~LLProgressBar();
- void setPercent(const F32 percent);
+ void setValue(const LLSD& value);
/*virtual*/ void draw();
diff --git a/indra/llui/llradiogroup.cpp b/indra/llui/llradiogroup.cpp
index cc348fdc63..95a7d09382 100644
--- a/indra/llui/llradiogroup.cpp
+++ b/indra/llui/llradiogroup.cpp
@@ -69,14 +69,11 @@ protected:
static LLWidgetNameRegistry::StaticRegistrar register_radio_item(&typeid(LLRadioGroup::ItemParams), "radio_item");
LLRadioGroup::Params::Params()
-: has_border("draw_border"),
+: allow_deselect("allow_deselect"),
items("item")
{
addSynonym(items, "radio_item");
- name = "radio_group";
- mouse_opaque = true;
- follows.flags = FOLLOWS_LEFT | FOLLOWS_TOP;
// radio items are not tabbable until they are selected
tab_stop = false;
}
@@ -85,18 +82,8 @@ LLRadioGroup::LLRadioGroup(const LLRadioGroup::Params& p)
: LLUICtrl(p),
mFont(p.font.isProvided() ? p.font() : LLFontGL::getFontSansSerifSmall()),
mSelectedIndex(-1),
- mHasBorder(p.has_border)
-{
- if (mHasBorder)
- {
- LLViewBorder::Params params;
- params.name("radio group border");
- params.rect(LLRect(0, getRect().getHeight(), getRect().getWidth(), 0));
- params.bevel_style(LLViewBorder::BEVEL_NONE);
- LLViewBorder * vb = LLUICtrlFactory::create<LLViewBorder> (params);
- addChild (vb);
- }
-}
+ mAllowDeselect(p.allow_deselect)
+{}
void LLRadioGroup::initFromParams(const Params& p)
{
@@ -106,7 +93,10 @@ void LLRadioGroup::initFromParams(const Params& p)
{
LLRadioGroup::ItemParams item_params(*it);
- item_params.font.setIfNotProvided(mFont); // apply radio group font by default
+ if (!item_params.font.isProvided())
+ {
+ item_params.font = mFont; // apply radio group font by default
+ }
item_params.commit_callback.function = boost::bind(&LLRadioGroup::onClickButton, this, _1);
item_params.from_xui = p.from_xui;
if (p.from_xui)
@@ -184,7 +174,7 @@ void LLRadioGroup::setIndexEnabled(S32 index, BOOL enabled)
BOOL LLRadioGroup::setSelectedIndex(S32 index, BOOL from_event)
{
- if (index < 0 || (S32)mRadioButtons.size() <= index )
+ if ((S32)mRadioButtons.size() <= index )
{
return FALSE;
}
@@ -202,13 +192,16 @@ BOOL LLRadioGroup::setSelectedIndex(S32 index, BOOL from_event)
mSelectedIndex = index;
- LLRadioCtrl* radio_item = mRadioButtons[mSelectedIndex];
- radio_item->setTabStop(true);
- radio_item->setValue( TRUE );
-
- if (hasFocus())
+ if (mSelectedIndex >= 0)
{
- mRadioButtons[mSelectedIndex]->focusFirstItem(FALSE, FALSE);
+ LLRadioCtrl* radio_item = mRadioButtons[mSelectedIndex];
+ radio_item->setTabStop(true);
+ radio_item->setValue( TRUE );
+
+ if (hasFocus())
+ {
+ radio_item->focusFirstItem(FALSE, FALSE);
+ }
}
if (!from_event)
@@ -307,8 +300,15 @@ void LLRadioGroup::onClickButton(LLUICtrl* ctrl)
LLRadioCtrl* radio = *iter;
if (radio == clicked_radio)
{
- // llinfos << "clicked button " << index << llendl;
- setSelectedIndex(index);
+ if (index == mSelectedIndex && mAllowDeselect)
+ {
+ // don't select anything
+ setSelectedIndex(-1);
+ }
+ else
+ {
+ setSelectedIndex(index);
+ }
// BUG: Calls click callback even if button didn't actually change
onCommit();
@@ -346,7 +346,7 @@ void LLRadioGroup::setValue( const LLSD& value )
}
else
{
- llwarns << "LLRadioGroup::setValue: value not found: " << value.asString() << llendl;
+ setSelectedIndex(-1, TRUE);
}
}
}
diff --git a/indra/llui/llradiogroup.h b/indra/llui/llradiogroup.h
index 0588900600..8bd5698538 100644
--- a/indra/llui/llradiogroup.h
+++ b/indra/llui/llradiogroup.h
@@ -49,7 +49,7 @@ public:
struct Params : public LLInitParam::Block<Params, LLUICtrl::Params>
{
- Optional<bool> has_border;
+ Optional<bool> allow_deselect;
Multiple<ItemParams, AtLeast<1> > items;
Params();
};
@@ -73,7 +73,6 @@ public:
void setIndexEnabled(S32 index, BOOL enabled);
// return the index value of the selected item
S32 getSelectedIndex() const { return mSelectedIndex; }
-
// set the index value programatically
BOOL setSelectedIndex(S32 index, BOOL from_event = FALSE);
@@ -103,12 +102,13 @@ public:
/*virtual*/ BOOL operateOnAll(EOperation op);
private:
- const LLFontGL* mFont;
- S32 mSelectedIndex;
+ const LLFontGL* mFont;
+ S32 mSelectedIndex;
+
typedef std::vector<class LLRadioCtrl*> button_list_t;
- button_list_t mRadioButtons;
+ button_list_t mRadioButtons;
- BOOL mHasBorder;
+ bool mAllowDeselect; // user can click on an already selected option to deselect it
};
#endif
diff --git a/indra/llui/llresizebar.cpp b/indra/llui/llresizebar.cpp
index 02f60c76fa..87aeb4d7a7 100644
--- a/indra/llui/llresizebar.cpp
+++ b/indra/llui/llresizebar.cpp
@@ -79,6 +79,8 @@ LLResizeBar::LLResizeBar(const LLResizeBar::Params& p)
BOOL LLResizeBar::handleMouseDown(S32 x, S32 y, MASK mask)
{
+ if (!canResize()) return FALSE;
+
// Route future Mouse messages here preemptively. (Release on mouse up.)
// No handler needed for focus lost since this clas has no state that depends on it.
gFocusMgr.setMouseCapture( this );
@@ -243,7 +245,7 @@ BOOL LLResizeBar::handleHover(S32 x, S32 y, MASK mask)
handled = TRUE;
}
- if( handled )
+ if( handled && canResize() )
{
switch( mSide )
{
diff --git a/indra/llui/llresizebar.h b/indra/llui/llresizebar.h
index 0725fbd846..6daf191918 100644
--- a/indra/llui/llresizebar.h
+++ b/indra/llui/llresizebar.h
@@ -70,6 +70,7 @@ public:
void setResizeLimits( S32 min_size, S32 max_size ) { mMinSize = min_size; mMaxSize = max_size; }
void setEnableSnapping(BOOL enable) { mSnappingEnabled = enable; }
void setAllowDoubleClickSnapping(BOOL allow) { mAllowDoubleClickSnapping = allow; }
+ bool canResize() { return getEnabled() && mMaxSize > mMinSize; }
private:
S32 mDragLastScreenX;
diff --git a/indra/llui/llresizehandle.h b/indra/llui/llresizehandle.h
index 531eb1db61..7541b9e6c0 100644
--- a/indra/llui/llresizehandle.h
+++ b/indra/llui/llresizehandle.h
@@ -55,7 +55,7 @@ public:
virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask);
void setResizeLimits( S32 min_width, S32 min_height ) { mMinWidth = min_width; mMinHeight = min_height; }
-
+
private:
BOOL pointInHandle( S32 x, S32 y );
diff --git a/indra/llui/llresmgr.cpp b/indra/llui/llresmgr.cpp
index 39385786bc..820e7cb26a 100644
--- a/indra/llui/llresmgr.cpp
+++ b/indra/llui/llresmgr.cpp
@@ -337,7 +337,7 @@ LLLocale::LLLocale(const std::string& locale_string)
char* new_locale_string = setlocale( LC_ALL, locale_string.c_str());
if ( new_locale_string == NULL)
{
- llwarns << "Failed to set locale " << locale_string << llendl;
+ LL_WARNS_ONCE("LLLocale") << "Failed to set locale " << locale_string << LL_ENDL;
setlocale(LC_ALL, SYSTEM_LOCALE.c_str());
}
//else
diff --git a/indra/llui/llscrollbar.cpp b/indra/llui/llscrollbar.cpp
index 3a867a10a7..5d3bf7a670 100644
--- a/indra/llui/llscrollbar.cpp
+++ b/indra/llui/llscrollbar.cpp
@@ -63,9 +63,7 @@ LLScrollbar::Params::Params()
right_button("right_button"),
bg_visible("bg_visible", false),
bg_color("bg_color", LLColor4::black)
-{
- tab_stop = false;
-}
+{}
LLScrollbar::LLScrollbar(const Params & p)
: LLUICtrl(p),
diff --git a/indra/llui/llscrollcontainer.cpp b/indra/llui/llscrollcontainer.cpp
index 3146418a7d..9b7e30bb04 100644
--- a/indra/llui/llscrollcontainer.cpp
+++ b/indra/llui/llscrollcontainer.cpp
@@ -74,11 +74,7 @@ LLScrollContainer::Params::Params()
min_auto_scroll_rate("min_auto_scroll_rate", 100),
max_auto_scroll_rate("max_auto_scroll_rate", 1000),
reserve_scroll_corner("reserve_scroll_corner", false)
-{
- name = "scroll_container";
- mouse_opaque(true);
- tab_stop(false);
-}
+{}
// Default constructor
@@ -227,6 +223,15 @@ BOOL LLScrollContainer::handleKeyHere(KEY key, MASK mask)
return FALSE;
}
+BOOL LLScrollContainer::handleUnicodeCharHere(llwchar uni_char)
+{
+ if (mScrolledView && mScrolledView->handleUnicodeCharHere(uni_char))
+ {
+ return TRUE;
+ }
+ return FALSE;
+}
+
BOOL LLScrollContainer::handleScrollWheel( S32 x, S32 y, S32 clicks )
{
// Give event to my child views - they may have scroll bars
@@ -373,19 +378,24 @@ void LLScrollContainer::calcVisibleSize( S32 *visible_width, S32 *visible_height
if (!mHideScrollbar)
{
- if( *visible_height < doc_height )
+ // Note: 1 pixel change can happen on final animation and should not trigger
+ // the display of sliders.
+ if ((doc_height - *visible_height) > 1)
{
*show_v_scrollbar = TRUE;
*visible_width -= scrollbar_size;
}
-
- if( *visible_width < doc_width )
+ if ((doc_width - *visible_width) > 1)
{
*show_h_scrollbar = TRUE;
*visible_height -= scrollbar_size;
+ // The view inside the scroll container should not be extended
+ // to container's full height to ensure the correct computation
+ // of *show_v_scrollbar after subtracting horizontal scrollbar_size.
+
// Must retest now that visible_height has changed
- if( !*show_v_scrollbar && (*visible_height < doc_height) )
+ if( !*show_v_scrollbar && ((doc_height - *visible_height) > 1) )
{
*show_v_scrollbar = TRUE;
*visible_width -= scrollbar_size;
@@ -419,62 +429,66 @@ void LLScrollContainer::draw()
focusFirstItem();
}
- // Draw background
- if( mIsOpaque )
- {
- gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- gGL.color4fv( mBackgroundColor.get().mV );
- gl_rect_2d( mInnerRect );
- }
-
- // Draw mScrolledViews and update scroll bars.
- // get a scissor region ready, and draw the scrolling view. The
- // scissor region ensures that we don't draw outside of the bounds
- // of the rectangle.
- if( mScrolledView )
+ if (getRect().isValid())
{
- updateScroll();
-
- // Draw the scrolled area.
+ // Draw background
+ if( mIsOpaque )
{
- S32 visible_width = 0;
- S32 visible_height = 0;
- BOOL show_v_scrollbar = FALSE;
- BOOL show_h_scrollbar = FALSE;
- calcVisibleSize( &visible_width, &visible_height, &show_h_scrollbar, &show_v_scrollbar );
-
- LLLocalClipRect clip(LLRect(mInnerRect.mLeft,
- mInnerRect.mBottom + (show_h_scrollbar ? scrollbar_size : 0) + visible_height,
- mInnerRect.mRight - (show_v_scrollbar ? scrollbar_size: 0),
- mInnerRect.mBottom + (show_h_scrollbar ? scrollbar_size : 0)
- ));
- drawChild(mScrolledView);
- }
- }
+ F32 alpha = getCurrentTransparency();
- // Highlight border if a child of this container has keyboard focus
- if( mBorder->getVisible() )
- {
- mBorder->setKeyboardFocusHighlight( gFocusMgr.childHasKeyboardFocus(this) );
- }
-
- // Draw all children except mScrolledView
- // Note: scrollbars have been adjusted by above drawing code
- for (child_list_const_reverse_iter_t child_iter = getChildList()->rbegin();
- child_iter != getChildList()->rend(); ++child_iter)
- {
- LLView *viewp = *child_iter;
- if( sDebugRects )
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+ gl_rect_2d(mInnerRect, mBackgroundColor.get() % alpha);
+ }
+
+ // Draw mScrolledViews and update scroll bars.
+ // get a scissor region ready, and draw the scrolling view. The
+ // scissor region ensures that we don't draw outside of the bounds
+ // of the rectangle.
+ if( mScrolledView )
{
- sDepth++;
+ updateScroll();
+
+ // Draw the scrolled area.
+ {
+ S32 visible_width = 0;
+ S32 visible_height = 0;
+ BOOL show_v_scrollbar = FALSE;
+ BOOL show_h_scrollbar = FALSE;
+ calcVisibleSize( &visible_width, &visible_height, &show_h_scrollbar, &show_v_scrollbar );
+
+ LLLocalClipRect clip(LLRect(mInnerRect.mLeft,
+ mInnerRect.mBottom + (show_h_scrollbar ? scrollbar_size : 0) + visible_height,
+ mInnerRect.mRight - (show_v_scrollbar ? scrollbar_size: 0),
+ mInnerRect.mBottom + (show_h_scrollbar ? scrollbar_size : 0)
+ ));
+ drawChild(mScrolledView);
+ }
}
- if( (viewp != mScrolledView) && viewp->getVisible() )
+
+ // Highlight border if a child of this container has keyboard focus
+ if( mBorder->getVisible() )
{
- drawChild(viewp);
+ mBorder->setKeyboardFocusHighlight( gFocusMgr.childHasKeyboardFocus(this) );
}
- if( sDebugRects )
+
+ // Draw all children except mScrolledView
+ // Note: scrollbars have been adjusted by above drawing code
+ for (child_list_const_reverse_iter_t child_iter = getChildList()->rbegin();
+ child_iter != getChildList()->rend(); ++child_iter)
{
- sDepth--;
+ LLView *viewp = *child_iter;
+ if( sDebugRects )
+ {
+ sDepth++;
+ }
+ if( (viewp != mScrolledView) && viewp->getVisible() )
+ {
+ drawChild(viewp);
+ }
+ if( sDebugRects )
+ {
+ sDepth--;
+ }
}
}
} // end draw
diff --git a/indra/llui/llscrollcontainer.h b/indra/llui/llscrollcontainer.h
index 46a71a7e30..d87c95b3d7 100644
--- a/indra/llui/llscrollcontainer.h
+++ b/indra/llui/llscrollcontainer.h
@@ -91,7 +91,7 @@ public:
void setReserveScrollCorner( BOOL b ) { mReserveScrollCorner = b; }
LLRect getVisibleContentRect();
LLRect getContentWindowRect();
- const LLRect& getScrolledViewRect() const { return mScrolledView ? mScrolledView->getRect() : LLRect::null; }
+ virtual const LLRect getScrolledViewRect() const { return mScrolledView ? mScrolledView->getRect() : LLRect::null; }
void pageUp(S32 overlap = 0);
void pageDown(S32 overlap = 0);
void goToTop();
@@ -103,6 +103,7 @@ public:
// LLView functionality
virtual void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
virtual BOOL handleKeyHere(KEY key, MASK mask);
+ virtual BOOL handleUnicodeCharHere(llwchar uni_char);
virtual BOOL handleScrollWheel( S32 x, S32 y, S32 clicks );
virtual BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
EDragAndDropType cargo_type,
@@ -115,6 +116,9 @@ public:
bool autoScroll(S32 x, S32 y);
+protected:
+ LLView* mScrolledView;
+
private:
// internal scrollbar handlers
virtual void scrollHorizontal( S32 new_pos );
@@ -123,7 +127,6 @@ private:
void calcVisibleSize( S32 *visible_width, S32 *visible_height, BOOL* show_h_scrollbar, BOOL* show_v_scrollbar ) const;
LLScrollbar* mScrollbar[SCROLLBAR_COUNT];
- LLView* mScrolledView;
S32 mSize;
BOOL mIsOpaque;
LLUIColor mBackgroundColor;
diff --git a/indra/llui/llscrollingpanellist.h b/indra/llui/llscrollingpanellist.h
index 8f569c2a58..e8df176ec3 100644
--- a/indra/llui/llscrollingpanellist.h
+++ b/indra/llui/llscrollingpanellist.h
@@ -51,12 +51,7 @@ class LLScrollingPanelList : public LLUICtrl
{
public:
struct Params : public LLInitParam::Block<Params, LLUICtrl::Params>
- {
- Params()
- {
- name = "scrolling_panel_list";
- }
- };
+ {};
LLScrollingPanelList(const Params& p)
: LLUICtrl(p)
{}
diff --git a/indra/llui/llscrolllistcell.cpp b/indra/llui/llscrolllistcell.cpp
index 9d25c7180d..8000efad0e 100644
--- a/indra/llui/llscrolllistcell.cpp
+++ b/indra/llui/llscrolllistcell.cpp
@@ -232,7 +232,7 @@ BOOL LLScrollListText::getVisible() const
//virtual
S32 LLScrollListText::getHeight() const
{
- return llround(mFont->getLineHeight());
+ return mFont->getLineHeight();
}
@@ -306,7 +306,7 @@ void LLScrollListText::draw(const LLColor4& color, const LLColor4& highlight_col
break;
}
LLRect highlight_rect(left - 2,
- llround(mFont->getLineHeight()) + 1,
+ mFont->getLineHeight() + 1,
left + mFont->getWidth(mText.getString(), mHighlightOffset, mHighlightCount) + 1,
1);
mRoundedRectImage->draw(highlight_rect, highlight_color);
@@ -329,7 +329,7 @@ void LLScrollListText::draw(const LLColor4& color, const LLColor4& highlight_col
break;
}
mFont->render(mText.getWString(), 0,
- start_x, 2.f,
+ start_x, 0.f,
display_color,
mFontAlignment,
LLFontGL::BOTTOM,
diff --git a/indra/llui/llscrolllistcolumn.cpp b/indra/llui/llscrolllistcolumn.cpp
index 696e4a2bb1..07a6dfaa10 100644
--- a/indra/llui/llscrolllistcolumn.cpp
+++ b/indra/llui/llscrolllistcolumn.cpp
@@ -46,10 +46,7 @@ static LLWidgetNameRegistry::StaticRegistrar sRegisterColumnHeaderParams(&typeid
//---------------------------------------------------------------------------
LLScrollColumnHeader::Params::Params()
: column("column")
-{
- name = "column_header";
- tab_stop(false);
-}
+{}
LLScrollColumnHeader::LLScrollColumnHeader(const LLScrollColumnHeader::Params& p)
diff --git a/indra/llui/llscrolllistcolumn.h b/indra/llui/llscrolllistcolumn.h
index e2711ac75a..b4d4a6d05e 100644
--- a/indra/llui/llscrolllistcolumn.h
+++ b/indra/llui/llscrolllistcolumn.h
@@ -95,7 +95,7 @@ public:
Optional<ESortDirection, SortNames> sort_direction;
Optional<bool> sort_ascending;
- struct Width : public LLInitParam::Choice<Width>
+ struct Width : public LLInitParam::ChoiceBlock<Width>
{
Alternative<bool> dynamic_width;
Alternative<S32> pixel_width;
@@ -112,7 +112,7 @@ public:
Optional<Width> width;
// either an image or label is used in column header
- struct Header : public LLInitParam::Choice<Header>
+ struct Header : public LLInitParam::ChoiceBlock<Header>
{
Alternative<std::string> label;
Alternative<LLUIImage*> image;
@@ -135,7 +135,7 @@ public:
halign("halign", LLFontGL::LEFT)
{
// default choice to "dynamic_width"
- width.dynamic_width = true;
+ changeDefault(width.dynamic_width, true);
addSynonym(sort_column, "sort");
}
diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp
index 7df7c13dc0..b3e1b63db5 100644
--- a/indra/llui/llscrolllistctrl.cpp
+++ b/indra/llui/llscrolllistctrl.cpp
@@ -147,12 +147,9 @@ LLScrollListCtrl::Params::Params()
highlighted_color("highlighted_color"),
contents(""),
scroll_bar_bg_visible("scroll_bar_bg_visible"),
- scroll_bar_bg_color("scroll_bar_bg_color")
- , border("border")
-{
- name = "scroll_list";
- mouse_opaque = true;
-}
+ scroll_bar_bg_color("scroll_bar_bg_color"),
+ border("border")
+{}
LLScrollListCtrl::LLScrollListCtrl(const LLScrollListCtrl::Params& p)
: LLUICtrl(p),
@@ -178,6 +175,7 @@ LLScrollListCtrl::LLScrollListCtrl(const LLScrollListCtrl::Params& p)
mBorder(NULL),
mSortCallback(NULL),
mPopupMenu(NULL),
+ mCommentTextView(NULL),
mNumDynamicWidthColumns(0),
mTotalStaticColumnWidth(0),
mTotalColumnPadding(0),
@@ -322,6 +320,7 @@ LLScrollListCtrl::~LLScrollListCtrl()
delete mSortCallback;
std::for_each(mItemList.begin(), mItemList.end(), DeletePointer());
+ std::for_each(mColumns.begin(), mColumns.end(), DeletePairedPointer());
}
@@ -478,7 +477,12 @@ void LLScrollListCtrl::updateLayout()
getRect().getWidth() - 2 * mBorderThickness,
getRect().getHeight() - (2 * mBorderThickness ) - heading_size );
- getChildView("comment_text")->setShape(mItemListRect);
+ if (mCommentTextView == NULL)
+ {
+ mCommentTextView = getChildView("comment_text");
+ }
+
+ mCommentTextView->setShape(mItemListRect);
// how many lines of content in a single "page"
S32 page_lines = getLinesPerPage();
@@ -1482,8 +1486,9 @@ void LLScrollListCtrl::draw()
// Draw background
if (mBackgroundVisible)
{
+ F32 alpha = getCurrentTransparency();
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- gl_rect_2d(background, getEnabled() ? mBgWriteableColor.get() : mBgReadOnlyColor.get() );
+ gl_rect_2d(background, getEnabled() ? mBgWriteableColor.get() % alpha : mBgReadOnlyColor.get() % alpha );
}
if (mColumnsDirty)
@@ -2370,10 +2375,10 @@ void LLScrollListCtrl::onScrollChange( S32 new_pos, LLScrollbar* scrollbar )
void LLScrollListCtrl::sortByColumn(const std::string& name, BOOL ascending)
{
- std::map<std::string, LLScrollListColumn>::iterator itor = mColumns.find(name);
+ column_map_t::iterator itor = mColumns.find(name);
if (itor != mColumns.end())
{
- sortByColumnIndex((*itor).second.mIndex, ascending);
+ sortByColumnIndex((*itor).second->mIndex, ascending);
}
}
@@ -2419,11 +2424,11 @@ void LLScrollListCtrl::dirtyColumns()
// just in case someone indexes into it immediately
mColumnsIndexed.resize(mColumns.size());
- std::map<std::string, LLScrollListColumn>::iterator column_itor;
+ column_map_t::iterator column_itor;
for (column_itor = mColumns.begin(); column_itor != mColumns.end(); ++column_itor)
{
- LLScrollListColumn *column = &column_itor->second;
- mColumnsIndexed[column_itor->second.mIndex] = column;
+ LLScrollListColumn *column = column_itor->second;
+ mColumnsIndexed[column_itor->second->mIndex] = column;
}
}
@@ -2499,7 +2504,7 @@ void LLScrollListCtrl::copy()
{
buffer += (*itor)->getContentsCSV() + "\n";
}
- gClipboard.copyFromSubstring(utf8str_to_wstring(buffer), 0, buffer.length());
+ LLClipboard::instance().copyToClipboard(utf8str_to_wstring(buffer), 0, buffer.length());
}
// virtual
@@ -2581,8 +2586,8 @@ void LLScrollListCtrl::addColumn(const LLScrollListColumn::Params& column_params
if (mColumns.find(name) == mColumns.end())
{
// Add column
- mColumns[name] = LLScrollListColumn(column_params, this);
- LLScrollListColumn* new_column = &mColumns[name];
+ mColumns[name] = new LLScrollListColumn(column_params, this);
+ LLScrollListColumn* new_column = mColumns[name];
new_column->mIndex = mColumns.size()-1;
// Add button
@@ -2604,14 +2609,14 @@ void LLScrollListCtrl::addColumn(const LLScrollListColumn::Params& column_params
S32 top = mItemListRect.mTop;
S32 left = mItemListRect.mLeft;
- for (std::map<std::string, LLScrollListColumn>::iterator itor = mColumns.begin();
+ for (column_map_t::iterator itor = mColumns.begin();
itor != mColumns.end();
++itor)
{
- if (itor->second.mIndex < new_column->mIndex &&
- itor->second.getWidth() > 0)
+ if (itor->second->mIndex < new_column->mIndex &&
+ itor->second->getWidth() > 0)
{
- left += itor->second.getWidth() + mColumnPadding;
+ left += itor->second->getWidth() + mColumnPadding;
}
}
@@ -2667,8 +2672,8 @@ void LLScrollListCtrl::onClickColumn(void *userdata)
if (column->mSortingColumn != column->mName
&& parent->mColumns.find(column->mSortingColumn) != parent->mColumns.end())
{
- LLScrollListColumn& info_redir = parent->mColumns[column->mSortingColumn];
- column_index = info_redir.mIndex;
+ LLScrollListColumn* info_redir = parent->mColumns[column->mSortingColumn];
+ column_index = info_redir->mIndex;
}
// if this column is the primary sort key, reverse the direction
@@ -2701,16 +2706,17 @@ BOOL LLScrollListCtrl::hasSortOrder() const
void LLScrollListCtrl::clearColumns()
{
- std::map<std::string, LLScrollListColumn>::iterator itor;
+ column_map_t::iterator itor;
for (itor = mColumns.begin(); itor != mColumns.end(); ++itor)
{
- LLScrollColumnHeader *header = itor->second.mHeader;
+ LLScrollColumnHeader *header = itor->second->mHeader;
if (header)
{
removeChild(header);
delete header;
}
}
+ std::for_each(mColumns.begin(), mColumns.end(), DeletePairedPointer());
mColumns.clear();
mSortColumns.clear();
mTotalStaticColumnWidth = 0;
@@ -2744,7 +2750,7 @@ LLScrollListColumn* LLScrollListCtrl::getColumn(const std::string& name)
column_map_t::iterator column_itor = mColumns.find(name);
if (column_itor != mColumns.end())
{
- return &column_itor->second;
+ return column_itor->second;
}
return NULL;
}
@@ -2805,12 +2811,15 @@ LLScrollListItem* LLScrollListCtrl::addRow(LLScrollListItem *new_item, const LLS
new_column.width.pixel_width = cell_p.width;
}
addColumn(new_column);
- columnp = &mColumns[column];
+ columnp = mColumns[column];
new_item->setNumColumns(mColumns.size());
}
S32 index = columnp->mIndex;
- cell_p.width.setIfNotProvided(columnp->getWidth());
+ if (!cell_p.width.isProvided())
+ {
+ cell_p.width = columnp->getWidth();
+ }
LLScrollListCell* cell = LLScrollListCell::create(cell_p);
@@ -2842,7 +2851,7 @@ LLScrollListItem* LLScrollListCtrl::addRow(LLScrollListItem *new_item, const LLS
LLScrollListCell* cell = LLScrollListCell::create(LLScrollListCell::Params().value(item_p.value));
if (cell)
{
- LLScrollListColumn* columnp = &(mColumns.begin()->second);
+ LLScrollListColumn* columnp = mColumns.begin()->second;
new_item->setColumn(0, cell);
if (columnp->mHeader
@@ -2857,10 +2866,10 @@ LLScrollListItem* LLScrollListCtrl::addRow(LLScrollListItem *new_item, const LLS
// add dummy cells for missing columns
for (column_map_t::iterator column_it = mColumns.begin(); column_it != mColumns.end(); ++column_it)
{
- S32 column_idx = column_it->second.mIndex;
+ S32 column_idx = column_it->second->mIndex;
if (new_item->getColumn(column_idx) == NULL)
{
- LLScrollListColumn* column_ptr = &column_it->second;
+ LLScrollListColumn* column_ptr = column_it->second;
LLScrollListCell::Params cell_p;
cell_p.width = column_ptr->getWidth();
diff --git a/indra/llui/llscrolllistctrl.h b/indra/llui/llscrolllistctrl.h
index 8a2f893ba2..ae8aea9245 100644
--- a/indra/llui/llscrolllistctrl.h
+++ b/indra/llui/llscrolllistctrl.h
@@ -480,6 +480,8 @@ private:
S32 mHighlightedItem;
class LLViewBorder* mBorder;
LLContextMenu *mPopupMenu;
+
+ LLView *mCommentTextView;
LLWString mSearchString;
LLFrameTimer mSearchTimer;
@@ -491,7 +493,7 @@ private:
mutable bool mSorted;
- typedef std::map<std::string, LLScrollListColumn> column_map_t;
+ typedef std::map<std::string, LLScrollListColumn*> column_map_t;
column_map_t mColumns;
BOOL mDirty;
diff --git a/indra/llui/llscrolllistitem.cpp b/indra/llui/llscrolllistitem.cpp
index d95752e31c..5a1e96ab03 100644
--- a/indra/llui/llscrolllistitem.cpp
+++ b/indra/llui/llscrolllistitem.cpp
@@ -138,7 +138,7 @@ void LLScrollListItem::draw(const LLRect& rect, const LLColor4& fg_color, const
LLUI::pushMatrix();
{
- LLUI::translate((F32) cur_x, (F32) rect.mBottom, 0.0f);
+ LLUI::translate((F32) cur_x, (F32) rect.mBottom);
cell->draw( fg_color, highlight_color );
}
diff --git a/indra/llui/llscrolllistitem.h b/indra/llui/llscrolllistitem.h
index 611df729b4..13655b5873 100644
--- a/indra/llui/llscrolllistitem.h
+++ b/indra/llui/llscrolllistitem.h
@@ -33,10 +33,10 @@
#include "v4color.h"
#include "llinitparam.h"
#include "llscrolllistcell.h"
+#include "llcoord.h"
#include <vector>
-class LLCoordGL;
class LLCheckBoxCtrl;
class LLResizeBar;
class LLScrollListCtrl;
diff --git a/indra/llui/llsdparam.cpp b/indra/llui/llsdparam.cpp
index f97f80ab6c..0e29873bb0 100644
--- a/indra/llui/llsdparam.cpp
+++ b/indra/llui/llsdparam.cpp
@@ -34,6 +34,9 @@
static LLInitParam::Parser::parser_read_func_map_t sReadFuncs;
static LLInitParam::Parser::parser_write_func_map_t sWriteFuncs;
static LLInitParam::Parser::parser_inspect_func_map_t sInspectFuncs;
+static const LLSD NO_VALUE_MARKER;
+
+LLFastTimer::DeclareTimer FTM_SD_PARAM_ADAPTOR("LLSD to LLInitParam conversion");
//
// LLParamSDParser
@@ -45,6 +48,7 @@ LLParamSDParser::LLParamSDParser()
if (sReadFuncs.empty())
{
+ registerParserFuncs<LLInitParam::Flag>(readFlag, &LLParamSDParser::writeFlag);
registerParserFuncs<S32>(readS32, &LLParamSDParser::writeTypedValue<S32>);
registerParserFuncs<U32>(readU32, &LLParamSDParser::writeU32Param);
registerParserFuncs<F32>(readF32, &LLParamSDParser::writeTypedValue<F32>);
@@ -59,62 +63,52 @@ LLParamSDParser::LLParamSDParser()
}
// special case handling of U32 due to ambiguous LLSD::assign overload
-bool LLParamSDParser::writeU32Param(LLParamSDParser::parser_t& parser, const void* val_ptr, const parser_t::name_stack_t& name_stack)
+bool LLParamSDParser::writeU32Param(LLParamSDParser::parser_t& parser, const void* val_ptr, parser_t::name_stack_t& name_stack)
{
LLParamSDParser& sdparser = static_cast<LLParamSDParser&>(parser);
if (!sdparser.mWriteRootSD) return false;
- LLSD* sd_to_write = sdparser.getSDWriteNode(name_stack);
- if (!sd_to_write) return false;
+ parser_t::name_stack_range_t range(name_stack.begin(), name_stack.end());
+ LLSD& sd_to_write = LLParamSDParserUtilities::getSDWriteNode(*sdparser.mWriteRootSD, range);
+ sd_to_write.assign((S32)*((const U32*)val_ptr));
- sd_to_write->assign((S32)*((const U32*)val_ptr));
return true;
}
+bool LLParamSDParser::writeFlag(LLParamSDParser::parser_t& parser, const void* val_ptr, parser_t::name_stack_t& name_stack)
+{
+ LLParamSDParser& sdparser = static_cast<LLParamSDParser&>(parser);
+ if (!sdparser.mWriteRootSD) return false;
+
+ parser_t::name_stack_range_t range(name_stack.begin(), name_stack.end());
+ LLParamSDParserUtilities::getSDWriteNode(*sdparser.mWriteRootSD, range);
+
+ return true;
+}
+
+void LLParamSDParser::submit(LLInitParam::BaseBlock& block, const LLSD& sd, LLInitParam::Parser::name_stack_t& name_stack)
+{
+ mCurReadSD = &sd;
+ block.submitValue(name_stack, *this);
+}
+
void LLParamSDParser::readSD(const LLSD& sd, LLInitParam::BaseBlock& block, bool silent)
{
mCurReadSD = NULL;
mNameStack.clear();
setParseSilently(silent);
- readSDValues(sd, block);
+ LLParamSDParserUtilities::readSDValues(boost::bind(&LLParamSDParser::submit, this, boost::ref(block), _1, _2), sd, mNameStack);
+ //readSDValues(sd, block);
}
void LLParamSDParser::writeSD(LLSD& sd, const LLInitParam::BaseBlock& block)
{
mNameStack.clear();
mWriteRootSD = &sd;
- block.serializeBlock(*this);
-}
-void LLParamSDParser::readSDValues(const LLSD& sd, LLInitParam::BaseBlock& block)
-{
- if (sd.isMap())
- {
- for (LLSD::map_const_iterator it = sd.beginMap();
- it != sd.endMap();
- ++it)
- {
- mNameStack.push_back(make_pair(it->first, newParseGeneration()));
- readSDValues(it->second, block);
- mNameStack.pop_back();
- }
- }
- else if (sd.isArray())
- {
- for (LLSD::array_const_iterator it = sd.beginArray();
- it != sd.endArray();
- ++it)
- {
- mNameStack.back().second = newParseGeneration();
- readSDValues(*it, block);
- }
- }
- else
- {
- mCurReadSD = &sd;
- block.submitValue(mNameStack, *this);
- }
+ name_stack_t name_stack;
+ block.serializeBlock(*this, name_stack);
}
/*virtual*/ std::string LLParamSDParser::getCurrentElementName()
@@ -130,82 +124,14 @@ void LLParamSDParser::readSDValues(const LLSD& sd, LLInitParam::BaseBlock& block
return full_name;
}
-LLSD* LLParamSDParser::getSDWriteNode(const parser_t::name_stack_t& name_stack)
-{
- //TODO: implement nested LLSD writing
- LLSD* sd_to_write = mWriteRootSD;
- bool new_traversal = false;
- for (name_stack_t::const_iterator it = name_stack.begin(), prev_it = mNameStack.begin();
- it != name_stack.end();
- ++it)
- {
- bool new_array_entry = false;
- if (prev_it == mNameStack.end())
- {
- new_traversal = true;
- }
- else
- {
- if (!new_traversal // have not diverged yet from previous trace
- && prev_it->first == it->first // names match
- && prev_it->second != it->second) // versions differ
- {
- // name stacks match, but version numbers differ in last place.
- // create a different entry at this point using an LLSD array
- new_array_entry = true;
- }
- if (prev_it->first != it->first // names differ
- || prev_it->second != it->second) // versions differ
- {
- // at this point we have diverged from our last trace
- // so any elements referenced here are new
- new_traversal = true;
- }
- }
- LLSD* child_sd = &(*sd_to_write)[it->first];
-
- if (child_sd->isArray())
- {
- if (new_traversal)
- {
- // write to new element at end
- sd_to_write = &(*child_sd)[child_sd->size()];
- }
- else
- {
- // write to last of existing elements, or first element if empty
- sd_to_write = &(*child_sd)[llmax(0, child_sd->size() - 1)];
- }
- }
- else
- {
- if (new_array_entry && !child_sd->isArray())
- {
- // copy child contents into first element of an array
- LLSD new_array = LLSD::emptyArray();
- new_array.append(*child_sd);
- // assign array to slot that previously held the single value
- *child_sd = new_array;
- // return next element in that array
- sd_to_write = &((*child_sd)[1]);
- }
- else
- {
- sd_to_write = child_sd;
- }
- }
- if (prev_it != mNameStack.end())
- {
- ++prev_it;
- }
- }
- mNameStack = name_stack;
-
- //llinfos << ll_pretty_print_sd(*mWriteRootSD) << llendl;
- return sd_to_write;
+bool LLParamSDParser::readFlag(Parser& parser, void* val_ptr)
+{
+ LLParamSDParser& self = static_cast<LLParamSDParser&>(parser);
+ return self.mCurReadSD == &NO_VALUE_MARKER;
}
+
bool LLParamSDParser::readS32(Parser& parser, void* val_ptr)
{
LLParamSDParser& self = static_cast<LLParamSDParser&>(parser);
@@ -285,3 +211,132 @@ bool LLParamSDParser::readSD(Parser& parser, void* val_ptr)
*((LLSD*)val_ptr) = *self.mCurReadSD;
return true;
}
+
+// static
+LLSD& LLParamSDParserUtilities::getSDWriteNode(LLSD& input, LLInitParam::Parser::name_stack_range_t& name_stack_range)
+{
+ LLSD* sd_to_write = &input;
+
+ for (LLInitParam::Parser::name_stack_t::iterator it = name_stack_range.first;
+ it != name_stack_range.second;
+ ++it)
+ {
+ bool new_traversal = it->second;
+
+ LLSD* child_sd = it->first.empty() ? sd_to_write : &(*sd_to_write)[it->first];
+
+ if (child_sd->isArray())
+ {
+ if (new_traversal)
+ {
+ // write to new element at end
+ sd_to_write = &(*child_sd)[child_sd->size()];
+ }
+ else
+ {
+ // write to last of existing elements, or first element if empty
+ sd_to_write = &(*child_sd)[llmax(0, child_sd->size() - 1)];
+ }
+ }
+ else
+ {
+ if (new_traversal
+ && child_sd->isDefined()
+ && !child_sd->isArray())
+ {
+ // copy child contents into first element of an array
+ LLSD new_array = LLSD::emptyArray();
+ new_array.append(*child_sd);
+ // assign array to slot that previously held the single value
+ *child_sd = new_array;
+ // return next element in that array
+ sd_to_write = &((*child_sd)[1]);
+ }
+ else
+ {
+ sd_to_write = child_sd;
+ }
+ }
+ it->second = false;
+ }
+
+ return *sd_to_write;
+}
+
+//static
+void LLParamSDParserUtilities::readSDValues(read_sd_cb_t cb, const LLSD& sd, LLInitParam::Parser::name_stack_t& stack)
+{
+ if (sd.isMap())
+ {
+ for (LLSD::map_const_iterator it = sd.beginMap();
+ it != sd.endMap();
+ ++it)
+ {
+ stack.push_back(make_pair(it->first, true));
+ readSDValues(cb, it->second, stack);
+ stack.pop_back();
+ }
+ }
+ else if (sd.isArray())
+ {
+ for (LLSD::array_const_iterator it = sd.beginArray();
+ it != sd.endArray();
+ ++it)
+ {
+ stack.back().second = true;
+ readSDValues(cb, *it, stack);
+ }
+ }
+ else if (sd.isUndefined())
+ {
+ if (!cb.empty())
+ {
+ cb(NO_VALUE_MARKER, stack);
+ }
+ }
+ else
+ {
+ if (!cb.empty())
+ {
+ cb(sd, stack);
+ }
+ }
+}
+
+//static
+void LLParamSDParserUtilities::readSDValues(read_sd_cb_t cb, const LLSD& sd)
+{
+ LLInitParam::Parser::name_stack_t stack = LLInitParam::Parser::name_stack_t();
+ readSDValues(cb, sd, stack);
+}
+namespace LLInitParam
+{
+ // LLSD specialization
+ // block param interface
+ bool ParamValue<LLSD, TypeValues<LLSD>, false>::deserializeBlock(Parser& p, Parser::name_stack_range_t name_stack, bool new_name)
+ {
+ LLSD& sd = LLParamSDParserUtilities::getSDWriteNode(mValue, name_stack);
+
+ LLSD::String string;
+
+ if (p.readValue<LLSD::String>(string))
+ {
+ sd = string;
+ return true;
+ }
+ return false;
+ }
+
+ //static
+ void ParamValue<LLSD, TypeValues<LLSD>, false>::serializeElement(Parser& p, const LLSD& sd, Parser::name_stack_t& name_stack)
+ {
+ p.writeValue<LLSD::String>(sd.asString(), name_stack);
+ }
+
+ void ParamValue<LLSD, TypeValues<LLSD>, false>::serializeBlock(Parser& p, Parser::name_stack_t& name_stack, const BaseBlock* diff_block) const
+ {
+ // read from LLSD value and serialize out to parser (which could be LLSD, XUI, etc)
+ Parser::name_stack_t stack;
+ LLParamSDParserUtilities::readSDValues(boost::bind(&serializeElement, boost::ref(p), _1, _2), mValue, stack);
+ }
+}
diff --git a/indra/llui/llsdparam.h b/indra/llui/llsdparam.h
index 97e8b58e49..3dfc6d020e 100644
--- a/indra/llui/llsdparam.h
+++ b/indra/llui/llsdparam.h
@@ -29,6 +29,16 @@
#define LL_LLSDPARAM_H
#include "llinitparam.h"
+#include "boost/function.hpp"
+
+struct LLParamSDParserUtilities
+{
+ static LLSD& getSDWriteNode(LLSD& input, LLInitParam::Parser::name_stack_range_t& name_stack_range);
+
+ typedef boost::function<void (const LLSD&, LLInitParam::Parser::name_stack_t&)> read_sd_cb_t;
+ static void readSDValues(read_sd_cb_t cb, const LLSD& sd, LLInitParam::Parser::name_stack_t& stack);
+ static void readSDValues(read_sd_cb_t cb, const LLSD& sd);
+};
class LLParamSDParser
: public LLInitParam::Parser
@@ -45,25 +55,25 @@ public:
/*virtual*/ std::string getCurrentElementName();
private:
- void readSDValues(const LLSD& sd, LLInitParam::BaseBlock& block);
+ void submit(LLInitParam::BaseBlock& block, const LLSD& sd, LLInitParam::Parser::name_stack_t& name_stack);
template<typename T>
- static bool writeTypedValue(Parser& parser, const void* val_ptr, const parser_t::name_stack_t& name_stack)
+ static bool writeTypedValue(Parser& parser, const void* val_ptr, parser_t::name_stack_t& name_stack)
{
LLParamSDParser& sdparser = static_cast<LLParamSDParser&>(parser);
if (!sdparser.mWriteRootSD) return false;
- LLSD* sd_to_write = sdparser.getSDWriteNode(name_stack);
- if (!sd_to_write) return false;
+ LLInitParam::Parser::name_stack_range_t range(name_stack.begin(), name_stack.end());
+ LLSD& sd_to_write = LLParamSDParserUtilities::getSDWriteNode(*sdparser.mWriteRootSD, range);
- sd_to_write->assign(*((const T*)val_ptr));
+ sd_to_write.assign(*((const T*)val_ptr));
return true;
}
- LLSD* getSDWriteNode(const parser_t::name_stack_t& name_stack);
-
- static bool writeU32Param(Parser& parser, const void* value_ptr, const parser_t::name_stack_t& name_stack);
+ static bool writeU32Param(Parser& parser, const void* value_ptr, parser_t::name_stack_t& name_stack);
+ static bool writeFlag(Parser& parser, const void* value_ptr, parser_t::name_stack_t& name_stack);
+ static bool readFlag(Parser& parser, void* val_ptr);
static bool readS32(Parser& parser, void* val_ptr);
static bool readU32(Parser& parser, void* val_ptr);
static bool readF32(Parser& parser, void* val_ptr);
@@ -81,22 +91,36 @@ private:
LLSD* mCurWriteSD;
};
+
+extern LLFastTimer::DeclareTimer FTM_SD_PARAM_ADAPTOR;
template<typename T>
class LLSDParamAdapter : public T
+{
+public:
+ LLSDParamAdapter() {}
+ LLSDParamAdapter(const LLSD& sd)
{
- public:
- LLSDParamAdapter() {}
- LLSDParamAdapter(const LLSD& sd)
- {
- LLParamSDParser parser;
- parser.readSD(sd, *this);
- }
+ LLFastTimer _(FTM_SD_PARAM_ADAPTOR);
+ LLParamSDParser parser;
+ // don't spam for implicit parsing of LLSD, as we want to allow arbitrary freeform data and ignore most of it
+ bool parse_silently = true;
+ parser.readSD(sd, *this, parse_silently);
+ }
+
+ operator LLSD() const
+ {
+ LLParamSDParser parser;
+ LLSD sd;
+ parser.writeSD(sd, *this);
+ return sd;
+ }
- LLSDParamAdapter(const T& val)
- {
- T::operator=(val);
- }
- };
+ LLSDParamAdapter(const T& val)
+ : T(val)
+ {
+ T::operator=(val);
+ }
+};
#endif // LL_LLSDPARAM_H
diff --git a/indra/llui/llsearcheditor.h b/indra/llui/llsearcheditor.h
index f5c3b532c4..c2d7916938 100644
--- a/indra/llui/llsearcheditor.h
+++ b/indra/llui/llsearcheditor.h
@@ -55,9 +55,7 @@ public:
search_button_visible("search_button_visible"),
clear_button("clear_button"),
clear_button_visible("clear_button_visible")
- {
- name = "search_editor";
- }
+ {}
};
void setCommitOnFocusLost(BOOL b) { if (mSearchEditor) mSearchEditor->setCommitOnFocusLost(b); }
diff --git a/indra/llui/llslider.cpp b/indra/llui/llslider.cpp
index 013950a5ad..db72234f94 100644
--- a/indra/llui/llslider.cpp
+++ b/indra/llui/llslider.cpp
@@ -54,9 +54,7 @@ LLSlider::Params::Params()
track_highlight_vertical_image("track_highlight_vertical_image"),
mouse_down_callback("mouse_down_callback"),
mouse_up_callback("mouse_up_callback")
-{
- follows.flags(FOLLOWS_LEFT | FOLLOWS_TOP);
-}
+{}
LLSlider::LLSlider(const LLSlider::Params& p)
: LLF32UICtrl(p),
diff --git a/indra/llui/llslider.h b/indra/llui/llslider.h
index 68823ed68e..700c17ea3e 100644
--- a/indra/llui/llslider.h
+++ b/indra/llui/llslider.h
@@ -29,6 +29,7 @@
#include "llf32uictrl.h"
#include "v4color.h"
+#include "lluiimage.h"
class LLSlider : public LLF32UICtrl
{
diff --git a/indra/llui/llsliderctrl.cpp b/indra/llui/llsliderctrl.cpp
index d760178e35..583ed1ed2e 100644
--- a/indra/llui/llsliderctrl.cpp
+++ b/indra/llui/llsliderctrl.cpp
@@ -76,8 +76,14 @@ LLSliderCtrl::LLSliderCtrl(const LLSliderCtrl::Params& p)
}
LLRect label_rect( left, top, label_width, bottom );
LLTextBox::Params params(p.slider_label);
- params.rect.setIfNotProvided(label_rect);
- params.font.setIfNotProvided(p.font);
+ if (!params.rect.isProvided())
+ {
+ params.rect = label_rect;
+ }
+ if (!params.font.isProvided())
+ {
+ params.font = p.font;
+ }
params.initial_value(p.label());
mLabelBox = LLUICtrlFactory::create<LLTextBox> (params);
addChild(mLabelBox);
@@ -113,15 +119,33 @@ LLSliderCtrl::LLSliderCtrl(const LLSliderCtrl::Params& p)
S32 slider_left = label_width ? label_width + sliderctrl_spacing : 0;
LLSlider::Params slider_p(p.slider_bar);
slider_p.name("slider_bar");
- slider_p.rect.setIfNotProvided(LLRect(slider_left,top,slider_right,bottom));
- slider_p.initial_value.setIfNotProvided(p.initial_value().asReal());
- slider_p.min_value.setIfNotProvided(p.min_value);
- slider_p.max_value.setIfNotProvided(p.max_value);
- slider_p.increment.setIfNotProvided(p.increment);
- slider_p.orientation.setIfNotProvided(p.orientation);
+ if (!slider_p.rect.isProvided())
+ {
+ slider_p.rect = LLRect(slider_left,top,slider_right,bottom);
+ }
+ if (!slider_p.initial_value.isProvided())
+ {
+ slider_p.initial_value = p.initial_value().asReal();
+ }
+ if (!slider_p.min_value.isProvided())
+ {
+ slider_p.min_value = p.min_value;
+ }
+ if (!slider_p.max_value.isProvided())
+ {
+ slider_p.max_value = p.max_value;
+ }
+ if (!slider_p.increment.isProvided())
+ {
+ slider_p.increment = p.increment;
+ }
+ if (!slider_p.orientation.isProvided())
+ {
+ slider_p.orientation = p.orientation;
+ }
- slider_p.commit_callback.function(&LLSliderCtrl::onSliderCommit);
- slider_p.control_name(p.control_name);
+ slider_p.commit_callback.function = &LLSliderCtrl::onSliderCommit;
+ slider_p.control_name = p.control_name;
slider_p.mouse_down_callback( p.mouse_down_callback );
slider_p.mouse_up_callback( p.mouse_up_callback );
mSlider = LLUICtrlFactory::create<LLSlider> (slider_p);
@@ -134,8 +158,15 @@ LLSliderCtrl::LLSliderCtrl(const LLSliderCtrl::Params& p)
if( p.can_edit_text() )
{
LLLineEditor::Params line_p(p.value_editor);
- line_p.rect.setIfNotProvided(text_rect);
- line_p.font.setIfNotProvided(p.font);
+ if (!line_p.rect.isProvided())
+ {
+ line_p.rect = text_rect;
+ }
+ if (!line_p.font.isProvided())
+ {
+ line_p.font = p.font;
+ }
+
line_p.commit_callback.function(&LLSliderCtrl::onEditorCommit);
line_p.prevalidate_callback(&LLTextValidate::validateFloat);
mEditor = LLUICtrlFactory::create<LLLineEditor>(line_p);
@@ -149,8 +180,14 @@ LLSliderCtrl::LLSliderCtrl(const LLSliderCtrl::Params& p)
else
{
LLTextBox::Params text_p(p.value_text);
- text_p.rect.setIfNotProvided(text_rect);
- text_p.font.setIfNotProvided(p.font);
+ if (!text_p.rect.isProvided())
+ {
+ text_p.rect = text_rect;
+ }
+ if (!text_p.font.isProvided())
+ {
+ text_p.font = p.font;
+ }
mTextBox = LLUICtrlFactory::create<LLTextBox>(text_p);
addChild(mTextBox);
}
diff --git a/indra/llui/llspinctrl.cpp b/indra/llui/llspinctrl.cpp
index 6b4e9cf923..934879cdfd 100644
--- a/indra/llui/llspinctrl.cpp
+++ b/indra/llui/llspinctrl.cpp
@@ -44,7 +44,7 @@
#include "llresmgr.h"
#include "lluictrlfactory.h"
-const U32 MAX_STRING_LENGTH = 32;
+const U32 MAX_STRING_LENGTH = 255;
static LLDefaultChildRegistry::Register<LLSpinCtrl> r2("spinner");
@@ -52,6 +52,7 @@ LLSpinCtrl::Params::Params()
: label_width("label_width"),
decimal_digits("decimal_digits"),
allow_text_entry("allow_text_entry", true),
+ label_wrap("label_wrap", false),
text_enabled_color("text_enabled_color"),
text_disabled_color("text_disabled_color"),
up_button("up_button"),
@@ -80,6 +81,7 @@ LLSpinCtrl::LLSpinCtrl(const LLSpinCtrl::Params& p)
{
LLRect label_rect( 0, centered_top, label_width, centered_bottom );
LLTextBox::Params params;
+ params.wrap(p.label_wrap);
params.name("SpinCtrl Label");
params.rect(label_rect);
params.initial_value(p.label());
@@ -122,14 +124,7 @@ LLSpinCtrl::LLSpinCtrl(const LLSpinCtrl::Params& p)
params.max_length.bytes(MAX_STRING_LENGTH);
params.commit_callback.function((boost::bind(&LLSpinCtrl::onEditorCommit, this, _2)));
- if( mPrecision>0 )//should accept float numbers
- {
- params.prevalidate_callback(&LLTextValidate::validateFloat);
- }
- else //should accept int numbers
- {
- params.prevalidate_callback(&LLTextValidate::validateInt);
- }
+ //*NOTE: allow entering of any chars for LLCalc, proper input will be evaluated on commit
params.follows.flags(FOLLOWS_LEFT | FOLLOWS_BOTTOM);
mEditor = LLUICtrlFactory::create<LLLineEditor> (params);
@@ -138,6 +133,7 @@ LLSpinCtrl::LLSpinCtrl(const LLSpinCtrl::Params& p)
// than when it doesn't. Instead, if you always have to double click to select all the text,
// it's easier to understand
//mEditor->setSelectAllonFocusReceived(TRUE);
+ mEditor->setSelectAllonCommit(FALSE);
addChild(mEditor);
updateEditor();
@@ -302,9 +298,10 @@ void LLSpinCtrl::onEditorCommit( const LLSD& data )
{
BOOL success = FALSE;
- std::string text = mEditor->getText();
- if( LLLineEditor::postvalidateFloat( text ) )
+ if( mEditor->evaluateFloat() )
{
+ std::string text = mEditor->getText();
+
LLLocale locale(LLLocale::USER_LOCALE);
F32 val = (F32) atof(text.c_str());
@@ -325,7 +322,11 @@ void LLSpinCtrl::onEditorCommit( const LLSD& data )
}
updateEditor();
- if( !success )
+ if( success )
+ {
+ updateEditor();
+ }
+ else
{
reportInvalidData();
}
diff --git a/indra/llui/llspinctrl.h b/indra/llui/llspinctrl.h
index 8960971594..87814f838e 100644
--- a/indra/llui/llspinctrl.h
+++ b/indra/llui/llspinctrl.h
@@ -44,6 +44,7 @@ public:
Optional<S32> label_width;
Optional<U32> decimal_digits;
Optional<bool> allow_text_entry;
+ Optional<bool> label_wrap;
Optional<LLUIColor> text_enabled_color;
Optional<LLUIColor> text_disabled_color;
@@ -95,6 +96,9 @@ public:
void onUpBtn(const LLSD& data);
void onDownBtn(const LLSD& data);
+
+ const LLColor4& getEnabledTextColor() const { return mTextEnabledColor.get(); }
+ const LLColor4& getDisabledTextColor() const { return mTextDisabledColor.get(); }
private:
void updateLabelColor();
diff --git a/indra/llui/llstatbar.h b/indra/llui/llstatbar.h
index 62a9db82fe..513fff3234 100644
--- a/indra/llui/llstatbar.h
+++ b/indra/llui/llstatbar.h
@@ -65,7 +65,7 @@ public:
show_mean("show_mean", TRUE),
stat("stat")
{
- follows.flags(FOLLOWS_TOP | FOLLOWS_LEFT);
+ changeDefault(follows.flags, FOLLOWS_TOP | FOLLOWS_LEFT);
}
};
LLStatBar(const Params&);
diff --git a/indra/llui/llstatview.h b/indra/llui/llstatview.h
index 22a9fcd672..5abdc42448 100644
--- a/indra/llui/llstatview.h
+++ b/indra/llui/llstatview.h
@@ -46,7 +46,7 @@ public:
Params()
: setting("setting")
{
- follows.flags(FOLLOWS_TOP | FOLLOWS_LEFT);
+ changeDefault(follows.flags, FOLLOWS_TOP | FOLLOWS_LEFT);
}
};
diff --git a/indra/llui/llstyle.cpp b/indra/llui/llstyle.cpp
index 28a064e6b6..bb731f4f7e 100644
--- a/indra/llui/llstyle.cpp
+++ b/indra/llui/llstyle.cpp
@@ -88,7 +88,7 @@ void LLStyle::setVisible(BOOL is_visible)
mVisible = is_visible;
}
-LLUIImagePtr LLStyle::getImage() const
+LLPointer<LLUIImage> LLStyle::getImage() const
{
return mImagep;
}
diff --git a/indra/llui/llstyle.h b/indra/llui/llstyle.h
index 322edc343c..9f1eba79d8 100644
--- a/indra/llui/llstyle.h
+++ b/indra/llui/llstyle.h
@@ -30,6 +30,7 @@
#include "v4color.h"
#include "llui.h"
#include "llinitparam.h"
+#include "lluiimage.h"
class LLFontGL;
@@ -72,7 +73,7 @@ public:
void setLinkHREF(const std::string& href);
BOOL isLink() const;
- LLUIImagePtr getImage() const;
+ LLPointer<LLUIImage> getImage() const;
void setImage(const LLUUID& src);
void setImage(const std::string& name);
@@ -108,7 +109,7 @@ private:
const LLFontGL* mFont;
std::string mLink;
bool mIsLink;
- LLUIImagePtr mImagep;
+ LLPointer<LLUIImage> mImagep;
};
typedef LLPointer<LLStyle> LLStyleSP;
diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp
index 7f0d650403..5fc2cc350d 100644
--- a/indra/llui/lltabcontainer.cpp
+++ b/indra/llui/lltabcontainer.cpp
@@ -98,24 +98,25 @@ class LLCustomButtonIconCtrl : public LLButton
{
public:
struct Params
- : public LLInitParam::Block<Params, LLButton::Params>
+ : public LLInitParam::Block<Params, LLButton::Params>
{
// LEFT, RIGHT, TOP, BOTTOM paddings of LLIconCtrl in this class has same value
Optional<S32> icon_ctrl_pad;
- Params():
- icon_ctrl_pad("icon_ctrl_pad", 1)
+ Params()
+ : icon_ctrl_pad("icon_ctrl_pad", 1)
{}
};
protected:
friend class LLUICtrlFactory;
- LLCustomButtonIconCtrl(const Params& p):
- LLButton(p),
+
+ LLCustomButtonIconCtrl(const Params& p)
+ : LLButton(p),
mIcon(NULL),
mIconAlignment(LLFontGL::HCENTER),
mIconCtrlPad(p.icon_ctrl_pad)
- {}
+ {}
public:
@@ -214,13 +215,11 @@ LLTabContainer::Params::Params()
middle_tab("middle_tab"),
last_tab("last_tab"),
use_custom_icon_ctrl("use_custom_icon_ctrl", false),
+ open_tabs_on_drag_and_drop("open_tabs_on_drag_and_drop", false),
tab_icon_ctrl_pad("tab_icon_ctrl_pad", 0),
use_ellipses("use_ellipses"),
font_halign("halign")
-{
- name(std::string("tab_container"));
- mouse_opaque = false;
-}
+{}
LLTabContainer::LLTabContainer(const LLTabContainer::Params& p)
: LLPanel(p),
@@ -253,6 +252,7 @@ LLTabContainer::LLTabContainer(const LLTabContainer::Params& p)
mMiddleTabParams(p.middle_tab),
mLastTabParams(p.last_tab),
mCustomIconCtrlUsed(p.use_custom_icon_ctrl),
+ mOpenTabsOnDragAndDrop(p.open_tabs_on_drag_and_drop),
mTabIconCtrlPad(p.tab_icon_ctrl_pad),
mUseTabEllipses(p.use_ellipses)
{
@@ -551,23 +551,23 @@ BOOL LLTabContainer::handleMouseDown( S32 x, S32 y, MASK mask )
}
S32 tab_count = getTabCount();
- if (tab_count > 0)
+ if (tab_count > 0 && !getTabsHidden())
{
LLTabTuple* firsttuple = getTab(0);
LLRect tab_rect;
if (mIsVertical)
{
tab_rect = LLRect(firsttuple->mButton->getRect().mLeft,
- has_scroll_arrows ? mPrevArrowBtn->getRect().mBottom - tabcntrv_pad : mPrevArrowBtn->getRect().mTop,
- firsttuple->mButton->getRect().mRight,
- has_scroll_arrows ? mNextArrowBtn->getRect().mTop + tabcntrv_pad : mNextArrowBtn->getRect().mBottom );
+ has_scroll_arrows ? mPrevArrowBtn->getRect().mBottom - tabcntrv_pad : mPrevArrowBtn->getRect().mTop,
+ firsttuple->mButton->getRect().mRight,
+ has_scroll_arrows ? mNextArrowBtn->getRect().mTop + tabcntrv_pad : mNextArrowBtn->getRect().mBottom );
}
else
{
tab_rect = LLRect(has_scroll_arrows ? mPrevArrowBtn->getRect().mRight : mJumpPrevArrowBtn->getRect().mLeft,
- firsttuple->mButton->getRect().mTop,
- has_scroll_arrows ? mNextArrowBtn->getRect().mLeft : mJumpNextArrowBtn->getRect().mRight,
- firsttuple->mButton->getRect().mBottom );
+ firsttuple->mButton->getRect().mTop,
+ has_scroll_arrows ? mNextArrowBtn->getRect().mLeft : mJumpNextArrowBtn->getRect().mRight,
+ firsttuple->mButton->getRect().mBottom );
}
if( tab_rect.pointInRect( x, y ) )
{
@@ -684,7 +684,7 @@ BOOL LLTabContainer::handleToolTip( S32 x, S32 y, MASK mask)
{
static LLUICachedControl<S32> tabcntrv_pad ("UITabCntrvPad", 0);
BOOL handled = LLPanel::handleToolTip( x, y, mask);
- if (!handled && getTabCount() > 0)
+ if (!handled && getTabCount() > 0 && !getTabsHidden())
{
LLTabTuple* firsttuple = getTab(0);
@@ -815,48 +815,62 @@ BOOL LLTabContainer::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, EDrag
{
BOOL has_scroll_arrows = (getMaxScrollPos() > 0);
- if( mDragAndDropDelayTimer.getStarted() && mDragAndDropDelayTimer.getElapsedTimeF32() > SCROLL_DELAY_TIME )
+ if(mOpenTabsOnDragAndDrop && !getTabsHidden())
{
- if (has_scroll_arrows)
+ // In that case, we'll open the hovered tab while dragging and dropping items.
+ // This allows for drilling through tabs.
+ if (mDragAndDropDelayTimer.getStarted())
{
- if (mJumpPrevArrowBtn && mJumpPrevArrowBtn->getRect().pointInRect(x, y))
- {
- S32 local_x = x - mJumpPrevArrowBtn->getRect().mLeft;
- S32 local_y = y - mJumpPrevArrowBtn->getRect().mBottom;
- mJumpPrevArrowBtn->handleHover(local_x, local_y, mask);
- }
- if (mJumpNextArrowBtn && mJumpNextArrowBtn->getRect().pointInRect(x, y))
+ if (mDragAndDropDelayTimer.getElapsedTimeF32() > SCROLL_DELAY_TIME)
{
- S32 local_x = x - mJumpNextArrowBtn->getRect().mLeft;
- S32 local_y = y - mJumpNextArrowBtn->getRect().mBottom;
- mJumpNextArrowBtn->handleHover(local_x, local_y, mask);
- }
- if (mPrevArrowBtn->getRect().pointInRect(x, y))
- {
- S32 local_x = x - mPrevArrowBtn->getRect().mLeft;
- S32 local_y = y - mPrevArrowBtn->getRect().mBottom;
- mPrevArrowBtn->handleHover(local_x, local_y, mask);
- }
- else if (mNextArrowBtn->getRect().pointInRect(x, y))
- {
- S32 local_x = x - mNextArrowBtn->getRect().mLeft;
- S32 local_y = y - mNextArrowBtn->getRect().mBottom;
- mNextArrowBtn->handleHover(local_x, local_y, mask);
- }
- }
+ if (has_scroll_arrows)
+ {
+ if (mJumpPrevArrowBtn && mJumpPrevArrowBtn->getRect().pointInRect(x, y))
+ {
+ S32 local_x = x - mJumpPrevArrowBtn->getRect().mLeft;
+ S32 local_y = y - mJumpPrevArrowBtn->getRect().mBottom;
+ mJumpPrevArrowBtn->handleHover(local_x, local_y, mask);
+ }
+ if (mJumpNextArrowBtn && mJumpNextArrowBtn->getRect().pointInRect(x, y))
+ {
+ S32 local_x = x - mJumpNextArrowBtn->getRect().mLeft;
+ S32 local_y = y - mJumpNextArrowBtn->getRect().mBottom;
+ mJumpNextArrowBtn->handleHover(local_x, local_y, mask);
+ }
+ if (mPrevArrowBtn->getRect().pointInRect(x, y))
+ {
+ S32 local_x = x - mPrevArrowBtn->getRect().mLeft;
+ S32 local_y = y - mPrevArrowBtn->getRect().mBottom;
+ mPrevArrowBtn->handleHover(local_x, local_y, mask);
+ }
+ else if (mNextArrowBtn->getRect().pointInRect(x, y))
+ {
+ S32 local_x = x - mNextArrowBtn->getRect().mLeft;
+ S32 local_y = y - mNextArrowBtn->getRect().mBottom;
+ mNextArrowBtn->handleHover(local_x, local_y, mask);
+ }
+ }
- for(tuple_list_t::iterator iter = mTabList.begin(); iter != mTabList.end(); ++iter)
- {
- LLTabTuple* tuple = *iter;
- tuple->mButton->setVisible( TRUE );
- S32 local_x = x - tuple->mButton->getRect().mLeft;
- S32 local_y = y - tuple->mButton->getRect().mBottom;
- if (tuple->mButton->pointInView(local_x, local_y) && tuple->mButton->getEnabled() && !tuple->mTabPanel->getVisible())
- {
- tuple->mButton->onCommit();
+ for(tuple_list_t::iterator iter = mTabList.begin(); iter != mTabList.end(); ++iter)
+ {
+ LLTabTuple* tuple = *iter;
+ tuple->mButton->setVisible( TRUE );
+ S32 local_x = x - tuple->mButton->getRect().mLeft;
+ S32 local_y = y - tuple->mButton->getRect().mBottom;
+ if (tuple->mButton->pointInView(local_x, local_y) && tuple->mButton->getEnabled() && !tuple->mTabPanel->getVisible())
+ {
+ tuple->mButton->onCommit();
+ }
+ }
+ // Stop the timer whether successful or not. Don't let it run forever.
mDragAndDropDelayTimer.stop();
}
}
+ else
+ {
+ // Start a timer so we don't open tabs as soon as we hover on them
+ mDragAndDropDelayTimer.start();
+ }
}
return LLView::handleDragAndDrop(x, y, mask, drop, type, cargo_data, accept, tooltip);
@@ -1026,85 +1040,50 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel)
}
else
{
+ LLButton::Params& p = (mCustomIconCtrlUsed ? custom_btn_params : normal_btn_params);
+
+ p.rect(btn_rect);
+ p.font(mFont);
+ p.font_halign = mFontHalign;
+ p.label(trimmed_label);
+ p.click_callback.function(boost::bind(&LLTabContainer::onTabBtn, this, _2, child));
+ if (indent)
+ {
+ p.pad_left(indent);
+ }
+ p.pad_bottom( mLabelPadBottom );
+ p.scale_image(true);
+ p.tab_stop(false);
+ p.label_shadow(false);
+ p.follows.flags = FOLLOWS_LEFT;
+
if (mIsVertical)
{
- LLButton::Params& p = (mCustomIconCtrlUsed)?
- custom_btn_params:normal_btn_params;
-
p.name(std::string("vert tab button"));
- p.rect(btn_rect);
- p.follows.flags(FOLLOWS_TOP | FOLLOWS_LEFT);
- p.click_callback.function(boost::bind(&LLTabContainer::onTabBtn, this, _2, child));
- p.font(mFont);
- p.label(trimmed_label);
p.image_unselected(mMiddleTabParams.tab_left_image_unselected);
p.image_selected(mMiddleTabParams.tab_left_image_selected);
- p.scale_image(true);
- p.font_halign = mFontHalign;
- p.pad_bottom( mLabelPadBottom );
- p.tab_stop(false);
- p.label_shadow(false);
- if (indent)
- {
- p.pad_left(indent);
- }
-
-
- if(mCustomIconCtrlUsed)
- {
- btn = LLUICtrlFactory::create<LLCustomButtonIconCtrl>(custom_btn_params);
-
- }
- else
- {
- btn = LLUICtrlFactory::create<LLButton>(p);
- }
+ p.follows.flags = p.follows.flags() | FOLLOWS_TOP;
}
else
{
- LLButton::Params& p = (mCustomIconCtrlUsed)?
- custom_btn_params:normal_btn_params;
p.name(std::string(child->getName()) + " tab");
- p.rect(btn_rect);
- p.click_callback.function(boost::bind(&LLTabContainer::onTabBtn, this, _2, child));
- p.font(mFont);
- p.label(trimmed_label);
p.visible(false);
- p.scale_image(true);
p.image_unselected(tab_img);
p.image_selected(tab_selected_img);
- p.tab_stop(false);
- p.label_shadow(false);
+ p.follows.flags = p.follows.flags() | (getTabPosition() == TOP ? FOLLOWS_TOP : FOLLOWS_BOTTOM);
// Try to squeeze in a bit more text
p.pad_left( mLabelPadLeft );
p.pad_right(2);
- p.pad_bottom( mLabelPadBottom );
- p.font_halign = mFontHalign;
- p.follows.flags = FOLLOWS_LEFT;
- p.follows.flags = FOLLOWS_LEFT;
-
- if (indent)
- {
- p.pad_left(indent);
- }
-
- if( getTabPosition() == TOP )
- {
- p.follows.flags = p.follows.flags() | FOLLOWS_TOP;
- }
- else
- {
- p.follows.flags = p.follows.flags() | FOLLOWS_BOTTOM;
- }
-
- if(mCustomIconCtrlUsed)
- {
- btn = LLUICtrlFactory::create<LLCustomButtonIconCtrl>(custom_btn_params);
- }
- else
- {
- btn = LLUICtrlFactory::create<LLButton>(p);
- }
+ }
+
+ // *TODO : It seems wrong not to use p in both cases considering the way p is initialized
+ if (mCustomIconCtrlUsed)
+ {
+ btn = LLUICtrlFactory::create<LLCustomButtonIconCtrl>(custom_btn_params);
+ }
+ else
+ {
+ btn = LLUICtrlFactory::create<LLButton>(p);
}
}
@@ -1281,6 +1260,10 @@ void LLTabContainer::enableTabButton(S32 which, BOOL enable)
{
mTabList[which]->mButton->setEnabled(enable);
}
+ // Stop the DaD timer as it might run forever
+ // enableTabButton() is typically called on refresh and draw when anything changed
+ // in the tab container so it's a good time to reset that.
+ mDragAndDropDelayTimer.stop();
}
void LLTabContainer::deleteAllTabs()
diff --git a/indra/llui/lltabcontainer.h b/indra/llui/lltabcontainer.h
index eaa2fd54e0..cebace2ceb 100644
--- a/indra/llui/lltabcontainer.h
+++ b/indra/llui/lltabcontainer.h
@@ -105,6 +105,11 @@ public:
Optional<bool> use_custom_icon_ctrl;
/**
+ * Open tabs on hover in drag and drop situations
+ */
+ Optional<bool> open_tabs_on_drag_and_drop;
+
+ /**
* Paddings for LLIconCtrl in case of LLCustomButtonIconCtrl usage(use_custom_icon_ctrl = true)
*/
Optional<S32> tab_icon_ctrl_pad;
@@ -300,6 +305,7 @@ private:
TabParams mLastTabParams;
bool mCustomIconCtrlUsed;
+ bool mOpenTabsOnDragAndDrop;
S32 mTabIconCtrlPad;
bool mUseTabEllipses;
};
diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index 3f213ed13e..7aeeae298f 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -157,6 +157,7 @@ LLTextBase::Params::Params()
read_only("read_only", false),
v_pad("v_pad", 0),
h_pad("h_pad", 0),
+ clip("clip", true),
clip_partial("clip_partial", true),
line_spacing("line_spacing"),
max_text_length("max_length", 255),
@@ -199,6 +200,7 @@ LLTextBase::LLTextBase(const LLTextBase::Params &p)
mVAlign(p.font_valign),
mLineSpacingMult(p.line_spacing.multiple),
mLineSpacingPixels(p.line_spacing.pixels),
+ mClip(p.clip),
mClipPartial(p.clip_partial && !p.allow_scroll),
mTrackEnd( p.track_end ),
mScrollIndex(-1),
@@ -278,7 +280,7 @@ bool LLTextBase::truncate()
if (getLength() >= S32(mMaxTextByteLength / 4))
{
// Have to check actual byte size
- LLWString text(getWText());
+ LLWString text(getWText());
S32 utf8_byte_size = wstring_utf8_length(text);
if ( utf8_byte_size > mMaxTextByteLength )
{
@@ -334,7 +336,7 @@ void LLTextBase::drawSelectionBackground()
// binary search for line that starts before top of visible buffer
line_list_t::const_iterator line_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), content_display_rect.mTop, compare_bottom());
- line_list_t::const_iterator end_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), content_display_rect.mBottom, compare_top());
+ line_list_t::const_iterator end_iter = std::upper_bound(mLineInfoList.begin(), mLineInfoList.end(), content_display_rect.mBottom, compare_top());
bool done = false;
@@ -512,7 +514,6 @@ void LLTextBase::drawText()
selection_right = llmax( mSelectionStart, mSelectionEnd );
}
- LLRect scrolled_view_rect = getVisibleDocumentRect();
std::pair<S32, S32> line_range = getVisibleLines(mClipPartial);
S32 first_line = line_range.first;
S32 last_line = line_range.second;
@@ -545,10 +546,9 @@ void LLTextBase::drawText()
line_end = next_start;
}
- LLRect text_rect(line.mRect.mLeft + mVisibleTextRect.mLeft - scrolled_view_rect.mLeft,
- line.mRect.mTop - scrolled_view_rect.mBottom + mVisibleTextRect.mBottom,
- llmin(mDocumentView->getRect().getWidth(), line.mRect.mRight) - scrolled_view_rect.mLeft,
- line.mRect.mBottom - scrolled_view_rect.mBottom + mVisibleTextRect.mBottom);
+ LLRect text_rect(line.mRect);
+ text_rect.mRight = mDocumentView->getRect().getWidth(); // clamp right edge to document extents
+ text_rect.translate(mDocumentView->getRect().mLeft, mDocumentView->getRect().mBottom); // adjust by scroll position
// draw a single line of text
S32 seg_start = line_start;
@@ -598,7 +598,7 @@ S32 LLTextBase::insertStringNoUndo(S32 pos, const LLWString &wstr, LLTextBase::s
pos = getEditableIndex(pos, true);
- segment_set_t::iterator seg_iter = getSegIterContaining(pos);
+ segment_set_t::iterator seg_iter = getEditableSegIterContaining(pos);
LLTextSegmentPtr default_segment;
@@ -654,7 +654,7 @@ S32 LLTextBase::insertStringNoUndo(S32 pos, const LLWString &wstr, LLTextBase::s
}
text.insert(pos, wstr);
- getViewModel()->setDisplay(text);
+ getViewModel()->setDisplay(text);
if ( truncate() )
{
@@ -669,7 +669,7 @@ S32 LLTextBase::insertStringNoUndo(S32 pos, const LLWString &wstr, LLTextBase::s
S32 LLTextBase::removeStringNoUndo(S32 pos, S32 length)
{
- LLWString text(getWText());
+ LLWString text(getWText());
segment_set_t::iterator seg_iter = getSegIterContaining(pos);
while(seg_iter != mSegments.end())
{
@@ -716,7 +716,7 @@ S32 LLTextBase::removeStringNoUndo(S32 pos, S32 length)
}
text.erase(pos, length);
- getViewModel()->setDisplay(text);
+ getViewModel()->setDisplay(text);
// recreate default segment in case we erased everything
createDefaultSegment();
@@ -733,9 +733,9 @@ S32 LLTextBase::overwriteCharNoUndo(S32 pos, llwchar wc)
{
return 0;
}
- LLWString text(getWText());
+ LLWString text(getWText());
text[pos] = wc;
- getViewModel()->setDisplay(text);
+ getViewModel()->setDisplay(text);
onValueChange(pos, pos + 1);
needsReflow(pos);
@@ -856,7 +856,7 @@ BOOL LLTextBase::handleMouseUp(S32 x, S32 y, MASK mask)
// Did we just click on a link?
if (mURLClickSignal
&& cur_segment->getStyle()
- && cur_segment->getStyle()->isLink())
+ && cur_segment->getStyle()->isLink())
{
// *TODO: send URL here?
(*mURLClickSignal)(this, LLSD() );
@@ -993,44 +993,68 @@ void LLTextBase::draw()
updateScrollFromCursor();
}
- LLRect doc_rect;
+ LLRect text_rect;
if (mScroller)
{
- mScroller->localRectToOtherView(mScroller->getContentWindowRect(), &doc_rect, this);
+ mScroller->localRectToOtherView(mScroller->getContentWindowRect(), &text_rect, this);
}
else
{
- doc_rect = getLocalRect();
+ LLRect visible_lines_rect;
+ std::pair<S32, S32> line_range = getVisibleLines(mClipPartial);
+ for (S32 i = line_range.first; i < line_range.second; i++)
+ {
+ if (visible_lines_rect.isEmpty())
+ {
+ visible_lines_rect = mLineInfoList[i].mRect;
+ }
+ else
+ {
+ visible_lines_rect.unionWith(mLineInfoList[i].mRect);
+ }
+ }
+ text_rect = visible_lines_rect;
+ text_rect.translate(mDocumentView->getRect().mLeft, mDocumentView->getRect().mBottom);
}
if (mBGVisible)
{
+ F32 alpha = getCurrentTransparency();
// clip background rect against extents, if we support scrolling
LLRect bg_rect = mVisibleTextRect;
if (mScroller)
{
- bg_rect.intersectWith(doc_rect);
+ bg_rect.intersectWith(text_rect);
}
LLColor4 bg_color = mReadOnly
? mReadOnlyBgColor.get()
: hasFocus()
? mFocusBgColor.get()
: mWriteableBgColor.get();
- gl_rect_2d(doc_rect, bg_color, TRUE);
+ gl_rect_2d(text_rect, bg_color % alpha, TRUE);
}
- // draw document view
- LLUICtrl::draw();
-
- {
- // only clip if we support scrolling...
- // since convention is that text boxes never vertically truncate their contents
- // regardless of rect bounds
- LLLocalClipRect clip(doc_rect, mScroller != NULL);
+ bool should_clip = mClip || mScroller != NULL;
+ { LLLocalClipRect clip(text_rect, should_clip);
+
+ // draw document view
+ if (mScroller)
+ {
+ drawChild(mScroller);
+ }
+ else
+ {
+ drawChild(mDocumentView);
+ }
+
drawSelectionBackground();
drawText();
drawCursor();
}
+
+ mDocumentView->setVisible(FALSE);
+ LLUICtrl::draw();
+ mDocumentView->setVisible(TRUE);
}
@@ -1094,8 +1118,7 @@ void LLTextBase::updateScrollFromCursor()
// scroll so that the cursor is at the top of the page
LLRect scroller_doc_window = getVisibleDocumentRect();
- LLRect cursor_rect_doc = getLocalRectFromDocIndex(mCursorPos);
- cursor_rect_doc.translate(scroller_doc_window.mLeft, scroller_doc_window.mBottom);
+ LLRect cursor_rect_doc = getDocRectFromDocIndex(mCursorPos);
mScroller->scrollToShowRect(cursor_rect_doc, LLRect(0, scroller_doc_window.getHeight() - 5, scroller_doc_window.getWidth(), 5));
}
@@ -1139,7 +1162,7 @@ void LLTextBase::reflow()
S32 first_line = getFirstVisibleLine();
// if scroll anchor not on first line, update it to first character of first line
- if (!mLineInfoList.empty()
+ if ((first_line < mLineInfoList.size())
&& (mScrollIndex < mLineInfoList[first_line].mDocIndexStart
|| mScrollIndex >= mLineInfoList[first_line].mDocIndexEnd))
{
@@ -1169,7 +1192,10 @@ void LLTextBase::reflow()
// shrink document to minimum size (visible portion of text widget)
// to force inlined widgets with follows set to shrink
- mDocumentView->reshape(mVisibleTextRect.getWidth(), mDocumentView->getRect().getHeight());
+ if (mWordWrap)
+ {
+ mDocumentView->reshape(mVisibleTextRect.getWidth(), mDocumentView->getRect().getHeight());
+ }
S32 cur_top = 0;
@@ -1341,9 +1367,9 @@ S32 LLTextBase::getLineStart( S32 line ) const
{
S32 num_lines = getLineCount();
if (num_lines == 0)
- {
+ {
return 0;
- }
+ }
line = llclamp(line, 0, num_lines-1);
return mLineInfoList[line].mDocIndexStart;
@@ -1353,9 +1379,9 @@ S32 LLTextBase::getLineEnd( S32 line ) const
{
S32 num_lines = getLineCount();
if (num_lines == 0)
- {
+ {
return 0;
- }
+ }
line = llclamp(line, 0, num_lines-1);
return mLineInfoList[line].mDocIndexEnd;
@@ -1414,7 +1440,7 @@ S32 LLTextBase::getFirstVisibleLine() const
return iter - mLineInfoList.begin();
}
-std::pair<S32, S32> LLTextBase::getVisibleLines(bool fully_visible)
+std::pair<S32, S32> LLTextBase::getVisibleLines(bool require_fully_visible)
{
LLRect visible_region = getVisibleDocumentRect();
line_list_t::const_iterator first_iter;
@@ -1423,14 +1449,14 @@ std::pair<S32, S32> LLTextBase::getVisibleLines(bool fully_visible)
// make sure we have an up-to-date mLineInfoList
reflow();
- if (fully_visible)
+ if (require_fully_visible)
{
first_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), visible_region.mTop, compare_top());
- last_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), visible_region.mBottom, compare_bottom());
+ last_iter = std::upper_bound(mLineInfoList.begin(), mLineInfoList.end(), visible_region.mBottom, compare_bottom());
}
else
{
- first_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), visible_region.mTop, compare_bottom());
+ first_iter = std::upper_bound(mLineInfoList.begin(), mLineInfoList.end(), visible_region.mTop, compare_bottom());
last_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), visible_region.mBottom, compare_top());
}
return std::pair<S32, S32>(first_iter - mLineInfoList.begin(), last_iter - mLineInfoList.begin());
@@ -1487,8 +1513,48 @@ void LLTextBase::getSegmentAndOffset( S32 startpos, segment_set_t::iterator* seg
}
}
+LLTextBase::segment_set_t::iterator LLTextBase::getEditableSegIterContaining(S32 index)
+{
+ segment_set_t::iterator it = getSegIterContaining(index);
+ segment_set_t::iterator orig_it = it;
+
+ if (it == mSegments.end()) return it;
+
+ if (!(*it)->canEdit()
+ && index == (*it)->getStart()
+ && it != mSegments.begin())
+ {
+ it--;
+ if ((*it)->canEdit())
+ {
+ return it;
+ }
+ }
+ return orig_it;
+}
+
+LLTextBase::segment_set_t::const_iterator LLTextBase::getEditableSegIterContaining(S32 index) const
+{
+ segment_set_t::const_iterator it = getSegIterContaining(index);
+ segment_set_t::const_iterator orig_it = it;
+ if (it == mSegments.end()) return it;
+
+ if (!(*it)->canEdit()
+ && index == (*it)->getStart()
+ && it != mSegments.begin())
+ {
+ it--;
+ if ((*it)->canEdit())
+ {
+ return it;
+ }
+ }
+ return orig_it;
+}
+
LLTextBase::segment_set_t::iterator LLTextBase::getSegIterContaining(S32 index)
{
+
static LLPointer<LLIndexSegment> index_segment = new LLIndexSegment();
if (index > getLength()) { return mSegments.end(); }
@@ -1631,8 +1697,11 @@ void LLTextBase::appendTextImpl(const std::string &new_text, const LLStyle::Para
LLUrlMatch match;
std::string text = new_text;
while ( LLUrlRegistry::instance().findUrl(text, match,
- boost::bind(&LLTextBase::replaceUrl, this, _1, _2, _3)) )
+ boost::bind(&LLTextBase::replaceUrl, this, _1, _2, _3)) )
{
+
+ LLTextUtil::processUrlMatch(&match,this);
+
start = match.getStart();
end = match.getEnd()+1;
@@ -1654,10 +1723,6 @@ void LLTextBase::appendTextImpl(const std::string &new_text, const LLStyle::Para
std::string subtext=text.substr(0,start);
appendAndHighlightText(subtext, part, style_params);
}
-
- // inserts an avatar icon preceding the Url if appropriate
- LLTextUtil::processUrlMatch(&match,this);
-
// output the styled Url
appendAndHighlightTextImpl(match.getLabel(), part, link_params, match.underlineOnHoverOnly());
@@ -1925,7 +1990,7 @@ void LLTextBase::setWText(const LLWString& text)
const LLWString& LLTextBase::getWText() const
{
- return getViewModel()->getDisplay();
+ return getViewModel()->getDisplay();
}
// If round is true, if the position is on the right half of a character, the cursor
@@ -1936,9 +2001,12 @@ S32 LLTextBase::getDocIndexFromLocalCoord( S32 local_x, S32 local_y, BOOL round,
{
// Figure out which line we're nearest to.
LLRect visible_region = getVisibleDocumentRect();
+ LLRect doc_rect = mDocumentView->getRect();
+
+ S32 doc_y = local_y - doc_rect.mBottom;
// binary search for line that starts before local_y
- line_list_t::const_iterator line_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), local_y - mVisibleTextRect.mBottom + visible_region.mBottom, compare_bottom());
+ line_list_t::const_iterator line_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), doc_y, compare_bottom());
if (line_iter == mLineInfoList.end())
{
@@ -1946,7 +2014,7 @@ S32 LLTextBase::getDocIndexFromLocalCoord( S32 local_x, S32 local_y, BOOL round,
}
S32 pos = getLength();
- S32 start_x = mVisibleTextRect.mLeft + line_iter->mRect.mLeft - visible_region.mLeft;
+ S32 start_x = line_iter->mRect.mLeft + doc_rect.mLeft;
segment_set_t::iterator line_seg_iter;
S32 line_seg_offset;
@@ -1968,7 +2036,7 @@ S32 LLTextBase::getDocIndexFromLocalCoord( S32 local_x, S32 local_y, BOOL round,
}
// if we've reached a line of text *below* the mouse cursor, doc index is first character on that line
- if (hit_past_end_of_line && local_y - mVisibleTextRect.mBottom + visible_region.mBottom > line_iter->mRect.mTop)
+ if (hit_past_end_of_line && doc_y > line_iter->mRect.mTop)
{
pos = segment_line_start;
break;
@@ -1997,11 +2065,19 @@ S32 LLTextBase::getDocIndexFromLocalCoord( S32 local_x, S32 local_y, BOOL round,
pos = segment_line_start + offset;
break;
}
- else if (hit_past_end_of_line && segmentp->getEnd() > line_iter->mDocIndexEnd - 1)
+ else if (hit_past_end_of_line && segmentp->getEnd() >= line_iter->mDocIndexEnd)
{
- // segment wraps to next line, so just set doc pos to the end of the line
- // segment wraps to next line, so just set doc pos to start of next line (represented by mDocIndexEnd)
- pos = llmin(getLength(), line_iter->mDocIndexEnd);
+ if (getLineNumFromDocIndex(line_iter->mDocIndexEnd - 1) == line_iter->mLineNum)
+ {
+ // if segment wraps to the next line we should step one char back
+ // to compensate for the space char between words
+ // which is removed due to wrapping
+ pos = llclamp(line_iter->mDocIndexEnd - 1, 0, getLength());
+ }
+ else
+ {
+ pos = llclamp(line_iter->mDocIndexEnd, 0, getLength());
+ }
break;
}
start_x += text_width;
@@ -2084,7 +2160,7 @@ LLRect LLTextBase::getLocalRectFromDocIndex(S32 pos) const
{
// return default height rect in upper left
local_rect = content_window_rect;
- local_rect.mBottom = local_rect.mTop - (S32)(mDefaultFont->getLineHeight());
+ local_rect.mBottom = local_rect.mTop - mDefaultFont->getLineHeight();
return local_rect;
}
@@ -2307,6 +2383,9 @@ S32 LLTextBase::getEditableIndex(S32 index, bool increasing_direction)
void LLTextBase::updateRects()
{
+ LLRect old_text_rect = mVisibleTextRect;
+ mVisibleTextRect = mScroller ? mScroller->getContentWindowRect() : getLocalRect();
+
if (mLineInfoList.empty())
{
mTextBoundingRect = LLRect(0, mVPad, mHPad, 0);
@@ -2322,10 +2401,24 @@ void LLTextBase::updateRects()
}
mTextBoundingRect.mTop += mVPad;
- // subtract a pixel off the bottom to deal with rounding errors in measuring font height
- mTextBoundingRect.mBottom -= 1;
- S32 delta_pos = -mTextBoundingRect.mBottom;
+ S32 delta_pos = 0;
+
+ switch(mVAlign)
+ {
+ case LLFontGL::TOP:
+ delta_pos = llmax(mVisibleTextRect.getHeight() - mTextBoundingRect.mTop, -mTextBoundingRect.mBottom);
+ break;
+ case LLFontGL::VCENTER:
+ delta_pos = (llmax(mVisibleTextRect.getHeight() - mTextBoundingRect.mTop, -mTextBoundingRect.mBottom) + (mVisibleTextRect.mBottom - mTextBoundingRect.mBottom)) / 2;
+ break;
+ case LLFontGL::BOTTOM:
+ delta_pos = mVisibleTextRect.mBottom - mTextBoundingRect.mBottom;
+ break;
+ case LLFontGL::BASELINE:
+ // do nothing
+ break;
+ }
// move line segments to fit new document rect
for (line_list_t::iterator it = mLineInfoList.begin(); it != mLineInfoList.end(); ++it)
{
@@ -2335,8 +2428,9 @@ void LLTextBase::updateRects()
}
// update document container dimensions according to text contents
- LLRect doc_rect = mTextBoundingRect;
+ LLRect doc_rect;
// use old mVisibleTextRect constraint document to width of viewable region
+ doc_rect.mBottom = llmin(mVisibleTextRect.mBottom, mTextBoundingRect.mBottom);
doc_rect.mLeft = 0;
// allow horizontal scrolling?
@@ -2346,11 +2440,22 @@ void LLTextBase::updateRects()
doc_rect.mRight = mScroller
? llmax(mVisibleTextRect.getWidth(), mTextBoundingRect.mRight)
: mVisibleTextRect.getWidth();
+ doc_rect.mTop = llmax(mVisibleTextRect.mTop, mTextBoundingRect.mTop);
if (!mScroller)
{
// push doc rect to top of text widget
- doc_rect.translate(0, mVisibleTextRect.getHeight() - doc_rect.mTop);
+ switch(mVAlign)
+ {
+ case LLFontGL::TOP:
+ doc_rect.translate(0, mVisibleTextRect.getHeight() - doc_rect.mTop);
+ break;
+ case LLFontGL::VCENTER:
+ doc_rect.translate(0, (mVisibleTextRect.getHeight() - doc_rect.mTop) / 2);
+ case LLFontGL::BOTTOM:
+ default:
+ break;
+ }
}
mDocumentView->setShape(doc_rect);
@@ -2358,7 +2463,6 @@ void LLTextBase::updateRects()
//update mVisibleTextRect *after* mDocumentView has been resized
// so that scrollbars are added if document needs to scroll
// since mVisibleTextRect does not include scrollbars
- LLRect old_text_rect = mVisibleTextRect;
mVisibleTextRect = mScroller ? mScroller->getContentWindowRect() : getLocalRect();
//FIXME: replace border with image?
if (mBorderVisible)
@@ -2371,9 +2475,27 @@ void LLTextBase::updateRects()
}
// update document container again, using new mVisibleTextRect (that has scrollbars enabled as needed)
+ doc_rect.mBottom = llmin(mVisibleTextRect.mBottom, mTextBoundingRect.mBottom);
+ doc_rect.mLeft = 0;
doc_rect.mRight = mScroller
? llmax(mVisibleTextRect.getWidth(), mTextBoundingRect.mRight)
: mVisibleTextRect.getWidth();
+ doc_rect.mTop = llmax(mVisibleTextRect.mTop, mTextBoundingRect.mTop);
+ if (!mScroller)
+ {
+ // push doc rect to top of text widget
+ switch(mVAlign)
+ {
+ case LLFontGL::TOP:
+ doc_rect.translate(0, mVisibleTextRect.getHeight() - doc_rect.mTop);
+ break;
+ case LLFontGL::VCENTER:
+ doc_rect.translate(0, (mVisibleTextRect.getHeight() - doc_rect.mTop) / 2);
+ case LLFontGL::BOTTOM:
+ default:
+ break;
+ }
+ }
mDocumentView->setShape(doc_rect);
}
@@ -2404,10 +2526,37 @@ LLRect LLTextBase::getVisibleDocumentRect() const
{
return mScroller->getVisibleContentRect();
}
- else
+ else if (mClip)
{
- // entire document rect is visible when not scrolling
+ LLRect visible_text_rect = getVisibleTextRect();
+ LLRect doc_rect = mDocumentView->getRect();
+ visible_text_rect.translate(-doc_rect.mLeft, -doc_rect.mBottom);
+
+ // reject partially visible lines
+ LLRect visible_lines_rect;
+ for (line_list_t::const_iterator it = mLineInfoList.begin(), end_it = mLineInfoList.end();
+ it != end_it;
+ ++it)
+ {
+ bool line_visible = mClipPartial ? visible_text_rect.contains(it->mRect) : visible_text_rect.overlaps(it->mRect);
+ if (line_visible)
+ {
+ if (visible_lines_rect.isEmpty())
+ {
+ visible_lines_rect = it->mRect;
+ }
+ else
+ {
+ visible_lines_rect.unionWith(it->mRect);
+ }
+ }
+ }
+ return visible_lines_rect;
+ }
+ else
+ { // entire document rect is visible
// but offset according to height of widget
+
LLRect doc_rect = mDocumentView->getLocalRect();
doc_rect.mLeft -= mDocumentView->getRect().mLeft;
// adjust for height of text above widget baseline
@@ -2458,7 +2607,10 @@ BOOL LLTextSegment::handleDoubleClick(S32 x, S32 y, MASK mask) { return FALSE; }
BOOL LLTextSegment::handleHover(S32 x, S32 y, MASK mask) { return FALSE; }
BOOL LLTextSegment::handleScrollWheel(S32 x, S32 y, S32 clicks) { return FALSE; }
BOOL LLTextSegment::handleToolTip(S32 x, S32 y, MASK mask) { return FALSE; }
-std::string LLTextSegment::getName() const { return ""; }
+const std::string& LLTextSegment::getName() const
+{
+ return LLStringUtil::null;
+}
void LLTextSegment::onMouseCaptureLost() {}
void LLTextSegment::screenPointToLocal(S32 screen_x, S32 screen_y, S32* local_x, S32* local_y) const {}
void LLTextSegment::localPointToScreen(S32 local_x, S32 local_y, S32* screen_x, S32* screen_y) const {}
@@ -2474,7 +2626,7 @@ LLNormalTextSegment::LLNormalTextSegment( LLStyleConstSP style, S32 start, S32 e
mToken(NULL),
mEditor(editor)
{
- mFontHeight = llceil(mStyle->getFont()->getLineHeight());
+ mFontHeight = mStyle->getFont()->getLineHeight();
LLUIImagePtr image = mStyle->getImage();
if (image.notNull())
@@ -2490,7 +2642,7 @@ LLNormalTextSegment::LLNormalTextSegment( const LLColor4& color, S32 start, S32
{
mStyle = new LLStyle(LLStyle::Params().visible(is_visible).color(color));
- mFontHeight = llceil(mStyle->getFont()->getLineHeight());
+ mFontHeight = mStyle->getFont()->getLineHeight();
}
LLNormalTextSegment::~LLNormalTextSegment()
@@ -2525,21 +2677,21 @@ F32 LLNormalTextSegment::drawClippedSegment(S32 seg_start, S32 seg_end, S32 sele
LLColor4 color = (mEditor.getReadOnly() ? mStyle->getReadOnlyColor() : mStyle->getColor()) % alpha;
- if( selection_start > seg_start )
+ if( selection_start > seg_start )
{
// Draw normally
S32 start = seg_start;
S32 end = llmin( selection_start, seg_end );
S32 length = end - start;
font->render(text, start,
- rect,
- color,
- LLFontGL::LEFT, mEditor.mVAlign,
- LLFontGL::NORMAL,
- mStyle->getShadowType(),
- length,
- &right_x,
- mEditor.getUseEllipses());
+ rect,
+ color,
+ LLFontGL::LEFT, mEditor.mVAlign,
+ LLFontGL::NORMAL,
+ mStyle->getShadowType(),
+ length,
+ &right_x,
+ mEditor.getUseEllipses());
}
rect.mLeft = (S32)ceil(right_x);
@@ -2551,14 +2703,14 @@ F32 LLNormalTextSegment::drawClippedSegment(S32 seg_start, S32 seg_end, S32 sele
S32 length = end - start;
font->render(text, start,
- rect,
- mStyle->getSelectedColor().get(),
- LLFontGL::LEFT, mEditor.mVAlign,
- LLFontGL::NORMAL,
- LLFontGL::NO_SHADOW,
- length,
- &right_x,
- mEditor.getUseEllipses());
+ rect,
+ mStyle->getSelectedColor().get(),
+ LLFontGL::LEFT, mEditor.mVAlign,
+ LLFontGL::NORMAL,
+ LLFontGL::NO_SHADOW,
+ length,
+ &right_x,
+ mEditor.getUseEllipses());
}
rect.mLeft = (S32)ceil(right_x);
if( selection_end < seg_end )
@@ -2568,14 +2720,14 @@ F32 LLNormalTextSegment::drawClippedSegment(S32 seg_start, S32 seg_end, S32 sele
S32 end = seg_end;
S32 length = end - start;
font->render(text, start,
- rect,
- color,
- LLFontGL::LEFT, mEditor.mVAlign,
- LLFontGL::NORMAL,
- mStyle->getShadowType(),
- length,
- &right_x,
- mEditor.getUseEllipses());
+ rect,
+ color,
+ LLFontGL::LEFT, mEditor.mVAlign,
+ LLFontGL::NORMAL,
+ mStyle->getShadowType(),
+ length,
+ &right_x,
+ mEditor.getUseEllipses());
}
return right_x;
}
@@ -2858,11 +3010,11 @@ LLLineBreakTextSegment::LLLineBreakTextSegment(S32 pos):LLTextSegment(pos,pos+1)
{
LLStyleSP s( new LLStyle(LLStyle::Params().visible(true)));
- mFontHeight = llceil(s->getFont()->getLineHeight());
+ mFontHeight = s->getFont()->getLineHeight();
}
LLLineBreakTextSegment::LLLineBreakTextSegment(LLStyleConstSP style,S32 pos):LLTextSegment(pos,pos+1)
{
- mFontHeight = llceil(style->getFont()->getLineHeight());
+ mFontHeight = style->getFont()->getLineHeight();
}
LLLineBreakTextSegment::~LLLineBreakTextSegment()
{
@@ -2899,7 +3051,7 @@ static const S32 IMAGE_HPAD = 3;
bool LLImageTextSegment::getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const
{
width = 0;
- height = llceil(mStyle->getFont()->getLineHeight());;
+ height = mStyle->getFont()->getLineHeight();
LLUIImagePtr image = mStyle->getImage();
if( num_chars>0 && image.notNull())
@@ -2913,11 +3065,18 @@ bool LLImageTextSegment::getDimensions(S32 first_char, S32 num_chars, S32& width
S32 LLImageTextSegment::getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars) const
{
LLUIImagePtr image = mStyle->getImage();
+
+ if (image.isNull())
+ {
+ return 1;
+ }
+
S32 image_width = image->getWidth();
if(line_offset == 0 || num_pixels>image_width + IMAGE_HPAD)
{
return 1;
}
+
return 0;
}
@@ -2927,18 +3086,21 @@ F32 LLImageTextSegment::draw(S32 start, S32 end, S32 selection_start, S32 select
{
LLColor4 color = LLColor4::white % mEditor.getDrawContext().mAlpha;
LLUIImagePtr image = mStyle->getImage();
- S32 style_image_height = image->getHeight();
- S32 style_image_width = image->getWidth();
- // Text is drawn from the top of the draw_rect downward
-
- S32 text_center = draw_rect.mTop - (draw_rect.getHeight() / 2);
- // Align image to center of draw rect
- S32 image_bottom = text_center - (style_image_height / 2);
- image->draw(draw_rect.mLeft, image_bottom,
- style_image_width, style_image_height, color);
-
- const S32 IMAGE_HPAD = 3;
- return draw_rect.mLeft + style_image_width + IMAGE_HPAD;
+ if (image.notNull())
+ {
+ S32 style_image_height = image->getHeight();
+ S32 style_image_width = image->getWidth();
+ // Text is drawn from the top of the draw_rect downward
+
+ S32 text_center = draw_rect.mTop - (draw_rect.getHeight() / 2);
+ // Align image to center of draw rect
+ S32 image_bottom = text_center - (style_image_height / 2);
+ image->draw(draw_rect.mLeft, image_bottom,
+ style_image_width, style_image_height, color);
+
+ const S32 IMAGE_HPAD = 3;
+ return draw_rect.mLeft + style_image_width + IMAGE_HPAD;
+ }
}
return 0.0;
}
diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h
index aafcf8ceb0..0549141b72 100644
--- a/indra/llui/lltextbase.h
+++ b/indra/llui/lltextbase.h
@@ -84,7 +84,7 @@ public:
/*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask);
/*virtual*/ BOOL handleScrollWheel(S32 x, S32 y, S32 clicks);
/*virtual*/ BOOL handleToolTip(S32 x, S32 y, MASK mask);
- /*virtual*/ std::string getName() const;
+ /*virtual*/ const std::string& getName() const;
/*virtual*/ void onMouseCaptureLost();
/*virtual*/ void screenPointToLocal(S32 screen_x, S32 screen_y, S32* local_x, S32* local_y) const;
/*virtual*/ void localPointToScreen(S32 local_x, S32 local_y, S32* screen_x, S32* screen_y) const;
@@ -237,7 +237,7 @@ public:
friend class LLNormalTextSegment;
friend class LLUICtrlFactory;
- struct LineSpacingParams : public LLInitParam::Choice<LineSpacingParams>
+ struct LineSpacingParams : public LLInitParam::ChoiceBlock<LineSpacingParams>
{
Alternative<F32> multiple;
Alternative<S32> pixels;
@@ -265,6 +265,7 @@ public:
use_ellipses,
parse_urls,
parse_highlights,
+ clip,
clip_partial;
Optional<S32> v_pad,
@@ -338,7 +339,7 @@ public:
void addDocumentChild(LLView* view);
void removeDocumentChild(LLView* view);
const LLView* getDocumentView() const { return mDocumentView; }
- LLRect getVisibleTextRect() { return mVisibleTextRect; }
+ LLRect getVisibleTextRect() const { return mVisibleTextRect; }
LLRect getTextBoundingRect();
LLRect getVisibleDocumentRect() const;
@@ -460,6 +461,8 @@ protected:
void getSegmentAndOffset( S32 startpos, segment_set_t::const_iterator* seg_iter, S32* offsetp ) const;
void getSegmentAndOffset( S32 startpos, segment_set_t::iterator* seg_iter, S32* offsetp );
LLTextSegmentPtr getSegmentAtLocalPos( S32 x, S32 y, bool hit_past_end_of_line = true);
+ segment_set_t::iterator getEditableSegIterContaining(S32 index);
+ segment_set_t::const_iterator getEditableSegIterContaining(S32 index) const;
segment_set_t::iterator getSegIterContaining(S32 index);
segment_set_t::const_iterator getSegIterContaining(S32 index) const;
void clearSegments();
@@ -552,6 +555,7 @@ protected:
bool mTrackEnd; // if true, keeps scroll position at end of document during resize
bool mReadOnly;
bool mBGVisible; // render background?
+ bool mClip; // clip text to widget rect
bool mClipPartial; // false if we show lines that are partially inside bounding rect
bool mPlainText; // didn't use Image or Icon segments
S32 mMaxTextByteLength; // Maximum length mText is allowed to be in bytes
diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp
index 94bf716e7d..9720dded6c 100644
--- a/indra/llui/lltexteditor.cpp
+++ b/indra/llui/lltexteditor.cpp
@@ -277,6 +277,8 @@ LLTextEditor::LLTextEditor(const LLTextEditor::Params& p) :
mHPad += UI_TEXTEDITOR_LINE_NUMBER_MARGIN;
updateRects();
}
+
+ mParseOnTheFly = TRUE;
}
void LLTextEditor::initFromParams( const LLTextEditor::Params& p)
@@ -324,8 +326,10 @@ void LLTextEditor::setText(const LLStringExplicit &utf8str, const LLStyle::Param
blockUndo();
deselect();
-
+
+ mParseOnTheFly = FALSE;
LLTextBase::setText(utf8str, input_params);
+ mParseOnTheFly = TRUE;
resetDirty();
}
@@ -588,6 +592,10 @@ void LLTextEditor::indentSelectedLines( S32 spaces )
}
}
+ // Disabling parsing on the fly to avoid updating text segments
+ // until all indentation commands are executed.
+ mParseOnTheFly = FALSE;
+
// Find each start-of-line and indent it
do
{
@@ -613,6 +621,8 @@ void LLTextEditor::indentSelectedLines( S32 spaces )
}
while( cur < right );
+ mParseOnTheFly = TRUE;
+
if( (right < getLength()) && (text[right] == '\n') )
{
right++;
@@ -1322,7 +1332,7 @@ void LLTextEditor::cut()
}
S32 left_pos = llmin( mSelectionStart, mSelectionEnd );
S32 length = llabs( mSelectionStart - mSelectionEnd );
- gClipboard.copyFromSubstring( getWText(), left_pos, length, mSourceID );
+ LLClipboard::instance().copyToClipboard( getWText(), left_pos, length);
deleteSelection( FALSE );
onKeyStroke();
@@ -1342,12 +1352,12 @@ void LLTextEditor::copy()
}
S32 left_pos = llmin( mSelectionStart, mSelectionEnd );
S32 length = llabs( mSelectionStart - mSelectionEnd );
- gClipboard.copyFromSubstring(getWText(), left_pos, length, mSourceID);
+ LLClipboard::instance().copyToClipboard(getWText(), left_pos, length);
}
BOOL LLTextEditor::canPaste() const
{
- return !mReadOnly && gClipboard.canPasteString();
+ return !mReadOnly && LLClipboard::instance().isTextAvailable();
}
// paste from clipboard
@@ -1367,6 +1377,7 @@ void LLTextEditor::pastePrimary()
// paste from primary (itsprimary==true) or clipboard (itsprimary==false)
void LLTextEditor::pasteHelper(bool is_primary)
{
+ mParseOnTheFly = FALSE;
bool can_paste_it;
if (is_primary)
{
@@ -1382,16 +1393,8 @@ void LLTextEditor::pasteHelper(bool is_primary)
return;
}
- LLUUID source_id;
LLWString paste;
- if (is_primary)
- {
- paste = gClipboard.getPastePrimaryWString(&source_id);
- }
- else
- {
- paste = gClipboard.getPasteWString(&source_id);
- }
+ LLClipboard::instance().pasteFromClipboard(paste, is_primary);
if (paste.empty())
{
@@ -1450,6 +1453,7 @@ void LLTextEditor::pasteHelper(bool is_primary)
deselect();
onKeyStroke();
+ mParseOnTheFly = TRUE;
}
@@ -1463,12 +1467,12 @@ void LLTextEditor::copyPrimary()
}
S32 left_pos = llmin( mSelectionStart, mSelectionEnd );
S32 length = llabs( mSelectionStart - mSelectionEnd );
- gClipboard.copyFromPrimarySubstring(getWText(), left_pos, length, mSourceID);
+ LLClipboard::instance().copyToClipboard(getWText(), left_pos, length, true);
}
BOOL LLTextEditor::canPastePrimary() const
{
- return !mReadOnly && gClipboard.canPastePrimaryString();
+ return !mReadOnly && LLClipboard::instance().isTextAvailable(true);
}
void LLTextEditor::updatePrimary()
@@ -1980,7 +1984,7 @@ void LLTextEditor::drawPreeditMarker()
return;
}
- const S32 line_height = llround( mDefaultFont->getLineHeight() );
+ const S32 line_height = mDefaultFont->getLineHeight();
S32 line_start = getLineStart(cur_line);
S32 line_y = mVisibleTextRect.mTop - line_height;
@@ -2238,6 +2242,22 @@ void LLTextEditor::insertText(const std::string &new_text)
setEnabled( enabled );
}
+void LLTextEditor::insertText(LLWString &new_text)
+{
+ BOOL enabled = getEnabled();
+ setEnabled( TRUE );
+
+ // Delete any selected characters (the insertion replaces them)
+ if( hasSelection() )
+ {
+ deleteSelection(TRUE);
+ }
+
+ setCursorPos(mCursorPos + insert( mCursorPos, new_text, FALSE, LLTextSegmentPtr() ));
+
+ setEnabled( enabled );
+}
+
void LLTextEditor::appendWidget(const LLInlineViewSegment::Params& params, const std::string& text, bool allow_undo)
{
// Save old state
@@ -2385,7 +2405,7 @@ void LLTextEditor::loadKeywords(const std::string& filename,
void LLTextEditor::updateSegments()
{
- if (mReflowIndex < S32_MAX && mKeywords.isLoaded())
+ if (mReflowIndex < S32_MAX && mKeywords.isLoaded() && mParseOnTheFly)
{
LLFastTimer ft(FTM_SYNTAX_HIGHLIGHTING);
// HACK: No non-ascii keywords for now
@@ -2687,7 +2707,7 @@ BOOL LLTextEditor::getPreeditLocation(S32 query_offset, LLCoordGL *coord, LLRect
const LLWString textString(getWText());
const llwchar * const text = textString.c_str();
- const S32 line_height = llround(mDefaultFont->getLineHeight());
+ const S32 line_height = mDefaultFont->getLineHeight();
if (coord)
{
@@ -2790,7 +2810,7 @@ void LLTextEditor::markAsPreedit(S32 position, S32 length)
S32 LLTextEditor::getPreeditFontSize() const
{
- return llround(mDefaultFont->getLineHeight() * LLUI::sGLScaleFactor.mV[VY]);
+ return llround((F32)mDefaultFont->getLineHeight() * LLUI::sGLScaleFactor.mV[VY]);
}
BOOL LLTextEditor::isDirty() const
@@ -2826,3 +2846,13 @@ void LLTextEditor::clear()
getViewModel()->setDisplay(LLWStringUtil::null);
clearSegments();
}
+
+bool LLTextEditor::canLoadOrSaveToFile()
+{
+ return !mReadOnly;
+}
+
+S32 LLTextEditor::spacesPerTab()
+{
+ return SPACES_PER_TAB;
+}
diff --git a/indra/llui/lltexteditor.h b/indra/llui/lltexteditor.h
index 58ecefdccb..40821ae9fb 100644
--- a/indra/llui/lltexteditor.h
+++ b/indra/llui/lltexteditor.h
@@ -92,6 +92,8 @@ public:
void setParseHighlights(BOOL parsing) {mParseHighlights=parsing;}
+ static S32 spacesPerTab();
+
// mousehandler overrides
virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask);
virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask);
@@ -140,6 +142,8 @@ public:
virtual void selectAll();
virtual BOOL canSelectAll() const;
+ virtual bool canLoadOrSaveToFile();
+
void selectNext(const std::string& search_text_in, BOOL case_insensitive, BOOL wrap = TRUE);
BOOL replaceText(const std::string& search_text, const std::string& replace_text, BOOL case_insensitive, BOOL wrap = TRUE);
void replaceTextAll(const std::string& search_text, const std::string& replace_text, BOOL case_insensitive);
@@ -158,6 +162,7 @@ public:
// inserts text at cursor
void insertText(const std::string &text);
+ void insertText(LLWString &text);
void appendWidget(const LLInlineViewSegment::Params& params, const std::string& text, bool allow_undo);
// Non-undoable
@@ -315,6 +320,7 @@ private:
BOOL mAllowEmbeddedItems;
bool mShowContextMenu;
+ bool mParseOnTheFly;
LLUUID mSourceID;
diff --git a/indra/llui/lltextparser.cpp b/indra/llui/lltextparser.cpp
index a4fe4f6ca8..8a85f99e0c 100644
--- a/indra/llui/lltextparser.cpp
+++ b/indra/llui/lltextparser.cpp
@@ -46,8 +46,6 @@ LLTextParser::LLTextParser()
{}
-// Moved triggerAlerts() to llfloaterchat.cpp to break llui/llaudio library dependency.
-
S32 LLTextParser::findPattern(const std::string &text, LLSD highlight)
{
if (!highlight.has("pattern")) return -1;
diff --git a/indra/llui/lltextvalidate.cpp b/indra/llui/lltextvalidate.cpp
index 4b9faa0560..234e600ccd 100644
--- a/indra/llui/lltextvalidate.cpp
+++ b/indra/llui/lltextvalidate.cpp
@@ -188,6 +188,39 @@ namespace LLTextValidate
return success;
}
+ bool validateNonNegativeS32NoSpace(const LLWString &str)
+ {
+ LLLocale locale(LLLocale::USER_LOCALE);
+
+ LLWString test_str = str;
+ S32 len = test_str.length();
+ bool success = TRUE;
+ if(0 < len)
+ {
+ if('-' == test_str[0])
+ {
+ success = FALSE;
+ }
+ S32 i = 0;
+ while(success && (i < len))
+ {
+ if(!LLStringOps::isDigit(test_str[i]) || LLStringOps::isSpace(test_str[i++]))
+ {
+ success = FALSE;
+ }
+ }
+ }
+ if (success)
+ {
+ S32 val = strtol(wstring_to_utf8str(test_str).c_str(), NULL, 10);
+ if (val < 0)
+ {
+ success = FALSE;
+ }
+ }
+ return success;
+ }
+
bool validateAlphaNum(const LLWString &str)
{
LLLocale locale(LLLocale::USER_LOCALE);
diff --git a/indra/llui/lltextvalidate.h b/indra/llui/lltextvalidate.h
index 84644be30c..5c830d7db3 100644
--- a/indra/llui/lltextvalidate.h
+++ b/indra/llui/lltextvalidate.h
@@ -46,6 +46,7 @@ namespace LLTextValidate
bool validateInt(const LLWString &str );
bool validatePositiveS32(const LLWString &str);
bool validateNonNegativeS32(const LLWString &str);
+ bool validateNonNegativeS32NoSpace(const LLWString &str);
bool validateAlphaNum(const LLWString &str );
bool validateAlphaNumSpace(const LLWString &str );
bool validateASCIIPrintableNoPipe(const LLWString &str);
diff --git a/indra/llui/lltimectrl.cpp b/indra/llui/lltimectrl.cpp
new file mode 100644
index 0000000000..9ea1e8815e
--- /dev/null
+++ b/indra/llui/lltimectrl.cpp
@@ -0,0 +1,432 @@
+/**
+ * @file lltimectrl.cpp
+ * @brief LLTimeCtrl base class
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+
+#include "lltimectrl.h"
+
+#include "llui.h"
+#include "lluiconstants.h"
+
+#include "llbutton.h"
+#include "llfontgl.h"
+#include "lllineeditor.h"
+#include "llkeyboard.h"
+#include "llstring.h"
+#include "lltextbox.h"
+#include "lluictrlfactory.h"
+
+static LLDefaultChildRegistry::Register<LLTimeCtrl> time_r("time");
+
+const U32 AMPM_LEN = 3;
+const U32 MINUTES_MIN = 0;
+const U32 MINUTES_MAX = 59;
+const U32 HOURS_MIN = 1;
+const U32 HOURS_MAX = 12;
+const U32 MINUTES_PER_HOUR = 60;
+const U32 MINUTES_PER_DAY = 24 * MINUTES_PER_HOUR;
+
+
+LLTimeCtrl::Params::Params()
+: label_width("label_width"),
+ snap_to("snap_to"),
+ allow_text_entry("allow_text_entry", true),
+ text_enabled_color("text_enabled_color"),
+ text_disabled_color("text_disabled_color"),
+ up_button("up_button"),
+ down_button("down_button")
+{}
+
+LLTimeCtrl::LLTimeCtrl(const LLTimeCtrl::Params& p)
+: LLUICtrl(p),
+ mLabelBox(NULL),
+ mTextEnabledColor(p.text_enabled_color()),
+ mTextDisabledColor(p.text_disabled_color()),
+ mTime(0),
+ mSnapToMin(5)
+{
+ static LLUICachedControl<S32> spinctrl_spacing ("UISpinctrlSpacing", 0);
+ static LLUICachedControl<S32> spinctrl_btn_width ("UISpinctrlBtnWidth", 0);
+ static LLUICachedControl<S32> spinctrl_btn_height ("UISpinctrlBtnHeight", 0);
+ S32 centered_top = getRect().getHeight();
+ S32 centered_bottom = getRect().getHeight() - 2 * spinctrl_btn_height;
+ S32 label_width = llclamp(p.label_width(), 0, llmax(0, getRect().getWidth() - 40));
+ S32 editor_left = label_width + spinctrl_spacing;
+
+ //================= Label =================//
+ if( !p.label().empty() )
+ {
+ LLRect label_rect( 0, centered_top, label_width, centered_bottom );
+ LLTextBox::Params params;
+ params.name("TimeCtrl Label");
+ params.rect(label_rect);
+ params.initial_value(p.label());
+ if (p.font.isProvided())
+ {
+ params.font(p.font);
+ }
+ mLabelBox = LLUICtrlFactory::create<LLTextBox> (params);
+ addChild(mLabelBox);
+
+ editor_left = label_rect.mRight + spinctrl_spacing;
+ }
+
+ S32 editor_right = getRect().getWidth() - spinctrl_btn_width - spinctrl_spacing;
+
+ //================= Editor ================//
+ LLRect editor_rect( editor_left, centered_top, editor_right, centered_bottom );
+ LLLineEditor::Params params;
+ params.name("SpinCtrl Editor");
+ params.rect(editor_rect);
+ if (p.font.isProvided())
+ {
+ params.font(p.font);
+ }
+
+ params.follows.flags(FOLLOWS_LEFT | FOLLOWS_BOTTOM);
+ params.max_length.chars(8);
+ params.keystroke_callback(boost::bind(&LLTimeCtrl::onTextEntry, this, _1));
+ mEditor = LLUICtrlFactory::create<LLLineEditor> (params);
+ mEditor->setPrevalidateInput(LLTextValidate::validateNonNegativeS32NoSpace);
+ mEditor->setPrevalidate(boost::bind(&LLTimeCtrl::isTimeStringValid, this, _1));
+ mEditor->setText(LLStringExplicit("12:00 AM"));
+ addChild(mEditor);
+
+ //================= Spin Buttons ==========//
+ LLButton::Params up_button_params(p.up_button);
+ up_button_params.rect = LLRect(editor_right + 1, getRect().getHeight(), editor_right + spinctrl_btn_width, getRect().getHeight() - spinctrl_btn_height);
+
+ up_button_params.click_callback.function(boost::bind(&LLTimeCtrl::onUpBtn, this));
+ up_button_params.mouse_held_callback.function(boost::bind(&LLTimeCtrl::onUpBtn, this));
+ mUpBtn = LLUICtrlFactory::create<LLButton>(up_button_params);
+ addChild(mUpBtn);
+
+ LLButton::Params down_button_params(p.down_button);
+ down_button_params.rect = LLRect(editor_right + 1, getRect().getHeight() - spinctrl_btn_height, editor_right + spinctrl_btn_width, getRect().getHeight() - 2 * spinctrl_btn_height);
+ down_button_params.click_callback.function(boost::bind(&LLTimeCtrl::onDownBtn, this));
+ down_button_params.mouse_held_callback.function(boost::bind(&LLTimeCtrl::onDownBtn, this));
+ mDownBtn = LLUICtrlFactory::create<LLButton>(down_button_params);
+ addChild(mDownBtn);
+
+ setUseBoundingRect( TRUE );
+}
+
+F32 LLTimeCtrl::getTime24() const
+{
+ // 0.0 - 23.99;
+ return mTime / 60.0f;
+}
+
+U32 LLTimeCtrl::getHours24() const
+{
+ return (U32) getTime24();
+}
+
+U32 LLTimeCtrl::getMinutes() const
+{
+ return mTime % MINUTES_PER_HOUR;
+}
+
+void LLTimeCtrl::setTime24(F32 time)
+{
+ time = llclamp(time, 0.0f, 23.99f); // fix out of range values
+ mTime = llround(time * MINUTES_PER_HOUR); // fixes values like 4.99999
+
+ updateText();
+}
+
+BOOL LLTimeCtrl::handleKeyHere(KEY key, MASK mask)
+{
+ if (mEditor->hasFocus())
+ {
+ if(key == KEY_UP)
+ {
+ onUpBtn();
+ return TRUE;
+ }
+ if(key == KEY_DOWN)
+ {
+ onDownBtn();
+ return TRUE;
+ }
+ if (key == KEY_RETURN)
+ {
+ onCommit();
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+void LLTimeCtrl::onUpBtn()
+{
+ switch(getEditingPart())
+ {
+ case HOURS:
+ increaseHours();
+ break;
+ case MINUTES:
+ increaseMinutes();
+ break;
+ case DAYPART:
+ switchDayPeriod();
+ break;
+ default:
+ break;
+ }
+
+ updateText();
+ onCommit();
+}
+
+void LLTimeCtrl::onDownBtn()
+{
+ switch(getEditingPart())
+ {
+ case HOURS:
+ decreaseHours();
+ break;
+ case MINUTES:
+ decreaseMinutes();
+ break;
+ case DAYPART:
+ switchDayPeriod();
+ break;
+ default:
+ break;
+ }
+
+ updateText();
+ onCommit();
+}
+
+void LLTimeCtrl::onFocusLost()
+{
+ updateText();
+ onCommit();
+ LLUICtrl::onFocusLost();
+}
+
+void LLTimeCtrl::onTextEntry(LLLineEditor* line_editor)
+{
+ std::string time_str = line_editor->getText();
+ U32 h12 = parseHours(getHoursString(time_str));
+ U32 m = parseMinutes(getMinutesString(time_str));
+ bool pm = parseAMPM(getAMPMString(time_str));
+
+ if (h12 == 12)
+ {
+ h12 = 0;
+ }
+
+ U32 h24 = pm ? h12 + 12 : h12;
+
+ mTime = h24 * MINUTES_PER_HOUR + m;
+}
+
+bool LLTimeCtrl::isTimeStringValid(const LLWString &wstr)
+{
+ std::string str = wstring_to_utf8str(wstr);
+
+ return isHoursStringValid(getHoursString(str)) &&
+ isMinutesStringValid(getMinutesString(str)) &&
+ isPMAMStringValid(getAMPMString(str));
+}
+
+void LLTimeCtrl::increaseMinutes()
+{
+ mTime = (mTime + mSnapToMin) % MINUTES_PER_DAY - (mTime % mSnapToMin);
+}
+
+void LLTimeCtrl::increaseHours()
+{
+ mTime = (mTime + MINUTES_PER_HOUR) % MINUTES_PER_DAY;
+}
+
+void LLTimeCtrl::decreaseMinutes()
+{
+ if (mTime < mSnapToMin)
+ {
+ mTime = MINUTES_PER_DAY - mTime;
+ }
+
+ mTime -= (mTime % mSnapToMin) ? mTime % mSnapToMin : mSnapToMin;
+}
+
+void LLTimeCtrl::decreaseHours()
+{
+ if (mTime < MINUTES_PER_HOUR)
+ {
+ mTime = 23 * MINUTES_PER_HOUR + mTime;
+ }
+ else
+ {
+ mTime -= MINUTES_PER_HOUR;
+ }
+}
+
+bool LLTimeCtrl::isPM() const
+{
+ return mTime >= (MINUTES_PER_DAY / 2);
+}
+
+void LLTimeCtrl::switchDayPeriod()
+{
+ if (isPM())
+ {
+ mTime -= MINUTES_PER_DAY / 2;
+ }
+ else
+ {
+ mTime += MINUTES_PER_DAY / 2;
+ }
+}
+
+void LLTimeCtrl::updateText()
+{
+ U32 h24 = getHours24();
+ U32 m = getMinutes();
+ U32 h12 = h24 > 12 ? h24 - 12 : h24;
+
+ if (h12 == 0)
+ h12 = 12;
+
+ mEditor->setText(llformat("%d:%02d %s", h12, m, isPM() ? "PM":"AM"));
+}
+
+LLTimeCtrl::EEditingPart LLTimeCtrl::getEditingPart()
+{
+ S32 cur_pos = mEditor->getCursor();
+ std::string time_str = mEditor->getText();
+
+ S32 colon_index = time_str.find_first_of(':');
+
+ if (cur_pos <= colon_index)
+ {
+ return HOURS;
+ }
+ else if (cur_pos > colon_index && cur_pos <= (S32)(time_str.length() - AMPM_LEN))
+ {
+ return MINUTES;
+ }
+ else if (cur_pos > (S32)(time_str.length() - AMPM_LEN))
+ {
+ return DAYPART;
+ }
+
+ return NONE;
+}
+
+// static
+std::string LLTimeCtrl::getHoursString(const std::string& str)
+{
+ size_t colon_index = str.find_first_of(':');
+ std::string hours_str = str.substr(0, colon_index);
+
+ return hours_str;
+}
+
+// static
+std::string LLTimeCtrl::getMinutesString(const std::string& str)
+{
+ size_t colon_index = str.find_first_of(':');
+ ++colon_index;
+
+ int minutes_len = str.length() - colon_index - AMPM_LEN;
+ std::string minutes_str = str.substr(colon_index, minutes_len);
+
+ return minutes_str;
+}
+
+// static
+std::string LLTimeCtrl::getAMPMString(const std::string& str)
+{
+ return str.substr(str.size() - 2, 2); // returns last two characters
+}
+
+// static
+bool LLTimeCtrl::isHoursStringValid(const std::string& str)
+{
+ U32 hours;
+ if ((!LLStringUtil::convertToU32(str, hours) || (hours <= HOURS_MAX)) && str.length() < 3)
+ return true;
+
+ return false;
+}
+
+// static
+bool LLTimeCtrl::isMinutesStringValid(const std::string& str)
+{
+ U32 minutes;
+ if (!LLStringUtil::convertToU32(str, minutes) || (minutes <= MINUTES_MAX) && str.length() < 3)
+ return true;
+
+ return false;
+}
+
+// static
+bool LLTimeCtrl::isPMAMStringValid(const std::string& str)
+{
+ S32 len = str.length();
+
+ bool valid = (str[--len] == 'M') && (str[--len] == 'P' || str[len] == 'A');
+
+ return valid;
+}
+
+// static
+U32 LLTimeCtrl::parseHours(const std::string& str)
+{
+ U32 hours;
+ if (LLStringUtil::convertToU32(str, hours) && (hours >= HOURS_MIN) && (hours <= HOURS_MAX))
+ {
+ return hours;
+ }
+ else
+ {
+ return HOURS_MIN;
+ }
+}
+
+// static
+U32 LLTimeCtrl::parseMinutes(const std::string& str)
+{
+ U32 minutes;
+ if (LLStringUtil::convertToU32(str, minutes) && (minutes >= MINUTES_MIN) && (minutes <= MINUTES_MAX))
+ {
+ return minutes;
+ }
+ else
+ {
+ return MINUTES_MIN;
+ }
+}
+
+// static
+bool LLTimeCtrl::parseAMPM(const std::string& str)
+{
+ return str == "PM";
+}
diff --git a/indra/llui/lltimectrl.h b/indra/llui/lltimectrl.h
new file mode 100644
index 0000000000..b5f268c76a
--- /dev/null
+++ b/indra/llui/lltimectrl.h
@@ -0,0 +1,131 @@
+/**
+ * @file lltimectrl.h
+ * @brief Time control
+ *
+ * $LicenseInfo:firstyear=2002&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LLTIMECTRL_H_
+#define LLTIMECTRL_H_
+
+#include "stdtypes.h"
+#include "llbutton.h"
+#include "v4color.h"
+#include "llrect.h"
+
+class LLLineEditor;
+
+class LLTimeCtrl
+: public LLUICtrl
+{
+ LOG_CLASS(LLTimeCtrl);
+public:
+ struct Params : public LLInitParam::Block<Params, LLUICtrl::Params>
+ {
+ Optional<S32> label_width;
+ Optional<S32> snap_to;
+ Optional<bool> allow_text_entry;
+
+ Optional<LLUIColor> text_enabled_color;
+ Optional<LLUIColor> text_disabled_color;
+
+ Optional<LLButton::Params> up_button;
+ Optional<LLButton::Params> down_button;
+
+ Params();
+ };
+
+ F32 getTime24() const; // 0.0 - 24.0
+ U32 getHours24() const; // 0 - 23
+ U32 getMinutes() const; // 0 - 59
+
+ void setTime24(F32 time); // 0.0 - 23.98(3)
+
+protected:
+ LLTimeCtrl(const Params&);
+ friend class LLUICtrlFactory;
+
+private:
+
+ enum EDayPeriod
+ {
+ AM,
+ PM
+ };
+
+ enum EEditingPart
+ {
+ HOURS,
+ MINUTES,
+ DAYPART,
+ NONE
+ };
+
+ virtual void onFocusLost();
+ virtual BOOL handleKeyHere(KEY key, MASK mask);
+
+ void onUpBtn();
+ void onDownBtn();
+ void onTextEntry(LLLineEditor* line_editor);
+
+ bool isTimeStringValid(const LLWString& wstr);
+
+ void increaseMinutes();
+ void increaseHours();
+
+ void decreaseMinutes();
+ void decreaseHours();
+
+ bool isPM() const;
+ void switchDayPeriod();
+
+ void updateText();
+
+ EEditingPart getEditingPart();
+
+ static std::string getHoursString(const std::string& str);
+ static std::string getMinutesString(const std::string& str);
+ static std::string getAMPMString(const std::string& str);
+
+ static bool isHoursStringValid(const std::string& str);
+ static bool isMinutesStringValid(const std::string& str);
+ static bool isPMAMStringValid(const std::string& str);
+
+ static U32 parseHours(const std::string& str);
+ static U32 parseMinutes(const std::string& str);
+ static bool parseAMPM(const std::string& str);
+
+ class LLTextBox* mLabelBox;
+
+ class LLLineEditor* mEditor;
+ LLUIColor mTextEnabledColor;
+ LLUIColor mTextDisabledColor;
+
+ class LLButton* mUpBtn;
+ class LLButton* mDownBtn;
+
+ U32 mTime; // minutes since midnight: 0 - 1439
+ U32 mSnapToMin; // interval in minutes to snap to
+
+ BOOL mAllowEdit;
+};
+#endif /* LLTIMECTRL_H_ */
diff --git a/indra/llui/lltoolbar.cpp b/indra/llui/lltoolbar.cpp
new file mode 100644
index 0000000000..81ea0ebf0c
--- /dev/null
+++ b/indra/llui/lltoolbar.cpp
@@ -0,0 +1,1230 @@
+/**
+ * @file lltoolbar.cpp
+ * @author Richard Nelson
+ * @brief User customizable toolbar class
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+
+#include <boost/foreach.hpp>
+#include "lltoolbar.h"
+
+#include "llcommandmanager.h"
+#include "llmenugl.h"
+#include "lltrans.h"
+#include "llinventory.h"
+#include "lliconctrl.h"
+
+// uncomment this and remove the one in llui.cpp when there is an external reference to this translation unit
+// thanks, MSVC!
+//static LLDefaultChildRegistry::Register<LLToolBar> r1("toolbar");
+
+namespace LLToolBarEnums
+{
+ LLLayoutStack::ELayoutOrientation getOrientation(SideType sideType)
+ {
+ LLLayoutStack::ELayoutOrientation orientation = LLLayoutStack::HORIZONTAL;
+
+ if ((sideType == SIDE_LEFT) || (sideType == SIDE_RIGHT))
+ {
+ orientation = LLLayoutStack::VERTICAL;
+ }
+
+ return orientation;
+ }
+}
+
+using namespace LLToolBarEnums;
+
+
+namespace LLInitParam
+{
+ void TypeValues<ButtonType>::declareValues()
+ {
+ declare("icons_with_text", BTNTYPE_ICONS_WITH_TEXT);
+ declare("icons_only", BTNTYPE_ICONS_ONLY);
+ }
+
+ void TypeValues<SideType>::declareValues()
+ {
+ declare("bottom", SIDE_BOTTOM);
+ declare("left", SIDE_LEFT);
+ declare("right", SIDE_RIGHT);
+ declare("top", SIDE_TOP);
+ }
+}
+
+LLToolBar::Params::Params()
+: button_display_mode("button_display_mode"),
+ commands("command"),
+ side("side", SIDE_TOP),
+ button_icon("button_icon"),
+ button_icon_and_text("button_icon_and_text"),
+ read_only("read_only", false),
+ wrap("wrap", true),
+ pad_left("pad_left"),
+ pad_top("pad_top"),
+ pad_right("pad_right"),
+ pad_bottom("pad_bottom"),
+ pad_between("pad_between"),
+ min_girth("min_girth"),
+ button_panel("button_panel")
+{}
+
+LLToolBar::LLToolBar(const LLToolBar::Params& p)
+: LLUICtrl(p),
+ mReadOnly(p.read_only),
+ mButtonType(p.button_display_mode),
+ mSideType(p.side),
+ mWrap(p.wrap),
+ mNeedsLayout(false),
+ mModified(false),
+ mButtonPanel(NULL),
+ mCenteringStack(NULL),
+ mPadLeft(p.pad_left),
+ mPadRight(p.pad_right),
+ mPadTop(p.pad_top),
+ mPadBottom(p.pad_bottom),
+ mPadBetween(p.pad_between),
+ mMinGirth(p.min_girth),
+ mPopupMenuHandle(),
+ mRightMouseTargetButton(NULL),
+ mStartDragItemCallback(NULL),
+ mHandleDragItemCallback(NULL),
+ mHandleDropCallback(NULL),
+ mButtonAddSignal(NULL),
+ mButtonEnterSignal(NULL),
+ mButtonLeaveSignal(NULL),
+ mButtonRemoveSignal(NULL),
+ mDragAndDropTarget(false)
+{
+ mButtonParams[LLToolBarEnums::BTNTYPE_ICONS_WITH_TEXT] = p.button_icon_and_text;
+ mButtonParams[LLToolBarEnums::BTNTYPE_ICONS_ONLY] = p.button_icon;
+}
+
+LLToolBar::~LLToolBar()
+{
+ delete mPopupMenuHandle.get();
+ delete mButtonAddSignal;
+ delete mButtonEnterSignal;
+ delete mButtonLeaveSignal;
+ delete mButtonRemoveSignal;
+}
+
+void LLToolBar::createContextMenu()
+{
+ if (!mPopupMenuHandle.get())
+ {
+ // Setup bindings specific to this instance for the context menu options
+
+ LLUICtrl::CommitCallbackRegistry::ScopedRegistrar commit_reg;
+ commit_reg.add("Toolbars.EnableSetting", boost::bind(&LLToolBar::onSettingEnable, this, _2));
+ commit_reg.add("Toolbars.RemoveSelectedCommand", boost::bind(&LLToolBar::onRemoveSelectedCommand, this));
+
+ LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_reg;
+ enable_reg.add("Toolbars.CheckSetting", boost::bind(&LLToolBar::isSettingChecked, this, _2));
+
+ // Create the context menu
+ LLContextMenu* menu = LLUICtrlFactory::instance().createFromFile<LLContextMenu>("menu_toolbars.xml", LLMenuGL::sMenuContainer, LLMenuHolderGL::child_registry_t::instance());
+
+ if (menu)
+ {
+ menu->setBackgroundColor(LLUIColorTable::instance().getColor("MenuPopupBgColor"));
+ mPopupMenuHandle = menu->getHandle();
+ mRemoveButtonHandle = menu->getChild<LLView>("Remove button")->getHandle();
+ }
+ else
+ {
+ llwarns << "Unable to load toolbars context menu." << llendl;
+ }
+ }
+
+ if (mRemoveButtonHandle.get())
+ {
+ // Disable/Enable the "Remove button" menu item depending on whether or not a button was clicked
+ mRemoveButtonHandle.get()->setEnabled(mRightMouseTargetButton != NULL);
+ }
+}
+
+void LLToolBar::initFromParams(const LLToolBar::Params& p)
+{
+ // Initialize the base object
+ LLUICtrl::initFromParams(p);
+
+ LLLayoutStack::ELayoutOrientation orientation = getOrientation(p.side);
+
+ LLLayoutStack::Params centering_stack_p;
+ centering_stack_p.name = "centering_stack";
+ centering_stack_p.rect = getLocalRect();
+ centering_stack_p.follows.flags = FOLLOWS_ALL;
+ centering_stack_p.orientation = orientation;
+ centering_stack_p.mouse_opaque = false;
+
+ mCenteringStack = LLUICtrlFactory::create<LLLayoutStack>(centering_stack_p);
+ addChild(mCenteringStack);
+
+ LLLayoutPanel::Params border_panel_p;
+ border_panel_p.name = "border_panel";
+ border_panel_p.rect = getLocalRect();
+ border_panel_p.auto_resize = true;
+ border_panel_p.user_resize = false;
+ border_panel_p.mouse_opaque = false;
+
+ mCenteringStack->addChild(LLUICtrlFactory::create<LLLayoutPanel>(border_panel_p));
+
+ LLLayoutPanel::Params center_panel_p;
+ center_panel_p.name = "center_panel";
+ center_panel_p.rect = getLocalRect();
+ center_panel_p.auto_resize = false;
+ center_panel_p.user_resize = false;
+ center_panel_p.mouse_opaque = false;
+ LLLayoutPanel* center_panel = LLUICtrlFactory::create<LLLayoutPanel>(center_panel_p);
+ mCenteringStack->addChild(center_panel);
+
+ LLPanel::Params button_panel_p(p.button_panel);
+ button_panel_p.rect = center_panel->getLocalRect();
+ button_panel_p.follows.flags = FOLLOWS_BOTTOM|FOLLOWS_LEFT;
+ mButtonPanel = LLUICtrlFactory::create<LLPanel>(button_panel_p);
+ center_panel->addChild(mButtonPanel);
+
+ mCenteringStack->addChild(LLUICtrlFactory::create<LLLayoutPanel>(border_panel_p));
+
+ BOOST_FOREACH(LLCommandId id, p.commands)
+ {
+ addCommand(id);
+ }
+
+ mNeedsLayout = true;
+}
+
+bool LLToolBar::addCommand(const LLCommandId& commandId, int rank)
+{
+ LLCommand * command = LLCommandManager::instance().getCommand(commandId);
+ if (!command) return false;
+
+ // Create the button and do the things that don't need ordering
+ LLToolBarButton* button = createButton(commandId);
+ mButtonPanel->addChild(button);
+ mButtonMap.insert(std::make_pair(commandId.uuid(), button));
+
+ // Insert the command and button in the right place in their respective lists
+ if ((rank >= mButtonCommands.size()) || (rank == RANK_NONE))
+ {
+ // In that case, back load
+ mButtonCommands.push_back(command->id());
+ mButtons.push_back(button);
+ }
+ else
+ {
+ // Insert in place: iterate to the right spot...
+ std::list<LLToolBarButton*>::iterator it_button = mButtons.begin();
+ command_id_list_t::iterator it_command = mButtonCommands.begin();
+ while (rank > 0)
+ {
+ ++it_button;
+ ++it_command;
+ rank--;
+ }
+ // ...then insert
+ mButtonCommands.insert(it_command, command->id());
+ mButtons.insert(it_button,button);
+ }
+
+ mNeedsLayout = true;
+
+ updateLayoutAsNeeded();
+
+
+ if (mButtonAddSignal)
+ {
+ (*mButtonAddSignal)(button);
+ }
+
+ return true;
+}
+
+// Remove a command from the list
+// Returns the rank of the command in the original list so that doing addCommand(id,rank) right after
+// a removeCommand(id) would leave the list unchanged.
+// Returns RANK_NONE if the command is not found in the list
+int LLToolBar::removeCommand(const LLCommandId& commandId)
+{
+ if (!hasCommand(commandId)) return RANK_NONE;
+
+ // First erase the map record
+ command_id_map::iterator it = mButtonMap.find(commandId.uuid());
+ mButtonMap.erase(it);
+
+ // Now iterate on the commands and buttons to identify the relevant records
+ int rank = 0;
+ std::list<LLToolBarButton*>::iterator it_button = mButtons.begin();
+ command_id_list_t::iterator it_command = mButtonCommands.begin();
+ while (*it_command != commandId)
+ {
+ ++it_button;
+ ++it_command;
+ ++rank;
+ }
+
+ if (mButtonRemoveSignal)
+ {
+ (*mButtonRemoveSignal)(*it_button);
+ }
+
+ // Delete the button and erase the command and button records
+ delete (*it_button);
+ mButtonCommands.erase(it_command);
+ mButtons.erase(it_button);
+
+ mNeedsLayout = true;
+
+ return rank;
+}
+
+void LLToolBar::clearCommandsList()
+{
+ // Clears the commands list
+ mButtonCommands.clear();
+ // This will clear the buttons
+ createButtons();
+}
+
+bool LLToolBar::hasCommand(const LLCommandId& commandId) const
+{
+ if (commandId != LLCommandId::null)
+ {
+ command_id_map::const_iterator it = mButtonMap.find(commandId.uuid());
+ return (it != mButtonMap.end());
+ }
+
+ return false;
+}
+
+bool LLToolBar::enableCommand(const LLCommandId& commandId, bool enabled)
+{
+ LLButton * command_button = NULL;
+
+ if (commandId != LLCommandId::null)
+ {
+ command_id_map::iterator it = mButtonMap.find(commandId.uuid());
+ if (it != mButtonMap.end())
+ {
+ command_button = it->second;
+ command_button->setEnabled(enabled);
+ }
+ }
+
+ return (command_button != NULL);
+}
+
+bool LLToolBar::stopCommandInProgress(const LLCommandId& commandId)
+{
+ //
+ // Note from Leslie:
+ //
+ // This implementation was largely put in place to handle EXP-1348 which is related to
+ // dragging and dropping the "speak" button. The "speak" button can be in one of two
+ // modes, i.e., either a toggle action or a push-to-talk action. Because of this it
+ // responds to mouse down and mouse up in different ways, based on which behavior the
+ // button is currently set to obey. This was the simplest way of getting the button
+ // to turn off the microphone for both behaviors without risking duplicate state.
+ //
+
+ LLToolBarButton * command_button = NULL;
+
+ if (commandId != LLCommandId::null)
+ {
+ LLCommand* command = LLCommandManager::instance().getCommand(commandId);
+ llassert(command);
+
+ // If this command has an explicit function for execution stop
+ if (command->executeStopFunctionName().length() > 0)
+ {
+ command_id_map::iterator it = mButtonMap.find(commandId.uuid());
+ if (it != mButtonMap.end())
+ {
+ command_button = it->second;
+ llassert(command_button->mIsRunningSignal);
+
+ // Check to see if it is running
+ if ((*command_button->mIsRunningSignal)(command_button, command->isRunningParameters()))
+ {
+ // Trigger an additional button commit, which calls mouse down, mouse up and commit
+ command_button->onCommit();
+ }
+ }
+ }
+ }
+
+ return (command_button != NULL);
+}
+
+bool LLToolBar::flashCommand(const LLCommandId& commandId, bool flash)
+{
+ LLButton * command_button = NULL;
+
+ if (commandId != LLCommandId::null)
+ {
+ command_id_map::iterator it = mButtonMap.find(commandId.uuid());
+ if (it != mButtonMap.end())
+ {
+ command_button = it->second;
+ command_button->setFlashing(flash ? TRUE : FALSE);
+ }
+ }
+
+ return (command_button != NULL);
+}
+
+BOOL LLToolBar::handleRightMouseDown(S32 x, S32 y, MASK mask)
+{
+ LLRect button_panel_rect;
+ mButtonPanel->localRectToOtherView(mButtonPanel->getLocalRect(), &button_panel_rect, this);
+ BOOL handle_it_here = !mReadOnly && button_panel_rect.pointInRect(x, y);
+
+ if (handle_it_here)
+ {
+ // Determine which button the mouse was over during the click in case the context menu action
+ // is intended to affect the button.
+ mRightMouseTargetButton = NULL;
+ BOOST_FOREACH(LLToolBarButton* button, mButtons)
+ {
+ LLRect button_rect;
+ button->localRectToOtherView(button->getLocalRect(), &button_rect, this);
+
+ if (button_rect.pointInRect(x, y))
+ {
+ mRightMouseTargetButton = button;
+ break;
+ }
+ }
+
+ createContextMenu();
+
+ LLContextMenu * menu = (LLContextMenu *) mPopupMenuHandle.get();
+
+ if (menu)
+ {
+ menu->show(x, y);
+
+ LLMenuGL::showPopup(this, menu, x, y);
+ }
+ }
+
+ return handle_it_here;
+}
+
+BOOL LLToolBar::isSettingChecked(const LLSD& userdata)
+{
+ BOOL retval = FALSE;
+
+ const std::string setting_name = userdata.asString();
+
+ if (setting_name == "icons_with_text")
+ {
+ retval = (mButtonType == BTNTYPE_ICONS_WITH_TEXT);
+ }
+ else if (setting_name == "icons_only")
+ {
+ retval = (mButtonType == BTNTYPE_ICONS_ONLY);
+ }
+
+ return retval;
+}
+
+void LLToolBar::onSettingEnable(const LLSD& userdata)
+{
+ llassert(!mReadOnly);
+
+ const std::string setting_name = userdata.asString();
+
+ if (setting_name == "icons_with_text")
+ {
+ setButtonType(BTNTYPE_ICONS_WITH_TEXT);
+ }
+ else if (setting_name == "icons_only")
+ {
+ setButtonType(BTNTYPE_ICONS_ONLY);
+ }
+}
+
+void LLToolBar::onRemoveSelectedCommand()
+{
+ llassert(!mReadOnly);
+
+ if (mRightMouseTargetButton)
+ {
+ removeCommand(mRightMouseTargetButton->getCommandId());
+
+ mRightMouseTargetButton = NULL;
+ }
+}
+
+void LLToolBar::setButtonType(LLToolBarEnums::ButtonType button_type)
+{
+ bool regenerate_buttons = (mButtonType != button_type);
+
+ mButtonType = button_type;
+
+ if (regenerate_buttons)
+ {
+ createButtons();
+ }
+}
+
+void LLToolBar::resizeButtonsInRow(std::vector<LLToolBarButton*>& buttons_in_row, S32 max_row_girth)
+{
+ // make buttons in current row all same girth
+ BOOST_FOREACH(LLToolBarButton* button, buttons_in_row)
+ {
+ if (getOrientation(mSideType) == LLLayoutStack::HORIZONTAL)
+ {
+ button->reshape(button->mWidthRange.clamp(button->getRect().getWidth()), max_row_girth);
+ }
+ else // VERTICAL
+ {
+ button->reshape(max_row_girth, button->getRect().getHeight());
+ }
+ }
+}
+
+// Returns the position of the coordinates as a rank in the button list.
+// The rank is the position a tool dropped in (x,y) would assume in the button list.
+// The returned value is between 0 and mButtons.size(), 0 being the first element to the left
+// (or top) and mButtons.size() the last one to the right (or bottom).
+// Various drag data are stored in the toolbar object though are not exposed outside (and shouldn't).
+int LLToolBar::getRankFromPosition(S32 x, S32 y)
+{
+ if (mButtons.empty())
+ {
+ return RANK_NONE;
+ }
+
+ int rank = 0;
+
+ // Convert the toolbar coord into button panel coords
+ LLLayoutStack::ELayoutOrientation orientation = getOrientation(mSideType);
+ S32 button_panel_x = 0;
+ S32 button_panel_y = 0;
+ localPointToOtherView(x, y, &button_panel_x, &button_panel_y, mButtonPanel);
+ S32 dx = x - button_panel_x;
+ S32 dy = y - button_panel_y;
+
+ // Simply compare the passed coord with the buttons outbound box + padding
+ std::list<LLToolBarButton*>::iterator it_button = mButtons.begin();
+ std::list<LLToolBarButton*>::iterator end_button = mButtons.end();
+ LLRect button_rect;
+ while (it_button != end_button)
+ {
+ button_rect = (*it_button)->getRect();
+ S32 point_x = button_rect.mRight + mPadRight;
+ S32 point_y = button_rect.mBottom - mPadBottom;
+
+ if ((button_panel_x < point_x) && (button_panel_y > point_y))
+ {
+ break;
+ }
+ rank++;
+ ++it_button;
+ }
+
+ // Update the passed coordinates to the hit button relevant corner
+ // (different depending on toolbar orientation)
+ if (rank < mButtons.size())
+ {
+ if (orientation == LLLayoutStack::HORIZONTAL)
+ {
+ // Horizontal
+ S32 mid_point = (button_rect.mRight + button_rect.mLeft) / 2;
+ if (button_panel_x < mid_point)
+ {
+ mDragx = button_rect.mLeft - mPadLeft;
+ mDragy = button_rect.mTop + mPadTop;
+ }
+ else
+ {
+ rank++;
+ mDragx = button_rect.mRight + mPadRight - 1;
+ mDragy = button_rect.mTop + mPadTop;
+ }
+ }
+ else
+ {
+ // Vertical
+ S32 mid_point = (button_rect.mTop + button_rect.mBottom) / 2;
+ if (button_panel_y > mid_point)
+ {
+ mDragx = button_rect.mLeft - mPadLeft;
+ mDragy = button_rect.mTop + mPadTop;
+ }
+ else
+ {
+ rank++;
+ mDragx = button_rect.mLeft - mPadLeft;
+ mDragy = button_rect.mBottom - mPadBottom + 1;
+ }
+ }
+ }
+ else
+ {
+ // We hit passed the end of the list so put the insertion point at the end
+ if (orientation == LLLayoutStack::HORIZONTAL)
+ {
+ mDragx = button_rect.mRight + mPadRight;
+ mDragy = button_rect.mTop + mPadTop;
+ }
+ else
+ {
+ mDragx = button_rect.mLeft - mPadLeft;
+ mDragy = button_rect.mBottom - mPadBottom;
+ }
+ }
+
+ // Update the "girth" of the caret, i.e. the width or height (depending of orientation)
+ if (orientation == LLLayoutStack::HORIZONTAL)
+ {
+ mDragGirth = button_rect.getHeight() + mPadBottom + mPadTop;
+ }
+ else
+ {
+ mDragGirth = button_rect.getWidth() + mPadLeft + mPadRight;
+ }
+
+ // The delta account for the coord model change (i.e. convert back to toolbar coord)
+ mDragx += dx;
+ mDragy += dy;
+
+ return rank;
+}
+
+int LLToolBar::getRankFromPosition(const LLCommandId& id)
+{
+ if (!hasCommand(id))
+ {
+ return RANK_NONE;
+ }
+ int rank = 0;
+ std::list<LLToolBarButton*>::iterator it_button = mButtons.begin();
+ std::list<LLToolBarButton*>::iterator end_button = mButtons.end();
+ while (it_button != end_button)
+ {
+ if ((*it_button)->mId == id)
+ {
+ break;
+ }
+ rank++;
+ ++it_button;
+ }
+ return rank;
+}
+
+void LLToolBar::updateLayoutAsNeeded()
+{
+ if (!mNeedsLayout) return;
+
+ LLLayoutStack::ELayoutOrientation orientation = getOrientation(mSideType);
+
+ // our terminology for orientation-agnostic layout is such that
+ // length refers to a distance in the direction we stack the buttons
+ // and girth refers to a distance in the direction buttons wrap
+ S32 max_row_girth = 0;
+ S32 max_row_length = 0;
+
+ S32 max_length;
+ S32 max_total_girth;
+ S32 cur_start;
+ S32 cur_row ;
+ S32 row_pad_start;
+ S32 row_pad_end;
+ S32 girth_pad_end;
+ S32 row_running_length;
+
+ if (orientation == LLLayoutStack::HORIZONTAL)
+ {
+ max_length = getRect().getWidth() - mPadLeft - mPadRight;
+ max_total_girth = getRect().getHeight() - mPadTop - mPadBottom;
+ row_pad_start = mPadLeft;
+ row_pad_end = mPadRight;
+ cur_row = mPadTop;
+ girth_pad_end = mPadBottom;
+ }
+ else // VERTICAL
+ {
+ max_length = getRect().getHeight() - mPadTop - mPadBottom;
+ max_total_girth = getRect().getWidth() - mPadLeft - mPadRight;
+ row_pad_start = mPadTop;
+ row_pad_end = mPadBottom;
+ cur_row = mPadLeft;
+ girth_pad_end = mPadRight;
+ }
+
+ row_running_length = row_pad_start;
+ cur_start = row_pad_start;
+
+
+ LLRect panel_rect = mButtonPanel->getLocalRect();
+
+ std::vector<LLToolBarButton*> buttons_in_row;
+
+ BOOST_FOREACH(LLToolBarButton* button, mButtons)
+ {
+ button->reshape(button->mWidthRange.getMin(), button->mDesiredHeight);
+ button->autoResize();
+
+ S32 button_clamped_width = button->mWidthRange.clamp(button->getRect().getWidth());
+ S32 button_length = (orientation == LLLayoutStack::HORIZONTAL)
+ ? button_clamped_width
+ : button->getRect().getHeight();
+ S32 button_girth = (orientation == LLLayoutStack::HORIZONTAL)
+ ? button->getRect().getHeight()
+ : button_clamped_width;
+
+ // wrap if needed
+ if (mWrap
+ && row_running_length + button_length > max_length // out of room...
+ && cur_start != row_pad_start) // ...and not first button in row
+ {
+ if (orientation == LLLayoutStack::VERTICAL)
+ { // row girth (width in this case) is clamped to allowable button widths
+ max_row_girth = button->mWidthRange.clamp(max_row_girth);
+ }
+
+ // make buttons in current row all same girth
+ resizeButtonsInRow(buttons_in_row, max_row_girth);
+ buttons_in_row.clear();
+
+ max_row_length = llmax(max_row_length, row_running_length);
+ row_running_length = row_pad_start;
+ cur_start = row_pad_start;
+ cur_row += max_row_girth + mPadBetween;
+ max_row_girth = 0;
+ }
+
+ LLRect button_rect;
+ if (orientation == LLLayoutStack::HORIZONTAL)
+ {
+ button_rect.setLeftTopAndSize(cur_start, panel_rect.mTop - cur_row, button_clamped_width, button->getRect().getHeight());
+ }
+ else // VERTICAL
+ {
+ button_rect.setLeftTopAndSize(cur_row, panel_rect.mTop - cur_start, button_clamped_width, button->getRect().getHeight());
+ }
+ button->setShape(button_rect);
+
+ buttons_in_row.push_back(button);
+
+ row_running_length += button_length + mPadBetween;
+ cur_start = row_running_length;
+ max_row_girth = llmax(button_girth, max_row_girth);
+ }
+
+ // final resizing in "girth" direction
+ S32 total_girth = cur_row // current row position...
+ + max_row_girth // ...incremented by size of final row...
+ + girth_pad_end; // ...plus padding reserved on end
+ total_girth = llmax(total_girth,mMinGirth);
+
+ max_row_length = llmax(max_row_length, row_running_length - mPadBetween + row_pad_end);
+
+ resizeButtonsInRow(buttons_in_row, max_row_girth);
+
+ // grow and optionally shift toolbar to accommodate buttons
+ if (orientation == LLLayoutStack::HORIZONTAL)
+ {
+ if (mSideType == SIDE_TOP)
+ { // shift down to maintain top edge
+ translate(0, getRect().getHeight() - total_girth);
+ }
+
+ reshape(getRect().getWidth(), total_girth);
+ mButtonPanel->reshape(max_row_length, total_girth);
+ }
+ else // VERTICAL
+ {
+ if (mSideType == SIDE_RIGHT)
+ { // shift left to maintain right edge
+ translate(getRect().getWidth() - total_girth, 0);
+ }
+
+ reshape(total_girth, getRect().getHeight());
+ mButtonPanel->reshape(total_girth, max_row_length);
+ }
+
+ // make parent fit button panel
+ mButtonPanel->getParent()->setShape(mButtonPanel->getLocalRect());
+
+ // re-center toolbar buttons
+ mCenteringStack->updateLayout();
+
+ if (!mButtons.empty())
+ {
+ mButtonPanel->setVisible(TRUE);
+ mButtonPanel->setMouseOpaque(TRUE);
+ }
+
+ // don't clear flag until after we've resized ourselves, to avoid laying out every frame
+ mNeedsLayout = false;
+}
+
+
+void LLToolBar::draw()
+{
+ if (mButtons.empty())
+ {
+ mButtonPanel->setVisible(FALSE);
+ mButtonPanel->setMouseOpaque(FALSE);
+ }
+ else
+ {
+ mButtonPanel->setVisible(TRUE);
+ mButtonPanel->setMouseOpaque(TRUE);
+ }
+
+ // Update enable/disable state and highlight state for editable toolbars
+ if (!mReadOnly)
+ {
+ for (toolbar_button_list::iterator btn_it = mButtons.begin(); btn_it != mButtons.end(); ++btn_it)
+ {
+ LLToolBarButton* btn = *btn_it;
+ LLCommand* command = LLCommandManager::instance().getCommand(btn->mId);
+
+ if (command && btn->mIsEnabledSignal)
+ {
+ const bool button_command_enabled = (*btn->mIsEnabledSignal)(btn, command->isEnabledParameters());
+ btn->setEnabled(button_command_enabled);
+ }
+
+ if (command && btn->mIsRunningSignal)
+ {
+ const bool button_command_running = (*btn->mIsRunningSignal)(btn, command->isRunningParameters());
+ btn->setToggleState(button_command_running);
+ }
+ }
+ }
+
+ updateLayoutAsNeeded();
+ // rect may have shifted during layout
+ LLUI::popMatrix();
+ LLUI::pushMatrix();
+ LLUI::translate((F32)getRect().mLeft, (F32)getRect().mBottom);
+
+ // Position the caret
+ LLIconCtrl* caret = getChild<LLIconCtrl>("caret");
+ caret->setVisible(FALSE);
+ if (mDragAndDropTarget && !mButtonCommands.empty())
+ {
+ LLRect caret_rect = caret->getRect();
+ LLRect toolbar_rect = getRect();
+ if (getOrientation(mSideType) == LLLayoutStack::HORIZONTAL)
+ {
+ caret->setRect(LLRect(mDragx-caret_rect.getWidth()/2+1,
+ mDragy,
+ mDragx+caret_rect.getWidth()/2+1,
+ mDragy-mDragGirth));
+ }
+ else
+ {
+ caret->setRect(LLRect(mDragx,
+ mDragy+caret_rect.getHeight()/2,
+ mDragx+mDragGirth,
+ mDragy-caret_rect.getHeight()/2));
+ }
+ caret->setVisible(TRUE);
+ }
+
+ LLUICtrl::draw();
+ caret->setVisible(FALSE);
+ mDragAndDropTarget = false;
+}
+
+void LLToolBar::reshape(S32 width, S32 height, BOOL called_from_parent)
+{
+ LLUICtrl::reshape(width, height, called_from_parent);
+ mNeedsLayout = true;
+}
+
+void LLToolBar::createButtons()
+{
+ BOOST_FOREACH(LLToolBarButton* button, mButtons)
+ {
+ if (mButtonRemoveSignal)
+ {
+ (*mButtonRemoveSignal)(button);
+ }
+
+ delete button;
+ }
+ mButtons.clear();
+ mButtonMap.clear();
+ mRightMouseTargetButton = NULL;
+
+ BOOST_FOREACH(LLCommandId& command_id, mButtonCommands)
+ {
+ LLToolBarButton* button = createButton(command_id);
+ mButtons.push_back(button);
+ mButtonPanel->addChild(button);
+ mButtonMap.insert(std::make_pair(command_id.uuid(), button));
+
+ if (mButtonAddSignal)
+ {
+ (*mButtonAddSignal)(button);
+ }
+ }
+ mNeedsLayout = true;
+}
+
+void LLToolBarButton::callIfEnabled(LLUICtrl::commit_callback_t commit, LLUICtrl* ctrl, const LLSD& param )
+{
+ LLCommand* command = LLCommandManager::instance().getCommand(mId);
+
+ if (!mIsEnabledSignal || (*mIsEnabledSignal)(this, command->isEnabledParameters()))
+ {
+ commit(ctrl, param);
+ }
+}
+
+LLToolBarButton* LLToolBar::createButton(const LLCommandId& id)
+{
+ LLCommand* commandp = LLCommandManager::instance().getCommand(id);
+ if (!commandp) return NULL;
+
+ LLToolBarButton::Params button_p;
+ button_p.name = commandp->name();
+ button_p.label = LLTrans::getString(commandp->labelRef());
+ button_p.tool_tip = LLTrans::getString(commandp->tooltipRef());
+ button_p.image_overlay = LLUI::getUIImage(commandp->icon());
+ button_p.overwriteFrom(mButtonParams[mButtonType]);
+ LLToolBarButton* button = LLUICtrlFactory::create<LLToolBarButton>(button_p);
+
+ if (!mReadOnly)
+ {
+ enable_callback_t isEnabledCB;
+
+ const std::string& isEnabledFunction = commandp->isEnabledFunctionName();
+ if (isEnabledFunction.length() > 0)
+ {
+ LLUICtrl::EnableCallbackParam isEnabledParam;
+ isEnabledParam.function_name = isEnabledFunction;
+ isEnabledParam.parameter = commandp->isEnabledParameters();
+ isEnabledCB = initEnableCallback(isEnabledParam);
+
+ if (NULL == button->mIsEnabledSignal)
+ {
+ button->mIsEnabledSignal = new enable_signal_t();
+ }
+
+ button->mIsEnabledSignal->connect(isEnabledCB);
+ }
+
+ LLUICtrl::CommitCallbackParam executeParam;
+ executeParam.function_name = commandp->executeFunctionName();
+ executeParam.parameter = commandp->executeParameters();
+
+ // If we have a "stop" function then we map the command to mouse down / mouse up otherwise commit
+ const std::string& executeStopFunction = commandp->executeStopFunctionName();
+ if (executeStopFunction.length() > 0)
+ {
+ LLUICtrl::CommitCallbackParam executeStopParam;
+ executeStopParam.function_name = executeStopFunction;
+ executeStopParam.parameter = commandp->executeStopParameters();
+ LLUICtrl::commit_callback_t execute_func = initCommitCallback(executeParam);
+ LLUICtrl::commit_callback_t stop_func = initCommitCallback(executeStopParam);
+
+ button->setMouseDownCallback(boost::bind(&LLToolBarButton::callIfEnabled, button, execute_func, _1, _2));
+ button->setMouseUpCallback(boost::bind(&LLToolBarButton::callIfEnabled, button, stop_func, _1, _2));
+ }
+ else
+ {
+ button->setCommitCallback(executeParam);
+ }
+
+ // Set up "is running" query callback
+ const std::string& isRunningFunction = commandp->isRunningFunctionName();
+ if (isRunningFunction.length() > 0)
+ {
+ LLUICtrl::EnableCallbackParam isRunningParam;
+ isRunningParam.function_name = isRunningFunction;
+ isRunningParam.parameter = commandp->isRunningParameters();
+ enable_signal_t::slot_type isRunningCB = initEnableCallback(isRunningParam);
+
+ if (NULL == button->mIsRunningSignal)
+ {
+ button->mIsRunningSignal = new enable_signal_t();
+ }
+
+ button->mIsRunningSignal->connect(isRunningCB);
+ }
+ }
+
+ // Drag and drop behavior must work also if provided in the Toybox and, potentially, any read-only toolbar
+ button->setStartDragCallback(mStartDragItemCallback);
+ button->setHandleDragCallback(mHandleDragItemCallback);
+
+ button->setCommandId(id);
+
+ return button;
+}
+
+boost::signals2::connection connectSignal(LLToolBar::button_signal_t*& signal, const LLToolBar::button_signal_t::slot_type& cb)
+{
+ if (!signal)
+ {
+ signal = new LLToolBar::button_signal_t();
+ }
+
+ return signal->connect(cb);
+}
+
+boost::signals2::connection LLToolBar::setButtonAddCallback(const button_signal_t::slot_type& cb)
+{
+ return connectSignal(mButtonAddSignal, cb);
+}
+
+boost::signals2::connection LLToolBar::setButtonEnterCallback(const button_signal_t::slot_type& cb)
+{
+ return connectSignal(mButtonEnterSignal, cb);
+}
+
+boost::signals2::connection LLToolBar::setButtonLeaveCallback(const button_signal_t::slot_type& cb)
+{
+ return connectSignal(mButtonLeaveSignal, cb);
+}
+
+boost::signals2::connection LLToolBar::setButtonRemoveCallback(const button_signal_t::slot_type& cb)
+{
+ return connectSignal(mButtonRemoveSignal, cb);
+}
+
+BOOL LLToolBar::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
+ EDragAndDropType cargo_type,
+ void* cargo_data,
+ EAcceptance* accept,
+ std::string& tooltip_msg)
+{
+ // If we have a drop callback, that means that we can handle the drop
+ BOOL handled = (mHandleDropCallback ? TRUE : FALSE);
+
+ // if drop is set, it's time to call the callback to get the operation done
+ if (handled && drop)
+ {
+ handled = mHandleDropCallback(cargo_data, x, y ,this);
+ }
+
+ // We accept only single tool drop on toolbars
+ *accept = (handled ? ACCEPT_YES_SINGLE : ACCEPT_NO);
+
+ // We'll use that flag to change the visual aspect of the toolbar target on draw()
+ mDragAndDropTarget = false;
+
+ // Convert drag position into insert position and rank
+ if (!isReadOnly() && handled && !drop)
+ {
+ LLInventoryItem* inv_item = (LLInventoryItem*)cargo_data;
+ LLAssetType::EType type = inv_item->getType();
+ if (type == LLAssetType::AT_WIDGET)
+ {
+ LLCommandId dragged_command(inv_item->getUUID());
+ int orig_rank = getRankFromPosition(dragged_command);
+ mDragRank = getRankFromPosition(x, y);
+ // Don't DaD if we're dragging a command on itself
+ mDragAndDropTarget = ((orig_rank != RANK_NONE) && ((mDragRank == orig_rank) || ((mDragRank-1) == orig_rank)) ? false : true);
+ //llinfos << "Merov debug : DaD, rank = " << mDragRank << ", dragged uui = " << inv_item->getUUID() << llendl;
+ /* Do the following if you want to animate the button itself
+ LLCommandId dragged_command(inv_item->getUUID());
+ removeCommand(dragged_command);
+ addCommand(dragged_command,rank);
+ */
+ }
+ else
+ {
+ handled = FALSE;
+ }
+ }
+
+ return handled;
+}
+
+LLToolBarButton::LLToolBarButton(const Params& p)
+: LLButton(p),
+ mMouseDownX(0),
+ mMouseDownY(0),
+ mWidthRange(p.button_width),
+ mDesiredHeight(p.desired_height),
+ mId(""),
+ mIsEnabledSignal(NULL),
+ mIsRunningSignal(NULL),
+ mIsStartingSignal(NULL),
+ mIsDragged(false),
+ mStartDragItemCallback(NULL),
+ mHandleDragItemCallback(NULL),
+ mOriginalImageSelected(p.image_selected),
+ mOriginalImageUnselected(p.image_unselected),
+ mOriginalImagePressed(p.image_pressed),
+ mOriginalImagePressedSelected(p.image_pressed_selected),
+ mOriginalLabelColor(p.label_color),
+ mOriginalLabelColorSelected(p.label_color_selected),
+ mOriginalImageOverlayColor(p.image_overlay_color),
+ mOriginalImageOverlaySelectedColor(p.image_overlay_selected_color)
+{
+}
+
+LLToolBarButton::~LLToolBarButton()
+{
+ delete mIsEnabledSignal;
+ delete mIsRunningSignal;
+ delete mIsStartingSignal;
+}
+
+BOOL LLToolBarButton::handleMouseDown(S32 x, S32 y, MASK mask)
+{
+ mMouseDownX = x;
+ mMouseDownY = y;
+ return LLButton::handleMouseDown(x, y, mask);
+}
+
+BOOL LLToolBarButton::handleHover(S32 x, S32 y, MASK mask)
+{
+ BOOL handled = FALSE;
+
+ S32 mouse_distance_squared = (x - mMouseDownX) * (x - mMouseDownX) + (y - mMouseDownY) * (y - mMouseDownY);
+ S32 drag_threshold = LLUI::sSettingGroups["config"]->getS32("DragAndDropDistanceThreshold");
+ if (mouse_distance_squared > drag_threshold * drag_threshold
+ && hasMouseCapture() &&
+ mStartDragItemCallback && mHandleDragItemCallback)
+ {
+ if (!mIsDragged)
+ {
+ mStartDragItemCallback(x, y, this);
+ mIsDragged = true;
+ handled = TRUE;
+ }
+ else
+ {
+ handled = mHandleDragItemCallback(x, y, mId.uuid(), LLAssetType::AT_WIDGET);
+ }
+ }
+ else
+ {
+ handled = LLButton::handleHover(x, y, mask);
+ }
+
+ return handled;
+}
+
+void LLToolBarButton::onMouseEnter(S32 x, S32 y, MASK mask)
+{
+ LLUICtrl::onMouseEnter(x, y, mask);
+
+ // Always highlight toolbar buttons, even if they are disabled
+ if (!gFocusMgr.getMouseCapture() || gFocusMgr.getMouseCapture() == this)
+ {
+ mNeedsHighlight = TRUE;
+ }
+
+ LLToolBar* parent_toolbar = getParentByType<LLToolBar>();
+ if (parent_toolbar && parent_toolbar->mButtonEnterSignal)
+ {
+ (*(parent_toolbar->mButtonEnterSignal))(this);
+ }
+}
+
+void LLToolBarButton::onMouseLeave(S32 x, S32 y, MASK mask)
+{
+ LLButton::onMouseLeave(x, y, mask);
+
+ LLToolBar* parent_toolbar = getParentByType<LLToolBar>();
+ if (parent_toolbar && parent_toolbar->mButtonLeaveSignal)
+ {
+ (*(parent_toolbar->mButtonLeaveSignal))(this);
+ }
+}
+
+void LLToolBarButton::onMouseCaptureLost()
+{
+ mIsDragged = false;
+}
+
+void LLToolBarButton::onCommit()
+{
+ LLCommand* command = LLCommandManager::instance().getCommand(mId);
+
+ if (!mIsEnabledSignal || (*mIsEnabledSignal)(this, command->isEnabledParameters()))
+ {
+ LLButton::onCommit();
+ }
+}
+
+void LLToolBarButton::reshape(S32 width, S32 height, BOOL called_from_parent)
+{
+ LLButton::reshape(mWidthRange.clamp(width), height, called_from_parent);
+}
+
+void LLToolBarButton::setEnabled(BOOL enabled)
+{
+ if (enabled)
+ {
+ mImageSelected = mOriginalImageSelected;
+ mImageUnselected = mOriginalImageUnselected;
+ mImagePressed = mOriginalImagePressed;
+ mImagePressedSelected = mOriginalImagePressedSelected;
+ mUnselectedLabelColor = mOriginalLabelColor;
+ mSelectedLabelColor = mOriginalLabelColorSelected;
+ mImageOverlayColor = mOriginalImageOverlayColor;
+ mImageOverlaySelectedColor = mOriginalImageOverlaySelectedColor;
+ }
+ else
+ {
+ mImageSelected = mImageDisabledSelected;
+ mImageUnselected = mImageDisabled;
+ mImagePressed = mImageDisabled;
+ mImagePressedSelected = mImageDisabledSelected;
+ mUnselectedLabelColor = mDisabledLabelColor;
+ mSelectedLabelColor = mDisabledSelectedLabelColor;
+ mImageOverlayColor = mImageOverlayDisabledColor;
+ mImageOverlaySelectedColor = mImageOverlayDisabledColor;
+ }
+}
+
+const std::string LLToolBarButton::getToolTip() const
+{
+ std::string tooltip;
+
+ if (labelIsTruncated() || getCurrentLabel().empty())
+ {
+ tooltip = LLTrans::getString(LLCommandManager::instance().getCommand(mId)->labelRef()) + " -- " + LLView::getToolTip();
+ }
+ else
+ {
+ tooltip = LLView::getToolTip();
+ }
+
+ LLToolBar* parent_toolbar = getParentByType<LLToolBar>();
+ if (parent_toolbar && parent_toolbar->mButtonTooltipSuffix.length() > 0)
+ {
+ tooltip = tooltip + "\n(" + parent_toolbar->mButtonTooltipSuffix + ")";
+ }
+
+ return tooltip;
+}
+
diff --git a/indra/llui/lltoolbar.h b/indra/llui/lltoolbar.h
new file mode 100644
index 0000000000..a50c60282c
--- /dev/null
+++ b/indra/llui/lltoolbar.h
@@ -0,0 +1,290 @@
+/**
+ * @file lltoolbar.h
+ * @author Richard Nelson
+ * @brief User customizable toolbar class
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLTOOLBAR_H
+#define LL_LLTOOLBAR_H
+
+#include "llbutton.h"
+#include "llcommandmanager.h"
+#include "lllayoutstack.h"
+#include "lluictrl.h"
+#include "llcommandmanager.h"
+#include "llassettype.h"
+
+class LLToolBar;
+class LLToolBarButton;
+
+typedef boost::function<void (S32 x, S32 y, LLToolBarButton* button)> tool_startdrag_callback_t;
+typedef boost::function<BOOL (S32 x, S32 y, const LLUUID& uuid, LLAssetType::EType type)> tool_handledrag_callback_t;
+typedef boost::function<BOOL (void* data, S32 x, S32 y, LLToolBar* toolbar)> tool_handledrop_callback_t;
+
+class LLToolBarButton : public LLButton
+{
+ friend class LLToolBar;
+public:
+ struct Params : public LLInitParam::Block<Params, LLButton::Params>
+ {
+ Optional<LLUI::RangeS32::Params> button_width;
+ Optional<S32> desired_height;
+
+ Params()
+ : button_width("button_width"),
+ desired_height("desired_height", 20)
+ {}
+
+ };
+
+ LLToolBarButton(const Params& p);
+ ~LLToolBarButton();
+
+ BOOL handleMouseDown(S32 x, S32 y, MASK mask);
+ BOOL handleHover(S32 x, S32 y, MASK mask);
+
+ void reshape(S32 width, S32 height, BOOL called_from_parent = true);
+ void setEnabled(BOOL enabled);
+ void setCommandId(const LLCommandId& id) { mId = id; }
+ LLCommandId getCommandId() { return mId; }
+
+ void setStartDragCallback(tool_startdrag_callback_t cb) { mStartDragItemCallback = cb; }
+ void setHandleDragCallback(tool_handledrag_callback_t cb) { mHandleDragItemCallback = cb; }
+
+ void onMouseEnter(S32 x, S32 y, MASK mask);
+ void onMouseLeave(S32 x, S32 y, MASK mask);
+ void onMouseCaptureLost();
+
+ void onCommit();
+
+ virtual const std::string getToolTip() const;
+
+private:
+ void callIfEnabled(LLUICtrl::commit_callback_t commit, LLUICtrl* ctrl, const LLSD& param );
+
+ LLCommandId mId;
+ S32 mMouseDownX;
+ S32 mMouseDownY;
+ LLUI::RangeS32 mWidthRange;
+ S32 mDesiredHeight;
+ bool mIsDragged;
+ tool_startdrag_callback_t mStartDragItemCallback;
+ tool_handledrag_callback_t mHandleDragItemCallback;
+
+ enable_signal_t* mIsEnabledSignal;
+ enable_signal_t* mIsRunningSignal;
+ enable_signal_t* mIsStartingSignal;
+ LLPointer<LLUIImage> mOriginalImageSelected,
+ mOriginalImageUnselected,
+ mOriginalImagePressed,
+ mOriginalImagePressedSelected;
+ LLUIColor mOriginalLabelColor,
+ mOriginalLabelColorSelected,
+ mOriginalImageOverlayColor,
+ mOriginalImageOverlaySelectedColor;
+};
+
+
+namespace LLToolBarEnums
+{
+ enum ButtonType
+ {
+ BTNTYPE_ICONS_WITH_TEXT = 0,
+ BTNTYPE_ICONS_ONLY,
+
+ BTNTYPE_COUNT
+ };
+
+ enum SideType
+ {
+ SIDE_BOTTOM,
+ SIDE_LEFT,
+ SIDE_RIGHT,
+ SIDE_TOP,
+ };
+
+ LLLayoutStack::ELayoutOrientation getOrientation(SideType sideType);
+}
+
+// NOTE: This needs to occur before Param block declaration for proper compilation.
+namespace LLInitParam
+{
+ template<>
+ struct TypeValues<LLToolBarEnums::ButtonType> : public TypeValuesHelper<LLToolBarEnums::ButtonType>
+ {
+ static void declareValues();
+ };
+
+ template<>
+ struct TypeValues<LLToolBarEnums::SideType> : public TypeValuesHelper<LLToolBarEnums::SideType>
+ {
+ static void declareValues();
+ };
+}
+
+
+class LLToolBar
+: public LLUICtrl
+{
+ friend class LLToolBarButton;
+public:
+ struct Params : public LLInitParam::Block<Params, LLUICtrl::Params>
+ {
+ Mandatory<LLToolBarEnums::ButtonType> button_display_mode;
+ Mandatory<LLToolBarEnums::SideType> side;
+
+ Optional<LLToolBarButton::Params> button_icon,
+ button_icon_and_text;
+
+ Optional<bool> read_only,
+ wrap;
+
+ Optional<S32> pad_left,
+ pad_top,
+ pad_right,
+ pad_bottom,
+ pad_between,
+ min_girth;
+
+ // default command set
+ Multiple<LLCommandId::Params> commands;
+
+ Optional<LLPanel::Params> button_panel;
+
+ Params();
+ };
+
+ // virtuals
+ void draw();
+ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
+ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
+ virtual BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
+ EDragAndDropType cargo_type,
+ void* cargo_data,
+ EAcceptance* accept,
+ std::string& tooltip_msg);
+
+ static const int RANK_NONE = -1;
+ bool addCommand(const LLCommandId& commandId, int rank = RANK_NONE);
+ int removeCommand(const LLCommandId& commandId); // Returns the rank the removed command was at, RANK_NONE if not found
+ bool hasCommand(const LLCommandId& commandId) const; // is this command bound to a button in this toolbar
+ bool enableCommand(const LLCommandId& commandId, bool enabled); // enable/disable button bound to the specified command, if it exists in this toolbar
+ bool stopCommandInProgress(const LLCommandId& commandId); // stop command if it is currently active
+ bool flashCommand(const LLCommandId& commandId, bool flash); // flash button associated with given command, if in this toolbar
+
+ void setStartDragCallback(tool_startdrag_callback_t cb) { mStartDragItemCallback = cb; } // connects drag and drop behavior to external logic
+ void setHandleDragCallback(tool_handledrag_callback_t cb) { mHandleDragItemCallback = cb; }
+ void setHandleDropCallback(tool_handledrop_callback_t cb) { mHandleDropCallback = cb; }
+ bool isReadOnly() const { return mReadOnly; }
+
+ LLToolBarButton* createButton(const LLCommandId& id);
+
+ typedef boost::signals2::signal<void (LLView* button)> button_signal_t;
+ boost::signals2::connection setButtonAddCallback(const button_signal_t::slot_type& cb);
+ boost::signals2::connection setButtonEnterCallback(const button_signal_t::slot_type& cb);
+ boost::signals2::connection setButtonLeaveCallback(const button_signal_t::slot_type& cb);
+ boost::signals2::connection setButtonRemoveCallback(const button_signal_t::slot_type& cb);
+
+ // append the specified string to end of tooltip
+ void setTooltipButtonSuffix(const std::string& suffix) { mButtonTooltipSuffix = suffix; }
+
+ LLToolBarEnums::SideType getSideType() const { return mSideType; }
+ bool hasButtons() const { return !mButtons.empty(); }
+ bool isModified() const { return mModified; }
+
+ int getRankFromPosition(S32 x, S32 y);
+ int getRankFromPosition(const LLCommandId& id);
+
+ // Methods used in loading and saving toolbar settings
+ void setButtonType(LLToolBarEnums::ButtonType button_type);
+ LLToolBarEnums::ButtonType getButtonType() { return mButtonType; }
+ command_id_list_t& getCommandsList() { return mButtonCommands; }
+ void clearCommandsList();
+
+private:
+ friend class LLUICtrlFactory;
+ LLToolBar(const Params&);
+ ~LLToolBar();
+
+ void initFromParams(const Params&);
+ void createContextMenu();
+ void updateLayoutAsNeeded();
+ void createButtons();
+ void resizeButtonsInRow(std::vector<LLToolBarButton*>& buttons_in_row, S32 max_row_girth);
+ BOOL isSettingChecked(const LLSD& userdata);
+ void onSettingEnable(const LLSD& userdata);
+ void onRemoveSelectedCommand();
+
+private:
+ // static layout state
+ const bool mReadOnly;
+ const LLToolBarEnums::SideType mSideType;
+ const bool mWrap;
+ const S32 mPadLeft,
+ mPadRight,
+ mPadTop,
+ mPadBottom,
+ mPadBetween,
+ mMinGirth;
+
+ // drag and drop state
+ tool_startdrag_callback_t mStartDragItemCallback;
+ tool_handledrag_callback_t mHandleDragItemCallback;
+ tool_handledrop_callback_t mHandleDropCallback;
+ bool mDragAndDropTarget;
+ int mDragRank;
+ S32 mDragx,
+ mDragy,
+ mDragGirth;
+
+ typedef std::list<LLToolBarButton*> toolbar_button_list;
+ typedef std::map<LLUUID, LLToolBarButton*> command_id_map;
+ toolbar_button_list mButtons;
+ command_id_list_t mButtonCommands;
+ command_id_map mButtonMap;
+
+ LLToolBarEnums::ButtonType mButtonType;
+ LLToolBarButton::Params mButtonParams[LLToolBarEnums::BTNTYPE_COUNT];
+
+ // related widgets
+ LLLayoutStack* mCenteringStack;
+ LLPanel* mButtonPanel;
+ LLHandle<class LLContextMenu> mPopupMenuHandle;
+ LLHandle<class LLView> mRemoveButtonHandle;
+
+ LLToolBarButton* mRightMouseTargetButton;
+
+ bool mNeedsLayout;
+ bool mModified;
+
+ button_signal_t* mButtonAddSignal;
+ button_signal_t* mButtonEnterSignal;
+ button_signal_t* mButtonLeaveSignal;
+ button_signal_t* mButtonRemoveSignal;
+
+ std::string mButtonTooltipSuffix;
+};
+
+
+#endif // LL_LLTOOLBAR_H
diff --git a/indra/llui/lltooltip.cpp b/indra/llui/lltooltip.cpp
index 6390039794..f737d48abf 100644
--- a/indra/llui/lltooltip.cpp
+++ b/indra/llui/lltooltip.cpp
@@ -55,7 +55,7 @@ static LLDefaultChildRegistry::Register<LLToolTipView> register_tooltip_view("to
LLToolTipView::Params::Params()
{
- mouse_opaque = false;
+ changeDefault(mouse_opaque, false);
}
LLToolTipView::LLToolTipView(const LLToolTipView::Params& p)
@@ -156,7 +156,7 @@ LLToolTip::Params::Params()
web_based_media("web_based_media", false),
media_playing("media_playing", false)
{
- chrome = true;
+ changeDefault(chrome, true);
}
LLToolTip::LLToolTip(const LLToolTip::Params& p)
@@ -180,6 +180,7 @@ LLToolTip::LLToolTip(const LLToolTip::Params& p)
params.font = p.font;
params.use_ellipses = true;
params.wrap = p.wrap;
+ params.font_valign = LLFontGL::VCENTER;
params.parse_urls = false; // disallow hyperlinks in tooltips, as they want to spawn their own explanatory tooltips
mTextBox = LLUICtrlFactory::create<LLTextBox> (params);
addChild(mTextBox);
@@ -190,7 +191,6 @@ LLToolTip::LLToolTip(const LLToolTip::Params& p)
{
LLButton::Params icon_params;
icon_params.name = "tooltip_info";
- icon_params.label(""); // provid label but set to empty so name does not overwrite it -angela
LLRect icon_rect;
LLUIImage* imagep = p.image;
TOOLTIP_ICON_SIZE = (imagep ? imagep->getWidth() : 16);
@@ -200,7 +200,7 @@ LLToolTip::LLToolTip(const LLToolTip::Params& p)
icon_params.image_selected(imagep);
icon_params.scale_image(true);
- icon_params.flash_color(icon_params.highlight_color());
+ icon_params.flash_color.control = "ButtonUnselectedFgColor";
mInfoButton = LLUICtrlFactory::create<LLButton>(icon_params);
if (p.click_callback.isProvided())
{
@@ -291,6 +291,12 @@ void LLToolTip::initFromParams(const LLToolTip::Params& p)
S32 text_width = llmin(p.max_width(), mTextBox->getTextPixelWidth());
S32 text_height = mTextBox->getTextPixelHeight();
mTextBox->reshape(text_width, text_height);
+ if (mInfoButton)
+ {
+ LLRect text_rect = mTextBox->getRect();
+ LLRect icon_rect = mInfoButton->getRect();
+ mTextBox->translate(0, icon_rect.getCenterY() - text_rect.getCenterY());
+ }
// reshape tooltip panel to fit text box
LLRect tooltip_rect = calcBoundingRect();
@@ -299,6 +305,8 @@ void LLToolTip::initFromParams(const LLToolTip::Params& p)
tooltip_rect.mBottom = 0;
tooltip_rect.mLeft = 0;
+ mTextBox->reshape(mTextBox->getRect().getWidth(), llmax(mTextBox->getRect().getHeight(), tooltip_rect.getHeight() - 2 * mPadding));
+
setShape(tooltip_rect);
}
@@ -402,12 +410,12 @@ void LLToolTipMgr::createToolTip(const LLToolTip::Params& params)
LLToolTip::Params tooltip_params(params);
// block mouse events if there is a click handler registered (specifically, hover)
- if (params.click_callback.isProvided())
+ if (params.click_callback.isProvided() && !params.mouse_opaque.isProvided())
{
// set mouse_opaque to true if it wasn't already set to something else
// this prevents mouse down from going "through" the tooltip and ultimately
// causing the tooltip to disappear
- tooltip_params.mouse_opaque.setIfNotProvided(true);
+ tooltip_params.mouse_opaque = true;
}
tooltip_params.rect = LLRect (0, 1, 1, 0);
diff --git a/indra/llui/lltransutil.cpp b/indra/llui/lltransutil.cpp
index 9d0ff9d5cb..58fa8a0828 100644
--- a/indra/llui/lltransutil.cpp
+++ b/indra/llui/lltransutil.cpp
@@ -26,10 +26,11 @@
#include "linden_common.h"
+#include "lltransutil.h"
+
#include "lltrans.h"
#include "lluictrlfactory.h"
-
-#include "lltransutil.h"
+#include "llxmlnode.h"
bool LLTransUtil::parseStrings(const std::string& xml_filename, const std::set<std::string>& default_args)
diff --git a/indra/llui/llui.cpp b/indra/llui/llui.cpp
index 19c42bf61a..b5e27616b7 100644
--- a/indra/llui/llui.cpp
+++ b/indra/llui/llui.cpp
@@ -41,6 +41,7 @@
#include "llgl.h"
// Project includes
+#include "llcommandmanager.h"
#include "llcontrol.h"
#include "llui.h"
#include "lluicolortable.h"
@@ -57,10 +58,13 @@
#include "llfiltereditor.h"
#include "llflyoutbutton.h"
#include "llsearcheditor.h"
+#include "lltoolbar.h"
// for XUIParse
#include "llquaternion.h"
#include <boost/tokenizer.hpp>
+#include <boost/algorithm/string/find_iterator.hpp>
+#include <boost/algorithm/string/finder.hpp>
//
// Globals
@@ -85,14 +89,14 @@ std::list<std::string> gUntranslated;
/*static*/ LLUI::remove_popup_t LLUI::sRemovePopupFunc;
/*static*/ LLUI::clear_popups_t LLUI::sClearPopupsFunc;
-// register filtereditor here
+// register filter editor here
static LLDefaultChildRegistry::Register<LLFilterEditor> register_filter_editor("filter_editor");
static LLDefaultChildRegistry::Register<LLFlyoutButton> register_flyout_button("flyout_button");
static LLDefaultChildRegistry::Register<LLSearchEditor> register_search_editor("search_editor");
// register other widgets which otherwise may not be linked in
static LLDefaultChildRegistry::Register<LLLoadingIndicator> register_loading_indicator("loading_indicator");
-
+static LLDefaultChildRegistry::Register<LLToolBar> register_toolbar("toolbar");
//
// Functions
@@ -102,7 +106,7 @@ void make_ui_sound(const char* namep)
std::string name = ll_safe_string(namep);
if (!LLUI::sSettingGroups["config"]->controlExists(name))
{
- llwarns << "tried to make ui sound for unknown sound name: " << name << llendl;
+ llwarns << "tried to make UI sound for unknown sound name: " << name << llendl;
}
else
{
@@ -113,12 +117,12 @@ void make_ui_sound(const char* namep)
{
if (LLUI::sSettingGroups["config"]->getBOOL("UISndDebugSpamToggle"))
{
- llinfos << "ui sound name: " << name << " triggered but silent (null uuid)" << llendl;
+ llinfos << "UI sound name: " << name << " triggered but silent (null uuid)" << llendl;
}
}
else
{
- llwarns << "ui sound named: " << name << " does not translate to a valid uuid" << llendl;
+ llwarns << "UI sound named: " << name << " does not translate to a valid uuid" << llendl;
}
}
@@ -126,7 +130,7 @@ void make_ui_sound(const char* namep)
{
if (LLUI::sSettingGroups["config"]->getBOOL("UISndDebugSpamToggle"))
{
- llinfos << "ui sound name: " << name << llendl;
+ llinfos << "UI sound name: " << name << llendl;
}
LLUI::sAudioCallback(uuid);
}
@@ -149,11 +153,11 @@ void gl_state_for_2d(S32 width, S32 height)
F32 window_width = (F32) width;//gViewerWindow->getWindowWidth();
F32 window_height = (F32) height;//gViewerWindow->getWindowHeight();
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glOrtho(0.0f, llmax(window_width, 1.f), 0.0f, llmax(window_height,1.f), -1.0f, 1.0f);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.loadIdentity();
+ gGL.ortho(0.0f, llmax(window_width, 1.f), 0.0f, llmax(window_height,1.f), -1.0f, 1.0f);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.loadIdentity();
stop_glerror();
}
@@ -470,7 +474,7 @@ void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 width, S32 height, LLTex
return;
}
- // add in offset of current image to current ui translation
+ // add in offset of current image to current UI translation
const LLVector3 ui_scale = gGL.getUIScale();
const LLVector3 ui_translation = (gGL.getUITranslation() + LLVector3(x, y, 0.f)).scaledVec(ui_scale);
@@ -522,11 +526,18 @@ void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 width, S32 height, LLTex
if (solid_color)
{
- gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_PREV_COLOR);
- gGL.getTexUnit(0)->setTextureAlphaBlend(LLTexUnit::TBO_MULT, LLTexUnit::TBS_TEX_ALPHA, LLTexUnit::TBS_VERT_ALPHA);
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gSolidColorProgram.bind();
+ }
+ else
+ {
+ gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_PREV_COLOR);
+ gGL.getTexUnit(0)->setTextureAlphaBlend(LLTexUnit::TBO_MULT, LLTexUnit::TBS_TEX_ALPHA, LLTexUnit::TBS_VERT_ALPHA);
+ }
}
- gGL.getTexUnit(0)->bind(image);
+ gGL.getTexUnit(0)->bind(image, true);
gGL.color4fv(color.mV);
@@ -697,7 +708,14 @@ void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 width, S32 height, LLTex
if (solid_color)
{
- gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gUIProgram.bind();
+ }
+ else
+ {
+ gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
+ }
}
}
@@ -717,7 +735,7 @@ void gl_draw_scaled_rotated_image(S32 x, S32 y, S32 width, S32 height, F32 degre
LLGLSUIDefault gls_ui;
- gGL.getTexUnit(0)->bind(image);
+ gGL.getTexUnit(0)->bind(image, true);
gGL.color4fv(color.mV);
@@ -770,7 +788,7 @@ void gl_draw_scaled_rotated_image(S32 x, S32 y, S32 width, S32 height, F32 degre
LLMatrix3 quat(0.f, 0.f, degrees*DEG_TO_RAD);
- gGL.getTexUnit(0)->bind(image);
+ gGL.getTexUnit(0)->bind(image, true);
gGL.color4fv(color.mV);
@@ -937,10 +955,12 @@ void gl_ring( F32 radius, F32 width, const LLColor4& center_color, const LLColor
if( render_center )
{
gGL.color4fv(center_color.mV);
+ gGL.diffuseColor4fv(center_color.mV);
gl_deep_circle( radius, width, steps );
}
else
{
+ gGL.diffuseColor4fv(side_color.mV);
gl_washer_2d(radius, radius - width, steps, side_color, side_color);
gGL.translateUI(0.f, 0.f, width);
gl_washer_2d(radius - width, radius, steps, side_color, side_color);
@@ -950,37 +970,55 @@ void gl_ring( F32 radius, F32 width, const LLColor4& center_color, const LLColor
}
// Draw gray and white checkerboard with black border
-void gl_rect_2d_checkerboard(const LLRect& rect)
+void gl_rect_2d_checkerboard(const LLRect& rect, GLfloat alpha)
{
- // Initialize the first time this is called.
- const S32 PIXELS = 32;
- static GLubyte checkerboard[PIXELS * PIXELS];
- static BOOL first = TRUE;
- if( first )
- {
- for( S32 i = 0; i < PIXELS; i++ )
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ // Initialize the first time this is called.
+ const S32 PIXELS = 32;
+ static GLubyte checkerboard[PIXELS * PIXELS];
+ static BOOL first = TRUE;
+ if( first )
{
- for( S32 j = 0; j < PIXELS; j++ )
+ for( S32 i = 0; i < PIXELS; i++ )
{
- checkerboard[i * PIXELS + j] = ((i & 1) ^ (j & 1)) * 0xFF;
+ for( S32 j = 0; j < PIXELS; j++ )
+ {
+ checkerboard[i * PIXELS + j] = ((i & 1) ^ (j & 1)) * 0xFF;
+ }
}
+ first = FALSE;
}
- first = FALSE;
- }
- gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- // ...white squares
- gGL.color3f( 1.f, 1.f, 1.f );
- gl_rect_2d(rect);
+ // ...white squares
+ gGL.color4f( 1.f, 1.f, 1.f, alpha );
+ gl_rect_2d(rect);
- // ...gray squares
- gGL.color3f( .7f, .7f, .7f );
- gGL.flush();
- glPolygonStipple( checkerboard );
+ // ...gray squares
+ gGL.color4f( .7f, .7f, .7f, alpha );
+ gGL.flush();
+
+ glPolygonStipple( checkerboard );
+
+ LLGLEnable polygon_stipple(GL_POLYGON_STIPPLE);
+ gl_rect_2d(rect);
+ }
+ else
+ { //polygon stipple is deprecated, use "Checker" texture
+ LLPointer<LLUIImage> img = LLUI::getUIImage("Checker");
+ gGL.getTexUnit(0)->bind(img->getImage());
+ gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_WRAP);
+ gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_POINT);
- LLGLEnable polygon_stipple(GL_POLYGON_STIPPLE);
- gl_rect_2d(rect);
+ LLColor4 color(1.f, 1.f, 1.f, alpha);
+ LLRectf uv_rect(0, 0, rect.getWidth()/32.f, rect.getHeight()/32.f);
+
+ gl_draw_scaled_image(rect.mLeft, rect.mBottom, rect.getWidth(), rect.getHeight(),
+ img->getImage(), color, uv_rect);
+ }
+
gGL.flush();
}
@@ -1596,34 +1634,40 @@ void LLUI::initClass(const settings_map_t& settings,
sWindow = NULL; // set later in startup
LLFontGL::sShadowColor = LLUIColorTable::instance().getColor("ColorDropShadow");
- // Callbacks for associating controls with floater visibilty:
- LLUICtrl::CommitCallbackRegistry::defaultRegistrar().add("Floater.Toggle", boost::bind(&LLFloaterReg::toggleFloaterInstance, _2));
- LLUICtrl::CommitCallbackRegistry::defaultRegistrar().add("Floater.Show", boost::bind(&LLFloaterReg::showFloaterInstance, _2));
- LLUICtrl::CommitCallbackRegistry::defaultRegistrar().add("Floater.Hide", boost::bind(&LLFloaterReg::hideFloaterInstance, _2));
- LLUICtrl::CommitCallbackRegistry::defaultRegistrar().add("Floater.InitToVisibilityControl", boost::bind(&LLFloaterReg::initUICtrlToFloaterVisibilityControl, _1, _2));
+ LLUICtrl::CommitCallbackRegistry::Registrar& reg = LLUICtrl::CommitCallbackRegistry::defaultRegistrar();
+
+ // Callbacks for associating controls with floater visibility:
+ reg.add("Floater.Toggle", boost::bind(&LLFloaterReg::toggleInstance, _2, LLSD()));
+ reg.add("Floater.ToggleOrBringToFront", boost::bind(&LLFloaterReg::toggleInstanceOrBringToFront, _2, LLSD()));
+ reg.add("Floater.Show", boost::bind(&LLFloaterReg::showInstance, _2, LLSD(), FALSE));
+ reg.add("Floater.Hide", boost::bind(&LLFloaterReg::hideInstance, _2, LLSD()));
// Button initialization callback for toggle buttons
- LLUICtrl::CommitCallbackRegistry::defaultRegistrar().add("Button.SetFloaterToggle", boost::bind(&LLButton::setFloaterToggle, _1, _2));
+ reg.add("Button.SetFloaterToggle", boost::bind(&LLButton::setFloaterToggle, _1, _2));
- // Button initialization callback for toggle buttons on dockale floaters
- LLUICtrl::CommitCallbackRegistry::defaultRegistrar().add("Button.SetDockableFloaterToggle", boost::bind(&LLButton::setDockableFloaterToggle, _1, _2));
+ // Button initialization callback for toggle buttons on dockable floaters
+ reg.add("Button.SetDockableFloaterToggle", boost::bind(&LLButton::setDockableFloaterToggle, _1, _2));
// Display the help topic for the current context
- LLUICtrl::CommitCallbackRegistry::defaultRegistrar().add("Button.ShowHelp", boost::bind(&LLButton::showHelp, _1, _2));
+ reg.add("Button.ShowHelp", boost::bind(&LLButton::showHelp, _1, _2));
// Currently unused, but kept for reference:
- LLUICtrl::CommitCallbackRegistry::defaultRegistrar().add("Button.ToggleFloater", boost::bind(&LLButton::toggleFloaterAndSetToggleState, _1, _2));
+ reg.add("Button.ToggleFloater", boost::bind(&LLButton::toggleFloaterAndSetToggleState, _1, _2));
- // Used by menus along with Floater.Toggle to display visibility as a checkmark
- LLUICtrl::EnableCallbackRegistry::defaultRegistrar().add("Floater.Visible", boost::bind(&LLFloaterReg::floaterInstanceVisible, _2));
+ // Used by menus along with Floater.Toggle to display visibility as a check-mark
+ LLUICtrl::EnableCallbackRegistry::defaultRegistrar().add("Floater.Visible", boost::bind(&LLFloaterReg::instanceVisible, _2, LLSD()));
+ LLUICtrl::EnableCallbackRegistry::defaultRegistrar().add("Floater.IsOpen", boost::bind(&LLFloaterReg::instanceVisible, _2, LLSD()));
+
+ // Parse the master list of commands
+ LLCommandManager::load();
}
void LLUI::cleanupClass()
{
if(sImageProvider)
{
- sImageProvider->cleanUp();
- }
+ sImageProvider->cleanUp();
+}
}
void LLUI::setPopupFuncs(const add_popup_t& add_popup, const remove_popup_t& remove_popup, const clear_popups_t& clear_popups)
@@ -1654,21 +1698,22 @@ void LLUI::translate(F32 x, F32 y, F32 z)
gGL.translateUI(x,y,z);
LLFontGL::sCurOrigin.mX += (S32) x;
LLFontGL::sCurOrigin.mY += (S32) y;
- LLFontGL::sCurOrigin.mZ += z;
+ LLFontGL::sCurDepth += z;
}
//static
void LLUI::pushMatrix()
{
gGL.pushUIMatrix();
- LLFontGL::sOriginStack.push_back(LLFontGL::sCurOrigin);
+ LLFontGL::sOriginStack.push_back(std::make_pair(LLFontGL::sCurOrigin, LLFontGL::sCurDepth));
}
//static
void LLUI::popMatrix()
{
gGL.popUIMatrix();
- LLFontGL::sCurOrigin = *LLFontGL::sOriginStack.rbegin();
+ LLFontGL::sCurOrigin = LLFontGL::sOriginStack.back().first;
+ LLFontGL::sCurDepth = LLFontGL::sOriginStack.back().second;
LLFontGL::sOriginStack.pop_back();
}
@@ -1678,7 +1723,7 @@ void LLUI::loadIdentity()
gGL.loadUIIdentity();
LLFontGL::sCurOrigin.mX = 0;
LLFontGL::sCurOrigin.mY = 0;
- LLFontGL::sCurOrigin.mZ = 0;
+ LLFontGL::sCurDepth = 0.f;
}
//static
@@ -1701,10 +1746,7 @@ void LLUI::setMousePositionScreen(S32 x, S32 y)
screen_x = llround((F32)x * sGLScaleFactor.mV[VX]);
screen_y = llround((F32)y * sGLScaleFactor.mV[VY]);
- LLCoordWindow window_point;
- LLView::getWindow()->convertCoords(LLCoordGL(screen_x, screen_y), &window_point);
-
- LLView::getWindow()->setCursorPosition(window_point);
+ LLView::getWindow()->setCursorPosition(LLCoordGL(screen_x, screen_y).convert());
}
//static
@@ -1712,8 +1754,7 @@ void LLUI::getMousePositionScreen(S32 *x, S32 *y)
{
LLCoordWindow cursor_pos_window;
getWindow()->getCursorPosition(&cursor_pos_window);
- LLCoordGL cursor_pos_gl;
- getWindow()->convertCoords(cursor_pos_window, &cursor_pos_gl);
+ LLCoordGL cursor_pos_gl(cursor_pos_window.convert());
*x = llround((F32)cursor_pos_gl.mX / sGLScaleFactor.mV[VX]);
*y = llround((F32)cursor_pos_gl.mY / sGLScaleFactor.mV[VX]);
}
@@ -1799,9 +1840,12 @@ void LLUI::setupPaths()
LLXMLNodePtr root;
BOOL success = LLXMLNode::parseFile(filename, root, NULL);
Paths paths;
- LLXUIParser parser;
- parser.readXUI(root, paths, filename);
+ if(success)
+ {
+ LLXUIParser parser;
+ parser.readXUI(root, paths, filename);
+ }
sXUIPaths.clear();
if (success && paths.validateBlock())
@@ -2009,13 +2053,60 @@ void LLUI::positionViewNearMouse(LLView* view, S32 spawn_x, S32 spawn_y)
CURSOR_HEIGHT + MOUSE_CURSOR_PADDING * 2);
S32 local_x, local_y;
- // convert screen coordinates to tooltipview-local coordinates
+ // convert screen coordinates to tooltip view-local coordinates
parent->screenPointToLocal(spawn_x, spawn_y, &local_x, &local_y);
// Start at spawn position (using left/top)
view->setOrigin( local_x, local_y - view->getRect().getHeight());
- // Make sure we're onscreen and not overlapping the mouse
- view->translateIntoRectWithExclusion( virtual_window_rect, mouse_rect, FALSE );
+ // Make sure we're on-screen and not overlapping the mouse
+ view->translateIntoRectWithExclusion( virtual_window_rect, mouse_rect );
+}
+
+LLView* LLUI::resolvePath(LLView* context, const std::string& path)
+{
+ // Nothing about resolvePath() should require non-const LLView*. If caller
+ // wants non-const, call the const flavor and then cast away const-ness.
+ return const_cast<LLView*>(resolvePath(const_cast<const LLView*>(context), path));
+}
+
+const LLView* LLUI::resolvePath(const LLView* context, const std::string& path)
+{
+ // Create an iterator over slash-separated parts of 'path'. Dereferencing
+ // this iterator returns an iterator_range over the substring. Unlike
+ // LLStringUtil::getTokens(), this split_iterator doesn't combine adjacent
+ // delimiters: leading/trailing slash produces an empty substring, double
+ // slash produces an empty substring. That's what we need.
+ boost::split_iterator<std::string::const_iterator> ti(path, boost::first_finder("/")), tend;
+
+ if (ti == tend)
+ {
+ // 'path' is completely empty, no navigation
+ return context;
+ }
+
+ // leading / means "start at root"
+ if (ti->empty())
+ {
+ context = getRootView();
+ ++ti;
+ }
+
+ bool recurse = false;
+ for (; ti != tend && context; ++ti)
+ {
+ if (ti->empty())
+ {
+ recurse = true;
+ }
+ else
+ {
+ std::string part(ti->begin(), ti->end());
+ context = context->findChildView(part, recurse);
+ recurse = false;
+ }
+ }
+
+ return context;
}
@@ -2023,46 +2114,37 @@ void LLUI::positionViewNearMouse(LLView* view, S32 spawn_x, S32 spawn_y)
namespace LLInitParam
{
- TypedParam<LLUIColor >::TypedParam(BlockDescriptor& descriptor, const char* name, const LLUIColor& value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count)
- : super_t(descriptor, name, value, func, min_count, max_count),
+ ParamValue<LLUIColor, TypeValues<LLUIColor> >::ParamValue(const LLUIColor& color)
+ : super_t(color),
red("red"),
green("green"),
blue("blue"),
alpha("alpha"),
control("")
{
- setBlockFromValue();
+ updateBlockFromValue(false);
}
- void TypedParam<LLUIColor>::setValueFromBlock() const
+ void ParamValue<LLUIColor, TypeValues<LLUIColor> >::updateValueFromBlock()
{
- if (control.isProvided())
+ if (control.isProvided() && !control().empty())
{
- mData.mValue = LLUIColorTable::instance().getColor(control);
+ updateValue(LLUIColorTable::instance().getColor(control));
}
else
{
- mData.mValue = LLColor4(red, green, blue, alpha);
+ updateValue(LLColor4(red, green, blue, alpha));
}
}
- void TypedParam<LLUIColor>::setBlockFromValue()
- {
- LLColor4 color = mData.mValue.get();
- red.set(color.mV[VRED], false);
- green.set(color.mV[VGREEN], false);
- blue.set(color.mV[VBLUE], false);
- alpha.set(color.mV[VALPHA], false);
- control.set("", false);
- }
-
- void TypeValues<LLUIColor>::declareValues()
+ void ParamValue<LLUIColor, TypeValues<LLUIColor> >::updateBlockFromValue(bool make_block_authoritative)
{
- declare("white", LLColor4::white);
- declare("black", LLColor4::black);
- declare("red", LLColor4::red);
- declare("green", LLColor4::green);
- declare("blue", LLColor4::blue);
+ LLColor4 color = getValue();
+ red.set(color.mV[VRED], make_block_authoritative);
+ green.set(color.mV[VGREEN], make_block_authoritative);
+ blue.set(color.mV[VBLUE], make_block_authoritative);
+ alpha.set(color.mV[VALPHA], make_block_authoritative);
+ control.set("", make_block_authoritative);
}
bool ParamCompare<const LLFontGL*, false>::equals(const LLFontGL* a, const LLFontGL* b)
@@ -2071,23 +2153,26 @@ namespace LLInitParam
&& !(b->getFontDesc() < a->getFontDesc());
}
- TypedParam<const LLFontGL*>::TypedParam(BlockDescriptor& descriptor, const char* _name, const LLFontGL*const value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count)
- : super_t(descriptor, _name, value, func, min_count, max_count),
+ ParamValue<const LLFontGL*, TypeValues<const LLFontGL*> >::ParamValue(const LLFontGL* fontp)
+ : super_t(fontp),
name("name"),
size("size"),
style("style")
{
- setBlockFromValue();
+ if (!fontp)
+ {
+ updateValue(LLFontGL::getFontDefault());
+ }
addSynonym(name, "");
- setBlockFromValue();
+ updateBlockFromValue(false);
}
- void TypedParam<const LLFontGL*>::setValueFromBlock() const
+ void ParamValue<const LLFontGL*, TypeValues<const LLFontGL*> >::updateValueFromBlock()
{
const LLFontGL* res_fontp = LLFontGL::getFontByName(name);
if (res_fontp)
{
- mData.mValue = res_fontp;
+ updateValue(res_fontp);
return;
}
@@ -2097,22 +2182,26 @@ namespace LLInitParam
const LLFontGL* fontp = LLFontGL::getFont(desc);
if (fontp)
{
- mData.mValue = fontp;
- }
+ updateValue(fontp);
+ }
+ else
+ {
+ updateValue(LLFontGL::getFontDefault());
+ }
}
- void TypedParam<const LLFontGL*>::setBlockFromValue()
+ void ParamValue<const LLFontGL*, TypeValues<const LLFontGL*> >::updateBlockFromValue(bool make_block_authoritative)
{
- if (mData.mValue)
+ if (getValue())
{
- name.set(LLFontGL::nameFromFont(mData.mValue), false);
- size.set(LLFontGL::sizeFromFont(mData.mValue), false);
- style.set(LLFontGL::getStringFromStyle(mData.mValue->getFontDesc().getStyle()), false);
+ name.set(LLFontGL::nameFromFont(getValue()), make_block_authoritative);
+ size.set(LLFontGL::sizeFromFont(getValue()), make_block_authoritative);
+ style.set(LLFontGL::getStringFromStyle(getValue()->getFontDesc().getStyle()), make_block_authoritative);
}
}
- TypedParam<LLRect>::TypedParam(BlockDescriptor& descriptor, const char* name, const LLRect& value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count)
- : super_t(descriptor, name, value, func, min_count, max_count),
+ ParamValue<LLRect, TypeValues<LLRect> >::ParamValue(const LLRect& rect)
+ : super_t(rect),
left("left"),
top("top"),
right("right"),
@@ -2120,10 +2209,10 @@ namespace LLInitParam
width("width"),
height("height")
{
- setBlockFromValue();
+ updateBlockFromValue(false);
}
- void TypedParam<LLRect>::setValueFromBlock() const
+ void ParamValue<LLRect, TypeValues<LLRect> >::updateValueFromBlock()
{
LLRect rect;
@@ -2184,40 +2273,43 @@ namespace LLInitParam
rect.mBottom = bottom;
rect.mTop = top;
}
- mData.mValue = rect;
+ updateValue(rect);
}
- void TypedParam<LLRect>::setBlockFromValue()
+ void ParamValue<LLRect, TypeValues<LLRect> >::updateBlockFromValue(bool make_block_authoritative)
{
// because of the ambiguity in specifying a rect by position and/or dimensions
- // we clear the "provided" flag so that values from xui/etc have priority
- // over those calculated from the rect object
+ // we use the lowest priority pairing so that any valid pairing in xui
+ // will override those calculated from the rect object
+ // in this case, that is left+width and bottom+height
+ LLRect& value = getValue();
+
+ right.set(value.mRight, false);
+ left.set(value.mLeft, make_block_authoritative);
+ width.set(value.getWidth(), make_block_authoritative);
- left.set(mData.mValue.mLeft, false);
- right.set(mData.mValue.mRight, false);
- bottom.set(mData.mValue.mBottom, false);
- top.set(mData.mValue.mTop, false);
- width.set(mData.mValue.getWidth(), false);
- height.set(mData.mValue.getHeight(), false);
+ top.set(value.mTop, false);
+ bottom.set(value.mBottom, make_block_authoritative);
+ height.set(value.getHeight(), make_block_authoritative);
}
- TypedParam<LLCoordGL>::TypedParam(BlockDescriptor& descriptor, const char* name, LLCoordGL value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count)
- : super_t(descriptor, name, value, func, min_count, max_count),
+ ParamValue<LLCoordGL, TypeValues<LLCoordGL> >::ParamValue(const LLCoordGL& coord)
+ : super_t(coord),
x("x"),
y("y")
{
- setBlockFromValue();
+ updateBlockFromValue(false);
}
- void TypedParam<LLCoordGL>::setValueFromBlock() const
+ void ParamValue<LLCoordGL, TypeValues<LLCoordGL> >::updateValueFromBlock()
{
- mData.mValue.set(x, y);
+ updateValue(LLCoordGL(x, y));
}
- void TypedParam<LLCoordGL>::setBlockFromValue()
+ void ParamValue<LLCoordGL, TypeValues<LLCoordGL> >::updateBlockFromValue(bool make_block_authoritative)
{
- x.set(mData.mValue.mX, false);
- y.set(mData.mValue.mY, false);
+ x.set(getValue().mX, make_block_authoritative);
+ y.set(getValue().mY, make_block_authoritative);
}
diff --git a/indra/llui/llui.h b/indra/llui/llui.h
index fc545c85d5..28e84fa444 100644
--- a/indra/llui/llui.h
+++ b/indra/llui/llui.h
@@ -33,16 +33,15 @@
#include "llrect.h"
#include "llcontrol.h"
#include "llcoord.h"
-#include "lluiimage.h" // *TODO: break this dependency, need to add #include "lluiimage.h" to all widgets that hold an Optional<LLUIImage*> in their paramblocks
+#include "llglslshader.h"
#include "llinitparam.h"
#include "llregistry.h"
#include "lluicolor.h"
#include "lluicolortable.h"
#include <boost/signals2.hpp>
#include "lllazyvalue.h"
-#include "llhandle.h" // *TODO: remove this dependency, added as a
- // convenience when LLHandle moved to llhandle.h
#include "llframetimer.h"
+#include <limits>
// LLUIFactory
#include "llsd.h"
@@ -50,6 +49,7 @@
// for initparam specialization
#include "llfontgl.h"
+
class LLColor4;
class LLVector3;
class LLVector2;
@@ -79,7 +79,7 @@ void gl_rect_2d_offset_local( S32 left, S32 top, S32 right, S32 bottom, const LL
void gl_rect_2d_offset_local( S32 left, S32 top, S32 right, S32 bottom, S32 pixel_offset = 0, BOOL filled = TRUE );
void gl_rect_2d(const LLRect& rect, BOOL filled = TRUE );
void gl_rect_2d(const LLRect& rect, const LLColor4& color, BOOL filled = TRUE );
-void gl_rect_2d_checkerboard(const LLRect& rect);
+void gl_rect_2d_checkerboard(const LLRect& rect, GLfloat alpha = 1.0f);
void gl_drop_shadow(S32 left, S32 top, S32 right, S32 bottom, const LLColor4 &start_color, S32 lines);
@@ -149,6 +149,122 @@ class LLUI
LOG_CLASS(LLUI);
public:
//
+ // Classes
+ //
+
+ struct RangeS32
+ {
+ struct Params : public LLInitParam::Block<Params>
+ {
+ Optional<S32> minimum,
+ maximum;
+
+ Params()
+ : minimum("min", 0),
+ maximum("max", S32_MAX)
+ {}
+ };
+
+ // correct for inverted params
+ RangeS32(const Params& p = Params())
+ : mMin(p.minimum),
+ mMax(p.maximum)
+ {
+ sanitizeRange();
+ }
+
+ RangeS32(S32 minimum, S32 maximum)
+ : mMin(minimum),
+ mMax(maximum)
+ {
+ sanitizeRange();
+ }
+
+ S32 clamp(S32 input)
+ {
+ if (input < mMin) return mMin;
+ if (input > mMax) return mMax;
+ return input;
+ }
+
+ void setRange(S32 minimum, S32 maximum)
+ {
+ mMin = minimum;
+ mMax = maximum;
+ sanitizeRange();
+ }
+
+ S32 getMin() { return mMin; }
+ S32 getMax() { return mMax; }
+
+ bool operator==(const RangeS32& other) const
+ {
+ return mMin == other.mMin
+ && mMax == other.mMax;
+ }
+ private:
+ void sanitizeRange()
+ {
+ if (mMin > mMax)
+ {
+ llwarns << "Bad interval range (" << mMin << ", " << mMax << ")" << llendl;
+ // since max is usually the most dangerous one to ignore (buffer overflow, etc), prefer it
+ // in the case of a malformed range
+ mMin = mMax;
+ }
+ }
+
+
+ S32 mMin,
+ mMax;
+ };
+
+ struct ClampedS32 : public RangeS32
+ {
+ struct Params : public LLInitParam::Block<Params, RangeS32::Params>
+ {
+ Mandatory<S32> value;
+
+ Params()
+ : value("", 0)
+ {
+ addSynonym(value, "value");
+ }
+ };
+
+ ClampedS32(const Params& p)
+ : RangeS32(p)
+ {}
+
+ ClampedS32(const RangeS32& range)
+ : RangeS32(range)
+ {
+ // set value here, after range has been sanitized
+ mValue = clamp(0);
+ }
+
+ ClampedS32(S32 value, const RangeS32& range = RangeS32())
+ : RangeS32(range)
+ {
+ mValue = clamp(value);
+ }
+
+ S32 get()
+ {
+ return mValue;
+ }
+
+ void set(S32 value)
+ {
+ mValue = clamp(value);
+ }
+
+
+ private:
+ S32 mValue;
+ };
+
+ //
// Methods
//
typedef std::map<std::string, LLControlGroup*> settings_map_t;
@@ -185,6 +301,33 @@ public:
//helper functions (should probably move free standing rendering helper functions here)
static LLView* getRootView() { return sRootView; }
static void setRootView(LLView* view) { sRootView = view; }
+ /**
+ * Walk the LLView tree to resolve a path
+ * Paths can be discovered using Develop > XUI > Show XUI Paths
+ *
+ * A leading "/" indicates the root of the tree is the starting
+ * position of the search, (otherwise the context node is used)
+ *
+ * Adjacent "//" mean that the next level of the search is done
+ * recursively ("descendant" rather than "child").
+ *
+ * Return values: If no match is found, NULL is returned,
+ * otherwise the matching LLView* is returned.
+ *
+ * Examples:
+ *
+ * "/" -> return the root view
+ * "/foo" -> find "foo" as a direct child of the root
+ * "foo" -> find "foo" as a direct child of the context node
+ * "//foo" -> find the first "foo" child anywhere in the tree
+ * "/foo/bar" -> find "foo" as direct child of the root, and
+ * "bar" as a direct child of "foo"
+ * "//foo//bar/baz" -> find the first "foo" anywhere in the
+ * tree, the first "bar" anywhere under it, and "baz"
+ * as a direct child of that
+ */
+ static const LLView* resolvePath(const LLView* context, const std::string& path);
+ static LLView* resolvePath(LLView* context, const std::string& path);
static std::string locateSkin(const std::string& filename);
static void setMousePositionScreen(S32 x, S32 y);
static void getMousePositionScreen(S32 *x, S32 *y);
@@ -238,8 +381,6 @@ private:
// Moved LLLocalClipRect to lllocalcliprect.h
-// Moved all LLHandle-related code to llhandle.h
-
//RN: maybe this needs to moved elsewhere?
class LLImageProviderInterface
{
@@ -341,7 +482,7 @@ template <typename T> LLRegisterWith<LLInitClassList> LLInitClass<T>::sRegister(
template <typename T> LLRegisterWith<LLDestroyClassList> LLDestroyClass<T>::sRegister(&T::destroyClass);
// useful parameter blocks
-struct TimeIntervalParam : public LLInitParam::Choice<TimeIntervalParam>
+struct TimeIntervalParam : public LLInitParam::ChoiceBlock<TimeIntervalParam>
{
Alternative<F32> seconds;
Alternative<S32> frames;
@@ -371,10 +512,10 @@ public:
namespace LLInitParam
{
template<>
- class TypedParam<LLRect>
- : public BlockValue<LLRect>
+ class ParamValue<LLRect, TypeValues<LLRect> >
+ : public CustomParamValue<LLRect>
{
- typedef BlockValue<LLRect> super_t;
+ typedef CustomParamValue<LLRect> super_t;
public:
Optional<S32> left,
top,
@@ -383,62 +524,43 @@ namespace LLInitParam
width,
height;
- TypedParam(BlockDescriptor& descriptor, const char* name, const LLRect& value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count);
+ ParamValue(const LLRect& value);
- void setValueFromBlock() const;
- void setBlockFromValue();
+ void updateValueFromBlock();
+ void updateBlockFromValue(bool make_block_authoritative);
};
template<>
- struct TypeValues<LLUIColor> : public TypeValuesHelper<LLUIColor>
+ class ParamValue<LLUIColor, TypeValues<LLUIColor> >
+ : public CustomParamValue<LLUIColor>
{
- static void declareValues();
- };
+ typedef CustomParamValue<LLUIColor> super_t;
- template<>
- class TypedParam<LLUIColor>
- : public BlockValue<LLUIColor>
- {
- typedef BlockValue<LLUIColor> super_t;
public:
- Optional<F32> red,
- green,
- blue,
- alpha;
- Optional<std::string> control;
-
- TypedParam(BlockDescriptor& descriptor, const char* name, const LLUIColor& value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count);
- void setValueFromBlock() const;
- void setBlockFromValue();
+ Optional<F32> red,
+ green,
+ blue,
+ alpha;
+ Optional<std::string> control;
+
+ ParamValue(const LLUIColor& color);
+ void updateValueFromBlock();
+ void updateBlockFromValue(bool make_block_authoritative);
};
- // provide a better default for Optional<const LLFontGL*> than NULL
- template <>
- struct DefaultInitializer<const LLFontGL*>
- {
- // return reference to a single default instance of T
- // built-in types will be initialized to zero, default constructor otherwise
- static const LLFontGL* get()
- {
- static const LLFontGL* sDefaultFont = LLFontGL::getFontDefault();
- return sDefaultFont;
- }
- };
-
-
template<>
- class TypedParam<const LLFontGL*>
- : public BlockValue<const LLFontGL*>
+ class ParamValue<const LLFontGL*, TypeValues<const LLFontGL*> >
+ : public CustomParamValue<const LLFontGL* >
{
- typedef BlockValue<const LLFontGL*> super_t;
+ typedef CustomParamValue<const LLFontGL*> super_t;
public:
Optional<std::string> name,
size,
style;
- TypedParam(BlockDescriptor& descriptor, const char* name, const LLFontGL* const value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count);
- void setValueFromBlock() const;
- void setBlockFromValue();
+ ParamValue(const LLFontGL* value);
+ void updateValueFromBlock();
+ void updateBlockFromValue(bool make_block_authoritative);
};
template<>
@@ -467,18 +589,21 @@ namespace LLInitParam
template<>
- class TypedParam<LLCoordGL>
- : public BlockValue<LLCoordGL>
+ class ParamValue<LLCoordGL, TypeValues<LLCoordGL> >
+ : public CustomParamValue<LLCoordGL>
{
- typedef BlockValue<LLCoordGL> super_t;
+ typedef CustomParamValue<LLCoordGL> super_t;
public:
Optional<S32> x,
y;
- TypedParam(BlockDescriptor& descriptor, const char* name, LLCoordGL value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count);
- void setValueFromBlock() const;
- void setBlockFromValue();
+ ParamValue(const LLCoordGL& val);
+ void updateValueFromBlock();
+ void updateBlockFromValue(bool make_block_authoritative);
};
}
+extern LLGLSLShader gSolidColorProgram;
+extern LLGLSLShader gUIProgram;
+
#endif
diff --git a/indra/llui/lluicolortable.cpp b/indra/llui/lluicolortable.cpp
index 0641f6d175..9455d09cc0 100644
--- a/indra/llui/lluicolortable.cpp
+++ b/indra/llui/lluicolortable.cpp
@@ -215,6 +215,12 @@ bool LLUIColorTable::loadFromSettings()
result |= loadFromFilename(current_filename, mLoadedColors);
}
+ current_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SKIN, "colors.xml");
+ if(current_filename != default_filename)
+ {
+ result |= loadFromFilename(current_filename, mLoadedColors);
+ }
+
std::string user_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "colors.xml");
loadFromFilename(user_filename, mUserSetColors);
diff --git a/indra/llui/lluicolortable.h b/indra/llui/lluicolortable.h
index 76518789ec..6a7a681d57 100644
--- a/indra/llui/lluicolortable.h
+++ b/indra/llui/lluicolortable.h
@@ -44,7 +44,7 @@ LOG_CLASS(LLUIColorTable);
typedef std::map<std::string, LLUIColor> string_color_map_t;
public:
- struct ColorParams : LLInitParam::Choice<ColorParams>
+ struct ColorParams : LLInitParam::ChoiceBlock<ColorParams>
{
Alternative<LLColor4> value;
Alternative<std::string> reference;
diff --git a/indra/llui/lluictrl.cpp b/indra/llui/lluictrl.cpp
index 3ac3bf8c41..b9c843e931 100644
--- a/indra/llui/lluictrl.cpp
+++ b/indra/llui/lluictrl.cpp
@@ -36,6 +36,9 @@
static LLDefaultChildRegistry::Register<LLUICtrl> r("ui_ctrl");
+F32 LLUICtrl::sActiveControlTransparency = 1.0f;
+F32 LLUICtrl::sInactiveControlTransparency = 1.0f;
+
// Compiler optimization, generate extern template
template class LLUICtrl* LLView::getChild<class LLUICtrl>(
const std::string& name, BOOL recurse) const;
@@ -65,6 +68,7 @@ LLUICtrl::ControlVisibility::ControlVisibility()
LLUICtrl::Params::Params()
: tab_stop("tab_stop", true),
chrome("chrome", false),
+ requests_front("requests_front", false),
label("label"),
initial_value("value"),
init_callback("init_callback"),
@@ -93,9 +97,10 @@ const LLUICtrl::Params& LLUICtrl::getDefaultParams()
LLUICtrl::LLUICtrl(const LLUICtrl::Params& p, const LLViewModelPtr& viewmodel)
: LLView(p),
- mTentative(FALSE),
mIsChrome(FALSE),
+ mRequestsFront(p.requests_front),
mTabStop(FALSE),
+ mTentative(FALSE),
mViewModel(viewmodel),
mControlVariable(NULL),
mEnabledControlVariable(NULL),
@@ -110,15 +115,17 @@ LLUICtrl::LLUICtrl(const LLUICtrl::Params& p, const LLViewModelPtr& viewmodel)
mMouseUpSignal(NULL),
mRightMouseDownSignal(NULL),
mRightMouseUpSignal(NULL),
- mDoubleClickSignal(NULL)
+ mDoubleClickSignal(NULL),
+ mTransparencyType(TT_DEFAULT)
{
- mUICtrlHandle.bind(this);
}
void LLUICtrl::initFromParams(const Params& p)
{
LLView::initFromParams(p);
+ mRequestsFront = p.requests_front;
+
setIsChrome(p.chrome);
setControlName(p.control_name);
if(p.enabled_controls.isProvided())
@@ -399,6 +406,36 @@ LLViewModel* LLUICtrl::getViewModel() const
return mViewModel;
}
+//virtual
+BOOL LLUICtrl::postBuild()
+{
+ //
+ // Find all of the children that want to be in front and move them to the front
+ //
+
+ if (getChildCount() > 0)
+ {
+ std::vector<LLUICtrl*> childrenToMoveToFront;
+
+ for (LLView::child_list_const_iter_t child_it = beginChild(); child_it != endChild(); ++child_it)
+ {
+ LLUICtrl* uictrl = dynamic_cast<LLUICtrl*>(*child_it);
+
+ if (uictrl && uictrl->mRequestsFront)
+ {
+ childrenToMoveToFront.push_back(uictrl);
+ }
+ }
+
+ for (std::vector<LLUICtrl*>::iterator it = childrenToMoveToFront.begin(); it != childrenToMoveToFront.end(); ++it)
+ {
+ sendChildToFront(*it);
+ }
+ }
+
+ return LLView::postBuild();
+}
+
bool LLUICtrl::setControlValue(const LLSD& value)
{
if (mControlVariable)
@@ -422,7 +459,7 @@ void LLUICtrl::setControlVariable(LLControlVariable* control)
if (control)
{
mControlVariable = control;
- mControlConnection = mControlVariable->getSignal()->connect(boost::bind(&controlListener, _2, getUICtrlHandle(), std::string("value")));
+ mControlConnection = mControlVariable->getSignal()->connect(boost::bind(&controlListener, _2, getHandle(), std::string("value")));
setValue(mControlVariable->getValue());
}
}
@@ -453,7 +490,7 @@ void LLUICtrl::setEnabledControlVariable(LLControlVariable* control)
if (control)
{
mEnabledControlVariable = control;
- mEnabledControlConnection = mEnabledControlVariable->getSignal()->connect(boost::bind(&controlListener, _2, getUICtrlHandle(), std::string("enabled")));
+ mEnabledControlConnection = mEnabledControlVariable->getSignal()->connect(boost::bind(&controlListener, _2, getHandle(), std::string("enabled")));
setEnabled(mEnabledControlVariable->getValue().asBoolean());
}
}
@@ -468,7 +505,7 @@ void LLUICtrl::setDisabledControlVariable(LLControlVariable* control)
if (control)
{
mDisabledControlVariable = control;
- mDisabledControlConnection = mDisabledControlVariable->getSignal()->connect(boost::bind(&controlListener, _2, getUICtrlHandle(), std::string("disabled")));
+ mDisabledControlConnection = mDisabledControlVariable->getSignal()->connect(boost::bind(&controlListener, _2, getHandle(), std::string("disabled")));
setEnabled(!(mDisabledControlVariable->getValue().asBoolean()));
}
}
@@ -483,7 +520,7 @@ void LLUICtrl::setMakeVisibleControlVariable(LLControlVariable* control)
if (control)
{
mMakeVisibleControlVariable = control;
- mMakeVisibleControlConnection = mMakeVisibleControlVariable->getSignal()->connect(boost::bind(&controlListener, _2, getUICtrlHandle(), std::string("visible")));
+ mMakeVisibleControlConnection = mMakeVisibleControlVariable->getSignal()->connect(boost::bind(&controlListener, _2, getHandle(), std::string("visible")));
setVisible(mMakeVisibleControlVariable->getValue().asBoolean());
}
}
@@ -498,7 +535,7 @@ void LLUICtrl::setMakeInvisibleControlVariable(LLControlVariable* control)
if (control)
{
mMakeInvisibleControlVariable = control;
- mMakeInvisibleControlConnection = mMakeInvisibleControlVariable->getSignal()->connect(boost::bind(&controlListener, _2, getUICtrlHandle(), std::string("invisible")));
+ mMakeInvisibleControlConnection = mMakeInvisibleControlVariable->getSignal()->connect(boost::bind(&controlListener, _2, getHandle(), std::string("invisible")));
setVisible(!(mMakeInvisibleControlVariable->getValue().asBoolean()));
}
}
@@ -823,7 +860,7 @@ LLUICtrl* LLUICtrl::findRootMostFocusRoot()
{
LLUICtrl* focus_root = NULL;
LLUICtrl* next_view = this;
- while(next_view)
+ while(next_view && next_view->hasTabStop())
{
if (next_view->isFocusRoot())
{
@@ -923,6 +960,47 @@ BOOL LLUICtrl::getTentative() const
void LLUICtrl::setColor(const LLColor4& color)
{ }
+F32 LLUICtrl::getCurrentTransparency()
+{
+ F32 alpha = 0;
+
+ switch(mTransparencyType)
+ {
+ case TT_DEFAULT:
+ alpha = getDrawContext().mAlpha;
+ break;
+
+ case TT_ACTIVE:
+ alpha = sActiveControlTransparency;
+ break;
+
+ case TT_INACTIVE:
+ alpha = sInactiveControlTransparency;
+ break;
+
+ case TT_FADING:
+ alpha = sInactiveControlTransparency / 2;
+ break;
+ }
+
+ return alpha;
+}
+
+void LLUICtrl::setTransparencyType(ETypeTransparency type)
+{
+ mTransparencyType = type;
+}
+
+boost::signals2::connection LLUICtrl::setCommitCallback(const CommitCallbackParam& cb)
+{
+ return setCommitCallback(initCommitCallback(cb));
+}
+
+boost::signals2::connection LLUICtrl::setValidateCallback(const EnableCallbackParam& cb)
+{
+ return setValidateCallback(initEnableCallback(cb));
+}
+
boost::signals2::connection LLUICtrl::setCommitCallback( const commit_signal_t::slot_type& cb )
{
if (!mCommitSignal) mCommitSignal = new commit_signal_t();
@@ -976,3 +1054,9 @@ boost::signals2::connection LLUICtrl::setDoubleClickCallback( const mouse_signal
if (!mDoubleClickSignal) mDoubleClickSignal = new mouse_signal_t();
return mDoubleClickSignal->connect(cb);
}
+
+void LLUICtrl::addInfo(LLSD & info)
+{
+ LLView::addInfo(info);
+ info["value"] = getValue();
+}
diff --git a/indra/llui/lluictrl.h b/indra/llui/lluictrl.h
index 76dfdf754c..fb2196bb16 100644
--- a/indra/llui/lluictrl.h
+++ b/indra/llui/lluictrl.h
@@ -76,14 +76,14 @@ public:
Optional<enable_callback_t> function;
};
- struct EnableControls : public LLInitParam::Choice<EnableControls>
+ struct EnableControls : public LLInitParam::ChoiceBlock<EnableControls>
{
Alternative<std::string> enabled;
Alternative<std::string> disabled;
EnableControls();
};
- struct ControlVisibility : public LLInitParam::Choice<ControlVisibility>
+ struct ControlVisibility : public LLInitParam::ChoiceBlock<ControlVisibility>
{
Alternative<std::string> visible;
Alternative<std::string> invisible;
@@ -94,7 +94,8 @@ public:
{
Optional<std::string> label;
Optional<bool> tab_stop,
- chrome;
+ chrome,
+ requests_front;
Optional<LLSD> initial_value;
Optional<CommitCallbackParam> init_callback,
@@ -120,6 +121,13 @@ public:
Params();
};
+ enum ETypeTransparency
+ {
+ TT_DEFAULT,
+ TT_ACTIVE, // focused floater
+ TT_INACTIVE, // other floaters
+ TT_FADING, // fading toast
+ };
/*virtual*/ ~LLUICtrl();
void initFromParams(const Params& p);
@@ -136,6 +144,8 @@ protected:
virtual LLViewModel* getViewModel() const;
// We shouldn't ever need to set this directly
//virtual void setViewModel(const LLViewModelPtr&);
+
+ virtual BOOL postBuild();
public:
// LLView interface
@@ -202,13 +212,18 @@ public:
virtual void setColor(const LLColor4& color);
+ F32 getCurrentTransparency();
+
+ void setTransparencyType(ETypeTransparency type);
+ ETypeTransparency getTransparencyType() const {return mTransparencyType;}
+
BOOL focusNextItem(BOOL text_entry_only);
BOOL focusPrevItem(BOOL text_entry_only);
BOOL focusFirstItem(BOOL prefer_text_fields = FALSE, BOOL focus_flash = TRUE );
BOOL focusLastItem(BOOL prefer_text_fields = FALSE);
// Non Virtuals
- LLHandle<LLUICtrl> getUICtrlHandle() const { return mUICtrlHandle; }
+ LLHandle<LLUICtrl> getHandle() const { return getDerivedHandle<LLUICtrl>(); }
BOOL getIsChrome() const;
void setTabStop( BOOL b );
@@ -220,6 +235,9 @@ public:
// topic then put in help_topic_out
bool findHelpTopic(std::string& help_topic_out);
+ boost::signals2::connection setCommitCallback(const CommitCallbackParam& cb);
+ boost::signals2::connection setValidateCallback(const EnableCallbackParam& cb);
+
boost::signals2::connection setCommitCallback( const commit_signal_t::slot_type& cb );
boost::signals2::connection setValidateCallback( const enable_signal_t::slot_type& cb );
@@ -283,12 +301,20 @@ protected:
boost::signals2::connection mMakeVisibleControlConnection;
LLControlVariable* mMakeInvisibleControlVariable;
boost::signals2::connection mMakeInvisibleControlConnection;
+
+ static F32 sActiveControlTransparency;
+ static F32 sInactiveControlTransparency;
+
+ virtual void addInfo(LLSD & info);
+
private:
- BOOL mTabStop;
BOOL mIsChrome;
+ BOOL mRequestsFront;
+ BOOL mTabStop;
BOOL mTentative;
- LLRootHandle<LLUICtrl> mUICtrlHandle;
+
+ ETypeTransparency mTransparencyType;
class DefaultTabGroupFirstSorter;
};
diff --git a/indra/llui/lluictrlfactory.cpp b/indra/llui/lluictrlfactory.cpp
index 5de96f9d48..25e7a31e90 100644
--- a/indra/llui/lluictrlfactory.cpp
+++ b/indra/llui/lluictrlfactory.cpp
@@ -152,7 +152,27 @@ static LLFastTimer::DeclareTimer FTM_XML_PARSE("XML Reading/Parsing");
bool LLUICtrlFactory::getLayeredXMLNode(const std::string &xui_filename, LLXMLNodePtr& root)
{
LLFastTimer timer(FTM_XML_PARSE);
- return LLXMLNode::getLayeredXMLNode(xui_filename, root, LLUI::getXUIPaths());
+
+ std::vector<std::string> paths;
+ std::string path = gDirUtilp->findSkinnedFilename(LLUI::getSkinPath(), xui_filename);
+ if (!path.empty())
+ {
+ paths.push_back(path);
+ }
+
+ std::string localize_path = gDirUtilp->findSkinnedFilename(LLUI::getLocalizedSkinPath(), xui_filename);
+ if (!localize_path.empty() && localize_path != path)
+ {
+ paths.push_back(localize_path);
+ }
+
+ if (paths.empty())
+ {
+ // sometimes whole path is passed in as filename
+ paths.push_back(xui_filename);
+ }
+
+ return LLXMLNode::getLayeredXMLNode(root, paths);
}
@@ -214,7 +234,7 @@ LLView *LLUICtrlFactory::createFromXML(LLXMLNodePtr node, LLView* parent, const
std::string LLUICtrlFactory::getCurFileName()
{
- return mFileNames.empty() ? "" : gDirUtilp->getWorkingDir() + gDirUtilp->getDirDelimiter() + mFileNames.back();
+ return mFileNames.empty() ? "" : mFileNames.back();
}
diff --git a/indra/llui/lluictrlfactory.h b/indra/llui/lluictrlfactory.h
index 499b97f52d..d612ad5005 100644
--- a/indra/llui/lluictrlfactory.h
+++ b/indra/llui/lluictrlfactory.h
@@ -104,14 +104,17 @@ private:
public:
ParamDefaults()
{
- // recursively initialize from base class param block
- ((typename PARAM_BLOCK::base_block_t&)mPrototype).fillFrom(ParamDefaults<typename PARAM_BLOCK::base_block_t, DUMMY>::instance().get());
- // after initializing base classes, look up template file for this param block
+ // look up template file for this param block...
const std::string* param_block_tag = getWidgetTag(&typeid(PARAM_BLOCK));
if (param_block_tag)
- {
- LLUICtrlFactory::loadWidgetTemplate(*param_block_tag, mPrototype);
+ { // ...and if it exists, back fill values using the most specific template first
+ PARAM_BLOCK params;
+ LLUICtrlFactory::loadWidgetTemplate(*param_block_tag, params);
+ mPrototype.fillFrom(params);
}
+ // recursively fill from base class param block
+ ((typename PARAM_BLOCK::base_block_t&)mPrototype).fillFrom(ParamDefaults<typename PARAM_BLOCK::base_block_t, DUMMY>::instance().get());
+
}
const PARAM_BLOCK& get() { return mPrototype; }
@@ -169,7 +172,7 @@ public:
static T* createFromFile(const std::string &filename, LLView *parent, const widget_registry_t& registry, LLXMLNodePtr output_node = NULL)
{
T* widget = NULL;
-
+
std::string skinned_filename = findSkinnedFilename(filename);
instance().pushFileName(filename);
{
@@ -198,10 +201,10 @@ public:
// not of right type, so delete it
if (!widget)
{
+ llwarns << "Widget in " << filename << " was of type " << typeid(view).name() << " instead of expected type " << typeid(T).name() << llendl;
delete view;
view = NULL;
}
-
}
}
fail:
diff --git a/indra/llui/lluiimage.cpp b/indra/llui/lluiimage.cpp
index 1ffad4806e..1d9ce29ba9 100644
--- a/indra/llui/lluiimage.cpp
+++ b/indra/llui/lluiimage.cpp
@@ -155,32 +155,32 @@ void LLUIImage::onImageLoaded()
namespace LLInitParam
{
- void TypedParam<LLUIImage*>::setValueFromBlock() const
+ void ParamValue<LLUIImage*, TypeValues<LLUIImage*> >::updateValueFromBlock()
{
// The keyword "none" is specifically requesting a null image
// do not default to current value. Used to overwrite template images.
if (name() == "none")
{
- mData.mValue = NULL;
+ updateValue(NULL);
return;
}
LLUIImage* imagep = LLUI::getUIImage(name());
if (imagep)
{
- mData.mValue = imagep;
+ updateValue(imagep);
}
}
- void TypedParam<LLUIImage*>::setBlockFromValue()
+ void ParamValue<LLUIImage*, TypeValues<LLUIImage*> >::updateBlockFromValue(bool make_block_authoritative)
{
- if (mData.mValue == NULL)
+ if (getValue() == NULL)
{
- name.set("none", false);
+ name.set("none", make_block_authoritative);
}
else
{
- name.set(mData.mValue->getName(), false);
+ name.set(getValue()->getName(), make_block_authoritative);
}
}
diff --git a/indra/llui/lluiimage.h b/indra/llui/lluiimage.h
index 38107c112d..f07e8fa746 100644
--- a/indra/llui/lluiimage.h
+++ b/indra/llui/lluiimage.h
@@ -92,22 +92,23 @@ protected:
namespace LLInitParam
{
template<>
- class TypedParam<LLUIImage*, TypeValues<LLUIImage*>, false>
- : public BlockValue<LLUIImage*>
+ class ParamValue<LLUIImage*, TypeValues<LLUIImage*> >
+ : public CustomParamValue<LLUIImage*>
{
typedef boost::add_reference<boost::add_const<LLUIImage*>::type>::type T_const_ref;
- typedef BlockValue<LLUIImage*> super_t;
+ typedef CustomParamValue<LLUIImage*> super_t;
public:
Optional<std::string> name;
- TypedParam(BlockDescriptor& descriptor, const char* name, super_t::value_assignment_t value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count)
- : super_t(descriptor, name, value, func, min_count, max_count)
+ ParamValue(LLUIImage* const& image)
+ : super_t(image)
{
- setBlockFromValue();
+ updateBlockFromValue(false);
+ addSynonym(name, "name");
}
- void setValueFromBlock() const;
- void setBlockFromValue();
+ void updateValueFromBlock();
+ void updateBlockFromValue(bool make_block_authoritative);
};
// Need custom comparison function for our test app, which only loads
diff --git a/indra/llui/lluistring.cpp b/indra/llui/lluistring.cpp
index ac69d3bf85..c4e073ccdb 100644
--- a/indra/llui/lluistring.cpp
+++ b/indra/llui/lluistring.cpp
@@ -128,17 +128,13 @@ void LLUIString::updateResult() const
}
mResult = mOrig;
- // get the defailt args + local args
- if (!mArgs || mArgs->empty())
+ // get the default args + local args
+ LLStringUtil::format_map_t combined_args = LLTrans::getDefaultArgs();
+ if (mArgs && !mArgs->empty())
{
- LLStringUtil::format(mResult, LLTrans::getDefaultArgs());
- }
- else
- {
- LLStringUtil::format_map_t combined_args = LLTrans::getDefaultArgs();
combined_args.insert(mArgs->begin(), mArgs->end());
- LLStringUtil::format(mResult, combined_args);
}
+ LLStringUtil::format(mResult, combined_args);
}
void LLUIString::updateWResult() const
diff --git a/indra/llui/lluistring.h b/indra/llui/lluistring.h
index 4faa0e070e..cb40c85582 100644
--- a/indra/llui/lluistring.h
+++ b/indra/llui/lluistring.h
@@ -61,7 +61,6 @@ public:
LLUIString() : mArgs(NULL), mNeedsResult(false), mNeedsWResult(false) {}
LLUIString(const std::string& instring, const LLStringUtil::format_map_t& args);
LLUIString(const std::string& instring) : mArgs(NULL) { assign(instring); }
-
~LLUIString() { delete mArgs; }
void assign(const std::string& instring);
diff --git a/indra/llui/llurlaction.cpp b/indra/llui/llurlaction.cpp
index 42b779bd28..fd9b3d9a6d 100644
--- a/indra/llui/llurlaction.cpp
+++ b/indra/llui/llurlaction.cpp
@@ -33,28 +33,28 @@
#include "llurlregistry.h"
// global state for the callback functions
-void (*LLUrlAction::sOpenURLCallback) (const std::string& url) = NULL;
-void (*LLUrlAction::sOpenURLInternalCallback) (const std::string& url) = NULL;
-void (*LLUrlAction::sOpenURLExternalCallback) (const std::string& url) = NULL;
-bool (*LLUrlAction::sExecuteSLURLCallback) (const std::string& url) = NULL;
+LLUrlAction::url_callback_t LLUrlAction::sOpenURLCallback;
+LLUrlAction::url_callback_t LLUrlAction::sOpenURLInternalCallback;
+LLUrlAction::url_callback_t LLUrlAction::sOpenURLExternalCallback;
+LLUrlAction::execute_url_callback_t LLUrlAction::sExecuteSLURLCallback;
-void LLUrlAction::setOpenURLCallback(void (*cb) (const std::string& url))
+void LLUrlAction::setOpenURLCallback(url_callback_t cb)
{
sOpenURLCallback = cb;
}
-void LLUrlAction::setOpenURLInternalCallback(void (*cb) (const std::string& url))
+void LLUrlAction::setOpenURLInternalCallback(url_callback_t cb)
{
sOpenURLInternalCallback = cb;
}
-void LLUrlAction::setOpenURLExternalCallback(void (*cb) (const std::string& url))
+void LLUrlAction::setOpenURLExternalCallback(url_callback_t cb)
{
sOpenURLExternalCallback = cb;
}
-void LLUrlAction::setExecuteSLURLCallback(bool (*cb) (const std::string& url))
+void LLUrlAction::setExecuteSLURLCallback(execute_url_callback_t cb)
{
sExecuteSLURLCallback = cb;
}
@@ -63,7 +63,7 @@ void LLUrlAction::openURL(std::string url)
{
if (sOpenURLCallback)
{
- (*sOpenURLCallback)(url);
+ sOpenURLCallback(url);
}
}
@@ -71,7 +71,7 @@ void LLUrlAction::openURLInternal(std::string url)
{
if (sOpenURLInternalCallback)
{
- (*sOpenURLInternalCallback)(url);
+ sOpenURLInternalCallback(url);
}
}
@@ -79,7 +79,7 @@ void LLUrlAction::openURLExternal(std::string url)
{
if (sOpenURLExternalCallback)
{
- (*sOpenURLExternalCallback)(url);
+ sOpenURLExternalCallback(url);
}
}
@@ -87,18 +87,18 @@ void LLUrlAction::executeSLURL(std::string url)
{
if (sExecuteSLURLCallback)
{
- (*sExecuteSLURLCallback)(url);
+ sExecuteSLURLCallback(url);
}
}
void LLUrlAction::clickAction(std::string url)
{
// Try to handle as SLURL first, then http Url
- if ( (sExecuteSLURLCallback) && !(*sExecuteSLURLCallback)(url) )
+ if ( (sExecuteSLURLCallback) && !sExecuteSLURLCallback(url) )
{
if (sOpenURLCallback)
{
- (*sOpenURLCallback)(url);
+ sOpenURLCallback(url);
}
}
}
diff --git a/indra/llui/llurlaction.h b/indra/llui/llurlaction.h
index 0132dbaaf0..c34960b826 100644
--- a/indra/llui/llurlaction.h
+++ b/indra/llui/llurlaction.h
@@ -29,6 +29,7 @@
#define LL_LLURLACTION_H
#include <string>
+#include <boost/function.hpp>
///
/// The LLUrlAction class provides a number of static functions that
@@ -77,17 +78,21 @@ public:
static void showProfile(std::string url);
/// specify the callbacks to enable this class's functionality
- static void setOpenURLCallback(void (*cb) (const std::string& url));
- static void setOpenURLInternalCallback(void (*cb) (const std::string& url));
- static void setOpenURLExternalCallback(void (*cb) (const std::string& url));
- static void setExecuteSLURLCallback(bool (*cb) (const std::string& url));
+ typedef boost::function<void (const std::string&)> url_callback_t;
+ typedef boost::function<bool(const std::string& url)> execute_url_callback_t;
+
+ static void setOpenURLCallback(url_callback_t cb);
+ static void setOpenURLInternalCallback(url_callback_t cb);
+ static void setOpenURLExternalCallback(url_callback_t cb);
+ static void setExecuteSLURLCallback(execute_url_callback_t cb);
private:
// callbacks for operations we can perform on Urls
- static void (*sOpenURLCallback) (const std::string& url);
- static void (*sOpenURLInternalCallback) (const std::string& url);
- static void (*sOpenURLExternalCallback) (const std::string& url);
- static bool (*sExecuteSLURLCallback) (const std::string& url);
+ static url_callback_t sOpenURLCallback;
+ static url_callback_t sOpenURLInternalCallback;
+ static url_callback_t sOpenURLExternalCallback;
+
+ static execute_url_callback_t sExecuteSLURLCallback;
};
#endif
diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp
index 6cc72bad82..a9e8fbb4e4 100644
--- a/indra/llui/llurlentry.cpp
+++ b/indra/llui/llurlentry.cpp
@@ -27,6 +27,7 @@
#include "linden_common.h"
#include "llurlentry.h"
+#include "lluictrl.h"
#include "lluri.h"
#include "llurlmatch.h"
#include "llurlregistry.h"
@@ -35,6 +36,7 @@
#include "llcachename.h"
#include "lltrans.h"
#include "lluicolortable.h"
+#include "message.h"
#define APP_HEADER_REGEX "((x-grid-location-info://[-\\w\\.]+/app)|(secondlife:///app))"
@@ -167,6 +169,15 @@ void LLUrlEntryBase::callObservers(const std::string &id,
}
}
+/// is this a match for a URL that should not be hyperlinked?
+bool LLUrlEntryBase::isLinkDisabled() const
+{
+ // this allows us to have a global setting to turn off text hyperlink highlighting/action
+ bool globally_disabled = LLUI::sSettingGroups["config"]->getBOOL("DisableTextHyperlinkActions");
+
+ return globally_disabled;
+}
+
static std::string getStringAfterToken(const std::string str, const std::string token)
{
size_t pos = str.find(token);
@@ -456,8 +467,8 @@ std::string LLUrlEntryAgent::getLabel(const std::string &url, const LLUrlLabelCa
LLStyle::Params LLUrlEntryAgent::getStyle() const
{
LLStyle::Params style_params = LLUrlEntryBase::getStyle();
- style_params.color = LLUIColorTable::instance().getColor("AgentLinkColor");
- style_params.readonly_color = LLUIColorTable::instance().getColor("AgentLinkColor");
+ style_params.color = LLUIColorTable::instance().getColor("HTMLLinkColor");
+ style_params.readonly_color = LLUIColorTable::instance().getColor("HTMLLinkColor");
return style_params;
}
@@ -674,8 +685,8 @@ std::string LLUrlEntryGroup::getLabel(const std::string &url, const LLUrlLabelCa
LLStyle::Params LLUrlEntryGroup::getStyle() const
{
LLStyle::Params style_params = LLUrlEntryBase::getStyle();
- style_params.color = LLUIColorTable::instance().getColor("GroupLinkColor");
- style_params.readonly_color = LLUIColorTable::instance().getColor("GroupLinkColor");
+ style_params.color = LLUIColorTable::instance().getColor("HTMLLinkColor");
+ style_params.readonly_color = LLUIColorTable::instance().getColor("HTMLLinkColor");
return style_params;
}
@@ -730,6 +741,13 @@ std::string LLUrlEntryObjectIM::getLocation(const std::string &url) const
return LLUrlEntryBase::getLocation(url);
}
+// LLUrlEntryParcel statics.
+LLUUID LLUrlEntryParcel::sAgentID(LLUUID::null);
+LLUUID LLUrlEntryParcel::sSessionID(LLUUID::null);
+LLHost LLUrlEntryParcel::sRegionHost(LLHost::invalid);
+bool LLUrlEntryParcel::sDisconnected(false);
+std::set<LLUrlEntryParcel*> LLUrlEntryParcel::sParcelInfoObservers;
+
///
/// LLUrlEntryParcel Describes a Second Life parcel Url, e.g.,
/// secondlife:///app/parcel/0000060e-4b39-e00b-d0c3-d98b1934e3a8/about
@@ -741,13 +759,88 @@ LLUrlEntryParcel::LLUrlEntryParcel()
boost::regex::perl|boost::regex::icase);
mMenuName = "menu_url_parcel.xml";
mTooltip = LLTrans::getString("TooltipParcelUrl");
+
+ sParcelInfoObservers.insert(this);
+}
+
+LLUrlEntryParcel::~LLUrlEntryParcel()
+{
+ sParcelInfoObservers.erase(this);
}
std::string LLUrlEntryParcel::getLabel(const std::string &url, const LLUrlLabelCallback &cb)
{
+ LLSD path_array = LLURI(url).pathArray();
+ S32 path_parts = path_array.size();
+
+ if (path_parts < 3) // no parcel id
+ {
+ llwarns << "Failed to parse url [" << url << "]" << llendl;
+ return url;
+ }
+
+ std::string parcel_id_string = unescapeUrl(path_array[2]); // parcel id
+
+ // Add an observer to call LLUrlLabelCallback when we have parcel name.
+ addObserver(parcel_id_string, url, cb);
+
+ LLUUID parcel_id(parcel_id_string);
+
+ sendParcelInfoRequest(parcel_id);
+
return unescapeUrl(url);
}
+void LLUrlEntryParcel::sendParcelInfoRequest(const LLUUID& parcel_id)
+{
+ if (sRegionHost == LLHost::invalid || sDisconnected) return;
+
+ LLMessageSystem *msg = gMessageSystem;
+ msg->newMessage("ParcelInfoRequest");
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, sAgentID );
+ msg->addUUID("SessionID", sSessionID);
+ msg->nextBlock("Data");
+ msg->addUUID("ParcelID", parcel_id);
+ msg->sendReliable(sRegionHost);
+}
+
+void LLUrlEntryParcel::onParcelInfoReceived(const std::string &id, const std::string &label)
+{
+ callObservers(id, label.empty() ? LLTrans::getString("RegionInfoError") : label, mIcon);
+}
+
+// static
+void LLUrlEntryParcel::processParcelInfo(const LLParcelData& parcel_data)
+{
+ std::string label(LLStringUtil::null);
+ if (!parcel_data.name.empty())
+ {
+ label = parcel_data.name;
+ }
+ // If parcel name is empty use Sim_name (x, y, z) for parcel label.
+ else if (!parcel_data.sim_name.empty())
+ {
+ S32 region_x = llround(parcel_data.global_x) % REGION_WIDTH_UNITS;
+ S32 region_y = llround(parcel_data.global_y) % REGION_WIDTH_UNITS;
+ S32 region_z = llround(parcel_data.global_z);
+
+ label = llformat("%s (%d, %d, %d)",
+ parcel_data.sim_name.c_str(), region_x, region_y, region_z);
+ }
+
+ for (std::set<LLUrlEntryParcel*>::iterator iter = sParcelInfoObservers.begin();
+ iter != sParcelInfoObservers.end();
+ ++iter)
+ {
+ LLUrlEntryParcel* url_entry = *iter;
+ if (url_entry)
+ {
+ url_entry->onParcelInfoReceived(parcel_data.parcel_id.asString(), label);
+ }
+ }
+}
+
//
// LLUrlEntryPlace Describes secondlife://<location> URLs
//
@@ -796,6 +889,69 @@ std::string LLUrlEntryPlace::getLocation(const std::string &url) const
}
//
+// LLUrlEntryRegion Describes secondlife:///app/region/REGION_NAME/X/Y/Z URLs, e.g.
+// secondlife:///app/region/Ahern/128/128/0
+//
+LLUrlEntryRegion::LLUrlEntryRegion()
+{
+ mPattern = boost::regex("secondlife:///app/region/[^/\\s]+(/\\d+)?(/\\d+)?(/\\d+)?/?",
+ boost::regex::perl|boost::regex::icase);
+ mMenuName = "menu_url_slurl.xml";
+ mTooltip = LLTrans::getString("TooltipSLURL");
+}
+
+std::string LLUrlEntryRegion::getLabel(const std::string &url, const LLUrlLabelCallback &cb)
+{
+ //
+ // we handle SLURLs in the following formats:
+ // - secondlife:///app/region/Place/X/Y/Z
+ // - secondlife:///app/region/Place/X/Y
+ // - secondlife:///app/region/Place/X
+ // - secondlife:///app/region/Place
+ //
+
+ LLSD path_array = LLURI(url).pathArray();
+ S32 path_parts = path_array.size();
+
+ if (path_parts < 3) // no region name
+ {
+ llwarns << "Failed to parse url [" << url << "]" << llendl;
+ return url;
+ }
+
+ std::string label = unescapeUrl(path_array[2]); // region name
+
+ if (path_parts > 3) // secondlife:///app/region/Place/X
+ {
+ std::string x = path_array[3];
+ label += " (" + x;
+
+ if (path_parts > 4) // secondlife:///app/region/Place/X/Y
+ {
+ std::string y = path_array[4];
+ label += "," + y;
+
+ if (path_parts > 5) // secondlife:///app/region/Place/X/Y/Z
+ {
+ std::string z = path_array[5];
+ label = label + "," + z;
+ }
+ }
+
+ label += ")";
+ }
+
+ return label;
+}
+
+std::string LLUrlEntryRegion::getLocation(const std::string &url) const
+{
+ LLSD path_array = LLURI(url).pathArray();
+ std::string region_name = unescapeUrl(path_array[2]);
+ return region_name;
+}
+
+//
// LLUrlEntryTeleport Describes a Second Life teleport Url, e.g.,
// secondlife:///app/teleport/Ahern/50/50/50/
// x-grid-location-info://lincoln.lindenlab.com/app/teleport/Ahern/50/50/50/
@@ -978,7 +1134,7 @@ std::string LLUrlEntryWorldMap::getLocation(const std::string &url) const
//
LLUrlEntryNoLink::LLUrlEntryNoLink()
{
- mPattern = boost::regex("<nolink>.*</nolink>",
+ mPattern = boost::regex("<nolink>.*?</nolink>",
boost::regex::perl|boost::regex::icase);
}
diff --git a/indra/llui/llurlentry.h b/indra/llui/llurlentry.h
index 1a16056041..5f82721c0f 100644
--- a/indra/llui/llurlentry.h
+++ b/indra/llui/llurlentry.h
@@ -31,6 +31,9 @@
#include "lluuid.h"
#include "lluicolor.h"
#include "llstyle.h"
+
+#include "llhost.h" // for resolving parcel name by parcel id
+
#include <boost/signals2.hpp>
#include <boost/regex.hpp>
#include <string>
@@ -94,6 +97,8 @@ public:
virtual LLUUID getID(const std::string &string) const { return LLUUID::null; }
+ bool isLinkDisabled() const;
+
protected:
std::string getIDStringFromUrl(const std::string &url) const;
std::string escapeUrl(const std::string &url) const;
@@ -283,8 +288,44 @@ private:
class LLUrlEntryParcel : public LLUrlEntryBase
{
public:
+ struct LLParcelData
+ {
+ LLUUID parcel_id;
+ std::string name;
+ std::string sim_name;
+ F32 global_x;
+ F32 global_y;
+ F32 global_z;
+ };
+
LLUrlEntryParcel();
+ ~LLUrlEntryParcel();
/*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb);
+
+ // Sends a parcel info request to sim.
+ void sendParcelInfoRequest(const LLUUID& parcel_id);
+
+ // Calls observers of certain parcel id providing them with parcel label.
+ void onParcelInfoReceived(const std::string &id, const std::string &label);
+
+ // Processes parcel label and triggers notifying observers.
+ static void processParcelInfo(const LLParcelData& parcel_data);
+
+ // Next 4 setters are used to update agent and viewer connection information
+ // upon events like user login, viewer disconnect and user changing region host.
+ // These setters are made public to be accessible from newview and should not be
+ // used in other cases.
+ static void setAgentID(const LLUUID& id) { sAgentID = id; }
+ static void setSessionID(const LLUUID& id) { sSessionID = id; }
+ static void setRegionHost(const LLHost& host) { sRegionHost = host; }
+ static void setDisconnected(bool disconnected) { sDisconnected = disconnected; }
+
+private:
+ static LLUUID sAgentID;
+ static LLUUID sSessionID;
+ static LLHost sRegionHost;
+ static bool sDisconnected;
+ static std::set<LLUrlEntryParcel*> sParcelInfoObservers;
};
///
@@ -300,6 +341,18 @@ public:
};
///
+/// LLUrlEntryRegion Describes a Second Life location Url, e.g.,
+/// secondlife:///app/region/Ahern/128/128/0
+///
+class LLUrlEntryRegion : public LLUrlEntryBase
+{
+public:
+ LLUrlEntryRegion();
+ /*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb);
+ /*virtual*/ std::string getLocation(const std::string &url) const;
+};
+
+///
/// LLUrlEntryTeleport Describes a Second Life teleport Url, e.g.,
/// secondlife:///app/teleport/Ahern/50/50/50/
///
diff --git a/indra/llui/llurlregistry.cpp b/indra/llui/llurlregistry.cpp
index 478b412d5e..523ee5d78c 100644
--- a/indra/llui/llurlregistry.cpp
+++ b/indra/llui/llurlregistry.cpp
@@ -54,6 +54,7 @@ LLUrlRegistry::LLUrlRegistry()
registerUrl(new LLUrlEntryGroup());
registerUrl(new LLUrlEntryParcel());
registerUrl(new LLUrlEntryTeleport());
+ registerUrl(new LLUrlEntryRegion());
registerUrl(new LLUrlEntryWorldMap());
registerUrl(new LLUrlEntryObjectIM());
registerUrl(new LLUrlEntryPlace());
diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp
index 3fa86bf0ca..54843227b7 100644
--- a/indra/llui/llview.cpp
+++ b/indra/llui/llview.cpp
@@ -31,7 +31,10 @@
#include "llview.h"
#include <cassert>
+#include <sstream>
#include <boost/tokenizer.hpp>
+#include <boost/foreach.hpp>
+#include <boost/bind.hpp>
#include "llrender.h"
#include "llevent.h"
@@ -44,6 +47,7 @@
#include "v3color.h"
#include "lluictrlfactory.h"
#include "lltooltip.h"
+#include "llsdutil.h"
// for ui edit hack
#include "llbutton.h"
@@ -66,6 +70,8 @@ S32 LLView::sLastLeftXML = S32_MIN;
S32 LLView::sLastBottomXML = S32_MIN;
std::vector<LLViewDrawContext*> LLViewDrawContext::sDrawContextStack;
+LLView::DrilldownFunc LLView::sDrilldown =
+ boost::bind(&LLView::pointInView, _1, _2, _3, HIT_TEST_USE_BOUNDING_RECT);
//#if LL_DEBUG
BOOL LLView::sIsDrawing = FALSE;
@@ -102,6 +108,7 @@ LLView::Params::Params()
left_pad("left_pad"),
left_delta("left_delta", S32_MAX),
from_xui("from_xui", false),
+ focus_root("focus_root", false),
needs_translate("translate"),
xmlns("xmlns"),
xmlns_xsi("xmlns:xsi"),
@@ -113,16 +120,17 @@ LLView::Params::Params()
}
LLView::LLView(const LLView::Params& p)
-: mName(p.name),
+: mVisible(p.visible),
+ mInDraw(false),
+ mName(p.name),
mParentView(NULL),
mReshapeFlags(FOLLOWS_NONE),
mFromXUI(p.from_xui),
- mIsFocusRoot(FALSE),
+ mIsFocusRoot(p.focus_root),
mLastVisible(FALSE),
mNextInsertionOrdinal(0),
mHoverCursor(getCursorFromString(p.hover_cursor)),
mEnabled(p.enabled),
- mVisible(p.visible),
mMouseOpaque(p.mouse_opaque),
mSoundFlags(p.sound_flags),
mUseBoundingRect(p.use_bounding_rect),
@@ -163,8 +171,6 @@ LLView::~LLView()
if (mDefaultWidgets)
{
- std::for_each(mDefaultWidgets->begin(), mDefaultWidgets->end(),
- DeletePairedPointer());
delete mDefaultWidgets;
mDefaultWidgets = NULL;
}
@@ -220,9 +226,11 @@ BOOL LLView::getUseBoundingRect() const
}
// virtual
-std::string LLView::getName() const
+const std::string& LLView::getName() const
{
- return mName.empty() ? std::string("(no name)") : mName;
+ static std::string no_name("(no name)");
+
+ return mName.empty() ? no_name : mName;
}
void LLView::sendChildToFront(LLView* child)
@@ -326,6 +334,8 @@ void LLView::removeChild(LLView* child)
//llassert_always(sDepth == 0); // Avoid re-ordering while drawing; it can cause subtle iterator bugs
if (child->mParentView == this)
{
+ // if we are removing an item we are currently iterating over, that would be bad
+ llassert(child->mInDraw == false);
mChildList.remove( child );
child->mParentView = NULL;
if (child->isCtrl())
@@ -339,7 +349,7 @@ void LLView::removeChild(LLView* child)
}
else
{
- llerrs << "LLView::removeChild called with non-child" << llendl;
+ llwarns << child->getName() << "is not a child of " << getName() << llendl;
}
updateBoundingRect();
}
@@ -347,13 +357,11 @@ void LLView::removeChild(LLView* child)
LLView::ctrl_list_t LLView::getCtrlList() const
{
ctrl_list_t controls;
- for(child_list_const_iter_t iter = mChildList.begin();
- iter != mChildList.end();
- iter++)
+ BOOST_FOREACH(LLView* viewp, mChildList)
{
- if((*iter)->isCtrl())
+ if(viewp->isCtrl())
{
- controls.push_back(static_cast<LLUICtrl*>(*iter));
+ controls.push_back(static_cast<LLUICtrl*>(viewp));
}
}
return controls;
@@ -429,6 +437,36 @@ BOOL LLView::isInEnabledChain() const
return enabled;
}
+static void buildPathname(std::ostream& out, const LLView* view)
+{
+ if (! (view && view->getParent()))
+ {
+ return; // Don't include root in the path.
+ }
+
+ buildPathname(out, view->getParent());
+
+ // Build pathname into ostream on the way back from recursion.
+ out << '/' << view->getName();
+}
+
+std::string LLView::getPathname() const
+{
+ std::ostringstream out;
+ buildPathname(out, this);
+ return out.str();
+}
+
+//static
+std::string LLView::getPathname(const LLView* view)
+{
+ if (! view)
+ {
+ return "NULL";
+ }
+ return view->getPathname();
+}
+
// virtual
BOOL LLView::canFocusChildren() const
{
@@ -575,9 +613,8 @@ void LLView::deleteAllChildren()
void LLView::setAllChildrenEnabled(BOOL b)
{
- for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
+ BOOST_FOREACH(LLView* viewp, mChildList)
{
- LLView* viewp = *child_it;
viewp->setEnabled(b);
}
}
@@ -603,9 +640,8 @@ void LLView::setVisible(BOOL visible)
// virtual
void LLView::handleVisibilityChange ( BOOL new_visibility )
{
- for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
+ BOOST_FOREACH(LLView* viewp, mChildList)
{
- LLView* viewp = *child_it;
// only views that are themselves visible will have their overall visibility affected by their ancestors
if (viewp->getVisible())
{
@@ -647,56 +683,178 @@ void LLView::onMouseLeave(S32 x, S32 y, MASK mask)
//llinfos << "Mouse left " << getName() << llendl;
}
+bool LLView::visibleAndContains(S32 local_x, S32 local_y)
+{
+ return sDrilldown(this, local_x, local_y)
+ && getVisible();
+}
+
+bool LLView::visibleEnabledAndContains(S32 local_x, S32 local_y)
+{
+ return visibleAndContains(local_x, local_y)
+ && getEnabled();
+}
+
+void LLView::logMouseEvent()
+{
+ if (sDebugMouseHandling)
+ {
+ sMouseHandlerMessage = std::string("/") + mName + sMouseHandlerMessage;
+ }
+}
+
+template <typename METHOD, typename CHARTYPE>
+LLView* LLView::childrenHandleCharEvent(const std::string& desc, const METHOD& method,
+ CHARTYPE c, MASK mask)
+{
+ if ( getVisible() && getEnabled() )
+ {
+ BOOST_FOREACH(LLView* viewp, mChildList)
+ {
+ if ((viewp->*method)(c, mask, TRUE))
+ {
+ if (LLView::sDebugKeys)
+ {
+ llinfos << desc << " handled by " << viewp->getName() << llendl;
+ }
+ return viewp;
+ }
+ }
+ }
+ return NULL;
+}
+
+// XDATA might be MASK, or S32 clicks
+template <typename METHOD, typename XDATA>
+LLView* LLView::childrenHandleMouseEvent(const METHOD& method, S32 x, S32 y, XDATA extra, bool allow_mouse_block)
+{
+ BOOST_FOREACH(LLView* viewp, mChildList)
+ {
+ S32 local_x = x - viewp->getRect().mLeft;
+ S32 local_y = y - viewp->getRect().mBottom;
+
+ if (!viewp->visibleEnabledAndContains(local_x, local_y))
+ {
+ continue;
+ }
+
+ if ((viewp->*method)( local_x, local_y, extra )
+ || (allow_mouse_block && viewp->blockMouseEvent( local_x, local_y )))
+ {
+ viewp->logMouseEvent();
+ return viewp;
+ }
+ }
+ return NULL;
+}
LLView* LLView::childrenHandleToolTip(S32 x, S32 y, MASK mask)
{
- LLView* handled_view = NULL;
- for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
+ BOOST_FOREACH(LLView* viewp, mChildList)
{
- LLView* viewp = *child_it;
S32 local_x = x - viewp->getRect().mLeft;
S32 local_y = y - viewp->getRect().mBottom;
- if(!viewp->pointInView(local_x, local_y)
- || !viewp->getVisible())
+ // Differs from childrenHandleMouseEvent() in that we want to offer
+ // tooltips even for disabled widgets.
+ if(!viewp->visibleAndContains(local_x, local_y))
{
continue;
}
- if (viewp->handleToolTip(local_x, local_y, mask) )
+ if (viewp->handleToolTip(local_x, local_y, mask)
+ || viewp->blockMouseEvent(local_x, local_y))
{
- if (sDebugMouseHandling)
- {
- sMouseHandlerMessage = std::string("/") + viewp->mName + sMouseHandlerMessage;
- }
+ viewp->logMouseEvent();
+ return viewp;
+ }
+ }
+ return NULL;
+}
- handled_view = viewp;
- break;
+LLView* LLView::childrenHandleDragAndDrop(S32 x, S32 y, MASK mask,
+ BOOL drop,
+ EDragAndDropType cargo_type,
+ void* cargo_data,
+ EAcceptance* accept,
+ std::string& tooltip_msg)
+{
+ // default to not accepting drag and drop, will be overridden by handler
+ *accept = ACCEPT_NO;
+
+ BOOST_FOREACH(LLView* viewp, mChildList)
+ {
+ S32 local_x = x - viewp->getRect().mLeft;
+ S32 local_y = y - viewp->getRect().mBottom;
+ if( !viewp->visibleEnabledAndContains(local_x, local_y))
+ {
+ continue;
}
- if (viewp->blockMouseEvent(local_x, local_y))
+ // Differs from childrenHandleMouseEvent() simply in that this virtual
+ // method call diverges pretty radically from the usual (x, y, int).
+ if (viewp->handleDragAndDrop(local_x, local_y, mask, drop,
+ cargo_type,
+ cargo_data,
+ accept,
+ tooltip_msg)
+ || viewp->blockMouseEvent(local_x, local_y))
{
- handled_view = viewp;
- break;
+ return viewp;
}
}
- return handled_view;
+ return NULL;
}
+LLView* LLView::childrenHandleHover(S32 x, S32 y, MASK mask)
+{
+ BOOST_FOREACH(LLView* viewp, mChildList)
+ {
+ S32 local_x = x - viewp->getRect().mLeft;
+ S32 local_y = y - viewp->getRect().mBottom;
+ if(!viewp->visibleEnabledAndContains(local_x, local_y))
+ {
+ continue;
+ }
+
+ // This call differentiates this method from childrenHandleMouseEvent().
+ LLUI::sWindow->setCursor(viewp->getHoverCursor());
+
+ if (viewp->handleHover(local_x, local_y, mask)
+ || viewp->blockMouseEvent(local_x, local_y))
+ {
+ viewp->logMouseEvent();
+ return viewp;
+ }
+ }
+ return NULL;
+}
-LLView* LLView::childFromPoint(S32 x, S32 y)
+LLView* LLView::childFromPoint(S32 x, S32 y, bool recur)
{
- if (!getVisible() )
+ if (!getVisible())
return false;
- for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
+
+ BOOST_FOREACH(LLView* viewp, mChildList)
{
- LLView* viewp = *child_it;
S32 local_x = x - viewp->getRect().mLeft;
S32 local_y = y - viewp->getRect().mBottom;
- if (!viewp->pointInView(local_x, local_y)
- || !viewp->getVisible() )
+ if (!viewp->visibleAndContains(local_x, local_y))
{
continue;
}
+ // Here we've found the first (frontmost) visible child at this level
+ // containing the specified point. Is the caller asking us to drill
+ // down and return the innermost leaf child at this point, or just the
+ // top-level child?
+ if (recur)
+ {
+ LLView* leaf(viewp->childFromPoint(local_x, local_y, recur));
+ // Maybe viewp is already a leaf LLView, or maybe it has children
+ // but this particular (x, y) point falls between them. If the
+ // recursive call returns non-NULL, great, use that; else just use
+ // viewp.
+ return leaf? leaf : viewp;
+ }
return viewp;
}
@@ -709,15 +867,16 @@ BOOL LLView::handleToolTip(S32 x, S32 y, MASK mask)
// parents provide tooltips first, which are optionally
// overridden by children, in case child is mouse_opaque
- if (!mToolTipMsg.empty())
+ std::string tooltip = getToolTip();
+ if (!tooltip.empty())
{
// allow "scrubbing" over ui by showing next tooltip immediately
// if previous one was still visible
F32 timeout = LLToolTipMgr::instance().toolTipVisible()
- ? 0.f
+ ? LLUI::sSettingGroups["config"]->getF32( "ToolTipFastDelay" )
: LLUI::sSettingGroups["config"]->getF32( "ToolTipDelay" );
LLToolTipMgr::instance().show(LLToolTip::Params()
- .message(mToolTipMsg)
+ .message(tooltip)
.sticky_rect(calcScreenRect())
.delay_time(timeout));
@@ -816,45 +975,6 @@ BOOL LLView::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
return childrenHandleDragAndDrop( x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg) != NULL;
}
-LLView* LLView::childrenHandleDragAndDrop(S32 x, S32 y, MASK mask,
- BOOL drop,
- EDragAndDropType cargo_type,
- void* cargo_data,
- EAcceptance* accept,
- std::string& tooltip_msg)
-{
- LLView* handled_view = NULL;
- for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
- {
- LLView* viewp = *child_it;
- S32 local_x = x - viewp->getRect().mLeft;
- S32 local_y = y - viewp->getRect().mBottom;
- if( !viewp->pointInView(local_x, local_y) ||
- !viewp->getVisible() ||
- !viewp->getEnabled())
- {
- continue;
- }
- if (viewp->handleDragAndDrop(local_x, local_y, mask, drop,
- cargo_type,
- cargo_data,
- accept,
- tooltip_msg))
- {
- handled_view = viewp;
- break;
- }
-
- if (viewp->blockMouseEvent(x, y))
- {
- *accept = ACCEPT_NO;
- handled_view = viewp;
- break;
- }
- }
- return handled_view;
-}
-
void LLView::onMouseCaptureLost()
{
}
@@ -904,391 +1024,57 @@ BOOL LLView::handleMiddleMouseUp(S32 x, S32 y, MASK mask)
return childrenHandleMiddleMouseUp( x, y, mask ) != NULL;
}
-
LLView* LLView::childrenHandleScrollWheel(S32 x, S32 y, S32 clicks)
{
- LLView* handled_view = NULL;
- if (getVisible() && getEnabled() )
- {
- for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
- {
- LLView* viewp = *child_it;
- S32 local_x = x - viewp->getRect().mLeft;
- S32 local_y = y - viewp->getRect().mBottom;
- if (!viewp->pointInView(local_x, local_y)
- || !viewp->getVisible()
- || !viewp->getEnabled())
- {
- continue;
- }
-
- if (viewp->handleScrollWheel( local_x, local_y, clicks ))
- {
- if (sDebugMouseHandling)
- {
- sMouseHandlerMessage = std::string("/") + viewp->mName + sMouseHandlerMessage;
- }
-
- handled_view = viewp;
- break;
- }
- }
- }
- return handled_view;
-}
-
-LLView* LLView::childrenHandleHover(S32 x, S32 y, MASK mask)
-{
- LLView* handled_view = NULL;
- if (getVisible() && getEnabled() )
- {
- for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
- {
- LLView* viewp = *child_it;
- S32 local_x = x - viewp->getRect().mLeft;
- S32 local_y = y - viewp->getRect().mBottom;
- if(!viewp->pointInView(local_x, local_y)
- || !viewp->getVisible()
- || !viewp->getEnabled())
- {
- continue;
- }
-
- if (viewp->handleHover(local_x, local_y, mask) )
- {
- if (sDebugMouseHandling)
- {
- sMouseHandlerMessage = std::string("/") + viewp->mName + sMouseHandlerMessage;
- }
-
- handled_view = viewp;
- break;
- }
-
- if (viewp->blockMouseEvent(local_x, local_y))
- {
- LLUI::sWindow->setCursor(viewp->getHoverCursor());
-
- handled_view = viewp;
- break;
- }
- }
- }
- return handled_view;
+ return childrenHandleMouseEvent(&LLView::handleScrollWheel, x, y, clicks, false);
}
// Called during downward traversal
LLView* LLView::childrenHandleKey(KEY key, MASK mask)
{
- LLView* handled_view = NULL;
-
- if ( getVisible() && getEnabled() )
- {
- for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
- {
- LLView* viewp = *child_it;
- if (viewp->handleKey(key, mask, TRUE))
- {
- if (LLView::sDebugKeys)
- {
- llinfos << "Key handled by " << viewp->getName() << llendl;
- }
- handled_view = viewp;
- break;
- }
- }
- }
-
- return handled_view;
+ return childrenHandleCharEvent("Key", &LLView::handleKey, key, mask);
}
// Called during downward traversal
LLView* LLView::childrenHandleUnicodeChar(llwchar uni_char)
{
- LLView* handled_view = NULL;
-
- if ( getVisible() && getEnabled() )
- {
- for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
- {
- LLView* viewp = *child_it;
- if (viewp->handleUnicodeChar(uni_char, TRUE))
- {
- if (LLView::sDebugKeys)
- {
- llinfos << "Unicode character handled by " << viewp->getName() << llendl;
- }
- handled_view = viewp;
- break;
- }
- }
- }
-
- return handled_view;
+ return childrenHandleCharEvent("Unicode character", &LLView::handleUnicodeCharWithDummyMask,
+ uni_char, MASK_NONE);
}
LLView* LLView::childrenHandleMouseDown(S32 x, S32 y, MASK mask)
{
- LLView* handled_view = NULL;
-
- for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
- {
- LLView* viewp = *child_it;
- S32 local_x = x - viewp->getRect().mLeft;
- S32 local_y = y - viewp->getRect().mBottom;
-
- if (!viewp->pointInView(local_x, local_y)
- || !viewp->getVisible()
- || !viewp->getEnabled())
- {
- continue;
- }
-
- if(viewp->handleMouseDown( local_x, local_y, mask ))
- {
- if (sDebugMouseHandling)
- {
- sMouseHandlerMessage = std::string("/") + viewp->mName + sMouseHandlerMessage;
- }
- handled_view = viewp;
- break;
- }
-
- if(viewp->blockMouseEvent(local_x, local_y))
- {
- handled_view = viewp;
- break;
- }
- }
- return handled_view;
+ return childrenHandleMouseEvent(&LLView::handleMouseDown, x, y, mask);
}
LLView* LLView::childrenHandleRightMouseDown(S32 x, S32 y, MASK mask)
{
- LLView* handled_view = NULL;
-
- if (getVisible() && getEnabled() )
- {
- for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
- {
- LLView* viewp = *child_it;
- S32 local_x = x - viewp->getRect().mLeft;
- S32 local_y = y - viewp->getRect().mBottom;
-
- if (!viewp->pointInView(local_x, local_y)
- || !viewp->getVisible()
- || !viewp->getEnabled())
- {
- continue;
- }
-
- if (viewp->handleRightMouseDown( local_x, local_y, mask ))
- {
- if (sDebugMouseHandling)
- {
- sMouseHandlerMessage = std::string("/") + viewp->mName + sMouseHandlerMessage;
- }
-
- handled_view = viewp;
- break;
- }
-
- if (viewp->blockMouseEvent(local_x, local_y))
- {
- handled_view = viewp;
- break;
- }
- }
- }
- return handled_view;
+ return childrenHandleMouseEvent(&LLView::handleRightMouseDown, x, y, mask);
}
LLView* LLView::childrenHandleMiddleMouseDown(S32 x, S32 y, MASK mask)
{
- LLView* handled_view = NULL;
-
- if (getVisible() && getEnabled() )
- {
- for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
- {
- LLView* viewp = *child_it;
- S32 local_x = x - viewp->getRect().mLeft;
- S32 local_y = y - viewp->getRect().mBottom;
- if (!viewp->pointInView(local_x, local_y)
- || !viewp->getVisible()
- || !viewp->getEnabled())
- {
- continue;
- }
-
- if(viewp->handleMiddleMouseDown( local_x, local_y, mask ))
- {
- if (sDebugMouseHandling)
- {
- sMouseHandlerMessage = std::string("/") + viewp->mName + sMouseHandlerMessage;
- }
- handled_view = viewp;
- break;
- }
-
- if (viewp->blockMouseEvent(local_x, local_y))
- {
- handled_view = viewp;
- break;
- }
- }
- }
- return handled_view;
+ return childrenHandleMouseEvent(&LLView::handleMiddleMouseDown, x, y, mask);
}
LLView* LLView::childrenHandleDoubleClick(S32 x, S32 y, MASK mask)
{
- LLView* handled_view = NULL;
-
- if (getVisible() && getEnabled() )
- {
- for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
- {
- LLView* viewp = *child_it;
- S32 local_x = x - viewp->getRect().mLeft;
- S32 local_y = y - viewp->getRect().mBottom;
-
- if (!viewp->pointInView(local_x, local_y)
- || !viewp->getVisible()
- || !viewp->getEnabled())
- {
- continue;
- }
-
- if (viewp->handleDoubleClick( local_x, local_y, mask ))
- {
- if (sDebugMouseHandling)
- {
- sMouseHandlerMessage = std::string("/") + viewp->mName + sMouseHandlerMessage;
- }
- handled_view = viewp;
- break;
- }
-
- if (viewp->blockMouseEvent(local_x, local_y))
- {
- handled_view = viewp;
- break;
- }
- }
- }
- return handled_view;
+ return childrenHandleMouseEvent(&LLView::handleDoubleClick, x, y, mask);
}
LLView* LLView::childrenHandleMouseUp(S32 x, S32 y, MASK mask)
{
- LLView* handled_view = NULL;
- if( getVisible() && getEnabled() )
- {
- for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
- {
- LLView* viewp = *child_it;
- S32 local_x = x - viewp->getRect().mLeft;
- S32 local_y = y - viewp->getRect().mBottom;
- if (!viewp->pointInView(local_x, local_y)
- || !viewp->getVisible()
- || !viewp->getEnabled())
- {
- continue;
- }
-
- if (viewp->handleMouseUp( local_x, local_y, mask ))
- {
- if (sDebugMouseHandling)
- {
- sMouseHandlerMessage = std::string("/") + viewp->mName + sMouseHandlerMessage;
- }
- handled_view = viewp;
- break;
- }
-
- if (viewp->blockMouseEvent(local_x, local_y))
- {
- handled_view = viewp;
- break;
- }
- }
- }
- return handled_view;
+ return childrenHandleMouseEvent(&LLView::handleMouseUp, x, y, mask);
}
LLView* LLView::childrenHandleRightMouseUp(S32 x, S32 y, MASK mask)
{
- LLView* handled_view = NULL;
- if( getVisible() && getEnabled() )
- {
- for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
- {
- LLView* viewp = *child_it;
- S32 local_x = x - viewp->getRect().mLeft;
- S32 local_y = y - viewp->getRect().mBottom;
- if (!viewp->pointInView(local_x, local_y)
- || !viewp->getVisible()
- || !viewp->getEnabled() )
- {
- continue;
- }
-
- if(viewp->handleRightMouseUp( local_x, local_y, mask ))
- {
- if (sDebugMouseHandling)
- {
- sMouseHandlerMessage = std::string("/") + viewp->mName + sMouseHandlerMessage;
- }
- handled_view = viewp;
- break;
- }
-
- if(viewp->blockMouseEvent(local_x, local_y))
- {
- handled_view = viewp;
- break;
- }
- }
- }
- return handled_view;
+ return childrenHandleMouseEvent(&LLView::handleRightMouseUp, x, y, mask);
}
LLView* LLView::childrenHandleMiddleMouseUp(S32 x, S32 y, MASK mask)
{
- LLView* handled_view = NULL;
- if( getVisible() && getEnabled() )
- {
- for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
- {
- LLView* viewp = *child_it;
- S32 local_x = x - viewp->getRect().mLeft;
- S32 local_y = y - viewp->getRect().mBottom;
- if (!viewp->pointInView(local_x, local_y)
- || !viewp->getVisible()
- || !viewp->getEnabled())
- {
- continue;
- }
-
- if(viewp->handleMiddleMouseUp( local_x, local_y, mask ))
- {
- if (sDebugMouseHandling)
- {
- sMouseHandlerMessage = std::string("/") + viewp->mName + sMouseHandlerMessage;
- }
- handled_view = viewp;
- break;
- }
-
- if (viewp->blockMouseEvent(local_x, local_y))
- {
- handled_view = viewp;
- break;
- }
- }
- }
- return handled_view;
+ return childrenHandleMouseEvent(&LLView::handleMiddleMouseUp, x, y, mask);
}
void LLView::draw()
@@ -1300,26 +1086,31 @@ void LLView::drawChildren()
{
if (!mChildList.empty())
{
- LLRect rootRect = getRootView()->getRect();
- LLRect screenRect;
-
+ LLView* rootp = LLUI::getRootView();
++sDepth;
for (child_list_reverse_iter_t child_iter = mChildList.rbegin(); child_iter != mChildList.rend();) // ++child_iter)
{
child_list_reverse_iter_t child = child_iter++;
LLView *viewp = *child;
+
+ if (viewp == NULL)
+ {
+ continue;
+ }
if (viewp->getVisible() && viewp->getRect().isValid())
{
- // Only draw views that are within the root view
- localRectToScreen(viewp->getRect(),&screenRect);
- if ( rootRect.overlaps(screenRect) && LLUI::sDirtyRect.overlaps(screenRect))
+ LLRect screen_rect = viewp->calcScreenRect();
+ if ( rootp->getLocalRect().overlaps(screen_rect) && LLUI::sDirtyRect.overlaps(screen_rect))
{
LLUI::pushMatrix();
{
- LLUI::translate((F32)viewp->getRect().mLeft, (F32)viewp->getRect().mBottom, 0.f);
+ LLUI::translate((F32)viewp->getRect().mLeft, (F32)viewp->getRect().mBottom);
+ // flag the fact we are in draw here, in case overridden draw() method attempts to remove this widget
+ viewp->mInDraw = true;
viewp->draw();
+ viewp->mInDraw = false;
if (sDebugRects)
{
@@ -1368,7 +1159,7 @@ void LLView::drawDebugRect()
if (getUseBoundingRect())
{
- LLUI::translate((F32)mBoundingRect.mLeft - (F32)mRect.mLeft, (F32)mBoundingRect.mBottom - (F32)mRect.mBottom, 0.f);
+ LLUI::translate((F32)mBoundingRect.mLeft - (F32)mRect.mLeft, (F32)mBoundingRect.mBottom - (F32)mRect.mBottom);
}
LLRect debug_rect = getUseBoundingRect() ? mBoundingRect : mRect;
@@ -1437,10 +1228,10 @@ void LLView::drawChild(LLView* childp, S32 x_offset, S32 y_offset, BOOL force_dr
if ((childp->getVisible() && childp->getRect().isValid())
|| force_draw)
{
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
LLUI::pushMatrix();
{
- LLUI::translate((F32)childp->getRect().mLeft + x_offset, (F32)childp->getRect().mBottom + y_offset, 0.f);
+ LLUI::translate((F32)childp->getRect().mLeft + x_offset, (F32)childp->getRect().mBottom + y_offset);
childp->draw();
}
LLUI::popMatrix();
@@ -1464,9 +1255,8 @@ void LLView::reshape(S32 width, S32 height, BOOL called_from_parent)
mRect.mTop = getRect().mBottom + height;
// move child views according to reshape flags
- for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
+ BOOST_FOREACH(LLView* viewp, mChildList)
{
- LLView* viewp = *child_it;
LLRect child_rect( viewp->mRect );
if (viewp->followsRight() && viewp->followsLeft())
@@ -1510,7 +1300,10 @@ void LLView::reshape(S32 width, S32 height, BOOL called_from_parent)
S32 delta_x = child_rect.mLeft - viewp->getRect().mLeft;
S32 delta_y = child_rect.mBottom - viewp->getRect().mBottom;
viewp->translate( delta_x, delta_y );
- viewp->reshape(child_rect.getWidth(), child_rect.getHeight());
+ if (child_rect.getWidth() != viewp->getRect().getWidth() || child_rect.getHeight() != viewp->getRect().getHeight())
+ {
+ viewp->reshape(child_rect.getWidth(), child_rect.getHeight());
+ }
}
}
@@ -1529,10 +1322,8 @@ LLRect LLView::calcBoundingRect()
{
LLRect local_bounding_rect = LLRect::null;
- child_list_const_iter_t child_it;
- for ( child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
+ BOOST_FOREACH(LLView* childp, mChildList)
{
- LLView* childp = *child_it;
// ignore invisible and "top" children when calculating bounding rect
// such as combobox popups
if (!childp->getVisible() || childp == gFocusMgr.getTopCtrl())
@@ -1659,15 +1450,19 @@ BOOL LLView::hasAncestor(const LLView* parentp) const
BOOL LLView::childHasKeyboardFocus( const std::string& childname ) const
{
- LLView *child = findChildView(childname, TRUE);
- if (child)
- {
- return gFocusMgr.childHasKeyboardFocus(child);
- }
- else
+ LLView *focus = dynamic_cast<LLView *>(gFocusMgr.getKeyboardFocus());
+
+ while (focus != NULL)
{
- return FALSE;
+ if (focus->getName() == childname)
+ {
+ return TRUE;
+ }
+
+ focus = focus->getParent();
}
+
+ return FALSE;
}
//-----------------------------------------------------------------------------
@@ -1682,18 +1477,7 @@ BOOL LLView::hasChild(const std::string& childname, BOOL recurse) const
//-----------------------------------------------------------------------------
LLView* LLView::getChildView(const std::string& name, BOOL recurse) const
{
- LLView* child = findChildView(name, recurse);
- if (!child)
- {
- child = getDefaultWidget<LLView>(name);
- if (!child)
- {
- LLView::Params view_params;
- view_params.name = name;
- child = LLUICtrlFactory::create<LLView>(view_params);
- }
- }
- return child;
+ return getChild<LLView>(name, recurse);
}
static LLFastTimer::DeclareTimer FTM_FIND_VIEWS("Find Widgets");
@@ -1704,11 +1488,9 @@ LLView* LLView::findChildView(const std::string& name, BOOL recurse) const
//richard: should we allow empty names?
//if(name.empty())
// return NULL;
- child_list_const_iter_t child_it;
// Look for direct children *first*
- for ( child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
+ BOOST_FOREACH(LLView* childp, mChildList)
{
- LLView* childp = *child_it;
llassert(childp);
if (childp->getName() == name)
{
@@ -1718,9 +1500,8 @@ LLView* LLView::findChildView(const std::string& name, BOOL recurse) const
if (recurse)
{
// Look inside each child as well.
- for ( child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
+ BOOST_FOREACH(LLView* childp, mChildList)
{
- LLView* childp = *child_it;
llassert(childp);
LLView* viewp = childp->findChildView(name, recurse);
if ( viewp )
@@ -1837,67 +1618,31 @@ LLView* LLView::findNextSibling(LLView* child)
return (next_it != mChildList.end()) ? *next_it : NULL;
}
-void LLView::deleteViewByHandle(LLHandle<LLView> handle)
-{
- LLView* viewp = handle.get();
-
- delete viewp;
-}
-
-LLCoordGL getNeededTranslation(const LLRect& input, const LLRect& constraint, BOOL allow_partial_outside)
+LLCoordGL getNeededTranslation(const LLRect& input, const LLRect& constraint, S32 min_overlap_pixels)
{
LLCoordGL delta;
- if (allow_partial_outside)
- {
- const S32 KEEP_ONSCREEN_PIXELS = 16;
+ const S32 KEEP_ONSCREEN_PIXELS_WIDTH = llmin(min_overlap_pixels, input.getWidth());
+ const S32 KEEP_ONSCREEN_PIXELS_HEIGHT = llmin(min_overlap_pixels, input.getHeight());
- if( input.mRight - KEEP_ONSCREEN_PIXELS < constraint.mLeft )
- {
- delta.mX = constraint.mLeft - (input.mRight - KEEP_ONSCREEN_PIXELS);
- }
- else
- if( input.mLeft + KEEP_ONSCREEN_PIXELS > constraint.mRight )
- {
- delta.mX = constraint.mRight - (input.mLeft + KEEP_ONSCREEN_PIXELS);
- }
+ if( input.mRight - KEEP_ONSCREEN_PIXELS_WIDTH < constraint.mLeft )
+ {
+ delta.mX = constraint.mLeft - (input.mRight - KEEP_ONSCREEN_PIXELS_WIDTH);
+ }
+ else if( input.mLeft + KEEP_ONSCREEN_PIXELS_WIDTH > constraint.mRight )
+ {
+ delta.mX = constraint.mRight - (input.mLeft + KEEP_ONSCREEN_PIXELS_WIDTH);
+ }
- if( input.mTop > constraint.mTop )
- {
- delta.mY = constraint.mTop - input.mTop;
- }
- else
- if( input.mTop - KEEP_ONSCREEN_PIXELS < constraint.mBottom )
- {
- delta.mY = constraint.mBottom - (input.mTop - KEEP_ONSCREEN_PIXELS);
- }
+ if( input.mTop > constraint.mTop )
+ {
+ delta.mY = constraint.mTop - input.mTop;
}
else
+ if( input.mTop - KEEP_ONSCREEN_PIXELS_HEIGHT < constraint.mBottom )
{
- if( input.mLeft < constraint.mLeft )
- {
- delta.mX = constraint.mLeft - input.mLeft;
- }
- else
- if( input.mRight > constraint.mRight )
- {
- delta.mX = constraint.mRight - input.mRight;
- // compensate for left edge possible going off screen
- delta.mX += llmax( 0, input.getWidth() - constraint.getWidth() );
- }
-
- if( input.mTop > constraint.mTop )
- {
- delta.mY = constraint.mTop - input.mTop;
- }
- else
- if( input.mBottom < constraint.mBottom )
- {
- delta.mY = constraint.mBottom - input.mBottom;
- // compensate for top edge possible going off screen
- delta.mY -= llmax( 0, input.getHeight() - constraint.getHeight() );
- }
+ delta.mY = constraint.mBottom - (input.mTop - KEEP_ONSCREEN_PIXELS_HEIGHT);
}
return delta;
@@ -1906,9 +1651,9 @@ LLCoordGL getNeededTranslation(const LLRect& input, const LLRect& constraint, BO
// Moves the view so that it is entirely inside of constraint.
// If the view will not fit because it's too big, aligns with the top and left.
// (Why top and left? That's where the drag bars are for floaters.)
-BOOL LLView::translateIntoRect(const LLRect& constraint, BOOL allow_partial_outside )
+BOOL LLView::translateIntoRect(const LLRect& constraint, S32 min_overlap_pixels)
{
- LLCoordGL translation = getNeededTranslation(getRect(), constraint, allow_partial_outside);
+ LLCoordGL translation = getNeededTranslation(getRect(), constraint, min_overlap_pixels);
if (translation.mX != 0 || translation.mY != 0)
{
@@ -1920,9 +1665,9 @@ BOOL LLView::translateIntoRect(const LLRect& constraint, BOOL allow_partial_outs
// move this view into "inside" but not onto "exclude"
// NOTE: if this view is already contained in "inside", we ignore the "exclude" rect
-BOOL LLView::translateIntoRectWithExclusion( const LLRect& inside, const LLRect& exclude, BOOL allow_partial_outside )
+BOOL LLView::translateIntoRectWithExclusion( const LLRect& inside, const LLRect& exclude, S32 min_overlap_pixels)
{
- LLCoordGL translation = getNeededTranslation(getRect(), inside, allow_partial_outside);
+ LLCoordGL translation = getNeededTranslation(getRect(), inside, min_overlap_pixels);
if (translation.mX != 0 || translation.mY != 0)
{
@@ -1970,7 +1715,7 @@ void LLView::centerWithin(const LLRect& bounds)
translate( left - getRect().mLeft, bottom - getRect().mBottom );
}
-BOOL LLView::localPointToOtherView( S32 x, S32 y, S32 *other_x, S32 *other_y, LLView* other_view) const
+BOOL LLView::localPointToOtherView( S32 x, S32 y, S32 *other_x, S32 *other_y, const LLView* other_view) const
{
const LLView* cur_view = this;
const LLView* root_view = NULL;
@@ -2013,7 +1758,7 @@ BOOL LLView::localPointToOtherView( S32 x, S32 y, S32 *other_x, S32 *other_y, LL
return FALSE;
}
-BOOL LLView::localRectToOtherView( const LLRect& local, LLRect* other, LLView* other_view ) const
+BOOL LLView::localRectToOtherView( const LLRect& local, LLRect* other, const LLView* other_view ) const
{
LLRect cur_rect = local;
const LLView* cur_view = this;
@@ -2090,7 +1835,10 @@ const LLCtrlQuery & LLView::getFocusRootsQuery()
void LLView::setShape(const LLRect& new_rect, bool by_user)
{
- handleReshape(new_rect, by_user);
+ if (new_rect != getRect())
+ {
+ handleReshape(new_rect, by_user);
+ }
}
void LLView::handleReshape(const LLRect& new_rect, bool by_user)
@@ -2480,110 +2228,163 @@ static bool get_last_child_rect(LLView* parent, LLRect *rect)
}
//static
-void LLView::applyXUILayout(LLView::Params& p, LLView* parent)
+void LLView::applyXUILayout(LLView::Params& p, LLView* parent, LLRect layout_rect)
{
+ if (!parent) return;
+
const S32 VPAD = 4;
const S32 MIN_WIDGET_HEIGHT = 10;
// *NOTE: This will confuse export of floater/panel coordinates unless
// the default is also "topleft". JC
- if (p.layout().empty() && parent)
+ if (p.layout().empty())
{
p.layout = parent->getLayout();
}
- if (parent)
+ if (layout_rect.isEmpty())
{
- LLRect parent_rect = parent->getLocalRect();
- // overwrite uninitialized rect params, using context
- LLRect last_rect = parent->getLocalRect();
+ layout_rect = parent->getLocalRect();
+ }
- bool layout_topleft = (p.layout() == "topleft");
+ // overwrite uninitialized rect params, using context
+ LLRect default_rect = parent->getLocalRect();
- // convert negative or centered coordinates to parent relative values
- // Note: some of this logic matches the logic in TypedParam<LLRect>::setValueFromBlock()
- if (p.rect.left.isProvided() && p.rect.left < 0) p.rect.left = p.rect.left + parent_rect.getWidth();
- if (p.rect.right.isProvided() && p.rect.right < 0) p.rect.right = p.rect.right + parent_rect.getWidth();
- if (p.rect.bottom.isProvided() && p.rect.bottom < 0) p.rect.bottom = p.rect.bottom + parent_rect.getHeight();
- if (p.rect.top.isProvided() && p.rect.top < 0) p.rect.top = p.rect.top + parent_rect.getHeight();
+ bool layout_topleft = (p.layout() == "topleft");
+ // convert negative or centered coordinates to parent relative values
+ // Note: some of this logic matches the logic in TypedParam<LLRect>::setValueFromBlock()
+ if (p.rect.left.isProvided())
+ {
+ p.rect.left = p.rect.left + ((p.rect.left >= 0) ? layout_rect.mLeft : layout_rect.mRight);
+ }
+ if (p.rect.right.isProvided())
+ {
+ p.rect.right = p.rect.right + ((p.rect.right >= 0) ? layout_rect.mLeft : layout_rect.mRight);
+ }
+ if (p.rect.bottom.isProvided())
+ {
+ p.rect.bottom = p.rect.bottom + ((p.rect.bottom >= 0) ? layout_rect.mBottom : layout_rect.mTop);
if (layout_topleft)
{
//invert top to bottom
- if (p.rect.top.isProvided()) p.rect.top = parent_rect.getHeight() - p.rect.top;
- if (p.rect.bottom.isProvided()) p.rect.bottom = parent_rect.getHeight() - p.rect.bottom;
+ p.rect.bottom = layout_rect.mBottom + layout_rect.mTop - p.rect.bottom;
}
-
- // DEPRECATE: automatically fall back to height of MIN_WIDGET_HEIGHT pixels
- if (!p.rect.height.isProvided() && !p.rect.top.isProvided() && p.rect.height == 0)
+ }
+ if (p.rect.top.isProvided())
+ {
+ p.rect.top = p.rect.top + ((p.rect.top >= 0) ? layout_rect.mBottom : layout_rect.mTop);
+ if (layout_topleft)
{
- p.rect.height = MIN_WIDGET_HEIGHT;
+ //invert top to bottom
+ p.rect.top = layout_rect.mBottom + layout_rect.mTop - p.rect.top;
}
+ }
+
+ // DEPRECATE: automatically fall back to height of MIN_WIDGET_HEIGHT pixels
+ if (!p.rect.height.isProvided() && !p.rect.top.isProvided() && p.rect.height == 0)
+ {
+ p.rect.height = MIN_WIDGET_HEIGHT;
+ }
- last_rect.translate(0, last_rect.getHeight());
+ default_rect.translate(0, default_rect.getHeight());
- // If there was a recently constructed child, use its rectangle
- get_last_child_rect(parent, &last_rect);
+ // If there was a recently constructed child, use its rectangle
+ get_last_child_rect(parent, &default_rect);
- if (layout_topleft)
+ if (layout_topleft)
+ {
+ // Invert the sense of bottom_delta for topleft layout
+ if (p.bottom_delta.isProvided())
{
- p.bottom_delta.setIfNotProvided(0, false);
-
- // Invert the sense of bottom_delta for topleft layout
- if (p.bottom_delta.isProvided())
- {
- p.bottom_delta = -p.bottom_delta;
- }
- else if (p.top_pad.isProvided())
- {
- p.bottom_delta = -(p.rect.height + p.top_pad);
- }
- else if (p.top_delta.isProvided())
- {
- p.bottom_delta =
- -(p.top_delta + p.rect.height - last_rect.getHeight());
- }
- else if (!p.bottom_delta.isProvided()
- && !p.left_delta.isProvided()
- && !p.top_pad.isProvided()
- && !p.left_pad.isProvided())
- {
- // set default position is just below last rect
- p.bottom_delta.set(-(p.rect.height + VPAD), false);
- }
+ p.bottom_delta = -p.bottom_delta;
+ }
+ else if (p.top_pad.isProvided())
+ {
+ p.bottom_delta = -(p.rect.height + p.top_pad);
+ }
+ else if (p.top_delta.isProvided())
+ {
+ p.bottom_delta =
+ -(p.top_delta + p.rect.height - default_rect.getHeight());
+ }
+ else if (!p.left_delta.isProvided()
+ && !p.left_pad.isProvided())
+ {
+ // set default position is just below last rect
+ p.bottom_delta.set(-(p.rect.height + VPAD), false);
+ }
+ else
+ {
+ p.bottom_delta.set(0, false);
+ }
- // default to same left edge
- p.left_delta.setIfNotProvided(0, false);
- if (p.left_pad.isProvided())
- {
- // left_pad is based on prior widget's right edge
- p.left_delta.set(p.left_pad + last_rect.getWidth(), false);
- }
+ // default to same left edge
+ if (!p.left_delta.isProvided())
+ {
+ p.left_delta.set(0, false);
+ }
+ if (p.left_pad.isProvided())
+ {
+ // left_pad is based on prior widget's right edge
+ p.left_delta.set(p.left_pad + default_rect.getWidth(), false);
+ }
- last_rect.translate(p.left_delta, p.bottom_delta);
+ default_rect.translate(p.left_delta, p.bottom_delta);
+ }
+ else
+ {
+ // set default position is just below last rect
+ if (!p.bottom_delta.isProvided())
+ {
+ p.bottom_delta.set(-(p.rect.height + VPAD), false);
}
- else
- {
- // set default position is just below last rect
- p.bottom_delta.setIfNotProvided(-(p.rect.height + VPAD), false);
- p.left_delta.setIfNotProvided(0, false);
- last_rect.translate(p.left_delta, p.bottom_delta);
+ if (!p.left_delta.isProvided())
+ {
+ p.left_delta.set(0, false);
}
+ default_rect.translate(p.left_delta, p.bottom_delta);
+ }
- // this handles case where *both* x and x_delta are provided
- // ignore x in favor of default x + x_delta
- if (p.bottom_delta.isProvided()) p.rect.bottom.set(0, false);
- if (p.left_delta.isProvided()) p.rect.left.set(0, false);
+ // this handles case where *both* x and x_delta are provided
+ // ignore x in favor of default x + x_delta
+ if (p.bottom_delta.isProvided()) p.rect.bottom.set(0, false);
+ if (p.left_delta.isProvided()) p.rect.left.set(0, false);
- // selectively apply rectangle defaults, making sure that
- // params are not flagged as having been "provided"
- // as rect params are overconstrained and rely on provided flags
- p.rect.left.setIfNotProvided(last_rect.mLeft, false);
- p.rect.bottom.setIfNotProvided(last_rect.mBottom, false);
- p.rect.top.setIfNotProvided(last_rect.mTop, false);
- p.rect.right.setIfNotProvided(last_rect.mRight, false);
- p.rect.width.setIfNotProvided(last_rect.getWidth(), false);
- p.rect.height.setIfNotProvided(last_rect.getHeight(), false);
+ // selectively apply rectangle defaults, making sure that
+ // params are not flagged as having been "provided"
+ // as rect params are overconstrained and rely on provided flags
+ if (!p.rect.left.isProvided())
+ {
+ p.rect.left.set(default_rect.mLeft, false);
+ //HACK: get around the fact that setting a rect param component value won't invalidate the existing rect object value
+ p.rect.paramChanged(p.rect.left, true);
+ }
+ if (!p.rect.bottom.isProvided())
+ {
+ p.rect.bottom.set(default_rect.mBottom, false);
+ p.rect.paramChanged(p.rect.bottom, true);
+ }
+ if (!p.rect.top.isProvided())
+ {
+ p.rect.top.set(default_rect.mTop, false);
+ p.rect.paramChanged(p.rect.top, true);
+ }
+ if (!p.rect.right.isProvided())
+ {
+ p.rect.right.set(default_rect.mRight, false);
+ p.rect.paramChanged(p.rect.right, true);
+
+ }
+ if (!p.rect.width.isProvided())
+ {
+ p.rect.width.set(default_rect.getWidth(), false);
+ p.rect.paramChanged(p.rect.width, true);
+ }
+ if (!p.rect.height.isProvided())
+ {
+ p.rect.height.set(default_rect.getHeight(), false);
+ p.rect.paramChanged(p.rect.height, true);
}
}
@@ -2804,11 +2605,14 @@ LLView::root_to_view_iterator_t LLView::endRootToView()
// only create maps on demand, as they incur heap allocation/deallocation cost
// when a view is constructed/deconstructed
-LLView::default_widget_map_t& LLView::getDefaultWidgetMap() const
+LLView& LLView::getDefaultWidgetContainer() const
{
if (!mDefaultWidgets)
{
- mDefaultWidgets = new default_widget_map_t();
+ LLView::Params p;
+ p.name = "default widget container";
+ p.visible = false; // ensures default widgets can't steal focus, etc.
+ mDefaultWidgets = new LLView(p);
}
return *mDefaultWidgets;
}
@@ -2823,9 +2627,9 @@ S32 LLView::notifyParent(const LLSD& info)
bool LLView::notifyChildren(const LLSD& info)
{
bool ret = false;
- for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
+ BOOST_FOREACH(LLView* childp, mChildList)
{
- ret |= (*child_it)->notifyChildren(info);
+ ret = ret || childp->notifyChildren(info);
}
return ret;
}
@@ -2845,3 +2649,24 @@ const LLViewDrawContext& LLViewDrawContext::getCurrentContext()
return *sDrawContextStack.back();
}
+
+LLSD LLView::getInfo(void)
+{
+ LLSD info;
+ addInfo(info);
+ return info;
+}
+
+void LLView::addInfo(LLSD & info)
+{
+ info["path"] = getPathname();
+ info["class"] = typeid(*this).name();
+ info["visible"] = getVisible();
+ info["visible_chain"] = isInVisibleChain();
+ info["enabled"] = getEnabled();
+ info["enabled_chain"] = isInEnabledChain();
+ info["available"] = isAvailable();
+ LLRect rect(calcScreenRect());
+ info["rect"] = LLSDMap("left", rect.mLeft)("top", rect.mTop)
+ ("right", rect.mRight)("bottom", rect.mBottom);
+}
diff --git a/indra/llui/llview.h b/indra/llui/llview.h
index 33d345beff..1c35349510 100644
--- a/indra/llui/llview.h
+++ b/indra/llui/llview.h
@@ -34,6 +34,7 @@
#include "stdtypes.h"
#include "llcoord.h"
#include "llfontgl.h"
+#include "llhandle.h"
#include "llmortician.h"
#include "llmousehandler.h"
#include "llstring.h"
@@ -49,6 +50,8 @@
#include "llfocusmgr.h"
#include <list>
+#include <boost/function.hpp>
+#include <boost/noncopyable.hpp>
class LLSD;
@@ -94,13 +97,14 @@ private:
static std::vector<LLViewDrawContext*> sDrawContextStack;
};
-class LLViewWidgetRegistry : public LLChildRegistry<LLViewWidgetRegistry>
-{};
-
-class LLView : public LLMouseHandler, public LLMortician, public LLFocusableElement
+class LLView
+: public LLMouseHandler, // handles mouse events
+ public LLFocusableElement, // handles keyboard events
+ public LLMortician, // lazy deletion
+ public LLHandleProvider<LLView> // passes out weak references to self
{
public:
- struct Follows : public LLInitParam::Choice<Follows>
+ struct Follows : public LLInitParam::ChoiceBlock<Follows>
{
Alternative<std::string> string;
Alternative<U32> flags;
@@ -116,7 +120,8 @@ public:
visible,
mouse_opaque,
use_bounding_rect,
- from_xui;
+ from_xui,
+ focus_root;
Optional<S32> tab_group,
default_tab_group;
@@ -148,7 +153,8 @@ public:
Params();
};
- typedef LLViewWidgetRegistry child_registry_t;
+ // most widgets are valid children of LLView
+ typedef LLDefaultChildRegistry child_registry_t;
void initFromParams(const LLView::Params&);
@@ -238,7 +244,7 @@ public:
ECursorType getHoverCursor() { return mHoverCursor; }
- const std::string& getToolTip() const { return mToolTipMsg.getString(); }
+ virtual const std::string getToolTip() const { return mToolTipMsg.getString(); }
void sendChildToFront(LLView* child);
void sendChildToBack(LLView* child);
@@ -286,7 +292,7 @@ public:
void setAllChildrenEnabled(BOOL b);
virtual void setVisible(BOOL visible);
- BOOL getVisible() const { return mVisible; }
+ const BOOL& getVisible() const { return mVisible; }
virtual void setEnabled(BOOL enabled);
BOOL getEnabled() const { return mEnabled; }
/// 'available' in this context means 'visible and enabled': in other
@@ -304,8 +310,6 @@ public:
void popVisible() { setVisible(mLastVisible); }
BOOL getLastVisible() const { return mLastVisible; }
- LLHandle<LLView> getHandle() { mHandle.bind(this); return mHandle; }
-
U32 getFollows() const { return mReshapeFlags; }
BOOL followsLeft() const { return mReshapeFlags & FOLLOWS_LEFT; }
BOOL followsRight() const { return mReshapeFlags & FOLLOWS_RIGHT; }
@@ -366,8 +370,8 @@ public:
virtual void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
virtual void translate( S32 x, S32 y );
void setOrigin( S32 x, S32 y ) { mRect.translate( x - mRect.mLeft, y - mRect.mBottom ); }
- BOOL translateIntoRect( const LLRect& constraint, BOOL allow_partial_outside );
- BOOL translateIntoRectWithExclusion( const LLRect& inside, const LLRect& exclude, BOOL allow_partial_outside );
+ BOOL translateIntoRect( const LLRect& constraint, S32 min_overlap_pixels = S32_MAX);
+ BOOL translateIntoRectWithExclusion( const LLRect& inside, const LLRect& exclude, S32 min_overlap_pixels = S32_MAX);
void centerWithin(const LLRect& bounds);
void setShape(const LLRect& new_rect, bool by_user = false);
@@ -405,21 +409,16 @@ public:
BOOL blockMouseEvent(S32 x, S32 y) const;
// See LLMouseHandler virtuals for screenPointToLocal and localPointToScreen
- BOOL localPointToOtherView( S32 x, S32 y, S32 *other_x, S32 *other_y, LLView* other_view) const;
- BOOL localRectToOtherView( const LLRect& local, LLRect* other, LLView* other_view ) const;
+ BOOL localPointToOtherView( S32 x, S32 y, S32 *other_x, S32 *other_y, const LLView* other_view) const;
+ BOOL localRectToOtherView( const LLRect& local, LLRect* other, const LLView* other_view ) const;
void screenRectToLocal( const LLRect& screen, LLRect* local ) const;
void localRectToScreen( const LLRect& local, LLRect* screen ) const;
LLControlVariable *findControl(const std::string& name);
- // Moved setValue(), getValue(), setControlValue(), setControlName(),
- // controlListener() to LLUICtrl because an LLView is NOT assumed to
- // contain a value. If that's what you want, use LLUICtrl instead.
-// virtual bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata);
-
const child_list_t* getChildList() const { return &mChildList; }
- const child_list_const_iter_t beginChild() { return mChildList.begin(); }
- const child_list_const_iter_t endChild() { return mChildList.end(); }
+ child_list_const_iter_t beginChild() const { return mChildList.begin(); }
+ child_list_const_iter_t endChild() const { return mChildList.end(); }
// LLMouseHandler functions
// Default behavior is to pass events to children
@@ -434,18 +433,21 @@ public:
/*virtual*/ BOOL handleRightMouseUp(S32 x, S32 y, MASK mask);
/*virtual*/ BOOL handleToolTip(S32 x, S32 y, MASK mask);
- /*virtual*/ std::string getName() const;
+ /*virtual*/ const std::string& getName() const;
/*virtual*/ void onMouseCaptureLost();
/*virtual*/ BOOL hasMouseCapture();
/*virtual*/ void screenPointToLocal(S32 screen_x, S32 screen_y, S32* local_x, S32* local_y) const;
/*virtual*/ void localPointToScreen(S32 local_x, S32 local_y, S32* screen_x, S32* screen_y) const;
- virtual LLView* childFromPoint(S32 x, S32 y);
+ virtual LLView* childFromPoint(S32 x, S32 y, bool recur=false);
// view-specific handlers
virtual void onMouseEnter(S32 x, S32 y, MASK mask);
virtual void onMouseLeave(S32 x, S32 y, MASK mask);
+ std::string getPathname() const;
+ // static method handles NULL pointer too
+ static std::string getPathname(const LLView*);
template <class T> T* findChild(const std::string& name, BOOL recurse = TRUE) const
{
@@ -466,12 +468,22 @@ public:
template <class T> T* getDefaultWidget(const std::string& name) const
{
- default_widget_map_t::const_iterator found_it = getDefaultWidgetMap().find(name);
- if (found_it == getDefaultWidgetMap().end())
+ LLView* widgetp = getDefaultWidgetContainer().findChildView(name);
+ return dynamic_cast<T*>(widgetp);
+ }
+
+ template <class T> T* getParentByType() const
+ {
+ LLView* parent = getParent();
+ while(parent)
{
- return NULL;
+ if (dynamic_cast<T*>(parent))
+ {
+ return static_cast<T*>(parent);
+ }
+ parent = parent->getParent();
}
- return dynamic_cast<T*>(found_it->second);
+ return NULL;
}
//////////////////////////////////////////////
@@ -489,12 +501,11 @@ public:
// return query for iterating over focus roots in tab order
static const LLCtrlQuery & getFocusRootsQuery();
- static void deleteViewByHandle(LLHandle<LLView> handle);
static LLWindow* getWindow(void) { return LLUI::sWindow; }
// Set up params after XML load before calling new(),
// usually to adjust layout.
- static void applyXUILayout(Params& p, LLView* parent);
+ static void applyXUILayout(Params& p, LLView* parent, LLRect layout_rect = LLRect());
// For re-export of floaters and panels, convert the coordinate system
// to be top-left based.
@@ -518,11 +529,17 @@ public:
virtual S32 notify(const LLSD& info) { return 0;};
static const LLViewDrawContext& getDrawContext();
+
+ // Returns useful information about this ui widget.
+ LLSD getInfo(void);
protected:
void drawDebugRect();
void drawChild(LLView* childp, S32 x_offset = 0, S32 y_offset = 0, BOOL force_draw = FALSE);
void drawChildren();
+ bool visibleAndContains(S32 local_x, S32 local_Y);
+ bool visibleEnabledAndContains(S32 local_x, S32 local_y);
+ void logMouseEvent();
LLView* childrenHandleKey(KEY key, MASK mask);
LLView* childrenHandleUnicodeChar(llwchar uni_char);
@@ -545,17 +562,34 @@ protected:
LLView* childrenHandleToolTip(S32 x, S32 y, MASK mask);
ECursorType mHoverCursor;
-
+
+ virtual void addInfo(LLSD & info);
private:
+ template <typename METHOD, typename XDATA>
+ LLView* childrenHandleMouseEvent(const METHOD& method, S32 x, S32 y, XDATA extra, bool allow_mouse_block = true);
+
+ template <typename METHOD, typename CHARTYPE>
+ LLView* childrenHandleCharEvent(const std::string& desc, const METHOD& method,
+ CHARTYPE c, MASK mask);
+
+ // adapter to blur distinction between handleKey() and handleUnicodeChar()
+ // for childrenHandleCharEvent()
+ BOOL handleUnicodeCharWithDummyMask(llwchar uni_char, MASK /* dummy */, BOOL from_parent)
+ {
+ return handleUnicodeChar(uni_char, from_parent);
+ }
+
LLView* mParentView;
child_list_t mChildList;
- std::string mName;
// location in pixels, relative to surrounding structure, bottom,left=0,0
+ BOOL mVisible;
LLRect mRect;
LLRect mBoundingRect;
+
std::string mLayout;
+ std::string mName;
U32 mReshapeFlags;
@@ -574,22 +608,49 @@ private:
BOOL mIsFocusRoot;
BOOL mUseBoundingRect; // hit test against bounding rectangle that includes all child elements
- LLRootHandle<LLView> mHandle;
BOOL mLastVisible;
- BOOL mVisible;
-
S32 mNextInsertionOrdinal;
+ bool mInDraw;
+
static LLWindow* sWindow; // All root views must know about their window.
typedef std::map<std::string, LLView*> default_widget_map_t;
// allocate this map no demand, as it is rarely needed
- mutable default_widget_map_t* mDefaultWidgets;
+ mutable LLView* mDefaultWidgets;
- default_widget_map_t& getDefaultWidgetMap() const;
+ LLView& getDefaultWidgetContainer() const;
+
+ // This allows special mouse-event targeting logic for testing.
+ typedef boost::function<bool(const LLView*, S32 x, S32 y)> DrilldownFunc;
+ static DrilldownFunc sDrilldown;
public:
+ // This is the only public accessor to alter sDrilldown. This is not
+ // an accident. The intended usage pattern is like:
+ // {
+ // LLView::TemporaryDrilldownFunc scoped_func(myfunctor);
+ // // ... test with myfunctor ...
+ // } // exiting block restores original LLView::sDrilldown
+ class TemporaryDrilldownFunc: public boost::noncopyable
+ {
+ public:
+ TemporaryDrilldownFunc(const DrilldownFunc& func):
+ mOldDrilldown(sDrilldown)
+ {
+ sDrilldown = func;
+ }
+
+ ~TemporaryDrilldownFunc()
+ {
+ sDrilldown = mOldDrilldown;
+ }
+
+ private:
+ DrilldownFunc mOldDrilldown;
+ };
+
// Depth in view hierarchy during rendering
static S32 sDepth;
@@ -654,7 +715,7 @@ template <class T> T* LLView::getChild(const std::string& name, BOOL recurse) co
return NULL;
}
- getDefaultWidgetMap()[name] = result;
+ getDefaultWidgetContainer().addChild(result);
}
}
return result;
diff --git a/indra/llui/llviewborder.cpp b/indra/llui/llviewborder.cpp
index 89cd34c37c..919267dcc6 100644
--- a/indra/llui/llviewborder.cpp
+++ b/indra/llui/llviewborder.cpp
@@ -28,6 +28,7 @@
#include "llrender.h"
#include "llfocusmgr.h"
#include "lluictrlfactory.h"
+#include "lluiimage.h"
static LLDefaultChildRegistry::Register<LLViewBorder> r("view_border");
@@ -56,9 +57,6 @@ LLViewBorder::Params::Params()
{
addSynonym(border_thickness, "thickness");
addSynonym(render_style, "style");
- name = "view_border";
- mouse_opaque = false;
- follows.flags = FOLLOWS_ALL;
}
diff --git a/indra/llui/llviewinject.cpp b/indra/llui/llviewinject.cpp
new file mode 100644
index 0000000000..46c5839f8e
--- /dev/null
+++ b/indra/llui/llviewinject.cpp
@@ -0,0 +1,49 @@
+/**
+ * @file llviewinject.cpp
+ * @author Nat Goodspeed
+ * @date 2011-08-16
+ * @brief Implementation for llviewinject.
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Copyright (c) 2011, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+// Precompiled header
+#include "linden_common.h"
+// associated header
+#include "llviewinject.h"
+// STL headers
+// std headers
+// external library headers
+// other Linden headers
+
+llview::TargetEvent::TargetEvent(LLView* view)
+{
+ // Walk up the view tree from target LLView to the root (NULL). If
+ // passed NULL, iterate 0 times.
+ for (; view; view = view->getParent())
+ {
+ // At each level, operator() is going to ask: for a particular parent
+ // LLView*, which of its children should I select? So for this view's
+ // parent, select this view.
+ mChildMap[view->getParent()] = view;
+ }
+}
+
+bool llview::TargetEvent::operator()(const LLView* view, S32 /*x*/, S32 /*y*/) const
+{
+ // We are being called to decide whether to direct an incoming mouse event
+ // to this child view. (Normal LLView processing is to check whether the
+ // incoming (x, y) is within the view.) Look up the parent to decide
+ // whether, for that parent, this is the previously-selected child.
+ ChildMap::const_iterator found(mChildMap.find(view->getParent()));
+ // If we're looking at a child whose parent isn't even in the map, never
+ // mind.
+ if (found == mChildMap.end())
+ {
+ return false;
+ }
+ // So, is this the predestined child for this parent?
+ return (view == found->second);
+}
diff --git a/indra/llui/llviewinject.h b/indra/llui/llviewinject.h
new file mode 100644
index 0000000000..0de3d155c4
--- /dev/null
+++ b/indra/llui/llviewinject.h
@@ -0,0 +1,56 @@
+/**
+ * @file llviewinject.h
+ * @author Nat Goodspeed
+ * @date 2011-08-16
+ * @brief Supplemental LLView functionality used for simulating UI events.
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Copyright (c) 2011, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+#if ! defined(LL_LLVIEWINJECT_H)
+#define LL_LLVIEWINJECT_H
+
+#include "llview.h"
+#include <map>
+
+namespace llview
+{
+
+ /**
+ * TargetEvent is a callable with state, specifically intended for use as
+ * an LLView::TemporaryDrilldownFunc. Instantiate it with the desired
+ * target LLView*; pass it to a TemporaryDrilldownFunc instance;
+ * TargetEvent::operator() will then attempt to direct subsequent mouse
+ * events to the desired target LLView*. (This is an "attempt" because
+ * LLView will still balk unless the target LLView and every parent are
+ * visible and enabled.)
+ */
+ class TargetEvent
+ {
+ public:
+ /**
+ * Construct TargetEvent with the desired target LLView*. (See
+ * LLUI::resolvePath() to obtain an LLView* given a string pathname.)
+ * This sets up for operator().
+ */
+ TargetEvent(LLView* view);
+
+ /**
+ * This signature must match LLView::DrilldownFunc. When you install
+ * this TargetEvent instance using LLView::TemporaryDrilldownFunc,
+ * LLView will call this method to decide whether to propagate an
+ * incoming mouse event to the passed child LLView*.
+ */
+ bool operator()(const LLView*, S32 x, S32 y) const;
+
+ private:
+ // For a given parent LLView, identify which child to select.
+ typedef std::map<LLView*, LLView*> ChildMap;
+ ChildMap mChildMap;
+ };
+
+} // llview namespace
+
+#endif /* ! defined(LL_LLVIEWINJECT_H) */
diff --git a/indra/llui/llwindowshade.cpp b/indra/llui/llwindowshade.cpp
new file mode 100644
index 0000000000..f5c463c961
--- /dev/null
+++ b/indra/llui/llwindowshade.cpp
@@ -0,0 +1,392 @@
+/**
+ * @file LLWindowShade.cpp
+ * @brief Notification dialog that slides down and optionally disabled a piece of UI
+ *
+ * $LicenseInfo:firstyear=2006&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+#include "llwindowshade.h"
+
+#include "lllayoutstack.h"
+#include "lltextbox.h"
+#include "lliconctrl.h"
+#include "llbutton.h"
+#include "llcheckboxctrl.h"
+#include "lllineeditor.h"
+
+const S32 MIN_NOTIFICATION_AREA_HEIGHT = 30;
+const S32 MAX_NOTIFICATION_AREA_HEIGHT = 100;
+
+static LLDefaultChildRegistry::Register<LLWindowShade> r("window_shade");
+
+LLWindowShade::Params::Params()
+: bg_image("bg_image"),
+ modal("modal", false),
+ text_color("text_color"),
+ shade_color("shade_color"),
+ can_close("can_close", true)
+{
+ changeDefault(mouse_opaque, false);
+}
+
+LLWindowShade::LLWindowShade(const LLWindowShade::Params& params)
+: LLUICtrl(params),
+ mModal(params.modal),
+ mFormHeight(0),
+ mTextColor(params.text_color)
+{
+ setFocusRoot(true);
+}
+
+void LLWindowShade::initFromParams(const LLWindowShade::Params& params)
+{
+ LLUICtrl::initFromParams(params);
+
+ LLLayoutStack::Params layout_p;
+ layout_p.name = "notification_stack";
+ layout_p.rect = params.rect;
+ layout_p.follows.flags = FOLLOWS_ALL;
+ layout_p.mouse_opaque = false;
+ layout_p.orientation = LLLayoutStack::VERTICAL;
+ layout_p.border_size = 0;
+
+ LLLayoutStack* stackp = LLUICtrlFactory::create<LLLayoutStack>(layout_p);
+ addChild(stackp);
+
+ LLLayoutPanel::Params panel_p;
+ panel_p.rect = LLRect(0, MIN_NOTIFICATION_AREA_HEIGHT, 800, 0);
+ panel_p.name = "notification_area";
+ panel_p.visible = false;
+ panel_p.user_resize = false;
+ panel_p.background_visible = true;
+ panel_p.bg_alpha_image = params.bg_image;
+ panel_p.auto_resize = false;
+ LLLayoutPanel* notification_panel = LLUICtrlFactory::create<LLLayoutPanel>(panel_p);
+ stackp->addChild(notification_panel);
+
+ panel_p = LLUICtrlFactory::getDefaultParams<LLLayoutPanel>();
+ panel_p.auto_resize = true;
+ panel_p.user_resize = false;
+ panel_p.rect = params.rect;
+ panel_p.name = "background_area";
+ panel_p.mouse_opaque = false;
+ panel_p.background_visible = false;
+ panel_p.bg_alpha_color = params.shade_color;
+ LLLayoutPanel* dummy_panel = LLUICtrlFactory::create<LLLayoutPanel>(panel_p);
+ stackp->addChild(dummy_panel);
+
+ layout_p = LLUICtrlFactory::getDefaultParams<LLLayoutStack>();
+ layout_p.rect = LLRect(0, 30, 800, 0);
+ layout_p.follows.flags = FOLLOWS_ALL;
+ layout_p.orientation = LLLayoutStack::HORIZONTAL;
+ stackp = LLUICtrlFactory::create<LLLayoutStack>(layout_p);
+ notification_panel->addChild(stackp);
+
+ panel_p = LLUICtrlFactory::getDefaultParams<LLLayoutPanel>();
+ panel_p.rect.height = 30;
+ LLLayoutPanel* panel = LLUICtrlFactory::create<LLLayoutPanel>(panel_p);
+ stackp->addChild(panel);
+
+ LLIconCtrl::Params icon_p;
+ icon_p.name = "notification_icon";
+ icon_p.rect = LLRect(5, 25, 21, 10);
+ panel->addChild(LLUICtrlFactory::create<LLIconCtrl>(icon_p));
+
+ LLTextBox::Params text_p;
+ text_p.rect = LLRect(31, 23, panel->getRect().getWidth() - 5, 3);
+ text_p.follows.flags = FOLLOWS_ALL;
+ text_p.text_color = mTextColor;
+ text_p.font = LLFontGL::getFontSansSerifSmall();
+ text_p.font.style = "BOLD";
+ text_p.name = "notification_text";
+ text_p.use_ellipses = true;
+ text_p.wrap = true;
+ panel->addChild(LLUICtrlFactory::create<LLTextBox>(text_p));
+
+ panel_p = LLUICtrlFactory::getDefaultParams<LLLayoutPanel>();
+ panel_p.auto_resize = false;
+ panel_p.user_resize = false;
+ panel_p.name="form_elements";
+ panel_p.rect = LLRect(0, MIN_NOTIFICATION_AREA_HEIGHT, 130, 0);
+ LLLayoutPanel* form_elements_panel = LLUICtrlFactory::create<LLLayoutPanel>(panel_p);
+ stackp->addChild(form_elements_panel);
+
+ panel_p = LLUICtrlFactory::getDefaultParams<LLLayoutPanel>();
+ panel_p.auto_resize = false;
+ panel_p.user_resize = false;
+ panel_p.rect = LLRect(0, MIN_NOTIFICATION_AREA_HEIGHT, 25, 0);
+ panel_p.name = "close_panel";
+ LLLayoutPanel* close_panel = LLUICtrlFactory::create<LLLayoutPanel>(panel_p);
+ stackp->addChild(close_panel);
+
+ LLButton::Params button_p;
+ button_p.name = "close_notification";
+ button_p.rect = LLRect(5, 23, 21, 7);
+ button_p.image_color.control="DkGray_66";
+ button_p.image_unselected.name="Icon_Close_Foreground";
+ button_p.image_selected.name="Icon_Close_Press";
+ button_p.click_callback.function = boost::bind(&LLWindowShade::onCloseNotification, this);
+
+ close_panel->addChild(LLUICtrlFactory::create<LLButton>(button_p));
+
+ close_panel->setVisible(params.can_close);
+}
+
+void LLWindowShade::draw()
+{
+ LLRect message_rect = getChild<LLTextBox>("notification_text")->getTextBoundingRect();
+
+ LLLayoutPanel* notification_area = getChild<LLLayoutPanel>("notification_area");
+
+ notification_area->reshape(notification_area->getRect().getWidth(),
+ llclamp(message_rect.getHeight() + 15,
+ llmax(mFormHeight, MIN_NOTIFICATION_AREA_HEIGHT),
+ MAX_NOTIFICATION_AREA_HEIGHT));
+
+ LLUICtrl::draw();
+
+ while(!mNotifications.empty() && !mNotifications.back()->isActive())
+ {
+ mNotifications.pop_back();
+ // go ahead and hide
+ hide();
+ }
+
+ if (mNotifications.empty())
+ {
+ hide();
+ }
+ else if (notification_area->getVisibleAmount() < 0.01f)
+ {
+ displayLatestNotification();
+ }
+
+ if (!notification_area->getVisible() && (notification_area->getVisibleAmount() < 0.001f))
+ {
+ getChildRef<LLLayoutPanel>("background_area").setBackgroundVisible(false);
+ setMouseOpaque(false);
+ }
+}
+
+void LLWindowShade::hide()
+{
+ getChildRef<LLLayoutPanel>("notification_area").setVisible(false);
+}
+
+void LLWindowShade::onCloseNotification()
+{
+ if (!mNotifications.empty())
+ LLNotifications::instance().cancel(mNotifications.back());
+}
+
+void LLWindowShade::onClickIgnore(LLUICtrl* ctrl)
+{
+ LLNotificationPtr notify = getCurrentNotification();
+ if (!notify) return;
+
+ bool check = ctrl->getValue().asBoolean();
+ if (notify->getForm()->getIgnoreType() == LLNotificationForm::IGNORE_SHOW_AGAIN)
+ {
+ // question was "show again" so invert value to get "ignore"
+ check = !check;
+ }
+ notify->setIgnored(check);
+}
+
+void LLWindowShade::onClickNotificationButton(const std::string& name)
+{
+ LLNotificationPtr notify = getCurrentNotification();
+ if (!notify) return;
+
+ mNotificationResponse[name] = true;
+
+ notify->respond(mNotificationResponse);
+}
+
+void LLWindowShade::onEnterNotificationText(LLUICtrl* ctrl, const std::string& name)
+{
+ mNotificationResponse[name] = ctrl->getValue().asString();
+}
+
+void LLWindowShade::show(LLNotificationPtr notification)
+{
+ mNotifications.push_back(notification);
+
+ displayLatestNotification();
+}
+
+void LLWindowShade::displayLatestNotification()
+{
+ if (mNotifications.empty()) return;
+
+ LLNotificationPtr notification = mNotifications.back();
+
+ LLSD payload = notification->getPayload();
+
+ LLNotificationFormPtr formp = notification->getForm();
+ LLLayoutPanel& notification_area = getChildRef<LLLayoutPanel>("notification_area");
+ notification_area.getChild<LLUICtrl>("notification_icon")->setValue(notification->getIcon());
+ notification_area.getChild<LLUICtrl>("notification_text")->setValue(notification->getMessage());
+ notification_area.getChild<LLUICtrl>("notification_text")->setToolTip(notification->getMessage());
+
+ LLNotificationForm::EIgnoreType ignore_type = formp->getIgnoreType();
+ LLLayoutPanel& form_elements = notification_area.getChildRef<LLLayoutPanel>("form_elements");
+ form_elements.deleteAllChildren();
+ form_elements.reshape(form_elements.getRect().getWidth(), MIN_NOTIFICATION_AREA_HEIGHT);
+
+ const S32 FORM_PADDING_HORIZONTAL = 10;
+ const S32 FORM_PADDING_VERTICAL = 3;
+ const S32 WIDGET_HEIGHT = 24;
+ const S32 LINE_EDITOR_WIDTH = 120;
+ S32 cur_x = FORM_PADDING_HORIZONTAL;
+ S32 cur_y = FORM_PADDING_VERTICAL + WIDGET_HEIGHT;
+ S32 form_width = cur_x;
+
+ if (ignore_type != LLNotificationForm::IGNORE_NO)
+ {
+ LLCheckBoxCtrl::Params checkbox_p;
+ checkbox_p.name = "ignore_check";
+ checkbox_p.rect = LLRect(cur_x, cur_y, cur_x, cur_y - WIDGET_HEIGHT);
+ checkbox_p.label = formp->getIgnoreMessage();
+ checkbox_p.label_text.text_color = LLColor4::black;
+ checkbox_p.commit_callback.function = boost::bind(&LLWindowShade::onClickIgnore, this, _1);
+ checkbox_p.initial_value = formp->getIgnored();
+
+ LLCheckBoxCtrl* check = LLUICtrlFactory::create<LLCheckBoxCtrl>(checkbox_p);
+ check->setRect(check->getBoundingRect());
+ form_elements.addChild(check);
+ cur_x = check->getRect().mRight + FORM_PADDING_HORIZONTAL;
+ form_width = llmax(form_width, cur_x);
+ }
+
+ for (S32 i = 0; i < formp->getNumElements(); i++)
+ {
+ LLSD form_element = formp->getElement(i);
+ std::string type = form_element["type"].asString();
+ if (type == "button")
+ {
+ LLButton::Params button_p;
+ button_p.name = form_element["name"];
+ button_p.label = form_element["text"];
+ button_p.rect = LLRect(cur_x, cur_y, cur_x, cur_y - WIDGET_HEIGHT);
+ button_p.click_callback.function = boost::bind(&LLWindowShade::onClickNotificationButton, this, form_element["name"].asString());
+ button_p.auto_resize = true;
+
+ LLButton* button = LLUICtrlFactory::create<LLButton>(button_p);
+ button->autoResize();
+ form_elements.addChild(button);
+
+ if (form_element["default"].asBoolean())
+ {
+ form_elements.setDefaultBtn(button);
+ }
+
+ cur_x = button->getRect().mRight + FORM_PADDING_HORIZONTAL;
+ form_width = llmax(form_width, cur_x);
+ }
+ else if (type == "text" || type == "password")
+ {
+ // if not at beginning of line...
+ if (cur_x != FORM_PADDING_HORIZONTAL)
+ {
+ // start new line
+ cur_x = FORM_PADDING_HORIZONTAL;
+ cur_y -= WIDGET_HEIGHT + FORM_PADDING_VERTICAL;
+ }
+ LLTextBox::Params label_p;
+ label_p.name = form_element["name"].asString() + "_label";
+ label_p.rect = LLRect(cur_x, cur_y, cur_x + LINE_EDITOR_WIDTH, cur_y - WIDGET_HEIGHT);
+ label_p.initial_value = form_element["text"];
+ label_p.text_color = mTextColor;
+ label_p.font_valign = LLFontGL::VCENTER;
+ label_p.v_pad = 5;
+ LLTextBox* textbox = LLUICtrlFactory::create<LLTextBox>(label_p);
+ textbox->reshapeToFitText();
+ textbox->reshape(textbox->getRect().getWidth(), MIN_NOTIFICATION_AREA_HEIGHT - 2 * FORM_PADDING_VERTICAL);
+ form_elements.addChild(textbox);
+ cur_x = textbox->getRect().mRight + FORM_PADDING_HORIZONTAL;
+
+ LLLineEditor::Params line_p;
+ line_p.name = form_element["name"];
+ line_p.keystroke_callback = boost::bind(&LLWindowShade::onEnterNotificationText, this, _1, form_element["name"].asString());
+ line_p.is_password = type == "password";
+ line_p.rect = LLRect(cur_x, cur_y, cur_x + LINE_EDITOR_WIDTH, cur_y - WIDGET_HEIGHT);
+
+ LLLineEditor* line_editor = LLUICtrlFactory::create<LLLineEditor>(line_p);
+ form_elements.addChild(line_editor);
+ form_width = llmax(form_width, cur_x + LINE_EDITOR_WIDTH + FORM_PADDING_HORIZONTAL);
+
+ // reset to start of next line
+ cur_x = FORM_PADDING_HORIZONTAL;
+ cur_y -= WIDGET_HEIGHT + FORM_PADDING_VERTICAL;
+ }
+ }
+
+ mFormHeight = form_elements.getRect().getHeight() - (cur_y - WIDGET_HEIGHT - FORM_PADDING_VERTICAL);
+ form_elements.reshape(form_width, mFormHeight);
+ form_elements.setMinDim(form_width);
+
+ // move all form elements back onto form surface
+ S32 delta_y = WIDGET_HEIGHT + FORM_PADDING_VERTICAL - cur_y;
+ for (child_list_const_iter_t it = form_elements.getChildList()->begin(), end_it = form_elements.getChildList()->end();
+ it != end_it;
+ ++it)
+ {
+ (*it)->translate(0, delta_y);
+ }
+
+ getChildRef<LLLayoutPanel>("notification_area").setVisible(true);
+ getChildRef<LLLayoutPanel>("background_area").setBackgroundVisible(mModal);
+
+ setMouseOpaque(mModal);
+}
+
+void LLWindowShade::setBackgroundImage(LLUIImage* image)
+{
+ getChild<LLLayoutPanel>("notification_area")->setTransparentImage(image);
+}
+
+void LLWindowShade::setTextColor(LLColor4 color)
+{
+ getChild<LLTextBox>("notification_text")->setColor(color);
+}
+
+bool LLWindowShade::isShown() const
+{
+ return getChildRef<LLLayoutPanel>("notification_area").getVisible();
+}
+
+void LLWindowShade::setCanClose(bool can_close)
+{
+ getChildView("close_panel")->setVisible(can_close);
+}
+
+LLNotificationPtr LLWindowShade::getCurrentNotification()
+{
+ if (mNotifications.empty())
+ {
+ return LLNotificationPtr();
+ }
+ return mNotifications.back();
+}
+
diff --git a/indra/llui/llwindowshade.h b/indra/llui/llwindowshade.h
new file mode 100644
index 0000000000..6d753d1161
--- /dev/null
+++ b/indra/llui/llwindowshade.h
@@ -0,0 +1,78 @@
+/**
+ * @file llwindowshade.h
+ * @brief Notification dialog that slides down and optionally disabled a piece of UI
+ *
+ * $LicenseInfo:firstyear=2006&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLWINDOWSHADE_H
+#define LL_LLWINDOWSHADE_H
+
+#include "lluictrl.h"
+#include "llnotifications.h"
+#include "lluiimage.h"
+
+class LLWindowShade : public LLUICtrl
+{
+public:
+ struct Params : public LLInitParam::Block<Params, LLUICtrl::Params>
+ {
+ Optional<LLUIImage*> bg_image;
+ Optional<LLUIColor> text_color,
+ shade_color;
+ Optional<bool> modal,
+ can_close;
+
+ Params();
+ };
+
+ void show(LLNotificationPtr);
+ /*virtual*/ void draw();
+ void hide();
+
+ bool isShown() const;
+
+ void setBackgroundImage(LLUIImage* image);
+ void setTextColor(LLColor4 color);
+ void setCanClose(bool can_close);
+
+private:
+ void displayLatestNotification();
+ LLNotificationPtr getCurrentNotification();
+ friend class LLUICtrlFactory;
+
+ LLWindowShade(const Params& p);
+ void initFromParams(const Params& params);
+
+ void onCloseNotification();
+ void onClickNotificationButton(const std::string& name);
+ void onEnterNotificationText(LLUICtrl* ctrl, const std::string& name);
+ void onClickIgnore(LLUICtrl* ctrl);
+
+ std::vector<LLNotificationPtr> mNotifications;
+ LLSD mNotificationResponse;
+ bool mModal;
+ S32 mFormHeight;
+ LLUIColor mTextColor;
+};
+
+#endif // LL_LLWINDOWSHADE_H
diff --git a/indra/llui/tests/llurlentry_stub.cpp b/indra/llui/tests/llurlentry_stub.cpp
index f30704cb22..c75df86891 100644
--- a/indra/llui/tests/llurlentry_stub.cpp
+++ b/indra/llui/tests/llurlentry_stub.cpp
@@ -30,6 +30,7 @@
#include "llavatarnamecache.h"
#include "llcachename.h"
#include "lluuid.h"
+#include "message.h"
#include <string>
@@ -104,8 +105,6 @@ LLStyle::Params::Params()
namespace LLInitParam
{
- BaseBlock::BaseBlock() {}
- BaseBlock::~BaseBlock() {}
Param::Param(BaseBlock* enclosing_block)
: mIsProvided(false)
{
@@ -113,32 +112,29 @@ namespace LLInitParam
const U8* block_addr = reinterpret_cast<const U8*>(enclosing_block);
mEnclosingBlockOffset = (U16)(my_addr - block_addr);
}
- void BaseBlock::setLastChangedParam(const Param& last_param, bool user_provided) {}
- void BaseBlock::addParam(BlockDescriptor& block_data, const ParamDescriptor& in_param, const char* char_name){}
+ void BaseBlock::addParam(BlockDescriptor& block_data, const ParamDescriptorPtr in_param, const char* char_name){}
+ void BaseBlock::addSynonym(Param& param, const std::string& synonym) {}
param_handle_t BaseBlock::getHandleFromParam(const Param* param) const {return 0;}
void BaseBlock::init(BlockDescriptor& descriptor, BlockDescriptor& base_descriptor, size_t block_size)
{
descriptor.mCurrentBlockPtr = this;
}
- bool BaseBlock::deserializeBlock(Parser& p, Parser::name_stack_range_t name_stack){ return true; }
- bool BaseBlock::serializeBlock(Parser& parser, Parser::name_stack_t name_stack, const LLInitParam::BaseBlock* diff_block) const { return true; }
- bool BaseBlock::inspectBlock(Parser& parser, Parser::name_stack_t name_stack) const { return true; }
- bool BaseBlock::merge(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite) { return true; }
+ bool BaseBlock::deserializeBlock(Parser& p, Parser::name_stack_range_t name_stack, bool new_name){ return true; }
+ void BaseBlock::serializeBlock(Parser& parser, Parser::name_stack_t& name_stack, const LLInitParam::BaseBlock* diff_block) const {}
+ bool BaseBlock::inspectBlock(Parser& parser, Parser::name_stack_t name_stack, S32 min_value, S32 max_value) const { return true; }
+ bool BaseBlock::mergeBlock(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite) { return true; }
bool BaseBlock::validateBlock(bool emit_errors) const { return true; }
- TypedParam<LLUIColor >::TypedParam(BlockDescriptor& descriptor, const char* name, const LLUIColor& value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count)
- : super_t(descriptor, name, value, func, min_count, max_count)
+ ParamValue<LLUIColor, TypeValues<LLUIColor> >::ParamValue(const LLUIColor& color)
+ : super_t(color)
{}
- void TypedParam<LLUIColor>::setValueFromBlock() const
+ void ParamValue<LLUIColor, TypeValues<LLUIColor> >::updateValueFromBlock()
{}
- void TypedParam<LLUIColor>::setBlockFromValue()
- {}
-
- void TypeValues<LLUIColor>::declareValues()
+ void ParamValue<LLUIColor, TypeValues<LLUIColor> >::updateBlockFromValue(bool)
{}
bool ParamCompare<const LLFontGL*, false>::equals(const LLFontGL* a, const LLFontGL* b)
@@ -146,14 +142,14 @@ namespace LLInitParam
return false;
}
- TypedParam<const LLFontGL*>::TypedParam(BlockDescriptor& descriptor, const char* _name, const LLFontGL*const value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count)
- : super_t(descriptor, _name, value, func, min_count, max_count)
+ ParamValue<const LLFontGL*, TypeValues<const LLFontGL*> >::ParamValue(const LLFontGL* fontp)
+ : super_t(fontp)
{}
- void TypedParam<const LLFontGL*>::setValueFromBlock() const
+ void ParamValue<const LLFontGL*, TypeValues<const LLFontGL*> >::updateValueFromBlock()
{}
- void TypedParam<const LLFontGL*>::setBlockFromValue()
+ void ParamValue<const LLFontGL*, TypeValues<const LLFontGL*> >::updateBlockFromValue(bool)
{}
void TypeValues<LLFontGL::HAlign>::declareValues()
@@ -165,10 +161,10 @@ namespace LLInitParam
void TypeValues<LLFontGL::ShadowType>::declareValues()
{}
- void TypedParam<LLUIImage*>::setValueFromBlock() const
+ void ParamValue<LLUIImage*, TypeValues<LLUIImage*> >::updateValueFromBlock()
{}
- void TypedParam<LLUIImage*>::setBlockFromValue()
+ void ParamValue<LLUIImage*, TypeValues<LLUIImage*> >::updateBlockFromValue(bool)
{}
@@ -191,3 +187,20 @@ LLFontGL* LLFontGL::getFontDefault()
{
return NULL;
}
+
+char const* const _PREHASH_AgentData = (char *)"AgentData";
+char const* const _PREHASH_AgentID = (char *)"AgentID";
+
+LLHost LLHost::invalid(INVALID_PORT,INVALID_HOST_IP_ADDRESS);
+
+LLMessageSystem* gMessageSystem = NULL;
+
+//
+// Stub implementation for LLMessageSystem
+//
+void LLMessageSystem::newMessage(const char *name) { }
+void LLMessageSystem::nextBlockFast(const char *blockname) { }
+void LLMessageSystem::nextBlock(const char *blockname) { }
+void LLMessageSystem::addUUIDFast( const char *varname, const LLUUID& uuid) { }
+void LLMessageSystem::addUUID( const char *varname, const LLUUID& uuid) { }
+S32 LLMessageSystem::sendReliable(const LLHost &host) { return 0; }
diff --git a/indra/llui/tests/llurlentry_test.cpp b/indra/llui/tests/llurlentry_test.cpp
index 5c6623da61..c1fb050206 100644
--- a/indra/llui/tests/llurlentry_test.cpp
+++ b/indra/llui/tests/llurlentry_test.cpp
@@ -27,6 +27,7 @@
#include "linden_common.h"
#include "../llurlentry.h"
+#include "../lluictrl.h"
#include "llurlentry_stub.cpp"
#include "lltut.h"
#include "../lluicolortable.h"
@@ -34,6 +35,14 @@
#include <boost/regex.hpp>
+typedef std::map<std::string, LLControlGroup*> settings_map_t;
+settings_map_t LLUI::sSettingGroups;
+
+BOOL LLControlGroup::getBOOL(const std::string& name)
+{
+ return false;
+}
+
LLUIColor LLUIColorTable::getColor(const std::string& name, const LLColor4& default_color) const
{
return LLUIColor();
@@ -61,6 +70,21 @@ S32 LLUIImage::getHeight() const
return 0;
}
+namespace LLInitParam
+{
+ BlockDescriptor::BlockDescriptor() {}
+ ParamDescriptor::ParamDescriptor(param_handle_t p,
+ merge_func_t merge_func,
+ deserialize_func_t deserialize_func,
+ serialize_func_t serialize_func,
+ validation_func_t validation_func,
+ inspect_func_t inspect_func,
+ S32 min_count,
+ S32 max_count){}
+ ParamDescriptor::~ParamDescriptor() {}
+
+}
+
namespace tut
{
struct LLUrlEntryData
@@ -94,6 +118,45 @@ namespace tut
ensure_equals(testname, url, expected);
}
+ void dummyCallback(const std::string &url, const std::string &label, const std::string& icon)
+ {
+ }
+
+ void testLabel(const std::string &testname, LLUrlEntryBase &entry,
+ const char *text, const std::string &expected)
+ {
+ boost::regex regex = entry.getPattern();
+ std::string label = "";
+ boost::cmatch result;
+ bool found = boost::regex_search(text, result, regex);
+ if (found)
+ {
+ S32 start = static_cast<U32>(result[0].first - text);
+ S32 end = static_cast<U32>(result[0].second - text);
+ std::string url = std::string(text+start, end-start);
+ label = entry.getLabel(url, boost::bind(dummyCallback, _1, _2, _3));
+ }
+ ensure_equals(testname, label, expected);
+ }
+
+ void testLocation(const std::string &testname, LLUrlEntryBase &entry,
+ const char *text, const std::string &expected)
+ {
+ boost::regex regex = entry.getPattern();
+ std::string location = "";
+ boost::cmatch result;
+ bool found = boost::regex_search(text, result, regex);
+ if (found)
+ {
+ S32 start = static_cast<U32>(result[0].first - text);
+ S32 end = static_cast<U32>(result[0].second - text);
+ std::string url = std::string(text+start, end-start);
+ location = entry.getLocation(url);
+ }
+ ensure_equals(testname, location, expected);
+ }
+
+
template<> template<>
void object::test<1>()
{
@@ -688,4 +751,114 @@ namespace tut
"<nolink>My Object</nolink>",
"My Object");
}
+
+ template<> template<>
+ void object::test<13>()
+ {
+ //
+ // test LLUrlEntryRegion - secondlife:///app/region/<location> URLs
+ //
+ LLUrlEntryRegion url;
+
+ // Regex tests.
+ testRegex("no valid region", url,
+ "secondlife:///app/region/",
+ "");
+
+ testRegex("invalid coords", url,
+ "secondlife:///app/region/Korea2/a/b/c",
+ "secondlife:///app/region/Korea2/"); // don't count invalid coords
+
+ testRegex("Ahern (50,50,50) [1]", url,
+ "secondlife:///app/region/Ahern/50/50/50/",
+ "secondlife:///app/region/Ahern/50/50/50/");
+
+ testRegex("Ahern (50,50,50) [2]", url,
+ "XXX secondlife:///app/region/Ahern/50/50/50/ XXX",
+ "secondlife:///app/region/Ahern/50/50/50/");
+
+ testRegex("Ahern (50,50,50) [3]", url,
+ "XXX secondlife:///app/region/Ahern/50/50/50 XXX",
+ "secondlife:///app/region/Ahern/50/50/50");
+
+ testRegex("Ahern (50,50,50) multicase", url,
+ "XXX secondlife:///app/region/Ahern/50/50/50/ XXX",
+ "secondlife:///app/region/Ahern/50/50/50/");
+
+ testRegex("Ahern (50,50) [1]", url,
+ "XXX secondlife:///app/region/Ahern/50/50/ XXX",
+ "secondlife:///app/region/Ahern/50/50/");
+
+ testRegex("Ahern (50,50) [2]", url,
+ "XXX secondlife:///app/region/Ahern/50/50 XXX",
+ "secondlife:///app/region/Ahern/50/50");
+
+ // DEV-21577: In-world SLURLs containing "(" or ")" are not treated as a hyperlink in chat
+ testRegex("Region with brackets", url,
+ "XXX secondlife:///app/region/Burning%20Life%20(Hyper)/27/210/30 XXX",
+ "secondlife:///app/region/Burning%20Life%20(Hyper)/27/210/30");
+
+ // DEV-35459: SLURLs and teleport Links not parsed properly
+ testRegex("Region with quote", url,
+ "XXX secondlife:///app/region/A'ksha%20Oasis/41/166/701 XXX",
+ "secondlife:///app/region/A%27ksha%20Oasis/41/166/701");
+
+ // Rendering tests.
+ testLabel("Render /app/region/Ahern/50/50/50/", url,
+ "secondlife:///app/region/Ahern/50/50/50/",
+ "Ahern (50,50,50)");
+
+ testLabel("Render /app/region/Ahern/50/50/50", url,
+ "secondlife:///app/region/Ahern/50/50/50",
+ "Ahern (50,50,50)");
+
+ testLabel("Render /app/region/Ahern/50/50/", url,
+ "secondlife:///app/region/Ahern/50/50/",
+ "Ahern (50,50)");
+
+ testLabel("Render /app/region/Ahern/50/50", url,
+ "secondlife:///app/region/Ahern/50/50",
+ "Ahern (50,50)");
+
+ testLabel("Render /app/region/Ahern/50/", url,
+ "secondlife:///app/region/Ahern/50/",
+ "Ahern (50)");
+
+ testLabel("Render /app/region/Ahern/50", url,
+ "secondlife:///app/region/Ahern/50",
+ "Ahern (50)");
+
+ testLabel("Render /app/region/Ahern/", url,
+ "secondlife:///app/region/Ahern/",
+ "Ahern");
+
+ testLabel("Render /app/region/Ahern/ within context", url,
+ "XXX secondlife:///app/region/Ahern/ XXX",
+ "Ahern");
+
+ testLabel("Render /app/region/Ahern", url,
+ "secondlife:///app/region/Ahern",
+ "Ahern");
+
+ testLabel("Render /app/region/Ahern within context", url,
+ "XXX secondlife:///app/region/Ahern XXX",
+ "Ahern");
+
+ testLabel("Render /app/region/Product%20Engine/", url,
+ "secondlife:///app/region/Product%20Engine/",
+ "Product Engine");
+
+ testLabel("Render /app/region/Product%20Engine", url,
+ "secondlife:///app/region/Product%20Engine",
+ "Product Engine");
+
+ // Location parsing texts.
+ testLocation("Location /app/region/Ahern/50/50/50/", url,
+ "secondlife:///app/region/Ahern/50/50/50/",
+ "Ahern");
+
+ testLocation("Location /app/region/Product%20Engine", url,
+ "secondlife:///app/region/Product%20Engine",
+ "Product Engine");
+ }
}
diff --git a/indra/llui/tests/llurlmatch_test.cpp b/indra/llui/tests/llurlmatch_test.cpp
index fdaab00f18..7183413463 100644
--- a/indra/llui/tests/llurlmatch_test.cpp
+++ b/indra/llui/tests/llurlmatch_test.cpp
@@ -63,14 +63,21 @@ S32 LLUIImage::getHeight() const
namespace LLInitParam
{
- BaseBlock::BaseBlock() {}
- BaseBlock::~BaseBlock() {}
-
- void BaseBlock::setLastChangedParam(const Param& last_param, bool user_provided) {}
-
- void BaseBlock::addParam(BlockDescriptor& block_data, const ParamDescriptor& in_param, const char* char_name){}
+ BlockDescriptor::BlockDescriptor() {}
+ ParamDescriptor::ParamDescriptor(param_handle_t p,
+ merge_func_t merge_func,
+ deserialize_func_t deserialize_func,
+ serialize_func_t serialize_func,
+ validation_func_t validation_func,
+ inspect_func_t inspect_func,
+ S32 min_count,
+ S32 max_count){}
+ ParamDescriptor::~ParamDescriptor() {}
+
+ void BaseBlock::addParam(BlockDescriptor& block_data, const ParamDescriptorPtr in_param, const char* char_name){}
param_handle_t BaseBlock::getHandleFromParam(const Param* param) const {return 0;}
-
+ void BaseBlock::addSynonym(Param& param, const std::string& synonym) {}
+
void BaseBlock::init(BlockDescriptor& descriptor, BlockDescriptor& base_descriptor, size_t block_size)
{
descriptor.mCurrentBlockPtr = this;
@@ -81,26 +88,23 @@ namespace LLInitParam
{
const U8* my_addr = reinterpret_cast<const U8*>(this);
const U8* block_addr = reinterpret_cast<const U8*>(enclosing_block);
- mEnclosingBlockOffset = (U16)(my_addr - block_addr);
+ mEnclosingBlockOffset = 0x7FFFffff & ((U32)(my_addr - block_addr));
}
- bool BaseBlock::deserializeBlock(Parser& p, Parser::name_stack_range_t name_stack){ return true; }
- bool BaseBlock::serializeBlock(Parser& parser, Parser::name_stack_t name_stack, const LLInitParam::BaseBlock* diff_block) const { return true; }
- bool BaseBlock::inspectBlock(Parser& parser, Parser::name_stack_t name_stack) const { return true; }
- bool BaseBlock::merge(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite) { return true; }
+ bool BaseBlock::deserializeBlock(Parser& p, Parser::name_stack_range_t name_stack, bool new_name){ return true; }
+ void BaseBlock::serializeBlock(Parser& parser, Parser::name_stack_t& name_stack, const LLInitParam::BaseBlock* diff_block) const {}
+ bool BaseBlock::inspectBlock(Parser& parser, Parser::name_stack_t name_stack, S32 min_count, S32 max_count) const { return true; }
+ bool BaseBlock::mergeBlock(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite) { return true; }
bool BaseBlock::validateBlock(bool emit_errors) const { return true; }
- TypedParam<LLUIColor >::TypedParam(BlockDescriptor& descriptor, const char* name, const LLUIColor& value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count)
- : super_t(descriptor, name, value, func, min_count, max_count)
+ ParamValue<LLUIColor, TypeValues<LLUIColor> >::ParamValue(const LLUIColor& color)
+ : super_t(color)
{}
- void TypedParam<LLUIColor>::setValueFromBlock() const
+ void ParamValue<LLUIColor, TypeValues<LLUIColor> >::updateValueFromBlock()
{}
- void TypedParam<LLUIColor>::setBlockFromValue()
- {}
-
- void TypeValues<LLUIColor>::declareValues()
+ void ParamValue<LLUIColor, TypeValues<LLUIColor> >::updateBlockFromValue(bool)
{}
bool ParamCompare<const LLFontGL*, false>::equals(const LLFontGL* a, const LLFontGL* b)
@@ -108,14 +112,15 @@ namespace LLInitParam
return false;
}
- TypedParam<const LLFontGL*>::TypedParam(BlockDescriptor& descriptor, const char* _name, const LLFontGL*const value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count)
- : super_t(descriptor, _name, value, func, min_count, max_count)
+
+ ParamValue<const LLFontGL*, TypeValues<const LLFontGL*> >::ParamValue(const LLFontGL* fontp)
+ : super_t(fontp)
{}
- void TypedParam<const LLFontGL*>::setValueFromBlock() const
+ void ParamValue<const LLFontGL*, TypeValues<const LLFontGL*> >::updateValueFromBlock()
{}
- void TypedParam<const LLFontGL*>::setBlockFromValue()
+ void ParamValue<const LLFontGL*, TypeValues<const LLFontGL*> >::updateBlockFromValue(bool)
{}
void TypeValues<LLFontGL::HAlign>::declareValues()
@@ -127,10 +132,10 @@ namespace LLInitParam
void TypeValues<LLFontGL::ShadowType>::declareValues()
{}
- void TypedParam<LLUIImage*>::setValueFromBlock() const
+ void ParamValue<LLUIImage*, TypeValues<LLUIImage*> >::updateValueFromBlock()
{}
- void TypedParam<LLUIImage*>::setBlockFromValue()
+ void ParamValue<LLUIImage*, TypeValues<LLUIImage*> >::updateBlockFromValue(bool)
{}
bool ParamCompare<LLUIImage*, false>::equals(
diff --git a/indra/llvfs/CMakeLists.txt b/indra/llvfs/CMakeLists.txt
index 722f4e2bfd..a819d12861 100644
--- a/indra/llvfs/CMakeLists.txt
+++ b/indra/llvfs/CMakeLists.txt
@@ -12,6 +12,7 @@ include_directories(
set(llvfs_SOURCE_FILES
lldir.cpp
+ lldiriterator.cpp
lllfsthread.cpp
llpidlock.cpp
llvfile.cpp
@@ -24,6 +25,7 @@ set(llvfs_HEADER_FILES
lldir.h
lldirguard.h
+ lldiriterator.h
lllfsthread.h
llpidlock.h
llvfile.h
@@ -60,6 +62,15 @@ list(APPEND llvfs_SOURCE_FILES ${llvfs_HEADER_FILES})
add_library (llvfs ${llvfs_SOURCE_FILES})
+set(vfs_BOOST_LIBRARIES
+ ${BOOST_FILESYSTEM_LIBRARY}
+ ${BOOST_SYSTEM_LIBRARY}
+ )
+
+target_link_libraries(llvfs
+ ${vfs_BOOST_LIBRARIES}
+ )
+
if (DARWIN)
include(CMakeFindFrameworks)
find_library(CARBON_LIBRARY Carbon)
@@ -67,17 +78,23 @@ if (DARWIN)
endif (DARWIN)
-if(LL_TESTS)
- # Add tests
- include(LLAddBuildTest)
- # UNIT TESTS
- SET(llvfs_TEST_SOURCE_FILES
- # none so far
- )
- LL_ADD_PROJECT_UNIT_TESTS(llvfs "${llvfs_TEST_SOURCE_FILES}")
-
- # INTEGRATION TESTS
- set(test_libs llmath llcommon llvfs ${LLCOMMON_LIBRARIES} ${WINDOWS_LIBRARIES})
- # TODO: Some of these need refactoring to be proper Unit tests rather than Integration tests.
- LL_ADD_INTEGRATION_TEST(lldir "" "${test_libs}")
-endif(LL_TESTS)
+# Add tests
+if (LL_TESTS)
+ include(LLAddBuildTest)
+ # UNIT TESTS
+ SET(llvfs_TEST_SOURCE_FILES
+ lldiriterator.cpp
+ )
+
+ set_source_files_properties(lldiriterator.cpp
+ PROPERTIES
+ LL_TEST_ADDITIONAL_LIBRARIES "${vfs_BOOST_LIBRARIES}"
+ )
+ LL_ADD_PROJECT_UNIT_TESTS(llvfs "${llvfs_TEST_SOURCE_FILES}")
+
+ # INTEGRATION TESTS
+ set(test_libs llmath llcommon llvfs ${LLCOMMON_LIBRARIES} ${WINDOWS_LIBRARIES})
+
+ # TODO: Some of these need refactoring to be proper Unit tests rather than Integration tests.
+ LL_ADD_INTEGRATION_TEST(lldir "" "${test_libs}")
+endif (LL_TESTS)
diff --git a/indra/llvfs/lldir.cpp b/indra/llvfs/lldir.cpp
index 1179180da2..f3ac17d612 100644
--- a/indra/llvfs/lldir.cpp
+++ b/indra/llvfs/lldir.cpp
@@ -40,6 +40,8 @@
#include "lltimer.h" // ms_sleep()
#include "lluuid.h"
+#include "lldiriterator.h"
+
#if LL_WINDOWS
#include "lldir_win32.h"
LLDir_Win32 gDirUtil;
@@ -83,7 +85,9 @@ S32 LLDir::deleteFilesInDir(const std::string &dirname, const std::string &mask)
std::string filename;
std::string fullpath;
S32 result;
- while (getNextFileInDir(dirname, mask, filename))
+
+ LLDirIterator iter(dirname, mask);
+ while (iter.next(filename))
{
fullpath = dirname;
fullpath += getDirDelimiter();
@@ -101,10 +105,18 @@ S32 LLDir::deleteFilesInDir(const std::string &dirname, const std::string &mask)
{
if (0 != LLFile::remove(fullpath))
{
+ retry_count++;
result = errno;
llwarns << "Problem removing " << fullpath << " - errorcode: "
<< result << " attempt " << retry_count << llendl;
- ms_sleep(1000);
+
+ if(retry_count >= 5)
+ {
+ llwarns << "Failed to remove " << fullpath << llendl ;
+ return count ;
+ }
+
+ ms_sleep(100);
}
else
{
@@ -113,8 +125,7 @@ S32 LLDir::deleteFilesInDir(const std::string &dirname, const std::string &mask)
llwarns << "Successfully removed " << fullpath << llendl;
}
break;
- }
- retry_count++;
+ }
}
count++;
}
@@ -142,7 +153,11 @@ const std::string LLDir::findFile(const std::string& filename, const std::vector
{
if (!search_path_iter->empty())
{
- std::string filename_and_path = (*search_path_iter) + getDirDelimiter() + filename;
+ std::string filename_and_path = (*search_path_iter);
+ if (!filename.empty())
+ {
+ filename_and_path += getDirDelimiter() + filename;
+ }
if (fileExists(filename_and_path))
{
return filename_and_path;
@@ -382,11 +397,7 @@ std::string LLDir::getExpandedFilename(ELLPath location, const std::string& subd
break;
case LL_PATH_USER_SKIN:
- prefix = getOSUserAppDir();
- prefix += mDirDelimiter;
- prefix += "user_settings";
- prefix += mDirDelimiter;
- prefix += "skins";
+ prefix = getUserSkinDir();
break;
case LL_PATH_SKINS:
diff --git a/indra/llvfs/lldir.h b/indra/llvfs/lldir.h
index 42996fd051..5ee8bdb542 100644
--- a/indra/llvfs/lldir.h
+++ b/indra/llvfs/lldir.h
@@ -75,31 +75,6 @@ class LLDir
// pure virtual functions
virtual U32 countFilesInDir(const std::string &dirname, const std::string &mask) = 0;
- /// Walk the files in a directory, with file pattern matching
- virtual BOOL getNextFileInDir(const std::string& dirname, ///< directory path - must end in trailing slash!
- const std::string& mask, ///< file pattern string (use "*" for all)
- std::string& fname ///< output: found file name
- ) = 0;
- /**<
- * @returns true if a file was found, false if the entire directory has been scanned.
- *
- * @note that this function is NOT thread safe
- *
- * This function may not be used to scan part of a directory, then start a new search of a different
- * directory, and then restart the first search where it left off; the entire search must run to
- * completion or be abandoned - there is no restart.
- *
- * @bug: See http://jira.secondlife.com/browse/VWR-23697
- * and/or the tests in test/lldir_test.cpp
- * This is known to fail with patterns that have both:
- * a wildcard left of a . and more than one sequential ? right of a .
- * the pattern foo.??x appears to work
- * but *.??x or foo?.??x do not
- *
- * @todo this really should be rewritten as an iterator object, and the
- * filtering should be done in a platform-independent way.
- */
-
virtual std::string getCurPath() = 0;
virtual BOOL fileExists(const std::string &filename) const = 0;
diff --git a/indra/llvfs/lldir_linux.cpp b/indra/llvfs/lldir_linux.cpp
index 73f2336f94..407f3b93fb 100644
--- a/indra/llvfs/lldir_linux.cpp
+++ b/indra/llvfs/lldir_linux.cpp
@@ -93,11 +93,11 @@ LLDir_Linux::LLDir_Linux()
#else
mAppRODataDir = tmp_str;
#endif
- std::string::size_type indra_pos = mExecutableDir.find("/indra");
- if (indra_pos != std::string::npos)
+ std::string::size_type build_dir_pos = mExecutableDir.rfind("/build-linux-");
+ if (build_dir_pos != std::string::npos)
{
// ...we're in a dev checkout
- mSkinBaseDir = mExecutableDir.substr(0, indra_pos) + "/indra/newview/skins";
+ mSkinBaseDir = mExecutableDir.substr(0, build_dir_pos) + "/indra/newview/skins";
llinfos << "Running in dev checkout with mSkinBaseDir "
<< mSkinBaseDir << llendl;
}
@@ -242,68 +242,6 @@ U32 LLDir_Linux::countFilesInDir(const std::string &dirname, const std::string &
return (file_count);
}
-// get the next file in the directory
-BOOL LLDir_Linux::getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname)
-{
- glob_t g;
- BOOL result = FALSE;
- fname = "";
-
- if(!(dirname == mCurrentDir))
- {
- // different dir specified, close old search
- mCurrentDirIndex = -1;
- mCurrentDirCount = -1;
- mCurrentDir = dirname;
- }
-
- std::string tmp_str;
- tmp_str = dirname;
- tmp_str += mask;
-
- if(glob(tmp_str.c_str(), GLOB_NOSORT, NULL, &g) == 0)
- {
- if(g.gl_pathc > 0)
- {
- if((int)g.gl_pathc != mCurrentDirCount)
- {
- // Number of matches has changed since the last search, meaning a file has been added or deleted.
- // Reset the index.
- mCurrentDirIndex = -1;
- mCurrentDirCount = g.gl_pathc;
- }
-
- mCurrentDirIndex++;
-
- if(mCurrentDirIndex < (int)g.gl_pathc)
- {
-// llinfos << "getNextFileInDir: returning number " << mCurrentDirIndex << ", path is " << g.gl_pathv[mCurrentDirIndex] << llendl;
-
- // The API wants just the filename, not the full path.
- //fname = g.gl_pathv[mCurrentDirIndex];
-
- char *s = strrchr(g.gl_pathv[mCurrentDirIndex], '/');
-
- if(s == NULL)
- s = g.gl_pathv[mCurrentDirIndex];
- else if(s[0] == '/')
- s++;
-
- fname = s;
-
- result = TRUE;
- }
- }
-
- globfree(&g);
- }
-
- return(result);
-}
-
-
-
-
std::string LLDir_Linux::getCurPath()
{
char tmp_str[LL_MAX_PATH]; /* Flawfinder: ignore */
diff --git a/indra/llvfs/lldir_linux.h b/indra/llvfs/lldir_linux.h
index 451e81ae93..7603239867 100644
--- a/indra/llvfs/lldir_linux.h
+++ b/indra/llvfs/lldir_linux.h
@@ -1,6 +1,6 @@
/**
* @file lldir_linux.h
- * @brief Definition of directory utilities class for linux
+ * @brief Definition of directory utilities class for linux
*
* $LicenseInfo:firstyear=2000&license=viewerlgpl$
* Second Life Viewer Source Code
@@ -24,6 +24,10 @@
* $/LicenseInfo$
*/
+#if !LL_LINUX
+#error This header must not be included when compiling for any target other than Linux. Consider including lldir.h instead.
+#endif // !LL_LINUX
+
#ifndef LL_LLDIR_LINUX_H
#define LL_LLDIR_LINUX_H
@@ -40,10 +44,9 @@ public:
/*virtual*/ void initAppDirs(const std::string &app_name,
const std::string& app_read_only_data_dir);
-public:
+
virtual std::string getCurPath();
virtual U32 countFilesInDir(const std::string &dirname, const std::string &mask);
- virtual BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname);
/*virtual*/ BOOL fileExists(const std::string &filename) const;
/*virtual*/ std::string getLLPluginLauncher();
@@ -53,7 +56,7 @@ private:
DIR *mDirp;
int mCurrentDirIndex;
int mCurrentDirCount;
- std::string mCurrentDir;
+ std::string mCurrentDir;
};
#endif // LL_LLDIR_LINUX_H
diff --git a/indra/llvfs/lldir_mac.cpp b/indra/llvfs/lldir_mac.cpp
index 445285aa43..489bc3e4a7 100644
--- a/indra/llvfs/lldir_mac.cpp
+++ b/indra/llvfs/lldir_mac.cpp
@@ -150,11 +150,11 @@ LLDir_Mac::LLDir_Mac()
CFURLRef resourcesURLRef = CFBundleCopyResourcesDirectoryURL(mainBundleRef);
CFURLRefToLLString(resourcesURLRef, mAppRODataDir, true);
- U32 indra_pos = mExecutableDir.find("/indra");
- if (indra_pos != std::string::npos)
+ U32 build_dir_pos = mExecutableDir.rfind("/build-darwin-");
+ if (build_dir_pos != std::string::npos)
{
// ...we're in a dev checkout
- mSkinBaseDir = mExecutableDir.substr(0, indra_pos)
+ mSkinBaseDir = mExecutableDir.substr(0, build_dir_pos)
+ "/indra/newview/skins";
llinfos << "Running in dev checkout with mSkinBaseDir "
<< mSkinBaseDir << llendl;
@@ -258,99 +258,6 @@ U32 LLDir_Mac::countFilesInDir(const std::string &dirname, const std::string &ma
return (file_count);
}
-// get the next file in the directory
-BOOL LLDir_Mac::getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname)
-{
- glob_t g;
- BOOL result = FALSE;
- fname = "";
-
- if(!(dirname == mCurrentDir))
- {
- // different dir specified, close old search
- mCurrentDirIndex = -1;
- mCurrentDirCount = -1;
- mCurrentDir = dirname;
- }
-
- std::string tmp_str;
- tmp_str = dirname;
- tmp_str += mask;
-
- if(glob(tmp_str.c_str(), GLOB_NOSORT, NULL, &g) == 0)
- {
- if(g.gl_pathc > 0)
- {
- if(g.gl_pathc != mCurrentDirCount)
- {
- // Number of matches has changed since the last search, meaning a file has been added or deleted.
- // Reset the index.
- mCurrentDirIndex = -1;
- mCurrentDirCount = g.gl_pathc;
- }
-
- mCurrentDirIndex++;
-
- if(mCurrentDirIndex < g.gl_pathc)
- {
-// llinfos << "getNextFileInDir: returning number " << mCurrentDirIndex << ", path is " << g.gl_pathv[mCurrentDirIndex] << llendl;
-
- // The API wants just the filename, not the full path.
- //fname = g.gl_pathv[mCurrentDirIndex];
-
- char *s = strrchr(g.gl_pathv[mCurrentDirIndex], '/');
-
- if(s == NULL)
- s = g.gl_pathv[mCurrentDirIndex];
- else if(s[0] == '/')
- s++;
-
- fname = s;
-
- result = TRUE;
- }
- }
-
- globfree(&g);
- }
-
- return(result);
-}
-
-
-
-S32 LLDir_Mac::deleteFilesInDir(const std::string &dirname, const std::string &mask)
-{
- glob_t g;
- S32 result = 0;
-
- std::string tmp_str;
- tmp_str = dirname;
- tmp_str += mask;
-
- if(glob(tmp_str.c_str(), GLOB_NOSORT, NULL, &g) == 0)
- {
- int i;
-
- for(i = 0; i < g.gl_pathc; i++)
- {
-// llinfos << "deleteFilesInDir: deleting number " << i << ", path is " << g.gl_pathv[i] << llendl;
-
- if(unlink(g.gl_pathv[i]) != 0)
- {
- result = errno;
-
- llwarns << "Problem removing " << g.gl_pathv[i] << " - errorcode: "
- << result << llendl;
- }
- }
-
- globfree(&g);
- }
-
- return(result);
-}
-
std::string LLDir_Mac::getCurPath()
{
char tmp_str[LL_MAX_PATH]; /* Flawfinder: ignore */
diff --git a/indra/llvfs/lldir_mac.h b/indra/llvfs/lldir_mac.h
index 4eac3c3ae6..d190d70be4 100644
--- a/indra/llvfs/lldir_mac.h
+++ b/indra/llvfs/lldir_mac.h
@@ -24,6 +24,10 @@
* $/LicenseInfo$
*/
+#if !LL_DARWIN
+#error This header must not be included when compiling for any target other than Mac OS. Consider including lldir.h instead.
+#endif // !LL_DARWIN
+
#ifndef LL_LLDIR_MAC_H
#define LL_LLDIR_MAC_H
@@ -39,11 +43,9 @@ public:
/*virtual*/ void initAppDirs(const std::string &app_name,
const std::string& app_read_only_data_dir);
-public:
- virtual S32 deleteFilesInDir(const std::string &dirname, const std::string &mask);
+
virtual std::string getCurPath();
virtual U32 countFilesInDir(const std::string &dirname, const std::string &mask);
- virtual BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname);
virtual BOOL fileExists(const std::string &filename) const;
/*virtual*/ std::string getLLPluginLauncher();
diff --git a/indra/llvfs/lldir_solaris.cpp b/indra/llvfs/lldir_solaris.cpp
index 515fd66b6e..21f8c3acdb 100644
--- a/indra/llvfs/lldir_solaris.cpp
+++ b/indra/llvfs/lldir_solaris.cpp
@@ -260,68 +260,6 @@ U32 LLDir_Solaris::countFilesInDir(const std::string &dirname, const std::string
return (file_count);
}
-// get the next file in the directory
-BOOL LLDir_Solaris::getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname)
-{
- glob_t g;
- BOOL result = FALSE;
- fname = "";
-
- if(!(dirname == mCurrentDir))
- {
- // different dir specified, close old search
- mCurrentDirIndex = -1;
- mCurrentDirCount = -1;
- mCurrentDir = dirname;
- }
-
- std::string tmp_str;
- tmp_str = dirname;
- tmp_str += mask;
-
- if(glob(tmp_str.c_str(), GLOB_NOSORT, NULL, &g) == 0)
- {
- if(g.gl_pathc > 0)
- {
- if((int)g.gl_pathc != mCurrentDirCount)
- {
- // Number of matches has changed since the last search, meaning a file has been added or deleted.
- // Reset the index.
- mCurrentDirIndex = -1;
- mCurrentDirCount = g.gl_pathc;
- }
-
- mCurrentDirIndex++;
-
- if(mCurrentDirIndex < (int)g.gl_pathc)
- {
-// llinfos << "getNextFileInDir: returning number " << mCurrentDirIndex << ", path is " << g.gl_pathv[mCurrentDirIndex] << llendl;
-
- // The API wants just the filename, not the full path.
- //fname = g.gl_pathv[mCurrentDirIndex];
-
- char *s = strrchr(g.gl_pathv[mCurrentDirIndex], '/');
-
- if(s == NULL)
- s = g.gl_pathv[mCurrentDirIndex];
- else if(s[0] == '/')
- s++;
-
- fname = s;
-
- result = TRUE;
- }
- }
-
- globfree(&g);
- }
-
- return(result);
-}
-
-
-
-
std::string LLDir_Solaris::getCurPath()
{
char tmp_str[LL_MAX_PATH]; /* Flawfinder: ignore */
diff --git a/indra/llvfs/lldir_solaris.h b/indra/llvfs/lldir_solaris.h
index 4a1794f539..0b58a45b15 100644
--- a/indra/llvfs/lldir_solaris.h
+++ b/indra/llvfs/lldir_solaris.h
@@ -24,6 +24,10 @@
* $/LicenseInfo$
*/
+#if !LL_SOLARIS
+#error This header must not be included when compiling for any target other than Solaris. Consider including lldir.h instead.
+#endif // !LL_SOLARIS
+
#ifndef LL_LLDIR_SOLARIS_H
#define LL_LLDIR_SOLARIS_H
@@ -40,17 +44,16 @@ public:
/*virtual*/ void initAppDirs(const std::string &app_name,
const std::string& app_read_only_data_dir);
-public:
+
virtual std::string getCurPath();
virtual U32 countFilesInDir(const std::string &dirname, const std::string &mask);
- virtual BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname);
/*virtual*/ BOOL fileExists(const std::string &filename) const;
private:
DIR *mDirp;
int mCurrentDirIndex;
int mCurrentDirCount;
- std::string mCurrentDir;
+ std::string mCurrentDir;
};
#endif // LL_LLDIR_SOLARIS_H
diff --git a/indra/llvfs/lldir_win32.cpp b/indra/llvfs/lldir_win32.cpp
index 4a8526cc96..7709945123 100644
--- a/indra/llvfs/lldir_win32.cpp
+++ b/indra/llvfs/lldir_win32.cpp
@@ -81,10 +81,11 @@ LLDir_Win32::LLDir_Win32()
// fprintf(stderr, "mTempDir = <%s>",mTempDir);
-#if 1
- // Don't use the real app path for now, as we'll have to add parsing to detect if
- // we're in a developer tree, which has a different structure from the installed product.
+ // Set working directory, for LLDir::getWorkingDir()
+ GetCurrentDirectory(MAX_PATH, w_str);
+ mWorkingDir = utf16str_to_utf8str(llutf16string(w_str));
+ // Set the executable directory
S32 size = GetModuleFileName(NULL, w_str, MAX_PATH);
if (size)
{
@@ -100,32 +101,35 @@ LLDir_Win32::LLDir_Win32()
{
mExecutableFilename = mExecutablePathAndName;
}
- GetCurrentDirectory(MAX_PATH, w_str);
- mWorkingDir = utf16str_to_utf8str(llutf16string(w_str));
}
else
{
fprintf(stderr, "Couldn't get APP path, assuming current directory!");
- GetCurrentDirectory(MAX_PATH, w_str);
- mExecutableDir = utf16str_to_utf8str(llutf16string(w_str));
+ mExecutableDir = mWorkingDir;
// Assume it's the current directory
}
-#else
- GetCurrentDirectory(MAX_PATH, w_str);
- mExecutableDir = utf16str_to_utf8str(llutf16string(w_str));
-#endif
- if (mExecutableDir.find("indra") == std::string::npos)
+ // mAppRODataDir = ".";
+
+ // Determine the location of the App-Read-Only-Data
+ // Try the working directory then the exe's dir.
+ mAppRODataDir = mWorkingDir;
+
+
+// if (mExecutableDir.find("indra") == std::string::npos)
+
+ // *NOTE:Mani - It is a mistake to put viewer specific code in
+ // the LLDir implementation. The references to 'skins' and
+ // 'llplugin' need to go somewhere else.
+ // alas... this also gets called during static initialization
+ // time due to the construction of gDirUtil in lldir.cpp.
+ if(! LLFile::isdir(mAppRODataDir + mDirDelimiter + "skins"))
{
- // Running from installed directory. Make sure current
- // directory isn't something crazy (e.g. if invoking from
- // command line).
- SetCurrentDirectory(utf8str_to_utf16str(mExecutableDir).c_str());
- GetCurrentDirectory(MAX_PATH, w_str);
- mWorkingDir = utf16str_to_utf8str(llutf16string(w_str));
+ // What? No skins in the working dir?
+ // Try the executable's directory.
+ mAppRODataDir = mExecutableDir;
}
- mAppRODataDir = mWorkingDir;
llinfos << "mAppRODataDir = " << mAppRODataDir << llendl;
@@ -206,14 +210,6 @@ void LLDir_Win32::initAppDirs(const std::string &app_name,
}
}
- res = LLFile::mkdir(getExpandedFilename(LL_PATH_USER_SKIN,""));
- if (res == -1)
- {
- if (errno != EEXIST)
- {
- llwarns << "Couldn't create LL_PATH_SKINS dir " << getExpandedFilename(LL_PATH_USER_SKIN,"") << llendl;
- }
- }
mCAFile = getExpandedFilename(LL_PATH_APP_SETTINGS, "CA.pem");
}
@@ -244,67 +240,6 @@ U32 LLDir_Win32::countFilesInDir(const std::string &dirname, const std::string &
return (file_count);
}
-
-// get the next file in the directory
-BOOL LLDir_Win32::getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname)
-{
- BOOL fileFound = FALSE;
- fname = "";
-
- WIN32_FIND_DATAW FileData;
- llutf16string pathname = utf8str_to_utf16str(dirname) + utf8str_to_utf16str(mask);
-
- if (pathname != mCurrentDir)
- {
- // different dir specified, close old search
- if (mCurrentDir[0])
- {
- FindClose(mDirSearch_h);
- }
- mCurrentDir = pathname;
-
- // and open new one
- // Check error opening Directory structure
- if ((mDirSearch_h = FindFirstFile(pathname.c_str(), &FileData)) != INVALID_HANDLE_VALUE)
- {
- fileFound = TRUE;
- }
- }
-
- // Loop to skip over the current (.) and parent (..) directory entries
- // (apparently returned in Win7 but not XP)
- do
- {
- if ( fileFound
- && ( (lstrcmp(FileData.cFileName, (LPCTSTR)TEXT(".")) == 0)
- ||(lstrcmp(FileData.cFileName, (LPCTSTR)TEXT("..")) == 0)
- )
- )
- {
- fileFound = FALSE;
- }
- } while ( mDirSearch_h != INVALID_HANDLE_VALUE
- && !fileFound
- && (fileFound = FindNextFile(mDirSearch_h, &FileData)
- )
- );
-
- if (!fileFound && GetLastError() == ERROR_NO_MORE_FILES)
- {
- // No more files, so reset to beginning of directory
- FindClose(mDirSearch_h);
- mCurrentDir[0] = '\000';
- }
-
- if (fileFound)
- {
- // convert from TCHAR to char
- fname = utf16str_to_utf8str(FileData.cFileName);
- }
-
- return fileFound;
-}
-
std::string LLDir_Win32::getCurPath()
{
WCHAR w_str[MAX_PATH];
diff --git a/indra/llvfs/lldir_win32.h b/indra/llvfs/lldir_win32.h
index 4c932c932c..62fb4713ab 100644
--- a/indra/llvfs/lldir_win32.h
+++ b/indra/llvfs/lldir_win32.h
@@ -24,6 +24,10 @@
* $/LicenseInfo$
*/
+#if !LL_WINDOWS
+#error This header must not be included when compiling for any target other than Windows. Consider including lldir.h instead.
+#endif // !LL_WINDOWS
+
#ifndef LL_LLDIR_WIN32_H
#define LL_LLDIR_WIN32_H
@@ -40,15 +44,12 @@ public:
/*virtual*/ std::string getCurPath();
/*virtual*/ U32 countFilesInDir(const std::string &dirname, const std::string &mask);
- /*virtual*/ BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname);
/*virtual*/ BOOL fileExists(const std::string &filename) const;
/*virtual*/ std::string getLLPluginLauncher();
/*virtual*/ std::string getLLPluginFilename(std::string base_name);
private:
- BOOL LLDir_Win32::getNextFileInDir(const llutf16string &dirname, const std::string &mask, std::string &fname);
-
void* mDirSearch_h;
llutf16string mCurrentDir;
};
diff --git a/indra/llvfs/lldiriterator.cpp b/indra/llvfs/lldiriterator.cpp
new file mode 100644
index 0000000000..ff92cbb7fd
--- /dev/null
+++ b/indra/llvfs/lldiriterator.cpp
@@ -0,0 +1,228 @@
+/**
+ * @file lldiriterator.cpp
+ * @brief Iterator through directory entries matching the search pattern.
+ *
+ * $LicenseInfo:firstyear=2010&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "lldiriterator.h"
+
+#include <boost/filesystem.hpp>
+#include <boost/regex.hpp>
+
+namespace fs = boost::filesystem;
+
+static std::string glob_to_regex(const std::string& glob);
+
+class LLDirIterator::Impl
+{
+public:
+ Impl(const std::string &dirname, const std::string &mask);
+ ~Impl();
+
+ bool next(std::string &fname);
+
+private:
+ boost::regex mFilterExp;
+ fs::directory_iterator mIter;
+ bool mIsValid;
+};
+
+LLDirIterator::Impl::Impl(const std::string &dirname, const std::string &mask)
+ : mIsValid(false)
+{
+ fs::path dir_path(dirname);
+
+ bool is_dir = false;
+
+ // Check if path is a directory.
+ try
+ {
+ is_dir = fs::is_directory(dir_path);
+ }
+ catch (fs::basic_filesystem_error<fs::path>& e)
+ {
+ llwarns << e.what() << llendl;
+ return;
+ }
+
+ if (!is_dir)
+ {
+ llwarns << "Invalid path: \"" << dir_path.string() << "\"" << llendl;
+ return;
+ }
+
+ // Initialize the directory iterator for the given path.
+ try
+ {
+ mIter = fs::directory_iterator(dir_path);
+ }
+ catch (fs::basic_filesystem_error<fs::path>& e)
+ {
+ llwarns << e.what() << llendl;
+ return;
+ }
+
+ // Convert the glob mask to a regular expression
+ std::string exp = glob_to_regex(mask);
+
+ // Initialize boost::regex with the expression converted from
+ // the glob mask.
+ // An exception is thrown if the expression is not valid.
+ try
+ {
+ mFilterExp.assign(exp);
+ }
+ catch (boost::regex_error& e)
+ {
+ llwarns << "\"" << exp << "\" is not a valid regular expression: "
+ << e.what() << llendl;
+ return;
+ }
+
+ mIsValid = true;
+}
+
+LLDirIterator::Impl::~Impl()
+{
+}
+
+bool LLDirIterator::Impl::next(std::string &fname)
+{
+ fname = "";
+
+ if (!mIsValid)
+ {
+ llwarns << "The iterator is not correctly initialized." << llendl;
+ return false;
+ }
+
+ fs::directory_iterator end_itr; // default construction yields past-the-end
+ bool found = false;
+ while (mIter != end_itr && !found)
+ {
+ boost::smatch match;
+ std::string name = mIter->path().filename();
+ if (found = boost::regex_match(name, match, mFilterExp))
+ {
+ fname = name;
+ }
+
+ ++mIter;
+ }
+
+ return found;
+}
+
+/**
+Converts the incoming glob into a regex. This involves
+converting incoming glob expressions to regex equivilents and
+at the same time, escaping any regex meaningful characters which
+do not have glob meaning, i.e.
+ .()+|^$
+in the input.
+*/
+std::string glob_to_regex(const std::string& glob)
+{
+ std::string regex;
+ regex.reserve(glob.size()<<1);
+ S32 braces = 0;
+ bool escaped = false;
+ bool square_brace_open = false;
+
+ for (std::string::const_iterator i = glob.begin(); i != glob.end(); ++i)
+ {
+ char c = *i;
+
+ switch (c)
+ {
+ case '*':
+ if (glob.begin() == i)
+ {
+ regex+="[^.].*";
+ }
+ else
+ {
+ regex+= escaped ? "*" : ".*";
+ }
+ break;
+ case '?':
+ regex+= escaped ? '?' : '.';
+ break;
+ case '{':
+ braces++;
+ regex+='(';
+ break;
+ case '}':
+ if (!braces)
+ {
+ llerrs << "glob_to_regex: Closing brace without an equivalent opening brace: " << glob << llendl;
+ }
+
+ regex+=')';
+ braces--;
+ break;
+ case ',':
+ regex+= braces ? '|' : c;
+ break;
+ case '!':
+ regex+= square_brace_open ? '^' : c;
+ break;
+ case '.': // This collection have different regex meaning
+ case '^': // and so need escaping.
+ case '(':
+ case ')':
+ case '+':
+ case '|':
+ case '$':
+ regex += '\\';
+ default:
+ regex += c;
+ break;
+ }
+
+ escaped = ('\\' == c);
+ square_brace_open = ('[' == c);
+ }
+
+ if (braces)
+ {
+ llerrs << "glob_to_regex: Unterminated brace expression: " << glob << llendl;
+ }
+
+ return regex;
+}
+
+LLDirIterator::LLDirIterator(const std::string &dirname, const std::string &mask)
+{
+ mImpl = new Impl(dirname, mask);
+}
+
+LLDirIterator::~LLDirIterator()
+{
+ delete mImpl;
+}
+
+bool LLDirIterator::next(std::string &fname)
+{
+ return mImpl->next(fname);
+}
diff --git a/indra/llvfs/lldiriterator.h b/indra/llvfs/lldiriterator.h
new file mode 100644
index 0000000000..0b48be41b3
--- /dev/null
+++ b/indra/llvfs/lldiriterator.h
@@ -0,0 +1,87 @@
+/**
+ * @file lldiriterator.h
+ * @brief Iterator through directory entries matching the search pattern.
+ *
+ * $LicenseInfo:firstyear=2010&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLDIRITERATOR_H
+#define LL_LLDIRITERATOR_H
+
+#include "linden_common.h"
+
+/**
+ * Class LLDirIterator
+ *
+ * Iterates through directory entries matching the search pattern.
+ */
+class LLDirIterator
+{
+public:
+ /**
+ * Constructs LLDirIterator object to search for glob pattern
+ * matches in a directory.
+ *
+ * @param dirname - name of a directory to search in.
+ * @param mask - search pattern, a glob expression
+ *
+ * Wildcards supported in glob expressions:
+ * --------------------------------------------------------------
+ * | Wildcard | Matches |
+ * --------------------------------------------------------------
+ * | * |zero or more characters |
+ * | ? |exactly one character |
+ * | [abcde] |exactly one character listed |
+ * | [a-e] |exactly one character in the given range |
+ * | [!abcde] |any character that is not listed |
+ * | [!a-e] |any character that is not in the given range |
+ * | {abc,xyz} |exactly one entire word in the options given |
+ * --------------------------------------------------------------
+ */
+ LLDirIterator(const std::string &dirname, const std::string &mask);
+
+ ~LLDirIterator();
+
+ /**
+ * Searches for the next directory entry matching the glob mask
+ * specified upon iterator construction.
+ * Returns true if a match is found, sets fname
+ * parameter to the name of the matched directory entry and
+ * increments the iterator position.
+ *
+ * Typical usage:
+ * <code>
+ * LLDirIterator iter(directory, pattern);
+ * if ( iter.next(scanResult) )
+ * </code>
+ *
+ * @param fname - name of the matched directory entry.
+ * @return true if a match is found, false otherwise.
+ */
+ bool next(std::string &fname);
+
+protected:
+ class Impl;
+ Impl* mImpl;
+};
+
+#endif //LL_LLDIRITERATOR_H
diff --git a/indra/llvfs/lllfsthread.cpp b/indra/llvfs/lllfsthread.cpp
index 3d3ed9f6d4..073b1af2a1 100644
--- a/indra/llvfs/lllfsthread.cpp
+++ b/indra/llvfs/lllfsthread.cpp
@@ -45,7 +45,7 @@ void LLLFSThread::initClass(bool local_is_threaded)
//static
S32 LLLFSThread::updateClass(U32 ms_elapsed)
{
- sLocal->update(ms_elapsed);
+ sLocal->update((F32)ms_elapsed);
return sLocal->getPending();
}
diff --git a/indra/llvfs/llvfile.cpp b/indra/llvfs/llvfile.cpp
index a8db7b235e..ca749c5eaf 100644
--- a/indra/llvfs/llvfile.cpp
+++ b/indra/llvfs/llvfile.cpp
@@ -314,7 +314,7 @@ BOOL LLVFile::setMaxSize(S32 size)
if (!mVFS->checkAvailable(size))
{
- LLFastTimer t(FTM_VFILE_WAIT);
+ //LLFastTimer t(FTM_VFILE_WAIT);
S32 count = 0;
while (sVFSThread->getPending() > 1000)
{
@@ -422,7 +422,7 @@ bool LLVFile::isLocked(EVFSLock lock)
void LLVFile::waitForLock(EVFSLock lock)
{
- LLFastTimer t(FTM_VFILE_WAIT);
+ //LLFastTimer t(FTM_VFILE_WAIT);
// spin until the lock clears
while (isLocked(lock))
{
diff --git a/indra/llvfs/llvfs.cpp b/indra/llvfs/llvfs.cpp
index c1fe21c57d..82c926620a 100644
--- a/indra/llvfs/llvfs.cpp
+++ b/indra/llvfs/llvfs.cpp
@@ -26,6 +26,8 @@
#include "linden_common.h"
+#include "llvfs.h"
+
#include <sys/stat.h>
#include <set>
#include <map>
@@ -39,8 +41,6 @@
#include <sys/file.h>
#endif
-#include "llvfs.h"
-
#include "llstl.h"
#include "lltimer.h"
@@ -1711,7 +1711,8 @@ void LLVFS::audit()
BOOL vfs_corrupt = FALSE;
- std::vector<U8> buffer(index_size);
+ // since we take the address of element 0, we need to have at least one element.
+ std::vector<U8> buffer(llmax<size_t>(index_size,1U));
if (fread(&buffer[0], 1, index_size, mIndexFP) != index_size)
{
@@ -2035,6 +2036,9 @@ std::string get_extension(LLAssetType::EType type)
case LLAssetType::AT_ANIMATION:
extension = ".lla";
break;
+ case LLAssetType::AT_MESH:
+ extension = ".slm";
+ break;
default:
// Just use the asset server filename extension in most cases
extension += ".";
diff --git a/indra/llvfs/llvfsthread.cpp b/indra/llvfs/llvfsthread.cpp
index 254f8b55ba..a57e2b15ab 100644
--- a/indra/llvfs/llvfsthread.cpp
+++ b/indra/llvfs/llvfsthread.cpp
@@ -46,7 +46,7 @@ void LLVFSThread::initClass(bool local_is_threaded)
//static
S32 LLVFSThread::updateClass(U32 ms_elapsed)
{
- sLocal->update(ms_elapsed);
+ sLocal->update((F32)ms_elapsed);
return sLocal->getPending();
}
diff --git a/indra/llvfs/tests/lldir_test.cpp b/indra/llvfs/tests/lldir_test.cpp
index 8788bd63e8..ea321c5ae9 100644
--- a/indra/llvfs/tests/lldir_test.cpp
+++ b/indra/llvfs/tests/lldir_test.cpp
@@ -28,6 +28,7 @@
#include "linden_common.h"
#include "../lldir.h"
+#include "../lldiriterator.h"
#include "../test/lltut.h"
@@ -259,13 +260,12 @@ namespace tut
std::string makeTestFile( const std::string& dir, const std::string& file )
{
- std::string delim = gDirUtilp->getDirDelimiter();
- std::string path = dir + delim + file;
+ std::string path = dir + file;
LLFILE* handle = LLFile::fopen( path, "w" );
ensure("failed to open test file '"+path+"'", handle != NULL );
// Harbison & Steele, 4th ed., p. 366: "If an error occurs, fputs
// returns EOF; otherwise, it returns some other, nonnegative value."
- ensure("failed to write to test file '"+path+"'", fputs("test file", handle) >= 0);
+ ensure("failed to write to test file '"+path+"'", EOF != fputs("test file", handle) );
fclose(handle);
return path;
}
@@ -290,7 +290,7 @@ namespace tut
}
static const char* DirScanFilename[5] = { "file1.abc", "file2.abc", "file1.xyz", "file2.xyz", "file1.mno" };
-
+
void scanTest(const std::string& directory, const std::string& pattern, bool correctResult[5])
{
@@ -300,7 +300,8 @@ namespace tut
bool filesFound[5] = { false, false, false, false, false };
//std::cerr << "searching '"+directory+"' for '"+pattern+"'\n";
- while ( found <= 5 && gDirUtilp->getNextFileInDir(directory, pattern, scanResult) )
+ LLDirIterator iter(directory, pattern);
+ while ( found <= 5 && iter.next(scanResult) )
{
found++;
//std::cerr << " found '"+scanResult+"'\n";
@@ -334,15 +335,15 @@ namespace tut
template<> template<>
void LLDirTest_object_t::test<5>()
- // getNextFileInDir
+ // LLDirIterator::next
{
std::string delim = gDirUtilp->getDirDelimiter();
std::string dirTemp = LLFile::tmpdir();
// Create the same 5 file names of the two directories
- std::string dir1 = makeTestDir(dirTemp + "getNextFileInDir");
- std::string dir2 = makeTestDir(dirTemp + "getNextFileInDir");
+ std::string dir1 = makeTestDir(dirTemp + "LLDirIterator");
+ std::string dir2 = makeTestDir(dirTemp + "LLDirIterator");
std::string dir1files[5];
std::string dir2files[5];
for (int i=0; i<5; i++)
@@ -380,19 +381,17 @@ namespace tut
scanTest(dir2, "file?.x?z", expected7);
// Scan dir2 and see if any file?.??c files are found
- // THESE FAIL ON Mac and Windows, SO ARE COMMENTED OUT FOR NOW
- // bool expected8[5] = { true, true, false, false, false };
- // scanTest(dir2, "file?.??c", expected8);
- // scanTest(dir2, "*.??c", expected8);
+ bool expected8[5] = { true, true, false, false, false };
+ scanTest(dir2, "file?.??c", expected8);
+ scanTest(dir2, "*.??c", expected8);
// Scan dir1 and see if any *.?n? files are found
bool expected9[5] = { false, false, false, false, true };
scanTest(dir1, "*.?n?", expected9);
// Scan dir1 and see if any *.???? files are found
- // THIS ONE FAILS ON WINDOWS (returns three charater suffixes) SO IS COMMENTED OUT FOR NOW
- // bool expected10[5] = { false, false, false, false, false };
- // scanTest(dir1, "*.????", expected10);
+ bool expected10[5] = { false, false, false, false, false };
+ scanTest(dir1, "*.????", expected10);
// Scan dir1 and see if any ?????.* files are found
bool expected11[5] = { true, true, true, true, true };
@@ -402,6 +401,15 @@ namespace tut
bool expected12[5] = { false, false, true, true, false };
scanTest(dir1, "??l??.xyz", expected12);
+ bool expected13[5] = { true, false, true, false, false };
+ scanTest(dir1, "file1.{abc,xyz}", expected13);
+
+ bool expected14[5] = { true, true, false, false, false };
+ scanTest(dir1, "file[0-9].abc", expected14);
+
+ bool expected15[5] = { true, true, false, false, false };
+ scanTest(dir1, "file[!a-z].abc", expected15);
+
// clean up all test files and directories
for (int i=0; i<5; i++)
{
diff --git a/indra/llvfs/tests/lldiriterator_test.cpp b/indra/llvfs/tests/lldiriterator_test.cpp
new file mode 100644
index 0000000000..505d86faa7
--- /dev/null
+++ b/indra/llvfs/tests/lldiriterator_test.cpp
@@ -0,0 +1,65 @@
+/**
+ * @file lldiriterator_test.cpp
+ * @date 2011-06
+ * @brief LLDirIterator test cases.
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.,
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+#include "lltut.h"
+#include "../lldiriterator.h"
+
+
+namespace tut
+{
+
+ struct LLDirIteratorFixture
+ {
+ LLDirIteratorFixture()
+ {
+ }
+ };
+ typedef test_group<LLDirIteratorFixture> LLDirIteratorTest_factory;
+ typedef LLDirIteratorTest_factory::object LLDirIteratorTest_t;
+ LLDirIteratorTest_factory tf("LLDirIterator");
+
+ /*
+ CHOP-662 was originally introduced to deal with crashes deleting files from
+ a directory (VWR-25500). However, this introduced a crash looking for
+ old chat logs as the glob_to_regex function in lldiriterator wasn't escaping lots of regexp characters
+ */
+ void test_chop_662(void)
+ {
+ // Check a selection of bad group names from the crash reports
+ LLDirIterator iter(".","+bad-group-name]+??-??.*");
+ LLDirIterator iter1(".","))--@---bad-group-name2((??-??.*\\.txt");
+ LLDirIterator iter2(".","__^v--x)Cuide d sua vida(x--v^__??-??.*");
+ }
+
+ template<> template<>
+ void LLDirIteratorTest_t::test<1>()
+ {
+ test_chop_662();
+ }
+
+}
diff --git a/indra/llwindow/CMakeLists.txt b/indra/llwindow/CMakeLists.txt
index bf3233f386..341bddfffd 100644
--- a/indra/llwindow/CMakeLists.txt
+++ b/indra/llwindow/CMakeLists.txt
@@ -30,10 +30,12 @@ include_directories(
${LLVFS_INCLUDE_DIRS}
${LLWINDOW_INCLUDE_DIRS}
${LLXML_INCLUDE_DIRS}
+ ${DIRECTX_INCLUDE_DIR}
)
set(llwindow_SOURCE_FILES
llkeyboard.cpp
+ llkeyboardheadless.cpp
llwindowheadless.cpp
llwindowcallbacks.cpp
)
@@ -42,6 +44,7 @@ set(llwindow_HEADER_FILES
CMakeLists.txt
llkeyboard.h
+ llkeyboardheadless.h
llwindowheadless.h
llwindowcallbacks.h
)
@@ -59,12 +62,13 @@ set(viewer_HEADER_FILES
# Libraries on which this library depends, needed for Linux builds
# Sort by high-level to low-level
-if (NOT LINUX OR VIEWER)
+if (LINUX AND VIEWER)
set(llwindow_LINK_LIBRARIES
${UI_LIBRARIES} # for GTK
${SDL_LIBRARY}
+ fontconfig # For FCInit and other FC* functions.
)
-endif (NOT LINUX OR VIEWER)
+endif (LINUX AND VIEWER)
if (DARWIN)
list(APPEND llwindow_SOURCE_FILES
diff --git a/indra/llwindow/GL/glh_extensions.h b/indra/llwindow/GL/glh_extensions.h
index b936b5d307..d89d85930b 100644
--- a/indra/llwindow/GL/glh_extensions.h
+++ b/indra/llwindow/GL/glh_extensions.h
@@ -1,5 +1,7 @@
/*
* glh_extensions.h
+ * $LicenseInfo:firstyear=2006&license=mit$ (mit used here to satisfy validity checker)
+ * Copyright (C) 2006, NVIDIA
* From nVidia Corporation, downloaded 2006-12-18 from:
* http://developer.nvidia.com/attach/8196
* ("NVParse Library with Source (.zip) (2390 KB)")
@@ -8,6 +10,8 @@
* "The files bison.exe, bison.simple, and flex.exe are covered by
* the GPL. All other files in this distribution can be used however
* you want."
+ * $/LicenseInfo$
+
*/
#ifndef GLH_EXTENSIONS
diff --git a/indra/llwindow/GL/glh_genext.h b/indra/llwindow/GL/glh_genext.h
index 8d42025198..cd5d1604a8 100644
--- a/indra/llwindow/GL/glh_genext.h
+++ b/indra/llwindow/GL/glh_genext.h
@@ -1,5 +1,7 @@
/*
* glh_genext.h
+ * $LicenseInfo:firstyear=2008&license=mit$ (mit used here to satisfy validity checker)
+ * Copyright (C) 2008, NVIDIA
* From nVidia Corporation, downloaded 2006-12-18 from:
* http://developer.nvidia.com/attach/8196
* ("NVParse Library with Source (.zip) (2390 KB)")
@@ -8,6 +10,7 @@
* "The files bison.exe, bison.simple, and flex.exe are covered by
* the GPL. All other files in this distribution can be used however
* you want."
+ * $/LicenseInfo$
*/
/* File generated by extgen.cpp -- do not modify */
diff --git a/indra/llwindow/lldragdropwin32.cpp b/indra/llwindow/lldragdropwin32.cpp
index d4d444eb28..15acddd987 100644
--- a/indra/llwindow/lldragdropwin32.cpp
+++ b/indra/llwindow/lldragdropwin32.cpp
@@ -124,10 +124,9 @@ class LLDragDropWin32Target:
ScreenToClient( mAppWindowHandle, &pt2 );
LLCoordWindow cursor_coord_window( pt2.x, pt2.y );
- window_imp->convertCoords(cursor_coord_window, &gl_coord);
MASK mask = gKeyboard->currentMask(TRUE);
- LLWindowCallbacks::DragNDropResult result = window_imp->completeDragNDropRequest( gl_coord, mask,
+ LLWindowCallbacks::DragNDropResult result = window_imp->completeDragNDropRequest( cursor_coord_window.convert(), mask,
LLWindowCallbacks::DNDA_START_TRACKING, mDropUrl );
switch (result)
@@ -180,10 +179,9 @@ class LLDragDropWin32Target:
ScreenToClient( mAppWindowHandle, &pt2 );
LLCoordWindow cursor_coord_window( pt2.x, pt2.y );
- window_imp->convertCoords(cursor_coord_window, &gl_coord);
MASK mask = gKeyboard->currentMask(TRUE);
- LLWindowCallbacks::DragNDropResult result = window_imp->completeDragNDropRequest( gl_coord, mask,
+ LLWindowCallbacks::DragNDropResult result = window_imp->completeDragNDropRequest( cursor_coord_window.convert(), mask,
LLWindowCallbacks::DNDA_TRACK, mDropUrl );
switch (result)
@@ -237,15 +235,13 @@ class LLDragDropWin32Target:
LLWindowWin32 *window_imp = (LLWindowWin32 *)GetWindowLong( mAppWindowHandle, GWL_USERDATA );
if ( NULL != window_imp )
{
- LLCoordGL gl_coord( 0, 0 );
-
POINT pt_client;
pt_client.x = pt.x;
pt_client.y = pt.y;
ScreenToClient( mAppWindowHandle, &pt_client );
LLCoordWindow cursor_coord_window( pt_client.x, pt_client.y );
- window_imp->convertCoords(cursor_coord_window, &gl_coord);
+ LLCoordGL gl_coord(cursor_coord_window.convert());
llinfos << "### (Drop) URL is: " << mDropUrl << llendl;
llinfos << "### raw coords are: " << pt.x << " x " << pt.y << llendl;
llinfos << "### client coords are: " << pt_client.x << " x " << pt_client.y << llendl;
diff --git a/indra/llwindow/llkeyboard.h b/indra/llwindow/llkeyboard.h
index be16f31abc..ba472cfde5 100644
--- a/indra/llwindow/llkeyboard.h
+++ b/indra/llwindow/llkeyboard.h
@@ -40,7 +40,7 @@ enum EKeystate
KEYSTATE_UP
};
-typedef void (*LLKeyFunc)(EKeystate keystate);
+typedef boost::function<void(EKeystate keystate)> LLKeyFunc;
typedef std::string (LLKeyStringTranslatorFunc)(const char *label);
enum EKeyboardInsertMode
diff --git a/indra/llwindow/llkeyboardheadless.cpp b/indra/llwindow/llkeyboardheadless.cpp
new file mode 100644
index 0000000000..c87617c9ff
--- /dev/null
+++ b/indra/llwindow/llkeyboardheadless.cpp
@@ -0,0 +1,73 @@
+/**
+ * @file llkeyboardheadless.cpp
+ * @brief Handler for assignable key bindings
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+#include "llkeyboardheadless.h"
+#include "llwindowcallbacks.h"
+
+LLKeyboardHeadless::LLKeyboardHeadless()
+{ }
+
+void LLKeyboardHeadless::resetMaskKeys()
+{ }
+
+
+BOOL LLKeyboardHeadless::handleKeyDown(const U16 key, const U32 mask)
+{ return FALSE; }
+
+
+BOOL LLKeyboardHeadless::handleKeyUp(const U16 key, const U32 mask)
+{ return FALSE; }
+
+MASK LLKeyboardHeadless::currentMask(BOOL for_mouse_event)
+{ return MASK_NONE; }
+
+void LLKeyboardHeadless::scanKeyboard()
+{
+ for (S32 key = 0; key < KEY_COUNT; key++)
+ {
+ // Generate callback if any event has occurred on this key this frame.
+ // Can't just test mKeyLevel, because this could be a slow frame and
+ // key might have gone down then up. JC
+ if (mKeyLevel[key] || mKeyDown[key] || mKeyUp[key])
+ {
+ mCurScanKey = key;
+ mCallbacks->handleScanKey(key, mKeyDown[key], mKeyUp[key], mKeyLevel[key]);
+ }
+ }
+
+ // Reset edges for next frame
+ for (S32 key = 0; key < KEY_COUNT; key++)
+ {
+ mKeyUp[key] = FALSE;
+ mKeyDown[key] = FALSE;
+ if (mKeyLevel[key])
+ {
+ mKeyLevelFrameCount[key]++;
+ }
+ }
+}
+
diff --git a/indra/llwindow/llkeyboardheadless.h b/indra/llwindow/llkeyboardheadless.h
new file mode 100644
index 0000000000..4e666f8ce8
--- /dev/null
+++ b/indra/llwindow/llkeyboardheadless.h
@@ -0,0 +1,45 @@
+/**
+ * @file llkeyboardheadless.h
+ * @brief Handler for assignable key bindings
+ *
+ * $LicenseInfo:firstyear=2004&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLKEYBOARDHEADLESS_H
+#define LL_LLKEYBOARDHEADLESS_H
+
+#include "llkeyboard.h"
+
+class LLKeyboardHeadless : public LLKeyboard
+{
+public:
+ LLKeyboardHeadless();
+ /*virtual*/ ~LLKeyboardHeadless() {};
+
+ /*virtual*/ BOOL handleKeyUp(const U16 key, MASK mask);
+ /*virtual*/ BOOL handleKeyDown(const U16 key, MASK mask);
+ /*virtual*/ void resetMaskKeys();
+ /*virtual*/ MASK currentMask(BOOL for_mouse_event);
+ /*virtual*/ void scanKeyboard();
+};
+
+#endif
diff --git a/indra/llwindow/llmousehandler.h b/indra/llwindow/llmousehandler.h
index bbbc3d4406..d825a3424c 100644
--- a/indra/llwindow/llmousehandler.h
+++ b/indra/llwindow/llmousehandler.h
@@ -65,7 +65,7 @@ public:
virtual BOOL handleHover(S32 x, S32 y, MASK mask) = 0;
virtual BOOL handleScrollWheel(S32 x, S32 y, S32 clicks) = 0;
virtual BOOL handleToolTip(S32 x, S32 y, MASK mask) = 0;
- virtual std::string getName() const = 0;
+ virtual const std::string& getName() const = 0;
virtual void onMouseCaptureLost() = 0;
diff --git a/indra/llwindow/llwindow.cpp b/indra/llwindow/llwindow.cpp
index 072f694c24..5b7424acbb 100644
--- a/indra/llwindow/llwindow.cpp
+++ b/indra/llwindow/llwindow.cpp
@@ -108,17 +108,22 @@ LLWindow::LLWindow(LLWindowCallbacks* callbacks, BOOL fullscreen, U32 flags)
mSupportedResolutions(NULL),
mNumSupportedResolutions(0),
mCurrentCursor(UI_CURSOR_ARROW),
+ mNextCursor(UI_CURSOR_ARROW),
mCursorHidden(FALSE),
mBusyCount(0),
mIsMouseClipping(FALSE),
+ mMinWindowWidth(0),
+ mMinWindowHeight(0),
mSwapMethod(SWAP_METHOD_UNDEFINED),
mHideCursorPermanent(FALSE),
mFlags(flags),
mHighSurrogate(0)
-{ }
+{
+}
LLWindow::~LLWindow()
-{ }
+{
+}
//virtual
BOOL LLWindow::isValid()
@@ -177,6 +182,51 @@ void *LLWindow::getMediaWindow()
return getPlatformWindow();
}
+BOOL LLWindow::setSize(LLCoordScreen size)
+{
+ if (!getMaximized())
+ {
+ size.mX = llmax(size.mX, mMinWindowWidth);
+ size.mY = llmax(size.mY, mMinWindowHeight);
+ }
+ return setSizeImpl(size);
+}
+
+BOOL LLWindow::setSize(LLCoordWindow size)
+{
+ //HACK: we are inconsistently using minimum window dimensions
+ // in this case, we are constraining the inner "client" rect and other times
+ // we constrain the outer "window" rect
+ // There doesn't seem to be a good way to do this consistently without a bunch of platform
+ // specific code
+ if (!getMaximized())
+ {
+ size.mX = llmax(size.mX, mMinWindowWidth);
+ size.mY = llmax(size.mY, mMinWindowHeight);
+ }
+ return setSizeImpl(size);
+}
+
+
+// virtual
+void LLWindow::setMinSize(U32 min_width, U32 min_height, bool enforce_immediately)
+{
+ mMinWindowWidth = min_width;
+ mMinWindowHeight = min_height;
+
+ if (enforce_immediately)
+ {
+ LLCoordScreen cur_size;
+ if (!getMaximized() && getSize(&cur_size))
+ {
+ if (cur_size.mX < mMinWindowWidth || cur_size.mY < mMinWindowHeight)
+ {
+ setSizeImpl(LLCoordScreen(llmin(cur_size.mX, mMinWindowWidth), llmin(cur_size.mY, mMinWindowHeight)));
+ }
+ }
+ }
+}
+
//virtual
void LLWindow::processMiscNativeEvents()
{
@@ -401,3 +451,42 @@ BOOL LLWindowManager::isWindowValid(LLWindow *window)
{
return sWindowList.find(window) != sWindowList.end();
}
+
+//coordinate conversion utility funcs that forward to llwindow
+LLCoordCommon LL_COORD_TYPE_WINDOW::convertToCommon() const
+{
+ const LLCoordWindow& self = LLCoordWindow::getTypedCoords(*this);
+
+ LLWindow* windowp = &(*LLWindow::beginInstances());
+ LLCoordGL out;
+ windowp->convertCoords(self, &out);
+ return out.convert();
+}
+
+void LL_COORD_TYPE_WINDOW::convertFromCommon(const LLCoordCommon& from)
+{
+ LLCoordWindow& self = LLCoordWindow::getTypedCoords(*this);
+
+ LLWindow* windowp = &(*LLWindow::beginInstances());
+ LLCoordGL from_gl(from);
+ windowp->convertCoords(from_gl, &self);
+}
+
+LLCoordCommon LL_COORD_TYPE_SCREEN::convertToCommon() const
+{
+ const LLCoordScreen& self = LLCoordScreen::getTypedCoords(*this);
+
+ LLWindow* windowp = &(*LLWindow::beginInstances());
+ LLCoordGL out;
+ windowp->convertCoords(self, &out);
+ return out.convert();
+}
+
+void LL_COORD_TYPE_SCREEN::convertFromCommon(const LLCoordCommon& from)
+{
+ LLCoordScreen& self = LLCoordScreen::getTypedCoords(*this);
+
+ LLWindow* windowp = &(*LLWindow::beginInstances());
+ LLCoordGL from_gl(from);
+ windowp->convertCoords(from_gl, &self);
+}
diff --git a/indra/llwindow/llwindow.h b/indra/llwindow/llwindow.h
index e8a86a1880..4da87f4e06 100644
--- a/indra/llwindow/llwindow.h
+++ b/indra/llwindow/llwindow.h
@@ -39,7 +39,7 @@ class LLWindowCallbacks;
// Refer to llwindow_test in test/common/llwindow for usage example
-class LLWindow
+class LLWindow : public LLInstanceTracker<LLWindow>
{
public:
struct LLWindowResolution
@@ -72,7 +72,9 @@ public:
virtual BOOL getSize(LLCoordScreen *size) = 0;
virtual BOOL getSize(LLCoordWindow *size) = 0;
virtual BOOL setPosition(LLCoordScreen position) = 0;
- virtual BOOL setSize(LLCoordScreen size) = 0;
+ BOOL setSize(LLCoordScreen size);
+ BOOL setSize(LLCoordWindow size);
+ virtual void setMinSize(U32 min_width, U32 min_height, bool enforce_immediately = true);
virtual BOOL switchContext(BOOL fullscreen, const LLCoordScreen &size, BOOL disable_vsync, const LLCoordScreen * const posp = NULL) = 0;
virtual BOOL setCursorPosition(LLCoordWindow position) = 0;
virtual BOOL getCursorPosition(LLCoordWindow *position) = 0;
@@ -91,8 +93,9 @@ public:
virtual S32 getBusyCount() const;
// Sets cursor, may set to arrow+hourglass
- virtual void setCursor(ECursorType cursor) = 0;
+ virtual void setCursor(ECursorType cursor) { mNextCursor = cursor; };
virtual ECursorType getCursor() const;
+ virtual void updateCursor() = 0;
virtual void captureMouse() = 0;
virtual void releaseMouse() = 0;
@@ -169,6 +172,9 @@ protected:
// Defaults to true
virtual BOOL canDelete();
+ virtual BOOL setSizeImpl(LLCoordScreen size) = 0;
+ virtual BOOL setSizeImpl(LLCoordWindow size) = 0;
+
protected:
LLWindowCallbacks* mCallbacks;
@@ -181,6 +187,7 @@ protected:
LLWindowResolution* mSupportedResolutions;
S32 mNumSupportedResolutions;
ECursorType mCurrentCursor;
+ ECursorType mNextCursor;
BOOL mCursorHidden;
S32 mBusyCount; // how deep is the "cursor busy" stack?
BOOL mIsMouseClipping; // Is this window currently clipping the mouse
@@ -188,6 +195,8 @@ protected:
BOOL mHideCursorPermanent;
U32 mFlags;
U16 mHighSurrogate;
+ S32 mMinWindowWidth;
+ S32 mMinWindowHeight;
// Handle a UTF-16 encoding unit received from keyboard.
// Converting the series of UTF-16 encoding units to UTF-32 data,
diff --git a/indra/llwindow/llwindowcallbacks.cpp b/indra/llwindow/llwindowcallbacks.cpp
index c2705bbf74..9712ae1d91 100644
--- a/indra/llwindow/llwindowcallbacks.cpp
+++ b/indra/llwindow/llwindowcallbacks.cpp
@@ -28,8 +28,6 @@
#include "llwindowcallbacks.h"
-#include "llcoord.h"
-
//
// LLWindowCallbacks
//
diff --git a/indra/llwindow/llwindowcallbacks.h b/indra/llwindow/llwindowcallbacks.h
index 8572b442f1..7da5959700 100644
--- a/indra/llwindow/llwindowcallbacks.h
+++ b/indra/llwindow/llwindowcallbacks.h
@@ -26,7 +26,7 @@
#ifndef LLWINDOWCALLBACKS_H
#define LLWINDOWCALLBACKS_H
-class LLCoordGL;
+#include "llcoord.h"
class LLWindow;
class LLWindowCallbacks
diff --git a/indra/llwindow/llwindowheadless.cpp b/indra/llwindow/llwindowheadless.cpp
index 35398f1c09..e6e6bc67ff 100644
--- a/indra/llwindow/llwindowheadless.cpp
+++ b/indra/llwindow/llwindowheadless.cpp
@@ -28,6 +28,7 @@
#include "indra_constants.h"
#include "llwindowheadless.h"
+#include "llkeyboardheadless.h"
//
// LLWindowHeadless
@@ -37,6 +38,9 @@ LLWindowHeadless::LLWindowHeadless(LLWindowCallbacks* callbacks, const std::stri
BOOL disable_vsync, BOOL use_gl, BOOL ignore_pixel_depth)
: LLWindow(callbacks, fullscreen, flags)
{
+ // Initialize a headless keyboard.
+ gKeyboard = new LLKeyboardHeadless();
+ gKeyboard->setCallbacks(callbacks);
}
diff --git a/indra/llwindow/llwindowheadless.h b/indra/llwindow/llwindowheadless.h
index ac53e6a86e..1f767f4c97 100644
--- a/indra/llwindow/llwindowheadless.h
+++ b/indra/llwindow/llwindowheadless.h
@@ -46,7 +46,8 @@ public:
/*virtual*/ BOOL getSize(LLCoordScreen *size) {return FALSE;};
/*virtual*/ BOOL getSize(LLCoordWindow *size) {return FALSE;};
/*virtual*/ BOOL setPosition(LLCoordScreen position) {return FALSE;};
- /*virtual*/ BOOL setSize(LLCoordScreen size) {return FALSE;};
+ /*virtual*/ BOOL setSizeImpl(LLCoordScreen size) {return FALSE;};
+ /*virtual*/ BOOL setSizeImpl(LLCoordWindow size) {return FALSE;};
/*virtual*/ BOOL switchContext(BOOL fullscreen, const LLCoordScreen &size, BOOL disable_vsync, const LLCoordScreen * const posp = NULL) {return FALSE;};
/*virtual*/ BOOL setCursorPosition(LLCoordWindow position) {return FALSE;};
/*virtual*/ BOOL getCursorPosition(LLCoordWindow *position) {return FALSE;};
@@ -55,7 +56,7 @@ public:
/*virtual*/ void showCursorFromMouseMove() {};
/*virtual*/ void hideCursorUntilMouseMove() {};
/*virtual*/ BOOL isCursorHidden() {return FALSE;};
- /*virtual*/ void setCursor(ECursorType cursor) {};
+ /*virtual*/ void updateCursor() {};
//virtual ECursorType getCursor() { return mCurrentCursor; };
/*virtual*/ void captureMouse() {};
/*virtual*/ void releaseMouse() {};
diff --git a/indra/llwindow/llwindowmacosx.cpp b/indra/llwindow/llwindowmacosx.cpp
index affd7276cc..32bb84cba5 100644
--- a/indra/llwindow/llwindowmacosx.cpp
+++ b/indra/llwindow/llwindowmacosx.cpp
@@ -1,25 +1,25 @@
-/**
+/**
* @file llwindowmacosx.cpp
* @brief Platform-dependent implementation of llwindow
*
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2010, Linden Research, Inc.
- *
+ *
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
- *
+ *
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
+ *
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
@@ -108,9 +108,6 @@ static long getDictLong (CFDictionaryRef refDict, CFStringRef key);
static EventTypeSpec WindowHandlerEventList[] =
{
// Window-related events
- // { kEventClassWindow, kEventWindowCollapsing },
- // { kEventClassWindow, kEventWindowCollapsed },
- // { kEventClassWindow, kEventWindowShown },
{ kEventClassWindow, kEventWindowActivated },
{ kEventClassWindow, kEventWindowDeactivated },
{ kEventClassWindow, kEventWindowShown },
@@ -121,8 +118,7 @@ static EventTypeSpec WindowHandlerEventList[] =
{ kEventClassWindow, kEventWindowClose },
{ kEventClassWindow, kEventWindowBoundsChanging },
{ kEventClassWindow, kEventWindowBoundsChanged },
- // { kEventClassWindow, kEventWindowZoomed },
- // { kEventClassWindow, kEventWindowDrawContent },
+ { kEventClassWindow, kEventWindowGetIdealSize },
// Mouse events
{ kEventClassMouse, kEventMouseDown },
@@ -224,10 +220,10 @@ LLWindowMacOSX::LLWindowMacOSX(LLWindowCallbacks* callbacks,
// Route them to a dummy callback structure until the end of constructor.
LLWindowCallbacks null_callbacks;
mCallbacks = &null_callbacks;
-
+
// Voodoo for calling cocoa from carbon (see llwindowmacosx-objc.mm).
setupCocoa();
-
+
// Initialize the keyboard
gKeyboard = new LLKeyboardMacOSX();
gKeyboard->setCallbacks(callbacks);
@@ -248,6 +244,7 @@ LLWindowMacOSX::LLWindowMacOSX(LLWindowCallbacks* callbacks,
mCursorIgnoreNextDelta = FALSE;
mNeedsResize = FALSE;
mOverrideAspectRatio = 0.f;
+ mMaximized = FALSE;
mMinimized = FALSE;
mTSMDocument = NULL; // Just in case.
mLanguageTextInputAllowed = FALSE;
@@ -257,10 +254,10 @@ LLWindowMacOSX::LLWindowMacOSX(LLWindowCallbacks* callbacks,
mRawKeyEvent = NULL;
mFSAASamples = fsaa_samples;
mForceRebuild = FALSE;
-
+
// For reasons that aren't clear to me, LLTimers seem to be created in the "started" state.
// Since the started state of this one is used to track whether the NMRec has been installed, it wants to start out in the "stopped" state.
- mBounceTimer.stop();
+ mBounceTimer.stop();
// Get the original aspect ratio of the main device.
mOriginalAspectRatio = (double)CGDisplayPixelsWide(mDisplay) / (double)CGDisplayPixelsHigh(mDisplay);
@@ -273,7 +270,7 @@ LLWindowMacOSX::LLWindowMacOSX(LLWindowCallbacks* callbacks,
mMoveEventCampartorUPP = NewEventComparatorUPP(staticMoveEventComparator);
mGlobalHandlerRef = NULL;
mWindowHandlerRef = NULL;
-
+
mDragOverrideCursor = -1;
// We're not clipping yet
@@ -448,31 +445,30 @@ BOOL LLWindowMacOSX::createContext(int x, int y, int width, int height, int bits
mFullscreenBits = -1;
mFullscreenRefresh = -1;
- std::string error= llformat("Unable to run fullscreen at %d x %d.\nRunning in window.", width, height);
+ std::string error= llformat("Unable to run fullscreen at %d x %d.\nRunning in window.", width, height);
OSMessageBox(error, "Error", OSMB_OK);
}
}
if(!mFullscreen && (mWindow == NULL))
{
- Rect window_rect;
//int displayWidth = CGDisplayPixelsWide(mDisplay);
//int displayHeight = CGDisplayPixelsHigh(mDisplay);
//const int menuBarPlusTitleBar = 44; // Ugly magic number.
LL_DEBUGS("Window") << "createContext: creating window" << LL_ENDL;
- window_rect.left = (long) x;
- window_rect.right = (long) x + width;
- window_rect.top = (long) y;
- window_rect.bottom = (long) y + height;
+ mPreviousWindowRect.left = (long) x;
+ mPreviousWindowRect.right = (long) x + width;
+ mPreviousWindowRect.top = (long) y;
+ mPreviousWindowRect.bottom = (long) y + height;
//-----------------------------------------------------------------------
// Create the window
//-----------------------------------------------------------------------
mWindow = NewCWindow(
NULL,
- &window_rect,
+ &mPreviousWindowRect,
mWindowTitle,
false, // Create the window invisible. Whoever calls createContext() should show it after any moving/resizing.
// noGrowDocProc, // Window with no grow box and no zoom box
@@ -482,7 +478,6 @@ BOOL LLWindowMacOSX::createContext(int x, int y, int width, int height, int bits
true,
(long)this);
-
if (!mWindow)
{
setupFailure("Window creation error", "Error", OSMB_OK);
@@ -498,7 +493,7 @@ BOOL LLWindowMacOSX::createContext(int x, int y, int width, int height, int bits
InstallStandardEventHandler(GetWindowEventTarget(mWindow));
InstallWindowEventHandler(mWindow, mEventHandlerUPP, GetEventTypeCount (WindowHandlerEventList), WindowHandlerEventList, (void*)this, &mWindowHandlerRef); // add event handler
#if LL_OS_DRAGDROP_ENABLED
- InstallTrackingHandler( dragTrackingHandler, mWindow, (void*)this );
+ InstallTrackingHandler( dragTrackingHandler, mWindow, (void*)this );
InstallReceiveHandler( dragReceiveHandler, mWindow, (void*)this );
#endif // LL_OS_DRAGDROP_ENABLED
}
@@ -541,20 +536,20 @@ BOOL LLWindowMacOSX::createContext(int x, int y, int width, int height, int bits
GLint fullscreenAttrib[] =
{
AGL_RGBA,
- AGL_FULLSCREEN,
- // AGL_NO_RECOVERY, // MBW -- XXX -- Not sure if we want this attribute
- AGL_SAMPLE_BUFFERS_ARB, mFSAASamples > 0 ? 1 : 0,
- AGL_SAMPLES_ARB, mFSAASamples,
- AGL_DOUBLEBUFFER,
- AGL_CLOSEST_POLICY,
- AGL_ACCELERATED,
- AGL_RED_SIZE, 8,
- AGL_GREEN_SIZE, 8,
- AGL_BLUE_SIZE, 8,
- AGL_ALPHA_SIZE, 8,
- AGL_DEPTH_SIZE, 24,
- AGL_STENCIL_SIZE, 8,
- AGL_NONE
+ AGL_FULLSCREEN,
+ AGL_NO_RECOVERY,
+ AGL_SAMPLE_BUFFERS_ARB, mFSAASamples > 0 ? 1 : 0,
+ AGL_SAMPLES_ARB, mFSAASamples,
+ AGL_DOUBLEBUFFER,
+ AGL_CLOSEST_POLICY,
+ AGL_ACCELERATED,
+ AGL_RED_SIZE, 8,
+ AGL_GREEN_SIZE, 8,
+ AGL_BLUE_SIZE, 8,
+ AGL_ALPHA_SIZE, 8,
+ AGL_DEPTH_SIZE, 24,
+ AGL_STENCIL_SIZE, 8,
+ AGL_NONE
};
LL_DEBUGS("Window") << "createContext: creating fullscreen pixelformat" << LL_ENDL;
@@ -567,21 +562,28 @@ BOOL LLWindowMacOSX::createContext(int x, int y, int width, int height, int bits
}
else
{
+ // NOTE from Leslie:
+ //
+ // AGL_NO_RECOVERY, when combined with AGL_ACCELERATED prevents software rendering
+ // fallback which means we won't hvae shaders that compile and link but then don't
+ // work. The drawback is that our shader compilation will be a bit more finicky though.
+
GLint windowedAttrib[] =
{
AGL_RGBA,
- AGL_DOUBLEBUFFER,
- AGL_CLOSEST_POLICY,
- AGL_ACCELERATED,
- AGL_SAMPLE_BUFFERS_ARB, mFSAASamples > 0 ? 1 : 0,
- AGL_SAMPLES_ARB, mFSAASamples,
- AGL_RED_SIZE, 8,
- AGL_GREEN_SIZE, 8,
- AGL_BLUE_SIZE, 8,
- AGL_ALPHA_SIZE, 8,
- AGL_DEPTH_SIZE, 24,
- AGL_STENCIL_SIZE, 8,
- AGL_NONE
+ AGL_NO_RECOVERY,
+ AGL_DOUBLEBUFFER,
+ AGL_CLOSEST_POLICY,
+ AGL_ACCELERATED,
+ AGL_SAMPLE_BUFFERS_ARB, mFSAASamples > 0 ? 1 : 0,
+ AGL_SAMPLES_ARB, mFSAASamples,
+ AGL_RED_SIZE, 8,
+ AGL_GREEN_SIZE, 8,
+ AGL_BLUE_SIZE, 8,
+ AGL_ALPHA_SIZE, 8,
+ AGL_DEPTH_SIZE, 24,
+ AGL_STENCIL_SIZE, 8,
+ AGL_NONE
};
LL_DEBUGS("Window") << "createContext: creating windowed pixelformat" << LL_ENDL;
@@ -788,7 +790,7 @@ BOOL LLWindowMacOSX::createContext(int x, int y, int width, int height, int bits
LL_DEBUGS("GLinit") << "Keeping vertical sync" << LL_ENDL;
frames_per_swap = 1;
}
- aglSetInteger(mContext, AGL_SWAP_INTERVAL, &frames_per_swap);
+ aglSetInteger(mContext, AGL_SWAP_INTERVAL, &frames_per_swap);
//enable multi-threaded OpenGL
if (sUseMultGL)
@@ -801,7 +803,7 @@ BOOL LLWindowMacOSX::createContext(int x, int y, int width, int height, int bits
if (cgl_err != kCGLNoError )
{
LL_DEBUGS("GLInit") << "Multi-threaded OpenGL not available." << LL_ENDL;
- }
+ }
else
{
LL_DEBUGS("GLInit") << "Multi-threaded OpenGL enabled." << LL_ENDL;
@@ -1093,31 +1095,22 @@ BOOL LLWindowMacOSX::getVisible()
BOOL LLWindowMacOSX::getMinimized()
{
- BOOL result = FALSE;
-
- // Since the set of states where we want to act "minimized" is non-trivial, it's easier to
- // track things locally than to try and retrieve the state from the window manager.
- result = mMinimized;
-
- return(result);
+ return mMinimized;
}
BOOL LLWindowMacOSX::getMaximized()
{
- BOOL result = FALSE;
-
- if (mWindow)
- {
- // TODO
- }
-
- return(result);
+ return mMaximized;
}
BOOL LLWindowMacOSX::maximize()
{
- // TODO
- return FALSE;
+ if (mWindow && !mMaximized)
+ {
+ ZoomWindow(mWindow, inContent, true);
+ }
+
+ return mMaximized;
}
BOOL LLWindowMacOSX::getFullscreen()
@@ -1171,6 +1164,8 @@ void LLWindowMacOSX::gatherInput()
}
}
+
+ updateCursor();
}
BOOL LLWindowMacOSX::getPosition(LLCoordScreen *position)
@@ -1261,7 +1256,7 @@ BOOL LLWindowMacOSX::setPosition(const LLCoordScreen position)
return TRUE;
}
-BOOL LLWindowMacOSX::setSize(const LLCoordScreen size)
+BOOL LLWindowMacOSX::setSizeImpl(const LLCoordScreen size)
{
if(mWindow)
{
@@ -1271,6 +1266,31 @@ BOOL LLWindowMacOSX::setSize(const LLCoordScreen size)
return TRUE;
}
+BOOL LLWindowMacOSX::setSizeImpl(const LLCoordWindow size)
+{
+ Rect client_rect;
+ if (mWindow)
+ {
+ OSStatus err = GetWindowBounds(mWindow, kWindowContentRgn, &client_rect);
+ if (err == noErr)
+ {
+ client_rect.right = client_rect.left + size.mX;
+ client_rect.bottom = client_rect.top + size.mY;
+ err = SetWindowBounds(mWindow, kWindowContentRgn, &client_rect);
+ }
+ if (err == noErr)
+ {
+ return TRUE;
+ }
+ else
+ {
+ llinfos << "Error setting size" << err << llendl;
+ return FALSE;
+ }
+ }
+ return FALSE;
+}
+
void LLWindowMacOSX::swapBuffers()
{
aglSwapBuffers(mContext);
@@ -1439,7 +1459,7 @@ static void fixOrigin(void)
GrafPtr port;
Rect portrect;
- ::GetPort(&port);
+ ::GetPort(&port);
::GetPortBounds(port, &portrect);
if((portrect.left != 0) || (portrect.top != 0))
{
@@ -1453,17 +1473,17 @@ BOOL LLWindowMacOSX::getCursorPosition(LLCoordWindow *position)
Point cursor_point;
LLCoordScreen screen_pos;
GrafPtr save;
-
+
if(mWindow == NULL)
return FALSE;
-
+
::GetPort(&save);
::SetPort(GetWindowPort(mWindow));
fixOrigin();
// gets the mouse location in local coordinates
::GetMouse(&cursor_point);
-
+
// lldebugs << "getCursorPosition(): cursor is at " << cursor_point.h << ", " << cursor_point.v << " port origin: " << portrect.left << ", " << portrect.top << llendl;
::SetPort(save);
@@ -1528,7 +1548,7 @@ F32 LLWindowMacOSX::getNativeAspectRatio()
{
// The constructor for this class grabs the aspect ratio of the monitor before doing any resolution
// switching, and stashes it in mOriginalAspectRatio. Here, we just return it.
-
+
if (mOverrideAspectRatio > 0.f)
{
return mOverrideAspectRatio;
@@ -2003,7 +2023,7 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
if (mPreeditor
&& (result = GetEventParameter(event, kEventParamTextInputSendFixLen,
typeLongInteger, &param_type, sizeof(fix_len), NULL, &fix_len)) == noErr
- && typeLongInteger == param_type
+ && typeLongInteger == param_type
&& (result = GetEventParameter(event, kEventParamTextInputSendText,
typeUnicodeText, &param_type, 0, &text_len, NULL)) == noErr
&& typeUnicodeText == param_type)
@@ -2023,7 +2043,7 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
mPreeditor->markAsPreedit(location, length);
}
mPreeditor->resetPreedit();
-
+
// Receive the text from input method.
U16 *const text = new U16[text_len / sizeof(U16)];
GetEventParameter(event, kEventParamTextInputSendText, typeUnicodeText, NULL, text_len, NULL, text);
@@ -2062,11 +2082,11 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
GetEventParameter(event, kEventParamTextInputSendHiliteRng, typeTextRangeArray,
NULL, text_range_array_size, NULL, text_range_array);
- // WARNING: We assume ranges are in ascending order,
+ // WARNING: We assume ranges are in ascending order,
// although the condition is undocumented. It seems
// OK to assume this. I also assumed
// the ranges are contiguous in previous versions, but I
- // have heard a rumore that older versions os ATOK may
+ // have heard a rumore that older versions os ATOK may
// return ranges with some _gap_. I don't know whether
// it is true, but I'm preparing my code for the case.
@@ -2130,7 +2150,7 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
}
}
break;
-
+
case kEventTextInputUnicodeForKeyEvent:
{
UInt32 modifiers = 0;
@@ -2139,7 +2159,7 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
// First, process the raw event.
{
EventRef rawEvent = NULL;
-
+
// Get the original event and extract the modifier keys, so we can ignore command-key events.
if (GetEventParameter(event, kEventParamTextInputSendKeyboardEvent, typeEventRef, NULL, sizeof(rawEvent), NULL, &rawEvent) == noErr)
{
@@ -2148,7 +2168,7 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
// and call this function recursively to handle the raw key event.
eventHandler (myHandler, rawEvent);
-
+
// save the raw event until we're done processing the unicode input as well.
mRawKeyEvent = rawEvent;
}
@@ -2179,7 +2199,7 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
else
{
MASK mask = LLWindowMacOSX::modifiersToMask(modifiers);
-
+
llassert( actualType == typeUnicodeText );
// The result is a UTF16 buffer. Pass the characters in turn to handleUnicodeChar.
@@ -2205,7 +2225,7 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
result = err;
}
break;
-
+
case kEventTextInputOffsetToPos:
{
EventParamType param_type;
@@ -2218,7 +2238,7 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
S32 preedit, preedit_length;
mPreeditor->getPreeditRange(&preedit, &preedit_length);
const LLWString & text = mPreeditor->getPreeditString();
-
+
LLCoordGL caret_coord;
LLRect preedit_bounds;
if (0 <= offset
@@ -2232,10 +2252,10 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
qd_point.h = caret_base_coord_screen.mX;
qd_point.v = caret_base_coord_screen.mY;
SetEventParameter(event, kEventParamTextInputReplyPoint, typeQDPoint, sizeof(qd_point), &qd_point);
-
+
short line_height = (short) preedit_bounds.getHeight();
SetEventParameter(event, kEventParamTextInputReplyLineHeight, typeShortInteger, sizeof(line_height), &line_height);
-
+
result = noErr;
}
else
@@ -2288,7 +2308,7 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
case kEventRawKeyRepeat:
if (gDebugWindowProc)
{
- printf("key down, key code = 0x%08x, char code = 0x%02x (%c), modifiers = 0x%08x\n",
+ printf("key down, key code = 0x%08x, char code = 0x%02x (%c), modifiers = 0x%08x\n",
(unsigned int)keyCode, charCode, (char)charCode, (unsigned int)modifiers);
fflush(stdout);
}
@@ -2299,7 +2319,7 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
case kEventRawKeyUp:
if (gDebugWindowProc)
{
- printf("key up, key code = 0x%08x, char code = 0x%02x (%c), modifiers = 0x%08x\n",
+ printf("key up, key code = 0x%08x, char code = 0x%02x (%c), modifiers = 0x%08x\n",
(unsigned int)keyCode, charCode, (char)charCode, (unsigned int)modifiers);
fflush(stdout);
}
@@ -2357,7 +2377,7 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
}
// When the state of the 'Fn' key (the one that changes some of the mappings on a powerbook/macbook keyboard
- // to an embedded keypad) changes, it may subsequently cause a key up event to be lost, which may lead to
+ // to an embedded keypad) changes, it may subsequently cause a key up event to be lost, which may lead to
// a movement key getting "stuck" down. This is bad.
// This is an OS bug -- even the GetKeys() API doesn't tell you the key has been released.
// This workaround causes all held-down keys to be reset whenever the state of the Fn key changes. This isn't
@@ -2367,14 +2387,14 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
if (gDebugWindowProc) printf("Fn key state change event\n");
gKeyboard->resetKeys();
}
-
+
if (gDebugWindowProc) fflush(stdout);
mLastModifiers = modifiers;
result = eventNotHandledErr;
break;
}
-
+
mRawKeyEvent = NULL;
}
break;
@@ -2469,7 +2489,7 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
case kEventMouseButtonSecondary:
mCallbacks->handleRightMouseDown(this, outCoords, mask);
break;
-
+
case kEventMouseButtonTertiary:
mCallbacks->handleMiddleMouseDown(this, outCoords, mask);
break;
@@ -2531,7 +2551,7 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
case kEventClassWindow:
switch(evtKind)
- {
+ {
case kEventWindowActivated:
if (mTSMDocument)
{
@@ -2546,20 +2566,37 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
}
mCallbacks->handleFocusLost(this);
break;
-
+
case kEventWindowBoundsChanging:
{
// This is where we would constrain move/resize to a particular screen
- const S32 MIN_WIDTH = 320;
- const S32 MIN_HEIGHT = 240;
-
+ const S32 MIN_WIDTH = mMinWindowWidth;
+ const S32 MIN_HEIGHT = mMinWindowHeight;
+
Rect currentBounds;
Rect previousBounds;
GetEventParameter(event, kEventParamCurrentBounds, typeQDRectangle, NULL, sizeof(Rect), NULL, &currentBounds);
GetEventParameter(event, kEventParamPreviousBounds, typeQDRectangle, NULL, sizeof(Rect), NULL, &previousBounds);
+ // Put an offset into window un-maximize operation since the kEventWindowGetIdealSize
+ // event only allows the specification of size and not position.
+ if (mMaximized)
+ {
+ short leftOffset = mPreviousWindowRect.left - currentBounds.left;
+ currentBounds.left += leftOffset;
+ currentBounds.right += leftOffset;
+
+ short topOffset = mPreviousWindowRect.top - currentBounds.top;
+ currentBounds.top += topOffset;
+ currentBounds.bottom += topOffset;
+ }
+ else
+ {
+ // Store off the size for future un-maximize operations
+ mPreviousWindowRect = previousBounds;
+ }
if ((currentBounds.right - currentBounds.left) < MIN_WIDTH)
{
@@ -2570,7 +2607,7 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
{
currentBounds.bottom = currentBounds.top + MIN_HEIGHT;
}
-
+
SetEventParameter(event, kEventParamCurrentBounds, typeQDRectangle, sizeof(Rect), &currentBounds);
result = noErr;
}
@@ -2578,13 +2615,43 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
case kEventWindowBoundsChanged:
{
+ // Get new window bounds
Rect newBounds;
-
GetEventParameter(event, kEventParamCurrentBounds, typeQDRectangle, NULL, sizeof(Rect), NULL, &newBounds);
+
+ // Get previous window bounds
+ Rect oldBounds;
+ GetEventParameter(event, kEventParamPreviousBounds, typeQDRectangle, NULL, sizeof(Rect), NULL, &oldBounds);
+
+ // Determine if the new size is larger than the old
+ bool newBoundsLarger = ((newBounds.right - newBounds.left) >= (oldBounds.right - oldBounds.left));
+ newBoundsLarger &= ((newBounds.bottom - newBounds.top) >= (oldBounds.bottom - oldBounds.top));
+
+ // Check to see if this is a zoom event (+ button on window pane)
+ unsigned int eventParams;
+ GetEventParameter(event, kEventParamAttributes, typeUInt32, NULL, sizeof(int), NULL, &eventParams);
+ bool isZoomEvent = ((eventParams & kWindowBoundsChangeZoom) != 0);
+
+ // Maximized flag is if zoom event and increasing window size
+ mMaximized = (isZoomEvent && newBoundsLarger);
+
aglUpdateContext(mContext);
+
mCallbacks->handleResize(this, newBounds.right - newBounds.left, newBounds.bottom - newBounds.top);
+ }
+ break;
+ case kEventWindowGetIdealSize:
+ // Only recommend a new ideal size when un-maximizing
+ if (mMaximized == TRUE)
+ {
+ Point nonMaximizedSize;
+
+ nonMaximizedSize.v = mPreviousWindowRect.bottom - mPreviousWindowRect.top;
+ nonMaximizedSize.h = mPreviousWindowRect.right - mPreviousWindowRect.left;
+ SetEventParameter(event, kEventParamDimensions, typeQDPoint, sizeof(Point), &nonMaximizedSize);
+ result = noErr;
}
break;
@@ -2637,7 +2704,7 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
if (mPreeditor)
{
switch(evtKind)
- {
+ {
case kEventTSMDocumentAccessGetLength:
{
@@ -2656,14 +2723,14 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
{
// Return the selected range, excluding preedit.
// In our preeditor, preedit and selection are exclusive, so,
- // when it has a preedit, there is no selection and the
+ // when it has a preedit, there is no selection and the
// insertion point is on the preedit that corrupses into the
// beginning of the preedit when the preedit was removed.
S32 preedit, preedit_length;
mPreeditor->getPreeditRange(&preedit, &preedit_length);
const LLWString & text = mPreeditor->getPreeditString();
-
+
CFRange range;
if (preedit_length)
{
@@ -2727,7 +2794,7 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
memcpy(target_pointer, text_utf16.c_str() + range.location, range.length * sizeof(UniChar));
// Note that result has already been set above.
- }
+ }
}
break;
@@ -2774,14 +2841,14 @@ const char* cursorIDToName(int id)
case UI_CURSOR_TOOLPLAY: return "UI_CURSOR_TOOLPLAY";
case UI_CURSOR_TOOLPAUSE: return "UI_CURSOR_TOOLPAUSE";
case UI_CURSOR_TOOLMEDIAOPEN: return "UI_CURSOR_TOOLMEDIAOPEN";
- case UI_CURSOR_PIPETTE: return "UI_CURSOR_PIPETTE";
+ case UI_CURSOR_PIPETTE: return "UI_CURSOR_PIPETTE";
case UI_CURSOR_TOOLSIT: return "UI_CURSOR_TOOLSIT";
case UI_CURSOR_TOOLBUY: return "UI_CURSOR_TOOLBUY";
case UI_CURSOR_TOOLOPEN: return "UI_CURSOR_TOOLOPEN";
}
llerrs << "cursorIDToName: unknown cursor id" << id << llendl;
-
+
return "UI_CURSOR_ARROW";
}
@@ -2797,42 +2864,42 @@ static void initPixmapCursor(int cursorid, int hotspotX, int hotspotY)
fullpath += gDirUtilp->getDirDelimiter();
fullpath += cursorIDToName(cursorid);
fullpath += ".tif";
-
+
gCursors[cursorid] = createImageCursor(fullpath.c_str(), hotspotX, hotspotY);
}
-void LLWindowMacOSX::setCursor(ECursorType cursor)
+void LLWindowMacOSX::updateCursor()
{
OSStatus result = noErr;
- if (mDragOverrideCursor != -1)
+ if (mDragOverrideCursor != -1)
{
// A drag is in progress...remember the requested cursor and we'll
// restore it when it is done
- mCurrentCursor = cursor;
+ mCurrentCursor = mNextCursor;
return;
}
- if (cursor == UI_CURSOR_ARROW
+ if (mNextCursor == UI_CURSOR_ARROW
&& mBusyCount > 0)
{
- cursor = UI_CURSOR_WORKING;
+ mNextCursor = UI_CURSOR_WORKING;
}
- if(mCurrentCursor == cursor)
+ if(mCurrentCursor == mNextCursor)
return;
// RN: replace multi-drag cursors with single versions
- if (cursor == UI_CURSOR_ARROWDRAGMULTI)
+ if (mNextCursor == UI_CURSOR_ARROWDRAGMULTI)
{
- cursor = UI_CURSOR_ARROWDRAG;
+ mNextCursor = UI_CURSOR_ARROWDRAG;
}
- else if (cursor == UI_CURSOR_ARROWCOPYMULTI)
+ else if (mNextCursor == UI_CURSOR_ARROWCOPYMULTI)
{
- cursor = UI_CURSOR_ARROWCOPY;
+ mNextCursor = UI_CURSOR_ARROWCOPY;
}
- switch(cursor)
+ switch(mNextCursor)
{
default:
case UI_CURSOR_ARROW:
@@ -2883,7 +2950,7 @@ void LLWindowMacOSX::setCursor(ECursorType cursor)
case UI_CURSOR_TOOLSIT:
case UI_CURSOR_TOOLBUY:
case UI_CURSOR_TOOLOPEN:
- result = setImageCursor(gCursors[cursor]);
+ result = setImageCursor(gCursors[mNextCursor]);
break;
}
@@ -2893,7 +2960,7 @@ void LLWindowMacOSX::setCursor(ECursorType cursor)
InitCursor();
}
- mCurrentCursor = cursor;
+ mCurrentCursor = mNextCursor;
}
ECursorType LLWindowMacOSX::getCursor() const
@@ -3228,14 +3295,14 @@ void LLWindowMacOSX::spawnWebBrowser(const std::string& escaped_url, bool async)
LLSD LLWindowMacOSX::getNativeKeyData()
{
LLSD result = LLSD::emptyMap();
-
+
if(mRawKeyEvent)
{
char char_code = 0;
UInt32 key_code = 0;
UInt32 modifiers = 0;
UInt32 keyboard_type = 0;
-
+
GetEventParameter (mRawKeyEvent, kEventParamKeyMacCharCodes, typeChar, NULL, sizeof(char), NULL, &char_code);
GetEventParameter (mRawKeyEvent, kEventParamKeyCode, typeUInt32, NULL, sizeof(UInt32), NULL, &key_code);
GetEventParameter (mRawKeyEvent, kEventParamKeyModifiers, typeUInt32, NULL, sizeof(UInt32), NULL, &modifiers);
@@ -3245,7 +3312,7 @@ LLSD LLWindowMacOSX::getNativeKeyData()
result["key_code"] = (S32)key_code;
result["modifiers"] = (S32)modifiers;
result["keyboard_type"] = (S32)keyboard_type;
-
+
#if 0
// This causes trouble for control characters -- apparently character codes less than 32 (escape, control-A, etc)
// cause llsd serialization to create XML that the llsd deserializer won't parse!
@@ -3254,7 +3321,7 @@ LLSD LLWindowMacOSX::getNativeKeyData()
EventParamType actualType = typeUTF8Text;
UInt32 actualSize = 0;
char *buffer = NULL;
-
+
err = GetEventParameter (mRawKeyEvent, kEventParamKeyUnicodes, typeUTF8Text, &actualType, 0, &actualSize, NULL);
if(err == noErr)
{
@@ -3267,7 +3334,7 @@ LLSD LLWindowMacOSX::getNativeKeyData()
}
delete[] buffer;
}
-
+
result["unicode"] = unicode;
#endif
@@ -3275,7 +3342,7 @@ LLSD LLWindowMacOSX::getNativeKeyData()
lldebugs << "native key data is: " << result << llendl;
-
+
return result;
}
@@ -3322,17 +3389,17 @@ void *LLWindowMacOSX::getPlatformWindow()
void *LLWindowMacOSX::getMediaWindow()
{
- /*
- Mozilla needs to be initialized with a WindowRef to function properly.
+ /*
+ Mozilla needs to be initialized with a WindowRef to function properly.
(There's no good reason for this, since it shouldn't be interacting with our window in any way, but that's another issue.)
- If we're in windowed mode, we _could_ hand it our actual window pointer, but a subsequent switch to fullscreen will destroy that window,
+ If we're in windowed mode, we _could_ hand it our actual window pointer, but a subsequent switch to fullscreen will destroy that window,
which trips up Mozilla.
Instead of using our actual window, we create an invisible window which will persist for the lifetime of the application and pass that to Mozilla.
This satisfies its deep-seated need to latch onto a WindowRef and solves the issue with switching between fullscreen and windowed modes.
Note that we will never destroy this window (by design!), but since only one will ever be created per run of the application, that's okay.
*/
-
+
if(sMediaWindow == NULL)
{
Rect window_rect = {100, 100, 200, 200};
@@ -3341,13 +3408,13 @@ void *LLWindowMacOSX::getMediaWindow()
NULL,
&window_rect,
(ConstStr255Param) "\p",
- false, // Create the window invisible.
+ false, // Create the window invisible.
zoomDocProc, // Window with a grow box and a zoom box
kLastWindowOfClass, // create it behind other windows
false, // no close box
0);
}
-
+
return (void*)sMediaWindow;
}
@@ -3397,7 +3464,7 @@ void LLWindowMacOSX::allowLanguageTextInput(LLPreeditor *preeditor, BOOL b)
}
UseInputWindow(mTSMDocument, !b);
-
+
// Take care of old and new preeditors.
if (preeditor != mPreeditor || !b)
{
@@ -3416,7 +3483,7 @@ void LLWindowMacOSX::allowLanguageTextInput(LLPreeditor *preeditor, BOOL b)
return;
}
mLanguageTextInputAllowed = b;
-
+
if (b)
{
if (mTSMScriptCode != smRoman)
@@ -3465,7 +3532,7 @@ MASK LLWindowMacOSX::modifiersToMask(SInt16 modifiers)
if(modifiers & (cmdKey | controlKey)) { mask |= MASK_CONTROL; }
if(modifiers & optionKey) { mask |= MASK_ALT; }
return mask;
-}
+}
#if LL_OS_DRAGDROP_ENABLED
@@ -3476,53 +3543,53 @@ OSErr LLWindowMacOSX::dragTrackingHandler(DragTrackingMessage message, WindowRef
LLWindowMacOSX *self = (LLWindowMacOSX*)handlerRefCon;
lldebugs << "drag tracking handler, message = " << message << llendl;
-
+
switch(message)
{
case kDragTrackingInWindow:
result = self->handleDragNDrop(drag, LLWindowCallbacks::DNDA_TRACK);
break;
-
+
case kDragTrackingEnterHandler:
result = self->handleDragNDrop(drag, LLWindowCallbacks::DNDA_START_TRACKING);
break;
-
+
case kDragTrackingLeaveHandler:
result = self->handleDragNDrop(drag, LLWindowCallbacks::DNDA_STOP_TRACKING);
break;
-
+
default:
break;
}
-
+
return result;
}
-OSErr LLWindowMacOSX::dragReceiveHandler(WindowRef theWindow, void * handlerRefCon,
+OSErr LLWindowMacOSX::dragReceiveHandler(WindowRef theWindow, void * handlerRefCon,
DragRef drag)
-{
+{
LLWindowMacOSX *self = (LLWindowMacOSX*)handlerRefCon;
return self->handleDragNDrop(drag, LLWindowCallbacks::DNDA_DROPPED);
}
OSErr LLWindowMacOSX::handleDragNDrop(DragRef drag, LLWindowCallbacks::DragNDropAction action)
-{
+{
OSErr result = dragNotAcceptedErr; // overall function result
OSErr err = noErr; // for local error handling
-
+
// Get the mouse position and modifiers of this drag.
SInt16 modifiers, mouseDownModifiers, mouseUpModifiers;
::GetDragModifiers(drag, &modifiers, &mouseDownModifiers, &mouseUpModifiers);
MASK mask = LLWindowMacOSX::modifiersToMask(modifiers);
-
+
Point mouse_point;
// This will return the mouse point in global screen coords
::GetDragMouse(drag, &mouse_point, NULL);
LLCoordScreen screen_coords(mouse_point.h, mouse_point.v);
LLCoordGL gl_pos;
convertCoords(screen_coords, &gl_pos);
-
+
// Look at the pasteboard and try to extract an URL from it
PasteboardRef pasteboard;
if(GetDragPasteboard(drag, &pasteboard) == noErr)
@@ -3530,22 +3597,22 @@ OSErr LLWindowMacOSX::handleDragNDrop(DragRef drag, LLWindowCallbacks::DragNDrop
ItemCount num_items = 0;
// Treat an error here as an item count of 0
(void)PasteboardGetItemCount(pasteboard, &num_items);
-
+
// Only deal with single-item drags.
if(num_items == 1)
{
PasteboardItemID item_id = NULL;
CFArrayRef flavors = NULL;
CFDataRef data = NULL;
-
+
err = PasteboardGetItemIdentifier(pasteboard, 1, &item_id); // Yes, this really is 1-based.
-
+
// Try to extract an URL from the pasteboard
if(err == noErr)
{
err = PasteboardCopyItemFlavors( pasteboard, item_id, &flavors);
}
-
+
if(err == noErr)
{
if(CFArrayContainsValue(flavors, CFRangeMake(0, CFArrayGetCount(flavors)), kUTTypeURL))
@@ -3558,9 +3625,9 @@ OSErr LLWindowMacOSX::handleDragNDrop(DragRef drag, LLWindowCallbacks::DragNDrop
// This is a string that might be an URL.
err = PasteboardCopyItemFlavorData(pasteboard, item_id, kUTTypeUTF8PlainText, &data);
}
-
+
}
-
+
if(flavors != NULL)
{
CFRelease(flavors);
@@ -3571,12 +3638,12 @@ OSErr LLWindowMacOSX::handleDragNDrop(DragRef drag, LLWindowCallbacks::DragNDrop
std::string url;
url.assign((char*)CFDataGetBytePtr(data), CFDataGetLength(data));
CFRelease(data);
-
+
if(!url.empty())
{
- LLWindowCallbacks::DragNDropResult res =
+ LLWindowCallbacks::DragNDropResult res =
mCallbacks->handleDragNDrop(this, gl_pos, mask, action, url);
-
+
switch (res) {
case LLWindowCallbacks::DND_NONE: // No drop allowed
if (action == LLWindowCallbacks::DNDA_TRACK)
@@ -3611,7 +3678,7 @@ OSErr LLWindowMacOSX::handleDragNDrop(DragRef drag, LLWindowCallbacks::DragNDrop
// Restore the cursor
ECursorType temp_cursor = mCurrentCursor;
// get around the "setting the same cursor" code in setCursor()
- mCurrentCursor = UI_CURSOR_COUNT;
+ mCurrentCursor = UI_CURSOR_COUNT;
setCursor(temp_cursor);
}
else {
@@ -3623,7 +3690,7 @@ OSErr LLWindowMacOSX::handleDragNDrop(DragRef drag, LLWindowCallbacks::DragNDrop
}
}
}
-
+
return result;
}
diff --git a/indra/llwindow/llwindowmacosx.h b/indra/llwindow/llwindowmacosx.h
index 6dc093b4be..52ba8b3bf3 100644
--- a/indra/llwindow/llwindowmacosx.h
+++ b/indra/llwindow/llwindowmacosx.h
@@ -58,7 +58,8 @@ public:
/*virtual*/ BOOL getSize(LLCoordScreen *size);
/*virtual*/ BOOL getSize(LLCoordWindow *size);
/*virtual*/ BOOL setPosition(LLCoordScreen position);
- /*virtual*/ BOOL setSize(LLCoordScreen size);
+ /*virtual*/ BOOL setSizeImpl(LLCoordScreen size);
+ /*virtual*/ BOOL setSizeImpl(LLCoordWindow size);
/*virtual*/ BOOL switchContext(BOOL fullscreen, const LLCoordScreen &size, BOOL disable_vsync, const LLCoordScreen * const posp = NULL);
/*virtual*/ BOOL setCursorPosition(LLCoordWindow position);
/*virtual*/ BOOL getCursorPosition(LLCoordWindow *position);
@@ -67,7 +68,7 @@ public:
/*virtual*/ void showCursorFromMouseMove();
/*virtual*/ void hideCursorUntilMouseMove();
/*virtual*/ BOOL isCursorHidden();
- /*virtual*/ void setCursor(ECursorType cursor);
+ /*virtual*/ void updateCursor();
/*virtual*/ ECursorType getCursor() const;
/*virtual*/ void captureMouse();
/*virtual*/ void releaseMouse();
@@ -156,7 +157,6 @@ protected:
static pascal Boolean staticMoveEventComparator( EventRef event, void* data);
OSStatus eventHandler (EventHandlerCallRef myHandler, EventRef event);
void adjustCursorDecouple(bool warpingMouse = false);
- void fixWindowSize(void);
void stopDockTileBounce();
static MASK modifiersToMask(SInt16 modifiers);
@@ -182,6 +182,7 @@ protected:
EventComparatorUPP mMoveEventCampartorUPP;
Rect mOldMouseClip; // Screen rect to which the mouse cursor was globally constrained before we changed it in clipMouse()
+ Rect mPreviousWindowRect; // Save previous window for un-maximize event
Str255 mWindowTitle;
double mOriginalAspectRatio;
BOOL mSimulatedRightClick;
@@ -195,6 +196,7 @@ protected:
BOOL mNeedsResize; // Constructor figured out the window is too big, it needs a resize.
LLCoordScreen mNeedsResizeSize;
F32 mOverrideAspectRatio;
+ BOOL mMaximized;
BOOL mMinimized;
U32 mFSAASamples;
BOOL mForceRebuild;
diff --git a/indra/llwindow/llwindowmesaheadless.h b/indra/llwindow/llwindowmesaheadless.h
index fd4bd635e2..8f70aee4f6 100644
--- a/indra/llwindow/llwindowmesaheadless.h
+++ b/indra/llwindow/llwindowmesaheadless.h
@@ -50,7 +50,7 @@ public:
/*virtual*/ BOOL getSize(LLCoordScreen *size) {return FALSE;};
/*virtual*/ BOOL getSize(LLCoordWindow *size) {return FALSE;};
/*virtual*/ BOOL setPosition(LLCoordScreen position) {return FALSE;};
- /*virtual*/ BOOL setSize(LLCoordScreen size) {return FALSE;};
+ /*virtual*/ BOOL setSizeImpl(LLCoordScreen size) {return FALSE;};
/*virtual*/ BOOL switchContext(BOOL fullscreen, const LLCoordScreen &size, BOOL disable_vsync, const LLCoordScreen * const posp = NULL) {return FALSE;};
/*virtual*/ BOOL setCursorPosition(LLCoordWindow position) {return FALSE;};
/*virtual*/ BOOL getCursorPosition(LLCoordWindow *position) {return FALSE;};
@@ -59,7 +59,7 @@ public:
/*virtual*/ void showCursorFromMouseMove() {};
/*virtual*/ void hideCursorUntilMouseMove() {};
/*virtual*/ BOOL isCursorHidden() {return FALSE;};
- /*virtual*/ void setCursor(ECursorType cursor) {};
+ /*virtual*/ void updateCursor() {};
//virtual ECursorType getCursor() { return mCurrentCursor; };
/*virtual*/ void captureMouse() {};
/*virtual*/ void releaseMouse() {};
diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp
index b65287715c..3d33af9d9b 100644
--- a/indra/llwindow/llwindowsdl.cpp
+++ b/indra/llwindow/llwindowsdl.cpp
@@ -963,7 +963,7 @@ BOOL LLWindowSDL::setPosition(const LLCoordScreen position)
return TRUE;
}
-BOOL LLWindowSDL::setSize(const LLCoordScreen size)
+BOOL LLWindowSDL::setSizeImpl(const LLCoordScreen size)
{
if(mWindow)
{
@@ -981,10 +981,31 @@ BOOL LLWindowSDL::setSize(const LLCoordScreen size)
return FALSE;
}
+BOOL LLWindowSDL::setSizeImpl(const LLCoordWindow size)
+{
+ if(mWindow)
+ {
+ // Push a resize event onto SDL's queue - we'll handle it
+ // when it comes out again.
+ SDL_Event event;
+ event.type = SDL_VIDEORESIZE;
+ event.resize.w = size.mX;
+ event.resize.h = size.mY;
+ SDL_PushEvent(&event); // copied into queue
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+
void LLWindowSDL::swapBuffers()
{
if (mWindow)
+ {
SDL_GL_SwapBuffers();
+ }
}
U32 LLWindowSDL::getFSAASamples()
@@ -1031,6 +1052,25 @@ void LLWindowSDL::setMouseClipping( BOOL b )
//SDL_WM_GrabInput(b ? SDL_GRAB_ON : SDL_GRAB_OFF);
}
+// virtual
+void LLWindowSDL::setMinSize(U32 min_width, U32 min_height, bool enforce_immediately)
+{
+ LLWindow::setMinSize(min_width, min_height, enforce_immediately);
+
+#if LL_X11
+ // Set the minimum size limits for X11 window
+ // so the window manager doesn't allow resizing below those limits.
+ XSizeHints* hints = XAllocSizeHints();
+ hints->flags |= PMinSize;
+ hints->min_width = mMinWindowWidth;
+ hints->min_height = mMinWindowHeight;
+
+ XSetWMNormalHints(mSDL_Display, mSDL_XWindowID, hints);
+
+ XFree(hints);
+#endif
+}
+
BOOL LLWindowSDL::setCursorPosition(const LLCoordWindow position)
{
BOOL result = TRUE;
@@ -1840,11 +1880,15 @@ void LLWindowSDL::gatherInput()
break;
case SDL_VIDEORESIZE: // *FIX: handle this?
+ {
llinfos << "Handling a resize event: " << event.resize.w <<
"x" << event.resize.h << llendl;
+ S32 width = llmax(event.resize.w, (S32)mMinWindowWidth);
+ S32 height = llmax(event.resize.h, (S32)mMinWindowHeight);
+
// *FIX: I'm not sure this is necessary!
- mWindow = SDL_SetVideoMode(event.resize.w, event.resize.h, 32, mSDLFlags);
+ mWindow = SDL_SetVideoMode(width, height, 32, mSDLFlags);
if (!mWindow)
{
// *FIX: More informative dialog?
@@ -1857,10 +1901,10 @@ void LLWindowSDL::gatherInput()
}
break;
}
-
- mCallbacks->handleResize(this, event.resize.w, event.resize.h );
- break;
+ mCallbacks->handleResize(this, width, height);
+ break;
+ }
case SDL_ACTIVEEVENT:
if (event.active.state & SDL_APPINPUTFOCUS)
{
@@ -1911,6 +1955,8 @@ void LLWindowSDL::gatherInput()
break;
}
}
+
+ updateCursor();
#if LL_X11
// This is a good time to stop flashing the icon if our mFlashTimer has
@@ -1997,7 +2043,7 @@ static SDL_Cursor *makeSDLCursorFromBMP(const char *filename, int hotx, int hoty
return sdlcursor;
}
-void LLWindowSDL::setCursor(ECursorType cursor)
+void LLWindowSDL::updateCursor()
{
if (ATIbug) {
// cursor-updating is very flaky when this bug is
@@ -2005,11 +2051,11 @@ void LLWindowSDL::setCursor(ECursorType cursor)
return;
}
- if (mCurrentCursor != cursor)
+ if (mCurrentCursor != mNextCursor)
{
- if (cursor < UI_CURSOR_COUNT)
+ if (mNextCursor < UI_CURSOR_COUNT)
{
- SDL_Cursor *sdlcursor = mSDLCursors[cursor];
+ SDL_Cursor *sdlcursor = mSDLCursors[mNextCursor];
// Try to default to the arrow for any cursors that
// did not load correctly.
if (!sdlcursor && mSDLCursors[UI_CURSOR_ARROW])
@@ -2017,9 +2063,9 @@ void LLWindowSDL::setCursor(ECursorType cursor)
if (sdlcursor)
SDL_SetCursor(sdlcursor);
} else {
- llwarns << "Tried to set invalid cursor number " << cursor << llendl;
+ llwarns << "Tried to set invalid cursor number " << mNextCursor << llendl;
}
- mCurrentCursor = cursor;
+ mCurrentCursor = mNextCursor;
}
}
diff --git a/indra/llwindow/llwindowsdl.h b/indra/llwindow/llwindowsdl.h
index fa544b16ce..4e2a269ea3 100644
--- a/indra/llwindow/llwindowsdl.h
+++ b/indra/llwindow/llwindowsdl.h
@@ -63,7 +63,8 @@ public:
/*virtual*/ BOOL getSize(LLCoordScreen *size);
/*virtual*/ BOOL getSize(LLCoordWindow *size);
/*virtual*/ BOOL setPosition(LLCoordScreen position);
- /*virtual*/ BOOL setSize(LLCoordScreen size);
+ /*virtual*/ BOOL setSizeImpl(LLCoordScreen size);
+ /*virtual*/ BOOL setSizeImpl(LLCoordWindow size);
/*virtual*/ BOOL switchContext(BOOL fullscreen, const LLCoordScreen &size, BOOL disable_vsync, const LLCoordScreen * const posp = NULL);
/*virtual*/ BOOL setCursorPosition(LLCoordWindow position);
/*virtual*/ BOOL getCursorPosition(LLCoordWindow *position);
@@ -72,10 +73,11 @@ public:
/*virtual*/ void showCursorFromMouseMove();
/*virtual*/ void hideCursorUntilMouseMove();
/*virtual*/ BOOL isCursorHidden();
- /*virtual*/ void setCursor(ECursorType cursor);
+ /*virtual*/ void updateCursor();
/*virtual*/ void captureMouse();
/*virtual*/ void releaseMouse();
/*virtual*/ void setMouseClipping( BOOL b );
+ /*virtual*/ void setMinSize(U32 min_width, U32 min_height, bool enforce_immediately = true);
/*virtual*/ BOOL isClipboardTextAvailable();
/*virtual*/ BOOL pasteTextFromClipboard(LLWString &dst);
diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp
index 87075c7318..bc85acbf45 100644
--- a/indra/llwindow/llwindowwin32.cpp
+++ b/indra/llwindow/llwindowwin32.cpp
@@ -41,6 +41,7 @@
#include "llgl.h"
#include "llstring.h"
#include "lldir.h"
+#include "llglslshader.h"
// System includes
#include <commdlg.h>
@@ -500,6 +501,8 @@ LLWindowWin32::LLWindowWin32(LLWindowCallbacks* callbacks,
//-----------------------------------------------------------------------
DEVMODE dev_mode;
+ ::ZeroMemory(&dev_mode, sizeof(DEVMODE));
+ dev_mode.dmSize = sizeof(DEVMODE);
DWORD current_refresh;
if (EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &dev_mode))
{
@@ -544,7 +547,27 @@ LLWindowWin32::LLWindowWin32(LLWindowCallbacks* callbacks,
if (closest_refresh == 0)
{
LL_WARNS("Window") << "Couldn't find display mode " << width << " by " << height << " at " << BITS_PER_PIXEL << " bits per pixel" << LL_ENDL;
- success = FALSE;
+ //success = FALSE;
+
+ if (!EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &dev_mode))
+ {
+ success = FALSE;
+ }
+ else
+ {
+ if (dev_mode.dmBitsPerPel == BITS_PER_PIXEL)
+ {
+ LL_WARNS("Window") << "Current BBP is OK falling back to that" << LL_ENDL;
+ window_rect.right=width=dev_mode.dmPelsWidth;
+ window_rect.bottom=height=dev_mode.dmPelsHeight;
+ success = TRUE;
+ }
+ else
+ {
+ LL_WARNS("Window") << "Current BBP is BAD" << LL_ENDL;
+ success = FALSE;
+ }
+ }
}
// If we found a good resolution, use it.
@@ -839,7 +862,7 @@ BOOL LLWindowWin32::setPosition(const LLCoordScreen position)
return TRUE;
}
-BOOL LLWindowWin32::setSize(const LLCoordScreen size)
+BOOL LLWindowWin32::setSizeImpl(const LLCoordScreen size)
{
LLCoordScreen position;
@@ -849,24 +872,46 @@ BOOL LLWindowWin32::setSize(const LLCoordScreen size)
return FALSE;
}
+ WINDOWPLACEMENT placement;
+ placement.length = sizeof(WINDOWPLACEMENT);
+
+ if (!GetWindowPlacement(mWindowHandle, &placement)) return FALSE;
+
+ placement.showCmd = SW_RESTORE;
+
+ if (!SetWindowPlacement(mWindowHandle, &placement)) return FALSE;
+
moveWindow(position, size);
return TRUE;
}
+BOOL LLWindowWin32::setSizeImpl(const LLCoordWindow size)
+{
+ RECT window_rect = {0, 0, size.mX, size.mY };
+ DWORD dw_ex_style = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;
+ DWORD dw_style = WS_OVERLAPPEDWINDOW;
+
+ AdjustWindowRectEx(&window_rect, dw_style, FALSE, dw_ex_style);
+
+ return setSizeImpl(LLCoordScreen(window_rect.right - window_rect.left, window_rect.bottom - window_rect.top));
+}
+
// changing fullscreen resolution
BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BOOL disable_vsync, const LLCoordScreen * const posp)
{
GLuint pixel_format;
DEVMODE dev_mode;
+ ::ZeroMemory(&dev_mode, sizeof(DEVMODE));
+ dev_mode.dmSize = sizeof(DEVMODE);
DWORD current_refresh;
DWORD dw_ex_style;
DWORD dw_style;
- RECT window_rect;
+ RECT window_rect = {0, 0, 0, 0};
S32 width = size.mX;
S32 height = size.mY;
BOOL auto_show = FALSE;
- if (mhRC)
+ if (mhRC)
{
auto_show = TRUE;
resetDisplayResolution();
@@ -961,7 +1006,8 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO
dw_ex_style = WS_EX_APPWINDOW;
dw_style = WS_POPUP;
- // Move window borders out not to cover window contents
+ // Move window borders out not to cover window contents.
+ // This converts client rect to window rect, i.e. expands it by the window border size.
AdjustWindowRectEx(&window_rect, dw_style, FALSE, dw_ex_style);
}
// If it failed, we don't want to run fullscreen
@@ -989,6 +1035,7 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO
dw_style = WS_OVERLAPPEDWINDOW;
}
+
// don't post quit messages when destroying old windows
mPostQuit = FALSE;
@@ -1007,6 +1054,8 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO
mhInstance,
NULL);
+ LL_INFOS("Window") << "window is created." << llendl ;
+
//-----------------------------------------------------------------------
// Create GL drawing context
//-----------------------------------------------------------------------
@@ -1038,6 +1087,8 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO
return FALSE;
}
+ LL_INFOS("Window") << "Device context retrieved." << llendl ;
+
if (!(pixel_format = ChoosePixelFormat(mhDC, &pfd)))
{
close();
@@ -1046,6 +1097,8 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO
return FALSE;
}
+ LL_INFOS("Window") << "Pixel format chosen." << llendl ;
+
// Verify what pixel format we actually received.
if (!DescribePixelFormat(mhDC, pixel_format, sizeof(PIXELFORMATDESCRIPTOR),
&pfd))
@@ -1056,6 +1109,37 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO
return FALSE;
}
+ // (EXP-1765) dump pixel data to see if there is a pattern that leads to unreproducible crash
+ LL_INFOS("Window") << "--- begin pixel format dump ---" << llendl ;
+ LL_INFOS("Window") << "pixel_format is " << pixel_format << llendl ;
+ LL_INFOS("Window") << "pfd.nSize: " << pfd.nSize << llendl ;
+ LL_INFOS("Window") << "pfd.nVersion: " << pfd.nVersion << llendl ;
+ LL_INFOS("Window") << "pfd.dwFlags: 0x" << std::hex << pfd.dwFlags << std::dec << llendl ;
+ LL_INFOS("Window") << "pfd.iPixelType: " << (int)pfd.iPixelType << llendl ;
+ LL_INFOS("Window") << "pfd.cColorBits: " << (int)pfd.cColorBits << llendl ;
+ LL_INFOS("Window") << "pfd.cRedBits: " << (int)pfd.cRedBits << llendl ;
+ LL_INFOS("Window") << "pfd.cRedShift: " << (int)pfd.cRedShift << llendl ;
+ LL_INFOS("Window") << "pfd.cGreenBits: " << (int)pfd.cGreenBits << llendl ;
+ LL_INFOS("Window") << "pfd.cGreenShift: " << (int)pfd.cGreenShift << llendl ;
+ LL_INFOS("Window") << "pfd.cBlueBits: " << (int)pfd.cBlueBits << llendl ;
+ LL_INFOS("Window") << "pfd.cBlueShift: " << (int)pfd.cBlueShift << llendl ;
+ LL_INFOS("Window") << "pfd.cAlphaBits: " << (int)pfd.cAlphaBits << llendl ;
+ LL_INFOS("Window") << "pfd.cAlphaShift: " << (int)pfd.cAlphaShift << llendl ;
+ LL_INFOS("Window") << "pfd.cAccumBits: " << (int)pfd.cAccumBits << llendl ;
+ LL_INFOS("Window") << "pfd.cAccumRedBits: " << (int)pfd.cAccumRedBits << llendl ;
+ LL_INFOS("Window") << "pfd.cAccumGreenBits: " << (int)pfd.cAccumGreenBits << llendl ;
+ LL_INFOS("Window") << "pfd.cAccumBlueBits: " << (int)pfd.cAccumBlueBits << llendl ;
+ LL_INFOS("Window") << "pfd.cAccumAlphaBits: " << (int)pfd.cAccumAlphaBits << llendl ;
+ LL_INFOS("Window") << "pfd.cDepthBits: " << (int)pfd.cDepthBits << llendl ;
+ LL_INFOS("Window") << "pfd.cStencilBits: " << (int)pfd.cStencilBits << llendl ;
+ LL_INFOS("Window") << "pfd.cAuxBuffers: " << (int)pfd.cAuxBuffers << llendl ;
+ LL_INFOS("Window") << "pfd.iLayerType: " << (int)pfd.iLayerType << llendl ;
+ LL_INFOS("Window") << "pfd.bReserved: " << (int)pfd.bReserved << llendl ;
+ LL_INFOS("Window") << "pfd.dwLayerMask: " << pfd.dwLayerMask << llendl ;
+ LL_INFOS("Window") << "pfd.dwVisibleMask: " << pfd.dwVisibleMask << llendl ;
+ LL_INFOS("Window") << "pfd.dwDamageMask: " << pfd.dwDamageMask << llendl ;
+ LL_INFOS("Window") << "--- end pixel format dump ---" << llendl ;
+
if (pfd.cColorBits < 32)
{
close();
@@ -1096,8 +1180,10 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO
return FALSE;
}
- gGLManager.initWGL();
+ LL_INFOS("Window") << "Drawing context is created." << llendl ;
+ gGLManager.initWGL();
+
if (wglChoosePixelFormatARB)
{
// OK, at this point, use the ARB wglChoosePixelFormatsARB function to see if we
@@ -1148,8 +1234,39 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO
// First we try and get a 32 bit depth pixel format
BOOL result = wglChoosePixelFormatARB(mhDC, attrib_list, NULL, 256, pixel_formats, &num_formats);
+
+ while(!result && mFSAASamples > 0)
+ {
+ llwarns << "FSAASamples: " << mFSAASamples << " not supported." << llendl ;
+
+ mFSAASamples /= 2 ; //try to decrease sample pixel number until to disable anti-aliasing
+ if(mFSAASamples < 2)
+ {
+ mFSAASamples = 0 ;
+ }
+
+ if (mFSAASamples > 0)
+ {
+ attrib_list[end_attrib + 3] = mFSAASamples;
+ }
+ else
+ {
+ cur_attrib = end_attrib ;
+ end_attrib = 0 ;
+ attrib_list[cur_attrib++] = 0 ; //end
+ }
+ result = wglChoosePixelFormatARB(mhDC, attrib_list, NULL, 256, pixel_formats, &num_formats);
+
+ if(result)
+ {
+ llwarns << "Only support FSAASamples: " << mFSAASamples << llendl ;
+ }
+ }
+
if (!result)
{
+ llwarns << "mFSAASamples: " << mFSAASamples << llendl ;
+
close();
show_window_creation_error("Error after wglChoosePixelFormatARB 32-bit");
return FALSE;
@@ -1201,7 +1318,7 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO
LL_INFOS("Window") << "Choosing pixel formats: " << num_formats << " pixel formats returned" << LL_ENDL;
}
-
+ LL_INFOS("Window") << "pixel formats done." << llendl ;
S32 swap_method = 0;
S32 cur_format = num_formats-1;
@@ -1251,6 +1368,8 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO
mhInstance,
NULL);
+ LL_INFOS("Window") << "recreate window done." << llendl ;
+
if (!(mhDC = GetDC(mWindowHandle)))
{
close();
@@ -1323,7 +1442,53 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO
return FALSE;
}
- if (!(mhRC = wglCreateContext(mhDC)))
+ mhRC = 0;
+ if (wglCreateContextAttribsARB)
+ { //attempt to create a specific versioned context
+ S32 attribs[] =
+ { //start at 4.2
+ WGL_CONTEXT_MAJOR_VERSION_ARB, 4,
+ WGL_CONTEXT_MINOR_VERSION_ARB, 2,
+ WGL_CONTEXT_PROFILE_MASK_ARB, LLRender::sGLCoreProfile ? WGL_CONTEXT_CORE_PROFILE_BIT_ARB : WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB,
+ WGL_CONTEXT_FLAGS_ARB, gDebugGL ? WGL_CONTEXT_DEBUG_BIT_ARB : 0,
+ 0
+ };
+
+ bool done = false;
+ while (!done)
+ {
+ mhRC = wglCreateContextAttribsARB(mhDC, mhRC, attribs);
+
+ if (!mhRC)
+ {
+ if (attribs[3] > 0)
+ { //decrement minor version
+ attribs[3]--;
+ }
+ else if (attribs[1] > 3)
+ { //decrement major version and start minor version over at 3
+ attribs[1]--;
+ attribs[3] = 3;
+ }
+ else
+ { //we reached 3.0 and still failed, bail out
+ done = true;
+ }
+ }
+ else
+ {
+ llinfos << "Created OpenGL " << llformat("%d.%d", attribs[1], attribs[3]) << " context." << llendl;
+ done = true;
+
+ if (LLRender::sGLCoreProfile)
+ {
+ LLGLSLShader::sNoFixedFunction = true;
+ }
+ }
+ }
+ }
+
+ if (!mhRC && !(mhRC = wglCreateContext(mhDC)))
{
close();
OSMessageBox(mCallbacks->translateString("MBGLContextErr"), mCallbacks->translateString("MBError"), OSMB_OK);
@@ -1343,7 +1508,7 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO
OSMessageBox(mCallbacks->translateString("MBVideoDrvErr"), mCallbacks->translateString("MBError"), OSMB_OK);
return FALSE;
}
-
+
// Disable vertical sync for swap
if (disable_vsync && wglSwapIntervalEXT)
{
@@ -1402,24 +1567,16 @@ void LLWindowWin32::moveWindow( const LLCoordScreen& position, const LLCoordScre
BOOL LLWindowWin32::setCursorPosition(const LLCoordWindow position)
{
- LLCoordScreen screen_pos;
-
mMousePositionModified = TRUE;
if (!mWindowHandle)
{
return FALSE;
}
- if (!convertCoords(position, &screen_pos))
- {
- return FALSE;
- }
// Inform the application of the new mouse position (needed for per-frame
// hover/picking to function).
- LLCoordGL gl_pos;
- convertCoords(position, &gl_pos);
- mCallbacks->handleMouseMove(this, gl_pos, (MASK)0);
+ mCallbacks->handleMouseMove(this, position.convert(), (MASK)0);
// DEV-18951 VWR-8524 Camera moves wildly when alt-clicking.
// Because we have preemptively notified the application of the new
@@ -1429,24 +1586,23 @@ BOOL LLWindowWin32::setCursorPosition(const LLCoordWindow position)
while (PeekMessage(&msg, NULL, WM_MOUSEMOVE, WM_MOUSEMOVE, PM_REMOVE))
{ }
- return SetCursorPos(screen_pos.mX, screen_pos.mY);
+ LLCoordScreen screen_pos(position.convert());
+ return ::SetCursorPos(screen_pos.mX, screen_pos.mY);
}
BOOL LLWindowWin32::getCursorPosition(LLCoordWindow *position)
{
POINT cursor_point;
- LLCoordScreen screen_pos;
- if (!mWindowHandle ||
- !GetCursorPos(&cursor_point))
+ if (!mWindowHandle
+ || !GetCursorPos(&cursor_point)
+ || !position)
{
return FALSE;
}
- screen_pos.mX = cursor_point.x;
- screen_pos.mY = cursor_point.y;
-
- return convertCoords(screen_pos, position);
+ *position = LLCoordScreen(cursor_point.x, cursor_point.y).convert();
+ return TRUE;
}
void LLWindowWin32::hideCursor()
@@ -1559,18 +1715,18 @@ void LLWindowWin32::initCursors()
-void LLWindowWin32::setCursor(ECursorType cursor)
+void LLWindowWin32::updateCursor()
{
- if (cursor == UI_CURSOR_ARROW
+ if (mNextCursor == UI_CURSOR_ARROW
&& mBusyCount > 0)
{
- cursor = UI_CURSOR_WORKING;
+ mNextCursor = UI_CURSOR_WORKING;
}
- if( mCurrentCursor != cursor )
+ if( mCurrentCursor != mNextCursor )
{
- mCurrentCursor = cursor;
- SetCursor( mCursor[cursor] );
+ mCurrentCursor = mNextCursor;
+ SetCursor( mCursor[mNextCursor] );
}
}
@@ -1608,7 +1764,7 @@ void LLWindowWin32::gatherInput()
LLMemType m1(LLMemType::MTYPE_GATHER_INPUT);
- while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) && msg_count < MAX_MESSAGE_PER_UPDATE)
+ while ((msg_count < MAX_MESSAGE_PER_UPDATE) && PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
mCallbacks->handlePingWatchdog(this, "Main:TranslateGatherInput");
TranslateMessage(&msg);
@@ -1652,6 +1808,8 @@ void LLWindowWin32::gatherInput()
mInputProcessingPaused = FALSE;
+ updateCursor();
+
// clear this once we've processed all mouse messages that might have occurred after
// we slammed the mouse position
mMousePositionModified = FALSE;
@@ -1662,6 +1820,10 @@ static LLFastTimer::DeclareTimer FTM_MOUSEHANDLER("Handle Mouse");
LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_param, LPARAM l_param)
{
+ // Ignore clicks not originated in the client area, i.e. mouse-up events not preceded with a WM_LBUTTONDOWN.
+ // This helps prevent avatar walking after maximizing the window by double-clicking the title bar.
+ static bool sHandleLeftMouseUp = true;
+
LLWindowWin32 *window_imp = (LLWindowWin32 *)GetWindowLong(h_wnd, GWL_USERDATA);
@@ -2008,10 +2170,20 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_
window_imp->handleUnicodeUTF16((U16)w_param, gKeyboard->currentMask(FALSE));
return 0;
+ case WM_NCLBUTTONDOWN:
+ {
+ window_imp->mCallbacks->handlePingWatchdog(window_imp, "Main:WM_NCLBUTTONDOWN");
+ // A click in a non-client area, e.g. title bar or window border.
+ sHandleLeftMouseUp = false;
+ }
+ break;
+
case WM_LBUTTONDOWN:
{
window_imp->mCallbacks->handlePingWatchdog(window_imp, "Main:WM_LBUTTONDOWN");
LLFastTimer t2(FTM_MOUSEHANDLER);
+ sHandleLeftMouseUp = true;
+
if (LLWinImm::isAvailable() && window_imp->mPreeditor)
{
window_imp->interruptLanguageTextInput();
@@ -2022,15 +2194,15 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_
// If we don't do this, many clicks could get buffered up, and if the
// first click changes the cursor position, all subsequent clicks
// will occur at the wrong location. JC
- LLCoordWindow cursor_coord_window;
if (window_imp->mMousePositionModified)
{
+ LLCoordWindow cursor_coord_window;
window_imp->getCursorPosition(&cursor_coord_window);
- window_imp->convertCoords(cursor_coord_window, &gl_coord);
+ gl_coord = cursor_coord_window.convert();
}
else
{
- window_imp->convertCoords(window_coord, &gl_coord);
+ gl_coord = window_coord.convert();
}
MASK mask = gKeyboard->currentMask(TRUE);
// generate move event to update mouse coordinates
@@ -2052,15 +2224,15 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_
// If we don't do this, many clicks could get buffered up, and if the
// first click changes the cursor position, all subsequent clicks
// will occur at the wrong location. JC
- LLCoordWindow cursor_coord_window;
if (window_imp->mMousePositionModified)
{
+ LLCoordWindow cursor_coord_window;
window_imp->getCursorPosition(&cursor_coord_window);
- window_imp->convertCoords(cursor_coord_window, &gl_coord);
+ gl_coord = cursor_coord_window.convert();
}
else
{
- window_imp->convertCoords(window_coord, &gl_coord);
+ gl_coord = window_coord.convert();
}
MASK mask = gKeyboard->currentMask(TRUE);
// generate move event to update mouse coordinates
@@ -2076,6 +2248,13 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_
{
window_imp->mCallbacks->handlePingWatchdog(window_imp, "Main:WM_LBUTTONUP");
LLFastTimer t2(FTM_MOUSEHANDLER);
+
+ if (!sHandleLeftMouseUp)
+ {
+ sHandleLeftMouseUp = true;
+ break;
+ }
+
//if (gDebugClicks)
//{
// LL_INFOS("Window") << "WndProc left button up" << LL_ENDL;
@@ -2085,15 +2264,15 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_
// If we don't do this, many clicks could get buffered up, and if the
// first click changes the cursor position, all subsequent clicks
// will occur at the wrong location. JC
- LLCoordWindow cursor_coord_window;
if (window_imp->mMousePositionModified)
{
+ LLCoordWindow cursor_coord_window;
window_imp->getCursorPosition(&cursor_coord_window);
- window_imp->convertCoords(cursor_coord_window, &gl_coord);
+ gl_coord = cursor_coord_window.convert();
}
else
{
- window_imp->convertCoords(window_coord, &gl_coord);
+ gl_coord = window_coord.convert();
}
MASK mask = gKeyboard->currentMask(TRUE);
// generate move event to update mouse coordinates
@@ -2120,15 +2299,15 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_
// If we don't do this, many clicks could get buffered up, and if the
// first click changes the cursor position, all subsequent clicks
// will occur at the wrong location. JC
- LLCoordWindow cursor_coord_window;
if (window_imp->mMousePositionModified)
{
+ LLCoordWindow cursor_coord_window;
window_imp->getCursorPosition(&cursor_coord_window);
- window_imp->convertCoords(cursor_coord_window, &gl_coord);
+ gl_coord = cursor_coord_window.convert();
}
else
{
- window_imp->convertCoords(window_coord, &gl_coord);
+ gl_coord = window_coord.convert();
}
MASK mask = gKeyboard->currentMask(TRUE);
// generate move event to update mouse coordinates
@@ -2149,15 +2328,15 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_
// If we don't do this, many clicks could get buffered up, and if the
// first click changes the cursor position, all subsequent clicks
// will occur at the wrong location. JC
- LLCoordWindow cursor_coord_window;
if (window_imp->mMousePositionModified)
{
+ LLCoordWindow cursor_coord_window;
window_imp->getCursorPosition(&cursor_coord_window);
- window_imp->convertCoords(cursor_coord_window, &gl_coord);
+ gl_coord = cursor_coord_window.convert();
}
else
{
- window_imp->convertCoords(window_coord, &gl_coord);
+ gl_coord = window_coord.convert();
}
MASK mask = gKeyboard->currentMask(TRUE);
// generate move event to update mouse coordinates
@@ -2184,15 +2363,15 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_
// If we don't do this, many clicks could get buffered up, and if the
// first click changes the cursor position, all subsequent clicks
// will occur at the wrong location. JC
- LLCoordWindow cursor_coord_window;
if (window_imp->mMousePositionModified)
{
+ LLCoordWindow cursor_coord_window;
window_imp->getCursorPosition(&cursor_coord_window);
- window_imp->convertCoords(cursor_coord_window, &gl_coord);
+ gl_coord = cursor_coord_window.convert();
}
else
{
- window_imp->convertCoords(window_coord, &gl_coord);
+ gl_coord = window_coord.convert();
}
MASK mask = gKeyboard->currentMask(TRUE);
// generate move event to update mouse coordinates
@@ -2213,15 +2392,15 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_
// If we don't do this, many clicks could get buffered up, and if the
// first click changes the cursor position, all subsequent clicks
// will occur at the wrong location. JC
- LLCoordWindow cursor_coord_window;
if (window_imp->mMousePositionModified)
{
+ LLCoordWindow cursor_coord_window;
window_imp->getCursorPosition(&cursor_coord_window);
- window_imp->convertCoords(cursor_coord_window, &gl_coord);
+ gl_coord = cursor_coord_window.convert();
}
else
{
- window_imp->convertCoords(window_coord, &gl_coord);
+ gl_coord = window_coord.convert();
}
MASK mask = gKeyboard->currentMask(TRUE);
// generate move event to update mouse coordinates
@@ -2293,9 +2472,16 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_
case WM_MOUSEMOVE:
{
window_imp->mCallbacks->handlePingWatchdog(window_imp, "Main:WM_MOUSEMOVE");
- window_imp->convertCoords(window_coord, &gl_coord);
MASK mask = gKeyboard->currentMask(TRUE);
- window_imp->mCallbacks->handleMouseMove(window_imp, gl_coord, mask);
+ window_imp->mCallbacks->handleMouseMove(window_imp, window_coord.convert(), mask);
+ return 0;
+ }
+
+ case WM_GETMINMAXINFO:
+ {
+ LPMINMAXINFO min_max = (LPMINMAXINFO)l_param;
+ min_max->ptMinTrackSize.x = window_imp->mMinWindowWidth;
+ min_max->ptMinTrackSize.y = window_imp->mMinWindowHeight;
return 0;
}
@@ -2691,6 +2877,8 @@ LLWindow::LLWindowResolution* LLWindowWin32::getSupportedResolutions(S32 &num_re
{
mSupportedResolutions = new LLWindowResolution[MAX_NUM_RESOLUTIONS];
DEVMODE dev_mode;
+ ::ZeroMemory(&dev_mode, sizeof(DEVMODE));
+ dev_mode.dmSize = sizeof(DEVMODE);
mNumSupportedResolutions = 0;
for (S32 mode_num = 0; mNumSupportedResolutions < MAX_NUM_RESOLUTIONS; mode_num++)
@@ -2766,7 +2954,8 @@ F32 LLWindowWin32::getPixelAspectRatio()
BOOL LLWindowWin32::setDisplayResolution(S32 width, S32 height, S32 bits, S32 refresh)
{
DEVMODE dev_mode;
- dev_mode.dmSize = sizeof(dev_mode);
+ ::ZeroMemory(&dev_mode, sizeof(DEVMODE));
+ dev_mode.dmSize = sizeof(DEVMODE);
BOOL success = FALSE;
// Don't change anything if we don't have to
@@ -3172,7 +3361,7 @@ void LLWindowWin32::setLanguageTextInput( const LLCoordGL & position )
LLWinImm::setCompositionWindow( himc, &ime_form );
- sWinIMEWindowPosition.set( win_pos.mX, win_pos.mY );
+ sWinIMEWindowPosition = win_pos;
}
LLWinImm::releaseContext(mWindowHandle, himc);
diff --git a/indra/llwindow/llwindowwin32.h b/indra/llwindow/llwindowwin32.h
index 387e4cbdb6..54c9ac4d4d 100644
--- a/indra/llwindow/llwindowwin32.h
+++ b/indra/llwindow/llwindowwin32.h
@@ -57,7 +57,8 @@ public:
/*virtual*/ BOOL getSize(LLCoordScreen *size);
/*virtual*/ BOOL getSize(LLCoordWindow *size);
/*virtual*/ BOOL setPosition(LLCoordScreen position);
- /*virtual*/ BOOL setSize(LLCoordScreen size);
+ /*virtual*/ BOOL setSizeImpl(LLCoordScreen size);
+ /*virtual*/ BOOL setSizeImpl(LLCoordWindow size);
/*virtual*/ BOOL switchContext(BOOL fullscreen, const LLCoordScreen &size, BOOL disable_vsync, const LLCoordScreen * const posp = NULL);
/*virtual*/ BOOL setCursorPosition(LLCoordWindow position);
/*virtual*/ BOOL getCursorPosition(LLCoordWindow *position);
@@ -66,7 +67,7 @@ public:
/*virtual*/ void showCursorFromMouseMove();
/*virtual*/ void hideCursorUntilMouseMove();
/*virtual*/ BOOL isCursorHidden();
- /*virtual*/ void setCursor(ECursorType cursor);
+ /*virtual*/ void updateCursor();
/*virtual*/ ECursorType getCursor() const;
/*virtual*/ void captureMouse();
/*virtual*/ void releaseMouse();
diff --git a/indra/llxml/CMakeLists.txt b/indra/llxml/CMakeLists.txt
index eb5166ee71..beefcda361 100644
--- a/indra/llxml/CMakeLists.txt
+++ b/indra/llxml/CMakeLists.txt
@@ -45,27 +45,25 @@ target_link_libraries( llxml
${EXPAT_LIBRARIES}
)
+# tests
-if(LL_TESTS)
- # tests
+if (LL_TESTS)
+ # unit tests
- # unit tests
-
- SET(llxml_TEST_SOURCE_FILES
+ SET(llxml_TEST_SOURCE_FILES
# none yet!
)
- LL_ADD_PROJECT_UNIT_TESTS(llxml "${llxml_TEST_SOURCE_FILES}")
+ LL_ADD_PROJECT_UNIT_TESTS(llxml "${llxml_TEST_SOURCE_FILES}")
- # integration tests
+ # integration tests
- # set(TEST_DEBUG on)
- set(test_libs
+ # set(TEST_DEBUG on)
+ set(test_libs
${LLXML_LIBRARIES}
${WINDOWS_LIBRARIES}
${LLMATH_LIBRARIES}
${LLCOMMON_LIBRARIES}
)
- LL_ADD_INTEGRATION_TEST(llcontrol "" "${test_libs}")
-
-endif(LL_TESTS)
+ LL_ADD_INTEGRATION_TEST(llcontrol "" "${test_libs}")
+endif (LL_TESTS)
diff --git a/indra/llxml/llcontrol.cpp b/indra/llxml/llcontrol.cpp
index 27c694dde9..0809d95628 100644
--- a/indra/llxml/llcontrol.cpp
+++ b/indra/llxml/llcontrol.cpp
@@ -170,6 +170,20 @@ LLSD LLControlVariable::getComparableValue(const LLSD& value)
storable_value = false;
}
}
+ else if (TYPE_LLSD == type() && value.isString())
+ {
+ LLPointer<LLSDNotationParser> parser = new LLSDNotationParser;
+ LLSD result;
+ std::stringstream value_stream(value.asString());
+ if (parser->parse(value_stream, result, LLSDSerialize::SIZE_UNLIMITED) != LLSDParser::PARSE_FAILURE)
+ {
+ storable_value = result;
+ }
+ else
+ {
+ storable_value = value;
+ }
+ }
else
{
storable_value = value;
@@ -821,11 +835,9 @@ U32 LLControlGroup::saveToFile(const std::string& filename, BOOL nondefault_only
return num_saved;
}
-U32 LLControlGroup::loadFromFile(const std::string& filename, bool set_default_values)
+U32 LLControlGroup::loadFromFile(const std::string& filename, bool set_default_values, bool save_values)
{
- std::string name;
LLSD settings;
- LLSD control_map;
llifstream infile;
infile.open(filename);
if(!infile.is_open())
@@ -849,8 +861,8 @@ U32 LLControlGroup::loadFromFile(const std::string& filename, bool set_default_v
for(LLSD::map_const_iterator itr = settings.beginMap(); itr != settings.endMap(); ++itr)
{
bool persist = true;
- name = (*itr).first;
- control_map = (*itr).second;
+ std::string const & name = itr->first;
+ LLSD const & control_map = itr->second;
if(control_map.has("Persist"))
{
@@ -894,8 +906,7 @@ U32 LLControlGroup::loadFromFile(const std::string& filename, bool set_default_v
}
else if(existing_control->isPersisted())
{
-
- existing_control->setValue(control_map["Value"]);
+ existing_control->setValue(control_map["Value"], save_values);
}
// *NOTE: If not persisted and not setting defaults,
// the value should not get loaded.
diff --git a/indra/llxml/llcontrol.h b/indra/llxml/llcontrol.h
index 93975579cc..597031ec70 100644
--- a/indra/llxml/llcontrol.h
+++ b/indra/llxml/llcontrol.h
@@ -92,6 +92,8 @@ typedef enum e_control_type
class LLControlVariable : public LLRefCount
{
+ LOG_CLASS(LLControlVariable);
+
friend class LLControlGroup;
public:
@@ -180,14 +182,17 @@ T convert_from_llsd(const LLSD& sd, eControlType type, const std::string& contro
//const U32 STRING_CACHE_SIZE = 10000;
class LLControlGroup : public LLInstanceTracker<LLControlGroup, std::string>
{
+ LOG_CLASS(LLControlGroup);
+
protected:
typedef std::map<std::string, LLControlVariablePtr > ctrl_name_table_t;
ctrl_name_table_t mNameTable;
std::string mTypeString[TYPE_COUNT];
+public:
eControlType typeStringToEnum(const std::string& typestr);
std::string typeEnumToString(eControlType typeenum);
-public:
+
LLControlGroup(const std::string& name);
~LLControlGroup();
void cleanup();
@@ -289,7 +294,7 @@ public:
// as the given type.
U32 loadFromFileLegacy(const std::string& filename, BOOL require_declaration = TRUE, eControlType declare_as = TYPE_STRING);
U32 saveToFile(const std::string& filename, BOOL nondefault_only);
- U32 loadFromFile(const std::string& filename, bool default_values = false);
+ U32 loadFromFile(const std::string& filename, bool default_values = false, bool save_values = true);
void resetToDefaults();
};
@@ -385,7 +390,8 @@ class LLCachedControl
{
public:
LLCachedControl(LLControlGroup& group,
- const std::string& name,
+ const std::string& name,
+
const T& default_value,
const std::string& comment = "Declared In Code")
{
diff --git a/indra/llxml/llxmlnode.cpp b/indra/llxml/llxmlnode.cpp
index 8168f968cd..2ffb0d8503 100644
--- a/indra/llxml/llxmlnode.cpp
+++ b/indra/llxml/llxmlnode.cpp
@@ -631,13 +631,14 @@ bool LLXMLNode::updateNode(
}
//update all of node's children with updateNodes children that match name
- LLXMLNodePtr child;
+ LLXMLNodePtr child = node->getFirstChild();
+ LLXMLNodePtr last_child = child;
LLXMLNodePtr updateChild;
for (updateChild = update_node->getFirstChild(); updateChild.notNull();
updateChild = updateChild->getNextSibling())
{
- for (child = node->getFirstChild(); child.notNull(); child = child->getNextSibling())
+ while(child.notNull())
{
std::string nodeName;
std::string updateName;
@@ -656,6 +657,22 @@ bool LLXMLNode::updateNode(
if ((nodeName != "") && (updateName == nodeName))
{
updateNode(child, updateChild);
+ last_child = child;
+ child = child->getNextSibling();
+ if (child.isNull())
+ {
+ child = node->getFirstChild();
+ }
+ break;
+ }
+
+ child = child->getNextSibling();
+ if (child.isNull())
+ {
+ child = node->getFirstChild();
+ }
+ if (child == last_child)
+ {
break;
}
}
@@ -693,7 +710,7 @@ bool LLXMLNode::parseFile(const std::string& filename, LLXMLNodePtr& node, LLXML
LLFILE* fp = LLFile::fopen(filename, "rb"); /* Flawfinder: ignore */
if (fp == NULL)
{
- node = new LLXMLNode();
+ node = NULL ;
return false;
}
fseek(fp, 0, SEEK_END);
@@ -746,7 +763,7 @@ bool LLXMLNode::parseBuffer(
{
llwarns << "Parse failure - wrong number of top-level nodes xml."
<< llendl;
- node = new LLXMLNode();
+ node = NULL ;
return false;
}
@@ -784,7 +801,7 @@ bool LLXMLNode::parseStream(
while(str.good())
{
str.read((char*)buffer, BUFSIZE);
- int count = str.gcount();
+ int count = (int)str.gcount();
if (XML_Parse(my_parser, (const char *)buffer, count, !str.good()) != XML_STATUS_OK)
{
@@ -805,7 +822,7 @@ bool LLXMLNode::parseStream(
{
llwarns << "Parse failure - wrong number of top-level nodes xml."
<< llendl;
- node = new LLXMLNode();
+ node = NULL;
return false;
}
@@ -859,23 +876,21 @@ BOOL LLXMLNode::isFullyDefault()
}
// static
-bool LLXMLNode::getLayeredXMLNode(const std::string &xui_filename, LLXMLNodePtr& root,
+bool LLXMLNode::getLayeredXMLNode(LLXMLNodePtr& root,
const std::vector<std::string>& paths)
{
- std::string full_filename = gDirUtilp->findSkinnedFilename(paths.front(), xui_filename);
- if (full_filename.empty())
+ if (paths.empty()) return false;
+
+ std::string filename = paths.front();
+ if (filename.empty())
{
return false;
}
-
- if (!LLXMLNode::parseFile(full_filename, root, NULL))
+
+ if (!LLXMLNode::parseFile(filename, root, NULL))
{
- // try filename as passed in since sometimes we load an xml file from a user-supplied path
- if (!LLXMLNode::parseFile(xui_filename, root, NULL))
- {
- llwarns << "Problem reading UI description file: " << xui_filename << llendl;
- return false;
- }
+ llwarns << "Problem reading UI description file: " << filename << llendl;
+ return false;
}
LLXMLNodePtr updateRoot;
@@ -884,11 +899,8 @@ bool LLXMLNode::getLayeredXMLNode(const std::string &xui_filename, LLXMLNodePtr&
for (itor = paths.begin(), ++itor; itor != paths.end(); ++itor)
{
- std::string nodeName;
- std::string updateName;
-
- std::string layer_filename = gDirUtilp->findSkinnedFilename((*itor), xui_filename);
- if(layer_filename.empty())
+ std::string layer_filename = *itor;
+ if(layer_filename.empty() || layer_filename == filename)
{
// no localized version of this file, that's ok, keep looking
continue;
@@ -896,10 +908,13 @@ bool LLXMLNode::getLayeredXMLNode(const std::string &xui_filename, LLXMLNodePtr&
if (!LLXMLNode::parseFile(layer_filename, updateRoot, NULL))
{
- llwarns << "Problem reading localized UI description file: " << (*itor) + gDirUtilp->getDirDelimiter() + xui_filename << llendl;
+ llwarns << "Problem reading localized UI description file: " << layer_filename << llendl;
return false;
}
+ std::string nodeName;
+ std::string updateName;
+
updateRoot->getAttributeString("name", updateName);
root->getAttributeString("name", nodeName);
@@ -1208,7 +1223,7 @@ bool LLXMLNode::getChild(const LLStringTableEntry* name, LLXMLNodePtr& node, BOO
{
return mDefault->getChild(name, node, FALSE);
}
- node = new LLXMLNode();
+ node = NULL;
return false;
}
@@ -1279,7 +1294,7 @@ bool LLXMLNode::getAttribute(const LLStringTableEntry* name, LLXMLNodePtr& node,
{
return mDefault->getAttribute(name, node, FALSE);
}
- node = new LLXMLNode();
+
return false;
}
diff --git a/indra/llxml/llxmlnode.h b/indra/llxml/llxmlnode.h
index 9df37ccb6f..e3da7169e7 100644
--- a/indra/llxml/llxmlnode.h
+++ b/indra/llxml/llxmlnode.h
@@ -149,8 +149,7 @@ public:
LLXMLNodePtr& update_node);
static LLXMLNodePtr replaceNode(LLXMLNodePtr node, LLXMLNodePtr replacement_node);
- static bool getLayeredXMLNode(const std::string &xui_filename, LLXMLNodePtr& root,
- const std::vector<std::string>& paths);
+ static bool getLayeredXMLNode(LLXMLNodePtr& root, const std::vector<std::string>& paths);
// Write standard XML file header:
diff --git a/indra/llxuixml/llinitparam.cpp b/indra/llxuixml/llinitparam.cpp
index 2c92539387..db72aa19b9 100644
--- a/indra/llxuixml/llinitparam.cpp
+++ b/indra/llxuixml/llinitparam.cpp
@@ -40,7 +40,46 @@ namespace LLInitParam
{
const U8* my_addr = reinterpret_cast<const U8*>(this);
const U8* block_addr = reinterpret_cast<const U8*>(enclosing_block);
- mEnclosingBlockOffset = (U16)(my_addr - block_addr);
+ mEnclosingBlockOffset = 0x7FFFffff & (U32)(my_addr - block_addr);
+ }
+
+ //
+ // ParamDescriptor
+ //
+ ParamDescriptor::ParamDescriptor(param_handle_t p,
+ merge_func_t merge_func,
+ deserialize_func_t deserialize_func,
+ serialize_func_t serialize_func,
+ validation_func_t validation_func,
+ inspect_func_t inspect_func,
+ S32 min_count,
+ S32 max_count)
+ : mParamHandle(p),
+ mMergeFunc(merge_func),
+ mDeserializeFunc(deserialize_func),
+ mSerializeFunc(serialize_func),
+ mValidationFunc(validation_func),
+ mInspectFunc(inspect_func),
+ mMinCount(min_count),
+ mMaxCount(max_count),
+ mUserData(NULL)
+ {}
+
+ ParamDescriptor::ParamDescriptor()
+ : mParamHandle(0),
+ mMergeFunc(NULL),
+ mDeserializeFunc(NULL),
+ mSerializeFunc(NULL),
+ mValidationFunc(NULL),
+ mInspectFunc(NULL),
+ mMinCount(0),
+ mMaxCount(0),
+ mUserData(NULL)
+ {}
+
+ ParamDescriptor::~ParamDescriptor()
+ {
+ delete mUserData;
}
//
@@ -73,14 +112,10 @@ namespace LLInitParam
std::copy(src_block_data.mAllParams.begin(), src_block_data.mAllParams.end(), std::back_inserter(mAllParams));
}
- //
- // BaseBlock
- //
- BaseBlock::BaseBlock()
- : mChangeVersion(0)
- {}
-
- BaseBlock::~BaseBlock()
+ BlockDescriptor::BlockDescriptor()
+ : mMaxParamOffset(0),
+ mInitializationState(UNINITIALIZED),
+ mCurrentBlockPtr(NULL)
{}
// called by each derived class in least to most derived order
@@ -113,9 +148,9 @@ namespace LLInitParam
return (param_address - baseblock_address);
}
- bool BaseBlock::submitValue(const Parser::name_stack_t& name_stack, Parser& p, bool silent)
+ bool BaseBlock::submitValue(Parser::name_stack_t& name_stack, Parser& p, bool silent)
{
- if (!deserializeBlock(p, std::make_pair(name_stack.begin(), name_stack.end())))
+ if (!deserializeBlock(p, std::make_pair(name_stack.begin(), name_stack.end()), true))
{
if (!silent)
{
@@ -145,7 +180,7 @@ namespace LLInitParam
return true;
}
- bool BaseBlock::serializeBlock(Parser& parser, Parser::name_stack_t name_stack, const LLInitParam::BaseBlock* diff_block) const
+ void BaseBlock::serializeBlock(Parser& parser, Parser::name_stack_t& name_stack, const LLInitParam::BaseBlock* diff_block) const
{
// named param is one like LLView::Params::follows
// unnamed param is like LLView::Params::rect - implicit
@@ -164,8 +199,7 @@ namespace LLInitParam
// each param descriptor remembers its serial number
// so we can inspect the same param under different names
// and see that it has the same number
- (*it)->mGeneration = parser.newParseGeneration();
- name_stack.push_back(std::make_pair("", (*it)->mGeneration));
+ name_stack.push_back(std::make_pair("", true));
serialize_func(*param, parser, name_stack, diff_param);
name_stack.pop_back();
}
@@ -201,22 +235,15 @@ namespace LLInitParam
continue;
}
- if (!duplicate)
- {
- it->second->mGeneration = parser.newParseGeneration();
- }
-
- name_stack.push_back(std::make_pair(it->first, it->second->mGeneration));
+ name_stack.push_back(std::make_pair(it->first, !duplicate));
const Param* diff_param = diff_block ? diff_block->getParamFromHandle(param_handle) : NULL;
serialize_func(*param, parser, name_stack, diff_param);
name_stack.pop_back();
}
}
-
- return true;
}
- bool BaseBlock::inspectBlock(Parser& parser, Parser::name_stack_t name_stack) const
+ bool BaseBlock::inspectBlock(Parser& parser, Parser::name_stack_t name_stack, S32 min_count, S32 max_count) const
{
// named param is one like LLView::Params::follows
// unnamed param is like LLView::Params::rect - implicit
@@ -231,8 +258,7 @@ namespace LLInitParam
ParamDescriptor::inspect_func_t inspect_func = (*it)->mInspectFunc;
if (inspect_func)
{
- (*it)->mGeneration = parser.newParseGeneration();
- name_stack.push_back(std::make_pair("", (*it)->mGeneration));
+ name_stack.push_back(std::make_pair("", true));
inspect_func(*param, parser, name_stack, (*it)->mMinCount, (*it)->mMaxCount);
name_stack.pop_back();
}
@@ -260,11 +286,7 @@ namespace LLInitParam
}
}
- if (!duplicate)
- {
- it->second->mGeneration = parser.newParseGeneration();
- }
- name_stack.push_back(std::make_pair(it->first, it->second->mGeneration));
+ name_stack.push_back(std::make_pair(it->first, !duplicate));
inspect_func(*param, parser, name_stack, it->second->mMinCount, it->second->mMaxCount);
name_stack.pop_back();
}
@@ -273,14 +295,18 @@ namespace LLInitParam
return true;
}
- bool BaseBlock::deserializeBlock(Parser& p, Parser::name_stack_range_t name_stack)
+ bool BaseBlock::deserializeBlock(Parser& p, Parser::name_stack_range_t name_stack_range, bool ignored)
{
BlockDescriptor& block_data = mostDerivedBlockDescriptor();
- bool names_left = name_stack.first != name_stack.second;
+ bool names_left = name_stack_range.first != name_stack_range.second;
+
+ bool new_name = names_left
+ ? name_stack_range.first->second
+ : true;
if (names_left)
{
- const std::string& top_name = name_stack.first->first;
+ const std::string& top_name = name_stack_range.first->first;
ParamDescriptor::deserialize_func_t deserialize_func = NULL;
Param* paramp = NULL;
@@ -292,9 +318,18 @@ namespace LLInitParam
paramp = getParamFromHandle(found_it->second->mParamHandle);
deserialize_func = found_it->second->mDeserializeFunc;
- Parser::name_stack_range_t new_name_stack(name_stack.first, name_stack.second);
+ Parser::name_stack_range_t new_name_stack(name_stack_range.first, name_stack_range.second);
++new_name_stack.first;
- return deserialize_func(*paramp, p, new_name_stack, name_stack.first == name_stack.second ? -1 : name_stack.first->second);
+ if (deserialize_func(*paramp, p, new_name_stack, new_name))
+ {
+ // value is no longer new, we know about it now
+ name_stack_range.first->second = false;
+ return true;
+ }
+ else
+ {
+ return false;
+ }
}
}
@@ -306,42 +341,50 @@ namespace LLInitParam
Param* paramp = getParamFromHandle((*it)->mParamHandle);
ParamDescriptor::deserialize_func_t deserialize_func = (*it)->mDeserializeFunc;
- if (deserialize_func && deserialize_func(*paramp, p, name_stack, name_stack.first == name_stack.second ? -1 : name_stack.first->second))
+ if (deserialize_func && deserialize_func(*paramp, p, name_stack_range, new_name))
{
return true;
}
}
+ // if no match, and no names left on stack, this is just an existence assertion of this block
+ // verify by calling readValue with NoParamValue type, an inherently unparseable type
+ if (!names_left)
+ {
+ Flag no_value;
+ return p.readValue(no_value);
+ }
+
return false;
}
//static
- void BaseBlock::addParam(BlockDescriptor& block_data, const ParamDescriptor& in_param, const char* char_name)
+ void BaseBlock::addParam(BlockDescriptor& block_data, const ParamDescriptorPtr in_param, const char* char_name)
{
- // create a copy of the paramdescriptor in allparams
+ // create a copy of the param descriptor in mAllParams
// so other data structures can store a pointer to it
block_data.mAllParams.push_back(in_param);
- ParamDescriptor& param(block_data.mAllParams.back());
+ ParamDescriptorPtr param(block_data.mAllParams.back());
std::string name(char_name);
- if ((size_t)param.mParamHandle > block_data.mMaxParamOffset)
+ if ((size_t)param->mParamHandle > block_data.mMaxParamOffset)
{
llerrs << "Attempted to register param with block defined for parent class, make sure to derive from LLInitParam::Block<YOUR_CLASS, PARAM_BLOCK_BASE_CLASS>" << llendl;
}
if (name.empty())
{
- block_data.mUnnamedParams.push_back(&param);
+ block_data.mUnnamedParams.push_back(param);
}
else
{
// don't use insert, since we want to overwrite existing entries
- block_data.mNamedParams[name] = &param;
+ block_data.mNamedParams[name] = param;
}
- if (param.mValidationFunc)
+ if (param->mValidationFunc)
{
- block_data.mValidationList.push_back(std::make_pair(param.mParamHandle, param.mValidationFunc));
+ block_data.mValidationList.push_back(std::make_pair(param->mParamHandle, param->mValidationFunc));
}
}
@@ -359,7 +402,7 @@ namespace LLInitParam
llerrs << "Attempted to register param with block defined for parent class, make sure to derive from LLInitParam::Block<YOUR_CLASS, PARAM_BLOCK_BASE_CLASS>" << llendl;
}
- ParamDescriptor* param_descriptor = findParamDescriptor(handle);
+ ParamDescriptorPtr param_descriptor = findParamDescriptor(param);
if (param_descriptor)
{
if (synonym.empty())
@@ -374,14 +417,6 @@ namespace LLInitParam
}
}
- void BaseBlock::setLastChangedParam(const Param& last_param, bool user_provided)
- {
- if (user_provided)
- {
- mChangeVersion++;
- }
- }
-
const std::string& BaseBlock::getParamName(const BlockDescriptor& block_data, const Param* paramp) const
{
param_handle_t handle = getHandleFromParam(paramp);
@@ -396,22 +431,23 @@ namespace LLInitParam
return LLStringUtil::null;
}
- ParamDescriptor* BaseBlock::findParamDescriptor(param_handle_t handle)
+ ParamDescriptorPtr BaseBlock::findParamDescriptor(const Param& param)
{
+ param_handle_t handle = getHandleFromParam(&param);
BlockDescriptor& descriptor = mostDerivedBlockDescriptor();
BlockDescriptor::all_params_list_t::iterator end_it = descriptor.mAllParams.end();
for (BlockDescriptor::all_params_list_t::iterator it = descriptor.mAllParams.begin();
it != end_it;
++it)
{
- if (it->mParamHandle == handle) return &(*it);
+ if ((*it)->mParamHandle == handle) return *it;
}
- return NULL;
+ return ParamDescriptorPtr();
}
// take all provided params from other and apply to self
// NOTE: this requires that "other" is of the same derived type as this
- bool BaseBlock::merge(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite)
+ bool BaseBlock::mergeBlock(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite)
{
bool some_param_changed = false;
BlockDescriptor::all_params_list_t::const_iterator end_it = block_data.mAllParams.end();
@@ -419,19 +455,15 @@ namespace LLInitParam
it != end_it;
++it)
{
- const Param* other_paramp = other.getParamFromHandle(it->mParamHandle);
- ParamDescriptor::merge_func_t merge_func = it->mMergeFunc;
+ const Param* other_paramp = other.getParamFromHandle((*it)->mParamHandle);
+ ParamDescriptor::merge_func_t merge_func = (*it)->mMergeFunc;
if (merge_func)
{
- Param* paramp = getParamFromHandle(it->mParamHandle);
+ Param* paramp = getParamFromHandle((*it)->mParamHandle);
+ llassert(paramp->mEnclosingBlockOffset == (*it)->mParamHandle);
some_param_changed |= merge_func(*paramp, *other_paramp, overwrite);
}
}
return some_param_changed;
}
-
- bool ParamCompare<LLSD, false>::equals(const LLSD &a, const LLSD &b)
- {
- return false;
- }
}
diff --git a/indra/llxuixml/llinitparam.h b/indra/llxuixml/llinitparam.h
index 8cb5bd80fc..4ab1d891a3 100644
--- a/indra/llxuixml/llinitparam.h
+++ b/indra/llxuixml/llinitparam.h
@@ -1,5 +1,5 @@
/**
-f * @file llinitparam.h
+ * @file llinitparam.h
* @brief parameter block abstraction for creating complex objects and
* parsing construction parameters from xml and LLSD
*
@@ -29,18 +29,19 @@ f * @file llinitparam.h
#define LL_LLPARAM_H
#include <vector>
-
-#include <stddef.h>
#include <boost/function.hpp>
-#include <boost/bind.hpp>
#include <boost/type_traits/is_convertible.hpp>
#include <boost/unordered_map.hpp>
-#include "llregistry.h"
-#include "llmemory.h"
+#include <boost/shared_ptr.hpp>
+#include "llerror.h"
namespace LLInitParam
{
+ // used to indicate no matching value to a given name when parsing
+ struct Flag{};
+
+ template<typename T> const T& defaultValue() { static T value; return value; }
template <typename T, bool IS_BOOST_FUNCTION = boost::is_convertible<T, boost::function_base>::value >
struct ParamCompare
@@ -50,7 +51,7 @@ namespace LLInitParam
return a == b;
}
};
-
+
// boost function types are not comparable
template<typename T>
struct ParamCompare<T, true>
@@ -61,122 +62,147 @@ namespace LLInitParam
}
};
- // default constructor adaptor for InitParam Values
- // constructs default instances of the given type, returned by const reference
- template <typename T>
- struct DefaultInitializer
+ template<>
+ struct ParamCompare<LLSD, false>
{
- typedef const T& T_const_ref;
- // return reference to a single default instance of T
- // built-in types will be initialized to zero, default constructor otherwise
- static T_const_ref get() { static T t = T(); return t; }
+ static bool equals(const LLSD &a, const LLSD &b) { return false; }
};
+ template<>
+ struct ParamCompare<Flag, false>
+ {
+ static bool equals(const Flag& a, const Flag& b) { return false; }
+ };
+
+
// helper functions and classes
typedef ptrdiff_t param_handle_t;
+ // empty default implementation of key cache
+ // leverages empty base class optimization
template <typename T>
class TypeValues
{
+ private:
+ struct Inaccessable{};
public:
- // empty default implemenation of key cache
- class KeyCache
+ typedef std::map<std::string, T> value_name_map_t;
+ typedef Inaccessable name_t;
+
+ void setValueName(const std::string& key) {}
+ std::string getValueName() const { return ""; }
+ std::string calcValueName(const T& value) const { return ""; }
+ void clearValueName() const {}
+
+ static bool getValueFromName(const std::string& name, T& value)
{
- public:
- void setKey(const std::string& key) {}
- std::string getKey() const { return ""; }
- void clearKey(){}
- };
+ return false;
+ }
- static bool get(const std::string& name, T& value)
+ static bool valueNamesExist()
{
return false;
}
- static bool empty()
+ static std::vector<std::string>* getPossibleValues()
{
- return true;
+ return NULL;
}
- static std::vector<std::string>* getPossibleValues() { return NULL; }
+ static value_name_map_t* getValueNames() {return NULL;}
};
template <typename T, typename DERIVED_TYPE = TypeValues<T> >
class TypeValuesHelper
- : public LLRegistrySingleton<std::string, T, DERIVED_TYPE >
{
- typedef LLRegistrySingleton<std::string, T, DERIVED_TYPE> super_t;
- typedef LLSingleton<DERIVED_TYPE> singleton_t;
public:
+ typedef typename std::map<std::string, T> value_name_map_t;
+ typedef std::string name_t;
//TODO: cache key by index to save on param block size
- class KeyCache
+ void setValueName(const std::string& value_name)
{
- public:
- void setKey(const std::string& key)
- {
- mKey = key;
- }
+ mValueName = value_name;
+ }
+
+ std::string getValueName() const
+ {
+ return mValueName;
+ }
- void clearKey()
+ std::string calcValueName(const T& value) const
+ {
+ value_name_map_t* map = getValueNames();
+ for (typename value_name_map_t::iterator it = map->begin(), end_it = map->end();
+ it != end_it;
+ ++it)
{
- mKey = "";
+ if (ParamCompare<T>::equals(it->second, value))
+ {
+ return it->first;
+ }
}
- std::string getKey() const
- {
- return mKey;
- }
+ return "";
+ }
- private:
- std::string mKey;
- };
+ void clearValueName() const
+ {
+ mValueName.clear();
+ }
- static bool get(const std::string& name, T& value)
+ static bool getValueFromName(const std::string& name, T& value)
{
- if (!singleton_t::instance().exists(name)) return false;
+ value_name_map_t* map = getValueNames();
+ typename value_name_map_t::iterator found_it = map->find(name);
+ if (found_it == map->end()) return false;
- value = *singleton_t::instance().getValue(name);
+ value = found_it->second;
return true;
}
- static bool empty()
+ static bool valueNamesExist()
{
- return singleton_t::instance().LLRegistry<std::string, T>::empty();
+ return !getValueNames()->empty();
}
- //override this to add name value pairs
- static void declareValues() {}
-
- void initSingleton()
+ static value_name_map_t* getValueNames()
{
- DERIVED_TYPE::declareValues();
- }
+ static value_name_map_t sMap;
+ static bool sInitialized = false;
- static const std::vector<std::string>* getPossibleValues()
- {
- // in order to return a pointer to a member, we lazily
- // evaluate the result and store it in mValues here
- if (singleton_t::instance().mValues.empty())
+ if (!sInitialized)
{
- typename super_t::Registrar::registry_map_t::const_iterator it;
- for (it = super_t::defaultRegistrar().beginItems(); it != super_t::defaultRegistrar().endItems(); ++it)
- {
- singleton_t::instance().mValues.push_back(it->first);
- }
+ sInitialized = true;
+ DERIVED_TYPE::declareValues();
}
- return &singleton_t::instance().mValues;
+ return &sMap;
}
+ static std::vector<std::string>* getPossibleValues()
+ {
+ static std::vector<std::string> sValues;
+
+ value_name_map_t* map = getValueNames();
+ for (typename value_name_map_t::iterator it = map->begin(), end_it = map->end();
+ it != end_it;
+ ++it)
+ {
+ sValues.push_back(it->first);
+ }
+ return &sValues;
+ }
- protected:
static void declare(const std::string& name, const T& value)
{
- super_t::defaultRegistrar().add(name, value);
+ (*getValueNames())[name] = value;
}
- private:
- std::vector<std::string> mValues;
+ protected:
+ static void getName(const std::string& name, const T& value)
+ {}
+
+ mutable std::string mValueName;
};
class Parser
@@ -193,13 +219,13 @@ namespace LLInitParam
}
};
- typedef std::vector<std::pair<std::string, S32> > name_stack_t;
- typedef std::pair<name_stack_t::const_iterator, name_stack_t::const_iterator> name_stack_range_t;
- typedef std::vector<std::string> possible_values_t;
+ typedef std::vector<std::pair<std::string, bool> > name_stack_t;
+ typedef std::pair<name_stack_t::iterator, name_stack_t::iterator> name_stack_range_t;
+ typedef std::vector<std::string> possible_values_t;
typedef bool (*parser_read_func_t)(Parser& parser, void* output);
- typedef bool (*parser_write_func_t)(Parser& parser, const void*, const name_stack_t&);
- typedef boost::function<void (const name_stack_t&, S32, S32, const possible_values_t*)> parser_inspect_func_t;
+ typedef bool (*parser_write_func_t)(Parser& parser, const void*, name_stack_t&);
+ typedef boost::function<void (name_stack_t&, S32, S32, const possible_values_t*)> parser_inspect_func_t;
typedef std::map<const std::type_info*, parser_read_func_t, CompareTypeID> parser_read_func_map_t;
typedef std::map<const std::type_info*, parser_write_func_t, CompareTypeID> parser_write_func_map_t;
@@ -207,7 +233,6 @@ namespace LLInitParam
Parser(parser_read_func_map_t& read_map, parser_write_func_map_t& write_map, parser_inspect_func_map_t& inspect_map)
: mParseSilently(false),
- mParseGeneration(0),
mParserReadFuncs(&read_map),
mParserWriteFuncs(&write_map),
mParserInspectFuncs(&inspect_map)
@@ -224,7 +249,7 @@ namespace LLInitParam
return false;
}
- template <typename T> bool writeValue(const T& param, const name_stack_t& name_stack)
+ template <typename T> bool writeValue(const T& param, name_stack_t& name_stack)
{
parser_write_func_map_t::iterator found_it = mParserWriteFuncs->find(&typeid(T));
if (found_it != mParserWriteFuncs->end())
@@ -235,7 +260,7 @@ namespace LLInitParam
}
// dispatch inspection to registered inspection functions, for each parameter in a param block
- template <typename T> bool inspectValue(const name_stack_t& name_stack, S32 min_count, S32 max_count, const possible_values_t* possible_values)
+ template <typename T> bool inspectValue(name_stack_t& name_stack, S32 min_count, S32 max_count, const possible_values_t* possible_values)
{
parser_inspect_func_map_t::iterator found_it = mParserInspectFuncs->find(&typeid(T));
if (found_it != mParserInspectFuncs->end())
@@ -251,10 +276,6 @@ namespace LLInitParam
virtual void parserError(const std::string& message);
void setParseSilently(bool silent) { mParseSilently = silent; }
- S32 getParseGeneration() { return mParseGeneration; }
- S32 newParseGeneration() { return ++mParseGeneration; }
-
-
protected:
template <typename T>
void registerParserFuncs(parser_read_func_t read_func, parser_write_func_t write_func = NULL)
@@ -275,83 +296,37 @@ namespace LLInitParam
parser_read_func_map_t* mParserReadFuncs;
parser_write_func_map_t* mParserWriteFuncs;
parser_inspect_func_map_t* mParserInspectFuncs;
- S32 mParseGeneration;
};
- class BaseBlock;
-
- class Param
- {
- public:
- // public to allow choice blocks to clear provided flag on stale choices
- void setProvided(bool is_provided) { mIsProvided = is_provided; }
-
- protected:
- bool anyProvided() const { return mIsProvided; }
-
- Param(class BaseBlock* enclosing_block);
-
- // store pointer to enclosing block as offset to reduce space and allow for quick copying
- BaseBlock& enclosingBlock() const
- {
- const U8* my_addr = reinterpret_cast<const U8*>(this);
- // get address of enclosing BLOCK class using stored offset to enclosing BaseBlock class
- return *const_cast<BaseBlock*>(
- reinterpret_cast<const BaseBlock*>(my_addr - (ptrdiff_t)(S32)mEnclosingBlockOffset));
- }
-
- private:
- friend class BaseBlock;
-
- bool mIsProvided;
- U16 mEnclosingBlockOffset;
- };
+ class Param;
// various callbacks and constraints associated with an individual param
struct ParamDescriptor
{
- public:
+ struct UserData
+ {
+ virtual ~UserData() {}
+ };
+
typedef bool(*merge_func_t)(Param&, const Param&, bool);
- typedef bool(*deserialize_func_t)(Param&, Parser&, const Parser::name_stack_range_t&, S32);
+ typedef bool(*deserialize_func_t)(Param&, Parser&, const Parser::name_stack_range_t&, bool);
typedef void(*serialize_func_t)(const Param&, Parser&, Parser::name_stack_t&, const Param* diff_param);
typedef void(*inspect_func_t)(const Param&, Parser&, Parser::name_stack_t&, S32 min_count, S32 max_count);
typedef bool(*validation_func_t)(const Param*);
ParamDescriptor(param_handle_t p,
- merge_func_t merge_func,
- deserialize_func_t deserialize_func,
- serialize_func_t serialize_func,
- validation_func_t validation_func,
- inspect_func_t inspect_func,
- S32 min_count,
- S32 max_count)
- : mParamHandle(p),
- mMergeFunc(merge_func),
- mDeserializeFunc(deserialize_func),
- mSerializeFunc(serialize_func),
- mValidationFunc(validation_func),
- mInspectFunc(inspect_func),
- mMinCount(min_count),
- mMaxCount(max_count),
- mGeneration(0),
- mNumRefs(0)
- {}
+ merge_func_t merge_func,
+ deserialize_func_t deserialize_func,
+ serialize_func_t serialize_func,
+ validation_func_t validation_func,
+ inspect_func_t inspect_func,
+ S32 min_count,
+ S32 max_count);
- ParamDescriptor()
- : mParamHandle(0),
- mMergeFunc(NULL),
- mDeserializeFunc(NULL),
- mSerializeFunc(NULL),
- mValidationFunc(NULL),
- mInspectFunc(NULL),
- mMinCount(0),
- mMaxCount(0),
- mGeneration(0),
- mNumRefs(0)
- {}
+ ParamDescriptor();
+ ~ParamDescriptor();
param_handle_t mParamHandle;
-
merge_func_t mMergeFunc;
deserialize_func_t mDeserializeFunc;
serialize_func_t mSerializeFunc;
@@ -359,19 +334,17 @@ namespace LLInitParam
validation_func_t mValidationFunc;
S32 mMinCount;
S32 mMaxCount;
- S32 mGeneration;
S32 mNumRefs;
+ UserData* mUserData;
};
+ typedef boost::shared_ptr<ParamDescriptor> ParamDescriptorPtr;
+
// each derived Block class keeps a static data structure maintaining offsets to various params
class BlockDescriptor
{
public:
- BlockDescriptor()
- : mMaxParamOffset(0),
- mInitializationState(UNINITIALIZED),
- mCurrentBlockPtr(NULL)
- {}
+ BlockDescriptor();
typedef enum e_initialization_state
{
@@ -382,60 +355,135 @@ namespace LLInitParam
void aggregateBlockData(BlockDescriptor& src_block_data);
- public:
- typedef boost::unordered_map<const std::string, ParamDescriptor*> param_map_t; // references param descriptors stored in mAllParams
- typedef std::vector<ParamDescriptor*> param_list_t;
-
- typedef std::list<ParamDescriptor> all_params_list_t;// references param descriptors stored in mAllParams
- typedef std::vector<std::pair<param_handle_t, ParamDescriptor::validation_func_t> > param_validation_list_t;
+ typedef boost::unordered_map<const std::string, ParamDescriptorPtr> param_map_t;
+ typedef std::vector<ParamDescriptorPtr> param_list_t;
+ typedef std::list<ParamDescriptorPtr> all_params_list_t;
+ typedef std::vector<std::pair<param_handle_t, ParamDescriptor::validation_func_t> > param_validation_list_t;
param_map_t mNamedParams; // parameters with associated names
param_list_t mUnnamedParams; // parameters with_out_ associated names
param_validation_list_t mValidationList; // parameters that must be validated
all_params_list_t mAllParams; // all parameters, owns descriptors
-
- size_t mMaxParamOffset;
-
- EInitializationState mInitializationState; // whether or not static block data has been initialized
- class BaseBlock* mCurrentBlockPtr; // pointer to block currently being constructed
+ size_t mMaxParamOffset;
+ EInitializationState mInitializationState; // whether or not static block data has been initialized
+ class BaseBlock* mCurrentBlockPtr; // pointer to block currently being constructed
};
class BaseBlock
{
public:
+ //TODO: implement in terms of owned_ptr
+ template<typename T>
+ class Lazy
+ {
+ public:
+ Lazy()
+ : mPtr(NULL)
+ {}
+
+ ~Lazy()
+ {
+ delete mPtr;
+ }
+
+ Lazy(const Lazy& other)
+ {
+ if (other.mPtr)
+ {
+ mPtr = new T(*other.mPtr);
+ }
+ else
+ {
+ mPtr = NULL;
+ }
+ }
+
+ Lazy<T>& operator = (const Lazy<T>& other)
+ {
+ if (other.mPtr)
+ {
+ mPtr = new T(*other.mPtr);
+ }
+ else
+ {
+ mPtr = NULL;
+ }
+ return *this;
+ }
+
+ bool empty() const
+ {
+ return mPtr == NULL;
+ }
+
+ void set(const T& other)
+ {
+ delete mPtr;
+ mPtr = new T(other);
+ }
+
+ const T& get() const
+ {
+ return ensureInstance();
+ }
+
+ T& get()
+ {
+ return ensureInstance();
+ }
+
+ private:
+ // lazily allocate an instance of T
+ T* ensureInstance() const
+ {
+ if (mPtr == NULL)
+ {
+ mPtr = new T();
+ }
+ return mPtr;
+ }
+
+ private:
+ // if you get a compilation error with this, that means you are using a forward declared struct for T
+ // unfortunately, the type traits we rely on don't work with forward declared typed
+ //static const int dummy = sizeof(T);
+
+ mutable T* mPtr;
+ };
+
// "Multiple" constraint types, put here in root class to avoid ambiguity during use
struct AnyAmount
{
- static U32 minCount() { return 0; }
- static U32 maxCount() { return U32_MAX; }
+ enum { minCount = 0 };
+ enum { maxCount = U32_MAX };
};
template<U32 MIN_AMOUNT>
struct AtLeast
{
- static U32 minCount() { return MIN_AMOUNT; }
- static U32 maxCount() { return U32_MAX; }
+ enum { minCount = MIN_AMOUNT };
+ enum { maxCount = U32_MAX };
};
template<U32 MAX_AMOUNT>
struct AtMost
{
- static U32 minCount() { return 0; }
- static U32 maxCount() { return MAX_AMOUNT; }
+ enum { minCount = 0 };
+ enum { maxCount = MAX_AMOUNT };
};
template<U32 MIN_AMOUNT, U32 MAX_AMOUNT>
struct Between
{
- static U32 minCount() { return MIN_AMOUNT; }
- static U32 maxCount() { return MAX_AMOUNT; }
+ enum { minCount = MIN_AMOUNT };
+ enum { maxCount = MAX_AMOUNT };
};
template<U32 EXACT_COUNT>
struct Exactly
{
- static U32 minCount() { return EXACT_COUNT; }
- static U32 maxCount() { return EXACT_COUNT; }
+ enum { minCount = EXACT_COUNT };
+ enum { maxCount = EXACT_COUNT };
};
// this typedef identifies derived classes as being blocks
@@ -443,9 +491,8 @@ namespace LLInitParam
LOG_CLASS(BaseBlock);
friend class Param;
- BaseBlock();
- virtual ~BaseBlock();
- bool submitValue(const Parser::name_stack_t& name_stack, Parser& p, bool silent=false);
+ virtual ~BaseBlock() {}
+ bool submitValue(Parser::name_stack_t& name_stack, Parser& p, bool silent=false);
param_handle_t getHandleFromParam(const Param* param) const;
bool validateBlock(bool emit_errors = true) const;
@@ -453,6 +500,7 @@ namespace LLInitParam
Param* getParamFromHandle(const param_handle_t param_handle)
{
if (param_handle == 0) return NULL;
+
U8* baseblock_address = reinterpret_cast<U8*>(this);
return reinterpret_cast<Param*>(baseblock_address + param_handle);
}
@@ -466,14 +514,11 @@ namespace LLInitParam
void addSynonym(Param& param, const std::string& synonym);
// Blocks can override this to do custom tracking of changes
- virtual void setLastChangedParam(const Param& last_param, bool user_provided);
-
- S32 getLastChangeVersion() const { return mChangeVersion; }
- bool isDefault() const { return mChangeVersion == 0; }
+ virtual void paramChanged(const Param& changed_param, bool user_provided) {}
- bool deserializeBlock(Parser& p, Parser::name_stack_range_t name_stack);
- bool serializeBlock(Parser& p, Parser::name_stack_t name_stack = Parser::name_stack_t(), const BaseBlock* diff_block = NULL) const;
- bool inspectBlock(Parser& p, Parser::name_stack_t name_stack = Parser::name_stack_t()) const;
+ bool deserializeBlock(Parser& p, Parser::name_stack_range_t name_stack_range, bool new_name);
+ void serializeBlock(Parser& p, Parser::name_stack_t& name_stack, const BaseBlock* diff_block = NULL) const;
+ bool inspectBlock(Parser& p, Parser::name_stack_t name_stack = Parser::name_stack_t(), S32 min_count = 0, S32 max_count = S32_MAX) const;
virtual const BlockDescriptor& mostDerivedBlockDescriptor() const { return selfBlockDescriptor(); }
virtual BlockDescriptor& mostDerivedBlockDescriptor() { return selfBlockDescriptor(); }
@@ -490,16 +535,20 @@ namespace LLInitParam
return false;
}
- static void addParam(BlockDescriptor& block_data, const ParamDescriptor& param, const char* name);
+ static void addParam(BlockDescriptor& block_data, ParamDescriptorPtr param, const char* name);
+
+ ParamDescriptorPtr findParamDescriptor(const Param& param);
+
protected:
void init(BlockDescriptor& descriptor, BlockDescriptor& base_descriptor, size_t block_size);
+ bool mergeBlockParam(bool source_provided, bool dst_provided, BlockDescriptor& block_data, const BaseBlock& source, bool overwrite)
+ {
+ return mergeBlock(block_data, source, overwrite);
+ }
// take all provided params from other and apply to self
- bool merge(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite);
-
- // can be updated in getters
- mutable S32 mChangeVersion;
+ bool mergeBlock(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite);
static BlockDescriptor& selfBlockDescriptor()
{
@@ -509,30 +558,250 @@ namespace LLInitParam
private:
const std::string& getParamName(const BlockDescriptor& block_data, const Param* paramp) const;
- ParamDescriptor* findParamDescriptor(param_handle_t handle);
};
-
template<typename T>
- struct ParamIterator
+ struct ParamCompare<BaseBlock::Lazy<T>, false >
{
- typedef typename std::vector<T>::const_iterator const_iterator;
- typedef typename std::vector<T>::iterator iterator;
+ static bool equals(const BaseBlock::Lazy<T>& a, const BaseBlock::Lazy<T>& b) { return !a.empty() || !b.empty(); }
+ };
+
+ class Param
+ {
+ public:
+ void setProvided(bool is_provided = true)
+ {
+ mIsProvided = is_provided;
+ enclosingBlock().paramChanged(*this, is_provided);
+ }
+
+ Param& operator =(const Param& other)
+ {
+ mIsProvided = other.mIsProvided;
+ // don't change mEnclosingblockoffset
+ return *this;
+ }
+ protected:
+
+ bool anyProvided() const { return mIsProvided; }
+
+ Param(BaseBlock* enclosing_block);
+
+ // store pointer to enclosing block as offset to reduce space and allow for quick copying
+ BaseBlock& enclosingBlock() const
+ {
+ const U8* my_addr = reinterpret_cast<const U8*>(this);
+ // get address of enclosing BLOCK class using stored offset to enclosing BaseBlock class
+ return *const_cast<BaseBlock*>
+ (reinterpret_cast<const BaseBlock*>
+ (my_addr - (ptrdiff_t)(S32)mEnclosingBlockOffset));
+ }
+
+ private:
+ friend class BaseBlock;
+
+ U32 mEnclosingBlockOffset:31;
+ U32 mIsProvided:1;
+
};
// these templates allow us to distinguish between template parameters
// that derive from BaseBlock and those that don't
- // this is supposedly faster than boost::is_convertible and its ilk
template<typename T, typename Void = void>
- struct IsBaseBlock
+ struct IsBlock
{
static const bool value = false;
+ struct EmptyBase {};
+ typedef EmptyBase base_class_t;
+ };
+
+ template<typename T>
+ struct IsBlock<T, typename T::baseblock_base_class_t>
+ {
+ static const bool value = true;
+ typedef BaseBlock base_class_t;
};
template<typename T>
- struct IsBaseBlock<T, typename T::baseblock_base_class_t>
+ struct IsBlock<BaseBlock::Lazy<T>, typename T::baseblock_base_class_t >
{
static const bool value = true;
+ typedef BaseBlock base_class_t;
+ };
+
+ template<typename T, typename NAME_VALUE_LOOKUP, bool VALUE_IS_BLOCK = IsBlock<T>::value>
+ class ParamValue : public NAME_VALUE_LOOKUP
+ {
+ public:
+ typedef const T& value_assignment_t;
+ typedef T value_t;
+ typedef ParamValue<T, NAME_VALUE_LOOKUP, VALUE_IS_BLOCK> self_t;
+
+ ParamValue(): mValue() {}
+ ParamValue(value_assignment_t other) : mValue(other) {}
+
+ void setValue(value_assignment_t val)
+ {
+ mValue = val;
+ }
+
+ value_assignment_t getValue() const
+ {
+ return mValue;
+ }
+
+ T& getValue()
+ {
+ return mValue;
+ }
+
+ operator value_assignment_t() const
+ {
+ return mValue;
+ }
+
+ value_assignment_t operator()() const
+ {
+ return mValue;
+ }
+
+ void operator ()(const typename NAME_VALUE_LOOKUP::name_t& name)
+ {
+ *this = name;
+ }
+
+ self_t& operator =(const typename NAME_VALUE_LOOKUP::name_t& name)
+ {
+ if (NAME_VALUE_LOOKUP::getValueFromName(name, mValue))
+ {
+ setValueName(name);
+ }
+
+ return *this;
+ }
+
+ protected:
+ T mValue;
+ };
+
+ template<typename T, typename NAME_VALUE_LOOKUP>
+ class ParamValue<T, NAME_VALUE_LOOKUP, true>
+ : public T,
+ public NAME_VALUE_LOOKUP
+ {
+ public:
+ typedef const T& value_assignment_t;
+ typedef T value_t;
+ typedef ParamValue<T, NAME_VALUE_LOOKUP, true> self_t;
+
+ ParamValue()
+ : T(),
+ mValidated(false)
+ {}
+
+ ParamValue(value_assignment_t other)
+ : T(other),
+ mValidated(false)
+ {}
+
+ void setValue(value_assignment_t val)
+ {
+ *this = val;
+ }
+
+ value_assignment_t getValue() const
+ {
+ return *this;
+ }
+
+ T& getValue()
+ {
+ return *this;
+ }
+
+ operator value_assignment_t() const
+ {
+ return *this;
+ }
+
+ value_assignment_t operator()() const
+ {
+ return *this;
+ }
+
+ void operator ()(const typename NAME_VALUE_LOOKUP::name_t& name)
+ {
+ *this = name;
+ }
+
+ self_t& operator =(const typename NAME_VALUE_LOOKUP::name_t& name)
+ {
+ if (NAME_VALUE_LOOKUP::getValueFromName(name, *this))
+ {
+ setValueName(name);
+ }
+
+ return *this;
+ }
+
+ protected:
+ mutable bool mValidated; // lazy validation flag
+ };
+
+ template<typename NAME_VALUE_LOOKUP>
+ class ParamValue<std::string, NAME_VALUE_LOOKUP, false>
+ : public NAME_VALUE_LOOKUP
+ {
+ public:
+ typedef const std::string& value_assignment_t;
+ typedef std::string value_t;
+ typedef ParamValue<std::string, NAME_VALUE_LOOKUP, false> self_t;
+
+ ParamValue(): mValue() {}
+ ParamValue(value_assignment_t other) : mValue(other) {}
+
+ void setValue(value_assignment_t val)
+ {
+ if (NAME_VALUE_LOOKUP::getValueFromName(val, mValue))
+ {
+ NAME_VALUE_LOOKUP::setValueName(val);
+ }
+ else
+ {
+ mValue = val;
+ }
+ }
+
+ value_assignment_t getValue() const
+ {
+ return mValue;
+ }
+
+ std::string& getValue()
+ {
+ return mValue;
+ }
+
+ operator value_assignment_t() const
+ {
+ return mValue;
+ }
+
+ value_assignment_t operator()() const
+ {
+ return mValue;
+ }
+
+ protected:
+ std::string mValue;
+ };
+
+
+ template<typename T, typename NAME_VALUE_LOOKUP = TypeValues<T> >
+ struct ParamIterator
+ {
+ typedef typename std::vector<ParamValue<T, NAME_VALUE_LOOKUP> >::const_iterator const_iterator;
+ typedef typename std::vector<ParamValue<T, NAME_VALUE_LOOKUP> >::iterator iterator;
};
// specialize for custom parsing/decomposition of specific classes
@@ -540,63 +809,65 @@ namespace LLInitParam
template<typename T,
typename NAME_VALUE_LOOKUP = TypeValues<T>,
bool HAS_MULTIPLE_VALUES = false,
- bool VALUE_IS_BLOCK = IsBaseBlock<T>::value>
+ bool VALUE_IS_BLOCK = IsBlock<ParamValue<T, NAME_VALUE_LOOKUP> >::value>
class TypedParam
- : public Param
+ : public Param,
+ public ParamValue<T, NAME_VALUE_LOOKUP>
{
public:
- typedef const T& value_const_ref_t;
- typedef value_const_ref_t value_assignment_t;
- typedef typename NAME_VALUE_LOOKUP::KeyCache key_cache_t;
typedef TypedParam<T, NAME_VALUE_LOOKUP, HAS_MULTIPLE_VALUES, VALUE_IS_BLOCK> self_t;
+ typedef ParamValue<T, NAME_VALUE_LOOKUP> param_value_t;
+ typedef typename param_value_t::value_assignment_t value_assignment_t;
+ typedef NAME_VALUE_LOOKUP name_value_lookup_t;
+
+ using param_value_t::operator();
TypedParam(BlockDescriptor& block_descriptor, const char* name, value_assignment_t value, ParamDescriptor::validation_func_t validate_func, S32 min_count, S32 max_count)
: Param(block_descriptor.mCurrentBlockPtr)
{
if (LL_UNLIKELY(block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING))
{
- ParamDescriptor param_descriptor(block_descriptor.mCurrentBlockPtr->getHandleFromParam(this),
+ ParamDescriptorPtr param_descriptor = ParamDescriptorPtr(new ParamDescriptor(
+ block_descriptor.mCurrentBlockPtr->getHandleFromParam(this),
&mergeWith,
&deserializeParam,
&serializeParam,
validate_func,
&inspectParam,
- min_count, max_count);
+ min_count, max_count));
BaseBlock::addParam(block_descriptor, param_descriptor, name);
}
- mData.mValue = value;
+ setValue(value);
}
bool isProvided() const { return Param::anyProvided(); }
- static bool deserializeParam(Param& param, Parser& parser, const Parser::name_stack_range_t& name_stack, S32 generation)
+ static bool deserializeParam(Param& param, Parser& parser, const Parser::name_stack_range_t& name_stack_range, bool new_name)
{
self_t& typed_param = static_cast<self_t&>(param);
// no further names in stack, attempt to parse value now
- if (name_stack.first == name_stack.second)
+ if (name_stack_range.first == name_stack_range.second)
{
- if (parser.readValue(typed_param.mData.mValue))
+ if (parser.readValue(typed_param.getValue()))
{
- typed_param.mData.clearKey();
- typed_param.setProvided(true);
- typed_param.enclosingBlock().setLastChangedParam(param, true);
+ typed_param.clearValueName();
+ typed_param.setProvided();
return true;
}
// try to parse a known named value
- if(!NAME_VALUE_LOOKUP::empty())
+ if(name_value_lookup_t::valueNamesExist())
{
// try to parse a known named value
std::string name;
if (parser.readValue(name))
{
// try to parse a per type named value
- if (NAME_VALUE_LOOKUP::get(name, typed_param.mData.mValue))
+ if (name_value_lookup_t::getValueFromName(name, typed_param.getValue()))
{
- typed_param.mData.setKey(name);
- typed_param.setProvided(true);
- typed_param.enclosingBlock().setLastChangedParam(param, true);
+ typed_param.setValueName(name);
+ typed_param.setProvided();
return true;
}
@@ -613,28 +884,30 @@ namespace LLInitParam
if (!name_stack.empty())
{
- name_stack.back().second = parser.newParseGeneration();
+ name_stack.back().second = true;
}
- std::string key = typed_param.mData.getKey();
+ std::string key = typed_param.getValueName();
// first try to write out name of name/value pair
if (!key.empty())
{
- if (!diff_param || !ParamCompare<std::string>::equals(static_cast<const self_t*>(diff_param)->mData.getKey(), key))
+ if (!diff_param || !ParamCompare<std::string>::equals(static_cast<const self_t*>(diff_param)->getValueName(), key))
{
- if (!parser.writeValue(key, name_stack))
- {
- return;
- }
+ parser.writeValue(key, name_stack);
}
}
// then try to serialize value directly
- else if (!diff_param || !ParamCompare<T>::equals(typed_param.get(), static_cast<const self_t*>(diff_param)->get())) {
- if (!parser.writeValue(typed_param.mData.mValue, name_stack))
+ else if (!diff_param || !ParamCompare<T>::equals(typed_param.getValue(), static_cast<const self_t*>(diff_param)->getValue()))
+ {
+ if (!parser.writeValue(typed_param.getValue(), name_stack))
{
- return;
+ std::string calculated_key = typed_param.calcValueName(typed_param.getValue());
+ if (!diff_param || !ParamCompare<std::string>::equals(static_cast<const self_t*>(diff_param)->getValueName(), calculated_key))
+ {
+ parser.writeValue(calculated_key, name_stack);
+ }
}
}
}
@@ -644,115 +917,102 @@ namespace LLInitParam
// tell parser about our actual type
parser.inspectValue<T>(name_stack, min_count, max_count, NULL);
// then tell it about string-based alternatives ("red", "blue", etc. for LLColor4)
- if (NAME_VALUE_LOOKUP::getPossibleValues())
+ if (name_value_lookup_t::getPossibleValues())
{
- parser.inspectValue<std::string>(name_stack, min_count, max_count, NAME_VALUE_LOOKUP::getPossibleValues());
+ parser.inspectValue<std::string>(name_stack, min_count, max_count, name_value_lookup_t::getPossibleValues());
}
}
void set(value_assignment_t val, bool flag_as_provided = true)
{
- mData.mValue = val;
- mData.clearKey();
+ param_value_t::clearValueName();
+ setValue(val);
setProvided(flag_as_provided);
- Param::enclosingBlock().setLastChangedParam(*this, flag_as_provided);
}
- void setIfNotProvided(value_assignment_t val, bool flag_as_provided = true)
+ self_t& operator =(const typename NAME_VALUE_LOOKUP::name_t& name)
{
- if (!isProvided())
- {
- set(val, flag_as_provided);
- }
+ return static_cast<self_t&>(param_value_t::operator =(name));
}
- // implicit conversion
- operator value_assignment_t() const { return get(); }
- // explicit conversion
- value_assignment_t operator()() const { return get(); }
-
protected:
- value_assignment_t get() const
+
+ self_t& operator =(const self_t& other)
{
- return mData.mValue;
+ param_value_t::operator =(other);
+ Param::operator =(other);
+ return *this;
}
static bool mergeWith(Param& dst, const Param& src, bool overwrite)
{
const self_t& src_typed_param = static_cast<const self_t&>(src);
self_t& dst_typed_param = static_cast<self_t&>(dst);
+
if (src_typed_param.isProvided()
&& (overwrite || !dst_typed_param.isProvided()))
{
- dst_typed_param.mData.clearKey();
- dst_typed_param.set(src_typed_param.get());
+ dst_typed_param.set(src_typed_param.getValue());
return true;
}
return false;
}
-
- struct Data : public key_cache_t
- {
- T mValue;
- };
-
- Data mData;
};
// parameter that is a block
template <typename T, typename NAME_VALUE_LOOKUP>
class TypedParam<T, NAME_VALUE_LOOKUP, false, true>
- : public T,
- public Param
+ : public Param,
+ public ParamValue<T, NAME_VALUE_LOOKUP>
{
public:
- typedef const T value_const_t;
- typedef T value_t;
- typedef value_const_t& value_const_ref_t;
- typedef value_const_ref_t value_assignment_t;
- typedef typename NAME_VALUE_LOOKUP::KeyCache key_cache_t;
+ typedef ParamValue<T, NAME_VALUE_LOOKUP> param_value_t;
+ typedef typename param_value_t::value_assignment_t value_assignment_t;
typedef TypedParam<T, NAME_VALUE_LOOKUP, false, true> self_t;
+ typedef NAME_VALUE_LOOKUP name_value_lookup_t;
+
+ using param_value_t::operator();
TypedParam(BlockDescriptor& block_descriptor, const char* name, value_assignment_t value, ParamDescriptor::validation_func_t validate_func, S32 min_count, S32 max_count)
: Param(block_descriptor.mCurrentBlockPtr),
- T(value)
+ param_value_t(value)
{
if (LL_UNLIKELY(block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING))
{
- ParamDescriptor param_descriptor(block_descriptor.mCurrentBlockPtr->getHandleFromParam(this),
+ ParamDescriptorPtr param_descriptor = ParamDescriptorPtr(new ParamDescriptor(
+ block_descriptor.mCurrentBlockPtr->getHandleFromParam(this),
&mergeWith,
&deserializeParam,
&serializeParam,
validate_func,
&inspectParam,
- min_count, max_count);
+ min_count, max_count));
BaseBlock::addParam(block_descriptor, param_descriptor, name);
}
}
- static bool deserializeParam(Param& param, Parser& parser, const Parser::name_stack_range_t& name_stack, S32 generation)
+ static bool deserializeParam(Param& param, Parser& parser, const Parser::name_stack_range_t& name_stack_range, bool new_name)
{
self_t& typed_param = static_cast<self_t&>(param);
// attempt to parse block...
- if(typed_param.deserializeBlock(parser, name_stack))
+ if(typed_param.deserializeBlock(parser, name_stack_range, new_name))
{
- typed_param.mData.clearKey();
- typed_param.enclosingBlock().setLastChangedParam(param, true);
+ typed_param.clearValueName();
+ typed_param.setProvided();
return true;
}
- if(!NAME_VALUE_LOOKUP::empty())
+ if(name_value_lookup_t::valueNamesExist())
{
// try to parse a known named value
std::string name;
if (parser.readValue(name))
{
// try to parse a per type named value
- if (NAME_VALUE_LOOKUP::get(name, typed_param))
+ if (name_value_lookup_t::getValueFromName(name, typed_param.getValue()))
{
- typed_param.enclosingBlock().setLastChangedParam(param, true);
- typed_param.mData.setKey(name);
- typed_param.mData.mKeyVersion = typed_param.getLastChangeVersion();
+ typed_param.setValueName(name);
+ typed_param.setProvided();
return true;
}
@@ -764,13 +1024,15 @@ namespace LLInitParam
static void serializeParam(const Param& param, Parser& parser, Parser::name_stack_t& name_stack, const Param* diff_param)
{
const self_t& typed_param = static_cast<const self_t&>(param);
+ if (!typed_param.isProvided()) return;
+
if (!name_stack.empty())
{
- name_stack.back().second = parser.newParseGeneration();
+ name_stack.back().second = true;
}
- std::string key = typed_param.mData.getKey();
- if (!key.empty() && typed_param.mData.mKeyVersion == typed_param.getLastChangeVersion())
+ std::string key = typed_param.getValueName();
+ if (!key.empty())
{
if (!parser.writeValue(key, name_stack))
{
@@ -787,64 +1049,62 @@ namespace LLInitParam
{
// I am a param that is also a block, so just recurse into my contents
const self_t& typed_param = static_cast<const self_t&>(param);
- typed_param.inspectBlock(parser, name_stack);
+ typed_param.inspectBlock(parser, name_stack, min_count, max_count);
}
// a param-that-is-a-block is provided when the user has set one of its child params
// *and* the block as a whole validates
bool isProvided() const
{
- // only validate block when it hasn't already passed validation and user has supplied *some* value
- if (Param::anyProvided() && mData.mValidatedVersion < T::getLastChangeVersion())
+ // only validate block when it hasn't already passed validation with current data
+ if (Param::anyProvided() && !param_value_t::mValidated)
{
// a sub-block is "provided" when it has been filled in enough to be valid
- mData.mValidated = T::validateBlock(false);
- mData.mValidatedVersion = T::getLastChangeVersion();
+ param_value_t::mValidated = param_value_t::validateBlock(false);
}
- return Param::anyProvided() && mData.mValidated;
+ return Param::anyProvided() && param_value_t::mValidated;
}
// assign block contents to this param-that-is-a-block
void set(value_assignment_t val, bool flag_as_provided = true)
{
- value_t::operator=(val);
- mData.clearKey();
- // force revalidation of block by clearing known provided version
+ setValue(val);
+ param_value_t::clearValueName();
+ // force revalidation of block
// next call to isProvided() will update provision status based on validity
- mData.mValidatedVersion = 0;
+ param_value_t::mValidated = false;
setProvided(flag_as_provided);
- Param::enclosingBlock().setLastChangedParam(*this, flag_as_provided);
}
- void setIfNotProvided(value_assignment_t val, bool flag_as_provided = true)
+ self_t& operator =(const typename NAME_VALUE_LOOKUP::name_t& name)
{
- if (!isProvided())
- {
- set(val, flag_as_provided);
- }
+ return static_cast<self_t&>(param_value_t::operator =(name));
}
// propagate changed status up to enclosing block
- /*virtual*/ void setLastChangedParam(const Param& last_param, bool user_provided)
+ /*virtual*/ void paramChanged(const Param& changed_param, bool user_provided)
{
- T::setLastChangedParam(last_param, user_provided);
- Param::enclosingBlock().setLastChangedParam(*this, user_provided);
+ param_value_t::paramChanged(changed_param, user_provided);
if (user_provided)
{
// a child param has been explicitly changed
// so *some* aspect of this block is now provided
- setProvided(true);
+ param_value_t::mValidated = false;
+ setProvided();
+ param_value_t::clearValueName();
+ }
+ else
+ {
+ Param::enclosingBlock().paramChanged(*this, user_provided);
}
}
- // implicit conversion
- operator value_assignment_t() const { return get(); }
- // explicit conversion
- value_assignment_t operator()() const { return get(); }
-
protected:
- value_assignment_t get() const
+
+ self_t& operator =(const self_t& other)
{
+ param_value_t::operator =(other);
+ Param::operator =(other);
return *this;
}
@@ -852,27 +1112,18 @@ namespace LLInitParam
{
const self_t& src_typed_param = static_cast<const self_t&>(src);
self_t& dst_typed_param = static_cast<self_t&>(dst);
- if (dst_typed_param.T::merge(T::selfBlockDescriptor(), src_typed_param, overwrite))
+
+ if (src_typed_param.anyProvided())
{
- dst_typed_param.mData.clearKey();
- return true;
+ if (dst_typed_param.mergeBlockParam(src_typed_param.isProvided(), dst_typed_param.isProvided(), param_value_t::selfBlockDescriptor(), src_typed_param, overwrite))
+ {
+ dst_typed_param.clearValueName();
+ dst_typed_param.setProvided(true);
+ return true;
+ }
}
return false;
}
-
- struct Data : public key_cache_t
- {
- S32 mKeyVersion;
- mutable S32 mValidatedVersion;
- mutable bool mValidated; // lazy validation flag
-
- Data()
- : mKeyVersion(0),
- mValidatedVersion(0),
- mValidated(false)
- {}
- };
- Data mData;
};
// container of non-block parameters
@@ -882,68 +1133,60 @@ namespace LLInitParam
{
public:
typedef TypedParam<VALUE_TYPE, NAME_VALUE_LOOKUP, true, false> self_t;
- typedef typename std::vector<VALUE_TYPE> container_t;
+ typedef ParamValue<VALUE_TYPE, NAME_VALUE_LOOKUP> param_value_t;
+ typedef typename std::vector<param_value_t> container_t;
typedef const container_t& value_assignment_t;
- typedef VALUE_TYPE value_t;
- typedef value_t& value_ref_t;
- typedef const value_t& value_const_ref_t;
+ typedef typename param_value_t::value_t value_t;
+ typedef NAME_VALUE_LOOKUP name_value_lookup_t;
- typedef typename NAME_VALUE_LOOKUP::KeyCache key_cache_t;
-
TypedParam(BlockDescriptor& block_descriptor, const char* name, value_assignment_t value, ParamDescriptor::validation_func_t validate_func, S32 min_count, S32 max_count)
- : Param(block_descriptor.mCurrentBlockPtr),
- mValues(value)
+ : Param(block_descriptor.mCurrentBlockPtr)
{
- mCachedKeys.resize(mValues.size());
+ std::copy(value.begin(), value.end(), std::back_inserter(mValues));
+
if (LL_UNLIKELY(block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING))
{
- ParamDescriptor param_descriptor(block_descriptor.mCurrentBlockPtr->getHandleFromParam(this),
+ ParamDescriptorPtr param_descriptor = ParamDescriptorPtr(new ParamDescriptor(
+ block_descriptor.mCurrentBlockPtr->getHandleFromParam(this),
&mergeWith,
&deserializeParam,
&serializeParam,
validate_func,
&inspectParam,
- min_count, max_count);
+ min_count, max_count));
BaseBlock::addParam(block_descriptor, param_descriptor, name);
}
}
bool isProvided() const { return Param::anyProvided(); }
- static bool deserializeParam(Param& param, Parser& parser, const Parser::name_stack_range_t& name_stack, S32 generation)
+ static bool deserializeParam(Param& param, Parser& parser, const Parser::name_stack_range_t& name_stack_range, bool new_name)
{
self_t& typed_param = static_cast<self_t&>(param);
value_t value;
// no further names in stack, attempt to parse value now
- if (name_stack.first == name_stack.second)
+ if (name_stack_range.first == name_stack_range.second)
{
// attempt to read value directly
if (parser.readValue(value))
{
- typed_param.mValues.push_back(value);
- // save an empty name/value key as a placeholder
- typed_param.mCachedKeys.push_back(key_cache_t());
- typed_param.enclosingBlock().setLastChangedParam(param, true);
- typed_param.setProvided(true);
+ typed_param.add(value);
return true;
}
// try to parse a known named value
- if(!NAME_VALUE_LOOKUP::empty())
+ if(name_value_lookup_t::valueNamesExist())
{
// try to parse a known named value
std::string name;
if (parser.readValue(name))
{
// try to parse a per type named value
- if (NAME_VALUE_LOOKUP::get(name, typed_param.mValues))
+ if (name_value_lookup_t::getValueFromName(name, value))
{
- typed_param.mValues.push_back(value);
- typed_param.mCachedKeys.push_back(key_cache_t());
- typed_param.mCachedKeys.back().setKey(name);
- typed_param.enclosingBlock().setLastChangedParam(param, true);
- typed_param.setProvided(true);
+ typed_param.add(value);
+ typed_param.mValues.back().setValueName(name);
return true;
}
@@ -958,25 +1201,32 @@ namespace LLInitParam
const self_t& typed_param = static_cast<const self_t&>(param);
if (!typed_param.isProvided() || name_stack.empty()) return;
- const_iterator it = typed_param.mValues.begin();
- for (typename std::vector<key_cache_t>::const_iterator key_it = typed_param.mCachedKeys.begin();
- it != typed_param.mValues.end();
- ++key_it, ++it)
+ for (const_iterator it = typed_param.mValues.begin(), end_it = typed_param.mValues.end();
+ it != end_it;
+ ++it)
{
- std::string key = key_it->get();
- name_stack.back().second = parser.newParseGeneration();
+ std::string key = it->getValueName();
+ name_stack.back().second = true;
- if(!key.empty())
+ if(key.empty())
+ // not parsed via name values, write out value directly
{
- if(!parser.writeValue(key, name_stack))
+ bool value_written = parser.writeValue(*it, name_stack);
+ if (!value_written)
{
- return;
+ std::string calculated_key = it->calcValueName(it->getValue());
+ if (!parser.writeValue(calculated_key, name_stack))
+ {
+ break;
+ }
}
}
- // not parse via name values, write out value directly
- else if (!parser.writeValue(*it, name_stack))
+ else
{
- return;
+ if(!parser.writeValue(key, name_stack))
+ {
+ break;
+ }
}
}
}
@@ -984,47 +1234,52 @@ namespace LLInitParam
static void inspectParam(const Param& param, Parser& parser, Parser::name_stack_t& name_stack, S32 min_count, S32 max_count)
{
parser.inspectValue<VALUE_TYPE>(name_stack, min_count, max_count, NULL);
- if (NAME_VALUE_LOOKUP::getPossibleValues())
+ if (name_value_lookup_t::getPossibleValues())
{
- parser.inspectValue<std::string>(name_stack, min_count, max_count, NAME_VALUE_LOOKUP::getPossibleValues());
+ parser.inspectValue<std::string>(name_stack, min_count, max_count, name_value_lookup_t::getPossibleValues());
}
}
void set(value_assignment_t val, bool flag_as_provided = true)
{
mValues = val;
- mCachedKeys.clear();
- mCachedKeys.resize(mValues.size());
setProvided(flag_as_provided);
- Param::enclosingBlock().setLastChangedParam(*this, flag_as_provided);
}
-
- void setIfNotProvided(value_assignment_t val, bool flag_as_provided = true)
+ param_value_t& add()
{
- if (!isProvided())
- {
- set(val, flag_as_provided);
- }
+ mValues.push_back(param_value_t(value_t()));
+ Param::setProvided();
+ return mValues.back();
}
- value_ref_t add()
+ self_t& add(const value_t& item)
{
- mValues.push_back(value_t());
- mCachedKeys.push_back(key_cache_t());
- setProvided(true);
- return mValues.back();
+ param_value_t param_value;
+ param_value.setValue(item);
+ mValues.push_back(param_value);
+ setProvided();
+ return *this;
}
- void add(value_const_ref_t item)
+ self_t& add(const typename name_value_lookup_t::name_t& name)
{
- mValues.push_back(item);
- mCachedKeys.push_back(key_cache_t());
- setProvided(true);
+ value_t value;
+
+ // try to parse a per type named value
+ if (name_value_lookup_t::getValueFromName(name, value))
+ {
+ add(value);
+ mValues.back().setValueName(name);
+ }
+
+ return *this;
}
// implicit conversion
- operator value_assignment_t() const { return self_t::get(); }
+ operator value_assignment_t() const { return mValues; }
+ // explicit conversion
+ value_assignment_t operator()() const { return mValues; }
typedef typename container_t::iterator iterator;
typedef typename container_t::const_iterator const_iterator;
@@ -1041,27 +1296,30 @@ namespace LLInitParam
}
protected:
- value_assignment_t get() const
- {
- return mValues;
- }
-
static bool mergeWith(Param& dst, const Param& src, bool overwrite)
{
const self_t& src_typed_param = static_cast<const self_t&>(src);
self_t& dst_typed_param = static_cast<self_t&>(dst);
- if (src_typed_param.isProvided()
- && (overwrite || !dst_typed_param.isProvided()))
+ if (overwrite)
{
- dst_typed_param.set(src_typed_param.get());
- return true;
+ std::copy(src_typed_param.begin(), src_typed_param.end(), std::back_inserter(dst_typed_param.mValues));
}
- return false;
+ else
+ {
+ container_t new_values(src_typed_param.mValues);
+ std::copy(dst_typed_param.begin(), dst_typed_param.end(), std::back_inserter(new_values));
+ std::swap(dst_typed_param.mValues, new_values);
+ }
+
+ if (src_typed_param.begin() != src_typed_param.end())
+ {
+ dst_typed_param.setProvided();
+ }
+ return true;
}
container_t mValues;
- std::vector<key_cache_t> mCachedKeys;
};
// container of block parameters
@@ -1071,81 +1329,63 @@ namespace LLInitParam
{
public:
typedef TypedParam<VALUE_TYPE, NAME_VALUE_LOOKUP, true, true> self_t;
- typedef typename std::vector<VALUE_TYPE> container_t;
+ typedef ParamValue<VALUE_TYPE, NAME_VALUE_LOOKUP> param_value_t;
+ typedef typename std::vector<param_value_t> container_t;
typedef const container_t& value_assignment_t;
-
- typedef VALUE_TYPE value_t;
- typedef value_t& value_ref_t;
- typedef const value_t& value_const_ref_t;
-
- typedef typename NAME_VALUE_LOOKUP::KeyCache key_cache_t;
+ typedef typename param_value_t::value_t value_t;
+ typedef NAME_VALUE_LOOKUP name_value_lookup_t;
TypedParam(BlockDescriptor& block_descriptor, const char* name, value_assignment_t value, ParamDescriptor::validation_func_t validate_func, S32 min_count, S32 max_count)
- : Param(block_descriptor.mCurrentBlockPtr),
- mValues(value),
- mLastParamGeneration(0)
+ : Param(block_descriptor.mCurrentBlockPtr)
{
- mCachedKeys.resize(mValues.size());
+ std::copy(value.begin(), value.end(), back_inserter(mValues));
+
if (LL_UNLIKELY(block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING))
{
- ParamDescriptor param_descriptor(block_descriptor.mCurrentBlockPtr->getHandleFromParam(this),
+ ParamDescriptorPtr param_descriptor = ParamDescriptorPtr(new ParamDescriptor(
+ block_descriptor.mCurrentBlockPtr->getHandleFromParam(this),
&mergeWith,
&deserializeParam,
&serializeParam,
validate_func,
&inspectParam,
- min_count, max_count);
+ min_count, max_count));
BaseBlock::addParam(block_descriptor, param_descriptor, name);
}
}
bool isProvided() const { return Param::anyProvided(); }
- value_ref_t operator[](S32 index) { return mValues[index]; }
- value_const_ref_t operator[](S32 index) const { return mValues[index]; }
-
- static bool deserializeParam(Param& param, Parser& parser, const Parser::name_stack_range_t& name_stack, S32 generation)
+ static bool deserializeParam(Param& param, Parser& parser, const Parser::name_stack_range_t& name_stack_range, bool new_name)
{
self_t& typed_param = static_cast<self_t&>(param);
bool new_value = false;
- if (generation != typed_param.mLastParamGeneration || typed_param.mValues.empty())
+
+ if (new_name || typed_param.mValues.empty())
{
new_value = true;
typed_param.mValues.push_back(value_t());
- typed_param.mCachedKeys.push_back(Data());
}
- value_ref_t value = typed_param.mValues.back();
+ param_value_t& value = typed_param.mValues.back();
// attempt to parse block...
- if(value.deserializeBlock(parser, name_stack))
+ if(value.deserializeBlock(parser, name_stack_range, new_name))
{
- if (new_value)
- { // successfully parsed new value, let's keep it
- typed_param.mLastParamGeneration = generation;
- }
- typed_param.enclosingBlock().setLastChangedParam(param, true);
- typed_param.setProvided(true);
+ typed_param.setProvided();
return true;
}
- else if(!NAME_VALUE_LOOKUP::empty())
+ else if(name_value_lookup_t::valueNamesExist())
{
// try to parse a known named value
std::string name;
if (parser.readValue(name))
{
// try to parse a per type named value
- if (NAME_VALUE_LOOKUP::get(name, value))
+ if (name_value_lookup_t::getValueFromName(name, value.getValue()))
{
- if (new_value)
- { // successfully parsed new value, let's keep it
- typed_param.mLastParamGeneration = generation;
- }
-
- typed_param.mCachedKeys.back().setKey(name);
- typed_param.mCachedKeys.back().mKeyVersion = value.getLastChangeVersion();
- typed_param.enclosingBlock().setLastChangedParam(param, true);
- typed_param.setProvided(true);
+ typed_param.mValues.back().setValueName(name);
+ typed_param.setProvided();
return true;
}
@@ -1155,7 +1395,6 @@ namespace LLInitParam
if (new_value)
{ // failed to parse new value, pop it off
typed_param.mValues.pop_back();
- typed_param.mCachedKeys.pop_back();
}
return false;
@@ -1166,26 +1405,22 @@ namespace LLInitParam
const self_t& typed_param = static_cast<const self_t&>(param);
if (!typed_param.isProvided() || name_stack.empty()) return;
- const_iterator it = typed_param.mValues.begin();
- for (typename std::vector<Data>::const_iterator key_it = typed_param.mCachedKeys.begin();
- it != typed_param.mValues.end();
- ++key_it, ++it)
+ for (const_iterator it = typed_param.mValues.begin(), end_it = typed_param.mValues.end();
+ it != end_it;
+ ++it)
{
- name_stack.back().second = parser.newParseGeneration();
+ name_stack.back().second = true;
- std::string key = key_it->getKey();
- if (!key.empty() && key_it->mKeyVersion == it->getLastChangeVersion())
+ std::string key = it->getValueName();
+ if (!key.empty())
{
- if(!parser.writeValue(key, name_stack))
- {
- return;
- }
+ parser.writeValue(key, name_stack);
}
// Not parsed via named values, write out value directly
// NOTE: currently we don't worry about removing default values in Multiple
- else if (!it->serializeBlock(parser, name_stack, NULL))
+ else
{
- return;
+ it->serializeBlock(parser, name_stack, NULL);
}
}
}
@@ -1193,43 +1428,46 @@ namespace LLInitParam
static void inspectParam(const Param& param, Parser& parser, Parser::name_stack_t& name_stack, S32 min_count, S32 max_count)
{
// I am a vector of blocks, so describe my contents recursively
- value_t().inspectBlock(parser, name_stack);
+ param_value_t(value_t()).inspectBlock(parser, name_stack, min_count, max_count);
}
void set(value_assignment_t val, bool flag_as_provided = true)
{
mValues = val;
- mCachedKeys.clear();
- mCachedKeys.resize(mValues.size());
setProvided(flag_as_provided);
- Param::enclosingBlock().setLastChangedParam(*this, flag_as_provided);
}
- void setIfNotProvided(value_assignment_t val, bool flag_as_provided = true)
- {
- if (!isProvided())
- {
- set(val, flag_as_provided);
- }
- }
-
- value_ref_t add()
+ param_value_t& add()
{
mValues.push_back(value_t());
- mCachedKeys.push_back(Data());
- setProvided(true);
+ setProvided();
return mValues.back();
}
- void add(value_const_ref_t item)
+ self_t& add(const value_t& item)
{
mValues.push_back(item);
- mCachedKeys.push_back(Data());
- setProvided(true);
+ setProvided();
+ return *this;
+ }
+
+ self_t& add(const typename name_value_lookup_t::name_t& name)
+ {
+ value_t value;
+
+ // try to parse a per type named value
+ if (name_value_lookup_t::getValueFromName(name, value))
+ {
+ add(value);
+ mValues.back().setValueName(name);
+ }
+ return *this;
}
// implicit conversion
- operator value_assignment_t() const { return self_t::get(); }
+ operator value_assignment_t() const { return mValues; }
+ // explicit conversion
+ value_assignment_t operator()() const { return mValues; }
typedef typename container_t::iterator iterator;
typedef typename container_t::const_iterator const_iterator;
@@ -1243,8 +1481,8 @@ namespace LLInitParam
U32 numValidElements() const
{
U32 count = 0;
- for (const_iterator it = mValues.begin();
- it != mValues.end();
+ for (const_iterator it = mValues.begin(), end_it = mValues.end();
+ it != end_it;
++it)
{
if(it->validateBlock(false)) count++;
@@ -1253,96 +1491,99 @@ namespace LLInitParam
}
protected:
- value_assignment_t get() const
- {
- return mValues;
- }
static bool mergeWith(Param& dst, const Param& src, bool overwrite)
{
const self_t& src_typed_param = static_cast<const self_t&>(src);
self_t& dst_typed_param = static_cast<self_t&>(dst);
- if (src_typed_param.isProvided()
- && (overwrite || !dst_typed_param.isProvided()))
+ if (overwrite)
{
- dst_typed_param.set(src_typed_param.get());
- return true;
+ std::copy(src_typed_param.begin(), src_typed_param.end(), std::back_inserter(dst_typed_param.mValues));
+ }
+ else
+ {
+ container_t new_values(src_typed_param.mValues);
+ std::copy(dst_typed_param.begin(), dst_typed_param.end(), std::back_inserter(new_values));
+ std::swap(dst_typed_param.mValues, new_values);
}
- return false;
- }
- struct Data : public key_cache_t
- {
- S32 mKeyVersion; // version of block for which key was last valid
+ if (src_typed_param.begin() != src_typed_param.end())
+ {
+ dst_typed_param.setProvided();
+ }
- Data() : mKeyVersion(0) {}
- };
+ return true;
+ }
container_t mValues;
- std::vector<Data> mCachedKeys;
-
- S32 mLastParamGeneration;
};
- template <typename DERIVED_BLOCK>
- class Choice : public BaseBlock
+ template <typename DERIVED_BLOCK, typename BASE_BLOCK = BaseBlock>
+ class ChoiceBlock : public BASE_BLOCK
{
- typedef Choice<DERIVED_BLOCK> self_t;
- typedef Choice<DERIVED_BLOCK> enclosing_block_t;
+ typedef ChoiceBlock<DERIVED_BLOCK, BASE_BLOCK> self_t;
+ typedef ChoiceBlock<DERIVED_BLOCK, BASE_BLOCK> enclosing_block_t;
+ typedef BASE_BLOCK base_block_t;
LOG_CLASS(self_t);
public:
// take all provided params from other and apply to self
bool overwriteFrom(const self_t& other)
{
- return merge(selfBlockDescriptor(), other, true);
+ return static_cast<DERIVED_BLOCK*>(this)->mergeBlock(selfBlockDescriptor(), other, true);
}
// take all provided params that are not already provided, and apply to self
bool fillFrom(const self_t& other)
{
- return merge(selfBlockDescriptor(), other, false);
+ return static_cast<DERIVED_BLOCK*>(this)->mergeBlock(selfBlockDescriptor(), other, false);
}
- // merge with other block
- bool merge(BlockDescriptor& block_data, const self_t& other, bool overwrite)
+ bool mergeBlockParam(bool source_provided, bool dest_provided, BlockDescriptor& block_data, const self_t& source, bool overwrite)
{
- // only merge a choice if we are overwriting with other's contents
- if (overwrite)
+ bool source_override = source_provided && (overwrite || !dest_provided);
+
+ if (source_override || source.mCurChoice == mCurChoice)
{
- mCurChoice = other.mCurChoice;
- return BaseBlock::merge(selfBlockDescriptor(), other, overwrite);
+ return mergeBlock(block_data, source, overwrite);
}
return false;
}
+ // merge with other block
+ bool mergeBlock(BlockDescriptor& block_data, const self_t& other, bool overwrite)
+ {
+ mCurChoice = other.mCurChoice;
+ return base_block_t::mergeBlock(selfBlockDescriptor(), other, overwrite);
+ }
+
// clear out old choice when param has changed
- /*virtual*/ void setLastChangedParam(const Param& last_param, bool user_provided)
+ /*virtual*/ void paramChanged(const Param& changed_param, bool user_provided)
{
- param_handle_t changed_param_handle = BaseBlock::getHandleFromParam(&last_param);
+ param_handle_t changed_param_handle = base_block_t::getHandleFromParam(&changed_param);
// if we have a new choice...
if (changed_param_handle != mCurChoice)
{
// clear provided flag on previous choice
- Param* previous_choice = BaseBlock::getParamFromHandle(mCurChoice);
+ Param* previous_choice = base_block_t::getParamFromHandle(mCurChoice);
if (previous_choice)
{
previous_choice->setProvided(false);
}
mCurChoice = changed_param_handle;
}
- BaseBlock::setLastChangedParam(last_param, user_provided);
+ base_block_t::paramChanged(changed_param, user_provided);
}
virtual const BlockDescriptor& mostDerivedBlockDescriptor() const { return selfBlockDescriptor(); }
virtual BlockDescriptor& mostDerivedBlockDescriptor() { return selfBlockDescriptor(); }
protected:
- Choice()
+ ChoiceBlock()
: mCurChoice(0)
{
- BaseBlock::init(selfBlockDescriptor(), BaseBlock::selfBlockDescriptor(), sizeof(DERIVED_BLOCK));
+ BaseBlock::init(selfBlockDescriptor(), base_block_t::selfBlockDescriptor(), sizeof(DERIVED_BLOCK));
}
// Alternatives are mutually exclusive wrt other Alternatives in the same block.
@@ -1352,30 +1593,42 @@ namespace LLInitParam
class Alternative : public TypedParam<T, NAME_VALUE_LOOKUP, false>
{
public:
- friend class Choice<DERIVED_BLOCK>;
+ friend class ChoiceBlock<DERIVED_BLOCK>;
typedef Alternative<T, NAME_VALUE_LOOKUP> self_t;
- typedef TypedParam<T, NAME_VALUE_LOOKUP, false, IsBaseBlock<T>::value> super_t;
+ typedef TypedParam<T, NAME_VALUE_LOOKUP, false, IsBlock<ParamValue<T, NAME_VALUE_LOOKUP> >::value> super_t;
typedef typename super_t::value_assignment_t value_assignment_t;
- explicit Alternative(const char* name, value_assignment_t val = DefaultInitializer<T>::get())
+ using super_t::operator =;
+
+ explicit Alternative(const char* name = "", value_assignment_t val = defaultValue<T>())
: super_t(DERIVED_BLOCK::selfBlockDescriptor(), name, val, NULL, 0, 1),
mOriginalValue(val)
{
// assign initial choice to first declared option
DERIVED_BLOCK* blockp = ((DERIVED_BLOCK*)DERIVED_BLOCK::selfBlockDescriptor().mCurrentBlockPtr);
- if (LL_UNLIKELY(
- DERIVED_BLOCK::selfBlockDescriptor().mInitializationState == BlockDescriptor::INITIALIZING
- && blockp->mCurChoice == 0))
+ if (LL_UNLIKELY(DERIVED_BLOCK::selfBlockDescriptor().mInitializationState == BlockDescriptor::INITIALIZING))
{
- blockp->mCurChoice = Param::enclosingBlock().getHandleFromParam(this);
+ if(blockp->mCurChoice == 0)
+ {
+ blockp->mCurChoice = Param::enclosingBlock().getHandleFromParam(this);
+ }
}
}
- Alternative& operator=(value_assignment_t val)
+ void choose()
+ {
+ static_cast<enclosing_block_t&>(Param::enclosingBlock()).paramChanged(*this, true);
+ }
+
+ void chooseAs(value_assignment_t val)
+ {
+ super_t::set(val);
+ }
+
+ void operator =(value_assignment_t val)
{
super_t::set(val);
- return *this;
}
void operator()(typename super_t::value_assignment_t val)
@@ -1384,19 +1637,15 @@ namespace LLInitParam
}
operator value_assignment_t() const
- {
- if (static_cast<enclosing_block_t&>(Param::enclosingBlock()).getCurrentChoice() == this)
- {
- return super_t::get();
- }
- return mOriginalValue;
+ {
+ return (*this)();
}
value_assignment_t operator()() const
{
if (static_cast<enclosing_block_t&>(Param::enclosingBlock()).getCurrentChoice() == this)
{
- return super_t::get();
+ return super_t::getValue();
}
return mOriginalValue;
}
@@ -1422,7 +1671,7 @@ namespace LLInitParam
const Param* getCurrentChoice() const
{
- return BaseBlock::getParamFromHandle(mCurChoice);
+ return base_block_t::getParamFromHandle(mCurChoice);
}
};
@@ -1430,8 +1679,8 @@ namespace LLInitParam
class Block
: public BASE_BLOCK
{
- typedef Block<DERIVED_BLOCK, BASE_BLOCK> self_t;
- typedef Block<DERIVED_BLOCK, BASE_BLOCK> block_t;
+ typedef Block<DERIVED_BLOCK, BASE_BLOCK> self_t;
+ typedef Block<DERIVED_BLOCK, BASE_BLOCK> block_t;
public:
typedef BASE_BLOCK base_block_t;
@@ -1439,13 +1688,13 @@ namespace LLInitParam
// take all provided params from other and apply to self
bool overwriteFrom(const self_t& other)
{
- return BaseBlock::merge(selfBlockDescriptor(), other, true);
+ return static_cast<DERIVED_BLOCK*>(this)->mergeBlock(selfBlockDescriptor(), other, true);
}
// take all provided params that are not already provided, and apply to self
bool fillFrom(const self_t& other)
{
- return BaseBlock::merge(selfBlockDescriptor(), other, false);
+ return static_cast<DERIVED_BLOCK*>(this)->mergeBlock(selfBlockDescriptor(), other, false);
}
virtual const BlockDescriptor& mostDerivedBlockDescriptor() const { return selfBlockDescriptor(); }
@@ -1465,43 +1714,48 @@ namespace LLInitParam
class Optional : public TypedParam<T, NAME_VALUE_LOOKUP, false>
{
public:
- typedef TypedParam<T, NAME_VALUE_LOOKUP, false, IsBaseBlock<T>::value> super_t;
+ typedef TypedParam<T, NAME_VALUE_LOOKUP, false, IsBlock<ParamValue<T, NAME_VALUE_LOOKUP> >::value> super_t;
typedef typename super_t::value_assignment_t value_assignment_t;
- explicit Optional(const char* name = "", value_assignment_t val = DefaultInitializer<T>::get())
+ using super_t::operator();
+ using super_t::operator =;
+
+ explicit Optional(const char* name = "", value_assignment_t val = defaultValue<T>())
: super_t(DERIVED_BLOCK::selfBlockDescriptor(), name, val, NULL, 0, 1)
{
//#pragma message("Parsing LLInitParam::Block::Optional")
}
- Optional& operator=(value_assignment_t val)
+ Optional& operator =(value_assignment_t val)
{
set(val);
return *this;
}
- DERIVED_BLOCK& operator()(typename super_t::value_assignment_t val)
+ DERIVED_BLOCK& operator()(value_assignment_t val)
{
super_t::set(val);
return static_cast<DERIVED_BLOCK&>(Param::enclosingBlock());
}
- using super_t::operator();
};
template <typename T, typename NAME_VALUE_LOOKUP = TypeValues<T> >
class Mandatory : public TypedParam<T, NAME_VALUE_LOOKUP, false>
{
public:
- typedef TypedParam<T, NAME_VALUE_LOOKUP, false, IsBaseBlock<T>::value> super_t;
+ typedef TypedParam<T, NAME_VALUE_LOOKUP, false, IsBlock<ParamValue<T, NAME_VALUE_LOOKUP> >::value> super_t;
typedef Mandatory<T, NAME_VALUE_LOOKUP> self_t;
typedef typename super_t::value_assignment_t value_assignment_t;
+ using super_t::operator();
+ using super_t::operator =;
+
// mandatory parameters require a name to be parseable
- explicit Mandatory(const char* name = "", value_assignment_t val = DefaultInitializer<T>::get())
+ explicit Mandatory(const char* name = "", value_assignment_t val = defaultValue<T>())
: super_t(DERIVED_BLOCK::selfBlockDescriptor(), name, val, &validate, 1, 1)
{}
- Mandatory& operator=(value_assignment_t val)
+ Mandatory& operator =(value_assignment_t val)
{
set(val);
return *this;
@@ -1512,7 +1766,6 @@ namespace LLInitParam
super_t::set(val);
return static_cast<DERIVED_BLOCK&>(Param::enclosingBlock());
}
- using super_t::operator();
static bool validate(const Param* p)
{
@@ -1526,23 +1779,23 @@ namespace LLInitParam
class Multiple : public TypedParam<T, NAME_VALUE_LOOKUP, true>
{
public:
- typedef TypedParam<T, NAME_VALUE_LOOKUP, true, IsBaseBlock<T>::value> super_t;
+ typedef TypedParam<T, NAME_VALUE_LOOKUP, true, IsBlock<ParamValue<T, NAME_VALUE_LOOKUP> >::value> super_t;
typedef Multiple<T, RANGE, NAME_VALUE_LOOKUP> self_t;
typedef typename super_t::container_t container_t;
typedef typename super_t::value_assignment_t value_assignment_t;
typedef typename super_t::iterator iterator;
typedef typename super_t::const_iterator const_iterator;
- explicit Multiple(const char* name = "", value_assignment_t val = DefaultInitializer<container_t>::get())
- : super_t(DERIVED_BLOCK::selfBlockDescriptor(), name, val, &validate, RANGE::minCount(), RANGE::maxCount())
+ explicit Multiple(const char* name = "")
+ : super_t(DERIVED_BLOCK::selfBlockDescriptor(), name, container_t(), &validate, RANGE::minCount, RANGE::maxCount)
{}
- Multiple& operator=(value_assignment_t val)
+ Multiple& operator =(value_assignment_t val)
{
set(val);
return *this;
}
-
+
DERIVED_BLOCK& operator()(typename super_t::value_assignment_t val)
{
super_t::set(val);
@@ -1552,7 +1805,7 @@ namespace LLInitParam
static bool validate(const Param* paramp)
{
U32 num_valid = ((super_t*)paramp)->numValidElements();
- return RANGE::minCount() <= num_valid && num_valid <= RANGE::maxCount();
+ return RANGE::minCount <= num_valid && num_valid <= RANGE::maxCount;
}
};
@@ -1565,20 +1818,21 @@ namespace LLInitParam
BlockDescriptor& block_descriptor = DERIVED_BLOCK::selfBlockDescriptor();
if (LL_UNLIKELY(block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING))
{
- ParamDescriptor param_descriptor(block_descriptor.mCurrentBlockPtr->getHandleFromParam(this),
+ ParamDescriptorPtr param_descriptor = ParamDescriptorPtr(new ParamDescriptor(
+ block_descriptor.mCurrentBlockPtr->getHandleFromParam(this),
NULL,
&deserializeParam,
NULL,
NULL,
NULL,
- 0, S32_MAX);
+ 0, S32_MAX));
BaseBlock::addParam(block_descriptor, param_descriptor, name);
}
}
- static bool deserializeParam(Param& param, Parser& parser, const Parser::name_stack_range_t& name_stack, S32 generation)
+ static bool deserializeParam(Param& param, Parser& parser, const Parser::name_stack_range_t& name_stack_range, bool new_name)
{
- if (name_stack.first == name_stack.second)
+ if (name_stack_range.first == name_stack_range.second)
{
//std::string message = llformat("Deprecated value %s ignored", getName().c_str());
//parser.parserWarning(message);
@@ -1589,6 +1843,7 @@ namespace LLInitParam
}
};
+ // different semantics for documentation purposes, but functionally identical
typedef Deprecated Ignored;
protected:
@@ -1597,139 +1852,327 @@ namespace LLInitParam
static BlockDescriptor sBlockDescriptor;
return sBlockDescriptor;
}
+
+ template <typename T, typename NAME_VALUE_LOOKUP, bool multiple, bool is_block>
+ void changeDefault(TypedParam<T, NAME_VALUE_LOOKUP, multiple, is_block>& param,
+ typename TypedParam<T, NAME_VALUE_LOOKUP, multiple, is_block>::value_assignment_t value)
+ {
+ if (!param.isProvided())
+ {
+ param.set(value, false);
+ }
+ }
+
};
- template<typename T, typename DERIVED = TypedParam<T> >
- class BlockValue
- : public Block<TypedParam<T, TypeValues<T>, false> >,
- public Param
+ template <typename DERIVED_BLOCK, typename BASE_BLOCK = BaseBlock>
+ class BatchBlock
+ : public Block<DERIVED_BLOCK, BASE_BLOCK>
{
public:
- typedef enum e_value_age
- {
- OLDER_THAN_BLOCK, // mData.mValue needs to be refreshed from the block parameters
- NEWER_THAN_BLOCK, // mData.mValue holds the authoritative value (which has been replicated to the block parameters via setBlockFromValue)
- SAME_AS_BLOCK // mData.mValue is derived from the block parameters, which are authoritative
- } EValueAge;
+ typedef BatchBlock<DERIVED_BLOCK, BASE_BLOCK> self_t;
+ typedef Block<DERIVED_BLOCK, BASE_BLOCK> super_t;
- typedef BlockValue<T> self_t;
- typedef Block<TypedParam<T, TypeValues<T>, false> > block_t;
- typedef const T& value_const_ref_t;
- typedef value_const_ref_t value_assignment_t;
- typedef typename TypeValues<T>::KeyCache key_cache_t;
+ BatchBlock()
+ {}
- BlockValue(BlockDescriptor& block_descriptor, const char* name, value_assignment_t value, ParamDescriptor::validation_func_t validate_func, S32 min_count, S32 max_count)
- : Param(block_descriptor.mCurrentBlockPtr),
- mData(value, NEWER_THAN_BLOCK)
+ bool deserializeBlock(Parser& p, Parser::name_stack_range_t name_stack_range, bool new_name)
{
- if (LL_UNLIKELY(block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING))
+ if (new_name)
{
- ParamDescriptor param_descriptor(block_descriptor.mCurrentBlockPtr->getHandleFromParam(this),
- &mergeWith,
- &deserializeParam,
- &serializeParam,
- validate_func,
- &inspectParam,
- min_count, max_count);
- BaseBlock::addParam(block_descriptor, param_descriptor, name);
+ // reset block
+ *static_cast<DERIVED_BLOCK*>(this) = defaultBatchValue();
}
+ return super_t::deserializeBlock(p, name_stack_range, new_name);
}
- // implicit conversion
- operator value_assignment_t() const { return get(); }
- // explicit conversion
- value_assignment_t operator()() const { return get(); }
-
- static bool deserializeParam(Param& param, Parser& parser, const Parser::name_stack_range_t& name_stack, S32 generation)
+ bool mergeBlock(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite)
{
- DERIVED& typed_param = static_cast<DERIVED&>(param);
- // type to apply parse direct value T
- if (name_stack.first == name_stack.second)
+ if (overwrite)
{
- if(parser.readValue(typed_param.mData.mValue))
- {
- typed_param.enclosingBlock().setLastChangedParam(param, true);
- typed_param.setProvided(true);
- typed_param.mData.clearKey();
- typed_param.mData.mValueAge = NEWER_THAN_BLOCK;
- typed_param.setBlockFromValue();
+ *static_cast<DERIVED_BLOCK*>(this) = defaultBatchValue();
+ // merge individual parameters into destination
+ return super_t::mergeBlock(super_t::selfBlockDescriptor(), other, overwrite);
+ }
+ return false;
+ }
+ protected:
+ static const DERIVED_BLOCK& defaultBatchValue()
+ {
+ static DERIVED_BLOCK default_value;
+ return default_value;
+ }
+ };
- return true;
- }
+ // FIXME: this specialization is not currently used, as it only matches against the BatchBlock base class
+ // and not the derived class with the actual params
+ template<typename DERIVED_BLOCK,
+ typename BASE_BLOCK,
+ typename NAME_VALUE_LOOKUP>
+ class ParamValue <BatchBlock<DERIVED_BLOCK, BASE_BLOCK>,
+ NAME_VALUE_LOOKUP,
+ true>
+ : public NAME_VALUE_LOOKUP,
+ protected BatchBlock<DERIVED_BLOCK, BASE_BLOCK>
+ {
+ public:
+ typedef BatchBlock<DERIVED_BLOCK, BASE_BLOCK> block_t;
+ typedef const BatchBlock<DERIVED_BLOCK, BASE_BLOCK>& value_assignment_t;
+ typedef block_t value_t;
+
+ ParamValue()
+ : block_t(),
+ mValidated(false)
+ {}
+
+ ParamValue(value_assignment_t other)
+ : block_t(other),
+ mValidated(false)
+ {
+ }
+
+ void setValue(value_assignment_t val)
+ {
+ *this = val;
+ }
+
+ value_assignment_t getValue() const
+ {
+ return *this;
+ }
+
+ BatchBlock<DERIVED_BLOCK, BASE_BLOCK>& getValue()
+ {
+ return *this;
+ }
+
+ operator value_assignment_t() const
+ {
+ return *this;
+ }
- if(!TypeValues<T>::empty())
+ value_assignment_t operator()() const
+ {
+ return *this;
+ }
+
+ protected:
+ mutable bool mValidated; // lazy validation flag
+ };
+
+ template<typename T, bool IS_BLOCK>
+ class ParamValue <BaseBlock::Lazy<T>,
+ TypeValues<T>,
+ IS_BLOCK>
+ : public IsBlock<T>::base_class_t
+ {
+ public:
+ typedef ParamValue <BaseBlock::Lazy<T>, TypeValues<T>, false> self_t;
+ typedef const T& value_assignment_t;
+ typedef T value_t;
+
+ ParamValue()
+ : mValue(),
+ mValidated(false)
+ {}
+
+ ParamValue(value_assignment_t other)
+ : mValue(other),
+ mValidated(false)
+ {}
+
+ void setValue(value_assignment_t val)
+ {
+ mValue.set(val);
+ }
+
+ value_assignment_t getValue() const
+ {
+ return mValue.get();
+ }
+
+ T& getValue()
+ {
+ return mValue.get();
+ }
+
+ operator value_assignment_t() const
+ {
+ return mValue.get();
+ }
+
+ value_assignment_t operator()() const
+ {
+ return mValue.get();
+ }
+
+ bool deserializeBlock(Parser& p, Parser::name_stack_range_t name_stack_range, bool new_name)
+ {
+ return mValue.get().deserializeBlock(p, name_stack_range, new_name);
+ }
+
+ void serializeBlock(Parser& p, Parser::name_stack_t& name_stack, const BaseBlock* diff_block = NULL) const
+ {
+ if (mValue.empty()) return;
+
+ mValue.get().serializeBlock(p, name_stack, diff_block);
+ }
+
+ bool inspectBlock(Parser& p, Parser::name_stack_t name_stack = Parser::name_stack_t(), S32 min_count = 0, S32 max_count = S32_MAX) const
+ {
+ if (mValue.empty()) return false;
+
+ return mValue.get().inspectBlock(p, name_stack, min_count, max_count);
+ }
+
+ protected:
+ mutable bool mValidated; // lazy validation flag
+
+ private:
+ BaseBlock::Lazy<T> mValue;
+ };
+
+ template <>
+ class ParamValue <LLSD,
+ TypeValues<LLSD>,
+ false>
+ : public TypeValues<LLSD>,
+ public BaseBlock
+ {
+ public:
+ typedef ParamValue<LLSD, TypeValues<LLSD>, false> self_t;
+ typedef const LLSD& value_assignment_t;
+
+ ParamValue()
+ : mValidated(false)
+ {}
+
+ ParamValue(value_assignment_t other)
+ : mValue(other),
+ mValidated(false)
+ {}
+
+ void setValue(value_assignment_t val) { mValue = val; }
+
+ value_assignment_t getValue() const { return mValue; }
+ LLSD& getValue() { return mValue; }
+
+ operator value_assignment_t() const { return mValue; }
+ value_assignment_t operator()() const { return mValue; }
+
+
+ // block param interface
+ bool deserializeBlock(Parser& p, Parser::name_stack_range_t name_stack_range, bool new_name);
+ void serializeBlock(Parser& p, Parser::name_stack_t& name_stack, const BaseBlock* diff_block = NULL) const;
+ bool inspectBlock(Parser& p, Parser::name_stack_t name_stack = Parser::name_stack_t(), S32 min_count = 0, S32 max_count = S32_MAX) const
+ {
+ //TODO: implement LLSD params as schema type Any
+ return true;
+ }
+
+ protected:
+ mutable bool mValidated; // lazy validation flag
+
+ private:
+ static void serializeElement(Parser& p, const LLSD& sd, Parser::name_stack_t& name_stack);
+
+ LLSD mValue;
+ };
+
+ template<typename T>
+ class CustomParamValue
+ : public Block<ParamValue<T, TypeValues<T> > >,
+ public TypeValues<T>
+ {
+ public:
+ typedef enum e_value_age
+ {
+ VALUE_NEEDS_UPDATE, // mValue needs to be refreshed from the block parameters
+ VALUE_AUTHORITATIVE, // mValue holds the authoritative value (which has been replicated to the block parameters via updateBlockFromValue)
+ BLOCK_AUTHORITATIVE // mValue is derived from the block parameters, which are authoritative
+ } EValueAge;
+
+ typedef ParamValue<T, TypeValues<T> > derived_t;
+ typedef CustomParamValue<T> self_t;
+ typedef Block<derived_t> block_t;
+ typedef const T& value_assignment_t;
+ typedef T value_t;
+
+
+ CustomParamValue(const T& value = T())
+ : mValue(value),
+ mValueAge(VALUE_AUTHORITATIVE),
+ mValidated(false)
+ {}
+
+ bool deserializeBlock(Parser& parser, Parser::name_stack_range_t name_stack_range, bool new_name)
+ {
+ derived_t& typed_param = static_cast<derived_t&>(*this);
+ // try to parse direct value T
+ if (name_stack_range.first == name_stack_range.second)
+ {
+ if(parser.readValue(typed_param.mValue))
{
- // try to parse a known named value
- std::string name;
- if (parser.readValue(name))
- {
- // try to parse a per type named value
- if (TypeValues<T>::get(name, typed_param.mData.mValue))
- {
- typed_param.mData.setKey(name);
- typed_param.enclosingBlock().setLastChangedParam(param, true);
- typed_param.setProvided(true);
- typed_param.mData.mValueAge = NEWER_THAN_BLOCK;
- typed_param.setBlockFromValue();
+ typed_param.mValueAge = VALUE_AUTHORITATIVE;
+ typed_param.updateBlockFromValue(false);
- return true;
- }
- }
+ typed_param.clearValueName();
+
+ return true;
}
}
// fall back on parsing block components for T
- // if we deserialized at least one component...
- if (typed_param.BaseBlock::deserializeBlock(parser, name_stack))
- {
- // ...our block is provided, and considered changed
- typed_param.enclosingBlock().setLastChangedParam(param, true);
- typed_param.setProvided(true);
- return true;
- }
- return false;
+ return typed_param.BaseBlock::deserializeBlock(parser, name_stack_range, new_name);
}
- static void serializeParam(const Param& param, Parser& parser, Parser::name_stack_t& name_stack, const Param* diff_param)
+ void serializeBlock(Parser& parser, Parser::name_stack_t& name_stack, const BaseBlock* diff_block = NULL) const
{
- const self_t& typed_param = static_cast<const self_t&>(param);
+ const derived_t& typed_param = static_cast<const derived_t&>(*this);
+ const derived_t* diff_param = static_cast<const derived_t*>(diff_block);
- if (!typed_param.isProvided()) return;
-
- std::string key = typed_param.mData.getKey();
+ std::string key = typed_param.getValueName();
// first try to write out name of name/value pair
if (!key.empty())
{
- if (!diff_param || !ParamCompare<std::string>::equals(static_cast<const self_t*>(diff_param)->mData.getKey(), key))
+ if (!diff_param || !ParamCompare<std::string>::equals(diff_param->getValueName(), key))
{
- if (!parser.writeValue(key, name_stack))
- {
- return;
- }
+ parser.writeValue(key, name_stack);
}
}
// then try to serialize value directly
- else if (!diff_param || !ParamCompare<T>::equals(typed_param.get(), (static_cast<const self_t*>(diff_param))->get()))
+ else if (!diff_param || !ParamCompare<T>::equals(typed_param.getValue(), diff_param->getValue()))
{
- if (parser.writeValue(typed_param.mData.mValue, name_stack))
+ if (!parser.writeValue(typed_param.getValue(), name_stack))
{
- return;
+ //RN: *always* serialize provided components of BlockValue (don't pass diff_param on),
+ // since these tend to be viewed as the constructor arguments for the value T. It seems
+ // cleaner to treat the uniqueness of a BlockValue according to the generated value, and
+ // not the individual components. This way <color red="0" green="1" blue="0"/> will not
+ // be exported as <color green="1"/>, since it was probably the intent of the user to
+ // be specific about the RGB color values. This also fixes an issue where we distinguish
+ // between rect.left not being provided and rect.left being explicitly set to 0 (same as default)
+
+ if (typed_param.mValueAge == VALUE_AUTHORITATIVE)
+ {
+ // if the value is authoritative but the parser doesn't accept the value type
+ // go ahead and make a copy, and splat the value out to its component params
+ // and serialize those params
+ derived_t copy(typed_param);
+ copy.updateBlockFromValue(true);
+ copy.block_t::serializeBlock(parser, name_stack, NULL);
+ }
+ else
+ {
+ block_t::serializeBlock(parser, name_stack, NULL);
+ }
}
-
- //RN: *always* serialize provided components of BlockValue (don't pass diff_param on),
- // since these tend to be viewed as the constructor arguments for the value T. It seems
- // cleaner to treat the uniqueness of a BlockValue according to the generated value, and
- // not the individual components. This way <color red="0" green="1" blue="0"/> will not
- // be exported as <color green="1"/>, since it was probably the intent of the user to
- // be specific about the RGB color values. This also fixes an issue where we distinguish
- // between rect.left not being provided and rect.left being explicitly set to 0 (same as default)
- typed_param.BaseBlock::serializeBlock(parser, name_stack, NULL);
}
}
- static void inspectParam(const Param& param, Parser& parser, Parser::name_stack_t& name_stack, S32 min_count, S32 max_count)
+ bool inspectBlock(Parser& parser, Parser::name_stack_t name_stack = Parser::name_stack_t(), S32 min_count = 0, S32 max_count = S32_MAX) const
{
// first, inspect with actual type...
parser.inspectValue<T>(name_stack, min_count, max_count, NULL);
@@ -1739,25 +2182,19 @@ namespace LLInitParam
parser.inspectValue<std::string>(name_stack, min_count, max_count, TypeValues<T>::getPossibleValues());
}
// then recursively inspect contents...
- const self_t& typed_param = static_cast<const self_t&>(param);
- typed_param.inspectBlock(parser, name_stack);
+ return block_t::inspectBlock(parser, name_stack, min_count, max_count);
}
-
- bool isProvided() const
+ bool validateBlock(bool emit_errors = true) const
{
- if (!Param::anyProvided()) return false;
-
- // block has an updated parameter
- // if cached value is stale, regenerate from params
- if (mData.mValueAge == OLDER_THAN_BLOCK)
+ if (mValueAge == VALUE_NEEDS_UPDATE)
{
- if (block_t::validateBlock(false))
+ if (block_t::validateBlock(emit_errors))
{
- static_cast<const DERIVED*>(this)->setValueFromBlock();
// clear stale keyword associated with old value
- mData.clearKey();
- mData.mValueAge = SAME_AS_BLOCK;
+ TypeValues<T>::clearValueName();
+ mValueAge = BLOCK_AUTHORITATIVE;
+ static_cast<derived_t*>(const_cast<self_t*>(this))->updateValueFromBlock();
return true;
}
else
@@ -1774,104 +2211,89 @@ namespace LLInitParam
}
}
- void set(value_assignment_t val, bool flag_as_provided = true)
- {
- Param::enclosingBlock().setLastChangedParam(*this, flag_as_provided);
-
- // set param version number to be up to date, so we ignore block contents
- mData.mValueAge = NEWER_THAN_BLOCK;
-
- mData.mValue = val;
- mData.clearKey();
- setProvided(flag_as_provided);
- static_cast<DERIVED*>(this)->setBlockFromValue();
- }
-
- void setIfNotProvided(value_assignment_t val, bool flag_as_provided = true)
- {
- // don't override any user provided value
- if (!isProvided())
- {
- set(val, flag_as_provided);
- }
- }
-
// propagate change status up to enclosing block
- /*virtual*/ void setLastChangedParam(const Param& last_param, bool user_provided)
+ /*virtual*/ void paramChanged(const Param& changed_param, bool user_provided)
{
- BaseBlock::setLastChangedParam(last_param, user_provided);
- Param::enclosingBlock().setLastChangedParam(*this, user_provided);
+ BaseBlock::paramChanged(changed_param, user_provided);
if (user_provided)
{
- setProvided(true); // some component provided
// a parameter changed, so our value is out of date
- mData.mValueAge = OLDER_THAN_BLOCK;
+ mValueAge = VALUE_NEEDS_UPDATE;
}
}
+
+ void setValue(value_assignment_t val)
+ {
+ derived_t& typed_param = static_cast<derived_t&>(*this);
+ // set param version number to be up to date, so we ignore block contents
+ mValueAge = VALUE_AUTHORITATIVE;
+ mValue = val;
+ typed_param.clearValueName();
+ static_cast<derived_t*>(this)->updateBlockFromValue(false);
+ }
- protected:
- value_assignment_t get() const
+ value_assignment_t getValue() const
{
- // if some parameters were provided, issue warnings on invalid blocks
- if (Param::anyProvided() && (mData.mValueAge == OLDER_THAN_BLOCK))
- {
- // go ahead and issue warnings at this point if any param is invalid
- if(block_t::validateBlock(true))
- {
- static_cast<const DERIVED*>(this)->setValueFromBlock();
- mData.clearKey();
- mData.mValueAge = SAME_AS_BLOCK;
- }
- }
+ validateBlock(true);
+ return mValue;
+ }
- return mData.mValue;
+ T& getValue()
+ {
+ validateBlock(true);
+ return mValue;
}
+ operator value_assignment_t() const
+ {
+ return getValue();
+ }
- struct Data : public key_cache_t
+ value_assignment_t operator()() const
{
- Data(const T& value, EValueAge age)
- : mValue(value),
- mValueAge(age)
- {}
+ return getValue();
+ }
- T mValue;
- EValueAge mValueAge;
- };
+ protected:
- // mutable to allow lazy updates on get
- mutable Data mData;
+ // use this from within updateValueFromBlock() to set the value without making it authoritative
+ void updateValue(value_assignment_t value)
+ {
+ mValue = value;
+ }
- private:
- static bool mergeWith(Param& dst, const Param& src, bool overwrite)
+ bool mergeBlockParam(bool source_provided, bool dst_provided, BlockDescriptor& block_data, const BaseBlock& source, bool overwrite)
{
- const DERIVED& src_typed_param = static_cast<const DERIVED&>(src);
- DERIVED& dst_typed_param = static_cast<DERIVED&>(dst);
+ bool source_override = source_provided && (overwrite || !dst_provided);
- if (src_typed_param.isProvided()
- && (overwrite || !dst_typed_param.isProvided()))
+ const derived_t& src_typed_param = static_cast<const derived_t&>(source);
+
+ if (source_override && src_typed_param.mValueAge == VALUE_AUTHORITATIVE)
{
- if (src_typed_param.mData.mValueAge == NEWER_THAN_BLOCK)
- {
- // copy value over
- dst_typed_param.set(src_typed_param.get());
- }
- else
- {
- // merge individual parameters into destination
- dst_typed_param.merge(block_t::selfBlockDescriptor(), src_typed_param, overwrite);
- }
+ // copy value over
+ setValue(src_typed_param.getValue());
return true;
}
- return false;
+ // merge individual parameters into destination
+ if (mValueAge == VALUE_AUTHORITATIVE)
+ {
+ static_cast<derived_t*>(this)->updateBlockFromValue(dst_provided);
+ }
+ return mergeBlock(block_data, source, overwrite);
}
- };
- template<>
- struct ParamCompare<LLSD, false>
- {
- static bool equals(const LLSD &a, const LLSD &b);
+ bool mergeBlock(BlockDescriptor& block_data, const BaseBlock& source, bool overwrite)
+ {
+ return block_t::mergeBlock(block_data, source, overwrite);
+ }
+
+ mutable bool mValidated; // lazy validation flag
+
+ private:
+ mutable T mValue;
+ mutable EValueAge mValueAge;
};
}
+
#endif // LL_LLPARAM_H
diff --git a/indra/llxuixml/llregistry.h b/indra/llxuixml/llregistry.h
index eee9933739..36ce6a97b7 100644
--- a/indra/llxuixml/llregistry.h
+++ b/indra/llxuixml/llregistry.h
@@ -343,4 +343,9 @@ private:
ScopedRegistrar* mStaticScope;
};
+// helper macro for doing static registration
+#define GLUED_TOKEN(x, y) x ## y
+#define GLUE_TOKENS(x, y) GLUED_TOKEN(x, y)
+#define LLREGISTER_STATIC(REGISTRY, KEY, VALUE) static REGISTRY::StaticRegistrar GLUE_TOKENS(reg, __LINE__)(KEY, VALUE);
+
#endif
diff --git a/indra/llxuixml/lltrans.cpp b/indra/llxuixml/lltrans.cpp
index 11127a53f5..5388069c24 100644
--- a/indra/llxuixml/lltrans.cpp
+++ b/indra/llxuixml/lltrans.cpp
@@ -30,6 +30,8 @@
#include "llfasttimer.h" // for call count statistics
#include "llxuiparser.h"
+#include "llsd.h"
+#include "llxmlnode.h"
#include <map>
@@ -154,13 +156,28 @@ std::string LLTrans::getString(const std::string &xml_desc, const LLStringUtil::
}
else
{
- LLSD args;
- args["STRING_NAME"] = xml_desc;
LL_WARNS_ONCE("configuration") << "Missing String in strings.xml: [" << xml_desc << "]" << LL_ENDL;
+ return "MissingString("+xml_desc+")";
+ }
+}
- //LLNotificationsUtil::add("MissingString", args); // *TODO: resurrect
- //return xml_desc;
+//static
+std::string LLTrans::getString(const std::string &xml_desc, const LLSD& msg_args)
+{
+ // Don't care about time as much as call count. Make sure we're not
+ // calling LLTrans::getString() in an inner loop. JC
+ LLFastTimer timer(FTM_GET_TRANS);
+ template_map_t::iterator iter = sStringTemplates.find(xml_desc);
+ if (iter != sStringTemplates.end())
+ {
+ std::string text = iter->second.mText;
+ LLStringUtil::format(text, msg_args);
+ return text;
+ }
+ else
+ {
+ LL_WARNS_ONCE("configuration") << "Missing String in strings.xml: [" << xml_desc << "]" << LL_ENDL;
return "MissingString("+xml_desc+")";
}
}
@@ -182,11 +199,27 @@ bool LLTrans::findString(std::string &result, const std::string &xml_desc, const
}
else
{
- LLSD args;
- args["STRING_NAME"] = xml_desc;
- LL_WARNS_ONCE("configuration") << "Missing String in strings.xml: [" << xml_desc << "]" << LL_ENDL;
- //LLNotificationsUtil::add("MissingString", args);
-
+ LL_WARNS_ONCE("configuration") << "Missing String in strings.xml: [" << xml_desc << "]" << LL_ENDL;
+ return false;
+ }
+}
+
+//static
+bool LLTrans::findString(std::string &result, const std::string &xml_desc, const LLSD& msg_args)
+{
+ LLFastTimer timer(FTM_GET_TRANS);
+
+ template_map_t::iterator iter = sStringTemplates.find(xml_desc);
+ if (iter != sStringTemplates.end())
+ {
+ std::string text = iter->second.mText;
+ LLStringUtil::format(text, msg_args);
+ result = text;
+ return true;
+ }
+ else
+ {
+ LL_WARNS_ONCE("configuration") << "Missing String in strings.xml: [" << xml_desc << "]" << LL_ENDL;
return false;
}
}
@@ -255,3 +288,8 @@ std::string LLTrans::getCountString(const std::string& language, const std::stri
std::string key = llformat("%s%s", xml_desc.c_str(), form);
return getString(key, args);
}
+
+void LLTrans::setDefaultArg(const std::string& name, const std::string& value)
+{
+ sDefaultArgs[name] = value;
+}
diff --git a/indra/llxuixml/lltrans.h b/indra/llxuixml/lltrans.h
index 42c27b6976..128b51d383 100644
--- a/indra/llxuixml/lltrans.h
+++ b/indra/llxuixml/lltrans.h
@@ -29,8 +29,12 @@
#include <map>
+#include "llpointer.h"
#include "llstring.h"
-#include "llxmlnode.h"
+
+class LLXMLNode;
+
+class LLSD;
/**
* @brief String template loaded from strings.xml
@@ -61,9 +65,9 @@ public:
* @param default_args Set of strings (expected to be in the file) to use as default replacement args, e.g. "SECOND_LIFE"
* @returns true if the file was parsed successfully, true if something went wrong
*/
- static bool parseStrings(LLXMLNodePtr& root, const std::set<std::string>& default_args);
+ static bool parseStrings(LLPointer<LLXMLNode> & root, const std::set<std::string>& default_args);
- static bool parseLanguageStrings(LLXMLNodePtr &root);
+ static bool parseLanguageStrings(LLPointer<LLXMLNode> & root);
/**
* @brief Returns a translated string
@@ -72,7 +76,9 @@ public:
* @returns Translated string
*/
static std::string getString(const std::string &xml_desc, const LLStringUtil::format_map_t& args);
+ static std::string getString(const std::string &xml_desc, const LLSD& args);
static bool findString(std::string &result, const std::string &xml_desc, const LLStringUtil::format_map_t& args);
+ static bool findString(std::string &result, const std::string &xml_desc, const LLSD& args);
// Returns translated string with [COUNT] replaced with a number, following
// special per-language logic for plural nouns. For example, some languages
@@ -110,6 +116,8 @@ public:
return sDefaultArgs;
}
+ static void setDefaultArg(const std::string& name, const std::string& value);
+
// insert default args into an arg list
static void getArgs(LLStringUtil::format_map_t& args)
{
diff --git a/indra/llxuixml/llxuiparser.cpp b/indra/llxuixml/llxuiparser.cpp
index 9942af6b37..afc76024d1 100644
--- a/indra/llxuixml/llxuiparser.cpp
+++ b/indra/llxuixml/llxuiparser.cpp
@@ -51,6 +51,270 @@ static LLInitParam::Parser::parser_read_func_map_t sXSDReadFuncs;
static LLInitParam::Parser::parser_write_func_map_t sXSDWriteFuncs;
static LLInitParam::Parser::parser_inspect_func_map_t sXSDInspectFuncs;
+static LLInitParam::Parser::parser_read_func_map_t sSimpleXUIReadFuncs;
+static LLInitParam::Parser::parser_write_func_map_t sSimpleXUIWriteFuncs;
+static LLInitParam::Parser::parser_inspect_func_map_t sSimpleXUIInspectFuncs;
+
+const char* NO_VALUE_MARKER = "no_value";
+
+const S32 LINE_NUMBER_HERE = 0;
+
+struct MaxOccursValues : public LLInitParam::TypeValuesHelper<U32, MaxOccursValues>
+{
+ static void declareValues()
+ {
+ declare("unbounded", U32_MAX);
+ }
+};
+
+struct Occurs : public LLInitParam::Block<Occurs>
+{
+ Optional<U32> minOccurs;
+ Optional<U32, MaxOccursValues> maxOccurs;
+
+ Occurs()
+ : minOccurs("minOccurs", 0),
+ maxOccurs("maxOccurs", U32_MAX)
+
+ {}
+};
+
+
+typedef enum
+{
+ USE_REQUIRED,
+ USE_OPTIONAL
+} EUse;
+
+namespace LLInitParam
+{
+ template<>
+ struct TypeValues<EUse> : public TypeValuesHelper<EUse>
+ {
+ static void declareValues()
+ {
+ declare("required", USE_REQUIRED);
+ declare("optional", USE_OPTIONAL);
+ }
+ };
+}
+
+struct Element;
+struct Group;
+struct Choice;
+struct Sequence;
+struct Any;
+
+struct Attribute : public LLInitParam::Block<Attribute>
+{
+ Mandatory<std::string> name;
+ Mandatory<std::string> type;
+ Mandatory<EUse> use;
+
+ Attribute()
+ : name("name"),
+ type("type"),
+ use("use")
+ {}
+};
+
+struct Any : public LLInitParam::Block<Any, Occurs>
+{
+ Optional<std::string> _namespace;
+
+ Any()
+ : _namespace("namespace")
+ {}
+};
+
+struct All : public LLInitParam::Block<All, Occurs>
+{
+ Multiple< Lazy<Element> > elements;
+
+ All()
+ : elements("element")
+ {
+ maxOccurs = 1;
+ }
+};
+
+struct Choice : public LLInitParam::ChoiceBlock<Choice, Occurs>
+{
+ Alternative< Lazy<Element> > element;
+ Alternative< Lazy<Group> > group;
+ Alternative< Lazy<Choice> > choice;
+ Alternative< Lazy<Sequence> > sequence;
+ Alternative< Lazy<Any> > any;
+
+ Choice()
+ : element("element"),
+ group("group"),
+ choice("choice"),
+ sequence("sequence"),
+ any("any")
+ {}
+
+};
+
+struct Sequence : public LLInitParam::ChoiceBlock<Sequence, Occurs>
+{
+ Alternative< Lazy<Element> > element;
+ Alternative< Lazy<Group> > group;
+ Alternative< Lazy<Choice> > choice;
+ Alternative< Lazy<Sequence> > sequence;
+ Alternative< Lazy<Any> > any;
+};
+
+struct GroupContents : public LLInitParam::ChoiceBlock<GroupContents, Occurs>
+{
+ Alternative<All> all;
+ Alternative<Choice> choice;
+ Alternative<Sequence> sequence;
+
+ GroupContents()
+ : all("all"),
+ choice("choice"),
+ sequence("sequence")
+ {}
+};
+
+struct Group : public LLInitParam::Block<Group, GroupContents>
+{
+ Optional<std::string> name,
+ ref;
+
+ Group()
+ : name("name"),
+ ref("ref")
+ {}
+};
+
+struct Restriction : public LLInitParam::Block<Restriction>
+{
+};
+
+struct Extension : public LLInitParam::Block<Extension>
+{
+};
+
+struct SimpleContent : public LLInitParam::ChoiceBlock<SimpleContent>
+{
+ Alternative<Restriction> restriction;
+ Alternative<Extension> extension;
+
+ SimpleContent()
+ : restriction("restriction"),
+ extension("extension")
+ {}
+};
+
+struct SimpleType : public LLInitParam::Block<SimpleType>
+{
+ // TODO
+};
+
+struct ComplexContent : public LLInitParam::Block<ComplexContent, SimpleContent>
+{
+ Optional<bool> mixed;
+
+ ComplexContent()
+ : mixed("mixed", true)
+ {}
+};
+
+struct ComplexTypeContents : public LLInitParam::ChoiceBlock<ComplexTypeContents>
+{
+ Alternative<SimpleContent> simple_content;
+ Alternative<ComplexContent> complex_content;
+ Alternative<Group> group;
+ Alternative<All> all;
+ Alternative<Choice> choice;
+ Alternative<Sequence> sequence;
+
+ ComplexTypeContents()
+ : simple_content("simpleContent"),
+ complex_content("complexContent"),
+ group("group"),
+ all("all"),
+ choice("choice"),
+ sequence("sequence")
+ {}
+};
+
+struct ComplexType : public LLInitParam::Block<ComplexType, ComplexTypeContents>
+{
+ Optional<std::string> name;
+ Optional<bool> mixed;
+
+ Multiple<Attribute> attribute;
+ Multiple< Lazy<Element> > elements;
+
+ ComplexType()
+ : name("name"),
+ attribute("xs:attribute"),
+ elements("xs:element"),
+ mixed("mixed")
+ {
+ }
+};
+
+struct ElementContents : public LLInitParam::ChoiceBlock<ElementContents, Occurs>
+{
+ Alternative<SimpleType> simpleType;
+ Alternative<ComplexType> complexType;
+
+ ElementContents()
+ : simpleType("simpleType"),
+ complexType("complexType")
+ {}
+};
+
+struct Element : public LLInitParam::Block<Element, ElementContents>
+{
+ Optional<std::string> name,
+ ref,
+ type;
+
+ Element()
+ : name("xs:name"),
+ ref("xs:ref"),
+ type("xs:type")
+ {}
+};
+
+struct Schema : public LLInitParam::Block<Schema>
+{
+private:
+ Mandatory<std::string> targetNamespace,
+ xmlns,
+ xs;
+
+public:
+ Optional<std::string> attributeFormDefault,
+ elementFormDefault;
+
+ Mandatory<Element> root_element;
+
+ void setNameSpace(const std::string& ns) {targetNamespace = ns; xmlns = ns;}
+
+ Schema(const std::string& ns = LLStringUtil::null)
+ : attributeFormDefault("attributeFormDefault"),
+ elementFormDefault("elementFormDefault"),
+ xs("xmlns:xs"),
+ targetNamespace("targetNamespace"),
+ xmlns("xmlns"),
+ root_element("xs:element")
+ {
+ attributeFormDefault = "unqualified";
+ elementFormDefault = "qualified";
+ xs = "http://www.w3.org/2001/XMLSchema";
+ if (!ns.empty())
+ {
+ setNameSpace(ns);
+ };
+ }
+
+};
//
// LLXSDWriter
@@ -76,22 +340,30 @@ LLXSDWriter::LLXSDWriter()
void LLXSDWriter::writeXSD(const std::string& type_name, LLXMLNodePtr node, const LLInitParam::BaseBlock& block, const std::string& xml_namespace)
{
+ Schema schema(xml_namespace);
+
+ schema.root_element.name = type_name;
+ Choice& choice = schema.root_element.complexType.choice;
+
+ choice.minOccurs = 0;
+ choice.maxOccurs = "unbounded";
+
mSchemaNode = node;
- node->setName("xs:schema");
- node->createChild("attributeFormDefault", true)->setStringValue("unqualified");
- node->createChild("elementFormDefault", true)->setStringValue("qualified");
- node->createChild("targetNamespace", true)->setStringValue(xml_namespace);
- node->createChild("xmlns:xs", true)->setStringValue("http://www.w3.org/2001/XMLSchema");
- node->createChild("xmlns", true)->setStringValue(xml_namespace);
-
- node = node->createChild("xs:complexType", false);
- node->createChild("name", true)->setStringValue(type_name);
- node->createChild("mixed", true)->setStringValue("true");
-
- mAttributeNode = node;
- mElementNode = node->createChild("xs:choice", false);
- mElementNode->createChild("minOccurs", true)->setStringValue("0");
- mElementNode->createChild("maxOccurs", true)->setStringValue("unbounded");
+ //node->setName("xs:schema");
+ //node->createChild("attributeFormDefault", true)->setStringValue("unqualified");
+ //node->createChild("elementFormDefault", true)->setStringValue("qualified");
+ //node->createChild("targetNamespace", true)->setStringValue(xml_namespace);
+ //node->createChild("xmlns:xs", true)->setStringValue("http://www.w3.org/2001/XMLSchema");
+ //node->createChild("xmlns", true)->setStringValue(xml_namespace);
+
+ //node = node->createChild("xs:complexType", false);
+ //node->createChild("name", true)->setStringValue(type_name);
+ //node->createChild("mixed", true)->setStringValue("true");
+
+ //mAttributeNode = node;
+ //mElementNode = node->createChild("xs:choice", false);
+ //mElementNode->createChild("minOccurs", true)->setStringValue("0");
+ //mElementNode->createChild("maxOccurs", true)->setStringValue("unbounded");
block.inspectBlock(*this);
// duplicate element choices
@@ -383,11 +655,11 @@ static LLInitParam::Parser::parser_inspect_func_map_t sXUIInspectFuncs;
//
LLXUIParser::LLXUIParser()
: Parser(sXUIReadFuncs, sXUIWriteFuncs, sXUIInspectFuncs),
- mLastWriteGeneration(-1),
mCurReadDepth(0)
{
if (sXUIReadFuncs.empty())
{
+ registerParserFuncs<LLInitParam::Flag>(readFlag, writeFlag);
registerParserFuncs<bool>(readBoolValue, writeBoolValue);
registerParserFuncs<std::string>(readStringValue, writeStringValue);
registerParserFuncs<U8>(readU8Value, writeU8Value);
@@ -406,6 +678,7 @@ LLXUIParser::LLXUIParser()
}
static LLFastTimer::DeclareTimer FTM_PARSE_XUI("XUI Parsing");
+const LLXMLNodePtr DUMMY_NODE = new LLXMLNode();
void LLXUIParser::readXUI(LLXMLNodePtr node, LLInitParam::BaseBlock& block, const std::string& filename, bool silent)
{
@@ -432,6 +705,16 @@ bool LLXUIParser::readXUIImpl(LLXMLNodePtr nodep, LLInitParam::BaseBlock& block)
boost::char_separator<char> sep(".");
bool values_parsed = false;
+ bool silent = mCurReadDepth > 0;
+
+ if (nodep->getFirstChild().isNull()
+ && nodep->mAttributes.empty()
+ && nodep->getSanitizedValue().empty())
+ {
+ // empty node, just parse as flag
+ mCurReadNode = DUMMY_NODE;
+ return block.submitValue(mNameStack, *this, silent);
+ }
// submit attributes for current node
values_parsed |= readAttributes(nodep, block);
@@ -441,10 +724,9 @@ bool LLXUIParser::readXUIImpl(LLXMLNodePtr nodep, LLInitParam::BaseBlock& block)
if (!text_contents.empty())
{
mCurReadNode = nodep;
- mNameStack.push_back(std::make_pair(std::string("value"), newParseGeneration()));
+ mNameStack.push_back(std::make_pair(std::string("value"), true));
// child nodes are not necessarily valid parameters (could be a child widget)
// so don't complain once we've recursed
- bool silent = mCurReadDepth > 0;
if (!block.submitValue(mNameStack, *this, true))
{
mNameStack.pop_back();
@@ -477,7 +759,7 @@ bool LLXUIParser::readXUIImpl(LLXMLNodePtr nodep, LLInitParam::BaseBlock& block)
// since there is no widget named "rect"
if (child_name.find(".") == std::string::npos)
{
- mNameStack.push_back(std::make_pair(child_name, newParseGeneration()));
+ mNameStack.push_back(std::make_pair(child_name, true));
num_tokens_pushed++;
}
else
@@ -513,7 +795,7 @@ bool LLXUIParser::readXUIImpl(LLXMLNodePtr nodep, LLInitParam::BaseBlock& block)
// copy remaining tokens on to our running token list
for(tokenizer::iterator token_to_push = name_token_it; token_to_push != name_tokens.end(); ++token_to_push)
{
- mNameStack.push_back(std::make_pair(*token_to_push, newParseGeneration()));
+ mNameStack.push_back(std::make_pair(*token_to_push, true));
num_tokens_pushed++;
}
}
@@ -549,6 +831,7 @@ bool LLXUIParser::readAttributes(LLXMLNodePtr nodep, LLInitParam::BaseBlock& blo
boost::char_separator<char> sep(".");
bool any_parsed = false;
+ bool silent = mCurReadDepth > 0;
for(LLXMLAttribList::const_iterator attribute_it = nodep->mAttributes.begin();
attribute_it != nodep->mAttributes.end();
@@ -562,12 +845,11 @@ bool LLXUIParser::readAttributes(LLXMLNodePtr nodep, LLInitParam::BaseBlock& blo
// copy remaining tokens on to our running token list
for(tokenizer::iterator token_to_push = name_tokens.begin(); token_to_push != name_tokens.end(); ++token_to_push)
{
- mNameStack.push_back(std::make_pair(*token_to_push, newParseGeneration()));
+ mNameStack.push_back(std::make_pair(*token_to_push, true));
num_tokens_pushed++;
}
// child nodes are not necessarily valid attributes, so don't complain once we've recursed
- bool silent = mCurReadDepth > 0;
any_parsed |= block.submitValue(mNameStack, *this, silent);
while(num_tokens_pushed-- > 0)
@@ -582,48 +864,40 @@ bool LLXUIParser::readAttributes(LLXMLNodePtr nodep, LLInitParam::BaseBlock& blo
void LLXUIParser::writeXUI(LLXMLNodePtr node, const LLInitParam::BaseBlock &block, const LLInitParam::BaseBlock* diff_block)
{
mWriteRootNode = node;
- block.serializeBlock(*this, Parser::name_stack_t(), diff_block);
+ name_stack_t name_stack = Parser::name_stack_t();
+ block.serializeBlock(*this, name_stack, diff_block);
mOutNodes.clear();
}
// go from a stack of names to a specific XML node
-LLXMLNodePtr LLXUIParser::getNode(const name_stack_t& stack)
+LLXMLNodePtr LLXUIParser::getNode(name_stack_t& stack)
{
- name_stack_t name_stack;
- for (name_stack_t::const_iterator it = stack.begin();
- it != stack.end();
- ++it)
- {
- if (!it->first.empty())
- {
- name_stack.push_back(*it);
- }
- }
-
LLXMLNodePtr out_node = mWriteRootNode;
- name_stack_t::const_iterator next_it = name_stack.begin();
- for (name_stack_t::const_iterator it = name_stack.begin();
- it != name_stack.end();
+ name_stack_t::iterator next_it = stack.begin();
+ for (name_stack_t::iterator it = stack.begin();
+ it != stack.end();
it = next_it)
{
++next_it;
if (it->first.empty())
{
+ it->second = false;
continue;
}
- out_nodes_t::iterator found_it = mOutNodes.lower_bound(it->second);
+ out_nodes_t::iterator found_it = mOutNodes.find(it->first);
// node with this name not yet written
- if (found_it == mOutNodes.end() || mOutNodes.key_comp()(found_it->first, it->second))
+ if (found_it == mOutNodes.end() || it->second)
{
// make an attribute if we are the last element on the name stack
- bool is_attribute = next_it == name_stack.end();
+ bool is_attribute = next_it == stack.end();
LLXMLNodePtr new_node = new LLXMLNode(it->first.c_str(), is_attribute);
out_node->addChild(new_node);
- mOutNodes.insert(found_it, std::make_pair(it->second, new_node));
+ mOutNodes[it->first] = new_node;
out_node = new_node;
+ it->second = false;
}
else
{
@@ -634,6 +908,19 @@ LLXMLNodePtr LLXUIParser::getNode(const name_stack_t& stack)
return (out_node == mWriteRootNode ? LLXMLNodePtr(NULL) : out_node);
}
+bool LLXUIParser::readFlag(Parser& parser, void* val_ptr)
+{
+ LLXUIParser& self = static_cast<LLXUIParser&>(parser);
+ return self.mCurReadNode == DUMMY_NODE;
+}
+
+bool LLXUIParser::writeFlag(Parser& parser, const void* val_ptr, name_stack_t& stack)
+{
+ // just create node
+ LLXUIParser& self = static_cast<LLXUIParser&>(parser);
+ LLXMLNodePtr node = self.getNode(stack);
+ return node.notNull();
+}
bool LLXUIParser::readBoolValue(Parser& parser, void* val_ptr)
{
@@ -644,7 +931,7 @@ bool LLXUIParser::readBoolValue(Parser& parser, void* val_ptr)
return success;
}
-bool LLXUIParser::writeBoolValue(Parser& parser, const void* val_ptr, const name_stack_t& stack)
+bool LLXUIParser::writeBoolValue(Parser& parser, const void* val_ptr, name_stack_t& stack)
{
LLXUIParser& self = static_cast<LLXUIParser&>(parser);
LLXMLNodePtr node = self.getNode(stack);
@@ -663,7 +950,7 @@ bool LLXUIParser::readStringValue(Parser& parser, void* val_ptr)
return true;
}
-bool LLXUIParser::writeStringValue(Parser& parser, const void* val_ptr, const name_stack_t& stack)
+bool LLXUIParser::writeStringValue(Parser& parser, const void* val_ptr, name_stack_t& stack)
{
LLXUIParser& self = static_cast<LLXUIParser&>(parser);
LLXMLNodePtr node = self.getNode(stack);
@@ -701,7 +988,7 @@ bool LLXUIParser::readU8Value(Parser& parser, void* val_ptr)
return self.mCurReadNode->getByteValue(1, (U8*)val_ptr);
}
-bool LLXUIParser::writeU8Value(Parser& parser, const void* val_ptr, const name_stack_t& stack)
+bool LLXUIParser::writeU8Value(Parser& parser, const void* val_ptr, name_stack_t& stack)
{
LLXUIParser& self = static_cast<LLXUIParser&>(parser);
LLXMLNodePtr node = self.getNode(stack);
@@ -725,7 +1012,7 @@ bool LLXUIParser::readS8Value(Parser& parser, void* val_ptr)
return false;
}
-bool LLXUIParser::writeS8Value(Parser& parser, const void* val_ptr, const name_stack_t& stack)
+bool LLXUIParser::writeS8Value(Parser& parser, const void* val_ptr, name_stack_t& stack)
{
LLXUIParser& self = static_cast<LLXUIParser&>(parser);
LLXMLNodePtr node = self.getNode(stack);
@@ -749,7 +1036,7 @@ bool LLXUIParser::readU16Value(Parser& parser, void* val_ptr)
return false;
}
-bool LLXUIParser::writeU16Value(Parser& parser, const void* val_ptr, const name_stack_t& stack)
+bool LLXUIParser::writeU16Value(Parser& parser, const void* val_ptr, name_stack_t& stack)
{
LLXUIParser& self = static_cast<LLXUIParser&>(parser);
LLXMLNodePtr node = self.getNode(stack);
@@ -773,7 +1060,7 @@ bool LLXUIParser::readS16Value(Parser& parser, void* val_ptr)
return false;
}
-bool LLXUIParser::writeS16Value(Parser& parser, const void* val_ptr, const name_stack_t& stack)
+bool LLXUIParser::writeS16Value(Parser& parser, const void* val_ptr, name_stack_t& stack)
{
LLXUIParser& self = static_cast<LLXUIParser&>(parser);
LLXMLNodePtr node = self.getNode(stack);
@@ -791,7 +1078,7 @@ bool LLXUIParser::readU32Value(Parser& parser, void* val_ptr)
return self.mCurReadNode->getUnsignedValue(1, (U32*)val_ptr);
}
-bool LLXUIParser::writeU32Value(Parser& parser, const void* val_ptr, const name_stack_t& stack)
+bool LLXUIParser::writeU32Value(Parser& parser, const void* val_ptr, name_stack_t& stack)
{
LLXUIParser& self = static_cast<LLXUIParser&>(parser);
LLXMLNodePtr node = self.getNode(stack);
@@ -809,7 +1096,7 @@ bool LLXUIParser::readS32Value(Parser& parser, void* val_ptr)
return self.mCurReadNode->getIntValue(1, (S32*)val_ptr);
}
-bool LLXUIParser::writeS32Value(Parser& parser, const void* val_ptr, const name_stack_t& stack)
+bool LLXUIParser::writeS32Value(Parser& parser, const void* val_ptr, name_stack_t& stack)
{
LLXUIParser& self = static_cast<LLXUIParser&>(parser);
LLXMLNodePtr node = self.getNode(stack);
@@ -827,7 +1114,7 @@ bool LLXUIParser::readF32Value(Parser& parser, void* val_ptr)
return self.mCurReadNode->getFloatValue(1, (F32*)val_ptr);
}
-bool LLXUIParser::writeF32Value(Parser& parser, const void* val_ptr, const name_stack_t& stack)
+bool LLXUIParser::writeF32Value(Parser& parser, const void* val_ptr, name_stack_t& stack)
{
LLXUIParser& self = static_cast<LLXUIParser&>(parser);
LLXMLNodePtr node = self.getNode(stack);
@@ -845,7 +1132,7 @@ bool LLXUIParser::readF64Value(Parser& parser, void* val_ptr)
return self.mCurReadNode->getDoubleValue(1, (F64*)val_ptr);
}
-bool LLXUIParser::writeF64Value(Parser& parser, const void* val_ptr, const name_stack_t& stack)
+bool LLXUIParser::writeF64Value(Parser& parser, const void* val_ptr, name_stack_t& stack)
{
LLXUIParser& self = static_cast<LLXUIParser&>(parser);
LLXMLNodePtr node = self.getNode(stack);
@@ -869,7 +1156,7 @@ bool LLXUIParser::readColor4Value(Parser& parser, void* val_ptr)
return false;
}
-bool LLXUIParser::writeColor4Value(Parser& parser, const void* val_ptr, const name_stack_t& stack)
+bool LLXUIParser::writeColor4Value(Parser& parser, const void* val_ptr, name_stack_t& stack)
{
LLXUIParser& self = static_cast<LLXUIParser&>(parser);
LLXMLNodePtr node = self.getNode(stack);
@@ -896,7 +1183,7 @@ bool LLXUIParser::readUIColorValue(Parser& parser, void* val_ptr)
return false;
}
-bool LLXUIParser::writeUIColorValue(Parser& parser, const void* val_ptr, const name_stack_t& stack)
+bool LLXUIParser::writeUIColorValue(Parser& parser, const void* val_ptr, name_stack_t& stack)
{
LLXUIParser& self = static_cast<LLXUIParser&>(parser);
LLXMLNodePtr node = self.getNode(stack);
@@ -925,7 +1212,7 @@ bool LLXUIParser::readUUIDValue(Parser& parser, void* val_ptr)
return false;
}
-bool LLXUIParser::writeUUIDValue(Parser& parser, const void* val_ptr, const name_stack_t& stack)
+bool LLXUIParser::writeUUIDValue(Parser& parser, const void* val_ptr, name_stack_t& stack)
{
LLXUIParser& self = static_cast<LLXUIParser&>(parser);
LLXMLNodePtr node = self.getNode(stack);
@@ -944,7 +1231,7 @@ bool LLXUIParser::readSDValue(Parser& parser, void* val_ptr)
return true;
}
-bool LLXUIParser::writeSDValue(Parser& parser, const void* val_ptr, const name_stack_t& stack)
+bool LLXUIParser::writeSDValue(Parser& parser, const void* val_ptr, name_stack_t& stack)
{
LLXUIParser& self = static_cast<LLXUIParser&>(parser);
@@ -1045,18 +1332,14 @@ struct ScopedFile
LLFILE* mFile;
};
-static LLInitParam::Parser::parser_read_func_map_t sSimpleXUIReadFuncs;
-static LLInitParam::Parser::parser_write_func_map_t sSimpleXUIWriteFuncs;
-static LLInitParam::Parser::parser_inspect_func_map_t sSimpleXUIInspectFuncs;
-
LLSimpleXUIParser::LLSimpleXUIParser(LLSimpleXUIParser::element_start_callback_t element_cb)
: Parser(sSimpleXUIReadFuncs, sSimpleXUIWriteFuncs, sSimpleXUIInspectFuncs),
- mLastWriteGeneration(-1),
mCurReadDepth(0),
mElementCB(element_cb)
{
if (sSimpleXUIReadFuncs.empty())
{
+ registerParserFuncs<LLInitParam::Flag>(readFlag);
registerParserFuncs<bool>(readBoolValue);
registerParserFuncs<std::string>(readStringValue);
registerParserFuncs<U8>(readU8Value);
@@ -1098,6 +1381,7 @@ bool LLSimpleXUIParser::readXUI(const std::string& filename, LLInitParam::BaseBl
if( !file.isOpen() )
{
LL_WARNS("ReadXUI") << "Unable to open file " << filename << LL_ENDL;
+ XML_ParserFree( mParser );
return false;
}
@@ -1120,6 +1404,8 @@ bool LLSimpleXUIParser::readXUI(const std::string& filename, LLInitParam::BaseBl
return false;
}
+ mEmptyLeafNode.push_back(false);
+
if( !XML_ParseBuffer(mParser, bytes_read, TRUE ) )
{
LL_WARNS("ReadXUI") << "Error while parsing file " << filename << LL_ENDL;
@@ -1127,6 +1413,8 @@ bool LLSimpleXUIParser::readXUI(const std::string& filename, LLInitParam::BaseBl
return false;
}
+ mEmptyLeafNode.pop_back();
+
XML_ParserFree( mParser );
return true;
}
@@ -1149,6 +1437,11 @@ void LLSimpleXUIParser::characterDataHandler(void *userData, const char *s, int
self->characterData(s, len);
}
+void LLSimpleXUIParser::characterData(const char *s, int len)
+{
+ mTextContents += std::string(s, len);
+}
+
void LLSimpleXUIParser::startElement(const char *name, const char **atts)
{
processText();
@@ -1177,7 +1470,7 @@ void LLSimpleXUIParser::startElement(const char *name, const char **atts)
{ // compound attribute
if (child_name.find(".") == std::string::npos)
{
- mNameStack.push_back(std::make_pair(child_name, newParseGeneration()));
+ mNameStack.push_back(std::make_pair(child_name, true));
num_tokens_pushed++;
mScope.push_back(child_name);
}
@@ -1204,15 +1497,52 @@ void LLSimpleXUIParser::startElement(const char *name, const char **atts)
// copy remaining tokens on to our running token list
for(tokenizer::iterator token_to_push = name_token_it; token_to_push != name_tokens.end(); ++token_to_push)
{
- mNameStack.push_back(std::make_pair(*token_to_push, newParseGeneration()));
+ mNameStack.push_back(std::make_pair(*token_to_push, true));
num_tokens_pushed++;
}
mScope.push_back(mNameStack.back().first);
}
}
+ // parent node is not empty
+ mEmptyLeafNode.back() = false;
+ // we are empty if we have no attributes
+ mEmptyLeafNode.push_back(atts[0] == NULL);
+
mTokenSizeStack.push_back(num_tokens_pushed);
readAttributes(atts);
+
+}
+
+void LLSimpleXUIParser::endElement(const char *name)
+{
+ bool has_text = processText();
+
+ // no text, attributes, or children
+ if (!has_text && mEmptyLeafNode.back())
+ {
+ // submit this as a valueless name (even though there might be text contents we haven't seen yet)
+ mCurAttributeValueBegin = NO_VALUE_MARKER;
+ mOutputStack.back().first->submitValue(mNameStack, *this, mParseSilently);
+ }
+
+ if (--mOutputStack.back().second == 0)
+ {
+ if (mOutputStack.empty())
+ {
+ LL_ERRS("ReadXUI") << "Parameter block output stack popped while empty." << LL_ENDL;
+ }
+ mOutputStack.pop_back();
+ }
+
+ S32 num_tokens_to_pop = mTokenSizeStack.back();
+ mTokenSizeStack.pop_back();
+ while(num_tokens_to_pop-- > 0)
+ {
+ mNameStack.pop_back();
+ }
+ mScope.pop_back();
+ mEmptyLeafNode.pop_back();
}
bool LLSimpleXUIParser::readAttributes(const char **atts)
@@ -1231,7 +1561,7 @@ bool LLSimpleXUIParser::readAttributes(const char **atts)
// copy remaining tokens on to our running token list
for(tokenizer::iterator token_to_push = name_tokens.begin(); token_to_push != name_tokens.end(); ++token_to_push)
{
- mNameStack.push_back(std::make_pair(*token_to_push, newParseGeneration()));
+ mNameStack.push_back(std::make_pair(*token_to_push, true));
num_tokens_pushed++;
}
@@ -1246,50 +1576,24 @@ bool LLSimpleXUIParser::readAttributes(const char **atts)
return any_parsed;
}
-void LLSimpleXUIParser::processText()
+bool LLSimpleXUIParser::processText()
{
if (!mTextContents.empty())
{
LLStringUtil::trim(mTextContents);
if (!mTextContents.empty())
{
- mNameStack.push_back(std::make_pair(std::string("value"), newParseGeneration()));
+ mNameStack.push_back(std::make_pair(std::string("value"), true));
mCurAttributeValueBegin = mTextContents.c_str();
mOutputStack.back().first->submitValue(mNameStack, *this, mParseSilently);
mNameStack.pop_back();
}
mTextContents.clear();
+ return true;
}
+ return false;
}
-void LLSimpleXUIParser::endElement(const char *name)
-{
- processText();
-
- if (--mOutputStack.back().second == 0)
- {
- if (mOutputStack.empty())
- {
- LL_ERRS("ReadXUI") << "Parameter block output stack popped while empty." << LL_ENDL;
- }
- mOutputStack.pop_back();
- }
-
- S32 num_tokens_to_pop = mTokenSizeStack.back();
- mTokenSizeStack.pop_back();
- while(num_tokens_to_pop-- > 0)
- {
- mNameStack.pop_back();
- }
- mScope.pop_back();
-}
-
-void LLSimpleXUIParser::characterData(const char *s, int len)
-{
- mTextContents += std::string(s, len);
-}
-
-
/*virtual*/ std::string LLSimpleXUIParser::getCurrentElementName()
{
std::string full_name;
@@ -1303,8 +1607,6 @@ void LLSimpleXUIParser::characterData(const char *s, int len)
return full_name;
}
-const S32 LINE_NUMBER_HERE = 0;
-
void LLSimpleXUIParser::parserWarning(const std::string& message)
{
#ifdef LL_WINDOWS
@@ -1328,6 +1630,12 @@ void LLSimpleXUIParser::parserError(const std::string& message)
#endif
}
+bool LLSimpleXUIParser::readFlag(Parser& parser, void* val_ptr)
+{
+ LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser);
+ return self.mCurAttributeValueBegin == NO_VALUE_MARKER;
+}
+
bool LLSimpleXUIParser::readBoolValue(Parser& parser, void* val_ptr)
{
LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser);
diff --git a/indra/llxuixml/llxuiparser.h b/indra/llxuixml/llxuiparser.h
index 5c613b0c69..d7cd256967 100644
--- a/indra/llxuixml/llxuiparser.h
+++ b/indra/llxuixml/llxuiparser.h
@@ -28,7 +28,6 @@
#define LLXUIPARSER_H
#include "llinitparam.h"
-#include "llfasttimer.h"
#include "llregistry.h"
#include "llpointer.h"
@@ -95,6 +94,7 @@ public:
};
+class LLXUIParserImpl;
class LLXUIParser : public LLInitParam::Parser
{
@@ -116,6 +116,7 @@ private:
bool readAttributes(LLXMLNodePtr nodep, LLInitParam::BaseBlock& block);
//reader helper functions
+ static bool readFlag(Parser& parser, void* val_ptr);
static bool readBoolValue(Parser& parser, void* val_ptr);
static bool readStringValue(Parser& parser, void* val_ptr);
static bool readU8Value(Parser& parser, void* val_ptr);
@@ -132,22 +133,23 @@ private:
static bool readSDValue(Parser& parser, void* val_ptr);
//writer helper functions
- static bool writeBoolValue(Parser& parser, const void* val_ptr, const name_stack_t&);
- static bool writeStringValue(Parser& parser, const void* val_ptr, const name_stack_t&);
- static bool writeU8Value(Parser& parser, const void* val_ptr, const name_stack_t&);
- static bool writeS8Value(Parser& parser, const void* val_ptr, const name_stack_t&);
- static bool writeU16Value(Parser& parser, const void* val_ptr, const name_stack_t&);
- static bool writeS16Value(Parser& parser, const void* val_ptr, const name_stack_t&);
- static bool writeU32Value(Parser& parser, const void* val_ptr, const name_stack_t&);
- static bool writeS32Value(Parser& parser, const void* val_ptr, const name_stack_t&);
- static bool writeF32Value(Parser& parser, const void* val_ptr, const name_stack_t&);
- static bool writeF64Value(Parser& parser, const void* val_ptr, const name_stack_t&);
- static bool writeColor4Value(Parser& parser, const void* val_ptr, const name_stack_t&);
- static bool writeUIColorValue(Parser& parser, const void* val_ptr, const name_stack_t&);
- static bool writeUUIDValue(Parser& parser, const void* val_ptr, const name_stack_t&);
- static bool writeSDValue(Parser& parser, const void* val_ptr, const name_stack_t&);
-
- LLXMLNodePtr getNode(const name_stack_t& stack);
+ static bool writeFlag(Parser& parser, const void* val_ptr, name_stack_t&);
+ static bool writeBoolValue(Parser& parser, const void* val_ptr, name_stack_t&);
+ static bool writeStringValue(Parser& parser, const void* val_ptr, name_stack_t&);
+ static bool writeU8Value(Parser& parser, const void* val_ptr, name_stack_t&);
+ static bool writeS8Value(Parser& parser, const void* val_ptr, name_stack_t&);
+ static bool writeU16Value(Parser& parser, const void* val_ptr, name_stack_t&);
+ static bool writeS16Value(Parser& parser, const void* val_ptr, name_stack_t&);
+ static bool writeU32Value(Parser& parser, const void* val_ptr, name_stack_t&);
+ static bool writeS32Value(Parser& parser, const void* val_ptr, name_stack_t&);
+ static bool writeF32Value(Parser& parser, const void* val_ptr, name_stack_t&);
+ static bool writeF64Value(Parser& parser, const void* val_ptr, name_stack_t&);
+ static bool writeColor4Value(Parser& parser, const void* val_ptr, name_stack_t&);
+ static bool writeUIColorValue(Parser& parser, const void* val_ptr, name_stack_t&);
+ static bool writeUUIDValue(Parser& parser, const void* val_ptr, name_stack_t&);
+ static bool writeSDValue(Parser& parser, const void* val_ptr, name_stack_t&);
+
+ LLXMLNodePtr getNode(name_stack_t& stack);
private:
Parser::name_stack_t mNameStack;
@@ -155,9 +157,8 @@ private:
// Root of the widget XML sub-tree, for example, "line_editor"
LLXMLNodePtr mWriteRootNode;
- typedef std::map<S32, LLXMLNodePtr> out_nodes_t;
+ typedef std::map<std::string, LLXMLNodePtr> out_nodes_t;
out_nodes_t mOutNodes;
- S32 mLastWriteGeneration;
LLXMLNodePtr mLastWrittenChild;
S32 mCurReadDepth;
std::string mCurFileName;
@@ -174,6 +175,7 @@ private:
// ordering of child elements from base file to localized diff file. Then we can use a pair
// of coroutines to perform matching of xml nodes during parsing. Not sure if the overhead
// of coroutines would offset the gain from SAX parsing
+class LLSimpleXUIParserImpl;
class LLSimpleXUIParser : public LLInitParam::Parser
{
@@ -194,6 +196,7 @@ public:
private:
//reader helper functions
+ static bool readFlag(Parser&, void* val_ptr);
static bool readBoolValue(Parser&, void* val_ptr);
static bool readStringValue(Parser&, void* val_ptr);
static bool readU8Value(Parser&, void* val_ptr);
@@ -218,11 +221,10 @@ private:
void endElement(const char *name);
void characterData(const char *s, int len);
bool readAttributes(const char **atts);
- void processText();
+ bool processText();
Parser::name_stack_t mNameStack;
struct XML_ParserStruct* mParser;
- S32 mLastWriteGeneration;
LLXMLNodePtr mLastWrittenChild;
S32 mCurReadDepth;
std::string mCurFileName;
@@ -230,6 +232,7 @@ private:
const char* mCurAttributeValueBegin;
std::vector<S32> mTokenSizeStack;
std::vector<std::string> mScope;
+ std::vector<bool> mEmptyLeafNode;
element_start_callback_t mElementCB;
std::vector<std::pair<LLInitParam::BaseBlock*, S32> > mOutputStack;
diff --git a/indra/lscript/lscript_byteformat.h b/indra/lscript/lscript_byteformat.h
index 7dd21bb1ad..a294def734 100644
--- a/indra/lscript/lscript_byteformat.h
+++ b/indra/lscript/lscript_byteformat.h
@@ -529,6 +529,7 @@ typedef enum e_lscript_runtime_permissions
SCRIPT_PERMISSION_CHANGE_PERMISSIONS,
SCRIPT_PERMISSION_TRACK_CAMERA,
SCRIPT_PERMISSION_CONTROL_CAMERA,
+ SCRIPT_PERMISSION_TELEPORT,
SCRIPT_PERMISSION_EOF
} LSCRIPTRunTimePermissions;
@@ -545,6 +546,7 @@ const U32 LSCRIPTRunTimePermissionBits[SCRIPT_PERMISSION_EOF] =
(0x1 << 9), // SCRIPT_PERMISSION_CHANGE_PERMISSIONS
(0x1 << 10),// SCRIPT_PERMISSION_TRACK_CAMERA
(0x1 << 11),// SCRIPT_PERMISSION_CONTROL_CAMERA
+ (0x1 << 12),// SCRIPT_PERMISSION_TELEPORT
};
// http_request string constants
diff --git a/indra/lscript/lscript_compile/bison.bat b/indra/lscript/lscript_compile/bison.bat
index 54cf0231d9..0baff4e5ef 100644
--- a/indra/lscript/lscript_compile/bison.bat
+++ b/indra/lscript/lscript_compile/bison.bat
@@ -1,11 +1,11 @@
-@REM Run bison under Windows. This script is needed so that bison can
-@REM find m4, even if neither program is present in PATH.
-
-@set bison=%1
-set M4PATH=%2
-set M4=
-@set output=%3
-@set input=%4
-
-set PATH=%M4PATH%;%PATH%
-%bison% -d -o %output% %input%
+@REM Run bison under Windows. This script is needed so that bison can
+@REM find m4, even if neither program is present in PATH.
+
+@set bison=%1
+set M4PATH=%2
+set M4=
+@set output=%3
+@set input=%4
+
+set PATH=%M4PATH%;%PATH%
+%bison% -d -o %output% %input%
diff --git a/indra/lscript/lscript_compile/indra.l b/indra/lscript/lscript_compile/indra.l
index 8fe9f5ed29..96b7e57e97 100644
--- a/indra/lscript/lscript_compile/indra.l
+++ b/indra/lscript/lscript_compile/indra.l
@@ -8,8 +8,11 @@ FS (f|F)
%n 4000
%p 5000
+%top {
+ #include "linden_common.h"
+}
+
%{
-#include "linden_common.h"
// Deal with the fact that lex/yacc generates unreachable code
#ifdef LL_WINDOWS
#pragma warning (disable : 4018) // warning C4018: signed/unsigned mismatch
@@ -209,7 +212,8 @@ extern "C" { int yyerror(const char *fmt, ...); }
"PERMISSION_CHANGE_JOINTS" { count(); yylval.ival = LSCRIPTRunTimePermissionBits[SCRIPT_PERMISSION_CHANGE_JOINTS]; return(INTEGER_CONSTANT); }
"PERMISSION_CHANGE_PERMISSIONS" { count(); yylval.ival = LSCRIPTRunTimePermissionBits[SCRIPT_PERMISSION_CHANGE_PERMISSIONS]; return(INTEGER_CONSTANT); }
"PERMISSION_TRACK_CAMERA" { count(); yylval.ival = LSCRIPTRunTimePermissionBits[SCRIPT_PERMISSION_TRACK_CAMERA]; return(INTEGER_CONSTANT); }
-"PERMISSION_CONTROL_CAMERA" { count(); yylval.ival = LSCRIPTRunTimePermissionBits[SCRIPT_PERMISSION_CONTROL_CAMERA]; return(INTEGER_CONSTANT); }
+"PERMISSION_CONTROL_CAMERA" { count(); yylval.ival = LSCRIPTRunTimePermissionBits[SCRIPT_PERMISSION_CONTROL_CAMERA]; return(INTEGER_CONSTANT); }
+"PERMISSION_TELEPORT" { count(); yylval.ival = LSCRIPTRunTimePermissionBits[SCRIPT_PERMISSION_TELEPORT]; return(INTEGER_CONSTANT); }
"INVENTORY_TEXTURE" { count(); yylval.ival = LLAssetType::AT_TEXTURE; return(INTEGER_CONSTANT); }
"INVENTORY_SOUND" { count(); yylval.ival = LLAssetType::AT_SOUND; return(INTEGER_CONSTANT); }
@@ -600,6 +604,8 @@ extern "C" { int yyerror(const char *fmt, ...); }
"PARCEL_DETAILS_OWNER" { count(); yylval.ival = PARCEL_DETAILS_OWNER; return(INTEGER_CONSTANT); }
"PARCEL_DETAILS_GROUP" { count(); yylval.ival = PARCEL_DETAILS_GROUP; return(INTEGER_CONSTANT); }
"PARCEL_DETAILS_AREA" { count(); yylval.ival = PARCEL_DETAILS_AREA; return(INTEGER_CONSTANT); }
+"PARCEL_DETAILS_ID" { count(); yylval.ival = PARCEL_DETAILS_ID; return(INTEGER_CONSTANT); }
+"PARCEL_DETAILS_SEE_AVATARS" { count(); yylval.ival = PARCEL_DETAILS_SEE_AVATARS; return(INTEGER_CONSTANT); }
"STRING_TRIM_HEAD" { count(); yylval.ival = STRING_TRIM_HEAD; return(INTEGER_CONSTANT); }
"STRING_TRIM_TAIL" { count(); yylval.ival = STRING_TRIM_TAIL; return(INTEGER_CONSTANT); }
diff --git a/indra/lscript/lscript_compile/windows/unistd.h b/indra/lscript/lscript_compile/windows/unistd.h
index 49e9152d63..0b7e2581e3 100644
--- a/indra/lscript/lscript_compile/windows/unistd.h
+++ b/indra/lscript/lscript_compile/windows/unistd.h
@@ -1,24 +1,24 @@
-/**
- * $LicenseInfo:firstyear=2002&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-/* After all that, this file is empty. */
+/**
+ * $LicenseInfo:firstyear=2002&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+/* After all that, this file is empty. */
diff --git a/indra/lscript/lscript_library/lscript_library.cpp b/indra/lscript/lscript_library/lscript_library.cpp
index 967c69fea9..7ffe53a307 100644
--- a/indra/lscript/lscript_library/lscript_library.cpp
+++ b/indra/lscript/lscript_library/lscript_library.cpp
@@ -461,6 +461,9 @@ void LLScriptLibrary::init()
addFunction(10.f, 0.f, dummy_func, "llGetDisplayName", "s", "k");
addFunction(10.f, 0.f, dummy_func, "llRequestDisplayName", "k", "k");
+ addFunction(10.f, 0.f, dummy_func, "llGetEnv", "s", "s");
+ addFunction(10.f, 0.f, dummy_func, "llRegionSayTo", NULL, "kis");
+
// energy, sleep, dummy_func, name, return type, parameters, help text, gods-only
// IF YOU ADD NEW SCRIPT CALLS, YOU MUST PUT THEM AT THE END OF THIS LIST.
diff --git a/indra/mac_crash_logger/CrashReporter.nib/objects.xib b/indra/mac_crash_logger/CrashReporter.nib/objects.xib
index 634d1c5321..32647391b6 100644
--- a/indra/mac_crash_logger/CrashReporter.nib/objects.xib
+++ b/indra/mac_crash_logger/CrashReporter.nib/objects.xib
@@ -15,7 +15,7 @@
<string name="bounds">414 390 434 487 </string>
</object>
<object class="IBCarbonStaticText" id="181">
- <string name="title">Second Life appears to have crashed or frozen the last time it ran.&#10;&#10;This crash reporter collects information about your computer&apos;s hardware configuration, operating system, and some Second Life logs, all of which are used for debugging purposes only.&#10;&#10;In the space below, please briefly describe what you were doing or trying to do just prior to the crash. Thank you for your help!&#10;&#10;This report is NOT read by Customer Support. If you have billing or other questions, please go to: http://www.secondlife.com/support/&#10;&#10;If you don&apos;t wish to send Linden Lab a crash report, press Cancel.&#10;</string>
+ <string name="title">Second Life appears to have crashed or frozen the last time it ran.&#10;&#10;This crash reporter collects information about your computer&apos;s hardware configuration, operating system, and some Second Life logs, all of which are used for debugging purposes only.&#10;&#10;In the space below, please briefly describe what you were doing or trying to do just prior to the crash. Thank you for your help!&#10;&#10;This report is NOT read by Customer Support. If you have billing or other questions, please go to: http://www.secondlife.com/support/&#10;&#10;If you don&apos;t wish to send Linden Lab a crash report, press Don&apos;t Send.&#10;</string>
<string name="bounds">20 20 231 487 </string>
</object>
<object class="IBCarbonWindow" id="166">
diff --git a/indra/mac_crash_logger/llcrashloggermac.cpp b/indra/mac_crash_logger/llcrashloggermac.cpp
index bec8cce04e..8f1c1a2dd0 100644
--- a/indra/mac_crash_logger/llcrashloggermac.cpp
+++ b/indra/mac_crash_logger/llcrashloggermac.cpp
@@ -29,9 +29,6 @@
#include <Carbon/Carbon.h>
#include <iostream>
-#include <sstream>
-
-#include "boost/tokenizer.hpp"
#include "indra_constants.h" // CRASH_BEHAVIOR_ASK, CRASH_SETTING_NAME
#include "llerror.h"
@@ -247,10 +244,11 @@ bool LLCrashLoggerMac::mainLoop()
void LLCrashLoggerMac::updateApplication(const std::string& message)
{
- LLCrashLogger::updateApplication();
+ LLCrashLogger::updateApplication(message);
}
bool LLCrashLoggerMac::cleanup()
{
+ commonCleanup();
return true;
}
diff --git a/indra/mac_crash_logger/mac_crash_logger.cpp b/indra/mac_crash_logger/mac_crash_logger.cpp
index 20b491c401..6571b35241 100644
--- a/indra/mac_crash_logger/mac_crash_logger.cpp
+++ b/indra/mac_crash_logger/mac_crash_logger.cpp
@@ -25,22 +25,23 @@
*/
#include "linden_common.h"
-
#include "llcrashloggermac.h"
int main(int argc, char **argv)
{
- //time(&gLaunchTime);
-
- llinfos << "Starting Second Life Viewer Crash Reporter" << llendl;
+ llinfos << "Starting crash reporter." << llendl;
LLCrashLoggerMac app;
app.parseCommandOptions(argc, argv);
- if(!app.init())
+
+ if (! app.init())
{
- return 0;
+ llwarns << "Unable to initialize application." << llendl;
+ return 1;
}
+
app.mainLoop();
-
+ app.cleanup();
+ llinfos << "Crash reporter finished normally." << llendl;
return 0;
}
diff --git a/indra/mac_updater/CMakeLists.txt b/indra/mac_updater/CMakeLists.txt
index 44f98e5e18..00dcedecaa 100644
--- a/indra/mac_updater/CMakeLists.txt
+++ b/indra/mac_updater/CMakeLists.txt
@@ -3,7 +3,9 @@
project(mac_updater)
include(00-Common)
+include(OpenSSL)
include(CURL)
+include(CARes)
include(LLCommon)
include(LLVFS)
include(Linking)
@@ -11,6 +13,8 @@ include(Linking)
include_directories(
${LLCOMMON_INCLUDE_DIRS}
${LLVFS_INCLUDE_DIRS}
+ ${CURL_INCLUDE_DIRS}
+ ${CARES_INCLUDE_DIRS}
)
set(mac_updater_SOURCE_FILES
@@ -49,7 +53,10 @@ set_target_properties(mac-updater
target_link_libraries(mac-updater
${LLVFS_LIBRARIES}
+ ${OPENSSL_LIBRARIES}
+ ${CRYPTO_LIBRARIES}
${CURL_LIBRARIES}
+ ${CARES_LIBRARIES}
${LLCOMMON_LIBRARIES}
)
diff --git a/indra/mac_updater/mac_updater.cpp b/indra/mac_updater/mac_updater.cpp
index 5d19e8a889..809f66cb1d 100644
--- a/indra/mac_updater/mac_updater.cpp
+++ b/indra/mac_updater/mac_updater.cpp
@@ -1230,20 +1230,14 @@ void *updatethreadproc(void*)
// Move work directory to the trash
if(tempDir[0] != 0)
{
-// chdir("/");
-// FSDeleteObjects(tempDirRef);
-
llinfos << "Moving work directory to the trash." << llendl;
- err = FSMoveObject(&tempDirRef, &trashFolderRef, NULL);
+ FSRef trashRef;
+ OSStatus err = FSMoveObjectToTrashSync(&tempDirRef, &trashRef, 0);
if(err != noErr) {
llwarns << "failed to move files to trash, (error code " <<
err << ")" << llendl;
}
-
-// snprintf(temp, sizeof(temp), "rm -rf '%s'", tempDir);
-// printf("%s\n", temp);
-// system(temp);
}
if(!gCancelled && !gFailure && (target[0] != 0))
diff --git a/indra/media_plugins/example/CMakeLists.txt b/indra/media_plugins/example/CMakeLists.txt
index 56cefde4bd..54dc5de1ea 100644
--- a/indra/media_plugins/example/CMakeLists.txt
+++ b/indra/media_plugins/example/CMakeLists.txt
@@ -79,4 +79,4 @@ if (DARWIN)
LINK_FLAGS "-exported_symbols_list ${CMAKE_CURRENT_SOURCE_DIR}/../base/media_plugin_base.exp"
)
-endif (DARWIN) \ No newline at end of file
+endif (DARWIN)
diff --git a/indra/media_plugins/example/media_plugin_example.cpp b/indra/media_plugins/example/media_plugin_example.cpp
index f8a871930e..da7de01799 100644
--- a/indra/media_plugins/example/media_plugin_example.cpp
+++ b/indra/media_plugins/example/media_plugin_example.cpp
@@ -6,21 +6,21 @@
* $LicenseInfo:firstyear=2008&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2010, Linden Research, Inc.
- *
+ *
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
- *
+ *
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
+ *
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
* @endcond
@@ -39,48 +39,48 @@
////////////////////////////////////////////////////////////////////////////////
//
class MediaPluginExample :
- public MediaPluginBase
+ public MediaPluginBase
{
- public:
- MediaPluginExample( LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data );
- ~MediaPluginExample();
-
- /*virtual*/ void receiveMessage( const char* message_string );
-
- private:
- bool init();
- void update( F64 milliseconds );
- void write_pixel( int x, int y, unsigned char r, unsigned char g, unsigned char b );
- bool mFirstTime;
-
- time_t mLastUpdateTime;
- enum Constants { ENumObjects = 10 };
- unsigned char* mBackgroundPixels;
- int mColorR[ ENumObjects ];
- int mColorG[ ENumObjects ];
- int mColorB[ ENumObjects ];
- int mXpos[ ENumObjects ];
- int mYpos[ ENumObjects ];
- int mXInc[ ENumObjects ];
- int mYInc[ ENumObjects ];
- int mBlockSize[ ENumObjects ];
- bool mMouseButtonDown;
- bool mStopAction;
+ public:
+ MediaPluginExample( LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data );
+ ~MediaPluginExample();
+
+ /*virtual*/ void receiveMessage( const char* message_string );
+
+ private:
+ bool init();
+ void update( F64 milliseconds );
+ void write_pixel( int x, int y, unsigned char r, unsigned char g, unsigned char b );
+ bool mFirstTime;
+
+ time_t mLastUpdateTime;
+ enum Constants { ENumObjects = 10 };
+ unsigned char* mBackgroundPixels;
+ int mColorR[ ENumObjects ];
+ int mColorG[ ENumObjects ];
+ int mColorB[ ENumObjects ];
+ int mXpos[ ENumObjects ];
+ int mYpos[ ENumObjects ];
+ int mXInc[ ENumObjects ];
+ int mYInc[ ENumObjects ];
+ int mBlockSize[ ENumObjects ];
+ bool mMouseButtonDown;
+ bool mStopAction;
};
////////////////////////////////////////////////////////////////////////////////
//
MediaPluginExample::MediaPluginExample( LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data ) :
- MediaPluginBase( host_send_func, host_user_data )
+ MediaPluginBase( host_send_func, host_user_data )
{
- mFirstTime = true;
- mWidth = 0;
- mHeight = 0;
- mDepth = 4;
- mPixels = 0;
- mMouseButtonDown = false;
- mStopAction = false;
- mLastUpdateTime = 0;
+ mFirstTime = true;
+ mWidth = 0;
+ mHeight = 0;
+ mDepth = 4;
+ mPixels = 0;
+ mMouseButtonDown = false;
+ mStopAction = false;
+ mLastUpdateTime = 0;
}
////////////////////////////////////////////////////////////////////////////////
@@ -93,395 +93,320 @@ MediaPluginExample::~MediaPluginExample()
//
void MediaPluginExample::receiveMessage( const char* message_string )
{
- LLPluginMessage message_in;
-
- if ( message_in.parse( message_string ) >= 0 )
- {
- std::string message_class = message_in.getClass();
- std::string message_name = message_in.getName();
-
- if ( message_class == LLPLUGIN_MESSAGE_CLASS_BASE )
- {
- if ( message_name == "init" )
- {
- LLPluginMessage message( "base", "init_response" );
- LLSD versions = LLSD::emptyMap();
- versions[ LLPLUGIN_MESSAGE_CLASS_BASE ] = LLPLUGIN_MESSAGE_CLASS_BASE_VERSION;
- versions[ LLPLUGIN_MESSAGE_CLASS_MEDIA ] = LLPLUGIN_MESSAGE_CLASS_MEDIA_VERSION;
- versions[ LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER ] = LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER_VERSION;
- message.setValueLLSD( "versions", versions );
-
- std::string plugin_version = "Example media plugin, Example Version 1.0.0.0";
- message.setValue( "plugin_version", plugin_version );
- sendMessage( message );
- }
- else
- if ( message_name == "idle" )
- {
- // no response is necessary here.
- F64 time = message_in.getValueReal( "time" );
-
- // Convert time to milliseconds for update()
- update( time );
- }
- else
- if ( message_name == "cleanup" )
- {
- // clean up here
- }
- else
- if ( message_name == "shm_added" )
- {
- SharedSegmentInfo info;
- info.mAddress = message_in.getValuePointer( "address" );
- info.mSize = ( size_t )message_in.getValueS32( "size" );
- std::string name = message_in.getValue( "name" );
-
- mSharedSegments.insert( SharedSegmentMap::value_type( name, info ) );
-
- }
- else
- if ( message_name == "shm_remove" )
- {
- std::string name = message_in.getValue( "name" );
-
- SharedSegmentMap::iterator iter = mSharedSegments.find( name );
- if( iter != mSharedSegments.end() )
- {
- if ( mPixels == iter->second.mAddress )
- {
- // This is the currently active pixel buffer.
- // Make sure we stop drawing to it.
- mPixels = NULL;
- mTextureSegmentName.clear();
- };
- mSharedSegments.erase( iter );
- }
- else
- {
- //std::cerr << "MediaPluginExample::receiveMessage: unknown shared memory region!" << std::endl;
- };
-
- // Send the response so it can be cleaned up.
- LLPluginMessage message( "base", "shm_remove_response" );
- message.setValue( "name", name );
- sendMessage( message );
- }
- else
- {
- //std::cerr << "MediaPluginExample::receiveMessage: unknown base message: " << message_name << std::endl;
- };
- }
- else
- if ( message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA )
- {
- if ( message_name == "init" )
- {
- // Plugin gets to decide the texture parameters to use.
- LLPluginMessage message( LLPLUGIN_MESSAGE_CLASS_MEDIA, "texture_params" );
- message.setValueS32( "default_width", mWidth );
- message.setValueS32( "default_height", mHeight );
- message.setValueS32( "depth", mDepth );
- message.setValueU32( "internalformat", GL_RGBA );
- message.setValueU32( "format", GL_RGBA );
- message.setValueU32( "type", GL_UNSIGNED_BYTE );
- message.setValueBoolean( "coords_opengl", false );
- sendMessage( message );
- }
- else if ( message_name == "size_change" )
- {
- std::string name = message_in.getValue( "name" );
- S32 width = message_in.getValueS32( "width" );
- S32 height = message_in.getValueS32( "height" );
- S32 texture_width = message_in.getValueS32( "texture_width" );
- S32 texture_height = message_in.getValueS32( "texture_height" );
-
- if ( ! name.empty() )
- {
- // Find the shared memory region with this name
- SharedSegmentMap::iterator iter = mSharedSegments.find( name );
- if ( iter != mSharedSegments.end() )
- {
- mPixels = ( unsigned char* )iter->second.mAddress;
- mWidth = width;
- mHeight = height;
-
- mTextureWidth = texture_width;
- mTextureHeight = texture_height;
-
- init();
- };
- };
-
- LLPluginMessage message( LLPLUGIN_MESSAGE_CLASS_MEDIA, "size_change_response" );
- message.setValue( "name", name );
- message.setValueS32( "width", width );
- message.setValueS32( "height", height );
- message.setValueS32( "texture_width", texture_width );
- message.setValueS32( "texture_height", texture_height );
- sendMessage( message );
- }
- else
- if ( message_name == "load_uri" )
- {
- std::string uri = message_in.getValue( "uri" );
- if ( ! uri.empty() )
- {
- };
- }
- else
- if ( message_name == "mouse_event" )
- {
- std::string event = message_in.getValue( "event" );
- S32 button = message_in.getValueS32( "button" );
-
- // left mouse button
- if ( button == 0 )
- {
- int mouse_x = message_in.getValueS32( "x" );
- int mouse_y = message_in.getValueS32( "y" );
- std::string modifiers = message_in.getValue( "modifiers" );
-
- if ( event == "move" )
- {
- if ( mMouseButtonDown )
- write_pixel( mouse_x, mouse_y, rand() % 0x80 + 0x80, rand() % 0x80 + 0x80, rand() % 0x80 + 0x80 );
- }
- else
- if ( event == "down" )
- {
- mMouseButtonDown = true;
- }
- else
- if ( event == "up" )
- {
- mMouseButtonDown = false;
- }
- else
- if ( event == "double_click" )
- {
- };
- };
- }
- else
- if ( message_name == "key_event" )
- {
- std::string event = message_in.getValue( "event" );
- S32 key = message_in.getValueS32( "key" );
- std::string modifiers = message_in.getValue( "modifiers" );
-
- if ( event == "down" )
- {
- if ( key == ' ')
- {
- mLastUpdateTime = 0;
- update( 0.0f );
- };
- };
- }
- else
- {
- //std::cerr << "MediaPluginExample::receiveMessage: unknown media message: " << message_string << std::endl;
- };
- }
- else
- if ( message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER )
- {
- if ( message_name == "browse_reload" )
- {
- mLastUpdateTime = 0;
- mFirstTime = true;
- mStopAction = false;
- update( 0.0f );
- }
- else
- if ( message_name == "browse_stop" )
- {
- for( int n = 0; n < ENumObjects; ++n )
- mXInc[ n ] = mYInc[ n ] = 0;
-
- mStopAction = true;
- update( 0.0f );
- }
- else
- {
- //std::cerr << "MediaPluginExample::receiveMessage: unknown media_browser message: " << message_string << std::endl;
- };
- }
- else
- {
- //std::cerr << "MediaPluginExample::receiveMessage: unknown message class: " << message_class << std::endl;
- };
- };
+// std::cerr << "MediaPluginWebKit::receiveMessage: received message: \"" << message_string << "\"" << std::endl;
+ LLPluginMessage message_in;
+
+ if(message_in.parse(message_string) >= 0)
+ {
+ std::string message_class = message_in.getClass();
+ std::string message_name = message_in.getName();
+ if(message_class == LLPLUGIN_MESSAGE_CLASS_BASE)
+ {
+ if(message_name == "init")
+ {
+ LLPluginMessage message("base", "init_response");
+ LLSD versions = LLSD::emptyMap();
+ versions[LLPLUGIN_MESSAGE_CLASS_BASE] = LLPLUGIN_MESSAGE_CLASS_BASE_VERSION;
+ versions[LLPLUGIN_MESSAGE_CLASS_MEDIA] = LLPLUGIN_MESSAGE_CLASS_MEDIA_VERSION;
+ versions[LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER] = LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER_VERSION;
+ message.setValueLLSD("versions", versions);
+
+ std::string plugin_version = "Example plugin 1.0..0";
+ message.setValue("plugin_version", plugin_version);
+ sendMessage(message);
+ }
+ else if(message_name == "idle")
+ {
+ // no response is necessary here.
+ F64 time = message_in.getValueReal("time");
+
+ // Convert time to milliseconds for update()
+ update((int)(time * 1000.0f));
+ }
+ else if(message_name == "cleanup")
+ {
+ }
+ else if(message_name == "shm_added")
+ {
+ SharedSegmentInfo info;
+ info.mAddress = message_in.getValuePointer("address");
+ info.mSize = (size_t)message_in.getValueS32("size");
+ std::string name = message_in.getValue("name");
+
+ mSharedSegments.insert(SharedSegmentMap::value_type(name, info));
+
+ }
+ else if(message_name == "shm_remove")
+ {
+ std::string name = message_in.getValue("name");
+
+ SharedSegmentMap::iterator iter = mSharedSegments.find(name);
+ if(iter != mSharedSegments.end())
+ {
+ if(mPixels == iter->second.mAddress)
+ {
+ // This is the currently active pixel buffer. Make sure we stop drawing to it.
+ mPixels = NULL;
+ mTextureSegmentName.clear();
+ }
+ mSharedSegments.erase(iter);
+ }
+ else
+ {
+// std::cerr << "MediaPluginWebKit::receiveMessage: unknown shared memory region!" << std::endl;
+ }
+
+ // Send the response so it can be cleaned up.
+ LLPluginMessage message("base", "shm_remove_response");
+ message.setValue("name", name);
+ sendMessage(message);
+ }
+ else
+ {
+// std::cerr << "MediaPluginWebKit::receiveMessage: unknown base message: " << message_name << std::endl;
+ }
+ }
+ else if(message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA)
+ {
+ if(message_name == "init")
+ {
+ // Plugin gets to decide the texture parameters to use.
+ mDepth = 4;
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "texture_params");
+ message.setValueS32("default_width", 1024);
+ message.setValueS32("default_height", 1024);
+ message.setValueS32("depth", mDepth);
+ message.setValueU32("internalformat", GL_RGBA);
+ message.setValueU32("format", GL_RGBA);
+ message.setValueU32("type", GL_UNSIGNED_BYTE);
+ message.setValueBoolean("coords_opengl", true);
+ sendMessage(message);
+ }
+ else if(message_name == "size_change")
+ {
+ std::string name = message_in.getValue("name");
+ S32 width = message_in.getValueS32("width");
+ S32 height = message_in.getValueS32("height");
+ S32 texture_width = message_in.getValueS32("texture_width");
+ S32 texture_height = message_in.getValueS32("texture_height");
+
+ if(!name.empty())
+ {
+ // Find the shared memory region with this name
+ SharedSegmentMap::iterator iter = mSharedSegments.find(name);
+ if(iter != mSharedSegments.end())
+ {
+ mPixels = (unsigned char*)iter->second.mAddress;
+ mWidth = width;
+ mHeight = height;
+
+ mTextureWidth = texture_width;
+ mTextureHeight = texture_height;
+ };
+ };
+
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "size_change_response");
+ message.setValue("name", name);
+ message.setValueS32("width", width);
+ message.setValueS32("height", height);
+ message.setValueS32("texture_width", texture_width);
+ message.setValueS32("texture_height", texture_height);
+ sendMessage(message);
+
+ }
+ else if(message_name == "load_uri")
+ {
+ }
+ else if(message_name == "mouse_event")
+ {
+ std::string event = message_in.getValue("event");
+ if(event == "down")
+ {
+
+ }
+ else if(event == "up")
+ {
+ }
+ else if(event == "double_click")
+ {
+ }
+ }
+ }
+ else
+ {
+// std::cerr << "MediaPluginWebKit::receiveMessage: unknown message class: " << message_class << std::endl;
+ };
+ }
}
////////////////////////////////////////////////////////////////////////////////
//
void MediaPluginExample::write_pixel( int x, int y, unsigned char r, unsigned char g, unsigned char b )
{
- // make sure we don't write outside the buffer
- if ( ( x < 0 ) || ( x >= mWidth ) || ( y < 0 ) || ( y >= mHeight ) )
- return;
-
- if ( mBackgroundPixels != NULL )
- {
- unsigned char *pixel = mBackgroundPixels;
- pixel += y * mWidth * mDepth;
- pixel += ( x * mDepth );
- pixel[ 0 ] = b;
- pixel[ 1 ] = g;
- pixel[ 2 ] = r;
-
- setDirty( x, y, x + 1, y + 1 );
- };
+ // make sure we don't write outside the buffer
+ if ( ( x < 0 ) || ( x >= mWidth ) || ( y < 0 ) || ( y >= mHeight ) )
+ return;
+
+ if ( mBackgroundPixels != NULL )
+ {
+ unsigned char *pixel = mBackgroundPixels;
+ pixel += y * mWidth * mDepth;
+ pixel += ( x * mDepth );
+ pixel[ 0 ] = b;
+ pixel[ 1 ] = g;
+ pixel[ 2 ] = r;
+
+ setDirty( x, y, x + 1, y + 1 );
+ };
}
////////////////////////////////////////////////////////////////////////////////
//
void MediaPluginExample::update( F64 milliseconds )
{
- if ( mWidth < 1 || mWidth > 2048 || mHeight < 1 || mHeight > 2048 )
- return;
-
- if ( mPixels == 0 )
- return;
-
- if ( mFirstTime )
- {
- for( int n = 0; n < ENumObjects; ++n )
- {
- mXpos[ n ] = ( mWidth / 2 ) + rand() % ( mWidth / 16 ) - ( mWidth / 32 );
- mYpos[ n ] = ( mHeight / 2 ) + rand() % ( mHeight / 16 ) - ( mHeight / 32 );
-
- mColorR[ n ] = rand() % 0x60 + 0x60;
- mColorG[ n ] = rand() % 0x60 + 0x60;
- mColorB[ n ] = rand() % 0x60 + 0x60;
-
- mXInc[ n ] = 0;
- while ( mXInc[ n ] == 0 )
- mXInc[ n ] = rand() % 7 - 3;
-
- mYInc[ n ] = 0;
- while ( mYInc[ n ] == 0 )
- mYInc[ n ] = rand() % 9 - 4;
-
- mBlockSize[ n ] = rand() % 0x30 + 0x10;
- };
-
- delete [] mBackgroundPixels;
-
- mBackgroundPixels = new unsigned char[ mWidth * mHeight * mDepth ];
-
- mFirstTime = false;
- };
-
- if ( mStopAction )
- return;
-
- if ( time( NULL ) > mLastUpdateTime + 3 )
- {
- const int num_squares = rand() % 20 + 4;
- int sqr1_r = rand() % 0x80 + 0x20;
- int sqr1_g = rand() % 0x80 + 0x20;
- int sqr1_b = rand() % 0x80 + 0x20;
- int sqr2_r = rand() % 0x80 + 0x20;
- int sqr2_g = rand() % 0x80 + 0x20;
- int sqr2_b = rand() % 0x80 + 0x20;
-
- for ( int y1 = 0; y1 < num_squares; ++y1 )
- {
- for ( int x1 = 0; x1 < num_squares; ++x1 )
- {
- int px_start = mWidth * x1 / num_squares;
- int px_end = ( mWidth * ( x1 + 1 ) ) / num_squares;
- int py_start = mHeight * y1 / num_squares;
- int py_end = ( mHeight * ( y1 + 1 ) ) / num_squares;
-
- for( int y2 = py_start; y2 < py_end; ++y2 )
- {
- for( int x2 = px_start; x2 < px_end; ++x2 )
- {
- int rowspan = mWidth * mDepth;
-
- if ( ( y1 % 2 ) ^ ( x1 % 2 ) )
- {
- mBackgroundPixels[ y2 * rowspan + x2 * mDepth + 0 ] = sqr1_r;
- mBackgroundPixels[ y2 * rowspan + x2 * mDepth + 1 ] = sqr1_g;
- mBackgroundPixels[ y2 * rowspan + x2 * mDepth + 2 ] = sqr1_b;
- }
- else
- {
- mBackgroundPixels[ y2 * rowspan + x2 * mDepth + 0 ] = sqr2_r;
- mBackgroundPixels[ y2 * rowspan + x2 * mDepth + 1 ] = sqr2_g;
- mBackgroundPixels[ y2 * rowspan + x2 * mDepth + 2 ] = sqr2_b;
- };
- };
- };
- };
- };
-
- time( &mLastUpdateTime );
- };
-
- memcpy( mPixels, mBackgroundPixels, mWidth * mHeight * mDepth );
-
- for( int n = 0; n < ENumObjects; ++n )
- {
- if ( rand() % 50 == 0 )
- {
- mXInc[ n ] = 0;
- while ( mXInc[ n ] == 0 )
- mXInc[ n ] = rand() % 7 - 3;
-
- mYInc[ n ] = 0;
- while ( mYInc[ n ] == 0 )
- mYInc[ n ] = rand() % 9 - 4;
- };
-
- if ( mXpos[ n ] + mXInc[ n ] < 0 || mXpos[ n ] + mXInc[ n ] >= mWidth - mBlockSize[ n ] )
- mXInc[ n ] =- mXInc[ n ];
-
- if ( mYpos[ n ] + mYInc[ n ] < 0 || mYpos[ n ] + mYInc[ n ] >= mHeight - mBlockSize[ n ] )
- mYInc[ n ] =- mYInc[ n ];
-
- mXpos[ n ] += mXInc[ n ];
- mYpos[ n ] += mYInc[ n ];
-
- for( int y = 0; y < mBlockSize[ n ]; ++y )
- {
- for( int x = 0; x < mBlockSize[ n ]; ++x )
- {
- mPixels[ ( mXpos[ n ] + x ) * mDepth + ( mYpos[ n ] + y ) * mDepth * mWidth + 0 ] = mColorR[ n ];
- mPixels[ ( mXpos[ n ] + x ) * mDepth + ( mYpos[ n ] + y ) * mDepth * mWidth + 1 ] = mColorG[ n ];
- mPixels[ ( mXpos[ n ] + x ) * mDepth + ( mYpos[ n ] + y ) * mDepth * mWidth + 2 ] = mColorB[ n ];
- };
- };
- };
-
- setDirty( 0, 0, mWidth, mHeight );
+ if ( mWidth < 1 || mWidth > 2048 || mHeight < 1 || mHeight > 2048 )
+ return;
+
+ if ( mPixels == 0 )
+ return;
+
+ if ( mFirstTime )
+ {
+ for( int n = 0; n < ENumObjects; ++n )
+ {
+ mXpos[ n ] = ( mWidth / 2 ) + rand() % ( mWidth / 16 ) - ( mWidth / 32 );
+ mYpos[ n ] = ( mHeight / 2 ) + rand() % ( mHeight / 16 ) - ( mHeight / 32 );
+
+ mColorR[ n ] = rand() % 0x60 + 0x60;
+ mColorG[ n ] = rand() % 0x60 + 0x60;
+ mColorB[ n ] = rand() % 0x60 + 0x60;
+
+ mXInc[ n ] = 0;
+ while ( mXInc[ n ] == 0 )
+ mXInc[ n ] = rand() % 7 - 3;
+
+ mYInc[ n ] = 0;
+ while ( mYInc[ n ] == 0 )
+ mYInc[ n ] = rand() % 9 - 4;
+
+ mBlockSize[ n ] = rand() % 0x30 + 0x10;
+ };
+
+ delete [] mBackgroundPixels;
+
+ mBackgroundPixels = new unsigned char[ mWidth * mHeight * mDepth ];
+
+ mFirstTime = false;
+ };
+
+ if ( mStopAction )
+ return;
+
+ if ( time( NULL ) > mLastUpdateTime + 3 )
+ {
+ const int num_squares = rand() % 20 + 4;
+ int sqr1_r = rand() % 0x80 + 0x20;
+ int sqr1_g = rand() % 0x80 + 0x20;
+ int sqr1_b = rand() % 0x80 + 0x20;
+ int sqr2_r = rand() % 0x80 + 0x20;
+ int sqr2_g = rand() % 0x80 + 0x20;
+ int sqr2_b = rand() % 0x80 + 0x20;
+
+ for ( int y1 = 0; y1 < num_squares; ++y1 )
+ {
+ for ( int x1 = 0; x1 < num_squares; ++x1 )
+ {
+ int px_start = mWidth * x1 / num_squares;
+ int px_end = ( mWidth * ( x1 + 1 ) ) / num_squares;
+ int py_start = mHeight * y1 / num_squares;
+ int py_end = ( mHeight * ( y1 + 1 ) ) / num_squares;
+
+ for( int y2 = py_start; y2 < py_end; ++y2 )
+ {
+ for( int x2 = px_start; x2 < px_end; ++x2 )
+ {
+ int rowspan = mWidth * mDepth;
+
+ if ( ( y1 % 2 ) ^ ( x1 % 2 ) )
+ {
+ mBackgroundPixels[ y2 * rowspan + x2 * mDepth + 0 ] = sqr1_r;
+ mBackgroundPixels[ y2 * rowspan + x2 * mDepth + 1 ] = sqr1_g;
+ mBackgroundPixels[ y2 * rowspan + x2 * mDepth + 2 ] = sqr1_b;
+ }
+ else
+ {
+ mBackgroundPixels[ y2 * rowspan + x2 * mDepth + 0 ] = sqr2_r;
+ mBackgroundPixels[ y2 * rowspan + x2 * mDepth + 1 ] = sqr2_g;
+ mBackgroundPixels[ y2 * rowspan + x2 * mDepth + 2 ] = sqr2_b;
+ };
+ };
+ };
+ };
+ };
+
+ time( &mLastUpdateTime );
+ };
+
+ memcpy( mPixels, mBackgroundPixels, mWidth * mHeight * mDepth );
+
+ for( int n = 0; n < ENumObjects; ++n )
+ {
+ if ( rand() % 50 == 0 )
+ {
+ mXInc[ n ] = 0;
+ while ( mXInc[ n ] == 0 )
+ mXInc[ n ] = rand() % 7 - 3;
+
+ mYInc[ n ] = 0;
+ while ( mYInc[ n ] == 0 )
+ mYInc[ n ] = rand() % 9 - 4;
+ };
+
+ if ( mXpos[ n ] + mXInc[ n ] < 0 || mXpos[ n ] + mXInc[ n ] >= mWidth - mBlockSize[ n ] )
+ mXInc[ n ] =- mXInc[ n ];
+
+ if ( mYpos[ n ] + mYInc[ n ] < 0 || mYpos[ n ] + mYInc[ n ] >= mHeight - mBlockSize[ n ] )
+ mYInc[ n ] =- mYInc[ n ];
+
+ mXpos[ n ] += mXInc[ n ];
+ mYpos[ n ] += mYInc[ n ];
+
+ for( int y = 0; y < mBlockSize[ n ]; ++y )
+ {
+ for( int x = 0; x < mBlockSize[ n ]; ++x )
+ {
+ mPixels[ ( mXpos[ n ] + x ) * mDepth + ( mYpos[ n ] + y ) * mDepth * mWidth + 0 ] = mColorR[ n ];
+ mPixels[ ( mXpos[ n ] + x ) * mDepth + ( mYpos[ n ] + y ) * mDepth * mWidth + 1 ] = mColorG[ n ];
+ mPixels[ ( mXpos[ n ] + x ) * mDepth + ( mYpos[ n ] + y ) * mDepth * mWidth + 2 ] = mColorB[ n ];
+ };
+ };
+ };
+
+ setDirty( 0, 0, mWidth, mHeight );
};
////////////////////////////////////////////////////////////////////////////////
//
bool MediaPluginExample::init()
{
- LLPluginMessage message( LLPLUGIN_MESSAGE_CLASS_MEDIA, "name_text" );
- message.setValue( "name", "Example Plugin" );
- sendMessage( message );
+ LLPluginMessage message( LLPLUGIN_MESSAGE_CLASS_MEDIA, "name_text" );
+ message.setValue( "name", "Example Plugin" );
+ sendMessage( message );
- return true;
+ return true;
};
////////////////////////////////////////////////////////////////////////////////
//
int init_media_plugin( LLPluginInstance::sendMessageFunction host_send_func,
- void* host_user_data,
- LLPluginInstance::sendMessageFunction *plugin_send_func,
- void **plugin_user_data )
+ void* host_user_data,
+ LLPluginInstance::sendMessageFunction *plugin_send_func,
+ void **plugin_user_data )
{
- MediaPluginExample* self = new MediaPluginExample( host_send_func, host_user_data );
- *plugin_send_func = MediaPluginExample::staticReceiveMessage;
- *plugin_user_data = ( void* )self;
+ MediaPluginExample* self = new MediaPluginExample( host_send_func, host_user_data );
+ *plugin_send_func = MediaPluginExample::staticReceiveMessage;
+ *plugin_user_data = ( void* )self;
- return 0;
+ return 0;
}
+
diff --git a/indra/media_plugins/quicktime/media_plugin_quicktime.cpp b/indra/media_plugins/quicktime/media_plugin_quicktime.cpp
index 999f754dcf..24328202cb 100644
--- a/indra/media_plugins/quicktime/media_plugin_quicktime.cpp
+++ b/indra/media_plugins/quicktime/media_plugin_quicktime.cpp
@@ -705,7 +705,7 @@ private:
// look up "Display Name" in meta data
OSType meta_data_key = kQTMetaDataCommonKeyDisplayName;
QTMetaDataItem item = kQTMetaDataItemUninitialized;
- result = QTMetaDataGetNextItem( media_data_ref, kQTMetaDataStorageFormatWildcard,
+ result = (OSErr)QTMetaDataGetNextItem( media_data_ref, kQTMetaDataStorageFormatWildcard,
0, kQTMetaDataKeyFormatCommon,
(const UInt8 *)&meta_data_key,
sizeof( meta_data_key ), &item );
@@ -714,14 +714,14 @@ private:
// find the size of the title
ByteCount size;
- result = QTMetaDataGetItemValue( media_data_ref, item, NULL, 0, &size );
+ result = (OSErr)QTMetaDataGetItemValue( media_data_ref, item, NULL, 0, &size );
if ( noErr != result || size <= 0 /*|| size > 1024 FIXME: arbitrary limit */ )
return false;
// allocate some space and grab it
UInt8* item_data = new UInt8[ size + 1 ];
memset( item_data, 0, ( size + 1 ) * sizeof( UInt8 ) );
- result = QTMetaDataGetItemValue( media_data_ref, item, item_data, size, NULL );
+ result = (OSErr)QTMetaDataGetItemValue( media_data_ref, item, item_data, size, NULL );
if ( noErr != result )
{
delete [] item_data;
diff --git a/indra/media_plugins/webkit/CMakeLists.txt b/indra/media_plugins/webkit/CMakeLists.txt
index 05f1236606..b36291f0e8 100644
--- a/indra/media_plugins/webkit/CMakeLists.txt
+++ b/indra/media_plugins/webkit/CMakeLists.txt
@@ -27,6 +27,7 @@ include_directories(
${LLIMAGE_INCLUDE_DIRS}
${LLRENDER_INCLUDE_DIRS}
${LLWINDOW_INCLUDE_DIRS}
+ ${LLQTWEBKIT_INCLUDE_DIR}
)
@@ -120,8 +121,8 @@ if (DARWIN)
add_custom_command(
TARGET media_plugin_webkit POST_BUILD
# OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/libllqtwebkit.dylib
- COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib_release/libllqtwebkit.dylib ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/
- DEPENDS media_plugin_webkit ${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib_release/libllqtwebkit.dylib
+ COMMAND ${CMAKE_COMMAND} -E copy ${ARCH_PREBUILT_DIRS_RELEASE}/libllqtwebkit.dylib ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/
+ DEPENDS media_plugin_webkit ${ARCH_PREBUILT_DIRS_RELEASE}/libllqtwebkit.dylib
)
endif (DARWIN)
diff --git a/indra/media_plugins/webkit/media_plugin_webkit.cpp b/indra/media_plugins/webkit/media_plugin_webkit.cpp
index bd1a44a930..1812abd7d5 100644
--- a/indra/media_plugins/webkit/media_plugin_webkit.cpp
+++ b/indra/media_plugins/webkit/media_plugin_webkit.cpp
@@ -25,12 +25,11 @@
* $/LicenseInfo$
* @endcond
*/
-
#include "llqtwebkit.h"
-
#include "linden_common.h"
#include "indra_constants.h" // for indra keyboard codes
+#include "lltimer.h"
#include "llgl.h"
#include "llplugininstance.h"
@@ -90,6 +89,7 @@ private:
bool mCookiesEnabled;
bool mJavascriptEnabled;
bool mPluginsEnabled;
+ bool mEnableMediaPluginDebugging;
enum
{
@@ -116,9 +116,24 @@ private:
F32 mBackgroundG;
F32 mBackgroundB;
std::string mTarget;
-
+ LLTimer mElapsedTime;
+
VolumeCatcher mVolumeCatcher;
+ void postDebugMessage( const std::string& msg )
+ {
+ if ( mEnableMediaPluginDebugging )
+ {
+ std::stringstream str;
+ str << "@Media Msg> " << "[" << (double)mElapsedTime.getElapsedTimeF32() << "] -- " << msg;
+
+ LLPluginMessage debug_message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "debug_message");
+ debug_message.setValue("message_text", str.str());
+ debug_message.setValue("message_level", "info");
+ sendMessage(debug_message);
+ }
+ }
+
void setInitState(int state)
{
// std::cerr << "changing init state to " << state << std::endl;
@@ -252,6 +267,9 @@ private:
std::string component_dir = application_dir;
#endif
+ // debug spam sent to viewer and displayed in the log as usual
+ postDebugMessage( "Component dir set to: " + component_dir );
+
// window handle - needed on Windows and must be app window.
#if LL_WINDOWS
char window_title[ MAX_PATH ];
@@ -266,10 +284,16 @@ private:
if ( result )
{
mInitState = INIT_STATE_INITIALIZED;
-
+
+ // debug spam sent to viewer and displayed in the log as usual
+ postDebugMessage( "browser initialized okay" );
+
return true;
};
+ // debug spam sent to viewer and displayed in the log as usual
+ postDebugMessage( "browser nOT initialized." );
+
return false;
};
@@ -292,20 +316,34 @@ private:
if(!mHostLanguage.empty())
{
LLQtWebKit::getInstance()->setHostLanguage(mHostLanguage);
+ postDebugMessage( "Setting language to " + mHostLanguage );
}
// turn on/off cookies based on what host app tells us
LLQtWebKit::getInstance()->enableCookies( mCookiesEnabled );
-
+
// turn on/off plugins based on what host app tells us
LLQtWebKit::getInstance()->enablePlugins( mPluginsEnabled );
// turn on/off Javascript based on what host app tells us
+#if LLQTWEBKIT_API_VERSION >= 11
+ LLQtWebKit::getInstance()->enableJavaScript( mJavascriptEnabled );
+#else
LLQtWebKit::getInstance()->enableJavascript( mJavascriptEnabled );
-
+#endif
+
+ std::stringstream str;
+ str << "Cookies enabled = " << mCookiesEnabled << ", plugins enabled = " << mPluginsEnabled << ", Javascript enabled = " << mJavascriptEnabled;
+ postDebugMessage( str.str() );
+
// create single browser window
mBrowserWindowId = LLQtWebKit::getInstance()->createBrowserWindow( mWidth, mHeight, mTarget);
+ str.str("");
+ str.clear();
+ str << "Setting browser window size to " << mWidth << " x " << mHeight;
+ postDebugMessage( str.str() );
+
// tell LLQtWebKit about the size of the browser window
LLQtWebKit::getInstance()->setSize( mBrowserWindowId, mWidth, mHeight );
@@ -314,7 +352,8 @@ private:
// append details to agent string
LLQtWebKit::getInstance()->setBrowserAgentId( mUserAgent );
-
+ postDebugMessage( "Updating user agent with " + mUserAgent );
+
#if !LL_QTWEBKIT_USES_PIXMAPS
// don't flip bitmap
LLQtWebKit::getInstance()->flipWindow( mBrowserWindowId, true );
@@ -341,8 +380,18 @@ private:
url << std::setfill('0') << std::setw(2) << std::hex << int(mBackgroundB * 255.0f);
url << "%22%3E%3C/body%3E%3C/html%3E";
- lldebugs << "data url is: " << url.str() << llendl;
-
+ //lldebugs << "data url is: " << url.str() << llendl;
+
+ // always display loading overlay now
+#if LLQTWEBKIT_API_VERSION >= 16
+ LLQtWebKit::getInstance()->enableLoadingOverlay(mBrowserWindowId, true);
+#else
+ llwarns << "Ignoring enableLoadingOverlay() call (llqtwebkit version is too old)." << llendl;
+#endif
+ str.clear();
+ str << "Loading overlay enabled = " << mEnableMediaPluginDebugging << " for mBrowserWindowId = " << mBrowserWindowId;
+ postDebugMessage( str.str() );
+
LLQtWebKit::getInstance()->navigateTo( mBrowserWindowId, url.str() );
// LLQtWebKit::getInstance()->navigateTo( mBrowserWindowId, "about:blank" );
@@ -407,8 +456,13 @@ private:
{
LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "navigate_begin");
message.setValue("uri", event.getEventUri());
+ message.setValueBoolean("history_back_available", LLQtWebKit::getInstance()->userActionIsEnabled( mBrowserWindowId, LLQtWebKit::UA_NAVIGATE_BACK));
+ message.setValueBoolean("history_forward_available", LLQtWebKit::getInstance()->userActionIsEnabled( mBrowserWindowId, LLQtWebKit::UA_NAVIGATE_FORWARD));
sendMessage(message);
-
+
+ // debug spam sent to viewer and displayed in the log as usual
+ postDebugMessage( "Navigate begin event at: " + event.getEventUri() );
+
setStatus(STATUS_LOADING);
}
@@ -450,6 +504,8 @@ private:
setInitState(INIT_STATE_NAVIGATE_COMPLETE);
}
+ // debug spam sent to viewer and displayed in the log as usual
+ postDebugMessage( "Navigate complete event at: " + event.getEventUri() );
}
////////////////////////////////////////////////////////////////////////////////
@@ -490,6 +546,15 @@ private:
////////////////////////////////////////////////////////////////////////////////
// virtual
+ void onNavigateErrorPage(const EventType& event)
+ {
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "navigate_error_page");
+ message.setValueS32("status_code", event.getIntValue());
+ sendMessage(message);
+ }
+
+ ////////////////////////////////////////////////////////////////////////////////
+ // virtual
void onLocationChange(const EventType& event)
{
if(mInitState >= INIT_STATE_NAVIGATE_COMPLETE)
@@ -517,6 +582,11 @@ private:
{
LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "click_nofollow");
message.setValue("uri", event.getEventUri());
+#if LLQTWEBKIT_API_VERSION >= 7
+ message.setValue("nav_type", event.getNavigationType());
+#else
+ message.setValue("nav_type", "clicked");
+#endif
sendMessage(message);
}
@@ -530,6 +600,10 @@ private:
// These could be passed through as well, but aren't really needed.
// message.setValue("uri", event.getEventUri());
// message.setValueBoolean("dead", (event.getIntValue() != 0))
+
+ // debug spam
+ postDebugMessage( "Sending cookie_set message from plugin: " + event.getStringValue() );
+
sendMessage(message);
}
@@ -569,6 +643,57 @@ private:
return blockingPickFile();
}
+ std::string mAuthUsername;
+ std::string mAuthPassword;
+ bool mAuthOK;
+
+ ////////////////////////////////////////////////////////////////////////////////
+ // virtual
+ bool onAuthRequest(const std::string &in_url, const std::string &in_realm, std::string &out_username, std::string &out_password)
+ {
+ mAuthOK = false;
+
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "auth_request");
+ message.setValue("url", in_url);
+ message.setValue("realm", in_realm);
+ message.setValueBoolean("blocking_request", true);
+
+ // The "blocking_request" key in the message means this sendMessage call will block until a response is received.
+ sendMessage(message);
+
+ if(mAuthOK)
+ {
+ out_username = mAuthUsername;
+ out_password = mAuthPassword;
+ }
+
+ return mAuthOK;
+ }
+
+ void authResponse(LLPluginMessage &message)
+ {
+ mAuthOK = message.getValueBoolean("ok");
+ if(mAuthOK)
+ {
+ mAuthUsername = message.getValue("username");
+ mAuthPassword = message.getValue("password");
+ }
+ }
+
+ ////////////////////////////////////////////////////////////////////////////////
+ // virtual
+ void onLinkHovered(const EventType& event)
+ {
+ if(mInitState >= INIT_STATE_NAVIGATE_COMPLETE)
+ {
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "link_hovered");
+ message.setValue("link", event.getEventUri());
+ message.setValue("title", event.getStringValue());
+ message.setValue("text", event.getStringValue2());
+ sendMessage(message);
+ }
+ }
+
LLQtWebKit::EKeyboardModifier decodeModifiers(std::string &modifiers)
{
int result = 0;
@@ -757,7 +882,10 @@ MediaPluginWebKit::MediaPluginWebKit(LLPluginInstance::sendMessageFunction host_
mHostLanguage = "en"; // default to english
mJavascriptEnabled = true; // default to on
mPluginsEnabled = true; // default to on
+ mEnableMediaPluginDebugging = false;
mUserAgent = "LLPluginMedia Web Browser";
+
+ mElapsedTime.reset();
}
MediaPluginWebKit::~MediaPluginWebKit()
@@ -863,7 +991,7 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)
{
if(message_name == "set_volume")
{
- F32 volume = message_in.getValueReal("volume");
+ F32 volume = (F32)message_in.getValueReal("volume");
setVolume(volume);
}
}
@@ -929,9 +1057,9 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)
S32 height = message_in.getValueS32("height");
S32 texture_width = message_in.getValueS32("texture_width");
S32 texture_height = message_in.getValueS32("texture_height");
- mBackgroundR = message_in.getValueReal("background_r");
- mBackgroundG = message_in.getValueReal("background_g");
- mBackgroundB = message_in.getValueReal("background_b");
+ mBackgroundR = (F32)message_in.getValueReal("background_r");
+ mBackgroundG = (F32)message_in.getValueReal("background_g");
+ mBackgroundB = (F32)message_in.getValueReal("background_b");
// mBackgroundA = message_in.setValueReal("background_a"); // Ignore any alpha
if(!name.empty())
@@ -1096,6 +1224,81 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)
{
onPickFileResponse(message_in.getValue("file"));
}
+ if(message_name == "auth_response")
+ {
+ authResponse(message_in);
+ }
+ else
+ if(message_name == "enable_media_plugin_debugging")
+ {
+ mEnableMediaPluginDebugging = message_in.getValueBoolean( "enable" );
+ }
+ else
+ if(message_name == "js_enable_object")
+ {
+#if LLQTWEBKIT_API_VERSION >= 9
+ bool enable = message_in.getValueBoolean( "enable" );
+ LLQtWebKit::getInstance()->setSLObjectEnabled( enable );
+#endif
+ }
+ else
+ if(message_name == "js_agent_location")
+ {
+#if LLQTWEBKIT_API_VERSION >= 9
+ F32 x = (F32)message_in.getValueReal("x");
+ F32 y = (F32)message_in.getValueReal("y");
+ F32 z = (F32)message_in.getValueReal("z");
+ LLQtWebKit::getInstance()->setAgentLocation( x, y, z );
+ LLQtWebKit::getInstance()->emitLocation();
+#endif
+ }
+ else
+ if(message_name == "js_agent_global_location")
+ {
+#if LLQTWEBKIT_API_VERSION >= 9
+ F32 x = (F32)message_in.getValueReal("x");
+ F32 y = (F32)message_in.getValueReal("y");
+ F32 z = (F32)message_in.getValueReal("z");
+ LLQtWebKit::getInstance()->setAgentGlobalLocation( x, y, z );
+ LLQtWebKit::getInstance()->emitLocation();
+#endif
+ }
+ else
+ if(message_name == "js_agent_orientation")
+ {
+#if LLQTWEBKIT_API_VERSION >= 9
+ F32 angle = (F32)message_in.getValueReal("angle");
+ LLQtWebKit::getInstance()->setAgentOrientation( angle );
+ LLQtWebKit::getInstance()->emitLocation();
+#endif
+ }
+ else
+ if(message_name == "js_agent_region")
+ {
+#if LLQTWEBKIT_API_VERSION >= 9
+ const std::string& region = message_in.getValue("region");
+ LLQtWebKit::getInstance()->setAgentRegion( region );
+ LLQtWebKit::getInstance()->emitLocation();
+#endif
+ }
+ else
+ if(message_name == "js_agent_maturity")
+ {
+#if LLQTWEBKIT_API_VERSION >= 9
+ const std::string& maturity = message_in.getValue("maturity");
+ LLQtWebKit::getInstance()->setAgentMaturity( maturity );
+ LLQtWebKit::getInstance()->emitMaturity();
+#endif
+ }
+ else
+ if(message_name == "js_agent_language")
+ {
+#if LLQTWEBKIT_API_VERSION >= 9
+ const std::string& language = message_in.getValue("language");
+ LLQtWebKit::getInstance()->setAgentLanguage( language );
+ LLQtWebKit::getInstance()->emitLanguage();
+#endif
+ }
else
{
// std::cerr << "MediaPluginWebKit::receiveMessage: unknown media message: " << message_string << std::endl;
@@ -1117,6 +1320,15 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)
mFirstFocus = false;
}
}
+ else if(message_name == "set_page_zoom_factor")
+ {
+#if LLQTWEBKIT_API_VERSION >= 15
+ F32 factor = (F32)message_in.getValueReal("factor");
+ LLQtWebKit::getInstance()->setPageZoomFactor(factor);
+#else
+ llwarns << "Ignoring setPageZoomFactor message (llqtwebkit version is too old)." << llendl;
+#endif
+ }
else if(message_name == "clear_cache")
{
LLQtWebKit::getInstance()->clearCache();
@@ -1143,6 +1355,9 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)
else if(message_name == "set_cookies")
{
LLQtWebKit::getInstance()->setCookies(message_in.getValue("cookies"));
+
+ // debug spam
+ postDebugMessage( "Plugin setting cookie: " + message_in.getValue("cookies") );
}
else if(message_name == "proxy_setup")
{
@@ -1174,7 +1389,9 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)
std::string url = message_in.getValue("url");
if ( 404 == code ) // browser lib only supports 404 right now
{
- LLQtWebKit::getInstance()->set404RedirectUrl( mBrowserWindowId, url );
+#if LLQTWEBKIT_API_VERSION < 8
+ LLQtWebKit::getInstance()->set404RedirectUrl( mBrowserWindowId, url );
+#endif
};
}
else if(message_name == "set_user_agent")
@@ -1182,6 +1399,31 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)
mUserAgent = message_in.getValue("user_agent");
LLQtWebKit::getInstance()->setBrowserAgentId( mUserAgent );
}
+ else if(message_name == "show_web_inspector")
+ {
+#if LLQTWEBKIT_API_VERSION >= 10
+ bool val = message_in.getValueBoolean("show");
+ LLQtWebKit::getInstance()->showWebInspector( val );
+#else
+ llwarns << "Ignoring showWebInspector message (llqtwebkit version is too old)." << llendl;
+#endif
+ }
+ else if(message_name == "ignore_ssl_cert_errors")
+ {
+#if LLQTWEBKIT_API_VERSION >= 3
+ LLQtWebKit::getInstance()->setIgnoreSSLCertErrors( message_in.getValueBoolean("ignore") );
+#else
+ llwarns << "Ignoring ignore_ssl_cert_errors message (llqtwebkit version is too old)." << llendl;
+#endif
+ }
+ else if(message_name == "add_certificate_file_path")
+ {
+#if LLQTWEBKIT_API_VERSION >= 6
+ LLQtWebKit::getInstance()->setCAFile( message_in.getValue("path") );
+#else
+ llwarns << "Ignoring add_certificate_file_path message (llqtwebkit version is too old)." << llendl;
+#endif
+ }
else if(message_name == "init_history")
{
// Initialize browser history
@@ -1236,3 +1478,4 @@ int init_media_plugin(LLPluginInstance::sendMessageFunction host_send_func, void
return 0;
}
+
diff --git a/indra/media_plugins/winmmshim/CMakeLists.txt b/indra/media_plugins/winmmshim/CMakeLists.txt
index 387214088f..bf74f81809 100644
--- a/indra/media_plugins/winmmshim/CMakeLists.txt
+++ b/indra/media_plugins/winmmshim/CMakeLists.txt
@@ -3,6 +3,12 @@
project(winmm_shim)
### winmm_shim
+# *HACK - override msvcrt implementation (intialized on 00-Common) to be
+# statically linked for winmm.dll this relies on vc taking the last flag on
+# the command line
+set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")
+set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /MT")
+set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
set(winmm_shim_SOURCE_FILES
forwarding_api.cpp
diff --git a/indra/media_plugins/winmmshim/forwarding_api.cpp b/indra/media_plugins/winmmshim/forwarding_api.cpp
index eff7e20451..495e08942b 100644
--- a/indra/media_plugins/winmmshim/forwarding_api.cpp
+++ b/indra/media_plugins/winmmshim/forwarding_api.cpp
@@ -389,90 +389,105 @@ void init_function_pointers(HMODULE winmm_handle)
extern "C" {
LRESULT WINAPI CloseDriver( HDRVR hDriver, LPARAM lParam1, LPARAM lParam2)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"CloseDriver\n");
return CloseDriver_orig( hDriver, lParam1, lParam2);
}
HDRVR WINAPI OpenDriver( LPCWSTR szDriverName, LPCWSTR szSectionName, LPARAM lParam2)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"OpenDriver\n");
return OpenDriver_orig( szDriverName, szSectionName, lParam2);
}
LRESULT WINAPI SendDriverMessage( HDRVR hDriver, UINT message, LPARAM lParam1, LPARAM lParam2)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"SendDriverMessage\n");
return SendDriverMessage_orig( hDriver, message, lParam1, lParam2);
}
HMODULE WINAPI DrvGetModuleHandle( HDRVR hDriver)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"DrvGetModuleHandle\n");
return DrvGetModuleHandle_orig( hDriver);
}
HMODULE WINAPI GetDriverModuleHandle( HDRVR hDriver)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"GetDriverModuleHandle\n");
return GetDriverModuleHandle_orig( hDriver);
}
LRESULT WINAPI DefDriverProc( DWORD_PTR dwDriverIdentifier, HDRVR hdrvr, UINT uMsg, LPARAM lParam1, LPARAM lParam2)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"DefDriverProc\n");
return DefDriverProc_orig( dwDriverIdentifier, hdrvr, uMsg, lParam1, lParam2);
}
BOOL WINAPI DriverCallback( DWORD dwCallBack, DWORD dwFlags, HDRVR hdrvr, DWORD msg, DWORD dwUser, DWORD dwParam1, DWORD dwParam2)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"DriverCallback\n");
return DriverCallback_orig(dwCallBack, dwFlags, hdrvr, msg, dwUser, dwParam1, dwParam2);
}
UINT WINAPI mmsystemGetVersion(void)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mmsystemGetVersion\n");
return mmsystemGetVersion_orig();
}
BOOL WINAPI sndPlaySoundA( LPCSTR pszSound, UINT fuSound)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"sndPlaySoundA\n");
return sndPlaySoundA_orig( pszSound, fuSound);
}
BOOL WINAPI sndPlaySoundW( LPCWSTR pszSound, UINT fuSound)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"sndPlaySoundW\n");
return sndPlaySoundW_orig( pszSound, fuSound);
}
BOOL WINAPI PlaySoundA( LPCSTR pszSound, HMODULE hmod, DWORD fdwSound)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"PlaySoundA\n");
return PlaySoundA_orig( pszSound, hmod, fdwSound);
}
BOOL WINAPI PlaySoundW( LPCWSTR pszSound, HMODULE hmod, DWORD fdwSound)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"PlaySoundW\n");
return PlaySoundW_orig( pszSound, hmod, fdwSound);
}
UINT WINAPI waveOutGetNumDevs(void)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveOutGetNumDevs\n");
return waveOutGetNumDevs_orig();
}
MMRESULT WINAPI waveOutGetDevCapsA( UINT_PTR uDeviceID, LPWAVEOUTCAPSA pwoc, UINT cbwoc)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveOutGetDevCapsA\n");
return waveOutGetDevCapsA_orig( uDeviceID, pwoc, cbwoc);
}
MMRESULT WINAPI waveOutGetDevCapsW( UINT_PTR uDeviceID, LPWAVEOUTCAPSW pwoc, UINT cbwoc)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveOutGetDevCapsW\n");
return waveOutGetDevCapsW_orig( uDeviceID, pwoc, cbwoc);
}
@@ -480,24 +495,28 @@ extern "C" {
MMRESULT WINAPI waveOutGetVolume( HWAVEOUT hwo, LPDWORD pdwVolume)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveOutGetVolume\n");
return waveOutGetVolume_orig( hwo, pdwVolume);
}
MMRESULT WINAPI waveOutSetVolume( HWAVEOUT hwo, DWORD dwVolume)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveOutSetVolume\n");
return waveOutSetVolume_orig( hwo, dwVolume);
}
MMRESULT WINAPI waveOutGetErrorTextA( MMRESULT mmrError, LPSTR pszText, UINT cchText)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveOutGetErrorTextA\n");
return waveOutGetErrorTextA_orig( mmrError, pszText, cchText);
}
MMRESULT WINAPI waveOutGetErrorTextW( MMRESULT mmrError, LPWSTR pszText, UINT cchText)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveOutGetErrorTextW\n");
return waveOutGetErrorTextW_orig( mmrError, pszText, cchText);
}
@@ -516,12 +535,14 @@ extern "C" {
MMRESULT WINAPI waveOutPrepareHeader( HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveOutPrepareHeader\n");
return waveOutPrepareHeader_orig( hwo, pwh, cbwh);
}
MMRESULT WINAPI waveOutUnprepareHeader( HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveOutUnprepareHeader\n");
return waveOutUnprepareHeader_orig( hwo, pwh, cbwh);
}
@@ -535,834 +556,973 @@ extern "C" {
MMRESULT WINAPI waveOutPause( HWAVEOUT hwo)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveOutPause\n");
return waveOutPause_orig( hwo);
}
MMRESULT WINAPI waveOutRestart( HWAVEOUT hwo)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveOutRestart\n");
return waveOutRestart_orig( hwo);
}
MMRESULT WINAPI waveOutReset( HWAVEOUT hwo)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveOutReset\n");
return waveOutReset_orig( hwo);
}
MMRESULT WINAPI waveOutBreakLoop( HWAVEOUT hwo)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveOutBreakLoop\n");
return waveOutBreakLoop_orig( hwo);
}
MMRESULT WINAPI waveOutGetPosition( HWAVEOUT hwo, LPMMTIME pmmt, UINT cbmmt)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveOutGetPosition\n");
return waveOutGetPosition_orig( hwo, pmmt, cbmmt);
}
MMRESULT WINAPI waveOutGetPitch( HWAVEOUT hwo, LPDWORD pdwPitch)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveOutGetPitch\n");
return waveOutGetPitch_orig( hwo, pdwPitch);
}
MMRESULT WINAPI waveOutSetPitch( HWAVEOUT hwo, DWORD dwPitch)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveOutSetPitch\n");
return waveOutSetPitch_orig( hwo, dwPitch);
}
MMRESULT WINAPI waveOutGetPlaybackRate( HWAVEOUT hwo, LPDWORD pdwRate)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveOutGetPlaybackRate\n");
return waveOutGetPlaybackRate_orig( hwo, pdwRate);
}
MMRESULT WINAPI waveOutSetPlaybackRate( HWAVEOUT hwo, DWORD dwRate)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveOutSetPlaybackRate\n");
return waveOutSetPlaybackRate_orig( hwo, dwRate);
}
MMRESULT WINAPI waveOutGetID( HWAVEOUT hwo, LPUINT puDeviceID)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveOutGetID\n");
return waveOutGetID_orig( hwo, puDeviceID);
}
MMRESULT WINAPI waveOutMessage( HWAVEOUT hwo, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveOutMessage\n");
return waveOutMessage_orig( hwo, uMsg, dw1, dw2);
}
UINT WINAPI waveInGetNumDevs(void)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveInGetNumDevs\n");
return waveInGetNumDevs_orig();
}
MMRESULT WINAPI waveInGetDevCapsA( UINT_PTR uDeviceID, LPWAVEINCAPSA pwic, UINT cbwic)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveInGetDevCapsA\n");
return waveInGetDevCapsA_orig( uDeviceID, pwic, cbwic);
}
MMRESULT WINAPI waveInGetDevCapsW( UINT_PTR uDeviceID, LPWAVEINCAPSW pwic, UINT cbwic)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveInGetDevCapsW\n");
return waveInGetDevCapsW_orig( uDeviceID, pwic, cbwic);
}
MMRESULT WINAPI waveInGetErrorTextA(MMRESULT mmrError, LPSTR pszText, UINT cchText)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveInGetErrorTextA\n");
return waveInGetErrorTextA_orig(mmrError, pszText, cchText);
}
MMRESULT WINAPI waveInGetErrorTextW(MMRESULT mmrError, LPWSTR pszText, UINT cchText)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveInGetErrorTextW\n");
return waveInGetErrorTextW_orig(mmrError, pszText, cchText);
}
MMRESULT WINAPI waveInOpen( LPHWAVEIN phwi, UINT uDeviceID, LPCWAVEFORMATEX pwfx, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveInOpen\n");
return waveInOpen_orig(phwi, uDeviceID, pwfx, dwCallback, dwInstance, fdwOpen);
}
MMRESULT WINAPI waveInClose( HWAVEIN hwi)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveInClose\n");
return waveInClose_orig( hwi);
}
MMRESULT WINAPI waveInPrepareHeader( HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveInPrepareHeader\n");
return waveInPrepareHeader_orig( hwi, pwh, cbwh);
}
MMRESULT WINAPI waveInUnprepareHeader( HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveInUnprepareHeader\n");
return waveInUnprepareHeader_orig( hwi, pwh, cbwh);
}
MMRESULT WINAPI waveInAddBuffer( HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveInAddBuffer\n");
return waveInAddBuffer_orig( hwi, pwh, cbwh);
}
MMRESULT WINAPI waveInStart( HWAVEIN hwi)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveInStart\n");
return waveInStart_orig( hwi);
}
MMRESULT WINAPI waveInStop( HWAVEIN hwi)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveInStop\n");
return waveInStop_orig(hwi);
}
MMRESULT WINAPI waveInReset( HWAVEIN hwi)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveInReset\n");
return waveInReset_orig(hwi);
}
MMRESULT WINAPI waveInGetPosition( HWAVEIN hwi, LPMMTIME pmmt, UINT cbmmt)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveInGetPosition\n");
return waveInGetPosition_orig( hwi, pmmt, cbmmt);
}
MMRESULT WINAPI waveInGetID( HWAVEIN hwi, LPUINT puDeviceID)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveInGetID\n");
return waveInGetID_orig( hwi, puDeviceID);
}
MMRESULT WINAPI waveInMessage( HWAVEIN hwi, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"waveInMessage\n");
return waveInMessage_orig( hwi, uMsg, dw1, dw2);
}
UINT WINAPI midiOutGetNumDevs(void)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiOutGetNumDevs\n");
return midiOutGetNumDevs_orig();
}
MMRESULT WINAPI midiStreamOpen( LPHMIDISTRM phms, LPUINT puDeviceID, DWORD cMidi, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiStreamOpen\n");
return midiStreamOpen_orig( phms, puDeviceID, cMidi, dwCallback, dwInstance, fdwOpen);
}
MMRESULT WINAPI midiStreamClose( HMIDISTRM hms)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiStreamClose\n");
return midiStreamClose_orig( hms);
}
MMRESULT WINAPI midiStreamProperty( HMIDISTRM hms, LPBYTE lppropdata, DWORD dwProperty)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiStreamProperty\n");
return midiStreamProperty_orig( hms, lppropdata, dwProperty);
}
MMRESULT WINAPI midiStreamPosition( HMIDISTRM hms, LPMMTIME lpmmt, UINT cbmmt)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiStreamPosition\n");
return midiStreamPosition_orig( hms, lpmmt, cbmmt);
}
MMRESULT WINAPI midiStreamOut( HMIDISTRM hms, LPMIDIHDR pmh, UINT cbmh)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiStreamOut\n");
return midiStreamOut_orig( hms, pmh, cbmh);
}
MMRESULT WINAPI midiStreamPause( HMIDISTRM hms)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiStreamPause\n");
return midiStreamPause_orig( hms);
}
MMRESULT WINAPI midiStreamRestart( HMIDISTRM hms)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiStreamRestart\n");
return midiStreamRestart_orig( hms);
}
MMRESULT WINAPI midiStreamStop( HMIDISTRM hms)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiStreamStop\n");
return midiStreamStop_orig( hms);
}
MMRESULT WINAPI midiConnect( HMIDI hmi, HMIDIOUT hmo, LPVOID pReserved)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiConnect\n");
return midiConnect_orig( hmi, hmo, pReserved);
}
MMRESULT WINAPI midiDisconnect( HMIDI hmi, HMIDIOUT hmo, LPVOID pReserved)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiDisconnect\n");
return midiDisconnect_orig( hmi, hmo, pReserved);
}
MMRESULT WINAPI midiOutGetDevCapsA( UINT_PTR uDeviceID, LPMIDIOUTCAPSA pmoc, UINT cbmoc)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiOutGetDevCapsA\n");
return midiOutGetDevCapsA_orig( uDeviceID, pmoc, cbmoc);
}
MMRESULT WINAPI midiOutGetDevCapsW( UINT_PTR uDeviceID, LPMIDIOUTCAPSW pmoc, UINT cbmoc)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiOutGetDevCapsW\n");
return midiOutGetDevCapsW_orig( uDeviceID, pmoc, cbmoc);
}
MMRESULT WINAPI midiOutGetVolume( HMIDIOUT hmo, LPDWORD pdwVolume)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiOutGetVolume\n");
return midiOutGetVolume_orig( hmo, pdwVolume);
}
MMRESULT WINAPI midiOutSetVolume( HMIDIOUT hmo, DWORD dwVolume)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiOutSetVolume\n");
return midiOutSetVolume_orig( hmo, dwVolume);
}
MMRESULT WINAPI midiOutGetErrorTextA( MMRESULT mmrError, LPSTR pszText, UINT cchText)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiOutGetErrorTextA\n");
return midiOutGetErrorTextA_orig( mmrError, pszText, cchText);
}
MMRESULT WINAPI midiOutGetErrorTextW( MMRESULT mmrError, LPWSTR pszText, UINT cchText)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiOutGetErrorTextW\n");
return midiOutGetErrorTextW_orig( mmrError, pszText, cchText);
}
MMRESULT WINAPI midiOutOpen( LPHMIDIOUT phmo, UINT uDeviceID, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiOutOpen\n");
return midiOutOpen_orig(phmo, uDeviceID, dwCallback, dwInstance, fdwOpen);
}
MMRESULT WINAPI midiOutClose( HMIDIOUT hmo)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiOutClose\n");
return midiOutClose_orig( hmo);
}
MMRESULT WINAPI midiOutPrepareHeader( HMIDIOUT hmo, LPMIDIHDR pmh, UINT cbmh)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiOutPrepareHeader\n");
return midiOutPrepareHeader_orig( hmo, pmh, cbmh);
}
MMRESULT WINAPI midiOutUnprepareHeader(HMIDIOUT hmo, LPMIDIHDR pmh, UINT cbmh)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiOutUnprepareHeader\n");
return midiOutUnprepareHeader_orig(hmo, pmh, cbmh);
}
MMRESULT WINAPI midiOutShortMsg( HMIDIOUT hmo, DWORD dwMsg)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiOutShortMsg\n");
return midiOutShortMsg_orig( hmo, dwMsg);
}
MMRESULT WINAPI midiOutLongMsg(HMIDIOUT hmo, LPMIDIHDR pmh, UINT cbmh)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiOutLongMsg\n");
return midiOutLongMsg_orig(hmo, pmh, cbmh);
}
MMRESULT WINAPI midiOutReset( HMIDIOUT hmo)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiOutReset\n");
return midiOutReset_orig( hmo);
}
MMRESULT WINAPI midiOutCachePatches( HMIDIOUT hmo, UINT uBank, LPWORD pwpa, UINT fuCache)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiOutCachePatches\n");
return midiOutCachePatches_orig( hmo, uBank, pwpa, fuCache);
}
MMRESULT WINAPI midiOutCacheDrumPatches( HMIDIOUT hmo, UINT uPatch, LPWORD pwkya, UINT fuCache)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiOutCacheDrumPatches\n");
return midiOutCacheDrumPatches_orig( hmo, uPatch, pwkya, fuCache);
}
MMRESULT WINAPI midiOutGetID( HMIDIOUT hmo, LPUINT puDeviceID)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiOutGetID\n");
return midiOutGetID_orig( hmo, puDeviceID);
}
MMRESULT WINAPI midiOutMessage( HMIDIOUT hmo, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiOutMessage\n");
return midiOutMessage_orig( hmo, uMsg, dw1, dw2);
}
UINT WINAPI midiInGetNumDevs(void)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiInGetNumDevs\n");
return midiInGetNumDevs_orig();
}
MMRESULT WINAPI midiInGetDevCapsA( UINT_PTR uDeviceID, LPMIDIINCAPSA pmic, UINT cbmic)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiInGetDevCapsA\n");
return midiInGetDevCapsA_orig( uDeviceID, pmic, cbmic);
}
MMRESULT WINAPI midiInGetDevCapsW( UINT_PTR uDeviceID, LPMIDIINCAPSW pmic, UINT cbmic)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiInGetDevCapsW\n");
return midiInGetDevCapsW_orig( uDeviceID, pmic, cbmic);
}
MMRESULT WINAPI midiInGetErrorTextA( MMRESULT mmrError, LPSTR pszText, UINT cchText)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiInGetErrorTextA\n");
return midiInGetErrorTextA_orig( mmrError, pszText, cchText);
}
MMRESULT WINAPI midiInGetErrorTextW( MMRESULT mmrError, LPWSTR pszText, UINT cchText)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiInGetErrorTextW\n");
return midiInGetErrorTextW_orig( mmrError, pszText, cchText);
}
MMRESULT WINAPI midiInOpen( LPHMIDIIN phmi, UINT uDeviceID, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiInOpen\n");
return midiInOpen_orig(phmi, uDeviceID, dwCallback, dwInstance, fdwOpen);
}
MMRESULT WINAPI midiInClose( HMIDIIN hmi)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiInClose\n");
return midiInClose_orig( hmi);
}
MMRESULT WINAPI midiInPrepareHeader( HMIDIIN hmi, LPMIDIHDR pmh, UINT cbmh)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiInPrepareHeader\n");
return midiInPrepareHeader_orig( hmi, pmh, cbmh);
}
MMRESULT WINAPI midiInUnprepareHeader( HMIDIIN hmi, LPMIDIHDR pmh, UINT cbmh)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiInUnprepareHeader\n");
return midiInUnprepareHeader_orig( hmi, pmh, cbmh);
}
MMRESULT WINAPI midiInAddBuffer( HMIDIIN hmi, LPMIDIHDR pmh, UINT cbmh)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiInAddBuffer\n");
return midiInAddBuffer_orig( hmi, pmh, cbmh);
}
MMRESULT WINAPI midiInStart( HMIDIIN hmi)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiInStart\n");
return midiInStart_orig( hmi);
}
MMRESULT WINAPI midiInStop( HMIDIIN hmi)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiInStop\n");
return midiInStop_orig(hmi);
}
MMRESULT WINAPI midiInReset( HMIDIIN hmi)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiInReset\n");
return midiInReset_orig( hmi);
}
MMRESULT WINAPI midiInGetID( HMIDIIN hmi, LPUINT puDeviceID)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiInGetID\n");
return midiInGetID_orig( hmi, puDeviceID);
}
MMRESULT WINAPI midiInMessage( HMIDIIN hmi, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"midiInMessage\n");
return midiInMessage_orig( hmi, uMsg, dw1, dw2);
}
UINT WINAPI auxGetNumDevs(void)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"auxGetNumDevs\n");
return auxGetNumDevs_orig();
}
MMRESULT WINAPI auxGetDevCapsA( UINT_PTR uDeviceID, LPAUXCAPSA pac, UINT cbac)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"auxGetDevCapsA\n");
return auxGetDevCapsA_orig( uDeviceID, pac, cbac);
}
MMRESULT WINAPI auxGetDevCapsW( UINT_PTR uDeviceID, LPAUXCAPSW pac, UINT cbac)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"auxGetDevCapsW\n");
return auxGetDevCapsW_orig( uDeviceID, pac, cbac);
}
MMRESULT WINAPI auxSetVolume( UINT uDeviceID, DWORD dwVolume)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"auxSetVolume\n");
return auxSetVolume_orig( uDeviceID, dwVolume);
}
MMRESULT WINAPI auxGetVolume( UINT uDeviceID, LPDWORD pdwVolume)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"auxGetVolume\n");
return auxGetVolume_orig( uDeviceID, pdwVolume);
}
MMRESULT WINAPI auxOutMessage( UINT uDeviceID, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"auxOutMessage\n");
return auxOutMessage_orig( uDeviceID, uMsg, dw1, dw2);
}
UINT WINAPI mixerGetNumDevs(void)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mixerGetNumDevs\n");
return mixerGetNumDevs_orig();
}
MMRESULT WINAPI mixerGetDevCapsA( UINT_PTR uMxId, LPMIXERCAPSA pmxcaps, UINT cbmxcaps)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mixerGetDevCapsA\n");
return mixerGetDevCapsA_orig( uMxId, pmxcaps, cbmxcaps);
}
MMRESULT WINAPI mixerGetDevCapsW( UINT_PTR uMxId, LPMIXERCAPSW pmxcaps, UINT cbmxcaps)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mixerGetDevCapsW\n");
return mixerGetDevCapsW_orig( uMxId, pmxcaps, cbmxcaps);
}
MMRESULT WINAPI mixerOpen( LPHMIXER phmx, UINT uMxId, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mixerOpen\n");
return mixerOpen_orig( phmx, uMxId, dwCallback, dwInstance, fdwOpen);
}
MMRESULT WINAPI mixerClose( HMIXER hmx)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mixerClose\n");
return mixerClose_orig( hmx);
}
DWORD WINAPI mixerMessage( HMIXER hmx, UINT uMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mixerMessage\n");
return mixerMessage_orig( hmx, uMsg, dwParam1, dwParam2);
}
MMRESULT WINAPI mixerGetLineInfoA( HMIXEROBJ hmxobj, LPMIXERLINEA pmxl, DWORD fdwInfo)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mixerGetLineInfoA\n");
return mixerGetLineInfoA_orig( hmxobj, pmxl, fdwInfo);
}
MMRESULT WINAPI mixerGetLineInfoW( HMIXEROBJ hmxobj, LPMIXERLINEW pmxl, DWORD fdwInfo)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mixerGetLineInfoW\n");
return mixerGetLineInfoW_orig( hmxobj, pmxl, fdwInfo);
}
MMRESULT WINAPI mixerGetID( HMIXEROBJ hmxobj, UINT FAR *puMxId, DWORD fdwId)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mixerGetID\n");
return mixerGetID_orig( hmxobj, puMxId, fdwId);
}
MMRESULT WINAPI mixerGetLineControlsA( HMIXEROBJ hmxobj, LPMIXERLINECONTROLSA pmxlc, DWORD fdwControls)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mixerGetLineControlsA\n");
return mixerGetLineControlsA_orig( hmxobj, pmxlc, fdwControls);
}
MMRESULT WINAPI mixerGetLineControlsW( HMIXEROBJ hmxobj, LPMIXERLINECONTROLSW pmxlc, DWORD fdwControls)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mixerGetLineControlsW\n");
return mixerGetLineControlsW_orig( hmxobj, pmxlc, fdwControls);
}
MMRESULT WINAPI mixerGetControlDetailsA( HMIXEROBJ hmxobj, LPMIXERCONTROLDETAILS pmxcd, DWORD fdwDetails)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mixerGetControlDetailsA\n");
return mixerGetControlDetailsA_orig( hmxobj, pmxcd, fdwDetails);
}
MMRESULT WINAPI mixerGetControlDetailsW( HMIXEROBJ hmxobj, LPMIXERCONTROLDETAILS pmxcd, DWORD fdwDetails)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mixerGetControlDetailsW\n");
return mixerGetControlDetailsW_orig( hmxobj, pmxcd, fdwDetails);
}
MMRESULT WINAPI mixerSetControlDetails( HMIXEROBJ hmxobj, LPMIXERCONTROLDETAILS pmxcd, DWORD fdwDetails)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mixerSetControlDetails\n");
return mixerSetControlDetails_orig( hmxobj, pmxcd, fdwDetails);
}
DWORD WINAPI mmGetCurrentTask(void)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mmGetCurrentTask\n");
return mmGetCurrentTask_orig();
}
void WINAPI mmTaskBlock(DWORD val)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mmTaskBlock\n");
return mmTaskBlock_orig(val);
}
UINT WINAPI mmTaskCreate(LPTASKCALLBACK a, HANDLE* b, DWORD_PTR c)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mmTaskCreate\n");
return mmTaskCreate_orig(a, b, c);
}
BOOL WINAPI mmTaskSignal(DWORD a)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mmTaskSignal\n");
return mmTaskSignal_orig(a);
}
VOID WINAPI mmTaskYield()
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mmTaskYield\n");
mmTaskYield_orig();
}
MMRESULT WINAPI timeGetSystemTime( LPMMTIME pmmt, UINT cbmmt)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"timeGetSystemTime\n");
return timeGetSystemTime_orig( pmmt, cbmmt);
}
DWORD WINAPI timeGetTime(void)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"timeGetTime\n");
return timeGetTime_orig();
}
MMRESULT WINAPI timeSetEvent( UINT uDelay, UINT uResolution, LPTIMECALLBACK fptc, DWORD_PTR dwUser, UINT fuEvent)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"timeSetEvent\n");
return timeSetEvent_orig(uDelay, uResolution, fptc, dwUser, fuEvent);
}
MMRESULT WINAPI timeKillEvent( UINT uTimerID)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"timeKillEvent\n");
return timeKillEvent_orig( uTimerID);
}
MMRESULT WINAPI timeGetDevCaps( LPTIMECAPS ptc, UINT cbtc)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"timeGetDevCaps\n");
return timeGetDevCaps_orig( ptc, cbtc);
}
MMRESULT WINAPI timeBeginPeriod( UINT uPeriod)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"timeBeginPeriod\n");
return timeBeginPeriod_orig( uPeriod);
}
MMRESULT WINAPI timeEndPeriod( UINT uPeriod)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"timeEndPeriod\n");
return timeEndPeriod_orig( uPeriod);
}
UINT WINAPI joyGetNumDevs(void)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"joyGetNumDevs\n");
return joyGetNumDevs_orig();
}
MMRESULT WINAPI joyConfigChanged(DWORD dwFlags)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"joyConfigChanged\n");
return joyConfigChanged_orig(dwFlags);
}
MMRESULT WINAPI joyGetDevCapsA( UINT_PTR uJoyID, LPJOYCAPSA pjc, UINT cbjc)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"joyGetDevCapsA\n");
return joyGetDevCapsA_orig( uJoyID, pjc, cbjc);
}
MMRESULT WINAPI joyGetDevCapsW( UINT_PTR uJoyID, LPJOYCAPSW pjc, UINT cbjc)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"joyGetDevCapsW\n");
return joyGetDevCapsW_orig( uJoyID, pjc, cbjc);
}
MMRESULT WINAPI joyGetPos( UINT uJoyID, LPJOYINFO pji)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"joyGetPos\n");
return joyGetPos_orig( uJoyID, pji);
}
MMRESULT WINAPI joyGetPosEx( UINT uJoyID, LPJOYINFOEX pji)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"joyGetPosEx\n");
return joyGetPosEx_orig( uJoyID, pji);
}
MMRESULT WINAPI joyGetThreshold( UINT uJoyID, LPUINT puThreshold)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"joyGetThreshold\n");
return joyGetThreshold_orig( uJoyID, puThreshold);
}
MMRESULT WINAPI joyReleaseCapture( UINT uJoyID)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"joyReleaseCapture\n");
return joyReleaseCapture_orig( uJoyID);
}
MMRESULT WINAPI joySetCapture( HWND hwnd, UINT uJoyID, UINT uPeriod, BOOL fChanged)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"joySetCapture\n");
return joySetCapture_orig(hwnd, uJoyID, uPeriod, fChanged);
}
MMRESULT WINAPI joySetThreshold( UINT uJoyID, UINT uThreshold)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"joySetThreshold\n");
return joySetThreshold_orig( uJoyID, uThreshold);
}
BOOL WINAPI mciDriverNotify(HWND hwndCallback, UINT uDeviceID, UINT uStatus)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mciDriverNotify\n");
return mciDriverNotify_orig(hwndCallback, uDeviceID, uStatus);
}
UINT WINAPI mciDriverYield(UINT uDeviceID)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mciDriverYield\n");
return mciDriverYield_orig(uDeviceID);
}
FOURCC WINAPI mmioStringToFOURCCA( LPCSTR sz, UINT uFlags)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mmioStringToFOURCCA\n");
return mmioStringToFOURCCA_orig( sz, uFlags);
}
FOURCC WINAPI mmioStringToFOURCCW( LPCWSTR sz, UINT uFlags)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mmioStringToFOURCCW\n");
return mmioStringToFOURCCW_orig( sz, uFlags);
}
LPMMIOPROC WINAPI mmioInstallIOProcA( FOURCC fccIOProc, LPMMIOPROC pIOProc, DWORD dwFlags)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mmioInstallIOProcA\n");
return mmioInstallIOProcA_orig( fccIOProc, pIOProc, dwFlags);
}
LPMMIOPROC WINAPI mmioInstallIOProcW( FOURCC fccIOProc, LPMMIOPROC pIOProc, DWORD dwFlags)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mmioInstallIOProcW\n");
return mmioInstallIOProcW_orig( fccIOProc, pIOProc, dwFlags);
}
HMMIO WINAPI mmioOpenA( LPSTR pszFileName, LPMMIOINFO pmmioinfo, DWORD fdwOpen)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mmioOpenA\n");
return mmioOpenA_orig( pszFileName, pmmioinfo, fdwOpen);
}
HMMIO WINAPI mmioOpenW( LPWSTR pszFileName, LPMMIOINFO pmmioinfo, DWORD fdwOpen)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mmioOpenW\n");
return mmioOpenW_orig( pszFileName, pmmioinfo, fdwOpen);
}
MMRESULT WINAPI mmioRenameA( LPCSTR pszFileName, LPCSTR pszNewFileName, LPCMMIOINFO pmmioinfo, DWORD fdwRename)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mmioRenameA\n");
return mmioRenameA_orig( pszFileName, pszNewFileName, pmmioinfo, fdwRename);
}
MMRESULT WINAPI mmioRenameW( LPCWSTR pszFileName, LPCWSTR pszNewFileName, LPCMMIOINFO pmmioinfo, DWORD fdwRename)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mmioRenameW\n");
return mmioRenameW_orig( pszFileName, pszNewFileName, pmmioinfo, fdwRename);
}
MMRESULT WINAPI mmioClose( HMMIO hmmio, UINT fuClose)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mmioClose\n");
return mmioClose_orig( hmmio, fuClose);
}
LONG WINAPI mmioRead( HMMIO hmmio, HPSTR pch, LONG cch)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mmioRead\n");
return mmioRead_orig( hmmio, pch, cch);
}
LONG WINAPI mmioWrite( HMMIO hmmio, const char _huge* pch, LONG cch)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mmioWrite\n");
return mmioWrite_orig( hmmio, pch, cch);
}
LONG WINAPI mmioSeek( HMMIO hmmio, LONG lOffset, int iOrigin)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mmioSeek\n");
return mmioSeek_orig(hmmio, lOffset, iOrigin);
}
MMRESULT WINAPI mmioGetInfo( HMMIO hmmio, LPMMIOINFO pmmioinfo, UINT fuInfo)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mmioGetInfo\n");
return mmioGetInfo_orig( hmmio, pmmioinfo, fuInfo);
}
MMRESULT WINAPI mmioSetInfo( HMMIO hmmio, LPCMMIOINFO pmmioinfo, UINT fuInfo)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mmioSetInfo\n");
return mmioSetInfo_orig( hmmio, pmmioinfo, fuInfo);
}
MMRESULT WINAPI mmioSetBuffer( HMMIO hmmio, LPSTR pchBuffer, LONG cchBuffer, UINT fuBuffer)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mmioSetBuffer\n");
return mmioSetBuffer_orig(hmmio, pchBuffer, cchBuffer, fuBuffer);
}
MMRESULT WINAPI mmioFlush( HMMIO hmmio, UINT fuFlush)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mmioFlush\n");
return mmioFlush_orig( hmmio, fuFlush);
}
MMRESULT WINAPI mmioAdvance( HMMIO hmmio, LPMMIOINFO pmmioinfo, UINT fuAdvance)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mmioAdvance\n");
return mmioAdvance_orig( hmmio, pmmioinfo, fuAdvance);
}
LRESULT WINAPI mmioSendMessage( HMMIO hmmio, UINT uMsg, LPARAM lParam1, LPARAM lParam2)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mmioSendMessage\n");
return mmioSendMessage_orig(hmmio, uMsg, lParam1, lParam2);
}
MMRESULT WINAPI mmioDescend( HMMIO hmmio, LPMMCKINFO pmmcki, const MMCKINFO FAR* pmmckiParent, UINT fuDescend)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mmioDescend\n");
return mmioDescend_orig(hmmio, pmmcki, pmmckiParent, fuDescend);
}
MMRESULT WINAPI mmioAscend( HMMIO hmmio, LPMMCKINFO pmmcki, UINT fuAscend)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mmioAscend\n");
return mmioAscend_orig( hmmio, pmmcki, fuAscend);
}
MMRESULT WINAPI mmioCreateChunk(HMMIO hmmio, LPMMCKINFO pmmcki, UINT fuCreate)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mmioCreateChunk\n");
return mmioCreateChunk_orig(hmmio, pmmcki, fuCreate);
}
MCIERROR WINAPI mciSendCommandA( MCIDEVICEID mciId, UINT uMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mciSendCommandA\n");
return mciSendCommandA_orig( mciId, uMsg, dwParam1, dwParam2);
}
MCIERROR WINAPI mciSendCommandW( MCIDEVICEID mciId, UINT uMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mciSendCommandW\n");
return mciSendCommandW_orig( mciId, uMsg, dwParam1, dwParam2);
}
MCIERROR WINAPI mciSendStringA( LPCSTR lpstrCommand, LPSTR lpstrReturnString, UINT uReturnLength, HWND hwndCallback)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mciSendStringA\n");
return mciSendStringA_orig( lpstrCommand, lpstrReturnString, uReturnLength, hwndCallback);
}
MCIERROR WINAPI mciSendStringW( LPCWSTR lpstrCommand, LPWSTR lpstrReturnString, UINT uReturnLength, HWND hwndCallback)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mciSendStringW\n");
return mciSendStringW_orig( lpstrCommand, lpstrReturnString, uReturnLength, hwndCallback);
}
@@ -1375,72 +1535,84 @@ extern "C" {
MCIDEVICEID WINAPI mciGetDeviceIDW( LPCWSTR pszDevice)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mciGetDeviceIDW\n");
return mciGetDeviceIDW_orig( pszDevice);
}
MCIDEVICEID WINAPI mciGetDeviceIDFromElementIDA( DWORD dwElementID, LPCSTR lpstrType )
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mciGetDeviceIDFromElementIDA\n");
return mciGetDeviceIDFromElementIDA_orig( dwElementID, lpstrType );
}
MCIDEVICEID WINAPI mciGetDeviceIDFromElementIDW( DWORD dwElementID, LPCWSTR lpstrType )
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mciGetDeviceIDFromElementIDW\n");
return mciGetDeviceIDFromElementIDW_orig( dwElementID, lpstrType );
}
DWORD_PTR WINAPI mciGetDriverData(UINT uDeviceID)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mciGetDriverData\n");
return mciGetDriverData_orig(uDeviceID);
}
BOOL WINAPI mciGetErrorStringA( MCIERROR mcierr, LPSTR pszText, UINT cchText)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mciGetErrorStringA\n");
return mciGetErrorStringA_orig( mcierr, pszText, cchText);
}
BOOL WINAPI mciGetErrorStringW( MCIERROR mcierr, LPWSTR pszText, UINT cchText)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mciGetErrorStringW\n");
return mciGetErrorStringW_orig( mcierr, pszText, cchText);
}
BOOL WINAPI mciSetDriverData(UINT uDeviceID, DWORD_PTR dwData)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mciSetDriverData_type\n");
return mciSetDriverData_orig( uDeviceID, dwData );
}
BOOL WINAPI mciSetYieldProc( MCIDEVICEID mciId, YIELDPROC fpYieldProc, DWORD dwYieldData)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mciSetYieldProc\n");
return mciSetYieldProc_orig(mciId, fpYieldProc, dwYieldData);
}
BOOL WINAPI mciFreeCommandResource(UINT uTable)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mciFreeCommandResource\n");
return mciFreeCommandResource_orig(uTable);
}
HTASK WINAPI mciGetCreatorTask( MCIDEVICEID mciId)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mciGetCreatorTask\n");
return mciGetCreatorTask_orig( mciId);
}
YIELDPROC WINAPI mciGetYieldProc( MCIDEVICEID mciId, LPDWORD pdwYieldData)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mciGetYieldProc\n");
return mciGetYieldProc_orig( mciId, pdwYieldData);
}
UINT WINAPI mciLoadCommandResource(HINSTANCE hInstance, LPCWSTR lpResName, UINT uType)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mciLoadCommandResource");
return mciLoadCommandResource_orig(hInstance, lpResName, uType);
}
@@ -1448,6 +1620,7 @@ extern "C" {
BOOL WINAPI mciExecute(LPCSTR pszCommand)
{
+ ll_winmm_shim_initialize();
//OutputDebugString(L"mciExecute\n");
return mciExecute_orig(pszCommand);
}
diff --git a/indra/media_plugins/winmmshim/forwarding_api.h b/indra/media_plugins/winmmshim/forwarding_api.h
index 89a6b347f3..076a08f769 100644
--- a/indra/media_plugins/winmmshim/forwarding_api.h
+++ b/indra/media_plugins/winmmshim/forwarding_api.h
@@ -30,6 +30,7 @@
#include <mmsystem.h>
void init_function_pointers(HMODULE winmm_handle);
+void ll_winmm_shim_initialize();
typedef VOID (*LPTASKCALLBACK)(DWORD_PTR dwInst);
diff --git a/indra/media_plugins/winmmshim/winmm_shim.cpp b/indra/media_plugins/winmmshim/winmm_shim.cpp
index 9563a3b664..47a1e5c018 100644
--- a/indra/media_plugins/winmmshim/winmm_shim.cpp
+++ b/indra/media_plugins/winmmshim/winmm_shim.cpp
@@ -32,14 +32,21 @@ using std::wstring;
static float sVolumeLevel = 1.f;
static bool sMute = false;
+static CRITICAL_SECTION sCriticalSection;
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
+ InitializeCriticalSection(&sCriticalSection);
+ return TRUE;
+}
+
+void ll_winmm_shim_initialize(){
static bool initialized = false;
// do this only once
+ EnterCriticalSection(&sCriticalSection);
if (!initialized)
{ // bind to original winmm.dll
TCHAR system_path[MAX_PATH];
@@ -54,13 +61,15 @@ BOOL APIENTRY DllMain( HMODULE hModule,
{ // we have a dll, let's get out pointers!
initialized = true;
init_function_pointers(winmm_handle);
- return true;
+ ::OutputDebugStringA("WINMM_SHIM.DLL: real winmm.dll initialized successfully\n");
+ }
+ else
+ {
+ // failed to initialize real winmm.dll
+ ::OutputDebugStringA("WINMM_SHIM.DLL: Failed to initialize real winmm.dll\n");
}
-
- // failed to initialize real winmm.dll
- return false;
}
- return true;
+ LeaveCriticalSection(&sCriticalSection);
}
@@ -79,6 +88,7 @@ extern "C"
MMRESULT WINAPI waveOutOpen( LPHWAVEOUT phwo, UINT uDeviceID, LPCWAVEFORMATEX pwfx, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen)
{
+ ll_winmm_shim_initialize();
if (pwfx->wFormatTag != WAVE_FORMAT_PCM
|| (pwfx->wBitsPerSample != 8 && pwfx->wBitsPerSample != 16))
{ // uncompressed 8 and 16 bit sound are the only types we support
@@ -97,6 +107,7 @@ extern "C"
MMRESULT WINAPI waveOutClose( HWAVEOUT hwo)
{
+ ll_winmm_shim_initialize();
wave_out_map_t::iterator found_it = sWaveOuts.find(hwo);
if (found_it != sWaveOuts.end())
{ // forget what we know about this handle
@@ -108,6 +119,7 @@ extern "C"
MMRESULT WINAPI waveOutWrite( HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh)
{
+ ll_winmm_shim_initialize();
MMRESULT result = MMSYSERR_NOERROR;
if (sMute)
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 679637caf6..2ed754d5e8 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -9,7 +9,7 @@ include(DBusGlib)
include(DirectX)
include(OpenSSL)
include(DragDrop)
-include(ELFIO)
+include(EXPAT)
include(FMOD)
include(OPENAL)
include(FindOpenGL)
@@ -17,6 +17,7 @@ include(JsonCpp)
include(LLAudio)
include(LLCharacter)
include(LLCommon)
+include(LLConvexDecomposition)
include(LLImage)
include(LLImageJ2COJ)
include(LLInventory)
@@ -40,16 +41,21 @@ include(UnixInstall)
include(LLKDU)
include(ViewerMiscLibs)
include(LLLogin)
+include(VisualLeakDetector)
+include(GLOD)
include(CMakeCopyIfDifferent)
include_directories(
${DBUSGLIB_INCLUDE_DIRS}
- ${ELFIO_INCLUDE_DIR}
- ${JSONCPP_INCLUDE_DIRS}
+ ${JSONCPP_INCLUDE_DIR}
+ ${GLOD_INCLUDE_DIR}
${LLAUDIO_INCLUDE_DIRS}
${LLCHARACTER_INCLUDE_DIRS}
${LLCOMMON_INCLUDE_DIRS}
+ ${LLCONVEXDECOMP_INCLUDE_DIRS}
+ ${FMOD_INCLUDE_DIR}
${LLIMAGE_INCLUDE_DIRS}
+ ${LLKDU_INCLUDE_DIRS}
${LLINVENTORY_INCLUDE_DIRS}
${LLMATH_INCLUDE_DIRS}
${LLMESSAGE_INCLUDE_DIRS}
@@ -65,9 +71,14 @@ include_directories(
${LSCRIPT_INCLUDE_DIRS}/lscript_compile
${LLLOGIN_INCLUDE_DIRS}
${UPDATER_INCLUDE_DIRS}
+ ${LIBS_PREBUILT_DIR}/include/collada
+ ${OPENAL_LIB_INCLUDE_DIRS}
+ ${LIBS_PREBUILT_DIR}/include/collada/1.4
)
set(viewer_SOURCE_FILES
+ groupchatlistener.cpp
+ llaccountingcostmanager.cpp
llagent.cpp
llagentaccess.cpp
llagentcamera.cpp
@@ -92,7 +103,6 @@ set(viewer_SOURCE_FILES
llavatarlist.cpp
llavatarlistitem.cpp
llavatarpropertiesprocessor.cpp
- llbottomtray.cpp
llbox.cpp
llbreadcrumbview.cpp
llbrowsernotification.cpp
@@ -108,9 +118,9 @@ set(viewer_SOURCE_FILES
llchatitemscontainerctrl.cpp
llchatmsgbox.cpp
llchiclet.cpp
+ llchicletbar.cpp
llclassifiedinfo.cpp
llclassifiedstatsresponder.cpp
- llcloud.cpp
llcofwearables.cpp
llcolorswatch.cpp
llcommanddispatcherlistener.cpp
@@ -121,6 +131,7 @@ set(viewer_SOURCE_FILES
llcurrencyuimanager.cpp
llcylinder.cpp
lldateutil.cpp
+ lldaycyclemanager.cpp
lldebugmessagebox.cpp
lldebugview.cpp
lldelayedgestureerror.cpp
@@ -141,6 +152,8 @@ set(viewer_SOURCE_FILES
lldriverparam.cpp
lldynamictexture.cpp
llemote.cpp
+ llenvmanager.cpp
+ llestateinfomodel.cpp
lleventnotifier.cpp
lleventpoll.cpp
llexpandabletextbox.cpp
@@ -154,8 +167,9 @@ set(viewer_SOURCE_FILES
llfirstuse.cpp
llflexibleobject.cpp
llfloaterabout.cpp
- llfloateranimpreview.cpp
+ llfloaterbvhpreview.cpp
llfloaterauction.cpp
+ llfloateravatar.cpp
llfloateravatarpicker.cpp
llfloateravatartextures.cpp
llfloaterbeacons.cpp
@@ -169,9 +183,13 @@ set(viewer_SOURCE_FILES
llfloaterbuyland.cpp
llfloatercamera.cpp
llfloatercolorpicker.cpp
- llfloaterdaycycle.cpp
+ llfloaterdeleteenvpreset.cpp
+ llfloaterdestinations.cpp
llfloaterdisplayname.cpp
- llfloaterenvsettings.cpp
+ llfloatereditdaycycle.cpp
+ llfloatereditsky.cpp
+ llfloatereditwater.cpp
+ llfloaterenvironmentsettings.cpp
llfloaterevent.cpp
llfloaterfonttest.cpp
llfloatergesture.cpp
@@ -190,15 +208,17 @@ set(viewer_SOURCE_FILES
llfloaterland.cpp
llfloaterlandholdings.cpp
llfloatermap.cpp
- llfloatermediabrowser.cpp
llfloatermediasettings.cpp
llfloatermemleak.cpp
+ llfloatermodelpreview.cpp
+ llfloatermodeluploadbase.cpp
llfloaternamedesc.cpp
llfloaternotificationsconsole.cpp
+ llfloaterobjectweights.cpp
llfloateropenobject.cpp
+ llfloateroutbox.cpp
llfloaterpay.cpp
llfloaterperms.cpp
- llfloaterpostcard.cpp
llfloaterpostprocess.cpp
llfloaterpreference.cpp
llfloaterproperties.cpp
@@ -210,26 +230,30 @@ set(viewer_SOURCE_FILES
llfloatersearch.cpp
llfloatersellland.cpp
llfloatersettingsdebug.cpp
- llfloatersidetraytab.cpp
+ llfloatersidepanelcontainer.cpp
llfloatersnapshot.cpp
+ llfloatersounddevices.cpp
llfloatertelehub.cpp
llfloatertestinspectors.cpp
llfloatertestlistview.cpp
llfloatertools.cpp
llfloatertopobjects.cpp
llfloatertos.cpp
+ llfloatertoybox.cpp
+ llfloatertranslationsettings.cpp
llfloateruipreview.cpp
llfloaterurlentry.cpp
llfloatervoiceeffect.cpp
- llfloaterwater.cpp
+ llfloaterwebcontent.cpp
+ llfloaterwebprofile.cpp
llfloaterwhitelistentry.cpp
- llfloaterwindlight.cpp
llfloaterwindowsize.cpp
llfloaterworldmap.cpp
llfolderview.cpp
llfolderviewitem.cpp
llfollowcam.cpp
llfriendcard.cpp
+ llgesturelistener.cpp
llgesturemgr.cpp
llgiveinventory.cpp
llglsandbox.cpp
@@ -244,6 +268,7 @@ set(viewer_SOURCE_FILES
llhudeffectlookat.cpp
llhudeffectpointat.cpp
llhudeffecttrail.cpp
+ llhudeffectblob.cpp
llhudicon.cpp
llhudmanager.cpp
llhudnametag.cpp
@@ -262,7 +287,6 @@ set(viewer_SOURCE_FILES
llinspectremoteobject.cpp
llinspecttoast.cpp
llinventorybridge.cpp
- llinventoryclipboard.cpp
llinventoryfilter.cpp
llinventoryfunctions.cpp
llinventoryicon.cpp
@@ -278,6 +302,7 @@ set(viewer_SOURCE_FILES
lllistbrowser.cpp
lllistcontextmenu.cpp
lllistview.cpp
+ lllocalbitmaps.cpp
lllocaltextureobject.cpp
lllocationhistory.cpp
lllocationinputctrl.cpp
@@ -290,10 +315,12 @@ set(viewer_SOURCE_FILES
llmaniprotate.cpp
llmanipscale.cpp
llmaniptranslate.cpp
+ llmarketplacefunctions.cpp
+ llmarketplacenotifications.cpp
llmediactrl.cpp
llmediadataclient.cpp
llmemoryview.cpp
- llmenucommands.cpp
+ llmeshrepository.cpp
llmimetypes.cpp
llmorphview.cpp
llmoveview.cpp
@@ -305,6 +332,7 @@ set(viewer_SOURCE_FILES
llnearbychat.cpp
llnearbychatbar.cpp
llnearbychathandler.cpp
+ llnearbychatbarlistener.cpp
llnetmap.cpp
llnotificationalerthandler.cpp
llnotificationgrouphandler.cpp
@@ -343,6 +371,9 @@ set(viewer_SOURCE_FILES
llpanellogin.cpp
llpanelloginlistener.cpp
llpanelmaininventory.cpp
+ llpanelmarketplaceinbox.cpp
+ llpanelmarketplaceinboxinventory.cpp
+ llpanelmarketplaceoutboxinventory.cpp
llpanelmediasettingsgeneral.cpp
llpanelmediasettingspermissions.cpp
llpanelmediasettingssecurity.cpp
@@ -364,7 +395,12 @@ set(viewer_SOURCE_FILES
llpanelplacestab.cpp
llpanelprimmediacontrols.cpp
llpanelprofile.cpp
- llpanelprofileview.cpp
+ llpanelsnapshot.cpp
+ llpanelsnapshotinventory.cpp
+ llpanelsnapshotlocal.cpp
+ llpanelsnapshotoptions.cpp
+ llpanelsnapshotpostcard.cpp
+ llpanelsnapshotprofile.cpp
llpanelteleporthistory.cpp
llpaneltiptoast.cpp
llpanelvoiceeffect.cpp
@@ -376,11 +412,14 @@ set(viewer_SOURCE_FILES
llparcelselection.cpp
llparticipantlist.cpp
llpatchvertexarray.cpp
+ llphysicsmotion.cpp
+ llphysicsshapebuilderutil.cpp
llplacesinventorybridge.cpp
llplacesinventorypanel.cpp
llpopupview.cpp
llpolymesh.cpp
llpolymorph.cpp
+ llpostcard.cpp
llpreview.cpp
llpreviewanim.cpp
llpreviewgesture.cpp
@@ -391,29 +430,31 @@ set(viewer_SOURCE_FILES
llproductinforequest.cpp
llprogressview.cpp
llrecentpeople.cpp
+ llregioninfomodel.cpp
llregionposition.cpp
llremoteparcelrequest.cpp
llsavedsettingsglue.cpp
llsaveoutfitcombobtn.cpp
+ llsceneview.cpp
llscreenchannel.cpp
llscriptfloater.cpp
llscrollingpanelparam.cpp
+ llscrollingpanelparambase.cpp
llsearchcombobox.cpp
llsearchhistory.cpp
llsecapi.cpp
llsechandler_basic.cpp
llselectmgr.cpp
+ llshareavatarhandler.cpp
llsidepanelappearance.cpp
llsidepanelinventory.cpp
llsidepanelinventorysubpanel.cpp
llsidepaneliteminfo.cpp
llsidepaneltaskinfo.cpp
- llsidetray.cpp
llsidetraypanelcontainer.cpp
llsky.cpp
llslurl.cpp
llspatialpartition.cpp
- llspeakbutton.cpp
llspeakers.cpp
llspeakingindicatormanager.cpp
llsplitbutton.cpp
@@ -449,6 +490,7 @@ set(viewer_SOURCE_FILES
lltoastpanel.cpp
lltoastscripttextbox.cpp
lltool.cpp
+ lltoolbarview.cpp
lltoolbrush.cpp
lltoolcomp.cpp
lltooldraganddrop.cpp
@@ -472,6 +514,7 @@ set(viewer_SOURCE_FILES
lltranslate.cpp
lluilistener.cpp
lluploaddialog.cpp
+ lluploadfloaterobservers.cpp
llurl.cpp
llurldispatcher.cpp
llurldispatcherlistener.cpp
@@ -481,6 +524,7 @@ set(viewer_SOURCE_FILES
llvectorperfoptions.cpp
llversioninfo.cpp
llviewchildren.cpp
+ llviewerassetstats.cpp
llviewerassetstorage.cpp
llviewerassettype.cpp
llviewerattachmenu.cpp
@@ -494,7 +538,7 @@ set(viewer_SOURCE_FILES
llviewerfloaterreg.cpp
llviewerfoldertype.cpp
llviewergenericmessage.cpp
- llviewergesture.cpp
+ llviewergesture.cpp
llviewerhelp.cpp
llviewerhelputil.cpp
llviewerhome.cpp
@@ -502,9 +546,6 @@ set(viewer_SOURCE_FILES
llviewerjoint.cpp
llviewerjointattachment.cpp
llviewerjointmesh.cpp
- llviewerjointmesh_sse.cpp
- llviewerjointmesh_sse2.cpp
- llviewerjointmesh_vec.cpp
llviewerjoystick.cpp
llviewerkeyboard.cpp
llviewerlayer.cpp
@@ -526,6 +567,7 @@ set(viewer_SOURCE_FILES
llviewerregion.cpp
llviewershadermgr.cpp
llviewerstats.cpp
+ llviewerstatsrecorder.cpp
llviewertexteditor.cpp
llviewertexture.cpp
llviewertextureanim.cpp
@@ -540,9 +582,9 @@ set(viewer_SOURCE_FILES
llvoavatardefines.cpp
llvoavatarself.cpp
llvocache.cpp
- llvoclouds.cpp
llvograss.cpp
llvoground.cpp
+ llvoicecallhandler.cpp
llvoicechannel.cpp
llvoiceclient.cpp
llvoicevisualizer.cpp
@@ -551,7 +593,6 @@ set(viewer_SOURCE_FILES
llvopartgroup.cpp
llvosky.cpp
llvosurfacepatch.cpp
- llvotextbubble.cpp
llvotree.cpp
llvovolume.cpp
llvowater.cpp
@@ -564,10 +605,13 @@ set(viewer_SOURCE_FILES
llwearablelist.cpp
llwearabletype.cpp
llweb.cpp
+ llwebprofile.cpp
llwebsharing.cpp
llwind.cpp
+ llwindowlistener.cpp
llwlanimator.cpp
llwldaycycle.cpp
+ llwlhandlers.cpp
llwlparammanager.cpp
llwlparamset.cpp
llworld.cpp
@@ -584,23 +628,11 @@ set(viewer_SOURCE_FILES
set(VIEWER_BINARY_NAME "secondlife-bin" CACHE STRING
"The name of the viewer executable to create.")
-if (LINUX)
- # We can't set these flags for Darwin, because they get passed to
- # the PPC compiler. Ugh.
-
- set_source_files_properties(
- llviewerjointmesh_sse.cpp
- PROPERTIES COMPILE_FLAGS "-msse -mfpmath=sse"
- )
- set_source_files_properties(
- llviewerjointmesh_sse2.cpp
- PROPERTIES COMPILE_FLAGS "-msse2 -mfpmath=sse"
- )
-endif (LINUX)
-
set(viewer_HEADER_FILES
CMakeLists.txt
ViewerInstall.cmake
+ groupchatlistener.h
+ llaccountingcostmanager.h
llagent.h
llagentaccess.h
llagentcamera.h
@@ -626,7 +658,6 @@ set(viewer_HEADER_FILES
llavatarlist.h
llavatarlistitem.h
llavatarpropertiesprocessor.h
- llbottomtray.h
llbox.h
llbreadcrumbview.h
llbuycurrencyhtml.h
@@ -642,9 +673,9 @@ set(viewer_HEADER_FILES
llchatitemscontainerctrl.h
llchatmsgbox.h
llchiclet.h
+ llchicletbar.h
llclassifiedinfo.h
llclassifiedstatsresponder.h
- llcloud.h
llcofwearables.h
llcolorswatch.h
llcommanddispatcherlistener.h
@@ -655,6 +686,7 @@ set(viewer_HEADER_FILES
llcurrencyuimanager.h
llcylinder.h
lldateutil.h
+ lldaycyclemanager.h
lldebugmessagebox.h
lldebugview.h
lldelayedgestureerror.h
@@ -665,7 +697,6 @@ set(viewer_HEADER_FILES
lldrawpoolalpha.h
lldrawpoolavatar.h
lldrawpoolbump.h
- lldrawpoolclouds.h
lldrawpoolground.h
lldrawpoolsimple.h
lldrawpoolsky.h
@@ -676,6 +707,8 @@ set(viewer_HEADER_FILES
lldriverparam.h
lldynamictexture.h
llemote.h
+ llenvmanager.h
+ llestateinfomodel.h
lleventnotifier.h
lleventpoll.h
llexpandabletextbox.h
@@ -689,8 +722,9 @@ set(viewer_HEADER_FILES
llfirstuse.h
llflexibleobject.h
llfloaterabout.h
- llfloateranimpreview.h
+ llfloaterbvhpreview.h
llfloaterauction.h
+ llfloateravatar.h
llfloateravatarpicker.h
llfloateravatartextures.h
llfloaterbeacons.h
@@ -704,9 +738,13 @@ set(viewer_HEADER_FILES
llfloaterbuyland.h
llfloatercamera.h
llfloatercolorpicker.h
- llfloaterdaycycle.h
+ llfloaterdeleteenvpreset.h
+ llfloaterdestinations.h
llfloaterdisplayname.h
- llfloaterenvsettings.h
+ llfloatereditdaycycle.h
+ llfloatereditsky.h
+ llfloatereditwater.h
+ llfloaterenvironmentsettings.h
llfloaterevent.h
llfloaterfonttest.h
llfloatergesture.h
@@ -725,15 +763,17 @@ set(viewer_HEADER_FILES
llfloaterland.h
llfloaterlandholdings.h
llfloatermap.h
- llfloatermediabrowser.h
llfloatermediasettings.h
llfloatermemleak.h
+ llfloatermodelpreview.h
+ llfloatermodeluploadbase.h
llfloaternamedesc.h
llfloaternotificationsconsole.h
+ llfloaterobjectweights.h
llfloateropenobject.h
+ llfloateroutbox.h
llfloaterpay.h
llfloaterperms.h
- llfloaterpostcard.h
llfloaterpostprocess.h
llfloaterpreference.h
llfloaterproperties.h
@@ -745,20 +785,23 @@ set(viewer_HEADER_FILES
llfloatersearch.h
llfloatersellland.h
llfloatersettingsdebug.h
- llfloatersidetraytab.h
+ llfloatersidepanelcontainer.h
llfloatersnapshot.h
+ llfloatersounddevices.h
llfloatertelehub.h
llfloatertestinspectors.h
llfloatertestlistview.h
llfloatertools.h
llfloatertopobjects.h
llfloatertos.h
+ llfloatertoybox.h
+ llfloatertranslationsettings.h
llfloateruipreview.h
llfloaterurlentry.h
llfloatervoiceeffect.h
- llfloaterwater.h
+ llfloaterwebcontent.h
+ llfloaterwebprofile.h
llfloaterwhitelistentry.h
- llfloaterwindlight.h
llfloaterwindowsize.h
llfloaterworldmap.h
llfolderview.h
@@ -766,6 +809,7 @@ set(viewer_HEADER_FILES
llfolderviewitem.h
llfollowcam.h
llfriendcard.h
+ llgesturelistener.h
llgesturemgr.h
llgiveinventory.h
llgroupactions.h
@@ -779,6 +823,7 @@ set(viewer_HEADER_FILES
llhudeffectlookat.h
llhudeffectpointat.h
llhudeffecttrail.h
+ llhudeffectblob.h
llhudicon.h
llhudmanager.h
llhudnametag.h
@@ -796,7 +841,6 @@ set(viewer_HEADER_FILES
llinspectremoteobject.h
llinspecttoast.h
llinventorybridge.h
- llinventoryclipboard.h
llinventoryfilter.h
llinventoryfunctions.h
llinventoryicon.h
@@ -813,6 +857,7 @@ set(viewer_HEADER_FILES
lllistbrowser.h
lllistcontextmenu.h
lllistview.h
+ lllocalbitmaps.h
lllocaltextureobject.h
lllocationhistory.h
lllocationinputctrl.h
@@ -825,10 +870,12 @@ set(viewer_HEADER_FILES
llmaniprotate.h
llmanipscale.h
llmaniptranslate.h
+ llmarketplacefunctions.h
+ llmarketplacenotifications.h
llmediactrl.h
llmediadataclient.h
llmemoryview.h
- llmenucommands.h
+ llmeshrepository.h
llmimetypes.h
llmorphview.h
llmoveview.h
@@ -840,6 +887,7 @@ set(viewer_HEADER_FILES
llnearbychat.h
llnearbychatbar.h
llnearbychathandler.h
+ llnearbychatbarlistener.h
llnetmap.h
llnotificationhandler.h
llnotificationmanager.h
@@ -872,6 +920,9 @@ set(viewer_HEADER_FILES
llpanellogin.h
llpanelloginlistener.h
llpanelmaininventory.h
+ llpanelmarketplaceinbox.h
+ llpanelmarketplaceinboxinventory.h
+ llpanelmarketplaceoutboxinventory.h
llpanelmediasettingsgeneral.h
llpanelmediasettingspermissions.h
llpanelmediasettingssecurity.h
@@ -893,7 +944,7 @@ set(viewer_HEADER_FILES
llpanelplacestab.h
llpanelprimmediacontrols.h
llpanelprofile.h
- llpanelprofileview.h
+ llpanelsnapshot.h
llpanelteleporthistory.h
llpaneltiptoast.h
llpanelvoicedevicesettings.h
@@ -905,11 +956,14 @@ set(viewer_HEADER_FILES
llparcelselection.h
llparticipantlist.h
llpatchvertexarray.h
+ llphysicsmotion.h
+ llphysicsshapebuilderutil.h
llplacesinventorybridge.h
llplacesinventorypanel.h
llpolymesh.h
llpolymorph.h
llpopupview.h
+ llpostcard.h
llpreview.h
llpreviewanim.h
llpreviewgesture.h
@@ -920,15 +974,18 @@ set(viewer_HEADER_FILES
llproductinforequest.h
llprogressview.h
llrecentpeople.h
+ llregioninfomodel.h
llregionposition.h
llremoteparcelrequest.h
llresourcedata.h
llrootview.h
llsavedsettingsglue.h
llsaveoutfitcombobtn.h
+ llsceneview.h
llscreenchannel.h
llscriptfloater.h
llscrollingpanelparam.h
+ llscrollingpanelparambase.h
llsearchcombobox.h
llsearchhistory.h
llsecapi.h
@@ -939,12 +996,10 @@ set(viewer_HEADER_FILES
llsidepanelinventorysubpanel.h
llsidepaneliteminfo.h
llsidepaneltaskinfo.h
- llsidetray.h
llsidetraypanelcontainer.h
llsky.h
llslurl.h
llspatialpartition.h
- llspeakbutton.h
llspeakers.h
llspeakingindicatormanager.h
llsplitbutton.h
@@ -956,7 +1011,7 @@ set(viewer_HEADER_FILES
llsurface.h
llsurfacepatch.h
llsyswellitem.h
- llsyswellwindow.h
+ llsyswellwindow.h
lltable.h
llteleporthistory.h
llteleporthistorystorage.h
@@ -981,6 +1036,7 @@ set(viewer_HEADER_FILES
lltoastpanel.h
lltoastscripttextbox.h
lltool.h
+ lltoolbarview.h
lltoolbrush.h
lltoolcomp.h
lltooldraganddrop.h
@@ -1005,6 +1061,7 @@ set(viewer_HEADER_FILES
lluiconstants.h
lluilistener.h
lluploaddialog.h
+ lluploadfloaterobservers.h
llurl.h
llurldispatcher.h
llurldispatcherlistener.h
@@ -1014,6 +1071,7 @@ set(viewer_HEADER_FILES
llvectorperfoptions.h
llversioninfo.h
llviewchildren.h
+ llviewerassetstats.h
llviewerassetstorage.h
llviewerassettype.h
llviewerattachmenu.h
@@ -1027,7 +1085,7 @@ set(viewer_HEADER_FILES
llviewerfloaterreg.h
llviewerfoldertype.h
llviewergenericmessage.h
- llviewergesture.h
+ llviewergesture.h
llviewerhelp.h
llviewerhome.h
llviewerinventory.h
@@ -1056,6 +1114,7 @@ set(viewer_HEADER_FILES
llviewerregion.h
llviewershadermgr.h
llviewerstats.h
+ llviewerstatsrecorder.h
llviewertexteditor.h
llviewertexture.h
llviewertextureanim.h
@@ -1070,7 +1129,6 @@ set(viewer_HEADER_FILES
llvoavatardefines.h
llvoavatarself.h
llvocache.h
- llvoclouds.h
llvograss.h
llvoground.h
llvoicechannel.h
@@ -1081,7 +1139,6 @@ set(viewer_HEADER_FILES
llvopartgroup.h
llvosky.h
llvosurfacepatch.h
- llvotextbubble.h
llvotree.h
llvotreenew.h
llvovolume.h
@@ -1095,10 +1152,13 @@ set(viewer_HEADER_FILES
llwearablelist.h
llwearabletype.h
llweb.h
+ llwebprofile.h
llwebsharing.h
llwind.h
+ llwindowlistener.h
llwlanimator.h
llwldaycycle.h
+ llwlhandlers.h
llwlparammanager.h
llwlparamset.h
llworld.h
@@ -1181,7 +1241,7 @@ if (WINDOWS)
# precompiled header configuration
# llviewerprecompiledheaders.cpp generates
# the .pch file.
- # All sources added to viewer_SOURCE_FILES
+ # All sources added to viewer_SOURCE_FILES
# at this point use it.
if(USE_PRECOMPILED_HEADERS)
set_source_files_properties(llviewerprecompiledheaders.cpp
@@ -1190,7 +1250,37 @@ if (WINDOWS)
)
set(viewer_SOURCE_FILES "${viewer_SOURCE_FILES}" llviewerprecompiledheaders.cpp)
endif(USE_PRECOMPILED_HEADERS)
-
+
+ # Replace the icons with the appropriate ones for the channel
+ # ('test' is the default)
+ set(ICON_PATH "test")
+ string(TOLOWER ${VIEWER_CHANNEL} channel_lower)
+ if(channel_lower MATCHES "^second life release")
+ set(ICON_PATH "release")
+ elseif(channel_lower MATCHES "^second life beta viewer")
+ set(ICON_PATH "beta")
+ elseif(channel_lower MATCHES "^second life development")
+ set(ICON_PATH "development")
+ elseif(channel_lower MATCHES "project")
+ set(ICON_PATH "project")
+ endif()
+ message("Copying icons for ${ICON_PATH}")
+ execute_process(
+ COMMAND ${CMAKE_COMMAND} -E copy_if_different
+ "${CMAKE_CURRENT_SOURCE_DIR}/icons/${ICON_PATH}/secondlife.ico"
+ "${CMAKE_CURRENT_SOURCE_DIR}/res/ll_icon.ico"
+ )
+ execute_process(
+ COMMAND ${CMAKE_COMMAND} -E copy_if_different
+ "${CMAKE_CURRENT_SOURCE_DIR}/icons/${ICON_PATH}/secondlife_256.BMP"
+ "${CMAKE_CURRENT_SOURCE_DIR}/res/ll_icon.BMP"
+ )
+ execute_process(
+ COMMAND ${CMAKE_COMMAND} -E copy_if_different
+ "${CMAKE_CURRENT_SOURCE_DIR}/icons/${ICON_PATH}/secondlife_256.BMP"
+ "${CMAKE_CURRENT_SOURCE_DIR}/res-sdl/ll_icon.BMP"
+ )
+
# Add resource files to the project.
# viewerRes.rc is the only buildable file, but
# the rest are all dependencies of it.
@@ -1220,6 +1310,7 @@ if (WINDOWS)
res/lltooltranslate.cur
res/lltoolzoomin.cur
res/lltoolzoomout.cur
+ res-sdl/ll_icon.BMP
res/ll_icon.BMP
res/ll_icon.ico
res/resource.h
@@ -1235,8 +1326,8 @@ if (WINDOWS)
set_source_files_properties(${viewer_RESOURCE_FILES}
PROPERTIES HEADER_FILE_ONLY TRUE)
- set(viewer_RESOURCE_FILES
- res/viewerRes.rc
+ set(viewer_RESOURCE_FILES
+ res/viewerRes.rc
${viewer_RESOURCE_FILES}
)
@@ -1244,7 +1335,7 @@ if (WINDOWS)
if (NOT STANDALONE)
list(APPEND viewer_SOURCE_FILES ${viewer_RESOURCE_FILES})
- endif (NOT STANDALONE)
+ endif (NOT STANDALONE)
find_library(DINPUT_LIBRARY dinput8 ${DIRECTX_LIBRARY_DIR})
find_library(DXGUID_LIBRARY dxguid ${DIRECTX_LIBRARY_DIR})
@@ -1253,7 +1344,9 @@ if (WINDOWS)
DXGUID_LIBRARY
)
+# see EXP-1765 - theory is opengl32.lib needs to be included before gdi32.lib (windows libs)
set(viewer_LIBRARIES
+ opengl32
${WINDOWS_LIBRARIES}
comdlg32
${DINPUT_LIBRARY}
@@ -1263,7 +1356,6 @@ if (WINDOWS)
odbccp32
ole32
oleaut32
- opengl32
shell32
Vfw32
winspool
@@ -1280,8 +1372,6 @@ if (WINDOWS)
if (INTEL_MEMOPS_LIBRARY)
list(APPEND viewer_LIBRARIES ${INTEL_MEMOPS_LIBRARY})
endif (INTEL_MEMOPS_LIBRARY)
-
- use_prebuilt_binary(dbghelp)
endif (WINDOWS)
# Add the xui files. This is handy for searching for xui elements
@@ -1289,22 +1379,15 @@ endif (WINDOWS)
set(viewer_XUI_FILES
skins/default/colors.xml
skins/default/textures/textures.xml
-
-
-
)
file(GLOB DEFAULT_XUI_FILE_GLOB_LIST
- ${CMAKE_CURRENT_SOURCE_DIR}/skins/default/xui/en/*.xml)
+ ${CMAKE_CURRENT_SOURCE_DIR}/skins/*/xui/en/*.xml)
list(APPEND viewer_XUI_FILES ${DEFAULT_XUI_FILE_GLOB_LIST})
file(GLOB DEFAULT_WIDGET_FILE_GLOB_LIST
- ${CMAKE_CURRENT_SOURCE_DIR}/skins/default/xui/en/widgets/*.xml)
+ ${CMAKE_CURRENT_SOURCE_DIR}/skins/*/xui/en/widgets/*.xml)
list(APPEND viewer_XUI_FILES ${DEFAULT_WIDGET_FILE_GLOB_LIST})
-file(GLOB SILVER_XUI_FILE_GLOB_LIST
- ${CMAKE_CURRENT_SOURCE_DIR}/skins/silver/xui/en-us/*.xml)
-list(APPEND viewer_XUI_FILES ${SILVER_XUI_FILE_GLOB_LIST})
-
# Cannot append empty lists in CMake, wait until we have files here.
#file(GLOB SILVER_WIDGET_FILE_GLOB_LIST
# ${CMAKE_CURRENT_SOURCE_DIR}/skins/silver/xui/en-us/widgets/*.xml)
@@ -1322,10 +1405,11 @@ list(APPEND viewer_SOURCE_FILES ${viewer_XUI_FILES})
set(viewer_APPSETTINGS_FILES
app_settings/anim.ini
app_settings/cmd_line.xml
+ app_settings/commands.xml
app_settings/grass.xml
app_settings/high_graphics.xml
app_settings/ignorable_dialogs.xml
- app_settings/keys.ini
+ app_settings/keys.xml
app_settings/keywords.ini
app_settings/logcontrol.xml
app_settings/low_graphics.xml
@@ -1335,6 +1419,7 @@ set(viewer_APPSETTINGS_FILES
app_settings/settings_files.xml
app_settings/settings_per_account.xml
app_settings/std_bump.ini
+ app_settings/toolbars.xml
app_settings/trees.xml
app_settings/ultra_graphics.xml
app_settings/viewerart.xml
@@ -1424,19 +1509,13 @@ set(PACKAGE ON CACHE BOOL
"Add a package target that builds an installer package.")
if (WINDOWS)
- if(MSVC71)
- set(release_flags "/MAP:Release/${VIEWER_BINARY_NAME}.map /MAPINFO:LINES")
- else(MSVC71)
- set(release_flags "/MAP:Release/${VIEWER_BINARY_NAME}.map")
- endif(MSVC71)
-
set_target_properties(${VIEWER_BINARY_NAME}
PROPERTIES
# *TODO -reenable this once we get server usage sorted out
#LINK_FLAGS "/debug /NODEFAULTLIB:LIBCMT /SUBSYSTEM:WINDOWS /INCLUDE:\"__tcmalloc\""
- LINK_FLAGS "/debug /NODEFAULTLIB:LIBCMT /SUBSYSTEM:WINDOWS"
+ LINK_FLAGS "/debug /NODEFAULTLIB:LIBCMT /SUBSYSTEM:WINDOWS /INCLUDE:__tcmalloc"
LINK_FLAGS_DEBUG "/NODEFAULTLIB:\"LIBCMT;LIBCMTD;MSVCRT\" /INCREMENTAL:NO"
- LINK_FLAGS_RELEASE ${release_flags}
+ LINK_FLAGS_RELEASE ""
)
if(USE_PRECOMPILED_HEADERS)
set_target_properties(
@@ -1453,11 +1532,6 @@ if (WINDOWS)
# In the meantime, if you have any ideas on how to easily maintain one list, either here or in viewer_manifest.py
# and have the build deps get tracked *please* tell me about it.
- if(LLKDU_LIBRARY)
- # Configure a var for llkdu which may not exist for all builds.
- set(LLKDU_DLL_SOURCE ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/llkdu.dll)
- endif(LLKDU_LIBRARY)
-
if(USE_GOOGLE_PERFTOOLS)
# Configure a var for tcmalloc location, if used.
# Note the need to specify multiple names explicitly.
@@ -1467,33 +1541,35 @@ if (WINDOWS)
${SHARED_LIB_STAGING_DIR}/Debug/libtcmalloc_minimal-debug.dll
)
endif(USE_GOOGLE_PERFTOOLS)
-
+
set(COPY_INPUT_DEPENDENCIES
# The following commented dependencies are determined at variably at build time. Can't do this here.
#${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/libtcmalloc_minimal.dll => None ... Skipping libtcmalloc_minimal.dll
${CMAKE_SOURCE_DIR}/../etc/message.xml
${CMAKE_SOURCE_DIR}/../scripts/messages/message_template.msg
- ${LLKDU_DLL_SOURCE}
${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/llcommon.dll
${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/libapr-1.dll
${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/libaprutil-1.dll
${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/libapriconv-1.dll
+ ${SHARED_LIB_STAGING_DIR}/Release/glod.dll
+ ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/glod.dll
+ ${SHARED_LIB_STAGING_DIR}/Debug/glod.dll
+ ${SHARED_LIB_STAGING_DIR}/Release/libcollada14dom22.dll
+ ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/libcollada14dom22.dll
+ ${SHARED_LIB_STAGING_DIR}/Debug/libcollada14dom22-d.dll
${SHARED_LIB_STAGING_DIR}/Release/openjpeg.dll
${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/openjpeg.dll
${SHARED_LIB_STAGING_DIR}/Debug/openjpegd.dll
${SHARED_LIB_STAGING_DIR}/Release/fmod.dll
${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/fmod.dll
${SHARED_LIB_STAGING_DIR}/Debug/fmod.dll
- ${SHARED_LIB_STAGING_DIR}/Release/msvcr80.dll
- ${SHARED_LIB_STAGING_DIR}/Release/msvcp80.dll
- ${SHARED_LIB_STAGING_DIR}/Release/Microsoft.VC80.CRT.manifest
- ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/msvcr80.dll
- ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/msvcp80.dll
- ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/Microsoft.VC80.CRT.manifest
- ${SHARED_LIB_STAGING_DIR}/Debug/msvcr80d.dll
- ${SHARED_LIB_STAGING_DIR}/Debug/msvcp80d.dll
- ${SHARED_LIB_STAGING_DIR}/Debug/Microsoft.VC80.DebugCRT.manifest
+ ${SHARED_LIB_STAGING_DIR}/Release/msvcr100.dll
+ ${SHARED_LIB_STAGING_DIR}/Release/msvcp100.dll
+ ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/msvcr100.dll
+ ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/msvcp100.dll
+ ${SHARED_LIB_STAGING_DIR}/Debug/msvcr100d.dll
+ ${SHARED_LIB_STAGING_DIR}/Debug/msvcp100d.dll
${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/SLVoice.exe
${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/vivoxsdk.dll
${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/ortp.dll
@@ -1505,7 +1581,6 @@ if (WINDOWS)
${CMAKE_CURRENT_SOURCE_DIR}/licenses-win32.txt
${CMAKE_CURRENT_SOURCE_DIR}/featuretable.txt
${CMAKE_CURRENT_SOURCE_DIR}/featuretable_xp.txt
- ${CMAKE_CURRENT_SOURCE_DIR}/dbghelp.dll
${ARCH_PREBUILT_DIRS_RELEASE}/libeay32.dll
${ARCH_PREBUILT_DIRS_RELEASE}/qtcore4.dll
${ARCH_PREBUILT_DIRS_RELEASE}/qtgui4.dll
@@ -1564,24 +1639,24 @@ if (WINDOWS)
--grid=${GRID}
--source=${CMAKE_CURRENT_SOURCE_DIR}
--touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/copy_touched.bat
- DEPENDS
+ DEPENDS
${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
stage_third_party_libs
${COPY_INPUT_DEPENDENCIES}
COMMENT "Performing viewer_manifest copy"
)
-
- add_custom_target(copy_w_viewer_manifest ALL DEPENDS ${CMAKE_CFG_INTDIR}/copy_touched.bat)
+
+ add_custom_target(copy_w_viewer_manifest ALL DEPENDS ${CMAKE_CFG_INTDIR}/copy_touched.bat)
add_dependencies(${VIEWER_BINARY_NAME} stage_third_party_libs llcommon copy_w_viewer_manifest)
-
+
if (EXISTS ${CMAKE_SOURCE_DIR}/copy_win_scripts)
add_dependencies(${VIEWER_BINARY_NAME} copy_win_scripts)
endif (EXISTS ${CMAKE_SOURCE_DIR}/copy_win_scripts)
-
- add_dependencies(${VIEWER_BINARY_NAME}
- SLPlugin
- windows-updater
+
+ add_dependencies(${VIEWER_BINARY_NAME}
+ SLPlugin
+ windows-updater
windows-crash-logger
)
@@ -1591,7 +1666,7 @@ if (WINDOWS)
TARGET ${VIEWER_BINARY_NAME} POST_BUILD
COMMAND ${CMAKE_SOURCE_DIR}/tools/vstool/vstool.exe
ARGS
- --solution
+ --solution
${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}.sln
--workingdir
${VIEWER_BINARY_NAME}
@@ -1609,12 +1684,12 @@ if (WINDOWS)
${CMAKE_CURRENT_SOURCE_DIR}/..
${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_CFG_INTDIR}
- DEPENDS
- lleventhost
+ DEPENDS
+ lleventhost
${EVENT_HOST_SCRIPTS}
${CMAKE_CURRENT_SOURCE_DIR}/event_host_manifest.py
)
-
+
add_custom_command(
OUTPUT ${CMAKE_CFG_INTDIR}/touched.bat
COMMAND ${PYTHON_EXECUTABLE}
@@ -1630,22 +1705,20 @@ if (WINDOWS)
--login_channel=${VIEWER_LOGIN_CHANNEL}
--source=${CMAKE_CURRENT_SOURCE_DIR}
--touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/touched.bat
- DEPENDS
- ${VIEWER_BINARY_NAME}
+ DEPENDS
+ ${VIEWER_BINARY_NAME}
${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
${COPY_INPUT_DEPENDENCIES}
)
- add_custom_target(package ALL DEPENDS
+ add_custom_target(package ALL DEPENDS
${CMAKE_CFG_INTDIR}/touched.bat
- windows-setup-build-all
+ windows-setup-build-all
)
# temporarily disable packaging of event_host until hg subrepos get
# sorted out on the parabuild cluster...
#${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/event_host.tar.bz2)
- check_message_template(package)
-
endif (PACKAGE)
endif (WINDOWS)
@@ -1657,10 +1730,10 @@ endif (WINDOWS)
# that they depend upon. -brad
target_link_libraries(${VIEWER_BINARY_NAME}
${UPDATER_LIBRARIES}
+ ${GOOGLE_PERFTOOLS_LIBRARIES}
${LLAUDIO_LIBRARIES}
${LLCHARACTER_LIBRARIES}
${LLIMAGE_LIBRARIES}
- ${LLIMAGEJ2COJ_LIBRARIES}
${LLINVENTORY_LIBRARIES}
${LLMESSAGE_LIBRARIES}
${LLPLUGIN_LIBRARIES}
@@ -1682,20 +1755,33 @@ target_link_libraries(${VIEWER_BINARY_NAME}
${DBUSGLIB_LIBRARIES}
${OPENGL_LIBRARIES}
${FMODWRAPPER_LIBRARY} # must come after LLAudio
+ ${GLOD_LIBRARIES}
${OPENGL_LIBRARIES}
${JSONCPP_LIBRARIES}
${SDL_LIBRARY}
${SMARTHEAP_LIBRARY}
${UI_LIBRARIES}
${WINDOWS_LIBRARIES}
+ ${EXPAT_LIBRARIES}
${XMLRPCEPI_LIBRARIES}
- ${ELFIO_LIBRARIES}
${OPENSSL_LIBRARIES}
${CRYPTO_LIBRARIES}
${LLLOGIN_LIBRARIES}
- ${GOOGLE_PERFTOOLS_LIBRARIES}
+ ${LLCONVEXDECOMP_LIBRARY}
+ ${TCMALLOC_LIBRARIES}
)
+if (USE_KDU)
+ target_link_libraries(${VIEWER_BINARY_NAME}
+ ${LLKDU_LIBRARIES}
+ ${KDU_LIBRARY}
+ )
+else (USE_KDU)
+ target_link_libraries(${VIEWER_BINARY_NAME}
+ ${LLIMAGEJ2COJ_LIBRARIES}
+ )
+endif (USE_KDU)
+
build_version(viewer)
set(ARTWORK_DIR ${CMAKE_CURRENT_SOURCE_DIR} CACHE PATH
@@ -1705,6 +1791,17 @@ set(ARTWORK_DIR ${CMAKE_CURRENT_SOURCE_DIR} CACHE PATH
if (LINUX)
set(product SecondLife-${ARCH}-${viewer_VERSION})
+ # These are the generated targets that are copied to package/
+ set(COPY_INPUT_DEPENDENCIES
+ ${VIEWER_BINARY_NAME}
+ linux-crash-logger
+ linux-updater
+ SLPlugin
+ media_plugin_webkit
+ media_plugin_gstreamer010
+ llcommon
+ )
+
add_custom_command(
OUTPUT ${product}.tar.bz2
COMMAND ${PYTHON_EXECUTABLE}
@@ -1722,18 +1819,13 @@ if (LINUX)
--login_channel=${VIEWER_LOGIN_CHANNEL}
--source=${CMAKE_CURRENT_SOURCE_DIR}
--touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.touched
- DEPENDS ${VIEWER_BINARY_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
+ DEPENDS
+ ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
+ ${COPY_INPUT_DEPENDENCIES}
)
- add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_gstreamer010 media_plugin_webkit)
-
if (PACKAGE)
- add_custom_target(package ALL DEPENDS ${product}.tar.bz2)
- add_dependencies(package linux-crash-logger-target)
- add_dependencies(package linux-updater-target)
- check_message_template(package)
endif (PACKAGE)
-
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.copy_touched
COMMAND ${PYTHON_EXECUTABLE}
@@ -1748,14 +1840,20 @@ if (LINUX)
--dest=${CMAKE_CURRENT_BINARY_DIR}/packaged
--grid=${GRID}
--source=${CMAKE_CURRENT_SOURCE_DIR}
- DEPENDS
+ DEPENDS
${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
${COPY_INPUT_DEPENDENCIES}
COMMENT "Performing viewer_manifest copy"
)
-
- add_custom_target(copy_l_viewer_manifest ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.copy_touched)
- add_dependencies(copy_l_viewer_manifest "${VIEWER_BINARY_NAME}" linux-crash-logger-target linux-updater-target)
+
+ add_custom_target(copy_l_viewer_manifest ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.copy_touched)
+
+ if (PACKAGE)
+ add_custom_target(package ALL DEPENDS ${product}.tar.bz2)
+ # Make sure we don't run two instances of viewer_manifest.py at the same time.
+ add_dependencies(package copy_l_viewer_manifest)
+ check_message_template(package)
+ endif (PACKAGE)
endif (LINUX)
if (DARWIN)
@@ -1793,8 +1891,7 @@ if (DARWIN)
add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_quicktime media_plugin_webkit mac-updater mac-crash-logger)
if (PACKAGE)
- add_custom_target(package ALL DEPENDS ${VIEWER_BINARY_NAME})
- check_message_template(package)
+ add_custom_target(package ALL DEPENDS ${VIEWER_BINARY_NAME})
add_custom_command(
TARGET package POST_BUILD
@@ -1825,7 +1922,9 @@ if (PACKAGE)
if (WINDOWS)
set(VIEWER_DIST_DIR "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}")
set(VIEWER_SYMBOL_FILE "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/secondlife-symbols-windows.tar.bz2")
- set(VIEWER_EXE_GLOBS "${VIEWER_BINARY_NAME}${CMAKE_EXECUTABLE_SUFFIX} slplugin.exe")
+ # slplugin.exe failing symbols dump - need to debug, might have to do with updated version of google breakpad
+ # set(VIEWER_EXE_GLOBS "${VIEWER_BINARY_NAME}${CMAKE_EXECUTABLE_SUFFIX} slplugin.exe")
+ set(VIEWER_EXE_GLOBS "${VIEWER_BINARY_NAME}${CMAKE_EXECUTABLE_SUFFIX}")
set(VIEWER_LIB_GLOB "*${CMAKE_SHARED_MODULE_SUFFIX}")
set(VIEWER_COPY_MANIFEST copy_w_viewer_manifest)
endif (WINDOWS)
@@ -1843,6 +1942,7 @@ if (PACKAGE)
set(VIEWER_COPY_MANIFEST copy_l_viewer_manifest)
endif (LINUX)
+ if(RELEASE_CRASH_REPORTING OR NON_RELEASE_CRASH_REPORTING)
if(CMAKE_CFG_INTDIR STREQUAL ".")
set(LLBUILD_CONFIG ${CMAKE_BUILD_TYPE})
else(CMAKE_CFG_INTDIR STREQUAL ".")
@@ -1858,14 +1958,15 @@ if (PACKAGE)
"${VIEWER_DIST_DIR}"
"${VIEWER_EXE_GLOBS}"
"${VIEWER_LIB_GLOB}"
- "${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/bin/dump_syms"
+ "${AUTOBUILD_INSTALL_DIR}/bin/dump_syms"
"${VIEWER_SYMBOL_FILE}"
DEPENDS generate_breakpad_symbols.py
- VERBATIM
- )
+ VERBATIM)
+
add_custom_target(generate_breakpad_symbols DEPENDS "${VIEWER_SYMBOL_FILE}")
add_dependencies(generate_breakpad_symbols "${VIEWER_BINARY_NAME}" "${VIEWER_COPY_MANIFEST}")
add_dependencies(package generate_breakpad_symbols)
+ endif(RELEASE_CRASH_REPORTING OR NON_RELEASE_CRASH_REPORTING)
endif (PACKAGE)
if (LL_TESTS)
@@ -1878,12 +1979,21 @@ if (LL_TESTS)
llmediadataclient.cpp
lllogininstance.cpp
llremoteparcelrequest.cpp
+ lltranslate.cpp
llviewerhelputil.cpp
llversioninfo.cpp
+ llworldmap.cpp
+ llworldmipmap.cpp
+ )
+
+ set_source_files_properties(
+ lltranslate.cpp
+ PROPERTIES
+ LL_TEST_ADDITIONAL_LIBRARIES "${JSONCPP_LIBRARIES}"
)
##################################################
- # DISABLING PRECOMPILED HEADERS USAGE FOR TESTS
+ # DISABLING PRECOMPILED HEADERS USAGE FOR TESTS
##################################################
# if(USE_PRECOMPILED_HEADERS)
# set_source_files_properties(
@@ -1897,33 +2007,33 @@ if (LL_TESTS)
#set(TEST_DEBUG on)
set(test_sources llcapabilitylistener.cpp)
##################################################
- # DISABLING PRECOMPILED HEADERS USAGE FOR TESTS
+ # DISABLING PRECOMPILED HEADERS USAGE FOR TESTS
##################################################
# if(USE_PRECOMPILED_HEADERS)
# set(test_sources "${test_sources}" llviewerprecompiledheaders.cpp)
# endif(USE_PRECOMPILED_HEADERS)
- set(test_libs
- ${LLMESSAGE_LIBRARIES}
- ${WINDOWS_LIBRARIES}
+ set(test_libs
+ ${LLMESSAGE_LIBRARIES}
+ ${WINDOWS_LIBRARIES}
${LLVFS_LIBRARIES}
${LLMATH_LIBRARIES}
- ${LLCOMMON_LIBRARIES}
+ ${LLCOMMON_LIBRARIES}
${GOOGLEMOCK_LIBRARIES}
)
- LL_ADD_INTEGRATION_TEST(llcapabilitylistener
- "${test_sources}"
+ LL_ADD_INTEGRATION_TEST(llcapabilitylistener
+ "${test_sources}"
"${test_libs}"
${PYTHON_EXECUTABLE}
"${CMAKE_SOURCE_DIR}/llmessage/tests/test_llsdmessage_peer.py"
)
- set(test_libs
- ${LLMESSAGE_LIBRARIES}
- ${WINDOWS_LIBRARIES}
+ set(test_libs
+ ${LLMESSAGE_LIBRARIES}
+ ${WINDOWS_LIBRARIES}
${LLVFS_LIBRARIES}
${LLMATH_LIBRARIES}
- ${LLCOMMON_LIBRARIES}
+ ${LLCOMMON_LIBRARIES}
${GOOGLEMOCK_LIBRARIES}
${OPENSSL_LIBRARIES}
${CRYPTO_LIBRARIES}
@@ -1955,14 +2065,39 @@ if (LL_TESTS)
"${test_libs}"
)
+ LL_ADD_INTEGRATION_TEST(llsimplestat
+ ""
+ "${test_libs}"
+ )
+
+ LL_ADD_INTEGRATION_TEST(llviewerassetstats
+ llviewerassetstats.cpp
+ "${test_libs}"
+ )
+
#ADD_VIEWER_BUILD_TEST(llmemoryview viewer)
#ADD_VIEWER_BUILD_TEST(llagentaccess viewer)
- #ADD_VIEWER_BUILD_TEST(llworldmap viewer)
- #ADD_VIEWER_BUILD_TEST(llworldmipmap viewer)
#ADD_VIEWER_BUILD_TEST(lltextureinfo viewer)
#ADD_VIEWER_BUILD_TEST(lltextureinfodetails viewer)
#ADD_VIEWER_BUILD_TEST(lltexturestatsuploader viewer)
+include(LLAddBuildTest)
+SET(viewer_TEST_SOURCE_FILES
+ llagentaccess.cpp
+ llwlparammanager.cpp
+ # Not *actually* a unit test, it's an integration test.
+ # Because it won't work in the new unit test iface, i've commented out
+ # and notified Nat. Delete this when it's replaced!
+ # + poppy & brad 2009-06-05
+ # llcapabilitylistener.cpp
+ )
+set_source_files_properties(
+ ${viewer_TEST_SOURCE_FILES}
+ PROPERTIES
+ LL_TEST_ADDITIONAL_SOURCE_FILES llviewerprecompiledheaders.cpp
+ )
+
endif (LL_TESTS)
+check_message_template(${VIEWER_BINARY_NAME})
diff --git a/indra/newview/English.lproj/InfoPlist.strings b/indra/newview/English.lproj/InfoPlist.strings
index 4bf67b1367..5c7cacedec 100644
--- a/indra/newview/English.lproj/InfoPlist.strings
+++ b/indra/newview/English.lproj/InfoPlist.strings
@@ -2,6 +2,6 @@
CFBundleName = "Second Life";
-CFBundleShortVersionString = "Second Life version 2.1.1.0";
-CFBundleGetInfoString = "Second Life version 2.1.1.0, Copyright 2004-2010 Linden Research, Inc.";
+CFBundleShortVersionString = "Second Life version 2.1.0.13828";
+CFBundleGetInfoString = "Second Life version 2.1.0.13828, Copyright 2004-2009 Linden Research, Inc.";
diff --git a/indra/newview/Info-SecondLife.plist b/indra/newview/Info-SecondLife.plist
index 3cda7467dd..f7b11b217c 100644
--- a/indra/newview/Info-SecondLife.plist
+++ b/indra/newview/Info-SecondLife.plist
@@ -60,7 +60,7 @@
</dict>
</array>
<key>CFBundleVersion</key>
- <string>2.1.1.0</string>
+ <string>2.1.0.13828</string>
<key>CSResourcesFileMapped</key>
<true/>
</dict>
diff --git a/indra/newview/app_settings/CA.pem b/indra/newview/app_settings/CA.pem
index 11825bf906..8c1b9a1f37 100644
--- a/indra/newview/app_settings/CA.pem
+++ b/indra/newview/app_settings/CA.pem
@@ -1,106 +1,2058 @@
-----BEGIN CERTIFICATE-----
-MIIEuDCCA6CgAwIBAgIBBDANBgkqhkiG9w0BAQUFADCBtDELMAkGA1UEBhMCQlIx
-EzARBgNVBAoTCklDUC1CcmFzaWwxPTA7BgNVBAsTNEluc3RpdHV0byBOYWNpb25h
-bCBkZSBUZWNub2xvZ2lhIGRhIEluZm9ybWFjYW8gLSBJVEkxETAPBgNVBAcTCEJy
-YXNpbGlhMQswCQYDVQQIEwJERjExMC8GA1UEAxMoQXV0b3JpZGFkZSBDZXJ0aWZp
-Y2Fkb3JhIFJhaXogQnJhc2lsZWlyYTAeFw0wMTExMzAxMjU4MDBaFw0xMTExMzAy
-MzU5MDBaMIG0MQswCQYDVQQGEwJCUjETMBEGA1UEChMKSUNQLUJyYXNpbDE9MDsG
-A1UECxM0SW5zdGl0dXRvIE5hY2lvbmFsIGRlIFRlY25vbG9naWEgZGEgSW5mb3Jt
-YWNhbyAtIElUSTERMA8GA1UEBxMIQnJhc2lsaWExCzAJBgNVBAgTAkRGMTEwLwYD
-VQQDEyhBdXRvcmlkYWRlIENlcnRpZmljYWRvcmEgUmFpeiBCcmFzaWxlaXJhMIIB
-IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwPMudwX/hvm+Uh2b/lQAcHVA
-isamaLkWdkwP9/S/tOKIgRrL6Oy+ZIGlOUdd6uYtk9Ma/3pUpgcfNAj0vYm5gsyj
-Qo9emsc+x6m4VWwk9iqMZSCK5EQkAq/Ut4n7KuLE1+gdftwdIgxfUsPt4CyNrY50
-QV57KM2UT8x5rrmzEjr7TICGpSUAl2gVqe6xaii+bmYR1QrmWaBSAG59LrkrjrYt
-bRhFboUDe1DK+6T8s5L6k8c8okpbHpa9veMztDVC9sPJ60MWXh6anVKo1UcLcbUR
-yEeNvZneVRKAAU6ouwdjDvwlsaKydFKwed0ToQ47bmUKgcm+wV3eTRk36UOnTwID
-AQABo4HSMIHPME4GA1UdIARHMEUwQwYFYEwBAQAwOjA4BggrBgEFBQcCARYsaHR0
-cDovL2FjcmFpei5pY3BicmFzaWwuZ292LmJyL0RQQ2FjcmFpei5wZGYwPQYDVR0f
-BDYwNDAyoDCgLoYsaHR0cDovL2FjcmFpei5pY3BicmFzaWwuZ292LmJyL0xDUmFj
-cmFpei5jcmwwHQYDVR0OBBYEFIr68VeEERM1kEL6V0lUaQ2kxPA3MA8GA1UdEwEB
-/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAZA5c1
-U/hgIh6OcgLAfiJgFWpvmDZWqlV30/bHFpj8iBobJSm5uDpt7TirYh1Uxe3fQaGl
-YjJe+9zd+izPRbBqXPVQA34EXcwk4qpWuf1hHriWfdrx8AcqSqr6CuQFwSr75Fos
-SzlwDADa70mT7wZjAmQhnZx2xJ6wfWlT9VQfS//JYeIc7Fue2JNLd00UOSMMaiK/
-t79enKNHEA2fupH3vEigf5Eh4bVAN5VohrTm6MY53x7XQZZr1ME7a55lFEnSeT0u
-mlOAjR2mAbvSM5X5oSZNrmetdzyTj2flCM8CC7MLab0kkdngRIlUBGHF1/S5nmPb
-K+9A46sd33oqK8n8
+MIIDfTCCAuagAwIBAgIDErvmMA0GCSqGSIb3DQEBBQUAME4xCzAJBgNVBAYTAlVT
+MRAwDgYDVQQKEwdFcXVpZmF4MS0wKwYDVQQLEyRFcXVpZmF4IFNlY3VyZSBDZXJ0
+aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDIwNTIxMDQwMDAwWhcNMTgwODIxMDQwMDAw
+WjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UE
+AxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9m
+OSm9BXiLnTjoBbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIu
+T8rxh0PBFpVXLVDviS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6c
+JmTM386DGXHKTubU1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmR
+Cw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5asz
+PeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo4HwMIHtMB8GA1UdIwQYMBaAFEjm
+aPkr0rKV10fYIyAQTzOYkJ/UMB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrM
+TjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjA6BgNVHR8EMzAxMC+g
+LaArhilodHRwOi8vY3JsLmdlb3RydXN0LmNvbS9jcmxzL3NlY3VyZWNhLmNybDBO
+BgNVHSAERzBFMEMGBFUdIAAwOzA5BggrBgEFBQcCARYtaHR0cHM6Ly93d3cuZ2Vv
+dHJ1c3QuY29tL3Jlc291cmNlcy9yZXBvc2l0b3J5MA0GCSqGSIb3DQEBBQUAA4GB
+AHbhEm5OSxYShjAGsoEIz/AIx8dxfmbuwu3UOx//8PDITtZDOLC5MH0Y0FWDomrL
+NhGc6Ehmo21/uBPUR/6LWlxz/K7ZGzIZOKuXNBSqltLroxwUCEm2u+WR74M26x1W
+b8ravHNjkOR/ez4iyz0H7V84dJzjA1BOoa+Y7mHyhD8S
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEW
+MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg
+Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM3WhcNMzYwOTE3MTk0NjM2WjB9
+MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi
+U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh
+cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA
+A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk
+pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf
+OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C
+Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT
+Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi
+HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM
+Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w
++2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+
+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3
+Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B
+26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID
+AQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD
+VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFul
+F2mHMMo0aEPQQa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCC
+ATgwLgYIKwYBBQUHAgEWImh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5w
+ZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL2ludGVybWVk
+aWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENvbW1lcmNpYWwgKFN0
+YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0aGUg
+c2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0
+aWZpY2F0aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93
+d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgG
+CWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1
+dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5fPGFf59Jb2vKXfuM/gTF
+wWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWmN3PH/UvS
+Ta0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst
+0OcNOrg+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNc
+pRJvkrKTlMeIFw6Ttn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKl
+CcWw0bdT82AUuoVpaiF8H3VhFyAXe2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVF
+P0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA2MFrLH9ZXF2RsXAiV+uKa0hK
+1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBsHvUwyKMQ5bLm
+KhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE
+JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ
+8dCAWZvLMdibD4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnm
+fyWl8kgAwKQB2j8=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML
+RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp
+bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5
+IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp
+ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0xOTEy
+MjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3
+LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp
+YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG
+A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq
+K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe
+sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX
+MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT
+XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/
+HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH
+4QIDAQABo3QwcjARBglghkgBhvhCAQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGA
+vtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdERgL7YibkIozH5oSQJFrlwMB0G
+CSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEA
+WUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo
+oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQ
+h7A6tcOdBTcSo8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18
+f3v/rxzP5tsHrV7bhZ3QKw0z2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfN
+B/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjXOP/swNlQ8C5LWK5Gb9Auw2DaclVy
+vUxFnmG6v4SBkgPR0ml8xQ==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW
+MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy
+c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE
+BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0
+IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV
+VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8
+cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT
+QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh
+F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v
+c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w
+mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd
+VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX
+teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ
+f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe
+Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+
+nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB
+/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY
+MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG
+9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc
+aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX
+IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn
+ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z
+uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN
+Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja
+QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW
+koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9
+ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt
+DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm
+bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDLTCCApagAwIBAgIBADANBgkqhkiG9w0BAQQFADCB0TELMAkGA1UEBhMCWkEx
+FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD
+VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT
+ZXJ2aWNlcyBEaXZpc2lvbjEkMCIGA1UEAxMbVGhhd3RlIFBlcnNvbmFsIEZyZWVt
+YWlsIENBMSswKQYJKoZIhvcNAQkBFhxwZXJzb25hbC1mcmVlbWFpbEB0aGF3dGUu
+Y29tMB4XDTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgdExCzAJBgNVBAYT
+AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEa
+MBgGA1UEChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRp
+b24gU2VydmljZXMgRGl2aXNpb24xJDAiBgNVBAMTG1RoYXd0ZSBQZXJzb25hbCBG
+cmVlbWFpbCBDQTErMCkGCSqGSIb3DQEJARYccGVyc29uYWwtZnJlZW1haWxAdGhh
+d3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA1GnX1LCUZFtx6UfY
+DFG26nKRsIRefS0Nj3sS34UldSh0OkIsYyeflXtL734Zhx2G6qPduc6WZBrCFG5E
+rHzmj+hND3EfQDimAKOHePb5lIZererAXnbr2RSjXW56fAylS1V/Bhkpf56aJtVq
+uzgkCGqYx7Hao5iR/Xnb5VrEHLkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zAN
+BgkqhkiG9w0BAQQFAAOBgQDH7JJ+Tvj1lqVnYiqk8E0RYNBvjWBYYawmu1I1XAjP
+MPuoSpaKH2JCI4wXD/S6ZJwXrEcp352YXtJsYHFcoqzceePnbgBHH7UNKOgCneSa
+/RP0ptl8sfjcXyMmCZGAc9AUG95DqYMl8uacLxXK/qarigd1iwzdUYRr5PjRznei
+gQ==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEn
+MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL
+ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMg
+b2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAxNjEzNDNaFw0zNzA5MzAxNjEzNDRa
+MH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZpcm1hIFNBIENJRiBB
+ODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3JnMSIw
+IAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0B
+AQEFAAOCAQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtb
+unXF/KGIJPov7coISjlUxFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0d
+BmpAPrMMhe5cG3nCYsS4No41XQEMIwRHNaqbYE6gZj3LJgqcQKH0XZi/caulAGgq
+7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jWDA+wWFjbw2Y3npuRVDM3
+0pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFVd9oKDMyX
+roDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIG
+A1UdEwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5j
+aGFtYmVyc2lnbi5vcmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p
+26EpW1eLTXYGduHRooowDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIA
+BzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hhbWJlcnNpZ24ub3JnMCcGA1Ud
+EgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYDVR0gBFEwTzBN
+BgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz
+aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEB
+AAxBl8IahsAifJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZd
+p0AJPaxJRUXcLo0waLIJuvvDL8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi
+1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wNUPf6s+xCX6ndbcj0dc97wXImsQEc
+XCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/nADydb47kMgkdTXg0
+eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1erfu
+tGWaIZDgqtCYvDi1czyL+Nw=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIID/TCCA2agAwIBAgIEP4/gkTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJQ
+TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu
+dHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MR8wHQYDVQQDExZDQyBTaWduZXQgLSBD
+QSBLbGFzYSAxMB4XDTAzMTAxNzEyMjkwMloXDTExMDkyMzExMTgxN1owdjELMAkG
+A1UEBhMCUEwxHzAdBgNVBAoTFlRQIEludGVybmV0IFNwLiB6IG8uby4xJDAiBgNV
+BAsTG0NlbnRydW0gQ2VydHlmaWthY2ppIFNpZ25ldDEgMB4GA1UEAxMXQ0MgU2ln
+bmV0IC0gVFNBIEtsYXNhIDEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOJY
+rISEtSsduHajROh5/n7NGrkpYTT9NEaPe9+ucuQ37KxIbfJwXJjgUc1dw4wCkcQ1
+2FJarD1X6mSQ4cfN/60vLfKI5ZD4nhJTMKlAj1pX9ScQ/MuyvKStCbn5WTkjPhjR
+AM0tdwXSnzuTEunfw0Oup559y3Iqxg1cExflB6cfAgMBAAGjggGXMIIBkzBBBgNV
+HR8EOjA4MDagNKAyhjBodHRwOi8vd3d3LnNpZ25ldC5wbC9yZXBvenl0b3JpdW0v
+Y3JsL2tsYXNhMS5jcmwwDgYDVR0PAQH/BAQDAgeAMBYGA1UdJQEB/wQMMAoGCCsG
+AQUFBwMIMIHaBgNVHSAEgdIwgc8wgcwGDSsGAQQBvj8CZAoRAgEwgbowbwYIKwYB
+BQUHAgIwYxphQ2VydHlmaWthdCB3eXN0YXdpb255IHpnb2RuaWUgeiBkb2t1bWVu
+dGVtICJQb2xpdHlrYSBDZXJ0eWZpa2FjamkgQ0MgU2lnbmV0IC0gWm5ha293YW5p
+ZSBjemFzZW0iLjBHBggrBgEFBQcCARY7aHR0cDovL3d3dy5zaWduZXQucGwvcmVw
+b3p5dG9yaXVtL2Rva3VtZW50eS9wY190c2ExXzJfMS5wZGYwHwYDVR0jBBgwFoAU
+w4Me1Vl3VPtN+1dH+cQjXNHnieMwHQYDVR0OBBYEFJdDwEqtcavOYd9u9tej53vW
+XwNBMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQEFBQADgYEAnpiQkqLCJQYXUrqMHUEz
++z3rOqS0XzSFnVVLhkVssvXc8S3FkJIiQTUrkScjI4CToCzujj3EyfNxH6yiLlMb
+skF8I31JxIeBvueqV+s+o76CZm3ycu9hb0I4lswuxoT+q5ZzPR8Irrb51rZXlolR
++7KtwMg4sFDJZ8RNgOf7tbA=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDlDCCAnygAwIBAgIQWAsFbFMk27JQVxhf+eWmUDANBgkqhkiG9w0BAQUFADAn
+MQswCQYDVQQGEwJCRTEYMBYGA1UEAxMPQmVsZ2l1bSBSb290IENBMB4XDTAzMDEy
+NjIzMDAwMFoXDTE0MDEyNjIzMDAwMFowJzELMAkGA1UEBhMCQkUxGDAWBgNVBAMT
+D0JlbGdpdW0gUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+AMihcekcRkJ5eHFvna6pqKsot03HIOswkVp19eLSz8hMFJhCWK3HEcVAQGpa+XQS
+J4fpnOVxTiIs0RIYqjBeoiG52bv/9nTrMQHnO35YD5EWTXaJqAFPrSJmcPpLHZXB
+MFjqvNll2Jq0iOtJRlLf0lMVdssUXRlJsW9q09P9vMIt7EU/CT9YvvzU7wCMgTVy
+v/cY6pZifSsofxVsY9LKyn0FrMhtB20yvmi4BUCuVJhWPmbxMOjvxKuTXgfeMo8S
+dKpbNCNUwOpszv42kqgJF+qhLc9s44Qd3ocuMws8dOIhUDiVLlzg5cYx+dtA+mqh
+pIqTm6chBocdJ9PEoclMsG8CAwEAAaOBuzCBuDAOBgNVHQ8BAf8EBAMCAQYwDwYD
+VR0TAQH/BAUwAwEB/zBCBgNVHSAEOzA5MDcGBWA4AQEBMC4wLAYIKwYBBQUHAgEW
+IGh0dHA6Ly9yZXBvc2l0b3J5LmVpZC5iZWxnaXVtLmJlMB0GA1UdDgQWBBQQ8AxW
+m2HqVzq2NZdtn925FI7b5jARBglghkgBhvhCAQEEBAMCAAcwHwYDVR0jBBgwFoAU
+EPAMVpth6lc6tjWXbZ/duRSO2+YwDQYJKoZIhvcNAQEFBQADggEBAMhtIlGKYfgP
+lm7VILKB+MbcoxYA2s1q52sq+llIp0xJN9dzoWoBZV4yveeX09AuPHPTjHuD79ZC
+wT+oqV0PN7p20kC9zC0/00RBSZz9Wyn0AiMiW3Ebv1jZKE4tRfTa57VjRUQRDSp/
+M382SbTObqkCMa5c/ciJv0J71/Fg8teH9lcuen5qE4Ad3OPQYx49cTGxYNSeCMqr
+8JTHSHVUgfMbrXec6LKP24OsjzRr6L/D2fVDw2RV6xq9NoY2uiGMlxoh1OotO6y6
+7Kcdq765Sps1LxxcHVGnH1TtEpf/8m6HfUbJdNbv6z195lluBpQE5KJVhzgoaiJe
+4r50ErAEQyo=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIH8jCCB1ugAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARIxCzAJBgNVBAYTAkVT
+MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE
+ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE
+ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEuMCwGA1UECxMl
+SVBTIENBIENMQVNFMSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMl
+SVBTIENBIENMQVNFMSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3
+DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAxMTIzMTExMTEwM1oXDTI1MTIyOTEx
+MTEwM1owggESMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQmFyY2Vsb25hMRIwEAYD
+VQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5n
+IFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4g
+IEItNjA5Mjk0NTIxLjAsBgNVBAsTJUlQUyBDQSBDTEFTRTEgQ2VydGlmaWNhdGlv
+biBBdXRob3JpdHkxLjAsBgNVBAMTJUlQUyBDQSBDTEFTRTEgQ2VydGlmaWNhdGlv
+biBBdXRob3JpdHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczCBnzAN
+BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA55+R7+voFuF0vIkTodduR8ZfPxKU5u/h
+M+GrgqufAwHmdG+KF5fPVy8Mdi7mbqfK2veLFBVADbNq2e2+s2q8Ai0chS3vl//P
+l9rrR10eU79dVN4ndGMZfpXUMZblz0/Kq3Uvk5AsWUwfv1YokIhi4RMeBtOCVv3j
+LSV1rDsiap8CAwEAAaOCBFIwggROMB0GA1UdDgQWBBRtW6MBjmE3nQR4tq+blh0C
+QeXbeTCCAUQGA1UdIwSCATswggE3gBRtW6MBjmE3nQR4tq+blh0CQeXbeaGCARqk
+ggEWMIIBEjELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UE
+BxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBT
+ZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBC
+LTYwOTI5NDUyMS4wLAYDVQQLEyVJUFMgQ0EgQ0xBU0UxIENlcnRpZmljYXRpb24g
+QXV0aG9yaXR5MS4wLAYDVQQDEyVJUFMgQ0EgQ0xBU0UxIENlcnRpZmljYXRpb24g
+QXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYD
+VR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggr
+BgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIB
+FQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhC
+AQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGB
+D2lwc0BtYWlsLmlwcy5lczBCBglghkgBhvhCAQ0ENRYzQ0xBU0UxIENBIENlcnRp
+ZmljYXRlIGlzc3VlZCBieSBodHRwczovL3d3dy5pcHMuZXMvMCoGCWCGSAGG+EIB
+AgQdFhtodHRwczovL3d3dy5pcHMuZXMvaXBzMjAwMi8wOwYJYIZIAYb4QgEEBC4W
+LGh0dHBzOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTEuY3JsMEAG
+CWCGSAGG+EIBAwQzFjFodHRwczovL3d3dy5pcHMuZXMvaXBzMjAwMi9yZXZvY2F0
+aW9uQ0xBU0UxLmh0bWw/MD0GCWCGSAGG+EIBBwQwFi5odHRwczovL3d3dy5pcHMu
+ZXMvaXBzMjAwMi9yZW5ld2FsQ0xBU0UxLmh0bWw/MDsGCWCGSAGG+EIBCAQuFixo
+dHRwczovL3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lDTEFTRTEuaHRtbDB1BgNV
+HR8EbjBsMDKgMKAuhixodHRwczovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAy
+Q0xBU0UxLmNybDA2oDSgMoYwaHR0cHM6Ly93d3diYWNrLmlwcy5lcy9pcHMyMDAy
+L2lwczIwMDJDTEFTRTEuY3JsMC8GCCsGAQUFBwEBBCMwITAfBggrBgEFBQcwAYYT
+aHR0cDovL29jc3AuaXBzLmVzLzANBgkqhkiG9w0BAQUFAAOBgQBacEdMbCU0z2bO
+X+iyJafrUbjPE+5KzJz2jB1YXC2d7kMy2Hhbp8gVyfUFQpd+F2IgBBj9z3IRNkDN
+foHhdse5j2cUUH+fno9jj8EPE2GPhXVmCjIP6KuPp8yzz89gC+ry+bkfSFzjHUQt
+K15I/jRAHfyJywwUrwtmklZIX0E5Og==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDWjCCAkKgAwIBAgIEO8rJUjANBgkqhkiG9w0BAQUFADBmMQswCQYDVQQGEwJE
+SzEMMAoGA1UEChMDS01EMQ8wDQYDVQQLEwZLTUQtQ0ExFjAUBgNVBAMTDUtNRC1D
+QSBTZXJ2ZXIxIDAeBgoJkiaJk/IsZAEDFBBpbmZvY2FAa21kLWNhLmRrMB4XDTk4
+MTAxNjE5MTkyMVoXDTE4MTAxMjE5MTkyMVowZjELMAkGA1UEBhMCREsxDDAKBgNV
+BAoTA0tNRDEPMA0GA1UECxMGS01ELUNBMRYwFAYDVQQDEw1LTUQtQ0EgU2VydmVy
+MSAwHgYKCZImiZPyLGQBAxQQaW5mb2NhQGttZC1jYS5kazCCASIwDQYJKoZIhvcN
+AQEBBQADggEPADCCAQoCggEBAJsLpbSgFxQ7IhFgf5f+RfBxnbCkx5C7yTjfCZvp
+/BP2LBD3OKjgLRwvASoCU3I5NMhccho6uhZVf1HC+Ac5HmXUUd+v92a7gDnohPPy
+Rgv8c6f/+R2fFen37SBemYFDtZveamVXZ2To7xAxNiMKgPTPs/Rl7F6LDsYgv1bD
+36FrjahNoSTmTbYRoK21eIOVwrZeNSzo9w3W8fj0n+V2IB1jsOh+AvjXkjbvAVky
+0/57GMlyBNKP7JIGP7LXqwWfrBXuAph1DUMz467KlHZOMkPwCjTZOab7CcLQXCCY
+12s5c5QAkwpf35hQRuOaNo6d/XFM6J9mofiWlGTT3Px1EX0CAwEAAaMQMA4wDAYD
+VR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAPlA6VZ2C2cJbsI0SBIe9v+M9
+GxI45QI7P0D7QGyrqM7oNqGq7hJdN6NFb0LyPcF3/pVzmtYVJzaGKF6spaxOEveB
+9ki1xRoXUKpaCxSweBpTzEktWa43OytRy0sbryEmHJCQkz8MPufWssf2yXHzgFFo
+XMQpcMyT7JwxPlfYVvab9Kp+nW7fIyDOG0wdmBerZ+GEQJxJEkri1HskjigxhGze
+ziocJatBuOWgqw5KRylgGIQjUGRTCbODVta+Kmqb9d+cB7FStbYtt2HebOXzBIY3
+XUM5KtGC++We7DqgU5Firek7brw8i2XsHPLKJTceb6Xo6DsSxLfBAWV6+8DCkQ==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOc
+UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx
+c8SxMQswCQYDVQQGDAJUUjEPMA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykg
+MjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8
+dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMxMDI3MTdaFw0xNTAz
+MjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsgU2Vy
+dGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYD
+VQQHDAZBTktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kg
+xLBsZXRpxZ9pbSB2ZSBCaWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEu
+xZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7
+XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GXyGl8hMW0kWxsE2qkVa2k
+heiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8iSi9BB35J
+YbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5C
+urKZ8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1
+JuTm5Rh8i27fbMx4W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51
+b0dewQIDAQABoxAwDjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV
+9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46sWrv7/hg0Uw2ZkUd82YCdAR7
+kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxEq8Sn5RTOPEFh
+fEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy
+B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdA
+aLX/7KfS0zgYnNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKS
+RGQDJereW26fyfJOrN3H
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc
+MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT
+ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw
+MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j
+LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ
+KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo
+RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu
+WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw
+Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD
+AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK
+eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM
+zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+
+WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN
+/Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFajCCBFKgAwIBAgIEPLU9RjANBgkqhkiG9w0BAQUFADBmMRIwEAYDVQQKEwli
+ZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEzMDEGA1UEAxMq
+YmVUUlVTVGVkIFJvb3QgQ0EtQmFsdGltb3JlIEltcGxlbWVudGF0aW9uMB4XDTAy
+MDQxMTA3Mzg1MVoXDTIyMDQxMTA3Mzg1MVowZjESMBAGA1UEChMJYmVUUlVTVGVk
+MRswGQYDVQQLExJiZVRSVVNUZWQgUm9vdCBDQXMxMzAxBgNVBAMTKmJlVFJVU1Rl
+ZCBSb290IENBLUJhbHRpbW9yZSBJbXBsZW1lbnRhdGlvbjCCASIwDQYJKoZIhvcN
+AQEBBQADggEPADCCAQoCggEBALx+xDmcjOPWHIb/ymKt4H8wRXqOGrO4x/nRNv8i
+805qX4QQ+2aBw5R5MdKR4XeOGCrDFN5R9U+jK7wYFuK13XneIviCfsuBH/0nLI/6
+l2Qijvj/YaOcGx6Sj8CoCd8JEey3fTGaGuqDIQY8n7pc/5TqarjDa1U0Tz0yH92B
+FODEPM2dMPgwqZfT7syj0B9fHBOB1BirlNFjw55/NZKeX0Tq7PQiXLfoPX2k+Ymp
+kbIq2eszh+6l/ePazIjmiSZuxyuC0F6dWdsU7JGDBcNeDsYq0ATdcT0gTlgn/FP7
+eHgZFLL8kFKJOGJgB7Sg7KxrUNb9uShr71ItOrL/8QFArDcCAwEAAaOCAh4wggIa
+MA8GA1UdEwEB/wQFMAMBAf8wggG1BgNVHSAEggGsMIIBqDCCAaQGDysGAQQBsT4A
+AAEJKIORMTCCAY8wggFIBggrBgEFBQcCAjCCAToaggE2UmVsaWFuY2Ugb24gb3Ig
+dXNlIG9mIHRoaXMgQ2VydGlmaWNhdGUgY3JlYXRlcyBhbiBhY2tub3dsZWRnbWVu
+dCBhbmQgYWNjZXB0YW5jZSBvZiB0aGUgdGhlbiBhcHBsaWNhYmxlIHN0YW5kYXJk
+IHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZSwgdGhlIENlcnRpZmljYXRpb24g
+UHJhY3RpY2UgU3RhdGVtZW50IGFuZCB0aGUgUmVseWluZyBQYXJ0eSBBZ3JlZW1l
+bnQsIHdoaWNoIGNhbiBiZSBmb3VuZCBhdCB0aGUgYmVUUlVTVGVkIHdlYiBzaXRl
+LCBodHRwOi8vd3d3LmJldHJ1c3RlZC5jb20vcHJvZHVjdHNfc2VydmljZXMvaW5k
+ZXguaHRtbDBBBggrBgEFBQcCARY1aHR0cDovL3d3dy5iZXRydXN0ZWQuY29tL3By
+b2R1Y3RzX3NlcnZpY2VzL2luZGV4Lmh0bWwwHQYDVR0OBBYEFEU9w6nR3D8kVpgc
+cxiIav+DR+22MB8GA1UdIwQYMBaAFEU9w6nR3D8kVpgccxiIav+DR+22MA4GA1Ud
+DwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEASZK8o+6svfoNyYt5hhwjdrCA
+WXf82n+0S9/DZEtqTg6t8n1ZdwWtColzsPq8y9yNAIiPpqCy6qxSJ7+hSHyXEHu6
+7RMdmgduyzFiEuhjA6p9beP4G3YheBufS0OM00mG9htc9i5gFdPp43t1P9ACg9AY
+gkHNZTfqjjJ+vWuZXTARyNtIVBw74acT02pIk/c9jH8F6M7ziCpjBLjqflh8AXtb
+4cV97yHgjQ5dUX2xZ/2jvTg2xvI4hocalmhgRvsoFEdV4aeADGvi6t9NfJBIoDa9
+CReJf8Py05yc493EG931t3GzUwWJBtDLSoDByFOQtTwxiBdQn8nEDovYqAJjDQ==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG
+A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz
+cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2
+MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV
+BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt
+YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN
+ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE
+BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is
+I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G
+CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do
+lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc
+AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/
+MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT
+DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow
+PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD
+Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O
+rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq
+OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b
+xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw
+7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD
+aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV
+HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG
+SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69
+ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr
+AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz
+R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5
+JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo
+Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEd
+MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3Mg
+Q2xhc3MgMiBDQSAxMB4XDTA2MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzEL
+MAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MR0wGwYD
+VQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7McXA0
+ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLX
+l18xoS830r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVB
+HfCuuCkslFJgNJQ72uA40Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B
+5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/RuFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3
+WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNCMEAwDwYDVR0TAQH/BAUw
+AwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0PAQH/BAQD
+AgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLP
+gcIV1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+
+DKhQ7SLHrQVMdvvt7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKu
+BctN518fV4bVIJwo+28TOPX2EZL2fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHs
+h7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5wwDX3OaJdZtB7WZ+oRxKaJyOk
+LY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjEL
+MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV
+BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0
+Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYwMTEyMTQ0MTU3WhcNMjUxMjMxMjI1
+OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i
+SDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UEAxMc
+VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD
+ggEPADCCAQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJW
+Ht4bNwcwIi9v8Qbxq63WyKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+Q
+Vl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo6SI7dYnWRBpl8huXJh0obazovVkdKyT2
+1oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZuV3bOx4a+9P/FRQI2Alq
+ukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk2ZyqBwi1
+Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1Ud
+EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NX
+XAek0CSnwPIA1DCB7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRy
+dXN0Y2VudGVyLmRlL2NybC92Mi90Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6
+Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBUcnVzdENlbnRlciUyMENsYXNz
+JTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21iSCxPVT1yb290
+Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u
+TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlN
+irTzwppVMXzEO2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8
+TtXqluJucsG7Kv5sbviRmEb8yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6
+g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9IJqDnxrcOfHFcqMRA/07QlIp2+gB
+95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal092Y+tTmBvTwtiBj
+S+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc5A==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJV
+UzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQL
+EwhEU1RDQSBFMjAeFw05ODEyMDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJ
+BgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4x
+ETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQC/
+k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGODVvso
+LeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3o
+TQPMx7JSxhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCG
+SAGG+EIBAQQEAwIABzBoBgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMx
+JDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMI
+RFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMDkxOTE3
+MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFB6C
+TShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5
+WzAMBgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqG
+SIb3DQEBBQUAA4GBAEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHR
+xdf0CiUPPXiBng+xZ8SQTGPdXqfiup/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVL
+B3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1mPnHfxsb1gYgAlihw6ID
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE
+BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz
+dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG
+A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U
+cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf
+qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ
+JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ
++jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS
+s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5
+HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7
+70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG
+V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S
+qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S
+5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia
+C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX
+OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE
+FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/
+BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2
+KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg
+Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B
+8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ
+MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc
+0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ
+u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF
+u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH
+YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8
+GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO
+RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e
+KeC2uAloGRwYQw==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6
+MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJp
+dHkgMjA0OCBWMzAeFw0wMTAyMjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAX
+BgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJTQSBTZWN1cml0eSAy
+MDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAt49VcdKA3Xtp
+eafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7Jylg
+/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGl
+wSMiuLgbWhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnh
+AMFRD0xS+ARaqn1y07iHKrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2
+PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpu
+AWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB
+BjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4EFgQUB8NR
+MKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYc
+HnmYv/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/
+Zb5gEydxiKRz44Rj0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+
+f00/FGj1EVDVwfSQpQgdMWD/YIwjVAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVO
+rSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395nzIlQnQFgCi/vcEkllgVsRch
+6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kApKnXwiJPZ9d3
+7CAFYd4=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx
+FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD
+VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv
+biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy
+dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t
+MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB
+MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG
+A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp
+b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl
+cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv
+bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE
+VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ
+ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR
+uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG
+9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI
+hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM
+pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV
+UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy
+dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1
+MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx
+dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B
+AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f
+BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A
+cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC
+AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ
+MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm
+aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw
+ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj
+IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF
+MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA
+A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y
+7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh
+1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDEl
+MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMh
+U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIz
+MloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09N
+IFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNlY3VyaXR5IENvbW11
+bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSE
+RMqm4miO/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gO
+zXppFodEtZDkBp2uoQSXWHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5
+bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4zZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDF
+MxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4bepJz11sS6/vmsJWXMY1
+VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK9U2vP9eC
+OKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0G
+CSqGSIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HW
+tWS3irO4G8za+6xmiEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZ
+q51ihPZRwSzJIxXYKLerJRO1RuGGAv8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDb
+EJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnWmHyojf6GPgcWkuF75x3sM3Z+
+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEWT1MKZPlO9L9O
+VL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIICPDCCAaUCEAq6HgBiMui0NiZdH3zNiWYwDQYJKoZIhvcNAQEFBQAwXzELMAkG
+A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz
+cyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2
+MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV
+BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAyIFB1YmxpYyBQcmlt
+YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN
+ADCBiQKBgQC2WoujDWojg4BrzzmH9CETMwZMJaLtVRKXxaeAufqDwSCg+i8VDXyh
+YGt+eSz6Bg86rvYbb7HS/y8oUl+DfUvEerf4Zh+AVPy3wo5ZShRXRtGak75BkQO7
+FYCTXOvnzAhsPz6zSvz/S2wj1VCCJkQZjiPDceoZJEcEnnW/yKYAHwIDAQABMA0G
+CSqGSIb3DQEBBQUAA4GBAIDToA+IyeVoW4R7gB+nt+MjWBEc9RTwWBKMi99x2ZAk
+EXyge8N6GRm9cr0gvwA63/rVeszC42JFi8tJg5jBcGnQnl6CjDVHjk8btB9jAa3k
+ltax7nosZm4XNq8afjgGhixrTcsnkm54vwDVAcCxB8MJqmSFKPKdc57PYDoKHUpI
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUx
+ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0
+b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQD
+EytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBDKSBUYW51c2l0dmFueWtpYWRvMB4X
+DTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJBgNVBAYTAkhVMREw
+DwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9u
+c2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMr
+TmV0TG9jayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzAN
+BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNA
+OoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3ZW3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC
+2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63euyucYT2BDMIJTLrdKwW
+RMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQwDgYDVR0P
+AQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEW
+ggJNRklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0
+YWxhbm9zIFN6b2xnYWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFz
+b2sgYWxhcGphbiBrZXN6dWx0LiBBIGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBO
+ZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1iaXp0b3NpdGFzYSB2ZWRpLiBB
+IGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0ZWxlIGF6IGVs
+b2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs
+ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25s
+YXBqYW4gYSBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kg
+a2VyaGV0byBheiBlbGxlbm9yemVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4g
+SU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5kIHRoZSB1c2Ugb2YgdGhpcyBjZXJ0
+aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQUyBhdmFpbGFibGUg
+YXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwgYXQg
+Y3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmY
+ta3UzbM2xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2g
+pO0u9f38vf5NNwgMvOOWgyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4
+Fp1hBWeAyNDYpQcCNJgEjTME1A==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw
+PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz
+cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9
+MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz
+IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ
+ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR
+VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL
+kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd
+EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas
+H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0
+HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud
+DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4
+QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu
+Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/
+AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8
+yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR
+FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA
+ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB
+kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7
+l7+ijrRU
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIICoTCCAgqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBizELMAkGA1UEBhMCWkEx
+FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzAN
+BgNVBAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAd
+BgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcgQ0EwHhcNOTcwMTAxMDAwMDAwWhcN
+MjAxMjMxMjM1OTU5WjCBizELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4g
+Q2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzANBgNVBAoTBlRoYXd0ZTEdMBsG
+A1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAdBgNVBAMTFlRoYXd0ZSBUaW1l
+c3RhbXBpbmcgQ0EwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANYrWHhhRYZT
+6jR7UZztsOYuGA7+4F+oJ9O0yeB8WU4WDnNUYMF/9p8u6TqFJBU820cEY8OexJQa
+Wt9MevPZQx08EHp5JduQ/vBR5zDWQQD9nyjfeb6Uu522FOMjhdepQeBMpHmwKxqL
+8vg7ij5FrHGSALSQQZj7X+36ty6K+Ig3AgMBAAGjEzARMA8GA1UdEwEB/wQFMAMB
+Af8wDQYJKoZIhvcNAQEEBQADgYEAZ9viwuaHPUCDhjc1fR/OmsMMZiCouqoEiYbC
+9RAIDb/LogWK0E02PvTX72nGXuSwlG9KuefeW4i2e9vjJ+V2w/A1wcu1J5szedyQ
+pgCed/r8zSeUQhac0xxo7L9c3eWpexAKMnRUEzGLhQOEkbdYATAUOK8oyvyxUBkZ
+CayJSdM=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi
+MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu
+MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp
+dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV
+UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO
+ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG
+SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz
+c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP
+OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl
+mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF
+BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4
+qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw
+gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB
+BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu
+bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp
+dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8
+6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/
+h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH
+/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv
+wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN
+pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDgDCCAmigAwIBAgICAx4wDQYJKoZIhvcNAQEFBQAwYTELMAkGA1UEBhMCVVMx
+DTALBgNVBAoTBFZJU0ExLzAtBgNVBAsTJlZpc2EgSW50ZXJuYXRpb25hbCBTZXJ2
+aWNlIEFzc29jaWF0aW9uMRIwEAYDVQQDEwlHUCBSb290IDIwHhcNMDAwODE2MjI1
+MTAwWhcNMjAwODE1MjM1OTAwWjBhMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklT
+QTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRp
+b24xEjAQBgNVBAMTCUdQIFJvb3QgMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBAKkBcLWqxEDwq2omYXkZAPy/mzdZDK9vZBv42pWUJGkzEXDK41Z0ohdX
+ZFwgBuHW73G3O/erwWnQSaSxBNf0V2KJXLB1LRckaeNCYOTudNargFbYiCjh+20i
+/SN8RnNPflRzHqgsVVh1t0zzWkWlAhr62p3DRcMiXvOL8WAp0sdftAw6UYPvMPjU
+58fy+pmjIlC++QU3o63tmsPm7IgbthknGziLgE3sucfFicv8GjLtI/C1AVj59o/g
+halMCXI5Etuz9c9OYmTaxhkVOmMd6RdVoUwiPDQyRvhlV7or7zaMavrZ2UT0qt2E
+1w0cslSsMoW0ZA3eQbuxNMYBhjJk1Z8CAwEAAaNCMEAwHQYDVR0OBBYEFJ59SzS/
+ca3CBfYDdYDOqU8axCRMMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG
+MA0GCSqGSIb3DQEBBQUAA4IBAQAhpXYUVfmtJ3CPPPTVbMjMCqujmAuKBiPFyWHb
+mQdpNSYx/scuhMKZYdQN6X0uEyt8joW2hcdLzzW2LEc9zikv2G+fiRxkk78IvXbQ
+kIqUs38oW26sTTMs7WXcFsziza6kPWKSBpUmv9+55CCmc2rBvveURNZNbyoLaxhN
+dBA2aGpawWqn3TYpjLgwi08hPwAuVDAHOrqK5MOeyti12HvOdUVmB/RtLdh6yumJ
+ivIj2C/LbgA2T/vwLwHMD8AiZfSr4k5hLQOCfZEWtTDVFN5ex5D8ofyrEK9ca3Cn
+B+8phuiyJccg/ybdd+95RBTEvd07xQObdyPsoOy7Wjm1zK0G
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEajCCA1KgAwIBAgIBATANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJKUDEN
+MAsGA1UECgwESlBLSTEpMCcGA1UECwwgUHJlZmVjdHVyYWwgQXNzb2NpYXRpb24g
+Rm9yIEpQS0kxETAPBgNVBAsMCEJyaWRnZUNBMB4XDTAzMTIyNzA1MDgxNVoXDTEz
+MTIyNjE0NTk1OVowWjELMAkGA1UEBhMCSlAxDTALBgNVBAoMBEpQS0kxKTAnBgNV
+BAsMIFByZWZlY3R1cmFsIEFzc29jaWF0aW9uIEZvciBKUEtJMREwDwYDVQQLDAhC
+cmlkZ2VDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANTnUmg7K3m8
+52vd77kwkq156euwoWm5no8E8kmaTSc7x2RABPpqNTlMKdZ6ttsyYrqREeDkcvPL
+yF7yf/I8+innasNtsytcTAy8xY8Avsbd4JkCGW9dyPjk9pzzc3yLQ64Rx2fujRn2
+agcEVdPCr/XpJygX8FD5bbhkZ0CVoiASBmlHOcC3YpFlfbT1QcpOSOb7o+VdKVEi
+MMfbBuU2IlYIaSr/R1nO7RPNtkqkFWJ1/nKjKHyzZje7j70qSxb+BTGcNgTHa1YA
+UrogKB+UpBftmb4ds+XlkEJ1dvwokiSbCDaWFKD+YD4B2s0bvjCbw8xuZFYGhNyR
+/2D5XfN1s2MCAwEAAaOCATkwggE1MA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E
+BTADAQH/MG0GA1UdHwRmMGQwYqBgoF6kXDBaMQswCQYDVQQGEwJKUDENMAsGA1UE
+CgwESlBLSTEpMCcGA1UECwwgUHJlZmVjdHVyYWwgQXNzb2NpYXRpb24gRm9yIEpQ
+S0kxETAPBgNVBAsMCEJyaWRnZUNBMIGDBgNVHREEfDB6pHgwdjELMAkGA1UEBhMC
+SlAxJzAlBgNVBAoMHuWFrOeahOWAi+S6uuiqjeiovOOCteODvOODk+OCuTEeMBwG
+A1UECwwV6YO96YGT5bqc55yM5Y2U6K2w5LyaMR4wHAYDVQQLDBXjg5bjg6rjg4Pj
+grjoqo3oqLzlsYAwHQYDVR0OBBYEFNQXMiCqQNkR2OaZmQgLtf8mR8p8MA0GCSqG
+SIb3DQEBBQUAA4IBAQATjJo4reTNPC5CsvAKu1RYT8PyXFVYHbKsEpGt4GR8pDCg
+HEGAiAhHSNrGh9CagZMXADvlG0gmMOnXowriQQixrtpkmx0TB8tNAlZptZWkZC+R
+8TnjOkHrk2nFAEC3ezbdK0R7MR4tJLDQCnhEWbg50rf0wZ/aF8uAaVeEtHXa6W0M
+Xq3dSe0XAcrLbX4zZHQTaWvdpLAIjl6DZ3SCieRMyoWUL+LXaLFdTP5WBCd+No58
+IounD9X4xxze2aeRVaiV/WnQ0OSPNS7n7YXy6xQdnaOU4KRW/Lne1EDf5IfWC/ih
+bVAmhZMbcrkWWcsR6aCPG+2mV3zTD6AUzuKPal8Y
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJB
+VDFIMEYGA1UECgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBp
+bSBlbGVrdHIuIERhdGVudmVya2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5R
+dWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5RdWFsLTAzMB4XDTA1MDgxNzIyMDAw
+MFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgwRgYDVQQKDD9BLVRy
+dXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0ZW52
+ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMM
+EEEtVHJ1c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
+AQCtPWFuA/OQO8BBC4SAzewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUj
+lUC5B3ilJfYKvUWG6Nm9wASOhURh73+nyfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZ
+znF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPESU7l0+m0iKsMrmKS1GWH
+2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4iHQF63n1
+k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs
+2e3Vcuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYD
+VR0OBAoECERqlWdVeRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC
+AQEAVdRU0VlIXLOThaq/Yy/kgM40ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fG
+KOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmrsQd7TZjTXLDR8KdCoLXEjq/+
+8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZdJXDRZslo+S4R
+FGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS
+mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmE
+DNuxUCAKGkq6ahq97BvIxYSazQ==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx
+EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT
+EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp
+ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz
+NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH
+EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE
+AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw
+DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD
+E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH
+/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy
+DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh
+GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR
+tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA
+AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE
+FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX
+WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu
+9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr
+gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo
+2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO
+LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI
+4uJEvlz36hz1
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G
+A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp
+Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1
+MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG
+A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL
+v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8
+eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq
+tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd
+C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa
+zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB
+mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH
+V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n
+bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG
+3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs
+J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO
+291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS
+ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd
+AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7
+TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G
+A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp
+Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4
+MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG
+A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8
+RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT
+gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm
+KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd
+QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ
+XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw
+DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o
+LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU
+RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp
+jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK
+6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX
+mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs
+Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH
+WD9f
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDdTCCAl2gAwIBAgILAgAAAAAA1ni3lAUwDQYJKoZIhvcNAQEEBQAwVzELMAkG
+A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv
+b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw
+MDBaFw0xNDAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i
+YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT
+aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ
+jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp
+xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp
+1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG
+snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ
+U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8
+9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIABjAdBgNVHQ4EFgQU
+YHtmGkUNl8qJUC99BM00qP/8/UswDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0B
+AQQFAAOCAQEArqqf/LfSyx9fOSkoGJ40yWxPbxrwZKJwSk8ThptgKJ7ogUmYfQq7
+5bCdPTbbjwVR/wkxKh/diXeeDy5slQTthsu0AD+EAk2AaioteAuubyuig0SDH81Q
+gkwkr733pbTIWg/050deSY43lv6aiAU62cDbKYfmGZZHpzqmjIs8d/5GY6dT2iHR
+rH5Jokvmw2dZL7OKDrssvamqQnw1wdh/1acxOk5jQzmvCLBhNIzTmKlDNPYPhyk7
+ncJWWJh3w/cbrPad+D6qp1RF8PX51TFl/mtYnHGzHtdS6jIX/EBgHcl5JLL2bP2o
+Zg6C3ZjL2sJETy6ge/L3ayx2EYRGinij4w==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIETTCCAzWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBtMQswCQYDVQQGEwJDSDEO
+MAwGA1UEChMFYWRtaW4xETAPBgNVBAsTCFNlcnZpY2VzMSIwIAYDVQQLExlDZXJ0
+aWZpY2F0aW9uIEF1dGhvcml0aWVzMRcwFQYDVQQDEw5BZG1pbkNBLUNELVQwMTAe
+Fw0wNjAxMjUxMzM2MTlaFw0xNjAxMjUxMjM2MTlaMG0xCzAJBgNVBAYTAkNIMQ4w
+DAYDVQQKEwVhZG1pbjERMA8GA1UECxMIU2VydmljZXMxIjAgBgNVBAsTGUNlcnRp
+ZmljYXRpb24gQXV0aG9yaXRpZXMxFzAVBgNVBAMTDkFkbWluQ0EtQ0QtVDAxMIIB
+IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0jQlMZmpLDhV+GNR9TAoSNle
+JgQB4xAXJELQf5/ySMfoFA4MmjKqYXQkB6MGPuQKwR9XRRSPf61vqb8YPsdjRmgp
+byHBcUd5t0N8RX6wRZUnPMW+bCCo2VqAU4XFbnlc2gHKaam0wdTtbBTXEkv0ieIH
+fxCfFxXqSsSr60IkF/2/xbrAgV/QD5yHk6Ie8feAVWwi5UtaFqtu4LiFEh2QMyxs
+Oyz1OcvKzkM2g873tyiE7jzMgZP+Ww3tibk2F9+e6ZeiB37TLOmVtvgpmrws4fiI
+rFNXEYSWBVrUTbn81U47yWzOgf5fEHP07bRV5QOCzCm99qNimsbL6CG7nT78CQID
+AQABo4H3MIH0MBIGA1UdEwEB/wQIMAYBAf8CAQAwga4GA1UdIASBpjCBozCBoAYI
+YIV0AREDFQEwgZMwSAYIKwYBBQUHAgIwPBo6VGhpcyBpcyB0aGUgQWRtaW5DQS1D
+RC1UMDEgQ2VydGlmaWNhdGUgUHJhY3RpY2UgU3RhdGVtZW50LjBHBggrBgEFBQcC
+ARY7aHR0cDovL3d3dy5wa2kuYWRtaW4uY2gvcG9saWN5L0NQU18yXzE2Xzc1Nl8x
+XzE3XzNfMjFfMS5wZGYwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBQqxGkKocZV
+xgNucM6GgbOkD6oZ2zANBgkqhkiG9w0BAQUFAAOCAQEAn356bbusjI5glGXRQ1DR
+v21qQf0S4s3GHyZm7cqdOkFleM70ArBT+kOP5Nm7rlSAFyVgEkmBdOg7s9tlXClU
+yeZFnp6UEYRUcijPN8D1VaNRK6PIUObpDBQT0C+kAfxG9z4v29T0SxT4sgAdC/xQ
+Fyv58Fp9bPn7owuKwKcyCH1XSyi/Bp4XFELlLOaigBZO/w+dPBz4FcJSdZjU+BaJ
+0E3nKAjHlShO5ouBSZnaJz3p+nkw2Wyo36s6GxCK0XbkSP45iniIG4FmwwZkonYF
+ypQntHbx2oL7tUQQY0PDo8bGBMcPy/G2j+dciqZRlsnfgMy10SCzQ9MUx92xUG2V
+eg==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG
+EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3
+MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl
+cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR
+dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB
+pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM
+b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm
+aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz
+IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT
+lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz
+AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5
+VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG
+ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2
+BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG
+AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M
+U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh
+bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C
++C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC
+bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F
+uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2
+XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM
+MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D
+ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU
+cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3
+WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg
+Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw
+IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B
+AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH
+UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM
+TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU
+BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM
+kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x
+AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV
+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV
+HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y
+sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL
+I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8
+J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY
+VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI
+03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNV
+BAMML0VCRyBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx
+c8SxMTcwNQYDVQQKDC5FQkcgQmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXpt
+ZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAeFw0wNjA4MTcwMDIxMDlaFw0xNjA4
+MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25payBTZXJ0aWZpa2Eg
+SGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2ltIFRl
+a25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIi
+MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h
+4fuXd7hxlugTlkaDT7byX3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAk
+tiHq6yOU/im/+4mRDGSaBUorzAzu8T2bgmmkTPiab+ci2hC6X5L8GCcKqKpE+i4s
+tPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfreYteIAbTdgtsApWjluTL
+dlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZTqNGFav4
+c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8Um
+TDGyY5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z
++kI2sSXFCjEmN1ZnuqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0O
+Lna9XvNRiYuoP1Vzv9s6xiQFlpJIqkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMW
+OeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vmExH8nYQKE3vwO9D8owrXieqW
+fo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0Nokb+Clsi7n2
+l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB
+/wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgw
+FoAU587GT/wWZ5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+
+8ygjdsZs93/mQJ7ANtyVDR2tFcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI
+6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgmzJNSroIBk5DKd8pNSe/iWtkqvTDO
+TLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64kXPBfrAowzIpAoHME
+wfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqTbCmY
+Iai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJn
+xk1Gj7sURT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4Q
+DgZxGhBM/nV+/x5XOULK1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9q
+Kd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11t
+hie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQY9iJSrSq3RZj9W6+YKH4
+7ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9AahH3eU7
+QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML
+RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp
+bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5
+IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp
+ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3
+MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3
+LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp
+YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG
+A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq
+K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe
+sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX
+MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT
+XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/
+HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH
+4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV
+HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub
+j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo
+U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf
+zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b
+u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+
+bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er
+fF6adulZkMV8gzURZVE=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
-MIIGCDCCA/CgAwIBAgIBATANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290
-IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB
-IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA
-Y2FjZXJ0Lm9yZzAeFw0wNTEwMTQwNzM2NTVaFw0zMzAzMjgwNzM2NTVaMFQxFDAS
-BgNVBAoTC0NBY2VydCBJbmMuMR4wHAYDVQQLExVodHRwOi8vd3d3LkNBY2VydC5v
-cmcxHDAaBgNVBAMTE0NBY2VydCBDbGFzcyAzIFJvb3QwggIiMA0GCSqGSIb3DQEB
-AQUAA4ICDwAwggIKAoICAQCrSTURSHzSJn5TlM9Dqd0o10Iqi/OHeBlYfA+e2ol9
-4fvrcpANdKGWZKufoCSZc9riVXbHF3v1BKxGuMO+f2SNEGwk82GcwPKQ+lHm9WkB
-Y8MPVuJKQs/iRIwlKKjFeQl9RrmK8+nzNCkIReQcn8uUBByBqBSzmGXEQ+xOgo0J
-0b2qW42S0OzekMV/CsLj6+YxWl50PpczWejDAz1gM7/30W9HxM3uYoNSbi4ImqTZ
-FRiRpoWSR7CuSOtttyHshRpocjWr//AQXcD0lKdq1TuSfkyQBX6TwSyLpI5idBVx
-bgtxA+qvFTia1NIFcm+M+SvrWnIl+TlG43IbPgTDZCciECqKT1inA62+tC4T7V2q
-SNfVfdQqe1z6RgRQ5MwOQluM7dvyz/yWk+DbETZUYjQ4jwxgmzuXVjit89Jbi6Bb
-6k6WuHzX1aCGcEDTkSm3ojyt9Yy7zxqSiuQ0e8DYbF/pCsLDpyCaWt8sXVJcukfV
-m+8kKHA4IC/VfynAskEDaJLM4JzMl0tF7zoQCqtwOpiVcK01seqFK6QcgCExqa5g
-eoAmSAC4AcCTY1UikTxW56/bOiXzjzFU6iaLgVn5odFTEcV7nQP2dBHgbbEsPyyG
-kZlxmqZ3izRg0RS0LKydr4wQ05/EavhvE/xzWfdmQnQeiuP43NJvmJzLR5iVQAX7
-6QIDAQABo4G/MIG8MA8GA1UdEwEB/wQFMAMBAf8wXQYIKwYBBQUHAQEEUTBPMCMG
-CCsGAQUFBzABhhdodHRwOi8vb2NzcC5DQWNlcnQub3JnLzAoBggrBgEFBQcwAoYc
-aHR0cDovL3d3dy5DQWNlcnQub3JnL2NhLmNydDBKBgNVHSAEQzBBMD8GCCsGAQQB
-gZBKMDMwMQYIKwYBBQUHAgEWJWh0dHA6Ly93d3cuQ0FjZXJ0Lm9yZy9pbmRleC5w
-aHA/aWQ9MTAwDQYJKoZIhvcNAQEEBQADggIBAH8IiKHaGlBJ2on7oQhy84r3HsQ6
-tHlbIDCxRd7CXdNlafHCXVRUPIVfuXtCkcKZ/RtRm6tGpaEQU55tiKxzbiwzpvD0
-nuB1wT6IRanhZkP+VlrRekF490DaSjrxC1uluxYG5sLnk7mFTZdPsR44Q4Dvmw2M
-77inYACHV30eRBzLI++bPJmdr7UpHEV5FpZNJ23xHGzDwlVks7wU4vOkHx4y/CcV
-Bc/dLq4+gmF78CEQGPZE6lM5+dzQmiDgxrvgu1pPxJnIB721vaLbLmINQjRBvP+L
-ivVRIqqIMADisNS8vmW61QNXeZvo3MhN+FDtkaVSKKKs+zZYPumUK5FQhxvWXtaM
-zPcPEAxSTtAWYeXlCmy/F8dyRlecmPVsYGN6b165Ti/Iubm7aoW8mA3t+T6XhDSU
-rgCvoeXnkm5OvfPi2RSLXNLrAWygF6UtEOucekq9ve7O/e0iQKtwOIj1CodqwqsF
-YMlIBdpTwd5Ed2qz8zw87YC8pjhKKSRf/lk7myV6VmMAZLldpGJ9VzZPrYPvH5JT
-oI53V93lYRE9IwCQTDz6o2CTBKOvNfYOao9PSmCnhQVsRqGP9Md246FZV/dxssRu
-FFxtbUFm3xuTsdQAw+7Lzzw9IYCpX2Nl/N3gX6T0K/CFcUHUZyX7GrGXrtaZghNB
-0m6lG5kngOcLqagA
+MIIGJDCCBY2gAwIBAgIEQoaroDANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC
+VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u
+ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc
+KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u
+ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjA3
+MTQxNzEwMjhaFw0xNDA3MTQxNzQwMjhaMFwxCzAJBgNVBAYTAlVTMRUwEwYDVQQK
+EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xGzAZBgNV
+BAMTEkRpZ2lDZXJ0IEdsb2JhbCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBAMQ8vMy66mLmnkIjr7SyEa5ijdmh04/MFHIZ7Zn2/d5du1nAsMKvaplS
+lVcLNf/hhvqvosPBBWUnIHYvClQlfOor3ZVBV5sPO89H6AEGjMVESPwHLvNygzBR
+lJ5pOoOph5AU2V7EoniPwT7UGWEOGufcGpUgQb5vF9q4HEHumLD61x01PxanBCgT
+XT0FdZouhp4ssBeHIFhX7+HqVWC4LHAhrCljDBD8YLz51Rw3ZNW0+x6rJjlGiKTL
+zTBnwCZ55cpo+SLX5dKxu0hMmwuYW0KS5dLtDkcw+t0nVmNqpQHHjq/wTjsbVRVE
+1T5NVx7hkeq4oI/OOmNflom6CD7+RLsCAwEAAaOCAwUwggMBMBIGA1UdEwEB/wQI
+MAYBAf8CAQAwggEyBgNVHSAEggEpMIIBJTCCASEGCSqGSIb2fQdLAjCCARIwJgYI
+KwYBBQUHAgEWGmh0dHA6Ly93d3cuZW50cnVzdC5uZXQvY3BzMIHnBggrBgEFBQcC
+AjCB2hqB10ZvciB1c2Ugc29sZWx5IHdpdGggU1NMIGFuZCBTL01JTUUgY2VydGlm
+aWNhdGVzIGlzc3VlZCBieSBEaWdpY2VydCwgSW5jLiB0byBhdXRob3JpemVkIHN1
+YnNjcmliZXJzLg0KRE9FUyBOT1QgcmVwcmVzZW50IGFueSBlbmRvcnNlbWVudCBi
+eSBFbnRydXN0IEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMgYXMgdG8gdGhlIGlkZW50
+aXR5IG9mIGFueSBjZXJ0aWZpY2F0ZSBob2xkZXIuMDEGA1UdJQQqMCgGCCsGAQUF
+BwMBBggrBgEFBQcDAgYIKwYBBQUHAwQGCCsGAQUFBwMJMIIBGAYDVR0fBIIBDzCC
+AQswKKAmoCSGImh0dHA6Ly9jcmwuZW50cnVzdC5uZXQvc2VydmVyMS5jcmwwgd6g
+gduggdikgdUwgdIxCzAJBgNVBAYTAlVTMRQwEgYDVQQKEwtFbnRydXN0Lm5ldDE7
+MDkGA1UECxMyd3d3LmVudHJ1c3QubmV0L0NQUyBpbmNvcnAuIGJ5IHJlZi4gKGxp
+bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0
+ZWQxOjA4BgNVBAMTMUVudHJ1c3QubmV0IFNlY3VyZSBTZXJ2ZXIgQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkxDTALBgNVBAMTBENSTDEwCwYDVR0PBAQDAgEGMB8GA1Ud
+IwQYMBaAFPAXYhNVPbP/CgBr+1CEl/PtYtAaMB0GA1UdDgQWBBSnxxOgegE8ne+C
+SIJI1XNRthJWKjAZBgkqhkiG9n0HQQAEDDAKGwRWNy4xAwIAgTANBgkqhkiG9w0B
+AQUFAAOBgQBK8bPOaGnjWKNh7bYWyJOxGDA+4HLfTz3iTeG4/D/ByeNFqV2pwdqj
+5TbXjtYPrTavbLxE5ppGlKYRoNBS59pVsPYchftjUnu2mY8f4stHZKLrCGXmUdsc
+S21/U58eDTGT1DBdHm4BBydgXbvT9ONsHSAPdSozEKe3idepFxQyAw==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
-MIIHPTCCBSWgAwIBAgIBADANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290
-IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB
-IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA
-Y2FjZXJ0Lm9yZzAeFw0wMzAzMzAxMjI5NDlaFw0zMzAzMjkxMjI5NDlaMHkxEDAO
-BgNVBAoTB1Jvb3QgQ0ExHjAcBgNVBAsTFWh0dHA6Ly93d3cuY2FjZXJ0Lm9yZzEi
-MCAGA1UEAxMZQ0EgQ2VydCBTaWduaW5nIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJ
-ARYSc3VwcG9ydEBjYWNlcnQub3JnMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
-CgKCAgEAziLA4kZ97DYoB1CW8qAzQIxL8TtmPzHlawI229Z89vGIj053NgVBlfkJ
-8BLPRoZzYLdufujAWGSuzbCtRRcMY/pnCujW0r8+55jE8Ez64AO7NV1sId6eINm6
-zWYyN3L69wj1x81YyY7nDl7qPv4coRQKFWyGhFtkZip6qUtTefWIonvuLwphK42y
-fk1WpRPs6tqSnqxEQR5YYGUFZvjARL3LlPdCfgv3ZWiYUQXw8wWRBB0bF4LsyFe7
-w2t6iPGwcswlWyCR7BYCEo8y6RcYSNDHBS4CMEK4JZwFaz+qOqfrU0j36NK2B5jc
-G8Y0f3/JHIJ6BVgrCFvzOKKrF11myZjXnhCLotLddJr3cQxyYN/Nb5gznZY0dj4k
-epKwDpUeb+agRThHqtdB7Uq3EvbXG4OKDy7YCbZZ16oE/9KTfWgu3YtLq1i6L43q
-laegw1SJpfvbi1EinbLDvhG+LJGGi5Z4rSDTii8aP8bQUWWHIbEZAWV/RRyH9XzQ
-QUxPKZgh/TMfdQwEUfoZd9vUFBzugcMd9Zi3aQaRIt0AUMyBMawSB3s42mhb5ivU
-fslfrejrckzzAeVLIL+aplfKkQABi6F1ITe1Yw1nPkZPcCBnzsXWWdsC4PDSy826
-YreQQejdIOQpvGQpQsgi3Hia/0PsmBsJUUtaWsJx8cTLc6nloQsCAwEAAaOCAc4w
-ggHKMB0GA1UdDgQWBBQWtTIb1Mfz4OaO873SsDrusjkY0TCBowYDVR0jBIGbMIGY
-gBQWtTIb1Mfz4OaO873SsDrusjkY0aF9pHsweTEQMA4GA1UEChMHUm9vdCBDQTEe
-MBwGA1UECxMVaHR0cDovL3d3dy5jYWNlcnQub3JnMSIwIAYDVQQDExlDQSBDZXJ0
-IFNpZ25pbmcgQXV0aG9yaXR5MSEwHwYJKoZIhvcNAQkBFhJzdXBwb3J0QGNhY2Vy
-dC5vcmeCAQAwDwYDVR0TAQH/BAUwAwEB/zAyBgNVHR8EKzApMCegJaAjhiFodHRw
-czovL3d3dy5jYWNlcnQub3JnL3Jldm9rZS5jcmwwMAYJYIZIAYb4QgEEBCMWIWh0
-dHBzOi8vd3d3LmNhY2VydC5vcmcvcmV2b2tlLmNybDA0BglghkgBhvhCAQgEJxYl
-aHR0cDovL3d3dy5jYWNlcnQub3JnL2luZGV4LnBocD9pZD0xMDBWBglghkgBhvhC
-AQ0ESRZHVG8gZ2V0IHlvdXIgb3duIGNlcnRpZmljYXRlIGZvciBGUkVFIGhlYWQg
-b3ZlciB0byBodHRwOi8vd3d3LmNhY2VydC5vcmcwDQYJKoZIhvcNAQEEBQADggIB
-ACjH7pyCArpcgBLKNQodgW+JapnM8mgPf6fhjViVPr3yBsOQWqy1YPaZQwGjiHCc
-nWKdpIevZ1gNMDY75q1I08t0AoZxPuIrA2jxNGJARjtT6ij0rPtmlVOKTV39O9lg
-18p5aTuxZZKmxoGCXJzN600BiqXfEVWqFcofN8CCmHBh22p8lqOOLlQ+TyGpkO/c
-gr/c6EWtTZBzCDyUZbAEmXZ/4rzCahWqlwQ3JNgelE5tDlG+1sSPypZt90Pf6DBl
-Jzt7u0NDY8RD97LsaMzhGY4i+5jhe1o+ATc7iwiwovOVThrLm82asduycPAtStvY
-sONvRUgzEv/+PDIqVPfE94rwiCPCR/5kenHA0R6mY7AHfqQv0wGP3J8rtsYIqQ+T
-SCX8Ev2fQtzzxD72V7DX3WnRBnc0CkvSyqD/HMaMyRa+xMwyN2hzXwj7UfdJUzYF
-CpUCTPJ5GhD22Dp1nPMd8aINcGeGG7MW9S/lpOt5hvk9C8JzC6WZrG/8Z7jlLwum
-GCSNe9FINSkYQKyTYOGWhlC0elnYjyELn8+CkcY7v2vcB5G5l1YjqrZslMZIBjzk
-zk6q5PYvCdxTby78dOs6Y5nCpqyJvKeyRKANihDjbPIky/qbn3BHLt4Ui9SyIAmW
-omTxJBzcoTWcFbLUvFUufQb1nA5V9FrWk9p2rSVzTMVD
+MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOc
+UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx
+c8SxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xS
+S1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kg
+SGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcNMDUxMTA3MTAwNzU3
+WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVrdHJv
+bmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJU
+UjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSw
+bGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWe
+LiAoYykgS2FzxLFtIDIwMDUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
+AQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqeLCDe2JAOCtFp0if7qnef
+J1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKIx+XlZEdh
+R3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJ
+Qv2gQrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGX
+JHpsmxcPbe9TmJEr5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1p
+zpwACPI2/z7woQ8arBT9pmAPAgMBAAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58S
+Fq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8GA1UdEwEB/wQFMAMBAf8wDQYJ
+KoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/nttRbj2hWyfIvwq
+ECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4
+Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFz
+gw2lGh1uEpJ+hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotH
+uFEJjOp9zYhys2AzsfAKRO8P9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LS
+y3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5UrbnBEI=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIICPDCCAaUCEC0b/EoXjaOR6+f/9YtFvgswDQYJKoZIhvcNAQECBQAwXzELMAkG
+A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz
+cyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2
+MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV
+BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAyIFB1YmxpYyBQcmlt
+YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN
+ADCBiQKBgQC2WoujDWojg4BrzzmH9CETMwZMJaLtVRKXxaeAufqDwSCg+i8VDXyh
+YGt+eSz6Bg86rvYbb7HS/y8oUl+DfUvEerf4Zh+AVPy3wo5ZShRXRtGak75BkQO7
+FYCTXOvnzAhsPz6zSvz/S2wj1VCCJkQZjiPDceoZJEcEnnW/yKYAHwIDAQABMA0G
+CSqGSIb3DQEBAgUAA4GBAIobK/o5wXTXXtgZZKJYSi034DNHD6zt96rbHuSLBlxg
+J8pFUs4W7z8GZOeUaHxgMxURaa+dYo2jA1Rrpr7l7gUYYAS/QoD90KioHgE796Nc
+r6Pc5iaAIzy4RHT3Cq5Ji2F4zCS/iIqnDupzGUH9TQPwiNHleI2lKk/2lw0Xd8rY
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIETzCCAzegAwIBAgIEO63vKTANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQ
+TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu
+dHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBS
+b290Q0EwHhcNMDEwOTIzMTQxODE3WhcNMTEwOTIzMTMxODE3WjB1MQswCQYDVQQG
+EwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMb
+Q2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MR8wHQYDVQQDExZDQyBTaWduZXQg
+LSBDQSBLbGFzYSAxMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC4SRW9Q58g
+5DY1Hw7hgCRKBEdPdGn0MFHsfw7rlu/oQm7IChI/uWd9q5wwo77YojtTDjRnpgZs
+jqBeynX8T90vFILqsY2K5CF1OESalwvVr3sZiQX79lisuFKat92u6hBFikFIVxfH
+HB67Af+g7u0dEHdDW7lwy81MwFYxBTRy9wIDAQABo4IBbTCCAWkwDwYDVR0TAQH/
+BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwggEEBgNVHSAEgfwwgfkwgfYGDSsGAQQB
+vj8CAQoBAQAwgeQwgZoGCCsGAQUFBwICMIGNGoGKQ2VydHlmaWthdCB3eXN0YXdp
+b255IHpnb2RuaWUgeiBkb2t1bWVudGVtOiAiUG9saXR5a2EgQ2VydHlmaWthY2pp
+IGRsYSBSb290Q0EiLiBDZXJ0eWZpa2F0IHd5c3Rhd2lvbnkgcHJ6ZXogUm9vdENB
+IHcgaGllcmFyY2hpaSBDQyBTaWduZXQuMEUGCCsGAQUFBwIBFjlodHRwOi8vd3d3
+LnNpZ25ldC5wbC9yZXBvenl0b3JpdW0vZG9rdW1lbnR5L3BjX3Jvb3RjYS50eHQw
+HwYDVR0jBBgwFoAUwJvFIw0C4aZOSGsfAOnjmhQbsa8wHQYDVR0OBBYEFMODHtVZ
+d1T7TftXR/nEI1zR54njMA0GCSqGSIb3DQEBBQUAA4IBAQBRIHQBFIGh8Jpxt87A
+gSLwIEEk4+oGy769u3NtoaR0R3WNMdmt7fXTi0tyTQ9V4AIszxVjhnUPaKnF1KYy
+f8Tl+YTzk9ZfFkZ3kCdSaILZAOIrmqWNLPmjUQ5/JiMGho0e1YmWUcMci84+pIis
+TsytFzVP32/W+sz2H4FQAvOIMmxB7EJX9AdbnXn9EXZ+4nCqi0ft5z96ZqOJJiCB
+3vSaoYg+wdkcvb6souMJzuc2uptXtR1Xf3ihlHaGW+hmnpcwFA6AoNrom6Vgzk6U
+1ienx0Cw28BhRSKqzKkyXkuK8gRflZUx84uftXncwKJrMiE3lvgOOBITRzcahirL
+er4c
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx
+FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg
+Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG
+A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr
+b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
+AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ
+jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn
+PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh
+ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9
+nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h
+q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED
+MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC
+mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3
+7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB
+oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs
+EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO
+fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi
+AmvZWg==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCB
+lzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug
+Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho
+dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3Qt
+SGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgxOTIyWjCBlzELMAkG
+A1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEe
+MBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8v
+d3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdh
+cmUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn
+0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlIwrthdBKWHTxqctU8EGc6Oe0rE81m65UJ
+M6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFdtqdt++BxF2uiiPsA3/4a
+MXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8i4fDidNd
+oI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqI
+DsjfPe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9Ksy
+oUhbAgMBAAGjgbkwgbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYD
+VR0OBBYEFKFyXyYbKJhDlV0HN9WFlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0
+dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3YXJlLmNy
+bDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUFBwMGBggrBgEF
+BQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM
+//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28Gpgoiskli
+CE7/yMgUsogWXecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gE
+CJChicsZUN/KHAG8HQQZexB2lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t
+3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kniCrVWFCVH/A7HFe7fRQ5YiuayZSS
+KqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67nfhmqA==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBb
+MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3Qx
+ETAPBgNVBAsTCERTVCBBQ0VTMRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0w
+MzExMjAyMTE5NThaFw0xNzExMjAyMTE5NThaMFsxCzAJBgNVBAYTAlVTMSAwHgYD
+VQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UECxMIRFNUIEFDRVMx
+FzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPu
+ktKe1jzIDZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7
+gLFViYsx+tC3dr5BPTCapCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZH
+fAjIgrrep4c9oW24MFbCswKBXy314powGCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4a
+ahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPyMjwmR/onJALJfh1biEIT
+ajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1UdEwEB/wQF
+MAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rk
+c3QuY29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjto
+dHRwOi8vd3d3LnRydXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMt
+aW5kZXguaHRtbDAdBgNVHQ4EFgQUCXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZI
+hvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V25FYrnJmQ6AgwbN99Pe7lv7Uk
+QIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6tFr8hlxCBPeP/
+h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq
+nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpR
+rscL9yuwNwXsvFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf2
+9w4LTJxoeHtxMcfrHuBnQfO3oKfN5XozNmr6mis=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARwxCzAJBgNVBAYTAkVT
+MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE
+ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE
+ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEzMDEGA1UECxMq
+SVBTIENBIENoYWluZWQgQ0FzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MTMwMQYD
+VQQDEypJUFMgQ0EgQ2hhaW5lZCBDQXMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx
+HjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczAeFw0wMTEyMjkwMDUzNTha
+Fw0yNTEyMjcwMDUzNThaMIIBHDELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNl
+bG9uYTESMBAGA1UEBxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQg
+cHVibGlzaGluZyBTZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMu
+ZXMgQy5JLkYuICBCLTYwOTI5NDUyMTMwMQYDVQQLEypJUFMgQ0EgQ2hhaW5lZCBD
+QXMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxMzAxBgNVBAMTKklQUyBDQSBDaGFp
+bmVkIENBcyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3DQEJARYP
+aXBzQG1haWwuaXBzLmVzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDcVpJJ
+spQgvJhPUOtopKdJC7/SMejHT8KGC/po/UNaivNgkjWZOLtNA1IhW/A3mTXhQSCB
+hYEFcYGdtJUZqV92NC5jNzVXjrQfQj8VXOF6wV8TGDIxya2+o8eDZh65nAQTy2nB
+Bt4wBrszo7Uf8I9vzv+W6FS+ZoCua9tBhDaiPQIDAQABo4IEQzCCBD8wHQYDVR0O
+BBYEFKGtMbH5PuEXpsirNPxShwkeYlJBMIIBTgYDVR0jBIIBRTCCAUGAFKGtMbH5
+PuEXpsirNPxShwkeYlJBoYIBJKSCASAwggEcMQswCQYDVQQGEwJFUzESMBAGA1UE
+CBMJQmFyY2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJ
+bnRlcm5ldCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0Bt
+YWlsLmlwcy5lcyBDLkkuRi4gIEItNjA5Mjk0NTIxMzAxBgNVBAsTKklQUyBDQSBD
+aGFpbmVkIENBcyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEzMDEGA1UEAxMqSVBT
+IENBIENoYWluZWQgQ0FzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZI
+hvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8E
+BQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYBBQUHAwMG
+CCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYB
+BAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMw
+EYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlwcy5lczBC
+BglghkgBhvhCAQ0ENRYzQ2hhaW5lZCBDQSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkg
+aHR0cDovL3d3dy5pcHMuZXMvMCkGCWCGSAGG+EIBAgQcFhpodHRwOi8vd3d3Lmlw
+cy5lcy9pcHMyMDAyLzA3BglghkgBhvhCAQQEKhYoaHR0cDovL3d3dy5pcHMuZXMv
+aXBzMjAwMi9pcHMyMDAyQ0FDLmNybDA8BglghkgBhvhCAQMELxYtaHR0cDovL3d3
+dy5pcHMuZXMvaXBzMjAwMi9yZXZvY2F0aW9uQ0FDLmh0bWw/MDkGCWCGSAGG+EIB
+BwQsFipodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3JlbmV3YWxDQUMuaHRtbD8w
+NwYJYIZIAYb4QgEIBCoWKGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcG9saWN5
+Q0FDLmh0bWwwbQYDVR0fBGYwZDAuoCygKoYoaHR0cDovL3d3dy5pcHMuZXMvaXBz
+MjAwMi9pcHMyMDAyQ0FDLmNybDAyoDCgLoYsaHR0cDovL3d3d2JhY2suaXBzLmVz
+L2lwczIwMDIvaXBzMjAwMkNBQy5jcmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUF
+BzABhhNodHRwOi8vb2NzcC5pcHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAERyMJ1W
+WKJBGyi3leGmGpVfp3hAK+/blkr8THFj2XOVvQLiogbHvpcqk4A0hgP63Ng9HgfN
+HnNDJGD1HWHc3JagvPsd4+cSACczAsDAK1M92GsDgaPb1pOVIO/Tln4mkImcJpvN
+b2ar7QMiRDjMWb2f2/YHogF/JsRj9SVCXmK9
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr
+MQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl
+cm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv
+bW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0MDAxNjEyWjBrMQsw
+CQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5h
+dGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1l
+cmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h
+2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4E
+lpF7sDPwsRROEW+1QK8bRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdV
+ZqW1LS7YgFmypw23RuwhY/81q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq
+299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0t
+vz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaL
+dXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD
+AgEGMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUF
+AAOCAQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR
+zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3
+LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGIxHYdkFsd
+7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBuYQa7FkKMcPcw
+++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt
+398znM/jra6O1I7mT1GvFpLgXPYHDw==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIH8jCCB1ugAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARIxCzAJBgNVBAYTAkVT
+MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE
+ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE
+ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEuMCwGA1UECxMl
+SVBTIENBIENMQVNFMyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMl
+SVBTIENBIENMQVNFMyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3
+DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAxMTIzMTExMTkzMVoXDTI1MTIyOTEx
+MTkzMVowggESMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQmFyY2Vsb25hMRIwEAYD
+VQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5n
+IFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4g
+IEItNjA5Mjk0NTIxLjAsBgNVBAsTJUlQUyBDQSBDTEFTRTMgQ2VydGlmaWNhdGlv
+biBBdXRob3JpdHkxLjAsBgNVBAMTJUlQUyBDQSBDTEFTRTMgQ2VydGlmaWNhdGlv
+biBBdXRob3JpdHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczCBnzAN
+BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAve2QhYLxoN2P3DVo4Xw+6Gyb2vDjfzvB
+JRvH+WFIXO3KItC1dJk2W7iFnsZJnb65Q6NDKxhwfQ4XnLuBSPqMVJ6EHB++I1p2
+pg0j7YOtec++o3ysS6zf1r01HSh8i85+AcGcgLO4Z79w9jtEGlSdrFhCLUjJJSEs
+XdzSbkEFrkMCAwEAAaOCBFIwggROMB0GA1UdDgQWBBT7o4z3Z4tAqk02rzCA6po7
+4C9o6DCCAUQGA1UdIwSCATswggE3gBT7o4z3Z4tAqk02rzCA6po74C9o6KGCARqk
+ggEWMIIBEjELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UE
+BxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBT
+ZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBC
+LTYwOTI5NDUyMS4wLAYDVQQLEyVJUFMgQ0EgQ0xBU0UzIENlcnRpZmljYXRpb24g
+QXV0aG9yaXR5MS4wLAYDVQQDEyVJUFMgQ0EgQ0xBU0UzIENlcnRpZmljYXRpb24g
+QXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYD
+VR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggr
+BgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIB
+FQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhC
+AQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGB
+D2lwc0BtYWlsLmlwcy5lczBCBglghkgBhvhCAQ0ENRYzQ0xBU0UzIENBIENlcnRp
+ZmljYXRlIGlzc3VlZCBieSBodHRwczovL3d3dy5pcHMuZXMvMCoGCWCGSAGG+EIB
+AgQdFhtodHRwczovL3d3dy5pcHMuZXMvaXBzMjAwMi8wOwYJYIZIAYb4QgEEBC4W
+LGh0dHBzOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTMuY3JsMEAG
+CWCGSAGG+EIBAwQzFjFodHRwczovL3d3dy5pcHMuZXMvaXBzMjAwMi9yZXZvY2F0
+aW9uQ0xBU0UzLmh0bWw/MD0GCWCGSAGG+EIBBwQwFi5odHRwczovL3d3dy5pcHMu
+ZXMvaXBzMjAwMi9yZW5ld2FsQ0xBU0UzLmh0bWw/MDsGCWCGSAGG+EIBCAQuFixo
+dHRwczovL3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lDTEFTRTMuaHRtbDB1BgNV
+HR8EbjBsMDKgMKAuhixodHRwczovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAy
+Q0xBU0UzLmNybDA2oDSgMoYwaHR0cHM6Ly93d3diYWNrLmlwcy5lcy9pcHMyMDAy
+L2lwczIwMDJDTEFTRTMuY3JsMC8GCCsGAQUFBwEBBCMwITAfBggrBgEFBQcwAYYT
+aHR0cDovL29jc3AuaXBzLmVzLzANBgkqhkiG9w0BAQUFAAOBgQAiu2FuR8MoQlYw
+3QtFc/BI7DgkUUeSIM49JoMU0H3a4Y+JbQxQ4q/n6yAbEuMETUyqob/HmS/NkLJq
+ur3RvGBseDXgxNyePGjFc97ITNWf5X1+4CXtBf+TTKNEMg1UpPbCz+9EkjzTcYj1
+5tjLbAp/mmLLZmCOV7cCGuXGSTBNzA==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIG0zCCBbugAwIBAgIBADANBgkqhkiG9w0BAQUFADCBzDELMAkGA1UEBhMCQVQx
+EDAOBgNVBAgTB0F1c3RyaWExDzANBgNVBAcTBlZpZW5uYTE6MDgGA1UEChMxQVJH
+RSBEQVRFTiAtIEF1c3RyaWFuIFNvY2lldHkgZm9yIERhdGEgUHJvdGVjdGlvbjEl
+MCMGA1UECxMcQS1DRVJUIENlcnRpZmljYXRpb24gU2VydmljZTEYMBYGA1UEAxMP
+QS1DRVJUIEFEVkFOQ0VEMR0wGwYJKoZIhvcNAQkBFg5pbmZvQGEtY2VydC5hdDAe
+Fw0wNDEwMjMxNDE0MTRaFw0xMTEwMjMxNDE0MTRaMIHMMQswCQYDVQQGEwJBVDEQ
+MA4GA1UECBMHQXVzdHJpYTEPMA0GA1UEBxMGVmllbm5hMTowOAYDVQQKEzFBUkdF
+IERBVEVOIC0gQXVzdHJpYW4gU29jaWV0eSBmb3IgRGF0YSBQcm90ZWN0aW9uMSUw
+IwYDVQQLExxBLUNFUlQgQ2VydGlmaWNhdGlvbiBTZXJ2aWNlMRgwFgYDVQQDEw9B
+LUNFUlQgQURWQU5DRUQxHTAbBgkqhkiG9w0BCQEWDmluZm9AYS1jZXJ0LmF0MIIB
+IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3euXIy+mnf6BYKbK+QH5k679
+tUFqeT8jlZxMew8eNiHuw9KoxWBzL6KksK+5uK7Gatw+sbAYntEGE80P+Jg1hADM
+e+Fr5V0bc6QS3gkVtfUCW/RIvfMM39oxvmqJmOgPnJU7H6+nmLtsq61tv9kVJi/2
+4Y5wXW3odet72sF57EoG6s78w0BUVLNcMngS9bZZzmdG3/d6JbkGgoNF/8DcgCBJ
+W/t0JrcIzyppXIOVtUzzOrrU86zuUgT3Rtkl5kjG7DEHpFb9H0fTOY1v8+gRoaO6
+2gA0PCiysgVZjwgVeYe3KAg11nznyleDv198uK3Dc1oXIGYjJx2FpKWUvAuAEwID
+AQABo4ICvDCCArgwHQYDVR0OBBYEFDd/Pj6ZcWDKJNSRE3nQdCm0qCTYMIH5BgNV
+HSMEgfEwge6AFDd/Pj6ZcWDKJNSRE3nQdCm0qCTYoYHSpIHPMIHMMQswCQYDVQQG
+EwJBVDEQMA4GA1UECBMHQXVzdHJpYTEPMA0GA1UEBxMGVmllbm5hMTowOAYDVQQK
+EzFBUkdFIERBVEVOIC0gQXVzdHJpYW4gU29jaWV0eSBmb3IgRGF0YSBQcm90ZWN0
+aW9uMSUwIwYDVQQLExxBLUNFUlQgQ2VydGlmaWNhdGlvbiBTZXJ2aWNlMRgwFgYD
+VQQDEw9BLUNFUlQgQURWQU5DRUQxHTAbBgkqhkiG9w0BCQEWDmluZm9AYS1jZXJ0
+LmF0ggEAMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgHmMEcGA1UdJQRAMD4G
+CCsGAQUFBwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcD
+CAYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAP8wUQYDVR0gBEowSDBGBggq
+KAAYAQEBAzA6MDgGCCsGAQUFBwIBFixodHRwOi8vd3d3LmEtY2VydC5hdC9jZXJ0
+aWZpY2F0ZS1wb2xpY3kuaHRtbDA7BglghkgBhvhCAQgELhYsaHR0cDovL3d3dy5h
+LWNlcnQuYXQvY2VydGlmaWNhdGUtcG9saWN5Lmh0bWwwGQYDVR0RBBIwEIEOaW5m
+b0BhLWNlcnQuYXQwLwYDVR0SBCgwJoEOaW5mb0BhLWNlcnQuYXSGFGh0dHA6Ly93
+d3cuYS1jZXJ0LmF0MEUGA1UdHwQ+MDwwOqA4oDaGNGh0dHBzOi8vc2VjdXJlLmEt
+Y2VydC5hdC9jZ2ktYmluL2EtY2VydC1hZHZhbmNlZC5jZ2kwDQYJKoZIhvcNAQEF
+BQADggEBACX1IvgfdG2rvfv35O48vSEvcVaEdlN8USFBHWz3JRAozgzvaBtwHkjK
+Zwt5l/BWOtjbvHfRjDt7ijlBEcxOOrNC1ffyMHwHrXpvff6YpQ5wnxmIYEQcURiG
+HMqruEX0WkuDNgSKwefsgXs27eeBauHgNGVcTYH1rmHu/ZyLpLxOyJQ2PCzA1DzW
+3rWkIX92ogJ7lTRdWrbxwUL1XGinxnnaQ74+/y0pI9JNEv7ic2tpkweRMpkedaLW
+msC1+orfKTebsg69aMaCx7o6jNONRmR/7TVaPf8/k6g52cHZ9YWjQvup22b5rWxG
+J5r5LZ4vCPmF4+T4lutjUYAa/lGuQTg=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBM
+MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD
+QTAeFw0wMjA2MTExMDQ2MzlaFw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBM
+MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD
+QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6xwS7TT3zNJc4YPk/E
+jG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdLkKWo
+ePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GI
+ULdtlkIJ89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapu
+Ob7kky/ZR6By6/qmW6/KUz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUg
+AKpoC6EahQGcxEZjgoi2IrHu/qpGWX7PNSzVttpd90gzFFS269lvzs2I1qsb2pY7
+HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEA
+uI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+GXYkHAQa
+TOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTg
+xSvgGrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1q
+CjqTE5s7FCMTY5w/0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5x
+O/fIR/RpbxXyEV6DHpx8Uq79AtoSqFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs
+6GAqm4VKQPNriiTsBhYscw==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j
+ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL
+MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3
+LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug
+RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm
++9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW
+PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM
+xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB
+Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3
+hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg
+EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF
+MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA
+FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec
+nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z
+eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF
+hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2
+Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
+vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep
++OkuE6N36B9K
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhV
+MRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMe
+TmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0
+dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFzcyBB
+KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oXDTE5MDIxOTIzMTQ0
+N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhC
+dWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQu
+MRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBL
+b3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG
+9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSMD7tM9DceqQWC2ObhbHDqeLVu0ThEDaiD
+zl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZz+qMkjvN9wfcZnSX9EUi
+3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC/tmwqcm8
+WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LY
+Oph7tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2Esi
+NCubMvJIH5+hCoR64sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCC
+ApswDgYDVR0PAQH/BAQDAgAGMBIGA1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4
+QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZRUxFTSEgRXplbiB0
+YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRhdGFz
+aSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu
+IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtm
+ZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMg
+ZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVs
+amFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJhc2EgbWVndGFsYWxoYXRv
+IGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBzOi8vd3d3
+Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6
+ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1
+YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3Qg
+dG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRs
+b2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNAbmV0bG9jay5uZXQuMA0G
+CSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5ayZrU3/b39/zcT0mwBQO
+xmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjPytoUMaFP
+0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQ
+QeJBCWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxk
+f1qbFFgBJ34TUMdrKuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK
+8CtmdWOMovsEPoMOmzbwGOQmIMOM8CgHrTwXZoi1/baI
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcExCzAJ
+BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh
+c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy
+MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp
+emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X
+DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw
+FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMg
+UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo
+YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5
+MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB
+AQUAA4GNADCBiQKBgQCq0Lq+Fi24g9TK0g+8djHKlNgdk4xWArzZbxpvUjZudVYK
+VdPfQ4chEWWKfo+9Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIqWpDBucSm
+Fc/IReumXY6cPvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQID
+AQABMA0GCSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0J
+h9ZrbWB85a7FkCMMXErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2ul
+uIncrKTdcu1OofdPvAbT6shkdHvClUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4iP/68
+DzFc6PLZ
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFGjCCBAKgAwIBAgIEPV0tNDANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQ
+TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu
+dHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBS
+b290Q0EwHhcNMDIwODE2MTY0OTU2WhcNMjYwOTIxMTU0MjE5WjB2MQswCQYDVQQG
+EwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMb
+Q2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MSAwHgYDVQQDExdDQyBTaWduZXQg
+LSBQQ0EgS2xhc2EgMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALN3
+LanJtdueNe6geWUTFENa+lEuzqELcoqhYB+a/tJcPEkc6TX/bYPzalRRjqs+quMP
+6KZTU0DixOrV+K7iWaqAiQ913HX5IBLmKDCrTVW/ZvSDpiBKbxlHfSNuJxAuVT6H
+dbzK7yAW38ssX+yS2tZYHZ5FhZcfqzPEOpO94mAKcBUhk6T/ki0evXX/ZvvktwmF
+3hKattzwtM4JMLurAEl8SInyEYULw5JdlfcBez2Tg6Dbw34hA1A+ckTwhxzecrB8
+TUe2BnQKOs9vr2cCACpFFcOmPkM0Drtjctr1QHm1tYSqRFRf9VcV5tfC3P8QqoK4
+ONjtLPHc9x5NE1uK/FMCAwEAAaOCAbMwggGvMA8GA1UdEwEB/wQFMAMBAf8wDgYD
+VR0PAQH/BAQDAgEGMIIBBAYDVR0gBIH8MIH5MIH2Bg0rBgEEAb4/AgEKAQECMIHk
+MIGaBggrBgEFBQcCAjCBjRqBikNlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmll
+IHogZG9rdW1lbnRlbTogIlBvbGl0eWthIENlcnR5ZmlrYWNqaSBkbGEgUm9vdENB
+Ii4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6IFJvb3RDQSB3IGhpZXJhcmNo
+aWkgQ0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5zaWduZXQucGwv
+cmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY19yb290Y2EudHh0MEQGA1UdHwQ9MDsw
+OaA3oDWGM2h0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9yb290Y2Ev
+cm9vdGNhLmNybDAfBgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAdBgNV
+HQ4EFgQUXvthcPHlH5BgGhlMErJNXWlhlgAwDQYJKoZIhvcNAQEFBQADggEBACIc
+e95Mvn710KCAISA0CuHD4aznTU6pLoCDShW47OR+GTpJUm1coTcUqlBHV9mra4VF
+rBcBuOkHZoBLq/jmE0QJWnpSEULDcH9J3mF0nqO9SM+mWyJGdsJF/XU/7smummgj
+MNQXwzQTtWORF+6v5KUbWX85anO2wR+M6YTBWC55zWpWi4RG3vkHFs5Ze2oFJTlp
+uxw9ZgxTnWlwI9QR2MvEhYIUMKMOWxw1nt0kKj+5TCNQQGh/VJJ1dsiroGh/io1D
+OcePEhKz1Ag52y6Wf0nJJB9yk0sFakqZH18F7eQecQImgZyyeRtsG95leNugB3BX
+WCW+KxwiBrtQTXv4dTE=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYT
+AkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQ
+TS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG
+9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMB4XDTAyMTIxMzE0MjkyM1oXDTIw
+MTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAM
+BgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEO
+MAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2
+LmZyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaI
+s9z4iPf930Pfeo2aSVz2TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2
+xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCWSo7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4
+u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYyHF2fYPepraX/z9E0+X1b
+F8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNdfrGoRpAx
+Vs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGd
+PDPQtQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNV
+HSAEDjAMMAoGCCqBegF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAx
+NjAfBgNVHSMEGDAWgBSjBS8YYFDCiQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUF
+AAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RKq89toB9RlPhJy3Q2FLwV3duJ
+L92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3QMZsyK10XZZOY
+YLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg
+Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2a
+NjSaTFR+FwNIlQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R
+0982gaEbeC9xs/FZTEYYKKuF0mBWWg==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIH/zCCB2igAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARwxCzAJBgNVBAYTAkVT
+MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE
+ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE
+ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEzMDEGA1UECxMq
+SVBTIENBIENoYWluZWQgQ0FzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MTMwMQYD
+VQQDEypJUFMgQ0EgQ2hhaW5lZCBDQXMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx
+HjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczAeFw0wMTEyMzExMTE0NTRa
+Fw0yNTEyMjkxMTE0NTRaMIIBHDELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNl
+bG9uYTESMBAGA1UEBxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQg
+cHVibGlzaGluZyBTZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMu
+ZXMgQy5JLkYuICBCLTYwOTI5NDUyMTMwMQYDVQQLEypJUFMgQ0EgQ2hhaW5lZCBD
+QXMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxMzAxBgNVBAMTKklQUyBDQSBDaGFp
+bmVkIENBcyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3DQEJARYP
+aXBzQG1haWwuaXBzLmVzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCpOZZJ
+iHAzKHzoV9xIki3eLXp56UjxFehnY+c+Dh1nUiVO0t//vmGMP6B2LTFfx9FBKRBi
+kYcW7raIcSDi62Or0sAG5UUgG4ruGLE7XtCnnx4xjgbFZ4tTjdgi5Wh9GVhfP7Oo
+9ahi8Eqao+alFbhvB6LD3xZZqM2j9cmD8GzYAQIDAQABo4IESzCCBEcwHQYDVR0O
+BBYEFAeUqHBsCqTumbhV3S5MRXf2Nq+5MIIBTgYDVR0jBIIBRTCCAUGAFAeUqHBs
+CqTumbhV3S5MRXf2Nq+5oYIBJKSCASAwggEcMQswCQYDVQQGEwJFUzESMBAGA1UE
+CBMJQmFyY2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJ
+bnRlcm5ldCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0Bt
+YWlsLmlwcy5lcyBDLkkuRi4gIEItNjA5Mjk0NTIxMzAxBgNVBAsTKklQUyBDQSBD
+aGFpbmVkIENBcyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEzMDEGA1UEAxMqSVBT
+IENBIENoYWluZWQgQ0FzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZI
+hvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8E
+BQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYBBQUHAwMG
+CCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYB
+BAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMw
+EYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlwcy5lczBD
+BglghkgBhvhCAQ0ENhY0Q2hhaW5lZCBDQSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkg
+aHR0cHM6Ly93d3cuaXBzLmVzLzAqBglghkgBhvhCAQIEHRYbaHR0cHM6Ly93d3cu
+aXBzLmVzL2lwczIwMDIvMDgGCWCGSAGG+EIBBAQrFilodHRwczovL3d3dy5pcHMu
+ZXMvaXBzMjAwMi9pcHMyMDAyQ0FDLmNybDA9BglghkgBhvhCAQMEMBYuaHR0cHM6
+Ly93d3cuaXBzLmVzL2lwczIwMDIvcmV2b2NhdGlvbkNBQy5odG1sPzA6BglghkgB
+hvhCAQcELRYraHR0cHM6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmVuZXdhbENBQy5o
+dG1sPzA4BglghkgBhvhCAQgEKxYpaHR0cHM6Ly93d3cuaXBzLmVzL2lwczIwMDIv
+cG9saWN5Q0FDLmh0bWwwbwYDVR0fBGgwZjAvoC2gK4YpaHR0cHM6Ly93d3cuaXBz
+LmVzL2lwczIwMDIvaXBzMjAwMkNBQy5jcmwwM6AxoC+GLWh0dHBzOi8vd3d3YmFj
+ay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0FDLmNybDAvBggrBgEFBQcBAQQjMCEw
+HwYIKwYBBQUHMAGGE2h0dHA6Ly9vY3NwLmlwcy5lcy8wDQYJKoZIhvcNAQEFBQAD
+gYEATiRvY2nro9B6QNgTOgojWSrXMKpXHa6hLRxL2GZPEFg059x2ERs3pw7RlJJZ
+ctupZam06zvBnGfQL4ZhevXl6ST6RAAmOikuj8kbiFSgujjCJY1wv5/7zzgBWzdL
+NzqKC18p1T2KZa8B2qKfQCqzV/J3fgI/725+9ekqKNLiE5Q=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc
+MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj
+IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB
+IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE
+RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl
+U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290
+IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU
+ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC
+QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr
+rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S
+NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc
+QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH
+txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP
+BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC
+AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp
+tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa
+IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl
+6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+
+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU
+Cm26OWMohpLzGITY+9HPBVZkVw==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFaDCCBFCgAwIBAgIQO1nHe81bV569N1KsdrSqGjANBgkqhkiG9w0BAQUFADBi
+MRIwEAYDVQQKEwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENB
+czEvMC0GA1UEAxMmYmVUUlVTVGVkIFJvb3QgQ0EgLSBSU0EgSW1wbGVtZW50YXRp
+b24wHhcNMDIwNDExMTExODEzWhcNMjIwNDEyMTEwNzI1WjBiMRIwEAYDVQQKEwli
+ZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEvMC0GA1UEAxMm
+YmVUUlVTVGVkIFJvb3QgQ0EgLSBSU0EgSW1wbGVtZW50YXRpb24wggEiMA0GCSqG
+SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkujQwCY5X0LkGLG9uJIAiv11DpvpPrILn
+HGhwhRujbrWqeNluB0s/6d/16uhUoWGKDi9pdRi3DOUUjXFumLhV/AyV0Jtu4S2I
+1DpAa5LxmZZk3tv/ePTulh1HiXzUvrmIdyM6CeYEnm2qXtLIvZpOGd+J6lsOfsPk
+tPDgaTuID0GQ+NRxQyTBjyZLO1bp/4xsN+lFrYWMU8NghpBKlsmzVLC7F/AcRdnU
+GxlkVgoZ98zh/4avflherHqQH8koOUV7orbHnB/ahdQhhlkwk75TMzf270HPM8er
+cmsl9fNTGwxMLvF1S++gh/f+ihXQbNXL+WhTuXAVE8L1LvtDNXUtAgMBAAGjggIY
+MIICFDAMBgNVHRMEBTADAQH/MIIBtQYDVR0gBIIBrDCCAagwggGkBg8rBgEEAbE+
+AAADCSiDkTEwggGPMEEGCCsGAQUFBwIBFjVodHRwOi8vd3d3LmJldHJ1c3RlZC5j
+b20vcHJvZHVjdHNfc2VydmljZXMvaW5kZXguaHRtbDCCAUgGCCsGAQUFBwICMIIB
+OhqCATZSZWxpYW5jZSBvbiBvciB1c2Ugb2YgdGhpcyBDZXJ0aWZpY2F0ZSBjcmVh
+dGVzIGFuIGFja25vd2xlZGdtZW50IGFuZCBhY2NlcHRhbmNlIG9mIHRoZSB0aGVu
+IGFwcGxpY2FibGUgc3RhbmRhcmQgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdXNl
+LCB0aGUgQ2VydGlmaWNhdGlvbiBQcmFjdGljZSBTdGF0ZW1lbnQgYW5kIHRoZSBS
+ZWx5aW5nIFBhcnR5IEFncmVlbWVudCwgd2hpY2ggY2FuIGJlIGZvdW5kIGF0IHRo
+ZSBiZVRSVVNUZWQgd2ViIHNpdGUsIGh0dHA6Ly93d3cuYmV0cnVzdGVkLmNvbS9w
+cm9kdWN0c19zZXJ2aWNlcy9pbmRleC5odG1sMAsGA1UdDwQEAwIBBjAfBgNVHSME
+GDAWgBSp7BR++dlDzFMrFK3P9/BZiUHNGTAdBgNVHQ4EFgQUqewUfvnZQ8xTKxSt
+z/fwWYlBzRkwDQYJKoZIhvcNAQEFBQADggEBANuXsHXqDMTBmMpWBcCorSZIry0g
+6IHHtt9DwSwddUvUQo3neqh03GZCWYez9Wlt2ames30cMcH1VOJZJEnl7r05pmuK
+mET7m9cqg5c0Lcd9NUwtNLg+DcTsiCevnpL9UGGCqGAHFFPMZRPB9kdEadIxyKbd
+LrML3kqNWz2rDcI1UqJWN8wyiyiFQpyRQHpwKzg21eFzGh/l+n5f3NacOzDq28Bb
+J1zTcwfBwvNMm2+fG8oeqqg4MwlYsq78B+g23FW6L09A/nq9BqaBwZMifIYRCgZ3
+SK41ty8ymmFei74pnykkiFY5LKjSq5YDWtRIn7lAhAuYaPsBQ9Yb4gmxlxw=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC
+VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u
+ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc
+KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u
+ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1
+MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE
+ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j
+b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF
+bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg
+U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA
+A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/
+I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3
+wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC
+AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb
+oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5
+BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p
+dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk
+MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp
+b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu
+dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0
+MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi
+E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa
+MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI
+hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN
+95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd
+2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEUzCCAzugAwIBAgIDAOJDMA0GCSqGSIb3DQEBBQUAMIHPMQswCQYDVQQGEwJB
+VDGBizCBiAYDVQQKHoGAAEEALQBUAHIAdQBzAHQAIABHAGUAcwAuACAAZgD8AHIA
+IABTAGkAYwBoAGUAcgBoAGUAaQB0AHMAcwB5AHMAdABlAG0AZQAgAGkAbQAgAGUA
+bABlAGsAdAByAC4AIABEAGEAdABlAG4AdgBlAHIAawBlAGgAcgAgAEcAbQBiAEgx
+GDAWBgNVBAsTD0EtVHJ1c3QtUXVhbC0wMTEYMBYGA1UEAxMPQS1UcnVzdC1RdWFs
+LTAxMB4XDTA0MTEzMDIzMDAwMFoXDTE0MTEzMDIzMDAwMFowgc8xCzAJBgNVBAYT
+AkFUMYGLMIGIBgNVBAoegYAAQQAtAFQAcgB1AHMAdAAgAEcAZQBzAC4AIABmAPwA
+cgAgAFMAaQBjAGgAZQByAGgAZQBpAHQAcwBzAHkAcwB0AGUAbQBlACAAaQBtACAA
+ZQBsAGUAawB0AHIALgAgAEQAYQB0AGUAbgB2AGUAcgBrAGUAaAByACAARwBtAGIA
+SDEYMBYGA1UECxMPQS1UcnVzdC1RdWFsLTAxMRgwFgYDVQQDEw9BLVRydXN0LVF1
+YWwtMDEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCmhgdxIbxTGEOH
+fXGiewI3NFldAWKFWfLofO+5I1UbvA5avt7IgsGXz/tI/f5HGUbascI0i7xG0tqV
+lA5ctQgLRqxgxHtgTkMcqsAEYdsz3LZsCdXO1QrvEBGLTSABdxiL/gSWJ6z77CSw
+x7Xg02HwxPV82cjGkSF3ENGJntuIAAnRDWn/ORHjFatNRymoMbHaOEZXSGhf7Y5F
+rrHEqGyi9E6sv784De/T1aTvskn8cWeUmDzv//omiG/a/V9KQex/61XN8OthUQVn
+X+u/liL2NKx74I2C/GgHX5B0WkPNqsSOgmlvJ/cKuT0PveUgVFDAA0oYBgcE1KDM
+lBbN0kmPAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0OBAoECEs8jB2F
+6W+tMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAIUusmJzMJRiQ
+8TAHrJAOelfuWoTGcqdIv7Tys/fNl2yF2fjvHT8J01aKialFVpbVeQ2XKb1O2bHO
+QYAKgsdZ2jZ/sdL2UVFRTHmidLu6PdgWCBRhJYQELQophO9QVvfhAA0TwbESYqTz
++nlI5Gr7CZe8f6HEmhJmCtUQsdQCufGglRh4T+tIGiNGcnyVEHZ93mSVepFr1VA2
+9CTRPteuGjA81jeAz9peYiFE1CXvxK9cJiv0BcALFLWmADCoRLzIRZhA+sAwYUmw
+M1rqVCPA3kBQvIC95tyQvNy2dG0Vs+O6PwLaNX/suSlElQ06X2l1VwMaYb4vZKFq
+N0bOhBXEVg==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC
+VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ
+cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ
+BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt
+VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D
+0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9
+ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G
+A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G
+A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs
+aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I
+flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV
+BAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2ln
+biBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBF
+MQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZT
+d2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
+CgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUqt2/8
+76LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+
+bbqBHH5CjCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c
+6bM8K8vzARO/Ws/BtQpgvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqE
+emA8atufK+ze3gE/bk3lUIbLtK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJd
+MmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdt
+MDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02y
+MszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69y
+FGkOpeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPi
+aG59je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM
+gI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCB
+qTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWyV7
+lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64OfPAeGZe6Drn
+8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov
+L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe6
+45R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczO
+UYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5
+O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCC
+bwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yv
+GPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a
+77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCC
+hdiDyyJkvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid3
+92qgQmwLOM7XdVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEpp
+Ld6leNcG2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+w
+ZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt
+Qc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl
+MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe
+U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX
+DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy
+dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj
+YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV
+OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr
+zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM
+VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ
+hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO
+ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw
+awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs
+OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3
+DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF
+coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc
+okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8
+t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy
+1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/
+SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDyzCCArOgAwIBAgIDAOJIMA0GCSqGSIb3DQEBBQUAMIGLMQswCQYDVQQGEwJB
+VDFIMEYGA1UECgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBp
+bSBlbGVrdHIuIERhdGVudmVya2VociBHbWJIMRgwFgYDVQQLDA9BLVRydXN0LVF1
+YWwtMDIxGDAWBgNVBAMMD0EtVHJ1c3QtUXVhbC0wMjAeFw0wNDEyMDIyMzAwMDBa
+Fw0xNDEyMDIyMzAwMDBaMIGLMQswCQYDVQQGEwJBVDFIMEYGA1UECgw/QS1UcnVz
+dCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBpbSBlbGVrdHIuIERhdGVudmVy
+a2VociBHbWJIMRgwFgYDVQQLDA9BLVRydXN0LVF1YWwtMDIxGDAWBgNVBAMMD0Et
+VHJ1c3QtUXVhbC0wMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJaR
+q9eOsFm4Ab20Hq2Z/aH86gyWa48uSUjY6eQkguHYuszr3gdcSMYZggFHQgnhfLmf
+ro/27l5rqKhWiDhWs+b+yZ1PNDhRPJy+86ycHMg9XJqErveULBSyZDdgjhSwOyrN
+ibUir/fkf+4sKzP5jjytTKJXD/uCxY4fAd9TjMEVpN3umpIS0ijpYhclYDHvzzGU
+833z5Dwhq5D8bc9jp8YSAHFJ1xzIoO1jmn3jjyjdYPnY5harJtHQL73nDQnfbtTs
+5ThT9GQLulrMgLU4WeyAWWWEMWpfVZFMJOUkmoOEer6A8e5fIAeqdxdsC+JVqpZ4
+CAKel/Arrlj1gFA//jsCAwEAAaM2MDQwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4E
+CgQIQj0rJKbBRc4wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBG
+yxFjUA2bPkXUSC2SfJ29tmrbiLKal+g6a9M8Xwd+Ejo+oYkNP6F4GfeDtAXpm7xb
+9Ly8lhdbHcpRhzCUQHJ1tBCiGdLgmhSx7TXjhhanKOdDgkdsC1T+++piuuYL72TD
+gUy2Sb1GHlJ1Nc6rvB4fpxSDAOHqGpUq9LWsc3tFkXqRqmQVtqtR77npKIFBioc6
+2jTBwDMPX3hDJDR1DSPc6BnZliaNw2IHdiMQ0mBoYeRnFdq+TyDKsjmJOOQPLzzL
+/saaw6F891+gBjLFEFquDyR73lAPJS279R3csi8WWk4ZYUC/1V8H3Ktip/J6ac8e
+qhLCbmJ81Lo92JGHz/ot
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEXzCCA0egAwIBAgIBATANBgkqhkiG9w0BAQUFADCB0DELMAkGA1UEBhMCRVMx
+SDBGBgNVBAoTP0laRU5QRSBTLkEuIC0gQ0lGIEEtMDEzMzcyNjAtUk1lcmMuVml0
+b3JpYS1HYXN0ZWl6IFQxMDU1IEY2MiBTODFCMEAGA1UEBxM5QXZkYSBkZWwgTWVk
+aXRlcnJhbmVvIEV0b3JiaWRlYSAzIC0gMDEwMTAgVml0b3JpYS1HYXN0ZWl6MRMw
+EQYDVQQDEwpJemVucGUuY29tMR4wHAYJKoZIhvcNAQkBFg9JbmZvQGl6ZW5wZS5j
+b20wHhcNMDMwMTMwMjMwMDAwWhcNMTgwMTMwMjMwMDAwWjCB0DELMAkGA1UEBhMC
+RVMxSDBGBgNVBAoTP0laRU5QRSBTLkEuIC0gQ0lGIEEtMDEzMzcyNjAtUk1lcmMu
+Vml0b3JpYS1HYXN0ZWl6IFQxMDU1IEY2MiBTODFCMEAGA1UEBxM5QXZkYSBkZWwg
+TWVkaXRlcnJhbmVvIEV0b3JiaWRlYSAzIC0gMDEwMTAgVml0b3JpYS1HYXN0ZWl6
+MRMwEQYDVQQDEwpJemVucGUuY29tMR4wHAYJKoZIhvcNAQkBFg9JbmZvQGl6ZW5w
+ZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC1btoCXXhp3xIW
+D+Bxl8nUCxkyiazWfpt0e68t+Qt9+lZjKZSdEw2Omj4qvr+ovRmDXO3iWpWVOWDl
+3JHJjAzFCe8ZEBNDH+QNYwZHmPBaMYFOYFdbAFVHWvys152C308hcFJ6xWWGmjvl
+2eMiEl9P2nR2LWue368DCu+ak7j3gjAXaCOdP1a7Bfr+RW3X2SC5R4Xyp8iHlL5J
+PHJD/WBkLrezwzQPdACw8m9EG7q9kUwlNpL32mROujS3ZkT6mQTzJieLiE3X04s0
+uIUqVkk5MhjcHFf7al0N5CzjtTcnXYJKN2Z9EDVskk4olAdGi46eSoZXbjUOP5gk
+Ej6wVZAXAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG
+MB0GA1UdDgQWBBTqVk/sPIOhFIh4gbIrBSLAB0FbQjANBgkqhkiG9w0BAQUFAAOC
+AQEAYp7mEzzhw6o5Hf5+T5kcI+t4BJyiIWy7vHlLs/G8dLYXO81aN/Mzg928eMTR
+TxxYZL8dd9uwsJ50TVfX6L0R4Dyw6wikh3fHRrat9ufXi63j5K91Ysr7aXqnF38d
+iAgHYkrwC3kuxHBb9C0KBz6h8Q45/KCyN7d37wWAq38yyhPDlaOvyoE6bdUuK5hT
+m5EYA5JmPyrhQ1moDOyueWBAjxzMEMj+OAY1H90cLv6wszsqerxRrdTOHBdv7MjB
+EIpvEEQkXUxVXAzFuuT6m2t91Lfnwfl/IvljHaVC7DlyyhRYHD6D4Rx+4QKp4tWL
+vpw6LkI+gKNJ/YdMCsRZQzEEFA==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh
+MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE
+YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3
+MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo
+ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg
+MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN
+ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA
+PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w
+wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi
+EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY
+avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+
+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE
+sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h
+/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5
+IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj
+YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD
+ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy
+OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P
+TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ
+HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER
+dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf
+ReYNnyicsbkqWletNw+vHX/bvZ8=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUx
+ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0
+b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQD
+EylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikgVGFudXNpdHZhbnlraWFkbzAeFw05
+OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYDVQQGEwJIVTERMA8G
+A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh
+Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5l
+dExvY2sgVXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqG
+SIb3DQEBAQUAA4GNADCBiQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xK
+gZjupNTKihe5In+DCnVMm8Bp2GQ5o+2So/1bXHQawEfKOml2mrriRBf8TKPV/riX
+iK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr1nGTLbO/CVRY7QbrqHvc
+Q7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8E
+BAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1G
+SUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFu
+b3MgU3pvbGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBh
+bGFwamFuIGtlc3p1bHQuIEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExv
+Y2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGln
+aXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0
+IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh
+c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGph
+biBhIGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJo
+ZXRvIGF6IGVsbGVub3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBP
+UlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmlj
+YXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBo
+dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNA
+bmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06
+sPgzTEdM43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXa
+n3BukxowOR0w2y7jfLKRstE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKS
+NitjrFgBazMpUIaD8QFI
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIICZzCCAdCgAwIBAgIBBDANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQGEwJVUzEY
+MBYGA1UEChMPVS5TLiBHb3Zlcm5tZW50MQwwCgYDVQQLEwNEb0QxDDAKBgNVBAsT
+A1BLSTEcMBoGA1UEAxMTRG9EIENMQVNTIDMgUm9vdCBDQTAeFw0wMDA1MTkxMzEz
+MDBaFw0yMDA1MTQxMzEzMDBaMGExCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9VLlMu
+IEdvdmVybm1lbnQxDDAKBgNVBAsTA0RvRDEMMAoGA1UECxMDUEtJMRwwGgYDVQQD
+ExNEb0QgQ0xBU1MgMyBSb290IENBMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB
+gQC1MP5kvurMbe2BLPd/6Rm6DmlqKOGpqcuVWB/x5pppU+CIP5HFUbljl6jmIYwT
+XjY8qFf6+HAsTGrLvzCnTBbkMlz4ErBR+BZXjS+0TfouqJToKmHUVw1Hzm4sL36Y
+Z8wACKu2lhY1woWR5VugCsdmUmLzYXWVF668KlYppeArUwIDAQABoy8wLTAdBgNV
+HQ4EFgQUbJyl8FyPbUGNxBc7kFfCD6PNbf4wDAYDVR0TBAUwAwEB/zANBgkqhkiG
+9w0BAQUFAAOBgQCvcUT5lyPMaGmMQwdBuoggsyIAQciYoFUczT9usZNcrfoYmrsc
+c2/9JEKPh59Rz76Gn+nXikhPCNlplKw/5g8tlw8ok3ZPYt//oM1h+KaGDDE0INx/
+L6j7Ob6V7jhZAmLB3mwVT+DfnbvkeXMk/WNklfdKqJkfSGWVx3u/eDLneg==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU
+MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs
+IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290
+MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux
+FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h
+bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v
+dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt
+H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9
+uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX
+mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX
+a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN
+E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0
+WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD
+VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0
+Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU
+cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx
+IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN
+AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH
+YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
+6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC
+Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX
+c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a
+mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDNjCCAp+gAwIBAgIQNhIilsXjOKUgodJfTNcJVDANBgkqhkiG9w0BAQUFADCB
+zjELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJ
+Q2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UE
+CxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhh
+d3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNl
+cnZlckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIxMDEwMTIzNTk1OVow
+gc4xCzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcT
+CUNhcGUgVG93bjEdMBsGA1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNV
+BAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRo
+YXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1z
+ZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2
+aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560
+ZXUCTe/LCaIhUdib0GfQug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j
++ao6hnO2RlNYyIkFvYMRuHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/
+BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQBlkKyID1bZ5jA01CbH0FDxkt5r1DmI
+CSLGpmODA/eZd9iy5Ri4XWPz1HP7bJyZePFLeH0ZJMMrAoT4vCLZiiLXoPxx7JGH
+IPG47LHlVYCsPVLIOQ7C8MAFT9aCdYy9X9LcdpoFEsmvcsPcJX6kTY4XpeCHf+Ga
+WuFg3GQjPEIuTQ==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIICXDCCAcWgAwIBAgIQCgEBAQAAAnwAAAALAAAAAjANBgkqhkiG9w0BAQUFADA6
+MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJp
+dHkgMTAyNCBWMzAeFw0wMTAyMjIyMTAxNDlaFw0yNjAyMjIyMDAxNDlaMDoxGTAX
+BgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJTQSBTZWN1cml0eSAx
+MDI0IFYzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDV3f5mCc8kPD6ugU5O
+isRpgFtZO9+5TUzKtS3DJy08rwBCbbwoppbPf9dYrIMKo1W1exeQFYRMiu4mmdxY
+78c4pqqv0I5CyGLXq6yp+0p9v+r+Ek3d/yYtbzZUaMjShFbuklNhCbM/OZuoyZu9
+zp9+1BlqFikYvtc6adwlWzMaUQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4G
+A1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBTEwBykB5T9zU0B1FTapQxf3q4FWjAd
+BgNVHQ4EFgQUxMAcpAeU/c1NAdRU2qUMX96uBVowDQYJKoZIhvcNAQEFBQADgYEA
+Py1q4yZDlX2Jl2X7deRyHUZXxGFraZ8SmyzVWujAovBDleMf6XbN3Ou8k6BlCsdN
+T1+nr6JGFLkM88y9am63nd4lQtBU/55oc2PcJOsiv6hy8l4A4Q1OOkNumU4/iXgD
+mMrzVcydro7BqkWY+o8aoI2II/EVQQ2lRj6RP4vr93E=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTEL
+MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNV
+BAsTG1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1
+c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcNMDYwMzIyMTU1NDI4WhcNMjUxMjMx
+MjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIg
+R21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYwJAYD
+VQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcN
+AQEBBQADggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSR
+JJZ4Hgmgm5qVSkr1YnwCqMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3T
+fCZdzHd55yx4Oagmcw6iXSVphU9VDprvxrlE4Vc93x9UIuVvZaozhDrzznq+VZeu
+jRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtwag+1m7Z3W0hZneTvWq3z
+wZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9OgdwZu5GQ
+fezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYD
+VR0jBBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAO
+BgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0G
+CSqGSIb3DQEBBQUAA4IBAQAo0uCG1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X1
+7caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/CyvwbZ71q+s2IhtNerNXxTPqYn
+8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3ghUJGooWMNjs
+ydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT
+ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/
+2TYcuiUaUj0a7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIH/zCCB2igAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARQxCzAJBgNVBAYTAkVT
+MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE
+ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE
+ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0GA1UECxMm
+SVBTIENBIENMQVNFQTMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMT
+JklQUyBDQSBDTEFTRUEzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZI
+hvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwHhcNMDExMjMxMTEyMzU5WhcNMjUxMjI5
+MTEyMzU5WjCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ
+BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp
+bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G
+LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTMgQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUEzIENlcnRpZmlj
+YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMw
+gZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMFh+lWUEmnBK5F6da6IALvvPO6f
+MWYw9LFAmwJsjcdKTVElPugUKLwgPLHxjO19kdmXIqPVzGOxq9krIwvdppffBYRU
+Fro6y8xja40gpdaeBXFGdVj19mR7C2adPoeVPTy1OTdSVLsWF8W/rdiLMy/p+PrV
+gTP/t56Fpu9MOeDjAgMBAAGjggRbMIIEVzAdBgNVHQ4EFgQU/J6FGtwGJXEh8C+L
+ElXQxYDuBq4wggFGBgNVHSMEggE9MIIBOYAU/J6FGtwGJXEh8C+LElXQxYDuBq6h
+ggEcpIIBGDCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ
+BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp
+bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G
+LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTMgQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUEzIENlcnRpZmlj
+YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOC
+AQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUF
+BwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYB
+BAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglg
+hkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1Ud
+EgQTMBGBD2lwc0BtYWlsLmlwcy5lczBDBglghkgBhvhCAQ0ENhY0Q0xBU0VBMyBD
+QSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkgaHR0cHM6Ly93d3cuaXBzLmVzLzAqBglg
+hkgBhvhCAQIEHRYbaHR0cHM6Ly93d3cuaXBzLmVzL2lwczIwMDIvMDwGCWCGSAGG
++EIBBAQvFi1odHRwczovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0VB
+My5jcmwwQQYJYIZIAYb4QgEDBDQWMmh0dHBzOi8vd3d3Lmlwcy5lcy9pcHMyMDAy
+L3Jldm9jYXRpb25DTEFTRUEzLmh0bWw/MD4GCWCGSAGG+EIBBwQxFi9odHRwczov
+L3d3dy5pcHMuZXMvaXBzMjAwMi9yZW5ld2FsQ0xBU0VBMy5odG1sPzA8BglghkgB
+hvhCAQgELxYtaHR0cHM6Ly93d3cuaXBzLmVzL2lwczIwMDIvcG9saWN5Q0xBU0VB
+My5odG1sMHcGA1UdHwRwMG4wM6AxoC+GLWh0dHBzOi8vd3d3Lmlwcy5lcy9pcHMy
+MDAyL2lwczIwMDJDTEFTRUEzLmNybDA3oDWgM4YxaHR0cHM6Ly93d3diYWNrLmlw
+cy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRUEzLmNybDAvBggrBgEFBQcBAQQjMCEw
+HwYIKwYBBQUHMAGGE2h0dHA6Ly9vY3NwLmlwcy5lcy8wDQYJKoZIhvcNAQEFBQAD
+gYEAGG8JN0Ca0pQR0X/Lg33qtKfi2JPe2iRqdRswDoL3CTn+bRN20V/wbKDAwyxc
+7eJOroysytPkEF4wZhipaKCjaWJROZGCeU1jM7mZe9pQPzeofT//VLi8zKaUA4lZ
+BvYI44gntZQoaFxJna5NHHde+mbbPYlHb8c6g0mf9S3tODs=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDXTCCAkWgAwIBAgIDAOJCMA0GCSqGSIb3DQEBBQUAMFUxCzAJBgNVBAYTAkFU
+MRAwDgYDVQQKEwdBLVRydXN0MRkwFwYDVQQLExBBLVRydXN0LW5RdWFsLTAxMRkw
+FwYDVQQDExBBLVRydXN0LW5RdWFsLTAxMB4XDTA0MTEzMDIzMDAwMFoXDTE0MTEz
+MDIzMDAwMFowVTELMAkGA1UEBhMCQVQxEDAOBgNVBAoTB0EtVHJ1c3QxGTAXBgNV
+BAsTEEEtVHJ1c3QtblF1YWwtMDExGTAXBgNVBAMTEEEtVHJ1c3QtblF1YWwtMDEw
+ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQD/9RyAEZ6eHmhYzNJ328f0
+jmdSUFi6EqRqOxb3jHNPTIpK82CR6z5lmSnZQNUuCPD+htbNZffd2DKVB06NOyZ1
+2zcOMCgj4GtkZoqE0zPpPT3bpoE55nkZZe/qWEX/64wz/L/4EdkvKDSKG/UsP75M
+tmCVY5m2Eg73RVFRz4ccBIMpHel4lzEqSkdDtZOY5fnkrE333hx67nxq21vY8Eyf
+8O4fPQ5RtN8eohQCcPQ1z6ypU1R7N9jPRpnI+yzMOiwd3+QcKhHi1miCzo0pkOaB
+1CwmfsTyNl8qU0NJUL9Ta6cea7WThwTiWol2yD88cd2cy388xpbNkfrCPmZNGLoV
+AgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0OBAoECE5ZzscCMocwMA4G
+A1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEA69I9R1hU9Gbl9vV7W7AH
+QpUJAlFAvv2It/eY8p2ouQUPVaSZikaKtAYrCD/arzfXB43Qet+dM6CpHsn8ikYR
+vQKePjXv3Evf+C1bxwJAimcnZV6W+bNOTpdo8lXljxkmfN+Z5S+XzvK2ttUtP4Et
+YOVaxHw2mPMNbvDeY+foJkiBn3KYjGabMaR8moZqof5ofj4iS/WyamTZti6v/fKx
+n1vII+/uWkcxV5DT5+r9HLon0NYF0Vg317Wh+gWDV59VZo+dcwJDb+keYqMFYoqp
+77SGkZGu41S8NGYkQY3X9rNHRkDbLfpKYDmy6NanpOE1EHW1/sNSFAs43qZZKJEQ
+xg==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDMDCCApmgAwIBAgIQDY4VEuGsu3eNOOMk34ww8jANBgkqhkiG9w0BAQUFADCB
+yzELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJ
+Q2FwZSBUb3duMRowGAYDVQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMf
+Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3Rl
+IFBlcnNvbmFsIEJhc2ljIENBMSgwJgYJKoZIhvcNAQkBFhlwZXJzb25hbC1iYXNp
+Y0B0aGF3dGUuY29tMB4XDTk2MDEwMTAwMDAwMFoXDTIxMDEwMTIzNTk1OVowgcsx
+CzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNh
+cGUgVG93bjEaMBgGA1UEChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0Nl
+cnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQ
+ZXJzb25hbCBCYXNpYyBDQTEoMCYGCSqGSIb3DQEJARYZcGVyc29uYWwtYmFzaWNA
+dGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAvLyTU23AUE+C
+FeZIlDWmWr5vQvoPR+53dXLdjUmbllegeNTKP1GzaQuRdhciB5dqxFGTS+CN7zeV
+oQxN2jSQHReJl+A1OFdKwPQIcOk8RHtQfmGakOMj04gRRif1CwcOu93RfyAKiLlW
+Cy4cgNrx454p7xS9CkT7G1sY0b8jkyECAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB
+/zANBgkqhkiG9w0BAQUFAAOBgQCIO/64+XpCRhGgpKJkhc1IHJzVilHNL8F9sQfP
+1wHeMj+W5IT+0V6tDH4OY0lqDhDkl9A/xacp2aZTHkseP1T6wIQ1c+qRqdxdk1cF
+BgwHua8LRDmIIaDugnOpRi9pbCV0qc3fp9f9hTAElDVKpxszJCxEFu0KxN+AqmUa
+v3Em8A==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
+QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT
+MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
+b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG
+9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB
+CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97
+nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt
+43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P
+T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4
+gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO
+BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR
+TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw
+DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr
+hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg
+06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF
+PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls
+YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
+CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx
+EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT
+HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs
+ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw
+MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6
+b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj
+aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp
+Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg
+nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1
+HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N
+Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN
+dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0
+HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO
+BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G
+CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU
+sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3
+4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg
+8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K
+pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1
+mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEgzCCA+ygAwIBAgIEOJ725DANBgkqhkiG9w0BAQQFADCBtDEUMBIGA1UEChML
+RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9HQ0NBX0NQUyBp
+bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAyMDAw
+IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENsaWVu
+dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMDAyMDcxNjE2NDBaFw0yMDAy
+MDcxNjQ2NDBaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3
+LmVudHJ1c3QubmV0L0dDQ0FfQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp
+YWIuKTElMCMGA1UECxMcKGMpIDIwMDAgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG
+A1UEAxMqRW50cnVzdC5uZXQgQ2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5
+MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCTdLS25MVL1qFof2LV7PdRV7Ny
+Spj10InJrWPNTTVRaoTUrcloeW+46xHbh65cJFET8VQlhK8pK5/jgOLZy93GRUk0
+iJBeAZfv6lOm3fzB3ksqJeTpNfpVBQbliXrqpBFXO/x8PTbNZzVtpKklWb1m9fkn
+5JVn1j+SgF7yNH0rhQIDAQABo4IBnjCCAZowEQYJYIZIAYb4QgEBBAQDAgAHMIHd
+BgNVHR8EgdUwgdIwgc+ggcyggcmkgcYwgcMxFDASBgNVBAoTC0VudHJ1c3QubmV0
+MUAwPgYDVQQLFDd3d3cuZW50cnVzdC5uZXQvR0NDQV9DUFMgaW5jb3JwLiBieSBy
+ZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMjAwMCBFbnRydXN0Lm5l
+dCBMaW1pdGVkMTMwMQYDVQQDEypFbnRydXN0Lm5ldCBDbGllbnQgQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMjAwMDAy
+MDcxNjE2NDBagQ8yMDIwMDIwNzE2NDY0MFowCwYDVR0PBAQDAgEGMB8GA1UdIwQY
+MBaAFISLdP3FjcD/J20gN0V8/i3OutN9MB0GA1UdDgQWBBSEi3T9xY3A/ydtIDdF
+fP4tzrrTfTAMBgNVHRMEBTADAQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4w
+AwIEkDANBgkqhkiG9w0BAQQFAAOBgQBObzWAO9GK9Q6nIMstZVXQkvTnhLUGJoMS
+hAusO7JE7r3PQNsgDrpuFOow4DtifH+La3xKp9U1PL6oXOpLu5OOgGarDyn9TS2/
+GpsKkMWr2tGzhtQvJFJcem3G8v7lTRowjJDyutdKPkN+1MhQGof4T4HHdguEOnKd
+zmVml64mXg==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJV
+UzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQL
+EwhEU1RDQSBFMTAeFw05ODEyMTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJ
+BgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4x
+ETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCg
+bIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJENySZ
+j9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlV
+Sn5JTe2io74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCG
+SAGG+EIBAQQEAwIABzBoBgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMx
+JDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMI
+RFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMTAxODEw
+MjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFGp5
+fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i
++DAMBgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqG
+SIb3DQEBBQUAA4GBACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lN
+QseSJqBcNJo4cvj9axY+IO6CizEqkzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+
+gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4RbyhkwS7hp86W0N6w4pl
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB
+yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
+ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp
+U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW
+ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0
+aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL
+MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW
+ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln
+biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp
+U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y
+aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1
+nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex
+t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz
+SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG
+BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+
+rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/
+NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E
+BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH
+BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
+aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv
+MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE
+p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y
+5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK
+WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ
+4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N
+hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIESzCCAzOgAwIBAgIJAJigUTEEXRQpMA0GCSqGSIb3DQEBBQUAMHYxCzAJBgNV
@@ -128,2385 +2080,98 @@ TBA+9zBb6xD1KM2DdY7r4GiyYItN0BKLfuWbh9LXGbl1C+f4P11g+m2MPiavIeCe
1iazG5pcS3KoTLACsYlEX24TINtg4kcuS81XdllcnsV3Kdts0nIqPj6uhTTZD0k=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
-MIIDtTCCAp2gAwIBAgIRANAeQJAAAEZSAAAAAQAAAAQwDQYJKoZIhvcNAQEF
-BQAwgYkxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJEQzETMBEGA1UEBxMKV2Fz
-aGluZ3RvbjEXMBUGA1UEChMOQUJBLkVDT00sIElOQy4xGTAXBgNVBAMTEEFC
-QS5FQ09NIFJvb3QgQ0ExJDAiBgkqhkiG9w0BCQEWFWFkbWluQGRpZ3NpZ3Ry
-dXN0LmNvbTAeFw05OTA3MTIxNzMzNTNaFw0wOTA3MDkxNzMzNTNaMIGJMQsw
-CQYDVQQGEwJVUzELMAkGA1UECBMCREMxEzARBgNVBAcTCldhc2hpbmd0b24x
-FzAVBgNVBAoTDkFCQS5FQ09NLCBJTkMuMRkwFwYDVQQDExBBQkEuRUNPTSBS
-b290IENBMSQwIgYJKoZIhvcNAQkBFhVhZG1pbkBkaWdzaWd0cnVzdC5jb20w
-ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx0xHgeVVDBwhMywVC
-AOINg0Y95JO6tgbTDVm9PsHOQ2cBiiGo77zM0KLMsFWWU4RmBQDaREmA2FQK
-pSWGlO1jVv9wbKOhGdJ4vmgqRF4vz8wYXke8OrFGPR7wuSw0X4x8TAgpnUBV
-6zx9g9618PeKgw6hTLQ6pbNfWiKX7BmbwQVo/ea3qZGULOR4SCQaJRk665Wc
-OQqKz0Ky8BzVX/tr7WhWezkscjiw7pOp03t3POtxA6k4ShZsiSrK2jMTecJV
-jO2cu/LLWxD4LmE1xilMKtAqY9FlWbT4zfn0AIS2V0KFnTKo+SpU+/94Qby9
-cSj0u5C8/5Y0BONFnqFGKECBAgMBAAGjFjAUMBIGA1UdEwEB/wQIMAYBAf8C
-AQgwDQYJKoZIhvcNAQEFBQADggEBAARvJYbk5pYntNlCwNDJALF/VD6Hsm0k
-qS8Kfv2kRLD4VAe9G52dyntQJHsRW0mjpr8SdNWJt7cvmGQlFLdh6X9ggGvT
-ZOirvRrWUfrAtF13Gn9kCF55xgVM8XrdTX3O5kh7VNJhkoHWG9YA8A6eKHeg
-TYjHInYZw8eeG6Z3ePhfm1bR8PIXrI6dWeYf/le22V7hXZ9F7GFoGUHhsiAm
-/lowdiT/QHI8eZ98IkirRs3bs4Ysj78FQdPB4xTjQRcm0HyncUwZ6EoPclgx
-fexgeqMiKL0ZJGA/O4dzwGvky663qyVDslUte6sGDnVdNOVdc22esnVApVnJ
-TzFxiNmIf1Q=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJT
-RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4
-dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5h
-bCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzEL
-MAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1B
-ZGRUcnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1
-c3QgRXh0ZXJuYWwgQ0EgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
-AQoCggEBALf3GjPm8gAELTngTlvtH7xsD821+iO2zt6bETOXpClMfZOfvUq8
-k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfwTz/oMp50
-ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504
-B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDez
-eWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5
-aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0WicCAwEAAaOB
-3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0PBAQD
-AgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6
-xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU
-cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdv
-cmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJ
-KoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl
-j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5R
-xNKWt9x+Tu5w/Rw56wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjT
-K3rMUUKhemPR5ruhxSvCNr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1
-n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHx
-REzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49O
-hgQ=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJT
-RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRU
-UCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3Qw
-HhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQswCQYDVQQGEwJT
-RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRU
-UCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3Qw
-ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwze
-xODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY654eyNAbFvAWlA3yCyykQruGI
-gb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWroulpOj0O
-M3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1Lc
-sRVlIPo1Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5
-mqRJjox0r26kmqPZm9I4XJuiGMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG
-9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8wHQYDVR0OBBYEFJWxtPCU
-tr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTADAQH/
-MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQsw
-CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFk
-ZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAx
-IENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxtZBsfzQ3duQH6lmM0
-MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph
-iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9
-tTEv2dB8Xfjea4MYeDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL
-/bscVjby/rK25Xa71SJlpz/+0WatC7xrmYbvP33zGDLKe8bjq2RGlfgmadlV
-g3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vjccweGyBECMB6
-tkD9xOQ14R0WHNC8K47Wcdk=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJT
-RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRU
-UCBOZXR3b3JrMSAwHgYDVQQDExdBZGRUcnVzdCBQdWJsaWMgQ0EgUm9vdDAe
-Fw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJBgNVBAYTAlNF
-MRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ
-IE5ldHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIB
-IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+
-A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbunyNu9DnLoblv8n75XYcmYZ4c
-+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1id9NEHif2
-P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKX
-C1sIXzSGAa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8R
-s3iQhCBSWxHveNCD9tVIkNAwHM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9
-BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0GA1UdDgQWBBSBPjfYkrAf
-d59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zCB
-jgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkG
-A1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRU
-cnVzdCBUVFAgTmV0d29yazEgMB4GA1UEAxMXQWRkVHJ1c3QgUHVibGljIENB
-IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4JNojVhaTdt02KLmu
-G7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL
-+YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbj
-PGsye/Kf8Lb93/AoGEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bY
-GozH7ZxOmuASu7VqTITh4SINhwBk/ox9Yjllpu9CtoAlEmEBqCQTcAARJl/6
-NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9HEufOX1362Kqx
-My3ZdvJOOjMMK7MtkAY=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJT
-RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRU
-UCBOZXR3b3JrMSMwIQYDVQQDExpBZGRUcnVzdCBRdWFsaWZpZWQgQ0EgUm9v
-dDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcxCzAJBgNVBAYT
-AlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3Qg
-VFRQIE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBS
-b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoek
-n0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx64r1EW7tTw2R0hIYLUkVAcKk
-IhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3KP0q6p6z
-sLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1t
-UvznoD1oL/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R
-+Bg6Ot4l2ffTQO2kBhLEO+GRwVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvES
-a0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HUMIHRMB0GA1UdDgQWBBQ5
-lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUw
-AwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkw
-ZzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQL
-ExRBZGRUcnVzdCBUVFAgTmV0d29yazEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVh
-bGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBABmrder4i2Vh
-lRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG
-GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx9
-5dr6h+sNNVJn0J6XdgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKF
-Yqa0p9m9N5xotS1WfbC3P6CxB9bpT9zeRXEwMn8bLgn5v1Kh7sKAPgZcLlVA
-wRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDBiFrRHnGTHyQw
-dOUeqN48Jzd/g66ed8/wMLH/S5noxqE=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJV
-UzEcMBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1l
-cmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4X
-DTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkGA1UEBhMCVVMx
-HDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJp
-Y2EgT25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIw
-DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCa
-xlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CGv2BlnEtUiMJIxUo5vxTjWVXl
-GbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44zDyL9Hy7n
-BzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145Lcx
-VR5lu9RhsCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiE
-mf4hjUyAtgyC9mZweRrTT6PP8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCu
-JKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAdBgNV
-HQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Zo/Z5
-9m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUA
-A4IBAQB8itEfGDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkF
-Zu90821fnZmv9ov761KyBZiibyrFVL0lvV+uyIbqRizBs73B6UlwGBaXCBOM
-IOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft3OJvx8Fi8eNy1gTI
-dGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g
-Kd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j
-8uB9Gr784N/Xx6dssPmuujz9dLQR6FgNgLzTqIA6me11zEZ7
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJV
-UzEcMBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1l
-cmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4X
-DTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkGA1UEBhMCVVMx
-HDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJp
-Y2EgT25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIw
-DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssN
-t79Hc9PwVU3dxgz6sWYFas14tNwC206B89enfHG8dWOgXeMHDEjsJcQDIPT/
-DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8f3SkWq7x
-uhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE
-18aO6lhOqKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxr
-kJB+FFk4u5QkE+XRnRTf04JNRvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMD
-bi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0gBe4lL8BPeraunzgWGcX
-uVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn6KVu
-Y8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9
-W6Wa6897GqidFEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZ
-o2C7HK2JNDJiuEMhBnIMoVxtRsX6Kc8w3onccVvdtjc+31D1uAclJuW8tf48
-ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnjB453cMor9H124Hhn
-AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op
-aaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNee
-MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypL
-M7PmG2tZTiLMubekJcmnxPBUlgtk87FYT15R/LKXeydlwuXK5w0MJXti4/qf
-tIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p+DYtLHe/YUjR
-Ywu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R
-+FXgJXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr
-+CKAXEfOAuMRn0T//ZoyzH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVM
-nNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgOZtMADjMSW7yV5TKQqLPGbIOt
-d+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh1NolNscI
-WC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZ
-ZLF0KjhfGEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y
-3WRayhgoPmMEEf0cjQAPuDffZ4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz
-2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuPcX/9XhmgD0uRuMRUvAaw
-RY8mkaKO/qk=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIID5jCCAs6gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMC
-VVMxHTAbBgNVBAoTFEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNB
-bWVyaWNhIE9ubGluZSBJbmMuMTcwNQYDVQQDEy5BT0wgVGltZSBXYXJuZXIg
-Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyOTA2MDAw
-MFoXDTM3MTEyMDE1MDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRB
-T0wgVGltZSBXYXJuZXIgSW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUg
-SW5jLjE3MDUGA1UEAxMuQU9MIFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNh
-dGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
-ggEBAJnej8Mlo2k06AX3dLm/WpcZuS+U0pPlLYnKhHw/EEMbjIt8hFj4JHxI
-zyr9wBXZGH6EGhfT257XyuTZ16pYUYfw8ItITuLCxFlpMGK2MKKMCxGZYTVt
-fu/FsRkGIBKOQuHfD5YQUqjPnF+VFNivO3ULMSAfRC+iYkGzuxgh28pxPIzs
-trkNn+9R7017EvILDOGsQI93f7DKeHEMXRZxcKLXwjqFzQ6axOAAsNUl6twr
-5JQtOJyJQVdkKGUZHLZEtMgxa44Be3ZZJX8VHIQIfHNlIAqhBC4aMqiaILGc
-LCFZ5/vP7nAtCMpjPiybkxlqpMKX/7eGV4iFbJ4VFitNLLMCAwEAAaNjMGEw
-DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUoTYwFsuGkABFgFOxj8jYPXy+
-XxIwHwYDVR0jBBgwFoAUoTYwFsuGkABFgFOxj8jYPXy+XxIwDgYDVR0PAQH/
-BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQCKIBilvrMvtKaEAEAwKfq0FHNM
-eUWn9nDg6H5kHgqVfGphwu9OH77/yZkfB2FK4V1Mza3u0FIy2VkyvNp5ctZ7
-CegCgTXTCt8RHcl5oIBN/lrXVtbtDyqvpxh1MwzqwWEFT2qaifKNuZ8u77Bf
-WgDrvq2g+EQFZ7zLBO+eZMXpyD8Fv8YvBxzDNnGGyjhmSs3WuEvGbKeXO/oT
-LW4jYYehY0KswsuXn2Fozy1MBJ3XJU8KDk2QixhWqJNIV9xvrr2eZ1d3iVCz
-vhGbRWeDhhmH05i9CBoWH1iCC+GWaQVLjuyDUTEH1dSf/1l7qG6Fz9NLqUmw
-X7A5KGgOc90lmt4S
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIF5jCCA86gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMC
-VVMxHTAbBgNVBAoTFEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNB
-bWVyaWNhIE9ubGluZSBJbmMuMTcwNQYDVQQDEy5BT0wgVGltZSBXYXJuZXIg
-Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyOTA2MDAw
-MFoXDTM3MDkyODIzNDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRB
-T0wgVGltZSBXYXJuZXIgSW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUg
-SW5jLjE3MDUGA1UEAxMuQU9MIFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNh
-dGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC
-ggIBALQ3WggWmRToVbEbJGv8x4vmh6mJ7ouZzU9AhqS2TcnZsdw8TQ2FTBVs
-RotSeJ/4I/1n9SQ6aF3Q92RhQVSji6UI0ilbm2BPJoPRYxJWSXakFsKlnUWs
-i4SVqBax7J/qJBrvuVdcmiQhLE0OcR+mrF1FdAOYxFSMFkpBd4aVdQxHAWZg
-/BXxD+r1FHjHDtdugRxev17nOirYlxcwfACtCJ0zr7iZYYCLqJV+FNwSbKTQ
-2O9ASQI2+W6p1h2WVgSysy0WVoaP2SBXgM1nEG2wTPDaRrbqJS5Gr42whTg0
-ixQmgiusrpkLjhTXUr2eacOGAgvqdnUxCc4zGSGFQ+aJLZ8lN2fxI2rSAG2X
-+Z/nKcrdH9cG6rjJuQkhn8g/BsXS6RJGAE57COtCPStIbp1n3UsC5ETzkxml
-J85per5n0/xQpCyrw2u544BMzwVhSyvcG7mm0tCq9Stz+86QNZ8MUhy/XCFh
-EVsVS6kkUfykXPcXnbDS+gfpj1bkGoxoigTTfFrjnqKhynFbotSg5ymFXQNo
-Kk/SBtc9+cMDLz9l+WceR0DTYw/j1Y75hauXTLPXJuuWCpTehTacyH+BCQJJ
-Kg71ZDIMgtG6aoIbs0t0EfOMd9afv9w3pKdVBC/UMejTRrkDfNoSTllkt1Ex
-MVCgyhwn2RAurda9EGYrw7AiShJbAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMB
-Af8wHQYDVR0OBBYEFE9pbQN+nZ8HGEO8txBO1b+pxCAoMB8GA1UdIwQYMBaA
-FE9pbQN+nZ8HGEO8txBO1b+pxCAoMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG
-9w0BAQUFAAOCAgEAO/Ouyuguh4X7ZVnnrREUpVe8WJ8kEle7+z802u6teio0
-cnAxa8cZmIDJgt43d15Ui47y6mdPyXSEkVYJ1eV6moG2gcKtNuTxVBFT8zRF
-ASbI5Rq8NEQh3q0l/HYWdyGQgJhXnU7q7C+qPBR7V8F+GBRn7iTGvboVsNIY
-vbdVgaxTwOjdaRITQrcCtQVBynlQboIOcXKTRuidDV29rs4prWPVVRaAMCf/
-drr3uNZK49m1+VLQTkCpx+XCMseqdiThawVQ68W/ClTluUI8JPu3B5wwn3la
-5uBAUhX0/Kr0VvlEl4ftDmVyXr4m+02kLQgH3thcoNyBM5kYJRF3p+v9WAks
-mWsbivNSPxpNSGDxoPYzAlOL7SUJuA0t7Zdz7NeWH45gDtoQmy8YJPamTQr5
-O8t1wswvziRpyQoijlmn94IM19drNZxDAGrElWe6nEXLuA4399xOAU++CrYD
-062KRffaJ00psUjf5BHklka9bAI+1lHIlRcBFanyqqryvy9lG2/QuRqT9Y41
-xICHPpQvZuTpqP9BnHAqTyo5GJUefvthATxRCC4oGKQWDzH9OmwjkyB24f0H
-hdFbP9IcczLd+rn4jM8Ch3qaluTtT4mNU0OrDhPAARW0eTjb/G49nlG2uBOL
-Z8/5fNkiHfZdxRwBL5joeiQYvITX+txyW/fBOmg=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQG
-EwJJRTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0
-MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUx
-MjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNV
-BAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZ
-QmFsdGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQAD
-ggEPADCCAQoCggEBAKMEuyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+h
-Xe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gR
-QKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/CG9VwcPCP
-wBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1
-pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNT
-Px8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkC
-AwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1BE3wMBIGA1Ud
-EwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUA
-A4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkT
-I7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx
-jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/
-oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67
-G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H
-RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFajCCBFKgAwIBAgIEPLU9RjANBgkqhkiG9w0BAQUFADBmMRIwEAYDVQQK
-EwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEzMDEG
-A1UEAxMqYmVUUlVTVGVkIFJvb3QgQ0EtQmFsdGltb3JlIEltcGxlbWVudGF0
-aW9uMB4XDTAyMDQxMTA3Mzg1MVoXDTIyMDQxMTA3Mzg1MVowZjESMBAGA1UE
-ChMJYmVUUlVTVGVkMRswGQYDVQQLExJiZVRSVVNUZWQgUm9vdCBDQXMxMzAx
-BgNVBAMTKmJlVFJVU1RlZCBSb290IENBLUJhbHRpbW9yZSBJbXBsZW1lbnRh
-dGlvbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALx+xDmcjOPW
-HIb/ymKt4H8wRXqOGrO4x/nRNv8i805qX4QQ+2aBw5R5MdKR4XeOGCrDFN5R
-9U+jK7wYFuK13XneIviCfsuBH/0nLI/6l2Qijvj/YaOcGx6Sj8CoCd8JEey3
-fTGaGuqDIQY8n7pc/5TqarjDa1U0Tz0yH92BFODEPM2dMPgwqZfT7syj0B9f
-HBOB1BirlNFjw55/NZKeX0Tq7PQiXLfoPX2k+YmpkbIq2eszh+6l/ePazIjm
-iSZuxyuC0F6dWdsU7JGDBcNeDsYq0ATdcT0gTlgn/FP7eHgZFLL8kFKJOGJg
-B7Sg7KxrUNb9uShr71ItOrL/8QFArDcCAwEAAaOCAh4wggIaMA8GA1UdEwEB
-/wQFMAMBAf8wggG1BgNVHSAEggGsMIIBqDCCAaQGDysGAQQBsT4AAAEJKIOR
-MTCCAY8wggFIBggrBgEFBQcCAjCCAToaggE2UmVsaWFuY2Ugb24gb3IgdXNl
-IG9mIHRoaXMgQ2VydGlmaWNhdGUgY3JlYXRlcyBhbiBhY2tub3dsZWRnbWVu
-dCBhbmQgYWNjZXB0YW5jZSBvZiB0aGUgdGhlbiBhcHBsaWNhYmxlIHN0YW5k
-YXJkIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZSwgdGhlIENlcnRpZmlj
-YXRpb24gUHJhY3RpY2UgU3RhdGVtZW50IGFuZCB0aGUgUmVseWluZyBQYXJ0
-eSBBZ3JlZW1lbnQsIHdoaWNoIGNhbiBiZSBmb3VuZCBhdCB0aGUgYmVUUlVT
-VGVkIHdlYiBzaXRlLCBodHRwOi8vd3d3LmJldHJ1c3RlZC5jb20vcHJvZHVj
-dHNfc2VydmljZXMvaW5kZXguaHRtbDBBBggrBgEFBQcCARY1aHR0cDovL3d3
-dy5iZXRydXN0ZWQuY29tL3Byb2R1Y3RzX3NlcnZpY2VzL2luZGV4Lmh0bWww
-HQYDVR0OBBYEFEU9w6nR3D8kVpgccxiIav+DR+22MB8GA1UdIwQYMBaAFEU9
-w6nR3D8kVpgccxiIav+DR+22MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0B
-AQUFAAOCAQEASZK8o+6svfoNyYt5hhwjdrCAWXf82n+0S9/DZEtqTg6t8n1Z
-dwWtColzsPq8y9yNAIiPpqCy6qxSJ7+hSHyXEHu67RMdmgduyzFiEuhjA6p9
-beP4G3YheBufS0OM00mG9htc9i5gFdPp43t1P9ACg9AYgkHNZTfqjjJ+vWuZ
-XTARyNtIVBw74acT02pIk/c9jH8F6M7ziCpjBLjqflh8AXtb4cV97yHgjQ5d
-UX2xZ/2jvTg2xvI4hocalmhgRvsoFEdV4aeADGvi6t9NfJBIoDa9CReJf8Py
-05yc493EG931t3GzUwWJBtDLSoDByFOQtTwxiBdQn8nEDovYqAJjDQ==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFLDCCBBSgAwIBAgIEOU99hzANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQG
-EwJXVzESMBAGA1UEChMJYmVUUlVTVGVkMRswGQYDVQQDExJiZVRSVVNUZWQg
-Um9vdCBDQXMxGjAYBgNVBAMTEWJlVFJVU1RlZCBSb290IENBMB4XDTAwMDYy
-MDE0MjEwNFoXDTEwMDYyMDEzMjEwNFowWjELMAkGA1UEBhMCV1cxEjAQBgNV
-BAoTCWJlVFJVU1RlZDEbMBkGA1UEAxMSYmVUUlVTVGVkIFJvb3QgQ0FzMRow
-GAYDVQQDExFiZVRSVVNUZWQgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD
-ggEPADCCAQoCggEBANS0c3oTCjhVAb6JVuGUntS+WutKNHUbYSnE4a0IYCF4
-SP+00PpeQY1hRIfo7clY+vyTmt9P6j41ffgzeubx181vSUs9Ty1uDoM6GHh3
-o8/n9E1z2Jo7Gh2+lVPPIJfCzz4kUmwMjmVZxXH/YgmPqsWPzGCgc0rXOD8V
-cr+il7dw6K/ifhYGTPWqZCZyByWtNfwYsSbX2P8ZDoMbjNx4RWc0PfSvHI3k
-bWvtILNnmrRhyxdviTX/507AMhLn7uzf/5cwdO2NR47rtMNE5qdMf1ZD6Li8
-tr76g5fmu/vEtpO+GRg+jIG5c4gW9JZDnGdzF5DYCW5jrEq2I8QBoa2k5MUC
-AwEAAaOCAfgwggH0MA8GA1UdEwEB/wQFMAMBAf8wggFZBgNVHSAEggFQMIIB
-TDCCAUgGCisGAQQBsT4BAAAwggE4MIIBAQYIKwYBBQUHAgIwgfQagfFSZWxp
-YW5jZSBvbiB0aGlzIGNlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVz
-IGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0
-ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGFuZCBjZXJ0aWZpY2F0aW9u
-IHByYWN0aWNlIHN0YXRlbWVudCwgd2hpY2ggY2FuIGJlIGZvdW5kIGF0IGJl
-VFJVU1RlZCdzIHdlYiBzaXRlLCBodHRwczovL3d3dy5iZVRSVVNUZWQuY29t
-L3ZhdWx0L3Rlcm1zMDEGCCsGAQUFBwIBFiVodHRwczovL3d3dy5iZVRSVVNU
-ZWQuY29tL3ZhdWx0L3Rlcm1zMDQGA1UdHwQtMCswKaAnoCWkIzAhMRIwEAYD
-VQQKEwliZVRSVVNUZWQxCzAJBgNVBAYTAldXMB0GA1UdDgQWBBQquZtpLjub
-2M3eKjEENGvKBxirZzAfBgNVHSMEGDAWgBQquZtpLjub2M3eKjEENGvKBxir
-ZzAOBgNVHQ8BAf8EBAMCAf4wDQYJKoZIhvcNAQEFBQADggEBAHlh26Nebhax
-6nZR+csVm8tpvuaBa58oH2U+3RGFktToQb9+M70j5/Egv6S0phkBxoyNNXxl
-pE8JpNbYIxUFE6dDea/bow6be3ga8wSGWsb2jCBHOElQBp1yZzrwmAOtlmdE
-/D8QDYZN5AA7KXvOOzuZhmElQITcE2K3+spZ1gMe1lMBzW1MaFVA4e5rxyoA
-AEiCswoBw2AqDPeCNe5IhpbkdNQ96gFxugR1QKepfzk5mlWXKWWuGVUlBXJH
-0+gY3Ljpr0NzARJ0o+FcXxVdJPP55PS2Z2cS52QiivalQaYctmBjRYoQtLpG
-EK5BV2VsPyMQPyEQWbfkQN0mDCP2qq4=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIGUTCCBTmgAwIBAgIEPLVPQDANBgkqhkiG9w0BAQUFADBmMRIwEAYDVQQK
-EwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEzMDEG
-A1UEAxMqYmVUUlVTVGVkIFJvb3QgQ0EgLSBFbnRydXN0IEltcGxlbWVudGF0
-aW9uMB4XDTAyMDQxMTA4MjQyN1oXDTIyMDQxMTA4NTQyN1owZjESMBAGA1UE
-ChMJYmVUUlVTVGVkMRswGQYDVQQLExJiZVRSVVNUZWQgUm9vdCBDQXMxMzAx
-BgNVBAMTKmJlVFJVU1RlZCBSb290IENBIC0gRW50cnVzdCBJbXBsZW1lbnRh
-dGlvbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALr0RAOqEmq1
-Q+xVkrYwfTVXDNvzDSduTPdQqJtOK2/b9a0cS12zqcH+e0TrW6MFDR/FNCsw
-ACnxeECypP869AGIF37m1CbTukzqMvtDd5eHI8XbQ6P1KqNRXuE70mVpflUV
-m3rnafdE4Fe1FehmYA8NA/uCjqPoEXtsvsdjDheT389Lrm5zdeDzqrmkwAkb
-hepxKYhBMvnwKg5sCfJ0a2ZsUhMfGLzUPvfYbiCeyv78IZTuEyhL11xeDGbu
-6bsPwTSxfwh28z0mcMmLJR1iJAzqHHVOwBLkuhMdMCktVjMFu5dZfsZJT4nX
-LySotohAtWSSU1Yk5KKghbNekLQSM80CAwEAAaOCAwUwggMBMIIBtwYDVR0g
-BIIBrjCCAaowggGmBg8rBgEEAbE+AAACCSiDkTEwggGRMIIBSQYIKwYBBQUH
-AgIwggE7GoIBN1JlbGlhbmNlIG9uIG9yIHVzZSBvZiB0aGlzIENlcnRpZmlj
-YXRlIGNyZWF0ZXMgYW4gYWNrbm93bGVkZ21lbnQgYW5kIGFjY2VwdGFuY2Ug
-b2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29u
-ZGl0aW9ucyBvZiB1c2UsIHRoZSBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0
-YXRlbWVudCBhbmQgdGhlIFJlbHlpbmcgUGFydHkgQWdyZWVtZW50LCB3aGlj
-aCBjYW4gYmUgZm91bmQgYXQgdGhlIGJlVFJVU1RlZCB3ZWIgc2l0ZSwgaHR0
-cHM6Ly93d3cuYmV0cnVzdGVkLmNvbS9wcm9kdWN0c19zZXJ2aWNlcy9pbmRl
-eC5odG1sMEIGCCsGAQUFBwIBFjZodHRwczovL3d3dy5iZXRydXN0ZWQuY29t
-L3Byb2R1Y3RzX3NlcnZpY2VzL2luZGV4Lmh0bWwwEQYJYIZIAYb4QgEBBAQD
-AgAHMIGJBgNVHR8EgYEwfzB9oHugeaR3MHUxEjAQBgNVBAoTCWJlVFJVU1Rl
-ZDEbMBkGA1UECxMSYmVUUlVTVGVkIFJvb3QgQ0FzMTMwMQYDVQQDEypiZVRS
-VVNUZWQgUm9vdCBDQSAtIEVudHJ1c3QgSW1wbGVtZW50YXRpb24xDTALBgNV
-BAMTBENSTDEwKwYDVR0QBCQwIoAPMjAwMjA0MTEwODI0MjdagQ8yMDIyMDQx
-MTA4NTQyN1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFH1w5a44iwY/qhwa
-j/nPJDCqhIQWMB0GA1UdDgQWBBR9cOWuOIsGP6ocGo/5zyQwqoSEFjAMBgNV
-HRMEBTADAQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6NC4wAwIEkDANBgkq
-hkiG9w0BAQUFAAOCAQEAKrgXzh8QlOu4mre5X+za95IkrNySO8cgjfKZ5V04
-ocI07cUTWVwFtStPYZuR+0H8/NU8TZh2BvWBfevdkObRVlTa4y0MnxEylCIB
-evZsLHRnBMylj44ss0O1lKLQfelifwa+JwGDnjr9iu6YQ0pr17WXOzq/T220
-Y/ozADQuLW2WyXvKmWO6vvT2MKAtmJbpVkQFqUSjYRDrgqFnXbxdJ3Wqiig2
-KjiS2d2kXgClzMx8KSreKJCrt+G2/30lC0DYqjSjLd4H61/OCt3Kfjp9JsFi
-aDrmLzfzgYYhxKlkqu9FNtEaZnz46TfW1mG+oq1I59/mdP7TbX3SJdysYlep
-9w==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFaDCCBFCgAwIBAgIQO1nHe81bV569N1KsdrSqGjANBgkqhkiG9w0BAQUF
-ADBiMRIwEAYDVQQKEwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBS
-b290IENBczEvMC0GA1UEAxMmYmVUUlVTVGVkIFJvb3QgQ0EgLSBSU0EgSW1w
-bGVtZW50YXRpb24wHhcNMDIwNDExMTExODEzWhcNMjIwNDEyMTEwNzI1WjBi
-MRIwEAYDVQQKEwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290
-IENBczEvMC0GA1UEAxMmYmVUUlVTVGVkIFJvb3QgQ0EgLSBSU0EgSW1wbGVt
-ZW50YXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkujQw
-CY5X0LkGLG9uJIAiv11DpvpPrILnHGhwhRujbrWqeNluB0s/6d/16uhUoWGK
-Di9pdRi3DOUUjXFumLhV/AyV0Jtu4S2I1DpAa5LxmZZk3tv/ePTulh1HiXzU
-vrmIdyM6CeYEnm2qXtLIvZpOGd+J6lsOfsPktPDgaTuID0GQ+NRxQyTBjyZL
-O1bp/4xsN+lFrYWMU8NghpBKlsmzVLC7F/AcRdnUGxlkVgoZ98zh/4avflhe
-rHqQH8koOUV7orbHnB/ahdQhhlkwk75TMzf270HPM8ercmsl9fNTGwxMLvF1
-S++gh/f+ihXQbNXL+WhTuXAVE8L1LvtDNXUtAgMBAAGjggIYMIICFDAMBgNV
-HRMEBTADAQH/MIIBtQYDVR0gBIIBrDCCAagwggGkBg8rBgEEAbE+AAADCSiD
-kTEwggGPMEEGCCsGAQUFBwIBFjVodHRwOi8vd3d3LmJldHJ1c3RlZC5jb20v
-cHJvZHVjdHNfc2VydmljZXMvaW5kZXguaHRtbDCCAUgGCCsGAQUFBwICMIIB
-OhqCATZSZWxpYW5jZSBvbiBvciB1c2Ugb2YgdGhpcyBDZXJ0aWZpY2F0ZSBj
-cmVhdGVzIGFuIGFja25vd2xlZGdtZW50IGFuZCBhY2NlcHRhbmNlIG9mIHRo
-ZSB0aGVuIGFwcGxpY2FibGUgc3RhbmRhcmQgdGVybXMgYW5kIGNvbmRpdGlv
-bnMgb2YgdXNlLCB0aGUgQ2VydGlmaWNhdGlvbiBQcmFjdGljZSBTdGF0ZW1l
-bnQgYW5kIHRoZSBSZWx5aW5nIFBhcnR5IEFncmVlbWVudCwgd2hpY2ggY2Fu
-IGJlIGZvdW5kIGF0IHRoZSBiZVRSVVNUZWQgd2ViIHNpdGUsIGh0dHA6Ly93
-d3cuYmV0cnVzdGVkLmNvbS9wcm9kdWN0c19zZXJ2aWNlcy9pbmRleC5odG1s
-MAsGA1UdDwQEAwIBBjAfBgNVHSMEGDAWgBSp7BR++dlDzFMrFK3P9/BZiUHN
-GTAdBgNVHQ4EFgQUqewUfvnZQ8xTKxStz/fwWYlBzRkwDQYJKoZIhvcNAQEF
-BQADggEBANuXsHXqDMTBmMpWBcCorSZIry0g6IHHtt9DwSwddUvUQo3neqh0
-3GZCWYez9Wlt2ames30cMcH1VOJZJEnl7r05pmuKmET7m9cqg5c0Lcd9NUwt
-NLg+DcTsiCevnpL9UGGCqGAHFFPMZRPB9kdEadIxyKbdLrML3kqNWz2rDcI1
-UqJWN8wyiyiFQpyRQHpwKzg21eFzGh/l+n5f3NacOzDq28BbJ1zTcwfBwvNM
-m2+fG8oeqqg4MwlYsq78B+g23FW6L09A/nq9BqaBwZMifIYRCgZ3SK41ty8y
-mmFei74pnykkiFY5LKjSq5YDWtRIn7lAhAuYaPsBQ9Yb4gmxlxw=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYT
-AlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNl
-cnR1bSBDQTAeFw0wMjA2MTExMDQ2MzlaFw0yNzA2MTExMDQ2MzlaMD4xCzAJ
-BgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNV
-BAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
-AM6xwS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYV
-M42sLQnFdvkrOYCJ5JdLkKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/Ox
-LjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ89eVgw1BS7Bqa/j8D35in2fE
-7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/KUz/iDsaW
-VhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu
-/qpGWX7PNSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYD
-VR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESS
-bLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+GXYkHAQaTOs9qmdvLdTN
-/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvgGrZg
-FCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqT
-E5s7FCMTY5w/0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5x
-O/fIR/RpbxXyEV6DHpx8Uq79AtoSqFlnGNu8cN2bsWntgM6JQEhqDjXKKWYV
-IZQs6GAqm4VKQPNriiTsBhYscw==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJH
-QjEbMBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxm
-b3JkMRowGAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFB
-IENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIz
-MTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu
-Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENB
-IExpbWl0ZWQxITAfBgNVBAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCC
-ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL5AnfRu4ep2hxxNRUSO
-vkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhGC1Pqy0wk
-wLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfH
-dr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf04
-9vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULi
-mAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cmez6KJcfA3Z3m
-NWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEKIz6W
-8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMB
-Af8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v
-QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwu
-Y29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG
-9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm
-7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHC
-v8S5dIa2LX1rzNLzRt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdV
-CYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAV
-GI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C12yxow+ev+to
-51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJH
-QjEbMBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxm
-b3JkMRowGAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEkMCIGA1UEAwwbU2Vj
-dXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4
-MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIg
-TWFuY2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2Rv
-IENBIExpbWl0ZWQxJDAiBgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2
-aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMBxM4KK0HDr
-c4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP9nQ95IDC
-+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8
-j6ysNstcrbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWC
-iIxe004MeuoIkbY2qitC++rCoznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtG
-Cd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3Vp6ea5EQz6YiO/O1R65Nx
-Tq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4EFgQU
-PNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB
-/wQFMAMBAf8wgYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2Rv
-Y2EuY29tL1NlY3VyZUNlcnRpZmljYXRlU2VydmljZXMuY3JsMDmgN6A1hjNo
-dHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlmaWNhdGVTZXJ2aWNl
-cy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm
-4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiF
-Gv45jN5bBAS0VPmjZ55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXG
-De+X3EyrEeFryzHRbPtIgKvcnDe4IRRLDXE97IMzbtFuMhbsmMcWi1mmNKsF
-Vy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6PwpCikFcSF9CfU
-a7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6s
-Cx1HRR3B7Hzs/Sk=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJH
-QjEbMBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxm
-b3JkMRowGAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDElMCMGA1UEAwwcVHJ1
-c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEwMDAwMDBaFw0y
-ODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVy
-IE1hbmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9k
-byBDQSBMaW1pdGVkMSUwIwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNl
-cnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA33FvNlhT
-WvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh73TkVvFVI
-xO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9
-C1t2ul/y/9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/
-oJOlh0Hyt3BAd9i+FHzjqMB6juljatEPmsbS9Is6FARW1O24zG71++IsWL1/
-T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsSivnkBbA7kUlcsutT6vif
-R4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1UdDgQW
-BBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0T
-AQH/BAUwAwEB/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21v
-ZG9jYS5jb20vVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMuY3JsMDqgOKA2
-hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENlcnRpZmljYXRlU2Vy
-dmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw
-uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdT
-mw7pSqBYaWcOrp32pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+C
-l5EfKNsYEYwq5GWDVxISjBc/lDb+XbDABHcTuPQV1T84zJQ6VdCsmPW6AF/g
-hhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0lR+4viMi14QVF
-wL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOj
-GM9O9y5Xt5hwXsjEeLBi
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQG
-EwJVUzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREw
-DwYDVQQLEwhEU1RDQSBFMTAeFw05ODEyMTAxODEwMjNaFw0xODEyMTAxODQw
-MjNaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVy
-ZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEB
-AQUAA4GLADCBhwKBgQCgbIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlR
-EmlvMVW5SXIACH7TpWJENySZj9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+Lth
-zfNHwJmm8fOR6Hh8AMthyUQncWlVSn5JTe2io74CTADKAqjuAQIxZA9SLRN0
-dja1erQtcQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBoBgNVHR8E
-YTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwg
-U2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTExDTALBgNV
-BAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMTAxODEwMjNagQ8yMDE4MTIx
-MDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFGp5fpFpRhgTCgJ3
-pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i+DAMBgNV
-HRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3
-DQEBBQUAA4GBACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lN
-QseSJqBcNJo4cvj9axY+IO6CizEqkzaFI4iKPANo08kJD038bKTaKHKTDomA
-sH3+gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4RbyhkwS7hp86W0N6
-w4pl
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIID2DCCAsACEQDQHkCLAAACfAAAAAIAAAABMA0GCSqGSIb3DQEBBQUAMIGp
-MQswCQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBM
-YWtlIENpdHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENv
-LjERMA8GA1UECxMIRFNUQ0EgWDExFjAUBgNVBAMTDURTVCBSb290Q0EgWDEx
-ITAfBgkqhkiG9w0BCQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTAeFw05ODEyMDEx
-ODE4NTVaFw0wODExMjgxODE4NTVaMIGpMQswCQYDVQQGEwJ1czENMAsGA1UE
-CBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkxJDAiBgNVBAoTG0Rp
-Z2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgWDEx
-FjAUBgNVBAMTDURTVCBSb290Q0EgWDExITAfBgkqhkiG9w0BCQEWEmNhQGRp
-Z3NpZ3RydXN0LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
-ANLGJrbnpT3BxGjVUG9TxW9JEwm4ryxIjRRqoxdfWvnTLnUv2Chi0ZMv/E3U
-q4flCMeZ55I/db3rJbQVwZsZPdJEjdd0IG03Ao9pk1uKxBmd9LIO/BZsubEF
-koPRhSxglD5FVaDZqwgh5mDoO3TymVBRaNADLbGAvqPYUrBEzUNKcI5YhZXh
-TizWLUFv1oTnyJhEykfbLCSlaSbPa7gnYsP0yXqSI+0TZ4KuRS5F5X5yP4Wd
-lGIQ5jyRoa13AOAV7POEgHJ6jm5gl8ckWRA0g1vhpaRptlc1HHhZxtMvOnNn
-7pTKBBMFYgZwI7P0fO5F2WQLW0mqpEPOJsREEmy43XkCAwEAATANBgkqhkiG
-9w0BAQUFAAOCAQEAojeyP2n714Z5VEkxlTMr89EJFEliYIalsBHiUMIdBlc+
-LegzZL6bqq1fG03UmZWii5rJYnK1aerZWKs17RWiQ9a2vAd5ZWRzfdd5ynvV
-WlHG4VMElo04z6MXrDlxawHDi1M8Y+nuecDkvpIyZHqzH5eUYr3qsiAVlfuX
-8ngvYzZAOONGDx3drJXK50uQe7FLqdTF65raqtWjlBRGjS0f8zrWkzr2Pnn8
-6Oawde3uPclwx12qgUtGJRzHbBXjlU4PqjI3lAoXJJIThFjSY28r9+ZbYgsT
-F7ANUkz+/m9c4pFuHf2kYtdo+o56T9II2pPc8JIRetDccpMMc5NihWjQ9A==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQG
-EwJVUzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREw
-DwYDVQQLEwhEU1RDQSBFMjAeFw05ODEyMDkxOTE3MjZaFw0xODEyMDkxOTQ3
-MjZaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVy
-ZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEB
-AQUAA4GLADCBhwKBgQC/k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fB
-w18DW9Fvrn5C6mYjuGODVvsoLeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87e
-ZfCocfdPJmyMvMa1795JJ/9IKn3oTQPMx7JSxhcxEzu1TdvIxPbDDyQq2gyd
-55FbgM2UnQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBoBgNVHR8E
-YTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwg
-U2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTIxDTALBgNV
-BAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMDkxOTE3MjZagQ8yMDE4MTIw
-OTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFB6CTShlgDzJQW6s
-NS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5WzAMBgNV
-HRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3
-DQEBBQUAA4GBAEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHR
-xdf0CiUPPXiBng+xZ8SQTGPdXqfiup/1902lMXucKS1M/mQ+7LZT/uqb7YLb
-dHVLB3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1mPnHfxsb1gYgAlih
-w6ID
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIID2DCCAsACEQDQHkCLAAB3bQAAAAEAAAAEMA0GCSqGSIb3DQEBBQUAMIGp
-MQswCQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBM
-YWtlIENpdHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENv
-LjERMA8GA1UECxMIRFNUQ0EgWDIxFjAUBgNVBAMTDURTVCBSb290Q0EgWDIx
-ITAfBgkqhkiG9w0BCQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTAeFw05ODExMzAy
-MjQ2MTZaFw0wODExMjcyMjQ2MTZaMIGpMQswCQYDVQQGEwJ1czENMAsGA1UE
-CBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkxJDAiBgNVBAoTG0Rp
-Z2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgWDIx
-FjAUBgNVBAMTDURTVCBSb290Q0EgWDIxITAfBgkqhkiG9w0BCQEWEmNhQGRp
-Z3NpZ3RydXN0LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
-ANx18IzAdZaawGIfJvfE4Zrq4FZzW5nNAUSoCLbVp9oaBBg5kkp4o4HC9Xd6
-ULRw/5qrxsfKboNPQpj7Jgva3G3WqZlVUmfpKAOS3OWwBZoPFflrWXJW8vo5
-/Kpo7g8fEIMv/J36F5bdguPmRX3AS4BEH+0s4IT9kVySVGkl5WJp3OXuAFK9
-MwutdQKFp2RQLcUZGTDAJtvJ0/0uma1ZtQtN1EGuhUhDWdy3qOKi3sOP17ih
-YqZoUFLkzzGnlIXan0YyF1bl8utmPRL/Q9uY73fPy4GNNLHGUEom0eQ+QVCv
-bK4iNC7Va26Dunm4dmVI2gkpZGMiuftHdoWMhkTLCdsCAwEAATANBgkqhkiG
-9w0BAQUFAAOCAQEAtTYOXeFhKFoRZcA/gwN5Tb4opgsHAlKFzfiR0BBstWog
-WxyQ2TA8xkieil5k+aFxd+8EJx8H6+Qm93N0yUQYGmbT4EOvkTvRyyzYdFQ6
-HE3K1GjNI3wdEJ5F6fYAbqbNGf9PLCmPV03Ed5K+4EwJ+11EhmYhqLkyolbV
-6YyDfFk/xPEL553snr2cGA4+wjl5KLcDDQjLxufZATdQEOzMYRZA1K8xdHv8
-PzGn0EdzMzkbzE5q10mDEQb+64JYMzJM8FasHpwvVpp7wUocpf1VNs78lk30
-sPDst2yC7S8xmUJMqbINuBVd8d+6ybVK1GSYsyapMMj9puyrliGtf8J4tg==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEgzCCA+ygAwIBAgIEOJ725DANBgkqhkiG9w0BAQQFADCBtDEUMBIGA1UE
-ChMLRW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9HQ0NB
-X0NQUyBpbmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsT
-HChjKSAyMDAwIEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1
-c3QubmV0IENsaWVudCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMDAy
-MDcxNjE2NDBaFw0yMDAyMDcxNjQ2NDBaMIG0MRQwEgYDVQQKEwtFbnRydXN0
-Lm5ldDFAMD4GA1UECxQ3d3d3LmVudHJ1c3QubmV0L0dDQ0FfQ1BTIGluY29y
-cC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDIwMDAg
-RW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQgQ2xp
-ZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA
-A4GNADCBiQKBgQCTdLS25MVL1qFof2LV7PdRV7NySpj10InJrWPNTTVRaoTU
-rcloeW+46xHbh65cJFET8VQlhK8pK5/jgOLZy93GRUk0iJBeAZfv6lOm3fzB
-3ksqJeTpNfpVBQbliXrqpBFXO/x8PTbNZzVtpKklWb1m9fkn5JVn1j+SgF7y
-NH0rhQIDAQABo4IBnjCCAZowEQYJYIZIAYb4QgEBBAQDAgAHMIHdBgNVHR8E
-gdUwgdIwgc+ggcyggcmkgcYwgcMxFDASBgNVBAoTC0VudHJ1c3QubmV0MUAw
-PgYDVQQLFDd3d3cuZW50cnVzdC5uZXQvR0NDQV9DUFMgaW5jb3JwLiBieSBy
-ZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMjAwMCBFbnRydXN0
-Lm5ldCBMaW1pdGVkMTMwMQYDVQQDEypFbnRydXN0Lm5ldCBDbGllbnQgQ2Vy
-dGlmaWNhdGlvbiBBdXRob3JpdHkxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw
-IoAPMjAwMDAyMDcxNjE2NDBagQ8yMDIwMDIwNzE2NDY0MFowCwYDVR0PBAQD
-AgEGMB8GA1UdIwQYMBaAFISLdP3FjcD/J20gN0V8/i3OutN9MB0GA1UdDgQW
-BBSEi3T9xY3A/ydtIDdFfP4tzrrTfTAMBgNVHRMEBTADAQH/MB0GCSqGSIb2
-fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQQFAAOBgQBObzWA
-O9GK9Q6nIMstZVXQkvTnhLUGJoMShAusO7JE7r3PQNsgDrpuFOow4DtifH+L
-a3xKp9U1PL6oXOpLu5OOgGarDyn9TS2/GpsKkMWr2tGzhtQvJFJcem3G8v7l
-TRowjJDyutdKPkN+1MhQGof4T4HHdguEOnKdzmVml64mXg==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIElTCCA/6gAwIBAgIEOJsRPDANBgkqhkiG9w0BAQQFADCBujEUMBIGA1UE
-ChMLRW50cnVzdC5uZXQxPzA9BgNVBAsUNnd3dy5lbnRydXN0Lm5ldC9TU0xf
-Q1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc
-KGMpIDIwMDAgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVz
-dC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe
-Fw0wMDAyMDQxNzIwMDBaFw0yMDAyMDQxNzUwMDBaMIG6MRQwEgYDVQQKEwtF
-bnRydXN0Lm5ldDE/MD0GA1UECxQ2d3d3LmVudHJ1c3QubmV0L1NTTF9DUFMg
-aW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykg
-MjAwMCBFbnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5l
-dCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0G
-CSqGSIb3DQEBAQUAA4GNADCBiQKBgQDHwV9OcfHO8GCGD9JYf9Mzly0XonUw
-tZZkJi9ow0SrqHXmAGc0V55lxyKbc+bT3QgON1WqJUaBbL3+qPZ1V1eMkGxK
-wz6LS0MKyRFWmponIpnPVZ5h2QLifLZ8OAfc439PmrkDQYC2dWcTC5/oVzbI
-XQA23mYU2m52H083jIITiQIDAQABo4IBpDCCAaAwEQYJYIZIAYb4QgEBBAQD
-AgAHMIHjBgNVHR8EgdswgdgwgdWggdKggc+kgcwwgckxFDASBgNVBAoTC0Vu
-dHJ1c3QubmV0MT8wPQYDVQQLFDZ3d3cuZW50cnVzdC5uZXQvU1NMX0NQUyBp
-bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAy
-MDAwIEVudHJ1c3QubmV0IExpbWl0ZWQxOjA4BgNVBAMTMUVudHJ1c3QubmV0
-IFNlY3VyZSBTZXJ2ZXIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxDTALBgNV
-BAMTBENSTDEwKwYDVR0QBCQwIoAPMjAwMDAyMDQxNzIwMDBagQ8yMDIwMDIw
-NDE3NTAwMFowCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFMtswGvjuz7L/CKc
-/vuLkpyw8m4iMB0GA1UdDgQWBBTLbMBr47s+y/winP77i5KcsPJuIjAMBgNV
-HRMEBTADAQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkq
-hkiG9w0BAQQFAAOBgQBi24GRzsiad0Iv7L0no1MPUBvqTpLwqa+poLpIYcvv
-yQbvH9X07t9WLebKahlzqlO+krNQAraFJnJj2HVQYnUUt7NQGj/KEQALhUVp
-bbalrlHhStyCP2yMNLJ3a9kC9n8O6mUE8c1UyrrJzOCE98g+EZfTYAkYvAX/
-bIkz8OwVDw==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UE
-ChMLRW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNf
-MjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsT
-HChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1
-c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEy
-MjQxNzUwNTFaFw0xOTEyMjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0
-Lm5ldDFAMD4GA1UECxQ3d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29y
-cC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkg
-RW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQgQ2Vy
-dGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEF
-AAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4
-QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/EC
-DNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuXMlBvPci6Zgzj
-/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzWnLLP
-KQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZd
-enoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH
-4QIDAQABo3QwcjARBglghkgBhvhCAQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB
-0RGAvtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdERgL7YibkIozH5oSQJ
-FrlwMB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0B
-AQUFAAOCAQEAWUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFh
-fGPjK50xA3B20qMooPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVU
-KcgF7bISKo30Axv/55IQh7A6tcOdBTcSo8f0FbnVpDkWm1M6I5HxqIKiaoho
-wXkCIryqptau37AUX7iH0N18f3v/rxzP5tsHrV7bhZ3QKw0z2wTR5klAEyt2
-+z7pnIkPFc4YsIV4IU9rTw76NmfNB/L/CNDi3tm/Kq+4h4YhPATKt5Rof888
-6ZjXOP/swNlQ8C5LWK5Gb9Auw2DaclVyvUxFnmG6v4SBkgPR0ml8xQ==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIE7TCCBFagAwIBAgIEOAOR7jANBgkqhkiG9w0BAQQFADCByTELMAkGA1UE
-BhMCVVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MUgwRgYDVQQLFD93d3cuZW50
-cnVzdC5uZXQvQ2xpZW50X0NBX0luZm8vQ1BTIGluY29ycC4gYnkgcmVmLiBs
-aW1pdHMgbGlhYi4xJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExp
-bWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENsaWVudCBDZXJ0aWZpY2F0
-aW9uIEF1dGhvcml0eTAeFw05OTEwMTIxOTI0MzBaFw0xOTEwMTIxOTU0MzBa
-MIHJMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxSDBGBgNV
-BAsUP3d3dy5lbnRydXN0Lm5ldC9DbGllbnRfQ0FfSW5mby9DUFMgaW5jb3Jw
-LiBieSByZWYuIGxpbWl0cyBsaWFiLjElMCMGA1UECxMcKGMpIDE5OTkgRW50
-cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQgQ2xpZW50
-IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GL
-ADCBhwKBgQDIOpleMRffrCdvkHvkGf9FozTC28GoT/Bo6oT9n3V5z8GKUZSv
-x1cDR2SerYIbWtp/N3hHuzeYEpbOxhN979IMMFGpOZ5V+Pux5zDeg7K6PvHV
-iTs7hbqqdCz+PzFur5GVbgbUB01LLFZHGARS2g4Qk79jkJvh34zmAqTmT173
-iwIBA6OCAeAwggHcMBEGCWCGSAGG+EIBAQQEAwIABzCCASIGA1UdHwSCARkw
-ggEVMIHkoIHhoIHepIHbMIHYMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50
-cnVzdC5uZXQxSDBGBgNVBAsUP3d3dy5lbnRydXN0Lm5ldC9DbGllbnRfQ0Ff
-SW5mby9DUFMgaW5jb3JwLiBieSByZWYuIGxpbWl0cyBsaWFiLjElMCMGA1UE
-CxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50
-cnVzdC5uZXQgQ2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYD
-VQQDEwRDUkwxMCygKqAohiZodHRwOi8vd3d3LmVudHJ1c3QubmV0L0NSTC9D
-bGllbnQxLmNybDArBgNVHRAEJDAigA8xOTk5MTAxMjE5MjQzMFqBDzIwMTkx
-MDEyMTkyNDMwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUxPucKXuXzUyW
-/O5bs8qZdIuV6kwwHQYDVR0OBBYEFMT7nCl7l81MlvzuW7PKmXSLlepMMAwG
-A1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI
-hvcNAQEEBQADgYEAP66K8ddmAwWePvrqHEa7pFuPeJoSSJn59DXeDDYHAmsQ
-OokUgZwxpnyyQbJq5wcBoUv5nyU7lsqZwz6hURzzwy5E97BnRqqS5TvaHBkU
-ODDV4qIxJS7x7EU47fgGWANzYrAQMY9Av2TgXD7FTx/aEkP/TOYGJqibGapE
-PHayXOw=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UE
-BhMCVVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50
-cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl
-MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UE
-AxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1
-dGhvcml0eTAeFw05OTA1MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQsw
-CQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3
-dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlh
-Yi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVkMTow
-OAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp
-b24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDNKIM0
-VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/I0dNxScZgSYMVHIN
-iC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3wkrYKZImZNHk
-mGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OCAdcwggHT
-MBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHboIHY
-pIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5
-BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChs
-aW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBM
-aW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENl
-cnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNo
-dHRwOi8vd3d3LmVudHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAi
-gA8xOTk5MDUyNTE2MDk0MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMC
-AQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYE
-FPAXYhNVPbP/CgBr+1CEl/PtYtAaMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9
-B0EABAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEAkNwwAvpkdMKn
-CqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN95K+8cPV1ZVqBLssziY2Zcgx
-xufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd2cNgQ4xYDiKWL2KjLB+6
-rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQG
-EwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1
-cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4
-MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgx
-LTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0
-eTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2R
-FGiYCh7+2gRvE4RiIcPRfM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO
-/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuv
-K9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAGA1UdHwRp
-MGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEt
-MCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5
-MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjAL
-BgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gjIBBPM5iQn9Qw
-HQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMBAf8w
-GgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GB
-AFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y
-7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2u
-FHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJV
-UzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1
-aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcN
-MjAwNjIxMDQwMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZh
-eCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2lu
-ZXNzIENBLTEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fe
-k6lfWg0XTzQaDJj0ItlZ1MRoRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5
-/VGcqiTZ9J2DKocKIdMSODRsjQBuWqDZQu4aIZX5UkxVWsUPOE9G+m34LjXW
-HXzr4vCwdYDIqROsvojvOm6rXyo4YgKwEnv+j6YDAgMBAAGjZjBkMBEGCWCG
-SAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEp4
-MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRKeDJSEdtZFjZe38EUNkBq
-R3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZMzfmpTMANmvPMZWnm
-JXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+WB5Hh1Q+WKG1
-tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+KpYr
-tWKmpj29f5JZzVoqgrI3eQ==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQG
-EwJVUzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlm
-YXggU2VjdXJlIGVCdXNpbmVzcyBDQS0yMB4XDTk5MDYyMzEyMTQ0NVoXDTE5
-MDYyMzEyMTQ0NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkVxdWlmYXgg
-U2VjdXJlMSYwJAYDVQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0Et
-MjCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF
-7Y6yEb3+6+e0dMKP/wXn2Z0GvxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKD
-pkWNYmi7hRsgcDKqQM2mll/EcTc/BPO3QSQ5BxoeLmFYoBIL5aXfxavqN3HM
-HMg3OrmXUqesxWoklE6ce8/AatbfIb0CAwEAAaOCAQkwggEFMHAGA1UdHwRp
-MGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORXF1aWZheCBT
-ZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0y
-MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTkwNjIzMTIxNDQ1WjAL
-BgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9euSBIplBqy/3YIHqngnYw
-HQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQFMAMBAf8w
-GgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GB
-AAyGgq3oThr1jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy
-0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkt
-y3D1E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUmV+GRMOrN
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJV
-UzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1
-aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0
-MDAwMFoXDTIwMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoT
-E0VxdWlmYXggU2VjdXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJl
-IEdsb2JhbCBlQnVzaW5lc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAw
-gYkCgYEAuucXkAJlsTRVPEnCUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQy
-td4zjTov2/KaelpzmKNc6fuKcxtc58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORR
-OhI8bIpaVIRw28HFkM9yRcuoWcDNM50/o5brhTMhHD4ePmBudpxnhcXIw2EC
-AwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8w
-HwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1draGwwHQYDVR0OBBYEFL6o
-oHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUAA4GBADDiAVGqx+pf
-2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkAZ70Br83gcfxa
-z2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIYNMR1
-pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYT
-AlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVz
-dCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBC
-MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UE
-AxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
-MIIBCgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEH
-CIjaWC9mOSm9BXiLnTjoBbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlC
-GDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet8u5fa9IAjbkU+BQVNdnARqN7
-csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+VcT4wt/lAj
-Nvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdRe
-JivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQAB
-o1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9
-qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1luMrMTjANBgkq
-hkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Qzxpe
-R+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWV
-Yrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF
-PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot
-2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeX
-xx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm
-Mw==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDdTCCAl2gAwIBAgILAgAAAAAA1ni3lAUwDQYJKoZIhvcNAQEEBQAwVzEL
-MAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNV
-BAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05
-ODA5MDExMjAwMDBaFw0xNDAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkw
-FwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRsw
-GQYDVQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUA
-A4IBDwAwggEKAoIBAQDaDuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR
-4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc
-71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4
-bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgK
-OOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMW
-ea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DP
-AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIABjAdBgNVHQ4EFgQUYHtmGkUNl8qJ
-UC99BM00qP/8/UswDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOC
-AQEArqqf/LfSyx9fOSkoGJ40yWxPbxrwZKJwSk8ThptgKJ7ogUmYfQq75bCd
-PTbbjwVR/wkxKh/diXeeDy5slQTthsu0AD+EAk2AaioteAuubyuig0SDH81Q
-gkwkr733pbTIWg/050deSY43lv6aiAU62cDbKYfmGZZHpzqmjIs8d/5GY6dT
-2iHRrH5Jokvmw2dZL7OKDrssvamqQnw1wdh/1acxOk5jQzmvCLBhNIzTmKlD
-NPYPhyk7ncJWWJh3w/cbrPad+D6qp1RF8PX51TFl/mtYnHGzHtdS6jIX/EBg
-Hcl5JLL2bP2oZg6C3ZjL2sJETy6ge/L3ayx2EYRGinij4w==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgw
-FgYDVQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRy
-dXN0IFNvbHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3Qg
-R2xvYmFsIFJvb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1
-MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYD
-VQQLEx5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMT
-GkdURSBDeWJlclRydXN0IEdsb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUA
-A4GNADCBiQKBgQCVD6C28FCc6HrHiM3dFw4usJTQGz0O9pTAipTHBsiQl8i4
-ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTSr41tiGeA5u2ylc9yMcqlHHK6XALn
-ZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X404Wqk2kmhXBIgD8SFcd5tB8F
-LztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3rGwnpXtlR22ciYaQqPEh3
-46B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l93PR2VX2bY1QY6fDq
-81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0PlZPvy5TYnh+d
-XIVtx6quTx8itc2VrbqnzPmrC3p/
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIB+jCCAWMCAgGjMA0GCSqGSIb3DQEBBAUAMEUxCzAJBgNVBAYTAlVTMRgw
-FgYDVQQKEw9HVEUgQ29ycG9yYXRpb24xHDAaBgNVBAMTE0dURSBDeWJlclRy
-dXN0IFJvb3QwHhcNOTYwMjIzMjMwMTAwWhcNMDYwMjIzMjM1OTAwWjBFMQsw
-CQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMRwwGgYDVQQD
-ExNHVEUgQ3liZXJUcnVzdCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB
-iQKBgQC45k+625h8cXyvRLfTD0bZZOWTwUKOx7pJjTUteueLveUFMVnGsS8K
-DPufpz+iCWaEVh43KRuH6X4MypqfpX/1FZSj1aJGgthoTNE3FQZor734sLPw
-KfWVWgkWYXcKIiXUT0Wqx73llt/51KiOQswkwB6RJ0q1bQaAYznEol44AwID
-AQABMA0GCSqGSIb3DQEBBAUAA4GBABKzdcZfHeFhVYAA1IFLezEPI2PnPfMD
-+fQ2qLvZ46WXTeorKeDWanOB5sCJo9Px4KWlIjeaY8JIILTbcuPI9tl8vrGv
-U9oUtCG41tWW4/5ODFlitppK+ULdjG+BqXH/9ApybW1EDp3zdHSo1TRJ6V6e
-6bR64eVaH4QwnNOfpSXY
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARwxCzAJBgNVBAYT
-AkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEu
-MCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5s
-LjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1
-MjEzMDEGA1UECxMqSVBTIENBIENoYWluZWQgQ0FzIENlcnRpZmljYXRpb24g
-QXV0aG9yaXR5MTMwMQYDVQQDEypJUFMgQ0EgQ2hhaW5lZCBDQXMgQ2VydGlm
-aWNhdGlvbiBBdXRob3JpdHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlw
-cy5lczAeFw0wMTEyMjkwMDUzNThaFw0yNTEyMjcwMDUzNThaMIIBHDELMAkG
-A1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UEBxMJQmFyY2Vs
-b25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBTZXJ2aWNl
-cyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBCLTYw
-OTI5NDUyMTMwMQYDVQQLEypJUFMgQ0EgQ2hhaW5lZCBDQXMgQ2VydGlmaWNh
-dGlvbiBBdXRob3JpdHkxMzAxBgNVBAMTKklQUyBDQSBDaGFpbmVkIENBcyBD
-ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3DQEJARYPaXBzQG1h
-aWwuaXBzLmVzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDcVpJJspQg
-vJhPUOtopKdJC7/SMejHT8KGC/po/UNaivNgkjWZOLtNA1IhW/A3mTXhQSCB
-hYEFcYGdtJUZqV92NC5jNzVXjrQfQj8VXOF6wV8TGDIxya2+o8eDZh65nAQT
-y2nBBt4wBrszo7Uf8I9vzv+W6FS+ZoCua9tBhDaiPQIDAQABo4IEQzCCBD8w
-HQYDVR0OBBYEFKGtMbH5PuEXpsirNPxShwkeYlJBMIIBTgYDVR0jBIIBRTCC
-AUGAFKGtMbH5PuEXpsirNPxShwkeYlJBoYIBJKSCASAwggEcMQswCQYDVQQG
-EwJFUzESMBAGA1UECBMJQmFyY2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmEx
-LjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMu
-bC4xKzApBgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4gIEItNjA5Mjk0
-NTIxMzAxBgNVBAsTKklQUyBDQSBDaGFpbmVkIENBcyBDZXJ0aWZpY2F0aW9u
-IEF1dGhvcml0eTEzMDEGA1UEAxMqSVBTIENBIENoYWluZWQgQ0FzIENlcnRp
-ZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5p
-cHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRk
-MGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggr
-BgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYK
-KwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBz
-QG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlwcy5lczBCBglg
-hkgBhvhCAQ0ENRYzQ2hhaW5lZCBDQSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkg
-aHR0cDovL3d3dy5pcHMuZXMvMCkGCWCGSAGG+EIBAgQcFhpodHRwOi8vd3d3
-Lmlwcy5lcy9pcHMyMDAyLzA3BglghkgBhvhCAQQEKhYoaHR0cDovL3d3dy5p
-cHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0FDLmNybDA8BglghkgBhvhCAQMELxYt
-aHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9yZXZvY2F0aW9uQ0FDLmh0bWw/
-MDkGCWCGSAGG+EIBBwQsFipodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jl
-bmV3YWxDQUMuaHRtbD8wNwYJYIZIAYb4QgEIBCoWKGh0dHA6Ly93d3cuaXBz
-LmVzL2lwczIwMDIvcG9saWN5Q0FDLmh0bWwwbQYDVR0fBGYwZDAuoCygKoYo
-aHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0FDLmNybDAyoDCg
-LoYsaHR0cDovL3d3d2JhY2suaXBzLmVzL2lwczIwMDIvaXBzMjAwMkNBQy5j
-cmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5p
-cHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAERyMJ1WWKJBGyi3leGmGpVfp3hA
-K+/blkr8THFj2XOVvQLiogbHvpcqk4A0hgP63Ng9HgfNHnNDJGD1HWHc3Jag
-vPsd4+cSACczAsDAK1M92GsDgaPb1pOVIO/Tln4mkImcJpvNb2ar7QMiRDjM
-Wb2f2/YHogF/JsRj9SVCXmK9
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIH6jCCB1OgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARIxCzAJBgNVBAYT
-AkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEu
-MCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5s
-LjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1
-MjEuMCwGA1UECxMlSVBTIENBIENMQVNFMSBDZXJ0aWZpY2F0aW9uIEF1dGhv
-cml0eTEuMCwGA1UEAxMlSVBTIENBIENMQVNFMSBDZXJ0aWZpY2F0aW9uIEF1
-dGhvcml0eTEeMBwGCSqGSIb3DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAx
-MTIyOTAwNTkzOFoXDTI1MTIyNzAwNTkzOFowggESMQswCQYDVQQGEwJFUzES
-MBAGA1UECBMJQmFyY2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmExLjAsBgNV
-BAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMubC4xKzAp
-BgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4gIEItNjA5Mjk0NTIxLjAs
-BgNVBAsTJUlQUyBDQSBDTEFTRTEgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx
-LjAsBgNVBAMTJUlQUyBDQSBDTEFTRTEgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
-dHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczCBnzANBgkqhkiG
-9w0BAQEFAAOBjQAwgYkCgYEA4FEnpwvdr9G5Q1uCN0VWcu+atsIS7ywSzHb5
-BlmvXSHU0lq4oNTzav3KaY1mSPd05u42veiWkXWmcSjK5yISMmmwPh5r9FBS
-YmL9Yzt9fuzuOOpi9GyocY3h6YvJP8a1zZRCb92CRTzo3wno7wpVqVZHYUxJ
-ZHMQKD/Kvwn/xi8CAwEAAaOCBEowggRGMB0GA1UdDgQWBBTrsxl588GlHKzc
-uh9morKbadB4CDCCAUQGA1UdIwSCATswggE3gBTrsxl588GlHKzcuh9morKb
-adB4CKGCARqkggEWMIIBEjELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNl
-bG9uYTESMBAGA1UEBxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJu
-ZXQgcHVibGlzaGluZyBTZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFp
-bC5pcHMuZXMgQy5JLkYuICBCLTYwOTI5NDUyMS4wLAYDVQQLEyVJUFMgQ0Eg
-Q0xBU0UxIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVJUFMg
-Q0EgQ0xBU0UxIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcN
-AQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8E
-BQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYBBQUH
-AwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIB
-FgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcw
-GgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0Bt
-YWlsLmlwcy5lczBBBglghkgBhvhCAQ0ENBYyQ0xBU0UxIENBIENlcnRpZmlj
-YXRlIGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5lcy8wKQYJYIZIAYb4QgEC
-BBwWGmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMDoGCWCGSAGG+EIBBAQt
-FitodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTEuY3Js
-MD8GCWCGSAGG+EIBAwQyFjBodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jl
-dm9jYXRpb25DTEFTRTEuaHRtbD8wPAYJYIZIAYb4QgEHBC8WLWh0dHA6Ly93
-d3cuaXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFMS5odG1sPzA6BglghkgB
-hvhCAQgELRYraHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lDTEFT
-RTEuaHRtbDBzBgNVHR8EbDBqMDGgL6AthitodHRwOi8vd3d3Lmlwcy5lcy9p
-cHMyMDAyL2lwczIwMDJDTEFTRTEuY3JsMDWgM6Axhi9odHRwOi8vd3d3YmFj
-ay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0UxLmNybDAvBggrBgEFBQcB
-AQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9vY3NwLmlwcy5lcy8wDQYJKoZI
-hvcNAQEFBQADgYEAK9Dr/drIyllq2tPMMi7JVBuKYn4VLenZMdMu9Ccj/1ur
-xUq2ckCuU3T0vAW0xtnIyXf7t/k0f3gA+Nak5FI/LEpjV4F1Wo7ojPsCwJTG
-Kbqz3Bzosq/SLmJbGqmODszFV0VRFOlOHIilkfSj945RyKm+hjM+5i9Ibq9U
-kE6tsSU=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIH6jCCB1OgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARIxCzAJBgNVBAYT
-AkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEu
-MCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5s
-LjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1
-MjEuMCwGA1UECxMlSVBTIENBIENMQVNFMyBDZXJ0aWZpY2F0aW9uIEF1dGhv
-cml0eTEuMCwGA1UEAxMlSVBTIENBIENMQVNFMyBDZXJ0aWZpY2F0aW9uIEF1
-dGhvcml0eTEeMBwGCSqGSIb3DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAx
-MTIyOTAxMDE0NFoXDTI1MTIyNzAxMDE0NFowggESMQswCQYDVQQGEwJFUzES
-MBAGA1UECBMJQmFyY2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmExLjAsBgNV
-BAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMubC4xKzAp
-BgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4gIEItNjA5Mjk0NTIxLjAs
-BgNVBAsTJUlQUyBDQSBDTEFTRTMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx
-LjAsBgNVBAMTJUlQUyBDQSBDTEFTRTMgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
-dHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczCBnzANBgkqhkiG
-9w0BAQEFAAOBjQAwgYkCgYEAqxf+DrDGaBtT8FK+n/ra+osTBLsBjzLZH49N
-zjaY2uQARIwo2BNEKqRrThckQpzTiKRBgtYj+4vJhuW5qYIF3PHeH+AMmVWY
-8jjsbJ0gA8DvqqPGZARRLXgNo9KoOtYkTOmWehisEyMiG3zoMRGzXwmqMHBx
-RiVrSXGAK5UBsh8CAwEAAaOCBEowggRGMB0GA1UdDgQWBBS4k/8uy9wsjqLn
-ev42USGjmFsMNDCCAUQGA1UdIwSCATswggE3gBS4k/8uy9wsjqLnev42USGj
-mFsMNKGCARqkggEWMIIBEjELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNl
-bG9uYTESMBAGA1UEBxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJu
-ZXQgcHVibGlzaGluZyBTZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFp
-bC5pcHMuZXMgQy5JLkYuICBCLTYwOTI5NDUyMS4wLAYDVQQLEyVJUFMgQ0Eg
-Q0xBU0UzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVJUFMg
-Q0EgQ0xBU0UzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcN
-AQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8E
-BQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYBBQUH
-AwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIB
-FgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcw
-GgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0Bt
-YWlsLmlwcy5lczBBBglghkgBhvhCAQ0ENBYyQ0xBU0UzIENBIENlcnRpZmlj
-YXRlIGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5lcy8wKQYJYIZIAYb4QgEC
-BBwWGmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMDoGCWCGSAGG+EIBBAQt
-FitodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTMuY3Js
-MD8GCWCGSAGG+EIBAwQyFjBodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jl
-dm9jYXRpb25DTEFTRTMuaHRtbD8wPAYJYIZIAYb4QgEHBC8WLWh0dHA6Ly93
-d3cuaXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFMy5odG1sPzA6BglghkgB
-hvhCAQgELRYraHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lDTEFT
-RTMuaHRtbDBzBgNVHR8EbDBqMDGgL6AthitodHRwOi8vd3d3Lmlwcy5lcy9p
-cHMyMDAyL2lwczIwMDJDTEFTRTMuY3JsMDWgM6Axhi9odHRwOi8vd3d3YmFj
-ay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0UzLmNybDAvBggrBgEFBQcB
-AQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9vY3NwLmlwcy5lcy8wDQYJKoZI
-hvcNAQEFBQADgYEAF2VcmZVDAyevJuXr0LMXI/dDqsfwfewPxqmurpYPdikc
-4gYtfibFPPqhwYHOU7BC0ZdXGhd+pFFhxu7pXu8Fuuu9D6eSb9ijBmgpjnn1
-/7/5p6/ksc7C0YBCJwUENPjDfxZ4IwwHJPJGR607VNCv1TGyr33I6unUVtkO
-E7LFRVA=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARQxCzAJBgNVBAYT
-AkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEu
-MCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5s
-LjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1
-MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTEgQ2VydGlmaWNhdGlvbiBBdXRo
-b3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUExIENlcnRpZmljYXRpb24g
-QXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwHhcN
-MDExMjI5MDEwNTMyWhcNMjUxMjI3MDEwNTMyWjCCARQxCzAJBgNVBAYTAkVT
-MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwG
-A1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjEr
-MCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEv
-MC0GA1UECxMmSVBTIENBIENMQVNFQTEgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
-dHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUExIENlcnRpZmljYXRpb24gQXV0
-aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwgZ8wDQYJ
-KoZIhvcNAQEBBQADgY0AMIGJAoGBALsw19zQVL01Tp/FTILq0VA8R5j8m2md
-d81u4D/u6zJfX5/S0HnllXNEITLgCtud186Nq1KLK3jgm1t99P1tCeWu4Wwd
-ByOgF9H5fahGRpEiqLJpxq339fWUoTCUvQDMRH/uxJ7JweaPCjbB/SQ9AaD1
-e+J8eGZDi09Z8pvZ+kmzAgMBAAGjggRTMIIETzAdBgNVHQ4EFgQUZyaW56G/
-2LUDnf473P7yiuYV3TAwggFGBgNVHSMEggE9MIIBOYAUZyaW56G/2LUDnf47
-3P7yiuYV3TChggEcpIIBGDCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlC
-YXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIElu
-dGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBz
-QG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBT
-IENBIENMQVNFQTEgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMT
-JklQUyBDQSBDTEFTRUExIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJ
-KoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAM
-BgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYI
-KwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYB
-BAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEE
-BAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGB
-D2lwc0BtYWlsLmlwcy5lczBCBglghkgBhvhCAQ0ENRYzQ0xBU0VBMSBDQSBD
-ZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkgaHR0cDovL3d3dy5pcHMuZXMvMCkGCWCG
-SAGG+EIBAgQcFhpodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyLzA7BglghkgB
-hvhCAQQELhYsaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xB
-U0VBMS5jcmwwQAYJYIZIAYb4QgEDBDMWMWh0dHA6Ly93d3cuaXBzLmVzL2lw
-czIwMDIvcmV2b2NhdGlvbkNMQVNFQTEuaHRtbD8wPQYJYIZIAYb4QgEHBDAW
-Lmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFQTEuaHRt
-bD8wOwYJYIZIAYb4QgEIBC4WLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIv
-cG9saWN5Q0xBU0VBMS5odG1sMHUGA1UdHwRuMGwwMqAwoC6GLGh0dHA6Ly93
-d3cuaXBzLmVzL2lwczIwMDIvaXBzMjAwMkNMQVNFQTEuY3JsMDagNKAyhjBo
-dHRwOi8vd3d3YmFjay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0VBMS5j
-cmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5p
-cHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAH66iqyAAIQVCtWYUQxkxZwCWINm
-yq0eB81+atqAB98DNEock8RLWCA1NnHtogo1EqWmZaeFaQoO42Hu6r4okzPV
-7Oi+xNtff6j5YzHIa5biKcJboOeXNp13XjFr/tOn2yrb25aLH2betgPAK7N4
-1lUH5Y85UN4HI3LmvSAUS7SG
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARQxCzAJBgNVBAYT
-AkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEu
-MCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5s
-LjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1
-MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTMgQ2VydGlmaWNhdGlvbiBBdXRo
-b3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUEzIENlcnRpZmljYXRpb24g
-QXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwHhcN
-MDExMjI5MDEwNzUwWhcNMjUxMjI3MDEwNzUwWjCCARQxCzAJBgNVBAYTAkVT
-MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwG
-A1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjEr
-MCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEv
-MC0GA1UECxMmSVBTIENBIENMQVNFQTMgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
-dHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUEzIENlcnRpZmljYXRpb24gQXV0
-aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwgZ8wDQYJ
-KoZIhvcNAQEBBQADgY0AMIGJAoGBAO6AAPYaZC6tasiDsYun7o/ZttvNG7uG
-BiJ2MwwSbUhWYdLcgiViL5/SaTBlA0IjWLxH3GvWdV0XPOH/8lhneaDBgbHU
-VqLyjRGZ/fZ98cfEXgIqmuJKtROKAP2Md4bm15T1IHUuDky/dMQ/gT6DtKM4
-Ninn6Cr1jIhBqoCm42zvAgMBAAGjggRTMIIETzAdBgNVHQ4EFgQUHp9XUEe2
-YZM50yz82l09BXW3mQIwggFGBgNVHSMEggE9MIIBOYAUHp9XUEe2YZM50yz8
-2l09BXW3mQKhggEcpIIBGDCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlC
-YXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIElu
-dGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBz
-QG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBT
-IENBIENMQVNFQTMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMT
-JklQUyBDQSBDTEFTRUEzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJ
-KoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAM
-BgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYI
-KwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYB
-BAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEE
-BAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGB
-D2lwc0BtYWlsLmlwcy5lczBCBglghkgBhvhCAQ0ENRYzQ0xBU0VBMyBDQSBD
-ZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkgaHR0cDovL3d3dy5pcHMuZXMvMCkGCWCG
-SAGG+EIBAgQcFhpodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyLzA7BglghkgB
-hvhCAQQELhYsaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xB
-U0VBMy5jcmwwQAYJYIZIAYb4QgEDBDMWMWh0dHA6Ly93d3cuaXBzLmVzL2lw
-czIwMDIvcmV2b2NhdGlvbkNMQVNFQTMuaHRtbD8wPQYJYIZIAYb4QgEHBDAW
-Lmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFQTMuaHRt
-bD8wOwYJYIZIAYb4QgEIBC4WLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIv
-cG9saWN5Q0xBU0VBMy5odG1sMHUGA1UdHwRuMGwwMqAwoC6GLGh0dHA6Ly93
-d3cuaXBzLmVzL2lwczIwMDIvaXBzMjAwMkNMQVNFQTMuY3JsMDagNKAyhjBo
-dHRwOi8vd3d3YmFjay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0VBMy5j
-cmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5p
-cHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAEo9IEca2on0eisxeewBwMwB9dbB
-/MjD81ACUZBYKp/nNQlbMAqBACVHr9QPDp5gJqiVp4MI3y2s6Q73nMify5NF
-8bpqxmdRSmlPa/59Cy9SKcJQrSRE7SOzSMtEQMEDlQwKeAYSAfWRMS1Jjbs/
-RU4s4OjNtckUFQzjB4ObJnXv
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIICtzCCAiACAQAwDQYJKoZIhvcNAQEEBQAwgaMxCzAJBgNVBAYTAkVTMRIw
-EAYDVQQIEwlCQVJDRUxPTkExEjAQBgNVBAcTCUJBUkNFTE9OQTEZMBcGA1UE
-ChMQSVBTIFNlZ3VyaWRhZCBDQTEYMBYGA1UECxMPQ2VydGlmaWNhY2lvbmVz
-MRcwFQYDVQQDEw5JUFMgU0VSVklET1JFUzEeMBwGCSqGSIb3DQEJARYPaXBz
-QG1haWwuaXBzLmVzMB4XDTk4MDEwMTIzMjEwN1oXDTA5MTIyOTIzMjEwN1ow
-gaMxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCQVJDRUxPTkExEjAQBgNVBAcT
-CUJBUkNFTE9OQTEZMBcGA1UEChMQSVBTIFNlZ3VyaWRhZCBDQTEYMBYGA1UE
-CxMPQ2VydGlmaWNhY2lvbmVzMRcwFQYDVQQDEw5JUFMgU0VSVklET1JFUzEe
-MBwGCSqGSIb3DQEJARYPaXBzQG1haWwuaXBzLmVzMIGfMA0GCSqGSIb3DQEB
-AQUAA4GNADCBiQKBgQCsT1J0nznqjtwlxLyYXZhkJAk8IbPMGbWOlI6H0fg3
-PqHILVikgDVboXVsHUUMH2Fjal5vmwpMwci4YSM1gf/+rHhwLWjhOgeYlQJU
-3c0jt4BT18g3RXIGJBK6E2Ehim51KODFDzT9NthFf+G4Nu+z4cYgjui0OLzh
-PvYR3oydAQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBACzzw3lYJN7GO9HgQmm4
-7mSzPWIBubOE3yN93ZjPEKn+ANgilgUTB1RXxafey9m4iEL2mdsUdx+2/iU9
-4aI+A6mB0i1sR/WWRowiq8jMDQ6XXotBtDvECgZAHd1G9AHduoIuPD14cJ58
-GNCr+Lh3B0Zx8coLY1xq+XKU1QFPoNtC
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIIODCCB6GgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCAR4xCzAJBgNVBAYT
-AkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEu
-MCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5s
-LjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1
-MjE0MDIGA1UECxMrSVBTIENBIFRpbWVzdGFtcGluZyBDZXJ0aWZpY2F0aW9u
-IEF1dGhvcml0eTE0MDIGA1UEAxMrSVBTIENBIFRpbWVzdGFtcGluZyBDZXJ0
-aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3DQEJARYPaXBzQG1haWwu
-aXBzLmVzMB4XDTAxMTIyOTAxMTAxOFoXDTI1MTIyNzAxMTAxOFowggEeMQsw
-CQYDVQQGEwJFUzESMBAGA1UECBMJQmFyY2Vsb25hMRIwEAYDVQQHEwlCYXJj
-ZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5nIFNlcnZp
-Y2VzIHMubC4xKzApBgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4gIEIt
-NjA5Mjk0NTIxNDAyBgNVBAsTK0lQUyBDQSBUaW1lc3RhbXBpbmcgQ2VydGlm
-aWNhdGlvbiBBdXRob3JpdHkxNDAyBgNVBAMTK0lQUyBDQSBUaW1lc3RhbXBp
-bmcgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxHjAcBgkqhkiG9w0BCQEWD2lw
-c0BtYWlsLmlwcy5lczCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAvLju
-VqWajOY2ycJioGaBjRrVetJznw6EZLqVtJCneK/K/lRhW86yIFcBrkSSQxA4
-Efdo/BdApWgnMjvEp+ZCccWZ73b/K5Uk9UmSGGjKALWkWi9uy9YbLA1UZ2t6
-KaFYq6JaANZbuxjC3/YeE1Z2m6Vo4pjOxgOKNNtMg0GmqaMCAwEAAaOCBIAw
-ggR8MB0GA1UdDgQWBBSL0BBQCYHynQnVDmB4AyKiP8jKZjCCAVAGA1UdIwSC
-AUcwggFDgBSL0BBQCYHynQnVDmB4AyKiP8jKZqGCASakggEiMIIBHjELMAkG
-A1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UEBxMJQmFyY2Vs
-b25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBTZXJ2aWNl
-cyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBCLTYw
-OTI5NDUyMTQwMgYDVQQLEytJUFMgQ0EgVGltZXN0YW1waW5nIENlcnRpZmlj
-YXRpb24gQXV0aG9yaXR5MTQwMgYDVQQDEytJUFMgQ0EgVGltZXN0YW1waW5n
-IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNA
-bWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsG
-A1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUF
-BwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYBBAGC
-NwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMw
-EYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlwcy5l
-czBHBglghkgBhvhCAQ0EOhY4VGltZXN0YW1waW5nIENBIENlcnRpZmljYXRl
-IGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5lcy8wKQYJYIZIAYb4QgECBBwW
-Gmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMEAGCWCGSAGG+EIBBAQzFjFo
-dHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJUaW1lc3RhbXBpbmcu
-Y3JsMEUGCWCGSAGG+EIBAwQ4FjZodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAy
-L3Jldm9jYXRpb25UaW1lc3RhbXBpbmcuaHRtbD8wQgYJYIZIAYb4QgEHBDUW
-M2h0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmVuZXdhbFRpbWVzdGFtcGlu
-Zy5odG1sPzBABglghkgBhvhCAQgEMxYxaHR0cDovL3d3dy5pcHMuZXMvaXBz
-MjAwMi9wb2xpY3lUaW1lc3RhbXBpbmcuaHRtbDB/BgNVHR8EeDB2MDegNaAz
-hjFodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJUaW1lc3RhbXBp
-bmcuY3JsMDugOaA3hjVodHRwOi8vd3d3YmFjay5pcHMuZXMvaXBzMjAwMi9p
-cHMyMDAyVGltZXN0YW1waW5nLmNybDAvBggrBgEFBQcBAQQjMCEwHwYIKwYB
-BQUHMAGGE2h0dHA6Ly9vY3NwLmlwcy5lcy8wDQYJKoZIhvcNAQEFBQADgYEA
-ZbrBzAAalZHK6Ww6vzoeFAh8+4Pua2JR0zORtWB5fgTYXXk36MNbsMRnLWha
-sl8OCvrNPzpFoeo2zyYepxEoxZSPhExTCMWTs/zif/WN87GphV+I3pGW7hdb
-rqXqcGV4LCFkAZXOzkw+UPS2Wctjjba9GNSHSl/c7+lW8AoM6HU=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQG
-EwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9v
-dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMg
-Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNa
-Fw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9W
-YWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0
-aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24g
-QXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1
-lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMukJ0KX0J+D
-isPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj18
-2d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Sp
-x2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZ
-yH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospUxbF6lR1xHkop
-igPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4wPQYI
-KwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFk
-aXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw
-ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlh
-bmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBw
-YXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs
-ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRp
-ZmljYXRpb24gcHJhY3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmlj
-YXRlIFBvbGljeS4wIgYIKwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMu
-Ym0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYw
-gaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJN
-MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENl
-cnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290
-IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCLMA4GA1UdDwEB/wQEAwIB
-BjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lofFIk3Wdv
-OXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10
-buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe
-/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6
-isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW
-xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQ
-NiOKSnQ2+Q==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlD
-ZXJ0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIElu
-Yy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRp
-b24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNv
-bS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYy
-NjAwMjIzM1oXDTE5MDYyNjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0
-IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4x
-NTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24g
-QXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8x
-IDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3
-DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfDcnWTq8+epvzzFlLWLU2f
-NUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs2Ejcv8ECIMYkpChM
-MFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqYJJgpp0lZpd34
-t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliEZwgs3x/b
-e0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJn0Wu
-PIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A
-PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIICXDCCAcWgAwIBAgIQCgEBAQAAAnwAAAALAAAAAjANBgkqhkiG9w0BAQUF
-ADA6MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0Eg
-U2VjdXJpdHkgMTAyNCBWMzAeFw0wMTAyMjIyMTAxNDlaFw0yNjAyMjIyMDAx
-NDlaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJT
-QSBTZWN1cml0eSAxMDI0IFYzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB
-gQDV3f5mCc8kPD6ugU5OisRpgFtZO9+5TUzKtS3DJy08rwBCbbwoppbPf9dY
-rIMKo1W1exeQFYRMiu4mmdxY78c4pqqv0I5CyGLXq6yp+0p9v+r+Ek3d/yYt
-bzZUaMjShFbuklNhCbM/OZuoyZu9zp9+1BlqFikYvtc6adwlWzMaUQIDAQAB
-o2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSME
-GDAWgBTEwBykB5T9zU0B1FTapQxf3q4FWjAdBgNVHQ4EFgQUxMAcpAeU/c1N
-AdRU2qUMX96uBVowDQYJKoZIhvcNAQEFBQADgYEAPy1q4yZDlX2Jl2X7deRy
-HUZXxGFraZ8SmyzVWujAovBDleMf6XbN3Ou8k6BlCsdNT1+nr6JGFLkM88y9
-am63nd4lQtBU/55oc2PcJOsiv6hy8l4A4Q1OOkNumU4/iXgDmMrzVcydro7B
-qkWY+o8aoI2II/EVQQ2lRj6RP4vr93E=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUF
-ADA6MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0Eg
-U2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAyMjIyMDM5MjNaFw0yNjAyMjIyMDM5
-MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJT
-QSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
-CgKCAQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37
-RqtBaB4Y6lXIL5F4iSj7Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E
-0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgbWhOHV4PR8CDn6E8jQrAApX2J
-6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iHKrtjEAMq
-s6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzD
-uvsf9/UP+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2Mw
-YTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAW
-gBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4EFgQUB8NRMKSq6UWuNST6
-/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmYv/3V
-EhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5g
-EydxiKRz44Rj0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+
-f00/FGj1EVDVwfSQpQgdMWD/YIwjVAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJq
-aHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395nzIlQnQFgCi/vcEk
-llgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA
-pKnXwiJPZ9d37CAFYd4=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJK
-UDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0
-eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMw
-OTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1
-c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RD
-QTEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8
-V6UMbXaKL0u/ZPtM7orw8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpx
-xpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uMDPpVmDvY6CKhS3E4eayXkmmz
-iX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX5HA49LY6
-tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819
-uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/L
-TX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZ
-aNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
-/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g0dNq
-/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94
-nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5
-Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNn
-PaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfci
-oU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi
-FL39vmwLAw==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDIDCCAgigAwIBAgIBJDANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJG
-STEPMA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MxIENB
-MB4XDTAxMDQwNjEwNDkxM1oXDTIxMDQwNjEwNDkxM1owOTELMAkGA1UEBhMC
-RkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMSBD
-QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALWJHytPZwp5/8Ue
-+H887dF+2rDNbS82rDTG29lkFwhjMDMiikzujrsPDUJVyZ0upe/3p4zDq7mX
-y47vPxVnqIJyY1MPQYx9EJUkoVqlBvqSV536pQHydekfvFYmUk54GWVYVQNY
-wBSujHxVX3BbdyMGNpfzJLWaRpXk3w0LBUXl0fIdgrvGE+D+qnr9aTCU89JF
-hfzyMlsy3uhsXR/LpCJ0sICOXZT3BgBLqdReLjVQCfOAl/QMF6452F/NM8Ec
-yonCIvdFEu1eEpOdY6uCLrnrQkFEy0oaAIINnvmLVz5MxxftLItyM19yejhW
-1ebZrgUaHXVFsculJRwSVzb9IjcCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB
-/zARBgNVHQ4ECgQIR+IMi/ZTiFIwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEB
-BQUAA4IBAQCLGrLJXWG04bkruVPRsoWdd44W7hE928Jj2VuXZfsSZ9gqXLar
-5V7DtxYvyOirHYr9qxp81V9jz9yw3Xe5qObSIjiHBxTZ/75Wtf0HDjxVyhbM
-p6Z3N/vbXB9OWQaHowND9Rart4S9Tu+fMTfwRvFAttEMpWT4Y14h21VOTzF2
-nBBhjrZTOqMRvq9tfB69ri3iDGnHhVNoomG6xT60eVR4ngrHAr5i0RGCS2Uv
-kVrCqIexVmiUefkl98HVrhq4uz2PqYo4Ffdz0Fpg0YCw8NzVUM1O7pJIae2y
-Ix4wzMiUyLb1O4Z/P6Yun/Y+LLWSlj7fLJOK/4GMDw9ZIRlXvVWa
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJG
-STEPMA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENB
-MB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMC
-RkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBD
-QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE
-+hY3/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gX
-GM2RX/uJ4+q/Tl18GybTdXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQ
-TiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMGf+dJQMjFAbJUWmYdPfz56TwK
-noG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8PtOFCx4j1
-P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURr
-BGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB
-/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEB
-BQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zilzqsWuasvfDXL
-rNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEIcbCd
-jdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr4
-50kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6
-Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkeja
-nZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQG
-EwJOTDEeMBwGA1UEChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQD
-Ex1TdGFhdCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQTAeFw0wMjEyMTcwOTIz
-NDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4wHAYDVQQKExVT
-dGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRl
-cmxhbmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
-AQEAmNK1URF6gaYUmHFtvsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rF
-DBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02PjLwYdjeFnejKScfST5gTCaI+
-Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGcaC1Hoi6Ce
-UJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7l
-r7HcsBthvJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4Zl
-kuxEK7COudxwC0barbxjiDn622r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGO
-MAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRVHSAAMDwwOgYIKwYBBQUH
-AgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9vdC1w
-b2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg
-0zTBLL9s+DANBgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k
-/rvuFbQvBgwp8qiSpGEN/KtcCFtREytNwiphyPgJWPwtArI5fZlmgb9uXJVF
-IGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbwMVcoEoJz6TMvplW0
-C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y
-nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBp
-IzlWYGeQiy52OfsRiJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYV
-wSR8MnwDHTuhWEUykw==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDXDCCAsWgAwIBAgICA+owDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYT
-AkRFMRAwDgYDVQQIEwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYD
-VQQKEzFUQyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3
-b3JrcyBHbWJIMSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBDbGFzcyAyIENB
-MSkwJwYJKoZIhvcNAQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAe
-Fw05ODAzMDkxMTU5NTlaFw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJE
-RTEQMA4GA1UECBMHSGFtYnVyZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UE
-ChMxVEMgVHJ1c3RDZW50ZXIgZm9yIFNlY3VyaXR5IGluIERhdGEgTmV0d29y
-a3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTEp
-MCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVAdHJ1c3RjZW50ZXIuZGUwgZ8w
-DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANo46O0yAClxgwENv4wB3NrGrTmk
-qYov1YtcaF9QxmL1Zr3KkSLsqh1R1z2zUbKDTl3LSbDwTFXlay3HhQswHJJO
-gtTKAu33b77c4OMUuAVT8pr0VotanoWT0bSCVq5Nu6hLVxa8/vhYnvgpjbB7
-zXjJT6yLZwzxnPv8V5tXXE8NAgMBAAGjazBpMA8GA1UdEwEB/wQFMAMBAf8w
-DgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3LnRy
-dXN0Y2VudGVyLmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0G
-CSqGSIb3DQEBBAUAA4GBAIRS+yjf/x91AbwBvgRWl2p0QiQxg/lGsQaKic+W
-LDO/jLVfenKhhQbOhvgFjuj5Jcrag4wGrOs2bYWRNAQ29ELw+HkuCkhcq8xR
-T3h2oNmsGb0q0WkEKJHKNhAngFdb0lz1wlurZIFjdFH0l7/NEij3TWZ/p/Ac
-ASZ4smZHcFFk
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDXDCCAsWgAwIBAgICA+swDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYT
-AkRFMRAwDgYDVQQIEwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYD
-VQQKEzFUQyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3
-b3JrcyBHbWJIMSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBDbGFzcyAzIENB
-MSkwJwYJKoZIhvcNAQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAe
-Fw05ODAzMDkxMTU5NTlaFw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJE
-RTEQMA4GA1UECBMHSGFtYnVyZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UE
-ChMxVEMgVHJ1c3RDZW50ZXIgZm9yIFNlY3VyaXR5IGluIERhdGEgTmV0d29y
-a3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTEp
-MCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVAdHJ1c3RjZW50ZXIuZGUwgZ8w
-DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALa0wTUFLg2N7KBAahwOJ6ZQkmtQ
-GwfeLud2zODa/ISoXoxjaitN2U4CdhHBC/KNecoAtvGwDtf7pBc9r6tpepYn
-v68zoZoqWarEtTcI8hKlMbZD9TKWcSgoq40oht+77uMMfTDWw1Krj10nnGvA
-o+cFa1dJRLNu6mTP0o56UHd3AgMBAAGjazBpMA8GA1UdEwEB/wQFMAMBAf8w
-DgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3LnRy
-dXN0Y2VudGVyLmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0G
-CSqGSIb3DQEBBAUAA4GBABY9xs3Bu4VxhUafPiCPUSiZ7C1FIWMjWwS7TJC4
-iJIETb19AaM/9uzO8d7+feXhPrvGq14L3T2WxMup1Pkm5gZOngylerpuw3yC
-GdHHsbHD2w2Om0B8NwvxXej9H5CIpQ5ON2QhqE6NtJ/x3kit1VYYUimLRzQS
-CdS7kjXvD9s0
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQG
-EwJESzEVMBMGA1UEChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50
-ZXJuZXQgUm9vdCBDQTAeFw0wMTA0MDUxNjMzMTdaFw0yMTA0MDUxNzAzMTda
-MEMxCzAJBgNVBAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJuZXQxHTAbBgNV
-BAsTFFREQyBJbnRlcm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOC
-AQ8AMIIBCgKCAQEAxLhAvJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4Nr
-XceO+YQwzho7+vvOi20jxsNuZp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaq
-HF1j4QeGDmUApy6mcca8uYGoOn0a0vnRrEvLznWv3Hv6gXPU/Lq9QYjUdLP5
-Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc14izbSysseLlJ28TQx5yc5IogCSEW
-Vmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGNeGlVRGn1ypYcNIUXJXfi9i8n
-mHj9eQY6otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcDR0G2l8ktCkEiu7vmpwID
-AQABo4IBJTCCASEwEQYJYIZIAYb4QgEBBAQDAgAHMGUGA1UdHwReMFwwWqBY
-oFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMMVERDIEludGVybmV0MR0w
-GwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxMEQ1JMMTAr
-BgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3WjAL
-BgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAw
-HQYDVR0OBBYEFGxkAcf9hW2syNqeUAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8w
-HQYJKoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0GCSqGSIb3DQEBBQUA
-A4IBAQBOQ8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540m
-gwV5dOy0uaOXwTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKs
-LtB9KOy282A4aW8+2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7T
-mHnaCB4Mb7j4Fifvwm899qNLPg7kbWzbO0ESm70NRyN/PErQr8Cv9u8btRXE
-64PECV90i9kR+8JWsTz4cMo0jUNAE4z9mQNUecYu6oah9jrUCbz0vGbMPVjQ
-V0kK7iXiQe4T+Zs4NNEA9X7nlB38aQNiuJkFBT1reBK9sG9l
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFGTCCBAGgAwIBAgIEPki9xDANBgkqhkiG9w0BAQUFADAxMQswCQYDVQQG
-EwJESzEMMAoGA1UEChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTAeFw0w
-MzAyMTEwODM5MzBaFw0zNzAyMTEwOTA5MzBaMDExCzAJBgNVBAYTAkRLMQww
-CgYDVQQKEwNUREMxFDASBgNVBAMTC1REQyBPQ0VTIENBMIIBIjANBgkqhkiG
-9w0BAQEFAAOCAQ8AMIIBCgKCAQEArGL2YSCyz8DGhdfjeebM7fI5kqSXLmSj
-hFuHnEz9pPPEXyG9VhDr2y5h7JNp46PMvZnDBfwGuMo2HP6QjklMxFaaL1a8
-z3sM8W9Hpg1DTeLpHTk0zY0s2RKY+ePhwUp8hjjEqcRhiNJerxomTdXkoCJH
-hNlktxmW/OwZ5LKXJk5KTMuPJItUGBxIYXvViGjaXbXqzRowwYCDdlCqT9HU
-3Tjw7xb04QxQBr/q+3pJoSgrHPb8FTKjdGqPqcNiKXEx5TukYBdedObaE+3p
-Hx8b0bJoc8YQNHVGEBDjkAB2QMuLt0MJIf+rTpPGWOmlgtt3xDqZsXKVSQTw
-tyv6e1mO3QIDAQABo4ICNzCCAjMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B
-Af8EBAMCAQYwgewGA1UdIASB5DCB4TCB3gYIKoFQgSkBAQEwgdEwLwYIKwYB
-BQUHAgEWI2h0dHA6Ly93d3cuY2VydGlmaWthdC5kay9yZXBvc2l0b3J5MIGd
-BggrBgEFBQcCAjCBkDAKFgNUREMwAwIBARqBgUNlcnRpZmlrYXRlciBmcmEg
-ZGVubmUgQ0EgdWRzdGVkZXMgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4x
-LiBDZXJ0aWZpY2F0ZXMgZnJvbSB0aGlzIENBIGFyZSBpc3N1ZWQgdW5kZXIg
-T0lEIDEuMi4yMDguMTY5LjEuMS4xLjARBglghkgBhvhCAQEEBAMCAAcwgYEG
-A1UdHwR6MHgwSKBGoESkQjBAMQswCQYDVQQGEwJESzEMMAoGA1UEChMDVERD
-MRQwEgYDVQQDEwtUREMgT0NFUyBDQTENMAsGA1UEAxMEQ1JMMTAsoCqgKIYm
-aHR0cDovL2NybC5vY2VzLmNlcnRpZmlrYXQuZGsvb2Nlcy5jcmwwKwYDVR0Q
-BCQwIoAPMjAwMzAyMTEwODM5MzBagQ8yMDM3MDIxMTA5MDkzMFowHwYDVR0j
-BBgwFoAUYLWF7FZkfhIZJ2cdUBVLc647+RIwHQYDVR0OBBYEFGC1hexWZH4S
-GSdnHVAVS3OuO/kSMB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6NC4wAwIEkDAN
-BgkqhkiG9w0BAQUFAAOCAQEACromJkbTc6gJ82sLMJn9iuFXehHTuJTXCRBu
-o7E4A9G28kNBKWKnctj7fAXmMXAnVBhOinxO5dHKjHiIzxvTkIvmI/gLDjND
-fZziChmPyQE+dF10yYscA+UYyAFMP8uXBV2YcaaYb7Z8vTd/vuGTJW1v8Aqt
-FxjhA7wHKcitJuj4YfD9IQl+mo6paH1IYnK9AOoBmbgGglGBTvH1tJFUuSN6
-AJqfXY3gPGS5GhKSKseCRHI53OI8xthV9RVOyAUO28bQYqbsFbS1AoLbrIyi
-gfCbmTH1ICCoiGEKB5+U/NDXG8wuF/MEJ3Zn61SD/aSQfgY9BKNDLdr8C2Lq
-L19iUw==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDITCCAoqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCByzELMAkGA1UEBhMC
-WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3du
-MRowGAYDVQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlm
-aWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFBl
-cnNvbmFsIEJhc2ljIENBMSgwJgYJKoZIhvcNAQkBFhlwZXJzb25hbC1iYXNp
-Y0B0aGF3dGUuY29tMB4XDTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVow
-gcsxCzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNV
-BAcTCUNhcGUgVG93bjEaMBgGA1UEChMRVGhhd3RlIENvbnN1bHRpbmcxKDAm
-BgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24xITAfBgNV
-BAMTGFRoYXd0ZSBQZXJzb25hbCBCYXNpYyBDQTEoMCYGCSqGSIb3DQEJARYZ
-cGVyc29uYWwtYmFzaWNAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOB
-jQAwgYkCgYEAvLyTU23AUE+CFeZIlDWmWr5vQvoPR+53dXLdjUmbllegeNTK
-P1GzaQuRdhciB5dqxFGTS+CN7zeVoQxN2jSQHReJl+A1OFdKwPQIcOk8RHtQ
-fmGakOMj04gRRif1CwcOu93RfyAKiLlWCy4cgNrx454p7xS9CkT7G1sY0b8j
-kyECAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOB
-gQAt4plrsD16iddZopQBHyvdEktTwq1/qqcAXJFAVyVKOKqEcLnZgA+le1z7
-c8a914phXAPjLSeoF+CEhULcXpvGt7Jtu3Sv5D/Lp7ew4F2+eIMllNLbgQ95
-B21P9DkVWlIBe94y1k049hJcBlDfBVu9FEuh3ym6O0GN92NWod8isQ==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDLTCCApagAwIBAgIBADANBgkqhkiG9w0BAQQFADCB0TELMAkGA1UEBhMC
-WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3du
-MRowGAYDVQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlm
-aWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEkMCIGA1UEAxMbVGhhd3RlIFBl
-cnNvbmFsIEZyZWVtYWlsIENBMSswKQYJKoZIhvcNAQkBFhxwZXJzb25hbC1m
-cmVlbWFpbEB0aGF3dGUuY29tMB4XDTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIz
-NTk1OVowgdExCzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUx
-EjAQBgNVBAcTCUNhcGUgVG93bjEaMBgGA1UEChMRVGhhd3RlIENvbnN1bHRp
-bmcxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24x
-JDAiBgNVBAMTG1RoYXd0ZSBQZXJzb25hbCBGcmVlbWFpbCBDQTErMCkGCSqG
-SIb3DQEJARYccGVyc29uYWwtZnJlZW1haWxAdGhhd3RlLmNvbTCBnzANBgkq
-hkiG9w0BAQEFAAOBjQAwgYkCgYEA1GnX1LCUZFtx6UfYDFG26nKRsIRefS0N
-j3sS34UldSh0OkIsYyeflXtL734Zhx2G6qPduc6WZBrCFG5ErHzmj+hND3Ef
-QDimAKOHePb5lIZererAXnbr2RSjXW56fAylS1V/Bhkpf56aJtVquzgkCGqY
-x7Hao5iR/Xnb5VrEHLkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq
-hkiG9w0BAQQFAAOBgQDH7JJ+Tvj1lqVnYiqk8E0RYNBvjWBYYawmu1I1XAjP
-MPuoSpaKH2JCI4wXD/S6ZJwXrEcp352YXtJsYHFcoqzceePnbgBHH7UNKOgC
-neSa/RP0ptl8sfjcXyMmCZGAc9AUG95DqYMl8uacLxXK/qarigd1iwzdUYRr
-5PjRzneigQ==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDKTCCApKgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBzzELMAkGA1UEBhMC
-WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3du
-MRowGAYDVQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlm
-aWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEjMCEGA1UEAxMaVGhhd3RlIFBl
-cnNvbmFsIFByZW1pdW0gQ0ExKjAoBgkqhkiG9w0BCQEWG3BlcnNvbmFsLXBy
-ZW1pdW1AdGhhd3RlLmNvbTAeFw05NjAxMDEwMDAwMDBaFw0yMDEyMzEyMzU5
-NTlaMIHPMQswCQYDVQQGEwJaQTEVMBMGA1UECBMMV2VzdGVybiBDYXBlMRIw
-EAYDVQQHEwlDYXBlIFRvd24xGjAYBgNVBAoTEVRoYXd0ZSBDb25zdWx0aW5n
-MSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMSMw
-IQYDVQQDExpUaGF3dGUgUGVyc29uYWwgUHJlbWl1bSBDQTEqMCgGCSqGSIb3
-DQEJARYbcGVyc29uYWwtcHJlbWl1bUB0aGF3dGUuY29tMIGfMA0GCSqGSIb3
-DQEBAQUAA4GNADCBiQKBgQDJZtn4B0TPuYwu8KHvE0VsBd/eJxZRNkERbGw7
-7f4QfRKe5ZtCmv5gMcNmt3M6SK5O0DI3lIi1DbbZ8/JE2dWIEt12TfIa/G8j
-Hnrx2JhFTgcQ7xZC0EN1bUre4qrJMf8fAHB8Zs8QJQi6+u4A6UYDZicRFTuq
-W/KY3TZCstqIdQIDAQABoxMwETAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3
-DQEBBAUAA4GBAGk2ifc0KjNyL2071CKyuG+axTZmDhs8obF1Wub9NdP4qPIH
-b4Vnjt4rueIXsDqg8A6iAJrf8xQVbrvIhVqYgPn/vnQdPfP+MCXRNzRn+qVx
-eTBhKXLA4CxM+1bkOqhv5TJZUtt1KFBZDPgLGeSs2a+WjS9Q2wfD6h+rM+D1
-KzGJ
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMC
-WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3du
-MR0wGwYDVQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2Vy
-dGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3Rl
-IFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNl
-cnZlckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1
-OVowgc4xCzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQ
-BgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMUVGhhd3RlIENvbnN1bHRpbmcg
-Y2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24x
-ITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3
-DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0B
-AQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhI
-NTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQug2SBhRz1JPL
-lyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/qgeN
-9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0B
-AQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI
-hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZ
-a4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcU
-Qg==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMC
-WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3du
-MR0wGwYDVQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2Vy
-dGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3Rl
-IFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0
-ZS5jb20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkG
-A1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2Fw
-ZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UE
-CxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQ
-VGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRz
-QHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I
-/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC
-6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCXL+eQbcAoQpnX
-TEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzARMA8G
-A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWD
-TSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e
-QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdni
-TCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIICoTCCAgqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBizELMAkGA1UEBhMC
-WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmls
-bGUxDzANBgNVBAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhhd3RlIENlcnRpZmlj
-YXRpb24xHzAdBgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcgQ0EwHhcNOTcw
-MTAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBizELMAkGA1UEBhMCWkExFTAT
-BgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzAN
-BgNVBAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24x
-HzAdBgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcgQ0EwgZ8wDQYJKoZIhvcN
-AQEBBQADgY0AMIGJAoGBANYrWHhhRYZT6jR7UZztsOYuGA7+4F+oJ9O0yeB8
-WU4WDnNUYMF/9p8u6TqFJBU820cEY8OexJQaWt9MevPZQx08EHp5JduQ/vBR
-5zDWQQD9nyjfeb6Uu522FOMjhdepQeBMpHmwKxqL8vg7ij5FrHGSALSQQZj7
-X+36ty6K+Ig3AgMBAAGjEzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcN
-AQEEBQADgYEAZ9viwuaHPUCDhjc1fR/OmsMMZiCouqoEiYbC9RAIDb/LogWK
-0E02PvTX72nGXuSwlG9KuefeW4i2e9vjJ+V2w/A1wcu1J5szedyQpgCed/r8
-zSeUQhac0xxo7L9c3eWpexAKMnRUEzGLhQOEkbdYATAUOK8oyvyxUBkZCayJ
-SdM=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUF
-ADCBkzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0
-IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEw
-HwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZBgNVBAMTElVU
-TiAtIERBVEFDb3JwIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2
-MzBaMIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNh
-bHQgTGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsx
-ITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTEbMBkGA1UEAxMS
-VVROIC0gREFUQUNvcnAgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
-CgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6E5Qbvfa2gI5lBZMAHryv4g+O
-GQ0SR+ysraP6LnD43m77VkIVni5c7yPeIbkFdicZD0/Ww5y0vpQZY/KmEQrr
-U0icvvIpOxboGqBMpsn0GFlowHDyUwDAXlCCpVZvNvlK4ESGoE1O1kduSUrL
-Z9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA9P4yPykqlXvY8qdOD1R8
-oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulWbfXv33i+
-Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQABo4Gr
-MIGoMAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRT
-MtGzz3/64PGgXYVOktKeRR20TzA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8v
-Y3JsLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dDLmNybDAqBgNVHSUE
-IzAhBggrBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3
-DQEBBQUAA4IBAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHc
-rpY6CiM+iVnJowftGzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuM
-FrMOoAyYUJuTqXAJyCyjj98C5OBxOvG0I3KgqgHf35g+FFCgMSa9KOlaMCZ1
-+XtgHI3zzVAmbQQnmt/VDUVHKWss5nbZqSl9Mt3JNjy9rjXxEZ4du5A/EkdO
-jtd+D2JzHVImOBwYSf0wdJrE5SIv2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jF
-VkwPDPafepE39peC4N1xaf92P2BNPM/3mfnGV/TJVTl4uix5yaaIK/QI
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEojCCA4qgAwIBAgIQRL4Mi1AAJLQR0zYlJWfJiTANBgkqhkiG9w0BAQUF
-ADCBrjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0
-IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEw
-HwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xNjA0BgNVBAMTLVVU
-Ti1VU0VSRmlyc3QtQ2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBFbWFpbDAe
-Fw05OTA3MDkxNzI4NTBaFw0xOTA3MDkxNzM2NThaMIGuMQswCQYDVQQGEwJV
-UzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYD
-VQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93
-d3cudXNlcnRydXN0LmNvbTE2MDQGA1UEAxMtVVROLVVTRVJGaXJzdC1DbGll
-bnQgQXV0aGVudGljYXRpb24gYW5kIEVtYWlsMIIBIjANBgkqhkiG9w0BAQEF
-AAOCAQ8AMIIBCgKCAQEAsjmFpPJ9q0E7YkY3rs3BYHW8OWX5ShpHornMSMxq
-mNVNNRm5pELlzkniii8efNIxB8dOtINknS4p1aJkxIW9hVE1eaROaJB7HHqk
-kqgX8pgV8pPMyaQylbsMTzC9mKALi+VuG6JG+ni8om+rWV6lL8/K2m2qL+us
-obNqqrcuZzWLeeEeaYji5kbNoKXqvgvOdjp6Dpvq/NonWz1zHyLmSGHGTPNp
-saguG7bUMSAsvIKKjqQOpdeJQ/wWWq8dcdcRWdq6hw2v+vPhwvCkxWeM1tZU
-Ot4KpLoDd7NlyP0e03RiqhjKaJMeoYV+9Udly/hNVyh00jT/MLbu9mIwFIws
-6wIDAQABo4G5MIG2MAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0G
-A1UdDgQWBBSJgmd9xJ0mcABLtFBIfN49rgRufTBYBgNVHR8EUTBPME2gS6BJ
-hkdodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLVVTRVJGaXJzdC1DbGll
-bnRBdXRoZW50aWNhdGlvbmFuZEVtYWlsLmNybDAdBgNVHSUEFjAUBggrBgEF
-BQcDAgYIKwYBBQUHAwQwDQYJKoZIhvcNAQEFBQADggEBALFtYV2mGn98q0rk
-MPxTbyUkxsrt4jFcKw7u7mFVbwQ+zznexRtJlOTrIEy05p5QLnLZjfWqo7NK
-2lYcYJeA3IKirUq9iiv/Cwm0xtcgBEXkzYABurorbs6q15L+5K/r9CYdFip/
-bDCVNy8zEqx/3cfREYxRmLLQo5HQrfafnoOTHh1CuEava2bwm3/q4wMC5QJR
-warVNZ1yQAOJujEdxRBoUp7fooXFXAimeOZTT7Hot9MUnpOmw2TjrH5xzbyf
-6QMbzPvprDHBr3wVdAKZw7JHpsIyYdfHb0gkUSeh1YdV8nuPmD0Wnu51tvjQ
-jvLzxq4oW6fw8zYX/MMF08oDSlQ=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUF
-ADCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0
-IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEw
-HwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVU
-Ti1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5
-MTgxOTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQH
-Ew5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3
-b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNV
-BAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3DQEBAQUA
-A4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZ
-FvfgIXlIwrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6N
-q9Bq/bkqVRcQVLMZ8Jr28bFdtqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEH
-OG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8i4fDidNdoI6yqqr2jmmI
-BsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjfPe58
-BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhb
-AgMBAAGjgbkwgbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYD
-VR0OBBYEFKFyXyYbKJhDlV0HN9WFlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWG
-M2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3
-YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF
-BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0o
-XnWO6y1n7k57K9cM//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjA
-bPLPSbtNk28GpgoiskliCE7/yMgUsogWXecB5BKV5UU0s4tpvc+0hY91UZ59
-Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2lzvukJDKxA4f
-Fm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchq
-J/kniCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0q
-UZ6B+dQ7XnASfxAynB67nfhmqA==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEZDCCA0ygAwIBAgIQRL4Mi1AAJLQR0zYwS8AzdzANBgkqhkiG9w0BAQUF
-ADCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0
-IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEw
-HwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVU
-Ti1VU0VSRmlyc3QtTmV0d29yayBBcHBsaWNhdGlvbnMwHhcNOTkwNzA5MTg0
-ODM5WhcNMTkwNzA5MTg1NzQ5WjCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgT
-AlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVT
-RVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVz
-dC5jb20xKzApBgNVBAMTIlVUTi1VU0VSRmlyc3QtTmV0d29yayBBcHBsaWNh
-dGlvbnMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCz+5Gh5DZV
-hawGNFugmliy+LUPBXeDrjKxdpJo7CNKyXY/45y2N3kDuatpjQclthln5LAb
-GHNhSuh+zdMvZOOmfAz6F4CjDUeJT1FxL+78P/m4FoCHiZMlIJpDgmkkdihZ
-NaEdwH+DBmQWICzTSaSFtMBhf1EI+GgVkYDLpdXuOzr0hAReYFmnjDRy7rh4
-xdE7EkpvfmUnuaRVxblvQ6TFHSyZwFKkeEwVs0CYCGtDxgGwenv1axwiP8vv
-/6jQOkt2FZ7S0cYu49tXGzKiuG/ohqY/cKvlcJKrRB5AUPuco2LkbG6gyN7i
-gEL66S/ozjIEj3yNtxyjNTwV3Z7DrpelAgMBAAGjgZEwgY4wCwYDVR0PBAQD
-AgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFPqGydvguul49Uuo1hXf
-8NPhahQ8ME8GA1UdHwRIMEYwRKBCoECGPmh0dHA6Ly9jcmwudXNlcnRydXN0
-LmNvbS9VVE4tVVNFUkZpcnN0LU5ldHdvcmtBcHBsaWNhdGlvbnMuY3JsMA0G
-CSqGSIb3DQEBBQUAA4IBAQCk8yXM0dSRgyLQzDKrm5ZONJFUICU0YV8qAhXh
-i6r/fWRRzwr/vH3YIWp4yy9Rb/hCHTO967V7lMPDqaAt39EpHx3+jz+7qEUq
-f9FuVSTiuwL7MT++6LzsQCv4AdRWOOTKRIK1YSAhZ2X28AvnNPilwpyjXEAf
-hZOVBt5P1CeptqX8Fs1zMT+4ZSfP1FMa8Kxun08FDAOBp4QpxFq9ZFdyrTvP
-NximmMatBrTcCKME1SmklpoSZ0qMYEWd8SOasACcaLWYUNPvji6SZbFIPiG+
-FTAqDbUMo2s/rn9X9R+WfN9v3YIwLGUbQErNaLly7HF27FSOH4UMAWr6pjis
-H8SE
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEZjCCA06gAwIBAgIQRL4Mi1AAJLQR0zYt4LNfGzANBgkqhkiG9w0BAQUF
-ADCBlTELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0
-IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEw
-HwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHTAbBgNVBAMTFFVU
-Ti1VU0VSRmlyc3QtT2JqZWN0MB4XDTk5MDcwOTE4MzEyMFoXDTE5MDcwOTE4
-NDAzNlowgZUxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJVVDEXMBUGA1UEBxMO
-U2FsdCBMYWtlIENpdHkxHjAcBgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0d29y
-azEhMB8GA1UECxMYaHR0cDovL3d3dy51c2VydHJ1c3QuY29tMR0wGwYDVQQD
-ExRVVE4tVVNFUkZpcnN0LU9iamVjdDCCASIwDQYJKoZIhvcNAQEBBQADggEP
-ADCCAQoCggEBAM6qgT+jo2F4qjEAVZURnicPHxzfOpuCaDDASmEd8S8O+r55
-96Uj71VRloTN2+O5bj4x2AogZ8f02b+U60cEPgLOKqJdhwQJ9jCdGIqXsqoc
-/EHSoTbL+z2RuufZcDX65OeQw5ujm9M89RKZd7G3CeBo5hy485RjiGpq/gt2
-yb70IuRnuasaXnfBhQfdDWy/7gbHd2pBnqcP1/vulBe3/IW+pKvEHDHd17bR
-5PDv3xaPslKT16HUiaEHLr/hARJCHhrh2JU022R5KP+6LhHC5ehbkkj7RwvC
-bNqtMoNB86XlQXD9ZZBt+vpRxPm9lisZBCzTbafc8H9vg2XiaquHhnUCAwEA
-AaOBrzCBrDALBgNVHQ8EBAMCAcYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E
-FgQU2u1kdBScFDyr3ZmpvVsoTYs8ydgwQgYDVR0fBDswOTA3oDWgM4YxaHR0
-cDovL2NybC51c2VydHJ1c3QuY29tL1VUTi1VU0VSRmlyc3QtT2JqZWN0LmNy
-bDApBgNVHSUEIjAgBggrBgEFBQcDAwYIKwYBBQUHAwgGCisGAQQBgjcKAwQw
-DQYJKoZIhvcNAQEFBQADggEBAAgfUrE3RHjb/c652pWWmKpVZIC1WkDdIaXF
-wfNfLEzIR1pp6ujwNTX00CXzyKakh0q9G7FzCL3Uw8q2NbtZhncxzaeAFK4T
-7/yxSPlrJSUtUbYsbUXBmMiKVl0+7kNOPmsnjtA6S4ULX9Ptaqd1y9Fahy85
-dRNacrACgZ++8A+EVCBibGnU4U3GDZlDAQ0Slox4nb9QorFEqmrPF3rPbw/U
-+CRVX/A0FklmPlBGyWNxODFiuGK581OtbLUrohKqGU8J2l7nk8aOFAj+8DCA
-GKCGhU3IfdeLA/5u1fedFqySLKAj5ZyRUh+U3xeUc8OzwcFxBSAAeL0TUh2o
-Ps0AH8g=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlD
-ZXJ0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIElu
-Yy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRp
-b24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNv
-bS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYy
-NTIyMjM0OFoXDTE5MDYyNTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0
-IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4x
-NTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24g
-QXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8x
-IDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3
-DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9YLqdUHAZu9OqNSLwxlBfw
-8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+TunRf50sQB1ZaG6m
-+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8YTfwggtFzVXSN
-dnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0LBwGlN+V
-YH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLWI8so
-gTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw
-nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlD
-ZXJ0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIElu
-Yy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRp
-b24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNv
-bS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYy
-NjAwMTk1NFoXDTE5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0
-IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4x
-NTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24g
-QXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8x
-IDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3
-DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vYdA757tn2VUdZZUcOBVXc
-65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9WlmpZdRJEy0kTRxQ
-b7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QSv4dk+NoS/zcn
-wbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9vUJSZSWI4
-OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTuIYEZ
-oDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC
-W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIICPTCCAaYCEQDNun9W8N/kvFT+IqyzcqpVMA0GCSqGSIb3DQEBAgUAMF8x
-CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UE
-CxMuQ2xhc3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv
-cml0eTAeFw05NjAxMjkwMDAwMDBaFw0yODA4MDEyMzU5NTlaMF8xCzAJBgNV
-BAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xh
-c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCB
-nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Rm/baNWYS2ZSHH2Z965jeu3
-noaACpEO+jglr0aIguVzqKCbJF0NH8xlbgyw0FaEGIeaBpsQoXPftFg5a27B
-9hXVqKg/qhIGjTGsf7A01480Z4gJzRQR4k5FVmkfeAKA2txHkSm7NsljXMXg
-1y2He6G3MrB7MLoqLzGq7qNn2tsCAwEAATANBgkqhkiG9w0BAQIFAAOBgQBM
-P7iLxmjf7kMzDl3ppssHhE16M/+SG/Q2rdiVIjZoEWx8QszznC7EBz8UsA9P
-/5CSdvnivErpj82ggAr3xSnxgiJduLHdgSOjeyUVRjB5FvjqBUuUfx3CHMjj
-t/QQQDwTw18fU+hI5Ia0e6E1sHslurjTjqs/OJ0ANACY89FxlA==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcEx
-CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UE
-CxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv
-cml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAt
-IEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBU
-cnVzdCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVow
-gcExCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoG
-A1UECxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1
-dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5j
-LiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2ln
-biBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCq
-0Lq+Fi24g9TK0g+8djHKlNgdk4xWArzZbxpvUjZudVYKVdPfQ4chEWWKfo+9
-Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIqWpDBucSmFc/IReumXY6c
-PvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQIDAQABMA0G
-CSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0Jh9Zr
-bWB85a7FkCMMXErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2ul
-uIncrKTdcu1OofdPvAbT6shkdHvClUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4i
-P/68DzFc6PLZ
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHK
-MQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNV
-BAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5
-IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBD
-BgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlm
-aWNhdGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3
-MTYyMzU5NTlaMIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24s
-IEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNV
-BAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQg
-dXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFBy
-aW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI
-hvcNAQEBBQADggEPADCCAQoCggEBAN2E1Lm0+afY8wR4nN493GwTFtl63SRR
-ZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/EbRrsC+MO8ESlV8dAWB6j
-Rx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjVojYJrKsh
-JlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjbPG7P
-oBMAGrgnoeS+Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP2
-6KbqxzcSXKMpHgLZ2x87tNcPVkeBFQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHh
-v2Vrn5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAq2aN17O6x5q25lXQ
-BfGfMY1aqtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/N
-y9Sn2WCVhDr4wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUf
-xJM8/XmPBNQ+T+r3ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFM
-DSZl4kSAHsef493oCtrspSCAaWihT37ha88HQfqDjrw43bAuEbFrskLMmrz5
-SCJ5ShkPshw+IHTZasO+8ih4E1Z5T21Q6huwtVexN2ZYI/PcD98Kh8TvhgXV
-OBRgmaNL3gaWcSzy27YfpO8/7g==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIICPDCCAaUCEC0b/EoXjaOR6+f/9YtFvgswDQYJKoZIhvcNAQECBQAwXzEL
-MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQL
-Ey5DbGFzcyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y
-aXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UE
-BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz
-cyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGf
-MA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC2WoujDWojg4BrzzmH9CETMwZM
-JaLtVRKXxaeAufqDwSCg+i8VDXyhYGt+eSz6Bg86rvYbb7HS/y8oUl+DfUvE
-erf4Zh+AVPy3wo5ZShRXRtGak75BkQO7FYCTXOvnzAhsPz6zSvz/S2wj1VCC
-JkQZjiPDceoZJEcEnnW/yKYAHwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBAIob
-K/o5wXTXXtgZZKJYSi034DNHD6zt96rbHuSLBlxgJ8pFUs4W7z8GZOeUaHxg
-MxURaa+dYo2jA1Rrpr7l7gUYYAS/QoD90KioHgE796Ncr6Pc5iaAIzy4RHT3
-Cq5Ji2F4zCS/iIqnDupzGUH9TQPwiNHleI2lKk/2lw0Xd8rY
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHB
-MQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNV
-BAsTM0NsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRo
-b3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNpZ24sIEluYy4g
-LSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24g
-VHJ1c3QgTmV0d29yazAeFw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTla
-MIHBMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6
-BgNVBAsTM0NsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBB
-dXRob3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNpZ24sIElu
-Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNp
-Z24gVHJ1c3QgTmV0d29yazCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA
-p4gBIXQs5xoD8JjhlzwPIQjxnNuX6Zr8wgQGE75fUsjMHiwSViy4AWkszJkf
-rbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRCwiNPStjwDqL7MWzJ5m+Z
-Jwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cCAwEAATAN
-BgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9jinb3/
-7aHmZuovCfTK1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAX
-rXfMSTWqz9iP0b63GJZHc2pUIjRkLbYWm1lbtFFZOrMLFPQS32eg9K0yZF6x
-RnInjBJ7xUS0rg==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcox
-CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UE
-CxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkg
-VmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMG
-A1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZp
-Y2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcx
-NjIzNTk1OVowgcoxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwg
-SW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazE6MDgGA1UE
-CxMxKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1
-c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJp
-bWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMIIBIjANBgkqhkiG
-9w0BAQEFAAOCAQ8AMIIBCgKCAQEArwoNwtUs22e5LeWUJ92lvuCwTY+zYVY8
-1nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6tW8UvxDOJxOeBUebMXoT
-2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUYwZF7C9UT
-AJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9okoqQ
-HgiBVrKtaaNS0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjN
-qWm6o+sdDZykIKbBoMXRRkwXbdKsZj+WjOCE1Db/IlnF+RFgqF8EffIa9iVC
-YQ/ESrg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0JhU8wI1NQ0kdvekh
-ktdmnLfexbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf
-0xwLRtxyID+u7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydE
-p85EXdQbkJgNHkKUsQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377B
-MnMiIYtYgXsVkXq642RIsH/7NiXaldDxJBQX3RiAa0YjOVT1jmIJBB2UkKab
-5iXiQkWquJCtvgiPqQtCGJTPcjnhsUPgKM+351psE2tJs//jGHyJizNdrDPX
-p/naOlXJWBD5qu9ats9LS98q
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzEL
-MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQL
-Ey5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y
-aXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UE
-BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz
-cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGf
-MA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69q
-RUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94f56TuZoAqiN91qyFomNFx3In
-zPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Olhec9vn2a
-/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtM
-EivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPw
-TtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzk
-uxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcEx
-CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UE
-CxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv
-cml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAt
-IEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBU
-cnVzdCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVow
-gcExCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoG
-A1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1
-dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5j
-LiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2ln
-biBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDM
-XtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXX
-wc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg013gfqLptQ5GV
-j0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQABMA0G
-CSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01U
-bSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i
-F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo
-1KpYoJ2daZH9
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHK
-MQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNV
-BAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5
-IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBD
-BgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlm
-aWNhdGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3
-MTYyMzU5NTlaMIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24s
-IEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNV
-BAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQg
-dXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFBy
-aW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI
-hvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2
-R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2tKmFZpGcmTNDo
-vFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUccLwg
-TS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+V
-k7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ
-Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJ
-OxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my
-/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f
-j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoA
-Wii/gt/4uhMdUIaC/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8S
-GhJouPtmmRQURVyu565pF4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbb
-o27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh
-/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDAjCCAmsCEDKIjprS9esTR/h/xCA3JfgwDQYJKoZIhvcNAQEFBQAwgcEx
-CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UE
-CxMzQ2xhc3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv
-cml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAt
-IEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBU
-cnVzdCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVow
-gcExCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoG
-A1UECxMzQ2xhc3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1
-dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5j
-LiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2ln
-biBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC6
-8OTP+cSuhVS5B1f5j8V/aBH4xBewRNzjMHPVKmIquNDMHO0oW369atyzkSTK
-QWI8/AIBvxwWMZQFl3Zuoq29YRdsTjCG8FE3KlDHqGKB3FtKqsGgtG7rL+VX
-xbErQHDbWk2hjh+9Ax/YA9SPTJlxvOKCzFjomDqG04Y48wApHwIDAQABMA0G
-CSqGSIb3DQEBBQUAA4GBAIWMEsGnuVAVess+rLhDityq3RS6iYF+ATwjcSGI
-L4LcY/oCRaxFWdcqWERbt5+BO5JoPeI3JPV7bI92NZYJqFmduc4jq3TWg/0y
-cyfYaT5DdPauxYma51N86Xv2S/PBZYPejYqcPIiNOVn8qj8ijaHBZlCBckzt
-ImRPT8qAkbYp
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHK
-MQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNV
-BAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5
-IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBD
-BgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlm
-aWNhdGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3
-MTYyMzU5NTlaMIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24s
-IEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNV
-BAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQg
-dXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFBy
-aW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI
-hvcNAQEBBQADggEPADCCAQoCggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYl
-S+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaStBO3IFsJ+mGuqPKljYXC
-KtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM8BDc
-VHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdL
-MEYH5IBtptiWLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XY
-ufTsgsbSPZUd5cBPhMnZo0QoBmrXRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDD
-Zq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAj/ola09b5KROJ1Wr
-IhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt
-mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csK
-vE+MW8VLADsfKoKmfjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluP
-QSjA1egtTaRezarZ7c7c2NU8Qh0XwRJdRTjDOPP8hS6DRkiy1yBfkjaP53kP
-mF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr
-9Xgn2uf3ZkPznoM+IKrDNWCRzg==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIICNDCCAaECEAKtZn5ORf5eV288mBle3cAwDQYJKoZIhvcNAQECBQAwXzEL
-MAkGA1UEBhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMu
-MS4wLAYDVQQLEyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9y
-aXR5MB4XDTk0MTEwOTAwMDAwMFoXDTEwMDEwNzIzNTk1OVowXzELMAkGA1UE
-BhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYD
-VQQLEyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGb
-MA0GCSqGSIb3DQEBAQUAA4GJADCBhQJ+AJLOesGugz5aqomDV6wlAXYMra6O
-LDfO6zV4ZFQD5YRAUcm/jwjiioII0haGN1XpsSECrXZogZoFokvJSyVmIlZs
-iAeP94FZbYQHZXATcXY+m3dM41CJVphIuR2nKRoTLkoRWZweFdVJVCxzOmmC
-sZc5nG1wZ0jl3S3WyB57AgMBAAEwDQYJKoZIhvcNAQECBQADfgBl3X7hsuyw
-4jrg7HFGmhkRuNPHoLQDQCYCPgmc4RKz0Vr2N6W3YQO2WxZpO8ZECAyIUwxr
-l0nHPjXcbLm7qt9cuzovk2C2qUtN8iD3zV9/ZHuO3ABc1/p3yjkWWW8O6tO1
-g39NTUJWdrTJXwT4OPjr0l91X817/OWOgHz8UA==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDzTCCAzagAwIBAgIQU2GyYK7bcY6nlLMTM/QHCTANBgkqhkiG9w0BAQUF
-ADCBwTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTww
-OgYDVQQLEzNDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24g
-QXV0aG9yaXR5IC0gRzIxOjA4BgNVBAsTMShjKSAxOTk4IFZlcmlTaWduLCBJ
-bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAsTFlZlcmlT
-aWduIFRydXN0IE5ldHdvcmswHhcNMDAwOTI2MDAwMDAwWhcNMTAwOTI1MjM1
-OTU5WjCBpTEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl
-cmlTaWduIFRydXN0IE5ldHdvcmsxOzA5BgNVBAsTMlRlcm1zIG9mIHVzZSBh
-dCBodHRwczovL3d3dy52ZXJpc2lnbi5jb20vcnBhIChjKTAwMSwwKgYDVQQD
-EyNWZXJpU2lnbiBUaW1lIFN0YW1waW5nIEF1dGhvcml0eSBDQTCBnzANBgkq
-hkiG9w0BAQEFAAOBjQAwgYkCgYEA0hmdZ8IAIVlizrQJIkRpivglWtvtDbc2
-fk7gu5Q+kCWHwmFHKdm9VLhjzCx9abQzNvQ3B5rB3UBU/OB4naCTuQk9I1F/
-RMIUdNsKvsvJMDRAmD7Q1yUQgZS9B0+c1lQn3y6ov8uQjI11S7zi6ESHzeZB
-CiVu6PQkAsVSD27smHUCAwEAAaOB3zCB3DAPBgNVHRMECDAGAQH/AgEAMEUG
-A1UdIAQ+MDwwOgYMYIZIAYb4RQEHFwEDMCowKAYIKwYBBQUHAgEWHGh0dHBz
-Oi8vd3d3LnZlcmlzaWduLmNvbS9ycGEwMQYDVR0fBCowKDAmoCSgIoYgaHR0
-cDovL2NybC52ZXJpc2lnbi5jb20vcGNhMy5jcmwwCwYDVR0PBAQDAgEGMEIG
-CCsGAQUFBwEBBDYwNDAyBggrBgEFBQcwAaYmFiRodHRwOi8vb2NzcC52ZXJp
-c2lnbi5jb20vb2NzcC9zdGF0dXMwDQYJKoZIhvcNAQEFBQADgYEAgnBold+2
-DcIBcBlK0lRWHqzyRUyHuPU163hLBanInTsZIS5wNEqi9YngFXVF5yg3ADQn
-Keg3S/LvRJdrF1Eaw1adPBqK9kpGRjeM+sv1ZFo4aC4cw+9wzrhGBha/937n
-tag+RaypJXUie28/sJyU58dzq6wf7iWbwBbtt8pb8BQ=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUF
-ADBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlz
-YSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMT
-E1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0
-MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UE
-CxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAa
-BgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUA
-A4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh
-28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8bRaVK7362
-rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81
-q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtF
-Wsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0
-lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaLdXe6YJ2E5/4t
-AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G
-A1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOC
-AQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR
-zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKht
-cbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGI
-xHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu
-YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/
-hC3euiInlhBx6yLt398znM/jra6O1I7mT1GvFpLgXPYHDw==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDgDCCAmigAwIBAgICAx4wDQYJKoZIhvcNAQEFBQAwYTELMAkGA1UEBhMC
-VVMxDTALBgNVBAoTBFZJU0ExLzAtBgNVBAsTJlZpc2EgSW50ZXJuYXRpb25h
-bCBTZXJ2aWNlIEFzc29jaWF0aW9uMRIwEAYDVQQDEwlHUCBSb290IDIwHhcN
-MDAwODE2MjI1MTAwWhcNMjAwODE1MjM1OTAwWjBhMQswCQYDVQQGEwJVUzEN
-MAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNl
-cnZpY2UgQXNzb2NpYXRpb24xEjAQBgNVBAMTCUdQIFJvb3QgMjCCASIwDQYJ
-KoZIhvcNAQEBBQADggEPADCCAQoCggEBAKkBcLWqxEDwq2omYXkZAPy/mzdZ
-DK9vZBv42pWUJGkzEXDK41Z0ohdXZFwgBuHW73G3O/erwWnQSaSxBNf0V2KJ
-XLB1LRckaeNCYOTudNargFbYiCjh+20i/SN8RnNPflRzHqgsVVh1t0zzWkWl
-Ahr62p3DRcMiXvOL8WAp0sdftAw6UYPvMPjU58fy+pmjIlC++QU3o63tmsPm
-7IgbthknGziLgE3sucfFicv8GjLtI/C1AVj59o/ghalMCXI5Etuz9c9OYmTa
-xhkVOmMd6RdVoUwiPDQyRvhlV7or7zaMavrZ2UT0qt2E1w0cslSsMoW0ZA3e
-QbuxNMYBhjJk1Z8CAwEAAaNCMEAwHQYDVR0OBBYEFJ59SzS/ca3CBfYDdYDO
-qU8axCRMMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqG
-SIb3DQEBBQUAA4IBAQAhpXYUVfmtJ3CPPPTVbMjMCqujmAuKBiPFyWHbmQdp
-NSYx/scuhMKZYdQN6X0uEyt8joW2hcdLzzW2LEc9zikv2G+fiRxkk78IvXbQ
-kIqUs38oW26sTTMs7WXcFsziza6kPWKSBpUmv9+55CCmc2rBvveURNZNbyoL
-axhNdBA2aGpawWqn3TYpjLgwi08hPwAuVDAHOrqK5MOeyti12HvOdUVmB/Rt
-Ldh6yumJivIj2C/LbgA2T/vwLwHMD8AiZfSr4k5hLQOCfZEWtTDVFN5ex5D8
-ofyrEK9ca3CnB+8phuiyJccg/ybdd+95RBTEvd07xQObdyPsoOy7Wjm1zK0G
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC
-TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0
-aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0
-aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz
-MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw
-IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR
-dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG
-9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp
-li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D
-rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ
-WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug
-F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU
-xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC
-Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv
-dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw
-ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl
-IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh
-c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy
-ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh
-Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI
-KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T
-KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq
-y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p
-dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD
-VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL
-MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk
-fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8
-7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R
-cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y
-mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW
-xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK
-SnQ2+Q==
------END CERTIFICATE-----
-
------BEGIN CERTIFICATE-----
-MIIETzCCAzegAwIBAgIEO63vKTANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE
-ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg
-U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDEwOTIzMTQxODE3WhcNMTEw
-OTIzMTMxODE3WjB1MQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v
-LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MR8wHQYDVQQDExZDQyBTaWdu
-ZXQgLSBDQSBLbGFzYSAxMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC4SRW9Q58g5DY1Hw7h
-gCRKBEdPdGn0MFHsfw7rlu/oQm7IChI/uWd9q5wwo77YojtTDjRnpgZsjqBeynX8T90vFILqsY2K
-5CF1OESalwvVr3sZiQX79lisuFKat92u6hBFikFIVxfHHB67Af+g7u0dEHdDW7lwy81MwFYxBTRy
-9wIDAQABo4IBbTCCAWkwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwggEEBgNVHSAE
-gfwwgfkwgfYGDSsGAQQBvj8CAQoBAQAwgeQwgZoGCCsGAQUFBwICMIGNGoGKQ2VydHlmaWthdCB3
-eXN0YXdpb255IHpnb2RuaWUgeiBkb2t1bWVudGVtOiAiUG9saXR5a2EgQ2VydHlmaWthY2ppIGRs
-YSBSb290Q0EiLiBDZXJ0eWZpa2F0IHd5c3Rhd2lvbnkgcHJ6ZXogUm9vdENBIHcgaGllcmFyY2hp
-aSBDQyBTaWduZXQuMEUGCCsGAQUFBwIBFjlodHRwOi8vd3d3LnNpZ25ldC5wbC9yZXBvenl0b3Jp
-dW0vZG9rdW1lbnR5L3BjX3Jvb3RjYS50eHQwHwYDVR0jBBgwFoAUwJvFIw0C4aZOSGsfAOnjmhQb
-sa8wHQYDVR0OBBYEFMODHtVZd1T7TftXR/nEI1zR54njMA0GCSqGSIb3DQEBBQUAA4IBAQBRIHQB
-FIGh8Jpxt87AgSLwIEEk4+oGy769u3NtoaR0R3WNMdmt7fXTi0tyTQ9V4AIszxVjhnUPaKnF1KYy
-f8Tl+YTzk9ZfFkZ3kCdSaILZAOIrmqWNLPmjUQ5/JiMGho0e1YmWUcMci84+pIisTsytFzVP32/W
-+sz2H4FQAvOIMmxB7EJX9AdbnXn9EXZ+4nCqi0ft5z96ZqOJJiCB3vSaoYg+wdkcvb6souMJzuc2
-uptXtR1Xf3ihlHaGW+hmnpcwFA6AoNrom6Vgzk6U1ienx0Cw28BhRSKqzKkyXkuK8gRflZUx84uf
-tXncwKJrMiE3lvgOOBITRzcahirLer4c
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIE9zCCA9+gAwIBAgIEPL/xoTANBgkqhkiG9w0BAQUFADB2MQswCQYDVQQGEwJQTDEfMB0GA1UE
-ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg
-U2lnbmV0MSAwHgYDVQQDExdDQyBTaWduZXQgLSBQQ0EgS2xhc2EgMjAeFw0wMjA0MTkxMDI5NTNa
-Fw0xNzA0MTgxMjUzMDdaMHUxCzAJBgNVBAYTAlBMMR8wHQYDVQQKExZUUCBJbnRlcm5ldCBTcC4g
-eiBvLm8uMSQwIgYDVQQLExtDZW50cnVtIENlcnR5ZmlrYWNqaSBTaWduZXQxHzAdBgNVBAMTFkND
-IFNpZ25ldCAtIENBIEtsYXNhIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqgLJu
-QqY4yavbSgHg8CyfKTx4BokNSDOVz4eD9vptUr11Kqd06ED1hlH7Sg0goBFAfntNU/QTKwSBaNui
-me7C4sSEdgsKrPoAhGb4Mq8y7Ty7RqZz7mkzNMqzL2L2U4yQ2QjvpH8MH0IBqOWEcpSkpwnrCDIm
-RoTfd+YlZWKi2JceQixUUYIQ45Ox8+x8hHbvvZdgqtcvo8PW27qoHkp/7hMuJ44kDAGrmxffBXl/
-OBRZp0uO1CSLcMcVJzyr2phKhy406MYdWrtNPEluGs0GFDzd0nrIctiWAO4cmct4S72S9Q6e//0G
-O9f3/Ca5Kb2I1xYLj/xE+HgjHX9aD2MhAgMBAAGjggGMMIIBiDAPBgNVHRMBAf8EBTADAQH/MA4G
-A1UdDwEB/wQEAwIBBjCB4wYDVR0gBIHbMIHYMIHVBg0rBgEEAb4/AhQKAQEAMIHDMHUGCCsGAQUF
-BwICMGkaZ0NlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0
-eWthIENlcnR5ZmlrYWNqaSBQQ0EyIC0gQ2VydHlmaWthdHkgVXJ6ZWRvdyBLbGFzeSAyIi4wSgYI
-KwYBBQUHAgEWPmh0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9kb2t1bWVudHkva2xh
-c2EyL3BjX3BjYTIudHh0MD8GA1UdHwQ4MDYwNKAyoDCGLmh0dHA6Ly93d3cuc2lnbmV0LnBsL3Jl
-cG96eXRvcml1bS9jcmwvcGNhMi5jcmwwHwYDVR0jBBgwFoAUwGxGyl2CfpYHRonE82AVXO08kMIw
-HQYDVR0OBBYEFLtFBlILy4HNKVSzvHxBTM0HDowlMA0GCSqGSIb3DQEBBQUAA4IBAQBWTsCbqXrX
-hBBev5v5cIuc6gJM8ww7oR0uMQRZoFSqvQUPWBYM2/TLI/f8UM9hSShUVj3zEsSj/vFHagUVmzuV
-Xo5u0WK8iaqATSyEVBhADHrPG6wYcLKJlagge/ILA0m+SieyP2sjYD9MUB9KZIEyBKv0429UuDTw
-6P7pslxMWJBSNyQxaLIs0SRKsqZZWkc7ZYAj2apSkBMX2Is1oHA+PwkF6jQMwCao/+CndXPUzfCF
-6caa9WwW31W26MlXCvSmJgfiTPwGvm4PkPmOnmWZ3CczzhHl4q7ztHFzshJH3sZWDnrWwBFjzz5e
-Pr3WHV1wA7EY6oT4zBx+2gT9XBTB
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEUzCCAzugAwIBAgIEPq+qjzANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQGEwJQTDE3MDUGA1UE
-ChMuQ1ppQyBDZW50cmFzdCBTQSB3IGltaWVuaXUgTWluaXN0cmEgR29zcG9kYXJraTEZMBcGA1UE
-AxMQQ1ppQyBDZW50cmFzdCBTQTAeFw0wMzA0MzAxMDUwNTVaFw0wODA0MjgxMDUwNTVaMGgxCzAJ
-BgNVBAYTAlBMMR8wHQYDVQQKExZUUCBJbnRlcm5ldCBTcC4geiBvLm8uMR8wHQYDVQQDExZDQyBT
-aWduZXQgLSBDQSBLbGFzYSAzMRcwFQYDVQQFEw5OdW1lciB3cGlzdTogNDCCASIwDQYJKoZIhvcN
-AQEBBQADggEPADCCAQoCggEBALVdeOM62cPH2NERFxbS5FIp/HSv3fgesdVsTUFxZbGtE+/E0RMl
-KZQJHH9emx7vRYubsi4EOLCjYsCOTFvgGRIpZzx7R7T5c0Di5XFkRU4gjBl7aHJoKb5SLzGlWdoX
-GsekVtl6keEACrizV2EafqjI8cnBWY7OxQ1ooLQp5AeFjXg+5PT0lO6TUZAubqjFbhVbxSWjqvdj
-93RGfyYE76MnNn4c2xWySD07n7uno06TC0IJe6+3WSX1h+76VsIFouWBXOoM7cxxiLjoqdBVu24+
-P8e81SukE7qEvOwDPmk9ZJFtt1nBNg8a1kaixcljrA/43XwOPz6qnJ+cIj/xywECAwEAAaOCAQow
-ggEGMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMDMGA1UdIAEB/wQpMCcwJQYEVR0g
-ADAdMBsGCCsGAQUFBwIBFg93d3cuY2VudHJhc3QucGwwgY4GA1UdIwSBhjCBg4AU2a7r85Cp1iJN
-W0Ca1LR6VG3996ShZaRjMGExCzAJBgNVBAYTAlBMMTcwNQYDVQQKEy5DWmlDIENlbnRyYXN0IFNB
-IHcgaW1pZW5pdSBNaW5pc3RyYSBHb3Nwb2RhcmtpMRkwFwYDVQQDExBDWmlDIENlbnRyYXN0IFNB
-ggQ9/0sQMB0GA1UdDgQWBBR7Y8wZkHq0zrY7nn1tFSdQ0PlJuTANBgkqhkiG9w0BAQUFAAOCAQEA
-ldt/svO5c1MU08FKgrOXCGEbEPbQxhpM0xcd6Iv3dCo6qugEgjEs9Qm5CwUNKMnFsvR27cJWUvZb
-MVcvwlwCwclOdwF6u/QRS8bC2HYErhYo9bp9yuxxzuow2A94c5fPqfVrjXy+vDouchAm6+A5Wjzv
-J8wxVFDCs+9iGACmyUWr/JGXCYiQIbQkwlkRKHHlan9ymKf1NvIej/3EpeT8fKr6ywxGuhAfqofW
-pg3WJY/RCB4lTzD8vZGNwfMFGkWhJkypad3i9w3lGmDVpsHaWtCgGfd0H7tUtWPkP+t7EjIRCD9J
-HYnTR+wbbewc5vOI+UobR15ynGfFIaSIiMTVtQ==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEejCCA2KgAwIBAgIEP4vk6TANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJQ
-TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu
-dHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MR8wHQYDVQQDExZDQyBTaWduZXQgLSBD
-QSBLbGFzYSAyMB4XDTAzMTAxNDExNTgyMloXDTE3MDQxODEyNTMwN1owdzELMAkG
-A1UEBhMCUEwxHzAdBgNVBAoTFlRQIEludGVybmV0IFNwLiB6IG8uby4xJDAiBgNV
-BAsTG0NlbnRydW0gQ2VydHlmaWthY2ppIFNpZ25ldDEhMB8GA1UEAxMYQ0MgU2ln
-bmV0IC0gT0NTUCBLbGFzYSAyMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCo
-VCsaBStblXQYVNthe3dvaCrfvKpPXngh4almm988iIlEv9CVTaAdCfaJNihvA+Vs
-Qw8++ix1VqteMQE474/MV/YaXigP0Zr0QB+g+/7PWVlv+5U9Gzp9+Xx4DJay8AoI
-iB7Iy5Qf9iZiHm5BiPRIuUXT4ZRbZRYPh0/76vgRsQIDAQABo4IBkjCCAY4wDgYD
-VR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMJMEEGA1UdHwQ6MDgwNqA0
-oDKGMGh0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9jcmwva2xhc2Ey
-LmNybDCB2AYDVR0gBIHQMIHNMIHKBg4rBgEEAb4/AoFICgwBADCBtzBsBggrBgEF
-BQcCAjBgGl5DZXJ0eWZpa2F0IHd5ZGFueSB6Z29kbmllIHogZG9rdW1lbnRlbSAi
-UG9saXR5a2EgQ2VydHlmaWthY2ppIC0gQ2VydHlmaWthdHkgcmVzcG9uZGVyb3cg
-T0NTUCIuMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnNpZ25ldC5wbC9yZXBvenl0
-b3JpdW0vZG9rdW1lbnR5L3BjX29jc3BfMV8wLnBkZjAfBgNVHSMEGDAWgBS7RQZS
-C8uBzSlUs7x8QUzNBw6MJTAdBgNVHQ4EFgQUKEVrOY7cEHvsVgvoyZdytlbtgwEw
-CQYDVR0TBAIwADANBgkqhkiG9w0BAQUFAAOCAQEAQrRg5MV6dxr0HU2IsLInxhvt
-iUVmSFkIUsBCjzLoewOXA16d2oDyHhI/eE+VgAsp+2ANjZu4xRteHIHoYMsN218M
-eD2MLRsYS0U9xxAFK9gDj/KscPbrrdoqLvtPSMhUb4adJS9HLhvUe6BicvBf3A71
-iCNe431axGNDWKnpuj2KUpj4CFHYsWCXky847YtTXDjri9NIwJJauazsrSjK+oXp
-ngRS506mdQ7vWrtApkh8zhhWp7duCkjcCo1O8JxqYr2qEW1fXmgOISe010v2mmuv
-hHxPyVwoAU4KkOw0nbXZn53yak0is5+XmAjh0wWue44AssHrjC9nUh3mkLt6eQ==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEezCCA2OgAwIBAgIEP4vnLzANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJQ
-TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEfMB0GA1UEAxMWQ0Mg
-U2lnbmV0IC0gQ0EgS2xhc2EgMzEXMBUGA1UEBRMOTnVtZXIgd3Bpc3U6IDQwHhcN
-MDMxMDE0MTIwODAwWhcNMDgwNDI4MTA1MDU1WjB3MQswCQYDVQQGEwJQTDEfMB0G
-A1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBD
-ZXJ0eWZpa2FjamkgU2lnbmV0MSEwHwYDVQQDExhDQyBTaWduZXQgLSBPQ1NQIEts
-YXNhIDMwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM/9GwvARNuCVN+PqZmO
-4FqH8vTqhenUyqRkmAVT4YhLu0a9AXeLAYVDu+NTkYzsAUMAfu55rIKHNLlm6WbF
-KvLiKKz4p4pbUr+ToPcwl/TDotidloUdBAxDg0SL+PmQqACZDe3seJho2IYf2vDL
-/G4TLMbKmNB0mlWFuN0f4fJNAgMBAAGjggGgMIIBnDAOBgNVHQ8BAf8EBAMCB4Aw
-EwYDVR0lBAwwCgYIKwYBBQUHAwkwTwYDVR0fBEgwRjBEoEKgQIY+aHR0cDovL3d3
-dy5zaWduZXQucGwva3dhbGlmaWtvd2FuZS9yZXBvenl0b3JpdW0vY3JsL2tsYXNh
-My5jcmwwgdgGA1UdIASB0DCBzTCBygYOKwYBBAG+PwKCLAoCAQAwgbcwbAYIKwYB
-BQUHAgIwYBpeQ2VydHlmaWthdCB3eWRhbnkgemdvZG5pZSB6IGRva3VtZW50ZW0g
-IlBvbGl0eWthIENlcnR5ZmlrYWNqaSAtIENlcnR5ZmlrYXR5IHJlc3BvbmRlcm93
-IE9DU1AiLjBHBggrBgEFBQcCARY7aHR0cDovL3d3dy5zaWduZXQucGwvcmVwb3p5
-dG9yaXVtL2Rva3VtZW50eS9wY19vY3NwXzFfMC5wZGYwHwYDVR0jBBgwFoAUe2PM
-GZB6tM62O559bRUnUND5SbkwHQYDVR0OBBYEFG4jnCMvBALRQXtmDn9TyXQ/EKP+
-MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQEFBQADggEBACXrKG5Def5lpRwmZom3UEDq
-bl7y4U3qomG4B+ok2FVZGgPZti+ZgvrenPj7PtbYCUBPsCSTNrznKinoT3gD9lQQ
-xkEHwdc6VD1GlFp+qI64u0+wS9Epatrdf7aBnizrOIB4LJd4E2TWQ6trspetjMIU
-upyWls1BmYUxB91R7QkTiAUSNZ87s3auhZuG4f0V0JLVCcg2rn7AN1rfMkgxCbHk
-GxiQbYWFljl6aatxR3odnnzVUe1I8uoY2JXpmmUcOG4dNGuQYziyKG3mtXCQWvug
-5qi9Mf3KUh1oSTKx6HfLjjNl1+wMB5Mdb8LF0XyZLdJM9yIZh7SBRsYm9QiXevY=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFGjCCBAKgAwIBAgIEPL7eEDANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE
-ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg
-U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDIwNDE4MTQ1NDA4WhcNMjYw
-OTIxMTU0MjE5WjB2MQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v
-LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MSAwHgYDVQQDExdDQyBTaWdu
-ZXQgLSBQQ0EgS2xhc2EgMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM7BrBlbN5ma
-M5eg0BOTqoZ+9NBDvU8Lm5rTdrMswFTCathzpVVLK/JD4K3+4oCZ9SRAspEXE4gvwb08ASY6w5s+
-HpRkeJw8YzMFR5kDZD5adgnCAy4vDfIXYZgppXPaTQ8wnfUZ7BZ7Zfa7QBemUIcJIzJBB0UqgtxW
-Ceol9IekpBRVmuuSA6QG0Jkm+pGDJ05yj2eQG8jTcBENM7sVA8rGRMyFA4skSZ+D0OG6FS2xC1i9
-JyN0ag1yII/LPx8HK5J4W9MaPRNjAEeaa2qI9EpchwrOxnyVbQfSedCG1VRJfAsE/9tT9CMUPZ3x
-W20QjQcSZJqVcmGW9gVsXKQOVLsCAwEAAaOCAbMwggGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P
-AQH/BAQDAgEGMIIBBAYDVR0gBIH8MIH5MIH2Bg0rBgEEAb4/AgEKAQEBMIHkMIGaBggrBgEFBQcC
-AjCBjRqBikNlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0
-eWthIENlcnR5ZmlrYWNqaSBkbGEgUm9vdENBIi4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6
-IFJvb3RDQSB3IGhpZXJhcmNoaWkgQ0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5z
-aWduZXQucGwvcmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY19yb290Y2EudHh0MEQGA1UdHwQ9MDsw
-OaA3oDWGM2h0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9yb290Y2Evcm9vdGNhLmNy
-bDAfBgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAdBgNVHQ4EFgQUwGxGyl2CfpYHRonE
-82AVXO08kMIwDQYJKoZIhvcNAQEFBQADggEBABp1TAUsa+BeVWg4cjowc8yTJ5XN3GvN96GObMkx
-UGY7U9kVrLI71xBgoNVyzXTiMNDBvjh7vdPWjpl5SDiRpnnKiOFXA43HvNWzUaOkTu1mxjJsZsan
-ot1Xt6j0ZDC+03FjLHdYMyM9kSWp6afb4980EPYZCcSzgM5TOGfJmNii5Tq468VFKrX+52Aou1G2
-2Ohu+EEOlOrG7ylKv1hHUJJCjwN0ZVEIn1nDbrU9FeGCz8J9ihVUvnENEBbBkU37PWqWuHitKQDV
-tcwTwJJdR8cmKq3NmkwAm9fPacidQLpaw0WkuGrS+fEDhu1Nhy9xELP6NA9GRTCNxm/dXlcwnmY=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFGjCCBAKgAwIBAgIEPV0tNDANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE
-ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg
-U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDIwODE2MTY0OTU2WhcNMjYw
-OTIxMTU0MjE5WjB2MQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v
-LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MSAwHgYDVQQDExdDQyBTaWdu
-ZXQgLSBQQ0EgS2xhc2EgMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALN3LanJtdue
-Ne6geWUTFENa+lEuzqELcoqhYB+a/tJcPEkc6TX/bYPzalRRjqs+quMP6KZTU0DixOrV+K7iWaqA
-iQ913HX5IBLmKDCrTVW/ZvSDpiBKbxlHfSNuJxAuVT6HdbzK7yAW38ssX+yS2tZYHZ5FhZcfqzPE
-OpO94mAKcBUhk6T/ki0evXX/ZvvktwmF3hKattzwtM4JMLurAEl8SInyEYULw5JdlfcBez2Tg6Db
-w34hA1A+ckTwhxzecrB8TUe2BnQKOs9vr2cCACpFFcOmPkM0Drtjctr1QHm1tYSqRFRf9VcV5tfC
-3P8QqoK4ONjtLPHc9x5NE1uK/FMCAwEAAaOCAbMwggGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P
-AQH/BAQDAgEGMIIBBAYDVR0gBIH8MIH5MIH2Bg0rBgEEAb4/AgEKAQECMIHkMIGaBggrBgEFBQcC
-AjCBjRqBikNlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0
-eWthIENlcnR5ZmlrYWNqaSBkbGEgUm9vdENBIi4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6
-IFJvb3RDQSB3IGhpZXJhcmNoaWkgQ0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5z
-aWduZXQucGwvcmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY19yb290Y2EudHh0MEQGA1UdHwQ9MDsw
-OaA3oDWGM2h0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9yb290Y2Evcm9vdGNhLmNy
-bDAfBgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAdBgNVHQ4EFgQUXvthcPHlH5BgGhlM
-ErJNXWlhlgAwDQYJKoZIhvcNAQEFBQADggEBACIce95Mvn710KCAISA0CuHD4aznTU6pLoCDShW4
-7OR+GTpJUm1coTcUqlBHV9mra4VFrBcBuOkHZoBLq/jmE0QJWnpSEULDcH9J3mF0nqO9SM+mWyJG
-dsJF/XU/7smummgjMNQXwzQTtWORF+6v5KUbWX85anO2wR+M6YTBWC55zWpWi4RG3vkHFs5Ze2oF
-JTlpuxw9ZgxTnWlwI9QR2MvEhYIUMKMOWxw1nt0kKj+5TCNQQGh/VJJ1dsiroGh/io1DOcePEhKz
-1Ag52y6Wf0nJJB9yk0sFakqZH18F7eQecQImgZyyeRtsG95leNugB3BXWCW+KxwiBrtQTXv4dTE=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEzzCCA7egAwIBAgIEO6ocGTANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE
-ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg
-U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDEwOTIwMTY0MjE5WhcNMjYw
-OTIxMTU0MjE5WjBxMQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v
-LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MRswGQYDVQQDExJDQyBTaWdu
-ZXQgLSBSb290Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrr2vydnNpELfGW3Ks
-ARiDhJvwDtUe4AbWev+OfMc3+vA29nX8ZmIwno3gmItjo5DbUCCRiCMq5c9epcGu+kg4a3BJChVX
-REl8gVh0ST15rr3RKrSc4VgsvQzl0ZUraeQLl8JoRT5PLsUj3qwF78jUCQVckiiLVcnGfZtFCm+D
-CJXliQBDMB9XFAUEiO/DtEBs0B7wJGx7lgJeJpQUcGiaOPjcJDYOk7rNAYmmD2gWeSlepufO8luU
-YG/YDxTC4mqhRqfa4MnVO5dqy+ICj2UvUpHbZDB0KfGRibgBYeQP1kuqgIzJN4UqknVAJb0aMBSP
-l+9k2fAUdchx1njlbdcbAgMBAAGjggFtMIIBaTAPBgNVHRMBAf8EBTADAQH/MIIBBAYDVR0gBIH8
-MIH5MIH2Bg0rBgEEAb4/AgEKAQEAMIHkMIGaBggrBgEFBQcCAjCBjRqBikNlcnR5ZmlrYXQgd3lz
-dGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0eWthIENlcnR5ZmlrYWNqaSBkbGEg
-Um9vdENBIi4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6IFJvb3RDQSB3IGhpZXJhcmNoaWkg
-Q0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5zaWduZXQucGwvcmVwb3p5dG9yaXVt
-L2Rva3VtZW50eS9wY19yb290Y2EudHh0MB0GA1UdDgQWBBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAf
-BgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcN
-AQEFBQADggEBAGnY5QmYqnnO9OqFOWZxxb25UHRnaRF6IV9aaGit5BZufZj2Tq3v8L3SgE34GOoI
-cdRMMG5JEpEU4mN/Ef3oY6Eo+7HfqaPHI4KFmbDSPiK5s+wmf+bQSm0Yq5/h4ZOdcAESlLQeLSt1
-CQk2JoKQJ6pyAf6xJBgWEIlm4RXE4J3324PUiOp83kW6MDvaa1xY976WyInr4rwoLgxVl11LZeKW
-ha0RJJxJgw/NyWpKG7LWCm1fglF8JH51vZNndGYq1iKtfnrIOvLZq6bzaCiZm1EurD8HE6P7pmAB
-KK6o3C2OXlNfNIgwkDN/cDqk5TYsTkrpfriJPdxXBH8hQOkW89g=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIID/TCCA2agAwIBAgIEP4/gkTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJQTDEfMB0GA1UE
-ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg
-U2lnbmV0MR8wHQYDVQQDExZDQyBTaWduZXQgLSBDQSBLbGFzYSAxMB4XDTAzMTAxNzEyMjkwMloX
-DTExMDkyMzExMTgxN1owdjELMAkGA1UEBhMCUEwxHzAdBgNVBAoTFlRQIEludGVybmV0IFNwLiB6
-IG8uby4xJDAiBgNVBAsTG0NlbnRydW0gQ2VydHlmaWthY2ppIFNpZ25ldDEgMB4GA1UEAxMXQ0Mg
-U2lnbmV0IC0gVFNBIEtsYXNhIDEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOJYrISEtSsd
-uHajROh5/n7NGrkpYTT9NEaPe9+ucuQ37KxIbfJwXJjgUc1dw4wCkcQ12FJarD1X6mSQ4cfN/60v
-LfKI5ZD4nhJTMKlAj1pX9ScQ/MuyvKStCbn5WTkjPhjRAM0tdwXSnzuTEunfw0Oup559y3Iqxg1c
-ExflB6cfAgMBAAGjggGXMIIBkzBBBgNVHR8EOjA4MDagNKAyhjBodHRwOi8vd3d3LnNpZ25ldC5w
-bC9yZXBvenl0b3JpdW0vY3JsL2tsYXNhMS5jcmwwDgYDVR0PAQH/BAQDAgeAMBYGA1UdJQEB/wQM
-MAoGCCsGAQUFBwMIMIHaBgNVHSAEgdIwgc8wgcwGDSsGAQQBvj8CZAoRAgEwgbowbwYIKwYBBQUH
-AgIwYxphQ2VydHlmaWthdCB3eXN0YXdpb255IHpnb2RuaWUgeiBkb2t1bWVudGVtICJQb2xpdHlr
-YSBDZXJ0eWZpa2FjamkgQ0MgU2lnbmV0IC0gWm5ha293YW5pZSBjemFzZW0iLjBHBggrBgEFBQcC
-ARY7aHR0cDovL3d3dy5zaWduZXQucGwvcmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY190c2ExXzJf
-MS5wZGYwHwYDVR0jBBgwFoAUw4Me1Vl3VPtN+1dH+cQjXNHnieMwHQYDVR0OBBYEFJdDwEqtcavO
-Yd9u9tej53vWXwNBMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQEFBQADgYEAnpiQkqLCJQYXUrqMHUEz
-+z3rOqS0XzSFnVVLhkVssvXc8S3FkJIiQTUrkScjI4CToCzujj3EyfNxH6yiLlMbskF8I31JxIeB
-vueqV+s+o76CZm3ycu9hb0I4lswuxoT+q5ZzPR8Irrb51rZXlolR+7KtwMg4sFDJZ8RNgOf7tbA=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIHPTCCBSWgAwIBAgIBADANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290
-IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB
-IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA
-Y2FjZXJ0Lm9yZzAeFw0wMzAzMzAxMjI5NDlaFw0zMzAzMjkxMjI5NDlaMHkxEDAO
-BgNVBAoTB1Jvb3QgQ0ExHjAcBgNVBAsTFWh0dHA6Ly93d3cuY2FjZXJ0Lm9yZzEi
-MCAGA1UEAxMZQ0EgQ2VydCBTaWduaW5nIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJ
-ARYSc3VwcG9ydEBjYWNlcnQub3JnMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
-CgKCAgEAziLA4kZ97DYoB1CW8qAzQIxL8TtmPzHlawI229Z89vGIj053NgVBlfkJ
-8BLPRoZzYLdufujAWGSuzbCtRRcMY/pnCujW0r8+55jE8Ez64AO7NV1sId6eINm6
-zWYyN3L69wj1x81YyY7nDl7qPv4coRQKFWyGhFtkZip6qUtTefWIonvuLwphK42y
-fk1WpRPs6tqSnqxEQR5YYGUFZvjARL3LlPdCfgv3ZWiYUQXw8wWRBB0bF4LsyFe7
-w2t6iPGwcswlWyCR7BYCEo8y6RcYSNDHBS4CMEK4JZwFaz+qOqfrU0j36NK2B5jc
-G8Y0f3/JHIJ6BVgrCFvzOKKrF11myZjXnhCLotLddJr3cQxyYN/Nb5gznZY0dj4k
-epKwDpUeb+agRThHqtdB7Uq3EvbXG4OKDy7YCbZZ16oE/9KTfWgu3YtLq1i6L43q
-laegw1SJpfvbi1EinbLDvhG+LJGGi5Z4rSDTii8aP8bQUWWHIbEZAWV/RRyH9XzQ
-QUxPKZgh/TMfdQwEUfoZd9vUFBzugcMd9Zi3aQaRIt0AUMyBMawSB3s42mhb5ivU
-fslfrejrckzzAeVLIL+aplfKkQABi6F1ITe1Yw1nPkZPcCBnzsXWWdsC4PDSy826
-YreQQejdIOQpvGQpQsgi3Hia/0PsmBsJUUtaWsJx8cTLc6nloQsCAwEAAaOCAc4w
-ggHKMB0GA1UdDgQWBBQWtTIb1Mfz4OaO873SsDrusjkY0TCBowYDVR0jBIGbMIGY
-gBQWtTIb1Mfz4OaO873SsDrusjkY0aF9pHsweTEQMA4GA1UEChMHUm9vdCBDQTEe
-MBwGA1UECxMVaHR0cDovL3d3dy5jYWNlcnQub3JnMSIwIAYDVQQDExlDQSBDZXJ0
-IFNpZ25pbmcgQXV0aG9yaXR5MSEwHwYJKoZIhvcNAQkBFhJzdXBwb3J0QGNhY2Vy
-dC5vcmeCAQAwDwYDVR0TAQH/BAUwAwEB/zAyBgNVHR8EKzApMCegJaAjhiFodHRw
-czovL3d3dy5jYWNlcnQub3JnL3Jldm9rZS5jcmwwMAYJYIZIAYb4QgEEBCMWIWh0
-dHBzOi8vd3d3LmNhY2VydC5vcmcvcmV2b2tlLmNybDA0BglghkgBhvhCAQgEJxYl
-aHR0cDovL3d3dy5jYWNlcnQub3JnL2luZGV4LnBocD9pZD0xMDBWBglghkgBhvhC
-AQ0ESRZHVG8gZ2V0IHlvdXIgb3duIGNlcnRpZmljYXRlIGZvciBGUkVFIGhlYWQg
-b3ZlciB0byBodHRwOi8vd3d3LmNhY2VydC5vcmcwDQYJKoZIhvcNAQEEBQADggIB
-ACjH7pyCArpcgBLKNQodgW+JapnM8mgPf6fhjViVPr3yBsOQWqy1YPaZQwGjiHCc
-nWKdpIevZ1gNMDY75q1I08t0AoZxPuIrA2jxNGJARjtT6ij0rPtmlVOKTV39O9lg
-18p5aTuxZZKmxoGCXJzN600BiqXfEVWqFcofN8CCmHBh22p8lqOOLlQ+TyGpkO/c
-gr/c6EWtTZBzCDyUZbAEmXZ/4rzCahWqlwQ3JNgelE5tDlG+1sSPypZt90Pf6DBl
-Jzt7u0NDY8RD97LsaMzhGY4i+5jhe1o+ATc7iwiwovOVThrLm82asduycPAtStvY
-sONvRUgzEv/+PDIqVPfE94rwiCPCR/5kenHA0R6mY7AHfqQv0wGP3J8rtsYIqQ+T
-SCX8Ev2fQtzzxD72V7DX3WnRBnc0CkvSyqD/HMaMyRa+xMwyN2hzXwj7UfdJUzYF
-CpUCTPJ5GhD22Dp1nPMd8aINcGeGG7MW9S/lpOt5hvk9C8JzC6WZrG/8Z7jlLwum
-GCSNe9FINSkYQKyTYOGWhlC0elnYjyELn8+CkcY7v2vcB5G5l1YjqrZslMZIBjzk
-zk6q5PYvCdxTby78dOs6Y5nCpqyJvKeyRKANihDjbPIky/qbn3BHLt4Ui9SyIAmW
-omTxJBzcoTWcFbLUvFUufQb1nA5V9FrWk9p2rSVzTMVD
+MIICPTCCAaYCEQDNun9W8N/kvFT+IqyzcqpVMA0GCSqGSIb3DQEBAgUAMF8xCzAJ
+BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xh
+c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05
+NjAxMjkwMDAwMDBaFw0yODA4MDEyMzU5NTlaMF8xCzAJBgNVBAYTAlVTMRcwFQYD
+VQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xhc3MgMSBQdWJsaWMgUHJp
+bWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCBnzANBgkqhkiG9w0BAQEFAAOB
+jQAwgYkCgYEA5Rm/baNWYS2ZSHH2Z965jeu3noaACpEO+jglr0aIguVzqKCbJF0N
+H8xlbgyw0FaEGIeaBpsQoXPftFg5a27B9hXVqKg/qhIGjTGsf7A01480Z4gJzRQR
+4k5FVmkfeAKA2txHkSm7NsljXMXg1y2He6G3MrB7MLoqLzGq7qNn2tsCAwEAATAN
+BgkqhkiG9w0BAQIFAAOBgQBMP7iLxmjf7kMzDl3ppssHhE16M/+SG/Q2rdiVIjZo
+EWx8QszznC7EBz8UsA9P/5CSdvnivErpj82ggAr3xSnxgiJduLHdgSOjeyUVRjB5
+FvjqBUuUfx3CHMjjt/QQQDwTw18fU+hI5Ia0e6E1sHslurjTjqs/OJ0ANACY89Fx
+lA==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD
+VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv
+bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv
+b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV
+UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU
+cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds
+b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH
+iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS
+r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4
+04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r
+GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9
+3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P
+lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY
+MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t
+dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5
+WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD
+VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3
+DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8
+9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ
+DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9
+Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N
+QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ
+xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G
+A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T
+AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG
+kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr
+Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5
+Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU
+JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot
+RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIID2TCCAsGgAwIBAgIDAjbQMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT
+MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i
+YWwgQ0EwHhcNMTAwMjE5MjIzOTI2WhcNMjAwMjE4MjIzOTI2WjBAMQswCQYDVQQG
+EwJVUzEXMBUGA1UEChMOR2VvVHJ1c3QsIEluYy4xGDAWBgNVBAMTD0dlb1RydXN0
+IFNTTCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJCzgMHk5Uat
+cGA9uuUU3Z6KXot1WubKbUGlI+g5hSZ6p1V3mkihkn46HhrxJ6ujTDnMyz1Hr4Gu
+FmpcN+9FQf37mpc8oEOdxt8XIdGKolbCA0mEEoE+yQpUYGa5jFTk+eb5lPHgX3UR
+8im55IaisYmtph6DKWOy8FQchQt65+EuDa+kvc3nsVrXjAVaDktzKIt1XTTYdwvh
+dGLicTBi2LyKBeUxY0pUiWozeKdOVSQdl+8a5BLGDzAYtDRN4dgjOyFbLTAZJQ50
+96QhS6CkIMlszZhWwPKoXz4mdaAN+DaIiixafWcwqQ/RmXAueOFRJq9VeiS+jDkN
+d53eAsMMvR8CAwEAAaOB2TCB1jAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFEJ5
+VBthzVUrPmPVPEhX9Z/7Rc5KMB8GA1UdIwQYMBaAFMB6mGiNifurBWQMEX2qfWW4
+ysxOMBIGA1UdEwEB/wQIMAYBAf8CAQAwOgYDVR0fBDMwMTAvoC2gK4YpaHR0cDov
+L2NybC5nZW90cnVzdC5jb20vY3Jscy9ndGdsb2JhbC5jcmwwNAYIKwYBBQUHAQEE
+KDAmMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5nZW90cnVzdC5jb20wDQYJKoZI
+hvcNAQEFBQADggEBANTvU4ToGr2hiwTAqfVfoRB4RV2yV2pOJMtlTjGXkZrUJPji
+J2ZwMZzBYlQG55cdOprApClICq8kx6jEmlTBfEx4TCtoLF0XplR4TEbigMMfOHES
+0tdT41SFULgCy+5jOvhWiU1Vuy7AyBh3hjELC3DwfjWDpCoTZFZnNF0WX3OsewYk
+2k9QbSqr0E1TQcKOu3EDSSmGGM8hQkx0YlEVxW+o78Qn5Rsz3VqI138S0adhJR/V
+4NwdzxoQ2KDLX4z6DOW/cf/lXUQdpj6HR/oaToODEj+IZpWYeZqF6wJHzSXj8gYE
+TpnKXKBuervdo5AaRTPvvz7SBMS24CqFZUE+ENQ=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDdjCCAl6gAwIBAgIEOhsEBTANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJE
+SzEMMAoGA1UEChMDS01EMQ8wDQYDVQQLEwZLTUQtQ0ExIzAhBgNVBAMTGktNRC1D
+QSBLdmFsaWZpY2VyZXQgUGVyc29uMB4XDTAwMTEyMTIzMjQ1OVoXDTE1MTEyMjIz
+MjQ1OVowUTELMAkGA1UEBhMCREsxDDAKBgNVBAoTA0tNRDEPMA0GA1UECxMGS01E
+LUNBMSMwIQYDVQQDExpLTUQtQ0EgS3ZhbGlmaWNlcmV0IFBlcnNvbjCCASIwDQYJ
+KoZIhvcNAQEBBQADggEPADCCAQoCggEBANriF4Xd6yD7ZlBE317UBDObn+vRMVc6
+p3wNQODdEDJe2z1ncCz9NJvhoLGdOJhyg7VVPh0P2c+KZ9WI9mWOKZI2bp2WkLju
+jCcxbhTrurY3Wfc6gwLBqqFV8wWgaZKmvVWizjw9Kyi25f3yX4fOho6Qq2lvVbub
+tvVFXAd51GJ+/2Yed+a4Or2bz2RcqHS81B3pywsD4mgJR5xREv5jqPfwNP+V7bkc
+X+pfO4kVhZ/V+8MSPdQHgcV/iB3wP2mwgWyIBNc1reBidGTiz8unnWu55hcNfsvt
+LJbTs9OHhsR7naRuy+S402nDnD5vnONOFEsiHn46w+T0rtu7h6j4OvkCAwEAAaNW
+MFQwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUeWLqmhI42Jxj7DifDsW+
+DlQhKD0wHwYDVR0jBBgwFoAUeWLqmhI42Jxj7DifDsW+DlQhKD0wDQYJKoZIhvcN
+AQEFBQADggEBANML/P42OuJ9aUV/0fItuIyc1JhqWvSqn5bXj+9eyEegcp8bHLHY
+42D1O+z0lNipdjYPSdMJ0wZOEUhr+150SdDQ1P/zQL8AUaLEBkRt7ZdzXPVH3PER
+qnf9IrpYBknZKfCAoVchA6Rr9WU3Sd8bMoRfMLKg8c0M8G6EPwCTcOFriSkbtvNG
+zd8r8I+WfUYIN/p8DI9JT9qfjVODnYPRMUm6KPvq27TsrGruKrqyaV94kWc8co8A
+v3zFLeCtghvUiRBdx+8Q7m5t4CkuSr0WINrqjIPFW2QrM1r82y09Fd16RkqL4LOg
+Lh6vB5KnTApv62rWdw7zWwYnjY6/vXYY1Aw=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIGCDCCA/CgAwIBAgIBATANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290
@@ -2544,6 +2209,229 @@ FFxtbUFm3xuTsdQAw+7Lzzw9IYCpX2Nl/N3gX6T0K/CFcUHUZyX7GrGXrtaZghNB
0m6lG5kngOcLqagA
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
+MIIF8DCCA9igAwIBAgIPBuhGJy8fCo/RhFzjafbVMA0GCSqGSIb3DQEBBQUAMDgx
+CzAJBgNVBAYTAkVTMRQwEgYDVQQKDAtJWkVOUEUgUy5BLjETMBEGA1UEAwwKSXpl
+bnBlLmNvbTAeFw0wNzEyMTMxMzA4MjdaFw0zNzEyMTMwODI3MjVaMDgxCzAJBgNV
+BAYTAkVTMRQwEgYDVQQKDAtJWkVOUEUgUy5BLjETMBEGA1UEAwwKSXplbnBlLmNv
+bTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMnTesoPHqynhugWZWqx
+whtFMnGV2f4QW8yv56V5AY+Jw8ryVXH3d753lPNypCxE2J6SmxQ6oeckkAoKVo7F
+2CaU4dlI4S0+2gpy3aOZFdqBoof0e24md4lYrdbrDLJBenNubdt6eEHpCIgSfocu
+ZhFjbFT7PJ1ywLwu/8K33Q124zrX97RovqL144FuwUZvXY3gTcZUVYkaMzEKsVe5
+o4qYw+w7NMWVQWl+dcI8IMVhulFHoCCQk6GQS/NOfIVFVJrRBSZBsLVNHTO+xAPI
+JXzBcNs79AktVCdIrC/hxKw+yMuSTFM5NyPs0wH54AlETU1kwOENWocivK0bo/4m
+tRXzp/yEGensoYi0RGmEg/OJ0XQGqcwL1sLeJ4VQJsoXuMl6h1YsGgEebL4TrRCs
+tST1OJGh1kva8bvS3ke18byB9llrzxlT6Y0Vy0rLqW9E5RtBz+GGp8rQap+8TI0G
+M1qiheWQNaBiXBZO8OOi+gMatCxxs1gs3nsL2xoP694hHwZ3BgOwye+Z/MC5TwuG
+KP7Suerj2qXDR2kS4Nvw9hmL7Xtw1wLW7YcYKCwEJEx35EiKGsY7mtQPyvp10gFA
+Wo15v4vPS8+qFsGV5K1Mij4XkdSxYuWC5YAEpAN+jb/af6IPl08M0w3719Hlcn4c
+yHf/W5oPt64FRuXxqBbsR6QXAgMBAAGjgfYwgfMwgbAGA1UdEQSBqDCBpYEPaW5m
+b0BpemVucGUuY29tpIGRMIGOMUcwRQYDVQQKDD5JWkVOUEUgUy5BLiAtIENJRiBB
+MDEzMzcyNjAtUk1lcmMuVml0b3JpYS1HYXN0ZWl6IFQxMDU1IEY2MiBTODFDMEEG
+A1UECQw6QXZkYSBkZWwgTWVkaXRlcnJhbmVvIEV0b3JiaWRlYSAxNCAtIDAxMDEw
+IFZpdG9yaWEtR2FzdGVpejAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB
+BjAdBgNVHQ4EFgQUHRxlDqjyJXu0kc/ksbHmvVV0bAUwDQYJKoZIhvcNAQEFBQAD
+ggIBAMeBRm8hGE+gBe/n1bqXUKJg7aWSFBpSm/nxiEqg3Hh10dUflU7F57dp5iL0
++CmoKom+z892j+Mxc50m0xwbRxYpB2iEitL7sRskPtKYGCwkjq/2e+pEFhsqxPqg
+l+nqbFik73WrAGLRne0TNtsiC7bw0fRue0aHwp28vb5CO7dz0JoqPLRbEhYArxk5
+ja2DUBzIgU+9Ag89njWW7u/kwgN8KRwCfr00J16vU9adF79XbOnQgxCvv11N75B7
+XSus7Op9ACYXzAJcY9cZGKfsK8eKPlgOiofmg59OsjQerFQJTx0CCzl+gQgVuaBp
+E8gyK+OtbBPWg50jLbJtooiGfqgNASYJQNntKE6MkyQP2/EeTXp6WuKlWPHcj1+Z
+ggwuz7LdmMySlD/5CbOlliVbN/UShUHiGUzGigjB3Bh6Dx4/glmimj4/+eAJn/3B
+kUtdyXvWton83x18hqrNA/ILUpLxYm9/h+qrdslsUMIZgq+qHfUgKGgu1fxkN0/P
+pUTEvnK0jHS0bKf68r10OEMr3q/53NjgnZ/cPcqlY0S/kqJPTIAcuxrDmkoEVU3K
+7iYLHL8CxWTTnn7S05EcS6L1HOUXHA0MUqORH5zwIe0ClG+poEnK6EOMxPQ02nwi
+o8ZmPrgbBYhdurz3vOXcFD2nhqi2WVIhA16L4wTtSyoeo09Q
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIICsDCCAhmgAwIBAgIQZ8jh6OO+HL38kTuOpiOHSTANBgkqhkiG9w0BAQUFADCB
+izELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxML
+RHVyYmFudmlsbGUxDzANBgNVBAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhhd3RlIENl
+cnRpZmljYXRpb24xHzAdBgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcgQ0EwHhcN
+OTcwMTAxMDAwMDAwWhcNMjEwMTAxMjM1OTU5WjCBizELMAkGA1UEBhMCWkExFTAT
+BgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzANBgNV
+BAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAdBgNV
+BAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcgQ0EwgZ8wDQYJKoZIhvcNAQEBBQADgY0A
+MIGJAoGBANYrWHhhRYZT6jR7UZztsOYuGA7+4F+oJ9O0yeB8WU4WDnNUYMF/9p8u
+6TqFJBU820cEY8OexJQaWt9MevPZQx08EHp5JduQ/vBR5zDWQQD9nyjfeb6Uu522
+FOMjhdepQeBMpHmwKxqL8vg7ij5FrHGSALSQQZj7X+36ty6K+Ig3AgMBAAGjEzAR
+MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADgYEAS+mqF4EF+3kKMZ/F
+QfRWVKvpwuWXjhj+kckMPiZkyaFMJ2SnvQGTVXFuF0853BvcSTUQOSP/ypvIz2Y/
+3Ewa1IEGQlIf4SaxFhe65nByMUToTo1b5NP50OOPJWQx5yr4GIg2GlLFDUE1G2m3
+JvUXzMEZXkt8XOKDgJH6L/uatxY=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDtDCCApygAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJKUDEc
+MBoGA1UEChMTSmFwYW5lc2UgR292ZXJubWVudDEOMAwGA1UECxMFTVBIUFQxJjAk
+BgNVBAsTHU1QSFBUIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTAyMDMxNDA3
+NTAyNloXDTEyMDMxMzE0NTk1OVowYzELMAkGA1UEBhMCSlAxHDAaBgNVBAoTE0ph
+cGFuZXNlIEdvdmVybm1lbnQxDjAMBgNVBAsTBU1QSFBUMSYwJAYDVQQLEx1NUEhQ
+VCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBAI3GUWlK9G9FVm8DhpKu5t37oxZbj6lZcFvEZY07YrYojWO657ub
+z56WE7q/PI/6Sm7i7qYE+Vp80r6thJvfmn7SS3BENrRqiapSenhooYD12jIe3iZQ
+2SXqx7WgYwyBGdQwGaYTijzbRFpgc0K8o4a99fIoHhz9J8AKqXasddMCqfJRaH30
+YJ7HnOvRYGL6HBrGhJ7X4Rzijyk9a9+3VOBsYcnIlx9iODoiYhA6r0ojuIu8/JA1
+oTTZrS0MyU/SLdFdJze2O1wnqTULXQybzJz3ad6oC/F5a69c0m92akYd9nGBrPxj
+EhucaQynC/QoCLs3aciLgioAnEJqy7i3EgUCAwEAAaNzMHEwHwYDVR0jBBgwFoAU
+YML3pLoA0h93Yngl8Gb/UgAh73owHQYDVR0OBBYEFGDC96S6ANIfd2J4JfBm/1IA
+Ie96MAwGA1UdEwQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQE
+AwIABTANBgkqhkiG9w0BAQUFAAOCAQEANPR8DN66iWZBs/lSm1vOzhqRkXDLT6xL
+LvJtjPLqmE469szGyFSKzsof6y+/8YgZlOoeX1inF4ox/SH1ATnwdIIsPbXuRLjt
+axboXvBh5y2ffC3hmzJVvJ87tb6mVWQeL9VFUhNhAI0ib+9OIZVEYI/64MFkDk4e
+iWG5ts6oqIJH1V7dVZg6pQ1Tc0Ckhn6N1m1hD30S0/zoPn/20Wq6OCF3he8VJrRG
+dcW9BD/Bkesko1HKhMBDjHVrJ8cFwbnDSoo+Ki47eJWaz/cOzaSsaMVUsR5POava
+/abhhgHn/eOJdXiVslyK0DYscjsdB3aBUfwZlomxYOzG6CgjQPhJdw==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEejCCA2KgAwIBAgIEP4vk6TANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJQ
+TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu
+dHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MR8wHQYDVQQDExZDQyBTaWduZXQgLSBD
+QSBLbGFzYSAyMB4XDTAzMTAxNDExNTgyMloXDTE3MDQxODEyNTMwN1owdzELMAkG
+A1UEBhMCUEwxHzAdBgNVBAoTFlRQIEludGVybmV0IFNwLiB6IG8uby4xJDAiBgNV
+BAsTG0NlbnRydW0gQ2VydHlmaWthY2ppIFNpZ25ldDEhMB8GA1UEAxMYQ0MgU2ln
+bmV0IC0gT0NTUCBLbGFzYSAyMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCo
+VCsaBStblXQYVNthe3dvaCrfvKpPXngh4almm988iIlEv9CVTaAdCfaJNihvA+Vs
+Qw8++ix1VqteMQE474/MV/YaXigP0Zr0QB+g+/7PWVlv+5U9Gzp9+Xx4DJay8AoI
+iB7Iy5Qf9iZiHm5BiPRIuUXT4ZRbZRYPh0/76vgRsQIDAQABo4IBkjCCAY4wDgYD
+VR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMJMEEGA1UdHwQ6MDgwNqA0
+oDKGMGh0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9jcmwva2xhc2Ey
+LmNybDCB2AYDVR0gBIHQMIHNMIHKBg4rBgEEAb4/AoFICgwBADCBtzBsBggrBgEF
+BQcCAjBgGl5DZXJ0eWZpa2F0IHd5ZGFueSB6Z29kbmllIHogZG9rdW1lbnRlbSAi
+UG9saXR5a2EgQ2VydHlmaWthY2ppIC0gQ2VydHlmaWthdHkgcmVzcG9uZGVyb3cg
+T0NTUCIuMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnNpZ25ldC5wbC9yZXBvenl0
+b3JpdW0vZG9rdW1lbnR5L3BjX29jc3BfMV8wLnBkZjAfBgNVHSMEGDAWgBS7RQZS
+C8uBzSlUs7x8QUzNBw6MJTAdBgNVHQ4EFgQUKEVrOY7cEHvsVgvoyZdytlbtgwEw
+CQYDVR0TBAIwADANBgkqhkiG9w0BAQUFAAOCAQEAQrRg5MV6dxr0HU2IsLInxhvt
+iUVmSFkIUsBCjzLoewOXA16d2oDyHhI/eE+VgAsp+2ANjZu4xRteHIHoYMsN218M
+eD2MLRsYS0U9xxAFK9gDj/KscPbrrdoqLvtPSMhUb4adJS9HLhvUe6BicvBf3A71
+iCNe431axGNDWKnpuj2KUpj4CFHYsWCXky847YtTXDjri9NIwJJauazsrSjK+oXp
+ngRS506mdQ7vWrtApkh8zhhWp7duCkjcCo1O8JxqYr2qEW1fXmgOISe010v2mmuv
+hHxPyVwoAU4KkOw0nbXZn53yak0is5+XmAjh0wWue44AssHrjC9nUh3mkLt6eQ==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI
+MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x
+FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz
+MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv
+cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN
+AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz
+Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO
+0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao
+wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj
+7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS
+8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT
+BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB
+/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg
+JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC
+NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3
+6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/
+3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm
+D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS
+CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR
+3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIIODCCB6GgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCAR4xCzAJBgNVBAYTAkVT
+MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE
+ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE
+ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjE0MDIGA1UECxMr
+SVBTIENBIFRpbWVzdGFtcGluZyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTE0MDIG
+A1UEAxMrSVBTIENBIFRpbWVzdGFtcGluZyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
+eTEeMBwGCSqGSIb3DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAxMTIyOTAxMTAx
+OFoXDTI1MTIyNzAxMTAxOFowggEeMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQmFy
+Y2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5l
+dCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0BtYWlsLmlw
+cy5lcyBDLkkuRi4gIEItNjA5Mjk0NTIxNDAyBgNVBAsTK0lQUyBDQSBUaW1lc3Rh
+bXBpbmcgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxNDAyBgNVBAMTK0lQUyBDQSBU
+aW1lc3RhbXBpbmcgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxHjAcBgkqhkiG9w0B
+CQEWD2lwc0BtYWlsLmlwcy5lczCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA
+vLjuVqWajOY2ycJioGaBjRrVetJznw6EZLqVtJCneK/K/lRhW86yIFcBrkSSQxA4
+Efdo/BdApWgnMjvEp+ZCccWZ73b/K5Uk9UmSGGjKALWkWi9uy9YbLA1UZ2t6KaFY
+q6JaANZbuxjC3/YeE1Z2m6Vo4pjOxgOKNNtMg0GmqaMCAwEAAaOCBIAwggR8MB0G
+A1UdDgQWBBSL0BBQCYHynQnVDmB4AyKiP8jKZjCCAVAGA1UdIwSCAUcwggFDgBSL
+0BBQCYHynQnVDmB4AyKiP8jKZqGCASakggEiMIIBHjELMAkGA1UEBhMCRVMxEjAQ
+BgNVBAgTCUJhcmNlbG9uYTESMBAGA1UEBxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJ
+UFMgSW50ZXJuZXQgcHVibGlzaGluZyBTZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJp
+cHNAbWFpbC5pcHMuZXMgQy5JLkYuICBCLTYwOTI5NDUyMTQwMgYDVQQLEytJUFMg
+Q0EgVGltZXN0YW1waW5nIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MTQwMgYDVQQD
+EytJUFMgQ0EgVGltZXN0YW1waW5nIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4w
+HAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAM
+BgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYB
+BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIB
+FgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcwGgYD
+VR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlw
+cy5lczBHBglghkgBhvhCAQ0EOhY4VGltZXN0YW1waW5nIENBIENlcnRpZmljYXRl
+IGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5lcy8wKQYJYIZIAYb4QgECBBwWGmh0
+dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMEAGCWCGSAGG+EIBBAQzFjFodHRwOi8v
+d3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJUaW1lc3RhbXBpbmcuY3JsMEUGCWCG
+SAGG+EIBAwQ4FjZodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jldm9jYXRpb25U
+aW1lc3RhbXBpbmcuaHRtbD8wQgYJYIZIAYb4QgEHBDUWM2h0dHA6Ly93d3cuaXBz
+LmVzL2lwczIwMDIvcmVuZXdhbFRpbWVzdGFtcGluZy5odG1sPzBABglghkgBhvhC
+AQgEMxYxaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lUaW1lc3RhbXBp
+bmcuaHRtbDB/BgNVHR8EeDB2MDegNaAzhjFodHRwOi8vd3d3Lmlwcy5lcy9pcHMy
+MDAyL2lwczIwMDJUaW1lc3RhbXBpbmcuY3JsMDugOaA3hjVodHRwOi8vd3d3YmFj
+ay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyVGltZXN0YW1waW5nLmNybDAvBggrBgEF
+BQcBAQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9vY3NwLmlwcy5lcy8wDQYJKoZI
+hvcNAQEFBQADgYEAZbrBzAAalZHK6Ww6vzoeFAh8+4Pua2JR0zORtWB5fgTYXXk3
+6MNbsMRnLWhasl8OCvrNPzpFoeo2zyYepxEoxZSPhExTCMWTs/zif/WN87GphV+I
+3pGW7hdbrqXqcGV4LCFkAZXOzkw+UPS2Wctjjba9GNSHSl/c7+lW8AoM6HU=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFujCCBKKgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhjELMAkGA1UEBhMCVVMx
+HTAbBgNVBAoTFEFwcGxlIENvbXB1dGVyLCBJbmMuMS0wKwYDVQQLEyRBcHBsZSBD
+b21wdXRlciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxKTAnBgNVBAMTIEFwcGxlIFJv
+b3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MB4XDTA1MDIxMDAwMTgxNFoXDTI1MDIx
+MDAwMTgxNFowgYYxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRBcHBsZSBDb21wdXRl
+ciwgSW5jLjEtMCsGA1UECxMkQXBwbGUgQ29tcHV0ZXIgQ2VydGlmaWNhdGUgQXV0
+aG9yaXR5MSkwJwYDVQQDEyBBcHBsZSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0
+eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOSRqQkfkdseR1DrBe1e
+eYQt6zaiV0xV7IsZid75S2z1B6siMALoGD74UAnTf0GomPnRymacJGsR0KO75Bsq
+wx+VnnoMpEeLW9QWNzPLxA9NzhRp0ckZcvVdDtV/X5vyJQO6VY9NXQ3xZDUjFUsV
+WR2zlPf2nJ7PULrBWFBnjwi0IPfLrCwgb3C2PwEwjLdDzw+dPfMrSSgayP7OtbkO
+2V4c1ss9tTqt9A8OAJILsSEWLnTVPA3bYharo3GSR1NVwa8vQbP4++NwzeajTEV+
+H0xrUJZBicR0YgsQg0GHM4qBsTBY7FoEMoxos48d3mVz/2deZbxJ2HafMxRloXeU
+yS0CAwEAAaOCAi8wggIrMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/
+MB0GA1UdDgQWBBQr0GlHlHYJ/vRrjS5ApvdHTX8IXjAfBgNVHSMEGDAWgBQr0GlH
+lHYJ/vRrjS5ApvdHTX8IXjCCASkGA1UdIASCASAwggEcMIIBGAYJKoZIhvdjZAUB
+MIIBCTBBBggrBgEFBQcCARY1aHR0cHM6Ly93d3cuYXBwbGUuY29tL2NlcnRpZmlj
+YXRlYXV0aG9yaXR5L3Rlcm1zLmh0bWwwgcMGCCsGAQUFBwICMIG2GoGzUmVsaWFu
+Y2Ugb24gdGhpcyBjZXJ0aWZpY2F0ZSBieSBhbnkgcGFydHkgYXNzdW1lcyBhY2Nl
+cHRhbmNlIG9mIHRoZSB0aGVuIGFwcGxpY2FibGUgc3RhbmRhcmQgdGVybXMgYW5k
+IGNvbmRpdGlvbnMgb2YgdXNlLCBjZXJ0aWZpY2F0ZSBwb2xpY3kgYW5kIGNlcnRp
+ZmljYXRpb24gcHJhY3RpY2Ugc3RhdGVtZW50cy4wRAYDVR0fBD0wOzA5oDegNYYz
+aHR0cHM6Ly93d3cuYXBwbGUuY29tL2NlcnRpZmljYXRlYXV0aG9yaXR5L3Jvb3Qu
+Y3JsMFUGCCsGAQUFBwEBBEkwRzBFBggrBgEFBQcwAoY5aHR0cHM6Ly93d3cuYXBw
+bGUuY29tL2NlcnRpZmljYXRlYXV0aG9yaXR5L2Nhc2lnbmVycy5odG1sMA0GCSqG
+SIb3DQEBBQUAA4IBAQCd2i0oWC99dgS5BNM+zrdmY06PL9T+S61yvaM5xlJNBZhS
+9YlRASR5vhoy9+VEi0tEBzmC1lrKtCBe2a4VXR2MHTK/ODFiSF3H4ZCx+CRA+F9Y
+m1FdV53B5f88zHIhbsTp6aF31ywXJsM/65roCwO66bNKcuszCVut5mIxauivL9Wv
+Hld2j383LS4CXN1jyfJxuCZA3xWNdUQ/eb3mHZnhQyw+rW++uaT+DjUZUWOxw961
+kj5ReAFziqQjyqSI8R5cH0EWLX6VCqrpiUGYGxrdyyC/R14MJsVVNU3GMIuZZxTH
+CR+6R8faAQmHJEKVvRNgGQrv6n8Obs3BREM6StXj
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIID4TCCAsmgAwIBAgIOYyUAAQACFI0zFQLkbPQwDQYJKoZIhvcNAQEFBQAwezEL
+MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNV
+BAsTG1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQTEoMCYGA1UEAxMfVEMgVHJ1
+c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJSTAeFw0wOTA5MDkwODE1MjdaFw0yOTEy
+MzEyMzU5NTlaMHsxCzAJBgNVBAYTAkRFMRwwGgYDVQQKExNUQyBUcnVzdENlbnRl
+ciBHbWJIMSQwIgYDVQQLExtUQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0ExKDAm
+BgNVBAMTH1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQSBJSUkwggEiMA0GCSqG
+SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDC2pxisLlxErALyBpXsq6DFJmzNEubkKLF
+5+cvAqBNLaT6hdqbJYUtQCggbergvbFIgyIpRJ9Og+41URNzdNW88jBmlFPAQDYv
+DIRlzg9uwliT6CwLOunBjvvya8o84pxOjuT5fdMnnxvVZ3iHLX8LR7PH6MlIfK8v
+zArZQe+f/prhsq75U7Xl6UafYOPfjdN/+5Z+s7Vy+EutCHnNaYlAJ/Uqwa1D7KRT
+yGG299J5KmcYdkhtWyUB0SbFt1dpIxVbYYqt8Bst2a9c8SaQaanVDED1M4BDj5yj
+dipFtK+/fz6HP3bFzSreIMUWWMv5G/UPyw0RUmS40nZid4PxWJ//AgMBAAGjYzBh
+MB8GA1UdIwQYMBaAFFbn4VslQ4Dg9ozhcbyO5YAvxEjiMA8GA1UdEwEB/wQFMAMB
+Af8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRW5+FbJUOA4PaM4XG8juWAL8RI
+4jANBgkqhkiG9w0BAQUFAAOCAQEAg8ev6n9NCjw5sWi+e22JLumzCecYV42Fmhfz
+dkJQEw/HkG8zrcVJYCtsSVgZ1OK+t7+rSbyUyKu+KGwWaODIl0YgoGhnYIg5IFHY
+aAERzqf2EQf27OysGh+yZm5WZ2B6dF7AbZc2rrUNXWZzwCUyRdhKBgePxLcHsU0G
+DeGl6/R1yrqc0L2z0zIkTO5+4nYES0lT2PLpVDP85XEfPRRclkvxOvIAu2y0+pZV
+CIgJwcyRGSmwIC3/yzikQOEXvnlhgP8HA4ZMTnsGnxGGjYnuJ8Tb4rwZjgvDwxPH
+LQNjO9Po5KIqwoIIlBZU8O8fJ5AluA0OKBtHd0e9HKgl8ZS0Zg==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
MIIDvjCCA3ygAwIBAgIFJQaThoEwCwYHKoZIzjgEAwUAMIGFMQswCQYDVQQGEwJG
UjEPMA0GA1UECBMGRnJhbmNlMQ4wDAYDVQQHEwVQYXJpczEQMA4GA1UEChMHUE0v
U0dETjEOMAwGA1UECxMFRENTU0kxDjAMBgNVBAMTBUlHQy9BMSMwIQYJKoZIhvcN
@@ -2567,1203 +2455,2866 @@ AAMvADAsAhRVh+CJA5eVyEYU5AO9Tm7GxX0rmQIUBCqsU5u1WxoZ5lEXicDX5/Ob
sRQ=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
-MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYT
-AkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQ
-TS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG
-9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMB4XDTAyMTIxMzE0MjkyM1oXDTIw
-MTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAM
-BgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEO
-MAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2
-LmZyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaI
-s9z4iPf930Pfeo2aSVz2TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2
-xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCWSo7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4
-u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYyHF2fYPepraX/z9E0+X1b
-F8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNdfrGoRpAx
-Vs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGd
-PDPQtQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNV
-HSAEDjAMMAoGCCqBegF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAx
-NjAfBgNVHSMEGDAWgBSjBS8YYFDCiQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUF
-AAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RKq89toB9RlPhJy3Q2FLwV3duJ
-L92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3QMZsyK10XZZOY
-YLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg
-Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2a
-NjSaTFR+FwNIlQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R
-0982gaEbeC9xs/FZTEYYKKuF0mBWWg==
+MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl
+MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp
+U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw
+NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE
+ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp
+ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3
+DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf
+8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN
++lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0
+X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa
+K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA
+1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G
+A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR
+zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0
+YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD
+bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w
+DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3
+L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D
+eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl
+xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp
+VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY
+WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ
+BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh
+c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy
+MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp
+emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X
+DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw
+FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg
+UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo
+YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5
+MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB
+AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4
+pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0
+13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID
+AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk
+U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i
+F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY
+oJ2daZH9
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV
+BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X
+DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ
+BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3
+DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4
+QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny
+gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw
+zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q
+130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2
+JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw
+DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw
+ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT
+AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj
+AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG
+9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h
+bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc
+fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu
+HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w
+t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw
+WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG
+A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv
+b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw
+MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i
+YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT
+aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ
+jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp
+xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp
+1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG
+snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ
+U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8
+9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E
+BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B
+AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz
+yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE
+38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP
+AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad
+DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME
+HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDIDCCAgigAwIBAgIBJDANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP
+MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MxIENBMB4XDTAx
+MDQwNjEwNDkxM1oXDTIxMDQwNjEwNDkxM1owOTELMAkGA1UEBhMCRkkxDzANBgNV
+BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMSBDQTCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBALWJHytPZwp5/8Ue+H887dF+2rDNbS82rDTG
+29lkFwhjMDMiikzujrsPDUJVyZ0upe/3p4zDq7mXy47vPxVnqIJyY1MPQYx9EJUk
+oVqlBvqSV536pQHydekfvFYmUk54GWVYVQNYwBSujHxVX3BbdyMGNpfzJLWaRpXk
+3w0LBUXl0fIdgrvGE+D+qnr9aTCU89JFhfzyMlsy3uhsXR/LpCJ0sICOXZT3BgBL
+qdReLjVQCfOAl/QMF6452F/NM8EcyonCIvdFEu1eEpOdY6uCLrnrQkFEy0oaAIIN
+nvmLVz5MxxftLItyM19yejhW1ebZrgUaHXVFsculJRwSVzb9IjcCAwEAAaMzMDEw
+DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQIR+IMi/ZTiFIwCwYDVR0PBAQDAgEG
+MA0GCSqGSIb3DQEBBQUAA4IBAQCLGrLJXWG04bkruVPRsoWdd44W7hE928Jj2VuX
+ZfsSZ9gqXLar5V7DtxYvyOirHYr9qxp81V9jz9yw3Xe5qObSIjiHBxTZ/75Wtf0H
+DjxVyhbMp6Z3N/vbXB9OWQaHowND9Rart4S9Tu+fMTfwRvFAttEMpWT4Y14h21VO
+TzF2nBBhjrZTOqMRvq9tfB69ri3iDGnHhVNoomG6xT60eVR4ngrHAr5i0RGCS2Uv
+kVrCqIexVmiUefkl98HVrhq4uz2PqYo4Ffdz0Fpg0YCw8NzVUM1O7pJIae2yIx4w
+zMiUyLb1O4Z/P6Yun/Y+LLWSlj7fLJOK/4GMDw9ZIRlXvVWa
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIF5jCCA86gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMCVVMx
+HTAbBgNVBAoTFEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNBbWVyaWNh
+IE9ubGluZSBJbmMuMTcwNQYDVQQDEy5BT0wgVGltZSBXYXJuZXIgUm9vdCBDZXJ0
+aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyOTA2MDAwMFoXDTM3MDkyODIz
+NDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRBT0wgVGltZSBXYXJuZXIg
+SW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUgSW5jLjE3MDUGA1UEAxMuQU9M
+IFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIw
+DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALQ3WggWmRToVbEbJGv8x4vmh6mJ
+7ouZzU9AhqS2TcnZsdw8TQ2FTBVsRotSeJ/4I/1n9SQ6aF3Q92RhQVSji6UI0ilb
+m2BPJoPRYxJWSXakFsKlnUWsi4SVqBax7J/qJBrvuVdcmiQhLE0OcR+mrF1FdAOY
+xFSMFkpBd4aVdQxHAWZg/BXxD+r1FHjHDtdugRxev17nOirYlxcwfACtCJ0zr7iZ
+YYCLqJV+FNwSbKTQ2O9ASQI2+W6p1h2WVgSysy0WVoaP2SBXgM1nEG2wTPDaRrbq
+JS5Gr42whTg0ixQmgiusrpkLjhTXUr2eacOGAgvqdnUxCc4zGSGFQ+aJLZ8lN2fx
+I2rSAG2X+Z/nKcrdH9cG6rjJuQkhn8g/BsXS6RJGAE57COtCPStIbp1n3UsC5ETz
+kxmlJ85per5n0/xQpCyrw2u544BMzwVhSyvcG7mm0tCq9Stz+86QNZ8MUhy/XCFh
+EVsVS6kkUfykXPcXnbDS+gfpj1bkGoxoigTTfFrjnqKhynFbotSg5ymFXQNoKk/S
+Btc9+cMDLz9l+WceR0DTYw/j1Y75hauXTLPXJuuWCpTehTacyH+BCQJJKg71ZDIM
+gtG6aoIbs0t0EfOMd9afv9w3pKdVBC/UMejTRrkDfNoSTllkt1ExMVCgyhwn2RAu
+rda9EGYrw7AiShJbAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
+FE9pbQN+nZ8HGEO8txBO1b+pxCAoMB8GA1UdIwQYMBaAFE9pbQN+nZ8HGEO8txBO
+1b+pxCAoMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAO/Ouyugu
+h4X7ZVnnrREUpVe8WJ8kEle7+z802u6teio0cnAxa8cZmIDJgt43d15Ui47y6mdP
+yXSEkVYJ1eV6moG2gcKtNuTxVBFT8zRFASbI5Rq8NEQh3q0l/HYWdyGQgJhXnU7q
+7C+qPBR7V8F+GBRn7iTGvboVsNIYvbdVgaxTwOjdaRITQrcCtQVBynlQboIOcXKT
+RuidDV29rs4prWPVVRaAMCf/drr3uNZK49m1+VLQTkCpx+XCMseqdiThawVQ68W/
+ClTluUI8JPu3B5wwn3la5uBAUhX0/Kr0VvlEl4ftDmVyXr4m+02kLQgH3thcoNyB
+M5kYJRF3p+v9WAksmWsbivNSPxpNSGDxoPYzAlOL7SUJuA0t7Zdz7NeWH45gDtoQ
+my8YJPamTQr5O8t1wswvziRpyQoijlmn94IM19drNZxDAGrElWe6nEXLuA4399xO
+AU++CrYD062KRffaJ00psUjf5BHklka9bAI+1lHIlRcBFanyqqryvy9lG2/QuRqT
+9Y41xICHPpQvZuTpqP9BnHAqTyo5GJUefvthATxRCC4oGKQWDzH9OmwjkyB24f0H
+hdFbP9IcczLd+rn4jM8Ch3qaluTtT4mNU0OrDhPAARW0eTjb/G49nlG2uBOLZ8/5
+fNkiHfZdxRwBL5joeiQYvITX+txyW/fBOmg=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV
+UzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2Vj
+dXJlIGVCdXNpbmVzcyBDQS0yMB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0
+NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkVxdWlmYXggU2VjdXJlMSYwJAYD
+VQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCBnzANBgkqhkiG9w0B
+AQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn2Z0G
+vxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/
+BPO3QSQ5BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0C
+AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEX
+MBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJl
+IGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTkw
+NjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9euSBIplBq
+y/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQF
+MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA
+A4GBAAyGgq3oThr1jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy
+0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1
+E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUmV+GRMOrN
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe
+MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0
+ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe
+Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw
+IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL
+SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF
+AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH
+SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh
+ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X
+DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1
+TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ
+fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA
+sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU
+WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS
+nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH
+dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip
+NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC
+AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF
+MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH
+ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB
+uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl
+PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP
+JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/
+gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2
+j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6
+5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB
+o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS
+/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z
+Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE
+W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D
+hNQ+IIX3Sj0rnP0qCglN6oH4EZw=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIF3zCCA8egAwIBAgIOGTMAAQACKBqaBLzyVUUwDQYJKoZIhvcNAQEFBQAwejEL
+MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNV
+BAsTG1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQTEnMCUGA1UEAxMeVEMgVHJ1
+c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJMB4XDTA2MDMyMjE1NTgzNFoXDTMwMTIz
+MTIyNTk1OVowejELMAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVy
+IEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQTEnMCUG
+A1UEAxMeVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJMIICIjANBgkqhkiG
+9w0BAQEFAAOCAg8AMIICCgKCAgEAi9R3azRs5TbYalxeOO781R15Azt7g2JEgk6I
+7d6D/+7MUGIFBZWZdpj2ufJf2AaRksL2LWYXH/1TA+iojWOpbuHWG4y8mLOLO9Tk
+Lsp9hUkmW3m4GotAnn+7yT9jLM/RWny6KCJBElpN+Rd3/IX9wkngKhh/6aAsnPlE
+/AxoOUL1JwW+jhV6YJ3wO8c85j4WvK923mq3ouGrRkXrjGV90ZfzlxElq1nroCLZ
+gt2Y7X7i+qBhCkoy3iwX921E6oFHWZdXNwM53V6CItQzuPomCba8OYgvURVOm8M7
+3xOCiN1LNPIz1pDp81PcNXzAw9l8eLPNcD+NauCjgUjkKa1juPD8KGQ7mbN9/pqd
+iPaZIgiRRxaJNXhdd6HPv0nh/SSUK2k2e+gc5iqQilvVOzRZQtxtz7sPQRxVzfUN
+Wy4WIibvYR6X/OJTyM9bo8ep8boOhhLLE8oVx+zkNo3aXBM9ZdIOXXB03L+PemrB
+Lg/Txl4PK1lszGFs/sBhTtnmT0ayWuIZFHCE+CAA7QGnl37DvRJckiMXoKUdRRcV
+I5qSCLUiiI3cKyTr4LEXaNOvYb3ZhXj2jbp4yjeNY77nrB/fpUcJucglMVRGURFV
+DYlcjdrSGC1z8rjVJ/VIIjfRYvd7Dcg4i6FKsPzQ8eu3hmPn4A5zf/1yUbXpfeJV
+BWR4Z38CAwEAAaNjMGEwHwYDVR0jBBgwFoAUzdeQoW6jv9sw1toyJZAM5jkegGUw
+DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFM3XkKFu
+o7/bMNbaMiWQDOY5HoBlMA0GCSqGSIb3DQEBBQUAA4ICAQB+FojoEw42zG4qhQc4
+xlaJeuNHIWZMUAgxWlHQ/KZeFHXeTDvs8e3MfhEHSmHu6rOOOqQzxu2KQmZP8Tx7
+yaUFQZmx7Cxb7tyW0ohTS3g0uW7muw/FeqZ8Dhjfbw90TNGp8aHp2FRkzF6WeKJW
+GsFzshXGVwXf2vdIJIqOf2qp+U3pPmrOYCx9LZAI9mOPFdAtnIz/8f38DBZQVhT7
+upeG7rRJA1TuG1l/MDoCgoYhrv7wFfLfToPmmcW6NfcgkIw47XXP4S73BDD7Ua2O
+giRAyn0pXdXZ92Vk/KqfdLh9kl3ShCngE+qK99CrxK7vFcXCifJ7tjtJmGHzTnKR
+N4xJkunI7Cqg90lufA0kxmts8jgvynAF5X/fxisrgIDV2m/LQLvYG/AkyRDIRAJ+
+LtOYqqIN8SvQ2vqOHP9U6OFKbt2o1ni1N6WsZNUUI8cOpevhCTjXwHxgpV2Yj4wC
+1dxWqPNNWKkL1HxkdAEy8t8PSoqpAqKiHYR3wvHMl700GXRd4nQ+dSf3r7/ufA5t
+VIimVuImrTESPB5BeW0X6hNeH/Vcn0lZo7Ivo0LD+qh+v6WfSMlgYmIK371F3uNC
+tVGW/cT1Gpm4UqJEzS1hjBWPgdVdotSQPYxuQGHDWV3Y2eH2dEcieXR92sqjbzcV
+NvAsGnE8EXbfXRo+VGN4a2V+Hw==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIHqTCCBZGgAwIBAgIQYwaGp8U3ZaVDkKhqWMzUMjANBgkqhkiG9w0BAQUFADCB
+jzELMAkGA1UEBhMCTFYxNTAzBgNVBAoTLFZBUyBMYXR2aWphcyBQYXN0cyAtIFZp
+ZW4ucmVnLk5yLjQwMDAzMDUyNzkwMSMwIQYDVQQLExpTZXJ0aWZpa2FjaWphcyBw
+YWthbHBvanVtaTEkMCIGA1UEAxMbVkFTIExhdHZpamFzIFBhc3RzIFNTSShSQ0Ep
+MB4XDTA2MDkxMzA5MjIxMFoXDTI0MDkxMzA5Mjc1N1owgY8xCzAJBgNVBAYTAkxW
+MTUwMwYDVQQKEyxWQVMgTGF0dmlqYXMgUGFzdHMgLSBWaWVuLnJlZy5Oci40MDAw
+MzA1Mjc5MDEjMCEGA1UECxMaU2VydGlmaWthY2lqYXMgcGFrYWxwb2p1bWkxJDAi
+BgNVBAMTG1ZBUyBMYXR2aWphcyBQYXN0cyBTU0koUkNBKTCCAiIwDQYJKoZIhvcN
+AQEBBQADggIPADCCAgoCggIBAJu4+f1hVS9PpKUUtS6OuSSPrPuxVD9A/0/F5YZo
+e1OT+zWCNahQLpRSoNuDPnXaFXCsCc/ugkmtNkm5tHGLtAChQgbKCApjl7YI/O60
+3Jh4GYLJ+H9kPqrJ/rGN67Bk9bzzxD46kOpOjj8bGbxqg8ORPGxV+wpSwOjhXXeF
+M8VJ3+xqv79sN/6OSaIVGM6LjmseOKMwb4iBfnJWRBrEejkP9sSPltSy6wBOXN67
+5zu35iQFk2tN5pFEv+6YG8eFGxFBeyI2p74+6Ho33BjekJ2PzbLXmj/iF39bDOHv
+P2Y9biTksM7DDIhslNo4JXxSOeNzFLMARWOaDEJAXgTG93JkzsluM7Pk020klTeT
+fvIAXRmLH/NDc6ifRdIGqey0Qrv67gzHTz9RH9Gv0KwYf4eBIv6p3QeWbXz4TtlN
+OlBp1UF+xdp02I5z5X6D4cMZgbe9v0COvi6aogyqTgIuuyrhCF0xA8msJ7Cv3NXI
+FH1AnVWJIfmQzNTJYEFzq+jN2DpVOQqCmf6b9fU8HJHLwPpGVK4h/CqsXHveepdx
+/WxrzUiapNuBfBg3L5B9YZS9F8lctlQWd8oJSqrpvE+UdQFaVryS0o+515feVnQB
+9xZxSbH1GEaZQe5i4bMsZXVpKXJDA/ibH/o49J7sQBCOrJfVsDO+nxjcLfdBeFRK
+YkTnAgMBAAGjggH9MIIB+TAOBgNVHQ8BAf8EBAMCAQYwGAYIKwYBBQUHAQMEDDAK
+MAgGBgQAjkYBATAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTMw/Vm/3OsOFqW
+GyGJuIFMH8teJTAQBgkrBgEEAYI3FQEEAwIBADCCAYkGA1UdIASCAYAwggF8MIIB
+eAYLKwYBBAGBxFkBAQIwggFnMIIBOAYIKwYBBQUHAgIwggEqHoIBJgBTAGkAcwAg
+AGkAcgAgAHMAZQByAHQAaQBmAGkAawBhAHQAcwAsACAAawBvACAAaQB6AGQAZQB2
+AGkAcwAgAFYAQQBTACAATABhAHQAdgBpAGoAYQBzACAAUABhAHMAdABzACwAIABu
+AG8AZAByAG8AcwBpAG4AbwB0ACAAYQB0AGIAaQBsAHMAdABpAGIAdQAgAEUAbABl
+AGsAdAByAG8AbgBpAHMAawBvACAAZABvAGsAdQBtAGUAbgB0AHUAIABsAGkAawB1
+AG0AYQBtACAAdQBuACAARQBpAHIAbwBwAGEAcwAgAFAAYQByAGwAYQBtAGUAbgB0
+AGEAIABkAGkAcgBlAGsAdABpAHYAYQBpACAAMQA5ADkAOQAvADkAMwAvAEUASzAp
+BggrBgEFBQcCARYdaHR0cDovL3d3dy5lLW1lLmx2L3JlcG9zaXRvcnkwDQYJKoZI
+hvcNAQEFBQADggIBAB8oSjWQIWNoCi94r6MegiaXoz8nGdJLo0J6BhNlW8EEy+t9
+fO+U8vGJ9bffUgIhadLqljTloM+XuJxVDhCFoxReLAX4tTp28/l6uN62DCdp8suU
+kQsdudWOb5kvzfIZVjk6SFbwAf+Cdbay/dHU9fJjV0xNoX7MELoEae/0FPyzlx9F
+7m9KKH/Rxie8x6Opa3vtghNvq94P+3HrXBEaqSzQMJ/8NjdW75XpurcTtq6fAmGt
+nuxrBG82nw+Z98LJyEwouSjUIdeeVNXAzvSO5FWUe48kxjj8q3qkVnc9qEXvZJKk
+0Ep+u3OL9A1Sc7g6SF5DgNOpcHdi/8coHHMeQ+YnJFtJueY2pI79xS0veqV5EnrX
+IbIlbcgPosNhS+VI4le6n/KKId3bZPDaGd/OwJuAOcJ3d2MVU3KE+qSPBzeGIX1Q
++j1qN9uRDjez/c4Lynth0Jx0nH04aG3pex3W8Sq07ztgUncF5gLCX4xbvPB9t3PH
+kWuyKrNjozTVq60lcUf/Gj56to2VdsPups0DCWzuRWeYz5lIdsHOinSaaFIBNCLI
+7eIUC4S9bhCMsXKbvugI11fVf+q0AT1O5OLoZ+eMfunnQhHvlUbIkda+JxeAGTSY
+58bfHvwhX56GPbx+8Jy9cp70R4JbcWfz+txUTKhc2FnH0AcOEzMnvPRp8Gsh
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDtTCCAp2gAwIBAgIIBhDCeat3PfIwDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UE
+BhMCQ0gxEjAQBgNVBAoTCVN3aXNzU2lnbjEyMDAGA1UEAxMpU3dpc3NTaWduIENB
+IChSU0EgSUsgTWF5IDYgMTk5OSAxODowMDo1OCkxHzAdBgkqhkiG9w0BCQEWEGNh
+QFN3aXNzU2lnbi5jb20wHhcNMDAxMTI2MjMyNzQxWhcNMzExMTI2MjMyNzQxWjB2
+MQswCQYDVQQGEwJDSDESMBAGA1UEChMJU3dpc3NTaWduMTIwMAYDVQQDEylTd2lz
+c1NpZ24gQ0EgKFJTQSBJSyBNYXkgNiAxOTk5IDE4OjAwOjU4KTEfMB0GCSqGSIb3
+DQEJARYQY2FAU3dpc3NTaWduLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBAKw5fjnmNneLQlUCQG8jQLwwfbrOZoUwNX8cbNqhxK03/xUloFVgAt+S
+Te2RxNXaCAXLBPn5ZST35TLV57aLmbHCtifv3YZqaaQGvjedltIBMJihJhZ+h3LY
+SKsUb+xEJ3x5ZUf8jP+Q1g57y1s8SnBFWN/ni5NkF1Y1y31VwOi9wiOf/VISL+uu
+SC4i1CP1Kbz3BDs6Hht1GpRYCbJ/K0bc9oJSpWpT5PGONsGIawqMbJuyoDghsXQ1
+pbn2e8K64BSscGZVZTNooSGgNiHmACNJBYXiWVWrwXPF4l6SddmC3Rj0aKXjgECc
+FkHLDQcsM5JsK2ZLryTDUsQFbxVP2ikCAwEAAaNHMEUwCwYDVR0PBAQDAgEGMAwG
+A1UdEwQFMAMBAf8wHQYDVR0OBBYEFJbXcc05KtT8iLGKq1N4ae+PR34WMAkGA1Ud
+IwQCMAAwDQYJKoZIhvcNAQEFBQADggEBAKMy6W8HvZdS1fBpEUzl6Lvw50bgE1Xc
+HU1JypSBG9mhdcXZo5AlPB4sCvx9Dmfwhyrdsshc0TP2V3Vh6eQqnEF5qB4lVziT
+Bko9mW6Ot+pPnwsy4SHpx3rw6jCYnOqfUcZjWqqqRrq/3P1waz+Mn4cLMVEg3Xaz
+qYov/khvSqS0JniwjRlo2H6f/1oVUKZvP+dUhpQepfZrOqMAWZW4otp6FolyQyeU
+NN6UCRNiUKl5vTijbKwUUwfER/1Vci3M1/O1QCfttQ4vRN4Buc0xqYtGL3cd5WiO
+vWzyhlTzAI6VUdNkQhhHJSAyTpj6dmXDRzrryoFGa2PjgESxz7XBaSI=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK
+MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x
+GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx
+MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg
+Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG
+SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ
+iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa
+/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ
+jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI
+HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7
+sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w
+gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF
+MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw
+KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG
+AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L
+URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO
+H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm
+I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY
+iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc
+f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCB
+kzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug
+Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho
+dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZBgNVBAMTElVUTiAtIERBVEFDb3Jw
+IFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBaMIGTMQswCQYDVQQG
+EwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYD
+VQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cu
+dXNlcnRydXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjAN
+BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6
+E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ysraP6LnD43m77VkIVni5c7yPeIbkFdicZ
+D0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlowHDyUwDAXlCCpVZvNvlK
+4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA9P4yPykq
+lXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulW
+bfXv33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQAB
+o4GrMIGoMAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRT
+MtGzz3/64PGgXYVOktKeRR20TzA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3Js
+LnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dDLmNybDAqBgNVHSUEIzAhBggr
+BgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3DQEBBQUAA4IB
+AQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft
+Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyj
+j98C5OBxOvG0I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVH
+KWss5nbZqSl9Mt3JNjy9rjXxEZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv
+2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwPDPafepE39peC4N1xaf92P2BNPM/3
+mfnGV/TJVTl4uix5yaaIK/QI
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x
+GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv
+b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV
+BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W
+YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM
+V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB
+4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr
+H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd
+8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv
+vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT
+mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe
+btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc
+T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt
+WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ
+c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A
+4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD
+VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG
+CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0
+aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0
+aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu
+dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw
+czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G
+A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC
+TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg
+Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0
+7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem
+d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd
++LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B
+4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN
+t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x
+DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57
+k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s
+zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j
+Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT
+mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK
+4SVhM7JZG+Ju1zdXtg2pEto=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzET
+MBEGA1UEBxMKQnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UE
+AxMIQ0EgRGlzaWcwHhcNMDYwMzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQsw
+CQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcg
+YS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
+ggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgmGErE
+Nx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnX
+mjxUizkDPw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYD
+XcDtab86wYqg6I7ZuUUohwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhW
+S8+2rT+MitcE5eN4TPWGqvWP+j1scaMtymfraHtuM6kMgiioTGohQBUgDCZbg8Kp
+FhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8wgfwwDwYDVR0TAQH/BAUw
+AwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0PAQH/BAQD
+AgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cu
+ZGlzaWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5z
+ay9jYS9jcmwvY2FfZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2sv
+Y2EvY3JsL2NhX2Rpc2lnLmNybDAaBgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEw
+DQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59tWDYcPQuBDRIrRhCA/ec8J9B6
+yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3mkkp7M5+cTxq
+EEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/
+CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeB
+EicTXxChds6KezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFN
+PGO+I++MzVpQuGhU+QqZMxEA4Z7CRneC9VkGjCFMhwnN5ag=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEU
+MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3
+b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMw
+MTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
+QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYD
+VQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUA
+A4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ul
+CDtbKRY654eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6n
+tGO0/7Gcrjyvd7ZWxbWroulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyl
+dI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1Zmne3yzxbrww2ywkEtvrNTVokMsAsJch
+PXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJuiGMx1I4S+6+JNM3GOGvDC
++Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8wHQYDVR0O
+BBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8E
+BTADAQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBl
+MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFk
+ZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENB
+IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxtZBsfzQ3duQH6lmM0MkhHma6X
+7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0PhiVYrqW9yTkkz
+43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY
+eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJl
+pz/+0WatC7xrmYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOA
+WiFeIc9TVPC6b4nbqKqVz4vjccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFGTCCBAGgAwIBAgIEPki9xDANBgkqhkiG9w0BAQUFADAxMQswCQYDVQQGEwJE
+SzEMMAoGA1UEChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTAeFw0wMzAyMTEw
+ODM5MzBaFw0zNzAyMTEwOTA5MzBaMDExCzAJBgNVBAYTAkRLMQwwCgYDVQQKEwNU
+REMxFDASBgNVBAMTC1REQyBPQ0VTIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEArGL2YSCyz8DGhdfjeebM7fI5kqSXLmSjhFuHnEz9pPPEXyG9VhDr
+2y5h7JNp46PMvZnDBfwGuMo2HP6QjklMxFaaL1a8z3sM8W9Hpg1DTeLpHTk0zY0s
+2RKY+ePhwUp8hjjEqcRhiNJerxomTdXkoCJHhNlktxmW/OwZ5LKXJk5KTMuPJItU
+GBxIYXvViGjaXbXqzRowwYCDdlCqT9HU3Tjw7xb04QxQBr/q+3pJoSgrHPb8FTKj
+dGqPqcNiKXEx5TukYBdedObaE+3pHx8b0bJoc8YQNHVGEBDjkAB2QMuLt0MJIf+r
+TpPGWOmlgtt3xDqZsXKVSQTwtyv6e1mO3QIDAQABo4ICNzCCAjMwDwYDVR0TAQH/
+BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwgewGA1UdIASB5DCB4TCB3gYIKoFQgSkB
+AQEwgdEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2VydGlmaWthdC5kay9yZXBv
+c2l0b3J5MIGdBggrBgEFBQcCAjCBkDAKFgNUREMwAwIBARqBgUNlcnRpZmlrYXRl
+ciBmcmEgZGVubmUgQ0EgdWRzdGVkZXMgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEu
+MS4xLiBDZXJ0aWZpY2F0ZXMgZnJvbSB0aGlzIENBIGFyZSBpc3N1ZWQgdW5kZXIg
+T0lEIDEuMi4yMDguMTY5LjEuMS4xLjARBglghkgBhvhCAQEEBAMCAAcwgYEGA1Ud
+HwR6MHgwSKBGoESkQjBAMQswCQYDVQQGEwJESzEMMAoGA1UEChMDVERDMRQwEgYD
+VQQDEwtUREMgT0NFUyBDQTENMAsGA1UEAxMEQ1JMMTAsoCqgKIYmaHR0cDovL2Ny
+bC5vY2VzLmNlcnRpZmlrYXQuZGsvb2Nlcy5jcmwwKwYDVR0QBCQwIoAPMjAwMzAy
+MTEwODM5MzBagQ8yMDM3MDIxMTA5MDkzMFowHwYDVR0jBBgwFoAUYLWF7FZkfhIZ
+J2cdUBVLc647+RIwHQYDVR0OBBYEFGC1hexWZH4SGSdnHVAVS3OuO/kSMB0GCSqG
+SIb2fQdBAAQQMA4bCFY2LjA6NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEACrom
+JkbTc6gJ82sLMJn9iuFXehHTuJTXCRBuo7E4A9G28kNBKWKnctj7fAXmMXAnVBhO
+inxO5dHKjHiIzxvTkIvmI/gLDjNDfZziChmPyQE+dF10yYscA+UYyAFMP8uXBV2Y
+caaYb7Z8vTd/vuGTJW1v8AqtFxjhA7wHKcitJuj4YfD9IQl+mo6paH1IYnK9AOoB
+mbgGglGBTvH1tJFUuSN6AJqfXY3gPGS5GhKSKseCRHI53OI8xthV9RVOyAUO28bQ
+YqbsFbS1AoLbrIyigfCbmTH1ICCoiGEKB5+U/NDXG8wuF/MEJ3Zn61SD/aSQfgY9
+BKNDLdr8C2LqL19iUw==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIG0TCCBbmgAwIBAgIBezANBgkqhkiG9w0BAQUFADCByTELMAkGA1UEBhMCSFUx
+ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0
+b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMUIwQAYDVQQD
+EzlOZXRMb2NrIE1pbm9zaXRldHQgS296amVneXpvaSAoQ2xhc3MgUUEpIFRhbnVz
+aXR2YW55a2lhZG8xHjAcBgkqhkiG9w0BCQEWD2luZm9AbmV0bG9jay5odTAeFw0w
+MzAzMzAwMTQ3MTFaFw0yMjEyMTUwMTQ3MTFaMIHJMQswCQYDVQQGEwJIVTERMA8G
+A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh
+Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxQjBABgNVBAMTOU5l
+dExvY2sgTWlub3NpdGV0dCBLb3pqZWd5em9pIChDbGFzcyBRQSkgVGFudXNpdHZh
+bnlraWFkbzEeMBwGCSqGSIb3DQEJARYPaW5mb0BuZXRsb2NrLmh1MIIBIjANBgkq
+hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx1Ilstg91IRVCacbvWy5FPSKAtt2/Goq
+eKvld/Bu4IwjZ9ulZJm53QE+b+8tmjwi8F3JV6BVQX/yQ15YglMxZc4e8ia6AFQe
+r7C8HORSjKAyr7c3sVNnaHRnUPYtLmTeriZ539+Zhqurf4XsoPuAzPS4DB6TRWO5
+3Lhbm+1bOdRfYrCnjnxmOCyqsQhjF2d9zL2z8cM/z1A57dEZgxXbhxInlrfa6uWd
+vLrqOU+L73Sa58XQ0uqGURzk/mQIKAR5BevKxXEOC++r6uwSEaEYBTJp0QwsGj0l
+mT+1fMptsK6ZmfoIYOcZwvK9UdPM0wKswREMgM6r3JSda6M5UzrWhQIDAMV9o4IC
+wDCCArwwEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8EBAMCAQYwggJ1Bglg
+hkgBhvhCAQ0EggJmFoICYkZJR1lFTEVNISBFemVuIHRhbnVzaXR2YW55IGEgTmV0
+TG9jayBLZnQuIE1pbm9zaXRldHQgU3pvbGdhbHRhdGFzaSBTemFiYWx5emF0YWJh
+biBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBBIG1pbm9zaXRldHQg
+ZWxla3Ryb25pa3VzIGFsYWlyYXMgam9naGF0YXMgZXJ2ZW55ZXN1bGVzZW5laywg
+dmFsYW1pbnQgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYSBNaW5vc2l0ZXR0IFN6
+b2xnYWx0YXRhc2kgU3phYmFseXphdGJhbiwgYXogQWx0YWxhbm9zIFN6ZXJ6b2Rl
+c2kgRmVsdGV0ZWxla2JlbiBlbG9pcnQgZWxsZW5vcnplc2kgZWxqYXJhcyBtZWd0
+ZXRlbGUuIEEgZG9rdW1lbnR1bW9rIG1lZ3RhbGFsaGF0b2sgYSBodHRwczovL3d3
+dy5uZXRsb2NrLmh1L2RvY3MvIGNpbWVuIHZhZ3kga2VyaGV0b2sgYXogaW5mb0Bu
+ZXRsb2NrLm5ldCBlLW1haWwgY2ltZW4uIFdBUk5JTkchIFRoZSBpc3N1YW5jZSBh
+bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGFyZSBzdWJqZWN0IHRvIHRo
+ZSBOZXRMb2NrIFF1YWxpZmllZCBDUFMgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3
+Lm5ldGxvY2suaHUvZG9jcy8gb3IgYnkgZS1tYWlsIGF0IGluZm9AbmV0bG9jay5u
+ZXQwHQYDVR0OBBYEFAlqYhaSsFq7VQ7LdTI6MuWyIckoMA0GCSqGSIb3DQEBBQUA
+A4IBAQCRalCc23iBmz+LQuM7/KbD7kPgz/PigDVJRXYC4uMvBcXxKufAQTPGtpvQ
+MznNwNuhrWw3AkxYQTvyl5LGSKjN5Yo5iWH5Upfpvfb5lHTocQ68d4bDBsxafEp+
+NFAwLvt/MpqNPfMgW/hqyobzMUwsWYACff44yTB1HLdV47yfuqhthCgFdbOLDcCR
+VCHnpgu0mfVRQdzNo0ci2ccBgcTcR08m6h/t280NmPSjnLRzMkqWmf68f8glWPhY
+83ZmiVSkpj7EUFy6iRiCdUgh0k8T6GB+B3bbELVR5qq5aKrN9p2QdRLqOBrKROi3
+macqaJVmlaut74nLYKkGEsaUR+ko
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIICmDCCAgGgAwIBAgIBDjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJVUzEY
+MBYGA1UEChMPVS5TLiBHb3Zlcm5tZW50MQwwCgYDVQQLEwNFQ0ExFDASBgNVBAMT
+C0VDQSBSb290IENBMB4XDTA0MDYxNDEwMjAwOVoXDTQwMDYxNDEwMjAwOVowSzEL
+MAkGA1UEBhMCVVMxGDAWBgNVBAoTD1UuUy4gR292ZXJubWVudDEMMAoGA1UECxMD
+RUNBMRQwEgYDVQQDEwtFQ0EgUm9vdCBDQTCBnzANBgkqhkiG9w0BAQEFAAOBjQAw
+gYkCgYEArkr2eXIS6oAKIpDkOlcQZdMGdncoygCEIU+ktqY3of5SVVXU7/it7kJ1
+EUzR4ii2vthQtbww9aAnpQxcEmXZk8eEyiGEPy+cCQMllBY+efOtKgjbQNDZ3lB9
+19qzUJwBl2BMxslU1XsJQw9SK10lPbQm4asa8E8e5zTUknZBWnECAwEAAaOBizCB
+iDAfBgNVHSMEGDAWgBT2uAQnDlYW2blj2f2hVGVBoAhILzAdBgNVHQ4EFgQU9rgE
+Jw5WFtm5Y9n9oVRlQaAISC8wDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB
+Af8wJQYDVR0gBB4wHDAMBgpghkgBZQMCAQwBMAwGCmCGSAFlAwIBDAIwDQYJKoZI
+hvcNAQEFBQADgYEAHh0EQY2cZ209aBb5q0wW1ER0dc4OGzsLyqjHfaQ4TEaMmUwL
+AJRta/c4KVWLiwbODsvgJk+CaWmSL03gRW/ciVb/qDV7qh9Pyd1cOlanZTAnPog2
+i82yL3i2fK9DCC84uoxEQbgqK2jx9bIjFTwlAqITk9fGAm5mdT84IEwq1Gw=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEojCCA4qgAwIBAgIQRL4Mi1AAJLQR0zYlJWfJiTANBgkqhkiG9w0BAQUFADCB
+rjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug
+Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho
+dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xNjA0BgNVBAMTLVVUTi1VU0VSRmlyc3Qt
+Q2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBFbWFpbDAeFw05OTA3MDkxNzI4NTBa
+Fw0xOTA3MDkxNzM2NThaMIGuMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAV
+BgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5l
+dHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTE2MDQGA1UE
+AxMtVVROLVVTRVJGaXJzdC1DbGllbnQgQXV0aGVudGljYXRpb24gYW5kIEVtYWls
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsjmFpPJ9q0E7YkY3rs3B
+YHW8OWX5ShpHornMSMxqmNVNNRm5pELlzkniii8efNIxB8dOtINknS4p1aJkxIW9
+hVE1eaROaJB7HHqkkqgX8pgV8pPMyaQylbsMTzC9mKALi+VuG6JG+ni8om+rWV6l
+L8/K2m2qL+usobNqqrcuZzWLeeEeaYji5kbNoKXqvgvOdjp6Dpvq/NonWz1zHyLm
+SGHGTPNpsaguG7bUMSAsvIKKjqQOpdeJQ/wWWq8dcdcRWdq6hw2v+vPhwvCkxWeM
+1tZUOt4KpLoDd7NlyP0e03RiqhjKaJMeoYV+9Udly/hNVyh00jT/MLbu9mIwFIws
+6wIDAQABo4G5MIG2MAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud
+DgQWBBSJgmd9xJ0mcABLtFBIfN49rgRufTBYBgNVHR8EUTBPME2gS6BJhkdodHRw
+Oi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLVVTRVJGaXJzdC1DbGllbnRBdXRoZW50
+aWNhdGlvbmFuZEVtYWlsLmNybDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUH
+AwQwDQYJKoZIhvcNAQEFBQADggEBALFtYV2mGn98q0rkMPxTbyUkxsrt4jFcKw7u
+7mFVbwQ+zznexRtJlOTrIEy05p5QLnLZjfWqo7NK2lYcYJeA3IKirUq9iiv/Cwm0
+xtcgBEXkzYABurorbs6q15L+5K/r9CYdFip/bDCVNy8zEqx/3cfREYxRmLLQo5HQ
+rfafnoOTHh1CuEava2bwm3/q4wMC5QJRwarVNZ1yQAOJujEdxRBoUp7fooXFXAim
+eOZTT7Hot9MUnpOmw2TjrH5xzbyf6QMbzPvprDHBr3wVdAKZw7JHpsIyYdfHb0gk
+USeh1YdV8nuPmD0Wnu51tvjQjvLzxq4oW6fw8zYX/MMF08oDSlQ=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDIjCCAougAwIBAgIQNKT/9jCvTKU8MxdCoZRmdTANBgkqhkiG9w0BAQUFADCB
+xDELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJ
+Q2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UE
+CxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhh
+d3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0
+ZS5jb20wHhcNOTYwODAxMDAwMDAwWhcNMjEwMTAxMjM1OTU5WjCBxDELMAkGA1UE
+BhMCWkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3du
+MR0wGwYDVQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlm
+aWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZl
+ciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8w
+DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl
+/Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF
+/rFrKbYvScg71CcEJRCXL+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982
+OsK1ZiIS1ocNAgMBAAGjEzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEF
+BQADgYEAvkBpQW/G28GnvwfAReTQtUMeTJUzNelewj4o9qgNUNX/4gwP/FACjq6R
+ua00io2fJ3GqGcxL6ATK1BdrEhrWxl/WzV7/iXa/2EjYWb0IiokdV81FHlK6EpqE
++hiJX+j5MDVqAWC5mYCDhQpu2vTJj15zLTFKY6B08h+LItIpPus=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDITCCAoqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCByzELMAkGA1UEBhMCWkEx
+FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD
+VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT
+ZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFBlcnNvbmFsIEJhc2lj
+IENBMSgwJgYJKoZIhvcNAQkBFhlwZXJzb25hbC1iYXNpY0B0aGF3dGUuY29tMB4X
+DTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgcsxCzAJBgNVBAYTAlpBMRUw
+EwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEaMBgGA1UE
+ChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2Vy
+dmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQZXJzb25hbCBCYXNpYyBD
+QTEoMCYGCSqGSIb3DQEJARYZcGVyc29uYWwtYmFzaWNAdGhhd3RlLmNvbTCBnzAN
+BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAvLyTU23AUE+CFeZIlDWmWr5vQvoPR+53
+dXLdjUmbllegeNTKP1GzaQuRdhciB5dqxFGTS+CN7zeVoQxN2jSQHReJl+A1OFdK
+wPQIcOk8RHtQfmGakOMj04gRRif1CwcOu93RfyAKiLlWCy4cgNrx454p7xS9CkT7
+G1sY0b8jkyECAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQF
+AAOBgQAt4plrsD16iddZopQBHyvdEktTwq1/qqcAXJFAVyVKOKqEcLnZgA+le1z7
+c8a914phXAPjLSeoF+CEhULcXpvGt7Jtu3Sv5D/Lp7ew4F2+eIMllNLbgQ95B21P
+9DkVWlIBe94y1k049hJcBlDfBVu9FEuh3ym6O0GN92NWod8isQ==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB
+gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk
+MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY
+UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx
+NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3
+dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy
+dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB
+dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6
+38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP
+KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q
+DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4
+qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa
+JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi
+PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P
+BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs
+jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0
+eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD
+ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR
+vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt
+qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa
+IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy
+i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ
+O+7ETPTsJ3xCwnR8gooJybQDJbw=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc
+MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP
+bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2
+MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft
+ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg
+Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP
+ADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC
+206B89enfHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFci
+KtZHgVdEglZTvYYUAQv8f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2
+JxhP7JsowtS013wMPgwr38oE18aO6lhOqKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9
+BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JNRvCAOVIyD+OEsnpD8l7e
+Xz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0gBe4lL8B
+PeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67
+Xnfn6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEq
+Z8A9W6Wa6897GqidFEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZ
+o2C7HK2JNDJiuEMhBnIMoVxtRsX6Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3
++L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnjB453cMor9H124HhnAgMBAAGj
+YzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3OpaaEg5+31IqEj
+FNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE
+AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmn
+xPBUlgtk87FYT15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2
+LHo1YGwRgJfMqZJS5ivmae2p+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzccc
+obGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXgJXUjhx5c3LqdsKyzadsXg8n33gy8
+CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//ZoyzH1kUQ7rVyZ2OuMe
+IjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgOZtMA
+DjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2F
+AjgQ5ANh1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUX
+Om/9riW99XJZZLF0KjhfGEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPb
+AZO1XB4Y3WRayhgoPmMEEf0cjQAPuDffZ4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQl
+Zvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuPcX/9XhmgD0uRuMRUvAaw
+RY8mkaKO/qk=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
-MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUF
-ADCBgTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3Rl
-cjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0
-ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe
-Fw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJH
-QjEbMBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxm
-b3JkMRowGAYDVQQKExFDT01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09N
-T0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF
-AAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH+7uIzg3j
-Lz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/a
-N5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaa
-P+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC
-8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+DT+nHbrTUcEL
-pNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVIrLsm
-9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAO
-BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g
-PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0
-aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5
-t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP
-OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYm
-uNg4ON8qa90SzMc/RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjs
-LjBOlDW0JB9LeGna8gI4zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV
-8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38
-NBejxiEovjBFMR7HeL5YYTisO+IBZQ==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJF
-VTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMw
-IQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEiMCAGA1UEAxMZ
-Q2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAxNjEzNDNaFw0z
-NzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1l
-cmZpcm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cu
-Y2hhbWJlcnNpZ24ub3JnMSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJj
-ZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOCAQ0AMIIBCAKCAQEAtzZV5aVd
-GDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlUxFF6tdpg
-6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41
-XQEMIwRHNaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxa
-UWktWBiP7Zme8a7ileb2R6jWDA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUM
-I/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFVd9oKDMyXroDclDZK9D7O
-NhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1UdEwEB
-/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFt
-YmVyc2lnbi5vcmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p
-26EpW1eLTXYGduHRooowDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQE
-AwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hhbWJlcnNpZ24ub3Jn
-MCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD
-VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8v
-Y3BzLmNoYW1iZXJzaWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJ
-KoZIhvcNAQEFBQADggEBAAxBl8IahsAifJ/7kPMa0QOx7xP5IV8EnNrJpY0n
-bJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvDL8y6C98/d3tG
-fToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QU
-u/wNUPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZB
-zu9Bga5Y34OirsrXdx/nADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+
-S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1erfutGWaIZDgqtCYvDi1czyL
-+Nw=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJF
-VTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMw
-IQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4GA1UEAxMX
-R2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYxNDE4WhcNMzcw
-OTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJm
-aXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNo
-YW1iZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJv
-b3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAwggEIAoIBAQCicKLQn0KuWxfH
-2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J1tPfnZda
-n5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH
-+VX6ox8Oby4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvu
-sZjsyq16aUXjlg9V9ubtdepl6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8Co
-X6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c8lCrEqWhz0hQpe/SyBoT
-+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/BAgw
-BgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJz
-aWduLm9yZy9jaGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4w
-TcbOX60Qq+UDpfqpFDAOBgNVHQ8BAf8EBAMCAQYwEQYJYIZIAYb4QgEBBAQD
-AgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBjaGFtYmVyc2lnbi5v
-cmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y
-ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0
-dHA6Ly9jcHMuY2hhbWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3Qu
-aHRtbDANBgkqhkiG9w0BAQUFAAOCAQEAPDtwkfkEVCeR4e3t/mh/YV3lQWVP
-MvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9YgOKBWYi+wONG
-kyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76Svpyk
-BMdJPJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+
-xgBJOm5YstHRJw0lyDL4IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLT
-BQNRxgfvzBRydD1ucs4YKIxKoHflCStFREest2d/AYoFWpO+ocH/+OcOZ6RH
-SXZddZAa9SaP8A==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEF
-BQAwPTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQD
-ExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2
-MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZ
-BgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQAD
-ggEPADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxv
-c0NXYKwzCkTsA18cgCSR5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi
-8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZVg2v7tK8R1fjeUl7NIknJITe
-sezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFOYFWe2yMZ
-eVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupd
-M5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUC
-AwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNV
-HQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4QgEBBAQDAgEG
-MDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29tL0NS
-TC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9W
-M2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8
-yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzO
-UrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW
-2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW
-//1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4F
-TUcY1Rbpsda2ENW7l7+ijrRU
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUF
-ADBbMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUg
-VHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VTMRcwFQYDVQQDEw5EU1QgQUNFUyBD
-QSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NThaMFsxCzAJBgNV
-BAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8G
-A1UECxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjAN
-BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5
-WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzIDZBfZIGxqAgNTNj50wUoUrQB
-JcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCapCIlF3Po
-HuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKB
-Xy314powGCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvb
-UJN+5dCOHze4vbrGn2zpfDPyMjwmR/onJALJfh1biEITajV8fTXpLmaRcpPV
-MibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1UdEwEB/wQFMAMBAf8wDgYD
-VR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3QuY29t
-MGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRw
-Oi8vd3d3LnRydXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMt
-aW5kZXguaHRtbDAdBgNVHQ4EFgQUCXIGThhDD+XWzMNqizF7eI+og7gwDQYJ
-KoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V25FYrnJmQ6AgwbN99
-Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t
-Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8
-smk/f3rPanTK+gQqnExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir4
-2NInPRmJX1p7ijvMDNpRrscL9yuwNwXsvFcj4jjSm2jzVhKIT0J8uDHEtdvk
-yCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3oKfN5XozNmr6
-mis=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUF
-ADA/MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAV
-BgNVBAMTDkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkz
-MDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3Qg
-Q28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEB
-BQADggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdA
-wRgUi+DoM3ZJKuM/IUmTrE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJ
-o6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9UL2AZd+3UWODyOKIYepLYYHs
-Umu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRyxXtqqzTW
-MIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX
-69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/w
-Al0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw
-HQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqGSIb3DQEBBQUA
-A4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikugdB/O
-EIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHR
-AosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz
-R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJW
-FBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06Xyx
-V3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUF
-ADBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYD
-VQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1
-cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAw
-WjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYD
-VQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1
-cmVkIElEIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
-AQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWx
-KISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHyUmHfnyDX
-H+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNu
-RMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNs
-IumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcX
-xH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMBAAGjYzBhMA4G
-A1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF66Kv
-9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd
-823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC
-dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthn
-gYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+
-fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i
-8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwz
-Zr8TDRRu838fYxAe+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7m
-ULKn+gpFL6Lw8g==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUF
-ADBhMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYD
-VQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9i
-YWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGEx
-CzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsT
-EHd3dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBS
-b290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLe
-qKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOnTjC3U/dDxGkAV53ijSLdhwZA
-AIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5BmV/Sl0f
-vBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1
-GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3O
-FBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSii
-cNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAOBgNVHQ8BAf8E
-BAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm8KPi
-GxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJ
-KoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr
-hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV
-5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBA
-I+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886
-UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDA
-GySj4dzp30d8tbQkCAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWV
-bd4=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUF
-ADBsMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYD
-VQQLExB3d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdo
-IEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTEx
-MDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IElu
-YzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNl
-cnQgSGlnaCBBc3N1cmFuY2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEB
-BQADggEPADCCAQoCggEBAMbM5XPm+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRn
-ogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMSOO7zSW1x
-kX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9
-vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlK
-V9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5
-OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsgEsxBu24LUTi4
-S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8w
-HQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+
-w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec
-nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehD
-LI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VH
-MWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK
-mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E
-1CAx2/S6cCZdkGCevEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN
-7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UE
-BhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5l
-bnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEf
-MB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50
-cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIw
-MjM0MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQK
-Ew1FbnRydXN0LCBJbmMuMTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BT
-IGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAy
-MDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9vdCBDZXJ0
-aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
-AQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZm
-Lk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypo
-wCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9KlmaI5UXLEWe
-H25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68j6xS
-lkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94Dk
-Zfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB
-sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAE
-JDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSME
-GDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH
-hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0G
-CSqGSIb3DQEBBQUAA4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW
-+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ
-47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p
-8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE
-2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDN
-tGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/
-WrQ8
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMC
-RVMxIjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNV
-BAMTOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9u
-YWwgQ0lGIEE2MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9m
-ZXNpb25hbC5jb20wHhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCB
-nTELMAkGA1UEBhMCRVMxIjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJj
-ZWxvbmExQjBABgNVBAMTOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZp
-cm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYX
-Y2FAZmlybWFwcm9mZXNpb25hbC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IB
-DwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5uCp4Bx+ow0Syd3Tfom5h5VtP8
-c9/Qit5Vj1H5WuretXDE7aTt/6MNbg9kUDGvASdYrv5sp0ovFy3Tc9UTHI9Z
-pTQsHVQERc1ouKDAA6XPhUJHlShbz++AbOCQl4oBPB3zhxAwJkh91/zpnZFx
-/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf3H5idPayBQC6haD9HThu
-y1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcLiam8NeTv
-tjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcbAgMB
-AAGjgZ8wgZwwKgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lv
-bmFsLmNvbTASBgNVHRMBAf8ECDAGAQH/AgEBMCsGA1UdEAQkMCKADzIwMDEx
-MDI0MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1UdDwEB/wQEAwIBBjAd
-BgNVHQ4EFgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQAD
-ggEBAEdz/o0nVPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/Gz
-R0iLjJcG1+p+o1wqu00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvX
-wOaD7FnMP97/T2u3Z36mhoEyIwOdyPdfwUpgpZKpsaSgYMN4h7Mi8yrrW6nt
-Bas3D7Hi05V2Y1Z0jFhyGzflZKG+TQyTmAyX9odtsz/ny4Cm7YjHX1BiAuiZ
-dBbQ5rQ58SfLyEDW44YQqSMSkuBpQWOnryULwMWSyx6Yo1q6xTMPoJcB3X/g
-e9YGVM+h4k0460tQtcsm9MracEpqoeJ5quGnM/b9Sh/22WA=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJV
-UzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3Qg
-R2xvYmFsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMTkwMzA0MDUwMDAwWjBE
-MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UE
-AxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IB
-DwAwggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6Csgncbz
-YEbYwbLVjDHZ3CB5JIG/NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96x
-PqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1kLUCgsBDTOEhGiKEMuzozKmKY
-+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFAVvqgx306
-E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdL
-Fnopsk/bHdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMB
-AAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266
-ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNHK266ZUapEBVYIAUJMA4G
-A1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7srJe
-rJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/Ngd
-RN3ggX+d6YvhZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywN
-A0ZF66D0f0hExghAzN4bcLUprbqLOzRldRtxIR0sFAqwlpW41uryZfspuk/q
-kZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkCx1YAzUm5s2x7UwQa
-4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF
-H4z1Ir+rzoPz4iIprn2DQKi6bA==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUF
-ADBYMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8G
-A1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
-eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYT
-AlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVz
-dCBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG
-9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHW
-AVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9ju
-apYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9nceJSOC7
-KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5
-X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7W
-inXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s
-0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE
-AwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZIhvcN
-AQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CeP
-bJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl
-4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aV
-Il6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJly
-c1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG
-1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJV
-UzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3Qg
-VW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFow
-RTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNV
-BAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQAD
-ggIPADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckU
-HUWCq8YdgNY96xCcOq9tJPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430
-SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw
-8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs7tqqhZJm
-r/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD
-/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBO
-U5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xdVHppCZbW2xHBjXWo
-tM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCXteGYO8A3ZNY9
-lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hBZ3Ki
-KN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9F
-i1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+
-nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1Ud
-EwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8G
-A1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB
-hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIaw
-C/yOsjmPRFWrZIRcaanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv
-9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7
-/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDV
-nVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG
-8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxr
-u18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2Hr
-rDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKWkoRepqO1pD4r2czYG0eq
-8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslKxfMnZmaG
-rGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9
-fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6
-ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJV
-UzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3Qg
-VW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAw
-WjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4G
-A1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEB
-AQUAA4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6Gq
-dHtXr0om/Nj1XqduGdt0DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQw
-Ax5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC
-5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8QJqVJwy7X
-QYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw7
-6L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC
-9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IEr
-KIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73y/Zl92zxlfgC
-OzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAnZqzw
-cEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgf
-ksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4
-Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAP
-BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQ
-KzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E
-BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7
-WJtAJDday6sWSf+zdXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4s
-NcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjg
-AA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo
-4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEn
-cKpqA1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2R
-LrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8
-mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m1wk8OhwRDqZsN/etRIcs
-KMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7dFGdTbHFc
-JoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9
-VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSL
-akhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEg
-MB4GA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkds
-b2JhbFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAw
-WhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3Qg
-Q0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFs
-U2lnbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8o
-mUVCxKs+IVSbC9N/hHD6ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe
-+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1
-AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjNS7SgfQx5
-TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo
-4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99y
-qWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8E
-BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IHV2ccHsBqBt5Z
-tJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9iYWxz
-aWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0
-mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs
-J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4
-h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRD
-LenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7
-9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmg
-QWpzU/qlULRuJQ/7TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq
-/H5COEBkEveegeGTLg==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJV
-UzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQL
-EyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X
-DTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMx
-ITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMo
-R28gRGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAw
-DQYJKoZIhvcNAQEBBQADggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d
-/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9
-S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32qRe3H3I2
-TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVl
-OARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFA
-pMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44
-dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLEsNKR1EwRcbNh
-yz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2oatTj
-oWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdy
-b3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj
-YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEF
-BQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYX
-MP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt
-I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheab
-IZ0KbIIOqPjCDPoQHmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzr
-Tia2cyvk0/ZM/iZx4mERdEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBD
-pqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/bvZ8=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMC
-SFUxETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96
-YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9r
-MTIwMAYDVQQDEylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikgVGFudXNpdHZh
-bnlraWFkbzAeFw05OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQsw
-CQYDVQQGEwJIVTERMA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExv
-Y2sgSGFsb3phdGJpenRvbnNhZ2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZh
-bnlraWFkb2sxMjAwBgNVBAMTKU5ldExvY2sgVXpsZXRpIChDbGFzcyBCKSBU
-YW51c2l0dmFueWtpYWRvMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCx
-6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xKgZjupNTKihe5In+DCnVMm8Bp
-2GQ5o+2So/1bXHQawEfKOml2mrriRBf8TKPV/riXiK+IA4kfpPIEPsgHC+b5
-sy96YhQJRhTKZPWLgLViqNhr1nGTLbO/CVRY7QbrqHvcQ7GhaQIDAQABo4IC
-nzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8EBAMCAAYwEQYJ
-YIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZRUxF
-TSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3Mg
-U3pvbGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBh
-bGFwamFuIGtlc3p1bHQuIEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5l
-dExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGku
-IEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUg
-YXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBl
-bGphcmFzIGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIElu
-dGVybmV0IGhvbmxhcGphbiBhIGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2Rv
-Y3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6ZXNAbmV0bG9jay5u
-ZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQg
-dGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhl
-IE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2Nr
-Lm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNAbmV0bG9jay5uZXQuMA0G
-CSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06sPgzTEdM43WIEJes
-sDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXan3BukxowOR0w
-2y7jfLKRstE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKSNitjrFgB
-azMpUIaD8QFI
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMC
-SFUxETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96
-YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9r
-MTQwMgYDVQQDEytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBDKSBUYW51c2l0
-dmFueWtpYWRvMB4XDTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsx
-CzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0
-TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0
-dmFueWtpYWRvazE0MDIGA1UEAxMrTmV0TG9jayBFeHByZXNzeiAoQ2xhc3Mg
-QykgVGFudXNpdHZhbnlraWFkbzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkC
-gYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNAOoLO/XXgeDIDhlqGlZHtU/qd
-QPzm6N3ZW3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC2VImESLH0iDMgqSaqf64
-gXadarfSNnU+sYYJ9m5tfk63euyucYT2BDMIJTLrdKwWRMbkQJMdf60CAwEA
-AaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQwDgYDVR0PAQH/BAQDAgAG
-MBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEWggJNRklH
-WUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0YWxh
-bm9zIFN6b2xnYWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFz
-b2sgYWxhcGphbiBrZXN6dWx0LiBBIGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQg
-YSBOZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1iaXp0b3NpdGFzYSB2
-ZWRpLiBBIGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0
-ZWxlIGF6IGVsb2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4g
-QXogZWxqYXJhcyBsZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0
-LiBJbnRlcm5ldCBob25sYXBqYW4gYSBodHRwczovL3d3dy5uZXRsb2NrLm5l
-dC9kb2NzIGNpbWVuIHZhZ3kga2VyaGV0byBheiBlbGxlbm9yemVzQG5ldGxv
-Y2submV0IGUtbWFpbCBjaW1lbi4gSU1QT1JUQU5UISBUaGUgaXNzdWFuY2Ug
-YW5kIHRoZSB1c2Ugb2YgdGhpcyBjZXJ0aWZpY2F0ZSBpcyBzdWJqZWN0IHRv
-IHRoZSBOZXRMb2NrIENQUyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cubmV0
-bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwgYXQgY3BzQG5ldGxvY2submV0
-LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmYta3UzbM2xJZIwVzN
-mtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2gpO0u9f38vf5N
-NwgMvOOWgyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4Fp1hBWeA
-yNDYpQcCNJgEjTME1A==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYT
-AkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUG
-A1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYDVQQL
-ExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5
-em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0
-N1oXDTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdI
-dW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBI
-YWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtp
-YWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFzcyBBKSBU
-YW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
-AQEAvHSMD7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbb
-O51qTGL3cfNk1mE7PetzozfZz+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QV
-Or/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC/tmwqcm8WgD/qaiYdPv2
-LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7tqyF
-/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCub
-MvJIH5+hCoR64sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCC
-ApswDgYDVR0PAQH/BAQDAgAGMBIGA1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZI
-AYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZRUxFTSEg
-RXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv
-bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFw
-amFuIGtlc3p1bHQuIEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExv
-Y2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEg
-ZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXog
-ZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGph
-cmFzIGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVy
-bmV0IGhvbmxhcGphbiBhIGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3Mg
-Y2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6ZXNAbmV0bG9jay5uZXQg
-ZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhl
-IHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5l
-dExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5l
-dC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqG
-SIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5ayZrU3/b39/zcT0mwBQO
-xmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjPytoU
-MaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJ
-MSEN1rUQQeJBCWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+u
-xdAu6tYPVuxkf1qbFFgBJ34TUMdrKuZoPL9coAob4Q566eKAw+np9v1sEZ7Q
-5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM8CgHrTwXZoi1/baI
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIG0TCCBbmgAwIBAgIBezANBgkqhkiG9w0BAQUFADCByTELMAkGA1UEBhMC
-SFUxETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96
-YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9r
-MUIwQAYDVQQDEzlOZXRMb2NrIE1pbm9zaXRldHQgS296amVneXpvaSAoQ2xh
-c3MgUUEpIFRhbnVzaXR2YW55a2lhZG8xHjAcBgkqhkiG9w0BCQEWD2luZm9A
-bmV0bG9jay5odTAeFw0wMzAzMzAwMTQ3MTFaFw0yMjEyMTUwMTQ3MTFaMIHJ
-MQswCQYDVQQGEwJIVTERMA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5l
-dExvY2sgSGFsb3phdGJpenRvbnNhZ2kgS2Z0LjEaMBgGA1UECxMRVGFudXNp
-dHZhbnlraWFkb2sxQjBABgNVBAMTOU5ldExvY2sgTWlub3NpdGV0dCBLb3pq
-ZWd5em9pIChDbGFzcyBRQSkgVGFudXNpdHZhbnlraWFkbzEeMBwGCSqGSIb3
-DQEJARYPaW5mb0BuZXRsb2NrLmh1MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
-MIIBCgKCAQEAx1Ilstg91IRVCacbvWy5FPSKAtt2/GoqeKvld/Bu4IwjZ9ul
-ZJm53QE+b+8tmjwi8F3JV6BVQX/yQ15YglMxZc4e8ia6AFQer7C8HORSjKAy
-r7c3sVNnaHRnUPYtLmTeriZ539+Zhqurf4XsoPuAzPS4DB6TRWO53Lhbm+1b
-OdRfYrCnjnxmOCyqsQhjF2d9zL2z8cM/z1A57dEZgxXbhxInlrfa6uWdvLrq
-OU+L73Sa58XQ0uqGURzk/mQIKAR5BevKxXEOC++r6uwSEaEYBTJp0QwsGj0l
-mT+1fMptsK6ZmfoIYOcZwvK9UdPM0wKswREMgM6r3JSda6M5UzrWhQIDAMV9
-o4ICwDCCArwwEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8EBAMCAQYw
-ggJ1BglghkgBhvhCAQ0EggJmFoICYkZJR1lFTEVNISBFemVuIHRhbnVzaXR2
-YW55IGEgTmV0TG9jayBLZnQuIE1pbm9zaXRldHQgU3pvbGdhbHRhdGFzaSBT
-emFiYWx5emF0YWJhbiBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0
-LiBBIG1pbm9zaXRldHQgZWxla3Ryb25pa3VzIGFsYWlyYXMgam9naGF0YXMg
-ZXJ2ZW55ZXN1bGVzZW5laywgdmFsYW1pbnQgZWxmb2dhZGFzYW5hayBmZWx0
-ZXRlbGUgYSBNaW5vc2l0ZXR0IFN6b2xnYWx0YXRhc2kgU3phYmFseXphdGJh
-biwgYXogQWx0YWxhbm9zIFN6ZXJ6b2Rlc2kgRmVsdGV0ZWxla2JlbiBlbG9p
-cnQgZWxsZW5vcnplc2kgZWxqYXJhcyBtZWd0ZXRlbGUuIEEgZG9rdW1lbnR1
-bW9rIG1lZ3RhbGFsaGF0b2sgYSBodHRwczovL3d3dy5uZXRsb2NrLmh1L2Rv
-Y3MvIGNpbWVuIHZhZ3kga2VyaGV0b2sgYXogaW5mb0BuZXRsb2NrLm5ldCBl
-LW1haWwgY2ltZW4uIFdBUk5JTkchIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVz
-ZSBvZiB0aGlzIGNlcnRpZmljYXRlIGFyZSBzdWJqZWN0IHRvIHRoZSBOZXRM
-b2NrIFF1YWxpZmllZCBDUFMgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3Lm5l
-dGxvY2suaHUvZG9jcy8gb3IgYnkgZS1tYWlsIGF0IGluZm9AbmV0bG9jay5u
-ZXQwHQYDVR0OBBYEFAlqYhaSsFq7VQ7LdTI6MuWyIckoMA0GCSqGSIb3DQEB
-BQUAA4IBAQCRalCc23iBmz+LQuM7/KbD7kPgz/PigDVJRXYC4uMvBcXxKufA
-QTPGtpvQMznNwNuhrWw3AkxYQTvyl5LGSKjN5Yo5iWH5Upfpvfb5lHTocQ68
-d4bDBsxafEp+NFAwLvt/MpqNPfMgW/hqyobzMUwsWYACff44yTB1HLdV47yf
-uqhthCgFdbOLDcCRVCHnpgu0mfVRQdzNo0ci2ccBgcTcR08m6h/t280NmPSj
-nLRzMkqWmf68f8glWPhY83ZmiVSkpj7EUFy6iRiCdUgh0k8T6GB+B3bbELVR
-5qq5aKrN9p2QdRLqOBrKROi3macqaJVmlaut74nLYKkGEsaUR+ko
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMC
-Qk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1Zh
-ZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNa
-MEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRsw
-GQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUA
-A4ICDwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4Gt
-Mh6QRr+jhiYaHv5+HBg6XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst
-/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yklvc/ulsrHHo1wtZn/qtmUItt
-KGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbBlDePSHFj
-IuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRc
-AitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJl
-cZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2
-BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIizPtGo/KPaHbDR
-sSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOhD7os
-FRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR
-7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI
-yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8G
-A1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwz
-JQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU
-a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0
-ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcN
-AQEFBQADggIBAD4KFk2fBluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJ
-RqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQty
-U/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgt
-JodmVjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUs
-fU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1
-O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozchLsib9D45MY56QSIPMO6
-61V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1WVaj+ahJ
-efivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1
-B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6y
-hhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOT
-HcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza
+MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMx
+IDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxs
+cyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9v
+dCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDcxMjEzMTcwNzU0WhcNMjIxMjE0
+MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdl
+bGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQD
+DC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkw
+ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+r
+WxxTkqxtnt3CxC5FlAM1iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjU
+Dk/41itMpBb570OYj7OeUt9tkTmPOL13i0Nj67eT/DBMHAGTthP796EfvyXhdDcs
+HqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8bJVhHlfXBIEyg1J55oNj
+z7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiBK0HmOFaf
+SZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/Slwxl
+AgMBAAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqG
+KGh0dHA6Ly9jcmwucGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0P
+AQH/BAQDAgHGMB0GA1UdDgQWBBQmlRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0j
+BIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGBi6SBiDCBhTELMAkGA1UEBhMC
+VVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNX
+ZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg
+Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEB
+ALkVsUSRzCPIK0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd
+/ZDJPHV3V3p9+N701NX3leZ0bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pB
+A4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSljqHyita04pO2t/caaH/+Xc/77szWn
+k4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+esE2fDbbFwRnzVlhE9
+iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJtylv
+2G0xffX8oRAHh84vWdw+WNs=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDczCCAlugAwIBAgIQMDAwMDk3Mzc1NzM4NjAwMDANBgkqhkiG9w0BAQUFADBV
+MQswCQYDVQQGEwJGUjETMBEGA1UEChMKQ2VydGlOb21pczEcMBoGA1UECxMTQUMg
+UmFjaW5lIC0gUm9vdCBDQTETMBEGA1UEAxMKQ2VydGlOb21pczAeFw0wMDExMDkw
+MDAwMDBaFw0xMjExMDkwMDAwMDBaMFUxCzAJBgNVBAYTAkZSMRMwEQYDVQQKEwpD
+ZXJ0aU5vbWlzMRwwGgYDVQQLExNBQyBSYWNpbmUgLSBSb290IENBMRMwEQYDVQQD
+EwpDZXJ0aU5vbWlzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8SWb
+4mS5RXB3ENSIcfrEzCj/TRUQuT1tMCU0YUfXFSgcPdWglIzCv3kvh07QoB+8xMl+
+fQHvSSduAxnNewz0GBY9rApCPKlP6CcnJr74OSVZIiWt9wLfl4wwhNhZOiikIpZp
+EdOXWqRc84P5cUlN3Lwmr1sjCWmHfTSS4cAKxfDbFLfE61etosyoFZUTQbIhb1Bf
+JL5xRXAUZudQiU42n/yAoSUrN4FLUfPQNlOe1AB81pIgX8g2ojwxDjfgqSs1JmBF
+uLKJ45uVLEenQBPmQCGjL3maV86IRmR3a9UGlgvKAk0NBdh8mrQyQvcUlLBIQBCm
+l7wppt6maQHUNEPQSwIDAQABoz8wPTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw
+AwEB/zAdBgNVHQ4EFgQU+F4ho6ijFeb4tRG7/kIEXU2OgnowDQYJKoZIhvcNAQEF
+BQADggEBACe9FJayK6bXkJQrilBFMh75QPdFOks9PJuo86OMUlBDZGYFTCh9Arex
+N3KYCnAEzazYIALwr7eASJJDIQMu1Q+pkx/7ACde4kP47F27M2rm+v5HnGooCLz2
+s7Fe/WUycTQqgwF5lNp03m1ce/TvovgkEZeVN5wM/7+SsZLJGDigXGeq48j2g2hn
+8OckX9Ciyo0U3/1IVeigNBisiaOlsHSZOEPBZQRiZULob+NVbXVPo8nM1OyP3aHI
+LQex1yYcCr9m93nOiZyKkur3Uedf1yMTBe+fflnPFKGYnVqvTGXCKVdHzQBfpILA
+AuaC+5ykZhSiSMf8nmL2oPMcLO7YQw4=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBF
+MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQL
+ExNUcnVzdGlzIEZQUyBSb290IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTEx
+MzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1RydXN0aXMgTGltaXRlZDEc
+MBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD
+ggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQRUN+
+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihH
+iTHcDnlkH5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjj
+vSkCqPoc4Vu5g6hBSLwacY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA
+0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zto3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlB
+OrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEAAaNTMFEwDwYDVR0TAQH/
+BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAdBgNVHQ4E
+FgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01
+GX2cGE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmW
+zaD+vkAMXBJV+JOCyinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP4
+1BIy+Q7DsdwyhEQsb8tGD+pmQQ9P8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZE
+f1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHVl/9D7S3B2l0pKoU/rGXuhg8F
+jZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYliB6XzCGcKQEN
+ZetX2fNXlrtIzYE=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIGUTCCBTmgAwIBAgIEPLVPQDANBgkqhkiG9w0BAQUFADBmMRIwEAYDVQQKEwli
+ZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEzMDEGA1UEAxMq
+YmVUUlVTVGVkIFJvb3QgQ0EgLSBFbnRydXN0IEltcGxlbWVudGF0aW9uMB4XDTAy
+MDQxMTA4MjQyN1oXDTIyMDQxMTA4NTQyN1owZjESMBAGA1UEChMJYmVUUlVTVGVk
+MRswGQYDVQQLExJiZVRSVVNUZWQgUm9vdCBDQXMxMzAxBgNVBAMTKmJlVFJVU1Rl
+ZCBSb290IENBIC0gRW50cnVzdCBJbXBsZW1lbnRhdGlvbjCCASIwDQYJKoZIhvcN
+AQEBBQADggEPADCCAQoCggEBALr0RAOqEmq1Q+xVkrYwfTVXDNvzDSduTPdQqJtO
+K2/b9a0cS12zqcH+e0TrW6MFDR/FNCswACnxeECypP869AGIF37m1CbTukzqMvtD
+d5eHI8XbQ6P1KqNRXuE70mVpflUVm3rnafdE4Fe1FehmYA8NA/uCjqPoEXtsvsdj
+DheT389Lrm5zdeDzqrmkwAkbhepxKYhBMvnwKg5sCfJ0a2ZsUhMfGLzUPvfYbiCe
+yv78IZTuEyhL11xeDGbu6bsPwTSxfwh28z0mcMmLJR1iJAzqHHVOwBLkuhMdMCkt
+VjMFu5dZfsZJT4nXLySotohAtWSSU1Yk5KKghbNekLQSM80CAwEAAaOCAwUwggMB
+MIIBtwYDVR0gBIIBrjCCAaowggGmBg8rBgEEAbE+AAACCSiDkTEwggGRMIIBSQYI
+KwYBBQUHAgIwggE7GoIBN1JlbGlhbmNlIG9uIG9yIHVzZSBvZiB0aGlzIENlcnRp
+ZmljYXRlIGNyZWF0ZXMgYW4gYWNrbm93bGVkZ21lbnQgYW5kIGFjY2VwdGFuY2Ug
+b2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0
+aW9ucyBvZiB1c2UsIHRoZSBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu
+dCBhbmQgdGhlIFJlbHlpbmcgUGFydHkgQWdyZWVtZW50LCB3aGljaCBjYW4gYmUg
+Zm91bmQgYXQgdGhlIGJlVFJVU1RlZCB3ZWIgc2l0ZSwgaHR0cHM6Ly93d3cuYmV0
+cnVzdGVkLmNvbS9wcm9kdWN0c19zZXJ2aWNlcy9pbmRleC5odG1sMEIGCCsGAQUF
+BwIBFjZodHRwczovL3d3dy5iZXRydXN0ZWQuY29tL3Byb2R1Y3RzX3NlcnZpY2Vz
+L2luZGV4Lmh0bWwwEQYJYIZIAYb4QgEBBAQDAgAHMIGJBgNVHR8EgYEwfzB9oHug
+eaR3MHUxEjAQBgNVBAoTCWJlVFJVU1RlZDEbMBkGA1UECxMSYmVUUlVTVGVkIFJv
+b3QgQ0FzMTMwMQYDVQQDEypiZVRSVVNUZWQgUm9vdCBDQSAtIEVudHJ1c3QgSW1w
+bGVtZW50YXRpb24xDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMjAwMjA0MTEw
+ODI0MjdagQ8yMDIyMDQxMTA4NTQyN1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaA
+FH1w5a44iwY/qhwaj/nPJDCqhIQWMB0GA1UdDgQWBBR9cOWuOIsGP6ocGo/5zyQw
+qoSEFjAMBgNVHRMEBTADAQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6NC4wAwIE
+kDANBgkqhkiG9w0BAQUFAAOCAQEAKrgXzh8QlOu4mre5X+za95IkrNySO8cgjfKZ
+5V04ocI07cUTWVwFtStPYZuR+0H8/NU8TZh2BvWBfevdkObRVlTa4y0MnxEylCIB
+evZsLHRnBMylj44ss0O1lKLQfelifwa+JwGDnjr9iu6YQ0pr17WXOzq/T220Y/oz
+ADQuLW2WyXvKmWO6vvT2MKAtmJbpVkQFqUSjYRDrgqFnXbxdJ3Wqiig2KjiS2d2k
+XgClzMx8KSreKJCrt+G2/30lC0DYqjSjLd4H61/OCt3Kfjp9JsFiaDrmLzfzgYYh
+xKlkqu9FNtEaZnz46TfW1mG+oq1I59/mdP7TbX3SJdysYlep9w==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEuzCCA6OgAwIBAgIBAjANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQGEwJVUzET
+MBEGA1UEChMKQXBwbGUgSW5jLjEmMCQGA1UECxMdQXBwbGUgQ2VydGlmaWNhdGlv
+biBBdXRob3JpdHkxFjAUBgNVBAMTDUFwcGxlIFJvb3QgQ0EwHhcNMDYwNDI1MjE0
+MDM2WhcNMzUwMjA5MjE0MDM2WjBiMQswCQYDVQQGEwJVUzETMBEGA1UEChMKQXBw
+bGUgSW5jLjEmMCQGA1UECxMdQXBwbGUgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx
+FjAUBgNVBAMTDUFwcGxlIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
+ggEKAoIBAQDkkakJH5HbHkdQ6wXtXnmELes2oldMVeyLGYne+Uts9QerIjAC6Bg+
++FAJ039BqJj50cpmnCRrEdCju+QbKsMflZ56DKRHi1vUFjczy8QPTc4UadHJGXL1
+XQ7Vf1+b8iUDulWPTV0N8WQ1IxVLFVkds5T39pyez1C6wVhQZ48ItCD3y6wsIG9w
+tj8BMIy3Q88PnT3zK0koGsj+zrW5DtleHNbLPbU6rfQPDgCSC7EhFi501TwN22IW
+q6NxkkdTVcGvL0Gz+PvjcM3mo0xFfh9Ma1CWQYnEdGILEINBhzOKgbEwWOxaBDKM
+aLOPHd5lc/9nXmW8Sdh2nzMUZaF3lMktAgMBAAGjggF6MIIBdjAOBgNVHQ8BAf8E
+BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUK9BpR5R2Cf70a40uQKb3
+R01/CF4wHwYDVR0jBBgwFoAUK9BpR5R2Cf70a40uQKb3R01/CF4wggERBgNVHSAE
+ggEIMIIBBDCCAQAGCSqGSIb3Y2QFATCB8jAqBggrBgEFBQcCARYeaHR0cHM6Ly93
+d3cuYXBwbGUuY29tL2FwcGxlY2EvMIHDBggrBgEFBQcCAjCBthqBs1JlbGlhbmNl
+IG9uIHRoaXMgY2VydGlmaWNhdGUgYnkgYW55IHBhcnR5IGFzc3VtZXMgYWNjZXB0
+YW5jZSBvZiB0aGUgdGhlbiBhcHBsaWNhYmxlIHN0YW5kYXJkIHRlcm1zIGFuZCBj
+b25kaXRpb25zIG9mIHVzZSwgY2VydGlmaWNhdGUgcG9saWN5IGFuZCBjZXJ0aWZp
+Y2F0aW9uIHByYWN0aWNlIHN0YXRlbWVudHMuMA0GCSqGSIb3DQEBBQUAA4IBAQBc
+NplMLXi37Yyb3PN3m/J20ncwT8EfhYOFG5k9RzfyqZtAjizUsZAS2L70c5vu0mQP
+y3lPNNiiPvl4/2vIB+x9OYOLUyDTOMSxv5pPCmv/K/xZpwUJfBdAVhEedNO3iyM7
+R6PVbyTi69G3cN8PReEnyvFteO3ntRcXqNx+IjXKJdXZD9Zr1KIkIxH3oayPc4Fg
+xhtbCS+SsvhESPBgOJ4V9T0mZyCKM2r3DYLP3uujL/lTaltkwGMzd/c6ByxW69oP
+IQ7aunMZT7XZNn/Bh1XZp5m5MkL72NVxnn6hUrcbvZNCJBIqxw8dtk2cXmPIS4AX
+UKqK1drk/NAJBzewdXUh
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEZjCCA06gAwIBAgIQRL4Mi1AAJLQR0zYt4LNfGzANBgkqhkiG9w0BAQUFADCB
+lTELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug
+Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho
+dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHTAbBgNVBAMTFFVUTi1VU0VSRmlyc3Qt
+T2JqZWN0MB4XDTk5MDcwOTE4MzEyMFoXDTE5MDcwOTE4NDAzNlowgZUxCzAJBgNV
+BAYTAlVTMQswCQYDVQQIEwJVVDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkxHjAc
+BgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0d29yazEhMB8GA1UECxMYaHR0cDovL3d3
+dy51c2VydHJ1c3QuY29tMR0wGwYDVQQDExRVVE4tVVNFUkZpcnN0LU9iamVjdDCC
+ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6qgT+jo2F4qjEAVZURnicP
+HxzfOpuCaDDASmEd8S8O+r5596Uj71VRloTN2+O5bj4x2AogZ8f02b+U60cEPgLO
+KqJdhwQJ9jCdGIqXsqoc/EHSoTbL+z2RuufZcDX65OeQw5ujm9M89RKZd7G3CeBo
+5hy485RjiGpq/gt2yb70IuRnuasaXnfBhQfdDWy/7gbHd2pBnqcP1/vulBe3/IW+
+pKvEHDHd17bR5PDv3xaPslKT16HUiaEHLr/hARJCHhrh2JU022R5KP+6LhHC5ehb
+kkj7RwvCbNqtMoNB86XlQXD9ZZBt+vpRxPm9lisZBCzTbafc8H9vg2XiaquHhnUC
+AwEAAaOBrzCBrDALBgNVHQ8EBAMCAcYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E
+FgQU2u1kdBScFDyr3ZmpvVsoTYs8ydgwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDov
+L2NybC51c2VydHJ1c3QuY29tL1VUTi1VU0VSRmlyc3QtT2JqZWN0LmNybDApBgNV
+HSUEIjAgBggrBgEFBQcDAwYIKwYBBQUHAwgGCisGAQQBgjcKAwQwDQYJKoZIhvcN
+AQEFBQADggEBAAgfUrE3RHjb/c652pWWmKpVZIC1WkDdIaXFwfNfLEzIR1pp6ujw
+NTX00CXzyKakh0q9G7FzCL3Uw8q2NbtZhncxzaeAFK4T7/yxSPlrJSUtUbYsbUXB
+mMiKVl0+7kNOPmsnjtA6S4ULX9Ptaqd1y9Fahy85dRNacrACgZ++8A+EVCBibGnU
+4U3GDZlDAQ0Slox4nb9QorFEqmrPF3rPbw/U+CRVX/A0FklmPlBGyWNxODFiuGK5
+81OtbLUrohKqGU8J2l7nk8aOFAj+8DCAGKCGhU3IfdeLA/5u1fedFqySLKAj5ZyR
+Uh+U3xeUc8OzwcFxBSAAeL0TUh2oPs0AH8g=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARQxCzAJBgNVBAYTAkVT
+MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE
+ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE
+ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0GA1UECxMm
+SVBTIENBIENMQVNFQTMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMT
+JklQUyBDQSBDTEFTRUEzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZI
+hvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwHhcNMDExMjI5MDEwNzUwWhcNMjUxMjI3
+MDEwNzUwWjCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ
+BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp
+bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G
+LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTMgQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUEzIENlcnRpZmlj
+YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMw
+gZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAO6AAPYaZC6tasiDsYun7o/ZttvN
+G7uGBiJ2MwwSbUhWYdLcgiViL5/SaTBlA0IjWLxH3GvWdV0XPOH/8lhneaDBgbHU
+VqLyjRGZ/fZ98cfEXgIqmuJKtROKAP2Md4bm15T1IHUuDky/dMQ/gT6DtKM4Ninn
+6Cr1jIhBqoCm42zvAgMBAAGjggRTMIIETzAdBgNVHQ4EFgQUHp9XUEe2YZM50yz8
+2l09BXW3mQIwggFGBgNVHSMEggE9MIIBOYAUHp9XUEe2YZM50yz82l09BXW3mQKh
+ggEcpIIBGDCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ
+BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp
+bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G
+LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTMgQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUEzIENlcnRpZmlj
+YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOC
+AQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUF
+BwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYB
+BAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglg
+hkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1Ud
+EgQTMBGBD2lwc0BtYWlsLmlwcy5lczBCBglghkgBhvhCAQ0ENRYzQ0xBU0VBMyBD
+QSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkgaHR0cDovL3d3dy5pcHMuZXMvMCkGCWCG
+SAGG+EIBAgQcFhpodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyLzA7BglghkgBhvhC
+AQQELhYsaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0VBMy5j
+cmwwQAYJYIZIAYb4QgEDBDMWMWh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmV2
+b2NhdGlvbkNMQVNFQTMuaHRtbD8wPQYJYIZIAYb4QgEHBDAWLmh0dHA6Ly93d3cu
+aXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFQTMuaHRtbD8wOwYJYIZIAYb4QgEI
+BC4WLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcG9saWN5Q0xBU0VBMy5odG1s
+MHUGA1UdHwRuMGwwMqAwoC6GLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvaXBz
+MjAwMkNMQVNFQTMuY3JsMDagNKAyhjBodHRwOi8vd3d3YmFjay5pcHMuZXMvaXBz
+MjAwMi9pcHMyMDAyQ0xBU0VBMy5jcmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUF
+BzABhhNodHRwOi8vb2NzcC5pcHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAEo9IEca
+2on0eisxeewBwMwB9dbB/MjD81ACUZBYKp/nNQlbMAqBACVHr9QPDp5gJqiVp4MI
+3y2s6Q73nMify5NF8bpqxmdRSmlPa/59Cy9SKcJQrSRE7SOzSMtEQMEDlQwKeAYS
+AfWRMS1Jjbs/RU4s4OjNtckUFQzjB4ObJnXv
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x
+GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv
+b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV
+BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W
+YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa
+GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg
+Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J
+WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB
+rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp
++ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1
+ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i
+Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz
+PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og
+/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH
+oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI
+yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud
+EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2
+A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL
+MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT
+ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f
+BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn
+g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl
+fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K
+WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha
+B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc
+hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR
+TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD
+mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z
+ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y
+4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza
8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
-MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMC
-Qk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1Zh
-ZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRa
-MEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRsw
-GQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUA
-A4ICDwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTP
-krgEQK0CSzGrvI2RaNggDhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9
-cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOijKTVopAFPD6QuN+8bv+OPEKhy
-q1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79KDDRMpsMh
-vVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRl
-lDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+
-pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJ
-k8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjcT5EOE7zelaTf
-i5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEXMJPp
-Govgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6ts
-gLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A
-4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEw
-DwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMw
-gcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj
-YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJv
-b3QgQ0EgMyBDZXJ0aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFBy
-YWN0aWNlIFN0YXRlbWVudC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVv
-dmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLA
-E+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1
-XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMg
-TGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkq
-hkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM07ucp2sNbtrCD2dDQ4iH7
-82CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+shvzuXYO8
-BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM
-3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hR
-OJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54C
-rnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x
-DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPs
-MZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmi
-oHfRMJ6szHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRe
-cCocIdiP4b0jWy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEo
-kt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+
-ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUF
-ADBIMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9y
-YXRpb24xFzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzEx
-OFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1Nl
-Y3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBD
-QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7C
-T8rU4niVWJxB4Q2ZQCQXOZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/je
-p4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9tDWccV9cGrcrI9f4Or2YlSASW
-C12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uHGFaAJsTQ
-3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobv
-omuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcW
-NFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIE
-Bh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E
-FgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYjaHR0
-cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUB
-BAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3
-6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s
-7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cp
-rp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ
-nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZG
-BlSm8jIKYyYwa5vR3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShL
-HZ4swrhovO0C7jE=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUF
-ADBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9y
-YXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0
-MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMX
-U2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9i
-YWwgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxV
-aQZx5RNoJLNP2MwhR/jxYDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7H
-fAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQbqR8JNGuQsiWUGMu4P51/pin
-X0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g8NEXLJXr
-9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz
-+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvU
-d+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGC
-NxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYD
-VR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAnoCWG
-I2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQB
-gjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L
-URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X
-+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895
-P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5
-3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNsp
-nWzFacxHVaIw98xcf8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJP
-Ix/abKwfROHdI3hRW8cW
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJV
-UzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG
-A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
-dHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQG
-EwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEy
-MDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRo
-b3JpdHkwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGm
-BIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1
-KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZJRRU6ybH
-838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4Q
-yDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmC
-uDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W
-93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0GA1UdDgQWBBS/
-X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0fhvRb
-Vazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJm
-aWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD
-bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMB
-Af8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1ep
-oXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM
-PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L
-7ShZ3U0WixeDyLJlxy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMt
-lb71cZBDzI0fmgAKhynpVSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl9
-0TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/
-D5fs4C8fF5Q=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJ
-TDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERp
-Z2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20g
-Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM2WhcNMzYw
-OTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20g
-THRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2ln
-bmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3Jp
-dHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDBiNsJvGxGfHif
-lXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1yo4UcodM9
-tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1
-YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srh
-JosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d
-5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNiHzvEvqBTViVs
-UQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z6+hs
-TXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2Oq
-qGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+
-Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3v
-wmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOz
-EmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT
-37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMC
-Aa4wHQYDVR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFsw
-LKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3Js
-MCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3Js
-MIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYB
-BQUHAgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUG
-CCsGAQUFBwIBFilodHRwOi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRp
-YXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYgU3RhcnQgQ29tbWVyY2lhbCAo
-U3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5LCByZWFk
-IHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0
-Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUg
-YXQgaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZI
-AYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNT
-TCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOCAgEA
-FmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArex
-mvclmAk8jhvh3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPle
-WKYK34wGmkUWFjgKXlf2Ysd6AgXmvB618p70qSmD+LIU424oh0TDkBreOKk8
-rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHkfY+BUZo7jYn0TZNm
-ezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3
-fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZ
-tWgo+2EuvoSoOMCZEoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0
-yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+PwqyvqCUqDvr0tVk+vBtfAii6w0TiYi
-BKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl1njFmUNj403g
-dy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/
-7HW/lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/Fl
-UQqmMGqz9IgcgA38corog14=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFFjCCBH+gAwIBAgIBADANBgkqhkiG9w0BAQQFADCBsDELMAkGA1UEBhMC
-SUwxDzANBgNVBAgTBklzcmFlbDEOMAwGA1UEBxMFRWlsYXQxFjAUBgNVBAoT
-DVN0YXJ0Q29tIEx0ZC4xGjAYBgNVBAsTEUNBIEF1dGhvcml0eSBEZXAuMSkw
-JwYDVQQDEyBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEhMB8G
-CSqGSIb3DQEJARYSYWRtaW5Ac3RhcnRjb20ub3JnMB4XDTA1MDMxNzE3Mzc0
-OFoXDTM1MDMxMDE3Mzc0OFowgbAxCzAJBgNVBAYTAklMMQ8wDQYDVQQIEwZJ
-c3JhZWwxDjAMBgNVBAcTBUVpbGF0MRYwFAYDVQQKEw1TdGFydENvbSBMdGQu
-MRowGAYDVQQLExFDQSBBdXRob3JpdHkgRGVwLjEpMCcGA1UEAxMgRnJlZSBT
-U0wgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEmFk
-bWluQHN0YXJ0Y29tLm9yZzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA
-7YRgACOeyEpRKSfeOqE5tWmrCbIvNP1h3D3TsM+x18LEwrHkllbEvqoUDufM
-OlDIOmKdw6OsWXuO7lUaHEe+o5c5s7XvIywI6Nivcy+5yYPo7QAPyHWlLzRM
-GOh2iCNJitu27Wjaw7ViKUylS7eYtAkUEKD4/mJ2IhULpNYILzUCAwEAAaOC
-AjwwggI4MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgHmMB0GA1UdDgQW
-BBQcicOWzL3+MtUNjIExtpidjShkjTCB3QYDVR0jBIHVMIHSgBQcicOWzL3+
-MtUNjIExtpidjShkjaGBtqSBszCBsDELMAkGA1UEBhMCSUwxDzANBgNVBAgT
-BklzcmFlbDEOMAwGA1UEBxMFRWlsYXQxFjAUBgNVBAoTDVN0YXJ0Q29tIEx0
-ZC4xGjAYBgNVBAsTEUNBIEF1dGhvcml0eSBEZXAuMSkwJwYDVQQDEyBGcmVl
-IFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJARYS
-YWRtaW5Ac3RhcnRjb20ub3JnggEAMB0GA1UdEQQWMBSBEmFkbWluQHN0YXJ0
-Y29tLm9yZzAdBgNVHRIEFjAUgRJhZG1pbkBzdGFydGNvbS5vcmcwEQYJYIZI
-AYb4QgEBBAQDAgAHMC8GCWCGSAGG+EIBDQQiFiBGcmVlIFNTTCBDZXJ0aWZp
-Y2F0aW9uIEF1dGhvcml0eTAyBglghkgBhvhCAQQEJRYjaHR0cDovL2NlcnQu
-c3RhcnRjb20ub3JnL2NhLWNybC5jcmwwKAYJYIZIAYb4QgECBBsWGWh0dHA6
-Ly9jZXJ0LnN0YXJ0Y29tLm9yZy8wOQYJYIZIAYb4QgEIBCwWKmh0dHA6Ly9j
-ZXJ0LnN0YXJ0Y29tLm9yZy9pbmRleC5waHA/YXBwPTExMTANBgkqhkiG9w0B
-AQQFAAOBgQBscSXhnjSRIe/bbL0BCFaPiNhBOlP1ct8nV0t2hPdopP7rPwl+
-KLhX6h/BquL/lp9JmeaylXOWxkjHXo0Hclb4g4+fd68p00UOpO6wNnQt8M2Y
-I3s3S9r+UZjEHjQ8iP2ZO1CnwYszx8JSFhKVU2Ui77qLzmLbcCOxgN8aIDjn
-fg==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJ
-BgNVBAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3
-aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1
-MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFH
-MR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG
-9w0BAQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJC
-Eyq8ZVeCQD5XJM1QiyUqt2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9
-lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5CjCA12UNNhPqE21Is8w4ndwtr
-vxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpgvd21mWRT
-uKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbL
-tK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpK
-xVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdV
-xVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02yMszYF9rNt85m
-ndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkOpeUD
-DniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59
-je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM
-gI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOB
-rDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E
-FgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64
-OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEF
-BQcCARYgaHR0cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZI
-hvcNAQEFBQADggIBACe645R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhW
-fvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g
-7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8
-AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS
-2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5
-JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a77KwPJ+HbBIrZXAVUjEa
-JM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJkvC24JdVU
-orgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7X
-dVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG
-2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEB
-nunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt
-Qc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ
+MIIDPDCCAqWgAwIBAgIQEj3w59oqIkekOIngiu7JZzANBgkqhkiG9w0BAQUFADCB
+0TELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJ
+Q2FwZSBUb3duMRowGAYDVQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMf
+Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEkMCIGA1UEAxMbVGhhd3Rl
+IFBlcnNvbmFsIEZyZWVtYWlsIENBMSswKQYJKoZIhvcNAQkBFhxwZXJzb25hbC1m
+cmVlbWFpbEB0aGF3dGUuY29tMB4XDTk2MDEwMTAwMDAwMFoXDTIxMDEwMTIzNTk1
+OVowgdExCzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNV
+BAcTCUNhcGUgVG93bjEaMBgGA1UEChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNV
+BAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24xJDAiBgNVBAMTG1Ro
+YXd0ZSBQZXJzb25hbCBGcmVlbWFpbCBDQTErMCkGCSqGSIb3DQEJARYccGVyc29u
+YWwtZnJlZW1haWxAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkC
+gYEA1GnX1LCUZFtx6UfYDFG26nKRsIRefS0Nj3sS34UldSh0OkIsYyeflXtL734Z
+hx2G6qPduc6WZBrCFG5ErHzmj+hND3EfQDimAKOHePb5lIZererAXnbr2RSjXW56
+fAylS1V/Bhkpf56aJtVquzgkCGqYx7Hao5iR/Xnb5VrEHLkCAwEAAaMTMBEwDwYD
+VR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQAemGDU5fJUYLA9GoFkR/db
+o9lvwykLp9KpgUn2w22FFChFRAH0cVyVLhQPGivRqWvBX2c9FvFyIK++FsoOMF/J
+y6WTLMNnVB5yIoojdmyUHVFSbJ3E4EcC18y/8IB7GG4l3GJh1qb+wR1/2bP9jVxF
+EFrGZWSa6yz1A0/WSGL7Lg==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE
+BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz
+dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL
+MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp
+cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
+AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y
+YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua
+kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL
+QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp
+6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG
+yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i
+QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ
+KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO
+tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu
+QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ
+Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u
+olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48
+x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx
+FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD
+VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv
+biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm
+MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx
+MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT
+DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3
+dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl
+cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3
+DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD
+gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91
+yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX
+L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj
+EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG
+7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e
+QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ
+qdq5snUb9kLy78fyGPmJvKP/iiMucEc=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
-MIIFwTCCA6mgAwIBAgIITrIAZwwDXU8wDQYJKoZIhvcNAQEFBQAwSTELMAkG
-A1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEjMCEGA1UEAxMaU3dp
-c3NTaWduIFBsYXRpbnVtIENBIC0gRzIwHhcNMDYxMDI1MDgzNjAwWhcNMzYx
-MDI1MDgzNjAwWjBJMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWdu
-IEFHMSMwIQYDVQQDExpTd2lzc1NpZ24gUGxhdGludW0gQ0EgLSBHMjCCAiIw
-DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMrfogLi2vj8Bxax3mCq3pZc
-ZB/HL37PZ/pEQtZ2Y5Wu669yIIpFR4ZieIbWIDkm9K6j/SPnpZy1IiEZtzeT
-IsBQnIJ71NUERFzLtMKfkr4k2HtnIuJpX+UFeNSH2XFwMyVTtIc7KZAoNppV
-RDBopIOXfw0enHb/FZ1glwCNioUD7IC+6ixuEFGSzH7VozPY1kneWCqv9hbr
-S3uQMpe5up1Y8fhXSQQeol0GcN1x2/ndi5objM89o03Oy3z2u5yg+gnOI2Ky
-6Q0f4nIoj5+saCB9bzuohTEJfwvH6GXp43gOCWcwizSC+13gzJ2BbWLuCB4E
-LE6b7P6pT1/9aXjvCR+htL/68++QHkwFix7qepF6w9fl+zC8bBsQWJj3Gl/Q
-KTIDE0ZNYWqFTFJ0LwYfexHihJfGmfNtf9dng34TaNhxKFrYzt3oEBSa/m0j
-h26OWnA81Y0JAKeqvLAxN23IhBQeW71FYyBrS3SMvds6DsHPWhaPpZjydomy
-ExI7C3d3rLvlPClKknLKYRorXkzig3R3+jVIeoVNjZpTxN94ypeRSCtFKwH3
-HBqi7Ri6Cr2D+m+8jVeTO9TUps4e8aCxzqv9KyiaTxvXw3LbpMS/XUz13XuW
-ae5ogObnmLo2t/5u7Su9IPhlGdpVCX4l3P5hYnL5fhgC72O00Puv5TtjjGeP
-AgMBAAGjgawwgakwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w
-HQYDVR0OBBYEFFCvzAeHFUdvOMW0ZdHelarp35zMMB8GA1UdIwQYMBaAFFCv
-zAeHFUdvOMW0ZdHelarp35zMMEYGA1UdIAQ/MD0wOwYJYIV0AVkBAQEBMC4w
-LAYIKwYBBQUHAgEWIGh0dHA6Ly9yZXBvc2l0b3J5LnN3aXNzc2lnbi5jb20v
-MA0GCSqGSIb3DQEBBQUAA4ICAQAIhab1Fgz8RBrBY+D5VUYI/HAcQiiWjrfF
-wUF1TglxeeVtlspLpYhg0DB0uMoI3LQwnkAHFmtllXcBrqS3NQuB2nEVqXQX
-OHtYyvkv+8Bldo1bAbl93oI9ZLi+FHSjClTTLJUYFzX1UWs/j6KWYTl4a0vl
-pqD4U99REJNi54Av4tHgvI42Rncz7Lj7jposiU0xEQ8mngS7twSNC/K5/Fqd
-Oxa3L8iYq/6KUFkuozv8KV2LwUvJ4ooTHbG/u0IdUt1O2BReEMYxB+9xJ/cb
-OQncguqLs5WGXv312l0xpuAxtpTmREl0xRbl9x8DYSjFyMsSoEJL+WuICI20
-MhjzdZ/EfwBPBZWcoxcCw7NTm6ogOSkrZvqdr16zktK1puEa+S1BaYEUtLS1
-7Yk9zvupnTVCRLEcFHOBzyoBNZox1S2PbYTfgE1X4z/FhHXaicYwu+uPyyII
-oK6q8QNsOktNCaUOcsZWayFCTiMlFGiudgp8DAdwZPmaL/YFOSbGDI8Zf0Ne
-bvRbFS/bYV3mZy8/CJT5YLSYMdp08YSTcU1f+2BY0fvEwW2JorsgH51xkcsy
-mxM9Pn2SUjWskpSi0xjCfMfqr3YFFt1nJ8J+HAciIfNAChs0B0QTwoRqjt8Z
+MIIEUDCCA7mgAwIBAgIJAN4ppNGwj6yIMA0GCSqGSIb3DQEBBAUAMIHMMQswCQYD
+VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZyYW5j
+aXNjbzEZMBcGA1UEChMQTGluZGVuIExhYiwgSW5jLjEpMCcGA1UECxMgTGluZGVu
+IExhYiBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxKTAnBgNVBAMTIExpbmRlbiBMYWIg
+Q2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYJKoZIhvcNAQkBFhBjYUBsaW5kZW5s
+YWIuY29tMB4XDTA1MDQyMTAyNDAzMVoXDTI1MDQxNjAyNDAzMVowgcwxCzAJBgNV
+BAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNp
+c2NvMRkwFwYDVQQKExBMaW5kZW4gTGFiLCBJbmMuMSkwJwYDVQQLEyBMaW5kZW4g
+TGFiIENlcnRpZmljYXRlIEF1dGhvcml0eTEpMCcGA1UEAxMgTGluZGVuIExhYiBD
+ZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgkqhkiG9w0BCQEWEGNhQGxpbmRlbmxh
+Yi5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAKXh1MThucdTbMg9bYBO
+rAm8yWns32YojB0PRfbq8rUjepEhTm3/13s0u399Uc202v4ejcGhkIDWJZd2NZMF
+oKrhmRfxGHSKPCuFaXC3jh0lRECj7k8FoPkcmaPjSyodrDFDUUuv+C06oYJoI+rk
+8REyal9NwgHvqCzOrZtiTXAdAgMBAAGjggE2MIIBMjAdBgNVHQ4EFgQUO1zK2e1f
+1wO1fHAjq6DTJobKDrcwggEBBgNVHSMEgfkwgfaAFDtcytntX9cDtXxwI6ug0yaG
+yg63oYHSpIHPMIHMMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEW
+MBQGA1UEBxMNU2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQTGluZGVuIExhYiwgSW5j
+LjEpMCcGA1UECxMgTGluZGVuIExhYiBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxKTAn
+BgNVBAMTIExpbmRlbiBMYWIgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYJKoZI
+hvcNAQkBFhBjYUBsaW5kZW5sYWIuY29tggkA3imk0bCPrIgwDAYDVR0TBAUwAwEB
+/zANBgkqhkiG9w0BAQQFAAOBgQA/ZkgfvwHYqk1UIAKZS3kMCxz0HvYuEQtviwnu
+xA39CIJ65Zozs28Eg1aV9/Y+Of7TnWhW+U3J3/wD/GghaAGiKK6vMn9gJBIdBX/9
+e6ef37VGyiOEFFjnUIbuk0RWty0orN76q/lI/xjCi15XSA/VSq2j4vmnwfZcPTDu
+glmQ1A==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv
+b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl
+cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi
+MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c
+JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP
+mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+
+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4
+VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/
+AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB
+AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW
+BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun
+pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC
+dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf
+fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm
+NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx
+H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe
++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEuDCCA6CgAwIBAgIBBDANBgkqhkiG9w0BAQUFADCBtDELMAkGA1UEBhMCQlIx
+EzARBgNVBAoTCklDUC1CcmFzaWwxPTA7BgNVBAsTNEluc3RpdHV0byBOYWNpb25h
+bCBkZSBUZWNub2xvZ2lhIGRhIEluZm9ybWFjYW8gLSBJVEkxETAPBgNVBAcTCEJy
+YXNpbGlhMQswCQYDVQQIEwJERjExMC8GA1UEAxMoQXV0b3JpZGFkZSBDZXJ0aWZp
+Y2Fkb3JhIFJhaXogQnJhc2lsZWlyYTAeFw0wMTExMzAxMjU4MDBaFw0xMTExMzAy
+MzU5MDBaMIG0MQswCQYDVQQGEwJCUjETMBEGA1UEChMKSUNQLUJyYXNpbDE9MDsG
+A1UECxM0SW5zdGl0dXRvIE5hY2lvbmFsIGRlIFRlY25vbG9naWEgZGEgSW5mb3Jt
+YWNhbyAtIElUSTERMA8GA1UEBxMIQnJhc2lsaWExCzAJBgNVBAgTAkRGMTEwLwYD
+VQQDEyhBdXRvcmlkYWRlIENlcnRpZmljYWRvcmEgUmFpeiBCcmFzaWxlaXJhMIIB
+IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwPMudwX/hvm+Uh2b/lQAcHVA
+isamaLkWdkwP9/S/tOKIgRrL6Oy+ZIGlOUdd6uYtk9Ma/3pUpgcfNAj0vYm5gsyj
+Qo9emsc+x6m4VWwk9iqMZSCK5EQkAq/Ut4n7KuLE1+gdftwdIgxfUsPt4CyNrY50
+QV57KM2UT8x5rrmzEjr7TICGpSUAl2gVqe6xaii+bmYR1QrmWaBSAG59LrkrjrYt
+bRhFboUDe1DK+6T8s5L6k8c8okpbHpa9veMztDVC9sPJ60MWXh6anVKo1UcLcbUR
+yEeNvZneVRKAAU6ouwdjDvwlsaKydFKwed0ToQ47bmUKgcm+wV3eTRk36UOnTwID
+AQABo4HSMIHPME4GA1UdIARHMEUwQwYFYEwBAQAwOjA4BggrBgEFBQcCARYsaHR0
+cDovL2FjcmFpei5pY3BicmFzaWwuZ292LmJyL0RQQ2FjcmFpei5wZGYwPQYDVR0f
+BDYwNDAyoDCgLoYsaHR0cDovL2FjcmFpei5pY3BicmFzaWwuZ292LmJyL0xDUmFj
+cmFpei5jcmwwHQYDVR0OBBYEFIr68VeEERM1kEL6V0lUaQ2kxPA3MA8GA1UdEwEB
+/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAZA5c1
+U/hgIh6OcgLAfiJgFWpvmDZWqlV30/bHFpj8iBobJSm5uDpt7TirYh1Uxe3fQaGl
+YjJe+9zd+izPRbBqXPVQA34EXcwk4qpWuf1hHriWfdrx8AcqSqr6CuQFwSr75Fos
+SzlwDADa70mT7wZjAmQhnZx2xJ6wfWlT9VQfS//JYeIc7Fue2JNLd00UOSMMaiK/
+t79enKNHEA2fupH3vEigf5Eh4bVAN5VohrTm6MY53x7XQZZr1ME7a55lFEnSeT0u
+mlOAjR2mAbvSM5X5oSZNrmetdzyTj2flCM8CC7MLab0kkdngRIlUBGHF1/S5nmPb
+K+9A46sd33oqK8n8
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJKUDEO
+MAwGA1UEChMFTEdQS0kxGjAYBgNVBAsTEUFwcGxpY2F0aW9uIENBIEcyMB4XDTA2
+MDMzMTE1MDAwMFoXDTE2MDMzMTE0NTk1OVowOTELMAkGA1UEBhMCSlAxDjAMBgNV
+BAoTBUxHUEtJMRowGAYDVQQLExFBcHBsaWNhdGlvbiBDQSBHMjCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBALk1xhD422jbB8RATLAdHjbcw0H2z1UVbQh/
+XMZoVeXnV/GWUebhTXgPbkAVcDtl/hHf59PWWDU74Z8C/JRSRi6znmCbAp7JgtL2
+464JT4REtmKbAFFouDqt7GTRMkvplESDtA7OIYlrsDbAmMZLnMI+W2AqCTErLatM
+3rGg/VhWwoMdILzEhAmHe6iVl8YljoPgPpMN0cd9c6mo/BkAQC4iuHozQfV4/Vpx
+54LZSIhc7KiFhy1tgIlnGmm+EMBaju2IfT5vLDhrN85H2KIxMN5+U2Vsi4ZTQSBs
+vUilfq8AWlYSWIHR3IlZ+bXu+E2a2EQpi3mn9yKq6nxctBaIIA0CAwEAAaOBsjCB
+rzAdBgNVHQ4EFgQUf7hdjsQYa8Z9zC7prs405xdd4KEwDgYDVR0PAQH/BAQDAgEG
+MEwGA1UdHwRFMEMwQaA/oD2kOzA5MQswCQYDVQQGEwJKUDEOMAwGA1UEChMFTEdQ
+S0kxGjAYBgNVBAsTEUFwcGxpY2F0aW9uIENBIEcyMA8GA1UdEwEB/wQFMAMBAf8w
+HwYDVR0jBBgwFoAUf7hdjsQYa8Z9zC7prs405xdd4KEwDQYJKoZIhvcNAQEFBQAD
+ggEBADzYczZABkhKVBn1J0g5JaVuQue2zRvLOTS3m+xPKr535MqE/B3rmyJA1fT7
+aIdy/Eddag5SSuO1XUjGIpbmM21tq/bN18skWoyoRZ4+YYJ9lNUF8Bo1X3EvLlS1
+QQXvhg1S75yYG/EsTDrR84bTjD56L4ZFjoMyJlu/U8oOUVbcmsJaMBkNp57Vqpsg
+OWl4IfSXbdEOEUwu0xtasPmXeFwqj1Jl7kxCJcI3MA5tKzWUgwbor0U7BGanMLv5
+4CE7Y259RF06alPvERck/VSyWmxzViHJbC2XpEKzJ2EFIWNt6ii8TxpvQtyYq1XT
+HhvAkj+bweY7F1bixJhDJe62ywA=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsx
+CzAJBgNVBAYTAkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRp
+ZmljYWNpw7NuIERpZ2l0YWwgLSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwa
+QUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4wHhcNMDYxMTI3MjA0NjI5WhcNMzAw
+NDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+U29jaWVkYWQgQ2Ft
+ZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJhIFMu
+QS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkq
+hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeG
+qentLhM0R7LQcNzJPNCNyu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzL
+fDe3fezTf3MZsGqy2IiKLUV0qPezuMDU2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQ
+Y5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU34ojC2I+GdV75LaeHM/J4
+Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP2yYe68yQ
+54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+b
+MMCm8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48j
+ilSH5L887uvDdUhfHjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++Ej
+YfDIJss2yKHzMI+ko6Kh3VOz3vCaMh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/zt
+A/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK5lw1omdMEWux+IBkAC1vImHF
+rEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1bczwmPS9KvqfJ
+pxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE
+AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCB
+lTCBkgYEVR0gADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFy
+YS5jb20vZHBjLzBaBggrBgEFBQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW50
+7WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2UgcHVlZGVuIGVuY29udHJhciBlbiBs
+YSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEfAygPU3zmpFmps4p6
+xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuXEpBc
+unvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/
+Jre7Ir5v/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dp
+ezy4ydV/NgIlqmjCMRW3MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42
+gzmRkBDI8ck1fj+404HGIGQatlDCIaR43NAvO2STdPCWkPHv+wlaNECW8DYSwaN0
+jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wkeZBWN7PGKX6jD/EpOe9+
+XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f/RWmnkJD
+W2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/
+RL5hRqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35r
+MDOhYil/SrnhLecUIw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxk
+BYn8eNZcLCZDqQ==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0
+IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz
+BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y
+aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG
+9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIyMjM0OFoXDTE5MDYy
+NTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y
+azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
+YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw
+Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl
+cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9Y
+LqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+
+TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8Y
+TfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0
+LBwGlN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLW
+I8sogTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw
+nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDKTCCApKgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBzzELMAkGA1UEBhMCWkEx
+FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD
+VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT
+ZXJ2aWNlcyBEaXZpc2lvbjEjMCEGA1UEAxMaVGhhd3RlIFBlcnNvbmFsIFByZW1p
+dW0gQ0ExKjAoBgkqhkiG9w0BCQEWG3BlcnNvbmFsLXByZW1pdW1AdGhhd3RlLmNv
+bTAeFw05NjAxMDEwMDAwMDBaFw0yMDEyMzEyMzU5NTlaMIHPMQswCQYDVQQGEwJa
+QTEVMBMGA1UECBMMV2VzdGVybiBDYXBlMRIwEAYDVQQHEwlDYXBlIFRvd24xGjAY
+BgNVBAoTEVRoYXd0ZSBDb25zdWx0aW5nMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9u
+IFNlcnZpY2VzIERpdmlzaW9uMSMwIQYDVQQDExpUaGF3dGUgUGVyc29uYWwgUHJl
+bWl1bSBDQTEqMCgGCSqGSIb3DQEJARYbcGVyc29uYWwtcHJlbWl1bUB0aGF3dGUu
+Y29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJZtn4B0TPuYwu8KHvE0Vs
+Bd/eJxZRNkERbGw77f4QfRKe5ZtCmv5gMcNmt3M6SK5O0DI3lIi1DbbZ8/JE2dWI
+Et12TfIa/G8jHnrx2JhFTgcQ7xZC0EN1bUre4qrJMf8fAHB8Zs8QJQi6+u4A6UYD
+ZicRFTuqW/KY3TZCstqIdQIDAQABoxMwETAPBgNVHRMBAf8EBTADAQH/MA0GCSqG
+SIb3DQEBBAUAA4GBAGk2ifc0KjNyL2071CKyuG+axTZmDhs8obF1Wub9NdP4qPIH
+b4Vnjt4rueIXsDqg8A6iAJrf8xQVbrvIhVqYgPn/vnQdPfP+MCXRNzRn+qVxeTBh
+KXLA4CxM+1bkOqhv5TJZUtt1KFBZDPgLGeSs2a+WjS9Q2wfD6h+rM+D1KzGJ
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb
+MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow
+GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj
+YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL
+MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE
+BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM
+GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua
+BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe
+3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4
+YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR
+rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm
+ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU
+oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
+MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v
+QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t
+b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF
+AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q
+GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz
+Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2
+G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi
+l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3
+smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIICPDCCAaUCED9pHoGc8JpK83P/uUii5N0wDQYJKoZIhvcNAQEFBQAwXzELMAkG
+A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz
+cyAxIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2
+MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV
+BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAxIFB1YmxpYyBQcmlt
+YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN
+ADCBiQKBgQDlGb9to1ZhLZlIcfZn3rmN67eehoAKkQ76OCWvRoiC5XOooJskXQ0f
+zGVuDLDQVoQYh5oGmxChc9+0WDlrbsH2FdWoqD+qEgaNMax/sDTXjzRniAnNFBHi
+TkVWaR94AoDa3EeRKbs2yWNcxeDXLYd7obcysHswuiovMaruo2fa2wIDAQABMA0G
+CSqGSIb3DQEBBQUAA4GBAFgVKTk8d6PaXCUDfGD67gmZPCcQcMgMCeazh88K4hiW
+NWLMv5sneYlfycQJ9M61Hd8qveXbhpxoJeUwfLaJFf5n0a3hUKw8fGJLj7qE1xIV
+Gx/KXQ/BUpQqEZnae88MNhPVNdwQGVnqlMEAv3WP2fr9dgTbYruQagPZRjXZ+Hxb
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJD
+TjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2
+MDcwOTE0WhcNMjcwNDE2MDcwOTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMF
+Q05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwggEiMA0GCSqGSIb3DQEBAQUAA4IB
+DwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzDo+/hn7E7SIX1mlwh
+IhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tizVHa6
+dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZO
+V/kbZKKTVrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrC
+GHn2emU1z5DrvTOTn1OrczvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gN
+v7Sg2Ca+I19zN38m5pIEo3/PIKe38zrKy5nLAgMBAAGjczBxMBEGCWCGSAGG+EIB
+AQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscCwQ7vptU7ETAPBgNVHRMB
+Af8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991SlgrHAsEO
+76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnK
+OOK5Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvH
+ugDnuL8BV8F3RTIMO/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7Hgvi
+yJA/qIYM/PmLXoXLT1tLYhFHxUV8BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fL
+buXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2G8kS1sHNzYDzAgE8yGnLRUhj
+2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5mmxE=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE
+BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz
+dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL
+MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp
+cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
+AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP
+Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr
+ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL
+MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1
+yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr
+VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/
+nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ
+KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG
+XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj
+vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt
+Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g
+N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC
+nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT
+MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i
+YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG
+EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg
+R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9
+9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq
+fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv
+iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU
+1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+
+bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW
+MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA
+ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l
+uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn
+Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS
+tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF
+PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un
+hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV
+5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEc
+MBoGA1UEChMTSmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRp
+b25DQTAeFw0wNzEyMTIxNTAwMDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYT
+AkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zlcm5tZW50MRYwFAYDVQQLEw1BcHBs
+aWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAp23gdE6H
+j6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4fl+K
+f5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55
+IrmTwcrNwVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cw
+FO5cjFW6WY2H/CPek9AEjP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDiht
+QWEjdnjDuGWk81quzMKq2edY3rZ+nYVunyoKb58DKTCXKB28t89UKU5RMfkntigm
+/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRUWssmP3HMlEYNllPqa0jQ
+k/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNVBAYTAkpQ
+MRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOC
+seODvOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD
+ggEBADlqRHZ3ODrso2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJ
+hyzjVOGjprIIC8CFqMjSnHH2HZ9g/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+
+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYDio+nEhEMy/0/ecGc/WLuo89U
+DNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmWdupwX3kSa+Sj
+B1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL
+rosot4LKGAfmt1t06SAZf7IbiVQ=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEW
+MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFs
+IENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQG
+EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3Qg
+R2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDvPE1A
+PRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/NTL8
+Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hL
+TytCOb1kLUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL
+5mkWRxHCJ1kDs6ZgwiFAVvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7
+S4wMcoKK+xfNAGw6EzywhIdLFnopsk/bHdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe
+2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
+FHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNHK266ZUap
+EBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6td
+EPx7srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv
+/NgdRN3ggX+d6YvhZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywN
+A0ZF66D0f0hExghAzN4bcLUprbqLOzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0
+abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkCx1YAzUm5s2x7UwQa4qjJqhIF
+I8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqFH4z1Ir+rzoPz
+4iIprn2DQKi6bA==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIE9zCCA9+gAwIBAgIEPL/xoTANBgkqhkiG9w0BAQUFADB2MQswCQYDVQQGEwJQ
+TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu
+dHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MSAwHgYDVQQDExdDQyBTaWduZXQgLSBQ
+Q0EgS2xhc2EgMjAeFw0wMjA0MTkxMDI5NTNaFw0xNzA0MTgxMjUzMDdaMHUxCzAJ
+BgNVBAYTAlBMMR8wHQYDVQQKExZUUCBJbnRlcm5ldCBTcC4geiBvLm8uMSQwIgYD
+VQQLExtDZW50cnVtIENlcnR5ZmlrYWNqaSBTaWduZXQxHzAdBgNVBAMTFkNDIFNp
+Z25ldCAtIENBIEtsYXNhIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
+AQCqgLJuQqY4yavbSgHg8CyfKTx4BokNSDOVz4eD9vptUr11Kqd06ED1hlH7Sg0g
+oBFAfntNU/QTKwSBaNuime7C4sSEdgsKrPoAhGb4Mq8y7Ty7RqZz7mkzNMqzL2L2
+U4yQ2QjvpH8MH0IBqOWEcpSkpwnrCDImRoTfd+YlZWKi2JceQixUUYIQ45Ox8+x8
+hHbvvZdgqtcvo8PW27qoHkp/7hMuJ44kDAGrmxffBXl/OBRZp0uO1CSLcMcVJzyr
+2phKhy406MYdWrtNPEluGs0GFDzd0nrIctiWAO4cmct4S72S9Q6e//0GO9f3/Ca5
+Kb2I1xYLj/xE+HgjHX9aD2MhAgMBAAGjggGMMIIBiDAPBgNVHRMBAf8EBTADAQH/
+MA4GA1UdDwEB/wQEAwIBBjCB4wYDVR0gBIHbMIHYMIHVBg0rBgEEAb4/AhQKAQEA
+MIHDMHUGCCsGAQUFBwICMGkaZ0NlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmll
+IHogZG9rdW1lbnRlbTogIlBvbGl0eWthIENlcnR5ZmlrYWNqaSBQQ0EyIC0gQ2Vy
+dHlmaWthdHkgVXJ6ZWRvdyBLbGFzeSAyIi4wSgYIKwYBBQUHAgEWPmh0dHA6Ly93
+d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9kb2t1bWVudHkva2xhc2EyL3BjX3Bj
+YTIudHh0MD8GA1UdHwQ4MDYwNKAyoDCGLmh0dHA6Ly93d3cuc2lnbmV0LnBsL3Jl
+cG96eXRvcml1bS9jcmwvcGNhMi5jcmwwHwYDVR0jBBgwFoAUwGxGyl2CfpYHRonE
+82AVXO08kMIwHQYDVR0OBBYEFLtFBlILy4HNKVSzvHxBTM0HDowlMA0GCSqGSIb3
+DQEBBQUAA4IBAQBWTsCbqXrXhBBev5v5cIuc6gJM8ww7oR0uMQRZoFSqvQUPWBYM
+2/TLI/f8UM9hSShUVj3zEsSj/vFHagUVmzuVXo5u0WK8iaqATSyEVBhADHrPG6wY
+cLKJlagge/ILA0m+SieyP2sjYD9MUB9KZIEyBKv0429UuDTw6P7pslxMWJBSNyQx
+aLIs0SRKsqZZWkc7ZYAj2apSkBMX2Is1oHA+PwkF6jQMwCao/+CndXPUzfCF6caa
+9WwW31W26MlXCvSmJgfiTPwGvm4PkPmOnmWZ3CczzhHl4q7ztHFzshJH3sZWDnrW
+wBFjzz5ePr3WHV1wA7EY6oT4zBx+2gT9XBTB
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIC+TCCAmKgAwIBAgIENvEbGTANBgkqhkiG9w0BAQUFADA2MQswCQYDVQQGEwJF
+UzENMAsGA1UEChMERk5NVDEYMBYGA1UECxMPRk5NVCBDbGFzZSAyIENBMB4XDTk5
+MDMxODE0NTYxOVoXDTE5MDMxODE1MjYxOVowNjELMAkGA1UEBhMCRVMxDTALBgNV
+BAoTBEZOTVQxGDAWBgNVBAsTD0ZOTVQgQ2xhc2UgMiBDQTCBnTANBgkqhkiG9w0B
+AQEFAAOBiwAwgYcCgYEAmD+tGTaTPT7+dkIU/TVv8fqtInpY40bQXcZa+WItjzFe
+/rQw/lB0rNadHeBixkndFBJ9cQusBsE/1waH4JCJ1uXjA7LyJ7GfM8iqazZKo8Q/
+eUGdiUYvKz5j1DhWkaodsQ1CdU3zh07jD03MtGy/YhOH6tCbjrbi/xn0lAnVlmEC
+AQOjggEUMIIBEDARBglghkgBhvhCAQEEBAMCAAcwWAYDVR0fBFEwTzBNoEugSaRH
+MEUxCzAJBgNVBAYTAkVTMQ0wCwYDVQQKEwRGTk1UMRgwFgYDVQQLEw9GTk1UIENs
+YXNlIDIgQ0ExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5OTAzMTgxNDU2
+MTlagQ8yMDE5MDMxODE0NTYxOVowCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFECa
+dkSXdAfErBTLHo1POkV8MNdhMB0GA1UdDgQWBBRAmnZEl3QHxKwUyx6NTzpFfDDX
+YTAMBgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqG
+SIb3DQEBBQUAA4GBAGFMoHxZY1tm+O5lE85DgEe5sjXJyITHa3NgReSdN531jiW5
++aqqyuP4Q5wvoIkFsUUylCoeA41dpt7PV5Xa3yZgX8vflR64zgjY+IrJT6lodZPj
+LwVMZGACokIeb4ZoZVUO2ENv8pExPqNHPCgFr0W2nSJMJntLfVsV+RlG3whd
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO
+TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh
+dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oX
+DTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl
+ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv
+b3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ5291
+qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8Sp
+uOUfiUtnvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPU
+Z5uW6M7XxgpT0GtJlvOjCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvE
+pMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiile7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp
+5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCROME4HYYEhLoaJXhena/M
+UGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpICT0ugpTN
+GmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy
+5V6548r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv
+6q012iDTiIJh8BIitrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEK
+eN5KzlW/HdXZt1bv8Hb/C3m1r737qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6
+B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMBAAGjgZcwgZQwDwYDVR0TAQH/
+BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcCARYxaHR0cDov
+L3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV
+HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqG
+SIb3DQEBCwUAA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLyS
+CZa59sCrI2AGeYwRTlHSeYAz+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen
+5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwjf/ST7ZwaUb7dRUG/kSS0H4zpX897
+IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaNkqbG9AclVMwWVxJK
+gnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfkCpYL
++63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxL
+vJxxcypFURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkm
+bEgeqmiSBeGCc1qb3AdbCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvk
+N1trSt8sV4pAWja63XVECDdCcAz+3F4hoKOKwJCcaNpQ5kUQR3i2TtJlycM33+FC
+Y7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoVIPVVYpbtbZNQvOSqeK3Z
+ywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm66+KAQ==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDcDCCAligAwIBAgIBBTANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQGEwJVUzEY
+MBYGA1UEChMPVS5TLiBHb3Zlcm5tZW50MQwwCgYDVQQLEwNEb0QxDDAKBgNVBAsT
+A1BLSTEWMBQGA1UEAxMNRG9EIFJvb3QgQ0EgMjAeFw0wNDEyMTMxNTAwMTBaFw0y
+OTEyMDUxNTAwMTBaMFsxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9VLlMuIEdvdmVy
+bm1lbnQxDDAKBgNVBAsTA0RvRDEMMAoGA1UECxMDUEtJMRYwFAYDVQQDEw1Eb0Qg
+Um9vdCBDQSAyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwCzB9o07
+rP8/PNZxvrh0IgfscEEV/KtA4weqwcPYn/7aTDq/P8jYKHtLNgHArEUlw9IOCo+F
+GGQQPRoTcCpvjtfcjZOzQQ84Ic2tq8I9KgXTVxE3Dc2MUfmT48xGSSGOFLTNyxQ+
+OM1yMe6rEvJl6jQuVl3/7mN1y226kTT8nvP0LRy+UMRC31mI/2qz+qhsPctWcXEF
+lrufgOWARVlnQbDrw61gpIB1BhecDvRD4JkOG/t/9bPMsoGCsf0ywbi+QaRktWA6
+WlEwjM7eQSwZR1xJEGS5dKmHQa99brrBuKG/ZTE6BGf5tbuOkooAY7ix5ow4X4P/
+UNU7ol1rshDMYwIDAQABoz8wPTAdBgNVHQ4EFgQUSXS7DF66ev4CVO97oMaVxgmA
+cJYwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD
+ggEBAJiRjT+JyLv1wGlzKTs1rLqzCHY9cAmS6YREIQF9FHYb7lFsHY0VNy17MWn0
+mkS4r0bMNPojywMnGdKDIXUr5+AbmSbchECV6KjSzPZYXGbvP0qXEIIdugqi3VsG
+K52nZE7rLgE1pLQ/E61V5NVzqGmbEfGY8jEeb0DU+HifjpGgb3AEkGaqBivO4XqS
+tX3h4NGW56E6LcyxnR8FRO2HmdNNGnA5wQQM5X7Z8a/XIA7xInolpHOZzD+kByeW
+qKKV7YK5FtOeC4fCwfKI9WLfaN/HvGlR7bFc3FRUKQ8JOZqsA8HbDE2ubwp6Fknx
+v5HSOJTT9pUst2zJQraNypCNhdk=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDczCCAlugAwIBAgIBBDANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJLUjEN
+MAsGA1UECgwES0lTQTEuMCwGA1UECwwlS29yZWEgQ2VydGlmaWNhdGlvbiBBdXRo
+b3JpdHkgQ2VudHJhbDEWMBQGA1UEAwwNS0lTQSBSb290Q0EgMTAeFw0wNTA4MjQw
+ODA1NDZaFw0yNTA4MjQwODA1NDZaMGQxCzAJBgNVBAYTAktSMQ0wCwYDVQQKDARL
+SVNBMS4wLAYDVQQLDCVLb3JlYSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBDZW50
+cmFsMRYwFAYDVQQDDA1LSVNBIFJvb3RDQSAxMIIBIDANBgkqhkiG9w0BAQEFAAOC
+AQ0AMIIBCAKCAQEAvATk+hM58DSWIGtsaLv623f/J/es7C/n/fB/bW+MKs0lCVsk
+9KFo/CjsySXirO3eyDOE9bClCTqnsUdIxcxPjHmc+QZXfd3uOPbPFLKc6tPAXXdi
+8EcNuRpAU1xkcK8IWsD3z3X5bI1kKB4g/rcbGdNaZoNy4rCbvdMlFQ0yb2Q3lIVG
+yHK+d9VuHygvx2nt54OJM1jT3qC/QOhDUO7cTWu8peqmyGGO9cNkrwYV3CmLP3WM
+vHFE2/yttRcdbYmDz8Yzvb9Fov4Kn6MRXw+5H5wawkbMnChmn3AmPC7fqoD+jMUE
+CSVPzZNHPDfqAmeS/vwiJFys0izgXAEzisEZ2wIBA6MyMDAwHQYDVR0OBBYEFL+2
+J9gDWnZlTGEBQVYx5Yt7OtnMMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEF
+BQADggEBABOvUQveimpb5poKyLGQSk6hAp3MiNKrZr097LuxQpVqslxa/6FjZJap
+aBV/JV6K+KRzwYCKhQoOUugy50X4TmWAkZl0Q+VFnUkq8JSV3enhMNITbslOsXfl
+BM+tWh6UCVrXPAgcrnrpFDLBRa3SJkhyrKhB2vAhhzle3/xk/2F0KpzZm4tfwjeT
+2KM3LzuTa7IbB6d/CVDv0zq+IWuKkDsnSlFOa56ch534eJAx7REnxqhZvvwYC/uO
+fi5C4e3nCSG9uRPFVmf0JqZCQ5BEVLRxm3bkGhKsGigA35vB1fjbXKP4krG9tNT5
+UNkAAk/bg9ART6RCVmE6fhMy04Qfybo=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx
+EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT
+HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs
+ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5
+MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD
+VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy
+ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy
+dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p
+OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2
+8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K
+Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe
+hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk
+6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw
+DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q
+AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI
+bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB
+ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z
+qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd
+iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn
+0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN
+sSi6
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ
+RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD
+VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX
+DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y
+ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy
+VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr
+mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr
+IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK
+mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu
+XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy
+dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye
+jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1
+BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3
+DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92
+9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx
+jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0
+Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz
+ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS
+R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCB
+ijELMAkGA1UEBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHly
+aWdodCAoYykgMjAwNTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl
+ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQTAeFw0w
+NTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYDVQQGEwJDSDEQMA4G
+A1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIwIAYD
+VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBX
+SVNlS2V5IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEAy0+zAJs9Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxR
+VVuuk+g3/ytr6dTqvirdqFEr12bDYVxgAsj1znJ7O7jyTmUIms2kahnBAbtzptf2
+w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbDd50kc3vkDIzh2TbhmYsF
+mQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ/yxViJGg
+4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t9
+4B3RLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYw
+DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQw
+EAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOx
+SPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vImMMkQyh2I+3QZH4VFvbBsUfk2
+ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4+vg1YFkCExh8
+vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa
+hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZi
+Fj4A4xylNoEYokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ
+/L7fCg0=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEzzCCA7egAwIBAgIEO6ocGTANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQ
+TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu
+dHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBS
+b290Q0EwHhcNMDEwOTIwMTY0MjE5WhcNMjYwOTIxMTU0MjE5WjBxMQswCQYDVQQG
+EwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMb
+Q2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQg
+LSBSb290Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrr2vydnNp
+ELfGW3KsARiDhJvwDtUe4AbWev+OfMc3+vA29nX8ZmIwno3gmItjo5DbUCCRiCMq
+5c9epcGu+kg4a3BJChVXREl8gVh0ST15rr3RKrSc4VgsvQzl0ZUraeQLl8JoRT5P
+LsUj3qwF78jUCQVckiiLVcnGfZtFCm+DCJXliQBDMB9XFAUEiO/DtEBs0B7wJGx7
+lgJeJpQUcGiaOPjcJDYOk7rNAYmmD2gWeSlepufO8luUYG/YDxTC4mqhRqfa4MnV
+O5dqy+ICj2UvUpHbZDB0KfGRibgBYeQP1kuqgIzJN4UqknVAJb0aMBSPl+9k2fAU
+dchx1njlbdcbAgMBAAGjggFtMIIBaTAPBgNVHRMBAf8EBTADAQH/MIIBBAYDVR0g
+BIH8MIH5MIH2Bg0rBgEEAb4/AgEKAQEAMIHkMIGaBggrBgEFBQcCAjCBjRqBikNl
+cnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0
+eWthIENlcnR5ZmlrYWNqaSBkbGEgUm9vdENBIi4gQ2VydHlmaWthdCB3eXN0YXdp
+b255IHByemV6IFJvb3RDQSB3IGhpZXJhcmNoaWkgQ0MgU2lnbmV0LjBFBggrBgEF
+BQcCARY5aHR0cDovL3d3dy5zaWduZXQucGwvcmVwb3p5dG9yaXVtL2Rva3VtZW50
+eS9wY19yb290Y2EudHh0MB0GA1UdDgQWBBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAf
+BgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAOBgNVHQ8BAf8EBAMCAQYw
+DQYJKoZIhvcNAQEFBQADggEBAGnY5QmYqnnO9OqFOWZxxb25UHRnaRF6IV9aaGit
+5BZufZj2Tq3v8L3SgE34GOoIcdRMMG5JEpEU4mN/Ef3oY6Eo+7HfqaPHI4KFmbDS
+PiK5s+wmf+bQSm0Yq5/h4ZOdcAESlLQeLSt1CQk2JoKQJ6pyAf6xJBgWEIlm4RXE
+4J3324PUiOp83kW6MDvaa1xY976WyInr4rwoLgxVl11LZeKWha0RJJxJgw/NyWpK
+G7LWCm1fglF8JH51vZNndGYq1iKtfnrIOvLZq6bzaCiZm1EurD8HE6P7pmABKK6o
+3C2OXlNfNIgwkDN/cDqk5TYsTkrpfriJPdxXBH8hQOkW89g=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDAjCCAmsCEDKIjprS9esTR/h/xCA3JfgwDQYJKoZIhvcNAQEFBQAwgcExCzAJ
+BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh
+c3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy
+MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp
+emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X
+DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw
+FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgNCBQdWJsaWMg
+UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo
+YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5
+MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB
+AQUAA4GNADCBiQKBgQC68OTP+cSuhVS5B1f5j8V/aBH4xBewRNzjMHPVKmIquNDM
+HO0oW369atyzkSTKQWI8/AIBvxwWMZQFl3Zuoq29YRdsTjCG8FE3KlDHqGKB3FtK
+qsGgtG7rL+VXxbErQHDbWk2hjh+9Ax/YA9SPTJlxvOKCzFjomDqG04Y48wApHwID
+AQABMA0GCSqGSIb3DQEBBQUAA4GBAIWMEsGnuVAVess+rLhDityq3RS6iYF+ATwj
+cSGIL4LcY/oCRaxFWdcqWERbt5+BO5JoPeI3JPV7bI92NZYJqFmduc4jq3TWg/0y
+cyfYaT5DdPauxYma51N86Xv2S/PBZYPejYqcPIiNOVn8qj8ijaHBZlCBckztImRP
+T8qAkbYp
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkG
+A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz
+cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2
+MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV
+BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt
+YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN
+ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE
+BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is
+I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G
+CSqGSIb3DQEBBQUAA4GBABByUqkFFBkyCEHwxWsKzH4PIRnN5GfcX6kb5sroc50i
+2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWXbj9T/UWZYB2oK0z5XqcJ
+2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/D/xwzoiQ
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIH/zCCB2igAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARQxCzAJBgNVBAYTAkVT
+MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE
+ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE
+ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0GA1UECxMm
+SVBTIENBIENMQVNFQTEgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMT
+JklQUyBDQSBDTEFTRUExIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZI
+hvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwHhcNMDExMjMxMTEyMTQxWhcNMjUxMjI5
+MTEyMTQxWjCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ
+BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp
+bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G
+LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTEgQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUExIENlcnRpZmlj
+YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMw
+gZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM8g89BgSKoCxBXZ5C+NnlURLSnM
+UWZoAGXaFFWf6q7f69uN1nXaUfTEzPstvTUfE7fpZmF8lEDz+2AvjBg086hVnra0
+b0APA0VnanJyW2ZIlkKFGMCB4WJqh7JB7i45jITVXthPV2vsjlKM97Pnnhimz8Fb
+r+RZcsz69vRptMqxAgMBAAGjggRbMIIEVzAdBgNVHQ4EFgQUL8zsbGe+T/iqPIiN
+EvvHnUxb9F4wggFGBgNVHSMEggE9MIIBOYAUL8zsbGe+T/iqPIiNEvvHnUxb9F6h
+ggEcpIIBGDCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ
+BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp
+bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G
+LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTEgQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUExIENlcnRpZmlj
+YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOC
+AQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUF
+BwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYB
+BAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglg
+hkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1Ud
+EgQTMBGBD2lwc0BtYWlsLmlwcy5lczBDBglghkgBhvhCAQ0ENhY0Q0xBU0VBMSBD
+QSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkgaHR0cHM6Ly93d3cuaXBzLmVzLzAqBglg
+hkgBhvhCAQIEHRYbaHR0cHM6Ly93d3cuaXBzLmVzL2lwczIwMDIvMDwGCWCGSAGG
++EIBBAQvFi1odHRwczovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0VB
+MS5jcmwwQQYJYIZIAYb4QgEDBDQWMmh0dHBzOi8vd3d3Lmlwcy5lcy9pcHMyMDAy
+L3Jldm9jYXRpb25DTEFTRUExLmh0bWw/MD4GCWCGSAGG+EIBBwQxFi9odHRwczov
+L3d3dy5pcHMuZXMvaXBzMjAwMi9yZW5ld2FsQ0xBU0VBMS5odG1sPzA8BglghkgB
+hvhCAQgELxYtaHR0cHM6Ly93d3cuaXBzLmVzL2lwczIwMDIvcG9saWN5Q0xBU0VB
+MS5odG1sMHcGA1UdHwRwMG4wM6AxoC+GLWh0dHBzOi8vd3d3Lmlwcy5lcy9pcHMy
+MDAyL2lwczIwMDJDTEFTRUExLmNybDA3oDWgM4YxaHR0cHM6Ly93d3diYWNrLmlw
+cy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRUExLmNybDAvBggrBgEFBQcBAQQjMCEw
+HwYIKwYBBQUHMAGGE2h0dHA6Ly9vY3NwLmlwcy5lcy8wDQYJKoZIhvcNAQEFBQAD
+gYEAGY2khC4v4mlenqRcy8Mn8mcWca88t4CY9LCJMqlIt7i559BNkMMB66tXsNp9
+N2QhnTordKOjkdgZJmCb7DUdMJEQQT0Y5W7JA6WvHatAFu8feRJ4ImaTjI0Xz3Dd
+Jbz6O++igCw0l4EY5gayn2BFpAm+7ZpEcdpR/OCOH80lNDo=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJE
+SzEVMBMGA1UEChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQg
+Um9vdCBDQTAeFw0wMTA0MDUxNjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNV
+BAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJuZXQxHTAbBgNVBAsTFFREQyBJbnRl
+cm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxLhA
+vJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20jxsNu
+Zp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a
+0vnRrEvLznWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc1
+4izbSysseLlJ28TQx5yc5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGN
+eGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcD
+R0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZIAYb4QgEBBAQDAgAHMGUG
+A1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMMVERDIElu
+dGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxME
+Q1JMMTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3
+WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAw
+HQYDVR0OBBYEFGxkAcf9hW2syNqeUAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJ
+KoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4IBAQBO
+Q8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540mgwV5dOy0uaOX
+wTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+
+2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm89
+9qNLPg7kbWzbO0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0
+jUNAE4z9mQNUecYu6oah9jrUCbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38
+aQNiuJkFBT1reBK9sG9l
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQsw
+CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl
+cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu
+LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT
+aWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
+dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD
+VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT
+aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ
+bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu
+IENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
+LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK3LpRFpxlmr8Y+1
+GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaStBO3IFsJ
++mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0Gbd
+U6LM8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLm
+NxdLMEYH5IBtptiWLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XY
+ufTsgsbSPZUd5cBPhMnZo0QoBmrXRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/
+ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAj/ola09b5KROJ1WrIhVZPMq1
+CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXttmhwwjIDLk5Mq
+g6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm
+fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c
+2NU8Qh0XwRJdRTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/
+bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEU
+MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3
+b3JrMSMwIQYDVQQDExpBZGRUcnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1
+MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcxCzAJBgNVBAYTAlNFMRQwEgYDVQQK
+EwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIzAh
+BgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG9w0B
+AQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwq
+xBb/4Oxx64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G
+87B4pfYOQnrjfxvM0PC3KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i
+2O+tCBGaKZnhqkRFmhJePp1tUvznoD1oL/BLcHwTOK28FSXx1s6rosAx1i+f4P8U
+WfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GRwVY18BTcZTYJbqukB8c1
+0cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HUMIHRMB0G
+A1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0T
+AQH/BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6Fr
+pGkwZzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQL
+ExRBZGRUcnVzdCBUVFAgTmV0d29yazEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlm
+aWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBABmrder4i2VhlRO6aQTv
+hsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxGGuoYQ992zPlm
+hpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X
+dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3
+P6CxB9bpT9zeRXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9Y
+iQBCYz95OdBEsIJuQRno3eDBiFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5no
+xqE=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc
+MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT
+ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw
+MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj
+dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l
+c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC
+UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc
+58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/
+o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH
+MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr
+aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA
+A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA
+Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv
+8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL
+MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp
+IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi
+BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw
+MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh
+d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig
+YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v
+dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/
+BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6
+papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E
+BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K
+DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3
+KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox
+XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFUjCCBDqgAwIBAgIBAjANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJLUjEN
+MAsGA1UEChMES0lTQTEuMCwGA1UECxMlS29yZWEgQ2VydGlmaWNhdGlvbiBBdXRo
+b3JpdHkgQ2VudHJhbDEWMBQGA1UEAxMNS0lTQSBSb290Q0EgMzAeFw0wNDExMTkw
+NjM5NTFaFw0xNDExMTkwNjM5NTFaMGQxCzAJBgNVBAYTAktSMQ0wCwYDVQQKEwRL
+SVNBMS4wLAYDVQQLEyVLb3JlYSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBDZW50
+cmFsMRYwFAYDVQQDEw1LSVNBIFJvb3RDQSAzMIIBIDANBgkqhkiG9w0BAQEFAAOC
+AQ0AMIIBCAKCAQEA3rrtF2Wu0b1KPazbgHLMWOHn4ZPazDB6z+8Lri2nQ6u/p0LP
+CFYIpEcdffqG79gwlyY0YTyADvjU65/8IjAboW0+40zSVU4WQDfC9gdu2we1pYyW
+geKbXH6UYcjOhDyx+gDmctMJhXfp3F4hT7TkTvTiF6tQrxz/oTlYdVsSspa5jfBw
+YkhbVigqpYeRNrkeJPW5unu2UlFbF1pgBWycwubGjD756t08jP+J3kNwrB248XXN
+OMpTDUdoasY8GMq94bS+DvTQ49IT+rBRERHUQavo9DmO4TSETwuTqmo4/OXGeEeu
+dhf6oYA3BgAVCP1rI476cg2V1ktisWjC3TSbXQIBA6OCAg8wggILMB8GA1UdIwQY
+MBaAFI+B8NqmzXQ8vmb0FWtGpP4GKMyqMB0GA1UdDgQWBBSPgfDaps10PL5m9BVr
+RqT+BijMqjAOBgNVHQ8BAf8EBAMCAQYwggEuBgNVHSAEggElMIIBITCCAR0GBFUd
+IAAwggETMDAGCCsGAQUFBwIBFiRodHRwOi8vd3d3LnJvb3RjYS5vci5rci9yY2Ev
+Y3BzLmh0bWwwgd4GCCsGAQUFBwICMIHRHoHOx3QAIMd4yZ3BHLKUACCs9cd4x3jJ
+ncEcx4WyyLLkACgAVABoAGkAcwAgAGMAZQByAHQAaQBmAGkAYwBhAHQAZQAgAGkA
+cwAgAGEAYwBjAHIAZQBkAGkAdABlAGQAIAB1AG4AZABlAHIAIABFAGwAZQBjAHQA
+cgBvAG4AaQBjACAAUwBpAGcAbgBhAHQAdQByAGUAIABBAGMAdAAgAG8AZgAgAHQA
+aABlACAAUgBlAHAAdQBiAGwAaQBjACAAbwBmACAASwBvAHIAZQBhACkwMwYDVR0R
+BCwwKqQoMCYxJDAiBgNVBAMMG+2VnOq1reygleuztOuztO2YuOynhO2dpeybkDAz
+BgNVHRIELDAqpCgwJjEkMCIGA1UEAwwb7ZWc6rWt7KCV67O067O07Zi47KeE7Z2l
+7JuQMA8GA1UdEwEB/wQFMAMBAf8wDAYDVR0kBAUwA4ABADANBgkqhkiG9w0BAQUF
+AAOCAQEAz9b3Dv2wjG4FFY6oXCuyWtEeV6ZeGKqCEQj8mbdbp+PI0qLT+SQ09+Pk
+rolUR9NpScmAwRHr4inH9gaLX7riXs+rw87P7pIl3J85Hg4D9N6QW6FwmVzHc07J
+pHVJeyWhn4KSjU3sYcUMMqfHODiAVToqgx2cZHm5Dac1Smjvj/8F2LpOVmHY+Epw
+mAiWk9hgxzrsX58dKzVPSBShmrtv7tIDhlPxEMcHVGJeNo7iHCsdF03m9VrvirqC
+6HfZKBF+N4dKlArJQOk1pTr7ZD7yXxZ683bXzu4/RB1Fql8RqlMcOh9SUWJUD6OQ
+Nc9Nb7rHviwJ8TX4Absk3TC8SA/u2Q==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDoTCCAomgAwIBAgIQKTZHquOKrIZKI1byyrdhrzANBgkqhkiG9w0BAQUFADBO
+MQswCQYDVQQGEwJ1czEYMBYGA1UEChMPVS5TLiBHb3Zlcm5tZW50MQ0wCwYDVQQL
+EwRGQkNBMRYwFAYDVQQDEw1Db21tb24gUG9saWN5MB4XDTA3MTAxNTE1NTgwMFoX
+DTI3MTAxNTE2MDgwMFowTjELMAkGA1UEBhMCdXMxGDAWBgNVBAoTD1UuUy4gR292
+ZXJubWVudDENMAsGA1UECxMERkJDQTEWMBQGA1UEAxMNQ29tbW9uIFBvbGljeTCC
+ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJeNvTMn5K1b+3i9L0dHbsd4
+6ZOcpN7JHP0vGzk4rEcXwH53KQA7Ax9oD81Npe53uCxiazH2+nIJfTApBnznfKM9
+hBiKHa4skqgf6F5PjY7rPxr4nApnnbBnTfAu0DDew5SwoM8uCjR/VAnTNr2kSVdS
+c+md/uRIeUYbW40y5KVIZPMiDZKdCBW/YDyD90ciJSKtKXG3d+8XyaK2lF7IMJCk
+FEhcVlcLQUwF1CpMP64Sm1kRdXAHImktLNMxzJJ+zM2kfpRHqpwJCPZLr1LoakCR
+xVW9QLHIbVeGlRfmH3O+Ry4+i0wXubklHKVSFzYIWcBCvgortFZRPBtVyYyQd+sC
+AwEAAaN7MHkwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O
+BBYEFC9Yl9ipBZilVh/72at17wI8NjTHMBIGCSsGAQQBgjcVAQQFAgMBAAEwIwYJ
+KwYBBAGCNxUCBBYEFHa3YJbdFFYprHWF03BjwbxHhhyLMA0GCSqGSIb3DQEBBQUA
+A4IBAQBgrvNIFkBypgiIybxHLCRLXaCRc+1leJDwZ5B6pb8KrbYq+Zln34PFdx80
+CTj5fp5B4Ehg/uKqXYeI6oj9XEWyyWrafaStsU+/HA2fHprA1RRzOCuKeEBuMPdi
+4c2Z/FFpZ2wR3bgQo2jeJqVW/TZsN5hs++58PGxrcD/3SDcJjwtCga1GRrgLgwb0
+Gzigf0/NC++DiYeXHIowZ9z9VKEDfgHLhUyxCynDvux84T8PCVI8L6eaSP436REG
+WOE2QYrEtr+O3c5Ks7wawM36GpnScZv6z7zyxFSjiDV2zBssRm8MtNHDYXaSdBHq
+S4CNHIkRi+xb/xfJSPzn4AYR4oRe
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOc
+UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx
+c8SxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xS
+S1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kg
+SGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4XDTA3MTIyNTE4Mzcx
+OVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxla3Ry
+b25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMC
+VFIxDzANBgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDE
+sGxldGnFn2ltIHZlIEJpbGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7F
+ni4gKGMpIEFyYWzEsWsgMjAwNzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9NYvDdE3ePYakqtdTyuTFY
+KTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQvKUmi8wUG
++7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveG
+HtyaKhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6P
+IzdezKKqdfcYbwnTrqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M
+733WB2+Y8a+xwXrXgTW4qhe04MsCAwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHk
+Yb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0G
+CSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/sPx+EnWVUXKgW
+AkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I
+aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5
+mxRZNTZPz/OOXl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsa
+XRik7r4EW5nVcV9VZWRi1aKbBFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZ
+qxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAKpoRq0Tl9
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB
+gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
+A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV
+BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw
+MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl
+YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P
+RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0
+aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3
+UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI
+2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8
+Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp
++2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+
+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O
+nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW
+/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g
+PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u
+QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY
+SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv
+IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/
+RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4
+zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd
+BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB
+ZQ==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIIQTCCB6qgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCAR4xCzAJBgNVBAYTAkVT
+MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE
+ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE
+ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjE0MDIGA1UECxMr
+SVBTIENBIFRpbWVzdGFtcGluZyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTE0MDIG
+A1UEAxMrSVBTIENBIFRpbWVzdGFtcGluZyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
+eTEeMBwGCSqGSIb3DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAxMTIzMTExMjY0
+M1oXDTI1MTIyOTExMjY0M1owggEeMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQmFy
+Y2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5l
+dCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0BtYWlsLmlw
+cy5lcyBDLkkuRi4gIEItNjA5Mjk0NTIxNDAyBgNVBAsTK0lQUyBDQSBUaW1lc3Rh
+bXBpbmcgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxNDAyBgNVBAMTK0lQUyBDQSBU
+aW1lc3RhbXBpbmcgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxHjAcBgkqhkiG9w0B
+CQEWD2lwc0BtYWlsLmlwcy5lczCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA
+0umTdn+FPP2gAb0RL0ZCDyt/BZvGa/VRcayaUh8flSfMkO+WP45RNv0WAM43pSGU
+Rmvt5P+hfuqf0aKbOPMTxLmYumVFQ/nXvRWdlC4AYN6YGrk8yfXh/NbEJN/n48iE
+GRK0HFyz9eIWYSdg8vAt5PDzrPigeYSdReL2AfBE5ZECAwEAAaOCBIkwggSFMB0G
+A1UdDgQWBBSR2UK8nKnK0Bw3E1JXFqANHikdPjCCAVAGA1UdIwSCAUcwggFDgBSR
+2UK8nKnK0Bw3E1JXFqANHikdPqGCASakggEiMIIBHjELMAkGA1UEBhMCRVMxEjAQ
+BgNVBAgTCUJhcmNlbG9uYTESMBAGA1UEBxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJ
+UFMgSW50ZXJuZXQgcHVibGlzaGluZyBTZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJp
+cHNAbWFpbC5pcHMuZXMgQy5JLkYuICBCLTYwOTI5NDUyMTQwMgYDVQQLEytJUFMg
+Q0EgVGltZXN0YW1waW5nIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MTQwMgYDVQQD
+EytJUFMgQ0EgVGltZXN0YW1waW5nIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4w
+HAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAM
+BgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYB
+BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIB
+FgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcwGgYD
+VR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlw
+cy5lczBIBglghkgBhvhCAQ0EOxY5VGltZXN0YW1waW5nIENBIENlcnRpZmljYXRl
+IGlzc3VlZCBieSBodHRwczovL3d3dy5pcHMuZXMvMCoGCWCGSAGG+EIBAgQdFhto
+dHRwczovL3d3dy5pcHMuZXMvaXBzMjAwMi8wQQYJYIZIAYb4QgEEBDQWMmh0dHBz
+Oi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJUaW1lc3RhbXBpbmcuY3JsMEYG
+CWCGSAGG+EIBAwQ5FjdodHRwczovL3d3dy5pcHMuZXMvaXBzMjAwMi9yZXZvY2F0
+aW9uVGltZXN0YW1waW5nLmh0bWw/MEMGCWCGSAGG+EIBBwQ2FjRodHRwczovL3d3
+dy5pcHMuZXMvaXBzMjAwMi9yZW5ld2FsVGltZXN0YW1waW5nLmh0bWw/MEEGCWCG
+SAGG+EIBCAQ0FjJodHRwczovL3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lUaW1l
+c3RhbXBpbmcuaHRtbDCBgQYDVR0fBHoweDA4oDagNIYyaHR0cHM6Ly93d3cuaXBz
+LmVzL2lwczIwMDIvaXBzMjAwMlRpbWVzdGFtcGluZy5jcmwwPKA6oDiGNmh0dHBz
+Oi8vd3d3YmFjay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyVGltZXN0YW1waW5nLmNy
+bDAvBggrBgEFBQcBAQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9vY3NwLmlwcy5l
+cy8wDQYJKoZIhvcNAQEFBQADgYEAxKMCdGABCUwYXU900W1zDCfTSDC1TxFVGRnH
+I4soqfp4D34sJ/adkgD2GMgkAMVf+C1MY/yQFV4nmOal9K7SNrG1JR8OeDoRjpM4
+rtO9qYbuHD3TW47/y/aZSZxP4ccocGpPOkvqfrnndKRKY0WUk/7Qg5aqpIXni2Gg
+olkTZbQ=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIID9zCCAt+gAwIBAgIESJ8AATANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMC
+Q04xMjAwBgNVBAoMKUNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24g
+Q2VudGVyMUcwRQYDVQQDDD5DaGluYSBJbnRlcm5ldCBOZXR3b3JrIEluZm9ybWF0
+aW9uIENlbnRlciBFViBDZXJ0aWZpY2F0ZXMgUm9vdDAeFw0xMDA4MzEwNzExMjVa
+Fw0zMDA4MzEwNzExMjVaMIGKMQswCQYDVQQGEwJDTjEyMDAGA1UECgwpQ2hpbmEg
+SW50ZXJuZXQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIxRzBFBgNVBAMMPkNo
+aW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyIEVWIENlcnRp
+ZmljYXRlcyBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm35z
+7r07eKpkQ0H1UN+U8i6yjUqORlTSIRLIOTJCBumD1Z9S7eVnAztUwYyZmczpwA//
+DdmEEbK40ctb3B75aDFk4Zv6dOtouSCV98YPjUesWgbdYavi7NifFy2cyjw1l1Vx
+zUOFsUcW9SxTgHbP0wBkvUCZ3czY28Sf1hNfQYOL+Q2HklY0bBoQCxfVWhyXWIQ8
+hBouXJE0bhlffxdpxWXvayHG1VA6v2G5BY3vbzQ6sm8UY78WO5upKv23KzhmBsUs
+4qpnHkWnjQRmQvaPK++IIGmPMowUc9orhpFjIpryp9vOiYurXccUwVswah+xt54u
+gQEC7c+WXmPbqOY4twIDAQABo2MwYTAfBgNVHSMEGDAWgBR8cks5x8DbYqVPm6oY
+NJKiyoOCWTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4E
+FgQUfHJLOcfA22KlT5uqGDSSosqDglkwDQYJKoZIhvcNAQEFBQADggEBACrDx0M3
+j92tpLIM7twUbY8opJhJywyA6vPtI2Z1fcXTIWd50XPFtQO3WKwMVC/GVhMPMdoG
+52U7HW8228gd+f2ABsqjPWYWqJ1MFn3AlUa1UeTiH9fqBk1jjZaM7+czV0I664zB
+echNdn3e9rG3geCg+aF4RhcaVpjwTj2rHO3sOdwHSPdj/gauwqRcalsyiMXHM4Ws
+ZkJHwlgkmeHlPuV1LI5D1l08eB6olYIpUNHRFrrvwb562bTYzB5MRuF3sTGrvSrI
+zo9uoV1/A3U05K2JRVRevq4opbs/eHnrc7MKDf2+yfdWrPa37S+bISnHOLaVxATy
+wy39FCqQmbkHzJ8=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc
+MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP
+bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2
+MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft
+ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg
+Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lk
+hsmj76CGv2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym
+1BW32J/X3HGrfpq/m44zDyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsW
+OqMFf6Dch9Wc/HKpoH145LcxVR5lu9RhsCFg7RAycsWSJR74kEoYeEfffjA3PlAb
+2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP8c9GsEsPPt2IYriMqQko
+O3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0TAQH/BAUw
+AwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAU
+AK3Zo/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB
+BQUAA4IBAQB8itEfGDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkF
+Zu90821fnZmv9ov761KyBZiibyrFVL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAb
+LjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft3OJvx8Fi8eNy1gTIdGcL+oir
+oQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43gKd8hdIaC2y+C
+MMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds
+sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0
+IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz
+BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y
+aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG
+9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMjIzM1oXDTE5MDYy
+NjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y
+azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
+YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw
+Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl
+cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfD
+cnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs
+2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqY
+JJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliE
+Zwgs3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJ
+n0WuPIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A
+PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEZDCCA0ygAwIBAgIQRL4Mi1AAJLQR0zYwS8AzdzANBgkqhkiG9w0BAQUFADCB
+ozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug
+Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho
+dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VSRmlyc3Qt
+TmV0d29yayBBcHBsaWNhdGlvbnMwHhcNOTkwNzA5MTg0ODM5WhcNMTkwNzA5MTg1
+NzQ5WjCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0
+IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYD
+VQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VS
+Rmlyc3QtTmV0d29yayBBcHBsaWNhdGlvbnMwggEiMA0GCSqGSIb3DQEBAQUAA4IB
+DwAwggEKAoIBAQCz+5Gh5DZVhawGNFugmliy+LUPBXeDrjKxdpJo7CNKyXY/45y2
+N3kDuatpjQclthln5LAbGHNhSuh+zdMvZOOmfAz6F4CjDUeJT1FxL+78P/m4FoCH
+iZMlIJpDgmkkdihZNaEdwH+DBmQWICzTSaSFtMBhf1EI+GgVkYDLpdXuOzr0hARe
+YFmnjDRy7rh4xdE7EkpvfmUnuaRVxblvQ6TFHSyZwFKkeEwVs0CYCGtDxgGwenv1
+axwiP8vv/6jQOkt2FZ7S0cYu49tXGzKiuG/ohqY/cKvlcJKrRB5AUPuco2LkbG6g
+yN7igEL66S/ozjIEj3yNtxyjNTwV3Z7DrpelAgMBAAGjgZEwgY4wCwYDVR0PBAQD
+AgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFPqGydvguul49Uuo1hXf8NPh
+ahQ8ME8GA1UdHwRIMEYwRKBCoECGPmh0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9V
+VE4tVVNFUkZpcnN0LU5ldHdvcmtBcHBsaWNhdGlvbnMuY3JsMA0GCSqGSIb3DQEB
+BQUAA4IBAQCk8yXM0dSRgyLQzDKrm5ZONJFUICU0YV8qAhXhi6r/fWRRzwr/vH3Y
+IWp4yy9Rb/hCHTO967V7lMPDqaAt39EpHx3+jz+7qEUqf9FuVSTiuwL7MT++6Lzs
+QCv4AdRWOOTKRIK1YSAhZ2X28AvnNPilwpyjXEAfhZOVBt5P1CeptqX8Fs1zMT+4
+ZSfP1FMa8Kxun08FDAOBp4QpxFq9ZFdyrTvPNximmMatBrTcCKME1SmklpoSZ0qM
+YEWd8SOasACcaLWYUNPvji6SZbFIPiG+FTAqDbUMo2s/rn9X9R+WfN9v3YIwLGUb
+QErNaLly7HF27FSOH4UMAWr6pjisH8SE
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW
+MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy
+c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD
+VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1
+c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
+AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81
+WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG
+FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq
+XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL
+se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb
+KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd
+IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73
+y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt
+hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc
+QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4
+Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV
+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV
+HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ
+KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z
+dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ
+L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr
+Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo
+ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY
+T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz
+GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m
+1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV
+OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH
+6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX
+QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFwTCCA6mgAwIBAgIITrIAZwwDXU8wDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UE
+BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEjMCEGA1UEAxMaU3dpc3NTaWdu
+IFBsYXRpbnVtIENBIC0gRzIwHhcNMDYxMDI1MDgzNjAwWhcNMzYxMDI1MDgzNjAw
+WjBJMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMSMwIQYDVQQD
+ExpTd2lzc1NpZ24gUGxhdGludW0gQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQAD
+ggIPADCCAgoCggIBAMrfogLi2vj8Bxax3mCq3pZcZB/HL37PZ/pEQtZ2Y5Wu669y
+IIpFR4ZieIbWIDkm9K6j/SPnpZy1IiEZtzeTIsBQnIJ71NUERFzLtMKfkr4k2Htn
+IuJpX+UFeNSH2XFwMyVTtIc7KZAoNppVRDBopIOXfw0enHb/FZ1glwCNioUD7IC+
+6ixuEFGSzH7VozPY1kneWCqv9hbrS3uQMpe5up1Y8fhXSQQeol0GcN1x2/ndi5ob
+jM89o03Oy3z2u5yg+gnOI2Ky6Q0f4nIoj5+saCB9bzuohTEJfwvH6GXp43gOCWcw
+izSC+13gzJ2BbWLuCB4ELE6b7P6pT1/9aXjvCR+htL/68++QHkwFix7qepF6w9fl
++zC8bBsQWJj3Gl/QKTIDE0ZNYWqFTFJ0LwYfexHihJfGmfNtf9dng34TaNhxKFrY
+zt3oEBSa/m0jh26OWnA81Y0JAKeqvLAxN23IhBQeW71FYyBrS3SMvds6DsHPWhaP
+pZjydomyExI7C3d3rLvlPClKknLKYRorXkzig3R3+jVIeoVNjZpTxN94ypeRSCtF
+KwH3HBqi7Ri6Cr2D+m+8jVeTO9TUps4e8aCxzqv9KyiaTxvXw3LbpMS/XUz13XuW
+ae5ogObnmLo2t/5u7Su9IPhlGdpVCX4l3P5hYnL5fhgC72O00Puv5TtjjGePAgMB
+AAGjgawwgakwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O
+BBYEFFCvzAeHFUdvOMW0ZdHelarp35zMMB8GA1UdIwQYMBaAFFCvzAeHFUdvOMW0
+ZdHelarp35zMMEYGA1UdIAQ/MD0wOwYJYIV0AVkBAQEBMC4wLAYIKwYBBQUHAgEW
+IGh0dHA6Ly9yZXBvc2l0b3J5LnN3aXNzc2lnbi5jb20vMA0GCSqGSIb3DQEBBQUA
+A4ICAQAIhab1Fgz8RBrBY+D5VUYI/HAcQiiWjrfFwUF1TglxeeVtlspLpYhg0DB0
+uMoI3LQwnkAHFmtllXcBrqS3NQuB2nEVqXQXOHtYyvkv+8Bldo1bAbl93oI9ZLi+
+FHSjClTTLJUYFzX1UWs/j6KWYTl4a0vlpqD4U99REJNi54Av4tHgvI42Rncz7Lj7
+jposiU0xEQ8mngS7twSNC/K5/FqdOxa3L8iYq/6KUFkuozv8KV2LwUvJ4ooTHbG/
+u0IdUt1O2BReEMYxB+9xJ/cbOQncguqLs5WGXv312l0xpuAxtpTmREl0xRbl9x8D
+YSjFyMsSoEJL+WuICI20MhjzdZ/EfwBPBZWcoxcCw7NTm6ogOSkrZvqdr16zktK1
+puEa+S1BaYEUtLS17Yk9zvupnTVCRLEcFHOBzyoBNZox1S2PbYTfgE1X4z/FhHXa
+icYwu+uPyyIIoK6q8QNsOktNCaUOcsZWayFCTiMlFGiudgp8DAdwZPmaL/YFOSbG
+DI8Zf0NebvRbFS/bYV3mZy8/CJT5YLSYMdp08YSTcU1f+2BY0fvEwW2JorsgH51x
+kcsymxM9Pn2SUjWskpSi0xjCfMfqr3YFFt1nJ8J+HAciIfNAChs0B0QTwoRqjt8Z
Wr9/6x3iGjjRXK9HkmuAtTClyY3YqzGBH9/CZjfTk6mFhnll0g==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
-MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkG
-A1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dp
-c3NTaWduIFNpbHZlciBDQSAtIEcyMB4XDTA2MTAyNTA4MzI0NloXDTM2MTAy
-NTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBB
-RzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkq
-hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dO
-cbpLj6VzHVxumK4DV644N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gRE
-pzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm+/pe7R20nqA1W6GSy/BJkv6F
-CgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH6INaUFjp
-iou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2
-kUpCe2UuMGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aD
-Cyr0NQp4yVXPQbBH6TCfmb5hqAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jM
-qDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5FZGkECwJMoBgs5PAKrYY
-C51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBsROop
-N4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFu
-sB3hB48IHpmccelM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb6
-5i/4z3GcRm25xBWNOHkDRUjvxF3XCO6HOSKGsg0PWEP3calILv3q1h8CAwEA
-AaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV
-HQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB
-tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggr
-BgEFBQcCARYgaHR0cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJ
-KoZIhvcNAQEFBQADggIBAHPGgeAn0i0P4JUw4ppBf1AsX19iYamGamkYDHRJ
-1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39FkWnZfrt4csEG
-DyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcS
-H9/L3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpH
-kXkzuoLcMmkDlm4fS/Bx/uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE
-790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFaDGi8aRl5xB9+lwW/xekkUV7U
-1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqPe97Dh4kQ
-mUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNV
-V4n+SsuuWxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29
-MC/HpeZBoNquBYeaoKRlbEwJDIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm
-0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ubDgEj8Z+7fNzcbBGXJbLy
+MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEW
+MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg
+Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM2WhcNMzYwOTE3MTk0NjM2WjB9
+MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi
+U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh
+cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA
+A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk
+pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf
+OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C
+Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT
+Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi
+HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM
+Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w
++2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+
+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3
+Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B
+26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID
+AQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE
+FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9j
+ZXJ0LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3Js
+LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFM
+BgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUHAgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0
+Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRwOi8vY2VydC5zdGFy
+dGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYgU3Rh
+cnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlh
+YmlsaXR5LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2Yg
+dGhlIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFp
+bGFibGUgYXQgaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL3BvbGljeS5wZGYwEQYJ
+YIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNT
+TCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOCAgEAFmyZ
+9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8
+jhvh3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUW
+FjgKXlf2Ysd6AgXmvB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJz
+ewT4F+irsfMuXGRuczE6Eri8sxHkfY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1
+ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3fsNrarnDy0RLrHiQi+fHLB5L
+EUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZEoalHmdkrQYu
+L6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq
+yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuC
+O3NJo2pXh5Tl1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6V
+um0ABj6y6koQOdjQK/W/7HW/lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkySh
+NOsF/5oirpt9P/FlUQqmMGqz9IgcgA38corog14=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARQxCzAJBgNVBAYTAkVT
+MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE
+ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE
+ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0GA1UECxMm
+SVBTIENBIENMQVNFQTEgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMT
+JklQUyBDQSBDTEFTRUExIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZI
+hvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwHhcNMDExMjI5MDEwNTMyWhcNMjUxMjI3
+MDEwNTMyWjCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ
+BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp
+bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G
+LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTEgQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUExIENlcnRpZmlj
+YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMw
+gZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALsw19zQVL01Tp/FTILq0VA8R5j8
+m2mdd81u4D/u6zJfX5/S0HnllXNEITLgCtud186Nq1KLK3jgm1t99P1tCeWu4Wwd
+ByOgF9H5fahGRpEiqLJpxq339fWUoTCUvQDMRH/uxJ7JweaPCjbB/SQ9AaD1e+J8
+eGZDi09Z8pvZ+kmzAgMBAAGjggRTMIIETzAdBgNVHQ4EFgQUZyaW56G/2LUDnf47
+3P7yiuYV3TAwggFGBgNVHSMEggE9MIIBOYAUZyaW56G/2LUDnf473P7yiuYV3TCh
+ggEcpIIBGDCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ
+BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp
+bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G
+LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTEgQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUExIENlcnRpZmlj
+YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOC
+AQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUF
+BwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYB
+BAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglg
+hkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1Ud
+EgQTMBGBD2lwc0BtYWlsLmlwcy5lczBCBglghkgBhvhCAQ0ENRYzQ0xBU0VBMSBD
+QSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkgaHR0cDovL3d3dy5pcHMuZXMvMCkGCWCG
+SAGG+EIBAgQcFhpodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyLzA7BglghkgBhvhC
+AQQELhYsaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0VBMS5j
+cmwwQAYJYIZIAYb4QgEDBDMWMWh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmV2
+b2NhdGlvbkNMQVNFQTEuaHRtbD8wPQYJYIZIAYb4QgEHBDAWLmh0dHA6Ly93d3cu
+aXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFQTEuaHRtbD8wOwYJYIZIAYb4QgEI
+BC4WLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcG9saWN5Q0xBU0VBMS5odG1s
+MHUGA1UdHwRuMGwwMqAwoC6GLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvaXBz
+MjAwMkNMQVNFQTEuY3JsMDagNKAyhjBodHRwOi8vd3d3YmFjay5pcHMuZXMvaXBz
+MjAwMi9pcHMyMDAyQ0xBU0VBMS5jcmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUF
+BzABhhNodHRwOi8vb2NzcC5pcHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAH66iqyA
+AIQVCtWYUQxkxZwCWINmyq0eB81+atqAB98DNEock8RLWCA1NnHtogo1EqWmZaeF
+aQoO42Hu6r4okzPV7Oi+xNtff6j5YzHIa5biKcJboOeXNp13XjFr/tOn2yrb25aL
+H2betgPAK7N41lUH5Y85UN4HI3LmvSAUS7SG
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEGjCCAwKgAwIBAgIDAYagMA0GCSqGSIb3DQEBBQUAMIGjMQswCQYDVQQGEwJG
+STEQMA4GA1UECBMHRmlubGFuZDEhMB8GA1UEChMYVmFlc3RvcmVraXN0ZXJpa2Vz
+a3VzIENBMSkwJwYDVQQLEyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBTZXJ2aWNl
+czEZMBcGA1UECxMQVmFybWVubmVwYWx2ZWx1dDEZMBcGA1UEAxMQVlJLIEdvdi4g
+Um9vdCBDQTAeFw0wMjEyMTgxMzUzMDBaFw0yMzEyMTgxMzUxMDhaMIGjMQswCQYD
+VQQGEwJGSTEQMA4GA1UECBMHRmlubGFuZDEhMB8GA1UEChMYVmFlc3RvcmVraXN0
+ZXJpa2Vza3VzIENBMSkwJwYDVQQLEyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBT
+ZXJ2aWNlczEZMBcGA1UECxMQVmFybWVubmVwYWx2ZWx1dDEZMBcGA1UEAxMQVlJL
+IEdvdi4gUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALCF
+FdrIAzfQo0Y3bBseljDCWoUSZyPyu5/nioFgJ/gTqTy894aqqvTzJSm0/nWuHoGG
+igWyHWWyOOi0zCia+xc28ZPVec7Bg4shT8MNrUHfeJ1I4x9CRPw8bSEga60ihCRC
+jxdNwlAfZM0tOSJWiP2yY51U2kJpwMhP1xjiPshphJQ9LIDGfM6911Mf64i5psu7
+hVfvV3ZdDIvTXhJBnyHAOfQmbQj6OLOhd7HuFtjQaNq0mKWgZUZKa41+qk1guPjI
+DfxxPu45h4G02fhukO4/DmHXHSto5i7hQkQmeCxY8n0Wf2HASSQqiYe2XS8pGfim
+545SnkFLWg6quMJmQlMCAwEAAaNVMFMwDwYDVR0TAQH/BAUwAwEB/zARBglghkgB
+hvhCAQEEBAMCAAcwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBTb6eGb0tEkC/yr
+46Bn6q6cS3f0sDANBgkqhkiG9w0BAQUFAAOCAQEArX1ID1QRnljurw2bEi8hpM2b
+uoRH5sklVSPj3xhYKizbXvfNVPVRJHtiZ+GxH0mvNNDrsczZog1Sf0JLiGCXzyVy
+t08pLWKfT6HAVVdWDsRol5EfnGTCKTIB6dTI2riBmCguGMcs/OubUpbf9MiQGS0j
+8/G7cdqehSO9Gu8u5Hp5t8OdhkktY7ktdM9lDzJmid87Ie4pbzlj2RXBbvbfgD5Q
+eBmK3QOjFKU3p7UsfLYRh+cF8ry23tT/l4EohP7+bEaFEEGfTXWMB9SZZ291im/k
+UJL2mdUQuMSpe/cXjUu/15WfCdxEDx4yw8DP03kN5Mc7h/CQNIghYkmSBAQfvA==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UE
+BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWdu
+IFNpbHZlciBDQSAtIEcyMB4XDTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0Nlow
+RzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMY
+U3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
+MIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644N0Mv
+Fz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7br
+YT7QbNHm+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieF
+nbAVlDLaYQ1HTWBCrpJH6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH
+6ATK72oxh9TAtvmUcXtnZLi2kUpCe2UuMGoM9ZDulebyzYLs2aFK7PayS+VFheZt
+eJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5hqAaEuSh6XzjZG6k4sIN/
+c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5FZGkECwJ
+MoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRH
+HTBsROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTf
+jNFusB3hB48IHpmccelM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb6
+5i/4z3GcRm25xBWNOHkDRUjvxF3XCO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOB
+rDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU
+F6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRBtjpbO8tFnb0c
+wpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0
+cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIB
+AHPGgeAn0i0P4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShp
+WJHckRE1qTodvBqlYJ7YH39FkWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9
+xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L3XWgwF15kIwb4FDm3jH+mHtwX6WQ
+2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx/uNncqCxv1yL5PqZ
+IseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFaDGi8
+aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2X
+em1ZqSqPe97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQR
+dAtq/gsD/KNVV4n+SsuuWxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/
+OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJDIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+
+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ubDgEj8Z+7fNzcbBGXJbLy
tGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
-MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUF
-ADBkMQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsT
-HERpZ2l0YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxGzAZBgNVBAMTElN3aXNz
-Y29tIFJvb3QgQ0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4MTgyMjA2MjBa
-MGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMc
-RGlnaXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Nj
-b20gUm9vdCBDQSAxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA
-0LmwqAzZuz8h+BvVM5OAFmUgdbI9m2BtRsiMMW8Xw/qabFbtPMWRV8PNq5ZJ
-kCoZSx6jbVfd8StiKHVFXqrWW/oLJdihFvkcxC7mlSpnzNApbjyFNDhhSbEA
-n9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/TilftKaNXXsLmREDA/7n29uj
-/x2lzZAeAR81sH8A25Bvxn570e56eqeqDFdvpG3FEzuwpdntMhy0XmeLVNxz
-h+XTF3xmUHJd1BpYwdnP2IkCb6dJtDZd0KTeByy2dbcokdaXvij1mB7qWybJ
-vbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn7uHbHaBuHYwadzVcFh4r
-Ux80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNFvJbNcA78
-yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo19AO
-eCMgkckkKmUpWyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjC
-L3UcPX7ape8eYIVpQtPM+GP+HkM5haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoI
-lmJWbjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNYMUJDLXT5xp6mig/p
-/r+D5kNXJLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw
-HQYDVR0hBBYwFDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYB
-Af8CAQcwHwYDVR0jBBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0O
-BBYEFAMlL95vggE6XCzcK6FptWfUjNP9MA0GCSqGSIb3DQEBBQUAA4ICAQA1
-EMvspgQNDQ/NwNurqPKIlwzfky9NfEBWMXrrpA9gzXrzvsMnjgM+pN0S734e
-dAY8PzHyHHuRMSG08NBsl9Tpl7IkVh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzn
-eAXQMbFamIp1TpBcahQq4FJHgmDmHtqBsfsUC1rxn9KVuj7QG9YVHaO+htXb
-D8BJZLsuUBlL0iT43R4HVtA4oJVwIHaM190e3p9xxCPvgxNcoyQVTSlAPGrE
-qdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtlvrsRls/bxig5OgjOR1tTWsWZ
-/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ipmXeascClOS5cfGni
-LLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HHb6D0jqTsNFFb
-jCYDcKF31QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksfrK/7DZBa
-ZmBwXarNeNQk7shBoJMBkpxqnvy5JMWzFYJ+vq6VK+uxwNrjAWALXmmshFZh
-vnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCyx/yP2FS1k2Kdzs9Z+z0Y
-zirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMWNY6E
-0F/6MBr1mmz0DlP5OlvRHA==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2
-VMOcUktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xh
-ecSxY8Sxc8SxMQswCQYDVQQGDAJUUjEPMA0GA1UEBwwGQU5LQVJBMVYwVAYD
-VQQKDE0oYykgMjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg
-QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1
-MTMxMDI3MTdaFw0xNTAzMjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RS
-VVNUIEVsZWt0cm9uaWsgU2VydGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFz
-xLExCzAJBgNVBAYMAlRSMQ8wDQYDVQQHDAZBTktBUkExVjBUBgNVBAoMTShj
-KSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBCaWxpxZ9p
-bSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEuxZ4uMIIBIjANBgkqhkiG9w0B
-AQEFAAOCAQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7XfIMYGFbazt0K3gNfUW9
-InTojAPBxhEqPZW8qZSwu5GXyGl8hMW0kWxsE2qkVa2kheiVfrMArwDCBRj1
-cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8iSi9BB35JYbOG7E6mQW6E
-vAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5CurKZ8y1U
-iBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1JuTm
-5Rh8i27fbMx4W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51
-b0dewQIDAQABoxAwDjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IB
-AQAV9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46sWrv7/hg0Uw2ZkUd
-82YCdAR7kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxE
-q8Sn5RTOPEFhfEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oS
-N7wBGjSFvW5P55FyB0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8
-KsF8kOipKMDTkcatKIdAaLX/7KfS0zgYnNN9aV3wxqUeJBujR/xpB2jn5Jq0
-7Q+hh4cCzofSSE7hvP/L8XKSRGQDJereW26fyfJOrN3H
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2
-VMOcUktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xh
-ecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYD
-VQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0g
-R8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUw
-HhcNMDUxMTA3MTAwNzU3WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2
-VMOcUktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xh
-ecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYD
-VQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0g
-R8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUw
-ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpNn7DkUNMwxmYCMjH
-WHtPFoylzkkBH3MOrHUTpvqeLCDe2JAOCtFp0if7qnefJ1Il4std2NiDUBd9
-irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKIx+XlZEdhR3n9wFHxwZnn
-3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJQv2gQrSd
-iVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGXJHps
-mxcPbe9TmJEr5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1p
-zpwACPI2/z7woQ8arBT9pmAPAgMBAAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Z
-z58SFq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8GA1UdEwEB/wQFMAMB
-Af8wDQYJKoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/ntt
-Rbj2hWyfIvwqECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWo
-lKMiVW4XSf/SKfE4Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbc
-oCb6dxriJNoaN+BnrdFzgw2lGh1uEpJ+hGIAF728JRhX8tepb1mIvDS3LoV4
-nZbcFMMsilKbloxSZj2GFotHuFEJjOp9zYhys2AzsfAKRO8P9Qk3iCQOLGsg
-OqL6EfJANZxEaGM7rDNvY7wsu/LSy3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9R
-nuk5UrbnBEI=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUF
-ADA/MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENl
-cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIw
-NTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQg
-Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEB
-BQADggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN8
-6aXfTEc2pBsBHH8eV4qNw8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UK
-IXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/
-cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O1RGvqa/l
-mr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq
-16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdL
-iYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUq
-dULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FCVGqY8A2tl+lS
-XunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1tB6iE
-fC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKX
-TiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN
-Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0G
-A1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkG
-BGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2
-09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2
-WPWus4MzeKR6dBcZTulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2Jyf
-tB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3gh
-qMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKb
-xkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1
-AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephg
-IqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7m
-XQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6MmnD+iMsJKxYEYMRBWqoTv
-LQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk7tfGOB5j
-GxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJI
-oRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v
-3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYs
-fPQS
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUF
-ADCByjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8w
-HQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykg
-MjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5
-MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENl
-cnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcN
-MzYwNzE2MjM1OTU5WjCByjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlT
-aWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTow
-OAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp
-emVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1Ymxp
-YyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0G
-CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8
-RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbext0uz/o9+B1fs
-70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhDY2pS
-S9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+Q
-ueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+
-rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMK
-z10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNV
-HQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv
-Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0
-cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/T
-ZafC3ey78DAJ80M5+gKvMzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP
-2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGq
-CBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU
-7qKEKQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqV
-ir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4o
-tp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8NhnacRHr2lVz2XTIIM6RU
-thg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE
-BhMCVVMxFDASBgNVBAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBG
-YXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEvMC0GA1UEAxMmV2VsbHMg
-RmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDAxMDExMTY0
-MTI4WhcNMjEwMTE0MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoT
-C1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0
-aW9uIEF1dGhvcml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0
-aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
-AoIBAQDVqDM7Jvk0/82bfuUER84A4n135zHCLielTWi5MbqNQ1mXx3Oqfz1c
-QJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHESxP9cMIlrCL1dQu3U+SlK93O
-vRw6esP3E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4OJgALTqv9i86C1y8IcGjB
-qAr5dE8Hq6T54oN+J3N0Prj5OEL8pahbSCOz6+MlsoCultQKnMJ4msZoGK43
-YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4jsNtlAHCEAQgAFG5Uhpq6
-zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMBAAGjYTBf
-MA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcBCzAy
-MDAGCCsGAQUFBwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRw
-b2xpY3kwDQYJKoZIhvcNAQEFBQADggEBANIn3ZwKdyu7IvICtUpKkfnRLb7k
-uxpo7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrvm+0fazbuSCUlFLZW
-ohDo7qd/0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0R
-OhPs7fpvcmR7nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zk
-r8QA1dhYJPz1j+zxx32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01
-QIroTmMatukgalHizqSQ33ZwmVxwQ023tqcZZE6St8WRPH9IFmV7Fv3L/PvZ
-1dZPIWU7Sn9Ho/s=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUF
-ADCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5
-LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0w
-KwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkw
-HhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMC
-VVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMb
-WFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBH
-bG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEB
-AQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwuIR1cRN8h
-XX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9K
-mHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavn
-HTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3
-hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRaJSKNNCyy9mgd
-Em3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvryxS3T
-/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQD
-AgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs
-jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1
-cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcN
-AQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc
-/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYS
-Nrsf16GBBEYgoyxtqZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT
-5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGP
-urt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd
-50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUF
-ADCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYG
-A1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UE
-CxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
-IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYx
-MTE3MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTAT
-BgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT
-ZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJ
-bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0
-ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
-AoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQ
-LZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29
-dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk6KHYcWUNo1F7
-7rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/KaAcd
-HJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR3
-2HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA
-MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7
-W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7OR
-tvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE
-uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQ
-aEfZYGDm/Ac9IiAXxPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqd
-E8hhuvU5HIe6uL17In/2/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+
-MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+
-fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEFTCCA36gAwIBAgIBADANBgkqhkiG9w0BAQQFADCBvjELMAkGA1UEBhMCVVMx
-EDAOBgNVBAgTB0luZGlhbmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UE
-ChMfU29mdHdhcmUgaW4gdGhlIFB1YmxpYyBJbnRlcmVzdDETMBEGA1UECxMKaG9z
-dG1hc3RlcjEgMB4GA1UEAxMXQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxJTAjBgkq
-hkiG9w0BCQEWFmhvc3RtYXN0ZXJAc3BpLWluYy5vcmcwHhcNMDMwMTE1MTYyOTE3
-WhcNMDcwMTE0MTYyOTE3WjCBvjELMAkGA1UEBhMCVVMxEDAOBgNVBAgTB0luZGlh
-bmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UEChMfU29mdHdhcmUgaW4g
-dGhlIFB1YmxpYyBJbnRlcmVzdDETMBEGA1UECxMKaG9zdG1hc3RlcjEgMB4GA1UE
-AxMXQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxJTAjBgkqhkiG9w0BCQEWFmhvc3Rt
-YXN0ZXJAc3BpLWluYy5vcmcwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAPB6
-rdoiLR3RodtM22LMcfwfqb5OrJNl7fwmvskgF7yP6sdD2bOfDIXhg9852jhY8/kL
-VOFe1ELAL2OyN4RAxk0rliZQVgeTgqvgkOVIBbNwgnjN6mqtuWzFiPL+NXQExq40
-I3whM+4lEiwSHaV+MYxWanMdhc+kImT50LKfkxcdAgMBAAGjggEfMIIBGzAdBgNV
-HQ4EFgQUB63oQR1/vda/G4F6P4xLiN4E0vowgesGA1UdIwSB4zCB4IAUB63oQR1/
-vda/G4F6P4xLiN4E0vqhgcSkgcEwgb4xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdJ
-bmRpYW5hMRUwEwYDVQQHEwxJbmRpYW5hcG9saXMxKDAmBgNVBAoTH1NvZnR3YXJl
-IGluIHRoZSBQdWJsaWMgSW50ZXJlc3QxEzARBgNVBAsTCmhvc3RtYXN0ZXIxIDAe
-BgNVBAMTF0NlcnRpZmljYXRpb24gQXV0aG9yaXR5MSUwIwYJKoZIhvcNAQkBFhZo
-b3N0bWFzdGVyQHNwaS1pbmMub3JnggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcN
-AQEEBQADgYEAm/Abn8c2y1nO3fgpAIslxvi9iNBZDhQtJ0VQZY6wgSfANyDOR4DW
-iexO/AlorB49KnkFS7TjCAoLOZhcg5FaNiKnlstMI5krQmau1Qnb/vGSNsE/UGms
-1ts+QYPUs0KmGEAFUri2XzLy+aQo9Kw74VBvqnxvaaMeY5yMcKNOieY=
+MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBk
+MQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0
+YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3Qg
+Q0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4MTgyMjA2MjBaMGQxCzAJBgNVBAYT
+AmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGlnaXRhbCBDZXJ0aWZp
+Y2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIICIjAN
+BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9
+m2BtRsiMMW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdih
+FvkcxC7mlSpnzNApbjyFNDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/
+TilftKaNXXsLmREDA/7n29uj/x2lzZAeAR81sH8A25Bvxn570e56eqeqDFdvpG3F
+EzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkCb6dJtDZd0KTeByy2dbco
+kdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn7uHbHaBu
+HYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNF
+vJbNcA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo
+19AOeCMgkckkKmUpWyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjC
+L3UcPX7ape8eYIVpQtPM+GP+HkM5haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJW
+bjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNYMUJDLXT5xp6mig/p/r+D5kNX
+JLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0hBBYw
+FDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j
+BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzc
+K6FptWfUjNP9MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzf
+ky9NfEBWMXrrpA9gzXrzvsMnjgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7Ik
+Vh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQMbFamIp1TpBcahQq4FJHgmDmHtqB
+sfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4HVtA4oJVwIHaM190e
+3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtlvrsR
+ls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ip
+mXeascClOS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HH
+b6D0jqTsNFFbjCYDcKF31QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksf
+rK/7DZBaZmBwXarNeNQk7shBoJMBkpxqnvy5JMWzFYJ+vq6VK+uxwNrjAWALXmms
+hFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCyx/yP2FS1k2Kdzs9Z+z0Y
+zirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMWNY6E0F/6
+MBr1mmz0DlP5OlvRHA==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDQzCCAiugAwIBAgIQX/h7KCtU3I1CoxW1aMmt/zANBgkqhkiG9w0BAQUFADA1
+MRYwFAYDVQQKEw1DaXNjbyBTeXN0ZW1zMRswGQYDVQQDExJDaXNjbyBSb290IENB
+IDIwNDgwHhcNMDQwNTE0MjAxNzEyWhcNMjkwNTE0MjAyNTQyWjA1MRYwFAYDVQQK
+Ew1DaXNjbyBTeXN0ZW1zMRswGQYDVQQDExJDaXNjbyBSb290IENBIDIwNDgwggEg
+MA0GCSqGSIb3DQEBAQUAA4IBDQAwggEIAoIBAQCwmrmrp68Kd6ficba0ZmKUeIhH
+xmJVhEAyv8CrLqUccda8bnuoqrpu0hWISEWdovyD0My5jOAmaHBKeN8hF570YQXJ
+FcjPFto1YYmUQ6iEqDGYeJu5Tm8sUxJszR2tKyS7McQr/4NEb7Y9JHcJ6r8qqB9q
+VvYgDxFUl4F1pyXOWWqCZe+36ufijXWLbvLdT6ZeYpzPEApk0E5tzivMW/VgpSdH
+jWn0f84bcN5wGyDWbs2mAag8EtKpP6BrXruOIIt6keO1aO6g58QBdKhTCytKmg9l
+Eg6CTY5j/e/rmxrbU6YTYK/CfdfHbBcl1HP7R2RQgYCUTOG/rksc35LtLgXfAgED
+o1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUJ/PI
+FR5umgIJFq0roIlgX9p7L6owEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEF
+BQADggEBAJ2dhISjQal8dwy3U8pORFBi71R803UXHOjgxkhLtv5MOhmBVrBW7hmW
+Yqpao2TB9k5UM8Z3/sUcuuVdJcr18JOagxEu5sv4dEX+5wW4q+ffy0vhN4TauYuX
+cB7w4ovXsNgOnbFp1iqRe6lJT37mjpXYgyc81WhJDtSd9i7rp77rMKSsH0T8lasz
+Bvt9YAretIpjsJyp8qS5UwGH0GikJ3+r/+n6yUA4iGe0OcaEb1fJU9u6ju7AQ7L4
+CYNu/2bPPu8Xs1gYJQk0XuPL1hS27PKSb3TkL4Eq1ZKR4OCXPDJoBYVL0fdX4lId
+kxpUnwVwwEpxYB5DC2Ae/qPOgRnhCzU=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/
+MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj
+YXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1ow
+PzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp
+Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB
+AJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XR
+IePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1q
+gQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKy
+yhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAts
+F/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2
+jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvx
+ls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FC
+VGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHK
+YS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoH
+EgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN
+Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1Ud
+DgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAE
+MTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqK
+UWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ
+TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyf
+qzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaK
+ZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFE
+JPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7
+hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1
+EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6Mm
+nD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WX
+udpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44Vbnz
+ssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe
+LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl
+pYYsfPQS
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC
+VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0
+Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW
+KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl
+cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw
+NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw
+NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy
+ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV
+BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ
+KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo
+Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4
+4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9
+KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI
+rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi
+94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB
+sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi
+gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo
+kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE
+vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA
+A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t
+O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua
+AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP
+9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/
+eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m
+0vdXcDazv/wor3ElhVsT/h5/WrQ8
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY
+MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo
+R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx
+MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK
+Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp
+ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
+AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9
+AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA
+ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0
+7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W
+kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI
+mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G
+A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ
+KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1
+6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl
+4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K
+oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj
+UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU
+AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC
+TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0
+aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0
+aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz
+MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw
+IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR
+dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG
+9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp
+li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D
+rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ
+WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug
+F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU
+xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC
+Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv
+dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw
+ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl
+IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh
+c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy
+ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh
+Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI
+KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T
+KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq
+y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p
+dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD
+VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL
+MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk
+fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8
+7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R
+cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y
+mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW
+xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK
+SnQ2+Q==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMx
+IjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1
+dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2
+MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20w
+HhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTELMAkGA1UEBhMCRVMx
+IjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1
+dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2
+MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20w
+ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5u
+Cp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5Vj1H5WuretXDE7aTt/6MNbg9kUDGvASdY
+rv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJHlShbz++AbOCQl4oBPB3z
+hxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf3H5idPay
+BQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcL
+iam8NeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcb
+AgMBAAGjgZ8wgZwwKgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lv
+bmFsLmNvbTASBgNVHRMBAf8ECDAGAQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0
+MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4E
+FgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQADggEBAEdz/o0n
+VPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq
+u00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36m
+hoEyIwOdyPdfwUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzfl
+ZKG+TQyTmAyX9odtsz/ny4Cm7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBp
+QWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YGVM+h4k0460tQtcsm9MracEpqoeJ5
+quGnM/b9Sh/22WA=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEb
+MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow
+GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0
+aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEwMDAwMDBaFw0yODEyMzEyMzU5NTla
+MH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO
+BgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUwIwYD
+VQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0B
+AQEFAAOCAQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWW
+fnJSoBVC21ndZHoa0Lh73TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMt
+TGo87IvDktJTdyR0nAducPy9C1t2ul/y/9c3S0pgePfw+spwtOpZqqPOSC+pw7IL
+fhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6juljatEPmsbS9Is6FARW
+1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsSivnkBbA7
+kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0G
+A1UdDgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYD
+VR0TAQH/BAUwAwEB/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21v
+ZG9jYS5jb20vVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRo
+dHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMu
+Y3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8NtwuleGFTQQuS9/
+HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32
+pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxIS
+jBc/lDb+XbDABHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+
+xqFx7D+gIIxmOom0jtTYsU0lR+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/Atyjcn
+dBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O9y5Xt5hwXsjEeLBi
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHKMQsw
+CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl
+cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu
+LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT
+aWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
+dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD
+VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT
+aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ
+bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu
+IENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
+LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN2E1Lm0+afY8wR4
+nN493GwTFtl63SRRZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/EbRrsC+MO
+8ESlV8dAWB6jRx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjV
+ojYJrKshJlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjb
+PG7PoBMAGrgnoeS+Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP2
+6KbqxzcSXKMpHgLZ2x87tNcPVkeBFQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHhv2Vr
+n5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAq2aN17O6x5q25lXQBfGfMY1a
+qtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/Ny9Sn2WCVhDr4
+wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUfxJM8/XmPBNQ+T+r3
+ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFMDSZl4kSAHsef493oCtrs
+pSCAaWihT37ha88HQfqDjrw43bAuEbFrskLMmrz5SCJ5ShkPshw+IHTZasO+8ih4
+E1Z5T21Q6huwtVexN2ZYI/PcD98Kh8TvhgXVOBRgmaNL3gaWcSzy27YfpO8/7g==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjEL
+MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV
+BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0
+Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYwMTEyMTQzODQzWhcNMjUxMjMxMjI1
+OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i
+SDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UEAxMc
+VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD
+ggEPADCCAQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jf
+tMjWQ+nEdVl//OEd+DFwIxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKg
+uNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2J
+XjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQXa7pIXSSTYtZgo+U4+lK
+8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7uSNQZu+99
+5OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1Ud
+EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3
+kUrL84J6E1wIqzCB7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRy
+dXN0Y2VudGVyLmRlL2NybC92Mi90Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6
+Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBUcnVzdENlbnRlciUyMENsYXNz
+JTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21iSCxPVT1yb290
+Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u
+TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iS
+GNn3Bzn1LL4GdXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprt
+ZjluS5TmVfwLG4t3wVMTZonZKNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8
+au0WOB9/WIFaGusyiC2y8zl3gK9etmF1KdsjTYjKUCjLhdLTEKJZbtOTVAB6okaV
+hgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kPJOzHdiEoZa5X6AeI
+dUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfkvQ==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB
+qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf
+Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw
+MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV
+BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw
+NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j
+LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG
+A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
+IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG
+SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs
+W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta
+3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk
+6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6
+Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J
+NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA
+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP
+r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU
+DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz
+YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX
+xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2
+/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/
+LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7
+jVaMaA==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP
+MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx
+MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV
+BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o
+Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt
+5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s
+3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej
+vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu
+8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw
+DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG
+MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil
+zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/
+3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD
+FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6
+Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2
+ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEU
+MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3
+b3JrMSAwHgYDVQQDExdBZGRUcnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAx
+MDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtB
+ZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIDAeBgNV
+BAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV
+6tsfSlbunyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nX
+GCwwfQ56HmIexkvA/X1id9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnP
+dzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSGAa2Il+tmzV7R/9x98oTaunet3IAIx6eH
+1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAwHM+A+WD+eeSI8t0A65RF
+62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0GA1UdDgQW
+BBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUw
+AwEB/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDEL
+MAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRU
+cnVzdCBUVFAgTmV0d29yazEgMB4GA1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJv
+b3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4JNojVhaTdt02KLmuG7jD8WS6
+IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL+YPoRNWyQSW/
+iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao
+GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh
+4SINhwBk/ox9Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQm
+XiLsks3/QppEIW1cxeMiHV9HEufOX1362KqxMy3ZdvJOOjMMK7MtkAY=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIH6jCCB1OgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARIxCzAJBgNVBAYTAkVT
+MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE
+ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE
+ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEuMCwGA1UECxMl
+SVBTIENBIENMQVNFMyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMl
+SVBTIENBIENMQVNFMyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3
+DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAxMTIyOTAxMDE0NFoXDTI1MTIyNzAx
+MDE0NFowggESMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQmFyY2Vsb25hMRIwEAYD
+VQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5n
+IFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4g
+IEItNjA5Mjk0NTIxLjAsBgNVBAsTJUlQUyBDQSBDTEFTRTMgQ2VydGlmaWNhdGlv
+biBBdXRob3JpdHkxLjAsBgNVBAMTJUlQUyBDQSBDTEFTRTMgQ2VydGlmaWNhdGlv
+biBBdXRob3JpdHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczCBnzAN
+BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAqxf+DrDGaBtT8FK+n/ra+osTBLsBjzLZ
+H49NzjaY2uQARIwo2BNEKqRrThckQpzTiKRBgtYj+4vJhuW5qYIF3PHeH+AMmVWY
+8jjsbJ0gA8DvqqPGZARRLXgNo9KoOtYkTOmWehisEyMiG3zoMRGzXwmqMHBxRiVr
+SXGAK5UBsh8CAwEAAaOCBEowggRGMB0GA1UdDgQWBBS4k/8uy9wsjqLnev42USGj
+mFsMNDCCAUQGA1UdIwSCATswggE3gBS4k/8uy9wsjqLnev42USGjmFsMNKGCARqk
+ggEWMIIBEjELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UE
+BxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBT
+ZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBC
+LTYwOTI5NDUyMS4wLAYDVQQLEyVJUFMgQ0EgQ0xBU0UzIENlcnRpZmljYXRpb24g
+QXV0aG9yaXR5MS4wLAYDVQQDEyVJUFMgQ0EgQ0xBU0UzIENlcnRpZmljYXRpb24g
+QXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYD
+VR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggr
+BgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIB
+FQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhC
+AQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGB
+D2lwc0BtYWlsLmlwcy5lczBBBglghkgBhvhCAQ0ENBYyQ0xBU0UzIENBIENlcnRp
+ZmljYXRlIGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5lcy8wKQYJYIZIAYb4QgEC
+BBwWGmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMDoGCWCGSAGG+EIBBAQtFito
+dHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTMuY3JsMD8GCWCG
+SAGG+EIBAwQyFjBodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jldm9jYXRpb25D
+TEFTRTMuaHRtbD8wPAYJYIZIAYb4QgEHBC8WLWh0dHA6Ly93d3cuaXBzLmVzL2lw
+czIwMDIvcmVuZXdhbENMQVNFMy5odG1sPzA6BglghkgBhvhCAQgELRYraHR0cDov
+L3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lDTEFTRTMuaHRtbDBzBgNVHR8EbDBq
+MDGgL6AthitodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTMu
+Y3JsMDWgM6Axhi9odHRwOi8vd3d3YmFjay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAy
+Q0xBU0UzLmNybDAvBggrBgEFBQcBAQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9v
+Y3NwLmlwcy5lcy8wDQYJKoZIhvcNAQEFBQADgYEAF2VcmZVDAyevJuXr0LMXI/dD
+qsfwfewPxqmurpYPdikc4gYtfibFPPqhwYHOU7BC0ZdXGhd+pFFhxu7pXu8Fuuu9
+D6eSb9ijBmgpjnn1/7/5p6/ksc7C0YBCJwUENPjDfxZ4IwwHJPJGR607VNCv1TGy
+r33I6unUVtkOE7LFRVA=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES
+MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU
+V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz
+WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO
+LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm
+aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
+AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE
+AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH
+K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX
+RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z
+rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx
+3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq
+hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC
+MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls
+XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D
+lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn
+aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ
+YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDODCCAqGgAwIBAgIQQAWyU6AaRkNQCYGPEhB27DANBgkqhkiG9w0BAQUFADCB
+zzELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJ
+Q2FwZSBUb3duMRowGAYDVQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMf
+Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEjMCEGA1UEAxMaVGhhd3Rl
+IFBlcnNvbmFsIFByZW1pdW0gQ0ExKjAoBgkqhkiG9w0BCQEWG3BlcnNvbmFsLXBy
+ZW1pdW1AdGhhd3RlLmNvbTAeFw05NjAxMDEwMDAwMDBaFw0yMTAxMDEyMzU5NTla
+MIHPMQswCQYDVQQGEwJaQTEVMBMGA1UECBMMV2VzdGVybiBDYXBlMRIwEAYDVQQH
+EwlDYXBlIFRvd24xGjAYBgNVBAoTEVRoYXd0ZSBDb25zdWx0aW5nMSgwJgYDVQQL
+Ex9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMSMwIQYDVQQDExpUaGF3
+dGUgUGVyc29uYWwgUHJlbWl1bSBDQTEqMCgGCSqGSIb3DQEJARYbcGVyc29uYWwt
+cHJlbWl1bUB0aGF3dGUuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJ
+Ztn4B0TPuYwu8KHvE0VsBd/eJxZRNkERbGw77f4QfRKe5ZtCmv5gMcNmt3M6SK5O
+0DI3lIi1DbbZ8/JE2dWIEt12TfIa/G8jHnrx2JhFTgcQ7xZC0EN1bUre4qrJMf8f
+AHB8Zs8QJQi6+u4A6UYDZicRFTuqW/KY3TZCstqIdQIDAQABoxMwETAPBgNVHRMB
+Af8EBTADAQH/MA0GCSqGSIb3DQEBBQUAA4GBALpkCujztDHJJ2+idqAtNnHHhsAI
+wk7t2pokGYf8WiOcck0I361cwzskgR1Xj7YSpSID7xK90S1elo8mJk9LG3w7oFIa
+pag3hsRHKsrdQfho9cITQSma8AyozaH8FSMC23or1GJRQkfEox/00sVNVBDr2vDM
+p083DL08yxDjGugV
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIH6jCCB1OgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARIxCzAJBgNVBAYTAkVT
+MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE
+ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE
+ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEuMCwGA1UECxMl
+SVBTIENBIENMQVNFMSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMl
+SVBTIENBIENMQVNFMSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3
+DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAxMTIyOTAwNTkzOFoXDTI1MTIyNzAw
+NTkzOFowggESMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQmFyY2Vsb25hMRIwEAYD
+VQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5n
+IFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4g
+IEItNjA5Mjk0NTIxLjAsBgNVBAsTJUlQUyBDQSBDTEFTRTEgQ2VydGlmaWNhdGlv
+biBBdXRob3JpdHkxLjAsBgNVBAMTJUlQUyBDQSBDTEFTRTEgQ2VydGlmaWNhdGlv
+biBBdXRob3JpdHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczCBnzAN
+BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA4FEnpwvdr9G5Q1uCN0VWcu+atsIS7ywS
+zHb5BlmvXSHU0lq4oNTzav3KaY1mSPd05u42veiWkXWmcSjK5yISMmmwPh5r9FBS
+YmL9Yzt9fuzuOOpi9GyocY3h6YvJP8a1zZRCb92CRTzo3wno7wpVqVZHYUxJZHMQ
+KD/Kvwn/xi8CAwEAAaOCBEowggRGMB0GA1UdDgQWBBTrsxl588GlHKzcuh9morKb
+adB4CDCCAUQGA1UdIwSCATswggE3gBTrsxl588GlHKzcuh9morKbadB4CKGCARqk
+ggEWMIIBEjELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UE
+BxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBT
+ZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBC
+LTYwOTI5NDUyMS4wLAYDVQQLEyVJUFMgQ0EgQ0xBU0UxIENlcnRpZmljYXRpb24g
+QXV0aG9yaXR5MS4wLAYDVQQDEyVJUFMgQ0EgQ0xBU0UxIENlcnRpZmljYXRpb24g
+QXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYD
+VR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggr
+BgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIB
+FQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhC
+AQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGB
+D2lwc0BtYWlsLmlwcy5lczBBBglghkgBhvhCAQ0ENBYyQ0xBU0UxIENBIENlcnRp
+ZmljYXRlIGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5lcy8wKQYJYIZIAYb4QgEC
+BBwWGmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMDoGCWCGSAGG+EIBBAQtFito
+dHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTEuY3JsMD8GCWCG
+SAGG+EIBAwQyFjBodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jldm9jYXRpb25D
+TEFTRTEuaHRtbD8wPAYJYIZIAYb4QgEHBC8WLWh0dHA6Ly93d3cuaXBzLmVzL2lw
+czIwMDIvcmVuZXdhbENMQVNFMS5odG1sPzA6BglghkgBhvhCAQgELRYraHR0cDov
+L3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lDTEFTRTEuaHRtbDBzBgNVHR8EbDBq
+MDGgL6AthitodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTEu
+Y3JsMDWgM6Axhi9odHRwOi8vd3d3YmFjay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAy
+Q0xBU0UxLmNybDAvBggrBgEFBQcBAQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9v
+Y3NwLmlwcy5lcy8wDQYJKoZIhvcNAQEFBQADgYEAK9Dr/drIyllq2tPMMi7JVBuK
+Yn4VLenZMdMu9Ccj/1urxUq2ckCuU3T0vAW0xtnIyXf7t/k0f3gA+Nak5FI/LEpj
+V4F1Wo7ojPsCwJTGKbqz3Bzosq/SLmJbGqmODszFV0VRFOlOHIilkfSj945RyKm+
+hjM+5i9Ibq9UkE6tsSU=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw
+CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl
+cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu
+LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT
+aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
+dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD
+VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT
+aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ
+bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu
+IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
+LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b
+N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t
+KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu
+kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm
+CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ
+Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu
+imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te
+2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe
+DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
+/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p
+F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt
+TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFVTCCBD2gAwIBAgIEO/OB0DANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQGEwJj
+aDEOMAwGA1UEChMFYWRtaW4xETAPBgNVBAsTCFNlcnZpY2VzMSIwIAYDVQQLExlD
+ZXJ0aWZpY2F0aW9uIEF1dGhvcml0aWVzMRYwFAYDVQQDEw1BZG1pbi1Sb290LUNB
+MB4XDTAxMTExNTA4NTEwN1oXDTIxMTExMDA3NTEwN1owbDELMAkGA1UEBhMCY2gx
+DjAMBgNVBAoTBWFkbWluMREwDwYDVQQLEwhTZXJ2aWNlczEiMCAGA1UECxMZQ2Vy
+dGlmaWNhdGlvbiBBdXRob3JpdGllczEWMBQGA1UEAxMNQWRtaW4tUm9vdC1DQTCC
+ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMvgr0QUIv5qF0nyXZ3PXAJi
+C4C5Wr+oVTN7oxIkXkxvO0GJToM9n7OVJjSmzBL0zJ2HXj0MDRcvhSY+KiZZc6Go
+vDvr5Ua481l7ILFeQAFtumeza+vvxeL5Nd0Maga2miiacLNAKXbAcUYRa0Ov5VZB
+++YcOYNNt/aisWbJqA2y8He+NsEgJzK5zNdayvYXQTZN+7tVgWOck16Da3+4FXdy
+fH1NCWtZlebtMKtERtkVAaVbiWW24CjZKAiVfggjsiLo3yVMPGj3budLx5D9hEEm
+vlyDOtcjebca+AcZglppWMX/iHIrx7740y0zd6cWEqiLIcZCrnpkr/KzwO135GkC
+AwEAAaOCAf0wggH5MA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIASBkTCBjjCBiwYI
+YIV0AREDAQAwfzArBggrBgEFBQcCAjAfGh1UaGlzIGlzIHRoZSBBZG1pbi1Sb290
+LUNBIENQUzBQBggrBgEFBQcCARZEaHR0cDovL3d3dy5pbmZvcm1hdGlrLmFkbWlu
+LmNoL1BLSS9saW5rcy9DUFNfMl8xNl83NTZfMV8xN18zXzFfMC5wZGYwfwYDVR0f
+BHgwdjB0oHKgcKRuMGwxFjAUBgNVBAMTDUFkbWluLVJvb3QtQ0ExIjAgBgNVBAsT
+GUNlcnRpZmljYXRpb24gQXV0aG9yaXRpZXMxETAPBgNVBAsTCFNlcnZpY2VzMQ4w
+DAYDVQQKEwVhZG1pbjELMAkGA1UEBhMCY2gwHQYDVR0OBBYEFIKf+iNzIPGXi7JM
+Tb5CxX9mzWToMIGZBgNVHSMEgZEwgY6AFIKf+iNzIPGXi7JMTb5CxX9mzWTooXCk
+bjBsMQswCQYDVQQGEwJjaDEOMAwGA1UEChMFYWRtaW4xETAPBgNVBAsTCFNlcnZp
+Y2VzMSIwIAYDVQQLExlDZXJ0aWZpY2F0aW9uIEF1dGhvcml0aWVzMRYwFAYDVQQD
+Ew1BZG1pbi1Sb290LUNBggQ784HQMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0B
+AQUFAAOCAQEAeE96XCYRpy6umkPKXDWCRn7INo96ZrWpMggcDORuofHIwdTkgOeM
+vWOxDN/yuT7CC3FAaUajbPRbDw0hRMcqKz0aC8CgwcyIyhw/rFK29mfNTG3EviP9
+QSsEbnelFnjpm1wjz4EaBiFjatwpUbI6+Zv3XbEt9QQXBn+c6DeFLe4xvC4B+MTr
+a440xTk59pSYux8OHhEvqIwHCkiijGqZhTS3KmGFeBopaR+dJVBRBMoXwzk4B3Hn
+0Zib1dEYFZa84vPJZyvxCbLOnPRDJgH6V2uQqbG+6DXVaf/wORVOvF/wzzv0viM/
+RWbEtJZdvo8N3sdtCULzifnxP/V0T9+4ZQ==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDOzCCAiOgAwIBAgIRANAeRlAAACmMAAAAAgAAAAIwDQYJKoZIhvcNAQEFBQAw
+PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD
+Ew5EU1QgUm9vdCBDQSBYNDAeFw0wMDA5MTMwNjIyNTBaFw0yMDA5MTMwNjIyNTBa
+MD8xJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjEXMBUGA1UE
+AxMORFNUIFJvb3QgQ0EgWDQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
+AQCthX3OFEYY8gSeIYur0O4ypOT68HnDrjLfIutL5PZHRwQGjzCPb9PFo/ihboJ8
+RvfGhBAqpQCo47zwYEhpWm1jB+L/OE/dBBiyn98krfU2NiBKSom2J58RBeAwHGEy
+cO+lewyjVvbDDLUy4CheY059vfMjPAftCRXjqSZIolQb9FdPcAoa90mFwB7rKniE
+J7vppdrUScSS0+eBrHSUPLdvwyn4RGp+lSwbWYcbg5EpSpE0GRJdchic0YDjvIoC
+YHpe7Rkj93PYRTQyU4bhC88ck8tMqbvRYqMRqR+vobbkrj5LLCOQCHV5WEoxWh+0
+E2SpIFe7RkV++MmpIAc0h1tZAgMBAAGjMjAwMA8GA1UdEwEB/wQFMAMBAf8wHQYD
+VR0OBBYEFPCD6nPIP1ubWzdf9UyPWvf0hki9MA0GCSqGSIb3DQEBBQUAA4IBAQCE
+G85wl5eEWd7adH6XW/ikGN5salvpq/Fix6yVTzE6CrhlP5LBdkf6kx1bSPL18M45
+g0rw2zA/MWOhJ3+S6U+BE0zPGCuu8YQaZibR7snm3HiHUaZNMu5c8D0x0bcMxDjY
+AVVcHCoNiL53Q4PLW27nbY6wwG0ffFKmgV3blxrYWfuUDgGpyPwHwkfVFvz9qjaV
+mf12VJffL6W8omBPtgteb6UaT/k1oJ7YI0ldGf+ngpVbRhD+LC3cUtT6GO/BEPZu
+8YTV/hbiDH5v3khVqMIeKT6o8IuXGG7F6a6vKwP1F1FwTXf4UC/ivhme7vdUH7B/
+Vv4AEbT8dNfEeFxrkDbh
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHBMQsw
+CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0Ns
+YXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH
+MjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9y
+aXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazAe
+Fw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTlaMIHBMQswCQYDVQQGEwJVUzEX
+MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGlj
+IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMx
+KGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s
+eTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazCBnzANBgkqhkiG9w0B
+AQEFAAOBjQAwgYkCgYEAp4gBIXQs5xoD8JjhlzwPIQjxnNuX6Zr8wgQGE75fUsjM
+HiwSViy4AWkszJkfrbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRCwiNPStjw
+DqL7MWzJ5m+ZJwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cC
+AwEAATANBgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9ji
+nb3/7aHmZuovCfTK1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAX
+rXfMSTWqz9iP0b63GJZHc2pUIjRkLbYWm1lbtFFZOrMLFPQS32eg9K0yZF6xRnIn
+jBJ7xUS0rg==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFGjCCBAKgAwIBAgIEPL7eEDANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQ
+TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu
+dHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBS
+b290Q0EwHhcNMDIwNDE4MTQ1NDA4WhcNMjYwOTIxMTU0MjE5WjB2MQswCQYDVQQG
+EwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMb
+Q2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MSAwHgYDVQQDExdDQyBTaWduZXQg
+LSBQQ0EgS2xhc2EgMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM7B
+rBlbN5maM5eg0BOTqoZ+9NBDvU8Lm5rTdrMswFTCathzpVVLK/JD4K3+4oCZ9SRA
+spEXE4gvwb08ASY6w5s+HpRkeJw8YzMFR5kDZD5adgnCAy4vDfIXYZgppXPaTQ8w
+nfUZ7BZ7Zfa7QBemUIcJIzJBB0UqgtxWCeol9IekpBRVmuuSA6QG0Jkm+pGDJ05y
+j2eQG8jTcBENM7sVA8rGRMyFA4skSZ+D0OG6FS2xC1i9JyN0ag1yII/LPx8HK5J4
+W9MaPRNjAEeaa2qI9EpchwrOxnyVbQfSedCG1VRJfAsE/9tT9CMUPZ3xW20QjQcS
+ZJqVcmGW9gVsXKQOVLsCAwEAAaOCAbMwggGvMA8GA1UdEwEB/wQFMAMBAf8wDgYD
+VR0PAQH/BAQDAgEGMIIBBAYDVR0gBIH8MIH5MIH2Bg0rBgEEAb4/AgEKAQEBMIHk
+MIGaBggrBgEFBQcCAjCBjRqBikNlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmll
+IHogZG9rdW1lbnRlbTogIlBvbGl0eWthIENlcnR5ZmlrYWNqaSBkbGEgUm9vdENB
+Ii4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6IFJvb3RDQSB3IGhpZXJhcmNo
+aWkgQ0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5zaWduZXQucGwv
+cmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY19yb290Y2EudHh0MEQGA1UdHwQ9MDsw
+OaA3oDWGM2h0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9yb290Y2Ev
+cm9vdGNhLmNybDAfBgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAdBgNV
+HQ4EFgQUwGxGyl2CfpYHRonE82AVXO08kMIwDQYJKoZIhvcNAQEFBQADggEBABp1
+TAUsa+BeVWg4cjowc8yTJ5XN3GvN96GObMkxUGY7U9kVrLI71xBgoNVyzXTiMNDB
+vjh7vdPWjpl5SDiRpnnKiOFXA43HvNWzUaOkTu1mxjJsZsanot1Xt6j0ZDC+03Fj
+LHdYMyM9kSWp6afb4980EPYZCcSzgM5TOGfJmNii5Tq468VFKrX+52Aou1G22Ohu
++EEOlOrG7ylKv1hHUJJCjwN0ZVEIn1nDbrU9FeGCz8J9ihVUvnENEBbBkU37PWqW
+uHitKQDVtcwTwJJdR8cmKq3NmkwAm9fPacidQLpaw0WkuGrS+fEDhu1Nhy9xELP6
+NA9GRTCNxm/dXlcwnmY=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIElTCCA/6gAwIBAgIEOJsRPDANBgkqhkiG9w0BAQQFADCBujEUMBIGA1UEChML
+RW50cnVzdC5uZXQxPzA9BgNVBAsUNnd3dy5lbnRydXN0Lm5ldC9TU0xfQ1BTIGlu
+Y29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDIwMDAg
+RW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJl
+IFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMDAyMDQxNzIwMDBa
+Fw0yMDAyMDQxNzUwMDBaMIG6MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDE/MD0GA1UE
+CxQ2d3d3LmVudHJ1c3QubmV0L1NTTF9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p
+dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMjAwMCBFbnRydXN0Lm5ldCBMaW1pdGVk
+MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp
+b24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDHwV9OcfHO
+8GCGD9JYf9Mzly0XonUwtZZkJi9ow0SrqHXmAGc0V55lxyKbc+bT3QgON1WqJUaB
+bL3+qPZ1V1eMkGxKwz6LS0MKyRFWmponIpnPVZ5h2QLifLZ8OAfc439PmrkDQYC2
+dWcTC5/oVzbIXQA23mYU2m52H083jIITiQIDAQABo4IBpDCCAaAwEQYJYIZIAYb4
+QgEBBAQDAgAHMIHjBgNVHR8EgdswgdgwgdWggdKggc+kgcwwgckxFDASBgNVBAoT
+C0VudHJ1c3QubmV0MT8wPQYDVQQLFDZ3d3cuZW50cnVzdC5uZXQvU1NMX0NQUyBp
+bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAyMDAw
+IEVudHJ1c3QubmV0IExpbWl0ZWQxOjA4BgNVBAMTMUVudHJ1c3QubmV0IFNlY3Vy
+ZSBTZXJ2ZXIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxDTALBgNVBAMTBENSTDEw
+KwYDVR0QBCQwIoAPMjAwMDAyMDQxNzIwMDBagQ8yMDIwMDIwNDE3NTAwMFowCwYD
+VR0PBAQDAgEGMB8GA1UdIwQYMBaAFMtswGvjuz7L/CKc/vuLkpyw8m4iMB0GA1Ud
+DgQWBBTLbMBr47s+y/winP77i5KcsPJuIjAMBgNVHRMEBTADAQH/MB0GCSqGSIb2
+fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQQFAAOBgQBi24GRzsia
+d0Iv7L0no1MPUBvqTpLwqa+poLpIYcvvyQbvH9X07t9WLebKahlzqlO+krNQAraF
+JnJj2HVQYnUUt7NQGj/KEQALhUVpbbalrlHhStyCP2yMNLJ3a9kC9n8O6mUE8c1U
+yrrJzOCE98g+EZfTYAkYvAX/bIkz8OwVDw==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEn
+MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL
+ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENo
+YW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYxNDE4WhcNMzcwOTMwMTYxNDE4WjB9
+MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgy
+NzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4G
+A1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUA
+A4IBDQAwggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0
+Mi+ITaFgCPS3CU6gSS9J1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/s
+QJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8Oby4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpV
+eAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl6DJWk0aJqCWKZQbua795
+B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c8lCrEqWh
+z0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0T
+AQH/BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1i
+ZXJzaWduLm9yZy9jaGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4w
+TcbOX60Qq+UDpfqpFDAOBgNVHQ8BAf8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAH
+MCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBjaGFtYmVyc2lnbi5vcmcwKgYD
+VR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9yZzBbBgNVHSAE
+VDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh
+bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0B
+AQUFAAOCAQEAPDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUM
+bKGKfKX0j//U2K0X1S0E0T9YgOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXi
+ryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJPJ7oKXqJ1/6v/2j1pReQvayZzKWG
+VwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4IBHNfTIzSJRUTN3c
+ecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREest2d/
+AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIE7TCCBFagAwIBAgIEOAOR7jANBgkqhkiG9w0BAQQFADCByTELMAkGA1UEBhMC
+VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MUgwRgYDVQQLFD93d3cuZW50cnVzdC5u
+ZXQvQ2xpZW50X0NBX0luZm8vQ1BTIGluY29ycC4gYnkgcmVmLiBsaW1pdHMgbGlh
+Yi4xJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV
+BAMTKkVudHJ1c3QubmV0IENsaWVudCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe
+Fw05OTEwMTIxOTI0MzBaFw0xOTEwMTIxOTU0MzBaMIHJMQswCQYDVQQGEwJVUzEU
+MBIGA1UEChMLRW50cnVzdC5uZXQxSDBGBgNVBAsUP3d3dy5lbnRydXN0Lm5ldC9D
+bGllbnRfQ0FfSW5mby9DUFMgaW5jb3JwLiBieSByZWYuIGxpbWl0cyBsaWFiLjEl
+MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMq
+RW50cnVzdC5uZXQgQ2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0G
+CSqGSIb3DQEBAQUAA4GLADCBhwKBgQDIOpleMRffrCdvkHvkGf9FozTC28GoT/Bo
+6oT9n3V5z8GKUZSvx1cDR2SerYIbWtp/N3hHuzeYEpbOxhN979IMMFGpOZ5V+Pux
+5zDeg7K6PvHViTs7hbqqdCz+PzFur5GVbgbUB01LLFZHGARS2g4Qk79jkJvh34zm
+AqTmT173iwIBA6OCAeAwggHcMBEGCWCGSAGG+EIBAQQEAwIABzCCASIGA1UdHwSC
+ARkwggEVMIHkoIHhoIHepIHbMIHYMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50
+cnVzdC5uZXQxSDBGBgNVBAsUP3d3dy5lbnRydXN0Lm5ldC9DbGllbnRfQ0FfSW5m
+by9DUFMgaW5jb3JwLiBieSByZWYuIGxpbWl0cyBsaWFiLjElMCMGA1UECxMcKGMp
+IDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQg
+Q2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCyg
+KqAohiZodHRwOi8vd3d3LmVudHJ1c3QubmV0L0NSTC9DbGllbnQxLmNybDArBgNV
+HRAEJDAigA8xOTk5MTAxMjE5MjQzMFqBDzIwMTkxMDEyMTkyNDMwWjALBgNVHQ8E
+BAMCAQYwHwYDVR0jBBgwFoAUxPucKXuXzUyW/O5bs8qZdIuV6kwwHQYDVR0OBBYE
+FMT7nCl7l81MlvzuW7PKmXSLlepMMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA
+BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEEBQADgYEAP66K8ddmAwWePvrqHEa7
+pFuPeJoSSJn59DXeDDYHAmsQOokUgZwxpnyyQbJq5wcBoUv5nyU7lsqZwz6hURzz
+wy5E97BnRqqS5TvaHBkUODDV4qIxJS7x7EU47fgGWANzYrAQMY9Av2TgXD7FTx/a
+EkP/TOYGJqibGapEPHayXOw=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcoxCzAJ
+BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVy
+aVNpZ24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24s
+IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNp
+Z24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
+eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcxNjIzNTk1OVowgcoxCzAJBgNV
+BAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNp
+Z24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIElu
+Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24g
+Q2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt
+IEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArwoNwtUs22e5LeWU
+J92lvuCwTY+zYVY81nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6tW8UvxDO
+JxOeBUebMXoT2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUY
+wZF7C9UTAJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9o
+koqQHgiBVrKtaaNS0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjN
+qWm6o+sdDZykIKbBoMXRRkwXbdKsZj+WjOCE1Db/IlnF+RFgqF8EffIa9iVCYQ/E
+Srg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0JhU8wI1NQ0kdvekhktdmnLfe
+xbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf0xwLRtxyID+u
+7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydEp85EXdQbkJgNHkKU
+sQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377BMnMiIYtYgXsVkXq642RI
+sH/7NiXaldDxJBQX3RiAa0YjOVT1jmIJBB2UkKab5iXiQkWquJCtvgiPqQtCGJTP
+cjnhsUPgKM+351psE2tJs//jGHyJizNdrDPXp/naOlXJWBD5qu9ats9LS98q
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMC
+VVMxFDASBgNVBAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBD
+ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9v
+dCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDAxMDExMTY0MTI4WhcNMjEwMTE0
+MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dlbGxzIEZhcmdvMSww
+KgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEvMC0G
+A1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEi
+MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n13
+5zHCLielTWi5MbqNQ1mXx3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHE
+SxP9cMIlrCL1dQu3U+SlK93OvRw6esP3E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4O
+JgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5OEL8pahbSCOz6+MlsoCu
+ltQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4jsNtlAHCE
+AQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMB
+AAGjYTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcB
+CzAyMDAGCCsGAQUFBwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRw
+b2xpY3kwDQYJKoZIhvcNAQEFBQADggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo
+7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrvm+0fazbuSCUlFLZWohDo7qd/
+0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0ROhPs7fpvcmR7
+nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx
+x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ
+33ZwmVxwQ023tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDtjCCAp6gAwIBAgIOBcAAAQACQdAGCk3OdRAwDQYJKoZIhvcNAQEFBQAwdjEL
+MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV
+BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDQgQ0ExJTAjBgNVBAMTHFRDIFRydXN0
+Q2VudGVyIENsYXNzIDQgQ0EgSUkwHhcNMDYwMzIzMTQxMDIzWhcNMjUxMjMxMjI1
+OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i
+SDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgNCBDQTElMCMGA1UEAxMc
+VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgNCBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD
+ggEPADCCAQoCggEBALXNTJytrlG7fEjFDSmGehSt2VA9CXIgDRS2Y8b+WJ7gIV7z
+jyIZ3E6RIM1viCmis8GsKnK6i1S4QF/yqvhDhsIwXMynXX/GCEnkDjkvjhjWkd0j
+FnmA22xIHbzB3ygQY9GB493fL3l1oht48pQB5hBiecugfQLANIJ7x8CtHUzXapZ2
+W78mhEj9h/aECqqSB5lIPGG8ToVYx5ct/YFKocabEvVCUNFkPologiJw3fX64yhC
+L04y87OjNopq1mJcrPoBbbTgci6VaLTxkwzGioLSHVPqfOA/QrcSWrjN2qUGZ8uh
+d32llvCSHmcOHUJG5vnt+0dTf1cERh9GX8eu4I8CAwEAAaNCMEAwDwYDVR0TAQH/
+BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFB/quz4lGwa9pd1iBX7G
+TFq/6A9DMA0GCSqGSIb3DQEBBQUAA4IBAQBYpCubTPfkpJKknGWYGWIi/HIy6QRd
+xMRwLVpG3kxHiiW5ot3u6hKvSI3vK2fbO8w0mCr3CEf/Iq978fTr4jgCMxh1KBue
+dmWsiANy8jhHHYz1nwqIUxAUu4DlDLNdjRfuHhkcho0UZ3iMksseIUn3f9MYv5x5
++F0IebWqak2SNmy8eesOPXmK2PajVnBd3ttPedJ60pVchidlvqDTB4FAVd0Qy+BL
+iILAkH0457+W4Ze6mqtCD9Of2J4VMxHL94J59bXAQVaS4d9VA61Iz9PyLrHHLVZM
+ZHQqMc7cdalUR6SnQnIJ5+ECpkeyBM1CE+FhDOB4OiIgohxgQoaH96Xm
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEd
+MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3Mg
+Q2xhc3MgMyBDQSAxMB4XDTA1MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzEL
+MAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MR0wGwYD
+VQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKxifZg
+isRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//z
+NIqeKNc0n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI
++MkcVyzwPX6UvCWThOiaAJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2R
+hzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+
+mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNCMEAwDwYDVR0TAQH/BAUw
+AwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0PAQH/BAQD
+AgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFP
+Bdy7pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27s
+EzNxZy5p+qksP2bAEllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2
+mSlf56oBzKwzqBwKu5HEA6BvtjT5htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yC
+e/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQjel/wroQk5PMr+4okoyeYZdow
+dXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIIDjCCBfagAwIBAgIJAOiOtsn4KhQoMA0GCSqGSIb3DQEBBQUAMIG8MQswCQYD
@@ -3812,86 +5363,211 @@ yaXG67Ljxay2oHA1u8hRadDytaIybrw/oDc5fHE2pgXfDBLkFqfF1stjo5VwP+YE
o2A=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
-MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc
-MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj
-IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB
-IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE
-RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl
-U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290
-IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU
-ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC
-QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr
-rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S
-NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc
-QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH
-txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP
-BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC
-AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp
-tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa
-IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl
-6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+
-xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU
-Cm26OWMohpLzGITY+9HPBVZkVw==
+MIIHPTCCBSWgAwIBAgIBADANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290
+IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB
+IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA
+Y2FjZXJ0Lm9yZzAeFw0wMzAzMzAxMjI5NDlaFw0zMzAzMjkxMjI5NDlaMHkxEDAO
+BgNVBAoTB1Jvb3QgQ0ExHjAcBgNVBAsTFWh0dHA6Ly93d3cuY2FjZXJ0Lm9yZzEi
+MCAGA1UEAxMZQ0EgQ2VydCBTaWduaW5nIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJ
+ARYSc3VwcG9ydEBjYWNlcnQub3JnMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
+CgKCAgEAziLA4kZ97DYoB1CW8qAzQIxL8TtmPzHlawI229Z89vGIj053NgVBlfkJ
+8BLPRoZzYLdufujAWGSuzbCtRRcMY/pnCujW0r8+55jE8Ez64AO7NV1sId6eINm6
+zWYyN3L69wj1x81YyY7nDl7qPv4coRQKFWyGhFtkZip6qUtTefWIonvuLwphK42y
+fk1WpRPs6tqSnqxEQR5YYGUFZvjARL3LlPdCfgv3ZWiYUQXw8wWRBB0bF4LsyFe7
+w2t6iPGwcswlWyCR7BYCEo8y6RcYSNDHBS4CMEK4JZwFaz+qOqfrU0j36NK2B5jc
+G8Y0f3/JHIJ6BVgrCFvzOKKrF11myZjXnhCLotLddJr3cQxyYN/Nb5gznZY0dj4k
+epKwDpUeb+agRThHqtdB7Uq3EvbXG4OKDy7YCbZZ16oE/9KTfWgu3YtLq1i6L43q
+laegw1SJpfvbi1EinbLDvhG+LJGGi5Z4rSDTii8aP8bQUWWHIbEZAWV/RRyH9XzQ
+QUxPKZgh/TMfdQwEUfoZd9vUFBzugcMd9Zi3aQaRIt0AUMyBMawSB3s42mhb5ivU
+fslfrejrckzzAeVLIL+aplfKkQABi6F1ITe1Yw1nPkZPcCBnzsXWWdsC4PDSy826
+YreQQejdIOQpvGQpQsgi3Hia/0PsmBsJUUtaWsJx8cTLc6nloQsCAwEAAaOCAc4w
+ggHKMB0GA1UdDgQWBBQWtTIb1Mfz4OaO873SsDrusjkY0TCBowYDVR0jBIGbMIGY
+gBQWtTIb1Mfz4OaO873SsDrusjkY0aF9pHsweTEQMA4GA1UEChMHUm9vdCBDQTEe
+MBwGA1UECxMVaHR0cDovL3d3dy5jYWNlcnQub3JnMSIwIAYDVQQDExlDQSBDZXJ0
+IFNpZ25pbmcgQXV0aG9yaXR5MSEwHwYJKoZIhvcNAQkBFhJzdXBwb3J0QGNhY2Vy
+dC5vcmeCAQAwDwYDVR0TAQH/BAUwAwEB/zAyBgNVHR8EKzApMCegJaAjhiFodHRw
+czovL3d3dy5jYWNlcnQub3JnL3Jldm9rZS5jcmwwMAYJYIZIAYb4QgEEBCMWIWh0
+dHBzOi8vd3d3LmNhY2VydC5vcmcvcmV2b2tlLmNybDA0BglghkgBhvhCAQgEJxYl
+aHR0cDovL3d3dy5jYWNlcnQub3JnL2luZGV4LnBocD9pZD0xMDBWBglghkgBhvhC
+AQ0ESRZHVG8gZ2V0IHlvdXIgb3duIGNlcnRpZmljYXRlIGZvciBGUkVFIGhlYWQg
+b3ZlciB0byBodHRwOi8vd3d3LmNhY2VydC5vcmcwDQYJKoZIhvcNAQEEBQADggIB
+ACjH7pyCArpcgBLKNQodgW+JapnM8mgPf6fhjViVPr3yBsOQWqy1YPaZQwGjiHCc
+nWKdpIevZ1gNMDY75q1I08t0AoZxPuIrA2jxNGJARjtT6ij0rPtmlVOKTV39O9lg
+18p5aTuxZZKmxoGCXJzN600BiqXfEVWqFcofN8CCmHBh22p8lqOOLlQ+TyGpkO/c
+gr/c6EWtTZBzCDyUZbAEmXZ/4rzCahWqlwQ3JNgelE5tDlG+1sSPypZt90Pf6DBl
+Jzt7u0NDY8RD97LsaMzhGY4i+5jhe1o+ATc7iwiwovOVThrLm82asduycPAtStvY
+sONvRUgzEv/+PDIqVPfE94rwiCPCR/5kenHA0R6mY7AHfqQv0wGP3J8rtsYIqQ+T
+SCX8Ev2fQtzzxD72V7DX3WnRBnc0CkvSyqD/HMaMyRa+xMwyN2hzXwj7UfdJUzYF
+CpUCTPJ5GhD22Dp1nPMd8aINcGeGG7MW9S/lpOt5hvk9C8JzC6WZrG/8Z7jlLwum
+GCSNe9FINSkYQKyTYOGWhlC0elnYjyELn8+CkcY7v2vcB5G5l1YjqrZslMZIBjzk
+zk6q5PYvCdxTby78dOs6Y5nCpqyJvKeyRKANihDjbPIky/qbn3BHLt4Ui9SyIAmW
+omTxJBzcoTWcFbLUvFUufQb1nA5V9FrWk9p2rSVzTMVD
-----END CERTIFICATE-----
-
-----BEGIN CERTIFICATE-----
-MIIGJDCCBY2gAwIBAgIEQoaroDANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC
-VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u
-ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc
-KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u
-ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjA3
-MTQxNzEwMjhaFw0xNDA3MTQxNzQwMjhaMFwxCzAJBgNVBAYTAlVTMRUwEwYDVQQK
-EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xGzAZBgNV
-BAMTEkRpZ2lDZXJ0IEdsb2JhbCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
-AQoCggEBAMQ8vMy66mLmnkIjr7SyEa5ijdmh04/MFHIZ7Zn2/d5du1nAsMKvaplS
-lVcLNf/hhvqvosPBBWUnIHYvClQlfOor3ZVBV5sPO89H6AEGjMVESPwHLvNygzBR
-lJ5pOoOph5AU2V7EoniPwT7UGWEOGufcGpUgQb5vF9q4HEHumLD61x01PxanBCgT
-XT0FdZouhp4ssBeHIFhX7+HqVWC4LHAhrCljDBD8YLz51Rw3ZNW0+x6rJjlGiKTL
-zTBnwCZ55cpo+SLX5dKxu0hMmwuYW0KS5dLtDkcw+t0nVmNqpQHHjq/wTjsbVRVE
-1T5NVx7hkeq4oI/OOmNflom6CD7+RLsCAwEAAaOCAwUwggMBMBIGA1UdEwEB/wQI
-MAYBAf8CAQAwggEyBgNVHSAEggEpMIIBJTCCASEGCSqGSIb2fQdLAjCCARIwJgYI
-KwYBBQUHAgEWGmh0dHA6Ly93d3cuZW50cnVzdC5uZXQvY3BzMIHnBggrBgEFBQcC
-AjCB2hqB10ZvciB1c2Ugc29sZWx5IHdpdGggU1NMIGFuZCBTL01JTUUgY2VydGlm
-aWNhdGVzIGlzc3VlZCBieSBEaWdpY2VydCwgSW5jLiB0byBhdXRob3JpemVkIHN1
-YnNjcmliZXJzLg0KRE9FUyBOT1QgcmVwcmVzZW50IGFueSBlbmRvcnNlbWVudCBi
-eSBFbnRydXN0IEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMgYXMgdG8gdGhlIGlkZW50
-aXR5IG9mIGFueSBjZXJ0aWZpY2F0ZSBob2xkZXIuMDEGA1UdJQQqMCgGCCsGAQUF
-BwMBBggrBgEFBQcDAgYIKwYBBQUHAwQGCCsGAQUFBwMJMIIBGAYDVR0fBIIBDzCC
-AQswKKAmoCSGImh0dHA6Ly9jcmwuZW50cnVzdC5uZXQvc2VydmVyMS5jcmwwgd6g
-gduggdikgdUwgdIxCzAJBgNVBAYTAlVTMRQwEgYDVQQKEwtFbnRydXN0Lm5ldDE7
-MDkGA1UECxMyd3d3LmVudHJ1c3QubmV0L0NQUyBpbmNvcnAuIGJ5IHJlZi4gKGxp
-bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0
-ZWQxOjA4BgNVBAMTMUVudHJ1c3QubmV0IFNlY3VyZSBTZXJ2ZXIgQ2VydGlmaWNh
-dGlvbiBBdXRob3JpdHkxDTALBgNVBAMTBENSTDEwCwYDVR0PBAQDAgEGMB8GA1Ud
-IwQYMBaAFPAXYhNVPbP/CgBr+1CEl/PtYtAaMB0GA1UdDgQWBBSnxxOgegE8ne+C
-SIJI1XNRthJWKjAZBgkqhkiG9n0HQQAEDDAKGwRWNy4xAwIAgTANBgkqhkiG9w0B
-AQUFAAOBgQBK8bPOaGnjWKNh7bYWyJOxGDA+4HLfTz3iTeG4/D/ByeNFqV2pwdqj
-5TbXjtYPrTavbLxE5ppGlKYRoNBS59pVsPYchftjUnu2mY8f4stHZKLrCGXmUdsc
-S21/U58eDTGT1DBdHm4BBydgXbvT9ONsHSAPdSozEKe3idepFxQyAw==
+MIID5jCCAs6gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMCVVMx
+HTAbBgNVBAoTFEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNBbWVyaWNh
+IE9ubGluZSBJbmMuMTcwNQYDVQQDEy5BT0wgVGltZSBXYXJuZXIgUm9vdCBDZXJ0
+aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyOTA2MDAwMFoXDTM3MTEyMDE1
+MDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRBT0wgVGltZSBXYXJuZXIg
+SW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUgSW5jLjE3MDUGA1UEAxMuQU9M
+IFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIw
+DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnej8Mlo2k06AX3dLm/WpcZuS+U
+0pPlLYnKhHw/EEMbjIt8hFj4JHxIzyr9wBXZGH6EGhfT257XyuTZ16pYUYfw8ItI
+TuLCxFlpMGK2MKKMCxGZYTVtfu/FsRkGIBKOQuHfD5YQUqjPnF+VFNivO3ULMSAf
+RC+iYkGzuxgh28pxPIzstrkNn+9R7017EvILDOGsQI93f7DKeHEMXRZxcKLXwjqF
+zQ6axOAAsNUl6twr5JQtOJyJQVdkKGUZHLZEtMgxa44Be3ZZJX8VHIQIfHNlIAqh
+BC4aMqiaILGcLCFZ5/vP7nAtCMpjPiybkxlqpMKX/7eGV4iFbJ4VFitNLLMCAwEA
+AaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUoTYwFsuGkABFgFOxj8jY
+PXy+XxIwHwYDVR0jBBgwFoAUoTYwFsuGkABFgFOxj8jYPXy+XxIwDgYDVR0PAQH/
+BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQCKIBilvrMvtKaEAEAwKfq0FHNMeUWn
+9nDg6H5kHgqVfGphwu9OH77/yZkfB2FK4V1Mza3u0FIy2VkyvNp5ctZ7CegCgTXT
+Ct8RHcl5oIBN/lrXVtbtDyqvpxh1MwzqwWEFT2qaifKNuZ8u77BfWgDrvq2g+EQF
+Z7zLBO+eZMXpyD8Fv8YvBxzDNnGGyjhmSs3WuEvGbKeXO/oTLW4jYYehY0KswsuX
+n2Fozy1MBJ3XJU8KDk2QixhWqJNIV9xvrr2eZ1d3iVCzvhGbRWeDhhmH05i9CBoW
+H1iCC+GWaQVLjuyDUTEH1dSf/1l7qG6Fz9NLqUmwX7A5KGgOc90lmt4S
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDfTCCAuagAwIBAgIDErvmMA0GCSqGSIb3DQEBBQUAME4xCzAJBgNVBAYTAlVT
+MRAwDgYDVQQKEwdFcXVpZmF4MS0wKwYDVQQLEyRFcXVpZmF4IFNlY3VyZSBDZXJ0
+aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDIwNTIxMDQwMDAwWhcNMTgwODIxMDQwMDAw
+WjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UE
+AxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9m
+OSm9BXiLnTjoBbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIu
+T8rxh0PBFpVXLVDviS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6c
+JmTM386DGXHKTubU1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmR
+Cw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5asz
+PeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo4HwMIHtMB8GA1UdIwQYMBaAFEjm
+aPkr0rKV10fYIyAQTzOYkJ/UMB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrM
+TjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjA6BgNVHR8EMzAxMC+g
+LaArhilodHRwOi8vY3JsLmdlb3RydXN0LmNvbS9jcmxzL3NlY3VyZWNhLmNybDBO
+BgNVHSAERzBFMEMGBFUdIAAwOzA5BggrBgEFBQcCARYtaHR0cHM6Ly93d3cuZ2Vv
+dHJ1c3QuY29tL3Jlc291cmNlcy9yZXBvc2l0b3J5MA0GCSqGSIb3DQEBBQUAA4GB
+AHbhEm5OSxYShjAGsoEIz/AIx8dxfmbuwu3UOx//8PDITtZDOLC5MH0Y0FWDomrL
+NhGc6Ehmo21/uBPUR/6LWlxz/K7ZGzIZOKuXNBSqltLroxwUCEm2u+WR74M26x1W
+b8ravHNjkOR/ez4iyz0H7V84dJzjA1BOoa+Y7mHyhD8S
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEb
+MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow
+GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRp
+ZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVow
+fjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
+A1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAiBgNV
+BAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEB
+BQADggEPADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPM
+cm3ye5drswfxdySRXyWP9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3S
+HpR7LZQdqnXXs5jLrLxkU0C8j6ysNstcrbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996
+CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rCoznl2yY4rYsK7hljxxwk
+3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3Vp6ea5EQz
+6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNV
+HQ4EFgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1Ud
+EwEB/wQFMAMBAf8wgYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2Rv
+Y2EuY29tL1NlY3VyZUNlcnRpZmljYXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRw
+Oi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmww
+DQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm4J4oqF7Tt/Q0
+5qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj
+Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtI
+gKvcnDe4IRRLDXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJ
+aD61JlfutuC23bkpgHl9j6PwpCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDl
+izeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1HRR3B7Hzs/Sk=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0
+IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz
+BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y
+aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG
+9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy
+NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y
+azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
+YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw
+Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl
+cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY
+dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9
+WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS
+v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v
+UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu
+IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC
+W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
-MIIEUDCCA7mgAwIBAgIJAN4ppNGwj6yIMA0GCSqGSIb3DQEBBAUAMIHMMQswCQYD
-VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZyYW5j
-aXNjbzEZMBcGA1UEChMQTGluZGVuIExhYiwgSW5jLjEpMCcGA1UECxMgTGluZGVu
-IExhYiBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxKTAnBgNVBAMTIExpbmRlbiBMYWIg
-Q2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYJKoZIhvcNAQkBFhBjYUBsaW5kZW5s
-YWIuY29tMB4XDTA1MDQyMTAyNDAzMVoXDTI1MDQxNjAyNDAzMVowgcwxCzAJBgNV
-BAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNp
-c2NvMRkwFwYDVQQKExBMaW5kZW4gTGFiLCBJbmMuMSkwJwYDVQQLEyBMaW5kZW4g
-TGFiIENlcnRpZmljYXRlIEF1dGhvcml0eTEpMCcGA1UEAxMgTGluZGVuIExhYiBD
-ZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgkqhkiG9w0BCQEWEGNhQGxpbmRlbmxh
-Yi5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAKXh1MThucdTbMg9bYBO
-rAm8yWns32YojB0PRfbq8rUjepEhTm3/13s0u399Uc202v4ejcGhkIDWJZd2NZMF
-oKrhmRfxGHSKPCuFaXC3jh0lRECj7k8FoPkcmaPjSyodrDFDUUuv+C06oYJoI+rk
-8REyal9NwgHvqCzOrZtiTXAdAgMBAAGjggE2MIIBMjAdBgNVHQ4EFgQUO1zK2e1f
-1wO1fHAjq6DTJobKDrcwggEBBgNVHSMEgfkwgfaAFDtcytntX9cDtXxwI6ug0yaG
-yg63oYHSpIHPMIHMMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEW
-MBQGA1UEBxMNU2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQTGluZGVuIExhYiwgSW5j
-LjEpMCcGA1UECxMgTGluZGVuIExhYiBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxKTAn
-BgNVBAMTIExpbmRlbiBMYWIgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYJKoZI
-hvcNAQkBFhBjYUBsaW5kZW5sYWIuY29tggkA3imk0bCPrIgwDAYDVR0TBAUwAwEB
-/zANBgkqhkiG9w0BAQQFAAOBgQA/ZkgfvwHYqk1UIAKZS3kMCxz0HvYuEQtviwnu
-xA39CIJ65Zozs28Eg1aV9/Y+Of7TnWhW+U3J3/wD/GghaAGiKK6vMn9gJBIdBX/9
-e6ef37VGyiOEFFjnUIbuk0RWty0orN76q/lI/xjCi15XSA/VSq2j4vmnwfZcPTDu
-glmQ1A==
+MIIFFjCCBH+gAwIBAgIBADANBgkqhkiG9w0BAQQFADCBsDELMAkGA1UEBhMCSUwx
+DzANBgNVBAgTBklzcmFlbDEOMAwGA1UEBxMFRWlsYXQxFjAUBgNVBAoTDVN0YXJ0
+Q29tIEx0ZC4xGjAYBgNVBAsTEUNBIEF1dGhvcml0eSBEZXAuMSkwJwYDVQQDEyBG
+cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJARYS
+YWRtaW5Ac3RhcnRjb20ub3JnMB4XDTA1MDMxNzE3Mzc0OFoXDTM1MDMxMDE3Mzc0
+OFowgbAxCzAJBgNVBAYTAklMMQ8wDQYDVQQIEwZJc3JhZWwxDjAMBgNVBAcTBUVp
+bGF0MRYwFAYDVQQKEw1TdGFydENvbSBMdGQuMRowGAYDVQQLExFDQSBBdXRob3Jp
+dHkgRGVwLjEpMCcGA1UEAxMgRnJlZSBTU0wgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
+dHkxITAfBgkqhkiG9w0BCQEWEmFkbWluQHN0YXJ0Y29tLm9yZzCBnzANBgkqhkiG
+9w0BAQEFAAOBjQAwgYkCgYEA7YRgACOeyEpRKSfeOqE5tWmrCbIvNP1h3D3TsM+x
+18LEwrHkllbEvqoUDufMOlDIOmKdw6OsWXuO7lUaHEe+o5c5s7XvIywI6Nivcy+5
+yYPo7QAPyHWlLzRMGOh2iCNJitu27Wjaw7ViKUylS7eYtAkUEKD4/mJ2IhULpNYI
+LzUCAwEAAaOCAjwwggI4MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgHmMB0G
+A1UdDgQWBBQcicOWzL3+MtUNjIExtpidjShkjTCB3QYDVR0jBIHVMIHSgBQcicOW
+zL3+MtUNjIExtpidjShkjaGBtqSBszCBsDELMAkGA1UEBhMCSUwxDzANBgNVBAgT
+BklzcmFlbDEOMAwGA1UEBxMFRWlsYXQxFjAUBgNVBAoTDVN0YXJ0Q29tIEx0ZC4x
+GjAYBgNVBAsTEUNBIEF1dGhvcml0eSBEZXAuMSkwJwYDVQQDEyBGcmVlIFNTTCBD
+ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJARYSYWRtaW5Ac3Rh
+cnRjb20ub3JnggEAMB0GA1UdEQQWMBSBEmFkbWluQHN0YXJ0Y29tLm9yZzAdBgNV
+HRIEFjAUgRJhZG1pbkBzdGFydGNvbS5vcmcwEQYJYIZIAYb4QgEBBAQDAgAHMC8G
+CWCGSAGG+EIBDQQiFiBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAy
+BglghkgBhvhCAQQEJRYjaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL2NhLWNybC5j
+cmwwKAYJYIZIAYb4QgECBBsWGWh0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy8wOQYJ
+YIZIAYb4QgEIBCwWKmh0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9pbmRleC5waHA/
+YXBwPTExMTANBgkqhkiG9w0BAQQFAAOBgQBscSXhnjSRIe/bbL0BCFaPiNhBOlP1
+ct8nV0t2hPdopP7rPwl+KLhX6h/BquL/lp9JmeaylXOWxkjHXo0Hclb4g4+fd68p
+00UOpO6wNnQt8M2YI3s3S9r+UZjEHjQ8iP2ZO1CnwYszx8JSFhKVU2Ui77qLzmLb
+cCOxgN8aIDjnfg==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcN
+AQkBFglwa2lAc2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZp
+dHNlZXJpbWlza2Vza3VzMRAwDgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMw
+MVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMQsw
+CQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEQ
+MA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+AIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOB
+SvZiF3tfTQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkz
+ABpTpyHhOEvWgxutr2TC+Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvH
+LCu3GFH+4Hv2qEivbDtPL+/40UceJlfwUR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMP
+PbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDaTpxt4brNj3pssAki14sL
+2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQFMAMBAf8w
+ggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwIC
+MIHDHoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDk
+AGwAagBhAHMAdABhAHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0
+AHMAZQBlAHIAaQBtAGkAcwBrAGUAcwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABz
+AGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABrAGkAbgBuAGkAdABhAG0AaQBz
+AGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nwcy8wKwYDVR0f
+BCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE
+FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcY
+P2/v6X2+MA4GA1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOi
+CfP+JmeaUOTDBS8rNXiRTHyoERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+g
+kcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyLabVAyJRld/JXIWY7zoVAtjNjGr95
+HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678IIbsSt4beDI3poHS
+na9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkhMp6q
+qIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0Z
+TbvGRNs2yyqcjg==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJO
+TDEeMBwGA1UEChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFh
+dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEy
+MTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4wHAYDVQQKExVTdGFhdCBkZXIgTmVk
+ZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENB
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFtvszn
+ExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw71
+9tV2U02PjLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MO
+hXeiD+EwR+4A5zN9RGcaC1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+U
+tFE5A3+y3qcym7RHjm+0Sq7lr7HcsBthvJly3uSJt3omXdozSVtSnA71iq3DuD3o
+BmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn622r+I/q85Ej0ZytqERAh
+SQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRVHSAAMDww
+OgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMv
+cm9vdC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA
+7Jbg0zTBLL9s+DANBgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k
+/rvuFbQvBgwp8qiSpGEN/KtcCFtREytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzm
+eafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbwMVcoEoJz6TMvplW0C5GUR5z6
+u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3ynGQI0DvDKcWy
+7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR
+iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw==
-----END CERTIFICATE-----
diff --git a/indra/newview/app_settings/cmd_line.xml b/indra/newview/app_settings/cmd_line.xml
index 1b8393330d..15434f2b8f 100644
--- a/indra/newview/app_settings/cmd_line.xml
+++ b/indra/newview/app_settings/cmd_line.xml
@@ -220,8 +220,7 @@
<map>
<key>desc</key>
<string>Set the detail level.
- 0 - low, 1 - medium, 2 - high, 3 - ultra
- </string>
+0 - low, 1 - medium, 2 - high, 3 - ultra</string>
<key>count</key>
<integer>1</integer>
</map>
@@ -229,10 +228,7 @@
<key>setdefault</key>
<map>
<key>desc</key>
- <string> specify the value of a particular
- configuration variable which can be
- overridden by settings.xml
- </string>
+ <string>specify the value of a particular configuration variable which can be overridden by settings.xml.</string>
<key>count</key>
<integer>2</integer>
<!-- Special case. Mapped to settings procedurally. -->
@@ -241,10 +237,7 @@
<key>set</key>
<map>
<key>desc</key>
- <string> specify the value of a particular
- configuration variable that
- overrides all other settings
- </string>
+ <string>specify the value of a particular configuration variable that overrides all other settings.</string>
<key>count</key>
<integer>2</integer>
<key>compose</key>
@@ -261,6 +254,24 @@
<!-- Special case. Mapped to settings procedurally. -->
</map>
+ <key>sessionsettings</key>
+ <map>
+ <key>desc</key>
+ <string>Specify the filename of a configuration file that contains temporary per-session configuration overrides.</string>
+ <key>count</key>
+ <integer>1</integer>
+ <!-- Special case. Mapped to settings procedurally. -->
+ </map>
+
+ <key>usersessionsettings</key>
+ <map>
+ <key>desc</key>
+ <string>Specify the filename of a configuration file that contains temporary per-session configuration user overrides.</string>
+ <key>count</key>
+ <integer>1</integer>
+ <!-- Special case. Mapped to settings procedurally. -->
+ </map>
+
<key>login</key>
<map>
<key>desc</key>
@@ -399,6 +410,5 @@
<key>map-to</key>
<string>DisableCrashLogger</string>
</map>
-
</map>
</llsd>
diff --git a/indra/newview/app_settings/commands.xml b/indra/newview/app_settings/commands.xml
new file mode 100644
index 0000000000..73df064ab2
--- /dev/null
+++ b/indra/newview/app_settings/commands.xml
@@ -0,0 +1,252 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<commands>
+ <command name="aboutland"
+ available_in_toybox="true"
+ icon="Command_AboutLand_Icon"
+ label_ref="Command_AboutLand_Label"
+ tooltip_ref="Command_AboutLand_Tooltip"
+ execute_function="Floater.ToggleOrBringToFront"
+ execute_parameters="about_land"
+ is_running_function="Floater.IsOpen"
+ is_running_parameters="about_land"
+ />
+ <command name="appearance"
+ available_in_toybox="true"
+ icon="Command_Appearance_Icon"
+ label_ref="Command_Appearance_Label"
+ tooltip_ref="Command_Appearance_Tooltip"
+ execute_function="Floater.ToggleOrBringToFront"
+ execute_parameters="appearance"
+ is_running_function="Floater.IsOpen"
+ is_running_parameters="appearance"
+ />
+ <command name="avatar"
+ available_in_toybox="true"
+ icon="Command_Avatar_Icon"
+ label_ref="Command_Avatar_Label"
+ tooltip_ref="Command_Avatar_Tooltip"
+ execute_function="Floater.ToggleOrBringToFront"
+ execute_parameters="avatar"
+ is_running_function="Floater.IsOpen"
+ is_running_parameters="avatar"
+ />
+ <command name="build"
+ available_in_toybox="true"
+ icon="Command_Build_Icon"
+ label_ref="Command_Build_Label"
+ tooltip_ref="Command_Build_Tooltip"
+ execute_function="Build.Toggle"
+ execute_parameters="build"
+ is_enabled_function="Build.Enabled"
+ is_enabled_parameters="build"
+ is_running_function="Floater.IsOpen"
+ is_running_parameters="build"
+ />
+ <command name="chat"
+ available_in_toybox="true"
+ icon="Command_Chat_Icon"
+ label_ref="Command_Chat_Label"
+ tooltip_ref="Command_Chat_Tooltip"
+ execute_function="Floater.ToggleOrBringToFront"
+ execute_parameters="chat_bar"
+ is_running_function="Floater.IsOpen"
+ is_running_parameters="chat_bar"
+ />
+ <command name="compass"
+ available_in_toybox="false"
+ icon="Command_Compass_Icon"
+ label_ref="Command_Compass_Label"
+ tooltip_ref="Command_Compass_Tooltip"
+ execute_function="Floater.ToggleOrBringToFront"
+ execute_parameters="compass"
+ is_running_function="Floater.IsOpen"
+ is_running_parameters="compass"
+ />
+ <command name="destinations"
+ available_in_toybox="true"
+ icon="Command_Destinations_Icon"
+ label_ref="Command_Destinations_Label"
+ tooltip_ref="Command_Destinations_Tooltip"
+ execute_function="Floater.ToggleOrBringToFront"
+ execute_parameters="destinations"
+ is_running_function="Floater.IsOpen"
+ is_running_parameters="destinations"
+ />
+ <command name="gestures"
+ available_in_toybox="true"
+ icon="Command_Gestures_Icon"
+ label_ref="Command_Gestures_Label"
+ tooltip_ref="Command_Gestures_Tooltip"
+ execute_function="Floater.ToggleOrBringToFront"
+ execute_parameters="gestures"
+ is_running_function="Floater.IsOpen"
+ is_running_parameters="gestures"
+ />
+ <command name="howto"
+ available_in_toybox="true"
+ icon="Command_HowTo_Icon"
+ label_ref="Command_HowTo_Label"
+ tooltip_ref="Command_HowTo_Tooltip"
+ execute_function="Help.ToggleHowTo"
+ is_running_function="Help.HowToVisible"
+ />
+ <command name="inventory"
+ available_in_toybox="true"
+ icon="Command_Inventory_Icon"
+ label_ref="Command_Inventory_Label"
+ tooltip_ref="Command_Inventory_Tooltip"
+ execute_function="Floater.ToggleOrBringToFront"
+ execute_parameters="inventory"
+ is_running_function="Floater.IsOpen"
+ is_running_parameters="inventory"
+ />
+ <command name="map"
+ available_in_toybox="true"
+ icon="Command_Map_Icon"
+ label_ref="Command_Map_Label"
+ tooltip_ref="Command_Map_Tooltip"
+ execute_function="Floater.ToggleOrBringToFront"
+ execute_parameters="world_map"
+ is_running_function="Floater.IsOpen"
+ is_running_parameters="world_map"
+ />
+ <command name="marketplace"
+ available_in_toybox="false"
+ icon="Command_Marketplace_Icon"
+ label_ref="Command_Marketplace_Label"
+ tooltip_ref="Command_Marketplace_Tooltip"
+ execute_function="Avatar.OpenMarketplace"
+ />
+ <command name="minimap"
+ available_in_toybox="true"
+ icon="Command_MiniMap_Icon"
+ label_ref="Command_MiniMap_Label"
+ tooltip_ref="Command_MiniMap_Tooltip"
+ execute_function="Floater.ToggleOrBringToFront"
+ execute_parameters="mini_map"
+ is_running_function="Floater.IsOpen"
+ is_running_parameters="mini_map"
+ />
+ <command name="move"
+ available_in_toybox="true"
+ icon="Command_Move_Icon"
+ label_ref="Command_Move_Label"
+ tooltip_ref="Command_Move_Tooltip"
+ execute_function="Floater.ToggleOrBringToFront"
+ execute_parameters="moveview"
+ is_running_function="Floater.IsOpen"
+ is_running_parameters="moveview"
+ />
+ <command name="outbox"
+ available_in_toybox="false"
+ icon="Command_Outbox_Icon"
+ label_ref="Command_Outbox_Label"
+ tooltip_ref="Command_Outbox_Tooltip"
+ execute_function="Floater.ToggleOrBringToFront"
+ execute_parameters="outbox"
+ is_running_function="Floater.IsOpen"
+ is_running_parameters="outbox"
+ />
+ <command name="people"
+ available_in_toybox="true"
+ icon="Command_People_Icon"
+ label_ref="Command_People_Label"
+ tooltip_ref="Command_People_Tooltip"
+ execute_function="Floater.ToggleOrBringToFront"
+ execute_parameters="people"
+ is_running_function="Floater.IsOpen"
+ is_running_parameters="people"
+ />
+ <command name="picks"
+ available_in_toybox="true"
+ icon="Command_Picks_Icon"
+ label_ref="Command_Picks_Label"
+ tooltip_ref="Command_Picks_Tooltip"
+ execute_function="Floater.ToggleOrBringToFront"
+ execute_parameters="picks"
+ is_running_function="Floater.IsOpen"
+ is_running_parameters="picks"
+ />
+ <command name="places"
+ available_in_toybox="true"
+ icon="Command_Places_Icon"
+ label_ref="Command_Places_Label"
+ tooltip_ref="Command_Places_Tooltip"
+ execute_function="Floater.ToggleOrBringToFront"
+ execute_parameters="places"
+ is_running_function="Floater.IsOpen"
+ is_running_parameters="places"
+ />
+ <command name="preferences"
+ available_in_toybox="true"
+ icon="Command_Preferences_Icon"
+ label_ref="Command_Preferences_Label"
+ tooltip_ref="Command_Preferences_Tooltip"
+ execute_function="Floater.ToggleOrBringToFront"
+ execute_parameters="preferences"
+ is_running_function="Floater.IsOpen"
+ is_running_parameters="preferences"
+ />
+ <command name="profile"
+ available_in_toybox="true"
+ icon="Command_Profile_Icon"
+ label_ref="Command_Profile_Label"
+ tooltip_ref="Command_Profile_Tooltip"
+ execute_function="Avatar.ToggleMyProfile"
+ is_running_function="Avatar.IsMyProfileOpen"
+ />
+ <command name="search"
+ available_in_toybox="true"
+ icon="Command_Search_Icon"
+ label_ref="Command_Search_Label"
+ tooltip_ref="Command_Search_Tooltip"
+ execute_function="Floater.ToggleOrBringToFront"
+ execute_parameters="search"
+ is_running_function="Floater.IsOpen"
+ is_running_parameters="search"
+ />
+ <command name="snapshot"
+ available_in_toybox="true"
+ icon="Command_Snapshot_Icon"
+ label_ref="Command_Snapshot_Label"
+ tooltip_ref="Command_Snapshot_Tooltip"
+ execute_function="Floater.ToggleOrBringToFront"
+ execute_parameters="snapshot"
+ is_running_function="Floater.IsOpen"
+ is_running_parameters="snapshot"
+ />
+ <command name="speak"
+ available_in_toybox="true"
+ icon="Command_Speak_Icon"
+ label_ref="Command_Speak_Label"
+ tooltip_ref="Command_Speak_Tooltip"
+ execute_function="Agent.PressMicrophone"
+ execute_parameters="speak"
+ execute_stop_function="Agent.ReleaseMicrophone"
+ execute_stop_parameters="speak"
+ is_enabled_function="Agent.IsActionAllowed"
+ is_enabled_parameters="speak"
+ is_running_function="Agent.IsMicrophoneOn"
+ is_running_parameters="speak"
+ />
+ <command name="view"
+ available_in_toybox="true"
+ icon="Command_View_Icon"
+ label_ref="Command_View_Label"
+ tooltip_ref="Command_View_Tooltip"
+ execute_function="Floater.ToggleOrBringToFront"
+ execute_parameters="camera"
+ is_running_function="Floater.IsOpen"
+ is_running_parameters="camera"
+ />
+ <command name="voice"
+ available_in_toybox="true"
+ icon="Command_Voice_Icon"
+ label_ref="Command_Voice_Label"
+ tooltip_ref="Command_Voice_Tooltip"
+ execute_function="Floater.ToggleOrBringToFront"
+ execute_parameters="voice_controls"
+ is_running_function="Floater.IsOpen"
+ is_running_parameters="voice_controls"
+ />
+</commands>
diff --git a/indra/newview/app_settings/high_graphics.xml b/indra/newview/app_settings/high_graphics.xml
index 4da2b0fd00..5bc2e1b7e6 100644
--- a/indra/newview/app_settings/high_graphics.xml
+++ b/indra/newview/app_settings/high_graphics.xml
@@ -4,13 +4,15 @@
<RenderAvatarCloth value="FALSE"/>
<!--Default for now-->
<RenderAvatarLODFactor value="1.0"/>
+ <!--Default for now-->
+ <RenderAvatarPhysicsLODFactor value="0.9"/>
<!--NO SHADERS-->
<RenderAvatarVP value="TRUE"/>
<!--Short Range-->
<RenderFarClip value="128"/>
<!--Default for now-->
<RenderFlexTimeFactor value="1"/>
- <!--256... but they don't use this-->
+ <!--256... but they do not use this-->
<RenderGlowResolutionPow value="9"/>
<!--Low number-->
<RenderMaxPartCount value="4096"/>
@@ -24,8 +26,6 @@
<RenderTerrainLODFactor value="2"/>
<!--Default for now-->
<RenderTreeLODFactor value="0.5"/>
- <!--Default for now-->
- <RenderUseFBO value="1"/>
<!--Try Impostors-->
<RenderUseImpostors value="TRUE"/>
<!--Default for now-->
@@ -34,11 +34,10 @@
<VertexShaderEnable value="TRUE"/>
<!--NO SHADERS-->
<WindLightUseAtmosShaders value="TRUE"/>
- <!--Deferred Shading-->
- <RenderDeferred value="FALSE"/>
- <!--SSAO Disabled-->
- <RenderDeferredSSAO value="FALSE"/>
- <!--Sun Shadows-->
- <RenderShadowDetail value="0"/>
-
+ <!--Deferred Shading-->
+ <RenderDeferred value="FALSE"/>
+ <!--SSAO Disabled-->
+ <RenderDeferredSSAO value="FALSE"/>
+ <!--Sun Shadows-->
+ <RenderShadowDetail value="0"/>
</settings>
diff --git a/indra/newview/app_settings/ignorable_dialogs.xml b/indra/newview/app_settings/ignorable_dialogs.xml
index 9ddf007ce7..17d3d3c9c5 100644
--- a/indra/newview/app_settings/ignorable_dialogs.xml
+++ b/indra/newview/app_settings/ignorable_dialogs.xml
@@ -23,6 +23,17 @@
<key>Value</key>
<integer>1</integer>
</map>
+ <key>FirstNotUseAvatarPicker</key>
+ <map>
+ <key>Comment</key>
+ <string>Shows hint when resident doesn't activate avatar picker</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
<key>FirstNotUseSidePanel</key>
<map>
<key>Comment</key>
@@ -56,6 +67,17 @@
<key>Value</key>
<integer>1</integer>
</map>
+ <key>FirstViewPopup</key>
+ <map>
+ <key>Comment</key>
+ <string>Shows hint when resident opens view popup</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
<key>FirstReceiveLindens</key>
<map>
<key>Comment</key>
@@ -100,7 +122,17 @@
<key>Value</key>
<integer>1</integer>
</map>
-
+ <key>FirstSpeak</key>
+ <map>
+ <key>Comment</key>
+ <string>Shows hint for Speak button</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
<key>FirstSit</key>
<map>
<key>Comment</key>
diff --git a/indra/newview/app_settings/keys.ini b/indra/newview/app_settings/keys.ini
deleted file mode 100644
index b79e5bf508..0000000000
--- a/indra/newview/app_settings/keys.ini
+++ /dev/null
@@ -1,357 +0,0 @@
-# keys.ini
-#
-# keyboard binding initialization
-#
-# comments must have # in the first column
-# blank lines OK
-#
-# Format:
-# mode key mask function
-#
-# mode must be one of FIRST_PERSON, THIRD_PERSON, EDIT, EDIT_AVATAR, or CONVERSATION
-# key must be upper case, or SPACE, HOME, END, PGUP, PGDN, LEFT, RIGHT, UP, DOWN,
-# or one of ,.;'[]
-# mask must be NONE, SHIFT, ALT, ALT_SHIFT.
-# Control is reserved for user commands.
-# function must be a function named in llkeyboard.cpp
-
-FIRST_PERSON A NONE slide_left
-FIRST_PERSON D NONE slide_right
-FIRST_PERSON W NONE push_forward
-FIRST_PERSON S NONE push_backward
-FIRST_PERSON E NONE jump
-FIRST_PERSON C NONE push_down
-FIRST_PERSON F NONE toggle_fly
-
-FIRST_PERSON LEFT NONE slide_left
-FIRST_PERSON RIGHT NONE slide_right
-FIRST_PERSON UP NONE push_forward
-FIRST_PERSON DOWN NONE push_backward
-FIRST_PERSON PGUP NONE jump
-FIRST_PERSON PGDN NONE push_down
-FIRST_PERSON HOME NONE toggle_fly
-
-FIRST_PERSON PAD_LEFT NONE slide_left
-FIRST_PERSON PAD_RIGHT NONE slide_right
-FIRST_PERSON PAD_UP NONE push_forward
-FIRST_PERSON PAD_DOWN NONE push_backward
-FIRST_PERSON PAD_PGUP NONE jump
-FIRST_PERSON PAD_PGDN NONE push_down
-FIRST_PERSON PAD_HOME NONE toggle_fly
-FIRST_PERSON PAD_CENTER NONE stop_moving
-FIRST_PERSON PAD_ENTER NONE start_chat
-FIRST_PERSON PAD_DIVIDE NONE start_gesture
-
-FIRST_PERSON A SHIFT slide_left
-FIRST_PERSON D SHIFT slide_right
-FIRST_PERSON W SHIFT push_forward
-FIRST_PERSON S SHIFT push_backward
-FIRST_PERSON E SHIFT jump
-FIRST_PERSON C SHIFT push_down
-FIRST_PERSON F SHIFT toggle_fly
-
-FIRST_PERSON SPACE NONE stop_moving
-FIRST_PERSON ENTER NONE start_chat
-FIRST_PERSON DIVIDE NONE start_gesture
-
-FIRST_PERSON LEFT SHIFT slide_left
-FIRST_PERSON RIGHT SHIFT slide_right
-FIRST_PERSON UP SHIFT push_forward
-FIRST_PERSON DOWN SHIFT push_backward
-FIRST_PERSON PGUP SHIFT jump
-FIRST_PERSON PGDN SHIFT push_down
-
-FIRST_PERSON PAD_LEFT SHIFT slide_left
-FIRST_PERSON PAD_RIGHT SHIFT slide_right
-FIRST_PERSON PAD_UP SHIFT push_forward
-FIRST_PERSON PAD_DOWN SHIFT push_backward
-FIRST_PERSON PAD_PGUP SHIFT jump
-FIRST_PERSON PAD_PGDN SHIFT push_down
-FIRST_PERSON PAD_HOME SHIFT toggle_fly
-FIRST_PERSON PAD_ENTER SHIFT start_chat
-FIRST_PERSON PAD_DIVIDE SHIFT start_gesture
-
-THIRD_PERSON A NONE turn_left
-THIRD_PERSON D NONE turn_right
-THIRD_PERSON A SHIFT slide_left
-THIRD_PERSON D SHIFT slide_right
-THIRD_PERSON W NONE push_forward
-THIRD_PERSON S NONE push_backward
-THIRD_PERSON W SHIFT push_forward
-THIRD_PERSON S SHIFT push_backward
-THIRD_PERSON E NONE jump
-THIRD_PERSON C NONE push_down
-THIRD_PERSON E SHIFT jump
-THIRD_PERSON C SHIFT push_down
-
-THIRD_PERSON F NONE toggle_fly
-THIRD_PERSON F SHIFT toggle_fly
-
-THIRD_PERSON SPACE NONE stop_moving
-THIRD_PERSON ENTER NONE start_chat
-THIRD_PERSON DIVIDE NONE start_gesture
-
-THIRD_PERSON LEFT NONE turn_left
-THIRD_PERSON LEFT SHIFT slide_left
-THIRD_PERSON RIGHT NONE turn_right
-THIRD_PERSON RIGHT SHIFT slide_right
-THIRD_PERSON UP NONE push_forward
-THIRD_PERSON DOWN NONE push_backward
-THIRD_PERSON UP SHIFT push_forward
-THIRD_PERSON DOWN SHIFT push_backward
-THIRD_PERSON PGUP NONE jump
-THIRD_PERSON PGDN NONE push_down
-THIRD_PERSON PGUP SHIFT jump
-THIRD_PERSON PGDN SHIFT push_down
-THIRD_PERSON HOME SHIFT toggle_fly
-THIRD_PERSON HOME NONE toggle_fly
-
-THIRD_PERSON PAD_LEFT NONE turn_left
-THIRD_PERSON PAD_LEFT SHIFT slide_left
-THIRD_PERSON PAD_RIGHT NONE turn_right
-THIRD_PERSON PAD_RIGHT SHIFT slide_right
-THIRD_PERSON PAD_UP NONE push_forward
-THIRD_PERSON PAD_DOWN NONE push_backward
-THIRD_PERSON PAD_UP SHIFT push_forward
-THIRD_PERSON PAD_DOWN SHIFT push_backward
-THIRD_PERSON PAD_PGUP NONE jump
-THIRD_PERSON PAD_PGDN NONE push_down
-THIRD_PERSON PAD_PGUP SHIFT jump
-THIRD_PERSON PAD_PGDN SHIFT push_down
-THIRD_PERSON PAD_HOME NONE toggle_fly
-THIRD_PERSON PAD_HOME SHIFT toggle_fly
-THIRD_PERSON PAD_CENTER NONE stop_moving
-THIRD_PERSON PAD_CENTER SHIFT stop_moving
-THIRD_PERSON PAD_ENTER NONE start_chat
-THIRD_PERSON PAD_ENTER SHIFT start_chat
-THIRD_PERSON PAD_DIVIDE NONE start_gesture
-THIRD_PERSON PAD_DIVIDE SHIFT start_gesture
-
-# Camera controls in third person on Alt
-THIRD_PERSON LEFT ALT spin_around_cw
-THIRD_PERSON RIGHT ALT spin_around_ccw
-THIRD_PERSON UP ALT move_forward
-THIRD_PERSON DOWN ALT move_backward
-THIRD_PERSON PGUP ALT spin_over
-THIRD_PERSON PGDN ALT spin_under
-
-THIRD_PERSON A ALT spin_around_cw
-THIRD_PERSON D ALT spin_around_ccw
-THIRD_PERSON W ALT move_forward
-THIRD_PERSON S ALT move_backward
-THIRD_PERSON E ALT spin_over
-THIRD_PERSON C ALT spin_under
-
-THIRD_PERSON PAD_LEFT ALT spin_around_cw
-THIRD_PERSON PAD_RIGHT ALT spin_around_ccw
-THIRD_PERSON PAD_UP ALT move_forward
-THIRD_PERSON PAD_DOWN ALT move_backward
-THIRD_PERSON PAD_PGUP ALT spin_over
-THIRD_PERSON PAD_PGDN ALT spin_under
-THIRD_PERSON PAD_ENTER ALT start_chat
-THIRD_PERSON PAD_DIVIDE ALT start_gesture
-
-# mimic alt zoom behavior with keyboard only
-THIRD_PERSON A CTL_ALT spin_around_cw
-THIRD_PERSON D CTL_ALT spin_around_ccw
-THIRD_PERSON W CTL_ALT spin_over
-THIRD_PERSON S CTL_ALT spin_under
-THIRD_PERSON E CTL_ALT spin_over
-THIRD_PERSON C CTL_ALT spin_under
-
-THIRD_PERSON LEFT CTL_ALT spin_around_cw
-THIRD_PERSON RIGHT CTL_ALT spin_around_ccw
-THIRD_PERSON UP CTL_ALT spin_over
-THIRD_PERSON DOWN CTL_ALT spin_under
-THIRD_PERSON PGUP CTL_ALT spin_over
-THIRD_PERSON PGDN CTL_ALT spin_under
-
-THIRD_PERSON PAD_LEFT CTL_ALT spin_around_cw
-THIRD_PERSON PAD_RIGHT CTL_ALT spin_around_ccw
-THIRD_PERSON PAD_UP CTL_ALT spin_over
-THIRD_PERSON PAD_DOWN CTL_ALT spin_under
-THIRD_PERSON PAD_PGUP CTL_ALT spin_over
-THIRD_PERSON PAD_PGDN CTL_ALT spin_under
-THIRD_PERSON PAD_ENTER CTL_ALT start_chat
-THIRD_PERSON PAD_DIVIDE CTL_ALT start_gesture
-
-# Therefore pan on Alt-Shift
-THIRD_PERSON A CTL_ALT_SHIFT pan_left
-THIRD_PERSON D CTL_ALT_SHIFT pan_right
-THIRD_PERSON W CTL_ALT_SHIFT pan_up
-THIRD_PERSON S CTL_ALT_SHIFT pan_down
-
-THIRD_PERSON LEFT CTL_ALT_SHIFT pan_left
-THIRD_PERSON RIGHT CTL_ALT_SHIFT pan_right
-THIRD_PERSON UP CTL_ALT_SHIFT pan_up
-THIRD_PERSON DOWN CTL_ALT_SHIFT pan_down
-
-THIRD_PERSON PAD_LEFT CTL_ALT_SHIFT pan_left
-THIRD_PERSON PAD_RIGHT CTL_ALT_SHIFT pan_right
-THIRD_PERSON PAD_UP CTL_ALT_SHIFT pan_up
-THIRD_PERSON PAD_DOWN CTL_ALT_SHIFT pan_down
-THIRD_PERSON PAD_ENTER CTL_ALT_SHIFT start_chat
-THIRD_PERSON PAD_DIVIDE CTL_ALT_SHIFT start_gesture
-
-# Basic editing camera control
-EDIT A NONE spin_around_cw
-EDIT D NONE spin_around_ccw
-EDIT W NONE move_forward
-EDIT S NONE move_backward
-EDIT E NONE spin_over
-EDIT C NONE spin_under
-EDIT ENTER NONE start_chat
-EDIT DIVIDE NONE start_gesture
-EDIT PAD_ENTER NONE start_chat
-EDIT PAD_DIVIDE NONE start_gesture
-
-EDIT LEFT NONE spin_around_cw
-EDIT RIGHT NONE spin_around_ccw
-EDIT UP NONE move_forward
-EDIT DOWN NONE move_backward
-EDIT PGUP NONE spin_over
-EDIT PGDN NONE spin_under
-
-EDIT A SHIFT pan_left
-EDIT D SHIFT pan_right
-EDIT W SHIFT pan_up
-EDIT S SHIFT pan_down
-
-EDIT LEFT SHIFT pan_left
-EDIT RIGHT SHIFT pan_right
-EDIT UP SHIFT pan_up
-EDIT DOWN SHIFT pan_down
-
-# Walking works with ALT held down.
-EDIT A ALT slide_left
-EDIT D ALT slide_right
-EDIT W ALT push_forward
-EDIT S ALT push_backward
-EDIT E ALT jump
-EDIT C ALT push_down
-
-EDIT LEFT ALT slide_left
-EDIT RIGHT ALT slide_right
-EDIT UP ALT push_forward
-EDIT DOWN ALT push_backward
-EDIT PGUP ALT jump
-EDIT PGDN ALT push_down
-EDIT HOME ALT toggle_fly
-
-EDIT PAD_LEFT ALT slide_left
-EDIT PAD_RIGHT ALT slide_right
-EDIT PAD_UP ALT push_forward
-EDIT PAD_DOWN ALT push_backward
-EDIT PAD_PGUP ALT jump
-EDIT PAD_PGDN ALT push_down
-EDIT PAD_ENTER ALT start_chat
-EDIT PAD_DIVIDE ALT start_gesture
-
-SITTING A ALT spin_around_cw
-SITTING D ALT spin_around_ccw
-SITTING W ALT move_forward
-SITTING S ALT move_backward
-SITTING E ALT spin_over_sitting
-SITTING C ALT spin_under_sitting
-
-SITTING LEFT ALT spin_around_cw
-SITTING RIGHT ALT spin_around_ccw
-SITTING UP ALT move_forward
-SITTING DOWN ALT move_backward
-SITTING PGUP ALT spin_over
-SITTING PGDN ALT spin_under
-
-SITTING A CTL_ALT spin_around_cw
-SITTING D CTL_ALT spin_around_ccw
-SITTING W CTL_ALT spin_over
-SITTING S CTL_ALT spin_under
-SITTING E CTL_ALT spin_over
-SITTING C CTL_ALT spin_under
-
-SITTING LEFT CTL_ALT spin_around_cw
-SITTING RIGHT CTL_ALT spin_around_ccw
-SITTING UP CTL_ALT spin_over
-SITTING DOWN CTL_ALT spin_under
-SITTING PGUP CTL_ALT spin_over
-SITTING PGDN CTL_ALT spin_under
-
-
-SITTING A NONE spin_around_cw_sitting
-SITTING D NONE spin_around_ccw_sitting
-SITTING W NONE move_forward_sitting
-SITTING S NONE move_backward_sitting
-SITTING E NONE spin_over_sitting
-SITTING C NONE spin_under_sitting
-
-SITTING LEFT NONE spin_around_cw_sitting
-SITTING RIGHT NONE spin_around_ccw_sitting
-SITTING UP NONE move_forward_sitting
-SITTING DOWN NONE move_backward_sitting
-SITTING PGUP NONE spin_over_sitting
-SITTING PGDN NONE spin_under_sitting
-
-SITTING PAD_LEFT NONE spin_around_cw_sitting
-SITTING PAD_RIGHT NONE spin_around_ccw_sitting
-SITTING PAD_UP NONE move_forward_sitting
-SITTING PAD_DOWN NONE move_backward_sitting
-SITTING PAD_PGUP NONE spin_over_sitting
-SITTING PAD_PGDN NONE spin_under_sitting
-SITTING PAD_CENTER NONE stop_moving
-SITTING PAD_ENTER NONE start_chat
-SITTING PAD_DIVIDE NONE start_gesture
-
-# these are for passing controls when sitting on vehicles
-SITTING A SHIFT slide_left
-SITTING D SHIFT slide_right
-SITTING LEFT SHIFT slide_left
-SITTING RIGHT SHIFT slide_right
-
-SITTING PAD_LEFT SHIFT slide_left
-SITTING PAD_RIGHT SHIFT slide_right
-SITTING PAD_ENTER SHIFT start_chat
-SITTING PAD_DIVIDE SHIFT start_gesture
-
-# pan on Alt-Shift
-SITTING A CTL_ALT_SHIFT pan_left
-SITTING D CTL_ALT_SHIFT pan_right
-SITTING W CTL_ALT_SHIFT pan_up
-SITTING S CTL_ALT_SHIFT pan_down
-
-SITTING LEFT CTL_ALT_SHIFT pan_left
-SITTING RIGHT CTL_ALT_SHIFT pan_right
-SITTING UP CTL_ALT_SHIFT pan_up
-SITTING DOWN CTL_ALT_SHIFT pan_down
-
-SITTING PAD_LEFT CTL_ALT_SHIFT pan_left
-SITTING PAD_RIGHT CTL_ALT_SHIFT pan_right
-SITTING PAD_UP CTL_ALT_SHIFT pan_up
-SITTING PAD_DOWN CTL_ALT_SHIFT pan_down
-SITTING PAD_ENTER CTL_ALT_SHIFT start_chat
-SITTING PAD_DIVIDE CTL_ALT_SHIFT start_gesture
-
-SITTING ENTER NONE start_chat
-SITTING DIVIDE NONE start_gesture
-
-# Avatar editing camera controls
-EDIT_AVATAR A NONE edit_avatar_spin_cw
-EDIT_AVATAR D NONE edit_avatar_spin_ccw
-EDIT_AVATAR W NONE edit_avatar_move_forward
-EDIT_AVATAR S NONE edit_avatar_move_backward
-EDIT_AVATAR E NONE edit_avatar_spin_over
-EDIT_AVATAR C NONE edit_avatar_spin_under
-EDIT_AVATAR LEFT NONE edit_avatar_spin_cw
-EDIT_AVATAR RIGHT NONE edit_avatar_spin_ccw
-EDIT_AVATAR UP NONE edit_avatar_move_forward
-EDIT_AVATAR DOWN NONE edit_avatar_move_backward
-EDIT_AVATAR PGUP NONE edit_avatar_spin_over
-EDIT_AVATAR PGDN NONE edit_avatar_spin_under
-EDIT_AVATAR ENTER NONE start_chat
-EDIT_AVATAR DIVIDE NONE start_gesture
-EDIT_AVATAR PAD_LEFT NONE edit_avatar_spin_cw
-EDIT_AVATAR PAD_RIGHT NONE edit_avatar_spin_ccw
-EDIT_AVATAR PAD_UP NONE edit_avatar_move_forward
-EDIT_AVATAR PAD_DOWN NONE edit_avatar_move_backward
-EDIT_AVATAR PAD_PGUP NONE edit_avatar_spin_over
-EDIT_AVATAR PAD_PGDN NONE edit_avatar_spin_under
-EDIT_AVATAR PAD_ENTER NONE start_chat
-EDIT_AVATAR PAD_DIVIDE NONE start_gesture
diff --git a/indra/newview/app_settings/keys.xml b/indra/newview/app_settings/keys.xml
new file mode 100644
index 0000000000..6e3673e7d9
--- /dev/null
+++ b/indra/newview/app_settings/keys.xml
@@ -0,0 +1,350 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<keys>
+ <first_person>
+ <binding key="A" mask="NONE" command="slide_left"/>
+ <binding key="D" mask="NONE" command="slide_right"/>
+ <binding key="W" mask="NONE" command="push_forward"/>
+ <binding key="S" mask="NONE" command="push_backward"/>
+ <binding key="E" mask="NONE" command="jump"/>
+ <binding key="C" mask="NONE" command="push_down"/>
+ <binding key="F" mask="NONE" command="toggle_fly"/>
+
+ <binding key="LEFT" mask="NONE" command="slide_left"/>
+ <binding key="RIGHT" mask="NONE" command="slide_right"/>
+ <binding key="UP" mask="NONE" command="push_forward"/>
+ <binding key="DOWN" mask="NONE" command="push_backward"/>
+ <binding key="PGUP" mask="NONE" command="jump"/>
+ <binding key="PGDN" mask="NONE" command="push_down"/>
+ <binding key="HOME" mask="NONE" command="toggle_fly"/>
+
+ <binding key="PAD_LEFT" mask="NONE" command="slide_left"/>
+ <binding key="PAD_RIGHT" mask="NONE" command="slide_right"/>
+ <binding key="PAD_UP" mask="NONE" command="push_forward"/>
+ <binding key="PAD_DOWN" mask="NONE" command="push_backward"/>
+ <binding key="PAD_PGUP" mask="NONE" command="jump"/>
+ <binding key="PAD_PGDN" mask="NONE" command="push_down"/>
+ <binding key="PAD_HOME" mask="NONE" command="toggle_fly"/>
+ <binding key="PAD_CENTER" mask="NONE" command="stop_moving"/>
+ <binding key="PAD_ENTER" mask="NONE" command="start_chat"/>
+ <binding key="PAD_DIVIDE" mask="NONE" command="start_gesture"/>
+
+ <binding key="A" mask="SHIFT" command="slide_left"/>
+ <binding key="D" mask="SHIFT" command="slide_right"/>
+ <binding key="W" mask="SHIFT" command="push_forward"/>
+ <binding key="S" mask="SHIFT" command="push_backward"/>
+ <binding key="E" mask="SHIFT" command="jump"/>
+ <binding key="C" mask="SHIFT" command="push_down"/>
+ <binding key="F" mask="SHIFT" command="toggle_fly"/>
+
+ <binding key="SPACE" mask="NONE" command="stop_moving"/>
+ <binding key="ENTER" mask="NONE" command="start_chat"/>
+ <binding key="DIVIDE" mask="NONE" command="start_gesture"/>
+
+ <binding key="LEFT" mask="SHIFT" command="slide_left"/>
+ <binding key="RIGHT" mask="SHIFT" command="slide_right"/>
+ <binding key="UP" mask="SHIFT" command="push_forward"/>
+ <binding key="DOWN" mask="SHIFT" command="push_backward"/>
+ <binding key="PGUP" mask="SHIFT" command="jump"/>
+ <binding key="PGDN" mask="SHIFT" command="push_down"/>
+
+ <binding key="PAD_LEFT" mask="SHIFT" command="slide_left"/>
+ <binding key="PAD_RIGHT" mask="SHIFT" command="slide_right"/>
+ <binding key="PAD_UP" mask="SHIFT" command="push_forward"/>
+ <binding key="PAD_DOWN" mask="SHIFT" command="push_backward"/>
+ <binding key="PAD_PGUP" mask="SHIFT" command="jump"/>
+ <binding key="PAD_PGDN" mask="SHIFT" command="push_down"/>
+ <binding key="PAD_HOME" mask="SHIFT" command="toggle_fly"/>
+ <binding key="PAD_ENTER" mask="SHIFT" command="start_chat"/>
+ <binding key="PAD_DIVIDE" mask="SHIFT" command="start_gesture"/>
+ </first_person>
+ <third_person>
+ <binding key="A" mask="NONE" command="turn_left"/>
+ <binding key="D" mask="NONE" command="turn_right"/>
+ <binding key="A" mask="SHIFT" command="slide_left"/>
+ <binding key="D" mask="SHIFT" command="slide_right"/>
+ <binding key="W" mask="NONE" command="push_forward"/>
+ <binding key="S" mask="NONE" command="push_backward"/>
+ <binding key="W" mask="SHIFT" command="push_forward"/>
+ <binding key="S" mask="SHIFT" command="push_backward"/>
+ <binding key="E" mask="NONE" command="jump"/>
+ <binding key="C" mask="NONE" command="push_down"/>
+ <binding key="E" mask="SHIFT" command="jump"/>
+ <binding key="C" mask="SHIFT" command="push_down"/>
+
+ <binding key="F" mask="NONE" command="toggle_fly"/>
+ <binding key="F" mask="SHIFT" command="toggle_fly"/>
+
+ <binding key="SPACE" mask="NONE" command="stop_moving"/>
+ <binding key="ENTER" mask="NONE" command="start_chat"/>
+ <binding key="DIVIDE" mask="NONE" command="start_gesture"/>
+
+ <binding key="LEFT" mask="NONE" command="turn_left"/>
+ <binding key="LEFT" mask="SHIFT" command="slide_left"/>
+ <binding key="RIGHT" mask="NONE" command="turn_right"/>
+ <binding key="RIGHT" mask="SHIFT" command="slide_right"/>
+ <binding key="UP" mask="NONE" command="push_forward"/>
+ <binding key="DOWN" mask="NONE" command="push_backward"/>
+ <binding key="UP" mask="SHIFT" command="push_forward"/>
+ <binding key="DOWN" mask="SHIFT" command="push_backward"/>
+ <binding key="PGUP" mask="NONE" command="jump"/>
+ <binding key="PGDN" mask="NONE" command="push_down"/>
+ <binding key="PGUP" mask="SHIFT" command="jump"/>
+ <binding key="PGDN" mask="SHIFT" command="push_down"/>
+ <binding key="HOME" mask="SHIFT" command="toggle_fly"/>
+ <binding key="HOME" mask="NONE" command="toggle_fly"/>
+
+ <binding key="PAD_LEFT" mask="NONE" command="turn_left"/>
+ <binding key="PAD_LEFT" mask="SHIFT" command="slide_left"/>
+ <binding key="PAD_RIGHT" mask="NONE" command="turn_right"/>
+ <binding key="PAD_RIGHT" mask="SHIFT" command="slide_right"/>
+ <binding key="PAD_UP" mask="NONE" command="push_forward"/>
+ <binding key="PAD_DOWN" mask="NONE" command="push_backward"/>
+ <binding key="PAD_UP" mask="SHIFT" command="push_forward"/>
+ <binding key="PAD_DOWN" mask="SHIFT" command="push_backward"/>
+ <binding key="PAD_PGUP" mask="NONE" command="jump"/>
+ <binding key="PAD_PGDN" mask="NONE" command="push_down"/>
+ <binding key="PAD_PGUP" mask="SHIFT" command="jump"/>
+ <binding key="PAD_PGDN" mask="SHIFT" command="push_down"/>
+ <binding key="PAD_HOME" mask="NONE" command="toggle_fly"/>
+ <binding key="PAD_HOME" mask="SHIFT" command="toggle_fly"/>
+ <binding key="PAD_CENTER" mask="NONE" command="stop_moving"/>
+ <binding key="PAD_CENTER" mask="SHIFT" command="stop_moving"/>
+ <binding key="PAD_ENTER" mask="NONE" command="start_chat"/>
+ <binding key="PAD_ENTER" mask="SHIFT" command="start_chat"/>
+ <binding key="PAD_DIVIDE" mask="NONE" command="start_gesture"/>
+ <binding key="PAD_DIVIDE" mask="SHIFT" command="start_gesture"/>
+
+ <!--Camera controls in third person on Alt-->
+ <binding key="LEFT" mask="ALT" command="spin_around_cw"/>
+ <binding key="RIGHT" mask="ALT" command="spin_around_ccw"/>
+ <binding key="UP" mask="ALT" command="move_forward"/>
+ <binding key="DOWN" mask="ALT" command="move_backward"/>
+ <binding key="PGUP" mask="ALT" command="spin_over"/>
+ <binding key="PGDN" mask="ALT" command="spin_under"/>
+
+ <binding key="A" mask="ALT" command="spin_around_cw"/>
+ <binding key="D" mask="ALT" command="spin_around_ccw"/>
+ <binding key="W" mask="ALT" command="move_forward"/>
+ <binding key="S" mask="ALT" command="move_backward"/>
+ <binding key="E" mask="ALT" command="spin_over"/>
+ <binding key="C" mask="ALT" command="spin_under"/>
+
+ <binding key="PAD_LEFT" mask="ALT" command="spin_around_cw"/>
+ <binding key="PAD_RIGHT" mask="ALT" command="spin_around_ccw"/>
+ <binding key="PAD_UP" mask="ALT" command="move_forward"/>
+ <binding key="PAD_DOWN" mask="ALT" command="move_backward"/>
+ <binding key="PAD_PGUP" mask="ALT" command="spin_over"/>
+ <binding key="PAD_PGDN" mask="ALT" command="spin_under"/>
+ <binding key="PAD_ENTER" mask="ALT" command="start_chat"/>
+ <binding key="PAD_DIVIDE" mask="ALT" command="start_gesture"/>
+
+ <!--mimic alt zoom behavior with keyboard only-->
+ <binding key="A" mask="CTL_ALT" command="spin_around_cw"/>
+ <binding key="D" mask="CTL_ALT" command="spin_around_ccw"/>
+ <binding key="W" mask="CTL_ALT" command="spin_over"/>
+ <binding key="S" mask="CTL_ALT" command="spin_under"/>
+ <binding key="E" mask="CTL_ALT" command="spin_over"/>
+ <binding key="C" mask="CTL_ALT" command="spin_under"/>
+
+ <binding key="LEFT" mask="CTL_ALT" command="spin_around_cw"/>
+ <binding key="RIGHT" mask="CTL_ALT" command="spin_around_ccw"/>
+ <binding key="UP" mask="CTL_ALT" command="spin_over"/>
+ <binding key="DOWN" mask="CTL_ALT" command="spin_under"/>
+ <binding key="PGUP" mask="CTL_ALT" command="spin_over"/>
+ <binding key="PGDN" mask="CTL_ALT" command="spin_under"/>
+
+ <binding key="PAD_LEFT" mask="CTL_ALT" command="spin_around_cw"/>
+ <binding key="PAD_RIGHT" mask="CTL_ALT" command="spin_around_ccw"/>
+ <binding key="PAD_UP" mask="CTL_ALT" command="spin_over"/>
+ <binding key="PAD_DOWN" mask="CTL_ALT" command="spin_under"/>
+ <binding key="PAD_PGUP" mask="CTL_ALT" command="spin_over"/>
+ <binding key="PAD_PGDN" mask="CTL_ALT" command="spin_under"/>
+ <binding key="PAD_ENTER" mask="CTL_ALT" command="start_chat"/>
+ <binding key="PAD_DIVIDE" mask="CTL_ALT" command="start_gesture"/>
+
+ <!--Therefore pan on Alt-Shift-->
+ <binding key="A" mask="CTL_ALT_SHIFT" command="pan_left"/>
+ <binding key="D" mask="CTL_ALT_SHIFT" command="pan_right"/>
+ <binding key="W" mask="CTL_ALT_SHIFT" command="pan_up"/>
+ <binding key="S" mask="CTL_ALT_SHIFT" command="pan_down"/>
+
+ <binding key="LEFT" mask="CTL_ALT_SHIFT" command="pan_left"/>
+ <binding key="RIGHT" mask="CTL_ALT_SHIFT" command="pan_right"/>
+ <binding key="UP" mask="CTL_ALT_SHIFT" command="pan_up"/>
+ <binding key="DOWN" mask="CTL_ALT_SHIFT" command="pan_down"/>
+
+ <binding key="PAD_LEFT" mask="CTL_ALT_SHIFT" command="pan_left"/>
+ <binding key="PAD_RIGHT" mask="CTL_ALT_SHIFT" command="pan_right"/>
+ <binding key="PAD_UP" mask="CTL_ALT_SHIFT" command="pan_up"/>
+ <binding key="PAD_DOWN" mask="CTL_ALT_SHIFT" command="pan_down"/>
+ <binding key="PAD_ENTER" mask="CTL_ALT_SHIFT" command="start_chat"/>
+ <binding key="PAD_DIVIDE" mask="CTL_ALT_SHIFT" command="start_gesture"/>
+ </third_person>
+
+ <!-- Basic editing camera control -->
+ <edit>
+ <binding key="A" mask="NONE" command="spin_around_cw"/>
+ <binding key="D" mask="NONE" command="spin_around_ccw"/>
+ <binding key="W" mask="NONE" command="move_forward"/>
+ <binding key="S" mask="NONE" command="move_backward"/>
+ <binding key="E" mask="NONE" command="spin_over"/>
+ <binding key="C" mask="NONE" command="spin_under"/>
+ <binding key="ENTER" mask="NONE" command="start_chat"/>
+ <binding key="DIVIDE" mask="NONE" command="start_gesture"/>
+ <binding key="PAD_ENTER" mask="NONE" command="start_chat"/>
+ <binding key="PAD_DIVIDE" mask="NONE" command="start_gesture"/>
+
+ <binding key="LEFT" mask="NONE" command="spin_around_cw"/>
+ <binding key="RIGHT" mask="NONE" command="spin_around_ccw"/>
+ <binding key="UP" mask="NONE" command="move_forward"/>
+ <binding key="DOWN" mask="NONE" command="move_backward"/>
+ <binding key="PGUP" mask="NONE" command="spin_over"/>
+ <binding key="PGDN" mask="NONE" command="spin_under"/>
+
+ <binding key="A" mask="SHIFT" command="pan_left"/>
+ <binding key="D" mask="SHIFT" command="pan_right"/>
+ <binding key="W" mask="SHIFT" command="pan_up"/>
+ <binding key="S" mask="SHIFT" command="pan_down"/>
+
+ <binding key="LEFT" mask="SHIFT" command="pan_left"/>
+ <binding key="RIGHT" mask="SHIFT" command="pan_right"/>
+ <binding key="UP" mask="SHIFT" command="pan_up"/>
+ <binding key="DOWN" mask="SHIFT" command="pan_down"/>
+
+ <!--Walking works with ALT held down.-->
+ <binding key="A" mask="ALT" command="slide_left"/>
+ <binding key="D" mask="ALT" command="slide_right"/>
+ <binding key="W" mask="ALT" command="push_forward"/>
+ <binding key="S" mask="ALT" command="push_backward"/>
+ <binding key="E" mask="ALT" command="jump"/>
+ <binding key="C" mask="ALT" command="push_down"/>
+
+ <binding key="LEFT" mask="ALT" command="slide_left"/>
+ <binding key="RIGHT" mask="ALT" command="slide_right"/>
+ <binding key="UP" mask="ALT" command="push_forward"/>
+ <binding key="DOWN" mask="ALT" command="push_backward"/>
+ <binding key="PGUP" mask="ALT" command="jump"/>
+ <binding key="PGDN" mask="ALT" command="push_down"/>
+ <binding key="HOME" mask="ALT" command="toggle_fly"/>
+
+ <binding key="PAD_LEFT" mask="ALT" command="slide_left"/>
+ <binding key="PAD_RIGHT" mask="ALT" command="slide_right"/>
+ <binding key="PAD_UP" mask="ALT" command="push_forward"/>
+ <binding key="PAD_DOWN" mask="ALT" command="push_backward"/>
+ <binding key="PAD_PGUP" mask="ALT" command="jump"/>
+ <binding key="PAD_PGDN" mask="ALT" command="push_down"/>
+ <binding key="PAD_ENTER" mask="ALT" command="start_chat"/>
+ <binding key="PAD_DIVIDE" mask="ALT" command="start_gesture"/>
+ </edit>
+ <sitting>
+ <binding key="A" mask="ALT" command="spin_around_cw"/>
+ <binding key="D" mask="ALT" command="spin_around_ccw"/>
+ <binding key="W" mask="ALT" command="move_forward"/>
+ <binding key="S" mask="ALT" command="move_backward"/>
+ <binding key="E" mask="ALT" command="spin_over_sitting"/>
+ <binding key="C" mask="ALT" command="spin_under_sitting"/>
+
+ <binding key="LEFT" mask="ALT" command="spin_around_cw"/>
+ <binding key="RIGHT" mask="ALT" command="spin_around_ccw"/>
+ <binding key="UP" mask="ALT" command="move_forward"/>
+ <binding key="DOWN" mask="ALT" command="move_backward"/>
+ <binding key="PGUP" mask="ALT" command="spin_over"/>
+ <binding key="PGDN" mask="ALT" command="spin_under"/>
+
+ <binding key="A" mask="CTL_ALT" command="spin_around_cw"/>
+ <binding key="D" mask="CTL_ALT" command="spin_around_ccw"/>
+ <binding key="W" mask="CTL_ALT" command="spin_over"/>
+ <binding key="S" mask="CTL_ALT" command="spin_under"/>
+ <binding key="E" mask="CTL_ALT" command="spin_over"/>
+ <binding key="C" mask="CTL_ALT" command="spin_under"/>
+
+ <binding key="LEFT" mask="CTL_ALT" command="spin_around_cw"/>
+ <binding key="RIGHT" mask="CTL_ALT" command="spin_around_ccw"/>
+ <binding key="UP" mask="CTL_ALT" command="spin_over"/>
+ <binding key="DOWN" mask="CTL_ALT" command="spin_under"/>
+ <binding key="PGUP" mask="CTL_ALT" command="spin_over"/>
+ <binding key="PGDN" mask="CTL_ALT" command="spin_under"/>
+
+
+ <binding key="A" mask="NONE" command="spin_around_cw_sitting"/>
+ <binding key="D" mask="NONE" command="spin_around_ccw_sitting"/>
+ <binding key="W" mask="NONE" command="move_forward_sitting"/>
+ <binding key="S" mask="NONE" command="move_backward_sitting"/>
+ <binding key="E" mask="NONE" command="spin_over_sitting"/>
+ <binding key="C" mask="NONE" command="spin_under_sitting"/>
+
+ <binding key="LEFT" mask="NONE" command="spin_around_cw_sitting"/>
+ <binding key="RIGHT" mask="NONE" command="spin_around_ccw_sitting"/>
+ <binding key="UP" mask="NONE" command="move_forward_sitting"/>
+ <binding key="DOWN" mask="NONE" command="move_backward_sitting"/>
+ <binding key="PGUP" mask="NONE" command="spin_over_sitting"/>
+ <binding key="PGDN" mask="NONE" command="spin_under_sitting"/>
+
+ <binding key="PAD_LEFT" mask="NONE" command="spin_around_cw_sitting"/>
+ <binding key="PAD_RIGHT" mask="NONE" command="spin_around_ccw_sitting"/>
+ <binding key="PAD_UP" mask="NONE" command="move_forward_sitting"/>
+ <binding key="PAD_DOWN" mask="NONE" command="move_backward_sitting"/>
+ <binding key="PAD_PGUP" mask="NONE" command="spin_over_sitting"/>
+ <binding key="PAD_PGDN" mask="NONE" command="spin_under_sitting"/>
+ <binding key="PAD_CENTER" mask="NONE" command="stop_moving"/>
+ <binding key="PAD_ENTER" mask="NONE" command="start_chat"/>
+ <binding key="PAD_DIVIDE" mask="NONE" command="start_gesture"/>
+
+ <!--these are for passing controls when sitting on vehicles-->
+ <binding key="A" mask="SHIFT" command="slide_left"/>
+ <binding key="D" mask="SHIFT" command="slide_right"/>
+ <binding key="LEFT" mask="SHIFT" command="slide_left"/>
+ <binding key="RIGHT" mask="SHIFT" command="slide_right"/>
+
+ <binding key="PAD_LEFT" mask="SHIFT" command="slide_left"/>
+ <binding key="PAD_RIGHT" mask="SHIFT" command="slide_right"/>
+ <binding key="PAD_ENTER" mask="SHIFT" command="start_chat"/>
+ <binding key="PAD_DIVIDE" mask="SHIFT" command="start_gesture"/>
+
+ <!--pan on Alt-Shift-->
+ <binding key="A" mask="CTL_ALT_SHIFT" command="pan_left"/>
+ <binding key="D" mask="CTL_ALT_SHIFT" command="pan_right"/>
+ <binding key="W" mask="CTL_ALT_SHIFT" command="pan_up"/>
+ <binding key="S" mask="CTL_ALT_SHIFT" command="pan_down"/>
+
+ <binding key="LEFT" mask="CTL_ALT_SHIFT" command="pan_left"/>
+ <binding key="RIGHT" mask="CTL_ALT_SHIFT" command="pan_right"/>
+ <binding key="UP" mask="CTL_ALT_SHIFT" command="pan_up"/>
+ <binding key="DOWN" mask="CTL_ALT_SHIFT" command="pan_down"/>
+
+ <binding key="PAD_LEFT" mask="CTL_ALT_SHIFT" command="pan_left"/>
+ <binding key="PAD_RIGHT" mask="CTL_ALT_SHIFT" command="pan_right"/>
+ <binding key="PAD_UP" mask="CTL_ALT_SHIFT" command="pan_up"/>
+ <binding key="PAD_DOWN" mask="CTL_ALT_SHIFT" command="pan_down"/>
+ <binding key="PAD_ENTER" mask="CTL_ALT_SHIFT" command="start_chat"/>
+ <binding key="PAD_DIVIDE" mask="CTL_ALT_SHIFT" command="start_gesture"/>
+
+ <binding key="ENTER" mask="NONE" command="start_chat"/>
+ <binding key="DIVIDE" mask="NONE" command="start_gesture"/>
+ </sitting>
+ <edit_avatar>
+ <!--Avatar editing camera controls-->
+ <binding key="A" mask="NONE" command="edit_avatar_spin_cw"/>
+ <binding key="D" mask="NONE" command="edit_avatar_spin_ccw"/>
+ <binding key="W" mask="NONE" command="edit_avatar_move_forward"/>
+ <binding key="S" mask="NONE" command="edit_avatar_move_backward"/>
+ <binding key="E" mask="NONE" command="edit_avatar_spin_over"/>
+ <binding key="C" mask="NONE" command="edit_avatar_spin_under"/>
+ <binding key="LEFT" mask="NONE" command="edit_avatar_spin_cw"/>
+ <binding key="RIGHT" mask="NONE" command="edit_avatar_spin_ccw"/>
+ <binding key="UP" mask="NONE" command="edit_avatar_move_forward"/>
+ <binding key="DOWN" mask="NONE" command="edit_avatar_move_backward"/>
+ <binding key="PGUP" mask="NONE" command="edit_avatar_spin_over"/>
+ <binding key="PGDN" mask="NONE" command="edit_avatar_spin_under"/>
+ <binding key="ENTER" mask="NONE" command="start_chat"/>
+ <binding key="DIVIDE" mask="NONE" command="start_gesture"/>
+ <binding key="PAD_LEFT" mask="NONE" command="edit_avatar_spin_cw"/>
+ <binding key="PAD_RIGHT" mask="NONE" command="edit_avatar_spin_ccw"/>
+ <binding key="PAD_UP" mask="NONE" command="edit_avatar_move_forward"/>
+ <binding key="PAD_DOWN" mask="NONE" command="edit_avatar_move_backward"/>
+ <binding key="PAD_PGUP" mask="NONE" command="edit_avatar_spin_over"/>
+ <binding key="PAD_PGDN" mask="NONE" command="edit_avatar_spin_under"/>
+ <binding key="PAD_ENTER" mask="NONE" command="start_chat"/>
+ <binding key="PAD_DIVIDE" mask="NONE" command="start_gesture"/>
+ </edit_avatar>
+</keys> \ No newline at end of file
diff --git a/indra/newview/app_settings/keywords.ini b/indra/newview/app_settings/keywords.ini
index 263b73ba23..318b69438a 100644
--- a/indra/newview/app_settings/keywords.ini
+++ b/indra/newview/app_settings/keywords.ini
@@ -10,7 +10,7 @@ state Keyword to indicate state block or state transition
integer Integer type
float Floating-point type
string String type
-key Key type. Use NULL_KEY to test for empty keys.
+key Key type. Use NULL_KEY to test for empty keys
vector Vector type of 3 floats. Used to represent 3D motion, Euler angles, and color.:Access components by .x, .y. or .z
rotation Rotation type of 4 floats. Used to represent rotation.:Access components by .x, .y., .z, or .w
list List of various data types
@@ -28,7 +28,7 @@ collision_end collision_end(integer num_detected):Triggered when task stops coll
land_collision_start land_collision_start(vector pos):Triggered when task starts colliding with land
land_collision land_collision(vector pos):Triggered when task is colliding with land
land_collision_end land_collision_end(vector pos):Triggered when task stops colliding with land
-timer timer():Result of the llSetTimerEvent library function call.
+timer timer():Result of the llSetTimerEvent library function call
listen listen(integer channel, string name, key id, string message):Result of the llListen library function call
sensor sensor(integer num_detected):Result of the llSensor library function call
no_sensor no_sensor():Result of the llSensor library function call
@@ -44,8 +44,8 @@ attach attach(key id):Triggered when task attaches or detaches from agent
dataserver dataserver(key queryid, string data):Triggered when task receives asynchronous data
moving_start moving_start():Triggered when task begins moving
moving_end moving_end():Triggered when task stops moving
-on_rez on_rez(integer start_param):Triggered when task is rezed in from inventory or another task
-object_rez object_rez(key id):Triggered when task rezes in another task
+on_rez on_rez(integer start_param):Triggered when task is rezzed in from inventory or another task
+object_rez object_rez(key id):Triggered when task rezzes in another task
link_message link_message(integer sender_num, integer num, string str, key id):Triggered when task receives a link message via LLMessageLinked library function call
changed changed( integer change ):Triggered various event change the task:(test change with CHANGED_INVENTORY, CHANGED_COLOR, CHANGED_SHAPE, CHANGED_SCALE, CHANGED_TEXTURE, CHANGED_LINK, CHANGED_ALLOWED_DROP, CHANGED_OWNER, CHANGED_REGION, CHANGED_TELEPORT, CHANGED_REGION_START, CHANGED_MEDIA)
remote_data remote_data(integer event_type, key channel, key message_id, string sender,integer idata, string sdata):Triggered by various XML-RPC calls (event_type will be one of REMOTE_DATA_CHANNEL, REMOTE_DATA_REQUEST, REMOTE_DATA_REPLY)
@@ -91,6 +91,7 @@ PERMISSION_CHANGE_LINKS Passed to llRequestPermissions library function to req
# PERMISSION_CHANGE_PERMISSIONS Passed to llRequestPermissions library function to request permission to change permissions
PERMISSION_TRACK_CAMERA Passed to llRequestPermissions library function to request permission to track agent's camera
PERMISSION_CONTROL_CAMERA Passed to llRequestPermissions library function to request permission to change agent's camera
+PERMISSION_TELEPORT Passed to llRequestPermissions library function to request permission to teleport agent
DEBUG_CHANNEL Chat channel reserved for debug and error messages from scripts
PUBLIC_CHANNEL Chat channel that broadcasts to all nearby users
@@ -151,15 +152,15 @@ PSYS_SRC_PATTERN_ANGLE
PSYS_SRC_PATTERN_ANGLE_CONE
PSYS_SRC_PATTERN_ANGLE_CONE_EMPTY
-OBJECT_UNKNOWN_DETAIL Returned by llGetObjectDetails when passed an invalid object parameter type.
-OBJECT_NAME Used with llGetObjectDetails to get an object's name.
-OBJECT_DESC Used with llGetObjectDetails to get an object's description.
-OBJECT_POS Used with llGetObjectDetails to get an object's position.
-OBJECT_ROT Used with llGetObjectDetails to get an object's rotation.
-OBJECT_VELOCITY Used with llGetObjectDetails to get an object's velocity.
-OBJECT_OWNER Used with llGetObjectDetails to get an object's owner's key. Will be NULL_KEY if group owned.
-OBJECT_GROUP Used with llGetObjectDetails to get an object's group's key.
-OBJECT_CREATOR Used with llGetObjectDetails to get an object's creator's key.
+OBJECT_UNKNOWN_DETAIL Returned by llGetObjectDetails when passed an invalid object parameter type
+OBJECT_NAME Used with llGetObjectDetails to get an object's name
+OBJECT_DESC Used with llGetObjectDetails to get an object's description
+OBJECT_POS Used with llGetObjectDetails to get an object's position
+OBJECT_ROT Used with llGetObjectDetails to get an object's rotation
+OBJECT_VELOCITY Used with llGetObjectDetails to get an object's velocity
+OBJECT_OWNER Used with llGetObjectDetails to get an object's owner's key. Will be NULL_KEY if group owned
+OBJECT_GROUP Used with llGetObjectDetails to get an object's group's key
+OBJECT_CREATOR Used with llGetObjectDetails to get an object's creator's key
# some vehicle params
VEHICLE_TYPE_NONE
@@ -198,7 +199,7 @@ VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY A slider between 0 (bouncy) and 1 (critic
VEHICLE_VERTICAL_ATTRACTION_TIMESCALE The exponential timescale for the vehicle to align its z-axis to the world z-axis (vertical)
VEHICLE_BANKING_EFFICIENCY A slider between -1 (leans out of turns), 0 (no banking), and +1 (leans into turns)
-VEHICLE_BANKING_MIX A slider betwen 0 (static banking) and 1 (dynamic banking)
+VEHICLE_BANKING_MIX A slider between 0 (static banking) and 1 (dynamic banking)
VEHICLE_BANKING_TIMESCALE The exponential timescale for the banking behavior to take full effect
VEHICLE_FLAG_NO_DEFLECTION_UP Prevents linear deflection along world-z axis
@@ -208,9 +209,9 @@ VEHICLE_FLAG_HOVER_TERRAIN_ONLY Hover only pays attention to terrain height
VEHICLE_FLAG_HOVER_GLOBAL_HEIGHT Hover only pays attention to global height
VEHICLE_FLAG_HOVER_UP_ONLY Hover only pushes up
VEHICLE_FLAG_LIMIT_MOTOR_UP Prevents ground vehicles from motoring into the sky
-VEHICLE_FLAG_MOUSELOOK_STEER Makes vehicle try to turn toward mouselook direction.
-VEHICLE_FLAG_MOUSELOOK_BANK Makes vehicle try to turn toward mouselook direction assuming banking is enabled.
-VEHICLE_FLAG_CAMERA_DECOUPLED Causes the camera look-at axis to NOT move when the vehicle rotates.
+VEHICLE_FLAG_MOUSELOOK_STEER Makes vehicle try to turn toward mouselook direction
+VEHICLE_FLAG_MOUSELOOK_BANK Makes vehicle try to turn toward mouselook direction assuming banking is enabled
+VEHICLE_FLAG_CAMERA_DECOUPLED Causes the camera look-at axis to NOT move when the vehicle rotates
CAMERA_PITCH (-45 to 80) (Adjusts the angular amount that the camera aims straight ahead vs. straight down, maintaining the same distance. Analogous to 'incidence'.")
CAMERA_FOCUS_OFFSET (-10 to 10) A vector that adjusts the position of the camera focus position relative to the subject
@@ -238,7 +239,7 @@ INVENTORY_BODYPART Passed to task inventory library functions to reference body
INVENTORY_ANIMATION Passed to task inventory library functions to reference animations
INVENTORY_GESTURE Passed to task inventory library functions to reference gestures
INVENTORY_ALL Passed to task inventory library functions to reference all inventory items
-INVENTORY_NONE Returned by llGetInventoryType when no item is found.
+INVENTORY_NONE Returned by llGetInventoryType when no item is found
ATTACH_CHEST Passed to llAttachToAvatar to attach task to chest
ATTACH_HEAD Passed to llAttachToAvatar to attach task to head
@@ -256,7 +257,7 @@ ATTACH_LEAR Passed to llAttachToAvatar to attach task to left ear
ATTACH_REAR Passed to llAttachToAvatar to attach task to right ear
ATTACH_LEYE Passed to llAttachToAvatar to attach task to left eye
ATTACH_REYE Passed to llAttachToAvatar to attach task to right eye
-ATTACH_NOSE Passed to llAttachToAvatar to attach task to noce
+ATTACH_NOSE Passed to llAttachToAvatar to attach task to nose
ATTACH_RUARM Passed to llAttachToAvatar to attach task to right upper arm
ATTACH_RLARM Passed to llAttachToAvatar to attach task to right lower arm
ATTACH_LUARM Passed to llAttachToAvatar to attach task to left upper arm
@@ -296,7 +297,7 @@ PAYMENT_INFO_USED Used with llRequestAgentData to tell if Agent is of "Payment I
ANIM_ON Enable texture animation
LOOP Loop when animating textures
REVERSE Animate in the reverse direction
-PING_PONG Animate forward, then reverse.
+PING_PONG Animate forward, then reverse
SMOOTH Textures slides, instead of stepping
ROTATE Rotates the texture, instead of using frames
SCALE Scales the texture, instead of using frames
@@ -343,7 +344,7 @@ PRIM_FLEXIBLE Followed by TRUE or FALSE, integer softness, float gravity, float
PRIM_POINT_LIGHT Followed by TRUE or FALSE, vector color, float intensity, float radius, float falloff
PRIM_TEMP_ON_REZ Sets temporay on rez to TRUE or FALSE
PRIM_PHANTOM Sets phantom to TRUE or FALSE
-PRIM_CAST_SHADOWS DEPRECATED. Takes 1 parameter, an integer, but has no effect when set and always returns 0 if used in llGetPrimitiveParams.
+PRIM_CAST_SHADOWS DEPRECATED. Takes 1 parameter, an integer, but has no effect when set and always returns 0 if used in llGetPrimitiveParams
PRIM_POSITION Sets primitive position to a vector position
PRIM_SIZE Sets primitive size to a vector size
PRIM_ROTATION Sets primitive rotation
@@ -363,10 +364,10 @@ PRIM_TYPE_TUBE Followed by integer hole shape, vector cut, float hollow, vector
PRIM_TYPE_RING Followed by integer hole shape, vector cut, float hollow, vector twist,:vector hole size, vector top shear, vector advanced cut, vector taper,:float revolutions, float radius offset, and float skew
PRIM_TYPE_SCULPT Followed by a key/string texture uuid, and one of PRIM_SCULPT_TYPE_SPHERE, PRIM_SCULPT_TYPE_TORUS, PRIM_SCULPT_TYPE_PLANE, or PRIM_SCULPT_TYPE_CYLINDER
-PRIM_HOLE_DEFAULT Sets hole type to match the prim type.
-PRIM_HOLE_SQUARE Sets hole type to square.
-PRIM_HOLE_CIRCLE Sets hole type to circle.
-PRIM_HOLE_TRIANGLE Sets hole type to triangle.
+PRIM_HOLE_DEFAULT Sets hole type to match the prim type
+PRIM_HOLE_SQUARE Sets hole type to square
+PRIM_HOLE_CIRCLE Sets hole type to circle
+PRIM_HOLE_TRIANGLE Sets hole type to triangle
PRIM_MATERIAL_STONE Sets material to stone
PRIM_MATERIAL_METAL Sets material to metal
@@ -436,7 +437,7 @@ PARCEL_MEDIA_COMMAND_TIME Set media stream to specific time
PARCEL_MEDIA_COMMAND_SIZE Get or set the parcel's media pixel resolution
PARCEL_MEDIA_COMMAND_AGENT Allows media stream commands to apply to only one agent
PARCEL_MEDIA_COMMAND_UNLOAD Unloads the media stream
-PARCEL_MEDIA_COMMAND_AUTO_ALIGN Auto aligns the media stream to the texture size. May cause a performance hit and loss of some visual quality.
+PARCEL_MEDIA_COMMAND_AUTO_ALIGN Auto aligns the media stream to the texture size. May cause a performance hit and loss of some visual quality
PAY_HIDE Used with llSetPayPrice to hide a button
PAY_DEFAULT Used with llSetPayPrice to use the default price for a button
@@ -481,7 +482,7 @@ REGION_FLAG_RESTRICT_PUSHOBJECT Used with llGetRegionFlags to find if a region
HTTP_METHOD Used with llHTTPRequest to specify the method, such as "GET" or "POST"
HTTP_MIMETYPE Used with llHTTPRequest to specify the MIME type, defaults to "text/plain"
-HTTP_BODY_MAXLENGTH Used with llHTTPRequest to specify the maxium reponse body to return
+HTTP_BODY_MAXLENGTH Used with llHTTPRequest to specify the maximum response body to return
HTTP_VERIFY_CERT Used with llHTTPRequest to specify SSL certificate verification
HTTP_BODY_TRUNCATED Used with http_response to indicate truncation point in bytes
@@ -492,16 +493,17 @@ PARCEL_COUNT_OTHER Used with llGetParcelPrimCount to get the number of prims on
PARCEL_COUNT_SELECTED Used with llGetParcelPrimCount to get the number of prims on the parcel currently selected or sat upon
PARCEL_COUNT_TEMP Used with llGetParcelPrimCount to get the number of prims on the parcel that are temp on rez
-PARCEL_DETAILS_NAME Used with llGetParcelDetails to get the parcel name.
-PARCEL_DETAILS_DESC Used with llGetParcelDetails to get the parcel description.
-PARCEL_DETAILS_OWNER Used with llGetParcelDetails to get the parcel owner id.
-PARCEL_DETAILS_GROUP Used with llGetParcelDetails to get the parcel group id.
-PARCEL_DETAILS_AREA Used with llGetParcelDetails to get the parcel area in square meters.
-PARCEL_DETAILS_ID Used with llGetParcelDetails to get the parcel id.
+PARCEL_DETAILS_NAME Used with llGetParcelDetails to get the parcel name
+PARCEL_DETAILS_DESC Used with llGetParcelDetails to get the parcel description
+PARCEL_DETAILS_OWNER Used with llGetParcelDetails to get the parcel owner id
+PARCEL_DETAILS_GROUP Used with llGetParcelDetails to get the parcel group id
+PARCEL_DETAILS_AREA Used with llGetParcelDetails to get the parcel area in square meters
+PARCEL_DETAILS_ID Used with llGetParcelDetails to get the parcel id
+PARCEL_DETAILS_SEE_AVATARS Used with llGetParcelDetails to get the avatars visibility setting
-STRING_TRIM_HEAD Used with llStringTrim to trim leading spaces from a string.
-STRING_TRIM_TAIL Used with llStringTrim to trim trailing spaces from a string.
-STRING_TRIM Used with llStringTrim to trim both leading and trailing spaces from a string.
+STRING_TRIM_HEAD Used with llStringTrim to trim leading spaces from a string
+STRING_TRIM_TAIL Used with llStringTrim to trim trailing spaces from a string
+STRING_TRIM Used with llStringTrim to trim both leading and trailing spaces from a string
CLICK_ACTION_NONE Used with llSetClickAction to disable the click action
CLICK_ACTION_TOUCH Used with llSetClickAction to set touch as the default action when object is clicked
@@ -513,9 +515,9 @@ CLICK_ACTION_PLAY Used with llSetClickAction to set play as the default ac
CLICK_ACTION_OPEN_MEDIA Used with llSetClickAction to set open-media as the default action when object is clicked
CLICK_ACTION_ZOOM Used with llSetClickAction to set zoom in as the default action when object is clicked
-TOUCH_INVALID_TEXCOORD Value returned by llDetectedTouchUV() and llDetectedTouchST() when the touch position is not valid.
-TOUCH_INVALID_VECTOR Value returned by llDetectedTouchPos(), llDetectedTouchNormal(), and llDetectedTouchBinormal() when the touch position is not valid.
-TOUCH_INVALID_FACE Value returned by llDetectedTouchFace() when the touch position is not valid.
+TOUCH_INVALID_TEXCOORD Value returned by llDetectedTouchUV() and llDetectedTouchST() when the touch position is not valid
+TOUCH_INVALID_VECTOR Value returned by llDetectedTouchPos(), llDetectedTouchNormal(), and llDetectedTouchBinormal() when the touch position is not valid
+TOUCH_INVALID_FACE Value returned by llDetectedTouchFace() when the touch position is not valid
PRIM_MEDIA_ALT_IMAGE_ENABLE Used with ll{Get,Set}PrimMediaParams to enable the default alt image for media
PRIM_MEDIA_CONTROLS Used with ll{Get,Set}PrimMediaParams to determine the controls shown for media
@@ -602,9 +604,11 @@ return Leave current function or event handler
# Comment
[one_sided_delimiter .8, .3, .15]
// Comment:Non-functional commentary or disabled code
+[two_sided_delimiter .8, .3, .15]
+/* */ Comment:Non-functional commentary or disabled code
# String literals
-[two_sided_delimiter 0, .2, 0]
+[double_quotation_marks 0, .2, 0]
" String literal
-#functions are supplied by the program now.
+#functions are supplied by the program now
diff --git a/indra/newview/app_settings/lindenlab.pem b/indra/newview/app_settings/lindenlab.pem
new file mode 100644
index 0000000000..eddae0426d
--- /dev/null
+++ b/indra/newview/app_settings/lindenlab.pem
@@ -0,0 +1,97 @@
+-----BEGIN CERTIFICATE-----
+MIIEUDCCA7mgAwIBAgIJAN4ppNGwj6yIMA0GCSqGSIb3DQEBBAUAMIHMMQswCQYD
+VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZyYW5j
+aXNjbzEZMBcGA1UEChMQTGluZGVuIExhYiwgSW5jLjEpMCcGA1UECxMgTGluZGVu
+IExhYiBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxKTAnBgNVBAMTIExpbmRlbiBMYWIg
+Q2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYJKoZIhvcNAQkBFhBjYUBsaW5kZW5s
+YWIuY29tMB4XDTA1MDQyMTAyNDAzMVoXDTI1MDQxNjAyNDAzMVowgcwxCzAJBgNV
+BAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNp
+c2NvMRkwFwYDVQQKExBMaW5kZW4gTGFiLCBJbmMuMSkwJwYDVQQLEyBMaW5kZW4g
+TGFiIENlcnRpZmljYXRlIEF1dGhvcml0eTEpMCcGA1UEAxMgTGluZGVuIExhYiBD
+ZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgkqhkiG9w0BCQEWEGNhQGxpbmRlbmxh
+Yi5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAKXh1MThucdTbMg9bYBO
+rAm8yWns32YojB0PRfbq8rUjepEhTm3/13s0u399Uc202v4ejcGhkIDWJZd2NZMF
+oKrhmRfxGHSKPCuFaXC3jh0lRECj7k8FoPkcmaPjSyodrDFDUUuv+C06oYJoI+rk
+8REyal9NwgHvqCzOrZtiTXAdAgMBAAGjggE2MIIBMjAdBgNVHQ4EFgQUO1zK2e1f
+1wO1fHAjq6DTJobKDrcwggEBBgNVHSMEgfkwgfaAFDtcytntX9cDtXxwI6ug0yaG
+yg63oYHSpIHPMIHMMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEW
+MBQGA1UEBxMNU2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQTGluZGVuIExhYiwgSW5j
+LjEpMCcGA1UECxMgTGluZGVuIExhYiBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxKTAn
+BgNVBAMTIExpbmRlbiBMYWIgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYJKoZI
+hvcNAQkBFhBjYUBsaW5kZW5sYWIuY29tggkA3imk0bCPrIgwDAYDVR0TBAUwAwEB
+/zANBgkqhkiG9w0BAQQFAAOBgQA/ZkgfvwHYqk1UIAKZS3kMCxz0HvYuEQtviwnu
+xA39CIJ65Zozs28Eg1aV9/Y+Of7TnWhW+U3J3/wD/GghaAGiKK6vMn9gJBIdBX/9
+e6ef37VGyiOEFFjnUIbuk0RWty0orN76q/lI/xjCi15XSA/VSq2j4vmnwfZcPTDu
+glmQ1A==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEkDCCA3igAwIBAgICTSUwDQYJKoZIhvcNAQEFBQAwQDELMAkGA1UEBhMCVVMx
+FzAVBgNVBAoTDkdlb1RydXN0LCBJbmMuMRgwFgYDVQQDEw9HZW9UcnVzdCBTU0wg
+Q0EwHhcNMTAxMjIwMTkxMTI2WhcNMTIwMjIxMTI1NDAzWjCBnzEpMCcGA1UEBRMg
+UkMteW9jbXIwdXRmRTdOMVBlaHJHQXdqL0lNc2hJZS0xCzAJBgNVBAYTAlVTMRMw
+EQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNpc2NvMR0wGwYD
+VQQKExRMaW5kZW4gUmVzZWFyY2ggSW5jLjEZMBcGA1UEAwwQKi5zZWNvbmRsaWZl
+LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN/VCCu1SZ5x4vNp
+XZZ8r3lzqeLwjxVZfMSQCKM4lV5DFbqiZMMBto4Y/ib7i0audzuTDnImCLsfzlTu
+7iZLoJNy42/43Rq4xtaDZ7joxALFmzXUKEipgHiTTbAbLQNCS4wPXts3tScODVZY
+/mhlmXdlLuGxJbqoyOEP6NEQbgXWDCKDERnAEG/FJBVHKyBfg3abrrIuQNwYCKCS
+2OZ5Z5MveGmY4tSKUOOi/c0vV9HsanQn/ymybZjxR5Kmb1CvQr7VVtbpR1MhlGkc
+sfJz1NFIFxdXkUggIny+XSG1dAAJRFFumyRM+X/eh0NHNmAI14JJ43hB6Zw3dzzl
+An9BSeECAwEAAaOCATIwggEuMB8GA1UdIwQYMBaAFEJ5VBthzVUrPmPVPEhX9Z/7
+Rc5KMA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUH
+AwIwKwYDVR0RBCQwIoIQKi5zZWNvbmRsaWZlLmNvbYIOc2Vjb25kbGlmZS5jb20w
+PQYDVR0fBDYwNDAyoDCgLoYsaHR0cDovL2d0c3NsLWNybC5nZW90cnVzdC5jb20v
+Y3Jscy9ndHNzbC5jcmwwHQYDVR0OBBYEFK9UTMkc4Fh/Ug4fVs6UVhxP6my0MAwG
+A1UdEwEB/wQCMAAwQwYIKwYBBQUHAQEENzA1MDMGCCsGAQUFBzAChidodHRwOi8v
+Z3Rzc2wtYWlhLmdlb3RydXN0LmNvbS9ndHNzbC5jcnQwDQYJKoZIhvcNAQEFBQAD
+ggEBACIR9yggGHDcZ60AMNdFmZ8XJeahTuv6q2X/It2JxqSQp5BVQUei0NGIYYOt
+yg0JFBZn5KqXiQ5Zz84K4hdvh/6grCEAn4v37sozSbkeZ92Lec8NOZR42HfYIOCo
+Hx9q7CNRxdhv6ehV4LekaRBxrtp5etVsIDaWvRZEswCWl46VuLrfjcpauj6DAdOQ
+FfPVAW+4nPgLr8KapZMnXYnabIwrj9DQLQ88w/D7durenu/SYJEahWW9mb++n9is
+eMjyuyzYW0PTUBTaDsj+2ZmHJtoR1tBiLqh0Q62UQnmDgsf5SK5PTb8jnta/1SvN
+3pirsuvjMPV19zuH6b9NpJfXfd0=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDfTCCAuagAwIBAgIDErvmMA0GCSqGSIb3DQEBBQUAME4xCzAJBgNVBAYTAlVT
+MRAwDgYDVQQKEwdFcXVpZmF4MS0wKwYDVQQLEyRFcXVpZmF4IFNlY3VyZSBDZXJ0
+aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDIwNTIxMDQwMDAwWhcNMTgwODIxMDQwMDAw
+WjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UE
+AxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9m
+OSm9BXiLnTjoBbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIu
+T8rxh0PBFpVXLVDviS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6c
+JmTM386DGXHKTubU1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmR
+Cw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5asz
+PeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo4HwMIHtMB8GA1UdIwQYMBaAFEjm
+aPkr0rKV10fYIyAQTzOYkJ/UMB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrM
+TjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjA6BgNVHR8EMzAxMC+g
+LaArhilodHRwOi8vY3JsLmdlb3RydXN0LmNvbS9jcmxzL3NlY3VyZWNhLmNybDBO
+BgNVHSAERzBFMEMGBFUdIAAwOzA5BggrBgEFBQcCARYtaHR0cHM6Ly93d3cuZ2Vv
+dHJ1c3QuY29tL3Jlc291cmNlcy9yZXBvc2l0b3J5MA0GCSqGSIb3DQEBBQUAA4GB
+AHbhEm5OSxYShjAGsoEIz/AIx8dxfmbuwu3UOx//8PDITtZDOLC5MH0Y0FWDomrL
+NhGc6Ehmo21/uBPUR/6LWlxz/K7ZGzIZOKuXNBSqltLroxwUCEm2u+WR74M26x1W
+b8ravHNjkOR/ez4iyz0H7V84dJzjA1BOoa+Y7mHyhD8S
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIID2TCCAsGgAwIBAgIDAjbQMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT
+MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i
+YWwgQ0EwHhcNMTAwMjE5MjIzOTI2WhcNMjAwMjE4MjIzOTI2WjBAMQswCQYDVQQG
+EwJVUzEXMBUGA1UEChMOR2VvVHJ1c3QsIEluYy4xGDAWBgNVBAMTD0dlb1RydXN0
+IFNTTCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJCzgMHk5Uat
+cGA9uuUU3Z6KXot1WubKbUGlI+g5hSZ6p1V3mkihkn46HhrxJ6ujTDnMyz1Hr4Gu
+FmpcN+9FQf37mpc8oEOdxt8XIdGKolbCA0mEEoE+yQpUYGa5jFTk+eb5lPHgX3UR
+8im55IaisYmtph6DKWOy8FQchQt65+EuDa+kvc3nsVrXjAVaDktzKIt1XTTYdwvh
+dGLicTBi2LyKBeUxY0pUiWozeKdOVSQdl+8a5BLGDzAYtDRN4dgjOyFbLTAZJQ50
+96QhS6CkIMlszZhWwPKoXz4mdaAN+DaIiixafWcwqQ/RmXAueOFRJq9VeiS+jDkN
+d53eAsMMvR8CAwEAAaOB2TCB1jAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFEJ5
+VBthzVUrPmPVPEhX9Z/7Rc5KMB8GA1UdIwQYMBaAFMB6mGiNifurBWQMEX2qfWW4
+ysxOMBIGA1UdEwEB/wQIMAYBAf8CAQAwOgYDVR0fBDMwMTAvoC2gK4YpaHR0cDov
+L2NybC5nZW90cnVzdC5jb20vY3Jscy9ndGdsb2JhbC5jcmwwNAYIKwYBBQUHAQEE
+KDAmMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5nZW90cnVzdC5jb20wDQYJKoZI
+hvcNAQEFBQADggEBANTvU4ToGr2hiwTAqfVfoRB4RV2yV2pOJMtlTjGXkZrUJPji
+J2ZwMZzBYlQG55cdOprApClICq8kx6jEmlTBfEx4TCtoLF0XplR4TEbigMMfOHES
+0tdT41SFULgCy+5jOvhWiU1Vuy7AyBh3hjELC3DwfjWDpCoTZFZnNF0WX3OsewYk
+2k9QbSqr0E1TQcKOu3EDSSmGGM8hQkx0YlEVxW+o78Qn5Rsz3VqI138S0adhJR/V
+4NwdzxoQ2KDLX4z6DOW/cf/lXUQdpj6HR/oaToODEj+IZpWYeZqF6wJHzSXj8gYE
+TpnKXKBuervdo5AaRTPvvz7SBMS24CqFZUE+ENQ=
+-----END CERTIFICATE-----
diff --git a/indra/newview/app_settings/llsd.xsd b/indra/newview/app_settings/llsd.xsd
new file mode 100644
index 0000000000..34612d9faa
--- /dev/null
+++ b/indra/newview/app_settings/llsd.xsd
@@ -0,0 +1,131 @@
+<?xml version="1.0"?>
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+
+ <!-- LLSD document has exactly one value -->
+ <xsd:element name="llsd">
+ <xsd:complexType>
+ <xsd:group ref="llsd-value" />
+ </xsd:complexType>
+ </xsd:element>
+
+ <!-- Value is one of undef, boolean, integer, real,
+ uuid, string, date, binary, array, or map -->
+ <xsd:group name="llsd-value">
+ <xsd:choice>
+ <xsd:element ref="undef"/>
+ <xsd:element ref="boolean"/>
+ <xsd:element ref="integer"/>
+ <xsd:element ref="real"/>
+ <xsd:element ref="uuid"/>
+ <xsd:element ref="string"/>
+ <xsd:element ref="date"/>
+ <xsd:element ref="uri"/>
+ <xsd:element ref="binary"/>
+ <xsd:element ref="array"/>
+ <xsd:element ref="map"/>
+ </xsd:choice>
+ </xsd:group>
+
+ <!-- Undefined is an empty eleemnt -->
+ <xsd:element name="undef">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:length value="0" />
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <!-- Boolean is true or false -->
+ <xsd:element name="boolean">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="true" />
+ <xsd:enumeration value="false" />
+
+ <!-- In practice, these other serializations are seen: -->
+ <xsd:enumeration value="" />
+ <xsd:enumeration value="1" />
+ <xsd:enumeration value="0" />
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <!-- Integer is restricted to 32-bit signed values -->
+ <xsd:element name="integer">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:int" />
+ </xsd:simpleType>
+ </xsd:element>
+
+ <!-- Real is an IEEE 754 "double" value, including Infinities and NaN -->
+ <xsd:element name="real">
+ <xsd:simpleType>
+ <!-- TODO: xsd:double uses "INF", "-INF", and "NaN",
+ whereas LLSD prefers "Infinity", "-Infinity" and "NaN" -->
+ <xsd:restriction base="xsd:double" />
+ </xsd:simpleType>
+ </xsd:element>
+
+ <!-- UUID per RFC 4122 -->
+ <xsd:element name="uuid">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}|" />
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <!-- String is any sequence of Unicode characters -->
+ <xsd:element name="string">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string" />
+ </xsd:simpleType>
+ </xsd:element>
+
+ <!-- Date is ISO 8601 in UTC -->
+ <xsd:element name="date">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:dateTime">
+ <!-- Restrict to UTC (Z) times -->
+ <xsd:pattern value="[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(\.[0-9]+)?Z" />
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <!-- URI per RFC 3986 -->
+ <xsd:element name="uri">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:anyURI" />
+ </xsd:simpleType>
+ </xsd:element>
+
+ <!-- Binary data is base64 encoded -->
+ <xsd:element name="binary">
+ <xsd:simpleType>
+ <!-- TODO: Require encoding attribute? -->
+ <xsd:restriction base="xsd:base64Binary" />
+ </xsd:simpleType>
+ </xsd:element>
+
+ <!-- Array is a sequence of zero or more values -->
+ <xsd:element name="array">
+ <xsd:complexType>
+ <xsd:group minOccurs="0" maxOccurs="unbounded" ref="llsd-value" />
+ </xsd:complexType>
+ </xsd:element>
+
+ <!-- Map is a sequence of zero or more key/value pairs -->
+ <xsd:element name="map">
+ <xsd:complexType>
+ <xsd:sequence minOccurs="0" maxOccurs="unbounded">
+ <xsd:element name="key">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string" />
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:group ref="llsd-value" />
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+</xsd:schema>
diff --git a/indra/newview/app_settings/logcontrol.xml b/indra/newview/app_settings/logcontrol.xml
index 937c4e4c6a..a76eb3cd37 100644
--- a/indra/newview/app_settings/logcontrol.xml
+++ b/indra/newview/app_settings/logcontrol.xml
@@ -20,6 +20,7 @@
<key>tags</key>
<array>
<string>AppInit</string>
+ <string>Capabilities</string>
<string>SystemInfo</string>
<string>TextureCache</string>
<string>AppCache</string>
@@ -42,7 +43,7 @@
<key>tags</key>
<array>
<!-- sample entry for debugging a specific item -->
-<!-- <string>Voice</string> -->
+<!-- <string>Voice</string> -->
</array>
</map>
</array>
diff --git a/indra/newview/app_settings/low_graphics.xml b/indra/newview/app_settings/low_graphics.xml
index 136087f69b..ca1dae0b86 100644
--- a/indra/newview/app_settings/low_graphics.xml
+++ b/indra/newview/app_settings/low_graphics.xml
@@ -4,15 +4,17 @@
<RenderAvatarCloth value="FALSE"/>
<!--Default for now-->
<RenderAvatarLODFactor value="0.5"/>
- <!--Default for now-->
- <RenderAvatarMaxVisible value="3"/>
+ <!--Default for now-->
+ <RenderAvatarPhysicsLODFactor value="0.0"/>
+ <!--Default for now-->
+ <RenderAvatarMaxVisible value="3"/>
<!--NO SHADERS-->
<RenderAvatarVP value="FALSE"/>
<!--Short Range-->
<RenderFarClip value="64"/>
<!--Default for now-->
<RenderFlexTimeFactor value="0.5"/>
- <!--256... but they don't use this-->
+ <!--256... but they do not use this-->
<RenderGlowResolutionPow value="8"/>
<!--Low number-->
<RenderMaxPartCount value="1024"/>
@@ -26,8 +28,6 @@
<RenderTerrainLODFactor value="1.0"/>
<!--Default for now-->
<RenderTreeLODFactor value="0.5"/>
- <!--Default for now-->
- <RenderUseFBO value="0"/>
<!--Try Impostors-->
<RenderUseImpostors value="TRUE"/>
<!--Default for now-->
@@ -36,11 +36,10 @@
<VertexShaderEnable value="FALSE"/>
<!--NO SHADERS-->
<WindLightUseAtmosShaders value="FALSE"/>
- <!--No Deferred Shading-->
- <RenderDeferred value="FALSE"/>
- <!--SSAO Disabled-->
- <RenderDeferredSSAO value="FALSE"/>
- <!--No Shadows-->
- <RenderShadowDetail value="0"/>
-
+ <!--No Deferred Shading-->
+ <RenderDeferred value="FALSE"/>
+ <!--SSAO Disabled-->
+ <RenderDeferredSSAO value="FALSE"/>
+ <!--No Shadows-->
+ <RenderShadowDetail value="0"/>
</settings>
diff --git a/indra/newview/app_settings/mid_graphics.xml b/indra/newview/app_settings/mid_graphics.xml
index c150a87cdf..01822fe64c 100644
--- a/indra/newview/app_settings/mid_graphics.xml
+++ b/indra/newview/app_settings/mid_graphics.xml
@@ -4,13 +4,15 @@
<RenderAvatarCloth value="FALSE"/>
<!--Default for now-->
<RenderAvatarLODFactor value="0.5"/>
+ <!--Default for now-->
+ <RenderAvatarPhysicsLODFactor value="0.75"/>
<!--NO SHADERS-->
<RenderAvatarVP value="TRUE"/>
<!--Short Range-->
<RenderFarClip value="96"/>
<!--Default for now-->
<RenderFlexTimeFactor value="1"/>
- <!--256... but they don't use this-->
+ <!--256... but they do not use this-->
<RenderGlowResolutionPow value="8"/>
<!--Low number-->
<RenderMaxPartCount value="2048"/>
@@ -24,8 +26,6 @@
<RenderTerrainLODFactor value="1.0"/>
<!--Default for now-->
<RenderTreeLODFactor value="0.5"/>
- <!--Default for now-->
- <RenderUseFBO value="0"/>
<!--Try Impostors-->
<RenderUseImpostors value="TRUE"/>
<!--Default for now-->
@@ -34,11 +34,10 @@
<VertexShaderEnable value="TRUE"/>
<!--NO SHADERS-->
<WindLightUseAtmosShaders value="FALSE"/>
- <!--No Deferred Shading-->
- <RenderDeferred value="FALSE"/>
- <!--SSAO Disabled-->
- <RenderDeferredSSAO value="FALSE"/>
- <!--No Shadows-->
- <RenderShadowDetail value="0"/>
-
+ <!--No Deferred Shading-->
+ <RenderDeferred value="FALSE"/>
+ <!--SSAO Disabled-->
+ <RenderDeferredSSAO value="FALSE"/>
+ <!--No Shadows-->
+ <RenderShadowDetail value="0"/>
</settings>
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 0f946b0f0b..05c05b9393 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" ?>
-<llsd>
+<llsd xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="llsd.xsd">
<map>
<key>CrashHostUrl</key>
<map>
@@ -15,8 +16,10 @@
<key>AFKTimeout</key>
<map>
<key>Comment</key>
- <string>Time before automatically setting AFK (away from keyboard) mode (seconds, 0=never).
- Valid values are: 0, 120, 300, 600, 1800</string>
+ <string>
+ Time before automatically setting AFK (away from keyboard) mode (seconds, 0=never).
+ Valid values are: 0, 120, 300, 600, 1800
+</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -607,6 +610,39 @@
<key>Value</key>
<integer>2</integer>
</map>
+ <key>AvatarPickerURL</key>
+ <map>
+ <key>Comment</key>
+ <string>Avatar picker contents</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>http://lecs-viewer-web-components.s3.amazonaws.com/v3.0/[GRID_LOWERCASE]/avatars.html</string>
+ </map>
+ <key>AvatarRotateThresholdSlow</key>
+ <map>
+ <key>Comment</key>
+ <string>Angle between avatar facing and camera facing at which avatar turns to face same direction as camera, when moving slowly (degrees)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <integer>60</integer>
+ </map>
+ <key>AvatarRotateThresholdFast</key>
+ <map>
+ <key>Comment</key>
+ <string>Angle between avatar facing and camera facing at which avatar turns to face same direction as camera, when moving fast (degrees)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <integer>2</integer>
+ </map>
<key>AvatarBakedTextureUploadTimeout</key>
<map>
<key>Comment</key>
@@ -629,7 +665,17 @@
<key>Value</key>
<integer>10</integer>
</map>
-
+ <key>AvatarPhysics</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable avatar physics.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
<key>AvatarSex</key>
<map>
<key>Comment</key>
@@ -641,6 +687,7 @@
<key>Value</key>
<integer>0</integer>
</map>
+
<key>BackgroundYieldTime</key>
<map>
<key>Comment</key>
@@ -674,6 +721,28 @@
<key>Value</key>
<string>http://www.secondlife.com</string>
</map>
+ <key>BrowserIgnoreSSLCertErrors</key>
+ <map>
+ <key>Comment</key>
+ <string>FOR TESTING ONLY: Tell the built-in web browser to ignore SSL cert errors.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>BrowserEnableJSObject</key>
+ <map>
+ <key>Comment</key>
+ <string>(WARNING: Advanced feature. Use if you are aware of the implications). Enable or disable the viewer to Javascript bridge object.</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>BlockAvatarAppearanceMessages</key>
<map>
<key>Comment</key>
@@ -751,6 +820,61 @@
<key>Value</key>
<integer>5</integer>
</map>
+ <key>Socks5ProxyEnabled</key>
+ <map>
+ <key>Comment</key>
+ <string>Use Socks5 Proxy</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>HttpProxyType</key>
+ <map>
+ <key>Comment</key>
+ <string>Proxy type to use for HTTP operations</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>Socks</string>
+ </map>
+ <key>Socks5ProxyHost</key>
+ <map>
+ <key>Comment</key>
+ <string>Socks 5 Proxy Host</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string></string>
+ </map>
+ <key>Socks5ProxyPort</key>
+ <map>
+ <key>Comment</key>
+ <string>Socks 5 Proxy Port</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>1080</integer>
+ </map>
+ <key>Socks5AuthType</key>
+ <map>
+ <key>Comment</key>
+ <string>Selected Auth mechanism for Socks5</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>None</string>
+ </map>
<key>BuildAxisDeadZone0</key>
<map>
<key>Comment</key>
@@ -905,39 +1029,6 @@
<key>Value</key>
<integer>1</integer>
</map>
- <key>BulkChangeIncludeAnimations</key>
- <map>
- <key>Comment</key>
- <string>Bulk permission changes affect animations</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
- <key>BulkChangeIncludeAnimations</key>
- <map>
- <key>Comment</key>
- <string>Bulk permission changes affect animations</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
- <key>BulkChangeIncludeAnimations</key>
- <map>
- <key>Comment</key>
- <string>Bulk permission changes affect animations</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
<key>BulkChangeIncludeBodyParts</key>
<map>
<key>Comment</key>
@@ -1081,27 +1172,16 @@
<key>Value</key>
<integer>0</integer>
</map>
- <key>ButtonFlashCount</key>
+ <key>EnableButtonFlashing</key>
<map>
<key>Comment</key>
- <string>Number of flashes after which flashing buttons stay lit up</string>
+ <string>Allow UI to flash buttons to get your attention</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
- <string>S32</string>
+ <string>Boolean</string>
<key>Value</key>
- <integer>8</integer>
- </map>
- <key>ButtonFlashRate</key>
- <map>
- <key>Comment</key>
- <string>Frequency at which buttons flash (hz)</string>
- <key>Persist</key>
<integer>1</integer>
- <key>Type</key>
- <string>F32</string>
- <key>Value</key>
- <real>1.25</real>
</map>
<key>ButtonHPad</key>
<map>
@@ -1150,18 +1230,7 @@
<key>CacheLocationTopFolder</key>
<map>
<key>Comment</key>
- <string>Controls the top folder location of the local disk cache</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>String</string>
- <key>Value</key>
- <string />
- </map>
- <key>CacheLocationTopFolder</key>
- <map>
- <key>Comment</key>
- <string>Controls the location of the local disk cache</string>
+ <string>Controls the top folder location of the the local disk cache</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -1178,7 +1247,7 @@
<key>Type</key>
<string>U32</string>
<key>Value</key>
- <integer>20000</integer>
+ <integer>128</integer>
</map>
<key>CacheSize</key>
<map>
@@ -1343,7 +1412,80 @@
<key>Value</key>
<integer>0</integer>
</map>
- <key>CertStore</key>
+
+ <key>CameraFocusTransitionTime</key>
+ <map>
+ <key>Comment</key>
+ <string>How many seconds it takes the camera to transition between focal distances</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.5</real>
+ </map>
+
+ <key>CameraMaxCoF</key>
+ <map>
+ <key>Comment</key>
+ <string>Maximum camera circle of confusion for DoF effect</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>10.0</real>
+ </map>
+
+ <key>CameraFNumber</key>
+ <map>
+ <key>Comment</key>
+ <string>Camera f-number value for DoF effect</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>9.0</real>
+ </map>
+
+ <key>CameraFocalLength</key>
+ <map>
+ <key>Comment</key>
+ <string>Camera focal length for DoF effect (in millimeters)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>50</real>
+ </map>
+
+ <key>CameraFieldOfView</key>
+ <map>
+ <key>Comment</key>
+ <string>Vertical camera field of view for DoF effect (in degrees)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>60.0</real>
+ </map>
+
+ <key>CameraAspectRatio</key>
+ <map>
+ <key>Comment</key>
+ <string>Camera aspect ratio for DoF effect</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>1.5</real>
+ </map>
+
+ <key>CertStore</key>
<map>
<key>Comment</key>
<string>Specifies the Certificate Store for certificate trust verification</string>
@@ -1453,17 +1595,6 @@
<key>Value</key>
<integer>1</integer>
</map>
- <key>ChatVisible</key>
- <map>
- <key>Comment</key>
- <string>Chat bar is visible</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
<key>ChatWindow</key>
<map>
<key>Comment</key>
@@ -1508,17 +1639,6 @@
<key>Value</key>
<integer>0</integer>
</map>
- <key>CloseSnapshotOnKeep</key>
- <map>
- <key>Comment</key>
- <string>Close snapshot window after saving snapshot</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
<key>CmdLineDisableVoice</key>
<map>
<key>Comment</key>
@@ -1565,17 +1685,6 @@
<string />
</array>
</map>
- <key>CompressSnapshotsToDisk</key>
- <map>
- <key>Comment</key>
- <string>Compress snapshots saved to disk (Using JPEG 2000)</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
<key>ConnectAsGod</key>
<map>
<key>Comment</key>
@@ -1741,6 +1850,39 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>CurlMaximumNumberOfHandles</key>
+ <map>
+ <key>Comment</key>
+ <string>Maximum number of handles curl can use (requires restart)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>256</integer>
+ </map>
+ <key>CurlRequestTimeOut</key>
+ <map>
+ <key>Comment</key>
+ <string>Max idle time of a curl request before killed (requires restart)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>120.0</real>
+ </map>
+ <key>CurlUseMultipleThreads</key>
+ <map>
+ <key>Comment</key>
+ <string>Use background threads for executing curl_multi_perform (requires restart)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
<key>Cursor3D</key>
<map>
<key>Comment</key>
@@ -1807,6 +1949,17 @@
<key>Value</key>
<integer>1</integer>
</map>
+ <key>DebugHideEmptySystemFolders</key>
+ <map>
+ <key>Comment</key>
+ <string>Hide empty system folders when on</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
<key>DebugInventoryFilters</key>
<map>
<key>Comment</key>
@@ -1851,10 +2004,32 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>DebugShowMemory</key>
+ <map>
+ <key>Comment</key>
+ <string>Show Total Allocated Memory</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>DebugShowPrivateMem</key>
+ <map>
+ <key>Comment</key>
+ <string>Show Private Mem Info</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>DebugShowRenderInfo</key>
<map>
<key>Comment</key>
- <string>Show depth buffer contents</string>
+ <string>Show stats about current scene</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -1873,10 +2048,21 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>DebugShowTextureInfo</key>
+ <map>
+ <key>Comment</key>
+ <string>Show inertested texture info</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>DebugShowTime</key>
<map>
<key>Comment</key>
- <string>Show depth buffer contents</string>
+ <string>Show time info</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -1884,6 +2070,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>DebugShowUploadCost</key>
+ <map>
+ <key>Comment</key>
+ <string>Show mesh upload cost</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
<key>DebugShowXUINames</key>
<map>
<key>Comment</key>
@@ -2556,7 +2753,18 @@
<key>Value</key>
<integer>10</integer>
</map>
- <key>DisableCameraConstraints</key>
+ <key>DestinationGuideURL</key>
+ <map>
+ <key>Comment</key>
+ <string>Destination guide contents</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>http://lecs-viewer-web-components.s3.amazonaws.com/v3.0/[GRID_LOWERCASE]/guide.html</string>
+ </map>
+ <key>DisableCameraConstraints</key>
<map>
<key>Comment</key>
<string>Disable the normal bounds put on the camera by avatar position</string>
@@ -2578,10 +2786,32 @@
<key>Value</key>
<integer>0</integer>
</map>
- <key>DisableRendering</key>
+ <key>DisableExternalBrowser</key>
+ <map>
+ <key>Comment</key>
+ <string>Disable opening an external browser.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>HeadlessClient</key>
<map>
<key>Comment</key>
- <string>Disable GL rendering and GUI (load testing)</string>
+ <string>Run in headless mode by disabling GL rendering, keyboard, etc</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>DisableTextHyperlinkActions</key>
+ <map>
+ <key>Comment</key>
+ <string>Disable highlighting and linking of URLs in XUI text boxes</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -2732,6 +2962,28 @@
<key>Value</key>
<integer>1</integer>
</map>
+ <key>ClickActionBuyEnabled</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable click to buy actions in tool pie menu</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>ClickActionPayEnabled</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable click to pay actions in tool pie menu</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
<key>DoubleClickAutoPilot</key>
<map>
<key>Comment</key>
@@ -2754,6 +3006,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>DoubleClickShowWorldMap</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable double-click to show world map from mini map</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
<key>DragAndDropToolTipDelay</key>
<map>
<key>Comment</key>
@@ -2875,10 +3138,43 @@
<key>Value</key>
<integer>1</integer>
</map>
- <key>EnableRippleWater</key>
+ <key>EnableGrab</key>
+ <map>
+ <key>Comment</key>
+ <string>Use Ctrl+mouse to grab and manipulate objects</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>EnableAltZoom</key>
+ <map>
+ <key>Comment</key>
+ <string>Use Alt+mouse to look at and zoom in on objects</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>EnableGestureSounds</key>
<map>
<key>Comment</key>
- <string>Whether to use ripple water shader or not</string>
+ <string>Play sounds from gestures</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>EnableMouselook</key>
+ <map>
+ <key>Comment</key>
+ <string>Allow first person perspective and mouse control of camera</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -2906,7 +3202,7 @@
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <integer>1</integer>
+ <integer>0</integer>
</map>
<key>EnableVoiceChat</key>
<map>
@@ -2986,17 +3282,6 @@
<string>http://viewer-settings.secondlife.com</string>
</map>
<key>FPSLogFrequency</key>
- <map>
- <key>Comment</key>
- <string>Seconds between display of FPS in log (0 for never)</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>F32</string>
- <key>Value</key>
- <real>60.0</real>
- </map>
- <key>FPSLogFrequency</key>
<map>
<key>Comment</key>
<string>Seconds between display of FPS in log (0 for never)</string>
@@ -3073,17 +3358,6 @@
<key>Value</key>
<integer>1</integer>
</map>
- <key>FirstLoginThisInstall</key>
- <map>
- <key>Comment</key>
- <string>Specifies that you have not successfully logged in since you installed the latest update</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
<key>FirstName</key>
<map>
<key>Comment</key>
@@ -3109,7 +3383,18 @@
<key>FirstRunThisInstall</key>
<map>
<key>Comment</key>
- <string>Specifies that you have not run the viewer since you installed the latest update</string>
+ <string>Specifies that you have not run the viewer since you performed a clean install</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>FirstLoginThisInstall</key>
+ <map>
+ <key>Comment</key>
+ <string>Specifies that you have not logged in with the viewer since you performed a clean install</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -3568,72 +3853,6 @@
<key>Value</key>
<real>0.5</real>
</map>
- <key>FontMonospace</key>
- <map>
- <key>Comment</key>
- <string>Name of monospace font that definitely exists (Truetype file name)</string>
- <key>Persist</key>
- <integer>0</integer>
- <key>Type</key>
- <string>String</string>
- <key>Value</key>
- <string>DejaVuSansMono.ttf</string>
- </map>
- <key>FontSansSerif</key>
- <map>
- <key>Comment</key>
- <string>Name of primary sans-serif font that definitely exists (Truetype file name)</string>
- <key>Persist</key>
- <integer>0</integer>
- <key>Type</key>
- <string>String</string>
- <key>Value</key>
- <string>MtBkLfRg.ttf</string>
- </map>
- <key>FontSansSerifBundledFallback</key>
- <map>
- <key>Comment</key>
- <string>Name of secondary sans-serif font that definitely exists (Truetype file name)</string>
- <key>Persist</key>
- <integer>0</integer>
- <key>Type</key>
- <string>String</string>
- <key>Value</key>
- <string>DejaVuSansCondensed.ttf</string>
- </map>
- <key>FontSansSerifBold</key>
- <map>
- <key>Comment</key>
- <string>Name of bold font (Truetype file name)</string>
- <key>Persist</key>
- <integer>0</integer>
- <key>Type</key>
- <string>String</string>
- <key>Value</key>
- <string>MtBdLfRg.ttf</string>
- </map>
- <key>FontSansSerifFallback</key>
- <map>
- <key>Comment</key>
- <string>Name of sans-serif font (Truetype file name)</string>
- <key>Persist</key>
- <integer>0</integer>
- <key>Type</key>
- <string>String</string>
- <key>Value</key>
- <string />
- </map>
- <key>FontSansSerifFallbackScale</key>
- <map>
- <key>Comment</key>
- <string>Scale of fallback font relative to huge font (fraction of huge font size)</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>F32</string>
- <key>Value</key>
- <real>1.0</real>
- </map>
<key>FontScreenDPI</key>
<map>
<key>Comment</key>
@@ -3645,61 +3864,6 @@
<key>Value</key>
<real>96.0</real>
</map>
- <key>FontSizeHuge</key>
- <map>
- <key>Comment</key>
- <string>Size of huge font (points, or 1/72 of an inch)</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>F32</string>
- <key>Value</key>
- <real>16.0</real>
- </map>
- <key>FontSizeLarge</key>
- <map>
- <key>Comment</key>
- <string>Size of large font (points, or 1/72 of an inch)</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>F32</string>
- <key>Value</key>
- <real>12.0</real>
- </map>
- <key>FontSizeMedium</key>
- <map>
- <key>Comment</key>
- <string>Size of medium font (points, or 1/72 of an inch)</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>F32</string>
- <key>Value</key>
- <real>10.0</real>
- </map>
- <key>FontSizeMonospace</key>
- <map>
- <key>Comment</key>
- <string>Size of monospaced font (points, or 1/72 of an inch)</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>F32</string>
- <key>Value</key>
- <real>8.1</real>
- </map>
- <key>FontSizeSmall</key>
- <map>
- <key>Comment</key>
- <string>Size of small font (points, or 1/72 of an inch)</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>F32</string>
- <key>Value</key>
- <real>9.0</real>
- </map>
<key>ForceAssetFail</key>
<map>
<key>Comment</key>
@@ -3775,7 +3939,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>https://www.xstreetsl.com/modules.php?name=Marketplace&amp;CategoryID=233</string>
+ <string>https://marketplace.secondlife.com/products/search?search[category_id]=200&amp;search[maturity][]=General&amp;search[page]=1&amp;search[per_page]=12</string>
</map>
<key>GridCrossSections</key>
<map>
@@ -3892,12 +4056,23 @@
<key>Comment</key>
<string>URL pattern for help page; arguments will be encoded; see llviewerhelp.cpp:buildHelpURL for arguments</string>
<key>Persist</key>
- <integer>0</integer>
+ <integer>1</integer>
<key>Type</key>
<string>String</string>
<key>Value</key>
<string>http://viewer-help.secondlife.com/[LANGUAGE]/[CHANNEL]/[VERSION]/[TOPIC][DEBUG_MODE]</string>
</map>
+ <key>HowToHelpURL</key>
+ <map>
+ <key>Comment</key>
+ <string>URL for How To help content</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>http://lecs-viewer-web-components.s3.amazonaws.com/v3.0/[GRID_LOWERCASE]/howto/index.html</string>
+ </map>
<key>HomeSidePanelURL</key>
<map>
<key>Comment</key>
@@ -3920,6 +4095,28 @@
<key>Value</key>
<string>http://search.secondlife.com/viewer/[CATEGORY]/?q=[QUERY]&amp;p=[AUTH_TOKEN]&amp;r=[MATURITY]&amp;lang=[LANGUAGE]&amp;g=[GODLIKE]&amp;sid=[SESSION_ID]&amp;rid=[REGION_ID]&amp;pid=[PARCEL_ID]&amp;channel=[CHANNEL]&amp;version=[VERSION]&amp;major=[VERSION_MAJOR]&amp;minor=[VERSION_MINOR]&amp;patch=[VERSION_PATCH]&amp;build=[VERSION_BUILD]</string>
</map>
+ <key>WebProfileURL</key>
+ <map>
+ <key>Comment</key>
+ <string>URL for Web Profiles</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>https://my.secondlife.com/[AGENT_NAME]</string>
+ </map>
+ <key>WebProfileNonProductionURL</key>
+ <map>
+ <key>Comment</key>
+ <string>URL for Web Profiles on Non-Production grids</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>https://my-demo.secondlife.com/[AGENT_NAME]</string>
+ </map>
<key>HighResSnapshot</key>
<map>
<key>Comment</key>
@@ -3942,6 +4139,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>HostID</key>
+ <map>
+ <key>Comment</key>
+ <string>Machine identifier for hosted Second Life instances</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string />
+ </map>
<key>HtmlHelpLastPage</key>
<map>
<key>Comment</key>
@@ -3980,7 +4188,7 @@
<key>Comment</key>
<string>Ignore all notifications so we never need user input on them.</string>
<key>Persist</key>
- <integer>0</integer>
+ <integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
@@ -4017,7 +4225,7 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <real>0.5</real>
+ <real>0.65</real>
</map>
<key>InBandwidth</key>
<map>
@@ -4074,6 +4282,28 @@
<key>Value</key>
<real>1.0</real>
</map>
+ <key>InventoryDisplayInbox</key>
+ <map>
+ <key>Comment</key>
+ <string>Override received items inventory inbox display</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>InventoryDisplayOutbox</key>
+ <map>
+ <key>Comment</key>
+ <string>Override merchant inventory outbox display</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>InventoryLinking</key>
<map>
<key>Comment</key>
@@ -4085,6 +4315,50 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>InventoryOutboxLogging</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable debug output associated with the Merchant Outbox.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>InventoryOutboxMaxFolderCount</key>
+ <map>
+ <key>Comment</key>
+ <string>Maximum number of subfolders allowed in a listing in the merchant outbox.</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>21</integer>
+ </map>
+ <key>InventoryOutboxMaxFolderDepth</key>
+ <map>
+ <key>Comment</key>
+ <string>Maximum number of nested levels of subfolders allowed in a listing in the merchant outbox.</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>4</integer>
+ </map>
+ <key>InventoryOutboxMaxItemCount</key>
+ <map>
+ <key>Comment</key>
+ <string>Maximum number of items allowed in a listing in the merchant outbox.</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>200</integer>
+ </map>
<key>InventorySortOrder</key>
<map>
<key>Comment</key>
@@ -4261,6 +4535,39 @@
<key>Value</key>
<real>0.25</real>
</map>
+ <key>Jpeg2000AdvancedCompression</key>
+ <map>
+ <key>Comment</key>
+ <string>Use advanced Jpeg2000 compression options (precincts, blocks, ordering, markers)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>Jpeg2000PrecinctsSize</key>
+ <map>
+ <key>Comment</key>
+ <string>Size of image precincts. Assumed square and same for all levels. Must be power of 2.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>256</integer>
+ </map>
+ <key>Jpeg2000BlocksSize</key>
+ <map>
+ <key>Comment</key>
+ <string>Size of encoding blocks. Assumed square and same for all levels. Must be power of 2. Max 64, Min 4.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>64</integer>
+ </map>
<key>KeepAspectForSnapshot</key>
<map>
<key>Comment</key>
@@ -4349,21 +4656,21 @@
<key>Value</key>
<integer>1</integer>
</map>
- <key>LastGPUClass</key>
+ <key>LastGPUString</key>
<map>
<key>Comment</key>
- <string>[DO NOT MODIFY] previous GPU class for tracking hardware changes</string>
+ <string>[DO NOT MODIFY] previous GPU id string for tracking hardware changes</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
- <string>S32</string>
+ <string>String</string>
<key>Value</key>
- <integer>-1</integer>
+ <string></string>
</map>
<key>LastFeatureVersion</key>
<map>
<key>Comment</key>
- <string>[DO NOT MODIFY] Version number for tracking hardware changes</string>
+ <string>[DO NOT MODIFY] Feature Table Version number for tracking rendering system changes</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -4427,6 +4734,17 @@
<string>0.0.0</string>
</map>
+ <key>LastSnapshotToProfileHeight</key>
+ <map>
+ <key>Comment</key>
+ <string>The height of the last profile snapshot, in px</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>768</integer>
+ </map>
<key>LastSnapshotToEmailHeight</key>
<map>
<key>Comment</key>
@@ -4438,6 +4756,17 @@
<key>Value</key>
<integer>768</integer>
</map>
+ <key>LastSnapshotToProfileWidth</key>
+ <map>
+ <key>Comment</key>
+ <string>The width of the last profile snapshot, in px</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>1024</integer>
+ </map>
<key>LastSnapshotToEmailWidth</key>
<map>
<key>Comment</key>
@@ -4493,17 +4822,6 @@
<key>Value</key>
<integer>512</integer>
</map>
- <key>LastSnapshotType</key>
- <map>
- <key>Comment</key>
- <string>Select this as next type of snapshot to take (0 = postcard, 1 = texture, 2 = local image)</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>S32</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
<key>LeftClickShowMenu</key>
<map>
<key>Comment</key>
@@ -4614,6 +4932,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>LocalFileSystemBrowsingEnabled</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable/disable access to the local file system via the file picker</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
<key>LoginSRVTimeout</key>
<map>
<key>Comment</key>
@@ -4689,7 +5018,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string />
+ <string/>
</map>
<key>LosslessJ2CUpload</key>
<map>
@@ -4711,7 +5040,7 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <real>20.0</real>
+ <real>60.0</real>
</map>
<key>MapOverlayIndex</key>
<map>
@@ -4746,6 +5075,17 @@
<key>Value</key>
<string>http://map.secondlife.com.s3.amazonaws.com/</string>
</map>
+ <key>CurrentMapServerURL</key>
+ <map>
+ <key>Comment</key>
+ <string>Current Session World map URL</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string></string>
+ </map>
<key>MapShowEvents</key>
<map>
<key>Comment</key>
@@ -4832,7 +5172,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/</string>
+ <string>https://marketplace.secondlife.com/</string>
</map>
<key>MarketplaceURL_objectFemale</key>
<map>
@@ -4843,7 +5183,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/attachments</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/attachments</string>
</map>
<key>MarketplaceURL_objectMale</key>
<map>
@@ -4854,7 +5194,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/attachments</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/attachments</string>
</map>
<key>MarketplaceURL_clothingFemale</key>
<map>
@@ -4865,7 +5205,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/clothing_female_avatar</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/clothing_female_avatar</string>
</map>
<key>MarketplaceURL_clothingMale</key>
<map>
@@ -4876,7 +5216,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/clothing_male_avatar</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/clothing_male_avatar</string>
</map>
<key>MarketplaceURL_bodypartFemale</key>
<map>
@@ -4887,7 +5227,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com</string>
+ <string>https://marketplace.secondlife.com/</string>
</map>
<key>MarketplaceURL_bodypartMale</key>
<map>
@@ -4898,7 +5238,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/</string>
+ <string>https://marketplace.secondlife.com/</string>
</map>
<key>MarketplaceURL_glovesMale</key>
<map>
@@ -4909,7 +5249,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/gloves_both_women_and_men</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/gloves_both_women_and_men</string>
</map>
<key>MarketplaceURL_glovesFemale</key>
<map>
@@ -4920,7 +5260,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/gloves_both_women_and_men</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/gloves_both_women_and_men</string>
</map>
<key>MarketplaceURL_jacketFemale</key>
<map>
@@ -4931,7 +5271,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/jacket_womens</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/jacket_womens</string>
</map>
<key>MarketplaceURL_jacketMale</key>
<map>
@@ -4942,7 +5282,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/jacket_mens</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/jacket_mens</string>
</map>
<key>MarketplaceURL_shirtFemale</key>
<map>
@@ -4953,7 +5293,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/shirt_womens</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/shirt_womens</string>
</map>
<key>MarketplaceURL_shirtMale</key>
<map>
@@ -4964,7 +5304,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/shirt_mens</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/shirt_mens</string>
</map>
<key>MarketplaceURL_undershirtFemale</key>
<map>
@@ -4975,7 +5315,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/undershirt_womens</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/undershirt_womens</string>
</map>
<key>MarketplaceURL_undershirtMale</key>
<map>
@@ -4986,7 +5326,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/undershirt_mens</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/undershirt_mens</string>
</map>
<key>MarketplaceURL_skirtFemale</key>
<map>
@@ -4997,7 +5337,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/skirts_women</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/skirts_women</string>
</map>
<key>MarketplaceURL_skirtMale</key>
<map>
@@ -5008,7 +5348,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/skirts_women</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/skirts_women</string>
</map>
<key>MarketplaceURL_pantsFemale</key>
<map>
@@ -5019,7 +5359,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/pants_women</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/pants_women</string>
</map>
<key>MarketplaceURL_pantsMale</key>
<map>
@@ -5030,7 +5370,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/pants_men</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/pants_men</string>
</map>
<key>MarketplaceURL_underpantsFemale</key>
<map>
@@ -5041,7 +5381,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/underwear_women</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/underwear_women</string>
</map>
<key>MarketplaceURL_underpantsMale</key>
<map>
@@ -5052,7 +5392,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/underwear_men</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/underwear_men</string>
</map>
<key>MarketplaceURL_shoesFemale</key>
<map>
@@ -5063,7 +5403,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/shoes_women</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/shoes_women</string>
</map>
<key>MarketplaceURL_shoesMale</key>
<map>
@@ -5074,7 +5414,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/shoes_men</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/shoes_men</string>
</map>
<key>MarketplaceURL_socksFemale</key>
<map>
@@ -5085,7 +5425,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/socks_women</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/socks_women</string>
</map>
<key>MarketplaceURL_socksMale</key>
<map>
@@ -5096,7 +5436,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/socks_women</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/socks_women</string>
</map>
<key>MarketplaceURL_tattooMale</key>
<map>
@@ -5107,7 +5447,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/tattoo_both_women_and_men</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/tattoo_both_women_and_men</string>
</map>
<key>MarketplaceURL_tattooFemale</key>
<map>
@@ -5118,7 +5458,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/tattoo_both_women_and_men</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/tattoo_both_women_and_men</string>
</map>
<key>MarketplaceURL_hairFemale</key>
<map>
@@ -5129,7 +5469,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/womens_hair</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/womens_hair</string>
</map>
<key>MarketplaceURL_hairMale</key>
<map>
@@ -5140,7 +5480,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/mens_hair</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/mens_hair</string>
</map>
<key>MarketplaceURL_eyesFemale</key>
<map>
@@ -5151,7 +5491,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/womens_eyes</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/womens_eyes</string>
</map>
<key>MarketplaceURL_eyesMale</key>
<map>
@@ -5162,7 +5502,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/mens_eyes</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/mens_eyes</string>
</map>
<key>MarketplaceURL_shapeFemale</key>
<map>
@@ -5173,7 +5513,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/womens_shape</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/womens_shape</string>
</map>
<key>MarketplaceURL_shapeMale</key>
<map>
@@ -5184,7 +5524,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/mens_shape</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/mens_shape</string>
</map>
<key>MarketplaceURL_skinFemale</key>
<map>
@@ -5195,7 +5535,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/womens_skin</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/womens_skin</string>
</map>
<key>MarketplaceURL_skinMale</key>
<map>
@@ -5206,7 +5546,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://marketplace.secondlife.com/trampoline/viewer21/mens_skin</string>
+ <string>https://marketplace.secondlife.com/trampoline/viewer21/mens_skin</string>
</map>
<key>MaxDragDistance</key>
<map>
@@ -5219,83 +5559,50 @@
<key>Value</key>
<real>48.0</real>
</map>
- <key>MaxSelectDistance</key>
+ <key>MaxHeapSize</key>
<map>
<key>Comment</key>
- <string>Maximum allowed selection distance (meters from avatar)</string>
+ <string>Maximum heap size (GB)</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <real>64.0</real>
+ <real>1.6</real>
</map>
- <key>MaxWearableWaitTime</key>
+ <key>MaxSelectDistance</key>
<map>
<key>Comment</key>
- <string>Max seconds to wait for wearable assets to fetch.</string>
+ <string>Maximum allowed selection distance (meters from avatar)</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <real>60.0</real>
- </map>
- <key>MeanCollisionBump</key>
- <map>
- <key>Comment</key>
- <string>You have experienced an abuse of being bumped by an object or avatar</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
- <key>MeanCollisionPhysical</key>
- <map>
- <key>Comment</key>
- <string>You have experienced an abuse from a physical object</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
- <key>MeanCollisionPushObject</key>
- <map>
- <key>Comment</key>
- <string>You have experienced an abuse of being pushed by a scripted object</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
- <key>MeanCollisionScripted</key>
- <map>
- <key>Comment</key>
- <string>You have experienced an abuse from a scripted object</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
+ <real>128.0</real>
</map>
- <key>MeanCollisionSelected</key>
+ <key>MaxWearableWaitTime</key>
<map>
<key>Comment</key>
- <string>You have experienced an abuse of being pushed via a selected object</string>
+ <string>Max seconds to wait for wearable assets to fetch.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
- <string>Boolean</string>
+ <string>F32</string>
<key>Value</key>
- <integer>0</integer>
+ <real>60.0</real>
</map>
+ <key>MediaPluginDebugging</key>
+ <map>
+ <key>Comment</key>
+ <string>Turn on debugging messages that may help diagnosing media issues (WARNING: May reduce performance).</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>MediaControlFadeTime</key>
<map>
<key>Comment</key>
@@ -5395,6 +5702,17 @@
<key>Value</key>
<integer>1</integer>
</map>
+ <key>MemoryFailurePreventionEnabled</key>
+ <map>
+ <key>Comment</key>
+ <string>If set, the viewer will quit to avoid crash when memory failure happens</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>MemoryLogFrequency</key>
<map>
<key>Comment</key>
@@ -5406,6 +5724,28 @@
<key>Value</key>
<real>600.0</real>
</map>
+ <key>MemoryPrivatePoolEnabled</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable the private memory pool management</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>MemoryPrivatePoolSize</key>
+ <map>
+ <key>Comment</key>
+ <string>Size of the private memory pool in MB (min. value is 256)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>512</integer>
+ </map>
<key>MemProfiling</key>
<map>
<key>Comment</key>
@@ -5461,7 +5801,62 @@
<key>Value</key>
<real>0</real>
</map>
- <key>MigrateCacheDirectory</key>
+ <key>MeshEnabled</key>
+ <map>
+ <key>Comment</key>
+ <string>Expose UI for mesh functionality (may require restart to take effect).</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <real>1</real>
+ </map>
+ <key>MeshImportUseSLM</key>
+ <map>
+ <key>Comment</key>
+ <string>Use cached copy of last upload for a dae if available instead of loading dae file from scratch.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <real>1</real>
+ </map>
+ <key>MeshUploadLogXML</key>
+ <map>
+ <key>Comment</key>
+ <string>Verbose XML logging on mesh upload</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <real>0</real>
+ </map>
+ <key>MeshUploadFakeErrors</key>
+ <map>
+ <key>Comment</key>
+ <string>Force upload errors (for testing)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <real>0</real>
+ </map>
+ <key>MeshUploadTimeOut</key>
+ <map>
+ <key>Comment</key>
+ <string>Maximum time in seconds for llcurl to execute a mesh uoloading request</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <real>600</real>
+ </map>
+ <key>MigrateCacheDirectory</key>
<map>
<key>Comment</key>
<string>Check for old version of disk cache to migrate to current location</string>
@@ -5871,10 +6266,12 @@
<key>ToastButtonWidth</key>
<map>
<key>Comment</key>
- <string>Default width of buttons in the toast.
+ <string>
+ Default width of buttons in the toast.
Notes:
If required width will be less then this one, a button will be reshaped to default size , otherwise to required
- Change of this parameter will affect the layout of buttons in notification toast.</string>
+ Change of this parameter will affect the layout of buttons in notification toast.
+</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -6083,17 +6480,6 @@
<key>OutBandwidth</key>
<map>
<key>Comment</key>
- <string>Expand render stats display</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
- <key>OutBandwidth</key>
- <map>
- <key>Comment</key>
<string>Outgoing bandwidth throttle (bps)</string>
<key>Persist</key>
<integer>1</integer>
@@ -6135,6 +6521,66 @@
<key>Value</key>
<real>0.0</real>
</map>
+ <key>ObjectCostHighThreshold</key>
+ <map>
+ <key>Comment</key>
+ <string>Threshold at which object cost is considered high (displayed in red).</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>50.0</real>
+ </map>
+ <key>ObjectCostLowColor</key>
+ <map>
+ <key>Comment</key>
+ <string>Color for object with a low object cost.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>0.0</real>
+ <real>0.5</real>
+ <real>1.0</real>
+ <real>0.5</real>
+ </array>
+ </map>
+ <key>ObjectCostMidColor</key>
+ <map>
+ <key>Comment</key>
+ <string>Color for object with a medium object cost.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>1.0</real>
+ <real>0.75</real>
+ <real>0.0</real>
+ <real>0.65</real>
+ </array>
+ </map>
+ <key>ObjectCostHighColor</key>
+ <map>
+ <key>Comment</key>
+ <string>Color for object a high object cost.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>1.0</real>
+ <real>0.0</real>
+ <real>0.0</real>
+ <real>0.75</real>
+ </array>
+ </map>
+
<key>ParcelMediaAutoPlayEnable</key>
<map>
<key>Comment</key>
@@ -6347,7 +6793,28 @@
<key>Value</key>
<integer>0</integer>
</map>
-
+ <key>PostFirstLoginIntroURL</key>
+ <map>
+ <key>Comment</key>
+ <string>URL of intro presenatation after first time users first login</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string></string>
+ </map>
+ <key>PostFirstLoginIntroViewed</key>
+ <map>
+ <key>Comment</key>
+ <string>Flag indicating if user has seen intro presenatation after first time users first login</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>PrecachingDelay</key>
<map>
<key>Comment</key>
@@ -6370,7 +6837,177 @@
<key>Value</key>
<integer>13</integer>
</map>
- <key>PrimMediaMasterEnabled</key>
+
+ <key>PreviewAmbientColor</key>
+ <map>
+ <key>Comment</key>
+ <string>Ambient color of preview render.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>0.0</real>
+ <real>0.0</real>
+ <real>0.0</real>
+ <real>1.0</real>
+ </array>
+ </map>
+
+
+ <key>PreviewDiffuse0</key>
+ <map>
+ <key>Comment</key>
+ <string>Diffise color of preview light 0.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>1.0</real>
+ <real>1.0</real>
+ <real>1.0</real>
+ <real>1.0</real>
+ </array>
+ </map>
+
+ <key>PreviewDiffuse1</key>
+ <map>
+ <key>Comment</key>
+ <string>Diffise color of preview light 1.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>0.25</real>
+ <real>0.25</real>
+ <real>0.25</real>
+ <real>1.0</real>
+ </array>
+ </map>
+
+ <key>PreviewDiffuse2</key>
+ <map>
+ <key>Comment</key>
+ <string>Diffise color of preview light 2.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>1.0</real>
+ <real>1.0</real>
+ <real>1.0</real>
+ <real>1.0</real>
+ </array>
+ </map>
+
+ <key>PreviewSpecular0</key>
+ <map>
+ <key>Comment</key>
+ <string>Diffise color of preview light 0.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>1.0</real>
+ <real>1.0</real>
+ <real>1.0</real>
+ <real>1.0</real>
+ </array>
+ </map>
+
+ <key>PreviewSpecular1</key>
+ <map>
+ <key>Comment</key>
+ <string>Diffise color of preview light 1.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>1.0</real>
+ <real>1.0</real>
+ <real>1.0</real>
+ <real>1.0</real>
+ </array>
+ </map>
+
+ <key>PreviewSpecular2</key>
+ <map>
+ <key>Comment</key>
+ <string>Diffise color of preview light 2.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>1.0</real>
+ <real>1.0</real>
+ <real>1.0</real>
+ <real>1.0</real>
+ </array>
+ </map>
+
+
+ <key>PreviewDirection0</key>
+ <map>
+ <key>Comment</key>
+ <string>Direction of light 0 for preview render.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Vector3</string>
+ <key>Value</key>
+ <array>
+ <real>-0.75</real>
+ <real>1</real>
+ <real>1.0</real>
+ </array>
+ </map>
+
+ <key>PreviewDirection1</key>
+ <map>
+ <key>Comment</key>
+ <string>Direction of light 1 for preview render.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Vector3</string>
+ <key>Value</key>
+ <array>
+ <real>0.5</real>
+ <real>-0.6</real>
+ <real>0.4</real>
+ </array>
+ </map>
+
+ <key>PreviewDirection2</key>
+ <map>
+ <key>Comment</key>
+ <string>Direction of light 2 for preview render.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Vector3</string>
+ <key>Value</key>
+ <array>
+ <real>0.5</real>
+ <real>-0.8</real>
+ <real>0.3</real>
+ </array>
+ </map>
+
+ <key>PrimMediaMasterEnabled</key>
<map>
<key>Comment</key>
<string>Whether or not Media on a Prim is enabled.</string>
@@ -6568,6 +7205,17 @@
<key>Value</key>
<real>0.0</real>
</map>
+ <key>QuitOnLoginActivated</key>
+ <map>
+ <key>Comment</key>
+ <string>Quit if login page is activated (used when auto login is on and users must not be able to login manually)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>RadioLandBrushAction</key>
<map>
<key>Comment</key>
@@ -6604,7 +7252,18 @@
<key>MediaBrowserWindowLimit</key>
<map>
<key>Comment</key>
- <string>Maximum number of media brower windows that can be open at once (0 for no limit)</string>
+ <string>Maximum number of media brower windows that can be open at once in the media browser floater (0 for no limit)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>5</integer>
+ </map>
+ <key>WebContentWindowLimit</key>
+ <map>
+ <key>Comment</key>
+ <string>Maximum number of web brower windows that can be open at once in the Web content floater (0 for no limit)</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -6711,6 +7370,75 @@
<key>Value</key>
<integer>1</integer>
</map>
+
+ <key>OctreeMaxNodeCapacity</key>
+ <map>
+ <key>Comment</key>
+ <string>Maximum number of elements to store in a single octree node</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>128</integer>
+ </map>
+
+ <key>OctreeStaticObjectSizeFactor</key>
+ <map>
+ <key>Comment</key>
+ <string>Multiplier on static object size for determining octree node size </string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>4</integer>
+ </map>
+
+ <key>OctreeAlphaDistanceFactor</key>
+ <map>
+ <key>Comment</key>
+ <string>Multiplier on alpha object distance for determining octree node size </string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Vector3</string>
+ <key>Value</key>
+ <array>
+ <real>0.1</real>
+ <real>0.0</real>
+ <real>0.0</real>
+ </array>
+ </map>
+
+ <key>OctreeAttachmentSizeFactor</key>
+ <map>
+ <key>Comment</key>
+ <string>Multiplier on attachment size for determining octree node size </string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>4</integer>
+ </map>
+
+ <key>OctreeDistanceFactor</key>
+ <map>
+ <key>Comment</key>
+ <string>Multiplier on distance for determining octree node size </string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Vector3</string>
+ <key>Value</key>
+ <array>
+ <real>0.01</real>
+ <real>0.0</real>
+ <real>0.0</real>
+ </array>
+ </map>
+
<key>RenderAnisotropic</key>
<map>
<key>Comment</key>
@@ -6777,6 +7505,88 @@
<key>Value</key>
<integer>1</integer>
</map>
+ <key>RenderAvatarComplexityLimit</key>
+ <map>
+ <key>Comment</key>
+ <string>Max visual complexity of avatars in a scene</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>-1</integer>
+ </map>
+ <key>RenderComplexityColorMin</key>
+ <map>
+ <key>Comment</key>
+ <string>Max visual complexity of avatars in a scene</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>0.0</real>
+ <real>0.0</real>
+ <real>1.0</real>
+ <real>0.5</real>
+ </array>
+ </map>
+ <key>RenderComplexityColorMid</key>
+ <map>
+ <key>Comment</key>
+ <string>Max visual complexity of avatars in a scene</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>0.0</real>
+ <real>1.0</real>
+ <real>0.0</real>
+ <real>0.5</real>
+ </array>
+ </map>
+ <key>RenderComplexityColorMax</key>
+ <map>
+ <key>Comment</key>
+ <string>Max visual complexity of avatars in a scene</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>1.0</real>
+ <real>0.0</real>
+ <real>0.0</real>
+ <real>0.5</real>
+ </array>
+ </map>
+ <key>RenderComplexityThreshold</key>
+ <map>
+ <key>Comment</key>
+ <string>Only color objects higher than render threshold</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>-1</integer>
+ </map>
+ <key>RenderComplexityStaticMax</key>
+ <map>
+ <key>Comment</key>
+ <string>Sets a static max value for scaling of RenderComplexity
+ display (-1 for dynamic scaling)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>-1</integer>
+ </map>
<key>RenderAvatarLODFactor</key>
<map>
<key>Comment</key>
@@ -6799,6 +7609,17 @@
<key>Value</key>
<integer>12</integer>
</map>
+ <key>RenderAvatarPhysicsLODFactor</key>
+ <map>
+ <key>Comment</key>
+ <string>Controls level of detail of avatar physics (such as breast physics).</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>1.0</real>
+ </map>
<key>RenderAvatarVP</key>
<map>
<key>Comment</key>
@@ -6810,7 +7631,33 @@
<key>Value</key>
<integer>1</integer>
</map>
-
+ <key>RenderPerformanceTest</key>
+ <map>
+ <key>Comment</key>
+ <string>
+ Disable rendering of everything but in-world content for
+ performance testing
+</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+
+ <key>RenderLocalLights</key>
+ <map>
+ <key>Comment</key>
+ <string>Whether or not to render local lights.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+
<key>RenderShadowNearDist</key>
<map>
<key>Comment</key>
@@ -6947,7 +7794,7 @@
<string>Vector3</string>
<key>Value</key>
<array>
- <real>0.40</real>
+ <real>0.80</real>
<real>1.00</real>
<real>0.00</real>
</array>
@@ -7007,7 +7854,18 @@
<key>Value</key>
<integer>0</integer>
</map>
- <key>RenderDebugPipeline</key>
+ <key>RenderDebugNormalScale</key>
+ <map>
+ <key>Comment</key>
+ <string>Scale of normals in debug display.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.03</real>
+ </map>
+ <key>RenderDebugPipeline</key>
<map>
<key>Comment</key>
<string>Enable strict pipeline debugging.</string>
@@ -7018,6 +7876,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>RenderMaxTextureIndex</key>
+ <map>
+ <key>Comment</key>
+ <string>Maximum texture index to use for indexed texture rendering.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>16</integer>
+ </map>
<key>RenderDebugTextureBind</key>
<map>
<key>Comment</key>
@@ -7040,6 +7909,7 @@
<key>Value</key>
<integer>0</integer>
</map>
+
<key>RenderAnimateRes</key>
<map>
<key>Comment</key>
@@ -7051,11 +7921,11 @@
<key>Value</key>
<integer>0</integer>
</map>
-
- <key>RenderAnimateTrees</key>
+
+ <key>RenderBakeSunlight</key>
<map>
<key>Comment</key>
- <string>Use GL matrix ops to animate tree branches.</string>
+ <string>Bake sunlight into vertex buffers for static objects.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -7064,150 +7934,30 @@
<integer>0</integer>
</map>
- <key>RenderGIRange</key>
- <map>
- <key>Comment</key>
- <string>Distance to cut off GI effect.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>F32</string>
- <key>Value</key>
- <real>96</real>
- </map>
-
- <key>RenderGILuminance</key>
- <map>
- <key>Comment</key>
- <string>Luminance factor of global illumination contribution.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>F32</string>
- <key>Value</key>
- <real>0.075</real>
- </map>
-
- <key>RenderGIBrightness</key>
- <map>
- <key>Comment</key>
- <string>Brightness factor of global illumination contribution.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>F32</string>
- <key>Value</key>
- <real>0.3</real>
- </map>
-
- <key>RenderGINoise</key>
- <map>
- <key>Comment</key>
- <string>Noise of position sampling for GI photon mapping.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>F32</string>
- <key>Value</key>
- <real>0.7</real>
- </map>
-
- <key>RenderGIAttenuation</key>
- <map>
- <key>Comment</key>
- <string>Distance attenuation factor for indirect lighting.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>F32</string>
- <key>Value</key>
- <real>0.1</real>
- </map>
-
- <key>RenderGIBlurBrightness</key>
- <map>
- <key>Comment</key>
- <string>Brightness factor of global illumination blur effect.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>F32</string>
- <key>Value</key>
- <real>1.025</real>
- </map>
-
- <key>RenderGIBlurEdgeWeight</key>
- <map>
- <key>Comment</key>
- <string>Edge weight for GI soften filter (sharpness).</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>F32</string>
- <key>Value</key>
- <real>0.8</real>
- </map>
-
- <key>RenderGIBlurIncrement</key>
- <map>
- <key>Comment</key>
- <string>Increment of scale for each pass of global illumination blur effect.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>F32</string>
- <key>Value</key>
- <real>0.8</real>
- </map>
-
- <key>RenderLuminanceScale</key>
+ <key>RenderNoAlpha</key>
<map>
<key>Comment</key>
- <string>Luminance value scalar for darkening effect.</string>
+ <string>Disable rendering of alpha objects (render all alpha objects as alpha masks).</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
- <string>F32</string>
- <key>Value</key>
- <real>1.0</real>
- </map>
-
- <key>RenderSunLuminanceScale</key>
- <map>
- <key>Comment</key>
- <string>Sun Luminance value scalar for darkening effect.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>F32</string>
+ <string>Boolean</string>
<key>Value</key>
- <real>1.0</real>
+ <integer>0</integer>
</map>
- <key>RenderSunLuminanceOffset</key>
+ <key>RenderMinimumLODTriangleCount</key>
<map>
<key>Comment</key>
- <string>Sun Luminance value offset for darkening effect.</string>
+ <string>Triangle count threshold at which automatic LOD generation stops</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
- <string>F32</string>
+ <string>U32</string>
<key>Value</key>
- <real>0</real>
+ <real>16</real>
</map>
- <key>RenderLuminanceDetail</key>
- <map>
- <key>Comment</key>
- <string>Mipmap level to use for luminance</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>F32</string>
- <key>Value</key>
- <real>16.0</real>
- </map>
-
<key>RenderEdgeDepthCutoff</key>
<map>
<key>Comment</key>
@@ -7298,7 +8048,6 @@
<key>Value</key>
<real>0.01</real>
</map>
-
<key>RenderShadowBiasError</key>
<map>
<key>Comment</key>
@@ -7321,7 +8070,31 @@
<key>Value</key>
<real>0</real>
</map>
-
+
+ <key>RenderDepthOfField</key>
+ <map>
+ <key>Comment</key>
+ <string>Whether to use depth of field effect when lighting and shadows are enabled</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+
+ <key>CameraDoFResScale</key>
+ <map>
+ <key>Comment</key>
+ <string>Amount to scale down depth of field resolution. Valid range is 0.25 (quarter res) to 1.0 (full res)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.7</real>
+ </map>
+
<key>RenderSpotLightsInNondeferred</key>
<map>
<key>Comment</key>
@@ -7343,7 +8116,7 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <real>0.0</real>
+ <real>-0.001</real>
</map>
<key>RenderSpotShadowOffset</key>
<map>
@@ -7466,7 +8239,7 @@
<key>Type</key>
<string>U32</string>
<key>Value</key>
- <real>128</real>
+ <real>512</real>
</map>
<key>RenderSpecularResY</key>
@@ -7490,7 +8263,7 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <real>8</real>
+ <real>384</real>
</map>
<key>RenderDeferred</key>
@@ -7505,18 +8278,6 @@
<integer>0</integer>
</map>
- <key>RenderDeferredGI</key>
- <map>
- <key>Comment</key>
- <string>Enable GI in deferred renderer.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
-
<key>RenderDeferredSun</key>
<map>
<key>Comment</key>
@@ -7565,30 +8326,6 @@
<integer>1</integer>
</map>
- <key>RenderDeferredLocalLights</key>
- <map>
- <key>Comment</key>
- <string>Execute local lighting shader in deferred renderer.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
-
- <key>RenderDeferredFullscreenLights</key>
- <map>
- <key>Comment</key>
- <string>Execute local lighting shader in deferred renderer.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
-
<key>RenderDeferredSunWash</key>
<map>
<key>Comment</key>
@@ -7631,7 +8368,7 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <real>1.1</real>
+ <real>0.8</real>
</map>
<key>RenderShadowGaussian</key>
@@ -7681,93 +8418,7 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <real>0.1</real>
- </map>
-
- <key>RenderGIAmbiance</key>
- <map>
- <key>Comment</key>
- <string>Ambiance factor of global illumination contribution.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>F32</string>
- <key>Value</key>
- <real>0.5</real>
- </map>
-
- <key>RenderGIMinRenderSize</key>
- <map>
- <key>Comment</key>
- <string>Minimum size of objects to put into GI source map.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>F32</string>
- <key>Value</key>
- <real>0.5</real>
- </map>
-
- <key>RenderGIBlurColorCurve</key>
- <map>
- <key>Comment</key>
- <string>Color curve for GI softening kernel</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Vector3</string>
- <key>Value</key>
- <array>
- <real>1.0</real>
- <real>0.6</real>
- <real>0.02</real>
- </array>
- </map>
-
- <key>RenderGIBlurPasses</key>
- <map>
- <key>Comment</key>
- <string>Scale of GI softening kernel.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>U32</string>
- <key>Value</key>
- <real>4</real>
- </map>
-
- <key>RenderGIBlurSize</key>
- <map>
- <key>Comment</key>
- <string>Scale of GI softening kernel.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>F32</string>
- <key>Value</key>
- <real>4.0</real>
- </map>
- <key>RenderGIBlurSamples</key>
- <map>
- <key>Comment</key>
- <string>Number of samples to take for each pass of GI blur (value range 1-16). Actual number of samples is value * 2 - 1.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>U32</string>
- <key>Value</key>
- <real>16</real>
- </map>
- <key>RenderGIBlurDistFactor</key>
- <map>
- <key>Comment</key>
- <string>Distance scaler for GI blur.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>F32</string>
- <key>Value</key>
- <real>0.0</real>
+ <real>0</real>
</map>
<key>RenderDynamicLOD</key>
@@ -7812,7 +8463,7 @@
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <integer>0</integer>
+ <integer>1</integer>
</map>
<key>RenderAutoMaskAlphaDeferred</key>
<map>
@@ -7825,17 +8476,6 @@
<key>Value</key>
<integer>1</integer>
</map>
- <key>RenderFastUI</key>
- <map>
- <key>Comment</key>
- <string>[NOT USED]</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
<key>RenderFlexTimeFactor</key>
<map>
<key>Comment</key>
@@ -7880,6 +8520,17 @@
<key>Value</key>
<real>1.0</real>
</map>
+ <key>RenderGLCoreProfile</key>
+ <map>
+ <key>Comment</key>
+ <string>Don't use a compatibility profile OpenGL context. Requires restart. Basic shaders MUST be enabled.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>RenderGlow</key>
<map>
<key>Comment</key>
@@ -7912,9 +8563,9 @@
<string>Vector3</string>
<key>Value</key>
<array>
- <real>0.299</real>
- <real>0.587</real>
- <real>0.114</real>
+ <real>1</real>
+ <real>0</real>
+ <real>0</real>
</array>
</map>
<key>RenderGlowMaxExtractAlpha</key>
@@ -7926,7 +8577,7 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <real>0.065</real>
+ <real>0.25</real>
</map>
<key>RenderGlowMinLuminance</key>
<map>
@@ -7937,7 +8588,7 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <real>2.5</real>
+ <real>9999</real>
</map>
<key>RenderGlowResolutionPow</key>
<map>
@@ -8051,7 +8702,7 @@
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <integer>1</integer>
+ <integer>0</integer>
</map>
<key>RenderHideGroupTitle</key>
<map>
@@ -8150,7 +8801,7 @@
<key>Type</key>
<string>S32</string>
<key>Value</key>
- <integer>8192</integer>
+ <integer>65536</integer>
</map>
<key>RenderMaxVBOSize</key>
<map>
@@ -8351,6 +9002,17 @@
<key>Value</key>
<real>1.0</real>
</map>
+ <key>RenderTrackerBeacon</key>
+ <map>
+ <key>Comment</key>
+ <string>Display tracking arrow and beacon to target avatar, teleport destination</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
<key>RenderTransparentWater</key>
<map>
<key>Comment</key>
@@ -8406,17 +9068,6 @@
<key>Value</key>
<integer>0</integer>
</map>
- <key>RenderUseFBO</key>
- <map>
- <key>Comment</key>
- <string>Whether we want to use GL_EXT_framebuffer_objects.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
<key>RenderUseTriStrips</key>
<map>
<key>Comment</key>
@@ -8450,6 +9101,28 @@
<key>Value</key>
<integer>1</integer>
</map>
+ <key>RenderAutoMuteByteLimit</key>
+ <map>
+ <key>Comment</key>
+ <string>Maximum bytes of attachments before an avatar is automatically visually muted (0 for no limit).</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>RenderAutoMuteSurfaceAreaLimit</key>
+ <map>
+ <key>Comment</key>
+ <string>Maximum surface area of attachments before an avatar is automatically visually muted (0 for no limit).</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>RenderUseShaderLOD</key>
<map>
<key>Comment</key>
@@ -8483,6 +9156,28 @@
<key>Value</key>
<integer>1</integer>
</map>
+ <key>RenderUseVAO</key>
+ <map>
+ <key>Comment</key>
+ <string>Use GL Vertex Array Objects</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>RenderVBOMappingDisable</key>
+ <map>
+ <key>Comment</key>
+ <string>Disable VBO glMapBufferARB</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
<key>RenderUseStreamVBO</key>
<map>
<key>Comment</key>
@@ -8494,7 +9189,18 @@
<key>Value</key>
<integer>1</integer>
</map>
- <key>RenderVolumeLODFactor</key>
+ <key>RenderPreferStreamDraw</key>
+ <map>
+ <key>Comment</key>
+ <string>Use GL_STREAM_DRAW in place of GL_DYNAMIC_DRAW</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>RenderVolumeLODFactor</key>
<map>
<key>Comment</key>
<string>Controls level of detail of primitives (multiplier for current screen area when calculated level of detail)</string>
@@ -8538,6 +9244,17 @@
<key>Value</key>
<integer>512</integer>
</map>
+ <key>RenderParcelSelection</key>
+ <map>
+ <key>Comment</key>
+ <string>Display selected parcel outline</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
<key>RotateRight</key>
<map>
<key>Comment</key>
@@ -8560,7 +9277,74 @@
<key>Value</key>
<real>1.0</real>
</map>
- <key>SafeMode</key>
+ <key>MeshTriangleBudget</key>
+ <map>
+ <key>Comment</key>
+ <string>Target visible triangle budget to use when estimating streaming cost.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <real>250000</real>
+ </map>
+ <key>MeshMetaDataDiscount</key>
+ <map>
+ <key>Comment</key>
+ <string>Number of bytes to deduct for metadata when determining streaming cost.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <real>384</real>
+ </map>
+ <key>MeshMinimumByteSize</key>
+ <map>
+ <key>Comment</key>
+ <string>Minimum number of bytes per LoD block when determining streaming cost.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <real>16</real>
+ </map>
+ <key>MeshBytesPerTriangle</key>
+ <map>
+ <key>Comment</key>
+ <string>Approximation of bytes per triangle to use for determining mesh streaming cost.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <real>16</real>
+ </map>
+
+ <key>MeshMaxConcurrentRequests</key>
+ <map>
+ <key>Comment</key>
+ <string>Number of threads to use for loading meshes.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>32</integer>
+ </map>
+ <key>RunMultipleThreads</key>
+ <map>
+ <key>Comment</key>
+ <string>If TRUE keep background threads active during render</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>SafeMode</key>
<map>
<key>Comment</key>
<string>Reset preferences, run in safe mode.</string>
@@ -8626,6 +9410,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>ScriptsCanShowUI</key>
+ <map>
+ <key>Comment</key>
+ <string>Allow LSL calls (such as LLMapDestination) to spawn viewer UI</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
<key>SecondLifeEnterprise</key>
<map>
<key>Comment</key>
@@ -8816,7 +9611,7 @@
<key>ShowBuildButton</key>
<map>
<key>Comment</key>
- <string>Shows/Hides Build button in the bottom tray.</string>
+ <string>Shows/hides build button in the bottom tray.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -8827,7 +9622,7 @@
<key>ShowCameraButton</key>
<map>
<key>Comment</key>
- <string>Show/Hide View button in the bottom tray.</string>
+ <string>Show/hide view button in the bottom tray.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -8835,18 +9630,29 @@
<key>Value</key>
<integer>1</integer>
</map>
- <key>ShowConsoleWindow</key>
- <map>
- <key>Comment</key>
- <string>Show log in separate OS window</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
- <key>NavBarShowCoordinates</key>
+ <key>ShowConsoleWindow</key>
+ <map>
+ <key>Comment</key>
+ <string>Show log in separate OS window</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>EnableVisualLeakDetector</key>
+ <map>
+ <key>Comment</key>
+ <string>EnableVisualLeakDetector</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>NavBarShowCoordinates</key>
<map>
<key>Comment</key>
<string>Show coordinates in navigation bar</string>
@@ -8915,7 +9721,7 @@
<key>ShowGestureButton</key>
<map>
<key>Comment</key>
- <string>Shows/Hides Gesture button in the bottom tray.</string>
+ <string>Shows/hides gesture button in the bottom tray.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -8948,7 +9754,7 @@
<key>ShowMiniMapButton</key>
<map>
<key>Comment</key>
- <string>Shows/Hides Mini-Map button in the bottom tray.</string>
+ <string>Shows/hides mini-map button in the bottom tray.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -8959,7 +9765,7 @@
<key>ShowMoveButton</key>
<map>
<key>Comment</key>
- <string>Shows/Hides Move button in the bottom tray.</string>
+ <string>Shows/hides move button in the bottom tray.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -8992,18 +9798,18 @@
<key>ShowSearchButton</key>
<map>
<key>Comment</key>
- <string>Shows/Hides Search button in the bottom tray.</string>
+ <string>Shows/hides search button in the bottom tray.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <integer>0</integer>
+ <integer>1</integer>
</map>
<key>ShowSnapshotButton</key>
<map>
<key>Comment</key>
- <string>Shows/Hides Snapshot button button in the bottom tray.</string>
+ <string>Shows/hides snapshot button button in the bottom tray.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -9025,7 +9831,7 @@
<key>ShowNavbarFavoritesPanel</key>
<map>
<key>Comment</key>
- <string>Show/Hide Navigation Bar Favorites Panel</string>
+ <string>Show/hide navigation bar favorites panel</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -9036,7 +9842,7 @@
<key>ShowNavbarNavigationPanel</key>
<map>
<key>Comment</key>
- <string>Show/Hide Navigation Bar Navigation Panel</string>
+ <string>Show/hide navigation bar navigation panel</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -9047,7 +9853,7 @@
<key>ShowWorldMapButton</key>
<map>
<key>Comment</key>
- <string>Shows/Hides Map button in the bottom tray.</string>
+ <string>Shows/hides map button in the bottom tray.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -9058,7 +9864,7 @@
<key>ShowMiniLocationPanel</key>
<map>
<key>Comment</key>
- <string>Show/Hide Mini-Location Panel</string>
+ <string>Show/hide mini-location panel</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -9066,21 +9872,21 @@
<key>Value</key>
<integer>0</integer>
</map>
- <key>SidebarCameraMovement</key>
+ <key>GroupListShowIcons</key>
<map>
<key>Comment</key>
- <string>Reflects world rect changing while changing sidebar visibility.</string>
+ <string>Show/hide group icons in the group list</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <integer>0</integer>
+ <integer>1</integer>
</map>
- <key>GroupListShowIcons</key>
+ <key>FriendsListShowIcons</key>
<map>
<key>Comment</key>
- <string>Show/hide group icons in the group list</string>
+ <string>Show/hide online and all friends icons in the friend list</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -9088,10 +9894,10 @@
<key>Value</key>
<integer>1</integer>
</map>
- <key>FriendsListShowIcons</key>
+ <key>FriendsListShowPermissions</key>
<map>
<key>Comment</key>
- <string>Show/hide online and all friends icons in the friend list</string>
+ <string>Show/hide permission icons in the friend list</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -9099,10 +9905,10 @@
<key>Value</key>
<integer>1</integer>
</map>
- <key>FriendsListShowPermissions</key>
+ <key>NearbyListShowMap</key>
<map>
<key>Comment</key>
- <string>Show/hide permission icons in the friend list</string>
+ <string>Show/hide map above nearby people list</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -9490,7 +10296,7 @@
<key>ShowNetStats</key>
<map>
<key>Comment</key>
- <string>Show the Search Bar in the Status Overlay</string>
+ <string>Show the Status Indicators for the Viewer and Network Usage in the Status Overlay</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -9597,17 +10403,6 @@
<key>Value</key>
<real>0.300000011921</real>
</map>
- <key>SkyEditPresets</key>
- <map>
- <key>Comment</key>
- <string>Whether to be able to edit the sky defaults or not</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
<key>SkyNightColorShift</key>
<map>
<key>Comment</key>
@@ -9649,17 +10444,6 @@
<real>0.1</real>
</array>
</map>
- <key>SkyUseClassicClouds</key>
- <map>
- <key>Comment</key>
- <string>Whether to use the old Second Life particle clouds or not</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
<key>SnapEnabled</key>
<map>
<key>Comment</key>
@@ -9704,28 +10488,6 @@
<key>Value</key>
<integer>0</integer>
</map>
- <key>SnapshotLocalLastResolution</key>
- <map>
- <key>Comment</key>
- <string>Take next local snapshot at this resolution</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>S32</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
- <key>SnapshotPostcardLastResolution</key>
- <map>
- <key>Comment</key>
- <string>Take next postcard snapshot at this resolution</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>S32</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
<key>SnapshotQuality</key>
<map>
<key>Comment</key>
@@ -9759,17 +10521,6 @@
<key>Value</key>
<string>http://photos.apps.staging.avatarsunited.com/viewer_config</string>
</map>
- <key>SnapshotTextureLastResolution</key>
- <map>
- <key>Comment</key>
- <string>Take next texture snapshot at this resolution</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>S32</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
<key>SpeedTest</key>
<map>
<key>Comment</key>
@@ -9825,6 +10576,17 @@
<key>Value</key>
<string>pilot.txt</string>
</map>
+ <key>StatsPilotXMLFile</key>
+ <map>
+ <key>Comment</key>
+ <string>Filename for stats logging extended autopilot path</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>pilot.xml</string>
+ </map>
<key>StatsQuitAfterRuns</key>
<map>
<key>Comment</key>
@@ -9990,6 +10752,17 @@
<key>Value</key>
<real>500.0</real>
</map>
+ <key>UpdaterMaximumBandwidth</key>
+ <map>
+ <key>Comment</key>
+ <string>Maximum allowable downstream bandwidth for updater service (kilo bits per second)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>500.0</real>
+ </map>
<key>ToolTipDelay</key>
<map>
<key>Comment</key>
@@ -10001,7 +10774,17 @@
<key>Value</key>
<real>0.699999988079</real>
</map>
- <key>ToolTipFadeTime</key>
+ <key>ToolTipFastDelay</key>
+ <map>
+ <key>Comment</key>
+ <string>Seconds before displaying tooltip when mouse stops over UI element (when a tooltip is already visible)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.1</real>
+ </map> <key>ToolTipFadeTime</key>
<map>
<key>Comment</key>
<string>Seconds over which tooltip fades away</string>
@@ -10089,6 +10872,39 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>TranslationService</key>
+ <map>
+ <key>Comment</key>
+ <string>Translation API to use. (google|bing)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>bing</string>
+ </map>
+ <key>GoogleTranslateAPIKey</key>
+ <map>
+ <key>Comment</key>
+ <string>Google Translate API key</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string></string>
+ </map>
+ <key>BingTranslateAPIKey</key>
+ <map>
+ <key>Comment</key>
+ <string>Bing AppID to use with the Microsoft Translator API</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string></string>
+ </map>
<key>TutorialURL</key>
<map>
<key>Comment</key>
@@ -10252,7 +11068,7 @@
<key>Type</key>
<string>S32</string>
<key>Value</key>
- <real>-2</real>
+ <real>-1</real>
</map>
<key>UIExtraTriangleWidth</key>
<map>
@@ -10263,7 +11079,7 @@
<key>Type</key>
<string>S32</string>
<key>Value</key>
- <real>2</real>
+ <real>4</real>
</map>
<key>UIFloaterCloseBoxSize</key>
<map>
@@ -10639,17 +11455,6 @@
<key>Value</key>
<real>3</real>
</map>
- <key>UIResizeBarOverlap</key>
- <map>
- <key>Comment</key>
- <string>Size of UI resize bar overlap</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>S32</string>
- <key>Value</key>
- <real>1</real>
- </map>
<key>UIScaleFactor</key>
<map>
<key>Comment</key>
@@ -11090,16 +11895,16 @@
<key>Value</key>
<integer>15</integer>
</map>
- <key>UpdaterServiceActive</key>
+ <key>UpdaterServiceSetting</key>
<map>
<key>Comment</key>
- <string>Enable or disable the updater service.</string>
+ <string>Configure updater service.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
- <string>Boolean</string>
+ <string>U32</string>
<key>Value</key>
- <integer>1</integer>
+ <integer>3</integer>
</map>
<key>UpdaterServiceCheckPeriod</key>
<map>
@@ -11121,7 +11926,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://update.secondlife.com</string>
+ <string>https://update.secondlife.com</string>
</map>
<key>UpdaterServicePath</key>
<map>
@@ -11255,6 +12060,61 @@
<key>Value</key>
<integer>1</integer>
</map>
+ <key>UseEnvironmentFromRegion</key>
+ <map>
+ <key>Comment</key>
+ <string>Choose whether to use the region's environment settings, or override them with the local settings.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>UseDayCycle</key>
+ <map>
+ <key>Comment</key>
+ <string>Whether to use use a day cycle or a fixed sky.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>WaterPresetName</key>
+ <map>
+ <key>Comment</key>
+ <string>Water preset to use. May be superseded by region settings.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>Default</string>
+ </map>
+ <key>SkyPresetName</key>
+ <map>
+ <key>Comment</key>
+ <string>Sky preset to use. May be superseded by region settings or by a day cycle (see DayCycleName).</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>Default</string>
+ </map>
+ <key>DayCycleName</key>
+ <map>
+ <key>Comment</key>
+ <string>Day cycle to use. May be superseded by region settings.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>Default</string>
+ </map>
<key>UseExternalBrowser</key>
<map>
<key>Comment</key>
@@ -11264,7 +12124,7 @@
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <integer>1</integer>
+ <boolean>1</boolean>
</map>
<key>UseFreezeFrame</key>
<map>
@@ -11297,7 +12157,7 @@
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <integer>1</integer>
+ <integer>0</integer>
</map>
<key>SpeakerParticipantDefaultOrder</key>
<map>
@@ -11385,8 +12245,6 @@
<key>Type</key>
<string>LLSD</string>
<key>Value</key>
- <map>
- </map>
</map>
<key>VFSOldSize</key>
<map>
@@ -11410,50 +12268,6 @@
<key>Value</key>
<integer>1</integer>
</map>
- <key>VectorizeEnable</key>
- <map>
- <key>Comment</key>
- <string>Enable general vector operations and data alignment.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
- <key>VectorizePerfTest</key>
- <map>
- <key>Comment</key>
- <string>Test SSE/vectorization performance and choose fastest version.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
- <key>VectorizeProcessor</key>
- <map>
- <key>Comment</key>
- <string>0=Compiler Default, 1=SSE, 2=SSE2, autodetected</string>
- <key>Persist</key>
- <integer>0</integer>
- <key>Type</key>
- <string>U32</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
- <key>VectorizeSkin</key>
- <map>
- <key>Comment</key>
- <string>Enable vector operations for avatar skinning.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
<key>VelocityInterpolate</key>
<map>
<key>Comment</key>
@@ -11474,7 +12288,7 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <integer>3.0</integer>
+ <integer>3</integer>
</map>
<key>InterpolationPhaseOut</key>
<map>
@@ -11485,7 +12299,7 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <integer>1.0</integer>
+ <integer>1</integer>
</map>
<key>VerboseLogs</key>
<map>
@@ -11542,17 +12356,6 @@
<key>Value</key>
<string></string>
</map>
- <key>VivoxDebugSIPURIHostName</key>
- <map>
- <key>Comment</key>
- <string>Hostname portion of vivox SIP URIs (empty string for the default).</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>String</string>
- <key>Value</key>
- <string></string>
- </map>
<key>VivoxDebugVoiceAccountServerURI</key>
<map>
<key>Comment</key>
@@ -11597,6 +12400,28 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>VoiceCallsRejectGroup</key>
+ <map>
+ <key>Comment</key>
+ <string>Silently reject all incoming group voice calls.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>VoiceDisableMic</key>
+ <map>
+ <key>Comment</key>
+ <string>Completely disable the ability to open the mic.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>VoiceEffectExpiryWarningTime</key>
<map>
<key>Comment</key>
@@ -11820,23 +12645,12 @@
<key>WatchdogEnabled</key>
<map>
<key>Comment</key>
- <string>Controls whether the thread watchdog timer is activated.</string>
+ <string>Controls whether the thread watchdog timer is activated. Value is boolean. Set to -1 to defer to built-in default.</string>
<key>Persist</key>
<integer>0</integer>
<key>Type</key>
<string>S32</string>
<key>Value</key>
- <integer>-1</integer>
- </map>
- <key>WaterEditPresets</key>
- <map>
- <key>Comment</key>
- <string>Whether to be able to edit the water defaults or not</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
<integer>0</integer>
</map>
<key>WaterGLFogDensityScale</key>
@@ -11905,6 +12719,28 @@
<key>Value</key>
<integer>1</integer>
</map>
+ <key>FullScreen</key>
+ <map>
+ <key>Comment</key>
+ <string>run a fullscreen session</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>MinWindowHeight</key>
+ <map>
+ <key>Comment</key>
+ <string>SL viewer minimum window height in pixels</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>WindowHeight</key>
<map>
<key>Comment</key>
@@ -11912,7 +12748,7 @@
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
- <string>S32</string>
+ <string>U32</string>
<key>Value</key>
<integer>738</integer>
</map>
@@ -11927,6 +12763,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>MinWindowWidth</key>
+ <map>
+ <key>Comment</key>
+ <string>SL viewer minimum window width in pixels</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>WindowWidth</key>
<map>
<key>Comment</key>
@@ -11934,14 +12781,14 @@
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
- <string>S32</string>
+ <string>U32</string>
<key>Value</key>
<integer>1024</integer>
</map>
<key>WindowX</key>
<map>
<key>Comment</key>
- <string>X coordinate of lower left corner of SL viewer window, relative to primary display (pixels)</string>
+ <string>X coordinate of upper left corner of SL viewer window, relative to upper left corner of primary display (pixels)</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -11952,7 +12799,7 @@
<key>WindowY</key>
<map>
<key>Comment</key>
- <string>Y coordinate of lower left corner of SL viewer window, relative to primary display (pixels)</string>
+ <string>Y coordinate of upper left corner of SL viewer window, relative to upper left corner of primary display (pixels)</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -12037,6 +12884,17 @@
<key>Value</key>
<real>0.40000000596</real>
</map>
+ <key>moapbeacon</key>
+ <map>
+ <key>Comment</key>
+ <string>Beacon / Highlight media on a prim sources</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>particlesbeacon</key>
<map>
<key>Comment</key>
@@ -12125,6 +12983,17 @@
<key>Value</key>
<integer>1</integer>
</map>
+ <key>SLURLPassToOtherInstance</key>
+ <map>
+ <key>Comment</key>
+ <string>Pass execution to prevoius viewer instances if there is a given slurl</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
<key>soundsbeacon</key>
<map>
<key>Comment</key>
@@ -12202,6 +13071,7 @@
<key>Comment</key>
<string>Maximum texture width for user uploaded textures</string>
<key>Persist</key>
+ <integer>1</integer>
<key>Type</key>
<string>S32</string>
<key>Value</key>
@@ -12241,6 +13111,7 @@
<key>Value</key>
<array>
<string>snapshot</string>
+ <string>postcard</string>
<string>mini_map</string>
</array>
</map>
@@ -12308,7 +13179,7 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <real>600.0</real>
+ <real>1200.0</real>
</map>
<key>SidePanelHintTimeout</key>
<map>
@@ -12332,5 +13203,318 @@
<key>Value</key>
<string>name</string>
</map>
+ <key>SessionSettingsFile</key>
+ <map>
+ <key>Comment</key>
+ <string>Settings that are a applied per session (not saved).</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string></string>
+ </map>
+ <key>UserSessionSettingsFile</key>
+ <map>
+ <key>Comment</key>
+ <string>User settings that are a applied per session (not saved).</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string />
+ </map>
+ <key>OpenSidePanelsInFloaters</key>
+ <map>
+ <key>Comment</key>
+ <string>If true, will always open side panel contents in a floater.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>AvatarInspectorTooltipDelay</key>
+ <map>
+ <key>Comment</key>
+ <string>Seconds before displaying avatar inspector tooltip</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.35</real>
+ </map>
+ <key>ObjectInspectorTooltipDelay</key>
+ <map>
+ <key>Comment</key>
+ <string>Seconds before displaying object inspector tooltip</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.35</real>
+ </map>
+ <key>SLURLTeleportDirectly</key>
+ <map>
+ <key>Comment</key>
+ <string>Clicking on a slurl will teleport you directly instead of opening places panel</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>EnableClassifieds</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable creation of new classified ads from web link</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>EnableGroupInfo</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable viewing and editing of group info from web link</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>EnablePlaceProfile</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable viewing of place profile from web link</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>EnablePicks</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable editing of picks from web link</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>EnableWorldMap</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable opening world map from web link</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>EnableAvatarPay</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable paying other avatars from web link</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>EnableVoiceCall</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable voice calls from web link</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>EnableAvatarShare</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable sharing from web link</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>EnableInventory</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable opening inventory from web link</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>EnableSearch</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable opening search from web link</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>EnableAppearance</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable opening appearance from web link</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>SearchFromAddressBar</key>
+ <map>
+ <key>Comment</key>
+ <string>Can enter search queries into navigation address bar</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>LogInventoryDecline</key>
+ <map>
+ <key>Comment</key>
+ <string>Log in system chat whenever an inventory offer is declined</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>UseHTTPInventory</key>
+ <map>
+ <key>Comment</key>
+ <string>Allow use of http inventory transfers instead of UDP</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>ClickToWalk</key>
+ <map>
+ <key>Comment</key>
+ <string>Click in world to walk to location</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>ShowOfferedInventory</key>
+ <map>
+ <key>Comment</key>
+ <string>Show inventory window with last inventory offer selected when receiving inventory from other users.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>GenericErrorPageURL</key>
+ <map>
+ <key>Comment</key>
+ <string>URL to set as a property on LLMediaControl to navigate to if the a page completes with a 400-499 HTTP status code</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>http://common-flash-secondlife-com.s3.amazonaws.com/viewer/v2.6/agni/404.html</string>
+ </map>
+ <key>OpenIMOnVoice</key>
+ <map>
+ <key>Comment</key>
+ <string>Open the corresponding IM window when connecting to a voice call.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>AllowBottomTrayButtonReordering</key>
+ <map>
+ <key>Comment</key>
+ <string>Allow user to move and hide bottom tray buttons</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>WebProfileFloaterRect</key>
+ <map>
+ <key>Comment</key>
+ <string>Web profile floater dimensions</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>0</integer>
+ <integer>680</integer>
+ <integer>485</integer>
+ <integer>0</integer>
+ </array>
+ </map>
+ <key>HelpFloaterOpen</key>
+ <map>
+ <key>Comment</key>
+ <string>Show Help Floater on login?</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ShowHelpOnFirstLogin</key>
+ <map>
+ <key>Comment</key>
+ <string>Show Help Floater on first login</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
</map>
</llsd>
diff --git a/indra/newview/app_settings/settings_crash_behavior.xml b/indra/newview/app_settings/settings_crash_behavior.xml
index cc7f5ac88b..97651ff4ca 100644
--- a/indra/newview/app_settings/settings_crash_behavior.xml
+++ b/indra/newview/app_settings/settings_crash_behavior.xml
@@ -9,7 +9,7 @@
<key>Type</key>
<string>S32</string>
<key>Value</key>
- <integer>0</integer>
+ <integer>1</integer>
</map>
</map>
</llsd>
diff --git a/indra/newview/app_settings/settings_files.xml b/indra/newview/app_settings/settings_files.xml
index aa5b301959..bfc09286e3 100644
--- a/indra/newview/app_settings/settings_files.xml
+++ b/indra/newview/app_settings/settings_files.xml
@@ -1,148 +1,65 @@
-<llsd>
- <map>
- <key>Locations</key>
- <map>
- <!--
- The Locations LLSD block specifies the usage pattern of
- the settings file types
- Each location is represented by a LLSD containing the following values:
- PathIndex = hard coded path indicies.
- Files = map of files to load
- Each file can have:
- Requirement = level of necessity for loading.
- 0 ( or Req. no key) = do not load
- 1 = required, fail if not found
- NameFromSetting = Use the given setting to specify the name. Not valid for
- "Default"
- -->
- <key>Comment</key>
- <string>List location from which to load files, and the rules about loading those files.</string>
- <key>Persist</key>
- <integer>0</integer>
- <key>Type</key>
- <string>LLSD</string>
- <key>Value</key>
- <map>
- <key>Default</key>
- <map>
- <key>PathIndex</key>
- <integer>2</integer>
- <key>Files</key>
- <map>
- <key>Global</key>
- <map>
- <key>Name</key>
- <string>settings.xml</string>
- <key>Requirement</key>
- <integer>1</integer>
- </map>
- <key>PerAccount</key>
- <map>
- <key>Name</key>
- <string>settings_per_account.xml</string>
- <key>Requirement</key>
- <integer>1</integer>
- </map>
- <key>CrashSettings</key>
- <map>
- <key>Name</key>
- <string>settings_crash_behavior.xml</string>
- <key>Requirement</key>
- <integer>1</integer>
- </map>
- <key>Warnings</key>
- <map>
- <key>Name</key>
- <string>ignorable_dialogs.xml</string>
- <key>Requirement</key>
- <integer>1</integer>
- </map>
- </map>
- </map>
- <key>User</key>
- <map>
- <key>PathIndex</key>
- <integer>1</integer>
- <key>Files</key>
- <map>
- <key>Global</key>
- <map>
- <key>Name</key>
- <string>settings.xml</string>
- <key>NameFromSetting</key>
- <string>ClientSettingsFile</string>
- </map>
- <key>CrashSettings</key>
- <map>
- <key>Name</key>
- <string>settings_crash_behavior.xml</string>
- </map>
- <key>Warnings</key>
- <map>
- <key>Name</key>
- <string>ignorable_dialogs.xml</string>
- <key>NameFromSetting</key>
- <string>WarningSettingsFile</string>
- </map>
- </map>
- </map>
- <key>Account</key>
- <map>
- <key>PathIndex</key>
- <integer>3</integer>
- <key>Files</key>
- <map>
- <key>PerAccount</key>
- <map>
- <key>Name</key>
- <string>settings_per_account.xml</string>
- <key>NameFromSetting</key>
- <string>PerAccountSettingsFile</string>
- </map>
- </map>
- </map>
- <key>DefaultSkin</key>
- <map>
- <key>PathIndex</key>
- <integer>17</integer>
- <key>Files</key>
- <map>
- <key>Skinning</key>
- <map>
- <key>Name</key>
- <string>colors.xml</string>
- </map>
- </map>
- </map>
- <key>CurrentSkin</key>
- <map>
- <key>PathIndex</key>
- <integer>10</integer>
- <key>Files</key>
- <map>
- <key>Skinning</key>
- <map>
- <key>Name</key>
- <string>colors.xml</string>
- </map>
- </map>
- </map>
- <key>UserSkin</key>
- <map>
- <key>PathIndex</key>
- <integer>14</integer>
- <key>Files</key>
- <map>
- <key>Skinning</key>
- <map>
- <key>Name</key>
- <string>colors.xml</string>
- <key>NameFromSetting</key>
- <string>SkinningSettingsFile</string>
- </map>
- </map>
- </map>
- </map>
- </map>
- </map>
-</llsd>
+<settings_files>
+ <group name="Default"
+ path_index="2">
+ <file name="Global"
+ file_name="settings.xml"
+ required="true"/>
+ <file name="PerAccount"
+ file_name="settings_per_account.xml"
+ required="true"/>
+ <file name="CrashSettings"
+ file_name="settings_crash_behavior.xml"
+ required="true"/>
+ <file name="Warnings"
+ file_name="ignorable_dialogs.xml"
+ required="true"/>
+ </group>
+ <group name="User"
+ path_index="1">
+ <file name="Global"
+ file_name="settings.xml"
+ file_name_setting="ClientSettingsFile"/>
+ <file name="CrashSettings"
+ file_name="settings_crash_behavior.xml"
+ file_name_setting="CrashSettingsFile"/>
+ <file name="Warnings"
+ file_name="ignorable_dialogs.xml"
+ file_name_setting="WarningSettingsFile"/>
+ </group>
+ <group name="Account"
+ path_index="3">
+ <file name="PerAccount"
+ file_name="settings_per_account.xml"
+ file_name_setting="PerAccountSettingsFile"/>
+ </group>
+ <group name="Session"
+ path_index="2">
+ <file name="Global"
+ file_name="session.xml"
+ file_name_setting="SessionSettingsFile"
+ persistent="false"/>
+ </group>
+ <group name="UserSession"
+ path_index="1">
+ <file name="Global"
+ file_name="session.xml"
+ file_name_setting="UserSessionSettingsFile"
+ persistent="false"/>
+ </group>
+ <group name="DefaultSkin"
+ path_index="17">
+ <file name="Skinning"
+ file_name="colors.xml"/>
+ </group>
+ <group name="CurrentSkin"
+ path_index="10">
+ <file name="Skinning"
+ file_name="colors.xml"/>
+ </group>
+ <group name="UserSkin"
+ path_index="14">
+ <file name="Skinning"
+ file_name="colors.xml"
+ file_name_setting="SkinningSettingsFile"/>
+ </group>
+</settings_files>
diff --git a/indra/newview/app_settings/settings_minimal.xml b/indra/newview/app_settings/settings_minimal.xml
new file mode 100644
index 0000000000..01a70f2671
--- /dev/null
+++ b/indra/newview/app_settings/settings_minimal.xml
@@ -0,0 +1 @@
+<llsd/> \ No newline at end of file
diff --git a/indra/newview/app_settings/settings_per_account.xml b/indra/newview/app_settings/settings_per_account.xml
index 705c73cbf7..143126b334 100644
--- a/indra/newview/app_settings/settings_per_account.xml
+++ b/indra/newview/app_settings/settings_per_account.xml
@@ -33,6 +33,50 @@
<key>Value</key>
<string />
</map>
+ <key>InventoryInboxHeight</key>
+ <map>
+ <key>Comment</key>
+ <string>Inventory inbox panel height in Inventory floater.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>200</integer>
+ </map>
+ <key>InventoryInboxToggleState</key>
+ <map>
+ <key>Comment</key>
+ <string>Stores the open/closed state of inventory Received Items panel.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>DisplayDestinationsOnInitialRun</key>
+ <map>
+ <key>Comment</key>
+ <string>Display the destinations guide when a user first launches Second Life.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>LastInventoryInboxActivity</key>
+ <map>
+ <key>Comment</key>
+ <string>The last time the received items inbox was poked by the user.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>LastLogoff</key>
<map>
<key>Comment</key>
@@ -44,6 +88,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>LastPostcardRecipient</key>
+ <map>
+ <key>Comment</key>
+ <string>Last recipient of postcard</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string />
+ </map>
<key>LogNearbyChat</key>
<map>
<key>Comment</key>
@@ -160,6 +215,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>ShowFavoritesOnLogin</key>
+ <map>
+ <key>Comment</key>
+ <string>Determines whether favorites of last logged in user will be saved on exit from viewer and shown on login screen</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<!-- End of back compatibility settings -->
</map>
</llsd>
diff --git a/indra/newview/app_settings/shaders/class1/avatar/avatarF.glsl b/indra/newview/app_settings/shaders/class1/avatar/avatarF.glsl
index 5de9cb0790..b631ecb7d2 100644
--- a/indra/newview/app_settings/shaders/class1/avatar/avatarF.glsl
+++ b/indra/newview/app_settings/shaders/class1/avatar/avatarF.glsl
@@ -2,8 +2,28 @@
* @file avatarF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+
+
void default_lighting();
diff --git a/indra/newview/app_settings/shaders/class1/avatar/avatarSkinV.glsl b/indra/newview/app_settings/shaders/class1/avatar/avatarSkinV.glsl
index 7e9818e54a..bc63d07d72 100644
--- a/indra/newview/app_settings/shaders/class1/avatar/avatarSkinV.glsl
+++ b/indra/newview/app_settings/shaders/class1/avatar/avatarSkinV.glsl
@@ -2,10 +2,29 @@
* @file avatarSkinV.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+
-attribute vec4 weight; //1
+ATTRIBUTE vec4 weight;
uniform vec4 matrixPalette[45];
diff --git a/indra/newview/app_settings/shaders/class1/avatar/avatarV.glsl b/indra/newview/app_settings/shaders/class1/avatar/avatarV.glsl
index 9f06301cc7..19203ab670 100644
--- a/indra/newview/app_settings/shaders/class1/avatar/avatarV.glsl
+++ b/indra/newview/app_settings/shaders/class1/avatar/avatarV.glsl
@@ -2,41 +2,68 @@
* @file avatarV.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+uniform mat4 projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+uniform vec4 color;
+
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
mat4 getSkinnedTransform();
void calcAtmospherics(vec3 inPositionEye);
void main()
{
- gl_TexCoord[0] = gl_MultiTexCoord0;
+ vary_texcoord0 = texcoord0;
vec4 pos;
vec3 norm;
+ vec4 pos_in = vec4(position.xyz, 1.0);
+
mat4 trans = getSkinnedTransform();
- pos.x = dot(trans[0], gl_Vertex);
- pos.y = dot(trans[1], gl_Vertex);
- pos.z = dot(trans[2], gl_Vertex);
+ pos.x = dot(trans[0], pos_in);
+ pos.y = dot(trans[1], pos_in);
+ pos.z = dot(trans[2], pos_in);
pos.w = 1.0;
- norm.x = dot(trans[0].xyz, gl_Normal);
- norm.y = dot(trans[1].xyz, gl_Normal);
- norm.z = dot(trans[2].xyz, gl_Normal);
+ norm.x = dot(trans[0].xyz, normal);
+ norm.y = dot(trans[1].xyz, normal);
+ norm.z = dot(trans[2].xyz, normal);
norm = normalize(norm);
- gl_Position = gl_ProjectionMatrix * pos;
-
- //gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+ gl_Position = projection_matrix * pos;
- gl_FogFragCoord = length(pos.xyz);
-
calcAtmospherics(pos.xyz);
- vec4 color = calcLighting(pos.xyz, norm, gl_Color, vec4(0,0,0,0));
- gl_FrontColor = color;
+ vec4 col = calcLighting(pos.xyz, norm, color, vec4(0,0,0,0));
+ vertex_color = col;
}
diff --git a/indra/newview/app_settings/shaders/class1/avatar/eyeballF.glsl b/indra/newview/app_settings/shaders/class1/avatar/eyeballF.glsl
index 0feb88535a..4296e551db 100644
--- a/indra/newview/app_settings/shaders/class1/avatar/eyeballF.glsl
+++ b/indra/newview/app_settings/shaders/class1/avatar/eyeballF.glsl
@@ -2,8 +2,28 @@
* @file eyeballF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+
+
void default_lighting();
diff --git a/indra/newview/app_settings/shaders/class1/avatar/eyeballV.glsl b/indra/newview/app_settings/shaders/class1/avatar/eyeballV.glsl
index 30a2f10f62..82db15c3ae 100644
--- a/indra/newview/app_settings/shaders/class1/avatar/eyeballV.glsl
+++ b/indra/newview/app_settings/shaders/class1/avatar/eyeballV.glsl
@@ -2,26 +2,58 @@
* @file eyeballV.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+uniform mat3 normal_matrix;
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_matrix;
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec4 diffuse_color;
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
vec4 calcLightingSpecular(vec3 pos, vec3 norm, vec4 color, inout vec4 specularColor, vec4 baseCol);
void calcAtmospherics(vec3 inPositionEye);
void main()
{
//transform vertex
- gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
- gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
+ vec3 pos = (modelview_matrix * vec4(position.xyz, 1.0)).xyz;
+ gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
+
- vec3 pos = (gl_ModelViewMatrix * gl_Vertex).xyz;
- vec3 norm = normalize(gl_NormalMatrix * gl_Normal);
+ vec3 norm = normalize(normal_matrix * normal);
calcAtmospherics(pos.xyz);
vec4 specular = vec4(1.0);
- vec4 color = calcLightingSpecular(pos, norm, gl_Color, specular, vec4(0.0));
- gl_FrontColor = color;
+ vec4 color = calcLightingSpecular(pos, norm, diffuse_color, specular, vec4(0.0));
+ vertex_color = color;
}
diff --git a/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl b/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl
new file mode 100644
index 0000000000..43ed41a205
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl
@@ -0,0 +1,47 @@
+/**
+ * @file objectSkinV.glsl
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+
+
+ATTRIBUTE vec4 weight4;
+
+uniform mat4 matrixPalette[32];
+
+mat4 getObjectSkinnedTransform()
+{
+ int i;
+
+ vec4 w = fract(weight4);
+ vec4 index = floor(weight4);
+
+ float scale = 1.0/(w.x+w.y+w.z+w.w);
+ w *= scale;
+
+ mat4 mat = matrixPalette[int(index.x)]*w.x;
+ mat += matrixPalette[int(index.y)]*w.y;
+ mat += matrixPalette[int(index.z)]*w.z;
+ mat += matrixPalette[int(index.w)]*w.w;
+
+ return mat;
+}
diff --git a/indra/newview/app_settings/shaders/class1/avatar/pickAvatarF.glsl b/indra/newview/app_settings/shaders/class1/avatar/pickAvatarF.glsl
index bcd710dc57..7a35905280 100644
--- a/indra/newview/app_settings/shaders/class1/avatar/pickAvatarF.glsl
+++ b/indra/newview/app_settings/shaders/class1/avatar/pickAvatarF.glsl
@@ -2,12 +2,39 @@
* @file pickAvatarF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
uniform sampler2D diffuseMap;
void main()
{
- gl_FragColor = vec4(gl_Color.rgb, texture2D(diffuseMap, gl_TexCoord[0].xy).a);
+ frag_color = vec4(vertex_color.rgb, texture2D(diffuseMap, vary_texcoord0.xy).a);
}
diff --git a/indra/newview/app_settings/shaders/class1/avatar/pickAvatarV.glsl b/indra/newview/app_settings/shaders/class1/avatar/pickAvatarV.glsl
index 299def1927..78b5328c9a 100644
--- a/indra/newview/app_settings/shaders/class1/avatar/pickAvatarV.glsl
+++ b/indra/newview/app_settings/shaders/class1/avatar/pickAvatarV.glsl
@@ -2,22 +2,49 @@
* @file pickAvatarV.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+uniform mat4 projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec4 diffuse_color;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
mat4 getSkinnedTransform();
void main()
{
vec4 pos;
-
+ vec4 pos_in = vec4(position, 1.0);
mat4 trans = getSkinnedTransform();
- pos.x = dot(trans[0], gl_Vertex);
- pos.y = dot(trans[1], gl_Vertex);
- pos.z = dot(trans[2], gl_Vertex);
+ pos.x = dot(trans[0], pos_in);
+ pos.y = dot(trans[1], pos_in);
+ pos.z = dot(trans[2], pos_in);
pos.w = 1.0;
- gl_FrontColor = gl_Color;
- gl_TexCoord[0] = gl_MultiTexCoord0;
- gl_Position = gl_ProjectionMatrix * pos;
+ vertex_color = diffuse_color;
+ vary_texcoord0 = texcoord0;
+ gl_Position = projection_matrix * pos;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl
index 171a0e76f7..dd87ddb330 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl
@@ -2,63 +2,73 @@
* @file alphaF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+
#extension GL_ARB_texture_rectangle : enable
-uniform sampler2D diffuseMap;
-uniform sampler2D noiseMap;
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
uniform sampler2DRect depthMap;
-uniform mat4 shadow_matrix[6];
-uniform vec4 shadow_clip;
+vec4 diffuseLookup(vec2 texcoord);
+
uniform vec2 screen_res;
vec3 atmosLighting(vec3 light);
vec3 scaleSoftClip(vec3 light);
-varying vec3 vary_ambient;
-varying vec3 vary_directional;
-varying vec3 vary_fragcoord;
-varying vec3 vary_position;
-varying vec3 vary_light;
+VARYING vec3 vary_ambient;
+VARYING vec3 vary_directional;
+VARYING vec3 vary_fragcoord;
+VARYING vec3 vary_position;
+VARYING vec3 vary_pointlight_col;
-uniform mat4 inv_proj;
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
-vec4 getPosition(vec2 pos_screen)
-{
- float depth = texture2DRect(depthMap, pos_screen.xy).a;
- vec2 sc = pos_screen.xy*2.0;
- sc /= screen_res;
- sc -= vec2(1.0,1.0);
- vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0);
- vec4 pos = inv_proj * ndc;
- pos /= pos.w;
- pos.w = 1.0;
- return pos;
-}
+uniform mat4 inv_proj;
void main()
{
vec2 frag = vary_fragcoord.xy/vary_fragcoord.z*0.5+0.5;
frag *= screen_res;
- vec3 samp_pos = getPosition(frag).xyz;
-
vec4 pos = vec4(vary_position, 1.0);
- vec4 col = vec4(vary_ambient + vary_directional.rgb, gl_Color.a);
- vec4 color = texture2D(diffuseMap, gl_TexCoord[0].xy) * col;
+ vec4 diff= diffuseLookup(vary_texcoord0.xy);
+
+ vec4 col = vec4(vary_ambient + vary_directional.rgb, vertex_color.a);
+ vec4 color = diff * col;
color.rgb = atmosLighting(color.rgb);
color.rgb = scaleSoftClip(color.rgb);
- //gl_FragColor = gl_Color;
- gl_FragColor = color;
- //gl_FragColor = vec4(1,0,1,1);
- //gl_FragColor = vec4(1,0,1,1)*shadow;
-
+ color.rgb += diff.rgb * vary_pointlight_col.rgb;
+
+ frag_color = color;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaNonIndexedF.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaNonIndexedF.glsl
new file mode 100644
index 0000000000..beb3290187
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/alphaNonIndexedF.glsl
@@ -0,0 +1,89 @@
+/**
+ * @file alphaF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#extension GL_ARB_texture_rectangle : enable
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
+uniform sampler2DRect depthMap;
+uniform sampler2D diffuseMap;
+
+
+uniform vec2 screen_res;
+
+vec3 atmosLighting(vec3 light);
+vec3 scaleSoftClip(vec3 light);
+
+VARYING vec3 vary_ambient;
+VARYING vec3 vary_directional;
+VARYING vec3 vary_fragcoord;
+VARYING vec3 vary_position;
+VARYING vec3 vary_pointlight_col;
+VARYING vec2 vary_texcoord0;
+VARYING vec4 vertex_color;
+
+uniform mat4 inv_proj;
+
+vec4 getPosition(vec2 pos_screen)
+{
+ float depth = texture2DRect(depthMap, pos_screen.xy).a;
+ vec2 sc = pos_screen.xy*2.0;
+ sc /= screen_res;
+ sc -= vec2(1.0,1.0);
+ vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0);
+ vec4 pos = inv_proj * ndc;
+ pos /= pos.w;
+ pos.w = 1.0;
+ return pos;
+}
+
+void main()
+{
+ vec2 frag = vary_fragcoord.xy/vary_fragcoord.z*0.5+0.5;
+ frag *= screen_res;
+
+ vec4 pos = vec4(vary_position, 1.0);
+
+ vec4 diff= texture2D(diffuseMap,vary_texcoord0.xy);
+
+ vec4 col = vec4(vary_ambient + vary_directional.rgb, vertex_color.a);
+ vec4 color = diff * col;
+
+ color.rgb = atmosLighting(color.rgb);
+
+ color.rgb = scaleSoftClip(color.rgb);
+
+ color.rgb += diff.rgb * vary_pointlight_col.rgb;
+
+ frag_color = color;
+ //frag_color = vec4(1,0,1,1);
+ //frag_color = vec4(1,0,1,1)*shadow;
+
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaNonIndexedNoColorF.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaNonIndexedNoColorF.glsl
new file mode 100644
index 0000000000..cb87b754b4
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/alphaNonIndexedNoColorF.glsl
@@ -0,0 +1,84 @@
+/**
+ * @file alphaNonIndexedNoColorF.glsl
+ *
+ * $LicenseInfo:firstyear=2005&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2005, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#extension GL_ARB_texture_rectangle : enable
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
+uniform sampler2DRect depthMap;
+uniform sampler2D diffuseMap;
+
+uniform vec2 screen_res;
+
+vec3 atmosLighting(vec3 light);
+vec3 scaleSoftClip(vec3 light);
+
+VARYING vec3 vary_ambient;
+VARYING vec3 vary_directional;
+VARYING vec3 vary_fragcoord;
+VARYING vec3 vary_position;
+VARYING vec3 vary_pointlight_col;
+VARYING vec2 vary_texcoord0;
+
+uniform mat4 inv_proj;
+
+vec4 getPosition(vec2 pos_screen)
+{
+ float depth = texture2DRect(depthMap, pos_screen.xy).a;
+ vec2 sc = pos_screen.xy*2.0;
+ sc /= screen_res;
+ sc -= vec2(1.0,1.0);
+ vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0);
+ vec4 pos = inv_proj * ndc;
+ pos /= pos.w;
+ pos.w = 1.0;
+ return pos;
+}
+
+void main()
+{
+ vec2 frag = vary_fragcoord.xy/vary_fragcoord.z*0.5+0.5;
+ frag *= screen_res;
+
+ vec4 pos = vec4(vary_position, 1.0);
+
+ vec4 diff= texture2D(diffuseMap,vary_texcoord0.xy);
+
+ vec4 col = vec4(vary_ambient + vary_directional.rgb, 1.0);
+ vec4 color = diff * col;
+
+ color.rgb = atmosLighting(color.rgb);
+
+ color.rgb = scaleSoftClip(color.rgb);
+
+ color.rgb += diff.rgb * vary_pointlight_col.rgb;
+
+ frag_color = color;
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaSkinnedV.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaSkinnedV.glsl
new file mode 100644
index 0000000000..5a0e8ff684
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/alphaSkinnedV.glsl
@@ -0,0 +1,144 @@
+/**
+ * @file alphaSkinnedV.glsl
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat4 projection_matrix;
+uniform mat4 modelview_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec4 diffuse_color;
+ATTRIBUTE vec2 texcoord0;
+
+mat4 getObjectSkinnedTransform();
+void calcAtmospherics(vec3 inPositionEye);
+
+float calcDirectionalLight(vec3 n, vec3 l);
+
+vec3 atmosAmbient(vec3 light);
+vec3 atmosAffectDirectionalLight(float lightIntensity);
+
+VARYING vec3 vary_position;
+VARYING vec3 vary_ambient;
+VARYING vec3 vary_directional;
+VARYING vec3 vary_fragcoord;
+VARYING vec3 vary_pointlight_col;
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+
+uniform float near_clip;
+
+uniform vec4 light_position[8];
+uniform vec3 light_direction[8];
+uniform vec3 light_attenuation[8];
+uniform vec3 light_diffuse[8];
+
+float calcDirectionalLight(vec3 n, vec3 l)
+{
+ float a = max(dot(n,l),0.0);
+ return a;
+}
+
+float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight)
+{
+ //get light vector
+ vec3 lv = lp.xyz-v;
+
+ //get distance
+ float d = dot(lv,lv);
+
+ float da = 0.0;
+
+ if (d > 0.0 && la > 0.0 && fa > 0.0)
+ {
+ //normalize light vector
+ lv = normalize(lv);
+
+ //distance attenuation
+ float dist2 = d/la;
+ da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
+
+ // spotlight coefficient.
+ float spot = max(dot(-ln, lv), is_pointlight);
+ da *= spot*spot; // GL_SPOT_EXPONENT=2
+
+ //angular attenuation
+ da *= max(dot(n, lv), 0.0);
+ }
+
+ return da;
+}
+
+void main()
+{
+ vary_texcoord0 = texcoord0;
+
+ vec4 pos;
+ vec3 norm;
+
+ mat4 trans = getObjectSkinnedTransform();
+ trans = modelview_matrix * trans;
+
+ pos = trans * vec4(position.xyz, 1.0);
+
+ norm = position.xyz + normal.xyz;
+ norm = normalize(( trans*vec4(norm, 1.0) ).xyz-pos.xyz);
+
+ vec4 frag_pos = projection_matrix * pos;
+ gl_Position = frag_pos;
+
+ vary_position = pos.xyz;
+
+ calcAtmospherics(pos.xyz);
+
+ vec4 col = vec4(0.0, 0.0, 0.0, diffuse_color.a);
+
+ // Collect normal lights
+ col.rgb += light_diffuse[2].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[2], light_direction[2], light_attenuation[2].x, light_attenuation[2].y, light_attenuation[2].z);
+ col.rgb += light_diffuse[3].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[3], light_direction[3], light_attenuation[3].x, light_attenuation[3].y, light_attenuation[3].z);
+ col.rgb += light_diffuse[4].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[4], light_direction[4], light_attenuation[4].x, light_attenuation[4].y, light_attenuation[4].z);
+ col.rgb += light_diffuse[5].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[5], light_direction[5], light_attenuation[5].x, light_attenuation[5].y, light_attenuation[5].z);
+ col.rgb += light_diffuse[6].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[6], light_direction[6], light_attenuation[6].x, light_attenuation[6].y, light_attenuation[6].z);
+ col.rgb += light_diffuse[7].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[7], light_direction[7], light_attenuation[7].x, light_attenuation[7].y, light_attenuation[7].z);
+
+ vary_pointlight_col = col.rgb*diffuse_color.rgb;
+
+ col.rgb = vec3(0,0,0);
+
+ // Add windlight lights
+ col.rgb = atmosAmbient(vec3(0.));
+
+ vary_ambient = col.rgb*diffuse_color.rgb;
+ vary_directional = diffuse_color.rgb*atmosAffectDirectionalLight(max(calcDirectionalLight(norm, light_position[0].xyz), (1.0-diffuse_color.a)*(1.0-diffuse_color.a)));
+
+ col.rgb = min(col.rgb*diffuse_color.rgb, 1.0);
+
+ vertex_color = col;
+
+
+
+ vary_fragcoord.xyz = frag_pos.xyz + vec3(0,0,near_clip);
+}
+
+
diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl
index fabbce0824..cf38a2f4f7 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl
@@ -2,73 +2,147 @@
* @file alphaV.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+uniform mat3 normal_matrix;
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_matrix;
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+void passTextureIndex();
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec4 diffuse_color;
+ATTRIBUTE vec2 texcoord0;
+
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
void calcAtmospherics(vec3 inPositionEye);
float calcDirectionalLight(vec3 n, vec3 l);
-float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float is_pointlight);
vec3 atmosAmbient(vec3 light);
vec3 atmosAffectDirectionalLight(float lightIntensity);
vec3 scaleDownLight(vec3 light);
vec3 scaleUpLight(vec3 light);
-varying vec3 vary_ambient;
-varying vec3 vary_directional;
-varying vec3 vary_fragcoord;
-varying vec3 vary_position;
-varying vec3 vary_light;
+VARYING vec3 vary_ambient;
+VARYING vec3 vary_directional;
+VARYING vec3 vary_fragcoord;
+VARYING vec3 vary_position;
+VARYING vec3 vary_pointlight_col;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
uniform float near_clip;
uniform float shadow_offset;
uniform float shadow_bias;
+uniform vec4 light_position[8];
+uniform vec3 light_direction[8];
+uniform vec3 light_attenuation[8];
+uniform vec3 light_diffuse[8];
+
+float calcDirectionalLight(vec3 n, vec3 l)
+{
+ float a = max(dot(n,l),0.0);
+ return a;
+}
+
+float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight)
+{
+ //get light vector
+ vec3 lv = lp.xyz-v;
+
+ //get distance
+ float d = dot(lv,lv);
+
+ float da = 0.0;
+
+ if (d > 0.0 && la > 0.0 && fa > 0.0)
+ {
+ //normalize light vector
+ lv = normalize(lv);
+
+ //distance attenuation
+ float dist2 = d/la;
+ da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
+
+ // spotlight coefficient.
+ float spot = max(dot(-ln, lv), is_pointlight);
+ da *= spot*spot; // GL_SPOT_EXPONENT=2
+
+ //angular attenuation
+ da *= max(dot(n, lv), 0.0);
+ }
+
+ return da;
+}
+
void main()
{
//transform vertex
- gl_Position = ftransform();
+ vec4 vert = vec4(position.xyz, 1.0);
+ passTextureIndex();
+ vec4 pos = (modelview_matrix * vert);
+ gl_Position = modelview_projection_matrix*vec4(position.xyz, 1.0);
- gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
- vec4 pos = (gl_ModelViewMatrix * gl_Vertex);
- vec3 norm = normalize(gl_NormalMatrix * gl_Normal);
+ vec3 norm = normalize(normal_matrix * normal);
- vary_position = pos.xyz + norm.xyz * (-pos.z/64.0*shadow_offset+shadow_bias);
+ float dp_directional_light = max(0.0, dot(norm, light_position[0].xyz));
+ vary_position = pos.xyz + light_position[0].xyz * (1.0-dp_directional_light)*shadow_offset;
calcAtmospherics(pos.xyz);
- //vec4 color = calcLighting(pos.xyz, norm, gl_Color, vec4(0.));
-
- vec4 col = vec4(0.0, 0.0, 0.0, gl_Color.a);
+ //vec4 color = calcLighting(pos.xyz, norm, diffuse_color, vec4(0.));
+ vec4 col = vec4(0.0, 0.0, 0.0, diffuse_color.a);
- // Collect normal lights (need to be divided by two, as we later multiply by 2)
- col.rgb += gl_LightSource[2].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[2].position, gl_LightSource[2].spotDirection.xyz, gl_LightSource[2].linearAttenuation, gl_LightSource[2].specular.a);
- col.rgb += gl_LightSource[3].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[3].position, gl_LightSource[3].spotDirection.xyz, gl_LightSource[3].linearAttenuation, gl_LightSource[3].specular.a);
- col.rgb += gl_LightSource[4].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[4].position, gl_LightSource[4].spotDirection.xyz, gl_LightSource[4].linearAttenuation, gl_LightSource[4].specular.a);
- col.rgb += gl_LightSource[5].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[5].position, gl_LightSource[5].spotDirection.xyz, gl_LightSource[5].linearAttenuation, gl_LightSource[5].specular.a);
- col.rgb += gl_LightSource[6].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[6].position, gl_LightSource[6].spotDirection.xyz, gl_LightSource[6].linearAttenuation, gl_LightSource[6].specular.a);
- col.rgb += gl_LightSource[7].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[7].position, gl_LightSource[7].spotDirection.xyz, gl_LightSource[7].linearAttenuation, gl_LightSource[7].specular.a);
- col.rgb += gl_LightSource[1].diffuse.rgb*calcDirectionalLight(norm, gl_LightSource[1].position.xyz);
- col.rgb = scaleDownLight(col.rgb);
+ // Collect normal lights
+ col.rgb += light_diffuse[2].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[2], light_direction[2], light_attenuation[2].x, light_attenuation[2].y, light_attenuation[2].z);
+ col.rgb += light_diffuse[3].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[3], light_direction[3], light_attenuation[3].x, light_attenuation[3].y, light_attenuation[3].z);
+ col.rgb += light_diffuse[4].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[4], light_direction[4], light_attenuation[4].x, light_attenuation[4].y, light_attenuation[4].z);
+ col.rgb += light_diffuse[5].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[5], light_direction[5], light_attenuation[5].x, light_attenuation[5].y, light_attenuation[5].z);
+ col.rgb += light_diffuse[6].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[6], light_direction[6], light_attenuation[6].x, light_attenuation[6].y, light_attenuation[6].z);
+ col.rgb += light_diffuse[7].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[7], light_direction[7], light_attenuation[7].x, light_attenuation[7].y, light_attenuation[7].z);
+ vary_pointlight_col = col.rgb*diffuse_color.rgb;
+ col.rgb = vec3(0,0,0);
+
// Add windlight lights
- col.rgb += atmosAmbient(vec3(0.));
+ col.rgb = atmosAmbient(vec3(0.));
- vary_light = gl_LightSource[0].position.xyz;
+ vary_ambient = col.rgb*diffuse_color.rgb;
+ vary_directional.rgb = diffuse_color.rgb*atmosAffectDirectionalLight(max(calcDirectionalLight(norm, light_position[0].xyz), (1.0-diffuse_color.a)*(1.0-diffuse_color.a)));
- vary_ambient = col.rgb*gl_Color.rgb;
- vary_directional.rgb = gl_Color.rgb*atmosAffectDirectionalLight(max(calcDirectionalLight(norm, gl_LightSource[0].position.xyz), (1.0-gl_Color.a)*(1.0-gl_Color.a)));
+ col.rgb = col.rgb*diffuse_color.rgb;
- col.rgb = min(col.rgb*gl_Color.rgb, 1.0);
-
- gl_FrontColor = col;
+ vertex_color = col;
- gl_FogFragCoord = pos.z;
- pos = gl_ModelViewProjectionMatrix * gl_Vertex;
+
+ pos = modelview_projection_matrix * vert;
vary_fragcoord.xyz = pos.xyz + vec3(0,0,near_clip);
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/attachmentShadowF.glsl b/indra/newview/app_settings/shaders/class1/deferred/attachmentShadowF.glsl
new file mode 100644
index 0000000000..22c9a4d14e
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/attachmentShadowF.glsl
@@ -0,0 +1,39 @@
+/**
+ * @file avatarShadowF.glsl
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
+uniform sampler2D diffuseMap;
+
+VARYING vec2 vary_texcoord0;
+
+void main()
+{
+ frag_color = vec4(1,1,1,1);
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/deferred/attachmentShadowV.glsl b/indra/newview/app_settings/shaders/class1/deferred/attachmentShadowV.glsl
new file mode 100644
index 0000000000..81961d7746
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/attachmentShadowV.glsl
@@ -0,0 +1,45 @@
+/**
+ * @file attachmentShadowV.glsl
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat4 projection_matrix;
+uniform mat4 modelview_matrix;
+uniform mat4 texture_matrix0;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec2 texcoord0;
+
+mat4 getObjectSkinnedTransform();
+
+void main()
+{
+ //transform vertex
+ mat4 mat = getObjectSkinnedTransform();
+
+ mat = modelview_matrix * mat;
+ vec3 pos = (mat*vec4(position.xyz, 1.0)).xyz;
+
+ vec4 p = projection_matrix * vec4(pos, 1.0);
+ p.z = max(p.z, -p.w+0.01);
+ gl_Position = p;
+}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaF.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaF.glsl
deleted file mode 100644
index 82ce6d7377..0000000000
--- a/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaF.glsl
+++ /dev/null
@@ -1,68 +0,0 @@
-/**
- * @file avatarAlphaF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * $/LicenseInfo$
- */
-
-uniform sampler2D diffuseMap;
-uniform sampler2DShadow shadowMap0;
-uniform sampler2DShadow shadowMap1;
-uniform sampler2DShadow shadowMap2;
-uniform sampler2DShadow shadowMap3;
-uniform sampler2D noiseMap;
-
-uniform mat4 shadow_matrix[6];
-uniform vec4 shadow_clip;
-
-vec3 atmosLighting(vec3 light);
-vec3 scaleSoftClip(vec3 light);
-
-varying vec3 vary_ambient;
-varying vec3 vary_directional;
-varying vec4 vary_position;
-varying vec3 vary_normal;
-
-void main()
-{
- float shadow = 1.0;
- vec4 pos = vary_position;
- vec3 norm = normalize(vary_normal);
-
- vec3 nz = texture2D(noiseMap, gl_FragCoord.xy/128.0).xyz;
-
- if (pos.z > -shadow_clip.w)
- {
-
- if (pos.z < -shadow_clip.z)
- {
- vec4 lpos = shadow_matrix[3]*pos;
- shadow = shadow2DProj(shadowMap3, lpos).x;
- }
- else if (pos.z < -shadow_clip.y)
- {
- vec4 lpos = shadow_matrix[2]*pos;
- shadow = shadow2DProj(shadowMap2, lpos).x;
- }
- else if (pos.z < -shadow_clip.x)
- {
- vec4 lpos = shadow_matrix[1]*pos;
- shadow = shadow2DProj(shadowMap1, lpos).x;
- }
- else
- {
- vec4 lpos = shadow_matrix[0]*pos;
- shadow = shadow2DProj(shadowMap0, lpos).x;
- }
- }
-
-
- vec4 col = vec4(vary_ambient + vary_directional*shadow, gl_Color.a);
- vec4 color = texture2D(diffuseMap, gl_TexCoord[0].xy) * col;
-
- color.rgb = atmosLighting(color.rgb);
-
- color.rgb = scaleSoftClip(color.rgb);
-
- gl_FragColor = color;
-}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaNoColorV.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaNoColorV.glsl
new file mode 100644
index 0000000000..5f395801e5
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaNoColorV.glsl
@@ -0,0 +1,148 @@
+/**
+ * @file avatarAlphaNoColorV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat4 projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec2 texcoord0;
+
+vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
+mat4 getSkinnedTransform();
+void calcAtmospherics(vec3 inPositionEye);
+
+float calcDirectionalLight(vec3 n, vec3 l);
+float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float is_pointlight);
+
+vec3 atmosAmbient(vec3 light);
+vec3 atmosAffectDirectionalLight(float lightIntensity);
+vec3 scaleDownLight(vec3 light);
+vec3 scaleUpLight(vec3 light);
+
+VARYING vec3 vary_position;
+VARYING vec3 vary_ambient;
+VARYING vec3 vary_directional;
+VARYING vec3 vary_fragcoord;
+VARYING vec3 vary_pointlight_col;
+VARYING vec2 vary_texcoord0;
+
+
+uniform float near_clip;
+
+uniform vec4 color;
+
+uniform vec4 light_position[8];
+uniform vec3 light_direction[8];
+uniform vec3 light_attenuation[8];
+uniform vec3 light_diffuse[8];
+
+float calcDirectionalLight(vec3 n, vec3 l)
+{
+ float a = max(dot(n,l),0.0);
+ return a;
+}
+
+float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight)
+{
+ //get light vector
+ vec3 lv = lp.xyz-v;
+
+ //get distance
+ float d = dot(lv,lv);
+
+ float da = 0.0;
+
+ if (d > 0.0 && la > 0.0 && fa > 0.0)
+ {
+ //normalize light vector
+ lv = normalize(lv);
+
+ //distance attenuation
+ float dist2 = d/la;
+ da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
+
+ // spotlight coefficient.
+ float spot = max(dot(-ln, lv), is_pointlight);
+ da *= spot*spot; // GL_SPOT_EXPONENT=2
+
+ //angular attenuation
+ da *= max(dot(n, lv), 0.0);
+ }
+
+ return da;
+}
+
+void main()
+{
+ vary_texcoord0 = texcoord0;
+
+ vec4 pos;
+ vec3 norm;
+
+ mat4 trans = getSkinnedTransform();
+ vec4 pos_in = vec4(position.xyz, 1.0);
+ pos.x = dot(trans[0], pos_in);
+ pos.y = dot(trans[1], pos_in);
+ pos.z = dot(trans[2], pos_in);
+ pos.w = 1.0;
+
+ norm.x = dot(trans[0].xyz, normal);
+ norm.y = dot(trans[1].xyz, normal);
+ norm.z = dot(trans[2].xyz, normal);
+ norm = normalize(norm);
+
+ vec4 frag_pos = projection_matrix * pos;
+ gl_Position = frag_pos;
+
+ vary_position = pos.xyz;
+
+ calcAtmospherics(pos.xyz);
+
+ vec4 col = vec4(0.0, 0.0, 0.0, 1.0);
+
+ // Collect normal lights
+ col.rgb += light_diffuse[2].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[2], light_direction[2], light_attenuation[2].x, light_attenuation[2].y, light_attenuation[2].z);
+ col.rgb += light_diffuse[3].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[3], light_direction[3], light_attenuation[3].x, light_attenuation[3].y, light_attenuation[3].z);
+ col.rgb += light_diffuse[4].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[4], light_direction[4], light_attenuation[4].x, light_attenuation[4].y, light_attenuation[4].z);
+ col.rgb += light_diffuse[5].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[5], light_direction[5], light_attenuation[5].x, light_attenuation[5].y, light_attenuation[5].z);
+ col.rgb += light_diffuse[6].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[6], light_direction[6], light_attenuation[6].x, light_attenuation[6].y, light_attenuation[6].z);
+ col.rgb += light_diffuse[7].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[7], light_direction[7], light_attenuation[7].x, light_attenuation[7].y, light_attenuation[7].z);
+
+ vary_pointlight_col = col.rgb*color.rgb;
+
+ col.rgb = vec3(0,0,0);
+
+ // Add windlight lights
+ col.rgb = atmosAmbient(vec3(0.));
+
+ vary_ambient = col.rgb*color.rgb;
+ vary_directional = color.rgb*atmosAffectDirectionalLight(max(calcDirectionalLight(norm, light_position[0].xyz), 0.0));
+
+ col.rgb = col.rgb * color.rgb;
+
+ vary_fragcoord.xyz = frag_pos.xyz + vec3(0,0,near_clip);
+}
+
+
diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl
index 21ddc2fad8..d6149fcc32 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl
@@ -2,9 +2,33 @@
* @file avatarAlphaV.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+uniform mat4 projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec2 texcoord0;
+
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
mat4 getSkinnedTransform();
void calcAtmospherics(vec3 inPositionEye);
@@ -17,61 +41,113 @@ vec3 atmosAffectDirectionalLight(float lightIntensity);
vec3 scaleDownLight(vec3 light);
vec3 scaleUpLight(vec3 light);
-varying vec4 vary_position;
-varying vec3 vary_ambient;
-varying vec3 vary_directional;
-varying vec3 vary_normal;
+VARYING vec3 vary_position;
+VARYING vec3 vary_ambient;
+VARYING vec3 vary_directional;
+VARYING vec3 vary_fragcoord;
+VARYING vec3 vary_pointlight_col;
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+
+uniform float near_clip;
+
+uniform vec4 color;
+
+uniform vec4 light_position[8];
+uniform vec3 light_direction[8];
+uniform vec3 light_attenuation[8];
+uniform vec3 light_diffuse[8];
+
+float calcDirectionalLight(vec3 n, vec3 l)
+{
+ float a = max(dot(n,l),0.0);
+ return a;
+}
+
+float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight)
+{
+ //get light vector
+ vec3 lv = lp.xyz-v;
+
+ //get distance
+ float d = dot(lv,lv);
+
+ float da = 0.0;
+
+ if (d > 0.0 && la > 0.0 && fa > 0.0)
+ {
+ //normalize light vector
+ lv = normalize(lv);
+
+ //distance attenuation
+ float dist2 = d/la;
+ da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
+
+ // spotlight coefficient.
+ float spot = max(dot(-ln, lv), is_pointlight);
+ da *= spot*spot; // GL_SPOT_EXPONENT=2
+
+ //angular attenuation
+ da *= max(dot(n, lv), 0.0);
+ }
+
+ return da;
+}
void main()
{
- gl_TexCoord[0] = gl_MultiTexCoord0;
+ vary_texcoord0 = texcoord0;
vec4 pos;
vec3 norm;
mat4 trans = getSkinnedTransform();
- pos.x = dot(trans[0], gl_Vertex);
- pos.y = dot(trans[1], gl_Vertex);
- pos.z = dot(trans[2], gl_Vertex);
+ vec4 pos_in = vec4(position.xyz, 1.0);
+ pos.x = dot(trans[0], pos_in);
+ pos.y = dot(trans[1], pos_in);
+ pos.z = dot(trans[2], pos_in);
pos.w = 1.0;
- norm.x = dot(trans[0].xyz, gl_Normal);
- norm.y = dot(trans[1].xyz, gl_Normal);
- norm.z = dot(trans[2].xyz, gl_Normal);
+ norm.x = dot(trans[0].xyz, normal);
+ norm.y = dot(trans[1].xyz, normal);
+ norm.z = dot(trans[2].xyz, normal);
norm = normalize(norm);
- gl_Position = gl_ProjectionMatrix * pos;
- vary_position = pos;
- vary_normal = norm;
+ vec4 frag_pos = projection_matrix * pos;
+ gl_Position = frag_pos;
+
+ vary_position = pos.xyz;
calcAtmospherics(pos.xyz);
- //vec4 color = calcLighting(pos.xyz, norm, gl_Color, vec4(0.));
+ vec4 col = vec4(0.0, 0.0, 0.0, 1.0);
- vec4 col = vec4(0.0, 0.0, 0.0, gl_Color.a);
-
- // Collect normal lights (need to be divided by two, as we later multiply by 2)
- col.rgb += gl_LightSource[2].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[2].position, gl_LightSource[2].spotDirection.xyz, gl_LightSource[2].linearAttenuation, gl_LightSource[2].specular.a);
- col.rgb += gl_LightSource[3].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[3].position, gl_LightSource[3].spotDirection.xyz, gl_LightSource[3].linearAttenuation, gl_LightSource[3].specular.a);
- col.rgb += gl_LightSource[4].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[4].position, gl_LightSource[4].spotDirection.xyz, gl_LightSource[4].linearAttenuation, gl_LightSource[4].specular.a);
- col.rgb += gl_LightSource[5].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[5].position, gl_LightSource[5].spotDirection.xyz, gl_LightSource[5].linearAttenuation, gl_LightSource[5].specular.a);
- col.rgb += gl_LightSource[6].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[6].position, gl_LightSource[6].spotDirection.xyz, gl_LightSource[6].linearAttenuation, gl_LightSource[6].specular.a);
- col.rgb += gl_LightSource[7].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[7].position, gl_LightSource[7].spotDirection.xyz, gl_LightSource[7].linearAttenuation, gl_LightSource[7].specular.a);
- col.rgb += gl_LightSource[1].diffuse.rgb*calcDirectionalLight(norm, gl_LightSource[1].position.xyz);
- col.rgb = scaleDownLight(col.rgb);
+ // Collect normal lights
+ col.rgb += light_diffuse[2].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[2], light_direction[2], light_attenuation[2].x, light_attenuation[2].y, light_attenuation[2].z);
+ col.rgb += light_diffuse[3].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[3], light_direction[3], light_attenuation[3].x, light_attenuation[3].y, light_attenuation[3].z);
+ col.rgb += light_diffuse[4].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[4], light_direction[4], light_attenuation[4].x, light_attenuation[4].y, light_attenuation[4].z);
+ col.rgb += light_diffuse[5].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[5], light_direction[5], light_attenuation[5].x, light_attenuation[5].y, light_attenuation[5].z);
+ col.rgb += light_diffuse[6].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[6], light_direction[6], light_attenuation[6].x, light_attenuation[6].y, light_attenuation[6].z);
+ col.rgb += light_diffuse[7].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[7], light_direction[7], light_attenuation[7].x, light_attenuation[7].y, light_attenuation[7].z);
+ vary_pointlight_col = col.rgb*color.rgb;
+
+ col.rgb = vec3(0,0,0);
+
// Add windlight lights
- col.rgb += atmosAmbient(vec3(0.));
+ col.rgb = atmosAmbient(vec3(0.));
- vary_ambient = col.rgb*gl_Color.rgb;
- vary_directional = gl_Color.rgb*atmosAffectDirectionalLight(max(calcDirectionalLight(norm, gl_LightSource[0].position.xyz), (1.0-gl_Color.a)*(1.0-gl_Color.a)));
+ vary_ambient = col.rgb*color.rgb;
+ vary_directional = color.rgb*atmosAffectDirectionalLight(max(calcDirectionalLight(norm, light_position[0].xyz), 0.0));
- col.rgb = min(col.rgb*gl_Color.rgb, 1.0);
+ col.rgb = col.rgb * color.rgb;
- gl_FrontColor = col;
-
- gl_FogFragCoord = pos.z;
+ vertex_color = col;
+
+
+ vary_fragcoord.xyz = frag_pos.xyz + vec3(0,0,near_clip);
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarEyesV.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarEyesV.glsl
new file mode 100644
index 0000000000..01ffb862f7
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/avatarEyesV.glsl
@@ -0,0 +1,48 @@
+/**
+ * @file avatarEyesV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat3 normal_matrix;
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec4 diffuse_color;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec3 vary_normal;
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+void main()
+{
+ //transform vertex
+ gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
+
+ vary_normal = normalize(normal_matrix * normal);
+
+ vertex_color = diffuse_color;
+}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarF.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarF.glsl
index e376892e0a..46d2aa4877 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/avatarF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/avatarF.glsl
@@ -2,25 +2,50 @@
* @file avatarF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_data[3];
+#else
+#define frag_data gl_FragData
+#endif
+
uniform sampler2D diffuseMap;
-varying vec3 vary_normal;
+VARYING vec3 vary_normal;
+VARYING vec2 vary_texcoord0;
void main()
{
- vec4 diff = gl_Color*texture2D(diffuseMap, gl_TexCoord[0].xy);
+ vec4 diff = texture2D(diffuseMap, vary_texcoord0.xy);
if (diff.a < 0.2)
{
discard;
}
- gl_FragData[0] = vec4(diff.rgb, 0.0);
- gl_FragData[1] = vec4(0,0,0,0);
+ frag_data[0] = vec4(diff.rgb, 0.0);
+ frag_data[1] = vec4(0,0,0,0);
vec3 nvn = normalize(vary_normal);
- gl_FragData[2] = vec4(nvn.xy * 0.5 + 0.5, nvn.z, 0.0);
+ frag_data[2] = vec4(nvn.xy * 0.5 + 0.5, nvn.z, 0.0);
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarShadowF.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarShadowF.glsl
index d88e3ecfd8..3686f2f647 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/avatarShadowF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/avatarShadowF.glsl
@@ -2,15 +2,41 @@
* @file avatarShadowF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
uniform sampler2D diffuseMap;
+VARYING vec4 post_pos;
void main()
{
- //gl_FragColor = vec4(1,1,1,gl_Color.a * texture2D(diffuseMap, gl_TexCoord[0].xy).a);
- gl_FragColor = vec4(1,1,1,1);
+ frag_color = vec4(1,1,1,1);
+
+ gl_FragDepth = max(post_pos.z/post_pos.w*0.5+0.5, 0.0);
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarShadowV.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarShadowV.glsl
index 2af8c8f5f7..23feb09d72 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/avatarShadowV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/avatarShadowV.glsl
@@ -2,36 +2,58 @@
* @file avatarShadowV.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+
+uniform mat4 projection_matrix;
mat4 getSkinnedTransform();
-attribute vec4 weight;
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec4 post_pos;
void main()
{
- gl_TexCoord[0] = gl_MultiTexCoord0;
-
vec4 pos;
vec3 norm;
+ vec4 pos_in = vec4(position.xyz, 1.0);
mat4 trans = getSkinnedTransform();
- pos.x = dot(trans[0], gl_Vertex);
- pos.y = dot(trans[1], gl_Vertex);
- pos.z = dot(trans[2], gl_Vertex);
+ pos.x = dot(trans[0], pos_in);
+ pos.y = dot(trans[1], pos_in);
+ pos.z = dot(trans[2], pos_in);
pos.w = 1.0;
- norm.x = dot(trans[0].xyz, gl_Normal);
- norm.y = dot(trans[1].xyz, gl_Normal);
- norm.z = dot(trans[2].xyz, gl_Normal);
+ norm.x = dot(trans[0].xyz, normal);
+ norm.y = dot(trans[1].xyz, normal);
+ norm.z = dot(trans[2].xyz, normal);
norm = normalize(norm);
- pos = gl_ProjectionMatrix * pos;
- pos.z = max(pos.z, -pos.w+0.01);
- gl_Position = pos;
-
- gl_FrontColor = gl_Color;
+ pos = projection_matrix * pos;
+ post_pos = pos;
+
+ gl_Position = vec4(pos.x, pos.y, pos.w*0.5, pos.w);
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarV.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarV.glsl
index 988226fb7c..1bd8fee7c9 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/avatarV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/avatarV.glsl
@@ -2,39 +2,62 @@
* @file avatarV.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+
+uniform mat4 projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec2 texcoord0;
mat4 getSkinnedTransform();
-attribute vec4 weight;
+ATTRIBUTE vec4 weight;
-varying vec3 vary_normal;
+VARYING vec3 vary_normal;
+VARYING vec2 vary_texcoord0;
void main()
{
- gl_TexCoord[0] = gl_MultiTexCoord0;
+ vary_texcoord0 = texcoord0;
vec4 pos;
vec3 norm;
+ vec4 pos_in = vec4(position.xyz, 1.0);
mat4 trans = getSkinnedTransform();
- pos.x = dot(trans[0], gl_Vertex);
- pos.y = dot(trans[1], gl_Vertex);
- pos.z = dot(trans[2], gl_Vertex);
+ pos.x = dot(trans[0], pos_in);
+ pos.y = dot(trans[1], pos_in);
+ pos.z = dot(trans[2], pos_in);
pos.w = 1.0;
- norm.x = dot(trans[0].xyz, gl_Normal);
- norm.y = dot(trans[1].xyz, gl_Normal);
- norm.z = dot(trans[2].xyz, gl_Normal);
+ norm.x = dot(trans[0].xyz, normal);
+ norm.y = dot(trans[1].xyz, normal);
+ norm.z = dot(trans[2].xyz, normal);
norm = normalize(norm);
vary_normal = norm;
- gl_Position = gl_ProjectionMatrix * pos;
- //gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
-
- gl_FrontColor = gl_Color;
+ gl_Position = projection_matrix * pos;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl
index 258a9b7c40..f400eb7a5b 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl
@@ -2,11 +2,35 @@
* @file blurLightF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#extension GL_ARB_texture_rectangle : enable
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
uniform sampler2DRect depthMap;
uniform sampler2DRect normalMap;
uniform sampler2DRect lightMap;
@@ -17,14 +41,19 @@ uniform vec2 delta;
uniform vec3 kern[4];
uniform float kern_scale;
-varying vec2 vary_fragcoord;
+VARYING vec2 vary_fragcoord;
uniform mat4 inv_proj;
uniform vec2 screen_res;
+vec3 getKern(int i)
+{
+ return kern[i];
+}
+
vec4 getPosition(vec2 pos_screen)
{
- float depth = texture2DRect(depthMap, pos_screen.xy).a;
+ float depth = texture2DRect(depthMap, pos_screen.xy).r;
vec2 sc = pos_screen.xy*2.0;
sc /= screen_res;
sc -= vec2(1.0,1.0);
@@ -37,45 +66,53 @@ vec4 getPosition(vec2 pos_screen)
void main()
{
- vec3 norm = texture2DRect(normalMap, vary_fragcoord.xy).xyz;
+ vec2 tc = vary_fragcoord.xy;
+ vec3 norm = texture2DRect(normalMap, tc).xyz;
norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm
- vec3 pos = getPosition(vary_fragcoord.xy).xyz;
- vec4 ccol = texture2DRect(lightMap, vary_fragcoord.xy).rgba;
+ vec3 pos = getPosition(tc).xyz;
+ vec4 ccol = texture2DRect(lightMap, tc).rgba;
vec2 dlt = kern_scale * delta / (1.0+norm.xy*norm.xy);
-
dlt /= max(-pos.z*dist_factor, 1.0);
- vec2 defined_weight = kern[0].xy; // special case the first (centre) sample's weight in the blur; we have to sample it anyway so we get it for 'free'
+ vec2 defined_weight = getKern(0).xy; // special case the first (centre) sample's weight in the blur; we have to sample it anyway so we get it for 'free'
vec4 col = defined_weight.xyxx * ccol;
-
+
+ // relax tolerance according to distance to avoid speckling artifacts, as angles and distances are a lot more abrupt within a small screen area at larger distances
+ float pointplanedist_tolerance_pow2 = pos.z*pos.z*0.00005;
+
+ // perturb sampling origin slightly in screen-space to hide edge-ghosting artifacts where smoothing radius is quite large
+ float tc_mod = 0.5*(tc.x + tc.y); // mod(tc.x+tc.y,2)
+ tc_mod -= floor(tc_mod);
+ tc_mod *= 2.0;
+ tc += ( (tc_mod - 0.5) * getKern(1).z * dlt * 0.5 );
+
for (int i = 1; i < 4; i++)
{
- vec2 tc = vary_fragcoord.xy + kern[i].z*dlt;
- vec3 samppos = getPosition(tc).xyz;
+ vec2 samptc = tc + getKern(i).z*dlt;
+ vec3 samppos = getPosition(samptc).xyz;
float d = dot(norm.xyz, samppos.xyz-pos.xyz);// dist from plane
- if (d*d <= 0.003)
+ if (d*d <= pointplanedist_tolerance_pow2)
{
- col += texture2DRect(lightMap, tc)*kern[i].xyxx;
- defined_weight += kern[i].xy;
+ col += texture2DRect(lightMap, samptc)*getKern(i).xyxx;
+ defined_weight += getKern(i).xy;
}
}
for (int i = 1; i < 4; i++)
{
- vec2 tc = vary_fragcoord.xy - kern[i].z*dlt;
- vec3 samppos = getPosition(tc).xyz;
+ vec2 samptc = tc - getKern(i).z*dlt;
+ vec3 samppos = getPosition(samptc).xyz;
float d = dot(norm.xyz, samppos.xyz-pos.xyz);// dist from plane
- if (d*d <= 0.003)
+ if (d*d <= pointplanedist_tolerance_pow2)
{
- col += texture2DRect(lightMap, tc)*kern[i].xyxx;
- defined_weight += kern[i].xy;
+ col += texture2DRect(lightMap, samptc)*getKern(i).xyxx;
+ defined_weight += getKern(i).xy;
}
}
-
-
col /= defined_weight.xyxx;
+ col.y *= col.y;
- gl_FragColor = col;
+ frag_color = col;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/blurLightV.glsl b/indra/newview/app_settings/shaders/class1/deferred/blurLightV.glsl
index b1b3f55f00..212f7e56ad 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/blurLightV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/blurLightV.glsl
@@ -2,16 +2,38 @@
* @file blurLightF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-varying vec2 vary_fragcoord;
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+
+VARYING vec2 vary_fragcoord;
uniform vec2 screen_res;
void main()
{
//transform vertex
- gl_Position = ftransform();
- vec4 pos = gl_ModelViewProjectionMatrix * gl_Vertex;
+ vec4 pos = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ gl_Position = pos;
vary_fragcoord = (pos.xy*0.5+0.5)*screen_res;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/bumpF.glsl b/indra/newview/app_settings/shaders/class1/deferred/bumpF.glsl
index 35f334d58e..680eadb852 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/bumpF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/bumpF.glsl
@@ -2,28 +2,55 @@
* @file bumpF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_data[3];
+#else
+#define frag_data gl_FragData
+#endif
uniform sampler2D diffuseMap;
uniform sampler2D bumpMap;
-varying vec3 vary_mat0;
-varying vec3 vary_mat1;
-varying vec3 vary_mat2;
+VARYING vec3 vary_mat0;
+VARYING vec3 vary_mat1;
+VARYING vec3 vary_mat2;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
void main()
{
- vec3 col = gl_Color.rgb * texture2D(diffuseMap, gl_TexCoord[0].xy).rgb;
- vec3 norm = texture2D(bumpMap, gl_TexCoord[0].xy).rgb * 2.0 - 1.0;
+ vec3 col = vertex_color.rgb * texture2D(diffuseMap, vary_texcoord0.xy).rgb;
+ vec3 norm = texture2D(bumpMap, vary_texcoord0.xy).rgb * 2.0 - 1.0;
vec3 tnorm = vec3(dot(norm,vary_mat0),
dot(norm,vary_mat1),
dot(norm,vary_mat2));
- gl_FragData[0] = vec4(col, 0.0);
- gl_FragData[1] = gl_Color.aaaa; // spec
- //gl_FragData[1] = vec4(vec3(gl_Color.a), gl_Color.a+(1.0-gl_Color.a)*gl_Color.a); // spec - from former class3 - maybe better, but not so well tested
+ frag_data[0] = vec4(col, 0.0);
+ frag_data[1] = vertex_color.aaaa; // spec
+ //frag_data[1] = vec4(vec3(vertex_color.a), vertex_color.a+(1.0-vertex_color.a)*vertex_color.a); // spec - from former class3 - maybe better, but not so well tested
vec3 nvn = normalize(tnorm);
- gl_FragData[2] = vec4(nvn.xy * 0.5 + 0.5, nvn.z, 0.0);
+ frag_data[2] = vec4(nvn.xy * 0.5 + 0.5, nvn.z, 0.0);
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/bumpSkinnedV.glsl b/indra/newview/app_settings/shaders/class1/deferred/bumpSkinnedV.glsl
new file mode 100644
index 0000000000..8ba75010a2
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/bumpSkinnedV.glsl
@@ -0,0 +1,64 @@
+/**
+ * @file bumpV.glsl
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat4 projection_matrix;
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec4 diffuse_color;
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec2 texcoord0;
+ATTRIBUTE vec3 binormal;
+
+VARYING vec3 vary_mat0;
+VARYING vec3 vary_mat1;
+VARYING vec3 vary_mat2;
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+mat4 getObjectSkinnedTransform();
+
+void main()
+{
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
+
+ mat4 mat = getObjectSkinnedTransform();
+
+ mat = modelview_matrix * mat;
+
+ vec3 pos = (mat*vec4(position.xyz, 1.0)).xyz;
+
+
+ vec3 n = normalize((mat * vec4(normal.xyz+position.xyz, 1.0)).xyz-pos.xyz);
+ vec3 b = normalize((mat * vec4(binormal.xyz+position.xyz, 1.0)).xyz-pos.xyz);
+ vec3 t = cross(b, n);
+
+ vary_mat0 = vec3(t.x, b.x, n.x);
+ vary_mat1 = vec3(t.y, b.y, n.y);
+ vary_mat2 = vec3(t.z, b.z, n.z);
+
+ gl_Position = projection_matrix*vec4(pos, 1.0);
+ vertex_color = diffuse_color;
+}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/bumpV.glsl b/indra/newview/app_settings/shaders/class1/deferred/bumpV.glsl
index 6c8550cb5b..c8d38bb8f7 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/bumpV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/bumpV.glsl
@@ -2,26 +2,56 @@
* @file bumpV.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-varying vec3 vary_mat0;
-varying vec3 vary_mat1;
-varying vec3 vary_mat2;
+uniform mat3 normal_matrix;
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec4 diffuse_color;
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec2 texcoord0;
+ATTRIBUTE vec3 binormal;
+
+VARYING vec3 vary_mat0;
+VARYING vec3 vary_mat1;
+VARYING vec3 vary_mat2;
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
void main()
{
//transform vertex
- gl_Position = ftransform();
- gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
+ gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
- vec3 n = normalize(gl_NormalMatrix * gl_Normal);
- vec3 b = normalize(gl_NormalMatrix * gl_MultiTexCoord2.xyz);
+ vec3 n = normalize(normal_matrix * normal);
+ vec3 b = normalize(normal_matrix * binormal);
vec3 t = cross(b, n);
vary_mat0 = vec3(t.x, b.x, n.x);
vary_mat1 = vec3(t.y, b.y, n.y);
vary_mat2 = vec3(t.z, b.z, n.z);
- gl_FrontColor = gl_Color;
+ vertex_color = diffuse_color;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/cloudsF.glsl b/indra/newview/app_settings/shaders/class1/deferred/cloudsF.glsl
new file mode 100644
index 0000000000..1d8ca04ccd
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/cloudsF.glsl
@@ -0,0 +1,107 @@
+/**
+ * @file WLCloudsF.glsl
+ *
+ * $LicenseInfo:firstyear=2005&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2005, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_data[3];
+#else
+#define frag_data gl_FragData
+#endif
+
+/////////////////////////////////////////////////////////////////////////
+// The fragment shader for the sky
+/////////////////////////////////////////////////////////////////////////
+
+VARYING vec4 vary_CloudColorSun;
+VARYING vec4 vary_CloudColorAmbient;
+VARYING float vary_CloudDensity;
+
+uniform sampler2D cloud_noise_texture;
+uniform vec4 cloud_pos_density1;
+uniform vec4 cloud_pos_density2;
+uniform vec4 gamma;
+
+VARYING vec2 vary_texcoord0;
+VARYING vec2 vary_texcoord1;
+VARYING vec2 vary_texcoord2;
+VARYING vec2 vary_texcoord3;
+
+/// Soft clips the light with a gamma correction
+vec3 scaleSoftClip(vec3 light) {
+ //soft clip effect:
+ light = 1. - clamp(light, vec3(0.), vec3(1.));
+ light = 1. - pow(light, gamma.xxx);
+
+ return light;
+}
+
+void main()
+{
+ // Set variables
+ vec2 uv1 = vary_texcoord0.xy;
+ vec2 uv2 = vary_texcoord1.xy;
+
+ vec4 cloudColorSun = vary_CloudColorSun;
+ vec4 cloudColorAmbient = vary_CloudColorAmbient;
+ float cloudDensity = vary_CloudDensity;
+ vec2 uv3 = vary_texcoord2.xy;
+ vec2 uv4 = vary_texcoord3.xy;
+
+ // Offset texture coords
+ uv1 += cloud_pos_density1.xy; //large texture, visible density
+ uv2 += cloud_pos_density1.xy; //large texture, self shadow
+ uv3 += cloud_pos_density2.xy; //small texture, visible density
+ uv4 += cloud_pos_density2.xy; //small texture, self shadow
+
+
+ // Compute alpha1, the main cloud opacity
+ float alpha1 = (texture2D(cloud_noise_texture, uv1).x - 0.5) + (texture2D(cloud_noise_texture, uv3).x - 0.5) * cloud_pos_density2.z;
+ alpha1 = min(max(alpha1 + cloudDensity, 0.) * 10. * cloud_pos_density1.z, 1.);
+
+ // And smooth
+ alpha1 = 1. - alpha1 * alpha1;
+ alpha1 = 1. - alpha1 * alpha1;
+
+
+ // Compute alpha2, for self shadowing effect
+ // (1 - alpha2) will later be used as percentage of incoming sunlight
+ float alpha2 = (texture2D(cloud_noise_texture, uv2).x - 0.5);
+ alpha2 = min(max(alpha2 + cloudDensity, 0.) * 2.5 * cloud_pos_density1.z, 1.);
+
+ // And smooth
+ alpha2 = 1. - alpha2;
+ alpha2 = 1. - alpha2 * alpha2;
+
+ // Combine
+ vec4 color;
+ color = (cloudColorSun*(1.-alpha2) + cloudColorAmbient);
+ color *= 2.;
+
+ /// Gamma correct for WL (soft clip effect).
+ frag_data[0] = vec4(scaleSoftClip(color.rgb), alpha1);
+ frag_data[1] = vec4(0.0,0.0,0.0,0.0);
+ frag_data[2] = vec4(0,0,1,0);
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/deferred/cloudsV.glsl b/indra/newview/app_settings/shaders/class1/deferred/cloudsV.glsl
new file mode 100644
index 0000000000..17f425475c
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/cloudsV.glsl
@@ -0,0 +1,191 @@
+/**
+ * @file WLCloudsV.glsl
+ *
+ * $LicenseInfo:firstyear=2005&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2005, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec2 texcoord0;
+
+//////////////////////////////////////////////////////////////////////////
+// The vertex shader for creating the atmospheric sky
+///////////////////////////////////////////////////////////////////////////////
+
+// Output parameters
+VARYING vec4 vary_CloudColorSun;
+VARYING vec4 vary_CloudColorAmbient;
+VARYING float vary_CloudDensity;
+
+VARYING vec2 vary_texcoord0;
+VARYING vec2 vary_texcoord1;
+VARYING vec2 vary_texcoord2;
+VARYING vec2 vary_texcoord3;
+
+// Inputs
+uniform vec3 camPosLocal;
+
+uniform vec4 lightnorm;
+uniform vec4 sunlight_color;
+uniform vec4 ambient;
+uniform vec4 blue_horizon;
+uniform vec4 blue_density;
+uniform float haze_horizon;
+uniform float haze_density;
+
+uniform float cloud_shadow;
+uniform float density_multiplier;
+uniform float max_y;
+
+uniform vec4 glow;
+
+uniform vec4 cloud_color;
+
+uniform float cloud_scale;
+
+void main()
+{
+
+ // World / view / projection
+ gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
+
+ vary_texcoord0 = texcoord0;
+
+ // Get relative position
+ vec3 P = position.xyz - camPosLocal.xyz + vec3(0,50,0);
+
+ // Set altitude
+ if (P.y > 0.)
+ {
+ P *= (max_y / P.y);
+ }
+ else
+ {
+ P *= (-32000. / P.y);
+ }
+
+ // Can normalize then
+ vec3 Pn = normalize(P);
+ float Plen = length(P);
+
+ // Initialize temp variables
+ vec4 temp1 = vec4(0.);
+ vec4 temp2 = vec4(0.);
+ vec4 blue_weight;
+ vec4 haze_weight;
+ vec4 sunlight = sunlight_color;
+ vec4 light_atten;
+
+
+ // Sunlight attenuation effect (hue and brightness) due to atmosphere
+ // this is used later for sunlight modulation at various altitudes
+ light_atten = (blue_density + vec4(haze_density * 0.25)) * (density_multiplier * max_y);
+
+ // Calculate relative weights
+ temp1 = blue_density + haze_density;
+ blue_weight = blue_density / temp1;
+ haze_weight = haze_density / temp1;
+
+ // Compute sunlight from P & lightnorm (for long rays like sky)
+ temp2.y = max(0., max(0., Pn.y) * 1.0 + lightnorm.y );
+ temp2.y = 1. / temp2.y;
+ sunlight *= exp( - light_atten * temp2.y);
+
+ // Distance
+ temp2.z = Plen * density_multiplier;
+
+ // Transparency (-> temp1)
+ // ATI Bugfix -- can't store temp1*temp2.z in a variable because the ati
+ // compiler gets confused.
+ temp1 = exp(-temp1 * temp2.z);
+
+
+ // Compute haze glow
+ temp2.x = dot(Pn, lightnorm.xyz);
+ temp2.x = 1. - temp2.x;
+ // temp2.x is 0 at the sun and increases away from sun
+ temp2.x = max(temp2.x, .001);
+ // Set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot)
+ temp2.x *= glow.x;
+ // Higher glow.x gives dimmer glow (because next step is 1 / "angle")
+ temp2.x = pow(temp2.x, glow.z);
+ // glow.z should be negative, so we're doing a sort of (1 / "angle") function
+
+ // Add "minimum anti-solar illumination"
+ temp2.x += .25;
+
+ // Increase ambient when there are more clouds
+ vec4 tmpAmbient = ambient;
+ tmpAmbient += (1. - tmpAmbient) * cloud_shadow * 0.5;
+
+ // Dim sunlight by cloud shadow percentage
+ sunlight *= (1. - cloud_shadow);
+
+ // Haze color below cloud
+ vec4 additiveColorBelowCloud = ( blue_horizon * blue_weight * (sunlight + tmpAmbient)
+ + (haze_horizon * haze_weight) * (sunlight * temp2.x + tmpAmbient)
+ );
+
+ // CLOUDS
+
+ sunlight = sunlight_color;
+ temp2.y = max(0., lightnorm.y * 2.);
+ temp2.y = 1. / temp2.y;
+ sunlight *= exp( - light_atten * temp2.y);
+
+ // Cloud color out
+ vary_CloudColorSun = (sunlight * temp2.x) * cloud_color;
+ vary_CloudColorAmbient = tmpAmbient * cloud_color;
+
+ // Attenuate cloud color by atmosphere
+ temp1 = sqrt(temp1); //less atmos opacity (more transparency) below clouds
+ vary_CloudColorSun *= temp1;
+ vary_CloudColorAmbient *= temp1;
+ vec4 oHazeColorBelowCloud = additiveColorBelowCloud * (1. - temp1);
+
+ // Make a nice cloud density based on the cloud_shadow value that was passed in.
+ vary_CloudDensity = 2. * (cloud_shadow - 0.25);
+
+
+ // Texture coords
+ vary_texcoord0 = texcoord0;
+ vary_texcoord0.xy -= 0.5;
+ vary_texcoord0.xy /= cloud_scale;
+ vary_texcoord0.xy += 0.5;
+
+ vary_texcoord1 = vary_texcoord0;
+ vary_texcoord1.x += lightnorm.x * 0.0125;
+ vary_texcoord1.y += lightnorm.z * 0.0125;
+
+ vary_texcoord2 = vary_texcoord0 * 16.;
+ vary_texcoord3 = vary_texcoord1 * 16.;
+
+ // Combine these to minimize register use
+ vary_CloudColorAmbient += oHazeColorBelowCloud;
+
+ // needs this to compile on mac
+ //vary_AtmosAttenuation = vec3(0.0,0.0,0.0);
+
+ // END CLOUDS
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/deferred/cofF.glsl b/indra/newview/app_settings/shaders/class1/deferred/cofF.glsl
new file mode 100644
index 0000000000..ccbc3c557c
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/cofF.glsl
@@ -0,0 +1,90 @@
+/**
+ * @file cofF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#extension GL_ARB_texture_rectangle : enable
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
+uniform sampler2DRect diffuseRect;
+uniform sampler2DRect depthMap;
+uniform sampler2D bloomMap;
+
+uniform float depth_cutoff;
+uniform float norm_cutoff;
+uniform float focal_distance;
+uniform float blur_constant;
+uniform float tan_pixel_angle;
+uniform float magnification;
+uniform float max_cof;
+
+uniform mat4 inv_proj;
+uniform vec2 screen_res;
+
+VARYING vec2 vary_fragcoord;
+
+float getDepth(vec2 pos_screen)
+{
+ float z = texture2DRect(depthMap, pos_screen.xy).r;
+ z = z*2.0-1.0;
+ vec4 ndc = vec4(0.0, 0.0, z, 1.0);
+ vec4 p = inv_proj*ndc;
+ return p.z/p.w;
+}
+
+float calc_cof(float depth)
+{
+ float sc = (depth-focal_distance)/-depth*blur_constant;
+
+ sc /= magnification;
+
+ // tan_pixel_angle = pixel_length/-depth;
+ float pixel_length = tan_pixel_angle*-focal_distance;
+
+ sc = sc/pixel_length;
+ sc *= 1.414;
+
+ return sc;
+}
+
+void main()
+{
+ vec2 tc = vary_fragcoord.xy;
+
+ float depth = getDepth(tc);
+
+ vec4 diff = texture2DRect(diffuseRect, vary_fragcoord.xy);
+
+ float sc = calc_cof(depth);
+ sc = min(sc, max_cof);
+ sc = max(sc, -max_cof);
+
+ vec4 bloom = texture2D(bloomMap, vary_fragcoord.xy/screen_res);
+ frag_color.rgb = diff.rgb + bloom.rgb;
+ frag_color.a = sc/max_cof*0.5+0.5;
+}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskF.glsl
new file mode 100644
index 0000000000..b2027d3a5d
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskF.glsl
@@ -0,0 +1,54 @@
+/**
+ * @file diffuseAlphaMaskF.glsl
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_data[3];
+#else
+#define frag_data gl_FragData
+#endif
+
+uniform float minimum_alpha;
+
+uniform sampler2D diffuseMap;
+
+VARYING vec3 vary_normal;
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+void main()
+{
+ vec4 col = texture2D(diffuseMap, vary_texcoord0.xy) * vertex_color;
+
+ if (col.a < minimum_alpha)
+ {
+ discard;
+ }
+
+ frag_data[0] = vec4(col.rgb, 0.0);
+ frag_data[1] = vec4(0,0,0,0); // spec
+ vec3 nvn = normalize(vary_normal);
+ frag_data[2] = vec4(nvn.xy * 0.5 + 0.5, nvn.z, 0.0);
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskIndexedF.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskIndexedF.glsl
new file mode 100644
index 0000000000..ead384b07c
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskIndexedF.glsl
@@ -0,0 +1,52 @@
+/**
+ * @file diffuseAlphaMaskIndexedF.glsl
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_data[3];
+#else
+#define frag_data gl_FragData
+#endif
+
+VARYING vec3 vary_normal;
+
+uniform float minimum_alpha;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+void main()
+{
+ vec4 col = diffuseLookup(vary_texcoord0.xy) * vertex_color;
+
+ if (col.a < minimum_alpha)
+ {
+ discard;
+ }
+
+ frag_data[0] = vec4(col.rgb, 0.0);
+ frag_data[1] = vec4(0,0,0,0);
+ vec3 nvn = normalize(vary_normal);
+ frag_data[2] = vec4(nvn.xy * 0.5 + 0.5, nvn.z, 0.0);
+}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskNoColorF.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskNoColorF.glsl
new file mode 100644
index 0000000000..f73fa6f231
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskNoColorF.glsl
@@ -0,0 +1,54 @@
+/**
+ * @file diffuseAlphaMaskNoColorF.glsl
+ *
+ * $LicenseInfo:firstyear=2005&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2005, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_data[3];
+#else
+#define frag_data gl_FragData
+#endif
+
+uniform float minimum_alpha;
+
+uniform sampler2D diffuseMap;
+
+VARYING vec3 vary_normal;
+VARYING vec2 vary_texcoord0;
+
+void main()
+{
+ vec4 col = texture2D(diffuseMap, vary_texcoord0.xy);
+
+ if (col.a < minimum_alpha)
+ {
+ discard;
+ }
+
+ frag_data[0] = vec4(col.rgb, 0.0);
+ frag_data[1] = vec4(0,0,0,0); // spec
+ vec3 nvn = normalize(vary_normal);
+ frag_data[2] = vec4(nvn.xy * 0.5 + 0.5, nvn.z, 0.0);
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseF.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseF.glsl
index 9bd622a506..227aa2aae3 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/diffuseF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseF.glsl
@@ -2,19 +2,46 @@
* @file diffuseF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_data[3];
+#else
+#define frag_data gl_FragData
+#endif
uniform sampler2D diffuseMap;
-varying vec3 vary_normal;
+VARYING vec3 vary_normal;
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
void main()
{
- vec3 col = gl_Color.rgb * texture2D(diffuseMap, gl_TexCoord[0].xy).rgb;
- gl_FragData[0] = vec4(col, 0.0);
- gl_FragData[1] = gl_Color.aaaa; // spec
- //gl_FragData[1] = vec4(vec3(gl_Color.a), gl_Color.a+(1.0-gl_Color.a)*gl_Color.a); // spec - from former class3 - maybe better, but not so well tested
+ vec3 col = vertex_color.rgb * texture2D(diffuseMap, vary_texcoord0.xy).rgb;
+ frag_data[0] = vec4(col, 0.0);
+ frag_data[1] = vertex_color.aaaa; // spec
+ //frag_data[1] = vec4(vec3(vertex_color.a), vertex_color.a+(1.0-vertex_color.a)*vertex_color.a); // spec - from former class3 - maybe better, but not so well tested
vec3 nvn = normalize(vary_normal);
- gl_FragData[2] = vec4(nvn.xy * 0.5 + 0.5, nvn.z, 0.0);
+ frag_data[2] = vec4(nvn.xy * 0.5 + 0.5, nvn.z, 0.0);
}
+
diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseIndexedF.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseIndexedF.glsl
new file mode 100644
index 0000000000..d442e5403a
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseIndexedF.glsl
@@ -0,0 +1,45 @@
+/**
+ * @file diffuseIndexedF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_data[3];
+#else
+#define frag_data gl_FragData
+#endif
+
+VARYING vec3 vary_normal;
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+void main()
+{
+ vec3 col = vertex_color.rgb * diffuseLookup(vary_texcoord0.xy).rgb;
+
+ frag_data[0] = vec4(col, 0.0);
+ frag_data[1] = vertex_color.aaaa; // spec
+ //frag_data[1] = vec4(vec3(vertex_color.a), vertex_color.a+(1.0-vertex_color.a)*vertex_color.a); // spec - from former class3 - maybe better, but not so well tested
+ vec3 nvn = normalize(vary_normal);
+ frag_data[2] = vec4(nvn.xy * 0.5 + 0.5, nvn.z, 0.0);
+}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseNoColorV.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseNoColorV.glsl
new file mode 100644
index 0000000000..9461e3e32e
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseNoColorV.glsl
@@ -0,0 +1,45 @@
+/**
+ * @file diffuseNoColorV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat3 normal_matrix;
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec3 vary_normal;
+
+VARYING vec2 vary_texcoord0;
+
+void main()
+{
+ //transform vertex
+ gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
+
+ vary_normal = normalize(normal_matrix * normal);
+}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseSkinnedV.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseSkinnedV.glsl
new file mode 100644
index 0000000000..a74290bfcd
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseSkinnedV.glsl
@@ -0,0 +1,59 @@
+/**
+ * @file diffuseSkinnedV.glsl
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat4 projection_matrix;
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec4 diffuse_color;
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec3 vary_normal;
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+mat4 getObjectSkinnedTransform();
+
+void main()
+{
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
+
+ mat4 mat = getObjectSkinnedTransform();
+
+ mat = modelview_matrix * mat;
+ vec3 pos = (mat*vec4(position.xyz, 1.0)).xyz;
+
+ vec4 norm = vec4(position.xyz, 1.0);
+ norm.xyz += normal.xyz;
+ norm.xyz = (mat*norm).xyz;
+ norm.xyz = normalize(norm.xyz-pos.xyz);
+
+ vary_normal = norm.xyz;
+
+ vertex_color = diffuse_color;
+
+ gl_Position = projection_matrix*vec4(pos, 1.0);
+}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseV.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseV.glsl
index bd58096317..76d29b1df7 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/diffuseV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseV.glsl
@@ -2,18 +2,51 @@
* @file diffuseV.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-varying vec3 vary_normal;
+uniform mat3 normal_matrix;
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec4 diffuse_color;
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec3 vary_normal;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+void passTextureIndex();
void main()
{
//transform vertex
- gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
- gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
+ gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
- vary_normal = normalize(gl_NormalMatrix * gl_Normal);
+ passTextureIndex();
+ vary_normal = normalize(normal_matrix * normal);
- gl_FrontColor = gl_Color;
+ vertex_color = diffuse_color;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/dofCombineF.glsl b/indra/newview/app_settings/shaders/class1/deferred/dofCombineF.glsl
new file mode 100644
index 0000000000..a425e5062e
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/dofCombineF.glsl
@@ -0,0 +1,79 @@
+/**
+ * @file dofCombineF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#extension GL_ARB_texture_rectangle : enable
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
+uniform sampler2DRect diffuseRect;
+uniform sampler2DRect lightMap;
+
+uniform mat4 inv_proj;
+uniform vec2 screen_res;
+
+uniform float max_cof;
+uniform float res_scale;
+uniform float dof_width;
+uniform float dof_height;
+
+VARYING vec2 vary_fragcoord;
+
+vec4 dofSample(sampler2DRect tex, vec2 tc)
+{
+ tc.x = min(tc.x, dof_width);
+ tc.y = min(tc.y, dof_height);
+
+ return texture2DRect(tex, tc);
+}
+
+void main()
+{
+ vec2 tc = vary_fragcoord.xy;
+
+ vec4 dof = dofSample(diffuseRect, vary_fragcoord.xy*res_scale);
+
+ vec4 diff = texture2DRect(lightMap, vary_fragcoord.xy);
+
+ float a = min(abs(diff.a*2.0-1.0) * max_cof*res_scale*res_scale, 1.0);
+
+ if (a > 0.25 && a < 0.75)
+ { //help out the transition a bit
+ float sc = a/res_scale;
+
+ vec4 col;
+ col = texture2DRect(lightMap, vary_fragcoord.xy+vec2(sc,sc));
+ col += texture2DRect(lightMap, vary_fragcoord.xy+vec2(-sc,sc));
+ col += texture2DRect(lightMap, vary_fragcoord.xy+vec2(sc,-sc));
+ col += texture2DRect(lightMap, vary_fragcoord.xy+vec2(-sc,-sc));
+
+ diff = mix(diff, col*0.25, a);
+ }
+
+ frag_color = mix(diff, dof, a);
+}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/emissiveF.glsl b/indra/newview/app_settings/shaders/class1/deferred/emissiveF.glsl
new file mode 100644
index 0000000000..6aa4d7b4ed
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/emissiveF.glsl
@@ -0,0 +1,52 @@
+/**
+ * @file emissiveF.glsl
+ *
+ * $LicenseInfo:firstyear=2005&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2005, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#extension GL_ARB_texture_rectangle : enable
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
+vec3 fullbrightAtmosTransport(vec3 light);
+vec3 fullbrightScaleSoftClip(vec3 light);
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+void main()
+{
+ float shadow = 1.0;
+
+ vec4 color = diffuseLookup(vary_texcoord0.xy)*vertex_color;
+
+ color.rgb = fullbrightAtmosTransport(color.rgb);
+
+ color.rgb = fullbrightScaleSoftClip(color.rgb);
+
+ frag_color = color;
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/deferred/emissiveV.glsl b/indra/newview/app_settings/shaders/class1/deferred/emissiveV.glsl
new file mode 100644
index 0000000000..115b04797f
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/emissiveV.glsl
@@ -0,0 +1,63 @@
+/**
+ * @file emissiveV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_matrix;
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+void passTextureIndex();
+ATTRIBUTE vec4 emissive;
+ATTRIBUTE vec2 texcoord0;
+
+void calcAtmospherics(vec3 inPositionEye);
+
+vec3 atmosAmbient(vec3 light);
+vec3 atmosAffectDirectionalLight(float lightIntensity);
+vec3 scaleDownLight(vec3 light);
+vec3 scaleUpLight(vec3 light);
+
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+
+void main()
+{
+ //transform vertex
+ vec4 vert = vec4(position.xyz, 1.0);
+ vec4 pos = (modelview_matrix * vert);
+ passTextureIndex();
+
+ gl_Position = modelview_projection_matrix*vec4(position.xyz, 1.0);
+
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
+
+ calcAtmospherics(pos.xyz);
+
+ vertex_color = emissive;
+
+
+}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl
index f53e15c6cc..36433a5827 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl
@@ -2,61 +2,52 @@
* @file fullbrightF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+
#extension GL_ARB_texture_rectangle : enable
-uniform sampler2D diffuseMap;
-uniform sampler2DRect depthMap;
-uniform sampler2D noiseMap;
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
-uniform vec4 shadow_clip;
-uniform vec2 screen_res;
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
vec3 fullbrightAtmosTransport(vec3 light);
vec3 fullbrightScaleSoftClip(vec3 light);
-varying vec3 vary_ambient;
-varying vec3 vary_directional;
-varying vec4 vary_position;
-varying vec3 vary_normal;
-varying vec3 vary_fragcoord;
-
-uniform mat4 inv_proj;
-
-vec4 getPosition(vec2 pos_screen)
-{
- float depth = texture2DRect(depthMap, pos_screen.xy).a;
- vec2 sc = pos_screen.xy*2.0;
- sc /= screen_res;
- sc -= vec2(1.0,1.0);
- vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0);
- vec4 pos = inv_proj * ndc;
- pos /= pos.w;
- pos.w = 1.0;
- return pos;
-}
void main()
{
- vec2 frag = vary_fragcoord.xy/vary_fragcoord.z*0.5+0.5;
- frag *= screen_res;
-
- vec3 samp_pos = getPosition(frag).xyz;
-
float shadow = 1.0;
- vec4 pos = vary_position;
- vec4 color = texture2D(diffuseMap, gl_TexCoord[0].xy)*gl_Color;
+ vec4 color = diffuseLookup(vary_texcoord0.xy)*vertex_color;
color.rgb = fullbrightAtmosTransport(color.rgb);
color.rgb = fullbrightScaleSoftClip(color.rgb);
- //gl_FragColor = gl_Color;
- gl_FragColor = color;
- //gl_FragColor = vec4(1,0,1,1);
-
+ frag_color = color;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/fullbrightV.glsl b/indra/newview/app_settings/shaders/class1/deferred/fullbrightV.glsl
index dc8b2c6be4..2e6982d101 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/fullbrightV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/fullbrightV.glsl
@@ -2,9 +2,37 @@
* @file fullbrightV.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_matrix;
+uniform mat4 modelview_projection_matrix;
+
+
+ATTRIBUTE vec3 position;
+void passTextureIndex();
+ATTRIBUTE vec4 diffuse_color;
+ATTRIBUTE vec2 texcoord0;
+
void calcAtmospherics(vec3 inPositionEye);
vec3 atmosAmbient(vec3 light);
@@ -12,30 +40,25 @@ vec3 atmosAffectDirectionalLight(float lightIntensity);
vec3 scaleDownLight(vec3 light);
vec3 scaleUpLight(vec3 light);
-varying vec3 vary_ambient;
-varying vec3 vary_directional;
-varying vec3 vary_normal;
-varying vec3 vary_fragcoord;
-uniform float near_clip;
-varying vec4 vary_position;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
void main()
{
//transform vertex
- gl_Position = ftransform();
+ vec4 vert = vec4(position.xyz, 1.0);
+ vec4 pos = (modelview_matrix * vert);
+ passTextureIndex();
+
+ gl_Position = modelview_projection_matrix*vec4(position.xyz, 1.0);
- gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
- vec4 pos = (gl_ModelViewMatrix * gl_Vertex);
- vary_position = pos;
-
calcAtmospherics(pos.xyz);
- gl_FrontColor = gl_Color;
+ vertex_color = diffuse_color;
- gl_FogFragCoord = pos.z;
-
- pos = gl_ModelViewProjectionMatrix * gl_Vertex;
- vary_fragcoord.xyz = pos.xyz + vec3(0,0,near_clip);
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/fxaaF.glsl b/indra/newview/app_settings/shaders/class1/deferred/fxaaF.glsl
new file mode 100644
index 0000000000..e02a7b405b
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/fxaaF.glsl
@@ -0,0 +1,2125 @@
+/**
+ * @file fxaaF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#extension GL_ARB_texture_rectangle : enable
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
+#define FXAA_PC 1
+//#define FXAA_GLSL_130 1
+#define FXAA_QUALITY__PRESET 12
+
+/*============================================================================
+
+
+ NVIDIA FXAA 3.11 by TIMOTHY LOTTES
+
+
+------------------------------------------------------------------------------
+COPYRIGHT (C) 2010, 2011 NVIDIA CORPORATION. ALL RIGHTS RESERVED.
+------------------------------------------------------------------------------
+TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THIS SOFTWARE IS PROVIDED
+*AS IS* AND NVIDIA AND ITS SUPPLIERS DISCLAIM ALL WARRANTIES, EITHER EXPRESS
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL NVIDIA
+OR ITS SUPPLIERS BE LIABLE FOR ANY SPECIAL, INCIDENTAL, INDIRECT, OR
+CONSEQUENTIAL DAMAGES WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR
+LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION,
+OR ANY OTHER PECUNIARY LOSS) ARISING OUT OF THE USE OF OR INABILITY TO USE
+THIS SOFTWARE, EVEN IF NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+------------------------------------------------------------------------------
+ INTEGRATION CHECKLIST
+------------------------------------------------------------------------------
+(1.)
+In the shader source, setup defines for the desired configuration.
+When providing multiple shaders (for different presets),
+simply setup the defines differently in multiple files.
+Example,
+
+ #define FXAA_PC 1
+ #define FXAA_HLSL_5 1
+ #define FXAA_QUALITY__PRESET 12
+
+Or,
+
+ #define FXAA_360 1
+
+Or,
+
+ #define FXAA_PS3 1
+
+Etc.
+
+(2.)
+Then include this file,
+
+ #include "Fxaa3_11.h"
+
+(3.)
+Then call the FXAA pixel shader from within your desired shader.
+Look at the FXAA Quality FxaaPixelShader() for docs on inputs.
+As for FXAA 3.11 all inputs for all shaders are the same
+to enable easy porting between platforms.
+
+ return FxaaPixelShader(...);
+
+(4.)
+Insure pass prior to FXAA outputs RGBL (see next section).
+Or use,
+
+ #define FXAA_GREEN_AS_LUMA 1
+
+(5.)
+Setup engine to provide the following constants
+which are used in the FxaaPixelShader() inputs,
+
+ FxaaFloat2 fxaaQualityRcpFrame,
+ FxaaFloat4 fxaaConsoleRcpFrameOpt,
+ FxaaFloat4 fxaaConsoleRcpFrameOpt2,
+ FxaaFloat4 fxaaConsole360RcpFrameOpt2,
+ FxaaFloat fxaaQualitySubpix,
+ FxaaFloat fxaaQualityEdgeThreshold,
+ FxaaFloat fxaaQualityEdgeThresholdMin,
+ FxaaFloat fxaaConsoleEdgeSharpness,
+ FxaaFloat fxaaConsoleEdgeThreshold,
+ FxaaFloat fxaaConsoleEdgeThresholdMin,
+ FxaaFloat4 fxaaConsole360ConstDir
+
+Look at the FXAA Quality FxaaPixelShader() for docs on inputs.
+
+(6.)
+Have FXAA vertex shader run as a full screen triangle,
+and output "pos" and "fxaaConsolePosPos"
+such that inputs in the pixel shader provide,
+
+ // {xy} = center of pixel
+ FxaaFloat2 pos,
+
+ // {xy__} = upper left of pixel
+ // {__zw} = lower right of pixel
+ FxaaFloat4 fxaaConsolePosPos,
+
+(7.)
+Insure the texture sampler(s) used by FXAA are set to bilinear filtering.
+
+
+------------------------------------------------------------------------------
+ INTEGRATION - RGBL AND COLORSPACE
+------------------------------------------------------------------------------
+FXAA3 requires RGBL as input unless the following is set,
+
+ #define FXAA_GREEN_AS_LUMA 1
+
+In which case the engine uses green in place of luma,
+and requires RGB input is in a non-linear colorspace.
+
+RGB should be LDR (low dynamic range).
+Specifically do FXAA after tonemapping.
+
+RGB data as returned by a texture fetch can be non-linear,
+or linear when FXAA_GREEN_AS_LUMA is not set.
+Note an "sRGB format" texture counts as linear,
+because the result of a texture fetch is linear data.
+Regular "RGBA8" textures in the sRGB colorspace are non-linear.
+
+If FXAA_GREEN_AS_LUMA is not set,
+luma must be stored in the alpha channel prior to running FXAA.
+This luma should be in a perceptual space (could be gamma 2.0).
+Example pass before FXAA where output is gamma 2.0 encoded,
+
+ color.rgb = ToneMap(color.rgb); // linear color output
+ color.rgb = sqrt(color.rgb); // gamma 2.0 color output
+ return color;
+
+To use FXAA,
+
+ color.rgb = ToneMap(color.rgb); // linear color output
+ color.rgb = sqrt(color.rgb); // gamma 2.0 color output
+ color.a = dot(color.rgb, FxaaFloat3(0.299, 0.587, 0.114)); // compute luma
+ return color;
+
+Another example where output is linear encoded,
+say for instance writing to an sRGB formated render target,
+where the render target does the conversion back to sRGB after blending,
+
+ color.rgb = ToneMap(color.rgb); // linear color output
+ return color;
+
+To use FXAA,
+
+ color.rgb = ToneMap(color.rgb); // linear color output
+ color.a = sqrt(dot(color.rgb, FxaaFloat3(0.299, 0.587, 0.114))); // compute luma
+ return color;
+
+Getting luma correct is required for the algorithm to work correctly.
+
+
+------------------------------------------------------------------------------
+ BEING LINEARLY CORRECT?
+------------------------------------------------------------------------------
+Applying FXAA to a framebuffer with linear RGB color will look worse.
+This is very counter intuitive, but happends to be true in this case.
+The reason is because dithering artifacts will be more visiable
+in a linear colorspace.
+
+
+------------------------------------------------------------------------------
+ COMPLEX INTEGRATION
+------------------------------------------------------------------------------
+Q. What if the engine is blending into RGB before wanting to run FXAA?
+
+A. In the last opaque pass prior to FXAA,
+ have the pass write out luma into alpha.
+ Then blend into RGB only.
+ FXAA should be able to run ok
+ assuming the blending pass did not any add aliasing.
+ This should be the common case for particles and common blending passes.
+
+A. Or use FXAA_GREEN_AS_LUMA.
+
+============================================================================*/
+
+/*============================================================================
+
+ INTEGRATION KNOBS
+
+============================================================================*/
+//
+// FXAA_PS3 and FXAA_360 choose the console algorithm (FXAA3 CONSOLE).
+// FXAA_360_OPT is a prototype for the new optimized 360 version.
+//
+// 1 = Use API.
+// 0 = Don't use API.
+//
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_PS3
+ #define FXAA_PS3 0
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_360
+ #define FXAA_360 0
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_360_OPT
+ #define FXAA_360_OPT 0
+#endif
+/*==========================================================================*/
+#ifndef FXAA_PC
+ //
+ // FXAA Quality
+ // The high quality PC algorithm.
+ //
+ #define FXAA_PC 0
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_PC_CONSOLE
+ //
+ // The console algorithm for PC is included
+ // for developers targeting really low spec machines.
+ // Likely better to just run FXAA_PC, and use a really low preset.
+ //
+ #define FXAA_PC_CONSOLE 0
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_GLSL_120
+ #define FXAA_GLSL_120 0
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_GLSL_130
+ #define FXAA_GLSL_130 0
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_HLSL_3
+ #define FXAA_HLSL_3 0
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_HLSL_4
+ #define FXAA_HLSL_4 0
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_HLSL_5
+ #define FXAA_HLSL_5 0
+#endif
+/*==========================================================================*/
+#ifndef FXAA_GREEN_AS_LUMA
+ //
+ // For those using non-linear color,
+ // and either not able to get luma in alpha, or not wanting to,
+ // this enables FXAA to run using green as a proxy for luma.
+ // So with this enabled, no need to pack luma in alpha.
+ //
+ // This will turn off AA on anything which lacks some amount of green.
+ // Pure red and blue or combination of only R and B, will get no AA.
+ //
+ // Might want to lower the settings for both,
+ // fxaaConsoleEdgeThresholdMin
+ // fxaaQualityEdgeThresholdMin
+ // In order to insure AA does not get turned off on colors
+ // which contain a minor amount of green.
+ //
+ // 1 = On.
+ // 0 = Off.
+ //
+ #define FXAA_GREEN_AS_LUMA 0
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_EARLY_EXIT
+ //
+ // Controls algorithm's early exit path.
+ // On PS3 turning this ON adds 2 cycles to the shader.
+ // On 360 turning this OFF adds 10ths of a millisecond to the shader.
+ // Turning this off on console will result in a more blurry image.
+ // So this defaults to on.
+ //
+ // 1 = On.
+ // 0 = Off.
+ //
+ #define FXAA_EARLY_EXIT 1
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_DISCARD
+ //
+ // Only valid for PC OpenGL currently.
+ // Probably will not work when FXAA_GREEN_AS_LUMA = 1.
+ //
+ // 1 = Use discard on pixels which don't need AA.
+ // For APIs which enable concurrent TEX+ROP from same surface.
+ // 0 = Return unchanged color on pixels which don't need AA.
+ //
+ #define FXAA_DISCARD 0
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_FAST_PIXEL_OFFSET
+ //
+ // Used for GLSL 120 only.
+ //
+ // 1 = GL API supports fast pixel offsets
+ // 0 = do not use fast pixel offsets
+ //
+ #ifdef GL_EXT_gpu_shader4
+ #define FXAA_FAST_PIXEL_OFFSET 1
+ #endif
+ #ifdef GL_NV_gpu_shader5
+ #define FXAA_FAST_PIXEL_OFFSET 1
+ #endif
+ #ifdef GL_ARB_gpu_shader5
+ #define FXAA_FAST_PIXEL_OFFSET 1
+ #endif
+ #ifndef FXAA_FAST_PIXEL_OFFSET
+ #define FXAA_FAST_PIXEL_OFFSET 0
+ #endif
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_GATHER4_ALPHA
+ //
+ // 1 = API supports gather4 on alpha channel.
+ // 0 = API does not support gather4 on alpha channel.
+ //
+ #if (FXAA_GLSL_130 == 0)
+ #define FXAA_GATHER4_ALPHA 0
+ #endif
+ #if (FXAA_HLSL_5 == 1)
+ #define FXAA_GATHER4_ALPHA 1
+ #endif
+ #ifndef FXAA_GATHER4_ALPHA
+ #ifdef GL_ARB_gpu_shader5
+ #define FXAA_GATHER4_ALPHA 1
+ #endif
+ #ifdef GL_NV_gpu_shader5
+ #define FXAA_GATHER4_ALPHA 1
+ #endif
+ #ifndef FXAA_GATHER4_ALPHA
+ #define FXAA_GATHER4_ALPHA 0
+ #endif
+ #endif
+#endif
+
+/*============================================================================
+ FXAA CONSOLE PS3 - TUNING KNOBS
+============================================================================*/
+#ifndef FXAA_CONSOLE__PS3_EDGE_SHARPNESS
+ //
+ // Consoles the sharpness of edges on PS3 only.
+ // Non-PS3 tuning is done with shader input.
+ //
+ // Due to the PS3 being ALU bound,
+ // there are only two safe values here: 4 and 8.
+ // These options use the shaders ability to a free *|/ by 2|4|8.
+ //
+ // 8.0 is sharper
+ // 4.0 is softer
+ // 2.0 is really soft (good for vector graphics inputs)
+ //
+ #if 1
+ #define FXAA_CONSOLE__PS3_EDGE_SHARPNESS 8.0
+ #endif
+ #if 0
+ #define FXAA_CONSOLE__PS3_EDGE_SHARPNESS 4.0
+ #endif
+ #if 0
+ #define FXAA_CONSOLE__PS3_EDGE_SHARPNESS 2.0
+ #endif
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_CONSOLE__PS3_EDGE_THRESHOLD
+ //
+ // Only effects PS3.
+ // Non-PS3 tuning is done with shader input.
+ //
+ // The minimum amount of local contrast required to apply algorithm.
+ // The console setting has a different mapping than the quality setting.
+ //
+ // This only applies when FXAA_EARLY_EXIT is 1.
+ //
+ // Due to the PS3 being ALU bound,
+ // there are only two safe values here: 0.25 and 0.125.
+ // These options use the shaders ability to a free *|/ by 2|4|8.
+ //
+ // 0.125 leaves less aliasing, but is softer
+ // 0.25 leaves more aliasing, and is sharper
+ //
+ #if 1
+ #define FXAA_CONSOLE__PS3_EDGE_THRESHOLD 0.125
+ #else
+ #define FXAA_CONSOLE__PS3_EDGE_THRESHOLD 0.25
+ #endif
+#endif
+
+/*============================================================================
+ FXAA QUALITY - TUNING KNOBS
+------------------------------------------------------------------------------
+NOTE the other tuning knobs are now in the shader function inputs!
+============================================================================*/
+#ifndef FXAA_QUALITY__PRESET
+ //
+ // Choose the quality preset.
+ // This needs to be compiled into the shader as it effects code.
+ // Best option to include multiple presets is to
+ // in each shader define the preset, then include this file.
+ //
+ // OPTIONS
+ // -----------------------------------------------------------------------
+ // 10 to 15 - default medium dither (10=fastest, 15=highest quality)
+ // 20 to 29 - less dither, more expensive (20=fastest, 29=highest quality)
+ // 39 - no dither, very expensive
+ //
+ // NOTES
+ // -----------------------------------------------------------------------
+ // 12 = slightly faster then FXAA 3.9 and higher edge quality (default)
+ // 13 = about same speed as FXAA 3.9 and better than 12
+ // 23 = closest to FXAA 3.9 visually and performance wise
+ // _ = the lowest digit is directly related to performance
+ // _ = the highest digit is directly related to style
+ //
+ #define FXAA_QUALITY__PRESET 12
+#endif
+
+
+/*============================================================================
+
+ FXAA QUALITY - PRESETS
+
+============================================================================*/
+
+/*============================================================================
+ FXAA QUALITY - MEDIUM DITHER PRESETS
+============================================================================*/
+#if (FXAA_QUALITY__PRESET == 10)
+ #define FXAA_QUALITY__PS 3
+ #define FXAA_QUALITY__P0 1.5
+ #define FXAA_QUALITY__P1 3.0
+ #define FXAA_QUALITY__P2 12.0
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_QUALITY__PRESET == 11)
+ #define FXAA_QUALITY__PS 4
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.5
+ #define FXAA_QUALITY__P2 3.0
+ #define FXAA_QUALITY__P3 12.0
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_QUALITY__PRESET == 12)
+ #define FXAA_QUALITY__PS 5
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.5
+ #define FXAA_QUALITY__P2 2.0
+ #define FXAA_QUALITY__P3 4.0
+ #define FXAA_QUALITY__P4 12.0
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_QUALITY__PRESET == 13)
+ #define FXAA_QUALITY__PS 6
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.5
+ #define FXAA_QUALITY__P2 2.0
+ #define FXAA_QUALITY__P3 2.0
+ #define FXAA_QUALITY__P4 4.0
+ #define FXAA_QUALITY__P5 12.0
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_QUALITY__PRESET == 14)
+ #define FXAA_QUALITY__PS 7
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.5
+ #define FXAA_QUALITY__P2 2.0
+ #define FXAA_QUALITY__P3 2.0
+ #define FXAA_QUALITY__P4 2.0
+ #define FXAA_QUALITY__P5 4.0
+ #define FXAA_QUALITY__P6 12.0
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_QUALITY__PRESET == 15)
+ #define FXAA_QUALITY__PS 8
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.5
+ #define FXAA_QUALITY__P2 2.0
+ #define FXAA_QUALITY__P3 2.0
+ #define FXAA_QUALITY__P4 2.0
+ #define FXAA_QUALITY__P5 2.0
+ #define FXAA_QUALITY__P6 4.0
+ #define FXAA_QUALITY__P7 12.0
+#endif
+
+/*============================================================================
+ FXAA QUALITY - LOW DITHER PRESETS
+============================================================================*/
+#if (FXAA_QUALITY__PRESET == 20)
+ #define FXAA_QUALITY__PS 3
+ #define FXAA_QUALITY__P0 1.5
+ #define FXAA_QUALITY__P1 2.0
+ #define FXAA_QUALITY__P2 8.0
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_QUALITY__PRESET == 21)
+ #define FXAA_QUALITY__PS 4
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.5
+ #define FXAA_QUALITY__P2 2.0
+ #define FXAA_QUALITY__P3 8.0
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_QUALITY__PRESET == 22)
+ #define FXAA_QUALITY__PS 5
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.5
+ #define FXAA_QUALITY__P2 2.0
+ #define FXAA_QUALITY__P3 2.0
+ #define FXAA_QUALITY__P4 8.0
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_QUALITY__PRESET == 23)
+ #define FXAA_QUALITY__PS 6
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.5
+ #define FXAA_QUALITY__P2 2.0
+ #define FXAA_QUALITY__P3 2.0
+ #define FXAA_QUALITY__P4 2.0
+ #define FXAA_QUALITY__P5 8.0
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_QUALITY__PRESET == 24)
+ #define FXAA_QUALITY__PS 7
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.5
+ #define FXAA_QUALITY__P2 2.0
+ #define FXAA_QUALITY__P3 2.0
+ #define FXAA_QUALITY__P4 2.0
+ #define FXAA_QUALITY__P5 3.0
+ #define FXAA_QUALITY__P6 8.0
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_QUALITY__PRESET == 25)
+ #define FXAA_QUALITY__PS 8
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.5
+ #define FXAA_QUALITY__P2 2.0
+ #define FXAA_QUALITY__P3 2.0
+ #define FXAA_QUALITY__P4 2.0
+ #define FXAA_QUALITY__P5 2.0
+ #define FXAA_QUALITY__P6 4.0
+ #define FXAA_QUALITY__P7 8.0
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_QUALITY__PRESET == 26)
+ #define FXAA_QUALITY__PS 9
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.5
+ #define FXAA_QUALITY__P2 2.0
+ #define FXAA_QUALITY__P3 2.0
+ #define FXAA_QUALITY__P4 2.0
+ #define FXAA_QUALITY__P5 2.0
+ #define FXAA_QUALITY__P6 2.0
+ #define FXAA_QUALITY__P7 4.0
+ #define FXAA_QUALITY__P8 8.0
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_QUALITY__PRESET == 27)
+ #define FXAA_QUALITY__PS 10
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.5
+ #define FXAA_QUALITY__P2 2.0
+ #define FXAA_QUALITY__P3 2.0
+ #define FXAA_QUALITY__P4 2.0
+ #define FXAA_QUALITY__P5 2.0
+ #define FXAA_QUALITY__P6 2.0
+ #define FXAA_QUALITY__P7 2.0
+ #define FXAA_QUALITY__P8 4.0
+ #define FXAA_QUALITY__P9 8.0
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_QUALITY__PRESET == 28)
+ #define FXAA_QUALITY__PS 11
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.5
+ #define FXAA_QUALITY__P2 2.0
+ #define FXAA_QUALITY__P3 2.0
+ #define FXAA_QUALITY__P4 2.0
+ #define FXAA_QUALITY__P5 2.0
+ #define FXAA_QUALITY__P6 2.0
+ #define FXAA_QUALITY__P7 2.0
+ #define FXAA_QUALITY__P8 2.0
+ #define FXAA_QUALITY__P9 4.0
+ #define FXAA_QUALITY__P10 8.0
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_QUALITY__PRESET == 29)
+ #define FXAA_QUALITY__PS 12
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.5
+ #define FXAA_QUALITY__P2 2.0
+ #define FXAA_QUALITY__P3 2.0
+ #define FXAA_QUALITY__P4 2.0
+ #define FXAA_QUALITY__P5 2.0
+ #define FXAA_QUALITY__P6 2.0
+ #define FXAA_QUALITY__P7 2.0
+ #define FXAA_QUALITY__P8 2.0
+ #define FXAA_QUALITY__P9 2.0
+ #define FXAA_QUALITY__P10 4.0
+ #define FXAA_QUALITY__P11 8.0
+#endif
+
+/*============================================================================
+ FXAA QUALITY - EXTREME QUALITY
+============================================================================*/
+#if (FXAA_QUALITY__PRESET == 39)
+ #define FXAA_QUALITY__PS 12
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.0
+ #define FXAA_QUALITY__P2 1.0
+ #define FXAA_QUALITY__P3 1.0
+ #define FXAA_QUALITY__P4 1.0
+ #define FXAA_QUALITY__P5 1.5
+ #define FXAA_QUALITY__P6 2.0
+ #define FXAA_QUALITY__P7 2.0
+ #define FXAA_QUALITY__P8 2.0
+ #define FXAA_QUALITY__P9 2.0
+ #define FXAA_QUALITY__P10 4.0
+ #define FXAA_QUALITY__P11 8.0
+#endif
+
+
+
+/*============================================================================
+
+ API PORTING
+
+============================================================================*/
+#if (FXAA_GLSL_120 == 1) || (FXAA_GLSL_130 == 1)
+ #define FxaaBool bool
+ #define FxaaDiscard discard
+ #define FxaaFloat float
+ #define FxaaFloat2 vec2
+ #define FxaaFloat3 vec3
+ #define FxaaFloat4 vec4
+ #define FxaaHalf float
+ #define FxaaHalf2 vec2
+ #define FxaaHalf3 vec3
+ #define FxaaHalf4 vec4
+ #define FxaaInt2 ivec2
+ #define FxaaSat(x) clamp(x, 0.0, 1.0)
+ #define FxaaTex sampler2D
+#else
+ #define FxaaBool bool
+ #define FxaaDiscard clip(-1)
+ #define FxaaFloat float
+ #define FxaaFloat2 float2
+ #define FxaaFloat3 float3
+ #define FxaaFloat4 float4
+ #define FxaaHalf half
+ #define FxaaHalf2 half2
+ #define FxaaHalf3 half3
+ #define FxaaHalf4 half4
+ #define FxaaSat(x) saturate(x)
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_GLSL_120 == 1)
+ // Requires,
+ // #version 120
+ // And at least,
+ // #extension GL_EXT_gpu_shader4 : enable
+ // (or set FXAA_FAST_PIXEL_OFFSET 1 to work like DX9)
+ #define FxaaTexTop(t, p) texture2DLod(t, p, 0.0)
+ #if (FXAA_FAST_PIXEL_OFFSET == 1)
+ #define FxaaTexOff(t, p, o, r) texture2DLodOffset(t, p, 0.0, o)
+ #else
+ #define FxaaTexOff(t, p, o, r) texture2DLod(t, p + (o * r), 0.0)
+ #endif
+ #if (FXAA_GATHER4_ALPHA == 1)
+ // use #extension GL_ARB_gpu_shader5 : enable
+ #define FxaaTexAlpha4(t, p) textureGather(t, p, 3)
+ #define FxaaTexOffAlpha4(t, p, o) textureGatherOffset(t, p, o, 3)
+ #define FxaaTexGreen4(t, p) textureGather(t, p, 1)
+ #define FxaaTexOffGreen4(t, p, o) textureGatherOffset(t, p, o, 1)
+ #endif
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_GLSL_130 == 1)
+ // Requires "#version 130" or better
+ #define FxaaTexTop(t, p) textureLod(t, p, 0.0)
+ #define FxaaTexOff(t, p, o, r) textureLodOffset(t, p, 0.0, o)
+ #if (FXAA_GATHER4_ALPHA == 1)
+ // use #extension GL_ARB_gpu_shader5 : enable
+ #define FxaaTexAlpha4(t, p) textureGather(t, p, 3)
+ #define FxaaTexOffAlpha4(t, p, o) textureGatherOffset(t, p, o, 3)
+ #define FxaaTexGreen4(t, p) textureGather(t, p, 1)
+ #define FxaaTexOffGreen4(t, p, o) textureGatherOffset(t, p, o, 1)
+ #endif
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_HLSL_3 == 1) || (FXAA_360 == 1) || (FXAA_PS3 == 1)
+ #define FxaaInt2 float2
+ #define FxaaTex sampler2D
+ #define FxaaTexTop(t, p) tex2Dlod(t, float4(p, 0.0, 0.0))
+ #define FxaaTexOff(t, p, o, r) tex2Dlod(t, float4(p + (o * r), 0, 0))
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_HLSL_4 == 1)
+ #define FxaaInt2 int2
+ struct FxaaTex { SamplerState smpl; Texture2D tex; };
+ #define FxaaTexTop(t, p) t.tex.SampleLevel(t.smpl, p, 0.0)
+ #define FxaaTexOff(t, p, o, r) t.tex.SampleLevel(t.smpl, p, 0.0, o)
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_HLSL_5 == 1)
+ #define FxaaInt2 int2
+ struct FxaaTex { SamplerState smpl; Texture2D tex; };
+ #define FxaaTexTop(t, p) t.tex.SampleLevel(t.smpl, p, 0.0)
+ #define FxaaTexOff(t, p, o, r) t.tex.SampleLevel(t.smpl, p, 0.0, o)
+ #define FxaaTexAlpha4(t, p) t.tex.GatherAlpha(t.smpl, p)
+ #define FxaaTexOffAlpha4(t, p, o) t.tex.GatherAlpha(t.smpl, p, o)
+ #define FxaaTexGreen4(t, p) t.tex.GatherGreen(t.smpl, p)
+ #define FxaaTexOffGreen4(t, p, o) t.tex.GatherGreen(t.smpl, p, o)
+#endif
+
+
+/*============================================================================
+ GREEN AS LUMA OPTION SUPPORT FUNCTION
+============================================================================*/
+#if (FXAA_GREEN_AS_LUMA == 0)
+ FxaaFloat FxaaLuma(FxaaFloat4 rgba) { return rgba.w; }
+#else
+ FxaaFloat FxaaLuma(FxaaFloat4 rgba) { return rgba.y; }
+#endif
+
+
+
+
+/*============================================================================
+
+ FXAA3 QUALITY - PC
+
+============================================================================*/
+#if (FXAA_PC == 1)
+/*--------------------------------------------------------------------------*/
+FxaaFloat4 FxaaPixelShader(
+ //
+ // Use noperspective interpolation here (turn off perspective interpolation).
+ // {xy} = center of pixel
+ FxaaFloat2 pos,
+ //
+ // Used only for FXAA Console, and not used on the 360 version.
+ // Use noperspective interpolation here (turn off perspective interpolation).
+ // {xy__} = upper left of pixel
+ // {__zw} = lower right of pixel
+ FxaaFloat4 fxaaConsolePosPos,
+ //
+ // Input color texture.
+ // {rgb_} = color in linear or perceptual color space
+ // if (FXAA_GREEN_AS_LUMA == 0)
+ // {___a} = luma in perceptual color space (not linear)
+ FxaaTex tex,
+ //
+ // Only used on the optimized 360 version of FXAA Console.
+ // For everything but 360, just use the same input here as for "tex".
+ // For 360, same texture, just alias with a 2nd sampler.
+ // This sampler needs to have an exponent bias of -1.
+ FxaaTex fxaaConsole360TexExpBiasNegOne,
+ //
+ // Only used on the optimized 360 version of FXAA Console.
+ // For everything but 360, just use the same input here as for "tex".
+ // For 360, same texture, just alias with a 3nd sampler.
+ // This sampler needs to have an exponent bias of -2.
+ FxaaTex fxaaConsole360TexExpBiasNegTwo,
+ //
+ // Only used on FXAA Quality.
+ // This must be from a constant/uniform.
+ // {x_} = 1.0/screenWidthInPixels
+ // {_y} = 1.0/screenHeightInPixels
+ FxaaFloat2 fxaaQualityRcpFrame,
+ //
+ // Only used on FXAA Console.
+ // This must be from a constant/uniform.
+ // This effects sub-pixel AA quality and inversely sharpness.
+ // Where N ranges between,
+ // N = 0.50 (default)
+ // N = 0.33 (sharper)
+ // {x___} = -N/screenWidthInPixels
+ // {_y__} = -N/screenHeightInPixels
+ // {__z_} = N/screenWidthInPixels
+ // {___w} = N/screenHeightInPixels
+ FxaaFloat4 fxaaConsoleRcpFrameOpt,
+ //
+ // Only used on FXAA Console.
+ // Not used on 360, but used on PS3 and PC.
+ // This must be from a constant/uniform.
+ // {x___} = -2.0/screenWidthInPixels
+ // {_y__} = -2.0/screenHeightInPixels
+ // {__z_} = 2.0/screenWidthInPixels
+ // {___w} = 2.0/screenHeightInPixels
+ FxaaFloat4 fxaaConsoleRcpFrameOpt2,
+ //
+ // Only used on FXAA Console.
+ // Only used on 360 in place of fxaaConsoleRcpFrameOpt2.
+ // This must be from a constant/uniform.
+ // {x___} = 8.0/screenWidthInPixels
+ // {_y__} = 8.0/screenHeightInPixels
+ // {__z_} = -4.0/screenWidthInPixels
+ // {___w} = -4.0/screenHeightInPixels
+ FxaaFloat4 fxaaConsole360RcpFrameOpt2,
+ //
+ // Only used on FXAA Quality.
+ // This used to be the FXAA_QUALITY__SUBPIX define.
+ // It is here now to allow easier tuning.
+ // Choose the amount of sub-pixel aliasing removal.
+ // This can effect sharpness.
+ // 1.00 - upper limit (softer)
+ // 0.75 - default amount of filtering
+ // 0.50 - lower limit (sharper, less sub-pixel aliasing removal)
+ // 0.25 - almost off
+ // 0.00 - completely off
+ FxaaFloat fxaaQualitySubpix,
+ //
+ // Only used on FXAA Quality.
+ // This used to be the FXAA_QUALITY__EDGE_THRESHOLD define.
+ // It is here now to allow easier tuning.
+ // The minimum amount of local contrast required to apply algorithm.
+ // 0.333 - too little (faster)
+ // 0.250 - low quality
+ // 0.166 - default
+ // 0.125 - high quality
+ // 0.063 - overkill (slower)
+ FxaaFloat fxaaQualityEdgeThreshold,
+ //
+ // Only used on FXAA Quality.
+ // This used to be the FXAA_QUALITY__EDGE_THRESHOLD_MIN define.
+ // It is here now to allow easier tuning.
+ // Trims the algorithm from processing darks.
+ // 0.0833 - upper limit (default, the start of visible unfiltered edges)
+ // 0.0625 - high quality (faster)
+ // 0.0312 - visible limit (slower)
+ // Special notes when using FXAA_GREEN_AS_LUMA,
+ // Likely want to set this to zero.
+ // As colors that are mostly not-green
+ // will appear very dark in the green channel!
+ // Tune by looking at mostly non-green content,
+ // then start at zero and increase until aliasing is a problem.
+ FxaaFloat fxaaQualityEdgeThresholdMin,
+ //
+ // Only used on FXAA Console.
+ // This used to be the FXAA_CONSOLE__EDGE_SHARPNESS define.
+ // It is here now to allow easier tuning.
+ // This does not effect PS3, as this needs to be compiled in.
+ // Use FXAA_CONSOLE__PS3_EDGE_SHARPNESS for PS3.
+ // Due to the PS3 being ALU bound,
+ // there are only three safe values here: 2 and 4 and 8.
+ // These options use the shaders ability to a free *|/ by 2|4|8.
+ // For all other platforms can be a non-power of two.
+ // 8.0 is sharper (default!!!)
+ // 4.0 is softer
+ // 2.0 is really soft (good only for vector graphics inputs)
+ FxaaFloat fxaaConsoleEdgeSharpness,
+ //
+ // Only used on FXAA Console.
+ // This used to be the FXAA_CONSOLE__EDGE_THRESHOLD define.
+ // It is here now to allow easier tuning.
+ // This does not effect PS3, as this needs to be compiled in.
+ // Use FXAA_CONSOLE__PS3_EDGE_THRESHOLD for PS3.
+ // Due to the PS3 being ALU bound,
+ // there are only two safe values here: 1/4 and 1/8.
+ // These options use the shaders ability to a free *|/ by 2|4|8.
+ // The console setting has a different mapping than the quality setting.
+ // Other platforms can use other values.
+ // 0.125 leaves less aliasing, but is softer (default!!!)
+ // 0.25 leaves more aliasing, and is sharper
+ FxaaFloat fxaaConsoleEdgeThreshold,
+ //
+ // Only used on FXAA Console.
+ // This used to be the FXAA_CONSOLE__EDGE_THRESHOLD_MIN define.
+ // It is here now to allow easier tuning.
+ // Trims the algorithm from processing darks.
+ // The console setting has a different mapping than the quality setting.
+ // This only applies when FXAA_EARLY_EXIT is 1.
+ // This does not apply to PS3,
+ // PS3 was simplified to avoid more shader instructions.
+ // 0.06 - faster but more aliasing in darks
+ // 0.05 - default
+ // 0.04 - slower and less aliasing in darks
+ // Special notes when using FXAA_GREEN_AS_LUMA,
+ // Likely want to set this to zero.
+ // As colors that are mostly not-green
+ // will appear very dark in the green channel!
+ // Tune by looking at mostly non-green content,
+ // then start at zero and increase until aliasing is a problem.
+ FxaaFloat fxaaConsoleEdgeThresholdMin,
+ //
+ // Extra constants for 360 FXAA Console only.
+ // Use zeros or anything else for other platforms.
+ // These must be in physical constant registers and NOT immedates.
+ // Immedates will result in compiler un-optimizing.
+ // {xyzw} = float4(1.0, -1.0, 0.25, -0.25)
+ FxaaFloat4 fxaaConsole360ConstDir
+) {
+/*--------------------------------------------------------------------------*/
+ FxaaFloat2 posM;
+ posM.x = pos.x;
+ posM.y = pos.y;
+ #if (FXAA_GATHER4_ALPHA == 1)
+ #if (FXAA_DISCARD == 0)
+ FxaaFloat4 rgbyM = FxaaTexTop(tex, posM);
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ #define lumaM rgbyM.w
+ #else
+ #define lumaM rgbyM.y
+ #endif
+ #endif
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ FxaaFloat4 luma4A = FxaaTexAlpha4(tex, posM);
+ FxaaFloat4 luma4B = FxaaTexOffAlpha4(tex, posM, FxaaInt2(-1, -1));
+ #else
+ FxaaFloat4 luma4A = FxaaTexGreen4(tex, posM);
+ FxaaFloat4 luma4B = FxaaTexOffGreen4(tex, posM, FxaaInt2(-1, -1));
+ #endif
+ #if (FXAA_DISCARD == 1)
+ #define lumaM luma4A.w
+ #endif
+ #define lumaE luma4A.z
+ #define lumaS luma4A.x
+ #define lumaSE luma4A.y
+ #define lumaNW luma4B.w
+ #define lumaN luma4B.z
+ #define lumaW luma4B.x
+ #else
+ FxaaFloat4 rgbyM = FxaaTexTop(tex, posM);
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ #define lumaM rgbyM.w
+ #else
+ #define lumaM rgbyM.y
+ #endif
+ FxaaFloat lumaS = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 0, 1), fxaaQualityRcpFrame.xy));
+ FxaaFloat lumaE = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 1, 0), fxaaQualityRcpFrame.xy));
+ FxaaFloat lumaN = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 0,-1), fxaaQualityRcpFrame.xy));
+ FxaaFloat lumaW = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(-1, 0), fxaaQualityRcpFrame.xy));
+ #endif
+/*--------------------------------------------------------------------------*/
+ FxaaFloat maxSM = max(lumaS, lumaM);
+ FxaaFloat minSM = min(lumaS, lumaM);
+ FxaaFloat maxESM = max(lumaE, maxSM);
+ FxaaFloat minESM = min(lumaE, minSM);
+ FxaaFloat maxWN = max(lumaN, lumaW);
+ FxaaFloat minWN = min(lumaN, lumaW);
+ FxaaFloat rangeMax = max(maxWN, maxESM);
+ FxaaFloat rangeMin = min(minWN, minESM);
+ FxaaFloat rangeMaxScaled = rangeMax * fxaaQualityEdgeThreshold;
+ FxaaFloat range = rangeMax - rangeMin;
+ FxaaFloat rangeMaxClamped = max(fxaaQualityEdgeThresholdMin, rangeMaxScaled);
+ FxaaBool earlyExit = range < rangeMaxClamped;
+/*--------------------------------------------------------------------------*/
+ if(earlyExit)
+ #if (FXAA_DISCARD == 1)
+ FxaaDiscard;
+ #else
+ return rgbyM;
+ #endif
+/*--------------------------------------------------------------------------*/
+ #if (FXAA_GATHER4_ALPHA == 0)
+ FxaaFloat lumaNW = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(-1,-1), fxaaQualityRcpFrame.xy));
+ FxaaFloat lumaSE = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 1, 1), fxaaQualityRcpFrame.xy));
+ FxaaFloat lumaNE = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 1,-1), fxaaQualityRcpFrame.xy));
+ FxaaFloat lumaSW = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(-1, 1), fxaaQualityRcpFrame.xy));
+ #else
+ FxaaFloat lumaNE = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(1, -1), fxaaQualityRcpFrame.xy));
+ FxaaFloat lumaSW = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(-1, 1), fxaaQualityRcpFrame.xy));
+ #endif
+/*--------------------------------------------------------------------------*/
+ FxaaFloat lumaNS = lumaN + lumaS;
+ FxaaFloat lumaWE = lumaW + lumaE;
+ FxaaFloat subpixRcpRange = 1.0/range;
+ FxaaFloat subpixNSWE = lumaNS + lumaWE;
+ FxaaFloat edgeHorz1 = (-2.0 * lumaM) + lumaNS;
+ FxaaFloat edgeVert1 = (-2.0 * lumaM) + lumaWE;
+/*--------------------------------------------------------------------------*/
+ FxaaFloat lumaNESE = lumaNE + lumaSE;
+ FxaaFloat lumaNWNE = lumaNW + lumaNE;
+ FxaaFloat edgeHorz2 = (-2.0 * lumaE) + lumaNESE;
+ FxaaFloat edgeVert2 = (-2.0 * lumaN) + lumaNWNE;
+/*--------------------------------------------------------------------------*/
+ FxaaFloat lumaNWSW = lumaNW + lumaSW;
+ FxaaFloat lumaSWSE = lumaSW + lumaSE;
+ FxaaFloat edgeHorz4 = (abs(edgeHorz1) * 2.0) + abs(edgeHorz2);
+ FxaaFloat edgeVert4 = (abs(edgeVert1) * 2.0) + abs(edgeVert2);
+ FxaaFloat edgeHorz3 = (-2.0 * lumaW) + lumaNWSW;
+ FxaaFloat edgeVert3 = (-2.0 * lumaS) + lumaSWSE;
+ FxaaFloat edgeHorz = abs(edgeHorz3) + edgeHorz4;
+ FxaaFloat edgeVert = abs(edgeVert3) + edgeVert4;
+/*--------------------------------------------------------------------------*/
+ FxaaFloat subpixNWSWNESE = lumaNWSW + lumaNESE;
+ FxaaFloat lengthSign = fxaaQualityRcpFrame.x;
+ FxaaBool horzSpan = edgeHorz >= edgeVert;
+ FxaaFloat subpixA = subpixNSWE * 2.0 + subpixNWSWNESE;
+/*--------------------------------------------------------------------------*/
+ if(!horzSpan) lumaN = lumaW;
+ if(!horzSpan) lumaS = lumaE;
+ if(horzSpan) lengthSign = fxaaQualityRcpFrame.y;
+ FxaaFloat subpixB = (subpixA * (1.0/12.0)) - lumaM;
+/*--------------------------------------------------------------------------*/
+ FxaaFloat gradientN = lumaN - lumaM;
+ FxaaFloat gradientS = lumaS - lumaM;
+ FxaaFloat lumaNN = lumaN + lumaM;
+ FxaaFloat lumaSS = lumaS + lumaM;
+ FxaaBool pairN = abs(gradientN) >= abs(gradientS);
+ FxaaFloat gradient = max(abs(gradientN), abs(gradientS));
+ if(pairN) lengthSign = -lengthSign;
+ FxaaFloat subpixC = FxaaSat(abs(subpixB) * subpixRcpRange);
+/*--------------------------------------------------------------------------*/
+ FxaaFloat2 posB;
+ posB.x = posM.x;
+ posB.y = posM.y;
+ FxaaFloat2 offNP;
+ offNP.x = (!horzSpan) ? 0.0 : fxaaQualityRcpFrame.x;
+ offNP.y = ( horzSpan) ? 0.0 : fxaaQualityRcpFrame.y;
+ if(!horzSpan) posB.x += lengthSign * 0.5;
+ if( horzSpan) posB.y += lengthSign * 0.5;
+/*--------------------------------------------------------------------------*/
+ FxaaFloat2 posN;
+ posN.x = posB.x - offNP.x * FXAA_QUALITY__P0;
+ posN.y = posB.y - offNP.y * FXAA_QUALITY__P0;
+ FxaaFloat2 posP;
+ posP.x = posB.x + offNP.x * FXAA_QUALITY__P0;
+ posP.y = posB.y + offNP.y * FXAA_QUALITY__P0;
+ FxaaFloat subpixD = ((-2.0)*subpixC) + 3.0;
+ FxaaFloat lumaEndN = FxaaLuma(FxaaTexTop(tex, posN));
+ FxaaFloat subpixE = subpixC * subpixC;
+ FxaaFloat lumaEndP = FxaaLuma(FxaaTexTop(tex, posP));
+/*--------------------------------------------------------------------------*/
+ if(!pairN) lumaNN = lumaSS;
+ FxaaFloat gradientScaled = gradient * 1.0/4.0;
+ FxaaFloat lumaMM = lumaM - lumaNN * 0.5;
+ FxaaFloat subpixF = subpixD * subpixE;
+ FxaaBool lumaMLTZero = lumaMM < 0.0;
+/*--------------------------------------------------------------------------*/
+ lumaEndN -= lumaNN * 0.5;
+ lumaEndP -= lumaNN * 0.5;
+ FxaaBool doneN = abs(lumaEndN) >= gradientScaled;
+ FxaaBool doneP = abs(lumaEndP) >= gradientScaled;
+ if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P1;
+ if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P1;
+ FxaaBool doneNP = (!doneN) || (!doneP);
+ if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P1;
+ if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P1;
+/*--------------------------------------------------------------------------*/
+ if(doneNP) {
+ if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));
+ if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));
+ if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
+ if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
+ doneN = abs(lumaEndN) >= gradientScaled;
+ doneP = abs(lumaEndP) >= gradientScaled;
+ if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P2;
+ if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P2;
+ doneNP = (!doneN) || (!doneP);
+ if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P2;
+ if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P2;
+/*--------------------------------------------------------------------------*/
+ #if (FXAA_QUALITY__PS > 3)
+ if(doneNP) {
+ if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));
+ if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));
+ if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
+ if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
+ doneN = abs(lumaEndN) >= gradientScaled;
+ doneP = abs(lumaEndP) >= gradientScaled;
+ if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P3;
+ if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P3;
+ doneNP = (!doneN) || (!doneP);
+ if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P3;
+ if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P3;
+/*--------------------------------------------------------------------------*/
+ #if (FXAA_QUALITY__PS > 4)
+ if(doneNP) {
+ if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));
+ if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));
+ if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
+ if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
+ doneN = abs(lumaEndN) >= gradientScaled;
+ doneP = abs(lumaEndP) >= gradientScaled;
+ if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P4;
+ if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P4;
+ doneNP = (!doneN) || (!doneP);
+ if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P4;
+ if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P4;
+/*--------------------------------------------------------------------------*/
+ #if (FXAA_QUALITY__PS > 5)
+ if(doneNP) {
+ if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));
+ if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));
+ if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
+ if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
+ doneN = abs(lumaEndN) >= gradientScaled;
+ doneP = abs(lumaEndP) >= gradientScaled;
+ if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P5;
+ if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P5;
+ doneNP = (!doneN) || (!doneP);
+ if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P5;
+ if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P5;
+/*--------------------------------------------------------------------------*/
+ #if (FXAA_QUALITY__PS > 6)
+ if(doneNP) {
+ if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));
+ if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));
+ if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
+ if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
+ doneN = abs(lumaEndN) >= gradientScaled;
+ doneP = abs(lumaEndP) >= gradientScaled;
+ if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P6;
+ if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P6;
+ doneNP = (!doneN) || (!doneP);
+ if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P6;
+ if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P6;
+/*--------------------------------------------------------------------------*/
+ #if (FXAA_QUALITY__PS > 7)
+ if(doneNP) {
+ if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));
+ if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));
+ if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
+ if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
+ doneN = abs(lumaEndN) >= gradientScaled;
+ doneP = abs(lumaEndP) >= gradientScaled;
+ if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P7;
+ if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P7;
+ doneNP = (!doneN) || (!doneP);
+ if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P7;
+ if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P7;
+/*--------------------------------------------------------------------------*/
+ #if (FXAA_QUALITY__PS > 8)
+ if(doneNP) {
+ if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));
+ if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));
+ if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
+ if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
+ doneN = abs(lumaEndN) >= gradientScaled;
+ doneP = abs(lumaEndP) >= gradientScaled;
+ if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P8;
+ if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P8;
+ doneNP = (!doneN) || (!doneP);
+ if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P8;
+ if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P8;
+/*--------------------------------------------------------------------------*/
+ #if (FXAA_QUALITY__PS > 9)
+ if(doneNP) {
+ if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));
+ if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));
+ if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
+ if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
+ doneN = abs(lumaEndN) >= gradientScaled;
+ doneP = abs(lumaEndP) >= gradientScaled;
+ if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P9;
+ if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P9;
+ doneNP = (!doneN) || (!doneP);
+ if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P9;
+ if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P9;
+/*--------------------------------------------------------------------------*/
+ #if (FXAA_QUALITY__PS > 10)
+ if(doneNP) {
+ if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));
+ if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));
+ if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
+ if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
+ doneN = abs(lumaEndN) >= gradientScaled;
+ doneP = abs(lumaEndP) >= gradientScaled;
+ if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P10;
+ if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P10;
+ doneNP = (!doneN) || (!doneP);
+ if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P10;
+ if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P10;
+/*--------------------------------------------------------------------------*/
+ #if (FXAA_QUALITY__PS > 11)
+ if(doneNP) {
+ if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));
+ if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));
+ if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
+ if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
+ doneN = abs(lumaEndN) >= gradientScaled;
+ doneP = abs(lumaEndP) >= gradientScaled;
+ if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P11;
+ if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P11;
+ doneNP = (!doneN) || (!doneP);
+ if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P11;
+ if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P11;
+/*--------------------------------------------------------------------------*/
+ #if (FXAA_QUALITY__PS > 12)
+ if(doneNP) {
+ if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));
+ if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));
+ if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
+ if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
+ doneN = abs(lumaEndN) >= gradientScaled;
+ doneP = abs(lumaEndP) >= gradientScaled;
+ if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P12;
+ if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P12;
+ doneNP = (!doneN) || (!doneP);
+ if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P12;
+ if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P12;
+/*--------------------------------------------------------------------------*/
+ }
+ #endif
+/*--------------------------------------------------------------------------*/
+ }
+ #endif
+/*--------------------------------------------------------------------------*/
+ }
+ #endif
+/*--------------------------------------------------------------------------*/
+ }
+ #endif
+/*--------------------------------------------------------------------------*/
+ }
+ #endif
+/*--------------------------------------------------------------------------*/
+ }
+ #endif
+/*--------------------------------------------------------------------------*/
+ }
+ #endif
+/*--------------------------------------------------------------------------*/
+ }
+ #endif
+/*--------------------------------------------------------------------------*/
+ }
+ #endif
+/*--------------------------------------------------------------------------*/
+ }
+ #endif
+/*--------------------------------------------------------------------------*/
+ }
+/*--------------------------------------------------------------------------*/
+ FxaaFloat dstN = posM.x - posN.x;
+ FxaaFloat dstP = posP.x - posM.x;
+ if(!horzSpan) dstN = posM.y - posN.y;
+ if(!horzSpan) dstP = posP.y - posM.y;
+/*--------------------------------------------------------------------------*/
+ FxaaBool goodSpanN = (lumaEndN < 0.0) != lumaMLTZero;
+ FxaaFloat spanLength = (dstP + dstN);
+ FxaaBool goodSpanP = (lumaEndP < 0.0) != lumaMLTZero;
+ FxaaFloat spanLengthRcp = 1.0/spanLength;
+/*--------------------------------------------------------------------------*/
+ FxaaBool directionN = dstN < dstP;
+ FxaaFloat dst = min(dstN, dstP);
+ FxaaBool goodSpan = directionN ? goodSpanN : goodSpanP;
+ FxaaFloat subpixG = subpixF * subpixF;
+ FxaaFloat pixelOffset = (dst * (-spanLengthRcp)) + 0.5;
+ FxaaFloat subpixH = subpixG * fxaaQualitySubpix;
+/*--------------------------------------------------------------------------*/
+ FxaaFloat pixelOffsetGood = goodSpan ? pixelOffset : 0.0;
+ FxaaFloat pixelOffsetSubpix = max(pixelOffsetGood, subpixH);
+ if(!horzSpan) posM.x += pixelOffsetSubpix * lengthSign;
+ if( horzSpan) posM.y += pixelOffsetSubpix * lengthSign;
+ #if (FXAA_DISCARD == 1)
+ return FxaaTexTop(tex, posM);
+ #else
+ return FxaaFloat4(FxaaTexTop(tex, posM).xyz, lumaM);
+ #endif
+}
+/*==========================================================================*/
+#endif
+
+
+
+
+/*============================================================================
+
+ FXAA3 CONSOLE - PC VERSION
+
+------------------------------------------------------------------------------
+Instead of using this on PC, I'd suggest just using FXAA Quality with
+ #define FXAA_QUALITY__PRESET 10
+Or
+ #define FXAA_QUALITY__PRESET 20
+Either are higher qualilty and almost as fast as this on modern PC GPUs.
+============================================================================*/
+#if (FXAA_PC_CONSOLE == 1)
+/*--------------------------------------------------------------------------*/
+FxaaFloat4 FxaaPixelShader(
+ // See FXAA Quality FxaaPixelShader() source for docs on Inputs!
+ FxaaFloat2 pos,
+ FxaaFloat4 fxaaConsolePosPos,
+ FxaaTex tex,
+ FxaaTex fxaaConsole360TexExpBiasNegOne,
+ FxaaTex fxaaConsole360TexExpBiasNegTwo,
+ FxaaFloat2 fxaaQualityRcpFrame,
+ FxaaFloat4 fxaaConsoleRcpFrameOpt,
+ FxaaFloat4 fxaaConsoleRcpFrameOpt2,
+ FxaaFloat4 fxaaConsole360RcpFrameOpt2,
+ FxaaFloat fxaaQualitySubpix,
+ FxaaFloat fxaaQualityEdgeThreshold,
+ FxaaFloat fxaaQualityEdgeThresholdMin,
+ FxaaFloat fxaaConsoleEdgeSharpness,
+ FxaaFloat fxaaConsoleEdgeThreshold,
+ FxaaFloat fxaaConsoleEdgeThresholdMin,
+ FxaaFloat4 fxaaConsole360ConstDir
+) {
+/*--------------------------------------------------------------------------*/
+ FxaaFloat lumaNw = FxaaLuma(FxaaTexTop(tex, fxaaConsolePosPos.xy));
+ FxaaFloat lumaSw = FxaaLuma(FxaaTexTop(tex, fxaaConsolePosPos.xw));
+ FxaaFloat lumaNe = FxaaLuma(FxaaTexTop(tex, fxaaConsolePosPos.zy));
+ FxaaFloat lumaSe = FxaaLuma(FxaaTexTop(tex, fxaaConsolePosPos.zw));
+/*--------------------------------------------------------------------------*/
+ FxaaFloat4 rgbyM = FxaaTexTop(tex, pos.xy);
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ FxaaFloat lumaM = rgbyM.w;
+ #else
+ FxaaFloat lumaM = rgbyM.y;
+ #endif
+/*--------------------------------------------------------------------------*/
+ FxaaFloat lumaMaxNwSw = max(lumaNw, lumaSw);
+ lumaNe += 1.0/384.0;
+ FxaaFloat lumaMinNwSw = min(lumaNw, lumaSw);
+/*--------------------------------------------------------------------------*/
+ FxaaFloat lumaMaxNeSe = max(lumaNe, lumaSe);
+ FxaaFloat lumaMinNeSe = min(lumaNe, lumaSe);
+/*--------------------------------------------------------------------------*/
+ FxaaFloat lumaMax = max(lumaMaxNeSe, lumaMaxNwSw);
+ FxaaFloat lumaMin = min(lumaMinNeSe, lumaMinNwSw);
+/*--------------------------------------------------------------------------*/
+ FxaaFloat lumaMaxScaled = lumaMax * fxaaConsoleEdgeThreshold;
+/*--------------------------------------------------------------------------*/
+ FxaaFloat lumaMinM = min(lumaMin, lumaM);
+ FxaaFloat lumaMaxScaledClamped = max(fxaaConsoleEdgeThresholdMin, lumaMaxScaled);
+ FxaaFloat lumaMaxM = max(lumaMax, lumaM);
+ FxaaFloat dirSwMinusNe = lumaSw - lumaNe;
+ FxaaFloat lumaMaxSubMinM = lumaMaxM - lumaMinM;
+ FxaaFloat dirSeMinusNw = lumaSe - lumaNw;
+ if(lumaMaxSubMinM < lumaMaxScaledClamped) return rgbyM;
+/*--------------------------------------------------------------------------*/
+ FxaaFloat2 dir;
+ dir.x = dirSwMinusNe + dirSeMinusNw;
+ dir.y = dirSwMinusNe - dirSeMinusNw;
+/*--------------------------------------------------------------------------*/
+ FxaaFloat2 dir1 = normalize(dir.xy);
+ FxaaFloat4 rgbyN1 = FxaaTexTop(tex, pos.xy - dir1 * fxaaConsoleRcpFrameOpt.zw);
+ FxaaFloat4 rgbyP1 = FxaaTexTop(tex, pos.xy + dir1 * fxaaConsoleRcpFrameOpt.zw);
+/*--------------------------------------------------------------------------*/
+ FxaaFloat dirAbsMinTimesC = min(abs(dir1.x), abs(dir1.y)) * fxaaConsoleEdgeSharpness;
+ FxaaFloat2 dir2 = clamp(dir1.xy / dirAbsMinTimesC, -2.0, 2.0);
+/*--------------------------------------------------------------------------*/
+ FxaaFloat4 rgbyN2 = FxaaTexTop(tex, pos.xy - dir2 * fxaaConsoleRcpFrameOpt2.zw);
+ FxaaFloat4 rgbyP2 = FxaaTexTop(tex, pos.xy + dir2 * fxaaConsoleRcpFrameOpt2.zw);
+/*--------------------------------------------------------------------------*/
+ FxaaFloat4 rgbyA = rgbyN1 + rgbyP1;
+ FxaaFloat4 rgbyB = ((rgbyN2 + rgbyP2) * 0.25) + (rgbyA * 0.25);
+/*--------------------------------------------------------------------------*/
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ FxaaBool twoTap = (rgbyB.w < lumaMin) || (rgbyB.w > lumaMax);
+ #else
+ FxaaBool twoTap = (rgbyB.y < lumaMin) || (rgbyB.y > lumaMax);
+ #endif
+ if(twoTap) rgbyB.xyz = rgbyA.xyz * 0.5;
+ return rgbyB; }
+/*==========================================================================*/
+#endif
+
+
+
+/*============================================================================
+
+ FXAA3 CONSOLE - 360 PIXEL SHADER
+
+------------------------------------------------------------------------------
+This optimized version thanks to suggestions from Andy Luedke.
+Should be fully tex bound in all cases.
+As of the FXAA 3.11 release, I have still not tested this code,
+however I fixed a bug which was in both FXAA 3.9 and FXAA 3.10.
+And note this is replacing the old unoptimized version.
+If it does not work, please let me know so I can fix it.
+============================================================================*/
+#if (FXAA_360 == 1)
+/*--------------------------------------------------------------------------*/
+[reduceTempRegUsage(4)]
+float4 FxaaPixelShader(
+ // See FXAA Quality FxaaPixelShader() source for docs on Inputs!
+ FxaaFloat2 pos,
+ FxaaFloat4 fxaaConsolePosPos,
+ FxaaTex tex,
+ FxaaTex fxaaConsole360TexExpBiasNegOne,
+ FxaaTex fxaaConsole360TexExpBiasNegTwo,
+ FxaaFloat2 fxaaQualityRcpFrame,
+ FxaaFloat4 fxaaConsoleRcpFrameOpt,
+ FxaaFloat4 fxaaConsoleRcpFrameOpt2,
+ FxaaFloat4 fxaaConsole360RcpFrameOpt2,
+ FxaaFloat fxaaQualitySubpix,
+ FxaaFloat fxaaQualityEdgeThreshold,
+ FxaaFloat fxaaQualityEdgeThresholdMin,
+ FxaaFloat fxaaConsoleEdgeSharpness,
+ FxaaFloat fxaaConsoleEdgeThreshold,
+ FxaaFloat fxaaConsoleEdgeThresholdMin,
+ FxaaFloat4 fxaaConsole360ConstDir
+) {
+/*--------------------------------------------------------------------------*/
+ float4 lumaNwNeSwSe;
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ asm {
+ tfetch2D lumaNwNeSwSe.w___, tex, pos.xy, OffsetX = -0.5, OffsetY = -0.5, UseComputedLOD=false
+ tfetch2D lumaNwNeSwSe._w__, tex, pos.xy, OffsetX = 0.5, OffsetY = -0.5, UseComputedLOD=false
+ tfetch2D lumaNwNeSwSe.__w_, tex, pos.xy, OffsetX = -0.5, OffsetY = 0.5, UseComputedLOD=false
+ tfetch2D lumaNwNeSwSe.___w, tex, pos.xy, OffsetX = 0.5, OffsetY = 0.5, UseComputedLOD=false
+ };
+ #else
+ asm {
+ tfetch2D lumaNwNeSwSe.y___, tex, pos.xy, OffsetX = -0.5, OffsetY = -0.5, UseComputedLOD=false
+ tfetch2D lumaNwNeSwSe._y__, tex, pos.xy, OffsetX = 0.5, OffsetY = -0.5, UseComputedLOD=false
+ tfetch2D lumaNwNeSwSe.__y_, tex, pos.xy, OffsetX = -0.5, OffsetY = 0.5, UseComputedLOD=false
+ tfetch2D lumaNwNeSwSe.___y, tex, pos.xy, OffsetX = 0.5, OffsetY = 0.5, UseComputedLOD=false
+ };
+ #endif
+/*--------------------------------------------------------------------------*/
+ lumaNwNeSwSe.y += 1.0/384.0;
+ float2 lumaMinTemp = min(lumaNwNeSwSe.xy, lumaNwNeSwSe.zw);
+ float2 lumaMaxTemp = max(lumaNwNeSwSe.xy, lumaNwNeSwSe.zw);
+ float lumaMin = min(lumaMinTemp.x, lumaMinTemp.y);
+ float lumaMax = max(lumaMaxTemp.x, lumaMaxTemp.y);
+/*--------------------------------------------------------------------------*/
+ float4 rgbyM = tex2Dlod(tex, float4(pos.xy, 0.0, 0.0));
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ float lumaMinM = min(lumaMin, rgbyM.w);
+ float lumaMaxM = max(lumaMax, rgbyM.w);
+ #else
+ float lumaMinM = min(lumaMin, rgbyM.y);
+ float lumaMaxM = max(lumaMax, rgbyM.y);
+ #endif
+ if((lumaMaxM - lumaMinM) < max(fxaaConsoleEdgeThresholdMin, lumaMax * fxaaConsoleEdgeThreshold)) return rgbyM;
+/*--------------------------------------------------------------------------*/
+ float2 dir;
+ dir.x = dot(lumaNwNeSwSe, fxaaConsole360ConstDir.yyxx);
+ dir.y = dot(lumaNwNeSwSe, fxaaConsole360ConstDir.xyxy);
+ dir = normalize(dir);
+/*--------------------------------------------------------------------------*/
+ float4 dir1 = dir.xyxy * fxaaConsoleRcpFrameOpt.xyzw;
+/*--------------------------------------------------------------------------*/
+ float4 dir2;
+ float dirAbsMinTimesC = min(abs(dir.x), abs(dir.y)) * fxaaConsoleEdgeSharpness;
+ dir2 = saturate(fxaaConsole360ConstDir.zzww * dir.xyxy / dirAbsMinTimesC + 0.5);
+ dir2 = dir2 * fxaaConsole360RcpFrameOpt2.xyxy + fxaaConsole360RcpFrameOpt2.zwzw;
+/*--------------------------------------------------------------------------*/
+ float4 rgbyN1 = tex2Dlod(fxaaConsole360TexExpBiasNegOne, float4(pos.xy + dir1.xy, 0.0, 0.0));
+ float4 rgbyP1 = tex2Dlod(fxaaConsole360TexExpBiasNegOne, float4(pos.xy + dir1.zw, 0.0, 0.0));
+ float4 rgbyN2 = tex2Dlod(fxaaConsole360TexExpBiasNegTwo, float4(pos.xy + dir2.xy, 0.0, 0.0));
+ float4 rgbyP2 = tex2Dlod(fxaaConsole360TexExpBiasNegTwo, float4(pos.xy + dir2.zw, 0.0, 0.0));
+/*--------------------------------------------------------------------------*/
+ float4 rgbyA = rgbyN1 + rgbyP1;
+ float4 rgbyB = rgbyN2 + rgbyP2 * 0.5 + rgbyA;
+/*--------------------------------------------------------------------------*/
+ float4 rgbyR = ((rgbyB.w - lumaMax) > 0.0) ? rgbyA : rgbyB;
+ rgbyR = ((rgbyB.w - lumaMin) > 0.0) ? rgbyR : rgbyA;
+ return rgbyR; }
+/*==========================================================================*/
+#endif
+
+
+
+/*============================================================================
+
+ FXAA3 CONSOLE - OPTIMIZED PS3 PIXEL SHADER (NO EARLY EXIT)
+
+==============================================================================
+The code below does not exactly match the assembly.
+I have a feeling that 12 cycles is possible, but was not able to get there.
+Might have to increase register count to get full performance.
+Note this shader does not use perspective interpolation.
+
+Use the following cgc options,
+
+ --fenable-bx2 --fastmath --fastprecision --nofloatbindings
+
+------------------------------------------------------------------------------
+ NVSHADERPERF OUTPUT
+------------------------------------------------------------------------------
+For reference and to aid in debug, output of NVShaderPerf should match this,
+
+Shader to schedule:
+ 0: texpkb h0.w(TRUE), v5.zyxx, #0
+ 2: addh h2.z(TRUE), h0.w, constant(0.001953, 0.000000, 0.000000, 0.000000).x
+ 4: texpkb h0.w(TRUE), v5.xwxx, #0
+ 6: addh h0.z(TRUE), -h2, h0.w
+ 7: texpkb h1.w(TRUE), v5, #0
+ 9: addh h0.x(TRUE), h0.z, -h1.w
+ 10: addh h3.w(TRUE), h0.z, h1
+ 11: texpkb h2.w(TRUE), v5.zwzz, #0
+ 13: addh h0.z(TRUE), h3.w, -h2.w
+ 14: addh h0.x(TRUE), h2.w, h0
+ 15: nrmh h1.xz(TRUE), h0_n
+ 16: minh_m8 h0.x(TRUE), |h1|, |h1.z|
+ 17: maxh h4.w(TRUE), h0, h1
+ 18: divx h2.xy(TRUE), h1_n.xzzw, h0_n
+ 19: movr r1.zw(TRUE), v4.xxxy
+ 20: madr r2.xz(TRUE), -h1, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w).zzww, r1.zzww
+ 22: minh h5.w(TRUE), h0, h1
+ 23: texpkb h0(TRUE), r2.xzxx, #0
+ 25: madr r0.zw(TRUE), h1.xzxz, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w), r1
+ 27: maxh h4.x(TRUE), h2.z, h2.w
+ 28: texpkb h1(TRUE), r0.zwzz, #0
+ 30: addh_d2 h1(TRUE), h0, h1
+ 31: madr r0.xy(TRUE), -h2, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w).xyxx, r1.zwzz
+ 33: texpkb h0(TRUE), r0, #0
+ 35: minh h4.z(TRUE), h2, h2.w
+ 36: fenct TRUE
+ 37: madr r1.xy(TRUE), h2, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w).xyxx, r1.zwzz
+ 39: texpkb h2(TRUE), r1, #0
+ 41: addh_d2 h0(TRUE), h0, h2
+ 42: maxh h2.w(TRUE), h4, h4.x
+ 43: minh h2.x(TRUE), h5.w, h4.z
+ 44: addh_d2 h0(TRUE), h0, h1
+ 45: slth h2.x(TRUE), h0.w, h2
+ 46: sgth h2.w(TRUE), h0, h2
+ 47: movh h0(TRUE), h0
+ 48: addx.c0 rc(TRUE), h2, h2.w
+ 49: movh h0(c0.NE.x), h1
+
+IPU0 ------ Simplified schedule: --------
+Pass | Unit | uOp | PC: Op
+-----+--------+------+-------------------------
+ 1 | SCT0/1 | mov | 0: TXLr h0.w, g[TEX1].zyxx, const.xxxx, TEX0;
+ | TEX | txl | 0: TXLr h0.w, g[TEX1].zyxx, const.xxxx, TEX0;
+ | SCB1 | add | 2: ADDh h2.z, h0.--w-, const.--x-;
+ | | |
+ 2 | SCT0/1 | mov | 4: TXLr h0.w, g[TEX1].xwxx, const.xxxx, TEX0;
+ | TEX | txl | 4: TXLr h0.w, g[TEX1].xwxx, const.xxxx, TEX0;
+ | SCB1 | add | 6: ADDh h0.z,-h2, h0.--w-;
+ | | |
+ 3 | SCT0/1 | mov | 7: TXLr h1.w, g[TEX1], const.xxxx, TEX0;
+ | TEX | txl | 7: TXLr h1.w, g[TEX1], const.xxxx, TEX0;
+ | SCB0 | add | 9: ADDh h0.x, h0.z---,-h1.w---;
+ | SCB1 | add | 10: ADDh h3.w, h0.---z, h1;
+ | | |
+ 4 | SCT0/1 | mov | 11: TXLr h2.w, g[TEX1].zwzz, const.xxxx, TEX0;
+ | TEX | txl | 11: TXLr h2.w, g[TEX1].zwzz, const.xxxx, TEX0;
+ | SCB0 | add | 14: ADDh h0.x, h2.w---, h0;
+ | SCB1 | add | 13: ADDh h0.z, h3.--w-,-h2.--w-;
+ | | |
+ 5 | SCT1 | mov | 15: NRMh h1.xz, h0;
+ | SRB | nrm | 15: NRMh h1.xz, h0;
+ | SCB0 | min | 16: MINh*8 h0.x, |h1|, |h1.z---|;
+ | SCB1 | max | 17: MAXh h4.w, h0, h1;
+ | | |
+ 6 | SCT0 | div | 18: DIVx h2.xy, h1.xz--, h0;
+ | SCT1 | mov | 19: MOVr r1.zw, g[TEX0].--xy;
+ | SCB0 | mad | 20: MADr r2.xz,-h1, const.z-w-, r1.z-w-;
+ | SCB1 | min | 22: MINh h5.w, h0, h1;
+ | | |
+ 7 | SCT0/1 | mov | 23: TXLr h0, r2.xzxx, const.xxxx, TEX0;
+ | TEX | txl | 23: TXLr h0, r2.xzxx, const.xxxx, TEX0;
+ | SCB0 | max | 27: MAXh h4.x, h2.z---, h2.w---;
+ | SCB1 | mad | 25: MADr r0.zw, h1.--xz, const, r1;
+ | | |
+ 8 | SCT0/1 | mov | 28: TXLr h1, r0.zwzz, const.xxxx, TEX0;
+ | TEX | txl | 28: TXLr h1, r0.zwzz, const.xxxx, TEX0;
+ | SCB0/1 | add | 30: ADDh/2 h1, h0, h1;
+ | | |
+ 9 | SCT0 | mad | 31: MADr r0.xy,-h2, const.xy--, r1.zw--;
+ | SCT1 | mov | 33: TXLr h0, r0, const.zzzz, TEX0;
+ | TEX | txl | 33: TXLr h0, r0, const.zzzz, TEX0;
+ | SCB1 | min | 35: MINh h4.z, h2, h2.--w-;
+ | | |
+ 10 | SCT0 | mad | 37: MADr r1.xy, h2, const.xy--, r1.zw--;
+ | SCT1 | mov | 39: TXLr h2, r1, const.zzzz, TEX0;
+ | TEX | txl | 39: TXLr h2, r1, const.zzzz, TEX0;
+ | SCB0/1 | add | 41: ADDh/2 h0, h0, h2;
+ | | |
+ 11 | SCT0 | min | 43: MINh h2.x, h5.w---, h4.z---;
+ | SCT1 | max | 42: MAXh h2.w, h4, h4.---x;
+ | SCB0/1 | add | 44: ADDh/2 h0, h0, h1;
+ | | |
+ 12 | SCT0 | set | 45: SLTh h2.x, h0.w---, h2;
+ | SCT1 | set | 46: SGTh h2.w, h0, h2;
+ | SCB0/1 | mul | 47: MOVh h0, h0;
+ | | |
+ 13 | SCT0 | mad | 48: ADDxc0_s rc, h2, h2.w---;
+ | SCB0/1 | mul | 49: MOVh h0(NE0.xxxx), h1;
+
+Pass SCT TEX SCB
+ 1: 0% 100% 25%
+ 2: 0% 100% 25%
+ 3: 0% 100% 50%
+ 4: 0% 100% 50%
+ 5: 0% 0% 50%
+ 6: 100% 0% 75%
+ 7: 0% 100% 75%
+ 8: 0% 100% 100%
+ 9: 0% 100% 25%
+ 10: 0% 100% 100%
+ 11: 50% 0% 100%
+ 12: 50% 0% 100%
+ 13: 25% 0% 100%
+
+MEAN: 17% 61% 67%
+
+Pass SCT0 SCT1 TEX SCB0 SCB1
+ 1: 0% 0% 100% 0% 100%
+ 2: 0% 0% 100% 0% 100%
+ 3: 0% 0% 100% 100% 100%
+ 4: 0% 0% 100% 100% 100%
+ 5: 0% 0% 0% 100% 100%
+ 6: 100% 100% 0% 100% 100%
+ 7: 0% 0% 100% 100% 100%
+ 8: 0% 0% 100% 100% 100%
+ 9: 0% 0% 100% 0% 100%
+ 10: 0% 0% 100% 100% 100%
+ 11: 100% 100% 0% 100% 100%
+ 12: 100% 100% 0% 100% 100%
+ 13: 100% 0% 0% 100% 100%
+
+MEAN: 30% 23% 61% 76% 100%
+Fragment Performance Setup: Driver RSX Compiler, GPU RSX, Flags 0x5
+Results 13 cycles, 3 r regs, 923,076,923 pixels/s
+============================================================================*/
+#if (FXAA_PS3 == 1) && (FXAA_EARLY_EXIT == 0)
+/*--------------------------------------------------------------------------*/
+#pragma regcount 7
+#pragma disablepc all
+#pragma option O3
+#pragma option OutColorPrec=fp16
+#pragma texformat default RGBA8
+/*==========================================================================*/
+half4 FxaaPixelShader(
+ // See FXAA Quality FxaaPixelShader() source for docs on Inputs!
+ FxaaFloat2 pos,
+ FxaaFloat4 fxaaConsolePosPos,
+ FxaaTex tex,
+ FxaaTex fxaaConsole360TexExpBiasNegOne,
+ FxaaTex fxaaConsole360TexExpBiasNegTwo,
+ FxaaFloat2 fxaaQualityRcpFrame,
+ FxaaFloat4 fxaaConsoleRcpFrameOpt,
+ FxaaFloat4 fxaaConsoleRcpFrameOpt2,
+ FxaaFloat4 fxaaConsole360RcpFrameOpt2,
+ FxaaFloat fxaaQualitySubpix,
+ FxaaFloat fxaaQualityEdgeThreshold,
+ FxaaFloat fxaaQualityEdgeThresholdMin,
+ FxaaFloat fxaaConsoleEdgeSharpness,
+ FxaaFloat fxaaConsoleEdgeThreshold,
+ FxaaFloat fxaaConsoleEdgeThresholdMin,
+ FxaaFloat4 fxaaConsole360ConstDir
+) {
+/*--------------------------------------------------------------------------*/
+// (1)
+ half4 dir;
+ half4 lumaNe = h4tex2Dlod(tex, half4(fxaaConsolePosPos.zy, 0, 0));
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ lumaNe.w += half(1.0/512.0);
+ dir.x = -lumaNe.w;
+ dir.z = -lumaNe.w;
+ #else
+ lumaNe.y += half(1.0/512.0);
+ dir.x = -lumaNe.y;
+ dir.z = -lumaNe.y;
+ #endif
+/*--------------------------------------------------------------------------*/
+// (2)
+ half4 lumaSw = h4tex2Dlod(tex, half4(fxaaConsolePosPos.xw, 0, 0));
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ dir.x += lumaSw.w;
+ dir.z += lumaSw.w;
+ #else
+ dir.x += lumaSw.y;
+ dir.z += lumaSw.y;
+ #endif
+/*--------------------------------------------------------------------------*/
+// (3)
+ half4 lumaNw = h4tex2Dlod(tex, half4(fxaaConsolePosPos.xy, 0, 0));
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ dir.x -= lumaNw.w;
+ dir.z += lumaNw.w;
+ #else
+ dir.x -= lumaNw.y;
+ dir.z += lumaNw.y;
+ #endif
+/*--------------------------------------------------------------------------*/
+// (4)
+ half4 lumaSe = h4tex2Dlod(tex, half4(fxaaConsolePosPos.zw, 0, 0));
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ dir.x += lumaSe.w;
+ dir.z -= lumaSe.w;
+ #else
+ dir.x += lumaSe.y;
+ dir.z -= lumaSe.y;
+ #endif
+/*--------------------------------------------------------------------------*/
+// (5)
+ half4 dir1_pos;
+ dir1_pos.xy = normalize(dir.xyz).xz;
+ half dirAbsMinTimesC = min(abs(dir1_pos.x), abs(dir1_pos.y)) * half(FXAA_CONSOLE__PS3_EDGE_SHARPNESS);
+/*--------------------------------------------------------------------------*/
+// (6)
+ half4 dir2_pos;
+ dir2_pos.xy = clamp(dir1_pos.xy / dirAbsMinTimesC, half(-2.0), half(2.0));
+ dir1_pos.zw = pos.xy;
+ dir2_pos.zw = pos.xy;
+ half4 temp1N;
+ temp1N.xy = dir1_pos.zw - dir1_pos.xy * fxaaConsoleRcpFrameOpt.zw;
+/*--------------------------------------------------------------------------*/
+// (7)
+ temp1N = h4tex2Dlod(tex, half4(temp1N.xy, 0.0, 0.0));
+ half4 rgby1;
+ rgby1.xy = dir1_pos.zw + dir1_pos.xy * fxaaConsoleRcpFrameOpt.zw;
+/*--------------------------------------------------------------------------*/
+// (8)
+ rgby1 = h4tex2Dlod(tex, half4(rgby1.xy, 0.0, 0.0));
+ rgby1 = (temp1N + rgby1) * 0.5;
+/*--------------------------------------------------------------------------*/
+// (9)
+ half4 temp2N;
+ temp2N.xy = dir2_pos.zw - dir2_pos.xy * fxaaConsoleRcpFrameOpt2.zw;
+ temp2N = h4tex2Dlod(tex, half4(temp2N.xy, 0.0, 0.0));
+/*--------------------------------------------------------------------------*/
+// (10)
+ half4 rgby2;
+ rgby2.xy = dir2_pos.zw + dir2_pos.xy * fxaaConsoleRcpFrameOpt2.zw;
+ rgby2 = h4tex2Dlod(tex, half4(rgby2.xy, 0.0, 0.0));
+ rgby2 = (temp2N + rgby2) * 0.5;
+/*--------------------------------------------------------------------------*/
+// (11)
+ // compilier moves these scalar ops up to other cycles
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ half lumaMin = min(min(lumaNw.w, lumaSw.w), min(lumaNe.w, lumaSe.w));
+ half lumaMax = max(max(lumaNw.w, lumaSw.w), max(lumaNe.w, lumaSe.w));
+ #else
+ half lumaMin = min(min(lumaNw.y, lumaSw.y), min(lumaNe.y, lumaSe.y));
+ half lumaMax = max(max(lumaNw.y, lumaSw.y), max(lumaNe.y, lumaSe.y));
+ #endif
+ rgby2 = (rgby2 + rgby1) * 0.5;
+/*--------------------------------------------------------------------------*/
+// (12)
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ bool twoTapLt = rgby2.w < lumaMin;
+ bool twoTapGt = rgby2.w > lumaMax;
+ #else
+ bool twoTapLt = rgby2.y < lumaMin;
+ bool twoTapGt = rgby2.y > lumaMax;
+ #endif
+/*--------------------------------------------------------------------------*/
+// (13)
+ if(twoTapLt || twoTapGt) rgby2 = rgby1;
+/*--------------------------------------------------------------------------*/
+ return rgby2; }
+/*==========================================================================*/
+#endif
+
+
+
+/*============================================================================
+
+ FXAA3 CONSOLE - OPTIMIZED PS3 PIXEL SHADER (WITH EARLY EXIT)
+
+==============================================================================
+The code mostly matches the assembly.
+I have a feeling that 14 cycles is possible, but was not able to get there.
+Might have to increase register count to get full performance.
+Note this shader does not use perspective interpolation.
+
+Use the following cgc options,
+
+ --fenable-bx2 --fastmath --fastprecision --nofloatbindings
+
+Use of FXAA_GREEN_AS_LUMA currently adds a cycle (16 clks).
+Will look at fixing this for FXAA 3.12.
+------------------------------------------------------------------------------
+ NVSHADERPERF OUTPUT
+------------------------------------------------------------------------------
+For reference and to aid in debug, output of NVShaderPerf should match this,
+
+Shader to schedule:
+ 0: texpkb h0.w(TRUE), v5.zyxx, #0
+ 2: addh h2.y(TRUE), h0.w, constant(0.001953, 0.000000, 0.000000, 0.000000).x
+ 4: texpkb h1.w(TRUE), v5.xwxx, #0
+ 6: addh h0.x(TRUE), h1.w, -h2.y
+ 7: texpkb h2.w(TRUE), v5.zwzz, #0
+ 9: minh h4.w(TRUE), h2.y, h2
+ 10: maxh h5.x(TRUE), h2.y, h2.w
+ 11: texpkb h0.w(TRUE), v5, #0
+ 13: addh h3.w(TRUE), -h0, h0.x
+ 14: addh h0.x(TRUE), h0.w, h0
+ 15: addh h0.z(TRUE), -h2.w, h0.x
+ 16: addh h0.x(TRUE), h2.w, h3.w
+ 17: minh h5.y(TRUE), h0.w, h1.w
+ 18: nrmh h2.xz(TRUE), h0_n
+ 19: minh_m8 h2.w(TRUE), |h2.x|, |h2.z|
+ 20: divx h4.xy(TRUE), h2_n.xzzw, h2_n.w
+ 21: movr r1.zw(TRUE), v4.xxxy
+ 22: maxh h2.w(TRUE), h0, h1
+ 23: fenct TRUE
+ 24: madr r0.xy(TRUE), -h2.xzzw, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w).zwzz, r1.zwzz
+ 26: texpkb h0(TRUE), r0, #0
+ 28: maxh h5.x(TRUE), h2.w, h5
+ 29: minh h5.w(TRUE), h5.y, h4
+ 30: madr r1.xy(TRUE), h2.xzzw, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w).zwzz, r1.zwzz
+ 32: texpkb h2(TRUE), r1, #0
+ 34: addh_d2 h2(TRUE), h0, h2
+ 35: texpkb h1(TRUE), v4, #0
+ 37: maxh h5.y(TRUE), h5.x, h1.w
+ 38: minh h4.w(TRUE), h1, h5
+ 39: madr r0.xy(TRUE), -h4, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w).xyxx, r1.zwzz
+ 41: texpkb h0(TRUE), r0, #0
+ 43: addh_m8 h5.z(TRUE), h5.y, -h4.w
+ 44: madr r2.xy(TRUE), h4, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w).xyxx, r1.zwzz
+ 46: texpkb h3(TRUE), r2, #0
+ 48: addh_d2 h0(TRUE), h0, h3
+ 49: addh_d2 h3(TRUE), h0, h2
+ 50: movh h0(TRUE), h3
+ 51: slth h3.x(TRUE), h3.w, h5.w
+ 52: sgth h3.w(TRUE), h3, h5.x
+ 53: addx.c0 rc(TRUE), h3.x, h3
+ 54: slth.c0 rc(TRUE), h5.z, h5
+ 55: movh h0(c0.NE.w), h2
+ 56: movh h0(c0.NE.x), h1
+
+IPU0 ------ Simplified schedule: --------
+Pass | Unit | uOp | PC: Op
+-----+--------+------+-------------------------
+ 1 | SCT0/1 | mov | 0: TXLr h0.w, g[TEX1].zyxx, const.xxxx, TEX0;
+ | TEX | txl | 0: TXLr h0.w, g[TEX1].zyxx, const.xxxx, TEX0;
+ | SCB0 | add | 2: ADDh h2.y, h0.-w--, const.-x--;
+ | | |
+ 2 | SCT0/1 | mov | 4: TXLr h1.w, g[TEX1].xwxx, const.xxxx, TEX0;
+ | TEX | txl | 4: TXLr h1.w, g[TEX1].xwxx, const.xxxx, TEX0;
+ | SCB0 | add | 6: ADDh h0.x, h1.w---,-h2.y---;
+ | | |
+ 3 | SCT0/1 | mov | 7: TXLr h2.w, g[TEX1].zwzz, const.xxxx, TEX0;
+ | TEX | txl | 7: TXLr h2.w, g[TEX1].zwzz, const.xxxx, TEX0;
+ | SCB0 | max | 10: MAXh h5.x, h2.y---, h2.w---;
+ | SCB1 | min | 9: MINh h4.w, h2.---y, h2;
+ | | |
+ 4 | SCT0/1 | mov | 11: TXLr h0.w, g[TEX1], const.xxxx, TEX0;
+ | TEX | txl | 11: TXLr h0.w, g[TEX1], const.xxxx, TEX0;
+ | SCB0 | add | 14: ADDh h0.x, h0.w---, h0;
+ | SCB1 | add | 13: ADDh h3.w,-h0, h0.---x;
+ | | |
+ 5 | SCT0 | mad | 16: ADDh h0.x, h2.w---, h3.w---;
+ | SCT1 | mad | 15: ADDh h0.z,-h2.--w-, h0.--x-;
+ | SCB0 | min | 17: MINh h5.y, h0.-w--, h1.-w--;
+ | | |
+ 6 | SCT1 | mov | 18: NRMh h2.xz, h0;
+ | SRB | nrm | 18: NRMh h2.xz, h0;
+ | SCB1 | min | 19: MINh*8 h2.w, |h2.---x|, |h2.---z|;
+ | | |
+ 7 | SCT0 | div | 20: DIVx h4.xy, h2.xz--, h2.ww--;
+ | SCT1 | mov | 21: MOVr r1.zw, g[TEX0].--xy;
+ | SCB1 | max | 22: MAXh h2.w, h0, h1;
+ | | |
+ 8 | SCT0 | mad | 24: MADr r0.xy,-h2.xz--, const.zw--, r1.zw--;
+ | SCT1 | mov | 26: TXLr h0, r0, const.xxxx, TEX0;
+ | TEX | txl | 26: TXLr h0, r0, const.xxxx, TEX0;
+ | SCB0 | max | 28: MAXh h5.x, h2.w---, h5;
+ | SCB1 | min | 29: MINh h5.w, h5.---y, h4;
+ | | |
+ 9 | SCT0 | mad | 30: MADr r1.xy, h2.xz--, const.zw--, r1.zw--;
+ | SCT1 | mov | 32: TXLr h2, r1, const.xxxx, TEX0;
+ | TEX | txl | 32: TXLr h2, r1, const.xxxx, TEX0;
+ | SCB0/1 | add | 34: ADDh/2 h2, h0, h2;
+ | | |
+ 10 | SCT0/1 | mov | 35: TXLr h1, g[TEX0], const.xxxx, TEX0;
+ | TEX | txl | 35: TXLr h1, g[TEX0], const.xxxx, TEX0;
+ | SCB0 | max | 37: MAXh h5.y, h5.-x--, h1.-w--;
+ | SCB1 | min | 38: MINh h4.w, h1, h5;
+ | | |
+ 11 | SCT0 | mad | 39: MADr r0.xy,-h4, const.xy--, r1.zw--;
+ | SCT1 | mov | 41: TXLr h0, r0, const.zzzz, TEX0;
+ | TEX | txl | 41: TXLr h0, r0, const.zzzz, TEX0;
+ | SCB0 | mad | 44: MADr r2.xy, h4, const.xy--, r1.zw--;
+ | SCB1 | add | 43: ADDh*8 h5.z, h5.--y-,-h4.--w-;
+ | | |
+ 12 | SCT0/1 | mov | 46: TXLr h3, r2, const.xxxx, TEX0;
+ | TEX | txl | 46: TXLr h3, r2, const.xxxx, TEX0;
+ | SCB0/1 | add | 48: ADDh/2 h0, h0, h3;
+ | | |
+ 13 | SCT0/1 | mad | 49: ADDh/2 h3, h0, h2;
+ | SCB0/1 | mul | 50: MOVh h0, h3;
+ | | |
+ 14 | SCT0 | set | 51: SLTh h3.x, h3.w---, h5.w---;
+ | SCT1 | set | 52: SGTh h3.w, h3, h5.---x;
+ | SCB0 | set | 54: SLThc0 rc, h5.z---, h5;
+ | SCB1 | add | 53: ADDxc0_s rc, h3.---x, h3;
+ | | |
+ 15 | SCT0/1 | mul | 55: MOVh h0(NE0.wwww), h2;
+ | SCB0/1 | mul | 56: MOVh h0(NE0.xxxx), h1;
+
+Pass SCT TEX SCB
+ 1: 0% 100% 25%
+ 2: 0% 100% 25%
+ 3: 0% 100% 50%
+ 4: 0% 100% 50%
+ 5: 50% 0% 25%
+ 6: 0% 0% 25%
+ 7: 100% 0% 25%
+ 8: 0% 100% 50%
+ 9: 0% 100% 100%
+ 10: 0% 100% 50%
+ 11: 0% 100% 75%
+ 12: 0% 100% 100%
+ 13: 100% 0% 100%
+ 14: 50% 0% 50%
+ 15: 100% 0% 100%
+
+MEAN: 26% 60% 56%
+
+Pass SCT0 SCT1 TEX SCB0 SCB1
+ 1: 0% 0% 100% 100% 0%
+ 2: 0% 0% 100% 100% 0%
+ 3: 0% 0% 100% 100% 100%
+ 4: 0% 0% 100% 100% 100%
+ 5: 100% 100% 0% 100% 0%
+ 6: 0% 0% 0% 0% 100%
+ 7: 100% 100% 0% 0% 100%
+ 8: 0% 0% 100% 100% 100%
+ 9: 0% 0% 100% 100% 100%
+ 10: 0% 0% 100% 100% 100%
+ 11: 0% 0% 100% 100% 100%
+ 12: 0% 0% 100% 100% 100%
+ 13: 100% 100% 0% 100% 100%
+ 14: 100% 100% 0% 100% 100%
+ 15: 100% 100% 0% 100% 100%
+
+MEAN: 33% 33% 60% 86% 80%
+Fragment Performance Setup: Driver RSX Compiler, GPU RSX, Flags 0x5
+Results 15 cycles, 3 r regs, 800,000,000 pixels/s
+============================================================================*/
+#if (FXAA_PS3 == 1) && (FXAA_EARLY_EXIT == 1)
+/*--------------------------------------------------------------------------*/
+#pragma regcount 7
+#pragma disablepc all
+#pragma option O2
+#pragma option OutColorPrec=fp16
+#pragma texformat default RGBA8
+/*==========================================================================*/
+half4 FxaaPixelShader(
+ // See FXAA Quality FxaaPixelShader() source for docs on Inputs!
+ FxaaFloat2 pos,
+ FxaaFloat4 fxaaConsolePosPos,
+ FxaaTex tex,
+ FxaaTex fxaaConsole360TexExpBiasNegOne,
+ FxaaTex fxaaConsole360TexExpBiasNegTwo,
+ FxaaFloat2 fxaaQualityRcpFrame,
+ FxaaFloat4 fxaaConsoleRcpFrameOpt,
+ FxaaFloat4 fxaaConsoleRcpFrameOpt2,
+ FxaaFloat4 fxaaConsole360RcpFrameOpt2,
+ FxaaFloat fxaaQualitySubpix,
+ FxaaFloat fxaaQualityEdgeThreshold,
+ FxaaFloat fxaaQualityEdgeThresholdMin,
+ FxaaFloat fxaaConsoleEdgeSharpness,
+ FxaaFloat fxaaConsoleEdgeThreshold,
+ FxaaFloat fxaaConsoleEdgeThresholdMin,
+ FxaaFloat4 fxaaConsole360ConstDir
+) {
+/*--------------------------------------------------------------------------*/
+// (1)
+ half4 rgbyNe = h4tex2Dlod(tex, half4(fxaaConsolePosPos.zy, 0, 0));
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ half lumaNe = rgbyNe.w + half(1.0/512.0);
+ #else
+ half lumaNe = rgbyNe.y + half(1.0/512.0);
+ #endif
+/*--------------------------------------------------------------------------*/
+// (2)
+ half4 lumaSw = h4tex2Dlod(tex, half4(fxaaConsolePosPos.xw, 0, 0));
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ half lumaSwNegNe = lumaSw.w - lumaNe;
+ #else
+ half lumaSwNegNe = lumaSw.y - lumaNe;
+ #endif
+/*--------------------------------------------------------------------------*/
+// (3)
+ half4 lumaNw = h4tex2Dlod(tex, half4(fxaaConsolePosPos.xy, 0, 0));
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ half lumaMaxNwSw = max(lumaNw.w, lumaSw.w);
+ half lumaMinNwSw = min(lumaNw.w, lumaSw.w);
+ #else
+ half lumaMaxNwSw = max(lumaNw.y, lumaSw.y);
+ half lumaMinNwSw = min(lumaNw.y, lumaSw.y);
+ #endif
+/*--------------------------------------------------------------------------*/
+// (4)
+ half4 lumaSe = h4tex2Dlod(tex, half4(fxaaConsolePosPos.zw, 0, 0));
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ half dirZ = lumaNw.w + lumaSwNegNe;
+ half dirX = -lumaNw.w + lumaSwNegNe;
+ #else
+ half dirZ = lumaNw.y + lumaSwNegNe;
+ half dirX = -lumaNw.y + lumaSwNegNe;
+ #endif
+/*--------------------------------------------------------------------------*/
+// (5)
+ half3 dir;
+ dir.y = 0.0;
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ dir.x = lumaSe.w + dirX;
+ dir.z = -lumaSe.w + dirZ;
+ half lumaMinNeSe = min(lumaNe, lumaSe.w);
+ #else
+ dir.x = lumaSe.y + dirX;
+ dir.z = -lumaSe.y + dirZ;
+ half lumaMinNeSe = min(lumaNe, lumaSe.y);
+ #endif
+/*--------------------------------------------------------------------------*/
+// (6)
+ half4 dir1_pos;
+ dir1_pos.xy = normalize(dir).xz;
+ half dirAbsMinTimes8 = min(abs(dir1_pos.x), abs(dir1_pos.y)) * half(FXAA_CONSOLE__PS3_EDGE_SHARPNESS);
+/*--------------------------------------------------------------------------*/
+// (7)
+ half4 dir2_pos;
+ dir2_pos.xy = clamp(dir1_pos.xy / dirAbsMinTimes8, half(-2.0), half(2.0));
+ dir1_pos.zw = pos.xy;
+ dir2_pos.zw = pos.xy;
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ half lumaMaxNeSe = max(lumaNe, lumaSe.w);
+ #else
+ half lumaMaxNeSe = max(lumaNe, lumaSe.y);
+ #endif
+/*--------------------------------------------------------------------------*/
+// (8)
+ half4 temp1N;
+ temp1N.xy = dir1_pos.zw - dir1_pos.xy * fxaaConsoleRcpFrameOpt.zw;
+ temp1N = h4tex2Dlod(tex, half4(temp1N.xy, 0.0, 0.0));
+ half lumaMax = max(lumaMaxNwSw, lumaMaxNeSe);
+ half lumaMin = min(lumaMinNwSw, lumaMinNeSe);
+/*--------------------------------------------------------------------------*/
+// (9)
+ half4 rgby1;
+ rgby1.xy = dir1_pos.zw + dir1_pos.xy * fxaaConsoleRcpFrameOpt.zw;
+ rgby1 = h4tex2Dlod(tex, half4(rgby1.xy, 0.0, 0.0));
+ rgby1 = (temp1N + rgby1) * 0.5;
+/*--------------------------------------------------------------------------*/
+// (10)
+ half4 rgbyM = h4tex2Dlod(tex, half4(pos.xy, 0.0, 0.0));
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ half lumaMaxM = max(lumaMax, rgbyM.w);
+ half lumaMinM = min(lumaMin, rgbyM.w);
+ #else
+ half lumaMaxM = max(lumaMax, rgbyM.y);
+ half lumaMinM = min(lumaMin, rgbyM.y);
+ #endif
+/*--------------------------------------------------------------------------*/
+// (11)
+ half4 temp2N;
+ temp2N.xy = dir2_pos.zw - dir2_pos.xy * fxaaConsoleRcpFrameOpt2.zw;
+ temp2N = h4tex2Dlod(tex, half4(temp2N.xy, 0.0, 0.0));
+ half4 rgby2;
+ rgby2.xy = dir2_pos.zw + dir2_pos.xy * fxaaConsoleRcpFrameOpt2.zw;
+ half lumaRangeM = (lumaMaxM - lumaMinM) / FXAA_CONSOLE__PS3_EDGE_THRESHOLD;
+/*--------------------------------------------------------------------------*/
+// (12)
+ rgby2 = h4tex2Dlod(tex, half4(rgby2.xy, 0.0, 0.0));
+ rgby2 = (temp2N + rgby2) * 0.5;
+/*--------------------------------------------------------------------------*/
+// (13)
+ rgby2 = (rgby2 + rgby1) * 0.5;
+/*--------------------------------------------------------------------------*/
+// (14)
+ #if (FXAA_GREEN_AS_LUMA == 0)
+ bool twoTapLt = rgby2.w < lumaMin;
+ bool twoTapGt = rgby2.w > lumaMax;
+ #else
+ bool twoTapLt = rgby2.y < lumaMin;
+ bool twoTapGt = rgby2.y > lumaMax;
+ #endif
+ bool earlyExit = lumaRangeM < lumaMax;
+ bool twoTap = twoTapLt || twoTapGt;
+/*--------------------------------------------------------------------------*/
+// (15)
+ if(twoTap) rgby2 = rgby1;
+ if(earlyExit) rgby2 = rgbyM;
+/*--------------------------------------------------------------------------*/
+ return rgby2; }
+/*==========================================================================*/
+#endif
+
+uniform sampler2D diffuseMap;
+
+uniform vec2 rcp_screen_res;
+uniform vec4 rcp_frame_opt;
+uniform vec4 rcp_frame_opt2;
+uniform vec2 screen_res;
+VARYING vec2 vary_fragcoord;
+VARYING vec2 vary_tc;
+
+void main()
+{
+ vec4 diff = FxaaPixelShader(vary_tc, //pos
+ vec4(vary_fragcoord.xy, 0, 0), //fxaaConsolePosPos
+ diffuseMap, //tex
+ diffuseMap,
+ diffuseMap,
+ rcp_screen_res, //fxaaQualityRcpFrame
+ vec4(0,0,0,0), //fxaaConsoleRcpFrameOpt
+ rcp_frame_opt, //fxaaConsoleRcpFrameOpt2
+ rcp_frame_opt2, //fxaaConsole360RcpFrameOpt2
+ 0.75, //fxaaQualitySubpix
+ 0.07, //fxaaQualityEdgeThreshold
+ 0.03, //fxaaQualityEdgeThresholdMin
+ 8.0, //fxaaConsoleEdgeSharpness
+ 0.125, //fxaaConsoleEdgeThreshold
+ 0.05, //fxaaConsoleEdgeThresholdMin
+ vec4(0,0,0,0)); //fxaaConsole360ConstDir
+
+
+
+ //diff = texture2D(diffuseMap, vary_tc);
+
+ frag_color = diff;
+
+}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/giF.glsl b/indra/newview/app_settings/shaders/class1/deferred/giF.glsl
index e64e29a0d2..da1b234240 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/giF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/giF.glsl
@@ -2,11 +2,35 @@
* @file giF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+
#extension GL_ARB_texture_rectangle : enable
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
uniform sampler2DRect depthMap;
uniform sampler2DRect normalMap;
uniform sampler2D noiseMap;
@@ -18,7 +42,7 @@ uniform sampler2D depthGIMap;
uniform sampler2D lightFunc;
// Inputs
-varying vec2 vary_fragcoord;
+VARYING vec2 vary_fragcoord;
uniform vec2 screen_res;
@@ -162,5 +186,5 @@ void main()
vec3 norm = texture2DRect(normalMap, pos_screen).xyz;
norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm
- gl_FragData[0].xyz = giAmbient(pos, norm);
+ frag_color.xyz = giAmbient(pos, norm);
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/giV.glsl b/indra/newview/app_settings/shaders/class1/deferred/giV.glsl
deleted file mode 100644
index 543527612e..0000000000
--- a/indra/newview/app_settings/shaders/class1/deferred/giV.glsl
+++ /dev/null
@@ -1,22 +0,0 @@
-/**
- * @file giV.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * $/LicenseInfo$
- */
-
-varying vec2 vary_fragcoord;
-
-uniform vec2 screen_res;
-
-void main()
-{
- //transform vertex
- gl_Position = ftransform();
- vec4 pos = gl_ModelViewProjectionMatrix * gl_Vertex;
- vary_fragcoord = (pos.xy * 0.5 + 0.5)*screen_res;
- vec4 tex = gl_MultiTexCoord0;
- tex.w = 1.0;
-
- gl_FrontColor = gl_Color;
-}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/impostorF.glsl b/indra/newview/app_settings/shaders/class1/deferred/impostorF.glsl
index 7f365fedc8..bc0719cb82 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/impostorF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/impostorF.glsl
@@ -1,18 +1,53 @@
/**
* @file impostorF.glsl
*
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_data[3];
+#else
+#define frag_data gl_FragData
+#endif
+
+uniform float minimum_alpha;
+
+
uniform sampler2D diffuseMap;
uniform sampler2D normalMap;
uniform sampler2D specularMap;
+VARYING vec2 vary_texcoord0;
+
void main()
{
- vec4 col = texture2D(diffuseMap, gl_TexCoord[0].xy);
- gl_FragData[0] = vec4(col.rgb, col.a <= 0.5 ? 0.0 : 0.005);
- gl_FragData[1] = texture2D(specularMap, gl_TexCoord[0].xy);
- gl_FragData[2] = vec4(texture2D(normalMap, gl_TexCoord[0].xy).xyz, 0.0);
+ vec4 col = texture2D(diffuseMap, vary_texcoord0.xy);
+
+ if (col.a < minimum_alpha)
+ {
+ discard;
+ }
+
+ frag_data[0] = vec4(col.rgb, col.a * 0.005);
+ frag_data[1] = texture2D(specularMap, vary_texcoord0.xy);
+ frag_data[2] = vec4(texture2D(normalMap, vary_texcoord0.xy).xyz, 0.0);
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/impostorV.glsl b/indra/newview/app_settings/shaders/class1/deferred/impostorV.glsl
index 4fc27d4412..42266e9378 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/impostorV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/impostorV.glsl
@@ -2,14 +2,38 @@
* @file impostorV.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec2 vary_texcoord0;
+
void main()
{
//transform vertex
- gl_Position = ftransform();
- gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
-
- gl_FrontColor = gl_Color;
+ gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/luminanceF.glsl b/indra/newview/app_settings/shaders/class1/deferred/luminanceF.glsl
index acb3014d18..dcf474824d 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/luminanceF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/luminanceF.glsl
@@ -2,14 +2,38 @@
* @file luminanceF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+
uniform sampler2DRect diffuseMap;
-varying vec2 vary_fragcoord;
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
+VARYING vec2 vary_fragcoord;
void main()
{
- gl_FragColor = texture2DRect(diffuseMap, vary_fragcoord.xy);
+ frag_color = texture2DRect(diffuseMap, vary_fragcoord.xy);
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/luminanceV.glsl b/indra/newview/app_settings/shaders/class1/deferred/luminanceV.glsl
index 6368def830..f2dc60aa5d 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/luminanceV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/luminanceV.glsl
@@ -2,19 +2,44 @@
* @file giV.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-varying vec2 vary_fragcoord;
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec4 diffuse_color;
+
+VARYING vec2 vary_fragcoord;
+VARYING vec4 vertex_color;
uniform vec2 screen_res;
void main()
{
//transform vertex
- gl_Position = ftransform();
- vec4 pos = gl_ModelViewProjectionMatrix * gl_Vertex;
+ vec4 pos = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ gl_Position = pos;
+
vary_fragcoord = (pos.xy * 0.5 + 0.5)*screen_res;
- gl_FrontColor = gl_Color;
+ vertex_color = diffuse_color;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl
index 6fca08ae6a..4d01eeb64e 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl
@@ -2,11 +2,35 @@
* @file multiPointLightF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#extension GL_ARB_texture_rectangle : enable
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
uniform sampler2DRect depthMap;
uniform sampler2DRect diffuseRect;
uniform sampler2DRect specularRect;
@@ -21,10 +45,11 @@ uniform float sun_wash;
uniform int light_count;
-uniform vec4 light[16];
-uniform vec4 light_col[16];
+#define MAX_LIGHT_COUNT 16
+uniform vec4 light[MAX_LIGHT_COUNT];
+uniform vec4 light_col[MAX_LIGHT_COUNT];
-varying vec4 vary_fragcoord;
+VARYING vec4 vary_fragcoord;
uniform vec2 screen_res;
uniform float far_z;
@@ -33,7 +58,7 @@ uniform mat4 inv_proj;
vec4 getPosition(vec2 pos_screen)
{
- float depth = texture2DRect(depthMap, pos_screen.xy).a;
+ float depth = texture2DRect(depthMap, pos_screen.xy).r;
vec2 sc = pos_screen.xy*2.0;
sc /= screen_res;
sc -= vec2(1.0,1.0);
@@ -61,50 +86,56 @@ void main()
float noise = texture2D(noiseMap, frag.xy/128.0).b;
vec3 out_col = vec3(0,0,0);
vec3 npos = normalize(-pos);
-
- for (int i = 0; i < light_count; ++i)
+
+ // As of OSX 10.6.7 ATI Apple's crash when using a variable size loop
+ for (int i = 0; i < MAX_LIGHT_COUNT; ++i)
{
+ bool light_contrib = (i < light_count);
+
vec3 lv = light[i].xyz-pos;
float dist2 = dot(lv,lv);
dist2 /= light[i].w;
if (dist2 > 1.0)
{
- continue;
+ light_contrib = false;
}
float da = dot(norm, lv);
if (da < 0.0)
{
- continue;
+ light_contrib = false;
}
-
- lv = normalize(lv);
- da = dot(norm, lv);
-
- float fa = light_col[i].a+1.0;
- float dist_atten = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
- dist_atten *= noise;
-
- float lit = da * dist_atten;
- vec3 col = light_col[i].rgb*lit*diff;
- //vec3 col = vec3(dist2, light_col[i].a, lit);
-
- if (spec.a > 0.0)
+ if (light_contrib)
{
- //vec3 ref = dot(pos+lv, norm);
+ lv = normalize(lv);
+ da = dot(norm, lv);
+
+ float fa = light_col[i].a+1.0;
+ float dist_atten = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
+ dist_atten *= noise;
+
+ float lit = da * dist_atten;
- float sa = dot(normalize(lv+npos),norm);
+ vec3 col = light_col[i].rgb*lit*diff;
+ //vec3 col = vec3(dist2, light_col[i].a, lit);
- if (sa > 0.0)
+ if (spec.a > 0.0)
{
- sa = texture2D(lightFunc,vec2(sa, spec.a)).a * min(dist_atten*4.0, 1.0);
- sa *= noise;
- col += da*sa*light_col[i].rgb*spec.rgb;
+ //vec3 ref = dot(pos+lv, norm);
+
+ float sa = dot(normalize(lv+npos),norm);
+
+ if (sa > 0.0)
+ {
+ sa = 6 * texture2D(lightFunc, vec2(sa, spec.a)).r * min(dist_atten*4.0, 1.0);
+ sa *= noise;
+ col += da*sa*light_col[i].rgb*spec.rgb;
+ }
}
+
+ out_col += col;
}
-
- out_col += col;
}
if (dot(out_col, out_col) <= 0.0)
@@ -112,8 +143,6 @@ void main()
discard;
}
- gl_FragColor.rgb = out_col;
- gl_FragColor.a = 0.0;
-
- //gl_FragColor = vec4(0.1, 0.025, 0.025/4.0, 0.0);
+ frag_color.rgb = out_col;
+ frag_color.a = 0.0;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightV.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightV.glsl
new file mode 100644
index 0000000000..eefefa640d
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightV.glsl
@@ -0,0 +1,39 @@
+/**
+ * @file multiPointLightV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+
+VARYING vec4 vary_fragcoord;
+
+void main()
+{
+ //transform vertex
+ vec4 pos = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ vary_fragcoord = pos;
+
+ gl_Position = pos;
+}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl
index a9f03f7615..75de47614c 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl
@@ -2,10 +2,32 @@
* @file multiSpotLightF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-#version 120
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
//class 1 -- no shadows
@@ -17,7 +39,6 @@ uniform sampler2DRect depthMap;
uniform sampler2DRect normalMap;
uniform samplerCube environmentMap;
uniform sampler2D noiseMap;
-uniform sampler2D lightFunc;
uniform sampler2D projectionMap;
uniform mat4 proj_mat; //screen space to light space
@@ -37,9 +58,12 @@ uniform float sun_wash;
uniform int proj_shadow_idx;
uniform float shadow_fade;
-varying vec4 vary_light;
+uniform vec3 center;
+uniform vec3 color;
+uniform float falloff;
+uniform float size;
-varying vec4 vary_fragcoord;
+VARYING vec4 vary_fragcoord;
uniform vec2 screen_res;
uniform mat4 inv_proj;
@@ -92,7 +116,7 @@ vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod)
vec4 getPosition(vec2 pos_screen)
{
- float depth = texture2DRect(depthMap, pos_screen.xy).a;
+ float depth = texture2DRect(depthMap, pos_screen.xy).r;
vec2 sc = pos_screen.xy*2.0;
sc /= screen_res;
sc -= vec2(1.0,1.0);
@@ -111,9 +135,9 @@ void main()
frag.xy *= screen_res;
vec3 pos = getPosition(frag.xy).xyz;
- vec3 lv = vary_light.xyz-pos.xyz;
+ vec3 lv = center.xyz-pos.xyz;
float dist2 = dot(lv,lv);
- dist2 /= vary_light.w;
+ dist2 /= size;
if (dist2 > 1.0)
{
discard;
@@ -132,7 +156,7 @@ void main()
proj_tc.xyz /= proj_tc.w;
- float fa = gl_Color.a+1.0;
+ float fa = falloff+1.0;
float dist_atten = min(1.0-(dist2-1.0*(1.0-fa))/fa, 1.0);
if (dist_atten <= 0.0)
{
@@ -164,7 +188,7 @@ void main()
vec4 plcol = texture2DLodDiffuse(projectionMap, proj_tc.xy, lod);
- vec3 lcol = gl_Color.rgb * plcol.rgb * plcol.a;
+ vec3 lcol = color.rgb * plcol.rgb * plcol.a;
lit = da * dist_atten * noise;
@@ -181,7 +205,7 @@ void main()
amb_da = min(amb_da, 1.0-lit);
- col += amb_da*gl_Color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a;
+ col += amb_da*color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a;
}
@@ -214,12 +238,12 @@ void main()
stc.y > 0.0)
{
vec4 scol = texture2DLodSpecular(projectionMap, stc.xy, proj_lod-spec.a*proj_lod);
- col += dist_atten*scol.rgb*gl_Color.rgb*scol.a*spec.rgb;
+ col += dist_atten*scol.rgb*color.rgb*scol.a*spec.rgb;
}
}
}
}
- gl_FragColor.rgb = col;
- gl_FragColor.a = 0.0;
+ frag_color.rgb = col;
+ frag_color.a = 0.0;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/normgenF.glsl b/indra/newview/app_settings/shaders/class1/deferred/normgenF.glsl
new file mode 100644
index 0000000000..62cfa5c316
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/normgenF.glsl
@@ -0,0 +1,58 @@
+/**
+ * @file normgenF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#extension GL_ARB_texture_rectangle : enable
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
+uniform sampler2D alphaMap;
+
+VARYING vec2 vary_texcoord0;
+
+uniform float stepX;
+uniform float stepY;
+uniform float norm_scale;
+
+void main()
+{
+ float alpha = texture2D(alphaMap, vary_texcoord0).a;
+
+ vec3 right = vec3(norm_scale, 0, (texture2D(alphaMap, vary_texcoord0+vec2(stepX, 0)).a-alpha)*255);
+ vec3 left = vec3(-norm_scale, 0, (texture2D(alphaMap, vary_texcoord0-vec2(stepX, 0)).a-alpha)*255);
+ vec3 up = vec3(0, -norm_scale, (texture2D(alphaMap, vary_texcoord0-vec2(0, stepY)).a-alpha)*255);
+ vec3 down = vec3(0, norm_scale, (texture2D(alphaMap, vary_texcoord0+vec2(0, stepY)).a-alpha)*255);
+
+ vec3 norm = cross(right, down) + cross(down, left) + cross(left,up) + cross(up, right);
+
+ norm = normalize(norm);
+ norm *= 0.5;
+ norm += 0.5;
+
+ frag_color = vec4(norm, alpha);
+}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/normgenV.glsl b/indra/newview/app_settings/shaders/class1/deferred/normgenV.glsl
new file mode 100644
index 0000000000..9bceae05b7
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/normgenV.glsl
@@ -0,0 +1,36 @@
+/**
+ * @file normgenV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec2 vary_fragcoord;
+VARYING vec2 vary_texcoord0;
+
+void main()
+{
+ gl_Position = vec4(position.x*2.0-1.0, position.y*2.0-1.0, -1.0, 1.0);
+ vary_texcoord0 = texcoord0;
+}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl
index 43da16436b..19800a8b8e 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl
@@ -2,11 +2,35 @@
* @file pointLightF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+
#extension GL_ARB_texture_rectangle : enable
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
uniform sampler2DRect diffuseRect;
uniform sampler2DRect specularRect;
uniform sampler2DRect normalMap;
@@ -18,9 +42,12 @@ uniform sampler2DRect depthMap;
uniform vec3 env_mat[3];
uniform float sun_wash;
-varying vec4 vary_light;
+uniform vec3 center;
+uniform vec3 color;
+uniform float falloff;
+uniform float size;
-varying vec4 vary_fragcoord;
+VARYING vec4 vary_fragcoord;
uniform vec2 screen_res;
uniform mat4 inv_proj;
@@ -28,7 +55,7 @@ uniform vec4 viewport;
vec4 getPosition(vec2 pos_screen)
{
- float depth = texture2DRect(depthMap, pos_screen.xy).a;
+ float depth = texture2DRect(depthMap, pos_screen.xy).r;
vec2 sc = (pos_screen.xy-viewport.xy)*2.0;
sc /= viewport.zw;
sc -= vec2(1.0,1.0);
@@ -47,9 +74,9 @@ void main()
frag.xy *= screen_res;
vec3 pos = getPosition(frag.xy).xyz;
- vec3 lv = vary_light.xyz-pos;
+ vec3 lv = center.xyz-pos;
float dist2 = dot(lv,lv);
- dist2 /= vary_light.w;
+ dist2 /= size;
if (dist2 > 1.0)
{
discard;
@@ -70,11 +97,11 @@ void main()
float noise = texture2D(noiseMap, frag.xy/128.0).b;
vec3 col = texture2DRect(diffuseRect, frag.xy).rgb;
- float fa = gl_Color.a+1.0;
+ float fa = falloff+1.0;
float dist_atten = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
float lit = da * dist_atten * noise;
- col = gl_Color.rgb*lit*col;
+ col = color.rgb*lit*col;
vec4 spec = texture2DRect(specularRect, frag.xy);
if (spec.a > 0.0)
@@ -82,9 +109,9 @@ void main()
float sa = dot(normalize(lv-normalize(pos)),norm);
if (sa > 0.0)
{
- sa = texture2D(lightFunc, vec2(sa, spec.a)).a * min(dist_atten*4.0, 1.0);
+ sa = 6 * texture2D(lightFunc, vec2(sa, spec.a)).r * min(dist_atten*4.0, 1.0);
sa *= noise;
- col += da*sa*gl_Color.rgb*spec.rgb;
+ col += da*sa*color.rgb*spec.rgb;
}
}
@@ -93,6 +120,6 @@ void main()
discard;
}
- gl_FragColor.rgb = col;
- gl_FragColor.a = 0.0;
+ frag_color.rgb = col;
+ frag_color.a = 0.0;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/pointLightV.glsl b/indra/newview/app_settings/shaders/class1/deferred/pointLightV.glsl
index e056c3e896..cb14e6d4e8 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/pointLightV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/pointLightV.glsl
@@ -2,27 +2,38 @@
* @file pointLightF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-varying vec4 vary_light;
-varying vec4 vary_fragcoord;
+uniform mat4 modelview_projection_matrix;
-uniform vec2 screen_res;
-uniform float near_clip;
+ATTRIBUTE vec3 position;
+
+VARYING vec4 vary_fragcoord;
void main()
{
//transform vertex
- gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
-
- vec4 pos = gl_ModelViewProjectionMatrix * gl_Vertex;
+ vec4 pos = modelview_projection_matrix * vec4(position.xyz, 1.0);
vary_fragcoord = pos;
- vec4 tex = gl_MultiTexCoord0;
- tex.w = 1.0;
-
- vary_light = gl_MultiTexCoord0;
-
- gl_FrontColor = gl_Color;
+ gl_Position = pos;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl
index 650e1a91a8..bf362e21a4 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl
@@ -2,56 +2,127 @@
* @file postDeferredF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#extension GL_ARB_texture_rectangle : enable
-uniform sampler2DRect diffuseRect;
-uniform sampler2DRect localLightMap;
-uniform sampler2DRect sunLightMap;
-uniform sampler2DRect giLightMap;
-uniform sampler2D luminanceMap;
-uniform sampler2DRect lightMap;
-
-uniform vec3 lum_quad;
-uniform float lum_lod;
-uniform vec4 ambient;
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
-uniform vec3 gi_quad;
+uniform sampler2DRect diffuseRect;
+uniform mat4 inv_proj;
uniform vec2 screen_res;
-varying vec2 vary_fragcoord;
+uniform float max_cof;
+uniform float res_scale;
-void main()
+VARYING vec2 vary_fragcoord;
+
+void dofSample(inout vec4 diff, inout float w, float min_sc, vec2 tc)
{
- vec2 tc = vary_fragcoord.xy;
- vec3 lum = texture2DLod(luminanceMap, tc/screen_res, lum_lod).rgb;
- float luminance = lum.r;
- luminance = luminance*lum_quad.y+lum_quad.z;
+ vec4 s = texture2DRect(diffuseRect, tc);
- vec4 diff = texture2DRect(diffuseRect, vary_fragcoord.xy);
+ float sc = abs(s.a*2.0-1.0)*max_cof;
- float ambocc = texture2DRect(lightMap, vary_fragcoord.xy).g;
-
- vec3 gi_col = texture2DRect(giLightMap, vary_fragcoord.xy).rgb;
- gi_col = gi_col*gi_col*gi_quad.x + gi_col*gi_quad.y+gi_quad.z*ambocc*ambient.rgb;
- gi_col *= diff;
-
- vec4 sun_col = texture2DRect(sunLightMap, vary_fragcoord.xy);
-
- vec3 local_col = texture2DRect(localLightMap, vary_fragcoord.xy).rgb;
+ if (sc > min_sc) //sampled pixel is more "out of focus" than current sample radius
+ {
+ float wg = 0.25;
+ // de-weight dull areas to make highlights 'pop'
+ wg += s.r+s.g+s.b;
+
+ diff += wg*s;
- sun_col *= 1.0/min(luminance, 1.0);
- gi_col *= 1.0/luminance;
+ w += wg;
+ }
+}
+
+void dofSampleNear(inout vec4 diff, inout float w, float min_sc, vec2 tc)
+{
+ vec4 s = texture2DRect(diffuseRect, tc);
+
+ float wg = 0.25;
+
+ // de-weight dull areas to make highlights 'pop'
+ wg += s.r+s.g+s.b;
+
+ diff += wg*s;
- vec3 col = sun_col.rgb+gi_col+local_col;
-
- gl_FragColor.rgb = col.rgb;
- col.rgb = max(col.rgb-vec3(1.0,1.0,1.0), vec3(0.0, 0.0, 0.0));
+ w += wg;
+}
+
+void main()
+{
+ vec2 tc = vary_fragcoord.xy;
- gl_FragColor.a = 0.0; // max(dot(col.rgb,col.rgb)*lum_quad.x, sun_col.a);
+ vec4 diff = texture2DRect(diffuseRect, vary_fragcoord.xy);
- //gl_FragColor.rgb = vec3(lum_lod);
+ {
+ float w = 1.0;
+
+ float sc = (diff.a*2.0-1.0)*max_cof;
+
+ float PI = 3.14159265358979323846264;
+
+ // sample quite uniformly spaced points within a circle, for a circular 'bokeh'
+ if (sc > 0.5)
+ {
+ while (sc > 0.5)
+ {
+ int its = int(max(1.0,(sc*3.7)));
+ for (int i=0; i<its; ++i)
+ {
+ float ang = sc+i*2*PI/its; // sc is added for rotary perturbance
+ float samp_x = sc*sin(ang);
+ float samp_y = sc*cos(ang);
+ // you could test sample coords against an interesting non-circular aperture shape here, if desired.
+ dofSampleNear(diff, w, sc, vary_fragcoord.xy + vec2(samp_x,samp_y));
+ }
+ sc -= 1.0;
+ }
+ }
+ else if (sc < -0.5)
+ {
+ sc = abs(sc);
+ while (sc > 0.5)
+ {
+ int its = int(max(1.0,(sc*3.7)));
+ for (int i=0; i<its; ++i)
+ {
+ float ang = sc+i*2*PI/its; // sc is added for rotary perturbance
+ float samp_x = sc*sin(ang);
+ float samp_y = sc*cos(ang);
+ // you could test sample coords against an interesting non-circular aperture shape here, if desired.
+ dofSample(diff, w, sc, vary_fragcoord.xy + vec2(samp_x,samp_y));
+ }
+ sc -= 1.0;
+ }
+ }
+
+ diff /= w;
+ }
+
+ frag_color = diff;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFF.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFF.glsl
new file mode 100644
index 0000000000..eb5beeef39
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFF.glsl
@@ -0,0 +1,47 @@
+/**
+ * @file postDeferredNoDoFF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#extension GL_ARB_texture_rectangle : enable
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
+uniform sampler2DRect diffuseRect;
+uniform sampler2D bloomMap;
+
+uniform vec2 screen_res;
+VARYING vec2 vary_fragcoord;
+
+void main()
+{
+ vec4 diff = texture2DRect(diffuseRect, vary_fragcoord.xy);
+
+ vec4 bloom = texture2D(bloomMap, vary_fragcoord.xy/screen_res);
+ frag_color = diff + bloom;
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoTCV.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoTCV.glsl
new file mode 100644
index 0000000000..bd0cb50464
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoTCV.glsl
@@ -0,0 +1,40 @@
+/**
+ * @file postDeferredV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+
+VARYING vec2 vary_fragcoord;
+
+uniform vec2 screen_res;
+
+void main()
+{
+ //transform vertex
+ vec4 pos = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ gl_Position = pos;
+ vary_fragcoord = (pos.xy*0.5+0.5)*screen_res;
+}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredV.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredV.glsl
index 0ec81dcb02..8edf5b2723 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredV.glsl
@@ -2,16 +2,43 @@
* @file postDeferredV.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-varying vec2 vary_fragcoord;
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+
+VARYING vec2 vary_fragcoord;
+VARYING vec2 vary_tc;
+
+uniform vec2 tc_scale;
+
uniform vec2 screen_res;
void main()
{
//transform vertex
- gl_Position = ftransform();
- vec4 pos = gl_ModelViewProjectionMatrix * gl_Vertex;
+ vec4 pos = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ gl_Position = pos;
+ vary_tc = (pos.xy*0.5+0.5)*tc_scale;
vary_fragcoord = (pos.xy*0.5+0.5)*screen_res;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/postgiF.glsl b/indra/newview/app_settings/shaders/class1/deferred/postgiF.glsl
index e8e58f50e1..96f9628424 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/postgiF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/postgiF.glsl
@@ -2,9 +2,33 @@
* @file postgiF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+ #ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
uniform sampler2DRect depthMap;
uniform sampler2DRect normalMap;
uniform sampler2DRect giLightMap;
@@ -18,7 +42,7 @@ uniform int kern_length;
uniform float kern_scale;
uniform vec3 blur_quad;
-varying vec2 vary_fragcoord;
+VARYING vec2 vary_fragcoord;
uniform mat4 inv_proj;
uniform vec2 screen_res;
@@ -74,7 +98,5 @@ void main()
col = col*col*blur_quad.x + col*blur_quad.y + blur_quad.z;
- gl_FragData[0].xyz = col;
-
- //gl_FragColor = ccol;
+ frag_color.rgb = col;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/postgiV.glsl b/indra/newview/app_settings/shaders/class1/deferred/postgiV.glsl
deleted file mode 100644
index e5f6217644..0000000000
--- a/indra/newview/app_settings/shaders/class1/deferred/postgiV.glsl
+++ /dev/null
@@ -1,17 +0,0 @@
-/**
- * @file postgiV.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * $/LicenseInfo$
- */
-
-varying vec2 vary_fragcoord;
-uniform vec2 screen_res;
-
-void main()
-{
- //transform vertex
- gl_Position = ftransform();
- vec4 pos = gl_ModelViewProjectionMatrix * gl_Vertex;
- vary_fragcoord = (pos.xy*0.5+0.5)*screen_res;
-}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskF.glsl
new file mode 100644
index 0000000000..cf8cf8364a
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskF.glsl
@@ -0,0 +1,52 @@
+/**
+ * @file shadowAlphaMaskF.glsl
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
+uniform float minimum_alpha;
+
+uniform sampler2D diffuseMap;
+
+VARYING vec4 post_pos;
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+void main()
+{
+ float alpha = diffuseLookup(vary_texcoord0.xy).a * vertex_color.a;
+
+ if (alpha < minimum_alpha)
+ {
+ discard;
+ }
+
+ frag_color = vec4(1,1,1,1);
+
+ gl_FragDepth = max(post_pos.z/post_pos.w*0.5+0.5, 0.0);
+}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskV.glsl b/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskV.glsl
new file mode 100644
index 0000000000..7d3b06c56e
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskV.glsl
@@ -0,0 +1,51 @@
+/**
+ * @file shadowAlphaMaskV.glsl
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec4 diffuse_color;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec4 post_pos;
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+void passTextureIndex();
+
+void main()
+{
+ //transform vertex
+ vec4 pos = modelview_projection_matrix*vec4(position.xyz, 1.0);
+ post_pos = pos;
+
+ gl_Position = vec4(pos.x, pos.y, pos.w*0.5, pos.w);
+
+ passTextureIndex();
+
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
+ vertex_color = diffuse_color;
+}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/shadowF.glsl b/indra/newview/app_settings/shaders/class1/deferred/shadowF.glsl
index 378a3295ec..7e55fdc12a 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/shadowF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/shadowF.glsl
@@ -1,17 +1,39 @@
/**
* @file shadowF.glsl
*
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
-uniform sampler2D diffuseMap;
-
-varying vec4 post_pos;
+VARYING vec4 post_pos;
void main()
{
- gl_FragColor = vec4(1,1,1,texture2D(diffuseMap, gl_TexCoord[0].xy).a * gl_Color.a);
+ frag_color = vec4(1,1,1,1);
gl_FragDepth = max(post_pos.z/post_pos.w*0.5+0.5, 0.0);
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/shadowV.glsl b/indra/newview/app_settings/shaders/class1/deferred/shadowV.glsl
index 666f909f01..8b46e81f90 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/shadowV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/shadowV.glsl
@@ -1,21 +1,40 @@
/**
* @file shadowV.glsl
*
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-varying vec4 post_pos;
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+
+VARYING vec4 post_pos;
void main()
{
//transform vertex
- vec4 pos = gl_ModelViewProjectionMatrix*gl_Vertex;
+ vec4 pos = modelview_projection_matrix*vec4(position.xyz, 1.0);
post_pos = pos;
gl_Position = vec4(pos.x, pos.y, pos.w*0.5, pos.w);
-
- gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
- gl_FrontColor = gl_Color;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/skyF.glsl b/indra/newview/app_settings/shaders/class1/deferred/skyF.glsl
new file mode 100644
index 0000000000..faa54a316e
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/skyF.glsl
@@ -0,0 +1,66 @@
+/**
+ * @file WLSkyF.glsl
+ *
+ * $LicenseInfo:firstyear=2005&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2005, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_data[3];
+#else
+#define frag_data gl_FragData
+#endif
+
+/////////////////////////////////////////////////////////////////////////
+// The fragment shader for the sky
+/////////////////////////////////////////////////////////////////////////
+
+VARYING vec4 vary_HazeColor;
+
+uniform sampler2D cloud_noise_texture;
+uniform vec4 gamma;
+
+/// Soft clips the light with a gamma correction
+vec3 scaleSoftClip(vec3 light) {
+ //soft clip effect:
+ light = 1. - clamp(light, vec3(0.), vec3(1.));
+ light = 1. - pow(light, gamma.xxx);
+
+ return light;
+}
+
+void main()
+{
+ // Potential Fill-rate optimization. Add cloud calculation
+ // back in and output alpha of 0 (so that alpha culling kills
+ // the fragment) if the sky wouldn't show up because the clouds
+ // are fully opaque.
+
+ vec4 color;
+ color = vary_HazeColor;
+ color *= 2.;
+
+ /// Gamma correct for WL (soft clip effect).
+ frag_data[0] = vec4(scaleSoftClip(color.rgb), 1.0);
+ frag_data[1] = vec4(0.0,0.0,0.0,0.0);
+ frag_data[2] = vec4(0,0,1,0);
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/deferred/skyV.glsl b/indra/newview/app_settings/shaders/class1/deferred/skyV.glsl
new file mode 100644
index 0000000000..7c02d31d43
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/skyV.glsl
@@ -0,0 +1,157 @@
+/**
+ * @file WLSkyV.glsl
+ *
+ * $LicenseInfo:firstyear=2005&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2005, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+
+// SKY ////////////////////////////////////////////////////////////////////////
+// The vertex shader for creating the atmospheric sky
+///////////////////////////////////////////////////////////////////////////////
+
+// Output parameters
+VARYING vec4 vary_HazeColor;
+
+// Inputs
+uniform vec3 camPosLocal;
+
+uniform vec4 lightnorm;
+uniform vec4 sunlight_color;
+uniform vec4 ambient;
+uniform vec4 blue_horizon;
+uniform vec4 blue_density;
+uniform float haze_horizon;
+uniform float haze_density;
+
+uniform float cloud_shadow;
+uniform float density_multiplier;
+uniform float max_y;
+
+uniform vec4 glow;
+
+uniform vec4 cloud_color;
+
+void main()
+{
+
+ // World / view / projection
+ gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
+
+ // Get relative position
+ vec3 P = position.xyz - camPosLocal.xyz + vec3(0,50,0);
+ //vec3 P = position.xyz + vec3(0,50,0);
+
+ // Set altitude
+ if (P.y > 0.)
+ {
+ P *= (max_y / P.y);
+ }
+ else
+ {
+ P *= (-32000. / P.y);
+ }
+
+ // Can normalize then
+ vec3 Pn = normalize(P);
+ float Plen = length(P);
+
+ // Initialize temp variables
+ vec4 temp1 = vec4(0.);
+ vec4 temp2 = vec4(0.);
+ vec4 blue_weight;
+ vec4 haze_weight;
+ vec4 sunlight = sunlight_color;
+ vec4 light_atten;
+
+
+ // Sunlight attenuation effect (hue and brightness) due to atmosphere
+ // this is used later for sunlight modulation at various altitudes
+ light_atten = (blue_density + vec4(haze_density * 0.25)) * (density_multiplier * max_y);
+
+ // Calculate relative weights
+ temp1 = blue_density + haze_density;
+ blue_weight = blue_density / temp1;
+ haze_weight = haze_density / temp1;
+
+ // Compute sunlight from P & lightnorm (for long rays like sky)
+ temp2.y = max(0., max(0., Pn.y) * 1.0 + lightnorm.y );
+ temp2.y = 1. / temp2.y;
+ sunlight *= exp( - light_atten * temp2.y);
+
+ // Distance
+ temp2.z = Plen * density_multiplier;
+
+ // Transparency (-> temp1)
+ // ATI Bugfix -- can't store temp1*temp2.z in a variable because the ati
+ // compiler gets confused.
+ temp1 = exp(-temp1 * temp2.z);
+
+
+ // Compute haze glow
+ temp2.x = dot(Pn, lightnorm.xyz);
+ temp2.x = 1. - temp2.x;
+ // temp2.x is 0 at the sun and increases away from sun
+ temp2.x = max(temp2.x, .001);
+ // Set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot)
+ temp2.x *= glow.x;
+ // Higher glow.x gives dimmer glow (because next step is 1 / "angle")
+ temp2.x = pow(temp2.x, glow.z);
+ // glow.z should be negative, so we're doing a sort of (1 / "angle") function
+
+ // Add "minimum anti-solar illumination"
+ temp2.x += .25;
+
+
+ // Haze color above cloud
+ vary_HazeColor = ( blue_horizon * blue_weight * (sunlight + ambient)
+ + (haze_horizon * haze_weight) * (sunlight * temp2.x + ambient)
+ );
+
+
+ // Increase ambient when there are more clouds
+ vec4 tmpAmbient = ambient;
+ tmpAmbient += (1. - tmpAmbient) * cloud_shadow * 0.5;
+
+ // Dim sunlight by cloud shadow percentage
+ sunlight *= (1. - cloud_shadow);
+
+ // Haze color below cloud
+ vec4 additiveColorBelowCloud = ( blue_horizon * blue_weight * (sunlight + tmpAmbient)
+ + (haze_horizon * haze_weight) * (sunlight * temp2.x + tmpAmbient)
+ );
+
+ // Final atmosphere additive
+ vary_HazeColor *= (1. - temp1);
+
+ // Attenuate cloud color by atmosphere
+ temp1 = sqrt(temp1); //less atmos opacity (more transparency) below clouds
+
+ // At horizon, blend high altitude sky color towards the darker color below the clouds
+ vary_HazeColor += (additiveColorBelowCloud - vary_HazeColor) * (1. - sqrt(temp1));
+
+ // won't compile on mac without this being set
+ //vary_AtmosAttenuation = vec3(0.0,0.0,0.0);
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl
index 5fbeceba81..66e3cf6d13 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl
@@ -2,18 +2,41 @@
* @file softenLightF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+
#extension GL_ARB_texture_rectangle : enable
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
uniform sampler2DRect diffuseRect;
uniform sampler2DRect specularRect;
uniform sampler2DRect positionMap;
uniform sampler2DRect normalMap;
uniform sampler2DRect lightMap;
uniform sampler2DRect depthMap;
-uniform sampler2D noiseMap;
uniform samplerCube environmentMap;
uniform sampler2D lightFunc;
@@ -30,21 +53,19 @@ uniform vec4 sunlight_color;
uniform vec4 ambient;
uniform vec4 blue_horizon;
uniform vec4 blue_density;
-uniform vec4 haze_horizon;
-uniform vec4 haze_density;
-uniform vec4 cloud_shadow;
-uniform vec4 density_multiplier;
-uniform vec4 distance_multiplier;
-uniform vec4 max_y;
+uniform float haze_horizon;
+uniform float haze_density;
+uniform float cloud_shadow;
+uniform float density_multiplier;
+uniform float distance_multiplier;
+uniform float max_y;
uniform vec4 glow;
uniform float scene_light_strength;
-uniform vec3 env_mat[3];
-//uniform mat4 shadow_matrix[3];
-//uniform vec4 shadow_clip;
+uniform mat3 env_mat;
uniform mat3 ssao_effect_mat;
-varying vec4 vary_light;
-varying vec2 vary_fragcoord;
+uniform vec3 sun_dir;
+VARYING vec2 vary_fragcoord;
vec3 vary_PositionEye;
@@ -126,10 +147,6 @@ void calcAtmospherics(vec3 inPositionEye, float ambFactor) {
vec3 P = inPositionEye;
setPositionEye(P);
- //(TERRAIN) limit altitude
- if (P.y > max_y.x) P *= (max_y.x / P.y);
- if (P.y < -max_y.x) P *= (-max_y.x / P.y);
-
vec3 tmpLightnorm = lightnorm.xyz;
vec3 Pn = normalize(P);
@@ -144,13 +161,13 @@ void calcAtmospherics(vec3 inPositionEye, float ambFactor) {
//sunlight attenuation effect (hue and brightness) due to atmosphere
//this is used later for sunlight modulation at various altitudes
- light_atten = (blue_density * 1.0 + vec4(haze_density.r) * 0.25) * (density_multiplier.x * max_y.x);
+ light_atten = (blue_density + vec4(haze_density * 0.25)) * (density_multiplier * max_y);
//I had thought blue_density and haze_density should have equal weighting,
//but attenuation due to haze_density tends to seem too strong
- temp1 = blue_density + vec4(haze_density.r);
+ temp1 = blue_density + vec4(haze_density);
blue_weight = blue_density / temp1;
- haze_weight = vec4(haze_density.r) / temp1;
+ haze_weight = vec4(haze_density) / temp1;
//(TERRAIN) compute sunlight from lightnorm only (for short rays like terrain)
temp2.y = max(0.0, tmpLightnorm.y);
@@ -158,12 +175,12 @@ void calcAtmospherics(vec3 inPositionEye, float ambFactor) {
sunlight *= exp( - light_atten * temp2.y);
// main atmospheric scattering line integral
- temp2.z = Plen * density_multiplier.x;
+ temp2.z = Plen * density_multiplier;
// Transparency (-> temp1)
- // ATI Bugfix -- can't store temp1*temp2.z*distance_multiplier.x in a variable because the ati
+ // ATI Bugfix -- can't store temp1*temp2.z*distance_multiplier in a variable because the ati
// compiler gets confused.
- temp1 = exp(-temp1 * temp2.z * distance_multiplier.x);
+ temp1 = exp(-temp1 * temp2.z * distance_multiplier);
//final atmosphere attenuation factor
setAtmosAttenuation(temp1.rgb);
@@ -184,7 +201,7 @@ void calcAtmospherics(vec3 inPositionEye, float ambFactor) {
temp2.x += .25;
//increase ambient when there are more clouds
- vec4 tmpAmbient = ambient + (vec4(1.) - ambient) * cloud_shadow.x * 0.5;
+ vec4 tmpAmbient = ambient + (vec4(1.) - ambient) * cloud_shadow * 0.5;
/* decrease value and saturation (that in HSV, not HSL) for occluded areas
* // for HSV color/geometry used here, see http://gimp-savvy.com/BOOK/index.html?node52.html
@@ -198,8 +215,8 @@ void calcAtmospherics(vec3 inPositionEye, float ambFactor) {
//haze color
setAdditiveColor(
- vec3(blue_horizon * blue_weight * (sunlight*(1.-cloud_shadow.x) + tmpAmbient)
- + (haze_horizon.r * haze_weight) * (sunlight*(1.-cloud_shadow.x) * temp2.x
+ vec3(blue_horizon * blue_weight * (sunlight*(1.-cloud_shadow) + tmpAmbient)
+ + (haze_horizon * haze_weight) * (sunlight*(1.-cloud_shadow) * temp2.x
+ tmpAmbient)));
//brightness of surface both sunlight and ambient
@@ -257,87 +274,57 @@ vec3 scaleSoftClip(vec3 light)
void main()
{
vec2 tc = vary_fragcoord.xy;
- float depth = texture2DRect(depthMap, tc.xy).a;
+ float depth = texture2DRect(depthMap, tc.xy).r;
vec3 pos = getPosition_d(tc, depth).xyz;
vec3 norm = texture2DRect(normalMap, tc).xyz;
norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm
- //vec3 nz = texture2D(noiseMap, vary_fragcoord.xy/128.0).xyz;
-
- float da = max(dot(norm.xyz, vary_light.xyz), 0.0);
+
+ float da = max(dot(norm.xyz, sun_dir.xyz), 0.0);
vec4 diffuse = texture2DRect(diffuseRect, tc);
vec4 spec = texture2DRect(specularRect, vary_fragcoord.xy);
- vec2 scol_ambocc = texture2DRect(lightMap, vary_fragcoord.xy).rg;
- float scol = max(scol_ambocc.r, diffuse.a);
- float ambocc = scol_ambocc.g;
+ vec3 col;
+ float bloom = 0.0;
+ if (diffuse.a < 0.9)
+ {
+ calcAtmospherics(pos.xyz, 1.0);
- calcAtmospherics(pos.xyz, ambocc);
+ col = atmosAmbient(vec3(0));
+ col += atmosAffectDirectionalLight(max(min(da, 1.0), diffuse.a));
- vec3 col = atmosAmbient(vec3(0));
- col += atmosAffectDirectionalLight(max(min(da, scol), diffuse.a));
+ col *= diffuse.rgb;
- col *= diffuse.rgb;
+ if (spec.a > 0.0) // specular reflection
+ {
+ // the old infinite-sky shiny reflection
+ //
+ vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz));
+ float sa = dot(refnormpersp, sun_dir.xyz);
+ vec3 dumbshiny = vary_SunlitColor*(6 * texture2D(lightFunc, vec2(sa, spec.a)).r);
+
+ // add the two types of shiny together
+ vec3 spec_contrib = dumbshiny * spec.rgb;
+ bloom = dot(spec_contrib, spec_contrib) / 4;
+ col += spec_contrib;
+
+ //add environmentmap
+ vec3 env_vec = env_mat * refnormpersp;
+ col = mix(col.rgb, textureCube(environmentMap, env_vec).rgb,
+ max(spec.a-diffuse.a*2.0, 0.0));
+ }
- if (spec.a > 0.0) // specular reflection
+ col = atmosLighting(col);
+ col = scaleSoftClip(col);
+
+ col = mix(col.rgb, diffuse.rgb, diffuse.a);
+ }
+ else
{
- // the old infinite-sky shiny reflection
- //
- vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz));
- float sa = dot(refnormpersp, vary_light.xyz);
- vec3 dumbshiny = vary_SunlitColor*scol_ambocc.r*texture2D(lightFunc, vec2(sa, spec.a)).a;
-
- /*
- // screen-space cheap fakey reflection map
- //
- vec3 refnorm = normalize(reflect(vec3(0,0,-1), norm.xyz));
- depth -= 0.5; // unbias depth
- // first figure out where we'll make our 2D guess from
- vec2 ref2d = (0.25 * screen_res.y) * (refnorm.xy) * abs(refnorm.z) / depth;
- // Offset the guess source a little according to a trivial
- // checkerboard dither function and spec.a.
- // This is meant to be similar to sampling a blurred version
- // of the diffuse map. LOD would be better in that regard.
- // The goal of the blur is to soften reflections in surfaces
- // with low shinyness, and also to disguise our lameness.
- float checkerboard = floor(mod(tc.x+tc.y, 2.0)); // 0.0, 1.0
- float checkoffset = (3.0 + (7.0*(1.0-spec.a)))*(checkerboard-0.5);
- ref2d += vec2(checkoffset, checkoffset);
- ref2d += tc.xy; // use as offset from destination
- // Get attributes from the 2D guess point.
- // We average two samples of diffuse (not of anything else) per
- // pixel to try to reduce aliasing some more.
- vec3 refcol = 0.5 * (texture2DRect(diffuseRect, ref2d + vec2(0.0, -checkoffset)).rgb +
- texture2DRect(diffuseRect, ref2d + vec2(-checkoffset, 0.0)).rgb);
- float refdepth = texture2DRect(depthMap, ref2d).a;
- vec3 refpos = getPosition_d(ref2d, refdepth).xyz;
- vec3 refn = texture2DRect(normalMap, ref2d).rgb;
- refn = normalize(vec3((refn.xy-0.5)*2.0,refn.z)); // unpack norm
- // figure out how appropriate our guess actually was
- float refapprop = max(0.0, dot(-refnorm, normalize(pos - refpos)));
- // darken reflections from points which face away from the reflected ray - our guess was a back-face
- //refapprop *= step(dot(refnorm, refn), 0.0);
- refapprop = min(refapprop, max(0.0, -dot(refnorm, refn))); // more conservative variant
- // get appropriate light strength for guess-point.
- // reflect light direction to increase the illusion that
- // these are reflections.
- vec3 reflight = reflect(lightnorm.xyz, norm.xyz);
- float reflit = max(dot(refn, reflight.xyz), 0.0);
- // apply sun color to guess-point, dampen according to inappropriateness of guess
- float refmod = min(refapprop, reflit);
- vec3 refprod = vary_SunlitColor * refcol.rgb * refmod;
- vec3 ssshiny = (refprod * spec.a);
- ssshiny *= 0.3; // dampen it even more
- */
- vec3 ssshiny = vec3(0,0,0);
-
- // add the two types of shiny together
- col += (ssshiny + dumbshiny) * spec.rgb;
+ col = diffuse.rgb;
}
-
- col = atmosLighting(col);
- col = scaleSoftClip(col);
-
- gl_FragColor.rgb = col;
- gl_FragColor.a = 0.0;
+
+ frag_color.rgb = col;
+
+ frag_color.a = bloom;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/softenLightV.glsl b/indra/newview/app_settings/shaders/class1/deferred/softenLightV.glsl
index 9d187b46e2..c6031fc45a 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/softenLightV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/softenLightV.glsl
@@ -2,23 +2,39 @@
* @file softenLightF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
uniform vec2 screen_res;
-varying vec4 vary_light;
-varying vec2 vary_fragcoord;
+VARYING vec2 vary_fragcoord;
void main()
{
//transform vertex
- gl_Position = ftransform();
-
- vec4 pos = gl_ModelViewProjectionMatrix * gl_Vertex;
- vary_fragcoord = (pos.xy*0.5+0.5)*screen_res;
+ vec4 pos = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ gl_Position = pos;
- vec4 tex = gl_MultiTexCoord0;
- tex.w = 1.0;
-
- vary_light = gl_MultiTexCoord0;
+ vary_fragcoord = (pos.xy*0.5+0.5)*screen_res;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl
index 29fac46bfe..7ed8ed3370 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl
@@ -2,20 +2,41 @@
* @file spotLightF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-#version 120
-
+
#extension GL_ARB_texture_rectangle : enable
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
uniform sampler2DRect diffuseRect;
uniform sampler2DRect specularRect;
uniform sampler2DRect depthMap;
uniform sampler2DRect normalMap;
-uniform samplerCube environmentMap;
uniform sampler2D noiseMap;
-uniform sampler2D lightFunc;
uniform sampler2D projectionMap;
uniform mat4 proj_mat; //screen space to light space
@@ -32,9 +53,12 @@ uniform float far_clip;
uniform vec3 proj_origin; //origin of projection to be used for angular attenuation
uniform float sun_wash;
-varying vec4 vary_light;
+uniform vec3 center;
+uniform vec3 color;
+uniform float falloff;
+uniform float size;
-varying vec4 vary_fragcoord;
+VARYING vec4 vary_fragcoord;
uniform vec2 screen_res;
uniform mat4 inv_proj;
@@ -60,9 +84,9 @@ void main()
frag.xy *= screen_res;
vec3 pos = getPosition(frag.xy).xyz;
- vec3 lv = vary_light.xyz-pos.xyz;
+ vec3 lv = center.xyz-pos.xyz;
float dist2 = dot(lv,lv);
- dist2 /= vary_light.w;
+ dist2 /= size;
if (dist2 > 1.0)
{
discard;
@@ -82,7 +106,7 @@ void main()
proj_tc.xyz /= proj_tc.w;
- float fa = gl_Color.a+1.0;
+ float fa = falloff+1.0;
float dist_atten = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
lv = proj_origin-pos.xyz;
@@ -108,7 +132,7 @@ void main()
vec4 plcol = texture2DLod(projectionMap, proj_tc.xy, lod);
- vec3 lcol = gl_Color.rgb * plcol.rgb * plcol.a;
+ vec3 lcol = color.rgb * plcol.rgb * plcol.a;
lit = da * dist_atten * noise;
@@ -127,7 +151,7 @@ void main()
amb_da = min(amb_da, 1.0-lit);
- col += amb_da*gl_Color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a;
+ col += amb_da*color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a;
}
@@ -156,12 +180,12 @@ void main()
stc.y > 0.0)
{
vec4 scol = texture2DLod(projectionMap, stc.xy, proj_lod-spec.a*proj_lod);
- col += dist_atten*scol.rgb*gl_Color.rgb*scol.a*spec.rgb;
+ col += dist_atten*scol.rgb*color.rgb*scol.a*spec.rgb;
}
}
}
}
- gl_FragColor.rgb = col;
- gl_FragColor.a = 0.0;
+ frag_color.rgb = col;
+ frag_color.a = 0.0;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/starsF.glsl b/indra/newview/app_settings/shaders/class1/deferred/starsF.glsl
new file mode 100644
index 0000000000..821058804c
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/starsF.glsl
@@ -0,0 +1,44 @@
+/**
+ * @file starsF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_data[3];
+#else
+#define frag_data gl_FragData
+#endif
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+uniform sampler2D diffuseMap;
+
+void main()
+{
+ vec4 col = vertex_color * texture2D(diffuseMap, vary_texcoord0.xy);
+
+ frag_data[0] = col;
+ frag_data[1] = vec4(0,0,0,0);
+ frag_data[2] = vec4(0,0,1,0);
+}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/starsV.glsl b/indra/newview/app_settings/shaders/class1/deferred/starsV.glsl
new file mode 100644
index 0000000000..8bc5b06379
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/starsV.glsl
@@ -0,0 +1,42 @@
+/**
+ * @file starsV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec4 diffuse_color;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+void main()
+{
+ //transform vertex
+ gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
+ vertex_color = diffuse_color;
+}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/sunLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/sunLightF.glsl
index d4d686bbb7..5ca817aff6 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/sunLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/sunLightF.glsl
@@ -2,14 +2,38 @@
* @file sunLightF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+
//class 1, no shadow, no SSAO, should never be called
#extension GL_ARB_texture_rectangle : enable
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
void main()
{
- gl_FragColor = vec4(0,0,0,0);
+ frag_color = vec4(0,0,0,0);
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/sunLightNoFragCoordV.glsl b/indra/newview/app_settings/shaders/class1/deferred/sunLightNoFragCoordV.glsl
new file mode 100644
index 0000000000..47e9d15fbc
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/sunLightNoFragCoordV.glsl
@@ -0,0 +1,37 @@
+/**
+ * @file sunLightF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+
+uniform vec2 screen_res;
+
+void main()
+{
+ //transform vertex
+ vec4 pos = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ gl_Position = pos;
+}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl b/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl
index cdbed4b791..2422d73a3e 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl
@@ -1,41 +1,57 @@
/**
* @file sunLightSSAOF.glsl
- *
- * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc.
- * $License$
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
*/
+
#extension GL_ARB_texture_rectangle : enable
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
//class 1 -- no shadow, SSAO only
uniform sampler2DRect depthMap;
uniform sampler2DRect normalMap;
uniform sampler2D noiseMap;
-uniform sampler2D lightFunc;
-
// Inputs
-uniform mat4 shadow_matrix[6];
-uniform vec4 shadow_clip;
uniform float ssao_radius;
uniform float ssao_max_radius;
uniform float ssao_factor;
uniform float ssao_factor_inv;
-varying vec2 vary_fragcoord;
-varying vec4 vary_light;
+VARYING vec2 vary_fragcoord;
uniform mat4 inv_proj;
uniform vec2 screen_res;
-uniform float shadow_bias;
-uniform float shadow_offset;
-
vec4 getPosition(vec2 pos_screen)
{
- float depth = texture2DRect(depthMap, pos_screen.xy).a;
+ float depth = texture2DRect(depthMap, pos_screen.xy).r;
vec2 sc = pos_screen.xy*2.0;
sc /= screen_res;
sc -= vec2(1.0,1.0);
@@ -51,57 +67,49 @@ float calcAmbientOcclusion(vec4 pos, vec3 norm)
{
float ret = 1.0;
- float dist = dot(pos.xyz,pos.xyz);
-
- if (dist < 64.0*64.0)
- {
- vec2 kern[8];
- // exponentially (^2) distant occlusion samples spread around origin
- kern[0] = vec2(-1.0, 0.0) * 0.125*0.125;
- kern[1] = vec2(1.0, 0.0) * 0.250*0.250;
- kern[2] = vec2(0.0, 1.0) * 0.375*0.375;
- kern[3] = vec2(0.0, -1.0) * 0.500*0.500;
- kern[4] = vec2(0.7071, 0.7071) * 0.625*0.625;
- kern[5] = vec2(-0.7071, -0.7071) * 0.750*0.750;
- kern[6] = vec2(-0.7071, 0.7071) * 0.875*0.875;
- kern[7] = vec2(0.7071, -0.7071) * 1.000*1.000;
+ vec2 kern[8];
+ // exponentially (^2) distant occlusion samples spread around origin
+ kern[0] = vec2(-1.0, 0.0) * 0.125*0.125;
+ kern[1] = vec2(1.0, 0.0) * 0.250*0.250;
+ kern[2] = vec2(0.0, 1.0) * 0.375*0.375;
+ kern[3] = vec2(0.0, -1.0) * 0.500*0.500;
+ kern[4] = vec2(0.7071, 0.7071) * 0.625*0.625;
+ kern[5] = vec2(-0.7071, -0.7071) * 0.750*0.750;
+ kern[6] = vec2(-0.7071, 0.7071) * 0.875*0.875;
+ kern[7] = vec2(0.7071, -0.7071) * 1.000*1.000;
- vec2 pos_screen = vary_fragcoord.xy;
- vec3 pos_world = pos.xyz;
- vec2 noise_reflect = texture2D(noiseMap, vary_fragcoord.xy/128.0).xy;
+ vec2 pos_screen = vary_fragcoord.xy;
+ vec3 pos_world = pos.xyz;
+ vec2 noise_reflect = texture2D(noiseMap, vary_fragcoord.xy/128.0).xy;
- float angle_hidden = 0.0;
- int points = 0;
+ float angle_hidden = 0.0;
+ int points = 0;
- float scale = min(ssao_radius / -pos_world.z, ssao_max_radius);
+ float scale = min(ssao_radius / -pos_world.z, ssao_max_radius);
- // it was found that keeping # of samples a constant was the fastest, probably due to compiler optimizations (unrolling?)
- for (int i = 0; i < 8; i++)
- {
- vec2 samppos_screen = pos_screen + scale * reflect(kern[i], noise_reflect);
- vec3 samppos_world = getPosition(samppos_screen).xyz;
+ // it was found that keeping # of samples a constant was the fastest, probably due to compiler optimizations unrolling?)
+ for (int i = 0; i < 8; i++)
+ {
+ vec2 samppos_screen = pos_screen + scale * reflect(kern[i], noise_reflect);
+ vec3 samppos_world = getPosition(samppos_screen).xyz;
- vec3 diff = pos_world - samppos_world;
- float dist2 = dot(diff, diff);
+ vec3 diff = pos_world - samppos_world;
+ float dist2 = dot(diff, diff);
- // assume each sample corresponds to an occluding sphere with constant radius, constant x-sectional area
- // --> solid angle shrinking by the square of distance
- //radius is somewhat arbitrary, can approx with just some constant k * 1 / dist^2
- //(k should vary inversely with # of samples, but this is taken care of later)
+ // assume each sample corresponds to an occluding sphere with constant radius, constant x-sectional area
+ // --> solid angle shrinking by the square of distance
+ //radius is somewhat arbitrary, can approx with just some constant k * 1 / dist^2
+ //(k should vary inversely with # of samples, but this is taken care of later)
- //if (dot((samppos_world - 0.05*norm - pos_world), norm) > 0.0) // -0.05*norm to shift sample point back slightly for flat surfaces
- // angle_hidden += min(1.0/dist2, ssao_factor_inv); // dist != 0 follows from conditional. max of 1.0 (= ssao_factor_inv * ssao_factor)
- angle_hidden = angle_hidden + float(dot((samppos_world - 0.05*norm - pos_world), norm) > 0.0) * min(1.0/dist2, ssao_factor_inv);
+ angle_hidden = angle_hidden + float(dot((samppos_world - 0.05*norm - pos_world), norm) > 0.0) * min(1.0/dist2, ssao_factor_inv);
- // 'blocked' samples (significantly closer to camera relative to pos_world) are "no data", not "no occlusion"
- points = points + int(diff.z > -1.0);
- }
+ // 'blocked' samples (significantly closer to camera relative to pos_world) are "no data", not "no occlusion"
+ points = points + int(diff.z > -1.0);
+ }
- angle_hidden = min(ssao_factor*angle_hidden/float(points), 1.0);
+ angle_hidden = min(ssao_factor*angle_hidden/float(points), 1.0);
- ret = (1.0 - (float(points != 0) * angle_hidden));
- ret += max((dist-32.0*32.0)/(32.0*32.0), 0.0);
- }
+ ret = (1.0 - (float(points != 0) * angle_hidden));
return min(ret, 1.0);
}
@@ -117,8 +125,8 @@ void main()
vec3 norm = texture2DRect(normalMap, pos_screen).xyz;
norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm
- gl_FragColor[0] = 1.0;
- gl_FragColor[1] = calcAmbientOcclusion(pos, norm);
- gl_FragColor[2] = 1.0;
- gl_FragColor[3] = 1.0;
+ frag_color[0] = 1.0;
+ frag_color[1] = calcAmbientOcclusion(pos, norm);
+ frag_color[2] = 1.0;
+ frag_color[3] = 1.0;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/sunLightV.glsl b/indra/newview/app_settings/shaders/class1/deferred/sunLightV.glsl
index 9d092d9cea..473d6df8fa 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/sunLightV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/sunLightV.glsl
@@ -2,24 +2,40 @@
* @file sunLightF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-varying vec4 vary_light;
-varying vec2 vary_fragcoord;
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+
+VARYING vec2 vary_fragcoord;
uniform vec2 screen_res;
void main()
{
//transform vertex
- gl_Position = ftransform();
- vec4 pos = gl_ModelViewProjectionMatrix * gl_Vertex;
- vary_fragcoord = (pos.xy * 0.5 + 0.5)*screen_res;
- vec4 tex = gl_MultiTexCoord0;
- tex.w = 1.0;
+ vec4 pos = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ gl_Position = pos;
- vary_light = gl_MultiTexCoord0;
-
- gl_FrontColor = gl_Color;
+ vary_fragcoord = (pos.xy * 0.5 + 0.5)*screen_res;
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/terrainF.glsl b/indra/newview/app_settings/shaders/class1/deferred/terrainF.glsl
index 9ba508a30c..8a5e482e80 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/terrainF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/terrainF.glsl
@@ -2,8 +2,32 @@
* @file terrainF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_data[3];
+#else
+#define frag_data gl_FragData
+#endif
uniform sampler2D detail_0;
uniform sampler2D detail_1;
@@ -11,25 +35,27 @@ uniform sampler2D detail_2;
uniform sampler2D detail_3;
uniform sampler2D alpha_ramp;
-varying vec3 vary_normal;
+VARYING vec3 vary_normal;
+VARYING vec4 vary_texcoord0;
+VARYING vec4 vary_texcoord1;
void main()
{
/// Note: This should duplicate the blending functionality currently used for the terrain rendering.
- vec4 color0 = texture2D(detail_0, gl_TexCoord[0].xy);
- vec4 color1 = texture2D(detail_1, gl_TexCoord[0].xy);
- vec4 color2 = texture2D(detail_2, gl_TexCoord[0].xy);
- vec4 color3 = texture2D(detail_3, gl_TexCoord[0].xy);
+ vec4 color0 = texture2D(detail_0, vary_texcoord0.xy);
+ vec4 color1 = texture2D(detail_1, vary_texcoord0.xy);
+ vec4 color2 = texture2D(detail_2, vary_texcoord0.xy);
+ vec4 color3 = texture2D(detail_3, vary_texcoord0.xy);
- float alpha1 = texture2D(alpha_ramp, gl_TexCoord[0].zw).a;
- float alpha2 = texture2D(alpha_ramp,gl_TexCoord[1].xy).a;
- float alphaFinal = texture2D(alpha_ramp, gl_TexCoord[1].zw).a;
+ float alpha1 = texture2D(alpha_ramp, vary_texcoord0.zw).a;
+ float alpha2 = texture2D(alpha_ramp,vary_texcoord1.xy).a;
+ float alphaFinal = texture2D(alpha_ramp, vary_texcoord1.zw).a;
vec4 outColor = mix( mix(color3, color2, alpha2), mix(color1, color0, alpha1), alphaFinal );
- gl_FragData[0] = vec4(outColor.rgb, 0.0);
- gl_FragData[1] = vec4(outColor.rgb*0.2, 0.2);
+ frag_data[0] = vec4(outColor.rgb, 0.0);
+ frag_data[1] = vec4(0,0,0,0);
vec3 nvn = normalize(vary_normal);
- gl_FragData[2] = vec4(nvn.xy * 0.5 + 0.5, nvn.z, 0.0);
+ frag_data[2] = vec4(nvn.xy * 0.5 + 0.5, nvn.z, 0.0);
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/terrainV.glsl b/indra/newview/app_settings/shaders/class1/deferred/terrainV.glsl
index 789e53b789..5effee4e4e 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/terrainV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/terrainV.glsl
@@ -2,10 +2,44 @@
* @file terrainV.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-varying vec3 vary_normal;
+uniform mat3 normal_matrix;
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec4 diffuse_color;
+ATTRIBUTE vec2 texcoord0;
+ATTRIBUTE vec2 texcoord1;
+
+VARYING vec3 vary_normal;
+
+VARYING vec4 vary_texcoord0;
+VARYING vec4 vary_texcoord1;
+
+uniform vec4 object_plane_s;
+uniform vec4 object_plane_t;
vec4 texgen_object(vec4 vpos, vec4 tc, mat4 mat, vec4 tp0, vec4 tp1)
{
@@ -24,16 +58,16 @@ vec4 texgen_object(vec4 vpos, vec4 tc, mat4 mat, vec4 tp0, vec4 tp1)
void main()
{
//transform vertex
- gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+ gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
- vary_normal = normalize(gl_NormalMatrix * gl_Normal);
+ vary_normal = normalize(normal_matrix * normal);
// Transform and pass tex coords
- gl_TexCoord[0].xy = texgen_object(gl_Vertex, gl_MultiTexCoord0, gl_TextureMatrix[0], gl_ObjectPlaneS[0], gl_ObjectPlaneT[0]).xy;
+ vary_texcoord0.xy = texgen_object(vec4(position, 1.0), vec4(texcoord0,0,1), texture_matrix0, object_plane_s, object_plane_t).xy;
- vec4 t = gl_MultiTexCoord1;
+ vec4 t = vec4(texcoord1,0,1);
- gl_TexCoord[0].zw = t.xy;
- gl_TexCoord[1].xy = t.xy-vec2(2.0, 0.0);
- gl_TexCoord[1].zw = t.xy-vec2(1.0, 0.0);
+ vary_texcoord0.zw = t.xy;
+ vary_texcoord1.xy = t.xy-vec2(2.0, 0.0);
+ vary_texcoord1.zw = t.xy-vec2(1.0, 0.0);
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/treeF.glsl b/indra/newview/app_settings/shaders/class1/deferred/treeF.glsl
index 1c1725a95c..6cf6106b51 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/treeF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/treeF.glsl
@@ -2,18 +2,51 @@
* @file treeF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_data[3];
+#else
+#define frag_data gl_FragData
+#endif
+
uniform sampler2D diffuseMap;
-varying vec3 vary_normal;
+VARYING vec4 vertex_color;
+VARYING vec3 vary_normal;
+VARYING vec2 vary_texcoord0;
+
+uniform float minimum_alpha;
void main()
{
- vec4 col = texture2D(diffuseMap, gl_TexCoord[0].xy);
- gl_FragData[0] = vec4(gl_Color.rgb*col.rgb, col.a <= 0.5 ? 0.0 : 0.005);
- gl_FragData[1] = vec4(0,0,0,0);
+ vec4 col = texture2D(diffuseMap, vary_texcoord0.xy);
+ if (col.a < minimum_alpha)
+ {
+ discard;
+ }
+
+ frag_data[0] = vec4(vertex_color.rgb*col.rgb, 0.0);
+ frag_data[1] = vec4(0,0,0,0);
vec3 nvn = normalize(vary_normal);
- gl_FragData[2] = vec4(nvn.xy * 0.5 + 0.5, nvn.z, 0.0);
+ frag_data[2] = vec4(nvn.xy * 0.5 + 0.5, nvn.z, 0.0);
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/treeShadowF.glsl b/indra/newview/app_settings/shaders/class1/deferred/treeShadowF.glsl
new file mode 100644
index 0000000000..d4d2f5f571
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/treeShadowF.glsl
@@ -0,0 +1,51 @@
+/**
+ * @file treeShadowF.glsl
+ *
+ * $LicenseInfo:firstyear=2005&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2005, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
+uniform float minimum_alpha;
+
+uniform sampler2D diffuseMap;
+
+VARYING vec4 post_pos;
+VARYING vec2 vary_texcoord0;
+
+void main()
+{
+ float alpha = texture2D(diffuseMap, vary_texcoord0.xy).a;
+
+ if (alpha < minimum_alpha)
+ {
+ discard;
+ }
+
+ frag_color = vec4(1,1,1,1);
+
+ gl_FragDepth = max(post_pos.z/post_pos.w*0.5+0.5, 0.0);
+}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/treeShadowV.glsl b/indra/newview/app_settings/shaders/class1/deferred/treeShadowV.glsl
new file mode 100644
index 0000000000..e472a75304
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/treeShadowV.glsl
@@ -0,0 +1,45 @@
+/**
+ * @file treeShadowV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec4 post_pos;
+VARYING vec2 vary_texcoord0;
+
+void main()
+{
+ //transform vertex
+ vec4 pos = modelview_projection_matrix*vec4(position.xyz, 1.0);
+
+ post_pos = pos;
+
+ gl_Position = vec4(pos.x, pos.y, pos.w*0.5, pos.w);
+
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
+}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/treeV.glsl b/indra/newview/app_settings/shaders/class1/deferred/treeV.glsl
index 45832e350f..3b6571a24a 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/treeV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/treeV.glsl
@@ -2,18 +2,46 @@
* @file treeV.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-varying vec3 vary_normal;
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_projection_matrix;
+uniform mat3 normal_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec3 vary_normal;
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
void main()
{
//transform vertex
- gl_Position = ftransform();
- gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
+ gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
- vary_normal = normalize(gl_NormalMatrix * gl_Normal);
+ vary_normal = normalize(normal_matrix * normal);
- gl_FrontColor = gl_Color;
+ vertex_color = vec4(1,1,1,1);
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl b/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl
index ea531de24a..42dc7c0980 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl
@@ -2,11 +2,35 @@
* @file waterF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+
#extension GL_ARB_texture_rectangle : enable
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_data[3];
+#else
+#define frag_data gl_FragData
+#endif
+
vec3 scaleSoftClip(vec3 inColor);
vec3 atmosTransport(vec3 inColor);
@@ -38,10 +62,10 @@ uniform vec2 screen_res;
uniform mat4 norm_mat; //region space to screen space
//bigWave is (refCoord.w, view.w);
-varying vec4 refCoord;
-varying vec4 littleWave;
-varying vec4 view;
-varying vec4 vary_position;
+VARYING vec4 refCoord;
+VARYING vec4 littleWave;
+VARYING vec4 view;
+VARYING vec4 vary_position;
void main()
{
@@ -135,7 +159,7 @@ void main()
//wavef = normalize(wavef);
vec3 screenspacewavef = (norm_mat*vec4(wavef, 1.0)).xyz;
- gl_FragData[0] = vec4(color.rgb, 0.5); // diffuse
- gl_FragData[1] = vec4(0.5,0.5,0.5, 0.95); // speccolor*spec, spec
- gl_FragData[2] = vec4(screenspacewavef.xy*0.5+0.5, screenspacewavef.z, screenspacewavef.z*0.5); // normalxyz, displace
+ frag_data[0] = vec4(color.rgb, 0.5); // diffuse
+ frag_data[1] = vec4(0.5,0.5,0.5, 0.95); // speccolor*spec, spec
+ frag_data[2] = vec4(screenspacewavef.xy*0.5+0.5, screenspacewavef.z, screenspacewavef.z*0.5); // normalxyz, displace
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/waterV.glsl b/indra/newview/app_settings/shaders/class1/deferred/waterV.glsl
index e002d75ebe..9734acf005 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/waterV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/waterV.glsl
@@ -2,9 +2,33 @@
* @file waterV.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+uniform mat4 modelview_matrix;
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+
+
void calcAtmospherics(vec3 inPositionEye);
uniform vec2 d1;
@@ -13,11 +37,11 @@ uniform float time;
uniform vec3 eyeVec;
uniform float waterHeight;
-varying vec4 refCoord;
-varying vec4 littleWave;
-varying vec4 view;
+VARYING vec4 refCoord;
+VARYING vec4 littleWave;
+VARYING vec4 view;
-varying vec4 vary_position;
+VARYING vec4 vary_position;
float wave(vec2 v, float t, float f, vec2 d, float s)
{
@@ -27,43 +51,42 @@ float wave(vec2 v, float t, float f, vec2 d, float s)
void main()
{
//transform vertex
- vec4 position = gl_Vertex;
- mat4 modelViewProj = gl_ModelViewProjectionMatrix;
+ vec4 pos = vec4(position.xyz, 1.0);
+ mat4 modelViewProj = modelview_projection_matrix;
vec4 oPosition;
//get view vector
vec3 oEyeVec;
- oEyeVec.xyz = position.xyz-eyeVec;
+ oEyeVec.xyz = pos.xyz-eyeVec;
float d = length(oEyeVec.xy);
float ld = min(d, 2560.0);
- position.xy = eyeVec.xy + oEyeVec.xy/d*ld;
+ pos.xy = eyeVec.xy + oEyeVec.xy/d*ld;
view.xyz = oEyeVec;
d = clamp(ld/1536.0-0.5, 0.0, 1.0);
d *= d;
- oPosition = position;
+ oPosition = vec4(position, 1.0);
oPosition.z = mix(oPosition.z, max(eyeVec.z*0.75, 0.0), d);
- vary_position = gl_ModelViewMatrix * oPosition;
+ vary_position = modelview_matrix * oPosition;
oPosition = modelViewProj * oPosition;
refCoord.xyz = oPosition.xyz + vec3(0,0,0.2);
//get wave position parameter (create sweeping horizontal waves)
- vec3 v = position.xyz;
+ vec3 v = pos.xyz;
v.x += (cos(v.x*0.08/*+time*0.01*/)+sin(v.y*0.02))*6.0;
//push position for further horizon effect.
- position.xyz = oEyeVec.xyz*(waterHeight/oEyeVec.z);
- position.w = 1.0;
- position = position*gl_ModelViewMatrix;
-
- calcAtmospherics((gl_ModelViewMatrix * gl_Vertex).xyz);
-
+ pos.xyz = oEyeVec.xyz*(waterHeight/oEyeVec.z);
+ pos.w = 1.0;
+ pos = modelview_matrix*pos;
+ calcAtmospherics(pos.xyz);
+
//pass wave parameters to pixel shader
vec2 bigWave = (v.xy) * vec2(0.04,0.04) + d1 * time * 0.055;
//get two normal map (detail map) texture coordinates
diff --git a/indra/newview/app_settings/shaders/class1/effects/glowExtractF.glsl b/indra/newview/app_settings/shaders/class1/effects/glowExtractF.glsl
index 2d40a19fa6..0f5eb288fd 100644
--- a/indra/newview/app_settings/shaders/class1/effects/glowExtractF.glsl
+++ b/indra/newview/app_settings/shaders/class1/effects/glowExtractF.glsl
@@ -2,11 +2,35 @@
* @file glowExtractF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+
#extension GL_ARB_texture_rectangle : enable
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
uniform sampler2DRect diffuseMap;
uniform float minLuminance;
uniform float maxExtractAlpha;
@@ -14,15 +38,17 @@ uniform vec3 lumWeights;
uniform vec3 warmthWeights;
uniform float warmthAmount;
+VARYING vec2 vary_texcoord0;
+
void main()
{
- vec4 col = texture2DRect(diffuseMap, gl_TexCoord[0].xy);
-
+ vec4 col = texture2DRect(diffuseMap, vary_texcoord0.xy);
/// CALCULATING LUMINANCE (Using NTSC lum weights)
/// http://en.wikipedia.org/wiki/Luma_%28video%29
float lum = smoothstep(minLuminance, minLuminance+1.0, dot(col.rgb, lumWeights ) );
float warmth = smoothstep(minLuminance, minLuminance+1.0, max(col.r * warmthWeights.r, max(col.g * warmthWeights.g, col.b * warmthWeights.b)) );
- gl_FragColor.rgb = col.rgb;
- gl_FragColor.a = max(col.a, mix(lum, warmth, warmthAmount) * maxExtractAlpha);
+ frag_color.rgb = col.rgb;
+ frag_color.a = max(col.a, mix(lum, warmth, warmthAmount) * maxExtractAlpha);
+
}
diff --git a/indra/newview/app_settings/shaders/class1/effects/glowExtractV.glsl b/indra/newview/app_settings/shaders/class1/effects/glowExtractV.glsl
index fe45898ed2..1396dc6973 100644
--- a/indra/newview/app_settings/shaders/class1/effects/glowExtractV.glsl
+++ b/indra/newview/app_settings/shaders/class1/effects/glowExtractV.glsl
@@ -2,13 +2,37 @@
* @file glowExtractV.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec2 vary_texcoord0;
void main()
{
- gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+ gl_Position = modelview_projection_matrix * vec4(position, 1.0);
- gl_TexCoord[0].xy = gl_MultiTexCoord0.xy;
+ vary_texcoord0.xy = texcoord0;
}
diff --git a/indra/newview/app_settings/shaders/class1/effects/glowF.glsl b/indra/newview/app_settings/shaders/class1/effects/glowF.glsl
index 5b4e8b3ecc..c1f6af9f57 100644
--- a/indra/newview/app_settings/shaders/class1/effects/glowF.glsl
+++ b/indra/newview/app_settings/shaders/class1/effects/glowF.glsl
@@ -2,12 +2,41 @@
* @file glowF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
uniform sampler2D diffuseMap;
uniform float glowStrength;
+VARYING vec4 vary_texcoord0;
+VARYING vec4 vary_texcoord1;
+VARYING vec4 vary_texcoord2;
+VARYING vec4 vary_texcoord3;
+
void main()
{
@@ -18,14 +47,14 @@ void main()
kern[0] = 0.25; kern[1] = 0.5; kern[2] = 0.8; kern[3] = 1.0;
kern[4] = 1.0; kern[5] = 0.8; kern[6] = 0.5; kern[7] = 0.25;
- col += kern[0] * texture2D(diffuseMap, gl_TexCoord[0].xy);
- col += kern[1] * texture2D(diffuseMap, gl_TexCoord[1].xy);
- col += kern[2] * texture2D(diffuseMap, gl_TexCoord[2].xy);
- col += kern[3] * texture2D(diffuseMap, gl_TexCoord[3].xy);
- col += kern[4] * texture2D(diffuseMap, gl_TexCoord[0].zw);
- col += kern[5] * texture2D(diffuseMap, gl_TexCoord[1].zw);
- col += kern[6] * texture2D(diffuseMap, gl_TexCoord[2].zw);
- col += kern[7] * texture2D(diffuseMap, gl_TexCoord[3].zw);
+ col += kern[0] * texture2D(diffuseMap, vary_texcoord0.xy);
+ col += kern[1] * texture2D(diffuseMap, vary_texcoord1.xy);
+ col += kern[2] * texture2D(diffuseMap, vary_texcoord2.xy);
+ col += kern[3] * texture2D(diffuseMap, vary_texcoord3.xy);
+ col += kern[4] * texture2D(diffuseMap, vary_texcoord0.zw);
+ col += kern[5] * texture2D(diffuseMap, vary_texcoord1.zw);
+ col += kern[6] * texture2D(diffuseMap, vary_texcoord2.zw);
+ col += kern[7] * texture2D(diffuseMap, vary_texcoord3.zw);
- gl_FragColor = vec4(col.rgb * glowStrength, col.a);
+ frag_color = vec4(col.rgb * glowStrength, col.a);
}
diff --git a/indra/newview/app_settings/shaders/class1/effects/glowV.glsl b/indra/newview/app_settings/shaders/class1/effects/glowV.glsl
index 97696e4719..cdb2281578 100644
--- a/indra/newview/app_settings/shaders/class1/effects/glowV.glsl
+++ b/indra/newview/app_settings/shaders/class1/effects/glowV.glsl
@@ -2,21 +2,49 @@
* @file glowV.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec2 texcoord0;
uniform vec2 glowDelta;
+VARYING vec4 vary_texcoord0;
+VARYING vec4 vary_texcoord1;
+VARYING vec4 vary_texcoord2;
+VARYING vec4 vary_texcoord3;
+
void main()
{
- gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+ gl_Position = modelview_projection_matrix * vec4(position, 1.0);
- gl_TexCoord[0].xy = gl_MultiTexCoord0.xy + glowDelta*(-3.5);
- gl_TexCoord[1].xy = gl_MultiTexCoord0.xy + glowDelta*(-2.5);
- gl_TexCoord[2].xy = gl_MultiTexCoord0.xy + glowDelta*(-1.5);
- gl_TexCoord[3].xy = gl_MultiTexCoord0.xy + glowDelta*(-0.5);
- gl_TexCoord[0].zw = gl_MultiTexCoord0.xy + glowDelta*(0.5);
- gl_TexCoord[1].zw = gl_MultiTexCoord0.xy + glowDelta*(1.5);
- gl_TexCoord[2].zw = gl_MultiTexCoord0.xy + glowDelta*(2.5);
- gl_TexCoord[3].zw = gl_MultiTexCoord0.xy + glowDelta*(3.5);
+ vary_texcoord0.xy = texcoord0 + glowDelta*(-3.5);
+ vary_texcoord1.xy = texcoord0 + glowDelta*(-2.5);
+ vary_texcoord2.xy = texcoord0 + glowDelta*(-1.5);
+ vary_texcoord3.xy = texcoord0 + glowDelta*(-0.5);
+ vary_texcoord0.zw = texcoord0 + glowDelta*(0.5);
+ vary_texcoord1.zw = texcoord0 + glowDelta*(1.5);
+ vary_texcoord2.zw = texcoord0 + glowDelta*(2.5);
+ vary_texcoord3.zw = texcoord0 + glowDelta*(3.5);
}
diff --git a/indra/newview/app_settings/shaders/class1/environment/terrainF.glsl b/indra/newview/app_settings/shaders/class1/environment/terrainF.glsl
index 3a852239fb..668a710c04 100644
--- a/indra/newview/app_settings/shaders/class1/environment/terrainF.glsl
+++ b/indra/newview/app_settings/shaders/class1/environment/terrainF.glsl
@@ -1,21 +1,66 @@
-/**
+/**
* @file terrainF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
-uniform sampler2D detail0;
-uniform sampler2D detail1;
-uniform sampler2D alphaRamp;
+VARYING vec4 vertex_color;
+VARYING vec4 vary_texcoord0;
+VARYING vec4 vary_texcoord1;
-void main()
+uniform sampler2D detail_0;
+uniform sampler2D detail_1;
+uniform sampler2D detail_2;
+uniform sampler2D detail_3;
+uniform sampler2D alpha_ramp;
+
+vec3 atmosLighting(vec3 light);
+
+vec3 scaleSoftClip(vec3 color);
+
+void main()
{
- float a = texture2D(alphaRamp, gl_TexCoord[1].xy).a;
- vec3 color = mix(texture2D(detail1, gl_TexCoord[2].xy).rgb,
- texture2D(detail0, gl_TexCoord[0].xy).rgb,
- a);
+ /// Note: This should duplicate the blending functionality currently used for the terrain rendering.
+
+ /// TODO Confirm tex coords and bind them appropriately in vert shader.
+ vec4 color0 = texture2D(detail_0, vary_texcoord0.xy);
+ vec4 color1 = texture2D(detail_1, vary_texcoord0.xy);
+ vec4 color2 = texture2D(detail_2, vary_texcoord0.xy);
+ vec4 color3 = texture2D(detail_3, vary_texcoord0.xy);
- gl_FragColor.rgb = color;
- gl_FragColor.a = texture2D(alphaRamp, gl_TexCoord[3].xy).a;
+ float alpha1 = texture2D(alpha_ramp, vary_texcoord0.zw).a;
+ float alpha2 = texture2D(alpha_ramp,vary_texcoord1.xy).a;
+ float alphaFinal = texture2D(alpha_ramp, vary_texcoord1.zw).a;
+ vec4 outColor = mix( mix(color3, color2, alpha2), mix(color1, color0, alpha1), alphaFinal );
+
+ /// Add WL Components
+ outColor.rgb = atmosLighting(outColor.rgb * vertex_color.rgb);
+
+ frag_color = vec4(scaleSoftClip(outColor.rgb), 1.0);
}
+
diff --git a/indra/newview/app_settings/shaders/class1/environment/terrainV.glsl b/indra/newview/app_settings/shaders/class1/environment/terrainV.glsl
index 0d781fd849..d09c5f9247 100644
--- a/indra/newview/app_settings/shaders/class1/environment/terrainV.glsl
+++ b/indra/newview/app_settings/shaders/class1/environment/terrainV.glsl
@@ -1,10 +1,47 @@
-/**
+/**
* @file terrainV.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+uniform mat3 normal_matrix;
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_matrix;
+uniform mat4 modelview_projection_matrix;
+
+uniform vec4 object_plane_t;
+uniform vec4 object_plane_s;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec2 texcoord0;
+ATTRIBUTE vec2 texcoord1;
+
+VARYING vec4 vertex_color;
+VARYING vec4 vary_texcoord0;
+VARYING vec4 vary_texcoord1;
+
+void calcAtmospherics(vec3 inPositionEye);
+
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
vec4 texgen_object(vec4 vpos, vec4 tc, mat4 mat, vec4 tp0, vec4 tp1)
@@ -24,17 +61,27 @@ vec4 texgen_object(vec4 vpos, vec4 tc, mat4 mat, vec4 tp0, vec4 tp1)
void main()
{
//transform vertex
- gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
-
- vec4 pos = gl_ModelViewMatrix * gl_Vertex;
- vec3 norm = normalize(gl_NormalMatrix * gl_Normal);
+ gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
+
+ vec4 pos = modelview_matrix * vec4(position.xyz, 1.0);
+ vec3 norm = normalize(normal_matrix * normal);
+
+ calcAtmospherics(pos.xyz);
+
+ /// Potentially better without it for water.
+ pos /= pos.w;
+
+ vec4 color = calcLighting(pos.xyz, norm, vec4(1,1,1,1), vec4(0));
- vec4 color = calcLighting(pos.xyz, norm, vec4(1,1,1,1), gl_Color);
+ vertex_color = color;
+
+ // Transform and pass tex coords
+ vary_texcoord0.xy = texgen_object(vec4(position.xyz, 1.0), vec4(texcoord0,0,1), texture_matrix0, object_plane_s, object_plane_t).xy;
- gl_FrontColor = color;
+ vec4 t = vec4(texcoord1,0,1);
- gl_TexCoord[0] = texgen_object(gl_Vertex,gl_MultiTexCoord0,gl_TextureMatrix[0],gl_ObjectPlaneS[0],gl_ObjectPlaneT[0]);
- gl_TexCoord[1] = gl_TextureMatrix[1]*gl_MultiTexCoord1;
- gl_TexCoord[2] = texgen_object(gl_Vertex,gl_MultiTexCoord2,gl_TextureMatrix[2],gl_ObjectPlaneS[2],gl_ObjectPlaneT[2]);
- gl_TexCoord[3] = gl_TextureMatrix[3]*gl_MultiTexCoord3;
+ vary_texcoord0.zw = t.xy;
+ vary_texcoord1.xy = t.xy-vec2(2.0, 0.0);
+ vary_texcoord1.zw = t.xy-vec2(1.0, 0.0);
}
+
diff --git a/indra/newview/app_settings/shaders/class1/environment/terrainWaterF.glsl b/indra/newview/app_settings/shaders/class1/environment/terrainWaterF.glsl
index 99c340d91a..a956562396 100644
--- a/indra/newview/app_settings/shaders/class1/environment/terrainWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class1/environment/terrainWaterF.glsl
@@ -1,23 +1,67 @@
-/**
+/**
* @file terrainWaterF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-// this class1 shader is just a copy of terrainF
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
-uniform sampler2D detail0;
-uniform sampler2D detail1;
-uniform sampler2D alphaRamp;
+VARYING vec4 vertex_color;
+VARYING vec4 vary_texcoord0;
+VARYING vec4 vary_texcoord1;
-void main()
+uniform sampler2D detail_0;
+uniform sampler2D detail_1;
+uniform sampler2D detail_2;
+uniform sampler2D detail_3;
+uniform sampler2D alpha_ramp;
+
+vec3 atmosLighting(vec3 light);
+
+vec4 applyWaterFog(vec4 color);
+
+void main()
{
- float a = texture2D(alphaRamp, gl_TexCoord[1].xy).a;
- vec3 color = mix(texture2D(detail1, gl_TexCoord[2].xy).rgb,
- texture2D(detail0, gl_TexCoord[0].xy).rgb,
- a);
+ /// Note: This should duplicate the blending functionality currently used for the terrain rendering.
+
+ /// TODO Confirm tex coords and bind them appropriately in vert shader.
+ vec4 color0 = texture2D(detail_0, vary_texcoord0.xy);
+ vec4 color1 = texture2D(detail_1, vary_texcoord0.xy);
+ vec4 color2 = texture2D(detail_2, vary_texcoord0.xy);
+ vec4 color3 = texture2D(detail_3, vary_texcoord0.xy);
- gl_FragColor.rgb = color;
- gl_FragColor.a = texture2D(alphaRamp, gl_TexCoord[3].xy).a;
+ float alpha1 = texture2D(alpha_ramp, vary_texcoord0.zw).a;
+ float alpha2 = texture2D(alpha_ramp,vary_texcoord1.xy).a;
+ float alphaFinal = texture2D(alpha_ramp, vary_texcoord1.zw).a;
+ vec4 outColor = mix( mix(color3, color2, alpha2), mix(color1, color0, alpha1), alphaFinal );
+
+ /// Add WL Components
+ outColor.rgb = atmosLighting(outColor.rgb * vertex_color.rgb);
+
+ outColor = applyWaterFog(outColor);
+ frag_color = outColor;
}
+
diff --git a/indra/newview/app_settings/shaders/class1/environment/underWaterF.glsl b/indra/newview/app_settings/shaders/class1/environment/underWaterF.glsl
index 66458ec66d..0d8dab0a41 100644
--- a/indra/newview/app_settings/shaders/class1/environment/underWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class1/environment/underWaterF.glsl
@@ -2,37 +2,105 @@
* @file underWaterF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
uniform sampler2D diffuseMap;
uniform sampler2D bumpMap;
uniform sampler2D screenTex;
+uniform sampler2D refTex;
+uniform sampler2D screenDepth;
+uniform vec4 fogCol;
+uniform vec3 lightDir;
+uniform vec3 specular;
+uniform float lightExp;
+uniform vec2 fbScale;
uniform float refScale;
+uniform float znear;
+uniform float zfar;
+uniform float kd;
+uniform vec4 waterPlane;
+uniform vec3 eyeVec;
uniform vec4 waterFogColor;
+uniform float waterFogDensity;
+uniform float waterFogKS;
+uniform vec2 screenRes;
//bigWave is (refCoord.w, view.w);
-varying vec4 refCoord;
-varying vec4 littleWave;
-varying vec4 view;
+VARYING vec4 refCoord;
+VARYING vec4 littleWave;
+VARYING vec4 view;
-void main()
+vec4 applyWaterFog(vec4 color, vec3 viewVec)
{
- vec4 color;
+ //normalize view vector
+ vec3 view = normalize(viewVec);
+ float es = -view.z;
+
+ //find intersection point with water plane and eye vector
- //get bigwave normal
- vec3 wavef = texture2D(bumpMap, vec2(refCoord.w, view.w)).xyz*2.0;
-
- //get detail normals
- vec3 dcol = texture2D(bumpMap, littleWave.xy).rgb*0.75;
- dcol += texture2D(bumpMap, littleWave.zw).rgb*1.25;
-
- //interpolate between big waves and little waves (big waves in deep water)
- wavef = (wavef+dcol)*0.5;
+ //get eye depth
+ float e0 = max(-waterPlane.w, 0.0);
+
+ //get object depth
+ float depth = length(viewVec);
+
+ //get "thickness" of water
+ float l = max(depth, 0.1);
+
+ float kd = waterFogDensity;
+ float ks = waterFogKS;
+ vec4 kc = waterFogColor;
+
+ float F = 0.98;
+
+ float t1 = -kd * pow(F, ks * e0);
+ float t2 = kd + ks * es;
+ float t3 = pow(F, t2*l) - 1.0;
+
+ float L = min(t1/t2*t3, 1.0);
+
+ float D = pow(0.98, l*kd);
+ //return vec4(1.0, 0.0, 1.0, 1.0);
+ return color * D + kc * L;
+ //depth /= 10.0;
+ //return vec4(depth,depth,depth,0.0);
+}
- //crunch normal to range [-1,1]
- wavef -= vec3(1,1,1);
+void main()
+{
+ vec4 color;
+
+ //get detail normals
+ vec3 wave1 = texture2D(bumpMap, vec2(refCoord.w, view.w)).xyz*2.0-1.0;
+ vec3 wave2 = texture2D(bumpMap, littleWave.xy).xyz*2.0-1.0;
+ vec3 wave3 = texture2D(bumpMap, littleWave.zw).xyz*2.0-1.0;
+ vec3 wavef = normalize(wave1+wave2+wave3);
//figure out distortion vector (ripply)
vec2 distort = (refCoord.xy/refCoord.z) * 0.5 + 0.5;
@@ -40,6 +108,5 @@ void main()
vec4 fb = texture2D(screenTex, distort);
- gl_FragColor.rgb = mix(waterFogColor.rgb, fb.rgb, waterFogColor.a * 0.001 + 0.999);
- gl_FragColor.a = fb.a;
+ frag_color = applyWaterFog(fb,view.xyz);
}
diff --git a/indra/newview/app_settings/shaders/class1/environment/waterF.glsl b/indra/newview/app_settings/shaders/class1/environment/waterF.glsl
index 5f1fbee1df..79bffab745 100644
--- a/indra/newview/app_settings/shaders/class1/environment/waterF.glsl
+++ b/indra/newview/app_settings/shaders/class1/environment/waterF.glsl
@@ -2,21 +2,42 @@
* @file waterF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
vec3 scaleSoftClip(vec3 inColor);
vec3 atmosTransport(vec3 inColor);
-vec3 applyWaterFog(vec4 inColor);
-uniform sampler2D diffuseMap;
uniform sampler2D bumpMap;
uniform sampler2D screenTex;
uniform sampler2D refTex;
uniform float sunAngle;
uniform float sunAngle2;
-uniform float scaledAngle;
uniform vec3 lightDir;
uniform vec3 specular;
uniform float lightExp;
@@ -27,69 +48,94 @@ uniform vec3 normScale;
uniform float fresnelScale;
uniform float fresnelOffset;
uniform float blurMultiplier;
-uniform vec4 fogCol;
+
//bigWave is (refCoord.w, view.w);
-varying vec4 refCoord;
-varying vec4 littleWave;
-varying vec4 view;
+VARYING vec4 refCoord;
+VARYING vec4 littleWave;
+VARYING vec4 view;
void main()
{
- vec3 viewVec = view.xyz;
vec4 color;
- float dist = length(viewVec.xy);
+ float dist = length(view.xy);
//normalize view vector
- viewVec = normalize(viewVec);
+ vec3 viewVec = normalize(view.xyz);
//get wave normals
- vec3 wavef = texture2D(bumpMap, vec2(refCoord.w, view.w)).xyz*2.0;
-
- //get detail normals
- vec3 dcol = texture2D(bumpMap, littleWave.xy).rgb*0.75;
- dcol += texture2D(bumpMap, littleWave.zw).rgb*1.25;
-
- //interpolate between big waves and little waves (big waves in deep water)
- wavef = (wavef + dcol) * 0.5;
-
- //crunch normal to range [-1,1]
- wavef -= vec3(1,1,1);
- wavef = normalize(wavef);
-
+ vec3 wave1 = texture2D(bumpMap, vec2(refCoord.w, view.w)).xyz*2.0-1.0;
+ vec3 wave2 = texture2D(bumpMap, littleWave.xy).xyz*2.0-1.0;
+ vec3 wave3 = texture2D(bumpMap, littleWave.zw).xyz*2.0-1.0;
//get base fresnel components
- float df = dot(viewVec,wavef) * fresnelScale + fresnelOffset;
+ vec3 df = vec3(
+ dot(viewVec, wave1),
+ dot(viewVec, (wave2 + wave3) * 0.5),
+ dot(viewVec, wave3)
+ ) * fresnelScale + fresnelOffset;
+ df *= df;
vec2 distort = (refCoord.xy/refCoord.z) * 0.5 + 0.5;
float dist2 = dist;
dist = max(dist, 5.0);
+ float dmod = sqrt(dist);
+
+ vec2 dmod_scale = vec2(dmod*dmod, dmod);
+
//get reflected color
- vec2 refdistort = wavef.xy*dot(normScale, vec3(0.333));
- vec2 refvec = distort+refdistort/dist;
- vec4 refcol = texture2D(refTex, refvec);
+ vec2 refdistort1 = wave1.xy*normScale.x;
+ vec2 refvec1 = distort+refdistort1/dmod_scale;
+ vec4 refcol1 = texture2D(refTex, refvec1);
+
+ vec2 refdistort2 = wave2.xy*normScale.y;
+ vec2 refvec2 = distort+refdistort2/dmod_scale;
+ vec4 refcol2 = texture2D(refTex, refvec2);
+
+ vec2 refdistort3 = wave3.xy*normScale.z;
+ vec2 refvec3 = distort+refdistort3/dmod_scale;
+ vec4 refcol3 = texture2D(refTex, refvec3);
+
+ vec4 refcol = refcol1 + refcol2 + refcol3;
+ float df1 = df.x + df.y + df.z;
+ refcol *= df1 * 0.333;
+
+ vec3 wavef = (wave1 + wave2 * 0.4 + wave3 * 0.6) * 0.5;
+
+ wavef.z *= max(-viewVec.z, 0.1);
+ wavef = normalize(wavef);
+
+ float df2 = dot(viewVec, wavef) * fresnelScale+fresnelOffset;
+
+ vec2 refdistort4 = wavef.xy*0.125;
+ refdistort4.y -= abs(refdistort4.y);
+ vec2 refvec4 = distort+refdistort4/dmod;
+ float dweight = min(dist2*blurMultiplier, 1.0);
+ vec4 baseCol = texture2D(refTex, refvec4);
+ refcol = mix(baseCol*df2, refcol, dweight);
//get specular component
float spec = clamp(dot(lightDir, (reflect(viewVec,wavef))),0.0,1.0);
-
+
//harden specular
- spec = pow(spec, lightExp);
+ spec = pow(spec, 128.0);
//figure out distortion vector (ripply)
- vec2 distort2 = distort+wavef.xy*refScale/max(dist*df, 1.0);
+ vec2 distort2 = distort+wavef.xy*refScale/max(dmod*df1, 1.0);
vec4 fb = texture2D(screenTex, distort2);
//mix with reflection
- color.rgb = mix(mix(fogCol.rgb, fb.rgb, fogCol.a), refcol.rgb, df);
+ // Note we actually want to use just df1, but multiplying by 0.999999 gets around and nvidia compiler bug
+ color.rgb = mix(fb.rgb, refcol.rgb, df1 * 0.99999);
color.rgb += spec * specular;
- //color.rgb = applyWaterFog(color);//atmosTransport(color.rgb);
+ color.rgb = atmosTransport(color.rgb);
color.rgb = scaleSoftClip(color.rgb);
color.a = spec * sunAngle2;
- gl_FragColor = color;
+ frag_color = color;
}
diff --git a/indra/newview/app_settings/shaders/class1/environment/waterFogF.glsl b/indra/newview/app_settings/shaders/class1/environment/waterFogF.glsl
index e5eb25f3fa..4bdfce9260 100644
--- a/indra/newview/app_settings/shaders/class1/environment/waterFogF.glsl
+++ b/indra/newview/app_settings/shaders/class1/environment/waterFogF.glsl
@@ -2,19 +2,73 @@
* @file waterFogF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+
+
+
+uniform vec4 lightnorm;
+uniform vec4 waterPlane;
+uniform vec4 waterFogColor;
+uniform float waterFogDensity;
+uniform float waterFogKS;
+
+vec3 getPositionEye();
vec4 applyWaterFog(vec4 color)
{
- // GL_EXP2 Fog
- //float fog = exp(-gl_Fog.density * gl_Fog.density * gl_FogFragCoord * gl_FogFragCoord);
- // GL_EXP Fog
- // float fog = exp(-gl_Fog.density * gl_FogFragCoord);
- // GL_LINEAR Fog
- float fog = (gl_Fog.end - gl_FogFragCoord) * gl_Fog.scale;
- fog = clamp(fog, 0.0, 1.0);
- color.rgb = mix(gl_Fog.color.rgb, color.rgb, fog);
+ //normalize view vector
+ vec3 view = normalize(getPositionEye());
+ float es = -(dot(view, waterPlane.xyz));
+
+ //find intersection point with water plane and eye vector
+
+ //get eye depth
+ float e0 = max(-waterPlane.w, 0.0);
+
+ vec3 int_v = waterPlane.w > 0.0 ? view * waterPlane.w/es : vec3(0.0, 0.0, 0.0);
+
+ //get object depth
+ float depth = length(getPositionEye() - int_v);
+
+ //get "thickness" of water
+ float l = max(depth, 0.1);
+
+ float kd = waterFogDensity;
+ float ks = waterFogKS;
+ vec4 kc = waterFogColor;
+
+ float F = 0.98;
+
+ float t1 = -kd * pow(F, ks * e0);
+ float t2 = kd + ks * es;
+ float t3 = pow(F, t2*l) - 1.0;
+
+ float L = min(t1/t2*t3, 1.0);
+
+ float D = pow(0.98, l*kd);
+
+ color.rgb = color.rgb * D + kc.rgb * L;
+ color.a = kc.a + color.a;
+
return color;
}
diff --git a/indra/newview/app_settings/shaders/class1/environment/waterV.glsl b/indra/newview/app_settings/shaders/class1/environment/waterV.glsl
index 608a7a5807..f66ba1d2d9 100644
--- a/indra/newview/app_settings/shaders/class1/environment/waterV.glsl
+++ b/indra/newview/app_settings/shaders/class1/environment/waterV.glsl
@@ -2,9 +2,32 @@
* @file waterV.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+uniform mat4 modelview_matrix;
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+
void calcAtmospherics(vec3 inPositionEye);
uniform vec2 d1;
@@ -13,9 +36,9 @@ uniform float time;
uniform vec3 eyeVec;
uniform float waterHeight;
-varying vec4 refCoord;
-varying vec4 littleWave;
-varying vec4 view;
+VARYING vec4 refCoord;
+VARYING vec4 littleWave;
+VARYING vec4 view;
float wave(vec2 v, float t, float f, vec2 d, float s)
{
@@ -25,8 +48,7 @@ float wave(vec2 v, float t, float f, vec2 d, float s)
void main()
{
//transform vertex
- vec4 position = gl_Vertex;
- mat4 modelViewProj = gl_ModelViewProjectionMatrix;
+ mat4 modelViewProj = modelview_projection_matrix;
vec4 oPosition;
@@ -37,27 +59,29 @@ void main()
float d = length(oEyeVec.xy);
float ld = min(d, 2560.0);
- position.xy = eyeVec.xy + oEyeVec.xy/d*ld;
+ vec3 lpos = position;
+ lpos.xy = eyeVec.xy + oEyeVec.xy/d*ld;
view.xyz = oEyeVec;
d = clamp(ld/1536.0-0.5, 0.0, 1.0);
d *= d;
- oPosition = position;
+ oPosition = vec4(lpos, 1.0);
oPosition.z = mix(oPosition.z, max(eyeVec.z*0.75, 0.0), d);
oPosition = modelViewProj * oPosition;
refCoord.xyz = oPosition.xyz + vec3(0,0,0.2);
//get wave position parameter (create sweeping horizontal waves)
- vec3 v = position.xyz;
+ vec3 v = lpos;
v.x += (cos(v.x*0.08/*+time*0.01*/)+sin(v.y*0.02))*6.0;
//push position for further horizon effect.
- position.xyz = oEyeVec.xyz*(waterHeight/oEyeVec.z);
- position.w = 1.0;
- position = position*gl_ModelViewMatrix;
+ vec4 pos;
+ pos.xyz = oEyeVec.xyz*(waterHeight/oEyeVec.z);
+ pos.w = 1.0;
+ pos = modelview_matrix*pos;
- calcAtmospherics((gl_ModelViewMatrix * gl_Vertex).xyz);
+ calcAtmospherics(pos.xyz);
//pass wave parameters to pixel shader
diff --git a/indra/newview/app_settings/shaders/class1/interface/alphamaskF.glsl b/indra/newview/app_settings/shaders/class1/interface/alphamaskF.glsl
new file mode 100644
index 0000000000..f520f301d9
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/interface/alphamaskF.glsl
@@ -0,0 +1,48 @@
+/**
+ * @file alphamaskF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
+uniform sampler2D diffuseMap;
+
+uniform float minimum_alpha;
+
+VARYING vec2 vary_texcoord0;
+VARYING vec4 vertex_color;
+
+void main()
+{
+ vec4 col = vertex_color*texture2D(diffuseMap, vary_texcoord0.xy);
+ if (col.a < minimum_alpha)
+ {
+ discard;
+ }
+
+ frag_color = col;
+}
diff --git a/indra/newview/app_settings/shaders/class1/interface/alphamaskV.glsl b/indra/newview/app_settings/shaders/class1/interface/alphamaskV.glsl
new file mode 100644
index 0000000000..3580d1f27b
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/interface/alphamaskV.glsl
@@ -0,0 +1,42 @@
+/**
+ * @file alphamaskV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec4 diffuse_color;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+void main()
+{
+ gl_Position = modelview_projection_matrix * vec4(position, 1);
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
+ vertex_color = diffuse_color;
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/interface/customalphaF.glsl b/indra/newview/app_settings/shaders/class1/interface/customalphaF.glsl
new file mode 100644
index 0000000000..a96d04cc39
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/interface/customalphaF.glsl
@@ -0,0 +1,44 @@
+/**
+ * @file customalphaF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
+uniform sampler2D diffuseMap;
+
+uniform float custom_alpha;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+void main()
+{
+ vec4 color = vertex_color*texture2D(diffuseMap, vary_texcoord0.xy);
+ color.a *= custom_alpha;
+ frag_color = color;
+}
diff --git a/indra/newview/app_settings/shaders/class1/interface/customalphaV.glsl b/indra/newview/app_settings/shaders/class1/interface/customalphaV.glsl
new file mode 100644
index 0000000000..890474d6d8
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/interface/customalphaV.glsl
@@ -0,0 +1,41 @@
+/**
+ * @file customalphaV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec4 diffuse_color;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+void main()
+{
+ gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ vary_texcoord0 = texcoord0;
+ vertex_color = diffuse_color;
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/interface/debugF.glsl b/indra/newview/app_settings/shaders/class1/interface/debugF.glsl
new file mode 100644
index 0000000000..67c6baddbb
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/interface/debugF.glsl
@@ -0,0 +1,37 @@
+/**
+ * @file debugF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
+uniform vec4 color;
+
+void main()
+{
+ frag_color = color;
+}
diff --git a/indra/newview/app_settings/shaders/class1/interface/debugV.glsl b/indra/newview/app_settings/shaders/class1/interface/debugV.glsl
new file mode 100644
index 0000000000..f4d704577a
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/interface/debugV.glsl
@@ -0,0 +1,34 @@
+/**
+ * @file debugV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+
+void main()
+{
+ gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/interface/glowcombineF.glsl b/indra/newview/app_settings/shaders/class1/interface/glowcombineF.glsl
new file mode 100644
index 0000000000..ed803de277
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/interface/glowcombineF.glsl
@@ -0,0 +1,44 @@
+/**
+ * @file glowcombineF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
+#extension GL_ARB_texture_rectangle : enable
+
+uniform sampler2D glowMap;
+uniform sampler2DRect screenMap;
+
+VARYING vec2 vary_texcoord0;
+VARYING vec2 vary_texcoord1;
+
+void main()
+{
+ frag_color = texture2D(glowMap, vary_texcoord0.xy) +
+ texture2DRect(screenMap, vary_texcoord1.xy);
+}
diff --git a/indra/newview/app_settings/shaders/class1/interface/glowcombineFXAAF.glsl b/indra/newview/app_settings/shaders/class1/interface/glowcombineFXAAF.glsl
new file mode 100644
index 0000000000..59520bb99f
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/interface/glowcombineFXAAF.glsl
@@ -0,0 +1,44 @@
+/**
+ * @file glowcombineFXAAF.glsl
+ *
+ * $LicenseInfo:firstyear=2005&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2005, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#extension GL_ARB_texture_rectangle : enable
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
+uniform sampler2DRect diffuseRect;
+
+uniform vec2 screen_res;
+VARYING vec2 vary_tc;
+
+void main()
+{
+ vec3 col = texture2DRect(diffuseRect, vary_tc*screen_res).rgb;
+
+ frag_color = vec4(col.rgb, dot(col.rgb, vec3(0.299, 0.587, 0.144)));
+}
diff --git a/indra/newview/app_settings/shaders/class1/interface/glowcombineFXAAV.glsl b/indra/newview/app_settings/shaders/class1/interface/glowcombineFXAAV.glsl
new file mode 100644
index 0000000000..058f3b1b82
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/interface/glowcombineFXAAV.glsl
@@ -0,0 +1,39 @@
+/**
+ * @file glowcombineFXAAV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+
+VARYING vec2 vary_tc;
+
+void main()
+{
+ vec4 pos = modelview_projection_matrix*vec4(position.xyz, 1.0);
+ gl_Position = pos;
+
+ vary_tc = pos.xy*0.5+0.5;
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/interface/glowcombineV.glsl b/indra/newview/app_settings/shaders/class1/interface/glowcombineV.glsl
new file mode 100644
index 0000000000..f7970b7f78
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/interface/glowcombineV.glsl
@@ -0,0 +1,41 @@
+/**
+ * @file glowcombineV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec2 texcoord0;
+ATTRIBUTE vec2 texcoord1;
+
+VARYING vec2 vary_texcoord0;
+VARYING vec2 vary_texcoord1;
+
+void main()
+{
+ gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ vary_texcoord0 = texcoord0;
+ vary_texcoord1 = texcoord1;
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/interface/highlightF.glsl b/indra/newview/app_settings/shaders/class1/interface/highlightF.glsl
index 5ac9e96601..6cc9bbbea2 100644
--- a/indra/newview/app_settings/shaders/class1/interface/highlightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/interface/highlightF.glsl
@@ -2,12 +2,39 @@
* @file highlightF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+uniform vec4 color;
uniform sampler2D diffuseMap;
+VARYING vec2 vary_texcoord0;
+
void main()
{
- gl_FragColor = gl_Color*texture2D(diffuseMap, gl_TexCoord[0].xy);
+ frag_color = color*texture2D(diffuseMap, vary_texcoord0.xy);
}
diff --git a/indra/newview/app_settings/shaders/class1/interface/highlightV.glsl b/indra/newview/app_settings/shaders/class1/interface/highlightV.glsl
index c5f69c4ad4..9bf7b60eb7 100644
--- a/indra/newview/app_settings/shaders/class1/interface/highlightV.glsl
+++ b/indra/newview/app_settings/shaders/class1/interface/highlightV.glsl
@@ -2,24 +2,39 @@
* @file highlightV.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec2 vary_texcoord0;
+
void main()
{
//transform vertex
- gl_Position = ftransform();
- vec3 pos = (gl_ModelViewMatrix * gl_Vertex).xyz;
- pos = normalize(pos);
- float d = dot(pos, normalize(gl_NormalMatrix * gl_Normal));
- d *= d;
- d = 1.0 - d;
- d *= d;
-
- d = min(d, gl_Color.a*2.0);
-
- gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
- gl_FrontColor.rgb = gl_Color.rgb;
- gl_FrontColor.a = max(d, gl_Color.a);
+ gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
}
diff --git a/indra/newview/app_settings/shaders/class1/interface/occlusionF.glsl b/indra/newview/app_settings/shaders/class1/interface/occlusionF.glsl
new file mode 100644
index 0000000000..db130e456c
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/interface/occlusionF.glsl
@@ -0,0 +1,35 @@
+/**
+ * @file occlusionF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
+void main()
+{
+ frag_color = vec4(1,1,1,1);
+}
diff --git a/indra/newview/app_settings/shaders/class1/interface/occlusionV.glsl b/indra/newview/app_settings/shaders/class1/interface/occlusionV.glsl
new file mode 100644
index 0000000000..c26fa08ddc
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/interface/occlusionV.glsl
@@ -0,0 +1,34 @@
+/**
+ * @file uiV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+
+void main()
+{
+ gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/interface/onetexturenocolorF.glsl b/indra/newview/app_settings/shaders/class1/interface/onetexturenocolorF.glsl
new file mode 100644
index 0000000000..415181126b
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/interface/onetexturenocolorF.glsl
@@ -0,0 +1,39 @@
+/**
+ * @file onetexturenocolorF.glsl
+ *
+ * $LicenseInfo:firstyear=2005&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2005, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
+uniform sampler2D tex0;
+
+VARYING vec2 vary_texcoord0;
+
+void main()
+{
+ frag_color = texture2D(tex0, vary_texcoord0.xy);
+}
diff --git a/indra/newview/app_settings/shaders/class1/interface/onetexturenocolorV.glsl b/indra/newview/app_settings/shaders/class1/interface/onetexturenocolorV.glsl
new file mode 100644
index 0000000000..6b9986c8d7
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/interface/onetexturenocolorV.glsl
@@ -0,0 +1,38 @@
+/**
+ * @file onetexturenocolorV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec2 vary_texcoord0;
+
+void main()
+{
+ gl_Position = modelview_projection_matrix * vec4(position, 1);
+ vary_texcoord0 = texcoord0;
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/interface/solidcolorF.glsl b/indra/newview/app_settings/shaders/class1/interface/solidcolorF.glsl
new file mode 100644
index 0000000000..67dc500493
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/interface/solidcolorF.glsl
@@ -0,0 +1,42 @@
+/**
+ * @file twotextureaddF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
+uniform sampler2D tex0;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+void main()
+{
+ float alpha = texture2D(tex0, vary_texcoord0.xy).a * vertex_color.a;
+
+ frag_color = vec4(vertex_color.rgb, alpha);
+}
diff --git a/indra/newview/app_settings/shaders/class1/interface/solidcolorV.glsl b/indra/newview/app_settings/shaders/class1/interface/solidcolorV.glsl
new file mode 100644
index 0000000000..c58f9dfdaf
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/interface/solidcolorV.glsl
@@ -0,0 +1,41 @@
+/**
+ * @file solidcolorV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec4 diffuse_color;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+void main()
+{
+ gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ vertex_color = diffuse_color;
+ vary_texcoord0 = texcoord0;
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/interface/splattexturerectF.glsl b/indra/newview/app_settings/shaders/class1/interface/splattexturerectF.glsl
new file mode 100644
index 0000000000..772bb374e8
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/interface/splattexturerectF.glsl
@@ -0,0 +1,42 @@
+/**
+ * @file splattexturerectF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#extension GL_ARB_texture_rectangle : enable
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
+uniform sampler2DRect screenMap;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+void main()
+{
+ frag_color = texture2DRect(screenMap, vary_texcoord0.xy) * vertex_color;
+}
diff --git a/indra/newview/app_settings/shaders/class1/interface/splattexturerectV.glsl b/indra/newview/app_settings/shaders/class1/interface/splattexturerectV.glsl
new file mode 100644
index 0000000000..641d670c26
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/interface/splattexturerectV.glsl
@@ -0,0 +1,41 @@
+/**
+ * @file splattexturerectV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec2 texcoord0;
+ATTRIBUTE vec4 diffuse_color;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+void main()
+{
+ gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ vary_texcoord0 = texcoord0;
+ vertex_color = diffuse_color;
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/interface/twotextureaddF.glsl b/indra/newview/app_settings/shaders/class1/interface/twotextureaddF.glsl
new file mode 100644
index 0000000000..95679e93e7
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/interface/twotextureaddF.glsl
@@ -0,0 +1,41 @@
+/**
+ * @file twotextureaddF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
+uniform sampler2D tex0;
+uniform sampler2D tex1;
+
+VARYING vec2 vary_texcoord0;
+VARYING vec2 vary_texcoord1;
+
+void main()
+{
+ frag_color = texture2D(tex0, vary_texcoord0.xy)+texture2D(tex1, vary_texcoord1.xy);
+}
diff --git a/indra/newview/app_settings/shaders/class1/interface/twotextureaddV.glsl b/indra/newview/app_settings/shaders/class1/interface/twotextureaddV.glsl
new file mode 100644
index 0000000000..3c2f297f7f
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/interface/twotextureaddV.glsl
@@ -0,0 +1,41 @@
+/**
+ * @file twotextureaddV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec2 texcoord0;
+ATTRIBUTE vec2 texcoord1;
+
+VARYING vec2 vary_texcoord0;
+VARYING vec2 vary_texcoord1;
+
+void main()
+{
+ gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ vary_texcoord0 = texcoord0;
+ vary_texcoord1 = texcoord1;
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/interface/uiF.glsl b/indra/newview/app_settings/shaders/class1/interface/uiF.glsl
new file mode 100644
index 0000000000..299bfb72aa
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/interface/uiF.glsl
@@ -0,0 +1,40 @@
+/**
+ * @file uiF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
+uniform sampler2D diffuseMap;
+
+VARYING vec2 vary_texcoord0;
+VARYING vec4 vertex_color;
+
+void main()
+{
+ frag_color = vertex_color*texture2D(diffuseMap, vary_texcoord0.xy);
+}
diff --git a/indra/newview/app_settings/shaders/class1/interface/uiV.glsl b/indra/newview/app_settings/shaders/class1/interface/uiV.glsl
new file mode 100644
index 0000000000..220dafef25
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/interface/uiV.glsl
@@ -0,0 +1,42 @@
+/**
+ * @file uiV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec4 diffuse_color;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+void main()
+{
+ gl_Position = modelview_projection_matrix * vec4(position, 1);
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
+ vertex_color = diffuse_color;
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskF.glsl
new file mode 100644
index 0000000000..cf29939cb2
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskF.glsl
@@ -0,0 +1,55 @@
+/**
+ * @file lightAlphaMaskF.glsl
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
+uniform float minimum_alpha;
+
+vec3 atmosLighting(vec3 light);
+vec3 scaleSoftClip(vec3 light);
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+void default_lighting()
+{
+ vec4 color = diffuseLookup(vary_texcoord0.xy) * vertex_color;
+
+ if (color.a < minimum_alpha)
+ {
+ discard;
+ }
+
+ color.rgb = atmosLighting(color.rgb);
+
+ color.rgb = scaleSoftClip(color.rgb);
+
+ frag_color = color;
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskNonIndexedF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskNonIndexedF.glsl
new file mode 100644
index 0000000000..4070d41f47
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskNonIndexedF.glsl
@@ -0,0 +1,57 @@
+/**
+ * @file lightAlphaMaskNonIndexedF.glsl
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
+uniform float minimum_alpha;
+
+uniform sampler2D diffuseMap;
+
+vec3 atmosLighting(vec3 light);
+vec3 scaleSoftClip(vec3 light);
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+void default_lighting()
+{
+ vec4 color = texture2D(diffuseMap,vary_texcoord0.xy) * vertex_color;
+
+ if (color.a < minimum_alpha)
+ {
+ discard;
+ }
+
+ color.rgb = atmosLighting(color.rgb);
+
+ color.rgb = scaleSoftClip(color.rgb);
+
+ frag_color = color;
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightF.glsl
index ad128dae8d..d6ebfcb825 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightF.glsl
@@ -2,14 +2,47 @@
* @file lightF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-uniform sampler2D diffuseMap;
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+vec3 atmosLighting(vec3 light);
+vec3 scaleSoftClip(vec3 light);
void default_lighting()
{
- vec4 color = gl_Color * texture2D(diffuseMap, gl_TexCoord[0].xy);
- gl_FragColor = color;
+ vec4 color = diffuseLookup(vary_texcoord0.xy) * vertex_color;
+
+ color.rgb = atmosLighting(color.rgb);
+
+ color.rgb = scaleSoftClip(color.rgb);
+
+ frag_color = color;
}
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightAlphaMaskF.glsl
new file mode 100644
index 0000000000..6c34643aab
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightAlphaMaskF.glsl
@@ -0,0 +1,55 @@
+/**
+ * @file lightFullbrightAlphaMaskF.glsl
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
+uniform float minimum_alpha;
+
+vec3 fullbrightAtmosTransport(vec3 light);
+vec3 fullbrightScaleSoftClip(vec3 light);
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+void fullbright_lighting()
+{
+ vec4 color = diffuseLookup(vary_texcoord0.xy) * vertex_color;
+
+ if (color.a < minimum_alpha)
+ {
+ discard;
+ }
+
+ color.rgb = fullbrightAtmosTransport(color.rgb);
+
+ color.rgb = fullbrightScaleSoftClip(color.rgb);
+
+ frag_color = color;
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightF.glsl
index 1742b9fc1c..2ff7f795b0 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightF.glsl
@@ -2,14 +2,47 @@
* @file lightFullbrightF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
-uniform sampler2D diffuseMap;
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+vec3 fullbrightAtmosTransport(vec3 light);
+vec3 fullbrightScaleSoftClip(vec3 light);
void fullbright_lighting()
{
- gl_FragColor = texture2D(diffuseMap, gl_TexCoord[0].xy);
+ vec4 color = diffuseLookup(vary_texcoord0.xy) * vertex_color;
+
+ color.rgb = fullbrightAtmosTransport(color.rgb);
+
+ color.rgb = fullbrightScaleSoftClip(color.rgb);
+
+ frag_color = color;
}
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightNonIndexedAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightNonIndexedAlphaMaskF.glsl
new file mode 100644
index 0000000000..f4477bd29a
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightNonIndexedAlphaMaskF.glsl
@@ -0,0 +1,57 @@
+/**
+ * @file lightFullbrightNonIndexedAlphaMaskF.glsl
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
+uniform float minimum_alpha;
+
+vec3 fullbrightAtmosTransport(vec3 light);
+vec3 fullbrightScaleSoftClip(vec3 light);
+
+uniform sampler2D diffuseMap;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+void fullbright_lighting()
+{
+ vec4 color = texture2D(diffuseMap,vary_texcoord0.xy) * vertex_color;
+
+ if (color.a < minimum_alpha)
+ {
+ discard;
+ }
+
+ color.rgb = fullbrightAtmosTransport(color.rgb);
+
+ color.rgb = fullbrightScaleSoftClip(color.rgb);
+
+ frag_color = color;
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightNonIndexedF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightNonIndexedF.glsl
new file mode 100644
index 0000000000..2738ff8947
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightNonIndexedF.glsl
@@ -0,0 +1,50 @@
+/**
+ * @file lightFullbrightF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+vec3 fullbrightAtmosTransport(vec3 light);
+vec3 fullbrightScaleSoftClip(vec3 light);
+
+uniform sampler2D diffuseMap;
+
+void fullbright_lighting()
+{
+ vec4 color = texture2D(diffuseMap,vary_texcoord0.xy) * vertex_color;
+
+ color.rgb = fullbrightAtmosTransport(color.rgb);
+
+ color.rgb = fullbrightScaleSoftClip(color.rgb);
+
+ frag_color = color;
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyF.glsl
index 68b6603b4a..777c8b45bb 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyF.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyF.glsl
@@ -2,14 +2,56 @@
* @file lightFullbrightShinyF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+VARYING vec3 vary_texcoord1;
-uniform sampler2D diffuseMap;
uniform samplerCube environmentMap;
-void fullbright_shiny_lighting()
+vec3 fullbrightShinyAtmosTransport(vec3 light);
+vec3 fullbrightScaleSoftClip(vec3 light);
+
+void fullbright_shiny_lighting()
{
- gl_FragColor = texture2D(diffuseMap, gl_TexCoord[0].xy);
+ vec4 color = diffuseLookup(vary_texcoord0.xy);
+ color.rgb *= vertex_color.rgb;
+
+ vec3 envColor = textureCube(environmentMap, vary_texcoord1.xyz).rgb;
+ color.rgb = mix(color.rgb, envColor.rgb, vertex_color.a);
+
+ color.rgb = fullbrightShinyAtmosTransport(color.rgb);
+
+ color.rgb = fullbrightScaleSoftClip(color.rgb);
+
+ color.a = max(color.a, vertex_color.a);
+
+ frag_color = color;
}
+
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyNonIndexedF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyNonIndexedF.glsl
new file mode 100644
index 0000000000..4fa3b1d939
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyNonIndexedF.glsl
@@ -0,0 +1,58 @@
+/**
+ * @file lightFullbrightShinyF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+VARYING vec3 vary_texcoord1;
+
+uniform samplerCube environmentMap;
+uniform sampler2D diffuseMap;
+
+vec3 fullbrightShinyAtmosTransport(vec3 light);
+vec3 fullbrightScaleSoftClip(vec3 light);
+
+void fullbright_shiny_lighting()
+{
+ vec4 color = texture2D(diffuseMap, vary_texcoord0.xy);
+ color.rgb *= vertex_color.rgb;
+
+ vec3 envColor = textureCube(environmentMap, vary_texcoord1.xyz).rgb;
+ color.rgb = mix(color.rgb, envColor.rgb, vertex_color.a);
+
+ color.rgb = fullbrightShinyAtmosTransport(color.rgb);
+
+ color.rgb = fullbrightScaleSoftClip(color.rgb);
+
+ color.a = max(color.a, vertex_color.a);
+
+ frag_color = color;
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyWaterF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyWaterF.glsl
new file mode 100644
index 0000000000..58984a4263
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyWaterF.glsl
@@ -0,0 +1,55 @@
+/**
+ * @file lightFullbrightShinyWaterF.glsl
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+VARYING vec3 vary_texcoord1;
+
+uniform samplerCube environmentMap;
+
+vec3 fullbrightShinyAtmosTransport(vec3 light);
+vec3 fullbrightScaleSoftClip(vec3 light);
+vec4 applyWaterFog(vec4 color);
+
+void fullbright_shiny_lighting_water()
+{
+ vec4 color = diffuseLookup(vary_texcoord0.xy);
+ color.rgb *= vertex_color.rgb;
+
+ vec3 envColor = textureCube(environmentMap, vary_texcoord1.xyz).rgb;
+ color.rgb = mix(color.rgb, envColor.rgb, vertex_color.a);
+
+ color.rgb = fullbrightShinyAtmosTransport(color.rgb);
+ color.rgb = fullbrightScaleSoftClip(color.rgb);
+ color.a = max(color.a, vertex_color.a);
+
+ frag_color = applyWaterFog(color);
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyWaterNonIndexedF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyWaterNonIndexedF.glsl
new file mode 100644
index 0000000000..a39b7205d7
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyWaterNonIndexedF.glsl
@@ -0,0 +1,56 @@
+/**
+ * @file lightFullbrightShinyWaterF.glsl
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+VARYING vec3 vary_texcoord1;
+
+uniform samplerCube environmentMap;
+uniform sampler2D diffuseMap;
+
+vec3 fullbrightShinyAtmosTransport(vec3 light);
+vec3 fullbrightScaleSoftClip(vec3 light);
+vec4 applyWaterFog(vec4 color);
+
+void fullbright_shiny_lighting_water()
+{
+ vec4 color = texture2D(diffuseMap,vary_texcoord0.xy);
+ color.rgb *= vertex_color.rgb;
+
+ vec3 envColor = textureCube(environmentMap, vary_texcoord1.xyz).rgb;
+ color.rgb = mix(color.rgb, envColor.rgb, vertex_color.a);
+
+ color.rgb = fullbrightShinyAtmosTransport(color.rgb);
+ color.rgb = fullbrightScaleSoftClip(color.rgb);
+ color.a = max(color.a, vertex_color.a);
+
+ frag_color = applyWaterFog(color);
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterAlphaMaskF.glsl
new file mode 100644
index 0000000000..99a6fe85fe
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterAlphaMaskF.glsl
@@ -0,0 +1,55 @@
+/**
+ * @file lightFullbrightWaterAlphaMaskF.glsl
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
+uniform float minimum_alpha;
+
+vec4 diffuseLookup(vec2 texcoord);
+
+vec3 fullbrightAtmosTransport(vec3 light);
+vec4 applyWaterFog(vec4 color);
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+void fullbright_lighting_water()
+{
+ vec4 color = diffuseLookup(vary_texcoord0.xy) * vertex_color;
+
+ if (color.a < minimum_alpha)
+ {
+ discard;
+ }
+
+ color.rgb = fullbrightAtmosTransport(color.rgb);
+
+ frag_color = applyWaterFog(color);
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterF.glsl
index 693ed289f2..df182168f3 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterF.glsl
@@ -2,14 +2,47 @@
* @file lightFullbrightWaterF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
-uniform sampler2D diffuseMap;
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+vec4 diffuseLookup(vec2 texcoord);
+
+vec3 fullbrightAtmosTransport(vec3 light);
+vec4 applyWaterFog(vec4 color);
void fullbright_lighting_water()
{
- gl_FragColor = texture2D(diffuseMap, gl_TexCoord[0].xy);
+ vec4 color = diffuseLookup(vary_texcoord0.xy) * vertex_color;
+
+ color.rgb = fullbrightAtmosTransport(color.rgb);
+
+ frag_color = applyWaterFog(color);
}
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterNonIndexedAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterNonIndexedAlphaMaskF.glsl
new file mode 100644
index 0000000000..63f92a8844
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterNonIndexedAlphaMaskF.glsl
@@ -0,0 +1,55 @@
+/**
+ * @file lightFullbrightWaterNonIndexedAlphaMaskF.glsl
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
+uniform float minimum_alpha;
+
+uniform sampler2D diffuseMap;
+
+vec3 fullbrightAtmosTransport(vec3 light);
+vec4 applyWaterFog(vec4 color);
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+void fullbright_lighting_water()
+{
+ vec4 color = texture2D(diffuseMap, vary_texcoord0.xy) * vertex_color;
+
+ if (color.a < minimum_alpha)
+ {
+ discard;
+ }
+
+ color.rgb = fullbrightAtmosTransport(color.rgb);
+
+ frag_color = applyWaterFog(color);
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterNonIndexedF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterNonIndexedF.glsl
new file mode 100644
index 0000000000..0e68091e7c
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterNonIndexedF.glsl
@@ -0,0 +1,48 @@
+/**
+ * @file lightFullbrightWaterF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+uniform sampler2D diffuseMap;
+
+vec3 fullbrightAtmosTransport(vec3 light);
+vec4 applyWaterFog(vec4 color);
+
+void fullbright_lighting_water()
+{
+ vec4 color = texture2D(diffuseMap, vary_texcoord0.xy) * vertex_color;
+
+ color.rgb = fullbrightAtmosTransport(color.rgb);
+
+ frag_color = applyWaterFog(color);
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFuncSpecularV.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFuncSpecularV.glsl
index b888e70325..85cddc647d 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightFuncSpecularV.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightFuncSpecularV.glsl
@@ -2,8 +2,28 @@
* @file lightFuncSpecularV.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+
+
float calcDirectionalLight(vec3 n, vec3 l)
{
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFuncV.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFuncV.glsl
index 4b6d95e177..a9288b3df6 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightFuncV.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightFuncV.glsl
@@ -2,8 +2,28 @@
* @file lightFuncV.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+
+
float calcDirectionalLight(vec3 n, vec3 l)
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightNonIndexedF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightNonIndexedF.glsl
new file mode 100644
index 0000000000..0aca768021
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightNonIndexedF.glsl
@@ -0,0 +1,50 @@
+/**
+ * @file lightF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+uniform sampler2D diffuseMap;
+
+vec3 atmosLighting(vec3 light);
+vec3 scaleSoftClip(vec3 light);
+
+void default_lighting()
+{
+ vec4 color = texture2D(diffuseMap,vary_texcoord0.xy) * vertex_color;
+
+ color.rgb = atmosLighting(color.rgb);
+
+ color.rgb = scaleSoftClip(color.rgb);
+
+ frag_color = color;
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightShinyF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightShinyF.glsl
index b127b1f8ea..52e3b2ad02 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightShinyF.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightShinyF.glsl
@@ -2,16 +2,55 @@
* @file lightShinyF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+VARYING vec3 vary_texcoord1;
-uniform sampler2D diffuseMap;
uniform samplerCube environmentMap;
-void shiny_lighting()
+vec3 scaleSoftClip(vec3 light);
+vec3 atmosLighting(vec3 light);
+vec4 applyWaterFog(vec4 color);
+
+void shiny_lighting()
{
- vec4 color = gl_Color * texture2D(diffuseMap, gl_TexCoord[0].xy);
- gl_FragColor = color;
+ vec4 color = diffuseLookup(vary_texcoord0.xy);
+ color.rgb *= vertex_color.rgb;
+
+ vec3 envColor = textureCube(environmentMap, vary_texcoord1.xyz).rgb;
+ color.rgb = mix(color.rgb, envColor.rgb, vertex_color.a);
+
+ color.rgb = atmosLighting(color.rgb);
+
+ color.rgb = scaleSoftClip(color.rgb);
+ color.a = max(color.a, vertex_color.a);
+ frag_color = color;
}
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightShinyNonIndexedF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightShinyNonIndexedF.glsl
new file mode 100644
index 0000000000..474d5ea496
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightShinyNonIndexedF.glsl
@@ -0,0 +1,57 @@
+/**
+ * @file lightShinyF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+VARYING vec3 vary_texcoord1;
+
+uniform samplerCube environmentMap;
+uniform sampler2D diffuseMap;
+
+vec3 scaleSoftClip(vec3 light);
+vec3 atmosLighting(vec3 light);
+vec4 applyWaterFog(vec4 color);
+
+void shiny_lighting()
+{
+ vec4 color = texture2D(diffuseMap,vary_texcoord0.xy);
+ color.rgb *= vertex_color.rgb;
+
+ vec3 envColor = textureCube(environmentMap, vary_texcoord1.xyz).rgb;
+ color.rgb = mix(color.rgb, envColor.rgb, vertex_color.a);
+
+ color.rgb = atmosLighting(color.rgb);
+
+ color.rgb = scaleSoftClip(color.rgb);
+ color.a = max(color.a, vertex_color.a);
+ frag_color = color;
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightShinyWaterF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightShinyWaterF.glsl
index 05ad3256af..d2a4c47aac 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightShinyWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightShinyWaterF.glsl
@@ -2,16 +2,52 @@
* @file lightShinyWaterF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+VARYING vec3 vary_texcoord1;
-uniform sampler2D diffuseMap;
uniform samplerCube environmentMap;
-void shiny_lighting_water()
+vec3 atmosLighting(vec3 light);
+vec4 applyWaterFog(vec4 color);
+
+void shiny_lighting_water()
{
- vec4 color = gl_Color * texture2D(diffuseMap, gl_TexCoord[0].xy);
- gl_FragColor = color;
+ vec4 color = diffuseLookup(vary_texcoord0.xy);
+ color.rgb *= vertex_color.rgb;
+
+ vec3 envColor = textureCube(environmentMap, vary_texcoord1.xyz).rgb;
+ color.rgb = mix(color.rgb, envColor.rgb, vertex_color.a);
+
+ color.rgb = atmosLighting(color.rgb);
+ color.a = max(color.a, vertex_color.a);
+ frag_color = applyWaterFog(color);
}
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightShinyWaterNonIndexedF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightShinyWaterNonIndexedF.glsl
new file mode 100644
index 0000000000..f3bd662364
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightShinyWaterNonIndexedF.glsl
@@ -0,0 +1,54 @@
+/**
+ * @file lightShinyWaterF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+VARYING vec3 vary_texcoord1;
+
+uniform sampler2D diffuseMap;
+uniform samplerCube environmentMap;
+
+vec3 atmosLighting(vec3 light);
+vec4 applyWaterFog(vec4 color);
+
+void shiny_lighting_water()
+{
+ vec4 color = texture2D(diffuseMap,vary_texcoord0.xy);
+ color.rgb *= vertex_color.rgb;
+
+ vec3 envColor = textureCube(environmentMap, vary_texcoord1.xyz).rgb;
+ color.rgb = mix(color.rgb, envColor.rgb, vertex_color.a);
+
+ color.rgb = atmosLighting(color.rgb);
+ color.a = max(color.a, vertex_color.a);
+ frag_color = applyWaterFog(color);
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightSpecularV.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightSpecularV.glsl
index b1a7cb46ff..24bf9b3cee 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightSpecularV.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightSpecularV.glsl
@@ -1,26 +1,36 @@
/**
- * @file lightV.glsl
+ * @file lightSpecularV.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+
-float calcDirectionalLight(vec3 n, vec3 l);
-// Same as non-specular lighting in lightV.glsl
-vec4 calcLightingSpecular(vec3 pos, vec3 norm, vec4 color, inout vec4 specularColor, vec4 baseCol)
-{
- specularColor.rgb = vec3(0.0, 0.0, 0.0);
- vec4 col;
- col.a = color.a;
-
- col.rgb = gl_LightModel.ambient.rgb + baseCol.rgb;
+// All lights, no specular highlights
- col.rgb += gl_LightSource[0].diffuse.rgb*calcDirectionalLight(norm, gl_LightSource[0].position.xyz);
- col.rgb += gl_LightSource[1].diffuse.rgb*calcDirectionalLight(norm, gl_LightSource[1].position.xyz);
+vec4 sumLightsSpecular(vec3 pos, vec3 norm, vec4 color, inout vec4 specularColor, vec4 baseCol);
- col.rgb = min(col.rgb*color.rgb, 1.0);
-
- return col;
+vec4 calcLightingSpecular(vec3 pos, vec3 norm, vec4 color, inout vec4 specularColor, vec4 baseCol)
+{
+ return sumLightsSpecular(pos, norm, color, specularColor, baseCol);
}
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightV.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightV.glsl
index f6afa6a3ae..8045809b82 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightV.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightV.glsl
@@ -2,23 +2,35 @@
* @file lightV.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+
-float calcDirectionalLight(vec3 n, vec3 l);
+
+// All lights, no specular highlights
+
+vec4 sumLights(vec3 pos, vec3 norm, vec4 color, vec4 baseLight);
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseLight)
{
- vec4 col;
- col.a = color.a;
-
- col.rgb = gl_LightModel.ambient.rgb + baseLight.rgb;
-
- col.rgb += gl_LightSource[0].diffuse.rgb*calcDirectionalLight(norm, gl_LightSource[0].position.xyz);
- col.rgb += gl_LightSource[1].diffuse.rgb*calcDirectionalLight(norm, gl_LightSource[1].position.xyz);
-
- col.rgb = min(col.rgb*color.rgb, 1.0);
-
- return col;
+ return sumLights(pos, norm, color, baseLight);
}
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightWaterAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightWaterAlphaMaskF.glsl
new file mode 100644
index 0000000000..b68240ba0d
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightWaterAlphaMaskF.glsl
@@ -0,0 +1,53 @@
+/**
+ * @file lightWaterAlphaMaskF.glsl
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
+uniform float minimum_alpha;
+
+vec3 atmosLighting(vec3 light);
+vec4 applyWaterFog(vec4 color);
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+void default_lighting_water()
+{
+ vec4 color = diffuseLookup(vary_texcoord0.xy) * vertex_color;
+
+ if (color.a < minimum_alpha)
+ {
+ discard;
+ }
+
+ color.rgb = atmosLighting(color.rgb);
+
+ frag_color = applyWaterFog(color);
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightWaterAlphaMaskNonIndexedF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightWaterAlphaMaskNonIndexedF.glsl
new file mode 100644
index 0000000000..da3b20012d
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightWaterAlphaMaskNonIndexedF.glsl
@@ -0,0 +1,57 @@
+/**
+ * @file lightWaterAlphaMaskNonIndexedF.glsl
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
+uniform float minimum_alpha;
+
+uniform sampler2D diffuseMap;
+
+vec3 atmosLighting(vec3 light);
+vec4 applyWaterFog(vec4 color);
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+void default_lighting_water()
+{
+ vec4 color = texture2D(diffuseMap,vary_texcoord0.xy) * vertex_color;
+
+ if (color.a < minimum_alpha)
+ {
+ discard;
+ }
+
+ color.rgb = atmosLighting(color.rgb);
+
+ color = applyWaterFog(color);
+
+ frag_color = color;
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightWaterF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightWaterF.glsl
index e5e6ddc2d8..00609e93cd 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/lightWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightWaterF.glsl
@@ -2,14 +2,45 @@
* @file lightWaterF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-uniform sampler2D diffuseMap;
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
-void default_lighting_water()
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+vec3 atmosLighting(vec3 light);
+vec4 applyWaterFog(vec4 color);
+
+void default_lighting_water()
{
- vec4 color = gl_Color * texture2D(diffuseMap, gl_TexCoord[0].xy);
- gl_FragColor = color;
+ vec4 color = diffuseLookup(vary_texcoord0.xy) * vertex_color;
+
+ color.rgb = atmosLighting(color.rgb);
+
+ frag_color = applyWaterFog(color);
}
diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightWaterNonIndexedF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightWaterNonIndexedF.glsl
new file mode 100644
index 0000000000..13ecb7a636
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/lighting/lightWaterNonIndexedF.glsl
@@ -0,0 +1,48 @@
+/**
+ * @file lightWaterF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+uniform sampler2D diffuseMap;
+
+vec3 atmosLighting(vec3 light);
+vec4 applyWaterFog(vec4 color);
+
+void default_lighting_water()
+{
+ vec4 color = texture2D(diffuseMap,vary_texcoord0.xy) * vertex_color;
+
+ color.rgb = atmosLighting(color.rgb);
+
+ frag_color = applyWaterFog(color);
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/lighting/sumLightsSpecularV.glsl b/indra/newview/app_settings/shaders/class1/lighting/sumLightsSpecularV.glsl
index a0649aea88..7059ff31ae 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/sumLightsSpecularV.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/sumLightsSpecularV.glsl
@@ -2,29 +2,51 @@
* @file sumLightsSpecularV.glsl
*
* $LicenseInfo:firstyear=2005&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2005, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+
+
+
float calcDirectionalLightSpecular(inout vec4 specular, vec3 view, vec3 n, vec3 l, vec3 lightCol, float da);
vec3 atmosAmbient(vec3 light);
vec3 atmosAffectDirectionalLight(float lightIntensity);
vec3 atmosGetDiffuseSunlightColor();
vec3 scaleDownLight(vec3 light);
+uniform vec4 light_position[8];
+uniform vec3 light_diffuse[8];
+
vec4 sumLightsSpecular(vec3 pos, vec3 norm, vec4 color, inout vec4 specularColor, vec4 baseCol)
{
- vec4 col;
- col.a = color.a;
-
-
+ vec4 col = vec4(0,0,0, color.a);
+
vec3 view = normalize(pos);
/// collect all the specular values from each calcXXXLightSpecular() function
vec4 specularSum = vec4(0.0);
- col.rgb = gl_LightSource[1].diffuse.rgb * calcDirectionalLightSpecular(specularColor, view, norm, gl_LightSource[1].position.xyz, gl_LightSource[1].diffuse.rgb, 1.0);
+ col.rgb += light_diffuse[1].rgb * calcDirectionalLightSpecular(specularColor, view, norm, light_position[1].xyz,light_diffuse[1].rgb, 1.0);
col.rgb = scaleDownLight(col.rgb);
col.rgb += atmosAmbient(baseCol.rgb);
- col.rgb += atmosAffectDirectionalLight(calcDirectionalLightSpecular(specularSum, view, norm, gl_LightSource[0].position.xyz,atmosGetDiffuseSunlightColor() * baseCol.a, 1.0));
+ col.rgb += atmosAffectDirectionalLight(calcDirectionalLightSpecular(specularSum, view, norm, light_position[0].xyz,atmosGetDiffuseSunlightColor()*baseCol.a, 1.0));
col.rgb = min(col.rgb * color.rgb, 1.0);
specularColor.rgb = min(specularColor.rgb * specularSum.rgb, 1.0);
diff --git a/indra/newview/app_settings/shaders/class1/lighting/sumLightsV.glsl b/indra/newview/app_settings/shaders/class1/lighting/sumLightsV.glsl
index c7d40d853f..41288c21c1 100644
--- a/indra/newview/app_settings/shaders/class1/lighting/sumLightsV.glsl
+++ b/indra/newview/app_settings/shaders/class1/lighting/sumLightsV.glsl
@@ -2,8 +2,29 @@
* @file sumLightsV.glsl
*
* $LicenseInfo:firstyear=2005&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2005, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+
+uniform vec4 light_position[8];
+uniform vec3 light_diffuse[8];
float calcDirectionalLight(vec3 n, vec3 l);
@@ -16,10 +37,10 @@ vec4 sumLights(vec3 pos, vec3 norm, vec4 color, vec4 baseLight)
vec4 col;
col.a = color.a;
- col.rgb = gl_LightSource[1].diffuse.rgb * calcDirectionalLight(norm, gl_LightSource[1].position.xyz);
+ col.rgb = light_diffuse[1].rgb * calcDirectionalLight(norm, light_position[1].xyz);
col.rgb = scaleDownLight(col.rgb);
col.rgb += atmosAmbient(baseLight.rgb);
- col.rgb += atmosAffectDirectionalLight(calcDirectionalLight(norm, gl_LightSource[0].position.xyz));
+ col.rgb += atmosAffectDirectionalLight(calcDirectionalLight(norm, light_position[0].xyz));
col.rgb = min(col.rgb*color.rgb, 1.0);
diff --git a/indra/newview/app_settings/shaders/class1/objects/bumpF.glsl b/indra/newview/app_settings/shaders/class1/objects/bumpF.glsl
new file mode 100644
index 0000000000..d55f0db530
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/objects/bumpF.glsl
@@ -0,0 +1,44 @@
+/**
+ * @file bumpF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
+uniform sampler2D texture0;
+uniform sampler2D texture1;
+
+VARYING vec2 vary_texcoord0;
+VARYING vec2 vary_texcoord1;
+
+void main()
+{
+ float tex0 = texture2D(texture0, vary_texcoord0.xy).a;
+ float tex1 = texture2D(texture1, vary_texcoord1.xy).a;
+
+ frag_color = vec4(tex0+(1.0-tex1)-0.5);
+}
diff --git a/indra/newview/app_settings/shaders/class1/objects/bumpV.glsl b/indra/newview/app_settings/shaders/class1/objects/bumpV.glsl
new file mode 100644
index 0000000000..a7738087dc
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/objects/bumpV.glsl
@@ -0,0 +1,42 @@
+/**
+ * @file bumpV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec2 texcoord0;
+ATTRIBUTE vec2 texcoord1;
+
+VARYING vec2 vary_texcoord0;
+VARYING vec2 vary_texcoord1;
+
+void main()
+{
+ //transform vertex
+ gl_Position = modelview_projection_matrix*vec4(position.xyz, 1.0);
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
+ vary_texcoord1 = (texture_matrix0 * vec4(texcoord1,0,1)).xy;
+}
diff --git a/indra/newview/app_settings/shaders/class1/objects/emissiveSkinnedV.glsl b/indra/newview/app_settings/shaders/class1/objects/emissiveSkinnedV.glsl
new file mode 100644
index 0000000000..8494ffba52
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/objects/emissiveSkinnedV.glsl
@@ -0,0 +1,58 @@
+/**
+ * @file emissiveSkinnedV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat4 projection_matrix;
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec4 emissive;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+
+void calcAtmospherics(vec3 inPositionEye);
+mat4 getObjectSkinnedTransform();
+
+void main()
+{
+ //transform vertex
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
+
+ mat4 mat = getObjectSkinnedTransform();
+
+ mat = modelview_matrix * mat;
+ vec3 pos = (mat*vec4(position.xyz, 1.0)).xyz;
+
+ calcAtmospherics(pos.xyz);
+
+ vertex_color = emissive;
+
+ gl_Position = projection_matrix*vec4(pos, 1.0);
+
+
+}
diff --git a/indra/newview/app_settings/shaders/class1/objects/emissiveV.glsl b/indra/newview/app_settings/shaders/class1/objects/emissiveV.glsl
new file mode 100644
index 0000000000..e984deb0c8
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/objects/emissiveV.glsl
@@ -0,0 +1,56 @@
+/**
+ * @file emissiveV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_matrix;
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+void passTextureIndex();
+ATTRIBUTE vec4 emissive;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+void calcAtmospherics(vec3 inPositionEye);
+
+
+
+
+void main()
+{
+ //transform vertex
+ passTextureIndex();
+ gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
+
+ vec4 pos = (modelview_matrix * vec4(position.xyz, 1.0));
+ calcAtmospherics(pos.xyz);
+
+ vertex_color = emissive;
+
+
+}
diff --git a/indra/newview/app_settings/shaders/class1/objects/fullbrightF.glsl b/indra/newview/app_settings/shaders/class1/objects/fullbrightF.glsl
index 9da4c2c92b..a54c0caf81 100644
--- a/indra/newview/app_settings/shaders/class1/objects/fullbrightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/fullbrightF.glsl
@@ -2,8 +2,28 @@
* @file fullbrightF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * $/LicenseInfo$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$F
*/
+
+
void fullbright_lighting();
diff --git a/indra/newview/app_settings/shaders/class1/objects/fullbrightNoColorV.glsl b/indra/newview/app_settings/shaders/class1/objects/fullbrightNoColorV.glsl
new file mode 100644
index 0000000000..5d6f14230c
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/objects/fullbrightNoColorV.glsl
@@ -0,0 +1,53 @@
+/**
+ * @file fullbrightNoColorV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_matrix;
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec2 texcoord0;
+ATTRIBUTE vec3 normal;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+
+void calcAtmospherics(vec3 inPositionEye);
+
+void main()
+{
+ //transform vertex
+ vec4 vert = vec4(position.xyz,1.0);
+ vec4 pos = (modelview_matrix * vert);
+ gl_Position = modelview_projection_matrix*vec4(position.xyz, 1.0);
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
+
+ calcAtmospherics(pos.xyz);
+
+ vertex_color = vec4(1,1,1,1);
+
+
+}
diff --git a/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyF.glsl b/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyF.glsl
index 1c8a9a1a30..b312665032 100644
--- a/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyF.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyF.glsl
@@ -2,8 +2,28 @@
* @file fullbrightShinyF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+
+
void fullbright_shiny_lighting();
diff --git a/indra/newview/app_settings/shaders/class1/objects/fullbrightShinySkinnedV.glsl b/indra/newview/app_settings/shaders/class1/objects/fullbrightShinySkinnedV.glsl
new file mode 100644
index 0000000000..79b552ee1a
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/objects/fullbrightShinySkinnedV.glsl
@@ -0,0 +1,67 @@
+/**
+ * @file shinySimpleSkinnedV.glsl
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat4 texture_matrix0;
+uniform mat4 texture_matrix1;
+uniform mat4 modelview_matrix;
+uniform mat4 projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec4 diffuse_color;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+VARYING vec3 vary_texcoord1;
+
+
+void calcAtmospherics(vec3 inPositionEye);
+mat4 getObjectSkinnedTransform();
+
+void main()
+{
+ mat4 mat = getObjectSkinnedTransform();
+
+ mat = modelview_matrix * mat;
+ vec3 pos = (mat*vec4(position.xyz, 1.0)).xyz;
+
+ vec4 norm = vec4(position.xyz, 1.0);
+ norm.xyz += normal.xyz;
+ norm.xyz = (mat*norm).xyz;
+ norm.xyz = normalize(norm.xyz-pos.xyz);
+
+ vec3 ref = reflect(pos.xyz, -norm.xyz);
+
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
+ vary_texcoord1 = (texture_matrix1*vec4(ref,1.0)).xyz;
+
+ calcAtmospherics(pos.xyz);
+
+ vertex_color = diffuse_color;
+
+ gl_Position = projection_matrix*vec4(pos, 1.0);
+
+
+}
diff --git a/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyV.glsl b/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyV.glsl
index 032def63b3..34bd8d445a 100644
--- a/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyV.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyV.glsl
@@ -2,28 +2,66 @@
* @file fullbrightShinyV.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+uniform mat3 normal_matrix;
+uniform mat4 texture_matrix0;
+uniform mat4 texture_matrix1;
+uniform mat4 modelview_matrix;
+uniform mat4 modelview_projection_matrix;
+
+
void calcAtmospherics(vec3 inPositionEye);
uniform vec4 origin;
+
+
+ATTRIBUTE vec3 position;
+void passTextureIndex();
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec4 diffuse_color;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+VARYING vec3 vary_texcoord1;
+
+
void main()
{
//transform vertex
- gl_Position = ftransform();
+ vec4 vert = vec4(position.xyz,1.0);
+ passTextureIndex();
+ vec4 pos = (modelview_matrix * vert);
+ gl_Position = modelview_projection_matrix*vec4(position.xyz, 1.0);
- vec4 pos = (gl_ModelViewMatrix * gl_Vertex);
- vec3 norm = normalize(gl_NormalMatrix * gl_Normal);
+ vec3 norm = normalize(normal_matrix * normal);
vec3 ref = reflect(pos.xyz, -norm);
- gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
- gl_TexCoord[1] = gl_TextureMatrix[1]*vec4(ref,1.0);
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
+ vary_texcoord1 = (texture_matrix1*vec4(ref,1.0)).xyz;
calcAtmospherics(pos.xyz);
- gl_FrontColor = gl_Color;
-
- gl_FogFragCoord = pos.z;
+ vertex_color = diffuse_color;
}
diff --git a/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyWaterF.glsl b/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyWaterF.glsl
new file mode 100644
index 0000000000..e1f3919907
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/objects/fullbrightShinyWaterF.glsl
@@ -0,0 +1,32 @@
+/**
+ * @file fullbrightShinyWaterF.glsl
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+
+
+void fullbright_shiny_lighting_water();
+
+void main()
+{
+ fullbright_shiny_lighting_water();
+}
diff --git a/indra/newview/app_settings/shaders/class1/objects/fullbrightSkinnedV.glsl b/indra/newview/app_settings/shaders/class1/objects/fullbrightSkinnedV.glsl
new file mode 100644
index 0000000000..eff75435a9
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/objects/fullbrightSkinnedV.glsl
@@ -0,0 +1,57 @@
+/**
+ * @file fullbrightSkinnedV.glsl
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat4 projection_matrix;
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec4 diffuse_color;
+ATTRIBUTE vec2 texcoord0;
+
+void calcAtmospherics(vec3 inPositionEye);
+mat4 getObjectSkinnedTransform();
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+
+void main()
+{
+ //transform vertex
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
+
+ mat4 mat = getObjectSkinnedTransform();
+
+ mat = modelview_matrix * mat;
+ vec3 pos = (mat*vec4(position.xyz, 1.0)).xyz;
+
+ calcAtmospherics(pos.xyz);
+
+ vertex_color = diffuse_color;
+
+ gl_Position = projection_matrix*vec4(pos, 1.0);
+
+
+}
diff --git a/indra/newview/app_settings/shaders/class1/objects/fullbrightV.glsl b/indra/newview/app_settings/shaders/class1/objects/fullbrightV.glsl
index 914e417ca0..fc20d3270e 100644
--- a/indra/newview/app_settings/shaders/class1/objects/fullbrightV.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/fullbrightV.glsl
@@ -2,22 +2,57 @@
* @file fullbrightV.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_matrix;
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+void passTextureIndex();
+ATTRIBUTE vec2 texcoord0;
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec4 diffuse_color;
+
+
void calcAtmospherics(vec3 inPositionEye);
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+
void main()
{
//transform vertex
- gl_Position = ftransform();
- gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
+ vec4 vert = vec4(position.xyz,1.0);
+ passTextureIndex();
+ vec4 pos = (modelview_matrix * vert);
+ gl_Position = modelview_projection_matrix*vec4(position.xyz, 1.0);
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
- vec4 pos = (gl_ModelViewMatrix * gl_Vertex);
-
calcAtmospherics(pos.xyz);
- gl_FrontColor = gl_Color;
+ vertex_color = diffuse_color;
- gl_FogFragCoord = pos.z;
+
}
diff --git a/indra/newview/app_settings/shaders/class1/objects/fullbrightWaterF.glsl b/indra/newview/app_settings/shaders/class1/objects/fullbrightWaterF.glsl
index df76e9e1eb..5d0ea0a8dd 100644
--- a/indra/newview/app_settings/shaders/class1/objects/fullbrightWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/fullbrightWaterF.glsl
@@ -2,8 +2,28 @@
* @file fullbrightWaterF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+
+
void fullbright_lighting_water();
diff --git a/indra/newview/app_settings/shaders/class1/objects/impostorF.glsl b/indra/newview/app_settings/shaders/class1/objects/impostorF.glsl
new file mode 100644
index 0000000000..add437d144
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/objects/impostorF.glsl
@@ -0,0 +1,48 @@
+/**
+ * @file impostorF.glsl
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
+uniform float minimum_alpha;
+
+uniform sampler2D diffuseMap;
+
+VARYING vec2 vary_texcoord0;
+
+void main()
+{
+ vec4 color = texture2D(diffuseMap,vary_texcoord0.xy);
+
+ if (color.a < minimum_alpha)
+ {
+ discard;
+ }
+
+ frag_color = color;
+}
diff --git a/indra/newview/app_settings/shaders/class1/objects/impostorV.glsl b/indra/newview/app_settings/shaders/class1/objects/impostorV.glsl
new file mode 100644
index 0000000000..e90dbb115a
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/objects/impostorV.glsl
@@ -0,0 +1,40 @@
+/**
+ * @file impostorV.glsl
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_projection_matrix;
+
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec2 vary_texcoord0;
+
+void main()
+{
+ //transform vertex
+ gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0, 0, 1)).xy;
+}
diff --git a/indra/newview/app_settings/shaders/class1/objects/indexedTextureF.glsl b/indra/newview/app_settings/shaders/class1/objects/indexedTextureF.glsl
new file mode 100644
index 0000000000..254c1d4fc2
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/objects/indexedTextureF.glsl
@@ -0,0 +1,33 @@
+/**
+ * @file fullbrightF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+
+
+
+void main()
+{
+ fullbright_lighting();
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/objects/indexedTextureV.glsl b/indra/newview/app_settings/shaders/class1/objects/indexedTextureV.glsl
new file mode 100644
index 0000000000..7c0699d72f
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/objects/indexedTextureV.glsl
@@ -0,0 +1,34 @@
+/**
+ * @file indexedTextureV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+ATTRIBUTE ivec4 texture_index;
+
+VARYING_FLAT ivec4 vary_texture_index;
+
+void passTextureIndex()
+{
+ vary_texture_index = texture_index;
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/objects/nonindexedTextureV.glsl b/indra/newview/app_settings/shaders/class1/objects/nonindexedTextureV.glsl
new file mode 100644
index 0000000000..80ea286ac0
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/objects/nonindexedTextureV.glsl
@@ -0,0 +1,31 @@
+/**
+ * @file nonindexedTextureV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+void passTextureIndex()
+{
+
+}
+
+
diff --git a/indra/newview/app_settings/shaders/class1/objects/previewV.glsl b/indra/newview/app_settings/shaders/class1/objects/previewV.glsl
new file mode 100644
index 0000000000..5dcfa87066
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/objects/previewV.glsl
@@ -0,0 +1,57 @@
+/**
+ * @file previewV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat3 normal_matrix;
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_matrix;
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+
+vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
+void calcAtmospherics(vec3 inPositionEye);
+
+void main()
+{
+ //transform vertex
+ vec4 pos = (modelview_matrix * vec4(position.xyz, 1.0));
+ gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
+
+ vec3 norm = normalize(normal_matrix * normal);
+
+ calcAtmospherics(pos.xyz);
+
+ vec4 color = calcLighting(pos.xyz, norm, vec4(1,1,1,1), vec4(0.));
+ vertex_color = color;
+
+
+}
diff --git a/indra/newview/app_settings/shaders/class1/objects/shinyF.glsl b/indra/newview/app_settings/shaders/class1/objects/shinyF.glsl
index 6bcd44506d..f8f88e2577 100644
--- a/indra/newview/app_settings/shaders/class1/objects/shinyF.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/shinyF.glsl
@@ -2,8 +2,28 @@
* @file shinyF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+
+
void shiny_lighting();
diff --git a/indra/newview/app_settings/shaders/class1/objects/shinySimpleSkinnedV.glsl b/indra/newview/app_settings/shaders/class1/objects/shinySimpleSkinnedV.glsl
new file mode 100644
index 0000000000..591d6fc5c9
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/objects/shinySimpleSkinnedV.glsl
@@ -0,0 +1,66 @@
+/**
+ * @file shinySimpleSkinnedV.glsl
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat4 projection_matrix;
+uniform mat4 texture_matrix0;
+uniform mat4 texture_matrix1;
+uniform mat4 modelview_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec4 diffuse_color;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+VARYING vec3 vary_texcoord1;
+
+vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
+void calcAtmospherics(vec3 inPositionEye);
+mat4 getObjectSkinnedTransform();
+
+void main()
+{
+ mat4 mat = getObjectSkinnedTransform();
+
+ mat = modelview_matrix * mat;
+ vec3 pos = (mat*vec4(position.xyz, 1.0)).xyz;
+
+ vec4 norm = vec4(position.xyz, 1.0);
+ norm.xyz += normal.xyz;
+ norm.xyz = (mat*norm).xyz;
+ norm.xyz = normalize(norm.xyz-pos.xyz);
+
+ vec3 ref = reflect(pos.xyz, -norm.xyz);
+
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
+ vary_texcoord1 = (texture_matrix1*vec4(ref,1.0)).xyz;
+
+ calcAtmospherics(pos.xyz);
+
+ vec4 color = calcLighting(pos.xyz, norm.xyz, diffuse_color, vec4(0.));
+ vertex_color = color;
+
+ gl_Position = projection_matrix*vec4(pos, 1.0);
+}
diff --git a/indra/newview/app_settings/shaders/class1/objects/shinyV.glsl b/indra/newview/app_settings/shaders/class1/objects/shinyV.glsl
index 074892c98e..fdb3453cc5 100644
--- a/indra/newview/app_settings/shaders/class1/objects/shinyV.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/shinyV.glsl
@@ -1,10 +1,46 @@
-/**
+/**
* @file shinyV.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+uniform mat3 normal_matrix;
+uniform mat4 texture_matrix0;
+uniform mat4 texture_matrix1;
+uniform mat4 modelview_matrix;
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+void passTextureIndex();
+ATTRIBUTE vec2 texcoord0;
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec4 diffuse_color;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+VARYING vec3 vary_texcoord1;
+
+vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
+
void calcAtmospherics(vec3 inPositionEye);
uniform vec4 origin;
@@ -12,19 +48,18 @@ uniform vec4 origin;
void main()
{
//transform vertex
- gl_Position = ftransform(); //gl_ModelViewProjectionMatrix * gl_Vertex;
-
- vec4 pos = (gl_ModelViewMatrix * gl_Vertex);
- vec3 norm = normalize(gl_NormalMatrix * gl_Normal);
+ vec4 vert = vec4(position.xyz,1.0);
+ passTextureIndex();
+ vec4 pos = (modelview_matrix * vert);
+ gl_Position = modelview_projection_matrix*vec4(position.xyz, 1.0);
+
+ vec3 norm = normalize(normal_matrix * normal);
+ vec3 ref = reflect(pos.xyz, -norm);
+
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
+ vary_texcoord1 = (texture_matrix1*vec4(ref,1.0)).xyz;
calcAtmospherics(pos.xyz);
-
- gl_FrontColor = gl_Color;
-
- vec3 ref = reflect(pos.xyz, -norm);
-
- gl_TexCoord[0] = gl_TextureMatrix[0]*vec4(ref,1.0);
-
- gl_FogFragCoord = pos.z;
-}
+ vertex_color = calcLighting(pos.xyz, norm, diffuse_color, vec4(0.0));
+}
diff --git a/indra/newview/app_settings/shaders/class1/objects/shinyWaterF.glsl b/indra/newview/app_settings/shaders/class1/objects/shinyWaterF.glsl
index 54b30573e7..1e72e23eef 100644
--- a/indra/newview/app_settings/shaders/class1/objects/shinyWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/shinyWaterF.glsl
@@ -2,8 +2,28 @@
* @file shinyWaterF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+
+
void shiny_lighting_water();
diff --git a/indra/newview/app_settings/shaders/class1/objects/simpleF.glsl b/indra/newview/app_settings/shaders/class1/objects/simpleF.glsl
index 61c2ce4272..29a2ce617b 100644
--- a/indra/newview/app_settings/shaders/class1/objects/simpleF.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/simpleF.glsl
@@ -2,9 +2,27 @@
* @file simpleF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+
void default_lighting();
void main()
diff --git a/indra/newview/app_settings/shaders/class1/objects/simpleNoColorV.glsl b/indra/newview/app_settings/shaders/class1/objects/simpleNoColorV.glsl
new file mode 100644
index 0000000000..0be52a52af
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/objects/simpleNoColorV.glsl
@@ -0,0 +1,59 @@
+/**
+ * @file simpleNoColorV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat3 normal_matrix;
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_matrix;
+uniform mat4 modelview_projection_matrix;
+
+uniform vec4 color;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+
+vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
+void calcAtmospherics(vec3 inPositionEye);
+
+void main()
+{
+ //transform vertex
+ vec4 pos = (modelview_matrix * vec4(position.xyz, 1.0));
+ gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
+
+ vec3 norm = normalize(normal_matrix * normal);
+
+ calcAtmospherics(pos.xyz);
+
+ vec4 col = calcLighting(pos.xyz, norm, color, vec4(0.));
+ vertex_color = col;
+
+
+}
diff --git a/indra/newview/app_settings/shaders/class1/objects/simpleNonIndexedV.glsl b/indra/newview/app_settings/shaders/class1/objects/simpleNonIndexedV.glsl
new file mode 100644
index 0000000000..cb80697d15
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/objects/simpleNonIndexedV.glsl
@@ -0,0 +1,61 @@
+/**
+ * @file simpleNonIndexedV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat3 normal_matrix;
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_matrix;
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec2 texcoord0;
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec4 diffuse_color;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+
+vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
+void calcAtmospherics(vec3 inPositionEye);
+
+void main()
+{
+ //transform vertex
+ vec4 vert = vec4(position.xyz,1.0);
+
+ gl_Position = modelview_projection_matrix*vert;
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0, 0, 1)).xy;
+
+ vec4 pos = (modelview_matrix * vert);
+
+ vec3 norm = normalize(normal_matrix * normal);
+
+ calcAtmospherics(pos.xyz);
+
+ vec4 color = calcLighting(pos.xyz, norm, diffuse_color, vec4(0.));
+ vertex_color = color;
+
+
+}
diff --git a/indra/newview/app_settings/shaders/class1/objects/simpleSkinnedV.glsl b/indra/newview/app_settings/shaders/class1/objects/simpleSkinnedV.glsl
new file mode 100644
index 0000000000..1c6e53b187
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/objects/simpleSkinnedV.glsl
@@ -0,0 +1,65 @@
+/**
+ * @file simpleSkinnedV.glsl
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_matrix;
+uniform mat4 projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec4 diffuse_color;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+
+vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
+void calcAtmospherics(vec3 inPositionEye);
+mat4 getObjectSkinnedTransform();
+
+void main()
+{
+ //transform vertex
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
+
+ mat4 mat = getObjectSkinnedTransform();
+
+ mat = modelview_matrix * mat;
+ vec3 pos = (mat*vec4(position.xyz, 1.0)).xyz;
+
+ vec4 norm = vec4(position.xyz, 1.0);
+ norm.xyz += normal.xyz;
+ norm.xyz = (mat*norm).xyz;
+ norm.xyz = normalize(norm.xyz-pos.xyz);
+
+ calcAtmospherics(pos.xyz);
+
+ vec4 color = calcLighting(pos.xyz, norm.xyz, diffuse_color, vec4(0.));
+ vertex_color = color;
+
+ gl_Position = projection_matrix*vec4(pos, 1.0);
+
+
+}
diff --git a/indra/newview/app_settings/shaders/class1/objects/simpleTexGenV.glsl b/indra/newview/app_settings/shaders/class1/objects/simpleTexGenV.glsl
new file mode 100644
index 0000000000..d4dee78793
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/objects/simpleTexGenV.glsl
@@ -0,0 +1,77 @@
+/**
+ * @file simpleV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat3 normal_matrix;
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_matrix;
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+void passTextureIndex();
+ATTRIBUTE vec2 texcoord0;
+ATTRIBUTE vec3 normal;
+
+uniform vec4 color;
+uniform vec4 object_plane_t;
+uniform vec4 object_plane_s;
+
+vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
+void calcAtmospherics(vec3 inPositionEye);
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+vec4 texgen_object(vec4 vpos, vec4 tc, mat4 mat, vec4 tp0, vec4 tp1)
+{
+ vec4 tcoord;
+
+ tcoord.x = dot(vpos, tp0);
+ tcoord.y = dot(vpos, tp1);
+ tcoord.z = tc.z;
+ tcoord.w = tc.w;
+
+ tcoord = mat * tcoord;
+
+ return tcoord;
+}
+
+void main()
+{
+ //transform vertex
+ vec4 vert = vec4(position.xyz,1.0);
+ passTextureIndex();
+ vec4 pos = (modelview_matrix * vert);
+ gl_Position = modelview_projection_matrix*vec4(position.xyz, 1.0);
+ vary_texcoord0.xy = texgen_object(vec4(position.xyz, 1.0), vec4(texcoord0,0,1), texture_matrix0, object_plane_s, object_plane_t).xy;
+
+ vec3 norm = normalize(normal_matrix * normal);
+
+ calcAtmospherics(pos.xyz);
+
+ vec4 color = calcLighting(pos.xyz, norm, color, vec4(0.));
+ vertex_color = color;
+
+
+}
diff --git a/indra/newview/app_settings/shaders/class1/objects/simpleV.glsl b/indra/newview/app_settings/shaders/class1/objects/simpleV.glsl
index ced1a4be01..37a20383e2 100644
--- a/indra/newview/app_settings/shaders/class1/objects/simpleV.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/simpleV.glsl
@@ -2,26 +2,63 @@
* @file simpleV.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+uniform mat3 normal_matrix;
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_matrix;
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+void passTextureIndex();
+ATTRIBUTE vec2 texcoord0;
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec4 diffuse_color;
+
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
void calcAtmospherics(vec3 inPositionEye);
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+
void main()
{
//transform vertex
- gl_Position = ftransform();
- gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
+ vec4 vert = vec4(position.xyz,1.0);
+ passTextureIndex();
+ vec4 pos = (modelview_matrix * vert);
+ gl_Position = modelview_projection_matrix*vec4(position.xyz, 1.0);
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0, 0, 1)).xy;
+
- vec4 pos = (gl_ModelViewMatrix * gl_Vertex);
- vec3 norm = normalize(gl_NormalMatrix * gl_Normal);
+ vec3 norm = normalize(normal_matrix * normal);
calcAtmospherics(pos.xyz);
- vec4 color = calcLighting(pos.xyz, norm, gl_Color, vec4(0.));
- gl_FrontColor = color;
+ vec4 color = calcLighting(pos.xyz, norm, diffuse_color, vec4(0.));
+ vertex_color = color;
- gl_FogFragCoord = pos.z;
+
}
diff --git a/indra/newview/app_settings/shaders/class1/objects/simpleWaterF.glsl b/indra/newview/app_settings/shaders/class1/objects/simpleWaterF.glsl
index 5e44212aed..2e87ac5bbc 100644
--- a/indra/newview/app_settings/shaders/class1/objects/simpleWaterF.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/simpleWaterF.glsl
@@ -2,8 +2,28 @@
* @file simpleWaterF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+
+
void default_lighting_water();
diff --git a/indra/newview/app_settings/shaders/class1/objects/treeV.glsl b/indra/newview/app_settings/shaders/class1/objects/treeV.glsl
new file mode 100644
index 0000000000..fa01a27ec0
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/objects/treeV.glsl
@@ -0,0 +1,60 @@
+/**
+ * @file treeV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat3 normal_matrix;
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_matrix;
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec2 texcoord0;
+ATTRIBUTE vec3 normal;
+
+vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
+void calcAtmospherics(vec3 inPositionEye);
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+
+void main()
+{
+ //transform vertex
+ vec4 vert = vec4(position.xyz,1.0);
+
+ gl_Position = modelview_projection_matrix*vert;
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0, 0, 1)).xy;
+
+ vec4 pos = (modelview_matrix * vert);
+
+ vec3 norm = normalize(normal_matrix * normal);
+
+ calcAtmospherics(pos.xyz);
+
+ vec4 color = calcLighting(pos.xyz, norm, vec4(1,1,1,1), vec4(0.));
+ vertex_color = color;
+
+
+}
diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsF.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsF.glsl
index 7a05b8c8c6..aacc503e13 100644
--- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsF.glsl
+++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsF.glsl
@@ -2,8 +2,28 @@
* @file atmosphericsF.glsl
*
* $LicenseInfo:firstyear=2005&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2005, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+
+
vec3 atmosLighting(vec3 light)
{
diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsHelpersV.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsHelpersV.glsl
index 874f2b4843..6ff860362c 100644
--- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsHelpersV.glsl
+++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsHelpersV.glsl
@@ -2,22 +2,43 @@
* @file atmosphericsHelpersV.glsl
*
* $LicenseInfo:firstyear=2005&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2005, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+
+uniform vec4 sunlight_color_copy;
+uniform vec4 light_ambient;
vec3 atmosAmbient(vec3 light)
{
- return gl_LightModel.ambient.rgb + light;
+ return light + light_ambient.rgb;
}
vec3 atmosAffectDirectionalLight(float lightIntensity)
{
- return gl_LightSource[0].diffuse.rgb * lightIntensity;
+ return sunlight_color_copy.rgb * lightIntensity;
}
vec3 atmosGetDiffuseSunlightColor()
{
- return gl_LightSource[0].diffuse.rgb;
+ return sunlight_color_copy.rgb;
}
vec3 scaleDownLight(vec3 light)
diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsV.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsV.glsl
index 7ead9ddf26..76d7d5059d 100644
--- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsV.glsl
+++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsV.glsl
@@ -2,8 +2,28 @@
* @file atmosphericsV.glsl
*
* $LicenseInfo:firstyear=2005&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2005, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+
+
void setPositionEye(vec3 v);
diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsF.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsF.glsl
index f6032f8d41..8bdae328bd 100644
--- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsF.glsl
+++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsF.glsl
@@ -2,12 +2,29 @@
* @file atmosphericVarsF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
-varying vec3 vary_PositionEye;
+
vec3 getPositionEye()
{
- return vary_PositionEye;
+ return vec3(0,0,0);
}
diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsV.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsV.glsl
index a696ddf607..8ec9ae617c 100644
--- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsV.glsl
+++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsV.glsl
@@ -2,18 +2,35 @@
* @file atmosphericVarsV.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
-varying vec3 vary_PositionEye;
+
vec3 getPositionEye()
{
- return vary_PositionEye;
+ return vec3(0,0,0);
}
void setPositionEye(vec3 v)
{
- vary_PositionEye = v;
+
}
diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsWaterF.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsWaterF.glsl
new file mode 100644
index 0000000000..636d4af006
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsWaterF.glsl
@@ -0,0 +1,33 @@
+/**
+ * @file atmosphericVarsWaterF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+
+VARYING vec3 vary_PositionEye;
+
+vec3 getPositionEye()
+{
+ return vary_PositionEye;
+}
+
diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsWaterV.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsWaterV.glsl
new file mode 100644
index 0000000000..8afcc20f6d
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsWaterV.glsl
@@ -0,0 +1,37 @@
+/**
+ * @file atmosphericVarsWaterV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+
+VARYING vec3 vary_PositionEye;
+
+vec3 getPositionEye()
+{
+ return vary_PositionEye;
+}
+
+void setPositionEye(vec3 v)
+{
+ vary_PositionEye = v;
+}
diff --git a/indra/newview/app_settings/shaders/class1/windlight/gammaF.glsl b/indra/newview/app_settings/shaders/class1/windlight/gammaF.glsl
index 4a1899798a..62f4e51449 100644
--- a/indra/newview/app_settings/shaders/class1/windlight/gammaF.glsl
+++ b/indra/newview/app_settings/shaders/class1/windlight/gammaF.glsl
@@ -2,8 +2,28 @@
* @file gammaF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+
+
uniform vec4 gamma;
diff --git a/indra/newview/app_settings/shaders/class1/windlight/transportF.glsl b/indra/newview/app_settings/shaders/class1/windlight/transportF.glsl
index b78b90545e..7c95ecdb14 100644
--- a/indra/newview/app_settings/shaders/class1/windlight/transportF.glsl
+++ b/indra/newview/app_settings/shaders/class1/windlight/transportF.glsl
@@ -2,8 +2,28 @@
* @file transportF.glsl
*
* $LicenseInfo:firstyear=2005&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2005, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+
+
vec3 atmosTransport(vec3 light)
{
diff --git a/indra/newview/app_settings/shaders/class2/avatar/eyeballV.glsl b/indra/newview/app_settings/shaders/class2/avatar/eyeballV.glsl
index 47300f0b39..5af9f5c902 100644
--- a/indra/newview/app_settings/shaders/class2/avatar/eyeballV.glsl
+++ b/indra/newview/app_settings/shaders/class2/avatar/eyeballV.glsl
@@ -2,29 +2,61 @@
* @file eyeballV.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+uniform mat3 normal_matrix;
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_matrix;
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec4 diffuse_color;
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec2 texcoord0;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+
vec4 calcLightingSpecular(vec3 pos, vec3 norm, vec4 color, inout vec4 specularColor, vec4 baseCol);
void calcAtmospherics(vec3 inPositionEye);
void main()
{
//transform vertex
- gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
- gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
-
- vec3 pos = (gl_ModelViewMatrix * gl_Vertex).xyz;
- vec3 norm = normalize(gl_NormalMatrix * gl_Normal);
+ vec3 pos = (modelview_matrix * vec4(position.xyz, 1.0)).xyz;
+ gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
+
+ vec3 norm = normalize(normal_matrix * normal);
calcAtmospherics(pos.xyz);
// vec4 specular = specularColor;
vec4 specular = vec4(1.0);
- vec4 color = calcLightingSpecular(pos, norm, gl_Color, specular, vec4(0.0));
+ vec4 color = calcLightingSpecular(pos, norm, diffuse_color, specular, vec4(0.0));
- gl_FrontColor = color;
- gl_FogFragCoord = pos.z;
+ vertex_color = color;
+
}
diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl
index e2d7cd94da..08f6ec63fe 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl
@@ -2,17 +2,42 @@
* @file alphaF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#extension GL_ARB_texture_rectangle : enable
-uniform sampler2D diffuseMap;
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
uniform sampler2DRectShadow shadowMap0;
uniform sampler2DRectShadow shadowMap1;
uniform sampler2DRectShadow shadowMap2;
uniform sampler2DRectShadow shadowMap3;
-uniform sampler2D noiseMap;
uniform sampler2DRect depthMap;
uniform mat4 shadow_matrix[6];
@@ -23,29 +48,16 @@ uniform vec2 shadow_res;
vec3 atmosLighting(vec3 light);
vec3 scaleSoftClip(vec3 light);
-varying vec3 vary_ambient;
-varying vec3 vary_directional;
-varying vec3 vary_fragcoord;
-varying vec3 vary_position;
-varying vec3 vary_light;
+VARYING vec3 vary_ambient;
+VARYING vec3 vary_directional;
+VARYING vec3 vary_fragcoord;
+VARYING vec3 vary_position;
+VARYING vec3 vary_pointlight_col;
uniform float shadow_bias;
uniform mat4 inv_proj;
-vec4 getPosition(vec2 pos_screen)
-{
- float depth = texture2DRect(depthMap, pos_screen.xy).a;
- vec2 sc = pos_screen.xy*2.0;
- sc /= screen_res;
- sc -= vec2(1.0,1.0);
- vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0);
- vec4 pos = inv_proj * ndc;
- pos.xyz /= pos.w;
- pos.w = 1.0;
- return pos;
-}
-
float pcfShadow(sampler2DRectShadow shadowMap, vec4 stc, float scl)
{
stc.xyz /= stc.w;
@@ -68,9 +80,7 @@ void main()
vec2 frag = vary_fragcoord.xy/vary_fragcoord.z*0.5+0.5;
frag *= screen_res;
- vec3 samp_pos = getPosition(frag).xyz;
-
- float shadow = 1.0;
+ float shadow = 0.0;
vec4 pos = vec4(vary_position, 1.0);
vec4 spos = pos;
@@ -79,43 +89,78 @@ void main()
{
vec4 lpos;
- if (spos.z < -shadow_clip.z)
+ vec4 near_split = shadow_clip*-0.75;
+ vec4 far_split = shadow_clip*-1.25;
+ vec4 transition_domain = near_split-far_split;
+ float weight = 0.0;
+
+ if (spos.z < near_split.z)
{
lpos = shadow_matrix[3]*spos;
lpos.xy *= shadow_res;
- shadow = pcfShadow(shadowMap3, lpos, 1.5);
+
+ float w = 1.0;
+ w -= max(spos.z-far_split.z, 0.0)/transition_domain.z;
+ shadow += pcfShadow(shadowMap3, lpos, 0.25)*w;
+ weight += w;
shadow += max((pos.z+shadow_clip.z)/(shadow_clip.z-shadow_clip.w)*2.0-1.0, 0.0);
}
- else if (spos.z < -shadow_clip.y)
+
+ if (spos.z < near_split.y && spos.z > far_split.z)
{
lpos = shadow_matrix[2]*spos;
lpos.xy *= shadow_res;
- shadow = pcfShadow(shadowMap2, lpos, 1.5);
+
+ float w = 1.0;
+ w -= max(spos.z-far_split.y, 0.0)/transition_domain.y;
+ w -= max(near_split.z-spos.z, 0.0)/transition_domain.z;
+ shadow += pcfShadow(shadowMap2, lpos, 0.75)*w;
+ weight += w;
}
- else if (spos.z < -shadow_clip.x)
+
+ if (spos.z < near_split.x && spos.z > far_split.y)
{
lpos = shadow_matrix[1]*spos;
lpos.xy *= shadow_res;
- shadow = pcfShadow(shadowMap1, lpos, 1.5);
+
+ float w = 1.0;
+ w -= max(spos.z-far_split.x, 0.0)/transition_domain.x;
+ w -= max(near_split.y-spos.z, 0.0)/transition_domain.y;
+ shadow += pcfShadow(shadowMap1, lpos, 0.75)*w;
+ weight += w;
}
- else
+
+ if (spos.z > far_split.x)
{
lpos = shadow_matrix[0]*spos;
lpos.xy *= shadow_res;
- shadow = pcfShadow(shadowMap0, lpos, 1.5);
+
+ float w = 1.0;
+ w -= max(near_split.x-spos.z, 0.0)/transition_domain.x;
+
+ shadow += pcfShadow(shadowMap0, lpos, 1.0)*w;
+ weight += w;
}
+
+
+ shadow /= weight;
+ }
+ else
+ {
+ shadow = 1.0;
}
- vec4 col = vec4(vary_ambient + vary_directional.rgb*shadow, gl_Color.a);
- vec4 color = texture2D(diffuseMap, gl_TexCoord[0].xy) * col;
+ vec4 diff = diffuseLookup(vary_texcoord0.xy);
+
+ vec4 col = vec4(vary_ambient + vary_directional.rgb*shadow, vertex_color.a);
+ vec4 color = diff * col;
color.rgb = atmosLighting(color.rgb);
color.rgb = scaleSoftClip(color.rgb);
- //gl_FragColor = gl_Color;
- gl_FragColor = color;
- //gl_FragColor = vec4(1,0,1,1)*shadow;
-
+ color.rgb += diff.rgb * vary_pointlight_col.rgb;
+
+ frag_color = color;
}
diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedF.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedF.glsl
new file mode 100644
index 0000000000..aae6a070e2
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedF.glsl
@@ -0,0 +1,180 @@
+/**
+ * @file alphaF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#extension GL_ARB_texture_rectangle : enable
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
+uniform sampler2DRectShadow shadowMap0;
+uniform sampler2DRectShadow shadowMap1;
+uniform sampler2DRectShadow shadowMap2;
+uniform sampler2DRectShadow shadowMap3;
+uniform sampler2DRect depthMap;
+uniform sampler2D diffuseMap;
+
+uniform mat4 shadow_matrix[6];
+uniform vec4 shadow_clip;
+uniform vec2 screen_res;
+uniform vec2 shadow_res;
+
+vec3 atmosLighting(vec3 light);
+vec3 scaleSoftClip(vec3 light);
+
+VARYING vec3 vary_ambient;
+VARYING vec3 vary_directional;
+VARYING vec3 vary_fragcoord;
+VARYING vec3 vary_position;
+VARYING vec3 vary_pointlight_col;
+VARYING vec2 vary_texcoord0;
+VARYING vec4 vertex_color;
+
+uniform float shadow_bias;
+
+uniform mat4 inv_proj;
+
+vec4 getPosition(vec2 pos_screen)
+{
+ float depth = texture2DRect(depthMap, pos_screen.xy).a;
+ vec2 sc = pos_screen.xy*2.0;
+ sc /= screen_res;
+ sc -= vec2(1.0,1.0);
+ vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0);
+ vec4 pos = inv_proj * ndc;
+ pos.xyz /= pos.w;
+ pos.w = 1.0;
+ return pos;
+}
+
+float pcfShadow(sampler2DRectShadow shadowMap, vec4 stc, float scl)
+{
+ stc.xyz /= stc.w;
+ stc.z += shadow_bias;
+
+ float cs = shadow2DRect(shadowMap, stc.xyz).x;
+ float shadow = cs;
+
+ shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(scl, scl, 0.0)).x, cs);
+ shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(scl, -scl, 0.0)).x, cs);
+ shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(-scl, scl, 0.0)).x, cs);
+ shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(-scl, -scl, 0.0)).x, cs);
+
+ return shadow/5.0;
+}
+
+
+void main()
+{
+ vec2 frag = vary_fragcoord.xy/vary_fragcoord.z*0.5+0.5;
+ frag *= screen_res;
+
+ float shadow = 0.0;
+ vec4 pos = vec4(vary_position, 1.0);
+
+ vec4 spos = pos;
+
+ if (spos.z > -shadow_clip.w)
+ {
+ vec4 lpos;
+
+ vec4 near_split = shadow_clip*-0.75;
+ vec4 far_split = shadow_clip*-1.25;
+ vec4 transition_domain = near_split-far_split;
+ float weight = 0.0;
+
+ if (spos.z < near_split.z)
+ {
+ lpos = shadow_matrix[3]*spos;
+ lpos.xy *= shadow_res;
+
+ float w = 1.0;
+ w -= max(spos.z-far_split.z, 0.0)/transition_domain.z;
+ shadow += pcfShadow(shadowMap3, lpos, 0.25)*w;
+ weight += w;
+ shadow += max((pos.z+shadow_clip.z)/(shadow_clip.z-shadow_clip.w)*2.0-1.0, 0.0);
+ }
+
+ if (spos.z < near_split.y && spos.z > far_split.z)
+ {
+ lpos = shadow_matrix[2]*spos;
+ lpos.xy *= shadow_res;
+
+ float w = 1.0;
+ w -= max(spos.z-far_split.y, 0.0)/transition_domain.y;
+ w -= max(near_split.z-spos.z, 0.0)/transition_domain.z;
+ shadow += pcfShadow(shadowMap2, lpos, 0.75)*w;
+ weight += w;
+ }
+
+ if (spos.z < near_split.x && spos.z > far_split.y)
+ {
+ lpos = shadow_matrix[1]*spos;
+ lpos.xy *= shadow_res;
+
+ float w = 1.0;
+ w -= max(spos.z-far_split.x, 0.0)/transition_domain.x;
+ w -= max(near_split.y-spos.z, 0.0)/transition_domain.y;
+ shadow += pcfShadow(shadowMap1, lpos, 0.75)*w;
+ weight += w;
+ }
+
+ if (spos.z > far_split.x)
+ {
+ lpos = shadow_matrix[0]*spos;
+ lpos.xy *= shadow_res;
+
+ float w = 1.0;
+ w -= max(near_split.x-spos.z, 0.0)/transition_domain.x;
+
+ shadow += pcfShadow(shadowMap0, lpos, 1.0)*w;
+ weight += w;
+ }
+
+
+ shadow /= weight;
+
+ }
+ else
+ {
+ shadow = 1.0;
+ }
+
+ vec4 diff = texture2D(diffuseMap,vary_texcoord0.xy);
+
+ vec4 col = vec4(vary_ambient + vary_directional.rgb*shadow, vertex_color.a);
+ vec4 color = diff * col;
+
+ color.rgb = atmosLighting(color.rgb);
+
+ color.rgb = scaleSoftClip(color.rgb);
+
+ color.rgb += diff.rgb * vary_pointlight_col.rgb;
+
+ frag_color = color;
+}
+
diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedNoColorF.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedNoColorF.glsl
new file mode 100644
index 0000000000..931577359e
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedNoColorF.glsl
@@ -0,0 +1,178 @@
+/**
+ * @file alphaNonIndexedNoColorF.glsl
+ *
+ * $LicenseInfo:firstyear=2005&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2005, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#extension GL_ARB_texture_rectangle : enable
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
+uniform sampler2DRectShadow shadowMap0;
+uniform sampler2DRectShadow shadowMap1;
+uniform sampler2DRectShadow shadowMap2;
+uniform sampler2DRectShadow shadowMap3;
+uniform sampler2DRect depthMap;
+uniform sampler2D diffuseMap;
+
+uniform mat4 shadow_matrix[6];
+uniform vec4 shadow_clip;
+uniform vec2 screen_res;
+uniform vec2 shadow_res;
+
+vec3 atmosLighting(vec3 light);
+vec3 scaleSoftClip(vec3 light);
+
+VARYING vec3 vary_ambient;
+VARYING vec3 vary_directional;
+VARYING vec3 vary_fragcoord;
+VARYING vec3 vary_position;
+VARYING vec3 vary_pointlight_col;
+VARYING vec2 vary_texcoord0;
+
+uniform float shadow_bias;
+
+uniform mat4 inv_proj;
+
+vec4 getPosition(vec2 pos_screen)
+{
+ float depth = texture2DRect(depthMap, pos_screen.xy).a;
+ vec2 sc = pos_screen.xy*2.0;
+ sc /= screen_res;
+ sc -= vec2(1.0,1.0);
+ vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0);
+ vec4 pos = inv_proj * ndc;
+ pos.xyz /= pos.w;
+ pos.w = 1.0;
+ return pos;
+}
+
+float pcfShadow(sampler2DRectShadow shadowMap, vec4 stc, float scl)
+{
+ stc.xyz /= stc.w;
+ stc.z += shadow_bias;
+
+ float cs = shadow2DRect(shadowMap, stc.xyz).x;
+ float shadow = cs;
+
+ shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(scl, scl, 0.0)).x, cs);
+ shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(scl, -scl, 0.0)).x, cs);
+ shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(-scl, scl, 0.0)).x, cs);
+ shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(-scl, -scl, 0.0)).x, cs);
+
+ return shadow/5.0;
+}
+
+
+void main()
+{
+ vec2 frag = vary_fragcoord.xy/vary_fragcoord.z*0.5+0.5;
+ frag *= screen_res;
+
+ float shadow = 0.0;
+ vec4 pos = vec4(vary_position, 1.0);
+
+ vec4 spos = pos;
+
+ if (spos.z > -shadow_clip.w)
+ {
+ vec4 lpos;
+
+ vec4 near_split = shadow_clip*-0.75;
+ vec4 far_split = shadow_clip*-1.25;
+ vec4 transition_domain = near_split-far_split;
+ float weight = 0.0;
+
+ if (spos.z < near_split.z)
+ {
+ lpos = shadow_matrix[3]*spos;
+ lpos.xy *= shadow_res;
+
+ float w = 1.0;
+ w -= max(spos.z-far_split.z, 0.0)/transition_domain.z;
+ shadow += pcfShadow(shadowMap3, lpos, 0.25)*w;
+ weight += w;
+ shadow += max((pos.z+shadow_clip.z)/(shadow_clip.z-shadow_clip.w)*2.0-1.0, 0.0);
+ }
+
+ if (spos.z < near_split.y && spos.z > far_split.z)
+ {
+ lpos = shadow_matrix[2]*spos;
+ lpos.xy *= shadow_res;
+
+ float w = 1.0;
+ w -= max(spos.z-far_split.y, 0.0)/transition_domain.y;
+ w -= max(near_split.z-spos.z, 0.0)/transition_domain.z;
+ shadow += pcfShadow(shadowMap2, lpos, 0.75)*w;
+ weight += w;
+ }
+
+ if (spos.z < near_split.x && spos.z > far_split.y)
+ {
+ lpos = shadow_matrix[1]*spos;
+ lpos.xy *= shadow_res;
+
+ float w = 1.0;
+ w -= max(spos.z-far_split.x, 0.0)/transition_domain.x;
+ w -= max(near_split.y-spos.z, 0.0)/transition_domain.y;
+ shadow += pcfShadow(shadowMap1, lpos, 0.75)*w;
+ weight += w;
+ }
+
+ if (spos.z > far_split.x)
+ {
+ lpos = shadow_matrix[0]*spos;
+ lpos.xy *= shadow_res;
+
+ float w = 1.0;
+ w -= max(near_split.x-spos.z, 0.0)/transition_domain.x;
+
+ shadow += pcfShadow(shadowMap0, lpos, 1.0)*w;
+ weight += w;
+ }
+
+
+ shadow /= weight;
+ }
+ else
+ {
+ shadow = 1.0;
+ }
+
+ vec4 diff = texture2D(diffuseMap,vary_texcoord0.xy);
+
+ vec4 col = vec4(vary_ambient + vary_directional.rgb*shadow, 1.0);
+ vec4 color = diff * col;
+
+ color.rgb = atmosLighting(color.rgb);
+
+ color.rgb = scaleSoftClip(color.rgb);
+
+ color.rgb += diff.rgb * vary_pointlight_col.rgb;
+
+ frag_color = color;
+}
+
diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaSkinnedV.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaSkinnedV.glsl
new file mode 100644
index 0000000000..9629cfe824
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class2/deferred/alphaSkinnedV.glsl
@@ -0,0 +1,155 @@
+/**
+ * @file alphaSkinnedV.glsl
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+uniform mat4 projection_matrix;
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_matrix;
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec4 diffuse_color;
+ATTRIBUTE vec2 texcoord0;
+
+vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
+void calcAtmospherics(vec3 inPositionEye);
+
+float calcDirectionalLight(vec3 n, vec3 l);
+mat4 getObjectSkinnedTransform();
+vec3 atmosAmbient(vec3 light);
+vec3 atmosAffectDirectionalLight(float lightIntensity);
+vec3 scaleDownLight(vec3 light);
+vec3 scaleUpLight(vec3 light);
+
+VARYING vec3 vary_ambient;
+VARYING vec3 vary_directional;
+VARYING vec3 vary_fragcoord;
+VARYING vec3 vary_position;
+VARYING vec3 vary_pointlight_col;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+
+uniform float near_clip;
+uniform float shadow_offset;
+uniform float shadow_bias;
+
+uniform vec4 light_position[8];
+uniform vec3 light_direction[8];
+uniform vec3 light_attenuation[8];
+uniform vec3 light_diffuse[8];
+
+float calcDirectionalLight(vec3 n, vec3 l)
+{
+ float a = max(dot(n,l),0.0);
+ return a;
+}
+
+float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight)
+{
+//get light vector
+ vec3 lv = lp.xyz-v;
+
+ //get distance
+ float d = dot(lv,lv);
+
+ float da = 0.0;
+
+ if (d > 0.0 && la > 0.0 && fa > 0.0)
+ {
+ //normalize light vector
+ lv = normalize(lv);
+
+ //distance attenuation
+ float dist2 = d/la;
+ da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
+
+ // spotlight coefficient.
+ float spot = max(dot(-ln, lv), is_pointlight);
+ da *= spot*spot; // GL_SPOT_EXPONENT=2
+
+ //angular attenuation
+ da *= max(dot(n, lv), 0.0);
+ }
+
+ return da;
+}
+
+void main()
+{
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
+
+ mat4 mat = getObjectSkinnedTransform();
+
+ mat = modelview_matrix * mat;
+
+ vec3 pos = (mat*vec4(position, 1.0)).xyz;
+
+ gl_Position = projection_matrix * vec4(pos, 1.0);
+
+ vec4 n = vec4(position, 1.0);
+ n.xyz += normal.xyz;
+ n.xyz = (mat*n).xyz;
+ n.xyz = normalize(n.xyz-pos.xyz);
+
+ vec3 norm = n.xyz;
+
+ float dp_directional_light = max(0.0, dot(norm, light_position[0].xyz));
+ vary_position = pos.xyz + light_position[0].xyz * (1.0-dp_directional_light)*shadow_offset;
+
+ calcAtmospherics(pos.xyz);
+
+ //vec4 color = calcLighting(pos.xyz, norm, diffuse_color, vec4(0.));
+ vec4 col = vec4(0.0, 0.0, 0.0, diffuse_color.a);
+
+ // Collect normal lights
+ col.rgb += light_diffuse[2].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[2], light_direction[2], light_attenuation[2].x, light_attenuation[2].y, light_attenuation[2].z);
+ col.rgb += light_diffuse[3].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[3], light_direction[3], light_attenuation[3].x, light_attenuation[3].y, light_attenuation[3].z);
+ col.rgb += light_diffuse[4].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[4], light_direction[4], light_attenuation[4].x, light_attenuation[4].y, light_attenuation[4].z);
+ col.rgb += light_diffuse[5].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[5], light_direction[5], light_attenuation[5].x, light_attenuation[5].y, light_attenuation[5].z);
+ col.rgb += light_diffuse[6].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[6], light_direction[6], light_attenuation[6].x, light_attenuation[6].y, light_attenuation[6].z);
+ col.rgb += light_diffuse[7].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[7], light_direction[7], light_attenuation[7].x, light_attenuation[7].y, light_attenuation[7].z);
+
+ vary_pointlight_col = col.rgb*diffuse_color.rgb;
+
+ col.rgb = vec3(0,0,0);
+
+ // Add windlight lights
+ col.rgb = atmosAmbient(vec3(0.));
+
+ vary_ambient = col.rgb*diffuse_color.rgb;
+ vary_directional.rgb = diffuse_color.rgb*atmosAffectDirectionalLight(max(calcDirectionalLight(norm, light_position[0].xyz), (1.0-diffuse_color.a)*(1.0-diffuse_color.a)));
+
+ col.rgb = min(col.rgb*diffuse_color.rgb, 1.0);
+
+ vertex_color = col;
+
+
+
+ pos.xyz = (modelview_projection_matrix * vec4(position.xyz, 1.0)).xyz;
+ vary_fragcoord.xyz = pos.xyz + vec3(0,0,near_clip);
+
+}
+
diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl
index 45f727951e..1586aab0f2 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl
@@ -2,73 +2,149 @@
* @file alphaV.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+uniform mat3 normal_matrix;
+uniform mat4 texture_matrix0;
+uniform mat4 modelview_matrix;
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+void passTextureIndex();
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec4 diffuse_color;
+ATTRIBUTE vec2 texcoord0;
+
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
void calcAtmospherics(vec3 inPositionEye);
float calcDirectionalLight(vec3 n, vec3 l);
-float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float is_pointlight);
vec3 atmosAmbient(vec3 light);
vec3 atmosAffectDirectionalLight(float lightIntensity);
vec3 scaleDownLight(vec3 light);
vec3 scaleUpLight(vec3 light);
-varying vec3 vary_ambient;
-varying vec3 vary_directional;
-varying vec3 vary_fragcoord;
-varying vec3 vary_position;
-varying vec3 vary_light;
+VARYING vec3 vary_ambient;
+VARYING vec3 vary_directional;
+VARYING vec3 vary_fragcoord;
+VARYING vec3 vary_position;
+VARYING vec3 vary_pointlight_col;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
uniform float near_clip;
uniform float shadow_offset;
uniform float shadow_bias;
+uniform vec4 light_position[8];
+uniform vec3 light_direction[8];
+uniform vec3 light_attenuation[8];
+uniform vec3 light_diffuse[8];
+
+float calcDirectionalLight(vec3 n, vec3 l)
+{
+ float a = max(dot(n,l),0.0);
+ return a;
+}
+
+float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight)
+{
+ //get light vector
+ vec3 lv = lp.xyz-v;
+
+ //get distance
+ float d = dot(lv,lv);
+
+ float da = 0.0;
+
+ if (d > 0.0 && la > 0.0 && fa > 0.0)
+ {
+ //normalize light vector
+ lv = normalize(lv);
+
+ //distance attenuation
+ float dist2 = d/la;
+ da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
+
+ // spotlight coefficient.
+ float spot = max(dot(-ln, lv), is_pointlight);
+ da *= spot*spot; // GL_SPOT_EXPONENT=2
+
+ //angular attenuation
+ da *= max(dot(n, lv), 0.0);
+ }
+
+ return da;
+}
+
void main()
{
//transform vertex
- gl_Position = ftransform();
-
- gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
+ vec4 vert = vec4(position.xyz, 1.0);
+ passTextureIndex();
+ vec4 pos = (modelview_matrix * vert);
+ gl_Position = modelview_projection_matrix*vec4(position.xyz, 1.0);
- vec4 pos = (gl_ModelViewMatrix * gl_Vertex);
- vec3 norm = normalize(gl_NormalMatrix * gl_Normal);
+ vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
+
+ vec3 norm = normalize(normal_matrix * normal);
- float dp_directional_light = max(0.0, dot(norm, gl_LightSource[0].position.xyz));
- vary_position = pos.xyz + gl_LightSource[0].position.xyz * (1.0-dp_directional_light)*shadow_offset;
+ float dp_directional_light = max(0.0, dot(norm, light_position[0].xyz));
+ vary_position = pos.xyz + light_position[0].xyz * (1.0-dp_directional_light)*shadow_offset;
calcAtmospherics(pos.xyz);
- //vec4 color = calcLighting(pos.xyz, norm, gl_Color, vec4(0.));
- vec4 col = vec4(0.0, 0.0, 0.0, gl_Color.a);
-
- // Collect normal lights (need to be divided by two, as we later multiply by 2)
- col.rgb += gl_LightSource[2].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[2].position, gl_LightSource[2].spotDirection.xyz, gl_LightSource[2].linearAttenuation, gl_LightSource[2].specular.a);
- col.rgb += gl_LightSource[3].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[3].position, gl_LightSource[3].spotDirection.xyz, gl_LightSource[3].linearAttenuation, gl_LightSource[3].specular.a);
- col.rgb += gl_LightSource[4].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[4].position, gl_LightSource[4].spotDirection.xyz, gl_LightSource[4].linearAttenuation, gl_LightSource[4].specular.a);
- col.rgb += gl_LightSource[5].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[5].position, gl_LightSource[5].spotDirection.xyz, gl_LightSource[5].linearAttenuation, gl_LightSource[5].specular.a);
- col.rgb += gl_LightSource[6].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[6].position, gl_LightSource[6].spotDirection.xyz, gl_LightSource[6].linearAttenuation, gl_LightSource[6].specular.a);
- col.rgb += gl_LightSource[7].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[7].position, gl_LightSource[7].spotDirection.xyz, gl_LightSource[7].linearAttenuation, gl_LightSource[7].specular.a);
- col.rgb += gl_LightSource[1].diffuse.rgb*calcDirectionalLight(norm, gl_LightSource[1].position.xyz);
- col.rgb = scaleDownLight(col.rgb);
+ //vec4 color = calcLighting(pos.xyz, norm, diffuse_color, vec4(0.));
+ vec4 col = vec4(0.0, 0.0, 0.0, diffuse_color.a);
+
+ // Collect normal lights
+ col.rgb += light_diffuse[2].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[2], light_direction[2], light_attenuation[2].x, light_attenuation[2].y, light_attenuation[2].z);
+ col.rgb += light_diffuse[3].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[3], light_direction[3], light_attenuation[3].x, light_attenuation[3].y, light_attenuation[3].z);
+ col.rgb += light_diffuse[4].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[4], light_direction[4], light_attenuation[4].x, light_attenuation[4].y, light_attenuation[4].z);
+ col.rgb += light_diffuse[5].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[5], light_direction[5], light_attenuation[5].x, light_attenuation[5].y, light_attenuation[5].z);
+ col.rgb += light_diffuse[6].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[6], light_direction[6], light_attenuation[6].x, light_attenuation[6].y, light_attenuation[6].z);
+ col.rgb += light_diffuse[7].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[7], light_direction[7], light_attenuation[7].x, light_attenuation[7].y, light_attenuation[7].z);
+
+ vary_pointlight_col = col.rgb*diffuse_color.rgb;
+
+ col.rgb = vec3(0,0,0);
+
// Add windlight lights
- col.rgb += atmosAmbient(vec3(0.));
-
- vary_light = gl_LightSource[0].position.xyz;
+ col.rgb = atmosAmbient(vec3(0.));
- vary_ambient = col.rgb*gl_Color.rgb;
- vary_directional.rgb = gl_Color.rgb*atmosAffectDirectionalLight(max(calcDirectionalLight(norm, gl_LightSource[0].position.xyz), (1.0-gl_Color.a)*(1.0-gl_Color.a)));
+ vary_ambient = col.rgb*diffuse_color.rgb;
+ vary_directional.rgb = diffuse_color.rgb*atmosAffectDirectionalLight(max(calcDirectionalLight(norm, light_position[0].xyz), (1.0-diffuse_color.a)*(1.0-diffuse_color.a)));
- col.rgb = min(col.rgb*gl_Color.rgb, 1.0);
+ col.rgb = col.rgb*diffuse_color.rgb;
- gl_FrontColor = col;
+ vertex_color = col;
- gl_FogFragCoord = pos.z;
- pos = gl_ModelViewProjectionMatrix * gl_Vertex;
+
+ pos = modelview_projection_matrix * vert;
vary_fragcoord.xyz = pos.xyz + vec3(0,0,near_clip);
}
diff --git a/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaF.glsl b/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaF.glsl
deleted file mode 100644
index 5ecbbd2c4f..0000000000
--- a/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaF.glsl
+++ /dev/null
@@ -1,98 +0,0 @@
-/**
- * @file avatarAlphaF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * $/LicenseInfo$
- */
-
-#extension GL_ARB_texture_rectangle : enable
-
-uniform sampler2D diffuseMap;
-uniform sampler2DRectShadow shadowMap0;
-uniform sampler2DRectShadow shadowMap1;
-uniform sampler2DRectShadow shadowMap2;
-uniform sampler2DRectShadow shadowMap3;
-uniform sampler2D noiseMap;
-
-uniform mat4 shadow_matrix[6];
-uniform vec4 shadow_clip;
-uniform vec2 screen_res;
-uniform vec2 shadow_res;
-
-vec3 atmosLighting(vec3 light);
-vec3 scaleSoftClip(vec3 light);
-
-varying vec3 vary_ambient;
-varying vec3 vary_directional;
-varying vec3 vary_position;
-varying vec3 vary_normal;
-
-uniform float shadow_bias;
-
-float pcfShadow(sampler2DRectShadow shadowMap, vec4 stc, float scl)
-{
- stc.xyz /= stc.w;
- stc.z += shadow_bias;
-
- float cs = shadow2DRect(shadowMap, stc.xyz).x;
- float shadow = cs;
-
- shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(scl, scl, 0.0)).x, cs);
- shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(scl, -scl, 0.0)).x, cs);
- shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(-scl, scl, 0.0)).x, cs);
- shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(-scl, -scl, 0.0)).x, cs);
-
- return shadow/5.0;
-}
-
-void main()
-{
- float shadow = 1.0;
- vec4 pos = vec4(vary_position, 1.0);
- vec3 norm = normalize(vary_normal);
-
- //vec3 nz = texture2D(noiseMap, gl_FragCoord.xy/128.0).xyz;
-
- vec4 spos = pos;
-
- if (spos.z > -shadow_clip.w)
- {
- vec4 lpos;
-
- if (spos.z < -shadow_clip.z)
- {
- lpos = shadow_matrix[3]*spos;
- lpos.xy *= shadow_res;
- shadow = pcfShadow(shadowMap3, lpos, 1.5);
- shadow += max((pos.z+shadow_clip.z)/(shadow_clip.z-shadow_clip.w)*2.0-1.0, 0.0);
- }
- else if (spos.z < -shadow_clip.y)
- {
- lpos = shadow_matrix[2]*spos;
- lpos.xy *= shadow_res;
- shadow = pcfShadow(shadowMap2, lpos, 1.5);
- }
- else if (spos.z < -shadow_clip.x)
- {
- lpos = shadow_matrix[1]*spos;
- lpos.xy *= shadow_res;
- shadow = pcfShadow(shadowMap1, lpos, 1.5);
- }
- else
- {
- lpos = shadow_matrix[0]*spos;
- lpos.xy *= shadow_res;
- shadow = pcfShadow(shadowMap0, lpos, 1.5);
- }
- }
-
-
- vec4 col = vec4(vary_ambient + vary_directional*shadow, gl_Color.a);
- vec4 color = texture2D(diffuseMap, gl_TexCoord[0].xy) * col;
-
- color.rgb = atmosLighting(color.rgb);
-
- color.rgb = scaleSoftClip(color.rgb);
-
- gl_FragColor = color;
-}
diff --git a/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaV.glsl b/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaV.glsl
index d7d1111ba8..44aaa98b97 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaV.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaV.glsl
@@ -2,8 +2,32 @@
* @file avatarAlphaV.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+
+uniform mat4 projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec2 texcoord0;
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
mat4 getSkinnedTransform();
@@ -17,67 +41,113 @@ vec3 atmosAffectDirectionalLight(float lightIntensity);
vec3 scaleDownLight(vec3 light);
vec3 scaleUpLight(vec3 light);
-varying vec3 vary_position;
-varying vec3 vary_ambient;
-varying vec3 vary_directional;
-varying vec3 vary_normal;
+VARYING vec3 vary_position;
+VARYING vec3 vary_ambient;
+VARYING vec3 vary_directional;
+VARYING vec3 vary_fragcoord;
+VARYING vec3 vary_pointlight_col;
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
+uniform vec4 color;
uniform float near_clip;
uniform float shadow_offset;
uniform float shadow_bias;
+uniform vec4 light_position[8];
+uniform vec3 light_direction[8];
+uniform vec3 light_attenuation[8];
+uniform vec3 light_diffuse[8];
+
+float calcDirectionalLight(vec3 n, vec3 l)
+{
+ float a = max(dot(n,l),0.0);
+ return a;
+}
+
+float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight)
+{
+ //get light vector
+ vec3 lv = lp.xyz-v;
+
+ //get distance
+ float d = dot(lv,lv);
+
+ float da = 0.0;
+
+ if (d > 0.0 && la > 0.0 && fa > 0.0)
+ {
+ //normalize light vector
+ lv = normalize(lv);
+
+ //distance attenuation
+ float dist2 = d/la;
+ da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
+
+ // spotlight coefficient.
+ float spot = max(dot(-ln, lv), is_pointlight);
+ da *= spot*spot; // GL_SPOT_EXPONENT=2
+
+ //angular attenuation
+ da *= max(dot(n, lv), 0.0);
+ }
+
+ return da;
+}
+
void main()
{
- gl_TexCoord[0] = gl_MultiTexCoord0;
+ vary_texcoord0 = texcoord0;
vec4 pos;
vec3 norm;
mat4 trans = getSkinnedTransform();
- pos.x = dot(trans[0], gl_Vertex);
- pos.y = dot(trans[1], gl_Vertex);
- pos.z = dot(trans[2], gl_Vertex);
+ vec4 pos_in = vec4(position.xyz, 1.0);
+ pos.x = dot(trans[0], pos_in);
+ pos.y = dot(trans[1], pos_in);
+ pos.z = dot(trans[2], pos_in);
pos.w = 1.0;
- norm.x = dot(trans[0].xyz, gl_Normal);
- norm.y = dot(trans[1].xyz, gl_Normal);
- norm.z = dot(trans[2].xyz, gl_Normal);
+ norm.x = dot(trans[0].xyz, normal);
+ norm.y = dot(trans[1].xyz, normal);
+ norm.z = dot(trans[2].xyz, normal);
norm = normalize(norm);
- gl_Position = gl_ProjectionMatrix * pos;
+ gl_Position = projection_matrix * pos;
- float dp_directional_light = max(0.0, dot(norm, gl_LightSource[0].position.xyz));
- vary_position = pos.xyz + gl_LightSource[0].position.xyz * (1.0-dp_directional_light)*shadow_offset;
- vary_normal = norm;
+ float dp_directional_light = max(0.0, dot(norm, light_position[0].xyz));
+ vary_position = pos.xyz + light_position[0].xyz * (1.0-dp_directional_light)*shadow_offset;
calcAtmospherics(pos.xyz);
- //vec4 color = calcLighting(pos.xyz, norm, gl_Color, vec4(0.));
+ vec4 col = vec4(0.0, 0.0, 0.0, 1.0);
- vec4 col = vec4(0.0, 0.0, 0.0, gl_Color.a);
-
- // Collect normal lights (need to be divided by two, as we later multiply by 2)
- col.rgb += gl_LightSource[2].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[2].position, gl_LightSource[2].spotDirection.xyz, gl_LightSource[2].linearAttenuation, gl_LightSource[2].specular.a);
- col.rgb += gl_LightSource[3].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[3].position, gl_LightSource[3].spotDirection.xyz, gl_LightSource[3].linearAttenuation, gl_LightSource[3].specular.a);
- col.rgb += gl_LightSource[4].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[4].position, gl_LightSource[4].spotDirection.xyz, gl_LightSource[4].linearAttenuation, gl_LightSource[4].specular.a);
- col.rgb += gl_LightSource[5].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[5].position, gl_LightSource[5].spotDirection.xyz, gl_LightSource[5].linearAttenuation, gl_LightSource[5].specular.a);
- col.rgb += gl_LightSource[6].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[6].position, gl_LightSource[6].spotDirection.xyz, gl_LightSource[6].linearAttenuation, gl_LightSource[6].specular.a);
- col.rgb += gl_LightSource[7].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[7].position, gl_LightSource[7].spotDirection.xyz, gl_LightSource[7].linearAttenuation, gl_LightSource[7].specular.a);
- col.rgb += gl_LightSource[1].diffuse.rgb*calcDirectionalLight(norm, gl_LightSource[1].position.xyz);
- col.rgb = scaleDownLight(col.rgb);
+ // Collect normal lights
+ col.rgb += light_diffuse[2].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[2], light_direction[2], light_attenuation[2].x, light_attenuation[2].y, light_attenuation[2].z);
+ col.rgb += light_diffuse[3].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[3], light_direction[3], light_attenuation[3].x, light_attenuation[3].y, light_attenuation[3].z);
+ col.rgb += light_diffuse[4].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[4], light_direction[4], light_attenuation[4].x, light_attenuation[4].y, light_attenuation[4].z);
+ col.rgb += light_diffuse[5].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[5], light_direction[5], light_attenuation[5].x, light_attenuation[5].y, light_attenuation[5].z);
+ col.rgb += light_diffuse[6].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[6], light_direction[6], light_attenuation[6].x, light_attenuation[6].y, light_attenuation[6].z);
+ col.rgb += light_diffuse[7].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[7], light_direction[7], light_attenuation[7].x, light_attenuation[7].y, light_attenuation[7].z);
+ vary_pointlight_col = col.rgb*color.rgb;
+
+ col.rgb = vec3(0,0,0);
+
// Add windlight lights
- col.rgb += atmosAmbient(vec3(0.));
+ col.rgb = atmosAmbient(vec3(0.));
- vary_ambient = col.rgb*gl_Color.rgb;
- vary_directional = gl_Color.rgb*atmosAffectDirectionalLight(max(calcDirectionalLight(norm, gl_LightSource[0].position.xyz), (1.0-gl_Color.a)*(1.0-gl_Color.a)));
+ vary_ambient = col.rgb*color.rgb;
+ vary_directional = atmosAffectDirectionalLight(max(calcDirectionalLight(norm, light_position[0].xyz), 0.0));
- col.rgb = min(col.rgb*gl_Color.rgb, 1.0);
+ col.rgb = col.rgb*color.rgb;
- gl_FrontColor = col;
-
- gl_FogFragCoord = pos.z;
+ vertex_color = col;
+
+ vary_fragcoord.xyz = pos.xyz + vec3(0,0,near_clip);
}
diff --git a/indra/newview/app_settings/shaders/class2/deferred/blurLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/blurLightF.glsl
deleted file mode 100644
index 258a9b7c40..0000000000
--- a/indra/newview/app_settings/shaders/class2/deferred/blurLightF.glsl
+++ /dev/null
@@ -1,81 +0,0 @@
-/**
- * @file blurLightF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * $/LicenseInfo$
- */
-
-#extension GL_ARB_texture_rectangle : enable
-
-uniform sampler2DRect depthMap;
-uniform sampler2DRect normalMap;
-uniform sampler2DRect lightMap;
-
-uniform float dist_factor;
-uniform float blur_size;
-uniform vec2 delta;
-uniform vec3 kern[4];
-uniform float kern_scale;
-
-varying vec2 vary_fragcoord;
-
-uniform mat4 inv_proj;
-uniform vec2 screen_res;
-
-vec4 getPosition(vec2 pos_screen)
-{
- float depth = texture2DRect(depthMap, pos_screen.xy).a;
- vec2 sc = pos_screen.xy*2.0;
- sc /= screen_res;
- sc -= vec2(1.0,1.0);
- vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0);
- vec4 pos = inv_proj * ndc;
- pos /= pos.w;
- pos.w = 1.0;
- return pos;
-}
-
-void main()
-{
- vec3 norm = texture2DRect(normalMap, vary_fragcoord.xy).xyz;
- norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm
- vec3 pos = getPosition(vary_fragcoord.xy).xyz;
- vec4 ccol = texture2DRect(lightMap, vary_fragcoord.xy).rgba;
-
- vec2 dlt = kern_scale * delta / (1.0+norm.xy*norm.xy);
-
- dlt /= max(-pos.z*dist_factor, 1.0);
-
- vec2 defined_weight = kern[0].xy; // special case the first (centre) sample's weight in the blur; we have to sample it anyway so we get it for 'free'
- vec4 col = defined_weight.xyxx * ccol;
-
- for (int i = 1; i < 4; i++)
- {
- vec2 tc = vary_fragcoord.xy + kern[i].z*dlt;
- vec3 samppos = getPosition(tc).xyz;
- float d = dot(norm.xyz, samppos.xyz-pos.xyz);// dist from plane
- if (d*d <= 0.003)
- {
- col += texture2DRect(lightMap, tc)*kern[i].xyxx;
- defined_weight += kern[i].xy;
- }
- }
- for (int i = 1; i < 4; i++)
- {
- vec2 tc = vary_fragcoord.xy - kern[i].z*dlt;
- vec3 samppos = getPosition(tc).xyz;
- float d = dot(norm.xyz, samppos.xyz-pos.xyz);// dist from plane
- if (d*d <= 0.003)
- {
- col += texture2DRect(lightMap, tc)*kern[i].xyxx;
- defined_weight += kern[i].xy;
- }
- }
-
-
-
- col /= defined_weight.xyxx;
-
- gl_FragColor = col;
-}
-
diff --git a/indra/newview/app_settings/shaders/class2/deferred/blurLightV.glsl b/indra/newview/app_settings/shaders/class2/deferred/blurLightV.glsl
deleted file mode 100644
index b1b3f55f00..0000000000
--- a/indra/newview/app_settings/shaders/class2/deferred/blurLightV.glsl
+++ /dev/null
@@ -1,17 +0,0 @@
-/**
- * @file blurLightF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * $/LicenseInfo$
- */
-
-varying vec2 vary_fragcoord;
-uniform vec2 screen_res;
-
-void main()
-{
- //transform vertex
- gl_Position = ftransform();
- vec4 pos = gl_ModelViewProjectionMatrix * gl_Vertex;
- vary_fragcoord = (pos.xy*0.5+0.5)*screen_res;
-}
diff --git a/indra/newview/app_settings/shaders/class2/deferred/edgeF.glsl b/indra/newview/app_settings/shaders/class2/deferred/edgeF.glsl
deleted file mode 100644
index ff32a15c54..0000000000
--- a/indra/newview/app_settings/shaders/class2/deferred/edgeF.glsl
+++ /dev/null
@@ -1,63 +0,0 @@
-/**
- * @file edgeF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * $/LicenseInfo$
- */
-
-#extension GL_ARB_texture_rectangle : enable
-
-uniform sampler2DRect depthMap;
-uniform sampler2DRect normalMap;
-
-uniform float gi_dist_cutoff;
-
-varying vec2 vary_fragcoord;
-
-uniform float depth_cutoff;
-uniform float norm_cutoff;
-
-uniform mat4 inv_proj;
-uniform vec2 screen_res;
-
-float getDepth(vec2 pos_screen)
-{
- float z = texture2DRect(depthMap, pos_screen.xy).a;
- z = z*2.0-1.0;
- vec4 ndc = vec4(0.0, 0.0, z, 1.0);
- vec4 p = inv_proj*ndc;
- return p.z/p.w;
-}
-
-void main()
-{
- vec3 norm = texture2DRect(normalMap, vary_fragcoord.xy).xyz;
- norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm
- float depth = getDepth(vary_fragcoord.xy);
-
- vec2 tc = vary_fragcoord.xy;
-
- float sc = 0.75;
-
- vec2 de;
- de.x = (depth-getDepth(tc+vec2(sc, sc))) + (depth-getDepth(tc+vec2(-sc, -sc)));
- de.y = (depth-getDepth(tc+vec2(-sc, sc))) + (depth-getDepth(tc+vec2(sc, -sc)));
- de /= depth;
- de *= de;
- de = step(depth_cutoff, de);
-
- vec2 ne;
- vec3 nexnorm = texture2DRect(normalMap, tc+vec2(-sc,-sc)).rgb;
- nexnorm = vec3((nexnorm.xy-0.5)*2.0,nexnorm.z); // unpack norm
- ne.x = dot(nexnorm, norm);
- vec3 neynorm = texture2DRect(normalMap, tc+vec2(sc,sc)).rgb;
- neynorm = vec3((neynorm.xy-0.5)*2.0,neynorm.z); // unpack norm
- ne.y = dot(neynorm, norm);
-
- ne = 1.0-ne;
-
- ne = step(norm_cutoff, ne);
-
- gl_FragColor.a = dot(de,de)+dot(ne,ne);
- //gl_FragColor.a = dot(de,de);
-}
diff --git a/indra/newview/app_settings/shaders/class2/deferred/edgeV.glsl b/indra/newview/app_settings/shaders/class2/deferred/edgeV.glsl
deleted file mode 100644
index 74f2bd9818..0000000000
--- a/indra/newview/app_settings/shaders/class2/deferred/edgeV.glsl
+++ /dev/null
@@ -1,17 +0,0 @@
-/**
- * @file edgeV.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * $/LicenseInfo$
- */
-
-varying vec2 vary_fragcoord;
-uniform vec2 screen_res;
-
-void main()
-{
- //transform vertex
- gl_Position = ftransform();
- vec4 pos = gl_ModelViewProjectionMatrix * gl_Vertex;
- vary_fragcoord = (pos.xy*0.5+0.5)*screen_res;
-}
diff --git a/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl
index d6cd984ebe..f7f1f649ce 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl
@@ -2,13 +2,35 @@
* @file multiSpotLightF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
-#version 120
-
+
#extension GL_ARB_texture_rectangle : enable
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
uniform sampler2DRect diffuseRect;
uniform sampler2DRect specularRect;
uniform sampler2DRect depthMap;
@@ -16,7 +38,6 @@ uniform sampler2DRect normalMap;
uniform samplerCube environmentMap;
uniform sampler2DRect lightMap;
uniform sampler2D noiseMap;
-uniform sampler2D lightFunc;
uniform sampler2D projectionMap;
uniform mat4 proj_mat; //screen space to light space
@@ -36,9 +57,12 @@ uniform float sun_wash;
uniform int proj_shadow_idx;
uniform float shadow_fade;
-varying vec4 vary_light;
+uniform vec3 center;
+uniform float size;
+uniform vec3 color;
+uniform float falloff;
-varying vec4 vary_fragcoord;
+VARYING vec4 vary_fragcoord;
uniform vec2 screen_res;
uniform mat4 inv_proj;
@@ -91,7 +115,7 @@ vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod)
vec4 getPosition(vec2 pos_screen)
{
- float depth = texture2DRect(depthMap, pos_screen.xy).a;
+ float depth = texture2DRect(depthMap, pos_screen.xy).r;
vec2 sc = pos_screen.xy*2.0;
sc /= screen_res;
sc -= vec2(1.0,1.0);
@@ -110,9 +134,9 @@ void main()
frag.xy *= screen_res;
vec3 pos = getPosition(frag.xy).xyz;
- vec3 lv = vary_light.xyz-pos.xyz;
+ vec3 lv = center.xyz-pos.xyz;
float dist2 = dot(lv,lv);
- dist2 /= vary_light.w;
+ dist2 /= size;
if (dist2 > 1.0)
{
discard;
@@ -143,7 +167,7 @@ void main()
proj_tc.xyz /= proj_tc.w;
- float fa = gl_Color.a+1.0;
+ float fa = falloff+1.0;
float dist_atten = min(1.0-(dist2-1.0*(1.0-fa))/fa, 1.0);
if (dist_atten <= 0.0)
{
@@ -175,7 +199,7 @@ void main()
vec4 plcol = texture2DLodDiffuse(projectionMap, proj_tc.xy, lod);
- vec3 lcol = gl_Color.rgb * plcol.rgb * plcol.a;
+ vec3 lcol = color.rgb * plcol.rgb * plcol.a;
lit = da * dist_atten * noise;
@@ -192,7 +216,7 @@ void main()
amb_da = min(amb_da, 1.0-lit);
- col += amb_da*gl_Color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a;
+ col += amb_da*color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a;
}
@@ -225,12 +249,12 @@ void main()
stc.y > 0.0)
{
vec4 scol = texture2DLodSpecular(projectionMap, stc.xy, proj_lod-spec.a*proj_lod);
- col += dist_atten*scol.rgb*gl_Color.rgb*scol.a*spec.rgb*shadow;
+ col += dist_atten*scol.rgb*color.rgb*scol.a*spec.rgb*shadow;
}
}
}
}
- gl_FragColor.rgb = col;
- gl_FragColor.a = 0.0;
+ frag_color.rgb = col;
+ frag_color.a = 0.0;
}
diff --git a/indra/newview/app_settings/shaders/class2/deferred/postDeferredF.glsl b/indra/newview/app_settings/shaders/class2/deferred/postDeferredF.glsl
deleted file mode 100644
index 757e3e7aab..0000000000
--- a/indra/newview/app_settings/shaders/class2/deferred/postDeferredF.glsl
+++ /dev/null
@@ -1,59 +0,0 @@
-/**
- * @file postDeferredF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * $/LicenseInfo$
- */
-
-uniform sampler2DRect diffuseRect;
-uniform sampler2DRect localLightMap;
-uniform sampler2DRect sunLightMap;
-uniform sampler2DRect giLightMap;
-uniform sampler2D luminanceMap;
-uniform sampler2DRect lightMap;
-
-uniform vec3 gi_lum_quad;
-uniform vec3 sun_lum_quad;
-uniform vec3 lum_quad;
-uniform float lum_lod;
-uniform vec4 ambient;
-
-uniform vec3 gi_quad;
-
-uniform vec2 screen_res;
-varying vec2 vary_fragcoord;
-
-void main()
-{
- vec2 tc = vary_fragcoord.xy;
- vec3 lcol = texture2DLod(luminanceMap, tc/screen_res, lum_lod).rgb;
-
- float lum = sqrt(lcol.r)*lum_quad.x+lcol.r*lcol.r*lum_quad.y+lcol.r*lum_quad.z;
-
- vec4 diff = texture2DRect(diffuseRect, vary_fragcoord.xy);
-
- float ambocc = texture2DRect(lightMap, vary_fragcoord.xy).g;
-
- vec3 gi_col = texture2DRect(giLightMap, vary_fragcoord.xy).rgb;
- gi_col = gi_col*gi_col*gi_quad.x + gi_col*gi_quad.y+gi_quad.z*ambocc*ambient.rgb;
- gi_col *= diff;
-
- vec4 sun_col = texture2DRect(sunLightMap, vary_fragcoord.xy);
-
- vec3 local_col = texture2DRect(localLightMap, vary_fragcoord.xy).rgb;
-
-
- float sun_lum = 1.0-lum;
- sun_lum = sun_lum*sun_lum*sun_lum_quad.x + sun_lum*sun_lum_quad.y+sun_lum_quad.z;
-
- float gi_lum = lum;
- gi_lum = gi_lum*gi_lum*gi_lum_quad.x+gi_lum*gi_lum_quad.y+gi_lum_quad.z;
- gi_col *= 1.0/gi_lum;
-
- vec3 col = sun_col.rgb*(1.0+max(sun_lum,0.0))+gi_col+local_col;
-
- gl_FragColor.rgb = col.rgb;
- gl_FragColor.a = max(sun_lum*min(sun_col.r+sun_col.g+sun_col.b, 1.0), sun_col.a);
-
- //gl_FragColor.rgb = texture2DRect(giLightMap, vary_fragcoord.xy).rgb;
-}
diff --git a/indra/newview/app_settings/shaders/class2/deferred/postDeferredV.glsl b/indra/newview/app_settings/shaders/class2/deferred/postDeferredV.glsl
deleted file mode 100644
index 0ec81dcb02..0000000000
--- a/indra/newview/app_settings/shaders/class2/deferred/postDeferredV.glsl
+++ /dev/null
@@ -1,17 +0,0 @@
-/**
- * @file postDeferredV.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * $/LicenseInfo$
- */
-
-varying vec2 vary_fragcoord;
-uniform vec2 screen_res;
-
-void main()
-{
- //transform vertex
- gl_Position = ftransform();
- vec4 pos = gl_ModelViewProjectionMatrix * gl_Vertex;
- vary_fragcoord = (pos.xy*0.5+0.5)*screen_res;
-}
diff --git a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl
index 1067be1e6e..a137bea30f 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl
@@ -2,17 +2,40 @@
* @file softenLightF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+
#extension GL_ARB_texture_rectangle : enable
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
uniform sampler2DRect diffuseRect;
uniform sampler2DRect specularRect;
uniform sampler2DRect normalMap;
uniform sampler2DRect lightMap;
uniform sampler2DRect depthMap;
-uniform sampler2D noiseMap;
uniform samplerCube environmentMap;
uniform sampler2D lightFunc;
uniform vec3 gi_quad;
@@ -30,23 +53,24 @@ uniform vec4 sunlight_color;
uniform vec4 ambient;
uniform vec4 blue_horizon;
uniform vec4 blue_density;
-uniform vec4 haze_horizon;
-uniform vec4 haze_density;
-uniform vec4 cloud_shadow;
-uniform vec4 density_multiplier;
-uniform vec4 distance_multiplier;
-uniform vec4 max_y;
+uniform float haze_horizon;
+uniform float haze_density;
+uniform float cloud_shadow;
+uniform float density_multiplier;
+uniform float distance_multiplier;
+uniform float max_y;
uniform vec4 glow;
uniform float scene_light_strength;
-uniform vec3 env_mat[3];
+uniform mat3 env_mat;
uniform vec4 shadow_clip;
uniform mat3 ssao_effect_mat;
uniform mat4 inv_proj;
uniform vec2 screen_res;
-varying vec4 vary_light;
-varying vec2 vary_fragcoord;
+uniform vec3 sun_dir;
+
+VARYING vec2 vary_fragcoord;
vec3 vary_PositionEye;
@@ -69,7 +93,7 @@ vec4 getPosition_d(vec2 pos_screen, float depth)
vec4 getPosition(vec2 pos_screen)
{ //get position in screen space (world units) given window coordinate and depth map
- float depth = texture2DRect(depthMap, pos_screen.xy).a;
+ float depth = texture2DRect(depthMap, pos_screen.xy).r;
return getPosition_d(pos_screen, depth);
}
@@ -125,10 +149,6 @@ void calcAtmospherics(vec3 inPositionEye, float ambFactor) {
vec3 P = inPositionEye;
setPositionEye(P);
- //(TERRAIN) limit altitude
- if (P.y > max_y.x) P *= (max_y.x / P.y);
- if (P.y < -max_y.x) P *= (-max_y.x / P.y);
-
vec3 tmpLightnorm = lightnorm.xyz;
vec3 Pn = normalize(P);
@@ -143,13 +163,13 @@ void calcAtmospherics(vec3 inPositionEye, float ambFactor) {
//sunlight attenuation effect (hue and brightness) due to atmosphere
//this is used later for sunlight modulation at various altitudes
- light_atten = (blue_density * 1.0 + vec4(haze_density.r) * 0.25) * (density_multiplier.x * max_y.x);
+ light_atten = (blue_density + vec4(haze_density * 0.25)) * (density_multiplier * max_y);
//I had thought blue_density and haze_density should have equal weighting,
//but attenuation due to haze_density tends to seem too strong
- temp1 = blue_density + vec4(haze_density.r);
+ temp1 = blue_density + vec4(haze_density);
blue_weight = blue_density / temp1;
- haze_weight = vec4(haze_density.r) / temp1;
+ haze_weight = vec4(haze_density) / temp1;
//(TERRAIN) compute sunlight from lightnorm only (for short rays like terrain)
temp2.y = max(0.0, tmpLightnorm.y);
@@ -157,12 +177,12 @@ void calcAtmospherics(vec3 inPositionEye, float ambFactor) {
sunlight *= exp( - light_atten * temp2.y);
// main atmospheric scattering line integral
- temp2.z = Plen * density_multiplier.x;
+ temp2.z = Plen * density_multiplier;
// Transparency (-> temp1)
- // ATI Bugfix -- can't store temp1*temp2.z*distance_multiplier.x in a variable because the ati
+ // ATI Bugfix -- can't store temp1*temp2.z*distance_multiplier in a variable because the ati
// compiler gets confused.
- temp1 = exp(-temp1 * temp2.z * distance_multiplier.x);
+ temp1 = exp(-temp1 * temp2.z * distance_multiplier);
//final atmosphere attenuation factor
setAtmosAttenuation(temp1.rgb);
@@ -183,7 +203,7 @@ void calcAtmospherics(vec3 inPositionEye, float ambFactor) {
temp2.x += .25;
//increase ambient when there are more clouds
- vec4 tmpAmbient = ambient + (vec4(1.) - ambient) * cloud_shadow.x * 0.5;
+ vec4 tmpAmbient = ambient + (vec4(1.) - ambient) * cloud_shadow * 0.5;
/* decrease value and saturation (that in HSV, not HSL) for occluded areas
* // for HSV color/geometry used here, see http://gimp-savvy.com/BOOK/index.html?node52.html
@@ -197,8 +217,8 @@ void calcAtmospherics(vec3 inPositionEye, float ambFactor) {
//haze color
setAdditiveColor(
- vec3(blue_horizon * blue_weight * (sunlight*(1.-cloud_shadow.x) + tmpAmbient)
- + (haze_horizon.r * haze_weight) * (sunlight*(1.-cloud_shadow.x) * temp2.x
+ vec3(blue_horizon * blue_weight * (sunlight*(1.-cloud_shadow) + tmpAmbient)
+ + (haze_horizon * haze_weight) * (sunlight*(1.-cloud_shadow) * temp2.x
+ tmpAmbient)));
//brightness of surface both sunlight and ambient
@@ -256,89 +276,62 @@ vec3 scaleSoftClip(vec3 light)
void main()
{
vec2 tc = vary_fragcoord.xy;
- float depth = texture2DRect(depthMap, tc.xy).a;
+ float depth = texture2DRect(depthMap, tc.xy).r;
vec3 pos = getPosition_d(tc, depth).xyz;
vec3 norm = texture2DRect(normalMap, tc).xyz;
norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm
- //vec3 nz = texture2D(noiseMap, vary_fragcoord.xy/128.0).xyz;
-
- float da = max(dot(norm.xyz, vary_light.xyz), 0.0);
+
+ float da = max(dot(norm.xyz, sun_dir.xyz), 0.0);
vec4 diffuse = texture2DRect(diffuseRect, tc);
- vec4 spec = texture2DRect(specularRect, vary_fragcoord.xy);
-
- vec2 scol_ambocc = texture2DRect(lightMap, vary_fragcoord.xy).rg;
- float scol = max(scol_ambocc.r, diffuse.a);
- float ambocc = scol_ambocc.g;
+
+ vec3 col;
+ float bloom = 0.0;
+
+ if (diffuse.a < 0.9)
+ {
+ vec4 spec = texture2DRect(specularRect, vary_fragcoord.xy);
+
+ vec2 scol_ambocc = texture2DRect(lightMap, vary_fragcoord.xy).rg;
+ float scol = max(scol_ambocc.r, diffuse.a);
+ float ambocc = scol_ambocc.g;
- calcAtmospherics(pos.xyz, ambocc);
+ calcAtmospherics(pos.xyz, ambocc);
- vec3 col = atmosAmbient(vec3(0));
- col += atmosAffectDirectionalLight(max(min(da, scol), diffuse.a));
+ col = atmosAmbient(vec3(0));
+ col += atmosAffectDirectionalLight(max(min(da, scol), diffuse.a));
- col *= diffuse.rgb;
+ col *= diffuse.rgb;
- if (spec.a > 0.0) // specular reflection
+ if (spec.a > 0.0) // specular reflection
+ {
+ // the old infinite-sky shiny reflection
+ //
+ vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz));
+ float sa = dot(refnormpersp, sun_dir.xyz);
+ vec3 dumbshiny = vary_SunlitColor*scol_ambocc.r*(6 * texture2D(lightFunc, vec2(sa, spec.a)).r);
+
+ // add the two types of shiny together
+ vec3 spec_contrib = dumbshiny * spec.rgb;
+ bloom = dot(spec_contrib, spec_contrib) / 4;
+ col += spec_contrib;
+
+ //add environmentmap
+ vec3 env_vec = env_mat * refnormpersp;
+ col = mix(col.rgb, textureCube(environmentMap, env_vec).rgb,
+ max(spec.a-diffuse.a*2.0, 0.0));
+ }
+
+ col = atmosLighting(col);
+ col = scaleSoftClip(col);
+
+ col = mix(col, diffuse.rgb, diffuse.a);
+ }
+ else
{
- // the old infinite-sky shiny reflection
- //
- vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz));
- float sa = dot(refnormpersp, vary_light.xyz);
- vec3 dumbshiny = vary_SunlitColor*scol_ambocc.r*texture2D(lightFunc, vec2(sa, spec.a)).a;
-
- /*
- // screen-space cheap fakey reflection map
- //
- vec3 refnorm = normalize(reflect(vec3(0,0,-1), norm.xyz));
- depth -= 0.5; // unbias depth
- // first figure out where we'll make our 2D guess from
- vec2 ref2d = (0.25 * screen_res.y) * (refnorm.xy) * abs(refnorm.z) / depth;
- // Offset the guess source a little according to a trivial
- // checkerboard dither function and spec.a.
- // This is meant to be similar to sampling a blurred version
- // of the diffuse map. LOD would be better in that regard.
- // The goal of the blur is to soften reflections in surfaces
- // with low shinyness, and also to disguise our lameness.
- float checkerboard = floor(mod(tc.x+tc.y, 2.0)); // 0.0, 1.0
- float checkoffset = (3.0 + (7.0*(1.0-spec.a)))*(checkerboard-0.5);
- ref2d += vec2(checkoffset, checkoffset);
- ref2d += tc.xy; // use as offset from destination
- // Get attributes from the 2D guess point.
- // We average two samples of diffuse (not of anything else) per
- // pixel to try to reduce aliasing some more.
- vec3 refcol = 0.5 * (texture2DRect(diffuseRect, ref2d + vec2(0.0, -checkoffset)).rgb +
- texture2DRect(diffuseRect, ref2d + vec2(-checkoffset, 0.0)).rgb);
- float refdepth = texture2DRect(depthMap, ref2d).a;
- vec3 refpos = getPosition_d(ref2d, refdepth).xyz;
- float refshad = texture2DRect(lightMap, ref2d).r;
- vec3 refn = texture2DRect(normalMap, ref2d).rgb;
- refn = vec3((refn.xy-0.5)*2.0,refn.z); // unpack norm
- refn = normalize(refn);
- // figure out how appropriate our guess actually was
- float refapprop = max(0.0, dot(-refnorm, normalize(pos - refpos)));
- // darken reflections from points which face away from the reflected ray - our guess was a back-face
- //refapprop *= step(dot(refnorm, refn), 0.0);
- refapprop = min(refapprop, max(0.0, -dot(refnorm, refn))); // more conservative variant
- // get appropriate light strength for guess-point
- // reflect light direction to increase the illusion that
- // these are reflections.
- vec3 reflight = reflect(lightnorm.xyz, norm.xyz);
- float reflit = min(max(dot(refn, reflight.xyz), 0.0), refshad);
- // apply sun color to guess-point, dampen according to inappropriateness of guess
- float refmod = min(refapprop, reflit);
- vec3 refprod = vary_SunlitColor * refcol.rgb * refmod;
- vec3 ssshiny = (refprod * spec.a);
- ssshiny *= 0.3; // dampen it even more
- */
- vec3 ssshiny = vec3(0,0,0);
-
- // add the two types of shiny together
- col += (ssshiny + dumbshiny) * spec.rgb;
+ col = diffuse.rgb;
}
-
- col = atmosLighting(col);
- col = scaleSoftClip(col);
- gl_FragColor.rgb = col;
- gl_FragColor.a = 0.0;
+ frag_color.rgb = col;
+ frag_color.a = bloom;
}
diff --git a/indra/newview/app_settings/shaders/class2/deferred/softenLightV.glsl b/indra/newview/app_settings/shaders/class2/deferred/softenLightV.glsl
index 9d187b46e2..c840d72784 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/softenLightV.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/softenLightV.glsl
@@ -2,23 +2,41 @@
* @file softenLightF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+
uniform vec2 screen_res;
-varying vec4 vary_light;
-varying vec2 vary_fragcoord;
+VARYING vec2 vary_fragcoord;
+
void main()
{
//transform vertex
- gl_Position = ftransform();
+ vec4 pos = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ gl_Position = pos;
- vec4 pos = gl_ModelViewProjectionMatrix * gl_Vertex;
- vary_fragcoord = (pos.xy*0.5+0.5)*screen_res;
-
- vec4 tex = gl_MultiTexCoord0;
- tex.w = 1.0;
- vary_light = gl_MultiTexCoord0;
+ vary_fragcoord = (pos.xy*0.5+0.5)*screen_res;
}
diff --git a/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl
index d0e242c2d4..99a277fbfc 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl
@@ -2,12 +2,36 @@
* @file spotLightF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+
+#extension GL_ARB_texture_rectangle : enable
-#version 120
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
-#extension GL_ARB_texture_rectangle : enable
+VARYING vec4 vertex_color;
uniform sampler2DRect diffuseRect;
uniform sampler2DRect specularRect;
@@ -16,7 +40,6 @@ uniform sampler2DRect normalMap;
uniform samplerCube environmentMap;
uniform sampler2DRect lightMap;
uniform sampler2D noiseMap;
-uniform sampler2D lightFunc;
uniform sampler2D projectionMap;
uniform mat4 proj_mat; //screen space to light space
@@ -35,9 +58,9 @@ uniform float sun_wash;
uniform int proj_shadow_idx;
uniform float shadow_fade;
-varying vec4 vary_light;
+VARYING vec4 vary_light;
-varying vec4 vary_fragcoord;
+VARYING vec4 vary_fragcoord;
uniform vec2 screen_res;
uniform mat4 inv_proj;
@@ -96,7 +119,7 @@ void main()
proj_tc.xyz /= proj_tc.w;
- float fa = gl_Color.a+1.0;
+ float fa = vertex_color.a+1.0;
float dist_atten = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
lv = proj_origin-pos.xyz;
@@ -122,7 +145,7 @@ void main()
vec4 plcol = texture2DLod(projectionMap, proj_tc.xy, lod);
- vec3 lcol = gl_Color.rgb * plcol.rgb * plcol.a;
+ vec3 lcol = vertex_color.rgb * plcol.rgb * plcol.a;
lit = da * dist_atten * noise;
@@ -145,7 +168,7 @@ void main()
amb_da = min(amb_da, 1.0-lit);
- col += amb_da*gl_Color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a;
+ col += amb_da*vertex_color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a;
}
@@ -174,12 +197,12 @@ void main()
stc.y > 0.0)
{
vec4 scol = texture2DLod(projectionMap, stc.xy, proj_lod-spec.a*proj_lod);
- col += dist_atten*scol.rgb*gl_Color.rgb*scol.a*spec.rgb*shadow;
+ col += dist_atten*scol.rgb*vertex_color.rgb*scol.a*spec.rgb*shadow;
}
}
}
}
- gl_FragColor.rgb = col;
- gl_FragColor.a = 0.0;
+ frag_color.rgb = col;
+ frag_color.a = 0.0;
}
diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl
index f565d3bdb9..8c4ccf9cb3 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl
@@ -2,11 +2,35 @@
* @file sunLightF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#extension GL_ARB_texture_rectangle : enable
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
//class 2, shadows, no SSAO
uniform sampler2DRect depthMap;
@@ -17,9 +41,6 @@ uniform sampler2DRectShadow shadowMap2;
uniform sampler2DRectShadow shadowMap3;
uniform sampler2DShadow shadowMap4;
uniform sampler2DShadow shadowMap5;
-uniform sampler2D noiseMap;
-
-uniform sampler2D lightFunc;
// Inputs
@@ -30,13 +51,13 @@ uniform float ssao_max_radius;
uniform float ssao_factor;
uniform float ssao_factor_inv;
-varying vec2 vary_fragcoord;
-varying vec4 vary_light;
+VARYING vec2 vary_fragcoord;
uniform mat4 inv_proj;
uniform vec2 screen_res;
uniform vec2 shadow_res;
uniform vec2 proj_shadow_res;
+uniform vec3 sun_dir;
uniform float shadow_bias;
uniform float shadow_offset;
@@ -46,7 +67,7 @@ uniform float spot_shadow_offset;
vec4 getPosition(vec2 pos_screen)
{
- float depth = texture2DRect(depthMap, pos_screen.xy).a;
+ float depth = texture2DRect(depthMap, pos_screen.xy).r;
vec2 sc = pos_screen.xy*2.0;
sc /= screen_res;
sc -= vec2(1.0,1.0);
@@ -110,15 +131,15 @@ void main()
/*if (pos.z == 0.0) // do nothing for sky *FIX: REMOVE THIS IF/WHEN THE POSITION MAP IS BEING USED AS A STENCIL
{
- gl_FragColor = vec4(0.0); // doesn't matter
+ frag_color = vec4(0.0); // doesn't matter
return;
}*/
- float shadow = 1.0;
- float dp_directional_light = max(0.0, dot(norm, vary_light.xyz));
+ float shadow = 0.0;
+ float dp_directional_light = max(0.0, dot(norm, sun_dir.xyz));
vec3 shadow_pos = pos.xyz + displace*norm;
- vec3 offset = vary_light.xyz * (1.0-dp_directional_light);
+ vec3 offset = sun_dir.xyz * (1.0-dp_directional_light);
vec4 spos = vec4(shadow_pos+offset*shadow_offset, 1.0);
@@ -133,32 +154,62 @@ void main()
{
vec4 lpos;
- if (spos.z < -shadow_clip.z)
+ vec4 near_split = shadow_clip*-0.75;
+ vec4 far_split = shadow_clip*-1.25;
+ vec4 transition_domain = near_split-far_split;
+ float weight = 0.0;
+
+ if (spos.z < near_split.z)
{
lpos = shadow_matrix[3]*spos;
lpos.xy *= shadow_res;
- shadow = pcfShadow(shadowMap3, lpos, 0.25);
+
+ float w = 1.0;
+ w -= max(spos.z-far_split.z, 0.0)/transition_domain.z;
+ shadow += pcfShadow(shadowMap3, lpos, 0.25)*w;
+ weight += w;
shadow += max((pos.z+shadow_clip.z)/(shadow_clip.z-shadow_clip.w)*2.0-1.0, 0.0);
}
- else if (spos.z < -shadow_clip.y)
+
+ if (spos.z < near_split.y && spos.z > far_split.z)
{
lpos = shadow_matrix[2]*spos;
lpos.xy *= shadow_res;
- shadow = pcfShadow(shadowMap2, lpos, 0.5);
+
+ float w = 1.0;
+ w -= max(spos.z-far_split.y, 0.0)/transition_domain.y;
+ w -= max(near_split.z-spos.z, 0.0)/transition_domain.z;
+ shadow += pcfShadow(shadowMap2, lpos, 0.75)*w;
+ weight += w;
}
- else if (spos.z < -shadow_clip.x)
+
+ if (spos.z < near_split.x && spos.z > far_split.y)
{
lpos = shadow_matrix[1]*spos;
lpos.xy *= shadow_res;
- shadow = pcfShadow(shadowMap1, lpos, 0.75);
+
+ float w = 1.0;
+ w -= max(spos.z-far_split.x, 0.0)/transition_domain.x;
+ w -= max(near_split.y-spos.z, 0.0)/transition_domain.y;
+ shadow += pcfShadow(shadowMap1, lpos, 0.75)*w;
+ weight += w;
}
- else
+
+ if (spos.z > far_split.x)
{
lpos = shadow_matrix[0]*spos;
lpos.xy *= shadow_res;
- shadow = pcfShadow(shadowMap0, lpos, 1.0);
+
+ float w = 1.0;
+ w -= max(near_split.x-spos.z, 0.0)/transition_domain.x;
+
+ shadow += pcfShadow(shadowMap0, lpos, 1.0)*w;
+ weight += w;
}
+
+ shadow /= weight;
+
// take the most-shadowed value out of these two:
// * the blurred sun shadow in the light (shadow) map
// * an unblurred dot product between the sun and this norm
@@ -179,19 +230,19 @@ void main()
shadow = 1.0;
}
- gl_FragColor[0] = shadow;
- gl_FragColor[1] = 1.0;
+ frag_color[0] = shadow;
+ frag_color[1] = 1.0;
spos = vec4(shadow_pos+norm*spot_shadow_offset, 1.0);
//spotlight shadow 1
vec4 lpos = shadow_matrix[4]*spos;
- gl_FragColor[2] = pcfShadow(shadowMap4, lpos, 0.8);
+ frag_color[2] = pcfShadow(shadowMap4, lpos, 0.8);
//spotlight shadow 2
lpos = shadow_matrix[5]*spos;
- gl_FragColor[3] = pcfShadow(shadowMap5, lpos, 0.8);
+ frag_color[3] = pcfShadow(shadowMap5, lpos, 0.8);
- //gl_FragColor.rgb = pos.xyz;
- //gl_FragColor.b = shadow;
+ //frag_color.rgb = pos.xyz;
+ //frag_color.b = shadow;
}
diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl
index 4e33a1af45..02075a7687 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl
@@ -1,12 +1,35 @@
/**
* @file sunLightSSAOF.glsl
- *
- * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc.
- * $License$
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
*/
-
+
#extension GL_ARB_texture_rectangle : enable
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
+
//class 2 -- shadows and SSAO
uniform sampler2DRect depthMap;
@@ -19,7 +42,6 @@ uniform sampler2DShadow shadowMap4;
uniform sampler2DShadow shadowMap5;
uniform sampler2D noiseMap;
-uniform sampler2D lightFunc;
// Inputs
uniform mat4 shadow_matrix[6];
@@ -29,13 +51,13 @@ uniform float ssao_max_radius;
uniform float ssao_factor;
uniform float ssao_factor_inv;
-varying vec2 vary_fragcoord;
-varying vec4 vary_light;
+VARYING vec2 vary_fragcoord;
uniform mat4 inv_proj;
uniform vec2 screen_res;
uniform vec2 shadow_res;
uniform vec2 proj_shadow_res;
+uniform vec3 sun_dir;
uniform float shadow_bias;
uniform float shadow_offset;
@@ -45,7 +67,7 @@ uniform float spot_shadow_offset;
vec4 getPosition(vec2 pos_screen)
{
- float depth = texture2DRect(depthMap, pos_screen.xy).a;
+ float depth = texture2DRect(depthMap, pos_screen.xy).r;
vec2 sc = pos_screen.xy*2.0;
sc /= screen_res;
sc -= vec2(1.0,1.0);
@@ -56,63 +78,64 @@ vec4 getPosition(vec2 pos_screen)
return pos;
}
+vec2 getKern(int i)
+{
+ vec2 kern[8];
+ // exponentially (^2) distant occlusion samples spread around origin
+ kern[0] = vec2(-1.0, 0.0) * 0.125*0.125;
+ kern[1] = vec2(1.0, 0.0) * 0.250*0.250;
+ kern[2] = vec2(0.0, 1.0) * 0.375*0.375;
+ kern[3] = vec2(0.0, -1.0) * 0.500*0.500;
+ kern[4] = vec2(0.7071, 0.7071) * 0.625*0.625;
+ kern[5] = vec2(-0.7071, -0.7071) * 0.750*0.750;
+ kern[6] = vec2(-0.7071, 0.7071) * 0.875*0.875;
+ kern[7] = vec2(0.7071, -0.7071) * 1.000*1.000;
+
+ return kern[i];
+}
+
//calculate decreases in ambient lighting when crowded out (SSAO)
float calcAmbientOcclusion(vec4 pos, vec3 norm)
{
float ret = 1.0;
-
- float dist = dot(pos.xyz,pos.xyz);
-
- if (dist < 64.0*64.0)
- {
- vec2 kern[8];
- // exponentially (^2) distant occlusion samples spread around origin
- kern[0] = vec2(-1.0, 0.0) * 0.125*0.125;
- kern[1] = vec2(1.0, 0.0) * 0.250*0.250;
- kern[2] = vec2(0.0, 1.0) * 0.375*0.375;
- kern[3] = vec2(0.0, -1.0) * 0.500*0.500;
- kern[4] = vec2(0.7071, 0.7071) * 0.625*0.625;
- kern[5] = vec2(-0.7071, -0.7071) * 0.750*0.750;
- kern[6] = vec2(-0.7071, 0.7071) * 0.875*0.875;
- kern[7] = vec2(0.7071, -0.7071) * 1.000*1.000;
- vec2 pos_screen = vary_fragcoord.xy;
- vec3 pos_world = pos.xyz;
- vec2 noise_reflect = texture2D(noiseMap, vary_fragcoord.xy/128.0).xy;
+ vec2 pos_screen = vary_fragcoord.xy;
+ vec3 pos_world = pos.xyz;
+ vec2 noise_reflect = texture2D(noiseMap, vary_fragcoord.xy/128.0).xy;
- float angle_hidden = 0.0;
- int points = 0;
+ float angle_hidden = 0.0;
+ float points = 0;
- float scale = min(ssao_radius / -pos_world.z, ssao_max_radius);
+ float scale = min(ssao_radius / -pos_world.z, ssao_max_radius);
+
+ // it was found that keeping # of samples a constant was the fastest, probably due to compiler optimizations (unrolling?)
+ for (int i = 0; i < 8; i++)
+ {
+ vec2 samppos_screen = pos_screen + scale * reflect(getKern(i), noise_reflect);
+ vec3 samppos_world = getPosition(samppos_screen).xyz;
- // it was found that keeping # of samples a constant was the fastest, probably due to compiler optimizations (unrolling?)
- for (int i = 0; i < 8; i++)
- {
- vec2 samppos_screen = pos_screen + scale * reflect(kern[i], noise_reflect);
- vec3 samppos_world = getPosition(samppos_screen).xyz;
+ vec3 diff = pos_world - samppos_world;
+ float dist2 = dot(diff, diff);
- vec3 diff = pos_world - samppos_world;
- float dist2 = dot(diff, diff);
-
- // assume each sample corresponds to an occluding sphere with constant radius, constant x-sectional area
- // --> solid angle shrinking by the square of distance
- //radius is somewhat arbitrary, can approx with just some constant k * 1 / dist^2
- //(k should vary inversely with # of samples, but this is taken care of later)
-
- //if (dot((samppos_world - 0.05*norm - pos_world), norm) > 0.0) // -0.05*norm to shift sample point back slightly for flat surfaces
- // angle_hidden += min(1.0/dist2, ssao_factor_inv); // dist != 0 follows from conditional. max of 1.0 (= ssao_factor_inv * ssao_factor)
- angle_hidden = angle_hidden + float(dot((samppos_world - 0.05*norm - pos_world), norm) > 0.0) * min(1.0/dist2, ssao_factor_inv);
-
- // 'blocked' samples (significantly closer to camera relative to pos_world) are "no data", not "no occlusion"
- points = points + int(diff.z > -1.0);
- }
+ // assume each sample corresponds to an occluding sphere with constant radius, constant x-sectional area
+ // --> solid angle shrinking by the square of distance
+ //radius is somewhat arbitrary, can approx with just some constant k * 1 / dist^2
+ //(k should vary inversely with # of samples, but this is taken care of later)
- angle_hidden = min(ssao_factor*angle_hidden/float(points), 1.0);
-
- ret = (1.0 - (float(points != 0) * angle_hidden));
- ret += max((dist-32.0*32.0)/(32.0*32.0), 0.0);
+ float funky_val = (dot((samppos_world - 0.05*norm - pos_world), norm) > 0.0) ? 1.0 : 0.0;
+ angle_hidden = angle_hidden + funky_val * min(1.0/dist2, ssao_factor_inv);
+
+ // 'blocked' samples (significantly closer to camera relative to pos_world) are "no data", not "no occlusion"
+ float diffz_val = (diff.z > -1.0) ? 1.0 : 0.0;
+ points = points + diffz_val;
}
+
+ angle_hidden = min(ssao_factor*angle_hidden/points, 1.0);
+ float points_val = (points > 0.0) ? 1.0 : 0.0;
+ ret = (1.0 - (points_val * angle_hidden));
+
+ ret = max(ret, 0.0);
return min(ret, 1.0);
}
@@ -149,7 +172,6 @@ float pcfShadow(sampler2DShadow shadowMap, vec4 stc, float scl)
shadow += max(shadow2D(shadowMap, stc.xyz+vec3(-off.x, off.y, 0.0)).x, cs);
shadow += max(shadow2D(shadowMap, stc.xyz+vec3(-off.x, -off.y, 0.0)).x, cs);
-
return shadow/5.0;
//return shadow;
@@ -170,15 +192,15 @@ void main()
/*if (pos.z == 0.0) // do nothing for sky *FIX: REMOVE THIS IF/WHEN THE POSITION MAP IS BEING USED AS A STENCIL
{
- gl_FragColor = vec4(0.0); // doesn't matter
+ frag_color = vec4(0.0); // doesn't matter
return;
}*/
- float shadow = 1.0;
- float dp_directional_light = max(0.0, dot(norm, vary_light.xyz));
+ float shadow = 0.0;
+ float dp_directional_light = max(0.0, dot(norm, sun_dir.xyz));
vec3 shadow_pos = pos.xyz + displace*norm;
- vec3 offset = vary_light.xyz * (1.0-dp_directional_light);
+ vec3 offset = sun_dir.xyz * (1.0-dp_directional_light);
vec4 spos = vec4(shadow_pos+offset*shadow_offset, 1.0);
@@ -192,33 +214,63 @@ void main()
else
{
vec4 lpos;
-
- if (spos.z < -shadow_clip.z)
+
+ vec4 near_split = shadow_clip*-0.75;
+ vec4 far_split = shadow_clip*-1.25;
+ vec4 transition_domain = near_split-far_split;
+ float weight = 0.0;
+
+ if (spos.z < near_split.z)
{
lpos = shadow_matrix[3]*spos;
lpos.xy *= shadow_res;
- shadow = pcfShadow(shadowMap3, lpos, 0.25);
+
+ float w = 1.0;
+ w -= max(spos.z-far_split.z, 0.0)/transition_domain.z;
+ shadow += pcfShadow(shadowMap3, lpos, 0.25)*w;
+ weight += w;
shadow += max((pos.z+shadow_clip.z)/(shadow_clip.z-shadow_clip.w)*2.0-1.0, 0.0);
}
- else if (spos.z < -shadow_clip.y)
+
+ if (spos.z < near_split.y && spos.z > far_split.z)
{
lpos = shadow_matrix[2]*spos;
lpos.xy *= shadow_res;
- shadow = pcfShadow(shadowMap2, lpos, 0.5);
+
+ float w = 1.0;
+ w -= max(spos.z-far_split.y, 0.0)/transition_domain.y;
+ w -= max(near_split.z-spos.z, 0.0)/transition_domain.z;
+ shadow += pcfShadow(shadowMap2, lpos, 0.75)*w;
+ weight += w;
}
- else if (spos.z < -shadow_clip.x)
+
+ if (spos.z < near_split.x && spos.z > far_split.y)
{
lpos = shadow_matrix[1]*spos;
lpos.xy *= shadow_res;
- shadow = pcfShadow(shadowMap1, lpos, 0.75);
+
+ float w = 1.0;
+ w -= max(spos.z-far_split.x, 0.0)/transition_domain.x;
+ w -= max(near_split.y-spos.z, 0.0)/transition_domain.y;
+ shadow += pcfShadow(shadowMap1, lpos, 0.75)*w;
+ weight += w;
}
- else
+
+ if (spos.z > far_split.x)
{
lpos = shadow_matrix[0]*spos;
lpos.xy *= shadow_res;
- shadow = pcfShadow(shadowMap0, lpos, 1.0);
+
+ float w = 1.0;
+ w -= max(near_split.x-spos.z, 0.0)/transition_domain.x;
+
+ shadow += pcfShadow(shadowMap0, lpos, 1.0)*w;
+ weight += w;
}
+
+ shadow /= weight;
+
// take the most-shadowed value out of these two:
// * the blurred sun shadow in the light (shadow) map
// * an unblurred dot product between the sun and this norm
@@ -239,19 +291,19 @@ void main()
shadow = 1.0;
}
- gl_FragColor[0] = shadow;
- gl_FragColor[1] = calcAmbientOcclusion(pos, norm);
+ frag_color[0] = shadow;
+ frag_color[1] = calcAmbientOcclusion(pos, norm);
- spos.xyz = shadow_pos+offset*spot_shadow_offset;
+ spos = vec4(shadow_pos+norm*spot_shadow_offset, 1.0);
//spotlight shadow 1
vec4 lpos = shadow_matrix[4]*spos;
- gl_FragColor[2] = pcfShadow(shadowMap4, lpos, 0.8);
+ frag_color[2] = pcfShadow(shadowMap4, lpos, 0.8);
//spotlight shadow 2
lpos = shadow_matrix[5]*spos;
- gl_FragColor[3] = pcfShadow(shadowMap5, lpos, 0.8);
+ frag_color[3] = pcfShadow(shadowMap5, lpos, 0.8);
- //gl_FragColor.rgb = pos.xyz;
- //gl_FragColor.b = shadow;
+ //frag_color.rgb = pos.xyz;
+ //frag_color.b = shadow;
}
diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightV.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightV.glsl
index 9d092d9cea..bc5eb5181d 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/sunLightV.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightV.glsl
@@ -1,25 +1,41 @@
/**
- * @file sunLightF.glsl
+ * @file sunLightV.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-varying vec4 vary_light;
-varying vec2 vary_fragcoord;
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+
+VARYING vec2 vary_fragcoord;
uniform vec2 screen_res;
void main()
{
//transform vertex
- gl_Position = ftransform();
- vec4 pos = gl_ModelViewProjectionMatrix * gl_Vertex;
- vary_fragcoord = (pos.xy * 0.5 + 0.5)*screen_res;
- vec4 tex = gl_MultiTexCoord0;
- tex.w = 1.0;
+ vec4 pos = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ gl_Position = pos;
- vary_light = gl_MultiTexCoord0;
-
- gl_FrontColor = gl_Color;
+ vary_fragcoord = (pos.xy * 0.5 + 0.5)*screen_res;
}
diff --git a/indra/newview/app_settings/shaders/class2/effects/blurF.glsl b/indra/newview/app_settings/shaders/class2/effects/blurF.glsl
deleted file mode 100644
index 4173709298..0000000000
--- a/indra/newview/app_settings/shaders/class2/effects/blurF.glsl
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * @file blurf.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * $/LicenseInfo$
- */
-
-uniform sampler2DRect RenderTexture;
-uniform float bloomStrength;
-
-varying vec4 gl_TexCoord[gl_MaxTextureCoords];
-void main(void)
-{
- float blurWeights[7];
- blurWeights[0] = 0.05;
- blurWeights[1] = 0.1;
- blurWeights[2] = 0.2;
- blurWeights[3] = 0.3;
- blurWeights[4] = 0.2;
- blurWeights[5] = 0.1;
- blurWeights[6] = 0.05;
-
- vec3 color = vec3(0,0,0);
- for (int i = 0; i < 7; i++){
- color += vec3(texture2DRect(RenderTexture, gl_TexCoord[i].st)) * blurWeights[i];
- }
-
- color *= bloomStrength;
-
- gl_FragColor = vec4(color, 1.0);
-}
diff --git a/indra/newview/app_settings/shaders/class2/effects/blurV.glsl b/indra/newview/app_settings/shaders/class2/effects/blurV.glsl
deleted file mode 100644
index f66609527d..0000000000
--- a/indra/newview/app_settings/shaders/class2/effects/blurV.glsl
+++ /dev/null
@@ -1,35 +0,0 @@
-/**
- * @file blurV.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * $/LicenseInfo$
- */
-
-uniform vec2 texelSize;
-uniform vec2 blurDirection;
-uniform float blurWidth;
-
-void main(void)
-{
- // Transform vertex
- gl_Position = ftransform();
-
- vec2 blurDelta = texelSize * blurDirection * vec2(blurWidth, blurWidth);
- vec2 s = gl_MultiTexCoord0.st - (blurDelta * 3.0);
-
- // for (int i = 0; i < 7; i++) {
- // gl_TexCoord[i].st = s + (i * blurDelta);
- // }
-
- // MANUALLY UNROLL
- gl_TexCoord[0].st = s;
- gl_TexCoord[1].st = s + blurDelta;
- gl_TexCoord[2].st = s + (2. * blurDelta);
- gl_TexCoord[3].st = s + (3. * blurDelta);
- gl_TexCoord[4].st = s + (4. * blurDelta);
- gl_TexCoord[5].st = s + (5. * blurDelta);
- gl_TexCoord[6].st = s + (6. * blurDelta);
-
- // gl_TexCoord[0].st = s;
- // gl_TexCoord[1].st = blurDelta;
-}
diff --git a/indra/newview/app_settings/shaders/class2/effects/colorFilterF.glsl b/indra/newview/app_settings/shaders/class2/effects/colorFilterF.glsl
deleted file mode 100644
index df41dae757..0000000000
--- a/indra/newview/app_settings/shaders/class2/effects/colorFilterF.glsl
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * @file colorFilterF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * $/LicenseInfo$
- */
-
-uniform sampler2DRect RenderTexture;
-uniform float brightness;
-uniform float contrast;
-uniform vec3 contrastBase;
-uniform float saturation;
-uniform vec3 lumWeights;
-
-const float gamma = 2.0;
-
-void main(void)
-{
- vec3 color = vec3(texture2DRect(RenderTexture, gl_TexCoord[0].st));
-
- /// Modulate brightness
- color *= brightness;
-
- /// Modulate contrast
- color = mix(contrastBase, color, contrast);
-
- /// Modulate saturation
- color = mix(vec3(dot(color, lumWeights)), color, saturation);
-
- gl_FragColor = vec4(color, 1.0);
-}
diff --git a/indra/newview/app_settings/shaders/class2/effects/drawQuadV.glsl b/indra/newview/app_settings/shaders/class2/effects/drawQuadV.glsl
deleted file mode 100644
index e836caf93f..0000000000
--- a/indra/newview/app_settings/shaders/class2/effects/drawQuadV.glsl
+++ /dev/null
@@ -1,14 +0,0 @@
-/**
- * @file drawQuadV.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * $/LicenseInfo$
- */
-
-void main(void)
-{
- //transform vertex
- gl_Position = ftransform();
- gl_TexCoord[0] = gl_MultiTexCoord0;
- gl_TexCoord[1] = gl_MultiTexCoord1;
-}
diff --git a/indra/newview/app_settings/shaders/class2/effects/extractF.glsl b/indra/newview/app_settings/shaders/class2/effects/extractF.glsl
deleted file mode 100644
index 06d5fc9797..0000000000
--- a/indra/newview/app_settings/shaders/class2/effects/extractF.glsl
+++ /dev/null
@@ -1,22 +0,0 @@
-/**
- * @file extractF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * $/LicenseInfo$
- */
-
-uniform sampler2DRect RenderTexture;
-uniform float extractLow;
-uniform float extractHigh;
-uniform vec3 lumWeights;
-
-void main(void)
-{
- /// Get scene color
- vec3 color = vec3(texture2DRect(RenderTexture, gl_TexCoord[0].st));
-
- /// Extract luminance and scale up by night vision brightness
- float lum = smoothstep(extractLow, extractHigh, dot(color, lumWeights));
-
- gl_FragColor = vec4(vec3(lum), 1.0);
-}
diff --git a/indra/newview/app_settings/shaders/class2/effects/nightVisionF.glsl b/indra/newview/app_settings/shaders/class2/effects/nightVisionF.glsl
deleted file mode 100644
index 0a2767ad02..0000000000
--- a/indra/newview/app_settings/shaders/class2/effects/nightVisionF.glsl
+++ /dev/null
@@ -1,42 +0,0 @@
-/**
- * @file nightVisionF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * $/LicenseInfo$
- */
-
-uniform sampler2DRect RenderTexture;
-uniform sampler2D NoiseTexture;
-uniform float brightMult;
-uniform float noiseStrength;
-
-float luminance(vec3 color)
-{
- /// CALCULATING LUMINANCE (Using NTSC lum weights)
- /// http://en.wikipedia.org/wiki/Luma_%28video%29
- return dot(color, vec3(0.299, 0.587, 0.114));
-}
-
-void main(void)
-{
- /// Get scene color
- vec3 color = vec3(texture2DRect(RenderTexture, gl_TexCoord[0].st));
-
- /// Extract luminance and scale up by night vision brightness
- float lum = luminance(color) * brightMult;
-
- /// Convert into night vision color space
- /// Newer NVG colors (crisper and more saturated)
- vec3 outColor = (lum * vec3(0.91, 1.21, 0.9)) + vec3(-0.07, 0.1, -0.12);
-
- /// Add noise
- float noiseValue = texture2D(NoiseTexture, gl_TexCoord[1].st).r;
- noiseValue = (noiseValue - 0.5) * noiseStrength;
-
- /// Older NVG colors (more muted)
- // vec3 outColor = (lum * vec3(0.82, 0.75, 0.83)) + vec3(0.05, 0.32, -0.11);
-
- outColor += noiseValue;
-
- gl_FragColor = vec4(outColor, 1.0);
-}
diff --git a/indra/newview/app_settings/shaders/class2/effects/simpleF.glsl b/indra/newview/app_settings/shaders/class2/effects/simpleF.glsl
deleted file mode 100644
index 29ad9a995b..0000000000
--- a/indra/newview/app_settings/shaders/class2/effects/simpleF.glsl
+++ /dev/null
@@ -1,14 +0,0 @@
-/**
- * @file simpleF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * $/LicenseInfo$
- */
-
-uniform sampler2DRect RenderTexture;
-
-void main(void)
-{
- vec3 color = vec3(texture2DRect(RenderTexture, gl_TexCoord[0].st));
- gl_FragColor = vec4(1.0 - color, 1.0);
-}
diff --git a/indra/newview/app_settings/shaders/class2/environment/terrainF.glsl b/indra/newview/app_settings/shaders/class2/environment/terrainF.glsl
deleted file mode 100644
index 32259acf1b..0000000000
--- a/indra/newview/app_settings/shaders/class2/environment/terrainF.glsl
+++ /dev/null
@@ -1,38 +0,0 @@
-/**
- * @file terrainF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * $/LicenseInfo$
- */
-
-uniform sampler2D detail_0;
-uniform sampler2D detail_1;
-uniform sampler2D detail_2;
-uniform sampler2D detail_3;
-uniform sampler2D alpha_ramp;
-
-vec3 atmosLighting(vec3 light);
-
-vec3 scaleSoftClip(vec3 color);
-
-void main()
-{
- /// Note: This should duplicate the blending functionality currently used for the terrain rendering.
-
- /// TODO Confirm tex coords and bind them appropriately in vert shader.
- vec4 color0 = texture2D(detail_0, gl_TexCoord[0].xy);
- vec4 color1 = texture2D(detail_1, gl_TexCoord[0].xy);
- vec4 color2 = texture2D(detail_2, gl_TexCoord[0].xy);
- vec4 color3 = texture2D(detail_3, gl_TexCoord[0].xy);
-
- float alpha1 = texture2D(alpha_ramp, gl_TexCoord[0].zw).a;
- float alpha2 = texture2D(alpha_ramp,gl_TexCoord[1].xy).a;
- float alphaFinal = texture2D(alpha_ramp, gl_TexCoord[1].zw).a;
- vec4 outColor = mix( mix(color3, color2, alpha2), mix(color1, color0, alpha1), alphaFinal );
-
- /// Add WL Components
- outColor.rgb = atmosLighting(outColor.rgb * gl_Color.rgb);
-
- gl_FragColor = vec4(scaleSoftClip(outColor.rgb), 1.0);
-}
-
diff --git a/indra/newview/app_settings/shaders/class2/environment/terrainV.glsl b/indra/newview/app_settings/shaders/class2/environment/terrainV.glsl
deleted file mode 100644
index 2234f0bd89..0000000000
--- a/indra/newview/app_settings/shaders/class2/environment/terrainV.glsl
+++ /dev/null
@@ -1,52 +0,0 @@
-/**
- * @file terrainV.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * $/LicenseInfo$
- */
-
-void calcAtmospherics(vec3 inPositionEye);
-
-vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
-
-vec4 texgen_object(vec4 vpos, vec4 tc, mat4 mat, vec4 tp0, vec4 tp1)
-{
- vec4 tcoord;
-
- tcoord.x = dot(vpos, tp0);
- tcoord.y = dot(vpos, tp1);
- tcoord.z = tc.z;
- tcoord.w = tc.w;
-
- tcoord = mat * tcoord;
-
- return tcoord;
-}
-
-void main()
-{
- //transform vertex
- gl_Position = ftransform();
-
- vec4 pos = gl_ModelViewMatrix * gl_Vertex;
- vec3 norm = normalize(gl_NormalMatrix * gl_Normal);
-
- /// Potentially better without it for water.
- pos /= pos.w;
-
- calcAtmospherics((gl_ModelViewMatrix * gl_Vertex).xyz);
-
- vec4 color = calcLighting(pos.xyz, norm, gl_Color, vec4(0));
-
- gl_FrontColor = color;
-
- // Transform and pass tex coords
- gl_TexCoord[0].xy = texgen_object(gl_Vertex, gl_MultiTexCoord0, gl_TextureMatrix[0], gl_ObjectPlaneS[0], gl_ObjectPlaneT[0]).xy;
-
- vec4 t = gl_MultiTexCoord1;
-
- gl_TexCoord[0].zw = t.xy;
- gl_TexCoord[1].xy = t.xy-vec2(2.0, 0.0);
- gl_TexCoord[1].zw = t.xy-vec2(1.0, 0.0);
-}
-
diff --git a/indra/newview/app_settings/shaders/class2/environment/terrainWaterF.glsl b/indra/newview/app_settings/shaders/class2/environment/terrainWaterF.glsl
deleted file mode 100644
index 1650912fc8..0000000000
--- a/indra/newview/app_settings/shaders/class2/environment/terrainWaterF.glsl
+++ /dev/null
@@ -1,39 +0,0 @@
-/**
- * @file terrainWaterF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * $/LicenseInfo$
- */
-
-uniform sampler2D detail_0;
-uniform sampler2D detail_1;
-uniform sampler2D detail_2;
-uniform sampler2D detail_3;
-uniform sampler2D alpha_ramp;
-
-vec3 atmosLighting(vec3 light);
-
-vec4 applyWaterFog(vec4 color);
-
-void main()
-{
- /// Note: This should duplicate the blending functionality currently used for the terrain rendering.
-
- /// TODO Confirm tex coords and bind them appropriately in vert shader.
- vec4 color0 = texture2D(detail_0, gl_TexCoord[0].xy);
- vec4 color1 = texture2D(detail_1, gl_TexCoord[0].xy);
- vec4 color2 = texture2D(detail_2, gl_TexCoord[0].xy);
- vec4 color3 = texture2D(detail_3, gl_TexCoord[0].xy);
-
- float alpha1 = texture2D(alpha_ramp, gl_TexCoord[0].zw).a;
- float alpha2 = texture2D(alpha_ramp,gl_TexCoord[1].xy).a;
- float alphaFinal = texture2D(alpha_ramp, gl_TexCoord[1].zw).a;
- vec4 outColor = mix( mix(color3, color2, alpha2), mix(color1, color0, alpha1), alphaFinal );
-
- /// Add WL Components
- outColor.rgb = atmosLighting(outColor.rgb * gl_Color.rgb);
-
- outColor = applyWaterFog(outColor);
- gl_FragColor = outColor;
-}
-
diff --git a/indra/newview/app_settings/shaders/class2/environment/underWaterF.glsl b/indra/newview/app_settings/shaders/class2/environment/underWaterF.glsl
deleted file mode 100644
index 9e936a3790..0000000000
--- a/indra/newview/app_settings/shaders/class2/environment/underWaterF.glsl
+++ /dev/null
@@ -1,88 +0,0 @@
-/**
- * @file underWaterF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * $/LicenseInfo$
- */
-
-uniform sampler2D diffuseMap;
-uniform sampler2D bumpMap;
-uniform sampler2D screenTex;
-uniform sampler2D refTex;
-uniform sampler2D screenDepth;
-
-uniform vec4 fogCol;
-uniform vec3 lightDir;
-uniform vec3 specular;
-uniform float lightExp;
-uniform vec2 fbScale;
-uniform float refScale;
-uniform float znear;
-uniform float zfar;
-uniform float kd;
-uniform vec4 waterPlane;
-uniform vec3 eyeVec;
-uniform vec4 waterFogColor;
-uniform float waterFogDensity;
-uniform float waterFogKS;
-uniform vec2 screenRes;
-
-//bigWave is (refCoord.w, view.w);
-varying vec4 refCoord;
-varying vec4 littleWave;
-varying vec4 view;
-
-vec4 applyWaterFog(vec4 color, vec3 viewVec)
-{
- //normalize view vector
- vec3 view = normalize(viewVec);
- float es = -view.z;
-
- //find intersection point with water plane and eye vector
-
- //get eye depth
- float e0 = max(-waterPlane.w, 0.0);
-
- //get object depth
- float depth = length(viewVec);
-
- //get "thickness" of water
- float l = max(depth, 0.1);
-
- float kd = waterFogDensity;
- float ks = waterFogKS;
- vec4 kc = waterFogColor;
-
- float F = 0.98;
-
- float t1 = -kd * pow(F, ks * e0);
- float t2 = kd + ks * es;
- float t3 = pow(F, t2*l) - 1.0;
-
- float L = min(t1/t2*t3, 1.0);
-
- float D = pow(0.98, l*kd);
- //return vec4(1.0, 0.0, 1.0, 1.0);
- return color * D + kc * L;
- //depth /= 10.0;
- //return vec4(depth,depth,depth,0.0);
-}
-
-void main()
-{
- vec4 color;
-
- //get detail normals
- vec3 wave1 = texture2D(bumpMap, vec2(refCoord.w, view.w)).xyz*2.0-1.0;
- vec3 wave2 = texture2D(bumpMap, littleWave.xy).xyz*2.0-1.0;
- vec3 wave3 = texture2D(bumpMap, littleWave.zw).xyz*2.0-1.0;
- vec3 wavef = normalize(wave1+wave2+wave3);
-
- //figure out distortion vector (ripply)
- vec2 distort = (refCoord.xy/refCoord.z) * 0.5 + 0.5;
- distort = distort+wavef.xy*refScale;
-
- vec4 fb = texture2D(screenTex, distort);
-
- gl_FragColor = applyWaterFog(fb,view.xyz);
-}
diff --git a/indra/newview/app_settings/shaders/class2/environment/waterF.glsl b/indra/newview/app_settings/shaders/class2/environment/waterF.glsl
deleted file mode 100644
index e477107c0b..0000000000
--- a/indra/newview/app_settings/shaders/class2/environment/waterF.glsl
+++ /dev/null
@@ -1,117 +0,0 @@
-/**
- * @file waterF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * $/LicenseInfo$
- */
-
-vec3 scaleSoftClip(vec3 inColor);
-vec3 atmosTransport(vec3 inColor);
-
-uniform sampler2D bumpMap;
-uniform sampler2D screenTex;
-uniform sampler2D refTex;
-
-uniform float sunAngle;
-uniform float sunAngle2;
-uniform vec3 lightDir;
-uniform vec3 specular;
-uniform float lightExp;
-uniform float refScale;
-uniform float kd;
-uniform vec2 screenRes;
-uniform vec3 normScale;
-uniform float fresnelScale;
-uniform float fresnelOffset;
-uniform float blurMultiplier;
-
-
-//bigWave is (refCoord.w, view.w);
-varying vec4 refCoord;
-varying vec4 littleWave;
-varying vec4 view;
-
-void main()
-{
- vec4 color;
-
- float dist = length(view.xy);
-
- //normalize view vector
- vec3 viewVec = normalize(view.xyz);
-
- //get wave normals
- vec3 wave1 = texture2D(bumpMap, vec2(refCoord.w, view.w)).xyz*2.0-1.0;
- vec3 wave2 = texture2D(bumpMap, littleWave.xy).xyz*2.0-1.0;
- vec3 wave3 = texture2D(bumpMap, littleWave.zw).xyz*2.0-1.0;
- //get base fresnel components
-
- vec3 df = vec3(
- dot(viewVec, wave1),
- dot(viewVec, (wave2 + wave3) * 0.5),
- dot(viewVec, wave3)
- ) * fresnelScale + fresnelOffset;
- df *= df;
-
- vec2 distort = (refCoord.xy/refCoord.z) * 0.5 + 0.5;
-
- float dist2 = dist;
- dist = max(dist, 5.0);
-
- float dmod = sqrt(dist);
-
- vec2 dmod_scale = vec2(dmod*dmod, dmod);
-
- //get reflected color
- vec2 refdistort1 = wave1.xy*normScale.x;
- vec2 refvec1 = distort+refdistort1/dmod_scale;
- vec4 refcol1 = texture2D(refTex, refvec1);
-
- vec2 refdistort2 = wave2.xy*normScale.y;
- vec2 refvec2 = distort+refdistort2/dmod_scale;
- vec4 refcol2 = texture2D(refTex, refvec2);
-
- vec2 refdistort3 = wave3.xy*normScale.z;
- vec2 refvec3 = distort+refdistort3/dmod_scale;
- vec4 refcol3 = texture2D(refTex, refvec3);
-
- vec4 refcol = refcol1 + refcol2 + refcol3;
- float df1 = df.x + df.y + df.z;
- refcol *= df1 * 0.333;
-
- vec3 wavef = (wave1 + wave2 * 0.4 + wave3 * 0.6) * 0.5;
-
- wavef.z *= max(-viewVec.z, 0.1);
- wavef = normalize(wavef);
-
- float df2 = dot(viewVec, wavef) * fresnelScale+fresnelOffset;
-
- vec2 refdistort4 = wavef.xy*0.125;
- refdistort4.y -= abs(refdistort4.y);
- vec2 refvec4 = distort+refdistort4/dmod;
- float dweight = min(dist2*blurMultiplier, 1.0);
- vec4 baseCol = texture2D(refTex, refvec4);
- refcol = mix(baseCol*df2, refcol, dweight);
-
- //get specular component
- float spec = clamp(dot(lightDir, (reflect(viewVec,wavef))),0.0,1.0);
-
- //harden specular
- spec = pow(spec, 128.0);
-
- //figure out distortion vector (ripply)
- vec2 distort2 = distort+wavef.xy*refScale/max(dmod*df1, 1.0);
-
- vec4 fb = texture2D(screenTex, distort2);
-
- //mix with reflection
- // Note we actually want to use just df1, but multiplying by 0.999999 gets around and nvidia compiler bug
- color.rgb = mix(fb.rgb, refcol.rgb, df1 * 0.99999);
- color.rgb += spec * specular;
-
- color.rgb = atmosTransport(color.rgb);
- color.rgb = scaleSoftClip(color.rgb);
- color.a = spec * sunAngle2;
-
- gl_FragColor = color;
-}
diff --git a/indra/newview/app_settings/shaders/class2/environment/waterFogF.glsl b/indra/newview/app_settings/shaders/class2/environment/waterFogF.glsl
deleted file mode 100644
index 7bcdcf5d5b..0000000000
--- a/indra/newview/app_settings/shaders/class2/environment/waterFogF.glsl
+++ /dev/null
@@ -1,54 +0,0 @@
-/**
- * @file waterFogF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * $/LicenseInfo$
- */
-
-uniform vec4 lightnorm;
-uniform vec4 waterPlane;
-uniform vec4 waterFogColor;
-uniform float waterFogDensity;
-uniform float waterFogKS;
-
-vec3 getPositionEye();
-
-vec4 applyWaterFog(vec4 color)
-{
- //normalize view vector
- vec3 view = normalize(getPositionEye());
- float es = -(dot(view, waterPlane.xyz));
-
- //find intersection point with water plane and eye vector
-
- //get eye depth
- float e0 = max(-waterPlane.w, 0.0);
-
- vec3 int_v = waterPlane.w > 0.0 ? view * waterPlane.w/es : vec3(0.0, 0.0, 0.0);
-
- //get object depth
- float depth = length(getPositionEye() - int_v);
-
- //get "thickness" of water
- float l = max(depth, 0.1);
-
- float kd = waterFogDensity;
- float ks = waterFogKS;
- vec4 kc = waterFogColor;
-
- float F = 0.98;
-
- float t1 = -kd * pow(F, ks * e0);
- float t2 = kd + ks * es;
- float t3 = pow(F, t2*l) - 1.0;
-
- float L = min(t1/t2*t3, 1.0);
-
- float D = pow(0.98, l*kd);
-
- color.rgb = color.rgb * D + kc.rgb * L;
- color.a = kc.a + color.a;
-
- return color;
-}
-
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightF.glsl
deleted file mode 100644
index 269d11a085..0000000000
--- a/indra/newview/app_settings/shaders/class2/lighting/lightF.glsl
+++ /dev/null
@@ -1,23 +0,0 @@
-/**
- * @file lightF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * $/LicenseInfo$
- */
-
-uniform sampler2D diffuseMap;
-
-vec3 atmosLighting(vec3 light);
-vec3 scaleSoftClip(vec3 light);
-
-void default_lighting()
-{
- vec4 color = texture2D(diffuseMap, gl_TexCoord[0].xy) * gl_Color;
-
- color.rgb = atmosLighting(color.rgb);
-
- color.rgb = scaleSoftClip(color.rgb);
-
- gl_FragColor = color;
-}
-
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightF.glsl
deleted file mode 100644
index 9ffe3c6f4a..0000000000
--- a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightF.glsl
+++ /dev/null
@@ -1,23 +0,0 @@
-/**
- * @file lightFullbrightF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * $/LicenseInfo$
- */
-
-uniform sampler2D diffuseMap;
-
-vec3 fullbrightAtmosTransport(vec3 light);
-vec3 fullbrightScaleSoftClip(vec3 light);
-
-void fullbright_lighting()
-{
- vec4 color = texture2D(diffuseMap, gl_TexCoord[0].xy) * gl_Color;
-
- color.rgb = fullbrightAtmosTransport(color.rgb);
-
- color.rgb = fullbrightScaleSoftClip(color.rgb);
-
- gl_FragColor = color;
-}
-
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyF.glsl
deleted file mode 100644
index b7181dec3a..0000000000
--- a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightShinyF.glsl
+++ /dev/null
@@ -1,30 +0,0 @@
-/**
- * @file lightFullbrightShinyF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * $/LicenseInfo$
- */
-
-uniform sampler2D diffuseMap;
-uniform samplerCube environmentMap;
-
-vec3 fullbrightShinyAtmosTransport(vec3 light);
-vec3 fullbrightScaleSoftClip(vec3 light);
-
-void fullbright_shiny_lighting()
-{
- vec4 color = texture2D(diffuseMap, gl_TexCoord[0].xy);
- color.rgb *= gl_Color.rgb;
-
- vec3 envColor = textureCube(environmentMap, gl_TexCoord[1].xyz).rgb;
- color.rgb = mix(color.rgb, envColor.rgb, gl_Color.a);
-
- color.rgb = fullbrightShinyAtmosTransport(color.rgb);
-
- color.rgb = fullbrightScaleSoftClip(color.rgb);
-
- color.a = max(color.a, gl_Color.a);
-
- gl_FragColor = color;
-}
-
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterF.glsl
deleted file mode 100644
index ee38790cc4..0000000000
--- a/indra/newview/app_settings/shaders/class2/lighting/lightFullbrightWaterF.glsl
+++ /dev/null
@@ -1,21 +0,0 @@
-/**
- * @file lightFullbrightWaterF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * $/LicenseInfo$
- */
-
-uniform sampler2D diffuseMap;
-
-vec3 fullbrightAtmosTransport(vec3 light);
-vec4 applyWaterFog(vec4 color);
-
-void fullbright_lighting_water()
-{
- vec4 color = texture2D(diffuseMap, gl_TexCoord[0].xy) * gl_Color;
-
- color.rgb = fullbrightAtmosTransport(color.rgb);
-
- gl_FragColor = applyWaterFog(color);
-}
-
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightShinyF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightShinyF.glsl
deleted file mode 100644
index b96b5d75bc..0000000000
--- a/indra/newview/app_settings/shaders/class2/lighting/lightShinyF.glsl
+++ /dev/null
@@ -1,29 +0,0 @@
-/**
- * @file lightShinyF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * $/LicenseInfo$
- */
-
-uniform sampler2D diffuseMap;
-uniform samplerCube environmentMap;
-
-vec3 scaleSoftClip(vec3 light);
-vec3 atmosLighting(vec3 light);
-vec4 applyWaterFog(vec4 color);
-
-void shiny_lighting()
-{
- vec4 color = texture2D(diffuseMap, gl_TexCoord[0].xy);
- color.rgb *= gl_Color.rgb;
-
- vec3 envColor = textureCube(environmentMap, gl_TexCoord[1].xyz).rgb;
- color.rgb = mix(color.rgb, envColor.rgb, gl_Color.a);
-
- color.rgb = atmosLighting(color.rgb);
-
- color.rgb = scaleSoftClip(color.rgb);
- color.a = max(color.a, gl_Color.a);
- gl_FragColor = color;
-}
-
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightShinyWaterF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightShinyWaterF.glsl
deleted file mode 100644
index 0f5b2d6fcf..0000000000
--- a/indra/newview/app_settings/shaders/class2/lighting/lightShinyWaterF.glsl
+++ /dev/null
@@ -1,27 +0,0 @@
-/**
- * @file lightShinyWaterF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * $/LicenseInfo$
- */
-
-
-uniform sampler2D diffuseMap;
-uniform samplerCube environmentMap;
-
-vec3 atmosLighting(vec3 light);
-vec4 applyWaterFog(vec4 color);
-
-void shiny_lighting_water()
-{
- vec4 color = texture2D(diffuseMap, gl_TexCoord[0].xy);
- color.rgb *= gl_Color.rgb;
-
- vec3 envColor = textureCube(environmentMap, gl_TexCoord[1].xyz).rgb;
- color.rgb = mix(color.rgb, envColor.rgb, gl_Color.a);
-
- color.rgb = atmosLighting(color.rgb);
- color.a = max(color.a, gl_Color.a);
- gl_FragColor = applyWaterFog(color);
-}
-
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightSpecularV.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightSpecularV.glsl
deleted file mode 100644
index 6400b45d9e..0000000000
--- a/indra/newview/app_settings/shaders/class2/lighting/lightSpecularV.glsl
+++ /dev/null
@@ -1,16 +0,0 @@
-/**
- * @file lightSpecularV.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * $/LicenseInfo$
- */
-
-// All lights, no specular highlights
-
-vec4 sumLightsSpecular(vec3 pos, vec3 norm, vec4 color, inout vec4 specularColor, vec4 baseCol);
-
-vec4 calcLightingSpecular(vec3 pos, vec3 norm, vec4 color, inout vec4 specularColor, vec4 baseCol)
-{
- return sumLightsSpecular(pos, norm, color, specularColor, baseCol);
-}
-
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightV.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightV.glsl
deleted file mode 100644
index 89ef510d7c..0000000000
--- a/indra/newview/app_settings/shaders/class2/lighting/lightV.glsl
+++ /dev/null
@@ -1,16 +0,0 @@
-/**
- * @file lightV.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * $/LicenseInfo$
- */
-
-// All lights, no specular highlights
-
-vec4 sumLights(vec3 pos, vec3 norm, vec4 color, vec4 baseLight);
-
-vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseLight)
-{
- return sumLights(pos, norm, color, baseLight);
-}
-
diff --git a/indra/newview/app_settings/shaders/class2/lighting/lightWaterF.glsl b/indra/newview/app_settings/shaders/class2/lighting/lightWaterF.glsl
deleted file mode 100644
index 016258bd18..0000000000
--- a/indra/newview/app_settings/shaders/class2/lighting/lightWaterF.glsl
+++ /dev/null
@@ -1,21 +0,0 @@
-/**
- * @file lightWaterF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * $/LicenseInfo$
- */
-
-uniform sampler2D diffuseMap;
-
-vec3 atmosLighting(vec3 light);
-vec4 applyWaterFog(vec4 color);
-
-void default_lighting_water()
-{
- vec4 color = texture2D(diffuseMap, gl_TexCoord[0].xy) * gl_Color;
-
- color.rgb = atmosLighting(color.rgb);
-
- gl_FragColor = applyWaterFog(color);
-}
-
diff --git a/indra/newview/app_settings/shaders/class2/lighting/sumLightsSpecularV.glsl b/indra/newview/app_settings/shaders/class2/lighting/sumLightsSpecularV.glsl
index 8cfeeb1cf9..3acf9fe883 100644
--- a/indra/newview/app_settings/shaders/class2/lighting/sumLightsSpecularV.glsl
+++ b/indra/newview/app_settings/shaders/class2/lighting/sumLightsSpecularV.glsl
@@ -2,8 +2,28 @@
* @file sumLightsV.glsl
*
* $LicenseInfo:firstyear=2005&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2005, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+
+
float calcDirectionalLightSpecular(inout vec4 specular, vec3 view, vec3 n, vec3 l, vec3 lightCol, float da);
vec3 calcPointLightSpecular(inout vec4 specular, vec3 view, vec3 v, vec3 n, vec3 l, float r, float pw, vec3 lightCol);
@@ -13,6 +33,10 @@ vec3 atmosAffectDirectionalLight(float lightIntensity);
vec3 atmosGetDiffuseSunlightColor();
vec3 scaleDownLight(vec3 light);
+uniform vec4 light_position[8];
+uniform vec3 light_attenuation[8];
+uniform vec3 light_diffuse[8];
+
vec4 sumLightsSpecular(vec3 pos, vec3 norm, vec4 color, inout vec4 specularColor, vec4 baseCol)
{
vec4 col = vec4(0.0, 0.0, 0.0, color.a);
@@ -23,15 +47,14 @@ vec4 sumLightsSpecular(vec3 pos, vec3 norm, vec4 color, inout vec4 specularColor
vec4 specularSum = vec4(0.0);
// Collect normal lights (need to be divided by two, as we later multiply by 2)
- col.rgb += gl_LightSource[1].diffuse.rgb * calcDirectionalLightSpecular(specularColor, view, norm, gl_LightSource[1].position.xyz, gl_LightSource[1].diffuse.rgb, 1.0);
- col.rgb += calcPointLightSpecular(specularSum, view, pos, norm, gl_LightSource[2].position.xyz, gl_LightSource[2].linearAttenuation, gl_LightSource[2].quadraticAttenuation, gl_LightSource[2].diffuse.rgb);
- col.rgb += calcPointLightSpecular(specularSum, view, pos, norm, gl_LightSource[3].position.xyz, gl_LightSource[3].linearAttenuation, gl_LightSource[3].quadraticAttenuation, gl_LightSource[3].diffuse.rgb);
- //col.rgb += calcPointLightSpecular(specularSum, view, pos, norm, gl_LightSource[4].position.xyz, gl_LightSource[4].linearAttenuation, gl_LightSource[4].quadraticAttenuation, gl_LightSource[4].diffuse.rgb);
+ col.rgb += light_diffuse[1].rgb * calcDirectionalLightSpecular(specularColor, view, norm, light_position[1].xyz,light_diffuse[1].rgb, 1.0);
+ col.rgb += calcPointLightSpecular(specularSum, view, pos, norm, light_position[2].xyz, light_attenuation[2].x, light_attenuation[2].y, light_diffuse[2].rgb);
+ col.rgb += calcPointLightSpecular(specularSum, view, pos, norm, light_position[3].xyz, light_attenuation[3].x, light_attenuation[3].y, light_diffuse[3].rgb);
col.rgb = scaleDownLight(col.rgb);
// Add windlight lights
col.rgb += atmosAmbient(baseCol.rgb);
- col.rgb += atmosAffectDirectionalLight(calcDirectionalLightSpecular(specularSum, view, norm, gl_LightSource[0].position.xyz, atmosGetDiffuseSunlightColor()*baseCol.a, 1.0));
+ col.rgb += atmosAffectDirectionalLight(calcDirectionalLightSpecular(specularSum, view, norm, light_position[0].xyz,atmosGetDiffuseSunlightColor()*baseCol.a, 1.0));
col.rgb = min(col.rgb*color.rgb, 1.0);
specularColor.rgb = min(specularColor.rgb*specularSum.rgb, 1.0);
diff --git a/indra/newview/app_settings/shaders/class2/lighting/sumLightsV.glsl b/indra/newview/app_settings/shaders/class2/lighting/sumLightsV.glsl
index a512b9d6fb..c9987ef3b9 100644
--- a/indra/newview/app_settings/shaders/class2/lighting/sumLightsV.glsl
+++ b/indra/newview/app_settings/shaders/class2/lighting/sumLightsV.glsl
@@ -2,9 +2,27 @@
* @file sumLightsV.glsl
*
* $LicenseInfo:firstyear=2005&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2005, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+
float calcDirectionalLight(vec3 n, vec3 l);
float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float is_pointlight);
@@ -12,21 +30,26 @@ vec3 atmosAmbient(vec3 light);
vec3 atmosAffectDirectionalLight(float lightIntensity);
vec3 scaleDownLight(vec3 light);
+uniform vec4 light_position[8];
+uniform vec3 light_direction[8];
+uniform vec3 light_attenuation[8];
+uniform vec3 light_diffuse[8];
+
vec4 sumLights(vec3 pos, vec3 norm, vec4 color, vec4 baseLight)
{
vec4 col = vec4(0.0, 0.0, 0.0, color.a);
// Collect normal lights (need to be divided by two, as we later multiply by 2)
- col.rgb += gl_LightSource[1].diffuse.rgb * calcDirectionalLight(norm, gl_LightSource[1].position.xyz);
+ col.rgb += light_diffuse[1].rgb * calcDirectionalLight(norm, light_position[1].xyz);
+
+ col.rgb += light_diffuse[2].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[2], light_direction[2], light_attenuation[2].x, light_attenuation[2].z);
+ col.rgb += light_diffuse[3].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[3], light_direction[3], light_attenuation[3].x, light_attenuation[3].z);
- col.rgb += gl_LightSource[2].diffuse.rgb * calcPointLightOrSpotLight(pos, norm, gl_LightSource[2].position, gl_LightSource[2].spotDirection.xyz, gl_LightSource[2].linearAttenuation, gl_LightSource[2].specular.a);
- col.rgb += gl_LightSource[3].diffuse.rgb * calcPointLightOrSpotLight(pos, norm, gl_LightSource[3].position, gl_LightSource[3].spotDirection.xyz, gl_LightSource[3].linearAttenuation, gl_LightSource[3].specular.a);
- //col.rgb += gl_LightSource[4].diffuse.rgb * calcPointLightOrSpotLight(pos, norm, gl_LightSource[4].position, gl_LightSource[4].spotDirection.xyz, gl_LightSource[4].linearAttenuation, gl_LightSource[4].specular.a);
col.rgb = scaleDownLight(col.rgb);
// Add windlight lights
col.rgb += atmosAmbient(baseLight.rgb);
- col.rgb += atmosAffectDirectionalLight(calcDirectionalLight(norm, gl_LightSource[0].position.xyz));
+ col.rgb += atmosAffectDirectionalLight(calcDirectionalLight(norm, light_position[0].xyz));
col.rgb = min(col.rgb*color.rgb, 1.0);
diff --git a/indra/newview/app_settings/shaders/class2/objects/shinyV.glsl b/indra/newview/app_settings/shaders/class2/objects/shinyV.glsl
deleted file mode 100644
index c428bbb28e..0000000000
--- a/indra/newview/app_settings/shaders/class2/objects/shinyV.glsl
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * @file shinyV.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * $/LicenseInfo$
- */
-
-vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
-
-void calcAtmospherics(vec3 inPositionEye);
-
-uniform vec4 origin;
-
-void main()
-{
- //transform vertex
- gl_Position = ftransform();
-
- vec4 pos = (gl_ModelViewMatrix * gl_Vertex);
- vec3 norm = normalize(gl_NormalMatrix * gl_Normal);
- vec3 ref = reflect(pos.xyz, -norm);
-
- gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
- gl_TexCoord[1] = gl_TextureMatrix[1]*vec4(ref,1.0);
-
- calcAtmospherics(pos.xyz);
-
- gl_FrontColor = calcLighting(pos.xyz, norm, gl_Color, vec4(0.0));
-
- gl_FogFragCoord = pos.z;
-}
diff --git a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsF.glsl b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsF.glsl
index 8baff24dbd..fea3cbf69b 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsF.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsF.glsl
@@ -2,8 +2,28 @@
* @file atmosphericsF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+
+
//////////////////////////////////////////////////////////
// The fragment shader for the terrain atmospherics
diff --git a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsHelpersV.glsl b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsHelpersV.glsl
index 6883edc1f1..62a034ce05 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsHelpersV.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsHelpersV.glsl
@@ -2,8 +2,28 @@
* @file atmosphericsHelpersV.glsl
*
* $LicenseInfo:firstyear=2005&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2005, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+
+
// Output variables
vec3 getSunlitColor();
diff --git a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsV.glsl b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsV.glsl
index f5c513bbdd..da3d922017 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsV.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsV.glsl
@@ -2,10 +2,30 @@
* @file atmosphericsV.glsl
*
* $LicenseInfo:firstyear=2005&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2005, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+
-// varying param funcs
+
+// VARYING param funcs
void setSunlitColor(vec3 v);
void setAmblitColor(vec3 v);
void setAdditiveColor(vec3 v);
@@ -14,8 +34,8 @@ void setPositionEye(vec3 v);
vec3 getAdditiveColor();
-//varying vec4 vary_CloudUVs;
-//varying float vary_CloudDensity;
+//VARYING vec4 vary_CloudUVs;
+//VARYING float vary_CloudDensity;
// Inputs
uniform vec4 morphFactor;
@@ -27,12 +47,12 @@ uniform vec4 sunlight_color;
uniform vec4 ambient;
uniform vec4 blue_horizon;
uniform vec4 blue_density;
-uniform vec4 haze_horizon;
-uniform vec4 haze_density;
-uniform vec4 cloud_shadow;
-uniform vec4 density_multiplier;
-uniform vec4 distance_multiplier;
-uniform vec4 max_y;
+uniform float haze_horizon;
+uniform float haze_density;
+uniform float cloud_shadow;
+uniform float density_multiplier;
+uniform float distance_multiplier;
+uniform float max_y;
uniform vec4 glow;
void calcAtmospherics(vec3 inPositionEye) {
@@ -41,8 +61,8 @@ void calcAtmospherics(vec3 inPositionEye) {
setPositionEye(P);
//(TERRAIN) limit altitude
- if (P.y > max_y.x) P *= (max_y.x / P.y);
- if (P.y < -max_y.x) P *= (-max_y.x / P.y);
+ if (P.y > max_y) P *= (max_y / P.y);
+ if (P.y < -max_y) P *= (-max_y / P.y);
vec3 tmpLightnorm = lightnorm.xyz;
@@ -58,13 +78,13 @@ void calcAtmospherics(vec3 inPositionEye) {
//sunlight attenuation effect (hue and brightness) due to atmosphere
//this is used later for sunlight modulation at various altitudes
- light_atten = (blue_density * 1.0 + vec4(haze_density.r) * 0.25) * (density_multiplier.x * max_y.x);
+ light_atten = (blue_density + vec4(haze_density * 0.25)) * (density_multiplier * max_y);
//I had thought blue_density and haze_density should have equal weighting,
//but attenuation due to haze_density tends to seem too strong
- temp1 = blue_density + vec4(haze_density.r);
+ temp1 = blue_density + vec4(haze_density);
blue_weight = blue_density / temp1;
- haze_weight = vec4(haze_density.r) / temp1;
+ haze_weight = vec4(haze_density) / temp1;
//(TERRAIN) compute sunlight from lightnorm only (for short rays like terrain)
temp2.y = max(0.0, tmpLightnorm.y);
@@ -72,12 +92,12 @@ void calcAtmospherics(vec3 inPositionEye) {
sunlight *= exp( - light_atten * temp2.y);
// main atmospheric scattering line integral
- temp2.z = Plen * density_multiplier.x;
+ temp2.z = Plen * density_multiplier;
// Transparency (-> temp1)
- // ATI Bugfix -- can't store temp1*temp2.z*distance_multiplier.x in a variable because the ati
+ // ATI Bugfix -- can't store temp1*temp2.z*distance_multiplier in a variable because the ati
// compiler gets confused.
- temp1 = exp(-temp1 * temp2.z * distance_multiplier.x);
+ temp1 = exp(-temp1 * temp2.z * distance_multiplier);
//final atmosphere attenuation factor
setAtmosAttenuation(temp1.rgb);
@@ -102,12 +122,12 @@ void calcAtmospherics(vec3 inPositionEye) {
//increase ambient when there are more clouds
- vec4 tmpAmbient = ambient + (vec4(1.) - ambient) * cloud_shadow.x * 0.5;
+ vec4 tmpAmbient = ambient + (vec4(1.) - ambient) * cloud_shadow * 0.5;
//haze color
setAdditiveColor(
- vec3(blue_horizon * blue_weight * (sunlight*(1.-cloud_shadow.x) + tmpAmbient)
- + (haze_horizon.r * haze_weight) * (sunlight*(1.-cloud_shadow.x) * temp2.x
+ vec3(blue_horizon * blue_weight * (sunlight*(1.-cloud_shadow) + tmpAmbient)
+ + (haze_horizon * haze_weight) * (sunlight*(1.-cloud_shadow) * temp2.x
+ tmpAmbient)));
//brightness of surface both sunlight and ambient
diff --git a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsF.glsl b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsF.glsl
index d0b60e918e..765b0927c3 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsF.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsF.glsl
@@ -2,27 +2,39 @@
* @file atmosphericVars.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+
-varying vec3 vary_PositionEye;
+VARYING vec3 vary_SunlitColor;
+VARYING vec3 vary_AdditiveColor;
+VARYING vec3 vary_AtmosAttenuation;
-varying vec3 vary_SunlitColor;
-varying vec3 vary_AmblitColor;
-varying vec3 vary_AdditiveColor;
-varying vec3 vary_AtmosAttenuation;
-
-vec3 getPositionEye()
-{
- return vary_PositionEye;
-}
vec3 getSunlitColor()
{
- return vary_SunlitColor;
+ return vec3(0,0,0);
}
vec3 getAmblitColor()
{
- return vary_AmblitColor;
+ return vec3(0,0,0);
}
vec3 getAdditiveColor()
{
@@ -30,5 +42,5 @@ vec3 getAdditiveColor()
}
vec3 getAtmosAttenuation()
{
- return vary_AtmosAttenuation;
+ return vec3(vary_AtmosAttenuation);
}
diff --git a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsV.glsl b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsV.glsl
index 4b4baf50d0..99dbee15ee 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsV.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsV.glsl
@@ -2,59 +2,83 @@
* @file atmosphericVars.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+
-varying vec3 vary_PositionEye;
+VARYING vec3 vary_AdditiveColor;
+VARYING vec3 vary_AtmosAttenuation;
-varying vec3 vary_SunlitColor;
-varying vec3 vary_AmblitColor;
-varying vec3 vary_AdditiveColor;
-varying vec3 vary_AtmosAttenuation;
+vec3 additive_color;
+vec3 atmos_attenuation;
+vec3 sunlit_color;
+vec3 amblit_color;
+vec3 position_eye;
-vec3 getPositionEye()
-{
- return vary_PositionEye;
-}
vec3 getSunlitColor()
{
- return vary_SunlitColor;
+ return sunlit_color;
}
vec3 getAmblitColor()
{
- return vary_AmblitColor;
+ return amblit_color;
}
+
vec3 getAdditiveColor()
{
- return vary_AdditiveColor;
+ return additive_color;
}
vec3 getAtmosAttenuation()
{
- return vary_AtmosAttenuation;
+ return atmos_attenuation;
}
+vec3 getPositionEye()
+{
+ return position_eye;
+}
void setPositionEye(vec3 v)
{
- vary_PositionEye = v;
+ position_eye = v;
}
void setSunlitColor(vec3 v)
{
- vary_SunlitColor = v;
+ sunlit_color = v;
}
void setAmblitColor(vec3 v)
{
- vary_AmblitColor = v;
+ amblit_color = v;
}
void setAdditiveColor(vec3 v)
{
+ additive_color = v;
vary_AdditiveColor = v;
}
void setAtmosAttenuation(vec3 v)
{
+ atmos_attenuation = v;
vary_AtmosAttenuation = v;
}
diff --git a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsWaterF.glsl b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsWaterF.glsl
new file mode 100644
index 0000000000..163ef26444
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsWaterF.glsl
@@ -0,0 +1,50 @@
+/**
+ * @file atmosphericVarsWaterF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+VARYING vec3 vary_PositionEye;
+VARYING vec3 vary_AdditiveColor;
+VARYING vec3 vary_AtmosAttenuation;
+
+vec3 getSunlitColor()
+{
+ return vec3(0,0,0);
+}
+vec3 getAmblitColor()
+{
+ return vec3(0,0,0);
+}
+vec3 getAdditiveColor()
+{
+ return vary_AdditiveColor;
+}
+vec3 getAtmosAttenuation()
+{
+ return vary_AtmosAttenuation;
+}
+vec3 getPositionEye()
+{
+ return vary_PositionEye;
+}
+
diff --git a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsWaterV.glsl b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsWaterV.glsl
new file mode 100644
index 0000000000..553f6752e6
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsWaterV.glsl
@@ -0,0 +1,81 @@
+/**
+ * @file atmosphericVarsWaterV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+VARYING vec3 vary_PositionEye;
+VARYING vec3 vary_AdditiveColor;
+VARYING vec3 vary_AtmosAttenuation;
+
+vec3 atmos_attenuation;
+vec3 sunlit_color;
+vec3 amblit_color;
+
+vec3 getSunlitColor()
+{
+ return sunlit_color;
+}
+vec3 getAmblitColor()
+{
+ return amblit_color;
+}
+
+vec3 getAdditiveColor()
+{
+ return vary_AdditiveColor;
+}
+vec3 getAtmosAttenuation()
+{
+ return atmos_attenuation;
+}
+
+vec3 getPositionEye()
+{
+ return vary_PositionEye;
+}
+
+void setPositionEye(vec3 v)
+{
+ vary_PositionEye = v;
+}
+
+void setSunlitColor(vec3 v)
+{
+ sunlit_color = v;
+}
+
+void setAmblitColor(vec3 v)
+{
+ amblit_color = v;
+}
+
+void setAdditiveColor(vec3 v)
+{
+ vary_AdditiveColor = v;
+}
+
+void setAtmosAttenuation(vec3 v)
+{
+ atmos_attenuation = v;
+ vary_AtmosAttenuation = v;
+}
diff --git a/indra/newview/app_settings/shaders/class2/windlight/cloudsF.glsl b/indra/newview/app_settings/shaders/class2/windlight/cloudsF.glsl
index 2a559440fc..96c70651b1 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/cloudsF.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/cloudsF.glsl
@@ -2,16 +2,44 @@
* @file WLCloudsF.glsl
*
* $LicenseInfo:firstyear=2005&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2005, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
/////////////////////////////////////////////////////////////////////////
// The fragment shader for the sky
/////////////////////////////////////////////////////////////////////////
-varying vec4 vary_CloudColorSun;
-varying vec4 vary_CloudColorAmbient;
-varying float vary_CloudDensity;
+VARYING vec4 vary_CloudColorSun;
+VARYING vec4 vary_CloudColorAmbient;
+VARYING float vary_CloudDensity;
+VARYING vec2 vary_texcoord0;
+VARYING vec2 vary_texcoord1;
+VARYING vec2 vary_texcoord2;
+VARYING vec2 vary_texcoord3;
uniform sampler2D cloud_noise_texture;
uniform vec4 cloud_pos_density1;
@@ -30,14 +58,14 @@ vec3 scaleSoftClip(vec3 light) {
void main()
{
// Set variables
- vec2 uv1 = gl_TexCoord[0].xy;
- vec2 uv2 = gl_TexCoord[1].xy;
+ vec2 uv1 = vary_texcoord0.xy;
+ vec2 uv2 = vary_texcoord1.xy;
vec4 cloudColorSun = vary_CloudColorSun;
vec4 cloudColorAmbient = vary_CloudColorAmbient;
float cloudDensity = vary_CloudDensity;
- vec2 uv3 = gl_TexCoord[2].xy;
- vec2 uv4 = gl_TexCoord[3].xy;
+ vec2 uv3 = vary_texcoord2.xy;
+ vec2 uv4 = vary_texcoord3.xy;
// Offset texture coords
uv1 += cloud_pos_density1.xy; //large texture, visible density
@@ -70,7 +98,7 @@ void main()
color *= 2.;
/// Gamma correct for WL (soft clip effect).
- gl_FragColor.rgb = scaleSoftClip(color.rgb);
- gl_FragColor.a = alpha1;
+ frag_color.rgb = scaleSoftClip(color.rgb);
+ frag_color.a = alpha1;
}
diff --git a/indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl b/indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl
index 865c0e9da8..c1dd45cd67 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl
@@ -2,17 +2,44 @@
* @file WLCloudsV.glsl
*
* $LicenseInfo:firstyear=2005&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2005, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec2 texcoord0;
+
//////////////////////////////////////////////////////////////////////////
// The vertex shader for creating the atmospheric sky
///////////////////////////////////////////////////////////////////////////////
// Output parameters
-varying vec4 vary_CloudColorSun;
-varying vec4 vary_CloudColorAmbient;
-varying float vary_CloudDensity;
+VARYING vec4 vary_CloudColorSun;
+VARYING vec4 vary_CloudColorAmbient;
+VARYING float vary_CloudDensity;
+VARYING vec2 vary_texcoord0;
+VARYING vec2 vary_texcoord1;
+VARYING vec2 vary_texcoord2;
+VARYING vec2 vary_texcoord3;
// Inputs
uniform vec3 camPosLocal;
@@ -22,34 +49,34 @@ uniform vec4 sunlight_color;
uniform vec4 ambient;
uniform vec4 blue_horizon;
uniform vec4 blue_density;
-uniform vec4 haze_horizon;
-uniform vec4 haze_density;
+uniform float haze_horizon;
+uniform float haze_density;
-uniform vec4 cloud_shadow;
-uniform vec4 density_multiplier;
-uniform vec4 max_y;
+uniform float cloud_shadow;
+uniform float density_multiplier;
+uniform float max_y;
uniform vec4 glow;
uniform vec4 cloud_color;
-uniform vec4 cloud_scale;
+uniform float cloud_scale;
void main()
{
// World / view / projection
- gl_Position = ftransform();
+ gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
- gl_TexCoord[0] = gl_MultiTexCoord0;
+ vary_texcoord0 = texcoord0;
// Get relative position
- vec3 P = gl_Vertex.xyz - camPosLocal.xyz + vec3(0,50,0);
+ vec3 P = position.xyz - camPosLocal.xyz + vec3(0,50,0);
// Set altitude
if (P.y > 0.)
{
- P *= (max_y.x / P.y);
+ P *= (max_y / P.y);
}
else
{
@@ -71,12 +98,12 @@ void main()
// Sunlight attenuation effect (hue and brightness) due to atmosphere
// this is used later for sunlight modulation at various altitudes
- light_atten = (blue_density * 1.0 + haze_density.x * 0.25) * (density_multiplier.x * max_y.x);
+ light_atten = (blue_density + vec4(haze_density * 0.25)) * (density_multiplier * max_y);
// Calculate relative weights
- temp1 = blue_density + haze_density.x;
+ temp1 = blue_density + haze_density;
blue_weight = blue_density / temp1;
- haze_weight = haze_density.x / temp1;
+ haze_weight = haze_density / temp1;
// Compute sunlight from P & lightnorm (for long rays like sky)
temp2.y = max(0., max(0., Pn.y) * 1.0 + lightnorm.y );
@@ -84,7 +111,7 @@ void main()
sunlight *= exp( - light_atten * temp2.y);
// Distance
- temp2.z = Plen * density_multiplier.x;
+ temp2.z = Plen * density_multiplier;
// Transparency (-> temp1)
// ATI Bugfix -- can't store temp1*temp2.z in a variable because the ati
@@ -108,14 +135,14 @@ void main()
// Increase ambient when there are more clouds
vec4 tmpAmbient = ambient;
- tmpAmbient += (1. - tmpAmbient) * cloud_shadow.x * 0.5;
+ tmpAmbient += (1. - tmpAmbient) * cloud_shadow * 0.5;
// Dim sunlight by cloud shadow percentage
- sunlight *= (1. - cloud_shadow.x);
+ sunlight *= (1. - cloud_shadow);
// Haze color below cloud
vec4 additiveColorBelowCloud = ( blue_horizon * blue_weight * (sunlight + tmpAmbient)
- + (haze_horizon.r * haze_weight) * (sunlight * temp2.x + tmpAmbient)
+ + (haze_horizon * haze_weight) * (sunlight * temp2.x + tmpAmbient)
);
// CLOUDS
@@ -136,21 +163,21 @@ void main()
vec4 oHazeColorBelowCloud = additiveColorBelowCloud * (1. - temp1);
// Make a nice cloud density based on the cloud_shadow value that was passed in.
- vary_CloudDensity = 2. * (cloud_shadow.x - 0.25);
+ vary_CloudDensity = 2. * (cloud_shadow - 0.25);
// Texture coords
- gl_TexCoord[0] = gl_MultiTexCoord0;
- gl_TexCoord[0].xy -= 0.5;
- gl_TexCoord[0].xy /= cloud_scale.x;
- gl_TexCoord[0].xy += 0.5;
+ vary_texcoord0 = texcoord0;
+ vary_texcoord0.xy -= 0.5;
+ vary_texcoord0.xy /= cloud_scale;
+ vary_texcoord0.xy += 0.5;
- gl_TexCoord[1] = gl_TexCoord[0];
- gl_TexCoord[1].x += lightnorm.x * 0.0125;
- gl_TexCoord[1].y += lightnorm.z * 0.0125;
+ vary_texcoord1 = vary_texcoord0;
+ vary_texcoord1.x += lightnorm.x * 0.0125;
+ vary_texcoord1.y += lightnorm.z * 0.0125;
- gl_TexCoord[2] = gl_TexCoord[0] * 16.;
- gl_TexCoord[3] = gl_TexCoord[1] * 16.;
+ vary_texcoord2 = vary_texcoord0 * 16.;
+ vary_texcoord3 = vary_texcoord1 * 16.;
// Combine these to minimize register use
vary_CloudColorAmbient += oHazeColorBelowCloud;
diff --git a/indra/newview/app_settings/shaders/class2/windlight/gammaF.glsl b/indra/newview/app_settings/shaders/class2/windlight/gammaF.glsl
index ce4bd2358f..478373d729 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/gammaF.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/gammaF.glsl
@@ -2,8 +2,28 @@
* @file gammaF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+
+
uniform vec4 gamma;
diff --git a/indra/newview/app_settings/shaders/class2/windlight/skyF.glsl b/indra/newview/app_settings/shaders/class2/windlight/skyF.glsl
index b69a88a45f..e2a2367626 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/skyF.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/skyF.glsl
@@ -2,14 +2,38 @@
* @file WLSkyF.glsl
*
* $LicenseInfo:firstyear=2005&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2005, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+
+#ifdef DEFINE_GL_FRAGCOLOR
+out vec4 frag_color;
+#else
+#define frag_color gl_FragColor
+#endif
/////////////////////////////////////////////////////////////////////////
// The fragment shader for the sky
/////////////////////////////////////////////////////////////////////////
-varying vec4 vary_HazeColor;
+VARYING vec4 vary_HazeColor;
uniform sampler2D cloud_noise_texture;
uniform vec4 gamma;
@@ -35,7 +59,7 @@ void main()
color *= 2.;
/// Gamma correct for WL (soft clip effect).
- gl_FragColor.rgb = scaleSoftClip(color.rgb);
- gl_FragColor.a = 1.0;
+ frag_color.rgb = scaleSoftClip(color.rgb);
+ frag_color.a = 1.0;
}
diff --git a/indra/newview/app_settings/shaders/class2/windlight/skyV.glsl b/indra/newview/app_settings/shaders/class2/windlight/skyV.glsl
index 397db01378..3788ddaf2d 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/skyV.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/skyV.glsl
@@ -2,15 +2,37 @@
* @file WLSkyV.glsl
*
* $LicenseInfo:firstyear=2005&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2005, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+
+uniform mat4 modelview_projection_matrix;
+
+ATTRIBUTE vec3 position;
// SKY ////////////////////////////////////////////////////////////////////////
// The vertex shader for creating the atmospheric sky
///////////////////////////////////////////////////////////////////////////////
// Output parameters
-varying vec4 vary_HazeColor;
+VARYING vec4 vary_HazeColor;
// Inputs
uniform vec3 camPosLocal;
@@ -20,34 +42,31 @@ uniform vec4 sunlight_color;
uniform vec4 ambient;
uniform vec4 blue_horizon;
uniform vec4 blue_density;
-uniform vec4 haze_horizon;
-uniform vec4 haze_density;
+uniform float haze_horizon;
+uniform float haze_density;
-uniform vec4 cloud_shadow;
-uniform vec4 density_multiplier;
-uniform vec4 max_y;
+uniform float cloud_shadow;
+uniform float density_multiplier;
+uniform float max_y;
uniform vec4 glow;
uniform vec4 cloud_color;
-uniform vec4 cloud_scale;
-
void main()
{
// World / view / projection
- gl_Position = ftransform();
- gl_TexCoord[0] = gl_MultiTexCoord0;
+ gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
// Get relative position
- vec3 P = gl_Vertex.xyz - camPosLocal.xyz + vec3(0,50,0);
- //vec3 P = gl_Vertex.xyz + vec3(0,50,0);
+ vec3 P = position.xyz - camPosLocal.xyz + vec3(0,50,0);
+ //vec3 P = position.xyz + vec3(0,50,0);
// Set altitude
if (P.y > 0.)
{
- P *= (max_y.x / P.y);
+ P *= (max_y / P.y);
}
else
{
@@ -66,15 +85,14 @@ void main()
vec4 sunlight = sunlight_color;
vec4 light_atten;
-
// Sunlight attenuation effect (hue and brightness) due to atmosphere
// this is used later for sunlight modulation at various altitudes
- light_atten = (blue_density * 1.0 + haze_density.x * 0.25) * (density_multiplier.x * max_y.x);
+ light_atten = (blue_density + vec4(haze_density * 0.25)) * (density_multiplier * max_y);
// Calculate relative weights
- temp1 = blue_density + haze_density.x;
+ temp1 = blue_density + haze_density;
blue_weight = blue_density / temp1;
- haze_weight = haze_density.x / temp1;
+ haze_weight = haze_density / temp1;
// Compute sunlight from P & lightnorm (for long rays like sky)
temp2.y = max(0., max(0., Pn.y) * 1.0 + lightnorm.y );
@@ -82,7 +100,7 @@ void main()
sunlight *= exp( - light_atten * temp2.y);
// Distance
- temp2.z = Plen * density_multiplier.x;
+ temp2.z = Plen * density_multiplier;
// Transparency (-> temp1)
// ATI Bugfix -- can't store temp1*temp2.z in a variable because the ati
@@ -107,20 +125,20 @@ void main()
// Haze color above cloud
vary_HazeColor = ( blue_horizon * blue_weight * (sunlight + ambient)
- + (haze_horizon.r * haze_weight) * (sunlight * temp2.x + ambient)
+ + (haze_horizon * haze_weight) * (sunlight * temp2.x + ambient)
);
// Increase ambient when there are more clouds
vec4 tmpAmbient = ambient;
- tmpAmbient += (1. - tmpAmbient) * cloud_shadow.x * 0.5;
+ tmpAmbient += (1. - tmpAmbient) * cloud_shadow * 0.5;
// Dim sunlight by cloud shadow percentage
- sunlight *= (1. - cloud_shadow.x);
+ sunlight *= (1. - cloud_shadow);
// Haze color below cloud
vec4 additiveColorBelowCloud = ( blue_horizon * blue_weight * (sunlight + tmpAmbient)
- + (haze_horizon.r * haze_weight) * (sunlight * temp2.x + tmpAmbient)
+ + (haze_horizon * haze_weight) * (sunlight * temp2.x + tmpAmbient)
);
// Final atmosphere additive
diff --git a/indra/newview/app_settings/shaders/class2/windlight/transportF.glsl b/indra/newview/app_settings/shaders/class2/windlight/transportF.glsl
index b30313bdc8..8a8e4cb0f6 100644
--- a/indra/newview/app_settings/shaders/class2/windlight/transportF.glsl
+++ b/indra/newview/app_settings/shaders/class2/windlight/transportF.glsl
@@ -2,9 +2,27 @@
* @file transportF.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+
//////////////////////////////////////////////////////////
// The fragment shader for the terrain atmospherics
//////////////////////////////////////////////////////////
diff --git a/indra/newview/app_settings/shaders/class3/avatar/avatarV.glsl b/indra/newview/app_settings/shaders/class3/avatar/avatarV.glsl
index c85ba0c734..721054b5ad 100644
--- a/indra/newview/app_settings/shaders/class3/avatar/avatarV.glsl
+++ b/indra/newview/app_settings/shaders/class3/avatar/avatarV.glsl
@@ -2,39 +2,67 @@
* @file avatarV.glsl
*
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2007, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+uniform mat4 projection_matrix;
+
+ATTRIBUTE vec3 position;
+ATTRIBUTE vec3 normal;
+ATTRIBUTE vec2 texcoord0;
+ATTRIBUTE vec4 clothing;
+
+VARYING vec4 vertex_color;
+VARYING vec2 vary_texcoord0;
+
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
mat4 getSkinnedTransform();
void calcAtmospherics(vec3 inPositionEye);
-attribute vec4 clothing; //4
+uniform vec4 color;
-attribute vec4 gWindDir; //7
-attribute vec4 gSinWaveParams; //3
-attribute vec4 gGravity; //5
+uniform vec4 gWindDir;
+uniform vec4 gSinWaveParams;
+uniform vec4 gGravity;
const vec4 gMinMaxConstants = vec4(1.0, 0.166666, 0.0083143, .00018542); // #minimax-generated coefficients
const vec4 gPiConstants = vec4(0.159154943, 6.28318530, 3.141592653, 1.5707963); // # {1/2PI, 2PI, PI, PI/2}
void main()
{
- gl_TexCoord[0] = gl_MultiTexCoord0;
+ vary_texcoord0 = texcoord0;
vec4 pos;
mat4 trans = getSkinnedTransform();
vec3 norm;
- norm.x = dot(trans[0].xyz, gl_Normal);
- norm.y = dot(trans[1].xyz, gl_Normal);
- norm.z = dot(trans[2].xyz, gl_Normal);
+ norm.x = dot(trans[0].xyz, normal);
+ norm.y = dot(trans[1].xyz, normal);
+ norm.z = dot(trans[2].xyz, normal);
norm = normalize(norm);
//wind
vec4 windEffect;
windEffect = vec4(dot(norm, gWindDir.xyz));
- pos.x = dot(trans[2].xyz, gl_Vertex.xyz);
+ pos.x = dot(trans[2].xyz, position.xyz);
windEffect.xyz = pos.x * vec3(0.015, 0.015, 0.015)
+ windEffect.xyz;
windEffect.w = windEffect.w * 2.0 + 1.0; // move wind offset value to [-1, 3]
@@ -81,7 +109,7 @@ void main()
sinWave.xyz = max(sinWave.xyz, vec3(-1.0, -1.0, -1.0)); // clamp to underlying body shape
offsetPos = clothing * sinWave.x; // multiply wind effect times clothing displacement
temp2 = gWindDir*sinWave.z + vec4(norm,0); // calculate normal offset due to wind oscillation
- offsetPos = vec4(1.0,1.0,1.0,0.0)*offsetPos+gl_Vertex; // add to offset vertex position, and zero out effect from w
+ offsetPos = vec4(1.0,1.0,1.0,0.0)*offsetPos+vec4(position.xyz, 1.0); // add to offset vertex position, and zero out effect from w
norm += temp2.xyz*2.0; // add sin wave effect on normals (exaggerated)
//add "backlighting" effect
@@ -99,12 +127,8 @@ void main()
calcAtmospherics(pos.xyz);
- vec4 color = calcLighting(pos.xyz, norm, gl_Color, vec4(0.0));
- gl_FrontColor = color;
+ vec4 col = calcLighting(pos.xyz, norm, color, vec4(0.0));
+ vertex_color = col;
- gl_Position = gl_ProjectionMatrix * pos;
-
-
- gl_TexCoord[2] = vec4(pos.xyz, 1.0);
-
+ gl_Position = projection_matrix * pos;
}
diff --git a/indra/newview/app_settings/shaders/class3/deferred/giDownsampleF.glsl b/indra/newview/app_settings/shaders/class3/deferred/giDownsampleF.glsl
deleted file mode 100644
index d26b244fa3..0000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/giDownsampleF.glsl
+++ /dev/null
@@ -1,86 +0,0 @@
-/**
- * @file giDownsampleF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * $/LicenseInfo$
- */
-
-uniform sampler2DRect giLightMap;
-
-uniform vec2 kern[32];
-uniform float dist_factor;
-uniform float blur_size;
-uniform vec2 delta;
-uniform int kern_length;
-uniform float kern_scale;
-uniform vec3 blur_quad;
-
-varying vec2 vary_fragcoord;
-
-uniform mat4 inv_proj;
-uniform vec2 screen_res;
-
-vec4 getPosition(vec2 pos_screen)
-{
- float depth = texture2DRect(depthMap, pos_screen.xy).a;
- vec2 sc = pos_screen.xy*2.0;
- sc /= screen_res;
- sc -= vec2(1.0,1.0);
- vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0);
- vec4 pos = inv_proj * ndc;
- pos /= pos.w;
- pos.w = 1.0;
- return pos;
-}
-
-float getDepth(vec2 pos_screen)
-{
- float z = texture2DRect(depthMap, pos_screen.xy).a;
- z = z*2.0-1.0;
- vec4 ndc = vec4(0.0, 0.0, z, 1.0);
- vec4 p = inv_proj*ndc;
- return p.z/p.w;
-}
-
-void main()
-{
- vec3 norm = texture2DRect(normalMap, vary_fragcoord.xy).xyz;
- norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm
- float depth = getDepth(vary_fragcoord.xy);
-
- vec3 ccol = texture2DRect(giLightMap, vary_fragcoord.xy).rgb;
- vec2 dlt = kern_scale * delta/(vec2(1.0,1.0)+norm.xy*norm.xy);
- dlt /= clamp(-depth*blur_quad.x, 1.0, 3.0);
- float defined_weight = kern[0].x;
- vec3 col = ccol*kern[0].x;
-
- for (int i = 0; i < kern_length; i++)
- {
- vec2 tc = vary_fragcoord.xy + kern[i].y*dlt;
- vec3 sampNorm = texture2DRect(normalMap, tc.xy).xyz;
- sampNorm = vec3((sampNorm.xy-0.5)*2.0,sampNorm.z); // unpack norm
-
- float d = dot(norm.xyz, sampNorm);
-
- if (d > 0.5)
- {
- float sampdepth = getDepth(tc.xy);
- sampdepth -= depth;
- if (sampdepth*sampdepth < blur_quad.z)
- {
- col += texture2DRect(giLightMap, tc).rgb*kern[i].x;
- defined_weight += kern[i].x;
- }
- }
- }
-
- col /= defined_weight;
-
- //col = ccol;
-
- col = col*blur_quad.y;
-
- gl_FragData[0].xyz = col;
-
- //gl_FragColor = ccol;
-}
diff --git a/indra/newview/app_settings/shaders/class3/deferred/giDownsampleV.glsl b/indra/newview/app_settings/shaders/class3/deferred/giDownsampleV.glsl
deleted file mode 100644
index e5f6217644..0000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/giDownsampleV.glsl
+++ /dev/null
@@ -1,17 +0,0 @@
-/**
- * @file postgiV.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * $/LicenseInfo$
- */
-
-varying vec2 vary_fragcoord;
-uniform vec2 screen_res;
-
-void main()
-{
- //transform vertex
- gl_Position = ftransform();
- vec4 pos = gl_ModelViewProjectionMatrix * gl_Vertex;
- vary_fragcoord = (pos.xy*0.5+0.5)*screen_res;
-}
diff --git a/indra/newview/app_settings/shaders/class3/deferred/giF.glsl b/indra/newview/app_settings/shaders/class3/deferred/giF.glsl
deleted file mode 100644
index 735150a78c..0000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/giF.glsl
+++ /dev/null
@@ -1,191 +0,0 @@
-/**
- * @file giF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * $/LicenseInfo$
- */
-
-#extension GL_ARB_texture_rectangle : enable
-
-uniform sampler2DRect depthMap;
-uniform sampler2DRect normalMap;
-uniform sampler2DRect lightMap;
-uniform sampler2DRect specularRect;
-
-uniform sampler2D noiseMap;
-
-uniform sampler2D diffuseGIMap;
-uniform sampler2D specularGIMap;
-uniform sampler2D normalGIMap;
-uniform sampler2D depthGIMap;
-
-uniform sampler2D lightFunc;
-
-// Inputs
-varying vec2 vary_fragcoord;
-
-uniform vec2 screen_res;
-
-uniform vec4 sunlight_color;
-
-uniform mat4 inv_proj;
-uniform mat4 gi_mat; //gPipeline.mGIMatrix - eye space to sun space
-uniform mat4 gi_mat_proj; //gPipeline.mGIMatrixProj - eye space to projected sun space
-uniform mat4 gi_norm_mat; //gPipeline.mGINormalMatrix - eye space normal to sun space normal matrix
-uniform mat4 gi_inv_proj; //gPipeline.mGIInvProj - projected sun space to sun space
-uniform float gi_sample_width;
-uniform float gi_noise;
-uniform float gi_attenuation;
-uniform float gi_range;
-
-vec4 getPosition(vec2 pos_screen)
-{
- float depth = texture2DRect(depthMap, pos_screen.xy).a;
- vec2 sc = pos_screen.xy*2.0;
- sc /= screen_res;
- sc -= vec2(1.0,1.0);
- vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0);
- vec4 pos = inv_proj * ndc;
- pos /= pos.w;
- pos.w = 1.0;
- return pos;
-}
-
-vec4 getGIPosition(vec2 gi_tc)
-{
- float depth = texture2D(depthGIMap, gi_tc).a;
- vec2 sc = gi_tc*2.0;
- sc -= vec2(1.0, 1.0);
- vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0);
- vec4 pos = gi_inv_proj*ndc;
- pos.xyz /= pos.w;
- pos.w = 1.0;
- return pos;
-}
-
-vec3 giAmbient(vec3 pos, vec3 norm)
-{
- vec4 gi_c = gi_mat_proj * vec4(pos, 1.0);
- gi_c.xyz /= gi_c.w;
-
- vec4 gi_pos = gi_mat*vec4(pos,1.0);
- vec3 gi_norm = (gi_norm_mat*vec4(norm,1.0)).xyz;
- gi_norm = normalize(gi_norm);
-
- vec4 c_spec = texture2DRect(specularRect, vary_fragcoord.xy);
- vec3 nz = texture2D(noiseMap, vary_fragcoord.xy/128.0).rgb;
- gi_pos.xyz += nz.x*gi_noise*gi_norm.xyz;
- vec2 tcx = gi_norm.xy;
- vec2 tcy = gi_norm.yx;
-
- vec4 eye_pos = gi_mat*vec4(0,0,0,1.0);
-
- vec3 eye_dir = normalize(gi_pos.xyz-eye_pos.xyz);
- vec3 eye_ref = reflect(eye_dir, gi_norm);
-
- float da = 0.0; //texture2DRect(lightMap, vary_fragcoord.xy).r*0.5;
- vec3 fdiff = vec3(da);
- float fda = da;
-
- vec3 rcol = vec3(0,0,0);
-
- float fsa = 0.0;
-
-
- for (int i = -1; i <= 1; i += 2 )
- {
- for (int j = -1; j <= 1; j+= 2)
- {
- vec2 tc = vec2(i, j)*0.75+gi_norm.xy*nz.z;
- tc += nz.xy*2.0;
- tc *= gi_sample_width*0.25;
- tc += gi_c.xy;
-
- vec3 lnorm = -(texture2D(normalGIMap, tc.xy).xyz*2.0-1.0);
- vec3 lpos = getGIPosition(tc.xy).xyz;
-
- vec3 at = lpos-gi_pos.xyz;
- float dist = length(at);
- float dist_atten = clamp(1.0/(gi_attenuation*dist), 0.0, 1.0);
-
-
- if (dist_atten > 0.01)
- { //possible contribution of indirect light to this surface
- vec3 ldir = at;
-
- float ld = -dot(ldir, lnorm);
-
- if (ld < 0.0)
- {
- float ang_atten = dot(ldir, gi_norm);
-
- if (ang_atten > 0.0)
- {
- vec4 spec = texture2D(specularGIMap, tc.xy);
- at = normalize(at);
- vec3 diff;
-
- float da = 0.0;
-
- //contribution from indirect source to visible pixel
- vec3 ha = at;
- ha.z -= 1.0;
- ha = normalize(ha);
- if (spec.a > 0.0)
- {
- float sa = dot(ha,lnorm);
- da = texture2D(lightFunc, vec2(sa, spec.a)).a;
- }
- else
- {
- da = -lnorm.z;
- }
-
- diff = texture2D(diffuseGIMap, tc.xy).rgb+spec.rgb*spec.a*2.0;
-
- if (da > 0.0)
- { //contribution from visible pixel to eye
- vec3 ha = normalize(at-eye_dir);
- if (c_spec.a > 0.0)
- {
- float sa = dot(ha, gi_norm);
- da = dist_atten*texture2D(lightFunc, vec2(sa, c_spec.a)).a;
- }
- else
- {
- da = dist_atten*dot(gi_norm, normalize(ldir));
- }
- fda += da;
- fdiff += da*(c_spec.rgb*c_spec.a*2.0+vec3(1,1,1))*diff.rgb;
- }
- }
- }
- }
- }
- }
-
- fdiff *= sunlight_color.rgb;
-
- vec3 ret = fda*fdiff;
-
- return clamp(ret,vec3(0.0), vec3(1.0));
-}
-
-void main()
-{
- vec2 pos_screen = vary_fragcoord.xy;
- vec4 pos = getPosition(pos_screen);
-
- float rad = gi_range*0.5;
-
- vec3 norm = texture2DRect(normalMap, pos_screen).xyz;
- norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm
- float dist = max(length(pos.xyz)-rad, 0.0);
-
- float da = clamp(1.0-dist/rad, 0.0, 1.0);
-
- vec3 ambient = da > 0.0 ? giAmbient(pos.xyz, norm) : vec3(0);
-
-
- gl_FragData[0].xyz = mix(vec3(0), ambient, da);
-}
diff --git a/indra/newview/app_settings/shaders/class3/deferred/giFinalF.glsl b/indra/newview/app_settings/shaders/class3/deferred/giFinalF.glsl
deleted file mode 100644
index e0f4a3e4f5..0000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/giFinalF.glsl
+++ /dev/null
@@ -1,25 +0,0 @@
-/**
- * @file giFinalF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * $/LicenseInfo$
- */
-
-#extension GL_ARB_texture_rectangle : enable
-
-uniform sampler2DRect diffuseRect;
-uniform sampler2D bloomMap;
-uniform sampler2DRect edgeMap;
-
-uniform vec2 screen_res;
-varying vec2 vary_fragcoord;
-
-
-void main()
-{
- vec4 bloom = texture2D(bloomMap, vary_fragcoord.xy/screen_res);
- vec4 diff = texture2DRect(diffuseRect, vary_fragcoord.xy);
-
- gl_FragColor = bloom + diff;
- //gl_FragColor.rgb = vec3(texture2DRect(edgeMap, vary_fragcoord.xy).a);
-} \ No newline at end of file
diff --git a/indra/newview/app_settings/shaders/class3/deferred/giFinalV.glsl b/indra/newview/app_settings/shaders/class3/deferred/giFinalV.glsl
deleted file mode 100644
index fbf2c17370..0000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/giFinalV.glsl
+++ /dev/null
@@ -1,17 +0,0 @@
-/**
- * @file giFinalV.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * $/LicenseInfo$
- */
-
-varying vec2 vary_fragcoord;
-uniform vec2 screen_res;
-
-void main()
-{
- //transform vertex
- gl_Position = ftransform();
- vec4 pos = gl_ModelViewProjectionMatrix * gl_Vertex;
- vary_fragcoord = (pos.xy*0.5+0.5)*screen_res;
-}
diff --git a/indra/newview/app_settings/shaders/class3/deferred/giV.glsl b/indra/newview/app_settings/shaders/class3/deferred/giV.glsl
deleted file mode 100644
index 543527612e..0000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/giV.glsl
+++ /dev/null
@@ -1,22 +0,0 @@
-/**
- * @file giV.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * $/LicenseInfo$
- */
-
-varying vec2 vary_fragcoord;
-
-uniform vec2 screen_res;
-
-void main()
-{
- //transform vertex
- gl_Position = ftransform();
- vec4 pos = gl_ModelViewProjectionMatrix * gl_Vertex;
- vary_fragcoord = (pos.xy * 0.5 + 0.5)*screen_res;
- vec4 tex = gl_MultiTexCoord0;
- tex.w = 1.0;
-
- gl_FrontColor = gl_Color;
-}
diff --git a/indra/newview/app_settings/shaders/class3/deferred/luminanceF.glsl b/indra/newview/app_settings/shaders/class3/deferred/luminanceF.glsl
deleted file mode 100644
index d9483bc6e4..0000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/luminanceF.glsl
+++ /dev/null
@@ -1,19 +0,0 @@
-/**
- * @file luminanceF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * $/LicenseInfo$
- */
-
-#extension GL_ARB_texture_rectangle : enable
-
-uniform sampler2DRect lightMap;
-uniform sampler2DRect diffuseRect;
-
-varying vec2 vary_fragcoord;
-void main()
-{
- float i = texture2DRect(lightMap, vary_fragcoord.xy).r;
- gl_FragColor.rgb = vec3(i);
- gl_FragColor.a = 1.0;
-}
diff --git a/indra/newview/app_settings/shaders/class3/deferred/luminanceV.glsl b/indra/newview/app_settings/shaders/class3/deferred/luminanceV.glsl
deleted file mode 100644
index 6368def830..0000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/luminanceV.glsl
+++ /dev/null
@@ -1,20 +0,0 @@
-/**
- * @file giV.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * $/LicenseInfo$
- */
-
-varying vec2 vary_fragcoord;
-
-uniform vec2 screen_res;
-
-void main()
-{
- //transform vertex
- gl_Position = ftransform();
- vec4 pos = gl_ModelViewProjectionMatrix * gl_Vertex;
- vary_fragcoord = (pos.xy * 0.5 + 0.5)*screen_res;
-
- gl_FrontColor = gl_Color;
-}
diff --git a/indra/newview/app_settings/shaders/class3/deferred/postDeferredF.glsl b/indra/newview/app_settings/shaders/class3/deferred/postDeferredF.glsl
deleted file mode 100644
index 51ab579e3c..0000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/postDeferredF.glsl
+++ /dev/null
@@ -1,80 +0,0 @@
-/**
- * @file postDeferredF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * $/LicenseInfo$
- */
-
-#extension GL_ARB_texture_rectangle : enable
-
-uniform sampler2DRect diffuseRect;
-uniform sampler2DRect specularRect;
-
-uniform sampler2DRect localLightMap;
-uniform sampler2DRect sunLightMap;
-uniform sampler2DRect giLightMap;
-uniform sampler2DRect edgeMap;
-
-uniform sampler2D luminanceMap;
-
-uniform sampler2DRect lightMap;
-
-uniform sampler2D lightFunc;
-uniform sampler2D noiseMap;
-
-uniform float sun_lum_scale;
-uniform float sun_lum_offset;
-uniform float lum_scale;
-uniform float lum_lod;
-uniform vec4 ambient;
-uniform float gi_brightness;
-uniform float gi_luminance;
-
-uniform vec4 sunlight_color;
-
-uniform vec2 screen_res;
-varying vec2 vary_fragcoord;
-
-void main()
-{
- vec2 tc = vary_fragcoord.xy;
- vec4 lcol = texture2DLod(luminanceMap, vec2(0.5, 0.5), lum_lod);
-
- vec3 gi_col = texture2DRect(giLightMap, vary_fragcoord.xy).rgb;
- vec4 sun_col = texture2DRect(sunLightMap, vary_fragcoord.xy);
- vec3 local_col = texture2DRect(localLightMap, vary_fragcoord.xy).rgb;
-
- float scol = texture2DRect(lightMap, vary_fragcoord.xy).r;
-
- vec3 diff = texture2DRect(diffuseRect, vary_fragcoord.xy).rgb;
- vec4 spec = texture2DRect(specularRect, vary_fragcoord.xy);
-
- gi_col = gi_col*(diff.rgb+spec.rgb*spec.a);
-
- float lum = 1.0-clamp(pow(lcol.r, gi_brightness)+sun_lum_offset, 0.0, 1.0);
-
- lum *= sun_lum_scale;
-
- sun_col *= 1.0+(lum*lum_scale*scol);
-
- vec4 col;
- col.rgb = gi_col+sun_col.rgb+local_col;
-
- col.a = sun_col.a;
-
- vec3 bcol = vec3(0,0,0);
- float tweight = 0.0;
- for (int i = 0; i < 16; i++)
- {
- float weight = (float(i)+1.0)/2.0;
- bcol += texture2DLod(luminanceMap, vary_fragcoord.xy/screen_res, weight).rgb*weight*weight*weight;
- tweight += weight*weight;
- }
-
- bcol /= tweight;
- bcol *= gi_luminance;
- col.rgb += bcol*lum;
-
- gl_FragColor = col;
- //gl_FragColor.rgb = texture2DRect(giLightMap, vary_fragcoord.xy).rgb;
-}
diff --git a/indra/newview/app_settings/shaders/class3/deferred/postDeferredV.glsl b/indra/newview/app_settings/shaders/class3/deferred/postDeferredV.glsl
deleted file mode 100644
index 0ec81dcb02..0000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/postDeferredV.glsl
+++ /dev/null
@@ -1,17 +0,0 @@
-/**
- * @file postDeferredV.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * $/LicenseInfo$
- */
-
-varying vec2 vary_fragcoord;
-uniform vec2 screen_res;
-
-void main()
-{
- //transform vertex
- gl_Position = ftransform();
- vec4 pos = gl_ModelViewProjectionMatrix * gl_Vertex;
- vary_fragcoord = (pos.xy*0.5+0.5)*screen_res;
-}
diff --git a/indra/newview/app_settings/shaders/class3/deferred/postgiF.glsl b/indra/newview/app_settings/shaders/class3/deferred/postgiF.glsl
deleted file mode 100644
index 24fa07f251..0000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/postgiF.glsl
+++ /dev/null
@@ -1,69 +0,0 @@
-/**
- * @file postgiF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * $/LicenseInfo$
- */
-
-#extension GL_ARB_texture_rectangle : enable
-
-uniform sampler2DRect depthMap;
-uniform sampler2DRect normalMap;
-uniform sampler2DRect giLightMap;
-uniform sampler2D noiseMap;
-uniform sampler2D giMip;
-uniform sampler2DRect edgeMap;
-
-
-uniform vec2 delta;
-uniform float kern_scale;
-uniform float gi_edge_weight;
-uniform float gi_blur_brightness;
-
-varying vec2 vary_fragcoord;
-
-void main()
-{
- vec2 dlt = kern_scale*delta;
- float defined_weight = 0.0;
- vec3 col = vec3(0.0);
-
- float e = 1.0;
-
- for (int i = 1; i < 8; i++)
- {
- vec2 tc = vary_fragcoord.xy + float(i) * dlt;
-
- e = max(e, 0.0);
- float wght = e;
-
- col += texture2DRect(giLightMap, tc).rgb*wght;
- defined_weight += wght;
-
- e *= e;
- e -=(texture2DRect(edgeMap, tc.xy-dlt*0.25).a+
- texture2DRect(edgeMap, tc.xy+dlt*0.25).a)*gi_edge_weight;
- }
-
- e = 1.0;
-
- for (int i = 1; i < 8; i++)
- {
- vec2 tc = vary_fragcoord.xy - float(i) * dlt;
-
- e = max(e,0.0);
- float wght = e;
-
- col += texture2DRect(giLightMap, tc).rgb*wght;
- defined_weight += wght;
-
- e *= e;
- e -= (texture2DRect(edgeMap, tc.xy-dlt*0.25).a+
- texture2DRect(edgeMap, tc.xy+dlt*0.25).a)*gi_edge_weight;
-
- }
-
- col /= max(defined_weight, 0.01);
-
- gl_FragColor.rgb = col * gi_blur_brightness;
-}
diff --git a/indra/newview/app_settings/shaders/class3/deferred/postgiV.glsl b/indra/newview/app_settings/shaders/class3/deferred/postgiV.glsl
deleted file mode 100644
index e5f6217644..0000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/postgiV.glsl
+++ /dev/null
@@ -1,17 +0,0 @@
-/**
- * @file postgiV.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * $/LicenseInfo$
- */
-
-varying vec2 vary_fragcoord;
-uniform vec2 screen_res;
-
-void main()
-{
- //transform vertex
- gl_Position = ftransform();
- vec4 pos = gl_ModelViewProjectionMatrix * gl_Vertex;
- vary_fragcoord = (pos.xy*0.5+0.5)*screen_res;
-}
diff --git a/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl
deleted file mode 100644
index a2db247331..0000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl
+++ /dev/null
@@ -1,356 +0,0 @@
-/**
- * @file softenLightF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * $/LicenseInfo$
- */
-
-#extension GL_ARB_texture_rectangle : enable
-
-uniform sampler2DRect diffuseRect;
-uniform sampler2DRect specularRect;
-uniform sampler2DRect normalMap;
-uniform sampler2DRect lightMap;
-uniform sampler2D noiseMap;
-uniform samplerCube environmentMap;
-uniform sampler2D lightFunc;
-uniform vec3 gi_quad;
-
-uniform float blur_size;
-uniform float blur_fidelity;
-
-// Inputs
-uniform vec4 morphFactor;
-uniform vec3 camPosLocal;
-//uniform vec4 camPosWorld;
-uniform vec4 gamma;
-uniform vec4 lightnorm;
-uniform vec4 sunlight_color;
-uniform vec4 ambient;
-uniform vec4 blue_horizon;
-uniform vec4 blue_density;
-uniform vec4 haze_horizon;
-uniform vec4 haze_density;
-uniform vec4 cloud_shadow;
-uniform vec4 density_multiplier;
-uniform vec4 distance_multiplier;
-uniform vec4 max_y;
-uniform vec4 glow;
-uniform float scene_light_strength;
-uniform vec3 env_mat[3];
-uniform vec4 shadow_clip;
-uniform mat3 ssao_effect_mat;
-
-uniform sampler2DRect depthMap;
-uniform mat4 inv_proj;
-uniform vec2 screen_res;
-
-varying vec4 vary_light;
-varying vec2 vary_fragcoord;
-
-vec3 vary_PositionEye;
-
-vec3 vary_SunlitColor;
-vec3 vary_AmblitColor;
-vec3 vary_AdditiveColor;
-vec3 vary_AtmosAttenuation;
-uniform float gi_ambiance;
-
-vec4 getPosition_d(vec2 pos_screen, float depth)
-{
- vec2 sc = pos_screen.xy*2.0;
- sc /= screen_res;
- sc -= vec2(1.0,1.0);
- vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0);
- vec4 pos = inv_proj * ndc;
- pos /= pos.w;
- pos.w = 1.0;
- return pos;
-}
-
-vec4 getPosition(vec2 pos_screen)
-{ //get position in screen space (world units) given window coordinate and depth map
- float depth = texture2DRect(depthMap, pos_screen.xy).a;
- return getPosition_d(pos_screen, depth);
-}
-
-vec3 getPositionEye()
-{
- return vary_PositionEye;
-}
-vec3 getSunlitColor()
-{
- return vary_SunlitColor;
-}
-vec3 getAmblitColor()
-{
- return vary_AmblitColor;
-}
-vec3 getAdditiveColor()
-{
- return vary_AdditiveColor;
-}
-vec3 getAtmosAttenuation()
-{
- return vary_AtmosAttenuation;
-}
-
-
-void setPositionEye(vec3 v)
-{
- vary_PositionEye = v;
-}
-
-void setSunlitColor(vec3 v)
-{
- vary_SunlitColor = v;
-}
-
-void setAmblitColor(vec3 v)
-{
- vary_AmblitColor = v;
-}
-
-void setAdditiveColor(vec3 v)
-{
- vary_AdditiveColor = v;
-}
-
-void setAtmosAttenuation(vec3 v)
-{
- vary_AtmosAttenuation = v;
-}
-
-void calcAtmospherics(vec3 inPositionEye, float ambFactor) {
-
- vec3 P = inPositionEye;
- setPositionEye(P);
-
- //(TERRAIN) limit altitude
- if (P.y > max_y.x) P *= (max_y.x / P.y);
- if (P.y < -max_y.x) P *= (-max_y.x / P.y);
-
- vec3 tmpLightnorm = lightnorm.xyz;
-
- vec3 Pn = normalize(P);
- float Plen = length(P);
-
- vec4 temp1 = vec4(0);
- vec3 temp2 = vec3(0);
- vec4 blue_weight;
- vec4 haze_weight;
- vec4 sunlight = sunlight_color;
- vec4 light_atten;
-
- //sunlight attenuation effect (hue and brightness) due to atmosphere
- //this is used later for sunlight modulation at various altitudes
- light_atten = (blue_density * 1.0 + vec4(haze_density.r) * 0.25) * (density_multiplier.x * max_y.x);
- //I had thought blue_density and haze_density should have equal weighting,
- //but attenuation due to haze_density tends to seem too strong
-
- temp1 = blue_density + vec4(haze_density.r);
- blue_weight = blue_density / temp1;
- haze_weight = vec4(haze_density.r) / temp1;
-
- //(TERRAIN) compute sunlight from lightnorm only (for short rays like terrain)
- temp2.y = max(0.0, tmpLightnorm.y);
- temp2.y = 1. / temp2.y;
- sunlight *= exp( - light_atten * temp2.y);
-
- // main atmospheric scattering line integral
- temp2.z = Plen * density_multiplier.x;
-
- // Transparency (-> temp1)
- // ATI Bugfix -- can't store temp1*temp2.z*distance_multiplier.x in a variable because the ati
- // compiler gets confused.
- temp1 = exp(-temp1 * temp2.z * distance_multiplier.x);
-
- //final atmosphere attenuation factor
- setAtmosAttenuation(temp1.rgb);
-
- //compute haze glow
- //(can use temp2.x as temp because we haven't used it yet)
- temp2.x = dot(Pn, tmpLightnorm.xyz);
- temp2.x = 1. - temp2.x;
- //temp2.x is 0 at the sun and increases away from sun
- temp2.x = max(temp2.x, .03); //was glow.y
- //set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot)
- temp2.x *= glow.x;
- //higher glow.x gives dimmer glow (because next step is 1 / "angle")
- temp2.x = pow(temp2.x, glow.z);
- //glow.z should be negative, so we're doing a sort of (1 / "angle") function
-
- //add "minimum anti-solar illumination"
- temp2.x += .25;
-
- //increase ambient when there are more clouds
- vec4 tmpAmbient = ambient*gi_ambiance + (vec4(1.) - ambient*gi_ambiance) * cloud_shadow.x * 0.5;
-
- /* decrease value and saturation (that in HSV, not HSL) for occluded areas
- * // for HSV color/geometry used here, see http://gimp-savvy.com/BOOK/index.html?node52.html
- * // The following line of code performs the equivalent of:
- * float ambAlpha = tmpAmbient.a;
- * float ambValue = dot(vec3(tmpAmbient), vec3(0.577)); // projection onto <1/rt(3), 1/rt(3), 1/rt(3)>, the neutral white-black axis
- * vec3 ambHueSat = vec3(tmpAmbient) - vec3(ambValue);
- * tmpAmbient = vec4(RenderSSAOEffect.valueFactor * vec3(ambValue) + RenderSSAOEffect.saturationFactor *(1.0 - ambFactor) * ambHueSat, ambAlpha);
- */
- tmpAmbient = vec4(mix(ssao_effect_mat * tmpAmbient.rgb, tmpAmbient.rgb, ambFactor), tmpAmbient.a);
-
- //haze color
- setAdditiveColor(
- vec3(blue_horizon * blue_weight * (sunlight*(1.-cloud_shadow.x) + tmpAmbient)
- + (haze_horizon.r * haze_weight) * (sunlight*(1.-cloud_shadow.x) * temp2.x
- + tmpAmbient)));
-
- //brightness of surface both sunlight and ambient
- setSunlitColor(vec3(sunlight * .5));
- setAmblitColor(vec3(tmpAmbient * .25));
- setAdditiveColor(getAdditiveColor() * vec3(1.0 - temp1));
-}
-
-vec3 atmosLighting(vec3 light)
-{
- light *= getAtmosAttenuation().r;
- light += getAdditiveColor();
- return (2.0 * light);
-}
-
-vec3 atmosTransport(vec3 light) {
- light *= getAtmosAttenuation().r;
- light += getAdditiveColor() * 2.0;
- return light;
-}
-vec3 atmosGetDiffuseSunlightColor()
-{
- return getSunlitColor();
-}
-
-vec3 scaleDownLight(vec3 light)
-{
- return (light / scene_light_strength );
-}
-
-vec3 scaleUpLight(vec3 light)
-{
- return (light * scene_light_strength);
-}
-
-vec3 atmosAmbient(vec3 light)
-{
- return getAmblitColor() + light / 2.0;
-}
-
-vec3 atmosAffectDirectionalLight(float lightIntensity)
-{
- return getSunlitColor() * lightIntensity;
-}
-
-vec3 scaleSoftClip(vec3 light)
-{
- //soft clip effect:
- light = 1. - clamp(light, vec3(0.), vec3(1.));
- light = 1. - pow(light, gamma.xxx);
-
- return light;
-}
-
-void main()
-{
- vec2 tc = vary_fragcoord.xy;
- float depth = texture2DRect(depthMap, tc.xy).a;
- vec3 pos = getPosition_d(tc, depth).xyz;
- vec3 norm = texture2DRect(normalMap, tc).xyz;
- norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm
- //vec3 nz = texture2D(noiseMap, vary_fragcoord.xy/128.0).xyz;
-
- float da = max(dot(norm.xyz, vary_light.xyz), 0.0);
-
- vec4 diffuse = texture2DRect(diffuseRect, tc);
- vec4 spec = texture2DRect(specularRect, vary_fragcoord.xy);
-
- da = texture2D(lightFunc, vec2(da, 0.0)).a;
-
- vec2 scol_ambocc = texture2DRect(lightMap, vary_fragcoord.xy).rg;
- float scol = max(scol_ambocc.r, diffuse.a);
- float ambocc = scol_ambocc.g;
-
- calcAtmospherics(pos.xyz, ambocc);
-
- vec3 col = atmosAmbient(vec3(0));
- col += atmosAffectDirectionalLight(max(min(da, scol), diffuse.a));
-
- col *= diffuse.rgb;
-
- if (spec.a > 0.0) // specular reflection
- {
- // the old infinite-sky shiny reflection
- //
- vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz));
- float sa = dot(refnormpersp, vary_light.xyz);
- vec3 dumbshiny = vary_SunlitColor*scol*texture2D(lightFunc, vec2(sa, spec.a)).a;
-
- /*
- // screen-space cheap fakey reflection map
- //
- vec3 refnorm = normalize(reflect(vec3(0,0,-1), norm.xyz));
- depth -= 0.5; // unbias depth
- // first figure out where we'll make our 2D guess from
- vec2 ref2d = (0.25 * screen_res.y) * (refnorm.xy) * abs(refnorm.z) / depth;
- // Offset the guess source a little according to a trivial
- // checkerboard dither function and spec.a.
- // This is meant to be similar to sampling a blurred version
- // of the diffuse map. LOD would be better in that regard.
- // The goal of the blur is to soften reflections in surfaces
- // with low shinyness, and also to disguise our lameness.
- float checkerboard = floor(mod(tc.x+tc.y, 2.0)); // 0.0, 1.0
- float checkoffset = (3.0 + (7.0*(1.0-spec.a)))*(checkerboard-0.5);
-
- ref2d += vec2(checkoffset, checkoffset);
- ref2d += tc.xy; // use as offset from destination
- // Get attributes from the 2D guess point.
- // We average two samples of diffuse (not of anything else) per
- // pixel to try to reduce aliasing some more.
- vec3 refcol = 0.5 * (texture2DRect(diffuseRect, ref2d + vec2(0.0, -checkoffset)).rgb +
- texture2DRect(diffuseRect, ref2d + vec2(-checkoffset, 0.0)).rgb);
- float refdepth = texture2DRect(depthMap, ref2d).a;
- vec3 refpos = getPosition_d(ref2d, refdepth).xyz;
- float refshad = texture2DRect(lightMap, ref2d).r;
- vec3 refn = texture2DRect(normalMap, ref2d).rgb;
- refn = vec3((refn.xy-0.5)*2.0,refn.z); // unpack norm
- refn = normalize(refn);
- // figure out how appropriate our guess actually was
- float refapprop = max(0.0, dot(-refnorm, normalize(pos - refpos)));
- // darken reflections from points which face away from the reflected ray - our guess was a back-face
- //refapprop *= step(dot(refnorm, refn), 0.0);
- refapprop = min(refapprop, max(0.0, -dot(refnorm, refn))); // more conservative variant
- // get appropriate light strength for guess-point.
- // reflect light direction to increase the illusion that
- // these are reflections.
- vec3 reflight = reflect(lightnorm.xyz, norm.xyz);
- float reflit = min(max(dot(refn, reflight.xyz), 0.0), refshad);
- // apply sun color to guess-point, dampen according to inappropriateness of guess
- float refmod = min(refapprop, reflit);
- vec3 refprod = vary_SunlitColor * refcol.rgb * refmod;
- vec3 ssshiny = (refprod * spec.a);
- ssshiny *= 0.3; // dampen it even more
- */
- vec3 ssshiny = vec3(0,0,0);
-
- // add the two types of shiny together
- col += (ssshiny + dumbshiny) * spec.rgb;
- }
-
- col = atmosLighting(col);
- col = scaleSoftClip(col);
-
- gl_FragColor.rgb = col;
-
- //gl_FragColor.rgb = gi_col.rgb;
- gl_FragColor.a = 0.0;
-
- //gl_FragColor.rg = scol_ambocc.rg;
- //gl_FragColor.rgb = texture2DRect(lightMap, vary_fragcoord.xy).rgb;
- //gl_FragColor.rgb = norm.rgb*0.5+0.5;
- //gl_FragColor.rgb = vec3(ambocc);
- //gl_FragColor.rgb = vec3(scol);
-}
diff --git a/indra/newview/app_settings/shaders/class3/deferred/softenLightV.glsl b/indra/newview/app_settings/shaders/class3/deferred/softenLightV.glsl
deleted file mode 100644
index 9d187b46e2..0000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/softenLightV.glsl
+++ /dev/null
@@ -1,24 +0,0 @@
-/**
- * @file softenLightF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * $/LicenseInfo$
- */
-
-uniform vec2 screen_res;
-
-varying vec4 vary_light;
-varying vec2 vary_fragcoord;
-void main()
-{
- //transform vertex
- gl_Position = ftransform();
-
- vec4 pos = gl_ModelViewProjectionMatrix * gl_Vertex;
- vary_fragcoord = (pos.xy*0.5+0.5)*screen_res;
-
- vec4 tex = gl_MultiTexCoord0;
- tex.w = 1.0;
-
- vary_light = gl_MultiTexCoord0;
-}
diff --git a/indra/newview/app_settings/shaders/class3/deferred/treeF.glsl b/indra/newview/app_settings/shaders/class3/deferred/treeF.glsl
deleted file mode 100644
index 1c1725a95c..0000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/treeF.glsl
+++ /dev/null
@@ -1,19 +0,0 @@
-/**
- * @file treeF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * $/LicenseInfo$
- */
-
-uniform sampler2D diffuseMap;
-
-varying vec3 vary_normal;
-
-void main()
-{
- vec4 col = texture2D(diffuseMap, gl_TexCoord[0].xy);
- gl_FragData[0] = vec4(gl_Color.rgb*col.rgb, col.a <= 0.5 ? 0.0 : 0.005);
- gl_FragData[1] = vec4(0,0,0,0);
- vec3 nvn = normalize(vary_normal);
- gl_FragData[2] = vec4(nvn.xy * 0.5 + 0.5, nvn.z, 0.0);
-}
diff --git a/indra/newview/app_settings/shaders/class3/lighting/sumLightsSpecularV.glsl b/indra/newview/app_settings/shaders/class3/lighting/sumLightsSpecularV.glsl
index 2b44aedd5a..e043ac873e 100644
--- a/indra/newview/app_settings/shaders/class3/lighting/sumLightsSpecularV.glsl
+++ b/indra/newview/app_settings/shaders/class3/lighting/sumLightsSpecularV.glsl
@@ -2,9 +2,27 @@
* @file sumLightsV.glsl
*
* $LicenseInfo:firstyear=2005&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2005, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+
float calcDirectionalLightSpecular(inout vec4 specular, vec3 view, vec3 n, vec3 l, vec3 lightCol, float da);
vec3 calcPointLightSpecular(inout vec4 specular, vec3 view, vec3 v, vec3 n, vec3 l, float r, float pw, vec3 lightCol);
@@ -13,6 +31,10 @@ vec3 atmosAffectDirectionalLight(float lightIntensity);
vec3 atmosGetDiffuseSunlightColor();
vec3 scaleDownLight(vec3 light);
+uniform vec4 light_position[8];
+uniform vec3 light_attenuation[8];
+uniform vec3 light_diffuse[8];
+
vec4 sumLightsSpecular(vec3 pos, vec3 norm, vec4 color, inout vec4 specularColor, vec4 baseCol)
{
vec4 col = vec4(0.0, 0.0, 0.0, color.a);
@@ -23,18 +45,18 @@ vec4 sumLightsSpecular(vec3 pos, vec3 norm, vec4 color, inout vec4 specularColor
vec4 specularSum = vec4(0.0);
// Collect normal lights (need to be divided by two, as we later multiply by 2)
- col.rgb += gl_LightSource[1].diffuse.rgb * calcDirectionalLightSpecular(specularColor, view, norm, gl_LightSource[1].position.xyz,gl_LightSource[1].diffuse.rgb, 1.0);
- col.rgb += calcPointLightSpecular(specularSum, view, pos, norm, gl_LightSource[2].position.xyz, gl_LightSource[2].linearAttenuation, gl_LightSource[2].quadraticAttenuation,gl_LightSource[2].diffuse.rgb);
- col.rgb += calcPointLightSpecular(specularSum, view, pos, norm, gl_LightSource[3].position.xyz, gl_LightSource[3].linearAttenuation, gl_LightSource[3].quadraticAttenuation,gl_LightSource[3].diffuse.rgb);
- col.rgb += calcPointLightSpecular(specularSum, view, pos, norm, gl_LightSource[4].position.xyz, gl_LightSource[4].linearAttenuation, gl_LightSource[4].quadraticAttenuation,gl_LightSource[4].diffuse.rgb);
- col.rgb += calcPointLightSpecular(specularSum, view, pos, norm, gl_LightSource[5].position.xyz, gl_LightSource[5].linearAttenuation, gl_LightSource[5].quadraticAttenuation,gl_LightSource[5].diffuse.rgb);
- col.rgb += calcPointLightSpecular(specularSum, view, pos, norm, gl_LightSource[6].position.xyz, gl_LightSource[6].linearAttenuation, gl_LightSource[6].quadraticAttenuation,gl_LightSource[6].diffuse.rgb);
- col.rgb += calcPointLightSpecular(specularSum, view, pos, norm, gl_LightSource[7].position.xyz, gl_LightSource[7].linearAttenuation, gl_LightSource[7].quadraticAttenuation,gl_LightSource[7].diffuse.rgb);
+ col.rgb += light_diffuse[1].rgb * calcDirectionalLightSpecular(specularColor, view, norm, light_position[1].xyz,light_diffuse[1].rgb, 1.0);
+ col.rgb += calcPointLightSpecular(specularSum, view, pos, norm, light_position[2].xyz, light_attenuation[2].x, light_attenuation[2].y, light_diffuse[2].rgb);
+ col.rgb += calcPointLightSpecular(specularSum, view, pos, norm, light_position[3].xyz, light_attenuation[3].x, light_attenuation[3].y, light_diffuse[3].rgb);
+ col.rgb += calcPointLightSpecular(specularSum, view, pos, norm, light_position[4].xyz, light_attenuation[4].x, light_attenuation[4].y, light_diffuse[4].rgb);
+ col.rgb += calcPointLightSpecular(specularSum, view, pos, norm, light_position[5].xyz, light_attenuation[5].x, light_attenuation[5].y, light_diffuse[5].rgb);
+ col.rgb += calcPointLightSpecular(specularSum, view, pos, norm, light_position[6].xyz, light_attenuation[6].x, light_attenuation[6].y, light_diffuse[6].rgb);
+ col.rgb += calcPointLightSpecular(specularSum, view, pos, norm, light_position[7].xyz, light_attenuation[7].x, light_attenuation[7].y, light_diffuse[7].rgb);
col.rgb = scaleDownLight(col.rgb);
// Add windlight lights
col.rgb += atmosAmbient(baseCol.rgb);
- col.rgb += atmosAffectDirectionalLight(calcDirectionalLightSpecular(specularSum, view, norm, gl_LightSource[0].position.xyz,atmosGetDiffuseSunlightColor()*baseCol.a, 1.0));
+ col.rgb += atmosAffectDirectionalLight(calcDirectionalLightSpecular(specularSum, view, norm, light_position[0].xyz,atmosGetDiffuseSunlightColor()*baseCol.a, 1.0));
col.rgb = min(col.rgb*color.rgb, 1.0);
specularColor.rgb = min(specularColor.rgb*specularSum.rgb, 1.0);
diff --git a/indra/newview/app_settings/shaders/class3/lighting/sumLightsV.glsl b/indra/newview/app_settings/shaders/class3/lighting/sumLightsV.glsl
index 329b0c4305..dadff40933 100644
--- a/indra/newview/app_settings/shaders/class3/lighting/sumLightsV.glsl
+++ b/indra/newview/app_settings/shaders/class3/lighting/sumLightsV.glsl
@@ -2,8 +2,27 @@
* @file sumLightsV.glsl
*
* $LicenseInfo:firstyear=2005&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2005, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
+
float calcDirectionalLight(vec3 n, vec3 l);
float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float is_pointlight);
@@ -13,22 +32,29 @@ vec3 atmosAffectDirectionalLight(float lightIntensity);
vec3 scaleDownLight(vec3 light);
vec3 scaleUpLight(vec3 light);
+uniform vec4 light_position[8];
+uniform vec3 light_direction[8];
+uniform vec3 light_attenuation[8];
+uniform vec3 light_diffuse[8];
+
vec4 sumLights(vec3 pos, vec3 norm, vec4 color, vec4 baseLight)
{
vec4 col = vec4(0.0, 0.0, 0.0, color.a);
// Collect normal lights (need to be divided by two, as we later multiply by 2)
- col.rgb += gl_LightSource[2].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[2].position, gl_LightSource[2].spotDirection.xyz, gl_LightSource[2].linearAttenuation, gl_LightSource[2].specular.a);
- col.rgb += gl_LightSource[3].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[3].position, gl_LightSource[3].spotDirection.xyz, gl_LightSource[3].linearAttenuation, gl_LightSource[3].specular.a);
- col.rgb += gl_LightSource[4].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[4].position, gl_LightSource[4].spotDirection.xyz, gl_LightSource[4].linearAttenuation, gl_LightSource[4].specular.a);
- col.rgb += gl_LightSource[5].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[5].position, gl_LightSource[5].spotDirection.xyz, gl_LightSource[5].linearAttenuation, gl_LightSource[5].specular.a);
- col.rgb += gl_LightSource[6].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[6].position, gl_LightSource[6].spotDirection.xyz, gl_LightSource[6].linearAttenuation, gl_LightSource[6].specular.a);
- col.rgb += gl_LightSource[7].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[7].position, gl_LightSource[7].spotDirection.xyz, gl_LightSource[7].linearAttenuation, gl_LightSource[7].specular.a);
- col.rgb += gl_LightSource[1].diffuse.rgb*calcDirectionalLight(norm, gl_LightSource[1].position.xyz);
+
+ // Collect normal lights
+ col.rgb += light_diffuse[2].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[2], light_direction[2], light_attenuation[2].x, light_attenuation[2].z);
+ col.rgb += light_diffuse[3].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[3], light_direction[3], light_attenuation[3].x, light_attenuation[3].z);
+ col.rgb += light_diffuse[4].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[4], light_direction[4], light_attenuation[4].x, light_attenuation[4].z);
+ col.rgb += light_diffuse[5].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[5], light_direction[5], light_attenuation[5].x, light_attenuation[5].z);
+ col.rgb += light_diffuse[6].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[6], light_direction[6], light_attenuation[6].x, light_attenuation[6].z);
+ col.rgb += light_diffuse[7].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[7], light_direction[7], light_attenuation[7].x, light_attenuation[7].z);
+ col.rgb += light_diffuse[1].rgb*calcDirectionalLight(norm, light_position[1].xyz);
col.rgb = scaleDownLight(col.rgb);
// Add windlight lights
- col.rgb += atmosAffectDirectionalLight(calcDirectionalLight(norm, gl_LightSource[0].position.xyz));
+ col.rgb += atmosAffectDirectionalLight(calcDirectionalLight(norm, light_position[0].xyz));
col.rgb += atmosAmbient(baseLight.rgb);
col.rgb = min(col.rgb*color.rgb, 1.0);
diff --git a/indra/newview/app_settings/shaders/shader_heirarchy.txt b/indra/newview/app_settings/shaders/shader_hierarchy.txt
index d8bbf69b38..d8bbf69b38 100644
--- a/indra/newview/app_settings/shaders/shader_heirarchy.txt
+++ b/indra/newview/app_settings/shaders/shader_hierarchy.txt
diff --git a/indra/newview/app_settings/toolbars.xml b/indra/newview/app_settings/toolbars.xml
new file mode 100644
index 0000000000..29c019719d
--- /dev/null
+++ b/indra/newview/app_settings/toolbars.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<toolbars>
+ <bottom_toolbar
+ button_display_mode="icons_with_text">
+ <command name="chat"/>
+ <command name="speak"/>
+ <command name="destinations"/>
+ <command name="people"/>
+ <command name="profile"/>
+ <command name="move"/>
+ <command name="view"/>
+ <command name="howto"/>
+ </bottom_toolbar>
+ <left_toolbar
+ button_display_mode="icons_only">
+ <command name="avatar"/>
+ <command name="appearance"/>
+ <command name="inventory"/>
+ <command name="search"/>
+ <command name="places"/>
+ <command name="voice"/>
+ <command name="minimap"/>
+ <command name="snapshot"/>
+ </left_toolbar>
+</toolbars>
diff --git a/indra/newview/app_settings/ultra_graphics.xml b/indra/newview/app_settings/ultra_graphics.xml
index e7dce3b989..71459e5470 100644
--- a/indra/newview/app_settings/ultra_graphics.xml
+++ b/indra/newview/app_settings/ultra_graphics.xml
@@ -4,13 +4,15 @@
<RenderAvatarCloth value="TRUE"/>
<!--Default for now-->
<RenderAvatarLODFactor value="1.0"/>
+ <!--Default for now-->
+ <RenderAvatarPhysicsLODFactor value="1.0"/>
<!--NO SHADERS-->
<RenderAvatarVP value="TRUE"/>
<!--Short Range-->
<RenderFarClip value="256"/>
<!--Default for now-->
<RenderFlexTimeFactor value="1"/>
- <!--256... but they don't use this-->
+ <!--256... but they do not use this-->
<RenderGlowResolutionPow value="9"/>
<!--Low number-->
<RenderMaxPartCount value="4096"/>
@@ -24,8 +26,6 @@
<RenderTerrainLODFactor value="2.0"/>
<!--Default for now-->
<RenderTreeLODFactor value="1.0"/>
- <!--Default for now-->
- <RenderUseFBO value="1"/>
<!--Try Impostors-->
<RenderUseImpostors value="TRUE"/>
<!--Default for now-->
@@ -34,11 +34,10 @@
<VertexShaderEnable value="TRUE"/>
<!--NO SHADERS-->
<WindLightUseAtmosShaders value="TRUE"/>
- <!--Deferred Shading-->
- <RenderDeferred value="TRUE"/>
- <!--SSAO Enabled-->
- <RenderDeferredSSAO value="TRUE"/>
- <!--Full Shadows-->
- <RenderShadowDetail value="2"/>
-
+ <!--Deferred Shading-->
+ <RenderDeferred value="TRUE"/>
+ <!--SSAO Enabled-->
+ <RenderDeferredSSAO value="TRUE"/>
+ <!--Full Shadows-->
+ <RenderShadowDetail value="2"/>
</settings>
diff --git a/indra/newview/app_settings/windlight/days/Colder%20Tones.xml b/indra/newview/app_settings/windlight/days/Colder%20Tones.xml
new file mode 100644
index 0000000000..63d0b099e1
--- /dev/null
+++ b/indra/newview/app_settings/windlight/days/Colder%20Tones.xml
@@ -0,0 +1,28 @@
+<llsd>
+ <array>
+ <array>
+ <real>0</real>
+ <string>Midnight</string>
+ </array>
+ <array>
+ <real>0.24999989569187164</real>
+ <string>Purple</string>
+ </array>
+ <array>
+ <real>0.49999979138374329</real>
+ <string>Blue Midday</string>
+ </array>
+ <array>
+ <real>0.74999970197677612</real>
+ <string>Blizzard</string>
+ </array>
+ <array>
+ <real>0.87499958276748657</real>
+ <string>Ghost</string>
+ </array>
+ <array>
+ <real>0.99999958276748657</real>
+ <string>Midnight</string>
+ </array>
+ </array>
+</llsd>
diff --git a/indra/newview/app_settings/windlight/days/Dynamic%20Richness.xml b/indra/newview/app_settings/windlight/days/Dynamic%20Richness.xml
new file mode 100644
index 0000000000..f75b52e6ed
--- /dev/null
+++ b/indra/newview/app_settings/windlight/days/Dynamic%20Richness.xml
@@ -0,0 +1,32 @@
+<llsd>
+ <array>
+ <array>
+ <real>0</real>
+ <string>Night</string>
+ </array>
+ <array>
+ <real>0.12499994784593582</real>
+ <string>Blizzard</string>
+ </array>
+ <array>
+ <real>0.24999989569187164</real>
+ <string>Sunrise</string>
+ </array>
+ <array>
+ <real>0.49999979138374329</real>
+ <string>Midday 3</string>
+ </array>
+ <array>
+ <real>0.68749970197677612</real>
+ <string>Pirate</string>
+ </array>
+ <array>
+ <real>0.81249970197677612</real>
+ <string>Coastal Sunset</string>
+ </array>
+ <array>
+ <real>0.99999958276748657</real>
+ <string>Midnight</string>
+ </array>
+ </array>
+</llsd>
diff --git a/indra/newview/app_settings/windlight/days/Pirate%27s%20Dream.xml b/indra/newview/app_settings/windlight/days/Pirate%27s%20Dream.xml
new file mode 100644
index 0000000000..6dc1ba9f4d
--- /dev/null
+++ b/indra/newview/app_settings/windlight/days/Pirate%27s%20Dream.xml
@@ -0,0 +1,44 @@
+<llsd>
+ <array>
+ <array>
+ <real>0</real>
+ <string>A-12AM</string>
+ </array>
+ <array>
+ <real>0.12499994784593582</real>
+ <string>A-3AM</string>
+ </array>
+ <array>
+ <real>0.22222213447093964</real>
+ <string>Barcelona</string>
+ </array>
+ <array>
+ <real>0.30208322405815125</real>
+ <string>Sunrise</string>
+ </array>
+ <array>
+ <real>0.37499985098838806</real>
+ <string>Sailor&apos;s Delight</string>
+ </array>
+ <array>
+ <real>0.53819423913955688</real>
+ <string>Coastal Afternoon</string>
+ </array>
+ <array>
+ <real>0.63194417953491211</real>
+ <string>Pirate</string>
+ </array>
+ <array>
+ <real>0.7048608660697937</real>
+ <string>Desert Sunset</string>
+ </array>
+ <array>
+ <real>0.74999970197677612</real>
+ <string>Coastal Sunset</string>
+ </array>
+ <array>
+ <real>0.87499958276748657</real>
+ <string>Blizzard</string>
+ </array>
+ </array>
+</llsd>
diff --git a/indra/newview/app_settings/windlight/days/Psycho%20Strobe%21.xml b/indra/newview/app_settings/windlight/days/Psycho%20Strobe%21.xml
new file mode 100644
index 0000000000..302af5a9ba
--- /dev/null
+++ b/indra/newview/app_settings/windlight/days/Psycho%20Strobe%21.xml
@@ -0,0 +1,72 @@
+<llsd>
+ <array>
+ <array>
+ <real>0</real>
+ <string>Sheer Surreality</string>
+ </array>
+ <array>
+ <real>0.062499973922967911</real>
+ <string>A-12AM</string>
+ </array>
+ <array>
+ <real>0.12499994784593582</real>
+ <string>Sheer Surreality</string>
+ </array>
+ <array>
+ <real>0.18749992549419403</real>
+ <string>A-3AM</string>
+ </array>
+ <array>
+ <real>0.24999989569187164</real>
+ <string>Sheer Surreality</string>
+ </array>
+ <array>
+ <real>0.31249985098838806</real>
+ <string>A-6AM</string>
+ </array>
+ <array>
+ <real>0.37499985098838806</real>
+ <string>Sheer Surreality</string>
+ </array>
+ <array>
+ <real>0.43749979138374329</real>
+ <string>A-9AM</string>
+ </array>
+ <array>
+ <real>0.49999979138374329</real>
+ <string>Sheer Surreality</string>
+ </array>
+ <array>
+ <real>0.5624997615814209</real>
+ <string>A-12PM</string>
+ </array>
+ <array>
+ <real>0.62499970197677612</real>
+ <string>Sheer Surreality</string>
+ </array>
+ <array>
+ <real>0.68749970197677612</real>
+ <string>A-3PM</string>
+ </array>
+ <array>
+ <real>0.74999970197677612</real>
+ <string>Sheer Surreality</string>
+ </array>
+ <array>
+ <real>0.81249970197677612</real>
+ <string>A-6PM</string>
+ </array>
+ <array>
+ <real>0.87499958276748657</real>
+ <string>Sheer Surreality</string>
+ </array>
+ <array>
+ <real>0.93749958276748657</real>
+ <string>A-9PM</string>
+ </array>
+ <array>
+ <real>0.99999958276748657</real>
+ <string>Sheer Surreality</string>
+ </array>
+ </array>
+</llsd>
diff --git a/indra/newview/app_settings/windlight/days/Tropicalia.xml b/indra/newview/app_settings/windlight/days/Tropicalia.xml
new file mode 100644
index 0000000000..89a56d4a13
--- /dev/null
+++ b/indra/newview/app_settings/windlight/days/Tropicalia.xml
@@ -0,0 +1,32 @@
+<llsd>
+ <array>
+ <array>
+ <real>0.062499973922967911</real>
+ <string>Purple</string>
+ </array>
+ <array>
+ <real>0.16666659712791443</real>
+ <string>Funky Funky</string>
+ </array>
+ <array>
+ <real>0.31249985098838806</real>
+ <string>Sunrise</string>
+ </array>
+ <array>
+ <real>0.49999979138374329</real>
+ <string>Fine Day</string>
+ </array>
+ <array>
+ <real>0.66666638851165771</real>
+ <string>Desert Sunset</string>
+ </array>
+ <array>
+ <real>0.74999970197677612</real>
+ <string>Sailor&apos;s Delight</string>
+ </array>
+ <array>
+ <real>0.95833295583724976</real>
+ <string>Midnight</string>
+ </array>
+ </array>
+</llsd>
diff --git a/indra/newview/app_settings/windlight/days/Weird-O.xml b/indra/newview/app_settings/windlight/days/Weird-O.xml
new file mode 100644
index 0000000000..1e312f2464
--- /dev/null
+++ b/indra/newview/app_settings/windlight/days/Weird-O.xml
@@ -0,0 +1,56 @@
+<llsd>
+ <array>
+ <array>
+ <real>0</real>
+ <string>Funky Funky</string>
+ </array>
+ <array>
+ <real>0.13194438815116882</real>
+ <string>Funky Funky Funky</string>
+ </array>
+ <array>
+ <real>0.26041656732559204</real>
+ <string>Gelatto</string>
+ </array>
+ <array>
+ <real>0.40624985098838806</real>
+ <string>Funky Funky Funky</string>
+ </array>
+ <array>
+ <real>0.43749979138374329</real>
+ <string>Ghost</string>
+ </array>
+ <array>
+ <real>0.46874979138374329</real>
+ <string>Gelatto</string>
+ </array>
+ <array>
+ <real>0.5486108660697937</real>
+ <string>Sheer Surreality</string>
+ </array>
+ <array>
+ <real>0.6076386570930481</real>
+ <string>Gelatto</string>
+ </array>
+ <array>
+ <real>0.68055528402328491</real>
+ <string>Ghost</string>
+ </array>
+ <array>
+ <real>0.75694411993026733</real>
+ <string>Sheer Surreality</string>
+ </array>
+ <array>
+ <real>0.87847185134887695</real>
+ <string>Gelatto</string>
+ </array>
+ <array>
+ <real>0.91319411993026733</real>
+ <string>Funky Funky Funky</string>
+ </array>
+ <array>
+ <real>0.96527737379074097</real>
+ <string>Funky Funky Funky</string>
+ </array>
+ </array>
+</llsd>
diff --git a/indra/newview/app_settings/windlight/postprocesseffects.xml b/indra/newview/app_settings/windlight/postprocesseffects.xml
index 4645215a47..60fbfd3483 100644
--- a/indra/newview/app_settings/windlight/postprocesseffects.xml
+++ b/indra/newview/app_settings/windlight/postprocesseffects.xml
@@ -1,2 +1 @@
<llsd><map><key>Asi Weird</key><map><key>bloom_strength</key><real>4.5799999237060547</real><key>bloom_width</key><real>12.539999961853027</real><key>brightness</key><real>0.89999997615814209</real><key>brightness_multiplier</key><real>3</real><key>contrast</key><real>0.22999998927116394</real><key>contrast_base</key><array><real>1</real><real>1</real><real>1</real><real>0.5</real></array><key>enable_bloom</key><integer>1</integer><key>enable_color_filter</key><integer>1</integer><key>enable_night_vision</key><boolean>0</boolean><key>extract_high</key><real>1</real><key>extract_low</key><real>0.47999998927116394</real><key>noise_size</key><real>25</real><key>noise_strength</key><real>0.40000000000000002</real><key>saturation</key><real>-1</real></map><key>NegativeSaturation</key><map><key>bloom_strength</key><real>1.5</real><key>bloom_width</key><real>2.25</real><key>brightness</key><real>1</real><key>brightness_multiplier</key><real>3</real><key>contrast</key><real>1</real><key>contrast_base</key><array><real>1</real><real>1</real><real>1</real><real>0.5</real></array><key>enable_bloom</key><boolean>0</boolean><key>enable_color_filter</key><integer>1</integer><key>enable_night_vision</key><boolean>0</boolean><key>extract_high</key><real>1</real><key>extract_low</key><real>0.94999999999999996</real><key>noise_size</key><real>25</real><key>noise_strength</key><real>0.40000000000000002</real><key>saturation</key><real>-1</real></map><key>NightVision</key><map><key>bloom_strength</key><real>1.5</real><key>bloom_width</key><real>2.25</real><key>brightness</key><real>1</real><key>brightness_multiplier</key><real>3</real><key>contrast</key><real>1</real><key>contrast_base</key><array><real>1</real><real>1</real><real>1</real><real>0.5</real></array><key>enable_bloom</key><boolean>0</boolean><key>enable_color_filter</key><boolean>0</boolean><key>enable_night_vision</key><integer>1</integer><key>extract_high</key><real>1</real><key>extract_low</key><real>0.94999999999999996</real><key>noise_size</key><real>25</real><key>noise_strength</key><real>0.40000000000000002</real><key>saturation</key><real>1</real></map><key>WGhost</key><map><key>bloom_strength</key><real>2.0399999618530273</real><key>bloom_width</key><real>2.25</real><key>brightness</key><real>1</real><key>brightness_multiplier</key><real>3</real><key>contrast</key><real>1</real><key>contrast_base</key><array><real>1</real><real>1</real><real>1</real><real>0.5</real></array><key>enable_bloom</key><integer>1</integer><key>enable_color_filter</key><boolean>0</boolean><key>enable_night_vision</key><boolean>0</boolean><key>extract_high</key><real>1</real><key>extract_low</key><real>0.22999998927116394</real><key>noise_size</key><real>25</real><key>noise_strength</key><real>0.40000000000000002</real><key>saturation</key><real>1</real></map><key>default</key><map><key>bloom_strength</key><real>1.5</real><key>bloom_width</key><real>2.25</real><key>brightness</key><real>1</real><key>brightness_multiplier</key><real>3</real><key>contrast</key><real>1</real><key>contrast_base</key><array><real>1</real><real>1</real><real>1</real><real>0.5</real></array><key>enable_bloom</key><boolean>0</boolean><key>enable_color_filter</key><boolean>0</boolean><key>enable_night_vision</key><boolean>0</boolean><key>extract_high</key><real>1</real><key>extract_low</key><real>0.94999999999999996</real><key>noise_size</key><real>25</real><key>noise_strength</key><real>0.40000000000000002</real><key>saturation</key><real>1</real></map></map></llsd>
-><map><key>bloom_strength</key><real>1.5</real><key>bloom_width</key><real>2.25</real><key>brightness</key><real>1</real><key>brightness_multiplier</key><real>3</real><key>contrast</key><real>1</real><key>contrast_base</key><array><real>1</real><real>1</real><real>1</real><real>0.5</real></array><key>enable_bloom</key><boolean>0</boolean><key>enable_color_filter</key><boolean>0</boolean><key>enable_night_vision</key><boolean>0</boolean><key>extract_high</key><real>1</real><key>extract_low</key><real>0.94999999999999996</real><key>noise_size</key><real>25</real><key>noise_strength</key><real>0.40000000000000002</real><key>saturation</key><real>1</real></map></map></llsd>
diff --git a/indra/newview/app_settings/windlight/skies/Midday.xml b/indra/newview/app_settings/windlight/skies/Midday.xml
new file mode 100644
index 0000000000..119b3e1418
--- /dev/null
+++ b/indra/newview/app_settings/windlight/skies/Midday.xml
@@ -0,0 +1,141 @@
+<llsd>
+ <map>
+ <key>ambient</key>
+ <array>
+ <real>1.0499999523162842</real>
+ <real>1.0499999523162842</real>
+ <real>1.0499999523162842</real>
+ <real>0.34999999403953552</real>
+ </array>
+ <key>blue_density</key>
+ <array>
+ <real>0.24475815892219543</real>
+ <real>0.44872328639030457</real>
+ <real>0.75999999046325684</real>
+ <real>0.37999999523162842</real>
+ </array>
+ <key>blue_horizon</key>
+ <array>
+ <real>0.49548381567001343</real>
+ <real>0.49548381567001343</real>
+ <real>0.63999998569488525</real>
+ <real>0.31999999284744263</real>
+ </array>
+ <key>cloud_color</key>
+ <array>
+ <real>0.40999999642372131</real>
+ <real>0.40999999642372131</real>
+ <real>0.40999999642372131</real>
+ <real>0.40999999642372131</real>
+ </array>
+ <key>cloud_pos_density1</key>
+ <array>
+ <real>1.6884100437164307</real>
+ <real>0.52609699964523315</real>
+ <real>1</real>
+ <real>1</real>
+ </array>
+ <key>cloud_pos_density2</key>
+ <array>
+ <real>1.6884100437164307</real>
+ <real>0.52609699964523315</real>
+ <real>0.125</real>
+ <real>1</real>
+ </array>
+ <key>cloud_scale</key>
+ <array>
+ <real>0.41999998688697815</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ <key>cloud_scroll_rate</key>
+ <array>
+ <real>10.199999809265137</real>
+ <real>10.01099967956543</real>
+ </array>
+ <key>cloud_shadow</key>
+ <array>
+ <real>0.26999998092651367</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ <key>density_multiplier</key>
+ <array>
+ <real>0.00017999998817685992</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ <key>distance_multiplier</key>
+ <array>
+ <real>0.80000001192092896</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ <key>east_angle</key>
+ <real>0</real>
+ <key>enable_cloud_scroll</key>
+ <array>
+ <boolean>1</boolean>
+ <boolean>1</boolean>
+ </array>
+ <key>gamma</key>
+ <array>
+ <real>1</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ <key>glow</key>
+ <array>
+ <real>5</real>
+ <real>0.0010000000474974513</real>
+ <real>-0.47999998927116394</real>
+ <real>1</real>
+ </array>
+ <key>haze_density</key>
+ <array>
+ <real>0.69999998807907104</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ <key>haze_horizon</key>
+ <array>
+ <real>0.18999999761581421</real>
+ <real>0.19915600121021271</real>
+ <real>0.19915600121021271</real>
+ <real>1</real>
+ </array>
+ <key>lightnorm</key>
+ <array>
+ <real>0</real>
+ <real>1</real>
+ <real>-4.3711388286737929e-008</real>
+ <real>0</real>
+ </array>
+ <key>max_y</key>
+ <array>
+ <real>1605</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ <key>preset_num</key>
+ <integer>22</integer>
+ <key>star_brightness</key>
+ <real>0</real>
+ <key>sun_angle</key>
+ <real>1.5707963705062866</real>
+ <key>sunlight_color</key>
+ <array>
+ <real>0.7342105507850647</real>
+ <real>0.78157895803451538</real>
+ <real>0.89999997615814209</real>
+ <real>0.29999998211860657</real>
+ </array>
+ </map>
+</llsd>
diff --git a/indra/newview/app_settings/windlight/skies/Midnight.xml b/indra/newview/app_settings/windlight/skies/Midnight.xml
new file mode 100644
index 0000000000..0aba31214a
--- /dev/null
+++ b/indra/newview/app_settings/windlight/skies/Midnight.xml
@@ -0,0 +1,141 @@
+<llsd>
+ <map>
+ <key>ambient</key>
+ <array>
+ <real>0.20405027270317078</real>
+ <real>0.24246673285961151</real>
+ <real>0.32999998331069946</real>
+ <real>0.10999999940395355</real>
+ </array>
+ <key>blue_density</key>
+ <array>
+ <real>0.44999998807907104</real>
+ <real>0.44999998807907104</real>
+ <real>0.44999998807907104</real>
+ <real>1</real>
+ </array>
+ <key>blue_horizon</key>
+ <array>
+ <real>0.23999999463558197</real>
+ <real>0.23999999463558197</real>
+ <real>0.23999999463558197</real>
+ <real>1</real>
+ </array>
+ <key>cloud_color</key>
+ <array>
+ <real>0.22615399956703186</real>
+ <real>0.22615399956703186</real>
+ <real>0.22615399956703186</real>
+ <real>1</real>
+ </array>
+ <key>cloud_pos_density1</key>
+ <array>
+ <real>1.6884100437164307</real>
+ <real>0.52609699964523315</real>
+ <real>0.87999999523162842</real>
+ <real>1</real>
+ </array>
+ <key>cloud_pos_density2</key>
+ <array>
+ <real>1.6884100437164307</real>
+ <real>0.52609699964523315</real>
+ <real>0.125</real>
+ <real>1</real>
+ </array>
+ <key>cloud_scale</key>
+ <array>
+ <real>0.41999998688697815</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ <key>cloud_scroll_rate</key>
+ <array>
+ <real>10.49940013885498</real>
+ <real>10.01099967956543</real>
+ </array>
+ <key>cloud_shadow</key>
+ <array>
+ <real>0.26999998092651367</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ <key>density_multiplier</key>
+ <array>
+ <real>0.00030000001424923539</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ <key>distance_multiplier</key>
+ <array>
+ <real>0</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ <key>east_angle</key>
+ <real>0</real>
+ <key>enable_cloud_scroll</key>
+ <array>
+ <boolean>1</boolean>
+ <boolean>1</boolean>
+ </array>
+ <key>gamma</key>
+ <array>
+ <real>1</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ <key>glow</key>
+ <array>
+ <real>5</real>
+ <real>0.0010000000474974513</real>
+ <real>-0.47999998927116394</real>
+ <real>1</real>
+ </array>
+ <key>haze_density</key>
+ <array>
+ <real>4</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ <key>haze_horizon</key>
+ <array>
+ <real>0</real>
+ <real>0.19915600121021271</real>
+ <real>0.19915600121021271</real>
+ <real>1</real>
+ </array>
+ <key>lightnorm</key>
+ <array>
+ <real>0</real>
+ <real>1</real>
+ <real>-4.8876205482883961e-007</real>
+ <real>1</real>
+ </array>
+ <key>max_y</key>
+ <array>
+ <real>906.20001220703125</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ <key>preset_num</key>
+ <integer>22</integer>
+ <key>star_brightness</key>
+ <real>2</real>
+ <key>sun_angle</key>
+ <real>4.7123894691467285</real>
+ <key>sunlight_color</key>
+ <array>
+ <real>0.34876692295074463</real>
+ <real>0.35574248433113098</real>
+ <real>0.65999996662139893</real>
+ <real>0.2199999988079071</real>
+ </array>
+ </map>
+</llsd>
diff --git a/indra/newview/app_settings/windlight/skies/Sunrise.xml b/indra/newview/app_settings/windlight/skies/Sunrise.xml
new file mode 100644
index 0000000000..bbc7aeec59
--- /dev/null
+++ b/indra/newview/app_settings/windlight/skies/Sunrise.xml
@@ -0,0 +1,141 @@
+<llsd>
+ <map>
+ <key>ambient</key>
+ <array>
+ <real>0.80999994277954102</real>
+ <real>0.46289783716201782</real>
+ <real>0.62999993562698364</real>
+ <real>0.26999998092651367</real>
+ </array>
+ <key>blue_density</key>
+ <array>
+ <real>0.15793180465698242</real>
+ <real>0.43499568104743958</real>
+ <real>0.87000000476837158</real>
+ <real>0.87000000476837158</real>
+ </array>
+ <key>blue_horizon</key>
+ <array>
+ <real>0.20673196017742157</real>
+ <real>0.40988314151763916</real>
+ <real>0.47999998927116394</real>
+ <real>0.47999998927116394</real>
+ </array>
+ <key>cloud_color</key>
+ <array>
+ <real>0.22616604226328718</real>
+ <real>0.22616604226328718</real>
+ <real>0.22616604226328718</real>
+ <real>0.99997219085526012</real>
+ </array>
+ <key>cloud_pos_density1</key>
+ <array>
+ <real>1.6884100437164307</real>
+ <real>0.52609699964523315</real>
+ <real>0.88000025272481253</real>
+ <real>1</real>
+ </array>
+ <key>cloud_pos_density2</key>
+ <array>
+ <real>1.6884100437164307</real>
+ <real>0.52609699964523315</real>
+ <real>0.125</real>
+ <real>1</real>
+ </array>
+ <key>cloud_scale</key>
+ <array>
+ <real>0.41999998688697815</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ <key>cloud_scroll_rate</key>
+ <array>
+ <real>10.49940013883861</real>
+ <real>10.010999679576344</real>
+ </array>
+ <key>cloud_shadow</key>
+ <array>
+ <real>0.26999998092651367</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ <key>density_multiplier</key>
+ <array>
+ <real>0.00062000000616535544</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ <key>distance_multiplier</key>
+ <array>
+ <real>2.6999279499073054</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ <key>east_angle</key>
+ <real>0</real>
+ <key>enable_cloud_scroll</key>
+ <array>
+ <boolean>1</boolean>
+ <boolean>1</boolean>
+ </array>
+ <key>gamma</key>
+ <array>
+ <real>1</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ <key>glow</key>
+ <array>
+ <real>5.0009990693069994</real>
+ <real>0.0010000000474963411</real>
+ <real>-0.48000101923815919</real>
+ <real>1</real>
+ </array>
+ <key>haze_density</key>
+ <array>
+ <real>0.53999996185302734</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ <key>haze_horizon</key>
+ <array>
+ <real>0.15999999642372131</real>
+ <real>0.19915600121021271</real>
+ <real>0.19915600121021271</real>
+ <real>1</real>
+ </array>
+ <key>lightnorm</key>
+ <array>
+ <real>0</real>
+ <real>0.094108223915100098</real>
+ <real>0.99556195735931396</real>
+ <real>0</real>
+ </array>
+ <key>max_y</key>
+ <array>
+ <real>563</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ <key>preset_num</key>
+ <integer>22</integer>
+ <key>star_brightness</key>
+ <real>0</real>
+ <key>sun_angle</key>
+ <real>0.094247691333293915</real>
+ <key>sunlight_color</key>
+ <array>
+ <real>2.369999885559082</real>
+ <real>2.369999885559082</real>
+ <real>2.369999885559082</real>
+ <real>0.78999996185302734</real>
+ </array>
+ </map>
+</llsd>
diff --git a/indra/newview/app_settings/windlight/skies/Sunset.xml b/indra/newview/app_settings/windlight/skies/Sunset.xml
new file mode 100644
index 0000000000..ebf08e1a3f
--- /dev/null
+++ b/indra/newview/app_settings/windlight/skies/Sunset.xml
@@ -0,0 +1,142 @@
+<llsd>
+ <map>
+ <key>ambient</key>
+ <array>
+ <real>1.0199999809265137</real>
+ <real>0.80999994277954102</real>
+ <real>0.80999994277954102</real>
+ <real>1.0199999809265137</real>
+ </array>
+ <key>blue_density</key>
+ <array>
+ <real>0.14522500336170197</real>
+ <real>0.39999699592590332</real>
+ <real>0.80000197887420654</real>
+ <real>1</real>
+ </array>
+ <key>blue_horizon</key>
+ <array>
+ <real>0.10767599940299988</real>
+ <real>0.21348699927330017</real>
+ <real>0.25</real>
+ <real>1</real>
+ </array>
+ <key>cloud_color</key>
+ <array>
+ <real>0.22615399956703186</real>
+ <real>0.22615399956703186</real>
+ <real>0.22615399956703186</real>
+ <real>1</real>
+ </array>
+ <key>cloud_pos_density1</key>
+ <array>
+ <real>1.6884100437164307</real>
+ <real>0.52609699964523315</real>
+ <real>0.87999999523162842</real>
+ <real>1</real>
+ </array>
+ <key>cloud_pos_density2</key>
+ <array>
+ <real>1.6884100437164307</real>
+ <real>0.52609699964523315</real>
+ <real>0.125</real>
+ <real>1</real>
+ </array>
+ <key>cloud_scale</key>
+ <array>
+ <real>0.41999998688697815</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ <key>cloud_scroll_rate</key>
+ <array>
+ <real>10.49940013885498</real>
+ <real>10.01099967956543</real>
+ </array>
+ <key>cloud_shadow</key>
+ <array>
+ <real>0.26999998092651367</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ <key>density_multiplier</key>
+ <array>
+ <real>0.00046000001020729542</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ <key>distance_multiplier</key>
+ <array>
+ <real>1</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ <key>east_angle</key>
+ <real>0</real>
+ <key>enable_cloud_scroll</key>
+ <array>
+ <boolean>1</boolean>
+ <boolean>1</boolean>
+ </array>
+ <key>gamma</key>
+ <array>
+ <real>1</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ <key>glow</key>
+ <array>
+ <real>5</real>
+ <real>0.0010000000474974513</real>
+ <real>-0.47999998927116394</real>
+ <real>1</real>
+ </array>
+ <key>haze_density</key>
+ <array>
+ <real>0.69999998807907104</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ <key>haze_horizon</key>
+ <array>
+ <real>0.15999999642372131</real>
+ <real>0.19915600121021271</real>
+ <real>0.19915600121021271</real>
+ <real>1</real>
+ </array>
+ <key>lightnorm</key>
+ <array>
+ <real>0</real>
+ <real>0.07532646507024765</real>
+ <real>-0.99715894460678101</real>
+ <real>0</real>
+ </array>
+ <key>max_y</key>
+ <array>
+ <real>562.5</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ <key>preset_num</key>
+ <integer>22</integer>
+ <key>star_brightness</key>
+ <real>0</real>
+ <key>sun_angle</key>
+ <real>3.0661947727203369</real>
+ <key>sunlight_color</key>
+ <array>
+ <real>2.8385701179504395</real>
+ <real>2.8385701179504395</real>
+ <real>2.8385701179504395</real>
+ <real>1</real>
+ </array>
+ </map>
+</llsd>
+
diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml
index a9b4ff02c5..99dbfcae51 100644
--- a/indra/newview/character/avatar_lad.xml
+++ b/indra/newview/character/avatar_lad.xml
@@ -393,7 +393,26 @@
max_attachment_offset="2.0"
visible_in_first_person="true" />
-
+ <attachment_point
+ id="39"
+ group="6"
+ pie_slice="1"
+ name="Neck"
+ joint="mNeck"
+ position="0 0 0"
+ rotation="0 0 0"
+ visible_in_first_person="true" />
+
+ <attachment_point
+ id="40"
+ group="6"
+ pie_slice="2"
+ name="Avatar Center"
+ joint="mRoot"
+ position="0 0 0"
+ rotation="0 0 0"
+ visible_in_first_person="true" />
+
<param
id="32"
group="1"
@@ -612,7 +631,7 @@
id="36"
group="0"
name="Shoulders"
- label="Shoulders"
+ label="Shoulders"
wearable="shape"
edit_group="shape_torso"
edit_group_order="4"
@@ -4040,7 +4059,6 @@
scale="0.0 0.0 0.01"
pos="0 0 -0.01"/>
</param_morph>
-
</param>
<param
@@ -4061,7 +4079,7 @@
camera_distance=".8">
<param_morph />
</param>
-
+
<param
id="628"
group="1"
@@ -4130,7 +4148,7 @@
camera_distance=".8">
<param_morph />
</param>
-
+
<param
id="685"
group="0"
@@ -4328,8 +4346,66 @@
</param>
<!--
+ #############
+ # physics morphs (not user controlled)
+ #############
+ -->
+ <param
+ id="1200"
+ group="1"
+ sex="female"
+ name="Breast_Physics_UpDown_Driven"
+ wearable="shape"
+ edit_group="driven"
+ value_default="0"
+ value_min="-3"
+ value_max="3">
+ <param_morph />
+ </param>
+
+ <param
+ id="1201"
+ group="1"
+ sex="female"
+ name="Breast_Physics_InOut_Driven"
+ wearable="shape"
+ edit_group="driven"
+ value_default="0"
+ value_min="-1.25"
+ value_max="1.25">
+ <param_morph />
+ </param>
+
+ <param
+ id="1204"
+ group="1"
+ name="Belly_Physics_Torso_UpDown_Driven"
+ wearable="physics"
+ cross_wearable="true"
+ edit_group="driven"
+ value_default="0"
+ value_min="-1"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <param
+ id="1207"
+ group="1"
+ name="Breast_Physics_LeftRight_Driven"
+ wearable="physics"
+ cross_wearable="true"
+ edit_group="driven"
+ value_default="0"
+ value_min="-2"
+ value_max="2">
+ <param_morph />
+ </param>
+
+ <!--
#end morph targets
-->
+
</mesh>
<mesh
@@ -4390,6 +4466,7 @@
<param_morph />
</param>
+
<param
id="151"
group="1"
@@ -4829,8 +4906,53 @@
</param>
<!--
+ #############
+ # physics morphs (not user controlled)
+ #############
+ -->
+ <param
+ id="1202"
+ group="1"
+ name="Belly_Physics_Legs_UpDown_Driven"
+ wearable="physics"
+ cross_wearable="true"
+ edit_group="driven"
+ value_min="-1"
+ value_max="1">
+ <param_morph />
+ </param>
+
+
+ <param
+ id="1205"
+ group="1"
+ name="Butt_Physics_UpDown_Driven"
+ wearable="physics"
+ cross_wearable="true"
+ edit_group="driven"
+ value_default="0"
+ value_min="-1"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <param
+ id="1206"
+ group="1"
+ name="Butt_Physics_LeftRight_Driven"
+ wearable="physics"
+ cross_wearable="true"
+ edit_group="driven"
+ value_default="0"
+ value_min="-1"
+ value_max="1">
+ <param_morph />
+ </param>
+
+ <!--
#end morph targets
-->
+
</mesh>
<mesh
@@ -5199,6 +5321,25 @@
value_max="1">
<param_morph />
</param>
+
+ <!--
+ #############
+ # physics morphs (not user controlled)
+ #############
+ -->
+ <param
+ id="1203"
+ group="1"
+ name="Belly_Physics_Skirt_UpDown_Driven"
+ wearable="physics"
+ cross_wearable="true"
+ edit_group="driven"
+ value_default="0"
+ value_min="-1"
+ value_max="1">
+ <param_morph />
+ </param>
+
</mesh>
<mesh
@@ -9074,12 +9215,13 @@ render_pass="bump">
<!-- =========================================================== -->
<driver_parameters>
+
<param
id="828"
group="0"
name="Loose Upper Clothing"
label="Shirt Fit"
- show_simple="true"
+ show_simple="true"
wearable="shirt"
edit_group="shirt"
edit_group_order="4"
@@ -11631,6 +11773,523 @@ render_pass="bump">
</param_driver>
</param>
+ <!-- ==PHYSICS PARAMETERS======================================= -->
+
+ <param
+ id="1100"
+ group="1"
+ sex="female"
+ wearable="physics"
+ name="Breast_Physics_UpDown_Controller"
+ label="Breast Physics UpDown Controller"
+ value_min="-1"
+ value_max="1"
+ value_default="0">
+ <param_driver>
+ <driven
+ id="1200" />
+ </param_driver>
+ </param>
+
+ <param
+ id="1101"
+ group="1"
+ sex="female"
+ wearable="physics"
+ name="Breast_Physics_InOut_Controller"
+ label="Breast Physics InOut Controller"
+ value_min="-1"
+ value_max="1"
+ value_default="0">
+ <param_driver>
+ <driven
+ id="1201" />
+ </param_driver>
+ </param>
+
+ <param
+ id="1102"
+ group="1"
+ wearable="physics"
+ name="Belly_Physics_UpDown_Controller"
+ label="Belly Physics UpDown Controller"
+ value_min="-1"
+ value_max="1"
+ value_default="0">
+ <param_driver>
+ <driven
+ id="1202" />
+ <driven
+ id="1203" />
+ <driven
+ id="1204" />
+ </param_driver>
+ </param>
+
+ <param
+ id="1103"
+ group="1"
+ wearable="shape"
+ name="Butt_Physics_UpDown_Controller"
+ label="Butt Physics UpDown Controller"
+ value_min="-1"
+ value_max="1"
+ value_default="0">
+ <param_driver>
+ <driven
+ id="1205" />
+ </param_driver>
+ </param>
+
+ <param
+ id="1104"
+ group="1"
+ wearable="shape"
+ name="Butt_Physics_LeftRight_Controller"
+ label="Butt Physics LeftRight Controller"
+ value_min="-1"
+ value_max="1"
+ value_default="0">
+ <param_driver>
+ <driven
+ id="1206" />
+ </param_driver>
+ </param>
+
+ <param
+ id="1105"
+ group="1"
+ wearable="shape"
+ name="Breast_Physics_LeftRight_Controller"
+ label="Breast Physics LeftRight Controller"
+ value_min="-1"
+ value_max="1"
+ value_default="0">
+ <param_driver>
+ <driven
+ id="1207" />
+ </param_driver>
+ </param>
+
+ <param
+ id="10000"
+ group="0"
+ sex="female"
+ name="Breast_Physics_Mass"
+ label="Breast Physics Mass"
+ wearable="physics"
+ edit_group="physics_advanced"
+ value_default=".1"
+ value_min=".1"
+ value_max="1">
+ <param_driver />
+ </param>
+ <param
+ id="10001"
+ group="0"
+ sex="female"
+ name="Breast_Physics_Gravity"
+ label="Breast Physics Gravity"
+ wearable="physics"
+ edit_group="physics_advanced"
+ value_default="0"
+ value_min="0"
+ value_max="30">
+ <param_driver />
+ </param>
+
+ <param
+ id="10002"
+ group="0"
+ sex="female"
+ name="Breast_Physics_Drag"
+ label="Breast Physics Drag"
+ wearable="physics"
+ edit_group="physics_advanced"
+ value_default="1"
+ value_min="0"
+ value_max="10">
+ <param_driver />
+ </param>
+
+ <param
+ id="10003"
+ group="0"
+ sex="female"
+ name="Breast_Physics_UpDown_Max_Effect"
+ label="Breast Physics UpDown Max Effect"
+ wearable="physics"
+ edit_group="physics_breasts_updown"
+ value_default="0"
+ value_min="0"
+ value_max="3">
+ <param_driver />
+ </param>
+ <param
+ id="10004"
+ group="0"
+ sex="female"
+ name="Breast_Physics_UpDown_Spring"
+ label="Breast Physics UpDown Spring"
+ wearable="physics"
+ edit_group="physics_breasts_updown"
+ value_default="10"
+ value_min="0"
+ value_max="100">
+ <param_driver />
+ </param>
+ <param
+ id="10005"
+ group="0"
+ sex="female"
+ name="Breast_Physics_UpDown_Gain"
+ label="Breast Physics UpDown Gain"
+ wearable="physics"
+ edit_group="physics_breasts_updown"
+ value_default="10"
+ value_min="1"
+ value_max="100">
+ <param_driver />
+ </param>
+ <param
+ id="10006"
+ group="0"
+ sex="female"
+ name="Breast_Physics_UpDown_Damping"
+ label="Breast Physics UpDown Damping"
+ wearable="physics"
+ edit_group="physics_breasts_updown"
+ value_default=".2"
+ value_min="0"
+ value_max="1">
+ <param_driver />
+ </param>
+
+ <param
+ id="10007"
+ group="0"
+ sex="female"
+ name="Breast_Physics_InOut_Max_Effect"
+ label="Breast Physics InOut Max Effect"
+ wearable="physics"
+ edit_group="physics_breasts_inout"
+ value_default="0"
+ value_min="0"
+ value_max="3">
+ <param_driver />
+ </param>
+ <param
+ id="10008"
+ group="0"
+ sex="female"
+ name="Breast_Physics_InOut_Spring"
+ label="Breast Physics InOut Spring"
+ wearable="physics"
+ edit_group="physics_breasts_inout"
+ value_default="10"
+ value_min="0"
+ value_max="100">
+ <param_driver />
+ </param>
+ <param
+ id="10009"
+ group="0"
+ sex="female"
+ name="Breast_Physics_InOut_Gain"
+ label="Breast Physics InOut Gain"
+ wearable="physics"
+ edit_group="physics_breasts_inout"
+ value_default="10"
+ value_min="1"
+ value_max="100">
+ <param_driver />
+ </param>
+ <param
+ id="10010"
+ group="0"
+ sex="female"
+ name="Breast_Physics_InOut_Damping"
+ label="Breast Physics InOut Damping"
+ wearable="physics"
+ edit_group="physics_breasts_inout"
+ value_default=".2"
+ value_min="0"
+ value_max="1">
+ <param_driver />
+ </param>
+
+ <param
+ id="10011"
+ group="0"
+ name="Belly_Physics_Mass"
+ label="Belly Physics Mass"
+ wearable="physics"
+ edit_group="physics_advanced"
+ value_default=".1"
+ value_min=".1"
+ value_max="1">
+ <param_driver />
+ </param>
+ <param
+ id="10012"
+ group="0"
+ name="Belly_Physics_Gravity"
+ label="Belly Physics Gravity"
+ wearable="physics"
+ edit_group="physics_advanced"
+ value_default="0"
+ value_min="0"
+ value_max="30">
+ <param_driver />
+ </param>
+ <param
+ id="10013"
+ group="0"
+ name="Belly_Physics_Drag"
+ label="Belly Physics Drag"
+ wearable="physics"
+ edit_group="physics_advanced"
+ value_default="1"
+ value_min="0"
+ value_max="10">
+ <param_driver />
+ </param>
+ <param
+ id="10014"
+ group="0"
+ name="Belly_Physics_UpDown_Max_Effect"
+ label="Belly Physics UpDown Max Effect"
+ wearable="physics"
+ edit_group="physics_belly_updown"
+ value_default="0"
+ value_min="0"
+ value_max="3">
+ <param_driver />
+ </param>
+ <param
+ id="10015"
+ group="0"
+ name="Belly_Physics_UpDown_Spring"
+ label="Belly Physics UpDown Spring"
+ wearable="physics"
+ edit_group="physics_belly_updown"
+ value_default="10"
+ value_min="0"
+ value_max="100">
+ <param_driver />
+ </param>
+ <param
+ id="10016"
+ group="0"
+ name="Belly_Physics_UpDown_Gain"
+ label="Belly Physics UpDown Gain"
+ wearable="physics"
+ edit_group="physics_belly_updown"
+ value_default="10"
+ value_min="1"
+ value_max="100">
+ <param_driver />
+ </param>
+ <param
+ id="10017"
+ group="0"
+ name="Belly_Physics_UpDown_Damping"
+ label="Belly Physics UpDown Damping"
+ wearable="physics"
+ edit_group="physics_belly_updown"
+ value_default=".2"
+ value_min="0"
+ value_max="1">
+ <param_driver />
+ </param>
+
+ <param
+ id="10018"
+ group="0"
+ name="Butt_Physics_Mass"
+ label="Butt Physics Mass"
+ wearable="physics"
+ edit_group="physics_advanced"
+ value_default=".1"
+ value_min=".1"
+ value_max="1">
+ <param_driver />
+ </param>
+ <param
+ id="10019"
+ group="0"
+ name="Butt_Physics_Gravity"
+ label="Butt Physics Gravity"
+ wearable="physics"
+ edit_group="physics_advanced"
+ value_default="0"
+ value_min="0"
+ value_max="30">
+ <param_driver />
+ </param>
+ <param
+ id="10020"
+ group="0"
+ name="Butt_Physics_Drag"
+ label="Butt Physics Drag"
+ wearable="physics"
+ edit_group="physics_advanced"
+ value_default="1"
+ value_min="0"
+ value_max="10">
+ <param_driver />
+ </param>
+
+ <param
+ id="10021"
+ group="0"
+ name="Butt_Physics_UpDown_Max_Effect"
+ label="Butt Physics UpDown Max Effect"
+ wearable="physics"
+ edit_group="physics_butt_updown"
+ value_default="0"
+ value_min="0"
+ value_max="3">
+ <param_driver />
+ </param>
+ <param
+ id="10022"
+ group="0"
+ name="Butt_Physics_UpDown_Spring"
+ label="Butt Physics UpDown Spring"
+ wearable="physics"
+ edit_group="physics_butt_updown"
+ value_default="10"
+ value_min="0"
+ value_max="100">
+ <param_driver />
+ </param>
+ <param
+ id="10023"
+ group="0"
+ name="Butt_Physics_UpDown_Gain"
+ label="Butt Physics UpDown Gain"
+ wearable="physics"
+ edit_group="physics_butt_updown"
+ value_default="10"
+ value_min="1"
+ value_max="100">
+ <param_driver />
+ </param>
+ <param
+ id="10024"
+ group="0"
+ name="Butt_Physics_UpDown_Damping"
+ label="Butt Physics UpDown Damping"
+ wearable="physics"
+ edit_group="physics_butt_updown"
+ value_default=".2"
+ value_min="0"
+ value_max="1">
+ <param_driver />
+ </param>
+
+ <param
+ id="10025"
+ group="0"
+ name="Butt_Physics_LeftRight_Max_Effect"
+ label="Butt Physics LeftRight Max Effect"
+ wearable="physics"
+ edit_group="physics_butt_leftright"
+ value_default="0"
+ value_min="0"
+ value_max="3">
+ <param_driver />
+ </param>
+ <param
+ id="10026"
+ group="0"
+ name="Butt_Physics_LeftRight_Spring"
+ label="Butt Physics LeftRight Spring"
+ wearable="physics"
+ edit_group="physics_butt_leftright"
+ value_default="10"
+ value_min="0"
+ value_max="100">
+ <param_driver />
+ </param>
+ <param
+ id="10027"
+ group="0"
+ name="Butt_Physics_LeftRight_Gain"
+ label="Butt Physics LeftRight Gain"
+ wearable="physics"
+ edit_group="physics_butt_leftright"
+ value_default="10"
+ value_min="1"
+ value_max="100">
+ <param_driver />
+ </param>
+ <param
+ id="10028"
+ group="0"
+ name="Butt_Physics_LeftRight_Damping"
+ label="Butt Physics LeftRight Damping"
+ wearable="physics"
+ edit_group="physics_butt_leftright"
+ value_default=".2"
+ value_min="0"
+ value_max="1">
+ <param_driver />
+ </param>
+
+ <param
+ id="10029"
+ group="0"
+ sex="female"
+ name="Breast_Physics_LeftRight_Max_Effect"
+ label="Breast Physics LeftRight Max Effect"
+ wearable="physics"
+ edit_group="physics_breasts_leftright"
+ value_default="0"
+ value_min="0"
+ value_max="3">
+ <param_driver />
+ </param>
+ <param
+ id="10030"
+ group="0"
+ sex="female"
+ name="Breast_Physics_LeftRight_Spring"
+ label="Breast Physics LeftRight Spring"
+ wearable="physics"
+ edit_group="physics_breasts_leftright"
+ value_default="10"
+ value_min="0"
+ value_max="100">
+ <param_driver />
+ </param>
+ <param
+ id="10031"
+ group="0"
+ sex="female"
+ name="Breast_Physics_LeftRight_Gain"
+ label="Breast Physics LeftRight Gain"
+ wearable="physics"
+ edit_group="physics_breasts_leftright"
+ value_default="10"
+ value_min="1"
+ value_max="100">
+ <param_driver />
+ </param>
+ <param
+ id="10032"
+ group="0"
+ sex="female"
+ name="Breast_Physics_LeftRight_Damping"
+ label="Breast Physics LeftRight Damping"
+ wearable="physics"
+ edit_group="physics_breasts_leftright"
+ value_default=".2"
+ value_min="0"
+ value_max="1">
+ <param_driver />
+ </param>
</driver_parameters>
diff --git a/indra/newview/featuretable.txt b/indra/newview/featuretable.txt
index a95abd7dd1..76bb2b0976 100644
--- a/indra/newview/featuretable.txt
+++ b/indra/newview/featuretable.txt
@@ -1,6 +1,10 @@
-version 25
+version 32
+// The version number above should be implemented IF AND ONLY IF some
+// change has been made that is sufficiently important to justify
+// resetting the graphics preferences of all users to the recommended
+// defaults. This should be as rare an event as we can manage.
-// NOTE: This is mostly identical to featuretable_mac.txt with a few differences
+// NOTE: This is mostly identical to featuretable_mac.txt with a few differences
// Should be combined into one table
//
@@ -26,6 +30,7 @@ list all
RenderAnisotropic 1 1
RenderAvatarCloth 1 1
RenderAvatarLODFactor 1 1.0
+RenderAvatarPhysicsLODFactor 1 1.0
RenderAvatarMaxVisible 1 12
RenderAvatarVP 1 1
RenderCubeMap 1 1
@@ -37,8 +42,8 @@ RenderGamma 1 0
RenderGlowResolutionPow 1 9
RenderGround 1 1
RenderMaxPartCount 1 8192
-RenderNightBrightness 1 1.0
RenderObjectBump 1 1
+RenderLocalLights 1 1
RenderReflectionDetail 1 4
RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
@@ -46,6 +51,7 @@ RenderTransparentWater 1 1
RenderTreeLODFactor 1 1.0
RenderUseImpostors 1 1
RenderVBOEnable 1 1
+RenderVBOMappingDisable 1 1
RenderVolumeLODFactor 1 2.0
UseStartScreen 1 1
UseOcclusion 1 1
@@ -56,13 +62,14 @@ Disregard128DefaultDrawDistance 1 1
Disregard96DefaultDrawDistance 1 1
RenderTextureMemoryMultiple 1 1.0
RenderShaderLightingMaxLevel 1 3
-SkyUseClassicClouds 1 1
-RenderDeferred 1 0
-RenderDeferredSSAO 1 0
-RenderShadowDetail 1 0
+RenderDeferred 1 1
+RenderDeferredSSAO 1 1
+RenderShadowDetail 1 2
WatchdogDisabled 1 1
RenderUseStreamVBO 1 1
-RenderUseFBO 1 1
+RenderFSAASamples 1 16
+RenderMaxTextureIndex 1 16
+
//
// Low Graphics Settings
@@ -71,6 +78,7 @@ list Low
RenderAnisotropic 1 0
RenderAvatarCloth 1 0
RenderAvatarLODFactor 1 0
+RenderAvatarPhysicsLODFactor 1 0
RenderAvatarMaxVisible 1 3
RenderAvatarVP 1 0
RenderFarClip 1 64
@@ -78,21 +86,21 @@ RenderFlexTimeFactor 1 0
RenderGlowResolutionPow 1 8
RenderMaxPartCount 1 0
RenderObjectBump 1 0
+RenderLocalLights 1 0
RenderReflectionDetail 1 0
RenderTerrainDetail 1 0
RenderTerrainLODFactor 1 1
RenderTransparentWater 1 0
RenderTreeLODFactor 1 0
RenderUseImpostors 1 1
-RenderVolumeLODFactor 1 0.5
+RenderVolumeLODFactor 1 1.125
VertexShaderEnable 1 0
WindLightUseAtmosShaders 1 0
WLSkyDetail 1 48
-SkyUseClassicClouds 1 0
RenderDeferred 1 0
RenderDeferredSSAO 1 0
RenderShadowDetail 1 0
-RenderUseFBO 1 0
+RenderFSAASamples 1 0
//
// Mid Graphics Settings
@@ -101,12 +109,14 @@ list Mid
RenderAnisotropic 1 0
RenderAvatarCloth 1 0
RenderAvatarLODFactor 1 0.5
+RenderAvatarPhysicsLODFactor 1 0.75
RenderAvatarVP 1 1
RenderFarClip 1 96
RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 8
RenderMaxPartCount 1 2048
RenderObjectBump 1 1
+RenderLocalLights 1 1
RenderReflectionDetail 1 0
RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 1.0
@@ -120,7 +130,7 @@ WLSkyDetail 1 48
RenderDeferred 1 0
RenderDeferredSSAO 1 0
RenderShadowDetail 1 0
-RenderUseFBO 1 0
+RenderFSAASamples 1 0
//
// High Graphics Settings (purty)
@@ -129,13 +139,15 @@ list High
RenderAnisotropic 1 1
RenderAvatarCloth 1 0
RenderAvatarLODFactor 1 1.0
+RenderAvatarPhysicsLODFactor 1 1.0
RenderAvatarVP 1 1
RenderFarClip 1 128
RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 9
RenderMaxPartCount 1 4096
RenderObjectBump 1 1
-RenderReflectionDetail 1 2
+RenderLocalLights 1 1
+RenderReflectionDetail 1 0
RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
@@ -148,7 +160,7 @@ WLSkyDetail 1 48
RenderDeferred 1 0
RenderDeferredSSAO 1 0
RenderShadowDetail 1 0
-RenderUseFBO 1 0
+RenderFSAASamples 1 2
//
// Ultra graphics (REALLY PURTY!)
@@ -163,6 +175,7 @@ RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 9
RenderMaxPartCount 1 8192
RenderObjectBump 1 1
+RenderLocalLights 1 1
RenderReflectionDetail 1 4
RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
@@ -173,10 +186,11 @@ RenderVolumeLODFactor 1 2.0
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
WLSkyDetail 1 128
-RenderDeferred 1 0
-RenderDeferredSSAO 1 0
-RenderShadowDetail 1 0
-RenderUseFBO 1 0
+RenderDeferred 1 1
+RenderDeferredSSAO 1 1
+RenderShadowDetail 1 2
+RenderFSAASamples 1 2
+
//
// Class Unknown Hardware (unknown)
@@ -235,6 +249,13 @@ RenderDeferredSSAO 0 0
RenderShadowDetail 0 0
//
+// GL_ARB_map_buffer_range exists
+//
+list MapBufferRange
+RenderVBOMappingDisable 1 1
+
+
+//
// "Default" setups for safe, low, medium, high
//
list safe
@@ -242,6 +263,7 @@ RenderAnisotropic 1 0
RenderAvatarCloth 0 0
RenderAvatarVP 0 0
RenderObjectBump 0 0
+RenderLocalLights 1 0
RenderMaxPartCount 1 1024
RenderTerrainDetail 1 0
RenderUseImpostors 0 0
@@ -251,8 +273,8 @@ WindLightUseAtmosShaders 0 0
RenderDeferred 0 0
RenderDeferredSSAO 0 0
RenderShadowDetail 0 0
-RenderUseFBO 1 0
+
//
// CPU based feature masks
//
@@ -273,8 +295,13 @@ RenderObjectBump 0 0
list OpenGLPre15
RenderVBOEnable 1 0
+list OpenGLPre30
+RenderDeferred 0 0
+RenderMaxTextureIndex 1 1
+
list Intel
RenderAnisotropic 1 0
+RenderVBOEnable 1 0
list GeForce2
RenderAnisotropic 1 0
@@ -459,6 +486,10 @@ RenderAvatarCloth 0 0
list ATI
RenderUseStreamVBO 1 0
+// Disable vertex buffer objects by default for ATI cards with little video memory
+list ATIVramLT256
+RenderVBOEnable 1 0
+
/// Tweaked NVIDIA
list NVIDIA_GeForce_FX_5100
@@ -558,3 +589,4 @@ list NVIDIA_GeForce_Go_7800
RenderShaderLightingMaxLevel 1 2
list NVIDIA_GeForce_Go_7900
RenderShaderLightingMaxLevel 1 2
+
diff --git a/indra/newview/featuretable_linux.txt b/indra/newview/featuretable_linux.txt
index a52b32355d..5e217e000a 100644
--- a/indra/newview/featuretable_linux.txt
+++ b/indra/newview/featuretable_linux.txt
@@ -1,4 +1,8 @@
-version 22
+version 27
+// The version number above should be implemented IF AND ONLY IF some
+// change has been made that is sufficiently important to justify
+// resetting the graphics preferences of all users to the recommended
+// defaults. This should be as rare an event as we can manage.
// NOTE: This is mostly identical to featuretable_mac.txt with a few differences
// Should be combined into one table
@@ -26,6 +30,7 @@ list all
RenderAnisotropic 1 1
RenderAvatarCloth 1 1
RenderAvatarLODFactor 1 1.0
+RenderAvatarPhysicsLODFactor 1 1.0
RenderAvatarMaxVisible 1 12
RenderAvatarVP 1 1
RenderCubeMap 1 1
@@ -36,8 +41,8 @@ RenderFogRatio 1 4.0
RenderGamma 1 0
RenderGlowResolutionPow 1 9
RenderGround 1 1
+RenderLocalLights 1 1
RenderMaxPartCount 1 8192
-RenderNightBrightness 1 1.0
RenderObjectBump 1 1
RenderReflectionDetail 1 4
RenderTerrainDetail 1 1
@@ -46,6 +51,7 @@ RenderTransparentWater 1 1
RenderTreeLODFactor 1 1.0
RenderUseImpostors 1 1
RenderVBOEnable 1 1
+RenderVBOMappingDisable 1 1
RenderVolumeLODFactor 1 2.0
UseStartScreen 1 1
UseOcclusion 1 1
@@ -55,13 +61,12 @@ WLSkyDetail 1 128
Disregard128DefaultDrawDistance 1 1
Disregard96DefaultDrawDistance 1 1
RenderTextureMemoryMultiple 1 1.0
-SkyUseClassicClouds 1 1
RenderShaderLightingMaxLevel 1 3
-RenderDeferred 1 0
-RenderDeferredSSAO 1 0
-RenderShadowDetail 1 0
-WatchdogDisabled 1 1
-RenderUseFBO 1 1
+RenderDeferred 1 1
+RenderDeferredSSAO 1 1
+RenderShadowDetail 1 2
+RenderFSAASamples 1 16
+RenderMaxTextureIndex 1 16
//
// Low Graphics Settings
@@ -70,11 +75,13 @@ list Low
RenderAnisotropic 1 0
RenderAvatarCloth 1 0
RenderAvatarLODFactor 1 0
+RenderAvatarPhysicsLODFactor 1 0
RenderAvatarMaxVisible 1 3
RenderAvatarVP 1 0
RenderFarClip 1 64
RenderFlexTimeFactor 1 0
RenderGlowResolutionPow 1 8
+RenderLocalLights 1 0
RenderMaxPartCount 1 0
RenderObjectBump 1 0
RenderReflectionDetail 1 0
@@ -87,11 +94,10 @@ RenderVolumeLODFactor 1 0.5
VertexShaderEnable 1 0
WindLightUseAtmosShaders 1 0
WLSkyDetail 1 48
-SkyUseClassicClouds 1 0
RenderDeferred 1 0
RenderDeferredSSAO 1 0
RenderShadowDetail 1 0
-RenderUseFBO 1 0
+RenderFSAASamples 1 0
//
// Mid Graphics Settings
@@ -100,10 +106,12 @@ list Mid
RenderAnisotropic 1 0
RenderAvatarCloth 1 0
RenderAvatarLODFactor 1 0.5
+RenderAvatarPhysicsLODFactor 1 0.75
RenderAvatarVP 1 1
RenderFarClip 1 96
RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 8
+RenderLocalLights 1 1
RenderMaxPartCount 1 2048
RenderObjectBump 1 1
RenderReflectionDetail 1 0
@@ -119,7 +127,7 @@ WLSkyDetail 1 48
RenderDeferred 1 0
RenderDeferredSSAO 1 0
RenderShadowDetail 1 0
-RenderUseFBO 1 0
+RenderFSAASamples 1 0
//
// High Graphics Settings (purty)
@@ -128,13 +136,15 @@ list High
RenderAnisotropic 1 1
RenderAvatarCloth 1 0
RenderAvatarLODFactor 1 1.0
+RenderAvatarPhysicsLODFactor 1 1.0
RenderAvatarVP 1 1
RenderFarClip 1 128
RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 9
+RenderLocalLights 1 1
RenderMaxPartCount 1 4096
RenderObjectBump 1 1
-RenderReflectionDetail 1 2
+RenderReflectionDetail 1 0
RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
@@ -147,7 +157,7 @@ WLSkyDetail 1 48
RenderDeferred 1 0
RenderDeferredSSAO 1 0
RenderShadowDetail 1 0
-RenderUseFBO 1 0
+RenderFSAASamples 1 2
//
// Ultra graphics (REALLY PURTY!)
@@ -156,10 +166,12 @@ list Ultra
RenderAnisotropic 1 1
RenderAvatarCloth 1 1
RenderAvatarLODFactor 1 1.0
+RenderAvatarPhysicsLODFactor 1 1.0
RenderAvatarVP 1 1
RenderFarClip 1 256
RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 9
+RenderLocalLights 1 1
RenderMaxPartCount 1 8192
RenderObjectBump 1 1
RenderReflectionDetail 1 4
@@ -172,10 +184,10 @@ RenderVolumeLODFactor 1 2.0
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
WLSkyDetail 1 128
-RenderDeferred 1 0
-RenderDeferredSSAO 1 0
-RenderShadowDetail 1 0
-RenderUseFBO 1 0
+RenderDeferred 1 1
+RenderDeferredSSAO 1 1
+RenderShadowDetail 1 2
+RenderFSAASamples 1 2
//
// Class Unknown Hardware (unknown)
@@ -233,6 +245,13 @@ RenderDeferred 0 0
RenderDeferredSSAO 0 0
RenderShadowDetail 0 0
+//
+// GL_ARB_map_buffer_range exists
+//
+list MapBufferRange
+RenderVBOMappingDisable 1 1
+
+
// "Default" setups for safe, low, medium, high
//
@@ -250,7 +269,6 @@ WindLightUseAtmosShaders 0 0
RenderDeferred 0 0
RenderDeferredSSAO 0 0
RenderShadowDetail 0 0
-RenderUseFBO 1 0
//
diff --git a/indra/newview/featuretable_mac.txt b/indra/newview/featuretable_mac.txt
index 6dabef53a8..915a012a39 100644
--- a/indra/newview/featuretable_mac.txt
+++ b/indra/newview/featuretable_mac.txt
@@ -1,4 +1,8 @@
-version 22
+version 32
+// The version number above should be implemented IF AND ONLY IF some
+// change has been made that is sufficiently important to justify
+// resetting the graphics preferences of all users to the recommended
+// defaults. This should be as rare an event as we can manage.
// NOTE: This is mostly identical to featuretable_mac.txt with a few differences
// Should be combined into one table
@@ -24,10 +28,11 @@ version 22
//
list all
RenderAnisotropic 1 0
-RenderAvatarCloth 0 0
+RenderAvatarCloth 1 1
RenderAvatarLODFactor 1 1.0
+RenderAvatarPhysicsLODFactor 1 1.0
RenderAvatarMaxVisible 1 12
-RenderAvatarVP 1 0
+RenderAvatarVP 1 1
RenderCubeMap 1 1
RenderDelayVBUpdate 1 0
RenderFarClip 1 256
@@ -36,32 +41,34 @@ RenderFogRatio 1 4.0
RenderGamma 1 0
RenderGlowResolutionPow 1 9
RenderGround 1 1
-RenderLightingDetail 1 1
+RenderLocalLights 1 1
RenderMaxPartCount 1 8192
-RenderNightBrightness 1 1.0
RenderObjectBump 1 1
-RenderReflectionDetail 1 3
+RenderReflectionDetail 1 4
RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 1.0
RenderUseImpostors 1 1
RenderVBOEnable 1 1
+RenderVBOMappingDisable 1 1
RenderVolumeLODFactor 1 2.0
-RenderWaterReflections 1 1
+UseStartScreen 1 1
UseOcclusion 1 1
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
WLSkyDetail 1 128
-RenderUseCleverUI 1 1
Disregard128DefaultDrawDistance 1 1
Disregard96DefaultDrawDistance 1 1
RenderTextureMemoryMultiple 1 0.5
-Disregard128DefaultDrawDistance 1 1
-Disregard96DefaultDrawDistance 1 1
-SkyUseClassicClouds 1 1
+RenderShaderLightingMaxLevel 1 3
+RenderDeferred 1 1
+RenderDeferredSSAO 1 1
+RenderShadowDetail 1 2
WatchdogDisabled 1 1
-RenderUseFBO 1 1
+RenderUseStreamVBO 1 1
+RenderFSAASamples 1 16
+RenderMaxTextureIndex 1 16
//
// Low Graphics Settings
@@ -70,12 +77,13 @@ list Low
RenderAnisotropic 1 0
RenderAvatarCloth 1 0
RenderAvatarLODFactor 1 0
+RenderAvatarPhysicsLODFactor 1 0
RenderAvatarMaxVisible 1 3
RenderAvatarVP 1 0
RenderFarClip 1 64
RenderFlexTimeFactor 1 0
RenderGlowResolutionPow 1 8
-RenderLightingDetail 1 0
+RenderLocalLights 1 0
RenderMaxPartCount 1 0
RenderObjectBump 1 0
RenderReflectionDetail 1 0
@@ -85,12 +93,13 @@ RenderTransparentWater 1 0
RenderTreeLODFactor 1 0
RenderUseImpostors 1 1
RenderVolumeLODFactor 1 0.5
-RenderWaterReflections 1 0
VertexShaderEnable 1 0
WindLightUseAtmosShaders 1 0
WLSkyDetail 1 48
-SkyUseClassicClouds 1 0
-RenderUseFBO 1 0
+RenderDeferred 1 0
+RenderDeferredSSAO 1 0
+RenderShadowDetail 1 0
+RenderFSAASamples 1 0
//
// Mid Graphics Settings
@@ -99,11 +108,12 @@ list Mid
RenderAnisotropic 1 0
RenderAvatarCloth 1 0
RenderAvatarLODFactor 1 0.5
+RenderAvatarPhysicsLODFactor 1 0.75
RenderAvatarVP 1 1
RenderFarClip 1 96
RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 8
-RenderLightingDetail 1 1
+RenderLocalLights 1 1
RenderMaxPartCount 1 2048
RenderObjectBump 1 1
RenderReflectionDetail 1 0
@@ -113,11 +123,13 @@ RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
RenderUseImpostors 1 1
RenderVolumeLODFactor 1 1.125
-RenderWaterReflections 1 0
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 0
WLSkyDetail 1 48
-RenderUseFBO 1 0
+RenderDeferred 1 0
+RenderDeferredSSAO 1 0
+RenderShadowDetail 1 0
+RenderFSAASamples 1 0
//
// High Graphics Settings (purty)
@@ -126,25 +138,28 @@ list High
RenderAnisotropic 1 1
RenderAvatarCloth 1 0
RenderAvatarLODFactor 1 1.0
+RenderAvatarPhysicsLODFactor 1 1.0
RenderAvatarVP 1 1
RenderFarClip 1 128
RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 9
-RenderLightingDetail 1 1
+RenderLocalLights 1 1
RenderMaxPartCount 1 4096
RenderObjectBump 1 1
-RenderReflectionDetail 1 2
+RenderReflectionDetail 1 0
RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
RenderUseImpostors 1 1
RenderVolumeLODFactor 1 1.125
-RenderWaterReflections 1 0
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
WLSkyDetail 1 48
-RenderUseFBO 1 0
+RenderDeferred 1 0
+RenderDeferredSSAO 1 0
+RenderShadowDetail 1 2
+RenderFSAASamples 1 2
//
// Ultra graphics (REALLY PURTY!)
@@ -153,25 +168,28 @@ list Ultra
RenderAnisotropic 1 1
RenderAvatarCloth 1 1
RenderAvatarLODFactor 1 1.0
+RenderAvatarPhysicsLODFactor 1 1.0
RenderAvatarVP 1 1
RenderFarClip 1 256
RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 9
-RenderLightingDetail 1 1
+RenderLocalLights 1 1
RenderMaxPartCount 1 8192
RenderObjectBump 1 1
-RenderReflectionDetail 1 3
+RenderReflectionDetail 1 4
RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
RenderTreeLODFactor 1 1.0
RenderUseImpostors 1 1
RenderVolumeLODFactor 1 2.0
-RenderWaterReflections 1 1
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
WLSkyDetail 1 128
-RenderUseFBO 1 0
+RenderDeferred 1 0
+RenderDeferredSSAO 1 0
+RenderShadowDetail 1 2
+RenderFSAASamples 1 2
//
// Class Unknown Hardware (unknown)
@@ -209,9 +227,12 @@ RenderVBOEnable 1 1
list NoPixelShaders
RenderAvatarVP 0 0
RenderAvatarCloth 0 0
-RenderWaterReflections 0 0
+RenderReflectionDetail 0 0
VertexShaderEnable 0 0
WindLightUseAtmosShaders 0 0
+RenderDeferred 0 0
+RenderDeferredSSAO 0 0
+RenderShadowDetail 0 0
//
// No Vertex Shaders available
@@ -219,25 +240,31 @@ WindLightUseAtmosShaders 0 0
list NoVertexShaders
RenderAvatarVP 0 0
RenderAvatarCloth 0 0
-RenderWaterReflections 0 0
+RenderReflectionDetail 0 0
VertexShaderEnable 0 0
WindLightUseAtmosShaders 0 0
+RenderDeferred 0 0
+RenderDeferredSSAO 0 0
+RenderShadowDetail 0 0
+//
// "Default" setups for safe, low, medium, high
//
list safe
RenderAnisotropic 1 0
RenderAvatarCloth 0 0
RenderAvatarVP 0 0
-RenderLightingDetail 1 0
+RenderLocalLights 1 0
RenderObjectBump 0 0
RenderMaxPartCount 1 1024
RenderTerrainDetail 1 0
RenderUseImpostors 0 0
RenderVBOEnable 1 0
-RenderWaterReflections 0 0
+RenderReflectionDetail 0 0
WindLightUseAtmosShaders 0 0
-RenderUseFBO 1 0
+RenderDeferred 0 0
+RenderDeferredSSAO 0 0
+RenderShadowDetail 0 0
//
// CPU based feature masks
@@ -259,13 +286,19 @@ RenderObjectBump 0 0
list OpenGLPre15
RenderVBOEnable 1 0
+list TexUnit8orLess
+RenderDeferredSSAO 0 0
+
+list ATI
+RenderDeferredSSAO 1 0
+
list Intel
RenderAnisotropic 1 0
-RenderLightingDetail 1 0
+RenderLocalLights 1 0
list GeForce2
RenderAnisotropic 1 0
-RenderLightingDetail 1 0
+RenderLocalLights 1 0
RenderMaxPartCount 1 2048
RenderTerrainDetail 1 0
RenderVBOEnable 1 1
@@ -382,37 +415,11 @@ list ATI_Radeon_X1500
Disregard128DefaultDrawDistance 1 0
list ATI_Radeon_X1600
Disregard128DefaultDrawDistance 1 0
-RenderUseFBO 0 0
list ATI_Radeon_X1700
Disregard128DefaultDrawDistance 1 0
list ATI_Mobility_Radeon_X1xxx
Disregard128DefaultDrawDistance 1 0
-
-
-
-// Avatar hardware skinning causes
-// invisible avatars on HD 2600... so I masked
-// out other possible bad ones till it's fixed
-
-list ATI_Radeon_HD_2300
-RenderAvatarVP 0 0
-RenderAvatarCloth 0 0
-Disregard128DefaultDrawDistance 1 0
-list ATI_Radeon_HD_2400
-RenderAvatarVP 0 0
-RenderAvatarCloth 0 0
-Disregard128DefaultDrawDistance 1 0
-list ATI_Radeon_HD_2600
-RenderAvatarVP 0 0
-RenderAvatarCloth 0 0
-list ATI_Radeon_HD_2900
-RenderAvatarVP 0 0
-RenderAvatarCloth 0 0
-list ATI_Radeon_HD_3800
-RenderAvatarVP 0 0
-RenderAvatarCloth 0 0
-
/// Tweaked NVIDIA
list NVIDIA_GeForce_FX_5100
diff --git a/indra/newview/featuretable_solaris.txt b/indra/newview/featuretable_solaris.txt
index 7df75687f2..e7cae1abdc 100644
--- a/indra/newview/featuretable_solaris.txt
+++ b/indra/newview/featuretable_solaris.txt
@@ -1,4 +1,8 @@
version 15
+// The version number above should be implemented IF AND ONLY IF some
+// change has been made that is sufficiently important to justify
+// resetting the graphics preferences of all users to the recommended
+// defaults. This should be as rare an event as we can manage.
// NOTE: This is mostly identical to featuretable.txt with a few differences
// Should be combined into one table
diff --git a/indra/newview/featuretable_xp.txt b/indra/newview/featuretable_xp.txt
index a09ba17c62..ae2cf910f2 100644
--- a/indra/newview/featuretable_xp.txt
+++ b/indra/newview/featuretable_xp.txt
@@ -1,4 +1,8 @@
-version 25
+version 31
+// The version number above should be implemented IF AND ONLY IF some
+// change has been made that is sufficiently important to justify
+// resetting the graphics preferences of all users to the recommended
+// defaults. This should be as rare an event as we can manage.
// NOTE: This is mostly identical to featuretable_mac.txt with a few differences
// Should be combined into one table
@@ -26,6 +30,7 @@ list all
RenderAnisotropic 1 1
RenderAvatarCloth 1 1
RenderAvatarLODFactor 1 1.0
+RenderAvatarPhysicsLODFactor 1 1.0
RenderAvatarMaxVisible 1 12
RenderAvatarVP 1 1
RenderCubeMap 1 1
@@ -36,8 +41,8 @@ RenderFogRatio 1 4.0
RenderGamma 1 0
RenderGlowResolutionPow 1 9
RenderGround 1 1
+RenderLocalLights 1 1
RenderMaxPartCount 1 8192
-RenderNightBrightness 1 1.0
RenderObjectBump 1 1
RenderReflectionDetail 1 4
RenderTerrainDetail 1 1
@@ -46,6 +51,7 @@ RenderTransparentWater 1 1
RenderTreeLODFactor 1 1.0
RenderUseImpostors 1 1
RenderVBOEnable 1 1
+RenderVBOMappingDisable 1 1
RenderVolumeLODFactor 1 2.0
UseStartScreen 1 1
UseOcclusion 1 1
@@ -56,13 +62,13 @@ Disregard128DefaultDrawDistance 1 1
Disregard96DefaultDrawDistance 1 1
RenderTextureMemoryMultiple 1 1.0
RenderShaderLightingMaxLevel 1 3
-SkyUseClassicClouds 1 1
RenderDeferred 1 0
RenderDeferredSSAO 1 0
RenderShadowDetail 1 0
-RenderUseFBO 1 1
WatchdogDisabled 1 1
RenderUseStreamVBO 1 1
+RenderFSAASamples 1 16
+RenderMaxTextureIndex 1 16
//
// Low Graphics Settings
@@ -71,11 +77,13 @@ list Low
RenderAnisotropic 1 0
RenderAvatarCloth 1 0
RenderAvatarLODFactor 1 0
+RenderAvatarPhysicsLODFactor 1 0
RenderAvatarMaxVisible 1 3
RenderAvatarVP 1 0
RenderFarClip 1 64
RenderFlexTimeFactor 1 0
RenderGlowResolutionPow 1 8
+RenderLocalLights 1 0
RenderMaxPartCount 1 0
RenderObjectBump 1 0
RenderReflectionDetail 1 0
@@ -88,11 +96,10 @@ RenderVolumeLODFactor 1 0.5
VertexShaderEnable 1 0
WindLightUseAtmosShaders 1 0
WLSkyDetail 1 48
-SkyUseClassicClouds 1 0
RenderDeferred 1 0
RenderDeferredSSAO 1 0
RenderShadowDetail 1 0
-RenderUseFBO 1 0
+RenderFSAASamples 1 0
//
// Mid Graphics Settings
@@ -101,10 +108,12 @@ list Mid
RenderAnisotropic 1 0
RenderAvatarCloth 1 0
RenderAvatarLODFactor 1 0.5
+RenderAvatarPhysicsLODFactor 1 0.75
RenderAvatarVP 1 1
RenderFarClip 1 96
RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 8
+RenderLocalLights 1 1
RenderMaxPartCount 1 2048
RenderObjectBump 1 1
RenderReflectionDetail 1 0
@@ -120,7 +129,7 @@ WLSkyDetail 1 48
RenderDeferred 1 0
RenderDeferredSSAO 1 0
RenderShadowDetail 1 0
-RenderUseFBO 1 0
+RenderFSAASamples 1 0
//
// High Graphics Settings (purty)
@@ -129,13 +138,15 @@ list High
RenderAnisotropic 1 1
RenderAvatarCloth 1 0
RenderAvatarLODFactor 1 1.0
+RenderAvatarPhysicsLODFactor 1 1.0
RenderAvatarVP 1 1
RenderFarClip 1 128
RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 9
+RenderLocalLights 1 1
RenderMaxPartCount 1 4096
RenderObjectBump 1 1
-RenderReflectionDetail 1 2
+RenderReflectionDetail 1 0
RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTransparentWater 1 1
@@ -147,8 +158,8 @@ WindLightUseAtmosShaders 1 1
WLSkyDetail 1 48
RenderDeferred 1 0
RenderDeferredSSAO 1 0
-RenderShadowDetail 1 0
-RenderUseFBO 1 0
+RenderShadowDetail 1 2
+RenderFSAASamples 1 2
//
// Ultra graphics (REALLY PURTY!)
@@ -157,10 +168,12 @@ list Ultra
RenderAnisotropic 1 1
RenderAvatarCloth 1 1
RenderAvatarLODFactor 1 1.0
+RenderAvatarPhysicsLODFactor 1 1.0
RenderAvatarVP 1 1
RenderFarClip 1 256
RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 9
+RenderLocalLights 1 1
RenderMaxPartCount 1 8192
RenderObjectBump 1 1
RenderReflectionDetail 1 4
@@ -175,8 +188,8 @@ WindLightUseAtmosShaders 1 1
WLSkyDetail 1 128
RenderDeferred 1 0
RenderDeferredSSAO 1 0
-RenderShadowDetail 1 0
-RenderUseFBO 1 0
+RenderShadowDetail 1 2
+RenderFSAASamples 1 2
//
// Class Unknown Hardware (unknown)
@@ -235,6 +248,13 @@ RenderDeferredSSAO 0 0
RenderShadowDetail 0 0
//
+// GL_ARB_map_buffer_range exists
+//
+list MapBufferRange
+RenderVBOMappingDisable 1 1
+
+
+//
// "Default" setups for safe, low, medium, high
//
list safe
@@ -251,7 +271,6 @@ WindLightUseAtmosShaders 0 0
RenderDeferred 0 0
RenderDeferredSSAO 0 0
RenderShadowDetail 0 0
-RenderUseFBO 1 0
//
// CPU based feature masks
@@ -273,8 +292,13 @@ RenderObjectBump 0 0
list OpenGLPre15
RenderVBOEnable 1 0
+list OpenGLPre30
+RenderDeferred 0 0
+RenderMaxTextureIndex 1 1
+
list Intel
RenderAnisotropic 1 0
+RenderVBOEnable 1 0
list GeForce2
RenderAnisotropic 1 0
@@ -460,6 +484,10 @@ RenderAvatarCloth 0 0
list ATI
RenderUseStreamVBO 1 0
+// Disable vertex buffer objects by default for ATI cards with little video memory
+list ATIVramLT256
+RenderVBOEnable 1 0
+
/// Tweaked NVIDIA
list NVIDIA_GeForce_FX_5100
diff --git a/indra/newview/generate_breakpad_symbols.py b/indra/newview/generate_breakpad_symbols.py
index 4fd04d780e..5ebec1563e 100644
--- a/indra/newview/generate_breakpad_symbols.py
+++ b/indra/newview/generate_breakpad_symbols.py
@@ -1,29 +1,31 @@
#!/usr/bin/env python
-# @file generate_breakpad_symbols.py
-# @author Brad Kittenbrink <brad@lindenlab.com>
-# @brief Simple tool for generating google_breakpad symbol information
-# for the crash reporter.
-#
-# $LicenseInfo:firstyear=2010&license=viewerlgpl$
-# Second Life Viewer Source Code
-# Copyright (C) 2010, Linden Research, Inc.
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation;
-# version 2.1 of the License only.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-#
-# Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
-# $/LicenseInfo$
+"""\
+@file generate_breakpad_symbols.py
+@author Brad Kittenbrink <brad@lindenlab.com>
+@brief Simple tool for generating google_breakpad symbol information
+ for the crash reporter.
+
+$LicenseInfo:firstyear=2010&license=viewerlgpl$
+Second Life Viewer Source Code
+Copyright (C) 2010-2011, Linden Research, Inc.
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation;
+version 2.1 of the License only.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+$/LicenseInfo$
+"""
import collections
diff --git a/indra/newview/gpu_table.txt b/indra/newview/gpu_table.txt
index da888bc64d..198e702459 100644
--- a/indra/newview/gpu_table.txt
+++ b/indra/newview/gpu_table.txt
@@ -1,318 +1,535 @@
-//
+//
// Categorizes graphics chips into various classes by name
//
-// The table contains chip names regular expressions to match
+// The table contains regular expressions to match
// against driver strings, a class number, and whether we claim
// to support them or not.
//
+// Case is not significant in either the regular expressions or the
+// driver strings; the recognizer code lowercases both before using
+// them.
+//
+// If you modify this table, use the (perl) gpu_table_tester
+// to compare the results of recognizing known cards (it is easy
+// to mess this up by putting things in the wrong order):
+//
+// perl ../../scripts/gpu_table_tester -g gpu_table.txt tests/gpus_seen.txt | diff - tests/gpus_results.txt
+//
+// Format:
+// Fields are separated by one or more tab (not space) characters
+// <recognizer name> <regular expression> <class> <supported>
+//
// Class Numbers:
-// 0 - Defaults to low graphics settings. No shaders on by default
-// 1 - Defaults to mid graphics settings. Basic shaders on by default
-// 2 - Defaults to high graphics settings. Atmospherics on by default.
+// 0 - Defaults to low graphics settings. No shaders on by default
+// 1 - Defaults to mid graphics settings. Basic shaders on by default
+// 2 - Defaults to high graphics settings. Atmospherics on by default.
// 3 - Same as class 2 for now.
//
// Supported Number:
// 0 - We claim to not support this card.
// 1 - We claim to support this card.
//
-// Format:
-// <chip name> <regexp> <class> <supported>
-//
-3Dfx .*3Dfx.* 0 0
-3Dlabs .*3Dlabs.* 0 0
-ATI 3D-Analyze .*ATI.*3D-Analyze.* 0 0
-ATI All-in-Wonder 7500 .*ATI.*All-in-Wonder 75.* 0 1
-ATI All-in-Wonder 8500 .*ATI.*All-in-Wonder 85.* 0 1
-ATI All-in-Wonder 9200 .*ATI.*All-in-Wonder 92.* 0 1
-ATI All-in-Wonder 9xxx .*ATI.*All-in-Wonder 9.* 1 1
-ATI All-in-Wonder HD .*ATI.*All-in-Wonder HD.* 1 1
-ATI All-in-Wonder X600 .*ATI.*All-in-Wonder X6.* 1 1
-ATI All-in-Wonder X800 .*ATI.*All-in-Wonder X8.* 2 1
-ATI All-in-Wonder X1800 .*ATI.*All-in-Wonder X18.* 3 1
-ATI All-in-Wonder X1900 .*ATI.*All-in-Wonder X19.* 3 1
-ATI All-in-Wonder PCI-E .*ATI.*All-in-Wonder.*PCI-E.* 1 1
-ATI All-in-Wonder Radeon .*ATI.*All-in-Wonder Radeon.* 0 1
-ATI ASUS A9xxx .*ATI.*ASUS.*A9.* 1 1
-ATI ASUS AH24xx .*ATI.*ASUS.*AH24.* 1 1
-ATI ASUS AH26xx .*ATI.*ASUS.*AH26.* 3 1
-ATI ASUS AH34xx .*ATI.*ASUS.*AH34.* 1 1
-ATI ASUS AH36xx .*ATI.*ASUS.*AH36.* 3 1
-ATI ASUS AH46xx .*ATI.*ASUS.*AH46.* 3 1
-ATI ASUS AX3xx .*ATI.*ASUS.*AX3.* 1 1
-ATI ASUS AX5xx .*ATI.*ASUS.*AX5.* 1 1
-ATI ASUS AX8xx .*ATI.*ASUS.*AX8.* 2 1
-ATI ASUS EAH24xx .*ATI.*ASUS.*EAH24.* 2 1
-ATI ASUS EAH26xx .*ATI.*ASUS.*EAH26.* 3 1
-ATI ASUS EAH34xx .*ATI.*ASUS.*EAH34.* 1 1
-ATI ASUS EAH36xx .*ATI.*ASUS.*EAH36.* 3 1
-ATI ASUS EAH38xx .*ATI.*ASUS.*EAH38.* 3 1
-ATI ASUS EAH43xx .*ATI.*ASUS.*EAH43.* 1 1
-ATI ASUS EAH45xx .*ATI.*ASUS.*EAH45.* 1 1
-ATI ASUS EAH48xx .*ATI.*ASUS.*EAH48.* 3 1
-ATI ASUS EAH57xx .*ATI.*ASUS.*EAH57.* 3 1
-ATI ASUS EAH58xx .*ATI.*ASUS.*EAH58.* 3 1
-ATI Radeon X1xxx .*ATI.*ASUS.*X1.* 3 1
-ATI Radeon X7xx .*ATI.*ASUS.*X7.* 1 1
-ATI Radeon X500 .*ATI.*Diamond X5.* 1 1
-ATI Radeon X13xx .*ATI.*Diamond X13.* 1 1
-ATI Radeon X16xx .*ATI.*Diamond X16.* 1 1
-ATI Radeon X19xx .*ATI.*Diamond X19.* 1 1
-ATI Display Adapter .*ATI.*display adapter.* 0 1
-ATI FireGL 5200 .*ATI.*FireGL V52.* 0 1
-ATI FireGL 5xxx .*ATI.*FireGL V5.* 1 1
-ATI FireGL .*ATI.*Fire.*GL.* 0 1
-ATI FireMV .*ATI.*FireMV.* 0 0
-ATI Generic .*ATI.*Generic.* 0 0
-ATI Hercules 9800 .*ATI.*Hercules.*9800.* 1 1
-ATI IGP 340M .*ATI.*IGP.*340M.* 0 0
-ATI M52 .*ATI.*M52.* 1 1
-ATI M54 .*ATI.*M54.* 1 1
-ATI M56 .*ATI.*M56.* 1 1
-ATI M71 .*ATI.*M71.* 1 1
-ATI M72 .*ATI.*M72.* 1 1
-ATI M76 .*ATI.*M76.* 3 1
-ATI Mobility Radeon 4100 .*ATI.*Mobility *41.* 0 1
-ATI Mobility Radeon 7xxx .*ATI.*Mobility *Radeon 7.* 0 1
-ATI Mobility Radeon 8xxx .*ATI.*Mobility *Radeon 8.* 0 1
-ATI Mobility Radeon 9800 .*ATI.*Mobility *98.* 0 1
-ATI Mobility Radeon 9700 .*ATI.*Mobility *97.* 0 1
-ATI Mobility Radeon 9600 .*ATI.*Mobility *96.* 0 1
-ATI Mobility Radeon HD 2300 .*ATI.*Mobility *HD *23.* 1 1
-ATI Mobility Radeon HD 2400 .*ATI.*Mobility *HD *24.* 1 1
-ATI Mobility Radeon HD 2600 .*ATI.*Mobility *HD *26.* 3 1
-ATI Mobility Radeon HD 3400 .*ATI.*Mobility *HD *34.* 1 1
-ATI Mobility Radeon HD 3600 .*ATI.*Mobility *HD *36.* 3 1
-ATI Mobility Radeon HD 3800 .*ATI.*Mobility *HD *38.* 3 1
-ATI Mobility Radeon HD 5400 .*ATI.*Mobility *HD *54.* 1 1
-ATI Mobility Radeon HD 5500 .*ATI.*Mobility *HD *55.* 1 1
-ATI Mobility Radeon X1xxx .*ATI.*Mobility *X1.* 0 1
-ATI Mobility Radeon X2xxx .*ATI.*Mobility *X2.* 0 1
-ATI Mobility Radeon X3xx .*ATI.*Mobility *X3.* 1 1
-ATI Mobility Radeon X6xx .*ATI.*Mobility *X6.* 1 1
-ATI Mobility Radeon X7xx .*ATI.*Mobility *X7.* 1 1
-ATI Mobility Radeon Xxxx .*ATI.*Mobility *X.* 0 1
-ATI Radeon HD 2300 .*ATI.*Radeon HD *23.* 0 1
-ATI Radeon HD 2400 .*ATI.*Radeon HD *24.* 1 1
-ATI Radeon HD 2600 .*ATI.*Radeon HD *26.* 2 1
-ATI Radeon HD 2900 .*ATI.*Radeon HD *29.* 3 1
-ATI Radeon HD 3200 .*ATI.*Radeon *HD *32.* 0 1
-ATI Radeon HD 3300 .*ATI.*Radeon HD *33.* 1 1
-ATI Radeon HD 3400 .*ATI.*Radeon HD *34.* 1 1
-ATI Radeon HD 3600 .*ATI.*Radeon HD *36.* 3 1
-ATI Radeon HD 3800 .*ATI.*Radeon HD *38.* 3 1
-ATI Radeon HD 4200 .*ATI.*Radeon HD *42.* 1 1
-ATI Radeon HD 4300 .*ATI.*Radeon HD *43.* 1 1
-ATI Radeon HD 4500 .*ATI.*Radeon HD *45.* 3 1
-ATI Radeon HD 4600 .*ATI.*Radeon HD *46.* 3 1
-ATI Radeon HD 4700 .*ATI.*Radeon HD *47.* 3 1
-ATI Radeon HD 4800 .*ATI.*Radeon.*HD *48.* 3 1
-ATI Radeon HD 5400 .*ATI.*Radeon.*HD *54.* 3 1
-ATI Radeon HD 5500 .*ATI.*Radeon.*HD *55.* 3 1
-ATI Radeon HD 5600 .*ATI.*Radeon.*HD *56.* 3 1
-ATI Radeon HD 5700 .*ATI.*Radeon.*HD *57.* 3 1
-ATI Radeon HD 5800 .*ATI.*Radeon.*HD *58.* 3 1
-ATI Radeon HD 5900 .*ATI.*Radeon.*HD *59.* 3 1
-ATI Radeon OpenGL .*ATI.*Radeon OpenGL.* 0 0
-ATI Radeon 2100 .*ATI.*Radeon 21.* 0 1
-ATI Radeon 3000 .*ATI.*Radeon 30.* 0 1
-ATI Radeon 3100 .*ATI.*Radeon 31.* 0 1
-ATI Radeon 7xxx .*ATI.*Radeon 7.* 0 1
-ATI Radeon 8xxx .*ATI.*Radeon 8.* 0 1
-ATI Radeon 9000 .*ATI.*Radeon 90.* 0 1
-ATI Radeon 9100 .*ATI.*Radeon 91.* 0 1
-ATI Radeon 9200 .*ATI.*Radeon 92.* 0 1
-ATI Radeon 9500 .*ATI.*Radeon 95.* 0 1
-ATI Radeon 9600 .*ATI.*Radeon 96.* 0 1
-ATI Radeon 9700 .*ATI.*Radeon 97.* 1 1
-ATI Radeon 9800 .*ATI.*Radeon 98.* 1 1
-ATI Radeon RV250 .*ATI.*RV250.* 0 1
-ATI Radeon RV600 .*ATI.*RV6.* 1 1
-ATI Radeon RX700 .*ATI.*RX70.* 1 1
-ATI Radeon RX800 .*ATI.*Radeon *RX80.* 2 1
-ATI Radeon RX9550 .*ATI.*RX9550.* 1 1
-ATI Radeon VE .*ATI.*Radeon.*VE.* 0 0
-ATI Radeon X1000 .*ATI.*Radeon *X10.* 0 1
-ATI Radeon X1200 .*ATI.*Radeon *X12.* 0 1
-ATI Radeon X1300 .*ATI.*Radeon *X13.* 1 1
-ATI Radeon X1400 .*ATI.*Radeon *X14.* 1 1
-ATI Radeon X1500 .*ATI.*Radeon *X15.* 1 1
-ATI Radeon X1600 .*ATI.*Radeon *X16.* 1 1
-ATI Radeon X1700 .*ATI.*Radeon *X17.* 1 1
-ATI Radeon X1800 .*ATI.*Radeon *X18.* 3 1
-ATI Radeon X1900 .*ATI.*Radeon *X19.* 3 1
-ATI Radeon X300 .*ATI.*Radeon *X3.* 0 1
-ATI Radeon X400 .*ATI.*Radeon X4.* 0 1
-ATI Radeon X500 .*ATI.*Radeon X5.* 0 1
-ATI Radeon X600 .*ATI.*Radeon X6.* 1 1
-ATI Radeon X700 .*ATI.*Radeon X7.* 1 1
-ATI Radeon X800 .*ATI.*Radeon X8.* 2 1
-ATI Radeon X900 .*ATI.*Radeon X9.* 2 1
-ATI Radeon Xpress .*ATI.*Radeon Xpress.* 0 0
-ATI Rage 128 .*ATI.*Rage 128.* 0 1
-ATI RV250 .*ATI.*RV250.* 0 1
-ATI RV380 .*ATI.*RV380.* 0 1
-ATI RV530 .*ATI.*RV530.* 1 1
-ATI RX700 .*ATI.*RX700.* 1 1
-Intel X3100 .*Intel.*X3100.* 0 1
-Intel 830M .*Intel.*830M 0 0
-Intel 845G .*Intel.*845G 0 0
-Intel 855GM .*Intel.*855GM 0 0
-Intel 865G .*Intel.*865G 0 0
-Intel 900 .*Intel.*900.*900 0 0
-Intel 915GM .*Intel.*915GM 0 0
-Intel 915G .*Intel.*915G 0 0
-Intel 945GM .*Intel.*945GM.* 0 1
-Intel 945G .*Intel.*945G.* 0 1
-Intel 950 .*Intel.*950.* 0 1
-Intel 965 .*Intel.*965.* 0 1
-Intel G33 .*Intel.*G33.* 0 0
-Intel G41 .*Intel.*G41.* 0 1
-Intel G45 .*Intel.*G45.* 0 1
-Intel Bear Lake .*Intel.*Bear Lake.* 0 0
-Intel Broadwater .*Intel.*Broadwater.* 0 0
-Intel Brookdale .*Intel.*Brookdale.* 0 0
-Intel Cantiga .*Intel.*Cantiga.* 0 0
-Intel Eaglelake .*Intel.*Eaglelake.* 0 1
-Intel Graphics Media HD .*Intel(R) Graphics Media.*HD.* 0 1
-Intel HD Graphics .*Intel(R) HD Graphics.* 0 1
-Intel Mobile 4 Series .*Intel.*Mobile.*4 Series.* 0 1
-Intel Media Graphics HD .*Intel Media Graphics HD.* 0 1
-Intel Montara .*Intel.*Montara.* 0 0
-Intel Pineview .*Intel.*Pineview.* 0 1
-Intel Springdale .*Intel.*Springdale.* 0 0
-Matrox .*Matrox.* 0 0
-Mesa .*Mesa.* 0 0
-NVIDIA 310M .*NVIDIA.*GeForce 310M.* 0 1
-NVIDIA 310 .*NVIDIA.*GeForce 310.* 0 1
-NVIDIA 320M .*NVIDIA.*GeForce 320M.* 0 1
-NVIDIA G100M .*NVIDIA.*GeForce G *100M.* 0 1
-NVIDIA G102M .*NVIDIA.*GeForce G *102M.* 0 1
-NVIDIA G103M .*NVIDIA.*GeForce G *103M.* 0 1
-NVIDIA G105M .*NVIDIA.*GeForce G *105M.* 0 1
-NVIDIA G210M .*NVIDIA.*GeForce G210M.* 0 1
-NVIDIA GT 120 .*NVIDIA.*GeForce GT 12.* 1 1
-NVIDIA GT 130 .*NVIDIA.*GeForce GT 13.* 1 1
-NVIDIA GT 220 .*NVIDIA.*GeForce GT 22.* 1 1
-NVIDIA GT 230 .*NVIDIA.*GeForce GT 23.* 1 1
-NVIDIA GT 240 .*NVIDIA.*GeForce GT 24.* 1 1
-NVIDIA GT 320 .*NVIDIA.*GeForce GT 32.* 0 1
-NVIDIA GT 330M .*NVIDIA.*GeForce GT 330M.* 1 1
-NVIDIA GTS 240 .*NVIDIA.*GeForce GTS 24.* 1 1
-NVIDIA GTS 250 .*NVIDIA.*GeForce GTS 25.* 3 1
-NVIDIA GTS 360M .*NVIDIA.*GeForce GTS 360M.* 3 1
-NVIDIA GTX 260 .*NVIDIA.*GeForce GTX 26.* 3 1
-NVIDIA GTX 270 .*NVIDIA.*GeForce GTX 27.* 3 1
-NVIDIA GTX 280 .*NVIDIA.*GeForce GTX 28.* 3 1
-NVIDIA GTX 290 .*NVIDIA.*GeForce GTX 29.* 3 1
-NVIDIA GTX 470 .*NVIDIA.*GeForce GTX 47.* 3 1
-NVIDIA GTX 480 .*NVIDIA.*GeForce GTX 48.* 3 1
-NVIDIA C51 .*NVIDIA.*C51.* 0 1
-NVIDIA G72 .*NVIDIA.*G72.* 1 1
-NVIDIA G73 .*NVIDIA.*G73.* 1 1
-NVIDIA G84 .*NVIDIA.*G84.* 3 1
-NVIDIA G86 .*NVIDIA.*G86.* 3 1
-NVIDIA G92 .*NVIDIA.*G92.* 3 1
-NVIDIA GeForce .*GeForce 256.* 0 0
-NVIDIA GeForce 2 .*GeForce2.* 0 1
-NVIDIA GeForce 3 .*GeForce3.* 0 1
-NVIDIA GeForce 4 Go .*NVIDIA.*GeForce4.*Go.* 0 1
-NVIDIA GeForce 4 MX .*NVIDIA.*GeForce4 MX.* 0 1
-NVIDIA GeForce 4 Ti .*NVIDIA.*GeForce4 Ti.* 0 1
-NVIDIA GeForce 6100 .*NVIDIA.*GeForce 61.* 0 1
-NVIDIA GeForce 6200 .*NVIDIA.*GeForce 62.* 0 1
-NVIDIA GeForce 6500 .*NVIDIA.*GeForce 65.* 0 1
-NVIDIA GeForce 6600 .*NVIDIA.*GeForce 66.* 1 1
-NVIDIA GeForce 6700 .*NVIDIA.*GeForce 67.* 2 1
-NVIDIA GeForce 6800 .*NVIDIA.*GeForce 68.* 2 1
-NVIDIA GeForce 7000 .*NVIDIA.*GeForce 70.* 0 1
-NVIDIA GeForce 7100 .*NVIDIA.*GeForce 71.* 0 1
-NVIDIA GeForce 7200 .*NVIDIA.*GeForce 72.* 1 1
-NVIDIA GeForce 7300 .*NVIDIA.*GeForce 73.* 1 1
-NVIDIA GeForce 7500 .*NVIDIA.*GeForce 75.* 1 1
-NVIDIA GeForce 7600 .*NVIDIA.*GeForce 76.* 1 1
-NVIDIA GeForce 7800 .*NVIDIA.*GeForce 78.* 1 1
-NVIDIA GeForce 7900 .*NVIDIA.*GeForce 79.* 1 1
-NVIDIA GeForce 8100 .*NVIDIA.*GeForce 81.* 1 1
-NVIDIA GeForce 8200 .*NVIDIA.*GeForce 82.* 1 1
-NVIDIA GeForce 8300 .*NVIDIA.*GeForce 83.* 1 1
-NVIDIA GeForce 8400 .*NVIDIA.*GeForce 84.* 1 1
-NVIDIA GeForce 8500 .*GeForce 85.* 1 1
-NVIDIA GeForce 8600M .*NVIDIA.*GeForce.*8600M.* 1 1
-NVIDIA GeForce 8600 .*NVIDIA.*GeForce 86.* 3 1
-NVIDIA GeForce 8700 .*NVIDIA.*GeForce 87.* 3 1
-NVIDIA GeForce 8800 .*NVIDIA.*GeForce 88.* 3 1
-NVIDIA GeForce 9100 .*NVIDIA.*GeForce 9100.* 0 1
-NVIDIA GeForce 9200 .*NVIDIA.*GeForce 9200.* 0 1
-NVIDIA GeForce 9300M .*NVIDIA.*GeForce 9300M.* 1 1
-NVIDIA GeForce 9400M .*NVIDIA.*GeForce 9400M.* 1 1
-NVIDIA GeForce 9500M .*NVIDIA.*GeForce 9500M.* 2 1
-NVIDIA GeForce 9600M .*NVIDIA.*GeForce 9600M.* 3 1
-NVIDIA GeForce 9700M .*NVIDIA.*GeForce 9700M.* 3 1
-NVIDIA GeForce 9300 .*NVIDIA.*GeForce 93.* 1 1
-NVIDIA GeForce 9400 .*GeForce 94.* 1 1
-NVIDIA GeForce 9500 .*NVIDIA.*GeForce 95.* 2 1
-NVIDIA GeForce 9600 .*NVIDIA.*GeForce.*96.* 3 1
-NVIDIA GeForce 9800 .*NVIDIA.*GeForce.*98.* 3 1
-NVIDIA GeForce FX 5100 .*NVIDIA.*GeForce FX 51.* 0 1
-NVIDIA GeForce FX 5200 .*NVIDIA.*GeForce FX 52.* 0 1
-NVIDIA GeForce FX 5500 .*NVIDIA.*GeForce FX 55.* 0 1
-NVIDIA GeForce FX 5600 .*NVIDIA.*GeForce FX 56.* 0 1
-NVIDIA GeForce FX 5700 .*NVIDIA.*GeForce FX 57.* 1 1
-NVIDIA GeForce FX 5800 .*NVIDIA.*GeForce FX 58.* 1 1
-NVIDIA GeForce FX 5900 .*NVIDIA.*GeForce FX 59.* 1 1
-NVIDIA GeForce FX Go5100 .*NVIDIA.*GeForce FX Go51.* 0 1
-NVIDIA GeForce FX Go5200 .*NVIDIA.*GeForce FX Go52.* 0 1
-NVIDIA GeForce FX Go5300 .*NVIDIA.*GeForce FX Go53.* 0 1
-NVIDIA GeForce FX Go5500 .*NVIDIA.*GeForce FX Go55.* 0 1
-NVIDIA GeForce FX Go5600 .*NVIDIA.*GeForce FX Go56.* 0 1
-NVIDIA GeForce FX Go5700 .*NVIDIA.*GeForce FX Go57.* 1 1
-NVIDIA GeForce FX Go5800 .*NVIDIA.*GeForce FX Go58.* 1 1
-NVIDIA GeForce FX Go5900 .*NVIDIA.*GeForce FX Go59.* 1 1
-NVIDIA GeForce Go 6100 .*NVIDIA.*GeForce Go 61.* 0 1
-NVIDIA GeForce Go 6200 .*NVIDIA.*GeForce Go 62.* 0 1
-NVIDIA GeForce Go 6500 .*NVIDIA.*GeForce Go 65.* 1 1
-NVIDIA GeForce Go 6600 .*NVIDIA.*GeForce Go 66.* 1 1
-NVIDIA GeForce Go 6700 .*NVIDIA.*GeForce Go 67.* 1 1
-NVIDIA GeForce Go 6800 .*NVIDIA.*GeForce Go 68.* 1 1
-NVIDIA GeForce Go 7200 .*NVIDIA.*GeForce Go 72.* 1 1
-NVIDIA GeForce Go 7300 .*NVIDIA.*GeForce Go 73.* 1 1
-NVIDIA GeForce Go 7300 LE .*NVIDIA.*GeForce Go 73.*LE.* 0 1
-NVIDIA GeForce Go 7400 .*NVIDIA.*GeForce Go 74.* 1 1
-NVIDIA GeForce Go 7600 .*NVIDIA.*GeForce Go 76.* 2 1
-NVIDIA GeForce Go 7700 .*NVIDIA.*GeForce Go 77.* 2 1
-NVIDIA GeForce Go 7800 .*NVIDIA.*GeForce Go 78.* 2 1
-NVIDIA GeForce Go 7900 .*NVIDIA.*GeForce Go 79.* 2 1
-NVIDIA D9M .*D9M.* 1 1
-NVIDIA G84 .*G84.* 1 1
-NVIDIA G92 .*G92.* 3 1
-NVIDIA G94 .*G94.* 3 1
-NVIDIA GeForce Go 6 .*GeForce Go 6.* 1 1
-NVIDIA ION .*NVIDIA ION.* 1 1
-NVIDIA NB9M .*GeForce NB9M.* 1 1
-NVIDIA NB9P .*GeForce NB9P.* 1 1
-NVIDIA GeForce PCX .*GeForce PCX.* 0 1
-NVIDIA Generic .*NVIDIA.*Unknown.* 0 0
-NVIDIA NV17 .*GeForce NV17.* 0 1
-NVIDIA NV34 .*NVIDIA.*NV34.* 0 1
-NVIDIA NV35 .*NVIDIA.*NV35.* 0 1
-NVIDIA NV36 .*GeForce NV36.* 1 1
-NVIDIA NV43 .*NVIDIA.*NV43.* 1 1
-NVIDIA NV44 .*NVIDIA.*NV44.* 1 1
-NVIDIA nForce .*NVIDIA.*nForce.* 0 0
-NVIDIA MCP78 .*NVIDIA.*MCP78.* 1 1
-NVIDIA Quadro2 .*Quadro2.* 0 1
-NVIDIA Quadro4 .*Quadro4.* 0 1
-NVIDIA Quadro DCC .*Quadro DCC.* 0 1
-NVIDIA Quadro FX 4500 .*Quadro.*FX.*4500.* 3 1
-NVIDIA Quadro FX .*Quadro FX.* 1 1
-NVIDIA Quadro NVS .*Quadro NVS.* 0 1
-NVIDIA RIVA TNT .*RIVA TNT.* 0 0
-S3 .*S3 Graphics.* 0 0
-SiS SiS.* 0 0
-Trident Trident.* 0 0
-Tungsten Graphics Tungsten.* 0 0
-XGI XGI.* 0 0
-VIA VIA.* 0 0
-Apple Generic Apple.*Generic.* 0 0
-Apple Software Renderer Apple.*Software Renderer.* 0 0
+3Dfx .*3Dfx.* 0 0
+3Dlabs .*3Dlabs.* 0 0
+ATI 3D-Analyze .*ATI.*3D-Analyze.* 0 0
+ATI All-in-Wonder 7500 .*ATI.*All-in-Wonder 75.* 0 1
+ATI All-in-Wonder 8500 .*ATI.*All-in-Wonder 85.* 0 1
+ATI All-in-Wonder 9200 .*ATI.*All-in-Wonder 92.* 0 1
+ATI All-in-Wonder 9xxx .*ATI.*All-in-Wonder 9.* 1 1
+ATI All-in-Wonder HD .*ATI.*All-in-Wonder HD.* 1 1
+ATI All-in-Wonder X600 .*ATI.*All-in-Wonder X6.* 1 1
+ATI All-in-Wonder X800 .*ATI.*All-in-Wonder X8.* 2 1
+ATI All-in-Wonder X1800 .*ATI.*All-in-Wonder X18.* 3 1
+ATI All-in-Wonder X1900 .*ATI.*All-in-Wonder X19.* 3 1
+ATI All-in-Wonder PCI-E .*ATI.*All-in-Wonder.*PCI-E.* 1 1
+ATI All-in-Wonder Radeon .*ATI.*All-in-Wonder Radeon.* 0 1
+ATI ASUS ARES .*ATI.*ASUS.*ARES.* 3 1
+ATI ASUS A9xxx .*ATI.*ASUS.*A9.* 1 1
+ATI ASUS AH24xx .*ATI.*ASUS.*AH24.* 1 1
+ATI ASUS AH26xx .*ATI.*ASUS.*AH26.* 3 1
+ATI ASUS AH34xx .*ATI.*ASUS.*AH34.* 1 1
+ATI ASUS AH36xx .*ATI.*ASUS.*AH36.* 3 1
+ATI ASUS AH46xx .*ATI.*ASUS.*AH46.* 3 1
+ATI ASUS AX3xx .*ATI.*ASUS.*AX3.* 1 1
+ATI ASUS AX5xx .*ATI.*ASUS.*AX5.* 1 1
+ATI ASUS AX8xx .*ATI.*ASUS.*AX8.* 2 1
+ATI ASUS EAH24xx .*ATI.*ASUS.*EAH24.* 2 1
+ATI ASUS EAH26xx .*ATI.*ASUS.*EAH26.* 3 1
+ATI ASUS EAH29xx .*ATI.*ASUS.*EAH29.* 3 1
+ATI ASUS EAH34xx .*ATI.*ASUS.*EAH34.* 1 1
+ATI ASUS EAH36xx .*ATI.*ASUS.*EAH36.* 3 1
+ATI ASUS EAH38xx .*ATI.*ASUS.*EAH38.* 3 1
+ATI ASUS EAH43xx .*ATI.*ASUS.*EAH43.* 1 1
+ATI ASUS EAH45xx .*ATI.*ASUS.*EAH45.* 1 1
+ATI ASUS EAH48xx .*ATI.*ASUS.*EAH48.* 3 1
+ATI ASUS EAH57xx .*ATI.*ASUS.*EAH57.* 3 1
+ATI ASUS EAH58xx .*ATI.*ASUS.*EAH58.* 3 1
+ATI ASUS EAH6xxx .*ATI.*ASUS.*EAH6.* 3 1
+ATI ASUS Radeon X1xxx .*ATI.*ASUS.*X1.* 3 1
+ATI Radeon X7xx .*ATI.*ASUS.*X7.* 1 1
+ATI Radeon X19xx .*ATI.*(Radeon|Diamond) X19.* ?.* 3 1
+ATI Radeon X18xx .*ATI.*(Radeon|Diamond) X18.* ?.* 3 1
+ATI Radeon X17xx .*ATI.*(Radeon|Diamond) X17.* ?.* 2 1
+ATI Radeon X16xx .*ATI.*(Radeon|Diamond) X16.* ?.* 2 1
+ATI Radeon X15xx .*ATI.*(Radeon|Diamond) X15.* ?.* 2 1
+ATI Radeon X13xx .*ATI.*(Radeon|Diamond) X13.* ?.* 1 1
+ATI Radeon X1xxx .*ATI.*(Radeon|Diamond) X1.. ?.* 1 1
+ATI Radeon X2xxx .*ATI.*(Radeon|Diamond) X2.. ?.* 1 1
+ATI Display Adapter .*ATI.*display adapter.* 0 1
+ATI FireGL 5200 .*ATI.*FireGL V52.* 0 1
+ATI FireGL 5xxx .*ATI.*FireGL V5.* 1 1
+ATI FireGL .*ATI.*Fire.*GL.* 0 1
+ATI FirePro M3900 .*ATI.*FirePro.*M39.* 2 1
+ATI FirePro M5800 .*ATI.*FirePro.*M58.* 3 1
+ATI FirePro M7740 .*ATI.*FirePro.*M77.* 3 1
+ATI FirePro M7820 .*ATI.*FirePro.*M78.* 3 1
+ATI FireMV .*ATI.*FireMV.* 0 1
+ATI Geforce 9500 GT .*ATI.*Geforce 9500 *GT.* 2 1
+ATI Geforce 9600 GT .*ATI.*Geforce 9600 *GT.* 2 1
+ATI Geforce 9800 GT .*ATI.*Geforce 9800 *GT.* 2 1
+ATI Generic .*ATI.*Generic.* 0 0
+ATI Hercules 9800 .*ATI.*Hercules.*9800.* 1 1
+ATI IGP 340M .*ATI.*IGP.*340M.* 0 0
+ATI M52 .*ATI.*M52.* 1 1
+ATI M54 .*ATI.*M54.* 1 1
+ATI M56 .*ATI.*M56.* 1 1
+ATI M71 .*ATI.*M71.* 1 1
+ATI M72 .*ATI.*M72.* 1 1
+ATI M76 .*ATI.*M76.* 3 1
+ATI Radeon HD 64xx .*ATI.*AMD Radeon.* HD [67]4..[MG] 3 1
+ATI Radeon HD 65xx .*ATI.*AMD Radeon.* HD [67]5..[MG] 3 1
+ATI Radeon HD 66xx .*ATI.*AMD Radeon.* HD [67]6..[MG] 3 1
+ATI Mobility Radeon 4100 .*ATI.*Mobility.*41.. 1 1
+ATI Mobility Radeon 7xxx .*ATI.*Mobility.*Radeon 7.* 0 1
+ATI Mobility Radeon 8xxx .*ATI.*Mobility.*Radeon 8.* 0 1
+ATI Mobility Radeon 9800 .*ATI.*Mobility.*98.* 1 1
+ATI Mobility Radeon 9700 .*ATI.*Mobility.*97.* 1 1
+ATI Mobility Radeon 9600 .*ATI.*Mobility.*96.* 0 1
+ATI Mobility Radeon HD 530v .*ATI.*Mobility.*HD *530v.* 1 1
+ATI Mobility Radeon HD 540v .*ATI.*Mobility.*HD *540v.* 2 1
+ATI Mobility Radeon HD 545v .*ATI.*Mobility.*HD *545v.* 2 1
+ATI Mobility Radeon HD 550v .*ATI.*Mobility.*HD *550v.* 2 1
+ATI Mobility Radeon HD 560v .*ATI.*Mobility.*HD *560v.* 2 1
+ATI Mobility Radeon HD 565v .*ATI.*Mobility.*HD *565v.* 2 1
+ATI Mobility Radeon HD 2300 .*ATI.*Mobility.*HD *23.* 2 1
+ATI Mobility Radeon HD 2400 .*ATI.*Mobility.*HD *24.* 2 1
+ATI Mobility Radeon HD 2600 .*ATI.*Mobility.*HD *26.* 3 1
+ATI Mobility Radeon HD 2700 .*ATI.*Mobility.*HD *27.* 3 1
+ATI Mobility Radeon HD 3100 .*ATI.*Mobility.*HD *31.* 0 1
+ATI Mobility Radeon HD 3200 .*ATI.*Mobility.*HD *32.* 0 1
+ATI Mobility Radeon HD 3400 .*ATI.*Mobility.*HD *34.* 2 1
+ATI Mobility Radeon HD 3600 .*ATI.*Mobility.*HD *36.* 3 1
+ATI Mobility Radeon HD 3800 .*ATI.*Mobility.*HD *38.* 3 1
+ATI Mobility Radeon HD 4200 .*ATI.*Mobility.*HD *42.* 2 1
+ATI Mobility Radeon HD 4300 .*ATI.*Mobility.*HD *43.* 2 1
+ATI Mobility Radeon HD 4500 .*ATI.*Mobility.*HD *45.* 3 1
+ATI Mobility Radeon HD 4600 .*ATI.*Mobility.*HD *46.* 3 1
+ATI Mobility Radeon HD 4800 .*ATI.*Mobility.*HD *48.* 3 1
+ATI Mobility Radeon HD 5100 .*ATI.*Mobility.*HD *51.* 3 1
+ATI Mobility Radeon HD 5300 .*ATI.*Mobility.*HD *53.* 3 1
+ATI Mobility Radeon HD 5400 .*ATI.*Mobility.*HD *54.* 3 1
+ATI Mobility Radeon HD 5500 .*ATI.*Mobility.*HD *55.* 3 1
+ATI Mobility Radeon HD 5600 .*ATI.*Mobility.*HD *56.* 3 1
+ATI Mobility Radeon HD 5700 .*ATI.*Mobility.*HD *57.* 3 1
+ATI Mobility Radeon HD 6200 .*ATI.*Mobility.*HD *62.* 3 1
+ATI Mobility Radeon HD 6300 .*ATI.*Mobility.*HD *63.* 3 1
+ATI Mobility Radeon HD 6400M .*ATI.*Mobility.*HD *64.* 3 1
+ATI Mobility Radeon HD 6500M .*ATI.*Mobility.*HD *65.* 3 1
+ATI Mobility Radeon HD 6600M .*ATI.*Mobility.*HD *66.* 3 1
+ATI Mobility Radeon HD 6700M .*ATI.*Mobility.*HD *67.* 3 1
+ATI Mobility Radeon HD 6800M .*ATI.*Mobility.*HD *68.* 3 1
+ATI Mobility Radeon HD 6900M .*ATI.*Mobility.*HD *69.* 3 1
+ATI Radeon HD 2300 .*ATI.*Radeon HD *23.. 2 1
+ATI Radeon HD 2400 .*ATI.*Radeon HD *24.. 2 1
+ATI Radeon HD 2600 .*ATI.*Radeon HD *26.. 2 1
+ATI Radeon HD 2900 .*ATI.*Radeon HD *29.. 3 1
+ATI Radeon HD 3000 .*ATI.*Radeon HD *30.. 0 1
+ATI Radeon HD 3100 .*ATI.*Radeon HD *31.. 1 1
+ATI Radeon HD 3200 .*ATI.*Radeon HD *32.. 1 1
+ATI Radeon HD 3300 .*ATI.*Radeon HD *33.. 2 1
+ATI Radeon HD 3400 .*ATI.*Radeon HD *34.. 2 1
+ATI Radeon HD 3500 .*ATI.*Radeon HD *35.. 2 1
+ATI Radeon HD 3600 .*ATI.*Radeon HD *36.. 3 1
+ATI Radeon HD 3700 .*ATI.*Radeon HD *37.. 3 1
+ATI Radeon HD 3800 .*ATI.*Radeon HD *38.. 3 1
+ATI Radeon HD 4100 .*ATI.*Radeon HD *41.. 1 1
+ATI Radeon HD 4200 .*ATI.*Radeon HD *42.. 1 1
+ATI Radeon HD 4300 .*ATI.*Radeon HD *43.. 2 1
+ATI Radeon HD 4400 .*ATI.*Radeon HD *44.. 2 1
+ATI Radeon HD 4500 .*ATI.*Radeon HD *45.. 3 1
+ATI Radeon HD 4600 .*ATI.*Radeon HD *46.. 3 1
+ATI Radeon HD 4700 .*ATI.*Radeon HD *47.. 3 1
+ATI Radeon HD 4800 .*ATI.*Radeon HD *48.. 3 1
+ATI Radeon HD 5400 .*ATI.*Radeon HD *54.. 3 1
+ATI Radeon HD 5500 .*ATI.*Radeon HD *55.. 3 1
+ATI Radeon HD 5600 .*ATI.*Radeon HD *56.. 3 1
+ATI Radeon HD 5700 .*ATI.*Radeon HD *57.. 3 1
+ATI Radeon HD 5800 .*ATI.*Radeon HD *58.. 3 1
+ATI Radeon HD 5900 .*ATI.*Radeon HD *59.. 3 1
+ATI Radeon HD 6200 .*ATI.*Radeon HD *62.. 3 1
+ATI Radeon HD 6300 .*ATI.*Radeon HD *63.. 3 1
+ATI Radeon HD 6400 .*ATI.*Radeon HD *64.. 3 1
+ATI Radeon HD 6500 .*ATI.*Radeon HD *65.. 3 1
+ATI Radeon HD 6600 .*ATI.*Radeon HD *66.. 3 1
+ATI Radeon HD 6700 .*ATI.*Radeon HD *67.. 3 1
+ATI Radeon HD 6800 .*ATI.*Radeon HD *68.. 3 1
+ATI Radeon HD 6900 .*ATI.*Radeon HD *69.. 3 1
+ATI Radeon OpenGL .*ATI.*Radeon OpenGL.* 0 0
+ATI Radeon 2100 .*ATI.*Radeon 21.. 0 1
+ATI Radeon 3000 .*ATI.*Radeon 30.. 0 1
+ATI Radeon 3100 .*ATI.*Radeon 31.. 1 1
+ATI Radeon 5xxx .*ATI.*Radeon 5... 3 1
+ATI Radeon 7xxx .*ATI.*Radeon 7... 0 1
+ATI Radeon 8xxx .*ATI.*Radeon 8... 0 1
+ATI Radeon 9000 .*ATI.*Radeon 90.. 0 1
+ATI Radeon 9100 .*ATI.*Radeon 91.. 0 1
+ATI Radeon 9200 .*ATI.*Radeon 92.. 0 1
+ATI Radeon 9500 .*ATI.*Radeon 95.. 0 1
+ATI Radeon 9600 .*ATI.*Radeon 96.. 0 1
+ATI Radeon 9700 .*ATI.*Radeon 97.. 1 1
+ATI Radeon 9800 .*ATI.*Radeon 98.. 1 1
+ATI Radeon RV250 .*ATI.*RV250.* 0 1
+ATI Radeon RV600 .*ATI.*RV6.* 1 1
+ATI Radeon RX700 .*ATI.*RX70.* 1 1
+ATI Radeon RX800 .*ATI.*Radeon *RX80.* 2 1
+ATI RS880M .*ATI.*RS880M 1 1
+ATI Radeon RX9550 .*ATI.*RX9550.* 1 1
+ATI Radeon VE .*ATI.*Radeon.*VE.* 0 0
+ATI Radeon X300 .*ATI.*Radeon *X3.* 0 1
+ATI Radeon X400 .*ATI.*Radeon ?X4.* 0 1
+ATI Radeon X500 .*ATI.*Radeon ?X5.* 0 1
+ATI Radeon X600 .*ATI.*Radeon ?X6.* 1 1
+ATI Radeon X700 .*ATI.*Radeon ?X7.* 1 1
+ATI Radeon X800 .*ATI.*Radeon ?X8.* 2 1
+ATI Radeon X900 .*ATI.*Radeon ?X9.* 2 1
+ATI Radeon Xpress .*ATI.*Radeon Xpress.* 0 1
+ATI Rage 128 .*ATI.*Rage 128.* 0 1
+ATI R350 (9800) .*R350.* 1 1
+ATI R580 (X1900) .*R580.* 3 1
+ATI RC410 (Xpress 200) .*RC410.* 0 0
+ATI RS48x (Xpress 200x) .*RS48.* 0 0
+ATI RS600 (Xpress 3200) .*RS600.* 0 0
+ATI RV350 (9600) .*RV350.* 0 1
+ATI RV370 (X300) .*RV370.* 0 1
+ATI RV410 (X700) .*RV410.* 1 1
+ATI RV515 .*RV515.* 1 1
+ATI RV570 (X1900 GT/PRO) .*RV570.* 3 1
+ATI RV380 .*RV380.* 0 1
+ATI RV530 .*RV530.* 1 1
+ATI RX480 (Xpress 200P) .*RX480.* 0 1
+ATI RX700 .*RX700.* 1 1
+AMD ANTILLES (HD 6990) .*(AMD|ATI).*Antilles.* 3 1
+AMD BARTS (HD 6800) .*(AMD|ATI).*Barts.* 3 1
+AMD CAICOS (HD 6400) .*(AMD|ATI).*Caicos.* 3 1
+AMD CAYMAN (HD 6900) .*(AMD|ATI).*(Cayman|CAYMAM).* 3 1
+AMD CEDAR (HD 5450) .*(AMD|ATI).*Cedar.* 2 1
+AMD CYPRESS (HD 5800) .*(AMD|ATI).*Cypress.* 3 1
+AMD HEMLOCK (HD 5970) .*(AMD|ATI).*Hemlock.* 3 1
+AMD JUNIPER (HD 5700) .*(AMD|ATI).*Juniper.* 3 1
+AMD PARK .*(AMD|ATI).*Park.* 3 1
+AMD REDWOOD (HD 5500/5600) .*(AMD|ATI).*Redwood.* 3 1
+AMD TURKS (HD 6500/6600) .*(AMD|ATI).*Turks.* 3 1
+AMD RS780 (HD 3200) .*RS780.* 0 1
+AMD RS880 (HD 4200) .*RS880.* 1 1
+AMD RV610 (HD 2400) .*RV610.* 1 1
+AMD RV620 (HD 3400) .*RV620.* 1 1
+AMD RV630 (HD 2600) .*RV630.* 2 1
+AMD RV635 (HD 3600) .*RV635.* 3 1
+AMD RV670 (HD 3800) .*RV670.* 3 1
+AMD R680 (HD 3870 X2) .*R680.* 3 1
+AMD R700 (HD 4800 X2) .*R700.* 3 1
+AMD RV710 (HD 4300) .*RV710.* 1 1
+AMD RV730 (HD 4600) .*RV730.* 3 1
+AMD RV740 (HD 4700) .*RV740.* 3 1
+AMD RV770 (HD 4800) .*RV770.* 3 1
+AMD RV790 (HD 4800) .*RV790.* 3 1
+ATI 760G/Radeon 3000 .*ATI.*AMD 760G.* 1 1
+ATI 780L/Radeon 3000 .*ATI.*AMD 780L.* 1 1
+ATI Radeon DDR .*ATI.*Radeon ?DDR.* 0 1
+ATI FirePro 2000 .*ATI.*FirePro 2.* 1 1
+ATI FirePro 3000 .*ATI.*FirePro V3.* 1 1
+ATI FirePro 4000 .*ATI.*FirePro V4.* 2 1
+ATI FirePro 5000 .*ATI.*FirePro V5.* 3 1
+ATI FirePro 7000 .*ATI.*FirePro V7.* 3 1
+ATI FirePro M .*ATI.*FirePro M.* 3 1
+ATI Technologies .*ATI *Technologies.* 0 1
+// This entry is last to work around the "R300" driver problem.
+ATI R300 (9700) .*R300.* 1 1
+ATI Radeon .*ATI.*(Diamond|Radeon).* 0 1
+Intel X3100 .*Intel.*X3100.* 0 1
+Intel 830M .*Intel.*830M 0 0
+Intel 845G .*Intel.*845G 0 0
+Intel 855GM .*Intel.*855GM 0 0
+Intel 865G .*Intel.*865G 0 0
+Intel 900 .*Intel.*900.*900 0 0
+Intel 915GM .*Intel.*915GM 0 0
+Intel 915G .*Intel.*915G 0 0
+Intel 945GM .*Intel.*945GM.* 0 1
+Intel 945G .*Intel.*945G.* 0 1
+Intel 950 .*Intel.*950.* 0 1
+Intel 965 .*Intel.*965.* 0 1
+Intel G33 .*Intel.*G33.* 0 0
+Intel G41 .*Intel.*G41.* 0 1
+Intel G45 .*Intel.*G45.* 0 1
+Intel Bear Lake .*Intel.*Bear Lake.* 0 0
+Intel Broadwater .*Intel.*Broadwater.* 0 0
+Intel Brookdale .*Intel.*Brookdale.* 0 0
+Intel Cantiga .*Intel.*Cantiga.* 0 0
+Intel Eaglelake .*Intel.*Eaglelake.* 0 1
+Intel Graphics Media HD .*Intel.*Graphics Media.*HD.* 0 1
+Intel HD Graphics .*Intel.*HD Graphics.* 2 1
+Intel Mobile 4 Series .*Intel.*Mobile.* 4 Series.* 0 1
+Intel Media Graphics HD .*Intel.*Media Graphics HD.* 0 1
+Intel Montara .*Intel.*Montara.* 0 0
+Intel Pineview .*Intel.*Pineview.* 0 1
+Intel Springdale .*Intel.*Springdale.* 0 0
+Intel HD Graphics 2000 .*Intel.*HD2000.* 1 1
+Intel HD Graphics 3000 .*Intel.*HD3000.* 2 1
+Matrox .*Matrox.* 0 0
+Mesa .*Mesa.* 0 0
+NVIDIA 205 .*NVIDIA .*GeForce 205.* 2 1
+NVIDIA 210 .*NVIDIA .*GeForce 210.* 2 1
+NVIDIA 310M .*NVIDIA .*GeForce 310M.* 1 1
+NVIDIA 310 .*NVIDIA .*GeForce 310.* 3 1
+NVIDIA 315M .*NVIDIA .*GeForce 315M.* 2 1
+NVIDIA 315 .*NVIDIA .*GeForce 315.* 3 1
+NVIDIA 320M .*NVIDIA .*GeForce 320M.* 2 1
+NVIDIA G100M .*NVIDIA .*100M.* 0 1
+NVIDIA G100 .*NVIDIA .*100.* 0 1
+NVIDIA G102M .*NVIDIA .*102M.* 0 1
+NVIDIA G103M .*NVIDIA .*103M.* 0 1
+NVIDIA G105M .*NVIDIA .*105M.* 0 1
+NVIDIA G 110M .*NVIDIA .*110M.* 0 1
+NVIDIA G 120M .*NVIDIA .*120M.* 1 1
+NVIDIA G 200 .*NVIDIA .*200(M)?.* 0 1
+NVIDIA G 205M .*NVIDIA .*205(M)?.* 0 1
+NVIDIA G 210 .*NVIDIA .*210(M)?.* 1 1
+NVIDIA 305M .*NVIDIA .*305(M)?.* 1 1
+NVIDIA G 310M .*NVIDIA .*310(M)?.* 2 1
+NVIDIA G 315 .*NVIDIA .*315(M)?.* 2 1
+NVIDIA G 320M .*NVIDIA .*320(M)?.* 2 1
+NVIDIA G 405 .*NVIDIA .*405(M)?.* 1 1
+NVIDIA G 410M .*NVIDIA .*410(M)?.* 1 1
+NVIDIA GT 120M .*NVIDIA .*GT *120(M)?.* 2 1
+NVIDIA GT 120 .*NVIDIA .*GT.*120 2 1
+NVIDIA GT 130M .*NVIDIA .*GT *130(M)?.* 2 1
+NVIDIA GT 140M .*NVIDIA .*GT *140(M)?.* 2 1
+NVIDIA GT 150M .*NVIDIA .*GT(S)? *150(M)?.* 2 1
+NVIDIA GT 160M .*NVIDIA .*GT *160(M)?.* 2 1
+NVIDIA GT 220M .*NVIDIA .*GT *220(M)?.* 2 1
+NVIDIA GT 230M .*NVIDIA .*GT *230(M)?.* 2 1
+NVIDIA GT 240M .*NVIDIA .*GT *240(M)?.* 2 1
+NVIDIA GT 250M .*NVIDIA .*GT *250(M)?.* 2 1
+NVIDIA GT 260M .*NVIDIA .*GT *260(M)?.* 2 1
+NVIDIA GT 320M .*NVIDIA .*GT *320(M)?.* 2 1
+NVIDIA GT 325M .*NVIDIA .*GT *325(M)?.* 0 1
+NVIDIA GT 330M .*NVIDIA .*GT *330(M)?.* 3 1
+NVIDIA GT 335M .*NVIDIA .*GT *335(M)?.* 1 1
+NVIDIA GT 340M .*NVIDIA .*GT *340(M)?.* 2 1
+NVIDIA GT 415M .*NVIDIA .*GT *415(M)?.* 2 1
+NVIDIA GT 420M .*NVIDIA .*GT *420(M)?.* 2 1
+NVIDIA GT 425M .*NVIDIA .*GT *425(M)?.* 3 1
+NVIDIA GT 430M .*NVIDIA .*GT *430(M)?.* 3 1
+NVIDIA GT 435M .*NVIDIA .*GT *435(M)?.* 3 1
+NVIDIA GT 440M .*NVIDIA .*GT *440(M)?.* 3 1
+NVIDIA GT 445M .*NVIDIA .*GT *445(M)?.* 3 1
+NVIDIA GT 450M .*NVIDIA .*GT *450(M)?.* 3 1
+NVIDIA GT 520M .*NVIDIA .*GT *52.(M)?.* 3 1
+NVIDIA GT 530M .*NVIDIA .*GT *530(M)?.* 3 1
+NVIDIA GT 540M .*NVIDIA .*GT *54.(M)?.* 3 1
+NVIDIA GT 550M .*NVIDIA .*GT *550(M)?.* 3 1
+NVIDIA GT 555M .*NVIDIA .*GT *555(M)?.* 3 1
+NVIDIA GTS 160M .*NVIDIA .*GT(S)? *160(M)?.* 2 1
+NVIDIA GTS 240 .*NVIDIA .*GTS *24.* 3 1
+NVIDIA GTS 250 .*NVIDIA .*GTS *25.* 3 1
+NVIDIA GTS 350M .*NVIDIA .*GTS *350M.* 3 1
+NVIDIA GTS 360M .*NVIDIA .*GTS *360M.* 3 1
+NVIDIA GTS 360 .*NVIDIA .*GTS *360.* 3 1
+NVIDIA GTS 450 .*NVIDIA .*GTS *45.* 3 1
+NVIDIA GTX 260 .*NVIDIA .*GTX *26.* 3 1
+NVIDIA GTX 275 .*NVIDIA .*GTX *275.* 3 1
+NVIDIA GTX 270 .*NVIDIA .*GTX *27.* 3 1
+NVIDIA GTX 285 .*NVIDIA .*GTX *285.* 3 1
+NVIDIA GTX 280 .*NVIDIA .*GTX *280.* 3 1
+NVIDIA GTX 290 .*NVIDIA .*GTX *290.* 3 1
+NVIDIA GTX 295 .*NVIDIA .*GTX *295.* 3 1
+NVIDIA GTX 460M .*NVIDIA .*GTX *460M.* 3 1
+NVIDIA GTX 465 .*NVIDIA .*GTX *465.* 3 1
+NVIDIA GTX 460 .*NVIDIA .*GTX *46.* 3 1
+NVIDIA GTX 470M .*NVIDIA .*GTX *470M.* 3 1
+NVIDIA GTX 470 .*NVIDIA .*GTX *47.* 3 1
+NVIDIA GTX 480M .*NVIDIA .*GTX *480M.* 3 1
+NVIDIA GTX 485M .*NVIDIA .*GTX *485M.* 3 1
+NVIDIA GTX 480 .*NVIDIA .*GTX *48.* 3 1
+NVIDIA GTX 530 .*NVIDIA .*GTX *53.* 3 1
+NVIDIA GTX 550 .*NVIDIA .*GTX *55.* 3 1
+NVIDIA GTX 560 .*NVIDIA .*GTX *56.* 3 1
+NVIDIA GTX 570 .*NVIDIA .*GTX *57.* 3 1
+NVIDIA GTX 580M .*NVIDIA .*GTX *580M.* 3 1
+NVIDIA GTX 580 .*NVIDIA .*GTX *58.* 3 1
+NVIDIA GTX 590 .*NVIDIA .*GTX *59.* 3 1
+NVIDIA C51 .*NVIDIA .*C51.* 0 1
+NVIDIA G72 .*NVIDIA .*G72.* 1 1
+NVIDIA G73 .*NVIDIA .*G73.* 1 1
+NVIDIA G84 .*NVIDIA .*G84.* 2 1
+NVIDIA G86 .*NVIDIA .*G86.* 3 1
+NVIDIA G92 .*NVIDIA .*G92.* 3 1
+NVIDIA GeForce .*GeForce 256.* 0 0
+NVIDIA GeForce 2 .*GeForce ?2 ?.* 0 1
+NVIDIA GeForce 3 .*GeForce ?3 ?.* 0 1
+NVIDIA GeForce 3 Ti .*GeForce ?3 Ti.* 0 1
+NVIDIA GeForce 4 .*NVIDIA .*GeForce ?4.* 0 1
+NVIDIA GeForce 4 Go .*NVIDIA .*GeForce ?4.*Go.* 0 1
+NVIDIA GeForce 4 MX .*NVIDIA .*GeForce ?4 MX.* 0 1
+NVIDIA GeForce 4 PCX .*NVIDIA .*GeForce ?4 PCX.* 0 1
+NVIDIA GeForce 4 Ti .*NVIDIA .*GeForce ?4 Ti.* 0 1
+NVIDIA GeForce 6100 .*NVIDIA .*GeForce 61.* 0 1
+NVIDIA GeForce 6200 .*NVIDIA .*GeForce 62.* 0 1
+NVIDIA GeForce 6500 .*NVIDIA .*GeForce 65.* 0 1
+NVIDIA GeForce 6600 .*NVIDIA .*GeForce 66.* 1 1
+NVIDIA GeForce 6700 .*NVIDIA .*GeForce 67.* 2 1
+NVIDIA GeForce 6800 .*NVIDIA .*GeForce 68.* 2 1
+NVIDIA GeForce 7000 .*NVIDIA .*GeForce 70.* 0 1
+NVIDIA GeForce 7100 .*NVIDIA .*GeForce 71.* 0 1
+NVIDIA GeForce 7200 .*NVIDIA .*GeForce 72.* 1 1
+NVIDIA GeForce 7300 .*NVIDIA .*GeForce 73.* 1 1
+NVIDIA GeForce 7500 .*NVIDIA .*GeForce 75.* 1 1
+NVIDIA GeForce 7600 .*NVIDIA .*GeForce 76.* 2 1
+NVIDIA GeForce 7800 .*NVIDIA .*GeForce 78.* 2 1
+NVIDIA GeForce 7900 .*NVIDIA .*GeForce 79.* 2 1
+NVIDIA GeForce 8100 .*NVIDIA .*GeForce 81.* 1 1
+NVIDIA GeForce 8200M .*NVIDIA .*GeForce 8200M.* 1 1
+NVIDIA GeForce 8200 .*NVIDIA .*GeForce 82.* 1 1
+NVIDIA GeForce 8300 .*NVIDIA .*GeForce 83.* 2 1
+NVIDIA GeForce 8400M .*NVIDIA .*GeForce 8400M.* 2 1
+NVIDIA GeForce 8400 .*NVIDIA .*GeForce 84.* 2 1
+NVIDIA GeForce 8500 .*NVIDIA .*GeForce 85.* 3 1
+NVIDIA GeForce 8600M .*NVIDIA .*GeForce 8600M.* 2 1
+NVIDIA GeForce 8600 .*NVIDIA .*GeForce 86.* 3 1
+NVIDIA GeForce 8700M .*NVIDIA .*GeForce 8700M.* 3 1
+NVIDIA GeForce 8700 .*NVIDIA .*GeForce 87.* 3 1
+NVIDIA GeForce 8800M .*NVIDIA .*GeForce 8800M.* 3 1
+NVIDIA GeForce 8800 .*NVIDIA .*GeForce 88.* 3 1
+NVIDIA GeForce 9100M .*NVIDIA .*GeForce 9100M.* 0 1
+NVIDIA GeForce 9100 .*NVIDIA .*GeForce 91.* 0 1
+NVIDIA GeForce 9200M .*NVIDIA .*GeForce 9200M.* 1 1
+NVIDIA GeForce 9200 .*NVIDIA .*GeForce 92.* 1 1
+NVIDIA GeForce 9300M .*NVIDIA .*GeForce 9300M.* 2 1
+NVIDIA GeForce 9300 .*NVIDIA .*GeForce 93.* 2 1
+NVIDIA GeForce 9400M .*NVIDIA .*GeForce 9400M.* 2 1
+NVIDIA GeForce 9400 .*NVIDIA .*GeForce 94.* 2 1
+NVIDIA GeForce 9500M .*NVIDIA .*GeForce 9500M.* 2 1
+NVIDIA GeForce 9500 .*NVIDIA .*GeForce 95.* 2 1
+NVIDIA GeForce 9600M .*NVIDIA .*GeForce 9600M.* 3 1
+NVIDIA GeForce 9600 .*NVIDIA .*GeForce 96.* 2 1
+NVIDIA GeForce 9700M .*NVIDIA .*GeForce 9700M.* 2 1
+NVIDIA GeForce 9800M .*NVIDIA .*GeForce 9800M.* 3 1
+NVIDIA GeForce 9800 .*NVIDIA .*GeForce 98.* 3 1
+NVIDIA GeForce FX 5100 .*NVIDIA .*GeForce FX 51.* 0 1
+NVIDIA GeForce FX 5200 .*NVIDIA .*GeForce FX 52.* 0 1
+NVIDIA GeForce FX 5300 .*NVIDIA .*GeForce FX 53.* 0 1
+NVIDIA GeForce FX 5500 .*NVIDIA .*GeForce FX 55.* 0 1
+NVIDIA GeForce FX 5600 .*NVIDIA .*GeForce FX 56.* 0 1
+NVIDIA GeForce FX 5700 .*NVIDIA .*GeForce FX 57.* 1 1
+NVIDIA GeForce FX 5800 .*NVIDIA .*GeForce FX 58.* 1 1
+NVIDIA GeForce FX 5900 .*NVIDIA .*GeForce FX 59.* 1 1
+NVIDIA GeForce FX Go5100 .*NVIDIA .*GeForce FX Go51.* 0 1
+NVIDIA GeForce FX Go5200 .*NVIDIA .*GeForce FX Go52.* 0 1
+NVIDIA GeForce FX Go5300 .*NVIDIA .*GeForce FX Go53.* 0 1
+NVIDIA GeForce FX Go5500 .*NVIDIA .*GeForce FX Go55.* 0 1
+NVIDIA GeForce FX Go5600 .*NVIDIA .*GeForce FX Go56.* 0 1
+NVIDIA GeForce FX Go5700 .*NVIDIA .*GeForce FX Go57.* 1 1
+NVIDIA GeForce FX Go5800 .*NVIDIA .*GeForce FX Go58.* 1 1
+NVIDIA GeForce FX Go5900 .*NVIDIA .*GeForce FX Go59.* 1 1
+NVIDIA GeForce FX Go5xxx .*NVIDIA .*GeForce FX Go.* 0 1
+NVIDIA GeForce Go 6100 .*NVIDIA .*GeForce Go 61.* 0 1
+NVIDIA GeForce Go 6200 .*NVIDIA .*GeForce Go 62.* 0 1
+NVIDIA GeForce Go 6400 .*NVIDIA .*GeForce Go 64.* 1 1
+NVIDIA GeForce Go 6500 .*NVIDIA .*GeForce Go 65.* 1 1
+NVIDIA GeForce Go 6600 .*NVIDIA .*GeForce Go 66.* 1 1
+NVIDIA GeForce Go 6700 .*NVIDIA .*GeForce Go 67.* 1 1
+NVIDIA GeForce Go 6800 .*NVIDIA .*GeForce Go 68.* 1 1
+NVIDIA GeForce Go 7200 .*NVIDIA .*GeForce Go 72.* 1 1
+NVIDIA GeForce Go 7300 LE .*NVIDIA .*GeForce Go 73.*LE.* 0 1
+NVIDIA GeForce Go 7300 .*NVIDIA .*GeForce Go 73.* 1 1
+NVIDIA GeForce Go 7400 .*NVIDIA .*GeForce Go 74.* 1 1
+NVIDIA GeForce Go 7600 .*NVIDIA .*GeForce Go 76.* 2 1
+NVIDIA GeForce Go 7700 .*NVIDIA .*GeForce Go 77.* 2 1
+NVIDIA GeForce Go 7800 .*NVIDIA .*GeForce Go 78.* 2 1
+NVIDIA GeForce Go 7900 .*NVIDIA .*GeForce Go 79.* 2 1
+NVIDIA D9M .*NVIDIA .*D9M.* 1 1
+NVIDIA G94 .*NVIDIA .*G94.* 3 1
+NVIDIA GeForce Go 6 .*GeForce Go 6.* 1 1
+NVIDIA ION 2 .*NVIDIA .*ION 2.* 2 1
+NVIDIA ION .*NVIDIA .*ION.* 2 1
+NVIDIA NB8M .*NVIDIA .*NB8M.* 1 1
+NVIDIA NB8P .*NVIDIA .*NB8P.* 2 1
+NVIDIA NB9E .*NVIDIA .*NB9E.* 3 1
+NVIDIA NB9M .*NVIDIA .*NB9M.* 1 1
+NVIDIA NB9P .*NVIDIA .*NB9P.* 2 1
+NVIDIA N10 .*NVIDIA .*N10.* 1 1
+NVIDIA GeForce PCX .*GeForce PCX.* 0 1
+NVIDIA Generic .*NVIDIA .*Unknown.* 0 0
+NVIDIA NV17 .*NVIDIA .*NV17.* 0 1
+NVIDIA NV34 .*NVIDIA .*NV34.* 0 1
+NVIDIA NV35 .*NVIDIA .*NV35.* 0 1
+NVIDIA NV36 .*NVIDIA .*NV36.* 1 1
+NVIDIA NV41 .*NVIDIA .*NV41.* 1 1
+NVIDIA NV43 .*NVIDIA .*NV43.* 1 1
+NVIDIA NV44 .*NVIDIA .*NV44.* 1 1
+NVIDIA nForce .*NVIDIA .*nForce.* 0 0
+NVIDIA MCP51 .*NVIDIA .*MCP51.* 1 1
+NVIDIA MCP61 .*NVIDIA .*MCP61.* 1 1
+NVIDIA MCP67 .*NVIDIA .*MCP67.* 1 1
+NVIDIA MCP68 .*NVIDIA .*MCP68.* 1 1
+NVIDIA MCP73 .*NVIDIA .*MCP73.* 1 1
+NVIDIA MCP77 .*NVIDIA .*MCP77.* 1 1
+NVIDIA MCP78 .*NVIDIA .*MCP78.* 1 1
+NVIDIA MCP79 .*NVIDIA .*MCP79.* 1 1
+NVIDIA MCP7A .*NVIDIA .*MCP7A.* 1 1
+NVIDIA Quadro2 .*Quadro2.* 0 1
+NVIDIA Quadro 1000M .*Quadro.*1000M.* 2 1
+NVIDIA Quadro 2000 M/D .*Quadro.*2000.* 3 1
+NVIDIA Quadro 3000M .*Quadro.*3000M.* 3 1
+NVIDIA Quadro 4000M .*Quadro.*4000M.* 3 1
+NVIDIA Quadro 4000 .*Quadro *4000.* 3 1
+NVIDIA Quadro 50x0 M .*Quadro.*50.0.* 3 1
+NVIDIA Quadro 6000 .*Quadro.*6000.* 3 1
+NVIDIA Quadro 400 .*Quadro.*400.* 2 1
+NVIDIA Quadro 600 .*Quadro.*600.* 2 1
+NVIDIA Quadro4 .*Quadro4.* 0 1
+NVIDIA Quadro DCC .*Quadro DCC.* 0 1
+NVIDIA Quadro CX .*Quadro.*CX.* 3 1
+NVIDIA Quadro FX 770M .*Quadro.*FX *770M.* 2 1
+NVIDIA Quadro FX 1500M .*Quadro.*FX *1500M.* 1 1
+NVIDIA Quadro FX 1600M .*Quadro.*FX *1600M.* 2 1
+NVIDIA Quadro FX 2500M .*Quadro.*FX *2500M.* 2 1
+NVIDIA Quadro FX 2700M .*Quadro.*FX *2700M.* 3 1
+NVIDIA Quadro FX 2800M .*Quadro.*FX *2800M.* 3 1
+NVIDIA Quadro FX 3500 .*Quadro.*FX *3500.* 2 1
+NVIDIA Quadro FX 3600 .*Quadro.*FX *3600.* 3 1
+NVIDIA Quadro FX 3700 .*Quadro.*FX *3700.* 3 1
+NVIDIA Quadro FX 3800 .*Quadro.*FX *3800.* 3 1
+NVIDIA Quadro FX 4500 .*Quadro.*FX *45.* 3 1
+NVIDIA Quadro FX 880M .*Quadro.*FX *880M.* 3 1
+NVIDIA Quadro FX 4800 .*NVIDIA .*Quadro *FX *4800.* 3 1
+NVIDIA Quadro FX .*Quadro FX.* 1 1
+NVIDIA Quadro NVS 1xxM .*Quadro NVS *1.[05]M.* 0 1
+NVIDIA Quadro NVS 300M .*NVIDIA .*NVS *300M.* 2 1
+NVIDIA Quadro NVS 320M .*NVIDIA .*NVS *320M.* 2 1
+NVIDIA Quadro NVS 2100M .*NVIDIA .*NVS *2100M.* 2 1
+NVIDIA Quadro NVS 3100M .*NVIDIA .*NVS *3100M.* 2 1
+NVIDIA Quadro NVS 4200M .*NVIDIA .*NVS *4200M.* 2 1
+NVIDIA Quadro NVS 5100M .*NVIDIA .*NVS *5100M.* 2 1
+NVIDIA Quadro NVS .*NVIDIA .*NVS 0 1
+NVIDIA RIVA TNT .*RIVA TNT.* 0 0
+S3 .*S3 Graphics.* 0 0
+SiS SiS.* 0 0
+Trident Trident.* 0 0
+Tungsten Graphics Tungsten.* 0 0
+XGI XGI.* 0 0
+VIA VIA.* 0 0
+Apple Generic Apple.*Generic.* 0 0
+Apple Software Renderer Apple.*Software Renderer.* 0 0
+Humper Humper.* 0 1
diff --git a/indra/newview/groupchatlistener.cpp b/indra/newview/groupchatlistener.cpp
new file mode 100644
index 0000000000..ef015a950d
--- /dev/null
+++ b/indra/newview/groupchatlistener.cpp
@@ -0,0 +1,76 @@
+/**
+ * @file groupchatlistener.cpp
+ * @author Nat Goodspeed
+ * @date 2011-04-11
+ * @brief Implementation for groupchatlistener.
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+// Precompiled header
+#include "llviewerprecompiledheaders.h"
+// associated header
+#include "groupchatlistener.h"
+// STL headers
+// std headers
+// external library headers
+// other Linden headers
+#include "llgroupactions.h"
+#include "llimview.h"
+
+
+namespace {
+ void startIm_wrapper(LLSD const & event)
+ {
+ LLUUID session_id = LLGroupActions::startIM(event["id"].asUUID());
+ sendReply(LLSDMap("session_id", LLSD(session_id)), event);
+ }
+
+ void send_message_wrapper(const std::string& text, const LLUUID& session_id, const LLUUID& group_id)
+ {
+ LLIMModel::sendMessage(text, session_id, group_id, IM_SESSION_GROUP_START);
+ }
+}
+
+
+GroupChatListener::GroupChatListener():
+ LLEventAPI("GroupChat",
+ "API to enter, leave, send and intercept group chat messages")
+{
+ add("startIM",
+ "Enter a group chat in group with UUID [\"id\"]\n"
+ "Assumes the logged-in agent is already a member of this group.",
+ &startIm_wrapper);
+ add("endIM",
+ "Leave a group chat in group with UUID [\"id\"]\n"
+ "Assumes a prior successful startIM request.",
+ &LLGroupActions::endIM,
+ LLSDArray("id"));
+ add("sendIM",
+ "send a groupchat IM",
+ &send_message_wrapper,
+ LLSDArray("text")("session_id")("group_id"));
+}
+/*
+ static void sendMessage(const std::string& utf8_text, const LLUUID& im_session_id,
+ const LLUUID& other_participant_id, EInstantMessage dialog);
+*/
diff --git a/indra/newview/groupchatlistener.h b/indra/newview/groupchatlistener.h
new file mode 100644
index 0000000000..0c76db305e
--- /dev/null
+++ b/indra/newview/groupchatlistener.h
@@ -0,0 +1,40 @@
+/**
+ * @file groupchatlistener.h
+ * @author Nat Goodspeed
+ * @date 2011-04-11
+ * @brief
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#if ! defined(LL_GROUPCHATLISTENER_H)
+#define LL_GROUPCHATLISTENER_H
+
+#include "lleventapi.h"
+
+class GroupChatListener: public LLEventAPI
+{
+public:
+ GroupChatListener();
+};
+
+#endif /* ! defined(LL_GROUPCHATLISTENER_H) */
diff --git a/indra/newview/icons/beta/secondlife.icns b/indra/newview/icons/beta/secondlife.icns
new file mode 100644
index 0000000000..1fa50547bb
--- /dev/null
+++ b/indra/newview/icons/beta/secondlife.icns
Binary files differ
diff --git a/indra/newview/icons/beta/secondlife.ico b/indra/newview/icons/beta/secondlife.ico
new file mode 100644
index 0000000000..9bdd21b904
--- /dev/null
+++ b/indra/newview/icons/beta/secondlife.ico
Binary files differ
diff --git a/indra/newview/icons/beta/secondlife_128.png b/indra/newview/icons/beta/secondlife_128.png
new file mode 100644
index 0000000000..fa42aa764b
--- /dev/null
+++ b/indra/newview/icons/beta/secondlife_128.png
Binary files differ
diff --git a/indra/newview/icons/beta/secondlife_16.png b/indra/newview/icons/beta/secondlife_16.png
new file mode 100644
index 0000000000..ff648cf3fc
--- /dev/null
+++ b/indra/newview/icons/beta/secondlife_16.png
Binary files differ
diff --git a/indra/newview/icons/beta/secondlife_256.BMP b/indra/newview/icons/beta/secondlife_256.BMP
new file mode 100644
index 0000000000..97bd67d3d6
--- /dev/null
+++ b/indra/newview/icons/beta/secondlife_256.BMP
Binary files differ
diff --git a/indra/newview/icons/beta/secondlife_256.png b/indra/newview/icons/beta/secondlife_256.png
new file mode 100644
index 0000000000..245e2c3e9f
--- /dev/null
+++ b/indra/newview/icons/beta/secondlife_256.png
Binary files differ
diff --git a/indra/newview/icons/beta/secondlife_32.png b/indra/newview/icons/beta/secondlife_32.png
new file mode 100644
index 0000000000..fd7f46bf4d
--- /dev/null
+++ b/indra/newview/icons/beta/secondlife_32.png
Binary files differ
diff --git a/indra/newview/icons/beta/secondlife_48.png b/indra/newview/icons/beta/secondlife_48.png
new file mode 100644
index 0000000000..cc3a795e2b
--- /dev/null
+++ b/indra/newview/icons/beta/secondlife_48.png
Binary files differ
diff --git a/indra/newview/icons/beta/secondlife_512.png b/indra/newview/icons/beta/secondlife_512.png
new file mode 100644
index 0000000000..a959bd9a9e
--- /dev/null
+++ b/indra/newview/icons/beta/secondlife_512.png
Binary files differ
diff --git a/indra/newview/icons/development/secondlife.icns b/indra/newview/icons/development/secondlife.icns
new file mode 100644
index 0000000000..44f63d384c
--- /dev/null
+++ b/indra/newview/icons/development/secondlife.icns
Binary files differ
diff --git a/indra/newview/icons/development/secondlife.ico b/indra/newview/icons/development/secondlife.ico
new file mode 100644
index 0000000000..b53f23ae58
--- /dev/null
+++ b/indra/newview/icons/development/secondlife.ico
Binary files differ
diff --git a/indra/newview/icons/development/secondlife_128.png b/indra/newview/icons/development/secondlife_128.png
new file mode 100644
index 0000000000..9b9fe656fc
--- /dev/null
+++ b/indra/newview/icons/development/secondlife_128.png
Binary files differ
diff --git a/indra/newview/icons/development/secondlife_16.png b/indra/newview/icons/development/secondlife_16.png
new file mode 100644
index 0000000000..91493a033c
--- /dev/null
+++ b/indra/newview/icons/development/secondlife_16.png
Binary files differ
diff --git a/indra/newview/icons/development/secondlife_256.BMP b/indra/newview/icons/development/secondlife_256.BMP
new file mode 100644
index 0000000000..174b22319a
--- /dev/null
+++ b/indra/newview/icons/development/secondlife_256.BMP
Binary files differ
diff --git a/indra/newview/icons/development/secondlife_256.png b/indra/newview/icons/development/secondlife_256.png
new file mode 100644
index 0000000000..29ed40abdc
--- /dev/null
+++ b/indra/newview/icons/development/secondlife_256.png
Binary files differ
diff --git a/indra/newview/icons/development/secondlife_32.png b/indra/newview/icons/development/secondlife_32.png
new file mode 100644
index 0000000000..3b84f5ec77
--- /dev/null
+++ b/indra/newview/icons/development/secondlife_32.png
Binary files differ
diff --git a/indra/newview/icons/development/secondlife_48.png b/indra/newview/icons/development/secondlife_48.png
new file mode 100644
index 0000000000..d2636d9d72
--- /dev/null
+++ b/indra/newview/icons/development/secondlife_48.png
Binary files differ
diff --git a/indra/newview/icons/development/secondlife_512.png b/indra/newview/icons/development/secondlife_512.png
new file mode 100644
index 0000000000..75f9b231f4
--- /dev/null
+++ b/indra/newview/icons/development/secondlife_512.png
Binary files differ
diff --git a/indra/newview/icons/project/secondlife.icns b/indra/newview/icons/project/secondlife.icns
new file mode 100644
index 0000000000..d6e26a8ed9
--- /dev/null
+++ b/indra/newview/icons/project/secondlife.icns
Binary files differ
diff --git a/indra/newview/icons/project/secondlife.ico b/indra/newview/icons/project/secondlife.ico
new file mode 100644
index 0000000000..ebb27e5325
--- /dev/null
+++ b/indra/newview/icons/project/secondlife.ico
Binary files differ
diff --git a/indra/newview/icons/project/secondlife_128.png b/indra/newview/icons/project/secondlife_128.png
new file mode 100644
index 0000000000..d67b8228f9
--- /dev/null
+++ b/indra/newview/icons/project/secondlife_128.png
Binary files differ
diff --git a/indra/newview/icons/project/secondlife_16.png b/indra/newview/icons/project/secondlife_16.png
new file mode 100644
index 0000000000..91493a033c
--- /dev/null
+++ b/indra/newview/icons/project/secondlife_16.png
Binary files differ
diff --git a/indra/newview/icons/project/secondlife_256.BMP b/indra/newview/icons/project/secondlife_256.BMP
new file mode 100644
index 0000000000..cd890725f8
--- /dev/null
+++ b/indra/newview/icons/project/secondlife_256.BMP
Binary files differ
diff --git a/indra/newview/icons/project/secondlife_256.png b/indra/newview/icons/project/secondlife_256.png
new file mode 100644
index 0000000000..cccfaf7cba
--- /dev/null
+++ b/indra/newview/icons/project/secondlife_256.png
Binary files differ
diff --git a/indra/newview/icons/project/secondlife_32.png b/indra/newview/icons/project/secondlife_32.png
new file mode 100644
index 0000000000..ad7b33f789
--- /dev/null
+++ b/indra/newview/icons/project/secondlife_32.png
Binary files differ
diff --git a/indra/newview/icons/project/secondlife_48.png b/indra/newview/icons/project/secondlife_48.png
new file mode 100644
index 0000000000..104a931fbc
--- /dev/null
+++ b/indra/newview/icons/project/secondlife_48.png
Binary files differ
diff --git a/indra/newview/icons/project/secondlife_512.png b/indra/newview/icons/project/secondlife_512.png
new file mode 100644
index 0000000000..74e2fa9bc6
--- /dev/null
+++ b/indra/newview/icons/project/secondlife_512.png
Binary files differ
diff --git a/indra/newview/icons/release/secondlife.icns b/indra/newview/icons/release/secondlife.icns
new file mode 100644
index 0000000000..e15e34140d
--- /dev/null
+++ b/indra/newview/icons/release/secondlife.icns
Binary files differ
diff --git a/indra/newview/icons/release/secondlife.ico b/indra/newview/icons/release/secondlife.ico
new file mode 100644
index 0000000000..28bf1e7664
--- /dev/null
+++ b/indra/newview/icons/release/secondlife.ico
Binary files differ
diff --git a/indra/newview/icons/release/secondlife_128.png b/indra/newview/icons/release/secondlife_128.png
new file mode 100644
index 0000000000..bcf94dcae8
--- /dev/null
+++ b/indra/newview/icons/release/secondlife_128.png
Binary files differ
diff --git a/indra/newview/icons/release/secondlife_16.png b/indra/newview/icons/release/secondlife_16.png
new file mode 100644
index 0000000000..90311ea8b0
--- /dev/null
+++ b/indra/newview/icons/release/secondlife_16.png
Binary files differ
diff --git a/indra/newview/icons/release/secondlife_256.BMP b/indra/newview/icons/release/secondlife_256.BMP
new file mode 100644
index 0000000000..74deedd7d3
--- /dev/null
+++ b/indra/newview/icons/release/secondlife_256.BMP
Binary files differ
diff --git a/indra/newview/icons/release/secondlife_256.png b/indra/newview/icons/release/secondlife_256.png
new file mode 100644
index 0000000000..a89fb4c74f
--- /dev/null
+++ b/indra/newview/icons/release/secondlife_256.png
Binary files differ
diff --git a/indra/newview/icons/release/secondlife_32.png b/indra/newview/icons/release/secondlife_32.png
new file mode 100644
index 0000000000..530e8fc80c
--- /dev/null
+++ b/indra/newview/icons/release/secondlife_32.png
Binary files differ
diff --git a/indra/newview/icons/release/secondlife_48.png b/indra/newview/icons/release/secondlife_48.png
new file mode 100644
index 0000000000..cb33c51f8a
--- /dev/null
+++ b/indra/newview/icons/release/secondlife_48.png
Binary files differ
diff --git a/indra/newview/icons/release/secondlife_512.png b/indra/newview/icons/release/secondlife_512.png
new file mode 100644
index 0000000000..f291e60586
--- /dev/null
+++ b/indra/newview/icons/release/secondlife_512.png
Binary files differ
diff --git a/indra/newview/icons/test/secondlife.icns b/indra/newview/icons/test/secondlife.icns
new file mode 100644
index 0000000000..eb8d16a7e7
--- /dev/null
+++ b/indra/newview/icons/test/secondlife.icns
Binary files differ
diff --git a/indra/newview/icons/test/secondlife.ico b/indra/newview/icons/test/secondlife.ico
new file mode 100644
index 0000000000..ceb8e8e6eb
--- /dev/null
+++ b/indra/newview/icons/test/secondlife.ico
Binary files differ
diff --git a/indra/newview/icons/test/secondlife_128.png b/indra/newview/icons/test/secondlife_128.png
new file mode 100644
index 0000000000..019f65db28
--- /dev/null
+++ b/indra/newview/icons/test/secondlife_128.png
Binary files differ
diff --git a/indra/newview/icons/test/secondlife_16.png b/indra/newview/icons/test/secondlife_16.png
new file mode 100644
index 0000000000..91493a033c
--- /dev/null
+++ b/indra/newview/icons/test/secondlife_16.png
Binary files differ
diff --git a/indra/newview/icons/test/secondlife_256.BMP b/indra/newview/icons/test/secondlife_256.BMP
new file mode 100644
index 0000000000..e23fcfdbe9
--- /dev/null
+++ b/indra/newview/icons/test/secondlife_256.BMP
Binary files differ
diff --git a/indra/newview/icons/test/secondlife_256.png b/indra/newview/icons/test/secondlife_256.png
new file mode 100644
index 0000000000..f402424c51
--- /dev/null
+++ b/indra/newview/icons/test/secondlife_256.png
Binary files differ
diff --git a/indra/newview/icons/test/secondlife_32.png b/indra/newview/icons/test/secondlife_32.png
new file mode 100644
index 0000000000..80d6efe13d
--- /dev/null
+++ b/indra/newview/icons/test/secondlife_32.png
Binary files differ
diff --git a/indra/newview/icons/test/secondlife_48.png b/indra/newview/icons/test/secondlife_48.png
new file mode 100644
index 0000000000..bba938feba
--- /dev/null
+++ b/indra/newview/icons/test/secondlife_48.png
Binary files differ
diff --git a/indra/newview/icons/test/secondlife_512.png b/indra/newview/icons/test/secondlife_512.png
new file mode 100644
index 0000000000..10ff65312b
--- /dev/null
+++ b/indra/newview/icons/test/secondlife_512.png
Binary files differ
diff --git a/indra/newview/installers/darwin/dmg-cleanup.applescript b/indra/newview/installers/darwin/dmg-cleanup.applescript
index f3d39aec21..8a71b392f9 100644
--- a/indra/newview/installers/darwin/dmg-cleanup.applescript
+++ b/indra/newview/installers/darwin/dmg-cleanup.applescript
@@ -19,7 +19,7 @@ tell application "Finder"
set current view of foo to icon view
set toolbar visible of foo to false
set statusbar visible of foo to false
- set the bounds of foo to {100, 100, 600, 399}
+ set the bounds of foo to {100, 100, 600, 449}
-- set the position of front window to {100, 100}
-- get {name, position} of every item of front window
diff --git a/indra/newview/installers/darwin/firstlook-dmg/Applications-alias.r b/indra/newview/installers/darwin/firstlook-dmg/Applications-alias.r
deleted file mode 100644
index aa3cfb87d8..0000000000
--- a/indra/newview/installers/darwin/firstlook-dmg/Applications-alias.r
+++ /dev/null
@@ -1,6996 +0,0 @@
-data 'alis' (0) {
- $"0000 0000 0112 0002 0001 036D 6277 0000" /* ...........mbw.. */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 C135 A717 482B 0000 0000" /* ......Á5§.H+.... */
- $"0002 0C41 7070 6C69 6361 7469 6F6E 7300" /* ...Applications. */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 00E2 4F18 C2E8 9FB0 0000 0000 0000" /* ...âO.Â蟰...... */
- $"0000 FFFF FFFF 0000 0920 0000 0000 0000" /* ..ÿÿÿÿ..Æ ...... */
- $"0000 0000 0000 0000 0003 6D62 7700 0010" /* ..........mbw... */
- $"0008 0000 C136 0987 0000 0011 0008 0000" /* ....Á6Ƈ........ */
- $"C2E9 0220 0000 0001 0000 0002 0010 6D62" /* Âé. ..........mb */
- $"773A 4170 706C 6963 6174 696F 6E73 000E" /* w:Applications.. */
- $"001A 000C 0041 0070 0070 006C 0069 0063" /* .....A.p.p.l.i.c */
- $"0061 0074 0069 006F 006E 0073 000F 0008" /* .a.t.i.o.n.s.... */
- $"0003 006D 0062 0077 0012 000C 4170 706C" /* ...m.b.w....Appl */
- $"6963 6174 696F 6E73 0013 0001 2F00 FFFF" /* ications..../.ÿÿ */
- $"0000" /* .. */
-};
-
-
-data 'icns' (-16455) {
- $"6963 6E73 0001 B3AC 6973 3332 0000 0224" /* icns..³¬is32...$ */
- $"9F00 005F 8061 005D 8700 055D 9AA2 A0A4" /* Ÿ.._€a.]‡..]š¢ ¤ */
- $"8986 0008 557D B3B2 B1B3 A881 8081 8104" /* ‰†..U}³²±³¨€. */
- $"826F 577E AF82 A801 B3AE 82AD 03AF 7B7A" /* ‚oW~¯‚¨.³®‚­.¯{z */
- $"A781 A203 9EB7 C89D 81A2 03A6 776E 9A80" /* §¢.ž·È¢.¦wnš€ */
- $"9705 959F D3DC A295 8097 5899 6C67 8F8D" /* —.•ŸÓÜ¢•€—X™lg */
- $"8E89 85C9 BCA9 C883 898D 8D8E 6561 8585" /* Ž‰…ɼ©Èƒ‰Žea…… */
- $"83A8 B7F3 BAB4 DFB6 AA84 8585 605E 7B7D" /* ƒ¨·óº´ß¶ª„……`^{} */
- $"79D0 F9E0 F0F2 DAE1 D87C 7D7B 5D5B 7476" /* yÐùàðòÚáØ|}{][tv */
- $"7099 D876 7373 76CA 8A72 7673 5B5A 6D70" /* p™ØvssvÊŠrvs[Zmp */
- $"6B9B 816C 6F6F 67B3 C567 706C 5A59 686B" /* k›loog³ÅgplZYhk */
- $"6B67 686B 806A 056B 6F6A 6B67 5A88 5900" /* kghk€j.kojkgZˆY. */
- $"5882 598A 5801 0059 9F00 0482 8383 8480" /* X‚YŠX..YŸ..‚ƒƒ„€ */
- $"8700 057F B7BE BDC0 A786 0008 799E D0CE" /* ‡...·¾½À§†..yžÐÎ */
- $"CECF C5A1 A081 A105 A390 7AA0 D0CA 80C9" /* ÎÏÅ¡ ¡.£z ÐÊ€É */
- $"01CA D183 CE03 D09C 9ECD 81C9 03C7 D4DE" /* .ÊуÎ.ÐœžÍÉ.ÇÔÞ */
- $"C681 C903 CD9A 94C5 80C2 05C1 C6E3 E9C8" /* ÆÉ.Íš”Å€Â.ÁÆãéÈ */
- $"C180 C20D C491 8DBD BBBC B9B6 DDD7 CCDD" /* Á€Â.Ä‘½»¼¹¶Ý×ÌÝ */
- $"B5B9 80BC 468B 87B4 B4B3 C8D1 F7D3 CFEA" /* µ¹€¼F‹‡´´³ÈÑ÷ÓÏê */
- $"D0C9 B4B4 B385 83AA ABA9 E0FB EAF5 F6E5" /* ÐÉ´´³…ƒª«©àûêõöå */
- $"EAE5 AAAB A981 80A0 A39E BAE4 A2A0 A1A2" /* ê媫©€ £žºä¢ ¡¢ */
- $"DAAF 9FA3 9F7F 7E97 9B97 B8A6 979A 9A94" /* Ú¯Ÿ£Ÿ.~—›—¸¦—šš” */
- $"CAD6 949B 977D 7D90 9493 9091 8293 0496" /* ÊÖ”›—}}”“‘‚“.– */
- $"9294 907D 8E7C 8A7B 0100 7C9F 0000 7A80" /* ’”}Ž|Š{..|Ÿ..z€ */
- $"7C00 7887 0005 77B1 B8B7 BBA0 8600 0871" /* |.x‡..w±¸·» †..q */
- $"97CB C9C8 CAC0 9B99 819A 049C 8972 99CA" /* —ËÉÈÊÀ›™š.œ‰r™Ê */
- $"82C3 00CB 83C8 03CA 9596 C681 C203 BFCF" /* ‚Ã.˃È.Ê•–ÆÂ.¿Ï */
- $"DABF 81C2 03C6 938C BD80 BA05 B9BF E0E7" /* Ú¿Â.Æ“Œ½€º.¹¿àç */
- $"C1B9 80BA 57BC 8985 B5B3 B3B0 ADD9 D2C6" /* Á¹€ºW¼‰…µ³³°­ÙÒÆ */
- $"D9AC B0B3 B3B4 827F ACAB AAC2 CCF6 CECA" /* Ù¬°³³´‚.¬«ªÂÌöÎÊ */
- $"E8CB C3AB ACAA 7D7B A1A3 A0DD FAE9 F4F5" /* èË묪}{¡£ Ýúéôõ */
- $"E3E8 E3A2 A3A0 7A78 989B 96B3 E29A 9898" /* ãè㢣 zx˜›–³âš˜˜ */
- $"9AD7 A897 9B97 7776 8F93 8FB2 9F8F 9292" /* š×¨—›—wv“²Ÿ’’ */
- $"8BC5 D28C 938F 7575 888C 8B89 8982 8B04" /* ‹ÅÒŒ“uuˆŒ‹‰‰‚‹. */
- $"8F8A 8C88 758E 748A 7301 0074 7338 6D6B" /* ŠŒˆuŽtŠs..ts8mk */
- $"0000 0108 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 1E24 2424 1600 0000 0000" /* .......$$$...... */
- $"0000 0000 0011 BDC8 C8C8 9600 0000 0000" /* ......½ÈÈÈ–..... */
- $"0000 0000 048C FFFF FFFF F5A7 9C9E 9E9E" /* .....Œÿÿÿÿõ§œžžž */
- $"9E9E 6003 8AFF FCFC FCFC FEFF FFFF FFFF" /* žž`.Šÿüüüüþÿÿÿÿÿ */
- $"FFFF FF7A 89FF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿz‰ÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FF7A 73FF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿzsÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FF64 62FF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿdbÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FF53 53FF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿSSÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FF45 48FF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿEHÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FF3C 41FF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿ<Aÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FD35 3DFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿý5=ÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FA30 3CFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿú0<ÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FB2F 1247 4B4A 4A4A 4A4A 4A4A 4A4A" /* ÿÿû/.GKJJJJJJJJJ */
- $"4A4B 450F 0101 0201 0101 0101 0101 0101" /* JKE............. */
- $"0102 0001 696C 3332 0000 05AB FF00 BE00" /* ....il32...«ÿ.¾. */
- $"025A 7881 847F 0064 9200 0262 BBC4 83C2" /* .Zx„..d’..b»ÄƒÂ */
- $"02C7 8451 9000 0255 86BF 84BC 03BF A064" /* .Ç„Q..U†¿„¼.¿ d */
- $"6389 6400 6281 0003 5770 A2A2 85A1 01A3" /* c‰d.b..Wp¢¢…¡.£ */
- $"9D89 9B07 9C97 6758 005B 95AC 88A7 02A8" /* ‰›.œ—gX.[•¬ˆ§.¨ */
- $"A4A7 89A8 05AB 925A 61A7 AE88 AC03 ABCA" /* ¤§‰¨.«’Za§®ˆ¬.«Ê */
- $"AEAB 88AC 05AE A15E 5B9A A788 A503 A0D7" /* ®«ˆ¬.®¡^[š§ˆ¥. × */
- $"D79F 88A5 05A8 9559 5990 A288 9F04 9BAB" /* ןˆ¥.¨•YY¢ˆŸ.›« */
- $"FBAE 9C87 9F05 A28B 5857 879D 879A 0595" /* û®œ‡Ÿ.¢‹XW‡‡š.• */
- $"BDD6 E6E3 9487 9A05 9D82 5656 7F97 8594" /* ½Öæ㔇š.‚VV.—…” */
- $"0995 8FB3 F4CF B1FF AD90 9585 9405 977A" /* Æ•³ôϱÿ­•…”.—z */
- $"0000 7793 8690 078D CDF8 B886 E8E5 8B86" /* ..w“†.Íø¸†è勆 */
- $"9005 9372 0000 708F 828C 808B 0984 BBF7" /* .“r..p‚Œ€‹Æ„»÷ */
- $"C687 85AB FFA9 8580 8B82 8C05 8E6D 0000" /* Ƈ…«ÿ©…€‹‚Œ.Žm.. */
- $"6B8A 8287 0D88 8785 8FF3 FDA1 8186 84E5" /* kŠ‚‡.ˆ‡…óý¡†„å */
- $"E484 8684 8705 8868 0000 6685 8183 117E" /* 䄆„‡.ˆh..f…ƒ.~ */
- $"B3E3 D0D2 FFDC D4DF DDDB D2FD D0DE E2B7" /* ³ãÐÒÿÜÔßÝÛÒýÐÞâ· */
- $"8082 8304 6400 0062 8081 7F06 76C5 FFDB" /* €‚ƒ.d..b€..vÅÿÛ */
- $"F9F3 E381 FF06 F6D4 BFF4 FFD3 7882 7F03" /* ùóãÿ.öÔ¿ôÿÓx‚.. */
- $"6100 005F 827B 0675 B0D9 E1FF C8D8 82DF" /* a.._‚{.u°ÙáÿÈØ‚ß */
- $"05BF F3C9 DCB9 7681 7B04 7A5E 0000 5C82" /* .¿óÉܹv{.z^..\‚ */
- $"7706 786F 96FF E879 7281 7306 7278 C8C2" /* w.xo–ÿèyrs.rxÈÂ */
- $"7074 7880 7706 7875 5C00 005A 7382 7405" /* ptx€w.xu\..Zs‚t. */
- $"71C1 E19A 6D74 8173 0574 6BA2 FFAD 6C81" /* qÁášmts.tk¢ÿ­l */
- $"7406 7571 5B00 005A 6F81 7104 6F77 F2AF" /* t.uq[..Zoq.owò¯ */
- $"6984 7105 6E7E FAFB 836D 8071 0772 6D5A" /* i„q.n~úûƒm€q.rmZ */
- $"0000 586C 6F80 6E03 6C7B 9368 866E 0467" /* ..Xlo€n.l{“h†n.g */
- $"C3FA 8B69 806E 076F 6A59 0000 586A 6E81" /* Ãú‹i€n.ojY..Xjn */
- $"6D01 6C68 876D 036B 717D 6B81 6D07 6E69" /* m.lh‡m.kq}km.ni */
- $"5900 0058 666A 8E69 0168 6682 6903 6A65" /* Y..XfjŽi.hf‚i.je */
- $"5900 BD59 0000 9B59 9E00 FF00 BE00 027D" /* Y.½Y..›Yž.ÿ.¾..} */
- $"98A0 829E 029F 9E85 9200 0284 D5DE 83DC" /* ˜ ‚ž.Ÿž…’..„ÕÞƒÜ */
- $"02E0 A275 9000 0279 A7DB 84D8 03DB BD87" /* .à¢u..y§Û„Ø.Û½‡ */
- $"8689 8700 8581 0003 7A92 C0C0 85BF 01C0" /* †‰‡.…..z’ÀÀ…¿.À */
- $"BB89 B907 BAB4 887B 007E B7CC 88C7 01C8" /* »‰¹.º´ˆ{.~·ÌˆÇ.È */
- $"C68A C805 CBB2 7C84 CAD1 89CF 02DE CFCE" /* ÆŠÈ.˲|„ÊщÏ.ÞÏÎ */
- $"88CF 05D2 C380 7FBF CC88 CA03 C7E8 E5C6" /* ˆÏ.ÒÀ.¿ÌˆÊ.ÇèåÆ */
- $"88CA 05CD B87C 7CB7 CA88 C704 C4CD FCCD" /* ˆÊ.͸||·ÊˆÇ.ÄÍüÍ */
- $"C587 C705 CAB0 7A7A AFC7 87C4 05C1 D4E3" /* ŇÇ.Ê°zz¯Ç‡Ä.ÁÔã */
- $"F0ED C087 C405 C8A8 7979 A7C4 85C0 09C1" /* ðíÀ‡Ä.Ȩyy§Ä…ÀÆÁ */
- $"BDD0 F7E1 D1FF CDBE C185 C005 C4A1 0000" /* ½Ð÷áÑÿ;Á…À.Ä¡.. */
- $"A0C1 86BD 07BA DEFB D5B7 F2EE B986 BD05" /*  Á†½.ºÞûÕ·ò½. */
- $"C09A 0000 9ABE 85BA 09B6 D4F9 DBB8 B6CD" /* Àš..š¾…ºÆ¶ÔùÛ¸¶Í */
- $"FFCA B785 BA05 BD94 0000 94B9 83B6 0EB4" /* ÿÊ·…º.½”..”¹ƒ¶.´ */
- $"B3B9 F7FE C4B0 B4B2 EFED B2B4 B4B5 82B6" /* ³¹÷þÄ°´²ïí²´´µ‚¶ */
- $"05B8 8F00 008E B481 B211 AFCD EBDF E0FF" /* .¸..Ž´².¯Íëßàÿ */
- $"E8E2 E9E8 E6E0 FEDF E8EA D0B0 81B2 05B3" /* èâéèæàþßèêа².³ */
- $"8A00 0089 AF81 AD06 A8D9 FFE7 FBF7 EB81" /* Š..‰¯­.¨Ùÿçû÷ë */
- $"FF06 F9E1 D3F8 FFE3 A980 AD05 AEAD 8600" /* ÿ.ùáÓøÿã©€­.®­†. */
- $"0086 82A9 06A5 CBE5 EAFF DAE5 82EA 05D3" /* .†‚©.¥ËåêÿÚå‚ê.Ó */
- $"F7DA E8D1 A680 A906 AAA7 8300 0082 A382" /* ÷ÚèѦ€©.ª§ƒ..‚£‚ */
- $"A405 9FB7 FFF0 A5A1 81A2 05A1 A5D9 D39F" /* ¤.Ÿ·ÿ𥡢.¡¥ÙÓŸ */
- $"A281 A406 A5A1 8000 0080 9F82 A004 9ED2" /* ¢¤.¥¡€..€Ÿ‚ .žÒ */
- $"E9BA 9B83 A004 9ABF FFC5 9A81 A007 A19C" /* 麛ƒ .š¿ÿÅš .¡œ */
- $"7F00 007E 999D 809B 059A 9FF6 C696 9C83" /* ...~™€›.šŸöÆ–œƒ */
- $"9B05 99A4 FBFB A799 809B 079C 977D 0000" /* ›.™¤ûû§™€›.œ—}.. */
- $"7C95 9980 9803 97A1 B295 8698 0494 D5FC" /* |•™€˜.—¡²•†˜.”Õü */
- $"AC95 8098 0799 937C 0000 7C93 9782 9600" /* ¬•€˜.™“|..|“—‚–. */
- $"9387 9603 9599 A295 8196 0797 917C 0000" /* “‡–.•™¢•–.—‘|.. */
- $"7B8E 928D 9102 9290 8F82 9103 928C 7B00" /* {Ž’‘.’‚‘.’Œ{. */
- $"BD7C 0000 9B7C 9E00 FF00 BE00 0275 9199" /* ½|..›|ž.ÿ.¾..u‘™ */
- $"8498 007E 9200 027D D0D9 83D7 02DB 9B6C" /* „˜.~’..}ÐÙƒ×.Û›l */
- $"9000 0271 A0D5 84D2 03D5 B67F 7E89 7F00" /* ..q Õ„Ò.Õ¶.~‰.. */
- $"7D81 0003 728B BBBB 85BA 02BB B6B3 88B4" /* }..r‹»»…º.»¶³ˆ´ */
- $"08B5 AF81 7300 76B0 C6C2 87C1 01C2 C089" /* .µ¯s.v°Æ‡Á.ÂÀ‰ */
- $"C206 C3C5 AB75 7CC3 CA89 C801 DBC9 89C8" /* Â.ÃÅ«u|ÃʉÈ.ÛÉ‰È */
- $"05CB BD78 77B9 C588 C304 C0E5 E2BF C487" /* .˽xw¹ÅˆÃ.Àåâ¿Ä‡ */
- $"C305 C6B2 7574 B0C3 87C0 05BF BCC7 FCC7" /* Ã.Ʋut°Ã‡À.¿¼ÇüÇ */
- $"BE87 C005 C3A9 7272 A7BF 87BC 05B9 D0E1" /* ¾‡À.érr§¿‡¼.¹Ðá */
- $"EEEB B887 BC05 C0A1 7171 A0BC 86B8 07B5" /* î븇¼.À¡qq ¼†¸.µ */
- $"CBF6 DDCB FFC7 B586 B805 BB99 0000 98B9" /* ËöÝËÿǵ†¸.»™..˜¹ */
- $"86B5 07B2 DBFA D0AE F0EC B186 B505 B892" /* †µ.²ÛúЮð챆µ.¸’ */
- $"0000 91B5 82B2 80B1 09AC D0F9 D7AF ADC7" /* ..‘µ‚²€±Æ¬Ðùׯ­Ç */
- $"FFC4 AD80 B182 B205 B48C 0000 8BB1 81AD" /* ÿÄ­€±‚².´Œ..‹±­ */
- $"11AE ADAC ABB1 F6FD BDA8 ABAA EDEB A9AB" /* .®­¬«±öý½¨«ªíë©« */
- $"ACAC AE81 AD05 AF87 0000 86AB 81A9 11A6" /* ¬¬®­.¯‡..†«©.¦ */
- $"C8E9 DCDE FFE5 DFE7 E6E4 DDFE DCE6 E9CB" /* ÈéÜÞÿåßçæäÝþÜæéË */
- $"A781 A905 AA82 0000 81A6 81A5 069F D6FF" /* §©.ª‚..¦¥.ŸÖÿ */
- $"E4FA F6EA 81FF 06F8 DFCF F7FF E0A0 80A5" /* äúöêÿ.øßÏ÷ÿà €¥ */
- $"05A6 A47E 0000 7D82 A006 9BC6 E3E8 FFD6" /* .¦¤~..}‚ .›ÆãèÿÖ */
- $"E282 E805 CFF6 D7E6 CC9C 80A0 06A1 9E7B" /* â‚è.Ïö×æÌœ€ .¡ž{ */
- $"0000 7A9B 829C 0496 B1FF EF9D 8399 049C" /* ..z›‚œ.–±ÿ.œ */
- $"D6D0 969A 819C 069D 9979 0000 7897 8198" /* ÖЖšœ.™y..x—˜ */
- $"0597 95CF E7B4 9283 9704 91BA FFC0 9181" /* .—•Ïç´’ƒ—.‘ºÿÀ‘ */
- $"9807 9994 7700 0076 9295 8094 0493 98F5" /* ˜.™”w..v’•€”.“˜õ */
- $"C28E 8494 0592 9DFB FBA0 9180 9407 958F" /* ÂŽ„”.’ûû ‘€”.• */
- $"7500 0074 8E91 8090 038F 9AAC 8C86 9004" /* u..tŽ‘€.š¬Œ†. */
- $"8BD1 FBA6 8C80 9007 918B 7400 0074 8B8F" /* ‹Ñû¦Œ€.‘‹t..t‹ */
- $"808E 048F 8E8B 8E8F 848E 048F 8D91 9B8D" /* €Ž.Ž‹Ž„Ž.‘› */
- $"818E 078F 8974 0000 7487 8B8E 8A01 8987" /* Ž.‰t..t‡‹ŽŠ.‰‡ */
- $"828A 038B 8574 00BD 7400 009B 749E 006C" /* ‚Š.‹…t.½t..›tž.l */
- $"386D 6B00 0004 0800 0000 0000 0000 0000" /* 8mk............. */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0B76 8889 8989" /* ...........vˆ‰‰‰ */
- $"8989 8988 3800 0000 0000 0000 0000 0000" /* ‰‰‰ˆ8........... */
- $"0000 0000 0000 0000 0000 36FF FFFF FFFF" /* ..........6ÿÿÿÿÿ */
- $"FFFF FFFF A301 0000 0000 0000 0000 0000" /* ÿÿÿÿ£........... */
- $"0000 0000 0000 0000 0006 A4FF FFFF FFFF" /* ..........¤ÿÿÿÿÿ */
- $"FFFF FFFF DE59 3F40 4040 4040 4040 4040" /* ÿÿÿÿÞY?@@@@@@@@@ */
- $"4040 4033 0000 0000 1384 F8F3 F3F3 F3F3" /* @@@3.....„øóóóóó */
- $"F3F3 F3F3 F7F9 F7F7 F7F7 F7F7 F7F7 F7F7" /* óóóó÷ù÷÷÷÷÷÷÷÷÷÷ */
- $"F7F7 F7F1 520D 001D E1FF FAFB FBFB FBFB" /* ÷÷÷ñR...áÿúûûûûû */
- $"FBFB FBFB FBFB FBFB FBFB FBFB FBFB FBFB" /* ûûûûûûûûûûûûûûûû */
- $"FBFB FBFB FFCD 0E39 FFFF FFFF FFFF FFFF" /* ûûûûÿÍ.9ÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFF8 1F26 F6FF FFFF FFFF FFFF" /* ÿÿÿÿÿø.&öÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFE5 1318 ECFF FFFF FFFF FFFF" /* ÿÿÿÿÿå..ìÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFD5 0A0F DDFF FFFF FFFF FFFF" /* ÿÿÿÿÿÕÂ.Ýÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFC6 0206 D0FF FFFF FFFF FFFF" /* ÿÿÿÿÿÆ..Ðÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFB6 0000 C2FF FFFF FFFF FFFF" /* ÿÿÿÿÿ¶..Âÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFA5 0000 B2FF FFFF FFFF FFFF" /* ÿÿÿÿÿ¥..²ÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FF95 0000 A4FF FFFF FFFF FFFF" /* ÿÿÿÿÿ•..¤ÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FF87 0000 96FF FFFF FFFF FFFF" /* ÿÿÿÿÿ‡..–ÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FF7A 0000 8AFF FFFF FFFF FFFF" /* ÿÿÿÿÿz..Šÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FF6D 0000 7FFF FFFF FFFF FFFF" /* ÿÿÿÿÿm...ÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FF63 0000 77FF FFFF FFFF FFFF" /* ÿÿÿÿÿc..wÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FF5A 0000 6FFF FFFF FFFF FFFF" /* ÿÿÿÿÿZ..oÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FF54 0000 69FF FFFF FFFF FFFF" /* ÿÿÿÿÿT..iÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FF4F 0000 65FF FFFF FFFF FFFF" /* ÿÿÿÿÿO..eÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FF4C 0000 64FF FFFF FFFF FFFF" /* ÿÿÿÿÿL..dÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FF4B 0000 61FF FFFF FFFF FFFF" /* ÿÿÿÿÿK..aÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FF48 0004 2C6D 7574 7474 7474" /* ÿÿÿÿÿH..,muttttt */
- $"7474 7474 7474 7474 7474 7474 7474 7474" /* tttttttttttttttt */
- $"7474 7475 6824 0202 0D18 1C1C 1C1C 1C1C" /* tttuh$.......... */
- $"1C1C 1C1C 1C1C 1C1C 1C1C 1C1C 1C1C 1C1C" /* ................ */
- $"1C1C 1C1C 170C 0100 0103 0303 0303 0303" /* ................ */
- $"0303 0303 0303 0303 0303 0303 0303 0303" /* ................ */
- $"0303 0303 0301 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0069 6833 3200 0009 DEFF" /* .......ih32..ÆÞÿ */
- $"00FF 00FF 00AD 0001 5E66 8865 0261 5859" /* .ÿ.ÿ.­..^fˆe.aXY */
- $"9C00 025E A6BA 87B7 04B9 AE67 5659 9B00" /* œ..^¦º‡·.¹®gVY›. */
- $"0266 BABF 87BE 04BF BC70 5459 9A00 0252" /* .fº¿‡¾.¿¼pTYš..R */
- $"81BD 89BA 03BC 8652 5491 5585 0003 5580" /* ½‰º.¼†RT‘U…..U€ */
- $"B7BA 89B9 02BA B497 918F 0191 7683 0003" /* ·º‰¹.º´—‘.‘vƒ.. */
- $"5864 9399 8B97 0098 929B 039D 855F 5A80" /* Xd“™‹—.˜’›.…_Z€ */
- $"0002 649D A990 A500 A490 A509 A6A9 9B65" /* ..d©¥.¤¥Æ¦©›e */
- $"0000 85B4 AFAF 8EAE 03B0 AEAC AF8E AE07" /* ..…´¯¯Ž®.°®¬¯Ž®. */
- $"AFAF B280 0000 80AD 8FA9 04A8 B2E7 ACA8" /* ¯¯²€..€­©.¨²ç¬¨ */
- $"90A9 05AB 7A00 0076 A98F A604 A5A4 F1E0" /* ©.«z..v©¦.¥¤ñà */
- $"A08F A606 A7A6 7100 006D A390 A204 9DC8" /*  ¦.§¦q..m£¢.È */
- $"FFB9 9C8E A207 A3A0 6A00 0065 9D9F 8D9E" /* ÿ¹œŽ¢.£ j..eŸž */
- $"069F 9C96 A2FA EF9C 8E9E 079F 9A65 0000" /* .Ÿœ–¢úž.Ÿše.. */
- $"6097 9C8D 9B07 97A5 E2C6 D2FF C394 8D9B" /* `—œ›.—¥âÆÒÿÔ› */
- $"079C 9461 0000 5E90 988C 9709 959A D5CE" /* .œ”a..^˜Œ—Æ•šÕÎ */
- $"E4B2 FCF4 9A95 8C97 0799 8D5E 0000 5A8B" /* ä²üôš•Œ—.™^..Z‹ */
- $"968C 9409 8EC8 FFF6 C18D DDFF C78C 8C94" /* –Œ”ÆŽÈÿöÁÝÿÇŒŒ” */
- $"0796 875B 0000 5885 938B 910B 8F8F E5FF" /* .–‡[..X…“‹‘.åÿ */
- $"FFA9 87AA FFF7 988E 8B91 0793 8159 0000" /* ÿ©‡ªÿ÷˜Ž‹‘.“Y.. */
- $"577F 908B 8E0B 87CF D4D0 CA89 8D8B E0FF" /* W.‹Ž.‡ÏÔÐʉ‹àÿ */
- $"C786 8B8E 0790 7B58 0000 5779 8C86 8A81" /* dž‹Ž.{X..WyŒ†Š */
- $"8B0D 84A5 FFFF E38B 898B 85A8 FFF8 9387" /* ‹.„¥ÿÿ㋉‹…¨ÿø“‡ */
- $"818B 868A 078C 7557 0000 5674 8A85 8800" /* ‹†Š.ŒuW..VtŠ…ˆ. */
- $"8680 820E 8385 E4FF FFB9 7C83 8381 7FDD" /* †€‚.ƒ…äÿÿ¹|ƒƒ.Ý */
- $"FFC6 7E81 8200 8585 8807 8A71 5759 0056" /* ÿÆ~‚.……ˆ.ŠqWY.V */
- $"6F87 8485 1983 929F A3A0 94B0 FFFF E39D" /* o‡„….ƒ’Ÿ£ ”°ÿÿã */
- $"9F9E 9DA3 9AB0 FBF4 98A0 A09F A192 8484" /* Ÿž£š°ûô˜  Ÿ¡’„„ */
- $"8507 876D 5759 0056 6984 8482 197C A7EB" /* ….‡mWY.Vi„„‚.|§ë */
- $"FBF1 C2EC FFFB C1ED F2F6 ECFB EDD9 DBFF" /* ûñÂìÿûÁíòöìûíÙÛÿ */
- $"D4EE F0F6 F6B7 7C84 8207 8369 5700 5956" /* Ôîðöö·|„‚.ƒiW.YV */
- $"6481 847F 0979 A3FF FFEB CCFF FFD5 E084" /* d„.Æy£ÿÿëÌÿÿÕà„ */
- $"FF03 C8F1 BCC4 80FF 01C0 7785 7F06 6557" /* ÿ.Èñ¼Ä€ÿ.Àw…..eW */
- $"5959 5661 7E84 7D08 76A3 FFFF C3F4 FFF5" /* YYVa~„}.v£ÿÿÃôÿõ */
- $"CB85 FF08 EDA8 CCC0 F2FF FFC1 7485 7D06" /* Ë…ÿ.í¨ÌÀòÿÿÁt…}. */
- $"6358 5959 575E 7B84 7A09 7692 D0BE D6FF" /* cXYYW^{„zÆv’оÖÿ */
- $"FFC2 B9D0 84CF 08CD B9FF F1B1 CED0 A574" /* ÿ¹ЄÏ.͹ÿñ±ÎÐ¥t */
- $"847A 0679 6058 5959 585D 8678 0776 6A9C" /* „z.y`XYYX]†x.vjœ */
- $"FFFF F081 7086 7106 75D1 D89D 6A71 7484" /* ÿÿðp†q.uÑØjqt„ */
- $"7808 7976 5E58 5959 585B 7486 7505 73B9" /* x.yv^XYYX[t†u.s¹ */
- $"F5FF AC6D 8775 0570 8CEB F889 6F85 7508" /* õÿ¬m‡u.pŒëø‰o…u. */
- $"7672 5C58 5959 5859 7285 7306 6F8A E1C6" /* vr\XYYXYr…s.oŠáÆ */
- $"C176 7287 7306 7179 EEFF E173 7184 7308" /* Ávr‡s.qyîÿásq„s. */
- $"7470 5B58 5959 5859 7085 7205 6B97 FFE7" /* tp[XYYXYp…r.k—ÿç */
- $"776E 8972 0569 C6FF FFB4 6A84 7202 736E" /* wn‰r.iÆÿÿ´j„r.sn */
- $"5A81 5901 586D 856F 0567 B9D9 786B 7089" /* ZY.Xm…o.g¹Ùxkp‰ */
- $"6F06 6993 FFFF F173 6D83 6F01 706B 8259" /* o.i“ÿÿñsmƒo.pk‚Y */
- $"0157 6B85 6E03 6C8C 7269 8B6E 066D 6BD3" /* .Wk…n.lŒri‹n.mkÓ */
- $"FFCB 6C6D 836E 026F 6958 8159 0256 6A6E" /* ÿËlmƒn.oiXY.Vjn */
- $"856D 0169 6B8D 6D04 6A73 8A6D 6B84 6D02" /* …m.ikm.jsŠmk„m. */
- $"6E68 5881 5902 566A 6E98 6D02 6B67 6C85" /* nhXY.Vjn˜m.kgl… */
- $"6D02 6E68 5881 5902 5665 69A3 6802 6963" /* m.nhXY.Vei£h.ic */
- $"5881 5901 5858 A559 0058 B059 0000 AB59" /* XY.XX¥Y.X°Y..«Y */
- $"8000 A959 DF00 FF00 FF00 FF00 AD00 0081" /* €.©Yß.ÿ.ÿ.ÿ.­.. */
- $"8987 0283 7B7C 9C00 0280 C1D3 87D1 04D2" /* ‰‡.ƒ{|œ..€ÁÓ‡Ñ.Ò */
- $"C787 7A7C 9B00 0288 D4DA 87D9 04DA D68F" /* LJz|›..ˆÔÚ‡Ù.ÚÖ */
- $"787C 9A00 0276 A2D8 89D6 02D7 A476 9278" /* x|š..v¢Ø‰Ö.פv’x */
- $"8500 0379 A2D3 D789 D503 D6D0 B5AD 90AE" /* …..y¢Ó׉Õ.Öе­® */
- $"01B0 9683 0003 7C87 B1B7 8BB5 00B6 92B9" /* .°–ƒ..|‡±·‹µ.¶’¹ */
- $"03BA A282 7D80 0003 87BD C8C5 90C4 00C5" /* .º¢‚}€..‡½ÈÅÄ.Å */
- $"8FC4 08C5 C8B9 8700 00A7 D6D1 90D0 01CD" /* Ä.Åȹ‡..§ÖÑÐ.Í */
- $"CF90 D006 D1D3 A000 00A3 D18F CD04 CCD1" /* ÏÐ.ÑÓ ..£ÑÍ.ÌÑ */
- $"EECC CC90 CD05 CF9B 0000 9ACE 90CB 03CA" /* îÌÌÍ.Ï›..šÎË.Ê */
- $"F7E9 C68F CB07 CCCB 9300 0091 C9C9 8FC8" /* ÷éÆË.ÌË“..‘ÉÉÈ */
- $"04C6 DFFF D2C5 8EC8 07C9 C68D 0000 8BC5" /* .ÆßÿÒÅŽÈ.ÉÆ..‹Å */
- $"C78D C606 C7C5 BFC7 FDF3 C38E C607 C7C0" /* ÇÆ.ÇÅ¿ÇýóÃŽÆ.ÇÀ */
- $"8800 0086 C0C5 8DC4 07C2 C7EB DAE4 FFD9" /* ˆ..†ÀÅÄ.ÂÇëÚäÿÙ */
- $"C08D C407 C6BC 8400 0082 BBC4 8CC2 09C1" /* ÀÄ.Ƽ„..‚»ÄŒÂÆÁ */
- $"C2E2 DEED D1FD F7C1 C18C C207 C4B6 8100" /* ÂâÞíÑý÷ÁÁŒÂ.Ķ. */
- $"007F B5C2 8CC0 09BC DBFF F8D7 BBEA FFDB" /* ..µÂŒÀƼÛÿø×»êÿÛ */
- $"BA8C C007 C2B0 7E00 007C B0C0 8BBE 0BBD" /* ºŒÀ.°~..|°À‹¾.½ */
- $"BAED FFFF CCB8 CCFF F9BF BC8B BE07 C0AA" /* ºíÿÿ̸Ìÿù¿¼‹¾.Àª */
- $"7C00 007B ABBF 8BBC 0BB7 DEE1 DFDF B9BB" /* |..{«¿‹¼.·Þáßß¹» */
- $"BAED FFDA B78B BC07 BFA5 7B00 007A A5BC" /* ºíÿÚ·‹¼.¿¥{..z¥¼ */
- $"89B9 0EBA B6C6 FFFF ECB9 B9BA B6CB FFFA" /* ‰¹.º¶Æÿÿì¹¹º¶Ëÿú */
- $"BCB8 8AB9 07BC 9F7A 0000 799F B984 B601" /* ¼¸Š¹.¼Ÿz..yŸ¹„¶. */
- $"B7B5 82B3 0CEC FFFF D4AF B3B3 B2B1 EAFF" /* ·µ‚³.ìÿÿÔ¯³³²±êÿ */
- $"D9B0 81B3 01B5 B784 B607 B899 797C 0079" /* Ù°³.µ·„¶.¸™y|.y */
- $"99B7 84B4 13B3 B9BE C1C0 B9CB FFFF EDBE" /* ™·„´.³¹¾ÁÀ¹Ëÿÿí¾ */
- $"BFBE BEC1 BCCB FCF7 BB80 BF02 C0B9 B384" /* ¿¾¾Á¼Ëü÷»€¿.À¹³„ */
- $"B407 B694 797C 0079 93B4 84B1 19AD C7F1" /* ´.¶”y|.y“´„±.­Çñ */
- $"FBF5 D6F1 FFFD D5F2 F5F8 F1FB F2E4 E7FF" /* ûõÖñÿýÕòõøñûòäçÿ */
- $"E2F3 F4F8 F8D0 AD84 B107 B290 7A00 7C79" /* âóôøøЭ„±.²z.|y */
- $"8DB0 84AE 09AA C3FF FFF2 DCFF FFE2 E984" /* °„®ÆªÃÿÿòÜÿÿâé„ */
- $"FF03 D9F6 D1D8 80FF 01D6 A985 AE06 8C7A" /* ÿ.ÙöÑØ€ÿ.Ö©…®.Œz */
- $"7C7C 7989 AD84 AB08 A7C3 FFFF D5F7 FFF8" /* ||y‰­„«.§ÃÿÿÕ÷ÿø */
- $"DA85 FF08 F2C2 DAD3 F6FF FFD7 A583 AB08" /* Ú…ÿ.òÂÚÓöÿÿ×¥ƒ«. */
- $"ACAA 897A 7C7C 7A86 A984 A809 A5B7 E0D3" /* ¬ª‰z||z†©„¨Æ¥·àÓ */
- $"E2FF FFD6 D0E0 84DF 08DD CFFF F5CB DFE0" /* âÿÿÖÐà„ß.ÝÏÿõËßà */
- $"C3A4 83A8 07A9 A686 7A7C 7C7A 8386 A506" /* 䃨.©¦†z||zƒ†¥. */
- $"A39B BAFF FFF5 AA87 A006 A3DF E2BA 9BA1" /* £›ºÿÿõª‡ .£ß⺛¡ */
- $"A284 A507 A6A2 837B 7C7C 7B82 87A2 059F" /* ¢„¥.¦¢ƒ{||{‚‡¢.Ÿ */
- $"CCF8 FFC7 9C87 A205 9EAF F0F9 AD9E 85A2" /* ÌøÿÇœ‡¢.ž¯ðù­ž…¢ */
- $"08A3 9F81 7B7C 7C7B 7F9D 859F 069C AEE8" /* .£Ÿ{||{.…Ÿ.œ®è */
- $"D4D3 A09E 879F 069D A3F4 FFE8 9D9E 849F" /* ÔÓ ž‡Ÿ.£ôÿèž„Ÿ */
- $"09A0 9B7F 7B7C 7C7B 7E9A 9D84 9C05 98B5" /* Æ ›.{||{~š„œ.˜µ */
- $"FFEE 9F99 899C 0596 D7FF FFC9 9684 9C09" /* ÿ‰œ.–×ÿÿÉ–„œÆ */
- $"9D97 7E7B 7C7C 7B7C 989B 849A 0494 CCE4" /* —~{||{|˜›„š.”Ìä */
- $"A097 8A9A 0695 B3FF FFF4 9C99 839A 019B" /*  —Šš.•³ÿÿôœ™ƒš.› */
- $"9482 7C02 7B95 9984 9803 97AD 9B95 8B98" /* ”‚|.{•™„˜.—­›•‹˜ */
- $"0697 96E0 FFDA 9797 8398 0199 9282 7C02" /* .—–àÿÚ——ƒ˜.™’‚|. */
- $"7A93 9785 9601 9395 8D96 0494 9AAB 9695" /* z“—…–.“•–.”š«–• */
- $"8496 0297 8F7B 817C 027A 9297 9896 0294" /* „–.—{|.z’—˜–.” */
- $"9295 8596 0297 8F7B 817C 027A 8C91 A390" /* ’•…–.—{|.zŒ‘£ */
- $"0291 897A 817C 017B 7BA5 7C00 7BB0 7C00" /* .‘‰z|.{{¥|.{°|. */
- $"00AB 7C80 00A9 7CDF 00FF 00FF 00FF 00AD" /* .«|€.©|ß.ÿ.ÿ.ÿ.­ */
- $"0000 7A89 8002 7C73 749C 0002 79BC CE87" /* ..z‰€.|stœ..y¼Î‡ */
- $"CC04 CDC2 8172 749B 0002 80CF D587 D304" /* Ì.ÍÂrt›..€ÏÕ‡Ó. */
- $"D4D1 8870 749A 0002 6E9B D288 D003 D1D2" /* Ôшptš..n›ÒˆÐ.ÑÒ */
- $"9E6E 9270 8500 0371 9BCE D289 D002 D1CB" /* žn’p…..q›ÎÒ‰Ð.ÑË */
- $"AF91 A801 AA90 8300 0474 80AC B2AF 8AB0" /* ¯‘¨.ªƒ..t€¬²¯Š° */
- $"02B1 B3B4 90B3 03B5 9D7A 7580 0002 80B7" /* .±³´³.µzu€..€· */
- $"C3A4 BF09 C0C3 B57F 0000 A0CF CACA 8DC9" /* ä¿ÆÀõ... ÏÊÊÉ */
- $"04CA CAC6 C8CA 8EC9 07CA CACD 9900 009C" /* .ÊÊÆÈÊŽÉ.ÊÊÍ™..œ */
- $"CA8F C604 C5CB EDC5 C58F C606 C7C8 9400" /* ÊÆ.ÅËíÅÅÆ.ÇÈ”. */
- $"0093 C790 C403 C3F6 E7BF 8FC4 07C5 C48B" /* .“ÇÄ.Ãöç¿Ä.ÅÄ‹ */
- $"0000 8AC2 C28F C104 BEDA FFCE BE8E C107" /* ..ŠÂÂÁ.¾ÚÿξŽÁ. */
- $"C2BF 8600 0083 BEC0 8DBF 06C0 BEB8 C1FC" /* ¿†..ƒ¾À¿.À¾¸Áü */
- $"F3BC 8EBF 07C0 BA81 0000 7EB9 BE8D BD07" /* 󼎿.Àº..~¹¾½. */
- $"BAC0 E9D6 E1FF D5B8 8DBD 07BF B57C 0000" /* ºÀéÖáÿÕ¸½.¿µ|.. */
- $"7AB3 BC8C BA09 B9BB DFDB EBCB FDF7 BAB9" /* z³¼ŒºÆ¹»ßÛëËý÷º¹ */
- $"8CBA 07BC AE79 0000 77AE B98C B709 B3D7" /* Œº.¼®y..w®¹Œ·Æ³× */
- $"FFF8 D3B2 E8FF D7B1 8CB7 07B9 A876 0000" /* ÿøÓ²èÿ×±Œ·.¹¨v.. */
- $"74A9 B78A B50C B6B5 B2EC FFFF C6AF C6FF" /* t©·Šµ.¶µ²ìÿÿƯÆÿ */
- $"F9B8 B48B B507 B7A3 7400 0073 A3B6 8BB3" /* ù¸´‹µ.·£t..s£¶‹³ */
- $"0BAE DBDE DDDB B0B3 B1EA FFD7 AE8B B307" /* .®ÛÞÝÛ°³±êÿ×®‹³. */
- $"B59D 7300 0072 9CB3 8AB0 04AD C0FF FFEA" /* µs..rœ³Š°.­Àÿÿê */
- $"80B0 05AD C4FF F9B4 AF8A B007 B397 7200" /* €°.­Äÿù´¯Š°.³—r. */
- $"0071 97B1 85AE 00AC 80AA 0EAB AAEA FFFF" /* .q—±…®.¬€ª.«ªêÿÿ */
- $"CFA6 AAAA A9A7 E7FF D5A7 81AA 00AC 85AE" /* Ϧªª©§çÿÕ§ª.¬…® */
- $"07B0 9171 7400 7191 AE84 AB13 AAB2 B9BB" /* .°‘qt.q‘®„«.ª²¹» */
- $"BAB2 C6FF FFEB B7B9 B8B7 BBB6 C5FC F7B5" /* º²Æÿÿë·¹¸·»¶Åü÷µ */
- $"80B9 01BA B285 AB07 AD8C 7174 0070 8BAB" /* €¹.º²…«.­Œqt.p‹« */
- $"84A8 19A4 C1EF FBF4 D2F0 FFFC D1F1 F4F8" /* „¨.¤ÁïûôÒðÿüÑñôø */
- $"F0FB F1E2 E5FF DFF2 F3F8 F8CB A484 A807" /* ðûñâåÿßòóøøˤ„¨. */
- $"A988 7200 7471 85A7 84A5 09A1 BDFF FFF0" /* ©ˆr.tq…§„¥Æ¡½ÿÿð */
- $"D9FF FFE0 E784 FF03 D6F5 CDD4 80FF 01D2" /* Ùÿÿàç„ÿ.ÖõÍÔ€ÿ.Ò */
- $"9F85 A506 8472 7474 7181 A484 A208 9EBD" /* Ÿ…¥.„rttq¤„¢.ž½ */
- $"FFFF D2F6 FFF7 D785 FF08 F1BD D8CF F6FF" /* ÿÿÒöÿ÷×…ÿ.ñ½ØÏöÿ */
- $"FFD3 9C83 A208 A3A2 8172 7474 727E A084" /* ÿÓœƒ¢.£¢rttr~ „ */
- $"9F09 9CB0 DDCF DFFF FFD2 CCDD 84DC 08DA" /* ŸÆœ°ÝÏßÿÿÒÌÝ„Ü.Ú */
- $"CBFF F4C6 DCDD BE9B 839F 08A0 9E7E 7274" /* ËÿôÆÜݾ›ƒŸ. ž~rt */
- $"7472 7C9D 849C 089D 9B93 B5FF FFF4 A397" /* tr|„œ.›“µÿÿô£— */
- $"8598 0897 9BDD E0B4 9398 9A9D 839C 089D" /* …˜.—›Ýà´“˜šƒœ. */
- $"9A7B 7374 7473 7998 8699 0597 C8F7 FFC1" /* š{sttsy˜†™.—È÷ÿÁ */
- $"9387 9905 96A9 EEF9 A695 8599 089A 9679" /* “‡™.–©îù¦•…™.š–y */
- $"7374 7473 7795 8596 0693 A7E6 D1D0 9895" /* sttsw•…–.“§æÑИ• */
- $"8796 0695 9BF3 FFE7 9595 8496 0897 9377" /* ‡–.•›óÿç••„–.—“w */
- $"7374 7473 7693 8595 058F B0FF ED98 9289" /* sttsv“…•.°ÿ혒‰ */
- $"9505 8ED4 FFFF C58E 8495 0996 9076 7374" /* •.ŽÔÿÿÅŽ„•Æ–vst */
- $"7473 7490 9384 9204 8BC8 E299 8F8A 9206" /* tst“„’.‹È♊’. */
- $"8DAD FFFF F494 9183 9202 938C 7581 7402" /* ­ÿÿô”‘ƒ’.“Œut. */
- $"738D 9184 9003 8EA7 938D 8B90 068F 8EDD" /* s‘„.Ž§“‹.ŽÝ */
- $"FFD7 8E8F 8390 0191 8A82 7402 728B 8F85" /* ÿ׎ƒ.‘Š‚t.r‹… */
- $"8E01 8B8D 8D8E 048C 93A4 8E8D 848E 028F" /* Ž.‹Ž.Œ“¤Ž„Ž. */
- $"8773 8174 0272 8B8F 988E 028C 8A8D 858E" /* ‡st.r‹˜Ž.ŒŠ…Ž */
- $"028F 8773 8174 0272 8489 A388 0289 8173" /* .‡st.r„‰£ˆ.‰s */
- $"8174 0173 73A5 7400 73B0 7400 00AB 7480" /* t.ss¥t.s°t..«t€ */
- $"00A9 74DF 0068 386D 6B00 0009 0800 0000" /* .©tß.h8mk..Æ.... */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 002E 4549 4A4A 4A4A 4A4A 4A4A 4A4A" /* ....EIJJJJJJJJJJ */
- $"3B0A 0400 0000 0000 0000 0000 0000 0000" /* ;Â.............. */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 2FF9 FFFF FFFF FFFF FFFF FFFF FFFF" /* ../ùÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FD52 0802 0000 0000 0000 0000 0000 0000" /* ýR.............. */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 4DFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ..Mÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FF7E 1306 0000 0000 0000 0000 0000 0000" /* ÿ~.............. */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0002 ABFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ..«ÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFBB 2C11 0B0B 0B0B 0B0B 0B0B 0B0B 0B0B" /* ÿ»,............. */
- $"0B0B 0B0B 0B0B 0903 0000 0000 0000 0000" /* ......Æ......... */
- $"08B2 FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* .²ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF DFCC CCCC CCCC CCCC CCCC CCCC CCCC" /* ÿÿßÌÌÌÌÌÌÌÌÌÌÌÌÌ */
- $"CCCC CCCC CCCC CBC9 8000 0000 0000 0026" /* ÌÌÌÌÌÌËÉ€......& */
- $"71F2 EDEE EFEF EFEF EFEF EFEF EFEF EFEF" /* qòíîïïïïïïïïïïïï */
- $"EFEF F4F7 F7F7 F7F7 F7F7 F7F7 F7F7 F7F7" /* ïïô÷÷÷÷÷÷÷÷÷÷÷÷÷ */
- $"F7F7 F7F7 F7F7 F7F5 CE41 2000 0000 5EF7" /* ÷÷÷÷÷÷÷õÎA ...^÷ */
- $"FFF8 F8F9 F9F9 F9F9 F9F9 F9F9 F9F9 F9F9" /* ÿøøùùùùùùùùùùùùù */
- $"F9F9 F9F9 F9F9 F9F9 F9F9 F9F9 F9F9 F9F9" /* ùùùùùùùùùùùùùùùù */
- $"F9F9 F9F9 F9F9 F9F8 FAFF EE41 0000 C4FF" /* ùùùùùùùøúÿîA..Äÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFA1 0000 B6FF" /* ÿÿÿÿÿÿÿÿÿÿÿ¡..¶ÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FF91 0000 A2FF" /* ÿÿÿÿÿÿÿÿÿÿÿ‘..¢ÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FF7A 0000 8FFF" /* ÿÿÿÿÿÿÿÿÿÿÿz..ÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FF68 0000 79FF" /* ÿÿÿÿÿÿÿÿÿÿÿh..yÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FF57 0000 5EFF" /* ÿÿÿÿÿÿÿÿÿÿÿW..^ÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FF48 0000 4BFF" /* ÿÿÿÿÿÿÿÿÿÿÿH..Kÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FD3B 0000 3FFE" /* ÿÿÿÿÿÿÿÿÿÿý;..?þ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF F62F 0000 33F8" /* ÿÿÿÿÿÿÿÿÿÿö/..3ø */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF ED23 0000 27F2" /* ÿÿÿÿÿÿÿÿÿÿí#..'ò */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF DE1A 0000 1FE9" /* ÿÿÿÿÿÿÿÿÿÿÞ....é */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF CE10 0000 1ADF" /* ÿÿÿÿÿÿÿÿÿÿÎ....ß */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF C10B 0100 14D5" /* ÿÿÿÿÿÿÿÿÿÿÁ....Õ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF B509 0100 0FCD" /* ÿÿÿÿÿÿÿÿÿÿµÆ...Í */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF AA07 0001 0BC2" /* ÿÿÿÿÿÿÿÿÿÿª.... */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF A005 0101 09B3" /* ÿÿÿÿÿÿÿÿÿÿ ...Ƴ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF 9504 0101 08A6" /* ÿÿÿÿÿÿÿÿÿÿ•....¦ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF 8D04 0101 069A" /* ÿÿÿÿÿÿÿÿÿÿ....š */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF 8505 0101 0691" /* ÿÿÿÿÿÿÿÿÿÿ…....‘ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF 7D05 0101 078B" /* ÿÿÿÿÿÿÿÿÿÿ}....‹ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF 7606 0101 0885" /* ÿÿÿÿÿÿÿÿÿÿv....… */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF 7106 0102 0881" /* ÿÿÿÿÿÿÿÿÿÿq.... */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF 6D07 0102 0A7E" /* ÿÿÿÿÿÿÿÿÿÿm...Â~ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF 6A08 0102 0B7B" /* ÿÿÿÿÿÿÿÿÿÿj....{ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF 6709 0102 0C7C" /* ÿÿÿÿÿÿÿÿÿÿgÆ...| */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF 670A 0102 0C75" /* ÿÿÿÿÿÿÿÿÿÿgÂ...u */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF 600B 0102 113A" /* ÿÿÿÿÿÿÿÿÿÿ`....: */
- $"7B85 8585 8585 8585 8585 8585 8585 8585" /* {……………………………………… */
- $"8585 8585 8585 8585 8585 8585 8585 8585" /* ………………………………………… */
- $"8585 8585 8585 8585 8574 310F 0101 0B1E" /* ………………………t1..... */
- $"2B34 3535 3535 3535 3535 3535 3535 3535" /* +455555555555555 */
- $"3535 3535 3535 3535 3535 3535 3535 3535" /* 5555555555555555 */
- $"3535 3535 3535 3535 332A 1C0A 0100 040C" /* 555555553*.Â.... */
- $"1418 1818 1818 1818 1818 1818 1818 1818" /* ................ */
- $"1818 1818 1818 1818 1818 1818 1818 1818" /* ................ */
- $"1818 1818 1818 1818 1813 0B03 0000 0002" /* ................ */
- $"0304 0303 0303 0303 0303 0303 0303 0303" /* ................ */
- $"0303 0303 0303 0303 0303 0303 0303 0303" /* ................ */
- $"0303 0303 0303 0303 0402 0100 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0069 7433" /* .............it3 */
- $"3200 0025 F700 0000 00FF 00FF 00FF 00FF" /* 2..%÷....ÿ.ÿ.ÿ.ÿ */
- $"00FF 00FF 00FF 00FF 00FF 00FF 00FF 00FF" /* .ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ */
- $"00FF 00FF 00FF 00FF 00FF 00FF 00FF 00FF" /* .ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ */
- $"00FF 00FF 00FF 00FF 00FF 00DF 009F 59D7" /* .ÿ.ÿ.ÿ.ÿ.ÿ.ß.ŸY× */
- $"00A6 59D3 0001 5959 8000 9D58 8459 D000" /* .¦YÓ..YY€.X„YÐ. */
- $"0359 5900 569F 5901 5658 8359 D000 0257" /* .YY.VŸY.VXƒYÐ..W */
- $"6287 9D95 0494 917F 5E58 8359 CD00 0459" /* b‡•.”‘.^XƒYÍ..Y */
- $"005C 9ABA 9EBC 03B9 AE85 5883 59CD 0004" /* .\šºž¼.¹®…XƒYÍ.. */
- $"5900 6EB3 BE9E BF04 BEB6 9D62 5782 59CD" /* Y.n³¾ž¿.¾¶bW‚YÍ */
- $"0003 5900 74B6 A0BE 03B8 9F63 5782 59CC" /* ..Y.t¶ ¾.¸ŸcW‚YÌ */
- $"0004 5959 547A B8A0 BC03 B7A0 6357 8359" /* ..YYTz¸ ¼.· cWƒY */
- $"CB00 0459 5954 88B9 A0BB 03B7 A366 56B8" /* Ë..YYTˆ¹ ».·£fV¸ */
- $"5995 0005 5959 005B A0B9 A0BA 03B8 AA73" /* Y•..YY.[ ¹ º.¸ªs */
- $"55BA 5992 0006 5959 0053 7BB4 B9A0 BA04" /* UºY’..YY.S{´¹ º. */
- $"B9B2 905A 56BA 5990 0006 5959 0054 73AB" /* ¹²ZVºY..YY.Ts« */
- $"B8A2 B903 B5AB 865E B756 0300 5859 598E" /* ¸¢¹.µ«†^·V..XYYŽ */
- $"0007 5959 005A 83AD B6B7 A2B8 04B7 B4AD" /* ..YY.Zƒ­¶·¢¸.·´­ */
- $"9B87 B57D 047B 725D 0059 8D00 0759 5900" /* ›‡µ}.{r].Y..YY. */
- $"5A8F B2B6 B6A4 B704 B6B5 B4B2 B1B4 B003" /* Z²¶¶¤·.¶µ´²±´°. */
- $"ADA0 7600 8059 8900 8159 0355 77AC B0E2" /* ­ v.€Y‰.Y.Uw¬°â */
- $"B103 AFA4 7D56 8259 8600 0159 5980 0003" /* ±.¯¤}V‚Y†..YY€.. */
- $"5279 9697 E298 0496 9073 5456 8000 0159" /* Ry–—â˜.–sTV€..Y */
- $"5984 0008 5900 5457 6268 686D 7284 73A1" /* Y„..Y.TWbhhmr„s¡ */
- $"74B9 7309 706C 6868 6763 5900 5959 8200" /* t¹sÆplhhgcY.YY‚. */
- $"0759 0052 6E96 A4A7 A8E7 A980 A706 A6A0" /* .Y.Rn–¤§¨ç©€§.¦  */
- $"8E6A 5759 5982 0002 536F A782 B0E5 AF81" /* ŽjWYY‚..So§‚°å¯ */
- $"B006 AFAF AB99 6A00 5980 0004 5900 5A9B" /* °.¯¯«™j.Y€..Y.Z› */
- $"AEF0 AF0B AEA6 895B 0059 0000 5900 6CA7" /* ®ð¯.®¦‰[.Y..Y.l§ */
- $"B4AE 03AF ABAE AFB7 AE0A A996 6500 5900" /* ´®.¯«®¯·®Â©–e.Y. */
- $"0059 5470 A7B3 AD05 AEA8 A299 A8AE B6AD" /* .YTp§³­.®¨¢™¨®¶­ */
- $"0AA8 9666 0059 0059 5900 6CA3 B4AB 05A6" /* ¨–f.Y.YY.l£´«.¦ */
- $"EDE9 99A7 ACB5 AB0A A692 6200 5900 5959" /* í陧¬µ«Â¦’b.Y.YY */
- $"0063 9EB3 A905 A8A8 ECFF E195 B6A9 0BA3" /* .cž³©.¨¨ìÿᕶ©.£ */
- $"8D5F 5859 0059 5900 6099 A7B3 A806 A4DC" /* _XY.YY.`™§³¨.¤Ü */
- $"FFFF CA96 AAB4 A80B A187 5B58 5900 5959" /* ÿÿÊ–ª´¨.¡‡[XY.YY */
- $"005C 94A6 B3A7 01A3 C580 FF02 AD9D A8B3" /* .\”¦³§.£Å€ÿ.­¨³ */
- $"A70B 9F82 5A58 5900 5959 5857 8DA5 B3A6" /* §.Ÿ‚ZXY.YYXW¥³¦ */
- $"07A4 AEF8 FFFF ED97 A4B2 A603 A59C 7C58" /* .¤®øÿÿí—¤²¦.¥œ|X */
- $"8359 0257 87A3 B4A4 01A1 E180 FF02 CB94" /* ƒY.W‡£´¤.¡á€ÿ.Ë” */
- $"A6B1 A403 A399 7657 8359 0254 80A1 B4A2" /* ¦±¤.£™vWƒY.T€¡´¢ */
- $"019D C180 FF03 FEA4 9BA3 B0A2 03A1 9672" /* .Á€ÿ.þ¤›£°¢.¡–r */
- $"5783 5902 547A 9FB4 A202 A0A6 F380 FF02" /* WƒY.TzŸ´¢. ¦ó€ÿ. */
- $"E192 A3B0 A203 A094 6D56 8359 0255 759D" /* á’£°¢. ”mVƒY.Uu */
- $"B5A0 019B D381 FF02 B495 A1AF A006 9D90" /* µ .›Óÿ.´•¡¯ . */
- $"6957 5959 0080 5902 546D 9BB1 9E00 9F80" /* iWYY.€Y.Tm›±ž.Ÿ€ */
- $"A002 9CAF FD80 FF02 EF93 9DAF 9E06 9B8C" /*  .œ¯ý€ÿ.ž.›Œ */
- $"6657 5959 0080 5902 5568 97B0 9D07 9F95" /* fWYY.€Y.Uh—°.Ÿ• */
- $"8A89 8B98 9CE2 81FF 02C3 8F9E AE9D 0699" /* Š‰‹˜œâÿ.Þ®.™ */
- $"8861 5759 5900 8059 0256 6494 AF9C 089D" /* ˆaWYY.€Y.Vd”¯œ. */
- $"8C9E D0DD C793 8CBC 81FF 02F7 9899 AE9C" /* ŒžÐÝÇ“Œ¼ÿ.÷˜™®œ */
- $"0697 855F 5859 5900 8059 0257 5E91 AF9B" /* .—…_XYY.€Y.W^‘¯› */
- $"0195 B781 FF03 F69B 96ED 81FF 02CE 8B9C" /* .•·ÿ.ö›–íÿ.΋œ */
- $"AD9B 0D95 815D 5859 5900 0059 5957 5B8C" /* ­›.•]XYY..YYW[Œ */
- $"98AD 9903 9889 9AD8 81FF 02E0 89C4 81FF" /* ˜­™.˜‰šØÿ.à‰Äÿ */
- $"02FD 9E93 AD99 0D93 7C5A 5859 5900 0059" /* .ýž“­™.“|ZXYY..Y */
- $"5958 5987 96AC 970C 9889 D3CE 88A1 E8FF" /* YXY‡–¬—.˜‰ÓΈ¡èÿ */
- $"FFF9 9B9D F481 FF02 D788 98AC 9702 9079" /* ÿù›ôÿ.׈˜¬—.y */
- $"5A80 5901 0000 8059 0255 8395 AB96 0D97" /* Z€Y...€Y.Uƒ•«–.— */
- $"8DA4 FFFF F6B2 84B4 F6FB A28E CC82 FF02" /* ¤ÿÿö²„´öû¢ŽÌ‚ÿ. */
- $"A28F 97AB 9601 8E75 8159 0100 0080 5902" /* ¢—«–.ŽuY...€Y. */
- $"547F 94AB 9502 9688 E481 FF07 E99E 8CBC" /* T.”«•.–ˆäÿ.鞌¼ */
- $"9991 A2F8 81FF 02DD 8896 AA95 0394 8D71" /* ™‘¢øÿ.݈–ª•.”q */
- $"5880 5901 0000 8059 0255 7993 AA94 0295" /* X€Y...€Y.Uy“ª”.• */
- $"87B4 84FF 05D4 8C93 948F D182 FF02 A68C" /* ‡´„ÿ.ÔŒ“”Ñ‚ÿ.¦Œ */
- $"95A9 9403 938A 6D57 8059 0700 0059 595A" /* •©”.“ŠmW€Y...YYZ */
- $"5374 91AA 9302 908C F284 FF06 DD92 9293" /* St‘ª“.Œò„ÿ.Ý’’“ */
- $"8FA4 FB81 FF01 E086 AA93 0391 876A 5780" /* ¤ûÿ.à†ª“.‘‡jW€ */
- $"5907 0000 5959 5A53 6F8F A991 0292 87CA" /* Y...YYZSo©‘.’‡Ê */
- $"84FF 02F8 A18D 8091 018D D782 FF02 A788" /* „ÿ.ø¡€‘.ׂÿ.§ˆ */
- $"92A8 9103 8F84 6757 8059 0100 0080 5902" /* ’¨‘.„gW€Y...€Y. */
- $"556B 8DA9 9002 8E85 DB84 FF01 C78A 8190" /* Uk©.Ž…Û„ÿ.ÇŠ */
- $"028B A8FE 81FF 01E2 84A9 9003 8E82 6357" /* .‹¨þÿ.â„©.Ž‚cW */
- $"8059 0100 0080 5902 5466 8CA8 9005 9186" /* €Y...€Y.TfŒ¨.‘† */
- $"AB85 A6EE 81FF 02EE 958E 8190 028F 8CDC" /* «…¦îÿ.î•Ž.ŒÜ */
- $"82FF 02AA 8591 A790 038D 7F62 5880 5901" /* ‚ÿ.ª…‘§..bX€Y. */
- $"0000 8059 0254 618A A78E 0C8F 84A5 FFF0" /* ..€Y.TaŠ§Ž.„¥ÿð */
- $"A480 BBF9 FFFF B688 838E 0189 A982 FF01" /* ¤€»ùÿÿ¶ˆƒŽ.‰©‚ÿ. */
- $"E583 A88E 038B 7C5F 5880 5901 0000 8059" /* 僨Ž.‹|_X€Y...€Y */
- $"0256 5F87 A78D 028C 83E8 80FF 06DF 9087" /* .V_‡§.Œƒè€ÿ.߇ */
- $"D4E0 8C8C 838D 028C 8ADE 82FF 02AB 838E" /* ÔàŒŒƒ.ŒŠÞ‚ÿ.«ƒŽ */
- $"A68D 038A 7A5D 5880 5901 0000 8059 0257" /* ¦.Šz]X€Y...€Y.W */
- $"5C84 A68C 028D 7EB7 83FF 03C9 8B8E 8B85" /* \„¦Œ.~·ƒÿ.É‹Ž‹… */
- $"8C01 87AA 82FF 01E6 82A7 8C03 8877 5C58" /* Œ.‡ª‚ÿ.悧Œ.ˆw\X */
- $"8059 0100 0080 5902 5757 81A6 8A02 878A" /* €Y...€Y.WW¦Š.‡Š */
- $"F584 FF01 CB83 868A 0289 88E0 82FF 02A8" /* õ„ÿ.˃†Š.‰ˆà‚ÿ.¨ */
- $"808B A58A 0386 735B 5880 5901 0000 8059" /* €‹¥Š.†s[X€Y...€Y */
- $"0258 557F A58A 028B 7BC9 84FF 02F6 9987" /* .XU.¥Š.‹{É„ÿ.ö™‡ */
- $"878A 0184 AB82 FF01 E580 A68A 0285 715A" /* ‡Š.„«‚ÿ.倦Š.…qZ */
- $"8159 0100 0081 5902 577B 88A3 8902 8A81" /* Y...Y.W{ˆ£‰.Š */
- $"9685 FF01 BF82 8889 0288 87E0 82FF 02A7" /* –…ÿ.¿‚ˆ‰.ˆ‡à‚ÿ.§ */
- $"7F8A A489 0183 6F82 5901 0000 8159 0254" /* .Š¤‰.ƒo‚Y...Y.T */
- $"7787 A488 017A DC84 FF02 EA8C 8689 8801" /* w‡¤ˆ.zÜ„ÿ.ꌆ‰ˆ. */
- $"82A9 82FF 01E3 7EA4 8802 8781 6C82 5901" /* ‚©‚ÿ.ã~¤ˆ.‡l‚Y. */
- $"0000 8159 0151 7497 860E 8784 8686 8486" /* ..Y.Qt—†.‡„††„† */
- $"8684 8685 8486 877B A685 FF11 AD7D 8685" /* †„†…„†‡{¦…ÿ.­}†… */
- $"8486 8584 8784 8487 8485 8783 83DF 82FF" /* „†…„‡„„‡„…‡ƒƒß‚ÿ */
- $"0FA4 7D87 8584 8785 8487 8485 8784 8586" /* .¤}‡…„‡…„‡„…‡„…† */
- $"8596 8602 7F69 5881 5901 0000 8059 035A" /* …–†..iXY...€Y.Z */
- $"5170 8496 850E 8182 7F7F 827F 8082 7E81" /* Qp„–….‚..‚.€‚~ */
- $"8280 837E EC84 FF12 DB7E 817F 8082 7E81" /* ‚€ƒ~ì„ÿ.Û~.€‚~ */
- $"827E 8182 7E82 817E 827B A682 FF10 E07B" /* ‚~‚~‚~‚{¦‚ÿ.à{ */
- $"8380 827E 8181 7E82 817E 8280 7F81 8494" /* ƒ€‚~~‚~‚€.„” */
- $"8503 847D 6758 8159 0100 0080 5903 5A53" /* ….„}gXY...€Y.ZS */
- $"6E84 9585 0E82 90FB BCAC FFA4 B9FF 9BD3" /* n„•….‚û¼¬ÿ¤¹ÿ›Ó */
- $"FC97 7BB9 84FF 14FC 91AA FFA8 BFFF 92D1" /* ü—{¹„ÿ.ü‘ªÿ¨¿ÿ’Ñ */
- $"FB92 E5ED 87F4 DC95 FFCB 73DF 82FF 0FA0" /* û’åí‡ôÜ•ÿËsß‚ÿ.  */
- $"79DC F889 E5ED 90F6 D88F FFC7 AAC2 7D94" /* yÜø‰åíöØÿǪÂ}” */
- $"8503 847C 6558 8159 0100 0080 5903 5A52" /* ….„|eXY...€Y.ZR */
- $"6983 9584 0E81 92FF BCAA FFC4 D2FF 96D4" /* iƒ•„.’ÿ¼ªÿÄÒÿ–Ô */
- $"FF9A 82F8 84FF 14C6 78CE FFA6 BFFF B6E4" /* ÿš‚ø„ÿ.ÆxÎÿ¦¿ÿ¶ä */
- $"FF8D E8F9 AFFE DE91 FFE3 899E 82FF 0FDB" /* ÿèù¯þÞ‘ÿ㉞‚ÿ.Û */
- $"74E2 FFB1 F3F0 8AFA E9B4 FFC8 A6C7 7C94" /* tâÿ±óðŠúé´ÿȦÇ|” */
- $"8403 8379 6258 8159 0100 0080 5903 5A51" /* „.ƒybXY...€Y.ZQ */
- $"6581 9582 047F 90FF D5C8 81FF 04BB E5F9" /* e•‚..ÿÕÈÿ.»åù */
- $"86CA 84FF 06F2 82D6 FFFF C6D6 80FF 02FC" /* †Ê„ÿ.ò‚ÖÿÿÆÖ€ÿ.ü */
- $"B5EF 80FF 06E9 B8FF FFFA 8AD6 82FF 0196" /* µï€ÿ.é¸ÿÿúŠÖ‚ÿ.– */
- $"C680 FF02 F4B4 FA80 FF03 DCC9 C57A 9482" /* Æ€ÿ.ô´ú€ÿ.ÜÉÅz”‚ */
- $"0381 7761 5881 5901 0000 8059 035A 5262" /* .waXY...€Y.ZRb */
- $"7F95 8102 7E8F FA85 FF01 B190 85FF 01AC" /* .•.~ú…ÿ.±…ÿ.¬ */
- $"9A90 FF01 C494 82FF 02D5 8DF9 87FF 01BF" /* šÿ.Ä”‚ÿ.Õù‡ÿ.¿ */
- $"7994 8103 8075 5F58 8159 0100 0081 5902" /* y”.€u_XY...Y. */
- $"5461 7D95 8002 7D8E FA84 FF02 E779 DD84" /* Ta}•€.}Žú„ÿ.çyÝ„ */
- $"FF02 E47C E690 FF02 FC8A D281 FF02 FC8C" /* ÿ.ä|æÿ.üŠÒÿ.üŒ */
- $"C787 FF01 BF77 9480 037E 725E 5881 5901" /* LJÿ.¿w”€.~r^XY. */
- $"0000 8159 0254 5D7C 957F 027C 8EFA 84FF" /* ..Y.T]|•..|Žú„ÿ */
- $"019C A285 FF01 97AD 92FF 01C7 8F80 FF04" /* .œ¢…ÿ.—­’ÿ.Ç€ÿ. */
- $"FBC0 748B F986 FF01 BE76 947F 037D 715C" /* ûÀt‹ù†ÿ.¾v”..}q\ */
- $"5881 5901 0000 8159 0254 597B 957F 027C" /* XY...Y.TY{•..| */
- $"8EFA 83FF 02D7 7BEF 84FF 02D1 7EF4 92FF" /* Žúƒÿ.×{ï„ÿ.Ñ~ô’ÿ */
- $"09FE 8CC9 F8CB 8C64 9F83 C386 FF01 BE76" /* ÆþŒÉøËŒdŸƒÃ†ÿ.¾v */
- $"947F 037C 6F5B 5881 5901 0000 8159 0355" /* ”..|o[XY...Y.U */
- $"5779 7E94 7D02 7A8C FA82 FF02 FD8A B884" /* Wy~”}.zŒú‚ÿ.ýŠ¸„ */
- $"FF02 FA86 C094 FF09 CF74 7C64 7FCB FFC0" /* ÿ.ú†À”ÿÆÏt|d.ËÿÀ */
- $"80F7 85FF 01BD 7494 7D02 7A6D 5B82 5901" /* €÷…ÿ.½t”}.zm[‚Y. */
- $"0000 8159 0256 5677 957C 0279 8BFA 82FF" /* ..Y.VVw•|.y‹ú‚ÿ */
- $"02C3 82FB 84FF 02BB 86FE 95FF 088C 99D5" /* .Âû„ÿ.»†þ•ÿ.Œ™Õ */
- $"FCFF FFFA 7FBC 85FF 01BD 7394 7C02 796B" /* üÿÿú.¼…ÿ.½s”|.yk */
- $"5A82 5901 0000 8159 0257 5575 957B 0277" /* Z‚Y...Y.WUu•{.w */
- $"8BFA 81FF 02F4 7DCE 84FF 02EE 7BD6 96FF" /* ‹úÿ.ô}΄ÿ.î{Ö–ÿ */
- $"01D0 A782 FF02 C47B F484 FF01 BC72 947B" /* .Ч‚ÿ.Ä{ô„ÿ.¼r”{ */
- $"0178 6983 5901 0000 8159 0258 5272 957A" /* .xiƒY...Y.XRr•z */
- $"0877 8AE8 EEEC ECF2 AA91 85FF 02A8 92F2" /* .wŠèîììòª‘…ÿ.¨’ò */
- $"95EC 03ED ED93 DC81 FF03 FD83 B2F2 82EC" /* •ì.íí“Üÿ.ýƒ²ò‚ì */
- $"02F3 B573 947A 0176 6783 5901 0000 8159" /* .óµs”z.vgƒY...Y */
- $"0258 5070 9679 007A 817F 027E 71E3 84FF" /* .XPp–y.z..~qã„ÿ */
- $"03DF 797F 8096 7F02 8078 A382 FF02 C970" /* .ßy.€–..€x£‚ÿ.Ép */
- $"8083 7F00 7D95 7902 7565 5882 5901 0000" /* €ƒ..}•y.ueX‚Y... */
- $"8159 0258 4F6F 9779 8077 0278 69AB 85FF" /* Y.XOo—y€w.xi«…ÿ */
- $"029B 7378 9977 0178 DF81 FF02 B468 7583" /* .›sx™w.xßÿ.´huƒ */
- $"7700 7895 7902 7464 5882 5901 0000 8259" /* w.x•y.tdX‚Y...‚Y */
- $"0150 6D9A 7802 747A F384 FF02 CD72 779A" /* .Pmšx.tzó„ÿ.Írwš */
- $"7808 71A0 FFFF D98C 8FC6 6D9C 7801 7363" /* x.q ÿÿÙŒÆmœx.sc */
- $"8359 0100 0082 5901 516B 9A77 016B C484" /* ƒY...‚Y.Qkšw.kÄ„ */
- $"FF02 F68A 729B 770A 7677 9B8A 80BD FDFF" /* ÿ.öŠr›wÂvw›Š€½ýÿ */
- $"9C6A 789A 7702 7261 5882 5901 0000 8159" /* œjxšw.raX‚Y...Y */
- $"035A 4F68 7598 7602 737B F184 FF01 B96E" /* .ZOhu˜v.s{ñ„ÿ.¹n */
- $"9D76 0371 85D7 FB80 FF02 F076 719A 7602" /* v.q…×û€ÿ.ðvqšv. */
- $"7060 5882 5901 0000 8159 035A 4E66 7498" /* p`X‚Y...Y.ZNft˜ */
- $"7504 7380 77C3 FE81 FF02 E97B 729D 7502" /* u.s€wÃþÿ.é{ru. */
- $"727F EF82 FF01 CD66 9A75 026F 5E58 8259" /* r.ï‚ÿ.Ífšu.o^X‚Y */
- $"0100 0081 5903 5A4D 6473 9774 0672 76EE" /* ...Y.ZMds—t.rvî */
- $"CC73 83DA 80FF 01A4 6C9F 7401 6CBE 83FF" /* ÌsƒÚ€ÿ.¤lŸt.l¾ƒÿ */
- $"02A5 6575 9874 026D 5C58 8259 0100 0081" /* .¥eu˜t.m\X‚Y... */
- $"5902 5A4D 6298 730B 6F82 FAFF F9AD 6A97" /* Y.ZMb˜s.o‚úÿù­j— */
- $"F1DC 7172 9F73 016D 9283 FF03 F981 6B74" /* ñÜqrŸs.m’ƒÿ.ùkt */
- $"9773 026C 5B58 8259 0100 0081 5902 5A4D" /* —s.l[X‚Y...Y.ZM */
- $"6098 7301 6C94 81FF 04EC 957B 8470 A073" /* `˜s.l”ÿ.ì•{„p s */
- $"0271 75E7 83FF 02DD 6972 9773 026B 5C58" /* .quçƒÿ.Ýir—s.k\X */
- $"8259 0100 0081 5902 5A50 5F98 7201 69A8" /* ‚Y...Y.ZP_˜r.i¨ */
- $"83FF 019B 69A2 7201 6ABF 84FF 02AF 6473" /* ƒÿ.›i¢r.j¿„ÿ.¯ds */
- $"9672 026A 5B58 8259 0100 0081 5903 5A51" /* –r.j[X‚Y...Y.ZQ */
- $"5D70 9771 0167 BD81 FF02 F6A1 6FA3 7101" /* ]p—q.g½ÿ.ö¡o£q. */
- $"6B94 84FF 02F7 7B6D 9671 0169 5A83 5901" /* k”„ÿ.÷{m–q.iZƒY. */
- $"0000 8159 035A 505B 6F97 7101 69D5 80FF" /* ..Y.ZP[o—q.iÕ€ÿ */
- $"03E8 8B68 70A3 7102 6F74 E984 FF02 BC65" /* .è‹hp£q.oté„ÿ.¼e */
- $"7294 7102 7067 5883 5901 0000 8159 035A" /* r”q.pgXƒY...Y.Z */
- $"5059 6F96 7007 6F6F E7FF FFD4 7A69 A670" /* PYo–p.ooçÿÿÔzi¦p */
- $"0168 BD84 FF02 EC71 6E94 7002 6F67 5883" /* .h½„ÿ.ìqn”p.ogXƒ */
- $"5901 0000 8159 035A 5058 6E96 6F06 6C79" /* Y...Y.ZPXn–o.ly */
- $"F7FF BD6E 6BA7 6F02 6A8B FD83 FF02 FC83" /* ÷ÿ½nk§o.j‹ýƒÿ.üƒ */
- $"6B94 6F02 6E66 5783 5901 0000 8159 035A" /* k”o.nfWƒY...Y.Z */
- $"5056 6D96 6E05 688E FBA5 676C A86E 026D" /* PVm–n.hŽû¥gl¨n.m */
- $"6AD0 83FF 02F5 7D6B 946E 026D 6456 8359" /* jЃÿ.õ}k”n.mdVƒY */
- $"0100 0081 5903 5A4F 556C 966D 0468 9294" /* ...Y.ZOUl–m.h’” */
- $"656C AA6D 0268 87F8 82FF 01BC 6995 6D02" /* elªm.h‡ø‚ÿ.¼i•m. */
- $"6C63 5683 5901 0000 8159 035A 5054 6C97" /* lcVƒY...Y.ZPTl— */
- $"6D01 6C68 AD6D 0866 9EF7 FFFF F3B1 6C6B" /* m.lh­m.fž÷ÿÿó±lk */
- $"956D 026C 6256 8359 0100 0081 5903 5A50" /* •m.lbVƒY...Y.ZP */
- $"546C CA6D 0667 81A6 9D7A 666C 966D 026C" /* TlÊm.g¦zfl–m.l */
- $"6256 8359 0100 0081 5903 5A51 536C CB6D" /* bVƒY...Y.ZQSlËm */
- $"0369 6565 6998 6D02 6C62 5783 5901 0000" /* .ieei˜m.lbWƒY... */
- $"8159 035A 5152 6AEA 6C02 6B61 5783 5901" /* Y.ZQRjêl.kaWƒY. */
- $"0000 8159 035A 5252 6AEA 6C02 6B61 5783" /* ..Y.ZRRjêl.kaWƒ */
- $"5901 0000 8159 035A 5252 6AEA 6C02 6B61" /* Y...Y.ZRRjêl.ka */
- $"5783 5901 0000 8159 035A 5352 6AEA 6C02" /* WƒY...Y.ZSRjêl. */
- $"6B61 5783 5900 0082 5903 5A54 5168 EA6B" /* kaWƒY..‚Y.ZTQhêk */
- $"0269 5E56 8359 0000 8359 0257 4D5E EA63" /* .i^VƒY..ƒY.WM^êc */
- $"0260 5756 8359 0100 0082 5902 5A55 53EA" /* .`WVƒY...‚Y.ZUSê */
- $"5601 5556 8459 0100 00FB 5901 0000 FB59" /* V.UV„Y...ûY...ûY */
- $"0100 00FB 5901 0000 FB59 0100 00FA 5981" /* ...ûY...ûY...úY */
- $"00F9 5982 00F7 5983 00F6 5986 00F3 59FF" /* .ùY‚.÷Yƒ.öY†.óYÿ */
- $"00FF 0000 00FF 00FF 00FF 00FF 00FF 00FF" /* .ÿ...ÿ.ÿ.ÿ.ÿ.ÿ.ÿ */
- $"00FF 00FF 00FF 00FF 00FF 00FF 00FF 00FF" /* .ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ */
- $"00FF 00FF 00FF 00FF 00FF 00FF 00FF 00FF" /* .ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ */
- $"00FF 00FF 00FF 00DF 009F 7CD7 00A6 7CD3" /* .ÿ.ÿ.ÿ.ß.Ÿ|×.¦|Ó */
- $"0001 7C7C 8000 9D7B 847C D000 037C 7C00" /* ..||€.{„|Ð..||. */
- $"7C9F 7F01 7B7B 837C D000 027B 88A5 9EB0" /* |Ÿ..{{ƒ|Ð..{ˆ¥ž° */
- $"03AC 9D81 7B83 7CCD 0004 7C00 81B3 D09E" /* .¬{ƒ|Í..|.³Ðž */
- $"D302 D0C3 A184 7CCD 0004 7C00 8FCA D79F" /* Ó.Ðá„|Í..|.Êן */
- $"D803 CEB4 837A 827C CD00 037C 0095 CEA0" /* Ø.δƒz‚|Í..|.•Î  */
- $"D803 D1B7 847A 827C CC00 047C 7C78 9BD0" /* Ø.Ñ·„z‚|Ì..||x›Ð */
- $"A0D7 03D1 B884 7A83 7CCB 0004 7C7C 79A8" /*  ×.Ѹ„zƒ|Ë..||y¨ */
- $"D3A0 D703 D2BC 867A B87C 9500 057C 7C00" /* Ó ×.Ò¼†z¸|•..||. */
- $"81BD D5A0 D603 D3C3 9278 BA7C 9200 067C" /* ½Õ Ö.ÓÃ’xº|’..| */
- $"7C00 799D CED5 A0D6 04D4 CBAC 7D79 BA7C" /* |.yÎÕ Ö.Ôˬ}yº| */
- $"9000 067C 7C00 7B97 C5D3 A2D5 03D1 C4A3" /* ..||.{—ÅÓ¢Õ.ÑÄ£ */
- $"8280 7AB4 7B03 007B 7C7C 8E00 077C 7C00" /* ‚€z´{..{||Ž..||. */
- $"81A4 C8D2 D4A2 D505 D4D0 C8B7 A69F B19E" /* ¤ÈÒÔ¢Õ.ÔÐÈ·¦Ÿ±ž */
- $"079F 9F9E 9D94 8100 7C8D 0007 7C7C 0081" /* .ŸŸž”.|..||. */
- $"ADCD D3D3 A4D4 03D3 D2D0 CE80 CCB2 CB03" /* ­ÍÓÓ¤Ô.ÓÒÐ΀̲Ë. */
- $"C7B9 9500 807C 8900 817C 037A 98C6 CDE2" /* ǹ•.€|‰.|.z˜ÆÍâ */
- $"CE03 CCBE 9B7A 827C 8600 017C 7C80 0002" /* Î.̾›z‚|†..||€.. */
- $"7697 B181 B403 B5B5 B4B4 9EB5 01B4 B4B6" /* v—±´.µµ´´žµ.´´¶ */
- $"B506 B4B4 B3AA 9177 7980 0001 7C7C 8400" /* µ.´´³ª‘wy€..||„. */
- $"097C 0078 7D87 8B8B 8D94 95E2 960A 9592" /* Æ|.x}‡‹‹”•â–•’ */
- $"8E8C 8B8B 867D 007C 7C82 0009 7C00 7892" /* ŽŒ‹‹†}.||‚.Æ|.x’ */
- $"B5C1 C4C5 C6C6 81C7 03C6 C6C7 C79E C601" /* µÁÄÅÆÆÇ.ÆÆÇÇžÆ. */
- $"C7C7 82C6 01C7 C7AC C683 C70A C6C6 C4C3" /* ÇÇ‚Æ.ÇǬƃÇÂÆÆÄà */
- $"C3BD AB8C 7A7C 7C82 0005 7893 C5CE CFD0" /* ý«Œz||‚..x“ÅÎÏÐ */
- $"E9CF 08D0 D0CF CEC9 B58B 007C 8000 047C" /* éÏ.ÐÐÏÎɵ‹.|€..| */
- $"0080 B9CE F0D0 0CCF C5A7 7E00 7C00 007C" /* .€¹ÎðÐ.Ïŧ~.|..| */
- $"008F C5CE B3CF 03D0 CDCF D0B7 CF0A C9B2" /* .ÅγÏ.ÐÍÏзÏÂɲ */
- $"8600 7C00 007C 7894 C6B3 CF05 D0CB BEBA" /* †.|..|x”ƳÏ.Ð˾º */
- $"CCD0 B6CF 0ACA B487 007C 007C 7C00 8FC4" /* ÌжÏÂÊ´‡.|.||.Ä */
- $"B4CE 05C9 F2ED B9CC CFB5 CE0B C8B1 8400" /* ´Î.Éòí¹ÌϵÎ.ȱ„. */
- $"7C00 7C7C 0089 C0CC B3CD 05CC F3FF E7B9" /* |.||.‰À̳Í.Ìóÿç¹ */
- $"CEB5 CD0B C5AC 817B 7C00 7C7C 0085 BCCB" /* εÍ.Ŭ{|.||.…¼Ë */
- $"B3CC 06C9 EAFF FFD8 BDCE B4CC 0BC4 A77D" /* ³Ì.ÉêÿÿؽδÌ.ħ} */
- $"7B7C 007C 7C00 81B6 CAB3 CC01 C9DC 80FF" /* {|.||.¶Ê³Ì.ÉÜ€ÿ */
- $"02C6 C4CD B2CC 0DCB C1A3 7D7B 7C00 7C7C" /* .ÆÄͲÌ.ËÁ£}{|.|| */
- $"7B7D B1C9 CBB2 CA07 C9CF FBFF FFF1 BACB" /* {}±É˲Ê.ÉÏûÿÿñºË */
- $"B2CA 03C9 BE9D 7B83 7C02 7BAB C8B4 CA01" /* ²Ê.ɾ{ƒ|.{«È´Ê. */
- $"C8ED 80FF 02D9 BCCB B1CA 03C9 BC98 7A83" /* Èí€ÿ.ټ˱Ê.ɼ˜zƒ */
- $"7C02 7AA5 C6B4 C901 C6DA 80FF 03FD C1C4" /* |.z¥Æ´É.ÆÚ€ÿ.ýÁÄ */
- $"CAB0 C903 C7B9 957A 837C 0279 9FC4 B4C8" /* Ê°É.ǹ•zƒ|.yŸÄ´È */
- $"02C7 CAF7 80FF 02E8 B8C9 B0C8 03C5 B68F" /* .ÇÊ÷€ÿ.è¸É°È.Ŷ */
- $"7A83 7C02 799A C2B5 C701 C4E4 81FF 02CA" /* zƒ|.yšÂµÇ.Ääÿ.Ê */
- $"BFC8 AFC7 06C4 B38B 7A7C 7C00 807C 0278" /* ¿È¯Ç.ij‹z||.€|.x */
- $"93C0 B1C6 00C7 80C8 02C4 CFFD 80FF 01F2" /* “À±Æ.Ç€È.ÄÏý€ÿ.ò */
- $"B8B0 C606 C2AF 897A 7C7C 0080 7C02 798F" /* ¸°Æ.¯‰z||.€|.y */
- $"BEB0 C607 C8C0 B4B2 B6C3 C6ED 81FF 02D4" /* ¾°Æ.ÈÀ´²¶ÃÆíÿ.Ô */
- $"BBC7 AEC6 06C1 AC84 7A7C 7C00 807C 0279" /* »Ç®Æ.Á¬„z||.€|.y */
- $"8BBB AFC5 08C6 B6BA DCE5 D5B3 BAD8 81FF" /* ‹»¯Å.ƶºÜåÕ³ºØÿ */
- $"02F9 BBC4 AEC5 06C0 A982 7B7C 7C00 807C" /* .ù»Ä®Å.À©‚{||.€| */
- $"027A 85B7 AEC4 02C5 C1CE 81FF 03F7 BAC1" /* .z…·®Ä.ÅÁÎÿ.÷ºÁ */
- $"F481 FF02 DCB7 C6AD C40D BDA5 817B 7C7C" /* ôÿ.Ü·Æ­Ä.½¥{|| */
- $"0000 7C7C 7A83 B4C3 ADC4 03C3 B3BE E981" /* ..||zƒ´Ã­Ä.ó¾é */
- $"FF02 E8B6 DC81 FF02 FDBE C0AD C40D BCA1" /* ÿ.è¶Üÿ.ý¾À­Ä.¼¡ */
- $"7E7B 7C7C 0000 7C7C 7B80 B0C2 ACC3 0CC4" /* ~{||..||{€°Â¬Ã.Ä */
- $"B5DD DAAE C4F2 FFFF FAC2 C5F8 81FF 02E2" /* µÝÚ®ÄòÿÿúÂÅøÿ.â */
- $"B5C4 ACC3 01B9 9D81 7C07 0000 7C7C 7B7C" /* µÄ¬Ã.¹|...||{| */
- $"ABC0 ABC1 0DC2 BCC1 FFFF F7C7 ACD0 FBFC" /* «À«Á.¼Áÿÿ÷ǬÐûü */
- $"C7BC E082 FF02 C0BD C2AB C101 B79A 817C" /* Ǽà‚ÿ.À½Â«Á.·š| */
- $"0100 0080 7C02 7BA7 BFAB C102 C2B2 EB81" /* ...€|.{§¿«Á.²ë */
- $"FF07 EDB9 B3D7 C3BF C7FA 81FF 02E6 B3C2" /* ÿ.í¹³×ÿÇúÿ.æ³Â */
- $"AAC1 03C0 B595 7B80 7C01 0000 807C 027A" /* ªÁ.Àµ•{€|...€|.z */
- $"A3BE AAC0 02C1 B6CA 84FF 05DE B8C0 C0BD" /* £¾ªÀ.Á¶Ê„ÿ.Þ¸ÀÀ½ */
- $"E382 FF02 C2BA C1A9 C003 BFB2 927A 807C" /* ã‚ÿ.ºÁ©À.¿²’z€| */
- $"0100 0080 7C02 789D BCAA BF02 BEB3 F584" /* ...€|.x¼ª¿.¾³õ„ */
- $"FF06 EBBF BEBF BDC9 FC81 FF02 E8B2 C0A9" /* ÿ.뿾¿½Éüÿ.è²À© */
- $"BF03 BEB0 8F7A 807C 0100 0080 7C02 7898" /* ¿.¾°z€|...€|.x˜ */
- $"BAA9 BE02 BFB5 D984 FF02 FBC7 BC80 BE01" /* º©¾.¿µÙ„ÿ.ûǼ€¾. */
- $"BBE7 82FF 02C3 B7BF A8BE 03BC AD8B 7A80" /* »ç‚ÿ.÷¿¨¾.¼­‹z€ */
- $"7C01 0000 807C 0278 95B9 A9BD 02BC B3E9" /* |...€|.x•¹©½.¼³é */
- $"84FF 01DD B981 BD02 BACB FE81 FF02 EAB0" /* „ÿ.ݹ½.ºËþÿ.ê° */
- $"BEA8 BD03 BAAA 887A 807C 0100 0080 7C02" /* ¾¨½.ºªˆz€|...€|. */
- $"7890 B8A8 BD05 BEB2 C1AC C7F6 81FF 02F4" /* x¸¨½.¾²Á¬Çöÿ.ô */
- $"C0BC 82BD 01BB EA82 FF02 C4B6 BEA7 BD03" /* À¼‚½.»ê‚ÿ.Ķ¾§½. */
- $"BAA8 867A 807C 0100 0080 7C02 788B B5A7" /* º¨†z€|...€|.x‹µ§ */
- $"BC0C BDB5 C1FF F2BD AAD5 FCFF FFD3 B983" /* ¼.½µÁÿò½ªÕüÿÿÓ¹ƒ */
- $"BC01 B9CC 82FF 02EB AFBD A7BC 03B8 A584" /* ¼.¹Ì‚ÿ.믽§¼.¸¥„ */
- $"7B80 7C01 0000 807C 0279 88B3 A8BC 01AE" /* {€|...€|.yˆ³¨¼.® */
- $"ED80 FF06 E5B1 B1E6 ECBB BB84 BC01 B9EB" /* í€ÿ.å±±æì»»„¼.¹ë */
- $"82FF 02C5 B4BD A6BC 03B7 A381 7B80 7C01" /* ‚ÿ.Å´½¦¼.·£{€|. */
- $"0000 807C 027A 85B1 A6BB 02BC AFCC 82FF" /* ..€|.z…±¦».¼¯Ì‚ÿ */
- $"04FE D6AF BBBA 85BB 01B7 CC82 FF02 ECAE" /* .þÖ¯»º…».·Ì‚ÿ.ì® */
- $"BCA6 BB03 B5A0 807B 807C 0100 0080 7C03" /* ¼¦».µ €{€|...€|. */
- $"7A80 ADB9 A5BA 02B8 B0F7 84FF 01DE B486" /* z€­¹¥º.¸°÷„ÿ.Þ´† */
- $"BA02 B9B8 EB82 FF02 C3B2 BBA5 BA03 B39C" /* º.¹¸ë‚ÿ.ò»¥º.³œ */
- $"7F7B 807C 0100 0080 7C03 7B7E AAB7 A4B8" /* .{€|...€|.{~ª·¤¸ */
- $"02BA ABD8 84FF 02F9 C1B6 87B8 01B5 CC82" /* .º«Ø„ÿ.ùÁ¶‡¸.µÌ‚ */
- $"FF02 EBAC B9A5 B803 B199 7D7B 807C 0100" /* ÿ.묹¥¸.±™}{€|.. */
- $"0080 7C03 7B7D A7B6 A4B7 02B2 B7FE 84FF" /* .€|.{}§¶¤·.²·þ„ÿ */
- $"01D7 B388 B702 B6B6 EB82 FF02 C2B0 B8A4" /* .׳ˆ·.¶¶ë‚ÿ.°¸¤ */
- $"B701 AF96 827C 0100 0081 7C02 7BA3 B5A3" /* ·.¯–‚|...|.{£µ£ */
- $"B602 B7A8 E584 FF02 F1B8 B589 B601 B3CA" /* ¶.·¨å„ÿ.ñ¸µ‰¶.³Ê */
- $"82FF 02EA AAB7 A4B6 01AD 9382 7C01 0000" /* ‚ÿ.ꪷ¤¶.­“‚|... */
- $"817C 0278 9FB4 97B5 0DB4 B5B6 B4B6 B5B4" /* |.xŸ´—µ.´µ¶´¶µ´ */
- $"B6B5 B4B6 B6AD C085 FF11 CCB0 B6B5 B4B6" /* ¶µ´¶¶­À…ÿ.Ì°¶µ´¶ */
- $"B5B4 B6B5 B4B6 B4B5 B6B3 B4EB 82FF 0EC0" /* µ´¶µ´¶´µ¶³´ë‚ÿ.À */
- $"AFB6 B5B4 B6B4 B4B6 B4B5 B6B4 B5B6 97B5" /* ¯¶µ´¶´´¶´µ¶´µ¶—µ */
- $"01AB 9082 7C01 0000 817C 0278 9CB3 95B5" /* .«‚|...|.xœ³•µ */
- $"0FB6 AFA7 A9AA A7AA AAA7 ABA9 A7AC B1A9" /* .¶¯§©ª§ªª§«©§¬±© */
- $"F084 FF12 E9AA A6AA AAA7 ABA9 A7AB A8A8" /* ð„ÿ.骦ªª§«©§«¨¨ */
- $"ACA8 A8AB A7A5 C882 FF0F E8A8 B2A8 A8AB" /* ¬¨¨«§¥È‚ÿ.訲¨¨« */
- $"A8A8 ACA8 A9AC A7A9 AAAB 95B5 03B4 A98E" /* ¨¨¬¨©¬§©ª«•µ.´©Ž */
- $"7B81 7C01 0000 817C 0278 99B2 95B4 0EB3" /* {|...|.x™²•´.³ */
- $"B7F9 D2C7 FFC1 CEFF BCE1 FABB AACD 84FF" /* ·ùÒÇÿÁÎÿ¼áú»ªÍ„ÿ */
- $"14FD BAC6 FFC5 D3FF B7DF F9B7 EBF2 B0F6" /* .ýºÆÿÅÓÿ·ßù·ëò°ö */
- $"E6B9 FDDA A7EB 82FF 0FBD AAE6 F8B0 EBF1" /* æ¹ýÚ§ë‚ÿ.½ªæø°ëñ */
- $"B5F7 E3B4 FED9 C5D5 AF94 B403 B3A7 8B7B" /* µ÷ã´þÙÅÕ¯”´.³§‹{ */
- $"817C 0100 0081 7C02 7794 B195 B30E B1B9" /* |...|.w”±•³.±¹ */
- $"FFD2 C7FF D3DE FFBA E3FF BDAA F984 FF14" /* ÿÒÇÿÓÞÿºãÿ½ªù„ÿ. */
- $"DBA2 DAFF C4D4 FFCA EBFE B4EF FBC4 FEE9" /* Û¢ÚÿÄÔÿÊëþ´ïûÄþé */
- $"B6FF EAAB C082 FF0F E4A3 ECFF C5F6 F5B2" /* ¶ÿê«À‚ÿ.ä£ìÿÅöõ² */
- $"FBEF C8FF DAC4 DAAE 94B3 03B2 A589 7B81" /* ûïÈÿÚÄÚ®”³.²¥‰{ */
- $"7C01 0000 807C 037D 7690 AE95 B104 AFB7" /* |...€|.}v®•±.¯· */
- $"FFE0 D681 FF04 CDEC FCAE D884 FF06 F7AC" /* ÿàÖÿ.Íìü®Ø„ÿ.÷¬ */
- $"E0FF FFD4 E180 FF02 FDC9 F380 FF06 EFCA" /* àÿÿÔá€ÿ.ýÉó€ÿ.ïÊ */
- $"FFFF FAAE E582 FF01 B6DA 80FF 02F7 C7FB" /* ÿÿú®å‚ÿ.¶Ú€ÿ.÷Çû */
- $"80FF 03E5 D6D9 AC94 B103 B0A2 877B 817C" /* €ÿ.åÖÙ¬”±.°¢‡{| */
- $"0100 0081 7C02 768D AC95 B002 AEB7 FB85" /* ...|.v¬•°.®·û… */
- $"FF01 CDB1 85FF 01C9 B890 FF01 D5B8 82FF" /* ÿ.ͱ…ÿ.ɸÿ.Õ¸‚ÿ */
- $"02E0 B3FC 87FF 01D5 AA94 B003 AE9F 857B" /* .à³ü‡ÿ.Õª”°.®Ÿ…{ */
- $"817C 0100 0081 7C02 788A AB95 AF02 ADB6" /* |...|.xŠ«•¯.­¶ */
- $"FB84 FF02 F0A5 E584 FF02 EEA6 EC90 FF02" /* û„ÿ.ð¥å„ÿ.î¦ìÿ. */
- $"FCAE E281 FF02 FCB4 DB87 FF01 D5A9 94AF" /* ü®âÿ.ü´Û‡ÿ.Õ©”¯ */
- $"03AC 9D83 7B81 7C01 0000 817C 0278 86A9" /* .¬ƒ{|...|.x†© */
- $"95AD 02AB B4FB 84FF 01BE BD85 FF01 BAC3" /* •­.«´û„ÿ.¾½…ÿ.ºÃ */
- $"92FF 01D6 B480 FF04 FCD8 A4B3 FB86 FF01" /* ’ÿ.Ö´€ÿ.üؤ³û†ÿ. */
- $"D4A7 94AD 03AB 9A81 7B81 7C01 0000 817C" /* Ô§”­.«š{|...| */
- $"0278 83A7 95AC 02AA B3FB 83FF 02E5 A3F2" /* .xƒ§•¬.ª³ûƒÿ.å£ò */
- $"84FF 02E1 A5F6 92FF 09FD AEDC FBDE B595" /* „ÿ.á¥ö’ÿÆý®ÜûÞµ• */
- $"B6A9 D886 FF01 D3A6 94AC 03A9 9880 7B81" /* ¶©Ø†ÿ.Ó¦”¬.©˜€{ */
- $"7C01 0000 817C 0278 80A5 95AC 02AA B3FB" /* |...|.x€¥•¬.ª³û */
- $"82FF 02FE B0CB 84FF 02FC ADD0 94FF 09DB" /* ‚ÿ.þ°Ë„ÿ.ü­Ð”ÿÆÛ */
- $"A1A8 95A2 D6FF D1AA FA85 FF01 D3A6 94AC" /* ¡¨•¢ÖÿѪú…ÿ.Ó¦”¬ */
- $"03A8 967F 7B81 7C01 0000 817C 0279 7FA3" /* .¨–.{|...|.y.£ */
- $"95AB 02A9 B2FB 82FF 02D7 A7FB 84FF 02D2" /* •«.©²û‚ÿ.קû„ÿ.Ò */
- $"AAFD 95FF 08AD B4DD FCFF FFFA A5D3 85FF" /* ªý•ÿ.­´Ýüÿÿú¥Ó…ÿ */
- $"01D3 A594 AB03 A694 7E7B 817C 0100 0081" /* .Ó¥”«.¦”~{|... */
- $"7C02 7A7D A095 A902 A7B1 FB81 FF02 F8A5" /* |.z} •©.§±ûÿ.ø¥ */
- $"DA84 FF02 F4A4 E096 FF01 DCC2 82FF 02D3" /* Ú„ÿ.ô¤à–ÿ.Ü‚ÿ.Ó */
- $"A5F8 84FF 01D2 A394 A902 A491 7D82 7C01" /* ¥ø„ÿ.Ò£”©.¤‘}‚|. */
- $"0000 817C 027A 7A9E 95A8 08A6 B1EF F3F2" /* ..|.zzž•¨.¦±ïóò */
- $"F2F6 C6B0 85FF 02C5 B4F5 95F2 03F3 F2B5" /* òöÆ°…ÿ.Å´õ•ò.óòµ */
- $"E881 FF03 FCA7 CCF6 82F2 02F7 CDA3 94A8" /* èÿ.ü§Ìö‚ò.÷Í£”¨ */
- $"01A3 8F83 7C01 0000 817C 027B 779C 96A7" /* .£ƒ|...|.{wœ–§ */
- $"00A8 82AB 019C E984 FF03 E9A6 AAAC 96AB" /* .¨‚«.œé„ÿ.馪¬–« */
- $"02AC A6C1 82FF 02D8 A0AC 83AB 00A9 95A7" /* .¬¦Á‚ÿ.Ø ¬ƒ«.©•§ */
- $"01A1 8D83 7C01 0000 817C 037B 7699 A595" /* .¡ƒ|...|.{v™¥• */
- $"A600 A580 A402 A599 C085 FF02 BCA1 A599" /* ¦.¥€¤.¥™À…ÿ.¼¡¥™ */
- $"A401 A5E9 81FF 02CB 96A3 83A4 00A5 95A6" /* ¤.¥éÿ.Ë–£ƒ¤.¥•¦ */
- $"029F 8A7B 827C 0100 0082 7C02 7596 A399" /* .ŸŠ{‚|...‚|.u–£™ */
- $"A402 A29F F584 FF01 DDA0 9BA4 09A0 BFFF" /* ¤.¢Ÿõ„ÿ.Ý ›¤Æ ¿ÿ */
- $"FFE6 ADAB D299 A59B A402 9D88 7B82 7C01" /* ÿæ­«Ò™¥›¤.ˆ{‚|. */
- $"0000 827C 0276 94A2 98A3 02A4 98D1 84FF" /* ..‚|.v”¢˜£.¤˜Ñ„ÿ */
- $"02F9 AFA0 9CA3 09A4 B9A9 A0CB FCFF B599" /* .ù¯ œ£Æ¤¹© Ëüÿµ™ */
- $"A49A A302 9C87 7B82 7C01 0000 827C 0275" /* ¤š£.œ‡{‚|...‚|.u */
- $"92A2 98A3 02A1 A4F5 84FF 01CF 9E9D A303" /* ’¢˜£.¡¤õ„ÿ.Ïž£. */
- $"A0A9 DEFB 80FF 02F3 9CA0 9AA3 029B 867B" /*  ©Þû€ÿ.󜠚£.›†{ */
- $"827C 0100 0081 7C03 7D74 8FA1 97A2 05A3" /* ‚|...|.}t¡—¢.£ */
- $"9FA0 9ED6 FE81 FF02 F0A6 A09D A202 A0A9" /* Ÿ žÖþÿ.𦠢. © */
- $"F382 FF01 D893 9AA2 0299 837B 827C 0100" /* ó‚ÿ.Ø“š¢.™ƒ{‚|.. */
- $"0081 7C03 7D73 8D9F 97A0 069F 9FF1 D697" /* .|.}sŸ— .ŸŸñÖ— */
- $"A6E6 80FF 01C1 9B9F A001 9BD2 83FF 02BB" /* ¦æ€ÿ.Á›Ÿ .›Òƒÿ.» */
- $"94A1 98A0 0297 827B 827C 0100 0081 7C03" /* ”¡˜ .—‚{‚|...|. */
- $"7D72 8A9E 979F 0B9D A6FB FFF9 BF91 B6F6" /* }rŠž—Ÿ.¦ûÿù¿‘¶ö */
- $"E69E 9E9F 9F01 9BB4 83FF 03FA A199 A096" /* æžžŸŸ.›´ƒÿ.ú¡™ – */
- $"9F03 9E95 807B 827C 0100 0081 7C03 7D72" /* Ÿ.ž•€{‚|...|.}r */
- $"889D 979E 0199 B281 FF04 EFAD 9EA9 9CA0" /* ˆ—ž.™²ÿ.ï­ž©œ  */
- $"9E02 9D9F EE83 FF01 E492 979E 039D 9480" /* ž.Ÿîƒÿ.ä’—ž.”€ */
- $"7B82 7C01 0000 817C 037D 7487 9B97 9D01" /* {‚|...|.}t‡›—. */
- $"96BF 82FF 02FE B697 A29D 0198 D184 FF02" /* –¿‚ÿ.þ¶—¢.˜Ñ„ÿ. */
- $"C191 9E95 9D03 9C92 7F7B 827C 0100 0081" /* Á‘ž•.œ’.{‚|... */
- $"7C03 7D75 849A 979C 0194 CE81 FF02 F8BD" /* |.}u„š—œ.”Îÿ.ø½ */
- $"9BA3 9C01 98B4 84FF 02F8 9D99 959C 039B" /* ›£œ.˜´„ÿ.ø™•œ.› */
- $"907E 7B82 7C01 0000 817C 037D 7482 9997" /* ~{‚|...|.}t‚™— */
- $"9B01 94DF 80FF 03EE AD95 9AA3 9B02 9A9D" /* ›.”߀ÿ.î­•š£›.š */
- $"EF84 FF02 CC91 9C94 9B03 9A8F 7C7B 827C" /* ï„ÿ.Ì‘œ”›.š|{‚| */
- $"0100 0081 7C03 7D74 8098 979A 0697 ECFF" /* ...|.}t€˜—š.—ìÿ */
- $"FFE0 A195 A69A 0195 D084 FF02 F098 9994" /* ÿà¡•¦š.•Ð„ÿ.𘙔 */
- $"9A02 998D 7B83 7C01 0000 817C 037D 737E" /* š.™{ƒ|...|.}s~ */
- $"9896 9A06 989F F9FF D099 97A7 9A02 96AD" /* ˜–š.˜ŸùÿЙ—§š.–­ */
- $"FD83 FF02 FCA6 9794 9A02 998D 7B83 7C01" /* ýƒÿ.ü¦—”š.™{ƒ|. */
- $"0000 817C 037D 737D 9796 9905 95AD FCBE" /* ..|.}s}—–™.•­ü¾ */
- $"9498 A999 0196 DD83 FF02 F7A3 9794 9902" /* ”˜©™.–݃ÿ.÷£—”™. */
- $"988C 7A83 7C01 0000 817C 037D 737B 9696" /* ˜Œzƒ|...|.}s{–– */
- $"9803 95B0 B392 AB98 0294 AAF9 82FF 01CF" /* ˜.•°³’«˜.”ªù‚ÿ.Ï */
- $"9595 9802 978A 7A83 7C01 0000 817C 037D" /* ••˜.—Šzƒ|...|.} */
- $"747B 9498 9700 94AD 9708 93B9 F9FF FFF6" /* t{”˜—.”­—.“¹ùÿÿö */
- $"C797 9695 9702 9688 7983 7C01 0000 817C" /* Ç—–•—.–ˆyƒ|...| */
- $"037D 7479 93CA 9606 92A4 BEB8 9F91 9596" /* .}ty“Ê–.’¤¾¸Ÿ‘•– */
- $"9602 9588 7983 7C01 0000 817C 037D 7478" /* –.•ˆyƒ|...|.}tx */
- $"93CB 9603 9390 9193 9896 0294 8779 837C" /* “Ë–.“‘“˜–.”‡yƒ| */
- $"0100 0081 7C03 7D75 7892 EA95 0293 8679" /* ...|.}ux’ê•.“†y */
- $"837C 0100 0081 7C03 7D75 7892 EA95 0293" /* ƒ|...|.}ux’ê•.“ */
- $"8679 837C 0100 0081 7C03 7D76 7792 EA95" /* †yƒ|...|.}vw’ê• */
- $"0293 8679 837C 0100 0081 7C03 7D76 7792" /* .“†yƒ|...|.}vw’ */
- $"EA95 0293 8579 837C 0000 827C 037D 7776" /* ê•.“…yƒ|..‚|.}wv */
- $"8FEA 9402 9182 7883 7C00 0083 7C03 7A70" /* ê”.‘‚xƒ|..ƒ|.zp */
- $"8288 E989 0285 7A79 837C 0100 0082 7C02" /* ‚ˆé‰.…zyƒ|...‚|. */
- $"7D78 76EA 7901 7779 847C 0100 00FB 7C01" /* }xvêy.wy„|...û|. */
- $"0000 FB7C 0100 00FB 7C01 0000 FB7C 0100" /* ..û|...û|...û|.. */
- $"00FA 7C81 00F9 7C82 00F7 7C83 00F6 7C86" /* .ú|.ù|‚.÷|ƒ.ö|† */
- $"00F3 7CFF 00FF 0000 00FF 00FF 00FF 00FF" /* .ó|ÿ.ÿ...ÿ.ÿ.ÿ.ÿ */
- $"00FF 00FF 00FF 00FF 00FF 00FF 00FF 00FF" /* .ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ */
- $"00FF 00FF 00FF 00FF 00FF 00FF 00FF 00FF" /* .ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ */
- $"00FF 00FF 00FF 00FF 00FF 00DF 009F 74D7" /* .ÿ.ÿ.ÿ.ÿ.ÿ.ß.Ÿt× */
- $"00A6 74D3 0001 7474 8000 9D73 8474 D000" /* .¦tÓ..tt€.s„tÐ. */
- $"0374 7400 749E 7702 7673 7283 74D0 0003" /* .tt.tžw.vsrƒtÐ.. */
- $"7381 9FAB 9DAC 03A8 977A 7383 74CD 0004" /* sŸ«¬.¨—zsƒtÍ.. */
- $"7400 79AF CC9E CF03 CCBF 9B73 8374 CD00" /* t.y¯ÌžÏ.Ì¿›sƒtÍ. */
- $"0474 0088 C6D2 9FD3 03CA AF7C 7282 74CD" /* .t.ˆÆÒŸÓ.ʯ|r‚tÍ */
- $"0003 7400 8EC9 A0D3 03CC B27D 7282 74CC" /* ..t.ŽÉ Ó.̲}r‚tÌ */
- $"0004 7474 7094 CBA0 D203 CCB3 7C72 8374" /* ..ttp”Ë Ò.̳|rƒt */
- $"CB00 0474 7471 A1CE A0D1 03CC B67F 72B8" /* Ë..ttq¡Î Ñ.̶.r¸ */
- $"7495 0005 7474 0078 B7D0 A0D1 03CE BE8B" /* t•..tt.x·Ð Ñ.ξ‹ */
- $"70BA 7492 0006 7474 0070 96C9 CFA0 D004" /* pºt’..tt.p–ÉÏ Ð. */
- $"CFC6 A675 71BA 7490 0006 7474 0072 8FC0" /* ÏƦuqºt..tt.rÀ */
- $"CDA2 CF03 CBBF 9D7A B672 0473 0073 7474" /* Í¢Ï.Ë¿z¶r.s.stt */
- $"8E00 0674 7400 799D C3CD A3CF 04CE CAC3" /* Ž..tt.yÃÍ£Ï.ÎÊà */
- $"B2A0 B598 0496 8D79 0074 8D00 0774 7400" /* ² µ˜.–y.t..tt. */
- $"79A8 C8CE CEA4 CF03 CECD CBC9 B5C7 03C3" /* y¨ÈÎΤÏ.ÎÍËɵÇ.à */
- $"B58F 0080 7489 0081 7403 7192 C1C8 E2C9" /* µ.€t‰.t.q’ÁÈâÉ */
- $"03C7 B995 7282 7486 0001 7474 8000 026E" /* .ǹ•r‚t†..tt€..n */
- $"91AC E3AF 04AE A58A 6F71 8000 0174 7484" /* ‘¬ã¯.®¥Šoq€..tt„ */
- $"0008 7400 7075 8085 8487 8E80 8FAA 9000" /* ..t.pu€…„‡Ž€ª. */
- $"8FB0 9080 8F09 8B87 8584 847F 7600 7474" /* °€Æ‹‡…„„.v.tt */
- $"8200 0774 0070 8BAF BCBF C0E7 C109 C0BF" /* ‚..t.p‹¯¼¿ÀçÁÆÀ¿ */
- $"BEBE B8A6 8572 7474 8200 0370 8DC0 C9EE" /* ¾¾¸¦…rtt‚..pÀÉî */
- $"CA05 C9C4 B185 0074 8000 0474 0078 B4C8" /* Ê.Éı….t€..t.x´È */
- $"F0CA 0CC9 BFA1 7600 7400 0074 0088 BFC8" /* ðÊ.É¿¡v.t..t.ˆ¿È */
- $"B3C9 03CA C7C9 CAB7 C90A C3AD 7F00 7400" /* ³É.ÊÇÉÊ·ÉÂí..t. */
- $"0074 708C C0B3 C805 C9C3 B8B3 C4C9 B6C8" /* .tpŒÀ³È.Éø³ÄÉ¶È */
- $"0AC3 AE7F 0074 0074 7400 88BD B4C7 05C2" /* Âî..t.tt.ˆ½´Ç. */
- $"F1EC B2C4 C8B5 C70B C1AB 7C00 7400 7474" /* ñì²ÄȵÇ.Á«|.t.tt */
- $"0082 BAC6 B3C7 04C6 F2FF E6B3 B6C7 0BC0" /* .‚ºÆ³Ç.Æòÿ泶Ç.À */
- $"A67A 7374 0074 7400 7DB5 C5B3 C606 C3E7" /* ¦zst.tt.}µÅ³Æ.Ãç */
- $"FFFF D5B6 C8B4 C60B BDA1 7573 7400 7474" /* ÿÿնȴÆ.½¡ust.tt */
- $"0079 B0C4 B3C5 01C2 D880 FF02 C0BD C6B2" /* .y°Ä³Å.ÂØ€ÿ.À½Æ² */
- $"C50C C4BB 9D75 7374 0074 7473 75AA C2B3" /* Å.Ä»ust.ttsuªÂ³ */
- $"C406 C3C9 FAFF FFF0 B3B3 C403 C3B8 9673" /* Ä.ÃÉúÿÿð³³Ä.ø–s */
- $"8474 01A5 C1B4 C301 C1EB 80FF 02D6 B4C5" /* „t.¥Á´Ã.Áë€ÿ.Ö´Å */
- $"B1C3 03C2 B591 7283 7402 719E BFB4 C201" /* ±Ã.µ‘rƒt.qž¿´Â. */
- $"BFD5 80FF 03FD BBBD C3B0 C203 C0B2 8E72" /* ¿Õ€ÿ.ý»½Ã°Â.À²Žr */
- $"8374 0270 99BD B4C1 02C0 C4F6 80FF 02E6" /* ƒt.p™½´Á.ÀÄö€ÿ.æ */
- $"B1C2 B0C1 03BE AF87 7283 7402 7193 BBB5" /* ±Â°Á.¾¯‡rƒt.q“»µ */
- $"C001 BCE1 81FF 02C6 B7C1 AFC0 06BD AC84" /* À.¼áÿ.Æ·Á¯À.½¬„ */
- $"7274 7400 8074 0270 8CB9 B1BF 00C0 80C1" /* rtt.€t.pŒ¹±¿.À€Á */
- $"02BD CAFD 80FF 01F1 B1B0 BF06 BBA9 8172" /* .½Êý€ÿ.ñ±°¿.»©r */
- $"7474 0080 7402 7088 B7B0 BF07 C1B9 ACAB" /* tt.€t.pˆ·°¿.Á¹¬« */
- $"AEBC BEEB 81FF 02D1 B3C0 AEBF 06BA A67C" /* ®¼¾ëÿ.ѳÀ®¿.º¦| */
- $"7274 7400 8074 0271 83B4 AFBE 08BF AFB4" /* rtt.€t.qƒ´¯¾.¿¯´ */
- $"D9E3 D2AD B1D3 81FF 02F8 B4BC AEBE 06B8" /* ÙãÒ­±Óÿ.ø´¼®¾.¸ */
- $"A27A 7374 7400 8074 0372 7DB1 BCAE BD01" /* ¢zstt.€t.r}±¼®½. */
- $"B9CA 81FF 03F6 B4B9 F381 FF02 D8AF BEAD" /* ¹Êÿ.ö´¹óÿ.د¾­ */
- $"BD0D B69F 7973 7474 0000 7474 727A ADBB" /* ½.¶Ÿystt..ttrz­» */
- $"ADBC 03BB ABB7 E681 FF02 E6AE D881 FF02" /* ­¼.»«·æÿ.æ®Øÿ. */
- $"FDB7 B8AD BC0D B49A 7673 7474 0000 7474" /* ý·¸­¼.´švstt..tt */
- $"7378 A9BA ACBB 0CBC ACDB D7A6 BDF0 FFFF" /* sx©º¬».¼¬Ûצ½ðÿÿ */
- $"FABA BEF7 81FF 02DF ACBC ACBB 01B2 9781" /* úº¾÷ÿ.߬¼¬».²— */
- $"7407 0000 7474 7374 A4B8 ABB9 0DBA B3BB" /* t...ttst¤¸«¹.º³» */
- $"FFFF F7C2 A4CB FAFC C0B4 DC82 FF02 BAB4" /* ÿÿ÷¤ËúüÀ´Ü‚ÿ.º´ */
- $"BAAB B901 B093 8174 0100 0080 7402 729F" /* º«¹.°“t...€t.rŸ */
- $"B6AB B902 BAAA E981 FF07 ECB3 ABD1 BBB6" /* ¶«¹.ºªéÿ.쳫ѻ¶ */
- $"C0FA 81FF 02E4 AABA AAB9 03B8 AD8E 7380" /* Àúÿ.䪺ª¹.¸­Žs€ */
- $"7401 0000 8074 0272 9BB6 AAB8 02B9 ADC6" /* t...€t.r›¶ª¸.¹­Æ */
- $"84FF 05DC AFB7 B8B4 E082 FF02 BCB1 B9A9" /* „ÿ.ܯ·¸´à‚ÿ.¼±¹© */
- $"B803 B6AB 8A72 8074 0100 0080 7402 7095" /* ¸.¶«Šr€t...€t.p• */
- $"B4AA B602 B5AB F484 FF06 E9B6 B5B6 B4C2" /* ´ª¶.µ«ô„ÿ.鶵¶´Â */
- $"FC81 FF02 E6A9 B7A9 B603 B5A8 8872 8074" /* üÿ.æ©·©¶.µ¨ˆr€t */
- $"0100 0080 7402 6F91 B3A9 B602 B7AD D684" /* ...€t.o‘³©¶.·­Ö„ */
- $"FF02 FAC0 B480 B601 B3E4 82FF 02BD AFB7" /* ÿ.úÀ´€¶.³ä‚ÿ.½¯· */
- $"A8B6 03B4 A584 7280 7401 0000 8074 0270" /* ¨¶.´¥„r€t...€t.p */
- $"8DB2 A9B6 02B4 ACE7 84FF 01D9 B181 B602" /* ²©¶.´¬ç„ÿ.Ù±¶. */
- $"B3C5 FE81 FF02 E8A8 B7A8 B603 B3A3 8172" /* ³Åþÿ.訷¨¶.³£r */
- $"8074 0100 0080 7402 7087 B0A8 B505 B6AA" /* €t...€t.p‡°¨µ.¶ª */
- $"BDA4 C1F5 81FF 02F3 B8B4 82B5 01B2 E782" /* ½¤Áõÿ.ó¸´‚µ.²ç‚ */
- $"FF02 BFAD B6A7 B503 B2A1 7F72 8074 0100" /* ÿ.¿­¶§µ.²¡.r€t.. */
- $"0080 7402 7083 ADA7 B40C B5AC BBFF F2B8" /* .€t.pƒ­§´.µ¬»ÿò¸ */
- $"A2D0 FBFF FFCE B083 B401 B1C5 82FF 02EA" /* ¢Ðûÿÿΰƒ´.±Å‚ÿ.ê */
- $"A7B5 A7B4 03B0 9E7C 7380 7401 0000 8074" /* §µ§´.°ž|s€t...€t */
- $"0271 80AB A8B3 01A5 EC80 FF06 E4AA A9E2" /* .q€«¨³.¥ì€ÿ.䪩â */
- $"EAB2 B284 B301 B1E8 82FF 02BF ABB4 A6B3" /* ê²²„³.±è‚ÿ.¿«´¦³ */
- $"03AE 9B79 7380 7401 0000 8074 0272 7DA8" /* .®›ys€t...€t.r}¨ */
- $"A6B2 02B3 A6C8 82FF 04FE D3A8 B2B1 85B2" /* ¦².³¦È‚ÿ.þÓ¨²±…² */
- $"01AE C582 FF02 EAA6 B3A6 B203 AC98 7873" /* .®Å‚ÿ.꦳¦².¬˜xs */
- $"8074 0100 0080 7403 7278 A5B0 A5B1 02AF" /* €t...€t.rx¥°¥±.¯ */
- $"A9F7 84FF 01DA AB86 B102 B0AF E982 FF02" /* ©÷„ÿ.Ú«†±.°¯é‚ÿ. */
- $"BEA9 B2A5 B103 AB95 7773 8074 0100 0080" /* ¾©²¥±.«•ws€t...€ */
- $"7403 7276 A2AF A4B0 02B1 A2D5 84FF 02F8" /* t.rv¢¯¤°.±¢Õ„ÿ.ø */
- $"BAAE 87B0 01AC C682 FF02 EAA4 B1A5 B003" /* º®‡°.¬Æ‚ÿ.ꤱ¥°. */
- $"A991 7573 8074 0100 0080 7402 7375 9FA4" /* ©‘us€t...€t.suŸ¤ */
- $"AE03 AFA9 B0FE 84FF 01D3 AA88 AE02 ADAD" /* ®.¯©°þ„ÿ.Óªˆ®.­­ */
- $"E982 FF02 BCA7 AFA4 AE01 A78E 8274 0100" /* é‚ÿ.¼§¯¤®.§Ž‚t.. */
- $"0081 7402 729B ADA3 AE02 AFA0 E384 FF02" /* .t.r›­£®.¯ ã„ÿ. */
- $"F0B0 AD89 AE01 AAC4 82FF 02E9 A2AF A4AE" /* ð°­‰®.ªÄ‚ÿ.颯¤® */
- $"01A5 8C82 7401 0000 8174 0270 98AC 97AD" /* .¥Œ‚t...t.p˜¬—­ */
- $"0DAC ADAE ACAE ADAC AEAD ACAE AEA4 BB85" /* .¬­®¬®­¬®­¬®®¤»… */
- $"FF11 C7A7 AEAD ACAE ADAC AEAC ACAE ACAD" /* ÿ.ǧ®­¬®­¬®¬¬®¬­ */
- $"AEAB ABE9 82FF 0EBB A6AE ADAC AEAC ACAE" /* ®««é‚ÿ.»¦®­¬®¬¬® */
- $"ACAD AEAC ADAE 97AD 01A3 8982 7401 0000" /* ¬­®¬­®—­.£‰‚t... */
- $"8174 0270 94AA 95AC 0FAD A79F A1A2 9FA2" /* t.p”ª•¬.­§Ÿ¡¢Ÿ¢ */
- $"A29F A2A1 9FA4 A9A1 EF84 FF12 E6A2 9FA2" /* ¢Ÿ¢¡Ÿ¤©¡ï„ÿ.梟¢ */
- $"A1A0 A3A1 A0A2 A0A0 A3A0 A0A2 9F9D C282" /* ¡ £¡ ¢  £  ¢ŸÂ‚ */
- $"FF10 E6A0 A9A0 A0A2 A0A0 A2A0 A1A3 A0A1" /* ÿ.æ ©  ¢  ¢ ¡£ ¡ */
- $"A2A2 AB94 AC03 ABA1 8673 8174 0100 0081" /* ¢¢«”¬.«¡†st... */
- $"7402 7091 A995 AB0E A9AF FACE C2FF BCCA" /* t.p‘©•«.©¯úÎÂÿ¼Ê */
- $"FFB6 DEFA B4A1 C884 FF14 FDB2 C0FF BFCF" /* ÿ¶Þú´¡È„ÿ.ý²Àÿ¿Ï */
- $"FFAF DCFA AFEA F1A8 F5E4 B2FE D79D E982" /* ÿ¯Üú¯êñ¨õä²þ×é‚ */
- $"FF0F B8A1 E4F8 A9EA F0AE F7E0 ACFF D5C0" /* ÿ.¸¡äø©êð®÷à¬ÿÕÀ */
- $"D1A5 94AB 03AA 9F84 7381 7401 0000 8174" /* Ñ¥”«.ªŸ„st...t */
- $"026F 8CA8 95A9 0EA7 B1FF CEC2 FFD0 DBFF" /* .oŒ¨•©.§±ÿÎÂÿÐÛÿ */
- $"B3E0 FFB6 A2F9 84FF 14D7 99D8 FFBE D0FF" /* ³àÿ¶¢ù„ÿ.×™Øÿ¾Ðÿ */
- $"C5E9 FFAC EEFA C0FE E7B0 FFE8 A3B9 82FF" /* Åéÿ¬îúÀþç°ÿ裹‚ÿ */
- $"0FE2 99EA FFC1 F5F4 ABFB EDC4 FFD7 BED6" /* .â™êÿÁõô«ûíÄÿ×¾Ö */
- $"A394 A903 A89C 8173 8174 0100 0080 7403" /* £”©.¨œst...€t. */
- $"756E 88A6 95A8 04A6 B0FF DDD3 81FF 04C9" /* unˆ¦•¨.¦°ÿÝÓÿ.É */
- $"EBFB A6D5 84FF 06F6 A3DE FFFF D1DE 80FF" /* ëû¦Õ„ÿ.ö£ÞÿÿÑÞ€ÿ */
- $"02FD C4F2 80FF 06EE C6FF FFFA A7E2 82FF" /* .ýÄò€ÿ.îÆÿÿú§â‚ÿ */
- $"01B0 D780 FF02 F6C3 FB80 FF03 E3D3 D5A2" /* .°×€ÿ.öÃû€ÿ.ãÓÕ¢ */
- $"94A8 03A7 9A7F 7381 7401 0000 8074 0375" /* ”¨.§š.st...€t.u */
- $"6E85 A495 A702 A5AF FA85 FF01 C7AB 85FF" /* n…¤•§.¥¯ú…ÿ.Ç«…ÿ */
- $"01C4 B290 FF01 D1B1 82FF 02DD ACFB 87FF" /* .IJÿ.ѱ‚ÿ.ݬû‡ÿ */
- $"01D1 A194 A703 A598 7D73 8174 0100 0081" /* .Ñ¡”§.¥˜}st... */
- $"7402 7082 A295 A602 A4AE FB84 FF02 EF9C" /* t.p‚¢•¦.¤®û„ÿ.ïœ */
- $"E484 FF02 EC9E EB90 FF02 FCA7 DF81 FF02" /* ä„ÿ.ìžëÿ.ü§ßÿ. */
- $"FCAD D787 FF01 D0A0 94A6 03A3 957B 7381" /* ü­×‡ÿ.Р”¦.£•{s */
- $"7401 0000 8174 0270 7EA1 95A6 02A4 AEFB" /* t...t.p~¡•¦.¤®û */
- $"84FF 01B8 B885 FF01 B4BF 92FF 01D4 AD80" /* „ÿ.¸¸…ÿ.´¿’ÿ.Ô­€ */
- $"FF04 FCD4 9CAC FA86 FF01 D0A0 94A6 03A3" /* ÿ.üÔœ¬ú†ÿ.Р”¦.£ */
- $"937A 7381 7401 0000 8174 0270 7B9F 95A4" /* “zst...t.p{Ÿ•¤ */
- $"02A2 ACFA 83FF 02E3 9BF1 84FF 02DE 9EF5" /* .¢¬úƒÿ.ã›ñ„ÿ.Þžõ */
- $"92FF 09FD A8D9 FADB AD8B B1A1 D486 FF01" /* ’ÿÆý¨ÙúÛ­‹±¡Ô†ÿ. */
- $"CF9E 94A4 03A1 9178 7381 7401 0000 8174" /* Ïž”¤.¡‘xst...t */
- $"0270 779D 95A3 02A1 ACFA 82FF 02FD A9C7" /* .pw•£.¡¬ú‚ÿ.ý©Ç */
- $"84FF 02FC A5CD 94FF 09D9 989F 8B9B D3FF" /* „ÿ.ü¥Í”ÿÆÙ˜Ÿ‹›Óÿ */
- $"CDA1 F985 FF01 CF9D 94A3 03A0 8E77 7381" /* Í¡ù…ÿ.Ï”£. Žws */
- $"7401 0000 8174 0271 779A 95A2 02A0 ABFA" /* t...t.qwš•¢. «ú */
- $"82FF 02D4 A0FB 84FF 02CE A2FD 95FF 08A6" /* ‚ÿ.Ô û„ÿ.΢ý•ÿ.¦ */
- $"AEDB FCFF FFFA 9ECF 85FF 01CE 9C94 A203" /* ®ÛüÿÿúžÏ…ÿ.Îœ”¢. */
- $"9E8C 7673 8174 0100 0081 7402 7275 9895" /* žŒvst...t.ru˜• */
- $"A102 9FAA FA81 FF02 F79D D784 FF02 F29C" /* ¡.Ÿªúÿ.÷ׄÿ.òœ */
- $"DE96 FF01 DABD 82FF 02D0 9DF8 84FF 01CE" /* Þ–ÿ.Ú½‚ÿ.Ðø„ÿ.Î */
- $"9A94 A102 9C8A 7582 7401 0000 8174 0272" /* š”¡.œŠu‚t...t.r */
- $"7196 959F 089D A9EE F2F1 F1F6 C0AA 85FF" /* q–•Ÿ.©îòññöÀª…ÿ */
- $"02C0 ADF5 95F1 03F2 F1AE E681 FF03 FCA0" /* .À­õ•ñ.òñ®æÿ.ü  */
- $"C7F5 82F1 02F6 C89A 949F 029A 8775 8274" /* Çõ‚ñ.öÈš”Ÿ.š‡u‚t */
- $"0100 0081 7402 736F 9396 9E00 9F82 A201" /* ...t.so“–ž.Ÿ‚¢. */
- $"93E8 84FF 03E8 9EA2 A396 A202 A39D BB82" /* “è„ÿ.螢£–¢.£»‚ */
- $"FF02 D597 A383 A200 A195 9E01 9985 8374" /* ÿ.Õ—£ƒ¢.¡•ž.™…ƒt */
- $"0100 0081 7403 736E 929D 959E 009D 809C" /* ...t.sn’•ž.€œ */
- $"029D 91BC 84FF 03FE B599 9D99 9C01 9DE7" /* .‘¼„ÿ.þµ™™œ.ç */
- $"81FF 02C7 8D9B 839C 009D 959E 0198 8383" /* ÿ.Ç›ƒœ.•ž.˜ƒƒ */
- $"7401 0000 8274 016E 8F9A 9C02 9A98 F484" /* t...‚t.nšœ.š˜ô„ */
- $"FF01 DA99 9B9C 0997 B9FF FFE4 A7A6 CF91" /* ÿ.Ú™›œÆ—¹ÿÿ䧦ϑ */
- $"9D9B 9C02 9681 7382 7401 0000 8274 026F" /* ›œ.–s‚t...‚t.o */
- $"8C9A 989B 029C 90CF 84FF 02F8 A998 9D9B" /* Œš˜›.œÏ„ÿ.ø©˜› */
- $"08B3 A39A C8FC FFB0 919C 9A9B 0294 8073" /* .³£šÈüÿ°‘œš›.”€s */
- $"8274 0100 0082 7402 6D8A 9998 9A02 989C" /* ‚t...‚t.mŠ™˜š.˜œ */
- $"F484 FF01 CB94 9D9A 0397 A2DD FB80 FF02" /* ô„ÿ.Ë”š.—¢Ýû€ÿ. */
- $"F294 979A 9A02 927E 7382 7401 0000 8174" /* ò”—šš.’~s‚t...t */
- $"0375 6B87 9898 9904 969A 96D2 FE81 FF02" /* .uk‡˜˜™.–š–Òþÿ. */
- $"EF9E 979D 9902 97A1 F382 FF02 D68A 9A99" /* ïž—™.—¡ó‚ÿ.ÖŠš™ */
- $"9902 917C 7382 7401 0000 8174 0375 6A85" /* ™.‘|s‚t...t.uj… */
- $"9797 9806 9798 F1D3 8F9F E480 FF01 BB92" /* ——˜.—˜ñÓŸä€ÿ.»’ */
- $"9F98 0192 CF83 FF02 B68A 9998 9802 8F7B" /* Ÿ˜.’σÿ.¶Š™˜˜.{ */
- $"7382 7401 0000 8174 0375 6A82 9597 960B" /* s‚t...t.uj‚•—–. */
- $"939F FBFF F9BB 89B0 F5E4 9595 9F96 0192" /* “Ÿûÿù»‰°õä••Ÿ–.’ */
- $"AD83 FF03 FA9B 9097 9796 028D 7973 8274" /* ­ƒÿ.ú›——–.ys‚t */
- $"0100 0081 7403 756A 8195 9796 0191 AC81" /* ...t.uj•—–.‘¬ */
- $"FF04 EEA8 97A2 94A0 9602 9597 EC83 FF01" /* ÿ.¢” –.•—ìƒÿ. */
- $"E28A 9796 0395 8C78 7382 7401 0000 8174" /* ⊗–.•Œxs‚t...t */
- $"0375 6C7F 9497 9501 8EBB 82FF 02FE B28E" /* .ul.”—•.Ž»‚ÿ.þ²Ž */
- $"A295 018F CE84 FF02 BD89 9695 9503 948B" /* ¢•.΄ÿ.½‰–••.”‹ */
- $"7873 8274 0100 0081 7403 756D 7D92 9794" /* xs‚t...t.um}’—” */
- $"018C CB81 FF02 F8B8 93A3 9401 90AE 84FF" /* .ŒËÿ.ø¸“£”.®„ÿ */
- $"02F7 9691 9594 0393 8A77 7382 7401 0000" /* .÷–‘•”.“Šws‚t... */
- $"8174 0375 6C7B 9197 9301 8CDD 80FF 02ED" /* t.ul{‘—“.ŒÝ€ÿ.í */
- $"A78D A493 0292 96EE 84FF 02C8 8894 9493" /* §¤“.’–î„ÿ.Ȉ””“ */
- $"0392 8875 7382 7401 0000 8174 0375 6C79" /* .’ˆus‚t...t.uly */
- $"9096 9207 9190 EBFF FFDE 9A8D A692 018C" /* –’.‘ëÿÿÞš¦’.Œ */
- $"CC84 FF02 EF91 9194 9201 9186 8474 0100" /* Ì„ÿ.ï‘‘”’.‘†„t.. */
- $"0081 7403 756B 7790 9692 0690 97F8 FFCC" /* .t.ukw–’.—øÿÌ */
- $"918E A792 028E A6FD 83FF 02FC 9F8F 9492" /* ‘Ž§’.Ž¦ýƒÿ.üŸ”’ */
- $"0191 8584 7401 0000 8174 0375 6B75 8E96" /* .‘…„t...t.ukuŽ– */
- $"9005 8BA7 FCBA 8B8E A990 018D DB83 FF02" /* .‹§üº‹Ž©.Ûƒÿ. */
- $"F79B 8D94 9002 8F83 7383 7401 0000 8174" /* ÷›”.ƒsƒt...t */
- $"0375 6C74 8E96 9004 8CAA AD89 8FAA 9002" /* .ultŽ–.Œª­‰ª. */
- $"8CA3 F982 FF01 CB8C 9590 028F 8373 8374" /* Œ£ù‚ÿ.ËŒ•.ƒsƒt */
- $"0100 0081 7403 756B 728D 988F 008B AD8F" /* ...t.ukr˜.‹­ */
- $"088A B4F9 FFFF F6C3 8E8E 958F 028E 8172" /* .Š´ùÿÿöÃŽŽ•.Žr */
- $"8374 0100 0081 7403 756C 718C CA8E 068A" /* ƒt...t.ulqŒÊŽ.Š */
- $"9DBA B398 898D 968E 028D 8072 8374 0100" /* º³˜‰–Ž.€rƒt.. */
- $"0081 7403 756C 718B CB8E 038B 8888 8B98" /* .t.ulq‹ËŽ.‹ˆˆ‹˜ */
- $"8E02 8C80 7283 7401 0000 8174 0375 6D71" /* Ž.Œ€rƒt...t.umq */
- $"8BEA 8E02 8C80 7283 7401 0000 8174 0375" /* ‹êŽ.Œ€rƒt...t.u */
- $"6D70 8AEA 8D02 8B7F 7283 7401 0000 8174" /* mpŠê.‹.rƒt...t */
- $"0375 6E70 8AEA 8D02 8B7E 7283 7401 0000" /* .unpŠê.‹~rƒt... */
- $"8174 0375 6E70 8AEA 8D02 8B7E 7283 7400" /* t.unpŠê.‹~rƒt. */
- $"0082 7403 756F 6E88 EA8C 0289 7B71 8374" /* .‚t.uonˆêŒ.‰{qƒt */
- $"0000 8374 0372 697B 81E9 8202 7E73 7283" /* ..ƒt.ri{é‚.~srƒ */
- $"7401 0000 8274 0475 706E 7172 E671 0372" /* t...‚t.upnqræq.r */
- $"7270 7284 7401 0000 FB74 0100 00FB 7401" /* rpr„t...ût...ût. */
- $"0000 FB74 0100 00FB 7401 0000 FA74 8100" /* ..ût...ût...út. */
- $"F974 8200 F774 8300 F674 8600 F374 FF00" /* ùt‚.÷tƒ.öt†.ótÿ. */
- $"FF00 0000 7438 6D6B 0000 4008 0000 0000" /* ÿ...t8mk..@..... */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0101 0101 0202 0202 0202 0202 0202 0202" /* ................ */
- $"0202 0202 0202 0202 0202 0202 0202 0101" /* ................ */
- $"0101 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0102 0202" /* ................ */
- $"0304 0505 0606 0606 0606 0606 0606 0606" /* ................ */
- $"0606 0606 0606 0606 0606 0606 0606 0505" /* ................ */
- $"0503 0302 0100 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0001 0100 0000" /* ................ */
- $"0204 0506 0707 0707 0707 0707 0707 0707" /* ................ */
- $"0707 0707 0707 0707 0707 0707 0707 0606" /* ................ */
- $"090A 0805 0302 0100 0000 0000 0000 0000" /* ÆÂ.............. */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0101 001C 2F31" /* ............../1 */
- $"3436 383A 3A3A 3A3A 3A3A 3A3A 3A3A 3A3A" /* 468::::::::::::: */
- $"3A3A 3A3A 3A3A 3A3A 3A3A 3A3A 3A3A 3A34" /* :::::::::::::::4 */
- $"120B 0F0B 0704 0201 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0004 8FF3 FAF9" /* ............óúù */
- $"F9F9 F9F9 F9F9 F9F9 F9F9 F9F9 F9F9 F9F9" /* ùùùùùùùùùùùùùùùù */
- $"F9F9 F9F9 F9F9 F9F9 F9F9 F9F9 F9F9 FAFA" /* ùùùùùùùùùùùùùùúú */
- $"C433 1112 0C07 0402 0100 0000 0000 0000" /* Ä3.............. */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0001 0067 FFFF FFFF" /* ...........gÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFC3 201A 130C 0703 0100 0000 0000 0000" /* ÿÃ ............. */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0001 00A9 FFFF FFFF" /* ...........©ÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFF8 4A20 1B11 0A05 0200 0000 0000 0000" /* ÿøJ ..Â......... */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0002 00B6 FFFF FFFF" /* ...........¶ÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFB 5928 2216 0D07 0200 0000 0000 0000" /* ÿûY("........... */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0103 07CC FFFF FFFF" /* ...........Ìÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFD 6231 291B 1109 0401 0000 0000 0000" /* ÿýb1)..Æ........ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0201 21F0 FFFF FFFF" /* ..........!ðÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF 7337 2F21 160D 0704 0303 0303 0303" /* ÿÿs7/!.......... */
- $"0303 0303 0303 0303 0303 0303 0303 0303" /* ................ */
- $"0303 0303 0303 0303 0303 0303 0303 0303" /* ................ */
- $"0303 0303 0303 0303 0303 0302 0201 0100" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0001 0500 69FF FFFF FFFF" /* ..........iÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF 9A38 3628 1C14 0E0A 0909 0909 0909" /* ÿÿš86(...ÂÆÆÆÆÆÆ */
- $"0909 0909 0909 0909 0909 0909 0909 0909" /* ÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆ */
- $"0909 0909 0909 0909 0909 0909 0909 0909" /* ÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆ */
- $"0909 0909 0909 0909 0909 0807 0604 0302" /* ÆÆÆÆÆÆÆÆÆÆ...... */
- $"0100 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0203 0021 DFFF FFFF FFFF" /* .........!ßÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF E653 312D 231B 1512 1011 1010 1010" /* ÿÿæS1-#......... */
- $"1010 1010 1010 1010 1010 1010 1010 1010" /* ................ */
- $"1010 1010 1010 1010 1010 1010 1010 1010" /* ................ */
- $"1010 1010 1010 1010 1010 0E0C 0A08 0504" /* ............Â... */
- $"0301 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0002 0200 34D3 FFFF FFFF FFFF" /* ........4Óÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFD6 6E40 312A 2522 2121 2121 2121" /* ÿÿÿÖn@1*%"!!!!!! */
- $"2121 2121 2121 2121 2121 2121 2121 2121" /* !!!!!!!!!!!!!!!! */
- $"2121 2121 2121 2121 2121 2121 2121 2121" /* !!!!!!!!!!!!!!!! */
- $"2121 2121 2121 2121 2120 1E1B 1814 0D00" /* !!!!!!!!! ...... */
- $"0203 0100 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0102 006C F4FF FFFF FFFF FFFF" /* .......lôÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FEE8 DAD9 D9D8 D8D8 D8D8 D8D8" /* ÿÿÿÿþèÚÙÙØØØØØØØ */
- $"D8D8 D8D8 D8D8 D8D8 D8D8 D8D8 D8D8 D8D8" /* ØØØØØØØØØØØØØØØØ */
- $"D8D8 D8D8 D8D8 D8D8 D8D8 D8D8 D8D8 D8D8" /* ØØØØØØØØØØØØØØØØ */
- $"D8D8 D8D8 D8D8 D8D8 D8D8 D7D7 D6D5 D5A9" /* ØØØØØØØØØØ××ÖÕÕ© */
- $"1E00 0200 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0001 0300 71FF FFFF FFFF FFFF FFFF" /* ......qÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"8500 0402 0100 0000 0000 0000 0000 0000" /* …............... */
- $"0001 0203 0317 E1FF FFFF FFFF FFFF FFFF" /* ......áÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"9E03 0905 0302 0100 0000 0000 0000 0000" /* ž.Æ............. */
- $"0201 0000 002C E4E8 E8E9 EAEB ECEC EDED" /* .....,äèèéêëììíí */
- $"EDED EDED EDED EDED EDED EDED EDED EDED" /* íííííííííííííííí */
- $"EDED EDED EDED EDED EDED EDED EDED EDED" /* íííííííííííííííí */
- $"EDED EDED ECEC ECEC ECEC ECEC ECEC ECEC" /* ííííìììììììììììì */
- $"ECEC ECEC ECEC ECEC ECEC ECEC ECEC ECEC" /* ìììììììììììììììì */
- $"ECEC ECEC ECEC ECEC ECEC ECEC ECEC ECEC" /* ìììììììììììììììì */
- $"ECEC ECEC ECEC ECEC ECEC ECEB EAE9 E8F4" /* ìììììììììììëêéèô */
- $"8E02 0400 0000 0202 0000 0000 0000 0002" /* Ž............... */
- $"0012 6297 A3A9 BBBD C0C4 C7CA CCCD CECE" /* ..b—£©»½ÀÄÇÊÌÍÎÎ */
- $"CECE CECE CECE CECE CECE CECE CECE CECE" /* ÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎ */
- $"CECE CECE CECE CECE CECE CECE CECE CECE" /* ÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎ */
- $"CECE CECE CDCD CCCC CCCC CBCB CBCB CBCB" /* ÎÎÎÎÍÍÌÌÌÌËËËËËË */
- $"CBCB CBCB CBCB CBCB CBCB CBCB CBCB CBCB" /* ËËËËËËËËËËËËËËËË */
- $"CBCB CBCB CBCB CBCB CBCB CBCB CBCB CBCB" /* ËËËËËËËËËËËËËËËË */
- $"CBCB CBCB CBCB CBCB CBCB CBC9 C8C5 C2C0" /* ËËËËËËËËËËËÉÈÅÂÀ */
- $"B5A6 A5A1 8236 0002 0100 0000 0000 0100" /* µ¦¥¡‚6.......... */
- $"35DC FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* 5Üÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFE 8901 0101 0000 0000 001B" /* ÿÿÿÿÿþ‰......... */
- $"DFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FF73 0002 0000 0001 0082" /* ÿÿÿÿÿÿÿs.......‚ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFE4 1800 0100 0001 00C0" /* ÿÿÿÿÿÿÿä.......À */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF 4500 0200 0002 02C6" /* ÿÿÿÿÿÿÿÿE......Æ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF 4C00 0200 0103 00B3" /* ÿÿÿÿÿÿÿÿL......³ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFE 3D00 0300 0104 009C" /* ÿÿÿÿÿÿÿþ=......œ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFF4 2C04 0400 0105 0087" /* ÿÿÿÿÿÿÿô,......‡ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFE8 2007 0400 0105 0073" /* ÿÿÿÿÿÿÿè ......s */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFD9 1808 0400 0105 015C" /* ÿÿÿÿÿÿÿÙ.......\ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFC7 0E0A 0401 0105 034A" /* ÿÿÿÿÿÿÿÇ.Â.....J */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFB5 0A0A 0402 0105 043C" /* ÿÿÿÿÿÿÿµÂÂ.....< */
- $"FBFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFA1 080A 0402 0105 062B" /* ÿÿÿÿÿÿÿ¡.Â.....+ */
- $"F2FF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* òÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FF8E 050A 0402 0104 0720" /* ÿÿÿÿÿÿÿŽ.Â..... */
- $"E7FF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* çÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FF7C 0609 0300 0104 0817" /* ÿÿÿÿÿÿÿ|.Æ...... */
- $"D8FF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* Øÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FF68 0709 0300 0104 0A0E" /* ÿÿÿÿÿÿÿh.Æ....Â. */
- $"C8FF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* Èÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FF55 0809 0300 0104 0A0A" /* ÿÿÿÿÿÿÿU.Æ....ÂÂ */
- $"B7FF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ·ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FF47 0909 0300 0104 0A07" /* ÿÿÿÿÿÿÿGÆÆ....Â. */
- $"A4FF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ¤ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF F638 0B08 0300 0004 0A05" /* ÿÿÿÿÿÿö8......Â. */
- $"91FF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF EE2B 0C08 0300 0004 0905" /* ÿÿÿÿÿÿî+......Æ. */
- $"81FF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF E224 0D08 0300 0003 0906" /* ÿÿÿÿÿÿâ$......Æ. */
- $"71FF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* qÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF D51C 0E08 0300 0003 0907" /* ÿÿÿÿÿÿÕ.......Æ. */
- $"5EFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ^ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF C714 0F07 0200 0003 0908" /* ÿÿÿÿÿÿÇ.......Æ. */
- $"4FFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* Oÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF B811 0E07 0200 0003 090A" /* ÿÿÿÿÿÿ¸.......ÆÂ */
- $"43FD FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* Cýÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF A70E 0F07 0200 0003 080B" /* ÿÿÿÿÿÿ§......... */
- $"34F5 FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* 4õÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF 960C 0E06 0200 0002 080D" /* ÿÿÿÿÿÿ–......... */
- $"29EB FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* )ëÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF 850C 0E07 0200 0003 080E" /* ÿÿÿÿÿÿ…......... */
- $"22E0 FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* "àÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF 760D 0E06 0200 0003 080F" /* ÿÿÿÿÿÿv......... */
- $"1BD3 FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* .Óÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF 650E 0E06 0200 0002 080F" /* ÿÿÿÿÿÿe......... */
- $"14C7 FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* .Çÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF 580E 0D06 0200 0002 070F" /* ÿÿÿÿÿÿX......... */
- $"11B9 FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* .¹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF 4E10 0D06 0100 0002 070F" /* ÿÿÿÿÿÿN......... */
- $"10AB FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* .«ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFF8 4211 0D06 0200 0002 070F" /* ÿÿÿÿÿøB......... */
- $"0D9B FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* .›ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFF1 3513 0D06 0200 0002 080F" /* ÿÿÿÿÿñ5......... */
- $"0C8D FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* .ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFE9 2E13 0D05 0100 0002 070F" /* ÿÿÿÿÿé.......... */
- $"0D81 FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* .ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFDF 2914 0D06 0100 0002 070F" /* ÿÿÿÿÿß)......... */
- $"0E73 FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* .sÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFD4 2215 0C06 0100 0002 070F" /* ÿÿÿÿÿÔ"......... */
- $"0F64 FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* .dÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFC9 1C16 0C05 0100 0002 070F" /* ÿÿÿÿÿÉ.......... */
- $"1058 FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* .Xÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFBD 1A15 0C05 0100 0002 070F" /* ÿÿÿÿÿ½.......... */
- $"114F FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* .Oÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFB2 1815 0C05 0100 0002 070E" /* ÿÿÿÿÿ².......... */
- $"1246 FAFF FFFF FFFF FFFF FFFF FFFF FFFF" /* .Fúÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFA5 1615 0C05 0100 0002 070E" /* ÿÿÿÿÿ¥.......... */
- $"133B F4FF FFFF FFFF FFFF FFFF FFFF FFFF" /* .;ôÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FF98 1515 0C05 0100 0002 060E" /* ÿÿÿÿÿ˜.......... */
- $"1533 EEFF FFFF FFFF FFFF FFFF FFFF FFFF" /* .3îÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FF8D 1515 0B05 0100 0002 070E" /* ÿÿÿÿÿ.......... */
- $"152F E6FF FFFF FFFF FFFF FFFF FFFF FFFF" /* ./æÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FF82 1615 0B05 0100 0002 070E" /* ÿÿÿÿÿ‚.......... */
- $"1629 DDFF FFFF FFFF FFFF FFFF FFFF FFFF" /* .)Ýÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FF77 1615 0B05 0100 0002 060E" /* ÿÿÿÿÿw.......... */
- $"1624 D5FF FFFF FFFF FFFF FFFF FFFF FFFF" /* .$Õÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FF6B 1715 0B05 0100 0002 060E" /* ÿÿÿÿÿk.......... */
- $"1720 CCFF FFFF FFFF FFFF FFFF FFFF FFFF" /* . Ìÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FF61 1815 0B05 0100 0002 060E" /* ÿÿÿÿÿa.......... */
- $"181D C3FF FFFF FFFF FFFF FFFF FFFF FFFF" /* ..Ãÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FF5B 1914 0B05 0100 0002 060E" /* ÿÿÿÿÿ[.......... */
- $"181C BAFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ..ºÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FE54 1A14 0B05 0100 0002 070E" /* ÿÿÿÿþT.......... */
- $"181B B0FF FFFF FFFF FFFF FFFF FFFF FFFF" /* ..°ÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF F94C 1B15 0B04 0100 0002 060E" /* ÿÿÿÿùL.......... */
- $"181A A6FF FFFF FFFF FFFF FFFF FFFF FFFF" /* ..¦ÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF F544 1C15 0B05 0100 0002 070E" /* ÿÿÿÿõD.......... */
- $"1819 9DFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ..ÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF F13D 1D14 0B04 0100 0002 060E" /* ÿÿÿÿñ=.......... */
- $"1819 95FF FFFF FFFF FFFF FFFF FFFF FFFF" /* ..•ÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF EB3A 1D14 0B05 0100 0002 070E" /* ÿÿÿÿë:.......... */
- $"1819 8EFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ..Žÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF E537 1E14 0B05 0100 0002 070E" /* ÿÿÿÿå7.......... */
- $"181A 86FF FFFF FFFF FFFF FFFF FFFF FFFF" /* ..†ÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF DF34 1E14 0B05 0100 0002 070E" /* ÿÿÿÿß4.......... */
- $"181B 7EFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ..~ÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF D930 1F15 0B05 0100 0002 070E" /* ÿÿÿÿÙ0.......... */
- $"181B 78FF FFFF FFFF FFFF FFFF FFFF FFFF" /* ..xÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF D32D 1F15 0B05 0100 0002 070F" /* ÿÿÿÿÓ-.......... */
- $"191C 71FF FFFF FFFF FFFF FFFF FFFF FFFF" /* ..qÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF CE29 2015 0B05 0100 0002 070F" /* ÿÿÿÿÎ) ......... */
- $"191D 6AFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ..jÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF C828 2015 0B05 0100 0002 070F" /* ÿÿÿÿÈ( ......... */
- $"191D 65FF FFFF FFFF FFFF FFFF FFFF FFFF" /* ..eÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF C328 2015 0B05 0100 0002 070F" /* ÿÿÿÿÃ( ......... */
- $"191E 61FF FFFF FFFF FFFF FFFF FFFF FFFF" /* ..aÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF BE28 2115 0B05 0100 0002 070F" /* ÿÿÿÿ¾(!......... */
- $"191F 5DFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ..]ÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF B827 2115 0C05 0100 0002 070F" /* ÿÿÿÿ¸'!......... */
- $"1920 5AFE FFFF FFFF FFFF FFFF FFFF FFFF" /* . Zþÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF B427 2115 0C05 0100 0003 0710" /* ÿÿÿÿ´'!......... */
- $"1A21 58FD FFFF FFFF FFFF FFFF FFFF FFFF" /* .!Xýÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF B026 2115 0C05 0100 0003 0810" /* ÿÿÿÿ°&!......... */
- $"1A21 55FB FFFF FFFF FFFF FFFF FFFF FFFF" /* .!Uûÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF AC26 2116 0C05 0200 0003 0810" /* ÿÿÿÿ¬&!......... */
- $"1A22 52F9 FFFF FFFF FFFF FFFF FFFF FFFF" /* ."Rùÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF A826 2215 0C05 0100 0003 0810" /* ÿÿÿÿ¨&"......... */
- $"1A23 4FF7 FFFF FFFF FFFF FFFF FFFF FFFF" /* .#O÷ÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF A426 2316 0D06 0200 0003 0811" /* ÿÿÿÿ¤&#......... */
- $"1B24 4DF6 FFFF FFFF FFFF FFFF FFFF FFFF" /* .$Möÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF A126 2316 0D06 0200 0003 0911" /* ÿÿÿÿ¡&#.......Æ. */
- $"1C25 4CF5 FFFF FFFF FFFF FFFF FFFF FFFF" /* .%Lõÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF 9F26 2317 0D06 0200 0003 0912" /* ÿÿÿÿŸ&#.......Æ. */
- $"1C25 4CF5 FFFF FFFF FFFF FFFF FFFF FFFF" /* .%Lõÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF 9E26 2317 0D06 0200 0003 0912" /* ÿÿÿÿž&#.......Æ. */
- $"1C26 4BF4 FFFF FFFF FFFF FFFF FFFF FFFF" /* .&Kôÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF 9D27 2317 0D06 0200 0004 0912" /* ÿÿÿÿ'#.......Æ. */
- $"1C26 4AF3 FFFF FFFF FFFF FFFF FFFF FFFF" /* .&Jóÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF 9C27 2417 0D06 0200 0104 0912" /* ÿÿÿÿœ'$.......Æ. */
- $"1C26 47F2 FFFF FFFF FFFF FFFF FFFF FFFF" /* .&Gòÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF 9A27 2417 0D06 0200 0103 0911" /* ÿÿÿÿš'$.......Æ. */
- $"1B27 37D1 FFFF FFFF FFFF FFFF FFFF FFFF" /* .'7Ñÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF 7329 2316 0D06 0200 0003 0810" /* ÿÿÿÿs)#......... */
- $"1A27 2F59 B7C6 C6C7 C7C7 C7C7 C7C7 C7C7" /* .'/Y·ÆÆÇÇÇÇÇÇÇÇÇ */
- $"C7C7 C7C7 C7C7 C7C7 C7C7 C7C7 C7C7 C7C7" /* ÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇ */
- $"C7C7 C7C7 C7C7 C7C7 C7C7 C7C7 C7C7 C7C7" /* ÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇ */
- $"C7C7 C7C7 C7C7 C7C7 C7C7 C7C7 C7C7 C7C7" /* ÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇ */
- $"C7C7 C7C7 C7C7 C7C7 C7C7 C7C7 C7C7 C7C7" /* ÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇ */
- $"C7C7 C7C7 C7C7 C7C7 C7C7 C7C7 C7C7 C7C7" /* ÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇ */
- $"C7C7 C7C7 C7C7 C7C7 C7C7 C7C7 C7C7 C7C7" /* ÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇ */
- $"C7C5 C689 372D 2015 0C06 0200 0003 070E" /* ÇÅƉ7- ......... */
- $"1723 3037 3C46 4C4F 5050 5050 5050 5050" /* .#07<FLOPPPPPPPP */
- $"5050 5050 5050 5050 5050 5050 5050 5050" /* PPPPPPPPPPPPPPPP */
- $"5050 5050 5050 5050 5050 5050 5050 5050" /* PPPPPPPPPPPPPPPP */
- $"5050 5050 5050 5050 5050 5050 5050 5050" /* PPPPPPPPPPPPPPPP */
- $"5050 5050 5050 5050 5050 5050 5050 5050" /* PPPPPPPPPPPPPPPP */
- $"5050 5050 5050 5050 5050 5050 5050 5050" /* PPPPPPPPPPPPPPPP */
- $"5050 5050 5050 5050 5050 5050 5050 5050" /* PPPPPPPPPPPPPPPP */
- $"4D49 4138 352A 1D13 0A05 0100 0003 060C" /* MIA85*..Â....... */
- $"141E 2934 3D44 494C 4D4E 4E4E 4E4E 4E4E" /* ..)4=DILMNNNNNNN */
- $"4E4E 4E4E 4E4E 4E4E 4E4E 4E4E 4E4E 4E4E" /* NNNNNNNNNNNNNNNN */
- $"4E4E 4E4E 4E4E 4E4E 4E4E 4E4E 4E4E 4E4E" /* NNNNNNNNNNNNNNNN */
- $"4E4E 4E4E 4E4E 4E4E 4E4E 4E4E 4E4E 4E4E" /* NNNNNNNNNNNNNNNN */
- $"4E4E 4E4E 4E4E 4E4E 4E4E 4E4E 4E4E 4E4E" /* NNNNNNNNNNNNNNNN */
- $"4E4E 4E4E 4E4E 4E4E 4E4E 4E4E 4E4E 4E4E" /* NNNNNNNNNNNNNNNN */
- $"4E4E 4E4E 4E4E 4E4E 4E4E 4E4E 4E4E 4E4D" /* NNNNNNNNNNNNNNNM */
- $"4B46 4039 2F24 1910 0904 0100 0002 050A" /* KF@9/$..Æ...... */
- $"1018 212B 3339 3D40 4142 4242 4242 4242" /* ..!+39=@ABBBBBBB */
- $"4242 4242 4242 4242 4242 4242 4242 4242" /* BBBBBBBBBBBBBBBB */
- $"4242 4242 4242 4242 4242 4242 4242 4242" /* BBBBBBBBBBBBBBBB */
- $"4242 4242 4242 4242 4242 4242 4242 4242" /* BBBBBBBBBBBBBBBB */
- $"4242 4242 4242 4242 4242 4242 4242 4242" /* BBBBBBBBBBBBBBBB */
- $"4242 4242 4242 4242 4242 4242 4242 4242" /* BBBBBBBBBBBBBBBB */
- $"4242 4242 4242 4242 4242 4242 4242 4140" /* BBBBBBBBBBBBBBA@ */
- $"3F3B 352F 261D 140D 0703 0100 0002 0407" /* ?;5/&........... */
- $"0C12 1920 272C 2F32 3233 3333 3333 3333" /* ... ',/223333333 */
- $"3333 3333 3333 3333 3333 3333 3333 3333" /* 3333333333333333 */
- $"3333 3333 3333 3333 3333 3333 3333 3333" /* 3333333333333333 */
- $"3333 3333 3333 3333 3333 3333 3333 3333" /* 3333333333333333 */
- $"3333 3333 3333 3333 3333 3333 3333 3333" /* 3333333333333333 */
- $"3333 3333 3333 3333 3333 3333 3333 3333" /* 3333333333333333 */
- $"3333 3333 3333 3333 3333 3333 3333 3332" /* 3333333333333332 */
- $"302D 2924 1D16 0F09 0502 0100 0001 0305" /* 0-)$...Æ........ */
- $"080D 1217 1C1F 2223 2425 2525 2525 2525" /* ......"#$%%%%%%% */
- $"2525 2525 2525 2525 2525 2525 2525 2525" /* %%%%%%%%%%%%%%%% */
- $"2525 2525 2525 2525 2525 2525 2525 2525" /* %%%%%%%%%%%%%%%% */
- $"2525 2525 2525 2525 2525 2525 2525 2525" /* %%%%%%%%%%%%%%%% */
- $"2525 2525 2525 2525 2525 2525 2525 2525" /* %%%%%%%%%%%%%%%% */
- $"2525 2525 2525 2525 2525 2525 2525 2525" /* %%%%%%%%%%%%%%%% */
- $"2525 2525 2525 2525 2525 2525 2525 2524" /* %%%%%%%%%%%%%%%$ */
- $"2221 1E19 1510 0B07 0402 0000 0000 0103" /* "!.............. */
- $"0609 0C10 1315 1718 1919 1919 1919 1919" /* .Æ.............. */
- $"1919 1919 1919 1919 1919 1919 1919 1919" /* ................ */
- $"1919 1919 1919 1919 1919 1919 1919 1919" /* ................ */
- $"1919 1919 1919 1919 1919 1919 1919 1919" /* ................ */
- $"1919 1919 1919 1919 1919 1919 1919 1919" /* ................ */
- $"1919 1919 1919 1919 1919 1919 1919 1919" /* ................ */
- $"1919 1919 1919 1919 1919 1919 1919 1918" /* ................ */
- $"1716 1411 0E0A 0704 0201 0000 0000 0002" /* .....Â.......... */
- $"0305 0709 0B0D 0E0F 0F0F 0F0F 0F0F 0F0F" /* ...Æ............ */
- $"0F0F 0F0F 0F0F 0F0F 0F0F 0F0F 0F0F 0F0F" /* ................ */
- $"0F0F 0F0F 0F0F 0F0F 0F0F 0F0F 0F0F 0F0F" /* ................ */
- $"0F0F 0F0F 0F0F 0F0F 0F0F 0F0F 0F0F 0F0F" /* ................ */
- $"0F0F 0F0F 0F0F 0F0F 0F0F 0F0F 0F0F 0F0F" /* ................ */
- $"0F0F 0F0F 0F0F 0F0F 0F0F 0F0F 0F0F 0F0F" /* ................ */
- $"0F0F 0F0F 0F0F 0F0F 0F0F 0F0F 0F0F 0F0F" /* ................ */
- $"0F0D 0C0A 0806 0402 0100 0000 0000 0001" /* ...Â............ */
- $"0103 0304 0607 0708 0808 0808 0808 0808" /* ................ */
- $"0808 0808 0808 0808 0808 0808 0808 0808" /* ................ */
- $"0808 0808 0808 0808 0808 0808 0808 0808" /* ................ */
- $"0808 0808 0808 0808 0808 0808 0808 0808" /* ................ */
- $"0808 0808 0808 0808 0808 0808 0808 0808" /* ................ */
- $"0808 0808 0808 0808 0808 0808 0808 0808" /* ................ */
- $"0808 0808 0808 0808 0808 0808 0808 0808" /* ................ */
- $"0707 0605 0403 0201 0000 0000 0000 0000" /* ................ */
- $"0001 0102 0202 0203 0303 0303 0303 0303" /* ................ */
- $"0303 0303 0303 0303 0303 0303 0303 0303" /* ................ */
- $"0303 0303 0303 0303 0303 0303 0303 0303" /* ................ */
- $"0303 0303 0303 0303 0303 0303 0303 0303" /* ................ */
- $"0303 0303 0303 0303 0303 0303 0303 0303" /* ................ */
- $"0303 0303 0303 0303 0303 0303 0303 0303" /* ................ */
- $"0303 0303 0303 0303 0303 0303 0303 0303" /* ................ */
- $"0202 0202 0201 0100 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 6963 3038" /* ............ic08 */
- $"0000 5CBD 0000 000C 6A50 2020 0D0A 870A" /* ..\½....jP .‡ */
- $"0000 0014 6674 7970 6A70 3220 0000 0000" /* ....ftypjp2 .... */
- $"6A70 3220 0000 004F 6A70 3268 0000 0016" /* jp2 ...Ojp2h.... */
- $"6968 6472 0000 0100 0000 0100 0004 0707" /* ihdr............ */
- $"0100 0000 000F 636F 6C72 0100 0000 0000" /* ......colr...... */
- $"1000 0000 2263 6465 6600 0400 0000 0000" /* ...."cdef....... */
- $"0100 0300 0100 0000 0100 0000 0200 0200" /* ................ */
- $"0000 0300 0000 006A 7032 63FF 4FFF 5100" /* .......jp2cÿOÿQ. */
- $"3200 0000 0001 0000 0001 0000 0000 0000" /* 2............... */
- $"0000 0000 0001 0000 0001 0000 0000 0000" /* ................ */
- $"0000 0000 0407 0101 0701 0107 0101 0701" /* ................ */
- $"01FF 5200 0C00 0000 0101 0504 0400 01FF" /* .ÿR............ÿ */
- $"5C00 1320 5058 5860 5858 6058 5860 5858" /* \.. PXX`XX`XX`XX */
- $"5850 5058 FF64 0011 0001 4B61 6B61 6475" /* XPPXÿd....Kakadu */
- $"2D76 352E 322E 31FF 9000 0A00 0000 005B" /* -v5.2.1ÿ.Â....[ */
- $"D000 01FF 93CF C100 1507 F18D 1991 E793" /* Ð..ÿ“ÏÁ...ñ.‘ç“ */
- $"D8B4 6B7C 459C 4F68 E4BF E0FF 0D3D C2DF" /* Ø´k|EœOhä¿àÿ.=Âß */
- $"FC16 8F7F 6C3A 7FEA ACD5 8632 D1AD 37A6" /* ü..l:.ê¬Õ†2Ñ­7¦ */
- $"22E3 4753 734F 3BFA 0372 1596 A8F1 7183" /* "ãGSsO;ú.r.–¨ñqƒ */
- $"2F17 0A65 C5C2 6A8E C0F9 1000 39CE 9180" /* /.ÂeÅÂjŽÀù..9Α€ */
- $"AE4A F551 B521 2839 FEE4 4D31 9F98 9F17" /* ®JõQµ!(9þäM1Ÿ˜Ÿ. */
- $"29F2 C91D 3B35 397E 15A1 8246 C3EA 3107" /* )òÉ.;59~.¡‚FÃê1. */
- $"5630 A744 5105 404A C843 0AE4 304B 4FE9" /* V0§DQ.@JÈCÂä0KOé */
- $"81E4 4C91 DF64 6885 8D23 6517 B254 DE23" /* äL‘ßdh…#e.²TÞ# */
- $"6101 3C94 9245 923D 4F4C 0F02 784C F319" /* a.<”’E’=OL..xLó. */
- $"CFC0 FC11 7EC2 D9C4 3907 5FDC 553A F1E1" /* ÏÀü.~ÂÙÄ9._ÜU:ñá */
- $"F2BC 6420 59D8 7D25 F42A 5BA5 8E8E 7166" /* ò¼d YØ}%ô*[¥ŽŽqf */
- $"AD5D 5C91 CC75 1452 ACDA 64CA 3249 CCE3" /* ­]\‘Ìu.R¬ÚdÊ2IÌã */
- $"6874 83E2 633E 64E7 8159 4AA2 FD3C 638D" /* htƒâc>dçYJ¢ý<c */
- $"F978 C3ED 328F C0F2 1F81 A80C BB81 9421" /* ùxÃí2Àò.¨.»”! */
- $"980D F457 0EA7 7782 676F 2AB3 EE8F 99C2" /* ˜.ôW.§w‚go*³î™Â */
- $"2221 9D95 8C80 C3A8 91F3 4C08 6A03 DE45" /* "!•Œ€Ã¨‘óL.j.ÞE */
- $"A985 9B7B 9ED3 A9A4 D929 A97F A125 FE22" /* ©…›{žÓ©¤Ù)©.¡%þ" */
- $"A893 77F3 EF0F C15C 3969 A153 3A7C 3110" /* ¨“wóï.Á\9i¡S:|1. */
- $"7A9C 9227 D2F6 BCA8 1A04 0219 8F36 21B7" /* zœ’'Òö¼¨....6!· */
- $"B37C 2AB6 678A 1675 BA9E 03B4 53BA 33B9" /* ³|*¶gŠ.uºž.´Sº3¹ */
- $"06AD 96D8 BDBC BFC8 5134 C040 7EBA B756" /* .­–ؽ¼¿ÈQ4À@~º·V */
- $"E619 DC67 BC83 BB39 AA42 65E1 5BBC 45B4" /* æ.Üg¼ƒ»9ªBeá[¼E´ */
- $"ECB6 E6ED D098 3C9F E17B 876D A039 553E" /* ì¶æíИ<Ÿá{‡m 9U> */
- $"5CF9 2D3F 6F47 4854 7085 62C1 C65D C07C" /* \ù-?oGHTp…bÁÆ]À| */
- $"86A0 3E43 500F 90D0 4787 8CE8 726C 5109" /* † >CP.ÐG‡ŒèrlQÆ */
- $"FD68 8099 E8FE 2A66 2F02 78F5 C78B 6A34" /* ýh€™èþ*f/.xõÇ‹j4 */
- $"0A9E 25FE 0DE3 E3C8 BD7B 3530 98D5 CF03" /* ž%þ.ããȽ{50˜ÕÏ. */
- $"CE64 A57D 620C 87C5 65B4 7BE1 34BC 3058" /* Îd¥}b.‡Åe´{á4¼0X */
- $"572A 9EBF 5E0C 5A01 80A3 B334 DF5A E1B8" /* W*ž¿^.Z.€£³4ßZḠ*/
- $"08C3 5C30 2CC4 C1F5 1341 F516 40FA 8A00" /* .Ã\0,ÄÁõ.Aõ.@úŠ. */
- $"477D B516 AD2F 4DD3 BE8C 58F0 7C77 A236" /* G}µ.­/MÓ¾ŒXð|w¢6 */
- $"DD43 6611 D582 F050 DC31 59D0 194D A6FD" /* ÝCf.Õ‚ðPÜ1YÐ.M¦ý */
- $"652E FA16 4BA7 25FE 0DE3 E3D9 B950 06E2" /* e.ú.K§%þ.ããÙ¹P.â */
- $"3A8A DA86 827A 4C68 5798 55FC FD46 A583" /* :ŠÚ†‚zLhW˜UüýF¥ƒ */
- $"064D 8FB0 29D9 8DAD 53CC 5229 B675 ACAB" /* .M°)Ù­SÌR)¶u¬« */
- $"8EED 34BC 2F12 142E 446C 0DF7 0BC3 D6E7" /* Ží4¼/...Dl.÷.ÃÖç */
- $"A086 8D72 6AE7 9270 B97C D981 C7F1 C38A" /*  †rjç’p¹|ÙÇñÊ */
- $"47EE E585 FC19 FCE3 668C C7E0 471F 813C" /* Gîå…ü.üãfŒÇàG.< */
- $"3F02 0005 B422 0345 FC66 9A91 446D DDCA" /* ?...´".Eüfš‘DmÝÊ */
- $"449B CCDB 8E8F A0B8 3942 A8FC 6409 F7F3" /* D›ÌÛŽ ¸9B¨üdÆ÷ó */
- $"ED01 353A 2B01 1B0C 2939 619B 9890 94E7" /* í.5:+...)9a›˜”ç */
- $"5FDA 75F2 7323 BF3A 7AED 757E 42D6 C336" /* _Úuòs#¿:zíu~BÖÃ6 */
- $"E74E 6B5F 2D43 4780 CA1C C462 6507 4801" /* çNk_-CG€Ê.Äbe.H. */
- $"EDEF 5B2A 7297 8FC6 1E13 E7FA 56B5 4279" /* íï[*r—Æ..çúVµBy */
- $"5BB4 B307 F4DE E273 4FC3 E9B1 72C3 EDA2" /* [´³.ôÞâsOÃé±rÃí¢ */
- $"A3F0 A9E0 FB5D C018 B35C 8B45 CD63 99FE" /* £ð©àû]À.³\‹EÍc™þ */
- $"11FB 8993 21D1 BA8B 69EB 5CB9 F258 468F" /* .û‰“!Ѻ‹ië\¹òXF */
- $"73D4 6804 C6E6 045E AE54 954C D0E5 D836" /* sÔh.Ææ.^®T•LÐåØ6 */
- $"EA0D DB9A 2806 36FA B3E9 5973 789D 6591" /* ê.Ûš(.6ú³éYsxe‘ */
- $"1EC2 F271 E9E2 5681 C542 A2FC F4EF 8111" /* .ÂòqéâVÅB¢üôï. */
- $"59D5 FC91 9749 52A3 EA37 B239 4939 8625" /* YÕü‘—IR£ê7²9I9†% */
- $"F248 18D2 075A 80A1 8005 9ED2 437F C705" /* òH.Ò.Z€¡€.žÒC.Ç. */
- $"2BFD 308C F1F0 E1BC 8FDA F5D5 50D9 9770" /* +ý0Œñðá¼ÚõÕPÙ—p */
- $"7EF5 213F 91F6 5B8B 189D EE67 70EF F40A" /* ~õ!?‘ö[‹.îgpïôÂ */
- $"2E24 C54B F37D 4941 FCD2 7779 5C8B 59CC" /* .$ÅKó}IAüÒwy\‹YÌ */
- $"F284 3377 A496 0399 6F17 47AC B5EA 3A84" /* ò„3w¤–.™o.G¬µê:„ */
- $"844E DC13 D058 BE9F 1BBE 8CE0 E615 D2E1" /* „NÜ.ÐX¾Ÿ.¾Œàæ.Òá */
- $"88A5 9DA6 9FB4 4EDE B804 ED14 A7EA 54E0" /* ˆ¥¦Ÿ´NÞ¸.í.§êTà */
- $"5A87 311B 5E69 70F5 EDA3 2E78 8862 7603" /* Z‡1.^ipõí£.xˆbv. */
- $"7761 094D 4A69 5AB0 A9BB 3F4F 92BE 205B" /* waÆMJiZ°©»?O’¾ [ */
- $"A226 24D5 C8B2 CCF7 E064 31C7 E727 6E2C" /* ¢&$ÕȲÌ÷àd1Çç'n, */
- $"D6A1 347F 41CD 5F70 E1C0 1AFC 4FBC 81A9" /* Ö¡4.AÍ_páÀ.üO¼© */
- $"A884 F03A CD84 B581 1F03 A523 838B 8038" /* ¨„ð:Í„µ..¥#ƒ‹€8 */
- $"02F4 6DE8 98FC EDD6 B331 21F7 4AC5 A31E" /* .ômè˜üíÖ³1!÷JÅ£. */
- $"9EB4 E770 D465 386E 18A6 D1BE EF6D B008" /* ž´çpÔe8n.¦Ñ¾ïm°. */
- $"63E6 1066 1374 4D10 3270 8C7F F297 F91D" /* cæ.f.tM.2pŒ.ò—ù. */
- $"DA61 677B 29FD A878 B122 E33C 17E3 8ED1" /* Úag{)ý¨x±"ã<.ãŽÑ */
- $"FB8E 4407 8B82 32AD 1B50 09DF BDA8 C80E" /* ûŽD.‹‚2­.PÆß½¨È. */
- $"7E28 ED9D A005 4297 B9C1 8D66 CA77 C41D" /* ~(í .B—¹ÁfÊwÄ. */
- $"41C5 E3B3 F94D 96E5 1308 7C59 1EB8 0871" /* AÅã³ùM–å..|Y.¸.q */
- $"C7A4 FED7 47F2 F800 6889 A21D 1FF4 9E93" /* Ǥþ×Gòø.h‰¢..ôž“ */
- $"1321 7377 D96E 86F5 A0CB EB17 C77A 81C0" /* .!swÙn†õ Ëë.ÇzÀ */
- $"7C8D A01F 0E91 00F9 1D00 94FD 4D32 E5DB" /* | ..‘.ù..”ýM2åÛ */
- $"0482 DEB8 CF1C 792A EA3B DECA 4470 4898" /* .‚Þ¸Ï.y*ê;ÞÊDpH˜ */
- $"81C0 5457 FE66 63DD CAF3 0B98 08E1 DC3F" /* ÀTWþfcÝÊó.˜.áÜ? */
- $"CF68 7F31 9BEE 73EF A3A5 8D57 8969 EEC3" /* Ïh.1›îsW‰iîà */
- $"0F13 3ED9 390D FC4C B37F C4F7 01E4 B115" /* ..>Ù9.üL³.Ä÷.ä±. */
- $"E9F9 9526 00FA 10D0 0D64 4CC5 8481 D231" /* éù•&.ú.Ð.dLÅ„Ò1 */
- $"DE6D 483E 8046 7F58 5BD3 1FFC CF82 297A" /* ÞmH>€F.X[Ó.üÏ‚)z */
- $"88A1 7E78 0668 3222 9E8B A287 30A3 DB10" /* ˆ¡~x.h2"ž‹¢‡0£Û. */
- $"A77F A842 87FC 164E 92B8 96DF 4920 EEC2" /* §.¨B‡ü.N’¸–ßI î */
- $"47B6 83F1 F68F 9309 63CE FAAC 3C8F 9FCF" /* G¶ƒñö“ÆcÎú¬<ŸÏ */
- $"A166 9621 ADC0 0ABB 7F1A 7E3C A4AD 3755" /* ¡f–!­À»..~<¤­7U */
- $"E2D8 E26D CAD1 6F24 F808 BC0D E94B EEBC" /* âØâmÊÑo$ø.¼.éKî¼ */
- $"D601 C1F5 30C1 F53B C0FA 97C0 90E6 901B" /* Ö.Áõ0Áõ;Àú—Àæ. */
- $"71C2 1EAB 8A4C 52A4 4431 058C DFB9 4148" /* qÂ.«ŠLR¤D1.Œß¹AH */
- $"185C 1E93 01C6 82D3 C81B 6398 8173 189D" /* .\.“.Æ‚ÓÈ.c˜s. */
- $"F73C 4887 5155 0C95 0088 4C69 0A27 3F39" /* ÷<H‡QU.•.ˆLiÂ'?9 */
- $"8CCA 32D8 1FD7 A3F4 CDD8 6275 5E7E 3619" /* ŒÊ2Ø.×£ôÍØbu^~6. */
- $"8D18 68C9 D2C7 0FCB 18EA FB01 5A68 4A52" /* .hÉÒÇ.Ë.êû.ZhJR */
- $"3C08 5313 5ED2 9B7D 31B5 953C 2F92 22F7" /* <.S.^Ò›}1µ•</’"÷ */
- $"3764 04E8 A9A6 C747 8DFD 9730 01DD 82E1" /* 7d.試ÇGý—0.Ý‚á */
- $"B08A FD72 7C33 A9BF AFEA 7188 AC4B 2B45" /* °Šýr|3©¿¯êqˆ¬K+E */
- $"BBB2 7826 6704 5864 9BAF 91FC 6BD3 E9D7" /* »²x&g.Xd›¯‘ükÓé× */
- $"0E30 E428 0FB2 4836 F94F 7CB9 3723 72A2" /* .0ä(.²H6ùO|¹7#r¢ */
- $"AB4C C0EB ED8F 823B B8D6 C4A6 E4B5 B41C" /* «LÀëí‚;¸ÖĦ䵴. */
- $"B0FC 0171 880F E77C 1EF8 9645 A8B4 969A" /* °ü.qˆ.ç|.ø–E¨´–š */
- $"5420 86B9 71CE 0DE5 7A40 B41A DD85 6B30" /* T †¹qÎ.åz@´.Ý…k0 */
- $"F02A 3B61 92B4 7A95 269E BF9F DDB3 9FB7" /* ð*;a’´z•&ž¿ŸÝ³Ÿ· */
- $"746B 1514 C89D 391B F835 73B8 0F1C 2567" /* tk..È9.ø5s¸..%g */
- $"A0C2 6B37 DFCE 5F4C 1DCD FD79 5CDA A8FF" /*  Âk7ßÎ_L.Íýy\Ú¨ÿ */
- $"0603 9014 308F AEB3 EDB7 D721 1709 3897" /* ...0®³í·×!.Æ8— */
- $"D3AB 181E 53BE 4025 3492 41C2 5EC7 BFC0" /* Ó«..S¾@%4’AÂ^Ç¿À */
- $"EA12 19D0 6158 530B A57B 8A2B 8DFF 18AF" /* ê..ÐaXS.¥{Š+ÿ.¯ */
- $"7651 65CF CD26 3F05 987E 0760 9C3C E3A6" /* vQeÏÍ&?.˜~.`œ<㦠*/
- $"86C0 DAB4 C6ED 7F19 8034 85FE DA7E 7963" /* †ÀÚ´Æí..€4…þÚ~yc */
- $"AFF2 9CBE 6AAA B6BB B2D3 6F41 BB45 B1EB" /* ¯òœ¾jª¶»²ÓoA»E±ë */
- $"9CC2 8803 907A 5CE1 F2D9 AF69 FF22 7DE8" /* œÂˆ.z\áòÙ¯iÿ"}è */
- $"D328 C2A1 0F97 2EE2 9575 E0E6 A665 B85A" /* Ó(¡.—.â•uàæ¦e¸Z */
- $"C5D7 6FA0 FE24 BC68 9D74 6CEB C4F9 615C" /* Å×o þ$¼htlëÄùa\ */
- $"4F34 48B3 7A64 2540 B64F EFBE 8D0F E427" /* O4H³zd%@¶Oï¾.ä' */
- $"4CCA 6DB3 83AC C5F6 EE52 7A43 8172 41E4" /* LÊm³ƒ¬ÅöîRzCrAä */
- $"2CE3 DF2F 1496 97DE 6AD1 2FFF 7E52 D993" /* ,ãß/.–—ÞjÑ/ÿ~RÙ“ */
- $"8AF9 AAA3 B192 0991 BFAE 4829 001E 963B" /* Šùª£±’Æ‘¿®H)..–; */
- $"019C 8A5D 78E8 6A56 F78C B81A F4D0 6312" /* .œŠ]xèjV÷Œ¸.ôÐc. */
- $"C0C4 A9BF 7CA5 75D9 9C23 F3EA 4F39 B325" /* ÀÄ©¿|¥uÙœ#óêO9³% */
- $"F6DE 6EF4 7D48 A279 8EA9 5395 0FBC C63F" /* öÞnô}H¢yŽ©S•.¼Æ? */
- $"679F CE93 2206 ECA9 079C 2BB7 D094 6A7B" /* gŸÎ“".ì©.œ+·Ð”j{ */
- $"1077 277F 88A6 21AE 84C3 EDD4 38FC 36B2" /* .w'.ˆ¦!®„ÃíÔ8ü6² */
- $"1F86 8F00 8F56 8825 7713 9061 800A A4CD" /* .†.Vˆ%w.a€Â¤Í */
- $"E3D3 0F3C B0AC 0C87 E368 8544 F251 5C39" /* ãÓ.<°¬.‡ãh…DòQ\9 */
- $"7D90 1BEF 7805 D624 7380 0A19 E093 3058" /* }.ïx.Ö$s€Â.à“0X */
- $"1C90 467F 5C70 4932 3947 4A95 A450 36C8" /* .F.\pI29GJ•¤P6È */
- $"D4D5 CA85 9922 FA12 D0D8 96CA 9A2F 40A2" /* ÔÕÊ…™"ú.ÐØ–Êš/@¢ */
- $"F105 054F 8C56 C164 85B5 C4E6 3EAB D76A" /* ñ..OŒVÁd…µÄæ>«×j */
- $"A227 4F09 072C 4682 9B0F 995C 7551 94E7" /* ¢'OÆ.,F‚›.™\uQ”ç */
- $"419A 0098 0283 19E8 0489 687B 4F66 B74C" /* Aš.˜.ƒ.è.‰h{Of·L */
- $"7F59 C07A A552 B04D 628F E401 E55C A4ED" /* .YÀz¥R°Mbä.å\¤í */
- $"390F C34D 81BB 9F88 0C50 F50F 9FBD A377" /* 9.ÃM»Ÿˆ.Põ.Ÿ½£w */
- $"F538 3F9C E243 FF47 D346 87F2 444B C479" /* õ8?œâCÿGÓF‡òDKÄy */
- $"F6B3 1C76 5125 F487 0FAF 294A DA20 EC56" /* ö³.vQ%ô‡.¯)JÚ ìV */
- $"07AB DE07 14C2 1721 F3E0 D687 1F67 039D" /* .«Þ..Â.!óàÖ‡.g. */
- $"461F 0D82 9CAA B2D4 DFC6 6AA5 D31E 4D01" /* F..‚œª²ÔßÆj¥Ó.M. */
- $"5AC2 B2BD FD97 7D6E 00D1 7ADF 377C 15A7" /* Z²½ý—}n.Ñzß7|.§ */
- $"9681 C7B2 8168 D706 425B 35EF 7298 C053" /* –Dzh×.B[5ïr˜ÀS */
- $"E198 B5E2 B835 712B 1AD8 BA77 CF86 83A3" /* ᘵâ¸5q+.غwφƒ£ */
- $"B0B9 C5E6 F37A A3DE D93B 8EC8 132F A52A" /* °¹Åæóz£ÞÙ;ŽÈ./¥* */
- $"AB20 E166 F719 7130 6482 5BE2 605B D78E" /* « áf÷.q0d‚[â`[׎ */
- $"672D 7AE6 3906 DA75 0E3D 1962 8A60 9294" /* g-zæ9.Úu.=.bŠ`’” */
- $"1FC8 C0F3 216D 815D 4DDE 5DDE D8AB 3F9C" /* .ÈÀó!m]MÞ]ÞØ«?œ */
- $"7F9F 24B3 7BBF CCB9 2F80 19B6 70AE 1B3D" /* .Ÿ$³{¿Ì¹/€.¶p®.= */
- $"C71A 1F7C 81D2 639F 0D03 24EA D4B1 D351" /* Ç..|ÒcŸ..$êÔ±ÓQ */
- $"DD10 FBD5 EA3F 4957 A7ED 04C6 384D C10F" /* Ý.ûÕê?IW§í.Æ8MÁ. */
- $"8A55 0C03 694F 0D18 70D8 0AC3 33C0 17D1" /* ŠU..iO..pØÂÃ3À.Ñ */
- $"73BB E85F 5204 090F FDFE 8AC5 9AD6 22D5" /* s»è_R.Æ.ýþŠÅšÖ"Õ */
- $"CA31 A6DE EF44 D910 B34A 0E59 7866 536F" /* Ê1¦ÞïDÙ.³J.YxfSo */
- $"9B0B A341 3AB8 C06C C64F 3F86 8160 DFB9" /* ›.£A:¸ÀlÆO?†`ß¹ */
- $"A709 59D8 88C3 3316 9FFA F83F 5120 E40E" /* §ÆY؈Ã3.Ÿúø?Q ä. */
- $"4DEA C88F C418 37F6 4C0B 7606 9632 EEC5" /* MêÈÄ.7öL.v.–2îÅ */
- $"6380 FB25 A69F AAE2 0888 B722 008F 35CB" /* c€û%¦Ÿªâ.ˆ·".5Ë */
- $"F6A7 90BF D0DB 6367 A14B 5A86 EE98 FD18" /* ö§¿ÐÛcg¡KZ†î˜ý. */
- $"A629 1BAB 3BE2 920D E99D BEC2 88B4 F909" /* ¦).«;â’.é¾Âˆ´ùÆ */
- $"66B1 535D 3940 AF78 8200 0C46 142A EA2A" /* f±S]9@¯x‚..F.*ê* */
- $"A991 95E8 FD2B D30B 0E4A 76E2 A97B FAA7" /* ©‘•èý+Ó..Jvâ©{ú§ */
- $"97E2 9B30 54FA 5E97 962A 7E83 5711 A707" /* —â›0Tú^—–*~ƒW.§. */
- $"2A21 3729 2046 9C41 8282 A161 E5F6 AB24" /* *!7) FœA‚‚¡aåö«$ */
- $"3324 74CF 1AF6 C935 D884 0008 DC18 663C" /* 3$tÏ.öÉ5Ø„..Ü.f< */
- $"3A00 25E4 92D7 8F23 4C07 3C63 DB6E 4924" /* :.%ä’×#L.<cÛnI$ */
- $"7362 34C9 2F1D 105B 97E2 03BF 648F C21C" /* sb4É/..[—â.¿dÂ. */
- $"C6AC 3657 2C72 ADAA 2889 0623 6A5D ACEC" /* Ƭ6W,r­ª(‰.#j]¬ì */
- $"3210 738F 51F5 CC65 9EA9 7AD3 95CB B265" /* 2.sQõÌež©zӕ˲e */
- $"D54E 6E1D E2A7 2673 E6C2 C247 2FFD C10E" /* ÕNn.â§&sæÂÂG/ýÁ. */
- $"5FC5 C1E1 2511 5C8F 6063 92AB E4B9 8212" /* _ÅÁá%.\`c’«ä¹‚. */
- $"3643 6D53 2492 3E58 3E71 15E3 A3B7 AB2A" /* 6CmS$’>X>q.㣷«* */
- $"A998 FE5A 74DB 537A CE3D CD46 49B6 DB6D" /* ©˜þZtÛSzÎ=ÍFI¶Ûm */
- $"B6DB 6DB2 8EE9 1D6F 6480 8613 D8D2 7D8F" /* ¶Ûm²Žé.od€†.ØÒ} */
- $"5615 3EAB B25B 722D ECB8 ED12 70F2 BA06" /* V.>«²[r-ì¸í.pòº. */
- $"E5A2 45C1 547C F861 A7D5 8E1C 08BC 346B" /* å¢EÁT|øa§ÕŽ..¼4k */
- $"2730 C670 2FD8 F159 6ABE 2092 ED98 AC34" /* '0Æp/ØñYj¾ ’혬4 */
- $"B4CA 8565 90CF 0034 6E68 F777 9672 F29D" /* ´Ê…eÏ.4nh÷w–rò */
- $"4621 6E73 9C90 5C3D A8DB F5B0 CACF A63E" /* F!nsœ\=¨Ûõ°ÊϦ> */
- $"861E 8B9E F490 8E15 69BC A01D EF59 E898" /* †.‹žôŽ.i¼ .ïYè˜ */
- $"7040 B817 5AA9 BFB1 09A0 FE74 D2F7 BEA8" /* p@¸.Z©¿±Æ þtÒ÷¾¨ */
- $"A4F3 FEAC 38A4 409E B504 9CC9 EAA3 533B" /* ¤óþ¬8¤@žµ.œÉê£S; */
- $"153D F710 FC9E 2055 A395 C374 2AF9 E7C5" /* .=÷.üž U£•Ãt*ùçÅ */
- $"E1E8 7F74 3CDB D568 B606 A9D5 B7AE E207" /* áè.t<ÛÕh¶.©Õ·®â. */
- $"947E 2E65 1C27 336D 927A 4F86 5422 0E04" /* ”~.e.'3m’zO†T".. */
- $"42C7 668A 9403 EAB7 21A3 C9F1 18BC 5380" /* BÇfŠ”.ê·!£Éñ.¼S€ */
- $"BED7 07B5 F9B1 B798 8727 D54A 7A6E E493" /* ¾×.µù±·˜‡'ÕJznä“ */
- $"5271 F27D 7C35 DCEE D0BC CB31 C1FB 879F" /* Rqò}|5ÜîмË1Áû‡Ÿ */
- $"E074 9EB9 D7BE C9ED D2C8 BD00 C7FC D05B" /* àtž¹×¾ÉíÒȽ.ÇüÐ[ */
- $"2B2C 9647 A924 9F22 A06D 62B4 A946 77B7" /* +,–G©$Ÿ" mb´©Fw· */
- $"AD6D 60EE C841 997D A7E8 7AD2 AFA8 EEC4" /* ­m`îÈA™}§èzÒ¯¨îÄ */
- $"D61F FC06 FD7A E761 AA33 0F74 A08F 8E5B" /* Ö.ü.ýzçaª3.t Ž[ */
- $"B7C0 7C9A 1201 F0F5 6403 E4D0 60D8 92D9" /* ·À|š..ðõd.äÐ`Ø’Ù */
- $"84ED 064F 1B29 D7A7 1D77 F4B3 61D6 2651" /* „í.O.)ק.wô³aÖ&Q */
- $"329E 2CA5 53B4 956D 1061 3A3A A73B FC8E" /* 2ž,¥S´•m.a::§;üŽ */
- $"DD3C 60C9 F855 32FB 3C04 6287 50F7 6BB3" /* Ý<`ÉøU2û<.b‡P÷k³ */
- $"B84A 05A6 3145 A832 3BBC CA56 115B 9D7F" /* ¸J.¦1E¨2;¼ÊV.[. */
- $"8ADB 5660 429D 1FF6 4E6D 4899 EFDA 592F" /* ŠÛV`B.öNmH™ïÚY/ */
- $"19DC 9790 802A 1C17 2250 ADEC 0312 2C23" /* .Ü—€*.."P­ì..,# */
- $"223B 1EC8 482C 6E26 DD67 528F 7CDC 1841" /* ";.ÈH,n&ÝgR|Ü.A */
- $"DBCB CF9E 6D26 B564 4FD4 0AB5 DA0B ADE2" /* ÛËÏžm&µdOÔµÚ.­â */
- $"C129 D895 00FF 105B 0D0B F4DB 286A B347" /* Á)Ø•.ÿ.[..ôÛ(j³G */
- $"A261 30A9 0A9B 7A0D 585B 3991 3217 6FF7" /* ¢a0©Â›z.X[9‘2.o÷ */
- $"A368 D6A8 E862 161A 3584 613E 04D9 DBCB" /* £hÖ¨èb..5„a>.ÙÛË */
- $"4D96 66A3 B736 F802 D67A 309F 04E6 AFD8" /* M–f£·6ø.Öz0Ÿ.æ¯Ø */
- $"888E A8A5 4461 F1F0 1B6B 2DC4 0DFE C676" /* ˆŽ¨¥Dañð.k-Ä.þÆv */
- $"8D4E 3750 C3E6 C233 EFC5 368B 6113 5B53" /* N7PÃæÂ3ïÅ6‹a.[S */
- $"08E0 C259 1B88 AA0C 74B0 862E 1024 BB3F" /* .àÂY.ˆª.t°†..$»? */
- $"2816 B320 715C 5DFA 9FF0 CBC3 6A85 777A" /* (.³ q\]úŸðËÃj…wz */
- $"23CB F89B D813 6706 313E 2CF5 A163 0848" /* #Ëø›Ø.g.1>,õ¡c.H */
- $"94C9 3288 B556 53DD 2A45 2302 F28E 7ED1" /* ”É2ˆµVSÝ*E#.òŽ~Ñ */
- $"B5A0 67C8 53BB 4CE4 45D9 317F 92AB B13B" /* µ gÈS»LäEÙ1.’«±; */
- $"7246 F6DE 5348 49C9 42A1 CA62 64B0 209E" /* rFöÞSHIÉB¡Êbd° ž */
- $"43F2 DF7C 9BBC 097F C94A EA52 8D01 ADEF" /* Còß|›¼Æ.ÉJêR.­ï */
- $"5241 7C9B 2876 75F4 D748 AF9D 6FBB 3306" /* RA|›(vuô×H¯o»3. */
- $"0AD1 3953 6C99 5BB7 F1F5 1C1F BCE7 CA83" /* ÂÑ9Sl™[·ñõ..¼çʃ */
- $"08C1 6811 FBC5 AE18 343C C6F5 E515 F9CF" /* .Áh.ûÅ®.4<Æõå.ùÏ */
- $"FE48 C6E9 956E 6712 DDCA D62C 7F37 6DFE" /* þHÆé•ng.ÝÊÖ,.7mþ */
- $"2465 A8EE 1BAF E106 CA62 101F 0144 31DC" /* $e¨î.¯á.Êb...D1Ü */
- $"029E ED0F 9E47 F22E 0C17 0D31 E60B 1662" /* .ží.žGò....1æ..b */
- $"C1F5 5C90 7D5A 6D03 EAB6 C0C8 1653 E821" /* Áõ\}Zm.ê¶ÀÈ.Sè! */
- $"5860 ED0B C711 39E5 E5C8 268D 2246 E3FB" /* X`í.Ç.9ååÈ&"Fãû */
- $"68A4 3B12 A487 350D FE94 3722 65AC 949B" /* h¤;.¤‡5.þ”7"e¬”› */
- $"2526 7CD5 0E28 E093 CFE8 314C BE18 5B60" /* %&|Õ.(à“Ïè1L¾.[` */
- $"827E 154B 9609 2536 F890 A361 BA29 8211" /* ‚~.K–Æ%6ø£aº)‚. */
- $"AF42 BEC6 1BCB CE6D 2910 8083 C890 D7FF" /* ¯B¾Æ.ËÎm).€ƒÈ×ÿ */
- $"6F04 CEF4 F47C 0D92 00BD D90F 4095 0A48" /* o.Îôô|.’.½Ù.@•ÂH */
- $"4DC6 210C 351D 34A5 5FDA E576 1E1B 1684" /* MÆ!.5.4¥_Úåv...„ */
- $"F2A0 B30A 589C 1DBC 4831 E906 0D67 0CDD" /* ò ³ÂXœ.¼H1é..g.Ý */
- $"876B 994F 6D66 47DD AF40 7158 4385 738E" /* ‡k™OmfGݯ@qXC…sŽ */
- $"82F8 E637 9B5C 7389 0AA5 2A04 D105 5E88" /* ‚øæ7›\s‰Â¥*.Ñ.^ˆ */
- $"C2A2 2943 E125 6C2F 0AD1 1E5C AF1F CFF6" /* ¢)Cá%l/ÂÑ.\¯.Ïö */
- $"B39B C799 0F39 6151 6625 BB66 C3C3 418B" /* ³›Ç™.9aQf%»fÃÃA‹ */
- $"90A4 F6F7 BD30 7A04 88E6 0F8A 3F0B FF2C" /* ¤ö÷½0z.ˆæ.Š?.ÿ, */
- $"D18B 1D88 1442 EB54 A6FC D226 251A 015D" /* Ñ‹.ˆ.BëT¦üÒ&%..] */
- $"4DA8 32CA 371B 86EB 4E89 1415 9A41 6AD2" /* M¨2Ê7.†ëN‰..šAjÒ */
- $"1F0F 7656 41E5 B874 72E7 5F88 ABDA 28D7" /* ..vVAå¸trç_ˆ«Ú(× */
- $"37D5 EE40 567F F751 2591 01A3 03B9 EFCD" /* 7Õî@V.÷Q%‘.£.¹ïÍ */
- $"E0A8 8CC8 8C8E 0945 3036 453A 1787 59C4" /* ਌ȌŽÆE06E:.‡YÄ */
- $"B99C 02D2 D5F6 1B5E E34C 551E 8C43 9A20" /* ¹œ.ÒÕö.^ãLU.ŒCš */
- $"981D 0B44 C6D1 E6AA 2B92 5F33 8016 C4F1" /* ˜..DÆÑæª+’_3€.Äñ */
- $"7AA6 E605 4676 A533 1D38 6ADA 9BC6 2C13" /* z¦æ.Fv¥3.8jÚ›Æ,. */
- $"385A 3DCE 7E2E B9A1 81BB 27C6 AFF8 FF5D" /* 8Z=Î~.¹¡»'Ưøÿ] */
- $"A511 4C25 DC70 082C B597 3EC4 004C D4B8" /* ¥.L%Üp.,µ—>Ä.LÔ¸ */
- $"BE6A B79D EF70 2610 B57B FEFE 6ACC 9EEE" /* ¾j·ïp&.µ{þþjÌžî */
- $"B94A 73A8 4B30 C207 7391 789E C0FE 6992" /* ¹Js¨K0Â.s‘xžÀþi’ */
- $"AB13 E2AA FF53 4B22 A338 0EA3 B476 D732" /* «.âªÿSK"£8.£´v×2 */
- $"EDA3 2009 3422 B4AA 64DE 26C3 5894 D6DD" /* í£ Æ4"´ªdÞ&ÃX”ÖÝ */
- $"F7A9 5A3B 6F31 5D2C EC22 1FAC 928B 647F" /* ÷©Z;o1],ì".¬’‹d. */
- $"1600 A961 11C3 FD11 E594 81F9 E0AC 20D4" /* ..©a.Ãý.å”ùà¬ Ô */
- $"0DCA 9CE0 FF14 3BE3 3010 00E1 9DFE F0C8" /* .Êœàÿ.;ã0..áþðÈ */
- $"70E7 D3A5 A7F9 884E 6941 CBCB FEBE 0C27" /* pçÓ¥§ùˆNiAËËþ¾.' */
- $"B3F5 BAA4 3068 BFC1 DB20 1E5F 9E83 BF7D" /* ³õº¤0h¿ÁÛ ._žƒ¿} */
- $"8EA3 8FB0 F355 FF02 DED2 5CC8 2B4D 4DA5" /* Ž£°óUÿ.ÞÒ\È+MM¥ */
- $"8122 C96A CDAB B130 2D35 B73E 2EE9 0AA9" /* "ÉjÍ«±0-5·>.é© */
- $"7DB8 B81D 7B0A 776B DFF3 2B02 1F6A EF5B" /* }¸¸.{Âwkßó+..jï[ */
- $"E6A6 177F D8C0 1C3B A88C 2154 18F3 BFB3" /* æ¦..ØÀ.;¨Œ!T.ó¿³ */
- $"F7EF 1249 860B F87F 60D6 AE06 B5B2 7824" /* ÷ï.I†.ø.`Ö®.µ²x$ */
- $"E601 91D7 1436 80CF 054C 9691 1321 B299" /* æ.‘×.6€Ï.L–‘.!²™ */
- $"11F3 2BA3 51F6 447E 1BC0 28CB 666B 9BA0" /* .ó+£QöD~.À(Ëfk›  */
- $"425A E39B 066C 1B7C 340B 950A BDCC E05D" /* BZã›.l.|4.•Â½Ìà] */
- $"C8DC 568C BDC6 54E9 0AA2 2D89 6E22 37E4" /* ÈÜVŒ½ÆTé¢-‰n"7ä */
- $"3508 39CC EE8F 8EE6 F926 626B E33F 4A06" /* 5.9ÌîŽæù&bkã?J. */
- $"4CD1 AE16 9063 3119 5554 58CA BB53 4A73" /* LѮ.c1.UTXʻSJs */
- $"AA2B 2A71 B86B 3E95 BED6 D9D2 9D59 3E60" /* ª+*q¸k>•¾ÖÙÒY>` */
- $"C5D1 FA4C E6A7 880F 30D8 A679 6467 697E" /* ÅÑúL槈.0ئydgi~ */
- $"F327 EAA4 E0D1 01F9 9B74 AAA1 6CDD 7DA7" /* ó'ê¤àÑ.ù›tª¡lÝ}§ */
- $"D2AB C9CB 63D6 D3DF C778 C6ED 71A5 0571" /* Ò«ÉËcÖÓßÇxÆíq¥.q */
- $"C7E1 4EC7 E16C 43F0 75B1 3C9E 91EA AAAC" /* ÇáNÇálCðu±<ž‘ꪬ */
- $"9A2E A47E 8DF0 873E 2275 3F71 F986 DF3D" /* š.¤~ð‡>"u?qù†ß= */
- $"DBE5 1F4C 0D83 C3F5 F2D4 5A7C 0BFB E4FC" /* Ûå.L.ƒÃõòÔZ|.ûäü */
- $"C83E D8A4 FAF4 F589 09F2 4909 40AA 2AA8" /* È>ؤúôõ‰ÆòIÆ@ª*¨ */
- $"C190 BE4D D484 1408 6EAD 722F 6BA6 7502" /* Á¾MÔ„..n­r/k¦u. */
- $"A53F 1B9A BE86 841A FC60 53F3 8AE9 2E4C" /* ¥?.š¾†„.ü`SóŠé.L */
- $"4B8E 1D09 F47C 3BAA CFB7 80DE 6A41 F007" /* KŽ.Æô|;ªÏ·€ÞjAð. */
- $"80A3 413A C568 5C02 6166 E8AF 9B6C EF86" /* €£A:Åh\.af诛lï† */
- $"F178 273B A803 89E9 520A ACFC 0E98 6198" /* ñx';¨.‰éR¬ü.˜a˜ */
- $"6ECE D094 76D1 8AF8 1035 D0C8 B9E5 ECC9" /* nÎДvÑŠø.5ÐȹåìÉ */
- $"08E6 748A F28B B0E0 F9AB 71B4 7971 9626" /* .ætŠò‹°àù«q´yq–& */
- $"5397 5D5A 31CB 5F9E 7C98 8300 72B1 2C67" /* S—]Z1Ë_ž|˜ƒ.r±,g */
- $"A38D 0C02 C603 C0C2 2000 E528 0CAA 9472" /* £..Æ.À .å(.ª”r */
- $"3115 8C05 0EE6 3F33 3F6D B6DB 64C7 AAB2" /* 1.Œ..æ?3?m¶ÛdǪ² */
- $"94EA DD85 D3DF F14E FF3F D3A2 778B 3749" /* ”êÝ…ÓßñNÿ?Ó¢w‹7I */
- $"B31B 6DB6 C5B6 5311 C782 3FCF 2880 6695" /* ³.m¶Å¶S.Ç‚?Ï(€f• */
- $"085A 35C2 3938 420E 8705 50BD 51C3 BD21" /* .Z5Â98B.‡.P½Qý! */
- $"41B9 C3ED 3A76 367F 40F5 DA53 3618 DF7A" /* A¹Ãí:v6.@õÚS6.ßz */
- $"EE11 B2D6 D9AD 4351 7D8F BC5A 7217 9352" /* î.²ÖÙ­CQ}¼Zr.“R */
- $"D43F 54B9 F618 3E0E 5FF8 1599 CD00 5489" /* Ô?T¹ö.>._ø.™Í.T‰ */
- $"459D 1B65 0538 7A92 D8EC 6AD5 E756 776E" /* E.e.8z’ØìjÕçVwn */
- $"5B66 A07C 36D6 A4B0 2E00 21E0 ABFC 2AB8" /* [f |6Ö¤°..!à«ü*¸ */
- $"F387 5784 0DB9 1978 67FE DEFF 0CCC CCCC" /* ó‡W„.¹.xgþÞÿ.ÌÌÌ */
- $"CCCC CCCC CCCC CCD3 5F84 850A F245 C370" /* ÌÌÌÌÌÌÌÓ_„…ÂòEÃp */
- $"786E 76C5 56A5 8C9B FC7F 6869 3085 EB26" /* xnvÅV¥Œ›ü.hi0…ë& */
- $"6162 A234 8BF4 868D 0BA5 77FA 56D2 31FD" /* ab¢4‹ô†.¥wúVÒ1ý */
- $"7436 0147 944C 2AAE C8C1 DE46 2A3A 2449" /* t6.G”L*®ÈÁÞF*:$I */
- $"EAD0 8E9E FF0B 129F 7F9C 1436 A6BC 10E6" /* êÐŽžÿ..Ÿ.œ.6¦¼.æ */
- $"3116 7A98 5FF6 97E9 FC84 7136 FEA5 C122" /* 1.z˜_ö—éü„q6þ¥Á" */
- $"E58F 44D6 D7A4 0AD3 E9B4 7C91 B833 1F91" /* åDÖפÂÓé´|‘¸3.‘ */
- $"5F0F D8F7 8A80 6560 B332 081A C68D 0FF9" /* _.Ø÷Š€e`³2..Æ.ù */
- $"899F 2CC7 E1D6 FC7E 1DEB C3ED EA04 F55D" /* ‰Ÿ,ÇáÖü~.ëÃíê.õ] */
- $"017D B775 48A1 A844 EAB2 8E3A 5FF2 20AF" /* .}·uH¡¨D겎:_ò ¯ */
- $"6231 D1B0 D4D9 D308 999B 09F2 95B1 7071" /* b1Ñ°ÔÙÓ.™›Æò•±pq */
- $"F57C 1F1E 7960 4639 6A62 5BC6 9E5A D45D" /* õ|..y`F9jb[ÆžZÔ] */
- $"F339 9597 BF1B 62EB D128 B3D8 9BD3 52BF" /* ó9•—¿.bëÑ(³Ø›ÓR¿ */
- $"0703 43F9 E1C7 940E EA41 F4B1 75E4 891F" /* ..CùáÇ”.êAô±uä‰. */
- $"09A4 D439 7DFF 6AB7 EB4F 1253 A9C0 8BBE" /* ƤÔ9}ÿj·ëO.S©À‹¾ */
- $"40A0 3CE6 965D F886 A9EF 7E69 712D 41C2" /* @ <æ–]ø†©ï~iq-A */
- $"0062 6917 5D06 6548 9FD6 1470 4A0C 8545" /* .bi.].eHŸÖ.pJ.…E */
- $"8417 6C73 0C2D DF44 0E4A D5F9 7443 D629" /* „.ls.-ßD.JÕùtCÖ) */
- $"E62D DE53 CCFA EAEA E08A F0E1 9D37 9616" /* æ-ÞSÌúêêàŠðá7–. */
- $"C0DA 1FD4 6A42 6CE6 1D10 AB6A 911A 19D2" /* ÀÚ.ÔjBlæ..«j‘..Ò */
- $"47A0 4AC5 6A3C 12FF 0FE8 3AFB 7DFD 3D27" /* G JÅj<.ÿ.è:û}ý=' */
- $"42C6 E2BA 6DDE D1ED 21CE 1EA0 F444 055B" /* BÆâºmÞÑí!Î. ôD.[ */
- $"122A 41EE D8C1 144C B39C 0EEA 014E 7448" /* .*AîØÁ.L³œ.ê.NtH */
- $"0B72 7C2C 92B6 0CAC 3CB5 ADA7 8BF8 0C56" /* .r|,’¶.¬<µ­§‹ø.V */
- $"1DD5 B763 907F 6B60 8A85 ED4A F87D FBDC" /* .Õ·c.k`Š…íJø}ûÜ */
- $"391D 822B CBF5 7266 0E6B B2D4 32DE 606C" /* 9.‚+Ëõrf.k²Ô2Þ`l */
- $"014E 64BF F969 E3A5 C8E4 09EC B205 6391" /* .Nd¿ùiã¥ÈäÆì².c‘ */
- $"3081 96F5 9A80 0599 50D2 38FF 635B 9C35" /* 0–õš€.™PÒ8ÿc[œ5 */
- $"97CF A325 D94F B8E1 A794 EABC DA8A 7CC3" /* —Ï£%ÙO¸á§”ê¼ÚŠ|à */
- $"8713 2EBB 1EA6 69B0 9A72 A93D 874A 1F30" /* ‡..».¦i°šr©=‡J.0 */
- $"4C7B B341 B8CF F61E 7CEE 60CC E9B0 6D85" /* L{³A¸Ïö.|î`Ìé°m… */
- $"4F96 977D F85D F85A 08AF 46EF F259 FD70" /* O–—}ø]øZ.¯FïòYýp */
- $"E364 C54D 1F3D C951 B1DD 2CB4 8B94 9350" /* ãdÅM.=ÉQ±Ý,´‹”“P */
- $"8FFC CD4E D39E 2FF5 DC65 9DB7 2133 6E97" /* üÍNÓž/õÜe·!3n— */
- $"9705 2AA6 2625 534E B2A2 D775 FCFA 60E0" /* —.*¦&%SN²¢×uüú`à */
- $"4929 3681 2E72 5087 F3CD FB3A 6386 36A2" /* I)6.rP‡óÍû:c†6¢ */
- $"5E62 8705 57E4 8441 1986 1487 E88F C834" /* ^b‡.Wä„A.†.‡èÈ4 */
- $"C59D D57C CCA2 D56F 3889 44AC 0E4D 0E88" /* ÅÕ|Ì¢Õo8‰D¬.M.ˆ */
- $"2592 A50A F98D DF1D 17F2 78BD D4AB FDB4" /* %’¥Âùß..òx½Ô«ý´ */
- $"4249 FBDE 3E56 BE58 B587 88B4 8D75 299F" /* BIûÞ>V¾Xµ‡ˆ´u)Ÿ */
- $"4C92 6D9A 6B17 6153 9A65 4770 E0EC BBEF" /* L’mšk.aSšeGpàì»ï */
- $"2F91 8C35 8FFA 04AF 880C D9B6 204A D65E" /* /‘Œ5ú.¯ˆ.Ù¶ JÖ^ */
- $"68DD DBE7 63BC E1C5 CCDD E994 3796 10EF" /* hÝÛçc¼áÅÌÝé”7–.ï */
- $"354D C0E7 7A72 E57E EFAC 7C75 E4CE F47F" /* 5MÀçzrå~ï¬|uäÎô. */
- $"2E82 A8D0 6401 3CC4 1ACC 4513 1211 DCC9" /* .‚¨Ðd.<Ä.ÌE...ÜÉ */
- $"BD7A 47CA F093 83C7 38EB 866D 1ED5 AC6C" /* ½zGÊð“ƒÇ8ë†m.Õ¬l */
- $"FF01 C348 CFA1 2532 DAD5 2BDD 8CCC 71C1" /* ÿ.ÃHÏ¡%2ÚÕ+ÝŒÌqÁ */
- $"1208 75AA 308B 4796 A89E 0EAF AB67 422A" /* ..uª0‹G–¨ž.¯«gB* */
- $"AA43 8162 68BC 9878 8578 419C AB2E 9518" /* ªCbh¼˜x…xAœ«.•. */
- $"A9E0 4298 DB46 36D7 ADD0 DE21 DC41 AEA7" /* ©àB˜ÛF6×­ÐÞ!ÜA®§ */
- $"A05D 795D AB14 E247 6750 3EA8 0A31 5A06" /*  ]y]«.âGgP>¨Â1Z. */
- $"FAEC AD07 ECF7 C636 A068 22AA E179 7613" /* úì­.ì÷Æ6 h"ªáyv. */
- $"30F9 831C 0AFA 38C0 E20B 96A9 464E B57A" /* 0ùƒ.Âú8Àâ.–©FNµz */
- $"5AF3 D612 DC70 2A8D 1D09 C7C9 967F 7F7B" /* ZóÖ.Üp*.ÆÇÉ–..{ */
- $"F47F 4017 A722 9853 37C2 DE55 34CF 104E" /* ô.@.§"˜S7ÂÞU4Ï.N */
- $"9DD3 35DF DEE2 589C FAF1 07DE 1803 86B1" /* Ó5ßÞâXœúñ.Þ..†± */
- $"2DE6 6B46 FC45 F24E 8718 3B6E D557 8008" /* -ækFüEòN‡.;nÕW€. */
- $"FF3B 8EC2 28BD 6146 3EF6 A0FB 0BCA 37C1" /* ÿ;ŽÂ(½aF>ö û.Ê7Á */
- $"749B 49F2 F419 9EC5 DC0A A6DE 0CFC 1BD2" /* t›Iòô.žÅܦÞ.ü.Ò */
- $"AAF5 4920 1AB3 842A 1813 606E 97CD 0EC2" /* ªõI .³„*..`n—Í. */
- $"50D4 84CD F427 569F 776D 940A A6F7 68D7" /* PÔ„Íô'VŸwm”¦÷h× */
- $"2A18 4C6D 2056 D254 1226 7F3C 1ED0 7AB8" /* *.Lm VÒT.&.<.Ðz¸ */
- $"BEFE 2050 50E6 C5FB 173C 1857 FF7F 86D9" /* ¾þ PPæÅû.<.Wÿ.†Ù */
- $"6CE3 E235 1AFA CBB4 D2BE 4E64 9713 B880" /* lãâ5.úË´Ò¾Nd—.¸€ */
- $"0C41 2E14 401B D14F 5BA4 AD20 7060 C05E" /* .A..@.ÑO[¤­ p`À^ */
- $"2011 000E C557 2951 009C A584 6178 50E8" /* ...ÅW)Q.œ¥„axPè */
- $"6E0D 922F BFF7 EC41 A907 0D2B EF09 3CE0" /* n.’/¿÷ìA©..+ïÆ<à */
- $"6344 B3D6 742A 0448 042D 44C3 390B 089B" /* cD³Öt*.H.-DÃ9..› */
- $"B0FF 2877 1C62 BE1E AC48 09B0 4667 19BC" /* °ÿ(w.b¾.¬HÆ°Fg.¼ */
- $"319D 1FEA ABB5 1EE9 02D8 C845 A20C 2E3F" /* 1.ꫵ.é.ØÈE¢..? */
- $"7010 FA38 E2A0 1F01 2933 0557 19BD 9DCD" /* p.ú8â ..)3.W.½Í */
- $"5486 F044 5838 C953 CC32 2DF8 6A04 30ED" /* T†ðDX8ÉSÌ2-øj.0í */
- $"2C42 0A7D 1B38 7F94 4936 5908 39F1 424F" /* ,BÂ}.8.”I6Y.9ñBO */
- $"2BFF 7F46 F53E 11D3 DA1E 41B4 67AB 296E" /* +ÿ.Fõ>.ÓÚ.A´g«)n */
- $"0B59 6213 9E16 1568 8787 ED75 8822 A102" /* .Yb.ž..h‡‡íuˆ"¡. */
- $"DAAC D7D6 FA63 ED91 52D2 E98C 6EEB ABBB" /* Ú¬×Öúcí‘RÒéŒnë«» */
- $"5465 7C7C 0CEB 3016 0CC6 5793 D7FF 7FFB" /* Te||.ë0..ÆW“×ÿ.û */
- $"34E7 7BDE 794E 6D8C 392D 051A 478B 4AD7" /* 4ç{ÞyNmŒ9-..G‹J× */
- $"028C 3119 EDCA 833C 2F1B A23A 5C69 908F" /* .Œ1.íʃ</.¢:\i */
- $"6F17 C143 83FF 31A8 709D 7BFA B0E4 A884" /* o.ÁCƒÿ1¨p{ú°ä¨„ */
- $"E3DC 88CC DF54 C132 6671 A0D0 B4C3 7721" /* ã܈ÌßTÁ2fq Ð´Ãw! */
- $"B5F0 84FF 0FDA 1588 5865 1B6B 94E3 9B46" /* µð„ÿ.Ú.ˆXe.k”ã›F */
- $"5CA1 7767 09F4 3448 2242 114C 2705 2C38" /* \¡wgÆô4H"B.L'.,8 */
- $"4565 F286 ABC2 AFF5 809D 0C5B BB5E 009C" /* Eeò†«Â¯õ€.[»^.œ */
- $"FCBA BC4C 84FF 45EF F42B 3F8E DEE0 A531" /* üº¼L„ÿEïô+?ŽÞà¥1 */
- $"DBBB 2113 7C30 8BB7 76FF 7E55 E6BC 012B" /* Û»!.|0‹·vÿ~Uæ¼.+ */
- $"EBDE EF62 0981 DCE1 AC6E 5AD7 D8AD 0560" /* ëÞïbÆÜá¬nZ×Ø­.` */
- $"5B36 3A62 5B57 3E03 75AC 25FB B396 1086" /* [6:b[W>.u¬%û³–.† */
- $"5EF0 4C11 ACE0 90D2 6568 EB55 75AB FF24" /* ^ðL.¬àÒehëUu«ÿ$ */
- $"54B8 0E77 3110 5C67 3138 8369 5BEA 3458" /* T¸.w1.\g18ƒi[ê4X */
- $"7FFE 6000 9940 0044 18C6 1A34 14B6 9CD2" /* .þ`.™@.D.Æ.4.¶œÒ */
- $"C039 2A00 00CC 8F27 9EFE FF80 1CAA 8000" /* À9*..Ì'žþÿ€.ª€. */
- $"0000 0000 D9B1 C1D0 BFE1 D01D 2DD4 E3DF" /* ....Ù±ÁпáÐ.-Ôãß */
- $"949B 6DB6 DB6D B83D 6B98 82BC 446D 0CB3" /* ”›m¶Ûm¸=k˜‚¼Dm.³ */
- $"55A5 C140 D9E5 5E98 37AF 0E38 4474 B8DC" /* U¥Á@Ùå^˜7¯.8Dt¸Ü */
- $"FCFA B14E BD14 730B DAA0 4B18 1B4D 81E7" /* üú±N½.s.Ú K..Mç */
- $"B8A8 26E7 EFB0 8272 4619 2A00 0000 0000" /* ¸¨&çï°‚rF.*..... */
- $"0000 0000 0000 060D CD91 05BE 3A07 80DE" /* ........Í‘.¾:.€Þ */
- $"29D6 2680 7867 5359 9411 F430 48D9 A22D" /* )Ö&€xgSY”.ô0HÙ¢- */
- $"DF74 0855 C0C4 C5AA D3F4 FC40 5815 C5FC" /* ßt.UÀÄŪÓôü@X.Åü */
- $"B741 3001 FF7F FDC6 00B8 F1BA FEC9 B662" /* ·A0.ÿ.ýÆ.¸ñºþɶb */
- $"4973 2EE9 5029 E237 296D D4A4 04DE 4DB9" /* Is.éP)â7)mÔ¤.ÞM¹ */
- $"5305 FD42 9A82 6842 EF09 9DA2 201D C6EF" /* S.ýBš‚hBïÆ¢ .Æï */
- $"4078 4FC3 038C B201 A1C0 0791 7B09 CF18" /* @xOÃ.Œ².¡À.‘{ÆÏ. */
- $"D61B DABD 0409 372B F69D 3CF8 E2E1 31A1" /* Ö.Ú½.Æ7+ö<øâá1¡ */
- $"023B B0FD 60B3 3933 16F2 C716 9259 82F8" /* .;°ý`³93.òÇ.’Y‚ø */
- $"77BB 3A47 46D2 D998 7AA1 01E1 DF78 8000" /* w»:GFÒÙ˜z¡.áßx€. */
- $"0000 0001 D8FD 4FB2 C620 0000 005A CD78" /* ....ØýO²Æ ...ZÍx */
- $"B755 53CD E910 3B50 96A8 4000 0000 0003" /* ·USÍé.;P–¨@..... */
- $"FD6F 5DD1 31D8 A087 6BC5 09F3 E81E B49F" /* ýo]Ñ1Ø ‡kÅÆóè.´Ÿ */
- $"5A88 0DB9 2492 4924 9234 EE49 0E46 EE5B" /* Zˆ.¹$’I$’4îI.Fî[ */
- $"8D2A E866 7AD0 1F3C 936D 50EF 6EF5 FDE7" /* *èfzÐ.<“mPïnõýç */
- $"BFFE 6EFF 82AD 0EDF 556D B01D C573 CA68" /* ¿þnÿ‚­.ßUm°.ÅsÊh */
- $"985A F307 82C5 D933 4C26 B9EE EEF7 D4C6" /* ˜Zó.‚ÅÙ3L&¹îî÷ÔÆ */
- $"BFB5 4130 F610 4AFE 602E 3723 0C95 0000" /* ¿µA0ö.Jþ`.7#.•.. */
- $"0000 0000 0000 0000 0002 7F7E DE44 DDEB" /* ...........~ÞDÝë */
- $"B8B1 0AB8 BA80 7F79 D59C 851A 0244 B8D1" /* ¸±Â¸º€.yÕœ…..D¸Ñ */
- $"6B92 AB1A 4997 5556 C0C7 5935 05AD B380" /* k’«.I—UVÀÇY5.­³€ */
- $"318D A387 1E5F 1523 0170 B5DB D9FA 0E80" /* 1£‡._.#.pµÛÙú.€ */
- $"7342 6634 1E36 FB10 615A 1862 FF53 1545" /* sBf4.6û.aZ.bÿS.E */
- $"C795 B42C 8282 534C 3AFD D370 7621 820E" /* Ç•´,‚‚SL:ýÓpv!‚. */
- $"9EDA AF3A 476B 3537 E327 52DE 4A99 73D1" /* žÚ¯:Gk57ã'RÞJ™sÑ */
- $"0718 7C16 82D5 99A5 32DD 0E83 9C4F 60F8" /* ..|.‚Õ™¥2Ý.ƒœO`ø */
- $"0743 325D 2056 84FF 06BC C6BB 338C 64CF" /* .C2] V„ÿ.¼Æ»3ŒdÏ */
- $"B7B9 C4C7 9800 E4DA EE0A 6636 DEE8 B8F8" /* ·¹Äǘ.äÚîÂf6Þè¸ø */
- $"739E 1EBD 408C C620 9790 A337 E987 2E54" /* sž.½@ŒÆ —£7é‡.T */
- $"DD4A E501 C0BF 44E6 E8EF ACCF 028F 253C" /* ÝJå.À¿Dæèï¬Ï.%< */
- $"F466 FA92 BEE6 A066 F4B6 5B41 CA80 3567" /* ôfú’¾æ fô¶[AÊ€5g */
- $"A079 E31D CEE9 CD64 0AED 265D E591 B98C" /*  yã.ÎéÍdÂí&]呹Œ */
- $"DF22 C203 3C43 E1D8 5D64 CA99 E6C7 EF30" /* ß"Â.<CáØ]dÊ™æÇï0 */
- $"68AF F4C9 97D5 F961 48CF 954C 2832 33A3" /* h¯ôÉ—ÕùaHÏ•L(23£ */
- $"0088 1417 0D84 DDE1 23FA C81D 487D C9AB" /* .ˆ...„Ýá#úÈ.H}É« */
- $"F239 ABB4 24E0 6694 291C 885C 23CE F212" /* ò9«´$àf”).ˆ\#Îò. */
- $"29F4 5656 7DD1 182A 2C11 AAEF 7534 24EE" /* )ôVV}Ñ.*,.ªïu4$î */
- $"9886 347F 28AD 6952 0A82 E9A4 6AA9 9390" /* ˜†4.(­iR‚é¤j©“ */
- $"06A8 EF47 527A EDF2 894B 5234 A900 82B1" /* .¨ïGRzíò‰KR4©.‚± */
- $"724D 791B 676C BC97 B3A5 94F7 137E FE8D" /* rMy.gl¼—³¥”÷.~þ */
- $"50F5 C1EE 0C5B 1F3D CEF4 DD64 709C 095B" /* PõÁî.[.=ÎôÝdpœÆ[ */
- $"A51A B239 3EC3 C9BA 39EC DBE2 FB9A 3C6F" /* ¥.²9>Ãɺ9ìÛâûš<o */
- $"BBC4 DE3E C5AF 0043 DC2D AE64 C0A7 2039" /* »ÄÞ>ů.CÜ-®dÀ§ 9 */
- $"A6C9 6079 72D6 0BC7 C501 A3A4 5EF4 A060" /* ¦É`yrÖ.ÇÅ.£¤^ô ` */
- $"C46E FCB9 1958 AD83 1176 0776 81C2 13C2" /* Änü¹.X­ƒ.v.vÂ. */
- $"DF08 4A76 137F DC5C 4867 0493 EE96 8373" /* ß.Jv..Ü\Hg.“î–ƒs */
- $"4644 13A4 F789 39FF 813B D226 575A 5A18" /* FD.¤÷‰9ÿ;Ò&WZZ. */
- $"3AF5 4B88 2747 3D47 681F 9670 0069 DD02" /* :õKˆ'G=Gh.–p.iÝ. */
- $"4252 ADB0 D6FB F1F1 1432 C24B D920 7290" /* BR­°Öûññ.2ÂKÙ r */
- $"3709 3D60 15D9 0C49 23EC 77F8 F791 F132" /* 7Æ=`.Ù.I#ìwø÷‘ñ2 */
- $"046E 0D05 9AFA 210A 9992 29D9 7AA6 F18E" /* .n..šú!™’)Ùz¦ñŽ */
- $"E245 75E0 018F BCEB 8D1B C2D0 083E 985F" /* âEuà.¼ë.ÂÐ.>˜_ */
- $"B791 554D F5F5 AD71 E064 75E6 1F3A D463" /* ·‘UMõõ­qàduæ.:Ôc */
- $"9A59 0A43 3457 BD7C 44A7 5C5E 9D19 C5D8" /* šYÂC4W½|D§\^.ÅØ */
- $"5880 C2CC 5DF0 2964 C0FD ABA1 004B 008D" /* X€ÂÌ]ð)dÀý«¡.K. */
- $"5205 7F2E 0843 E484 2D37 9C34 2425 7AFF" /* R....Cä„-7œ4$%zÿ */
- $"7021 D907 B6E1 F5E5 02C3 F3DD 44C8 2252" /* p!Ù.¶áõå.ÃóÝDÈ"R */
- $"0649 3C1A 1A80 449A 64D1 1720 76D6 4987" /* .I<..€DšdÑ. vÖI‡ */
- $"B4B1 E749 E899 BF69 5B35 F925 2EE6 6CE6" /* ´±çI虿i[5ù%.ælæ */
- $"B4FD CEB3 54C0 7C9D 4380 F93B 5701 F274" /* ´ýγTÀ|C€ù;W.òt */
- $"C4F3 CC20 F972 1FD1 56B3 911D 2995 5FC9" /* ÄóÌ ùr.ÑV³‘.)•_É */
- $"1F35 BAE0 9AC7 3082 1372 C1D5 4B23 D79E" /* .5ºàšÇ0‚.rÁÕK#מ */
- $"EF63 A93F 8E74 26FB AC68 CDBE BD3E 9720" /* ïc©?Žt&û¬h;½>— */
- $"DF71 956D 5D26 559E 2795 2F1B F798 7821" /* ßq•m]&Už'•/.÷˜x! */
- $"F3CB 1E6F 2351 11BD 0EFF 19B2 40A2 1C7F" /* óË.o#Q.½.ÿ.²@¢.. */
- $"267D D302 F6AE 5410 1E96 40DC 386E CB7B" /* &}Ó.ö®T..–@Ü8nË{ */
- $"7EA3 5CF7 46BA 8758 D0EE 12B3 34DF 46FE" /* ~£\÷Fº‡XÐî.³4ßFþ */
- $"517B E0F8 7E28 83A5 E93A C06D 7C3F 254B" /* Q{àø~(ƒ¥é:Àm|?%K */
- $"53DF 91ED F6AB FD0A 53A0 5257 F9B8 E8B7" /* Sß‘íö«ýÂS RWù¸è· */
- $"5A14 6036 C6DA E3FE C29D 799F 8B43 46D6" /* Z.`6ÆÚãþÂyŸ‹CFÖ */
- $"94DF 1954 073C 7C30 40F4 A00D 93D4 AADF" /* ”ß.T.<|0@ô .“ﻧ */
- $"4839 EF36 F92A 3758 97CE 955A 3521 3CB5" /* H9ï6ù*7X—ΕZ5!<µ */
- $"8269 30A7 2A93 6A40 07BE DCC3 50B6 C86B" /* ‚i0§*“j@.¾ÜÃP¶Èk */
- $"CE9A AF28 3B80 4FE6 873C DB8E A29C 15DC" /* Κ¯(;€Oæ‡<ÛŽ¢œ.Ü */
- $"81A8 F841 4F77 6237 7267 55C4 1289 2DA1" /* ¨øAOwb7rgUÄ.‰-¡ */
- $"8392 424A 398F 9FA7 8DBE 2CC6 44E9 A005" /* ƒ’BJ9Ÿ§¾,ÆDé . */
- $"0E57 6638 ADDD 9F15 D32E 13A9 F752 67BA" /* .Wf8­ÝŸ.Ó..©÷Rgº */
- $"9F1D 753C 0023 2BC1 2C48 19AF FF28 66E6" /* Ÿ.u<.#+Á,H.¯ÿ(fæ */
- $"0A05 1D62 536F C372 7DEC 5069 B44D AFD4" /* Â..bSoÃr}ìPi´M¯Ô */
- $"BE3C 9C16 161E 95B4 89E7 B034 4524 E373" /* ¾<œ...•´‰ç°4E$ãs */
- $"D4A2 2F82 F1BB 8F20 7861 0F95 7CDF C184" /* Ô¢/‚ñ» xa.•|ßÁ„ */
- $"5B65 6015 001B F6BD 5D52 D4BC 3A42 FD56" /* [e`...ö½]RÔ¼:BýV */
- $"D48F 3358 7432 09BD FF19 625D 3A11 13DA" /* Ô3Xt2ƽÿ.b]:..Ú */
- $"F222 12E8 5A1B 12BF 9B3B A234 A367 8FB6" /* ò".èZ..¿›;¢4£g¶ */
- $"4BF2 EE99 DB11 5D13 7021 71B4 2280 A1BC" /* Kòî™Û.].p!q´"€¡¼ */
- $"2AEF ECB5 D7EC 047C 0860 9676 78B1 CA76" /* *ïìµ×ì.|.`–vx±Êv */
- $"9AFB C995 D4EB 900A AD98 6423 E572 B68C" /* šûÉ•Ôë­˜d#år¶Œ */
- $"A271 A30B D157 8E95 8250 29BB 0323 E26C" /* ¢q£.ÑWŽ•‚P)».#âl */
- $"9223 91C7 0CD4 F0B0 442E 1BD3 1473 C699" /* ’#‘Ç.Ôð°D..Ó.sÆ™ */
- $"2D1C 8791 C699 920E 72C0 0D3E F6E9 9E2B" /* -.‡‘Æ™’.rÀ.>öéž+ */
- $"60B6 A87F 6CBE 146C 1224 90FC BF7B C6A9" /* `¶¨.l¾.l.$ü¿{Æ© */
- $"090E 3EAD C89D 5065 414B 3A1C F271 9327" /* Æ.>­ÈPeAK:.òq“' */
- $"D490 CD2B FBB3 BEFF 768D 4601 635B A746" /* ÔÍ+û³¾ÿvF.c[§F */
- $"8A4B 0981 8B8F EA85 D255 2113 8792 CC76" /* ŠKÆ‹ê…ÒU!.‡’Ìv */
- $"DE84 B950 C5F4 A4C1 D4EF 7D52 CC74 CCEE" /* Þ„¹PÅô¤ÁÔï}RÌtÌî */
- $"B40E B94F 9467 15CA 1DE0 3557 BF09 D787" /* ´.¹O”g.Ê.à5W¿Æׇ */
- $"ED66 345A E153 B4DC EF7C 2952 3161 5A99" /* íf4ZáS´Üï|)R1aZ™ */
- $"A193 D5EB 40F5 1300 65FA 8DFD 621A AE94" /* ¡“Õë@õ..eúýb.®” */
- $"30CD 6D25 A0FC 942E 37AC 52C8 CEAD 2D1F" /* 0Ím% ü”.7¬RÈέ-. */
- $"87D5 D078 F173 F5AD 7A56 DD1B 10C3 F9BF" /* ‡ÕÐxñsõ­zVÝ..Ãù¿ */
- $"69C1 9E6B E021 A0C7 84BF D87A 8AA8 327C" /* iÁžkà! Ç„¿ØzŠ¨2| */
- $"7D48 0D97 E584 FF7F AE07 2001 BF6C 2691" /* }H.—å„ÿ.®. .¿l&‘ */
- $"3032 E118 8741 42AD 7709 3086 8488 F9D3" /* 02á.‡AB­wÆ0†„ˆùÓ */
- $"0353 D79E 2E21 8F21 46CC 005C DA8A 0229" /* .Sמ.!!FÌ.\ÚŠ.) */
- $"A56B A72A C69E FCF7 7558 5D72 0050 2BDE" /* ¥k§*Æžü÷uX]r.P+Þ */
- $"0F36 E4F0 C744 89FC 37F0 7ECA F488 FE8C" /* .6äðÇD‰ü7ð~ÊôˆþŒ */
- $"1B6B 0158 B34D 1EA6 9B1F 154E FF79 01D4" /* .k.X³M.¦›..Nÿy.Ô */
- $"725F D9CF D9BF CCFF 439D 8F5C A92D D20D" /* r_ÙÏÙ¿ÌÿC\©-Ò. */
- $"0613 88F8 5C1C B6BD 07B9 9078 151D 8353" /* ..ˆø\.¶½.¹x..ƒS */
- $"0E68 8495 D521 92D8 E92D CF9B 10E6 ABDC" /* .h„•Õ!’Øé-Ï›.æ«Ü */
- $"53D9 DFB2 F2AF F964 14E3 74D6 3D64 01E2" /* SÙß²ò¯ùd.ãtÖ=d.â */
- $"FAFB 2D0B D303 DCF7 7718 E6CF 30DB 3FAE" /* úû-.Ó.Ü÷w.æÏ0Û?® */
- $"2873 3339 54A3 1E48 04D2 FDF2 E863 6201" /* (s39T£.H.Òýòècb. */
- $"01D1 182C 4C2A D85D AE26 DE15 9796 494C" /* .Ñ.,L*Ø]®&Þ.—–IL */
- $"82EA B4C0 2D3C 3D3E 1732 2ACA AC27 B7DB" /* ‚ê´À-<=>.2*ʬ'·Û */
- $"5CED 6F9D 3EDB FF04 5E83 BE60 1636 AE2C" /* \ío>Ûÿ.^ƒ¾`.6®, */
- $"754D 2928 7128 ACFD 15E8 C1A0 30A5 1063" /* uM)(q(¬ý.èÁ 0¥.c */
- $"1E6F 10F7 A946 B9B4 D921 5DB3 113F 332E" /* .o.÷©F¹´Ù!]³.?3. */
- $"61B8 AB3D 2F87 E081 C9D9 32B7 1060 785A" /* a¸«=/‡àÉÙ2·.`xZ */
- $"EFDD F472 0283 E235 4D42 E903 A06B 51CB" /* ïÝôr.ƒâ5MBé. kQË */
- $"39DC A412 A492 918E 235E F57C E4CE 4E0F" /* 9ܤ.¤’‘Ž#^õ|äÎN. */
- $"6BE6 7036 FA8A 7B2C 21FE 60B1 6FCA 7654" /* kæp6úŠ{,!þ`±oÊvT */
- $"C9FD DCDF E497 B2A6 D6D5 87ED 9D3B 5B86" /* ÉýÜßä—²¦ÖÕ‡í;[† */
- $"DA51 6B5B AE3E 520B 1DB3 5A6B 2B4D A777" /* ÚQk[®>R..³Zk+M§w */
- $"4F13 A04C 7D4F 819B 1FEB 086D 5F34 6643" /* O. L}O›.ë.m_4fC */
- $"0208 693A D70C 55B2 7A07 BC27 3A41 B739" /* ..i:×.U²z.¼':A·9 */
- $"C1F5 7425 07D5 D74C 1F56 F680 F1C4 B0CB" /* Áõt%.Õ×L.Vö€ñÄ°Ë */
- $"F3E0 DE80 53FC 256D EFD0 6B64 028C EC70" /* óàÞ€Sü%mïÐkd.Œìp */
- $"4973 06D4 242C DAAA 8373 DFAC B0C9 14A1" /* Is.Ô$,Úªƒs߬°É.¡ */
- $"BFBC 0BB4 E250 919E 3D2B B388 3A89 FB02" /* ¿¼.´âP‘ž=+³ˆ:‰û. */
- $"9796 86E6 20F8 C26C 8120 349C 757A 6875" /* —–†æ øÂl 4œuzhu */
- $"F63E AE68 84C3 03A3 6F64 F9EE F892 2CF8" /* ö>®h„Ã.£odùîø’,ø */
- $"61C1 B13A E941 0D67 DA36 4C05 9565 DC85" /* aÁ±:éA.gÚ6L.•eÜ… */
- $"D7F8 6EB9 D903 D428 F59A 3EBF C73E 5E95" /* ×øn¹Ù.Ô(õš>¿Ç>^• */
- $"764D 15FB 98F2 BECE 0FC8 EA3C 4E51 E1DD" /* vM.û˜ò¾Î.Èê<NQáÝ */
- $"5253 CE7A 2D16 8527 AF8E 9A17 757A A42F" /* RSÎz-.…'¯Žš.uz¤/ */
- $"6CA9 6BB3 7787 D84F 8E20 EA1F FB2D 15E3" /* l©k³w‡ØOŽ ê.û-.ã */
- $"0D2C 45A8 8C80 7DA1 89DB 5F46 F3FB 2871" /* .,E¨Œ€}¡‰Û_Fóû(q */
- $"539E 8CCA 5C03 EF20 B6B5 4956 EB82 172C" /* SžŒÊ\.ï ¶µIVë‚., */
- $"AB28 0D6D 4DF9 1F61 6F8D 61FE E962 778D" /* «(.mMù.aoaþébw */
- $"0C8E EC55 3BDC EC81 C9D1 E7D5 A811 C69A" /* .ŽìU;ÜìÉÑçÕ¨.Æš */
- $"6186 BC2C 75B4 DD3D C207 1151 4C3B 4175" /* a†¼,u´Ý=Â..QL;Au */
- $"942E 2ACF D3C7 7122 9D89 31B3 0918 EDC0" /* ”.*ÏÓÇq"‰1³Æ.íÀ */
- $"9D45 75D8 DE61 5036 6D9F 3373 4827 7ADE" /* EuØÞaP6mŸ3sH'zÞ */
- $"1BD1 16E8 8905 37D4 D811 1077 B359 0FF6" /* .Ñ.è‰.7ÔØ..w³Y.ö */
- $"0460 F360 20A5 B532 3418 142A B432 C2E9" /* .`ó` ¥µ24..*´2Âé */
- $"A0D6 DB04 317D 28F3 C893 AAE3 19B1 5742" /*  ÖÛ.1}(óÈ“ªã.±WB */
- $"7BF6 615C 0EAC F35E 0CD4 B142 A289 5458" /* {öa\.¬ó^.Ô±B¢‰TX */
- $"D699 1584 46FF 7174 758F B1F8 F540 F427" /* Ö™.„Fÿqtu±øõ@ô' */
- $"A496 8795 E66B 3DDC FB80 D0B8 9411 7240" /* ¤–‡•æk=Üû€Ð¸”.r@ */
- $"0374 54DC B2CA C982 BD5E FD06 4B02 5E8D" /* .tTܲÊÉ‚½^ý.K.^ */
- $"A958 79AA 5BE6 B5A2 76C3 7C23 0D45 6768" /* ©Xyª[æµ¢vÃ|#.Egh */
- $"D726 8259 FD2E E5CE 9B70 0600 22E7 82A3" /* ×&‚Yý.åΛp.."ç‚£ */
- $"8E14 9626 C4EC EED9 E7D8 13C9 623F 3DEB" /* Ž.–&ÄìîÙçØ.Éb?=ë */
- $"357B E617 A43A C9D4 328A C30A FF45 71BA" /* 5{æ.¤:ÉÔ2ŠÃÂÿEqº */
- $"1F8B 3945 8E06 0CF0 4749 0840 6F5A EDDB" /* .‹9EŽ..ðGI.@oZíÛ */
- $"29AC E877 27BD 6C8C A131 8A1C 9228 0FC5" /* )¬èw'½lŒ¡1Š.’(.Å */
- $"A029 D1A1 324D EFCE EB3F 2B92 150D FB8C" /*  )Ñ¡2MïÎë?+’..ûŒ */
- $"5399 1ABD D375 08BF 8F3F E788 684D 3064" /* S™.½Óu.¿?çˆhM0d */
- $"70B4 A733 4AB6 239A DC03 724F C8B8 F1BB" /* p´§3J¶#šÜ.rOȸñ» */
- $"8F1F A795 FF18 8256 0050 FF74 EDF1 3D05" /* .§•ÿ.‚V.Pÿtíñ=. */
- $"6CB0 E566 9272 E493 C085 3D06 3116 4ECE" /* l°åf’rä“À…=.1.NÎ */
- $"402D 329F 4BBB 2598 A7CF BEE1 333D 9019" /* @-2ŸK»%˜§Ï¾á3=. */
- $"61BB 1A29 2616 E907 2CD6 F64C 456F 9881" /* a».)&.é.,ÖöLEo˜ */
- $"725B 5C38 A40D 60D3 6B4F FDF1 87D7 4786" /* r[\8¤.`ÓkOýñ‡×G† */
- $"29BF CAEB 223A 044D 0F61 FDE6 0A3E 7727" /* )¿Êë":.M.aýæÂ>w' */
- $"DDEE 0A95 231F 04AC B6EF D134 C09D 1540" /* Ýî•#..¬¶ïÑ4À.@ */
- $"0E94 57E2 8418 C208 1F26 7396 96A0 D08F" /* .”Wâ„.Â..&s–– Ð */
- $"0CC0 40C8 C596 39BA 0CAE A6ED F8E8 7D6B" /* .À@ÈÅ–9º.®¦íøè}k */
- $"A76C 391B 6113 555F 62E0 6E14 5D27 E7BC" /* §l9.a.U_bàn.]'ç¼ */
- $"EDB7 D038 DED2 7BEE FC9D 6211 241E 0795" /* í·Ð8ÞÒ{îüb.$..• */
- $"9CDE 1607 B4C7 828E 24D2 4E9F FCA0 36EA" /* œÞ..´Ç‚Ž$ÒNŸü 6ê */
- $"004C C960 1680 01CE 7FF6 A201 EDAB 1ADF" /* .LÉ`.€.Î.ö¢.í«.ß */
- $"80D8 4524 390C 23DD EA8E 062C 5DDB 3C57" /* €ØE$9.#ÝêŽ.,]Û<W */
- $"BAEC 18E5 1ECE 91D7 A40E 08ED 23EA 55B6" /* ºì.å.Αפ..í#êU¶ */
- $"AA2C F48A 7B0E 8CAE 90DD 5840 41FF 7F4C" /* ª,ôŠ{.Œ®ÝX@Aÿ.L */
- $"47AD E774 87C4 9AB1 9CAD E633 DECD 3E36" /* G­çt‡Äš±œ­æ3ÞÍ>6 */
- $"00C2 0E05 134F 4802 3846 3575 1902 676D" /* .Â...OH.8F5u..gm */
- $"1006 D8AE 0D5F 1934 78F6 0721 F3C4 1000" /* ..Ø®._.4xö.!óÄ.. */
- $"8991 FA85 45B5 37A9 5A0C 54EE 014B 297B" /* ‰‘ú…Eµ7©Z.Tî.K){ */
- $"52F2 5ADD 7422 C97B EAA9 D291 45A7 A44A" /* RòZÝt"É{ê©Ò‘E§¤J */
- $"40FE AE73 5086 C7D3 85FD D734 67F2 8909" /* @þ®sP†ÇÓ…ý×4gò‰Æ */
- $"506D 36D8 2361 990C 802F A59E B603 9C94" /* Pm6Ø#a™.€/¥ž¶.œ” */
- $"F7BD AED9 8518 8651 DFFE 3D0E E920 E874" /* ÷½®Ù….†Qßþ=.é èt */
- $"FEB0 EE3C 3242 C249 4704 EEA8 9EFA DC61" /* þ°î<2BÂIG.úÜa */
- $"49C6 929E 2A9D 51CD FE0A FF02 3DDB 01EC" /* IÆ’ž*QÍþÂÿ.=Û.ì */
- $"80E8 630A B0C8 C9FC 7693 C60B 07E8 5D2F" /* €èc°ÈÉüv“Æ..è]/ */
- $"B97A 9F04 444E C836 DD68 FF12 EC9C 7E4F" /* ¹zŸ.DNÈ6Ýhÿ.ìœ~O */
- $"3CE9 83A8 191A 1E61 05F8 90FF 67E8 011A" /* <部...a.øÿgè.. */
- $"71EA 3EE8 AFBD 6328 ED84 9807 788D F3BC" /* qê>诽c(턘.xó¼ */
- $"2FA0 A210 7FFF 1D02 2519 4EC7 2A80 7FD0" /* / ¢..ÿ..%.NÇ*€.Ð */
- $"2064 A8F4 CC78 5EC8 88AF F1AB 868B 9F8D" /* d¨ôÌx^Ȉ¯ñ«†‹Ÿ */
- $"883E 3FDA D188 FBB7 3AFC 0C72 E01A CEF3" /* ˆ>?Úшû·:ü.rà.Îó */
- $"21E1 1718 4FDB 9A43 3767 424A 639B DFFE" /* !á..OÛšC7gBJc›ßþ */
- $"CA5F 7BA9 8F82 3EA6 6D4E 6986 6945 80DE" /* Ê_{©‚>¦mNi†iE€Þ */
- $"8274 4927 166A 6062 DF1D 0A72 F23B FA5A" /* ‚tI'.j`bß.Ârò;úZ */
- $"4DE4 5D19 54FC 488B 5237 FF5F 7B81 62C5" /* Mä].TüH‹R7ÿ_{bÅ */
- $"F6B7 B580 3016 11B6 22CF 63B8 428A D39A" /* ö·µ€0..¶"Ïc¸BŠÓš */
- $"5AC3 80FF 7310 8386 FF54 F361 304F 3BB5" /* ZÀÿs.ƒ†ÿTóa0O;µ */
- $"A7EB 0419 7DFB 6E56 20A8 3670 9018 9CB3" /* §ë..}ûnV ¨6p.œ³ */
- $"4B35 7082 32A7 E917 9CF8 FF7F FF80 0A6C" /* K5p‚2§é.œøÿ.ÿ€Âl */
- $"A48C 447E 3ECF 411D 89E4 F923 373B DCBE" /* ¤ŒD~>ÏA.‰äù#7;ܾ */
- $"2CE8 6580 0F87 1A23 1D93 62AE 48EF DEB8" /* ,èe€.‡.#.“b®HïÞ¸ */
- $"5DE8 DB68 1CA3 8D4B D3FE A476 7B3D ACAA" /* ]èÛh.£KÓþ¤v{=¬ª */
- $"284F 83EB 428F A201 D122 CB1A CCB2 C1FE" /* (OƒëB¢.Ñ"Ë.̲Áþ */
- $"367F 60D3 155D 8C00 22D8 ED33 D56B 1DE2" /* 6.`Ó.]Œ."Øí3Õk.â */
- $"98B0 A4A9 E041 2BF1 AA58 E78D 47E5 929F" /* ˜°¤©àA+ñªXçGå’Ÿ */
- $"85DA 699E C45A 0064 B931 CF2B 4169 44F0" /* …ÚižÄZ.d¹1Ï+AiDð */
- $"4B4F 083B 3D7C B2B2 D87B 785E 91A8 C614" /* KO.;=|²²Ø{x^‘¨Æ. */
- $"6EE6 A63C C8A7 B9E3 839D E245 4128 3BF9" /* næ¦<ȧ¹ãƒâEA(;ù */
- $"98CD 0C23 72EB E3A9 D21F 1BC2 4E13 274B" /* ˜Í.#rëã©Ò..ÂN.'K */
- $"19C8 CB39 5E7A D218 FBDB 0C42 51A1 1203" /* .ÈË9^zÒ.ûÛ.BQ¡.. */
- $"C0EB CDC2 9249 E461 1DE4 3DB6 FDFE 1334" /* ÀëÍÂ’Iäa.ä=¶ýþ.4 */
- $"1952 8231 CD71 A170 C55B 1FD0 6706 57F0" /* .R‚1Íq¡pÅ[.Ðg.Wð */
- $"282D 09A2 0893 A5BA 0314 43DD 32AF 3478" /* (-Æ¢.“¥º..CÝ2¯4x */
- $"EF6C 15F0 55C9 6A47 ECFE 3F3F 4DB4 5ED8" /* ïl.ðUÉjGìþ??M´^Ø */
- $"EFF8 8CA5 71F9 6669 078C 550C 943A 7046" /* ïøŒ¥qùfi.ŒU.”:pF */
- $"C031 6CE2 4681 4177 2913 CFE7 D857 C62A" /* À1lâFAw).ÏçØWÆ* */
- $"4652 88E2 8830 DF42 9C3D 2D76 E710 A8F1" /* FRˆâˆ0ßBœ=-vç.¨ñ */
- $"3626 45F2 55CC 008C EAB8 B891 A5F3 1AD2" /* 6&EòUÌ.Œê¸¸‘¥ó.Ò */
- $"AB11 6C48 3F18 40C0 51F0 DB88 0BD1 168C" /* «.lH?.@ÀQðÛˆ.Ñ.Œ */
- $"2E54 2DA6 CC60 BB05 4700 2C4E 179B 271B" /* .T-¦Ì`».G.,N.›'. */
- $"688C 1EE9 4D9A C781 8108 296B FE4F 028A" /* hŒ.éMšÇ.)kþO.Š */
- $"63D6 6EDF 6FEB FC17 BDFE 7A70 B48E D94E" /* cÖnßoëü.½þzp´ŽÙN */
- $"D985 3384 1BD2 B4C9 5213 B0D1 041B 876C" /* Ù…3„.Ò´ÉR.°Ñ..‡l */
- $"131C 4A9C 947B A79C A466 9779 E7C9 D2E1" /* ..Jœ”{§œ¤f—yçÉÒá */
- $"4E9F 0509 30E0 1115 E5C7 CAED 197B 818A" /* NŸ.Æ0à..åÇÊí.{Š */
- $"324D 8F8E ED44 BF44 5340 D647 1776 B983" /* 2MŽíD¿DS@ÖG.v¹ƒ */
- $"6D8C 88B1 6976 F7EB AFDB 6638 CAD3 F275" /* mŒˆ±iv÷ë¯Ûf8ÊÓòu */
- $"D93A 6CD3 9D6E C617 3969 D8E5 3059 947B" /* Ù:lÓnÆ.9iØå0Y”{ */
- $"6AFA 0E9B A19C 24C9 E1DC 089D 3545 89E4" /* jú.›¡œ$ÉáÜ.5E‰ä */
- $"E860 FB54 068C B464 EE9B 66B7 F267 34CF" /* è`ûT.Œ´dî›f·òg4Ï */
- $"1276 C6B2 47E6 8284 300B D1A9 1409 0C93" /* .vƲGæ‚„0.Ñ©.Æ.“ */
- $"E36A 8095 409A 7352 FF7A 0F50 A5E2 E678" /* ãj€•@šsRÿz.P¥âæx */
- $"C195 0898 E51E EB15 8D7A E918 29A6 D5CE" /* Á•.˜å.ë.zé.)¦ÕÎ */
- $"4DBC 978B 2CAA 9BA7 8727 EA1C 1C7A 6CC2" /* M¼—‹,ª›§‡'ê..zl */
- $"D172 DDF5 4BD4 9C69 607B 609F AEC8 FD84" /* ÑrÝõKÔœi`{`Ÿ®Èý„ */
- $"1DDA A076 C7E1 A7B1 F86C BC7E 1720 EB83" /* .Ú vÇ᧱øl¼~. ëƒ */
- $"095B F1C8 7239 10FD 6A26 D10E 534B E257" /* Æ[ñÈr9.ýj&Ñ.SKâW */
- $"B691 5D92 6949 E7D8 7470 AA8C 421F F945" /* ¶‘]’iIçØtpªŒB.ùE */
- $"99F6 9492 B806 E264 47B0 4EF5 6206 734E" /* ™ö”’¸.âdG°Nõb.sN */
- $"944B 102F A688 23A4 EAB0 CCEA 0017 0156" /* ”K./¦ˆ#¤ê°Ìê...V */
- $"A8C9 2A3F FF49 4137 E23A 09D0 97BB 0E5F" /* ¨É*?ÿIA7â:ÆЗ»._ */
- $"E2A2 2247 4980 6A20 B443 3E0B 0465 B9EF" /* â¢"GI€j ´C>..e¹ï */
- $"C490 B954 3AEA ABB7 3D53 111D 8897 551C" /* ĹT:ê«·=S..ˆ—U. */
- $"B865 1EA2 33F2 AD50 D488 1D6D 9733 27F3" /* ¸e.¢3ò­PÔˆ.m—3'ó */
- $"78AC C946 FB3C 4D2F 6580 1B3A 3368 3D54" /* x¬ÉFû<M/e€.:3h=T */
- $"55DF 6B52 1A54 9010 C4D2 12C8 D497 9CDB" /* UßkR.T.ÄÒ.ÈÔ—œÛ */
- $"173A 0609 66F1 C6C0 FD02 47A0 B2E2 D2E6" /* .:.ÆfñÆÀý.G ²âÒæ */
- $"096E F870 0776 4898 2F2B 84CF BA83 D656" /* Ænøp.vH˜/+„ϺƒÖV */
- $"7F77 79FF 0F1D 2A6E 03C6 4D0F E3EF D23B" /* .wyÿ..*n.ÆM.ãïÒ; */
- $"6F82 5F72 6701 98DF 5A63 DA7B 0ABC 75E2" /* o‚_rg.˜ßZcÚ{¼uâ */
- $"382D 0D93 3C8C 5308 19EA EF8D 7922 CD36" /* 8-.“<ŒS..êïy"Í6 */
- $"ED21 EB4D 3D77 5A8A 1380 E238 22E5 84AA" /* í!ëM=wZŠ.€â8"優 */
- $"4488 7DCE 91A0 CB4B 67FA 74AF EA3D 1C8E" /* Dˆ}Α ËKgút¯ê=.Ž */
- $"9279 611D FD02 D08F D952 B05D 2C11 B545" /* ’ya.ý.ÐÙR°],.µE */
- $"5F17 FF5C 1E9C 6A77 DA2F A474 B20C F5A2" /* _.ÿ\.œjwÚ/¤t².õ¢ */
- $"B2D4 176F 97E4 CE9E B576 C3E0 0F3D ECB9" /* ²Ô.o—äΞµvÃà.=ì¹ */
- $"7B35 DEBB 5ABA 9738 36F8 524D 74D8 08FF" /* {5Þ»Zº—86øRMtØ.ÿ */
- $"29A7 9B08 5B43 7C17 FB53 234E 4806 B0C3" /* )§›.[C|.ûS#NH.°Ã */
- $"AF3A FF38 CCAF FEAA C60F D103 32AC 7D7F" /* ¯:ÿ8̯þªÆ.Ñ.2¬}. */
- $"D2B8 51C1 7B7D 56FD 7CFB D2B5 C55B 7C7D" /* Ò¸QÁ{}Vý|ûÒµÅ[|} */
- $"7D30 10C2 4181 3358 5DD6 4625 4FFC EA30" /* }0.ÂA3X]ÖF%Oüê0 */
- $"3402 194F 6D0B 53D8 3C64 54AE E8DA 7874" /* 4..Om.SØ<dT®èÚxt */
- $"7FF1 DE25 3147 0AF0 D5B6 7BF7 88DD 5199" /* .ñÞ%1GÂðÕ¶{÷ˆÝQ™ */
- $"611E 526D B6DB 6DB6 DB69 9C6E 7A40 821D" /* a.Rm¶Ûm¶Ûiœnz@‚. */
- $"4416 6952 04BB 9C0A F19B 2C62 E698 A4F5" /* D.iR.»œÂñ›,b昤õ */
- $"9B83 3C59 8217 0000 0034 8080 DB92 4924" /* ›ƒ<Y‚....4€€Û’I$ */
- $"9249 247D 32D0 9B20 73FF 7E44 A49A 44BB" /* ’I$}2Л sÿ~D¤šD» */
- $"EB45 3E31 A4A0 C0CC BBC0 B29E 7771 4FDE" /* ëE>1¤ ÀÌ»À²žwqOÞ */
- $"1679 23F1 DE12 5574 68E3 60A1 9C00 CBEC" /* .y#ñÞ.Uthã`¡œ.Ëì */
- $"9C44 9009 0000 08DE 28C3 2776 AAA2 829A" /* œDÆ...Þ(Ã'vª¢‚š */
- $"05E0 47E9 0001 48A9 672C 0775 EE58 F075" /* .àGé..H©g,.uîXðu */
- $"7458 B48A 5455 DB33 3524 BE73 1D7C E223" /* tX´ŠTUÛ35$¾s.|â# */
- $"4EC4 732C EC4B 128D 341C 790C 00A2 1309" /* NÄs,ìK.4.y..¢.Æ */
- $"2D0B 5EA7 B07B C82C 976B 68C2 642A F095" /* -.^§°{È,—khÂd*ð• */
- $"A1C4 010E C94E D8A9 34BB FD3E 2B2F 92EC" /* ¡Ä..ÉNØ©4»ý>+/’ì */
- $"30E1 A7B3 040B C920 3FFF 7FA1 317B 90F7" /* 0᧳..É ?ÿ.¡1{÷ */
- $"C744 40B8 8325 4036 82FB 0C6C D800 19C4" /* ÇD@¸ƒ%@6‚û.lØ..Ä */
- $"2631 C4B8 3160 8649 2492 4924 9248 A747" /* &1ĸ1`†I$’I$’H§G */
- $"3D41 A17D 23A6 9AC7 9000 0000 0000 0000" /* =A¡}#¦šÇ....... */
- $"0000 0019 1A70 8823 BB21 7C62 4556 F257" /* .....pˆ#»!|bEVòW */
- $"62C0 CF0B 72EE F37E 64EC 43C2 AE04 9F58" /* bÀÏ.rîó~dìC®.ŸX */
- $"94DC E128 91EC BAA2 DADD 57A7 D5F7 1972" /* ”Üá(‘캢ÚÝW§Õ÷.r */
- $"7543 9A9A 0DB3 C3FD 42E0 19A3 8F45 7FDF" /* uCšš.³ÃýBà.£E.ß */
- $"CEB1 A7E5 8A09 5B4A F9E6 294B C5DC 80C9" /* α§åŠÆ[Jùæ)KÅÜ€É */
- $"9AEE 0729 374F 04FD 79D6 7170 D940 14F0" /* šî.)7O.ýyÖqpÙ@.ð */
- $"830F 0B71 50E7 3C76 97AF 0F71 A32D DC5A" /* ƒ..qPç<v—¯.q£-ÜZ */
- $"28A9 FE90 6CC0 9484 30D1 FCCD 4991 0758" /* (©þlÀ”„0ÑüÍI‘.X */
- $"BE36 B1DE 3A2E B6F8 2756 C568 2A7F D038" /* ¾6±Þ:.¶ø'VÅh*.Ð8 */
- $"2397 6E8F 32E0 C1AC 3736 32A3 C18E 13C4" /* #—n2àÁ¬762£ÁŽ.Ä */
- $"D298 8703 F9AF E24B A630 0627 6E63 ED70" /* Ò˜‡.ù¯âK¦0.'ncíp */
- $"0662 A833 6515 7225 C79D 8C1F 7410 45BF" /* .b¨3e.r%ÇŒ.t.E¿ */
- $"5019 F088 7C6C 43FC AE88 B794 5847 505F" /* P.ðˆ|lCü®ˆ·”XGP_ */
- $"2B73 6E58 E20E 18A2 01B4 DF7F F5BD D4BC" /* +snXâ..¢.´ß.õ½Ô¼ */
- $"B259 706B 754E 9740 BBF2 54FC FCB8 B293" /* ²YpkuN—@»òTüü¸²“ */
- $"4CEA 3670 D04B 8C42 B7C2 314D 1F53 956B" /* Lê6pÐKŒB·Â1M.S•k */
- $"CB14 9D05 8288 E7F0 D4FF 70AE EFB7 A10B" /* Ë..‚ˆçðÔÿp®ï·¡. */
- $"EDDE 3CFE 1B9D 7DBA 7B7D BD13 DF6F 45B8" /* íÞ<þ.}º{}½.ßoE¸ */
- $"FE1A 077D B444 FAB6 46FB 75FC E8AB DECC" /* þ..}´Dú¶Fûuüè«ÞÌ */
- $"AF0D 6C8A C695 8734 8A7A 5A21 F65D 05F6" /* ¯.lŠÆ•‡4ŠzZ!ö].ö */
- $"A417 27AC 998E 3646 07A8 0055 19DC B524" /* ¤.'¬™Ž6F.¨.U.ܵ$ */
- $"D2F2 842C DF9F BECA C26B C9C9 D0FD CA3B" /* Òò„,ߟ¾ÊÂkÉÉÐýÊ; */
- $"DB1B 3F81 F6A7 4465 001E 5552 4D0D 3BF3" /* Û.?ö§De..URM.;ó */
- $"0140 A2E9 7D63 8456 F9C7 665D F7FC 2DBF" /* .@¢é}c„VùÇf]÷ü-¿ */
- $"1B41 0667 7939 1B16 4997 5584 3CFE 81B9" /* .A.gy9..I—U„<þ¹ */
- $"C4A8 B346 EC6D E726 2560 5CB8 8B84 7699" /* Ĩ³Fìmç&%`\¸‹„v™ */
- $"3999 2CA0 91D9 A05A C96C 660C 267B 74A0" /* 9™, ‘Ù ZÉlf.&{t  */
- $"B935 73EB D464 D860 2694 7584 A4D4 DC52" /* ¹5sëÔdØ`&”u„¤ÔÜR */
- $"D136 D49A 1BEA 53F5 AE2F C19E 44E9 BA0A" /* Ñ6Ôš.êSõ®/ÁžDéºÂ */
- $"5D83 6587 7792 3DCB 449A B33E 4632 A395" /* ]ƒe‡w’=ËDš³>F2£• */
- $"57A3 0EC0 B3A3 969D 9DF0 6ACC 859F FF7F" /* W£.À³£–ðjÌ…Ÿÿ. */
- $"FF27 DAA0 AF8E 216C E5D8 874A 530F 555E" /* ÿ'Ú ¯Ž!lå؇JS.U^ */
- $"AF3F E231 5BAF F7B6 8E73 5742 2717 4031" /* ¯?â1[¯÷¶ŽsWB'.@1 */
- $"175D 5FDA F402 B756 AEAE 7E7E BFEE CE68" /* .]_Úô.·V®®~~¿îÎh */
- $"7878 870D 01C2 C2A4 61D5 64E3 E195 B914" /* xx‡..¤aÕdãᕹ. */
- $"A45F FF52 DC14 F5E9 E037 65E3 5477 62A5" /* ¤_ÿRÜ.õéà7eãTwb¥ */
- $"3EEC CA32 6558 5965 8B6E 3F13 9DB2 1361" /* >ìÊ2eXYe‹n?.².a */
- $"8426 9FD7 B329 4E75 FF1D 9B78 9735 4B1B" /* „&Ÿ×³)Nuÿ.›x—5K. */
- $"D80E 1781 192F 6777 8F94 F6A2 5016 726D" /* Ø.../gw”ö¢P.rm */
- $"1E0D D2CB 6F87 B3C6 09A2 1FE3 915E 8943" /* ..ÒËo‡³ÆÆ¢.ã‘^‰C */
- $"FE6C 6743 4733 D5BC A9DD 5338 C9E1 AF50" /* þlgCG3Õ¼©ÝS8Éá¯P */
- $"3634 C26C 0C1F 94E7 50B2 4310 DD62 4F09" /* 64Âl..”çP²C.ÝbOÆ */
- $"ABCD 7821 8B7B 7B87 2EEA 25A1 9D3C 55CC" /* «Íx!‹{{‡.ê%¡<UÌ */
- $"0644 1B14 3456 2E32 C013 815C 66C7 0526" /* .D..4V.2À.\fÇ.& */
- $"E24D CE15 B8FB 5D8B 0506 E30A 1D6A E2ED" /* âMÎ.¸û]‹..ãÂ.jâí */
- $"6145 D124 0EC9 1FAB 4E50 06C2 9DA5 8F6C" /* aEÑ$.É.«NP.Â¥l */
- $"C072 D11E BFEE DFE6 F6C7 12F4 E89C 35B7" /* ÀrÑ.¿îßæöÇ.ôèœ5· */
- $"097E 2E25 393F CEA3 03C6 D3C7 DED5 3882" /* Æ~.%9?Σ.ÆÓÇÞÕ8‚ */
- $"ED26 A3FD 9130 95B5 F3FA D31A 691F 8E09" /* í&£ý‘0•µóúÓ.i.ŽÆ */
- $"BFA8 7D7B 85BD B179 5C20 2855 1268 F9AF" /* ¿¨}{…½±y\ (U.hù¯ */
- $"553D 939E 6FC6 C67E 4611 F88C BBD4 773C" /* U=“žoÆÆ~F.øŒ»Ôw< */
- $"5F16 D598 D5C5 E649 B66E FD8D A2D7 9807" /* _.Õ˜ÕÅæI¶ný¢×˜. */
- $"EDA2 4621 2CF5 DDE3 C078 6455 1C29 3A07" /* í¢F!,õÝãÀxdU.):. */
- $"E992 C5DE 8D33 041B 83C6 56F6 7C95 168E" /* é’ÅÞ3..ƒÆVö|•.Ž */
- $"6127 40D2 DE11 CFF2 3379 DC22 20E3 5E1B" /* a'@ÒÞ.Ïò3yÜ" ã^. */
- $"DE83 DBB5 5B8A 8572 3DF2 2890 DC56 BE6E" /* ÞƒÛµ[Š…r=ò(ÜV¾n */
- $"D15F 9396 ECD4 725F 2E18 7616 394A 64C3" /* Ñ_“–ìÔr_..v.9Jdà */
- $"FDAA E6F2 3D6D 46BC B270 5B8F ACB4 9CAE" /* ýªæò=mF¼²p[¬´œ® */
- $"0D0D 3F29 6A02 1E92 347A E406 A52D 111A" /* ..?)j..’4zä.¥-.. */
- $"2E79 0340 1D82 C861 0C40 1963 3397 A4FD" /* .y.@.‚Èa.@.c3—¤ý */
- $"A998 0B63 E30A 7AA3 A5BC 8A8E 9CD0 4795" /* ©˜.cãÂz£¥¼ŠŽœÐG• */
- $"7538 7FB2 EC9A 952C CE29 C80F 369C 4E8D" /* u8.²ìš•,Î)È.6œN */
- $"8000 1C55 D5F3 E2AD 812E 4FAA AC2C D9BB" /* €..UÕóâ­.Oª¬,Ù» */
- $"F4CD 5568 5643 826F 3A38 91BD 6F70 92D3" /* ôÍUhVC‚o:8‘½op’Ó */
- $"23EC DB91 0FC4 C3BB 7542 023B 85F0 36C3" /* #ìÛ‘.ÄûuB.;…ð6à */
- $"8BF6 F6F8 4E77 EEE5 851F 219A CF99 7D9E" /* ‹ööøNwîå….!šÏ™}ž */
- $"856D A687 BC63 8E39 0407 B007 D184 10BD" /* …m¦‡¼cŽ9..°.Ñ„.½ */
- $"D9EF ACB1 B75A 46FA F95E 42DF 377B E2F7" /* Ùבּ·ZFúù^Bß7{â÷ */
- $"BEF2 357A 861C F486 B3F7 57E1 D39B 095B" /* ¾ò5z†.ô†³÷WáÓ›Æ[ */
- $"40C0 925C 0CA1 7885 CFEA 48B7 33E9 E8DE" /* @À’\.¡x…ÏêH·3éèÞ */
- $"D178 1E15 91D1 F6C5 BC87 CB7E CCC6 DEDE" /* Ñx..‘Ñöż‡Ë~ÌÆÞÞ */
- $"B017 A4C1 0B0F DD17 660E CB97 C098 C773" /* °.¤Á..Ý.f.Ë—À˜Çs */
- $"8A0A F4DB 59BD A218 055E 5348 05D8 B304" /* ŠÂôÛY½¢..^SH.س. */
- $"9F23 E1B1 0754 6DA2 FF33 34CB 2B12 7114" /* Ÿ#á±.Tm¢ÿ34Ë+.q. */
- $"62D2 4CA8 8091 CD34 8467 2752 B77A AA5B" /* bÒL¨€‘Í4„g'R·zª[ */
- $"15FC 2E56 7A29 9351 B6A4 AEE5 B56D 354D" /* .ü.Vz)“Q¶¤®åµm5M */
- $"3ED2 FA71 25E9 F887 B187 BADB B11B 2E01" /* >Òúq%éø‡±‡ºÛ±... */
- $"93B3 4206 45ED 7238 3F80 1441 50CA CCBA" /* “³B.Eír8?€.APÊ̺ */
- $"EF59 3BC5 4236 2ABF 9150 7335 49C5 0216" /* ïY;ÅB6*¿‘Ps5IÅ.. */
- $"F97B D5A5 1EF5 A69D 8B34 C25B 73E1 DA52" /* ù{Õ¥.õ¦‹4Â[sáÚR */
- $"79E5 9EB1 9CB1 0952 B3F5 E221 D426 4759" /* yåž±œ±ÆR³õâ!Ô&GY */
- $"D5CF 2D18 CC2A 270A 859D F10C 8108 52FF" /* ÕÏ-.Ì*'Â…ñ..Rÿ */
- $"2A7D D39E EFFD 568C 2DB3 7BD5 62D0 2403" /* *}ÓžïýVŒ-³{ÕbÐ$. */
- $"69D1 A4B6 2D24 E485 973D F6A5 E6DC 1DB5" /* iѤ¶-$ä…—=ö¥æÜ.µ */
- $"BF0B E185 5592 E3A0 6046 E050 5151 9546" /* ¿.á…U’ã `FàPQQ•F */
- $"17F7 0CF6 222F 17E0 40E5 3EF5 74EE BAB6" /* .÷.ö"/.à@å>õt */
- $"55BD 76C1 DD80 39C8 BAE0 37B8 398A B370" /* U½vÁÝ€9Ⱥà7¸9Š³p */
- $"D400 0C29 5DC9 94FF 069B 36E2 CD79 195F" /* Ô..)]É”ÿ.›6âÍy._ */
- $"5B9B 1237 1F18 C560 C901 F9A4 184B 7570" /* [›.7..Å`É.ù¤.Kup */
- $"433E 75BE 0297 C641 7D9B 7092 8D64 96F5" /* C>u¾.—ÆA}›p’d–õ */
- $"D70C 9B66 71D3 09B1 F635 0FC3 0B49 7D6E" /* ×.›fqÓƱö5.Ã.I}n */
- $"660C 8E1D 0257 672B 97EE C2A5 7B84 729E" /* f.Ž..Wg+—îÂ¥{„rž */
- $"6516 585E 354F 2E22 88A7 A515 B945 3745" /* e.X^5O."ˆ§¥.¹E7E */
- $"F6A5 5CB2 E212 10AD AB6F 07F5 FDA3 09EB" /* ö¥\²â..­«o.õý£Æë */
- $"A053 313B 9A8E 757D E132 D483 DC78 0882" /*  S1;šŽu}á2ÔƒÜx.‚ */
- $"A63C 95E0 036C 4626 F66B 5F6C 39A1 9401" /* ¦<•à.lF&ök_l9¡”. */
- $"7276 4DCE 4487 7D8C 12A3 B713 9139 AC0A" /* rvMÎD‡}Œ.£·.‘9¬Â */
- $"18AD 4DFD 2A3D 69E7 E76E 593C 8DAB FD56" /* .­Mý*=iççnY<«ýV */
- $"F959 BA6B FBA3 2853 D610 4DB0 7A30 3A09" /* ùYºkû£(SÖ.M°z0:Æ */
- $"916B DFF7 B3B4 F8D3 9619 0FD9 8FBC FC6B" /* ‘kß÷³´øÓ–..Ù¼ük */
- $"D73D ABD2 4C41 6AD0 6584 AF19 3074 AF6E" /* ×=«ÒLAjÐe„¯.0t¯n */
- $"369C BEB1 76D5 D311 6172 F157 D522 DDED" /* 6œ¾±vÕÓ.arñWÕ"Ýí */
- $"D4ED 0230 0BB5 E881 0E6B 9C4F 111F 4F6E" /* Ôí.0.µè.kœO..On */
- $"7CAD 4745 7BBF DA70 A9C4 051E FDEA 206C" /* |­GE{¿Úp©Ä..ýê l */
- $"9983 0E2D 4A4A A4DE 82E9 DAAF 5748 37AE" /* ™ƒ.-JJ¤Þ‚éÚ¯WH7® */
- $"4046 DCCB 0D1A 80DA 1804 20E2 F7CF AD69" /* @FÜË..€Ú.. â÷Ï­i */
- $"F9D8 5106 D02D 16E9 4437 9560 B618 1126" /* ùØQ.Ð-.éD7•`¶..& */
- $"95A2 4B23 89C4 78EE 898E D80C 8E49 5201" /* •¢K#‰ÄxØ.ŽIR. */
- $"2095 ABAF 9CA5 0F8E CB22 00D4 4289 59B3" /* •«¯œ¥.ŽË".ÔB‰Y³ */
- $"1835 1395 8AE5 3A88 7185 E7DD 57F3 4CE4" /* .5.•Šå:ˆq…çÝWóLä */
- $"1465 C878 6B72 7146 2AF1 F053 5B31 7697" /* .eÈxkrqF*ñðS[1v— */
- $"7300 A777 3919 099E BD1C 79C3 24C4 A355" /* s.§w9.Æž½.yÃ$Ä£U */
- $"0C88 C727 1831 D498 E513 47A5 F25F DDBE" /* .ˆÇ'.1Ô˜å.G¥ò_ݾ */
- $"46E7 40B5 EBCC 080F 6915 3FDF EDB9 A9B1" /* Fç@µëÌ..i.?ßí¹©± */
- $"39ED D794 60E1 A5A2 0EEC 7A09 46BF 201E" /* 9í×”`ᥢ.ìzÆF¿ . */
- $"311F EEEE 88EF C6C1 C10D E238 50C9 7F01" /* 1.îîˆïÆÁÁ.â8PÉ.. */
- $"DFF1 17BA D8F4 0017 47E7 75F2 4D82 679E" /* ßñ.ºØô..GçuòM‚gž */
- $"6867 60A4 6222 77B9 319B 186D FCB3 168A" /* hg`¤b"w¹1›.mü³.Š */
- $"EAF3 C227 1082 D7ED 2C70 E619 8676 0186" /* êóÂ'.‚×í,pæ.†v.† */
- $"8C23 5DE5 D4A0 61CB CDE4 AED5 E008 6F3C" /* Œ#]åÔ aËÍä®Õà.o< */
- $"D894 AC14 6FEC 5D4C C2FF 3A6C 512F E475" /* Ø”¬.oì]LÂÿ:lQ/äu */
- $"FCB8 DFA4 EB46 2DF4 E133 5858 364B 54E1" /* ü¸ß¤ëF-ôá3XX6KTá */
- $"A6E1 5D0C 157E D987 DF95 B1FB 3723 4F2F" /* ¦á]..~هߕ±û7#O/ */
- $"C9BF C6D4 D979 412E D0EB B285 8DFF 7CAC" /* É¿ÆÔÙyA.Ðë²…ÿ|¬ */
- $"F1BF 1825 8B89 9992 3848 C666 4184 4906" /* ñ¿.%‹‰™’8HÆfA„I. */
- $"0D61 6B58 9355 A5D9 C940 B6F2 6918 82E1" /* .akX“U¥ÙÉ@¶òi.‚á */
- $"FF7D 4F5F FE94 5208 650B B780 0D2B DD4F" /* ÿ}O_þ”R.e.·€.+ÝO */
- $"5874 3627 2353 6328 06B9 908C 6C95 D898" /* Xt6'#Sc(.¹Œl•Ø˜ */
- $"8C24 1D0F 641B 7763 CFBE E88A BB05 8639" /* Œ$..d.wcϾ芻.†9 */
- $"D91C 4A38 3A3F 75C6 61BD BFED CA10 2A73" /* Ù.J8:?uÆa½¿íÊ.*s */
- $"E3C5 E85C BF5B 0346 2105 4286 300D D812" /* ãÅè\¿[.F!.B†0.Ø. */
- $"8BE4 DAE4 292B A765 338E 7E42 50F1 8046" /* ‹äÚä)+§e3Ž~BPñ€F */
- $"3FDC 1A85 4616 61E5 7321 18D9 5AB9 8903" /* ?Ü.…F.aås!.ÙZ¹‰. */
- $"90BD 6F89 E7D0 35D1 0AA3 BBAE 3CF8 A7B7" /* ½o‰çÐ5Ñ£»®<ø§· */
- $"73C8 8B94 B409 16EC 60A6 E819 BCA7 BA66" /* sÈ‹”´Æ.ì`¦è.¼§ºf */
- $"2245 524C 718C 635D E4F7 ACA0 02C3 E0A7" /* "ERLqŒc]ä÷¬ .Ãৠ*/
- $"B542 0FF5 7029 FF4D 1D88 E3B3 D657 802B" /* µB.õp)ÿM.ˆã³ÖW€+ */
- $"8068 9BD4 B17F 9A6B CC1C 4B53 246F 81E5" /* €h›Ô±.škÌ.KS$oå */
- $"9168 48EC 4B44 3FFF 7B8B 5777 5677 134E" /* ‘hHìKD?ÿ{‹WwVw.N */
- $"1B8E 8C91 429F CE85 86EF 62B4 71AF EAE7" /* .ŽŒ‘BŸÎ…†ïb´q¯êç */
- $"E333 7BD3 2825 7230 C950 0000 1B8D 8BA6" /* ã3{Ó(%r0ÉP...‹¦ */
- $"04C1 56DC 30F0 619E DD6C D196 C91E 1ED4" /* .ÁVÜ0ðažÝlÑ–É..Ô */
- $"1285 94A8 F775 05A9 3440 78FF 7E52 8833" /* .…”¨÷u.©4@xÿ~Rˆ3 */
- $"E8A1 A4E4 4580 38DD ADE1 3BD5 AD19 74E6" /* 衤äE€8Ý­á;Õ­.tæ */
- $"EEA1 B4B1 0B0B 9BE9 08EC DB78 E6AA 37E5" /* î¡´±..›é.ìÛxæª7å */
- $"AD06 72A6 51FC 0004 4737 BF1A 89FF 7E11" /* ­.r¦Qü..G7¿.‰ÿ~. */
- $"0A68 EAD7 BDA5 4D5B 2C8D 0C7A 952E 2190" /* Âhê×½¥M[,.z•.! */
- $"8451 1B38 CEFD 2835 5ADD BDA2 01C2 A3D6" /* „Q.8Îý(5Zݽ¢.壅 */
- $"6046 4BD8 41DF D8B6 D9B1 1F96 5FF8 CC56" /* `FKØAßضٱ.–_øÌV */
- $"A63B 6E14 5035 26D6 946D 1F59 4D17 5507" /* ¦;n.P5&Ö”m.YM.U. */
- $"85F7 2DAF A737 4E30 9097 2E2E DAF8 37D1" /* …÷-¯§7N0—..Úø7Ñ */
- $"D987 4E59 ABFD CDF3 AAC3 30D1 8616 FAB3" /* Ù‡NY«ýÍóªÃ0ц.ú³ */
- $"2914 92AA 6913 C36F 66DA 4B0B 18FE DD55" /* ).’ªi.ÃofÚK..þÝU */
- $"1D2A 3F00 D80C 2423 D923 95C6 E11D 0069" /* .*?.Ø.$#Ù#•Æá..i */
- $"B5C9 0803 0907 B950 13DF 48EC F794 3D36" /* µÉ..Æ.¹P.ßHì÷”=6 */
- $"5249 2492 4924 9249 2489 9EF6 DC36 9A6B" /* RI$’I$’I$‰žöÜ6šk */
- $"1751 415E A37F 47EC A4EA 67AC A222 733C" /* .QA^£.Gì¤êg¬¢"s< */
- $"467D 1FFE C727 E6AA 6E99 C584 A87E DFFF" /* F}.þÇ'æªn™Å„¨~ßÿ */
- $"7FC3 7592 8204 71A2 6088 C38B 6E65 868E" /* .Ãu’‚.q¢`ˆÃ‹ne†Ž */
- $"5A3F FF7F F919 4069 CF10 A302 5125 525C" /* Z?ÿ.ù.@iÏ.£.Q%R\ */
- $"A443 88AF 4104 7807 1410 84BA E955 76E8" /* ¤Cˆ¯A.x...„ºéUvè */
- $"5F35 B612 A668 5694 9249 2492 4924 9249" /* _5¶.¦hV”’I$’I$’I */
- $"2492 4924 4C25 1941 A4EB 1996 7A28 19C1" /* $’I$L%.A¤ë.–z(.Á */
- $"A1B0 01D7 ACB2 3F83 42DC D154 27C9 F11F" /* ¡°.׬²?ƒBÜÑT'Éñ. */
- $"FC46 90B1 89C4 F78A 4C6F 5C2A 833D 8425" /* üF±‰Ä÷ŠLo\*ƒ=„% */
- $"D837 CA14 E4C7 7F8A 9833 99B7 E589 1376" /* Ø7Ê.äÇ.Š˜3™·å‰.v */
- $"C867 FF1D 200A 4C9B 624E 68E3 11AE C8AF" /* Ègÿ. ÂL›bNhã.®È¯ */
- $"1723 C741 CEAC 16CE C548 72FF 15CD 3E67" /* .#ÇAά.ÎÅHrÿ.Í>g */
- $"AF2C 323F 0FD0 6752 4973 55BD CC10 05B4" /* ¯,2?.ÐgRIsU½Ì..´ */
- $"AB3F 9302 00C3 EE70 1BA4 B650 FAB2 5821" /* «?“..Ãîp.¤¶Pú²X! */
- $"3856 3872 1B02 7D70 F1F9 0B28 A9DC CAE7" /* 8V8r..}pñù.(©ÜÊç */
- $"D9E7 6252 A768 A7DE 0FB1 FCB1 F54B 98C4" /* ÙçbR§h§Þ.±ü±õK˜Ä */
- $"7B6E 5E24 BC53 F945 741F 66A0 A51E EE5A" /* {n^$¼SùEt.f ¥.îZ */
- $"2A0D B951 4EEE A88B 4F2F C326 F326 1D12" /* *.¹QNO/Ã&ó&.. */
- $"524A 9E48 CC53 44EF C54F 1737 8505 46CF" /* RJžHÌSDïÅO.7….FÏ */
- $"351E 4354 05C7 C832 2A7D 8899 D009 E617" /* 5.CT.ÇÈ2*}ˆ™ÐÆæ. */
- $"0334 305D 9497 D845 E6D3 2CD2 178F 1316" /* .40]”—ØEæÓ,Ò... */
- $"65AD 239E 2ED5 ECCB 402A E728 09B5 E847" /* e­#ž.ÕìË@*ç(ƵèG */
- $"65BD 3F31 CAC5 F9D8 6606 B8AF 4F84 89FE" /* e½?1ÊÅùØf.¸¯O„‰þ */
- $"9004 4730 30BC E58F 5FB3 38CF 36B9 38FC" /* .G00¼å_³8Ï6¹8ü */
- $"FB9D 07EA D13F 9DB9 7185 0E88 0E3B 06E5" /* û.êÑ?¹q….ˆ.;.å */
- $"D476 CFCA 1587 3067 9257 B5DF 1E83 E7FF" /* ÔvÏÊ.‡0g’Wµß.ƒçÿ */
- $"7FFF 7FFF 0E68 E181 AC15 B980 2AFB 1D80" /* .ÿ.ÿ.há¬.¹€*û.€ */
- $"C5BB A88D E36A 4DC5 94CF 6DB2 0694 F977" /* Å»¨ãjMÅ”Ïm².”ùw */
- $"D708 02D1 F380 6773 016A CA84 3B1C 6A33" /* ×..Ñó€gs.jÊ„;.j3 */
- $"5AAC BA2D FEC5 7542 51FC 68D0 CDDD EA44" /* Z¬º-þÅuBQühÐÍÝêD */
- $"788E 2F96 D80C F159 FF45 3316 1494 A7F5" /* xŽ/–Ø.ñYÿE3..”§õ */
- $"98B4 FC39 0062 D59B 52A6 32CB F97C ABD6" /* ˜´ü9.bÕ›R¦2Ëù|«Ö */
- $"42AE AE46 6AA7 D986 0A4E DCDD 717E 8B7C" /* B®®Fj§Ù†ÂNÜÝq~‹| */
- $"8FB8 B396 65A6 83FF 6A4A A5C1 597F 70AF" /* ¸³–e¦ƒÿjJ¥ÁY.p¯ */
- $"DC96 E2EC 0C1D 7A00 3428 2C60 DE32 8DB8" /* Ü–âì..z.4(,`Þ2¸ */
- $"1604 C249 5E82 1F5B 6C23 E562 B2D4 754E" /* ..ÂI^‚.[l#åb²ÔuN */
- $"7F73 442A 25D3 C42A 6A6D 5D09 0E8C 2E67" /* .sD*%ÓÄ*jm]Æ.Œ.g */
- $"95EC 08FE B505 8B5A A4A8 0000 0000 0000" /* •ì.þµ.‹Z¤¨...... */
- $"0000 0000 6121 26B3 27C3 AEC0 FF52 2FEE" /* ....a!&³'îÀÿR/î */
- $"D4F3 92BB 06E2 ABE4 35DC A278 9084 B2F0" /* Ôó’».â«ä5Ü¢x„²ð */
- $"EE1A ADB2 F770 3D4E 120A FD01 B042 CD00" /* î.­²÷p=N.Âý.°BÍ. */
- $"B9C2 B661 40B0 E5FC DC59 59F0 61C5 53A7" /* ¹Â¶a@°åüÜYYðaÅS§ */
- $"7AC1 7EDC 77B7 1C84 0F9A E321 389C E693" /* zÁ~Üw·.„.šã!8œæ“ */
- $"AC98 5160 DDD0 C9A9 BE17 ED52 A10A 300C" /* ¬˜Q`ÝÐÉ©¾.íR¡Â0. */
- $"88ED BB5A 80DA C23B 1196 0C7C 6BA8 D4EA" /* ˆí»Z€ÚÂ;.–.|k¨Ôê */
- $"4FAB 08A9 EBE3 1CC9 6782 F6A9 85A4 1829" /* O«.©ëã.Ég‚ö©…¤.) */
- $"48BB D188 41E8 65BA 28BB 8AC1 8368 DC2F" /* H»ÑˆAèeº(»ŠÁƒhÜ/ */
- $"B2DE 61FE 95C0 BD88 C027 9CD9 3819 8A81" /* ²Þaþ•À½ˆÀ'œÙ8.Š */
- $"20FF 616C DEAE C6EA 15A3 D12F 764A B4E2" /* ÿalÞ®Æê.£Ñ/vJ´â */
- $"ECA3 AF32 36FF 29B0 E3CD 5046 527E 39B7" /* 죯26ÿ)°ãÍPFR~9· */
- $"921A ABF8 F0CB 7040 5FCD A182 4C57 986D" /* ’.«øðËp@_Í¡‚LW˜m */
- $"1115 DD94 687C 3663 7CFB 6C40 642D C8CA" /* ..Ý”h|6c|ûl@d-ÈÊ */
- $"1117 B5A9 8025 123D 9406 58F9 96B5 321E" /* ..µ©€%.=”.Xù–µ2. */
- $"7646 4BFD 48DE 0B9B DBEF B79F B6C7 031E" /* vFKýHÞ.›Ûï·Ÿ¶Ç.. */
- $"1D3B 1D18 B35D 2813 5601 3924 6AE1 FC21" /* .;..³](.V.9$jáü! */
- $"60B9 0B9F 6B4B AFB9 15D8 C57A 5345 7461" /* `¹.ŸkK¯¹.ØÅzSEta */
- $"0EF9 4B6B 88D1 7833 02DF 4FB8 DBEC 836A" /* .ùKkˆÑx3.ßO¸Ûìƒj */
- $"BEA7 3972 93C0 F973 37B5 C84F 1655 031C" /* ¾§9r“Àùs7µÈO.U.. */
- $"674D 741E 308E E3BA 6684 5BB0 4506 AB40" /* gMt.0Žãºf„[°E.«@ */
- $"14DE BFF2 9B38 4026 C5C2 3A44 FDFF 25CB" /* .Þ¿ò›8@&ÅÂ:Dýÿ%Ë */
- $"072E 1D99 62E3 22B8 DE8D 9CF1 79FA 1D38" /* ...™bã"¸Þœñyú.8 */
- $"8900 17CB A72B 8124 7EAF CF2F FC8D 34D6" /* ‰..˧+$~¯Ï/ü4Ö */
- $"E0AC 58ED 8BC1 0DAA 7964 FB91 BF08 EFA6" /* à¬Xí‹Á.ªydû‘¿.ï¦ */
- $"42FF 7FFF 7FE3 AF13 7C4B 1CF4 D643 3CD3" /* Bÿ.ÿ.ã¯.|K.ôÖC<Ó */
- $"5F1A 08BB 7C56 5CFB 6D27 04DE C66A 9AF1" /* _..»|V\ûm'.ÞÆjšñ */
- $"2053 D4B2 EE60 44FF 2A89 1FFC DFCC 57C1" /* SÔ²î`Dÿ*‰.üßÌWÁ */
- $"3800 1290 7854 7902 FF7A 9A36 D71E F8D1" /* 8..xTy.ÿzš6×.øÑ */
- $"D439 471B D02F 4A39 E5BC D25F FDF0 8B54" /* Ô9G.Ð/J9å¼Ò_ýð‹T */
- $"AE0A 3677 2625 B286 7DEC 8FF7 2457 2B25" /* ®Â6w&%²†}ì÷$W+% */
- $"C066 2A4E A605 EE16 7244 CCFD D3D3 FDA1" /* Àf*N¦.î.rDÌýÓÓý¡ */
- $"F3B8 76C3 1C5F 491C 0165 8735 D71D 19AD" /* ó¸vÃ._I..e‡5×..­ */
- $"9BB1 A40D E5BA 9D1C E34B B71C 9CF0 EC7A" /* ›±¤.åº.ãK·.œðìz */
- $"5E87 C4F0 A326 0913 9E2C 6517 50A3 E72B" /* ^‡Äð£&Æ.ž,e.P£ç+ */
- $"87FE D348 2E5D 0A00 0000 0000 0000 0000" /* ‡þÓH.]Â......... */
- $"0002 2C86 A73D 4030 2FE4 D32C 2B56 C74C" /* ..,†§=@0/äÓ,+VÇL */
- $"0869 A5C9 151A 69B9 9390 DA50 4411 8FFF" /* .i¥É..i¹“ÚPD.ÿ */
- $"4938 4E36 F9DD 09FB E4A0 C339 2431 ED8B" /* I8N6ùÝÆûä Ã9$1í‹ */
- $"793D 6354 12C0 97F9 C379 ADA9 7DEE E5EF" /* y=cT.À—ùÃy­©}îåï */
- $"2366 FF4F E2A2 F01A C90F 02E3 51CD B477" /* #fÿOâ¢ð.É..ãQÍ´w */
- $"2230 690A B47C E28B 463C 2E88 7579 7943" /* "0i´|â‹F<.ˆuyyC */
- $"5055 6D0A EEC5 F3BF 2404 37D8 EFE1 71AC" /* PUmÂîÅó¿$.7Øïáq¬ */
- $"6AFE A3E4 A7EB 28BF BFFE 4373 E5FF 7E4A" /* jþ£ä§ë(¿¿þCsåÿ~J */
- $"2D5D 1ED3 6D78 1657 9914 A061 7958 972C" /* -].Ómx.W™. ayX—, */
- $"56FB D5B0 1FFD A18B 7A29 0C81 295B DF7C" /* VûÕ°.ý¡‹z).)[ß| */
- $"83E3 CD36 0E66 7E2B D8FA 3096 AA44 7F9B" /* ƒãÍ6.f~+Øú0–ªD.› */
- $"F0B9 EA48 8CC7 0FFF 7E1C F394 CC5B 6A25" /* ð¹êHŒÇ.ÿ~.ó”Ì[j% */
- $"FD4C CECC 630B 38B7 D621 F081 73EE 9D40" /* ýLÎÌc.8·Ö!ðsî@ */
- $"7FAD FADD 8111 6492 599E DD2C 3600 FF6C" /* .­úÝ.d’YžÝ,6.ÿl */
- $"5A8D B0B8 2AE7 668D C5A0 826B FA0D C5B1" /* Z°¸*çfÅ ‚kú.ű */
- $"6873 D749 B533 9627 C2F6 4922 63F7 8944" /* hs×Iµ3–'ÂöI"c÷‰D */
- $"15C5 A1F9 8539 A21A 1CEB 1C2D 7D1B 0516" /* .Å¡ù…9¢..ë.-}... */
- $"FD6C 5D4F 92A3 14D9 126F C5FC 4116 B499" /* ýl]O’£.Ù.oÅüA.´™ */
- $"D878 D889 9123 D3C8 4637 36E3 8644 6F0B" /* Øx؉‘#ÓÈF76ã†Do. */
- $"D2C6 A599 B793 1367 B548 23BD 8836 11E5" /* ÒÆ¥™·“.gµH#½ˆ6.å */
- $"C323 7AD5 0534 3D05 A4E6 70B3 0376 2B0C" /* Ã#zÕ.4=.¤æp³.v+. */
- $"A964 173B F0BC 2A52 7FE4 2A53 85C2 22B2" /* ©d.;ð¼*R.ä*S…Â"² */
- $"B83F 7185 FB4C 3769 5B3E 4A24 E7E1 D0FD" /* ¸?q…ûL7i[>J$çáÐý */
- $"9B17 8737 FE8B E4C7 9FC1 0E30 D904 D0C5" /* ›.‡7þ‹äÇŸÁ.0Ù.ÐÅ */
- $"D2F5 05E4 3CD6 5FA7 B9AF FB98 755E 0BAF" /* Òõ.ä<Ö_§¹¯û˜u^.¯ */
- $"E4EE 408D A8BE 5E58 07A6 059D 1B33 37F3" /* äî@¨¾^X.¦..37ó */
- $"8D14 871A 7FC6 43ED 6A6F 8F41 9681 095E" /* .‡..ÆCíjoA–Æ^ */
- $"EE46 5BA4 1E15 F5F2 3063 E524 A62A 7C7F" /* îF[¤..õò0cå$¦*|. */
- $"0E38 5D00 A378 8F6D 3861 2088 EDD7 AC24" /* .8].£xm8a ˆí׬$ */
- $"D3B6 B052 DE10 357D B65A 1414 4596 8E3D" /* Ó¶°RÞ.5}¶Z..E–Ž= */
- $"97E3 D838 9ACC 3C84 AF82 EA8D 8BD3 0180" /* —ãØ8šÌ<„¯‚ê‹Ó.€ */
- $"1582 0654 BB61 1047 ACA1 29D3 7CFA 00C8" /* .‚.T»a.G¬¡)Ó|ú.È */
- $"BABC 146B 250C 8D19 8A4E A8B3 50D6 B986" /* º¼.k%..ŠN¨³PÖ¹† */
- $"2AD6 CEFA 02D6 AE11 FF7C B0A2 E6E0 30E9" /* *ÖÎú.Ö®.ÿ|°¢æà0é */
- $"D904 4C03 3BC1 8B68 5892 30B8 7D69 C2D6" /* Ù.L.;Á‹hX’0¸}iÂÖ */
- $"A9F8 56A2 7417 1E31 186F 09A1 4C11 6DCA" /* ©øV¢t..1.oÆ¡L.mÊ */
- $"A62E 5FCC F59A CCE8 6A29 B0DF E2BC E8BF" /* ¦._ÌõšÌèj)°ßâ¼è¿ */
- $"92DF 70C1 8B09 21DF 1440 1684 4413 2A60" /* ’ßpÁ‹Æ!ß.@.„D.*` */
- $"E033 6D92 8573 E63C 2746 6F40 D8F0 D0C9" /* à3m’…sæ<'Fo@ØðÐÉ */
- $"10AF 85A2 CFBF 373B B250 85E4 C1D3 85D2" /* .¯…¢Ï¿7;²P…äÁÓ…Ò */
- $"E167 1222 DF4A 67D9 B3D6 55B4 B047 8675" /* ág."ßJgÙ³ÖU´°G†u */
- $"C803 6AE5 E5AE AF92 C4B7 591A A040 98AC" /* È.jå宯’Ä·Y. @˜¬ */
- $"4412 45F8 BBC8 6482 F7BD 81B2 98FE 9D0B" /* D.Eø»Èd‚÷½²˜þ. */
- $"DAB1 2959 952C 9115 3504 9A24 BBA4 A04C" /* Ú±)Y•,‘.5.š$»¤ L */
- $"4125 5810 54F5 C268 63C2 1DB9 11CF 85BB" /* A%X.TõÂhcÂ.¹.Ï…» */
- $"D941 F5A1 0239 DED3 856D BBE5 7CF3 49C3" /* ÙAõ¡.9ÞÓ…m»å|óIà */
- $"C9CF 1BD1 A953 F58A F9AF E704 E70E 43B7" /* ÉÏ.Ñ©SõŠù¯ç.ç.C· */
- $"2B51 BE14 4FF3 262C 914B 90AF F2A9 E060" /* +Q¾.Oó&,‘K¯ò©à` */
- $"6A24 6553 B776 C48D 19AD ECD3 2DD3 8ECF" /* j$eS·vÄ.­ìÓ-ÓŽÏ */
- $"9EC7 8A0D 97F4 3C69 6E56 0881 1136 C147" /* žÇŠ.—ô<inV..6ÁG */
- $"E7D3 6FE5 A0C6 D7DC BCB0 76AC C4F8 DD65" /* çÓoå Æ×ܼ°v¬ÄøÝe */
- $"A5F9 02BF 2BFD 9A2C 354D 24C2 E088 6B63" /* ¥ù.¿+ýš,5M$Âàˆkc */
- $"E514 C014 E8F4 F5C2 B529 74FB EC02 032B" /* å.À.èôõµ)tûì..+ */
- $"A54B 696E B602 7D58 4542 824D BD8C 40FA" /* ¥Kin¶.}XEB‚M½Œ@ú */
- $"F675 5CD4 71C9 058E 7062 0E1B 10CC 72A9" /* öu\ÔqÉ.Žpb...Ìr© */
- $"95B8 C5FD 7EAF 995C 62ED DDE4 6579 3181" /* •¸Åý~¯™\bíÝäey1 */
- $"8BA1 A02B 1559 F5BC E9C9 914D 8CEB D7D8" /* ‹¡ +.Yõ¼éÉ‘MŒë×Ø */
- $"7D81 20C0 A609 18D2 B679 7C08 FB00 E4C6" /* } À¦Æ.Ò¶y|.û.äÆ */
- $"2797 518E 32CE 67CE 3C8E 6796 A832 F712" /* '—QŽ2ÎgÎ<Žg–¨2÷. */
- $"0037 059C 96CD 85A0 98E6 5D20 05F2 EC61" /* .7.œ–Í… ˜æ] .òìa */
- $"335D AFFF 14BC 3EF9 0779 7A53 BAA4 F47A" /* 3]¯ÿ.¼>ù.yzSº¤ôz */
- $"6926 DAD2 72F9 5D4B 1014 8BD5 A4FA 68EA" /* i&ÚÒrù]K..‹Õ¤úhê */
- $"D9F9 F684 BFD5 F2ED FB9E 4C18 91C3 FF17" /* Ùùö„¿ÕòíûžL.‘Ãÿ. */
- $"2D17 D99A DE29 FE6E 63A4 C901 8642 9357" /* -.ÙšÞ)þnc¤É.†B“W */
- $"3120 4386 1938 E7D2 572D 0C59 E3C9 7FED" /* 1 C†.8çÒW-.YãÉ.í */
- $"30FA E54A CEF8 A94C F92D AF19 76EA 3372" /* 0úåJÎø©Lù-¯.vê3r */
- $"B4E1 E7C5 8239 A4AC A247 4838 55E8 EB9B" /* ´áçÅ‚9¤¬¢GH8Uèë› */
- $"DE7D 94E9 DBD7 07FB D488 1672 E61D 9E4C" /* Þ}”éÛ×.ûÔˆ.ræ.žL */
- $"6DF2 97D5 4936 F89A 5CBC D37A 8C2C F7ED" /* mò—ÕI6øš\¼ÓzŒ,÷í */
- $"9755 19F2 0350 AB2E D851 F0B7 78B5 9770" /* —U.ò.P«.ØQð·xµ—p */
- $"4DF3 4212 9C9C CA3B 403A BA7B D497 9410" /* MóB.œœÊ;@:º{Ô—”. */
- $"04C6 288B 5058 5DC9 EB79 AB85 622C 9A55" /* .Æ(‹PX]Éëy«…b,šU */
- $"2DA7 C113 9315 7CAE D84E 6B50 4062 AE94" /* -§Á.“.|®ØNkP@b®” */
- $"8F5E 7969 4BA5 56B2 E881 8C02 ED3B 5259" /* ^yiK¥V²èŒ.í;RY */
- $"24CE C98A 4348 12B1 314F E3E3 B6A3 4E61" /* $ÎÉŠCH.±1Oã㶣Na */
- $"A426 6350 E380 B0B5 DEFF 64CF 72D6 D4B9" /* ¤&cP〰µÞÿdÏrÖÔ¹ */
- $"907C 9BE0 7E4D 39F9 2BB7 C3DE D7C3 DCD8" /* |›à~M9ù+·ÃÞ×ÃÜØ */
- $"1F93 775F 0F44 DF0F A717 C3E9 D603 F269" /* .“w_.Dß.§.ÃéÖ.òi */
- $"FBE1 D36F 87B3 6F87 B280 E8AB DECC AF0D" /* ûáÓo‡³o‡²€è«Þ̯. */
- $"6C8A C695 8734 87EB A75F 5130 05EC 9BA8" /* lŠÆ•‡4‡ë§_Q0.웨 */
- $"78DB 85A2 680C 75A0 EDD1 4AA2 7E1B BAFF" /* xÛ…¢h.u íÑJ¢~.ºÿ */
- $"5AFC FD6C 3E36 A6D9 923A 2DCE 24BC 35EF" /* Züýl>6¦Ù’:-Î$¼5ï */
- $"27F4 8813 7CC4 0141 3CD9 9568 BFE6 BBB3" /* 'ôˆ.|Ä.A<Ù•h¿æ»³ */
- $"219B 0442 5227 3796 635D 0DE7 499A A701" /* !›.BR'7–c].çIš§. */
- $"7F74 FB13 F9DF E737 08AB 0A91 3D9E B77D" /* .tû.ùßç7.«Â‘=ž·} */
- $"E616 57BB 8BAF 7A0D 1B28 42E6 D653 6BD3" /* æ.W»‹¯z..(BæÖSkÓ */
- $"D7A8 9A2B 0905 6198 8809 E5D0 D0A4 F589" /* רš+Æ.a˜ˆÆåÐФõ‰ */
- $"3D04 8161 C4CB 7BC9 96E2 9DA4 1C59 C982" /* =.aÄË{É–â¤.YÉ‚ */
- $"4705 B1BE 1E05 E391 5E89 43FE 6C67 4342" /* G.±¾..ã‘^‰CþlgCB */
- $"636F 80C5 6A98 16E6 6B80 27C8 D0D9 B28C" /* co€Åj˜.æk€'ÈÐÙ²Œ */
- $"6FD4 E109 61AB 8FCB D4CB 19ED 2BE7 B510" /* oÔáÆa«ËÔË.í+çµ. */
- $"C0E8 5883 0642 92A1 6094 7E45 5D3F 819A" /* ÀèXƒ.B’¡`”~E]?š */
- $"4B6F AE8E ED0B 4B30 ABB1 2789 5C58 EEFD" /* Ko®Ží.K0«±'‰\Xîý */
- $"06C9 EF2B 2A12 1731 7581 4428 C72D 2501" /* .Éï+*..1uD(Ç-%. */
- $"2C14 0DA4 2C98 035F FEA8 51A2 0E61 4C50" /* ,..¤,˜._þ¨Q¢.aLP */
- $"4A65 60DE FA1C F36C 62D9 A3FA 93A6 4CAC" /* Je`Þú.ólbÙ£ú“¦L¬ */
- $"C1D0 079D 912F A133 724B 13CC AFF4 1382" /* ÁÐ.‘/¡3rK.̯ô.‚ */
- $"D61F 8AF2 A48B CCA6 5D66 4F61 E6BE 657B" /* Ö.Šò¤‹Ì¦]fOaæ¾e{ */
- $"7F5B 6F20 397A BBC2 3F23 86DF 2355 4A18" /* .[o 9z»Â?#†ß#UJ. */
- $"15DB CB3E 201F FF7C 4AC9 C764 B098 CA46" /* .ÛË> .ÿ|JÉÇd°˜ÊF */
- $"C2CF 44C6 42E7 D30A FD05 380F 6BD3 24C1" /* ÂÏDÆBçÓÂý.8.kÓ$Á */
- $"3998 C5C1 E7D5 0E2C 8D50 7FBB 7A11 6CB7" /* 9˜ÅÁçÕ.,P.»z.l· */
- $"B80F 5A84 44BE E746 C43C 6B5D F055 7A3B" /* ¸.Z„D¾çFÄ<k]ðUz; */
- $"77CB BFA9 2B73 06AF 9C8B AF37 F600 E568" /* wË¿©+s.¯œ‹¯7ö.åh */
- $"EE70 09D2 B0A7 C201 94D9 AC58 E9A2 9D53" /* îpÆÒ°§Â.”Ù¬Xé¢S */
- $"94C0 D1C9 E379 E453 E4C7 27C5 C3F8 1161" /* ”ÀÑÉãyäSäÇ'ÅÃø.a */
- $"D631 3F3C 0CFE 13A3 F6EB 3048 F049 CF11" /* Ö1?<.þ.£öë0HðIÏ. */
- $"5962 65AE 5D8E F911 A2E2 7787 6C78 F63C" /* Ybe®]Žù.¢âw‡lxö< */
- $"E24C ED5B F634 B2B9 9DDF 51B0 94B9 1ABF" /* âLí[ö4²¹ßQ°”¹.¿ */
- $"BE93 4236 35A6 613E 3D1B C8FD 0587 27C7" /* ¾“B65¦a>=.Èý.‡'Ç */
- $"F936 55E0 D0CE BF1A 50D8 51CE 6253 0293" /* ù6UàÐο.PØQÎbS.“ */
- $"1958 3FA2 BF6C 54A5 B158 4236 7F88 7DE4" /* .X?¢¿lT¥±XB6.ˆ}ä */
- $"C231 6D0B 62F1 2C6C 1A1D F8AA 0317 C52D" /* Â1m.bñ,l..øª..Å- */
- $"D9D5 0B61 312B A074 B2B8 1905 FCF9 A102" /* ÙÕ.a1+ t²¸..üù¡. */
- $"6188 616D 74E6 8232 245D 9C8A 4FD8 E2FD" /* aˆamtæ‚2$]œŠOØâý */
- $"0C6C 8F2E 5C82 5724 C542 3AE5 BA0A EE0B" /* .l.\‚W$ÅB:åºÂî. */
- $"2A14 BCDE 8005 4446 25B1 CF8A 6744 9F5C" /* *.¼Þ€.DF%±ÏŠgDŸ\ */
- $"9B09 6571 3003 9F52 A42A 7669 CCAA 7A75" /* ›Æeq0.ŸR¤*vi̪zu */
- $"F807 2530 7BA9 1474 F318 5A7B E64A 5DD7" /* ø.%0{©.tó.Z{æJ]× */
- $"A6F2 13B0 AFA5 7BF8 46DC CABF 4D80 CC26" /* ¦ò.°¯¥{øFÜÊ¿M€Ì& */
- $"5838 4016 3C05 4550 C62F 1504 5B79 0816" /* X8@.<.EPÆ/..[y.. */
- $"556C 8524 5DDA E914 92F1 3124 5C5B 3213" /* Ul…$]Úé.’ñ1$\[2. */
- $"7851 D9B8 EE79 46CF 3F06 1EAB 662A FD9E" /* xQÙ¸îyFÏ?..«f*ýž */
- $"E7D8 2E8C 938F 43FA B1B1 34B0 9207 34EC" /* çØ.Œ“Cú±±4°’.4ì */
- $"7A09 46BF 201E 311F EEEE 88EF C6C1 C10D" /* zÆF¿ .1.îîˆïÆÁÁ. */
- $"E238 50C9 7F01 DFF0 2170 EDD1 7471 8C14" /* â8PÉ..ßð!píÑtqŒ. */
- $"FB17 6678 A8B9 6611 9713 D8BB 8840 427C" /* û.fx¨¹f.—.Ø»ˆ@B| */
- $"8E5E 1608 D5E6 79B6 0BD7 3592 5D97 3864" /* Ž^..Õæy¶.×5’]—8d */
- $"71DF 6137 C0E6 2EB0 F71D 466C CFFF 50EF" /* qßa7Àæ.°÷.FlÏÿPï */
- $"FE99 2E4D 0DBB 537F 32F1 DECB D5D4 39DF" /* þ™.M.»S.2ñÞËÕÔ9ß */
- $"4FCC 2FC2 C399 8EB9 FC8B 2806 3FB7 F227" /* OÌ/ÂÙŽ¹ü‹(.?·ò' */
- $"BA12 A288 9858 9159 B6ED 0DBF 3DCC 8FA1" /* º.¢ˆ˜X‘Y¶í.¿=Ì¡ */
- $"9CF5 836D 499F B9E7 DB4E 497F D3A4 57BF" /* œõƒmIŸ¹çÛNI.Ó¤W¿ */
- $"9F0A EECE 8E29 127A 82FF 4222 75AC 32D4" /* ŸÂîÎŽ).z‚ÿB"u¬2Ô */
- $"6540 8040 4137 9EB4 EFFF 7FEC 9D37 60B4" /* e@€@A7ž´ïÿ.ì7`´ */
- $"184A 9567 71E4 F5FE 1C55 BB95 9FD8 BE6D" /* .J•gqäõþ.U»•ŸØ¾m */
- $"037F 052C 035B 91D7 903B 6EEC 1642 3D18" /* ...,.[‘×;nì.B=. */
- $"0B05 FEC5 4C0C 9ED3 BFA5 94AF CBB1 E725" /* ..þÅL.žÓ¿¥”¯Ë±ç% */
- $"DFC3 AF74 2485 D5A2 7F79 1275 C7DD ADE1" /* ßït$…Õ¢.y.uÇÝ­á */
- $"3BD5 AD19 74E6 EE9F 6846 7900 C09D 090B" /* ;Õ­.tæîŸhFy.ÀÆ. */
- $"C17C FB0F 2C9F 4DEB B9FE 7152 A47E B1CB" /* Á|û.,ŸMë¹þqR¤~±Ë */
- $"FB0E 7108 21C7 EFAB 8FA3 8AF0 2FDC 17A9" /* û.q.!Çï«£Šð/Ü.© */
- $"2565 5082 BEBF 4DDD 0699 3265 82AE D421" /* %eP‚¾¿MÝ.™2e‚®Ô! */
- $"3776 341F C56C ECDA B302 0306 AE5F 37FF" /* 7v4.ÅlìÚ³...®_7ÿ */
- $"7FB7 1192 8D68 5475 EE0B 4D80 6149 DEBB" /* .·.’hTuî.M€aIÞ» */
- $"F9A7 D7E7 A35D 9515 8000 4F04 C4D6 670C" /* ù§×ç£]•.€.O.ÄÖg. */
- $"54B7 93BB D264 43E0 E8D4 2D4D D3E2 AEB0" /* T·“»ÒdCàèÔ-MÓâ®° */
- $"FBAE F5BD A155 A8F2 07B4 AAA6 CE0A 84CC" /* û®õ½¡U¨ò.´ª¦ÎÂ„Ì */
- $"907F D5C4 9900 8FE2 0E0D F385 55A0 CDFF" /* .ÕÄ™.â..ó…U Íÿ */
- $"7FFE D776 193F A5C4 0334 DD15 7A6A 0890" /* .þ×v.?¥Ä.4Ý.zj. */
- $"DE98 5707 7799 9A5B D638 31B9 982B 5623" /* Þ˜W.w™š[Ö81¹˜+V# */
- $"3AFA A84A 20E7 417C F56E 7776 0C54 0765" /* :ú¨J çA|õnwv.T.e */
- $"91DE A19E 3DD2 4D8B F9F9 0D61 6343 0746" /* ‘Þ¡ž=ÒM‹ùù.acC.F */
- $"7D72 600B 4E15 FC8F 60FA A273 4348 A86E" /* }r`.N.ü`ú¢sCH¨n */
- $"E11A CD6B 3FFF 7ED1 E486 AAAA A380 045A" /* á.Ík?ÿ~Ñ䆪ª£€.Z */
- $"70E5 3753 4FFF 7FC6 ADBE 8E71 66FF 8165" /* på7SOÿ.Æ­¾Žqfÿe */
- $"D782 24E8 7399 0C15 03BF 29B5 5685 FDA1" /* ׂ$ès™...¿)µV…ý¡ */
- $"5BAD 5751 6D53 799A A7C6 572E 6A37 B46A" /* [­WQmSyš§ÆW.j7´j */
- $"B9BF 05BF 3131 F7DB E3B8 8F11 EE2F 13D6" /* ¹¿.¿11÷Ûã¸.î/.Ö */
- $"7DE9 D552 0B25 FEAF AEFE F0A7 FBE9 487F" /* }éÕR.%þ¯®þð§ûéH. */
- $"9085 0FFA 23FE A9DB 0494 B0E1 FEFD 1D50" /* ….ú#þ©Û.”°áþý.P */
- $"15B4 6548 AAA0 0182 C5FF 7D24 05C8 B15E" /* .´eHª .‚Åÿ}$.ȱ^ */
- $"E45F A508 3C68 CA73 3A57 A35E 462D 9213" /* ä_¥.<hÊs:W£^F-’. */
- $"9D19 A4FE F266 C323 64FF 7B71 19F7 0BC3" /* .¤þòfÃ#dÿ{q.÷.Ã */
- $"062C 20C4 9745 F075 6FFF 31F0 A3AD 4C84" /* ., Ä—Eðuoÿ1ð£­L„ */
- $"00F3 104C 0064 3899 0DB9 8128 CB5F FF46" /* .ó.L.d8™.¹(Ë_ÿF */
- $"7184 41CB 7E58 4C0B ADD5 CBB2 1A61 E3D6" /* q„AË~XL.­Õ˲.aãÖ */
- $"B45F 489E 7FE9 D915 2B77 0776 98BD B3A6" /* ´_Hž.éÙ.+w.v˜½³¦ */
- $"230E B817 1D5A D937 3251 2449 6B0A 5A13" /* #.¸..ZÙ72Q$IkÂZ. */
- $"C4E0 BB45 CB72 9758 9E56 158D B1E6 9590" /* Äà»EËr—XžV.±æ• */
- $"4FC4 0611 EDBC 426F 6D2B D932 D595 A74E" /* OÄ..í¼Bom+Ù2Õ•§N */
- $"8728 58CD BD02 9746 DBA2 7EAB 0F07 363C" /* ‡(Xͽ.—FÛ¢~«..6< */
- $"BAB3 1228 E02A BDB4 373F F3FB FF7D 8D0D" /* º³.(à*½´7?óûÿ}. */
- $"2193 09F4 7603 A017 98B1 421E 7A47 D126" /* !“Æôv. .˜±B.zGÑ& */
- $"82FD 5449 B97F F864 5CD5 19F6 A8A4 F216" /* ‚ýTI¹.ød\Õ.ö¨¤ò. */
- $"A4B3 FF7F E820 4C58 DE4B 944B 6FD4 F4DA" /* ¤³ÿ.è LXÞK”KoÔôÚ */
- $"596E A688 456C 3F0D 7844 1596 2BED 0D5D" /* Yn¦ˆEl?.xD.–+í.] */
- $"FAFB 8D2E D7D0 ABCB B2BE 8D80 E74D 9EDC" /* úû.×Ы˲¾€çMžÜ */
- $"7FFF 7FC9 2FB9 3BDA F47A B9C2 E1B8 5CC8" /* .ÿ.É/¹;Úôz¹Âá¸\È */
- $"14AB D534 7208 32FE 73D2 EF23 862E 10F8" /* .«Õ4r.2þsÒï#†..ø */
- $"C16F 1FFF 6FBB FA97 5167 CDAD 4886 8FC2" /* Áo.ÿo»ú—QgÍ­H†Â */
- $"BFFF 7FFE 2B73 126E 1EC8 C82A 3F6D 6CC3" /* ¿ÿ.þ+s.n.ÈÈ*?mlà */
- $"D98A D501 1DC2 82FD FF57 9731 B866 2A7D" /* ÙŠÕ..‚ýÿW—1¸f*} */
- $"C983 5F41 893F 2D09 F81C E373 42C2 5963" /* Ƀ_A‰?-Æø.ãsBÂYc */
- $"7E9F C269 2B8B C21A 8247 D433 0DF7 491E" /* ~ŸÂi+‹Â.‚GÔ3.÷I. */
- $"D1BF 3D9E F4BD 1B50 8034 4EE9 4A69 B155" /* Ñ¿=žô½.P€4NéJi±U */
- $"849A B0F7 8CEA 3FD0 E4A0 C339 2431 ED8B" /* „š°÷Œê?Ðä Ã9$1í‹ */
- $"793D 6354 12C0 97F9 C379 ADA9 7DEE E5EF" /* y=cT.À—ùÃy­©}îåï */
- $"2366 FD9F 7F36 9703 7BCA 1455 6A98 F02E" /* #fýŸ.6—.{Ê.Uj˜ð. */
- $"1EDC 4707 C9A6 B325 A6E4 637D 612B B3DD" /* .ÜG.ɦ³%¦äc}a+³Ý */
- $"1E5A 3660 EEB0 BEFA 2C50 307B 5887 6D39" /* .Z6`î°¾ú,P0{X‡m9 */
- $"0EC7 2D81 C32E 6B72 8546 30E4 133F 3D3B" /* .Ç-Ã.kr…F0ä.?=; */
- $"0A76 21AA 4387 8F29 03C8 1C32 755C F553" /* Âv!ªC‡).È.2u\õS */
- $"5CA1 C16A 02EC 4654 97C8 6F10 BA2A 16E0" /* \¡Áj.ìFT—Èo.º*.à */
- $"DB18 605E 8A18 8A6E 4F35 1EF7 8C57 F8B2" /* Û.`^Š.ŠnO5.÷ŒWø² */
- $"0020 4D0A 1739 2287 ADE2 B0C2 D816 17D2" /* . MÂ.9"‡­â°ÂØ..Ò */
- $"21F8 3104 FEA8 38E3 8644 6F0B D2C6 A599" /* !ø1.þ¨8ã†Do.ÒÆ¥™ */
- $"B793 1367 B548 23BD 8836 1143 D5DB 2720" /* ·“.gµH#½ˆ6.CÕÛ' */
- $"73BB 1485 DEAF C96F 24E8 AA26 56B9 89D3" /* s».…Þ¯Éo$èª&V¹‰Ó */
- $"8F8D 2F3E 5EA5 466C BE3C 6879 6C0A 5891" /* />^¥Fl¾<hylÂX‘ */
- $"974E 6F22 0E47 66D4 BD1F 6A7D 1885 42CC" /* —No".GfÔ½.j}.…BÌ */
- $"7E13 126E AC98 74B7 B093 BDFF 37DB E527" /* ~..n¬˜t·°“½ÿ7Ûå' */
- $"E6D0 CF2A D7E6 E7EB 1095 05AF 6407 BB9B" /* æÐÏ*×æçë.•.¯d.»› */
- $"0227 D5EB 260A C844 340F B249 E84F 58A7" /* .'Õë&ÂÈD4.²IèOX§ */
- $"FA14 9D34 7614 73A6 BE73 ED76 B2CD 4515" /* ú.4v.s¦¾sív²ÍE. */
- $"F26C 3AD7 7C32 5480 5A3A C4DF 123A EA95" /* òl:×|2T€Z:Äß.:ê• */
- $"D2B4 A3D8 F88D E685 6505 A999 DD9E C8D1" /* Ò´£Øøæ…e.©™ÝžÈÑ */
- $"A073 3702 5A8F 3598 F7DC A36F 0058 065E" /*  s7.Z5˜÷Ü£o.X.^ */
- $"65E6 B5AC 2A85 0F1C 43BF 8A10 43A0 BB10" /* e浬*…..C¿Š.C ». */
- $"4C3A 8F4F 95AD 253D EEE9 FBE8 4023 4647" /* L:O•­%=îéûè@#FG */
- $"7A75 8F1C 9245 3C51 3FF5 BD2B DFD3 57EF" /* zu.’E<Q?õ½+ßÓWï */
- $"1FB4 900F 4546 6EFA A7AE 45EB EAE9 7B9D" /* .´.EFnú§®Eëêé{ */
- $"6408 1DCB F7AC BE44 7D08 1482 2257 A9CF" /* d..Ë÷¬¾D}..‚"W©Ï */
- $"8B78 3610 9816 9518 A64C 215A 4569 6C5F" /* ‹x6.˜.•.¦L!ZEil_ */
- $"57E0 4F89 F77C 88D6 ADFC 8E42 9299 A2C9" /* WàO‰÷|ˆÖ­üŽB’™¢É */
- $"0F7C EA0A 7E98 B7AF 70ED 09A8 0759 B1A7" /* .|êÂ~˜·¯píƨ.Y±§ */
- $"C18E 2CC9 883F A788 A2F1 57B9 7A0E F384" /* ÁŽ,Ɉ?§ˆ¢ñW¹z.ó„ */
- $"F0CE 46F0 E10A ED6F CE17 2BE1 25D5 3A36" /* ðÎFðáÂíoÎ.+á%Õ:6 */
- $"5C6A F3AA F2D1 7225 6C5C 514F 8F1F 64A5" /* \jóªòÑr%l\QO.d¥ */
- $"B08E D05D 3E2E B3E4 DE48 12A9 7DC6 6E03" /* °ŽÐ]>.³äÞH.©}Æn. */
- $"05B3 2AD0 EF87 EFB1 6D03 06E4 85AB 36C6" /* .³*Ðï‡ï±m..ä…«6Æ */
- $"9BF6 8382 74F2 F321 62DF 269C 8D95 8FBD" /* ›öƒ‚tòó!bß&œ•½ */
- $"C4CA 7278 FDBA C51B A4FC C224 BD43 5F76" /* ÄÊrxýºÅ.¤üÂ$½C_v */
- $"F9D9 0970 5EAA 5F05 FDCB 50DE 35E7 A82E" /* ùÙÆp^ª_.ýËPÞ5ç¨. */
- $"1E7E 584D 33D8 EF90 B221 622F 778E 460D" /* .~XM3Øï²!b/wŽF. */
- $"6DC9 383F CF41 7B89 7414 97EF EFE2 CC75" /* mÉ8?ÏA{‰t.—ïïâÌu */
- $"8895 6AFD C6E8 610E 5E29 7AE1 FAAF 9FD5" /* ˆ•jýÆèa.^)záú¯ŸÕ */
- $"435F 3F61 6F9F AC78 7EAD 62BE 7DF7 7CFD" /* C_?aoŸ¬x~­b¾}÷|ý */
- $"D3FD 5BAF 83F5 5B37 CF6D BE7E 9DDF 3F4D" /* Óý[¯ƒõ[7Ïm¾~ß?M */
- $"80E8 ABDE CCAF 0D6C 8AC6 9587 348A 7A5A" /* €è«Þ̯.lŠÆ•‡4ŠzZ */
- $"21F6 5D05 F6A4 1727 AC99 8E36 4607 A805" /* !ö].ö¤.'¬™Ž6F.¨. */
- $"1CA8 FB12 6979 4216 6FCF DF65 6135 AFF9" /* .¨û.iyB.oÏßea5¯ù */
- $"5A1E 01C1 15A0 4F38 E547 6F65 858D 0788" /* Z..Á. O8åGoe….ˆ */
- $"49E3 07A2 D476 B767 EC21 FF65 559D 3B3F" /* Iã.¢Ôv·gì!ÿeU;? */
- $"B8A5 C1A8 6496 5183 24E6 93A6 DF2F 52F1" /* ¸¥Á¨d–Qƒ$擦ß/Rñ */
- $"19CA BFD7 1479 8040 2F9C 0DB9 00F0 49C5" /* .Ê¿×.y€@/œ.¹.ðIÅ */
- $"3D32 5B0C 9453 8D1F 452F D9E7 75FD CD61" /* =2[.”S.E/ÙçuýÍa */
- $"44A9 62C3 F0C8 BAF0 6A66 A4D4 AA8B 73B0" /* D©bÃðȺðjf¤Ôª‹s° */
- $"C942 686A 4A1E E3A7 2343 A0ED D595 9AFC" /* ÉBhjJ.ã§#C íÕ•šü */
- $"5546 0ACB FD23 6F2E DCEE ABBD 70E7 FA93" /* UFÂËý#o.Üpçú“ */
- $"3FFF 7FC5 7D31 FA1C D910 1C70 6CDC 3362" /* ?ÿ.Å}1ú.Ù..plÜ3b */
- $"B0A1 C6F3 16D1 BE51 73D2 4697 37CA 8197" /* °¡Æó.ѾQsÒF—7Ê— */
- $"A8C6 89C1 FF78 99EB 31B8 5F88 7B08 C557" /* ¨Æ‰Áÿx™ë1¸_ˆ{.ÅW */
- $"5483 A35C 0713 94D5 D2DF B84C 36CA D9EC" /* Tƒ£\..”ÕÒ߸L6ÊÙì */
- $"8FC7 A305 814F 8B04 07D2 E391 5E89 43FE" /* Ç£.O‹..Òã‘^‰Cþ */
- $"6C67 4343 91DB DD56 C1D2 FEA6 9F1F 346F" /* lgCC‘ÛÝVÁÒþ¦Ÿ.4o */
- $"714B 79E1 7AC7 53A1 9934 69F4 E886 5A9C" /* qKyázÇS¡™4iôè†Zœ */
- $"6F9A D26F DD48 5F60 A72A 7E20 77F8 1BE8" /* ošÒoÝH_`§*~ wø.è */
- $"91B9 9018 8124 7694 3664 4202 7B94 1007" /* ‘¹.$v”6dB.{”.. */
- $"4234 15FC 04A2 6DE0 DC6B 5EDE 4332 F592" /* B4.ü.¢màÜk^ÞC2õ’ */
- $"779A A3BD 8E84 5464 DE08 6BAE AE2F 6EEF" /* wš£½Ž„TdÞ.k®®/nï */
- $"CB75 5862 59D8 1362 5D60 79D2 137C 7606" /* ËuXbYØ.b]`yÒ.|v. */
- $"F2B1 06DE 8A2F B76A A7D9 84DB 8F52 1107" /* ò±.ÞŠ/·j§Ù„ÛR.. */
- $"A42C 9803 2476 0448 42C9 A9E5 D0F5 9110" /* ¤,˜.$v.HBÉ©åÐõ‘. */
- $"2FAB AAF4 0752 81C9 6064 B8F7 6CEB 438E" /* /«ªô.RÉ`d¸÷lëCŽ */
- $"DC4B 916C 21F0 1C8F 2A6A 1919 9E26 2B36" /* ÜK‘l!ð.*j..ž&+6 */
- $"3E51 F543 F7C5 2549 66D0 2F14 D18F 42F1" /* >QõC÷Å%IfÐ/.ÑBñ */
- $"397B BA52 99ED 853C E07D 629B 92A1 2589" /* 9{ºR™í…<à}b›’¡%‰ */
- $"B3A9 B812 DC8D A368 3204 F8AA 7549 AF2B" /* ³©¸.Ü£h2.øªuI¯+ */
- $"2DE7 529C 1ECB 9747 A4B8 F6EC 8DDC 0AC4" /* -çRœ.Ë—G¤¸öìÜÂÄ */
- $"2C31 F042 C407 3F18 FD32 9280 60E4 60D8" /* ,1ðBÄ.?.ý2’€`ä`Ø */
- $"77B5 C019 A5FF 6E0D 8E35 A78E C7AA E95B" /* wµÀ.¥ÿn.Ž5§ŽÇªé[ */
- $"D37C D883 5DD2 756B 385A 08BB 7708 AA5E" /* Ó|؃]Òuk8Z.»w.ª^ */
- $"5B89 0628 F831 7775 3555 A523 BF2F 721A" /* [‰.(ø1wu5U¥#¿/r. */
- $"099B E6B4 5128 9EA6 41E1 9B8B 18C1 928C" /* Æ›æ´Q(ž¦Aᛋ.Á’Œ */
- $"72A0 BD1E 84D6 836A C947 0982 284A 9238" /* r ½.„ÖƒjÉGÆ‚(J’8 */
- $"A06F E390 1BD5 BBFD 323F BA86 2091 BAD5" /*  oã.Õ»ý2?º† ‘ºÕ */
- $"351D 16C5 1D44 E8C7 66C7 D469 047D 5548" /* 5..Å.DèÇfÇÔi.}UH */
- $"7049 7B42 B682 DF4C 68DE B5D2 2EDC C105" /* pI{B¶‚ßLhÞµÒ.ÜÁ. */
- $"4047 9A7E 0403 F48B 6215 C3ED 8DBA 12E9" /* @Gš~..ô‹b.Ãíº.é */
- $"EEFB B61B 906E F6F6 DDFD D030 CD1C 47FD" /* îû¶.nööÝýÐ0Í.Gý */
- $"7C37 E7C7 DC08 213E 3C33 08E6 74A0 F400" /* |7çÇÜ.!><3.æt ô. */
- $"7CFC 3B85 1A2E 5ACA 573F F24C 7D2C 0E3B" /* |ü;…..ZÊW?òL},.; */
- $"2A6D CEDC 6C9C 6E97 A572 915F A892 3833" /* *mÎÜlœn—¥r‘_¨’83 */
- $"A08F 0070 A602 FB49 0EA6 62FC 4237 C568" /*  .p¦.ûI.¦büB7Åh */
- $"E937 1DC1 1FC2 C3F1 AA30 AC4D DDB8 E747" /* é7.Á.ÂÃñª0¬MݸçG */
- $"5EE4 FD73 8124 56EB ADBE 6DB3 F27B 80C0" /* ^äýs$Vë­¾m³ò{€À */
- $"E536 971B 511B C76B AB20 8BA4 4DCD BFCB" /* å6—.Q.Çk« ‹¤MÍ¿Ë */
- $"4A0C 34DC 3DDC 9BEF 5122 89D0 99D1 9BE7" /* J.4Ü=Ü›ïQ"‰Ð™Ñ›ç */
- $"8840 002A A77A 25E2 9C2C F9BC 78F9 FB0E" /* ˆ@.*§z%âœ,ù¼xùû. */
- $"0DB7 4F14 B07A 12F6 65D3 ABE1 660D A84A" /* .·O.°z.öeÓ«áf.¨J */
- $"EFF9 A799 1852 8ED0 9582 B79A D812 1BE6" /* ïù§™.RŽÐ•‚·šØ..æ */
- $"F3D0 D5FA 9C76 5EBD DBFD 42A9 F7B3 885E" /* óÐÕúœv^½ÛýB©÷³ˆ^ */
- $"4A68 DBE7 9663 FB7F 1AC4 5004 197F 97F0" /* JhÛç–cû..ÄP...—ð */
- $"F57B 135D 19ED E0E0 1C84 139C BA3B 2493" /* õ{.].íàà.„.œº;$“ */
- $"D997 333D B6A7 9E83 619C FCE9 9875 134D" /* Ù—3=¶§žƒaœüé˜u.M */
- $"4B31 FCB3 5808 B917 C8BB 0B67 4564 488E" /* K1ü³X.¹.È».gEdHŽ */
- $"3554 8125 C3A4 DB4A 0BB2 E501 244C 1F49" /* 5T%äÛJ.²å.$L.I */
- $"C6A7 51E4 6C51 A134 3DF4 CE21 2993 FF3B" /* ƧQälQ¡4=ôÎ!)“ÿ; */
- $"80F6 AE0B B9F8 D1D5 8853 4531 6806 4F3E" /* €ö®.¹øÑÕˆSE1h.O> */
- $"D2B6 5F62 796A 683C D3C9 A22B 6D56 C497" /* Ò¶_byjh<ÓÉ¢+mVÄ— */
- $"D854 2E14 C281 0F94 0220 BEE7 3754 D077" /* ØT..Â.”. ¾ç7TÐw */
- $"EDB0 0F0E 95C1 A40B 55C9 B5AE 4DA8 A8A6" /* í°..•Á¤.Uɵ®M¨¨¦ */
- $"ADD6 4A11 DE81 B148 70D3 FA4F 795C 9171" /* ­ÖJ.Þ±HpÓúOy\‘q */
- $"C72E 7EF2 454C 0336 BE4A EE68 960E 25BA" /* Ç.~òEL.6¾Jîh–.%º */
- $"E686 01F4 6FF5 3C7C 8B33 60D8 24D3 70A1" /* æ†.ôoõ<|‹3`Ø$Óp¡ */
- $"06C6 E616 29D4 63D6 3334 379F 743E 745D" /* .Ææ.)ÔcÖ347Ÿt>t] */
- $"4EF5 ECB5 072E 9F62 0750 F7BA 6FDE B6B0" /* Nõìµ..Ÿb.P÷ºoÞ¶° */
- $"0BD0 4FCC 8F59 9B13 0C77 0A30 9BAE DF36" /* .ÐOÌY›..wÂ0›®ß6 */
- $"B13D D861 E92A 12C7 EC7A 0946 BF20 1E31" /* ±=Øaé*.ÇìzÆF¿ .1 */
- $"1FEE EE88 EFC6 C1C1 0DE2 3850 C97F 01DF" /* .îîˆïÆÁÁ.â8PÉ..ß */
- $"F021 605A D52A 570D 7089 0C1B B3FE 8B4D" /* ð!`ZÕ*W.p‰..³þ‹M */
- $"E441 70AC 5F71 3FCE 527F EBF4 048A A307" /* äAp¬_q?ÎR.ëô.Š£. */
- $"CEFD 4EB0 87ED BFE2 A36C 51B9 EAD3 37C6" /* ÎýN°‡í¿â£lQ¹êÓ7Æ */
- $"E8F0 9A3D 8F78 8747 81D4 33F0 9EEB 5EA0" /* èðš=x‡GÔ3ðžë^  */
- $"6FE0 A580 6B6B C126 1CE3 F1B2 DC9C CFCE" /* oीkkÁ&.ãñ²ÜœÏÎ */
- $"42EE 7E91 EF2F 0DDF CFDE 75EB 554D 6941" /* Bî~‘ï/.ßÏÞuëUMiA */
- $"07A5 21BE AD52 7CC1 49B5 FE74 AE40 F70F" /* .¥!¾­R|ÁIµþt®@÷. */
- $"AB3B 0C16 98F5 7742 3DCE 842D 0B2B 2FEB" /* «;..˜õwB=΄-.+/ë */
- $"5E90 DEBC 8BA9 81AC 40CC 0030 2853 FE9C" /* ^Þ¼‹©¬@Ì.0(Sþœ */
- $"6FC2 569B 2CD1 6200 2881 802D 7697 8442" /* oÂV›,Ñb.(€-v—„B */
- $"92C8 666B BC90 3252 F4D3 9BD2 AD14 0027" /* ’Èfk¼2RôÓ›Ò­..' */
- $"CE11 F5A4 437B 3F80 B250 AA4C 23B6 AD83" /* Î.õ¤C{?€²PªL#¶­ƒ */
- $"277E 5EF0 8132 6331 9325 D1A3 CFB6 6F73" /* '~^ð2c1“%ѣ϶os */
- $"D37D 780F 91CC CD40 6234 2FE2 F097 1681" /* Ó}x.‘ÌÍ@b4/âð—. */
- $"6097 88BD BFFF 18F5 2CBB FF67 FDBC 2F07" /* `—ˆ½¿ÿ.õ,»ÿgý¼/. */
- $"67FF 7FFF 1946 84C7 A551 03FF 7F52 A7C2" /* gÿ.ÿ.F„Ç¥Q.ÿ.R§Â */
- $"8AC8 1080 56FF 0C48 1804 A884 A5A2 08FF" /* ŠÈ.€Vÿ.H..¨„¥¢.ÿ */
- $"7FF5 3220 8043 9005 C25D DE15 02FB 7F2B" /* .õ2 €C.Â]Þ..û.+ */
- $"8205 5CA8 40BE EFB1 78F0 2656 2AD4 14FF" /* ‚.\¨@¾ï±xð&V*Ô.ÿ */
- $"7505 20CD 8BE2 8B15 47BB 9E26 105E 15DD" /* u. Í‹â‹.G»ž&.^.Ý */
- $"21A7 82AE E19D FE27 5D8B DDAD E13B D5AD" /* !§‚®áþ']‹Ý­á;Õ­ */
- $"1974 E6EE 9F68 4679 00C0 9D09 0BC1 7CFB" /* .tæîŸhFy.ÀÆ.Á|û */
- $"0F2C 9F4E 082C 2CB4 569B A7B0 0009 E098" /* .,ŸN.,,´V›§°.Æà˜ */
- $"9AB0 9892 B1FF 6957 1D78 2613 4289 24C6" /* š°˜’±ÿiW.x&.B‰$Æ */
- $"12BC E2EF C9AE E6D9 784F C157 77AB 3470" /* .¼âïÉ®æÙxOÁWw«4p */
- $"D8C7 C746 1978 322D D4E9 FA24 B8B2 5054" /* ØÇÇF.x2-Ôéú$¸²PT */
- $"D643 8270 9090 D6D8 0C24 16E5 1146 421C" /* ÖC‚pÖØ.$.å.FB. */
- $"D6A2 40D9 1864 A800 0000 0000 0001 4554" /* Ö¢@Ù.d¨.......ET */
- $"031E 793B 33D3 FD4A CE0A 3D8A 9D46 37B0" /* ..y;3ÓýJÎÂ=ŠF7° */
- $"4D2C 6F04 2BFF 071C 023F E153 6688 1815" /* M,o.+ÿ...?áSfˆ.. */
- $"BA20 BF61 DDDF 2979 84E3 3348 50F6 E9B8" /* º ¿aÝß)y„ã3HPöé¸ */
- $"634A 8937 FF7F F1AE E84B C95A 771F 4C9C" /* cJ‰7ÿ.ñ®èKÉZw.Lœ */
- $"3FFE 0734 7D7F 6E35 4A2E 21E0 E52F FF7E" /* ?þ.4}.n5J.!àå/ÿ~ */
- $"8532 8513 7869 A6E6 495D 3E58 F349 1EF5" /* …2….xi¦æI]>XóI.õ */
- $"886C 6441 9091 82E8 0C24 1507 0E02 A105" /* ˆldA‘‚è.$....¡. */
- $"95C5 1409 096C 9A37 F758 F13A 5ABF 149E" /* •Å.ÆÆlš7÷Xñ:Z¿.ž */
- $"DA31 52E9 0DA9 0BFF 45EB 20C7 1A1C E54C" /* Ú1Ré.©.ÿEë Ç..åL */
- $"29D1 6C8E D1EC 9D59 F945 4303 373F FF7F" /* )ÑlŽÑìYùEC.7?ÿ. */
- $"CE95 B027 88F7 AB06 28B9 92E7 D540 BC2B" /* Ε°'ˆ÷«.(¹’çÕ@¼+ */
- $"7167 8C6C C87E 32B0 C904 7D7D 278E E519" /* qgŒlÈ~2°É.}}'Žå. */
- $"707D 2C42 1714 C425 F9D0 DC01 D910 23DB" /* p},B..Ä%ùÐÜ.Ù.#Û */
- $"E7F3 391C A4E6 FAE1 C850 5A1F 456A 6690" /* çó9.¤æúáÈPZ.Ejf */
- $"3F37 F970 3841 73D3 1095 39CF 10A3 40F8" /* ?7ùp8AsÓ.•9Ï.£@ø */
- $"4CCC 4985 E3D5 127F 7CF4 92BC DCE9 2335" /* LÌI…ãÕ..|ô’¼Üé#5 */
- $"43FB 7460 8D5C C121 CFF2 1165 1CCE BBB2" /* Cût`\Á!Ïò.e.λ² */
- $"5EA8 0279 2C97 E45B A43D 328C 7A6C 5EBC" /* ^¨.y,—ä[¤=2Œzl^¼ */
- $"61DD BB2C E34E 25E4 1725 3C6B EC12 BFEF" /* aÝ»,ãN%ä.%<kì.¿ï */
- $"3E5E 0ACF 766D 9D4E 8978 2AC5 F138 755A" /* >^ÂÏvmN‰x*Åñ8uZ */
- $"CBDD 8421 F74E 9A07 A070 16ED 100C 769A" /* ËÝ„!÷Nš. p.í..vš */
- $"6571 1FA0 4D62 8ADC A3F1 0AAA 2253 1A39" /* eq. MbŠÜ£ñª"S.9 */
- $"0006 DF51 B09A 2267 BA13 3AD9 0120 8520" /* ..ßQ°š"gº.:Ù. … */
- $"7375 BB11 0715 9FFF 7FFF 276F 9A44 4D02" /* su»...Ÿÿ.ÿ'ošDM. */
- $"9DF2 BE32 729A 8C71 FBC9 4C73 FA4B 1D24" /* ò¾2ršŒqûÉLsúK.$ */
- $"4115 B69E 4FFF 7FFF 45B5 7091 9925 CEBD" /* A.¶žOÿ.ÿEµp‘™%ν */
- $"6A4E 1AA3 BFFF 7FFD AA3B 4043 EE5A 76B0" /* jN.£¿ÿ.ýª;@CîZv° */
- $"A073 CF17 7A58 3A06 649C B972 3CB8 897B" /*  sÏ.zX:.dœ¹r<¸‰{ */
- $"31E2 637A 05AC 83FA B94C 0F75 7113 FF7B" /* 1âcz.¬ƒú¹L.uq.ÿ{ */
- $"E690 225A FB16 A961 626A B7FE 22EF 864B" /* æ"Zû.©abj·þ"ï†K */
- $"F464 1D62 4127 02B3 DB08 1C01 3ECE 1326" /* ôd.bA'.³Û...>Î.& */
- $"CF03 BF05 5771 4992 75FE 29FC 5FFF 60D5" /* Ï.¿.WqI’uþ)ü_ÿ`Õ */
- $"DCC3 1B1F 40FF 6990 DC69 3E47 D09A 6E6A" /* ÜÃ..@ÿiÜi>GКnj */
- $"2866 9BA8 D74C BAAA 204E 05F9 DBFE E679" /* (f›¨×Lºª N.ùÛþæy */
- $"E76C 383D 9F92 BB32 1E14 2CA1 CBD5 E93C" /* çl8=Ÿ’»2..,¡ËÕé< */
- $"6C00 DFA2 B04F D650 3F14 60FF 7F73 29C3" /* l.ߢ°OÖP?.`ÿ.s)à */
- $"E20E 5672 C31B 6D72 FDCF 8097 B8B0 1482" /* â.VrÃ.mrýÏ€—¸°.‚ */
- $"C37E 4C4A 28FA 6E67 F061 E00C 371B 8655" /* Ã~LJ(úngðaà.7.†U */
- $"BDCB 2942 6AB1 0E31 38D3 6948 0D3F 6FEF" /* ½Ë)Bj±.18ÓiH.?oï */
- $"C2AB 669A E502 2490 C158 FC07 05F0 348A" /* «fšå.$ÁXü..ð4Š */
- $"0505 F0B2 E7E3 F934 19DA 2DB9 9686 603E" /* ..ð²çãù4.Ú-¹–†`> */
- $"C2C3 4B2F EB95 FB4E 62D2 F085 4364 9DCA" /* ÂÃK/ë•ûNbÒð…CdÊ */
- $"A6E8 94F8 CC41 2603 5BFC 4E90 C05F 068D" /* ¦è”øÌA&.[üNÀ_. */
- $"414C 618C 8860 58B1 7059 0B4C 39E8 FB58" /* ALaŒˆ`X±pY.L9èûX */
- $"C413 43C6 BF39 CC12 6E5B F65C F671 DD29" /* Ä.CÆ¿9Ì.n[ö\öqÝ) */
- $"8A03 BC15 FF06 2028 49E4 BF04 E6FC D4FD" /* Š.¼.ÿ. (Iä¿.æüÔý */
- $"401A CB9C 5F7F EFE7 8F41 E707 7803 9F1A" /* @.Ëœ_.ïçAç.x.Ÿ. */
- $"715F 951E E63A 9B4C 1404 32AA B5B7 98B0" /* q_•.æ:›L..2ªµ·˜° */
- $"D5F4 CD69 DD15 9E81 D2FD 09F7 462D AF3E" /* ÕôÍiÝ.žÒýÆ÷F-¯> */
- $"31DA 85C4 5053 8460 C06C 7018 908C 4821" /* 1Ú…ÄPS„`Àlp.ŒH! */
- $"D8AB AC44 7666 44D1 EA04 8979 3A4A A0FE" /* Ø«¬DvfDÑê.‰y:J þ */
- $"27D7 B0C3 DBAA 5233 F376 3CA8 4968 DF8A" /* '×°ÃÛªR3óv<¨Ihߊ */
- $"874C 2117 6A15 4664 03FF 7FFF 7F7C 2D12" /* ‡L!.j.Fd.ÿ.ÿ.|-. */
- $"B28B 8A4C 6D72 1106 16E0 BF7F 9822 2424" /* ²‹ŠLmr...à¿.˜"$$ */
- $"3C1B CBC8 2F76 1AC7 FF7F FF7F EB42 22AA" /* <.ËÈ/v.Çÿ.ÿ.ëB"ª */
- $"F30A 0C9D 6086 E561 E1BC C1D9 4E7F FADF" /* óÂ.`†åaá¼ÁÙN.úß */
- $"A85C B34C E2D4 FCF6 1A29 34F3 3B42 1DFC" /* ¨\³LâÔüö.)4ó;B.ü */
- $"C6BD 370B D203 B0C4 1C7D C348 1EE7 EAD9" /* ƽ7.Ò.°Ä.}ÃH.çêÙ */
- $"3145 E7FB 36CC 8E64 AB70 81DC 65E1 2C1D" /* 1Eçû6ÌŽd«pÜeá,. */
- $"9CB5 18A0 1C95 7DE2 96DF C185 7A40 50C7" /* œµ. .•}â–ßÁ…z@PÇ */
- $"E32C FCC1 FF6B 14F5 05FE 0E1C 8757 8D82" /* ã,üÁÿk.õ.þ..‡W‚ */
- $"3A41 284E 2906 8316 564F F479 4DCF FF7E" /* :A(N).ƒ.VOôyMÏÿ~ */
- $"5F11 3745 AC7F ED8D BC93 4205 7E12 E036" /* _.7E¬.í¼“B.~.à6 */
- $"0BE4 4B4F F99C F369 6B38 263E 63EC 6311" /* .äKOùœóik8&>cìc. */
- $"D577 8B5D 7957 D24D 7D64 A2B5 1107 4625" /* Õw‹]yWÒM}d¢µ..F% */
- $"E1EB 2460 41A2 E878 5967 CEAE AE16 D8D5" /* áë$`A¢èxYgή®.ØÕ */
- $"F960 B484 0B49 7253 26F2 714E 6A13 03E4" /* ù`´„.IrS&òqNj..ä */
- $"A0C3 3924 31ED 8B79 3D63 5412 C097 F9C3" /*  Ã9$1í‹y=cT.À—ùÃ */
- $"79AD A97D EEE5 EF23 66FF 15BD C854 5DFB" /* y­©}îåï#fÿ.½ÈT]û */
- $"5921 E05C 6A39 B68E 6444 6D55 3B7D 6DDA" /* Y!à\j9¶ŽdDmU;}mÚ */
- $"9003 8F53 5C49 D978 31CD 41C5 DD62 7DE4" /* .S\IÙx1ÍAÅÝb}ä */
- $"2F24 5932 A14F 9C9C 97B6 2652 5988 7970" /* /$Y2¡Oœœ—¶&RYˆyp */
- $"F890 8A5C 9614 EBF4 DAC8 15D1 6F3C 07E4" /* øŠ\–.ëôÚÈ.Ño<.ä */
- $"7B8B F763 6803 394F 2291 8D88 EB1B 3136" /* {‹÷ch.9O"‘ˆë.16 */
- $"10C9 5077 060A 7DB0 A890 CB7B 947F AD8B" /* .ÉPw.Â}°¨Ë{”.­‹ */
- $"0AAF 67FF 5D78 615A E459 013B 6923 5E0E" /* ¯gÿ]xaZäY.;i#^. */
- $"900D BA9C DFF2 37D0 0508 B5F3 EA48 FADE" /* .ºœßò7Ð..µóêHúÞ */
- $"D348 3F2F 8E71 E6CD B6BE 8941 8773 0E17" /* ÓH?/ŽqæͶ¾‰A‡s.. */
- $"E97A B699 5A4F 21C1 0766 538B B29A B8CA" /* éz¶™ZO!Á.fS‹²š¸Ê */
- $"FBAE 21FA 76A0 B197 C613 E523 B127 1FE4" /* û®!úv ±—Æ.å#±'.ä */
- $"0AA8 798D 688E 8F27 E386 446F 0BD2 C6A5" /* ¨yhŽ'ã†Do.ÒÆ¥ */
- $"99B7 9313 67B5 4823 BD88 3611 E5A8 8054" /* ™·“.gµH#½ˆ6.娀T */
- $"3C15 C120 1B02 5B2A 2195 DD25 F90A 48A6" /* <.Á ..[*!•Ý%ùÂH¦ */
- $"BF92 56B9 4639 F2BD AC5F 3350 9699 14A7" /* ¿’V¹F9ò½¬_3P–™.§ */
- $"30A2 4B91 C33D 3175 F806 15AA 4B01 558F" /* 0¢K‘Ã=1uø..ªK.U */
- $"400B 8148 DAF5 29FD 0561 1CA8 7239 51F4" /* @.HÚõ)ý.a.¨r9Qô */
- $"A169 A92B EE2F 4F3D 2F96 029B 186B 7219" /* ¡i©+î/O=/–.›.kr. */
- $"C673 0E85 6FAC 9889 C64A 90AE DBAF E8E3" /* Æs.…o¬˜‰ÆJ®Û¯èã */
- $"6607 DF2A C332 C690 840A 817A ABFF 3302" /* f.ß*Ã2Æ„Âz«ÿ3. */
- $"1464 A65F E1B3 04B0 90C6 51E5 6A2E 7EA2" /* .d¦_á³.°ÆQåj.~¢ */
- $"9222 EABA 0632 2F13 B1A3 2337 85B4 E390" /* ’"êº.2/.±£#7…´ã */
- $"766A 98DB BDDD 9813 F7BD 8AEA 1AB2 BEEC" /* vj˜Û½Ý˜.÷½Šê.²¾ì */
- $"BEE3 F4B7 EE35 6BB8 ADE1 E772 AEB0 7E66" /* ¾ãô·î5k¸­áçr®°~f */
- $"3F99 05C1 3339 69B2 C1D5 4CC7 DB0B 3C67" /* ?™.Á39i²ÁÕLÇÛ.<g */
- $"7F80 43C8 7B29 FA49 8C64 3FEB 6406 35FE" /* .€CÈ{)úIŒd?ëd.5þ */
- $"FAEB 4922 9410 5352 D4C0 00CB 72EA 56CE" /* úëI"”.SRÔÀ.ËrêVÎ */
- $"22F8 673A D3E8 AAFA E992 5B7F 827C A83D" /* "øg:Óèªúé’[.‚|¨= */
- $"586F 54B4 69F8 C6B7 FF14 CFD4 4069 C50F" /* XoT´iøÆ·ÿ.ÏÔ@iÅ. */
- $"9E23 797E DE78 5B86 FCAE BDE5 B920 9551" /* ž#y~Þx[†ü®½å¹ •Q */
- $"22EC 4155 0582 10F4 BF8C 144A 3251 97F3" /* "ìAU.‚.ô¿Œ.J2Q—ó */
- $"2E7D 1E04 969B 4C15 8BDB FAC1 9743 2B6C" /* .}..–›L.‹ÛúÁ—C+l */
- $"6EF5 C95E 47CB A380 A635 C17D AD97 42EA" /* nõÉ^GË£€¦5Á}­—Bê */
- $"88A1 A63E FC76 A19C AE08 C868 115F 098D" /* ˆ¡¦>üv¡œ®.Èh._Æ */
- $"A1BE 16D4 3BF4 91C9 6CF1 DBE0 E0CA 0DAA" /* ¡¾.Ô;ô‘ÉlñÛààÊ.ª */
- $"EFCB 2A06 908B 7BAC CCF3 4CF8 179A 615E" /* ïË*.‹{¬ÌóLø.ša^ */
- $"590D AB18 CB49 E032 B8ED 2A8E 584A ACDC" /* Y.«.ËIà2¸í*ŽXJ¬Ü */
- $"4797 F732 B8C9 24A4 0E5C 85A0 FED8 E30A" /* G—÷2¸É$¤.\… þØã */
- $"ECBF 08FB CDC1 E09D 9556 837A E086 95AC" /* ì¿.ûÍÁà•Vƒzà†•¬ */
- $"BA2C E411 756E F132 9CE6 EDC4 6C90 B09E" /* º,ä.unñ2œæíÄl°ž */
- $"3C59 DE78 44D0 E445 BCA0 3AE0 05D9 7440" /* <YÞxDÐäE¼ :à.Ùt@ */
- $"F09F 10EA E0BA 4596 84F5 81A2 550E 57A7" /* ðŸ.êàºE–„õ¢U.W§ */
- $"F2A8 B2DD D612 A18F D74A 671D B70C 994A" /* ò¨²ÝÖ.¡×Jg.·.™J */
- $"9441 8E10 12B8 80F0 6249 2075 CD39 3667" /* ”AŽ..¸€ðbI uÍ96g */
- $"6632 AFDD 5E48 6B22 15CC 179A C6FA 47AE" /* f2¯Ý^Hk".Ì.šÆúG® */
- $"66AF 7AFB 033D 03F1 B829 B852 F1BF 55DB" /* f¯zû.=.ñ¸)¸Rñ¿UÛ */
- $"17F6 E1EF A955 F266 ACFE 75F4 34FC 38B0" /* .öáï©Uòf¬þuô4ü8° */
- $"0068 7DD6 016E 98D4 57DB 6220 D269 4BE9" /* .h}Ö.n˜ÔWÛb ÒiKé */
- $"8007 22E8 9D82 8FCE EB41 317B D0FA 323B" /* €."è‚ÎëA1{Ðú2; */
- $"B2C0 06D3 99E3 ED9A 2423 78CD AE34 CF5B" /* ²À.Ó™ãíš$#xÍ®4Ï[ */
- $"58DA 8F69 9604 4804 8682 B58C C1DA 1E21" /* XÚi–.H.†‚µŒÁÚ.! */
- $"0E4E F709 83E1 B335 F208 6565 C882 70A0" /* .N÷ƃá³5ò.eeÈ‚p  */
- $"2F58 5379 3999 7F2E E63D 81E4 C2EB 58E3" /* /XSy9™..æ=äÂëXã */
- $"4605 35E7 76D7 C7D0 AEDA 26C5 8BB6 0F99" /* F.5çv×ÇЮÚ&Å‹¶.™ */
- $"77C0 D3D6 9870 8279 4C2E 29C6 518F 13E6" /* wÀÓÖ˜p‚yL.)ÆQ.æ */
- $"1373 FCB8 FD55 3D8F 8322 F8F4 CD80 3C09" /* .sü¸ýU=ƒ"øôÍ€<Æ */
- $"1496 931A E1BF 0AE6 2842 6FF7 6986 6AEE" /* .–“.á¿Âæ(Bo÷i†jî */
- $"1AE9 FF0A 947D E3F6 D93F B59B F6D5 5FB6" /* .éÿ”}ãöÙ?µ›öÕ_¶ */
- $"AAC7 EDD1 1FDB 5A5F 5549 7D55 2E1F B6A4" /* ªÇíÑ.ÛZ_UI}U..¶¤ */
- $"FDAA F7D4 DF7D 4E80 F173 72EC 2AD6 46CC" /* ýª÷Ôß}N€ñsrì*ÖFÌ */
- $"6653 9F8A F548 8CD9 F7CC 0758 DFBD 1976" /* fSŸŠõHŒÙ÷Ì.Xß½.v */
- $"0832 03BE 1A6C 242F 4978 025D 37A6 D46A" /* .2.¾.l$/Ix.]7¦Ôj */
- $"B859 037D 5250 D0D6 8FC0 4C05 AAAB 7F38" /* ¸Y.}RPÐÖÀL.ª«.8 */
- $"799B 43F9 E370 D367 B412 8CC2 F941 E270" /* y›CùãpÓg´.ŒÂùAâp */
- $"A967 1978 577B 7A22 541A 7DDD A593 75E5" /* ©g.xW{z"T.}Ý¥“uå */
- $"6B05 D950 D953 DA5E 7EBF D5D3 4314 5006" /* k.ÙPÙSÚ^~¿ÕÓC.P. */
- $"8EC3 8474 6B41 83B3 7B16 9C95 721B 5405" /* ŽÃ„tkAƒ³{.œ•r.T. */
- $"F4AE A41F 92D8 56DA F2C9 4BF8 5B0A EBC6" /* ô®¤.’ØVÚòÉKø[ÂëÆ */
- $"29D5 F4F3 36B9 A6D7 3BC4 75D7 972C 7465" /* )Õôó6¹¦×;Äu×—,te */
- $"CCBE 21FA 6EAF 6B26 465B 4676 356D E640" /* ̾!ún¯k&F[Fv5mæ@ */
- $"04C3 0E39 C431 FBA5 2B53 E001 8F9D 37F5" /* .Ã.9Ä1û¥+Sà.7õ */
- $"F289 EC84 85B8 5FC3 F74A 734B E0B1 ED8C" /* ò‰ì„…¸_Ã÷JsKà±íŒ */
- $"5DF4 6678 22E4 887C A45B 1478 DFC3 A9E9" /* ]ôfx"äˆ|¤[.xßéé */
- $"F234 5723 01B3 2685 2754 8133 8699 21C8" /* ò4W#.³&…'T3†™!È */
- $"180A 27F8 174C FED5 8F71 4082 C4E8 DB83" /* .Â'ø.LþÕq@‚ÄèÛƒ */
- $"BDA4 4506 3FA4 5286 5D63 00F7 905D A740" /* ½¤E.?¤R†]c.÷]§@ */
- $"5251 07FA 22F8 1334 FBA6 5640 7199 FA41" /* RQ.ú"ø.4û¦V@q™úA */
- $"A3C7 3CC1 ECF5 7F43 A9AE FBD5 C1F0 18B3" /* £Ç<Áìõ.C©®ûÕÁð.³ */
- $"7072 4809 0A4C 8127 6E10 5F7C 335C CC28" /* prHÆÂL'n._|3\Ì( */
- $"B723 3D12 724D 3DE5 37B3 1C2A 136D 2258" /* ·#=.rM=å7³.*.m"X */
- $"DCE6 BFA4 0DAD FB6E 72C1 70F7 6D71 785D" /* Ü濤.­ûnrÁp÷mqx] */
- $"BC75 69CE CE3B CF7A 170E 8343 CBA9 DE66" /* ¼uiÎÎ;Ïz..ƒCË©Þf */
- $"06ED 779C AA9F F28D 943D 5E3E DEDE 4769" /* .íwœªŸò”=^>ÞÞGi */
- $"289C 5523 9792 EFAC 19A6 A945 B504 9446" /* (œU#—’ï¬.¦©Eµ.”F */
- $"A4DF BAA6 B5EB BAEF 7B92 3E08 6D17 870F" /* ¤ßº¦µëºï{’>.m.‡. */
- $"9E0A 487E 8A60 90B5 E555 CD4F D2F1 FE67" /* žÂH~Š`µåUÍOÒñþg */
- $"88DE BB6A E653 A2B6 F9C7 B226 2544 A167" /* ˆÞ»jæS¢¶ùDz&%D¡g */
- $"5DF7 5F35 F38B DB99 30F8 C210 AF41 C7A4" /* ]÷_5ó‹Û™0øÂ.¯AǤ */
- $"167B 30B4 8B8D 0821 4ADB EFC6 5728 A86D" /* .{0´‹.!JÛïÆW(¨m */
- $"99A8 2A1D 51E2 4CE5 AEA5 7ECC 23CB 628B" /* ™¨*.QâL宥~Ì#Ëb‹ */
- $"E438 F41A A280 CF2E 8E51 5004 A9BA 64AB" /* ä8ô.¢€Ï.ŽQP.©ºd« */
- $"B0AA 608C 8C19 38F7 567B 0C45 B7C5 0E2D" /* °ª`ŒŒ.8÷V{.E·Å.- */
- $"0F3D A192 B0F5 A567 4EE1 9FF5 F085 979A" /* .=¡’°õ¥gNáŸõð…—š */
- $"13DA 6FC3 89D0 0370 C986 5F44 AADD CAB9" /* .ÚoÉÐ.pɆ_DªÝʹ */
- $"FBD0 8CDE 18D9 8FED 715E 264F 0D69 2CEF" /* ûÐŒÞ.Ùíq^&O.i,ï */
- $"63F0 7A64 D65B 094A 6976 E6D4 E3DC 1583" /* cðzdÖ[ÆJivæÔãÜ.ƒ */
- $"FE8C BD22 992E 3FDB AF18 03A7 0A74 8333" /* þŒ½"™.?Û¯..§Âtƒ3 */
- $"76E3 5195 C7FA A180 5123 7E0C 544B 9C8C" /* vãQ•Çú¡€Q#~.TKœŒ */
- $"928D 3DF6 F330 4D6E 8049 11AF 064E 4E3B" /* ’=öó0Mn€I.¯.NN; */
- $"B937 EE03 A4D2 F530 4513 47F0 5E98 E060" /* ¹7î.¤Òõ0E.Gð^˜à` */
- $"72C6 46EC B761 FAB4 B0FA 9A80 FF78 5408" /* rÆFì·aú´°úš€ÿxT. */
- $"9152 452E 0111 2383 5E5F 6C4F FC53 0EDE" /* ‘RE...#ƒ^_lOüS.Þ */
- $"1092 66D3 5F38 1AC8 1412 561A 4017 9110" /* .’fÓ_8.È..V.@.‘. */
- $"CA19 3E6F 8803 0908 5F57 A2E2 4744 E3C4" /* Ê.>oˆ.Æ._W¢âGDãÄ */
- $"F1BF 49F6 836F E294 610B 4098 2761 1502" /* ñ¿Iöƒoâ”a.@˜'a.. */
- $"CCB2 0C11 81DD 05B4 ACD8 8F28 C5DD 1DD8" /* ̲..Ý.´¬Ø(ÅÝ.Ø */
- $"58E0 C1E1 70A8 42BF 456F FE20 1261 1F81" /* XàÁáp¨B¿Eoþ .a. */
- $"08AC FEB1 F89C 3576 EF94 A20C 255F 3B3F" /* .¬þ±øœ5v.%_;? */
- $"5E6B B0C0 4B3F EADC 8536 55E9 8144 C946" /* ^k°ÀK?êÜ…6UéDÉF */
- $"7613 8662 DCB1 C761 2BDA 412D C7D6 2D5C" /* v.†bܱÇa+ÚA-ÇÖ-\ */
- $"BCC0 F84E 54E4 9B0B BDF7 4F45 FCA6 D6AE" /* ¼ÀøNTä›.½÷OEü¦Ö® */
- $"1754 31D1 E6CB 94F4 D163 2B1D 017D 4171" /* .T1ÑæË”ôÑc+..}Aq */
- $"ABE0 0285 395D 3D23 42D7 E641 348A 0C2E" /* «à.…9]=#B×æA4Š.. */
- $"9C16 42C9 8E99 B654 8046 C365 EA71 CE64" /* œ.BÉŽ™¶T€FÃeêqÎd */
- $"B762 0E4D 7C48 617B CDB9 6264 2C81 4A9F" /* ·b.M|Ha{͹bd,JŸ */
- $"8600 50B2 B985 EB73 DB96 82EA FF7D 1E50" /* †.P²¹…ësÛ–‚êÿ}.P */
- $"6A49 AEA3 78E3 2DFD 0D59 3013 F257 AAA9" /* jI®£xã-ý.Y0.òWª© */
- $"0E5D 81DA E983 8D48 41BE DF0B FB34 AEA5" /* .]ÚéƒHA¾ß.û4®¥ */
- $"07B6 B0AA 1E53 1D9F B9C7 4CE5 8D46 6151" /* .¶°ª.S.Ÿ¹ÇLåFaQ */
- $"8000 0C24 1D66 1946 1073 4456 2361 E486" /* €..$.f.F.sDV#aä† */
- $"120F 29F0 6121 2D6A AF51 0C82 F68C B571" /* ..)ða!-j¯Q.‚öŒµq */
- $"77AD BE59 9145 D105 DE8C 9500 0000 0000" /* w­¾Y‘EÑ.ÞŒ•..... */
- $"0000 0032 BC9A BD52 00B4 6C6F 3753 1A96" /* ...2¼š½R.´lo7S.– */
- $"9B00 FCD3 F055 A11A AFB1 FB95 1610 88D0" /* ›.üÓðU¡.¯±û•..ˆÐ */
- $"8D32 9653 FC10 55FD B965 C1A9 B6BD 2245" /* 2–Sü.Uý¹eÁ©¶½"E */
- $"D48B 8230 2EF5 56F1 6618 9F91 FEC4 4106" /* Ô‹‚0.õVñf.Ÿ‘þÄA. */
- $"F23B 7C8A 0320 79EA D7A0 D75F 09BD B985" /* ò;|Š. yê× ×_ƽ¹… */
- $"C22B E2F0 0508 64BA AA2F 2414 19D7 311D" /* Â+âð..dºª/$..×1. */
- $"F709 E05C 809B 9E62 83F8 FF13 2DE3 01D6" /* ÷Æà\€›žbƒøÿ.-ã.Ö */
- $"8ADC F118 5A80 77C8 DABC 2FB5 CEF6 FCFB" /* ŠÜñ.Z€wÈÚ¼/µÎöüû */
- $"7A94 2773 6CEC FAE2 7865 753C E612 E4AF" /* z”'slìúâxeu<æ.ä¯ */
- $"657C 5C67 8FB3 1E56 A319 1ED1 FE48 0D8D" /* e|\g³.V£..ÑþH. */
- $"2431 B10B 8E15 0A4B FF7F 7EB8 D068 5015" /* $1±.Ž.ÂKÿ.~¸ÐhP. */
- $"151E C37C 0390 F6CC 64A8 0000 0000 0000" /* ..Ã|.öÌd¨...... */
- $"0000 0002 5991 79E8 2B17 082C ABCB DA90" /* ....Y‘yè+..,«ËÚ */
- $"CE92 8CB0 E992 0710 2B8F CAAB D217 C4E9" /* Î’Œ°é’..+Ê«Ò.Äé */
- $"E55E 11D2 6200 B530 5EF4 6932 1CBF EA6C" /* å^.Òb.µ0^ôi2.¿êl */
- $"E58D 2AA9 68C2 89FF 7903 A6ED D674 F1FC" /* å*©h‰ÿy.¦íÖtñü */
- $"A256 3564 F7E0 4DDF CDA1 2729 F7FF 6EB2" /* ¢V5d÷àMßÍ¡')÷ÿn² */
- $"9D35 70A9 5447 924B B8E1 71D3 4A8A DECB" /* 5p©TG’K¸áqÓJŠÞË */
- $"93E1 8FA0 140E C9B7 6124 8020 D660 3D22" /* “á ..É·a$€ Ö`=" */
- $"C708 222E 7289 B890 0002 00E1 2BC6 84B9" /* Ç.".r‰¸...á+Æ„¹ */
- $"25DF 442F 97FF 7FEF 68EC 7325 B92C A150" /* %ßD/—ÿ.ïhìs%¹,¡P */
- $"EE19 48C3 2540 0000 0000 0000 0000 0749" /* î.HÃ%@.........I */
- $"DD4A 9891 375B B0E0 C176 A698 672E F295" /* ÝJ˜‘7[°àÁv¦˜g.ò• */
- $"0311 7B3E 2B87 B4B8 7FB3 5DF7 9C67 CBEA" /* ..{>+‡´¸.³]÷œgËê */
- $"6A19 4107 C9F4 2B19 6829 179A 3FFF 7E8C" /* j.A.Éô+.h).š?ÿ~Œ */
- $"44A2 15E8 8E37 B422 F825 1862 58FF 7FFE" /* D¢.èŽ7´"ø%.bXÿ.þ */
- $"8EA1 D38C 727A 3071 1FF0 541F 6AB4 EA83" /* Ž¡ÓŒrz0q.ðT.j´êƒ */
- $"44A0 086A BAD7 6966 FC5D 0E72 A66C C301" /* D .jº×ifü].r¦lÃ. */
- $"3E1F B82C 9192 20D5 0322 858F 224C 87F5" /* >.¸,‘’ Õ."…"L‡õ */
- $"E940 85ED 7B36 EC96 D05C 21FF 7B10 59E1" /* é@…í{6ì–Ð\!ÿ{.Yá */
- $"E125 6C79 7852 2031 F3BA 34FB 6E57 BC3B" /* á%lyxR 1óº4ûnW¼; */
- $"69F0 C303 3A2A A573 D1E0 9836 C703 D02C" /* iðÃ.:*¥sÑà˜6Ç.Ð, */
- $"58CC 3DA7 FF0D 4301 F607 07C1 31FA 7F66" /* XÌ=§ÿ.C.ö..Á1ú.f */
- $"89BD A759 90CD 107A E5BD 6398 D7BE F7BB" /* ‰½§YÍ.zå½c˜×¾÷» */
- $"E273 D09A F8EE D21B 1015 A513 18F5 5C7D" /* âsКøîÒ...¥..õ\} */
- $"FD20 E7C9 C6BE 3105 7A4B 831D 251B 4C36" /* ý çÉƾ1.zKƒ.%.L6 */
- $"2A49 3EAC 1A86 9F87 09CC 0B00 2CF4 643C" /* *I>¬.†Ÿ‡ÆÌ..,ôd< */
- $"7012 8574 D28F 952D E959 1093 FE7E F021" /* p.…tÒ•-éY.“þ~ð! */
- $"028C 74ED 0E90 8DCD 5F06 B4BE EA1A 4C53" /* .Œtí.Í_.´¾ê.LS */
- $"A47F 3706 93CB 8FAB 7864 D123 4A39 B6BA" /* ¤.7.“Ë«xdÑ#J9¶º */
- $"CDCB 8AA9 2128 54FA CFB5 C4E1 F470 AD6E" /* ÍËŠ©!(TúϵÄáôp­n */
- $"6A05 07C9 72AA 562E F22F C922 BCF9 7DDF" /* j..ÉrªV.ò/É"¼ù}ß */
- $"3565 1AD4 F707 7DC0 1038 129E 4EA0 297E" /* 5e.Ô÷.}À.8.žN )~ */
- $"1037 3516 64BB FF75 539A 5C03 F7A3 C14D" /* .75.d»ÿuSš\.÷£ÁM */
- $"C617 50C8 14F1 7C95 0372 1443 C3F0 7ED4" /* Æ.PÈ.ñ|•.r.CÃð~Ô */
- $"EFDA FA88 BDD2 E947 7A43 A4A3 2339 CD58" /* ïÚúˆ½ÒéGzC¤£#9ÍX */
- $"526C 8407 8211 1949 6431 DB89 390B EB27" /* Rl„.‚..Id1Û‰9.ë' */
- $"9975 F04F D507 AC80 5D51 95B0 992A 1AC6" /* ™uðOÕ.¬€]Q•°™*.Æ */
- $"8699 86CC E64E 441C 2EFD 4F8C 70C1 DB2A" /* †™†ÌæND..ýOŒpÁÛ* */
- $"5395 8DF7 E279 AA65 BA32 2FD1 48C9 F400" /* S•÷âyªeº2/ÑHÉô. */
- $"D0EA 663D 92FF 053E 130C A1A9 491B E583" /* Ðêf=’ÿ.>..¡©I.åƒ */
- $"6133 2EE1 AFBE 86B8 D218 B698 906D A5B9" /* a3.᯾†¸Ò.¶˜m¥¹ */
- $"ACD3 9DC7 8720 C668 E134 1A1C 9C71 EA49" /* ¬ÓLJ Æhá4..œqêI */
- $"7AE9 9276 56E9 78BB 5679 18E2 6044 2763" /* zé’vVéx»Vy.â`D'c */
- $"2342 64F4 3952 2712 F704 B2E8 C1D2 35CC" /* #Bdô9R'.÷.²èÁÒ5Ì */
- $"F0AB 5ABD 61A0 1CD5 5316 0E78 22E6 B807" /* ð«Z½a .ÕS..x"æ¸. */
- $"8774 CA36 91EF 0BFF D969 6330 3900 00D1" /* ‡tÊ6‘ï.ÿÙic09..Ñ */
- $"2300 0000 0C6A 5020 200D 0A87 0A00 0000" /* #....jP .‡Â... */
- $"1466 7479 706A 7032 2000 0000 006A 7032" /* .ftypjp2 ....jp2 */
- $"2000 0000 4F6A 7032 6800 0000 1669 6864" /* ...Ojp2h....ihd */
- $"7200 0002 0000 0002 0000 0407 0701 0000" /* r............... */
- $"0000 0F63 6F6C 7201 0000 0000 0010 0000" /* ...colr......... */
- $"0022 6364 6566 0004 0000 0000 0001 0003" /* ."cdef.......... */
- $"0001 0000 0001 0000 0002 0002 0000 0003" /* ................ */
- $"0000 0000 6A70 3263 FF4F FF51 0032 0000" /* ....jp2cÿOÿQ.2.. */
- $"0000 0200 0000 0200 0000 0000 0000 0000" /* ................ */
- $"0000 0200 0000 0200 0000 0000 0000 0000" /* ................ */
- $"0004 0701 0107 0101 0701 0107 0101 FF52" /* ..............ÿR */
- $"000C 0000 0001 0105 0404 0001 FF5C 0013" /* ............ÿ\.. */
- $"2050 5858 6058 5860 5858 6058 5858 5050" /* PXX`XX`XX`XXXPP */
- $"58FF 6400 1100 014B 616B 6164 752D 7635" /* Xÿd....Kakadu-v5 */
- $"2E32 2E31 FF90 000A 0000 0000 D036 0001" /* .2.1ÿ.Â....Ð6.. */
- $"FF93 CFC2 DC03 54F9 36EC A8DC 2A8C 3701" /* ÿ“ÏÂÜ.Tù6ì¨Ü*Œ7. */
- $"118B 95C3 F2B2 5A7A 0428 C30A 2C64 B704" /* .‹•Ãò²Zz.(ÃÂ,d·. */
- $"5C3C 6DED 8696 4890 6404 5638 430C 59C5" /* \<m톖Hd.V8C.YŠ*/
- $"D913 B06B 0B08 E00E 1802 6D82 7225 E695" /* Ù.°k..à...m‚r%æ• */
- $"9F1E E7B0 D1DF 323C 61DC 1F25 E3FF 83E2" /* Ÿ.ç°Ñß2<aÜ.%ãÿƒâ */
- $"A49A DED4 4495 A948 5B70 9E5A 01F1 2431" /* ¤šÞÔD•©H[pžZ.ñ$1 */
- $"8EE5 2B54 2863 9041 FAE9 9E9F 1B85 E206" /* Žå+T(cAú鞟.…â. */
- $"4104 106C 5027 632A 8716 C3A5 F047 B3D5" /* A..lP'c*‡.Ã¥ðG³Õ */
- $"EE2B 19CD 2B75 17D8 DFB6 E2BF 491E A41F" /* î+.Í+u.Ø߶â¿I.¤. */
- $"BC48 3493 DEFB 453D 64DE DEA0 68DB EF5B" /* ¼H4“ÞûE=dÞÞ hÛï[ */
- $"1E69 8F3F C55C 1FF6 1823 1543 F483 DF20" /* .i?Å\.ö.#.Côƒß */
- $"F5B4 08F4 5D20 4DF0 7D7D 2007 2ACA 5B5E" /* õ´.ô] Mð}} .*Ê[^ */
- $"159F EF4A 505D 811D A8A3 5476 5539 B45B" /* .ŸïJP].¨£TvU9´[ */
- $"3113 1AC7 00F3 F1A7 E9E3 9E88 5D91 6CD5" /* 1..Ç.óñ§é㞈]‘lÕ */
- $"2CC0 F92B 2063 FF29 4B0E 775A 06EE 75CC" /* ,Àù+ cÿ)K.wZ.îuÌ */
- $"DA54 AC2F B72D 1C25 1E46 A4F8 C3E1 7D8D" /* ÚT¬/·-.%.F¤øÃá} */
- $"85AE BBE6 3DBE EC4A 35F7 3B36 1FBF BC38" /* …®»æ=¾ìJ5÷;6.¿¼8 */
- $"2DC1 785C D644 2BED AB51 1950 2643 8730" /* -Áx\ÖD+í«Q.P&C‡0 */
- $"2AE9 E4EB 1B8E 8F90 BA0C FF2F 6F65 5F28" /* *éäë.Žº.ÿ/oe_( */
- $"1A3F 9398 FF20 01A2 69A0 02C9 8D1B C3EA" /* .?“˜ÿ .¢i .É.Ãê */
- $"A600 6417 3CA3 9E84 93EF 063D 59DC 702C" /* ¦.d.<£ž„“ï.=YÜp, */
- $"959D C3A6 B1ED DEF1 F321 5BA6 FCCD 7762" /* •Ã¦±íÞñó![¦üÍwb */
- $"6C23 7398 AA59 4BBA 0052 B8A7 0608 1AAC" /* l#s˜ªYKº.R¸§...¬ */
- $"5B2E AF60 17F4 278E 6433 6F75 7839 CED2" /* [.¯`.ô'Žd3oux9ÎÒ */
- $"F32E 5D7D 9D40 B145 4CFB A25C D8D7 4BCB" /* ó.]}@±ELû¢\Ø×KË */
- $"956D 88DD 4B92 64BF 4CD4 AFD5 6E56 9859" /* •mˆÝK’d¿LÔ¯ÕnV˜Y */
- $"ABEF BB40 AD0E 6E1F 9B3B 16A3 D9D3 58DF" /* «ï»@­.n.›;.£ÙÓXß */
- $"584E C303 1DAD D18B 6082 9C29 88EB 5163" /* XNÃ..­Ñ‹`‚œ)ˆëQc */
- $"A42D 061A 1570 64A9 0F1C E00D 56D9 E0CB" /* ¤-...pd©..à.VÙàË */
- $"7C66 799C 8EB4 BFCA CF5C CFC2 B611 4F0C" /* |fyœŽ´¿ÊÏ\϶.O. */
- $"AFDE 008C 3580 A270 0C1A 3737 50A1 9A89" /* ¯Þ.Œ5€¢p..77P¡š‰ */
- $"2546 BB2C 62A0 57BE 59CB C00A 1EE9 0F1D" /* %F»,b W¾YËÀÂ.é.. */
- $"C528 40D4 EA69 D281 AED4 B078 F27A 0B42" /* Å(@ÔêiÒ®Ô°xòz.B */
- $"7AD2 DADD 146B 7FFF 223D 6A74 2041 4FCF" /* zÒÚÝ.k.ÿ"=jt AOÏ */
- $"46E1 60C8 9ABE 841E E18D 1712 DB6D 902B" /* Fá`Èš¾„.á..Ûm+ */
- $"7BE6 56DA 7E4B 1704 A373 2802 B120 0184" /* {æVÚ~K..£s(.± .„ */
- $"0681 4499 2739 CE73 9CE8 99D8 C352 337C" /* .D™'9Îsœè™ØÃR3| */
- $"06AB BB71 6257 16EF B535 4972 8C2F 2EE0" /* .«»qbW.ïµ5IrŒ/.à */
- $"85CC 8431 D867 47EE CC43 6E87 A485 2316" /* …Ì„1ØgGîÌCn‡¤…#. */
- $"4927 AE22 C12D 49CE 739C E61C 97D0 99CC" /* I'®"Á-IÎsœæ.—Ð™Ì */
- $"3DC5 F26B 1A31 E742 3E56 464B 2944 108E" /* =Åòk.1çB>VFK)D.Ž */
- $"CB0C F4C7 E144 47E1 47C1 F6BD 8089 21DB" /* Ë.ôÇáDGáGÁö½€‰!Û */
- $"8279 4533 01BF B9CC C444 AD53 5F75 D706" /* ‚yE3.¿¹ÌÄD­S_u×. */
- $"3FDD CA27 5D6C 9F54 1CCF F838 38E4 B2E4" /* ?ÝÊ']lŸT.Ïø88ä²ä */
- $"F9FF 429F 59FE D27B 4A5E A69F 2C21 38F6" /* ùÿBŸYþÒ{J^¦Ÿ,!8ö */
- $"5A74 D405 2FEE 50B8 E5F1 C489 2693 5B33" /* ZtÔ./îP¸åñĉ&“[3 */
- $"D2C2 9DEC 68ED F55C 1FAC 1401 8D66 795A" /* ÒÂìhíõ\.¬..fyZ */
- $"F5F3 27A3 5874 6681 9AC6 F41D A4E6 40DA" /* õó'£XtfšÆô.¤æ@Ú */
- $"3EE5 CCEE 340C AF72 87FD 6B2A EB94 88EC" /* >åÌî4.¯r‡ýk*딈ì */
- $"A61D A536 7AC2 C6B8 85D9 CEBD 146C 83B5" /* ¦.¥6zÂƸ…Ùν.lƒµ */
- $"F5E0 A3C7 B524 BC64 B6B5 91A6 BF91 C547" /* õà£Çµ$¼d¶µ‘¦¿‘ÅG */
- $"BD87 811F D58E 8E51 BB89 FA6C 5257 33D9" /* ½‡.ÕŽŽQ»‰úlRW3Ù */
- $"A964 A4AB 3BB9 9608 BECC 0D9C D6B9 3D3A" /* ©d¤«;¹–.¾Ì.œÖ¹=: */
- $"CB64 28BE 3B07 6318 DF9D C134 9F16 567A" /* Ëd(¾;.c.ßÁ4Ÿ.Vz */
- $"8127 5FFD F396 BA0C B86F AA17 2301 022A" /* '_ýó–º.¸oª.#..* */
- $"3742 CE95 B1AF F858 C503 8156 35E0 8F2C" /* 7BΕ±¯øXÅ.V5à, */
- $"67D7 2D41 1F0B 5284 1535 AF16 6540 FB65" /* g×-A..R„.5¯.e@ûe */
- $"65BC 5F6B 136D 73A5 1C5D 3D92 FF5F 8494" /* e¼_k.ms¥.]=’ÿ_„” */
- $"FDBF E0C5 821F 072A 0EEB B855 6B42 CEE8" /* ý¿àÅ‚..*.ë¸UkBÎè */
- $"ABEE 381E 894E DF1E 29DD 4B78 3F0A F5EB" /* «î8.‰Nß.)ÝKx?Âõë */
- $"B9F8 61B8 8266 3BD8 A2AC 5BC1 38F4 5098" /* ¹øa¸‚f;Ø¢¬[Á8ôP˜ */
- $"3951 2437 1798 7BF9 EA00 12BF CF3E 9166" /* 9Q$7.˜{ùê..¿Ï>‘f */
- $"8253 6FF0 B942 70D7 C729 0866 33F7 3484" /* ‚Soð¹Bp×Ç).f3÷4„ */
- $"ADF8 C3D2 4EF6 1DF4 0E6F 8E64 B470 1D5E" /* ­øÃÒNö.ô.oŽd´p.^ */
- $"F311 9BD1 EDE1 BA5D 7601 2053 D70A FDCD" /* ó.›Ñíáº]v. S×ÂýÍ */
- $"82C0 1BDA A35C FAD2 67AD E569 7851 10A7" /* ‚À.Ú£\úÒg­åixQ.§ */
- $"EF9A 3533 EC03 E813 08B6 D984 1A1D 3DC0" /* ïš53ì.è..¶Ù„..=À */
- $"7C8E E03E 4A44 03E4 7894 FF1F 080E 2BFD" /* |Žà>JD.äx”ÿ...+ý */
- $"EEB4 E64A C757 389B 5780 3AF8 248C 580D" /* î´æJÇW8›W€:ø$ŒX. */
- $"461B D417 66BA CEB2 2042 3C84 DAF9 C127" /* F.Ô.fºÎ² B<„ÚùÁ' */
- $"63E9 168C A9E3 D418 61E8 C46C CF01 F59B" /* cé.Œ©ãÔ.aèÄlÏ.õ› */
- $"4518 8833 3E62 5B14 BFD1 41A8 45D6 D311" /* E.ˆ3>b[.¿ÑA¨EÖÓ. */
- $"8431 80DB 1FD5 5839 DE81 BCD9 EAFB EE26" /* „1€Û.ÕX9Þ¼Ùêûî& */
- $"33DD 9E73 0B6F F957 26EE E7BA E0DA FF22" /* 3Ýžs.oùW&îçºàÚÿ" */
- $"EA50 24BF A182 089D 749A 6AAF BFF2 224D" /* êP$¿¡‚.tšj¯¿ò"M */
- $"30D4 11D0 E07A A012 587A 0633 92B4 CBFC" /* 0Ô.Ðàz .Xz.3’´Ëü */
- $"8E1B E5AC 9025 A74D 2819 3F9D 8132 B795" /* Ž.å¬%§M(.?2·• */
- $"458E 4651 1589 158D D24C A5B0 CBFA 359E" /* EŽFQ.‰.ÒL¥°Ëú5ž */
- $"BDB0 E4FB BFE3 5854 3E88 A646 71B1 9CB2" /* ½°äû¿ãXT>ˆ¦Fq±œ² */
- $"BB4E BA8E E170 8CBF C1F5 3141 F537 C0FA" /* »NºŽápŒ¿Áõ1Aõ7Àú */
- $"9780 6448 BA3B 94D6 3E8B 7AF0 0B5A C7A2" /* —€dHº;”Ö>‹zð.ZÇ¢ */
- $"4D05 C6BB 7F47 7102 F66E E4E8 3681 1C97" /* M.Æ».Gq.önäè6.— */
- $"0996 4491 F713 2A24 3756 2715 4B55 762F" /* Æ–D‘÷.*$7V'.KUv/ */
- $"78CB 2608 0563 73F7 5626 9F35 0C54 6822" /* xË&..cs÷V&Ÿ5.Th" */
- $"F061 792A 4AFC 163A 9F83 8F82 638B 524D" /* ðay*Jü.:Ÿƒ‚c‹RM */
- $"C21C 3735 DB76 6F4B 01F2 3E7E 5755 5945" /* Â.75ÛvoK.ò>~WUYE */
- $"6149 AAEE 1A88 7748 DC47 79E4 0660 318C" /* aIªî.ˆwHÜGyä.`1Œ */
- $"AA94 E92D 9879 C9C1 AC17 C828 7BBB 997A" /* ª”é-˜yÉÁ¬.È({»™z */
- $"315E 858F F31D 3522 A6D2 B3BD E548 DBA2" /* 1^…ó.5"¦Ò³½åHÛ¢ */
- $"3274 749B 11C1 9570 D715 0350 4CC4 6820" /* 2tt›.Á•p×..PLÄh */
- $"560A 8542 A38D 913B 3863 FF5C 97F2 9BA5" /* VÂ…B£‘;8cÿ\—ò›¥ */
- $"893F 6C9B 15A2 EE40 BCD6 2676 80A9 AC89" /* ‰?l›.¢î@¼Ö&v€©¬‰ */
- $"9054 849D 859C 8DCD 181B 64F4 6D7B 71B4" /* T„…œÍ..dôm{q´ */
- $"FBD3 0C84 21D4 CC6C CF84 F40A A3CD C958" /* ûÓ.„!ÔÌlÏ„ô£ÍÉX */
- $"928E 97E5 346C 6497 2888 7903 5B0B 3277" /* ’Ž—å4ld—(ˆy.[.2w */
- $"B4D6 9AA4 86C3 C691 CA1A 3C92 FCFB 02DE" /* ´Öš¤†ÃÆ‘Ê.<’üû.Þ */
- $"A25E 5C5C C6A8 1CE2 F5B5 88AB 3673 F912" /* ¢^\\ƨ.âõµˆ«6sù. */
- $"96AF E6BC 67FF 40CC 068D C6E3 8435 48AF" /* –¯æ¼gÿ@Ì.Æã„5H¯ */
- $"B929 F509 0F59 3410 A9A6 1087 8352 11EC" /* ¹)õÆ.Y4.©¦.‡ƒR.ì */
- $"23CF CD2E 3F05 487E 0740 9BE7 236F 56FB" /* #ÏÍ.?.H~.@›ç#oVû */
- $"D0F4 677F 9514 C6E9 50BB A61A 6135 73FB" /* Ðôg.•.ÆéP»¦.a5sû */
- $"37AA FA5C 0967 671C 8485 5326 6EB5 4955" /* 7ªú\Ægg.„…S&nµIU */
- $"1AAE 5FCE C271 D992 9E8C B0DF 7795 E0F2" /* .®_ÎÂqÙ’žŒ°ßw•àò */
- $"A17A B50F E53A FE12 756F D1A1 5CE1 7C9B" /* ¡zµ.å:þ.uoÑ¡\á|› */
- $"D185 2C1A 9224 BC62 5C98 FA35 1649 6EA7" /* Ñ…,.’$¼b\˜ú5.In§ */
- $"4C7C C191 DF92 9D7A 6FE9 71D9 9A11 5A19" /* L|Á‘ß’zoéqÙš.Z. */
- $"214D F951 38FA C459 E39A 6DAE 1253 31DF" /* !MùQ8úÄYãšm®.S1ß */
- $"B335 3337 39D2 7591 BFC1 31E6 887A 8BAB" /* ³5379Òu‘¿Á1æˆz‹« */
- $"ECCD 7A58 8E4A AD65 A7E1 5FC6 8EB0 DA82" /* ìÍzXŽJ­e§á_ÆŽ°Ú‚ */
- $"0F81 6849 5CE5 AB32 B763 1227 3F4C 5691" /* .hI\å«2·c.'?LV‘ */
- $"43C7 DD24 E8D9 C4F3 7BB0 4666 7A24 1C5B" /* CÇÝ$èÙÄó{°Ffz$.[ */
- $"F57D 719F 2BDB 3794 66BA BBB6 9D8D A662" /* õ}qŸ+Û7”fº»¶¦b */
- $"CF99 4DDC E533 96D6 EEE0 3FC7 BFB8 B1B7" /* Ï™MÜå3–Öîà?Ç¿¸±· */
- $"9AE3 57C7 E1A8 B1F8 6C5C 3F0D 19C1 812D" /* šãWÇᨱøl\?..Á- */
- $"8D31 C88B C396 B5E7 3CE0 4E2C AE73 7876" /* 1ȋÖµç<àN,®sxv */
- $"0436 A295 BEC6 BDF1 C604 C41C 94E6 E7C1" /* .6¢•¾Æ½ñÆ.Ä.”æçÁ */
- $"AC78 356A B92A DB37 3360 3372 6638 0C5C" /* ¬x5j¹*Û73`3rf8.\ */
- $"F388 7CDE 4045 060F E713 C4C3 321E E08B" /* óˆ|Þ@E..ç.ÄÃ2.à‹ */
- $"0810 71EE A6AB C032 2B85 C34C 2671 8143" /* ..qÀ2+…ÃL&qC */
- $"AFDE 07D1 A40C D86A ADBE B961 EAA3 54BD" /* ¯Þ.Ѥ.Øj­¾¹aê£T½ */
- $"804D 6FA9 AA3F 7FBE BCD9 E785 A230 EA4E" /* €Mo©ª?.¾¼Ùç…¢0êN */
- $"1C08 1DF6 8373 7754 5039 7854 1192 1512" /* ...öƒswTP9xT.’.. */
- $"B956 E9A7 575E E3DB F5F9 4B02 F739 F2BB" /* ¹Vé§W^ãÛõùK.÷9ò» */
- $"91B2 73E1 3D19 EBB6 AD2F 291C 5BAC 5EEA" /* ‘²sá=.붭/).[¬^ê */
- $"EEDF 8DA7 5FCA 8E8C 952D 8FD0 441C 5BA4" /* îߧ_ÊŽŒ•-ÐD.[¤ */
- $"8AF6 21BE 1FAF DAE3 DADD EA91 EF73 58A0" /* Šö!¾.¯ÚãÚÝê‘ïsX  */
- $"29E6 89B2 E279 B02A D092 DD08 6187 9095" /* )扲ây°*Ð’Ý.a‡• */
- $"5C85 C903 0DD2 9ED3 538B D9BB E936 8ABB" /* \…É..ÒžÓS‹Ù»é6Š» */
- $"E203 DD03 2944 5317 7BC3 0297 2125 F198" /* â.Ý.)DS.{Ã.—!%ñ˜ */
- $"D117 8DDB E382 71F8 D0A7 14B1 6D7A A0EB" /* Ñ.Ûã‚qøЧ.±mz ë */
- $"7C6F 7651 D2EC ECA7 F670 D09F 6CF6 30DB" /* |ovQÒìì§öpПlö0Û */
- $"0830 39B5 BC45 3915 4054 4490 A7BA 5CEC" /* .09µ¼E9.@TD§º\ì */
- $"D37B FBC2 7890 B18F DEEA 4966 D46D 5FD2" /* Ó{ûÂx±ÞêIfÔm_Ò */
- $"7811 AAD0 8EBF FB40 0F30 D8A4 2B71 5A03" /* x.ªÐŽ¿û@.0ؤ+qZ. */
- $"636A C360 C889 891D D420 A828 E337 41CC" /* cjÃ`ȉ‰.Ô ¨(ã7AÌ */
- $"3314 5473 B91F 7B78 2B3B AC7A 1127 F2DE" /* 3.Ts¹.{x+;¬z.'òÞ */
- $"E997 2101 6008 26AE 43D5 7CE7 8532 B9CE" /* é—!.`.&®CÕ|ç…2¹Î */
- $"A81A 710E 5D87 49D7 3EF6 65A3 D533 977E" /* ¨.q.]‡I×>öe£Õ3—~ */
- $"7BE9 0CA7 8B28 9ADA AF4F 45A5 99BD E21D" /* {é.§‹(šÚ¯OE¥™½â. */
- $"D4B1 BB33 2508 C8D1 31E5 E9FB F917 A8E1" /* Ô±»3%.ÈÑ1åéûù.¨á */
- $"2955 9008 F531 9010 575A 3AFB 59F4 CD63" /* )U.õ1.WZ:ûYôÍc */
- $"3EEE 2409 BCD4 E5F1 1418 6155 B6D7 A94B" /* >î$ƼÔåñ..aU¶×©K */
- $"1D48 79A8 2F32 0770 476B CE28 023A DC86" /* .Hy¨/2.pGkÎ(.:܆ */
- $"E008 813B E64A 39F5 58CE 3E75 DAA6 BD7A" /* à.;æJ9õXÎ>uÚ¦½z */
- $"1528 FF50 0738 C132 5569 3C99 C4BC A20F" /* .(ÿP.8Á2Ui<™Ä¼¢. */
- $"6DED 9310 6FE1 8BE4 BF4D D0B1 993E 0FD3" /* mí“.oá‹ä¿Mб™>.Ó */
- $"4938 1302 E4A8 FDA2 A7D2 4615 CD89 1E52" /* I8..ä¨ý¢§ÒF.͉.R */
- $"4160 51F8 BABB FEED 4281 0E0C 31CD 91D7" /* A`Qøº»þíB..1Í‘× */
- $"C7CF E302 E155 4188 0F06 097F 6906 2EC9" /* ÇÏã.áUAˆ..Æ.i..É */
- $"BE00 A1FB 0D99 8FB1 3B3D E3D3 70B8 4296" /* ¾.¡û.™±;=ãÓp¸B– */
- $"F199 E066 15B5 920C 38A2 695F F2E8 81E1" /* ñ™àf.µ’.8¢i_òèá */
- $"E0EC 34E5 97B3 9580 459F A2D9 E267 B847" /* àì4å—³•€EŸ¢Ùâg¸G */
- $"E302 3AA0 8631 8C61 5F8E 88DE 2FBB 394B" /* ã.: †1Œa_ŽˆÞ/»9K */
- $"B9EC 234B 6515 BDF3 BA80 AA30 3D50 2F90" /* ¹ì#Ke.½óº€ª0=P/ */
- $"C26A D743 2198 707A 2DC1 9C64 1647 1FA3" /* Âj×C!˜pz-Áœd.G.£ */
- $"43A2 B1C7 C95D 1E19 9650 E616 F24B C118" /* C¢±ÇÉ]..–Pæ.òKÁ. */
- $"FB68 CE23 485E BF50 ACF8 F669 B5A3 92AA" /* ûhÎ#H^¿P¬øöiµ£’ª */
- $"5625 BF48 8584 A6E7 DAC0 E203 2AF0 89A0" /* V%¿H…„¦çÚÀâ.*ð‰  */
- $"DB92 4924 9249 1BF5 D855 0470 51D0 AAE2" /* Û’I$’I.õØU.pQЪâ */
- $"A1E5 FBC9 CB80 1798 2EB3 EB1E 9FD4 46E7" /* ¡åûÉË€.˜.³ë.ŸÔFç */
- $"63DB F02E 204B D35F 54DE 0FD3 2F81 FB63" /* cÛð. KÓ_TÞ.Ó/ûc */
- $"9CEC 37F1 C9FF 5B63 B13D BFBD 1169 0415" /* œì7ñÉÿ[c±=¿½.i.. */
- $"0E97 DA89 25E3 92C7 01F5 50E6 2181 A536" /* .—Ú‰%ã’Ç.õPæ!¥6 */
- $"4020 C49B 1977 1BF5 5226 FD7D 668A D76F" /* @ Ä›.w.õR&ý}fŠ×o */
- $"2954 58F1 F44F 2935 F136 18BD C844 05FD" /* )TXñôO)5ñ6.½ÈD.ý */
- $"E325 9012 9E92 6EC3 E822 D06F A958 C54C" /* ã%.ž’nÃè"Ðo©XÅL */
- $"6A4D 0A98 093C 481D 1424 7964 E810 7A60" /* jM˜Æ<H..$ydè.z` */
- $"F2C0 8287 A7F4 B307 FBDF 2550 567E 01EA" /* òÀ‚‡§ô³.ûß%PV~.ê */
- $"2C45 4614 9A0A 04E8 397B 3DEC 6CDA CA95" /* ,EF.šÂ.è9{=ìlÚÊ• */
- $"B754 699A FF29 B46B D6E3 BB8C 153C AEC0" /* ·Tišÿ)´kÖ㻌.<®À */
- $"BEFF 46AD 744B B945 4C07 F7F7 178D 059E" /* ¾ÿF­tK¹EL.÷÷..ž */
- $"2E80 10C4 6DD6 F19E B649 73D6 8C57 7A6C" /* .€.ÄmÖñž¶IsÖŒWzl */
- $"45DE 3D43 22DE C54A DFCD 64EA 9D77 1AC6" /* EÞ=C"ÞÅJßÍdêw.Æ */
- $"E15E A9A7 0D83 D53C 100B EC25 2B93 1D27" /* á^©§.ƒÕ<..ì%+“.' */
- $"367A 864E D9C4 F0B9 DF5C 538D B2C0 24EE" /* 6z†NÙÄð¹ß\S²À$î */
- $"46E7 424C 2127 6BED B492 3354 86C9 D855" /* FçBL!'kí´’3T†ÉØU */
- $"317B 6BE2 8205 C07C 9A42 03E4 D6B0 0F93" /* 1{kâ‚.À|šB.äÖ°.“ */
- $"4400 AFF0 AE8C D6D6 6729 AEBE 9CDE 5C69" /* D.¯ð®ŒÖÖg)®¾œÞ\i */
- $"D95C 01A0 28AF 1E57 B12C CA6D F010 ED89" /* Ù\. (¯.W±,Êmð.í‰ */
- $"4C46 38AA BAFC D67E 9E98 C6CA 85E4 433E" /* LF8ªºüÖ~ž˜ÆÊ…äC> */
- $"C450 03B7 E8DE 17B3 9CE7 02E1 BE72 100B" /* ÄP.·èÞ.³œç.á¾r.. */
- $"2EF5 787D 0D12 FC3B 855A 3F97 1850 05EF" /* .õx}..ü;…Z?—.P.ï */
- $"A05D 7CC2 405B BA6D 9175 7C99 BE1C 2370" /*  ]|Â@[ºm‘u|™¾.#p */
- $"1F57 2085 13F8 B672 728D 1152 8232 1EE4" /* .W ….ø¶rr.R‚2.ä */
- $"A666 BFD0 06A8 6CFF 3D73 D895 5968 A54A" /* ¦f¿Ð.¨lÿ=sØ•Yh¥J */
- $"3219 63AB D4CD 8E7D 52F3 D260 CE4D E329" /* 2.c«ÔÍŽ}RóÒ`ÎMã) */
- $"F554 C837 34CC 2866 FA1E 1F34 B209 B8C3" /* õTÈ74Ì(fú..4²Æ¸Ã */
- $"097B 8DBC 8788 F621 2A57 5468 5FD8 852B" /* Æ{¼‡ˆö!*WTh_Ø…+ */
- $"08A9 45F3 71A8 A26B F63C 2DB1 750F A833" /* .©Eóq¨¢kö<-±u.¨3 */
- $"4767 6D8A B551 FF10 9E54 AD5D EE2E 2207" /* GgmŠµQÿ.žT­]î.". */
- $"44EA 0D21 75D4 779D E96D 49FF 47CE D775" /* Dê.!uÔwémIÿGÎ×u */
- $"D7B0 2380 5F1C 4185 EF0B BECB 1A55 9696" /* ×°#€_.A…ï.¾Ë.U–– */
- $"81B8 94F2 4F5B 07D8 D5EC 9E2A 049D 5E87" /* ¸”òO[.ØÕìž*.^‡ */
- $"2601 FB44 4AD5 C57B A7B0 8088 B723 134E" /* &.ûDJÕÅ{§°€ˆ·#.N */
- $"0B8A 375E B972 F34F F25A 2B68 3F15 4496" /* .Š7^¹róOòZ+h?.D– */
- $"5734 FE10 D742 67F9 9FFF 639C FAFD 23DB" /* W4þ.×BgùŸÿcœúý#Û */
- $"B90C F402 17F0 81C6 2656 EFD0 E011 C866" /* ¹.ô..ðÆ&VïÐà.Èf */
- $"15C8 4927 3415 BEC1 7876 E693 74CB DBEA" /* .ÈI'4.¾Áxvæ“tËÛê */
- $"7206 2246 23EC DCCA 51CD 72C1 8C41 1B85" /* r."F#ìÜÊQÍrÁŒA.… */
- $"AE9B 6FA5 4286 03FB 7000 D94F 5A8B 8A85" /* ®›o¥B†.ûp.ÙOZ‹Š… */
- $"2F34 7575 E7AB 08FF 3CBD 328D D95D BDF5" /* /4uuç«.ÿ<½2Ù]½õ */
- $"8070 0FAD B573 A91E 5F83 D32D 3337 A5B7" /* €p.­µs©._ƒÓ-37¥· */
- $"C6A7 3048 8D7C 3F01 F6BF 1BAB D684 0585" /* Ƨ0H|?.ö¿.«Ö„.… */
- $"798A A28D 68A6 4993 22BC F35C E3A7 BABE" /* yŠ¢h¦I“"¼ó\㧺¾ */
- $"0D5B 7E43 2B91 5DA6 6821 0495 4B22 33C0" /* .[~C+‘]¦h!.•K"3À */
- $"1217 1302 A7EB 1093 C8BD 3622 F0FD 14C3" /* ....§ë.“Ƚ6"ðý.à */
- $"EDBA 60FA B4C2 07D5 6D80 C177 9C23 24FE" /* íº`ú´Â.Õm€Áwœ#$þ */
- $"C9E7 77A7 1945 4C1A 8945 129A 2581 498D" /* Éçw§.EL.‰E.š%I */
- $"F2BD 5AD6 EF89 4D80 3EC2 DA29 E093 A726" /* ò½ZÖï‰M€>ÂÚ)à“§& */
- $"88F1 0796 E9F0 8F36 D342 7AD3 DEC2 2CCA" /* ˆñ.–éð6ÓBzÓÞÂ,Ê */
- $"45B9 35A0 DE31 D18B 2954 C38C 4B3A EEA2" /* E¹5 Þ1Ñ‹)TÃŒK:î¢ */
- $"5CD5 333D 6C59 23C7 17B3 C98C 65EE 8117" /* \Õ3=lY#Ç.³ÉŒeî. */
- $"22A2 574D D223 581B D09B 6473 3F85 6E2A" /* "¢WMÒ#X.Лds?…n* */
- $"81B5 F600 CAB6 1A02 3B24 D726 4344 536F" /* µö.ʶ..;$×&CDSo */
- $"99AB 09C8 96EA B41B 01C9 7AC8 9478 B8AB" /* ™«ÆÈ–ê´..ÉzÈ”x¸« */
- $"69E3 1BF1 1100 AFF3 C59C 01FB 8EF9 047D" /* iã.ñ..¯óÅœ.ûŽù.} */
- $"21EF 11DE D2CA BEE2 8372 5DDB C39C DE6E" /* !ï.ÞÒʾâƒr]ÛÃœÞn */
- $"B652 35FE FDFB F1E8 2E91 778A 86C3 3117" /* ¶R5þýûñè.‘wŠ†Ã1. */
- $"87D8 A7D5 7862 68B7 30C1 3B32 D209 0256" /* ‡Ø§Õxbh·0Á;2ÒÆ.V */
- $"2BF7 DFEF 17C3 FC30 EF1D 9327 7041 FC3C" /* +÷ßï.Ãü0ï.“'pAü< */
- $"674F 3069 DAB2 0EA5 BB48 DC2C DC66 F660" /* gO0iÚ².¥»HÜ,Üfö` */
- $"9C9B C7C8 3734 C68B 7D5A 60A1 DF3D D3A8" /* œ›ÇÈ74Æ‹}Z`¡ß=Ó¨ */
- $"E60C D15A 11C7 FB3B F75A 358E A7F7 16CB" /* æ.ÑZ.Çû;÷Z5Ž§÷.Ë */
- $"67B5 097E E2A2 DE6C E40A FD52 8F75 43EF" /* gµÆ~â¢ÞläÂýRuCï */
- $"F5DF 5A51 BBF5 A074 791F F54F 9724 23C3" /* õßZQ»õ ty.õO—$#Ã */
- $"F5E6 C4A3 E22C 1E06 3B71 A9A2 1C17 0109" /* õæÄ£â,..;q©¢...Æ */
- $"1B59 2742 AB03 0497 3E5A AD73 7FD3 DA51" /* .Y'B«..—>Z­s.ÓÚQ */
- $"9F17 A10E B9CF 7503 3395 8788 9D9D 4A58" /* Ÿ.¡.¹Ïu.3•‡ˆJX */
- $"F9B8 4A61 3DDA 7489 8086 9EAC 4D7D 62DD" /* ù¸Ja=Út‰€†ž¬M}bÝ */
- $"BF8B 9462 1CC0 6912 69BE 3BFE FED7 3174" /* ¿‹”b.Ài.i¾;þþ×1t */
- $"CAA6 A806 FF59 B963 ABEE 508B F428 D15C" /* ʦ¨.ÿY¹c«îP‹ô(Ñ\ */
- $"82FC BA30 6907 C572 F2BD C0DB E9A2 44AF" /* ‚üº0i.Årò½ÀÛé¢D¯ */
- $"EED6 81F7 C602 F802 0374 CD1D 0F41 5E2E" /* îÖ÷Æ.ø..tÍ..A^. */
- $"F54F E7AB C492 54F8 C570 48A6 1603 35D3" /* õOç«Ä’TøÅpH¦..5Ó */
- $"EA1A 6A6D FD79 27E3 F928 4E16 3A2D 43FE" /* ê.jmýy'ãù(N.:-Cþ */
- $"6C3D AFC6 FA1C 578C 7BA9 7343 5B2C 7BB9" /* l=¯Æú.WŒ{©sC[,{¹ */
- $"0614 915A 24C4 CAC1 A2D3 0EAF EAE8 7257" /* ..‘Z$ÄÊÁ¢Ó.¯êèrW */
- $"EA2D 1ED2 3FFE 26A7 3E28 28D0 1AE1 D790" /* ê-.Ò?þ&§>((Ð.á× */
- $"A25D 1C6C BA20 E196 1EEC 9720 92EE 6E62" /* ¢].lº á–.ì— ’înb */
- $"E218 5609 944E 9A2E 9228 117A 6065 93FF" /* â.VÆ”Nš.’(.z`e“ÿ */
- $"2B32 B2C1 7876 E657 E39E 8641 F202 62B4" /* +2²ÁxvæW㞆Aò.b´ */
- $"20C5 99D9 F9E5 7D83 D807 EDB7 9A34 475B" /* Å™Ùùå}ƒØ.í·š4G[ */
- $"4F45 9AE8 ACD6 3098 A0C2 8D14 CBDB 9A2B" /* OEšè¬Ö0˜ Â.ËÛš+ */
- $"0EF7 CB30 8B49 169F 1ECD 6F33 F063 65DA" /* .÷Ë0‹I.Ÿ.Ío3ðceÚ */
- $"2A2F F0B0 EE29 91F7 CA11 748C 5E4E A447" /* *.ð°î)‘÷Ê.tŒ^N¤G */
- $"0F7F 4B32 DB7A 366C 27C4 F178 33B7 5E9B" /* ..K2Ûz6l'Äñx3·^› */
- $"BAAF 29CD A3EF 39BB 5FAD AD2B 5DCA 09E8" /* º¯)Í£ï9»_­­+]ÊÆè */
- $"DB9A DD07 84DD 870E 2A4C 850B BD04 7F9A" /* ÛšÝ.„݇.*L….½..š */
- $"1354 1DAA 0819 F583 1F47 5905 6597 5F07" /* .T.ª..õƒ.GY.e—_. */
- $"7ED6 DFFA BA65 FA6C D01D F65F F833 D479" /* ~ÖßúºeúlÐ.ö_ø3Ôy */
- $"BFD3 F3D8 57BB 3718 EBC8 5A2D 732E 464E" /* ¿ÓóØW»7.ëÈZ-s.FN */
- $"6B46 9512 778B 8066 D5DA D21A 819D 5384" /* kF•.w‹€fÕÚÒ.S„ */
- $"A84C AE56 92E2 2E9A 4D27 8A21 E02D 67FC" /* ¨L®V’â.šM'Š!à-gü */
- $"EAA4 B3D5 9306 1D06 CC9A 84C8 D6C4 C7E1" /* ꤳՓ...Ìš„ÈÖÄÇá */
- $"4F47 E168 43F0 6EB1 9276 ED11 2C29 F1CB" /* OGáhCðn±’ví.,)ñË */
- $"90AB 1975 3405 422B 78EC 7776 FA5C 0A2C" /* «.u4.B+xìwvú\Â, */
- $"F4B1 4F40 32CE D338 8911 EAB4 4CFC 7765" /* ô±O@2ÎÓ8‰.ê´Lüwe */
- $"D9ED C10E 114B 0909 1122 6832 A41E 3365" /* ÙíÁ..KÆÆ."h2¤.3e */
- $"96EF FC81 A398 2FE8 0464 5D18 0C9F C1AF" /* –ïü£˜/è.d]..ŸÁ¯ */
- $"8E6F 42CA BDC9 1DC4 770E 1C2E 01BD 62DB" /* ŽoBʽÉ.Äw....½bÛ */
- $"7798 4167 FC4F B27D D7E6 32CE 7F95 954F" /* w˜AgüO²}×æ2Î.••O */
- $"653C 833E B4F1 C6C2 307E 0796 686E 6F5C" /* e<ƒ>´ñÆÂ0~.–hno\ */
- $"6EE2 6260 4C0B 5329 36D8 839E 5F08 319C" /* nâb`L.S)6؃ž_.1œ */
- $"4CAE 85DE 6B64 F427 1358 C9FF 57B9 AF78" /* L®…Þkdô'.XÉÿW¹¯x */
- $"332B 82A6 0EBF 0F83 7A3C 8004 1402 6A12" /* 3+‚¦.¿.ƒz<€...j. */
- $"FEE8 1612 2D8A 47FE 5BDE 2714 B393 E32F" /* þè..-ŠGþ[Þ'.³“ã/ */
- $"013E BD7E 14FA 285D BF61 7CDA 3A92 734A" /* .>½~.ú(]¿a|Ú:’sJ */
- $"520E 978D 8736 6AA9 847B 05C9 F28B 3D9A" /* R.—‡6j©„{.Éò‹=š */
- $"9B2E 721C 9082 3EC1 362C D516 D306 1EB9" /* ›.r.‚>Á6,Õ.Ó..¹ */
- $"A95C EC63 3111 4ED2 054A EFF8 F26A 0E36" /* ©\ìc1.NÒ.Jïøòj.6 */
- $"7445 26A0 464F CEDC 924D B183 FAEF 28F7" /* tE& FOÎÜ’M±ƒúï(÷ */
- $"AF76 2DBA F15C 4F45 4BFD E003 CDC1 A878" /* ¯v-ºñ\OEKýà.ÍÁ¨x */
- $"6FB4 207C 2A45 1ED9 CE49 2495 F6A9 77E8" /* o´ |*E.ÙÎI$•ö©wè */
- $"E7FF 7FFF 7FFF 7FFF 70EC F373 E872 28BA" /* çÿ.ÿ.ÿ.ÿpìósèr(º */
- $"A0BB 38E4 AC79 94DA 6562 832A 9A7B EEA8" /*  »8ä¬y”Úebƒ*š{î¨ */
- $"6B09 FEA7 9249 2005 E7D1 D721 4761 B6DB" /* kÆþ§’I .çÑ×!Ga¶Û */
- $"6DB6 DB6D 98C5 C208 FD98 41AA F430 3EAE" /* m¶Ûm˜ÅÂ.ý˜Aªô0>® */
- $"7118 7229 50B1 07D8 C5CA 010D 4AB4 DE82" /* q.r)P±.ØÅÊ..J´Þ‚ */
- $"53D3 E184 6561 DE5F 7236 BBF5 550D 4A83" /* SÓá„eaÞ_r6»õU.Jƒ */
- $"555B 5C0F 9C0E F052 0080 F4AC 3912 DD30" /* U[\.œ.ðR.€ô¬9.Ý0 */
- $"47C9 B77E C632 15D7 8EB6 CD51 0454 A805" /* GÉ·~Æ2.׎¶ÍQ.T¨. */
- $"2DAD F687 6CB7 B37F 2289 759F F7D5 8839" /* -­ö‡l·³."‰uŸ÷Õˆ9 */
- $"B3E6 BCA5 AA89 9D9D 599A 5BDD 54B9 7F7D" /* ³æ¼¥ª‰Yš[ÝT¹.} */
- $"2770 11ED 2217 C539 0204 16FF 728A C52A" /* 'p.í".Å9...ÿrŠÅ* */
- $"2D24 5FC7 E1D7 C47E 1DE8 C3F0 EA38 E730" /* -$_Çá×Ä~.èÃðê8ç0 */
- $"2D9D 0AC5 991A F5DD 38EC 007B A963 8B4D" /* -ÂÅ™.õÝ8ì.{©c‹M */
- $"51BA A9FC AE25 908A 1B70 9145 EBA2 38C4" /* Qº©ü®%Š.p‘Eë¢8Ä */
- $"168F 70BB 10A5 CAA5 A249 1974 03F3 AB57" /* .p».¥Ê¥¢I.t.ó«W */
- $"3611 30C5 1F14 529F 040A A8EC EBDF F2FF" /* 6.0Å..RŸ.¨ìëßòÿ */
- $"232B 83FE C2D0 59D9 93C2 2A8A F86A 997F" /* #+ƒþÂÐYÙ“Â*Šøj™. */
- $"3207 03A7 C406 E96C C96F 23F1 1490 95DF" /* 2..§Ä.élÉo#ñ.•ß */
- $"4024 67DC 3DE6 E1B1 EB60 1026 8786 531C" /* @$gÜ=æá±ë`.&‡†S. */
- $"9A51 378D EE86 881F 496C 8854 9459 7799" /* šQ7.IlˆT”Yw™ */
- $"11EC 4196 0C22 0F05 3762 D8F4 C348 7299" /* .ìA–."..7bØôÃHr™ */
- $"793E 0718 14D3 D09C C192 80E1 9F7C 5CFA" /* y>...ÓÐœÁ’€áŸ|\ú */
- $"429C 7960 2F8B 9063 C7E1 1447 7F52 D850" /* Bœy`/‹cÇá.G.RØP */
- $"B80A F1D8 BE98 DC3C 9C44 3AB7 3DA7 E08C" /* ¸Âñؾ˜Ü<œD:·=§àŒ */
- $"E7B6 07CE 2B69 C0E9 0C21 6133 1EC5 DAB5" /* ç¶.Î+iÀé.!a3.ÅÚµ */
- $"B079 413B FBA4 0259 78B8 DA3A E6D1 4AAC" /* °yA;û¤.Yx¸Ú:æÑJ¬ */
- $"2459 93C8 AD9A D69C AC40 5CF7 7385 1B18" /* $Y“È­šÖœ¬@\÷s….. */
- $"D67D 82BD 5E44 3DF8 5D2F E6D3 CE47 0191" /* Ö}‚½^D=ø]/æÓÎG.‘ */
- $"6E57 0F2F E8E8 9FF0 14BC 21F1 7720 6F34" /* nW./èèŸð.¼!ñw o4 */
- $"1EEE 5EF6 F8FD 5481 44E3 AB6B B06E 2556" /* .î^öøýTDã«k°n%V */
- $"6F07 AD65 FC95 7C32 7487 10A0 3C20 9CA7" /* o.­eü•|2t‡. < œ§ */
- $"B0EB F703 2D09 F0A6 D3FD 55F6 354B EDB0" /* °ë÷.-Æð¦ÓýUö5Kí° */
- $"179B B267 B9EB 8DA1 ED8E 7D0F 1AFF 4D50" /* .›²g¹ë¡íŽ}..ÿMP */
- $"C1C7 A686 586C 6A26 3B0B 4292 60A0 A804" /* ÁǦ†Xlj&;.B’` ¨. */
- $"04F6 5FDB 0F76 E2BC D680 20B5 46AE 399D" /* .ö_Û.vâ¼Ö€ µF®9 */
- $"CC54 82A4 1DCA 08E7 E2B4 6710 ABD8 FC18" /* ÌT‚¤.Ê.çâ´g.«Øü. */
- $"949B 7076 11CD 598E 2A8B 99FC CC28 EC17" /* ”›pv.ÍYŽ*‹™üÌ(ì. */
- $"451C DE31 F7F4 C47E 3ABB AF03 FDC6 D875" /* E.Þ1÷ôÄ~:»¯.ýÆØu */
- $"BD0C AB3E B78F F942 A53E E5F8 CA09 414D" /* ½.«>·ùB¥>åøÊÆAM */
- $"7544 D5B4 8367 3256 6D8C CB66 6DE7 E99C" /* uDÕ´ƒg2VmŒËfmçéœ */
- $"88E9 FCDC EB55 F67B 20E7 F44D 7616 6B29" /* ˆéüÜëUö{ çôMv.k) */
- $"124A C9AB 95C7 E9A8 209D EDA5 499F 2D2F" /* .JÉ«•Çé¨ í¥IŸ-/ */
- $"20E5 DE8C 2EEE 92AF 4BD6 484B 7E18 2D81" /* åÞŒ.î’¯KÖHK~.- */
- $"0502 F439 C742 BA21 693B 43C5 60DF 8BA0" /* ..ô9ÇBº!i;CÅ`ß‹  */
- $"9EAC 0A98 DFE4 DB4B 0BE1 E526 9B74 5982" /* ž¬Â˜ßäÛK.áå&›tY‚ */
- $"1817 EA6B 067A D3E4 8786 883D 26DB D361" /* ..êk.zÓ䇆ˆ=&ÛÓa */
- $"C40F 89F4 B31F 2AF3 1369 FDA9 889A 5620" /* Ä.‰ô³.*ó.iý©ˆšV */
- $"9AE7 4384 7184 9D7F 6C37 F79B 9422 ADF3" /* šçC„q„.l7÷›”"­ó */
- $"2BEA A620 14CF 0267 110E AB20 594B F1DA" /* +ê¦ .Ï.g..« YKñÚ */
- $"9D7F DB53 3723 1A4E 0DEC DF68 3A10 078F" /* .ÛS7#.N.ìßh:.. */
- $"8CA5 471B 4400 0975 92AA A351 8C66 5DDA" /* Œ¥G.D.Æu’ª£QŒf]Ú */
- $"0E4E C7B1 286F 2F7C E0EB 24CC 0A8B CAF8" /* .NDZ(o/|àë$Ì‹Êø */
- $"4F0F 75E5 CACF 26F5 0FFE 86A8 1E77 5F03" /* O.uåÊÏ&õ.þ†¨.w_. */
- $"A8B5 A544 F04B A521 B3FA 854A 64FA 70CD" /* ¨µ¥DðK¥!³ú…JdúpÍ */
- $"526F 97AE 807A 05FC 3F67 2471 61E5 2715" /* Ro—®€z.ü?g$qaå'. */
- $"5774 E452 7E4A CDDA 6E48 0DA2 04B3 3A29" /* WtäR~JÍÚnH.¢.³:) */
- $"DE10 8F75 3A3A 559D A881 B948 74F3 AB92" /* Þ.u::U¨¹Htó«’ */
- $"B154 0F88 A11B A00B 25ED 9A59 B894 618E" /* ±T.ˆ¡. .%íšY¸”aŽ */
- $"AD45 3D59 9C08 49EA 076C CD63 8F49 B714" /* ­E=Yœ.Iê.lÍcI·. */
- $"32B3 8743 2506 F55A C011 CBEF C94A 8606" /* 2³‡C%.õZÀ.ËïÉJ†. */
- $"EDE4 BE7D 2DC9 8830 6C23 91E0 0209 440C" /* íä¾}-Ɉ0l#‘à.ÆD. */
- $"9409 1457 6CA0 2201 8FF4 7573 54F8 CCEC" /* ”Æ.Wl ".ôusTøÌì */
- $"D201 4A3A 66A6 B191 4E14 4CB1 08B4 2100" /* Ò.J:f¦±‘N.L±.´!. */
- $"BCF2 3A0D 696F 4582 F8B0 3A60 2D09 E9A7" /* ¼ò:.ioE‚ø°:`-Æé§ */
- $"8E83 CF44 A16A 6516 31C1 B51E 2DFE BDAC" /* ŽƒÏD¡je.1Áµ.-þ½¬ */
- $"356B F402 856C BEA0 109C A125 A759 E580" /* 5kô.…l¾ .œ¡%§Yå€ */
- $"3501 F500 F252 9533 F180 6E7D 30A8 FD62" /* 5.õ.òR•3ñ€n}0¨ýb */
- $"7FD6 B4EB 9120 8504 493A DD87 D79A 0CB1" /* .Ö´ë‘ ….I:݇ך.± */
- $"B674 7010 830D 8A38 5B44 B11D 3632 3FA5" /* ¶tp.ƒ.Š8[D±.62?¥ */
- $"CE31 CE9A 1670 AF20 16F6 BDA6 4980 002E" /* Î1Κ.p¯ .ö½¦I€.. */
- $"3E9E 8AB0 8B1F 63C5 28C3 7914 2833 137F" /* >žŠ°‹.cÅ(Ãy.(3.. */
- $"0915 DD39 7D38 49A3 6054 B5DC 2509 EE11" /* Æ.Ý9}8I£`TµÜ%Æî. */
- $"D68A 5C2A C75B 5B9F 7A9A FF3A D06F 3331" /* ÖŠ\*Ç[[Ÿzšÿ:Ðo31 */
- $"29E6 A9F4 8AD5 E0D9 7FB9 84B1 F403 8910" /* )æ©ôŠÕàÙ.¹„±ô.‰. */
- $"1168 1270 19E2 E385 0353 0FFF 697F 96BE" /* .h.p.âã….S.ÿi.–¾ */
- $"EF55 21CA 25A1 CE5E 0CD7 03A9 094F 51FE" /* ïU!Ê%¡Î^.×.©ÆOQþ */
- $"5314 E59F 90EB 907A E37A DD9D 182A E41C" /* S.åŸëzãzÝ.*ä. */
- $"CFFB 7262 0D9E B904 8D95 2DE3 E02B F5CB" /* Ïûrb.ž¹.•-ãà+õË */
- $"BF61 6012 924E 50D3 2D8D 6C25 FC60 8D19" /* ¿a`.’NPÓ-l%ü`. */
- $"9855 8BF2 5400 0000 04E3 7684 B40E 9EE7" /* ˜U‹òT....ãv„´.žç */
- $"21F8 CB76 250B 7CE0 2605 7C84 7E9F F226" /* !øËv%.|à&.|„~Ÿò& */
- $"6B94 0DB5 02AA 61E7 A9FF 5D9F A9F2 B546" /* k”.µ.ªaç©ÿ]Ÿ©òµF */
- $"2417 2E4D B238 ADDF 9233 5911 1D61 D35A" /* $..M²8­ß’3Y..aÓZ */
- $"8788 DF34 284A 9664 B91E 7A11 4568 B395" /* ‡ˆß4(J–d¹.z.Eh³• */
- $"7C74 C891 2A46 C056 EE92 0459 D81C A41F" /* |tÈ‘*FÀVî’.YØ.¤. */
- $"CA5E 4752 3ADE 89AB 995B 2BF2 D070 41B1" /* Ê^GR:Þ‰«™[+òÐpA± */
- $"EBFE 65BF FF61 55F5 5460 A4E0 33CF 7F1E" /* ëþe¿ÿaUõT`¤à3Ï.. */
- $"691A 0DA4 9372 4DCD 4A7C FF30 7DA5 4AD0" /* i..¤“rMÍJ|ÿ0}¥JÐ */
- $"1236 3C90 00C2 4517 FF78 771E DA05 952D" /* .6<.ÂE.ÿxw.Ú.•- */
- $"1085 D433 FD50 1E6F D583 2585 CBD6 5CFC" /* .…Ô3ýP.oÕƒ%…ËÖ\ü */
- $"9EF2 539B BE7A CCA1 ABF6 5AED 484B FF78" /* žòS›¾zÌ¡«öZíHKÿx */
- $"D6BD 435E E56E 5510 3047 49DE C511 72CF" /* Ö½C^ånU.0GIÞÅ.rÏ */
- $"72A0 B2CE 5E4D E2DA 0AFA FEDE BDFD 3167" /* r ²Î^MâÚÂúþÞ½ý1g */
- $"02FE 3FBE A1B9 7A5F 205B 7D60 1BA3 C975" /* .þ?¾¡¹z_ [}`.£Éu */
- $"5949 A641 5A3E 5AF2 F237 53BE FCAC 71F1" /* YI¦AZ>Zòò7S¾ü¬qñ */
- $"E3E3 6AEB 35B9 41BD C4B6 3400 DBA0 4B7F" /* ããjë5¹A½Ä¶4.Û K. */
- $"FF79 17FD 23F9 918D E532 F6BD F949 B633" /* ÿy.ý#ù‘å2ö½ùI¶3 */
- $"6A36 7600 17D8 C912 DB72 6F48 869C 0D66" /* j6v..ØÉ.ÛroH†œ.f */
- $"1410 074A 8F5B 629C 5B8B F293 6DB6 DB6D" /* ...J[bœ[‹ò“m¶Ûm */
- $"B6DB 6740 B8F8 BF85 2938 ECDA 6390 6537" /* ¶Ûg@¸ø¿…)8ìÚce7 */
- $"5986 A2A6 B52C A20D F057 C41F 660A C203" /* Y†¢¦µ,¢.ðWÄ.fÂÂ. */
- $"E5C1 68B0 9D56 DAD8 F20C 665C 5D04 4BA2" /* åÁh°VÚØò.f\].K¢ */
- $"46FF 7DB5 4880 6121 2EA3 5D2A 82F4 B18A" /* Fÿ}µH€a!.£]*‚ô±Š */
- $"50FC 2D12 DEFE 1F4D 01BF 3315 10D3 5D94" /* Pü-.Þþ.M.¿3..Ó]” */
- $"11B1 0221 28B8 56D9 4CED 012D D9C9 4005" /* .±.!(¸VÙLí.-ÙÉ@. */
- $"316F E887 29A8 3E83 9E25 FF1F A4C1 5D25" /* 1oè‡)¨>ƒž%ÿ.¤Á]% */
- $"8893 36E0 73BE DE25 456A 4678 B7C5 AD7A" /* ˆ“6às¾Þ%EjFx·Å­z */
- $"90C9 3950 942F 1459 C737 31EF 991F 241B" /* É9P”/.YÇ71ï™.$. */
- $"C294 7CFB 9461 B43A 8D37 8A6D BBC8 D7F6" /* ”|û”a´:7Šm»È×ö */
- $"A128 281D DF2B EAC5 A154 E6D9 FF53 984D" /* ¡((.ß+êÅ¡TæÙÿS˜M */
- $"550E 9C70 3F64 0E0E 0940 0AFC 5CC9 CF43" /* U.œp?d..Æ@Âü\ÉÏC */
- $"7184 3D0F 9FDE 08DF EC31 B86E 0D38 AF71" /* q„=.ŸÞ.ßì1¸n.8¯q */
- $"29F1 A21D 7847 7150 6DCA 9211 C778 F1A4" /* )ñ¢.xGqPmÊ’.Çxñ¤ */
- $"26AA B90D 1A39 DB92 4924 9249 2493 36D2" /* &ª¹..9Û’I$’I$“6Ò */
- $"4924 9249 2492 49FE 069C E7B9 CB0D 4E87" /* I$’I$’Iþ.œç¹Ë.N‡ */
- $"7D9E 9D29 FC64 8A6F 6185 2BD9 806F 760B" /* }ž)üdŠoa…+Ù€ov. */
- $"464D 4732 BD90 0E7D CABF 2B6F 2A78 8608" /* FMG2½.}Ê¿+o*x†. */
- $"DEF5 406F D401 3FD4 AE82 058D D6C8 B980" /* Þõ@oÔ.?Ô®‚.Öȹ€ */
- $"FECA D9B9 E7B6 3982 9FD3 81EA 544B 30BD" /* þÊÙ¹ç¶9‚ŸÓêTK0½ */
- $"7E56 FD78 66FD 5A41 D0BD 7714 5FAF 2A1E" /* ~VýxfýZAнw._¯*. */
- $"8FDA B705 EAAE F6F2 D69C 9812 7194 A56E" /* Ú·.ê®öòÖœ˜.q”¥n */
- $"DB55 BF75 C4E4 BDCD 9FC2 ACAD C428 829F" /* ÛU¿uÄä½ÍŸÂ¬­Ä(‚Ÿ */
- $"2409 3BB2 A894 8020 A8E7 FC16 F4FF 4E84" /* $Æ;²¨”€ ¨çü.ôÿN„ */
- $"C06E 889C 1C74 96AD 5420 F825 1A2B 015C" /* Ànˆœ.t–­T ø%.+.\ */
- $"6BC2 31EE 64AB 7A44 15E5 3458 8040 AEEF" /* kÂ1îd«zD.å4X€@®ï */
- $"F6BD 7D58 6478 8344 018F D3C6 2E33 69A4" /* ö½}XdxƒD.ÓÆ.3i¤ */
- $"E5E8 721A 5B2F 777B C0D8 0A05 2CE7 EEC8" /* åèr.[/w{ÀØÂ.,çîÈ */
- $"69EF 417B A960 D320 842E 84DE D442 AB2F" /* iïA{©`Ó „.„ÞÔB«/ */
- $"3B31 84FE DCFC A608 2E09 AA42 60F6 DB2E" /* ;1„þÜü¦..ƪB`öÛ. */
- $"DA5B C95D D10A 77BE AD48 B5FF 0557 A5AC" /* Ú[É]ÑÂw¾­Hµÿ.W¥¬ */
- $"327B F763 FDA1 32BF 7308 3EFC 0C2B 2D22" /* 2{÷cý¡2¿s.>ü.+-" */
- $"584A F9CA BFB4 78FF 6E67 42CC B491 492B" /* XJùÊ¿´xÿngBÌ´‘I+ */
- $"17C3 C746 9966 5780 BA6C 2798 472E 1CFF" /* .ÃÇF™fW€ºl'˜G..ÿ */
- $"6A32 69A0 86E0 44C6 1679 08F9 9928 48D9" /* j2i †àDÆ.y.ù™(HÙ */
- $"3DA0 CBA0 1E5E 2618 7162 51C9 DEF0 56A0" /* = Ë .^&.qbQÉÞðV  */
- $"1924 F126 CAAD F248 A1A4 2816 13A7 FE76" /* .$ñ&Ê­òH¡¤(..§þv */
- $"594E 647C 36C4 C014 CDC7 5C89 DBAB 9854" /* YNd|6ÄÀ.ÍÇ\‰Û«˜T */
- $"9094 FC96 5FED 7476 AA3C DF0B B47B C123" /* ”ü–_ítvª<ß.´{Á# */
- $"BE6D CD5A BA07 CC19 94FC DC37 B85C 0FD2" /* ¾mÍZº.Ì.”üÜ7¸\.Ò */
- $"9FED 62E6 F910 2F49 529E CE10 9738 D296" /* Ÿíbæù./IRžÎ.—8Ò– */
- $"A81C 1A0D 0FBF 7CAE DB93 40C0 3BC9 5A0C" /* ¨....¿|®Û“@À;ÉZ. */
- $"B23D FBD4 3863 C520 03A0 D966 5327 A0A2" /* ²=ûÔ8cÅ . ÙfS' ¢ */
- $"DD06 B7A1 942B 0A75 CB23 8664 4159 8647" /* Ý.·¡”+ÂuË#†dAY†G */
- $"2725 DAF6 693A 58D7 7A7D B34A 393D FE7A" /* '%Úöi:X×z}³J9=þz */
- $"C105 C374 193C 123C 130E 062C 8AB2 32FD" /* Á.Ãt.<.<...,Š²2ý */
- $"80E0 72E3 6AEA 2078 5D7C D3E5 4E20 D927" /* €àrãjê x]|ÓåN Ù' */
- $"157E 9DC5 1A29 2F0F C326 AFE3 3ACF C361" /* .~Å.)/.Ã&¯ã:ÏÃa */
- $"8C45 D79C EB27 7441 E4C7 8BFD 5832 DB93" /* ŒEלë'tAäÇ‹ýX2Û“ */
- $"78F5 B9DB BA4E 329E A262 C467 88DC C540" /* xõ¹ÛºN2ž¢bÄgˆÜÅ@ */
- $"78E0 4E55 34F3 806E 2DEA B371 E9B5 D8DF" /* xàNU4ó€n-ê³qéµØß */
- $"5EDA B5B9 1C48 5A11 ECAB E4F8 67B7 C76E" /* ^Úµ¹.HZ.ì«äøg·Çn */
- $"460F 8E6A C7BA B5F8 75F2 9105 1480 FD1A" /* F.ŽjǺµøuò‘..€ý. */
- $"80EB DB48 6115 AA6E 9AEA A07C 57B0 1A7F" /* €ëÛHa.ªnšê |W°.. */
- $"0CBF D5DE 47A7 89BE 4CAE 19FE 7B79 5839" /* .¿ÕÞG§‰¾L®.þ{yX9 */
- $"232D 495E 476C E267 D9D2 5257 F0E6 3EB5" /* #-I^GlâgÙÒRWðæ>µ */
- $"F140 AAAF 1E36 BA04 086A EEC5 3232 7958" /* ñ@ª¯.6º..jîÅ22yX */
- $"72E3 FCC3 9488 B44C 0C15 EF6B 811B CF97" /* rãüÔˆ´L..ïk.Ï— */
- $"0532 2B88 663D 8675 6050 AB94 A435 C0FC" /* .2+ˆf=†u`P«”¤5Àü */
- $"9E08 9873 92AF 6859 F7F5 64B0 0BA5 FA68" /* ž.˜s’¯hY÷õd°.¥úh */
- $"3557 0898 9E0D 5795 BF67 2866 5FB6 63C6" /* 5W.˜ž.W•¿g(f_¶cÆ */
- $"4F82 42CE A682 DC8D CB18 D4FE 6252 95D1" /* O‚BΦ‚ÜË.ÔþbR•Ñ */
- $"C85C 6B2C 0FC0 7C9D 5A80 F93B 8900 F93A" /* È\k,.À|Z€ù;‰.ù: */
- $"8EE6 7513 4AFA 1609 3CEE D5EB B420 A1CE" /* Žæu.Jú.Æ<îÕë´ ¡Î */
- $"318D 6F67 720A 7F84 4127 C0F2 9193 35CE" /* 1ogrÂ.„A'Àò‘“5Î */
- $"6D97 9682 5E5D B9FC 5A97 3B71 AB1F 64AA" /* m—–‚^]¹üZ—;q«.dª */
- $"3383 1F0E C0E9 26BE E6EB 24CD 499F F2BA" /* 3ƒ..Àé&¾æë$ÍIŸòº */
- $"997D E886 6FF8 C6B5 0607 1259 7715 7539" /* ™}è†oøƵ...Yw.u9 */
- $"4B57 F7A9 56A7 A04B 031F 0786 6C02 E7BC" /* KW÷©V§ K...†l.ç¼ */
- $"8256 7F27 A39A B66D 6B95 6C11 CDE4 C580" /* ‚V.'£š¶mk•l.ÍäÅ€ */
- $"54DE 7E26 129C EB67 ABC8 455E 6CC3 453E" /* TÞ~&.œëg«ÈE^lÃE> */
- $"F9A8 3ED5 9B43 4EB8 384E 0F7B 28E0 16FF" /* ù¨>Õ›CN¸8N.{(à.ÿ */
- $"1342 18B1 31B6 EAEF 4C40 36F7 0CFF 6AFF" /* .B.±1¶êïL@6÷.ÿjÿ */
- $"8059 5D1C 275B 4F7D B392 4DB0 5E5D 4304" /* €Y].'[O}³’M°^]C. */
- $"4848 2A3A C93F BAD6 638D 315A 8771 1150" /* HH*:É?ºÖc1Z‡q.P */
- $"1D41 B6A7 C9B8 782E 19D8 F8E7 07EB ED20" /* .A¶§É¸x..Øøç.ëí */
- $"7D4E AFFF 5FD2 4FA0 2B48 B549 6A50 AD81" /* }N¯ÿ_ÒO +HµIjP­ */
- $"F11D 357F 7CB2 4B8B F28B 6C97 2C23 58A3" /* ñ.5.|²K‹ò‹l—,#X£ */
- $"92E8 2BFB 77F2 1ECE 7A2A C437 47E3 A833" /* ’è+ûwò.Îz*Ä7Gã¨3 */
- $"D60C C3CA 168A 85B8 620C 109C 4134 35BF" /* Ö.ÃÊ.Š…¸b..œA45¿ */
- $"ECCB 3629 944F AD29 444A C4B6 F019 F19B" /* ìË6)”O­)DJĶð.ñ› */
- $"4189 B1D3 8F28 65B9 85D8 C715 2E1A 267D" /* A‰±Ó(e¹…ØÇ...&} */
- $"A7DB 4C90 9829 BC86 E14C 9F44 757D 5436" /* §ÛL˜)¼†áLŸDu}T6 */
- $"9C38 979D 3654 9A63 E572 7864 E513 A083" /* œ8—6Tšcårxdå. ƒ */
- $"C943 97C5 A88B 23A2 4ECC E4F1 AEED F3EC" /* ÉC—Ũ‹#¢NÌäñ®íóì */
- $"C57D F254 B087 7E1F 81B3 59E6 E2A0 E5CB" /* Å}òT°‡~.³Yæâ åË */
- $"B710 EF71 0598 01BF 1400 3814 0759 EDA8" /* ·.ïq.˜.¿..8..Yí¨ */
- $"386C 3DF0 F1C5 CA93 612F C58D 71BA 6ED6" /* 8l=ðñÅÊ“a/ÅqºnÖ */
- $"FE35 90B4 9C10 A938 33B6 6987 E407 AE7B" /* þ5´œ.©83¶i‡ä.®{ */
- $"5B1A 8E0E BE53 1C94 D747 9303 2ED9 13FA" /* [.Ž.¾S.”×G“..Ù.ú */
- $"226C F38A 7134 3CF6 1923 B85F A254 0048" /* "lóŠq4<ö.#¸_¢T.H */
- $"A765 B678 FC9C 1E2C E183 FC80 CA83 9572" /* §e¶xüœ.,áƒü€Êƒ•r */
- $"E573 B224 9894 7316 C931 4A49 C28F 6E33" /* ås²$˜”s.É1JIÂn3 */
- $"B579 EE14 84BC 61CC 351B 41FB 7095 5F8C" /* µyî.„¼aÌ5.Aûp•_Œ */
- $"1B15 6DAF FF7F F8EA 5A11 5453 6ECA 1C02" /* ..m¯ÿ.øêZ.TSnÊ.. */
- $"C8A4 F40F AD00 7BC9 EDFD AC3A 28E4 546F" /* Ȥô.­.{Éíý¬:(äTo */
- $"1E36 BE45 897E F5D5 BE25 E84B 57C6 9080" /* .6¾E‰~õÕ¾%èKWÆ€ */
- $"B6C4 79B8 153B 110F D90B 215D 401C 0453" /* ¶Äy¸.;..Ù.!]@..S */
- $"8243 BF4A CDAE 9270 0658 462F E0C7 82A8" /* ‚C¿JÍ®’p.XF/àÇ‚¨ */
- $"E155 C547 D144 EBAD 74EC EAFF 7799 6D50" /* áUÅGÑDë­tìêÿw™mP */
- $"D0F9 6BA4 D8B3 0FBB B75B BC48 D5BA 8EAB" /* Ðùk¤Ø³.»·[¼HÕºŽ« */
- $"FF7F 3A2A 820F D817 FB8B 7590 ED4A 3D7B" /* ÿ.:*‚.Ø.û‹uíJ={ */
- $"DAF8 C05F BDCF 1B7C 8862 53A8 95D6 C0DF" /* ÚøÀ_½Ï.|ˆbS¨•ÖÀß */
- $"4069 36DA 0739 783C C432 1E0C 7DA6 2D70" /* @i6Ú.9x<Ä2..}¦-p */
- $"B33A C5AD 810A FBBD E9BB B776 6463 9FDC" /* ³:Å­Âû½é»·vdcŸÜ */
- $"B401 211D 81BA A9FA 8761 ED36 A1EF 439D" /* ´.!.º©ú‡aí6¡ïC */
- $"9880 BE88 E045 3068 F59F 7AD7 EFFF 7FFC" /* ˜€¾ˆàE0hõŸz×ïÿ.ü */
- $"5562 1F00 0818 22D6 5002 F762 7A20 0DC0" /* Ub...."ÖP.÷bz .À */
- $"3ADD FF5D 1851 D391 F011 0000 0000 0000" /* :Ýÿ].QÓ‘ð....... */
- $"0000 0000 0138 5715 ED61 F2C5 2C28 30C0" /* .....8W.íaòÅ,(0À */
- $"F669 9389 6153 3A95 E010 CCA0 2FEF B36F" /* öi“‰aS:•à.Ì /ï³o */
- $"9576 F8C0 F17B 27F6 F6FA 412C 70C7 CF14" /* •vøÀñ{'ööúA,pÇÏ. */
- $"7625 6871 7FE2 16C9 B6E9 5BF1 1A16 E2F0" /* v%hq.â.ɶé[ñ..âð */
- $"945D E51E CCF9 0970 E586 517C 475F 8856" /* ”]å.ÌùÆpå†Q|G_ˆV */
- $"CA0C 1DD9 E001 D7BC 1876 745C 8077 672D" /* Ê..Ùà.×¼.vt\€wg- */
- $"CECA FF0B 01D1 76FA 32F5 C047 26FB 451F" /* ÎÊÿ..Ñvú2õÀG&ûE. */
- $"5261 79B6 5990 79C9 4DF7 5B69 D548 E894" /* Ray¶YyÉM÷[iÕHè” */
- $"F249 0C84 D3F0 9555 7B99 EA27 FA38 184E" /* òI.„Óð•U{™ê'ú8.N */
- $"F863 AFA1 CE80 AEBC CB89 DD99 B8E2 0BEC" /* øc¯¡Î€®¼Ë‰Ý™¸â.ì */
- $"2F74 E534 3FF4 B50A 4B04 02B1 C178 B189" /* /tå4?ôµÂK..±Áx±‰ */
- $"D30F 77DC 8A15 8C9E AF87 1DCD D545 AC6B" /* Ó.wÜŠ.Œž¯‡.ÍÕE¬k */
- $"CAFB 832B E240 6752 8EF2 9BDF 76E8 621D" /* Êûƒ+â@gRŽò›ßvèb. */
- $"892E 384C 7BF0 4DE8 F910 7689 C3F0 E7E9" /* ‰.8L{ðMèù.v‰Ãðçé */
- $"E401 C781 F341 A84F 6922 E97B FC22 E259" /* ä.ÇóA¨Oi"é{ü"âY */
- $"6B26 9B03 14A7 DFA1 B7BD CBED 9539 5DE3" /* k&›..§ß¡·½Ëí•9]ã */
- $"2041 2F5F A37A 2F23 00FC 6424 D7F8 902E" /* A/_£z/#.üd$×ø. */
- $"7261 227B B4EC F4D1 9C18 22C3 8CA5 EFF8" /* ra"{´ìôÑœ."ÃŒ¥ïø */
- $"5701 6734 9110 8B4E D9E0 EE8F 7FEA 202F" /* W.g4‘.‹NÙàî.ê / */
- $"CFF7 5CC7 6107 0B22 B0BE A87B 32EF 0FA8" /* Ï÷\Ça.."°¾¨{2ï.¨ */
- $"3D2D 794E 556E 6089 ACBA D46C 17EC A9DC" /* =-yNUn`‰¬ºÔl.ì©Ü */
- $"0F4E D57D B8C8 EED1 F9D4 F96A 7BEE 3794" /* .NÕ}¸ÈîÑùÔùj{î7” */
- $"49DE 3AA7 EE2E 0B25 A47C 966A D90D C792" /* IÞ:§î..%¤|–jÙ.Ç’ */
- $"6304 7C05 C6EB A26D 83B8 3E0C AAF5 AFFE" /* c.|.Æë¢mƒ¸>.ªõ¯þ */
- $"FDC3 F7C4 C0A3 C3ED E8D2 0FAB AC58 1F56" /* ýÃ÷ÄÀ£ÃíèÒ.«¬X.V */
- $"FF40 F44B 4289 C6D7 CC17 A019 AD4A C889" /* ÿ@ôKB‰Æ×Ì. .­Jȉ */
- $"67AD 0673 32A0 B6BA 087E 7279 19C2 025F" /* g­.s2 ¶º.~ry.Â._ */
- $"DB0E 0E97 02D9 2268 5BCA CDE6 B94E 8D9B" /* Û..—.Ù"h[ÊÍæ¹N› */
- $"03EB D786 1698 2D8A 2ECD 432E D615 931F" /* .ë׆.˜-Š.ÍC.Ö.“. */
- $"452B 5D40 0950 5BBE A70F BD95 9F0E 8B95" /* E+]@ÆP[¾§.½•Ÿ.‹• */
- $"86B7 47DE 0757 BFE4 9775 3082 9D22 863A" /* †·GÞ.W¿ä—u0‚"†: */
- $"E404 B84C 5E88 8424 31DD 689A D234 88E2" /* ä.¸L^ˆ„$1ÝhšÒ4ˆâ */
- $"971F 9E59 429C 6C7E 3670 8F7C 8F86 A80D" /* —.žYBœl~6p|†¨. */
- $"848E E78B 5331 058E E444 FEC2 269A 7E23" /* „Žç‹S1.ŽäDþÂ&š~# */
- $"608D 0502 E075 F7A4 DACF 515F AA08 31C1" /* `..àu÷¤ÚÏQ_ª.1Á */
- $"1275 02C0 F37E F465 ADE9 1918 F1F0 0E4F" /* .u.Àó~ôe­é..ñð.O */
- $"E5A4 41A5 F655 22D9 946A 7FEC 0720 3D3A" /* å¤A¥öU"Ù”j.ì. =: */
- $"4961 05B2 F02D 51D2 1212 084B B3EA 5DC9" /* Ia.²ð-QÒ...K³ê]É */
- $"F986 5763 A2AC E2AC 1144 5DC3 E6A5 D092" /* ù†Wc¢¬â¬.D]Ãæ¥Ð’ */
- $"3654 3737 A598 21C2 34FF 097C B8B8 5934" /* 6T77¥˜!Â4ÿÆ|¸¸Y4 */
- $"C947 05C9 B4BA F52B 99FF 3AFE 6B15 2CAE" /* ÉG.É´ºõ+™ÿ:þk.,® */
- $"06CF D962 CCDE D937 D4AE B3D9 7E92 E2AF" /* .ÏÙbÌÞÙ7Ô®³Ù~’⯠*/
- $"8F4E 31CE 06E7 0AD8 71DB 4456 7101 E221" /* N1Î.çÂØqÛDVq.â! */
- $"74AC 1159 9EDF 9841 CFA3 E04F DECF 6FD3" /* t¬.Yžß˜AÏ£àOÞÏoÓ */
- $"90CC C22F 63B0 45CC C98B 3125 33C0 CFBA" /* ÌÂ/c°EÌÉ‹1%3ÀϺ */
- $"4CE7 3FAD F2E4 85E7 0C74 35A5 97E9 8672" /* Lç?­òä…ç.t5¥—é†r */
- $"9180 E059 EF0F C416 E25F 0E83 095A 36AA" /* ‘€àYï.Ä.â_.ƒÆZ6ª */
- $"8E74 F1F7 11A8 49DD C47E 5098 D576 DC41" /* Žtñ÷.¨IÝÄ~P˜ÕvÜA */
- $"D6FC 7C37 E307 A2DB 997E A046 C114 CF04" /* Öü|7ã.¢Û™~ FÁ.Ï. */
- $"FD8E 32D1 2AC6 3A81 C8B6 C680 6E60 7826" /* ýŽ2Ñ*Æ:ȶƀn`x& */
- $"9A40 9C80 BA1B 4DE8 854B 09D9 33B3 95BE" /* š@œ€º.Mè…KÆÙ3³•¾ */
- $"7CE5 CCA3 C463 5D1C 1F2B A160 E208 AA0A" /* |åÌ£Äc]..+¡`â.ªÂ */
- $"D00F 1933 5FB5 2705 4E9C 3733 0FD0 2AA0" /* Ð..3_µ'.Nœ73.Ð*  */
- $"D116 F240 05EA 53BB 5A5A 0A4B 3D9E FCB7" /* Ñ.ò@.êS»ZZÂK=žü· */
- $"FE35 1D0B 1E56 C4AA 9B6C 8CE6 10CA DAA5" /* þ5...VĪ›lŒæ.ÊÚ¥ */
- $"6DF1 6F74 C332 BD93 556E 89F5 A94A 232D" /* mñotÃ2½“Un‰õ©J#- */
- $"E9EF C950 666C 7D3E D1BA C98F 4489 3C5D" /* éïÉPfl}>ѺÉD‰<] */
- $"F7FC 88D4 C90E EE9D 7691 C976 2CFE 6BA0" /* ÷üˆÔÉ.îv‘Év,þk  */
- $"B53E 5C59 749E FEBC 4AB4 490C A3B6 5187" /* µ>\Ytžþ¼J´I.£¶Q‡ */
- $"4A10 1076 6348 AEC1 054B 0A98 9196 29C3" /* J..vcH®Á.K˜‘–)à */
- $"F995 50E4 E003 F099 9495 7ECC 1C78 C536" /* ù•Päà.ð™”•~Ì.xÅ6 */
- $"AA8D 7305 BE7F FF72 99F7 25ED 4C38 0896" /* ªs.¾.ÿr™÷%íL8.– */
- $"A1BE F2D4 016E B744 CBB7 9CEE 1C88 5E3D" /* ¡¾òÔ.n·DË·œî.ˆ^= */
- $"1B9E E3CB 29D2 AAA7 C3F6 41F4 B6C0 5861" /* .žãË)Òª§ÃöAô¶ÀXa */
- $"93D3 4773 858E 3470 E670 4F94 E206 FBA3" /* “ÓGs…Ž4pæpO”â.û£ */
- $"7050 2A3D 6DC0 004E 32D7 6043 4E5E C44F" /* pP*=mÀ.N2×`CN^ÄO */
- $"284A 3214 97B7 19DE 41C4 6204 56CB 1695" /* (J2.—·.ÞAÄb.VË.• */
- $"BAD8 C308 0FFE BEB7 FE14 C6AC CEE8 5022" /* ºØÃ..þ¾·þ.ƬÎèP" */
- $"C27A 2CCA 4714 4C52 3975 615D A1C8 62BF" /* Âz,ÊG.LR9ua]¡Èb¿ */
- $"C477 FF7E 2637 3B89 8C43 6E09 285B 2D1A" /* Äwÿ~&7;‰ŒCnÆ([-. */
- $"8E9E 4110 CE7B E30A E21C A140 02C8 D0AD" /* ŽžA.Î{ãÂâ.¡@.ÈЭ */
- $"630B 5488 7CE7 B884 393A 6FDD 5A68 7FB9" /* c.Tˆ|縄9:oÝZh.¹ */
- $"60EC C73B 143E 3F61 3E31 1A3E 8438 7944" /* `ìÇ;.>?a>1.>„8yD */
- $"B652 14AE 63CA 803C 9B67 C6FE 2F5D 4CD0" /* ¶R.®cÊ€<›gÆþ/]LÐ */
- $"3A63 1328 8809 A4AB B4A1 8664 FE90 F03E" /* :c.(ˆÆ¤«´¡†dþð> */
- $"18E2 7982 7DDC A444 1306 4546 61B2 A710" /* .ây‚}ܤD..EFa²§. */
- $"CCED 529C 92CB D547 22F5 0DB0 B10F 8450" /* ÌíRœ’ËÕG"õ.°±.„P */
- $"E5AC 253A 6937 BFBD D0C6 8AED 14C7 787E" /* å¬%:i7¿½ÐÆŠí.Çx~ */
- $"21E7 860D 8567 633D A9E6 0466 93A5 6789" /* !ç†.…gc=©æ.f“¥g‰ */
- $"D643 2EEE 7542 7B02 086A 83C4 AD3C 785C" /* ÖC.îuB{..jƒÄ­<x\ */
- $"E3B4 BFC0 C27C 3762 1D98 0A0C B43D 8107" /* ã´¿ÀÂ|7b.˜Â.´=. */
- $"3003 FF74 C626 1BC1 44AA 08A0 7A68 0ADE" /* 0.ÿtÆ&.ÁDª. zhÂÞ */
- $"E9BD 94DB 3644 AA13 CFCA A9CB 0E8F 9061" /* é½”Û6Dª.ÏÊ©Ë.a */
- $"73BC 6A23 359D C129 F184 4EBA BE0F A772" /* s¼j#5Á)ñ„Nº¾.§r */
- $"9AB6 7DDC C179 81DB 9FDC EDA3 E6C5 21E2" /* š¶}ÜÁyÛŸÜí£æÅ!â */
- $"7049 87BC 00E3 34F5 8066 3FFE 7CA7 A588" /* pI‡¼.ã4õ€f?þ|§¥ˆ */
- $"6277 30DE 8FC1 950A A652 5B12 B0A4 B8BE" /* bw0ÞÁ•Â¦R[.°¤¸¾ */
- $"2297 4261 CB90 AEBB F3CB 2BEE 2FA8 149E" /* "—BaË®»óË+î/¨.ž */
- $"11E6 487B 3EFA 45B9 E4A8 17DF DF8E D5FF" /* .æH{>úE¹ä¨.ßߎÕÿ */
- $"750C 2E52 4F3F 5960 B3B7 3DEB CFE3 4EC3" /* u..RO?Y`³·=ëÏãNà */
- $"676F D76A F8C3 67EB 383B 042A C000 1CF5" /* go×jøÃgë8;.*À..õ */
- $"FB57 51DF 4E0F 9709 4A58 F371 8A53 79CD" /* ûWQßN.—ÆJXóqŠSyÍ */
- $"B935 29C8 5953 BBFB B216 24F0 FF5C F1BE" /* ¹5)ÈYS»û².$ðÿ\ñ¾ */
- $"1649 C9BE 754A CC45 62C3 44A2 3E12 A872" /* .IɾuJÌEbÃD¢>.¨r */
- $"736B 05DD F77C C7C6 F33D 8224 147E D163" /* sk.Ý÷|ÇÆó=‚$.~Ñc */
- $"02B4 0BC6 297A FA75 03A7 BFDD 709A A878" /* .´.Æ)zúu.§¿Ýpš¨x */
- $"734A 7236 791A BFF6 9F21 CC67 268D 160D" /* sJr6y.¿öŸ!Ìg&.. */
- $"A6D0 7988 72CF 6475 146C 81EB 8249 518A" /* ¦ÐyˆrÏdu.lë‚IQŠ */
- $"49B7 0389 FDB6 9CEB DCA2 41ED 085D 4E85" /* I·.‰ý¶œëÜ¢Aí.]N… */
- $"03E4 3F4E D8CF 25E1 658D 38F6 8F88 A499" /* .ä?NØÏ%áe8öˆ¤™ */
- $"B64A DD79 FDF2 39FB 5CEC F29B 714A 733B" /* ¶JÝyýò9û\ìò›qJs; */
- $"76E4 94E5 F567 3A71 28F0 13A6 7A74 CD91" /* vä”åõg:q(ð.¦ztÍ‘ */
- $"5804 065E D3C7 09B7 ED19 51E5 0913 4436" /* X..^ÓÇÆ·í.QåÆ.D6 */
- $"9791 BB58 10F3 7183 5DB6 4874 65D2 AAD2" /* —‘»X.óqƒ]¶HteÒªÒ */
- $"DBA2 C761 A70F 3EEE 9256 2EF0 945D E52D" /* Û¢Ça§.>î’V.ð”]å- */
- $"34CF 10DF B2AF 8E14 A5A4 E24F 0051 F63E" /* 4Ï.ß²¯Ž.¥¤âO.Qö> */
- $"F11C 5DAC 6D8D DEDD A585 96FC A2AB A5FF" /* ñ.]¬mÞÝ¥…–ü¢«¥ÿ */
- $"5298 6349 DB41 9276 C1C6 F1E2 9ABF 822B" /* R˜cIÛA’vÁÆñâš¿‚+ */
- $"346F 8679 726C 666A 9638 246A EABE 54A9" /* 4o†yrlfj–8$jê¾T© */
- $"49DD F22A BC62 5867 51F2 FDBD B33B 40E0" /* IÝò*¼bXgQòý½³;@à */
- $"220F 075D 031C EAAE 3CDE 67CF 2269 E26D" /* "..]..ê®<ÞgÏ"iâm */
- $"BEF3 1873 E610 D43E 8F03 A14F F04F 980B" /* ¾ó.sæ.Ô>.¡OðO˜. */
- $"69FF 1E4A 1925 DDE6 B473 84B5 6F53 75DD" /* iÿ.J.%Ýæ´s„µoSuÝ */
- $"CF71 C4C0 72DC 5403 7E7B 1A9B 6F16 BA87" /* ÏqÄÀrÜT.~{.›o.º‡ */
- $"A44D D4A2 8029 E15A 8C17 BE55 A30B 87B3" /* ¤MÔ¢€)áZŒ.¾U£.‡³ */
- $"DC5B CED9 2E4C A8F3 939B 6F82 8885 9BD5" /* Ü[ÎÙ.L¨ó“›o‚ˆ…›Õ */
- $"905B 6EE2 E3C9 D45E DE91 DD46 7EDD 23BB" /* [nâãÉÔ^Þ‘ÝF~Ý#» */
- $"6852 2BD3 3D31 2755 2D1B 7431 35EB 6CBD" /* hR+Ó=1'U-.t15ël½ */
- $"638C 9E5D F0EB 9AE0 49BC D327 7536 BCB3" /* cŒž]ðëšàI¼Ó'u6¼³ */
- $"65F1 992B E073 9D25 980D A244 7F9E 749F" /* eñ™+às%˜.¢D.žtŸ */
- $"53BD D08A C5EF 64A2 D672 7A55 9146 5CAD" /* S½ÐŠÅïd¢ÖrzU‘F\­ */
- $"7839 E1B6 7543 4556 146E C347 33E3 2798" /* x9á¶uCEV.nÃG3ã'˜ */
- $"4752 6F78 AAA5 AE5E 7B02 CD92 D5F1 FD30" /* GRoxª¥®^{.Í’Õñý0 */
- $"F78A 7BFB 03AB CF34 58BF 3810 B8A7 CDAB" /* ÷Š{û.«Ï4X¿8.¸§Í« */
- $"A573 658E 260A 7C50 000F 00AC D13F 618E" /* ¥seŽ&Â|P...¬Ñ?aŽ */
- $"A241 9458 3945 9D59 3F9B 13C5 04CC 600E" /* ¢A”X9EY?›.Å.Ì`. */
- $"FC51 8C8D FBA0 4150 5832 4539 730B 4631" /* üQŒû APX2E9s.F1 */
- $"0598 EE14 817C B560 97C5 B953 64D4 980D" /* .˜î.|µ`—ŹSdÔ˜. */
- $"C379 6FFF 3E63 6746 7BE8 D3AB 5215 B47F" /* Ãyoÿ>cgF{èÓ«R.´. */
- $"3CAE 42E4 D4BF B7BF 6580 3319 6A71 C2E9" /* <®BäÔ¿·¿e€3.jqÂé */
- $"48AA 2C5E 9D78 B9C3 F8DA B858 D5AB 99F4" /* Hª,^x¹ÃøÚ¸XÕ«™ô */
- $"B04F EAAC D0DE 2302 F874 7E64 A69B 89CE" /* °Oê¬ÐÞ#.øt~d¦›‰Î */
- $"AEAB A73F F815 0D06 B24E 39EC D8E9 EFB7" /* ®«§?ø...²N9ìØéï· */
- $"ED32 55A0 8E21 B52A E55C 17AE E07B 42F4" /* í2U Ž!µ*å\.®à{Bô */
- $"D451 CB7C E941 1578 3EE3 9565 087E 9A05" /* ÔQË|éA.x>ã•e.~š. */
- $"B5FC 403A AAA2 25CE 5AC1 B658 1EE9 9A53" /* µü@:ª¢%ÎZÁ¶X.éšS */
- $"4000 51DF 95E8 C605 97AC C7E1 A8B1 F86C" /* @.Qß•èÆ.—¬Çᨱøl */
- $"7C3F 0BCC E410 8FA7 78C0 7964 BDD0 E341" /* |?.Ìä.§xÀyd½ÐãA */
- $"5DC5 D977 EF99 460C FC48 A51A B5CD DE47" /* ]ÅÙwï™F.üH¥.µÍÞG */
- $"F9E2 194D 1F2D B2B6 556B 0F68 BD1B 5BEA" /* ùâ.M.-²¶Uk.h½.[ê */
- $"9FDD 1280 92A3 EF96 132C 22F6 CA8A 1C20" /* ŸÝ.€’£ï–.,"öÊŠ. */
- $"54DA F163 6119 BC02 7AE6 10CA A16B 993A" /* TÚñca.¼.zæ.Ê¡k™: */
- $"E22B CC58 D181 40E6 EA99 0897 5166 4C1F" /* â+ÌXÑ@æê™.—QfL. */
- $"6D58 D092 5119 1AF5 0C2B 1DC6 029D F0E8" /* mXÐ’Q..õ.+.Æ.ðè */
- $"1F6F 9F5C 17D8 68A0 F600 5C68 5C16 4269" /* .oŸ\.Øh ö.\h\.Bi */
- $"F5A9 4D97 32DE 3A9C 6609 86C2 1D0F BA56" /* õ©M—2Þ:œfƆÂ..ºV */
- $"3C8C 1046 E0DC 2ECB 9BDB D61E 6955 CE38" /* <Œ.FàÜ.Ë›ÛÖ.iUÎ8 */
- $"DB97 859B 9E73 78BF FDEB ED74 0C4E 4203" /* Û—…›žsx¿ýëít.NB. */
- $"431D 69C4 635D D1EA 1A9A 6462 BE48 DDB9" /* C.iÄc]Ñê.šdb¾Hݹ */
- $"6E63 C4D8 8886 51CB 19E6 A7C9 5941 8443" /* ncÄ؈†QË.æ§ÉYA„C */
- $"57E5 8C3B B907 FF17 4B41 08DA 7AFC 1B8B" /* WåŒ;¹.ÿ.KA.Úzü.‹ */
- $"9B05 622E 1F81 91D8 2C60 9C6A 3B23 608B" /* ›.b..‘Ø,`œj;#`‹ */
- $"F2EC E527 70F9 D963 D302 D7AC 18E2 2692" /* òìå'pùÙcÓ.׬.â&’ */
- $"AE0C D915 7E30 5B09 305C 8F5D 1346 3FF2" /* ®.Ù.~0[Æ0\].F?ò */
- $"8635 ECEC 1CB7 962D 0846 3FA9 5920 C1B0" /* †5ìì.·–-.F?©Y Á° */
- $"5582 FF3A 24E0 FAAE 8FAE 3843 DFCF B74F" /* U‚ÿ:$àú®®8CßÏ·O */
- $"CAEC 5602 D1C5 1760 5ECD 92C8 1DD1 4ABE" /* ÊìV.ÑÅ.`^Í’È.ÑJ¾ */
- $"2336 8A90 E444 6753 D3E0 0F02 8E99 7393" /* #6ŠäDgSÓà..Ž™s“ */
- $"8B26 6C9F BFB4 64DE 7867 73F7 10F0 477A" /* ‹&lŸ¿´dÞxgs÷.ðGz */
- $"8383 ADA5 49C3 722B 1FD7 0BB5 4118 4714" /* ƒƒ­¥IÃr+.×.µA.G. */
- $"D5F9 6C20 CDD0 8151 EAB4 457F FF4E 314C" /* Õùl ÍÐQê´E.ÿN1L */
- $"6E7F 04DB DE0C 611B 62AC 2A4E 869C 06FB" /* n..ÛÞ.a.b¬*N†œ.û */
- $"DB81 F238 C4FC 149E 8176 3F0C 4B83 0DFF" /* Ûò8Äü.žv?.Kƒ.ÿ */
- $"7FB4 A5F5 80C7 E4F0 47AD 8D3F 5426 B12A" /* .´¥õ€ÇäðG­?T&±* */
- $"8678 11E1 A0EF 5439 31D8 E97E 3AE9 E4DD" /* †x.á ïT91Øé~:éäÝ */
- $"3DB7 4A94 7FFF 7135 0C02 ACE2 70F5 626B" /* =·J”.ÿq5..¬âpõbk */
- $"271A 4401 DF00 AE70 E43B D3F8 75AD 0DAB" /* '.D.ß.®pä;Óøu­.« */
- $"794A C0C7 928F 8621 BE61 DA60 A89F 8E95" /* yJÀÇ’†!¾aÚ`¨ŸŽ• */
- $"64E1 4B82 9CA5 D1CB 26FA 3B49 2FDF 8007" /* dáK‚œ¥ÑË&ú;I/߀. */
- $"60B1 1C23 B192 973E 87DD 9323 E697 CA76" /* `±.#±’—>‡Ý“#æ—Êv */
- $"03D6 B09A 33FA 5CEC 856D 1D12 5249 2492" /* .Ö°š3ú\ì…m..RI$’ */
- $"4924 9249 2492 4924 9231 8B0A C6C2 C882" /* I$’I$’I$’1‹ÂÆÂÈ‚ */
- $"FC66 E59C E646 38B0 B26F A097 FEA2 30FE" /* üfåœæF8°²o —þ¢0þ */
- $"F5B9 90DC 3FEF 3116 73C4 7B20 6C09 EA40" /* õ¹Ü?ï1.sÄ{ lÆê@ */
- $"AB90 6257 8BAD 951C 002E 138D 7274 121D" /* «bW‹­•....rt.. */
- $"B91E 66F5 6038 8257 FD9A 18C9 0155 522C" /* ¹.fõ`8‚Wýš.É.UR, */
- $"D6CC 0F6A 6A4A 09F3 0C4A B702 47FF 7FFC" /* ÖÌ.jjJÆó.J·.Gÿ.ü */
- $"B504 0034 6682 CE19 CA7C 50BE F8B0 9DCB" /* µ..4f‚Î.Ê|P¾ø°Ë */
- $"0092 4924 9248 F298 B4D2 A612 6CEE 878F" /* .’I$’Hò˜´Ò¦.lî‡ */
- $"FF7F FF5F 8F59 B3E0 FE9F A74E 506D C924" /* ÿ.ÿ_Y³àþŸ§NPmÉ$ */
- $"9249 2492 4924 9249 2492 4924 924D 57A2" /* ’I$’I$’I$’I$’MW¢ */
- $"2CC8 426C 393A 96E4 50FB 0ACE 8874 7A86" /* ,ÈBl9:–äPûÂΈtz† */
- $"2B20 84D4 0F34 1532 DFF0 D633 0231 0F65" /* + „Ô.4.2ßðÖ3.1.e */
- $"91D1 8E19 A917 CD2A 8D35 89BE F64E D1A8" /* ‘ÑŽ.©.Í*5‰¾öNѨ */
- $"926C AE06 3A49 80F9 C1FE 0E81 52D8 5A8C" /* ’l®.:I€ùÁþ.RØZŒ */
- $"7A00 5EF2 9F04 3659 74EC D695 94B6 5B90" /* z.^òŸ.6YtìÖ•”¶[ */
- $"89C0 E661 DFC4 5E69 965B 4D1D 4B76 7C0E" /* ‰ÀæaßÄ^i–[M.Kv|. */
- $"89D2 C1E8 B1EF CF9E 5E96 3977 AEA6 532B" /* ‰ÒÁè±ïÏž^–9w®¦S+ */
- $"68B1 BD73 2BE6 BB5B 766E FA91 5C36 628C" /* h±½s+æ»[vnú‘\6bŒ */
- $"F45F FEEA C7DF 49F0 278F F459 E9B6 BDAC" /* ô_þêÇßIð'ôY鶽¬ */
- $"1A28 F485 45C5 2761 DC37 C72A 8A17 2D08" /* .(ô…EÅ'aÜ7Ç*Š.-. */
- $"5130 E9D5 E1BD 2D59 07B5 2290 00F9 F737" /* Q0éÕá½-Y.µ".ù÷7 */
- $"C1F4 5C78 1058 C4C6 13AB AE5C 45DE ACB4" /* Áô\x.XÄÆ.«®\EÞ¬´ */
- $"7DC9 03C4 0F82 7850 6F9E 5FD3 9223 36FE" /* }É.Ä.‚xPož_Ó’#6þ */
- $"8A1D 1D99 FBB3 646B 206B FC7E 668E 4730" /* Š..™û³dk kü~fŽG0 */
- $"7C8C 79D9 A37A 427B 1E91 E7A1 DED2 E57D" /* |ŒyÙ£zB{.‘ç¡ÞÒå} */
- $"E167 967A 8B9F A6C0 A36F 68E8 D03C 84C6" /* ág–z‹Ÿ¦À£ohèÐ<„Æ */
- $"E952 3CAF 039F 18CD 236C 4AE1 FB74 D7F6" /* éR<¯.Ÿ.Í#lJáût×ö */
- $"DFBF B7A4 AFDB D27E 2FB7 7BBF 86F0 DF6F" /* ß¿·¤¯ÛÒ~/·{¿†ðßo */
- $"4F9F C3A7 EC7F 0D0F BEDB 1EFB 77AA FB77" /* OŸÃ§ì...¾Û.ûwªûw */
- $"2CED 1CDE F39E A2F3 567D 91E9 4703 B8A2" /* ,í.Þóž¢óV}‘éG.¸¢ */
- $"5006 2494 6271 81F3 3B95 0B89 EDD5 7FE8" /* P.$”bqó;•.‰íÕ.è */
- $"B864 3D84 75CD 7478 A5D6 28C8 D483 39EF" /* ¸d=„uÍtx¥Ö(ÈÔƒ9ï */
- $"86CA 5763 87CA 97CF A9D4 AFA9 0450 6744" /* †ÊWc‡Ê—Ï©Ô¯©.PgD */
- $"16E3 8C0B 0015 88DA 5244 1AB2 9790 35B0" /* .ãŒ...ˆÚRD.²—5° */
- $"0489 B911 D871 2BB4 6576 C185 22B7 1F86" /* .‰¹.Øq+´evÁ…"·.† */
- $"230A 3CD3 ECB5 20A6 23BA A068 A53E 8EAD" /* #Â<Óìµ ¦#º h¥>Ž­ */
- $"3793 46B5 BA07 96A8 DF28 6A66 CE05 73CE" /* 7“Fµº.–¨ß(jfÎ.sÎ */
- $"1938 F9A6 9CBC 0D7F F193 E0D5 09CC 3426" /* .8ù¦œ¼..ñ“àÕÆÌ4& */
- $"4BB1 52B9 F337 0537 FA01 B010 5471 B015" /* K±R¹ó7.7ú.°.Tq°. */
- $"754C A1A6 E071 800C 1A26 243D 172B 1497" /* uL¡¦àq€..&$=.+.— */
- $"E5DF 1EB1 6A6C 6761 3BA6 52C0 C0B4 69BD" /* åß.±jlga;¦RÀÀ´i½ */
- $"E6B4 275E EB6E 42BF D693 8928 15A4 9DB2" /* æ´'^ënB¿Ö“‰(.¤² */
- $"D8FA E273 6C04 CBB5 06A9 8096 5E97 5D11" /* Øúâsl.˵.©€–^—]. */
- $"0B1B 8E93 BDCC 1AE8 4CBA 9413 A729 F6A7" /* ..Ž“½Ì.èLº”.§)ö§ */
- $"F24D 467F 0316 BF60 F777 C2E3 7FAA DC07" /* òMF...¿`÷wÂã.ªÜ. */
- $"148F 5C26 91C3 20B8 F3A0 9088 F893 6D47" /* .\&‘Ã ¸ó ˆø“mG */
- $"7AC1 A0D9 5483 8281 5B98 28AE 9EAB 94F0" /* zÁ ÙTƒ‚[˜(®ž«”ð */
- $"9B68 08E3 E3DA 7E3A AA84 9EED F083 117F" /* ›h.ããÚ~:ª„žíðƒ.. */
- $"FE75 781E E394 EEEC F9AC 21D6 FF5E DD57" /* þux.ã”îìù¬!Öÿ^ÝW */
- $"96CF A7DF 3C0D 7E2F F9E7 F212 83EE E629" /* –ϧß<.~/ùçò.ƒîæ) */
- $"9543 AA61 C10A 4B12 1DD8 6835 405A D739" /* •CªaÁÂK..Øh5@Z×9 */
- $"DBD7 1628 2816 909D 1DEB 81F2 16AF 8953" /* Û×.((..ëò.¯‰S */
- $"9239 B79D A64A 3275 E506 BFD3 0198 776C" /* ’9·¦J2uå.¿Ó.˜wl */
- $"F4C2 39CD 4CF8 2482 D781 526A 7D82 0B83" /* ôÂ9ÍLø$‚×Rj}‚.ƒ */
- $"120C B2AB 1FC0 2DAA 4A72 ACD9 B4C7 926A" /* ..²«.À-ªJr¬Ù´Ç’j */
- $"CE69 46FA C67E 904D 12D4 D6EC 2F77 AC43" /* ÎiFúÆ~M.ÔÖì/w¬C */
- $"0A82 A09A 8FAC 59F0 D192 4F8F E6D1 A8B3" /* ‚ š¬YðÑ’OæѨ³ */
- $"26FD EAD1 7727 E253 F826 580D 8786 8EAD" /* &ýêÑw'âSø&X.‡†Ž­ */
- $"4561 33FC 6C93 72E4 3F53 3E92 5E78 9597" /* Ea3ül“rä?S>’^x•— */
- $"895F 61B9 D382 514D 839E D4E8 A40B 6F99" /* ‰_a¹Ó‚QMƒžÔè¤.o™ */
- $"0BEC 889F F976 6F24 AEAC 2A18 479B 9CD0" /* .숟ùvo$®¬*.G›œÐ */
- $"A58D E4A8 4940 D7A9 26A7 8649 C387 22EB" /* ¥ä¨I@ש&§†IÇ"ë */
- $"10F3 AB7F 805D 57F4 6918 508A 429D FC32" /* .ó«.€]Wôi.PŠBü2 */
- $"0E49 3480 E5A6 0267 54A6 D677 422D 1B62" /* .I4€å¦.gT¦ÖwB-.b */
- $"4DFB C3A4 2E01 8C0D 029D D238 87B0 230E" /* Mûä..Œ..Ò8‡°#. */
- $"AB6E AEFD 64F3 F7AE 7BD7 DA13 2BCC DCFB" /* «n®ýdó÷®{×Ú.+ÌÜû */
- $"13EC E7EE A36F 86C6 A2D8 DD70 6174 04FA" /* .ìçî£o†Æ¢ØÝpat.ú */
- $"B7F7 A3BF 9C4C F99C C177 9B27 9148 3998" /* ·÷£¿œLùœÁw›'‘H9˜ */
- $"013A 4B0C E3A5 6905 6ADC 739C 3586 7009" /* .:K.ã¥i.jÜsœ5†pÆ */
- $"38DA 0496 C25E DFB2 F2AB 34C0 F138 4F81" /* 8Ú.–Â^ß²ò«4Àñ8O */
- $"7240 2774 4588 B153 267B DBBE DFDE AEAD" /* r@'tEˆ±S&{Û¾ßÞ®­ */
- $"1D90 BA71 2B83 D108 1CDB 8B36 7837 8AAA" /* .ºq+ƒÑ..Û‹6x7Šª */
- $"299C 2916 D66C CC2E 2FCF B0E3 228A 88C1" /* )œ).ÖlÌ./Ï°ã"ŠˆÁ */
- $"568F 12D8 D599 AB3F 29DE 1FA6 9336 132F" /* V.ØÕ™«?)Þ.¦“6./ */
- $"521E 8EB9 9BD4 30E4 362E 349E 209A 6EB6" /* R.Ž¹›Ô0ä6.4ž šn¶ */
- $"D5CC 985B E51E 8A74 B9A0 1718 2753 A1E0" /* Õ̘[å.Št¹ ..'S¡à */
- $"BDCC 77CC 5697 641D B916 AB08 C12F 102F" /* ½ÌwÌV—d.¹.«.Á/./ */
- $"59A0 4283 27A8 9F9E 1980 381A 4785 E896" /* Y Bƒ'¨Ÿž.€8.G…è– */
- $"B9C8 A383 0C1E EBDE A8DC D1A0 00FB 61C2" /* ¹È£ƒ..ëÞ¨ÜÑ .ûa */
- $"70F1 84C8 8368 337E DA6C 7A1A 014F 77C3" /* pñ„ȃh3~Úlz..Owà */
- $"EFFF 0CCC F88E E539 B4FF 3187 54EA 4B2E" /* ïÿ.ÌøŽå9´ÿ1‡TêK. */
- $"27BF 1121 0DCD 456F 5AB4 E115 9E30 8B1C" /* '¿.!.ÍEoZ´á.ž0‹. */
- $"FCFB 8634 E35F E3F0 2A65 8EC0 775F C0EE" /* üû†4ã_ãð*eŽÀw_Àî */
- $"37B2 6C5A AA44 2B7C 889A 5854 FBB4 DC29" /* 7²lZªD+|ˆšXTû´Ü) */
- $"E875 94AB D4F4 19C2 5989 594D 6B55 CB5E" /* èu”«Ôô.ÂY‰YMkUË^ */
- $"012C A350 BF1C 322E 6DC6 6CFB 052A B48D" /* .,£P¿.2.mÆlû.*´ */
- $"2FFE D908 D443 2FB2 706F 13A8 B2BF 2E97" /* /þÙ.ÔC/²po.¨²¿.— */
- $"D7EF 6FE2 7D0B 4D6C 89E6 24BB D547 A266" /* ×ïoâ}.Ml‰æ$»ÕG¢f */
- $"3B92 FF58 BE83 0D95 D587 B51D B83A B360" /* ;’ÿX¾ƒ.•Õ‡µ.¸:³` */
- $"DF16 A55F 5D17 5ED7 C7D7 88FD D24B 89C4" /* ß.¥_].^×Ç׈ýÒK‰Ä */
- $"17FF 1CE0 2FC5 E332 79FF 6532 D599 2C36" /* .ÿ.à/Åã2yÿe2Õ™,6 */
- $"7360 56F2 6017 1165 F8CD AC09 6435 530F" /* s`Vò`..eøͬÆd5S. */
- $"8E48 0152 06AE 7F31 9D5A A12E EC4A 26BD" /* ŽH.R.®.1Z¡.ìJ&½ */
- $"1D28 2D81 EBF2 625A 03C8 8240 FAB0 343C" /* .(-ëòbZ.È‚@ú°4< */
- $"3460 4650 A369 CBAF D533 EC55 DB4D 46F7" /* 4`FP£i˯Õ3ìUÛMF÷ */
- $"45C4 1B75 581D CC26 9E29 8B0F C424 5512" /* EÄ.uX.Ì&ž)‹.Ä$U. */
- $"9417 F11C 77C1 F3FD 57B1 487F D8F8 A086" /* ”.ñ.wÁóýW±H.Øø † */
- $"E60E 2356 E9E1 F3EC 7F31 52E1 E3DB C75E" /* æ.#Véáóì.1RáãÛÇ^ */
- $"7A4B 2D19 8F06 AB86 5A88 F23D C312 C565" /* zK-..«†Zˆò=Ã.Åe */
- $"1AF0 4B35 F0D9 D100 6634 A377 90C1 A69A" /* .ðK5ðÙÑ.f4£wÁ¦š */
- $"1C64 495A BEF2 5A5C 1714 0504 2639 71A2" /* .dIZ¾òZ\....&9q¢ */
- $"5989 FF6E F887 5ADD 9843 A719 60CC 5185" /* Y‰ÿnø‡ZݘC§.`ÌQ… */
- $"B308 2551 F63A 7543 2A92 3949 FCC5 5023" /* ³.%Qö:uC*’9IüÅP# */
- $"5A92 FE32 A26E FF00 9CFC 0CFF 4A08 60C7" /* Z’þ2¢nÿ.œü.ÿJ.`Ç */
- $"F76C 480A E682 3C58 66B8 7045 CDBA 616C" /* ÷lHÂæ‚<Xf¸pEͺal */
- $"9995 BEC1 809B 0892 A7EC 43EC 7FE8 F49F" /* ™•¾Á€›.’§ìCì.èôŸ */
- $"9E4B AFD6 66BB 0B88 38ED B165 9C1D F096" /* žK¯Öf».ˆ8í±eœ.ð– */
- $"64EC FD43 9A7A BC84 8CEF 2E65 F99B 4B43" /* dìýCšz¼„Œï.eù›KC */
- $"7D47 3AE8 D0DB A066 308B 201D FF3F ABC1" /* }G:èÐÛ f0‹ .ÿ?«Á */
- $"CD0D B822 3734 A23E AF05 D1E1 F9F5 AF09" /* Í.¸"74¢>¯.Ñáùõ¯Æ */
- $"6428 F517 1201 C3F1 1B80 0DD2 DCD9 CA31" /* d(õ...Ãñ.€.ÒÜÙÊ1 */
- $"B022 DAFB D990 A8B1 6FF1 004E 4847 E5C8" /* °"ÚûÙ¨±oñ.NHGåÈ */
- $"0580 DA86 704F E2FF 7E83 5167 5C3F ADB2" /* .€Ú†pOâÿ~ƒQg\?­² */
- $"4C44 A9D9 DB84 C360 68ED 1BF0 068E 04BF" /* LD©ÙÛ„Ã`hí.ð.Ž.¿ */
- $"D16E B55F 0701 3739 42FA E15C 0EA2 BF81" /* Ñnµ_..79Búá\.¢¿ */
- $"31C1 F1A3 A766 CAB8 C82E C96B 4868 D491" /* 1Áñ£§fʸÈ.ÉkHhÔ‘ */
- $"5ACB 6EED 4027 0C73 AACA 730C ECA6 DE42" /* ZËní@'.sªÊs.ì¦ÞB */
- $"38DA E07E CE64 BC49 7FDD FCCB 07B3 45BF" /* 8Úà~Îd¼I.ÝüË.³E¿ */
- $"B9DC FF13 039F D40E 43BB ACE4 B8F8 31F5" /* ¹Üÿ..ŸÔ.C»¬ä¸ø1õ */
- $"6743 9390 0B87 C9B1 194A 0200 FB53 29CD" /* gC“.‡É±.J..ûS)Í */
- $"3141 15F5 3C38 9F70 2B7E 0E46 B5A7 5C94" /* 1A.õ<8Ÿp+~.Fµ§\” */
- $"AED4 E415 1639 7B49 20DA 1541 9742 A3A6" /* ®Ôä..9{I Ú.A—B£¦ */
- $"B873 4C7C 9112 1322 7D7F 5F6E 14AB 57FC" /* ¸sL|‘.."}._n.«Wü */
- $"A01D 94EC BC05 F45B C4C4 1FC3 D61B F5D3" /*  .”ì¼.ô[ÄÄ.ÃÖ.õÓ */
- $"0E62 9C2F CAE6 C609 B0D2 803B AF5F CC7F" /* .bœ/ÊæÆÆ°Ò€;¯_Ì. */
- $"4085 5B49 F81B 0AB3 DB0C 27C1 7A95 45D6" /* @…[Iø.³Û.'Áz•EÖ */
- $"CDDD 4F06 1A20 A7FE 22F6 EA13 EB6E C723" /* ÍÝO.. §þ"öê.ënÇ# */
- $"87B9 A058 CAF9 9F59 C9C9 6AAD 8358 5147" /* ‡¹ XÊùŸYÉÉj­ƒXQG */
- $"2B3E 2FD8 506F A48B 305C 97C7 5D25 5C75" /* +>/ØPo¤‹0\—Ç]%\u */
- $"C5B1 E7B4 CBC7 C76A 2FE5 1669 302C 2318" /* űç´ËÇÇj/å.i0,#. */
- $"CB1D BB38 5B47 3563 F041 0F00 C23A B1E9" /* Ë.»8[G5cðA..Â:±é */
- $"1972 D9C9 2F2F 4013 F8EF A6CA 7E8E 705C" /* .rÙÉ//@.øï¦Ê~Žp\ */
- $"0CB6 1301 5ED4 25E6 F7D9 999D AB8F 4CAC" /* .¶..^Ô%æ÷Ù™«L¬ */
- $"6FF2 04C8 8307 016C 6E46 645B 5488 79C0" /* oò.ȃ..lnFd[TˆyÀ */
- $"C0E5 8A2A 46EB DB4C 65A0 27FC 6230 781C" /* ÀåŠ*FëÛLe 'üb0x. */
- $"EDB8 4666 1604 1937 9603 A2AA D8C3 43A6" /* í¸Ff...7–.¢ªØÃC¦ */
- $"E254 D745 866F D24A DD91 397E C575 F187" /* âT×E†oÒJÝ‘9~Åuñ‡ */
- $"193B F5F5 819B 7D57 EC83 0871 ED1B 64F6" /* .;õõ›}Wìƒ.qí.dö */
- $"E47A E1B0 65F9 67DF 5680 3642 52AA BB4B" /* äzá°eùgßV€6BRª»K */
- $"BA52 D8BA 8AF7 0A96 412A 92B2 045F 9739" /* ºRغŠ÷–A*’²._—9 */
- $"3A52 D961 6BC6 1D2E D90D 29A7 E9DE 2651" /* :RÙakÆ..Ù.)§éÞ&Q */
- $"CE3F 9921 03BC 7A7A CBFD 63E2 4C7C 9025" /* Î?™!.¼zzËýcâL|% */
- $"BCC3 D509 745E 9AE4 1675 0242 26EE E4F6" /* ¼ÃÕÆt^šä.u.B&îäö */
- $"B04B CFB3 E37F EADB 2840 E47E 0209 C8C5" /* °Kϳã.êÛ(@ä~.ÆÈÅ */
- $"56FC 6228 BB57 F43A BE32 0753 73FB EAE2" /* Vüb(»Wô:¾2.Ssûêâ */
- $"55B4 D581 42C8 10B8 AEA9 67C4 F685 982C" /* U´ÕBÈ.¸®©gÄö…˜, */
- $"3104 095F DCBD 3701 8749 9CBA A7A5 B714" /* 1.Æ_ܽ7.‡Iœº§¥·. */
- $"FDED FAA3 F034 54D8 728F 8640 4A61 560C" /* ýíú£ð4TØr†@JaV. */
- $"50D4 B224 A5F1 6715 6C8B 7EC6 BF5C 120D" /* PÔ²$¥ñg.l‹~Æ¿\.. */
- $"8797 B25E B0E1 C57E 69AF 1FF2 99C3 44B5" /* ‡—²^°áÅ~i¯.ò™ÃDµ */
- $"0508 0061 1F44 795F 27C0 511E 0796 9740" /* ...a.Dy_'ÀQ..–—@ */
- $"14FF 4C51 5651 34F3 658D 4CA8 3FBF 43CC" /* .ÿLQVQ4óeL¨?¿CÌ */
- $"8813 D372 1723 7DB5 6D44 4524 4E91 B644" /* ˆ.Ór.#}µmDE$N‘¶D */
- $"4B7D CDEC E0E0 8468 622D 87FE 80E3 E097" /* K}Íìàà„hb-‡þ€ãà— */
- $"303D 8894 1FFF 7FA6 9AAB C6E0 0B83 3EDD" /* 0=ˆ”.ÿ.¦š«Æà.ƒ>Ý */
- $"86A5 43D3 C650 0008 D364 A800 0000 0000" /* †¥CÓÆP..Ód¨..... */
- $"0000 07D7 8F92 61B9 E6E0 BCBF CD4A AB76" /* ...×’a¹æ༿ÍJ«v */
- $"5B6E 246A 8DFB D274 41F9 3583 773D 5165" /* [n$jûÒtAù5ƒw=Qe */
- $"2139 B773 476E DF91 33F0 8CDA F420 613F" /* !9·sGnß‘3ðŒÚô a? */
- $"9B35 33C9 8298 A661 A5DB 2CEF 1A1C BC3E" /* ›53É‚˜¦a¥Û,ï..¼> */
- $"09B4 5415 8511 4FE5 3FF8 B88C 339D C169" /* Æ´T.….Oå?ø¸Œ3Ái */
- $"9608 FF62 B2D6 285A 80A2 22C9 E4AA 5A99" /* –.ÿb²Ö(Z€¢"ÉäªZ™ */
- $"B3F5 E9D4 7FFF 7FF4 7D5C 4CC0 788F 0EB6" /* ³õéÔ.ÿ.ô}\LÀx.¶ */
- $"8024 0000 0A1E 1F40 0000 0000 0000 0000" /* €$..Â..@........ */
- $"CA54 CF6A 897B B6D7 9C90 87E9 FF6A 22A0" /* ÊTÏj‰{¶×œ‡éÿj"  */
- $"0765 4AE8 B827 B7A1 C412 4000 0000 0000" /* .eJè¸'·¡Ä.@..... */
- $"0000 2222 DAB7 AEED C4EB AFCB FF79 6610" /* ..""Ú·®íÄë¯Ëÿyf. */
- $"A362 D5F2 1401 DA9F 8978 3FC3 FF60 341C" /* £bÕò..ÚŸ‰x?Ãÿ`4. */
- $"524C CBF3 AF64 9BA4 637F F217 CA8C A4CE" /* RLËó¯d›¤c.ò.ÊŒ¤Î */
- $"A881 46DE C63F CB0B 4C86 F71C CDFF 6CDC" /* ¨FÞÆ?Ë.L†÷.ÍÿlÜ */
- $"3C86 AFD6 02EF 25B3 E392 0238 14ED F9FF" /* <†¯Ö.ï%³ã’.8.íùÿ */
- $"71EA 1A7B 7848 281D C18D 83C1 F0D1 C115" /* qê.{xH(.ÁƒÁðÑÁ. */
- $"C525 7E38 9E60 32A4 CED2 A5DE 8006 1212" /* Å%~8ž`2¤ÎÒ¥Þ€... */
- $"7136 14A1 74D1 9C7D F74C 708E 43DE 4154" /* q6.¡tÑœ}÷LpŽCÞAT */
- $"2939 179A 87BB 2AAF 7401 4404 CB30 458F" /* )9.š‡»*¯t.D.Ë0E */
- $"F1B7 EE42 3E46 458F B220 6F30 EE24 7D86" /* ñ·îB>FE² o0î$}† */
- $"2D28 3CA7 C184 60D3 4EBC 9C79 C402 02FC" /* -(<§Á„`ÓN¼œyÄ..ü */
- $"553C C62D DDC0 3D0C F12B C1FF 546D A4FF" /* U<Æ-ÝÀ=.ñ+ÁÿTm¤ÿ */
- $"5885 6B1B 9EF6 2206 8FB5 1CB0 2D3D B922" /* X…k.žö".µ.°-=¹" */
- $"644F D104 0152 70F8 BF41 4D6E 4F05 B928" /* dOÑ..Rpø¿AMnO.¹( */
- $"396A 4A92 9B1B 24AB 4611 6D95 87D6 2D7C" /* 9jJ’›.$«F.m•‡Ö-| */
- $"7546 B839 A3B1 C612 0F2A 796E 7911 5FF9" /* uF¸9£±Æ..*yny._ù */
- $"03C4 D13E EF00 2DEF 9CFE FDDE 3A2C FF3E" /* .ÄÑ>ï.-ïœþýÞ:,ÿ> */
- $"4567 F432 3673 3F84 8787 B65C 7A4F 2007" /* Egô26s?„‡‡¶\zO . */
- $"FF7C D894 A762 3872 8FA4 9563 D178 5039" /* ÿ|Ø”§b8r¤•cÑxP9 */
- $"C4BD 2EB4 0491 2A80 0000 0000 0000 0001" /* Ľ.´.‘*€........ */
- $"F172 6FA1 09F2 9F35 F3BC 2E0B 8E46 2557" /* ñro¡ÆòŸ5ó¼..ŽF%W */
- $"67C5 4F12 D1CF F08C BC61 0F89 E4A4 9249" /* gÅO.ÑÏðŒ¼a.‰ä¤’I */
- $"2492 4924 9249 221B 4708 65ED 84CA FDD2" /* $’I$’I".G.eí„ÊýÒ */
- $"D193 7C69 0CA3 95EF DDF2 33FF 556E D976" /* Ñ“|i.£•ïÝò3ÿUnÙv */
- $"2E4D FDCE E0FC 8669 83FF 768E 3CBB 179B" /* .MýÎàü†iƒÿvŽ<».› */
- $"DBB9 253D BFFF 79F1 5006 27BF 5548 40B9" /* Û¹%=¿ÿyñP.'¿UH@¹ */
- $"BADC F963 10BA 8BD9 367F E03A 6E29 5908" /* ºÜùc.º‹Ù6.à:n)Y. */
- $"0000 0000 0000 0000 0028 8080 0000 000A" /* .........(€€... */
- $"6370 D000 0142 83C0 0000 0011 CD3F D940" /* cpÐ..BƒÀ....Í?Ù@ */
- $"0022 C990 C912 501C 14FC 1926 5412 0E88" /* ."ÉÉ.P..ü.&T..ˆ */
- $"C32F B2ED E7A4 9249 2492 4924 9249 247E" /* Ã/²í礒I$’I$’I$~ */
- $"FB2C 999E D2ED 6DFF 783B 4C3A 3DB7 14A5" /* û,™žÒímÿx;L:=·.¥ */
- $"872C 2B85 8FC2 72EA 3412 FCA8 32E0 7A2E" /* ‡,+…Ârê4.ü¨2àz. */
- $"B109 F66C 3F99 7C32 2761 1522 7B9C 1851" /* ±Æöl?™|2'a."{œ.Q */
- $"B3CB 5373 0652 CE79 D8C5 B721 03D7 CD81" /* ³ËSs.RÎyØÅ·!.×Í */
- $"A03A CD5F CECF B58A 4122 7ED2 9FFF 7FFF" /*  :Í_ÎϵŠA"~ÒŸÿ.ÿ */
- $"1575 DF0B 430B 0A6C 6108 B421 B33F E9FA" /* .uß.C.Âla.´!³?éú */
- $"AC06 391C EB01 17F4 3BF4 4CDA 87DA 516F" /* ¬.9.ë..ô;ôLÚ‡ÚQo */
- $"EFA3 E7F9 651A 6902 C269 AF79 2EA4 D861" /* ï£çùe.i.Âi¯y.¤Øa */
- $"CBC1 7F37 146D 4163 38BB B16B AAD4 9AC2" /* ËÁ.7.mAc8»±kªÔšÂ */
- $"424A B3CE 1368 78EF B4B0 FE68 2FBA 0CB2" /* BJ³Î.hxï´°þh/º.² */
- $"E672 A89D 999E 64CD 417A 98A3 8458 0603" /* ær¨™ždÍAz˜£„X.. */
- $"C03D 9F9E B15E 8418 0FC6 F3E0 BA39 A3C1" /* À=Ÿž±^„..Æóàº9£Á */
- $"9929 0547 9C29 FC76 57CA B1E5 F887 AE73" /* ™).Gœ)üvWʱåø‡®s */
- $"78AA BA9F FF7F C07C 00F0 28E9 7533 0FC1" /* xªºŸÿ.À|.ð(éu3.Á */
- $"097C 4ABC F3CB 6604 EEC2 5194 A1F2 A201" /* Æ|J¼óËf.îÂQ”¡ò¢. */
- $"D6B0 C5F3 4AA3 8FD8 34DC A382 0CD4 134E" /* Ö°ÅóJ£Ø4Ü£‚.Ô.N */
- $"8275 37F5 2388 74C6 1A6C F889 1037 A348" /* ‚u7õ#ˆtÆ.lø‰.7£H */
- $"ACB4 EFF5 B446 564C C6DC 75F7 8445 013F" /* ¬´ïõ´FVLÆÜu÷„E.? */
- $"79FF 407B 05EE 9C66 8A53 FF7A 367A 6D06" /* yÿ@{.îœfŠSÿz6zm. */
- $"9ADF CBDD 25B5 0629 78A0 A071 35BA EE49" /* šßËÝ%µ.)x  q5ºîI */
- $"64E9 3EA3 9A07 917A 66E3 090C B916 3BF5" /* dé>£š.‘zfãÆ.¹.;õ */
- $"10D7 77D5 7281 248E 3F09 0C0F 319E 7F71" /* .×wÕr$Ž?Æ..1ž.q */
- $"98DA A34A C823 06A4 6BFD 8EA1 8C71 EB25" /* ˜Ú£JÈ#.¤kýŽ¡Œqë% */
- $"E5FC 0BA1 DB35 9514 A229 56F0 7E42 9FD0" /* åü.¡Û5•.¢)Vð~BŸÐ */
- $"5435 3CB7 AED9 0A4F 625B A493 D1B2 C654" /* T5<·®ÙÂOb[¤“ѲÆT */
- $"F691 87F9 F8E9 7459 1823 E06B 57D6 C638" /* ö‘‡ùøétY.#àkWÖÆ8 */
- $"7EE2 8CA0 1D79 4000 0000 0000 0000 0000" /* ~⌠.y@......... */
- $"0000 0000 442A 0D8C 8522 4E1A 3752 5040" /* ....D*.Œ…"N.7RP@ */
- $"E53D EE69 0B70 A6BF 9D0D D725 D66E 8D50" /* å=îi.p¦¿.×%ÖnP */
- $"10DB 966B 649B 0CA3 958B 6457 90CC 214A" /* .Û–kd›.£•‹dWÌ!J */
- $"C4C0 27A2 95F4 98AD 14C2 1892 EBE7 864B" /* ÄÀ'¢•ô˜­.Â.’ëç†K */
- $"18AA 55C7 50D2 4A15 7F4E 566A 9C13 9C52" /* .ªUÇPÒJ..NVjœ.œR */
- $"AC77 FE86 B3A2 5D92 D112 516C BA99 60EE" /* ¬wþ†³¢]’Ñ.Qlº™`î */
- $"221A F194 D9DF FF5F FF6B 77F9 4B01 4F8F" /* ".ñ”Ùßÿ_ÿkwùK.O */
- $"F681 8614 2F3E 31E3 EABB 7C34 6025 A491" /* ö†./>1ãê»|4`%¤‘ */
- $"9BC1 A348 628D 34AE 751A F8F7 7521 7F48" /* ›Á£Hb4®u.ø÷u!.H */
- $"68A4 6B9C F66F 252D 6021 9C97 39AB B637" /* h¤kœöo%-`!œ—9«¶7 */
- $"3B5D E8FB 56EE 824A F65D C84D E23C 7BF2" /* ;]èûVî‚Jö]ÈMâ<{ò */
- $"5400 0000 0000 0000 0000 0000 0014 080D" /* T............... */
- $"B05B 4688 1F60 376D 2209 1DE1 7E75 CD30" /* °[Fˆ.`7m"Æ.á~uÍ0 */
- $"5D2F 627B A077 8D86 2001 62AF 1031 6853" /* ]/b{ w† .b¯.1hS */
- $"2A8E 0308 16F6 C4EC E5B6 814A 1DF2 23EB" /* *Ž...öÄìå¶J.ò#ë */
- $"8C16 64F9 A1ED 8A1F 346E 2E1C 5ACB 4376" /* Œ.dù¡íŠ.4n..ZËCv */
- $"5014 B885 5212 5294 8F4F DF56 7339 8A5D" /* P.¸…R.R”OßVs9Š] */
- $"03C0 A05F D60B 5D58 2677 CD67 A4EE 3803" /* .À _Ö.]X&wÍg¤î8. */
- $"B2B1 9AD5 A41A C3EF 3281 3FFF 780A A5BD" /* ²±šÕ¤.Ãï2?ÿxÂ¥½ */
- $"861B 62F7 456F 1021 93CD A115 BD61 7E4C" /* †.b÷Eo.!“Í¡.½a~L */
- $"2306 D6BF D5D9 18AF 12BB 22D9 E32E 6976" /* #.Ö¿ÕÙ.¯.»"Ùã.iv */
- $"9282 5E47 A842 7983 2C87 64C5 6215 A0D9" /* ’‚^G¨Byƒ,‡dÅb. Ù */
- $"E45A EFAE 74F3 E5E5 7679 A7C0 D366 649C" /* äZï®tóååvy§ÀÓfdœ */
- $"9EF3 D763 2D6C D0AD 48E5 7A2A 9454 8B34" /* žó×c-lЭHåz*”T‹4 */
- $"B7FF 7FCD F604 90E4 2716 1C40 DD8A 8B1A" /* ·ÿ.Íö.ä'..@ÝŠ‹. */
- $"24C8 2F0C 06AC 999A 58B7 C15E E6B1 431B" /* $È/..¬™šX·Á^æ±C. */
- $"73D1 FEC5 5182 4A2D 33CB E920 AFBE 9F5A" /* sÑþÅQ‚J-3Ëé ¯¾ŸZ */
- $"0478 C2F3 80D7 241A 2E07 8BF3 FD3F 471A" /* .xÂó€×$...‹óý?G. */
- $"7C53 1C79 2F17 C32F D5C6 B977 E2F9 9D80" /* |S.y/.Ã/Õƹwâù€ */
- $"558B 7336 75BC 5945 3986 BD1C CE95 EA07" /* U‹s6u¼YE9†½.Εê. */
- $"7152 C778 65AD 73E9 F1B7 24D4 BDB0 7F24" /* qRÇxe­séñ·$Ô½°.$ */
- $"BACD 3C51 D344 33D7 21C7 BE9A 915D 2808" /* ºÍ<QÓD3×!Ǿš‘](. */
- $"3E68 3F1B 43AE 8F30 CE7F FF67 1C78 8498" /* >h?.C®0Î.ÿg.x„˜ */
- $"08D8 E1D9 3F1A E50B EB7C E564 6F4C 57F3" /* .ØáÙ?.å.ë|ådoLWó */
- $"9E60 5F9B 244E 83A9 33C9 668A 3951 7E33" /* ž`_›$Nƒ©3ÉfŠ9Q~3 */
- $"31D7 01E7 0342 6BC0 7FD1 7488 2BE1 9AD1" /* 1×.ç.BkÀ.Ñtˆ+ášÑ */
- $"1938 BBD8 7710 BAD3 BB92 2C80 A162 B2EF" /* .8»Øw.ºÓ»’,€¡b²ï */
- $"3FEA 6FC2 47D2 0D0E 28AB 03DA 4B34 4027" /* ?êoÂGÒ..(«.ÚK4@' */
- $"7FFD 87BC 9D96 E076 3C00 0000 0000 0000" /* .ý‡¼–àv<....... */
- $"0000 0000 0000 136C 1721 95F0 1991 3F80" /* .......l.!•ð.‘?€ */
- $"65DC 1F3F AEA0 BE5C 71D2 94CE C7FF 7FFF" /* eÜ.?® ¾\qÒ”ÎÇÿ.ÿ */
- $"7917 BEAD D458 935A 563C CC9C 6C0D CFFF" /* y.¾­ÔX“ZV<Ìœl.Ïÿ */
- $"55DA 93C2 F199 3D1E C4C2 3C5F A7BC D48E" /* UÚ“Âñ™=.ÄÂ<_§¼ÔŽ */
- $"4980 037B 9FCC F7BC 6E1E 78CD 2838 DC58" /* I€.{ŸÌ÷¼n.xÍ(8ÜX */
- $"F156 C827 88EA BFF7 BD95 BBD6 FE11 C305" /* ñVÈ'ˆê¿÷½•»Öþ.Ã. */
- $"A1D2 FA2A EA0B E56B 285B 91FE 551E F5E2" /* ¡Òú*ê.åk([‘þU.õâ */
- $"687C 5A51 1A67 64D3 BD76 4937 F455 4C94" /* h|ZQ.gdÓ½vI7ôUL” */
- $"6A7E B888 CB40 7AA3 DDEE 8BD8 2D9F 1EB6" /* j~¸ˆË@z£Ýî‹Ø-Ÿ.¶ */
- $"48DF 9C66 6BF3 A26A 3CC4 2D4D E47A 6D9A" /* Hßœfkó¢j<Ä-Mäzmš */
- $"DAB1 1DA4 083A D994 4416 C0D2 2E63 539E" /* Ú±.¤.:Ù”D.ÀÒ.cSž */
- $"7274 3C04 85F4 D7B5 EDEF 507A B2B7 1832" /* rt<.…ô×µíïPz²·.2 */
- $"6615 A186 4A80 0000 0000 0000 0000 0000" /* f.¡†J€.......... */
- $"07CF BF6C 3626 7453 BF7D 8B57 26C9 F556" /* .Ï¿l6&tS¿}‹W&ÉõV */
- $"1F12 0BB9 5DC4 797D 3C69 7DB2 2FFF 7F33" /* ...¹]Äy}<i}²/ÿ.3 */
- $"81FC E4ED 4BF8 9180 3FD2 0142 3F2D 1DF0" /* üäíKø‘€?Ò.B?-.ð */
- $"097B D61C 019A C409 B506 26FC D55D 7AE9" /* Æ{Ö..šÄƵ.&üÕ]zé */
- $"3464 6C57 13E7 565F 2553 70C3 3EC7 87AC" /* 4dlW.çV_%SpÃ>LJ¬ */
- $"3161 5289 3A6A FC0B E254 CAFA 6A32 2F8C" /* 1aR‰:jü.âTÊúj2/Œ */
- $"8B76 FA87 DADD 0333 2250 0058 F5C6 21CD" /* ‹vú‡ÚÝ.3"P.XõÆ!Í */
- $"D094 5CD5 10DD 2FA0 B74B 06FB AA9B 2B62" /* Д\Õ.Ý/ ·K.ûª›+b */
- $"E36D 708E B8F5 0739 3097 7F03 47BE 48F5" /* ãmpŽ¸õ.90—..G¾Hõ */
- $"D079 1641 CA5D DF28 C92B 0EFA B18F CE6F" /* Ðy.AÊ]ß(É+.ú±Îo */
- $"6648 DB26 DE5C 1D17 2BD3 28AF DD89 801C" /* fHÛ&Þ\..+Ó(¯Ý‰€. */
- $"AB0D 40D1 9016 D542 63A0 8222 9D7A F0F5" /* «.@Ñ.ÕBc ‚"zðõ */
- $"A171 2D28 3D2C C22E 09AB 3AA9 C50B 7545" /* ¡q-(=,Â.Æ«:©Å.uE */
- $"4C64 18E8 8E67 3A7D DDBE 36CE 2F97 5AD0" /* Ld.èŽg:}ݾ6Î/—ZÐ */
- $"E4F0 8AFB 6071 6268 E5F6 09EA 245F 9F87" /* äðŠû`qbhåöÆê$_Ÿ‡ */
- $"E304 242C 234C 9FF7 1D0A 11C7 4FE7 20BC" /* ã.$,#LŸ÷.Â.ÇOç ¼ */
- $"EC58 1A4B 5A8E DE45 0E5F 4A03 4C8A 5051" /* ìX.KZŽÞE._J.LŠPQ */
- $"E410 4405 321B BD82 AC69 94F7 AA5E 5C65" /* ä.D.2.½‚¬i”÷ª^\e */
- $"436F 861A C95F 1AB0 2E2B 9689 AA43 B247" /* Co†.É_.°.+–‰ªC²G */
- $"6DE3 4E9E F205 F221 D175 86BB 4434 C0EE" /* mãNžò.ò!Ñu†»D4Àî */
- $"C472 EA2B 499D 63FA B4C8 FAB3 91F3 060D" /* Ärê+Icú´Èú³‘ó.. */
- $"C203 A636 1D98 6B00 D678 0D3C BE92 309E" /* Â.¦6.˜k.Öx.<¾’0ž */
- $"759A 11D4 B514 24FB E4D2 7089 76DE 42DD" /* uš.Ôµ.$ûäÒp‰vÞBÝ */
- $"5338 4798 5943 4A6B 500A 472E 77BE AEBD" /* S8G˜YCJkPÂG.w¾®½ */
- $"93B0 117A 0E2D A8E4 DFED 5A76 1775 2BFF" /* “°.z.-¨äßíZv.u+ÿ */
- $"1A84 CBE1 B007 D3EA 11B0 9BB8 4B3F BB56" /* .„Ëá°.Óê.°›¸K?»V */
- $"33F6 B242 4C5C A63D 638F 1BA5 0AC5 698D" /* 3ö²BL\¦=c.¥ÂÅi */
- $"45B3 D343 D769 FEEE C45D 50B0 9AAA 4146" /* E³ÓC×iþîÄ]P°šªAF */
- $"0BFA F8CC 694B A42D FC1E C3F1 54F0 D3F9" /* .úøÌiK¤-ü.ÃñTðÓù */
- $"F051 5182 D373 5210 38AA F9B0 D3F3 6B07" /* ðQQ‚ÓsR.8ªù°Óók. */
- $"C944 7FCA 2126 D17A 01B1 7763 CDE8 D5FF" /* ÉD.Ê!&Ñz.±wcÍèÕÿ */
- $"00F4 08D7 4060 339C D8E2 7EA4 B00D 3171" /* .ô.×@`3œØâ~¤°.1q */
- $"ABB0 7F47 D146 13B9 398E 14B3 C55D 10AF" /* «°.GÑF.¹9Ž.³Å].¯ */
- $"8D0A 2444 26A0 EFEA 6CB2 51FD EA28 0FD7" /* Â$D& ïêl²Qýê(.× */
- $"4E2F F54F 0066 62F2 66F3 334C 5D9D 77ED" /* N/õO.fbòfó3L]wí */
- $"F3D0 12ED 7A95 89A1 B928 8429 DCFB 8C68" /* óÐ.íz•‰¡¹(„)ÜûŒh */
- $"C35C 3C77 5D7D 5180 A012 ADA3 AE60 AAE0" /* Ã\<w]}Q€ .­£®`ªà */
- $"0D88 09A4 4F7B FAC4 A2FD 327D E109 4F0B" /* .ˆÆ¤O{úÄ¢ý2}áÆO. */
- $"3343 C0ED D985 7402 93E2 7A2E 09B4 09A6" /* 3CÀíÙ…t.“âz.ƴƦ */
- $"5348 2E51 C037 BE62 C1A7 15C4 B9C8 7F4B" /* SH.QÀ7¾bÁ§.ĹÈ.K */
- $"FC22 3596 D989 C701 6701 5488 1001 22B2" /* ü"5–Ù‰Ç.g.Tˆ.."² */
- $"C06A A5D5 2C94 6BA9 D1C6 2B33 5910 8B1F" /* Àj¥Õ,”k©ÑÆ+3Y.‹. */
- $"0B0D 5531 BE0F 3E72 9C60 75A8 2669 220D" /* ..U1¾.>rœ`u¨&i". */
- $"E140 D538 7CD4 5763 D708 6D5E 45C0 AE61" /* á@Õ8|ÔWc×.m^EÀ®a */
- $"EC8B E180 1D9C 712C 4DB9 F177 6733 0F76" /* ì‹á€.œq,M¹ñwg3.v */
- $"9A72 7AD0 D18D 2BE6 9DCE 6294 4092 CE8E" /* šrzÐÑ+æÎb”@’ÎŽ */
- $"ACED 8B00 B050 AE53 C09C 98D6 CFD1 4208" /* ¬í‹.°P®SÀœ˜ÖÏÑB. */
- $"DEB2 AF01 5ED7 E1F4 4EAA 0B09 2263 FE09" /* Þ²¯.^×áôNª.Æ"cþÆ */
- $"2771 6EB7 9181 1DFE A5DD 9A12 4592 02FD" /* 'qn·‘.þ¥Ýš.E’.ý */
- $"5F2D D4D6 5C15 B454 B07C 9B6A B9F9 AEC2" /* _-ÔÖ\.´T°|›j¹ù®Â */
- $"D883 1F5F B9B1 8258 6732 C7E3 5C90 DB16" /* ؃._¹±‚Xg2Çã\Û. */
- $"42EC D875 2B9D FEAF 1FED BD80 261D BAAE" /* BìØu+þ¯.í½€&.º® */
- $"3799 FDC7 DBE5 E769 A11C 3304 5D3B 419C" /* 7™ýÇÛåçi¡.3.];Aœ */
- $"5844 E615 EE7A 5DCE 272E D055 121D 1F84" /* XDæ.îz]Î'.ÐU...„ */
- $"2EC6 E6B1 A7DA D03A D600 6D58 4FF0 9196" /* .Æ汧ÚÐ:Ö.mXOð‘– */
- $"FBCA CDDC 1B8D 9D1A BB7B 3782 0F3F 626C" /* ûÊÍÜ..»{7‚.?bl */
- $"26AA AF34 6A20 8210 1E96 ED21 5A26 EF04" /* &ª¯4j ‚..–í!Z&ï. */
- $"5F66 5C2D A8A4 F3BC 1871 AD1D FE4D 8C8B" /* _f\-¨¤ó¼.q­.þMŒ‹ */
- $"F1E5 A382 654B 08C7 EFC4 BFBA C29B 5C73" /* ñ壂eK.ÇïÄ¿ºÂ›\s */
- $"2420 9390 3B75 6DE6 0208 6F4F BB53 B2AA" /* $ “;umæ..oO»S²ª */
- $"AD28 4360 1A8A 4301 088C 6F17 68CC 9180" /* ­(C`.ŠC..Œo.hÌ‘€ */
- $"D757 7012 3BE3 C4AB DF05 97B9 4B57 B6FC" /* ×Wp.;ãÄ«ß.—¹KW¶ü */
- $"7693 36DE 89E8 E2AB 4352 A782 4520 DA28" /* v“6Þ‰èâ«CR§‚E Ú( */
- $"F1F2 34D6 2EAE E401 ED61 1E2E 4E74 D4EB" /* ñò4Ö.®ä.ía..NtÔë */
- $"98A9 94AD F856 8EE1 E3D0 06FC AA37 31E5" /* ˜©”­øVŽáãÐ.üª71å */
- $"1047 113E C151 CE86 B6A4 0F82 E5D9 CE50" /* .G.>ÁQΆ¶¤.‚åÙÎP */
- $"57A8 8F86 AFAD 21D1 2C4C F181 8BD7 106C" /* W¨†¯­!Ñ,Lñ‹×.l */
- $"3C77 649E 038E 3C63 66F4 EE1A 2906 755C" /* <wdž.Ž<cfôî.).u\ */
- $"EDD8 6093 6868 531C 9FA3 C5C9 3F3C 7786" /* íØ`“hhS.Ÿ£ÅÉ?<w† */
- $"BCC4 440C 13F9 0BCB 76BA 9364 A3CC 344F" /* ¼ÄD..ù.Ëvº“d£Ì4O */
- $"128B D594 CB9D A2DC 6C03 CA48 2D9E 9706" /* .‹Õ”Ë¢Ül.ÊH-ž—. */
- $"A281 5170 A91B 0033 4552 2A9A BF6F D4A9" /* ¢Qp©..3ER*š¿oÔ© */
- $"61B6 F6C1 7959 FDD2 8F3F C94B 2B90 29BB" /* a¶öÁyYýÒ?ÉK+)» */
- $"9FAA A83B FEFF 80A3 1EC2 B2D9 77CF 963B" /* Ÿª¨;þÿ€£.²ÙwÏ–; */
- $"85FF 5728 5CDD 2F01 7556 8155 F8AA 7984" /* …ÿW(\Ý/.uVUøªy„ */
- $"7543 0C18 A1FC 0353 DF5F D368 41E9 E0EF" /* uC..¡ü.Sß_ÓhAéàï */
- $"C363 A78F 3FE9 41E9 5F77 19A4 A811 FF43" /* Ãc§?éAé_w.¤¨.ÿC */
- $"8EE8 3FBA 00FA 54F6 15F5 CF3B 39A6 0984" /* Žè?º.úTö.õÏ;9¦Æ„ */
- $"CC99 7AE1 8E5B 71A9 1575 DB95 F166 D52F" /* Ì™záŽ[q©.uÛ•ñfÕ/ */
- $"A270 08D4 9515 3B89 2EA1 A097 12A3 B4E9" /* ¢p.Ô•.;‰.¡ —.£´é */
- $"5BFB AE47 8FD7 60F0 33DA E91B 234B 5D2F" /* [û®G×`ð3Úé.#K]/ */
- $"7C4B 00C2 60F1 7260 B78A 1835 B440 611B" /* |K.Â`ñr`·Š.5´@a. */
- $"042D F768 F9C9 8785 50AD 8421 77D4 B97A" /* .-÷hùɇ…P­„!wÔ¹z */
- $"6B02 828C E758 8B31 1E92 DF7F BE67 3DAB" /* k.‚ŒçX‹1.’ß.¾g=« */
- $"E5F8 F1FB FD8C 34F4 4B2F 98BF 24A9 4DF2" /* åøñûýŒ4ôK/˜¿$©Mò */
- $"32A9 A661 B01E F960 12E1 9C18 F197 CEA7" /* 2©¦a°.ù`.áœ.ñ—Χ */
- $"E1C4 4AB4 7CEB 2CE2 33F3 C23C F3FD 2CF9" /* áÄJ´|ë,â3óÂ<óý,ù */
- $"F132 8395 3D39 FD9D 983D 4454 9758 856B" /* ñ2ƒ•=9ý˜=DT—X…k */
- $"6556 B234 72B0 C2CA 71CA 9CEB 7AE4 FD7C" /* eV²4r°ÂÊqÊœëzäý| */
- $"0E3F 1930 6B17 7074 C216 3D9C 24BF 5B97" /* .?.0k.ptÂ.=œ$¿[— */
- $"A7EA 25F0 9DCC AFA5 BBEF 47E9 D7E6 7B0E" /* §ê%ð̯¥»ïGé×æ{. */
- $"E02F 87A2 EF87 68FC 9BF7 F274 5F00 FC3D" /* à/‡¢ï‡hü›÷òt_.ü= */
- $"A5F8 7AC7 F0FA A5F8 7D42 C03F 0F42 FE1D" /* ¥øzÇðú¥ø}BÀ?.Bþ. */
- $"ABF0 F7CF E1EE 40ED 1CBC E67A C7C3 33E9" /* «ð÷Ïáî@í.¼æzÇÃ3é */
- $"75CE 6202 697A FF68 B299 C0A6 2F39 4F64" /* uÎb.izÿh²™À¦/9Od */
- $"6775 1459 6387 68C9 941E E328 B150 8D7C" /* gu.Yc‡hÉ”.ã(±P| */
- $"24C4 D953 4443 9A50 E4CC 4E41 B3A9 F28A" /* $ÄÙSDCšPäÌNA³©òŠ */
- $"BB0E 943C 0DAB C98A 023C 332B AE2D AF60" /* ».”<.«ÉŠ.<3+®-¯` */
- $"4D30 BA77 9D1A 93DC CEBB 7560 EA33 084C" /* M0ºw.“Üλu`ê3.L */
- $"BCFD 2F47 685E 4CC9 8A76 F1C8 04AB 126F" /* ¼ý/Gh^LÉŠvñÈ.«.o */
- $"B9FD 4A34 E181 4147 9F56 2AB4 EB2C 50EF" /* ¹ýJ4áAGŸV*´ë,Pï */
- $"D652 4543 763B B857 210B 2B4A BB50 0EAE" /* ÖRECv;¸W!.+J»P.® */
- $"90BD EEEC F92B DD18 0881 9B3A C6DF A028" /* ½îìù+Ý..›:Æß ( */
- $"45EB 36D7 50B4 D756 FB49 9F08 D74D 037B" /* Eë6×P´×VûIŸ.×M.{ */
- $"83A1 001C 0977 1DCC 81D0 B6B9 828A 6851" /* ƒ¡..Æw.Ìж¹‚ŠhQ */
- $"3CAC B3FF 572B 543A 4C73 3F35 0561 EC81" /* <¬³ÿW+T:Ls?5.aì */
- $"A8D4 82BC 9148 5E30 FF3E 3164 C43E 5461" /* ¨Ô‚¼‘H^0ÿ>1dÄ>Ta */
- $"4BD0 139E 6390 0E05 4793 56B8 5080 CBF6" /* KÐ.žc..G“V¸P€Ëö */
- $"9E70 BEA1 FB26 DD1E AEE1 E78D 0D32 FA02" /* žp¾¡û&Ý.®áç.2ú. */
- $"43FC FBC6 7464 2C9A 14AD 2C7C 0969 995F" /* CüûÆtd,š.­,|Æi™_ */
- $"6363 3037 9C34 C5F8 42DF B339 D2B0 5C45" /* cc07œ4ÅøBß³9Ò°\E */
- $"6130 509D 28E7 D3A7 9308 74ED 9265 B7F9" /* a0P(çÓ§“.tí’e·ù */
- $"0F54 D265 33D9 EB57 07C4 852B E3C8 771F" /* .TÒe3ÙëW.Ä…+ãÈw. */
- $"21F8 ADA3 D807 625C 513A E395 604B 0D6A" /* !ø­£Ø.b\Q:ã•`K.j */
- $"A9FC 297E 63AF 7622 23B6 63E1 EF25 F572" /* ©ü)~c¯v"#¶cáï%õr */
- $"01B0 400D 18C6 C9FA 6AF5 3E26 4199 6E68" /* .°@..ÆÉújõ>&A™nh */
- $"99B5 B3A9 F861 3419 C6C7 B65C D0F6 353B" /* ™µ³©øa4.ÆǶ\Ðö5; */
- $"6551 1B0A 9D82 1F07 4185 8C46 5867 DC22" /* eQ.‚..A…ŒFXgÜ" */
- $"BD38 AFF7 27BA 1114 9266 5EF4 1EA9 89B4" /* ½8¯÷'º..’f^ô.©‰´ */
- $"A634 E917 65E5 502E 8028 D24E 725F 0C22" /* ¦4é.eåP.€(ÒNr_." */
- $"1513 7B38 5FEA 3150 520B 6D8A 03D8 F796" /* ..{8_ê1PR.mŠ.Ø÷– */
- $"D183 D8FA 82E2 C147 B662 593B 9FC8 A2A0" /* уØú‚âÁG¶bY;ŸÈ¢  */
- $"C63B D151 D905 072C 02E5 919B 0BE9 6D76" /* Æ;ÑQÙ..,.å‘›.émv */
- $"4BEF 7D51 FF67 C2F2 BB61 DDD2 7981 0B7E" /* Kï}QÿgÂò»aÝÒy.~ */
- $"D406 3679 DFA4 FAE3 A33C 28AC 06C6 93C1" /* Ô.6yߤúã£<(¬.Æ“Á */
- $"B82F 53DB 1EB8 A6F3 5A24 A44A 1A76 9204" /* ¸/SÛ.¸¦óZ$¤J.v’. */
- $"6543 FC80 18DA 3C5D 395B 01DC D7E8 C21E" /* eCü€.Ú<]9[.Ü×èÂ. */
- $"A66C 9AE3 08D6 DBFC EE95 9E73 F71D 7CCA" /* ¦lšã.ÖÛüî•žs÷.|Ê */
- $"2A6A F6D2 11D9 AC28 BEDE 8E1B 65EF A995" /* *jöÒ.Ù¬(¾ÞŽ.eï©• */
- $"F7B5 B19D 5F63 F42B D0AD D69A BD47 1EED" /* ÷µ±_cô+Э֚½G.í */
- $"2E5C 0276 3AEA F6D9 6E3F 314C 7F5F 52C3" /* .\.v:êöÙn?1L._RÃ */
- $"093D C8A9 23E4 C154 5587 294A 98A9 0643" /* Æ=È©#äÁTU‡)J˜©.C */
- $"AF18 0D20 51A4 6FE1 F326 11E7 5A91 2919" /* ¯.. Q¤oáó&.çZ‘). */
- $"DD53 B13B 2CB3 DE77 FAB9 420E BAFB 305B" /* ÝS±;,³Þwú¹B.ºû0[ */
- $"E9AB 7A2B 623B 78FE 346D 8BB6 BA40 AE40" /* é«z+b;xþ4m‹¶º@®@ */
- $"5B6D 6D53 81A1 076D 7058 E792 E410 3FA7" /* [mmS¡.mpXç’ä.?§ */
- $"AD06 7E2E 5158 D129 9233 6E1D 6B7C C701" /* ­.~.QXÑ)’3n.k|Ç. */
- $"D61D 42D8 472F D5E2 2710 0B6C 828A 2352" /* Ö.BØG/Õâ'..l‚Š#R */
- $"D400 65FA E227 A938 1832 18CC 2BCE 19A8" /* Ô.eúâ'©8.2.Ì+Î.¨ */
- $"773C 3CB1 C6BD D722 8EE1 8AE2 4D4B 97D4" /* w<<±Æ½×"ŽáŠâMK—Ô */
- $"1763 37E4 2F93 8578 534E 0BA9 B493 3B80" /* .c7ä/“…xSN.©´“;€ */
- $"F018 28BE 2A52 15B2 8499 08A8 005F F028" /* ð.(¾*R.²„™.¨._ð( */
- $"ADFD ACEB 238F 922A 75E4 1C65 F2C3 F14B" /* ­ý¬ë#’*uä.eòÃñK */
- $"213D 7263 4A9A 1C80 12BD 5895 0EC8 B955" /* !=rcJš.€.½X•.ȹU */
- $"8CD0 FB81 63CF FF7F B545 85DF E201 36A9" /* ŒÐûcÏÿ.µE…ßâ.6© */
- $"E524 1BD6 EDDA 7C33 8CD2 E114 BA93 51E0" /* å$.ÖíÚ|3ŒÒá.º“Qà */
- $"A113 A12A FBEA 8570 B5FE E1B6 7963 5B31" /* ¡.¡*ûê…pµþá¶yc[1 */
- $"512A 99B1 3A59 E50E C584 DD7F FF7F FF7E" /* Q*™±:Yå.Å„Ý.ÿ.ÿ~ */
- $"D3C9 019B 1FBC DB70 2C2A 14A6 E7F1 0147" /* ÓÉ.›.¼Ûp,*.¦çñ.G */
- $"5F3A A36C 6F8A 9038 ABD8 EB8F FF7F FE79" /* _:£loŠ8«Øëÿ.þy */
- $"6C12 2D6F FD6D F9A0 0392 0E82 0296 3C14" /* l.-oýmù .’.‚.–<. */
- $"FEFA 803C A3D4 1049 CF30 E22F 6542 7ABF" /* þú€<£Ô.IÏ0â/eBz¿ */
- $"378E 66B2 9091 D396 B953 DCF5 66D3 C5B5" /* 7Žf²‘Ó–¹SÜõfÓŵ */
- $"7719 028C 5C0F F898 00A1 0C1D E181 F9C7" /* w..Œ\.ø˜.¡..áùÇ */
- $"2E46 06D4 D623 1256 EFAE 89E3 4FFF 7FDD" /* .F.ÔÖ#.VﮉãOÿ.Ý */
- $"F00D 4E11 65D5 B8F9 7C0B A045 AC4A 1E42" /* ð.N.eÕ¸ù|. E¬J.B */
- $"221C B512 5480 EF2D CB80 A089 3603 2CA1" /* ".µ.T€ï-Ë€ ‰6.,¡ */
- $"391C 7925 C817 92E3 8438 C438 08D1 0637" /* 9.y%È.’ã„8Ä8.Ñ.7 */
- $"9FCD F4C2 C04C 40BB A484 5043 0C1E 7C85" /* ŸÍôÂÀL@»¤„PC..|… */
- $"D7F6 1F6D BFC7 60AA 4D18 A399 9A13 CCD0" /* ×ö.m¿Ç`ªM.£™š.ÌÐ */
- $"26DA 3F97 24CB E902 0668 67F7 FE63 7A2E" /* &Ú?—$Ëé..hg÷þcz. */
- $"16D6 987F FF7F AFC1 5C35 E63D BA36 6227" /* .Ö˜.ÿ.¯Á\5æ=º6b' */
- $"FF7C FD39 8B8B 1A5F 6026 831B 0764 8805" /* ÿ|ý9‹‹._`&ƒ..dˆ. */
- $"E40B 0F19 7FFF 7FFC DEBC DD5B 9008 0000" /* ä....ÿ.üÞ¼Ý[... */
- $"0C24 1D44 4641 3BC8 4248 E229 62D2 088D" /* .$.DFA;ÈBHâ)bÒ. */
- $"117F DE8D 0B52 C3FD 1DD9 3823 F138 4C98" /* ..Þ.RÃý.Ù8#ñ8L˜ */
- $"58A8 2683 519C F914 4961 5226 891F F863" /* X¨&ƒQœù.IaR&‰.øc */
- $"3FF2 B19F 113D BFEF 9D12 30C6 66BD E2A6" /* ?ò±Ÿ.=¿ï.0Æf½â¦ */
- $"5D8C BE7E BE19 3D8F 03F2 5D26 FF7F FF7E" /* ]Œ¾~¾.=.ò]&ÿ.ÿ~ */
- $"A82B 5E03 E7A8 E8F1 8C4D B6F1 F0E2 FC36" /* ¨+^.ç¨èñŒM¶ñðâü6 */
- $"DE7A 2F55 38B1 B436 2E50 7D25 E3F0 82C8" /* Þz/U8±´6.P}%ãð‚È */
- $"580F 0D19 C280 415C 2A7F FCD9 C720 E649" /* X...€A\*.üÙÇ æI */
- $"4064 2624 04AC 0B71 41FD 3937 8359 4137" /* @d&$.¬.qAý97ƒYA7 */
- $"8CA9 B642 C318 BD37 82D3 B786 8217 3252" /* Œ©¶BÃ.½7‚Ó·†‚.2R */
- $"44EA 4598 57D2 2F66 957F 39FE D712 F449" /* DêE˜WÒ/f•.9þ×.ôI */
- $"213A BEBB B6CC F551 FF7F EB0A AE45 8497" /* !:¾»¶ÌõQÿ.ë®E„— */
- $"0F4C FD34 4090 01FE CFC8 51AA C32A 7D95" /* .Lý4@.þÏÈQªÃ*}• */
- $"D414 2609 E22F 1B7D E10E 97BB 05D1 9D04" /* Ô.&Æâ/.}á.—».Ñ. */
- $"0592 9271 0D39 AB59 F165 0D09 549C B4E3" /* .’’q.9«Yñe.ÆTœ´ã */
- $"AEE5 555F 00A3 5E0A E4D3 BAFE 1EC6 2FCE" /* ®åU_.£^ÂäÓºþ.Æ/Î */
- $"FB04 C9BC 71D8 A42D 2F70 9FE1 EC17 C31D" /* û.ɼqؤ-/pŸáì.Ã. */
- $"ECB2 0A82 EFB1 914C F6D2 E54C 5316 B6C4" /* ì²Â‚ﱑLöÒåLS.¶Ä */
- $"4FFF 653B FD6E 27A6 9959 244B F458 B35C" /* Oÿe;ýn'¦™Y$KôX³\ */
- $"865C EB94 2CD7 7343 B74C C211 8A4D 2A99" /* †\ë”,×sC·LÂ.ŠM*™ */
- $"732E 3B43 CEAC C300 A520 924D 6F1F 8295" /* s.;CάÃ.¥ ’Mo.‚• */
- $"DF36 1FD4 E8F0 9221 6313 1B33 0C98 2721" /* ß6.Ôèð’!c..3.˜'! */
- $"8F55 5BA1 0E46 A755 1D7F A914 458D 9FFF" /* U[¡.F§U..©.EŸÿ */
- $"33CF 4CE3 AFC6 3383 BC4D A7E9 F546 FDCB" /* 3ÏLã¯Æ3ƒ¼M§éõFýË */
- $"8276 7778 2BBA EF7C 3677 6251 58C0 9EFF" /* ‚vwx+ºï|6wbQXÀžÿ */
- $"526C C883 6CFF 7FFF 7D4C 3F9F BD74 6BE9" /* Rlȃlÿ.ÿ}L?Ÿ½tké */
- $"B6EB 9003 823B 235D 6AD9 B382 FC45 F10C" /* ¶ë.‚;#]jÙ³‚üEñ. */
- $"8282 90ED 9D47 E949 FADC 7B04 1C1C 9EF1" /* ‚‚íGéIúÜ{...žñ */
- $"1ABB 270D 07BE 1943 4E14 70E0 48FF 81EE" /* .»'..¾.CN.pàHÿî */
- $"CE8A 5AAD 3CE9 090D 3126 F96A AEBA 5853" /* ΊZ­<éÆ.1&ùj®ºXS */
- $"D02E ADE8 4614 E2B7 2E7E 3DB6 DE6A 77A8" /* Ð.­èF.â·.~=¶Þjw¨ */
- $"48D0 2DBB BAF4 E94C 735D 27D6 87FF 7F80" /* HÐ-»ºôéLs]'Ö‡ÿ.€ */
- $"5BCC 3CA6 1168 D9E0 38B4 22B2 2154 02AA" /* [Ì<¦.hÙà8´"²!T.ª */
- $"A1FF 6D87 EB2B F3EB 3814 9F74 DEF3 4D86" /* ¡ÿm‡ë+óë8.ŸtÞóM† */
- $"ED68 7E75 9E81 1FD9 170B E013 7E4D 97B3" /* íh~už.Ù..à.~M—³ */
- $"51B0 6B2A 42AF EEB4 899B D2A2 6AC9 8EBF" /* Q°k*B¯î´‰›Ò¢jÉŽ¿ */
- $"2858 9FFC 5050 3364 8F2D 313E 94A9 5ED5" /* (XŸüPP3d-1>”©^Õ */
- $"6213 E9DD 6FF6 5813 72DA FE40 0F70 06C4" /* b.éÝoöX.rÚþ@.p.Ä */
- $"FF7D 053C 3E69 C976 DDFF 02D9 4688 D8D7" /* ÿ}.<>iÉvÝÿ.ÙFˆØ× */
- $"8DEF 5187 FCA3 40EE 3167 B6DD 7EE6 42AB" /* ïQ‡ü£@î1g¶Ý~æB« */
- $"B07A DB20 DC1D 7016 631F 8FB0 C83A 9CC2" /* °zÛ Ü.p.c.°È:œÂ */
- $"66B9 304B 74F5 03F7 217C D3E3 6000 ECE6" /* f¹0Ktõ.÷!|Óã`.ìæ */
- $"A319 FD9E 4131 7E74 59C6 FB3F 1B51 FE89" /* £.ýžA1~tYÆû?.Qþ‰ */
- $"52D3 C845 1BF0 4BFE 3BAE 4940 9830 8E9C" /* RÓÈE.ðKþ;®I@˜0Žœ */
- $"F843 F6A2 218E B2E2 8092 8E0E 3889 8137" /* øCö¢!Ž²â€’Ž.8‰7 */
- $"583C 394F CCE6 3D1B 37B8 C9A4 D805 B9E4" /* X<9OÌæ=.7¸É¤Ø.¹ä */
- $"A037 E45D 1167 9627 81E0 538C 1B6D EA0E" /*  7ä].g–'àSŒ.mê. */
- $"18CD 8E3C EE0C 5E0C B048 8DD2 C804 CA38" /* .ÍŽ<î.^.°HÒÈ.Ê8 */
- $"8678 CAA9 5EE1 8B6C E7D9 FDE1 5C14 D52A" /* †xÊ©^á‹lçÙýá\.Õ* */
- $"67F3 8A12 F698 857A 5692 1FB3 FF27 FE1B" /* góŠ.ö˜…zV’.³ÿ'þ. */
- $"7E31 5D25 B4A2 3647 FF07 064A 4D7B F160" /* ~1]%´¢6Gÿ..JM{ñ` */
- $"62D7 81CE 0940 AE5F CAEB F1A6 10C4 CB0E" /* b×ÎÆ@®_Êëñ¦.ÄË. */
- $"3D77 2C40 0146 8C72 B765 F6A9 3047 E748" /* =w,@.FŒr·eö©0GçH */
- $"0239 A725 8B4C 56F0 7E86 9A24 53D7 4832" /* .9§%‹LVð~†š$S×H2 */
- $"7924 73CB 4431 4977 0487 03FC F1B3 A21C" /* y$sËD1Iw.‡.üñ³¢. */
- $"2792 0B05 8183 8348 8EC0 2635 47D9 B51D" /* '’..ƒƒHŽÀ&5GÙµ. */
- $"CE40 1FA4 20C5 93A8 BEB4 B8CD 93D8 A79E" /* Î@.¤ Å“¨¾´¸Í“اž */
- $"62C5 846C 964D 0404 BE21 3AA5 9EC3 4450" /* bÅ„l–M..¾!:¥žÃDP */
- $"FAEE 938A A428 E4D0 7F1B 46A8 7AEC 97FB" /* úî“Š¤(äÐ..F¨zì—û */
- $"1AFF 71DA F26D B5B1 E6F2 66B4 865E 1F12" /* .ÿqÚòmµ±æòf´†^.. */
- $"CE0F 3A8A EDF1 6321 BC5A 22D5 D3D6 BE19" /* Î.:Šíñc!¼Z"ÕÓÖ¾. */
- $"671A 38C3 11E8 FC9D 93AC 895A 1B84 7C9B" /* g.8Ã.èü“¬‰Z.„|› */
- $"979F 5DC5 BBE6 19A8 5D03 BE83 6FA4 B8F2" /* —Ÿ]Å»æ.¨].¾ƒo¤¸ò */
- $"AFCD 8115 B21B C1D5 80B4 5E20 3B19 9E48" /* ¯Í.².ÁÕ€´^ ;.žH */
- $"29C0 68DA F799 EC0D 56B3 7049 5EC1 11CB" /* )ÀhÚ÷™ì.V³pI^Á.Ë */
- $"CBAF FA0A 5AF1 22F1 3A4C 6F13 635A C681" /* ˯úÂZñ"ñ:Lo.cZÆ */
- $"06DA 8B44 A35B CF31 9B6F 57E6 AEC2 8D59" /* .Ú‹D£[Ï1›oWæ®ÂY */
- $"1556 A43E A289 74DC C398 B209 31B9 8CD0" /* .V¤>¢‰tÜزÆ1¹ŒÐ */
- $"07BE D253 76AB 7D79 4F26 D099 7AE8 E52C" /* .¾ÒSv«}yO&Йzèå, */
- $"EA35 D7BB E968 CAA0 5F61 EAE5 E9A1 E903" /* ê5×»éhÊ _aêåé¡é. */
- $"100E ED2C 5A66 21E2 1426 BE74 7A19 8C98" /* ..í,Zf!â.&¾tz.Œ˜ */
- $"3D67 A4D2 370F C95D 7131 2D31 0971 6022" /* =g¤Ò7.É]q1-1Æq`" */
- $"F4F2 359E 1FBD D23A CD94 4467 205E F7B1" /* ôò5ž.½Ò:Í”Dg ^÷± */
- $"5D18 EE91 9078 176B ADC2 65EB EECF D1A8" /* ].î‘x.k­ÂeëîÏѨ */
- $"F1B3 B999 E7CC 3079 BD9C 82D8 DF6E 29E0" /* ñ³¹™çÌ0y½œ‚Øßn)à */
- $"9502 EC8D 5C13 629B 109E A7C0 F438 6674" /* •.ì\.b›.ž§Àô8ft */
- $"C48B E75A 7CAC 28AE 3E9C 0ECF 9ADF F7BF" /* Ä‹çZ|¬(®>œ.Ïšß÷¿ */
- $"C51A E20D 64F1 B1DD C986 0C6F 6BFF 5102" /* Å.â.dñ±ÝɆ.okÿQ. */
- $"B233 B826 EBC9 35E2 9799 0A0F E81D 0816" /* ²3¸&ëÉ5â—™Â.è... */
- $"E01C B1A8 E4D9 1CCF 7F2E 4DB3 371B 83C0" /* à.±¨äÙ.Ï..M³7.ƒÀ */
- $"9DFD A603 83D6 4412 7DCF 2E2F 85D8 8259" /* ý¦.ƒÖD.}Ï./…Ø‚Y */
- $"DC97 798F 2E8A 09F5 C1A7 1E56 55F3 BFD0" /* Ü—y.ŠÆõÁ§.VUó¿Ð */
- $"34CE 311A 98BE C87C 8CCE 6EDF C85C A788" /* 4Î1.˜¾È|ŒÎnßÈ\§ˆ */
- $"AA7E 47D5 72AF 1842 5C5F 9D6A C586 CA4C" /* ª~GÕr¯.B\_jņÊL */
- $"34D3 6315 D6CA 0D6D 5B75 6C85 551B E270" /* 4Óc.ÖÊ.m[ul…U.âp */
- $"E9DD 6127 C363 1F5A 0AA4 8F55 114F 9ED3" /* éÝa'Ãc.Z¤U.OžÓ */
- $"034E A968 1BF1 513A 2F0D 3E61 612A 15E6" /* .N©h.ñQ:/.>aa*.æ */
- $"B89F 1877 F38E 8C96 20C3 1952 A559 62AE" /* ¸Ÿ.w󎌖 Ã.R¥Yb® */
- $"20E0 BE7D BF7C FAA3 F56C FF75 6D5E 07E7" /* à¾}¿|ú£õlÿum^.ç */
- $"EB87 E7E9 BFE7 EE37 E7EE B60B E7DA F7CF" /* ë‡çé¿çî7çî¶.çÚ÷Ï */
- $"A6FF 2B5C 2F9F AC00 ED1C BCF0 084D B6D5" /* ¦ÿ+\/Ÿ¬.í.¼ð.M¶Õ */
- $"A3F8 3A1B 179B 5659 AE02 A536 8D65 B1A0" /* £ø:..›VY®.¥6e±  */
- $"F806 81C6 9453 B9E5 1E84 EF36 3D8C 9922" /* ø.Æ”S¹å.„ï6=Œ™" */
- $"A841 EBC7 584D 175D A8CF 5AE5 52F4 364A" /* ¨AëÇXM.]¨ÏZåRô6J */
- $"CACB F4FA 59D1 6C18 1FE0 5F96 0F70 465A" /* ÊËôúYÑl..à_–.pFZ */
- $"7CFD 0C37 59FF 6248 10C6 4872 8573 D54E" /* |ý.7YÿbH.ÆHr…sÕN */
- $"7839 337E D900 4336 CF58 B59C BCC4 602F" /* x93~Ù.C6ÏXµœ¼Ä`/ */
- $"EA1A 205F CD8D 635B AE0D 5750 3316 72C7" /* ê. _Íc[®.WP3.rÇ */
- $"A765 C2F2 CF8C 52FB 1892 F55E B7A5 6D85" /* §eÂòÏŒRû.’õ^·¥m… */
- $"5782 FAB6 FBB5 CDF3 2DC2 0256 2927 4F4F" /* W‚ú¶ûµÍó-Â.V)'OO */
- $"1F92 5F99 B540 87DD 7A80 991B 0677 AB00" /* .’_™µ@‡Ýz€™..w«. */
- $"2D82 C5F6 11F7 F21B 2652 B798 75D5 42A6" /* -‚Åö.÷ò.&R·˜uÕB¦ */
- $"7757 E0E7 3C3F DBA5 6106 9F44 1800 E044" /* wWàç<?Û¥a.ŸD..àD */
- $"5844 8C9D 83C0 C5D3 6B95 CE2A 3EBC D7FD" /* XDŒƒÀÅÓk•Î*>¼×ý */
- $"B79B E645 6FD3 A5EE ECE2 C9A7 53C7 B2E3" /* ·›æEoÓ¥îìâɧSDzã */
- $"C659 D5C5 0FBD 7C88 93C3 D3D9 D81F 0AEB" /* ÆYÕÅ.½|ˆ“ÃÓÙØ.Âë */
- $"5784 8BF9 DAD7 993D 0C8B 9873 08A4 254B" /* W„‹ùÚ×™=.‹˜s.¤%K */
- $"2452 F95D 29CA 8B3E D48D 18FB C813 4ECB" /* $Rù])Ê‹>Ô.ûÈ.NË */
- $"D118 E3FA 926C 7A5F E5CC F774 D1DB B5C1" /* Ñ.ãú’lz_åÌ÷tÑÛµÁ */
- $"579A 2647 619A 67A0 423D 6C64 B3A6 9357" /* Wš&Gašg B=ld³¦“W */
- $"B8C6 8FBE A3AC E380 E548 5ED3 D83D 7DB9" /* ¸Æ¾£¬ã€åH^ÓØ=}¹ */
- $"93E8 9071 F6E0 168F 6BEC F674 6D08 F4DA" /* “èqöà.kìötm.ôÚ */
- $"C1F7 11FD DEF8 2420 30DA 71E2 C605 81EB" /* Á÷.ýÞø$ 0ÚqâÆ.ë */
- $"565B D461 AF6E 3127 34AC BA64 C660 14E1" /* V[Ôa¯n1'4¬ºdÆ`.á */
- $"F6AB DA92 386B 3E7B BD42 90E9 ABA2 6EE7" /* ö«Ú’8k>{½Bé«¢nç */
- $"8D0D 373C D280 46EC 6746 310C EA41 862B" /* .7<Ò€FìgF1.êA†+ */
- $"6D1B 7BE9 93AF 17F6 1D3A E7AB CA55 8A4B" /* m.{铯.ö.:ç«ÊUŠK */
- $"E867 6EF3 29DF FF5F B839 75E1 FA04 DD81" /* ègnó)ßÿ_¸9uáú.Ý */
- $"B6C9 DA44 D268 3B1A FF63 60F5 37A5 DDCB" /* ¶ÉÚDÒh;.ÿc`õ7¥ÝË */
- $"1AB3 5275 7692 7F15 F8E8 6A96 CEB4 D9E5" /* .³Ruv’..øèj–δÙå */
- $"3E5A 0E16 B1D0 B056 D0D2 0360 0900 5773" /* >Z..±Ð°VÐÒ.`Æ.Ws */
- $"BB3F C215 FD55 C9BF E3FC 48A1 CFAB BD39" /* »?Â.ýUÉ¿ãüH¡Ï«½9 */
- $"CD3D 906E 21CB C3DD E4D3 548C 4731 E777" /* Í=n!ËÃÝäÓTŒG1çw */
- $"EE15 C0DE CEBC 0F2F 85A6 9822 F1FF 7B2F" /* î.ÀÞμ./…¦˜"ñÿ{/ */
- $"2530 48C7 0C39 3659 CD03 06C5 7C8E 3D49" /* %0HÇ.96YÍ..Å|Ž=I */
- $"FED5 7B72 4652 772C 39C7 8F1B 63E8 2DC1" /* þÕ{rFRw,9Ç.cè-Á */
- $"1242 CA35 E396 6103 15DF D939 0597 B8D4" /* .BÊ5ã–a..ßÙ9.—¸Ô */
- $"8858 ACE3 3C32 6EE5 69A3 8512 3447 2B3B" /* ˆX¬ã<2nåi£….4G+; */
- $"0647 8C1F 2D31 4E57 0D03 BE26 5235 5275" /* .GŒ.-1NW..¾&R5Ru */
- $"74E8 B8F6 CF32 E077 8C51 41DB ED67 EE30" /* tè¸öÏ2àwŒQAÛígî0 */
- $"AD97 7956 D279 B0A8 768D 00E3 F604 A240" /* ­—yVÒy°¨v.ãö.¢@ */
- $"9656 5BCD B309 D0CD 3ECE C477 31EC F88D" /* –V[ͳÆÐÍ>ÎÄw1ìø */
- $"782F 8B9E 37FA A741 C636 7B55 D047 64A4" /* x/‹ž7ú§AÆ6{UÐGd¤ */
- $"E2EC C69D F609 F38F 821E 8D20 8709 87FF" /* âìÆöÆó‚. ‡Æ‡ÿ */
- $"3C3A B1ED C420 1F0B 52E3 8999 C684 30F3" /* <:±íÄ ..R㉙Ƅ0ó */
- $"C4ED 7FA9 3A2C D0E7 AE48 1AC2 7196 9347" /* Äí.©:,Ðç®H.Âq–“G */
- $"6BC9 BEE1 4112 4209 93CA 307A 7FF7 8B12" /* kɾáA.BÆ“Ê0z.÷‹. */
- $"EE76 8890 A529 33CC F435 A84F 9414 A719" /* îvˆ¥)3Ìô5¨O”.§. */
- $"BFB2 6305 201F 372D 567F 30DF 2E47 D0B9" /* ¿²c. .7-V.0ß.Gй */
- $"C68F 5126 7EAA D95A 12D0 DA8A 8CF4 8A2A" /* ÆQ&~ªÙZ.ÐÚŠŒôŠ* */
- $"CBAE 0509 B614 A9E1 2CA2 D0E0 F017 E395" /* Ë®.ƶ.©á,¢Ðàð.ã• */
- $"AF82 85B5 4509 E75C 8E4D 5465 7DF2 CF39" /* ¯‚…µEÆç\ŽMTe}òÏ9 */
- $"ACFB DD5B C683 62C0 0B1C B7B9 EAEC 049C" /* ¬ûÝ[ƃbÀ..·¹êì.œ */
- $"8045 0178 6757 E317 872D ABC2 B077 6EF6" /* €E.xgWã.‡-«Â°wnö */
- $"3612 4132 3DD7 D39B B49A 04A8 207D 6135" /* 6.A2=×Ó›´š.¨ }a5 */
- $"C64F 3A0F 5028 7B6B 953E 8F19 920A 718F" /* ÆO:.P({k•>.’Âq */
- $"08E9 A079 EC51 A08F 4A77 5130 C807 9BC2" /* .é yìQ JwQ0È.›Â */
- $"B37B 4C7B 9BAA 40F3 4E94 BE51 C027 32B5" /* ³{L{›ª@óN”¾QÀ'2µ */
- $"751F 4793 7271 226E 82F3 CF14 8BC3 F927" /* u.G“rq"n‚óÏ.‹Ãù' */
- $"4C81 7F29 AB70 8B3B E948 86D6 569F FEC2" /* L.)«p‹;éH†ÖVŸþÂ */
- $"BF6C 92F9 1011 3BE3 9E91 6458 1634 34A3" /* ¿l’ù..;ãž‘dX.44£ */
- $"3042 520F 5D64 6429 32CE 04FD 1B98 0698" /* 0BR.]dd)2Î.ý.˜.˜ */
- $"3A36 655C 86C7 C272 4B02 E259 0537 4DB8" /* :6e\†ÇÂrK.âY.7M¸ */
- $"C6C2 6980 ECFB 0FC1 C6D9 0A2C D00F 282A" /* ÆÂi€ìû.ÁÆÙÂ,Ð.(* */
- $"7A0B D91F 08CA 762C A629 048E 9BCC CFD2" /* z.Ù..Êv,¦).Ž›ÌÏÒ */
- $"1EBC 8F60 2F64 F24D F1FB 81C6 8AEC CFDB" /* .¼`/dòMñûÆŠìÏÛ */
- $"623A 01A9 35D2 B5E1 B80A 2D32 084E 3857" /* b:.©5Òµá¸Â-2.N8W */
- $"C025 BCDA 4728 F3AD 35AD 9AAA E054 21B7" /* À%¼ÚG(ó­5­šªàT!· */
- $"A47E 62C5 9921 02C0 09E3 440D 063A 3789" /* ¤~bÅ™!.ÀÆãD..:7‰ */
- $"5072 E54A 4654 E148 AC2E 4A99 C6A5 3923" /* PråJFTáH¬.J™Æ¥9# */
- $"49B5 6906 6531 FD5E 7CCE 1C4B EEDE 7482" /* Iµi.e1ý^|Î.KîÞt‚ */
- $"9E3F 73AE C777 0214 C921 3131 C5CB 9F61" /* ž?s®Çw..É!11ÅËŸa */
- $"64A4 4E70 57C2 5C04 E25B 266E 6887 7477" /* d¤NpWÂ\.â[&nh‡tw */
- $"FCCB 1F0C 89F2 6CF6 713E 4D08 8AC8 9B0C" /* üË..‰òlöq>M.ŠÈ›. */
- $"00AC D9D7 A28A C219 B52B B46A D704 F919" /* .¬Ù×¢ŠÂ.µ+´j×.ù. */
- $"2050 6CCA 215A 299B 9129 9739 DA6F 3A67" /* PlÊ!Z)›‘)—9Úo:g */
- $"FE12 2BF1 4F8B 26ED D21F F727 5B59 22F3" /* þ.+ñO‹&íÒ.÷'[Y"ó */
- $"2E05 F4A0 9754 F431 9AED 1B65 038C CD7F" /* ..ô —Tô1ší.e.ŒÍ. */
- $"8254 E3AE 035C 18D7 0E28 6300 0DF0 998D" /* ‚Tã®.\.×.(c..ð™ */
- $"0191 85AF C71B B3CF F0D6 3A8F B1AA 5E99" /* .‘…¯Ç.³ÏðÖ:±ª^™ */
- $"BAB8 7C7F 0214 F864 4744 E747 7248 3C94" /* º¸|...ødGDçGrH<” */
- $"3AC8 CE04 1019 11ED 4BCC 76E9 FE4E 5728" /* :ÈÎ....íKÌvéþNW( */
- $"5BB0 986C D763 A3C7 AF8A 14E9 D24A AD17" /* [°˜l×c£Ç¯Š.éÒJ­. */
- $"FF66 611F B77C 0830 9093 A560 06FA E9CF" /* ÿfa.·|.0“¥`.úéÏ */
- $"054B 5846 1681 5DBF 34F9 49A9 45E0 8F20" /* .KXF.]¿4ùI©Eà */
- $"7FFD 6264 2193 031D A60F A111 B0B7 CFEE" /* .ýbd!“..¦.¡.°·Ïî */
- $"DE49 EC80 C0F1 D7F6 A495 900B 4126 40BE" /* ÞIì€Àñ×ö¤•.A&@¾ */
- $"185B DFFE C7B0 12AC C143 AA85 70E5 81EF" /* .[ßþÇ°.¬ÁCª…påï */
- $"79CE 1662 08E4 203F 1706 40FB CC39 CA8F" /* yÎ.b.ä ?..@ûÌ9Ê */
- $"8002 1CFA 3BCC 6B79 5C83 A4D2 7147 E38F" /* €..ú;Ìky\ƒ¤ÒqGã */
- $"C93B F2E8 6A15 6D30 C314 E898 81E3 FF7B" /* É;òèj.m0Ã.è˜ãÿ{ */
- $"5FC5 EE13 0449 1985 2CBC 73C7 C569 DCB1" /* _Åî..I.…,¼sÇÅiܱ */
- $"8024 F7CA CC7A FE3B CC15 4BCE 5B92 1BBB" /* €$÷ÊÌzþ;Ì.KÎ[’.» */
- $"0048 F291 579F FD20 F11A 1934 CC11 9C3F" /* .Hò‘WŸý ñ..4Ì.œ? */
- $"CE49 027A 9763 9E57 A2FF 7FFD 53E4 E50B" /* ÎI.z—cžW¢ÿ.ýSäå. */
- $"C747 02FF 7869 0537 1482 221E 0220 79D5" /* ÇG.ÿxi.7.‚".. yÕ */
- $"45B1 2E48 6A6C 8486 571F E1F1 BF39 0797" /* E±.Hjl„†W.áñ¿9.— */
- $"5D21 6964 EA9B 13F1 E6B7 C4B5 A2B7 E2BD" /* ]!idê›.ñæ·Äµ¢·â½ */
- $"09C2 B200 0000 0000 003E A392 6527 69B6" /* Ʋ......>£’e'i¶ */
- $"B189 8365 F55D 7A2B 0398 4196 BB60 D4F0" /* ±‰ƒeõ]z+.˜A–»`Ôð */
- $"06B6 100C 5B60 D76F 8FEE EFFB D525 0E2B" /* .¶..[`×oîïûÕ%.+ */
- $"3535 B765 22E7 F77C CF5C 8907 7626 62C0" /* 55·e"ç÷|Ï\‰.v&bÀ */
- $"3B04 A170 EEA6 A399 F26B CD7E 92BC 9E13" /* ;.¡p™òkÍ~’¼ž. */
- $"9D2D 6907 B06F 6B9A 957D 3C57 DC9F 06E6" /* -i.°okš•}<WÜŸ.æ */
- $"C3B6 16AD C91B E868 E000 1848 3BE4 5C3A" /* ö.­É.èhà..H;ä\: */
- $"1162 2272 401F 600B A973 281E 62B3 2654" /* .b"r@.`.©s(.b³&T */
- $"74B0 287C C53E A3DA 2A14 E38F 9FFE 3A8E" /* t°(|Å>£Ú*.ãŸþ:Ž */
- $"0D69 7E9D 5B07 1396 ED52 69BC 3971 5630" /* .i~[..–íRi¼9qV0 */
- $"7C63 8DA9 7A40 F364 CC6A FCAC DC7C 59DC" /* |c©z@ódÌjü¬Ü|YÜ */
- $"278A 92E3 6FBF F936 7157 2583 232E E558" /* 'Š’ão¿ù6qW%ƒ#.åX */
- $"0000 C241 6B90 4DCB 6421 F85A B681 4812" /* ..ÂAkMËd!øZ¶H. */
- $"9165 5C06 0195 F213 DB9F 5E2F 4BDE A075" /* ‘e\..•ò.ÛŸ^/KÞ u */
- $"BD9A 741B 971B 3411 1F73 7FF8 D719 BA55" /* ½št.—.4..s.ø×.ºU */
- $"8048 404F FEEA FC74 AEB1 84FD 03F9 5D43" /* €H@Oþêüt®±„ý.ù]C */
- $"BE42 E61F FF7F F4CA BA56 9654 B757 FF60" /* ¾Bæ.ÿ.ôʺV–T·Wÿ` */
- $"CA39 3290 054C E785 0EA7 F04D AF3E B342" /* Ê92.Lç….§ðM¯>³B */
- $"A80A 815D 3954 73F2 871A 51FF 7488 20CD" /* ¨Â]9Tsò‡.Qÿtˆ Í */
- $"90F3 23B8 80FE C6BF 726C 5426 83F2 5400" /* ó#¸€þÆ¿rlT&ƒòT. */
- $"0000 0000 0000 0000 BFA5 D802 777C F954" /* ........¿¥Ø.w|ùT */
- $"286B A586 76CF 26CE 72CA 6FE7 BD43 DB36" /* (k¥†vÏ&ÎrÊoç½CÛ6 */
- $"A826 870E 2EEF E2C4 2E22 E63C FF7F AF51" /* ¨&‡..ïâÄ."æ<ÿ.¯Q */
- $"40C1 B727 22F3 9ACC 894D 0C49 EC7A D998" /* @Á·'"óšÌ‰M.IìzÙ˜ */
- $"64A9 DD22 2545 B85C D621 0609 B73A 9D9F" /* d©Ý"%E¸\Ö!.Æ·:Ÿ */
- $"FF7F FF7F C0F7 00E1 B069 1D76 3BA1 E98C" /* ÿ.ÿ.À÷.á°i.v;¡éŒ */
- $"5F1B 1E11 B6F6 EB6D 6316 9DBC D1B2 DC90" /* _...¶öëmc.¼Ñ²Ü */
- $"5E1D 5EE0 3C65 57D0 B69C 3782 D1BE 3A77" /* ^.^à<eWжœ7‚Ѿ:w */
- $"436E 462B 45B7 FF61 4FA4 A45B 8C34 39D8" /* CnF+E·ÿaO¤¤[Œ49Ø */
- $"1B35 B876 A5F1 F2AD 3F78 D289 1C2E E3B4" /* .5¸v¥ñò­?xÒ‰..ã´ */
- $"A28B 64FA 1E2C 0CCD 0B1C AD42 8866 DDD6" /* ¢‹dú.,.Í..­BˆfÝÖ */
- $"62F0 225B 8DF7 32B3 FC3C 79E9 000B 1CA9" /* bð"[÷2³ü<yé...© */
- $"2C82 4874 34AB B158 47CD FA9F EBC8 0923" /* ,‚Ht4«±XGÍúŸëÈÆ# */
- $"B291 7229 8C3F E7FD 193C 330B A3B4 6969" /* ²‘r)Œ?çý.<3.£´ii */
- $"FCF6 E1BA 4C4A E64C B1BC 5BAF F402 C828" /* üöáºLJæL±¼[¯ô.È( */
- $"3A51 CC67 A851 E207 5A7C 3733 1031 FD5C" /* :QÌg¨Qâ.Z|73.1ý\ */
- $"E4D3 B69F FF67 2C6D 3FC7 D5B4 E63F 55B9" /* äÓ¶Ÿÿg,m?ÇÕ´æ?U¹ */
- $"FD5F 3DB1 4589 6ADF 54F0 F42A 498F 61C8" /* ý_=±E‰jßTðô*IaÈ */
- $"4872 5CD7 F70D 9C80 8880 EB9A 1FE7 C715" /* Hr\×÷.œ€ˆ€ëš.çÇ. */
- $"E57A 280F 96CF 014C 0411 EF44 C4F2 C64F" /* åz(.–Ï.L..ïDÄòÆO */
- $"F91B A9D6 EB9E F615 096F E5C0 5B30 BB79" /* ù.©Öëžö.ÆoåÀ[0»y */
- $"D645 BF4F B70A 2C40 3D24 A4C4 5A01 F3DB" /* ÖE¿O·Â,@=$¤ÄZ.óÛ */
- $"8879 D458 F558 4C8E 3C87 E83C 9C30 F0C3" /* ˆyÔXõXLŽ<‡è<œ0ðà */
- $"F7EB BE6A 2B3B B9CB 4F2E 3B49 CA98 6025" /* ÷ë¾j+;¹ËO.;Iʘ`% */
- $"D6C7 6B39 ED18 A784 5410 F9CD 4FB5 9E32" /* ÖÇk9í.§„T.ùÍOµž2 */
- $"EABF F72F 6ECC 217F E295 4BDA F0C8 2678" /* ê¿÷/nÌ!.â•KÚðÈ&x */
- $"B0F7 3381 2299 1033 5300 BB1C E72F 1EE0" /* °÷3"™.3S.».ç/.à */
- $"75D6 68D0 8C87 A574 580B 4AD8 7BC8 E1C4" /* uÖhÐŒ‡¥tX.JØ{ÈáÄ */
- $"64D3 76AA A080 1E28 FD04 890B B9A1 7E5C" /* dÓvª €.(ý.‰.¹¡~\ */
- $"79E2 31B9 1C3E DBAE 8BC6 DB23 53A4 0F06" /* yâ1¹.>Û®‹ÆÛ#S¤.. */
- $"74AA 7920 6233 E3BF B281 AFAA 957D FDFB" /* tªy b3㿲¯ª•}ýû */
- $"216A 3ECE 3139 37DF 8885 620B 5D55 D0FD" /* !j>Î197߈…b.]UÐý */
- $"F796 6A70 CEFD 33D8 B369 178E 99C0 9FFF" /* ÷–jpÎý3سi.Ž™ÀŸÿ */
- $"7FD2 27D4 D615 4840 B836 A0B5 1D6F 2A5A" /* .Ò'ÔÖ.H@¸6 µ.o*Z */
- $"1338 2369 83A0 D409 0FA7 77EF 19B9 21E6" /* .8#iƒ ÔÆ.§wï.¹!æ */
- $"3E21 0CB0 D4D3 362A EA6F 6340 8D73 27FB" /* >!.°ÔÓ6*êoc@s'û */
- $"C3EF 7823 33DF 7A8C 5C69 20C4 5816 72E4" /* Ãïx#3ßzŒ\i ÄX.rä */
- $"712C 3345 6755 76F3 FEAF 494B D0B4 3C8F" /* q,3EgUvóþ¯IKд< */
- $"B83F A050 C3E9 4CA2 6A6E 7AD0 D7FF 5860" /* ¸? PÃéL¢jnzÐ×ÿX` */
- $"548E 54E7 C3B9 6DDF 462C 54BE 5EF9 1A41" /* TŽTçùmßF,T¾^ù.A */
- $"6A46 A4FB 1C36 1CA4 77EC 2899 F147 3422" /* jF¤û.6.¤wì(™ñG4" */
- $"843C 7FAE 123E 6894 9B7F 3125 EB0F 3129" /* „<.®.>h”›.1%ë.1) */
- $"9DC1 8469 CE90 BB6E 4F2C 385A 0FD1 9AC7" /* Á„iλnO,8Z.ÑšÇ */
- $"3318 3BF0 B1AA A51A 9022 A143 29FF 7FC1" /* 3.;𱪥."¡C)ÿ.Á */
- $"0F0F 6570 67C4 7FA7 9906 DE4E 5439 A278" /* ..epgÄ.§™.ÞNT9¢x */
- $"34E1 3D57 BB0E 086E 4C71 4406 DA9D CA56" /* 4á=W»..nLqD.ÚÊV */
- $"3EFD D077 5DA5 CD7D C244 9128 F408 1F03" /* >ýÐw]¥Í}ÂD‘(ô... */
- $"0C8F FF4B 9274 2EC6 E208 13C5 EE1B 3CEA" /* .ÿK’t.Æâ..Åî.<ê */
- $"C5C0 06F5 0FA1 11FF 7FE3 A446 32E6 F4DA" /* ÅÀ.õ.¡.ÿ.ã¤F2æôÚ */
- $"23EC 5108 3AE0 CD16 AFFF 3965 8196 56E2" /* #ìQ.:àÍ.¯ÿ9e–Vâ */
- $"2881 4EB9 CA14 5C4A 8091 B176 8823 BF09" /* (N¹Ê.\J€‘±vˆ#¿Æ */
- $"CED5 0D88 E6BB DD95 1B72 36E8 809C D432" /* ÎÕ.ˆæ»Ý•.r6耜Ô2 */
- $"872D C08C 7DCB B30E 548B AE16 0D85 6B49" /* ‡-ÀŒ}˳.T‹®..…kI */
- $"9B28 D491 ECD6 F598 691A 0891 135A 63A0" /* ›(Ô‘ìÖõ˜i..‘.Zc  */
- $"593C 1FFD 8A54 4FB9 F2AB 20FC 5CF3 1B88" /* Y<.ýŠTO¹ò« ü\ó.ˆ */
- $"EE7E 8355 45D6 87C8 28CE 7B33 92A2 D8D6" /* î~ƒUEÖ‡È(Î{3’¢ØÖ */
- $"E8DF EF94 500A 0D78 DE9F 8657 F7BD 7F40" /* èßï”PÂ.xÞŸ†W÷½.@ */
- $"5E07 0789 EDC7 F3A5 A0BF 3929 6B19 A460" /* ^..‰íÇó¥ ¿9)k.¤` */
- $"7A50 91FF 42EA 5F12 DFA5 E0A0 84CC E869" /* zP‘ÿBê_.ߥࠄÌèi */
- $"BB1F 6EDA 2238 5DB0 7F22 3521 F04B FF6B" /* ».nÚ"8]°."5!ðKÿk */
- $"6827 722A DD5F 3C9D D3F4 2BE3 614D 0A3F" /* h'r*Ý_<Óô+ãaMÂ? */
- $"62C4 E6AC 95CA 5946 37E8 BC76 97FD 5167" /* bÄ欕ÊYF7è¼v—ýQg */
- $"C970 D4C7 0655 C470 5913 DBBD AA8C 87A4" /* ÉpÔÇ.UÄpY.Û½ªŒ‡¤ */
- $"3C63 0B7F 54CD 391E 574D F2D5 C728 20B7" /* <c..TÍ9.WMòÕÇ( · */
- $"9955 DAC8 72A5 DBBB F7ED 4C9F 6FFE 3A4E" /* ™UÚÈr¥Û»÷íLŸoþ:N */
- $"E165 1831 C0E5 8285 96C2 3959 1BE7 E884" /* áe.1Àå‚…–Â9Y.çè„ */
- $"E568 89C1 FD03 D443 F6D1 A7C9 4CFE F7B9" /* åh‰Áý.ÔCöѧÉLþ÷¹ */
- $"A0BA 5040 19D5 965F 0EB5 E503 4B32 E6C8" /*  ºP@.Õ–_.µå.K2æÈ */
- $"B9C1 DEBB B8B7 47DC A850 AF44 D3B7 F562" /* ¹ÁÞ»¸·GܨP¯DÓ·õb */
- $"4210 4DFF 42A0 3D9A 7C63 8124 22A9 B258" /* B.MÿB =š|c$"©²X */
- $"2256 6243 3077 FF57 7389 3FB6 A096 0EAB" /* "VbC0wÿWs‰?¶ –.« */
- $"DD33 EF25 C4B0 7338 F6D7 8730 FF2E DD0A" /* Ý3ï%Ä°s8öׇ0ÿ.Ý */
- $"BBDA 7A6E EFE8 58EE D64B A09E 2B00 EC04" /* »ÚznïèXîÖK ž+.ì. */
- $"09C9 A9F4 82A0 3132 4829 65CA E93B B827" /* ÆÉ©ô‚ 12H)eÊé;¸' */
- $"E81F B387 132B 5D15 E526 6FEC 2CB1 407F" /* è.³‡.+].å&oì,±@. */
- $"8485 FF32 4933 D357 FC45 0E44 EE66 D960" /* „…ÿ2I3ÓWüE.DîfÙ` */
- $"5AA3 A13A FC0B D8E2 622E 0BEE 714F 2672" /* Z£¡:ü.Øâb..îqO&r */
- $"3850 26C4 E626 F9BA 418C BC8A 7481 C6BE" /* 8P&Äæ&ùºAŒ¼Štƾ */
- $"BFA6 0D72 0603 3452 46C0 9FDB BE63 34D9" /* ¿¦.r..4RFÀŸÛ¾c4Ù */
- $"9599 7519 804B F1CE 0FC8 7572 F58E EB32" /* •™u.€KñÎ.ÈurõŽë2 */
- $"3501 CBB0 C05B 5643 485A 0012 64C2 8022" /* 5.Ë°À[VCHZ..d€" */
- $"BD39 EB39 2B57 0AA3 3931 93D4 885E CDF2" /* ½9ë9+W£91“Ôˆ^Íò */
- $"818D 7734 36C2 BEE1 4F55 116C 47A9 DC40" /* w46¾áOU.lG©Ü@ */
- $"A8A8 4532 7C33 9D7E 070A BA9E 36F7 2445" /* ¨¨E2|3~.ºž6÷$E */
- $"074C 181A 07B2 C470 FA15 8CCB C069 AD0F" /* .L...²Äpú.ŒËÀi­. */
- $"9DD2 8B21 6F22 7300 34B4 4378 25AB D9D2" /* Ò‹!o"s.4´Cx%«ÙÒ */
- $"1D9B B7F7 2F9C C3B1 926F DE61 4463 90BD" /* .›·÷/œÃ±’oÞaDc½ */
- $"BC76 27E7 A5B5 826F 908E 31BA 048F 97C1" /* ¼v'祵‚oŽ1º.—Á */
- $"1884 67A9 C4BA 4B2B 4A58 D0EE 0269 6832" /* .„g©ÄºK+JXÐî.ih2 */
- $"E8C6 03AA D2A2 D034 27AA D49E 9C01 069A" /* èÆ.ªÒ¢Ð4'ªÔžœ..š */
- $"1BDC C40B 3BA7 5F8D 0468 152D E505 7EC0" /* .ÜÄ.;§_.h.-å.~À */
- $"6BBF C4F4 2F45 99CB 1872 C713 FA0D 055F" /* k¿Äô/E™Ë.rÇ.ú.._ */
- $"551D 6E4D 5794 CC71 BAB5 C560 4D20 9464" /* U.nMW”ÌqºµÅ`M ”d */
- $"9F8C 94BA 1C96 0987 1AB4 61BB BA86 751B" /* ŸŒ”º.–Ƈ.´a»º†u. */
- $"9B79 D06A 7A3D A663 FB31 8B86 E588 5D15" /* ›yÐjz=¦cû1‹†åˆ]. */
- $"4A09 8B2B 81FC AE85 0D5A 1D8C A5B7 6DD9" /* JÆ‹+ü®….Z.Œ¥·mÙ */
- $"02F5 50CE 7017 1BDD 3D3D 86CB 250B 491B" /* .õPÎp..Ý==†Ë%.I. */
- $"AA1F 2D21 A416 E8E7 9A53 4299 8CDE CD59" /* ª.-!¤.èçšSB™ŒÞÍY */
- $"C678 B559 D85C C580 6795 AD5F F578 C9EE" /* ÆxµYØ\Å€g•­_õxÉî */
- $"73B2 8F4B 6EEA 6F07 F785 C1B3 374B E51F" /* s²Knêo.÷…Á³7Kå. */
- $"46DC 728C 05A4 6932 792A DB50 4E9A FD82" /* FÜrŒ.¤i2y*ÛPNšý‚ */
- $"A8A2 5EB8 024D C558 D6BC 350C 97B0 B2E8" /* ¨¢^¸.MÅXÖ¼5.—°²è */
- $"8F42 92FD 604D 6FB7 74B6 6EBE 97F6 CE03" /* B’ý`Mo·t¶n¾—öÎ. */
- $"0DFA C340 31C3 4C5E 0041 088B E097 383B" /* .úÃ@1ÃL^.A.‹à—8; */
- $"A236 97CC 8D2B 6F6D 0E58 4E56 1D49 32EC" /* ¢6—Ì+om.XNV.I2ì */
- $"626C C303 42BB D30B B8DE 5868 3C2F E39B" /* blÃ.B»Ó.¸ÞXh</ã› */
- $"A07A 236D 0F21 C0DD 1A0A 933A 7710 6605" /*  z#m.!ÀÝ.“:w.f. */
- $"343E 8D1A 9384 4F16 C01E 5AF7 DF53 0B38" /* 4>.“„O.À.Z÷ßS.8 */
- $"3615 80D7 428E 90F6 4620 02EA 4590 DF22" /* 6.€×BŽöF .êEß" */
- $"4B70 2FB2 CADA A529 F7FA E7C6 BC99 DFCD" /* Kp/²ÊÚ¥)÷úçƼ™ßÍ */
- $"5EE7 D677 B5BE F819 6A55 6070 E1A9 DF53" /* ^çÖwµ¾ø.jU`pá©ßS */
- $"3F82 0229 B6B7 D247 1967 8313 056F 9D27" /* ?‚.)¶·ÒG.gƒ..o' */
- $"753E E4DD EB7F 1372 C0F7 D72E 349B 2F9B" /* u>äÝë..rÀ÷×.4›/› */
- $"686C C9AF 0896 0865 7A3A 5A9D 807F 292A" /* hlɯ.–.ez:Z€.)* */
- $"8DDA A776 4B3C 0993 532D D682 A41B 9DC2" /* Ú§vK<Æ“S-Ö‚¤. */
- $"5113 9D60 934B 2055 D671 C6C4 1252 3CEF" /* Q.`“K UÖqÆÄ.R<ï */
- $"C72F AC19 4BED 185D BC60 5957 F81B 8278" /* Ç/¬.Kí.]¼`YWø.‚x */
- $"20B5 9173 4A1B FDC9 295D 54B7 8AFE 6938" /* µ‘sJ.ýÉ)]T·Šþi8 */
- $"FE49 BA78 3225 49A1 4243 823C 52B9 8489" /* þIºx2%I¡BC‚<R¹„‰ */
- $"9BDF 0AA1 9A6B 667D DCE2 FE18 C386 4EE9" /* ›ß¡škf}Üâþ.ÆNé */
- $"8AF7 92D0 4405 227C BD4C B9E4 34A7 2533" /* Š÷’ÐD."|½L¹ä4§%3 */
- $"D3C6 E915 D57B 681B B6DC FF03 D5D4 F1DD" /* ÓÆé.Õ{h.¶Üÿ.ÕÔñÝ */
- $"4FB5 BA54 262A 73C2 1CF4 4CD1 D842 E8C2" /* OµºT&*sÂ.ôLÑØBè */
- $"8169 3555 13EC 6A25 6DE0 3614 EC2E D1BB" /* i5U.ìj%mà6.ì.Ñ» */
- $"E597 BFC6 2ACB 6879 11D1 870D E79E 8422" /* å—¿Æ*Ëhy.ч.çž„" */
- $"C01D 4032 8887 6DBA FBEC 3077 F220 49E3" /* À.@2ˆ‡mºûì0wò Iã */
- $"8693 0B00 9F45 0F57 0A39 DA8E EAA5 CD48" /* †“..ŸE.WÂ9ÚŽê¥ÍH */
- $"2C93 C3EC BDE0 71D5 5749 0952 441C E3F8" /* ,“Ãì½àqÕWIÆRD.ãø */
- $"597F C1E6 FB6B BBED AD71 FC34 CFF8 5877" /* Y.Áæûk»í­qü4ÏøXw */
- $"DB67 5F6D 798F E163 5F6B 1CFA A87B ED7C" /* Ûg_myác_k.ú¨{í| */
- $"F176 3065 72FF 443D BA6B 8FBD 9E85 806A" /* ñv0erÿD=ºk½ž…€j */
- $"2A1B 368C 7A9E B1B1 93DE ABD8 263F 31B3" /* *.6Œzž±±“Þ«Ø&?1³ */
- $"1739 58F1 7233 FE7C 4EC4 32AA CDDB CF11" /* .9Xñr3þ|NÄ2ªÍÛÏ. */
- $"C519 9C61 B756 AF62 D55D 5D48 6AF7 4364" /* Å.œa·V¯bÕ]]Hj÷Cd */
- $"205E F14D AAD6 EFF5 2F0D CBE4 0F19 3159" /* ^ñMªÖïõ/.Ëä..1Y */
- $"94F4 910E 4217 990B CABE EBF5 2B67 2EF6" /* ”ô‘.B.™.ʾëõ+g.ö */
- $"FE41 0C44 1C50 43EA 69F5 4E73 5569 82A1" /* þA.D.PCêiõNsUi‚¡ */
- $"C13C 4899 3AA9 5E13 5F76 BF98 2105 1842" /* Á<H™:©^._v¿˜!..B */
- $"AF34 9AFD CFC8 D1E7 3479 E1F3 C86F D06F" /* ¯4šýÏÈÑç4yáóÈoÐo */
- $"9ED9 9DD8 E2E0 4B44 19F4 03E6 9CC0 3474" /* žÙØâàKD.ô.æœÀ4t */
- $"DFBD 078F D140 1C06 5F8C B6E2 665C 703A" /* ß½.Ñ@.._Œ¶âf\p: */
- $"2841 642E F538 C531 697D 5064 11AD 9E8C" /* (Ad.õ8Å1i}Pd.­žŒ */
- $"5A53 3174 7302 762E 9708 BEF5 AD41 0C01" /* ZS1ts.v.—.¾õ­A.. */
- $"D744 85FC D963 416A 9A3A 6898 F067 5B1C" /* ×D…üÙcAjš:h˜ðg[. */
- $"873B 42B6 72C4 FF18 337A 8A24 EDCE 6B8B" /* ‡;B¶rÄÿ.3zŠ$íÎk‹ */
- $"BF06 0EA4 0227 A131 8620 B03C A2B9 729E" /* ¿..¤.'¡1† °<¢¹rž */
- $"1242 EC64 E340 5C5C 9BFF 120A BB1B 75E5" /* .Bìdã@\\›ÿ.».uå */
- $"385B 68AF C7B7 8BA5 1E7B 6FC1 DDB2 F642" /* 8[h¯Ç·‹¥.{oÁݲöB */
- $"FF56 4D21 66B3 EA8C 7095 8FBD 92CC 7315" /* ÿVM!f³êŒp•½’Ìs. */
- $"665F B398 608C ADD4 11E0 DA38 734A C3DB" /* f_³˜`Œ­Ô.àÚ8sJÃÛ */
- $"9249 4640 27D6 D057 426E 651D BF14 F0DE" /* ’IF@'ÖÐWBne.¿.ðÞ */
- $"9130 2D17 8D66 9689 79BD 9A6D 5AF9 6C7C" /* ‘0-.f–‰y½šmZùl| */
- $"94BF 8531 6507 5621 1C11 8D8F F3A5 83D9" /* ”¿…1e.V!..ó¥ƒÙ */
- $"7EE3 1E6D 9B0A 8D44 F466 DE49 E606 E143" /* ~ã.m›ÂDôfÞIæ.áC */
- $"7E77 D417 D49D 9CF2 89AA B0FA 84A4 33A5" /* ~wÔ.Ôœò‰ª°ú„¤3¥ */
- $"8279 A26A 82C5 27CF FB64 D227 994E C6A7" /* ‚y¢j‚Å'ÏûdÒ'™NƧ */
- $"531C 7B7D D333 20D4 F79E 7C21 CC1E 7ADA" /* S.{}Ó3 Ô÷ž|!Ì.zÚ */
- $"F978 DEBB 1FF2 7420 A72D DE6B AB74 8DC6" /* ùxÞ».òt §-Þk«tÆ */
- $"DD0F 0386 BF57 5F23 4926 C874 D598 47A3" /* Ý..†¿W_#I&ÈtÕ˜G£ */
- $"FBC8 E9B0 38BB C695 B7F4 82A1 CC5F 1E22" /* ûÈé°8»Æ•·ô‚¡Ì_." */
- $"767C 20D5 E64D 44F1 B2D4 2298 C6A1 1842" /* v| ÕæMDñ²Ô"˜Æ¡.B */
- $"8139 0CC8 B9C5 284F 9FC8 945B 5342 94A8" /* 9.ȹÅ(OŸÈ”[SB”¨ */
- $"1A57 3351 E00E DB28 D5E3 9712 4346 6DBA" /* .W3Qà.Û(Õã—.CFmº */
- $"CC9B A1ED CD9B 778D 4523 1E9A AC69 8ED9" /* Ì›¡íÍ›wE#.š¬iŽÙ */
- $"67C4 C16D A548 A029 0075 0185 8D06 B7F0" /* gÄÁm¥H ).u.….·ð */
- $"8258 D26A EB95 D437 F0D2 8E91 D536 F534" /* ‚XÒjë•Ô7ðÒŽ‘Õ6õ4 */
- $"30A1 6DE7 E4B8 48DF 246E 6A43 4FE6 AED0" /* 0¡mçä¸Hß$njCOæ®Ð */
- $"48A0 5E1E C339 6C40 BE36 CEB8 870B F9EB" /* H ^.Ã9l@¾6θ‡.ùë */
- $"5ED8 3CA2 B3FA 8CD9 2D26 FF79 6468 862D" /* ^Ø<¢³úŒÙ-&ÿydh†- */
- $"6B87 3072 15D5 5640 D5D4 B4BA EAD3 84F1" /* k‡0r.ÕV@ÕÔ´ºêÓ„ñ */
- $"6A43 F378 100E 8088 A3FE 989B E75B F67F" /* jCóx..€ˆ£þ˜›ç[ö. */
- $"5B25 3AE2 C08C 8CB0 08DD A37F 94DD 7F03" /* [%:âÀŒŒ°.Ý£.”Ý.. */
- $"35C9 DF27 9A9A B829 6326 A95D 91F7 0BA3" /* 5Éß'šš¸)c&©]‘÷.£ */
- $"7220 E220 F062 D8DE ADE2 2AD6 DDFD C9E4" /* r â ðbØÞ­â*ÖÝýÉä */
- $"FAAE 543D 3CCB 5230 74F7 3120 02FD 6B45" /* ú®T=<ËR0t÷1 .ýkE */
- $"A2AB 805B 13FB 1879 6060 5600 1847 98E5" /* ¢«€[.û.y``V..G˜å */
- $"BF65 2CD4 ACD7 15D0 B77E 5A0F 8095 95CA" /* ¿e,Ô¬×.з~Z.€••Ê */
- $"1847 D25F 7D32 1AE2 89EA 9D49 074D A3E5" /* .GÒ_}2.â‰êI.M£å */
- $"201E 8AC7 CB9C 43BC 0732 70E0 3C4F E625" /* .ŠÇËœC¼.2pà<Oæ% */
- $"88E3 74DB 6FB7 7BE2 7006 F9E7 1F76 DBF3" /* ˆãtÛo·{âp.ùç.vÛó */
- $"C988 D665 F7AA 21E2 A5C1 E969 2917 3BA3" /* ɈÖe÷ª!â¥Áéi).;£ */
- $"17BF 925F F835 9827 813E DA4F EE9B 2DF3" /* .¿’_ø5˜'>ÚOî›-ó */
- $"B640 95E8 70A5 B577 8C1D 99D5 797D D482" /* ¶@•èp¥µwŒ.™Õy}Ô‚ */
- $"E23A 56DD 644D 9623 FEE2 63D2 A3DB E146" /* â:VÝdM–#þâcÒ£ÛáF */
- $"FC39 35A7 6C28 63D8 5240 0C80 0000 0000" /* ü95§l(cØR@.€.... */
- $"0001 4095 99D3 7A7A 0A05 B673 69BC DA9C" /* ..@•™ÓzzÂ.¶si¼Úœ */
- $"A108 DDEA EE48 6385 0790 FEA1 1AFC 2CED" /* ¡.ÝêîHc….þ¡.ü,í */
- $"2225 BE73 2ED7 00BB 2301 80FE 09DF E78E" /* "%¾s.×.»#.€þÆßçŽ */
- $"6FE6 4743 A0EE 0A03 4C9E F046 CDD8 E7F1" /* oæGC îÂ.LžðFÍØçñ */
- $"DB3F 1B67 F6E1 1F31 8096 90DF 5110 40B0" /* Û?.göá.1€–ßQ.@° */
- $"0000 0000 0000 0000 C0B9 E0FC 41FB A11C" /* ........À¹àüAû¡. */
- $"4696 89A0 DE42 F8C7 27D0 3F03 AA51 70FD" /* F–‰ ÞBøÇ'Ð?.ªQpý */
- $"DC5F D7B9 AFD3 A0F3 7BAA A910 9E5C 259E" /* Ü_×¹¯Ó ó{ª©.ž\%ž */
- $"E4FB 8F8E 01C1 96E2 0768 FE5A 0A43 E2F8" /* äûŽ.Á–â.hþZÂCâø */
- $"DA74 9500 C241 D1F6 3EFF 3F06 586F A511" /* Út•.ÂAÑö>ÿ?.Xo¥. */
- $"CCFE 8FE7 61E1 C392 D001 3F52 1CA8 CC23" /* ÌþçaáÃ’Ð.?R.¨Ì# */
- $"93F0 27DF 893F 4AC1 06C3 34DA 8953 BBC0" /* “ð'߉?JÁ.Ã4Ú‰S»À */
- $"84C0 4843 27E0 067E 5EBF FF7A 1540 4C0E" /* „ÀHC'à.~^¿ÿz.@L. */
- $"FA6C 44A1 A7BC DB24 6AD7 C367 EC93 33BF" /* úlD¡§¼Û$j×Ãgì“3¿ */
- $"FECB C1DF 83CC 5BF7 A7C0 DF62 2EFA 4283" /* þËÁ߃Ì[÷§Àßb.úBƒ */
- $"6E49 2492 4924 9249 2492 4924 9246 A4A5" /* nI$’I$’I$’I$’F¤¥ */
- $"7754 9685 B091 D8FF 1549 CF90 2079 3AFB" /* wT–…°‘Øÿ.IÏ y:û */
- $"E925 85CC 62A2 E49B 476B 47B9 319B 630F" /* é%…Ìb¢ä›GkG¹1›c. */
- $"A6B8 182C E282 D1CD 920A 4EB3 21BF 943C" /* ¦¸.,â‚ÑÍ’ÂN³!¿”< */
- $"27BF CCDE BD6E 481A 188C F70B C257 8118" /* '¿ÌÞ½nH..Œ÷.ÂW. */
- $"FBF7 FF78 F422 A3DB AE81 4980 0000 0000" /* û÷ÿxô"£Û®I€.... */
- $"0000 0000 0000 1EE1 BFBB C300 0000 0000" /* .......á¿»Ã..... */
- $"0000 0000 0000 14FB 3FE1 1B7A D142 E13F" /* .......û?á.zÑBá? */
- $"5B6F 704A 61CF 957D 258E F744 FB26 8356" /* [opJaÏ•}%Ž÷Dû&ƒV */
- $"74AD 1DDB 02F2 CF85 7AEB 3A06 6F12 084E" /* t­.Û.òÏ…zë:.o..N */
- $"8E93 D6DA E4FE 9FBE 2D16 1C87 701F 55C3" /* Ž“ÖÚäþŸ¾-..‡p.Uà */
- $"9966 3E8F 36CB 6D9F F3F6 F8D3 B3B9 E2C1" /* ™f>6ËmŸóöøÓ³¹âÁ */
- $"1019 C6E6 8FFF 7FDC 6948 D3AB C944 C64A" /* ..Ææÿ.ÜiHÓ«ÉDÆJ */
- $"8000 0000 0000 0000 000A B0CB 3806 445C" /* €........°Ë8.D\ */
- $"7110 4CDE 3651 AC94 777C 8AB0 5382 04AF" /* q.LÞ6Q¬”w|Š°S‚.¯ */
- $"32E5 68C2 122F 8A5B 12A8 FF39 CF5E 72FB" /* 2åhÂ./Š[.¨ÿ9Ï^rû */
- $"EFD4 1669 47C6 525E 88EF 0AAC 1EE1 98B6" /* ïÔ.iGÆR^ˆï¬.ᘶ */
- $"0BFF 7FAF 8A4B 7158 F7D7 1707 DE93 841E" /* .ÿ.¯ŠKqX÷×..Þ“„. */
- $"3C82 3260 1FFF 1C8B 6A6E 8C66 0000 0000" /* <‚2`.ÿ.‹jnŒf.... */
- $"0000 0000 0000 0121 EF03 234C 3124 0000" /* .......!ï.#L1$.. */
- $"0000 0000 0000 0000 077C 5957 204B A2ED" /* .........|YW K¢í */
- $"59B8 F3C4 CC60 8A58 7E23 0B9F A0FD 1DC8" /* Y¸óÄÌ`ŠX~#.Ÿ ý.È */
- $"8E0F FE2B 5F9F 12D8 09B3 57BB 7818 3CF5" /* Ž.þ+_Ÿ.ØƳW»x.<õ */
- $"D579 D427 5198 BD86 E2FC 8775 915B 37A5" /* ÕyÔ'Q˜½†âü‡u‘[7¥ */
- $"B2E6 6BD8 8404 31D9 4C54 3621 6561 5C3E" /* ²ækØ„.1ÙLT6!ea\> */
- $"4A80 0000 0000 0000 0000 0014 D22D 6758" /* J€..........Ò-gX */
- $"336C 63A1 C13F 3E94 9877 8E90 4E5D 0C70" /* 3lc¡Á?>”˜wŽN].p */
- $"F80A 4262 C2CC C7E4 DAE8 526F 393F 4558" /* øÂBbÂÌÇäÚèRo9?EX */
- $"5CC9 5DDA B2FF 7ED5 F809 3A02 F1EE 2760" /* \É]Ú²ÿ~ÕøÆ:.ñî'` */
- $"FF7E 5037 F054 4A1B 9602 92EA 8D26 A198" /* ÿ~P7ðTJ.–.’ê&¡˜ */
- $"9C4F 8238 A60E 7734 20F8 18FE 478F 5403" /* œO‚8¦.w4 ø.þGT. */
- $"1658 618B A80F 879F 4A98 E809 DEB2 7CE9" /* .Xa‹¨.‡ŸJ˜èÆÞ²|é */
- $"9724 407B B8C8 A48D 4F33 9126 751B 9FC2" /* —$@{¸È¤O3‘&u.ŸÂ */
- $"0283 44C3 5AFD 9546 FCE2 4212 4F5B 01D4" /* .ƒDÃZý•FüâB.O[.Ô */
- $"6E53 A032 DA91 40F4 4BDE 0C23 FF1E D5DE" /* nS 2Ú‘@ôKÞ.#ÿ.ÕÞ */
- $"B543 59DC C0DC 759A 6043 5883 A5FE C785" /* µCYÜÀÜuš`CXƒ¥þÇ… */
- $"BA68 9F46 C21A 4C50 20E3 0488 FB34 1043" /* ºhŸFÂ.LP ã.ˆû4.C */
- $"FC68 562B 635A EE8D E334 0C6F 25A9 E4C9" /* ühV+cZîã4.o%©äÉ */
- $"3484 2AC2 6188 7242 E3F6 AEAC 6F86 2DE2" /* 4„*ÂaˆrBãö®¬o†-â */
- $"C377 BD02 CB1C 9553 5485 6A5B E118 9BBD" /* Ãw½.Ë.•ST…j[á.›½ */
- $"DC6B 2C92 C6CC C866 6E7F FE63 AB01 FE7D" /* Ük,’ÆÌÈfn.þc«.þ} */
- $"FF7F BB81 EA94 87BE B101 F468 0E30 F111" /* ÿ.»ê”‡¾±.ôh.0ñ. */
- $"7BC9 FA0D F87F BDD0 811B 8588 1AE7 8387" /* {Éú.ø.½Ð.…ˆ.烇 */
- $"5C06 B3A9 E2ED 6E5B B524 35AA CBFF 50D6" /* \.³©âín[µ$5ªËÿPÖ */
- $"49D9 6918 3837 59BD E7CC 8796 B0AF 2729" /* IÙi.87Y½ç̇–°¯') */
- $"0512 5A97 66FF 1A85 E004 1882 0108 EA41" /* ..Z—fÿ.…à..‚..êA */
- $"BBCC 15E0 254C 59AF 877D 0722 15FB ADA1" /* »Ì.à%LY¯‡}.".û­¡ */
- $"84C2 9B83 DD5B C6B1 EE29 084C 08F7 06C8" /* „›ƒÝ[Ʊî).L.÷.È */
- $"4F07 9818 6BF2 66E2 582B 2F7D 29AD BAFA" /* O.˜.kòfâX+/})­ºú */
- $"8F9E 0AC8 60AE D10E 3E49 17BF E015 0C5E" /* žÂÈ`®Ñ.>I.¿à..^ */
- $"5C51 5D5B 5BC1 6C83 C428 4505 E9BB 61CB" /* \Q][[ÁlƒÄ(E.é»aË */
- $"D7C2 F3C6 C102 73F5 409E D0CF B43E E497" /* ×ÂóÆÁ.sõ@žÐÏ´>ä— */
- $"C1E0 707B 3F6F EAA8 2F10 9285 7D9D 9F81" /* Áàp{?oê¨/.’…}Ÿ */
- $"303D 3A70 2B3F 4A45 558D 63F6 EEB9 CF21" /* 0=:p+?JEUcöî¹Ï! */
- $"52C1 27C2 8439 0BE2 BE1F A553 A1C7 E44C" /* RÁ'„9.â¾.¥S¡ÇäL */
- $"5422 9BC0 356D 1B40 E53B 3064 AA69 F464" /* T"›À5m.@å;0dªiôd */
- $"7AA7 4E56 F7E2 7AE5 CB6E E538 8582 1927" /* z§NV÷âzåËnå8…‚.' */
- $"019D B4B0 E6D9 0F0E 9670 7723 62CF C422" /* .´°æÙ..–pw#bÏÄ" */
- $"DD53 ED12 92AE 20B0 6B63 6CB3 C596 4F4E" /* ÝSí.’® °kcl³Å–ON */
- $"18B6 FD06 93B2 6F73 A740 770D C39F B873" /* .¶ý.“²os§@w.߸s */
- $"598F 3667 6F7A 29E9 9E6F 9D04 48DD A175" /* Y6goz)éžo.HÝ¡u */
- $"2AFC 61BD D706 2A8E 9789 F513 B8AF B8EA" /* *üa½×.*Ž—‰õ.¸¯¸ê */
- $"2426 7EDF 1EFA 1D19 7A50 D22F D15E 76FE" /* $&~ß.ú..zPÒ/Ñ^vþ */
- $"CD34 19AD 8126 775C A5FB B209 9658 F850" /* Í4.­&w\¥û²Æ–XøP */
- $"F2FD A65F B487 9F50 7FF0 12FD BA8B FB6E" /* òý¦_´‡ŸP.ð.ýº‹ûn */
- $"49F5 50DF C349 B4F9 F4D7 EDEB 53BE DEB0" /* IõPßÃI´ùô×íëS¾Þ° */
- $"7F85 29FB 5DFF 36B9 BEDA 9BF8 3CF2 FDAE" /* .…)û]ÿ6¹¾Ú›ø<òý® */
- $"DFB5 ABBE D3DB ED2B FDBA CFFB 7606 FB74" /* ßµ«¾ÓÛí+ýºÏûv.ût */
- $"D3F8 6B96 83BA F7ED EB3F 7EDE AFE0 EECD" /* Óøk–ƒº÷íë?~Þ¯àîÍ */
- $"FB5E 7F6E 807E DB9B F6BD F0FE D32B EA21" /* û^.n€~Û›ö½ðþÓ+ê! */
- $"EFA8 1EFA 823F 6DCF FB6C 8BEA 6CFD B5AF" /* ï¨.ú‚?mÏûl‹êlýµ¯ */
- $"0774 CFDB D337 FB7A 3F83 BA5D F51F DF55" /* .tÏÛÓ7ûz?ƒº]õ.ßU */
- $"47FB 690F DA86 F791 DDD6 2CCB E6B8 C536" /* Gûi.Ú†÷‘ÝÖ,Ëæ¸Å6 */
- $"D512 AD5E 1B08 0B8A 8D03 2F75 60E5 6BF8" /* Õ.­^...Š./u`åkø */
- $"447B C66A 7EC2 7912 B45F 8E48 277C D8E1" /* D{Æj~Ây.´_ŽH'|Øá */
- $"809C 5755 D718 BAAC F891 2AE5 F97C 3F5E" /* €œWU×.º¬ø‘*åù|?^ */
- $"0116 3A00 99F4 5896 E0EA B189 F5A5 7929" /* ..:.™ôX–à걉õ¥y) */
- $"C491 B57F 2232 B0C2 52F8 89B1 DB2F B284" /* Ä‘µ."2°ÂRø‰±Û/²„ */
- $"C1EE 0C43 EF76 FD94 F871 4077 7E19 EC36" /* Áî.Cïvý”øq@w~.ì6 */
- $"BBFA 6DFF 3C0B 5A98 89B4 84BB 56DB 5FC2" /* »úmÿ<.Z˜‰´„»VÛ_ */
- $"16C2 351A B46E AF45 AAC7 DD2E 97ED 970C" /* .Â5.´n¯EªÇÝ.—í—. */
- $"76D8 F8D0 42EB E639 28E8 BE33 A530 3B58" /* vØøÐBëæ9(è¾3¥0;X */
- $"2374 6B1C 97B0 1CD5 ACD5 615F FD30 62C6" /* #tk.—°.Õ¬Õa_ý0bÆ */
- $"899A 977D 4B74 CAB1 E9EE 6588 4E67 8733" /* ‰š—}KtʱéîeˆNg‡3 */
- $"B359 BCC7 DC7B 9884 E4A8 78CB 77E7 675D" /* ³Y¼ÇÜ{˜„ä¨xËwçg] */
- $"FF2D FCE4 7744 BDD1 A833 6BEC C481 2DA8" /* ÿ-üäwD½Ñ¨3kìÄ-¨ */
- $"3D1C 5D57 7595 1DEB 2278 31AE 4188 B1F2" /* =.]Wu•.ë"x1®Aˆ±ò */
- $"54E1 113D DA75 96ED 71FF 1577 7820 4D22" /* Tá.=Úu–íqÿ.wx M" */
- $"2BD9 3841 A416 96A4 2549 1A9D 3A55 8E39" /* +Ù8A¤.–¤%I.:UŽ9 */
- $"A929 4B4E E11F 0F88 8BB6 7E08 2210 9D21" /* ©)KNá..ˆ‹¶~.".! */
- $"92BF 623B B974 D371 0208 1489 5713 0F66" /* ’¿b;¹tÓq...‰W..f */
- $"3C4C 8394 72A6 08A1 3D86 BA0C 198B CE8B" /* <Lƒ”r¦.¡=†º..‹Î‹ */
- $"FB71 18D8 E044 CE7C A642 F1E5 DC8B F8E6" /* ûq.ØàDÎ|¦BñåÜ‹øæ */
- $"2405 66E0 B6C5 6A4F B1AE 2231 3060 11D4" /* $.fà¶ÅjO±®"10`.Ô */
- $"9963 5EF4 BB3D 1F61 0807 0AE1 0DFC 4718" /* ™c^ô»=.a..Âá.üG. */
- $"6C97 80A7 D438 6A81 B76A 6E7E 7A64 87A1" /* l—€§Ô8j·jn~zd‡¡ */
- $"1D7A 8744 3227 F565 4B4A E311 FA0F B477" /* .z‡D2'õeKJã.ú.´w */
- $"9DD6 0662 8844 7138 BDF8 CBCC 007F BDB6" /* Ö.bˆDq8½øËÌ..½¶ */
- $"07C4 98CC 226B 9762 33D0 99EF 54D9 5800" /* .ĘÌ"k—b3ЙïTÙX. */
- $"509D C37B 39A7 E11B 8771 0999 AB8B AAA6" /* PÃ{9§á.‡qÆ™«‹ª¦ */
- $"C463 6C38 7FB0 9121 2CA2 7634 BBEE 41FB" /* Äcl8.°‘!,¢v4»îAû */
- $"4F3B B050 3E38 15C4 98A6 216D 31C2 7057" /* O;°P>8.ʦ!m1ÂpW */
- $"0B3D 429A 6CFB 0819 EB4D B9D2 549F 6601" /* .=Bšlû..ëM¹ÒTŸf. */
- $"2436 5BEA 9DAC BBDA AB3A AB4F ABFF 768D" /* $6[ꬻګ:«O«ÿv */
- $"E220 E451 7E45 49C5 21FD B2E6 DEFD 2505" /* â äQ~EIÅ!ý²æÞý%. */
- $"836B 3500 54D8 50B8 7538 C5BF B951 7FB2" /* ƒk5.TØP¸u8Å¿¹Q.² */
- $"F927 CBB1 7AA1 D0BD 51E2 D7F7 C440 5DA0" /* ù'˱z¡Ð½Qâ×÷Ä@]  */
- $"89EF FEEE BF2E A5E4 F98A B652 F25A D1DC" /* ‰ïþî¿.¥äùŠ¶RòZÑÜ */
- $"482A 40CB A288 250A 22CA BCB4 815D 077E" /* H*@Ë¢ˆ%Â"ʼ´].~ */
- $"229E 59B2 8249 D336 A3C1 5D5B FAE5 483C" /* "žY²‚IÓ6£Á][úåH< */
- $"67F3 255E 1530 AFB1 D900 48FE 254B C54E" /* gó%^.0¯±Ù.Hþ%KÅN */
- $"42DC EE54 066B CE83 B1C9 F021 2031 8DF1" /* BÜîT.k΃±Éð! 1ñ */
- $"FE58 9315 B761 79CA 409A 6CD6 337A 14A9" /* þX“.·ayÊ@šlÖ3z.© */
- $"8622 90BC 3474 727C 66CE 09C5 61B4 A386" /* †"¼4tr|fÎÆÅa´£† */
- $"7509 819F 6EEB 5FCC C0A7 084A 7742 A6E3" /* uÆŸnë_ÌÀ§.JwB¦ã */
- $"F69A 90CA 24AD EB53 60AB 5FD0 FD6F 3DE6" /* öšÊ$­ëS`«_Ðýo=æ */
- $"44CF 80FB A400 B71F 1DD4 C690 A3DB 54CF" /* DÏ€û¤.·..ÔÆ£ÛTÏ */
- $"F492 7EC7 540C 048F 3D35 FD63 7593 751B" /* ô’~ÇT..=5ýcu“u. */
- $"F88F 4B7D E355 6685 FD5F 2743 8DF3 D839" /* øK}ãUf…ý_'CóØ9 */
- $"0894 99DB 1FAA 22B2 8800 8C9F D91F E60B" /* .”™Û.ª"²ˆ.ŒŸÙ.æ. */
- $"0EEE 2870 2932 2AE5 F401 11F0 8B2B 53DB" /* .î(p)2*åô..ð‹+SÛ */
- $"8028 E39D 744F E70B 11F3 A220 ABF4 FCD5" /* €(ãtOç..ó¢ «ôüÕ */
- $"37C9 0AC8 8749 215E 1D89 4022 96D0 04FF" /* 7ÉÂȇI!^.‰@"–Ð.ÿ */
- $"0C57 AC3D 351A 8582 EBA4 EA2B B65B A14B" /* .W¬=5.…‚ë¤ê+¶[¡K */
- $"048B E031 DE15 251C 669F 8457 FF38 D131" /* .‹à1Þ.%.fŸ„Wÿ8Ñ1 */
- $"0027 BB20 9721 6636 A375 AFBA AF7B BDBA" /* .'» —!f6£u¯º¯{½º */
- $"05F3 3114 E55E DAA9 219F 9516 F3DF 12B4" /* .ó1.å^Ú©!Ÿ•.óß.´ */
- $"DA3F 83DF 13A0 9900 3FA6 17E9 B014 E404" /* Ú?ƒß. ™.?¦.é°.ä. */
- $"434D 02D4 4283 D73D F4D1 5D95 8B25 6A6A" /* CM.ÔBƒ×=ôÑ]•‹%jj */
- $"CD5E BA93 82DF 1A30 4B0D 0E21 65A1 0001" /* Í^º“‚ß.0K..!e¡.. */
- $"2869 F06A 8949 311F DB03 39EB E8E1 5BFB" /* (iðj‰I1.Û.9ëèá[û */
- $"F11C 05C6 2469 BAEA 4516 4CC4 DAF5 927A" /* ñ..Æ$iºêE.LÄÚõ’z */
- $"2CEB 3150 DB6F 4DE2 8EED 59C0 604F 9AE5" /* ,ë1PÛoMâŽíYÀ`Ošå */
- $"E136 83B0 F348 3D1A B44D 3A8E D77A B0DE" /* á6ƒ°óH=.´M:Ž×z°Þ */
- $"5267 1055 24F7 3C3D EB3E 08EF 97F9 4B29" /* Rg.U$÷<=ë>.ï—ùK) */
- $"454F 1B5D 4A6E 56E1 0F90 00A1 4467 7454" /* EO.]JnVá..¡DgtT */
- $"B556 362A 9A19 9E35 19E9 BFDF E2AD 91D6" /* µV6*š.ž5.é¿ßâ­‘Ö */
- $"7FB6 95B9 F19D 8D07 2FAF 3162 D880 0AA7" /* .¶•¹ñ./¯1b؀§ */
- $"C9C4 94AD C49A 1231 2D9F 780F 6E3E 57D2" /* ÉÄ”­Äš.1-Ÿx.n>WÒ */
- $"8C1C 582C 179A 721C 7063 F056 F938 4EA1" /* Œ.X,.šr.pcðVù8N¡ */
- $"F3E4 E458 D254 280F 92CA ABDC 4ECF 3EB7" /* óääXÒT(.’Ê«ÜNÏ>· */
- $"95DF A3B8 45C0 1427 BA54 B2E2 D1BC B67D" /* •ß£¸EÀ.'ºT²âѼ¶} */
- $"5A0F EE12 37D4 BE1C 5785 A90D 2E62 B301" /* Z.î.7Ô¾.W…©..b³. */
- $"F66D A637 374B 17DA 7446 C318 3B11 4F50" /* öm¦77K.ÚtFÃ.;.OP */
- $"ED27 AEB2 D8F6 C3E4 AB48 5E7C 1D46 9463" /* í'®²ØöÃä«H^|.F”c */
- $"E7BA 9296 7BFA FDBB 39F2 7E86 1A5D 8FFA" /* 纒–{úý»9ò~†.]ú */
- $"7E06 FC92 3472 7950 8B67 8329 FA9F 47AA" /* ~.ü’4ryP‹gƒ)úŸGª */
- $"51F3 01AD A6DA 224F E711 AF6F BA8F FA86" /* Qó.­¦Ú"Oç.¯oºú† */
- $"FF61 EBD1 5613 B076 3543 3515 FF1B 1E9C" /* ÿaëÑV.°v5C5.ÿ..œ */
- $"CE78 6A36 7CCF FD63 E9E3 00E6 EA60 1DBE" /* Îxj6|Ïýcéã.æê`.¾ */
- $"42FB 3E66 D69D 8BA6 A0E6 13E1 2087 20D7" /* Bû>fÖ‹¦ æ.á ‡ × */
- $"7941 E3C4 C7C6 67FF 2C9C A486 253A C206" /* yAãÄÇÆgÿ,œ¤†%:Â. */
- $"F961 4A0E D9DD D32A 6D67 A012 B1A2 B549" /* ùaJ.ÙÝÓ*mg .±¢µI */
- $"3F58 8BA1 CA98 94EB 6099 570C D139 09AA" /* ?X‹¡Ê˜”ë`™W.Ñ9ƪ */
- $"8DEB C31A 0812 5DAD 2926 6846 D789 4430" /* ëÃ...]­)&hF׉D0 */
- $"4931 16B5 0804 52F1 040D B0A7 DDD7 7052" /* I1.µ..Rñ..°§Ý×pR */
- $"4269 C765 98AA 3941 F9EE 987A 2EAD 46BE" /* BiÇe˜ª9Aùî˜z.­F¾ */
- $"AA2B DD79 D9F9 7AF7 9318 B633 97CC DB93" /* ª+ÝyÙùz÷“.¶3—ÌÛ“ */
- $"5AF7 23D4 08E5 1FD7 EA45 85E9 4C98 77B6" /* Z÷#Ô.å.×êE…éL˜w¶ */
- $"0038 8756 6C8F 1A76 8D36 D67C 0BBD 248F" /* .8‡Vl.v6Ö|.½$ */
- $"8465 4CC4 7B7A C1B7 6348 F763 66A7 F04E" /* „eLÄ{zÁ·cH÷cf§ðN */
- $"FF4E 1C72 1053 323F 9E55 F75D 4097 9C24" /* ÿN.r.S2?žU÷]@—œ$ */
- $"AD5D 3C1B 766A 50A8 7252 6563 2687 8251" /* ­]<.vjP¨rRec&‡‚Q */
- $"8AE2 2EAE 6AA9 6439 2831 281E 034D 7999" /* Šâ.®j©d9(1(..My™ */
- $"F46F 47C1 911D 553A D887 0E8F 6E83 1B48" /* ôoGÁ‘.U:؇.nƒ.H */
- $"F0D9 C566 C0FF 0F02 5E68 EA76 7381 25B1" /* ðÙÅfÀÿ..^hêvs%± */
- $"D388 A375 370B A655 625B B71A 191C CD9D" /* Óˆ£u7.¦Ub[·...Í */
- $"F3CA 83B2 88D6 3712 B3E3 6CEA 19DC 3295" /* óʃ²ˆÖ7.³ãlê.Ü2• */
- $"3398 DF4F 1279 B346 1DD8 ED24 186F BEE1" /* 3˜ßO.y³F.Øí$.o¾á */
- $"8FD4 5FAD EAFF 6960 DE17 A0A4 B89E 7CF3" /* Ô_­êÿi`Þ. ¤¸ž|ó */
- $"C360 9DA8 91BF 470F ECC0 C0AA E260 3430" /* Ã`¨‘¿G.ìÀÀªâ`40 */
- $"EF4E CAD6 F964 05B0 8E27 C1F6 7516 4350" /* ïNÊÖùd.°Ž'Áöu.CP */
- $"B87D 7D16 703E 7972 1232 2E0F 6577 664C" /* ¸}}.p>yr.2..ewfL */
- $"8FA6 1414 7FB2 A33D A69E FD2F CF21 FC8F" /* ¦...²£=¦žý/Ï!ü */
- $"23A5 6AED 3E28 34A0 F73F F7D6 7F7C 5B6B" /* #¥jí>(4 ÷?÷Ö.|[k */
- $"0596 8B6D BACA 52DF 8E72 CDBA E221 7092" /* .–‹mºÊRߎrͺâ!p’ */
- $"A3AB B99D 1EE3 3F21 1AD2 0F0B DC5A 8BE1" /* £«¹.ã?!.Ò..ÜZ‹á */
- $"9E35 D891 9A60 EF28 5934 FA3B 8009 DC42" /* ž5Ø‘š`ï(Y4ú;€ÆÜB */
- $"11BE 487F D776 AF26 0EBD BF3E 8DCC B940" /* .¾H.×v¯&.½¿>̹@ */
- $"2523 D6E1 447F EA8A 5F66 DE0B 0962 249E" /* %#ÖáD.êŠ_fÞ.Æb$ž */
- $"165D BB6D 1EBD 1237 021B F903 DEEF 78FE" /* .]»m.½.7..ù.Þïxþ */
- $"B3F3 76B7 429F 336D 0EFA FF47 5CBC E3DF" /* ³óv·BŸ3m.úÿG\¼ãß */
- $"FC44 41BA BC9D 67AE 0B43 D817 FBCE 4F36" /* üDAº¼g®.CØ.ûÎO6 */
- $"8209 CCB5 38F6 712E 7DEA 4E9E 4B38 3B80" /* ‚Æ̵8öq.}êNžK8;€ */
- $"7B16 28E3 AB59 340E 93F0 4C65 C281 A4F1" /* {.(ã«Y4.“ðLe¤ñ */
- $"08E4 26A6 31AA B6A4 F784 BA8E C7FA 8919" /* .ä&¦1ª¶¤÷„ºŽÇú‰. */
- $"4B19 FA98 09C8 3C79 27DA CB39 881C 3B0E" /* K.ú˜ÆÈ<y'ÚË9ˆ.;. */
- $"9BEA 1EF3 D655 CFEB B4F7 0888 971D 69EF" /* ›ê.óÖUÏë´÷.ˆ—.iï */
- $"1105 0EF2 80B8 FF1E F0BE 107F 9AB0 6C52" /* ...ò€¸ÿ.ð¾..š°lR */
- $"FF78 3AA4 8FE0 3370 40DF C5E8 478A 2FCF" /* ÿx:¤à3p@ßÅèGŠ/Ï */
- $"96C5 8D32 8E07 AA93 DA95 4D9B 60C6 2748" /* –Å2Ž.ª“Ú•M›`Æ'H */
- $"C8F4 8347 D2D9 2E35 75E4 333A 6494 B177" /* ÈôƒGÒÙ.5uä3:d”±w */
- $"C836 6E4F AF08 CDB0 0FA5 D565 A0EC 946F" /* È6nO¯.Í°.¥Õe ì”o */
- $"ED5C 03F6 E5DB FA4F D29A BF8F BC7F 12D8" /* í\.öåÛúOÒš¿¼..Ø */
- $"7730 8564 524D 4B31 F681 8C71 C5BC 1641" /* w0…dRMK1öŒqż.A */
- $"6988 F9CF 0385 B8EE 4C04 07DB 5AD2 531C" /* iˆùÏ.…¸îL..ÛZÒS. */
- $"48BA 3E6F E24E AF73 DB5E B729 A4BF 894A" /* Hº>oâN¯sÛ^·)¤¿‰J */
- $"782D E8F2 91C9 E628 322C F20C 2D0C 73DD" /* x-èò‘Éæ(2,ò.-.sÝ */
- $"F093 4ED7 63DF E121 E7B9 DB7E 530D E3BD" /* ð“N×cßá!ç¹Û~S.ã½ */
- $"3469 29CE 5768 BE0F 1E91 46B7 00A0 CC2E" /* 4i)ÎWh¾..‘F·. Ì. */
- $"183D 7D57 762C 062D 0707 EBA4 177D 73E8" /* .=}Wv,.-..ë¤.}sè */
- $"FA30 83A6 479B AA9A 702E B8FD 9B54 0FF3" /* ú0ƒ¦G›ªšp.¸ý›T.ó */
- $"8222 1EB0 4CDD 4CF7 F0AB 8972 B655 9426" /* ‚".°LÝL÷ð«‰r¶U”& */
- $"4EEE 3B88 A6D2 F8B9 6845 0467 D606 9DDD" /* Nî;ˆ¦Òø¹hE.gÖ.Ý */
- $"C547 A61F 71E7 5A8E 6B83 51FD B2C1 A732" /* ÅG¦.qçZŽkƒQý²Á§2 */
- $"A6EA A0AA 6D13 E80B 0EC4 5DF4 348F FF6E" /* ¦ê ªm.è..Ä]ô4ÿn */
- $"2289 CFB4 1AE2 18D1 340F B29B E1FF 16B1" /* "‰Ï´.â.Ñ4.²›áÿ.± */
- $"0F0F B5AD 260A 7FD9 B1F2 3D0C 404F 75A8" /* ..µ­&Â.Ù±ò=.@Ou¨ */
- $"E4DB 52EE 259B D762 E5E5 4FFD 22AC 4856" /* äÛRî%›×bååOý"¬HV */
- $"9C62 8DDB F5D8 58F8 4EC7 1110 30EC E0D8" /* œbÛõØXøNÇ..0ìàØ */
- $"7FED 0176 FEF2 53B3 75C6 34E1 A3A7 79DA" /* .í.vþòS³uÆ4ᣧyÚ */
- $"1FDC 42EC 83B2 F3EB 056C E41B 4E65 3699" /* .ÜB샲óë.lä.Ne6™ */
- $"4BD6 1AE3 85A9 DBF6 89D4 39B0 79F9 8877" /* KÖ.ã…©Ûö‰Ô9°yùˆw */
- $"161C 2CB5 3F3C 294B 8CA3 A6F6 556C 4CAD" /* ..,µ?<)KŒ£¦öUlL­ */
- $"A752 918D 7E61 BA54 02D2 CF5C AEBE 1A0B" /* §R‘~aºT.ÒÏ\®¾.. */
- $"B75C A9CA 9876 AB0B 6028 4D8E D46C E479" /* ·\©Ê˜v«.`(MŽÔläy */
- $"A186 EA09 496E 0935 04E2 4C25 FA18 270B" /* ¡†êÆInÆ5.âL%ú.'. */
- $"A054 DE1C 1BD8 A089 9D95 1335 E93C 7C21" /*  TÞ..Ø ‰•.5é<|! */
- $"435E A570 3C42 AA88 0075 BB20 20AF 90EC" /* C^¥p<Bªˆ.u» ¯ì */
- $"26F9 7E41 5CC7 2154 63A3 D965 075C 1A78" /* &ù~A\Ç!Tc£Ùe.\.x */
- $"2A13 753E DDD9 F846 467C EFC6 5308 2B46" /* *.u>ÝÙøFF|ïÆS.+F */
- $"5BD9 2BFF 5F26 72DB 523D D0FC CE49 47B0" /* [Ù+ÿ_&rÛR=ÐüÎIG° */
- $"D98B 4D36 1B60 7C3A 0707 F46A 8565 4CCB" /* Ù‹M6.`|:..ôj…eLË */
- $"5DC1 A50D C039 BF24 7418 78A7 6D4F DE55" /* ]Á¥.À9¿$t.x§mOÞU */
- $"1CB8 B787 158C 6C4D D840 920F 3130 7A92" /* .¸·‡.ŒlMØ@’.10z’ */
- $"1CF4 1B74 BC2B 8954 0A80 9636 BFC3 6330" /* .ô.t¼+‰T€–6¿Ãc0 */
- $"3E7F 7E4E A811 39F2 3D56 10D3 6A76 4E20" /* >.~N¨.9ò=V.ÓjvN */
- $"F646 5CD3 9166 D2D6 046F E398 A934 2D04" /* öF\Ó‘fÒÖ.o㘩4-. */
- $"2E01 C602 1332 8274 6AE2 D5C9 6226 30B3" /* ..Æ..2‚tjâÕÉb&0³ */
- $"07DB FDF3 B3BB 6C31 B162 FF63 0639 8E6F" /* .Ûýó³»l1±bÿc.9Žo */
- $"3501 A54C 1AA6 42EB EDE7 885E EE2F A6D9" /* 5.¥L.¦Bëíçˆ^î/¦Ù */
- $"B74A AE20 8FFB 6FCF A537 642D F17F A45E" /* ·J® ûoÏ¥7d-ñ.¤^ */
- $"EE37 DE05 7569 A81E F464 A35B 603B 4F40" /* î7Þ.ui¨.ôd£[`;O@ */
- $"D00F C3D2 D04A F943 AC3C 37E2 1B2B A1D3" /* Ð.ÃÒÐJùC¬<7â.+¡Ó */
- $"09D6 A92B F7CB B2FA 9FF7 97F2 83F9 BABC" /* ÆÖ©+÷˲úŸ÷—òƒùº¼ */
- $"E4BE F015 E804 97FC A16F 6E8B 9004 8424" /* ä¾ð.è.—ü¡on‹.„$ */
- $"04F7 1295 0A15 3C1A AA5D 6A75 372A 0BB4" /* .÷.•Â.<.ª]ju7*.´ */
- $"4849 DD4A 012F D969 23A9 FBA7 C3EB D29F" /* HIÝJ./Ùi#©û§ÃëÒŸ */
- $"5CE0 BD6F 8436 26BB 1B52 3BCB DCAA 0791" /* \à½o„6&».R;Ëܪ.‘ */
- $"02B3 8EC7 5A89 D402 C9FF 058E E2C8 AD72" /* .³ŽÇZ‰Ô.Éÿ.ŽâÈ­r */
- $"01BF D9B3 FA52 B000 0000 3090 8B4E 8809" /* .¿Ù³úR°...0‹NˆÆ */
- $"9E4F 59A7 8021 D030 169B 78E6 55B4 9FB8" /* žOY§€!Ð0.›xæU´Ÿ¸ */
- $"48A1 D2F4 BE8E A948 A89E 5E3E BE56 AE8C" /* H¡Òô¾Ž©H¨ž^>¾V®Œ */
- $"BF6C 6485 F435 4906 BE37 4D88 589A 85C0" /* ¿ld…ô5I.¾7MˆXš…À */
- $"5278 59EC 1FED 3652 3FE0 5229 0524 D686" /* RxYì.í6R?àR).$Ö† */
- $"1E5E 14D9 8C56 8742 9625 36BB 4674 0391" /* .^.ÙŒV‡B–%6»Ft.‘ */
- $"9647 FCC9 30C4 6D0D 5812 1271 E9C8 E89D" /* –GüÉ0Äm.X..qéÈè */
- $"7F9B 3420 0269 5F58 4554 F964 BDDA E9F3" /* .›4 .i_XETùd½Úéó */
- $"973A 5B5F 4C59 107B 2D9E 87CB D896 1F13" /* —:[_LY.{-ž‡ËØ–.. */
- $"AC52 F00D 3600 9104 3FF2 399A 0158 5153" /* ¬Rð.6.‘.?ò9š.XQS */
- $"139A A5C2 51CC D2C7 D082 C2A0 E35B FE05" /* .š¥ÂQÌÒÇЂ ã[þ. */
- $"06C9 DBB4 7036 39DB 80AF 4642 9F53 170C" /* .ÉÛ´p69Û€¯FBŸS.. */
- $"2856 38D5 0FA7 B562 4ED8 3BB5 B48A B1C8" /* (V8Õ.§µbNØ;µ´Š±È */
- $"B20B 4B42 4499 C5C1 242B A1BA CB74 D8F1" /* ².KBD™ÅÁ$+¡ºËtØñ */
- $"1CF1 241E 7A2A B847 111D 13DC CD3C 05A3" /* .ñ$.z*¸G...ÜÍ<.£ */
- $"024F 25B5 41E2 0A15 E1C4 1A0E A5D8 0742" /* .O%µAâÂ.áÄ..¥Ø.B */
- $"A359 2372 FD88 7447 1DB7 F766 5B7F E63E" /* £Y#rýˆtG.·÷f[.æ> */
- $"26B8 BC6E 7B72 E331 2BE1 73BD 04A0 E941" /* &¸¼n{rã1+ás½. éA */
- $"45EC 9039 8769 8BFF 1624 8D43 CA24 9D0D" /* Eì9‡i‹ÿ.$CÊ$. */
- $"A05B F467 7401 E777 0608 C4A6 A698 9A9B" /*  [ôgt.çw..Ħ¦˜š› */
- $"7066 11D3 606F 857E 18D8 D9D3 E226 38C0" /* pf.Ó`o…~.ØÙÓâ&8À */
- $"D89B 09D9 A2F1 0171 BAC9 D7BF AB2E BD58" /* Ø›ÆÙ¢ñ.qºÉ׿«.½X */
- $"7178 6CC2 608D 447D D92A 621C 1A82 B764" /* qxlÂ`D}Ù*b..‚·d */
- $"2ABE CBE8 07C0 E2A6 9B83 46A8 1109 FC87" /* *¾Ëè.À⦛ƒF¨.Æü‡ */
- $"F083 9598 26AE 8847 7E22 278D 9311 59FC" /* ðƒ•˜&®ˆG~"'“.Yü */
- $"2995 1D44 BA58 24BC 2A99 3946 0E00 9144" /* )•.DºX$¼*™9F..‘D */
- $"9113 0297 29E3 A7B5 B937 2D23 8405 86ED" /* ‘..—)㧵¹7-#„.†í */
- $"29F1 5254 6A8C 0FB8 4B13 F6C3 6028 2C14" /* )ñRTjŒ.¸K.öÃ`(,. */
- $"3B80 E317 225C 7A9B 405C 7E95 A2E4 311B" /* ;€ã."\z›@\~•¢ä1. */
- $"076A D7B8 A4B5 225A 1F29 FAA2 8239 D98F" /* .j׸¤µ"Z.)ú¢‚9Ù */
- $"071A F302 DA24 AE80 2AC0 D108 035D EA76" /* ..ó.Ú$®€*ÀÑ..]êv */
- $"2F7E 850F 9E87 6B19 B2F1 F1E5 F5B3 A5AF" /* /~….ž‡k.²ññåõ³¥¯ */
- $"35BB D867 8257 8A48 5E4F 6983 E22E 6DAD" /* 5»Øg‚WŠH^Oiƒâ.m­ */
- $"D361 1505 ECF2 3F3C DB84 1861 E5AB 6793" /* Óa..ìò?<Û„.aå«g“ */
- $"910D 8F56 6BB5 FD17 29DB 242A 6946 8022" /* ‘.Vkµý.)Û$*iF€" */
- $"7DAF 8120 02EB C840 3765 69EC BB8B F2FF" /* }¯ .ëÈ@7ei컋òÿ */
- $"6031 7BE4 EFC4 BECD 7BD7 CB0A 8B8C 75C2" /* `1{äïľÍ{×Ë‹Œu */
- $"E63A F4E4 B05B 1442 0CB1 BEBD E078 84F5" /* æ:ôä°[.B.±¾½àx„õ */
- $"3D95 24FA 952F 949B AD72 01B7 1CC7 4CA6" /* =•$ú•/”›­r.·.ÇL¦ */
- $"78C2 BA05 B757 517A 5CB1 A380 0C23 0680" /* xº.·WQz\±£€.#.€ */
- $"3113 0CBA 23B8 AA48 F832 B74F 997E 6E03" /* 1..º#¸ªHø2·O™~n. */
- $"D16C 577F 968F E9A4 73CA DA79 07B3 A5F1" /* ÑlW.–é¤sÊÚy.³¥ñ */
- $"2D20 C13D F821 62F9 41A0 A7AA 472A 368A" /* - Á=ø!bùA §ªG*6Š */
- $"28EE 7686 F7B4 D5CF 225E 004E 709F C4E8" /* (îv†÷´ÕÏ"^.NpŸÄè */
- $"FCBC B778 C976 A1E0 1968 1EF9 E998 2DC2" /* ü¼·xÉv¡à.h.ùé˜- */
- $"1693 C645 A4F5 787A 5B10 45C0 F010 8596" /* .“ÆE¤õxz[.EÀð.…– */
- $"A0F6 E8AA 1BAC C958 C0F6 101E 0C4D 2E61" /*  öèª.¬ÉXÀö...M.a */
- $"B76E 4019 58DD 3058 000C 2375 6EBC 6599" /* ·n@.XÝ0X..#un¼e™ */
- $"BEA3 9ADC 0002 F98F 24B3 B036 EA0D F2FD" /* ¾£šÜ..ù$³°6ê.òý */
- $"6823 E10A 59D7 5D0B F6C0 EFB2 7D9D A684" /* h#áÂY×].öÀï²}¦„ */
- $"3084 4AD6 92F2 BFB2 57CA 7294 FF2D 53C8" /* 0„JÖ’ò¿²WÊr”ÿ-SÈ */
- $"8D05 254E 2360 582F CE0C E209 240D FAB4" /* .%N#`X/Î.âÆ$.ú´ */
- $"C638 2103 7462 2AF1 5461 2036 09B4 294F" /* Æ8!.tb*ñTa 6Æ´)O */
- $"52A6 6553 F6B7 85F6 E77F A8B7 058C F201" /* R¦eSö·…öç.¨·.Œò. */
- $"19BA D75B 6612 0013 CFA6 F54F 8855 C000" /* .º×[f...ϦõOˆUÀ. */
- $"00BE 57DE C13B 77B0 AF81 F95D 8E88 7224" /* .¾WÞÁ;w°¯ù]Žˆr$ */
- $"002F C7BE 1D06 F540 58EF 1909 1D8F 037F" /* ./Ǿ..õ@Xï.Æ... */
- $"E973 290F 641E 8849 F996 EA66 D15C CA23" /* és).d.ˆIù–êfÑ\Ê# */
- $"C620 3090 94D8 F95F C58C 720B 7FFE 206C" /* Æ 0”Øù_ÅŒr..þ l */
- $"A3E0 EE49 AE89 4586 6617 FE87 4D7B D300" /* £àîI®‰E†f.þ‡M{Ó. */
- $"4CF6 E77F A882 E041 362F 710E AC03 D573" /* Löç.¨‚àA6/q.¬.Õs */
- $"69FF 7480 0018 484B 0D10 C800 0000 0C24" /* iÿt€..HK..È....$ */
- $"183F ADBF D900 0184 8481 E82C C758 1848" /* .?­¿Ù..„„è,ÇX.H */
- $"4840 6806 1212 B020 EA50 0818 484B F6E7" /* H@h...° êP..HKöç */
- $"7FA5 E774 6249 2F3D 5FF9 2FC0 0C24 1656" /* .¥çtbI/=_ù/À.$.V */
- $"1B91 8000 1846 D5F4 CA01 40C2 3F26 3D84" /* .‘€..FÕôÊ.@Â?&=„ */
- $"7B4A 811F 08D6 B47D 05C2 4402 D57B C1FC" /* {J..Ö´}.ÂD.Õ{Áü */
- $"7D32 E6FE 8125 F24E 514B 2820 7323 F96F" /* }2æþ%òNQK( s#ùo */
- $"B1F9 CDBD 94E4 C9BF 81D6 5A26 1C08 2131" /* ±ùͽ”äÉ¿ÖZ&..!1 */
- $"FF58 608E A4BB BEFD 703F C3EA B596 2AEA" /* ÿX`Ž¤»¾ýp?Ãêµ–*ê */
- $"48B2 2319 2F7A B9BC A14D EAB4 49CF 89E9" /* H²#./z¹¼¡Mê´Iωé */
- $"D312 5979 1910 6519 C45E 4B88 F709 D65D" /* Ó.Yy..e.Ä^Kˆ÷ÆÖ] */
- $"BF0F 86DC C883 8469 9757 7FC7 FB91 A851" /* ¿.†Üȃ„i—W.Çû‘¨Q */
- $"7834 0232 03F5 F552 B022 E799 431E 3FE8" /* x4.2.õõR°"ç™C.?è */
- $"BE7C A37B AAE1 D04F 9795 EA98 CAB0 6816" /* ¾|£{ªáÐO—•ê˜Ê°h. */
- $"047F 244A 2BD3 E0CF B862 B172 B1B3 F027" /* ..$J+Óàϸb±r±³ð' */
- $"6505 A5AA 6AB2 5F8E B98F 85CB D487 2603" /* e.¥ªj²_Ž¹…ËÔ‡&. */
- $"BDA4 4C6D 4B74 0A12 117F 6137 6A30 37CE" /* ½¤LmKtÂ...a7j07Î */
- $"0441 188C 63FC 46ED 5C9A B6A0 9012 6450" /* .A.ŒcüFí\š¶ .dP */
- $"A042 C4D3 8E69 8930 0797 25B3 B70D 5C62" /*  BÄÓŽi‰0.—%³·.\b */
- $"6A83 3964 5EF1 4A28 508D FF7F E847 17D0" /* jƒ9d^ñJ(Pÿ.èG.Ð */
- $"7C91 F4BC AA82 5462 99EF FF79 5A7A E45E" /* |‘ô¼ª‚Tb™ïÿyZzä^ */
- $"98FF 5B1E 90FE 7F80 9453 7AD1 4A63 8FFC" /* ˜ÿ[.þ.€”SzÑJcü */
- $"1B61 796C 4B90 7FE9 1959 752B 8579 95F8" /* .aylK.é.Yu+…y•ø */
- $"C5B9 7EC6 2D24 5185 1BCE 12D6 B418 B42C" /* Ź~Æ-$Q….Î.Ö´.´, */
- $"D40F 7AF7 657E 5184 9CAA 8834 B65C 4785" /* Ô.z÷e~Q„œªˆ4¶\G… */
- $"B934 7C3A 8000 0000 99F5 3F06 3790 6AF7" /* ¹4|:€...™õ?.7j÷ */
- $"0769 9D8E F19F 4FF3 EDE6 D059 B97C A1F0" /* .iŽñŸOóíæÐY¹|¡ð */
- $"0CE2 4FAF B846 8CCE 52E4 E898 D2E0 00A3" /* .âO¯¸FŒÎRäè˜Òà.£ */
- $"CB3D F2B1 E7F7 0C30 FF13 DB29 474C C00D" /* Ë=ò±ç÷.0ÿ.Û)GLÀ. */
- $"C6B7 6A2D 2F89 8E2F BDE7 F2BA C3DD 591B" /* Æ·j-/‰Ž/½çòºÃÝY. */
- $"CEDE C7DD 35BA 492C BB53 2AF6 7315 AC30" /* ÎÞÇÝ5ºI,»S*ös.¬0 */
- $"17D7 1C05 3AE4 4AB3 8D31 0DC9 7A9F 0A76" /* .×..:äJ³1.ÉzŸÂv */
- $"B4EE 95EE 6CB5 1C6A FE4F D27E 0966 CE51" /* ´î•îlµ.jþOÒ~ÆfÎQ */
- $"8607 E144 F4AD E999 5480 05FF 7FC2 C645" /* †.áDô­é™T€.ÿ.ÂÆE */
- $"D136 BB6E 89FA 9A2D F827 338F FEB9 B248" /* Ñ6»n‰úš-ø'3þ¹²H */
- $"23A6 377D 0E53 BBF3 D290 3AD8 F58B CE4C" /* #¦7}.S»óÒ:Øõ‹ÎL */
- $"24CA 8E49 76ED DA48 8856 904D C31F 305F" /* $ÊŽIvíÚHˆVMÃ.0_ */
- $"C441 7DAA 86D8 3FE1 5EA7 E20A CDBC 5F2A" /* ÄA}ª†Ø?á^§âÂͼ_* */
- $"35DC 107F DDE2 D88C 7B38 D700 4C54 9C81" /* 5Ü..ÝâØŒ{8×.LTœ */
- $"B8FD F39D 0F47 DE2B 6E17 7D4F E30F F60C" /* ¸ýó.GÞ+n.}Oã.ö. */
- $"0895 5694 3006 1211 EFEC D7F8 F743 3D43" /* .•V”0...ïì×ø÷C=C */
- $"6BA5 7C06 9025 9188 E369 0FC8 94CB F38E" /* k¥|.%‘ˆãi.È”ËóŽ */
- $"DF76 CA67 91C4 D786 F34F 1E56 332B 1404" /* ßvÊg‘Ä׆óO.V3+.. */
- $"B66B 2702 B13D 47B8 1FBD 38D7 A2DF 54EF" /* ¶k'.±=G¸.½8×¢ßTï */
- $"FD1C 00CC 5D05 5B28 3EBF 2FC7 7263 5880" /* ý..Ì].[(>¿/ÇrcX€ */
- $"0364 4A0B 982F 4A13 A55F 5D64 61D2 110C" /* .dJ.˜/J.¥_]daÒ.. */
- $"4319 318A 5BD6 94B7 DBA9 92F0 379B 0E87" /* C.1Š[Ö”·Û©’ð7›.‡ */
- $"4561 92A0 0000 0000 0000 12FE B897 0ABD" /* Ea’ .......þ¸—½ */
- $"B3C7 FEA8 AE43 B177 DA3F 2BA3 2D59 3358" /* ³Çþ¨®C±wÚ?+£-Y3X */
- $"9FAE 567F E53B 2877 9FFF 7FFF 7FFB 4B90" /* Ÿ®V.å;(wŸÿ.ÿ.ûK */
- $"C00D FEA3 7DF6 39C4 C825 2952 2C65 8FFF" /* À.þ£}ö9ÄÈ%)R,eÿ */
- $"7E91 DB49 1333 7DEC 6471 1E2E 394E A080" /* ~‘ÛI.3}ìdq..9N € */
- $"C1C9 0DD4 62C4 4FC9 E332 BC0D F9DD FEAB" /* ÁÉ.ÔbÄOÉã2¼.ùÝþ« */
- $"9D33 8271 2A01 8484 B009 6058 624E 2736" /* 3‚q*.„„°Æ`XbN'6 */
- $"529C A0F4 BCBB 846D 32FD 407C FA84 2D52" /* Rœ ô¼»„m2ý@|ú„-R */
- $"21DC 1623 210B 0410 4061 212D 0386 04FF" /* !Ü.#!...@a!-.†.ÿ */
- $"7F72 1DFF 6F83 6A31 2B6E 0A6B D1F1 9A43" /* .r.ÿoƒj1+nÂkÑñšC */
- $"F340 2C47 D413 DFAC FF76 46AC 4BDD 55F0" /* ó@,GÔ.߬ÿvF¬KÝUð */
- $"2F9A 3BC6 613E 2F69 F45C 08F3 3FCB F83F" /* /š;Æa>/iô\.ó?Ëø? */
- $"F7D8 DC38 0F99 4764 0309 0948 41C6 1212" /* ÷ØÜ8.™Gd.ÆÆHAÆ.. */
- $"293B 5EA3 BE56 F760 BAEF 61FF 43D4 2891" /* );^£¾V÷`ºïaÿCÔ(‘ */
- $"A380 672E FF7E 4B98 FBFB 1ACD 90F6 4A7E" /* £€g.ÿ~K˜ûû.ÍöJ~ */
- $"3B14 E9F4 B1B4 4120 E600 AF42 0056 B131" /* ;.éô±´A æ.¯B.V±1 */
- $"0310 EF4F EA97 E030 9090 A298 F514 CEFA" /* ..ïOê—à0¢˜õ.Îú */
- $"B200 0061 211A A495 FD76 5850 B8F7 1CF1" /* ²..a!.¤•ývXP¸÷.ñ */
- $"A979 F478 5BFF 7FFB E6D6 F6D8 03FF 7FFD" /* ©yôx[ÿ.ûæÖöØ.ÿ.ý */
- $"2A36 38D4 BA43 6280 D508 C4BD 735D 1C6F" /* *68ÔºCb€Õ.Ľs].o */
- $"2444 63E9 1C9A 969F 90A6 F34E D24D 94F2" /* $Dcé.š–Ÿ¦óNÒM”ò */
- $"1A09 F86A 2762 886F FBA0 96EA 1DC7 0364" /* .Æøj'bˆoû –ê.Ç.d */
- $"6192 A000 0000 0000 0000 0000 0061 BE9F" /* a’ ..........a¾Ÿ */
- $"2C25 5C25 4958 1428 AA60 5ABF 5551 6084" /* ,%\%IX.(ª`Z¿UQ`„ */
- $"D319 B739 1DC3 F92F 03A7 CF66 39CC 13BE" /* Ó.·9.Ãù/.§Ïf9Ì.¾ */
- $"100A 204E 9A06 CBD9 A8ED 9E4D CEED AE53" /* . Nš.ËÙ¨ížMÎí®S */
- $"023D B3BF AC07 F70E F7DD 2601 E2B4 B214" /* .=³¿¬.÷.÷Ý&.â´². */
- $"3B1D 74CD 0F60 7063 EFC5 24B8 3B0F DF21" /* ;.tÍ.`pcïÅ$¸;.ß! */
- $"2929 3755 A800 7D09 63D9 1548 5D89 6D22" /* ))7U¨.}ÆcÙ.H]‰m" */
- $"FAEF 37DC EB96 FF52 0018 EBDF 464C 8B34" /* úï7Üë–ÿR..ëßFL‹4 */
- $"DF85 2990 1CF1 7C84 CEDC D384 5003 D5A1" /* ß…).ñ|„ÎÜÓ„P.Õ¡ */
- $"2797 DBDC FDFB 0E8C 3703 470D 1FD5 B974" /* '—ÛÜýû.Œ7.G..Õ¹t */
- $"5A32 CF32 3D2A 0213 FDC8 8A0C B595 4840" /* Z2Ï2=*..ýÈŠ.µ•H@ */
- $"C240 6E40 D585 AF4C 004A F98F FC90 E5BB" /* Â@n@Õ…¯L.Jùüå» */
- $"D6AD 2A34 0A6E 1D4D 933D 2221 80B7 C8EF" /* Ö­*4Ân.M“="!€·Èï */
- $"7C61 2953 2991 F91A 61A3 B54E 56D2 77E1" /* |a)S)‘ù.a£µNVÒwá */
- $"1DB8 8B5F 5E9C 7D32 80A0 C23F BBE6 A2B2" /* .¸‹_^œ}2€ Â?»æ¢² */
- $"D49F C777 4BE6 FDA6 7B0F 2983 E19B 84FF" /* ÔŸÇwKæý¦{.)ƒá›„ÿ */
- $"4B7B 0DD6 A35E 60AD 632D D6D7 7030 0A9F" /* K{.Ö£^`­c-Ö×p0Ÿ */
- $"0FA2 0820 8451 9624 D0FF 1FB4 9B81 61CC" /* .¢. „Q–$Ðÿ.´›aÌ */
- $"591F 6D98 E1AF 16E4 AF42 1FE0 B7C7 30DF" /* Y.m˜á¯.ä¯B.à·Ç0ß */
- $"CFFC EC14 15A1 B07A 4E11 ED5F BDB3 FD2A" /* Ïüì..¡°zN.í_½³ý* */
- $"84B1 6901 4333 27BB 2E8C 3329 2064 A800" /* „±i.C3'».Œ3) d¨. */
- $"0001 2FDE 803E 817B C369 A30F FCF0 FF1D" /* ../Þ€>{Ãi£.üðÿ. */
- $"89A1 2FD7 FF71 B63D 19EC 98DE DFE2 D9B8" /* ‰¡/×ÿq¶=.ì˜ÞßâÙ¸ */
- $"9D39 1737 4722 2A89 D291 623B 279F BF0B" /* 9.7G"*‰Ò‘b;'Ÿ¿. */
- $"E8C0 8AF8 CBE4 0011 5D58 29AB 34B0 335C" /* èÀŠøËä..]X)«4°3\ */
- $"36B2 1383 D820 11B8 22DF 56E1 27EF 932D" /* 6².ƒØ .¸"ßVá'ï“- */
- $"30DE CC72 58E3 9BDD A88C 229A CBC8 A466" /* 0ÞÌrXã›Ý¨Œ"šËȤf */
- $"7C29 FDE8 E789 F28F 3258 A2DD 897B 1C6A" /* |)ýèç‰ò2X¢Ý‰{.j */
- $"C048 306A EEA7 3DF0 F8D4 BECC CDBD 9E43" /* ÀH0jî§=ðøÔ¾ÌͽžC */
- $"A29D 8052 478B 6470 79B7 B38A 5743 CAE7" /* ¢€RG‹dpy·³ŠWCÊç */
- $"0BD4 0F4A 23E1 4C85 39C9 DEB0 75AF 151E" /* .Ô.J#áL…9ÉÞ°u¯.. */
- $"45D5 1681 2BA4 74C9 13B5 746A E399 9467" /* EÕ.+¤tÉ.µtjã™”g */
- $"E6B9 D503 7F7C D57D 4D5F 7FC8 DD43 7D9B" /* æ¹Õ..|Õ}M_.ÈÝC}› */
- $"3CDC F9AD 167C 162B 4E6C 2110 DB2C DF34" /* <Üù­.|.+Nl!.Û,ß4 */
- $"AEED CCE4 05AC 4057 9829 B161 9CA0 8159" /* ®íÌä.¬@W˜)±aœ Y */
- $"A64F FD15 EC5A 4A51 CA6C FD10 9A25 4291" /* ¦Oý.ìZJQÊlý.š%B‘ */
- $"1E90 1FC2 3530 E0DB E4E6 232E CB64 AF95" /* ..Â50àÛäæ#.Ëd¯• */
- $"9494 656D D395 3D62 9EDA 2EC1 DB02 1FAA" /* ””emÓ•=bžÚ.ÁÛ..ª */
- $"6778 0FC0 C4A2 CCA8 EDC0 4DA8 F889 162F" /* gx.ÀĢ̨íÀM¨ø‰./ */
- $"03F9 A9C1 C635 1DAD 2E22 580B 0B2B 83E3" /* .ù©ÁÆ5.­."X..+ƒã */
- $"EC02 5552 3AA8 91BA 45AF 5439 4265 71F6" /* ì.UR:¨‘ºE¯T9Beqö */
- $"3E7A 4412 5DE5 1863 50E6 C0ED C470 3ED9" /* >zD.]å.cPæÀíÄp>Ù */
- $"0E3F 48BA 54C5 915E 03F0 D836 6429 2A67" /* .?HºTÅ‘^.ðØ6d)*g */
- $"B7FA 6AF9 069E 8E67 2848 B570 C3AC 7746" /* ·újù.žŽg(HµpìwF */
- $"EB48 0A2F 4BE4 8EB3 3F8F 791F 0646 DEDF" /* ëHÂ/K䎳?y..FÞß */
- $"316B EFDF 6FD8 C0B9 7319 CE94 8930 C6F6" /* 1kïßoØÀ¹s.Δ‰0Æö */
- $"6399 C4A9 79AD E967 4783 3F8D C538 3C15" /* c™Ä©y­égGƒ?Å8<. */
- $"E5B7 CE98 22B7 5333 A938 B26F 0E1E EF2E" /* å·Î˜"·S3©8²o..ï. */
- $"74B9 72EF 9D8A 80B7 FDC1 8334 A5F9 DCFB" /* t¹r·ýÁƒ4¥ùÜû */
- $"B891 BB38 373C 9BE8 59F4 6018 6E63 DA65" /* ¸‘»87<›èYô`.ncÚe */
- $"9B13 9DC8 28DB 3C15 0D2C 11FC 0E2D 7A0A" /* ›.È(Û<..,.ü.-z */
- $"F8FF 671F C3FF 7F8E 1210 C212 EA5A 5F0B" /* øÿg.Ãÿ.Ž..Â.êZ_. */
- $"9727 F770 25A5 236D 9789 75C7 4089 11DD" /* —'÷p%¥#m—‰uÇ@‰.Ý */
- $"E472 3865 B217 B946 CF22 5225 27DE 566D" /* är8e².¹FÏ"R%'ÞVm */
- $"6799 4F82 0D46 59F5 E466 F9E7 71C3 FA80" /* g™O‚.FYõäfùçqÃú€ */
- $"7826 E598 FF48 E181 6CA8 5A7E C354 0CAA" /* x&å˜ÿHál¨Z~ÃT.ª */
- $"B01C 9EC4 181F 849B 6A13 FB8D C477 70BD" /* °.žÄ..„›j.ûÄwp½ */
- $"F46B 278C 4467 B0CF 3E21 805E EF97 9696" /* ôk'ŒDg°Ï>!€^ï—–– */
- $"CBB9 E3F6 B62E DC26 001A 408F D7E2 07C3" /* ˹ãö¶.Ü&..@×â.à */
- $"C1A4 AD97 4235 8863 A088 1980 C505 6E1F" /* Á¤­—B5ˆc ˆ.€Å.n. */
- $"F392 0B24 B500 20DC 8295 5703 F9B9 FF70" /* ó’.$µ. Ü‚•W.ù¹ÿp */
- $"355C 9B8D BB49 898F 1AAB F65F 7D7E E28F" /* 5\›»I‰.«ö_}~â */
- $"4300 BDCC FB20 4F67 CA07 0CAE 3BAD AA36" /* C.½Ìû OgÊ..®;­ª6 */
- $"A4D8 3358 4176 1AD6 01FA 0450 0000 0042" /* ¤Ø3XAv.Ö.ú.P...B */
- $"7B49 E0E8 A7D8 4EA9 E1A5 597B DB80 BA6D" /* {Iàè§ØN©á¥Y{Û€ºm */
- $"8010 25EA 0A26 833F DE77 DBF7 78B9 564B" /* €.%êÂ&ƒ?ÞwÛ÷x¹VK */
- $"57B2 AF8C BC92 97D7 46A1 23C1 B595 A2EE" /* W²¯Œ¼’—×F¡#Áµ•¢î */
- $"F8A9 29FA 42C2 3557 6345 80B1 FCFD F322" /* ø©)úBÂ5WcE€±üýó" */
- $"E992 9262 A83F E43D B059 CB12 D425 FEF2" /* é’’b¨?ä=°YË.Ô%þò */
- $"9932 1BD8 C65C ED82 D05E E15C 5E9C 76B7" /* ™2.ØÆ\í‚Ð^á\^œv· */
- $"7C64 FCDB A247 D388 3CCB 86B5 C486 2261" /* |düÛ¢GÓˆ<ˆµÄ†"a */
- $"BFD1 7213 39C3 0D69 6AF0 2476 B711 7E91" /* ¿Ñr.9Ã.ijð$v·.~‘ */
- $"6B53 6A04 4F3C 2781 A090 3118 6C3F 49BA" /* kSj.O<' 1.l?Iº */
- $"B81A 3FEB D686 EFCE F487 8315 E33F 84DB" /* ¸.?ëÖ†ïÎô‡ƒ.ã?„Û */
- $"E2C9 F35F 28C5 10C4 FF7F FA4F E953 89FC" /* âÉó_(Å.Äÿ.úOéS‰ü */
- $"8B32 23C6 0D04 5E49 DADA F0FE BCA7 D2C9" /* ‹2#Æ..^IÚÚðþ¼§ÒÉ */
- $"5869 EAD4 F153 9BF5 A5EA 3298 CC8B 8721" /* XiêÔñS›õ¥ê2˜Ì‹‡! */
- $"F919 680B 3F8C 304A 2849 4970 41CF 0F60" /* ù.h.?Œ0J(IIpAÏ.` */
- $"76D9 5820 EF21 CD4A 205A 632F 7CC4 EFDF" /* vÙX ï!ÍJ Zc/|Äïß */
- $"33F3 CCA8 EDAF 405B 78E1 8F79 0F66 6573" /* 3ǫ́í¯@[xáy.fes */
- $"35A2 AD75 1E18 6018 AF23 7C9D A008 1A01" /* 5¢­u..`.¯#| ... */
- $"C5FE 69AA 2C8E D97E 244D D075 F213 0CC6" /* Åþiª,ŽÙ~$MÐuò..Æ */
- $"738F 4395 BBC0 5CB6 3ADC 3DA8 ACB8 E018" /* sC•»À\¶:Ü=¨¬¸à. */
- $"BA5B 13DB 0F6A CB18 DEAC 9749 F5B5 361D" /* º[.Û.jË.Þ¬—Iõµ6. */
- $"CF3A C107 9606 179F F4C7 F3DE CB0B 1F53" /* Ï:Á.–..ŸôÇóÞË..S */
- $"F27E 5D3C 11AB 66B4 8037 0644 AE98 19BF" /* ò~]<.«f´€7.D®˜.¿ */
- $"D564 973A 0CF2 C96F 56D4 5CB8 666F C68C" /* Õd—:.òÉoVÔ\¸foÆŒ */
- $"1E73 E515 8B33 75D2 D3B4 B3A3 8CDE DE0C" /* .så.‹3uÒÓ´³£ŒÞÞ. */
- $"DA37 A3DF 44D2 B57E 2DB2 E891 D36F CC23" /* Ú7£ßDÒµ~-²è‘ÓoÌ# */
- $"ADE8 45BC BB30 78D7 77BD D4A8 087F C83F" /* ­èE¼»0x×w½Ô¨..È? */
- $"E49A 6873 FAC4 C12B 0056 5E18 C3CB C2E9" /* äšhsúÄÁ+.V^.ÃËÂé */
- $"DCAE F0E8 A75F 18DD B8DD 1DCD B0F5 3A1C" /* Ü®ðè§_.ݸÝ.Í°õ:. */
- $"3816 51A8 0D93 00D0 6FF6 8F07 E4BE EDF9" /* 8.Q¨.“.Ðoö.ä¾íù */
- $"BF0E 6CAA 5384 5DF0 DF12 4CF4 E3B3 5D6C" /* ¿.lªS„]ðß.Lôã³]l */
- $"602A B6F1 C0E0 E520 B0D6 71FB 7996 4930" /* `*¶ñÀàå °Öqûy–I0 */
- $"23DD 3601 3653 C40D 1A64 DC2B D5C2 01C9" /* #Ý6.6SÄ..dÜ+ÕÂ.É */
- $"5002 6BBE 7338 81EE F87D 7687 0FE6 7CF9" /* P.k¾s8îø}v‡.æ|ù */
- $"BAB6 5B35 1A25 421C 5BBA 4D82 4E1F B1D4" /* º¶[5.%B.[ºM‚N.±Ô */
- $"1907 FF78 F534 4A16 7BB6 B598 51F6 E4D3" /* ..ÿxõ4J.{¶µ˜QöäÓ */
- $"A04B 1198 B926 CFAE FC03 22E3 8360 E696" /*  K.˜¹&Ï®ü."ãƒ`æ– */
- $"F546 62F9 7178 F327 E245 4520 8D17 41C4" /* õFbùqxó'âEE .AÄ */
- $"9EC6 EF8D 0924 9416 7901 CE87 5EBB 286D" /* žÆïÆ$”.y.·^»(m */
- $"53BF 09FA 41F6 5FBA 8F4C 79A8 75BA 277A" /* S¿ÆúAö_ºLy¨uº'z */
- $"7D42 642B 38EE 9A49 DEDB F1B3 80D0 E5D0" /* }Bd+8îšIÞÛñ³€ÐåÐ */
- $"2980 F797 E7D0 F90D 4B2F AFDD 4A69 3389" /* )€÷—çÐù.K/¯ÝJi3‰ */
- $"1418 EBD0 6DF0 E38D 6E2F D546 C1A8 C8DD" /* ..ëÐmðãn/ÕFÁ¨ÈÝ */
- $"8977 E053 9C26 053A CF69 97F9 7FB4 9000" /* ‰wàSœ&.:Ïi—ù.´. */
- $"0000 0115 0E67 B64C 0015 DD82 643D 6476" /* .....g¶L..Ý‚d=dv */
- $"ED28 6324 AD72 8124 1AF6 FB1B 21C9 0605" /* í(c$­r$.öû.!É.. */
- $"FAE6 04A6 31BF 6D67 FF7B B889 831A 4FFD" /* úæ.¦1¿mgÿ{¸‰ƒ.Oý */
- $"6BF5 F098 23AB A490 39F7 6AFC 3832 E2E1" /* kõð˜#«¤9÷jü82âá */
- $"11B2 ADB0 ECCA 83DE B4FF 3685 5106 75DE" /* .²­°ìʃ޴ÿ6…Q.uÞ */
- $"3047 28A0 EDBE AD29 17CD DA62 698B CE64" /* 0G( í¾­).ÍÚbi‹Îd */
- $"5999 2B8E BB7D C74F F009 A25D B2B5 BDD9" /* Y™+Ž»}ÇOðÆ¢]²µ½Ù */
- $"B852 BFFE 0B74 9C05 22D7 B0A3 2139 0979" /* ¸R¿þ.tœ."×°£!9Æy */
- $"5C29 BAE8 43DA F9E5 5383 AFD2 14EC 64AA" /* \)ºèCÚùåSƒ¯Ò.ìdª */
- $"442C CE71 74ED 5C27 4331 9374 AC77 47EE" /* D,Îqtí\'C1“t¬wGî */
- $"31AC 4C74 97BC 753C D5DC 3D8B F7D2 C612" /* 1¬Lt—¼u<ÕÜ=‹÷ÒÆ. */
- $"2399 F431 07A1 76CA DAE6 772B 309A C800" /* #™ô1.¡vÊÚæw+0šÈ. */
- $"9F2F D6DF A44C 48EB 853E 4140 A123 BCA3" /* Ÿ/ÖߤLHë…>A@¡#¼£ */
- $"D096 00DA 0822 DFB3 6887 B31F A18F 59BE" /* Ж.Ú."ß³h‡³.¡Y¾ */
- $"6B25 B5CF CFA3 8806 85B7 ED84 B20B CDA2" /* k%µÏÏ£ˆ.…·í„².Í¢ */
- $"A0C8 404B 3FFF 7FF3 3816 5BF0 A16B 85D0" /*  È@K?ÿ.ó8.[ð¡k…Ð */
- $"B87F E4BB 21F9 A3BB 9103 2944 434A 5789" /* ¸.ä»!ù£»‘.)DCJW‰ */
- $"E3EC B1E3 6F3E 154A 37E4 ACA6 4B02 6C5B" /* ãì±ão>.J7䬦K.l[ */
- $"D23A D4D4 83CE F291 CD7F 114F 5935 8EE0" /* Ò:ÔÔƒÎò‘Í..OY5Žà */
- $"17EA F0B3 1D93 BC5F 2CF8 511C E99F 21D8" /* .êð³.“¼_,øQ.éŸ!Ø */
- $"E286 EB17 6FC2 C34B 1110 6398 03BF CB08" /* â†ë.oÂÃK..c˜.¿Ë. */
- $"0018 4848 E24D 90A5 63F9 B1F8 6E20 EF6E" /* ..HHâM¥cù±øn ïn */
- $"25D5 858B 0AE4 2235 581B D4DA E01C B006" /* %Õ…‹Âä"5X.ÔÚà.°. */
- $"E5EB DE78 855B 19E7 4D80 DAC2 1E8F CB2B" /* åëÞx…[.çM€ÚÂ.Ë+ */
- $"0EC8 3FFF 7759 B569 0861 20CC 1D71 2121" /* .È?ÿwYµi.a Ì.q!! */
- $"71A7 FA20 B34B EAB3 4260 A827 6E91 2B3C" /* q§ú ³Kê³B`¨'n‘+< */
- $"5479 449A 3161 D24E 8489 C00A 18A6 3FEC" /* TyDš1aÒN„‰ÀÂ.¦?ì */
- $"61F2 4C86 23C1 85DB 6ECA 221D BCC2 C25F" /* aòL†#Á…ÛnÊ".¼ÂÂ_ */
- $"EFFF 7891 F475 0E20 DC0A 8F85 8208 4541" /* ïÿx‘ôu. ÜÂ…‚.EA */
- $"579B 5EE2 24C4 5C60 39B7 D9F1 ECFD 0F0C" /* W›^â$Ä\`9·Ùñìý.. */
- $"3719 72A8 A543 8BF5 94BF BF6C E6F7 E45A" /* 7.r¨¥C‹õ”¿¿læ÷äZ */
- $"C5CF 1FD7 32F5 2D70 041E 3641 2C46 E23D" /* ÅÏ.×2õ-p..6A,Fâ= */
- $"E072 6889 A892 A27F 44A8 564A 74A3 B421" /* àrh‰¨’¢.D¨VJt£´! */
- $"E1CC A0F3 50E2 2711 6919 76BE D84B D2FE" /* áÌ óPâ'.i.v¾ØKÒþ */
- $"AAED 2D64 7C8F 4C55 7FFF 7EFC 2CBF 05DE" /* ªí-d|LU.ÿ~ü,¿.Þ */
- $"25B2 001C 00EC 6D17 ED17 E559 9DFA F731" /* %²...ìm.í.åYú÷1 */
- $"B21A 7394 8B35 5948 BA4F 5858 020F FF7C" /* ².s”‹5YHºOXX..ÿ| */
- $"C89D 1CFA F89B 9F9C 841F 19EF D626 E6DE" /* È.úø›Ÿœ„..ïÖ&æÞ */
- $"DCC3 3148 38A0 C32F 898F BEC3 0AF3 318C" /* ÜÃ1H8 Ã/‰¾ÃÂó1Œ */
- $"5E09 119B 43C8 9FE6 73B2 F4B9 9789 4BFC" /* ^Æ.›CÈŸæs²ô¹—‰Kü */
- $"99A2 FF7F FF7A 4FD0 8C64 F459 410C 013C" /* ™¢ÿ.ÿzOÐŒdôYA..< */
- $"1C6C 85B5 1C8F D078 995D 714E 1C60 3090" /* .l…µ.Ðx™]qN.`0 */
- $"9058 77C4 BB80 5F57 1871 CA72 B2FD 0016" /* XwÄ»€_W.qÊr²ý.. */
- $"BAA7 F84F F4E9 ACDF F766 8CB4 475D 2F0B" /* º§øOôé¬ß÷fŒ´G]/. */
- $"37BC 18C8 6162 79C2 BDD7 8753 204B A536" /* 7¼.Èaby½ׇS K¥6 */
- $"9CBE 4972 316A BCB1 9442 4238 B88F 2F48" /* œ¾Ir1j¼±”BB8¸/H */
- $"7A45 5CD1 A306 3A23 5A78 354F CDB6 C0A5" /* zE\Ñ£.:#Zx5OͶÀ¥ */
- $"2A5C 19DA 0B0C CD84 8D85 D2B8 1DC9 059C" /* *\.Ú..Í„…Ò¸.É.œ */
- $"A8C4 8118 4848 9372 9372 566C 21E5 2665" /* ¨Ä.HH“r“rVl!å&e */
- $"D16C 6601 48A8 35CE 7FFF 7F19 B54E 7F04" /* Ñlf.H¨5Î.ÿ..µN.. */
- $"10EC 1AA3 13FF 4588 9722 A7AA B011 863C" /* .ì.£.ÿEˆ—"§ª°.†< */
- $"E4B1 717B 7C2D 21E6 267B 4B48 E790 FF76" /* ä±q{|-!æ&{KHçÿv */
- $"40CC F425 41CB 289F 809D 8170 A529 2EDA" /* @Ìô%AË(Ÿ€p¥).Ú */
- $"A105 B3AF FB44 7951 B87A 0091 5B53 5979" /* ¡.³¯ûDyQ¸z.‘[SYy */
- $"CDC6 5976 6393 34F2 21FF 7FFF 7FFF 7D43" /* ÍÆYvc“4ò!ÿ.ÿ.ÿ}C */
- $"4F4B C77F 73C7 0454 BE9C BE9C 282E 440E" /* OKÇ.sÇ.T¾œ¾œ(.D. */
- $"0608 A380 6121 2103 DBD2 250B 5D57 9159" /* ..£€a!!.ÛÒ%.]W‘Y */
- $"B69A 28CF E66A 154F F84F F4E9 99ED 48C4" /* ¶š(Ïæj.OøOôé™íHÄ */
- $"CA7E BE76 FC67 A7CD DC26 1C00 0184 8463" /* Ê~¾vüg§ÍÜ&...„„c */
- $"69A8 C0A9 127C 5830 CC3A 380A C742 E4DE" /* i¨À©.|X0Ì:8ÂÇBäÞ */
- $"06F5 7999 556D FD9F 268B 895F FF4B 7BB9" /* .õy™UmýŸ&‹‰_ÿK{¹ */
- $"C201 52B7 B483 0906 65EC 1848 4750 6F27" /* Â.R·´ƒÆ.eì.HGPo' */
- $"C86C 1F27 9108 6253 0416 4CD3 30E4 7F77" /* Èl.'‘.bS..LÓ0ä.w */
- $"0705 8420 83B6 BCB6 29DE B71E 8DC5 851A" /* ..„ ƒ¶¼¶)Þ·.Å…. */
- $"ABB0 83D8 F2E2 5113 55D2 AAF6 B3AB 7679" /* «°ƒØòâQ.UÒªö³«vy */
- $"49FE A1F8 6F30 0EC0 7D91 534C C78C DC5D" /* Iþ¡øo0.À}‘SLÇŒÜ] */
- $"5A42 CA06 37D8 E0ED 27FA 3E31 C849 D2BE" /* ZBÊ.7Øàí'ú>1ÈIÒ¾ */
- $"847C 0CCF 676F ACFE 91A3 0F62 B711 1897" /* „|.Ïgo¬þ‘£.b·..— */
- $"9DC3 8E37 3AF8 907E 0B69 1577 2856 AA36" /* ÃŽ7:ø~.i.w(Vª6 */
- $"FAC0 D56C 6686 0443 CA96 FDCD 051B 23A7" /* úÀÕlf†.CÊ–ýÍ..#§ */
- $"7DAC 8229 C5FC F840 103A 6407 49F7 6B32" /* }¬‚)Åüø@.:d.I÷k2 */
- $"254F 2B32 7FC1 F460 D5C0 5EE1 3046 612A" /* %O+2.Áô`ÕÀ^á0Fa* */
- $"1BC1 C143 7B76 B9EF ECCB 5EE9 8F0C 3F71" /* .ÁÁC{v¹ïìË^é.?q */
- $"E805 8B9B 17B7 9ECE C237 AF5C 0062 E61E" /* è.‹›.·žÎÂ7¯\.bæ. */
- $"DF6C C1F7 904E 4379 2A9C 92FC 1B04 00A8" /* ßlÁ÷NCy*œ’ü...¨ */
- $"F9D5 DB1B C4C6 9485 ABC2 1199 CCF2 0A47" /* ùÕÛ.ÄÆ”…«Â.™ÌòÂG */
- $"9693 C097 7AD0 449A FC53 DEC5 6EE8 6BF7" /* –“À—zÐDšüSÞÅnèk÷ */
- $"0D7D 4ED8 3426 DA7E ECF9 57ED 9252 9A6A" /* .}NØ4&Ú~ìùWí’Ršj */
- $"2B94 2614 1B6E A495 8261 4D5E DAEF 03FA" /* +”&..n¤•‚aM^Úï.ú */
- $"8A63 9496 E8AB A1A6 5B5C B03E E73E 2889" /* Šc”–è«¡¦[\°>ç>(‰ */
- $"D257 6C28 080A 68DC 226C 950F F55B E7CC" /* ÒWl(.ÂhÜ"l•.õ[çÌ */
- $"95AD FDA7 43EA 7489 A545 C0FC E9B0 2A25" /* •­ý§Cêt‰¥EÀüé°*% */
- $"719C EE06 9E5A 8FC0 D3B0 0C81 1EB0 C8C6" /* qœî.žZÀÓ°..°ÈÆ */
- $"25BD B383 33BD B80D D9A9 48F3 7539 D7D5" /* %½³ƒ3½¸.Ù©Hóu9×Õ */
- $"8021 5EBA 94A7 83A3 69FE 8179 9106 BC56" /* €!^º”§ƒ£iþy‘.¼V */
- $"14A4 427B 8C09 BACB 2FC9 B8F3 CAFA E51C" /* .¤B{ŒÆºË/ɸóÊúå. */
- $"9C07 9A69 033C 6159 163E 6ED8 259D 7AAB" /* œ.ši.<aY.>nØ%z« */
- $"D316 475C F6C7 BD0E 7972 4C59 DF3A D5B4" /* Ó.G\öǽ.yrLYß:Õ´ */
- $"44ED 7D01 B0FB 34D4 4C9C BC2D B8A6 5B65" /* Dí}.°û4ÔLœ¼-¸¦[e */
- $"134F 0C96 5CA1 21CC A249 F17D 4660 9835" /* .O.–\¡!Ì¢Iñ}F`˜5 */
- $"957C 7392 53A9 DE42 E650 604B 10E2 FF12" /* •|s’S©ÞBæP`K.âÿ. */
- $"B47A 044A 524A B8D3 60B5 A258 CEAB 55E8" /* ´z.JRJ¸Ó`µ¢XΫUè */
- $"5219 EC3E A9F6 0813 A2B4 930C EDE4 3BBE" /* R.ì>©ö..¢´“.íä;¾ */
- $"C0E3 7F93 1A3F 38EB 2DE3 492D A3BD FD00" /* Àã.“.?8ë-ãI-£½ý. */
- $"811C 530E 2FB8 9D68 2466 D288 EC29 9094" /* .S./¸h$fÒˆì)” */
- $"A3C7 2D32 0A25 BA73 2023 08CA C360 2C72" /* £Ç-2Â%ºs #.ÊÃ`,r */
- $"8BA9 516A 7081 F2FF 1E84 E1C2 F841 77CE" /* ‹©Qjpòÿ.„áÂøAwÎ */
- $"ABDF 6476 30A4 3018 F7F4 F3EE 1A5E 5DF0" /* «ßdv0¤0.÷ôóî.^]ð */
- $"CAAA AA77 C90D 52C4 6AA9 5755 33B9 1814" /* ʪªwÉ.RÄj©WU3¹.. */
- $"3528 E205 C379 648A E627 A23E D5DB 1CAE" /* 5(â.ÃydŠæ'¢>ÕÛ.® */
- $"4868 B7D4 F381 2534 1F48 2BCC 5211 3B0F" /* Hh·Ôó%4.H+ÌR.;. */
- $"9692 B002 4CFB 1F83 3628 D1EB 5416 0648" /* –’°.Lû.ƒ6(ÑëT..H */
- $"F0F0 B0F8 C7C7 6E92 8C54 6859 791B 7890" /* ðð°øÇÇn’ŒThYy.x */
- $"EBA3 BC74 5F3F C4AD 7C9D 6954 2D0C 15BF" /* 룼t_?Ä­|iT-..¿ */
- $"F699 82A6 4170 D2F1 02A5 7EF3 6061 C9CF" /* ö™‚¦ApÒñ.¥~ó`aÉÏ */
- $"C370 E129 F805 8CC8 C670 CBDC 2D44 D349" /* Ãpá)ø.ŒÈÆpËÜ-DÓI */
- $"F3E5 C5F9 357E 3DF2 CDF3 DC8A 1F13 5B2D" /* óåÅù5~=òÍóÜŠ..[- */
- $"C544 448D 1038 8293 4EEA 75A4 0738 7D9F" /* ÅDD.8‚“Nêu¤.8}Ÿ */
- $"C002 3D68 26D8 7B06 FB10 CCDF C4F3 5364" /* À.=h&Ø{.û.ÌßÄóSd */
- $"2342 154B F8FB 01ED 8893 9160 A3A0 B81D" /* #B.Køû.툓‘`£ ¸. */
- $"47A0 6C82 1CBA FAED 931D E025 BDFF 1535" /* G l‚.ºúí“.à%½ÿ.5 */
- $"CADF 68C5 41FD 3896 1AC9 F979 A885 F5AE" /* ÊßhÅAý8–.Éùy¨…õ® */
- $"EFBE C674 ED92 5FE9 E9AF FF52 D573 A6DD" /* ï¾Ætí’_éé¯ÿRÕs¦Ý */
- $"631B 27E4 62CB B76E 7020 EC65 75E2 DB6F" /* c.'äbË·np ìeuâÛo */
- $"0E10 980A 0EA3 2287 4CF8 D402 52B8 1491" /* ..˜Â.£"‡LøÔ.R¸.‘ */
- $"21C9 BC2B 48BC CBD4 464A C539 6CD5 28F1" /* !ɼ+H¼ËÔFJÅ9lÕ(ñ */
- $"CAE4 CA43 9CB8 B181 BF06 522B 4D19 8295" /* ÊäÊCœ¸±¿.R+M.‚• */
- $"05C8 D7CD 8CFA D3E7 7BC9 630C DCDD 7C7E" /* .È×ÍŒúÓç{Éc.ÜÝ|~ */
- $"E4C6 D7DC 5E38 67CC 5934 9E8D 9552 B837" /* äÆ×Ü^8gÌY4ž•R¸7 */
- $"53AE 6D39 FAB1 2EB6 886C 1855 26ED AD08" /* S®m9ú±.¶ˆl.U&í­. */
- $"1EBE 9570 EA2F DFFF 06F4 ABF3 4534 2831" /* .¾•pê/ßÿ.ô«óE4(1 */
- $"1AE2 0A99 2956 2A90 C2A4 58AC E49E F047" /* .â™)V*¤X¬äžðG */
- $"A9BA C394 E8F4 6427 7966 A79C 4269 9ADD" /* ©ºÃ”èôd'yf§œBišÝ */
- $"AD1D 1A7E 375C D3FB 8C25 0B6B 0460 5EB9" /* ­..~7\ÓûŒ%.k.`^¹ */
- $"416C AE82 DFC3 09DA 1F69 8796 6897 8CD0" /* Al®‚ßÃÆÚ.i‡–h—ŒÐ */
- $"3E1B FF7D 9AE9 7F6D 4E84 967C 674F CA41" /* >.ÿ}šé.mN„–|gOÊA */
- $"44C1 0575 93A9 2599 66D0 AB7B 6260 D32C" /* DÁ.u“©%™fЫ{b`Ó, */
- $"94AF 7FC8 82FD F692 92FE B6ED A660 750F" /* ”¯.È‚ýö’’þ¶í¦`u. */
- $"80A2 A8AA E6F6 7B9F E894 ED71 D223 6F4B" /* €¢¨ªæö{Ÿè”íqÒ#oK */
- $"A203 F64C 7560 DBB1 6F9E EE9F 2945 C994" /* ¢.öLu`Û±ožîŸ)EÉ” */
- $"BA00 D3D1 6414 A300 4296 670B 2350 CDD1" /* º.ÓÑd.£.B–g.#PÍÑ */
- $"DF61 29E8 EC17 87B6 BC62 B6BD 5F31 13B2" /* ßa)èì.‡¶¼b¶½_1.² */
- $"48A2 F723 53C7 6955 969B ED83 6A9B 1B06" /* H¢÷#SÇiU–›íƒj›.. */
- $"C7D0 2584 430B 8C52 D00A 736B D6FB AEDB" /* ÇÐ%„C.ŒRÐÂskÖû®Û */
- $"2BA1 5095 759B 0AFF 5138 58EF 3DC2 B14D" /* +¡P•u›ÂÿQ8Xï=±M */
- $"3B7D 62D0 DE12 CFEF 17A3 32C4 C79A C2DA" /* ;}bÐÞ.Ïï.£2ÄÇšÂÚ */
- $"6BA1 6478 B1D3 2278 3787 6C30 08FD 6095" /* k¡dx±Ó"x7‡l0.ý`• */
- $"FF65 1DF4 7606 34C3 B4EE E609 A3BF 7085" /* ÿe.ôv.4ôîæÆ£¿p… */
- $"8B3B 2C80 D860 6043 10A4 24B1 2D80 880D" /* ‹;,€Ø``C.¤$±-€ˆ. */
- $"671A 9A76 E1D4 2304 B4E0 9E47 129D 6316" /* g.šváÔ#.´àžG.c. */
- $"33DF C88C 3BB6 5232 475C D19D FA9B 3303" /* 3ßÈŒ;¶R2G\Ñú›3. */
- $"2956 D8B1 08A5 2735 CD4D F130 C700 DA0D" /* )Vر.¥'5ÍMñ0Ç.Ú. */
- $"7BAE 21FA FB1B 35A5 957E 0211 955B 25D0" /* {®!úû.5¥•~..•[%Ð */
- $"A3DD B72F 5BCD 8792 418E BCB6 C727 DD0F" /* £Ý·/[͇’AŽ¼¶Ç'Ý. */
- $"2D42 F031 2A73 C1F9 7964 B937 1E77 A757" /* -Bð1*sÁùyd¹7.w§W */
- $"D158 CB02 80D3 C310 E1C5 709C 5C69 7F04" /* ÑXË.€ÓÃ.áÅpœ\i.. */
- $"4476 F017 3FF2 B891 0160 D681 AEBC F8C9" /* Dvð.?ò¸‘.`Ö®¼øÉ */
- $"8F46 7922 4414 5CEE 0CA8 417B 33BB 5926" /* Fy"D.\î.¨A{3»Y& */
- $"B7A6 7094 6363 C5F2 9AD7 1751 2456 3B83" /* ·¦p”ccÅòš×.Q$V;ƒ */
- $"9BB0 0ECD 1420 6141 A097 DBF4 802A 2377" /* ›°.Í. aA —Ûô€*#w */
- $"CDAC EFE9 4A16 4B3C 5058 A5DC 1C40 169E" /* ͬïéJ.K<PX¥Ü.@.ž */
- $"3999 F0C2 C418 2E8F 0951 664A 7082 F49F" /* 9™ðÂÄ..ÆQfJp‚ôŸ */
- $"E576 B2B1 5918 E3EE 9B97 1686 6499 A572" /* åv²±Y.ãî›—.†d™¥r */
- $"B1F6 2F39 A798 6292 DE22 007B 60AD 1D94" /* ±ö/9§˜b’Þ".{`­.” */
- $"31BA 068D F15A 06DB 2654 6B52 F692 3C3A" /* 1º.ñZ.Û&TkRö’<: */
- $"0DA8 A74B 30F6 3852 76F0 A897 9086 FBD5" /* .¨§K0ö8Rv𨗆ûÕ */
- $"1C78 047E 7BF2 08EE 7B45 85C5 6ED5 AA43" /* .x.~{ò.î{E…ÅnÕªC */
- $"F423 8A4E 4111 C68E 172E DD87 AF9E BF19" /* ô#ŠNA.ÆŽ..݇¯ž¿. */
- $"D4D2 020C 6FD5 EE3F F0E8 289E 4E6C 0871" /* ÔÒ..oÕî?ðè(žNl.q */
- $"1187 D3F1 E458 94F5 4519 BF3C D239 D86C" /* .‡ÓñäX”õE.¿<Ò9Øl */
- $"17F1 8916 4206 2346 ACD8 1F08 9A44 0AB3" /* .ñ‰.B.#F¬Ø..šD³ */
- $"CEE6 441D 78D5 2909 4CEA 46F7 D6C6 D21A" /* ÎæD.xÕ)ÆLêF÷ÖÆÒ. */
- $"6D41 BB64 ADFF 6252 5A80 3556 C459 2845" /* mA»d­ÿbRZ€5VÄY(E */
- $"C05D C2C5 1F69 4087 0380 C0FF 61AA D5D1" /* À]ÂÅ.i@‡.€ÀÿaªÕÑ */
- $"E5C2 5FC0 CEF4 2D59 B4A3 6BA8 343E 184B" /* åÂ_ÀÎô-Y´£k¨4>.K */
- $"89CE 81FD AC96 C691 FDE5 F993 B9CB 6302" /* ‰Îý¬–Æ‘ýåù“¹Ëc. */
- $"B8EE 86B4 A2F7 19EA DAFD D511 B59F BBD2" /* ¸î†´¢÷.êÚýÕ.µŸ»Ò */
- $"5D4E F6A3 BC58 51D5 273F 2E2E 2B6A 2755" /* ]Nö£¼XQÕ'?..+j'U */
- $"38A3 CA29 BFAB D31D CD53 B29C 7418 40DB" /* 8£Ê)¿«Ó.ÍS²œt.@Û */
- $"FD56 1BF6 9350 5411 CF5C 8D26 B1FA 754F" /* ýV.ö“PT.Ï\&±úuO */
- $"E584 8277 6221 6866 257C 9FC9 65A5 6D93" /* å„‚wb!hf%|ŸÉe¥m“ */
- $"C524 B971 3F1D 34A0 BBF4 6B83 9722 CFAD" /* Å$¹q?.4 »ôkƒ—"Ï­ */
- $"8296 103F 53BB 1B22 8A84 2FAC 94DE 4994" /* ‚–.?S»."Š„/¬”ÞI” */
- $"2D31 56A5 DBCD B661 81D7 B360 4958 8FF5" /* -1V¥ÛͶa׳`IXõ */
- $"EB02 25A9 6386 8241 D936 A3CB AA88 9936" /* ë.%©c†‚AÙ6£Ëªˆ™6 */
- $"1698 4F59 765B 34EA 3741 D2D3 2DAC 854D" /* .˜OYv[4ê7AÒÓ-¬…M */
- $"366B C9A0 15F8 D2E6 7CCF 99EF A794 460C" /* 6kÉ .øÒæ|ϙ倫F. */
- $"934E C88B 2BF5 91F7 7BD1 3DC9 6ED3 91FE" /* “NÈ‹+õ‘÷{Ñ=ÉnÓ‘þ */
- $"E63B EDCC 3D4A CC1B AE5D 88D0 B241 20D1" /* æ;íÌ=JÌ.®]ˆÐ²A Ñ */
- $"AB6C 9FE2 E494 395E 8E3C 0EB0 1796 58CC" /* «lŸâä”9^Ž<.°.–XÌ */
- $"9791 D931 DB33 473E 003E 10CD B736 7295" /* —‘Ù1Û3G>.>.Í·6r• */
- $"DD81 B481 9A0A ED27 3C1E 6298 FD0D BDE0" /* Ý´šÂí'<.b˜ý.½à */
- $"11D6 8A21 79C1 DBB7 FEDC 6E48 8080 5ADB" /* .ÖŠ!yÁÛ·þÜnH€€ZÛ */
- $"E61D 9E0E E6A3 6D38 A028 4016 464D F534" /* æ.ž.æ£m8 (@.FMõ4 */
- $"D764 3AD7 55DF 3CAB 7B3D 12F5 9A8D DDCF" /* ×d:×Uß<«{=.õšÝÏ */
- $"6CCD 0387 C982 0FE9 D431 0FE3 E064 1700" /* lÍ.‡É‚.éÔ1.ãàd.. */
- $"1AAD F49E D6DE A939 8010 C91B 605B 4E0A" /* .­ôžÖÞ©9€.É.`[NÂ */
- $"FCBE ADE9 C17A EC1F 3990 9EB2 E6BF 92AA" /* ü¾­éÁzì.9ž²æ¿’ª */
- $"951C D27F A984 10A9 22DC 996E FF6E 12AE" /* •.Ò.©„.©"Ü™nÿn.® */
- $"DC03 5AB3 2CA0 8291 4174 C69E AE28 DBA8" /* Ü.Z³, ‚‘AtÆž®(Û¨ */
- $"38A8 FF12 67D3 F8A3 00D6 2A2E A564 CEFA" /* 8¨ÿ.gÓø£.Ö*.¥dÎú */
- $"0F00 4B44 62A7 CA9F F072 2821 DD3C 6A34" /* ..KDb§ÊŸðr(!Ý<j4 */
- $"926C 8F3C 1548 D31A 021F 2604 252D A929" /* ’l<.HÓ...&.%-©) */
- $"172B 8212 174F 2D2D CC7D DA15 F9A9 AD7E" /* .+‚..O--Ì}Ú.ù©­~ */
- $"59D3 7885 9215 C77B 6583 4D8F 3308 149C" /* YÓx…’.Ç{eƒM3..œ */
- $"270A 4508 21C9 A05B CDE9 BEF1 C18A 4B74" /* 'ÂE.!É [Íé¾ñÁŠKt */
- $"F07B 0DFE 007B E5AF D9AA CED7 8661 34C7" /* ð{.þ.{å¯ÙªÎ׆a4Ç */
- $"AA26 21AC D09C 6BAA EABB A7C4 486E 40A5" /* ª&!¬Ðœkªê»§ÄHn@¥ */
- $"C791 976A 1EC3 534F 84EC E6E9 7363 FF08" /* Ç‘—j.ÃSO„ìæéscÿ. */
- $"5B20 0E29 000C 5E8F 3339 6210 65CC FD34" /* [ .)..^39b.eÌý4 */
- $"76EB F1B2 76C6 5FDC C1A8 B0F5 53EE 103C" /* vëñ²vÆ_ÜÁ¨°õSî.< */
- $"50B0 650F 8459 9777 E890 E28A BB84 56B9" /* P°e.„Y—wè⊻„V¹ */
- $"0522 90F9 5B81 C982 979E E507 A4BC 26C3" /* ."ù[É‚—žå.¤¼&à */
- $"E356 F2A9 C0D1 BFF3 F882 EC0E 6AA9 CA0D" /* ãVò©ÀÑ¿óø‚ì.j©Ê. */
- $"4419 16FB 9BEF 947E F848 19BF 5CB6 EA4E" /* D..û›ï”~øH.¿\¶êN */
- $"C290 F254 020B 51DB 8094 4D05 E9A5 21A0" /* ÂòT..QÛ€”M.é¥!  */
- $"D3E6 84EA 5A3E 4380 650C B24F 31DA 209F" /* Óæ„êZ>C€e.²O1Ú Ÿ */
- $"F51A 9108 7912 32B0 52A6 A901 CADB A758" /* õ.‘.y.2°R¦©.ÊÛ§X */
- $"C00A D516 E462 35B4 C071 131A 0F01 9A95" /* ÀÂÕ.äb5´Àq....š• */
- $"9739 F131 0E5F 7FBA D8AD 925F 992C 0187" /* —9ñ1._.ºØ­’_™,.‡ */
- $"D97C 832B 847E 1148 0402 0449 FB25 D0F1" /* Ù|ƒ+„~.H...Iû%Ðñ */
- $"C1F8 2B8E CE97 D5A4 BEFE 7F0D E420 E43E" /* Áø+ŽÎ—Õ¤¾þ..ä ä> */
- $"801A 448D 9D61 D23C 5956 3DEB A1A6 0858" /* €.DaÒ<YV=롦.X */
- $"CD98 F32B 92E6 D960 C0E1 E542 294D 6FD3" /* ͘ó+’æÙ`ÀáåB)MoÓ */
- $"4234 37C9 3537 275F AC1E 936D 534A BF02" /* B47É57'_¬.“mSJ¿. */
- $"B742 8CAB BE88 E4FF 23DC D9EB 1FC4 9CF0" /* ·BŒ«¾ˆäÿ#ÜÙë.Äœð */
- $"C5D1 3F1D 5995 AD68 12E9 71B3 2100 AFB7" /* ÅÑ?.Y•­h.éq³!.¯· */
- $"CBF7 9ADB D5FF 48EE B1A2 AE4D E021 7C07" /* Ë÷šÛÕÿHî±¢®Mà!|. */
- $"5AD5 E94C A965 DFE8 B32A 23AB DE05 4FB1" /* ZÕéL©eßè³*#«Þ.O± */
- $"FDB7 ECC5 3611 73D9 B03C 399A D5F6 663D" /* ý·ìÅ6.sÙ°<9šÕöf= */
- $"0E78 0BEE 67D9 2F9D 0072 E938 509C 9779" /* .x.îgÙ/.ré8Pœ—y */
- $"6C64 03A1 B8C9 C1C0 2256 29EA 112C FB1C" /* ld.¡¸ÉÁÀ"V)ê.,û. */
- $"766C DF51 83B1 388F 902E EE03 337E 689A" /* vlßQƒ±8.î.3~hš */
- $"CA5A A9F0 09AF 3422 4115 D489 3FBD 22C1" /* ÊZ©ðƯ4"A.Ô‰?½"Á */
- $"4A4F 642A 0AC8 D01C 2950 18CA D441 780A" /* JOd*ÂÈÐ.)P.ÊÔAx */
- $"C929 A7FF 0AFA 956A A581 B590 9B7A 7D74" /* É)§ÿÂú•j¥µ›z}t */
- $"2084 3DC1 5D81 B12B DF9C 333D EFAD 0ADD" /* „=Á]±+ßœ3=ï­ÂÝ */
- $"3445 4F8C 132E F02F C2E7 E13F BE12 2F84" /* 4EOŒ..ð/Âçá?¾./„ */
- $"7FC3 D55F 876A BE1D 07F2 688D 774C FC3E" /* .ÃÕ_‡j¾..òhwLü> */
- $"A177 C3EA 4FE4 AFFE 1BFF 61D3 2F87 4BFC" /* ¡wÃêOä¯þ.ÿaÓ/‡Kü */
- $"946E 03F8 6CFF 06A3 FC28 FE13 BF0F 6B7E" /* ”n.ølÿ.£ü(þ.¿.k~ */
- $"1EB8 FC3B 47E1 ECEE EEDF F87D 51FF 07D5" /* .¸ü;Gáìîîßø}Qÿ.Õ */
- $"0BBB 87E1 D3FF 0779 FC3B 6FE1 D378 0DF0" /* .»‡áÓÿ.yü;oáÓx.ð */
- $"BD7C 29EB A2DD 17F2 6ADB E1DB 7F0D 97E1" /* ½|)ë¢Ý.òjÛáÛ..—á */
- $"E84D 7750 FC3E 906F C3E8 35DD 42ED AFE1" /* èMwPü>oÃè5ÝBí¯á */
- $"D33F 0E8D F86E 00F7 91DD 3D8B A94D D83C" /* Ó?.øn.÷‘Ý=‹©MØ< */
- $"B51B 129C 103F 899D B929 4724 C188 2C29" /* µ..œ.?‰¹)G$Áˆ,) */
- $"CE89 11F8 9065 1C37 E234 DFEF 60D7 3221" /* Ή.øe.7â4ßï`×2! */
- $"5343 F889 DCDB AFB3 6F20 F76A 31D9 986E" /* SCø‰ÜÛ¯³o ÷j1Ù˜n */
- $"A745 547E 6F18 076D A675 BA1A 1AAF 6558" /* §ET~o..m¦uº..¯eX */
- $"338A FF71 4707 0776 1B62 BCCC 89E5 4726" /* 3ŠÿqG..v.b¼Ì‰åG& */
- $"A7CB 8885 E07C DADC D741 3B1D D81F AB03" /* §Ëˆ…à|ÚÜ×A;.Ø.«. */
- $"2F84 F52D DFD5 7384 4649 7BA2 5AB1 14C8" /* /„õ-ßÕs„FI{¢Z±.È */
- $"3D8D B951 8183 C33A B08E 82CC EF1A F046" /* =¹QƒÃ:°Ž‚Ìï.ðF */
- $"5B62 C9E0 A926 F330 0A61 A30C 6194 7E1E" /* [bÉà©&ó0Âa£.a”~. */
- $"1EE9 3D0D 1ABE 5536 A026 8B32 830F C02F" /* .é=..¾U6 &‹2ƒ.À/ */
- $"3041 04B7 2C65 024D AC81 D2CC 03CA A08A" /* 0A.·,e.M¬ÒÌ.Ê Š */
- $"B105 F3F1 C365 6BCE 9876 A867 7DBA 63AF" /* ±.óñÃekΘv¨g}ºc¯ */
- $"0973 495F DCC1 3552 54BA 5BDB 618D C6C0" /* ÆsI_ÜÁ5RTº[ÛaÆÀ */
- $"91B8 4489 141B A7D3 F188 8A97 DAB0 8942" /* ‘¸D‰..§ÓñˆŠ—Ú°‰B */
- $"EA67 F235 E18A 871B 4B0C DAC6 9050 BA9C" /* êgò5ኇ.K.ÚÆPºœ */
- $"C432 95CE 13CA 93ED 4FD5 9495 377D C920" /* Ä2•Î.Ê“íOÕ”•7}É */
- $"C8A2 F997 5348 8890 91D5 0A23 50BF 3C37" /* È¢ù—SHˆ‘ÕÂ#P¿<7 */
- $"8372 7C96 32AA 1CD2 46BE 8220 C983 2A71" /* ƒr|–2ª.ÒF¾‚ Ƀ*q */
- $"7961 BF33 9590 C086 CCE9 578B 322E FB50" /* ya¿3•À†ÌéW‹2.ûP */
- $"CB68 6459 C127 EB9B E974 EF02 59F4 FF4D" /* ËhdYÁ'ë›étï.YôÿM */
- $"4525 1874 6A9F 99EB DFCC C1B1 72EA 9FA0" /* E%.tjŸ™ëßÌÁ±r꟠ */
- $"DE00 BBB9 D95F 36B9 406E 3CE0 3BCF 32B6" /* Þ.»¹Ù_6¹@n<à;Ï2¶ */
- $"8DC0 55D6 C6DA 3622 8A6E 63F6 28AE 08AC" /* ÀUÖÆÚ6"Šncö(®.¬ */
- $"03AC 288D 069A 750E CBBD 97D9 E42D BA93" /* .¬(.šu.˽—Ùä-º“ */
- $"E82A 4EB3 C008 CC7C B6A7 6F70 F1BC FDAA" /* è*N³À.Ì|¶§opñ¼ýª */
- $"1DF4 D2E4 3ECB 9702 444E 278F 6B50 F00E" /* .ôÒä>Ë—.DN'kPð. */
- $"C228 C132 E5E0 B4DE 93BF DBBD 2C85 ABF9" /* Â(Á2åà´Þ“¿Û½,…«ù */
- $"7FAD EC28 1D40 D390 5A2F 9B14 D348 8C76" /* .­ì(.@ÓZ/›.ÓHŒv */
- $"C04B 1173 BF19 8F50 7E3D 8311 BB79 FDA8" /* ÀK.s¿.P~=ƒ.»yý¨ */
- $"1FD4 24A9 5F59 8B76 709E 5C84 1902 8690" /* .Ô$©_Y‹vpž\„..† */
- $"AD49 334F 5AE8 E376 288C BDE7 EE13 FBDE" /* ­I3OZèãv(Œ½çî.ûÞ */
- $"7606 0135 6DB2 DCD9 F5B3 E7E2 B2B8 8BE1" /* v..5m²ÜÙõ³çⲸ‹á */
- $"1985 85D2 0EC1 5CCD BC74 D88B 7206 5075" /* .……Ò.Á\ͼtØ‹r.Pu */
- $"FB92 BF92 C5CB B6E3 024D EB71 D909 AF79" /* û’¿’Å˶ã.MëqÙƯy */
- $"DD82 BBF2 37F1 1193 74D0 373D 4043 C292" /* Ý‚»ò7ñ.“tÐ7=@CÂ’ */
- $"0B1D 4E8F 04F4 A035 451A 7DCB 02DB D77E" /* ..N.ô 5E.}Ë.Û×~ */
- $"DD1C 3667 1BA7 2584 C128 3835 4454 5C15" /* Ý.6g.§%„Á(85DT\. */
- $"5846 C7D1 4689 3D2A 1172 9BA8 9830 F037" /* XFÇÑF‰=*.r›¨˜0ð7 */
- $"0053 8FD6 4023 68C6 7122 CAC6 0325 5AF3" /* .SÖ@#hÆq"ÊÆ.%Zó */
- $"E104 A423 C5AE F551 6DF6 7B11 D5EB FD34" /* á.¤#Å®õQmö{.Õëý4 */
- $"DF67 C50C 737D 74D5 D5EC 7027 A2D8 C79A" /* ßgÅ.s}tÕÕìp'¢ØÇš */
- $"200D A972 A30A 509A C3DE 483F 8B53 D69C" /* .©r£ÂPšÃÞH?‹SÖœ */
- $"001F 47E9 BD2C 84EC DB83 B493 0326 DE6E" /* ..Gé½,„ìÛƒ´“.&Þn */
- $"336A 7C76 3225 8351 7B2D 37B5 D645 9866" /* 3j|v2%ƒQ{-7µÖE˜f */
- $"019E 6472 40C4 5853 3376 9D90 D3EA A727" /* .ždr@ÄXS3vÓê§' */
- $"07A1 A4B8 A32F 475A 22A2 059C AB5B F13E" /* .¡¤¸£/GZ"¢.œ«[ñ> */
- $"E2DF 5B3E E6B5 B27F 28AF A15F 400C 7D9F" /* âß[>æµ².(¯¡_@.}Ÿ */
- $"43ED 33D4 9B4D CB64 E550 5FED FC2F E485" /* Cí3Ô›MËdåP_íü/ä… */
- $"271E 2DB1 6AE5 6793 EFE8 FCC5 A784 4C95" /* '.-±jåg“ïèüŧ„L• */
- $"E488 B5AC A528 BACB 10FF 4ABD D554 E56B" /* 䈵¬¥(ºË.ÿJ½ÕTåk */
- $"F72E 8ED7 5E48 60A4 82D0 381F A2D4 625C" /* ÷.Ž×^H`¤‚Ð8.¢Ôb\ */
- $"9F80 2A63 5FD3 DD0C EDA8 3DE3 281E A65C" /* Ÿ€*c_ÓÝ.í¨=ã(.¦\ */
- $"88EA 1A96 626D DC03 79BE C4ED EA60 4FC5" /* ˆê.–bmÜ.y¾Äíê`OÅ */
- $"BB10 D9D5 99AF 0534 65C2 05AE 8D23 82B0" /* ».ÙÕ™¯.4eÂ.®#‚° */
- $"6FB7 881A 7BC5 0316 7A28 4B27 2763 A6C3" /* o·ˆ.{Å..z(K''c¦Ã */
- $"8FC7 073A 1391 81BB 707F 625D 355F B1DF" /* Ç.:.‘»p.b]5_±ß */
- $"A749 C3EE A157 EC1F 0F6C 70AB 1A36 5711" /* §IÃî¡Wì..lp«.6W. */
- $"C49B 1CA8 54A0 0FB9 6A2E 0F86 2E57 BC2F" /* Ä›.¨T .¹j..†.W¼/ */
- $"8CDD B76A F6DB 83F9 EEFF 4BF1 DE60 660E" /* ŒÝ·jöÛƒùîÿKñÞ`f. */
- $"BCBA 7D68 D5DE 8663 DF06 3F65 A981 38D7" /* ¼º}hÕÞ†cß.?e©8× */
- $"CC20 EBAE 6143 C79E D2F3 DCF4 FA0F 433E" /* Ì ë®aCÇžÒóÜôú.C> */
- $"6DFE 4C5F 032A F6DD DD11 F85F 5003 22CD" /* mþL_.*öÝÝ.ø_P."Í */
- $"C07E F1CC 40B9 8D61 825D 77C7 91A6 BD49" /* À~ñÌ@¹a‚]wÇ‘¦½I */
- $"2590 4BCD EB13 37A2 D5FA 2931 F311 9028" /* %KÍë.7¢Õú)1ó.( */
- $"6C02 96FC ACF5 1EA4 8E51 4BC9 FDE8 DFEF" /* l.–ü¬õ.¤ŽQKÉýèßï */
- $"C5A0 8082 7E0D C127 3A80 A65B 7989 CCEE" /* Å €‚~.Á':€¦[y‰Ìî */
- $"6F6A 8DDF FB5B 46A5 3757 7FC3 3EFD BC0A" /* ojßû[F¥7W.Ã>ý¼Â */
- $"8567 1CB0 3BE7 A153 D7CE 8F63 D2DC 8840" /* …g.°;ç¡S×ÎcÒ܈@ */
- $"D993 E028 0E86 AA99 3ADE CC55 A789 CFC8" /* Ù“à(.†ª™:ÞÌU§‰ÏÈ */
- $"D92B 9613 3850 B7B3 467A FA09 7D45 E174" /* Ù+–.8P·³FzúÆ}Eát */
- $"D351 3254 64A3 7FC5 0D8D 1EDB FEC9 3F05" /* ÓQ2Td£.Å..ÛþÉ?. */
- $"C3C2 264B ACB8 F3C3 1BFF 04A5 12CF C191" /* ÃÂ&K¬¸óÃ.ÿ.¥.ÏÁ‘ */
- $"8CA0 5985 E34C E583 A230 CD43 8602 BAAF" /* Œ Y…ãL僢0ÍC†.º¯ */
- $"1475 FCA7 B274 1314 051F AF06 089D 13B1" /* .uü§²t....¯...± */
- $"5C06 815E FAA5 6864 CECE D56A 127C 058B" /* \.^ú¥hdÎÎÕj.|.‹ */
- $"1859 E9E8 7A98 4299 3CFF 70CE C2DD 8676" /* .Yéèz˜B™<ÿpÎÂ݆v */
- $"1798 5F8E 9960 922E 9226 3F9B 5657 890F" /* .˜_Ž™`’.’&?›VW‰. */
- $"75BC FECF 6919 6701 D086 0EA5 26BA 8B78" /* u¼þÏi.g.І.¥&º‹x */
- $"7381 41FC 19AD 7201 BFD9 B3D3 2F00 1A1C" /* sAü.­r.¿Ù³Ó/... */
- $"E689 F3BC 5FC7 0418 66A2 5AEE 0374 DE30" /* æ‰ó¼_Ç..f¢Zî.tÞ0 */
- $"DC4B 70F1 ACC6 2BC6 06E9 461F E71B CD5E" /* ÜKpñ¬Æ+Æ.éF.ç.Í^ */
- $"2766 D533 884B A37F 7820 5CCA 3D60 1C3A" /* 'fÕ3ˆK£.x \Ê=`.: */
- $"8865 509F C1F0 86B6 9A91 0A52 426E CF1D" /* ˆePŸÁð†¶š‘ÂRBnÏ. */
- $"4B52 7AFE 9519 ECDB 9DD3 BFA1 80F7 50BD" /* KRzþ•.ìÛÓ¿¡€÷P½ */
- $"D2DD 6FAB F00D 3600 9104 37AC 81AA F9C3" /* ÒÝo«ð.6.‘.7¬ªùà */
- $"3933 A702 AC9C 42F1 4579 C5F2 CD99 165F" /* 93§.¬œBñEyÅòÍ™._ */
- $"2D84 FE8B D02C 055F F99C 1729 45C7 6B56" /* -„þ‹Ð,._ùœ.)EÇkV */
- $"EE73 818A 9940 BB46 1408 639B 9779 C805" /* îsŠ™@»F..c›—yÈ. */
- $"1B0B CC86 D42E E9BB 046D 0E93 7273 E00F" /* ..̆Ô.é».m.“rsà. */
- $"B7D5 D377 E0ED 2494 4623 5BDF C83C 54A5" /* ·ÕÓwàí$”F#[ßÈ<T¥ */
- $"6B6B D343 F20E AD4C B45C 2BF4 7C65 87A1" /* kkÓCò.­L´\+ô|e‡¡ */
- $"E2EA E2B7 FF17 F9A1 5606 D5A7 C113 F062" /* âêâ·ÿ.ù¡V.Õ§Á.ðb */
- $"D50E E647 922C 8746 7CBA 99C8 4400 979D" /* Õ.æG’,‡F|º™ÈD.— */
- $"3D09 19E7 3A84 E245 ED1F 1C14 3967 45CE" /* =Æ.ç:„âEí...9gEÎ */
- $"2B06 C383 F2A6 2CEE 02E6 A2A7 1821 0F3F" /* +.Ãò¦,î.梧.!.? */
- $"4057 F9E9 B830 94C7 65AA C396 6F97 2721" /* @Wùé¸0”ÇeªÃ–o—'! */
- $"F1AC 6AF7 6C6C 3F02 D2F1 343D 8B42 0F6F" /* ñ¬j÷ll?.Òñ4=‹B.o */
- $"E2D4 A7D8 7158 F033 C573 AD72 01B7 1CC7" /* âÔ§ØqXð3Ås­r.·.Ç */
- $"4CA6 78C2 BABD BB30 5E03 BDEE DF19 8240" /* L¦xº½»0^.½îß.‚@ */
- $"9521 A43A B142 2F42 3590 AD8C B9FD A409" /* •!¤:±B/B5­Œ¹ý¤Æ */
- $"9D77 38E7 B8F8 3BCD 4478 61C3 5768 0324" /* w8ç¸ø;ÍDxaÃWh.$ */
- $"4E55 4240 1E87 1F93 D0BA 6929 C235 7E76" /* NUB@.‡.“кi)Â5~v */
- $"F6E8 AA1B AF13 15FD EB95 2609 BE7D BFE8" /* öèª.¯..ýë•&ƾ}¿è */
- $"3E51 8F2E 4780 4EE6 891E F83D FF7D D1C3" /* >Q.G€Næ‰.ø=ÿ}Ñà */
- $"818F 28A2 2AC0 AD00 7F03 5781 2882 A44A" /* (¢*À­...W(‚¤J */
- $"6728 D9F6 E77F A883 C794 71AC 55E9 8112" /* g(Ùöç.¨ƒÇ”q¬Ué. */
- $"BF6F ECDA 9BD1 96B8 79AA A397 A6F2 C93F" /* ¿oìڛі¸yª£—¦òÉ? */
- $"3792 B8C4 8667 AAF4 659D 59F6 E77F A870" /* 7’¸Ä†gªôeYöç.¨p */
- $"24F1 5461 DB69 0F4C F8B3 F02A F6E7 7FA6" /* $ñTaÛi.Lø³ð*öç.¦ */
- $"26C9 5EDE 9BB6 A1C6 9467 854A 5327 BA38" /* &É^Þ›¶¡Æ”g…JS'º8 */
- $"F535 A01A B90A 9580 95A0 FE5C A623 DE0D" /* õ5 .¹Â•€• þ\¦#Þ. */
- $"6C3E BF23 66F2 9312 9490 EB88 1D63 7AF4" /* l>¿#fò“.”ëˆ.czô */
- $"9F5B 7F45 9078 3A5F CC36 7702 EAD5 FA4D" /* Ÿ[.Ex:_Ì6w.êÕúM */
- $"5F9D 258B 14A8 A235 6490 6B7D 2B05 42C3" /* _%‹.¨¢5dk}+.Bà */
- $"2A5A 791E 92C3 B1E8 B323 FF74 81FC B063" /* *Zy.’ñè³#ÿtü°c */
- $"4A31 CBBC 91E2 A64A F935 FE79 4C07 1376" /* J1˼‘â¦Jù5þyL..v */
- $"002A 4795 5221 70B2 005C 41F9 D631 126F" /* .*G•R!p².\AùÖ1.o */
- $"FF7F DF03 06BD 7214 71AB 4EF3 8EEA 0261" /* ÿ.ß..½r.q«NóŽê.a */
- $"D054 C087 EA15 CBD2 4645 2F9F 3600 4144" /* ÐTÀ‡ê.ËÒFE/Ÿ6.AD */
- $"5671 C61E D3CB 8B84 A60D B58E FB69 C71F" /* VqÆ.ÓË‹„¦.µŽûiÇ. */
- $"B09A EDD9 AAC0 6FBA D7FE 8C4D 8262 6C73" /* °šíÙªÀoº×þŒM‚bls */
- $"9F69 0E81 7581 1D52 FB27 C979 1597 69EA" /* Ÿi.u.Rû'Éy.—iê */
- $"F1DF E906 0B77 2E21 D31A 5CCD 9474 95A2" /* ñßé..w.!Ó.\Í”t•¢ */
- $"CB48 AB27 5F53 B82F 1638 16A4 87CD ED1F" /* ËH«'_S¸/.8.¤‡Íí. */
- $"20BC 2894 5EE1 C84C 1AC1 1158 0293 024E" /* ¼(”^áÈL.Á.X.“.N */
- $"1023 0E4F 9BD8 FA73 6E62 FF7F FD08 5797" /* .#.O›Øúsnbÿ.ý.W— */
- $"0788 A951 6DDA 2448 21D2 7FCA 20B4 E1BF" /* .ˆ©QmÚ$H!Ò.Ê ´á¿ */
- $"3262 89C7 5386 ACB1 8B89 6AC3 F907 1355" /* 2b‰ÇS†¬±‹‰jÃù..U */
- $"66D9 1E5A 5B54 19E9 2737 FF7C B8DF 1F5E" /* fÙ.Z[T.é'7ÿ|¸ß.^ */
- $"3592 B16D 6089 DE73 8F19 479D 626B 977D" /* 5’±m`‰Þs.Gbk—} */
- $"185E F7A3 AF62 AD92 E5AC 2F74 B991 F96F" /* .^÷£¯b­’å¬/t¹‘ùo */
- $"211F 5AE0 4C27 344F A9E1 C731 DB20 A0FF" /* !.ZàL'4O©áÇ1Û  ÿ */
- $"7FFF 7F2E 356F CC55 C6B8 C2C9 2AEF 2D31" /* .ÿ..5oÌUƸÂÉ*ï-1 */
- $"EFEB D878 C16F B1B1 3D47 240C 489C 7153" /* ïëØxÁo±±=G$.HœqS */
- $"E5F8 A5C8 6E2C 7650 AED0 C4B7 43EA 67B6" /* åø¥Èn,vP®ÐÄ·Cêg¶ */
- $"94E4 7274 CFEB 4CF3 FD3E 8065 B9CC 35A5" /* ”ärtÏëLóý>€e¹Ì5¥ */
- $"21B1 3804 AD98 4F8A 6FFC 50DA 014C 442B" /* !±8.­˜OŠoüPÚ.LD+ */
- $"AA41 1455 BD94 B366 A37D CA82 7FFC DE57" /* ªA.U½”³f£}Ê‚.üÞW */
- $"2EA9 98C2 5510 E51E 24CC 0428 4C83 1BBE" /* .©˜ÂU.å.$Ì.(Lƒ.¾ */
- $"0A46 A6DD 6963 D4CB 24E8 748B ED10 7B6D" /* ÂF¦ÝicÔË$èt‹í.{m */
- $"E61C 86C3 C80E 3030 FCE9 2263 C956 95A1" /* æ.†ÃÈ.00üé"cÉV•¡ */
- $"AED0 C4B1 D07C F701 9DA0 ED2C C401 BC1A" /* ®ÐıÐ|÷. í,Ä.¼. */
- $"9421 2D43 EF12 7494 8D46 CB82 3FE2 6439" /* ”!-Cï.t”FË‚?âd9 */
- $"6BDE C8CE 23B7 9D2E B6F9 DF4B C1A9 A145" /* kÞÈÎ#·.¶ùßKÁ©¡E */
- $"1512 85E6 30E6 98D1 AC22 EEBC 459C D841" /* ..…æ0æ˜Ñ¬"î¼EœØA */
- $"0A0F 1F31 2F75 7937 220F 7271 FE79 44A6" /* Â..1/uy7".rqþyD¦ */
- $"777E 1645 E0BA D980 0FFF 7D9F EC83 A930" /* w~.EàºÙ€.ÿ}Ÿìƒ©0 */
- $"D12B 216D 4D3F 4AD0 5EE9 DBC7 53D7 0A21" /* Ñ+!mM?JÐ^éÛÇS×Â! */
- $"2372 C608 6701 8AFA 8E33 4125 2B7E 38DA" /* #rÆ.g.ŠúŽ3A%+~8Ú */
- $"5990 99EE B1D0 B07C 9F9D 97DD D658 2C2A" /* Y™î±Ð°|Ÿ—ÝÖX,* */
- $"C7D6 4556 2AA7 297F ACBE 4802 B472 E76F" /* ÇÖEV*§).¬¾H.´rço */
- $"644F 2F11 17FF 7F9D CE1C 2989 7199 03B1" /* dO/..ÿ.Î.)‰q™.± */
- $"E719 2B3B 1131 C4CC 808B BC7A 26A4 479F" /* ç.+;.1ÄÌ€‹¼z&¤GŸ */
- $"4824 6486 E338 DB65 A502 454C C415 B8D0" /* H$d†ã8Ûe¥.ELÄ.¸Ð */
- $"7C77 7323 E381 5958 F415 95B9 142E 85F8" /* |ws#ãYXô.•¹..…ø */
- $"1742 E22F FF17 567B A195 DFF1 7EE0 8E40" /* .Bâ/ÿ.V{¡•ßñ~àŽ@ */
- $"431A B629 DDCE AED1 A925 9FCD 56B5 7945" /* C.¶)Ýήѩ%ŸÍVµyE */
- $"B8B9 77DF 732C CD1E 8137 2645 1135 9593" /* ¸¹wßs,Í.7&E.5•“ */
- $"E31C 333B 30E2 518D E202 A1E0 FEA6 C40E" /* ã.3;0âQâ.¡àþ¦Ä. */
- $"BB50 0174 C21D 0BFB 34C1 1A8D 8E5D FF77" /* »P.tÂ..û4Á.Ž]ÿw */
- $"909A 8111 3123 8200 AFC2 0525 13A1 C383" /* š.1#‚.¯Â.%.¡Ãƒ */
- $"5472 BA45 8D58 8818 E5CD 6FEA D858 47C5" /* TrºEXˆ.åÍoêØXGÅ */
- $"F5A0 7773 3C86 1CE8 9A67 FAA7 5726 643B" /* õ ws<†.èšgú§W&d; */
- $"1BF8 C2C1 E7AD D3CE E89B 97C4 0210 1FAE" /* .øÂÁç­ÓÎè›—Ä...® */
- $"9319 1F1F 7F89 0B76 5918 7EF8 9947 CF44" /* “....‰.vY.~ø™GÏD */
- $"6B5C 4B5D 5067 58A7 F35E CF39 7D01 C555" /* k\K]PgX§ó^Ï9}.ÅU */
- $"FCD3 E0F6 C1A4 9C8A 0B34 2D33 A20D F664" /* üÓàöÁ¤œŠ.4-3¢.öd */
- $"C174 CCE8 CAA1 C45F 2974 101B 86E7 68FD" /* ÁtÌèÊ¡Ä_)t..†çhý */
- $"D6FE 8FE9 AC95 5D3D DE38 1829 E3B9 37FE" /* Öþ鬕]=Þ8.)ã¹7þ */
- $"5008 F383 21C4 4D57 AE92 9F94 A9BB 3A76" /* P.óƒ!ÄMW®’Ÿ”©»:v */
- $"705F 8D2D 889C EB93 FD2B 05C5 89F2 500E" /* p_-ˆœë“ý+.ʼnòP. */
- $"4220 A486 F348 D466 4D62 E368 540A 1D25" /* B ¤†óHÔfMbãhTÂ.% */
- $"AF7C A9EF 43CC E423 16FC 6EE5 C407 DDAE" /* ¯|©ïCÌä#.ünåÄ.Ý® */
- $"EB28 23D2 3FDE 40EF 2ED1 D53A B87B 9C40" /* ë(#Ò?Þ@ï.ÑÕ:¸{œ@ */
- $"80A2 77EF CC8F D34E C33F 7BB4 4748 E4A6" /* €¢wïÌÓNÃ?{´GHä¦ */
- $"B177 05FF 085F CBF9 F1A0 8CA7 4200 32AC" /* ±w.ÿ._Ëùñ Œ§B.2¬ */
- $"7B87 A517 EA04 C96C F9A3 C6ED 5FFF 7FED" /* {‡¥.ê.Élù£Æí_ÿ.í */
- $"D5EB F835 3E15 6882 AED1 72BF B42C 87DE" /* Õëø5>.h‚®Ñr¿´,‡Þ */
- $"8111 0F7A 5DA6 CFEA 79A7 9174 89E8 E637" /* ..z]¦Ïêy§‘t‰èæ7 */
- $"7E56 B53E 9987 2013 8F1A 06A5 07A2 1856" /* ~Vµ>™‡ ...¥.¢.V */
- $"FE30 E259 128A 968B 881F E88D 8566 98D7" /* þ0âY.Š–‹ˆ.è…f˜× */
- $"C815 C397 64E8 9FAC 059A 5922 C863 F220" /* È.×d蟬.šY"Ècò */
- $"EC2A 4AF8 5DB2 A77D FC6A 3AC1 357E D5CC" /* ì*Jø]²§}üj:Á5~ÕÌ */
- $"142B 85B0 FEE0 2579 D845 CDFD F507 4C58" /* .+…°þà%yØEÍýõ.LX */
- $"D86A F299 0BBC A0A8 39A4 03D9 2144 6B3E" /* Øjò™.¼ ¨9¤.Ù!Dk> */
- $"6D67 242B 0FEB B6F4 79CB 58ED 2338 DB9F" /* mg$+.ë¶ôyËXí#8ÛŸ */
- $"6EC7 1626 0FDD 0C77 1E00 2AE4 8B46 F39C" /* nÇ.&.Ý.w..*ä‹Fóœ */
- $"6268 EE5F FF49 B5C8 30E7 9859 E163 A9D4" /* bhî_ÿIµÈ0ç˜Yác©Ô */
- $"C50F BC0C 46BB BBC7 9FFF 7D54 E81B 8936" /* Å.¼.F»»ÇŸÿ}Tè.‰6 */
- $"A032 72E8 6576 5FEA 9A3F A5A9 9E58 B9C2" /*  2rèev_êš?¥©žX¹Â */
- $"A089 A039 5695 766F 3295 A1FF 7F5F FBDB" /*  ‰ 9V•vo2•¡ÿ._ûÛ */
- $"A3FD 1F1F 76AD 6787 B4D0 D1A5 E4EA 72F8" /* £ý..v­g‡´ÐÑ¥äêrø */
- $"0276 0C35 EC34 65A8 000A CA35 6AAE 1800" /* .v.5ì4e¨.ÂÊ5j®.. */
- $"99CA 1B65 F56D 6C3B DF33 AB08 94A3 15CF" /* ™Ê.eõml;ß3«.”£.Ï */
- $"C9B8 D32E 35D7 D32D 57E6 86D2 A5BE 2B3A" /* ɸÓ.5×Ó-Wæ†Ò¥¾+: */
- $"4535 2C10 41FE FDA9 E202 3927 BC4F 5F90" /* E5,.Aþý©â.9'¼O_ */
- $"E637 311C DB00 E394 09F3 005B 7DB3 0DFE" /* æ71.Û.ã”Æó.[}³.þ */
- $"9F1F CAA4 DD03 B381 8330 AB38 E13B 2F9C" /* Ÿ.ʤÝ.³ƒ0«8á;/œ */
- $"3DB5 01C5 100A 5D16 5C8D 792C FA0E 1A85" /* =µ.Å.Â].\y,ú..… */
- $"E3FF 467A 6333 E4F1 F27C 9E2B 161E 18F0" /* ãÿFzc3äñò|ž+...ð */
- $"3F30 9C2C 631D BE74 4B7F 6E21 3FBC 404E" /* ?0œ,c.¾tK.n!?¼@N */
- $"E063 4152 D02D 68E4 869C E7E9 E4E6 4E95" /* àcARÐ-h䆜çéäæN• */
- $"3A66 1FDA 1145 DFB4 0796 9F97 503C E2C9" /* :f.Ú.Eß´.–Ÿ—P<âÉ */
- $"7F49 D644 1290 98BD 8EA0 2FA1 CF00 E383" /* .IÖD.˜½Ž /¡Ï.ム*/
- $"C003 7BFE D79B FF62 A38E 2C39 A64D 19FF" /* À.{þ×›ÿb£Ž,9¦M.ÿ */
- $"6A9D 976A 994B 6626 4F4D 7DC8 F0CA EDB7" /* j—j™Kf&OM}ÈðÊí· */
- $"F99E 21E2 36B4 3AAB E787 C6A2 1783 F623" /* ùž!â6´:«ç‡Æ¢.ƒö# */
- $"8755 1F66 AFBC 2959 6E6E 2E61 AC85 2198" /* ‡U.f¯¼)Ynn.a¬…!˜ */
- $"9978 EDFD 334C F0D6 7F76 9AF2 47AF 5E4B" /* ™xíý3LðÖ.všòG¯^K */
- $"805C 54D3 5F2A 16C5 6675 C288 B44F F851" /* €\TÓ_*.Åfuˆ´OøQ */
- $"1CE9 9F21 BF10 92B9 2366 5D69 AE8E 9989" /* .éŸ!¿.’¹#f]i®Ž™‰ */
- $"36A6 F9E6 75A7 0D47 C8B5 8727 0138 2BFA" /* 6¦ùæu§.Gȵ‡'.8+ú */
- $"5C4A 649C 123C 225E 2CEC 2007 5016 3F11" /* \Jdœ.<"^,ì .P.?. */
- $"B8FF 60CB 7150 EBFD DFED 147E 0A98 E096" /* ¸ÿ`ËqPëýßí.~Â˜à– */
- $"6B76 3AF0 39A5 5BF2 880C E857 174C 8735" /* kv:ð9¥[òˆ.èW.L‡5 */
- $"ACF6 E4B7 3477 6293 FF7C 8515 A8DE 4E73" /* ¬öä·4wb“ÿ|….¨ÞNs */
- $"8E37 8A0C 4384 0CF3 FA01 15F5 9639 ED05" /* Ž7Š.C„.óú..õ–9í. */
- $"C86B 28A0 C331 14BC 2817 FE9B F96A D60D" /* Èk( Ã1.¼(.þ›ùjÖ. */
- $"EBCB 14DA FF7F FF47 8A61 A2C7 F01F 10B7" /* ëË.Úÿ.ÿGŠa¢Çð..· */
- $"3DAF B01C B484 F55D 457E E3EC CC41 95DE" /* =¯°.´„õ]E~ãìÌA•Þ */
- $"097E 8117 F77F FEFB A490 8B96 1300 2B37" /* Æ~.÷.þû¤‹–..+7 */
- $"19FA E04C 4188 E9F6 8950 0668 B082 8FD8" /* .úàLAˆéö‰P.h°‚Ø */
- $"0B7D 6C32 4DBF F84F F4E9 ACAF 719A DC43" /* .}l2M¿øOô鬯qšÜC */
- $"9F8D A53E DF1A BDB0 AAA7 3267 9C2D 357A" /* Ÿ¥>ß.½°ª§2gœ-5z */
- $"9CA7 1AE1 59C4 F467 83D3 308B 004A 42C2" /* œ§.áYÄôgƒÓ0‹.JB */
- $"909B F979 41CE AB25 C6D1 9FE9 46E1 E837" /* ›ùyAΫ%ÆÑŸéFáè7 */
- $"7ADF FF72 225E 4472 D323 F55C BE19 1E50" /* zßÿr"^DrÓ#õ\¾..P */
- $"BF94 6787 CADB F576 300A 054B 0A2D E9B2" /* ¿”g‡ÊÛõv0Â.KÂ-é² */
- $"5C15 DB84 E735 F76D 5477 D8A7 28AF FF7A" /* \.Û„ç5÷mTwا(¯ÿz */
- $"7EB8 06F8 4FF4 E999 ED48 02C4 F111 F61D" /* ~¸.øOôé™íH.Äñ.ö. */
- $"8A6C 1CC6 AE54 94E4 8C5D 7655 4ECC 205F" /* Šl.Æ®T”äŒ]vUNÌ _ */
- $"DBF9 1BA7 83CC 52E9 E9C9 52A4 1151 7DE4" /* Ûù.§ƒÌRééÉR¤.Q}ä */
- $"051B E140 3FC0 D60B 0C11 663F 98A9 8B53" /* ..á@?ÀÖ...f?˜©‹S */
- $"776E BD8D 7678 AD62 ACEE 033F D134 B61E" /* wn½vx­b¬î.?Ñ4¶. */
- $"F86D 3384 AAE7 9074 F7CF 4509 F9B3 4F30" /* øm3„ªçt÷ÏEÆù³O0 */
- $"F32D 840F 1DDA E6B1 BDD4 951F 2379 F890" /* ó-„..Úæ±½Ô•.#yø */
- $"530A E915 A228 D3D8 B188 C692 2767 D628" /* SÂé.¢(ÓرˆÆ’'gÖ( */
- $"12F8 3FFA BA23 F76B 1D92 1FC1 EA73 30FC" /* .ø?úº#÷k.’.Áês0ü */
- $"CE72 0CA5 6695 6326 F93B B52F B9D4 F6F0" /* Îr.¥f•c&ù;µ/¹Ôöð */
- $"FF07 727B 80F9 EBFC 2176 788C 333F 4137" /* ÿ.r{€ùëü!vxŒ3?A7 */
- $"E82C D066 6088 A8EA 168F 40EA F1EE BDE8" /* è,Ðf`ˆ¨ê.@êñî½è */
- $"C023 75BA 66F2 335A 98C0 31A8 2137 7A7B" /* À#uºfò3Z˜À1¨!7z{ */
- $"DA0F 3962 D4B3 3E6E A5A1 3A19 5EED 48A7" /* Ú.9bÔ³>n¥¡:.^íH§ */
- $"7617 DE46 D178 BC48 D85D 7821 DFEC B30D" /* v.ÞFÑx¼HØ]x!ßì³. */
- $"F84F B7CD 80ED 55C7 9E1A F58D 7085 F625" /* øO·Í€íUÇž.õp…ö% */
- $"F564 3BF5 A09E B353 4E45 2F0B FC02 ECFD" /* õd;õ ž³SNE/.ü.ìý */
- $"539F 529C A652 34F1 C0CC BC04 FCE0 2C7D" /* SŸRœ¦R4ñÀ̼.üà,} */
- $"A8A9 9E67 79E9 ADE4 ABEE BFF6 4793 1B91" /* ¨©žgyé­ä«î¿öG“.‘ */
- $"413A 4302 7FB5 190C CB09 0DC9 3B33 E18D" /* A:C..µ..ËÆ.É;3á */
- $"DDAB 23C5 FABA 5DC1 554F C940 B964 7F6A" /* Ý«#Åúº]ÁUOÉ@¹d.j */
- $"A781 2032 BF9E 0262 7C99 CD96 9251 9FB6" /* § 2¿ž.b|™Í–’QŸ¶ */
- $"1C69 9141 7A13 3022 DE48 DA68 C959 A0B5" /* .i‘Az.0"ÞHÚhÉY µ */
- $"0F3A F19A 9301 5051 5855 9D7B 5173 EE47" /* .:ñš“.PQXU{QsîG */
- $"2B0D DB30 28CC 5E41 46F1 E79F 90B3 AB2A" /* +.Û0(Ì^AFñ石«* */
- $"CAEA 6128 10E1 2CC0 DDC2 EBF1 26F1 E1DC" /* Êêa(.á,ÀÝÂëñ&ñáÜ */
- $"EB87 87ED 55F3 827C A066 D932 FCF7 B134" /* 뇇íUó‚| fÙ2ü÷±4 */
- $"8BC9 CC70 B38C B019 8372 EA60 7C36 4D38" /* ‹ÉÌp³Œ°.ƒrê`|6M8 */
- $"F82F 16C2 2390 A91B 203A 8EBE D0EC E278" /* ø/.Â#©. :Ž¾Ðìâx */
- $"7AC4 8493 A217 6AC3 B85A 470D D74A B91D" /* zÄ„“¢.jøZG.×J¹. */
- $"0180 7BAB 4088 5671 6268 5B4A 54FE C179" /* .€{«@ˆVqbh[JTþÁy */
- $"1600 7677 830B 0E81 EEB2 6124 33F8 DBBD" /* ..vwƒ..î²a$3øÛ½ */
- $"1B35 D1F9 0568 3891 0ECB A836 5A86 9636" /* .5Ñù.h8‘.˨6Z†–6 */
- $"9F87 052F 0D66 8AA3 3362 1651 9B33 9057" /* Ÿ‡./.fŠ£3b.Q›3W */
- $"5B98 05EB 23CE 099F 2358 444E 0D64 A9F9" /* [˜.ë#ÎÆŸ#XDN.d©ù */
- $"A569 7D56 A50D 6256 69AF BDD9 7847 D651" /* ¥i}V¥.bVi¯½ÙxGÖQ */
- $"73E2 F76E F277 58DC BFB9 7B8E 593C 0E97" /* sâ÷nòwXÜ¿¹{ŽY<.— */
- $"3C4E 507D FA6C 7984 FAC8 6C42 6882 78AC" /* <NP}úly„úÈlBh‚x¬ */
- $"E40D B7A2 4E43 998B 1C29 D7C6 B7BA 58C9" /* ä.·¢NC™‹.)×Æ·ºXÉ */
- $"3503 114B 86B8 CB5D B605 832D 98FE 0257" /* 5..K†¸Ë]¶.ƒ-˜þ.W */
- $"FB50 8CA0 43D4 71BE E330 1584 5983 668F" /* ûPŒ CÔq¾ã0.„Yƒf */
- $"735C 2448 3B30 82E4 1932 5BF8 129F FE38" /* s\$H;0‚ä.2[ø.Ÿþ8 */
- $"749D 01ED DAFC 95B9 375D BBCB 60D9 FC58" /* t.íÚü•¹7]»Ë`ÙüX */
- $"0796 AEFC 2337 F89E 01F5 48BD 0BAF A61F" /* .–®ü#7øž.õH½.¯¦. */
- $"3EC4 C092 DC6A 584C AAAF 1A9F A20F CEA4" /* >ÄÀ’ÜjXLª¯.Ÿ¢.Τ */
- $"884B 2DB6 09F4 F51B 546F CD71 F4D3 6452" /* ˆK-¶Æôõ.ToÍqôÓdR */
- $"B6E5 3EFF 66F8 0D60 D916 F755 1348 E250" /* ¶å>ÿfø.`Ù.÷U.HâP */
- $"D8E2 6858 B424 B84B D59A 6885 24D3 D845" /* ØâhX´$¸KÕšh…$ÓØE */
- $"692F 4313 B616 584F 7419 0661 0064 C281" /* i/C.¶.XOt..a.d */
- $"A873 131C 5296 042B 1FD5 3EED BFC2 659E" /* ¨s..R–.+.Õ>í¿Âež */
- $"C4C7 2720 8002 28DD 141A BBE7 99F8 028F" /* ÄÇ' €.(Ý..»ç™ø. */
- $"8262 0577 5240 EB9A F866 2901 B75B 3FED" /* ‚b.wR@ëšøf).·[?í */
- $"9E78 9071 83FD 02BC FCDE 2135 42D1 F184" /* žxqƒý.¼üÞ!5BÑñ„ */
- $"309D F47E DF10 F797 4268 120A D377 04A4" /* 0ô~ß.÷—Bh.ÂÓw.¤ */
- $"2998 099E CA35 66AD FB20 8C14 1E0E 714E" /* )˜ÆžÊ5f­û Œ...qN */
- $"B9A7 70EE 5BA0 7A18 FC16 97EB 1A98 CB6C" /* ¹§pî[ z.ü.—ë.˜Ël */
- $"4B5D AC5B 3DC2 2062 E74A 18F2 0A76 6085" /* K]¬[=Â bçJ.òÂv`… */
- $"EF50 1C2F FE23 117A ED22 7BE8 0231 BC71" /* ïP./þ#.zí"{è.1¼q */
- $"707C 6736 BC3C 38AA 81C2 66B6 DCE5 13E9" /* p|g6¼<8ªÂf¶Üå.é */
- $"3076 C7AD 8C4B A962 C37E 4605 CDC0 8247" /* 0vÇ­ŒK©bÃ~F.ÍÀ‚G */
- $"190C 41CD 6923 8D00 BC94 5B5F E2AB 443B" /* ..AÍi#.¼”[_â«D; */
- $"3C5A 7FF6 213C 9E2D 9224 70B1 EA9B 7D36" /* <Z.ö!<ž-’$p±ê›}6 */
- $"E7EA 0D03 CB32 7413 AB26 CB30 1B56 CBDE" /* çê..Ë2t.«&Ë0.VËÞ */
- $"3C31 361D 24E2 F441 4D78 7825 1DA0 0C14" /* <16.$âôAMxx%. .. */
- $"5C84 B112 6FC1 77DB 42CA 7791 960B 9F09" /* \„±.oÁwÛBÊw‘–.ŸÆ */
- $"980A 5629 54C0 EC82 889A B0E3 38F4 E734" /* ˜ÂV)TÀ삈š°ã8ôç4 */
- $"FA91 D5CD 2C8F 43CD 5629 3DAD 81DA 5E0A" /* ú‘ÕÍ,CÍV)=­Ú^Â */
- $"C008 712F EAD3 2486 4CD2 C7BA 0FA9 BBD3" /* À.q/êÓ$†LÒǺ.©»Ó */
- $"6AC2 A912 7736 5A33 CC96 9EDC 9C5A 3084" /* j©.w6Z3Ì–žÜœZ0„ */
- $"C826 A3FB 0661 ED4B 9689 A921 22AB 2399" /* È&£û.aíK–‰©!"«#™ */
- $"6F2A 4A78 A5F8 A059 BE4B 7DFF 5D41 1A31" /* o*Jx¥ø Y¾K}ÿ]A.1 */
- $"E688 045C BD1E D1DB 7C5B 6B89 5C22 3CAF" /* æˆ.\½.ÑÛ|[k‰\"<¯ */
- $"F133 FF14 13A2 9A3F 6E42 54EB 5082 9F25" /* ñ3ÿ..¢š?nBTëP‚Ÿ% */
- $"7C07 6BA6 25EA A890 3560 E915 B058 CB68" /* |.k¦%ê¨5`é.°XËh */
- $"3601 4B07 ACE7 EC8A 2897 F908 D405 455E" /* 6.K.¬çìŠ(—ù.Ô.E^ */
- $"5EDD 427E 791A EA3D 6ACE 3BC0 0D43 731A" /* ^ÝB~y.ê=jÎ;À.Cs. */
- $"C9C6 8C03 BD83 6F85 EF75 7246 2F8E 1CFB" /* ÉÆŒ.½ƒo…ïurF/Ž.û */
- $"8DC9 2726 593F 1D87 A822 399F 9770 324C" /* É'&Y?.‡¨"9Ÿ—p2L */
- $"6ABF 38B9 E89E B2F5 D575 E7DB C449 63CF" /* j¿8¹èž²õÕuçÛÄIcÏ */
- $"EBE1 07BB 80A4 C099 6A15 9A47 96F3 8C8D" /* ëá.»€¤À™j.šG–óŒ */
- $"49E1 1F78 2119 9460 CA7A F257 EDA1 104B" /* Iá.x!.”`ÊzòWí¡.K */
- $"5C68 0E57 188C 62B0 FBE3 CF4F 5251 6525" /* \h.W.Œb°ûãÏORQe% */
- $"CB59 5E3D C6F4 6B04 5B2D 1ED2 3BE1 02BB" /* ËY^=Æôk.[-.Ò;á.» */
- $"7207 12AA BFEC 50F4 83FE 2797 121B 3D14" /* r..ª¿ìPôƒþ'—..=. */
- $"DA23 BE41 D647 E5CA DD2D CD48 8C4D A094" /* Ú#¾AÖGåÊÝ-ÍHŒM ” */
- $"B1A9 4ED5 4735 8818 C4F1 597D 3211 5D12" /* ±©NÕG5ˆ.ÄñY}2.]. */
- $"D96B 5A38 AB9A 7E89 C503 13B0 8354 C887" /* ÙkZ8«š~‰Å..°ƒTȇ */
- $"F766 96F0 EDAE C6B6 17B4 E9A4 9230 C2F5" /* ÷f–ðí®Æ¶.´é¤’0Âõ */
- $"029D 3D72 A1CF 5BB9 E975 DBFF 06DC F5B2" /* .=r¡Ï[¹éuÛÿ.Üõ² */
- $"686F 667B AD3E 1D8D 5BE4 0D6A 2CD7 DE66" /* hof{­>.[ä.j,×Þf */
- $"BE8E C996 696D 58EC 6CFE 40AD 3C95 EAF1" /* ¾ŽÉ–imXìlþ@­<•êñ */
- $"4591 1D62 836E D2E3 4CD8 E4A6 F4F4 C456" /* E‘.bƒnÒãLØä¦ôôÄV */
- $"A70C B3BE AA22 A188 DAB5 D3F7 4B7B 865D" /* §.³¾ª"¡ˆÚµÓ÷K{†] */
- $"4D89 77E6 99A6 46C9 14BA 25E1 55C5 ADBD" /* M‰w晦FÉ.º%áUÅ­½ */
- $"4379 96AF 26DA A399 F009 AE75 248B 0285" /* Cy–¯&Ú£™ðÆ®u$‹.… */
- $"B370 5704 6429 C8AF 0BD3 A332 90B2 8351" /* ³pW.d)ȯ.Ó£2²ƒQ */
- $"F715 32C9 347B EADE 2EBB 9D97 BF95 0C5A" /* ÷.2É4{êÞ.»—¿•.Z */
- $"9203 1EC5 7A8E CF46 C28C 39A2 DE74 C656" /* ’..ÅzŽÏFÂŒ9¢ÞtÆV */
- $"F0BF 3ABF CE5F BE71 B7CE 2FF3 F41B F3EA" /* ð¿:¿Î_¾q·Î/óô.óê */
- $"8BE7 B07E AB17 4F87 74FC FDE8 EF9F BF3F" /* ‹ç°~«.O‡tüýè? */
- $"A9EB F3D5 3F3E 83BE 7BAF EA5F E0FE 7ADF" /* ©ëóÕ?>ƒ¾{¯ê_àþzß */
- $"E7A7 7F9D 3FE7 3BF9 FA77 F9FA 3FF9 F7C7" /* ç§.?ç;ùúwùú?ù÷Ç */
- $"E7E9 871D E84F CFE8 83FC FE85 E3BB E7E7" /* çé‡.èOÏèƒüþ…ã»çç */
- $"AFFE 7D7F F9F5 57E7 AF70 6F9D 2DF3 9ED7" /* ¯þ}.ùõWç¯po-óž× */
- $"C81E F903 FEAB 8EF9 F50D F254 3F3E A4D1" /* È.ù.þ«Žùõ.òT?>¤Ñ */
- $"DD53 F3F6 F37E 7EC9 4775 1BE4 77F9 EEBF" /* ÝSóöó~~ÉGu.äwùî¿ */
- $"9ED1 F9DC 00F7 91DD 3D8B A94D D83C 797F" /* žÑùÜ.÷‘Ý=‹©MØ<y. */
- $"4243 1F04 D29C 94E6 FA35 A9C7 9C1C 0762" /* BC..Òœ”æú5©Çœ..b */
- $"AA92 7DF8 65D6 B16D 30C6 E3F2 22D5 8971" /* ª’}øeÖ±m0Æãò"Õ‰q */
- $"F890 651C 37E3 1F4A 29A4 6637 D7AE 7CB9" /* øe.7ã.J)¤f7×®|¹ */
- $"14C7 D06B 2595 45F8 89DC DBAF B284 6ADA" /* .ÇÐk%•Eø‰ÜÛ¯²„jÚ */
- $"E4DB 9D25 F76C CDA3 EB7E 1B5A 4264 8145" /* äÛ%÷lÍ£ë~.ZBdE */
- $"547E 6F18 076D A675 BA1A 1AB1 0BF1 AEB6" /* T~o..m¦uº..±.ñ®¶ */
- $"C8C2 AAE0 489F 4E11 7F77 336A 41A4 C050" /* ȪàHŸN..w3jA¤ÀP */
- $"D19E AE10 BD35 C5EC DA71 BDEF A017 C32D" /* Ñž®.½5ÅìÚq½ï .Ã- */
- $"CB15 0C8E 0B75 C179 FB84 FDF2 DD5D C21F" /* Ë..Ž.uÁyû„ýòÝ]Â. */
- $"56A5 397D C437 A82F 65F9 2E68 A785 0AF3" /* V¥9}Ä7¨/eù.h§…Âó */
- $"B9F0 7781 E6B8 ACFA 09DC B57D 6317 B29B" /* ¹ðw測úÆܵ}c.²› */
- $"C754 09FC 3635 9854 0DA1 A3BE D3EE CF40" /* ÇTÆü65˜T.¡£¾ÓîÏ@ */
- $"4BE4 A4D9 07C4 D65E 3887 C8A7 CD3A 83F5" /* Kä¤Ù.ÄÖ^8‡È§Í:ƒõ */
- $"DFA8 10A6 BB6D B811 852D 3877 8782 1E66" /* ߨ.¦»m¸.…-8w‡‚.f */
- $"AF11 43B8 CA3A 6146 3657 AFE0 B314 36CB" /* ¯.C¸Ê:aF6W¯à³.6Ë */
- $"8E1C 272D ED4B 634C AABA 0207 6A1A E2E3" /* Ž.'-íKcLªº..j.âã */
- $"C500 C0A4 894A BAD8 C9A1 0AE7 AC8D 750C" /* Å.À¤‰JºØÉ¡Âç¬u. */
- $"7D84 FBCC DB2E EE05 B04A 002B B383 46DE" /* }„ûÌÛ.î.°J.+³ƒFÞ */
- $"C18D 5BBD B442 9E88 BBB2 89CC 0EBA CF5A" /* Á[½´Bžˆ»²‰Ì.ºÏZ */
- $"5616 DDAB ED7B 4C2E 1C82 0C9D 4820 C0E8" /* V.Ý«í{L..‚.H Àè */
- $"1C4E 39A5 9041 9E33 A20A A73D 821A 238A" /* .N9¥Až3¢Â§=‚.#Š */
- $"3B24 14B9 D9A6 95AA F5B0 13C1 8CFD 790F" /* ;$.¹Ù¦•ªõ°.ÁŒýy. */
- $"33CB 82D3 FE12 0F27 F309 7453 05E0 DF8F" /* 3Ë‚Óþ..'óÆtS.àß */
- $"AAE8 F77A 31BA 0118 43E1 7AE7 69DC 5D12" /* ªè÷z1º..CázçiÜ]. */
- $"BD53 9858 EA6D D8D3 174C FE4C F487 3CCF" /* ½S˜XêmØÓ.LþLô‡<Ï */
- $"9098 7872 8FC3 EBAC 4C76 F503 6915 A1B3" /* ˜xrÃë¬Lvõ.i.¡³ */
- $"5FF8 81CD E13D D511 AAB8 5C7B 1376 C87F" /* _øÍá=Õ.ª¸\{.vÈ. */
- $"2DA1 557D 2053 3341 CC15 418C 0911 5378" /* -¡U} S3AÌ.AŒÆ.Sx */
- $"5FFE 324E 1412 2046 B049 3A77 69B7 417F" /* _þ2N.. F°I:wi·A. */
- $"AC17 B8B0 7FDA 6D19 59F0 DD68 8A88 E55A" /* ¬.¸°.Úm.YðÝhŠˆåZ */
- $"8098 0888 3714 713A 1D17 BB8D F01C 6005" /* €˜.ˆ7.q:..»ð.`. */
- $"8F2E 3D20 2753 1BB4 9BE3 DFD1 709F 99EB" /* .= 'S.´›ãßÑpŸ™ë */
- $"DFCC C1B1 717B 7FA3 52BB C12D E6B7 24D2" /* ßÌÁ±q{.£R»Á-æ·$Ò */
- $"F448 F23D C196 1BAA D61B F422 41B4 D620" /* ôHò=Á–.ªÖ.ô"A´Ö */
- $"466D 45F3 06F6 F631 3E88 5CDE F7F6 BC6F" /* FmEó.öö1>ˆ\Þ÷ö¼o */
- $"789C D06C 02CC 2E71 B6B0 03D2 297B BFCD" /* xœÐl.Ì.q¶°.Ò){¿Í */
- $"8C21 67AD CEE0 DB53 5749 A676 690C 11E3" /* Œ!g­ÎàÛSWI¦vi..ã */
- $"5AD2 905C 78E1 4AB0 E60E C920 4ECC 7CB6" /* ZÒ\xáJ°æ.É NÌ|¶ */
- $"A76F 70F1 BCFD AA1D F4D2 E43F E203 D0C8" /* §opñ¼ýª.ôÒä?â.ÐÈ */
- $"E11E 61AF F1A7 5762 600E 65BB D870 818A" /* á.a¯ñ§Wb`.e»ØpŠ */
- $"CDF0 DFC4 8C9C 1926 678B 2732 C52F 98FD" /* ÍðßÄŒœ.&g‹'2Å/˜ý */
- $"33B3 EE23 138D 5E5F C9C3 FEF9 6111 E3E6" /* 3³î#.^_ÉÃþùa.ãæ */
- $"AF79 A8A5 2949 D590 B463 EDF3 F72A 18FD" /* ¯y¨¥)IÕ´cíó÷*.ý */
- $"BB23 233B 7924 2DD1 A335 B949 467E A30C" /* »##;y$-Ñ£5¹IF~£. */
- $"3185 5FE5 DB63 6748 B22D AB3F 8A8C 0926" /* 1…_åÛcgH²-«?ŠŒÆ& */
- $"5450 E925 A69D 1185 7300 D694 EA1F 4DF2" /* TPé%¦.…s.Ö”ê.Mò */
- $"2413 F4ED 6D64 5B74 BBD5 0E65 26EF A8CD" /* $.ôímd[t»Õ.e&ï¨Í */
- $"5806 0C60 404F 90A0 06B6 AFD1 785F 9646" /* X..`@O .¶¯Ñx_–F */
- $"B1AD 2A45 5777 33FA 49DB 8D3D AC2A BAEA" /* ±­*EWw3úIÛ=¬*ºê */
- $"4527 B4DF 481A 6AB9 4485 05E6 7040 1B93" /* E'´ßH.j¹D….æp@.“ */
- $"D6E0 3BBF A334 E13B 68EC 934B C393 B621" /* Öà;¿£4á;hì“KÓ¶! */
- $"CFC8 69BE A6AC 672C 235E F1FC 4480 DE83" /* ÏÈi¾¦¬g,#^ñüD€Þƒ */
- $"32D7 D269 F78C F22D 5B9F F4DF DDDD D6DE" /* 2×Òi÷Œò-[ŸôßÝÝÖÞ */
- $"4C65 4D61 C1F0 26BF E4C3 D7C9 A034 163D" /* LeMaÁð&¿äÃ×É 4.= */
- $"FBAE 0167 4DF0 EBEF AA8B B742 2832 1F67" /* û®.gMðë懲·B(2.g */
- $"8CC0 80D0 4A6B 9843 DE59 2F7B F944 9DA4" /* ŒÀ€ÐJk˜CÞY/{ùD¤ */
- $"343D 9AD9 9E0B C7B5 0B7D 2CA1 F638 8A3B" /* 4=šÙž.ǵ.},¡ö8Š; */
- $"BB38 A39B 025A 9BA9 34AC ACF0 063D 5483" /* »8£›.Z›©4¬¬ð.=Tƒ */
- $"FE57 22E4 EB2C C699 AEF3 8EFB 1C8C A23A" /* þW"äë,Æ™®óŽû.Œ¢: */
- $"2C15 D2EF AC9A 91C9 993A 4CB0 2DDC 0A32" /* ,.Ò﬚‘É™:L°-ÜÂ2 */
- $"14B9 50D2 8579 8F9D 5AF2 88DB E726 1B39" /* .¹PÒ…yZòˆÛç&.9 */
- $"3E06 69F9 F300 09E4 D3E8 BB4C A704 10E0" /* >.iùó.ÆäÓè»L§..à */
- $"F1D0 53DE 91D8 6723 A047 11C7 57B3 C46C" /* ñÐSÞ‘Øg# G.ÇW³Äl */
- $"84A7 C2E1 C7CC 185C 9F21 7E2B 0F2E 64B1" /* „§ÂáÇÌ.\Ÿ!~+..d± */
- $"D734 4142 C65E A2FB 9ABE B62D 076B 2B65" /* ×4ABÆ^¢ûš¾¶-.k+e */
- $"9D6E 63F1 4825 79A9 3936 C7A7 531F EF6A" /* ncñH%y©96ǧS.ïj */
- $"F859 3084 0421 88A9 A648 8641 ACEB 95DE" /* øY0„.!ˆ©¦H†A¬ë•Þ */
- $"2E94 E3C9 442C 13AF CF63 0404 C5C6 5CE2" /* .”ãÉD,.¯Ïc..ÅÆ\â */
- $"CE90 F9CC A1B6 5713 031E C239 174F CC40" /* ÎùÌ¡¶W...Â9.OÌ@ */
- $"BCA4 EA9A EB6A 1D24 7962 F735 AF5A B937" /* ¼¤êšëj.$yb÷5¯Z¹7 */
- $"AC3B A12E 10A8 D332 6FE3 8ED1 6F01 B198" /* ¬;¡..¨Ó2oãŽÑo.±˜ */
- $"1543 A6A1 367E E226 5D76 B860 E0E1 8963" /* .C¦¡6~â&]v¸`àá‰c */
- $"AA7A F9EE DABF DB52 28F6 69F9 273F 8729" /* ªzùîÚ¿ÛR(öiù'?‡) */
- $"1D00 C7D2 20B9 3483 2125 88FC 94C0 54A6" /* ..ÇÒ ¹4ƒ!%ˆü”ÀT¦ */
- $"42FE F4E5 DA50 F495 F88B 5986 21CB 22E8" /* BþôåÚPô•ø‹Y†!Ë"è */
- $"EE5E 0622 2CB0 BCC8 0C6B 2B2B 23EB 0506" /* î^.",°¼È.k++#ë.. */
- $"A40F 09C2 726F 0C1F B8D4 55D3 2FE4 D629" /* ¤.ÆÂro..¸ÔUÓ/äÖ) */
- $"94C2 C913 BB28 4394 A9D2 8684 9E47 0445" /* ”ÂÉ.»(C”©Ò†„žG.E */
- $"B6CF 3E21 7072 B435 310C D7A3 063D 942B" /* ¶Ï>!pr´51.×£.=”+ */
- $"6AE9 350C 9442 C76E 1E6B A8C1 18A3 4309" /* jé5.”BÇn.k¨Á.£CÆ */
- $"6D55 E62F FC4E C4E9 6CF8 241D FAC5 2CC9" /* mUæ/üNÄélø$.úÅ,É */
- $"E020 6B12 31A6 9B11 710B 8850 FABE 5D63" /* à k.1¦›.q.ˆPú¾]c */
- $"068A 4018 2A90 93A5 9715 531E 8E7B AD7A" /* .Š@.*“¥—.S.Ž{­z */
- $"2921 115F 19CE 2B6A F643 DE89 2E76 890B" /* )!._.Î+jöCÞ‰.v‰. */
- $"5A69 1668 6A02 061F 4832 24EB FC82 6B4D" /* Zi.hj...H2$ëü‚kM */
- $"9B08 D22F CBBF D348 D18F 8B0C C684 6851" /* ›.Ò/Ë¿ÓHÑ‹.Æ„hQ */
- $"6CA9 E2FA 43CE 8A9A 7A58 FB28 0208 A6E0" /* l©âúCΊšzXû(..¦à */
- $"1ACF CE23 C624 5A38 C640 72C0 26F1 2818" /* .ÏÎ#Æ$Z8Æ@rÀ&ñ(. */
- $"07FD 74D9 F3D6 ED38 CA01 6485 CE8C 41A3" /* .ýtÙóÖí8Ê.d…ÎŒA£ */
- $"02C6 18E5 E4D2 2043 FA62 8768 3E14 7E80" /* .Æ.åäÒ Cúb‡h>.~€ */
- $"F2EB 67AD F743 75A0 2DDF 8724 1468 F88D" /* òëg­÷Cu -߇$.hø */
- $"9BF3 11EB 4D4C B372 D210 9B58 BAA0 646A" /* ›ó.ëML³rÒ.›Xº dj */
- $"222F 5E5A C781 1D86 5652 1B57 07AF C8FA" /* "/^ZÇ.†VR.W.¯Èú */
- $"9E77 DD7B FCB9 1D4C 8573 7B03 95AC D2DA" /* žwÝ{ü¹.L…s{.•¬ÒÚ */
- $"3314 4FFC CAF4 39B5 EAF4 9617 2CC5 9258" /* 3.OüÊô9µêô–.,Å’X */
- $"8F99 8C44 8D44 DA10 F1A5 51F7 5533 F13B" /* ™ŒDDÚ.ñ¥Q÷U3ñ; */
- $"CDDC B6D6 BE71 3C92 2628 3B69 DC32 C623" /* Íܶ־q<’&(;iÜ2Æ# */
- $"F497 3959 034A 67C3 10A8 26E2 572F B4B1" /* ô—9Y.JgÃ.¨&âW/´± */
- $"6C5C 3E47 FB9F AA7D D9A4 7A08 4BBA E854" /* l\>GûŸª}Ù¤z.KºèT */
- $"4370 CE77 C69A 11EB 1BD8 B9AF 8225 BC8E" /* CpÎwÆš.ë.ع¯‚%¼Ž */
- $"A261 1CAA A74D B531 A0B9 D462 35DF 9C21" /* ¢a.ª§Mµ1 ¹Ôb5ßœ! */
- $"73F1 EAC1 A13C E0BC AF6C 8111 03DF AF1F" /* sñêÁ¡<༯l..߯. */
- $"4748 1866 322C 535A 7C5E D2BC 4304 3541" /* GH.f2,SZ|^Ò¼C.5A */
- $"F14E 8412 296B 2C37 B642 9B4A 6417 EABB" /* ñN„.)k,7¶B›Jd.ê» */
- $"9034 1260 1B81 AFCC F903 4FAA A3F2 339E" /* 4.`.¯Ìù.Oª£ò3ž */
- $"F332 B080 8C32 31D7 4DEA B260 F190 43F1" /* ó2°€Œ21×Mê²`ñCñ */
- $"CCD5 A584 5C1C 343F FB87 CEA5 F246 8EAC" /* ÌÕ¥„\.4?û‡Î¥òFŽ¬ */
- $"C407 302C FEE7 3F59 F4B8 74ED ED62 D373" /* Ä.0,þç?Yô¸tííbÓs */
- $"A4BA B53A 0554 5403 9C2C E745 1087 5546" /* ¤ºµ:.TT.œ,çE.‡UF */
- $"2671 7BA6 3A33 703E BEF5 CD28 10A5 462B" /* &q{¦:3p>¾õÍ(.¥F+ */
- $"D902 9493 B2FC 176F 34BA 5A2D D2BC 0CBB" /* Ù.”“²ü.o4ºZ-Ò¼.» */
- $"5AB7 B854 08D3 CD79 3C71 1A89 E643 2FBC" /* Z·¸T.ÓÍy<q.‰æC/¼ */
- $"5A24 FEA6 EC06 1F23 79D9 3886 F6F4 7FB9" /* Z$þ¦ì..#yÙ8†öô.¹ */
- $"F892 1A20 DC66 1EB1 D6FD 1C48 52DE 4267" /* ø’. Üf.±Öý.HRÞBg */
- $"77E2 620B 2DC0 6828 575C F7CA 74BC FE73" /* wâb.-Àh(W\÷Êt¼þs */
- $"FABD C9ED 4E8F 71A7 8CCD 8D80 8BD2 8AA3" /* ú½ÉíNq§ŒÍ€‹ÒŠ£ */
- $"45C0 EF2A 387D 038E 8B00 BA81 12CD F93F" /* EÀï*8}.Ž‹.º.Íù? */
- $"E9BE 9134 2928 439B 69CF 3DB1 5DFC 3DAF" /* 龑4)(C›iÏ=±]ü=¯ */
- $"86CA 34A7 4574 C91C 3F99 3EA9 B6E9 F3AF" /* †Ê4§EtÉ.?™>©¶éó¯ */
- $"6757 09A3 C49E A9AD 7201 BFD9 B3FA 52B0" /* gWƣĞ©­r.¿Ù³úR° */
- $"0000 0030 908B 4E52 45F1 3CBE F04A D2E4" /* ...0‹NREñ<¾ðJÒä */
- $"83AF 6AEA 78E9 A438 C877 BAAD 65CB C703" /* ƒ¯jêxé¤8Èwº­eËÇ. */
- $"70B2 B9DD E19B 6B8C 0CE9 E402 0C9F 94F0" /* p²¹Ýá›kŒ.éä..Ÿ”ð */
- $"21BC 4E05 C03C 012A 66EF D0BC 2B72 292E" /* !¼N.À<.*fïм+r). */
- $"3592 1FDB 2A5C 8D2D C2FF 5C5B 6AB8 F695" /* 5’.Û*\-Âÿ\[j¸ö• */
- $"F279 2C54 0529 555A 6ACA 22A4 C28B D693" /* òy,T.)UZjÊ"¤Â‹Ö“ */
- $"1FC9 4492 43F3 A323 F990 0A31 9356 30D3" /* .ÉD’Có£#ùÂ1“V0Ó */
- $"D6F0 0D36 0091 043F F239 9D1E 114E 3693" /* Öð.6.‘.?ò9..N6“ */
- $"DF1C 23DF A27A 5B11 A44D 9199 07D1 AF2C" /* ß.#ߢz[.¤M‘™.ѯ, */
- $"63EB 21C5 D29F 8644 8C6A 129A 9CB9 ED72" /* cë!ÅÒŸ†DŒj.šœ¹ír */
- $"9286 3E0E B604 539A F262 B727 9284 01F9" /* ’†>.¶.Sšòb·'’„.ù */
- $"5AE1 DA5A 8A02 140E 5275 5433 BCDF 8038" /* ZáÚZŠ...RuT3¼ß€8 */
- $"0050 856F A747 857B 8376 255A 9185 28CC" /* .P…o§G…{ƒv%Z‘…(Ì */
- $"301A EC7C B5D3 89CC A695 1C87 8266 7CA8" /* 0.ì|µÓ‰Ì¦•.‡‚f|¨ */
- $"A203 7467 426E 9507 3DB3 1F90 F66B DC9F" /* ¢.tgBn•.=³.ökÜŸ */
- $"ACF6 CDB2 4FCC 5AE4 2F94 F555 CB9E D8AC" /* ¬öͲOÌZä/”õU˞ج */
- $"950B FF38 0FE4 5056 E5E8 F371 9A98 5697" /* •.ÿ8.äPVåèóqš˜V— */
- $"6319 5197 B545 E594 AADD B2F2 CA27 260D" /* c.Q—µE唪ݲòÊ'&. */
- $"9BAF 0E45 0846 5573 F96B 7AC1 CC89 E86E" /* ›¯.E.FUsùkzÁ̉èn */
- $"61E6 72E2 05E3 9F8D 26D8 F178 BCC0 0B18" /* aærâ.ãŸ&Øñx¼À.. */
- $"967C EA80 F7C1 45AE 8FAE A41C 41B6 438E" /* –|ê€÷ÁE®®¤.A¶CŽ */
- $"46EF 1094 D558 01A8 BBAD 7380 DA27 2772" /* Fï.”ÕX.¨»­s€Ú''r */
- $"9D67 1330 A48C 62EA 0643 14EC 3E22 A055" /* g.0¤Œbê.C.ì>" U */
- $"4E39 4E23 853D C587 99C8 CFD2 AEBB 9843" /* N9N#…=Ň™ÈÏÒ®»˜C */
- $"ECC9 0241 3253 8CF1 E068 1936 3BB2 56D3" /* ìÉ.A2SŒñàh.6;²VÓ */
- $"46F7 6A71 98D1 A300 1337 B3B0 7ABB 5752" /* F÷jq˜Ñ£..7³°z»WR */
- $"DB7A 7F85 5CFE 59DE A852 6987 DC11 C6B5" /* Ûz.…\þYÞ¨Ri‡Ü.Ƶ */
- $"E45B 7DD1 1F3A D566 C16D 3FBF 7BAD 7201" /* ä[}Ñ.:ÕfÁm?¿{­r. */
- $"B71C C74C A678 C2BB 10FD 534A 5E5D 79C0" /* ·.ÇL¦x».ýSJ^]yÀ */
- $"000C 2336 9113 B9C5 5D4A 1756 1C8B 0CD6" /* ..#6‘.¹Å]J.V.‹.Ö */
- $"AA8B DFF5 6CE3 CDAB B9B4 D85C 93FF 76AA" /* ª‹ßõlãÍ«¹´Ø\“ÿvª */
- $"15CF CF39 A864 B236 A172 03A1 65A1 9F76" /* .ÏÏ9¨d²6¡r.¡e¡Ÿv */
- $"FF55 00DE C7D0 C767 2787 9EB3 7CE5 C5BC" /* ÿU.ÞÇÐÇg'‡ž³|åż */
- $"8E08 6085 37A2 229C 73D3 2CC5 F6E8 AA1B" /* Ž.`…7¢"œsÓ,Åöèª. */
- $"AF13 15FD EB95 2609 6006 23C6 7910 8FFE" /* ¯..ýë•&Æ`.#Æy.þ */
- $"8C5E 60A6 A558 E899 0A05 0F37 EC94 8E51" /* Œ^`¦¥Xè™Â..7씎Q */
- $"7838 9A11 8483 88B0 E284 B88D CDEA 9D56" /* x8š.„ƒˆ°â„¸ÍêV */
- $"5C7E CFA2 8001 847E ABC9 360E 17EA 2D34" /* \~Ï¢€.„~«É6..ê-4 */
- $"8314 96C0 3810 D88F A54E 6E7C 6030 76FA" /* ƒ.–À8.Ø¥Nn|`0vú */
- $"18A4 A549 37FC 11F6 E77F A883 C794 71AC" /* .¤¥I7ü.öç.¨ƒÇ”q¬ */
- $"55F1 7F88 664A FEE4 01C4 5576 1BE6 9C41" /* Uñ.ˆfJþä.ÄUv.æœA */
- $"D800 6121 2FC0 E681 A16E 21AF D5FE 0E80" /* Ø.a!/Àæ¡n!¯Õþ.€ */
- $"A800 0000 3090 8C40 9184 82DA 7187 51C6" /* ¨...0Œ@‘„‚Úq‡QÆ */
- $"44DC C420 FF13 98AD D100 2C07 132C 8D6C" /* DÜÄ ÿ.˜­Ñ.,..,l */
- $"5D16 A089 D8F6 E77F A870 24F1 5461 DB69" /* ]. ‰Øöç.¨p$ñTaÛi */
- $"0F41 5029 7A41 B55F 0000 0184 846A 850C" /* .AP)zAµ_...„„j…. */
- $"241E E628 EDA6 4000 3090 6AA2 F6E7 7FA6" /* $.æ(í¦@.0j¢öç.¦ */
- $"26C9 5EDE 9BB6 A1B1 51E6 8D5D F800 0061" /* &É^Þ›¶¡±Qæ]ø..a */
- $"19B3 E47D 6F6F DB03 0885 4A53 27BA 38F5" /* .³ä}ooÛ..…JS'º8õ */
- $"35A0 1AB9 0A95 8FAE 85E3 F528 5A8B E645" /* 5 .¹Â•®…ãõ(Z‹æE */
- $"8419 0456 6A38 D0DA 4948 8987 2323 1216" /* „..Vj8ÐÚIH‰‡##.. */
- $"A4F8 FD1A C374 D30C BF43 CD86 B984 F23C" /* ¤øý.ÃtÓ.¿C͆¹„ò< */
- $"5487 B47F E217 F15A D8CF A66A 96A9 EAF3" /* T‡´.â.ñZØϦj–©êó */
- $"F966 0205 D320 1556 5C3C 073A 8E66 1E3F" /* ùf..Ó .V\<.:Žf.? */
- $"A74E FF2C BC45 E9DB 3B25 FF7F 46AD 13A9" /* §Nÿ,¼EéÛ;%ÿ.F­.© */
- $"5C21 458B 6AD4 829C 1DFB 54BA E5F2 3C76" /* \!E‹jÔ‚œ.ûTºåò<v */
- $"3898 11F6 D710 7470 00FC 0742 CA59 9E40" /* 8˜.ö×.tp.ü.BÊYž@ */
- $"757C 5952 61FF 4D28 0991 1673 9B01 06B9" /* u|YRaÿM(Æ‘.s›..¹ */
- $"3999 E9B5 06CD B1DA CB08 FF19 DE70 8D10" /* 9™éµ.ͱÚË.ÿ.Þp. */
- $"E725 848E D27D 2B0B 54F0 B60B 26AB CD92" /* ç%„ŽÒ}+.Tð¶.&«Í’ */
- $"E4F8 C007 FF68 6933 E2FF 31D5 435B FF7F" /* äøÀ.ÿhi3âÿ1ÕC[ÿ. */
- $"9A8E 9845 007F FEDA 4C63 9892 513A ABD9" /* šŽ˜E..þÚLc˜’Q:«Ù */
- $"A98A C012 5C99 31C0 D48F E334 671D A695" /* ©ŠÀ.\™1ÀÔã4g.¦• */
- $"C7EF 3AAA FF37 D381 4F42 983F FC4D AE82" /* Çï:ªÿ7ÓOB˜?üM®‚ */
- $"FF43 6555 9E7F 10A3 7B95 415D 41FF 20B3" /* ÿCeUž..£{•A]Aÿ ³ */
- $"8CB1 7302 0000 0000 584E AB14 398C A865" /* Œ±s.....XN«.9Œ¨e */
- $"5A7B 1650 52EB 8BCE 3E92 461D 071B 8F21" /* Z{.PRë‹Î>’F...! */
- $"2CFF 4F5F FD2E 999E B77D A47D 61B4 2C01" /* ,ÿO_ý.™ž·}¤}a´,. */
- $"D397 493D CB48 AB27 EB4A 13A7 8C89 7F64" /* Ó—I=ËH«'ëJ.§Œ‰.d */
- $"6C08 FF21 9696 98C7 6248 1615 541F EC81" /* l.ÿ!––˜ÇbH..T.ì */
- $"8E18 FAED 5257 3D01 2CBB 74C1 DA64 81A0" /* Ž.úíRW=.,»tÁÚd  */
- $"39BF B272 4068 15E8 A44A 007C 732C D9DC" /* 9¿²r@h.è¤J.|s,ÙÜ */
- $"1CF8 4612 8611 A36D 67BC 6E6A EA14 9D87" /* .øF.†.£mg¼njê.‡ */
- $"2962 C4B4 5442 9564 BFAA D0FB 991F 4288" /* )bÄ´TB•d¿ªÐû™.Bˆ */
- $"7CB2 2A41 333E 7827 5070 F3A6 67FF 7FFF" /* |²*A3>x'Ppó¦gÿ.ÿ */
- $"7601 CFFE E44B 4413 809B 3877 B59D BC19" /* v.ÏþäKD.€›8wµ¼. */
- $"548F 0A5B C1E9 A8D7 6B5D 8EC8 8A1A BB3D" /* TÂ[Áé¨×k]ŽÈŠ.»= */
- $"3CD1 3139 57CF 9E94 00E9 CF6E 3830 3561" /* <Ñ19WÏž”.éÏn805a */
- $"8DE4 A59F FD1B 45CF C608 D0FD 5D48 485E" /* 䥟ý.EÏÆ.Ðý]HH^ */
- $"D5A3 30A5 F9EE 5D55 B9C2 E552 3A9F B087" /* Õ£0¥ùî]U¹ÂåR:Ÿ°‡ */
- $"FE87 5DBC 5E73 0F16 9221 2B0D F399 AB6F" /* þ‡]¼^s..’!+.ó™«o */
- $"9950 0000 0000 0000 0008 2444 88CE 3BBD" /* ™P........$DˆÎ;½ */
- $"CC78 4932 9C47 DEFA 74E7 91BF 9827 FF7B" /* ÌxI2œGÞútç‘¿˜'ÿ{ */
- $"77EB 9B1B 9F7F FDAB 6552 35A1 0C22 E9C6" /* wë›.Ÿ.ý«eR5¡."éÆ */
- $"42E3 FF7F FF7F E9FD A23B 2F7D 3ADD FC90" /* Bãÿ.ÿ.éý¢;/}:Ýü */
- $"E4A1 F8B9 0560 0F86 D7FE 3F46 C953 2A03" /* ä¡ø¹.`.†×þ?FÉS*. */
- $"F1C7 F5AE D0C4 B743 EA67 B694 E47D 45CD" /* ñÇõ®ÐÄ·Cêg¶”ä}EÍ */
- $"6F92 178A E383 8B71 800E D9AF A55A F149" /* o’.Šãƒ‹q€.Ù¯¥ZñI */
- $"A838 5671 4C9A 8915 447A CDA9 C6B7 DD68" /* ¨8VqLš‰.DzÍ©Æ·Ýh */
- $"A5FB F404 CF63 A62E CC5E 89D3 FDB2 C841" /* ¥ûô.Ïc¦.Ì^‰Óý²ÈA */
- $"7A37 5B5D 5958 4B46 20B1 D389 5188 F9FE" /* z7[]YXKF ±Ó‰Qˆùþ */
- $"8FF1 D718 6C8C 3254 0000 0000 0000 0000" /* ñ×.lŒ2T........ */
- $"0000 00A1 EBEC C33A 8622 D0FF 7FFF 7FFF" /* ...¡ëìÃ:†"Ðÿ.ÿ.ÿ */
- $"705D C7FE 49E7 01B7 A65D D5BC 2041 80B0" /* p]ÇþIç.·¦]Õ¼ A€° */
- $"89ED F68A A000 F438 EBD0 C908 0B67 414F" /* ‰íöŠ .ô8ëÐÉ..gAO */
- $"C8F1 4312 2EC8 05E6 CA19 184F FF5B BA24" /* ÈñC..È.æÊ..Oÿ[º$ */
- $"57E8 A6B4 FBD3 FF79 4D8E FF44 BC50 6938" /* W覴ûÓÿyMŽÿD¼Pi8 */
- $"137F FF7D 6251 8D1A 9B33 CF7E 0BCB EAD7" /* ..ÿ}bQ.›3Ï~.Ëê× */
- $"2E0D EAE0 0003 0906 AA2B 66A8 C950 0000" /* ..êà..Æ.ª+f¨ÉP.. */
- $"0000 0000 0000 0000 0001 1E1F F600 1848" /* ............ö..H */
- $"4BF6 7A7C F92D 3E7A 437E 2254 51EB 4AF5" /* Köz|ù->zC~"TQëJõ */
- $"C6BF 442A 12CD 51FF 7FFE B8AE D0C4 B1D0" /* Æ¿D*.ÍQÿ.þ¸®ÐıР*/
- $"7CF7 019D A0ED 2CC4 01BC 1A94 212D 43EF" /* |÷. í,Ä.¼.”!-Cï */
- $"1274 9B67 94D5 062D 5FCC E23C 4816 416B" /* .t›g”Õ.-_Ìâ<H.Ak */
- $"1540 59C2 1D35 213D A11C EE70 8D15 5394" /* .@YÂ.5!=¡.îp.S” */
- $"53C6 29CF 4E19 F4CF 5B94 7FFF 7F8B 2813" /* SÆ)ÏN.ôÏ[”.ÿ.‹(. */
- $"3E95 DE81 30D0 3188 2A75 4F35 CB11 DDD5" /* >•Þ0Ð1ˆ*uO5Ë.ÝÕ */
- $"7FFD A983 95A9 71E7 A7A3 7D3F F944 0A7E" /* .ý©ƒ•©q秣}?ùDÂ~ */
- $"24D9 966F 6B6A 0FD0 23AC 7000 0000 0000" /* $Ù–okj.Ð#¬p..... */
- $"0009 D4AF 9196 E5A4 B8AC 407F F9EE C709" /* .ÆÔ¯‘–夸¬@.ùîÇÆ */
- $"F927 08C3 CA6C 3A3A D90F E306 BCC4 6D6C" /* ù'.ÃÊl::Ù.ã.¼Äml */
- $"C7A9 F042 6F4C FDC9 60AB A087 6338 8F12" /* Ç©ðBoLýÉ`« ‡c8. */
- $"4D29 D00C C575 C7B5 9FA4 E96C 1FA0 AAFB" /* M)Ð.ÅuǵŸ¤él. ªû */
- $"09E9 8DF9 1BE0 C62D 3C1D F55B DD77 A0FD" /* Æéù.àÆ-<.õ[Ýw ý */
- $"5C16 D959 BA08 0000 0000 0000 0145 AE01" /* \.ÙYº........E®. */
- $"712A 0E06 1212 70CD 94A8 0A2C 18F5 1E3B" /* q*....pÍ”¨Â,.õ.; */
- $"52FA C8F6 56F3 F7E4 69E6 54A0 3FF6 2487" /* RúÈöVó÷äiæT ?ö$‡ */
- $"C65F 0EFF 7F4F 8D07 C817 FE78 727D 3C75" /* Æ_.ÿ.O.È.þxr}<u */
- $"E4C6 1003 FECF 3E7E 6252 08C0 4A83 50D7" /* äÆ..þÏ>~bR.ÀJƒP× */
- $"DADA 8602 5949 900F D2B6 D10D 2661 3014" /* ÚÚ†.YI.Ò¶Ñ.&a0. */
- $"4541 17FF 2106 00DF AC82 0046 09BB A5AF" /* EA.ÿ!..߬‚.FÆ»¥¯ */
- $"CE51 0EBF F9AD 787A 907F 9F9A 628F E16B" /* ÎQ.¿ù­xz.Ÿšbák */
- $"C015 137E 9C68 FCFA A817 FF7F DD6B FDB6" /* À..~œhüú¨.ÿ.Ýký¶ */
- $"3DA3 7C9D 3309 0B8A B551 C370 4401 CD7F" /* =£|3Æ.ŠµQÃpD.Í. */
- $"7503 8425 E297 1B3F FF49 4FF8 3583 685A" /* u.„%â—.?ÿIOø5ƒhZ */
- $"B273 A7F7 CEBF F27E D78C 3E35 5332 152B" /* ²s§÷οò~׌>5S2.+ */
- $"033C C7FF 7B97 1AF0 F2A4 3C88 CC7B B96E" /* .<Çÿ{—.ðò¤<ˆÌ{¹n */
- $"65B3 533C F2F8 5E4B 6DBF 7D78 A316 310F" /* e³S<òø^Km¿}x£.1. */
- $"6B09 FD62 88D7 77FF 7447 524E C235 00A3" /* kÆýbˆ×wÿtGRNÂ5.£ */
- $"8F5A 4BEE D240 6154 C17C 2CC2 68F0 A959" /* ZKîÒ@aTÁ|,Âhð©Y */
- $"2F12 9B74 7E8E 423F BB1D BC9A C75B C618" /* /.›t~ŽB?».¼šÇ[Æ. */
- $"19D1 C6CB 0A15 BD77 99BD 96D3 CC07 F5AC" /* .ÑÆËÂ.½w™½–ÓÌ.õ¬ */
- $"D2ED DE5E F19D 5CFC B2B0 5407 0386 32C6" /* ÒíÞ^ñ\ü²°T..†2Æ */
- $"5F49 7BAD 3270 BF81 CF97 C934 7E23 7237" /* _I{­2p¿Ï—É4~#r7 */
- $"727B 0FA2 6DB0 D717 8C73 B109 E089 AAC5" /* r{.¢m°×.Œs±Æà‰ªÅ */
- $"7D98 9061 2956 EA75 0135 E870 3430 4E9B" /* }˜a)Vêu.5èp40N› */
- $"C76C D3D6 7EEB 83DB 9EEB C9A0 983D 1327" /* ÇlÓÖ~ëƒÛžëÉ ˜=.' */
- $"62D8 FD62 CA51 7135 80B0 ABFF 431B 9843" /* bØýbÊQq5€°«ÿC.˜C */
- $"68B4 A929 44E4 1F3E E3A1 22AA 5E87 579C" /* h´©)Dä.>ã¡"ª^‡Wœ */
- $"745B 9CA4 438C BFC2 9A1B 17BE BA75 06E4" /* t[œ¤CŒ¿Âš..¾ºu.ä */
- $"0108 698C E4F2 341C 24CC 7913 6237 ED48" /* ..iŒäò4.$Ìy.b7íH */
- $"E797 4D7A 0D5A D1EA ACDF F974 4F9F 9139" /* ç—Mz.ZÑê¬ßùtOŸ‘9 */
- $"6A87 3972 A1C8 0A2B 1E8B 6DB7 B811 4AB0" /* j‡9r¡ÈÂ+.‹m·¸.J° */
- $"EEE8 BB23 959C 239D 4165 DBED ACE4 F133" /* îè»#•œ#AeÛí¬äñ3 */
- $"8276 40BB C447 29FE 3EB6 5BA4 A6D0 2441" /* ‚v@»ÄG)þ>¶[¤¦Ð$A */
- $"1431 8B2D 8BFD 96B7 C8C2 9F9B DFB9 2B06" /* .1‹-‹ý–·ÈŸ›ß¹+. */
- $"E191 00FF 7E4B 8281 D609 D163 B8CB AF9A" /* á‘.ÿ~K‚ÖÆÑc¸Ë¯š */
- $"0995 7385 27FC 3C6A 5310 024D BAD1 8013" /* Æ•s…'ü<jS..MºÑ€. */
- $"8995 3DF4 FA80 FE12 8F5F 40E5 09E6 E7E8" /* ‰•=ôú€þ._@åÆæçè */
- $"C5E7 1309 3E97 E278 0228 1693 F565 F83E" /* Åç.Æ>—âx.(.“õeø> */
- $"4161 0037 E0AA D0CC 3AED 4E56 04E8 4456" /* Aa.7àªÐÌ:íNV.èDV */
- $"6E50 4626 C7E0 0790 014E 329B 0DDB D87D" /* nPF&Çà..N2›.ÛØ} */
- $"4532 6482 3F51 D651 3F62 D6EB 3BCA 75EB" /* E2d‚?QÖQ?bÖë;Êuë */
- $"5444 A42F 3CFB 4146 19FB 5376 876F 6BC1" /* TD¤/<ûAF.ûSv‡okÁ */
- $"B80B 7787 71DF 4CAA D70A 98BC 98E1 15A1" /* ¸.w‡qßLª×˜¼˜á.¡ */
- $"7996 F17F FF7A 91CF 350C FA04 5753 7ECB" /* y–ñ.ÿz‘Ï5.ú.WS~Ë */
- $"29F1 A4AD F335 59DB A580 EAA3 98AD FEB0" /* )ñ¤­ó5YÛ¥€ê£˜­þ° */
- $"275E BABE 6679 9AD4 B246 75F2 ECAA B042" /* '^º¾fyšÔ²Fuò쪰B */
- $"92C9 745E 1C58 58FF 2570 9228 4EAF 6F65" /* ’Ét^.XXÿ%p’(N¯oe */
- $"56F3 1D0C 85AA 9468 8000 0000 0101 3082" /* Vó..…ª”h€.....0‚ */
- $"08FD E30F FF75 70BF FCCA 2225 E5FC 3464" /* .ýã.ÿup¿üÊ"%åü4d */
- $"00CA 6C43 E833 80DE 2895 5F84 4B08 CEFA" /* .ÊlCè3€Þ(•_„K.Îú */
- $"AA94 EE33 24E7 CA20 A668 4717 FD5F F7F2" /* ª”î3$çÊ ¦hG.ý_÷ò */
- $"59E7 D6C6 6D0D 8E0F 1AC3 BBFA 3890 8ACB" /* YçÖÆm.Ž..ûú8ŠË */
- $"9250 6D82 E892 D4B9 1F14 D987 9818 877A" /* ’Pm‚è’Ô¹..Ù‡˜.‡z */
- $"66F0 905A B088 D761 B529 F02A 6964 6C65" /* fðZ°ˆ×aµ)ð*idle */
- $"8FB8 9A87 7771 9A12 C8A6 7F9C 9905 D643" /* ¸š‡wqš.Ȧ.œ™.ÖC */
- $"E554 91F5 0C26 4299 30C6 BC87 B38C 86FB" /* åT‘õ.&B™0Ƽ‡³Œ†û */
- $"ED50 C019 3822 52A8 97C6 1F49 176D FB8C" /* íPÀ.8"R¨—Æ.I.mûŒ */
- $"87B7 E37C 196E 3695 357A E2B8 FDE5 736E" /* ‡·ã|.n6•5zâ¸ýåsn */
- $"DF11 6026 3CD9 51CF 2A50 6F8A 53B0 0F16" /* ß.`&<ÙQÏ*PoŠS°.. */
- $"938B 745A F84D 571C A582 9723 90B4 49D7" /* “‹tZøMW.¥‚—#´I× */
- $"B11D 7BA6 45C1 2AFA D519 A471 60A3 17A9" /* ±.{¦EÁ*úÕ.¤q`£.© */
- $"2C13 6E04 D58E 3F37 0115 E4AE F51C 1BA8" /* ,.n.ÕŽ?7..ä®õ..¨ */
- $"EF7F 4C9F 7B47 8C5A D1D6 CAC7 D416 D6D4" /* ï.LŸ{GŒZÑÖÊÇÔ.ÖÔ */
- $"7F05 9504 5685 0D6D E0E8 6809 9307 7864" /* ..•.V….màèhÆ“.xd */
- $"1A86 1BA6 A321 D08C 1B0C 0981 9395 6DC0" /* .†.¦£!ÐŒ..Æ“•mÀ */
- $"C74F ECF7 CA1B FF4B 1896 BDBE 4876 8A4B" /* ÇOì÷Ê.ÿK.–½¾HvŠK */
- $"519F CC3C 7813 BE21 C40C B001 30F4 4FC7" /* QŸÌ<x.¾!Ä.°.0ôOÇ */
- $"B76C B9FA 26F6 38C8 116D B8F0 0B9D 818F" /* ·l¹ú&ö8È.m¸ð. */
- $"56F9 F934 AE60 71FD E583 8D07 A4A4 DE41" /* Vùù4®`qýåƒ.¤¤ÞA */
- $"FB75 B83F 384B 11C9 CC5E CD9D FF4C 05A8" /* ûu¸?8K.ÉÌ^ÍÿL.¨ */
- $"D59F 1E59 4797 FF7F DFD8 391C E8BA 72E2" /* ÕŸ.YG—ÿ.ßØ9.èºrâ */
- $"C1F8 9F5C 5317 01E3 EC2D 4120 97D2 BAEC" /* ÁøŸ\S..ãì-A —Òºì */
- $"DBB0 FF30 FC56 2E43 3716 1B7B A8CD 19AE" /* Û°ÿ0üV.C7..{¨Í.® */
- $"7FFF 7FF4 468B FF45 749B 3C67 EE31 1651" /* .ÿ.ôF‹ÿEt›<gî1.Q */
- $"17B2 B21C A982 A185 E8A3 03BC 2DCB C09A" /* .²².©‚¡…è£.¼-ËÀš */
- $"8522 64CF BB21 6955 068D F002 871B 05F3" /* …"dÏ»!iU.ð.‡..ó */
- $"9F44 7384 D624 E1FA A24D 67C7 BC5E F7BF" /* ŸDs„Ö$áú¢MgǼ^÷¿ */
- $"59BC DC3C BE4B 1456 0C6F F2C1 0841 038D" /* Y¼Ü<¾K.V.oòÁ.A. */
- $"723C 14FA 4F19 0AD4 1F88 0A1B FF14 3D93" /* r<.úO.ÂÔ.ˆÂ.ÿ.=“ */
- $"27AA 6E0B 4AA7 6A11 E06D 5D82 C930 1B53" /* 'ªn.J§j.àm]‚É0.S */
- $"0227 A9AA 253A 41E6 31D5 8B87 DC08 819B" /* .'©ª%:Aæ1Õ‹‡Ü.› */
- $"E5EE EA0F 6AA0 0000 0006 9BC0 594E 0004" /* åîê.j ....›ÀYN.. */
- $"D326 312C 0364 8835 C4D7 5040 3724 3CD9" /* Ó&1,.dˆ5Ä×P@7$<Ù */
- $"B889 2E14 12BC F0AD 9D2E 326B 1654 5952" /* ¸‰...¼ð­.2k.TYR */
- $"2B5F 1A9D 5403 C9C5 A731 1B3C 3443 783C" /* +_.T.Éŧ1.<4Cx< */
- $"A459 248B BBC7 DEDC 74AD E2A1 D647 5047" /* ¤Y$‹»ÇÞÜt­â¡ÖGPG */
- $"AD17 15AF FF5C 88C4 025F 4361 3F83 BFC9" /* ­..¯ÿ\ˆÄ._Ca?ƒ¿É */
- $"FF6D 7E58 128D 33D7 7076 E73A 9CF6 76D8" /* ÿm~X.3×pvç:œövØ */
- $"A0FF 2C44 2029 0B59 B427 3BDC 915B 87CF" /*  ÿ,D ).Y´';Ü‘[‡Ï */
- $"75D6 EC52 7793 6DFA A4E2 9E2D 7D25 FBC2" /* uÖìRw“mú¤âž-}%û */
- $"2028 DE78 D868 BEC5 E9D2 BFFA 8B12 9265" /* (ÞxØh¾ÅéÒ¿ú‹.’e */
- $"B01D 92F7 F71E 8782 F1CD 4E98 B46E 6DA5" /* °.’÷÷.‡‚ñÍN˜´nm¥ */
- $"8825 F851 1CE9 9F21 D8E2 86EB BAF4 126F" /* ˆ%øQ.éŸ!Øâ†ëºô.o */
- $"9CB3 0144 009A 6F38 0919 9C1F D0CE D23C" /* œ³.D.šo8Æ.œ.ÐÎÒ< */
- $"C9DD 9273 D8F6 6733 6E5A 2E7A 635C 8723" /* ÉÝ’sØög3nZ.zc\‡# */
- $"6E04 1283 1A43 02CA 74E4 8000 0309 08DB" /* n..ƒ.C.Êtä€..Æ.Û */
- $"EF05 DC00 D116 0D58 1A69 2055 1BA0 D8DE" /* ï.Ü.Ñ..X.i U. ØÞ */
- $"34B6 EA40 CC06 C673 559A 75F2 9B58 C474" /* 4¶ê@Ì.ÆsUšuò›XÄt */
- $"DD4C AB9A 9E6D 653B FCDF 4F33 3707 105E" /* ÝL«šžme;üßO37..^ */
- $"DBCE D327 45FB C663 E1AF 375B B106 B0B8" /* ÛÎÓ'EûÆcá¯7[±.°¸ */
- $"26EE AE4B 538A CF74 588E 928B 58C7 2D93" /* &î®KSŠÏtXŽ’‹XÇ-“ */
- $"371E BC81 0ED0 9F2C 1A18 8DD7 7E65 4FBF" /* 7.¼.П,..×~eO¿ */
- $"511B 63A1 8F26 2A08 A4D3 2BF3 96E6 FC32" /* Q.c¡&*.¤Ó+ó–æü2 */
- $"D457 8287 D843 6D19 2458 0EA4 AC8F 0512" /* ÔW‚‡ØCm.$X.¤¬.. */
- $"831D D4CA 9BFF 5A6E 951A 5897 451F 750C" /* ƒ.ÔÊ›ÿZn•.X—E.u. */
- $"CAD4 89C1 94A7 4BFA 4030 4828 1E37 C049" /* ÊÔ‰Á”§Kú@0H(.7ÀI */
- $"34C4 54B1 1054 2645 14E5 6DFF 7FFF 7328" /* 4ÄT±.T&E.åmÿ.ÿs( */
- $"F1A4 AAA2 4FD2 507D 86D5 FF7F FA43 F49A" /* ñ¤ª¢OÒP}†Õÿ.úCôš */
- $"5049 0839 5964 8186 EE46 1867 158E 9E2C" /* PI.9Yd†îF.g.Žž, */
- $"D618 8FF5 D416 6838 6187 9CF7 21BC DE1F" /* Ö.õÔ.h8a‡œ÷!¼Þ. */
- $"F84F F4E9 ACDB ECD8 6CA6 6725 85B4 4049" /* øOôé¬ÛìØl¦g%…´@I */
- $"AA9E 4935 7E1F 54E7 B0D5 A026 B073 899B" /* ªžI5~.Tç°Õ &°s‰› */
- $"51C4 8C2E 483C B3BF 38A0 4BCF 2042 EE90" /* QÄŒ.H<³¿8 KÏ Bî */
- $"4E1B 8C94 420F 99A7 9EA1 7D96 12A3 8C8D" /* N.Œ”B.™§ž¡}–.£Œ */
- $"819B C97D C518 51CB 0D8A A7A1 7159 EB10" /* ›É}Å.QË.Š§¡qYë. */
- $"4A27 5CD0 0ED7 2688 5F74 CE10 DF6A 5B4F" /* J'\Ð.×&ˆ_tÎ.ßj[O */
- $"E370 A282 105D 2F43 6E74 6B07 05EC 880E" /* ãp¢‚.]/Cntk..ìˆ. */
- $"15AF 5118 9D27 327D 2552 9996 020B 2D9A" /* .¯Q.'2}%R™–..-š */
- $"9AFC 6849 6068 6491 42FA 889C 7949 285A" /* šühI`hd‘BúˆœyI(Z */
- $"7FFE 5B6D DAF2 7FFF 772D E08E B9E4 65A3" /* .þ[mÚò.ÿw-àŽ¹äe£ */
- $"B49A DDC8 FF52 8DA3 B318 F84F F4E9 99ED" /* ´šÝÈÿR£³.øOôé™í */
- $"48C4 CA7E BE77 2634 6A22 1FAD 4752 8D9B" /* HÄÊ~¾w&4j".­GR› */
- $"B935 0449 1A27 9EAB B000 C242 3BB7 72B7" /* ¹5.I.'ž«°.ÂB;·r· */
- $"3ACC B41F 0AC9 CFFD 58DA D99F 498A 21CF" /* :Ì´.ÂÉÏýXÚÙŸIŠ!Ï */
- $"50B8 A155 9BB3 B3DA 13FE 251F 14F2 3431" /* P¸¡U›³³Ú.þ%..ò41 */
- $"6DBF 2774 3EFC 55BB 9CB3 40A4 CA00 A112" /* m¿'t>üU»œ³@¤Ê.¡. */
- $"3E83 51D4 9D13 DE0D F86D 3384 AAE7 9074" /* >ƒQÔ.Þ.øm3„ªçt */
- $"F7CF 4509 F99A 70B2 2E74 43C3 1363 021F" /* ÷ÏEÆùšp².tCÃ.c.. */
- $"6482 E471 22FA 6265 2DF9 C302 43F8 9053" /* d‚äq"úbe-ùÃ.CøS */
- $"0AE9 15A2 28D4 FD7C 05AF C7B8 26D5 7C0F" /* Âé.¢(Ôý|.¯Ç¸&Õ|. */
- $"22E0 4735 518D BE4B 4E83 1EF8 3FFA BA23" /* "àG5Q¾KNƒ.ø?úº# */
- $"3AE8 F76B 1D92 2038 64C1 EA73 30FC CE72" /* :è÷k.’ 8dÁês0üÎr */
- $"0CA5 6697 157E 55C4 8BAE E703 6FF5 F743" /* .¥f—.~UÄ‹®ç.oõ÷C */
- $"B456 C85F 3BFF 2629 95B7 02F4 F580 A49B" /* ´VÈ_;ÿ&)•·.ôõ€¤› */
- $"1587 2316 D131 66C1 C6DB F3DC C409 D801" /* .‡#.Ñ1fÁÆÛóÜÄÆØ. */
- $"E2DA 30B6 73FD 99EF AA26 25D7 DF07 FBEB" /* âÚ0¶sý™ïª&%×ß.ûë */
- $"094E 2E8E BD11 3C49 81BA E6BE 7666 ECBE" /* ÆN.Ž½.<Iºæ¾vfì¾ */
- $"59D2 4ACC B4CE 3FAD 2173 25CB E42F 37B8" /* YÒJÌ´Î?­!s%Ëä/7¸ */
- $"F3CC 79EF 695C 10F4 0381 2D14 1B0F D632" /* óÌyïi\.ô.-...Ö2 */
- $"8A1E 9C29 F617 6A4B 204E A147 C08D 1AA5" /* Š.œ)ö.jK N¡GÀ.¥ */
- $"7418 DED9 DE83 A555 A75B AB00 C650 247F" /* t.ÞÙÞƒ¥U§[«.ÆP$. */
- $"0222 5558 731B 54DB 14F6 3A0E 1FAD A8D8" /* ."UXs.TÛ.ö:..­¨Ø */
- $"F327 DC8F AF3F 630B 3BA9 7933 8D30 458C" /* ó'ܯ?c.;©y30EŒ */
- $"4C2F 6E3A 0A64 DDC5 926A 71CB 2347 EE4D" /* L/n:ÂdÝÅ’jqË#GîM */
- $"647B D94D BE24 7F62 6A14 EBE2 696F 8735" /* d{ÙM¾$.bj.ëâio‡5 */
- $"A96F E268 6912 A4A9 3254 0293 CB09 0DC0" /* ©oâhi.¤©2T.“ËÆ.À */
- $"206B EB7B F6B9 0643 5E74 4F2C 555A AE2D" /* kë{ö¹.C^tO,UZ®- */
- $"B16B 7FA3 8ADE 7EAC 764F 9A20 BC94 05F1" /* ±k.£ŠÞ~¬vOš ¼”.ñ */
- $"9AAC 0118 36B8 6B30 D696 6E84 EEC2 5342" /* š¬..6¸k0Ö–n„îÂSB */
- $"03A8 EFD3 CB37 D50D F676 35DB AD6C 280A" /* .¨ïÓË7Õ.öv5Û­l( */
- $"DB04 D23A 0922 A2E3 5F45 EBD1 5C49 F6AA" /* Û.Ò:Æ"¢ã_EëÑ\Iöª */
- $"4579 1BA2 D94E D3F0 7A7E C24E 79B0 5D24" /* Ey.¢ÙNÓðz~ÂNy°]$ */
- $"B98E 23E7 4C4F 54D9 A3CE 389F 63F6 2426" /* ¹Ž#çLOTÙ£Î8Ÿcö$& */
- $"7087 D921 86D6 709F 768D 5684 BB90 47B7" /* p‡Ù!†ÖpŸvV„»G· */
- $"AC32 98D7 E247 3668 E954 8105 EE44 AF58" /* ¬2˜×âG6héT.îD¯X */
- $"13FF 573A 9F89 06C9 FB77 277E 08C9 09E9" /* .ÿW:Ÿ‰.Éûw'~.ÉÆé */
- $"B180 F96E C5AB 1E5D 3029 E229 CE1B B2AD" /* ±€ùnÅ«.]0)â)Î.²­ */
- $"BA11 DD98 0D9C 4C45 66DD 8553 3BA2 6F5B" /* º.ݘ.œLEfÝ…S;¢o[ */
- $"699B CEF3 48A7 6C31 63E6 E189 9C68 B9EC" /* i›ÎóH§l1cæቜh¹ì */
- $"A663 411F EBCB 41AB 8F7E 7EAD 87DA 5BF3" /* ¦cA.ëËA«~~­‡Ú[ó */
- $"AAC9 975B AC1F 712B F7ED DEBD 04C3 B85A" /* ªÉ—[¬.q+÷íÞ½.øZ */
- $"470D D74A B91D 0180 7BAB 4088 5671 6268" /* G.×J¹..€{«@ˆVqbh */
- $"5B4A 54FE C179 1600 7677 830B 0E81 EEB4" /* [JTþÁy..vwƒ..î´ */
- $"056E 79FF 8251 AB20 A6BC 15A5 E71F 7D4A" /* .nyÿ‚Q« ¦¼.¥ç.}J */
- $"2F6E 951A DE36 7A81 C704 9A4A F239 E1DC" /* /n•.Þ6zÇ.šJò9áÜ */
- $"FF6C DE49 B4C8 F6C1 F764 8D19 4686 DFC2" /* ÿlÞI´ÈöÁ÷d.F†ß */
- $"5C72 4A52 9784 F974 DCA4 A177 21DA 9869" /* \rJR—„ùtܤ¡w!Ú˜i */
- $"80A4 5BC6 FD54 A56B C7B1 4705 3A32 C896" /* €¤[ÆýT¥kDZG.:2È– */
- $"4539 25E5 90CC F228 B7F9 ADA5 CC2C 59CA" /* E9%åÌò(·ù­¥Ì,YÊ */
- $"D14D 4B86 9CC0 D367 7EF5 DB6D C2E1 06DB" /* ÑMK†œÀÓg~õÛmÂá.Û */
- $"58BC 0D97 DCFE 3CB1 EA45 C36F 1B60 83C9" /* X¼.—Üþ<±êEÃo.`ƒÉ */
- $"663F B883 83BA A69F 2653 0747 18C7 6D20" /* f?¸ƒƒº¦Ÿ&S.G.Çm */
- $"F2C7 6E01 47DA AB9D 2D83 D5CE 1E9C 779A" /* òÇn.GÚ«-ƒÕÎ.œwš */
- $"5FAE 6015 63DE 317A EFCA 7142 F3F8 A7E1" /* _®`.cÞ1zïÊqBóø§á */
- $"F739 60AB DF24 41BF EB6C AF15 7223 E56C" /* ÷9`«ß$A¿ël¯.r#ål */
- $"8D61 D9D1 C61F 8F8E 8435 6452 C45A 917B" /* aÙÑÆ.Ž„5dRÄZ‘{ */
- $"0856 B8BA 14E2 0A77 ABA0 E605 2E39 63EA" /* .V¸º.âÂw« æ..9cê */
- $"E7F5 4804 6535 7672 575F 37EA 9E69 1A1C" /* çõH.e5vrW_7êži.. */
- $"E380 CB7D C109 2D50 73EF 4119 54BE CBFE" /* ã€Ë}ÁÆ-PsïA.T¾Ëþ */
- $"4552 74A1 3E73 C457 1436 9DFF 3C25 8231" /* ERt¡>sÄW.6ÿ<%‚1 */
- $"2C25 ACE4 F084 E842 60E8 355D 22BE 6FEE" /* ,%¬äð„èB`è5]"¾oî */
- $"93F9 DDE6 DAED 4E44 545A FE4E 5EA4 0487" /* “ùÝæÚíNDTZþN^¤.‡ */
- $"36F1 52AF 8683 2DE8 F30B 72DE E807 2068" /* 6ñR¯†ƒ-èó.rÞè. h */
- $"742B 7262 BF7E 516C D41F CA56 9DE1 E3B8" /* t+rb¿~QlÔ.ÊVá㸠*/
- $"8D72 2993 C073 516D A343 DDE0 984D F06A" /* r)“ÀsQm£CÝà˜Mðj */
- $"CD83 D22D C161 30D7 2E9A FED4 4E85 5D2E" /* ̓Ò-Áa0×.šþÔN…]. */
- $"CF72 2181 7F23 BC37 FF83 C30D 43E0 DBC7" /* Ïr!.#¼7ÿƒÃ.CàÛÇ */
- $"A277 B4D9 4E68 1FB1 AF7B 6D8B 8F43 2A1B" /* ¢w´ÙNh.±¯{m‹C*. */
- $"9FE4 6CCC E826 C4AA 96C9 98A9 4D3B 981F" /* ŸälÌè&Ī–ɘ©M;˜. */
- $"8786 8633 89B0 2B42 4266 BC27 0098 D2B3" /* ‡††3‰°+BBf¼'.˜Ò³ */
- $"E8E4 0D2C 6E14 D34D 3613 4568 4A1E 8E5E" /* èä.,n.ÓM6.EhJ.Ž^ */
- $"E328 D89C 85D3 D8C2 C15B 3533 989F F015" /* ã(Øœ…ÓØÂÁ[53˜Ÿð. */
- $"1B49 871D 031B 2DBE D49E 880D A557 0694" /* .I‡...-¾Ôžˆ.¥W.” */
- $"60C3 47A1 CD2A 961B F73C 94A3 6B17 4268" /* `ÃG¡Í*–.÷<”£k.Bh */
- $"F766 81DC 33BC 8C1D 5571 D2D7 FB1C 9378" /* ÷fÜ3¼Œ.UqÒ×û.“x */
- $"01B7 BDCC 5DD0 9171 5FA1 50DA 7EBF 1586" /* .·½Ì]Бq_¡PÚ~¿.† */
- $"FA82 9E6F CBE4 0977 9C9C 2373 E789 5A3E" /* ú‚žoËäÆwœœ#sç‰Z> */
- $"8743 EB0E ED13 7955 DB28 2874 8065 2078" /* ‡Cë.í.yUÛ((t€e x */
- $"97A7 6C13 2283 729A CCF9 E449 A627 7652" /* —§l."ƒršÌùäI¦'vR */
- $"E821 2F1F 574E 6887 1830 6E01 5A8D 02FB" /* è!/.WNh‡.0n.Z.û */
- $"DB61 8EEF 4E08 B607 26FA 2B4C FF47 38FE" /* ÛaŽïN.¶.&ú+LÿG8þ */
- $"9B7C A3E4 DB46 F898 CFE9 8F3C 8717 2975" /* ›|£äÛFø˜Ïé<‡.)u */
- $"9BA2 582E 86D1 D882 C127 EFD7 E71A B5DD" /* ›¢X.†ÑØ‚Á'ï×ç.µÝ */
- $"7772 6391 2722 2884 AA0F 9C72 9A96 F4F8" /* wrc‘'"(„ª.œrš–ôø */
- $"BFF8 869A FD00 3B41 A8C7 DCD0 2834 270C" /* ¿ø†šý.;A¨ÇÜÐ(4'. */
- $"B93C 8702 5B16 8A32 0289 979B 0A35 3A7B" /* ¹<‡.[.Š2.‰—›Â5:{ */
- $"5870 6189 03C2 DD00 FAB2 B137 AB93 3EF5" /* Xpa‰.ÂÝ.ú²±7«“>õ */
- $"24E3 1FE1 A206 963E 1344 FE12 285A 5C52" /* $ã.á¢.–>.Dþ.(Z\R */
- $"692E D315 6C73 2CBE 7ADC 81BC EBC8 13EA" /* i.Ó.ls,¾zܼëÈ.ê */
- $"796B 6056 E9E7 D971 6E09 7086 252C 6A19" /* yk`VéçÙqnÆp†%,j. */
- $"7351 153D F4C4 FE01 6235 917F B203 171A" /* sQ.=ôÄþ.b5‘.²... */
- $"1822 B42B 9226 D163 5572 7E7E C508 BEBA" /* ."´+’&ÑcUr~~Å.¾º */
- $"D0D2 1C24 8D62 565D C183 F78D 4726 0541" /* ÐÒ.$bV]Áƒ÷G&.A */
- $"F829 10C7 1B21 E59C C4E5 7688 6268 FABC" /* ø).Ç.!åœÄåvˆbhú¼ */
- $"C0B9 6C02 8820 3F44 54A7 8C83 F14F 61B8" /* À¹l.ˆ ?DT§ŒƒñOa¸ */
- $"707C AB32 9D59 F01E D18A 37FC 40F9 5C59" /* p|«2Yð.ÑŠ7ü@ù\Y */
- $"EEA8 E442 FDC8 CA73 970F 6EE0 1348 AC8E" /* î¨äBýÈÊs—.nà.H¬Ž */
- $"9D65 4DA9 2820 AEDB A7F3 C1B4 8E3F 8780" /* eM©( ®Û§óÁ´Ž?‡€ */
- $"8DA9 F7D9 F116 DD30 778E 4FB6 49D3 AFE8" /* ©÷Ùñ.Ý0wŽO¶IÓ¯è */
- $"74B1 EB63 92B8 4210 3B22 3613 6784 41A2" /* t±ëc’¸B.;"6.g„A¢ */
- $"5953 1EFF 16A9 1769 9852 73D0 B6C2 3523" /* YS.ÿ.©.i˜RsжÂ5# */
- $"854B 1247 531D 47C5 7AFC 1B6B F0C4 2E2F" /* …K.GS.GÅzü.kðÄ./ */
- $"6C60 82C9 9C4D 2FAD 25A5 BEC6 8590 7388" /* l`‚ÉœM/­%¥¾Æ…sˆ */
- $"5D15 9A65 E013 D48B 7D9C 34B2 A617 75A8" /* ].šeà.Ô‹}œ4²¦.u¨ */
- $"8E8E 2D91 1AEC 26D5 8B9C D03C A02A A829" /* ŽŽ-‘.ì&Õ‹œÐ< *¨) */
- $"738D 9A4E 8F31 82A9 39B7 7CFE D412 810E" /* sšN1‚©9·|þÔ.. */
- $"1372 6D79 8D49 BAC1 9FFB 5D52 56AD 488F" /* .rmyIºÁŸû]RV­H */
- $"4E1D A232 7348 1FE2 483F AB9F A23C 0997" /* N.¢2sH.âH?«Ÿ¢<Æ— */
- $"678D 1AB7 7F66 8927 7DED 2A66 E03B 05C9" /* g.·.f‰'}í*fà;.É */
- $"0420 66A2 E0AE E1B9 259E 64C9 FF0E A7C7" /* . f¢à®á¹%ždÉÿ.§Ç */
- $"5E9D 69F4 DD50 394C 344E 9DA9 6BCA 3D9F" /* ^iôÝP9L4N©kÊ=Ÿ */
- $"8FA9 C156 3248 2310 8AB9 6131 B94F FF36" /* ©ÁV2H#.Š¹a1¹Oÿ6 */
- $"DF00 9E80 5713 E9AD 3B07 879E C876 E063" /* ß.ž€W.é­;.‡žÈvàc */
- $"38D8 2776 3081 5810 1760 927C D93C EE88" /* 8Ø'v0X..`’|Ù<îˆ */
- $"518B 755A EBF1 B276 C65B 98DD 1421 8AA1" /* Q‹uZëñ²vÆ[˜Ý.!Š¡ */
- $"27D2 A8B2 5E3E B7B7 8F73 CDCB 9896 D80F" /* 'Ò¨²^>··s͢–Ø. */
- $"1D50 2E28 4F54 26A9 E68F 822C 3031 0A5B" /* .P.(OT&©æ‚,01Â[ */
- $"213A 8ED8 B1B8 C32C F5EF 6784 3641 A888" /* !:ŽØ±¸Ã,õïg„6A¨ˆ */
- $"1AF9 941B E9B2 42C0 D9BE AAD7 2727 9E13" /* .ù”.é²BÀÙ¾ª×''ž. */
- $"284F A530 1F62 679B 7860 E677 9E24 3663" /* (O¥0.bg›x`æwž$6c */
- $"E7D1 E4B5 D37B C274 9ECB CFA2 CC95 8A75" /* çÑäµÓ{ÂtžËϢ̕Šu */
- $"0C3A FB7D F074 1433 5EC7 1FC4 330E F221" /* .:û}ðt.3^Ç.Ä3.ò! */
- $"AE39 4A04 097F 4B21 27CD C193 39CB 3AB2" /* ®9J.Æ.K!'ÍÁ“9Ë:² */
- $"0B6E D8E0 54EA 0F75 15F9 D75D 0D82 624D" /* .nØàTê.u.ù×].‚bM */
- $"7D19 8E11 1AD0 764F CEA8 F0FE 2913 6841" /* }.Ž..ÐvOΨðþ).hA */
- $"89B8 CA62 C997 34B9 5950 4842 4F13 1ACD" /* ‰¸ÊbÉ—4¹YPHBO..Í */
- $"39AD 30CA 4ED2 A17D 0B09 206B 9426 EF50" /* 9­0ÊNÒ¡}.Æ k”&ïP */
- $"63C6 386E 74BB BDE0 420F 6154 5260 E1A2" /* cÆ8nt»½àB.aTR`ᢠ*/
- $"8546 3192 76D1 1F38 268E 7AC6 049F 321D" /* …F1’vÑ.8&ŽzÆ.Ÿ2. */
- $"CB51 35C7 067C 961B DA2F 4BCB E065 A8DB" /* ËQ5Ç.|–.Ú/KËàe¨Û */
- $"16C9 1F05 ABAF 93FF 333A F049 3161 6838" /* .É..«¯“ÿ3:ðI1ah8 */
- $"6E1A FEF2 564C 3F48 3800 BC9C F009 AF34" /* n.þòVL?H8.¼œðƯ4 */
- $"2241 15D4 764F 4764 CEDF 6D7D 2E9C 8141" /* "A.ÔvOGdÎßm}.œA */
- $"1E00 E109 D827 DDAA A47C 2854 9229 8998" /* ..áÆØ'ݪ¤|(T’)‰˜ */
- $"9175 1FFB 496B 36C7 3695 3631 390B 06E6" /* ‘u.ûIk6Ç6•619..æ */
- $"EB0D 3BA7 F1BE A2FF 6D3A 9FB6 FCFD ADEF" /* ë.;§ñ¾¢ÿm:Ÿ¶üý­ï */
- $"EDBA 3FDB 632F EDB1 BF6D BE7E DB9F 97ED" /* íº?Ûc/í±¿m¾~ÛŸ—í */
- $"45FD AB93 F6E8 7FED A7F7 DAC3 FC34 6F43" /* Eý«“öè.í§÷ÚÃü4oC */
- $"E1DB 5507 762F DB7E 5F51 DDF5 1DFE DD07" /* áÛU.v/Û~_QÝõ.þÝ. */
- $"E1FD A67F B4E6 7EDB 8BF6 AE3F B6BC D3E4" /* áý¦.´æ~Û‹ö®?¶¼Óä */
- $"D00B 0F87 A0FF 2AC3 3F6D 84F8 7475 99F2" /* Ð..‡ ÿ*Ã?m„øtu™ò */
- $"F382 BE95 100F 8FEE C1C8 D086 E345 E973" /* 󂾕..îÁÈІãEés */
- $"0FE4 06B6 7813 7115 B8D0 D91B C698 D10D" /* .ä.¶x.q.¸ÐÙ.ƘÑ. */
- $"A370 844F 9330 E047 0201 F880 D146 6522" /* £p„O“0àG..ø€ÑFe" */
- $"8E52 12DE 3D1A 9231 5315 682E 4706 8685" /* ŽR.Þ=.’1S.h.G.†… */
- $"DA39 C538 9828 7ED0 714F 3E27 532A 3840" /* Ú9Å8˜(~ÐqO>'S*8@ */
- $"C912 3E46 8205 3243 7835 7284 12D6 CCF5" /* É.>F‚.2Cx5r„.ÖÌõ */
- $"36AF 0975 8A27 4F44 3857 B5A3 160D 1391" /* 6¯ÆuŠ'OD8Wµ£...‘ */
- $"8005 2453 86CB 51B3 E493 EA9C 707F 7047" /* €.$S†ËQ³ä“êœp.pG */
- $"1DA8 1386 91D1 6105 7D84 1563 FC52 D5D3" /* .¨.†‘Ña.}„.cüRÕÓ */
- $"EDA7 D4A0 4AC1 BB4E 49D6 62F4 CA92 CE8E" /* í§Ô JÁ»NIÖbôÊ’ÎŽ */
- $"8DE0 84DC 418D ACE2 71AD 9206 3C98 3281" /* à„ÜA¬âq­’.<˜2 */
- $"104E A1F2 8982 6ED6 223E B67B BE6A C51F" /* .N¡ò‰‚nÖ">¶{¾jÅ. */
- $"4BF8 6C35 B6A4 5EC8 87BB 4834 7CF3 16AC" /* Køl5¶¤^ȇ»H4|ó.¬ */
- $"2453 B3DA 3503 94D6 2E70 2B6F 975E 21DB" /* $S³Ú5.”Ö.p+o—^!Û */
- $"F409 0368 9A2E DFB2 7A4B 9A6F 4165 1173" /* ôÆ.hš.ß²zKšoAe.s */
- $"A53E 329A 7925 FB80 9664 2C09 A9E5 715C" /* ¥>2šy%û€–d,Æ©åq\ */
- $"E42F 8E14 EC68 05A8 D565 53C2 9C98 86A2" /* ä/Ž.ìh.¨ÕeSÂœ˜†¢ */
- $"2C2D 6443 A1D0 A619 2320 6CD3 FE48 8006" /* ,-dC¡Ð¦.# lÓþH€. */
- $"FC0F 3690 DF76 1FD8 2E16 0705 D91F EEBE" /* ü.6ßv.Ø....Ù.î¾ */
- $"E961 32B9 E252 4F0E EE4A 6F73 AEBB 014A" /* éa2¹âRO.îJos®».J */
- $"8F45 1551 9123 7C3A 13F8 1B57 EB6A 0AFB" /* E.Q‘#|:.ø.WëjÂû */
- $"9AE9 65F5 9FDE 5F1C 7C23 84F1 6DCD CC52" /* šéeõŸÞ_.|#„ñmÍÌR */
- $"97DD 03E6 C571 0C23 F06B 9F21 2E2C 79D5" /* —Ý.æÅq.#ðkŸ!.,yÕ */
- $"1827 1436 E6FB C5FB BA11 617B 9B32 3DCD" /* .'.6æûÅûº.a{›2=Í */
- $"B0AD AA8F 53D0 2F20 849C D667 9436 A677" /* °­ªSÐ/ „œÖg”6¦w */
- $"38C9 1B5A 26E2 B4D4 29BB 2D9E 56D4 652D" /* 8É.Z&â´Ô)»-žVÔe- */
- $"9A12 FC7E FBD5 0075 3EC9 64FE D0CE 06A2" /* š.ü~ûÕ.u>ÉdþÐÎ.¢ */
- $"B63F 8731 DB8A 6917 26EA CCFC C1E6 10AA" /* ¶?‡1ÛŠi.&êÌüÁæ.ª */
- $"704E 20EA 7518 0416 6BBE 2867 9470 9FE6" /* pN êu...k¾(g”pŸæ */
- $"3D2A D178 6CD1 0B7D E518 4682 FC48 EA03" /* =*ÑxlÑ.}å.F‚üHê. */
- $"EFA0 ADEE B643 CDFD 796D C309 E13B 9DD3" /* ï ­î¶CÍýymÃÆá;Ó */
- $"82CC 1237 8D6B 9CB9 0438 AF1A 6190 136E" /* ‚Ì.7kœ¹.8¯.a.n */
- $"A170 6109 4BA8 FD0B 4C10 DE61 71A9 A5FF" /* ¡paÆK¨ý.L.Þaq©¥ÿ */
- $"5AD1 3895 15D0 912A BC62 5344 A7FD 7B9B" /* ZÑ8•.Б*¼bSD§ý{› */
- $"0360 8C71 DD04 20C7 4685 E6B7 7941 7BD7" /* .`ŒqÝ. ÇF…æ·yA{× */
- $"DBBB 3F61 742B D692 AD3D B778 6442 3DD1" /* Û»?at+Ö’­=·xdB=Ñ */
- $"A97E 1312 9AF4 05C1 7B33 9FE2 B3F5 D16C" /* ©~..šô.Á{3Ÿâ³õÑl */
- $"875D 7109 13EC BB96 0664 DF60 1958 8DE5" /* ‡]qÆ.ì»–.dß`.Xå */
- $"5B3F 3E75 9D21 0415 CE9C 3172 87C7 FF05" /* [?>u!..Îœ1r‡Çÿ. */
- $"F787 4F14 E63B 4DCE 247D B3A3 475C 5336" /* ÷‡O.æ;MÎ$}³£G\S6 */
- $"C794 AF23 6415 68C6 B893 1B16 8C81 3F43" /* Ç”¯#d.hƸ“..Œ?C */
- $"C455 6EB8 8D5A 6919 4C3A D980 BFB1 3699" /* ÄUn¸Zi.L:Ù€¿±6™ */
- $"C790 C7D1 7B05 12AA 803A 172B DEF2 00CC" /* ÇÇÑ{..ª€:.+Þò.Ì */
- $"FF38 62C8 1815 1D3A F60D 2B9B 87A0 05C5" /* ÿ8bÈ...:ö.+›‡ .Å */
- $"3587 0181 8754 06D7 2CFC 78B8 0C65 D5BC" /* 5‡.‡T.×,üx¸.eÕ¼ */
- $"2903 C07C 0631 A0B9 E94E 192F DE4B 4924" /* ).À|.1 ¹éN./ÞKI$ */
- $"A4F0 BB9A 49C5 B751 38EB 7289 9806 FC5C" /* ¤ð»šIÅ·Q8ër‰˜.ü\ */
- $"D822 ED93 CA92 14B6 5056 017F 7826 CDE1" /* Ø"í“Ê’.¶PV..x&Íá */
- $"8401 9F6C A7F7 4AD5 E86F FDC3 05AF 6AE3" /* „.Ÿl§÷JÕèoýÃ.¯jã */
- $"5EED 07E3 E5ED 7EE7 FB97 0B99 E191 605B" /* ^í.ãåí~çû—.™á‘`[ */
- $"955A 6A3C 33C6 2BB8 9562 0E38 09C1 1ED9" /* •Zj<3Æ+¸•b.8ÆÁ.Ù */
- $"8914 73AF E9AA 7B2F 214E 7EEA 98E8 B976" /* ‰.s¯éª{/!N~ê˜è¹v */
- $"E058 E0B5 6DB4 5B1C F212 2C8E 0AE5 7100" /* àXàµm´[.ò.,ŽÂåq. */
- $"BC1E 84CD 0598 7CF9 EA4E 1E96 2B4A DE9E" /* ¼.„Í.˜|ùêN.–+JÞž */
- $"6CE9 E79B 0336 9059 E109 DF83 A2AE 9E74" /* léç›.6YáÆ߃¢®žt */
- $"5BB1 0236 590C 66CD 0658 ECE5 50A2 EDDD" /* [±.6Y.fÍ.XìåP¢íÝ */
- $"D7BB DAF7 548B 7F21 2A40 7821 FDA2 62B6" /* ×»Ú÷T‹.!*@x!ý¢b¶ */
- $"C862 B0B2 96CF 27D5 EC9D F5C8 42D8 F42A" /* Èb°²–Ï'ÕìõÈBØô* */
- $"5962 F21A D191 6744 1AE2 64B4 6744 A1B2" /* Ybò.Ñ‘gD.âd´gD¡² */
- $"7625 FF0D F0CF A1F8 3273 C4B8 FCCE C2BC" /* v%ÿ.ðÏ¡ø2sĸüμ */
- $"EDD5 F0C6 765F 2446 5EF5 2195 04EE C94B" /* íÕðÆv_$F^õ!•.îÉK */
- $"C9C2 4F82 0D0F 6034 3560 64A8 C372 4E17" /* ÉÂO‚..`45`d¨ÃrN. */
- $"D4F6 B2DC 2162 A6DC 9B35 5F36 628E EA58" /* Ôö²Ü!b¦Ü›5_6bŽêX */
- $"B2EF D0B8 79FF 3F60 39DC 34C9 8DD1 C7DA" /* ²ïиyÿ?`9Ü4ÉÑÇÚ */
- $"BFFD 9220 B977 42CD 1F4E 00C7 1A7B F29F" /* ¿ý’ ¹wBÍ.N.Ç.{òŸ */
- $"9738 8D5E 3E5F BA1F D4BD 0592 2006 1216" /* —8^>_º.Ô½.’ ... */
- $"D478 DE72 171A A49D 9C4A 0691 CD59 6FB3" /* ÔxÞr..¤œJ.‘ÍYo³ */
- $"F3C5 B3CD DCC8 5794 133C 85B3 176A 0C6A" /* óųÍÜÈW”.<…³.j.j */
- $"323E C74F 7CE3 4042 38AB E9CA 5700 E39B" /* 2>ÇO|ã@B8«éÊW.ã› */
- $"26D3 62B7 59F8 966D A789 35AA C72D 9943" /* &Ób·Yø–m§‰5ªÇ-™C */
- $"C884 2E53 30B3 D351 EFCC 6BF8 9889 8AB6" /* È„.S0³ÓQïÌkø˜‰Š¶ */
- $"E284 F5A4 64BD F89F 98A4 8082 6292 48EB" /* â„õ¤d½øŸ˜¤€‚b’Hë */
- $"2039 4A80 D5D7 BEFC 2DC1 69A9 F484 9B4E" /* 9J€Õ×¾ü-Ái©ô„›N */
- $"94C9 6E87 31A6 6D4E 23DB 77A9 37D5 CEE9" /* ”Én‡1¦mN#Ûw©7ÕÎé */
- $"10B5 22DB 58B2 3DFB 973A E321 F02A 2985" /* .µ"ÛX²=û—:ã!ð*)… */
- $"AE7E F964 9A23 4B8D 90FD 75F4 9944 3CEB" /* ®~ùdš#Kýuô™D<ë */
- $"C5C5 B0BA DA1C AA0A B59A EFCA 903A 972B" /* ÅÅ°ºÚ.ªÂµšïÊ:—+ */
- $"10E9 2A66 2BAB 3E63 8312 E494 A82C AEE8" /* .é*f+«>cƒ.䔨,®è */
- $"DE3B 902F 4DE5 A934 7FA5 59D8 B355 75C7" /* Þ;/Må©4.¥YسUuÇ */
- $"DC51 6208 6D60 DE89 F04A F698 FC35 5341" /* ÜQb.m`Þ‰ðJö˜ü5SA */
- $"A8C7 894B 5E8F 0638 0F21 36AB 23FF 37BF" /* ¨Ç‰K^.8.!6«#ÿ7¿ */
- $"CA6E C0CE 1C93 9BB1 FEA7 49E8 9BA5 7F32" /* ÊnÀÎ.“›±þ§I蛥.2 */
- $"4C9D C8BA 821C 1E07 F277 BE63 241C D5F6" /* LȺ‚...òw¾c$.Õö */
- $"07CB 7A98 E51E B0FC B312 223C 21BF 5DEE" /* .Ëz˜å.°ü³."<!¿]î */
- $"0229 A0EE 8B90 5918 5910 F6A6 EEB6 503D" /* .) î‹Y.Y.ö¦î¶P= */
- $"8E76 A3B6 E583 FEFF 5B3D F804 F6EE 956E" /* Žv£¶åƒþÿ[=ø.öî•n */
- $"FEE7 D95F 9D05 AE0B 4926 52B4 23C3 D17A" /* þçÙ_.®.I&R´#ÃÑz */
- $"FC0F CC41 1264 0956 8CA2 6A30 C0D0 275F" /* ü.ÌA.dÆVŒ¢j0ÀÐ'_ */
- $"0CE8 C646 CC49 EF38 CC94 8B6C 1737 9636" /* .èÆFÌIï8Ì”‹l.7–6 */
- $"4EA7 0FE7 217B F3F1 A10D 7E49 242E 6F19" /* N§.ç!{óñ¡.~I$.o. */
- $"A8CF 369A 44DE 6C99 A9D4 24DA 6909 62C3" /* ¨Ï6šDÞl™©Ô$ÚiÆbà */
- $"0C4C D4CD D80E 72E6 FF6B A90E 7080 977B" /* .LÔÍØ.ræÿk©.p€—{ */
- $"4BEB 6A2A 72BB 0574 45FB 1E12 6408 C966" /* Këj*r».tEû..d.Éf */
- $"A632 9AC7 E67D 82C9 3FED 1E27 C1FA C47A" /* ¦2šÇæ}‚É?í.'ÁúÄz */
- $"AFCF 5719 3BCA 3975 BE3A 550B 6DC9 91CC" /* ¯ÏW.;Ê9u¾:U.mÉ‘Ì */
- $"F28E 751C 1B20 E7BB 58FF 0D92 2BF7 DE26" /* òŽu.. ç»Xÿ.’+÷Þ& */
- $"DFE3 B230 78F7 C64E ADF8 7741 F45A E3BC" /* ßã²0x÷ÆN­øwAôZã¼ */
- $"5185 1323 1C74 3288 F720 5DB7 B5C9 1EFD" /* Q….#.t2ˆ÷ ]·µÉ.ý */
- $"C844 7159 7047 A9BA 6CA1 403E CE2E 3522" /* ÈDqYpG©ºl¡@>Î.5" */
- $"1088 A628 490C 5F8D 64C4 7E17 CBD3 290D" /* .ˆ¦(I._dÄ~.ËÓ). */
- $"91B1 B073 AD4A BF5B A1E9 6306 3E9A F87E" /* ‘±°s­J¿[¡éc.>šø~ */
- $"2DEC 7390 2CF5 3305 93C2 15DA 7FFF 7FC6" /* -ìs,õ3.“Â.Ú.ÿ.Æ */
- $"0578 C93E BF93 5B69 25D4 E0F9 5726 0D7E" /* .xÉ>¿“[i%ÔàùW&.~ */
- $"9C06 C76B 1BF5 3206 F26C 4F57 6A13 7488" /* œ.Çk.õ2.òlOWj.tˆ */
- $"07F4 1787 316E 19B5 2CB4 D7B8 23EE BF15" /* .ô.‡1n.µ,´×¸#î¿. */
- $"84F7 C141 CE7E 358F F83B 081D 2680 C5CB" /* „÷ÁAÎ~5ø;..&€ÅË */
- $"2002 0FFB D329 10E3 1880 E0F6 29FF 14F6" /* ..ûÓ).ã.€àö)ÿ.ö */
- $"1447 24FF 4BDD 371B 00F3 0334 6FE5 D217" /* .G$ÿKÝ7..ó.4oåÒ. */
- $"8E7D 3CCB EC04 D019 0583 0792 D4F4 59E5" /* Ž}<Ëì.Ð..ƒ.’ÔôYå */
- $"0914 52FB CE7A 2EFD B899 ED16 38FB E1D4" /* Æ.RûÎz.ý¸™í.8ûáÔ */
- $"3312 BAAE 3EF3 45B7 2A77 62F3 4787 8900" /* 3.º®>óE·*wbóG‡‰. */
- $"050D 5A64 92D3 64E7 7950 4234 FCC0 0EC6" /* ..Zd’ÓdçyPB4üÀ.Æ */
- $"004C 8652 616B B5FF 87F6 72D0 400B 9574" /* .L†Rakµÿ‡örÐ@.•t */
- $"7ADD 2EE6 F979 EE70 393F 5E65 09EC 561B" /* zÝ.æùyîp9?^eÆìV. */
- $"2FF4 F6FA 9226 2AA7 C2D2 4517 2258 15C7" /* /ôöú’&*§ÂÒE."X.Ç */
- $"D27E DE80 0000 0009 BB69 0154 3C66 FD24" /* Ò~Þ€...Æ»i.T<fý$ */
- $"D6C1 DFFC 41CF 26FD 27E3 9482 7299 C4A3" /* ÖÁßüAÏ&ý'㔂r™Ä£ */
- $"A4B0 4F99 5ED7 6507 C196 C060 D7BD 7BA6" /* ¤°O™^×e.Á–À`×½{¦ */
- $"A0A2 C1E7 0ECE 98C4 36F0 B006 0526 5FC4" /*  ¢Áç.ΘÄ6ð°..&_Ä */
- $"CDEF A25D CE59 7B6F 507F C409 957F 43E6" /* Íï¢]ÎY{oP.ÄÆ•.Cæ */
- $"20AB C4BE 33C2 E794 46B7 5341 D8C9 5487" /* «Ä¾3Âç”F·SAØÉT‡ */
- $"3000 A3E6 41BE 7D2A B553 6A8D C345 2E1E" /* 0.£æA¾}*µSjÃE.. */
- $"BF55 F536 52DD 101F D6C9 BB65 B7E4 0CFC" /* ¿Uõ6RÝ..ÖÉ»e·ä.ü */
- $"03D7 F641 F641 7A4F 8EE2 BA7A 352C ED91" /* .×öAöAzOŽâºz5,í‘ */
- $"9057 F893 C46F 62F7 A791 A8DE 8A25 BB17" /* Wø“Äob÷§‘¨ÞŠ%». */
- $"F164 F2ED 43E5 A2E2 17E9 C95D DE1C 45F4" /* ñdòíCå¢â.éÉ]Þ.Eô */
- $"3019 8090 809D D124 EE5C B48E 6C92 2A74" /* 0.€€Ñ$î\´Žl’*t */
- $"ACA0 4F0A 1777 70CF EBEC 112A 9035 16AB" /* ¬ OÂ.wpÏëì.*5.« */
- $"B36D 13D6 9F72 69CD E213 F146 6733 BAA3" /* ³m.ÖŸriÍâ.ñFg3º£ */
- $"0080 0000 0000 0000 0001 0151 0AD3 43F0" /* .€.........QÂÓCð */
- $"14A4 0000 61F0 20D9 9F3A 47FC 60A2 4780" /* .¤..að ÙŸ:Gü`¢G€ */
- $"F2D0 2A57 2C4C D349 5B9A 1BE3 0D39 80AD" /* òÐ*W,LÓI[š.ã.9€­ */
- $"72C4 873D 5028 F09E F0F5 700F B776 4B38" /* rć=P(ðžðõp.·vK8 */
- $"4FC6 7D26 AE5D 219E DDCE 4AA3 9AA9 FE19" /* OÆ}&®]!žÝÎJ£š©þ. */
- $"EC25 FEF0 0626 D259 8ECF 0364 6192 A000" /* ì%þð.&ÒYŽÏ.da’ . */
- $"0000 0000 0000 0000 0184 84B4 4FF0 1848" /* .........„„´Oð.H */
- $"4BC2 3700 0000 0000 0000 00B5 DA5E 3FF1" /* KÂ7........µÚ^?ñ */
- $"C9FC 9186 4A80 0000 0000 0000 0000 0000" /* Éü‘†J€.......... */
- $"0510 0FC3 251B 71C0 D918 64A8 0000 0000" /* ...Ã%.qÀÙ.d¨.... */
- $"0000 0000 0000 07E1 1EE1 F164 E11A 319D" /* .......á.áñdá.1 */
- $"3806 659F 8C35 7012 B17E 6096 52F0 8E96" /* 8.eŸŒ5p.±~`–RðŽ– */
- $"1438 1EBF 363A 49C9 51BD 3517 4ADA 7060" /* .8.¿6:IÉQ½5.JÚp` */
- $"0849 8F8B FCEC FD48 0000 54DF 4C0B E043" /* .I‹üìýH..TßL.àC */
- $"F3B6 1CEB 518A F2B1 5A9C 9500 0000 0000" /* ó¶.ëQŠò±Zœ•..... */
- $"0196 C058 0636 AF4B 041F 37EC DE6F 4B4E" /* .–ÀX.6¯K..7ìÞoKN */
- $"291D A2A6 3CB8 9BAC 4B0C 5017 9031 0EF1" /* ).¢¦<¸›¬K.P.1.ñ */
- $"3CF7 F63B 73A1 B4A6 9EA7 0513 C571 8EA8" /* <÷ö;s¡´¦ž§..ÅqŽ¨ */
- $"5D0A 28FC DCB6 D27A 0000 0000 0159 D076" /* ]Â(üܶÒz.....YÐv */
- $"3D1E 84A9 1C76 876E 7B6B 8519 1F9F 01C6" /* =.„©.v‡n{k…..Ÿ.Æ */
- $"1A11 B2A2 4841 4D47 5463 5D18 2AFE 54F5" /* ..²¢HAMGTc].*þTõ */
- $"591E 5FF1 39C7 C0CD 0D20 F366 59DE FE22" /* Y._ñ9ÇÀÍ. ófYÞþ" */
- $"B12C 4608 009D F105 49C8 16B5 417A 6079" /* ±,F..ñ.IÈ.µAz`y */
- $"40B0 7E7A C4B3 83B8 485D 42B1 4000 0000" /* @°~zijƒ¸H]B±@... */
- $"0E9F 0340 5469 49BB 5767 B4BE 47AF 19B3" /* .Ÿ.@TiI»Wg´¾G¯.³ */
- $"4E69 B99F 25DF C3C0 1B9C 5455 41D2 F508" /* Ni¹Ÿ%ßÃÀ.œTUAÒõ. */
- $"9900 1F13 B43E C345 C4B3 C066 8A27 C3D3" /* ™...´>ÃEijÀfŠ'ÃÓ */
- $"7A8A 6368 2F2C 3F2F 5D43 59ED 5E40 9E4F" /* zŠch/,?/]CYí^@žO */
- $"59BB 6A03 B7F8 083A 021D F8F0 79AF 43B0" /* Y»j.·ø.:..øðy¯C° */
- $"2270 F775 B8D8 FB59 371A 8B22 9F0B 55FA" /* "p÷u¸ØûY7.‹"Ÿ.Uú */
- $"C9B1 5565 0914 AA67 2D9E 81B2 60FC 1333" /* ɱUeÆ.ªg-ž²`ü.3 */
- $"318F 21E9 97E4 1400 F69E F709 7AE3 82A5" /* 1!é—ä..öž÷Æzã‚¥ */
- $"C9DE 7D16 1DF8 EDF8 FC5E DB3E FC2A F822" /* ÉÞ}..øíøü^Û>ü*ø" */
- $"886E F247 9BC1 250E 905C 4AF7 4B22 3595" /* ˆnòG›Á%.\J÷K"5• */
- $"0835 2567 EEC1 C4C8 B70D D782 6A22 C9DA" /* .5%gîÁÄÈ·.ׂj"ÉÚ */
- $"ADA3 0370 EED9 E428 E163 963A E6F0 5D4A" /* ­£.pîÙä(ác–:æð]J */
- $"F42A D11F B46D 7FBC 2D87 4274 4756 896E" /* ô*Ñ.´m.¼-‡BtGV‰n */
- $"C489 80C0 62F6 88A8 184A 79BE 3068 A9AF" /* ĉ€Àböˆ¨.Jy¾0h©¯ */
- $"D703 390B 1A76 3136 B799 726A AAA8 C23D" /* ×.9..v16·™rjª¨Â= */
- $"EEB0 E0F1 49E1 A6B7 204F 7BF3 6E44 F25E" /* î°àñIᦷ O{ónDò^ */
- $"7E0A 5125 CA89 B477 15CD 83CC CD21 C6BE" /* ~ÂQ%ʉ´w.̓ÌÍ!ƾ */
- $"F20B 99F3 C30C 5113 2E0A FF7E 1034 1BFF" /* ò.™óÃ.Q..Âÿ~.4.ÿ */
- $"0378 72CF B0EE D132 2A2D 14A9 E37F 6B10" /* .xrÏ°îÑ2*-.©ã.k. */
- $"B5CE 0500 0000 0000 0000 0160 A7E3 A715" /* µÎ.........`§ã§. */
- $"0C13 DE44 025B 9720 0000 0000 0000 0001" /* ..ÞD.[— ........ */
- $"E0F5 5A21 77FB C1F6 EAF0 244A EE78 B6FA" /* àõZ!wûÁöêð$Jîx¶ú */
- $"1769 3D98 AA28 2EB6 9826 A16B D6B8 BA89" /* .i=˜ª(.¶˜&¡kÖ¸º‰ */
- $"26C6 25C9 9E66 FD9C 6D2D FCDA FCB9 6AB2" /* &Æ%Éžfýœm-üÚü¹j² */
- $"B42A 7008 5069 CB61 D530 B47A FCFF 7F95" /* ´*p.PiËaÕ0´züÿ.• */
- $"FA58 2D11 111A 53BF FB17 59E1 63E7 0FAD" /* úX-...S¿û.Yácç.­ */
- $"B016 A862 3107 8DF0 7112 DD6A B6E3 2477" /* °.¨b1.ðq.Ýj¶ã$w */
- $"3162 94F0 6826 75B0 D0B8 4C13 21C7 E4BC" /* 1b”ðh&u°Ð¸L.!Çä¼ */
- $"FB86 7A83 DF1C A4D9 C3B4 E3DE C334 1633" /* û†zƒß.¤ÙôãÞÃ4.3 */
- $"DC27 76B9 7ADF 50CA F95E C7C9 D5EB 402C" /* Ü'v¹zßPÊù^ÇÉÕë@, */
- $"276F A0B0 D88B CF4A 0FD2 380A E3E7 2BA5" /* 'o °Ø‹ÏJ.Ò8Âãç+¥ */
- $"DD24 A247 B631 75B1 6D3A 4C60 9BAB E4C5" /* Ý$¢G¶1u±m:L`›«äÅ */
- $"BBCB 2972 36B9 AC74 5FF5 B5DB 231B 95F3" /* »Ë)r6¹¬t_õµÛ#.•ó */
- $"7CFF 8E5F 86E9 1906 B3DF 75C7 0364 6192" /* |ÿŽ_†é..³ßuÇ.da’ */
- $"A000 0000 0000 0000 0000 003B B1A0 0000" /*  ..........;± .. */
- $"0000 0000 0000 0000 0000 0016 D51B CEEA" /* ............Õ.Îê */
- $"0406 C003 4E50 C0B8 8DB2 F37C FF8E 5F86" /* ..À.NPÀ¸²ó|ÿŽ_† */
- $"E919 06B3 DF75 C703 6461 92A0 0000 0000" /* é..³ßuÇ.da’ .... */
- $"0000 0000 0000 3BB1 A000 0000 0000 0000" /* ......;± ....... */
- $"0000 0000 0000 16D5 1BCE EA04 06C0 034E" /* .......Õ.Îê..À.N */
- $"50C0 B88D B2F4 4BED 0C57 2F64 38E7 DFE6" /* PÀ¸²ôKí.W/d8çßæ */
- $"95DB 93EF B9ED 1250 6A6A A6E3 4478 1E7E" /* •Û“ï¹í.Pjj¦ãDx.~ */
- $"F105 8E1B 961B 230C 9500 0000 0000 0C18" /* ñ.Ž.–.#.•....... */
- $"0EA3 5F13 6306 E1B5 4B22 3D26 79A1 06E4" /* .£_.c.áµK"=&y¡.ä */
- $"228F F320 0B74 8820 0000 0000 0000 0007" /* "ó .tˆ ........ */
- $"9F62 443B 9A51 EAB0 7C1A A374 E7F1 52F3" /* ŸbD;šQê°|.£tçñRó */
- $"3BB8 C1E0 5919 6C04 A2E2 1032 6917 1394" /* ;¸ÁàY.l.¢â.2i..” */
- $"CCBE 472A 0652 C144 6D1E 755C ECF9 9725" /* ̾G*.RÁDm.u\ìù—% */
- $"A84A 55AE 7A0E 6730 FCA7 B6E0 FF31 08C0" /* ¨JU®z.g0ü§¶àÿ1.À */
- $"3E76 4DDC 9E24 A60B C4A7 4CDD C221 1941" /* >vMÜž$¦.ħLÝÂ!.A */
- $"0810 2DE3 206F C551 4910 77AA 762A 1FF2" /* ..-ã oÅQI.wªv*.ò */
- $"D39A 0ADC 1089 90F8 D098 1E77 BDD1 AF74" /* ÓšÂÜ.‰øИ.w½Ñ¯t */
- $"4DEF D00D 0B2C CA2F 9EDC 27C4 35F9 F924" /* MïÐ..,Ê/žÜ'Ä5ùù$ */
- $"67FF 74E5 A746 B627 6267 F6D0 9B94 22D4" /* gÿtå§F¶'bgöЛ”"Ô */
- $"5FFE DF67 A7A9 E3CA 02A5 44D1 E926 DCA4" /* _þßg§©ãÊ.¥DÑé&ܤ */
- $"7490 4AB8 E094 7037 FF7C 8CF7 2A9B B784" /* tJ¸à”p7ÿ|Œ÷*›·„ */
- $"794E 9026 D48F FF7F F013 AABF F874 63DA" /* yN&Ôÿ.ð.ª¿øtcÚ */
- $"0302 FBFA AA6A 31D5 E2DF 85F7 2ACD D98C" /* ..ûúªj1Õâß…÷*ÍÙŒ */
- $"175D 1243 F1C0 CEA2 344C B6FC ADCF C6AA" /* .].CñÀ΢4L¶ü­Ïƪ */
- $"5CAE FA82 783F 58DD 754D 5C63 A018 19F8" /* \®ú‚x?XÝuM\c ..ø */
- $"7EFE 8953 AE16 22B9 4ED7 43D2 8A0B FA52" /* ~þ‰S®."¹N×CÒŠ.úR */
- $"5703 08CA 555B E51E 307B 0565 E165 22F3" /* W..ÊU[å.0{.eáe"ó */
- $"7130 0CEC CA23 576D 8D58 BED1 FEB6 9A2F" /* q0.ìÊ#WmX¾Ñþ¶š/ */
- $"DCEA 3288 3EEC B12A D43C B191 2627 7723" /* Üê2ˆ>ì±*Ô<±‘&'w# */
- $"F40F 1B7A F1E3 9A7E 366D 7490 EE80 3570" /* ô..zñãš~6mtî€5p */
- $"CB59 D05D F384 AA96 71FE 68E8 4D32 F9D2" /* ËYÐ]󄪖qþhèM2ùÒ */
- $"48BC 7B03 EA3B 879E 2E96 671F 8098 CE76" /* H¼{.ê;‡ž.–g.€˜Îv */
- $"87D8 0336 5C88 91F4 3C69 D76B 4DEF 29DA" /* ‡Ø.6\ˆ‘ô<i×kMï)Ú */
- $"F378 1035 720A CE61 C2E3 5776 CA53 F43B" /* óx.5rÂÎaÂãWvÊSô; */
- $"4FCB 79E4 5164 1270 A23E 6048 2089 7B12" /* OËyäQd.p¢>`H ‰{. */
- $"BCA8 E157 DFD5 E879 C14C 1B1A 3431 2856" /* ¼¨áWßÕèyÁL..41(V */
- $"0E74 D87F 7691 A923 632A 5EBC 6E95 6A46" /* .tØ.v‘©#c*^¼n•jF */
- $"8E68 7118 3704 6E41 37CB C9AC 7F84 1005" /* Žhq.7.nA7Ëɬ.„.. */
- $"C308 7C90 C6E0 B56C 8CF8 3C33 A97E C46C" /* Ã.|ÆàµlŒø<3©~Äl */
- $"E373 91A9 4A3F 7331 481D 843F 0472 59DC" /* ãs‘©J?s1H.„?.rYÜ */
- $"0837 85BA 4867 C202 6BFC 7433 F093 530F" /* .7…ºHgÂ.küt3ð“S. */
- $"D721 8927 26CF AA6B B4E1 7981 FCE4 9F4E" /* ×!‰'&Ϫk´áyüäŸN */
- $"1105 9E7B 7F68 1CE7 D811 E270 FCA3 9CDE" /* ..ž{.h.çØ.âpü£œÞ */
- $"BFE6 48BA AC07 B55E 4E7F 5946 115B B1DC" /* ¿æHº¬.µ^N.YF.[±Ü */
- $"F694 3A9B EADD 7971 E0F1 B6E1 C6FF 4337" /* ö”:›êÝyqàñ¶áÆÿC7 */
- $"F543 A074 FC74 AD1F 45BF 7867 C472 7605" /* õC tüt­.E¿xgÄrv. */
- $"1786 E496 2D22 22BE 5760 9ACE A5C9 22B9" /* .†ä–-""¾W`šÎ¥É"¹ */
- $"9A14 4136 93E4 3E4A 715C 6F69 8447 5764" /* š.A6“ä>Jq\oi„GWd */
- $"D761 77A8 2C3F E200 ACAD 8331 11D0 ABE6" /* ×aw¨,?â.¬­ƒ1.Ыæ */
- $"EA7B 5A22 58CF 097E 732F 894B E99C 6BAF" /* ê{Z"XÏÆ~s/‰Kéœk¯ */
- $"B36C 68AA 5668 EF92 66E9 DDF9 FF78 DB89" /* ³lhªVhï’féÝùÿxÛ‰ */
- $"FC78 2032 99D9 62F0 1380 3FE8 41DF F341" /* üx 2™Ùbð.€?èAßóA */
- $"F1FD 7F08 CE2E F09A 9335 6735 0FAD 8093" /* ñý..Î.ðš“5g5.­€“ */
- $"B6B1 53A2 964F EA7E 72A2 9A29 794D 98F0" /* ¶±S¢–Oê~r¢š)yM˜ð */
- $"DD57 AE65 C61E DDEC BDB4 35C2 D050 E063" /* ÝW®eÆ.Ýì½´5ÂÐPàc */
- $"5F54 BCA5 928D 786D CAE3 8F96 BFEB 027E" /* _T¼¥’xmÊã–¿ë.~ */
- $"6BBC 8795 7C88 1A2C 9908 36A1 6CAB 9268" /* k¼‡•|ˆ.,™.6¡l«’h */
- $"EB0D 816F F34D 55F5 B562 BCFF 4190 EE42" /* ë.oóMUõµb¼ÿAîB */
- $"F195 E7F3 E220 7E51 74A2 FA23 23F7 20F0" /* ñ•çóâ ~Qt¢ú##÷ ð */
- $"985F 011C 34B8 C988 C519 C623 81BC D026" /* ˜_..4¸ÉˆÅ.Æ#¼Ð& */
- $"A8C5 B82C 7A7F 86F7 E60E 44F2 CD53 6FAB" /* ¨Å¸,z.†÷æ.DòÍSo« */
- $"2D69 1FD4 75B7 A011 80E7 09B3 B9CF 4503" /* -i.Ôu· .€çƳ¹ÏE. */
- $"F4A5 1DE3 AE8A 96F7 E245 0DF9 3859 24FA" /* ô¥.㮊–÷âE.ù8Y$ú */
- $"7B43 665F B15E D4D3 FB2A 666E FB6A 6CA8" /* {Cf_±^ÔÓû*fnûjl¨ */
- $"9CAF C052 D658 6DC3 BDD1 C752 21FA 6426" /* œ¯ÀRÖXmýÑÇR!úd& */
- $"857C D05D 41C2 0241 306C 6FD4 81E3 69F7" /* …|Ð]AÂ.A0loÔãi÷ */
- $"A6F5 227F 39F9 780E 829A 17A9 C649 2BF5" /* ¦õ".9ùx.‚š.©ÆI+õ */
- $"01DD E500 A973 E599 890C A548 CE34 2877" /* .Ýå.©s噉.¥HÎ4(w */
- $"D160 A2EE 4B3B CC7A 0C87 6723 51FD C222" /* Ñ`¢îK;Ìz.‡g#QýÂ" */
- $"9BFB E72D 2769 6250 2054 22C9 ABB2 3125" /* ›ûç-'ibP T"É«²1% */
- $"7DA0 73A3 C083 1AAD 90F2 F0A8 C22D 9DF5" /* } s£Àƒ.­òð¨Â-õ */
- $"3FFB 6B56 18BE 61A6 B198 F1BC 1E4E 0CFE" /* ?ûkV.¾a¦±˜ñ¼.N.þ */
- $"B323 8275 A644 CAC4 D36B 9AF9 FCC8 5DEC" /* ³#‚u¦DÊÄÓkšùüÈ]ì */
- $"292B CC9B A0B6 9148 09DF E46D 1B2C 4EDF" /* )+Ì› ¶‘HÆßäm.,Nß */
- $"EDB9 2DB4 BAD5 C50B 2115 C476 E09A F407" /* í¹-´ºÕÅ.!.Ävàšô. */
- $"5EE8 2E9F 870F A319 32D4 EBEC CB7B FDE9" /* ^è.Ÿ‡.£.2ÔëìË{ýé */
- $"FB5C 0D41 61F3 BA97 0F9E 558F 6E39 C213" /* û\.Aaóº—.žUn9Â. */
- $"3101 A5E8 ECEC 15E5 4F29 F69A 58CD D82D" /* 1.¥èìì.åO)öšXÍØ- */
- $"986E E8E0 6898 17CC 98C4 C851 AC75 9306" /* ˜nèàh˜.̘ÄÈQ¬u“. */
- $"5241 0350 E2EB 38CA 1682 6132 FF45 578A" /* RA.Pâë8Ê.‚a2ÿEWŠ */
- $"FA7F 7557 AC2C 9A18 3835 A62B 7D09 0992" /* ú.uW¬,š.85¦+}ÆÆ’ */
- $"EF78 BD49 5317 373A B07D 6420 DC30 5067" /* ïx½IS.7:°}d Ü0Pg */
- $"A659 F316 4436 8E8E 9786 1163 A6A5 B841" /* ¦Yó.D6ŽŽ—†.c¦¥¸A */
- $"99AA 4E1C 6163 309A 3C23 0208 FF4B 2967" /* ™ªN.ac0š<#..ÿK)g */
- $"B7F7 37E4 A337 D0DC C48A A742 FB2D C529" /* ·÷7ä£7ÐÜÄŠ§Bû-Å) */
- $"BC6C 5BBE BC5C 03B1 F87F D7EA F5AC B94B" /* ¼l[¾¼\.±ø.×êõ¬¹K */
- $"5A88 84AB E44E BE6A F337 96B0 7CB6 1140" /* Zˆ„«äN¾jó7–°|¶.@ */
- $"25CB 45D6 BE02 A9D4 7868 1EDD F660 7963" /* %ËEÖ¾.©Ôxh.Ýö`yc */
- $"B438 C030 3EA5 51FA F451 FA84 A6FF 2E5A" /* ´8À0>¥QúôQú„¦ÿ.Z */
- $"EA95 2300 C0F4 39AA 42BA 4120 4EEC AFDD" /* ê•#.Àô9ªBºA Nì¯Ý */
- $"20B4 6C42 0552 1177 6F1A AC6D FE8B 98E1" /* ´lB.R.wo.¬mþ‹˜á */
- $"D3FB F52E BCE3 5BB1 7235 F597 3E0D 8C46" /* Óûõ.¼ã[±r5õ—>.ŒF */
- $"7361 1E2A C081 CA97 C8EA CD3F E91D 823F" /* sa.*ÀÊ—ÈêÍ?é.‚? */
- $"73A7 5EA1 F641 9CBD 219D D7E4 EE0D 270E" /* s§^¡öAœ½!×äî.'. */
- $"14DF F756 B4E5 062C 8251 4AD0 B090 A0AF" /* .ß÷V´å.,‚QJа ¯ */
- $"CD2A 3C80 6068 C9CD C3D7 3D7F 258B 365A" /* Í*<€`hÉÍÃ×=.%‹6Z */
- $"5E1A 90DC D058 4ED9 DF50 6F40 07A9 2BDE" /* ^.ÜÐXNÙßPo@.©+Þ */
- $"8486 5404 AB9C E323 0C4E D3DB 8352 0C0F" /* „†T.«œã#.NÓÛƒR.. */
- $"CD59 A5F5 56CC 0BB2 B603 85C3 C709 7D6E" /* ÍY¥õVÌ.²¶.…ÃÇÆ}n */
- $"A10E 33C2 AE0F D52F 5AD7 2279 E6EB 7E6C" /* ¡.3®.Õ/Z×"yæë~l */
- $"1757 589D C6DC B4FD 470C FFD9" /* .WXÆÜ´ýG.ÿÙ */
-};
-
diff --git a/indra/newview/installers/darwin/firstlook-dmg/_DS_Store b/indra/newview/installers/darwin/firstlook-dmg/_DS_Store
deleted file mode 100644
index 495ec37f53..0000000000
--- a/indra/newview/installers/darwin/firstlook-dmg/_DS_Store
+++ /dev/null
Binary files differ
diff --git a/indra/newview/installers/darwin/firstlook-dmg/_VolumeIcon.icns b/indra/newview/installers/darwin/firstlook-dmg/_VolumeIcon.icns
deleted file mode 100644
index da5307e389..0000000000
--- a/indra/newview/installers/darwin/firstlook-dmg/_VolumeIcon.icns
+++ /dev/null
Binary files differ
diff --git a/indra/newview/installers/darwin/firstlook-dmg/background.jpg b/indra/newview/installers/darwin/firstlook-dmg/background.jpg
deleted file mode 100644
index 55294dcc9a..0000000000
--- a/indra/newview/installers/darwin/firstlook-dmg/background.jpg
+++ /dev/null
Binary files differ
diff --git a/indra/newview/installers/darwin/fix_application_icon_position.sh b/indra/newview/installers/darwin/fix_application_icon_position.sh
index c6b92589db..618e34820c 100644
--- a/indra/newview/installers/darwin/fix_application_icon_position.sh
+++ b/indra/newview/installers/darwin/fix_application_icon_position.sh
@@ -1,6 +1,6 @@
# just run this script each time after you change the installer's name to fix the icon misalignment
#!/bin/bash
-cp -r ./../../../build-darwin-i386/newview/*.dmg ~/Desktop/TempBuild.dmg
+cp -r ../../../../build-darwin-i386/newview/*.dmg ~/Desktop/TempBuild.dmg
hdid ~/Desktop/TempBuild.dmg
open -a finder /Volumes/Second\ Life\ Installer
osascript dmg-cleanup.applescript
diff --git a/indra/newview/installers/darwin/publicnightly-dmg/Applications-alias.r b/indra/newview/installers/darwin/publicnightly-dmg/Applications-alias.r
deleted file mode 100644
index aa3cfb87d8..0000000000
--- a/indra/newview/installers/darwin/publicnightly-dmg/Applications-alias.r
+++ /dev/null
@@ -1,6996 +0,0 @@
-data 'alis' (0) {
- $"0000 0000 0112 0002 0001 036D 6277 0000" /* ...........mbw.. */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 C135 A717 482B 0000 0000" /* ......Á5§.H+.... */
- $"0002 0C41 7070 6C69 6361 7469 6F6E 7300" /* ...Applications. */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 00E2 4F18 C2E8 9FB0 0000 0000 0000" /* ...âO.Â蟰...... */
- $"0000 FFFF FFFF 0000 0920 0000 0000 0000" /* ..ÿÿÿÿ..Æ ...... */
- $"0000 0000 0000 0000 0003 6D62 7700 0010" /* ..........mbw... */
- $"0008 0000 C136 0987 0000 0011 0008 0000" /* ....Á6Ƈ........ */
- $"C2E9 0220 0000 0001 0000 0002 0010 6D62" /* Âé. ..........mb */
- $"773A 4170 706C 6963 6174 696F 6E73 000E" /* w:Applications.. */
- $"001A 000C 0041 0070 0070 006C 0069 0063" /* .....A.p.p.l.i.c */
- $"0061 0074 0069 006F 006E 0073 000F 0008" /* .a.t.i.o.n.s.... */
- $"0003 006D 0062 0077 0012 000C 4170 706C" /* ...m.b.w....Appl */
- $"6963 6174 696F 6E73 0013 0001 2F00 FFFF" /* ications..../.ÿÿ */
- $"0000" /* .. */
-};
-
-
-data 'icns' (-16455) {
- $"6963 6E73 0001 B3AC 6973 3332 0000 0224" /* icns..³¬is32...$ */
- $"9F00 005F 8061 005D 8700 055D 9AA2 A0A4" /* Ÿ.._€a.]‡..]š¢ ¤ */
- $"8986 0008 557D B3B2 B1B3 A881 8081 8104" /* ‰†..U}³²±³¨€. */
- $"826F 577E AF82 A801 B3AE 82AD 03AF 7B7A" /* ‚oW~¯‚¨.³®‚­.¯{z */
- $"A781 A203 9EB7 C89D 81A2 03A6 776E 9A80" /* §¢.ž·È¢.¦wnš€ */
- $"9705 959F D3DC A295 8097 5899 6C67 8F8D" /* —.•ŸÓÜ¢•€—X™lg */
- $"8E89 85C9 BCA9 C883 898D 8D8E 6561 8585" /* Ž‰…ɼ©Èƒ‰Žea…… */
- $"83A8 B7F3 BAB4 DFB6 AA84 8585 605E 7B7D" /* ƒ¨·óº´ß¶ª„……`^{} */
- $"79D0 F9E0 F0F2 DAE1 D87C 7D7B 5D5B 7476" /* yÐùàðòÚáØ|}{][tv */
- $"7099 D876 7373 76CA 8A72 7673 5B5A 6D70" /* p™ØvssvÊŠrvs[Zmp */
- $"6B9B 816C 6F6F 67B3 C567 706C 5A59 686B" /* k›loog³ÅgplZYhk */
- $"6B67 686B 806A 056B 6F6A 6B67 5A88 5900" /* kghk€j.kojkgZˆY. */
- $"5882 598A 5801 0059 9F00 0482 8383 8480" /* X‚YŠX..YŸ..‚ƒƒ„€ */
- $"8700 057F B7BE BDC0 A786 0008 799E D0CE" /* ‡...·¾½À§†..yžÐÎ */
- $"CECF C5A1 A081 A105 A390 7AA0 D0CA 80C9" /* ÎÏÅ¡ ¡.£z ÐÊ€É */
- $"01CA D183 CE03 D09C 9ECD 81C9 03C7 D4DE" /* .ÊуÎ.ÐœžÍÉ.ÇÔÞ */
- $"C681 C903 CD9A 94C5 80C2 05C1 C6E3 E9C8" /* ÆÉ.Íš”Å€Â.ÁÆãéÈ */
- $"C180 C20D C491 8DBD BBBC B9B6 DDD7 CCDD" /* Á€Â.Ä‘½»¼¹¶Ý×ÌÝ */
- $"B5B9 80BC 468B 87B4 B4B3 C8D1 F7D3 CFEA" /* µ¹€¼F‹‡´´³ÈÑ÷ÓÏê */
- $"D0C9 B4B4 B385 83AA ABA9 E0FB EAF5 F6E5" /* ÐÉ´´³…ƒª«©àûêõöå */
- $"EAE5 AAAB A981 80A0 A39E BAE4 A2A0 A1A2" /* ê媫©€ £žºä¢ ¡¢ */
- $"DAAF 9FA3 9F7F 7E97 9B97 B8A6 979A 9A94" /* Ú¯Ÿ£Ÿ.~—›—¸¦—šš” */
- $"CAD6 949B 977D 7D90 9493 9091 8293 0496" /* ÊÖ”›—}}”“‘‚“.– */
- $"9294 907D 8E7C 8A7B 0100 7C9F 0000 7A80" /* ’”}Ž|Š{..|Ÿ..z€ */
- $"7C00 7887 0005 77B1 B8B7 BBA0 8600 0871" /* |.x‡..w±¸·» †..q */
- $"97CB C9C8 CAC0 9B99 819A 049C 8972 99CA" /* —ËÉÈÊÀ›™š.œ‰r™Ê */
- $"82C3 00CB 83C8 03CA 9596 C681 C203 BFCF" /* ‚Ã.˃È.Ê•–ÆÂ.¿Ï */
- $"DABF 81C2 03C6 938C BD80 BA05 B9BF E0E7" /* Ú¿Â.Æ“Œ½€º.¹¿àç */
- $"C1B9 80BA 57BC 8985 B5B3 B3B0 ADD9 D2C6" /* Á¹€ºW¼‰…µ³³°­ÙÒÆ */
- $"D9AC B0B3 B3B4 827F ACAB AAC2 CCF6 CECA" /* Ù¬°³³´‚.¬«ªÂÌöÎÊ */
- $"E8CB C3AB ACAA 7D7B A1A3 A0DD FAE9 F4F5" /* èË묪}{¡£ Ýúéôõ */
- $"E3E8 E3A2 A3A0 7A78 989B 96B3 E29A 9898" /* ãè㢣 zx˜›–³âš˜˜ */
- $"9AD7 A897 9B97 7776 8F93 8FB2 9F8F 9292" /* š×¨—›—wv“²Ÿ’’ */
- $"8BC5 D28C 938F 7575 888C 8B89 8982 8B04" /* ‹ÅÒŒ“uuˆŒ‹‰‰‚‹. */
- $"8F8A 8C88 758E 748A 7301 0074 7338 6D6B" /* ŠŒˆuŽtŠs..ts8mk */
- $"0000 0108 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 1E24 2424 1600 0000 0000" /* .......$$$...... */
- $"0000 0000 0011 BDC8 C8C8 9600 0000 0000" /* ......½ÈÈÈ–..... */
- $"0000 0000 048C FFFF FFFF F5A7 9C9E 9E9E" /* .....Œÿÿÿÿõ§œžžž */
- $"9E9E 6003 8AFF FCFC FCFC FEFF FFFF FFFF" /* žž`.Šÿüüüüþÿÿÿÿÿ */
- $"FFFF FF7A 89FF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿz‰ÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FF7A 73FF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿzsÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FF64 62FF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿdbÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FF53 53FF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿSSÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FF45 48FF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿEHÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FF3C 41FF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿ<Aÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FD35 3DFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿý5=ÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FA30 3CFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿú0<ÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FB2F 1247 4B4A 4A4A 4A4A 4A4A 4A4A" /* ÿÿû/.GKJJJJJJJJJ */
- $"4A4B 450F 0101 0201 0101 0101 0101 0101" /* JKE............. */
- $"0102 0001 696C 3332 0000 05AB FF00 BE00" /* ....il32...«ÿ.¾. */
- $"025A 7881 847F 0064 9200 0262 BBC4 83C2" /* .Zx„..d’..b»ÄƒÂ */
- $"02C7 8451 9000 0255 86BF 84BC 03BF A064" /* .Ç„Q..U†¿„¼.¿ d */
- $"6389 6400 6281 0003 5770 A2A2 85A1 01A3" /* c‰d.b..Wp¢¢…¡.£ */
- $"9D89 9B07 9C97 6758 005B 95AC 88A7 02A8" /* ‰›.œ—gX.[•¬ˆ§.¨ */
- $"A4A7 89A8 05AB 925A 61A7 AE88 AC03 ABCA" /* ¤§‰¨.«’Za§®ˆ¬.«Ê */
- $"AEAB 88AC 05AE A15E 5B9A A788 A503 A0D7" /* ®«ˆ¬.®¡^[š§ˆ¥. × */
- $"D79F 88A5 05A8 9559 5990 A288 9F04 9BAB" /* ןˆ¥.¨•YY¢ˆŸ.›« */
- $"FBAE 9C87 9F05 A28B 5857 879D 879A 0595" /* û®œ‡Ÿ.¢‹XW‡‡š.• */
- $"BDD6 E6E3 9487 9A05 9D82 5656 7F97 8594" /* ½Öæ㔇š.‚VV.—…” */
- $"0995 8FB3 F4CF B1FF AD90 9585 9405 977A" /* Æ•³ôϱÿ­•…”.—z */
- $"0000 7793 8690 078D CDF8 B886 E8E5 8B86" /* ..w“†.Íø¸†è勆 */
- $"9005 9372 0000 708F 828C 808B 0984 BBF7" /* .“r..p‚Œ€‹Æ„»÷ */
- $"C687 85AB FFA9 8580 8B82 8C05 8E6D 0000" /* Ƈ…«ÿ©…€‹‚Œ.Žm.. */
- $"6B8A 8287 0D88 8785 8FF3 FDA1 8186 84E5" /* kŠ‚‡.ˆ‡…óý¡†„å */
- $"E484 8684 8705 8868 0000 6685 8183 117E" /* 䄆„‡.ˆh..f…ƒ.~ */
- $"B3E3 D0D2 FFDC D4DF DDDB D2FD D0DE E2B7" /* ³ãÐÒÿÜÔßÝÛÒýÐÞâ· */
- $"8082 8304 6400 0062 8081 7F06 76C5 FFDB" /* €‚ƒ.d..b€..vÅÿÛ */
- $"F9F3 E381 FF06 F6D4 BFF4 FFD3 7882 7F03" /* ùóãÿ.öÔ¿ôÿÓx‚.. */
- $"6100 005F 827B 0675 B0D9 E1FF C8D8 82DF" /* a.._‚{.u°ÙáÿÈØ‚ß */
- $"05BF F3C9 DCB9 7681 7B04 7A5E 0000 5C82" /* .¿óÉܹv{.z^..\‚ */
- $"7706 786F 96FF E879 7281 7306 7278 C8C2" /* w.xo–ÿèyrs.rxÈÂ */
- $"7074 7880 7706 7875 5C00 005A 7382 7405" /* ptx€w.xu\..Zs‚t. */
- $"71C1 E19A 6D74 8173 0574 6BA2 FFAD 6C81" /* qÁášmts.tk¢ÿ­l */
- $"7406 7571 5B00 005A 6F81 7104 6F77 F2AF" /* t.uq[..Zoq.owò¯ */
- $"6984 7105 6E7E FAFB 836D 8071 0772 6D5A" /* i„q.n~úûƒm€q.rmZ */
- $"0000 586C 6F80 6E03 6C7B 9368 866E 0467" /* ..Xlo€n.l{“h†n.g */
- $"C3FA 8B69 806E 076F 6A59 0000 586A 6E81" /* Ãú‹i€n.ojY..Xjn */
- $"6D01 6C68 876D 036B 717D 6B81 6D07 6E69" /* m.lh‡m.kq}km.ni */
- $"5900 0058 666A 8E69 0168 6682 6903 6A65" /* Y..XfjŽi.hf‚i.je */
- $"5900 BD59 0000 9B59 9E00 FF00 BE00 027D" /* Y.½Y..›Yž.ÿ.¾..} */
- $"98A0 829E 029F 9E85 9200 0284 D5DE 83DC" /* ˜ ‚ž.Ÿž…’..„ÕÞƒÜ */
- $"02E0 A275 9000 0279 A7DB 84D8 03DB BD87" /* .à¢u..y§Û„Ø.Û½‡ */
- $"8689 8700 8581 0003 7A92 C0C0 85BF 01C0" /* †‰‡.…..z’ÀÀ…¿.À */
- $"BB89 B907 BAB4 887B 007E B7CC 88C7 01C8" /* »‰¹.º´ˆ{.~·ÌˆÇ.È */
- $"C68A C805 CBB2 7C84 CAD1 89CF 02DE CFCE" /* ÆŠÈ.˲|„ÊщÏ.ÞÏÎ */
- $"88CF 05D2 C380 7FBF CC88 CA03 C7E8 E5C6" /* ˆÏ.ÒÀ.¿ÌˆÊ.ÇèåÆ */
- $"88CA 05CD B87C 7CB7 CA88 C704 C4CD FCCD" /* ˆÊ.͸||·ÊˆÇ.ÄÍüÍ */
- $"C587 C705 CAB0 7A7A AFC7 87C4 05C1 D4E3" /* ŇÇ.Ê°zz¯Ç‡Ä.ÁÔã */
- $"F0ED C087 C405 C8A8 7979 A7C4 85C0 09C1" /* ðíÀ‡Ä.Ȩyy§Ä…ÀÆÁ */
- $"BDD0 F7E1 D1FF CDBE C185 C005 C4A1 0000" /* ½Ð÷áÑÿ;Á…À.Ä¡.. */
- $"A0C1 86BD 07BA DEFB D5B7 F2EE B986 BD05" /*  Á†½.ºÞûÕ·ò½. */
- $"C09A 0000 9ABE 85BA 09B6 D4F9 DBB8 B6CD" /* Àš..š¾…ºÆ¶ÔùÛ¸¶Í */
- $"FFCA B785 BA05 BD94 0000 94B9 83B6 0EB4" /* ÿÊ·…º.½”..”¹ƒ¶.´ */
- $"B3B9 F7FE C4B0 B4B2 EFED B2B4 B4B5 82B6" /* ³¹÷þÄ°´²ïí²´´µ‚¶ */
- $"05B8 8F00 008E B481 B211 AFCD EBDF E0FF" /* .¸..Ž´².¯Íëßàÿ */
- $"E8E2 E9E8 E6E0 FEDF E8EA D0B0 81B2 05B3" /* èâéèæàþßèêа².³ */
- $"8A00 0089 AF81 AD06 A8D9 FFE7 FBF7 EB81" /* Š..‰¯­.¨Ùÿçû÷ë */
- $"FF06 F9E1 D3F8 FFE3 A980 AD05 AEAD 8600" /* ÿ.ùáÓøÿã©€­.®­†. */
- $"0086 82A9 06A5 CBE5 EAFF DAE5 82EA 05D3" /* .†‚©.¥ËåêÿÚå‚ê.Ó */
- $"F7DA E8D1 A680 A906 AAA7 8300 0082 A382" /* ÷ÚèѦ€©.ª§ƒ..‚£‚ */
- $"A405 9FB7 FFF0 A5A1 81A2 05A1 A5D9 D39F" /* ¤.Ÿ·ÿ𥡢.¡¥ÙÓŸ */
- $"A281 A406 A5A1 8000 0080 9F82 A004 9ED2" /* ¢¤.¥¡€..€Ÿ‚ .žÒ */
- $"E9BA 9B83 A004 9ABF FFC5 9A81 A007 A19C" /* 麛ƒ .š¿ÿÅš .¡œ */
- $"7F00 007E 999D 809B 059A 9FF6 C696 9C83" /* ...~™€›.šŸöÆ–œƒ */
- $"9B05 99A4 FBFB A799 809B 079C 977D 0000" /* ›.™¤ûû§™€›.œ—}.. */
- $"7C95 9980 9803 97A1 B295 8698 0494 D5FC" /* |•™€˜.—¡²•†˜.”Õü */
- $"AC95 8098 0799 937C 0000 7C93 9782 9600" /* ¬•€˜.™“|..|“—‚–. */
- $"9387 9603 9599 A295 8196 0797 917C 0000" /* “‡–.•™¢•–.—‘|.. */
- $"7B8E 928D 9102 9290 8F82 9103 928C 7B00" /* {Ž’‘.’‚‘.’Œ{. */
- $"BD7C 0000 9B7C 9E00 FF00 BE00 0275 9199" /* ½|..›|ž.ÿ.¾..u‘™ */
- $"8498 007E 9200 027D D0D9 83D7 02DB 9B6C" /* „˜.~’..}ÐÙƒ×.Û›l */
- $"9000 0271 A0D5 84D2 03D5 B67F 7E89 7F00" /* ..q Õ„Ò.Õ¶.~‰.. */
- $"7D81 0003 728B BBBB 85BA 02BB B6B3 88B4" /* }..r‹»»…º.»¶³ˆ´ */
- $"08B5 AF81 7300 76B0 C6C2 87C1 01C2 C089" /* .µ¯s.v°Æ‡Á.ÂÀ‰ */
- $"C206 C3C5 AB75 7CC3 CA89 C801 DBC9 89C8" /* Â.ÃÅ«u|ÃʉÈ.ÛÉ‰È */
- $"05CB BD78 77B9 C588 C304 C0E5 E2BF C487" /* .˽xw¹ÅˆÃ.Àåâ¿Ä‡ */
- $"C305 C6B2 7574 B0C3 87C0 05BF BCC7 FCC7" /* Ã.Ʋut°Ã‡À.¿¼ÇüÇ */
- $"BE87 C005 C3A9 7272 A7BF 87BC 05B9 D0E1" /* ¾‡À.érr§¿‡¼.¹Ðá */
- $"EEEB B887 BC05 C0A1 7171 A0BC 86B8 07B5" /* î븇¼.À¡qq ¼†¸.µ */
- $"CBF6 DDCB FFC7 B586 B805 BB99 0000 98B9" /* ËöÝËÿǵ†¸.»™..˜¹ */
- $"86B5 07B2 DBFA D0AE F0EC B186 B505 B892" /* †µ.²ÛúЮð챆µ.¸’ */
- $"0000 91B5 82B2 80B1 09AC D0F9 D7AF ADC7" /* ..‘µ‚²€±Æ¬Ðùׯ­Ç */
- $"FFC4 AD80 B182 B205 B48C 0000 8BB1 81AD" /* ÿÄ­€±‚².´Œ..‹±­ */
- $"11AE ADAC ABB1 F6FD BDA8 ABAA EDEB A9AB" /* .®­¬«±öý½¨«ªíë©« */
- $"ACAC AE81 AD05 AF87 0000 86AB 81A9 11A6" /* ¬¬®­.¯‡..†«©.¦ */
- $"C8E9 DCDE FFE5 DFE7 E6E4 DDFE DCE6 E9CB" /* ÈéÜÞÿåßçæäÝþÜæéË */
- $"A781 A905 AA82 0000 81A6 81A5 069F D6FF" /* §©.ª‚..¦¥.ŸÖÿ */
- $"E4FA F6EA 81FF 06F8 DFCF F7FF E0A0 80A5" /* äúöêÿ.øßÏ÷ÿà €¥ */
- $"05A6 A47E 0000 7D82 A006 9BC6 E3E8 FFD6" /* .¦¤~..}‚ .›ÆãèÿÖ */
- $"E282 E805 CFF6 D7E6 CC9C 80A0 06A1 9E7B" /* â‚è.Ïö×æÌœ€ .¡ž{ */
- $"0000 7A9B 829C 0496 B1FF EF9D 8399 049C" /* ..z›‚œ.–±ÿ.œ */
- $"D6D0 969A 819C 069D 9979 0000 7897 8198" /* ÖЖšœ.™y..x—˜ */
- $"0597 95CF E7B4 9283 9704 91BA FFC0 9181" /* .—•Ïç´’ƒ—.‘ºÿÀ‘ */
- $"9807 9994 7700 0076 9295 8094 0493 98F5" /* ˜.™”w..v’•€”.“˜õ */
- $"C28E 8494 0592 9DFB FBA0 9180 9407 958F" /* ÂŽ„”.’ûû ‘€”.• */
- $"7500 0074 8E91 8090 038F 9AAC 8C86 9004" /* u..tŽ‘€.š¬Œ†. */
- $"8BD1 FBA6 8C80 9007 918B 7400 0074 8B8F" /* ‹Ñû¦Œ€.‘‹t..t‹ */
- $"808E 048F 8E8B 8E8F 848E 048F 8D91 9B8D" /* €Ž.Ž‹Ž„Ž.‘› */
- $"818E 078F 8974 0000 7487 8B8E 8A01 8987" /* Ž.‰t..t‡‹ŽŠ.‰‡ */
- $"828A 038B 8574 00BD 7400 009B 749E 006C" /* ‚Š.‹…t.½t..›tž.l */
- $"386D 6B00 0004 0800 0000 0000 0000 0000" /* 8mk............. */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0B76 8889 8989" /* ...........vˆ‰‰‰ */
- $"8989 8988 3800 0000 0000 0000 0000 0000" /* ‰‰‰ˆ8........... */
- $"0000 0000 0000 0000 0000 36FF FFFF FFFF" /* ..........6ÿÿÿÿÿ */
- $"FFFF FFFF A301 0000 0000 0000 0000 0000" /* ÿÿÿÿ£........... */
- $"0000 0000 0000 0000 0006 A4FF FFFF FFFF" /* ..........¤ÿÿÿÿÿ */
- $"FFFF FFFF DE59 3F40 4040 4040 4040 4040" /* ÿÿÿÿÞY?@@@@@@@@@ */
- $"4040 4033 0000 0000 1384 F8F3 F3F3 F3F3" /* @@@3.....„øóóóóó */
- $"F3F3 F3F3 F7F9 F7F7 F7F7 F7F7 F7F7 F7F7" /* óóóó÷ù÷÷÷÷÷÷÷÷÷÷ */
- $"F7F7 F7F1 520D 001D E1FF FAFB FBFB FBFB" /* ÷÷÷ñR...áÿúûûûûû */
- $"FBFB FBFB FBFB FBFB FBFB FBFB FBFB FBFB" /* ûûûûûûûûûûûûûûûû */
- $"FBFB FBFB FFCD 0E39 FFFF FFFF FFFF FFFF" /* ûûûûÿÍ.9ÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFF8 1F26 F6FF FFFF FFFF FFFF" /* ÿÿÿÿÿø.&öÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFE5 1318 ECFF FFFF FFFF FFFF" /* ÿÿÿÿÿå..ìÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFD5 0A0F DDFF FFFF FFFF FFFF" /* ÿÿÿÿÿÕÂ.Ýÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFC6 0206 D0FF FFFF FFFF FFFF" /* ÿÿÿÿÿÆ..Ðÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFB6 0000 C2FF FFFF FFFF FFFF" /* ÿÿÿÿÿ¶..Âÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFA5 0000 B2FF FFFF FFFF FFFF" /* ÿÿÿÿÿ¥..²ÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FF95 0000 A4FF FFFF FFFF FFFF" /* ÿÿÿÿÿ•..¤ÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FF87 0000 96FF FFFF FFFF FFFF" /* ÿÿÿÿÿ‡..–ÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FF7A 0000 8AFF FFFF FFFF FFFF" /* ÿÿÿÿÿz..Šÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FF6D 0000 7FFF FFFF FFFF FFFF" /* ÿÿÿÿÿm...ÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FF63 0000 77FF FFFF FFFF FFFF" /* ÿÿÿÿÿc..wÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FF5A 0000 6FFF FFFF FFFF FFFF" /* ÿÿÿÿÿZ..oÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FF54 0000 69FF FFFF FFFF FFFF" /* ÿÿÿÿÿT..iÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FF4F 0000 65FF FFFF FFFF FFFF" /* ÿÿÿÿÿO..eÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FF4C 0000 64FF FFFF FFFF FFFF" /* ÿÿÿÿÿL..dÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FF4B 0000 61FF FFFF FFFF FFFF" /* ÿÿÿÿÿK..aÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FF48 0004 2C6D 7574 7474 7474" /* ÿÿÿÿÿH..,muttttt */
- $"7474 7474 7474 7474 7474 7474 7474 7474" /* tttttttttttttttt */
- $"7474 7475 6824 0202 0D18 1C1C 1C1C 1C1C" /* tttuh$.......... */
- $"1C1C 1C1C 1C1C 1C1C 1C1C 1C1C 1C1C 1C1C" /* ................ */
- $"1C1C 1C1C 170C 0100 0103 0303 0303 0303" /* ................ */
- $"0303 0303 0303 0303 0303 0303 0303 0303" /* ................ */
- $"0303 0303 0301 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0069 6833 3200 0009 DEFF" /* .......ih32..ÆÞÿ */
- $"00FF 00FF 00AD 0001 5E66 8865 0261 5859" /* .ÿ.ÿ.­..^fˆe.aXY */
- $"9C00 025E A6BA 87B7 04B9 AE67 5659 9B00" /* œ..^¦º‡·.¹®gVY›. */
- $"0266 BABF 87BE 04BF BC70 5459 9A00 0252" /* .fº¿‡¾.¿¼pTYš..R */
- $"81BD 89BA 03BC 8652 5491 5585 0003 5580" /* ½‰º.¼†RT‘U…..U€ */
- $"B7BA 89B9 02BA B497 918F 0191 7683 0003" /* ·º‰¹.º´—‘.‘vƒ.. */
- $"5864 9399 8B97 0098 929B 039D 855F 5A80" /* Xd“™‹—.˜’›.…_Z€ */
- $"0002 649D A990 A500 A490 A509 A6A9 9B65" /* ..d©¥.¤¥Æ¦©›e */
- $"0000 85B4 AFAF 8EAE 03B0 AEAC AF8E AE07" /* ..…´¯¯Ž®.°®¬¯Ž®. */
- $"AFAF B280 0000 80AD 8FA9 04A8 B2E7 ACA8" /* ¯¯²€..€­©.¨²ç¬¨ */
- $"90A9 05AB 7A00 0076 A98F A604 A5A4 F1E0" /* ©.«z..v©¦.¥¤ñà */
- $"A08F A606 A7A6 7100 006D A390 A204 9DC8" /*  ¦.§¦q..m£¢.È */
- $"FFB9 9C8E A207 A3A0 6A00 0065 9D9F 8D9E" /* ÿ¹œŽ¢.£ j..eŸž */
- $"069F 9C96 A2FA EF9C 8E9E 079F 9A65 0000" /* .Ÿœ–¢úž.Ÿše.. */
- $"6097 9C8D 9B07 97A5 E2C6 D2FF C394 8D9B" /* `—œ›.—¥âÆÒÿÔ› */
- $"079C 9461 0000 5E90 988C 9709 959A D5CE" /* .œ”a..^˜Œ—Æ•šÕÎ */
- $"E4B2 FCF4 9A95 8C97 0799 8D5E 0000 5A8B" /* ä²üôš•Œ—.™^..Z‹ */
- $"968C 9409 8EC8 FFF6 C18D DDFF C78C 8C94" /* –Œ”ÆŽÈÿöÁÝÿÇŒŒ” */
- $"0796 875B 0000 5885 938B 910B 8F8F E5FF" /* .–‡[..X…“‹‘.åÿ */
- $"FFA9 87AA FFF7 988E 8B91 0793 8159 0000" /* ÿ©‡ªÿ÷˜Ž‹‘.“Y.. */
- $"577F 908B 8E0B 87CF D4D0 CA89 8D8B E0FF" /* W.‹Ž.‡ÏÔÐʉ‹àÿ */
- $"C786 8B8E 0790 7B58 0000 5779 8C86 8A81" /* dž‹Ž.{X..WyŒ†Š */
- $"8B0D 84A5 FFFF E38B 898B 85A8 FFF8 9387" /* ‹.„¥ÿÿ㋉‹…¨ÿø“‡ */
- $"818B 868A 078C 7557 0000 5674 8A85 8800" /* ‹†Š.ŒuW..VtŠ…ˆ. */
- $"8680 820E 8385 E4FF FFB9 7C83 8381 7FDD" /* †€‚.ƒ…äÿÿ¹|ƒƒ.Ý */
- $"FFC6 7E81 8200 8585 8807 8A71 5759 0056" /* ÿÆ~‚.……ˆ.ŠqWY.V */
- $"6F87 8485 1983 929F A3A0 94B0 FFFF E39D" /* o‡„….ƒ’Ÿ£ ”°ÿÿã */
- $"9F9E 9DA3 9AB0 FBF4 98A0 A09F A192 8484" /* Ÿž£š°ûô˜  Ÿ¡’„„ */
- $"8507 876D 5759 0056 6984 8482 197C A7EB" /* ….‡mWY.Vi„„‚.|§ë */
- $"FBF1 C2EC FFFB C1ED F2F6 ECFB EDD9 DBFF" /* ûñÂìÿûÁíòöìûíÙÛÿ */
- $"D4EE F0F6 F6B7 7C84 8207 8369 5700 5956" /* Ôîðöö·|„‚.ƒiW.YV */
- $"6481 847F 0979 A3FF FFEB CCFF FFD5 E084" /* d„.Æy£ÿÿëÌÿÿÕà„ */
- $"FF03 C8F1 BCC4 80FF 01C0 7785 7F06 6557" /* ÿ.Èñ¼Ä€ÿ.Àw…..eW */
- $"5959 5661 7E84 7D08 76A3 FFFF C3F4 FFF5" /* YYVa~„}.v£ÿÿÃôÿõ */
- $"CB85 FF08 EDA8 CCC0 F2FF FFC1 7485 7D06" /* Ë…ÿ.í¨ÌÀòÿÿÁt…}. */
- $"6358 5959 575E 7B84 7A09 7692 D0BE D6FF" /* cXYYW^{„zÆv’оÖÿ */
- $"FFC2 B9D0 84CF 08CD B9FF F1B1 CED0 A574" /* ÿ¹ЄÏ.͹ÿñ±ÎÐ¥t */
- $"847A 0679 6058 5959 585D 8678 0776 6A9C" /* „z.y`XYYX]†x.vjœ */
- $"FFFF F081 7086 7106 75D1 D89D 6A71 7484" /* ÿÿðp†q.uÑØjqt„ */
- $"7808 7976 5E58 5959 585B 7486 7505 73B9" /* x.yv^XYYX[t†u.s¹ */
- $"F5FF AC6D 8775 0570 8CEB F889 6F85 7508" /* õÿ¬m‡u.pŒëø‰o…u. */
- $"7672 5C58 5959 5859 7285 7306 6F8A E1C6" /* vr\XYYXYr…s.oŠáÆ */
- $"C176 7287 7306 7179 EEFF E173 7184 7308" /* Ávr‡s.qyîÿásq„s. */
- $"7470 5B58 5959 5859 7085 7205 6B97 FFE7" /* tp[XYYXYp…r.k—ÿç */
- $"776E 8972 0569 C6FF FFB4 6A84 7202 736E" /* wn‰r.iÆÿÿ´j„r.sn */
- $"5A81 5901 586D 856F 0567 B9D9 786B 7089" /* ZY.Xm…o.g¹Ùxkp‰ */
- $"6F06 6993 FFFF F173 6D83 6F01 706B 8259" /* o.i“ÿÿñsmƒo.pk‚Y */
- $"0157 6B85 6E03 6C8C 7269 8B6E 066D 6BD3" /* .Wk…n.lŒri‹n.mkÓ */
- $"FFCB 6C6D 836E 026F 6958 8159 0256 6A6E" /* ÿËlmƒn.oiXY.Vjn */
- $"856D 0169 6B8D 6D04 6A73 8A6D 6B84 6D02" /* …m.ikm.jsŠmk„m. */
- $"6E68 5881 5902 566A 6E98 6D02 6B67 6C85" /* nhXY.Vjn˜m.kgl… */
- $"6D02 6E68 5881 5902 5665 69A3 6802 6963" /* m.nhXY.Vei£h.ic */
- $"5881 5901 5858 A559 0058 B059 0000 AB59" /* XY.XX¥Y.X°Y..«Y */
- $"8000 A959 DF00 FF00 FF00 FF00 AD00 0081" /* €.©Yß.ÿ.ÿ.ÿ.­.. */
- $"8987 0283 7B7C 9C00 0280 C1D3 87D1 04D2" /* ‰‡.ƒ{|œ..€ÁÓ‡Ñ.Ò */
- $"C787 7A7C 9B00 0288 D4DA 87D9 04DA D68F" /* LJz|›..ˆÔÚ‡Ù.ÚÖ */
- $"787C 9A00 0276 A2D8 89D6 02D7 A476 9278" /* x|š..v¢Ø‰Ö.פv’x */
- $"8500 0379 A2D3 D789 D503 D6D0 B5AD 90AE" /* …..y¢Ó׉Õ.Öе­® */
- $"01B0 9683 0003 7C87 B1B7 8BB5 00B6 92B9" /* .°–ƒ..|‡±·‹µ.¶’¹ */
- $"03BA A282 7D80 0003 87BD C8C5 90C4 00C5" /* .º¢‚}€..‡½ÈÅÄ.Å */
- $"8FC4 08C5 C8B9 8700 00A7 D6D1 90D0 01CD" /* Ä.Åȹ‡..§ÖÑÐ.Í */
- $"CF90 D006 D1D3 A000 00A3 D18F CD04 CCD1" /* ÏÐ.ÑÓ ..£ÑÍ.ÌÑ */
- $"EECC CC90 CD05 CF9B 0000 9ACE 90CB 03CA" /* îÌÌÍ.Ï›..šÎË.Ê */
- $"F7E9 C68F CB07 CCCB 9300 0091 C9C9 8FC8" /* ÷éÆË.ÌË“..‘ÉÉÈ */
- $"04C6 DFFF D2C5 8EC8 07C9 C68D 0000 8BC5" /* .ÆßÿÒÅŽÈ.ÉÆ..‹Å */
- $"C78D C606 C7C5 BFC7 FDF3 C38E C607 C7C0" /* ÇÆ.ÇÅ¿ÇýóÃŽÆ.ÇÀ */
- $"8800 0086 C0C5 8DC4 07C2 C7EB DAE4 FFD9" /* ˆ..†ÀÅÄ.ÂÇëÚäÿÙ */
- $"C08D C407 C6BC 8400 0082 BBC4 8CC2 09C1" /* ÀÄ.Ƽ„..‚»ÄŒÂÆÁ */
- $"C2E2 DEED D1FD F7C1 C18C C207 C4B6 8100" /* ÂâÞíÑý÷ÁÁŒÂ.Ķ. */
- $"007F B5C2 8CC0 09BC DBFF F8D7 BBEA FFDB" /* ..µÂŒÀƼÛÿø×»êÿÛ */
- $"BA8C C007 C2B0 7E00 007C B0C0 8BBE 0BBD" /* ºŒÀ.°~..|°À‹¾.½ */
- $"BAED FFFF CCB8 CCFF F9BF BC8B BE07 C0AA" /* ºíÿÿ̸Ìÿù¿¼‹¾.Àª */
- $"7C00 007B ABBF 8BBC 0BB7 DEE1 DFDF B9BB" /* |..{«¿‹¼.·Þáßß¹» */
- $"BAED FFDA B78B BC07 BFA5 7B00 007A A5BC" /* ºíÿÚ·‹¼.¿¥{..z¥¼ */
- $"89B9 0EBA B6C6 FFFF ECB9 B9BA B6CB FFFA" /* ‰¹.º¶Æÿÿì¹¹º¶Ëÿú */
- $"BCB8 8AB9 07BC 9F7A 0000 799F B984 B601" /* ¼¸Š¹.¼Ÿz..yŸ¹„¶. */
- $"B7B5 82B3 0CEC FFFF D4AF B3B3 B2B1 EAFF" /* ·µ‚³.ìÿÿÔ¯³³²±êÿ */
- $"D9B0 81B3 01B5 B784 B607 B899 797C 0079" /* Ù°³.µ·„¶.¸™y|.y */
- $"99B7 84B4 13B3 B9BE C1C0 B9CB FFFF EDBE" /* ™·„´.³¹¾ÁÀ¹Ëÿÿí¾ */
- $"BFBE BEC1 BCCB FCF7 BB80 BF02 C0B9 B384" /* ¿¾¾Á¼Ëü÷»€¿.À¹³„ */
- $"B407 B694 797C 0079 93B4 84B1 19AD C7F1" /* ´.¶”y|.y“´„±.­Çñ */
- $"FBF5 D6F1 FFFD D5F2 F5F8 F1FB F2E4 E7FF" /* ûõÖñÿýÕòõøñûòäçÿ */
- $"E2F3 F4F8 F8D0 AD84 B107 B290 7A00 7C79" /* âóôøøЭ„±.²z.|y */
- $"8DB0 84AE 09AA C3FF FFF2 DCFF FFE2 E984" /* °„®ÆªÃÿÿòÜÿÿâé„ */
- $"FF03 D9F6 D1D8 80FF 01D6 A985 AE06 8C7A" /* ÿ.ÙöÑØ€ÿ.Ö©…®.Œz */
- $"7C7C 7989 AD84 AB08 A7C3 FFFF D5F7 FFF8" /* ||y‰­„«.§ÃÿÿÕ÷ÿø */
- $"DA85 FF08 F2C2 DAD3 F6FF FFD7 A583 AB08" /* Ú…ÿ.òÂÚÓöÿÿ×¥ƒ«. */
- $"ACAA 897A 7C7C 7A86 A984 A809 A5B7 E0D3" /* ¬ª‰z||z†©„¨Æ¥·àÓ */
- $"E2FF FFD6 D0E0 84DF 08DD CFFF F5CB DFE0" /* âÿÿÖÐà„ß.ÝÏÿõËßà */
- $"C3A4 83A8 07A9 A686 7A7C 7C7A 8386 A506" /* 䃨.©¦†z||zƒ†¥. */
- $"A39B BAFF FFF5 AA87 A006 A3DF E2BA 9BA1" /* £›ºÿÿõª‡ .£ß⺛¡ */
- $"A284 A507 A6A2 837B 7C7C 7B82 87A2 059F" /* ¢„¥.¦¢ƒ{||{‚‡¢.Ÿ */
- $"CCF8 FFC7 9C87 A205 9EAF F0F9 AD9E 85A2" /* ÌøÿÇœ‡¢.ž¯ðù­ž…¢ */
- $"08A3 9F81 7B7C 7C7B 7F9D 859F 069C AEE8" /* .£Ÿ{||{.…Ÿ.œ®è */
- $"D4D3 A09E 879F 069D A3F4 FFE8 9D9E 849F" /* ÔÓ ž‡Ÿ.£ôÿèž„Ÿ */
- $"09A0 9B7F 7B7C 7C7B 7E9A 9D84 9C05 98B5" /* Æ ›.{||{~š„œ.˜µ */
- $"FFEE 9F99 899C 0596 D7FF FFC9 9684 9C09" /* ÿ‰œ.–×ÿÿÉ–„œÆ */
- $"9D97 7E7B 7C7C 7B7C 989B 849A 0494 CCE4" /* —~{||{|˜›„š.”Ìä */
- $"A097 8A9A 0695 B3FF FFF4 9C99 839A 019B" /*  —Šš.•³ÿÿôœ™ƒš.› */
- $"9482 7C02 7B95 9984 9803 97AD 9B95 8B98" /* ”‚|.{•™„˜.—­›•‹˜ */
- $"0697 96E0 FFDA 9797 8398 0199 9282 7C02" /* .—–àÿÚ——ƒ˜.™’‚|. */
- $"7A93 9785 9601 9395 8D96 0494 9AAB 9695" /* z“—…–.“•–.”š«–• */
- $"8496 0297 8F7B 817C 027A 9297 9896 0294" /* „–.—{|.z’—˜–.” */
- $"9295 8596 0297 8F7B 817C 027A 8C91 A390" /* ’•…–.—{|.zŒ‘£ */
- $"0291 897A 817C 017B 7BA5 7C00 7BB0 7C00" /* .‘‰z|.{{¥|.{°|. */
- $"00AB 7C80 00A9 7CDF 00FF 00FF 00FF 00AD" /* .«|€.©|ß.ÿ.ÿ.ÿ.­ */
- $"0000 7A89 8002 7C73 749C 0002 79BC CE87" /* ..z‰€.|stœ..y¼Î‡ */
- $"CC04 CDC2 8172 749B 0002 80CF D587 D304" /* Ì.ÍÂrt›..€ÏÕ‡Ó. */
- $"D4D1 8870 749A 0002 6E9B D288 D003 D1D2" /* Ôшptš..n›ÒˆÐ.ÑÒ */
- $"9E6E 9270 8500 0371 9BCE D289 D002 D1CB" /* žn’p…..q›ÎÒ‰Ð.ÑË */
- $"AF91 A801 AA90 8300 0474 80AC B2AF 8AB0" /* ¯‘¨.ªƒ..t€¬²¯Š° */
- $"02B1 B3B4 90B3 03B5 9D7A 7580 0002 80B7" /* .±³´³.µzu€..€· */
- $"C3A4 BF09 C0C3 B57F 0000 A0CF CACA 8DC9" /* ä¿ÆÀõ... ÏÊÊÉ */
- $"04CA CAC6 C8CA 8EC9 07CA CACD 9900 009C" /* .ÊÊÆÈÊŽÉ.ÊÊÍ™..œ */
- $"CA8F C604 C5CB EDC5 C58F C606 C7C8 9400" /* ÊÆ.ÅËíÅÅÆ.ÇÈ”. */
- $"0093 C790 C403 C3F6 E7BF 8FC4 07C5 C48B" /* .“ÇÄ.Ãöç¿Ä.ÅÄ‹ */
- $"0000 8AC2 C28F C104 BEDA FFCE BE8E C107" /* ..ŠÂÂÁ.¾ÚÿξŽÁ. */
- $"C2BF 8600 0083 BEC0 8DBF 06C0 BEB8 C1FC" /* ¿†..ƒ¾À¿.À¾¸Áü */
- $"F3BC 8EBF 07C0 BA81 0000 7EB9 BE8D BD07" /* 󼎿.Àº..~¹¾½. */
- $"BAC0 E9D6 E1FF D5B8 8DBD 07BF B57C 0000" /* ºÀéÖáÿÕ¸½.¿µ|.. */
- $"7AB3 BC8C BA09 B9BB DFDB EBCB FDF7 BAB9" /* z³¼ŒºÆ¹»ßÛëËý÷º¹ */
- $"8CBA 07BC AE79 0000 77AE B98C B709 B3D7" /* Œº.¼®y..w®¹Œ·Æ³× */
- $"FFF8 D3B2 E8FF D7B1 8CB7 07B9 A876 0000" /* ÿøÓ²èÿ×±Œ·.¹¨v.. */
- $"74A9 B78A B50C B6B5 B2EC FFFF C6AF C6FF" /* t©·Šµ.¶µ²ìÿÿƯÆÿ */
- $"F9B8 B48B B507 B7A3 7400 0073 A3B6 8BB3" /* ù¸´‹µ.·£t..s£¶‹³ */
- $"0BAE DBDE DDDB B0B3 B1EA FFD7 AE8B B307" /* .®ÛÞÝÛ°³±êÿ×®‹³. */
- $"B59D 7300 0072 9CB3 8AB0 04AD C0FF FFEA" /* µs..rœ³Š°.­Àÿÿê */
- $"80B0 05AD C4FF F9B4 AF8A B007 B397 7200" /* €°.­Äÿù´¯Š°.³—r. */
- $"0071 97B1 85AE 00AC 80AA 0EAB AAEA FFFF" /* .q—±…®.¬€ª.«ªêÿÿ */
- $"CFA6 AAAA A9A7 E7FF D5A7 81AA 00AC 85AE" /* Ϧªª©§çÿÕ§ª.¬…® */
- $"07B0 9171 7400 7191 AE84 AB13 AAB2 B9BB" /* .°‘qt.q‘®„«.ª²¹» */
- $"BAB2 C6FF FFEB B7B9 B8B7 BBB6 C5FC F7B5" /* º²Æÿÿë·¹¸·»¶Åü÷µ */
- $"80B9 01BA B285 AB07 AD8C 7174 0070 8BAB" /* €¹.º²…«.­Œqt.p‹« */
- $"84A8 19A4 C1EF FBF4 D2F0 FFFC D1F1 F4F8" /* „¨.¤ÁïûôÒðÿüÑñôø */
- $"F0FB F1E2 E5FF DFF2 F3F8 F8CB A484 A807" /* ðûñâåÿßòóøøˤ„¨. */
- $"A988 7200 7471 85A7 84A5 09A1 BDFF FFF0" /* ©ˆr.tq…§„¥Æ¡½ÿÿð */
- $"D9FF FFE0 E784 FF03 D6F5 CDD4 80FF 01D2" /* Ùÿÿàç„ÿ.ÖõÍÔ€ÿ.Ò */
- $"9F85 A506 8472 7474 7181 A484 A208 9EBD" /* Ÿ…¥.„rttq¤„¢.ž½ */
- $"FFFF D2F6 FFF7 D785 FF08 F1BD D8CF F6FF" /* ÿÿÒöÿ÷×…ÿ.ñ½ØÏöÿ */
- $"FFD3 9C83 A208 A3A2 8172 7474 727E A084" /* ÿÓœƒ¢.£¢rttr~ „ */
- $"9F09 9CB0 DDCF DFFF FFD2 CCDD 84DC 08DA" /* ŸÆœ°ÝÏßÿÿÒÌÝ„Ü.Ú */
- $"CBFF F4C6 DCDD BE9B 839F 08A0 9E7E 7274" /* ËÿôÆÜݾ›ƒŸ. ž~rt */
- $"7472 7C9D 849C 089D 9B93 B5FF FFF4 A397" /* tr|„œ.›“µÿÿô£— */
- $"8598 0897 9BDD E0B4 9398 9A9D 839C 089D" /* …˜.—›Ýà´“˜šƒœ. */
- $"9A7B 7374 7473 7998 8699 0597 C8F7 FFC1" /* š{sttsy˜†™.—È÷ÿÁ */
- $"9387 9905 96A9 EEF9 A695 8599 089A 9679" /* “‡™.–©îù¦•…™.š–y */
- $"7374 7473 7795 8596 0693 A7E6 D1D0 9895" /* sttsw•…–.“§æÑИ• */
- $"8796 0695 9BF3 FFE7 9595 8496 0897 9377" /* ‡–.•›óÿç••„–.—“w */
- $"7374 7473 7693 8595 058F B0FF ED98 9289" /* sttsv“…•.°ÿ혒‰ */
- $"9505 8ED4 FFFF C58E 8495 0996 9076 7374" /* •.ŽÔÿÿÅŽ„•Æ–vst */
- $"7473 7490 9384 9204 8BC8 E299 8F8A 9206" /* tst“„’.‹È♊’. */
- $"8DAD FFFF F494 9183 9202 938C 7581 7402" /* ­ÿÿô”‘ƒ’.“Œut. */
- $"738D 9184 9003 8EA7 938D 8B90 068F 8EDD" /* s‘„.Ž§“‹.ŽÝ */
- $"FFD7 8E8F 8390 0191 8A82 7402 728B 8F85" /* ÿ׎ƒ.‘Š‚t.r‹… */
- $"8E01 8B8D 8D8E 048C 93A4 8E8D 848E 028F" /* Ž.‹Ž.Œ“¤Ž„Ž. */
- $"8773 8174 0272 8B8F 988E 028C 8A8D 858E" /* ‡st.r‹˜Ž.ŒŠ…Ž */
- $"028F 8773 8174 0272 8489 A388 0289 8173" /* .‡st.r„‰£ˆ.‰s */
- $"8174 0173 73A5 7400 73B0 7400 00AB 7480" /* t.ss¥t.s°t..«t€ */
- $"00A9 74DF 0068 386D 6B00 0009 0800 0000" /* .©tß.h8mk..Æ.... */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 002E 4549 4A4A 4A4A 4A4A 4A4A 4A4A" /* ....EIJJJJJJJJJJ */
- $"3B0A 0400 0000 0000 0000 0000 0000 0000" /* ;Â.............. */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 2FF9 FFFF FFFF FFFF FFFF FFFF FFFF" /* ../ùÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FD52 0802 0000 0000 0000 0000 0000 0000" /* ýR.............. */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 4DFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ..Mÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FF7E 1306 0000 0000 0000 0000 0000 0000" /* ÿ~.............. */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0002 ABFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ..«ÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFBB 2C11 0B0B 0B0B 0B0B 0B0B 0B0B 0B0B" /* ÿ»,............. */
- $"0B0B 0B0B 0B0B 0903 0000 0000 0000 0000" /* ......Æ......... */
- $"08B2 FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* .²ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF DFCC CCCC CCCC CCCC CCCC CCCC CCCC" /* ÿÿßÌÌÌÌÌÌÌÌÌÌÌÌÌ */
- $"CCCC CCCC CCCC CBC9 8000 0000 0000 0026" /* ÌÌÌÌÌÌËÉ€......& */
- $"71F2 EDEE EFEF EFEF EFEF EFEF EFEF EFEF" /* qòíîïïïïïïïïïïïï */
- $"EFEF F4F7 F7F7 F7F7 F7F7 F7F7 F7F7 F7F7" /* ïïô÷÷÷÷÷÷÷÷÷÷÷÷÷ */
- $"F7F7 F7F7 F7F7 F7F5 CE41 2000 0000 5EF7" /* ÷÷÷÷÷÷÷õÎA ...^÷ */
- $"FFF8 F8F9 F9F9 F9F9 F9F9 F9F9 F9F9 F9F9" /* ÿøøùùùùùùùùùùùùù */
- $"F9F9 F9F9 F9F9 F9F9 F9F9 F9F9 F9F9 F9F9" /* ùùùùùùùùùùùùùùùù */
- $"F9F9 F9F9 F9F9 F9F8 FAFF EE41 0000 C4FF" /* ùùùùùùùøúÿîA..Äÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFA1 0000 B6FF" /* ÿÿÿÿÿÿÿÿÿÿÿ¡..¶ÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FF91 0000 A2FF" /* ÿÿÿÿÿÿÿÿÿÿÿ‘..¢ÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FF7A 0000 8FFF" /* ÿÿÿÿÿÿÿÿÿÿÿz..ÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FF68 0000 79FF" /* ÿÿÿÿÿÿÿÿÿÿÿh..yÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FF57 0000 5EFF" /* ÿÿÿÿÿÿÿÿÿÿÿW..^ÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FF48 0000 4BFF" /* ÿÿÿÿÿÿÿÿÿÿÿH..Kÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FD3B 0000 3FFE" /* ÿÿÿÿÿÿÿÿÿÿý;..?þ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF F62F 0000 33F8" /* ÿÿÿÿÿÿÿÿÿÿö/..3ø */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF ED23 0000 27F2" /* ÿÿÿÿÿÿÿÿÿÿí#..'ò */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF DE1A 0000 1FE9" /* ÿÿÿÿÿÿÿÿÿÿÞ....é */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF CE10 0000 1ADF" /* ÿÿÿÿÿÿÿÿÿÿÎ....ß */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF C10B 0100 14D5" /* ÿÿÿÿÿÿÿÿÿÿÁ....Õ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF B509 0100 0FCD" /* ÿÿÿÿÿÿÿÿÿÿµÆ...Í */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF AA07 0001 0BC2" /* ÿÿÿÿÿÿÿÿÿÿª.... */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF A005 0101 09B3" /* ÿÿÿÿÿÿÿÿÿÿ ...Ƴ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF 9504 0101 08A6" /* ÿÿÿÿÿÿÿÿÿÿ•....¦ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF 8D04 0101 069A" /* ÿÿÿÿÿÿÿÿÿÿ....š */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF 8505 0101 0691" /* ÿÿÿÿÿÿÿÿÿÿ…....‘ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF 7D05 0101 078B" /* ÿÿÿÿÿÿÿÿÿÿ}....‹ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF 7606 0101 0885" /* ÿÿÿÿÿÿÿÿÿÿv....… */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF 7106 0102 0881" /* ÿÿÿÿÿÿÿÿÿÿq.... */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF 6D07 0102 0A7E" /* ÿÿÿÿÿÿÿÿÿÿm...Â~ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF 6A08 0102 0B7B" /* ÿÿÿÿÿÿÿÿÿÿj....{ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF 6709 0102 0C7C" /* ÿÿÿÿÿÿÿÿÿÿgÆ...| */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF 670A 0102 0C75" /* ÿÿÿÿÿÿÿÿÿÿgÂ...u */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF 600B 0102 113A" /* ÿÿÿÿÿÿÿÿÿÿ`....: */
- $"7B85 8585 8585 8585 8585 8585 8585 8585" /* {……………………………………… */
- $"8585 8585 8585 8585 8585 8585 8585 8585" /* ………………………………………… */
- $"8585 8585 8585 8585 8574 310F 0101 0B1E" /* ………………………t1..... */
- $"2B34 3535 3535 3535 3535 3535 3535 3535" /* +455555555555555 */
- $"3535 3535 3535 3535 3535 3535 3535 3535" /* 5555555555555555 */
- $"3535 3535 3535 3535 332A 1C0A 0100 040C" /* 555555553*.Â.... */
- $"1418 1818 1818 1818 1818 1818 1818 1818" /* ................ */
- $"1818 1818 1818 1818 1818 1818 1818 1818" /* ................ */
- $"1818 1818 1818 1818 1813 0B03 0000 0002" /* ................ */
- $"0304 0303 0303 0303 0303 0303 0303 0303" /* ................ */
- $"0303 0303 0303 0303 0303 0303 0303 0303" /* ................ */
- $"0303 0303 0303 0303 0402 0100 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0069 7433" /* .............it3 */
- $"3200 0025 F700 0000 00FF 00FF 00FF 00FF" /* 2..%÷....ÿ.ÿ.ÿ.ÿ */
- $"00FF 00FF 00FF 00FF 00FF 00FF 00FF 00FF" /* .ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ */
- $"00FF 00FF 00FF 00FF 00FF 00FF 00FF 00FF" /* .ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ */
- $"00FF 00FF 00FF 00FF 00FF 00DF 009F 59D7" /* .ÿ.ÿ.ÿ.ÿ.ÿ.ß.ŸY× */
- $"00A6 59D3 0001 5959 8000 9D58 8459 D000" /* .¦YÓ..YY€.X„YÐ. */
- $"0359 5900 569F 5901 5658 8359 D000 0257" /* .YY.VŸY.VXƒYÐ..W */
- $"6287 9D95 0494 917F 5E58 8359 CD00 0459" /* b‡•.”‘.^XƒYÍ..Y */
- $"005C 9ABA 9EBC 03B9 AE85 5883 59CD 0004" /* .\šºž¼.¹®…XƒYÍ.. */
- $"5900 6EB3 BE9E BF04 BEB6 9D62 5782 59CD" /* Y.n³¾ž¿.¾¶bW‚YÍ */
- $"0003 5900 74B6 A0BE 03B8 9F63 5782 59CC" /* ..Y.t¶ ¾.¸ŸcW‚YÌ */
- $"0004 5959 547A B8A0 BC03 B7A0 6357 8359" /* ..YYTz¸ ¼.· cWƒY */
- $"CB00 0459 5954 88B9 A0BB 03B7 A366 56B8" /* Ë..YYTˆ¹ ».·£fV¸ */
- $"5995 0005 5959 005B A0B9 A0BA 03B8 AA73" /* Y•..YY.[ ¹ º.¸ªs */
- $"55BA 5992 0006 5959 0053 7BB4 B9A0 BA04" /* UºY’..YY.S{´¹ º. */
- $"B9B2 905A 56BA 5990 0006 5959 0054 73AB" /* ¹²ZVºY..YY.Ts« */
- $"B8A2 B903 B5AB 865E B756 0300 5859 598E" /* ¸¢¹.µ«†^·V..XYYŽ */
- $"0007 5959 005A 83AD B6B7 A2B8 04B7 B4AD" /* ..YY.Zƒ­¶·¢¸.·´­ */
- $"9B87 B57D 047B 725D 0059 8D00 0759 5900" /* ›‡µ}.{r].Y..YY. */
- $"5A8F B2B6 B6A4 B704 B6B5 B4B2 B1B4 B003" /* Z²¶¶¤·.¶µ´²±´°. */
- $"ADA0 7600 8059 8900 8159 0355 77AC B0E2" /* ­ v.€Y‰.Y.Uw¬°â */
- $"B103 AFA4 7D56 8259 8600 0159 5980 0003" /* ±.¯¤}V‚Y†..YY€.. */
- $"5279 9697 E298 0496 9073 5456 8000 0159" /* Ry–—â˜.–sTV€..Y */
- $"5984 0008 5900 5457 6268 686D 7284 73A1" /* Y„..Y.TWbhhmr„s¡ */
- $"74B9 7309 706C 6868 6763 5900 5959 8200" /* t¹sÆplhhgcY.YY‚. */
- $"0759 0052 6E96 A4A7 A8E7 A980 A706 A6A0" /* .Y.Rn–¤§¨ç©€§.¦  */
- $"8E6A 5759 5982 0002 536F A782 B0E5 AF81" /* ŽjWYY‚..So§‚°å¯ */
- $"B006 AFAF AB99 6A00 5980 0004 5900 5A9B" /* °.¯¯«™j.Y€..Y.Z› */
- $"AEF0 AF0B AEA6 895B 0059 0000 5900 6CA7" /* ®ð¯.®¦‰[.Y..Y.l§ */
- $"B4AE 03AF ABAE AFB7 AE0A A996 6500 5900" /* ´®.¯«®¯·®Â©–e.Y. */
- $"0059 5470 A7B3 AD05 AEA8 A299 A8AE B6AD" /* .YTp§³­.®¨¢™¨®¶­ */
- $"0AA8 9666 0059 0059 5900 6CA3 B4AB 05A6" /* ¨–f.Y.YY.l£´«.¦ */
- $"EDE9 99A7 ACB5 AB0A A692 6200 5900 5959" /* í陧¬µ«Â¦’b.Y.YY */
- $"0063 9EB3 A905 A8A8 ECFF E195 B6A9 0BA3" /* .cž³©.¨¨ìÿᕶ©.£ */
- $"8D5F 5859 0059 5900 6099 A7B3 A806 A4DC" /* _XY.YY.`™§³¨.¤Ü */
- $"FFFF CA96 AAB4 A80B A187 5B58 5900 5959" /* ÿÿÊ–ª´¨.¡‡[XY.YY */
- $"005C 94A6 B3A7 01A3 C580 FF02 AD9D A8B3" /* .\”¦³§.£Å€ÿ.­¨³ */
- $"A70B 9F82 5A58 5900 5959 5857 8DA5 B3A6" /* §.Ÿ‚ZXY.YYXW¥³¦ */
- $"07A4 AEF8 FFFF ED97 A4B2 A603 A59C 7C58" /* .¤®øÿÿí—¤²¦.¥œ|X */
- $"8359 0257 87A3 B4A4 01A1 E180 FF02 CB94" /* ƒY.W‡£´¤.¡á€ÿ.Ë” */
- $"A6B1 A403 A399 7657 8359 0254 80A1 B4A2" /* ¦±¤.£™vWƒY.T€¡´¢ */
- $"019D C180 FF03 FEA4 9BA3 B0A2 03A1 9672" /* .Á€ÿ.þ¤›£°¢.¡–r */
- $"5783 5902 547A 9FB4 A202 A0A6 F380 FF02" /* WƒY.TzŸ´¢. ¦ó€ÿ. */
- $"E192 A3B0 A203 A094 6D56 8359 0255 759D" /* á’£°¢. ”mVƒY.Uu */
- $"B5A0 019B D381 FF02 B495 A1AF A006 9D90" /* µ .›Óÿ.´•¡¯ . */
- $"6957 5959 0080 5902 546D 9BB1 9E00 9F80" /* iWYY.€Y.Tm›±ž.Ÿ€ */
- $"A002 9CAF FD80 FF02 EF93 9DAF 9E06 9B8C" /*  .œ¯ý€ÿ.ž.›Œ */
- $"6657 5959 0080 5902 5568 97B0 9D07 9F95" /* fWYY.€Y.Uh—°.Ÿ• */
- $"8A89 8B98 9CE2 81FF 02C3 8F9E AE9D 0699" /* Š‰‹˜œâÿ.Þ®.™ */
- $"8861 5759 5900 8059 0256 6494 AF9C 089D" /* ˆaWYY.€Y.Vd”¯œ. */
- $"8C9E D0DD C793 8CBC 81FF 02F7 9899 AE9C" /* ŒžÐÝÇ“Œ¼ÿ.÷˜™®œ */
- $"0697 855F 5859 5900 8059 0257 5E91 AF9B" /* .—…_XYY.€Y.W^‘¯› */
- $"0195 B781 FF03 F69B 96ED 81FF 02CE 8B9C" /* .•·ÿ.ö›–íÿ.΋œ */
- $"AD9B 0D95 815D 5859 5900 0059 5957 5B8C" /* ­›.•]XYY..YYW[Œ */
- $"98AD 9903 9889 9AD8 81FF 02E0 89C4 81FF" /* ˜­™.˜‰šØÿ.à‰Äÿ */
- $"02FD 9E93 AD99 0D93 7C5A 5859 5900 0059" /* .ýž“­™.“|ZXYY..Y */
- $"5958 5987 96AC 970C 9889 D3CE 88A1 E8FF" /* YXY‡–¬—.˜‰ÓΈ¡èÿ */
- $"FFF9 9B9D F481 FF02 D788 98AC 9702 9079" /* ÿù›ôÿ.׈˜¬—.y */
- $"5A80 5901 0000 8059 0255 8395 AB96 0D97" /* Z€Y...€Y.Uƒ•«–.— */
- $"8DA4 FFFF F6B2 84B4 F6FB A28E CC82 FF02" /* ¤ÿÿö²„´öû¢ŽÌ‚ÿ. */
- $"A28F 97AB 9601 8E75 8159 0100 0080 5902" /* ¢—«–.ŽuY...€Y. */
- $"547F 94AB 9502 9688 E481 FF07 E99E 8CBC" /* T.”«•.–ˆäÿ.鞌¼ */
- $"9991 A2F8 81FF 02DD 8896 AA95 0394 8D71" /* ™‘¢øÿ.݈–ª•.”q */
- $"5880 5901 0000 8059 0255 7993 AA94 0295" /* X€Y...€Y.Uy“ª”.• */
- $"87B4 84FF 05D4 8C93 948F D182 FF02 A68C" /* ‡´„ÿ.ÔŒ“”Ñ‚ÿ.¦Œ */
- $"95A9 9403 938A 6D57 8059 0700 0059 595A" /* •©”.“ŠmW€Y...YYZ */
- $"5374 91AA 9302 908C F284 FF06 DD92 9293" /* St‘ª“.Œò„ÿ.Ý’’“ */
- $"8FA4 FB81 FF01 E086 AA93 0391 876A 5780" /* ¤ûÿ.à†ª“.‘‡jW€ */
- $"5907 0000 5959 5A53 6F8F A991 0292 87CA" /* Y...YYZSo©‘.’‡Ê */
- $"84FF 02F8 A18D 8091 018D D782 FF02 A788" /* „ÿ.ø¡€‘.ׂÿ.§ˆ */
- $"92A8 9103 8F84 6757 8059 0100 0080 5902" /* ’¨‘.„gW€Y...€Y. */
- $"556B 8DA9 9002 8E85 DB84 FF01 C78A 8190" /* Uk©.Ž…Û„ÿ.ÇŠ */
- $"028B A8FE 81FF 01E2 84A9 9003 8E82 6357" /* .‹¨þÿ.â„©.Ž‚cW */
- $"8059 0100 0080 5902 5466 8CA8 9005 9186" /* €Y...€Y.TfŒ¨.‘† */
- $"AB85 A6EE 81FF 02EE 958E 8190 028F 8CDC" /* «…¦îÿ.î•Ž.ŒÜ */
- $"82FF 02AA 8591 A790 038D 7F62 5880 5901" /* ‚ÿ.ª…‘§..bX€Y. */
- $"0000 8059 0254 618A A78E 0C8F 84A5 FFF0" /* ..€Y.TaŠ§Ž.„¥ÿð */
- $"A480 BBF9 FFFF B688 838E 0189 A982 FF01" /* ¤€»ùÿÿ¶ˆƒŽ.‰©‚ÿ. */
- $"E583 A88E 038B 7C5F 5880 5901 0000 8059" /* 僨Ž.‹|_X€Y...€Y */
- $"0256 5F87 A78D 028C 83E8 80FF 06DF 9087" /* .V_‡§.Œƒè€ÿ.߇ */
- $"D4E0 8C8C 838D 028C 8ADE 82FF 02AB 838E" /* ÔàŒŒƒ.ŒŠÞ‚ÿ.«ƒŽ */
- $"A68D 038A 7A5D 5880 5901 0000 8059 0257" /* ¦.Šz]X€Y...€Y.W */
- $"5C84 A68C 028D 7EB7 83FF 03C9 8B8E 8B85" /* \„¦Œ.~·ƒÿ.É‹Ž‹… */
- $"8C01 87AA 82FF 01E6 82A7 8C03 8877 5C58" /* Œ.‡ª‚ÿ.悧Œ.ˆw\X */
- $"8059 0100 0080 5902 5757 81A6 8A02 878A" /* €Y...€Y.WW¦Š.‡Š */
- $"F584 FF01 CB83 868A 0289 88E0 82FF 02A8" /* õ„ÿ.˃†Š.‰ˆà‚ÿ.¨ */
- $"808B A58A 0386 735B 5880 5901 0000 8059" /* €‹¥Š.†s[X€Y...€Y */
- $"0258 557F A58A 028B 7BC9 84FF 02F6 9987" /* .XU.¥Š.‹{É„ÿ.ö™‡ */
- $"878A 0184 AB82 FF01 E580 A68A 0285 715A" /* ‡Š.„«‚ÿ.倦Š.…qZ */
- $"8159 0100 0081 5902 577B 88A3 8902 8A81" /* Y...Y.W{ˆ£‰.Š */
- $"9685 FF01 BF82 8889 0288 87E0 82FF 02A7" /* –…ÿ.¿‚ˆ‰.ˆ‡à‚ÿ.§ */
- $"7F8A A489 0183 6F82 5901 0000 8159 0254" /* .Š¤‰.ƒo‚Y...Y.T */
- $"7787 A488 017A DC84 FF02 EA8C 8689 8801" /* w‡¤ˆ.zÜ„ÿ.ꌆ‰ˆ. */
- $"82A9 82FF 01E3 7EA4 8802 8781 6C82 5901" /* ‚©‚ÿ.ã~¤ˆ.‡l‚Y. */
- $"0000 8159 0151 7497 860E 8784 8686 8486" /* ..Y.Qt—†.‡„††„† */
- $"8684 8685 8486 877B A685 FF11 AD7D 8685" /* †„†…„†‡{¦…ÿ.­}†… */
- $"8486 8584 8784 8487 8485 8783 83DF 82FF" /* „†…„‡„„‡„…‡ƒƒß‚ÿ */
- $"0FA4 7D87 8584 8785 8487 8485 8784 8586" /* .¤}‡…„‡…„‡„…‡„…† */
- $"8596 8602 7F69 5881 5901 0000 8059 035A" /* …–†..iXY...€Y.Z */
- $"5170 8496 850E 8182 7F7F 827F 8082 7E81" /* Qp„–….‚..‚.€‚~ */
- $"8280 837E EC84 FF12 DB7E 817F 8082 7E81" /* ‚€ƒ~ì„ÿ.Û~.€‚~ */
- $"827E 8182 7E82 817E 827B A682 FF10 E07B" /* ‚~‚~‚~‚{¦‚ÿ.à{ */
- $"8380 827E 8181 7E82 817E 8280 7F81 8494" /* ƒ€‚~~‚~‚€.„” */
- $"8503 847D 6758 8159 0100 0080 5903 5A53" /* ….„}gXY...€Y.ZS */
- $"6E84 9585 0E82 90FB BCAC FFA4 B9FF 9BD3" /* n„•….‚û¼¬ÿ¤¹ÿ›Ó */
- $"FC97 7BB9 84FF 14FC 91AA FFA8 BFFF 92D1" /* ü—{¹„ÿ.ü‘ªÿ¨¿ÿ’Ñ */
- $"FB92 E5ED 87F4 DC95 FFCB 73DF 82FF 0FA0" /* û’åí‡ôÜ•ÿËsß‚ÿ.  */
- $"79DC F889 E5ED 90F6 D88F FFC7 AAC2 7D94" /* yÜø‰åíöØÿǪÂ}” */
- $"8503 847C 6558 8159 0100 0080 5903 5A52" /* ….„|eXY...€Y.ZR */
- $"6983 9584 0E81 92FF BCAA FFC4 D2FF 96D4" /* iƒ•„.’ÿ¼ªÿÄÒÿ–Ô */
- $"FF9A 82F8 84FF 14C6 78CE FFA6 BFFF B6E4" /* ÿš‚ø„ÿ.ÆxÎÿ¦¿ÿ¶ä */
- $"FF8D E8F9 AFFE DE91 FFE3 899E 82FF 0FDB" /* ÿèù¯þÞ‘ÿ㉞‚ÿ.Û */
- $"74E2 FFB1 F3F0 8AFA E9B4 FFC8 A6C7 7C94" /* tâÿ±óðŠúé´ÿȦÇ|” */
- $"8403 8379 6258 8159 0100 0080 5903 5A51" /* „.ƒybXY...€Y.ZQ */
- $"6581 9582 047F 90FF D5C8 81FF 04BB E5F9" /* e•‚..ÿÕÈÿ.»åù */
- $"86CA 84FF 06F2 82D6 FFFF C6D6 80FF 02FC" /* †Ê„ÿ.ò‚ÖÿÿÆÖ€ÿ.ü */
- $"B5EF 80FF 06E9 B8FF FFFA 8AD6 82FF 0196" /* µï€ÿ.é¸ÿÿúŠÖ‚ÿ.– */
- $"C680 FF02 F4B4 FA80 FF03 DCC9 C57A 9482" /* Æ€ÿ.ô´ú€ÿ.ÜÉÅz”‚ */
- $"0381 7761 5881 5901 0000 8059 035A 5262" /* .waXY...€Y.ZRb */
- $"7F95 8102 7E8F FA85 FF01 B190 85FF 01AC" /* .•.~ú…ÿ.±…ÿ.¬ */
- $"9A90 FF01 C494 82FF 02D5 8DF9 87FF 01BF" /* šÿ.Ä”‚ÿ.Õù‡ÿ.¿ */
- $"7994 8103 8075 5F58 8159 0100 0081 5902" /* y”.€u_XY...Y. */
- $"5461 7D95 8002 7D8E FA84 FF02 E779 DD84" /* Ta}•€.}Žú„ÿ.çyÝ„ */
- $"FF02 E47C E690 FF02 FC8A D281 FF02 FC8C" /* ÿ.ä|æÿ.üŠÒÿ.üŒ */
- $"C787 FF01 BF77 9480 037E 725E 5881 5901" /* LJÿ.¿w”€.~r^XY. */
- $"0000 8159 0254 5D7C 957F 027C 8EFA 84FF" /* ..Y.T]|•..|Žú„ÿ */
- $"019C A285 FF01 97AD 92FF 01C7 8F80 FF04" /* .œ¢…ÿ.—­’ÿ.Ç€ÿ. */
- $"FBC0 748B F986 FF01 BE76 947F 037D 715C" /* ûÀt‹ù†ÿ.¾v”..}q\ */
- $"5881 5901 0000 8159 0254 597B 957F 027C" /* XY...Y.TY{•..| */
- $"8EFA 83FF 02D7 7BEF 84FF 02D1 7EF4 92FF" /* Žúƒÿ.×{ï„ÿ.Ñ~ô’ÿ */
- $"09FE 8CC9 F8CB 8C64 9F83 C386 FF01 BE76" /* ÆþŒÉøËŒdŸƒÃ†ÿ.¾v */
- $"947F 037C 6F5B 5881 5901 0000 8159 0355" /* ”..|o[XY...Y.U */
- $"5779 7E94 7D02 7A8C FA82 FF02 FD8A B884" /* Wy~”}.zŒú‚ÿ.ýŠ¸„ */
- $"FF02 FA86 C094 FF09 CF74 7C64 7FCB FFC0" /* ÿ.ú†À”ÿÆÏt|d.ËÿÀ */
- $"80F7 85FF 01BD 7494 7D02 7A6D 5B82 5901" /* €÷…ÿ.½t”}.zm[‚Y. */
- $"0000 8159 0256 5677 957C 0279 8BFA 82FF" /* ..Y.VVw•|.y‹ú‚ÿ */
- $"02C3 82FB 84FF 02BB 86FE 95FF 088C 99D5" /* .Âû„ÿ.»†þ•ÿ.Œ™Õ */
- $"FCFF FFFA 7FBC 85FF 01BD 7394 7C02 796B" /* üÿÿú.¼…ÿ.½s”|.yk */
- $"5A82 5901 0000 8159 0257 5575 957B 0277" /* Z‚Y...Y.WUu•{.w */
- $"8BFA 81FF 02F4 7DCE 84FF 02EE 7BD6 96FF" /* ‹úÿ.ô}΄ÿ.î{Ö–ÿ */
- $"01D0 A782 FF02 C47B F484 FF01 BC72 947B" /* .Ч‚ÿ.Ä{ô„ÿ.¼r”{ */
- $"0178 6983 5901 0000 8159 0258 5272 957A" /* .xiƒY...Y.XRr•z */
- $"0877 8AE8 EEEC ECF2 AA91 85FF 02A8 92F2" /* .wŠèîììòª‘…ÿ.¨’ò */
- $"95EC 03ED ED93 DC81 FF03 FD83 B2F2 82EC" /* •ì.íí“Üÿ.ýƒ²ò‚ì */
- $"02F3 B573 947A 0176 6783 5901 0000 8159" /* .óµs”z.vgƒY...Y */
- $"0258 5070 9679 007A 817F 027E 71E3 84FF" /* .XPp–y.z..~qã„ÿ */
- $"03DF 797F 8096 7F02 8078 A382 FF02 C970" /* .ßy.€–..€x£‚ÿ.Ép */
- $"8083 7F00 7D95 7902 7565 5882 5901 0000" /* €ƒ..}•y.ueX‚Y... */
- $"8159 0258 4F6F 9779 8077 0278 69AB 85FF" /* Y.XOo—y€w.xi«…ÿ */
- $"029B 7378 9977 0178 DF81 FF02 B468 7583" /* .›sx™w.xßÿ.´huƒ */
- $"7700 7895 7902 7464 5882 5901 0000 8259" /* w.x•y.tdX‚Y...‚Y */
- $"0150 6D9A 7802 747A F384 FF02 CD72 779A" /* .Pmšx.tzó„ÿ.Írwš */
- $"7808 71A0 FFFF D98C 8FC6 6D9C 7801 7363" /* x.q ÿÿÙŒÆmœx.sc */
- $"8359 0100 0082 5901 516B 9A77 016B C484" /* ƒY...‚Y.Qkšw.kÄ„ */
- $"FF02 F68A 729B 770A 7677 9B8A 80BD FDFF" /* ÿ.öŠr›wÂvw›Š€½ýÿ */
- $"9C6A 789A 7702 7261 5882 5901 0000 8159" /* œjxšw.raX‚Y...Y */
- $"035A 4F68 7598 7602 737B F184 FF01 B96E" /* .ZOhu˜v.s{ñ„ÿ.¹n */
- $"9D76 0371 85D7 FB80 FF02 F076 719A 7602" /* v.q…×û€ÿ.ðvqšv. */
- $"7060 5882 5901 0000 8159 035A 4E66 7498" /* p`X‚Y...Y.ZNft˜ */
- $"7504 7380 77C3 FE81 FF02 E97B 729D 7502" /* u.s€wÃþÿ.é{ru. */
- $"727F EF82 FF01 CD66 9A75 026F 5E58 8259" /* r.ï‚ÿ.Ífšu.o^X‚Y */
- $"0100 0081 5903 5A4D 6473 9774 0672 76EE" /* ...Y.ZMds—t.rvî */
- $"CC73 83DA 80FF 01A4 6C9F 7401 6CBE 83FF" /* ÌsƒÚ€ÿ.¤lŸt.l¾ƒÿ */
- $"02A5 6575 9874 026D 5C58 8259 0100 0081" /* .¥eu˜t.m\X‚Y... */
- $"5902 5A4D 6298 730B 6F82 FAFF F9AD 6A97" /* Y.ZMb˜s.o‚úÿù­j— */
- $"F1DC 7172 9F73 016D 9283 FF03 F981 6B74" /* ñÜqrŸs.m’ƒÿ.ùkt */
- $"9773 026C 5B58 8259 0100 0081 5902 5A4D" /* —s.l[X‚Y...Y.ZM */
- $"6098 7301 6C94 81FF 04EC 957B 8470 A073" /* `˜s.l”ÿ.ì•{„p s */
- $"0271 75E7 83FF 02DD 6972 9773 026B 5C58" /* .quçƒÿ.Ýir—s.k\X */
- $"8259 0100 0081 5902 5A50 5F98 7201 69A8" /* ‚Y...Y.ZP_˜r.i¨ */
- $"83FF 019B 69A2 7201 6ABF 84FF 02AF 6473" /* ƒÿ.›i¢r.j¿„ÿ.¯ds */
- $"9672 026A 5B58 8259 0100 0081 5903 5A51" /* –r.j[X‚Y...Y.ZQ */
- $"5D70 9771 0167 BD81 FF02 F6A1 6FA3 7101" /* ]p—q.g½ÿ.ö¡o£q. */
- $"6B94 84FF 02F7 7B6D 9671 0169 5A83 5901" /* k”„ÿ.÷{m–q.iZƒY. */
- $"0000 8159 035A 505B 6F97 7101 69D5 80FF" /* ..Y.ZP[o—q.iÕ€ÿ */
- $"03E8 8B68 70A3 7102 6F74 E984 FF02 BC65" /* .è‹hp£q.oté„ÿ.¼e */
- $"7294 7102 7067 5883 5901 0000 8159 035A" /* r”q.pgXƒY...Y.Z */
- $"5059 6F96 7007 6F6F E7FF FFD4 7A69 A670" /* PYo–p.ooçÿÿÔzi¦p */
- $"0168 BD84 FF02 EC71 6E94 7002 6F67 5883" /* .h½„ÿ.ìqn”p.ogXƒ */
- $"5901 0000 8159 035A 5058 6E96 6F06 6C79" /* Y...Y.ZPXn–o.ly */
- $"F7FF BD6E 6BA7 6F02 6A8B FD83 FF02 FC83" /* ÷ÿ½nk§o.j‹ýƒÿ.üƒ */
- $"6B94 6F02 6E66 5783 5901 0000 8159 035A" /* k”o.nfWƒY...Y.Z */
- $"5056 6D96 6E05 688E FBA5 676C A86E 026D" /* PVm–n.hŽû¥gl¨n.m */
- $"6AD0 83FF 02F5 7D6B 946E 026D 6456 8359" /* jЃÿ.õ}k”n.mdVƒY */
- $"0100 0081 5903 5A4F 556C 966D 0468 9294" /* ...Y.ZOUl–m.h’” */
- $"656C AA6D 0268 87F8 82FF 01BC 6995 6D02" /* elªm.h‡ø‚ÿ.¼i•m. */
- $"6C63 5683 5901 0000 8159 035A 5054 6C97" /* lcVƒY...Y.ZPTl— */
- $"6D01 6C68 AD6D 0866 9EF7 FFFF F3B1 6C6B" /* m.lh­m.fž÷ÿÿó±lk */
- $"956D 026C 6256 8359 0100 0081 5903 5A50" /* •m.lbVƒY...Y.ZP */
- $"546C CA6D 0667 81A6 9D7A 666C 966D 026C" /* TlÊm.g¦zfl–m.l */
- $"6256 8359 0100 0081 5903 5A51 536C CB6D" /* bVƒY...Y.ZQSlËm */
- $"0369 6565 6998 6D02 6C62 5783 5901 0000" /* .ieei˜m.lbWƒY... */
- $"8159 035A 5152 6AEA 6C02 6B61 5783 5901" /* Y.ZQRjêl.kaWƒY. */
- $"0000 8159 035A 5252 6AEA 6C02 6B61 5783" /* ..Y.ZRRjêl.kaWƒ */
- $"5901 0000 8159 035A 5252 6AEA 6C02 6B61" /* Y...Y.ZRRjêl.ka */
- $"5783 5901 0000 8159 035A 5352 6AEA 6C02" /* WƒY...Y.ZSRjêl. */
- $"6B61 5783 5900 0082 5903 5A54 5168 EA6B" /* kaWƒY..‚Y.ZTQhêk */
- $"0269 5E56 8359 0000 8359 0257 4D5E EA63" /* .i^VƒY..ƒY.WM^êc */
- $"0260 5756 8359 0100 0082 5902 5A55 53EA" /* .`WVƒY...‚Y.ZUSê */
- $"5601 5556 8459 0100 00FB 5901 0000 FB59" /* V.UV„Y...ûY...ûY */
- $"0100 00FB 5901 0000 FB59 0100 00FA 5981" /* ...ûY...ûY...úY */
- $"00F9 5982 00F7 5983 00F6 5986 00F3 59FF" /* .ùY‚.÷Yƒ.öY†.óYÿ */
- $"00FF 0000 00FF 00FF 00FF 00FF 00FF 00FF" /* .ÿ...ÿ.ÿ.ÿ.ÿ.ÿ.ÿ */
- $"00FF 00FF 00FF 00FF 00FF 00FF 00FF 00FF" /* .ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ */
- $"00FF 00FF 00FF 00FF 00FF 00FF 00FF 00FF" /* .ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ */
- $"00FF 00FF 00FF 00DF 009F 7CD7 00A6 7CD3" /* .ÿ.ÿ.ÿ.ß.Ÿ|×.¦|Ó */
- $"0001 7C7C 8000 9D7B 847C D000 037C 7C00" /* ..||€.{„|Ð..||. */
- $"7C9F 7F01 7B7B 837C D000 027B 88A5 9EB0" /* |Ÿ..{{ƒ|Ð..{ˆ¥ž° */
- $"03AC 9D81 7B83 7CCD 0004 7C00 81B3 D09E" /* .¬{ƒ|Í..|.³Ðž */
- $"D302 D0C3 A184 7CCD 0004 7C00 8FCA D79F" /* Ó.Ðá„|Í..|.Êן */
- $"D803 CEB4 837A 827C CD00 037C 0095 CEA0" /* Ø.δƒz‚|Í..|.•Î  */
- $"D803 D1B7 847A 827C CC00 047C 7C78 9BD0" /* Ø.Ñ·„z‚|Ì..||x›Ð */
- $"A0D7 03D1 B884 7A83 7CCB 0004 7C7C 79A8" /*  ×.Ѹ„zƒ|Ë..||y¨ */
- $"D3A0 D703 D2BC 867A B87C 9500 057C 7C00" /* Ó ×.Ò¼†z¸|•..||. */
- $"81BD D5A0 D603 D3C3 9278 BA7C 9200 067C" /* ½Õ Ö.ÓÃ’xº|’..| */
- $"7C00 799D CED5 A0D6 04D4 CBAC 7D79 BA7C" /* |.yÎÕ Ö.Ôˬ}yº| */
- $"9000 067C 7C00 7B97 C5D3 A2D5 03D1 C4A3" /* ..||.{—ÅÓ¢Õ.ÑÄ£ */
- $"8280 7AB4 7B03 007B 7C7C 8E00 077C 7C00" /* ‚€z´{..{||Ž..||. */
- $"81A4 C8D2 D4A2 D505 D4D0 C8B7 A69F B19E" /* ¤ÈÒÔ¢Õ.ÔÐÈ·¦Ÿ±ž */
- $"079F 9F9E 9D94 8100 7C8D 0007 7C7C 0081" /* .ŸŸž”.|..||. */
- $"ADCD D3D3 A4D4 03D3 D2D0 CE80 CCB2 CB03" /* ­ÍÓÓ¤Ô.ÓÒÐ΀̲Ë. */
- $"C7B9 9500 807C 8900 817C 037A 98C6 CDE2" /* ǹ•.€|‰.|.z˜ÆÍâ */
- $"CE03 CCBE 9B7A 827C 8600 017C 7C80 0002" /* Î.̾›z‚|†..||€.. */
- $"7697 B181 B403 B5B5 B4B4 9EB5 01B4 B4B6" /* v—±´.µµ´´žµ.´´¶ */
- $"B506 B4B4 B3AA 9177 7980 0001 7C7C 8400" /* µ.´´³ª‘wy€..||„. */
- $"097C 0078 7D87 8B8B 8D94 95E2 960A 9592" /* Æ|.x}‡‹‹”•â–•’ */
- $"8E8C 8B8B 867D 007C 7C82 0009 7C00 7892" /* ŽŒ‹‹†}.||‚.Æ|.x’ */
- $"B5C1 C4C5 C6C6 81C7 03C6 C6C7 C79E C601" /* µÁÄÅÆÆÇ.ÆÆÇÇžÆ. */
- $"C7C7 82C6 01C7 C7AC C683 C70A C6C6 C4C3" /* ÇÇ‚Æ.ÇǬƃÇÂÆÆÄà */
- $"C3BD AB8C 7A7C 7C82 0005 7893 C5CE CFD0" /* ý«Œz||‚..x“ÅÎÏÐ */
- $"E9CF 08D0 D0CF CEC9 B58B 007C 8000 047C" /* éÏ.ÐÐÏÎɵ‹.|€..| */
- $"0080 B9CE F0D0 0CCF C5A7 7E00 7C00 007C" /* .€¹ÎðÐ.Ïŧ~.|..| */
- $"008F C5CE B3CF 03D0 CDCF D0B7 CF0A C9B2" /* .ÅγÏ.ÐÍÏзÏÂɲ */
- $"8600 7C00 007C 7894 C6B3 CF05 D0CB BEBA" /* †.|..|x”ƳÏ.Ð˾º */
- $"CCD0 B6CF 0ACA B487 007C 007C 7C00 8FC4" /* ÌжÏÂÊ´‡.|.||.Ä */
- $"B4CE 05C9 F2ED B9CC CFB5 CE0B C8B1 8400" /* ´Î.Éòí¹ÌϵÎ.ȱ„. */
- $"7C00 7C7C 0089 C0CC B3CD 05CC F3FF E7B9" /* |.||.‰À̳Í.Ìóÿç¹ */
- $"CEB5 CD0B C5AC 817B 7C00 7C7C 0085 BCCB" /* εÍ.Ŭ{|.||.…¼Ë */
- $"B3CC 06C9 EAFF FFD8 BDCE B4CC 0BC4 A77D" /* ³Ì.ÉêÿÿؽδÌ.ħ} */
- $"7B7C 007C 7C00 81B6 CAB3 CC01 C9DC 80FF" /* {|.||.¶Ê³Ì.ÉÜ€ÿ */
- $"02C6 C4CD B2CC 0DCB C1A3 7D7B 7C00 7C7C" /* .ÆÄͲÌ.ËÁ£}{|.|| */
- $"7B7D B1C9 CBB2 CA07 C9CF FBFF FFF1 BACB" /* {}±É˲Ê.ÉÏûÿÿñºË */
- $"B2CA 03C9 BE9D 7B83 7C02 7BAB C8B4 CA01" /* ²Ê.ɾ{ƒ|.{«È´Ê. */
- $"C8ED 80FF 02D9 BCCB B1CA 03C9 BC98 7A83" /* Èí€ÿ.ټ˱Ê.ɼ˜zƒ */
- $"7C02 7AA5 C6B4 C901 C6DA 80FF 03FD C1C4" /* |.z¥Æ´É.ÆÚ€ÿ.ýÁÄ */
- $"CAB0 C903 C7B9 957A 837C 0279 9FC4 B4C8" /* Ê°É.ǹ•zƒ|.yŸÄ´È */
- $"02C7 CAF7 80FF 02E8 B8C9 B0C8 03C5 B68F" /* .ÇÊ÷€ÿ.è¸É°È.Ŷ */
- $"7A83 7C02 799A C2B5 C701 C4E4 81FF 02CA" /* zƒ|.yšÂµÇ.Ääÿ.Ê */
- $"BFC8 AFC7 06C4 B38B 7A7C 7C00 807C 0278" /* ¿È¯Ç.ij‹z||.€|.x */
- $"93C0 B1C6 00C7 80C8 02C4 CFFD 80FF 01F2" /* “À±Æ.Ç€È.ÄÏý€ÿ.ò */
- $"B8B0 C606 C2AF 897A 7C7C 0080 7C02 798F" /* ¸°Æ.¯‰z||.€|.y */
- $"BEB0 C607 C8C0 B4B2 B6C3 C6ED 81FF 02D4" /* ¾°Æ.ÈÀ´²¶ÃÆíÿ.Ô */
- $"BBC7 AEC6 06C1 AC84 7A7C 7C00 807C 0279" /* »Ç®Æ.Á¬„z||.€|.y */
- $"8BBB AFC5 08C6 B6BA DCE5 D5B3 BAD8 81FF" /* ‹»¯Å.ƶºÜåÕ³ºØÿ */
- $"02F9 BBC4 AEC5 06C0 A982 7B7C 7C00 807C" /* .ù»Ä®Å.À©‚{||.€| */
- $"027A 85B7 AEC4 02C5 C1CE 81FF 03F7 BAC1" /* .z…·®Ä.ÅÁÎÿ.÷ºÁ */
- $"F481 FF02 DCB7 C6AD C40D BDA5 817B 7C7C" /* ôÿ.Ü·Æ­Ä.½¥{|| */
- $"0000 7C7C 7A83 B4C3 ADC4 03C3 B3BE E981" /* ..||zƒ´Ã­Ä.ó¾é */
- $"FF02 E8B6 DC81 FF02 FDBE C0AD C40D BCA1" /* ÿ.è¶Üÿ.ý¾À­Ä.¼¡ */
- $"7E7B 7C7C 0000 7C7C 7B80 B0C2 ACC3 0CC4" /* ~{||..||{€°Â¬Ã.Ä */
- $"B5DD DAAE C4F2 FFFF FAC2 C5F8 81FF 02E2" /* µÝÚ®ÄòÿÿúÂÅøÿ.â */
- $"B5C4 ACC3 01B9 9D81 7C07 0000 7C7C 7B7C" /* µÄ¬Ã.¹|...||{| */
- $"ABC0 ABC1 0DC2 BCC1 FFFF F7C7 ACD0 FBFC" /* «À«Á.¼Áÿÿ÷ǬÐûü */
- $"C7BC E082 FF02 C0BD C2AB C101 B79A 817C" /* Ǽà‚ÿ.À½Â«Á.·š| */
- $"0100 0080 7C02 7BA7 BFAB C102 C2B2 EB81" /* ...€|.{§¿«Á.²ë */
- $"FF07 EDB9 B3D7 C3BF C7FA 81FF 02E6 B3C2" /* ÿ.í¹³×ÿÇúÿ.æ³Â */
- $"AAC1 03C0 B595 7B80 7C01 0000 807C 027A" /* ªÁ.Àµ•{€|...€|.z */
- $"A3BE AAC0 02C1 B6CA 84FF 05DE B8C0 C0BD" /* £¾ªÀ.Á¶Ê„ÿ.Þ¸ÀÀ½ */
- $"E382 FF02 C2BA C1A9 C003 BFB2 927A 807C" /* ã‚ÿ.ºÁ©À.¿²’z€| */
- $"0100 0080 7C02 789D BCAA BF02 BEB3 F584" /* ...€|.x¼ª¿.¾³õ„ */
- $"FF06 EBBF BEBF BDC9 FC81 FF02 E8B2 C0A9" /* ÿ.뿾¿½Éüÿ.è²À© */
- $"BF03 BEB0 8F7A 807C 0100 0080 7C02 7898" /* ¿.¾°z€|...€|.x˜ */
- $"BAA9 BE02 BFB5 D984 FF02 FBC7 BC80 BE01" /* º©¾.¿µÙ„ÿ.ûǼ€¾. */
- $"BBE7 82FF 02C3 B7BF A8BE 03BC AD8B 7A80" /* »ç‚ÿ.÷¿¨¾.¼­‹z€ */
- $"7C01 0000 807C 0278 95B9 A9BD 02BC B3E9" /* |...€|.x•¹©½.¼³é */
- $"84FF 01DD B981 BD02 BACB FE81 FF02 EAB0" /* „ÿ.ݹ½.ºËþÿ.ê° */
- $"BEA8 BD03 BAAA 887A 807C 0100 0080 7C02" /* ¾¨½.ºªˆz€|...€|. */
- $"7890 B8A8 BD05 BEB2 C1AC C7F6 81FF 02F4" /* x¸¨½.¾²Á¬Çöÿ.ô */
- $"C0BC 82BD 01BB EA82 FF02 C4B6 BEA7 BD03" /* À¼‚½.»ê‚ÿ.Ķ¾§½. */
- $"BAA8 867A 807C 0100 0080 7C02 788B B5A7" /* º¨†z€|...€|.x‹µ§ */
- $"BC0C BDB5 C1FF F2BD AAD5 FCFF FFD3 B983" /* ¼.½µÁÿò½ªÕüÿÿÓ¹ƒ */
- $"BC01 B9CC 82FF 02EB AFBD A7BC 03B8 A584" /* ¼.¹Ì‚ÿ.믽§¼.¸¥„ */
- $"7B80 7C01 0000 807C 0279 88B3 A8BC 01AE" /* {€|...€|.yˆ³¨¼.® */
- $"ED80 FF06 E5B1 B1E6 ECBB BB84 BC01 B9EB" /* í€ÿ.å±±æì»»„¼.¹ë */
- $"82FF 02C5 B4BD A6BC 03B7 A381 7B80 7C01" /* ‚ÿ.Å´½¦¼.·£{€|. */
- $"0000 807C 027A 85B1 A6BB 02BC AFCC 82FF" /* ..€|.z…±¦».¼¯Ì‚ÿ */
- $"04FE D6AF BBBA 85BB 01B7 CC82 FF02 ECAE" /* .þÖ¯»º…».·Ì‚ÿ.ì® */
- $"BCA6 BB03 B5A0 807B 807C 0100 0080 7C03" /* ¼¦».µ €{€|...€|. */
- $"7A80 ADB9 A5BA 02B8 B0F7 84FF 01DE B486" /* z€­¹¥º.¸°÷„ÿ.Þ´† */
- $"BA02 B9B8 EB82 FF02 C3B2 BBA5 BA03 B39C" /* º.¹¸ë‚ÿ.ò»¥º.³œ */
- $"7F7B 807C 0100 0080 7C03 7B7E AAB7 A4B8" /* .{€|...€|.{~ª·¤¸ */
- $"02BA ABD8 84FF 02F9 C1B6 87B8 01B5 CC82" /* .º«Ø„ÿ.ùÁ¶‡¸.µÌ‚ */
- $"FF02 EBAC B9A5 B803 B199 7D7B 807C 0100" /* ÿ.묹¥¸.±™}{€|.. */
- $"0080 7C03 7B7D A7B6 A4B7 02B2 B7FE 84FF" /* .€|.{}§¶¤·.²·þ„ÿ */
- $"01D7 B388 B702 B6B6 EB82 FF02 C2B0 B8A4" /* .׳ˆ·.¶¶ë‚ÿ.°¸¤ */
- $"B701 AF96 827C 0100 0081 7C02 7BA3 B5A3" /* ·.¯–‚|...|.{£µ£ */
- $"B602 B7A8 E584 FF02 F1B8 B589 B601 B3CA" /* ¶.·¨å„ÿ.ñ¸µ‰¶.³Ê */
- $"82FF 02EA AAB7 A4B6 01AD 9382 7C01 0000" /* ‚ÿ.ꪷ¤¶.­“‚|... */
- $"817C 0278 9FB4 97B5 0DB4 B5B6 B4B6 B5B4" /* |.xŸ´—µ.´µ¶´¶µ´ */
- $"B6B5 B4B6 B6AD C085 FF11 CCB0 B6B5 B4B6" /* ¶µ´¶¶­À…ÿ.Ì°¶µ´¶ */
- $"B5B4 B6B5 B4B6 B4B5 B6B3 B4EB 82FF 0EC0" /* µ´¶µ´¶´µ¶³´ë‚ÿ.À */
- $"AFB6 B5B4 B6B4 B4B6 B4B5 B6B4 B5B6 97B5" /* ¯¶µ´¶´´¶´µ¶´µ¶—µ */
- $"01AB 9082 7C01 0000 817C 0278 9CB3 95B5" /* .«‚|...|.xœ³•µ */
- $"0FB6 AFA7 A9AA A7AA AAA7 ABA9 A7AC B1A9" /* .¶¯§©ª§ªª§«©§¬±© */
- $"F084 FF12 E9AA A6AA AAA7 ABA9 A7AB A8A8" /* ð„ÿ.骦ªª§«©§«¨¨ */
- $"ACA8 A8AB A7A5 C882 FF0F E8A8 B2A8 A8AB" /* ¬¨¨«§¥È‚ÿ.訲¨¨« */
- $"A8A8 ACA8 A9AC A7A9 AAAB 95B5 03B4 A98E" /* ¨¨¬¨©¬§©ª«•µ.´©Ž */
- $"7B81 7C01 0000 817C 0278 99B2 95B4 0EB3" /* {|...|.x™²•´.³ */
- $"B7F9 D2C7 FFC1 CEFF BCE1 FABB AACD 84FF" /* ·ùÒÇÿÁÎÿ¼áú»ªÍ„ÿ */
- $"14FD BAC6 FFC5 D3FF B7DF F9B7 EBF2 B0F6" /* .ýºÆÿÅÓÿ·ßù·ëò°ö */
- $"E6B9 FDDA A7EB 82FF 0FBD AAE6 F8B0 EBF1" /* æ¹ýÚ§ë‚ÿ.½ªæø°ëñ */
- $"B5F7 E3B4 FED9 C5D5 AF94 B403 B3A7 8B7B" /* µ÷ã´þÙÅÕ¯”´.³§‹{ */
- $"817C 0100 0081 7C02 7794 B195 B30E B1B9" /* |...|.w”±•³.±¹ */
- $"FFD2 C7FF D3DE FFBA E3FF BDAA F984 FF14" /* ÿÒÇÿÓÞÿºãÿ½ªù„ÿ. */
- $"DBA2 DAFF C4D4 FFCA EBFE B4EF FBC4 FEE9" /* Û¢ÚÿÄÔÿÊëþ´ïûÄþé */
- $"B6FF EAAB C082 FF0F E4A3 ECFF C5F6 F5B2" /* ¶ÿê«À‚ÿ.ä£ìÿÅöõ² */
- $"FBEF C8FF DAC4 DAAE 94B3 03B2 A589 7B81" /* ûïÈÿÚÄÚ®”³.²¥‰{ */
- $"7C01 0000 807C 037D 7690 AE95 B104 AFB7" /* |...€|.}v®•±.¯· */
- $"FFE0 D681 FF04 CDEC FCAE D884 FF06 F7AC" /* ÿàÖÿ.Íìü®Ø„ÿ.÷¬ */
- $"E0FF FFD4 E180 FF02 FDC9 F380 FF06 EFCA" /* àÿÿÔá€ÿ.ýÉó€ÿ.ïÊ */
- $"FFFF FAAE E582 FF01 B6DA 80FF 02F7 C7FB" /* ÿÿú®å‚ÿ.¶Ú€ÿ.÷Çû */
- $"80FF 03E5 D6D9 AC94 B103 B0A2 877B 817C" /* €ÿ.åÖÙ¬”±.°¢‡{| */
- $"0100 0081 7C02 768D AC95 B002 AEB7 FB85" /* ...|.v¬•°.®·û… */
- $"FF01 CDB1 85FF 01C9 B890 FF01 D5B8 82FF" /* ÿ.ͱ…ÿ.ɸÿ.Õ¸‚ÿ */
- $"02E0 B3FC 87FF 01D5 AA94 B003 AE9F 857B" /* .à³ü‡ÿ.Õª”°.®Ÿ…{ */
- $"817C 0100 0081 7C02 788A AB95 AF02 ADB6" /* |...|.xŠ«•¯.­¶ */
- $"FB84 FF02 F0A5 E584 FF02 EEA6 EC90 FF02" /* û„ÿ.ð¥å„ÿ.î¦ìÿ. */
- $"FCAE E281 FF02 FCB4 DB87 FF01 D5A9 94AF" /* ü®âÿ.ü´Û‡ÿ.Õ©”¯ */
- $"03AC 9D83 7B81 7C01 0000 817C 0278 86A9" /* .¬ƒ{|...|.x†© */
- $"95AD 02AB B4FB 84FF 01BE BD85 FF01 BAC3" /* •­.«´û„ÿ.¾½…ÿ.ºÃ */
- $"92FF 01D6 B480 FF04 FCD8 A4B3 FB86 FF01" /* ’ÿ.Ö´€ÿ.üؤ³û†ÿ. */
- $"D4A7 94AD 03AB 9A81 7B81 7C01 0000 817C" /* Ô§”­.«š{|...| */
- $"0278 83A7 95AC 02AA B3FB 83FF 02E5 A3F2" /* .xƒ§•¬.ª³ûƒÿ.å£ò */
- $"84FF 02E1 A5F6 92FF 09FD AEDC FBDE B595" /* „ÿ.á¥ö’ÿÆý®ÜûÞµ• */
- $"B6A9 D886 FF01 D3A6 94AC 03A9 9880 7B81" /* ¶©Ø†ÿ.Ó¦”¬.©˜€{ */
- $"7C01 0000 817C 0278 80A5 95AC 02AA B3FB" /* |...|.x€¥•¬.ª³û */
- $"82FF 02FE B0CB 84FF 02FC ADD0 94FF 09DB" /* ‚ÿ.þ°Ë„ÿ.ü­Ð”ÿÆÛ */
- $"A1A8 95A2 D6FF D1AA FA85 FF01 D3A6 94AC" /* ¡¨•¢ÖÿѪú…ÿ.Ó¦”¬ */
- $"03A8 967F 7B81 7C01 0000 817C 0279 7FA3" /* .¨–.{|...|.y.£ */
- $"95AB 02A9 B2FB 82FF 02D7 A7FB 84FF 02D2" /* •«.©²û‚ÿ.קû„ÿ.Ò */
- $"AAFD 95FF 08AD B4DD FCFF FFFA A5D3 85FF" /* ªý•ÿ.­´Ýüÿÿú¥Ó…ÿ */
- $"01D3 A594 AB03 A694 7E7B 817C 0100 0081" /* .Ó¥”«.¦”~{|... */
- $"7C02 7A7D A095 A902 A7B1 FB81 FF02 F8A5" /* |.z} •©.§±ûÿ.ø¥ */
- $"DA84 FF02 F4A4 E096 FF01 DCC2 82FF 02D3" /* Ú„ÿ.ô¤à–ÿ.Ü‚ÿ.Ó */
- $"A5F8 84FF 01D2 A394 A902 A491 7D82 7C01" /* ¥ø„ÿ.Ò£”©.¤‘}‚|. */
- $"0000 817C 027A 7A9E 95A8 08A6 B1EF F3F2" /* ..|.zzž•¨.¦±ïóò */
- $"F2F6 C6B0 85FF 02C5 B4F5 95F2 03F3 F2B5" /* òöÆ°…ÿ.Å´õ•ò.óòµ */
- $"E881 FF03 FCA7 CCF6 82F2 02F7 CDA3 94A8" /* èÿ.ü§Ìö‚ò.÷Í£”¨ */
- $"01A3 8F83 7C01 0000 817C 027B 779C 96A7" /* .£ƒ|...|.{wœ–§ */
- $"00A8 82AB 019C E984 FF03 E9A6 AAAC 96AB" /* .¨‚«.œé„ÿ.馪¬–« */
- $"02AC A6C1 82FF 02D8 A0AC 83AB 00A9 95A7" /* .¬¦Á‚ÿ.Ø ¬ƒ«.©•§ */
- $"01A1 8D83 7C01 0000 817C 037B 7699 A595" /* .¡ƒ|...|.{v™¥• */
- $"A600 A580 A402 A599 C085 FF02 BCA1 A599" /* ¦.¥€¤.¥™À…ÿ.¼¡¥™ */
- $"A401 A5E9 81FF 02CB 96A3 83A4 00A5 95A6" /* ¤.¥éÿ.Ë–£ƒ¤.¥•¦ */
- $"029F 8A7B 827C 0100 0082 7C02 7596 A399" /* .ŸŠ{‚|...‚|.u–£™ */
- $"A402 A29F F584 FF01 DDA0 9BA4 09A0 BFFF" /* ¤.¢Ÿõ„ÿ.Ý ›¤Æ ¿ÿ */
- $"FFE6 ADAB D299 A59B A402 9D88 7B82 7C01" /* ÿæ­«Ò™¥›¤.ˆ{‚|. */
- $"0000 827C 0276 94A2 98A3 02A4 98D1 84FF" /* ..‚|.v”¢˜£.¤˜Ñ„ÿ */
- $"02F9 AFA0 9CA3 09A4 B9A9 A0CB FCFF B599" /* .ù¯ œ£Æ¤¹© Ëüÿµ™ */
- $"A49A A302 9C87 7B82 7C01 0000 827C 0275" /* ¤š£.œ‡{‚|...‚|.u */
- $"92A2 98A3 02A1 A4F5 84FF 01CF 9E9D A303" /* ’¢˜£.¡¤õ„ÿ.Ïž£. */
- $"A0A9 DEFB 80FF 02F3 9CA0 9AA3 029B 867B" /*  ©Þû€ÿ.󜠚£.›†{ */
- $"827C 0100 0081 7C03 7D74 8FA1 97A2 05A3" /* ‚|...|.}t¡—¢.£ */
- $"9FA0 9ED6 FE81 FF02 F0A6 A09D A202 A0A9" /* Ÿ žÖþÿ.𦠢. © */
- $"F382 FF01 D893 9AA2 0299 837B 827C 0100" /* ó‚ÿ.Ø“š¢.™ƒ{‚|.. */
- $"0081 7C03 7D73 8D9F 97A0 069F 9FF1 D697" /* .|.}sŸ— .ŸŸñÖ— */
- $"A6E6 80FF 01C1 9B9F A001 9BD2 83FF 02BB" /* ¦æ€ÿ.Á›Ÿ .›Òƒÿ.» */
- $"94A1 98A0 0297 827B 827C 0100 0081 7C03" /* ”¡˜ .—‚{‚|...|. */
- $"7D72 8A9E 979F 0B9D A6FB FFF9 BF91 B6F6" /* }rŠž—Ÿ.¦ûÿù¿‘¶ö */
- $"E69E 9E9F 9F01 9BB4 83FF 03FA A199 A096" /* æžžŸŸ.›´ƒÿ.ú¡™ – */
- $"9F03 9E95 807B 827C 0100 0081 7C03 7D72" /* Ÿ.ž•€{‚|...|.}r */
- $"889D 979E 0199 B281 FF04 EFAD 9EA9 9CA0" /* ˆ—ž.™²ÿ.ï­ž©œ  */
- $"9E02 9D9F EE83 FF01 E492 979E 039D 9480" /* ž.Ÿîƒÿ.ä’—ž.”€ */
- $"7B82 7C01 0000 817C 037D 7487 9B97 9D01" /* {‚|...|.}t‡›—. */
- $"96BF 82FF 02FE B697 A29D 0198 D184 FF02" /* –¿‚ÿ.þ¶—¢.˜Ñ„ÿ. */
- $"C191 9E95 9D03 9C92 7F7B 827C 0100 0081" /* Á‘ž•.œ’.{‚|... */
- $"7C03 7D75 849A 979C 0194 CE81 FF02 F8BD" /* |.}u„š—œ.”Îÿ.ø½ */
- $"9BA3 9C01 98B4 84FF 02F8 9D99 959C 039B" /* ›£œ.˜´„ÿ.ø™•œ.› */
- $"907E 7B82 7C01 0000 817C 037D 7482 9997" /* ~{‚|...|.}t‚™— */
- $"9B01 94DF 80FF 03EE AD95 9AA3 9B02 9A9D" /* ›.”߀ÿ.î­•š£›.š */
- $"EF84 FF02 CC91 9C94 9B03 9A8F 7C7B 827C" /* ï„ÿ.Ì‘œ”›.š|{‚| */
- $"0100 0081 7C03 7D74 8098 979A 0697 ECFF" /* ...|.}t€˜—š.—ìÿ */
- $"FFE0 A195 A69A 0195 D084 FF02 F098 9994" /* ÿà¡•¦š.•Ð„ÿ.𘙔 */
- $"9A02 998D 7B83 7C01 0000 817C 037D 737E" /* š.™{ƒ|...|.}s~ */
- $"9896 9A06 989F F9FF D099 97A7 9A02 96AD" /* ˜–š.˜ŸùÿЙ—§š.–­ */
- $"FD83 FF02 FCA6 9794 9A02 998D 7B83 7C01" /* ýƒÿ.ü¦—”š.™{ƒ|. */
- $"0000 817C 037D 737D 9796 9905 95AD FCBE" /* ..|.}s}—–™.•­ü¾ */
- $"9498 A999 0196 DD83 FF02 F7A3 9794 9902" /* ”˜©™.–݃ÿ.÷£—”™. */
- $"988C 7A83 7C01 0000 817C 037D 737B 9696" /* ˜Œzƒ|...|.}s{–– */
- $"9803 95B0 B392 AB98 0294 AAF9 82FF 01CF" /* ˜.•°³’«˜.”ªù‚ÿ.Ï */
- $"9595 9802 978A 7A83 7C01 0000 817C 037D" /* ••˜.—Šzƒ|...|.} */
- $"747B 9498 9700 94AD 9708 93B9 F9FF FFF6" /* t{”˜—.”­—.“¹ùÿÿö */
- $"C797 9695 9702 9688 7983 7C01 0000 817C" /* Ç—–•—.–ˆyƒ|...| */
- $"037D 7479 93CA 9606 92A4 BEB8 9F91 9596" /* .}ty“Ê–.’¤¾¸Ÿ‘•– */
- $"9602 9588 7983 7C01 0000 817C 037D 7478" /* –.•ˆyƒ|...|.}tx */
- $"93CB 9603 9390 9193 9896 0294 8779 837C" /* “Ë–.“‘“˜–.”‡yƒ| */
- $"0100 0081 7C03 7D75 7892 EA95 0293 8679" /* ...|.}ux’ê•.“†y */
- $"837C 0100 0081 7C03 7D75 7892 EA95 0293" /* ƒ|...|.}ux’ê•.“ */
- $"8679 837C 0100 0081 7C03 7D76 7792 EA95" /* †yƒ|...|.}vw’ê• */
- $"0293 8679 837C 0100 0081 7C03 7D76 7792" /* .“†yƒ|...|.}vw’ */
- $"EA95 0293 8579 837C 0000 827C 037D 7776" /* ê•.“…yƒ|..‚|.}wv */
- $"8FEA 9402 9182 7883 7C00 0083 7C03 7A70" /* ê”.‘‚xƒ|..ƒ|.zp */
- $"8288 E989 0285 7A79 837C 0100 0082 7C02" /* ‚ˆé‰.…zyƒ|...‚|. */
- $"7D78 76EA 7901 7779 847C 0100 00FB 7C01" /* }xvêy.wy„|...û|. */
- $"0000 FB7C 0100 00FB 7C01 0000 FB7C 0100" /* ..û|...û|...û|.. */
- $"00FA 7C81 00F9 7C82 00F7 7C83 00F6 7C86" /* .ú|.ù|‚.÷|ƒ.ö|† */
- $"00F3 7CFF 00FF 0000 00FF 00FF 00FF 00FF" /* .ó|ÿ.ÿ...ÿ.ÿ.ÿ.ÿ */
- $"00FF 00FF 00FF 00FF 00FF 00FF 00FF 00FF" /* .ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ */
- $"00FF 00FF 00FF 00FF 00FF 00FF 00FF 00FF" /* .ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ */
- $"00FF 00FF 00FF 00FF 00FF 00DF 009F 74D7" /* .ÿ.ÿ.ÿ.ÿ.ÿ.ß.Ÿt× */
- $"00A6 74D3 0001 7474 8000 9D73 8474 D000" /* .¦tÓ..tt€.s„tÐ. */
- $"0374 7400 749E 7702 7673 7283 74D0 0003" /* .tt.tžw.vsrƒtÐ.. */
- $"7381 9FAB 9DAC 03A8 977A 7383 74CD 0004" /* sŸ«¬.¨—zsƒtÍ.. */
- $"7400 79AF CC9E CF03 CCBF 9B73 8374 CD00" /* t.y¯ÌžÏ.Ì¿›sƒtÍ. */
- $"0474 0088 C6D2 9FD3 03CA AF7C 7282 74CD" /* .t.ˆÆÒŸÓ.ʯ|r‚tÍ */
- $"0003 7400 8EC9 A0D3 03CC B27D 7282 74CC" /* ..t.ŽÉ Ó.̲}r‚tÌ */
- $"0004 7474 7094 CBA0 D203 CCB3 7C72 8374" /* ..ttp”Ë Ò.̳|rƒt */
- $"CB00 0474 7471 A1CE A0D1 03CC B67F 72B8" /* Ë..ttq¡Î Ñ.̶.r¸ */
- $"7495 0005 7474 0078 B7D0 A0D1 03CE BE8B" /* t•..tt.x·Ð Ñ.ξ‹ */
- $"70BA 7492 0006 7474 0070 96C9 CFA0 D004" /* pºt’..tt.p–ÉÏ Ð. */
- $"CFC6 A675 71BA 7490 0006 7474 0072 8FC0" /* ÏƦuqºt..tt.rÀ */
- $"CDA2 CF03 CBBF 9D7A B672 0473 0073 7474" /* Í¢Ï.Ë¿z¶r.s.stt */
- $"8E00 0674 7400 799D C3CD A3CF 04CE CAC3" /* Ž..tt.yÃÍ£Ï.ÎÊà */
- $"B2A0 B598 0496 8D79 0074 8D00 0774 7400" /* ² µ˜.–y.t..tt. */
- $"79A8 C8CE CEA4 CF03 CECD CBC9 B5C7 03C3" /* y¨ÈÎΤÏ.ÎÍËɵÇ.à */
- $"B58F 0080 7489 0081 7403 7192 C1C8 E2C9" /* µ.€t‰.t.q’ÁÈâÉ */
- $"03C7 B995 7282 7486 0001 7474 8000 026E" /* .ǹ•r‚t†..tt€..n */
- $"91AC E3AF 04AE A58A 6F71 8000 0174 7484" /* ‘¬ã¯.®¥Šoq€..tt„ */
- $"0008 7400 7075 8085 8487 8E80 8FAA 9000" /* ..t.pu€…„‡Ž€ª. */
- $"8FB0 9080 8F09 8B87 8584 847F 7600 7474" /* °€Æ‹‡…„„.v.tt */
- $"8200 0774 0070 8BAF BCBF C0E7 C109 C0BF" /* ‚..t.p‹¯¼¿ÀçÁÆÀ¿ */
- $"BEBE B8A6 8572 7474 8200 0370 8DC0 C9EE" /* ¾¾¸¦…rtt‚..pÀÉî */
- $"CA05 C9C4 B185 0074 8000 0474 0078 B4C8" /* Ê.Éı….t€..t.x´È */
- $"F0CA 0CC9 BFA1 7600 7400 0074 0088 BFC8" /* ðÊ.É¿¡v.t..t.ˆ¿È */
- $"B3C9 03CA C7C9 CAB7 C90A C3AD 7F00 7400" /* ³É.ÊÇÉÊ·ÉÂí..t. */
- $"0074 708C C0B3 C805 C9C3 B8B3 C4C9 B6C8" /* .tpŒÀ³È.Éø³ÄÉ¶È */
- $"0AC3 AE7F 0074 0074 7400 88BD B4C7 05C2" /* Âî..t.tt.ˆ½´Ç. */
- $"F1EC B2C4 C8B5 C70B C1AB 7C00 7400 7474" /* ñì²ÄȵÇ.Á«|.t.tt */
- $"0082 BAC6 B3C7 04C6 F2FF E6B3 B6C7 0BC0" /* .‚ºÆ³Ç.Æòÿ泶Ç.À */
- $"A67A 7374 0074 7400 7DB5 C5B3 C606 C3E7" /* ¦zst.tt.}µÅ³Æ.Ãç */
- $"FFFF D5B6 C8B4 C60B BDA1 7573 7400 7474" /* ÿÿնȴÆ.½¡ust.tt */
- $"0079 B0C4 B3C5 01C2 D880 FF02 C0BD C6B2" /* .y°Ä³Å.ÂØ€ÿ.À½Æ² */
- $"C50C C4BB 9D75 7374 0074 7473 75AA C2B3" /* Å.Ä»ust.ttsuªÂ³ */
- $"C406 C3C9 FAFF FFF0 B3B3 C403 C3B8 9673" /* Ä.ÃÉúÿÿð³³Ä.ø–s */
- $"8474 01A5 C1B4 C301 C1EB 80FF 02D6 B4C5" /* „t.¥Á´Ã.Áë€ÿ.Ö´Å */
- $"B1C3 03C2 B591 7283 7402 719E BFB4 C201" /* ±Ã.µ‘rƒt.qž¿´Â. */
- $"BFD5 80FF 03FD BBBD C3B0 C203 C0B2 8E72" /* ¿Õ€ÿ.ý»½Ã°Â.À²Žr */
- $"8374 0270 99BD B4C1 02C0 C4F6 80FF 02E6" /* ƒt.p™½´Á.ÀÄö€ÿ.æ */
- $"B1C2 B0C1 03BE AF87 7283 7402 7193 BBB5" /* ±Â°Á.¾¯‡rƒt.q“»µ */
- $"C001 BCE1 81FF 02C6 B7C1 AFC0 06BD AC84" /* À.¼áÿ.Æ·Á¯À.½¬„ */
- $"7274 7400 8074 0270 8CB9 B1BF 00C0 80C1" /* rtt.€t.pŒ¹±¿.À€Á */
- $"02BD CAFD 80FF 01F1 B1B0 BF06 BBA9 8172" /* .½Êý€ÿ.ñ±°¿.»©r */
- $"7474 0080 7402 7088 B7B0 BF07 C1B9 ACAB" /* tt.€t.pˆ·°¿.Á¹¬« */
- $"AEBC BEEB 81FF 02D1 B3C0 AEBF 06BA A67C" /* ®¼¾ëÿ.ѳÀ®¿.º¦| */
- $"7274 7400 8074 0271 83B4 AFBE 08BF AFB4" /* rtt.€t.qƒ´¯¾.¿¯´ */
- $"D9E3 D2AD B1D3 81FF 02F8 B4BC AEBE 06B8" /* ÙãÒ­±Óÿ.ø´¼®¾.¸ */
- $"A27A 7374 7400 8074 0372 7DB1 BCAE BD01" /* ¢zstt.€t.r}±¼®½. */
- $"B9CA 81FF 03F6 B4B9 F381 FF02 D8AF BEAD" /* ¹Êÿ.ö´¹óÿ.د¾­ */
- $"BD0D B69F 7973 7474 0000 7474 727A ADBB" /* ½.¶Ÿystt..ttrz­» */
- $"ADBC 03BB ABB7 E681 FF02 E6AE D881 FF02" /* ­¼.»«·æÿ.æ®Øÿ. */
- $"FDB7 B8AD BC0D B49A 7673 7474 0000 7474" /* ý·¸­¼.´švstt..tt */
- $"7378 A9BA ACBB 0CBC ACDB D7A6 BDF0 FFFF" /* sx©º¬».¼¬Ûצ½ðÿÿ */
- $"FABA BEF7 81FF 02DF ACBC ACBB 01B2 9781" /* úº¾÷ÿ.߬¼¬».²— */
- $"7407 0000 7474 7374 A4B8 ABB9 0DBA B3BB" /* t...ttst¤¸«¹.º³» */
- $"FFFF F7C2 A4CB FAFC C0B4 DC82 FF02 BAB4" /* ÿÿ÷¤ËúüÀ´Ü‚ÿ.º´ */
- $"BAAB B901 B093 8174 0100 0080 7402 729F" /* º«¹.°“t...€t.rŸ */
- $"B6AB B902 BAAA E981 FF07 ECB3 ABD1 BBB6" /* ¶«¹.ºªéÿ.쳫ѻ¶ */
- $"C0FA 81FF 02E4 AABA AAB9 03B8 AD8E 7380" /* Àúÿ.䪺ª¹.¸­Žs€ */
- $"7401 0000 8074 0272 9BB6 AAB8 02B9 ADC6" /* t...€t.r›¶ª¸.¹­Æ */
- $"84FF 05DC AFB7 B8B4 E082 FF02 BCB1 B9A9" /* „ÿ.ܯ·¸´à‚ÿ.¼±¹© */
- $"B803 B6AB 8A72 8074 0100 0080 7402 7095" /* ¸.¶«Šr€t...€t.p• */
- $"B4AA B602 B5AB F484 FF06 E9B6 B5B6 B4C2" /* ´ª¶.µ«ô„ÿ.鶵¶´Â */
- $"FC81 FF02 E6A9 B7A9 B603 B5A8 8872 8074" /* üÿ.æ©·©¶.µ¨ˆr€t */
- $"0100 0080 7402 6F91 B3A9 B602 B7AD D684" /* ...€t.o‘³©¶.·­Ö„ */
- $"FF02 FAC0 B480 B601 B3E4 82FF 02BD AFB7" /* ÿ.úÀ´€¶.³ä‚ÿ.½¯· */
- $"A8B6 03B4 A584 7280 7401 0000 8074 0270" /* ¨¶.´¥„r€t...€t.p */
- $"8DB2 A9B6 02B4 ACE7 84FF 01D9 B181 B602" /* ²©¶.´¬ç„ÿ.Ù±¶. */
- $"B3C5 FE81 FF02 E8A8 B7A8 B603 B3A3 8172" /* ³Åþÿ.訷¨¶.³£r */
- $"8074 0100 0080 7402 7087 B0A8 B505 B6AA" /* €t...€t.p‡°¨µ.¶ª */
- $"BDA4 C1F5 81FF 02F3 B8B4 82B5 01B2 E782" /* ½¤Áõÿ.ó¸´‚µ.²ç‚ */
- $"FF02 BFAD B6A7 B503 B2A1 7F72 8074 0100" /* ÿ.¿­¶§µ.²¡.r€t.. */
- $"0080 7402 7083 ADA7 B40C B5AC BBFF F2B8" /* .€t.pƒ­§´.µ¬»ÿò¸ */
- $"A2D0 FBFF FFCE B083 B401 B1C5 82FF 02EA" /* ¢Ðûÿÿΰƒ´.±Å‚ÿ.ê */
- $"A7B5 A7B4 03B0 9E7C 7380 7401 0000 8074" /* §µ§´.°ž|s€t...€t */
- $"0271 80AB A8B3 01A5 EC80 FF06 E4AA A9E2" /* .q€«¨³.¥ì€ÿ.䪩â */
- $"EAB2 B284 B301 B1E8 82FF 02BF ABB4 A6B3" /* ê²²„³.±è‚ÿ.¿«´¦³ */
- $"03AE 9B79 7380 7401 0000 8074 0272 7DA8" /* .®›ys€t...€t.r}¨ */
- $"A6B2 02B3 A6C8 82FF 04FE D3A8 B2B1 85B2" /* ¦².³¦È‚ÿ.þÓ¨²±…² */
- $"01AE C582 FF02 EAA6 B3A6 B203 AC98 7873" /* .®Å‚ÿ.꦳¦².¬˜xs */
- $"8074 0100 0080 7403 7278 A5B0 A5B1 02AF" /* €t...€t.rx¥°¥±.¯ */
- $"A9F7 84FF 01DA AB86 B102 B0AF E982 FF02" /* ©÷„ÿ.Ú«†±.°¯é‚ÿ. */
- $"BEA9 B2A5 B103 AB95 7773 8074 0100 0080" /* ¾©²¥±.«•ws€t...€ */
- $"7403 7276 A2AF A4B0 02B1 A2D5 84FF 02F8" /* t.rv¢¯¤°.±¢Õ„ÿ.ø */
- $"BAAE 87B0 01AC C682 FF02 EAA4 B1A5 B003" /* º®‡°.¬Æ‚ÿ.ꤱ¥°. */
- $"A991 7573 8074 0100 0080 7402 7375 9FA4" /* ©‘us€t...€t.suŸ¤ */
- $"AE03 AFA9 B0FE 84FF 01D3 AA88 AE02 ADAD" /* ®.¯©°þ„ÿ.Óªˆ®.­­ */
- $"E982 FF02 BCA7 AFA4 AE01 A78E 8274 0100" /* é‚ÿ.¼§¯¤®.§Ž‚t.. */
- $"0081 7402 729B ADA3 AE02 AFA0 E384 FF02" /* .t.r›­£®.¯ ã„ÿ. */
- $"F0B0 AD89 AE01 AAC4 82FF 02E9 A2AF A4AE" /* ð°­‰®.ªÄ‚ÿ.颯¤® */
- $"01A5 8C82 7401 0000 8174 0270 98AC 97AD" /* .¥Œ‚t...t.p˜¬—­ */
- $"0DAC ADAE ACAE ADAC AEAD ACAE AEA4 BB85" /* .¬­®¬®­¬®­¬®®¤»… */
- $"FF11 C7A7 AEAD ACAE ADAC AEAC ACAE ACAD" /* ÿ.ǧ®­¬®­¬®¬¬®¬­ */
- $"AEAB ABE9 82FF 0EBB A6AE ADAC AEAC ACAE" /* ®««é‚ÿ.»¦®­¬®¬¬® */
- $"ACAD AEAC ADAE 97AD 01A3 8982 7401 0000" /* ¬­®¬­®—­.£‰‚t... */
- $"8174 0270 94AA 95AC 0FAD A79F A1A2 9FA2" /* t.p”ª•¬.­§Ÿ¡¢Ÿ¢ */
- $"A29F A2A1 9FA4 A9A1 EF84 FF12 E6A2 9FA2" /* ¢Ÿ¢¡Ÿ¤©¡ï„ÿ.梟¢ */
- $"A1A0 A3A1 A0A2 A0A0 A3A0 A0A2 9F9D C282" /* ¡ £¡ ¢  £  ¢ŸÂ‚ */
- $"FF10 E6A0 A9A0 A0A2 A0A0 A2A0 A1A3 A0A1" /* ÿ.æ ©  ¢  ¢ ¡£ ¡ */
- $"A2A2 AB94 AC03 ABA1 8673 8174 0100 0081" /* ¢¢«”¬.«¡†st... */
- $"7402 7091 A995 AB0E A9AF FACE C2FF BCCA" /* t.p‘©•«.©¯úÎÂÿ¼Ê */
- $"FFB6 DEFA B4A1 C884 FF14 FDB2 C0FF BFCF" /* ÿ¶Þú´¡È„ÿ.ý²Àÿ¿Ï */
- $"FFAF DCFA AFEA F1A8 F5E4 B2FE D79D E982" /* ÿ¯Üú¯êñ¨õä²þ×é‚ */
- $"FF0F B8A1 E4F8 A9EA F0AE F7E0 ACFF D5C0" /* ÿ.¸¡äø©êð®÷à¬ÿÕÀ */
- $"D1A5 94AB 03AA 9F84 7381 7401 0000 8174" /* Ñ¥”«.ªŸ„st...t */
- $"026F 8CA8 95A9 0EA7 B1FF CEC2 FFD0 DBFF" /* .oŒ¨•©.§±ÿÎÂÿÐÛÿ */
- $"B3E0 FFB6 A2F9 84FF 14D7 99D8 FFBE D0FF" /* ³àÿ¶¢ù„ÿ.×™Øÿ¾Ðÿ */
- $"C5E9 FFAC EEFA C0FE E7B0 FFE8 A3B9 82FF" /* Åéÿ¬îúÀþç°ÿ裹‚ÿ */
- $"0FE2 99EA FFC1 F5F4 ABFB EDC4 FFD7 BED6" /* .â™êÿÁõô«ûíÄÿ×¾Ö */
- $"A394 A903 A89C 8173 8174 0100 0080 7403" /* £”©.¨œst...€t. */
- $"756E 88A6 95A8 04A6 B0FF DDD3 81FF 04C9" /* unˆ¦•¨.¦°ÿÝÓÿ.É */
- $"EBFB A6D5 84FF 06F6 A3DE FFFF D1DE 80FF" /* ëû¦Õ„ÿ.ö£ÞÿÿÑÞ€ÿ */
- $"02FD C4F2 80FF 06EE C6FF FFFA A7E2 82FF" /* .ýÄò€ÿ.îÆÿÿú§â‚ÿ */
- $"01B0 D780 FF02 F6C3 FB80 FF03 E3D3 D5A2" /* .°×€ÿ.öÃû€ÿ.ãÓÕ¢ */
- $"94A8 03A7 9A7F 7381 7401 0000 8074 0375" /* ”¨.§š.st...€t.u */
- $"6E85 A495 A702 A5AF FA85 FF01 C7AB 85FF" /* n…¤•§.¥¯ú…ÿ.Ç«…ÿ */
- $"01C4 B290 FF01 D1B1 82FF 02DD ACFB 87FF" /* .IJÿ.ѱ‚ÿ.ݬû‡ÿ */
- $"01D1 A194 A703 A598 7D73 8174 0100 0081" /* .Ñ¡”§.¥˜}st... */
- $"7402 7082 A295 A602 A4AE FB84 FF02 EF9C" /* t.p‚¢•¦.¤®û„ÿ.ïœ */
- $"E484 FF02 EC9E EB90 FF02 FCA7 DF81 FF02" /* ä„ÿ.ìžëÿ.ü§ßÿ. */
- $"FCAD D787 FF01 D0A0 94A6 03A3 957B 7381" /* ü­×‡ÿ.Р”¦.£•{s */
- $"7401 0000 8174 0270 7EA1 95A6 02A4 AEFB" /* t...t.p~¡•¦.¤®û */
- $"84FF 01B8 B885 FF01 B4BF 92FF 01D4 AD80" /* „ÿ.¸¸…ÿ.´¿’ÿ.Ô­€ */
- $"FF04 FCD4 9CAC FA86 FF01 D0A0 94A6 03A3" /* ÿ.üÔœ¬ú†ÿ.Р”¦.£ */
- $"937A 7381 7401 0000 8174 0270 7B9F 95A4" /* “zst...t.p{Ÿ•¤ */
- $"02A2 ACFA 83FF 02E3 9BF1 84FF 02DE 9EF5" /* .¢¬úƒÿ.ã›ñ„ÿ.Þžõ */
- $"92FF 09FD A8D9 FADB AD8B B1A1 D486 FF01" /* ’ÿÆý¨ÙúÛ­‹±¡Ô†ÿ. */
- $"CF9E 94A4 03A1 9178 7381 7401 0000 8174" /* Ïž”¤.¡‘xst...t */
- $"0270 779D 95A3 02A1 ACFA 82FF 02FD A9C7" /* .pw•£.¡¬ú‚ÿ.ý©Ç */
- $"84FF 02FC A5CD 94FF 09D9 989F 8B9B D3FF" /* „ÿ.ü¥Í”ÿÆÙ˜Ÿ‹›Óÿ */
- $"CDA1 F985 FF01 CF9D 94A3 03A0 8E77 7381" /* Í¡ù…ÿ.Ï”£. Žws */
- $"7401 0000 8174 0271 779A 95A2 02A0 ABFA" /* t...t.qwš•¢. «ú */
- $"82FF 02D4 A0FB 84FF 02CE A2FD 95FF 08A6" /* ‚ÿ.Ô û„ÿ.΢ý•ÿ.¦ */
- $"AEDB FCFF FFFA 9ECF 85FF 01CE 9C94 A203" /* ®ÛüÿÿúžÏ…ÿ.Îœ”¢. */
- $"9E8C 7673 8174 0100 0081 7402 7275 9895" /* žŒvst...t.ru˜• */
- $"A102 9FAA FA81 FF02 F79D D784 FF02 F29C" /* ¡.Ÿªúÿ.÷ׄÿ.òœ */
- $"DE96 FF01 DABD 82FF 02D0 9DF8 84FF 01CE" /* Þ–ÿ.Ú½‚ÿ.Ðø„ÿ.Î */
- $"9A94 A102 9C8A 7582 7401 0000 8174 0272" /* š”¡.œŠu‚t...t.r */
- $"7196 959F 089D A9EE F2F1 F1F6 C0AA 85FF" /* q–•Ÿ.©îòññöÀª…ÿ */
- $"02C0 ADF5 95F1 03F2 F1AE E681 FF03 FCA0" /* .À­õ•ñ.òñ®æÿ.ü  */
- $"C7F5 82F1 02F6 C89A 949F 029A 8775 8274" /* Çõ‚ñ.öÈš”Ÿ.š‡u‚t */
- $"0100 0081 7402 736F 9396 9E00 9F82 A201" /* ...t.so“–ž.Ÿ‚¢. */
- $"93E8 84FF 03E8 9EA2 A396 A202 A39D BB82" /* “è„ÿ.螢£–¢.£»‚ */
- $"FF02 D597 A383 A200 A195 9E01 9985 8374" /* ÿ.Õ—£ƒ¢.¡•ž.™…ƒt */
- $"0100 0081 7403 736E 929D 959E 009D 809C" /* ...t.sn’•ž.€œ */
- $"029D 91BC 84FF 03FE B599 9D99 9C01 9DE7" /* .‘¼„ÿ.þµ™™œ.ç */
- $"81FF 02C7 8D9B 839C 009D 959E 0198 8383" /* ÿ.Ç›ƒœ.•ž.˜ƒƒ */
- $"7401 0000 8274 016E 8F9A 9C02 9A98 F484" /* t...‚t.nšœ.š˜ô„ */
- $"FF01 DA99 9B9C 0997 B9FF FFE4 A7A6 CF91" /* ÿ.Ú™›œÆ—¹ÿÿ䧦ϑ */
- $"9D9B 9C02 9681 7382 7401 0000 8274 026F" /* ›œ.–s‚t...‚t.o */
- $"8C9A 989B 029C 90CF 84FF 02F8 A998 9D9B" /* Œš˜›.œÏ„ÿ.ø©˜› */
- $"08B3 A39A C8FC FFB0 919C 9A9B 0294 8073" /* .³£šÈüÿ°‘œš›.”€s */
- $"8274 0100 0082 7402 6D8A 9998 9A02 989C" /* ‚t...‚t.mŠ™˜š.˜œ */
- $"F484 FF01 CB94 9D9A 0397 A2DD FB80 FF02" /* ô„ÿ.Ë”š.—¢Ýû€ÿ. */
- $"F294 979A 9A02 927E 7382 7401 0000 8174" /* ò”—šš.’~s‚t...t */
- $"0375 6B87 9898 9904 969A 96D2 FE81 FF02" /* .uk‡˜˜™.–š–Òþÿ. */
- $"EF9E 979D 9902 97A1 F382 FF02 D68A 9A99" /* ïž—™.—¡ó‚ÿ.ÖŠš™ */
- $"9902 917C 7382 7401 0000 8174 0375 6A85" /* ™.‘|s‚t...t.uj… */
- $"9797 9806 9798 F1D3 8F9F E480 FF01 BB92" /* ——˜.—˜ñÓŸä€ÿ.»’ */
- $"9F98 0192 CF83 FF02 B68A 9998 9802 8F7B" /* Ÿ˜.’σÿ.¶Š™˜˜.{ */
- $"7382 7401 0000 8174 0375 6A82 9597 960B" /* s‚t...t.uj‚•—–. */
- $"939F FBFF F9BB 89B0 F5E4 9595 9F96 0192" /* “Ÿûÿù»‰°õä••Ÿ–.’ */
- $"AD83 FF03 FA9B 9097 9796 028D 7973 8274" /* ­ƒÿ.ú›——–.ys‚t */
- $"0100 0081 7403 756A 8195 9796 0191 AC81" /* ...t.uj•—–.‘¬ */
- $"FF04 EEA8 97A2 94A0 9602 9597 EC83 FF01" /* ÿ.¢” –.•—ìƒÿ. */
- $"E28A 9796 0395 8C78 7382 7401 0000 8174" /* ⊗–.•Œxs‚t...t */
- $"0375 6C7F 9497 9501 8EBB 82FF 02FE B28E" /* .ul.”—•.Ž»‚ÿ.þ²Ž */
- $"A295 018F CE84 FF02 BD89 9695 9503 948B" /* ¢•.΄ÿ.½‰–••.”‹ */
- $"7873 8274 0100 0081 7403 756D 7D92 9794" /* xs‚t...t.um}’—” */
- $"018C CB81 FF02 F8B8 93A3 9401 90AE 84FF" /* .ŒËÿ.ø¸“£”.®„ÿ */
- $"02F7 9691 9594 0393 8A77 7382 7401 0000" /* .÷–‘•”.“Šws‚t... */
- $"8174 0375 6C7B 9197 9301 8CDD 80FF 02ED" /* t.ul{‘—“.ŒÝ€ÿ.í */
- $"A78D A493 0292 96EE 84FF 02C8 8894 9493" /* §¤“.’–î„ÿ.Ȉ””“ */
- $"0392 8875 7382 7401 0000 8174 0375 6C79" /* .’ˆus‚t...t.uly */
- $"9096 9207 9190 EBFF FFDE 9A8D A692 018C" /* –’.‘ëÿÿÞš¦’.Œ */
- $"CC84 FF02 EF91 9194 9201 9186 8474 0100" /* Ì„ÿ.ï‘‘”’.‘†„t.. */
- $"0081 7403 756B 7790 9692 0690 97F8 FFCC" /* .t.ukw–’.—øÿÌ */
- $"918E A792 028E A6FD 83FF 02FC 9F8F 9492" /* ‘Ž§’.Ž¦ýƒÿ.üŸ”’ */
- $"0191 8584 7401 0000 8174 0375 6B75 8E96" /* .‘…„t...t.ukuŽ– */
- $"9005 8BA7 FCBA 8B8E A990 018D DB83 FF02" /* .‹§üº‹Ž©.Ûƒÿ. */
- $"F79B 8D94 9002 8F83 7383 7401 0000 8174" /* ÷›”.ƒsƒt...t */
- $"0375 6C74 8E96 9004 8CAA AD89 8FAA 9002" /* .ultŽ–.Œª­‰ª. */
- $"8CA3 F982 FF01 CB8C 9590 028F 8373 8374" /* Œ£ù‚ÿ.ËŒ•.ƒsƒt */
- $"0100 0081 7403 756B 728D 988F 008B AD8F" /* ...t.ukr˜.‹­ */
- $"088A B4F9 FFFF F6C3 8E8E 958F 028E 8172" /* .Š´ùÿÿöÃŽŽ•.Žr */
- $"8374 0100 0081 7403 756C 718C CA8E 068A" /* ƒt...t.ulqŒÊŽ.Š */
- $"9DBA B398 898D 968E 028D 8072 8374 0100" /* º³˜‰–Ž.€rƒt.. */
- $"0081 7403 756C 718B CB8E 038B 8888 8B98" /* .t.ulq‹ËŽ.‹ˆˆ‹˜ */
- $"8E02 8C80 7283 7401 0000 8174 0375 6D71" /* Ž.Œ€rƒt...t.umq */
- $"8BEA 8E02 8C80 7283 7401 0000 8174 0375" /* ‹êŽ.Œ€rƒt...t.u */
- $"6D70 8AEA 8D02 8B7F 7283 7401 0000 8174" /* mpŠê.‹.rƒt...t */
- $"0375 6E70 8AEA 8D02 8B7E 7283 7401 0000" /* .unpŠê.‹~rƒt... */
- $"8174 0375 6E70 8AEA 8D02 8B7E 7283 7400" /* t.unpŠê.‹~rƒt. */
- $"0082 7403 756F 6E88 EA8C 0289 7B71 8374" /* .‚t.uonˆêŒ.‰{qƒt */
- $"0000 8374 0372 697B 81E9 8202 7E73 7283" /* ..ƒt.ri{é‚.~srƒ */
- $"7401 0000 8274 0475 706E 7172 E671 0372" /* t...‚t.upnqræq.r */
- $"7270 7284 7401 0000 FB74 0100 00FB 7401" /* rpr„t...ût...ût. */
- $"0000 FB74 0100 00FB 7401 0000 FA74 8100" /* ..ût...ût...út. */
- $"F974 8200 F774 8300 F674 8600 F374 FF00" /* ùt‚.÷tƒ.öt†.ótÿ. */
- $"FF00 0000 7438 6D6B 0000 4008 0000 0000" /* ÿ...t8mk..@..... */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0101 0101 0202 0202 0202 0202 0202 0202" /* ................ */
- $"0202 0202 0202 0202 0202 0202 0202 0101" /* ................ */
- $"0101 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0102 0202" /* ................ */
- $"0304 0505 0606 0606 0606 0606 0606 0606" /* ................ */
- $"0606 0606 0606 0606 0606 0606 0606 0505" /* ................ */
- $"0503 0302 0100 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0001 0100 0000" /* ................ */
- $"0204 0506 0707 0707 0707 0707 0707 0707" /* ................ */
- $"0707 0707 0707 0707 0707 0707 0707 0606" /* ................ */
- $"090A 0805 0302 0100 0000 0000 0000 0000" /* ÆÂ.............. */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0101 001C 2F31" /* ............../1 */
- $"3436 383A 3A3A 3A3A 3A3A 3A3A 3A3A 3A3A" /* 468::::::::::::: */
- $"3A3A 3A3A 3A3A 3A3A 3A3A 3A3A 3A3A 3A34" /* :::::::::::::::4 */
- $"120B 0F0B 0704 0201 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0004 8FF3 FAF9" /* ............óúù */
- $"F9F9 F9F9 F9F9 F9F9 F9F9 F9F9 F9F9 F9F9" /* ùùùùùùùùùùùùùùùù */
- $"F9F9 F9F9 F9F9 F9F9 F9F9 F9F9 F9F9 FAFA" /* ùùùùùùùùùùùùùùúú */
- $"C433 1112 0C07 0402 0100 0000 0000 0000" /* Ä3.............. */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0001 0067 FFFF FFFF" /* ...........gÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFC3 201A 130C 0703 0100 0000 0000 0000" /* ÿÃ ............. */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0001 00A9 FFFF FFFF" /* ...........©ÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFF8 4A20 1B11 0A05 0200 0000 0000 0000" /* ÿøJ ..Â......... */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0002 00B6 FFFF FFFF" /* ...........¶ÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFB 5928 2216 0D07 0200 0000 0000 0000" /* ÿûY("........... */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0103 07CC FFFF FFFF" /* ...........Ìÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFD 6231 291B 1109 0401 0000 0000 0000" /* ÿýb1)..Æ........ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0201 21F0 FFFF FFFF" /* ..........!ðÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF 7337 2F21 160D 0704 0303 0303 0303" /* ÿÿs7/!.......... */
- $"0303 0303 0303 0303 0303 0303 0303 0303" /* ................ */
- $"0303 0303 0303 0303 0303 0303 0303 0303" /* ................ */
- $"0303 0303 0303 0303 0303 0302 0201 0100" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0001 0500 69FF FFFF FFFF" /* ..........iÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF 9A38 3628 1C14 0E0A 0909 0909 0909" /* ÿÿš86(...ÂÆÆÆÆÆÆ */
- $"0909 0909 0909 0909 0909 0909 0909 0909" /* ÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆ */
- $"0909 0909 0909 0909 0909 0909 0909 0909" /* ÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆ */
- $"0909 0909 0909 0909 0909 0807 0604 0302" /* ÆÆÆÆÆÆÆÆÆÆ...... */
- $"0100 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0203 0021 DFFF FFFF FFFF" /* .........!ßÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF E653 312D 231B 1512 1011 1010 1010" /* ÿÿæS1-#......... */
- $"1010 1010 1010 1010 1010 1010 1010 1010" /* ................ */
- $"1010 1010 1010 1010 1010 1010 1010 1010" /* ................ */
- $"1010 1010 1010 1010 1010 0E0C 0A08 0504" /* ............Â... */
- $"0301 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0002 0200 34D3 FFFF FFFF FFFF" /* ........4Óÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFD6 6E40 312A 2522 2121 2121 2121" /* ÿÿÿÖn@1*%"!!!!!! */
- $"2121 2121 2121 2121 2121 2121 2121 2121" /* !!!!!!!!!!!!!!!! */
- $"2121 2121 2121 2121 2121 2121 2121 2121" /* !!!!!!!!!!!!!!!! */
- $"2121 2121 2121 2121 2120 1E1B 1814 0D00" /* !!!!!!!!! ...... */
- $"0203 0100 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0102 006C F4FF FFFF FFFF FFFF" /* .......lôÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FEE8 DAD9 D9D8 D8D8 D8D8 D8D8" /* ÿÿÿÿþèÚÙÙØØØØØØØ */
- $"D8D8 D8D8 D8D8 D8D8 D8D8 D8D8 D8D8 D8D8" /* ØØØØØØØØØØØØØØØØ */
- $"D8D8 D8D8 D8D8 D8D8 D8D8 D8D8 D8D8 D8D8" /* ØØØØØØØØØØØØØØØØ */
- $"D8D8 D8D8 D8D8 D8D8 D8D8 D7D7 D6D5 D5A9" /* ØØØØØØØØØØ××ÖÕÕ© */
- $"1E00 0200 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0001 0300 71FF FFFF FFFF FFFF FFFF" /* ......qÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"8500 0402 0100 0000 0000 0000 0000 0000" /* …............... */
- $"0001 0203 0317 E1FF FFFF FFFF FFFF FFFF" /* ......áÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"9E03 0905 0302 0100 0000 0000 0000 0000" /* ž.Æ............. */
- $"0201 0000 002C E4E8 E8E9 EAEB ECEC EDED" /* .....,äèèéêëììíí */
- $"EDED EDED EDED EDED EDED EDED EDED EDED" /* íííííííííííííííí */
- $"EDED EDED EDED EDED EDED EDED EDED EDED" /* íííííííííííííííí */
- $"EDED EDED ECEC ECEC ECEC ECEC ECEC ECEC" /* ííííìììììììììììì */
- $"ECEC ECEC ECEC ECEC ECEC ECEC ECEC ECEC" /* ìììììììììììììììì */
- $"ECEC ECEC ECEC ECEC ECEC ECEC ECEC ECEC" /* ìììììììììììììììì */
- $"ECEC ECEC ECEC ECEC ECEC ECEB EAE9 E8F4" /* ìììììììììììëêéèô */
- $"8E02 0400 0000 0202 0000 0000 0000 0002" /* Ž............... */
- $"0012 6297 A3A9 BBBD C0C4 C7CA CCCD CECE" /* ..b—£©»½ÀÄÇÊÌÍÎÎ */
- $"CECE CECE CECE CECE CECE CECE CECE CECE" /* ÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎ */
- $"CECE CECE CECE CECE CECE CECE CECE CECE" /* ÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎ */
- $"CECE CECE CDCD CCCC CCCC CBCB CBCB CBCB" /* ÎÎÎÎÍÍÌÌÌÌËËËËËË */
- $"CBCB CBCB CBCB CBCB CBCB CBCB CBCB CBCB" /* ËËËËËËËËËËËËËËËË */
- $"CBCB CBCB CBCB CBCB CBCB CBCB CBCB CBCB" /* ËËËËËËËËËËËËËËËË */
- $"CBCB CBCB CBCB CBCB CBCB CBC9 C8C5 C2C0" /* ËËËËËËËËËËËÉÈÅÂÀ */
- $"B5A6 A5A1 8236 0002 0100 0000 0000 0100" /* µ¦¥¡‚6.......... */
- $"35DC FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* 5Üÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFE 8901 0101 0000 0000 001B" /* ÿÿÿÿÿþ‰......... */
- $"DFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FF73 0002 0000 0001 0082" /* ÿÿÿÿÿÿÿs.......‚ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFE4 1800 0100 0001 00C0" /* ÿÿÿÿÿÿÿä.......À */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF 4500 0200 0002 02C6" /* ÿÿÿÿÿÿÿÿE......Æ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF 4C00 0200 0103 00B3" /* ÿÿÿÿÿÿÿÿL......³ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFE 3D00 0300 0104 009C" /* ÿÿÿÿÿÿÿþ=......œ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFF4 2C04 0400 0105 0087" /* ÿÿÿÿÿÿÿô,......‡ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFE8 2007 0400 0105 0073" /* ÿÿÿÿÿÿÿè ......s */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFD9 1808 0400 0105 015C" /* ÿÿÿÿÿÿÿÙ.......\ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFC7 0E0A 0401 0105 034A" /* ÿÿÿÿÿÿÿÇ.Â.....J */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFB5 0A0A 0402 0105 043C" /* ÿÿÿÿÿÿÿµÂÂ.....< */
- $"FBFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFA1 080A 0402 0105 062B" /* ÿÿÿÿÿÿÿ¡.Â.....+ */
- $"F2FF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* òÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FF8E 050A 0402 0104 0720" /* ÿÿÿÿÿÿÿŽ.Â..... */
- $"E7FF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* çÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FF7C 0609 0300 0104 0817" /* ÿÿÿÿÿÿÿ|.Æ...... */
- $"D8FF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* Øÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FF68 0709 0300 0104 0A0E" /* ÿÿÿÿÿÿÿh.Æ....Â. */
- $"C8FF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* Èÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FF55 0809 0300 0104 0A0A" /* ÿÿÿÿÿÿÿU.Æ....ÂÂ */
- $"B7FF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ·ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FF47 0909 0300 0104 0A07" /* ÿÿÿÿÿÿÿGÆÆ....Â. */
- $"A4FF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ¤ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF F638 0B08 0300 0004 0A05" /* ÿÿÿÿÿÿö8......Â. */
- $"91FF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF EE2B 0C08 0300 0004 0905" /* ÿÿÿÿÿÿî+......Æ. */
- $"81FF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF E224 0D08 0300 0003 0906" /* ÿÿÿÿÿÿâ$......Æ. */
- $"71FF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* qÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF D51C 0E08 0300 0003 0907" /* ÿÿÿÿÿÿÕ.......Æ. */
- $"5EFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ^ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF C714 0F07 0200 0003 0908" /* ÿÿÿÿÿÿÇ.......Æ. */
- $"4FFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* Oÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF B811 0E07 0200 0003 090A" /* ÿÿÿÿÿÿ¸.......ÆÂ */
- $"43FD FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* Cýÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF A70E 0F07 0200 0003 080B" /* ÿÿÿÿÿÿ§......... */
- $"34F5 FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* 4õÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF 960C 0E06 0200 0002 080D" /* ÿÿÿÿÿÿ–......... */
- $"29EB FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* )ëÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF 850C 0E07 0200 0003 080E" /* ÿÿÿÿÿÿ…......... */
- $"22E0 FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* "àÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF 760D 0E06 0200 0003 080F" /* ÿÿÿÿÿÿv......... */
- $"1BD3 FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* .Óÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF 650E 0E06 0200 0002 080F" /* ÿÿÿÿÿÿe......... */
- $"14C7 FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* .Çÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF 580E 0D06 0200 0002 070F" /* ÿÿÿÿÿÿX......... */
- $"11B9 FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* .¹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF 4E10 0D06 0100 0002 070F" /* ÿÿÿÿÿÿN......... */
- $"10AB FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* .«ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFF8 4211 0D06 0200 0002 070F" /* ÿÿÿÿÿøB......... */
- $"0D9B FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* .›ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFF1 3513 0D06 0200 0002 080F" /* ÿÿÿÿÿñ5......... */
- $"0C8D FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* .ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFE9 2E13 0D05 0100 0002 070F" /* ÿÿÿÿÿé.......... */
- $"0D81 FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* .ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFDF 2914 0D06 0100 0002 070F" /* ÿÿÿÿÿß)......... */
- $"0E73 FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* .sÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFD4 2215 0C06 0100 0002 070F" /* ÿÿÿÿÿÔ"......... */
- $"0F64 FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* .dÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFC9 1C16 0C05 0100 0002 070F" /* ÿÿÿÿÿÉ.......... */
- $"1058 FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* .Xÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFBD 1A15 0C05 0100 0002 070F" /* ÿÿÿÿÿ½.......... */
- $"114F FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* .Oÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFB2 1815 0C05 0100 0002 070E" /* ÿÿÿÿÿ².......... */
- $"1246 FAFF FFFF FFFF FFFF FFFF FFFF FFFF" /* .Fúÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFA5 1615 0C05 0100 0002 070E" /* ÿÿÿÿÿ¥.......... */
- $"133B F4FF FFFF FFFF FFFF FFFF FFFF FFFF" /* .;ôÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FF98 1515 0C05 0100 0002 060E" /* ÿÿÿÿÿ˜.......... */
- $"1533 EEFF FFFF FFFF FFFF FFFF FFFF FFFF" /* .3îÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FF8D 1515 0B05 0100 0002 070E" /* ÿÿÿÿÿ.......... */
- $"152F E6FF FFFF FFFF FFFF FFFF FFFF FFFF" /* ./æÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FF82 1615 0B05 0100 0002 070E" /* ÿÿÿÿÿ‚.......... */
- $"1629 DDFF FFFF FFFF FFFF FFFF FFFF FFFF" /* .)Ýÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FF77 1615 0B05 0100 0002 060E" /* ÿÿÿÿÿw.......... */
- $"1624 D5FF FFFF FFFF FFFF FFFF FFFF FFFF" /* .$Õÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FF6B 1715 0B05 0100 0002 060E" /* ÿÿÿÿÿk.......... */
- $"1720 CCFF FFFF FFFF FFFF FFFF FFFF FFFF" /* . Ìÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FF61 1815 0B05 0100 0002 060E" /* ÿÿÿÿÿa.......... */
- $"181D C3FF FFFF FFFF FFFF FFFF FFFF FFFF" /* ..Ãÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FF5B 1914 0B05 0100 0002 060E" /* ÿÿÿÿÿ[.......... */
- $"181C BAFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ..ºÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FE54 1A14 0B05 0100 0002 070E" /* ÿÿÿÿþT.......... */
- $"181B B0FF FFFF FFFF FFFF FFFF FFFF FFFF" /* ..°ÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF F94C 1B15 0B04 0100 0002 060E" /* ÿÿÿÿùL.......... */
- $"181A A6FF FFFF FFFF FFFF FFFF FFFF FFFF" /* ..¦ÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF F544 1C15 0B05 0100 0002 070E" /* ÿÿÿÿõD.......... */
- $"1819 9DFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ..ÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF F13D 1D14 0B04 0100 0002 060E" /* ÿÿÿÿñ=.......... */
- $"1819 95FF FFFF FFFF FFFF FFFF FFFF FFFF" /* ..•ÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF EB3A 1D14 0B05 0100 0002 070E" /* ÿÿÿÿë:.......... */
- $"1819 8EFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ..Žÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF E537 1E14 0B05 0100 0002 070E" /* ÿÿÿÿå7.......... */
- $"181A 86FF FFFF FFFF FFFF FFFF FFFF FFFF" /* ..†ÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF DF34 1E14 0B05 0100 0002 070E" /* ÿÿÿÿß4.......... */
- $"181B 7EFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ..~ÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF D930 1F15 0B05 0100 0002 070E" /* ÿÿÿÿÙ0.......... */
- $"181B 78FF FFFF FFFF FFFF FFFF FFFF FFFF" /* ..xÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF D32D 1F15 0B05 0100 0002 070F" /* ÿÿÿÿÓ-.......... */
- $"191C 71FF FFFF FFFF FFFF FFFF FFFF FFFF" /* ..qÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF CE29 2015 0B05 0100 0002 070F" /* ÿÿÿÿÎ) ......... */
- $"191D 6AFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ..jÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF C828 2015 0B05 0100 0002 070F" /* ÿÿÿÿÈ( ......... */
- $"191D 65FF FFFF FFFF FFFF FFFF FFFF FFFF" /* ..eÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF C328 2015 0B05 0100 0002 070F" /* ÿÿÿÿÃ( ......... */
- $"191E 61FF FFFF FFFF FFFF FFFF FFFF FFFF" /* ..aÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF BE28 2115 0B05 0100 0002 070F" /* ÿÿÿÿ¾(!......... */
- $"191F 5DFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ..]ÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF B827 2115 0C05 0100 0002 070F" /* ÿÿÿÿ¸'!......... */
- $"1920 5AFE FFFF FFFF FFFF FFFF FFFF FFFF" /* . Zþÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF B427 2115 0C05 0100 0003 0710" /* ÿÿÿÿ´'!......... */
- $"1A21 58FD FFFF FFFF FFFF FFFF FFFF FFFF" /* .!Xýÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF B026 2115 0C05 0100 0003 0810" /* ÿÿÿÿ°&!......... */
- $"1A21 55FB FFFF FFFF FFFF FFFF FFFF FFFF" /* .!Uûÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF AC26 2116 0C05 0200 0003 0810" /* ÿÿÿÿ¬&!......... */
- $"1A22 52F9 FFFF FFFF FFFF FFFF FFFF FFFF" /* ."Rùÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF A826 2215 0C05 0100 0003 0810" /* ÿÿÿÿ¨&"......... */
- $"1A23 4FF7 FFFF FFFF FFFF FFFF FFFF FFFF" /* .#O÷ÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF A426 2316 0D06 0200 0003 0811" /* ÿÿÿÿ¤&#......... */
- $"1B24 4DF6 FFFF FFFF FFFF FFFF FFFF FFFF" /* .$Möÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF A126 2316 0D06 0200 0003 0911" /* ÿÿÿÿ¡&#.......Æ. */
- $"1C25 4CF5 FFFF FFFF FFFF FFFF FFFF FFFF" /* .%Lõÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF 9F26 2317 0D06 0200 0003 0912" /* ÿÿÿÿŸ&#.......Æ. */
- $"1C25 4CF5 FFFF FFFF FFFF FFFF FFFF FFFF" /* .%Lõÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF 9E26 2317 0D06 0200 0003 0912" /* ÿÿÿÿž&#.......Æ. */
- $"1C26 4BF4 FFFF FFFF FFFF FFFF FFFF FFFF" /* .&Kôÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF 9D27 2317 0D06 0200 0004 0912" /* ÿÿÿÿ'#.......Æ. */
- $"1C26 4AF3 FFFF FFFF FFFF FFFF FFFF FFFF" /* .&Jóÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF 9C27 2417 0D06 0200 0104 0912" /* ÿÿÿÿœ'$.......Æ. */
- $"1C26 47F2 FFFF FFFF FFFF FFFF FFFF FFFF" /* .&Gòÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF 9A27 2417 0D06 0200 0103 0911" /* ÿÿÿÿš'$.......Æ. */
- $"1B27 37D1 FFFF FFFF FFFF FFFF FFFF FFFF" /* .'7Ñÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF 7329 2316 0D06 0200 0003 0810" /* ÿÿÿÿs)#......... */
- $"1A27 2F59 B7C6 C6C7 C7C7 C7C7 C7C7 C7C7" /* .'/Y·ÆÆÇÇÇÇÇÇÇÇÇ */
- $"C7C7 C7C7 C7C7 C7C7 C7C7 C7C7 C7C7 C7C7" /* ÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇ */
- $"C7C7 C7C7 C7C7 C7C7 C7C7 C7C7 C7C7 C7C7" /* ÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇ */
- $"C7C7 C7C7 C7C7 C7C7 C7C7 C7C7 C7C7 C7C7" /* ÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇ */
- $"C7C7 C7C7 C7C7 C7C7 C7C7 C7C7 C7C7 C7C7" /* ÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇ */
- $"C7C7 C7C7 C7C7 C7C7 C7C7 C7C7 C7C7 C7C7" /* ÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇ */
- $"C7C7 C7C7 C7C7 C7C7 C7C7 C7C7 C7C7 C7C7" /* ÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇ */
- $"C7C5 C689 372D 2015 0C06 0200 0003 070E" /* ÇÅƉ7- ......... */
- $"1723 3037 3C46 4C4F 5050 5050 5050 5050" /* .#07<FLOPPPPPPPP */
- $"5050 5050 5050 5050 5050 5050 5050 5050" /* PPPPPPPPPPPPPPPP */
- $"5050 5050 5050 5050 5050 5050 5050 5050" /* PPPPPPPPPPPPPPPP */
- $"5050 5050 5050 5050 5050 5050 5050 5050" /* PPPPPPPPPPPPPPPP */
- $"5050 5050 5050 5050 5050 5050 5050 5050" /* PPPPPPPPPPPPPPPP */
- $"5050 5050 5050 5050 5050 5050 5050 5050" /* PPPPPPPPPPPPPPPP */
- $"5050 5050 5050 5050 5050 5050 5050 5050" /* PPPPPPPPPPPPPPPP */
- $"4D49 4138 352A 1D13 0A05 0100 0003 060C" /* MIA85*..Â....... */
- $"141E 2934 3D44 494C 4D4E 4E4E 4E4E 4E4E" /* ..)4=DILMNNNNNNN */
- $"4E4E 4E4E 4E4E 4E4E 4E4E 4E4E 4E4E 4E4E" /* NNNNNNNNNNNNNNNN */
- $"4E4E 4E4E 4E4E 4E4E 4E4E 4E4E 4E4E 4E4E" /* NNNNNNNNNNNNNNNN */
- $"4E4E 4E4E 4E4E 4E4E 4E4E 4E4E 4E4E 4E4E" /* NNNNNNNNNNNNNNNN */
- $"4E4E 4E4E 4E4E 4E4E 4E4E 4E4E 4E4E 4E4E" /* NNNNNNNNNNNNNNNN */
- $"4E4E 4E4E 4E4E 4E4E 4E4E 4E4E 4E4E 4E4E" /* NNNNNNNNNNNNNNNN */
- $"4E4E 4E4E 4E4E 4E4E 4E4E 4E4E 4E4E 4E4D" /* NNNNNNNNNNNNNNNM */
- $"4B46 4039 2F24 1910 0904 0100 0002 050A" /* KF@9/$..Æ...... */
- $"1018 212B 3339 3D40 4142 4242 4242 4242" /* ..!+39=@ABBBBBBB */
- $"4242 4242 4242 4242 4242 4242 4242 4242" /* BBBBBBBBBBBBBBBB */
- $"4242 4242 4242 4242 4242 4242 4242 4242" /* BBBBBBBBBBBBBBBB */
- $"4242 4242 4242 4242 4242 4242 4242 4242" /* BBBBBBBBBBBBBBBB */
- $"4242 4242 4242 4242 4242 4242 4242 4242" /* BBBBBBBBBBBBBBBB */
- $"4242 4242 4242 4242 4242 4242 4242 4242" /* BBBBBBBBBBBBBBBB */
- $"4242 4242 4242 4242 4242 4242 4242 4140" /* BBBBBBBBBBBBBBA@ */
- $"3F3B 352F 261D 140D 0703 0100 0002 0407" /* ?;5/&........... */
- $"0C12 1920 272C 2F32 3233 3333 3333 3333" /* ... ',/223333333 */
- $"3333 3333 3333 3333 3333 3333 3333 3333" /* 3333333333333333 */
- $"3333 3333 3333 3333 3333 3333 3333 3333" /* 3333333333333333 */
- $"3333 3333 3333 3333 3333 3333 3333 3333" /* 3333333333333333 */
- $"3333 3333 3333 3333 3333 3333 3333 3333" /* 3333333333333333 */
- $"3333 3333 3333 3333 3333 3333 3333 3333" /* 3333333333333333 */
- $"3333 3333 3333 3333 3333 3333 3333 3332" /* 3333333333333332 */
- $"302D 2924 1D16 0F09 0502 0100 0001 0305" /* 0-)$...Æ........ */
- $"080D 1217 1C1F 2223 2425 2525 2525 2525" /* ......"#$%%%%%%% */
- $"2525 2525 2525 2525 2525 2525 2525 2525" /* %%%%%%%%%%%%%%%% */
- $"2525 2525 2525 2525 2525 2525 2525 2525" /* %%%%%%%%%%%%%%%% */
- $"2525 2525 2525 2525 2525 2525 2525 2525" /* %%%%%%%%%%%%%%%% */
- $"2525 2525 2525 2525 2525 2525 2525 2525" /* %%%%%%%%%%%%%%%% */
- $"2525 2525 2525 2525 2525 2525 2525 2525" /* %%%%%%%%%%%%%%%% */
- $"2525 2525 2525 2525 2525 2525 2525 2524" /* %%%%%%%%%%%%%%%$ */
- $"2221 1E19 1510 0B07 0402 0000 0000 0103" /* "!.............. */
- $"0609 0C10 1315 1718 1919 1919 1919 1919" /* .Æ.............. */
- $"1919 1919 1919 1919 1919 1919 1919 1919" /* ................ */
- $"1919 1919 1919 1919 1919 1919 1919 1919" /* ................ */
- $"1919 1919 1919 1919 1919 1919 1919 1919" /* ................ */
- $"1919 1919 1919 1919 1919 1919 1919 1919" /* ................ */
- $"1919 1919 1919 1919 1919 1919 1919 1919" /* ................ */
- $"1919 1919 1919 1919 1919 1919 1919 1918" /* ................ */
- $"1716 1411 0E0A 0704 0201 0000 0000 0002" /* .....Â.......... */
- $"0305 0709 0B0D 0E0F 0F0F 0F0F 0F0F 0F0F" /* ...Æ............ */
- $"0F0F 0F0F 0F0F 0F0F 0F0F 0F0F 0F0F 0F0F" /* ................ */
- $"0F0F 0F0F 0F0F 0F0F 0F0F 0F0F 0F0F 0F0F" /* ................ */
- $"0F0F 0F0F 0F0F 0F0F 0F0F 0F0F 0F0F 0F0F" /* ................ */
- $"0F0F 0F0F 0F0F 0F0F 0F0F 0F0F 0F0F 0F0F" /* ................ */
- $"0F0F 0F0F 0F0F 0F0F 0F0F 0F0F 0F0F 0F0F" /* ................ */
- $"0F0F 0F0F 0F0F 0F0F 0F0F 0F0F 0F0F 0F0F" /* ................ */
- $"0F0D 0C0A 0806 0402 0100 0000 0000 0001" /* ...Â............ */
- $"0103 0304 0607 0708 0808 0808 0808 0808" /* ................ */
- $"0808 0808 0808 0808 0808 0808 0808 0808" /* ................ */
- $"0808 0808 0808 0808 0808 0808 0808 0808" /* ................ */
- $"0808 0808 0808 0808 0808 0808 0808 0808" /* ................ */
- $"0808 0808 0808 0808 0808 0808 0808 0808" /* ................ */
- $"0808 0808 0808 0808 0808 0808 0808 0808" /* ................ */
- $"0808 0808 0808 0808 0808 0808 0808 0808" /* ................ */
- $"0707 0605 0403 0201 0000 0000 0000 0000" /* ................ */
- $"0001 0102 0202 0203 0303 0303 0303 0303" /* ................ */
- $"0303 0303 0303 0303 0303 0303 0303 0303" /* ................ */
- $"0303 0303 0303 0303 0303 0303 0303 0303" /* ................ */
- $"0303 0303 0303 0303 0303 0303 0303 0303" /* ................ */
- $"0303 0303 0303 0303 0303 0303 0303 0303" /* ................ */
- $"0303 0303 0303 0303 0303 0303 0303 0303" /* ................ */
- $"0303 0303 0303 0303 0303 0303 0303 0303" /* ................ */
- $"0202 0202 0201 0100 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 6963 3038" /* ............ic08 */
- $"0000 5CBD 0000 000C 6A50 2020 0D0A 870A" /* ..\½....jP .‡ */
- $"0000 0014 6674 7970 6A70 3220 0000 0000" /* ....ftypjp2 .... */
- $"6A70 3220 0000 004F 6A70 3268 0000 0016" /* jp2 ...Ojp2h.... */
- $"6968 6472 0000 0100 0000 0100 0004 0707" /* ihdr............ */
- $"0100 0000 000F 636F 6C72 0100 0000 0000" /* ......colr...... */
- $"1000 0000 2263 6465 6600 0400 0000 0000" /* ...."cdef....... */
- $"0100 0300 0100 0000 0100 0000 0200 0200" /* ................ */
- $"0000 0300 0000 006A 7032 63FF 4FFF 5100" /* .......jp2cÿOÿQ. */
- $"3200 0000 0001 0000 0001 0000 0000 0000" /* 2............... */
- $"0000 0000 0001 0000 0001 0000 0000 0000" /* ................ */
- $"0000 0000 0407 0101 0701 0107 0101 0701" /* ................ */
- $"01FF 5200 0C00 0000 0101 0504 0400 01FF" /* .ÿR............ÿ */
- $"5C00 1320 5058 5860 5858 6058 5860 5858" /* \.. PXX`XX`XX`XX */
- $"5850 5058 FF64 0011 0001 4B61 6B61 6475" /* XPPXÿd....Kakadu */
- $"2D76 352E 322E 31FF 9000 0A00 0000 005B" /* -v5.2.1ÿ.Â....[ */
- $"D000 01FF 93CF C100 1507 F18D 1991 E793" /* Ð..ÿ“ÏÁ...ñ.‘ç“ */
- $"D8B4 6B7C 459C 4F68 E4BF E0FF 0D3D C2DF" /* Ø´k|EœOhä¿àÿ.=Âß */
- $"FC16 8F7F 6C3A 7FEA ACD5 8632 D1AD 37A6" /* ü..l:.ê¬Õ†2Ñ­7¦ */
- $"22E3 4753 734F 3BFA 0372 1596 A8F1 7183" /* "ãGSsO;ú.r.–¨ñqƒ */
- $"2F17 0A65 C5C2 6A8E C0F9 1000 39CE 9180" /* /.ÂeÅÂjŽÀù..9Α€ */
- $"AE4A F551 B521 2839 FEE4 4D31 9F98 9F17" /* ®JõQµ!(9þäM1Ÿ˜Ÿ. */
- $"29F2 C91D 3B35 397E 15A1 8246 C3EA 3107" /* )òÉ.;59~.¡‚FÃê1. */
- $"5630 A744 5105 404A C843 0AE4 304B 4FE9" /* V0§DQ.@JÈCÂä0KOé */
- $"81E4 4C91 DF64 6885 8D23 6517 B254 DE23" /* äL‘ßdh…#e.²TÞ# */
- $"6101 3C94 9245 923D 4F4C 0F02 784C F319" /* a.<”’E’=OL..xLó. */
- $"CFC0 FC11 7EC2 D9C4 3907 5FDC 553A F1E1" /* ÏÀü.~ÂÙÄ9._ÜU:ñá */
- $"F2BC 6420 59D8 7D25 F42A 5BA5 8E8E 7166" /* ò¼d YØ}%ô*[¥ŽŽqf */
- $"AD5D 5C91 CC75 1452 ACDA 64CA 3249 CCE3" /* ­]\‘Ìu.R¬ÚdÊ2IÌã */
- $"6874 83E2 633E 64E7 8159 4AA2 FD3C 638D" /* htƒâc>dçYJ¢ý<c */
- $"F978 C3ED 328F C0F2 1F81 A80C BB81 9421" /* ùxÃí2Àò.¨.»”! */
- $"980D F457 0EA7 7782 676F 2AB3 EE8F 99C2" /* ˜.ôW.§w‚go*³î™Â */
- $"2221 9D95 8C80 C3A8 91F3 4C08 6A03 DE45" /* "!•Œ€Ã¨‘óL.j.ÞE */
- $"A985 9B7B 9ED3 A9A4 D929 A97F A125 FE22" /* ©…›{žÓ©¤Ù)©.¡%þ" */
- $"A893 77F3 EF0F C15C 3969 A153 3A7C 3110" /* ¨“wóï.Á\9i¡S:|1. */
- $"7A9C 9227 D2F6 BCA8 1A04 0219 8F36 21B7" /* zœ’'Òö¼¨....6!· */
- $"B37C 2AB6 678A 1675 BA9E 03B4 53BA 33B9" /* ³|*¶gŠ.uºž.´Sº3¹ */
- $"06AD 96D8 BDBC BFC8 5134 C040 7EBA B756" /* .­–ؽ¼¿ÈQ4À@~º·V */
- $"E619 DC67 BC83 BB39 AA42 65E1 5BBC 45B4" /* æ.Üg¼ƒ»9ªBeá[¼E´ */
- $"ECB6 E6ED D098 3C9F E17B 876D A039 553E" /* ì¶æíИ<Ÿá{‡m 9U> */
- $"5CF9 2D3F 6F47 4854 7085 62C1 C65D C07C" /* \ù-?oGHTp…bÁÆ]À| */
- $"86A0 3E43 500F 90D0 4787 8CE8 726C 5109" /* † >CP.ÐG‡ŒèrlQÆ */
- $"FD68 8099 E8FE 2A66 2F02 78F5 C78B 6A34" /* ýh€™èþ*f/.xõÇ‹j4 */
- $"0A9E 25FE 0DE3 E3C8 BD7B 3530 98D5 CF03" /* ž%þ.ããȽ{50˜ÕÏ. */
- $"CE64 A57D 620C 87C5 65B4 7BE1 34BC 3058" /* Îd¥}b.‡Åe´{á4¼0X */
- $"572A 9EBF 5E0C 5A01 80A3 B334 DF5A E1B8" /* W*ž¿^.Z.€£³4ßZḠ*/
- $"08C3 5C30 2CC4 C1F5 1341 F516 40FA 8A00" /* .Ã\0,ÄÁõ.Aõ.@úŠ. */
- $"477D B516 AD2F 4DD3 BE8C 58F0 7C77 A236" /* G}µ.­/MÓ¾ŒXð|w¢6 */
- $"DD43 6611 D582 F050 DC31 59D0 194D A6FD" /* ÝCf.Õ‚ðPÜ1YÐ.M¦ý */
- $"652E FA16 4BA7 25FE 0DE3 E3D9 B950 06E2" /* e.ú.K§%þ.ããÙ¹P.â */
- $"3A8A DA86 827A 4C68 5798 55FC FD46 A583" /* :ŠÚ†‚zLhW˜UüýF¥ƒ */
- $"064D 8FB0 29D9 8DAD 53CC 5229 B675 ACAB" /* .M°)Ù­SÌR)¶u¬« */
- $"8EED 34BC 2F12 142E 446C 0DF7 0BC3 D6E7" /* Ží4¼/...Dl.÷.ÃÖç */
- $"A086 8D72 6AE7 9270 B97C D981 C7F1 C38A" /*  †rjç’p¹|ÙÇñÊ */
- $"47EE E585 FC19 FCE3 668C C7E0 471F 813C" /* Gîå…ü.üãfŒÇàG.< */
- $"3F02 0005 B422 0345 FC66 9A91 446D DDCA" /* ?...´".Eüfš‘DmÝÊ */
- $"449B CCDB 8E8F A0B8 3942 A8FC 6409 F7F3" /* D›ÌÛŽ ¸9B¨üdÆ÷ó */
- $"ED01 353A 2B01 1B0C 2939 619B 9890 94E7" /* í.5:+...)9a›˜”ç */
- $"5FDA 75F2 7323 BF3A 7AED 757E 42D6 C336" /* _Úuòs#¿:zíu~BÖÃ6 */
- $"E74E 6B5F 2D43 4780 CA1C C462 6507 4801" /* çNk_-CG€Ê.Äbe.H. */
- $"EDEF 5B2A 7297 8FC6 1E13 E7FA 56B5 4279" /* íï[*r—Æ..çúVµBy */
- $"5BB4 B307 F4DE E273 4FC3 E9B1 72C3 EDA2" /* [´³.ôÞâsOÃé±rÃí¢ */
- $"A3F0 A9E0 FB5D C018 B35C 8B45 CD63 99FE" /* £ð©àû]À.³\‹EÍc™þ */
- $"11FB 8993 21D1 BA8B 69EB 5CB9 F258 468F" /* .û‰“!Ѻ‹ië\¹òXF */
- $"73D4 6804 C6E6 045E AE54 954C D0E5 D836" /* sÔh.Ææ.^®T•LÐåØ6 */
- $"EA0D DB9A 2806 36FA B3E9 5973 789D 6591" /* ê.Ûš(.6ú³éYsxe‘ */
- $"1EC2 F271 E9E2 5681 C542 A2FC F4EF 8111" /* .ÂòqéâVÅB¢üôï. */
- $"59D5 FC91 9749 52A3 EA37 B239 4939 8625" /* YÕü‘—IR£ê7²9I9†% */
- $"F248 18D2 075A 80A1 8005 9ED2 437F C705" /* òH.Ò.Z€¡€.žÒC.Ç. */
- $"2BFD 308C F1F0 E1BC 8FDA F5D5 50D9 9770" /* +ý0Œñðá¼ÚõÕPÙ—p */
- $"7EF5 213F 91F6 5B8B 189D EE67 70EF F40A" /* ~õ!?‘ö[‹.îgpïôÂ */
- $"2E24 C54B F37D 4941 FCD2 7779 5C8B 59CC" /* .$ÅKó}IAüÒwy\‹YÌ */
- $"F284 3377 A496 0399 6F17 47AC B5EA 3A84" /* ò„3w¤–.™o.G¬µê:„ */
- $"844E DC13 D058 BE9F 1BBE 8CE0 E615 D2E1" /* „NÜ.ÐX¾Ÿ.¾Œàæ.Òá */
- $"88A5 9DA6 9FB4 4EDE B804 ED14 A7EA 54E0" /* ˆ¥¦Ÿ´NÞ¸.í.§êTà */
- $"5A87 311B 5E69 70F5 EDA3 2E78 8862 7603" /* Z‡1.^ipõí£.xˆbv. */
- $"7761 094D 4A69 5AB0 A9BB 3F4F 92BE 205B" /* waÆMJiZ°©»?O’¾ [ */
- $"A226 24D5 C8B2 CCF7 E064 31C7 E727 6E2C" /* ¢&$ÕȲÌ÷àd1Çç'n, */
- $"D6A1 347F 41CD 5F70 E1C0 1AFC 4FBC 81A9" /* Ö¡4.AÍ_páÀ.üO¼© */
- $"A884 F03A CD84 B581 1F03 A523 838B 8038" /* ¨„ð:Í„µ..¥#ƒ‹€8 */
- $"02F4 6DE8 98FC EDD6 B331 21F7 4AC5 A31E" /* .ômè˜üíÖ³1!÷JÅ£. */
- $"9EB4 E770 D465 386E 18A6 D1BE EF6D B008" /* ž´çpÔe8n.¦Ñ¾ïm°. */
- $"63E6 1066 1374 4D10 3270 8C7F F297 F91D" /* cæ.f.tM.2pŒ.ò—ù. */
- $"DA61 677B 29FD A878 B122 E33C 17E3 8ED1" /* Úag{)ý¨x±"ã<.ãŽÑ */
- $"FB8E 4407 8B82 32AD 1B50 09DF BDA8 C80E" /* ûŽD.‹‚2­.PÆß½¨È. */
- $"7E28 ED9D A005 4297 B9C1 8D66 CA77 C41D" /* ~(í .B—¹ÁfÊwÄ. */
- $"41C5 E3B3 F94D 96E5 1308 7C59 1EB8 0871" /* AÅã³ùM–å..|Y.¸.q */
- $"C7A4 FED7 47F2 F800 6889 A21D 1FF4 9E93" /* Ǥþ×Gòø.h‰¢..ôž“ */
- $"1321 7377 D96E 86F5 A0CB EB17 C77A 81C0" /* .!swÙn†õ Ëë.ÇzÀ */
- $"7C8D A01F 0E91 00F9 1D00 94FD 4D32 E5DB" /* | ..‘.ù..”ýM2åÛ */
- $"0482 DEB8 CF1C 792A EA3B DECA 4470 4898" /* .‚Þ¸Ï.y*ê;ÞÊDpH˜ */
- $"81C0 5457 FE66 63DD CAF3 0B98 08E1 DC3F" /* ÀTWþfcÝÊó.˜.áÜ? */
- $"CF68 7F31 9BEE 73EF A3A5 8D57 8969 EEC3" /* Ïh.1›îsW‰iîà */
- $"0F13 3ED9 390D FC4C B37F C4F7 01E4 B115" /* ..>Ù9.üL³.Ä÷.ä±. */
- $"E9F9 9526 00FA 10D0 0D64 4CC5 8481 D231" /* éù•&.ú.Ð.dLÅ„Ò1 */
- $"DE6D 483E 8046 7F58 5BD3 1FFC CF82 297A" /* ÞmH>€F.X[Ó.üÏ‚)z */
- $"88A1 7E78 0668 3222 9E8B A287 30A3 DB10" /* ˆ¡~x.h2"ž‹¢‡0£Û. */
- $"A77F A842 87FC 164E 92B8 96DF 4920 EEC2" /* §.¨B‡ü.N’¸–ßI î */
- $"47B6 83F1 F68F 9309 63CE FAAC 3C8F 9FCF" /* G¶ƒñö“ÆcÎú¬<ŸÏ */
- $"A166 9621 ADC0 0ABB 7F1A 7E3C A4AD 3755" /* ¡f–!­À»..~<¤­7U */
- $"E2D8 E26D CAD1 6F24 F808 BC0D E94B EEBC" /* âØâmÊÑo$ø.¼.éKî¼ */
- $"D601 C1F5 30C1 F53B C0FA 97C0 90E6 901B" /* Ö.Áõ0Áõ;Àú—Àæ. */
- $"71C2 1EAB 8A4C 52A4 4431 058C DFB9 4148" /* qÂ.«ŠLR¤D1.Œß¹AH */
- $"185C 1E93 01C6 82D3 C81B 6398 8173 189D" /* .\.“.Æ‚ÓÈ.c˜s. */
- $"F73C 4887 5155 0C95 0088 4C69 0A27 3F39" /* ÷<H‡QU.•.ˆLiÂ'?9 */
- $"8CCA 32D8 1FD7 A3F4 CDD8 6275 5E7E 3619" /* ŒÊ2Ø.×£ôÍØbu^~6. */
- $"8D18 68C9 D2C7 0FCB 18EA FB01 5A68 4A52" /* .hÉÒÇ.Ë.êû.ZhJR */
- $"3C08 5313 5ED2 9B7D 31B5 953C 2F92 22F7" /* <.S.^Ò›}1µ•</’"÷ */
- $"3764 04E8 A9A6 C747 8DFD 9730 01DD 82E1" /* 7d.試ÇGý—0.Ý‚á */
- $"B08A FD72 7C33 A9BF AFEA 7188 AC4B 2B45" /* °Šýr|3©¿¯êqˆ¬K+E */
- $"BBB2 7826 6704 5864 9BAF 91FC 6BD3 E9D7" /* »²x&g.Xd›¯‘ükÓé× */
- $"0E30 E428 0FB2 4836 F94F 7CB9 3723 72A2" /* .0ä(.²H6ùO|¹7#r¢ */
- $"AB4C C0EB ED8F 823B B8D6 C4A6 E4B5 B41C" /* «LÀëí‚;¸ÖĦ䵴. */
- $"B0FC 0171 880F E77C 1EF8 9645 A8B4 969A" /* °ü.qˆ.ç|.ø–E¨´–š */
- $"5420 86B9 71CE 0DE5 7A40 B41A DD85 6B30" /* T †¹qÎ.åz@´.Ý…k0 */
- $"F02A 3B61 92B4 7A95 269E BF9F DDB3 9FB7" /* ð*;a’´z•&ž¿ŸÝ³Ÿ· */
- $"746B 1514 C89D 391B F835 73B8 0F1C 2567" /* tk..È9.ø5s¸..%g */
- $"A0C2 6B37 DFCE 5F4C 1DCD FD79 5CDA A8FF" /*  Âk7ßÎ_L.Íýy\Ú¨ÿ */
- $"0603 9014 308F AEB3 EDB7 D721 1709 3897" /* ...0®³í·×!.Æ8— */
- $"D3AB 181E 53BE 4025 3492 41C2 5EC7 BFC0" /* Ó«..S¾@%4’AÂ^Ç¿À */
- $"EA12 19D0 6158 530B A57B 8A2B 8DFF 18AF" /* ê..ÐaXS.¥{Š+ÿ.¯ */
- $"7651 65CF CD26 3F05 987E 0760 9C3C E3A6" /* vQeÏÍ&?.˜~.`œ<㦠*/
- $"86C0 DAB4 C6ED 7F19 8034 85FE DA7E 7963" /* †ÀÚ´Æí..€4…þÚ~yc */
- $"AFF2 9CBE 6AAA B6BB B2D3 6F41 BB45 B1EB" /* ¯òœ¾jª¶»²ÓoA»E±ë */
- $"9CC2 8803 907A 5CE1 F2D9 AF69 FF22 7DE8" /* œÂˆ.z\áòÙ¯iÿ"}è */
- $"D328 C2A1 0F97 2EE2 9575 E0E6 A665 B85A" /* Ó(¡.—.â•uàæ¦e¸Z */
- $"C5D7 6FA0 FE24 BC68 9D74 6CEB C4F9 615C" /* Å×o þ$¼htlëÄùa\ */
- $"4F34 48B3 7A64 2540 B64F EFBE 8D0F E427" /* O4H³zd%@¶Oï¾.ä' */
- $"4CCA 6DB3 83AC C5F6 EE52 7A43 8172 41E4" /* LÊm³ƒ¬ÅöîRzCrAä */
- $"2CE3 DF2F 1496 97DE 6AD1 2FFF 7E52 D993" /* ,ãß/.–—ÞjÑ/ÿ~RÙ“ */
- $"8AF9 AAA3 B192 0991 BFAE 4829 001E 963B" /* Šùª£±’Æ‘¿®H)..–; */
- $"019C 8A5D 78E8 6A56 F78C B81A F4D0 6312" /* .œŠ]xèjV÷Œ¸.ôÐc. */
- $"C0C4 A9BF 7CA5 75D9 9C23 F3EA 4F39 B325" /* ÀÄ©¿|¥uÙœ#óêO9³% */
- $"F6DE 6EF4 7D48 A279 8EA9 5395 0FBC C63F" /* öÞnô}H¢yŽ©S•.¼Æ? */
- $"679F CE93 2206 ECA9 079C 2BB7 D094 6A7B" /* gŸÎ“".ì©.œ+·Ð”j{ */
- $"1077 277F 88A6 21AE 84C3 EDD4 38FC 36B2" /* .w'.ˆ¦!®„ÃíÔ8ü6² */
- $"1F86 8F00 8F56 8825 7713 9061 800A A4CD" /* .†.Vˆ%w.a€Â¤Í */
- $"E3D3 0F3C B0AC 0C87 E368 8544 F251 5C39" /* ãÓ.<°¬.‡ãh…DòQ\9 */
- $"7D90 1BEF 7805 D624 7380 0A19 E093 3058" /* }.ïx.Ö$s€Â.à“0X */
- $"1C90 467F 5C70 4932 3947 4A95 A450 36C8" /* .F.\pI29GJ•¤P6È */
- $"D4D5 CA85 9922 FA12 D0D8 96CA 9A2F 40A2" /* ÔÕÊ…™"ú.ÐØ–Êš/@¢ */
- $"F105 054F 8C56 C164 85B5 C4E6 3EAB D76A" /* ñ..OŒVÁd…µÄæ>«×j */
- $"A227 4F09 072C 4682 9B0F 995C 7551 94E7" /* ¢'OÆ.,F‚›.™\uQ”ç */
- $"419A 0098 0283 19E8 0489 687B 4F66 B74C" /* Aš.˜.ƒ.è.‰h{Of·L */
- $"7F59 C07A A552 B04D 628F E401 E55C A4ED" /* .YÀz¥R°Mbä.å\¤í */
- $"390F C34D 81BB 9F88 0C50 F50F 9FBD A377" /* 9.ÃM»Ÿˆ.Põ.Ÿ½£w */
- $"F538 3F9C E243 FF47 D346 87F2 444B C479" /* õ8?œâCÿGÓF‡òDKÄy */
- $"F6B3 1C76 5125 F487 0FAF 294A DA20 EC56" /* ö³.vQ%ô‡.¯)JÚ ìV */
- $"07AB DE07 14C2 1721 F3E0 D687 1F67 039D" /* .«Þ..Â.!óàÖ‡.g. */
- $"461F 0D82 9CAA B2D4 DFC6 6AA5 D31E 4D01" /* F..‚œª²ÔßÆj¥Ó.M. */
- $"5AC2 B2BD FD97 7D6E 00D1 7ADF 377C 15A7" /* Z²½ý—}n.Ñzß7|.§ */
- $"9681 C7B2 8168 D706 425B 35EF 7298 C053" /* –Dzh×.B[5ïr˜ÀS */
- $"E198 B5E2 B835 712B 1AD8 BA77 CF86 83A3" /* ᘵâ¸5q+.غwφƒ£ */
- $"B0B9 C5E6 F37A A3DE D93B 8EC8 132F A52A" /* °¹Åæóz£ÞÙ;ŽÈ./¥* */
- $"AB20 E166 F719 7130 6482 5BE2 605B D78E" /* « áf÷.q0d‚[â`[׎ */
- $"672D 7AE6 3906 DA75 0E3D 1962 8A60 9294" /* g-zæ9.Úu.=.bŠ`’” */
- $"1FC8 C0F3 216D 815D 4DDE 5DDE D8AB 3F9C" /* .ÈÀó!m]MÞ]ÞØ«?œ */
- $"7F9F 24B3 7BBF CCB9 2F80 19B6 70AE 1B3D" /* .Ÿ$³{¿Ì¹/€.¶p®.= */
- $"C71A 1F7C 81D2 639F 0D03 24EA D4B1 D351" /* Ç..|ÒcŸ..$êÔ±ÓQ */
- $"DD10 FBD5 EA3F 4957 A7ED 04C6 384D C10F" /* Ý.ûÕê?IW§í.Æ8MÁ. */
- $"8A55 0C03 694F 0D18 70D8 0AC3 33C0 17D1" /* ŠU..iO..pØÂÃ3À.Ñ */
- $"73BB E85F 5204 090F FDFE 8AC5 9AD6 22D5" /* s»è_R.Æ.ýþŠÅšÖ"Õ */
- $"CA31 A6DE EF44 D910 B34A 0E59 7866 536F" /* Ê1¦ÞïDÙ.³J.YxfSo */
- $"9B0B A341 3AB8 C06C C64F 3F86 8160 DFB9" /* ›.£A:¸ÀlÆO?†`ß¹ */
- $"A709 59D8 88C3 3316 9FFA F83F 5120 E40E" /* §ÆY؈Ã3.Ÿúø?Q ä. */
- $"4DEA C88F C418 37F6 4C0B 7606 9632 EEC5" /* MêÈÄ.7öL.v.–2îÅ */
- $"6380 FB25 A69F AAE2 0888 B722 008F 35CB" /* c€û%¦Ÿªâ.ˆ·".5Ë */
- $"F6A7 90BF D0DB 6367 A14B 5A86 EE98 FD18" /* ö§¿ÐÛcg¡KZ†î˜ý. */
- $"A629 1BAB 3BE2 920D E99D BEC2 88B4 F909" /* ¦).«;â’.é¾Âˆ´ùÆ */
- $"66B1 535D 3940 AF78 8200 0C46 142A EA2A" /* f±S]9@¯x‚..F.*ê* */
- $"A991 95E8 FD2B D30B 0E4A 76E2 A97B FAA7" /* ©‘•èý+Ó..Jvâ©{ú§ */
- $"97E2 9B30 54FA 5E97 962A 7E83 5711 A707" /* —â›0Tú^—–*~ƒW.§. */
- $"2A21 3729 2046 9C41 8282 A161 E5F6 AB24" /* *!7) FœA‚‚¡aåö«$ */
- $"3324 74CF 1AF6 C935 D884 0008 DC18 663C" /* 3$tÏ.öÉ5Ø„..Ü.f< */
- $"3A00 25E4 92D7 8F23 4C07 3C63 DB6E 4924" /* :.%ä’×#L.<cÛnI$ */
- $"7362 34C9 2F1D 105B 97E2 03BF 648F C21C" /* sb4É/..[—â.¿dÂ. */
- $"C6AC 3657 2C72 ADAA 2889 0623 6A5D ACEC" /* Ƭ6W,r­ª(‰.#j]¬ì */
- $"3210 738F 51F5 CC65 9EA9 7AD3 95CB B265" /* 2.sQõÌež©zӕ˲e */
- $"D54E 6E1D E2A7 2673 E6C2 C247 2FFD C10E" /* ÕNn.â§&sæÂÂG/ýÁ. */
- $"5FC5 C1E1 2511 5C8F 6063 92AB E4B9 8212" /* _ÅÁá%.\`c’«ä¹‚. */
- $"3643 6D53 2492 3E58 3E71 15E3 A3B7 AB2A" /* 6CmS$’>X>q.㣷«* */
- $"A998 FE5A 74DB 537A CE3D CD46 49B6 DB6D" /* ©˜þZtÛSzÎ=ÍFI¶Ûm */
- $"B6DB 6DB2 8EE9 1D6F 6480 8613 D8D2 7D8F" /* ¶Ûm²Žé.od€†.ØÒ} */
- $"5615 3EAB B25B 722D ECB8 ED12 70F2 BA06" /* V.>«²[r-ì¸í.pòº. */
- $"E5A2 45C1 547C F861 A7D5 8E1C 08BC 346B" /* å¢EÁT|øa§ÕŽ..¼4k */
- $"2730 C670 2FD8 F159 6ABE 2092 ED98 AC34" /* '0Æp/ØñYj¾ ’혬4 */
- $"B4CA 8565 90CF 0034 6E68 F777 9672 F29D" /* ´Ê…eÏ.4nh÷w–rò */
- $"4621 6E73 9C90 5C3D A8DB F5B0 CACF A63E" /* F!nsœ\=¨Ûõ°ÊϦ> */
- $"861E 8B9E F490 8E15 69BC A01D EF59 E898" /* †.‹žôŽ.i¼ .ïYè˜ */
- $"7040 B817 5AA9 BFB1 09A0 FE74 D2F7 BEA8" /* p@¸.Z©¿±Æ þtÒ÷¾¨ */
- $"A4F3 FEAC 38A4 409E B504 9CC9 EAA3 533B" /* ¤óþ¬8¤@žµ.œÉê£S; */
- $"153D F710 FC9E 2055 A395 C374 2AF9 E7C5" /* .=÷.üž U£•Ãt*ùçÅ */
- $"E1E8 7F74 3CDB D568 B606 A9D5 B7AE E207" /* áè.t<ÛÕh¶.©Õ·®â. */
- $"947E 2E65 1C27 336D 927A 4F86 5422 0E04" /* ”~.e.'3m’zO†T".. */
- $"42C7 668A 9403 EAB7 21A3 C9F1 18BC 5380" /* BÇfŠ”.ê·!£Éñ.¼S€ */
- $"BED7 07B5 F9B1 B798 8727 D54A 7A6E E493" /* ¾×.µù±·˜‡'ÕJznä“ */
- $"5271 F27D 7C35 DCEE D0BC CB31 C1FB 879F" /* Rqò}|5ÜîмË1Áû‡Ÿ */
- $"E074 9EB9 D7BE C9ED D2C8 BD00 C7FC D05B" /* àtž¹×¾ÉíÒȽ.ÇüÐ[ */
- $"2B2C 9647 A924 9F22 A06D 62B4 A946 77B7" /* +,–G©$Ÿ" mb´©Fw· */
- $"AD6D 60EE C841 997D A7E8 7AD2 AFA8 EEC4" /* ­m`îÈA™}§èzÒ¯¨îÄ */
- $"D61F FC06 FD7A E761 AA33 0F74 A08F 8E5B" /* Ö.ü.ýzçaª3.t Ž[ */
- $"B7C0 7C9A 1201 F0F5 6403 E4D0 60D8 92D9" /* ·À|š..ðõd.äÐ`Ø’Ù */
- $"84ED 064F 1B29 D7A7 1D77 F4B3 61D6 2651" /* „í.O.)ק.wô³aÖ&Q */
- $"329E 2CA5 53B4 956D 1061 3A3A A73B FC8E" /* 2ž,¥S´•m.a::§;üŽ */
- $"DD3C 60C9 F855 32FB 3C04 6287 50F7 6BB3" /* Ý<`ÉøU2û<.b‡P÷k³ */
- $"B84A 05A6 3145 A832 3BBC CA56 115B 9D7F" /* ¸J.¦1E¨2;¼ÊV.[. */
- $"8ADB 5660 429D 1FF6 4E6D 4899 EFDA 592F" /* ŠÛV`B.öNmH™ïÚY/ */
- $"19DC 9790 802A 1C17 2250 ADEC 0312 2C23" /* .Ü—€*.."P­ì..,# */
- $"223B 1EC8 482C 6E26 DD67 528F 7CDC 1841" /* ";.ÈH,n&ÝgR|Ü.A */
- $"DBCB CF9E 6D26 B564 4FD4 0AB5 DA0B ADE2" /* ÛËÏžm&µdOÔµÚ.­â */
- $"C129 D895 00FF 105B 0D0B F4DB 286A B347" /* Á)Ø•.ÿ.[..ôÛ(j³G */
- $"A261 30A9 0A9B 7A0D 585B 3991 3217 6FF7" /* ¢a0©Â›z.X[9‘2.o÷ */
- $"A368 D6A8 E862 161A 3584 613E 04D9 DBCB" /* £hÖ¨èb..5„a>.ÙÛË */
- $"4D96 66A3 B736 F802 D67A 309F 04E6 AFD8" /* M–f£·6ø.Öz0Ÿ.æ¯Ø */
- $"888E A8A5 4461 F1F0 1B6B 2DC4 0DFE C676" /* ˆŽ¨¥Dañð.k-Ä.þÆv */
- $"8D4E 3750 C3E6 C233 EFC5 368B 6113 5B53" /* N7PÃæÂ3ïÅ6‹a.[S */
- $"08E0 C259 1B88 AA0C 74B0 862E 1024 BB3F" /* .àÂY.ˆª.t°†..$»? */
- $"2816 B320 715C 5DFA 9FF0 CBC3 6A85 777A" /* (.³ q\]úŸðËÃj…wz */
- $"23CB F89B D813 6706 313E 2CF5 A163 0848" /* #Ëø›Ø.g.1>,õ¡c.H */
- $"94C9 3288 B556 53DD 2A45 2302 F28E 7ED1" /* ”É2ˆµVSÝ*E#.òŽ~Ñ */
- $"B5A0 67C8 53BB 4CE4 45D9 317F 92AB B13B" /* µ gÈS»LäEÙ1.’«±; */
- $"7246 F6DE 5348 49C9 42A1 CA62 64B0 209E" /* rFöÞSHIÉB¡Êbd° ž */
- $"43F2 DF7C 9BBC 097F C94A EA52 8D01 ADEF" /* Còß|›¼Æ.ÉJêR.­ï */
- $"5241 7C9B 2876 75F4 D748 AF9D 6FBB 3306" /* RA|›(vuô×H¯o»3. */
- $"0AD1 3953 6C99 5BB7 F1F5 1C1F BCE7 CA83" /* ÂÑ9Sl™[·ñõ..¼çʃ */
- $"08C1 6811 FBC5 AE18 343C C6F5 E515 F9CF" /* .Áh.ûÅ®.4<Æõå.ùÏ */
- $"FE48 C6E9 956E 6712 DDCA D62C 7F37 6DFE" /* þHÆé•ng.ÝÊÖ,.7mþ */
- $"2465 A8EE 1BAF E106 CA62 101F 0144 31DC" /* $e¨î.¯á.Êb...D1Ü */
- $"029E ED0F 9E47 F22E 0C17 0D31 E60B 1662" /* .ží.žGò....1æ..b */
- $"C1F5 5C90 7D5A 6D03 EAB6 C0C8 1653 E821" /* Áõ\}Zm.ê¶ÀÈ.Sè! */
- $"5860 ED0B C711 39E5 E5C8 268D 2246 E3FB" /* X`í.Ç.9ååÈ&"Fãû */
- $"68A4 3B12 A487 350D FE94 3722 65AC 949B" /* h¤;.¤‡5.þ”7"e¬”› */
- $"2526 7CD5 0E28 E093 CFE8 314C BE18 5B60" /* %&|Õ.(à“Ïè1L¾.[` */
- $"827E 154B 9609 2536 F890 A361 BA29 8211" /* ‚~.K–Æ%6ø£aº)‚. */
- $"AF42 BEC6 1BCB CE6D 2910 8083 C890 D7FF" /* ¯B¾Æ.ËÎm).€ƒÈ×ÿ */
- $"6F04 CEF4 F47C 0D92 00BD D90F 4095 0A48" /* o.Îôô|.’.½Ù.@•ÂH */
- $"4DC6 210C 351D 34A5 5FDA E576 1E1B 1684" /* MÆ!.5.4¥_Úåv...„ */
- $"F2A0 B30A 589C 1DBC 4831 E906 0D67 0CDD" /* ò ³ÂXœ.¼H1é..g.Ý */
- $"876B 994F 6D66 47DD AF40 7158 4385 738E" /* ‡k™OmfGݯ@qXC…sŽ */
- $"82F8 E637 9B5C 7389 0AA5 2A04 D105 5E88" /* ‚øæ7›\s‰Â¥*.Ñ.^ˆ */
- $"C2A2 2943 E125 6C2F 0AD1 1E5C AF1F CFF6" /* ¢)Cá%l/ÂÑ.\¯.Ïö */
- $"B39B C799 0F39 6151 6625 BB66 C3C3 418B" /* ³›Ç™.9aQf%»fÃÃA‹ */
- $"90A4 F6F7 BD30 7A04 88E6 0F8A 3F0B FF2C" /* ¤ö÷½0z.ˆæ.Š?.ÿ, */
- $"D18B 1D88 1442 EB54 A6FC D226 251A 015D" /* Ñ‹.ˆ.BëT¦üÒ&%..] */
- $"4DA8 32CA 371B 86EB 4E89 1415 9A41 6AD2" /* M¨2Ê7.†ëN‰..šAjÒ */
- $"1F0F 7656 41E5 B874 72E7 5F88 ABDA 28D7" /* ..vVAå¸trç_ˆ«Ú(× */
- $"37D5 EE40 567F F751 2591 01A3 03B9 EFCD" /* 7Õî@V.÷Q%‘.£.¹ïÍ */
- $"E0A8 8CC8 8C8E 0945 3036 453A 1787 59C4" /* ਌ȌŽÆE06E:.‡YÄ */
- $"B99C 02D2 D5F6 1B5E E34C 551E 8C43 9A20" /* ¹œ.ÒÕö.^ãLU.ŒCš */
- $"981D 0B44 C6D1 E6AA 2B92 5F33 8016 C4F1" /* ˜..DÆÑæª+’_3€.Äñ */
- $"7AA6 E605 4676 A533 1D38 6ADA 9BC6 2C13" /* z¦æ.Fv¥3.8jÚ›Æ,. */
- $"385A 3DCE 7E2E B9A1 81BB 27C6 AFF8 FF5D" /* 8Z=Î~.¹¡»'Ưøÿ] */
- $"A511 4C25 DC70 082C B597 3EC4 004C D4B8" /* ¥.L%Üp.,µ—>Ä.LÔ¸ */
- $"BE6A B79D EF70 2610 B57B FEFE 6ACC 9EEE" /* ¾j·ïp&.µ{þþjÌžî */
- $"B94A 73A8 4B30 C207 7391 789E C0FE 6992" /* ¹Js¨K0Â.s‘xžÀþi’ */
- $"AB13 E2AA FF53 4B22 A338 0EA3 B476 D732" /* «.âªÿSK"£8.£´v×2 */
- $"EDA3 2009 3422 B4AA 64DE 26C3 5894 D6DD" /* í£ Æ4"´ªdÞ&ÃX”ÖÝ */
- $"F7A9 5A3B 6F31 5D2C EC22 1FAC 928B 647F" /* ÷©Z;o1],ì".¬’‹d. */
- $"1600 A961 11C3 FD11 E594 81F9 E0AC 20D4" /* ..©a.Ãý.å”ùà¬ Ô */
- $"0DCA 9CE0 FF14 3BE3 3010 00E1 9DFE F0C8" /* .Êœàÿ.;ã0..áþðÈ */
- $"70E7 D3A5 A7F9 884E 6941 CBCB FEBE 0C27" /* pçÓ¥§ùˆNiAËËþ¾.' */
- $"B3F5 BAA4 3068 BFC1 DB20 1E5F 9E83 BF7D" /* ³õº¤0h¿ÁÛ ._žƒ¿} */
- $"8EA3 8FB0 F355 FF02 DED2 5CC8 2B4D 4DA5" /* Ž£°óUÿ.ÞÒ\È+MM¥ */
- $"8122 C96A CDAB B130 2D35 B73E 2EE9 0AA9" /* "ÉjÍ«±0-5·>.é© */
- $"7DB8 B81D 7B0A 776B DFF3 2B02 1F6A EF5B" /* }¸¸.{Âwkßó+..jï[ */
- $"E6A6 177F D8C0 1C3B A88C 2154 18F3 BFB3" /* æ¦..ØÀ.;¨Œ!T.ó¿³ */
- $"F7EF 1249 860B F87F 60D6 AE06 B5B2 7824" /* ÷ï.I†.ø.`Ö®.µ²x$ */
- $"E601 91D7 1436 80CF 054C 9691 1321 B299" /* æ.‘×.6€Ï.L–‘.!²™ */
- $"11F3 2BA3 51F6 447E 1BC0 28CB 666B 9BA0" /* .ó+£QöD~.À(Ëfk›  */
- $"425A E39B 066C 1B7C 340B 950A BDCC E05D" /* BZã›.l.|4.•Â½Ìà] */
- $"C8DC 568C BDC6 54E9 0AA2 2D89 6E22 37E4" /* ÈÜVŒ½ÆTé¢-‰n"7ä */
- $"3508 39CC EE8F 8EE6 F926 626B E33F 4A06" /* 5.9ÌîŽæù&bkã?J. */
- $"4CD1 AE16 9063 3119 5554 58CA BB53 4A73" /* LѮ.c1.UTXʻSJs */
- $"AA2B 2A71 B86B 3E95 BED6 D9D2 9D59 3E60" /* ª+*q¸k>•¾ÖÙÒY>` */
- $"C5D1 FA4C E6A7 880F 30D8 A679 6467 697E" /* ÅÑúL槈.0ئydgi~ */
- $"F327 EAA4 E0D1 01F9 9B74 AAA1 6CDD 7DA7" /* ó'ê¤àÑ.ù›tª¡lÝ}§ */
- $"D2AB C9CB 63D6 D3DF C778 C6ED 71A5 0571" /* Ò«ÉËcÖÓßÇxÆíq¥.q */
- $"C7E1 4EC7 E16C 43F0 75B1 3C9E 91EA AAAC" /* ÇáNÇálCðu±<ž‘ꪬ */
- $"9A2E A47E 8DF0 873E 2275 3F71 F986 DF3D" /* š.¤~ð‡>"u?qù†ß= */
- $"DBE5 1F4C 0D83 C3F5 F2D4 5A7C 0BFB E4FC" /* Ûå.L.ƒÃõòÔZ|.ûäü */
- $"C83E D8A4 FAF4 F589 09F2 4909 40AA 2AA8" /* È>ؤúôõ‰ÆòIÆ@ª*¨ */
- $"C190 BE4D D484 1408 6EAD 722F 6BA6 7502" /* Á¾MÔ„..n­r/k¦u. */
- $"A53F 1B9A BE86 841A FC60 53F3 8AE9 2E4C" /* ¥?.š¾†„.ü`SóŠé.L */
- $"4B8E 1D09 F47C 3BAA CFB7 80DE 6A41 F007" /* KŽ.Æô|;ªÏ·€ÞjAð. */
- $"80A3 413A C568 5C02 6166 E8AF 9B6C EF86" /* €£A:Åh\.af诛lï† */
- $"F178 273B A803 89E9 520A ACFC 0E98 6198" /* ñx';¨.‰éR¬ü.˜a˜ */
- $"6ECE D094 76D1 8AF8 1035 D0C8 B9E5 ECC9" /* nÎДvÑŠø.5ÐȹåìÉ */
- $"08E6 748A F28B B0E0 F9AB 71B4 7971 9626" /* .ætŠò‹°àù«q´yq–& */
- $"5397 5D5A 31CB 5F9E 7C98 8300 72B1 2C67" /* S—]Z1Ë_ž|˜ƒ.r±,g */
- $"A38D 0C02 C603 C0C2 2000 E528 0CAA 9472" /* £..Æ.À .å(.ª”r */
- $"3115 8C05 0EE6 3F33 3F6D B6DB 64C7 AAB2" /* 1.Œ..æ?3?m¶ÛdǪ² */
- $"94EA DD85 D3DF F14E FF3F D3A2 778B 3749" /* ”êÝ…ÓßñNÿ?Ó¢w‹7I */
- $"B31B 6DB6 C5B6 5311 C782 3FCF 2880 6695" /* ³.m¶Å¶S.Ç‚?Ï(€f• */
- $"085A 35C2 3938 420E 8705 50BD 51C3 BD21" /* .Z5Â98B.‡.P½Qý! */
- $"41B9 C3ED 3A76 367F 40F5 DA53 3618 DF7A" /* A¹Ãí:v6.@õÚS6.ßz */
- $"EE11 B2D6 D9AD 4351 7D8F BC5A 7217 9352" /* î.²ÖÙ­CQ}¼Zr.“R */
- $"D43F 54B9 F618 3E0E 5FF8 1599 CD00 5489" /* Ô?T¹ö.>._ø.™Í.T‰ */
- $"459D 1B65 0538 7A92 D8EC 6AD5 E756 776E" /* E.e.8z’ØìjÕçVwn */
- $"5B66 A07C 36D6 A4B0 2E00 21E0 ABFC 2AB8" /* [f |6Ö¤°..!à«ü*¸ */
- $"F387 5784 0DB9 1978 67FE DEFF 0CCC CCCC" /* ó‡W„.¹.xgþÞÿ.ÌÌÌ */
- $"CCCC CCCC CCCC CCD3 5F84 850A F245 C370" /* ÌÌÌÌÌÌÌÓ_„…ÂòEÃp */
- $"786E 76C5 56A5 8C9B FC7F 6869 3085 EB26" /* xnvÅV¥Œ›ü.hi0…ë& */
- $"6162 A234 8BF4 868D 0BA5 77FA 56D2 31FD" /* ab¢4‹ô†.¥wúVÒ1ý */
- $"7436 0147 944C 2AAE C8C1 DE46 2A3A 2449" /* t6.G”L*®ÈÁÞF*:$I */
- $"EAD0 8E9E FF0B 129F 7F9C 1436 A6BC 10E6" /* êÐŽžÿ..Ÿ.œ.6¦¼.æ */
- $"3116 7A98 5FF6 97E9 FC84 7136 FEA5 C122" /* 1.z˜_ö—éü„q6þ¥Á" */
- $"E58F 44D6 D7A4 0AD3 E9B4 7C91 B833 1F91" /* åDÖפÂÓé´|‘¸3.‘ */
- $"5F0F D8F7 8A80 6560 B332 081A C68D 0FF9" /* _.Ø÷Š€e`³2..Æ.ù */
- $"899F 2CC7 E1D6 FC7E 1DEB C3ED EA04 F55D" /* ‰Ÿ,ÇáÖü~.ëÃíê.õ] */
- $"017D B775 48A1 A844 EAB2 8E3A 5FF2 20AF" /* .}·uH¡¨D겎:_ò ¯ */
- $"6231 D1B0 D4D9 D308 999B 09F2 95B1 7071" /* b1Ñ°ÔÙÓ.™›Æò•±pq */
- $"F57C 1F1E 7960 4639 6A62 5BC6 9E5A D45D" /* õ|..y`F9jb[ÆžZÔ] */
- $"F339 9597 BF1B 62EB D128 B3D8 9BD3 52BF" /* ó9•—¿.bëÑ(³Ø›ÓR¿ */
- $"0703 43F9 E1C7 940E EA41 F4B1 75E4 891F" /* ..CùáÇ”.êAô±uä‰. */
- $"09A4 D439 7DFF 6AB7 EB4F 1253 A9C0 8BBE" /* ƤÔ9}ÿj·ëO.S©À‹¾ */
- $"40A0 3CE6 965D F886 A9EF 7E69 712D 41C2" /* @ <æ–]ø†©ï~iq-A */
- $"0062 6917 5D06 6548 9FD6 1470 4A0C 8545" /* .bi.].eHŸÖ.pJ.…E */
- $"8417 6C73 0C2D DF44 0E4A D5F9 7443 D629" /* „.ls.-ßD.JÕùtCÖ) */
- $"E62D DE53 CCFA EAEA E08A F0E1 9D37 9616" /* æ-ÞSÌúêêàŠðá7–. */
- $"C0DA 1FD4 6A42 6CE6 1D10 AB6A 911A 19D2" /* ÀÚ.ÔjBlæ..«j‘..Ò */
- $"47A0 4AC5 6A3C 12FF 0FE8 3AFB 7DFD 3D27" /* G JÅj<.ÿ.è:û}ý=' */
- $"42C6 E2BA 6DDE D1ED 21CE 1EA0 F444 055B" /* BÆâºmÞÑí!Î. ôD.[ */
- $"122A 41EE D8C1 144C B39C 0EEA 014E 7448" /* .*AîØÁ.L³œ.ê.NtH */
- $"0B72 7C2C 92B6 0CAC 3CB5 ADA7 8BF8 0C56" /* .r|,’¶.¬<µ­§‹ø.V */
- $"1DD5 B763 907F 6B60 8A85 ED4A F87D FBDC" /* .Õ·c.k`Š…íJø}ûÜ */
- $"391D 822B CBF5 7266 0E6B B2D4 32DE 606C" /* 9.‚+Ëõrf.k²Ô2Þ`l */
- $"014E 64BF F969 E3A5 C8E4 09EC B205 6391" /* .Nd¿ùiã¥ÈäÆì².c‘ */
- $"3081 96F5 9A80 0599 50D2 38FF 635B 9C35" /* 0–õš€.™PÒ8ÿc[œ5 */
- $"97CF A325 D94F B8E1 A794 EABC DA8A 7CC3" /* —Ï£%ÙO¸á§”ê¼ÚŠ|à */
- $"8713 2EBB 1EA6 69B0 9A72 A93D 874A 1F30" /* ‡..».¦i°šr©=‡J.0 */
- $"4C7B B341 B8CF F61E 7CEE 60CC E9B0 6D85" /* L{³A¸Ïö.|î`Ìé°m… */
- $"4F96 977D F85D F85A 08AF 46EF F259 FD70" /* O–—}ø]øZ.¯FïòYýp */
- $"E364 C54D 1F3D C951 B1DD 2CB4 8B94 9350" /* ãdÅM.=ÉQ±Ý,´‹”“P */
- $"8FFC CD4E D39E 2FF5 DC65 9DB7 2133 6E97" /* üÍNÓž/õÜe·!3n— */
- $"9705 2AA6 2625 534E B2A2 D775 FCFA 60E0" /* —.*¦&%SN²¢×uüú`à */
- $"4929 3681 2E72 5087 F3CD FB3A 6386 36A2" /* I)6.rP‡óÍû:c†6¢ */
- $"5E62 8705 57E4 8441 1986 1487 E88F C834" /* ^b‡.Wä„A.†.‡èÈ4 */
- $"C59D D57C CCA2 D56F 3889 44AC 0E4D 0E88" /* ÅÕ|Ì¢Õo8‰D¬.M.ˆ */
- $"2592 A50A F98D DF1D 17F2 78BD D4AB FDB4" /* %’¥Âùß..òx½Ô«ý´ */
- $"4249 FBDE 3E56 BE58 B587 88B4 8D75 299F" /* BIûÞ>V¾Xµ‡ˆ´u)Ÿ */
- $"4C92 6D9A 6B17 6153 9A65 4770 E0EC BBEF" /* L’mšk.aSšeGpàì»ï */
- $"2F91 8C35 8FFA 04AF 880C D9B6 204A D65E" /* /‘Œ5ú.¯ˆ.Ù¶ JÖ^ */
- $"68DD DBE7 63BC E1C5 CCDD E994 3796 10EF" /* hÝÛçc¼áÅÌÝé”7–.ï */
- $"354D C0E7 7A72 E57E EFAC 7C75 E4CE F47F" /* 5MÀçzrå~ï¬|uäÎô. */
- $"2E82 A8D0 6401 3CC4 1ACC 4513 1211 DCC9" /* .‚¨Ðd.<Ä.ÌE...ÜÉ */
- $"BD7A 47CA F093 83C7 38EB 866D 1ED5 AC6C" /* ½zGÊð“ƒÇ8ë†m.Õ¬l */
- $"FF01 C348 CFA1 2532 DAD5 2BDD 8CCC 71C1" /* ÿ.ÃHÏ¡%2ÚÕ+ÝŒÌqÁ */
- $"1208 75AA 308B 4796 A89E 0EAF AB67 422A" /* ..uª0‹G–¨ž.¯«gB* */
- $"AA43 8162 68BC 9878 8578 419C AB2E 9518" /* ªCbh¼˜x…xAœ«.•. */
- $"A9E0 4298 DB46 36D7 ADD0 DE21 DC41 AEA7" /* ©àB˜ÛF6×­ÐÞ!ÜA®§ */
- $"A05D 795D AB14 E247 6750 3EA8 0A31 5A06" /*  ]y]«.âGgP>¨Â1Z. */
- $"FAEC AD07 ECF7 C636 A068 22AA E179 7613" /* úì­.ì÷Æ6 h"ªáyv. */
- $"30F9 831C 0AFA 38C0 E20B 96A9 464E B57A" /* 0ùƒ.Âú8Àâ.–©FNµz */
- $"5AF3 D612 DC70 2A8D 1D09 C7C9 967F 7F7B" /* ZóÖ.Üp*.ÆÇÉ–..{ */
- $"F47F 4017 A722 9853 37C2 DE55 34CF 104E" /* ô.@.§"˜S7ÂÞU4Ï.N */
- $"9DD3 35DF DEE2 589C FAF1 07DE 1803 86B1" /* Ó5ßÞâXœúñ.Þ..†± */
- $"2DE6 6B46 FC45 F24E 8718 3B6E D557 8008" /* -ækFüEòN‡.;nÕW€. */
- $"FF3B 8EC2 28BD 6146 3EF6 A0FB 0BCA 37C1" /* ÿ;ŽÂ(½aF>ö û.Ê7Á */
- $"749B 49F2 F419 9EC5 DC0A A6DE 0CFC 1BD2" /* t›Iòô.žÅܦÞ.ü.Ò */
- $"AAF5 4920 1AB3 842A 1813 606E 97CD 0EC2" /* ªõI .³„*..`n—Í. */
- $"50D4 84CD F427 569F 776D 940A A6F7 68D7" /* PÔ„Íô'VŸwm”¦÷h× */
- $"2A18 4C6D 2056 D254 1226 7F3C 1ED0 7AB8" /* *.Lm VÒT.&.<.Ðz¸ */
- $"BEFE 2050 50E6 C5FB 173C 1857 FF7F 86D9" /* ¾þ PPæÅû.<.Wÿ.†Ù */
- $"6CE3 E235 1AFA CBB4 D2BE 4E64 9713 B880" /* lãâ5.úË´Ò¾Nd—.¸€ */
- $"0C41 2E14 401B D14F 5BA4 AD20 7060 C05E" /* .A..@.ÑO[¤­ p`À^ */
- $"2011 000E C557 2951 009C A584 6178 50E8" /* ...ÅW)Q.œ¥„axPè */
- $"6E0D 922F BFF7 EC41 A907 0D2B EF09 3CE0" /* n.’/¿÷ìA©..+ïÆ<à */
- $"6344 B3D6 742A 0448 042D 44C3 390B 089B" /* cD³Öt*.H.-DÃ9..› */
- $"B0FF 2877 1C62 BE1E AC48 09B0 4667 19BC" /* °ÿ(w.b¾.¬HÆ°Fg.¼ */
- $"319D 1FEA ABB5 1EE9 02D8 C845 A20C 2E3F" /* 1.ꫵ.é.ØÈE¢..? */
- $"7010 FA38 E2A0 1F01 2933 0557 19BD 9DCD" /* p.ú8â ..)3.W.½Í */
- $"5486 F044 5838 C953 CC32 2DF8 6A04 30ED" /* T†ðDX8ÉSÌ2-øj.0í */
- $"2C42 0A7D 1B38 7F94 4936 5908 39F1 424F" /* ,BÂ}.8.”I6Y.9ñBO */
- $"2BFF 7F46 F53E 11D3 DA1E 41B4 67AB 296E" /* +ÿ.Fõ>.ÓÚ.A´g«)n */
- $"0B59 6213 9E16 1568 8787 ED75 8822 A102" /* .Yb.ž..h‡‡íuˆ"¡. */
- $"DAAC D7D6 FA63 ED91 52D2 E98C 6EEB ABBB" /* Ú¬×Öúcí‘RÒéŒnë«» */
- $"5465 7C7C 0CEB 3016 0CC6 5793 D7FF 7FFB" /* Te||.ë0..ÆW“×ÿ.û */
- $"34E7 7BDE 794E 6D8C 392D 051A 478B 4AD7" /* 4ç{ÞyNmŒ9-..G‹J× */
- $"028C 3119 EDCA 833C 2F1B A23A 5C69 908F" /* .Œ1.íʃ</.¢:\i */
- $"6F17 C143 83FF 31A8 709D 7BFA B0E4 A884" /* o.ÁCƒÿ1¨p{ú°ä¨„ */
- $"E3DC 88CC DF54 C132 6671 A0D0 B4C3 7721" /* ã܈ÌßTÁ2fq Ð´Ãw! */
- $"B5F0 84FF 0FDA 1588 5865 1B6B 94E3 9B46" /* µð„ÿ.Ú.ˆXe.k”ã›F */
- $"5CA1 7767 09F4 3448 2242 114C 2705 2C38" /* \¡wgÆô4H"B.L'.,8 */
- $"4565 F286 ABC2 AFF5 809D 0C5B BB5E 009C" /* Eeò†«Â¯õ€.[»^.œ */
- $"FCBA BC4C 84FF 45EF F42B 3F8E DEE0 A531" /* üº¼L„ÿEïô+?ŽÞà¥1 */
- $"DBBB 2113 7C30 8BB7 76FF 7E55 E6BC 012B" /* Û»!.|0‹·vÿ~Uæ¼.+ */
- $"EBDE EF62 0981 DCE1 AC6E 5AD7 D8AD 0560" /* ëÞïbÆÜá¬nZ×Ø­.` */
- $"5B36 3A62 5B57 3E03 75AC 25FB B396 1086" /* [6:b[W>.u¬%û³–.† */
- $"5EF0 4C11 ACE0 90D2 6568 EB55 75AB FF24" /* ^ðL.¬àÒehëUu«ÿ$ */
- $"54B8 0E77 3110 5C67 3138 8369 5BEA 3458" /* T¸.w1.\g18ƒi[ê4X */
- $"7FFE 6000 9940 0044 18C6 1A34 14B6 9CD2" /* .þ`.™@.D.Æ.4.¶œÒ */
- $"C039 2A00 00CC 8F27 9EFE FF80 1CAA 8000" /* À9*..Ì'žþÿ€.ª€. */
- $"0000 0000 D9B1 C1D0 BFE1 D01D 2DD4 E3DF" /* ....Ù±ÁпáÐ.-Ôãß */
- $"949B 6DB6 DB6D B83D 6B98 82BC 446D 0CB3" /* ”›m¶Ûm¸=k˜‚¼Dm.³ */
- $"55A5 C140 D9E5 5E98 37AF 0E38 4474 B8DC" /* U¥Á@Ùå^˜7¯.8Dt¸Ü */
- $"FCFA B14E BD14 730B DAA0 4B18 1B4D 81E7" /* üú±N½.s.Ú K..Mç */
- $"B8A8 26E7 EFB0 8272 4619 2A00 0000 0000" /* ¸¨&çï°‚rF.*..... */
- $"0000 0000 0000 060D CD91 05BE 3A07 80DE" /* ........Í‘.¾:.€Þ */
- $"29D6 2680 7867 5359 9411 F430 48D9 A22D" /* )Ö&€xgSY”.ô0HÙ¢- */
- $"DF74 0855 C0C4 C5AA D3F4 FC40 5815 C5FC" /* ßt.UÀÄŪÓôü@X.Åü */
- $"B741 3001 FF7F FDC6 00B8 F1BA FEC9 B662" /* ·A0.ÿ.ýÆ.¸ñºþɶb */
- $"4973 2EE9 5029 E237 296D D4A4 04DE 4DB9" /* Is.éP)â7)mÔ¤.ÞM¹ */
- $"5305 FD42 9A82 6842 EF09 9DA2 201D C6EF" /* S.ýBš‚hBïÆ¢ .Æï */
- $"4078 4FC3 038C B201 A1C0 0791 7B09 CF18" /* @xOÃ.Œ².¡À.‘{ÆÏ. */
- $"D61B DABD 0409 372B F69D 3CF8 E2E1 31A1" /* Ö.Ú½.Æ7+ö<øâá1¡ */
- $"023B B0FD 60B3 3933 16F2 C716 9259 82F8" /* .;°ý`³93.òÇ.’Y‚ø */
- $"77BB 3A47 46D2 D998 7AA1 01E1 DF78 8000" /* w»:GFÒÙ˜z¡.áßx€. */
- $"0000 0001 D8FD 4FB2 C620 0000 005A CD78" /* ....ØýO²Æ ...ZÍx */
- $"B755 53CD E910 3B50 96A8 4000 0000 0003" /* ·USÍé.;P–¨@..... */
- $"FD6F 5DD1 31D8 A087 6BC5 09F3 E81E B49F" /* ýo]Ñ1Ø ‡kÅÆóè.´Ÿ */
- $"5A88 0DB9 2492 4924 9234 EE49 0E46 EE5B" /* Zˆ.¹$’I$’4îI.Fî[ */
- $"8D2A E866 7AD0 1F3C 936D 50EF 6EF5 FDE7" /* *èfzÐ.<“mPïnõýç */
- $"BFFE 6EFF 82AD 0EDF 556D B01D C573 CA68" /* ¿þnÿ‚­.ßUm°.ÅsÊh */
- $"985A F307 82C5 D933 4C26 B9EE EEF7 D4C6" /* ˜Zó.‚ÅÙ3L&¹îî÷ÔÆ */
- $"BFB5 4130 F610 4AFE 602E 3723 0C95 0000" /* ¿µA0ö.Jþ`.7#.•.. */
- $"0000 0000 0000 0000 0002 7F7E DE44 DDEB" /* ...........~ÞDÝë */
- $"B8B1 0AB8 BA80 7F79 D59C 851A 0244 B8D1" /* ¸±Â¸º€.yÕœ…..D¸Ñ */
- $"6B92 AB1A 4997 5556 C0C7 5935 05AD B380" /* k’«.I—UVÀÇY5.­³€ */
- $"318D A387 1E5F 1523 0170 B5DB D9FA 0E80" /* 1£‡._.#.pµÛÙú.€ */
- $"7342 6634 1E36 FB10 615A 1862 FF53 1545" /* sBf4.6û.aZ.bÿS.E */
- $"C795 B42C 8282 534C 3AFD D370 7621 820E" /* Ç•´,‚‚SL:ýÓpv!‚. */
- $"9EDA AF3A 476B 3537 E327 52DE 4A99 73D1" /* žÚ¯:Gk57ã'RÞJ™sÑ */
- $"0718 7C16 82D5 99A5 32DD 0E83 9C4F 60F8" /* ..|.‚Õ™¥2Ý.ƒœO`ø */
- $"0743 325D 2056 84FF 06BC C6BB 338C 64CF" /* .C2] V„ÿ.¼Æ»3ŒdÏ */
- $"B7B9 C4C7 9800 E4DA EE0A 6636 DEE8 B8F8" /* ·¹Äǘ.äÚîÂf6Þè¸ø */
- $"739E 1EBD 408C C620 9790 A337 E987 2E54" /* sž.½@ŒÆ —£7é‡.T */
- $"DD4A E501 C0BF 44E6 E8EF ACCF 028F 253C" /* ÝJå.À¿Dæèï¬Ï.%< */
- $"F466 FA92 BEE6 A066 F4B6 5B41 CA80 3567" /* ôfú’¾æ fô¶[AÊ€5g */
- $"A079 E31D CEE9 CD64 0AED 265D E591 B98C" /*  yã.ÎéÍdÂí&]呹Œ */
- $"DF22 C203 3C43 E1D8 5D64 CA99 E6C7 EF30" /* ß"Â.<CáØ]dÊ™æÇï0 */
- $"68AF F4C9 97D5 F961 48CF 954C 2832 33A3" /* h¯ôÉ—ÕùaHÏ•L(23£ */
- $"0088 1417 0D84 DDE1 23FA C81D 487D C9AB" /* .ˆ...„Ýá#úÈ.H}É« */
- $"F239 ABB4 24E0 6694 291C 885C 23CE F212" /* ò9«´$àf”).ˆ\#Îò. */
- $"29F4 5656 7DD1 182A 2C11 AAEF 7534 24EE" /* )ôVV}Ñ.*,.ªïu4$î */
- $"9886 347F 28AD 6952 0A82 E9A4 6AA9 9390" /* ˜†4.(­iR‚é¤j©“ */
- $"06A8 EF47 527A EDF2 894B 5234 A900 82B1" /* .¨ïGRzíò‰KR4©.‚± */
- $"724D 791B 676C BC97 B3A5 94F7 137E FE8D" /* rMy.gl¼—³¥”÷.~þ */
- $"50F5 C1EE 0C5B 1F3D CEF4 DD64 709C 095B" /* PõÁî.[.=ÎôÝdpœÆ[ */
- $"A51A B239 3EC3 C9BA 39EC DBE2 FB9A 3C6F" /* ¥.²9>Ãɺ9ìÛâûš<o */
- $"BBC4 DE3E C5AF 0043 DC2D AE64 C0A7 2039" /* »ÄÞ>ů.CÜ-®dÀ§ 9 */
- $"A6C9 6079 72D6 0BC7 C501 A3A4 5EF4 A060" /* ¦É`yrÖ.ÇÅ.£¤^ô ` */
- $"C46E FCB9 1958 AD83 1176 0776 81C2 13C2" /* Änü¹.X­ƒ.v.vÂ. */
- $"DF08 4A76 137F DC5C 4867 0493 EE96 8373" /* ß.Jv..Ü\Hg.“î–ƒs */
- $"4644 13A4 F789 39FF 813B D226 575A 5A18" /* FD.¤÷‰9ÿ;Ò&WZZ. */
- $"3AF5 4B88 2747 3D47 681F 9670 0069 DD02" /* :õKˆ'G=Gh.–p.iÝ. */
- $"4252 ADB0 D6FB F1F1 1432 C24B D920 7290" /* BR­°Öûññ.2ÂKÙ r */
- $"3709 3D60 15D9 0C49 23EC 77F8 F791 F132" /* 7Æ=`.Ù.I#ìwø÷‘ñ2 */
- $"046E 0D05 9AFA 210A 9992 29D9 7AA6 F18E" /* .n..šú!™’)Ùz¦ñŽ */
- $"E245 75E0 018F BCEB 8D1B C2D0 083E 985F" /* âEuà.¼ë.ÂÐ.>˜_ */
- $"B791 554D F5F5 AD71 E064 75E6 1F3A D463" /* ·‘UMõõ­qàduæ.:Ôc */
- $"9A59 0A43 3457 BD7C 44A7 5C5E 9D19 C5D8" /* šYÂC4W½|D§\^.ÅØ */
- $"5880 C2CC 5DF0 2964 C0FD ABA1 004B 008D" /* X€ÂÌ]ð)dÀý«¡.K. */
- $"5205 7F2E 0843 E484 2D37 9C34 2425 7AFF" /* R....Cä„-7œ4$%zÿ */
- $"7021 D907 B6E1 F5E5 02C3 F3DD 44C8 2252" /* p!Ù.¶áõå.ÃóÝDÈ"R */
- $"0649 3C1A 1A80 449A 64D1 1720 76D6 4987" /* .I<..€DšdÑ. vÖI‡ */
- $"B4B1 E749 E899 BF69 5B35 F925 2EE6 6CE6" /* ´±çI虿i[5ù%.ælæ */
- $"B4FD CEB3 54C0 7C9D 4380 F93B 5701 F274" /* ´ýγTÀ|C€ù;W.òt */
- $"C4F3 CC20 F972 1FD1 56B3 911D 2995 5FC9" /* ÄóÌ ùr.ÑV³‘.)•_É */
- $"1F35 BAE0 9AC7 3082 1372 C1D5 4B23 D79E" /* .5ºàšÇ0‚.rÁÕK#מ */
- $"EF63 A93F 8E74 26FB AC68 CDBE BD3E 9720" /* ïc©?Žt&û¬h;½>— */
- $"DF71 956D 5D26 559E 2795 2F1B F798 7821" /* ßq•m]&Už'•/.÷˜x! */
- $"F3CB 1E6F 2351 11BD 0EFF 19B2 40A2 1C7F" /* óË.o#Q.½.ÿ.²@¢.. */
- $"267D D302 F6AE 5410 1E96 40DC 386E CB7B" /* &}Ó.ö®T..–@Ü8nË{ */
- $"7EA3 5CF7 46BA 8758 D0EE 12B3 34DF 46FE" /* ~£\÷Fº‡XÐî.³4ßFþ */
- $"517B E0F8 7E28 83A5 E93A C06D 7C3F 254B" /* Q{àø~(ƒ¥é:Àm|?%K */
- $"53DF 91ED F6AB FD0A 53A0 5257 F9B8 E8B7" /* Sß‘íö«ýÂS RWù¸è· */
- $"5A14 6036 C6DA E3FE C29D 799F 8B43 46D6" /* Z.`6ÆÚãþÂyŸ‹CFÖ */
- $"94DF 1954 073C 7C30 40F4 A00D 93D4 AADF" /* ”ß.T.<|0@ô .“ﻧ */
- $"4839 EF36 F92A 3758 97CE 955A 3521 3CB5" /* H9ï6ù*7X—ΕZ5!<µ */
- $"8269 30A7 2A93 6A40 07BE DCC3 50B6 C86B" /* ‚i0§*“j@.¾ÜÃP¶Èk */
- $"CE9A AF28 3B80 4FE6 873C DB8E A29C 15DC" /* Κ¯(;€Oæ‡<ÛŽ¢œ.Ü */
- $"81A8 F841 4F77 6237 7267 55C4 1289 2DA1" /* ¨øAOwb7rgUÄ.‰-¡ */
- $"8392 424A 398F 9FA7 8DBE 2CC6 44E9 A005" /* ƒ’BJ9Ÿ§¾,ÆDé . */
- $"0E57 6638 ADDD 9F15 D32E 13A9 F752 67BA" /* .Wf8­ÝŸ.Ó..©÷Rgº */
- $"9F1D 753C 0023 2BC1 2C48 19AF FF28 66E6" /* Ÿ.u<.#+Á,H.¯ÿ(fæ */
- $"0A05 1D62 536F C372 7DEC 5069 B44D AFD4" /* Â..bSoÃr}ìPi´M¯Ô */
- $"BE3C 9C16 161E 95B4 89E7 B034 4524 E373" /* ¾<œ...•´‰ç°4E$ãs */
- $"D4A2 2F82 F1BB 8F20 7861 0F95 7CDF C184" /* Ô¢/‚ñ» xa.•|ßÁ„ */
- $"5B65 6015 001B F6BD 5D52 D4BC 3A42 FD56" /* [e`...ö½]RÔ¼:BýV */
- $"D48F 3358 7432 09BD FF19 625D 3A11 13DA" /* Ô3Xt2ƽÿ.b]:..Ú */
- $"F222 12E8 5A1B 12BF 9B3B A234 A367 8FB6" /* ò".èZ..¿›;¢4£g¶ */
- $"4BF2 EE99 DB11 5D13 7021 71B4 2280 A1BC" /* Kòî™Û.].p!q´"€¡¼ */
- $"2AEF ECB5 D7EC 047C 0860 9676 78B1 CA76" /* *ïìµ×ì.|.`–vx±Êv */
- $"9AFB C995 D4EB 900A AD98 6423 E572 B68C" /* šûÉ•Ôë­˜d#år¶Œ */
- $"A271 A30B D157 8E95 8250 29BB 0323 E26C" /* ¢q£.ÑWŽ•‚P)».#âl */
- $"9223 91C7 0CD4 F0B0 442E 1BD3 1473 C699" /* ’#‘Ç.Ôð°D..Ó.sÆ™ */
- $"2D1C 8791 C699 920E 72C0 0D3E F6E9 9E2B" /* -.‡‘Æ™’.rÀ.>öéž+ */
- $"60B6 A87F 6CBE 146C 1224 90FC BF7B C6A9" /* `¶¨.l¾.l.$ü¿{Æ© */
- $"090E 3EAD C89D 5065 414B 3A1C F271 9327" /* Æ.>­ÈPeAK:.òq“' */
- $"D490 CD2B FBB3 BEFF 768D 4601 635B A746" /* ÔÍ+û³¾ÿvF.c[§F */
- $"8A4B 0981 8B8F EA85 D255 2113 8792 CC76" /* ŠKÆ‹ê…ÒU!.‡’Ìv */
- $"DE84 B950 C5F4 A4C1 D4EF 7D52 CC74 CCEE" /* Þ„¹PÅô¤ÁÔï}RÌtÌî */
- $"B40E B94F 9467 15CA 1DE0 3557 BF09 D787" /* ´.¹O”g.Ê.à5W¿Æׇ */
- $"ED66 345A E153 B4DC EF7C 2952 3161 5A99" /* íf4ZáS´Üï|)R1aZ™ */
- $"A193 D5EB 40F5 1300 65FA 8DFD 621A AE94" /* ¡“Õë@õ..eúýb.®” */
- $"30CD 6D25 A0FC 942E 37AC 52C8 CEAD 2D1F" /* 0Ím% ü”.7¬RÈέ-. */
- $"87D5 D078 F173 F5AD 7A56 DD1B 10C3 F9BF" /* ‡ÕÐxñsõ­zVÝ..Ãù¿ */
- $"69C1 9E6B E021 A0C7 84BF D87A 8AA8 327C" /* iÁžkà! Ç„¿ØzŠ¨2| */
- $"7D48 0D97 E584 FF7F AE07 2001 BF6C 2691" /* }H.—å„ÿ.®. .¿l&‘ */
- $"3032 E118 8741 42AD 7709 3086 8488 F9D3" /* 02á.‡AB­wÆ0†„ˆùÓ */
- $"0353 D79E 2E21 8F21 46CC 005C DA8A 0229" /* .Sמ.!!FÌ.\ÚŠ.) */
- $"A56B A72A C69E FCF7 7558 5D72 0050 2BDE" /* ¥k§*Æžü÷uX]r.P+Þ */
- $"0F36 E4F0 C744 89FC 37F0 7ECA F488 FE8C" /* .6äðÇD‰ü7ð~ÊôˆþŒ */
- $"1B6B 0158 B34D 1EA6 9B1F 154E FF79 01D4" /* .k.X³M.¦›..Nÿy.Ô */
- $"725F D9CF D9BF CCFF 439D 8F5C A92D D20D" /* r_ÙÏÙ¿ÌÿC\©-Ò. */
- $"0613 88F8 5C1C B6BD 07B9 9078 151D 8353" /* ..ˆø\.¶½.¹x..ƒS */
- $"0E68 8495 D521 92D8 E92D CF9B 10E6 ABDC" /* .h„•Õ!’Øé-Ï›.æ«Ü */
- $"53D9 DFB2 F2AF F964 14E3 74D6 3D64 01E2" /* SÙß²ò¯ùd.ãtÖ=d.â */
- $"FAFB 2D0B D303 DCF7 7718 E6CF 30DB 3FAE" /* úû-.Ó.Ü÷w.æÏ0Û?® */
- $"2873 3339 54A3 1E48 04D2 FDF2 E863 6201" /* (s39T£.H.Òýòècb. */
- $"01D1 182C 4C2A D85D AE26 DE15 9796 494C" /* .Ñ.,L*Ø]®&Þ.—–IL */
- $"82EA B4C0 2D3C 3D3E 1732 2ACA AC27 B7DB" /* ‚ê´À-<=>.2*ʬ'·Û */
- $"5CED 6F9D 3EDB FF04 5E83 BE60 1636 AE2C" /* \ío>Ûÿ.^ƒ¾`.6®, */
- $"754D 2928 7128 ACFD 15E8 C1A0 30A5 1063" /* uM)(q(¬ý.èÁ 0¥.c */
- $"1E6F 10F7 A946 B9B4 D921 5DB3 113F 332E" /* .o.÷©F¹´Ù!]³.?3. */
- $"61B8 AB3D 2F87 E081 C9D9 32B7 1060 785A" /* a¸«=/‡àÉÙ2·.`xZ */
- $"EFDD F472 0283 E235 4D42 E903 A06B 51CB" /* ïÝôr.ƒâ5MBé. kQË */
- $"39DC A412 A492 918E 235E F57C E4CE 4E0F" /* 9ܤ.¤’‘Ž#^õ|äÎN. */
- $"6BE6 7036 FA8A 7B2C 21FE 60B1 6FCA 7654" /* kæp6úŠ{,!þ`±oÊvT */
- $"C9FD DCDF E497 B2A6 D6D5 87ED 9D3B 5B86" /* ÉýÜßä—²¦ÖÕ‡í;[† */
- $"DA51 6B5B AE3E 520B 1DB3 5A6B 2B4D A777" /* ÚQk[®>R..³Zk+M§w */
- $"4F13 A04C 7D4F 819B 1FEB 086D 5F34 6643" /* O. L}O›.ë.m_4fC */
- $"0208 693A D70C 55B2 7A07 BC27 3A41 B739" /* ..i:×.U²z.¼':A·9 */
- $"C1F5 7425 07D5 D74C 1F56 F680 F1C4 B0CB" /* Áõt%.Õ×L.Vö€ñÄ°Ë */
- $"F3E0 DE80 53FC 256D EFD0 6B64 028C EC70" /* óàÞ€Sü%mïÐkd.Œìp */
- $"4973 06D4 242C DAAA 8373 DFAC B0C9 14A1" /* Is.Ô$,Úªƒs߬°É.¡ */
- $"BFBC 0BB4 E250 919E 3D2B B388 3A89 FB02" /* ¿¼.´âP‘ž=+³ˆ:‰û. */
- $"9796 86E6 20F8 C26C 8120 349C 757A 6875" /* —–†æ øÂl 4œuzhu */
- $"F63E AE68 84C3 03A3 6F64 F9EE F892 2CF8" /* ö>®h„Ã.£odùîø’,ø */
- $"61C1 B13A E941 0D67 DA36 4C05 9565 DC85" /* aÁ±:éA.gÚ6L.•eÜ… */
- $"D7F8 6EB9 D903 D428 F59A 3EBF C73E 5E95" /* ×øn¹Ù.Ô(õš>¿Ç>^• */
- $"764D 15FB 98F2 BECE 0FC8 EA3C 4E51 E1DD" /* vM.û˜ò¾Î.Èê<NQáÝ */
- $"5253 CE7A 2D16 8527 AF8E 9A17 757A A42F" /* RSÎz-.…'¯Žš.uz¤/ */
- $"6CA9 6BB3 7787 D84F 8E20 EA1F FB2D 15E3" /* l©k³w‡ØOŽ ê.û-.ã */
- $"0D2C 45A8 8C80 7DA1 89DB 5F46 F3FB 2871" /* .,E¨Œ€}¡‰Û_Fóû(q */
- $"539E 8CCA 5C03 EF20 B6B5 4956 EB82 172C" /* SžŒÊ\.ï ¶µIVë‚., */
- $"AB28 0D6D 4DF9 1F61 6F8D 61FE E962 778D" /* «(.mMù.aoaþébw */
- $"0C8E EC55 3BDC EC81 C9D1 E7D5 A811 C69A" /* .ŽìU;ÜìÉÑçÕ¨.Æš */
- $"6186 BC2C 75B4 DD3D C207 1151 4C3B 4175" /* a†¼,u´Ý=Â..QL;Au */
- $"942E 2ACF D3C7 7122 9D89 31B3 0918 EDC0" /* ”.*ÏÓÇq"‰1³Æ.íÀ */
- $"9D45 75D8 DE61 5036 6D9F 3373 4827 7ADE" /* EuØÞaP6mŸ3sH'zÞ */
- $"1BD1 16E8 8905 37D4 D811 1077 B359 0FF6" /* .Ñ.è‰.7ÔØ..w³Y.ö */
- $"0460 F360 20A5 B532 3418 142A B432 C2E9" /* .`ó` ¥µ24..*´2Âé */
- $"A0D6 DB04 317D 28F3 C893 AAE3 19B1 5742" /*  ÖÛ.1}(óÈ“ªã.±WB */
- $"7BF6 615C 0EAC F35E 0CD4 B142 A289 5458" /* {öa\.¬ó^.Ô±B¢‰TX */
- $"D699 1584 46FF 7174 758F B1F8 F540 F427" /* Ö™.„Fÿqtu±øõ@ô' */
- $"A496 8795 E66B 3DDC FB80 D0B8 9411 7240" /* ¤–‡•æk=Üû€Ð¸”.r@ */
- $"0374 54DC B2CA C982 BD5E FD06 4B02 5E8D" /* .tTܲÊÉ‚½^ý.K.^ */
- $"A958 79AA 5BE6 B5A2 76C3 7C23 0D45 6768" /* ©Xyª[æµ¢vÃ|#.Egh */
- $"D726 8259 FD2E E5CE 9B70 0600 22E7 82A3" /* ×&‚Yý.åΛp.."ç‚£ */
- $"8E14 9626 C4EC EED9 E7D8 13C9 623F 3DEB" /* Ž.–&ÄìîÙçØ.Éb?=ë */
- $"357B E617 A43A C9D4 328A C30A FF45 71BA" /* 5{æ.¤:ÉÔ2ŠÃÂÿEqº */
- $"1F8B 3945 8E06 0CF0 4749 0840 6F5A EDDB" /* .‹9EŽ..ðGI.@oZíÛ */
- $"29AC E877 27BD 6C8C A131 8A1C 9228 0FC5" /* )¬èw'½lŒ¡1Š.’(.Å */
- $"A029 D1A1 324D EFCE EB3F 2B92 150D FB8C" /*  )Ñ¡2MïÎë?+’..ûŒ */
- $"5399 1ABD D375 08BF 8F3F E788 684D 3064" /* S™.½Óu.¿?çˆhM0d */
- $"70B4 A733 4AB6 239A DC03 724F C8B8 F1BB" /* p´§3J¶#šÜ.rOȸñ» */
- $"8F1F A795 FF18 8256 0050 FF74 EDF1 3D05" /* .§•ÿ.‚V.Pÿtíñ=. */
- $"6CB0 E566 9272 E493 C085 3D06 3116 4ECE" /* l°åf’rä“À…=.1.NÎ */
- $"402D 329F 4BBB 2598 A7CF BEE1 333D 9019" /* @-2ŸK»%˜§Ï¾á3=. */
- $"61BB 1A29 2616 E907 2CD6 F64C 456F 9881" /* a».)&.é.,ÖöLEo˜ */
- $"725B 5C38 A40D 60D3 6B4F FDF1 87D7 4786" /* r[\8¤.`ÓkOýñ‡×G† */
- $"29BF CAEB 223A 044D 0F61 FDE6 0A3E 7727" /* )¿Êë":.M.aýæÂ>w' */
- $"DDEE 0A95 231F 04AC B6EF D134 C09D 1540" /* Ýî•#..¬¶ïÑ4À.@ */
- $"0E94 57E2 8418 C208 1F26 7396 96A0 D08F" /* .”Wâ„.Â..&s–– Ð */
- $"0CC0 40C8 C596 39BA 0CAE A6ED F8E8 7D6B" /* .À@ÈÅ–9º.®¦íøè}k */
- $"A76C 391B 6113 555F 62E0 6E14 5D27 E7BC" /* §l9.a.U_bàn.]'ç¼ */
- $"EDB7 D038 DED2 7BEE FC9D 6211 241E 0795" /* í·Ð8ÞÒ{îüb.$..• */
- $"9CDE 1607 B4C7 828E 24D2 4E9F FCA0 36EA" /* œÞ..´Ç‚Ž$ÒNŸü 6ê */
- $"004C C960 1680 01CE 7FF6 A201 EDAB 1ADF" /* .LÉ`.€.Î.ö¢.í«.ß */
- $"80D8 4524 390C 23DD EA8E 062C 5DDB 3C57" /* €ØE$9.#ÝêŽ.,]Û<W */
- $"BAEC 18E5 1ECE 91D7 A40E 08ED 23EA 55B6" /* ºì.å.Αפ..í#êU¶ */
- $"AA2C F48A 7B0E 8CAE 90DD 5840 41FF 7F4C" /* ª,ôŠ{.Œ®ÝX@Aÿ.L */
- $"47AD E774 87C4 9AB1 9CAD E633 DECD 3E36" /* G­çt‡Äš±œ­æ3ÞÍ>6 */
- $"00C2 0E05 134F 4802 3846 3575 1902 676D" /* .Â...OH.8F5u..gm */
- $"1006 D8AE 0D5F 1934 78F6 0721 F3C4 1000" /* ..Ø®._.4xö.!óÄ.. */
- $"8991 FA85 45B5 37A9 5A0C 54EE 014B 297B" /* ‰‘ú…Eµ7©Z.Tî.K){ */
- $"52F2 5ADD 7422 C97B EAA9 D291 45A7 A44A" /* RòZÝt"É{ê©Ò‘E§¤J */
- $"40FE AE73 5086 C7D3 85FD D734 67F2 8909" /* @þ®sP†ÇÓ…ý×4gò‰Æ */
- $"506D 36D8 2361 990C 802F A59E B603 9C94" /* Pm6Ø#a™.€/¥ž¶.œ” */
- $"F7BD AED9 8518 8651 DFFE 3D0E E920 E874" /* ÷½®Ù….†Qßþ=.é èt */
- $"FEB0 EE3C 3242 C249 4704 EEA8 9EFA DC61" /* þ°î<2BÂIG.úÜa */
- $"49C6 929E 2A9D 51CD FE0A FF02 3DDB 01EC" /* IÆ’ž*QÍþÂÿ.=Û.ì */
- $"80E8 630A B0C8 C9FC 7693 C60B 07E8 5D2F" /* €èc°ÈÉüv“Æ..è]/ */
- $"B97A 9F04 444E C836 DD68 FF12 EC9C 7E4F" /* ¹zŸ.DNÈ6Ýhÿ.ìœ~O */
- $"3CE9 83A8 191A 1E61 05F8 90FF 67E8 011A" /* <部...a.øÿgè.. */
- $"71EA 3EE8 AFBD 6328 ED84 9807 788D F3BC" /* qê>诽c(턘.xó¼ */
- $"2FA0 A210 7FFF 1D02 2519 4EC7 2A80 7FD0" /* / ¢..ÿ..%.NÇ*€.Ð */
- $"2064 A8F4 CC78 5EC8 88AF F1AB 868B 9F8D" /* d¨ôÌx^Ȉ¯ñ«†‹Ÿ */
- $"883E 3FDA D188 FBB7 3AFC 0C72 E01A CEF3" /* ˆ>?Úшû·:ü.rà.Îó */
- $"21E1 1718 4FDB 9A43 3767 424A 639B DFFE" /* !á..OÛšC7gBJc›ßþ */
- $"CA5F 7BA9 8F82 3EA6 6D4E 6986 6945 80DE" /* Ê_{©‚>¦mNi†iE€Þ */
- $"8274 4927 166A 6062 DF1D 0A72 F23B FA5A" /* ‚tI'.j`bß.Ârò;úZ */
- $"4DE4 5D19 54FC 488B 5237 FF5F 7B81 62C5" /* Mä].TüH‹R7ÿ_{bÅ */
- $"F6B7 B580 3016 11B6 22CF 63B8 428A D39A" /* ö·µ€0..¶"Ïc¸BŠÓš */
- $"5AC3 80FF 7310 8386 FF54 F361 304F 3BB5" /* ZÀÿs.ƒ†ÿTóa0O;µ */
- $"A7EB 0419 7DFB 6E56 20A8 3670 9018 9CB3" /* §ë..}ûnV ¨6p.œ³ */
- $"4B35 7082 32A7 E917 9CF8 FF7F FF80 0A6C" /* K5p‚2§é.œøÿ.ÿ€Âl */
- $"A48C 447E 3ECF 411D 89E4 F923 373B DCBE" /* ¤ŒD~>ÏA.‰äù#7;ܾ */
- $"2CE8 6580 0F87 1A23 1D93 62AE 48EF DEB8" /* ,èe€.‡.#.“b®HïÞ¸ */
- $"5DE8 DB68 1CA3 8D4B D3FE A476 7B3D ACAA" /* ]èÛh.£KÓþ¤v{=¬ª */
- $"284F 83EB 428F A201 D122 CB1A CCB2 C1FE" /* (OƒëB¢.Ñ"Ë.̲Áþ */
- $"367F 60D3 155D 8C00 22D8 ED33 D56B 1DE2" /* 6.`Ó.]Œ."Øí3Õk.â */
- $"98B0 A4A9 E041 2BF1 AA58 E78D 47E5 929F" /* ˜°¤©àA+ñªXçGå’Ÿ */
- $"85DA 699E C45A 0064 B931 CF2B 4169 44F0" /* …ÚižÄZ.d¹1Ï+AiDð */
- $"4B4F 083B 3D7C B2B2 D87B 785E 91A8 C614" /* KO.;=|²²Ø{x^‘¨Æ. */
- $"6EE6 A63C C8A7 B9E3 839D E245 4128 3BF9" /* næ¦<ȧ¹ãƒâEA(;ù */
- $"98CD 0C23 72EB E3A9 D21F 1BC2 4E13 274B" /* ˜Í.#rëã©Ò..ÂN.'K */
- $"19C8 CB39 5E7A D218 FBDB 0C42 51A1 1203" /* .ÈË9^zÒ.ûÛ.BQ¡.. */
- $"C0EB CDC2 9249 E461 1DE4 3DB6 FDFE 1334" /* ÀëÍÂ’Iäa.ä=¶ýþ.4 */
- $"1952 8231 CD71 A170 C55B 1FD0 6706 57F0" /* .R‚1Íq¡pÅ[.Ðg.Wð */
- $"282D 09A2 0893 A5BA 0314 43DD 32AF 3478" /* (-Æ¢.“¥º..CÝ2¯4x */
- $"EF6C 15F0 55C9 6A47 ECFE 3F3F 4DB4 5ED8" /* ïl.ðUÉjGìþ??M´^Ø */
- $"EFF8 8CA5 71F9 6669 078C 550C 943A 7046" /* ïøŒ¥qùfi.ŒU.”:pF */
- $"C031 6CE2 4681 4177 2913 CFE7 D857 C62A" /* À1lâFAw).ÏçØWÆ* */
- $"4652 88E2 8830 DF42 9C3D 2D76 E710 A8F1" /* FRˆâˆ0ßBœ=-vç.¨ñ */
- $"3626 45F2 55CC 008C EAB8 B891 A5F3 1AD2" /* 6&EòUÌ.Œê¸¸‘¥ó.Ò */
- $"AB11 6C48 3F18 40C0 51F0 DB88 0BD1 168C" /* «.lH?.@ÀQðÛˆ.Ñ.Œ */
- $"2E54 2DA6 CC60 BB05 4700 2C4E 179B 271B" /* .T-¦Ì`».G.,N.›'. */
- $"688C 1EE9 4D9A C781 8108 296B FE4F 028A" /* hŒ.éMšÇ.)kþO.Š */
- $"63D6 6EDF 6FEB FC17 BDFE 7A70 B48E D94E" /* cÖnßoëü.½þzp´ŽÙN */
- $"D985 3384 1BD2 B4C9 5213 B0D1 041B 876C" /* Ù…3„.Ò´ÉR.°Ñ..‡l */
- $"131C 4A9C 947B A79C A466 9779 E7C9 D2E1" /* ..Jœ”{§œ¤f—yçÉÒá */
- $"4E9F 0509 30E0 1115 E5C7 CAED 197B 818A" /* NŸ.Æ0à..åÇÊí.{Š */
- $"324D 8F8E ED44 BF44 5340 D647 1776 B983" /* 2MŽíD¿DS@ÖG.v¹ƒ */
- $"6D8C 88B1 6976 F7EB AFDB 6638 CAD3 F275" /* mŒˆ±iv÷ë¯Ûf8ÊÓòu */
- $"D93A 6CD3 9D6E C617 3969 D8E5 3059 947B" /* Ù:lÓnÆ.9iØå0Y”{ */
- $"6AFA 0E9B A19C 24C9 E1DC 089D 3545 89E4" /* jú.›¡œ$ÉáÜ.5E‰ä */
- $"E860 FB54 068C B464 EE9B 66B7 F267 34CF" /* è`ûT.Œ´dî›f·òg4Ï */
- $"1276 C6B2 47E6 8284 300B D1A9 1409 0C93" /* .vƲGæ‚„0.Ñ©.Æ.“ */
- $"E36A 8095 409A 7352 FF7A 0F50 A5E2 E678" /* ãj€•@šsRÿz.P¥âæx */
- $"C195 0898 E51E EB15 8D7A E918 29A6 D5CE" /* Á•.˜å.ë.zé.)¦ÕÎ */
- $"4DBC 978B 2CAA 9BA7 8727 EA1C 1C7A 6CC2" /* M¼—‹,ª›§‡'ê..zl */
- $"D172 DDF5 4BD4 9C69 607B 609F AEC8 FD84" /* ÑrÝõKÔœi`{`Ÿ®Èý„ */
- $"1DDA A076 C7E1 A7B1 F86C BC7E 1720 EB83" /* .Ú vÇ᧱øl¼~. ëƒ */
- $"095B F1C8 7239 10FD 6A26 D10E 534B E257" /* Æ[ñÈr9.ýj&Ñ.SKâW */
- $"B691 5D92 6949 E7D8 7470 AA8C 421F F945" /* ¶‘]’iIçØtpªŒB.ùE */
- $"99F6 9492 B806 E264 47B0 4EF5 6206 734E" /* ™ö”’¸.âdG°Nõb.sN */
- $"944B 102F A688 23A4 EAB0 CCEA 0017 0156" /* ”K./¦ˆ#¤ê°Ìê...V */
- $"A8C9 2A3F FF49 4137 E23A 09D0 97BB 0E5F" /* ¨É*?ÿIA7â:ÆЗ»._ */
- $"E2A2 2247 4980 6A20 B443 3E0B 0465 B9EF" /* â¢"GI€j ´C>..e¹ï */
- $"C490 B954 3AEA ABB7 3D53 111D 8897 551C" /* ĹT:ê«·=S..ˆ—U. */
- $"B865 1EA2 33F2 AD50 D488 1D6D 9733 27F3" /* ¸e.¢3ò­PÔˆ.m—3'ó */
- $"78AC C946 FB3C 4D2F 6580 1B3A 3368 3D54" /* x¬ÉFû<M/e€.:3h=T */
- $"55DF 6B52 1A54 9010 C4D2 12C8 D497 9CDB" /* UßkR.T.ÄÒ.ÈÔ—œÛ */
- $"173A 0609 66F1 C6C0 FD02 47A0 B2E2 D2E6" /* .:.ÆfñÆÀý.G ²âÒæ */
- $"096E F870 0776 4898 2F2B 84CF BA83 D656" /* Ænøp.vH˜/+„ϺƒÖV */
- $"7F77 79FF 0F1D 2A6E 03C6 4D0F E3EF D23B" /* .wyÿ..*n.ÆM.ãïÒ; */
- $"6F82 5F72 6701 98DF 5A63 DA7B 0ABC 75E2" /* o‚_rg.˜ßZcÚ{¼uâ */
- $"382D 0D93 3C8C 5308 19EA EF8D 7922 CD36" /* 8-.“<ŒS..êïy"Í6 */
- $"ED21 EB4D 3D77 5A8A 1380 E238 22E5 84AA" /* í!ëM=wZŠ.€â8"優 */
- $"4488 7DCE 91A0 CB4B 67FA 74AF EA3D 1C8E" /* Dˆ}Α ËKgút¯ê=.Ž */
- $"9279 611D FD02 D08F D952 B05D 2C11 B545" /* ’ya.ý.ÐÙR°],.µE */
- $"5F17 FF5C 1E9C 6A77 DA2F A474 B20C F5A2" /* _.ÿ\.œjwÚ/¤t².õ¢ */
- $"B2D4 176F 97E4 CE9E B576 C3E0 0F3D ECB9" /* ²Ô.o—äΞµvÃà.=ì¹ */
- $"7B35 DEBB 5ABA 9738 36F8 524D 74D8 08FF" /* {5Þ»Zº—86øRMtØ.ÿ */
- $"29A7 9B08 5B43 7C17 FB53 234E 4806 B0C3" /* )§›.[C|.ûS#NH.°Ã */
- $"AF3A FF38 CCAF FEAA C60F D103 32AC 7D7F" /* ¯:ÿ8̯þªÆ.Ñ.2¬}. */
- $"D2B8 51C1 7B7D 56FD 7CFB D2B5 C55B 7C7D" /* Ò¸QÁ{}Vý|ûÒµÅ[|} */
- $"7D30 10C2 4181 3358 5DD6 4625 4FFC EA30" /* }0.ÂA3X]ÖF%Oüê0 */
- $"3402 194F 6D0B 53D8 3C64 54AE E8DA 7874" /* 4..Om.SØ<dT®èÚxt */
- $"7FF1 DE25 3147 0AF0 D5B6 7BF7 88DD 5199" /* .ñÞ%1GÂðÕ¶{÷ˆÝQ™ */
- $"611E 526D B6DB 6DB6 DB69 9C6E 7A40 821D" /* a.Rm¶Ûm¶Ûiœnz@‚. */
- $"4416 6952 04BB 9C0A F19B 2C62 E698 A4F5" /* D.iR.»œÂñ›,b昤õ */
- $"9B83 3C59 8217 0000 0034 8080 DB92 4924" /* ›ƒ<Y‚....4€€Û’I$ */
- $"9249 247D 32D0 9B20 73FF 7E44 A49A 44BB" /* ’I$}2Л sÿ~D¤šD» */
- $"EB45 3E31 A4A0 C0CC BBC0 B29E 7771 4FDE" /* ëE>1¤ ÀÌ»À²žwqOÞ */
- $"1679 23F1 DE12 5574 68E3 60A1 9C00 CBEC" /* .y#ñÞ.Uthã`¡œ.Ëì */
- $"9C44 9009 0000 08DE 28C3 2776 AAA2 829A" /* œDÆ...Þ(Ã'vª¢‚š */
- $"05E0 47E9 0001 48A9 672C 0775 EE58 F075" /* .àGé..H©g,.uîXðu */
- $"7458 B48A 5455 DB33 3524 BE73 1D7C E223" /* tX´ŠTUÛ35$¾s.|â# */
- $"4EC4 732C EC4B 128D 341C 790C 00A2 1309" /* NÄs,ìK.4.y..¢.Æ */
- $"2D0B 5EA7 B07B C82C 976B 68C2 642A F095" /* -.^§°{È,—khÂd*ð• */
- $"A1C4 010E C94E D8A9 34BB FD3E 2B2F 92EC" /* ¡Ä..ÉNØ©4»ý>+/’ì */
- $"30E1 A7B3 040B C920 3FFF 7FA1 317B 90F7" /* 0᧳..É ?ÿ.¡1{÷ */
- $"C744 40B8 8325 4036 82FB 0C6C D800 19C4" /* ÇD@¸ƒ%@6‚û.lØ..Ä */
- $"2631 C4B8 3160 8649 2492 4924 9248 A747" /* &1ĸ1`†I$’I$’H§G */
- $"3D41 A17D 23A6 9AC7 9000 0000 0000 0000" /* =A¡}#¦šÇ....... */
- $"0000 0019 1A70 8823 BB21 7C62 4556 F257" /* .....pˆ#»!|bEVòW */
- $"62C0 CF0B 72EE F37E 64EC 43C2 AE04 9F58" /* bÀÏ.rîó~dìC®.ŸX */
- $"94DC E128 91EC BAA2 DADD 57A7 D5F7 1972" /* ”Üá(‘캢ÚÝW§Õ÷.r */
- $"7543 9A9A 0DB3 C3FD 42E0 19A3 8F45 7FDF" /* uCšš.³ÃýBà.£E.ß */
- $"CEB1 A7E5 8A09 5B4A F9E6 294B C5DC 80C9" /* α§åŠÆ[Jùæ)KÅÜ€É */
- $"9AEE 0729 374F 04FD 79D6 7170 D940 14F0" /* šî.)7O.ýyÖqpÙ@.ð */
- $"830F 0B71 50E7 3C76 97AF 0F71 A32D DC5A" /* ƒ..qPç<v—¯.q£-ÜZ */
- $"28A9 FE90 6CC0 9484 30D1 FCCD 4991 0758" /* (©þlÀ”„0ÑüÍI‘.X */
- $"BE36 B1DE 3A2E B6F8 2756 C568 2A7F D038" /* ¾6±Þ:.¶ø'VÅh*.Ð8 */
- $"2397 6E8F 32E0 C1AC 3736 32A3 C18E 13C4" /* #—n2àÁ¬762£ÁŽ.Ä */
- $"D298 8703 F9AF E24B A630 0627 6E63 ED70" /* Ò˜‡.ù¯âK¦0.'ncíp */
- $"0662 A833 6515 7225 C79D 8C1F 7410 45BF" /* .b¨3e.r%ÇŒ.t.E¿ */
- $"5019 F088 7C6C 43FC AE88 B794 5847 505F" /* P.ðˆ|lCü®ˆ·”XGP_ */
- $"2B73 6E58 E20E 18A2 01B4 DF7F F5BD D4BC" /* +snXâ..¢.´ß.õ½Ô¼ */
- $"B259 706B 754E 9740 BBF2 54FC FCB8 B293" /* ²YpkuN—@»òTüü¸²“ */
- $"4CEA 3670 D04B 8C42 B7C2 314D 1F53 956B" /* Lê6pÐKŒB·Â1M.S•k */
- $"CB14 9D05 8288 E7F0 D4FF 70AE EFB7 A10B" /* Ë..‚ˆçðÔÿp®ï·¡. */
- $"EDDE 3CFE 1B9D 7DBA 7B7D BD13 DF6F 45B8" /* íÞ<þ.}º{}½.ßoE¸ */
- $"FE1A 077D B444 FAB6 46FB 75FC E8AB DECC" /* þ..}´Dú¶Fûuüè«ÞÌ */
- $"AF0D 6C8A C695 8734 8A7A 5A21 F65D 05F6" /* ¯.lŠÆ•‡4ŠzZ!ö].ö */
- $"A417 27AC 998E 3646 07A8 0055 19DC B524" /* ¤.'¬™Ž6F.¨.U.ܵ$ */
- $"D2F2 842C DF9F BECA C26B C9C9 D0FD CA3B" /* Òò„,ߟ¾ÊÂkÉÉÐýÊ; */
- $"DB1B 3F81 F6A7 4465 001E 5552 4D0D 3BF3" /* Û.?ö§De..URM.;ó */
- $"0140 A2E9 7D63 8456 F9C7 665D F7FC 2DBF" /* .@¢é}c„VùÇf]÷ü-¿ */
- $"1B41 0667 7939 1B16 4997 5584 3CFE 81B9" /* .A.gy9..I—U„<þ¹ */
- $"C4A8 B346 EC6D E726 2560 5CB8 8B84 7699" /* Ĩ³Fìmç&%`\¸‹„v™ */
- $"3999 2CA0 91D9 A05A C96C 660C 267B 74A0" /* 9™, ‘Ù ZÉlf.&{t  */
- $"B935 73EB D464 D860 2694 7584 A4D4 DC52" /* ¹5sëÔdØ`&”u„¤ÔÜR */
- $"D136 D49A 1BEA 53F5 AE2F C19E 44E9 BA0A" /* Ñ6Ôš.êSõ®/ÁžDéºÂ */
- $"5D83 6587 7792 3DCB 449A B33E 4632 A395" /* ]ƒe‡w’=ËDš³>F2£• */
- $"57A3 0EC0 B3A3 969D 9DF0 6ACC 859F FF7F" /* W£.À³£–ðjÌ…Ÿÿ. */
- $"FF27 DAA0 AF8E 216C E5D8 874A 530F 555E" /* ÿ'Ú ¯Ž!lå؇JS.U^ */
- $"AF3F E231 5BAF F7B6 8E73 5742 2717 4031" /* ¯?â1[¯÷¶ŽsWB'.@1 */
- $"175D 5FDA F402 B756 AEAE 7E7E BFEE CE68" /* .]_Úô.·V®®~~¿îÎh */
- $"7878 870D 01C2 C2A4 61D5 64E3 E195 B914" /* xx‡..¤aÕdãᕹ. */
- $"A45F FF52 DC14 F5E9 E037 65E3 5477 62A5" /* ¤_ÿRÜ.õéà7eãTwb¥ */
- $"3EEC CA32 6558 5965 8B6E 3F13 9DB2 1361" /* >ìÊ2eXYe‹n?.².a */
- $"8426 9FD7 B329 4E75 FF1D 9B78 9735 4B1B" /* „&Ÿ×³)Nuÿ.›x—5K. */
- $"D80E 1781 192F 6777 8F94 F6A2 5016 726D" /* Ø.../gw”ö¢P.rm */
- $"1E0D D2CB 6F87 B3C6 09A2 1FE3 915E 8943" /* ..ÒËo‡³ÆÆ¢.ã‘^‰C */
- $"FE6C 6743 4733 D5BC A9DD 5338 C9E1 AF50" /* þlgCG3Õ¼©ÝS8Éá¯P */
- $"3634 C26C 0C1F 94E7 50B2 4310 DD62 4F09" /* 64Âl..”çP²C.ÝbOÆ */
- $"ABCD 7821 8B7B 7B87 2EEA 25A1 9D3C 55CC" /* «Íx!‹{{‡.ê%¡<UÌ */
- $"0644 1B14 3456 2E32 C013 815C 66C7 0526" /* .D..4V.2À.\fÇ.& */
- $"E24D CE15 B8FB 5D8B 0506 E30A 1D6A E2ED" /* âMÎ.¸û]‹..ãÂ.jâí */
- $"6145 D124 0EC9 1FAB 4E50 06C2 9DA5 8F6C" /* aEÑ$.É.«NP.Â¥l */
- $"C072 D11E BFEE DFE6 F6C7 12F4 E89C 35B7" /* ÀrÑ.¿îßæöÇ.ôèœ5· */
- $"097E 2E25 393F CEA3 03C6 D3C7 DED5 3882" /* Æ~.%9?Σ.ÆÓÇÞÕ8‚ */
- $"ED26 A3FD 9130 95B5 F3FA D31A 691F 8E09" /* í&£ý‘0•µóúÓ.i.ŽÆ */
- $"BFA8 7D7B 85BD B179 5C20 2855 1268 F9AF" /* ¿¨}{…½±y\ (U.hù¯ */
- $"553D 939E 6FC6 C67E 4611 F88C BBD4 773C" /* U=“žoÆÆ~F.øŒ»Ôw< */
- $"5F16 D598 D5C5 E649 B66E FD8D A2D7 9807" /* _.Õ˜ÕÅæI¶ný¢×˜. */
- $"EDA2 4621 2CF5 DDE3 C078 6455 1C29 3A07" /* í¢F!,õÝãÀxdU.):. */
- $"E992 C5DE 8D33 041B 83C6 56F6 7C95 168E" /* é’ÅÞ3..ƒÆVö|•.Ž */
- $"6127 40D2 DE11 CFF2 3379 DC22 20E3 5E1B" /* a'@ÒÞ.Ïò3yÜ" ã^. */
- $"DE83 DBB5 5B8A 8572 3DF2 2890 DC56 BE6E" /* ÞƒÛµ[Š…r=ò(ÜV¾n */
- $"D15F 9396 ECD4 725F 2E18 7616 394A 64C3" /* Ñ_“–ìÔr_..v.9Jdà */
- $"FDAA E6F2 3D6D 46BC B270 5B8F ACB4 9CAE" /* ýªæò=mF¼²p[¬´œ® */
- $"0D0D 3F29 6A02 1E92 347A E406 A52D 111A" /* ..?)j..’4zä.¥-.. */
- $"2E79 0340 1D82 C861 0C40 1963 3397 A4FD" /* .y.@.‚Èa.@.c3—¤ý */
- $"A998 0B63 E30A 7AA3 A5BC 8A8E 9CD0 4795" /* ©˜.cãÂz£¥¼ŠŽœÐG• */
- $"7538 7FB2 EC9A 952C CE29 C80F 369C 4E8D" /* u8.²ìš•,Î)È.6œN */
- $"8000 1C55 D5F3 E2AD 812E 4FAA AC2C D9BB" /* €..UÕóâ­.Oª¬,Ù» */
- $"F4CD 5568 5643 826F 3A38 91BD 6F70 92D3" /* ôÍUhVC‚o:8‘½op’Ó */
- $"23EC DB91 0FC4 C3BB 7542 023B 85F0 36C3" /* #ìÛ‘.ÄûuB.;…ð6à */
- $"8BF6 F6F8 4E77 EEE5 851F 219A CF99 7D9E" /* ‹ööøNwîå….!šÏ™}ž */
- $"856D A687 BC63 8E39 0407 B007 D184 10BD" /* …m¦‡¼cŽ9..°.Ñ„.½ */
- $"D9EF ACB1 B75A 46FA F95E 42DF 377B E2F7" /* Ùבּ·ZFúù^Bß7{â÷ */
- $"BEF2 357A 861C F486 B3F7 57E1 D39B 095B" /* ¾ò5z†.ô†³÷WáÓ›Æ[ */
- $"40C0 925C 0CA1 7885 CFEA 48B7 33E9 E8DE" /* @À’\.¡x…ÏêH·3éèÞ */
- $"D178 1E15 91D1 F6C5 BC87 CB7E CCC6 DEDE" /* Ñx..‘Ñöż‡Ë~ÌÆÞÞ */
- $"B017 A4C1 0B0F DD17 660E CB97 C098 C773" /* °.¤Á..Ý.f.Ë—À˜Çs */
- $"8A0A F4DB 59BD A218 055E 5348 05D8 B304" /* ŠÂôÛY½¢..^SH.س. */
- $"9F23 E1B1 0754 6DA2 FF33 34CB 2B12 7114" /* Ÿ#á±.Tm¢ÿ34Ë+.q. */
- $"62D2 4CA8 8091 CD34 8467 2752 B77A AA5B" /* bÒL¨€‘Í4„g'R·zª[ */
- $"15FC 2E56 7A29 9351 B6A4 AEE5 B56D 354D" /* .ü.Vz)“Q¶¤®åµm5M */
- $"3ED2 FA71 25E9 F887 B187 BADB B11B 2E01" /* >Òúq%éø‡±‡ºÛ±... */
- $"93B3 4206 45ED 7238 3F80 1441 50CA CCBA" /* “³B.Eír8?€.APÊ̺ */
- $"EF59 3BC5 4236 2ABF 9150 7335 49C5 0216" /* ïY;ÅB6*¿‘Ps5IÅ.. */
- $"F97B D5A5 1EF5 A69D 8B34 C25B 73E1 DA52" /* ù{Õ¥.õ¦‹4Â[sáÚR */
- $"79E5 9EB1 9CB1 0952 B3F5 E221 D426 4759" /* yåž±œ±ÆR³õâ!Ô&GY */
- $"D5CF 2D18 CC2A 270A 859D F10C 8108 52FF" /* ÕÏ-.Ì*'Â…ñ..Rÿ */
- $"2A7D D39E EFFD 568C 2DB3 7BD5 62D0 2403" /* *}ÓžïýVŒ-³{ÕbÐ$. */
- $"69D1 A4B6 2D24 E485 973D F6A5 E6DC 1DB5" /* iѤ¶-$ä…—=ö¥æÜ.µ */
- $"BF0B E185 5592 E3A0 6046 E050 5151 9546" /* ¿.á…U’ã `FàPQQ•F */
- $"17F7 0CF6 222F 17E0 40E5 3EF5 74EE BAB6" /* .÷.ö"/.à@å>õt */
- $"55BD 76C1 DD80 39C8 BAE0 37B8 398A B370" /* U½vÁÝ€9Ⱥà7¸9Š³p */
- $"D400 0C29 5DC9 94FF 069B 36E2 CD79 195F" /* Ô..)]É”ÿ.›6âÍy._ */
- $"5B9B 1237 1F18 C560 C901 F9A4 184B 7570" /* [›.7..Å`É.ù¤.Kup */
- $"433E 75BE 0297 C641 7D9B 7092 8D64 96F5" /* C>u¾.—ÆA}›p’d–õ */
- $"D70C 9B66 71D3 09B1 F635 0FC3 0B49 7D6E" /* ×.›fqÓƱö5.Ã.I}n */
- $"660C 8E1D 0257 672B 97EE C2A5 7B84 729E" /* f.Ž..Wg+—îÂ¥{„rž */
- $"6516 585E 354F 2E22 88A7 A515 B945 3745" /* e.X^5O."ˆ§¥.¹E7E */
- $"F6A5 5CB2 E212 10AD AB6F 07F5 FDA3 09EB" /* ö¥\²â..­«o.õý£Æë */
- $"A053 313B 9A8E 757D E132 D483 DC78 0882" /*  S1;šŽu}á2ÔƒÜx.‚ */
- $"A63C 95E0 036C 4626 F66B 5F6C 39A1 9401" /* ¦<•à.lF&ök_l9¡”. */
- $"7276 4DCE 4487 7D8C 12A3 B713 9139 AC0A" /* rvMÎD‡}Œ.£·.‘9¬Â */
- $"18AD 4DFD 2A3D 69E7 E76E 593C 8DAB FD56" /* .­Mý*=iççnY<«ýV */
- $"F959 BA6B FBA3 2853 D610 4DB0 7A30 3A09" /* ùYºkû£(SÖ.M°z0:Æ */
- $"916B DFF7 B3B4 F8D3 9619 0FD9 8FBC FC6B" /* ‘kß÷³´øÓ–..Ù¼ük */
- $"D73D ABD2 4C41 6AD0 6584 AF19 3074 AF6E" /* ×=«ÒLAjÐe„¯.0t¯n */
- $"369C BEB1 76D5 D311 6172 F157 D522 DDED" /* 6œ¾±vÕÓ.arñWÕ"Ýí */
- $"D4ED 0230 0BB5 E881 0E6B 9C4F 111F 4F6E" /* Ôí.0.µè.kœO..On */
- $"7CAD 4745 7BBF DA70 A9C4 051E FDEA 206C" /* |­GE{¿Úp©Ä..ýê l */
- $"9983 0E2D 4A4A A4DE 82E9 DAAF 5748 37AE" /* ™ƒ.-JJ¤Þ‚éÚ¯WH7® */
- $"4046 DCCB 0D1A 80DA 1804 20E2 F7CF AD69" /* @FÜË..€Ú.. â÷Ï­i */
- $"F9D8 5106 D02D 16E9 4437 9560 B618 1126" /* ùØQ.Ð-.éD7•`¶..& */
- $"95A2 4B23 89C4 78EE 898E D80C 8E49 5201" /* •¢K#‰ÄxØ.ŽIR. */
- $"2095 ABAF 9CA5 0F8E CB22 00D4 4289 59B3" /* •«¯œ¥.ŽË".ÔB‰Y³ */
- $"1835 1395 8AE5 3A88 7185 E7DD 57F3 4CE4" /* .5.•Šå:ˆq…çÝWóLä */
- $"1465 C878 6B72 7146 2AF1 F053 5B31 7697" /* .eÈxkrqF*ñðS[1v— */
- $"7300 A777 3919 099E BD1C 79C3 24C4 A355" /* s.§w9.Æž½.yÃ$Ä£U */
- $"0C88 C727 1831 D498 E513 47A5 F25F DDBE" /* .ˆÇ'.1Ô˜å.G¥ò_ݾ */
- $"46E7 40B5 EBCC 080F 6915 3FDF EDB9 A9B1" /* Fç@µëÌ..i.?ßí¹©± */
- $"39ED D794 60E1 A5A2 0EEC 7A09 46BF 201E" /* 9í×”`ᥢ.ìzÆF¿ . */
- $"311F EEEE 88EF C6C1 C10D E238 50C9 7F01" /* 1.îîˆïÆÁÁ.â8PÉ.. */
- $"DFF1 17BA D8F4 0017 47E7 75F2 4D82 679E" /* ßñ.ºØô..GçuòM‚gž */
- $"6867 60A4 6222 77B9 319B 186D FCB3 168A" /* hg`¤b"w¹1›.mü³.Š */
- $"EAF3 C227 1082 D7ED 2C70 E619 8676 0186" /* êóÂ'.‚×í,pæ.†v.† */
- $"8C23 5DE5 D4A0 61CB CDE4 AED5 E008 6F3C" /* Œ#]åÔ aËÍä®Õà.o< */
- $"D894 AC14 6FEC 5D4C C2FF 3A6C 512F E475" /* Ø”¬.oì]LÂÿ:lQ/äu */
- $"FCB8 DFA4 EB46 2DF4 E133 5858 364B 54E1" /* ü¸ß¤ëF-ôá3XX6KTá */
- $"A6E1 5D0C 157E D987 DF95 B1FB 3723 4F2F" /* ¦á]..~هߕ±û7#O/ */
- $"C9BF C6D4 D979 412E D0EB B285 8DFF 7CAC" /* É¿ÆÔÙyA.Ðë²…ÿ|¬ */
- $"F1BF 1825 8B89 9992 3848 C666 4184 4906" /* ñ¿.%‹‰™’8HÆfA„I. */
- $"0D61 6B58 9355 A5D9 C940 B6F2 6918 82E1" /* .akX“U¥ÙÉ@¶òi.‚á */
- $"FF7D 4F5F FE94 5208 650B B780 0D2B DD4F" /* ÿ}O_þ”R.e.·€.+ÝO */
- $"5874 3627 2353 6328 06B9 908C 6C95 D898" /* Xt6'#Sc(.¹Œl•Ø˜ */
- $"8C24 1D0F 641B 7763 CFBE E88A BB05 8639" /* Œ$..d.wcϾ芻.†9 */
- $"D91C 4A38 3A3F 75C6 61BD BFED CA10 2A73" /* Ù.J8:?uÆa½¿íÊ.*s */
- $"E3C5 E85C BF5B 0346 2105 4286 300D D812" /* ãÅè\¿[.F!.B†0.Ø. */
- $"8BE4 DAE4 292B A765 338E 7E42 50F1 8046" /* ‹äÚä)+§e3Ž~BPñ€F */
- $"3FDC 1A85 4616 61E5 7321 18D9 5AB9 8903" /* ?Ü.…F.aås!.ÙZ¹‰. */
- $"90BD 6F89 E7D0 35D1 0AA3 BBAE 3CF8 A7B7" /* ½o‰çÐ5Ñ£»®<ø§· */
- $"73C8 8B94 B409 16EC 60A6 E819 BCA7 BA66" /* sÈ‹”´Æ.ì`¦è.¼§ºf */
- $"2245 524C 718C 635D E4F7 ACA0 02C3 E0A7" /* "ERLqŒc]ä÷¬ .Ãৠ*/
- $"B542 0FF5 7029 FF4D 1D88 E3B3 D657 802B" /* µB.õp)ÿM.ˆã³ÖW€+ */
- $"8068 9BD4 B17F 9A6B CC1C 4B53 246F 81E5" /* €h›Ô±.škÌ.KS$oå */
- $"9168 48EC 4B44 3FFF 7B8B 5777 5677 134E" /* ‘hHìKD?ÿ{‹WwVw.N */
- $"1B8E 8C91 429F CE85 86EF 62B4 71AF EAE7" /* .ŽŒ‘BŸÎ…†ïb´q¯êç */
- $"E333 7BD3 2825 7230 C950 0000 1B8D 8BA6" /* ã3{Ó(%r0ÉP...‹¦ */
- $"04C1 56DC 30F0 619E DD6C D196 C91E 1ED4" /* .ÁVÜ0ðažÝlÑ–É..Ô */
- $"1285 94A8 F775 05A9 3440 78FF 7E52 8833" /* .…”¨÷u.©4@xÿ~Rˆ3 */
- $"E8A1 A4E4 4580 38DD ADE1 3BD5 AD19 74E6" /* 衤äE€8Ý­á;Õ­.tæ */
- $"EEA1 B4B1 0B0B 9BE9 08EC DB78 E6AA 37E5" /* î¡´±..›é.ìÛxæª7å */
- $"AD06 72A6 51FC 0004 4737 BF1A 89FF 7E11" /* ­.r¦Qü..G7¿.‰ÿ~. */
- $"0A68 EAD7 BDA5 4D5B 2C8D 0C7A 952E 2190" /* Âhê×½¥M[,.z•.! */
- $"8451 1B38 CEFD 2835 5ADD BDA2 01C2 A3D6" /* „Q.8Îý(5Zݽ¢.壅 */
- $"6046 4BD8 41DF D8B6 D9B1 1F96 5FF8 CC56" /* `FKØAßضٱ.–_øÌV */
- $"A63B 6E14 5035 26D6 946D 1F59 4D17 5507" /* ¦;n.P5&Ö”m.YM.U. */
- $"85F7 2DAF A737 4E30 9097 2E2E DAF8 37D1" /* …÷-¯§7N0—..Úø7Ñ */
- $"D987 4E59 ABFD CDF3 AAC3 30D1 8616 FAB3" /* Ù‡NY«ýÍóªÃ0ц.ú³ */
- $"2914 92AA 6913 C36F 66DA 4B0B 18FE DD55" /* ).’ªi.ÃofÚK..þÝU */
- $"1D2A 3F00 D80C 2423 D923 95C6 E11D 0069" /* .*?.Ø.$#Ù#•Æá..i */
- $"B5C9 0803 0907 B950 13DF 48EC F794 3D36" /* µÉ..Æ.¹P.ßHì÷”=6 */
- $"5249 2492 4924 9249 2489 9EF6 DC36 9A6B" /* RI$’I$’I$‰žöÜ6šk */
- $"1751 415E A37F 47EC A4EA 67AC A222 733C" /* .QA^£.Gì¤êg¬¢"s< */
- $"467D 1FFE C727 E6AA 6E99 C584 A87E DFFF" /* F}.þÇ'æªn™Å„¨~ßÿ */
- $"7FC3 7592 8204 71A2 6088 C38B 6E65 868E" /* .Ãu’‚.q¢`ˆÃ‹ne†Ž */
- $"5A3F FF7F F919 4069 CF10 A302 5125 525C" /* Z?ÿ.ù.@iÏ.£.Q%R\ */
- $"A443 88AF 4104 7807 1410 84BA E955 76E8" /* ¤Cˆ¯A.x...„ºéUvè */
- $"5F35 B612 A668 5694 9249 2492 4924 9249" /* _5¶.¦hV”’I$’I$’I */
- $"2492 4924 4C25 1941 A4EB 1996 7A28 19C1" /* $’I$L%.A¤ë.–z(.Á */
- $"A1B0 01D7 ACB2 3F83 42DC D154 27C9 F11F" /* ¡°.׬²?ƒBÜÑT'Éñ. */
- $"FC46 90B1 89C4 F78A 4C6F 5C2A 833D 8425" /* üF±‰Ä÷ŠLo\*ƒ=„% */
- $"D837 CA14 E4C7 7F8A 9833 99B7 E589 1376" /* Ø7Ê.äÇ.Š˜3™·å‰.v */
- $"C867 FF1D 200A 4C9B 624E 68E3 11AE C8AF" /* Ègÿ. ÂL›bNhã.®È¯ */
- $"1723 C741 CEAC 16CE C548 72FF 15CD 3E67" /* .#ÇAά.ÎÅHrÿ.Í>g */
- $"AF2C 323F 0FD0 6752 4973 55BD CC10 05B4" /* ¯,2?.ÐgRIsU½Ì..´ */
- $"AB3F 9302 00C3 EE70 1BA4 B650 FAB2 5821" /* «?“..Ãîp.¤¶Pú²X! */
- $"3856 3872 1B02 7D70 F1F9 0B28 A9DC CAE7" /* 8V8r..}pñù.(©ÜÊç */
- $"D9E7 6252 A768 A7DE 0FB1 FCB1 F54B 98C4" /* ÙçbR§h§Þ.±ü±õK˜Ä */
- $"7B6E 5E24 BC53 F945 741F 66A0 A51E EE5A" /* {n^$¼SùEt.f ¥.îZ */
- $"2A0D B951 4EEE A88B 4F2F C326 F326 1D12" /* *.¹QNO/Ã&ó&.. */
- $"524A 9E48 CC53 44EF C54F 1737 8505 46CF" /* RJžHÌSDïÅO.7….FÏ */
- $"351E 4354 05C7 C832 2A7D 8899 D009 E617" /* 5.CT.ÇÈ2*}ˆ™ÐÆæ. */
- $"0334 305D 9497 D845 E6D3 2CD2 178F 1316" /* .40]”—ØEæÓ,Ò... */
- $"65AD 239E 2ED5 ECCB 402A E728 09B5 E847" /* e­#ž.ÕìË@*ç(ƵèG */
- $"65BD 3F31 CAC5 F9D8 6606 B8AF 4F84 89FE" /* e½?1ÊÅùØf.¸¯O„‰þ */
- $"9004 4730 30BC E58F 5FB3 38CF 36B9 38FC" /* .G00¼å_³8Ï6¹8ü */
- $"FB9D 07EA D13F 9DB9 7185 0E88 0E3B 06E5" /* û.êÑ?¹q….ˆ.;.å */
- $"D476 CFCA 1587 3067 9257 B5DF 1E83 E7FF" /* ÔvÏÊ.‡0g’Wµß.ƒçÿ */
- $"7FFF 7FFF 0E68 E181 AC15 B980 2AFB 1D80" /* .ÿ.ÿ.há¬.¹€*û.€ */
- $"C5BB A88D E36A 4DC5 94CF 6DB2 0694 F977" /* Å»¨ãjMÅ”Ïm².”ùw */
- $"D708 02D1 F380 6773 016A CA84 3B1C 6A33" /* ×..Ñó€gs.jÊ„;.j3 */
- $"5AAC BA2D FEC5 7542 51FC 68D0 CDDD EA44" /* Z¬º-þÅuBQühÐÍÝêD */
- $"788E 2F96 D80C F159 FF45 3316 1494 A7F5" /* xŽ/–Ø.ñYÿE3..”§õ */
- $"98B4 FC39 0062 D59B 52A6 32CB F97C ABD6" /* ˜´ü9.bÕ›R¦2Ëù|«Ö */
- $"42AE AE46 6AA7 D986 0A4E DCDD 717E 8B7C" /* B®®Fj§Ù†ÂNÜÝq~‹| */
- $"8FB8 B396 65A6 83FF 6A4A A5C1 597F 70AF" /* ¸³–e¦ƒÿjJ¥ÁY.p¯ */
- $"DC96 E2EC 0C1D 7A00 3428 2C60 DE32 8DB8" /* Ü–âì..z.4(,`Þ2¸ */
- $"1604 C249 5E82 1F5B 6C23 E562 B2D4 754E" /* ..ÂI^‚.[l#åb²ÔuN */
- $"7F73 442A 25D3 C42A 6A6D 5D09 0E8C 2E67" /* .sD*%ÓÄ*jm]Æ.Œ.g */
- $"95EC 08FE B505 8B5A A4A8 0000 0000 0000" /* •ì.þµ.‹Z¤¨...... */
- $"0000 0000 6121 26B3 27C3 AEC0 FF52 2FEE" /* ....a!&³'îÀÿR/î */
- $"D4F3 92BB 06E2 ABE4 35DC A278 9084 B2F0" /* Ôó’».â«ä5Ü¢x„²ð */
- $"EE1A ADB2 F770 3D4E 120A FD01 B042 CD00" /* î.­²÷p=N.Âý.°BÍ. */
- $"B9C2 B661 40B0 E5FC DC59 59F0 61C5 53A7" /* ¹Â¶a@°åüÜYYðaÅS§ */
- $"7AC1 7EDC 77B7 1C84 0F9A E321 389C E693" /* zÁ~Üw·.„.šã!8œæ“ */
- $"AC98 5160 DDD0 C9A9 BE17 ED52 A10A 300C" /* ¬˜Q`ÝÐÉ©¾.íR¡Â0. */
- $"88ED BB5A 80DA C23B 1196 0C7C 6BA8 D4EA" /* ˆí»Z€ÚÂ;.–.|k¨Ôê */
- $"4FAB 08A9 EBE3 1CC9 6782 F6A9 85A4 1829" /* O«.©ëã.Ég‚ö©…¤.) */
- $"48BB D188 41E8 65BA 28BB 8AC1 8368 DC2F" /* H»ÑˆAèeº(»ŠÁƒhÜ/ */
- $"B2DE 61FE 95C0 BD88 C027 9CD9 3819 8A81" /* ²Þaþ•À½ˆÀ'œÙ8.Š */
- $"20FF 616C DEAE C6EA 15A3 D12F 764A B4E2" /* ÿalÞ®Æê.£Ñ/vJ´â */
- $"ECA3 AF32 36FF 29B0 E3CD 5046 527E 39B7" /* 죯26ÿ)°ãÍPFR~9· */
- $"921A ABF8 F0CB 7040 5FCD A182 4C57 986D" /* ’.«øðËp@_Í¡‚LW˜m */
- $"1115 DD94 687C 3663 7CFB 6C40 642D C8CA" /* ..Ý”h|6c|ûl@d-ÈÊ */
- $"1117 B5A9 8025 123D 9406 58F9 96B5 321E" /* ..µ©€%.=”.Xù–µ2. */
- $"7646 4BFD 48DE 0B9B DBEF B79F B6C7 031E" /* vFKýHÞ.›Ûï·Ÿ¶Ç.. */
- $"1D3B 1D18 B35D 2813 5601 3924 6AE1 FC21" /* .;..³](.V.9$jáü! */
- $"60B9 0B9F 6B4B AFB9 15D8 C57A 5345 7461" /* `¹.ŸkK¯¹.ØÅzSEta */
- $"0EF9 4B6B 88D1 7833 02DF 4FB8 DBEC 836A" /* .ùKkˆÑx3.ßO¸Ûìƒj */
- $"BEA7 3972 93C0 F973 37B5 C84F 1655 031C" /* ¾§9r“Àùs7µÈO.U.. */
- $"674D 741E 308E E3BA 6684 5BB0 4506 AB40" /* gMt.0Žãºf„[°E.«@ */
- $"14DE BFF2 9B38 4026 C5C2 3A44 FDFF 25CB" /* .Þ¿ò›8@&ÅÂ:Dýÿ%Ë */
- $"072E 1D99 62E3 22B8 DE8D 9CF1 79FA 1D38" /* ...™bã"¸Þœñyú.8 */
- $"8900 17CB A72B 8124 7EAF CF2F FC8D 34D6" /* ‰..˧+$~¯Ï/ü4Ö */
- $"E0AC 58ED 8BC1 0DAA 7964 FB91 BF08 EFA6" /* à¬Xí‹Á.ªydû‘¿.ï¦ */
- $"42FF 7FFF 7FE3 AF13 7C4B 1CF4 D643 3CD3" /* Bÿ.ÿ.ã¯.|K.ôÖC<Ó */
- $"5F1A 08BB 7C56 5CFB 6D27 04DE C66A 9AF1" /* _..»|V\ûm'.ÞÆjšñ */
- $"2053 D4B2 EE60 44FF 2A89 1FFC DFCC 57C1" /* SÔ²î`Dÿ*‰.üßÌWÁ */
- $"3800 1290 7854 7902 FF7A 9A36 D71E F8D1" /* 8..xTy.ÿzš6×.øÑ */
- $"D439 471B D02F 4A39 E5BC D25F FDF0 8B54" /* Ô9G.Ð/J9å¼Ò_ýð‹T */
- $"AE0A 3677 2625 B286 7DEC 8FF7 2457 2B25" /* ®Â6w&%²†}ì÷$W+% */
- $"C066 2A4E A605 EE16 7244 CCFD D3D3 FDA1" /* Àf*N¦.î.rDÌýÓÓý¡ */
- $"F3B8 76C3 1C5F 491C 0165 8735 D71D 19AD" /* ó¸vÃ._I..e‡5×..­ */
- $"9BB1 A40D E5BA 9D1C E34B B71C 9CF0 EC7A" /* ›±¤.åº.ãK·.œðìz */
- $"5E87 C4F0 A326 0913 9E2C 6517 50A3 E72B" /* ^‡Äð£&Æ.ž,e.P£ç+ */
- $"87FE D348 2E5D 0A00 0000 0000 0000 0000" /* ‡þÓH.]Â......... */
- $"0002 2C86 A73D 4030 2FE4 D32C 2B56 C74C" /* ..,†§=@0/äÓ,+VÇL */
- $"0869 A5C9 151A 69B9 9390 DA50 4411 8FFF" /* .i¥É..i¹“ÚPD.ÿ */
- $"4938 4E36 F9DD 09FB E4A0 C339 2431 ED8B" /* I8N6ùÝÆûä Ã9$1í‹ */
- $"793D 6354 12C0 97F9 C379 ADA9 7DEE E5EF" /* y=cT.À—ùÃy­©}îåï */
- $"2366 FF4F E2A2 F01A C90F 02E3 51CD B477" /* #fÿOâ¢ð.É..ãQÍ´w */
- $"2230 690A B47C E28B 463C 2E88 7579 7943" /* "0i´|â‹F<.ˆuyyC */
- $"5055 6D0A EEC5 F3BF 2404 37D8 EFE1 71AC" /* PUmÂîÅó¿$.7Øïáq¬ */
- $"6AFE A3E4 A7EB 28BF BFFE 4373 E5FF 7E4A" /* jþ£ä§ë(¿¿þCsåÿ~J */
- $"2D5D 1ED3 6D78 1657 9914 A061 7958 972C" /* -].Ómx.W™. ayX—, */
- $"56FB D5B0 1FFD A18B 7A29 0C81 295B DF7C" /* VûÕ°.ý¡‹z).)[ß| */
- $"83E3 CD36 0E66 7E2B D8FA 3096 AA44 7F9B" /* ƒãÍ6.f~+Øú0–ªD.› */
- $"F0B9 EA48 8CC7 0FFF 7E1C F394 CC5B 6A25" /* ð¹êHŒÇ.ÿ~.ó”Ì[j% */
- $"FD4C CECC 630B 38B7 D621 F081 73EE 9D40" /* ýLÎÌc.8·Ö!ðsî@ */
- $"7FAD FADD 8111 6492 599E DD2C 3600 FF6C" /* .­úÝ.d’YžÝ,6.ÿl */
- $"5A8D B0B8 2AE7 668D C5A0 826B FA0D C5B1" /* Z°¸*çfÅ ‚kú.ű */
- $"6873 D749 B533 9627 C2F6 4922 63F7 8944" /* hs×Iµ3–'ÂöI"c÷‰D */
- $"15C5 A1F9 8539 A21A 1CEB 1C2D 7D1B 0516" /* .Å¡ù…9¢..ë.-}... */
- $"FD6C 5D4F 92A3 14D9 126F C5FC 4116 B499" /* ýl]O’£.Ù.oÅüA.´™ */
- $"D878 D889 9123 D3C8 4637 36E3 8644 6F0B" /* Øx؉‘#ÓÈF76ã†Do. */
- $"D2C6 A599 B793 1367 B548 23BD 8836 11E5" /* ÒÆ¥™·“.gµH#½ˆ6.å */
- $"C323 7AD5 0534 3D05 A4E6 70B3 0376 2B0C" /* Ã#zÕ.4=.¤æp³.v+. */
- $"A964 173B F0BC 2A52 7FE4 2A53 85C2 22B2" /* ©d.;ð¼*R.ä*S…Â"² */
- $"B83F 7185 FB4C 3769 5B3E 4A24 E7E1 D0FD" /* ¸?q…ûL7i[>J$çáÐý */
- $"9B17 8737 FE8B E4C7 9FC1 0E30 D904 D0C5" /* ›.‡7þ‹äÇŸÁ.0Ù.ÐÅ */
- $"D2F5 05E4 3CD6 5FA7 B9AF FB98 755E 0BAF" /* Òõ.ä<Ö_§¹¯û˜u^.¯ */
- $"E4EE 408D A8BE 5E58 07A6 059D 1B33 37F3" /* äî@¨¾^X.¦..37ó */
- $"8D14 871A 7FC6 43ED 6A6F 8F41 9681 095E" /* .‡..ÆCíjoA–Æ^ */
- $"EE46 5BA4 1E15 F5F2 3063 E524 A62A 7C7F" /* îF[¤..õò0cå$¦*|. */
- $"0E38 5D00 A378 8F6D 3861 2088 EDD7 AC24" /* .8].£xm8a ˆí׬$ */
- $"D3B6 B052 DE10 357D B65A 1414 4596 8E3D" /* Ó¶°RÞ.5}¶Z..E–Ž= */
- $"97E3 D838 9ACC 3C84 AF82 EA8D 8BD3 0180" /* —ãØ8šÌ<„¯‚ê‹Ó.€ */
- $"1582 0654 BB61 1047 ACA1 29D3 7CFA 00C8" /* .‚.T»a.G¬¡)Ó|ú.È */
- $"BABC 146B 250C 8D19 8A4E A8B3 50D6 B986" /* º¼.k%..ŠN¨³PÖ¹† */
- $"2AD6 CEFA 02D6 AE11 FF7C B0A2 E6E0 30E9" /* *ÖÎú.Ö®.ÿ|°¢æà0é */
- $"D904 4C03 3BC1 8B68 5892 30B8 7D69 C2D6" /* Ù.L.;Á‹hX’0¸}iÂÖ */
- $"A9F8 56A2 7417 1E31 186F 09A1 4C11 6DCA" /* ©øV¢t..1.oÆ¡L.mÊ */
- $"A62E 5FCC F59A CCE8 6A29 B0DF E2BC E8BF" /* ¦._ÌõšÌèj)°ßâ¼è¿ */
- $"92DF 70C1 8B09 21DF 1440 1684 4413 2A60" /* ’ßpÁ‹Æ!ß.@.„D.*` */
- $"E033 6D92 8573 E63C 2746 6F40 D8F0 D0C9" /* à3m’…sæ<'Fo@ØðÐÉ */
- $"10AF 85A2 CFBF 373B B250 85E4 C1D3 85D2" /* .¯…¢Ï¿7;²P…äÁÓ…Ò */
- $"E167 1222 DF4A 67D9 B3D6 55B4 B047 8675" /* ág."ßJgÙ³ÖU´°G†u */
- $"C803 6AE5 E5AE AF92 C4B7 591A A040 98AC" /* È.jå宯’Ä·Y. @˜¬ */
- $"4412 45F8 BBC8 6482 F7BD 81B2 98FE 9D0B" /* D.Eø»Èd‚÷½²˜þ. */
- $"DAB1 2959 952C 9115 3504 9A24 BBA4 A04C" /* Ú±)Y•,‘.5.š$»¤ L */
- $"4125 5810 54F5 C268 63C2 1DB9 11CF 85BB" /* A%X.TõÂhcÂ.¹.Ï…» */
- $"D941 F5A1 0239 DED3 856D BBE5 7CF3 49C3" /* ÙAõ¡.9ÞÓ…m»å|óIà */
- $"C9CF 1BD1 A953 F58A F9AF E704 E70E 43B7" /* ÉÏ.Ñ©SõŠù¯ç.ç.C· */
- $"2B51 BE14 4FF3 262C 914B 90AF F2A9 E060" /* +Q¾.Oó&,‘K¯ò©à` */
- $"6A24 6553 B776 C48D 19AD ECD3 2DD3 8ECF" /* j$eS·vÄ.­ìÓ-ÓŽÏ */
- $"9EC7 8A0D 97F4 3C69 6E56 0881 1136 C147" /* žÇŠ.—ô<inV..6ÁG */
- $"E7D3 6FE5 A0C6 D7DC BCB0 76AC C4F8 DD65" /* çÓoå Æ×ܼ°v¬ÄøÝe */
- $"A5F9 02BF 2BFD 9A2C 354D 24C2 E088 6B63" /* ¥ù.¿+ýš,5M$Âàˆkc */
- $"E514 C014 E8F4 F5C2 B529 74FB EC02 032B" /* å.À.èôõµ)tûì..+ */
- $"A54B 696E B602 7D58 4542 824D BD8C 40FA" /* ¥Kin¶.}XEB‚M½Œ@ú */
- $"F675 5CD4 71C9 058E 7062 0E1B 10CC 72A9" /* öu\ÔqÉ.Žpb...Ìr© */
- $"95B8 C5FD 7EAF 995C 62ED DDE4 6579 3181" /* •¸Åý~¯™\bíÝäey1 */
- $"8BA1 A02B 1559 F5BC E9C9 914D 8CEB D7D8" /* ‹¡ +.Yõ¼éÉ‘MŒë×Ø */
- $"7D81 20C0 A609 18D2 B679 7C08 FB00 E4C6" /* } À¦Æ.Ò¶y|.û.äÆ */
- $"2797 518E 32CE 67CE 3C8E 6796 A832 F712" /* '—QŽ2ÎgÎ<Žg–¨2÷. */
- $"0037 059C 96CD 85A0 98E6 5D20 05F2 EC61" /* .7.œ–Í… ˜æ] .òìa */
- $"335D AFFF 14BC 3EF9 0779 7A53 BAA4 F47A" /* 3]¯ÿ.¼>ù.yzSº¤ôz */
- $"6926 DAD2 72F9 5D4B 1014 8BD5 A4FA 68EA" /* i&ÚÒrù]K..‹Õ¤úhê */
- $"D9F9 F684 BFD5 F2ED FB9E 4C18 91C3 FF17" /* Ùùö„¿ÕòíûžL.‘Ãÿ. */
- $"2D17 D99A DE29 FE6E 63A4 C901 8642 9357" /* -.ÙšÞ)þnc¤É.†B“W */
- $"3120 4386 1938 E7D2 572D 0C59 E3C9 7FED" /* 1 C†.8çÒW-.YãÉ.í */
- $"30FA E54A CEF8 A94C F92D AF19 76EA 3372" /* 0úåJÎø©Lù-¯.vê3r */
- $"B4E1 E7C5 8239 A4AC A247 4838 55E8 EB9B" /* ´áçÅ‚9¤¬¢GH8Uèë› */
- $"DE7D 94E9 DBD7 07FB D488 1672 E61D 9E4C" /* Þ}”éÛ×.ûÔˆ.ræ.žL */
- $"6DF2 97D5 4936 F89A 5CBC D37A 8C2C F7ED" /* mò—ÕI6øš\¼ÓzŒ,÷í */
- $"9755 19F2 0350 AB2E D851 F0B7 78B5 9770" /* —U.ò.P«.ØQð·xµ—p */
- $"4DF3 4212 9C9C CA3B 403A BA7B D497 9410" /* MóB.œœÊ;@:º{Ô—”. */
- $"04C6 288B 5058 5DC9 EB79 AB85 622C 9A55" /* .Æ(‹PX]Éëy«…b,šU */
- $"2DA7 C113 9315 7CAE D84E 6B50 4062 AE94" /* -§Á.“.|®ØNkP@b®” */
- $"8F5E 7969 4BA5 56B2 E881 8C02 ED3B 5259" /* ^yiK¥V²èŒ.í;RY */
- $"24CE C98A 4348 12B1 314F E3E3 B6A3 4E61" /* $ÎÉŠCH.±1Oã㶣Na */
- $"A426 6350 E380 B0B5 DEFF 64CF 72D6 D4B9" /* ¤&cP〰µÞÿdÏrÖÔ¹ */
- $"907C 9BE0 7E4D 39F9 2BB7 C3DE D7C3 DCD8" /* |›à~M9ù+·ÃÞ×ÃÜØ */
- $"1F93 775F 0F44 DF0F A717 C3E9 D603 F269" /* .“w_.Dß.§.ÃéÖ.òi */
- $"FBE1 D36F 87B3 6F87 B280 E8AB DECC AF0D" /* ûáÓo‡³o‡²€è«Þ̯. */
- $"6C8A C695 8734 87EB A75F 5130 05EC 9BA8" /* lŠÆ•‡4‡ë§_Q0.웨 */
- $"78DB 85A2 680C 75A0 EDD1 4AA2 7E1B BAFF" /* xÛ…¢h.u íÑJ¢~.ºÿ */
- $"5AFC FD6C 3E36 A6D9 923A 2DCE 24BC 35EF" /* Züýl>6¦Ù’:-Î$¼5ï */
- $"27F4 8813 7CC4 0141 3CD9 9568 BFE6 BBB3" /* 'ôˆ.|Ä.A<Ù•h¿æ»³ */
- $"219B 0442 5227 3796 635D 0DE7 499A A701" /* !›.BR'7–c].çIš§. */
- $"7F74 FB13 F9DF E737 08AB 0A91 3D9E B77D" /* .tû.ùßç7.«Â‘=ž·} */
- $"E616 57BB 8BAF 7A0D 1B28 42E6 D653 6BD3" /* æ.W»‹¯z..(BæÖSkÓ */
- $"D7A8 9A2B 0905 6198 8809 E5D0 D0A4 F589" /* רš+Æ.a˜ˆÆåÐФõ‰ */
- $"3D04 8161 C4CB 7BC9 96E2 9DA4 1C59 C982" /* =.aÄË{É–â¤.YÉ‚ */
- $"4705 B1BE 1E05 E391 5E89 43FE 6C67 4342" /* G.±¾..ã‘^‰CþlgCB */
- $"636F 80C5 6A98 16E6 6B80 27C8 D0D9 B28C" /* co€Åj˜.æk€'ÈÐÙ²Œ */
- $"6FD4 E109 61AB 8FCB D4CB 19ED 2BE7 B510" /* oÔáÆa«ËÔË.í+çµ. */
- $"C0E8 5883 0642 92A1 6094 7E45 5D3F 819A" /* ÀèXƒ.B’¡`”~E]?š */
- $"4B6F AE8E ED0B 4B30 ABB1 2789 5C58 EEFD" /* Ko®Ží.K0«±'‰\Xîý */
- $"06C9 EF2B 2A12 1731 7581 4428 C72D 2501" /* .Éï+*..1uD(Ç-%. */
- $"2C14 0DA4 2C98 035F FEA8 51A2 0E61 4C50" /* ,..¤,˜._þ¨Q¢.aLP */
- $"4A65 60DE FA1C F36C 62D9 A3FA 93A6 4CAC" /* Je`Þú.ólbÙ£ú“¦L¬ */
- $"C1D0 079D 912F A133 724B 13CC AFF4 1382" /* ÁÐ.‘/¡3rK.̯ô.‚ */
- $"D61F 8AF2 A48B CCA6 5D66 4F61 E6BE 657B" /* Ö.Šò¤‹Ì¦]fOaæ¾e{ */
- $"7F5B 6F20 397A BBC2 3F23 86DF 2355 4A18" /* .[o 9z»Â?#†ß#UJ. */
- $"15DB CB3E 201F FF7C 4AC9 C764 B098 CA46" /* .ÛË> .ÿ|JÉÇd°˜ÊF */
- $"C2CF 44C6 42E7 D30A FD05 380F 6BD3 24C1" /* ÂÏDÆBçÓÂý.8.kÓ$Á */
- $"3998 C5C1 E7D5 0E2C 8D50 7FBB 7A11 6CB7" /* 9˜ÅÁçÕ.,P.»z.l· */
- $"B80F 5A84 44BE E746 C43C 6B5D F055 7A3B" /* ¸.Z„D¾çFÄ<k]ðUz; */
- $"77CB BFA9 2B73 06AF 9C8B AF37 F600 E568" /* wË¿©+s.¯œ‹¯7ö.åh */
- $"EE70 09D2 B0A7 C201 94D9 AC58 E9A2 9D53" /* îpÆÒ°§Â.”Ù¬Xé¢S */
- $"94C0 D1C9 E379 E453 E4C7 27C5 C3F8 1161" /* ”ÀÑÉãyäSäÇ'ÅÃø.a */
- $"D631 3F3C 0CFE 13A3 F6EB 3048 F049 CF11" /* Ö1?<.þ.£öë0HðIÏ. */
- $"5962 65AE 5D8E F911 A2E2 7787 6C78 F63C" /* Ybe®]Žù.¢âw‡lxö< */
- $"E24C ED5B F634 B2B9 9DDF 51B0 94B9 1ABF" /* âLí[ö4²¹ßQ°”¹.¿ */
- $"BE93 4236 35A6 613E 3D1B C8FD 0587 27C7" /* ¾“B65¦a>=.Èý.‡'Ç */
- $"F936 55E0 D0CE BF1A 50D8 51CE 6253 0293" /* ù6UàÐο.PØQÎbS.“ */
- $"1958 3FA2 BF6C 54A5 B158 4236 7F88 7DE4" /* .X?¢¿lT¥±XB6.ˆ}ä */
- $"C231 6D0B 62F1 2C6C 1A1D F8AA 0317 C52D" /* Â1m.bñ,l..øª..Å- */
- $"D9D5 0B61 312B A074 B2B8 1905 FCF9 A102" /* ÙÕ.a1+ t²¸..üù¡. */
- $"6188 616D 74E6 8232 245D 9C8A 4FD8 E2FD" /* aˆamtæ‚2$]œŠOØâý */
- $"0C6C 8F2E 5C82 5724 C542 3AE5 BA0A EE0B" /* .l.\‚W$ÅB:åºÂî. */
- $"2A14 BCDE 8005 4446 25B1 CF8A 6744 9F5C" /* *.¼Þ€.DF%±ÏŠgDŸ\ */
- $"9B09 6571 3003 9F52 A42A 7669 CCAA 7A75" /* ›Æeq0.ŸR¤*vi̪zu */
- $"F807 2530 7BA9 1474 F318 5A7B E64A 5DD7" /* ø.%0{©.tó.Z{æJ]× */
- $"A6F2 13B0 AFA5 7BF8 46DC CABF 4D80 CC26" /* ¦ò.°¯¥{øFÜÊ¿M€Ì& */
- $"5838 4016 3C05 4550 C62F 1504 5B79 0816" /* X8@.<.EPÆ/..[y.. */
- $"556C 8524 5DDA E914 92F1 3124 5C5B 3213" /* Ul…$]Úé.’ñ1$\[2. */
- $"7851 D9B8 EE79 46CF 3F06 1EAB 662A FD9E" /* xQÙ¸îyFÏ?..«f*ýž */
- $"E7D8 2E8C 938F 43FA B1B1 34B0 9207 34EC" /* çØ.Œ“Cú±±4°’.4ì */
- $"7A09 46BF 201E 311F EEEE 88EF C6C1 C10D" /* zÆF¿ .1.îîˆïÆÁÁ. */
- $"E238 50C9 7F01 DFF0 2170 EDD1 7471 8C14" /* â8PÉ..ßð!píÑtqŒ. */
- $"FB17 6678 A8B9 6611 9713 D8BB 8840 427C" /* û.fx¨¹f.—.Ø»ˆ@B| */
- $"8E5E 1608 D5E6 79B6 0BD7 3592 5D97 3864" /* Ž^..Õæy¶.×5’]—8d */
- $"71DF 6137 C0E6 2EB0 F71D 466C CFFF 50EF" /* qßa7Àæ.°÷.FlÏÿPï */
- $"FE99 2E4D 0DBB 537F 32F1 DECB D5D4 39DF" /* þ™.M.»S.2ñÞËÕÔ9ß */
- $"4FCC 2FC2 C399 8EB9 FC8B 2806 3FB7 F227" /* OÌ/ÂÙŽ¹ü‹(.?·ò' */
- $"BA12 A288 9858 9159 B6ED 0DBF 3DCC 8FA1" /* º.¢ˆ˜X‘Y¶í.¿=Ì¡ */
- $"9CF5 836D 499F B9E7 DB4E 497F D3A4 57BF" /* œõƒmIŸ¹çÛNI.Ó¤W¿ */
- $"9F0A EECE 8E29 127A 82FF 4222 75AC 32D4" /* ŸÂîÎŽ).z‚ÿB"u¬2Ô */
- $"6540 8040 4137 9EB4 EFFF 7FEC 9D37 60B4" /* e@€@A7ž´ïÿ.ì7`´ */
- $"184A 9567 71E4 F5FE 1C55 BB95 9FD8 BE6D" /* .J•gqäõþ.U»•ŸØ¾m */
- $"037F 052C 035B 91D7 903B 6EEC 1642 3D18" /* ...,.[‘×;nì.B=. */
- $"0B05 FEC5 4C0C 9ED3 BFA5 94AF CBB1 E725" /* ..þÅL.žÓ¿¥”¯Ë±ç% */
- $"DFC3 AF74 2485 D5A2 7F79 1275 C7DD ADE1" /* ßït$…Õ¢.y.uÇÝ­á */
- $"3BD5 AD19 74E6 EE9F 6846 7900 C09D 090B" /* ;Õ­.tæîŸhFy.ÀÆ. */
- $"C17C FB0F 2C9F 4DEB B9FE 7152 A47E B1CB" /* Á|û.,ŸMë¹þqR¤~±Ë */
- $"FB0E 7108 21C7 EFAB 8FA3 8AF0 2FDC 17A9" /* û.q.!Çï«£Šð/Ü.© */
- $"2565 5082 BEBF 4DDD 0699 3265 82AE D421" /* %eP‚¾¿MÝ.™2e‚®Ô! */
- $"3776 341F C56C ECDA B302 0306 AE5F 37FF" /* 7v4.ÅlìÚ³...®_7ÿ */
- $"7FB7 1192 8D68 5475 EE0B 4D80 6149 DEBB" /* .·.’hTuî.M€aIÞ» */
- $"F9A7 D7E7 A35D 9515 8000 4F04 C4D6 670C" /* ù§×ç£]•.€.O.ÄÖg. */
- $"54B7 93BB D264 43E0 E8D4 2D4D D3E2 AEB0" /* T·“»ÒdCàèÔ-MÓâ®° */
- $"FBAE F5BD A155 A8F2 07B4 AAA6 CE0A 84CC" /* û®õ½¡U¨ò.´ª¦ÎÂ„Ì */
- $"907F D5C4 9900 8FE2 0E0D F385 55A0 CDFF" /* .ÕÄ™.â..ó…U Íÿ */
- $"7FFE D776 193F A5C4 0334 DD15 7A6A 0890" /* .þ×v.?¥Ä.4Ý.zj. */
- $"DE98 5707 7799 9A5B D638 31B9 982B 5623" /* Þ˜W.w™š[Ö81¹˜+V# */
- $"3AFA A84A 20E7 417C F56E 7776 0C54 0765" /* :ú¨J çA|õnwv.T.e */
- $"91DE A19E 3DD2 4D8B F9F9 0D61 6343 0746" /* ‘Þ¡ž=ÒM‹ùù.acC.F */
- $"7D72 600B 4E15 FC8F 60FA A273 4348 A86E" /* }r`.N.ü`ú¢sCH¨n */
- $"E11A CD6B 3FFF 7ED1 E486 AAAA A380 045A" /* á.Ík?ÿ~Ñ䆪ª£€.Z */
- $"70E5 3753 4FFF 7FC6 ADBE 8E71 66FF 8165" /* på7SOÿ.Æ­¾Žqfÿe */
- $"D782 24E8 7399 0C15 03BF 29B5 5685 FDA1" /* ׂ$ès™...¿)µV…ý¡ */
- $"5BAD 5751 6D53 799A A7C6 572E 6A37 B46A" /* [­WQmSyš§ÆW.j7´j */
- $"B9BF 05BF 3131 F7DB E3B8 8F11 EE2F 13D6" /* ¹¿.¿11÷Ûã¸.î/.Ö */
- $"7DE9 D552 0B25 FEAF AEFE F0A7 FBE9 487F" /* }éÕR.%þ¯®þð§ûéH. */
- $"9085 0FFA 23FE A9DB 0494 B0E1 FEFD 1D50" /* ….ú#þ©Û.”°áþý.P */
- $"15B4 6548 AAA0 0182 C5FF 7D24 05C8 B15E" /* .´eHª .‚Åÿ}$.ȱ^ */
- $"E45F A508 3C68 CA73 3A57 A35E 462D 9213" /* ä_¥.<hÊs:W£^F-’. */
- $"9D19 A4FE F266 C323 64FF 7B71 19F7 0BC3" /* .¤þòfÃ#dÿ{q.÷.Ã */
- $"062C 20C4 9745 F075 6FFF 31F0 A3AD 4C84" /* ., Ä—Eðuoÿ1ð£­L„ */
- $"00F3 104C 0064 3899 0DB9 8128 CB5F FF46" /* .ó.L.d8™.¹(Ë_ÿF */
- $"7184 41CB 7E58 4C0B ADD5 CBB2 1A61 E3D6" /* q„AË~XL.­Õ˲.aãÖ */
- $"B45F 489E 7FE9 D915 2B77 0776 98BD B3A6" /* ´_Hž.éÙ.+w.v˜½³¦ */
- $"230E B817 1D5A D937 3251 2449 6B0A 5A13" /* #.¸..ZÙ72Q$IkÂZ. */
- $"C4E0 BB45 CB72 9758 9E56 158D B1E6 9590" /* Äà»EËr—XžV.±æ• */
- $"4FC4 0611 EDBC 426F 6D2B D932 D595 A74E" /* OÄ..í¼Bom+Ù2Õ•§N */
- $"8728 58CD BD02 9746 DBA2 7EAB 0F07 363C" /* ‡(Xͽ.—FÛ¢~«..6< */
- $"BAB3 1228 E02A BDB4 373F F3FB FF7D 8D0D" /* º³.(à*½´7?óûÿ}. */
- $"2193 09F4 7603 A017 98B1 421E 7A47 D126" /* !“Æôv. .˜±B.zGÑ& */
- $"82FD 5449 B97F F864 5CD5 19F6 A8A4 F216" /* ‚ýTI¹.ød\Õ.ö¨¤ò. */
- $"A4B3 FF7F E820 4C58 DE4B 944B 6FD4 F4DA" /* ¤³ÿ.è LXÞK”KoÔôÚ */
- $"596E A688 456C 3F0D 7844 1596 2BED 0D5D" /* Yn¦ˆEl?.xD.–+í.] */
- $"FAFB 8D2E D7D0 ABCB B2BE 8D80 E74D 9EDC" /* úû.×Ы˲¾€çMžÜ */
- $"7FFF 7FC9 2FB9 3BDA F47A B9C2 E1B8 5CC8" /* .ÿ.É/¹;Úôz¹Âá¸\È */
- $"14AB D534 7208 32FE 73D2 EF23 862E 10F8" /* .«Õ4r.2þsÒï#†..ø */
- $"C16F 1FFF 6FBB FA97 5167 CDAD 4886 8FC2" /* Áo.ÿo»ú—QgÍ­H†Â */
- $"BFFF 7FFE 2B73 126E 1EC8 C82A 3F6D 6CC3" /* ¿ÿ.þ+s.n.ÈÈ*?mlà */
- $"D98A D501 1DC2 82FD FF57 9731 B866 2A7D" /* ÙŠÕ..‚ýÿW—1¸f*} */
- $"C983 5F41 893F 2D09 F81C E373 42C2 5963" /* Ƀ_A‰?-Æø.ãsBÂYc */
- $"7E9F C269 2B8B C21A 8247 D433 0DF7 491E" /* ~ŸÂi+‹Â.‚GÔ3.÷I. */
- $"D1BF 3D9E F4BD 1B50 8034 4EE9 4A69 B155" /* Ñ¿=žô½.P€4NéJi±U */
- $"849A B0F7 8CEA 3FD0 E4A0 C339 2431 ED8B" /* „š°÷Œê?Ðä Ã9$1í‹ */
- $"793D 6354 12C0 97F9 C379 ADA9 7DEE E5EF" /* y=cT.À—ùÃy­©}îåï */
- $"2366 FD9F 7F36 9703 7BCA 1455 6A98 F02E" /* #fýŸ.6—.{Ê.Uj˜ð. */
- $"1EDC 4707 C9A6 B325 A6E4 637D 612B B3DD" /* .ÜG.ɦ³%¦äc}a+³Ý */
- $"1E5A 3660 EEB0 BEFA 2C50 307B 5887 6D39" /* .Z6`î°¾ú,P0{X‡m9 */
- $"0EC7 2D81 C32E 6B72 8546 30E4 133F 3D3B" /* .Ç-Ã.kr…F0ä.?=; */
- $"0A76 21AA 4387 8F29 03C8 1C32 755C F553" /* Âv!ªC‡).È.2u\õS */
- $"5CA1 C16A 02EC 4654 97C8 6F10 BA2A 16E0" /* \¡Áj.ìFT—Èo.º*.à */
- $"DB18 605E 8A18 8A6E 4F35 1EF7 8C57 F8B2" /* Û.`^Š.ŠnO5.÷ŒWø² */
- $"0020 4D0A 1739 2287 ADE2 B0C2 D816 17D2" /* . MÂ.9"‡­â°ÂØ..Ò */
- $"21F8 3104 FEA8 38E3 8644 6F0B D2C6 A599" /* !ø1.þ¨8ã†Do.ÒÆ¥™ */
- $"B793 1367 B548 23BD 8836 1143 D5DB 2720" /* ·“.gµH#½ˆ6.CÕÛ' */
- $"73BB 1485 DEAF C96F 24E8 AA26 56B9 89D3" /* s».…Þ¯Éo$èª&V¹‰Ó */
- $"8F8D 2F3E 5EA5 466C BE3C 6879 6C0A 5891" /* />^¥Fl¾<hylÂX‘ */
- $"974E 6F22 0E47 66D4 BD1F 6A7D 1885 42CC" /* —No".GfÔ½.j}.…BÌ */
- $"7E13 126E AC98 74B7 B093 BDFF 37DB E527" /* ~..n¬˜t·°“½ÿ7Ûå' */
- $"E6D0 CF2A D7E6 E7EB 1095 05AF 6407 BB9B" /* æÐÏ*×æçë.•.¯d.»› */
- $"0227 D5EB 260A C844 340F B249 E84F 58A7" /* .'Õë&ÂÈD4.²IèOX§ */
- $"FA14 9D34 7614 73A6 BE73 ED76 B2CD 4515" /* ú.4v.s¦¾sív²ÍE. */
- $"F26C 3AD7 7C32 5480 5A3A C4DF 123A EA95" /* òl:×|2T€Z:Äß.:ê• */
- $"D2B4 A3D8 F88D E685 6505 A999 DD9E C8D1" /* Ò´£Øøæ…e.©™ÝžÈÑ */
- $"A073 3702 5A8F 3598 F7DC A36F 0058 065E" /*  s7.Z5˜÷Ü£o.X.^ */
- $"65E6 B5AC 2A85 0F1C 43BF 8A10 43A0 BB10" /* e浬*…..C¿Š.C ». */
- $"4C3A 8F4F 95AD 253D EEE9 FBE8 4023 4647" /* L:O•­%=îéûè@#FG */
- $"7A75 8F1C 9245 3C51 3FF5 BD2B DFD3 57EF" /* zu.’E<Q?õ½+ßÓWï */
- $"1FB4 900F 4546 6EFA A7AE 45EB EAE9 7B9D" /* .´.EFnú§®Eëêé{ */
- $"6408 1DCB F7AC BE44 7D08 1482 2257 A9CF" /* d..Ë÷¬¾D}..‚"W©Ï */
- $"8B78 3610 9816 9518 A64C 215A 4569 6C5F" /* ‹x6.˜.•.¦L!ZEil_ */
- $"57E0 4F89 F77C 88D6 ADFC 8E42 9299 A2C9" /* WàO‰÷|ˆÖ­üŽB’™¢É */
- $"0F7C EA0A 7E98 B7AF 70ED 09A8 0759 B1A7" /* .|êÂ~˜·¯píƨ.Y±§ */
- $"C18E 2CC9 883F A788 A2F1 57B9 7A0E F384" /* ÁŽ,Ɉ?§ˆ¢ñW¹z.ó„ */
- $"F0CE 46F0 E10A ED6F CE17 2BE1 25D5 3A36" /* ðÎFðáÂíoÎ.+á%Õ:6 */
- $"5C6A F3AA F2D1 7225 6C5C 514F 8F1F 64A5" /* \jóªòÑr%l\QO.d¥ */
- $"B08E D05D 3E2E B3E4 DE48 12A9 7DC6 6E03" /* °ŽÐ]>.³äÞH.©}Æn. */
- $"05B3 2AD0 EF87 EFB1 6D03 06E4 85AB 36C6" /* .³*Ðï‡ï±m..ä…«6Æ */
- $"9BF6 8382 74F2 F321 62DF 269C 8D95 8FBD" /* ›öƒ‚tòó!bß&œ•½ */
- $"C4CA 7278 FDBA C51B A4FC C224 BD43 5F76" /* ÄÊrxýºÅ.¤üÂ$½C_v */
- $"F9D9 0970 5EAA 5F05 FDCB 50DE 35E7 A82E" /* ùÙÆp^ª_.ýËPÞ5ç¨. */
- $"1E7E 584D 33D8 EF90 B221 622F 778E 460D" /* .~XM3Øï²!b/wŽF. */
- $"6DC9 383F CF41 7B89 7414 97EF EFE2 CC75" /* mÉ8?ÏA{‰t.—ïïâÌu */
- $"8895 6AFD C6E8 610E 5E29 7AE1 FAAF 9FD5" /* ˆ•jýÆèa.^)záú¯ŸÕ */
- $"435F 3F61 6F9F AC78 7EAD 62BE 7DF7 7CFD" /* C_?aoŸ¬x~­b¾}÷|ý */
- $"D3FD 5BAF 83F5 5B37 CF6D BE7E 9DDF 3F4D" /* Óý[¯ƒõ[7Ïm¾~ß?M */
- $"80E8 ABDE CCAF 0D6C 8AC6 9587 348A 7A5A" /* €è«Þ̯.lŠÆ•‡4ŠzZ */
- $"21F6 5D05 F6A4 1727 AC99 8E36 4607 A805" /* !ö].ö¤.'¬™Ž6F.¨. */
- $"1CA8 FB12 6979 4216 6FCF DF65 6135 AFF9" /* .¨û.iyB.oÏßea5¯ù */
- $"5A1E 01C1 15A0 4F38 E547 6F65 858D 0788" /* Z..Á. O8åGoe….ˆ */
- $"49E3 07A2 D476 B767 EC21 FF65 559D 3B3F" /* Iã.¢Ôv·gì!ÿeU;? */
- $"B8A5 C1A8 6496 5183 24E6 93A6 DF2F 52F1" /* ¸¥Á¨d–Qƒ$擦ß/Rñ */
- $"19CA BFD7 1479 8040 2F9C 0DB9 00F0 49C5" /* .Ê¿×.y€@/œ.¹.ðIÅ */
- $"3D32 5B0C 9453 8D1F 452F D9E7 75FD CD61" /* =2[.”S.E/ÙçuýÍa */
- $"44A9 62C3 F0C8 BAF0 6A66 A4D4 AA8B 73B0" /* D©bÃðȺðjf¤Ôª‹s° */
- $"C942 686A 4A1E E3A7 2343 A0ED D595 9AFC" /* ÉBhjJ.ã§#C íÕ•šü */
- $"5546 0ACB FD23 6F2E DCEE ABBD 70E7 FA93" /* UFÂËý#o.Üpçú“ */
- $"3FFF 7FC5 7D31 FA1C D910 1C70 6CDC 3362" /* ?ÿ.Å}1ú.Ù..plÜ3b */
- $"B0A1 C6F3 16D1 BE51 73D2 4697 37CA 8197" /* °¡Æó.ѾQsÒF—7Ê— */
- $"A8C6 89C1 FF78 99EB 31B8 5F88 7B08 C557" /* ¨Æ‰Áÿx™ë1¸_ˆ{.ÅW */
- $"5483 A35C 0713 94D5 D2DF B84C 36CA D9EC" /* Tƒ£\..”ÕÒ߸L6ÊÙì */
- $"8FC7 A305 814F 8B04 07D2 E391 5E89 43FE" /* Ç£.O‹..Òã‘^‰Cþ */
- $"6C67 4343 91DB DD56 C1D2 FEA6 9F1F 346F" /* lgCC‘ÛÝVÁÒþ¦Ÿ.4o */
- $"714B 79E1 7AC7 53A1 9934 69F4 E886 5A9C" /* qKyázÇS¡™4iôè†Zœ */
- $"6F9A D26F DD48 5F60 A72A 7E20 77F8 1BE8" /* ošÒoÝH_`§*~ wø.è */
- $"91B9 9018 8124 7694 3664 4202 7B94 1007" /* ‘¹.$v”6dB.{”.. */
- $"4234 15FC 04A2 6DE0 DC6B 5EDE 4332 F592" /* B4.ü.¢màÜk^ÞC2õ’ */
- $"779A A3BD 8E84 5464 DE08 6BAE AE2F 6EEF" /* wš£½Ž„TdÞ.k®®/nï */
- $"CB75 5862 59D8 1362 5D60 79D2 137C 7606" /* ËuXbYØ.b]`yÒ.|v. */
- $"F2B1 06DE 8A2F B76A A7D9 84DB 8F52 1107" /* ò±.ÞŠ/·j§Ù„ÛR.. */
- $"A42C 9803 2476 0448 42C9 A9E5 D0F5 9110" /* ¤,˜.$v.HBÉ©åÐõ‘. */
- $"2FAB AAF4 0752 81C9 6064 B8F7 6CEB 438E" /* /«ªô.RÉ`d¸÷lëCŽ */
- $"DC4B 916C 21F0 1C8F 2A6A 1919 9E26 2B36" /* ÜK‘l!ð.*j..ž&+6 */
- $"3E51 F543 F7C5 2549 66D0 2F14 D18F 42F1" /* >QõC÷Å%IfÐ/.ÑBñ */
- $"397B BA52 99ED 853C E07D 629B 92A1 2589" /* 9{ºR™í…<à}b›’¡%‰ */
- $"B3A9 B812 DC8D A368 3204 F8AA 7549 AF2B" /* ³©¸.Ü£h2.øªuI¯+ */
- $"2DE7 529C 1ECB 9747 A4B8 F6EC 8DDC 0AC4" /* -çRœ.Ë—G¤¸öìÜÂÄ */
- $"2C31 F042 C407 3F18 FD32 9280 60E4 60D8" /* ,1ðBÄ.?.ý2’€`ä`Ø */
- $"77B5 C019 A5FF 6E0D 8E35 A78E C7AA E95B" /* wµÀ.¥ÿn.Ž5§ŽÇªé[ */
- $"D37C D883 5DD2 756B 385A 08BB 7708 AA5E" /* Ó|؃]Òuk8Z.»w.ª^ */
- $"5B89 0628 F831 7775 3555 A523 BF2F 721A" /* [‰.(ø1wu5U¥#¿/r. */
- $"099B E6B4 5128 9EA6 41E1 9B8B 18C1 928C" /* Æ›æ´Q(ž¦Aᛋ.Á’Œ */
- $"72A0 BD1E 84D6 836A C947 0982 284A 9238" /* r ½.„ÖƒjÉGÆ‚(J’8 */
- $"A06F E390 1BD5 BBFD 323F BA86 2091 BAD5" /*  oã.Õ»ý2?º† ‘ºÕ */
- $"351D 16C5 1D44 E8C7 66C7 D469 047D 5548" /* 5..Å.DèÇfÇÔi.}UH */
- $"7049 7B42 B682 DF4C 68DE B5D2 2EDC C105" /* pI{B¶‚ßLhÞµÒ.ÜÁ. */
- $"4047 9A7E 0403 F48B 6215 C3ED 8DBA 12E9" /* @Gš~..ô‹b.Ãíº.é */
- $"EEFB B61B 906E F6F6 DDFD D030 CD1C 47FD" /* îû¶.nööÝýÐ0Í.Gý */
- $"7C37 E7C7 DC08 213E 3C33 08E6 74A0 F400" /* |7çÇÜ.!><3.æt ô. */
- $"7CFC 3B85 1A2E 5ACA 573F F24C 7D2C 0E3B" /* |ü;…..ZÊW?òL},.; */
- $"2A6D CEDC 6C9C 6E97 A572 915F A892 3833" /* *mÎÜlœn—¥r‘_¨’83 */
- $"A08F 0070 A602 FB49 0EA6 62FC 4237 C568" /*  .p¦.ûI.¦büB7Åh */
- $"E937 1DC1 1FC2 C3F1 AA30 AC4D DDB8 E747" /* é7.Á.ÂÃñª0¬MݸçG */
- $"5EE4 FD73 8124 56EB ADBE 6DB3 F27B 80C0" /* ^äýs$Vë­¾m³ò{€À */
- $"E536 971B 511B C76B AB20 8BA4 4DCD BFCB" /* å6—.Q.Çk« ‹¤MÍ¿Ë */
- $"4A0C 34DC 3DDC 9BEF 5122 89D0 99D1 9BE7" /* J.4Ü=Ü›ïQ"‰Ð™Ñ›ç */
- $"8840 002A A77A 25E2 9C2C F9BC 78F9 FB0E" /* ˆ@.*§z%âœ,ù¼xùû. */
- $"0DB7 4F14 B07A 12F6 65D3 ABE1 660D A84A" /* .·O.°z.öeÓ«áf.¨J */
- $"EFF9 A799 1852 8ED0 9582 B79A D812 1BE6" /* ïù§™.RŽÐ•‚·šØ..æ */
- $"F3D0 D5FA 9C76 5EBD DBFD 42A9 F7B3 885E" /* óÐÕúœv^½ÛýB©÷³ˆ^ */
- $"4A68 DBE7 9663 FB7F 1AC4 5004 197F 97F0" /* JhÛç–cû..ÄP...—ð */
- $"F57B 135D 19ED E0E0 1C84 139C BA3B 2493" /* õ{.].íàà.„.œº;$“ */
- $"D997 333D B6A7 9E83 619C FCE9 9875 134D" /* Ù—3=¶§žƒaœüé˜u.M */
- $"4B31 FCB3 5808 B917 C8BB 0B67 4564 488E" /* K1ü³X.¹.È».gEdHŽ */
- $"3554 8125 C3A4 DB4A 0BB2 E501 244C 1F49" /* 5T%äÛJ.²å.$L.I */
- $"C6A7 51E4 6C51 A134 3DF4 CE21 2993 FF3B" /* ƧQälQ¡4=ôÎ!)“ÿ; */
- $"80F6 AE0B B9F8 D1D5 8853 4531 6806 4F3E" /* €ö®.¹øÑÕˆSE1h.O> */
- $"D2B6 5F62 796A 683C D3C9 A22B 6D56 C497" /* Ò¶_byjh<ÓÉ¢+mVÄ— */
- $"D854 2E14 C281 0F94 0220 BEE7 3754 D077" /* ØT..Â.”. ¾ç7TÐw */
- $"EDB0 0F0E 95C1 A40B 55C9 B5AE 4DA8 A8A6" /* í°..•Á¤.Uɵ®M¨¨¦ */
- $"ADD6 4A11 DE81 B148 70D3 FA4F 795C 9171" /* ­ÖJ.Þ±HpÓúOy\‘q */
- $"C72E 7EF2 454C 0336 BE4A EE68 960E 25BA" /* Ç.~òEL.6¾Jîh–.%º */
- $"E686 01F4 6FF5 3C7C 8B33 60D8 24D3 70A1" /* æ†.ôoõ<|‹3`Ø$Óp¡ */
- $"06C6 E616 29D4 63D6 3334 379F 743E 745D" /* .Ææ.)ÔcÖ347Ÿt>t] */
- $"4EF5 ECB5 072E 9F62 0750 F7BA 6FDE B6B0" /* Nõìµ..Ÿb.P÷ºoÞ¶° */
- $"0BD0 4FCC 8F59 9B13 0C77 0A30 9BAE DF36" /* .ÐOÌY›..wÂ0›®ß6 */
- $"B13D D861 E92A 12C7 EC7A 0946 BF20 1E31" /* ±=Øaé*.ÇìzÆF¿ .1 */
- $"1FEE EE88 EFC6 C1C1 0DE2 3850 C97F 01DF" /* .îîˆïÆÁÁ.â8PÉ..ß */
- $"F021 605A D52A 570D 7089 0C1B B3FE 8B4D" /* ð!`ZÕ*W.p‰..³þ‹M */
- $"E441 70AC 5F71 3FCE 527F EBF4 048A A307" /* äAp¬_q?ÎR.ëô.Š£. */
- $"CEFD 4EB0 87ED BFE2 A36C 51B9 EAD3 37C6" /* ÎýN°‡í¿â£lQ¹êÓ7Æ */
- $"E8F0 9A3D 8F78 8747 81D4 33F0 9EEB 5EA0" /* èðš=x‡GÔ3ðžë^  */
- $"6FE0 A580 6B6B C126 1CE3 F1B2 DC9C CFCE" /* oीkkÁ&.ãñ²ÜœÏÎ */
- $"42EE 7E91 EF2F 0DDF CFDE 75EB 554D 6941" /* Bî~‘ï/.ßÏÞuëUMiA */
- $"07A5 21BE AD52 7CC1 49B5 FE74 AE40 F70F" /* .¥!¾­R|ÁIµþt®@÷. */
- $"AB3B 0C16 98F5 7742 3DCE 842D 0B2B 2FEB" /* «;..˜õwB=΄-.+/ë */
- $"5E90 DEBC 8BA9 81AC 40CC 0030 2853 FE9C" /* ^Þ¼‹©¬@Ì.0(Sþœ */
- $"6FC2 569B 2CD1 6200 2881 802D 7697 8442" /* oÂV›,Ñb.(€-v—„B */
- $"92C8 666B BC90 3252 F4D3 9BD2 AD14 0027" /* ’Èfk¼2RôÓ›Ò­..' */
- $"CE11 F5A4 437B 3F80 B250 AA4C 23B6 AD83" /* Î.õ¤C{?€²PªL#¶­ƒ */
- $"277E 5EF0 8132 6331 9325 D1A3 CFB6 6F73" /* '~^ð2c1“%ѣ϶os */
- $"D37D 780F 91CC CD40 6234 2FE2 F097 1681" /* Ó}x.‘ÌÍ@b4/âð—. */
- $"6097 88BD BFFF 18F5 2CBB FF67 FDBC 2F07" /* `—ˆ½¿ÿ.õ,»ÿgý¼/. */
- $"67FF 7FFF 1946 84C7 A551 03FF 7F52 A7C2" /* gÿ.ÿ.F„Ç¥Q.ÿ.R§Â */
- $"8AC8 1080 56FF 0C48 1804 A884 A5A2 08FF" /* ŠÈ.€Vÿ.H..¨„¥¢.ÿ */
- $"7FF5 3220 8043 9005 C25D DE15 02FB 7F2B" /* .õ2 €C.Â]Þ..û.+ */
- $"8205 5CA8 40BE EFB1 78F0 2656 2AD4 14FF" /* ‚.\¨@¾ï±xð&V*Ô.ÿ */
- $"7505 20CD 8BE2 8B15 47BB 9E26 105E 15DD" /* u. Í‹â‹.G»ž&.^.Ý */
- $"21A7 82AE E19D FE27 5D8B DDAD E13B D5AD" /* !§‚®áþ']‹Ý­á;Õ­ */
- $"1974 E6EE 9F68 4679 00C0 9D09 0BC1 7CFB" /* .tæîŸhFy.ÀÆ.Á|û */
- $"0F2C 9F4E 082C 2CB4 569B A7B0 0009 E098" /* .,ŸN.,,´V›§°.Æà˜ */
- $"9AB0 9892 B1FF 6957 1D78 2613 4289 24C6" /* š°˜’±ÿiW.x&.B‰$Æ */
- $"12BC E2EF C9AE E6D9 784F C157 77AB 3470" /* .¼âïÉ®æÙxOÁWw«4p */
- $"D8C7 C746 1978 322D D4E9 FA24 B8B2 5054" /* ØÇÇF.x2-Ôéú$¸²PT */
- $"D643 8270 9090 D6D8 0C24 16E5 1146 421C" /* ÖC‚pÖØ.$.å.FB. */
- $"D6A2 40D9 1864 A800 0000 0000 0001 4554" /* Ö¢@Ù.d¨.......ET */
- $"031E 793B 33D3 FD4A CE0A 3D8A 9D46 37B0" /* ..y;3ÓýJÎÂ=ŠF7° */
- $"4D2C 6F04 2BFF 071C 023F E153 6688 1815" /* M,o.+ÿ...?áSfˆ.. */
- $"BA20 BF61 DDDF 2979 84E3 3348 50F6 E9B8" /* º ¿aÝß)y„ã3HPöé¸ */
- $"634A 8937 FF7F F1AE E84B C95A 771F 4C9C" /* cJ‰7ÿ.ñ®èKÉZw.Lœ */
- $"3FFE 0734 7D7F 6E35 4A2E 21E0 E52F FF7E" /* ?þ.4}.n5J.!àå/ÿ~ */
- $"8532 8513 7869 A6E6 495D 3E58 F349 1EF5" /* …2….xi¦æI]>XóI.õ */
- $"886C 6441 9091 82E8 0C24 1507 0E02 A105" /* ˆldA‘‚è.$....¡. */
- $"95C5 1409 096C 9A37 F758 F13A 5ABF 149E" /* •Å.ÆÆlš7÷Xñ:Z¿.ž */
- $"DA31 52E9 0DA9 0BFF 45EB 20C7 1A1C E54C" /* Ú1Ré.©.ÿEë Ç..åL */
- $"29D1 6C8E D1EC 9D59 F945 4303 373F FF7F" /* )ÑlŽÑìYùEC.7?ÿ. */
- $"CE95 B027 88F7 AB06 28B9 92E7 D540 BC2B" /* Ε°'ˆ÷«.(¹’çÕ@¼+ */
- $"7167 8C6C C87E 32B0 C904 7D7D 278E E519" /* qgŒlÈ~2°É.}}'Žå. */
- $"707D 2C42 1714 C425 F9D0 DC01 D910 23DB" /* p},B..Ä%ùÐÜ.Ù.#Û */
- $"E7F3 391C A4E6 FAE1 C850 5A1F 456A 6690" /* çó9.¤æúáÈPZ.Ejf */
- $"3F37 F970 3841 73D3 1095 39CF 10A3 40F8" /* ?7ùp8AsÓ.•9Ï.£@ø */
- $"4CCC 4985 E3D5 127F 7CF4 92BC DCE9 2335" /* LÌI…ãÕ..|ô’¼Üé#5 */
- $"43FB 7460 8D5C C121 CFF2 1165 1CCE BBB2" /* Cût`\Á!Ïò.e.λ² */
- $"5EA8 0279 2C97 E45B A43D 328C 7A6C 5EBC" /* ^¨.y,—ä[¤=2Œzl^¼ */
- $"61DD BB2C E34E 25E4 1725 3C6B EC12 BFEF" /* aÝ»,ãN%ä.%<kì.¿ï */
- $"3E5E 0ACF 766D 9D4E 8978 2AC5 F138 755A" /* >^ÂÏvmN‰x*Åñ8uZ */
- $"CBDD 8421 F74E 9A07 A070 16ED 100C 769A" /* ËÝ„!÷Nš. p.í..vš */
- $"6571 1FA0 4D62 8ADC A3F1 0AAA 2253 1A39" /* eq. MbŠÜ£ñª"S.9 */
- $"0006 DF51 B09A 2267 BA13 3AD9 0120 8520" /* ..ßQ°š"gº.:Ù. … */
- $"7375 BB11 0715 9FFF 7FFF 276F 9A44 4D02" /* su»...Ÿÿ.ÿ'ošDM. */
- $"9DF2 BE32 729A 8C71 FBC9 4C73 FA4B 1D24" /* ò¾2ršŒqûÉLsúK.$ */
- $"4115 B69E 4FFF 7FFF 45B5 7091 9925 CEBD" /* A.¶žOÿ.ÿEµp‘™%ν */
- $"6A4E 1AA3 BFFF 7FFD AA3B 4043 EE5A 76B0" /* jN.£¿ÿ.ýª;@CîZv° */
- $"A073 CF17 7A58 3A06 649C B972 3CB8 897B" /*  sÏ.zX:.dœ¹r<¸‰{ */
- $"31E2 637A 05AC 83FA B94C 0F75 7113 FF7B" /* 1âcz.¬ƒú¹L.uq.ÿ{ */
- $"E690 225A FB16 A961 626A B7FE 22EF 864B" /* æ"Zû.©abj·þ"ï†K */
- $"F464 1D62 4127 02B3 DB08 1C01 3ECE 1326" /* ôd.bA'.³Û...>Î.& */
- $"CF03 BF05 5771 4992 75FE 29FC 5FFF 60D5" /* Ï.¿.WqI’uþ)ü_ÿ`Õ */
- $"DCC3 1B1F 40FF 6990 DC69 3E47 D09A 6E6A" /* ÜÃ..@ÿiÜi>GКnj */
- $"2866 9BA8 D74C BAAA 204E 05F9 DBFE E679" /* (f›¨×Lºª N.ùÛþæy */
- $"E76C 383D 9F92 BB32 1E14 2CA1 CBD5 E93C" /* çl8=Ÿ’»2..,¡ËÕé< */
- $"6C00 DFA2 B04F D650 3F14 60FF 7F73 29C3" /* l.ߢ°OÖP?.`ÿ.s)à */
- $"E20E 5672 C31B 6D72 FDCF 8097 B8B0 1482" /* â.VrÃ.mrýÏ€—¸°.‚ */
- $"C37E 4C4A 28FA 6E67 F061 E00C 371B 8655" /* Ã~LJ(úngðaà.7.†U */
- $"BDCB 2942 6AB1 0E31 38D3 6948 0D3F 6FEF" /* ½Ë)Bj±.18ÓiH.?oï */
- $"C2AB 669A E502 2490 C158 FC07 05F0 348A" /* «fšå.$ÁXü..ð4Š */
- $"0505 F0B2 E7E3 F934 19DA 2DB9 9686 603E" /* ..ð²çãù4.Ú-¹–†`> */
- $"C2C3 4B2F EB95 FB4E 62D2 F085 4364 9DCA" /* ÂÃK/ë•ûNbÒð…CdÊ */
- $"A6E8 94F8 CC41 2603 5BFC 4E90 C05F 068D" /* ¦è”øÌA&.[üNÀ_. */
- $"414C 618C 8860 58B1 7059 0B4C 39E8 FB58" /* ALaŒˆ`X±pY.L9èûX */
- $"C413 43C6 BF39 CC12 6E5B F65C F671 DD29" /* Ä.CÆ¿9Ì.n[ö\öqÝ) */
- $"8A03 BC15 FF06 2028 49E4 BF04 E6FC D4FD" /* Š.¼.ÿ. (Iä¿.æüÔý */
- $"401A CB9C 5F7F EFE7 8F41 E707 7803 9F1A" /* @.Ëœ_.ïçAç.x.Ÿ. */
- $"715F 951E E63A 9B4C 1404 32AA B5B7 98B0" /* q_•.æ:›L..2ªµ·˜° */
- $"D5F4 CD69 DD15 9E81 D2FD 09F7 462D AF3E" /* ÕôÍiÝ.žÒýÆ÷F-¯> */
- $"31DA 85C4 5053 8460 C06C 7018 908C 4821" /* 1Ú…ÄPS„`Àlp.ŒH! */
- $"D8AB AC44 7666 44D1 EA04 8979 3A4A A0FE" /* Ø«¬DvfDÑê.‰y:J þ */
- $"27D7 B0C3 DBAA 5233 F376 3CA8 4968 DF8A" /* '×°ÃÛªR3óv<¨Ihߊ */
- $"874C 2117 6A15 4664 03FF 7FFF 7F7C 2D12" /* ‡L!.j.Fd.ÿ.ÿ.|-. */
- $"B28B 8A4C 6D72 1106 16E0 BF7F 9822 2424" /* ²‹ŠLmr...à¿.˜"$$ */
- $"3C1B CBC8 2F76 1AC7 FF7F FF7F EB42 22AA" /* <.ËÈ/v.Çÿ.ÿ.ëB"ª */
- $"F30A 0C9D 6086 E561 E1BC C1D9 4E7F FADF" /* óÂ.`†åaá¼ÁÙN.úß */
- $"A85C B34C E2D4 FCF6 1A29 34F3 3B42 1DFC" /* ¨\³LâÔüö.)4ó;B.ü */
- $"C6BD 370B D203 B0C4 1C7D C348 1EE7 EAD9" /* ƽ7.Ò.°Ä.}ÃH.çêÙ */
- $"3145 E7FB 36CC 8E64 AB70 81DC 65E1 2C1D" /* 1Eçû6ÌŽd«pÜeá,. */
- $"9CB5 18A0 1C95 7DE2 96DF C185 7A40 50C7" /* œµ. .•}â–ßÁ…z@PÇ */
- $"E32C FCC1 FF6B 14F5 05FE 0E1C 8757 8D82" /* ã,üÁÿk.õ.þ..‡W‚ */
- $"3A41 284E 2906 8316 564F F479 4DCF FF7E" /* :A(N).ƒ.VOôyMÏÿ~ */
- $"5F11 3745 AC7F ED8D BC93 4205 7E12 E036" /* _.7E¬.í¼“B.~.à6 */
- $"0BE4 4B4F F99C F369 6B38 263E 63EC 6311" /* .äKOùœóik8&>cìc. */
- $"D577 8B5D 7957 D24D 7D64 A2B5 1107 4625" /* Õw‹]yWÒM}d¢µ..F% */
- $"E1EB 2460 41A2 E878 5967 CEAE AE16 D8D5" /* áë$`A¢èxYgή®.ØÕ */
- $"F960 B484 0B49 7253 26F2 714E 6A13 03E4" /* ù`´„.IrS&òqNj..ä */
- $"A0C3 3924 31ED 8B79 3D63 5412 C097 F9C3" /*  Ã9$1í‹y=cT.À—ùÃ */
- $"79AD A97D EEE5 EF23 66FF 15BD C854 5DFB" /* y­©}îåï#fÿ.½ÈT]û */
- $"5921 E05C 6A39 B68E 6444 6D55 3B7D 6DDA" /* Y!à\j9¶ŽdDmU;}mÚ */
- $"9003 8F53 5C49 D978 31CD 41C5 DD62 7DE4" /* .S\IÙx1ÍAÅÝb}ä */
- $"2F24 5932 A14F 9C9C 97B6 2652 5988 7970" /* /$Y2¡Oœœ—¶&RYˆyp */
- $"F890 8A5C 9614 EBF4 DAC8 15D1 6F3C 07E4" /* øŠ\–.ëôÚÈ.Ño<.ä */
- $"7B8B F763 6803 394F 2291 8D88 EB1B 3136" /* {‹÷ch.9O"‘ˆë.16 */
- $"10C9 5077 060A 7DB0 A890 CB7B 947F AD8B" /* .ÉPw.Â}°¨Ë{”.­‹ */
- $"0AAF 67FF 5D78 615A E459 013B 6923 5E0E" /* ¯gÿ]xaZäY.;i#^. */
- $"900D BA9C DFF2 37D0 0508 B5F3 EA48 FADE" /* .ºœßò7Ð..µóêHúÞ */
- $"D348 3F2F 8E71 E6CD B6BE 8941 8773 0E17" /* ÓH?/ŽqæͶ¾‰A‡s.. */
- $"E97A B699 5A4F 21C1 0766 538B B29A B8CA" /* éz¶™ZO!Á.fS‹²š¸Ê */
- $"FBAE 21FA 76A0 B197 C613 E523 B127 1FE4" /* û®!úv ±—Æ.å#±'.ä */
- $"0AA8 798D 688E 8F27 E386 446F 0BD2 C6A5" /* ¨yhŽ'ã†Do.ÒÆ¥ */
- $"99B7 9313 67B5 4823 BD88 3611 E5A8 8054" /* ™·“.gµH#½ˆ6.娀T */
- $"3C15 C120 1B02 5B2A 2195 DD25 F90A 48A6" /* <.Á ..[*!•Ý%ùÂH¦ */
- $"BF92 56B9 4639 F2BD AC5F 3350 9699 14A7" /* ¿’V¹F9ò½¬_3P–™.§ */
- $"30A2 4B91 C33D 3175 F806 15AA 4B01 558F" /* 0¢K‘Ã=1uø..ªK.U */
- $"400B 8148 DAF5 29FD 0561 1CA8 7239 51F4" /* @.HÚõ)ý.a.¨r9Qô */
- $"A169 A92B EE2F 4F3D 2F96 029B 186B 7219" /* ¡i©+î/O=/–.›.kr. */
- $"C673 0E85 6FAC 9889 C64A 90AE DBAF E8E3" /* Æs.…o¬˜‰ÆJ®Û¯èã */
- $"6607 DF2A C332 C690 840A 817A ABFF 3302" /* f.ß*Ã2Æ„Âz«ÿ3. */
- $"1464 A65F E1B3 04B0 90C6 51E5 6A2E 7EA2" /* .d¦_á³.°ÆQåj.~¢ */
- $"9222 EABA 0632 2F13 B1A3 2337 85B4 E390" /* ’"êº.2/.±£#7…´ã */
- $"766A 98DB BDDD 9813 F7BD 8AEA 1AB2 BEEC" /* vj˜Û½Ý˜.÷½Šê.²¾ì */
- $"BEE3 F4B7 EE35 6BB8 ADE1 E772 AEB0 7E66" /* ¾ãô·î5k¸­áçr®°~f */
- $"3F99 05C1 3339 69B2 C1D5 4CC7 DB0B 3C67" /* ?™.Á39i²ÁÕLÇÛ.<g */
- $"7F80 43C8 7B29 FA49 8C64 3FEB 6406 35FE" /* .€CÈ{)úIŒd?ëd.5þ */
- $"FAEB 4922 9410 5352 D4C0 00CB 72EA 56CE" /* úëI"”.SRÔÀ.ËrêVÎ */
- $"22F8 673A D3E8 AAFA E992 5B7F 827C A83D" /* "øg:Óèªúé’[.‚|¨= */
- $"586F 54B4 69F8 C6B7 FF14 CFD4 4069 C50F" /* XoT´iøÆ·ÿ.ÏÔ@iÅ. */
- $"9E23 797E DE78 5B86 FCAE BDE5 B920 9551" /* ž#y~Þx[†ü®½å¹ •Q */
- $"22EC 4155 0582 10F4 BF8C 144A 3251 97F3" /* "ìAU.‚.ô¿Œ.J2Q—ó */
- $"2E7D 1E04 969B 4C15 8BDB FAC1 9743 2B6C" /* .}..–›L.‹ÛúÁ—C+l */
- $"6EF5 C95E 47CB A380 A635 C17D AD97 42EA" /* nõÉ^GË£€¦5Á}­—Bê */
- $"88A1 A63E FC76 A19C AE08 C868 115F 098D" /* ˆ¡¦>üv¡œ®.Èh._Æ */
- $"A1BE 16D4 3BF4 91C9 6CF1 DBE0 E0CA 0DAA" /* ¡¾.Ô;ô‘ÉlñÛààÊ.ª */
- $"EFCB 2A06 908B 7BAC CCF3 4CF8 179A 615E" /* ïË*.‹{¬ÌóLø.ša^ */
- $"590D AB18 CB49 E032 B8ED 2A8E 584A ACDC" /* Y.«.ËIà2¸í*ŽXJ¬Ü */
- $"4797 F732 B8C9 24A4 0E5C 85A0 FED8 E30A" /* G—÷2¸É$¤.\… þØã */
- $"ECBF 08FB CDC1 E09D 9556 837A E086 95AC" /* ì¿.ûÍÁà•Vƒzà†•¬ */
- $"BA2C E411 756E F132 9CE6 EDC4 6C90 B09E" /* º,ä.unñ2œæíÄl°ž */
- $"3C59 DE78 44D0 E445 BCA0 3AE0 05D9 7440" /* <YÞxDÐäE¼ :à.Ùt@ */
- $"F09F 10EA E0BA 4596 84F5 81A2 550E 57A7" /* ðŸ.êàºE–„õ¢U.W§ */
- $"F2A8 B2DD D612 A18F D74A 671D B70C 994A" /* ò¨²ÝÖ.¡×Jg.·.™J */
- $"9441 8E10 12B8 80F0 6249 2075 CD39 3667" /* ”AŽ..¸€ðbI uÍ96g */
- $"6632 AFDD 5E48 6B22 15CC 179A C6FA 47AE" /* f2¯Ý^Hk".Ì.šÆúG® */
- $"66AF 7AFB 033D 03F1 B829 B852 F1BF 55DB" /* f¯zû.=.ñ¸)¸Rñ¿UÛ */
- $"17F6 E1EF A955 F266 ACFE 75F4 34FC 38B0" /* .öáï©Uòf¬þuô4ü8° */
- $"0068 7DD6 016E 98D4 57DB 6220 D269 4BE9" /* .h}Ö.n˜ÔWÛb ÒiKé */
- $"8007 22E8 9D82 8FCE EB41 317B D0FA 323B" /* €."è‚ÎëA1{Ðú2; */
- $"B2C0 06D3 99E3 ED9A 2423 78CD AE34 CF5B" /* ²À.Ó™ãíš$#xÍ®4Ï[ */
- $"58DA 8F69 9604 4804 8682 B58C C1DA 1E21" /* XÚi–.H.†‚µŒÁÚ.! */
- $"0E4E F709 83E1 B335 F208 6565 C882 70A0" /* .N÷ƃá³5ò.eeÈ‚p  */
- $"2F58 5379 3999 7F2E E63D 81E4 C2EB 58E3" /* /XSy9™..æ=äÂëXã */
- $"4605 35E7 76D7 C7D0 AEDA 26C5 8BB6 0F99" /* F.5çv×ÇЮÚ&Å‹¶.™ */
- $"77C0 D3D6 9870 8279 4C2E 29C6 518F 13E6" /* wÀÓÖ˜p‚yL.)ÆQ.æ */
- $"1373 FCB8 FD55 3D8F 8322 F8F4 CD80 3C09" /* .sü¸ýU=ƒ"øôÍ€<Æ */
- $"1496 931A E1BF 0AE6 2842 6FF7 6986 6AEE" /* .–“.á¿Âæ(Bo÷i†jî */
- $"1AE9 FF0A 947D E3F6 D93F B59B F6D5 5FB6" /* .éÿ”}ãöÙ?µ›öÕ_¶ */
- $"AAC7 EDD1 1FDB 5A5F 5549 7D55 2E1F B6A4" /* ªÇíÑ.ÛZ_UI}U..¶¤ */
- $"FDAA F7D4 DF7D 4E80 F173 72EC 2AD6 46CC" /* ýª÷Ôß}N€ñsrì*ÖFÌ */
- $"6653 9F8A F548 8CD9 F7CC 0758 DFBD 1976" /* fSŸŠõHŒÙ÷Ì.Xß½.v */
- $"0832 03BE 1A6C 242F 4978 025D 37A6 D46A" /* .2.¾.l$/Ix.]7¦Ôj */
- $"B859 037D 5250 D0D6 8FC0 4C05 AAAB 7F38" /* ¸Y.}RPÐÖÀL.ª«.8 */
- $"799B 43F9 E370 D367 B412 8CC2 F941 E270" /* y›CùãpÓg´.ŒÂùAâp */
- $"A967 1978 577B 7A22 541A 7DDD A593 75E5" /* ©g.xW{z"T.}Ý¥“uå */
- $"6B05 D950 D953 DA5E 7EBF D5D3 4314 5006" /* k.ÙPÙSÚ^~¿ÕÓC.P. */
- $"8EC3 8474 6B41 83B3 7B16 9C95 721B 5405" /* ŽÃ„tkAƒ³{.œ•r.T. */
- $"F4AE A41F 92D8 56DA F2C9 4BF8 5B0A EBC6" /* ô®¤.’ØVÚòÉKø[ÂëÆ */
- $"29D5 F4F3 36B9 A6D7 3BC4 75D7 972C 7465" /* )Õôó6¹¦×;Äu×—,te */
- $"CCBE 21FA 6EAF 6B26 465B 4676 356D E640" /* ̾!ún¯k&F[Fv5mæ@ */
- $"04C3 0E39 C431 FBA5 2B53 E001 8F9D 37F5" /* .Ã.9Ä1û¥+Sà.7õ */
- $"F289 EC84 85B8 5FC3 F74A 734B E0B1 ED8C" /* ò‰ì„…¸_Ã÷JsKà±íŒ */
- $"5DF4 6678 22E4 887C A45B 1478 DFC3 A9E9" /* ]ôfx"äˆ|¤[.xßéé */
- $"F234 5723 01B3 2685 2754 8133 8699 21C8" /* ò4W#.³&…'T3†™!È */
- $"180A 27F8 174C FED5 8F71 4082 C4E8 DB83" /* .Â'ø.LþÕq@‚ÄèÛƒ */
- $"BDA4 4506 3FA4 5286 5D63 00F7 905D A740" /* ½¤E.?¤R†]c.÷]§@ */
- $"5251 07FA 22F8 1334 FBA6 5640 7199 FA41" /* RQ.ú"ø.4û¦V@q™úA */
- $"A3C7 3CC1 ECF5 7F43 A9AE FBD5 C1F0 18B3" /* £Ç<Áìõ.C©®ûÕÁð.³ */
- $"7072 4809 0A4C 8127 6E10 5F7C 335C CC28" /* prHÆÂL'n._|3\Ì( */
- $"B723 3D12 724D 3DE5 37B3 1C2A 136D 2258" /* ·#=.rM=å7³.*.m"X */
- $"DCE6 BFA4 0DAD FB6E 72C1 70F7 6D71 785D" /* Ü濤.­ûnrÁp÷mqx] */
- $"BC75 69CE CE3B CF7A 170E 8343 CBA9 DE66" /* ¼uiÎÎ;Ïz..ƒCË©Þf */
- $"06ED 779C AA9F F28D 943D 5E3E DEDE 4769" /* .íwœªŸò”=^>ÞÞGi */
- $"289C 5523 9792 EFAC 19A6 A945 B504 9446" /* (œU#—’ï¬.¦©Eµ.”F */
- $"A4DF BAA6 B5EB BAEF 7B92 3E08 6D17 870F" /* ¤ßº¦µëºï{’>.m.‡. */
- $"9E0A 487E 8A60 90B5 E555 CD4F D2F1 FE67" /* žÂH~Š`µåUÍOÒñþg */
- $"88DE BB6A E653 A2B6 F9C7 B226 2544 A167" /* ˆÞ»jæS¢¶ùDz&%D¡g */
- $"5DF7 5F35 F38B DB99 30F8 C210 AF41 C7A4" /* ]÷_5ó‹Û™0øÂ.¯AǤ */
- $"167B 30B4 8B8D 0821 4ADB EFC6 5728 A86D" /* .{0´‹.!JÛïÆW(¨m */
- $"99A8 2A1D 51E2 4CE5 AEA5 7ECC 23CB 628B" /* ™¨*.QâL宥~Ì#Ëb‹ */
- $"E438 F41A A280 CF2E 8E51 5004 A9BA 64AB" /* ä8ô.¢€Ï.ŽQP.©ºd« */
- $"B0AA 608C 8C19 38F7 567B 0C45 B7C5 0E2D" /* °ª`ŒŒ.8÷V{.E·Å.- */
- $"0F3D A192 B0F5 A567 4EE1 9FF5 F085 979A" /* .=¡’°õ¥gNáŸõð…—š */
- $"13DA 6FC3 89D0 0370 C986 5F44 AADD CAB9" /* .ÚoÉÐ.pɆ_DªÝʹ */
- $"FBD0 8CDE 18D9 8FED 715E 264F 0D69 2CEF" /* ûÐŒÞ.Ùíq^&O.i,ï */
- $"63F0 7A64 D65B 094A 6976 E6D4 E3DC 1583" /* cðzdÖ[ÆJivæÔãÜ.ƒ */
- $"FE8C BD22 992E 3FDB AF18 03A7 0A74 8333" /* þŒ½"™.?Û¯..§Âtƒ3 */
- $"76E3 5195 C7FA A180 5123 7E0C 544B 9C8C" /* vãQ•Çú¡€Q#~.TKœŒ */
- $"928D 3DF6 F330 4D6E 8049 11AF 064E 4E3B" /* ’=öó0Mn€I.¯.NN; */
- $"B937 EE03 A4D2 F530 4513 47F0 5E98 E060" /* ¹7î.¤Òõ0E.Gð^˜à` */
- $"72C6 46EC B761 FAB4 B0FA 9A80 FF78 5408" /* rÆFì·aú´°úš€ÿxT. */
- $"9152 452E 0111 2383 5E5F 6C4F FC53 0EDE" /* ‘RE...#ƒ^_lOüS.Þ */
- $"1092 66D3 5F38 1AC8 1412 561A 4017 9110" /* .’fÓ_8.È..V.@.‘. */
- $"CA19 3E6F 8803 0908 5F57 A2E2 4744 E3C4" /* Ê.>oˆ.Æ._W¢âGDãÄ */
- $"F1BF 49F6 836F E294 610B 4098 2761 1502" /* ñ¿Iöƒoâ”a.@˜'a.. */
- $"CCB2 0C11 81DD 05B4 ACD8 8F28 C5DD 1DD8" /* ̲..Ý.´¬Ø(ÅÝ.Ø */
- $"58E0 C1E1 70A8 42BF 456F FE20 1261 1F81" /* XàÁáp¨B¿Eoþ .a. */
- $"08AC FEB1 F89C 3576 EF94 A20C 255F 3B3F" /* .¬þ±øœ5v.%_;? */
- $"5E6B B0C0 4B3F EADC 8536 55E9 8144 C946" /* ^k°ÀK?êÜ…6UéDÉF */
- $"7613 8662 DCB1 C761 2BDA 412D C7D6 2D5C" /* v.†bܱÇa+ÚA-ÇÖ-\ */
- $"BCC0 F84E 54E4 9B0B BDF7 4F45 FCA6 D6AE" /* ¼ÀøNTä›.½÷OEü¦Ö® */
- $"1754 31D1 E6CB 94F4 D163 2B1D 017D 4171" /* .T1ÑæË”ôÑc+..}Aq */
- $"ABE0 0285 395D 3D23 42D7 E641 348A 0C2E" /* «à.…9]=#B×æA4Š.. */
- $"9C16 42C9 8E99 B654 8046 C365 EA71 CE64" /* œ.BÉŽ™¶T€FÃeêqÎd */
- $"B762 0E4D 7C48 617B CDB9 6264 2C81 4A9F" /* ·b.M|Ha{͹bd,JŸ */
- $"8600 50B2 B985 EB73 DB96 82EA FF7D 1E50" /* †.P²¹…ësÛ–‚êÿ}.P */
- $"6A49 AEA3 78E3 2DFD 0D59 3013 F257 AAA9" /* jI®£xã-ý.Y0.òWª© */
- $"0E5D 81DA E983 8D48 41BE DF0B FB34 AEA5" /* .]ÚéƒHA¾ß.û4®¥ */
- $"07B6 B0AA 1E53 1D9F B9C7 4CE5 8D46 6151" /* .¶°ª.S.Ÿ¹ÇLåFaQ */
- $"8000 0C24 1D66 1946 1073 4456 2361 E486" /* €..$.f.F.sDV#aä† */
- $"120F 29F0 6121 2D6A AF51 0C82 F68C B571" /* ..)ða!-j¯Q.‚öŒµq */
- $"77AD BE59 9145 D105 DE8C 9500 0000 0000" /* w­¾Y‘EÑ.ÞŒ•..... */
- $"0000 0032 BC9A BD52 00B4 6C6F 3753 1A96" /* ...2¼š½R.´lo7S.– */
- $"9B00 FCD3 F055 A11A AFB1 FB95 1610 88D0" /* ›.üÓðU¡.¯±û•..ˆÐ */
- $"8D32 9653 FC10 55FD B965 C1A9 B6BD 2245" /* 2–Sü.Uý¹eÁ©¶½"E */
- $"D48B 8230 2EF5 56F1 6618 9F91 FEC4 4106" /* Ô‹‚0.õVñf.Ÿ‘þÄA. */
- $"F23B 7C8A 0320 79EA D7A0 D75F 09BD B985" /* ò;|Š. yê× ×_ƽ¹… */
- $"C22B E2F0 0508 64BA AA2F 2414 19D7 311D" /* Â+âð..dºª/$..×1. */
- $"F709 E05C 809B 9E62 83F8 FF13 2DE3 01D6" /* ÷Æà\€›žbƒøÿ.-ã.Ö */
- $"8ADC F118 5A80 77C8 DABC 2FB5 CEF6 FCFB" /* ŠÜñ.Z€wÈÚ¼/µÎöüû */
- $"7A94 2773 6CEC FAE2 7865 753C E612 E4AF" /* z”'slìúâxeu<æ.ä¯ */
- $"657C 5C67 8FB3 1E56 A319 1ED1 FE48 0D8D" /* e|\g³.V£..ÑþH. */
- $"2431 B10B 8E15 0A4B FF7F 7EB8 D068 5015" /* $1±.Ž.ÂKÿ.~¸ÐhP. */
- $"151E C37C 0390 F6CC 64A8 0000 0000 0000" /* ..Ã|.öÌd¨...... */
- $"0000 0002 5991 79E8 2B17 082C ABCB DA90" /* ....Y‘yè+..,«ËÚ */
- $"CE92 8CB0 E992 0710 2B8F CAAB D217 C4E9" /* Î’Œ°é’..+Ê«Ò.Äé */
- $"E55E 11D2 6200 B530 5EF4 6932 1CBF EA6C" /* å^.Òb.µ0^ôi2.¿êl */
- $"E58D 2AA9 68C2 89FF 7903 A6ED D674 F1FC" /* å*©h‰ÿy.¦íÖtñü */
- $"A256 3564 F7E0 4DDF CDA1 2729 F7FF 6EB2" /* ¢V5d÷àMßÍ¡')÷ÿn² */
- $"9D35 70A9 5447 924B B8E1 71D3 4A8A DECB" /* 5p©TG’K¸áqÓJŠÞË */
- $"93E1 8FA0 140E C9B7 6124 8020 D660 3D22" /* “á ..É·a$€ Ö`=" */
- $"C708 222E 7289 B890 0002 00E1 2BC6 84B9" /* Ç.".r‰¸...á+Æ„¹ */
- $"25DF 442F 97FF 7FEF 68EC 7325 B92C A150" /* %ßD/—ÿ.ïhìs%¹,¡P */
- $"EE19 48C3 2540 0000 0000 0000 0000 0749" /* î.HÃ%@.........I */
- $"DD4A 9891 375B B0E0 C176 A698 672E F295" /* ÝJ˜‘7[°àÁv¦˜g.ò• */
- $"0311 7B3E 2B87 B4B8 7FB3 5DF7 9C67 CBEA" /* ..{>+‡´¸.³]÷œgËê */
- $"6A19 4107 C9F4 2B19 6829 179A 3FFF 7E8C" /* j.A.Éô+.h).š?ÿ~Œ */
- $"44A2 15E8 8E37 B422 F825 1862 58FF 7FFE" /* D¢.èŽ7´"ø%.bXÿ.þ */
- $"8EA1 D38C 727A 3071 1FF0 541F 6AB4 EA83" /* Ž¡ÓŒrz0q.ðT.j´êƒ */
- $"44A0 086A BAD7 6966 FC5D 0E72 A66C C301" /* D .jº×ifü].r¦lÃ. */
- $"3E1F B82C 9192 20D5 0322 858F 224C 87F5" /* >.¸,‘’ Õ."…"L‡õ */
- $"E940 85ED 7B36 EC96 D05C 21FF 7B10 59E1" /* é@…í{6ì–Ð\!ÿ{.Yá */
- $"E125 6C79 7852 2031 F3BA 34FB 6E57 BC3B" /* á%lyxR 1óº4ûnW¼; */
- $"69F0 C303 3A2A A573 D1E0 9836 C703 D02C" /* iðÃ.:*¥sÑà˜6Ç.Ð, */
- $"58CC 3DA7 FF0D 4301 F607 07C1 31FA 7F66" /* XÌ=§ÿ.C.ö..Á1ú.f */
- $"89BD A759 90CD 107A E5BD 6398 D7BE F7BB" /* ‰½§YÍ.zå½c˜×¾÷» */
- $"E273 D09A F8EE D21B 1015 A513 18F5 5C7D" /* âsКøîÒ...¥..õ\} */
- $"FD20 E7C9 C6BE 3105 7A4B 831D 251B 4C36" /* ý çÉƾ1.zKƒ.%.L6 */
- $"2A49 3EAC 1A86 9F87 09CC 0B00 2CF4 643C" /* *I>¬.†Ÿ‡ÆÌ..,ôd< */
- $"7012 8574 D28F 952D E959 1093 FE7E F021" /* p.…tÒ•-éY.“þ~ð! */
- $"028C 74ED 0E90 8DCD 5F06 B4BE EA1A 4C53" /* .Œtí.Í_.´¾ê.LS */
- $"A47F 3706 93CB 8FAB 7864 D123 4A39 B6BA" /* ¤.7.“Ë«xdÑ#J9¶º */
- $"CDCB 8AA9 2128 54FA CFB5 C4E1 F470 AD6E" /* ÍËŠ©!(TúϵÄáôp­n */
- $"6A05 07C9 72AA 562E F22F C922 BCF9 7DDF" /* j..ÉrªV.ò/É"¼ù}ß */
- $"3565 1AD4 F707 7DC0 1038 129E 4EA0 297E" /* 5e.Ô÷.}À.8.žN )~ */
- $"1037 3516 64BB FF75 539A 5C03 F7A3 C14D" /* .75.d»ÿuSš\.÷£ÁM */
- $"C617 50C8 14F1 7C95 0372 1443 C3F0 7ED4" /* Æ.PÈ.ñ|•.r.CÃð~Ô */
- $"EFDA FA88 BDD2 E947 7A43 A4A3 2339 CD58" /* ïÚúˆ½ÒéGzC¤£#9ÍX */
- $"526C 8407 8211 1949 6431 DB89 390B EB27" /* Rl„.‚..Id1Û‰9.ë' */
- $"9975 F04F D507 AC80 5D51 95B0 992A 1AC6" /* ™uðOÕ.¬€]Q•°™*.Æ */
- $"8699 86CC E64E 441C 2EFD 4F8C 70C1 DB2A" /* †™†ÌæND..ýOŒpÁÛ* */
- $"5395 8DF7 E279 AA65 BA32 2FD1 48C9 F400" /* S•÷âyªeº2/ÑHÉô. */
- $"D0EA 663D 92FF 053E 130C A1A9 491B E583" /* Ðêf=’ÿ.>..¡©I.åƒ */
- $"6133 2EE1 AFBE 86B8 D218 B698 906D A5B9" /* a3.᯾†¸Ò.¶˜m¥¹ */
- $"ACD3 9DC7 8720 C668 E134 1A1C 9C71 EA49" /* ¬ÓLJ Æhá4..œqêI */
- $"7AE9 9276 56E9 78BB 5679 18E2 6044 2763" /* zé’vVéx»Vy.â`D'c */
- $"2342 64F4 3952 2712 F704 B2E8 C1D2 35CC" /* #Bdô9R'.÷.²èÁÒ5Ì */
- $"F0AB 5ABD 61A0 1CD5 5316 0E78 22E6 B807" /* ð«Z½a .ÕS..x"æ¸. */
- $"8774 CA36 91EF 0BFF D969 6330 3900 00D1" /* ‡tÊ6‘ï.ÿÙic09..Ñ */
- $"2300 0000 0C6A 5020 200D 0A87 0A00 0000" /* #....jP .‡Â... */
- $"1466 7479 706A 7032 2000 0000 006A 7032" /* .ftypjp2 ....jp2 */
- $"2000 0000 4F6A 7032 6800 0000 1669 6864" /* ...Ojp2h....ihd */
- $"7200 0002 0000 0002 0000 0407 0701 0000" /* r............... */
- $"0000 0F63 6F6C 7201 0000 0000 0010 0000" /* ...colr......... */
- $"0022 6364 6566 0004 0000 0000 0001 0003" /* ."cdef.......... */
- $"0001 0000 0001 0000 0002 0002 0000 0003" /* ................ */
- $"0000 0000 6A70 3263 FF4F FF51 0032 0000" /* ....jp2cÿOÿQ.2.. */
- $"0000 0200 0000 0200 0000 0000 0000 0000" /* ................ */
- $"0000 0200 0000 0200 0000 0000 0000 0000" /* ................ */
- $"0004 0701 0107 0101 0701 0107 0101 FF52" /* ..............ÿR */
- $"000C 0000 0001 0105 0404 0001 FF5C 0013" /* ............ÿ\.. */
- $"2050 5858 6058 5860 5858 6058 5858 5050" /* PXX`XX`XX`XXXPP */
- $"58FF 6400 1100 014B 616B 6164 752D 7635" /* Xÿd....Kakadu-v5 */
- $"2E32 2E31 FF90 000A 0000 0000 D036 0001" /* .2.1ÿ.Â....Ð6.. */
- $"FF93 CFC2 DC03 54F9 36EC A8DC 2A8C 3701" /* ÿ“ÏÂÜ.Tù6ì¨Ü*Œ7. */
- $"118B 95C3 F2B2 5A7A 0428 C30A 2C64 B704" /* .‹•Ãò²Zz.(ÃÂ,d·. */
- $"5C3C 6DED 8696 4890 6404 5638 430C 59C5" /* \<m톖Hd.V8C.YŠ*/
- $"D913 B06B 0B08 E00E 1802 6D82 7225 E695" /* Ù.°k..à...m‚r%æ• */
- $"9F1E E7B0 D1DF 323C 61DC 1F25 E3FF 83E2" /* Ÿ.ç°Ñß2<aÜ.%ãÿƒâ */
- $"A49A DED4 4495 A948 5B70 9E5A 01F1 2431" /* ¤šÞÔD•©H[pžZ.ñ$1 */
- $"8EE5 2B54 2863 9041 FAE9 9E9F 1B85 E206" /* Žå+T(cAú鞟.…â. */
- $"4104 106C 5027 632A 8716 C3A5 F047 B3D5" /* A..lP'c*‡.Ã¥ðG³Õ */
- $"EE2B 19CD 2B75 17D8 DFB6 E2BF 491E A41F" /* î+.Í+u.Ø߶â¿I.¤. */
- $"BC48 3493 DEFB 453D 64DE DEA0 68DB EF5B" /* ¼H4“ÞûE=dÞÞ hÛï[ */
- $"1E69 8F3F C55C 1FF6 1823 1543 F483 DF20" /* .i?Å\.ö.#.Côƒß */
- $"F5B4 08F4 5D20 4DF0 7D7D 2007 2ACA 5B5E" /* õ´.ô] Mð}} .*Ê[^ */
- $"159F EF4A 505D 811D A8A3 5476 5539 B45B" /* .ŸïJP].¨£TvU9´[ */
- $"3113 1AC7 00F3 F1A7 E9E3 9E88 5D91 6CD5" /* 1..Ç.óñ§é㞈]‘lÕ */
- $"2CC0 F92B 2063 FF29 4B0E 775A 06EE 75CC" /* ,Àù+ cÿ)K.wZ.îuÌ */
- $"DA54 AC2F B72D 1C25 1E46 A4F8 C3E1 7D8D" /* ÚT¬/·-.%.F¤øÃá} */
- $"85AE BBE6 3DBE EC4A 35F7 3B36 1FBF BC38" /* …®»æ=¾ìJ5÷;6.¿¼8 */
- $"2DC1 785C D644 2BED AB51 1950 2643 8730" /* -Áx\ÖD+í«Q.P&C‡0 */
- $"2AE9 E4EB 1B8E 8F90 BA0C FF2F 6F65 5F28" /* *éäë.Žº.ÿ/oe_( */
- $"1A3F 9398 FF20 01A2 69A0 02C9 8D1B C3EA" /* .?“˜ÿ .¢i .É.Ãê */
- $"A600 6417 3CA3 9E84 93EF 063D 59DC 702C" /* ¦.d.<£ž„“ï.=YÜp, */
- $"959D C3A6 B1ED DEF1 F321 5BA6 FCCD 7762" /* •Ã¦±íÞñó![¦üÍwb */
- $"6C23 7398 AA59 4BBA 0052 B8A7 0608 1AAC" /* l#s˜ªYKº.R¸§...¬ */
- $"5B2E AF60 17F4 278E 6433 6F75 7839 CED2" /* [.¯`.ô'Žd3oux9ÎÒ */
- $"F32E 5D7D 9D40 B145 4CFB A25C D8D7 4BCB" /* ó.]}@±ELû¢\Ø×KË */
- $"956D 88DD 4B92 64BF 4CD4 AFD5 6E56 9859" /* •mˆÝK’d¿LÔ¯ÕnV˜Y */
- $"ABEF BB40 AD0E 6E1F 9B3B 16A3 D9D3 58DF" /* «ï»@­.n.›;.£ÙÓXß */
- $"584E C303 1DAD D18B 6082 9C29 88EB 5163" /* XNÃ..­Ñ‹`‚œ)ˆëQc */
- $"A42D 061A 1570 64A9 0F1C E00D 56D9 E0CB" /* ¤-...pd©..à.VÙàË */
- $"7C66 799C 8EB4 BFCA CF5C CFC2 B611 4F0C" /* |fyœŽ´¿ÊÏ\϶.O. */
- $"AFDE 008C 3580 A270 0C1A 3737 50A1 9A89" /* ¯Þ.Œ5€¢p..77P¡š‰ */
- $"2546 BB2C 62A0 57BE 59CB C00A 1EE9 0F1D" /* %F»,b W¾YËÀÂ.é.. */
- $"C528 40D4 EA69 D281 AED4 B078 F27A 0B42" /* Å(@ÔêiÒ®Ô°xòz.B */
- $"7AD2 DADD 146B 7FFF 223D 6A74 2041 4FCF" /* zÒÚÝ.k.ÿ"=jt AOÏ */
- $"46E1 60C8 9ABE 841E E18D 1712 DB6D 902B" /* Fá`Èš¾„.á..Ûm+ */
- $"7BE6 56DA 7E4B 1704 A373 2802 B120 0184" /* {æVÚ~K..£s(.± .„ */
- $"0681 4499 2739 CE73 9CE8 99D8 C352 337C" /* .D™'9Îsœè™ØÃR3| */
- $"06AB BB71 6257 16EF B535 4972 8C2F 2EE0" /* .«»qbW.ïµ5IrŒ/.à */
- $"85CC 8431 D867 47EE CC43 6E87 A485 2316" /* …Ì„1ØgGîÌCn‡¤…#. */
- $"4927 AE22 C12D 49CE 739C E61C 97D0 99CC" /* I'®"Á-IÎsœæ.—Ð™Ì */
- $"3DC5 F26B 1A31 E742 3E56 464B 2944 108E" /* =Åòk.1çB>VFK)D.Ž */
- $"CB0C F4C7 E144 47E1 47C1 F6BD 8089 21DB" /* Ë.ôÇáDGáGÁö½€‰!Û */
- $"8279 4533 01BF B9CC C444 AD53 5F75 D706" /* ‚yE3.¿¹ÌÄD­S_u×. */
- $"3FDD CA27 5D6C 9F54 1CCF F838 38E4 B2E4" /* ?ÝÊ']lŸT.Ïø88ä²ä */
- $"F9FF 429F 59FE D27B 4A5E A69F 2C21 38F6" /* ùÿBŸYþÒ{J^¦Ÿ,!8ö */
- $"5A74 D405 2FEE 50B8 E5F1 C489 2693 5B33" /* ZtÔ./îP¸åñĉ&“[3 */
- $"D2C2 9DEC 68ED F55C 1FAC 1401 8D66 795A" /* ÒÂìhíõ\.¬..fyZ */
- $"F5F3 27A3 5874 6681 9AC6 F41D A4E6 40DA" /* õó'£XtfšÆô.¤æ@Ú */
- $"3EE5 CCEE 340C AF72 87FD 6B2A EB94 88EC" /* >åÌî4.¯r‡ýk*딈ì */
- $"A61D A536 7AC2 C6B8 85D9 CEBD 146C 83B5" /* ¦.¥6zÂƸ…Ùν.lƒµ */
- $"F5E0 A3C7 B524 BC64 B6B5 91A6 BF91 C547" /* õà£Çµ$¼d¶µ‘¦¿‘ÅG */
- $"BD87 811F D58E 8E51 BB89 FA6C 5257 33D9" /* ½‡.ÕŽŽQ»‰úlRW3Ù */
- $"A964 A4AB 3BB9 9608 BECC 0D9C D6B9 3D3A" /* ©d¤«;¹–.¾Ì.œÖ¹=: */
- $"CB64 28BE 3B07 6318 DF9D C134 9F16 567A" /* Ëd(¾;.c.ßÁ4Ÿ.Vz */
- $"8127 5FFD F396 BA0C B86F AA17 2301 022A" /* '_ýó–º.¸oª.#..* */
- $"3742 CE95 B1AF F858 C503 8156 35E0 8F2C" /* 7BΕ±¯øXÅ.V5à, */
- $"67D7 2D41 1F0B 5284 1535 AF16 6540 FB65" /* g×-A..R„.5¯.e@ûe */
- $"65BC 5F6B 136D 73A5 1C5D 3D92 FF5F 8494" /* e¼_k.ms¥.]=’ÿ_„” */
- $"FDBF E0C5 821F 072A 0EEB B855 6B42 CEE8" /* ý¿àÅ‚..*.ë¸UkBÎè */
- $"ABEE 381E 894E DF1E 29DD 4B78 3F0A F5EB" /* «î8.‰Nß.)ÝKx?Âõë */
- $"B9F8 61B8 8266 3BD8 A2AC 5BC1 38F4 5098" /* ¹øa¸‚f;Ø¢¬[Á8ôP˜ */
- $"3951 2437 1798 7BF9 EA00 12BF CF3E 9166" /* 9Q$7.˜{ùê..¿Ï>‘f */
- $"8253 6FF0 B942 70D7 C729 0866 33F7 3484" /* ‚Soð¹Bp×Ç).f3÷4„ */
- $"ADF8 C3D2 4EF6 1DF4 0E6F 8E64 B470 1D5E" /* ­øÃÒNö.ô.oŽd´p.^ */
- $"F311 9BD1 EDE1 BA5D 7601 2053 D70A FDCD" /* ó.›Ñíáº]v. S×ÂýÍ */
- $"82C0 1BDA A35C FAD2 67AD E569 7851 10A7" /* ‚À.Ú£\úÒg­åixQ.§ */
- $"EF9A 3533 EC03 E813 08B6 D984 1A1D 3DC0" /* ïš53ì.è..¶Ù„..=À */
- $"7C8E E03E 4A44 03E4 7894 FF1F 080E 2BFD" /* |Žà>JD.äx”ÿ...+ý */
- $"EEB4 E64A C757 389B 5780 3AF8 248C 580D" /* î´æJÇW8›W€:ø$ŒX. */
- $"461B D417 66BA CEB2 2042 3C84 DAF9 C127" /* F.Ô.fºÎ² B<„ÚùÁ' */
- $"63E9 168C A9E3 D418 61E8 C46C CF01 F59B" /* cé.Œ©ãÔ.aèÄlÏ.õ› */
- $"4518 8833 3E62 5B14 BFD1 41A8 45D6 D311" /* E.ˆ3>b[.¿ÑA¨EÖÓ. */
- $"8431 80DB 1FD5 5839 DE81 BCD9 EAFB EE26" /* „1€Û.ÕX9Þ¼Ùêûî& */
- $"33DD 9E73 0B6F F957 26EE E7BA E0DA FF22" /* 3Ýžs.oùW&îçºàÚÿ" */
- $"EA50 24BF A182 089D 749A 6AAF BFF2 224D" /* êP$¿¡‚.tšj¯¿ò"M */
- $"30D4 11D0 E07A A012 587A 0633 92B4 CBFC" /* 0Ô.Ðàz .Xz.3’´Ëü */
- $"8E1B E5AC 9025 A74D 2819 3F9D 8132 B795" /* Ž.å¬%§M(.?2·• */
- $"458E 4651 1589 158D D24C A5B0 CBFA 359E" /* EŽFQ.‰.ÒL¥°Ëú5ž */
- $"BDB0 E4FB BFE3 5854 3E88 A646 71B1 9CB2" /* ½°äû¿ãXT>ˆ¦Fq±œ² */
- $"BB4E BA8E E170 8CBF C1F5 3141 F537 C0FA" /* »NºŽápŒ¿Áõ1Aõ7Àú */
- $"9780 6448 BA3B 94D6 3E8B 7AF0 0B5A C7A2" /* —€dHº;”Ö>‹zð.ZÇ¢ */
- $"4D05 C6BB 7F47 7102 F66E E4E8 3681 1C97" /* M.Æ».Gq.önäè6.— */
- $"0996 4491 F713 2A24 3756 2715 4B55 762F" /* Æ–D‘÷.*$7V'.KUv/ */
- $"78CB 2608 0563 73F7 5626 9F35 0C54 6822" /* xË&..cs÷V&Ÿ5.Th" */
- $"F061 792A 4AFC 163A 9F83 8F82 638B 524D" /* ðay*Jü.:Ÿƒ‚c‹RM */
- $"C21C 3735 DB76 6F4B 01F2 3E7E 5755 5945" /* Â.75ÛvoK.ò>~WUYE */
- $"6149 AAEE 1A88 7748 DC47 79E4 0660 318C" /* aIªî.ˆwHÜGyä.`1Œ */
- $"AA94 E92D 9879 C9C1 AC17 C828 7BBB 997A" /* ª”é-˜yÉÁ¬.È({»™z */
- $"315E 858F F31D 3522 A6D2 B3BD E548 DBA2" /* 1^…ó.5"¦Ò³½åHÛ¢ */
- $"3274 749B 11C1 9570 D715 0350 4CC4 6820" /* 2tt›.Á•p×..PLÄh */
- $"560A 8542 A38D 913B 3863 FF5C 97F2 9BA5" /* VÂ…B£‘;8cÿ\—ò›¥ */
- $"893F 6C9B 15A2 EE40 BCD6 2676 80A9 AC89" /* ‰?l›.¢î@¼Ö&v€©¬‰ */
- $"9054 849D 859C 8DCD 181B 64F4 6D7B 71B4" /* T„…œÍ..dôm{q´ */
- $"FBD3 0C84 21D4 CC6C CF84 F40A A3CD C958" /* ûÓ.„!ÔÌlÏ„ô£ÍÉX */
- $"928E 97E5 346C 6497 2888 7903 5B0B 3277" /* ’Ž—å4ld—(ˆy.[.2w */
- $"B4D6 9AA4 86C3 C691 CA1A 3C92 FCFB 02DE" /* ´Öš¤†ÃÆ‘Ê.<’üû.Þ */
- $"A25E 5C5C C6A8 1CE2 F5B5 88AB 3673 F912" /* ¢^\\ƨ.âõµˆ«6sù. */
- $"96AF E6BC 67FF 40CC 068D C6E3 8435 48AF" /* –¯æ¼gÿ@Ì.Æã„5H¯ */
- $"B929 F509 0F59 3410 A9A6 1087 8352 11EC" /* ¹)õÆ.Y4.©¦.‡ƒR.ì */
- $"23CF CD2E 3F05 487E 0740 9BE7 236F 56FB" /* #ÏÍ.?.H~.@›ç#oVû */
- $"D0F4 677F 9514 C6E9 50BB A61A 6135 73FB" /* Ðôg.•.ÆéP»¦.a5sû */
- $"37AA FA5C 0967 671C 8485 5326 6EB5 4955" /* 7ªú\Ægg.„…S&nµIU */
- $"1AAE 5FCE C271 D992 9E8C B0DF 7795 E0F2" /* .®_ÎÂqÙ’žŒ°ßw•àò */
- $"A17A B50F E53A FE12 756F D1A1 5CE1 7C9B" /* ¡zµ.å:þ.uoÑ¡\á|› */
- $"D185 2C1A 9224 BC62 5C98 FA35 1649 6EA7" /* Ñ…,.’$¼b\˜ú5.In§ */
- $"4C7C C191 DF92 9D7A 6FE9 71D9 9A11 5A19" /* L|Á‘ß’zoéqÙš.Z. */
- $"214D F951 38FA C459 E39A 6DAE 1253 31DF" /* !MùQ8úÄYãšm®.S1ß */
- $"B335 3337 39D2 7591 BFC1 31E6 887A 8BAB" /* ³5379Òu‘¿Á1æˆz‹« */
- $"ECCD 7A58 8E4A AD65 A7E1 5FC6 8EB0 DA82" /* ìÍzXŽJ­e§á_ÆŽ°Ú‚ */
- $"0F81 6849 5CE5 AB32 B763 1227 3F4C 5691" /* .hI\å«2·c.'?LV‘ */
- $"43C7 DD24 E8D9 C4F3 7BB0 4666 7A24 1C5B" /* CÇÝ$èÙÄó{°Ffz$.[ */
- $"F57D 719F 2BDB 3794 66BA BBB6 9D8D A662" /* õ}qŸ+Û7”fº»¶¦b */
- $"CF99 4DDC E533 96D6 EEE0 3FC7 BFB8 B1B7" /* Ï™MÜå3–Öîà?Ç¿¸±· */
- $"9AE3 57C7 E1A8 B1F8 6C5C 3F0D 19C1 812D" /* šãWÇᨱøl\?..Á- */
- $"8D31 C88B C396 B5E7 3CE0 4E2C AE73 7876" /* 1ȋÖµç<àN,®sxv */
- $"0436 A295 BEC6 BDF1 C604 C41C 94E6 E7C1" /* .6¢•¾Æ½ñÆ.Ä.”æçÁ */
- $"AC78 356A B92A DB37 3360 3372 6638 0C5C" /* ¬x5j¹*Û73`3rf8.\ */
- $"F388 7CDE 4045 060F E713 C4C3 321E E08B" /* óˆ|Þ@E..ç.ÄÃ2.à‹ */
- $"0810 71EE A6AB C032 2B85 C34C 2671 8143" /* ..qÀ2+…ÃL&qC */
- $"AFDE 07D1 A40C D86A ADBE B961 EAA3 54BD" /* ¯Þ.Ѥ.Øj­¾¹aê£T½ */
- $"804D 6FA9 AA3F 7FBE BCD9 E785 A230 EA4E" /* €Mo©ª?.¾¼Ùç…¢0êN */
- $"1C08 1DF6 8373 7754 5039 7854 1192 1512" /* ...öƒswTP9xT.’.. */
- $"B956 E9A7 575E E3DB F5F9 4B02 F739 F2BB" /* ¹Vé§W^ãÛõùK.÷9ò» */
- $"91B2 73E1 3D19 EBB6 AD2F 291C 5BAC 5EEA" /* ‘²sá=.붭/).[¬^ê */
- $"EEDF 8DA7 5FCA 8E8C 952D 8FD0 441C 5BA4" /* îߧ_ÊŽŒ•-ÐD.[¤ */
- $"8AF6 21BE 1FAF DAE3 DADD EA91 EF73 58A0" /* Šö!¾.¯ÚãÚÝê‘ïsX  */
- $"29E6 89B2 E279 B02A D092 DD08 6187 9095" /* )扲ây°*Ð’Ý.a‡• */
- $"5C85 C903 0DD2 9ED3 538B D9BB E936 8ABB" /* \…É..ÒžÓS‹Ù»é6Š» */
- $"E203 DD03 2944 5317 7BC3 0297 2125 F198" /* â.Ý.)DS.{Ã.—!%ñ˜ */
- $"D117 8DDB E382 71F8 D0A7 14B1 6D7A A0EB" /* Ñ.Ûã‚qøЧ.±mz ë */
- $"7C6F 7651 D2EC ECA7 F670 D09F 6CF6 30DB" /* |ovQÒìì§öpПlö0Û */
- $"0830 39B5 BC45 3915 4054 4490 A7BA 5CEC" /* .09µ¼E9.@TD§º\ì */
- $"D37B FBC2 7890 B18F DEEA 4966 D46D 5FD2" /* Ó{ûÂx±ÞêIfÔm_Ò */
- $"7811 AAD0 8EBF FB40 0F30 D8A4 2B71 5A03" /* x.ªÐŽ¿û@.0ؤ+qZ. */
- $"636A C360 C889 891D D420 A828 E337 41CC" /* cjÃ`ȉ‰.Ô ¨(ã7AÌ */
- $"3314 5473 B91F 7B78 2B3B AC7A 1127 F2DE" /* 3.Ts¹.{x+;¬z.'òÞ */
- $"E997 2101 6008 26AE 43D5 7CE7 8532 B9CE" /* é—!.`.&®CÕ|ç…2¹Î */
- $"A81A 710E 5D87 49D7 3EF6 65A3 D533 977E" /* ¨.q.]‡I×>öe£Õ3—~ */
- $"7BE9 0CA7 8B28 9ADA AF4F 45A5 99BD E21D" /* {é.§‹(šÚ¯OE¥™½â. */
- $"D4B1 BB33 2508 C8D1 31E5 E9FB F917 A8E1" /* Ô±»3%.ÈÑ1åéûù.¨á */
- $"2955 9008 F531 9010 575A 3AFB 59F4 CD63" /* )U.õ1.WZ:ûYôÍc */
- $"3EEE 2409 BCD4 E5F1 1418 6155 B6D7 A94B" /* >î$ƼÔåñ..aU¶×©K */
- $"1D48 79A8 2F32 0770 476B CE28 023A DC86" /* .Hy¨/2.pGkÎ(.:܆ */
- $"E008 813B E64A 39F5 58CE 3E75 DAA6 BD7A" /* à.;æJ9õXÎ>uÚ¦½z */
- $"1528 FF50 0738 C132 5569 3C99 C4BC A20F" /* .(ÿP.8Á2Ui<™Ä¼¢. */
- $"6DED 9310 6FE1 8BE4 BF4D D0B1 993E 0FD3" /* mí“.oá‹ä¿Mб™>.Ó */
- $"4938 1302 E4A8 FDA2 A7D2 4615 CD89 1E52" /* I8..ä¨ý¢§ÒF.͉.R */
- $"4160 51F8 BABB FEED 4281 0E0C 31CD 91D7" /* A`Qøº»þíB..1Í‘× */
- $"C7CF E302 E155 4188 0F06 097F 6906 2EC9" /* ÇÏã.áUAˆ..Æ.i..É */
- $"BE00 A1FB 0D99 8FB1 3B3D E3D3 70B8 4296" /* ¾.¡û.™±;=ãÓp¸B– */
- $"F199 E066 15B5 920C 38A2 695F F2E8 81E1" /* ñ™àf.µ’.8¢i_òèá */
- $"E0EC 34E5 97B3 9580 459F A2D9 E267 B847" /* àì4å—³•€EŸ¢Ùâg¸G */
- $"E302 3AA0 8631 8C61 5F8E 88DE 2FBB 394B" /* ã.: †1Œa_ŽˆÞ/»9K */
- $"B9EC 234B 6515 BDF3 BA80 AA30 3D50 2F90" /* ¹ì#Ke.½óº€ª0=P/ */
- $"C26A D743 2198 707A 2DC1 9C64 1647 1FA3" /* Âj×C!˜pz-Áœd.G.£ */
- $"43A2 B1C7 C95D 1E19 9650 E616 F24B C118" /* C¢±ÇÉ]..–Pæ.òKÁ. */
- $"FB68 CE23 485E BF50 ACF8 F669 B5A3 92AA" /* ûhÎ#H^¿P¬øöiµ£’ª */
- $"5625 BF48 8584 A6E7 DAC0 E203 2AF0 89A0" /* V%¿H…„¦çÚÀâ.*ð‰  */
- $"DB92 4924 9249 1BF5 D855 0470 51D0 AAE2" /* Û’I$’I.õØU.pQЪâ */
- $"A1E5 FBC9 CB80 1798 2EB3 EB1E 9FD4 46E7" /* ¡åûÉË€.˜.³ë.ŸÔFç */
- $"63DB F02E 204B D35F 54DE 0FD3 2F81 FB63" /* cÛð. KÓ_TÞ.Ó/ûc */
- $"9CEC 37F1 C9FF 5B63 B13D BFBD 1169 0415" /* œì7ñÉÿ[c±=¿½.i.. */
- $"0E97 DA89 25E3 92C7 01F5 50E6 2181 A536" /* .—Ú‰%ã’Ç.õPæ!¥6 */
- $"4020 C49B 1977 1BF5 5226 FD7D 668A D76F" /* @ Ä›.w.õR&ý}fŠ×o */
- $"2954 58F1 F44F 2935 F136 18BD C844 05FD" /* )TXñôO)5ñ6.½ÈD.ý */
- $"E325 9012 9E92 6EC3 E822 D06F A958 C54C" /* ã%.ž’nÃè"Ðo©XÅL */
- $"6A4D 0A98 093C 481D 1424 7964 E810 7A60" /* jM˜Æ<H..$ydè.z` */
- $"F2C0 8287 A7F4 B307 FBDF 2550 567E 01EA" /* òÀ‚‡§ô³.ûß%PV~.ê */
- $"2C45 4614 9A0A 04E8 397B 3DEC 6CDA CA95" /* ,EF.šÂ.è9{=ìlÚÊ• */
- $"B754 699A FF29 B46B D6E3 BB8C 153C AEC0" /* ·Tišÿ)´kÖ㻌.<®À */
- $"BEFF 46AD 744B B945 4C07 F7F7 178D 059E" /* ¾ÿF­tK¹EL.÷÷..ž */
- $"2E80 10C4 6DD6 F19E B649 73D6 8C57 7A6C" /* .€.ÄmÖñž¶IsÖŒWzl */
- $"45DE 3D43 22DE C54A DFCD 64EA 9D77 1AC6" /* EÞ=C"ÞÅJßÍdêw.Æ */
- $"E15E A9A7 0D83 D53C 100B EC25 2B93 1D27" /* á^©§.ƒÕ<..ì%+“.' */
- $"367A 864E D9C4 F0B9 DF5C 538D B2C0 24EE" /* 6z†NÙÄð¹ß\S²À$î */
- $"46E7 424C 2127 6BED B492 3354 86C9 D855" /* FçBL!'kí´’3T†ÉØU */
- $"317B 6BE2 8205 C07C 9A42 03E4 D6B0 0F93" /* 1{kâ‚.À|šB.äÖ°.“ */
- $"4400 AFF0 AE8C D6D6 6729 AEBE 9CDE 5C69" /* D.¯ð®ŒÖÖg)®¾œÞ\i */
- $"D95C 01A0 28AF 1E57 B12C CA6D F010 ED89" /* Ù\. (¯.W±,Êmð.í‰ */
- $"4C46 38AA BAFC D67E 9E98 C6CA 85E4 433E" /* LF8ªºüÖ~ž˜ÆÊ…äC> */
- $"C450 03B7 E8DE 17B3 9CE7 02E1 BE72 100B" /* ÄP.·èÞ.³œç.á¾r.. */
- $"2EF5 787D 0D12 FC3B 855A 3F97 1850 05EF" /* .õx}..ü;…Z?—.P.ï */
- $"A05D 7CC2 405B BA6D 9175 7C99 BE1C 2370" /*  ]|Â@[ºm‘u|™¾.#p */
- $"1F57 2085 13F8 B672 728D 1152 8232 1EE4" /* .W ….ø¶rr.R‚2.ä */
- $"A666 BFD0 06A8 6CFF 3D73 D895 5968 A54A" /* ¦f¿Ð.¨lÿ=sØ•Yh¥J */
- $"3219 63AB D4CD 8E7D 52F3 D260 CE4D E329" /* 2.c«ÔÍŽ}RóÒ`ÎMã) */
- $"F554 C837 34CC 2866 FA1E 1F34 B209 B8C3" /* õTÈ74Ì(fú..4²Æ¸Ã */
- $"097B 8DBC 8788 F621 2A57 5468 5FD8 852B" /* Æ{¼‡ˆö!*WTh_Ø…+ */
- $"08A9 45F3 71A8 A26B F63C 2DB1 750F A833" /* .©Eóq¨¢kö<-±u.¨3 */
- $"4767 6D8A B551 FF10 9E54 AD5D EE2E 2207" /* GgmŠµQÿ.žT­]î.". */
- $"44EA 0D21 75D4 779D E96D 49FF 47CE D775" /* Dê.!uÔwémIÿGÎ×u */
- $"D7B0 2380 5F1C 4185 EF0B BECB 1A55 9696" /* ×°#€_.A…ï.¾Ë.U–– */
- $"81B8 94F2 4F5B 07D8 D5EC 9E2A 049D 5E87" /* ¸”òO[.ØÕìž*.^‡ */
- $"2601 FB44 4AD5 C57B A7B0 8088 B723 134E" /* &.ûDJÕÅ{§°€ˆ·#.N */
- $"0B8A 375E B972 F34F F25A 2B68 3F15 4496" /* .Š7^¹róOòZ+h?.D– */
- $"5734 FE10 D742 67F9 9FFF 639C FAFD 23DB" /* W4þ.×BgùŸÿcœúý#Û */
- $"B90C F402 17F0 81C6 2656 EFD0 E011 C866" /* ¹.ô..ðÆ&VïÐà.Èf */
- $"15C8 4927 3415 BEC1 7876 E693 74CB DBEA" /* .ÈI'4.¾Áxvæ“tËÛê */
- $"7206 2246 23EC DCCA 51CD 72C1 8C41 1B85" /* r."F#ìÜÊQÍrÁŒA.… */
- $"AE9B 6FA5 4286 03FB 7000 D94F 5A8B 8A85" /* ®›o¥B†.ûp.ÙOZ‹Š… */
- $"2F34 7575 E7AB 08FF 3CBD 328D D95D BDF5" /* /4uuç«.ÿ<½2Ù]½õ */
- $"8070 0FAD B573 A91E 5F83 D32D 3337 A5B7" /* €p.­µs©._ƒÓ-37¥· */
- $"C6A7 3048 8D7C 3F01 F6BF 1BAB D684 0585" /* Ƨ0H|?.ö¿.«Ö„.… */
- $"798A A28D 68A6 4993 22BC F35C E3A7 BABE" /* yŠ¢h¦I“"¼ó\㧺¾ */
- $"0D5B 7E43 2B91 5DA6 6821 0495 4B22 33C0" /* .[~C+‘]¦h!.•K"3À */
- $"1217 1302 A7EB 1093 C8BD 3622 F0FD 14C3" /* ....§ë.“Ƚ6"ðý.à */
- $"EDBA 60FA B4C2 07D5 6D80 C177 9C23 24FE" /* íº`ú´Â.Õm€Áwœ#$þ */
- $"C9E7 77A7 1945 4C1A 8945 129A 2581 498D" /* Éçw§.EL.‰E.š%I */
- $"F2BD 5AD6 EF89 4D80 3EC2 DA29 E093 A726" /* ò½ZÖï‰M€>ÂÚ)à“§& */
- $"88F1 0796 E9F0 8F36 D342 7AD3 DEC2 2CCA" /* ˆñ.–éð6ÓBzÓÞÂ,Ê */
- $"45B9 35A0 DE31 D18B 2954 C38C 4B3A EEA2" /* E¹5 Þ1Ñ‹)TÃŒK:î¢ */
- $"5CD5 333D 6C59 23C7 17B3 C98C 65EE 8117" /* \Õ3=lY#Ç.³ÉŒeî. */
- $"22A2 574D D223 581B D09B 6473 3F85 6E2A" /* "¢WMÒ#X.Лds?…n* */
- $"81B5 F600 CAB6 1A02 3B24 D726 4344 536F" /* µö.ʶ..;$×&CDSo */
- $"99AB 09C8 96EA B41B 01C9 7AC8 9478 B8AB" /* ™«ÆÈ–ê´..ÉzÈ”x¸« */
- $"69E3 1BF1 1100 AFF3 C59C 01FB 8EF9 047D" /* iã.ñ..¯óÅœ.ûŽù.} */
- $"21EF 11DE D2CA BEE2 8372 5DDB C39C DE6E" /* !ï.ÞÒʾâƒr]ÛÃœÞn */
- $"B652 35FE FDFB F1E8 2E91 778A 86C3 3117" /* ¶R5þýûñè.‘wŠ†Ã1. */
- $"87D8 A7D5 7862 68B7 30C1 3B32 D209 0256" /* ‡Ø§Õxbh·0Á;2ÒÆ.V */
- $"2BF7 DFEF 17C3 FC30 EF1D 9327 7041 FC3C" /* +÷ßï.Ãü0ï.“'pAü< */
- $"674F 3069 DAB2 0EA5 BB48 DC2C DC66 F660" /* gO0iÚ².¥»HÜ,Üfö` */
- $"9C9B C7C8 3734 C68B 7D5A 60A1 DF3D D3A8" /* œ›ÇÈ74Æ‹}Z`¡ß=Ó¨ */
- $"E60C D15A 11C7 FB3B F75A 358E A7F7 16CB" /* æ.ÑZ.Çû;÷Z5Ž§÷.Ë */
- $"67B5 097E E2A2 DE6C E40A FD52 8F75 43EF" /* gµÆ~â¢ÞläÂýRuCï */
- $"F5DF 5A51 BBF5 A074 791F F54F 9724 23C3" /* õßZQ»õ ty.õO—$#Ã */
- $"F5E6 C4A3 E22C 1E06 3B71 A9A2 1C17 0109" /* õæÄ£â,..;q©¢...Æ */
- $"1B59 2742 AB03 0497 3E5A AD73 7FD3 DA51" /* .Y'B«..—>Z­s.ÓÚQ */
- $"9F17 A10E B9CF 7503 3395 8788 9D9D 4A58" /* Ÿ.¡.¹Ïu.3•‡ˆJX */
- $"F9B8 4A61 3DDA 7489 8086 9EAC 4D7D 62DD" /* ù¸Ja=Út‰€†ž¬M}bÝ */
- $"BF8B 9462 1CC0 6912 69BE 3BFE FED7 3174" /* ¿‹”b.Ài.i¾;þþ×1t */
- $"CAA6 A806 FF59 B963 ABEE 508B F428 D15C" /* ʦ¨.ÿY¹c«îP‹ô(Ñ\ */
- $"82FC BA30 6907 C572 F2BD C0DB E9A2 44AF" /* ‚üº0i.Årò½ÀÛé¢D¯ */
- $"EED6 81F7 C602 F802 0374 CD1D 0F41 5E2E" /* îÖ÷Æ.ø..tÍ..A^. */
- $"F54F E7AB C492 54F8 C570 48A6 1603 35D3" /* õOç«Ä’TøÅpH¦..5Ó */
- $"EA1A 6A6D FD79 27E3 F928 4E16 3A2D 43FE" /* ê.jmýy'ãù(N.:-Cþ */
- $"6C3D AFC6 FA1C 578C 7BA9 7343 5B2C 7BB9" /* l=¯Æú.WŒ{©sC[,{¹ */
- $"0614 915A 24C4 CAC1 A2D3 0EAF EAE8 7257" /* ..‘Z$ÄÊÁ¢Ó.¯êèrW */
- $"EA2D 1ED2 3FFE 26A7 3E28 28D0 1AE1 D790" /* ê-.Ò?þ&§>((Ð.á× */
- $"A25D 1C6C BA20 E196 1EEC 9720 92EE 6E62" /* ¢].lº á–.ì— ’înb */
- $"E218 5609 944E 9A2E 9228 117A 6065 93FF" /* â.VÆ”Nš.’(.z`e“ÿ */
- $"2B32 B2C1 7876 E657 E39E 8641 F202 62B4" /* +2²ÁxvæW㞆Aò.b´ */
- $"20C5 99D9 F9E5 7D83 D807 EDB7 9A34 475B" /* Å™Ùùå}ƒØ.í·š4G[ */
- $"4F45 9AE8 ACD6 3098 A0C2 8D14 CBDB 9A2B" /* OEšè¬Ö0˜ Â.ËÛš+ */
- $"0EF7 CB30 8B49 169F 1ECD 6F33 F063 65DA" /* .÷Ë0‹I.Ÿ.Ío3ðceÚ */
- $"2A2F F0B0 EE29 91F7 CA11 748C 5E4E A447" /* *.ð°î)‘÷Ê.tŒ^N¤G */
- $"0F7F 4B32 DB7A 366C 27C4 F178 33B7 5E9B" /* ..K2Ûz6l'Äñx3·^› */
- $"BAAF 29CD A3EF 39BB 5FAD AD2B 5DCA 09E8" /* º¯)Í£ï9»_­­+]ÊÆè */
- $"DB9A DD07 84DD 870E 2A4C 850B BD04 7F9A" /* ÛšÝ.„݇.*L….½..š */
- $"1354 1DAA 0819 F583 1F47 5905 6597 5F07" /* .T.ª..õƒ.GY.e—_. */
- $"7ED6 DFFA BA65 FA6C D01D F65F F833 D479" /* ~ÖßúºeúlÐ.ö_ø3Ôy */
- $"BFD3 F3D8 57BB 3718 EBC8 5A2D 732E 464E" /* ¿ÓóØW»7.ëÈZ-s.FN */
- $"6B46 9512 778B 8066 D5DA D21A 819D 5384" /* kF•.w‹€fÕÚÒ.S„ */
- $"A84C AE56 92E2 2E9A 4D27 8A21 E02D 67FC" /* ¨L®V’â.šM'Š!à-gü */
- $"EAA4 B3D5 9306 1D06 CC9A 84C8 D6C4 C7E1" /* ꤳՓ...Ìš„ÈÖÄÇá */
- $"4F47 E168 43F0 6EB1 9276 ED11 2C29 F1CB" /* OGáhCðn±’ví.,)ñË */
- $"90AB 1975 3405 422B 78EC 7776 FA5C 0A2C" /* «.u4.B+xìwvú\Â, */
- $"F4B1 4F40 32CE D338 8911 EAB4 4CFC 7765" /* ô±O@2ÎÓ8‰.ê´Lüwe */
- $"D9ED C10E 114B 0909 1122 6832 A41E 3365" /* ÙíÁ..KÆÆ."h2¤.3e */
- $"96EF FC81 A398 2FE8 0464 5D18 0C9F C1AF" /* –ïü£˜/è.d]..ŸÁ¯ */
- $"8E6F 42CA BDC9 1DC4 770E 1C2E 01BD 62DB" /* ŽoBʽÉ.Äw....½bÛ */
- $"7798 4167 FC4F B27D D7E6 32CE 7F95 954F" /* w˜AgüO²}×æ2Î.••O */
- $"653C 833E B4F1 C6C2 307E 0796 686E 6F5C" /* e<ƒ>´ñÆÂ0~.–hno\ */
- $"6EE2 6260 4C0B 5329 36D8 839E 5F08 319C" /* nâb`L.S)6؃ž_.1œ */
- $"4CAE 85DE 6B64 F427 1358 C9FF 57B9 AF78" /* L®…Þkdô'.XÉÿW¹¯x */
- $"332B 82A6 0EBF 0F83 7A3C 8004 1402 6A12" /* 3+‚¦.¿.ƒz<€...j. */
- $"FEE8 1612 2D8A 47FE 5BDE 2714 B393 E32F" /* þè..-ŠGþ[Þ'.³“ã/ */
- $"013E BD7E 14FA 285D BF61 7CDA 3A92 734A" /* .>½~.ú(]¿a|Ú:’sJ */
- $"520E 978D 8736 6AA9 847B 05C9 F28B 3D9A" /* R.—‡6j©„{.Éò‹=š */
- $"9B2E 721C 9082 3EC1 362C D516 D306 1EB9" /* ›.r.‚>Á6,Õ.Ó..¹ */
- $"A95C EC63 3111 4ED2 054A EFF8 F26A 0E36" /* ©\ìc1.NÒ.Jïøòj.6 */
- $"7445 26A0 464F CEDC 924D B183 FAEF 28F7" /* tE& FOÎÜ’M±ƒúï(÷ */
- $"AF76 2DBA F15C 4F45 4BFD E003 CDC1 A878" /* ¯v-ºñ\OEKýà.ÍÁ¨x */
- $"6FB4 207C 2A45 1ED9 CE49 2495 F6A9 77E8" /* o´ |*E.ÙÎI$•ö©wè */
- $"E7FF 7FFF 7FFF 7FFF 70EC F373 E872 28BA" /* çÿ.ÿ.ÿ.ÿpìósèr(º */
- $"A0BB 38E4 AC79 94DA 6562 832A 9A7B EEA8" /*  »8ä¬y”Úebƒ*š{î¨ */
- $"6B09 FEA7 9249 2005 E7D1 D721 4761 B6DB" /* kÆþ§’I .çÑ×!Ga¶Û */
- $"6DB6 DB6D 98C5 C208 FD98 41AA F430 3EAE" /* m¶Ûm˜ÅÂ.ý˜Aªô0>® */
- $"7118 7229 50B1 07D8 C5CA 010D 4AB4 DE82" /* q.r)P±.ØÅÊ..J´Þ‚ */
- $"53D3 E184 6561 DE5F 7236 BBF5 550D 4A83" /* SÓá„eaÞ_r6»õU.Jƒ */
- $"555B 5C0F 9C0E F052 0080 F4AC 3912 DD30" /* U[\.œ.ðR.€ô¬9.Ý0 */
- $"47C9 B77E C632 15D7 8EB6 CD51 0454 A805" /* GÉ·~Æ2.׎¶ÍQ.T¨. */
- $"2DAD F687 6CB7 B37F 2289 759F F7D5 8839" /* -­ö‡l·³."‰uŸ÷Õˆ9 */
- $"B3E6 BCA5 AA89 9D9D 599A 5BDD 54B9 7F7D" /* ³æ¼¥ª‰Yš[ÝT¹.} */
- $"2770 11ED 2217 C539 0204 16FF 728A C52A" /* 'p.í".Å9...ÿrŠÅ* */
- $"2D24 5FC7 E1D7 C47E 1DE8 C3F0 EA38 E730" /* -$_Çá×Ä~.èÃðê8ç0 */
- $"2D9D 0AC5 991A F5DD 38EC 007B A963 8B4D" /* -ÂÅ™.õÝ8ì.{©c‹M */
- $"51BA A9FC AE25 908A 1B70 9145 EBA2 38C4" /* Qº©ü®%Š.p‘Eë¢8Ä */
- $"168F 70BB 10A5 CAA5 A249 1974 03F3 AB57" /* .p».¥Ê¥¢I.t.ó«W */
- $"3611 30C5 1F14 529F 040A A8EC EBDF F2FF" /* 6.0Å..RŸ.¨ìëßòÿ */
- $"232B 83FE C2D0 59D9 93C2 2A8A F86A 997F" /* #+ƒþÂÐYÙ“Â*Šøj™. */
- $"3207 03A7 C406 E96C C96F 23F1 1490 95DF" /* 2..§Ä.élÉo#ñ.•ß */
- $"4024 67DC 3DE6 E1B1 EB60 1026 8786 531C" /* @$gÜ=æá±ë`.&‡†S. */
- $"9A51 378D EE86 881F 496C 8854 9459 7799" /* šQ7.IlˆT”Yw™ */
- $"11EC 4196 0C22 0F05 3762 D8F4 C348 7299" /* .ìA–."..7bØôÃHr™ */
- $"793E 0718 14D3 D09C C192 80E1 9F7C 5CFA" /* y>...ÓÐœÁ’€áŸ|\ú */
- $"429C 7960 2F8B 9063 C7E1 1447 7F52 D850" /* Bœy`/‹cÇá.G.RØP */
- $"B80A F1D8 BE98 DC3C 9C44 3AB7 3DA7 E08C" /* ¸Âñؾ˜Ü<œD:·=§àŒ */
- $"E7B6 07CE 2B69 C0E9 0C21 6133 1EC5 DAB5" /* ç¶.Î+iÀé.!a3.ÅÚµ */
- $"B079 413B FBA4 0259 78B8 DA3A E6D1 4AAC" /* °yA;û¤.Yx¸Ú:æÑJ¬ */
- $"2459 93C8 AD9A D69C AC40 5CF7 7385 1B18" /* $Y“È­šÖœ¬@\÷s….. */
- $"D67D 82BD 5E44 3DF8 5D2F E6D3 CE47 0191" /* Ö}‚½^D=ø]/æÓÎG.‘ */
- $"6E57 0F2F E8E8 9FF0 14BC 21F1 7720 6F34" /* nW./èèŸð.¼!ñw o4 */
- $"1EEE 5EF6 F8FD 5481 44E3 AB6B B06E 2556" /* .î^öøýTDã«k°n%V */
- $"6F07 AD65 FC95 7C32 7487 10A0 3C20 9CA7" /* o.­eü•|2t‡. < œ§ */
- $"B0EB F703 2D09 F0A6 D3FD 55F6 354B EDB0" /* °ë÷.-Æð¦ÓýUö5Kí° */
- $"179B B267 B9EB 8DA1 ED8E 7D0F 1AFF 4D50" /* .›²g¹ë¡íŽ}..ÿMP */
- $"C1C7 A686 586C 6A26 3B0B 4292 60A0 A804" /* ÁǦ†Xlj&;.B’` ¨. */
- $"04F6 5FDB 0F76 E2BC D680 20B5 46AE 399D" /* .ö_Û.vâ¼Ö€ µF®9 */
- $"CC54 82A4 1DCA 08E7 E2B4 6710 ABD8 FC18" /* ÌT‚¤.Ê.çâ´g.«Øü. */
- $"949B 7076 11CD 598E 2A8B 99FC CC28 EC17" /* ”›pv.ÍYŽ*‹™üÌ(ì. */
- $"451C DE31 F7F4 C47E 3ABB AF03 FDC6 D875" /* E.Þ1÷ôÄ~:»¯.ýÆØu */
- $"BD0C AB3E B78F F942 A53E E5F8 CA09 414D" /* ½.«>·ùB¥>åøÊÆAM */
- $"7544 D5B4 8367 3256 6D8C CB66 6DE7 E99C" /* uDÕ´ƒg2VmŒËfmçéœ */
- $"88E9 FCDC EB55 F67B 20E7 F44D 7616 6B29" /* ˆéüÜëUö{ çôMv.k) */
- $"124A C9AB 95C7 E9A8 209D EDA5 499F 2D2F" /* .JÉ«•Çé¨ í¥IŸ-/ */
- $"20E5 DE8C 2EEE 92AF 4BD6 484B 7E18 2D81" /* åÞŒ.î’¯KÖHK~.- */
- $"0502 F439 C742 BA21 693B 43C5 60DF 8BA0" /* ..ô9ÇBº!i;CÅ`ß‹  */
- $"9EAC 0A98 DFE4 DB4B 0BE1 E526 9B74 5982" /* ž¬Â˜ßäÛK.áå&›tY‚ */
- $"1817 EA6B 067A D3E4 8786 883D 26DB D361" /* ..êk.zÓ䇆ˆ=&ÛÓa */
- $"C40F 89F4 B31F 2AF3 1369 FDA9 889A 5620" /* Ä.‰ô³.*ó.iý©ˆšV */
- $"9AE7 4384 7184 9D7F 6C37 F79B 9422 ADF3" /* šçC„q„.l7÷›”"­ó */
- $"2BEA A620 14CF 0267 110E AB20 594B F1DA" /* +ê¦ .Ï.g..« YKñÚ */
- $"9D7F DB53 3723 1A4E 0DEC DF68 3A10 078F" /* .ÛS7#.N.ìßh:.. */
- $"8CA5 471B 4400 0975 92AA A351 8C66 5DDA" /* Œ¥G.D.Æu’ª£QŒf]Ú */
- $"0E4E C7B1 286F 2F7C E0EB 24CC 0A8B CAF8" /* .NDZ(o/|àë$Ì‹Êø */
- $"4F0F 75E5 CACF 26F5 0FFE 86A8 1E77 5F03" /* O.uåÊÏ&õ.þ†¨.w_. */
- $"A8B5 A544 F04B A521 B3FA 854A 64FA 70CD" /* ¨µ¥DðK¥!³ú…JdúpÍ */
- $"526F 97AE 807A 05FC 3F67 2471 61E5 2715" /* Ro—®€z.ü?g$qaå'. */
- $"5774 E452 7E4A CDDA 6E48 0DA2 04B3 3A29" /* WtäR~JÍÚnH.¢.³:) */
- $"DE10 8F75 3A3A 559D A881 B948 74F3 AB92" /* Þ.u::U¨¹Htó«’ */
- $"B154 0F88 A11B A00B 25ED 9A59 B894 618E" /* ±T.ˆ¡. .%íšY¸”aŽ */
- $"AD45 3D59 9C08 49EA 076C CD63 8F49 B714" /* ­E=Yœ.Iê.lÍcI·. */
- $"32B3 8743 2506 F55A C011 CBEF C94A 8606" /* 2³‡C%.õZÀ.ËïÉJ†. */
- $"EDE4 BE7D 2DC9 8830 6C23 91E0 0209 440C" /* íä¾}-Ɉ0l#‘à.ÆD. */
- $"9409 1457 6CA0 2201 8FF4 7573 54F8 CCEC" /* ”Æ.Wl ".ôusTøÌì */
- $"D201 4A3A 66A6 B191 4E14 4CB1 08B4 2100" /* Ò.J:f¦±‘N.L±.´!. */
- $"BCF2 3A0D 696F 4582 F8B0 3A60 2D09 E9A7" /* ¼ò:.ioE‚ø°:`-Æé§ */
- $"8E83 CF44 A16A 6516 31C1 B51E 2DFE BDAC" /* ŽƒÏD¡je.1Áµ.-þ½¬ */
- $"356B F402 856C BEA0 109C A125 A759 E580" /* 5kô.…l¾ .œ¡%§Yå€ */
- $"3501 F500 F252 9533 F180 6E7D 30A8 FD62" /* 5.õ.òR•3ñ€n}0¨ýb */
- $"7FD6 B4EB 9120 8504 493A DD87 D79A 0CB1" /* .Ö´ë‘ ….I:݇ך.± */
- $"B674 7010 830D 8A38 5B44 B11D 3632 3FA5" /* ¶tp.ƒ.Š8[D±.62?¥ */
- $"CE31 CE9A 1670 AF20 16F6 BDA6 4980 002E" /* Î1Κ.p¯ .ö½¦I€.. */
- $"3E9E 8AB0 8B1F 63C5 28C3 7914 2833 137F" /* >žŠ°‹.cÅ(Ãy.(3.. */
- $"0915 DD39 7D38 49A3 6054 B5DC 2509 EE11" /* Æ.Ý9}8I£`TµÜ%Æî. */
- $"D68A 5C2A C75B 5B9F 7A9A FF3A D06F 3331" /* ÖŠ\*Ç[[Ÿzšÿ:Ðo31 */
- $"29E6 A9F4 8AD5 E0D9 7FB9 84B1 F403 8910" /* )æ©ôŠÕàÙ.¹„±ô.‰. */
- $"1168 1270 19E2 E385 0353 0FFF 697F 96BE" /* .h.p.âã….S.ÿi.–¾ */
- $"EF55 21CA 25A1 CE5E 0CD7 03A9 094F 51FE" /* ïU!Ê%¡Î^.×.©ÆOQþ */
- $"5314 E59F 90EB 907A E37A DD9D 182A E41C" /* S.åŸëzãzÝ.*ä. */
- $"CFFB 7262 0D9E B904 8D95 2DE3 E02B F5CB" /* Ïûrb.ž¹.•-ãà+õË */
- $"BF61 6012 924E 50D3 2D8D 6C25 FC60 8D19" /* ¿a`.’NPÓ-l%ü`. */
- $"9855 8BF2 5400 0000 04E3 7684 B40E 9EE7" /* ˜U‹òT....ãv„´.žç */
- $"21F8 CB76 250B 7CE0 2605 7C84 7E9F F226" /* !øËv%.|à&.|„~Ÿò& */
- $"6B94 0DB5 02AA 61E7 A9FF 5D9F A9F2 B546" /* k”.µ.ªaç©ÿ]Ÿ©òµF */
- $"2417 2E4D B238 ADDF 9233 5911 1D61 D35A" /* $..M²8­ß’3Y..aÓZ */
- $"8788 DF34 284A 9664 B91E 7A11 4568 B395" /* ‡ˆß4(J–d¹.z.Eh³• */
- $"7C74 C891 2A46 C056 EE92 0459 D81C A41F" /* |tÈ‘*FÀVî’.YØ.¤. */
- $"CA5E 4752 3ADE 89AB 995B 2BF2 D070 41B1" /* Ê^GR:Þ‰«™[+òÐpA± */
- $"EBFE 65BF FF61 55F5 5460 A4E0 33CF 7F1E" /* ëþe¿ÿaUõT`¤à3Ï.. */
- $"691A 0DA4 9372 4DCD 4A7C FF30 7DA5 4AD0" /* i..¤“rMÍJ|ÿ0}¥JÐ */
- $"1236 3C90 00C2 4517 FF78 771E DA05 952D" /* .6<.ÂE.ÿxw.Ú.•- */
- $"1085 D433 FD50 1E6F D583 2585 CBD6 5CFC" /* .…Ô3ýP.oÕƒ%…ËÖ\ü */
- $"9EF2 539B BE7A CCA1 ABF6 5AED 484B FF78" /* žòS›¾zÌ¡«öZíHKÿx */
- $"D6BD 435E E56E 5510 3047 49DE C511 72CF" /* Ö½C^ånU.0GIÞÅ.rÏ */
- $"72A0 B2CE 5E4D E2DA 0AFA FEDE BDFD 3167" /* r ²Î^MâÚÂúþÞ½ý1g */
- $"02FE 3FBE A1B9 7A5F 205B 7D60 1BA3 C975" /* .þ?¾¡¹z_ [}`.£Éu */
- $"5949 A641 5A3E 5AF2 F237 53BE FCAC 71F1" /* YI¦AZ>Zòò7S¾ü¬qñ */
- $"E3E3 6AEB 35B9 41BD C4B6 3400 DBA0 4B7F" /* ããjë5¹A½Ä¶4.Û K. */
- $"FF79 17FD 23F9 918D E532 F6BD F949 B633" /* ÿy.ý#ù‘å2ö½ùI¶3 */
- $"6A36 7600 17D8 C912 DB72 6F48 869C 0D66" /* j6v..ØÉ.ÛroH†œ.f */
- $"1410 074A 8F5B 629C 5B8B F293 6DB6 DB6D" /* ...J[bœ[‹ò“m¶Ûm */
- $"B6DB 6740 B8F8 BF85 2938 ECDA 6390 6537" /* ¶Ûg@¸ø¿…)8ìÚce7 */
- $"5986 A2A6 B52C A20D F057 C41F 660A C203" /* Y†¢¦µ,¢.ðWÄ.fÂÂ. */
- $"E5C1 68B0 9D56 DAD8 F20C 665C 5D04 4BA2" /* åÁh°VÚØò.f\].K¢ */
- $"46FF 7DB5 4880 6121 2EA3 5D2A 82F4 B18A" /* Fÿ}µH€a!.£]*‚ô±Š */
- $"50FC 2D12 DEFE 1F4D 01BF 3315 10D3 5D94" /* Pü-.Þþ.M.¿3..Ó]” */
- $"11B1 0221 28B8 56D9 4CED 012D D9C9 4005" /* .±.!(¸VÙLí.-ÙÉ@. */
- $"316F E887 29A8 3E83 9E25 FF1F A4C1 5D25" /* 1oè‡)¨>ƒž%ÿ.¤Á]% */
- $"8893 36E0 73BE DE25 456A 4678 B7C5 AD7A" /* ˆ“6às¾Þ%EjFx·Å­z */
- $"90C9 3950 942F 1459 C737 31EF 991F 241B" /* É9P”/.YÇ71ï™.$. */
- $"C294 7CFB 9461 B43A 8D37 8A6D BBC8 D7F6" /* ”|û”a´:7Šm»È×ö */
- $"A128 281D DF2B EAC5 A154 E6D9 FF53 984D" /* ¡((.ß+êÅ¡TæÙÿS˜M */
- $"550E 9C70 3F64 0E0E 0940 0AFC 5CC9 CF43" /* U.œp?d..Æ@Âü\ÉÏC */
- $"7184 3D0F 9FDE 08DF EC31 B86E 0D38 AF71" /* q„=.ŸÞ.ßì1¸n.8¯q */
- $"29F1 A21D 7847 7150 6DCA 9211 C778 F1A4" /* )ñ¢.xGqPmÊ’.Çxñ¤ */
- $"26AA B90D 1A39 DB92 4924 9249 2493 36D2" /* &ª¹..9Û’I$’I$“6Ò */
- $"4924 9249 2492 49FE 069C E7B9 CB0D 4E87" /* I$’I$’Iþ.œç¹Ë.N‡ */
- $"7D9E 9D29 FC64 8A6F 6185 2BD9 806F 760B" /* }ž)üdŠoa…+Ù€ov. */
- $"464D 4732 BD90 0E7D CABF 2B6F 2A78 8608" /* FMG2½.}Ê¿+o*x†. */
- $"DEF5 406F D401 3FD4 AE82 058D D6C8 B980" /* Þõ@oÔ.?Ô®‚.Öȹ€ */
- $"FECA D9B9 E7B6 3982 9FD3 81EA 544B 30BD" /* þÊÙ¹ç¶9‚ŸÓêTK0½ */
- $"7E56 FD78 66FD 5A41 D0BD 7714 5FAF 2A1E" /* ~VýxfýZAнw._¯*. */
- $"8FDA B705 EAAE F6F2 D69C 9812 7194 A56E" /* Ú·.ê®öòÖœ˜.q”¥n */
- $"DB55 BF75 C4E4 BDCD 9FC2 ACAD C428 829F" /* ÛU¿uÄä½ÍŸÂ¬­Ä(‚Ÿ */
- $"2409 3BB2 A894 8020 A8E7 FC16 F4FF 4E84" /* $Æ;²¨”€ ¨çü.ôÿN„ */
- $"C06E 889C 1C74 96AD 5420 F825 1A2B 015C" /* Ànˆœ.t–­T ø%.+.\ */
- $"6BC2 31EE 64AB 7A44 15E5 3458 8040 AEEF" /* kÂ1îd«zD.å4X€@®ï */
- $"F6BD 7D58 6478 8344 018F D3C6 2E33 69A4" /* ö½}XdxƒD.ÓÆ.3i¤ */
- $"E5E8 721A 5B2F 777B C0D8 0A05 2CE7 EEC8" /* åèr.[/w{ÀØÂ.,çîÈ */
- $"69EF 417B A960 D320 842E 84DE D442 AB2F" /* iïA{©`Ó „.„ÞÔB«/ */
- $"3B31 84FE DCFC A608 2E09 AA42 60F6 DB2E" /* ;1„þÜü¦..ƪB`öÛ. */
- $"DA5B C95D D10A 77BE AD48 B5FF 0557 A5AC" /* Ú[É]ÑÂw¾­Hµÿ.W¥¬ */
- $"327B F763 FDA1 32BF 7308 3EFC 0C2B 2D22" /* 2{÷cý¡2¿s.>ü.+-" */
- $"584A F9CA BFB4 78FF 6E67 42CC B491 492B" /* XJùÊ¿´xÿngBÌ´‘I+ */
- $"17C3 C746 9966 5780 BA6C 2798 472E 1CFF" /* .ÃÇF™fW€ºl'˜G..ÿ */
- $"6A32 69A0 86E0 44C6 1679 08F9 9928 48D9" /* j2i †àDÆ.y.ù™(HÙ */
- $"3DA0 CBA0 1E5E 2618 7162 51C9 DEF0 56A0" /* = Ë .^&.qbQÉÞðV  */
- $"1924 F126 CAAD F248 A1A4 2816 13A7 FE76" /* .$ñ&Ê­òH¡¤(..§þv */
- $"594E 647C 36C4 C014 CDC7 5C89 DBAB 9854" /* YNd|6ÄÀ.ÍÇ\‰Û«˜T */
- $"9094 FC96 5FED 7476 AA3C DF0B B47B C123" /* ”ü–_ítvª<ß.´{Á# */
- $"BE6D CD5A BA07 CC19 94FC DC37 B85C 0FD2" /* ¾mÍZº.Ì.”üÜ7¸\.Ò */
- $"9FED 62E6 F910 2F49 529E CE10 9738 D296" /* Ÿíbæù./IRžÎ.—8Ò– */
- $"A81C 1A0D 0FBF 7CAE DB93 40C0 3BC9 5A0C" /* ¨....¿|®Û“@À;ÉZ. */
- $"B23D FBD4 3863 C520 03A0 D966 5327 A0A2" /* ²=ûÔ8cÅ . ÙfS' ¢ */
- $"DD06 B7A1 942B 0A75 CB23 8664 4159 8647" /* Ý.·¡”+ÂuË#†dAY†G */
- $"2725 DAF6 693A 58D7 7A7D B34A 393D FE7A" /* '%Úöi:X×z}³J9=þz */
- $"C105 C374 193C 123C 130E 062C 8AB2 32FD" /* Á.Ãt.<.<...,Š²2ý */
- $"80E0 72E3 6AEA 2078 5D7C D3E5 4E20 D927" /* €àrãjê x]|ÓåN Ù' */
- $"157E 9DC5 1A29 2F0F C326 AFE3 3ACF C361" /* .~Å.)/.Ã&¯ã:ÏÃa */
- $"8C45 D79C EB27 7441 E4C7 8BFD 5832 DB93" /* ŒEלë'tAäÇ‹ýX2Û“ */
- $"78F5 B9DB BA4E 329E A262 C467 88DC C540" /* xõ¹ÛºN2ž¢bÄgˆÜÅ@ */
- $"78E0 4E55 34F3 806E 2DEA B371 E9B5 D8DF" /* xàNU4ó€n-ê³qéµØß */
- $"5EDA B5B9 1C48 5A11 ECAB E4F8 67B7 C76E" /* ^Úµ¹.HZ.ì«äøg·Çn */
- $"460F 8E6A C7BA B5F8 75F2 9105 1480 FD1A" /* F.ŽjǺµøuò‘..€ý. */
- $"80EB DB48 6115 AA6E 9AEA A07C 57B0 1A7F" /* €ëÛHa.ªnšê |W°.. */
- $"0CBF D5DE 47A7 89BE 4CAE 19FE 7B79 5839" /* .¿ÕÞG§‰¾L®.þ{yX9 */
- $"232D 495E 476C E267 D9D2 5257 F0E6 3EB5" /* #-I^GlâgÙÒRWðæ>µ */
- $"F140 AAAF 1E36 BA04 086A EEC5 3232 7958" /* ñ@ª¯.6º..jîÅ22yX */
- $"72E3 FCC3 9488 B44C 0C15 EF6B 811B CF97" /* rãüÔˆ´L..ïk.Ï— */
- $"0532 2B88 663D 8675 6050 AB94 A435 C0FC" /* .2+ˆf=†u`P«”¤5Àü */
- $"9E08 9873 92AF 6859 F7F5 64B0 0BA5 FA68" /* ž.˜s’¯hY÷õd°.¥úh */
- $"3557 0898 9E0D 5795 BF67 2866 5FB6 63C6" /* 5W.˜ž.W•¿g(f_¶cÆ */
- $"4F82 42CE A682 DC8D CB18 D4FE 6252 95D1" /* O‚BΦ‚ÜË.ÔþbR•Ñ */
- $"C85C 6B2C 0FC0 7C9D 5A80 F93B 8900 F93A" /* È\k,.À|Z€ù;‰.ù: */
- $"8EE6 7513 4AFA 1609 3CEE D5EB B420 A1CE" /* Žæu.Jú.Æ<îÕë´ ¡Î */
- $"318D 6F67 720A 7F84 4127 C0F2 9193 35CE" /* 1ogrÂ.„A'Àò‘“5Î */
- $"6D97 9682 5E5D B9FC 5A97 3B71 AB1F 64AA" /* m—–‚^]¹üZ—;q«.dª */
- $"3383 1F0E C0E9 26BE E6EB 24CD 499F F2BA" /* 3ƒ..Àé&¾æë$ÍIŸòº */
- $"997D E886 6FF8 C6B5 0607 1259 7715 7539" /* ™}è†oøƵ...Yw.u9 */
- $"4B57 F7A9 56A7 A04B 031F 0786 6C02 E7BC" /* KW÷©V§ K...†l.ç¼ */
- $"8256 7F27 A39A B66D 6B95 6C11 CDE4 C580" /* ‚V.'£š¶mk•l.ÍäÅ€ */
- $"54DE 7E26 129C EB67 ABC8 455E 6CC3 453E" /* TÞ~&.œëg«ÈE^lÃE> */
- $"F9A8 3ED5 9B43 4EB8 384E 0F7B 28E0 16FF" /* ù¨>Õ›CN¸8N.{(à.ÿ */
- $"1342 18B1 31B6 EAEF 4C40 36F7 0CFF 6AFF" /* .B.±1¶êïL@6÷.ÿjÿ */
- $"8059 5D1C 275B 4F7D B392 4DB0 5E5D 4304" /* €Y].'[O}³’M°^]C. */
- $"4848 2A3A C93F BAD6 638D 315A 8771 1150" /* HH*:É?ºÖc1Z‡q.P */
- $"1D41 B6A7 C9B8 782E 19D8 F8E7 07EB ED20" /* .A¶§É¸x..Øøç.ëí */
- $"7D4E AFFF 5FD2 4FA0 2B48 B549 6A50 AD81" /* }N¯ÿ_ÒO +HµIjP­ */
- $"F11D 357F 7CB2 4B8B F28B 6C97 2C23 58A3" /* ñ.5.|²K‹ò‹l—,#X£ */
- $"92E8 2BFB 77F2 1ECE 7A2A C437 47E3 A833" /* ’è+ûwò.Îz*Ä7Gã¨3 */
- $"D60C C3CA 168A 85B8 620C 109C 4134 35BF" /* Ö.ÃÊ.Š…¸b..œA45¿ */
- $"ECCB 3629 944F AD29 444A C4B6 F019 F19B" /* ìË6)”O­)DJĶð.ñ› */
- $"4189 B1D3 8F28 65B9 85D8 C715 2E1A 267D" /* A‰±Ó(e¹…ØÇ...&} */
- $"A7DB 4C90 9829 BC86 E14C 9F44 757D 5436" /* §ÛL˜)¼†áLŸDu}T6 */
- $"9C38 979D 3654 9A63 E572 7864 E513 A083" /* œ8—6Tšcårxdå. ƒ */
- $"C943 97C5 A88B 23A2 4ECC E4F1 AEED F3EC" /* ÉC—Ũ‹#¢NÌäñ®íóì */
- $"C57D F254 B087 7E1F 81B3 59E6 E2A0 E5CB" /* Å}òT°‡~.³Yæâ åË */
- $"B710 EF71 0598 01BF 1400 3814 0759 EDA8" /* ·.ïq.˜.¿..8..Yí¨ */
- $"386C 3DF0 F1C5 CA93 612F C58D 71BA 6ED6" /* 8l=ðñÅÊ“a/ÅqºnÖ */
- $"FE35 90B4 9C10 A938 33B6 6987 E407 AE7B" /* þ5´œ.©83¶i‡ä.®{ */
- $"5B1A 8E0E BE53 1C94 D747 9303 2ED9 13FA" /* [.Ž.¾S.”×G“..Ù.ú */
- $"226C F38A 7134 3CF6 1923 B85F A254 0048" /* "lóŠq4<ö.#¸_¢T.H */
- $"A765 B678 FC9C 1E2C E183 FC80 CA83 9572" /* §e¶xüœ.,áƒü€Êƒ•r */
- $"E573 B224 9894 7316 C931 4A49 C28F 6E33" /* ås²$˜”s.É1JIÂn3 */
- $"B579 EE14 84BC 61CC 351B 41FB 7095 5F8C" /* µyî.„¼aÌ5.Aûp•_Œ */
- $"1B15 6DAF FF7F F8EA 5A11 5453 6ECA 1C02" /* ..m¯ÿ.øêZ.TSnÊ.. */
- $"C8A4 F40F AD00 7BC9 EDFD AC3A 28E4 546F" /* Ȥô.­.{Éíý¬:(äTo */
- $"1E36 BE45 897E F5D5 BE25 E84B 57C6 9080" /* .6¾E‰~õÕ¾%èKWÆ€ */
- $"B6C4 79B8 153B 110F D90B 215D 401C 0453" /* ¶Äy¸.;..Ù.!]@..S */
- $"8243 BF4A CDAE 9270 0658 462F E0C7 82A8" /* ‚C¿JÍ®’p.XF/àÇ‚¨ */
- $"E155 C547 D144 EBAD 74EC EAFF 7799 6D50" /* áUÅGÑDë­tìêÿw™mP */
- $"D0F9 6BA4 D8B3 0FBB B75B BC48 D5BA 8EAB" /* Ðùk¤Ø³.»·[¼HÕºŽ« */
- $"FF7F 3A2A 820F D817 FB8B 7590 ED4A 3D7B" /* ÿ.:*‚.Ø.û‹uíJ={ */
- $"DAF8 C05F BDCF 1B7C 8862 53A8 95D6 C0DF" /* ÚøÀ_½Ï.|ˆbS¨•ÖÀß */
- $"4069 36DA 0739 783C C432 1E0C 7DA6 2D70" /* @i6Ú.9x<Ä2..}¦-p */
- $"B33A C5AD 810A FBBD E9BB B776 6463 9FDC" /* ³:Å­Âû½é»·vdcŸÜ */
- $"B401 211D 81BA A9FA 8761 ED36 A1EF 439D" /* ´.!.º©ú‡aí6¡ïC */
- $"9880 BE88 E045 3068 F59F 7AD7 EFFF 7FFC" /* ˜€¾ˆàE0hõŸz×ïÿ.ü */
- $"5562 1F00 0818 22D6 5002 F762 7A20 0DC0" /* Ub...."ÖP.÷bz .À */
- $"3ADD FF5D 1851 D391 F011 0000 0000 0000" /* :Ýÿ].QÓ‘ð....... */
- $"0000 0000 0138 5715 ED61 F2C5 2C28 30C0" /* .....8W.íaòÅ,(0À */
- $"F669 9389 6153 3A95 E010 CCA0 2FEF B36F" /* öi“‰aS:•à.Ì /ï³o */
- $"9576 F8C0 F17B 27F6 F6FA 412C 70C7 CF14" /* •vøÀñ{'ööúA,pÇÏ. */
- $"7625 6871 7FE2 16C9 B6E9 5BF1 1A16 E2F0" /* v%hq.â.ɶé[ñ..âð */
- $"945D E51E CCF9 0970 E586 517C 475F 8856" /* ”]å.ÌùÆpå†Q|G_ˆV */
- $"CA0C 1DD9 E001 D7BC 1876 745C 8077 672D" /* Ê..Ùà.×¼.vt\€wg- */
- $"CECA FF0B 01D1 76FA 32F5 C047 26FB 451F" /* ÎÊÿ..Ñvú2õÀG&ûE. */
- $"5261 79B6 5990 79C9 4DF7 5B69 D548 E894" /* Ray¶YyÉM÷[iÕHè” */
- $"F249 0C84 D3F0 9555 7B99 EA27 FA38 184E" /* òI.„Óð•U{™ê'ú8.N */
- $"F863 AFA1 CE80 AEBC CB89 DD99 B8E2 0BEC" /* øc¯¡Î€®¼Ë‰Ý™¸â.ì */
- $"2F74 E534 3FF4 B50A 4B04 02B1 C178 B189" /* /tå4?ôµÂK..±Áx±‰ */
- $"D30F 77DC 8A15 8C9E AF87 1DCD D545 AC6B" /* Ó.wÜŠ.Œž¯‡.ÍÕE¬k */
- $"CAFB 832B E240 6752 8EF2 9BDF 76E8 621D" /* Êûƒ+â@gRŽò›ßvèb. */
- $"892E 384C 7BF0 4DE8 F910 7689 C3F0 E7E9" /* ‰.8L{ðMèù.v‰Ãðçé */
- $"E401 C781 F341 A84F 6922 E97B FC22 E259" /* ä.ÇóA¨Oi"é{ü"âY */
- $"6B26 9B03 14A7 DFA1 B7BD CBED 9539 5DE3" /* k&›..§ß¡·½Ëí•9]ã */
- $"2041 2F5F A37A 2F23 00FC 6424 D7F8 902E" /* A/_£z/#.üd$×ø. */
- $"7261 227B B4EC F4D1 9C18 22C3 8CA5 EFF8" /* ra"{´ìôÑœ."ÃŒ¥ïø */
- $"5701 6734 9110 8B4E D9E0 EE8F 7FEA 202F" /* W.g4‘.‹NÙàî.ê / */
- $"CFF7 5CC7 6107 0B22 B0BE A87B 32EF 0FA8" /* Ï÷\Ça.."°¾¨{2ï.¨ */
- $"3D2D 794E 556E 6089 ACBA D46C 17EC A9DC" /* =-yNUn`‰¬ºÔl.ì©Ü */
- $"0F4E D57D B8C8 EED1 F9D4 F96A 7BEE 3794" /* .NÕ}¸ÈîÑùÔùj{î7” */
- $"49DE 3AA7 EE2E 0B25 A47C 966A D90D C792" /* IÞ:§î..%¤|–jÙ.Ç’ */
- $"6304 7C05 C6EB A26D 83B8 3E0C AAF5 AFFE" /* c.|.Æë¢mƒ¸>.ªõ¯þ */
- $"FDC3 F7C4 C0A3 C3ED E8D2 0FAB AC58 1F56" /* ýÃ÷ÄÀ£ÃíèÒ.«¬X.V */
- $"FF40 F44B 4289 C6D7 CC17 A019 AD4A C889" /* ÿ@ôKB‰Æ×Ì. .­Jȉ */
- $"67AD 0673 32A0 B6BA 087E 7279 19C2 025F" /* g­.s2 ¶º.~ry.Â._ */
- $"DB0E 0E97 02D9 2268 5BCA CDE6 B94E 8D9B" /* Û..—.Ù"h[ÊÍæ¹N› */
- $"03EB D786 1698 2D8A 2ECD 432E D615 931F" /* .ë׆.˜-Š.ÍC.Ö.“. */
- $"452B 5D40 0950 5BBE A70F BD95 9F0E 8B95" /* E+]@ÆP[¾§.½•Ÿ.‹• */
- $"86B7 47DE 0757 BFE4 9775 3082 9D22 863A" /* †·GÞ.W¿ä—u0‚"†: */
- $"E404 B84C 5E88 8424 31DD 689A D234 88E2" /* ä.¸L^ˆ„$1ÝhšÒ4ˆâ */
- $"971F 9E59 429C 6C7E 3670 8F7C 8F86 A80D" /* —.žYBœl~6p|†¨. */
- $"848E E78B 5331 058E E444 FEC2 269A 7E23" /* „Žç‹S1.ŽäDþÂ&š~# */
- $"608D 0502 E075 F7A4 DACF 515F AA08 31C1" /* `..àu÷¤ÚÏQ_ª.1Á */
- $"1275 02C0 F37E F465 ADE9 1918 F1F0 0E4F" /* .u.Àó~ôe­é..ñð.O */
- $"E5A4 41A5 F655 22D9 946A 7FEC 0720 3D3A" /* å¤A¥öU"Ù”j.ì. =: */
- $"4961 05B2 F02D 51D2 1212 084B B3EA 5DC9" /* Ia.²ð-QÒ...K³ê]É */
- $"F986 5763 A2AC E2AC 1144 5DC3 E6A5 D092" /* ù†Wc¢¬â¬.D]Ãæ¥Ð’ */
- $"3654 3737 A598 21C2 34FF 097C B8B8 5934" /* 6T77¥˜!Â4ÿÆ|¸¸Y4 */
- $"C947 05C9 B4BA F52B 99FF 3AFE 6B15 2CAE" /* ÉG.É´ºõ+™ÿ:þk.,® */
- $"06CF D962 CCDE D937 D4AE B3D9 7E92 E2AF" /* .ÏÙbÌÞÙ7Ô®³Ù~’⯠*/
- $"8F4E 31CE 06E7 0AD8 71DB 4456 7101 E221" /* N1Î.çÂØqÛDVq.â! */
- $"74AC 1159 9EDF 9841 CFA3 E04F DECF 6FD3" /* t¬.Yžß˜AÏ£àOÞÏoÓ */
- $"90CC C22F 63B0 45CC C98B 3125 33C0 CFBA" /* ÌÂ/c°EÌÉ‹1%3ÀϺ */
- $"4CE7 3FAD F2E4 85E7 0C74 35A5 97E9 8672" /* Lç?­òä…ç.t5¥—é†r */
- $"9180 E059 EF0F C416 E25F 0E83 095A 36AA" /* ‘€àYï.Ä.â_.ƒÆZ6ª */
- $"8E74 F1F7 11A8 49DD C47E 5098 D576 DC41" /* Žtñ÷.¨IÝÄ~P˜ÕvÜA */
- $"D6FC 7C37 E307 A2DB 997E A046 C114 CF04" /* Öü|7ã.¢Û™~ FÁ.Ï. */
- $"FD8E 32D1 2AC6 3A81 C8B6 C680 6E60 7826" /* ýŽ2Ñ*Æ:ȶƀn`x& */
- $"9A40 9C80 BA1B 4DE8 854B 09D9 33B3 95BE" /* š@œ€º.Mè…KÆÙ3³•¾ */
- $"7CE5 CCA3 C463 5D1C 1F2B A160 E208 AA0A" /* |åÌ£Äc]..+¡`â.ªÂ */
- $"D00F 1933 5FB5 2705 4E9C 3733 0FD0 2AA0" /* Ð..3_µ'.Nœ73.Ð*  */
- $"D116 F240 05EA 53BB 5A5A 0A4B 3D9E FCB7" /* Ñ.ò@.êS»ZZÂK=žü· */
- $"FE35 1D0B 1E56 C4AA 9B6C 8CE6 10CA DAA5" /* þ5...VĪ›lŒæ.ÊÚ¥ */
- $"6DF1 6F74 C332 BD93 556E 89F5 A94A 232D" /* mñotÃ2½“Un‰õ©J#- */
- $"E9EF C950 666C 7D3E D1BA C98F 4489 3C5D" /* éïÉPfl}>ѺÉD‰<] */
- $"F7FC 88D4 C90E EE9D 7691 C976 2CFE 6BA0" /* ÷üˆÔÉ.îv‘Év,þk  */
- $"B53E 5C59 749E FEBC 4AB4 490C A3B6 5187" /* µ>\Ytžþ¼J´I.£¶Q‡ */
- $"4A10 1076 6348 AEC1 054B 0A98 9196 29C3" /* J..vcH®Á.K˜‘–)à */
- $"F995 50E4 E003 F099 9495 7ECC 1C78 C536" /* ù•Päà.ð™”•~Ì.xÅ6 */
- $"AA8D 7305 BE7F FF72 99F7 25ED 4C38 0896" /* ªs.¾.ÿr™÷%íL8.– */
- $"A1BE F2D4 016E B744 CBB7 9CEE 1C88 5E3D" /* ¡¾òÔ.n·DË·œî.ˆ^= */
- $"1B9E E3CB 29D2 AAA7 C3F6 41F4 B6C0 5861" /* .žãË)Òª§ÃöAô¶ÀXa */
- $"93D3 4773 858E 3470 E670 4F94 E206 FBA3" /* “ÓGs…Ž4pæpO”â.û£ */
- $"7050 2A3D 6DC0 004E 32D7 6043 4E5E C44F" /* pP*=mÀ.N2×`CN^ÄO */
- $"284A 3214 97B7 19DE 41C4 6204 56CB 1695" /* (J2.—·.ÞAÄb.VË.• */
- $"BAD8 C308 0FFE BEB7 FE14 C6AC CEE8 5022" /* ºØÃ..þ¾·þ.ƬÎèP" */
- $"C27A 2CCA 4714 4C52 3975 615D A1C8 62BF" /* Âz,ÊG.LR9ua]¡Èb¿ */
- $"C477 FF7E 2637 3B89 8C43 6E09 285B 2D1A" /* Äwÿ~&7;‰ŒCnÆ([-. */
- $"8E9E 4110 CE7B E30A E21C A140 02C8 D0AD" /* ŽžA.Î{ãÂâ.¡@.ÈЭ */
- $"630B 5488 7CE7 B884 393A 6FDD 5A68 7FB9" /* c.Tˆ|縄9:oÝZh.¹ */
- $"60EC C73B 143E 3F61 3E31 1A3E 8438 7944" /* `ìÇ;.>?a>1.>„8yD */
- $"B652 14AE 63CA 803C 9B67 C6FE 2F5D 4CD0" /* ¶R.®cÊ€<›gÆþ/]LÐ */
- $"3A63 1328 8809 A4AB B4A1 8664 FE90 F03E" /* :c.(ˆÆ¤«´¡†dþð> */
- $"18E2 7982 7DDC A444 1306 4546 61B2 A710" /* .ây‚}ܤD..EFa²§. */
- $"CCED 529C 92CB D547 22F5 0DB0 B10F 8450" /* ÌíRœ’ËÕG"õ.°±.„P */
- $"E5AC 253A 6937 BFBD D0C6 8AED 14C7 787E" /* å¬%:i7¿½ÐÆŠí.Çx~ */
- $"21E7 860D 8567 633D A9E6 0466 93A5 6789" /* !ç†.…gc=©æ.f“¥g‰ */
- $"D643 2EEE 7542 7B02 086A 83C4 AD3C 785C" /* ÖC.îuB{..jƒÄ­<x\ */
- $"E3B4 BFC0 C27C 3762 1D98 0A0C B43D 8107" /* ã´¿ÀÂ|7b.˜Â.´=. */
- $"3003 FF74 C626 1BC1 44AA 08A0 7A68 0ADE" /* 0.ÿtÆ&.ÁDª. zhÂÞ */
- $"E9BD 94DB 3644 AA13 CFCA A9CB 0E8F 9061" /* é½”Û6Dª.ÏÊ©Ë.a */
- $"73BC 6A23 359D C129 F184 4EBA BE0F A772" /* s¼j#5Á)ñ„Nº¾.§r */
- $"9AB6 7DDC C179 81DB 9FDC EDA3 E6C5 21E2" /* š¶}ÜÁyÛŸÜí£æÅ!â */
- $"7049 87BC 00E3 34F5 8066 3FFE 7CA7 A588" /* pI‡¼.ã4õ€f?þ|§¥ˆ */
- $"6277 30DE 8FC1 950A A652 5B12 B0A4 B8BE" /* bw0ÞÁ•Â¦R[.°¤¸¾ */
- $"2297 4261 CB90 AEBB F3CB 2BEE 2FA8 149E" /* "—BaË®»óË+î/¨.ž */
- $"11E6 487B 3EFA 45B9 E4A8 17DF DF8E D5FF" /* .æH{>úE¹ä¨.ßߎÕÿ */
- $"750C 2E52 4F3F 5960 B3B7 3DEB CFE3 4EC3" /* u..RO?Y`³·=ëÏãNà */
- $"676F D76A F8C3 67EB 383B 042A C000 1CF5" /* go×jøÃgë8;.*À..õ */
- $"FB57 51DF 4E0F 9709 4A58 F371 8A53 79CD" /* ûWQßN.—ÆJXóqŠSyÍ */
- $"B935 29C8 5953 BBFB B216 24F0 FF5C F1BE" /* ¹5)ÈYS»û².$ðÿ\ñ¾ */
- $"1649 C9BE 754A CC45 62C3 44A2 3E12 A872" /* .IɾuJÌEbÃD¢>.¨r */
- $"736B 05DD F77C C7C6 F33D 8224 147E D163" /* sk.Ý÷|ÇÆó=‚$.~Ñc */
- $"02B4 0BC6 297A FA75 03A7 BFDD 709A A878" /* .´.Æ)zúu.§¿Ýpš¨x */
- $"734A 7236 791A BFF6 9F21 CC67 268D 160D" /* sJr6y.¿öŸ!Ìg&.. */
- $"A6D0 7988 72CF 6475 146C 81EB 8249 518A" /* ¦ÐyˆrÏdu.lë‚IQŠ */
- $"49B7 0389 FDB6 9CEB DCA2 41ED 085D 4E85" /* I·.‰ý¶œëÜ¢Aí.]N… */
- $"03E4 3F4E D8CF 25E1 658D 38F6 8F88 A499" /* .ä?NØÏ%áe8öˆ¤™ */
- $"B64A DD79 FDF2 39FB 5CEC F29B 714A 733B" /* ¶JÝyýò9û\ìò›qJs; */
- $"76E4 94E5 F567 3A71 28F0 13A6 7A74 CD91" /* vä”åõg:q(ð.¦ztÍ‘ */
- $"5804 065E D3C7 09B7 ED19 51E5 0913 4436" /* X..^ÓÇÆ·í.QåÆ.D6 */
- $"9791 BB58 10F3 7183 5DB6 4874 65D2 AAD2" /* —‘»X.óqƒ]¶HteÒªÒ */
- $"DBA2 C761 A70F 3EEE 9256 2EF0 945D E52D" /* Û¢Ça§.>î’V.ð”]å- */
- $"34CF 10DF B2AF 8E14 A5A4 E24F 0051 F63E" /* 4Ï.ß²¯Ž.¥¤âO.Qö> */
- $"F11C 5DAC 6D8D DEDD A585 96FC A2AB A5FF" /* ñ.]¬mÞÝ¥…–ü¢«¥ÿ */
- $"5298 6349 DB41 9276 C1C6 F1E2 9ABF 822B" /* R˜cIÛA’vÁÆñâš¿‚+ */
- $"346F 8679 726C 666A 9638 246A EABE 54A9" /* 4o†yrlfj–8$jê¾T© */
- $"49DD F22A BC62 5867 51F2 FDBD B33B 40E0" /* IÝò*¼bXgQòý½³;@à */
- $"220F 075D 031C EAAE 3CDE 67CF 2269 E26D" /* "..]..ê®<ÞgÏ"iâm */
- $"BEF3 1873 E610 D43E 8F03 A14F F04F 980B" /* ¾ó.sæ.Ô>.¡OðO˜. */
- $"69FF 1E4A 1925 DDE6 B473 84B5 6F53 75DD" /* iÿ.J.%Ýæ´s„µoSuÝ */
- $"CF71 C4C0 72DC 5403 7E7B 1A9B 6F16 BA87" /* ÏqÄÀrÜT.~{.›o.º‡ */
- $"A44D D4A2 8029 E15A 8C17 BE55 A30B 87B3" /* ¤MÔ¢€)áZŒ.¾U£.‡³ */
- $"DC5B CED9 2E4C A8F3 939B 6F82 8885 9BD5" /* Ü[ÎÙ.L¨ó“›o‚ˆ…›Õ */
- $"905B 6EE2 E3C9 D45E DE91 DD46 7EDD 23BB" /* [nâãÉÔ^Þ‘ÝF~Ý#» */
- $"6852 2BD3 3D31 2755 2D1B 7431 35EB 6CBD" /* hR+Ó=1'U-.t15ël½ */
- $"638C 9E5D F0EB 9AE0 49BC D327 7536 BCB3" /* cŒž]ðëšàI¼Ó'u6¼³ */
- $"65F1 992B E073 9D25 980D A244 7F9E 749F" /* eñ™+às%˜.¢D.žtŸ */
- $"53BD D08A C5EF 64A2 D672 7A55 9146 5CAD" /* S½ÐŠÅïd¢ÖrzU‘F\­ */
- $"7839 E1B6 7543 4556 146E C347 33E3 2798" /* x9á¶uCEV.nÃG3ã'˜ */
- $"4752 6F78 AAA5 AE5E 7B02 CD92 D5F1 FD30" /* GRoxª¥®^{.Í’Õñý0 */
- $"F78A 7BFB 03AB CF34 58BF 3810 B8A7 CDAB" /* ÷Š{û.«Ï4X¿8.¸§Í« */
- $"A573 658E 260A 7C50 000F 00AC D13F 618E" /* ¥seŽ&Â|P...¬Ñ?aŽ */
- $"A241 9458 3945 9D59 3F9B 13C5 04CC 600E" /* ¢A”X9EY?›.Å.Ì`. */
- $"FC51 8C8D FBA0 4150 5832 4539 730B 4631" /* üQŒû APX2E9s.F1 */
- $"0598 EE14 817C B560 97C5 B953 64D4 980D" /* .˜î.|µ`—ŹSdÔ˜. */
- $"C379 6FFF 3E63 6746 7BE8 D3AB 5215 B47F" /* Ãyoÿ>cgF{èÓ«R.´. */
- $"3CAE 42E4 D4BF B7BF 6580 3319 6A71 C2E9" /* <®BäÔ¿·¿e€3.jqÂé */
- $"48AA 2C5E 9D78 B9C3 F8DA B858 D5AB 99F4" /* Hª,^x¹ÃøÚ¸XÕ«™ô */
- $"B04F EAAC D0DE 2302 F874 7E64 A69B 89CE" /* °Oê¬ÐÞ#.øt~d¦›‰Î */
- $"AEAB A73F F815 0D06 B24E 39EC D8E9 EFB7" /* ®«§?ø...²N9ìØéï· */
- $"ED32 55A0 8E21 B52A E55C 17AE E07B 42F4" /* í2U Ž!µ*å\.®à{Bô */
- $"D451 CB7C E941 1578 3EE3 9565 087E 9A05" /* ÔQË|éA.x>ã•e.~š. */
- $"B5FC 403A AAA2 25CE 5AC1 B658 1EE9 9A53" /* µü@:ª¢%ÎZÁ¶X.éšS */
- $"4000 51DF 95E8 C605 97AC C7E1 A8B1 F86C" /* @.Qß•èÆ.—¬Çᨱøl */
- $"7C3F 0BCC E410 8FA7 78C0 7964 BDD0 E341" /* |?.Ìä.§xÀyd½ÐãA */
- $"5DC5 D977 EF99 460C FC48 A51A B5CD DE47" /* ]ÅÙwï™F.üH¥.µÍÞG */
- $"F9E2 194D 1F2D B2B6 556B 0F68 BD1B 5BEA" /* ùâ.M.-²¶Uk.h½.[ê */
- $"9FDD 1280 92A3 EF96 132C 22F6 CA8A 1C20" /* ŸÝ.€’£ï–.,"öÊŠ. */
- $"54DA F163 6119 BC02 7AE6 10CA A16B 993A" /* TÚñca.¼.zæ.Ê¡k™: */
- $"E22B CC58 D181 40E6 EA99 0897 5166 4C1F" /* â+ÌXÑ@æê™.—QfL. */
- $"6D58 D092 5119 1AF5 0C2B 1DC6 029D F0E8" /* mXÐ’Q..õ.+.Æ.ðè */
- $"1F6F 9F5C 17D8 68A0 F600 5C68 5C16 4269" /* .oŸ\.Øh ö.\h\.Bi */
- $"F5A9 4D97 32DE 3A9C 6609 86C2 1D0F BA56" /* õ©M—2Þ:œfƆÂ..ºV */
- $"3C8C 1046 E0DC 2ECB 9BDB D61E 6955 CE38" /* <Œ.FàÜ.Ë›ÛÖ.iUÎ8 */
- $"DB97 859B 9E73 78BF FDEB ED74 0C4E 4203" /* Û—…›žsx¿ýëít.NB. */
- $"431D 69C4 635D D1EA 1A9A 6462 BE48 DDB9" /* C.iÄc]Ñê.šdb¾Hݹ */
- $"6E63 C4D8 8886 51CB 19E6 A7C9 5941 8443" /* ncÄ؈†QË.æ§ÉYA„C */
- $"57E5 8C3B B907 FF17 4B41 08DA 7AFC 1B8B" /* WåŒ;¹.ÿ.KA.Úzü.‹ */
- $"9B05 622E 1F81 91D8 2C60 9C6A 3B23 608B" /* ›.b..‘Ø,`œj;#`‹ */
- $"F2EC E527 70F9 D963 D302 D7AC 18E2 2692" /* òìå'pùÙcÓ.׬.â&’ */
- $"AE0C D915 7E30 5B09 305C 8F5D 1346 3FF2" /* ®.Ù.~0[Æ0\].F?ò */
- $"8635 ECEC 1CB7 962D 0846 3FA9 5920 C1B0" /* †5ìì.·–-.F?©Y Á° */
- $"5582 FF3A 24E0 FAAE 8FAE 3843 DFCF B74F" /* U‚ÿ:$àú®®8CßÏ·O */
- $"CAEC 5602 D1C5 1760 5ECD 92C8 1DD1 4ABE" /* ÊìV.ÑÅ.`^Í’È.ÑJ¾ */
- $"2336 8A90 E444 6753 D3E0 0F02 8E99 7393" /* #6ŠäDgSÓà..Ž™s“ */
- $"8B26 6C9F BFB4 64DE 7867 73F7 10F0 477A" /* ‹&lŸ¿´dÞxgs÷.ðGz */
- $"8383 ADA5 49C3 722B 1FD7 0BB5 4118 4714" /* ƒƒ­¥IÃr+.×.µA.G. */
- $"D5F9 6C20 CDD0 8151 EAB4 457F FF4E 314C" /* Õùl ÍÐQê´E.ÿN1L */
- $"6E7F 04DB DE0C 611B 62AC 2A4E 869C 06FB" /* n..ÛÞ.a.b¬*N†œ.û */
- $"DB81 F238 C4FC 149E 8176 3F0C 4B83 0DFF" /* Ûò8Äü.žv?.Kƒ.ÿ */
- $"7FB4 A5F5 80C7 E4F0 47AD 8D3F 5426 B12A" /* .´¥õ€ÇäðG­?T&±* */
- $"8678 11E1 A0EF 5439 31D8 E97E 3AE9 E4DD" /* †x.á ïT91Øé~:éäÝ */
- $"3DB7 4A94 7FFF 7135 0C02 ACE2 70F5 626B" /* =·J”.ÿq5..¬âpõbk */
- $"271A 4401 DF00 AE70 E43B D3F8 75AD 0DAB" /* '.D.ß.®pä;Óøu­.« */
- $"794A C0C7 928F 8621 BE61 DA60 A89F 8E95" /* yJÀÇ’†!¾aÚ`¨ŸŽ• */
- $"64E1 4B82 9CA5 D1CB 26FA 3B49 2FDF 8007" /* dáK‚œ¥ÑË&ú;I/߀. */
- $"60B1 1C23 B192 973E 87DD 9323 E697 CA76" /* `±.#±’—>‡Ý“#æ—Êv */
- $"03D6 B09A 33FA 5CEC 856D 1D12 5249 2492" /* .Ö°š3ú\ì…m..RI$’ */
- $"4924 9249 2492 4924 9231 8B0A C6C2 C882" /* I$’I$’I$’1‹ÂÆÂÈ‚ */
- $"FC66 E59C E646 38B0 B26F A097 FEA2 30FE" /* üfåœæF8°²o —þ¢0þ */
- $"F5B9 90DC 3FEF 3116 73C4 7B20 6C09 EA40" /* õ¹Ü?ï1.sÄ{ lÆê@ */
- $"AB90 6257 8BAD 951C 002E 138D 7274 121D" /* «bW‹­•....rt.. */
- $"B91E 66F5 6038 8257 FD9A 18C9 0155 522C" /* ¹.fõ`8‚Wýš.É.UR, */
- $"D6CC 0F6A 6A4A 09F3 0C4A B702 47FF 7FFC" /* ÖÌ.jjJÆó.J·.Gÿ.ü */
- $"B504 0034 6682 CE19 CA7C 50BE F8B0 9DCB" /* µ..4f‚Î.Ê|P¾ø°Ë */
- $"0092 4924 9248 F298 B4D2 A612 6CEE 878F" /* .’I$’Hò˜´Ò¦.lî‡ */
- $"FF7F FF5F 8F59 B3E0 FE9F A74E 506D C924" /* ÿ.ÿ_Y³àþŸ§NPmÉ$ */
- $"9249 2492 4924 9249 2492 4924 924D 57A2" /* ’I$’I$’I$’I$’MW¢ */
- $"2CC8 426C 393A 96E4 50FB 0ACE 8874 7A86" /* ,ÈBl9:–äPûÂΈtz† */
- $"2B20 84D4 0F34 1532 DFF0 D633 0231 0F65" /* + „Ô.4.2ßðÖ3.1.e */
- $"91D1 8E19 A917 CD2A 8D35 89BE F64E D1A8" /* ‘ÑŽ.©.Í*5‰¾öNѨ */
- $"926C AE06 3A49 80F9 C1FE 0E81 52D8 5A8C" /* ’l®.:I€ùÁþ.RØZŒ */
- $"7A00 5EF2 9F04 3659 74EC D695 94B6 5B90" /* z.^òŸ.6YtìÖ•”¶[ */
- $"89C0 E661 DFC4 5E69 965B 4D1D 4B76 7C0E" /* ‰ÀæaßÄ^i–[M.Kv|. */
- $"89D2 C1E8 B1EF CF9E 5E96 3977 AEA6 532B" /* ‰ÒÁè±ïÏž^–9w®¦S+ */
- $"68B1 BD73 2BE6 BB5B 766E FA91 5C36 628C" /* h±½s+æ»[vnú‘\6bŒ */
- $"F45F FEEA C7DF 49F0 278F F459 E9B6 BDAC" /* ô_þêÇßIð'ôY鶽¬ */
- $"1A28 F485 45C5 2761 DC37 C72A 8A17 2D08" /* .(ô…EÅ'aÜ7Ç*Š.-. */
- $"5130 E9D5 E1BD 2D59 07B5 2290 00F9 F737" /* Q0éÕá½-Y.µ".ù÷7 */
- $"C1F4 5C78 1058 C4C6 13AB AE5C 45DE ACB4" /* Áô\x.XÄÆ.«®\EÞ¬´ */
- $"7DC9 03C4 0F82 7850 6F9E 5FD3 9223 36FE" /* }É.Ä.‚xPož_Ó’#6þ */
- $"8A1D 1D99 FBB3 646B 206B FC7E 668E 4730" /* Š..™û³dk kü~fŽG0 */
- $"7C8C 79D9 A37A 427B 1E91 E7A1 DED2 E57D" /* |ŒyÙ£zB{.‘ç¡ÞÒå} */
- $"E167 967A 8B9F A6C0 A36F 68E8 D03C 84C6" /* ág–z‹Ÿ¦À£ohèÐ<„Æ */
- $"E952 3CAF 039F 18CD 236C 4AE1 FB74 D7F6" /* éR<¯.Ÿ.Í#lJáût×ö */
- $"DFBF B7A4 AFDB D27E 2FB7 7BBF 86F0 DF6F" /* ß¿·¤¯ÛÒ~/·{¿†ðßo */
- $"4F9F C3A7 EC7F 0D0F BEDB 1EFB 77AA FB77" /* OŸÃ§ì...¾Û.ûwªûw */
- $"2CED 1CDE F39E A2F3 567D 91E9 4703 B8A2" /* ,í.Þóž¢óV}‘éG.¸¢ */
- $"5006 2494 6271 81F3 3B95 0B89 EDD5 7FE8" /* P.$”bqó;•.‰íÕ.è */
- $"B864 3D84 75CD 7478 A5D6 28C8 D483 39EF" /* ¸d=„uÍtx¥Ö(ÈÔƒ9ï */
- $"86CA 5763 87CA 97CF A9D4 AFA9 0450 6744" /* †ÊWc‡Ê—Ï©Ô¯©.PgD */
- $"16E3 8C0B 0015 88DA 5244 1AB2 9790 35B0" /* .ãŒ...ˆÚRD.²—5° */
- $"0489 B911 D871 2BB4 6576 C185 22B7 1F86" /* .‰¹.Øq+´evÁ…"·.† */
- $"230A 3CD3 ECB5 20A6 23BA A068 A53E 8EAD" /* #Â<Óìµ ¦#º h¥>Ž­ */
- $"3793 46B5 BA07 96A8 DF28 6A66 CE05 73CE" /* 7“Fµº.–¨ß(jfÎ.sÎ */
- $"1938 F9A6 9CBC 0D7F F193 E0D5 09CC 3426" /* .8ù¦œ¼..ñ“àÕÆÌ4& */
- $"4BB1 52B9 F337 0537 FA01 B010 5471 B015" /* K±R¹ó7.7ú.°.Tq°. */
- $"754C A1A6 E071 800C 1A26 243D 172B 1497" /* uL¡¦àq€..&$=.+.— */
- $"E5DF 1EB1 6A6C 6761 3BA6 52C0 C0B4 69BD" /* åß.±jlga;¦RÀÀ´i½ */
- $"E6B4 275E EB6E 42BF D693 8928 15A4 9DB2" /* æ´'^ënB¿Ö“‰(.¤² */
- $"D8FA E273 6C04 CBB5 06A9 8096 5E97 5D11" /* Øúâsl.˵.©€–^—]. */
- $"0B1B 8E93 BDCC 1AE8 4CBA 9413 A729 F6A7" /* ..Ž“½Ì.èLº”.§)ö§ */
- $"F24D 467F 0316 BF60 F777 C2E3 7FAA DC07" /* òMF...¿`÷wÂã.ªÜ. */
- $"148F 5C26 91C3 20B8 F3A0 9088 F893 6D47" /* .\&‘Ã ¸ó ˆø“mG */
- $"7AC1 A0D9 5483 8281 5B98 28AE 9EAB 94F0" /* zÁ ÙTƒ‚[˜(®ž«”ð */
- $"9B68 08E3 E3DA 7E3A AA84 9EED F083 117F" /* ›h.ããÚ~:ª„žíðƒ.. */
- $"FE75 781E E394 EEEC F9AC 21D6 FF5E DD57" /* þux.ã”îìù¬!Öÿ^ÝW */
- $"96CF A7DF 3C0D 7E2F F9E7 F212 83EE E629" /* –ϧß<.~/ùçò.ƒîæ) */
- $"9543 AA61 C10A 4B12 1DD8 6835 405A D739" /* •CªaÁÂK..Øh5@Z×9 */
- $"DBD7 1628 2816 909D 1DEB 81F2 16AF 8953" /* Û×.((..ëò.¯‰S */
- $"9239 B79D A64A 3275 E506 BFD3 0198 776C" /* ’9·¦J2uå.¿Ó.˜wl */
- $"F4C2 39CD 4CF8 2482 D781 526A 7D82 0B83" /* ôÂ9ÍLø$‚×Rj}‚.ƒ */
- $"120C B2AB 1FC0 2DAA 4A72 ACD9 B4C7 926A" /* ..²«.À-ªJr¬Ù´Ç’j */
- $"CE69 46FA C67E 904D 12D4 D6EC 2F77 AC43" /* ÎiFúÆ~M.ÔÖì/w¬C */
- $"0A82 A09A 8FAC 59F0 D192 4F8F E6D1 A8B3" /* ‚ š¬YðÑ’OæѨ³ */
- $"26FD EAD1 7727 E253 F826 580D 8786 8EAD" /* &ýêÑw'âSø&X.‡†Ž­ */
- $"4561 33FC 6C93 72E4 3F53 3E92 5E78 9597" /* Ea3ül“rä?S>’^x•— */
- $"895F 61B9 D382 514D 839E D4E8 A40B 6F99" /* ‰_a¹Ó‚QMƒžÔè¤.o™ */
- $"0BEC 889F F976 6F24 AEAC 2A18 479B 9CD0" /* .숟ùvo$®¬*.G›œÐ */
- $"A58D E4A8 4940 D7A9 26A7 8649 C387 22EB" /* ¥ä¨I@ש&§†IÇ"ë */
- $"10F3 AB7F 805D 57F4 6918 508A 429D FC32" /* .ó«.€]Wôi.PŠBü2 */
- $"0E49 3480 E5A6 0267 54A6 D677 422D 1B62" /* .I4€å¦.gT¦ÖwB-.b */
- $"4DFB C3A4 2E01 8C0D 029D D238 87B0 230E" /* Mûä..Œ..Ò8‡°#. */
- $"AB6E AEFD 64F3 F7AE 7BD7 DA13 2BCC DCFB" /* «n®ýdó÷®{×Ú.+ÌÜû */
- $"13EC E7EE A36F 86C6 A2D8 DD70 6174 04FA" /* .ìçî£o†Æ¢ØÝpat.ú */
- $"B7F7 A3BF 9C4C F99C C177 9B27 9148 3998" /* ·÷£¿œLùœÁw›'‘H9˜ */
- $"013A 4B0C E3A5 6905 6ADC 739C 3586 7009" /* .:K.ã¥i.jÜsœ5†pÆ */
- $"38DA 0496 C25E DFB2 F2AB 34C0 F138 4F81" /* 8Ú.–Â^ß²ò«4Àñ8O */
- $"7240 2774 4588 B153 267B DBBE DFDE AEAD" /* r@'tEˆ±S&{Û¾ßÞ®­ */
- $"1D90 BA71 2B83 D108 1CDB 8B36 7837 8AAA" /* .ºq+ƒÑ..Û‹6x7Šª */
- $"299C 2916 D66C CC2E 2FCF B0E3 228A 88C1" /* )œ).ÖlÌ./Ï°ã"ŠˆÁ */
- $"568F 12D8 D599 AB3F 29DE 1FA6 9336 132F" /* V.ØÕ™«?)Þ.¦“6./ */
- $"521E 8EB9 9BD4 30E4 362E 349E 209A 6EB6" /* R.Ž¹›Ô0ä6.4ž šn¶ */
- $"D5CC 985B E51E 8A74 B9A0 1718 2753 A1E0" /* Õ̘[å.Št¹ ..'S¡à */
- $"BDCC 77CC 5697 641D B916 AB08 C12F 102F" /* ½ÌwÌV—d.¹.«.Á/./ */
- $"59A0 4283 27A8 9F9E 1980 381A 4785 E896" /* Y Bƒ'¨Ÿž.€8.G…è– */
- $"B9C8 A383 0C1E EBDE A8DC D1A0 00FB 61C2" /* ¹È£ƒ..ëÞ¨ÜÑ .ûa */
- $"70F1 84C8 8368 337E DA6C 7A1A 014F 77C3" /* pñ„ȃh3~Úlz..Owà */
- $"EFFF 0CCC F88E E539 B4FF 3187 54EA 4B2E" /* ïÿ.ÌøŽå9´ÿ1‡TêK. */
- $"27BF 1121 0DCD 456F 5AB4 E115 9E30 8B1C" /* '¿.!.ÍEoZ´á.ž0‹. */
- $"FCFB 8634 E35F E3F0 2A65 8EC0 775F C0EE" /* üû†4ã_ãð*eŽÀw_Àî */
- $"37B2 6C5A AA44 2B7C 889A 5854 FBB4 DC29" /* 7²lZªD+|ˆšXTû´Ü) */
- $"E875 94AB D4F4 19C2 5989 594D 6B55 CB5E" /* èu”«Ôô.ÂY‰YMkUË^ */
- $"012C A350 BF1C 322E 6DC6 6CFB 052A B48D" /* .,£P¿.2.mÆlû.*´ */
- $"2FFE D908 D443 2FB2 706F 13A8 B2BF 2E97" /* /þÙ.ÔC/²po.¨²¿.— */
- $"D7EF 6FE2 7D0B 4D6C 89E6 24BB D547 A266" /* ×ïoâ}.Ml‰æ$»ÕG¢f */
- $"3B92 FF58 BE83 0D95 D587 B51D B83A B360" /* ;’ÿX¾ƒ.•Õ‡µ.¸:³` */
- $"DF16 A55F 5D17 5ED7 C7D7 88FD D24B 89C4" /* ß.¥_].^×Ç׈ýÒK‰Ä */
- $"17FF 1CE0 2FC5 E332 79FF 6532 D599 2C36" /* .ÿ.à/Åã2yÿe2Õ™,6 */
- $"7360 56F2 6017 1165 F8CD AC09 6435 530F" /* s`Vò`..eøͬÆd5S. */
- $"8E48 0152 06AE 7F31 9D5A A12E EC4A 26BD" /* ŽH.R.®.1Z¡.ìJ&½ */
- $"1D28 2D81 EBF2 625A 03C8 8240 FAB0 343C" /* .(-ëòbZ.È‚@ú°4< */
- $"3460 4650 A369 CBAF D533 EC55 DB4D 46F7" /* 4`FP£i˯Õ3ìUÛMF÷ */
- $"45C4 1B75 581D CC26 9E29 8B0F C424 5512" /* EÄ.uX.Ì&ž)‹.Ä$U. */
- $"9417 F11C 77C1 F3FD 57B1 487F D8F8 A086" /* ”.ñ.wÁóýW±H.Øø † */
- $"E60E 2356 E9E1 F3EC 7F31 52E1 E3DB C75E" /* æ.#Véáóì.1RáãÛÇ^ */
- $"7A4B 2D19 8F06 AB86 5A88 F23D C312 C565" /* zK-..«†Zˆò=Ã.Åe */
- $"1AF0 4B35 F0D9 D100 6634 A377 90C1 A69A" /* .ðK5ðÙÑ.f4£wÁ¦š */
- $"1C64 495A BEF2 5A5C 1714 0504 2639 71A2" /* .dIZ¾òZ\....&9q¢ */
- $"5989 FF6E F887 5ADD 9843 A719 60CC 5185" /* Y‰ÿnø‡ZݘC§.`ÌQ… */
- $"B308 2551 F63A 7543 2A92 3949 FCC5 5023" /* ³.%Qö:uC*’9IüÅP# */
- $"5A92 FE32 A26E FF00 9CFC 0CFF 4A08 60C7" /* Z’þ2¢nÿ.œü.ÿJ.`Ç */
- $"F76C 480A E682 3C58 66B8 7045 CDBA 616C" /* ÷lHÂæ‚<Xf¸pEͺal */
- $"9995 BEC1 809B 0892 A7EC 43EC 7FE8 F49F" /* ™•¾Á€›.’§ìCì.èôŸ */
- $"9E4B AFD6 66BB 0B88 38ED B165 9C1D F096" /* žK¯Öf».ˆ8í±eœ.ð– */
- $"64EC FD43 9A7A BC84 8CEF 2E65 F99B 4B43" /* dìýCšz¼„Œï.eù›KC */
- $"7D47 3AE8 D0DB A066 308B 201D FF3F ABC1" /* }G:èÐÛ f0‹ .ÿ?«Á */
- $"CD0D B822 3734 A23E AF05 D1E1 F9F5 AF09" /* Í.¸"74¢>¯.Ñáùõ¯Æ */
- $"6428 F517 1201 C3F1 1B80 0DD2 DCD9 CA31" /* d(õ...Ãñ.€.ÒÜÙÊ1 */
- $"B022 DAFB D990 A8B1 6FF1 004E 4847 E5C8" /* °"ÚûÙ¨±oñ.NHGåÈ */
- $"0580 DA86 704F E2FF 7E83 5167 5C3F ADB2" /* .€Ú†pOâÿ~ƒQg\?­² */
- $"4C44 A9D9 DB84 C360 68ED 1BF0 068E 04BF" /* LD©ÙÛ„Ã`hí.ð.Ž.¿ */
- $"D16E B55F 0701 3739 42FA E15C 0EA2 BF81" /* Ñnµ_..79Búá\.¢¿ */
- $"31C1 F1A3 A766 CAB8 C82E C96B 4868 D491" /* 1Áñ£§fʸÈ.ÉkHhÔ‘ */
- $"5ACB 6EED 4027 0C73 AACA 730C ECA6 DE42" /* ZËní@'.sªÊs.ì¦ÞB */
- $"38DA E07E CE64 BC49 7FDD FCCB 07B3 45BF" /* 8Úà~Îd¼I.ÝüË.³E¿ */
- $"B9DC FF13 039F D40E 43BB ACE4 B8F8 31F5" /* ¹Üÿ..ŸÔ.C»¬ä¸ø1õ */
- $"6743 9390 0B87 C9B1 194A 0200 FB53 29CD" /* gC“.‡É±.J..ûS)Í */
- $"3141 15F5 3C38 9F70 2B7E 0E46 B5A7 5C94" /* 1A.õ<8Ÿp+~.Fµ§\” */
- $"AED4 E415 1639 7B49 20DA 1541 9742 A3A6" /* ®Ôä..9{I Ú.A—B£¦ */
- $"B873 4C7C 9112 1322 7D7F 5F6E 14AB 57FC" /* ¸sL|‘.."}._n.«Wü */
- $"A01D 94EC BC05 F45B C4C4 1FC3 D61B F5D3" /*  .”ì¼.ô[ÄÄ.ÃÖ.õÓ */
- $"0E62 9C2F CAE6 C609 B0D2 803B AF5F CC7F" /* .bœ/ÊæÆÆ°Ò€;¯_Ì. */
- $"4085 5B49 F81B 0AB3 DB0C 27C1 7A95 45D6" /* @…[Iø.³Û.'Áz•EÖ */
- $"CDDD 4F06 1A20 A7FE 22F6 EA13 EB6E C723" /* ÍÝO.. §þ"öê.ënÇ# */
- $"87B9 A058 CAF9 9F59 C9C9 6AAD 8358 5147" /* ‡¹ XÊùŸYÉÉj­ƒXQG */
- $"2B3E 2FD8 506F A48B 305C 97C7 5D25 5C75" /* +>/ØPo¤‹0\—Ç]%\u */
- $"C5B1 E7B4 CBC7 C76A 2FE5 1669 302C 2318" /* űç´ËÇÇj/å.i0,#. */
- $"CB1D BB38 5B47 3563 F041 0F00 C23A B1E9" /* Ë.»8[G5cðA..Â:±é */
- $"1972 D9C9 2F2F 4013 F8EF A6CA 7E8E 705C" /* .rÙÉ//@.øï¦Ê~Žp\ */
- $"0CB6 1301 5ED4 25E6 F7D9 999D AB8F 4CAC" /* .¶..^Ô%æ÷Ù™«L¬ */
- $"6FF2 04C8 8307 016C 6E46 645B 5488 79C0" /* oò.ȃ..lnFd[TˆyÀ */
- $"C0E5 8A2A 46EB DB4C 65A0 27FC 6230 781C" /* ÀåŠ*FëÛLe 'üb0x. */
- $"EDB8 4666 1604 1937 9603 A2AA D8C3 43A6" /* í¸Ff...7–.¢ªØÃC¦ */
- $"E254 D745 866F D24A DD91 397E C575 F187" /* âT×E†oÒJÝ‘9~Åuñ‡ */
- $"193B F5F5 819B 7D57 EC83 0871 ED1B 64F6" /* .;õõ›}Wìƒ.qí.dö */
- $"E47A E1B0 65F9 67DF 5680 3642 52AA BB4B" /* äzá°eùgßV€6BRª»K */
- $"BA52 D8BA 8AF7 0A96 412A 92B2 045F 9739" /* ºRغŠ÷–A*’²._—9 */
- $"3A52 D961 6BC6 1D2E D90D 29A7 E9DE 2651" /* :RÙakÆ..Ù.)§éÞ&Q */
- $"CE3F 9921 03BC 7A7A CBFD 63E2 4C7C 9025" /* Î?™!.¼zzËýcâL|% */
- $"BCC3 D509 745E 9AE4 1675 0242 26EE E4F6" /* ¼ÃÕÆt^šä.u.B&îäö */
- $"B04B CFB3 E37F EADB 2840 E47E 0209 C8C5" /* °Kϳã.êÛ(@ä~.ÆÈÅ */
- $"56FC 6228 BB57 F43A BE32 0753 73FB EAE2" /* Vüb(»Wô:¾2.Ssûêâ */
- $"55B4 D581 42C8 10B8 AEA9 67C4 F685 982C" /* U´ÕBÈ.¸®©gÄö…˜, */
- $"3104 095F DCBD 3701 8749 9CBA A7A5 B714" /* 1.Æ_ܽ7.‡Iœº§¥·. */
- $"FDED FAA3 F034 54D8 728F 8640 4A61 560C" /* ýíú£ð4TØr†@JaV. */
- $"50D4 B224 A5F1 6715 6C8B 7EC6 BF5C 120D" /* PÔ²$¥ñg.l‹~Æ¿\.. */
- $"8797 B25E B0E1 C57E 69AF 1FF2 99C3 44B5" /* ‡—²^°áÅ~i¯.ò™ÃDµ */
- $"0508 0061 1F44 795F 27C0 511E 0796 9740" /* ...a.Dy_'ÀQ..–—@ */
- $"14FF 4C51 5651 34F3 658D 4CA8 3FBF 43CC" /* .ÿLQVQ4óeL¨?¿CÌ */
- $"8813 D372 1723 7DB5 6D44 4524 4E91 B644" /* ˆ.Ór.#}µmDE$N‘¶D */
- $"4B7D CDEC E0E0 8468 622D 87FE 80E3 E097" /* K}Íìàà„hb-‡þ€ãà— */
- $"303D 8894 1FFF 7FA6 9AAB C6E0 0B83 3EDD" /* 0=ˆ”.ÿ.¦š«Æà.ƒ>Ý */
- $"86A5 43D3 C650 0008 D364 A800 0000 0000" /* †¥CÓÆP..Ód¨..... */
- $"0000 07D7 8F92 61B9 E6E0 BCBF CD4A AB76" /* ...×’a¹æ༿ÍJ«v */
- $"5B6E 246A 8DFB D274 41F9 3583 773D 5165" /* [n$jûÒtAù5ƒw=Qe */
- $"2139 B773 476E DF91 33F0 8CDA F420 613F" /* !9·sGnß‘3ðŒÚô a? */
- $"9B35 33C9 8298 A661 A5DB 2CEF 1A1C BC3E" /* ›53É‚˜¦a¥Û,ï..¼> */
- $"09B4 5415 8511 4FE5 3FF8 B88C 339D C169" /* Æ´T.….Oå?ø¸Œ3Ái */
- $"9608 FF62 B2D6 285A 80A2 22C9 E4AA 5A99" /* –.ÿb²Ö(Z€¢"ÉäªZ™ */
- $"B3F5 E9D4 7FFF 7FF4 7D5C 4CC0 788F 0EB6" /* ³õéÔ.ÿ.ô}\LÀx.¶ */
- $"8024 0000 0A1E 1F40 0000 0000 0000 0000" /* €$..Â..@........ */
- $"CA54 CF6A 897B B6D7 9C90 87E9 FF6A 22A0" /* ÊTÏj‰{¶×œ‡éÿj"  */
- $"0765 4AE8 B827 B7A1 C412 4000 0000 0000" /* .eJè¸'·¡Ä.@..... */
- $"0000 2222 DAB7 AEED C4EB AFCB FF79 6610" /* ..""Ú·®íÄë¯Ëÿyf. */
- $"A362 D5F2 1401 DA9F 8978 3FC3 FF60 341C" /* £bÕò..ÚŸ‰x?Ãÿ`4. */
- $"524C CBF3 AF64 9BA4 637F F217 CA8C A4CE" /* RLËó¯d›¤c.ò.ÊŒ¤Î */
- $"A881 46DE C63F CB0B 4C86 F71C CDFF 6CDC" /* ¨FÞÆ?Ë.L†÷.ÍÿlÜ */
- $"3C86 AFD6 02EF 25B3 E392 0238 14ED F9FF" /* <†¯Ö.ï%³ã’.8.íùÿ */
- $"71EA 1A7B 7848 281D C18D 83C1 F0D1 C115" /* qê.{xH(.ÁƒÁðÑÁ. */
- $"C525 7E38 9E60 32A4 CED2 A5DE 8006 1212" /* Å%~8ž`2¤ÎÒ¥Þ€... */
- $"7136 14A1 74D1 9C7D F74C 708E 43DE 4154" /* q6.¡tÑœ}÷LpŽCÞAT */
- $"2939 179A 87BB 2AAF 7401 4404 CB30 458F" /* )9.š‡»*¯t.D.Ë0E */
- $"F1B7 EE42 3E46 458F B220 6F30 EE24 7D86" /* ñ·îB>FE² o0î$}† */
- $"2D28 3CA7 C184 60D3 4EBC 9C79 C402 02FC" /* -(<§Á„`ÓN¼œyÄ..ü */
- $"553C C62D DDC0 3D0C F12B C1FF 546D A4FF" /* U<Æ-ÝÀ=.ñ+ÁÿTm¤ÿ */
- $"5885 6B1B 9EF6 2206 8FB5 1CB0 2D3D B922" /* X…k.žö".µ.°-=¹" */
- $"644F D104 0152 70F8 BF41 4D6E 4F05 B928" /* dOÑ..Rpø¿AMnO.¹( */
- $"396A 4A92 9B1B 24AB 4611 6D95 87D6 2D7C" /* 9jJ’›.$«F.m•‡Ö-| */
- $"7546 B839 A3B1 C612 0F2A 796E 7911 5FF9" /* uF¸9£±Æ..*yny._ù */
- $"03C4 D13E EF00 2DEF 9CFE FDDE 3A2C FF3E" /* .ÄÑ>ï.-ïœþýÞ:,ÿ> */
- $"4567 F432 3673 3F84 8787 B65C 7A4F 2007" /* Egô26s?„‡‡¶\zO . */
- $"FF7C D894 A762 3872 8FA4 9563 D178 5039" /* ÿ|Ø”§b8r¤•cÑxP9 */
- $"C4BD 2EB4 0491 2A80 0000 0000 0000 0001" /* Ľ.´.‘*€........ */
- $"F172 6FA1 09F2 9F35 F3BC 2E0B 8E46 2557" /* ñro¡ÆòŸ5ó¼..ŽF%W */
- $"67C5 4F12 D1CF F08C BC61 0F89 E4A4 9249" /* gÅO.ÑÏðŒ¼a.‰ä¤’I */
- $"2492 4924 9249 221B 4708 65ED 84CA FDD2" /* $’I$’I".G.eí„ÊýÒ */
- $"D193 7C69 0CA3 95EF DDF2 33FF 556E D976" /* Ñ“|i.£•ïÝò3ÿUnÙv */
- $"2E4D FDCE E0FC 8669 83FF 768E 3CBB 179B" /* .MýÎàü†iƒÿvŽ<».› */
- $"DBB9 253D BFFF 79F1 5006 27BF 5548 40B9" /* Û¹%=¿ÿyñP.'¿UH@¹ */
- $"BADC F963 10BA 8BD9 367F E03A 6E29 5908" /* ºÜùc.º‹Ù6.à:n)Y. */
- $"0000 0000 0000 0000 0028 8080 0000 000A" /* .........(€€... */
- $"6370 D000 0142 83C0 0000 0011 CD3F D940" /* cpÐ..BƒÀ....Í?Ù@ */
- $"0022 C990 C912 501C 14FC 1926 5412 0E88" /* ."ÉÉ.P..ü.&T..ˆ */
- $"C32F B2ED E7A4 9249 2492 4924 9249 247E" /* Ã/²í礒I$’I$’I$~ */
- $"FB2C 999E D2ED 6DFF 783B 4C3A 3DB7 14A5" /* û,™žÒímÿx;L:=·.¥ */
- $"872C 2B85 8FC2 72EA 3412 FCA8 32E0 7A2E" /* ‡,+…Ârê4.ü¨2àz. */
- $"B109 F66C 3F99 7C32 2761 1522 7B9C 1851" /* ±Æöl?™|2'a."{œ.Q */
- $"B3CB 5373 0652 CE79 D8C5 B721 03D7 CD81" /* ³ËSs.RÎyØÅ·!.×Í */
- $"A03A CD5F CECF B58A 4122 7ED2 9FFF 7FFF" /*  :Í_ÎϵŠA"~ÒŸÿ.ÿ */
- $"1575 DF0B 430B 0A6C 6108 B421 B33F E9FA" /* .uß.C.Âla.´!³?éú */
- $"AC06 391C EB01 17F4 3BF4 4CDA 87DA 516F" /* ¬.9.ë..ô;ôLÚ‡ÚQo */
- $"EFA3 E7F9 651A 6902 C269 AF79 2EA4 D861" /* ï£çùe.i.Âi¯y.¤Øa */
- $"CBC1 7F37 146D 4163 38BB B16B AAD4 9AC2" /* ËÁ.7.mAc8»±kªÔšÂ */
- $"424A B3CE 1368 78EF B4B0 FE68 2FBA 0CB2" /* BJ³Î.hxï´°þh/º.² */
- $"E672 A89D 999E 64CD 417A 98A3 8458 0603" /* ær¨™ždÍAz˜£„X.. */
- $"C03D 9F9E B15E 8418 0FC6 F3E0 BA39 A3C1" /* À=Ÿž±^„..Æóàº9£Á */
- $"9929 0547 9C29 FC76 57CA B1E5 F887 AE73" /* ™).Gœ)üvWʱåø‡®s */
- $"78AA BA9F FF7F C07C 00F0 28E9 7533 0FC1" /* xªºŸÿ.À|.ð(éu3.Á */
- $"097C 4ABC F3CB 6604 EEC2 5194 A1F2 A201" /* Æ|J¼óËf.îÂQ”¡ò¢. */
- $"D6B0 C5F3 4AA3 8FD8 34DC A382 0CD4 134E" /* Ö°ÅóJ£Ø4Ü£‚.Ô.N */
- $"8275 37F5 2388 74C6 1A6C F889 1037 A348" /* ‚u7õ#ˆtÆ.lø‰.7£H */
- $"ACB4 EFF5 B446 564C C6DC 75F7 8445 013F" /* ¬´ïõ´FVLÆÜu÷„E.? */
- $"79FF 407B 05EE 9C66 8A53 FF7A 367A 6D06" /* yÿ@{.îœfŠSÿz6zm. */
- $"9ADF CBDD 25B5 0629 78A0 A071 35BA EE49" /* šßËÝ%µ.)x  q5ºîI */
- $"64E9 3EA3 9A07 917A 66E3 090C B916 3BF5" /* dé>£š.‘zfãÆ.¹.;õ */
- $"10D7 77D5 7281 248E 3F09 0C0F 319E 7F71" /* .×wÕr$Ž?Æ..1ž.q */
- $"98DA A34A C823 06A4 6BFD 8EA1 8C71 EB25" /* ˜Ú£JÈ#.¤kýŽ¡Œqë% */
- $"E5FC 0BA1 DB35 9514 A229 56F0 7E42 9FD0" /* åü.¡Û5•.¢)Vð~BŸÐ */
- $"5435 3CB7 AED9 0A4F 625B A493 D1B2 C654" /* T5<·®ÙÂOb[¤“ѲÆT */
- $"F691 87F9 F8E9 7459 1823 E06B 57D6 C638" /* ö‘‡ùøétY.#àkWÖÆ8 */
- $"7EE2 8CA0 1D79 4000 0000 0000 0000 0000" /* ~⌠.y@......... */
- $"0000 0000 442A 0D8C 8522 4E1A 3752 5040" /* ....D*.Œ…"N.7RP@ */
- $"E53D EE69 0B70 A6BF 9D0D D725 D66E 8D50" /* å=îi.p¦¿.×%ÖnP */
- $"10DB 966B 649B 0CA3 958B 6457 90CC 214A" /* .Û–kd›.£•‹dWÌ!J */
- $"C4C0 27A2 95F4 98AD 14C2 1892 EBE7 864B" /* ÄÀ'¢•ô˜­.Â.’ëç†K */
- $"18AA 55C7 50D2 4A15 7F4E 566A 9C13 9C52" /* .ªUÇPÒJ..NVjœ.œR */
- $"AC77 FE86 B3A2 5D92 D112 516C BA99 60EE" /* ¬wþ†³¢]’Ñ.Qlº™`î */
- $"221A F194 D9DF FF5F FF6B 77F9 4B01 4F8F" /* ".ñ”Ùßÿ_ÿkwùK.O */
- $"F681 8614 2F3E 31E3 EABB 7C34 6025 A491" /* ö†./>1ãê»|4`%¤‘ */
- $"9BC1 A348 628D 34AE 751A F8F7 7521 7F48" /* ›Á£Hb4®u.ø÷u!.H */
- $"68A4 6B9C F66F 252D 6021 9C97 39AB B637" /* h¤kœöo%-`!œ—9«¶7 */
- $"3B5D E8FB 56EE 824A F65D C84D E23C 7BF2" /* ;]èûVî‚Jö]ÈMâ<{ò */
- $"5400 0000 0000 0000 0000 0000 0014 080D" /* T............... */
- $"B05B 4688 1F60 376D 2209 1DE1 7E75 CD30" /* °[Fˆ.`7m"Æ.á~uÍ0 */
- $"5D2F 627B A077 8D86 2001 62AF 1031 6853" /* ]/b{ w† .b¯.1hS */
- $"2A8E 0308 16F6 C4EC E5B6 814A 1DF2 23EB" /* *Ž...öÄìå¶J.ò#ë */
- $"8C16 64F9 A1ED 8A1F 346E 2E1C 5ACB 4376" /* Œ.dù¡íŠ.4n..ZËCv */
- $"5014 B885 5212 5294 8F4F DF56 7339 8A5D" /* P.¸…R.R”OßVs9Š] */
- $"03C0 A05F D60B 5D58 2677 CD67 A4EE 3803" /* .À _Ö.]X&wÍg¤î8. */
- $"B2B1 9AD5 A41A C3EF 3281 3FFF 780A A5BD" /* ²±šÕ¤.Ãï2?ÿxÂ¥½ */
- $"861B 62F7 456F 1021 93CD A115 BD61 7E4C" /* †.b÷Eo.!“Í¡.½a~L */
- $"2306 D6BF D5D9 18AF 12BB 22D9 E32E 6976" /* #.Ö¿ÕÙ.¯.»"Ùã.iv */
- $"9282 5E47 A842 7983 2C87 64C5 6215 A0D9" /* ’‚^G¨Byƒ,‡dÅb. Ù */
- $"E45A EFAE 74F3 E5E5 7679 A7C0 D366 649C" /* äZï®tóååvy§ÀÓfdœ */
- $"9EF3 D763 2D6C D0AD 48E5 7A2A 9454 8B34" /* žó×c-lЭHåz*”T‹4 */
- $"B7FF 7FCD F604 90E4 2716 1C40 DD8A 8B1A" /* ·ÿ.Íö.ä'..@ÝŠ‹. */
- $"24C8 2F0C 06AC 999A 58B7 C15E E6B1 431B" /* $È/..¬™šX·Á^æ±C. */
- $"73D1 FEC5 5182 4A2D 33CB E920 AFBE 9F5A" /* sÑþÅQ‚J-3Ëé ¯¾ŸZ */
- $"0478 C2F3 80D7 241A 2E07 8BF3 FD3F 471A" /* .xÂó€×$...‹óý?G. */
- $"7C53 1C79 2F17 C32F D5C6 B977 E2F9 9D80" /* |S.y/.Ã/Õƹwâù€ */
- $"558B 7336 75BC 5945 3986 BD1C CE95 EA07" /* U‹s6u¼YE9†½.Εê. */
- $"7152 C778 65AD 73E9 F1B7 24D4 BDB0 7F24" /* qRÇxe­séñ·$Ô½°.$ */
- $"BACD 3C51 D344 33D7 21C7 BE9A 915D 2808" /* ºÍ<QÓD3×!Ǿš‘](. */
- $"3E68 3F1B 43AE 8F30 CE7F FF67 1C78 8498" /* >h?.C®0Î.ÿg.x„˜ */
- $"08D8 E1D9 3F1A E50B EB7C E564 6F4C 57F3" /* .ØáÙ?.å.ë|ådoLWó */
- $"9E60 5F9B 244E 83A9 33C9 668A 3951 7E33" /* ž`_›$Nƒ©3ÉfŠ9Q~3 */
- $"31D7 01E7 0342 6BC0 7FD1 7488 2BE1 9AD1" /* 1×.ç.BkÀ.Ñtˆ+ášÑ */
- $"1938 BBD8 7710 BAD3 BB92 2C80 A162 B2EF" /* .8»Øw.ºÓ»’,€¡b²ï */
- $"3FEA 6FC2 47D2 0D0E 28AB 03DA 4B34 4027" /* ?êoÂGÒ..(«.ÚK4@' */
- $"7FFD 87BC 9D96 E076 3C00 0000 0000 0000" /* .ý‡¼–àv<....... */
- $"0000 0000 0000 136C 1721 95F0 1991 3F80" /* .......l.!•ð.‘?€ */
- $"65DC 1F3F AEA0 BE5C 71D2 94CE C7FF 7FFF" /* eÜ.?® ¾\qÒ”ÎÇÿ.ÿ */
- $"7917 BEAD D458 935A 563C CC9C 6C0D CFFF" /* y.¾­ÔX“ZV<Ìœl.Ïÿ */
- $"55DA 93C2 F199 3D1E C4C2 3C5F A7BC D48E" /* UÚ“Âñ™=.ÄÂ<_§¼ÔŽ */
- $"4980 037B 9FCC F7BC 6E1E 78CD 2838 DC58" /* I€.{ŸÌ÷¼n.xÍ(8ÜX */
- $"F156 C827 88EA BFF7 BD95 BBD6 FE11 C305" /* ñVÈ'ˆê¿÷½•»Öþ.Ã. */
- $"A1D2 FA2A EA0B E56B 285B 91FE 551E F5E2" /* ¡Òú*ê.åk([‘þU.õâ */
- $"687C 5A51 1A67 64D3 BD76 4937 F455 4C94" /* h|ZQ.gdÓ½vI7ôUL” */
- $"6A7E B888 CB40 7AA3 DDEE 8BD8 2D9F 1EB6" /* j~¸ˆË@z£Ýî‹Ø-Ÿ.¶ */
- $"48DF 9C66 6BF3 A26A 3CC4 2D4D E47A 6D9A" /* Hßœfkó¢j<Ä-Mäzmš */
- $"DAB1 1DA4 083A D994 4416 C0D2 2E63 539E" /* Ú±.¤.:Ù”D.ÀÒ.cSž */
- $"7274 3C04 85F4 D7B5 EDEF 507A B2B7 1832" /* rt<.…ô×µíïPz²·.2 */
- $"6615 A186 4A80 0000 0000 0000 0000 0000" /* f.¡†J€.......... */
- $"07CF BF6C 3626 7453 BF7D 8B57 26C9 F556" /* .Ï¿l6&tS¿}‹W&ÉõV */
- $"1F12 0BB9 5DC4 797D 3C69 7DB2 2FFF 7F33" /* ...¹]Äy}<i}²/ÿ.3 */
- $"81FC E4ED 4BF8 9180 3FD2 0142 3F2D 1DF0" /* üäíKø‘€?Ò.B?-.ð */
- $"097B D61C 019A C409 B506 26FC D55D 7AE9" /* Æ{Ö..šÄƵ.&üÕ]zé */
- $"3464 6C57 13E7 565F 2553 70C3 3EC7 87AC" /* 4dlW.çV_%SpÃ>LJ¬ */
- $"3161 5289 3A6A FC0B E254 CAFA 6A32 2F8C" /* 1aR‰:jü.âTÊúj2/Œ */
- $"8B76 FA87 DADD 0333 2250 0058 F5C6 21CD" /* ‹vú‡ÚÝ.3"P.XõÆ!Í */
- $"D094 5CD5 10DD 2FA0 B74B 06FB AA9B 2B62" /* Д\Õ.Ý/ ·K.ûª›+b */
- $"E36D 708E B8F5 0739 3097 7F03 47BE 48F5" /* ãmpŽ¸õ.90—..G¾Hõ */
- $"D079 1641 CA5D DF28 C92B 0EFA B18F CE6F" /* Ðy.AÊ]ß(É+.ú±Îo */
- $"6648 DB26 DE5C 1D17 2BD3 28AF DD89 801C" /* fHÛ&Þ\..+Ó(¯Ý‰€. */
- $"AB0D 40D1 9016 D542 63A0 8222 9D7A F0F5" /* «.@Ñ.ÕBc ‚"zðõ */
- $"A171 2D28 3D2C C22E 09AB 3AA9 C50B 7545" /* ¡q-(=,Â.Æ«:©Å.uE */
- $"4C64 18E8 8E67 3A7D DDBE 36CE 2F97 5AD0" /* Ld.èŽg:}ݾ6Î/—ZÐ */
- $"E4F0 8AFB 6071 6268 E5F6 09EA 245F 9F87" /* äðŠû`qbhåöÆê$_Ÿ‡ */
- $"E304 242C 234C 9FF7 1D0A 11C7 4FE7 20BC" /* ã.$,#LŸ÷.Â.ÇOç ¼ */
- $"EC58 1A4B 5A8E DE45 0E5F 4A03 4C8A 5051" /* ìX.KZŽÞE._J.LŠPQ */
- $"E410 4405 321B BD82 AC69 94F7 AA5E 5C65" /* ä.D.2.½‚¬i”÷ª^\e */
- $"436F 861A C95F 1AB0 2E2B 9689 AA43 B247" /* Co†.É_.°.+–‰ªC²G */
- $"6DE3 4E9E F205 F221 D175 86BB 4434 C0EE" /* mãNžò.ò!Ñu†»D4Àî */
- $"C472 EA2B 499D 63FA B4C8 FAB3 91F3 060D" /* Ärê+Icú´Èú³‘ó.. */
- $"C203 A636 1D98 6B00 D678 0D3C BE92 309E" /* Â.¦6.˜k.Öx.<¾’0ž */
- $"759A 11D4 B514 24FB E4D2 7089 76DE 42DD" /* uš.Ôµ.$ûäÒp‰vÞBÝ */
- $"5338 4798 5943 4A6B 500A 472E 77BE AEBD" /* S8G˜YCJkPÂG.w¾®½ */
- $"93B0 117A 0E2D A8E4 DFED 5A76 1775 2BFF" /* “°.z.-¨äßíZv.u+ÿ */
- $"1A84 CBE1 B007 D3EA 11B0 9BB8 4B3F BB56" /* .„Ëá°.Óê.°›¸K?»V */
- $"33F6 B242 4C5C A63D 638F 1BA5 0AC5 698D" /* 3ö²BL\¦=c.¥ÂÅi */
- $"45B3 D343 D769 FEEE C45D 50B0 9AAA 4146" /* E³ÓC×iþîÄ]P°šªAF */
- $"0BFA F8CC 694B A42D FC1E C3F1 54F0 D3F9" /* .úøÌiK¤-ü.ÃñTðÓù */
- $"F051 5182 D373 5210 38AA F9B0 D3F3 6B07" /* ðQQ‚ÓsR.8ªù°Óók. */
- $"C944 7FCA 2126 D17A 01B1 7763 CDE8 D5FF" /* ÉD.Ê!&Ñz.±wcÍèÕÿ */
- $"00F4 08D7 4060 339C D8E2 7EA4 B00D 3171" /* .ô.×@`3œØâ~¤°.1q */
- $"ABB0 7F47 D146 13B9 398E 14B3 C55D 10AF" /* «°.GÑF.¹9Ž.³Å].¯ */
- $"8D0A 2444 26A0 EFEA 6CB2 51FD EA28 0FD7" /* Â$D& ïêl²Qýê(.× */
- $"4E2F F54F 0066 62F2 66F3 334C 5D9D 77ED" /* N/õO.fbòfó3L]wí */
- $"F3D0 12ED 7A95 89A1 B928 8429 DCFB 8C68" /* óÐ.íz•‰¡¹(„)ÜûŒh */
- $"C35C 3C77 5D7D 5180 A012 ADA3 AE60 AAE0" /* Ã\<w]}Q€ .­£®`ªà */
- $"0D88 09A4 4F7B FAC4 A2FD 327D E109 4F0B" /* .ˆÆ¤O{úÄ¢ý2}áÆO. */
- $"3343 C0ED D985 7402 93E2 7A2E 09B4 09A6" /* 3CÀíÙ…t.“âz.ƴƦ */
- $"5348 2E51 C037 BE62 C1A7 15C4 B9C8 7F4B" /* SH.QÀ7¾bÁ§.ĹÈ.K */
- $"FC22 3596 D989 C701 6701 5488 1001 22B2" /* ü"5–Ù‰Ç.g.Tˆ.."² */
- $"C06A A5D5 2C94 6BA9 D1C6 2B33 5910 8B1F" /* Àj¥Õ,”k©ÑÆ+3Y.‹. */
- $"0B0D 5531 BE0F 3E72 9C60 75A8 2669 220D" /* ..U1¾.>rœ`u¨&i". */
- $"E140 D538 7CD4 5763 D708 6D5E 45C0 AE61" /* á@Õ8|ÔWc×.m^EÀ®a */
- $"EC8B E180 1D9C 712C 4DB9 F177 6733 0F76" /* ì‹á€.œq,M¹ñwg3.v */
- $"9A72 7AD0 D18D 2BE6 9DCE 6294 4092 CE8E" /* šrzÐÑ+æÎb”@’ÎŽ */
- $"ACED 8B00 B050 AE53 C09C 98D6 CFD1 4208" /* ¬í‹.°P®SÀœ˜ÖÏÑB. */
- $"DEB2 AF01 5ED7 E1F4 4EAA 0B09 2263 FE09" /* Þ²¯.^×áôNª.Æ"cþÆ */
- $"2771 6EB7 9181 1DFE A5DD 9A12 4592 02FD" /* 'qn·‘.þ¥Ýš.E’.ý */
- $"5F2D D4D6 5C15 B454 B07C 9B6A B9F9 AEC2" /* _-ÔÖ\.´T°|›j¹ù®Â */
- $"D883 1F5F B9B1 8258 6732 C7E3 5C90 DB16" /* ؃._¹±‚Xg2Çã\Û. */
- $"42EC D875 2B9D FEAF 1FED BD80 261D BAAE" /* BìØu+þ¯.í½€&.º® */
- $"3799 FDC7 DBE5 E769 A11C 3304 5D3B 419C" /* 7™ýÇÛåçi¡.3.];Aœ */
- $"5844 E615 EE7A 5DCE 272E D055 121D 1F84" /* XDæ.îz]Î'.ÐU...„ */
- $"2EC6 E6B1 A7DA D03A D600 6D58 4FF0 9196" /* .Æ汧ÚÐ:Ö.mXOð‘– */
- $"FBCA CDDC 1B8D 9D1A BB7B 3782 0F3F 626C" /* ûÊÍÜ..»{7‚.?bl */
- $"26AA AF34 6A20 8210 1E96 ED21 5A26 EF04" /* &ª¯4j ‚..–í!Z&ï. */
- $"5F66 5C2D A8A4 F3BC 1871 AD1D FE4D 8C8B" /* _f\-¨¤ó¼.q­.þMŒ‹ */
- $"F1E5 A382 654B 08C7 EFC4 BFBA C29B 5C73" /* ñ壂eK.ÇïÄ¿ºÂ›\s */
- $"2420 9390 3B75 6DE6 0208 6F4F BB53 B2AA" /* $ “;umæ..oO»S²ª */
- $"AD28 4360 1A8A 4301 088C 6F17 68CC 9180" /* ­(C`.ŠC..Œo.hÌ‘€ */
- $"D757 7012 3BE3 C4AB DF05 97B9 4B57 B6FC" /* ×Wp.;ãÄ«ß.—¹KW¶ü */
- $"7693 36DE 89E8 E2AB 4352 A782 4520 DA28" /* v“6Þ‰èâ«CR§‚E Ú( */
- $"F1F2 34D6 2EAE E401 ED61 1E2E 4E74 D4EB" /* ñò4Ö.®ä.ía..NtÔë */
- $"98A9 94AD F856 8EE1 E3D0 06FC AA37 31E5" /* ˜©”­øVŽáãÐ.üª71å */
- $"1047 113E C151 CE86 B6A4 0F82 E5D9 CE50" /* .G.>ÁQΆ¶¤.‚åÙÎP */
- $"57A8 8F86 AFAD 21D1 2C4C F181 8BD7 106C" /* W¨†¯­!Ñ,Lñ‹×.l */
- $"3C77 649E 038E 3C63 66F4 EE1A 2906 755C" /* <wdž.Ž<cfôî.).u\ */
- $"EDD8 6093 6868 531C 9FA3 C5C9 3F3C 7786" /* íØ`“hhS.Ÿ£ÅÉ?<w† */
- $"BCC4 440C 13F9 0BCB 76BA 9364 A3CC 344F" /* ¼ÄD..ù.Ëvº“d£Ì4O */
- $"128B D594 CB9D A2DC 6C03 CA48 2D9E 9706" /* .‹Õ”Ë¢Ül.ÊH-ž—. */
- $"A281 5170 A91B 0033 4552 2A9A BF6F D4A9" /* ¢Qp©..3ER*š¿oÔ© */
- $"61B6 F6C1 7959 FDD2 8F3F C94B 2B90 29BB" /* a¶öÁyYýÒ?ÉK+)» */
- $"9FAA A83B FEFF 80A3 1EC2 B2D9 77CF 963B" /* Ÿª¨;þÿ€£.²ÙwÏ–; */
- $"85FF 5728 5CDD 2F01 7556 8155 F8AA 7984" /* …ÿW(\Ý/.uVUøªy„ */
- $"7543 0C18 A1FC 0353 DF5F D368 41E9 E0EF" /* uC..¡ü.Sß_ÓhAéàï */
- $"C363 A78F 3FE9 41E9 5F77 19A4 A811 FF43" /* Ãc§?éAé_w.¤¨.ÿC */
- $"8EE8 3FBA 00FA 54F6 15F5 CF3B 39A6 0984" /* Žè?º.úTö.õÏ;9¦Æ„ */
- $"CC99 7AE1 8E5B 71A9 1575 DB95 F166 D52F" /* Ì™záŽ[q©.uÛ•ñfÕ/ */
- $"A270 08D4 9515 3B89 2EA1 A097 12A3 B4E9" /* ¢p.Ô•.;‰.¡ —.£´é */
- $"5BFB AE47 8FD7 60F0 33DA E91B 234B 5D2F" /* [û®G×`ð3Úé.#K]/ */
- $"7C4B 00C2 60F1 7260 B78A 1835 B440 611B" /* |K.Â`ñr`·Š.5´@a. */
- $"042D F768 F9C9 8785 50AD 8421 77D4 B97A" /* .-÷hùɇ…P­„!wÔ¹z */
- $"6B02 828C E758 8B31 1E92 DF7F BE67 3DAB" /* k.‚ŒçX‹1.’ß.¾g=« */
- $"E5F8 F1FB FD8C 34F4 4B2F 98BF 24A9 4DF2" /* åøñûýŒ4ôK/˜¿$©Mò */
- $"32A9 A661 B01E F960 12E1 9C18 F197 CEA7" /* 2©¦a°.ù`.áœ.ñ—Χ */
- $"E1C4 4AB4 7CEB 2CE2 33F3 C23C F3FD 2CF9" /* áÄJ´|ë,â3óÂ<óý,ù */
- $"F132 8395 3D39 FD9D 983D 4454 9758 856B" /* ñ2ƒ•=9ý˜=DT—X…k */
- $"6556 B234 72B0 C2CA 71CA 9CEB 7AE4 FD7C" /* eV²4r°ÂÊqÊœëzäý| */
- $"0E3F 1930 6B17 7074 C216 3D9C 24BF 5B97" /* .?.0k.ptÂ.=œ$¿[— */
- $"A7EA 25F0 9DCC AFA5 BBEF 47E9 D7E6 7B0E" /* §ê%ð̯¥»ïGé×æ{. */
- $"E02F 87A2 EF87 68FC 9BF7 F274 5F00 FC3D" /* à/‡¢ï‡hü›÷òt_.ü= */
- $"A5F8 7AC7 F0FA A5F8 7D42 C03F 0F42 FE1D" /* ¥øzÇðú¥ø}BÀ?.Bþ. */
- $"ABF0 F7CF E1EE 40ED 1CBC E67A C7C3 33E9" /* «ð÷Ïáî@í.¼æzÇÃ3é */
- $"75CE 6202 697A FF68 B299 C0A6 2F39 4F64" /* uÎb.izÿh²™À¦/9Od */
- $"6775 1459 6387 68C9 941E E328 B150 8D7C" /* gu.Yc‡hÉ”.ã(±P| */
- $"24C4 D953 4443 9A50 E4CC 4E41 B3A9 F28A" /* $ÄÙSDCšPäÌNA³©òŠ */
- $"BB0E 943C 0DAB C98A 023C 332B AE2D AF60" /* ».”<.«ÉŠ.<3+®-¯` */
- $"4D30 BA77 9D1A 93DC CEBB 7560 EA33 084C" /* M0ºw.“Üλu`ê3.L */
- $"BCFD 2F47 685E 4CC9 8A76 F1C8 04AB 126F" /* ¼ý/Gh^LÉŠvñÈ.«.o */
- $"B9FD 4A34 E181 4147 9F56 2AB4 EB2C 50EF" /* ¹ýJ4áAGŸV*´ë,Pï */
- $"D652 4543 763B B857 210B 2B4A BB50 0EAE" /* ÖRECv;¸W!.+J»P.® */
- $"90BD EEEC F92B DD18 0881 9B3A C6DF A028" /* ½îìù+Ý..›:Æß ( */
- $"45EB 36D7 50B4 D756 FB49 9F08 D74D 037B" /* Eë6×P´×VûIŸ.×M.{ */
- $"83A1 001C 0977 1DCC 81D0 B6B9 828A 6851" /* ƒ¡..Æw.Ìж¹‚ŠhQ */
- $"3CAC B3FF 572B 543A 4C73 3F35 0561 EC81" /* <¬³ÿW+T:Ls?5.aì */
- $"A8D4 82BC 9148 5E30 FF3E 3164 C43E 5461" /* ¨Ô‚¼‘H^0ÿ>1dÄ>Ta */
- $"4BD0 139E 6390 0E05 4793 56B8 5080 CBF6" /* KÐ.žc..G“V¸P€Ëö */
- $"9E70 BEA1 FB26 DD1E AEE1 E78D 0D32 FA02" /* žp¾¡û&Ý.®áç.2ú. */
- $"43FC FBC6 7464 2C9A 14AD 2C7C 0969 995F" /* CüûÆtd,š.­,|Æi™_ */
- $"6363 3037 9C34 C5F8 42DF B339 D2B0 5C45" /* cc07œ4ÅøBß³9Ò°\E */
- $"6130 509D 28E7 D3A7 9308 74ED 9265 B7F9" /* a0P(çÓ§“.tí’e·ù */
- $"0F54 D265 33D9 EB57 07C4 852B E3C8 771F" /* .TÒe3ÙëW.Ä…+ãÈw. */
- $"21F8 ADA3 D807 625C 513A E395 604B 0D6A" /* !ø­£Ø.b\Q:ã•`K.j */
- $"A9FC 297E 63AF 7622 23B6 63E1 EF25 F572" /* ©ü)~c¯v"#¶cáï%õr */
- $"01B0 400D 18C6 C9FA 6AF5 3E26 4199 6E68" /* .°@..ÆÉújõ>&A™nh */
- $"99B5 B3A9 F861 3419 C6C7 B65C D0F6 353B" /* ™µ³©øa4.ÆǶ\Ðö5; */
- $"6551 1B0A 9D82 1F07 4185 8C46 5867 DC22" /* eQ.‚..A…ŒFXgÜ" */
- $"BD38 AFF7 27BA 1114 9266 5EF4 1EA9 89B4" /* ½8¯÷'º..’f^ô.©‰´ */
- $"A634 E917 65E5 502E 8028 D24E 725F 0C22" /* ¦4é.eåP.€(ÒNr_." */
- $"1513 7B38 5FEA 3150 520B 6D8A 03D8 F796" /* ..{8_ê1PR.mŠ.Ø÷– */
- $"D183 D8FA 82E2 C147 B662 593B 9FC8 A2A0" /* уØú‚âÁG¶bY;ŸÈ¢  */
- $"C63B D151 D905 072C 02E5 919B 0BE9 6D76" /* Æ;ÑQÙ..,.å‘›.émv */
- $"4BEF 7D51 FF67 C2F2 BB61 DDD2 7981 0B7E" /* Kï}QÿgÂò»aÝÒy.~ */
- $"D406 3679 DFA4 FAE3 A33C 28AC 06C6 93C1" /* Ô.6yߤúã£<(¬.Æ“Á */
- $"B82F 53DB 1EB8 A6F3 5A24 A44A 1A76 9204" /* ¸/SÛ.¸¦óZ$¤J.v’. */
- $"6543 FC80 18DA 3C5D 395B 01DC D7E8 C21E" /* eCü€.Ú<]9[.Ü×èÂ. */
- $"A66C 9AE3 08D6 DBFC EE95 9E73 F71D 7CCA" /* ¦lšã.ÖÛüî•žs÷.|Ê */
- $"2A6A F6D2 11D9 AC28 BEDE 8E1B 65EF A995" /* *jöÒ.Ù¬(¾ÞŽ.eï©• */
- $"F7B5 B19D 5F63 F42B D0AD D69A BD47 1EED" /* ÷µ±_cô+Э֚½G.í */
- $"2E5C 0276 3AEA F6D9 6E3F 314C 7F5F 52C3" /* .\.v:êöÙn?1L._RÃ */
- $"093D C8A9 23E4 C154 5587 294A 98A9 0643" /* Æ=È©#äÁTU‡)J˜©.C */
- $"AF18 0D20 51A4 6FE1 F326 11E7 5A91 2919" /* ¯.. Q¤oáó&.çZ‘). */
- $"DD53 B13B 2CB3 DE77 FAB9 420E BAFB 305B" /* ÝS±;,³Þwú¹B.ºû0[ */
- $"E9AB 7A2B 623B 78FE 346D 8BB6 BA40 AE40" /* é«z+b;xþ4m‹¶º@®@ */
- $"5B6D 6D53 81A1 076D 7058 E792 E410 3FA7" /* [mmS¡.mpXç’ä.?§ */
- $"AD06 7E2E 5158 D129 9233 6E1D 6B7C C701" /* ­.~.QXÑ)’3n.k|Ç. */
- $"D61D 42D8 472F D5E2 2710 0B6C 828A 2352" /* Ö.BØG/Õâ'..l‚Š#R */
- $"D400 65FA E227 A938 1832 18CC 2BCE 19A8" /* Ô.eúâ'©8.2.Ì+Î.¨ */
- $"773C 3CB1 C6BD D722 8EE1 8AE2 4D4B 97D4" /* w<<±Æ½×"ŽáŠâMK—Ô */
- $"1763 37E4 2F93 8578 534E 0BA9 B493 3B80" /* .c7ä/“…xSN.©´“;€ */
- $"F018 28BE 2A52 15B2 8499 08A8 005F F028" /* ð.(¾*R.²„™.¨._ð( */
- $"ADFD ACEB 238F 922A 75E4 1C65 F2C3 F14B" /* ­ý¬ë#’*uä.eòÃñK */
- $"213D 7263 4A9A 1C80 12BD 5895 0EC8 B955" /* !=rcJš.€.½X•.ȹU */
- $"8CD0 FB81 63CF FF7F B545 85DF E201 36A9" /* ŒÐûcÏÿ.µE…ßâ.6© */
- $"E524 1BD6 EDDA 7C33 8CD2 E114 BA93 51E0" /* å$.ÖíÚ|3ŒÒá.º“Qà */
- $"A113 A12A FBEA 8570 B5FE E1B6 7963 5B31" /* ¡.¡*ûê…pµþá¶yc[1 */
- $"512A 99B1 3A59 E50E C584 DD7F FF7F FF7E" /* Q*™±:Yå.Å„Ý.ÿ.ÿ~ */
- $"D3C9 019B 1FBC DB70 2C2A 14A6 E7F1 0147" /* ÓÉ.›.¼Ûp,*.¦çñ.G */
- $"5F3A A36C 6F8A 9038 ABD8 EB8F FF7F FE79" /* _:£loŠ8«Øëÿ.þy */
- $"6C12 2D6F FD6D F9A0 0392 0E82 0296 3C14" /* l.-oýmù .’.‚.–<. */
- $"FEFA 803C A3D4 1049 CF30 E22F 6542 7ABF" /* þú€<£Ô.IÏ0â/eBz¿ */
- $"378E 66B2 9091 D396 B953 DCF5 66D3 C5B5" /* 7Žf²‘Ó–¹SÜõfÓŵ */
- $"7719 028C 5C0F F898 00A1 0C1D E181 F9C7" /* w..Œ\.ø˜.¡..áùÇ */
- $"2E46 06D4 D623 1256 EFAE 89E3 4FFF 7FDD" /* .F.ÔÖ#.VﮉãOÿ.Ý */
- $"F00D 4E11 65D5 B8F9 7C0B A045 AC4A 1E42" /* ð.N.eÕ¸ù|. E¬J.B */
- $"221C B512 5480 EF2D CB80 A089 3603 2CA1" /* ".µ.T€ï-Ë€ ‰6.,¡ */
- $"391C 7925 C817 92E3 8438 C438 08D1 0637" /* 9.y%È.’ã„8Ä8.Ñ.7 */
- $"9FCD F4C2 C04C 40BB A484 5043 0C1E 7C85" /* ŸÍôÂÀL@»¤„PC..|… */
- $"D7F6 1F6D BFC7 60AA 4D18 A399 9A13 CCD0" /* ×ö.m¿Ç`ªM.£™š.ÌÐ */
- $"26DA 3F97 24CB E902 0668 67F7 FE63 7A2E" /* &Ú?—$Ëé..hg÷þcz. */
- $"16D6 987F FF7F AFC1 5C35 E63D BA36 6227" /* .Ö˜.ÿ.¯Á\5æ=º6b' */
- $"FF7C FD39 8B8B 1A5F 6026 831B 0764 8805" /* ÿ|ý9‹‹._`&ƒ..dˆ. */
- $"E40B 0F19 7FFF 7FFC DEBC DD5B 9008 0000" /* ä....ÿ.üÞ¼Ý[... */
- $"0C24 1D44 4641 3BC8 4248 E229 62D2 088D" /* .$.DFA;ÈBHâ)bÒ. */
- $"117F DE8D 0B52 C3FD 1DD9 3823 F138 4C98" /* ..Þ.RÃý.Ù8#ñ8L˜ */
- $"58A8 2683 519C F914 4961 5226 891F F863" /* X¨&ƒQœù.IaR&‰.øc */
- $"3FF2 B19F 113D BFEF 9D12 30C6 66BD E2A6" /* ?ò±Ÿ.=¿ï.0Æf½â¦ */
- $"5D8C BE7E BE19 3D8F 03F2 5D26 FF7F FF7E" /* ]Œ¾~¾.=.ò]&ÿ.ÿ~ */
- $"A82B 5E03 E7A8 E8F1 8C4D B6F1 F0E2 FC36" /* ¨+^.ç¨èñŒM¶ñðâü6 */
- $"DE7A 2F55 38B1 B436 2E50 7D25 E3F0 82C8" /* Þz/U8±´6.P}%ãð‚È */
- $"580F 0D19 C280 415C 2A7F FCD9 C720 E649" /* X...€A\*.üÙÇ æI */
- $"4064 2624 04AC 0B71 41FD 3937 8359 4137" /* @d&$.¬.qAý97ƒYA7 */
- $"8CA9 B642 C318 BD37 82D3 B786 8217 3252" /* Œ©¶BÃ.½7‚Ó·†‚.2R */
- $"44EA 4598 57D2 2F66 957F 39FE D712 F449" /* DêE˜WÒ/f•.9þ×.ôI */
- $"213A BEBB B6CC F551 FF7F EB0A AE45 8497" /* !:¾»¶ÌõQÿ.ë®E„— */
- $"0F4C FD34 4090 01FE CFC8 51AA C32A 7D95" /* .Lý4@.þÏÈQªÃ*}• */
- $"D414 2609 E22F 1B7D E10E 97BB 05D1 9D04" /* Ô.&Æâ/.}á.—».Ñ. */
- $"0592 9271 0D39 AB59 F165 0D09 549C B4E3" /* .’’q.9«Yñe.ÆTœ´ã */
- $"AEE5 555F 00A3 5E0A E4D3 BAFE 1EC6 2FCE" /* ®åU_.£^ÂäÓºþ.Æ/Î */
- $"FB04 C9BC 71D8 A42D 2F70 9FE1 EC17 C31D" /* û.ɼqؤ-/pŸáì.Ã. */
- $"ECB2 0A82 EFB1 914C F6D2 E54C 5316 B6C4" /* ì²Â‚ﱑLöÒåLS.¶Ä */
- $"4FFF 653B FD6E 27A6 9959 244B F458 B35C" /* Oÿe;ýn'¦™Y$KôX³\ */
- $"865C EB94 2CD7 7343 B74C C211 8A4D 2A99" /* †\ë”,×sC·LÂ.ŠM*™ */
- $"732E 3B43 CEAC C300 A520 924D 6F1F 8295" /* s.;CάÃ.¥ ’Mo.‚• */
- $"DF36 1FD4 E8F0 9221 6313 1B33 0C98 2721" /* ß6.Ôèð’!c..3.˜'! */
- $"8F55 5BA1 0E46 A755 1D7F A914 458D 9FFF" /* U[¡.F§U..©.EŸÿ */
- $"33CF 4CE3 AFC6 3383 BC4D A7E9 F546 FDCB" /* 3ÏLã¯Æ3ƒ¼M§éõFýË */
- $"8276 7778 2BBA EF7C 3677 6251 58C0 9EFF" /* ‚vwx+ºï|6wbQXÀžÿ */
- $"526C C883 6CFF 7FFF 7D4C 3F9F BD74 6BE9" /* Rlȃlÿ.ÿ}L?Ÿ½tké */
- $"B6EB 9003 823B 235D 6AD9 B382 FC45 F10C" /* ¶ë.‚;#]jÙ³‚üEñ. */
- $"8282 90ED 9D47 E949 FADC 7B04 1C1C 9EF1" /* ‚‚íGéIúÜ{...žñ */
- $"1ABB 270D 07BE 1943 4E14 70E0 48FF 81EE" /* .»'..¾.CN.pàHÿî */
- $"CE8A 5AAD 3CE9 090D 3126 F96A AEBA 5853" /* ΊZ­<éÆ.1&ùj®ºXS */
- $"D02E ADE8 4614 E2B7 2E7E 3DB6 DE6A 77A8" /* Ð.­èF.â·.~=¶Þjw¨ */
- $"48D0 2DBB BAF4 E94C 735D 27D6 87FF 7F80" /* HÐ-»ºôéLs]'Ö‡ÿ.€ */
- $"5BCC 3CA6 1168 D9E0 38B4 22B2 2154 02AA" /* [Ì<¦.hÙà8´"²!T.ª */
- $"A1FF 6D87 EB2B F3EB 3814 9F74 DEF3 4D86" /* ¡ÿm‡ë+óë8.ŸtÞóM† */
- $"ED68 7E75 9E81 1FD9 170B E013 7E4D 97B3" /* íh~už.Ù..à.~M—³ */
- $"51B0 6B2A 42AF EEB4 899B D2A2 6AC9 8EBF" /* Q°k*B¯î´‰›Ò¢jÉŽ¿ */
- $"2858 9FFC 5050 3364 8F2D 313E 94A9 5ED5" /* (XŸüPP3d-1>”©^Õ */
- $"6213 E9DD 6FF6 5813 72DA FE40 0F70 06C4" /* b.éÝoöX.rÚþ@.p.Ä */
- $"FF7D 053C 3E69 C976 DDFF 02D9 4688 D8D7" /* ÿ}.<>iÉvÝÿ.ÙFˆØ× */
- $"8DEF 5187 FCA3 40EE 3167 B6DD 7EE6 42AB" /* ïQ‡ü£@î1g¶Ý~æB« */
- $"B07A DB20 DC1D 7016 631F 8FB0 C83A 9CC2" /* °zÛ Ü.p.c.°È:œÂ */
- $"66B9 304B 74F5 03F7 217C D3E3 6000 ECE6" /* f¹0Ktõ.÷!|Óã`.ìæ */
- $"A319 FD9E 4131 7E74 59C6 FB3F 1B51 FE89" /* £.ýžA1~tYÆû?.Qþ‰ */
- $"52D3 C845 1BF0 4BFE 3BAE 4940 9830 8E9C" /* RÓÈE.ðKþ;®I@˜0Žœ */
- $"F843 F6A2 218E B2E2 8092 8E0E 3889 8137" /* øCö¢!Ž²â€’Ž.8‰7 */
- $"583C 394F CCE6 3D1B 37B8 C9A4 D805 B9E4" /* X<9OÌæ=.7¸É¤Ø.¹ä */
- $"A037 E45D 1167 9627 81E0 538C 1B6D EA0E" /*  7ä].g–'àSŒ.mê. */
- $"18CD 8E3C EE0C 5E0C B048 8DD2 C804 CA38" /* .ÍŽ<î.^.°HÒÈ.Ê8 */
- $"8678 CAA9 5EE1 8B6C E7D9 FDE1 5C14 D52A" /* †xÊ©^á‹lçÙýá\.Õ* */
- $"67F3 8A12 F698 857A 5692 1FB3 FF27 FE1B" /* góŠ.ö˜…zV’.³ÿ'þ. */
- $"7E31 5D25 B4A2 3647 FF07 064A 4D7B F160" /* ~1]%´¢6Gÿ..JM{ñ` */
- $"62D7 81CE 0940 AE5F CAEB F1A6 10C4 CB0E" /* b×ÎÆ@®_Êëñ¦.ÄË. */
- $"3D77 2C40 0146 8C72 B765 F6A9 3047 E748" /* =w,@.FŒr·eö©0GçH */
- $"0239 A725 8B4C 56F0 7E86 9A24 53D7 4832" /* .9§%‹LVð~†š$S×H2 */
- $"7924 73CB 4431 4977 0487 03FC F1B3 A21C" /* y$sËD1Iw.‡.üñ³¢. */
- $"2792 0B05 8183 8348 8EC0 2635 47D9 B51D" /* '’..ƒƒHŽÀ&5GÙµ. */
- $"CE40 1FA4 20C5 93A8 BEB4 B8CD 93D8 A79E" /* Î@.¤ Å“¨¾´¸Í“اž */
- $"62C5 846C 964D 0404 BE21 3AA5 9EC3 4450" /* bÅ„l–M..¾!:¥žÃDP */
- $"FAEE 938A A428 E4D0 7F1B 46A8 7AEC 97FB" /* úî“Š¤(äÐ..F¨zì—û */
- $"1AFF 71DA F26D B5B1 E6F2 66B4 865E 1F12" /* .ÿqÚòmµ±æòf´†^.. */
- $"CE0F 3A8A EDF1 6321 BC5A 22D5 D3D6 BE19" /* Î.:Šíñc!¼Z"ÕÓÖ¾. */
- $"671A 38C3 11E8 FC9D 93AC 895A 1B84 7C9B" /* g.8Ã.èü“¬‰Z.„|› */
- $"979F 5DC5 BBE6 19A8 5D03 BE83 6FA4 B8F2" /* —Ÿ]Å»æ.¨].¾ƒo¤¸ò */
- $"AFCD 8115 B21B C1D5 80B4 5E20 3B19 9E48" /* ¯Í.².ÁÕ€´^ ;.žH */
- $"29C0 68DA F799 EC0D 56B3 7049 5EC1 11CB" /* )ÀhÚ÷™ì.V³pI^Á.Ë */
- $"CBAF FA0A 5AF1 22F1 3A4C 6F13 635A C681" /* ˯úÂZñ"ñ:Lo.cZÆ */
- $"06DA 8B44 A35B CF31 9B6F 57E6 AEC2 8D59" /* .Ú‹D£[Ï1›oWæ®ÂY */
- $"1556 A43E A289 74DC C398 B209 31B9 8CD0" /* .V¤>¢‰tÜزÆ1¹ŒÐ */
- $"07BE D253 76AB 7D79 4F26 D099 7AE8 E52C" /* .¾ÒSv«}yO&Йzèå, */
- $"EA35 D7BB E968 CAA0 5F61 EAE5 E9A1 E903" /* ê5×»éhÊ _aêåé¡é. */
- $"100E ED2C 5A66 21E2 1426 BE74 7A19 8C98" /* ..í,Zf!â.&¾tz.Œ˜ */
- $"3D67 A4D2 370F C95D 7131 2D31 0971 6022" /* =g¤Ò7.É]q1-1Æq`" */
- $"F4F2 359E 1FBD D23A CD94 4467 205E F7B1" /* ôò5ž.½Ò:Í”Dg ^÷± */
- $"5D18 EE91 9078 176B ADC2 65EB EECF D1A8" /* ].î‘x.k­ÂeëîÏѨ */
- $"F1B3 B999 E7CC 3079 BD9C 82D8 DF6E 29E0" /* ñ³¹™çÌ0y½œ‚Øßn)à */
- $"9502 EC8D 5C13 629B 109E A7C0 F438 6674" /* •.ì\.b›.ž§Àô8ft */
- $"C48B E75A 7CAC 28AE 3E9C 0ECF 9ADF F7BF" /* Ä‹çZ|¬(®>œ.Ïšß÷¿ */
- $"C51A E20D 64F1 B1DD C986 0C6F 6BFF 5102" /* Å.â.dñ±ÝɆ.okÿQ. */
- $"B233 B826 EBC9 35E2 9799 0A0F E81D 0816" /* ²3¸&ëÉ5â—™Â.è... */
- $"E01C B1A8 E4D9 1CCF 7F2E 4DB3 371B 83C0" /* à.±¨äÙ.Ï..M³7.ƒÀ */
- $"9DFD A603 83D6 4412 7DCF 2E2F 85D8 8259" /* ý¦.ƒÖD.}Ï./…Ø‚Y */
- $"DC97 798F 2E8A 09F5 C1A7 1E56 55F3 BFD0" /* Ü—y.ŠÆõÁ§.VUó¿Ð */
- $"34CE 311A 98BE C87C 8CCE 6EDF C85C A788" /* 4Î1.˜¾È|ŒÎnßÈ\§ˆ */
- $"AA7E 47D5 72AF 1842 5C5F 9D6A C586 CA4C" /* ª~GÕr¯.B\_jņÊL */
- $"34D3 6315 D6CA 0D6D 5B75 6C85 551B E270" /* 4Óc.ÖÊ.m[ul…U.âp */
- $"E9DD 6127 C363 1F5A 0AA4 8F55 114F 9ED3" /* éÝa'Ãc.Z¤U.OžÓ */
- $"034E A968 1BF1 513A 2F0D 3E61 612A 15E6" /* .N©h.ñQ:/.>aa*.æ */
- $"B89F 1877 F38E 8C96 20C3 1952 A559 62AE" /* ¸Ÿ.w󎌖 Ã.R¥Yb® */
- $"20E0 BE7D BF7C FAA3 F56C FF75 6D5E 07E7" /* à¾}¿|ú£õlÿum^.ç */
- $"EB87 E7E9 BFE7 EE37 E7EE B60B E7DA F7CF" /* ë‡çé¿çî7çî¶.çÚ÷Ï */
- $"A6FF 2B5C 2F9F AC00 ED1C BCF0 084D B6D5" /* ¦ÿ+\/Ÿ¬.í.¼ð.M¶Õ */
- $"A3F8 3A1B 179B 5659 AE02 A536 8D65 B1A0" /* £ø:..›VY®.¥6e±  */
- $"F806 81C6 9453 B9E5 1E84 EF36 3D8C 9922" /* ø.Æ”S¹å.„ï6=Œ™" */
- $"A841 EBC7 584D 175D A8CF 5AE5 52F4 364A" /* ¨AëÇXM.]¨ÏZåRô6J */
- $"CACB F4FA 59D1 6C18 1FE0 5F96 0F70 465A" /* ÊËôúYÑl..à_–.pFZ */
- $"7CFD 0C37 59FF 6248 10C6 4872 8573 D54E" /* |ý.7YÿbH.ÆHr…sÕN */
- $"7839 337E D900 4336 CF58 B59C BCC4 602F" /* x93~Ù.C6ÏXµœ¼Ä`/ */
- $"EA1A 205F CD8D 635B AE0D 5750 3316 72C7" /* ê. _Íc[®.WP3.rÇ */
- $"A765 C2F2 CF8C 52FB 1892 F55E B7A5 6D85" /* §eÂòÏŒRû.’õ^·¥m… */
- $"5782 FAB6 FBB5 CDF3 2DC2 0256 2927 4F4F" /* W‚ú¶ûµÍó-Â.V)'OO */
- $"1F92 5F99 B540 87DD 7A80 991B 0677 AB00" /* .’_™µ@‡Ýz€™..w«. */
- $"2D82 C5F6 11F7 F21B 2652 B798 75D5 42A6" /* -‚Åö.÷ò.&R·˜uÕB¦ */
- $"7757 E0E7 3C3F DBA5 6106 9F44 1800 E044" /* wWàç<?Û¥a.ŸD..àD */
- $"5844 8C9D 83C0 C5D3 6B95 CE2A 3EBC D7FD" /* XDŒƒÀÅÓk•Î*>¼×ý */
- $"B79B E645 6FD3 A5EE ECE2 C9A7 53C7 B2E3" /* ·›æEoÓ¥îìâɧSDzã */
- $"C659 D5C5 0FBD 7C88 93C3 D3D9 D81F 0AEB" /* ÆYÕÅ.½|ˆ“ÃÓÙØ.Âë */
- $"5784 8BF9 DAD7 993D 0C8B 9873 08A4 254B" /* W„‹ùÚ×™=.‹˜s.¤%K */
- $"2452 F95D 29CA 8B3E D48D 18FB C813 4ECB" /* $Rù])Ê‹>Ô.ûÈ.NË */
- $"D118 E3FA 926C 7A5F E5CC F774 D1DB B5C1" /* Ñ.ãú’lz_åÌ÷tÑÛµÁ */
- $"579A 2647 619A 67A0 423D 6C64 B3A6 9357" /* Wš&Gašg B=ld³¦“W */
- $"B8C6 8FBE A3AC E380 E548 5ED3 D83D 7DB9" /* ¸Æ¾£¬ã€åH^ÓØ=}¹ */
- $"93E8 9071 F6E0 168F 6BEC F674 6D08 F4DA" /* “èqöà.kìötm.ôÚ */
- $"C1F7 11FD DEF8 2420 30DA 71E2 C605 81EB" /* Á÷.ýÞø$ 0ÚqâÆ.ë */
- $"565B D461 AF6E 3127 34AC BA64 C660 14E1" /* V[Ôa¯n1'4¬ºdÆ`.á */
- $"F6AB DA92 386B 3E7B BD42 90E9 ABA2 6EE7" /* ö«Ú’8k>{½Bé«¢nç */
- $"8D0D 373C D280 46EC 6746 310C EA41 862B" /* .7<Ò€FìgF1.êA†+ */
- $"6D1B 7BE9 93AF 17F6 1D3A E7AB CA55 8A4B" /* m.{铯.ö.:ç«ÊUŠK */
- $"E867 6EF3 29DF FF5F B839 75E1 FA04 DD81" /* ègnó)ßÿ_¸9uáú.Ý */
- $"B6C9 DA44 D268 3B1A FF63 60F5 37A5 DDCB" /* ¶ÉÚDÒh;.ÿc`õ7¥ÝË */
- $"1AB3 5275 7692 7F15 F8E8 6A96 CEB4 D9E5" /* .³Ruv’..øèj–δÙå */
- $"3E5A 0E16 B1D0 B056 D0D2 0360 0900 5773" /* >Z..±Ð°VÐÒ.`Æ.Ws */
- $"BB3F C215 FD55 C9BF E3FC 48A1 CFAB BD39" /* »?Â.ýUÉ¿ãüH¡Ï«½9 */
- $"CD3D 906E 21CB C3DD E4D3 548C 4731 E777" /* Í=n!ËÃÝäÓTŒG1çw */
- $"EE15 C0DE CEBC 0F2F 85A6 9822 F1FF 7B2F" /* î.ÀÞμ./…¦˜"ñÿ{/ */
- $"2530 48C7 0C39 3659 CD03 06C5 7C8E 3D49" /* %0HÇ.96YÍ..Å|Ž=I */
- $"FED5 7B72 4652 772C 39C7 8F1B 63E8 2DC1" /* þÕ{rFRw,9Ç.cè-Á */
- $"1242 CA35 E396 6103 15DF D939 0597 B8D4" /* .BÊ5ã–a..ßÙ9.—¸Ô */
- $"8858 ACE3 3C32 6EE5 69A3 8512 3447 2B3B" /* ˆX¬ã<2nåi£….4G+; */
- $"0647 8C1F 2D31 4E57 0D03 BE26 5235 5275" /* .GŒ.-1NW..¾&R5Ru */
- $"74E8 B8F6 CF32 E077 8C51 41DB ED67 EE30" /* tè¸öÏ2àwŒQAÛígî0 */
- $"AD97 7956 D279 B0A8 768D 00E3 F604 A240" /* ­—yVÒy°¨v.ãö.¢@ */
- $"9656 5BCD B309 D0CD 3ECE C477 31EC F88D" /* –V[ͳÆÐÍ>ÎÄw1ìø */
- $"782F 8B9E 37FA A741 C636 7B55 D047 64A4" /* x/‹ž7ú§AÆ6{UÐGd¤ */
- $"E2EC C69D F609 F38F 821E 8D20 8709 87FF" /* âìÆöÆó‚. ‡Æ‡ÿ */
- $"3C3A B1ED C420 1F0B 52E3 8999 C684 30F3" /* <:±íÄ ..R㉙Ƅ0ó */
- $"C4ED 7FA9 3A2C D0E7 AE48 1AC2 7196 9347" /* Äí.©:,Ðç®H.Âq–“G */
- $"6BC9 BEE1 4112 4209 93CA 307A 7FF7 8B12" /* kɾáA.BÆ“Ê0z.÷‹. */
- $"EE76 8890 A529 33CC F435 A84F 9414 A719" /* îvˆ¥)3Ìô5¨O”.§. */
- $"BFB2 6305 201F 372D 567F 30DF 2E47 D0B9" /* ¿²c. .7-V.0ß.Gй */
- $"C68F 5126 7EAA D95A 12D0 DA8A 8CF4 8A2A" /* ÆQ&~ªÙZ.ÐÚŠŒôŠ* */
- $"CBAE 0509 B614 A9E1 2CA2 D0E0 F017 E395" /* Ë®.ƶ.©á,¢Ðàð.ã• */
- $"AF82 85B5 4509 E75C 8E4D 5465 7DF2 CF39" /* ¯‚…µEÆç\ŽMTe}òÏ9 */
- $"ACFB DD5B C683 62C0 0B1C B7B9 EAEC 049C" /* ¬ûÝ[ƃbÀ..·¹êì.œ */
- $"8045 0178 6757 E317 872D ABC2 B077 6EF6" /* €E.xgWã.‡-«Â°wnö */
- $"3612 4132 3DD7 D39B B49A 04A8 207D 6135" /* 6.A2=×Ó›´š.¨ }a5 */
- $"C64F 3A0F 5028 7B6B 953E 8F19 920A 718F" /* ÆO:.P({k•>.’Âq */
- $"08E9 A079 EC51 A08F 4A77 5130 C807 9BC2" /* .é yìQ JwQ0È.›Â */
- $"B37B 4C7B 9BAA 40F3 4E94 BE51 C027 32B5" /* ³{L{›ª@óN”¾QÀ'2µ */
- $"751F 4793 7271 226E 82F3 CF14 8BC3 F927" /* u.G“rq"n‚óÏ.‹Ãù' */
- $"4C81 7F29 AB70 8B3B E948 86D6 569F FEC2" /* L.)«p‹;éH†ÖVŸþÂ */
- $"BF6C 92F9 1011 3BE3 9E91 6458 1634 34A3" /* ¿l’ù..;ãž‘dX.44£ */
- $"3042 520F 5D64 6429 32CE 04FD 1B98 0698" /* 0BR.]dd)2Î.ý.˜.˜ */
- $"3A36 655C 86C7 C272 4B02 E259 0537 4DB8" /* :6e\†ÇÂrK.âY.7M¸ */
- $"C6C2 6980 ECFB 0FC1 C6D9 0A2C D00F 282A" /* ÆÂi€ìû.ÁÆÙÂ,Ð.(* */
- $"7A0B D91F 08CA 762C A629 048E 9BCC CFD2" /* z.Ù..Êv,¦).Ž›ÌÏÒ */
- $"1EBC 8F60 2F64 F24D F1FB 81C6 8AEC CFDB" /* .¼`/dòMñûÆŠìÏÛ */
- $"623A 01A9 35D2 B5E1 B80A 2D32 084E 3857" /* b:.©5Òµá¸Â-2.N8W */
- $"C025 BCDA 4728 F3AD 35AD 9AAA E054 21B7" /* À%¼ÚG(ó­5­šªàT!· */
- $"A47E 62C5 9921 02C0 09E3 440D 063A 3789" /* ¤~bÅ™!.ÀÆãD..:7‰ */
- $"5072 E54A 4654 E148 AC2E 4A99 C6A5 3923" /* PråJFTáH¬.J™Æ¥9# */
- $"49B5 6906 6531 FD5E 7CCE 1C4B EEDE 7482" /* Iµi.e1ý^|Î.KîÞt‚ */
- $"9E3F 73AE C777 0214 C921 3131 C5CB 9F61" /* ž?s®Çw..É!11ÅËŸa */
- $"64A4 4E70 57C2 5C04 E25B 266E 6887 7477" /* d¤NpWÂ\.â[&nh‡tw */
- $"FCCB 1F0C 89F2 6CF6 713E 4D08 8AC8 9B0C" /* üË..‰òlöq>M.ŠÈ›. */
- $"00AC D9D7 A28A C219 B52B B46A D704 F919" /* .¬Ù×¢ŠÂ.µ+´j×.ù. */
- $"2050 6CCA 215A 299B 9129 9739 DA6F 3A67" /* PlÊ!Z)›‘)—9Úo:g */
- $"FE12 2BF1 4F8B 26ED D21F F727 5B59 22F3" /* þ.+ñO‹&íÒ.÷'[Y"ó */
- $"2E05 F4A0 9754 F431 9AED 1B65 038C CD7F" /* ..ô —Tô1ší.e.ŒÍ. */
- $"8254 E3AE 035C 18D7 0E28 6300 0DF0 998D" /* ‚Tã®.\.×.(c..ð™ */
- $"0191 85AF C71B B3CF F0D6 3A8F B1AA 5E99" /* .‘…¯Ç.³ÏðÖ:±ª^™ */
- $"BAB8 7C7F 0214 F864 4744 E747 7248 3C94" /* º¸|...ødGDçGrH<” */
- $"3AC8 CE04 1019 11ED 4BCC 76E9 FE4E 5728" /* :ÈÎ....íKÌvéþNW( */
- $"5BB0 986C D763 A3C7 AF8A 14E9 D24A AD17" /* [°˜l×c£Ç¯Š.éÒJ­. */
- $"FF66 611F B77C 0830 9093 A560 06FA E9CF" /* ÿfa.·|.0“¥`.úéÏ */
- $"054B 5846 1681 5DBF 34F9 49A9 45E0 8F20" /* .KXF.]¿4ùI©Eà */
- $"7FFD 6264 2193 031D A60F A111 B0B7 CFEE" /* .ýbd!“..¦.¡.°·Ïî */
- $"DE49 EC80 C0F1 D7F6 A495 900B 4126 40BE" /* ÞIì€Àñ×ö¤•.A&@¾ */
- $"185B DFFE C7B0 12AC C143 AA85 70E5 81EF" /* .[ßþÇ°.¬ÁCª…påï */
- $"79CE 1662 08E4 203F 1706 40FB CC39 CA8F" /* yÎ.b.ä ?..@ûÌ9Ê */
- $"8002 1CFA 3BCC 6B79 5C83 A4D2 7147 E38F" /* €..ú;Ìky\ƒ¤ÒqGã */
- $"C93B F2E8 6A15 6D30 C314 E898 81E3 FF7B" /* É;òèj.m0Ã.è˜ãÿ{ */
- $"5FC5 EE13 0449 1985 2CBC 73C7 C569 DCB1" /* _Åî..I.…,¼sÇÅiܱ */
- $"8024 F7CA CC7A FE3B CC15 4BCE 5B92 1BBB" /* €$÷ÊÌzþ;Ì.KÎ[’.» */
- $"0048 F291 579F FD20 F11A 1934 CC11 9C3F" /* .Hò‘WŸý ñ..4Ì.œ? */
- $"CE49 027A 9763 9E57 A2FF 7FFD 53E4 E50B" /* ÎI.z—cžW¢ÿ.ýSäå. */
- $"C747 02FF 7869 0537 1482 221E 0220 79D5" /* ÇG.ÿxi.7.‚".. yÕ */
- $"45B1 2E48 6A6C 8486 571F E1F1 BF39 0797" /* E±.Hjl„†W.áñ¿9.— */
- $"5D21 6964 EA9B 13F1 E6B7 C4B5 A2B7 E2BD" /* ]!idê›.ñæ·Äµ¢·â½ */
- $"09C2 B200 0000 0000 003E A392 6527 69B6" /* Ʋ......>£’e'i¶ */
- $"B189 8365 F55D 7A2B 0398 4196 BB60 D4F0" /* ±‰ƒeõ]z+.˜A–»`Ôð */
- $"06B6 100C 5B60 D76F 8FEE EFFB D525 0E2B" /* .¶..[`×oîïûÕ%.+ */
- $"3535 B765 22E7 F77C CF5C 8907 7626 62C0" /* 55·e"ç÷|Ï\‰.v&bÀ */
- $"3B04 A170 EEA6 A399 F26B CD7E 92BC 9E13" /* ;.¡p™òkÍ~’¼ž. */
- $"9D2D 6907 B06F 6B9A 957D 3C57 DC9F 06E6" /* -i.°okš•}<WÜŸ.æ */
- $"C3B6 16AD C91B E868 E000 1848 3BE4 5C3A" /* ö.­É.èhà..H;ä\: */
- $"1162 2272 401F 600B A973 281E 62B3 2654" /* .b"r@.`.©s(.b³&T */
- $"74B0 287C C53E A3DA 2A14 E38F 9FFE 3A8E" /* t°(|Å>£Ú*.ãŸþ:Ž */
- $"0D69 7E9D 5B07 1396 ED52 69BC 3971 5630" /* .i~[..–íRi¼9qV0 */
- $"7C63 8DA9 7A40 F364 CC6A FCAC DC7C 59DC" /* |c©z@ódÌjü¬Ü|YÜ */
- $"278A 92E3 6FBF F936 7157 2583 232E E558" /* 'Š’ão¿ù6qW%ƒ#.åX */
- $"0000 C241 6B90 4DCB 6421 F85A B681 4812" /* ..ÂAkMËd!øZ¶H. */
- $"9165 5C06 0195 F213 DB9F 5E2F 4BDE A075" /* ‘e\..•ò.ÛŸ^/KÞ u */
- $"BD9A 741B 971B 3411 1F73 7FF8 D719 BA55" /* ½št.—.4..s.ø×.ºU */
- $"8048 404F FEEA FC74 AEB1 84FD 03F9 5D43" /* €H@Oþêüt®±„ý.ù]C */
- $"BE42 E61F FF7F F4CA BA56 9654 B757 FF60" /* ¾Bæ.ÿ.ôʺV–T·Wÿ` */
- $"CA39 3290 054C E785 0EA7 F04D AF3E B342" /* Ê92.Lç….§ðM¯>³B */
- $"A80A 815D 3954 73F2 871A 51FF 7488 20CD" /* ¨Â]9Tsò‡.Qÿtˆ Í */
- $"90F3 23B8 80FE C6BF 726C 5426 83F2 5400" /* ó#¸€þÆ¿rlT&ƒòT. */
- $"0000 0000 0000 0000 BFA5 D802 777C F954" /* ........¿¥Ø.w|ùT */
- $"286B A586 76CF 26CE 72CA 6FE7 BD43 DB36" /* (k¥†vÏ&ÎrÊoç½CÛ6 */
- $"A826 870E 2EEF E2C4 2E22 E63C FF7F AF51" /* ¨&‡..ïâÄ."æ<ÿ.¯Q */
- $"40C1 B727 22F3 9ACC 894D 0C49 EC7A D998" /* @Á·'"óšÌ‰M.IìzÙ˜ */
- $"64A9 DD22 2545 B85C D621 0609 B73A 9D9F" /* d©Ý"%E¸\Ö!.Æ·:Ÿ */
- $"FF7F FF7F C0F7 00E1 B069 1D76 3BA1 E98C" /* ÿ.ÿ.À÷.á°i.v;¡éŒ */
- $"5F1B 1E11 B6F6 EB6D 6316 9DBC D1B2 DC90" /* _...¶öëmc.¼Ñ²Ü */
- $"5E1D 5EE0 3C65 57D0 B69C 3782 D1BE 3A77" /* ^.^à<eWжœ7‚Ѿ:w */
- $"436E 462B 45B7 FF61 4FA4 A45B 8C34 39D8" /* CnF+E·ÿaO¤¤[Œ49Ø */
- $"1B35 B876 A5F1 F2AD 3F78 D289 1C2E E3B4" /* .5¸v¥ñò­?xÒ‰..ã´ */
- $"A28B 64FA 1E2C 0CCD 0B1C AD42 8866 DDD6" /* ¢‹dú.,.Í..­BˆfÝÖ */
- $"62F0 225B 8DF7 32B3 FC3C 79E9 000B 1CA9" /* bð"[÷2³ü<yé...© */
- $"2C82 4874 34AB B158 47CD FA9F EBC8 0923" /* ,‚Ht4«±XGÍúŸëÈÆ# */
- $"B291 7229 8C3F E7FD 193C 330B A3B4 6969" /* ²‘r)Œ?çý.<3.£´ii */
- $"FCF6 E1BA 4C4A E64C B1BC 5BAF F402 C828" /* üöáºLJæL±¼[¯ô.È( */
- $"3A51 CC67 A851 E207 5A7C 3733 1031 FD5C" /* :QÌg¨Qâ.Z|73.1ý\ */
- $"E4D3 B69F FF67 2C6D 3FC7 D5B4 E63F 55B9" /* äÓ¶Ÿÿg,m?ÇÕ´æ?U¹ */
- $"FD5F 3DB1 4589 6ADF 54F0 F42A 498F 61C8" /* ý_=±E‰jßTðô*IaÈ */
- $"4872 5CD7 F70D 9C80 8880 EB9A 1FE7 C715" /* Hr\×÷.œ€ˆ€ëš.çÇ. */
- $"E57A 280F 96CF 014C 0411 EF44 C4F2 C64F" /* åz(.–Ï.L..ïDÄòÆO */
- $"F91B A9D6 EB9E F615 096F E5C0 5B30 BB79" /* ù.©Öëžö.ÆoåÀ[0»y */
- $"D645 BF4F B70A 2C40 3D24 A4C4 5A01 F3DB" /* ÖE¿O·Â,@=$¤ÄZ.óÛ */
- $"8879 D458 F558 4C8E 3C87 E83C 9C30 F0C3" /* ˆyÔXõXLŽ<‡è<œ0ðà */
- $"F7EB BE6A 2B3B B9CB 4F2E 3B49 CA98 6025" /* ÷ë¾j+;¹ËO.;Iʘ`% */
- $"D6C7 6B39 ED18 A784 5410 F9CD 4FB5 9E32" /* ÖÇk9í.§„T.ùÍOµž2 */
- $"EABF F72F 6ECC 217F E295 4BDA F0C8 2678" /* ê¿÷/nÌ!.â•KÚðÈ&x */
- $"B0F7 3381 2299 1033 5300 BB1C E72F 1EE0" /* °÷3"™.3S.».ç/.à */
- $"75D6 68D0 8C87 A574 580B 4AD8 7BC8 E1C4" /* uÖhÐŒ‡¥tX.JØ{ÈáÄ */
- $"64D3 76AA A080 1E28 FD04 890B B9A1 7E5C" /* dÓvª €.(ý.‰.¹¡~\ */
- $"79E2 31B9 1C3E DBAE 8BC6 DB23 53A4 0F06" /* yâ1¹.>Û®‹ÆÛ#S¤.. */
- $"74AA 7920 6233 E3BF B281 AFAA 957D FDFB" /* tªy b3㿲¯ª•}ýû */
- $"216A 3ECE 3139 37DF 8885 620B 5D55 D0FD" /* !j>Î197߈…b.]UÐý */
- $"F796 6A70 CEFD 33D8 B369 178E 99C0 9FFF" /* ÷–jpÎý3سi.Ž™ÀŸÿ */
- $"7FD2 27D4 D615 4840 B836 A0B5 1D6F 2A5A" /* .Ò'ÔÖ.H@¸6 µ.o*Z */
- $"1338 2369 83A0 D409 0FA7 77EF 19B9 21E6" /* .8#iƒ ÔÆ.§wï.¹!æ */
- $"3E21 0CB0 D4D3 362A EA6F 6340 8D73 27FB" /* >!.°ÔÓ6*êoc@s'û */
- $"C3EF 7823 33DF 7A8C 5C69 20C4 5816 72E4" /* Ãïx#3ßzŒ\i ÄX.rä */
- $"712C 3345 6755 76F3 FEAF 494B D0B4 3C8F" /* q,3EgUvóþ¯IKд< */
- $"B83F A050 C3E9 4CA2 6A6E 7AD0 D7FF 5860" /* ¸? PÃéL¢jnzÐ×ÿX` */
- $"548E 54E7 C3B9 6DDF 462C 54BE 5EF9 1A41" /* TŽTçùmßF,T¾^ù.A */
- $"6A46 A4FB 1C36 1CA4 77EC 2899 F147 3422" /* jF¤û.6.¤wì(™ñG4" */
- $"843C 7FAE 123E 6894 9B7F 3125 EB0F 3129" /* „<.®.>h”›.1%ë.1) */
- $"9DC1 8469 CE90 BB6E 4F2C 385A 0FD1 9AC7" /* Á„iλnO,8Z.ÑšÇ */
- $"3318 3BF0 B1AA A51A 9022 A143 29FF 7FC1" /* 3.;𱪥."¡C)ÿ.Á */
- $"0F0F 6570 67C4 7FA7 9906 DE4E 5439 A278" /* ..epgÄ.§™.ÞNT9¢x */
- $"34E1 3D57 BB0E 086E 4C71 4406 DA9D CA56" /* 4á=W»..nLqD.ÚÊV */
- $"3EFD D077 5DA5 CD7D C244 9128 F408 1F03" /* >ýÐw]¥Í}ÂD‘(ô... */
- $"0C8F FF4B 9274 2EC6 E208 13C5 EE1B 3CEA" /* .ÿK’t.Æâ..Åî.<ê */
- $"C5C0 06F5 0FA1 11FF 7FE3 A446 32E6 F4DA" /* ÅÀ.õ.¡.ÿ.ã¤F2æôÚ */
- $"23EC 5108 3AE0 CD16 AFFF 3965 8196 56E2" /* #ìQ.:àÍ.¯ÿ9e–Vâ */
- $"2881 4EB9 CA14 5C4A 8091 B176 8823 BF09" /* (N¹Ê.\J€‘±vˆ#¿Æ */
- $"CED5 0D88 E6BB DD95 1B72 36E8 809C D432" /* ÎÕ.ˆæ»Ý•.r6耜Ô2 */
- $"872D C08C 7DCB B30E 548B AE16 0D85 6B49" /* ‡-ÀŒ}˳.T‹®..…kI */
- $"9B28 D491 ECD6 F598 691A 0891 135A 63A0" /* ›(Ô‘ìÖõ˜i..‘.Zc  */
- $"593C 1FFD 8A54 4FB9 F2AB 20FC 5CF3 1B88" /* Y<.ýŠTO¹ò« ü\ó.ˆ */
- $"EE7E 8355 45D6 87C8 28CE 7B33 92A2 D8D6" /* î~ƒUEÖ‡È(Î{3’¢ØÖ */
- $"E8DF EF94 500A 0D78 DE9F 8657 F7BD 7F40" /* èßï”PÂ.xÞŸ†W÷½.@ */
- $"5E07 0789 EDC7 F3A5 A0BF 3929 6B19 A460" /* ^..‰íÇó¥ ¿9)k.¤` */
- $"7A50 91FF 42EA 5F12 DFA5 E0A0 84CC E869" /* zP‘ÿBê_.ߥࠄÌèi */
- $"BB1F 6EDA 2238 5DB0 7F22 3521 F04B FF6B" /* ».nÚ"8]°."5!ðKÿk */
- $"6827 722A DD5F 3C9D D3F4 2BE3 614D 0A3F" /* h'r*Ý_<Óô+ãaMÂ? */
- $"62C4 E6AC 95CA 5946 37E8 BC76 97FD 5167" /* bÄ欕ÊYF7è¼v—ýQg */
- $"C970 D4C7 0655 C470 5913 DBBD AA8C 87A4" /* ÉpÔÇ.UÄpY.Û½ªŒ‡¤ */
- $"3C63 0B7F 54CD 391E 574D F2D5 C728 20B7" /* <c..TÍ9.WMòÕÇ( · */
- $"9955 DAC8 72A5 DBBB F7ED 4C9F 6FFE 3A4E" /* ™UÚÈr¥Û»÷íLŸoþ:N */
- $"E165 1831 C0E5 8285 96C2 3959 1BE7 E884" /* áe.1Àå‚…–Â9Y.çè„ */
- $"E568 89C1 FD03 D443 F6D1 A7C9 4CFE F7B9" /* åh‰Áý.ÔCöѧÉLþ÷¹ */
- $"A0BA 5040 19D5 965F 0EB5 E503 4B32 E6C8" /*  ºP@.Õ–_.µå.K2æÈ */
- $"B9C1 DEBB B8B7 47DC A850 AF44 D3B7 F562" /* ¹ÁÞ»¸·GܨP¯DÓ·õb */
- $"4210 4DFF 42A0 3D9A 7C63 8124 22A9 B258" /* B.MÿB =š|c$"©²X */
- $"2256 6243 3077 FF57 7389 3FB6 A096 0EAB" /* "VbC0wÿWs‰?¶ –.« */
- $"DD33 EF25 C4B0 7338 F6D7 8730 FF2E DD0A" /* Ý3ï%Ä°s8öׇ0ÿ.Ý */
- $"BBDA 7A6E EFE8 58EE D64B A09E 2B00 EC04" /* »ÚznïèXîÖK ž+.ì. */
- $"09C9 A9F4 82A0 3132 4829 65CA E93B B827" /* ÆÉ©ô‚ 12H)eÊé;¸' */
- $"E81F B387 132B 5D15 E526 6FEC 2CB1 407F" /* è.³‡.+].å&oì,±@. */
- $"8485 FF32 4933 D357 FC45 0E44 EE66 D960" /* „…ÿ2I3ÓWüE.DîfÙ` */
- $"5AA3 A13A FC0B D8E2 622E 0BEE 714F 2672" /* Z£¡:ü.Øâb..îqO&r */
- $"3850 26C4 E626 F9BA 418C BC8A 7481 C6BE" /* 8P&Äæ&ùºAŒ¼Štƾ */
- $"BFA6 0D72 0603 3452 46C0 9FDB BE63 34D9" /* ¿¦.r..4RFÀŸÛ¾c4Ù */
- $"9599 7519 804B F1CE 0FC8 7572 F58E EB32" /* •™u.€KñÎ.ÈurõŽë2 */
- $"3501 CBB0 C05B 5643 485A 0012 64C2 8022" /* 5.Ë°À[VCHZ..d€" */
- $"BD39 EB39 2B57 0AA3 3931 93D4 885E CDF2" /* ½9ë9+W£91“Ôˆ^Íò */
- $"818D 7734 36C2 BEE1 4F55 116C 47A9 DC40" /* w46¾áOU.lG©Ü@ */
- $"A8A8 4532 7C33 9D7E 070A BA9E 36F7 2445" /* ¨¨E2|3~.ºž6÷$E */
- $"074C 181A 07B2 C470 FA15 8CCB C069 AD0F" /* .L...²Äpú.ŒËÀi­. */
- $"9DD2 8B21 6F22 7300 34B4 4378 25AB D9D2" /* Ò‹!o"s.4´Cx%«ÙÒ */
- $"1D9B B7F7 2F9C C3B1 926F DE61 4463 90BD" /* .›·÷/œÃ±’oÞaDc½ */
- $"BC76 27E7 A5B5 826F 908E 31BA 048F 97C1" /* ¼v'祵‚oŽ1º.—Á */
- $"1884 67A9 C4BA 4B2B 4A58 D0EE 0269 6832" /* .„g©ÄºK+JXÐî.ih2 */
- $"E8C6 03AA D2A2 D034 27AA D49E 9C01 069A" /* èÆ.ªÒ¢Ð4'ªÔžœ..š */
- $"1BDC C40B 3BA7 5F8D 0468 152D E505 7EC0" /* .ÜÄ.;§_.h.-å.~À */
- $"6BBF C4F4 2F45 99CB 1872 C713 FA0D 055F" /* k¿Äô/E™Ë.rÇ.ú.._ */
- $"551D 6E4D 5794 CC71 BAB5 C560 4D20 9464" /* U.nMW”ÌqºµÅ`M ”d */
- $"9F8C 94BA 1C96 0987 1AB4 61BB BA86 751B" /* ŸŒ”º.–Ƈ.´a»º†u. */
- $"9B79 D06A 7A3D A663 FB31 8B86 E588 5D15" /* ›yÐjz=¦cû1‹†åˆ]. */
- $"4A09 8B2B 81FC AE85 0D5A 1D8C A5B7 6DD9" /* JÆ‹+ü®….Z.Œ¥·mÙ */
- $"02F5 50CE 7017 1BDD 3D3D 86CB 250B 491B" /* .õPÎp..Ý==†Ë%.I. */
- $"AA1F 2D21 A416 E8E7 9A53 4299 8CDE CD59" /* ª.-!¤.èçšSB™ŒÞÍY */
- $"C678 B559 D85C C580 6795 AD5F F578 C9EE" /* ÆxµYØ\Å€g•­_õxÉî */
- $"73B2 8F4B 6EEA 6F07 F785 C1B3 374B E51F" /* s²Knêo.÷…Á³7Kå. */
- $"46DC 728C 05A4 6932 792A DB50 4E9A FD82" /* FÜrŒ.¤i2y*ÛPNšý‚ */
- $"A8A2 5EB8 024D C558 D6BC 350C 97B0 B2E8" /* ¨¢^¸.MÅXÖ¼5.—°²è */
- $"8F42 92FD 604D 6FB7 74B6 6EBE 97F6 CE03" /* B’ý`Mo·t¶n¾—öÎ. */
- $"0DFA C340 31C3 4C5E 0041 088B E097 383B" /* .úÃ@1ÃL^.A.‹à—8; */
- $"A236 97CC 8D2B 6F6D 0E58 4E56 1D49 32EC" /* ¢6—Ì+om.XNV.I2ì */
- $"626C C303 42BB D30B B8DE 5868 3C2F E39B" /* blÃ.B»Ó.¸ÞXh</ã› */
- $"A07A 236D 0F21 C0DD 1A0A 933A 7710 6605" /*  z#m.!ÀÝ.“:w.f. */
- $"343E 8D1A 9384 4F16 C01E 5AF7 DF53 0B38" /* 4>.“„O.À.Z÷ßS.8 */
- $"3615 80D7 428E 90F6 4620 02EA 4590 DF22" /* 6.€×BŽöF .êEß" */
- $"4B70 2FB2 CADA A529 F7FA E7C6 BC99 DFCD" /* Kp/²ÊÚ¥)÷úçƼ™ßÍ */
- $"5EE7 D677 B5BE F819 6A55 6070 E1A9 DF53" /* ^çÖwµ¾ø.jU`pá©ßS */
- $"3F82 0229 B6B7 D247 1967 8313 056F 9D27" /* ?‚.)¶·ÒG.gƒ..o' */
- $"753E E4DD EB7F 1372 C0F7 D72E 349B 2F9B" /* u>äÝë..rÀ÷×.4›/› */
- $"686C C9AF 0896 0865 7A3A 5A9D 807F 292A" /* hlɯ.–.ez:Z€.)* */
- $"8DDA A776 4B3C 0993 532D D682 A41B 9DC2" /* Ú§vK<Æ“S-Ö‚¤. */
- $"5113 9D60 934B 2055 D671 C6C4 1252 3CEF" /* Q.`“K UÖqÆÄ.R<ï */
- $"C72F AC19 4BED 185D BC60 5957 F81B 8278" /* Ç/¬.Kí.]¼`YWø.‚x */
- $"20B5 9173 4A1B FDC9 295D 54B7 8AFE 6938" /* µ‘sJ.ýÉ)]T·Šþi8 */
- $"FE49 BA78 3225 49A1 4243 823C 52B9 8489" /* þIºx2%I¡BC‚<R¹„‰ */
- $"9BDF 0AA1 9A6B 667D DCE2 FE18 C386 4EE9" /* ›ß¡škf}Üâþ.ÆNé */
- $"8AF7 92D0 4405 227C BD4C B9E4 34A7 2533" /* Š÷’ÐD."|½L¹ä4§%3 */
- $"D3C6 E915 D57B 681B B6DC FF03 D5D4 F1DD" /* ÓÆé.Õ{h.¶Üÿ.ÕÔñÝ */
- $"4FB5 BA54 262A 73C2 1CF4 4CD1 D842 E8C2" /* OµºT&*sÂ.ôLÑØBè */
- $"8169 3555 13EC 6A25 6DE0 3614 EC2E D1BB" /* i5U.ìj%mà6.ì.Ñ» */
- $"E597 BFC6 2ACB 6879 11D1 870D E79E 8422" /* å—¿Æ*Ëhy.ч.çž„" */
- $"C01D 4032 8887 6DBA FBEC 3077 F220 49E3" /* À.@2ˆ‡mºûì0wò Iã */
- $"8693 0B00 9F45 0F57 0A39 DA8E EAA5 CD48" /* †“..ŸE.WÂ9ÚŽê¥ÍH */
- $"2C93 C3EC BDE0 71D5 5749 0952 441C E3F8" /* ,“Ãì½àqÕWIÆRD.ãø */
- $"597F C1E6 FB6B BBED AD71 FC34 CFF8 5877" /* Y.Áæûk»í­qü4ÏøXw */
- $"DB67 5F6D 798F E163 5F6B 1CFA A87B ED7C" /* Ûg_myác_k.ú¨{í| */
- $"F176 3065 72FF 443D BA6B 8FBD 9E85 806A" /* ñv0erÿD=ºk½ž…€j */
- $"2A1B 368C 7A9E B1B1 93DE ABD8 263F 31B3" /* *.6Œzž±±“Þ«Ø&?1³ */
- $"1739 58F1 7233 FE7C 4EC4 32AA CDDB CF11" /* .9Xñr3þ|NÄ2ªÍÛÏ. */
- $"C519 9C61 B756 AF62 D55D 5D48 6AF7 4364" /* Å.œa·V¯bÕ]]Hj÷Cd */
- $"205E F14D AAD6 EFF5 2F0D CBE4 0F19 3159" /* ^ñMªÖïõ/.Ëä..1Y */
- $"94F4 910E 4217 990B CABE EBF5 2B67 2EF6" /* ”ô‘.B.™.ʾëõ+g.ö */
- $"FE41 0C44 1C50 43EA 69F5 4E73 5569 82A1" /* þA.D.PCêiõNsUi‚¡ */
- $"C13C 4899 3AA9 5E13 5F76 BF98 2105 1842" /* Á<H™:©^._v¿˜!..B */
- $"AF34 9AFD CFC8 D1E7 3479 E1F3 C86F D06F" /* ¯4šýÏÈÑç4yáóÈoÐo */
- $"9ED9 9DD8 E2E0 4B44 19F4 03E6 9CC0 3474" /* žÙØâàKD.ô.æœÀ4t */
- $"DFBD 078F D140 1C06 5F8C B6E2 665C 703A" /* ß½.Ñ@.._Œ¶âf\p: */
- $"2841 642E F538 C531 697D 5064 11AD 9E8C" /* (Ad.õ8Å1i}Pd.­žŒ */
- $"5A53 3174 7302 762E 9708 BEF5 AD41 0C01" /* ZS1ts.v.—.¾õ­A.. */
- $"D744 85FC D963 416A 9A3A 6898 F067 5B1C" /* ×D…üÙcAjš:h˜ðg[. */
- $"873B 42B6 72C4 FF18 337A 8A24 EDCE 6B8B" /* ‡;B¶rÄÿ.3zŠ$íÎk‹ */
- $"BF06 0EA4 0227 A131 8620 B03C A2B9 729E" /* ¿..¤.'¡1† °<¢¹rž */
- $"1242 EC64 E340 5C5C 9BFF 120A BB1B 75E5" /* .Bìdã@\\›ÿ.».uå */
- $"385B 68AF C7B7 8BA5 1E7B 6FC1 DDB2 F642" /* 8[h¯Ç·‹¥.{oÁݲöB */
- $"FF56 4D21 66B3 EA8C 7095 8FBD 92CC 7315" /* ÿVM!f³êŒp•½’Ìs. */
- $"665F B398 608C ADD4 11E0 DA38 734A C3DB" /* f_³˜`Œ­Ô.àÚ8sJÃÛ */
- $"9249 4640 27D6 D057 426E 651D BF14 F0DE" /* ’IF@'ÖÐWBne.¿.ðÞ */
- $"9130 2D17 8D66 9689 79BD 9A6D 5AF9 6C7C" /* ‘0-.f–‰y½šmZùl| */
- $"94BF 8531 6507 5621 1C11 8D8F F3A5 83D9" /* ”¿…1e.V!..ó¥ƒÙ */
- $"7EE3 1E6D 9B0A 8D44 F466 DE49 E606 E143" /* ~ã.m›ÂDôfÞIæ.áC */
- $"7E77 D417 D49D 9CF2 89AA B0FA 84A4 33A5" /* ~wÔ.Ôœò‰ª°ú„¤3¥ */
- $"8279 A26A 82C5 27CF FB64 D227 994E C6A7" /* ‚y¢j‚Å'ÏûdÒ'™NƧ */
- $"531C 7B7D D333 20D4 F79E 7C21 CC1E 7ADA" /* S.{}Ó3 Ô÷ž|!Ì.zÚ */
- $"F978 DEBB 1FF2 7420 A72D DE6B AB74 8DC6" /* ùxÞ».òt §-Þk«tÆ */
- $"DD0F 0386 BF57 5F23 4926 C874 D598 47A3" /* Ý..†¿W_#I&ÈtÕ˜G£ */
- $"FBC8 E9B0 38BB C695 B7F4 82A1 CC5F 1E22" /* ûÈé°8»Æ•·ô‚¡Ì_." */
- $"767C 20D5 E64D 44F1 B2D4 2298 C6A1 1842" /* v| ÕæMDñ²Ô"˜Æ¡.B */
- $"8139 0CC8 B9C5 284F 9FC8 945B 5342 94A8" /* 9.ȹÅ(OŸÈ”[SB”¨ */
- $"1A57 3351 E00E DB28 D5E3 9712 4346 6DBA" /* .W3Qà.Û(Õã—.CFmº */
- $"CC9B A1ED CD9B 778D 4523 1E9A AC69 8ED9" /* Ì›¡íÍ›wE#.š¬iŽÙ */
- $"67C4 C16D A548 A029 0075 0185 8D06 B7F0" /* gÄÁm¥H ).u.….·ð */
- $"8258 D26A EB95 D437 F0D2 8E91 D536 F534" /* ‚XÒjë•Ô7ðÒŽ‘Õ6õ4 */
- $"30A1 6DE7 E4B8 48DF 246E 6A43 4FE6 AED0" /* 0¡mçä¸Hß$njCOæ®Ð */
- $"48A0 5E1E C339 6C40 BE36 CEB8 870B F9EB" /* H ^.Ã9l@¾6θ‡.ùë */
- $"5ED8 3CA2 B3FA 8CD9 2D26 FF79 6468 862D" /* ^Ø<¢³úŒÙ-&ÿydh†- */
- $"6B87 3072 15D5 5640 D5D4 B4BA EAD3 84F1" /* k‡0r.ÕV@ÕÔ´ºêÓ„ñ */
- $"6A43 F378 100E 8088 A3FE 989B E75B F67F" /* jCóx..€ˆ£þ˜›ç[ö. */
- $"5B25 3AE2 C08C 8CB0 08DD A37F 94DD 7F03" /* [%:âÀŒŒ°.Ý£.”Ý.. */
- $"35C9 DF27 9A9A B829 6326 A95D 91F7 0BA3" /* 5Éß'šš¸)c&©]‘÷.£ */
- $"7220 E220 F062 D8DE ADE2 2AD6 DDFD C9E4" /* r â ðbØÞ­â*ÖÝýÉä */
- $"FAAE 543D 3CCB 5230 74F7 3120 02FD 6B45" /* ú®T=<ËR0t÷1 .ýkE */
- $"A2AB 805B 13FB 1879 6060 5600 1847 98E5" /* ¢«€[.û.y``V..G˜å */
- $"BF65 2CD4 ACD7 15D0 B77E 5A0F 8095 95CA" /* ¿e,Ô¬×.з~Z.€••Ê */
- $"1847 D25F 7D32 1AE2 89EA 9D49 074D A3E5" /* .GÒ_}2.â‰êI.M£å */
- $"201E 8AC7 CB9C 43BC 0732 70E0 3C4F E625" /* .ŠÇËœC¼.2pà<Oæ% */
- $"88E3 74DB 6FB7 7BE2 7006 F9E7 1F76 DBF3" /* ˆãtÛo·{âp.ùç.vÛó */
- $"C988 D665 F7AA 21E2 A5C1 E969 2917 3BA3" /* ɈÖe÷ª!â¥Áéi).;£ */
- $"17BF 925F F835 9827 813E DA4F EE9B 2DF3" /* .¿’_ø5˜'>ÚOî›-ó */
- $"B640 95E8 70A5 B577 8C1D 99D5 797D D482" /* ¶@•èp¥µwŒ.™Õy}Ô‚ */
- $"E23A 56DD 644D 9623 FEE2 63D2 A3DB E146" /* â:VÝdM–#þâcÒ£ÛáF */
- $"FC39 35A7 6C28 63D8 5240 0C80 0000 0000" /* ü95§l(cØR@.€.... */
- $"0001 4095 99D3 7A7A 0A05 B673 69BC DA9C" /* ..@•™ÓzzÂ.¶si¼Úœ */
- $"A108 DDEA EE48 6385 0790 FEA1 1AFC 2CED" /* ¡.ÝêîHc….þ¡.ü,í */
- $"2225 BE73 2ED7 00BB 2301 80FE 09DF E78E" /* "%¾s.×.»#.€þÆßçŽ */
- $"6FE6 4743 A0EE 0A03 4C9E F046 CDD8 E7F1" /* oæGC îÂ.LžðFÍØçñ */
- $"DB3F 1B67 F6E1 1F31 8096 90DF 5110 40B0" /* Û?.göá.1€–ßQ.@° */
- $"0000 0000 0000 0000 C0B9 E0FC 41FB A11C" /* ........À¹àüAû¡. */
- $"4696 89A0 DE42 F8C7 27D0 3F03 AA51 70FD" /* F–‰ ÞBøÇ'Ð?.ªQpý */
- $"DC5F D7B9 AFD3 A0F3 7BAA A910 9E5C 259E" /* Ü_×¹¯Ó ó{ª©.ž\%ž */
- $"E4FB 8F8E 01C1 96E2 0768 FE5A 0A43 E2F8" /* äûŽ.Á–â.hþZÂCâø */
- $"DA74 9500 C241 D1F6 3EFF 3F06 586F A511" /* Út•.ÂAÑö>ÿ?.Xo¥. */
- $"CCFE 8FE7 61E1 C392 D001 3F52 1CA8 CC23" /* ÌþçaáÃ’Ð.?R.¨Ì# */
- $"93F0 27DF 893F 4AC1 06C3 34DA 8953 BBC0" /* “ð'߉?JÁ.Ã4Ú‰S»À */
- $"84C0 4843 27E0 067E 5EBF FF7A 1540 4C0E" /* „ÀHC'à.~^¿ÿz.@L. */
- $"FA6C 44A1 A7BC DB24 6AD7 C367 EC93 33BF" /* úlD¡§¼Û$j×Ãgì“3¿ */
- $"FECB C1DF 83CC 5BF7 A7C0 DF62 2EFA 4283" /* þËÁ߃Ì[÷§Àßb.úBƒ */
- $"6E49 2492 4924 9249 2492 4924 9246 A4A5" /* nI$’I$’I$’I$’F¤¥ */
- $"7754 9685 B091 D8FF 1549 CF90 2079 3AFB" /* wT–…°‘Øÿ.IÏ y:û */
- $"E925 85CC 62A2 E49B 476B 47B9 319B 630F" /* é%…Ìb¢ä›GkG¹1›c. */
- $"A6B8 182C E282 D1CD 920A 4EB3 21BF 943C" /* ¦¸.,â‚ÑÍ’ÂN³!¿”< */
- $"27BF CCDE BD6E 481A 188C F70B C257 8118" /* '¿ÌÞ½nH..Œ÷.ÂW. */
- $"FBF7 FF78 F422 A3DB AE81 4980 0000 0000" /* û÷ÿxô"£Û®I€.... */
- $"0000 0000 0000 1EE1 BFBB C300 0000 0000" /* .......á¿»Ã..... */
- $"0000 0000 0000 14FB 3FE1 1B7A D142 E13F" /* .......û?á.zÑBá? */
- $"5B6F 704A 61CF 957D 258E F744 FB26 8356" /* [opJaÏ•}%Ž÷Dû&ƒV */
- $"74AD 1DDB 02F2 CF85 7AEB 3A06 6F12 084E" /* t­.Û.òÏ…zë:.o..N */
- $"8E93 D6DA E4FE 9FBE 2D16 1C87 701F 55C3" /* Ž“ÖÚäþŸ¾-..‡p.Uà */
- $"9966 3E8F 36CB 6D9F F3F6 F8D3 B3B9 E2C1" /* ™f>6ËmŸóöøÓ³¹âÁ */
- $"1019 C6E6 8FFF 7FDC 6948 D3AB C944 C64A" /* ..Ææÿ.ÜiHÓ«ÉDÆJ */
- $"8000 0000 0000 0000 000A B0CB 3806 445C" /* €........°Ë8.D\ */
- $"7110 4CDE 3651 AC94 777C 8AB0 5382 04AF" /* q.LÞ6Q¬”w|Š°S‚.¯ */
- $"32E5 68C2 122F 8A5B 12A8 FF39 CF5E 72FB" /* 2åhÂ./Š[.¨ÿ9Ï^rû */
- $"EFD4 1669 47C6 525E 88EF 0AAC 1EE1 98B6" /* ïÔ.iGÆR^ˆï¬.ᘶ */
- $"0BFF 7FAF 8A4B 7158 F7D7 1707 DE93 841E" /* .ÿ.¯ŠKqX÷×..Þ“„. */
- $"3C82 3260 1FFF 1C8B 6A6E 8C66 0000 0000" /* <‚2`.ÿ.‹jnŒf.... */
- $"0000 0000 0000 0121 EF03 234C 3124 0000" /* .......!ï.#L1$.. */
- $"0000 0000 0000 0000 077C 5957 204B A2ED" /* .........|YW K¢í */
- $"59B8 F3C4 CC60 8A58 7E23 0B9F A0FD 1DC8" /* Y¸óÄÌ`ŠX~#.Ÿ ý.È */
- $"8E0F FE2B 5F9F 12D8 09B3 57BB 7818 3CF5" /* Ž.þ+_Ÿ.ØƳW»x.<õ */
- $"D579 D427 5198 BD86 E2FC 8775 915B 37A5" /* ÕyÔ'Q˜½†âü‡u‘[7¥ */
- $"B2E6 6BD8 8404 31D9 4C54 3621 6561 5C3E" /* ²ækØ„.1ÙLT6!ea\> */
- $"4A80 0000 0000 0000 0000 0014 D22D 6758" /* J€..........Ò-gX */
- $"336C 63A1 C13F 3E94 9877 8E90 4E5D 0C70" /* 3lc¡Á?>”˜wŽN].p */
- $"F80A 4262 C2CC C7E4 DAE8 526F 393F 4558" /* øÂBbÂÌÇäÚèRo9?EX */
- $"5CC9 5DDA B2FF 7ED5 F809 3A02 F1EE 2760" /* \É]Ú²ÿ~ÕøÆ:.ñî'` */
- $"FF7E 5037 F054 4A1B 9602 92EA 8D26 A198" /* ÿ~P7ðTJ.–.’ê&¡˜ */
- $"9C4F 8238 A60E 7734 20F8 18FE 478F 5403" /* œO‚8¦.w4 ø.þGT. */
- $"1658 618B A80F 879F 4A98 E809 DEB2 7CE9" /* .Xa‹¨.‡ŸJ˜èÆÞ²|é */
- $"9724 407B B8C8 A48D 4F33 9126 751B 9FC2" /* —$@{¸È¤O3‘&u.ŸÂ */
- $"0283 44C3 5AFD 9546 FCE2 4212 4F5B 01D4" /* .ƒDÃZý•FüâB.O[.Ô */
- $"6E53 A032 DA91 40F4 4BDE 0C23 FF1E D5DE" /* nS 2Ú‘@ôKÞ.#ÿ.ÕÞ */
- $"B543 59DC C0DC 759A 6043 5883 A5FE C785" /* µCYÜÀÜuš`CXƒ¥þÇ… */
- $"BA68 9F46 C21A 4C50 20E3 0488 FB34 1043" /* ºhŸFÂ.LP ã.ˆû4.C */
- $"FC68 562B 635A EE8D E334 0C6F 25A9 E4C9" /* ühV+cZîã4.o%©äÉ */
- $"3484 2AC2 6188 7242 E3F6 AEAC 6F86 2DE2" /* 4„*ÂaˆrBãö®¬o†-â */
- $"C377 BD02 CB1C 9553 5485 6A5B E118 9BBD" /* Ãw½.Ë.•ST…j[á.›½ */
- $"DC6B 2C92 C6CC C866 6E7F FE63 AB01 FE7D" /* Ük,’ÆÌÈfn.þc«.þ} */
- $"FF7F BB81 EA94 87BE B101 F468 0E30 F111" /* ÿ.»ê”‡¾±.ôh.0ñ. */
- $"7BC9 FA0D F87F BDD0 811B 8588 1AE7 8387" /* {Éú.ø.½Ð.…ˆ.烇 */
- $"5C06 B3A9 E2ED 6E5B B524 35AA CBFF 50D6" /* \.³©âín[µ$5ªËÿPÖ */
- $"49D9 6918 3837 59BD E7CC 8796 B0AF 2729" /* IÙi.87Y½ç̇–°¯') */
- $"0512 5A97 66FF 1A85 E004 1882 0108 EA41" /* ..Z—fÿ.…à..‚..êA */
- $"BBCC 15E0 254C 59AF 877D 0722 15FB ADA1" /* »Ì.à%LY¯‡}.".û­¡ */
- $"84C2 9B83 DD5B C6B1 EE29 084C 08F7 06C8" /* „›ƒÝ[Ʊî).L.÷.È */
- $"4F07 9818 6BF2 66E2 582B 2F7D 29AD BAFA" /* O.˜.kòfâX+/})­ºú */
- $"8F9E 0AC8 60AE D10E 3E49 17BF E015 0C5E" /* žÂÈ`®Ñ.>I.¿à..^ */
- $"5C51 5D5B 5BC1 6C83 C428 4505 E9BB 61CB" /* \Q][[ÁlƒÄ(E.é»aË */
- $"D7C2 F3C6 C102 73F5 409E D0CF B43E E497" /* ×ÂóÆÁ.sõ@žÐÏ´>ä— */
- $"C1E0 707B 3F6F EAA8 2F10 9285 7D9D 9F81" /* Áàp{?oê¨/.’…}Ÿ */
- $"303D 3A70 2B3F 4A45 558D 63F6 EEB9 CF21" /* 0=:p+?JEUcöî¹Ï! */
- $"52C1 27C2 8439 0BE2 BE1F A553 A1C7 E44C" /* RÁ'„9.â¾.¥S¡ÇäL */
- $"5422 9BC0 356D 1B40 E53B 3064 AA69 F464" /* T"›À5m.@å;0dªiôd */
- $"7AA7 4E56 F7E2 7AE5 CB6E E538 8582 1927" /* z§NV÷âzåËnå8…‚.' */
- $"019D B4B0 E6D9 0F0E 9670 7723 62CF C422" /* .´°æÙ..–pw#bÏÄ" */
- $"DD53 ED12 92AE 20B0 6B63 6CB3 C596 4F4E" /* ÝSí.’® °kcl³Å–ON */
- $"18B6 FD06 93B2 6F73 A740 770D C39F B873" /* .¶ý.“²os§@w.߸s */
- $"598F 3667 6F7A 29E9 9E6F 9D04 48DD A175" /* Y6goz)éžo.HÝ¡u */
- $"2AFC 61BD D706 2A8E 9789 F513 B8AF B8EA" /* *üa½×.*Ž—‰õ.¸¯¸ê */
- $"2426 7EDF 1EFA 1D19 7A50 D22F D15E 76FE" /* $&~ß.ú..zPÒ/Ñ^vþ */
- $"CD34 19AD 8126 775C A5FB B209 9658 F850" /* Í4.­&w\¥û²Æ–XøP */
- $"F2FD A65F B487 9F50 7FF0 12FD BA8B FB6E" /* òý¦_´‡ŸP.ð.ýº‹ûn */
- $"49F5 50DF C349 B4F9 F4D7 EDEB 53BE DEB0" /* IõPßÃI´ùô×íëS¾Þ° */
- $"7F85 29FB 5DFF 36B9 BEDA 9BF8 3CF2 FDAE" /* .…)û]ÿ6¹¾Ú›ø<òý® */
- $"DFB5 ABBE D3DB ED2B FDBA CFFB 7606 FB74" /* ßµ«¾ÓÛí+ýºÏûv.ût */
- $"D3F8 6B96 83BA F7ED EB3F 7EDE AFE0 EECD" /* Óøk–ƒº÷íë?~Þ¯àîÍ */
- $"FB5E 7F6E 807E DB9B F6BD F0FE D32B EA21" /* û^.n€~Û›ö½ðþÓ+ê! */
- $"EFA8 1EFA 823F 6DCF FB6C 8BEA 6CFD B5AF" /* ï¨.ú‚?mÏûl‹êlýµ¯ */
- $"0774 CFDB D337 FB7A 3F83 BA5D F51F DF55" /* .tÏÛÓ7ûz?ƒº]õ.ßU */
- $"47FB 690F DA86 F791 DDD6 2CCB E6B8 C536" /* Gûi.Ú†÷‘ÝÖ,Ëæ¸Å6 */
- $"D512 AD5E 1B08 0B8A 8D03 2F75 60E5 6BF8" /* Õ.­^...Š./u`åkø */
- $"447B C66A 7EC2 7912 B45F 8E48 277C D8E1" /* D{Æj~Ây.´_ŽH'|Øá */
- $"809C 5755 D718 BAAC F891 2AE5 F97C 3F5E" /* €œWU×.º¬ø‘*åù|?^ */
- $"0116 3A00 99F4 5896 E0EA B189 F5A5 7929" /* ..:.™ôX–à걉õ¥y) */
- $"C491 B57F 2232 B0C2 52F8 89B1 DB2F B284" /* Ä‘µ."2°ÂRø‰±Û/²„ */
- $"C1EE 0C43 EF76 FD94 F871 4077 7E19 EC36" /* Áî.Cïvý”øq@w~.ì6 */
- $"BBFA 6DFF 3C0B 5A98 89B4 84BB 56DB 5FC2" /* »úmÿ<.Z˜‰´„»VÛ_ */
- $"16C2 351A B46E AF45 AAC7 DD2E 97ED 970C" /* .Â5.´n¯EªÇÝ.—í—. */
- $"76D8 F8D0 42EB E639 28E8 BE33 A530 3B58" /* vØøÐBëæ9(è¾3¥0;X */
- $"2374 6B1C 97B0 1CD5 ACD5 615F FD30 62C6" /* #tk.—°.Õ¬Õa_ý0bÆ */
- $"899A 977D 4B74 CAB1 E9EE 6588 4E67 8733" /* ‰š—}KtʱéîeˆNg‡3 */
- $"B359 BCC7 DC7B 9884 E4A8 78CB 77E7 675D" /* ³Y¼ÇÜ{˜„ä¨xËwçg] */
- $"FF2D FCE4 7744 BDD1 A833 6BEC C481 2DA8" /* ÿ-üäwD½Ñ¨3kìÄ-¨ */
- $"3D1C 5D57 7595 1DEB 2278 31AE 4188 B1F2" /* =.]Wu•.ë"x1®Aˆ±ò */
- $"54E1 113D DA75 96ED 71FF 1577 7820 4D22" /* Tá.=Úu–íqÿ.wx M" */
- $"2BD9 3841 A416 96A4 2549 1A9D 3A55 8E39" /* +Ù8A¤.–¤%I.:UŽ9 */
- $"A929 4B4E E11F 0F88 8BB6 7E08 2210 9D21" /* ©)KNá..ˆ‹¶~.".! */
- $"92BF 623B B974 D371 0208 1489 5713 0F66" /* ’¿b;¹tÓq...‰W..f */
- $"3C4C 8394 72A6 08A1 3D86 BA0C 198B CE8B" /* <Lƒ”r¦.¡=†º..‹Î‹ */
- $"FB71 18D8 E044 CE7C A642 F1E5 DC8B F8E6" /* ûq.ØàDÎ|¦BñåÜ‹øæ */
- $"2405 66E0 B6C5 6A4F B1AE 2231 3060 11D4" /* $.fà¶ÅjO±®"10`.Ô */
- $"9963 5EF4 BB3D 1F61 0807 0AE1 0DFC 4718" /* ™c^ô»=.a..Âá.üG. */
- $"6C97 80A7 D438 6A81 B76A 6E7E 7A64 87A1" /* l—€§Ô8j·jn~zd‡¡ */
- $"1D7A 8744 3227 F565 4B4A E311 FA0F B477" /* .z‡D2'õeKJã.ú.´w */
- $"9DD6 0662 8844 7138 BDF8 CBCC 007F BDB6" /* Ö.bˆDq8½øËÌ..½¶ */
- $"07C4 98CC 226B 9762 33D0 99EF 54D9 5800" /* .ĘÌ"k—b3ЙïTÙX. */
- $"509D C37B 39A7 E11B 8771 0999 AB8B AAA6" /* PÃ{9§á.‡qÆ™«‹ª¦ */
- $"C463 6C38 7FB0 9121 2CA2 7634 BBEE 41FB" /* Äcl8.°‘!,¢v4»îAû */
- $"4F3B B050 3E38 15C4 98A6 216D 31C2 7057" /* O;°P>8.ʦ!m1ÂpW */
- $"0B3D 429A 6CFB 0819 EB4D B9D2 549F 6601" /* .=Bšlû..ëM¹ÒTŸf. */
- $"2436 5BEA 9DAC BBDA AB3A AB4F ABFF 768D" /* $6[ꬻګ:«O«ÿv */
- $"E220 E451 7E45 49C5 21FD B2E6 DEFD 2505" /* â äQ~EIÅ!ý²æÞý%. */
- $"836B 3500 54D8 50B8 7538 C5BF B951 7FB2" /* ƒk5.TØP¸u8Å¿¹Q.² */
- $"F927 CBB1 7AA1 D0BD 51E2 D7F7 C440 5DA0" /* ù'˱z¡Ð½Qâ×÷Ä@]  */
- $"89EF FEEE BF2E A5E4 F98A B652 F25A D1DC" /* ‰ïþî¿.¥äùŠ¶RòZÑÜ */
- $"482A 40CB A288 250A 22CA BCB4 815D 077E" /* H*@Ë¢ˆ%Â"ʼ´].~ */
- $"229E 59B2 8249 D336 A3C1 5D5B FAE5 483C" /* "žY²‚IÓ6£Á][úåH< */
- $"67F3 255E 1530 AFB1 D900 48FE 254B C54E" /* gó%^.0¯±Ù.Hþ%KÅN */
- $"42DC EE54 066B CE83 B1C9 F021 2031 8DF1" /* BÜîT.k΃±Éð! 1ñ */
- $"FE58 9315 B761 79CA 409A 6CD6 337A 14A9" /* þX“.·ayÊ@šlÖ3z.© */
- $"8622 90BC 3474 727C 66CE 09C5 61B4 A386" /* †"¼4tr|fÎÆÅa´£† */
- $"7509 819F 6EEB 5FCC C0A7 084A 7742 A6E3" /* uÆŸnë_ÌÀ§.JwB¦ã */
- $"F69A 90CA 24AD EB53 60AB 5FD0 FD6F 3DE6" /* öšÊ$­ëS`«_Ðýo=æ */
- $"44CF 80FB A400 B71F 1DD4 C690 A3DB 54CF" /* DÏ€û¤.·..ÔÆ£ÛTÏ */
- $"F492 7EC7 540C 048F 3D35 FD63 7593 751B" /* ô’~ÇT..=5ýcu“u. */
- $"F88F 4B7D E355 6685 FD5F 2743 8DF3 D839" /* øK}ãUf…ý_'CóØ9 */
- $"0894 99DB 1FAA 22B2 8800 8C9F D91F E60B" /* .”™Û.ª"²ˆ.ŒŸÙ.æ. */
- $"0EEE 2870 2932 2AE5 F401 11F0 8B2B 53DB" /* .î(p)2*åô..ð‹+SÛ */
- $"8028 E39D 744F E70B 11F3 A220 ABF4 FCD5" /* €(ãtOç..ó¢ «ôüÕ */
- $"37C9 0AC8 8749 215E 1D89 4022 96D0 04FF" /* 7ÉÂȇI!^.‰@"–Ð.ÿ */
- $"0C57 AC3D 351A 8582 EBA4 EA2B B65B A14B" /* .W¬=5.…‚ë¤ê+¶[¡K */
- $"048B E031 DE15 251C 669F 8457 FF38 D131" /* .‹à1Þ.%.fŸ„Wÿ8Ñ1 */
- $"0027 BB20 9721 6636 A375 AFBA AF7B BDBA" /* .'» —!f6£u¯º¯{½º */
- $"05F3 3114 E55E DAA9 219F 9516 F3DF 12B4" /* .ó1.å^Ú©!Ÿ•.óß.´ */
- $"DA3F 83DF 13A0 9900 3FA6 17E9 B014 E404" /* Ú?ƒß. ™.?¦.é°.ä. */
- $"434D 02D4 4283 D73D F4D1 5D95 8B25 6A6A" /* CM.ÔBƒ×=ôÑ]•‹%jj */
- $"CD5E BA93 82DF 1A30 4B0D 0E21 65A1 0001" /* Í^º“‚ß.0K..!e¡.. */
- $"2869 F06A 8949 311F DB03 39EB E8E1 5BFB" /* (iðj‰I1.Û.9ëèá[û */
- $"F11C 05C6 2469 BAEA 4516 4CC4 DAF5 927A" /* ñ..Æ$iºêE.LÄÚõ’z */
- $"2CEB 3150 DB6F 4DE2 8EED 59C0 604F 9AE5" /* ,ë1PÛoMâŽíYÀ`Ošå */
- $"E136 83B0 F348 3D1A B44D 3A8E D77A B0DE" /* á6ƒ°óH=.´M:Ž×z°Þ */
- $"5267 1055 24F7 3C3D EB3E 08EF 97F9 4B29" /* Rg.U$÷<=ë>.ï—ùK) */
- $"454F 1B5D 4A6E 56E1 0F90 00A1 4467 7454" /* EO.]JnVá..¡DgtT */
- $"B556 362A 9A19 9E35 19E9 BFDF E2AD 91D6" /* µV6*š.ž5.é¿ßâ­‘Ö */
- $"7FB6 95B9 F19D 8D07 2FAF 3162 D880 0AA7" /* .¶•¹ñ./¯1b؀§ */
- $"C9C4 94AD C49A 1231 2D9F 780F 6E3E 57D2" /* ÉÄ”­Äš.1-Ÿx.n>WÒ */
- $"8C1C 582C 179A 721C 7063 F056 F938 4EA1" /* Œ.X,.šr.pcðVù8N¡ */
- $"F3E4 E458 D254 280F 92CA ABDC 4ECF 3EB7" /* óääXÒT(.’Ê«ÜNÏ>· */
- $"95DF A3B8 45C0 1427 BA54 B2E2 D1BC B67D" /* •ß£¸EÀ.'ºT²âѼ¶} */
- $"5A0F EE12 37D4 BE1C 5785 A90D 2E62 B301" /* Z.î.7Ô¾.W…©..b³. */
- $"F66D A637 374B 17DA 7446 C318 3B11 4F50" /* öm¦77K.ÚtFÃ.;.OP */
- $"ED27 AEB2 D8F6 C3E4 AB48 5E7C 1D46 9463" /* í'®²ØöÃä«H^|.F”c */
- $"E7BA 9296 7BFA FDBB 39F2 7E86 1A5D 8FFA" /* 纒–{úý»9ò~†.]ú */
- $"7E06 FC92 3472 7950 8B67 8329 FA9F 47AA" /* ~.ü’4ryP‹gƒ)úŸGª */
- $"51F3 01AD A6DA 224F E711 AF6F BA8F FA86" /* Qó.­¦Ú"Oç.¯oºú† */
- $"FF61 EBD1 5613 B076 3543 3515 FF1B 1E9C" /* ÿaëÑV.°v5C5.ÿ..œ */
- $"CE78 6A36 7CCF FD63 E9E3 00E6 EA60 1DBE" /* Îxj6|Ïýcéã.æê`.¾ */
- $"42FB 3E66 D69D 8BA6 A0E6 13E1 2087 20D7" /* Bû>fÖ‹¦ æ.á ‡ × */
- $"7941 E3C4 C7C6 67FF 2C9C A486 253A C206" /* yAãÄÇÆgÿ,œ¤†%:Â. */
- $"F961 4A0E D9DD D32A 6D67 A012 B1A2 B549" /* ùaJ.ÙÝÓ*mg .±¢µI */
- $"3F58 8BA1 CA98 94EB 6099 570C D139 09AA" /* ?X‹¡Ê˜”ë`™W.Ñ9ƪ */
- $"8DEB C31A 0812 5DAD 2926 6846 D789 4430" /* ëÃ...]­)&hF׉D0 */
- $"4931 16B5 0804 52F1 040D B0A7 DDD7 7052" /* I1.µ..Rñ..°§Ý×pR */
- $"4269 C765 98AA 3941 F9EE 987A 2EAD 46BE" /* BiÇe˜ª9Aùî˜z.­F¾ */
- $"AA2B DD79 D9F9 7AF7 9318 B633 97CC DB93" /* ª+ÝyÙùz÷“.¶3—ÌÛ“ */
- $"5AF7 23D4 08E5 1FD7 EA45 85E9 4C98 77B6" /* Z÷#Ô.å.×êE…éL˜w¶ */
- $"0038 8756 6C8F 1A76 8D36 D67C 0BBD 248F" /* .8‡Vl.v6Ö|.½$ */
- $"8465 4CC4 7B7A C1B7 6348 F763 66A7 F04E" /* „eLÄ{zÁ·cH÷cf§ðN */
- $"FF4E 1C72 1053 323F 9E55 F75D 4097 9C24" /* ÿN.r.S2?žU÷]@—œ$ */
- $"AD5D 3C1B 766A 50A8 7252 6563 2687 8251" /* ­]<.vjP¨rRec&‡‚Q */
- $"8AE2 2EAE 6AA9 6439 2831 281E 034D 7999" /* Šâ.®j©d9(1(..My™ */
- $"F46F 47C1 911D 553A D887 0E8F 6E83 1B48" /* ôoGÁ‘.U:؇.nƒ.H */
- $"F0D9 C566 C0FF 0F02 5E68 EA76 7381 25B1" /* ðÙÅfÀÿ..^hêvs%± */
- $"D388 A375 370B A655 625B B71A 191C CD9D" /* Óˆ£u7.¦Ub[·...Í */
- $"F3CA 83B2 88D6 3712 B3E3 6CEA 19DC 3295" /* óʃ²ˆÖ7.³ãlê.Ü2• */
- $"3398 DF4F 1279 B346 1DD8 ED24 186F BEE1" /* 3˜ßO.y³F.Øí$.o¾á */
- $"8FD4 5FAD EAFF 6960 DE17 A0A4 B89E 7CF3" /* Ô_­êÿi`Þ. ¤¸ž|ó */
- $"C360 9DA8 91BF 470F ECC0 C0AA E260 3430" /* Ã`¨‘¿G.ìÀÀªâ`40 */
- $"EF4E CAD6 F964 05B0 8E27 C1F6 7516 4350" /* ïNÊÖùd.°Ž'Áöu.CP */
- $"B87D 7D16 703E 7972 1232 2E0F 6577 664C" /* ¸}}.p>yr.2..ewfL */
- $"8FA6 1414 7FB2 A33D A69E FD2F CF21 FC8F" /* ¦...²£=¦žý/Ï!ü */
- $"23A5 6AED 3E28 34A0 F73F F7D6 7F7C 5B6B" /* #¥jí>(4 ÷?÷Ö.|[k */
- $"0596 8B6D BACA 52DF 8E72 CDBA E221 7092" /* .–‹mºÊRߎrͺâ!p’ */
- $"A3AB B99D 1EE3 3F21 1AD2 0F0B DC5A 8BE1" /* £«¹.ã?!.Ò..ÜZ‹á */
- $"9E35 D891 9A60 EF28 5934 FA3B 8009 DC42" /* ž5Ø‘š`ï(Y4ú;€ÆÜB */
- $"11BE 487F D776 AF26 0EBD BF3E 8DCC B940" /* .¾H.×v¯&.½¿>̹@ */
- $"2523 D6E1 447F EA8A 5F66 DE0B 0962 249E" /* %#ÖáD.êŠ_fÞ.Æb$ž */
- $"165D BB6D 1EBD 1237 021B F903 DEEF 78FE" /* .]»m.½.7..ù.Þïxþ */
- $"B3F3 76B7 429F 336D 0EFA FF47 5CBC E3DF" /* ³óv·BŸ3m.úÿG\¼ãß */
- $"FC44 41BA BC9D 67AE 0B43 D817 FBCE 4F36" /* üDAº¼g®.CØ.ûÎO6 */
- $"8209 CCB5 38F6 712E 7DEA 4E9E 4B38 3B80" /* ‚Æ̵8öq.}êNžK8;€ */
- $"7B16 28E3 AB59 340E 93F0 4C65 C281 A4F1" /* {.(ã«Y4.“ðLe¤ñ */
- $"08E4 26A6 31AA B6A4 F784 BA8E C7FA 8919" /* .ä&¦1ª¶¤÷„ºŽÇú‰. */
- $"4B19 FA98 09C8 3C79 27DA CB39 881C 3B0E" /* K.ú˜ÆÈ<y'ÚË9ˆ.;. */
- $"9BEA 1EF3 D655 CFEB B4F7 0888 971D 69EF" /* ›ê.óÖUÏë´÷.ˆ—.iï */
- $"1105 0EF2 80B8 FF1E F0BE 107F 9AB0 6C52" /* ...ò€¸ÿ.ð¾..š°lR */
- $"FF78 3AA4 8FE0 3370 40DF C5E8 478A 2FCF" /* ÿx:¤à3p@ßÅèGŠ/Ï */
- $"96C5 8D32 8E07 AA93 DA95 4D9B 60C6 2748" /* –Å2Ž.ª“Ú•M›`Æ'H */
- $"C8F4 8347 D2D9 2E35 75E4 333A 6494 B177" /* ÈôƒGÒÙ.5uä3:d”±w */
- $"C836 6E4F AF08 CDB0 0FA5 D565 A0EC 946F" /* È6nO¯.Í°.¥Õe ì”o */
- $"ED5C 03F6 E5DB FA4F D29A BF8F BC7F 12D8" /* í\.öåÛúOÒš¿¼..Ø */
- $"7730 8564 524D 4B31 F681 8C71 C5BC 1641" /* w0…dRMK1öŒqż.A */
- $"6988 F9CF 0385 B8EE 4C04 07DB 5AD2 531C" /* iˆùÏ.…¸îL..ÛZÒS. */
- $"48BA 3E6F E24E AF73 DB5E B729 A4BF 894A" /* Hº>oâN¯sÛ^·)¤¿‰J */
- $"782D E8F2 91C9 E628 322C F20C 2D0C 73DD" /* x-èò‘Éæ(2,ò.-.sÝ */
- $"F093 4ED7 63DF E121 E7B9 DB7E 530D E3BD" /* ð“N×cßá!ç¹Û~S.ã½ */
- $"3469 29CE 5768 BE0F 1E91 46B7 00A0 CC2E" /* 4i)ÎWh¾..‘F·. Ì. */
- $"183D 7D57 762C 062D 0707 EBA4 177D 73E8" /* .=}Wv,.-..ë¤.}sè */
- $"FA30 83A6 479B AA9A 702E B8FD 9B54 0FF3" /* ú0ƒ¦G›ªšp.¸ý›T.ó */
- $"8222 1EB0 4CDD 4CF7 F0AB 8972 B655 9426" /* ‚".°LÝL÷ð«‰r¶U”& */
- $"4EEE 3B88 A6D2 F8B9 6845 0467 D606 9DDD" /* Nî;ˆ¦Òø¹hE.gÖ.Ý */
- $"C547 A61F 71E7 5A8E 6B83 51FD B2C1 A732" /* ÅG¦.qçZŽkƒQý²Á§2 */
- $"A6EA A0AA 6D13 E80B 0EC4 5DF4 348F FF6E" /* ¦ê ªm.è..Ä]ô4ÿn */
- $"2289 CFB4 1AE2 18D1 340F B29B E1FF 16B1" /* "‰Ï´.â.Ñ4.²›áÿ.± */
- $"0F0F B5AD 260A 7FD9 B1F2 3D0C 404F 75A8" /* ..µ­&Â.Ù±ò=.@Ou¨ */
- $"E4DB 52EE 259B D762 E5E5 4FFD 22AC 4856" /* äÛRî%›×bååOý"¬HV */
- $"9C62 8DDB F5D8 58F8 4EC7 1110 30EC E0D8" /* œbÛõØXøNÇ..0ìàØ */
- $"7FED 0176 FEF2 53B3 75C6 34E1 A3A7 79DA" /* .í.vþòS³uÆ4ᣧyÚ */
- $"1FDC 42EC 83B2 F3EB 056C E41B 4E65 3699" /* .ÜB샲óë.lä.Ne6™ */
- $"4BD6 1AE3 85A9 DBF6 89D4 39B0 79F9 8877" /* KÖ.ã…©Ûö‰Ô9°yùˆw */
- $"161C 2CB5 3F3C 294B 8CA3 A6F6 556C 4CAD" /* ..,µ?<)KŒ£¦öUlL­ */
- $"A752 918D 7E61 BA54 02D2 CF5C AEBE 1A0B" /* §R‘~aºT.ÒÏ\®¾.. */
- $"B75C A9CA 9876 AB0B 6028 4D8E D46C E479" /* ·\©Ê˜v«.`(MŽÔläy */
- $"A186 EA09 496E 0935 04E2 4C25 FA18 270B" /* ¡†êÆInÆ5.âL%ú.'. */
- $"A054 DE1C 1BD8 A089 9D95 1335 E93C 7C21" /*  TÞ..Ø ‰•.5é<|! */
- $"435E A570 3C42 AA88 0075 BB20 20AF 90EC" /* C^¥p<Bªˆ.u» ¯ì */
- $"26F9 7E41 5CC7 2154 63A3 D965 075C 1A78" /* &ù~A\Ç!Tc£Ùe.\.x */
- $"2A13 753E DDD9 F846 467C EFC6 5308 2B46" /* *.u>ÝÙøFF|ïÆS.+F */
- $"5BD9 2BFF 5F26 72DB 523D D0FC CE49 47B0" /* [Ù+ÿ_&rÛR=ÐüÎIG° */
- $"D98B 4D36 1B60 7C3A 0707 F46A 8565 4CCB" /* Ù‹M6.`|:..ôj…eLË */
- $"5DC1 A50D C039 BF24 7418 78A7 6D4F DE55" /* ]Á¥.À9¿$t.x§mOÞU */
- $"1CB8 B787 158C 6C4D D840 920F 3130 7A92" /* .¸·‡.ŒlMØ@’.10z’ */
- $"1CF4 1B74 BC2B 8954 0A80 9636 BFC3 6330" /* .ô.t¼+‰T€–6¿Ãc0 */
- $"3E7F 7E4E A811 39F2 3D56 10D3 6A76 4E20" /* >.~N¨.9ò=V.ÓjvN */
- $"F646 5CD3 9166 D2D6 046F E398 A934 2D04" /* öF\Ó‘fÒÖ.o㘩4-. */
- $"2E01 C602 1332 8274 6AE2 D5C9 6226 30B3" /* ..Æ..2‚tjâÕÉb&0³ */
- $"07DB FDF3 B3BB 6C31 B162 FF63 0639 8E6F" /* .Ûýó³»l1±bÿc.9Žo */
- $"3501 A54C 1AA6 42EB EDE7 885E EE2F A6D9" /* 5.¥L.¦Bëíçˆ^î/¦Ù */
- $"B74A AE20 8FFB 6FCF A537 642D F17F A45E" /* ·J® ûoÏ¥7d-ñ.¤^ */
- $"EE37 DE05 7569 A81E F464 A35B 603B 4F40" /* î7Þ.ui¨.ôd£[`;O@ */
- $"D00F C3D2 D04A F943 AC3C 37E2 1B2B A1D3" /* Ð.ÃÒÐJùC¬<7â.+¡Ó */
- $"09D6 A92B F7CB B2FA 9FF7 97F2 83F9 BABC" /* ÆÖ©+÷˲úŸ÷—òƒùº¼ */
- $"E4BE F015 E804 97FC A16F 6E8B 9004 8424" /* ä¾ð.è.—ü¡on‹.„$ */
- $"04F7 1295 0A15 3C1A AA5D 6A75 372A 0BB4" /* .÷.•Â.<.ª]ju7*.´ */
- $"4849 DD4A 012F D969 23A9 FBA7 C3EB D29F" /* HIÝJ./Ùi#©û§ÃëÒŸ */
- $"5CE0 BD6F 8436 26BB 1B52 3BCB DCAA 0791" /* \à½o„6&».R;Ëܪ.‘ */
- $"02B3 8EC7 5A89 D402 C9FF 058E E2C8 AD72" /* .³ŽÇZ‰Ô.Éÿ.ŽâÈ­r */
- $"01BF D9B3 FA52 B000 0000 3090 8B4E 8809" /* .¿Ù³úR°...0‹NˆÆ */
- $"9E4F 59A7 8021 D030 169B 78E6 55B4 9FB8" /* žOY§€!Ð0.›xæU´Ÿ¸ */
- $"48A1 D2F4 BE8E A948 A89E 5E3E BE56 AE8C" /* H¡Òô¾Ž©H¨ž^>¾V®Œ */
- $"BF6C 6485 F435 4906 BE37 4D88 589A 85C0" /* ¿ld…ô5I.¾7MˆXš…À */
- $"5278 59EC 1FED 3652 3FE0 5229 0524 D686" /* RxYì.í6R?àR).$Ö† */
- $"1E5E 14D9 8C56 8742 9625 36BB 4674 0391" /* .^.ÙŒV‡B–%6»Ft.‘ */
- $"9647 FCC9 30C4 6D0D 5812 1271 E9C8 E89D" /* –GüÉ0Äm.X..qéÈè */
- $"7F9B 3420 0269 5F58 4554 F964 BDDA E9F3" /* .›4 .i_XETùd½Úéó */
- $"973A 5B5F 4C59 107B 2D9E 87CB D896 1F13" /* —:[_LY.{-ž‡ËØ–.. */
- $"AC52 F00D 3600 9104 3FF2 399A 0158 5153" /* ¬Rð.6.‘.?ò9š.XQS */
- $"139A A5C2 51CC D2C7 D082 C2A0 E35B FE05" /* .š¥ÂQÌÒÇЂ ã[þ. */
- $"06C9 DBB4 7036 39DB 80AF 4642 9F53 170C" /* .ÉÛ´p69Û€¯FBŸS.. */
- $"2856 38D5 0FA7 B562 4ED8 3BB5 B48A B1C8" /* (V8Õ.§µbNØ;µ´Š±È */
- $"B20B 4B42 4499 C5C1 242B A1BA CB74 D8F1" /* ².KBD™ÅÁ$+¡ºËtØñ */
- $"1CF1 241E 7A2A B847 111D 13DC CD3C 05A3" /* .ñ$.z*¸G...ÜÍ<.£ */
- $"024F 25B5 41E2 0A15 E1C4 1A0E A5D8 0742" /* .O%µAâÂ.áÄ..¥Ø.B */
- $"A359 2372 FD88 7447 1DB7 F766 5B7F E63E" /* £Y#rýˆtG.·÷f[.æ> */
- $"26B8 BC6E 7B72 E331 2BE1 73BD 04A0 E941" /* &¸¼n{rã1+ás½. éA */
- $"45EC 9039 8769 8BFF 1624 8D43 CA24 9D0D" /* Eì9‡i‹ÿ.$CÊ$. */
- $"A05B F467 7401 E777 0608 C4A6 A698 9A9B" /*  [ôgt.çw..Ħ¦˜š› */
- $"7066 11D3 606F 857E 18D8 D9D3 E226 38C0" /* pf.Ó`o…~.ØÙÓâ&8À */
- $"D89B 09D9 A2F1 0171 BAC9 D7BF AB2E BD58" /* Ø›ÆÙ¢ñ.qºÉ׿«.½X */
- $"7178 6CC2 608D 447D D92A 621C 1A82 B764" /* qxlÂ`D}Ù*b..‚·d */
- $"2ABE CBE8 07C0 E2A6 9B83 46A8 1109 FC87" /* *¾Ëè.À⦛ƒF¨.Æü‡ */
- $"F083 9598 26AE 8847 7E22 278D 9311 59FC" /* ðƒ•˜&®ˆG~"'“.Yü */
- $"2995 1D44 BA58 24BC 2A99 3946 0E00 9144" /* )•.DºX$¼*™9F..‘D */
- $"9113 0297 29E3 A7B5 B937 2D23 8405 86ED" /* ‘..—)㧵¹7-#„.†í */
- $"29F1 5254 6A8C 0FB8 4B13 F6C3 6028 2C14" /* )ñRTjŒ.¸K.öÃ`(,. */
- $"3B80 E317 225C 7A9B 405C 7E95 A2E4 311B" /* ;€ã."\z›@\~•¢ä1. */
- $"076A D7B8 A4B5 225A 1F29 FAA2 8239 D98F" /* .j׸¤µ"Z.)ú¢‚9Ù */
- $"071A F302 DA24 AE80 2AC0 D108 035D EA76" /* ..ó.Ú$®€*ÀÑ..]êv */
- $"2F7E 850F 9E87 6B19 B2F1 F1E5 F5B3 A5AF" /* /~….ž‡k.²ññåõ³¥¯ */
- $"35BB D867 8257 8A48 5E4F 6983 E22E 6DAD" /* 5»Øg‚WŠH^Oiƒâ.m­ */
- $"D361 1505 ECF2 3F3C DB84 1861 E5AB 6793" /* Óa..ìò?<Û„.aå«g“ */
- $"910D 8F56 6BB5 FD17 29DB 242A 6946 8022" /* ‘.Vkµý.)Û$*iF€" */
- $"7DAF 8120 02EB C840 3765 69EC BB8B F2FF" /* }¯ .ëÈ@7ei컋òÿ */
- $"6031 7BE4 EFC4 BECD 7BD7 CB0A 8B8C 75C2" /* `1{äïľÍ{×Ë‹Œu */
- $"E63A F4E4 B05B 1442 0CB1 BEBD E078 84F5" /* æ:ôä°[.B.±¾½àx„õ */
- $"3D95 24FA 952F 949B AD72 01B7 1CC7 4CA6" /* =•$ú•/”›­r.·.ÇL¦ */
- $"78C2 BA05 B757 517A 5CB1 A380 0C23 0680" /* xº.·WQz\±£€.#.€ */
- $"3113 0CBA 23B8 AA48 F832 B74F 997E 6E03" /* 1..º#¸ªHø2·O™~n. */
- $"D16C 577F 968F E9A4 73CA DA79 07B3 A5F1" /* ÑlW.–é¤sÊÚy.³¥ñ */
- $"2D20 C13D F821 62F9 41A0 A7AA 472A 368A" /* - Á=ø!bùA §ªG*6Š */
- $"28EE 7686 F7B4 D5CF 225E 004E 709F C4E8" /* (îv†÷´ÕÏ"^.NpŸÄè */
- $"FCBC B778 C976 A1E0 1968 1EF9 E998 2DC2" /* ü¼·xÉv¡à.h.ùé˜- */
- $"1693 C645 A4F5 787A 5B10 45C0 F010 8596" /* .“ÆE¤õxz[.EÀð.…– */
- $"A0F6 E8AA 1BAC C958 C0F6 101E 0C4D 2E61" /*  öèª.¬ÉXÀö...M.a */
- $"B76E 4019 58DD 3058 000C 2375 6EBC 6599" /* ·n@.XÝ0X..#un¼e™ */
- $"BEA3 9ADC 0002 F98F 24B3 B036 EA0D F2FD" /* ¾£šÜ..ù$³°6ê.òý */
- $"6823 E10A 59D7 5D0B F6C0 EFB2 7D9D A684" /* h#áÂY×].öÀï²}¦„ */
- $"3084 4AD6 92F2 BFB2 57CA 7294 FF2D 53C8" /* 0„JÖ’ò¿²WÊr”ÿ-SÈ */
- $"8D05 254E 2360 582F CE0C E209 240D FAB4" /* .%N#`X/Î.âÆ$.ú´ */
- $"C638 2103 7462 2AF1 5461 2036 09B4 294F" /* Æ8!.tb*ñTa 6Æ´)O */
- $"52A6 6553 F6B7 85F6 E77F A8B7 058C F201" /* R¦eSö·…öç.¨·.Œò. */
- $"19BA D75B 6612 0013 CFA6 F54F 8855 C000" /* .º×[f...ϦõOˆUÀ. */
- $"00BE 57DE C13B 77B0 AF81 F95D 8E88 7224" /* .¾WÞÁ;w°¯ù]Žˆr$ */
- $"002F C7BE 1D06 F540 58EF 1909 1D8F 037F" /* ./Ǿ..õ@Xï.Æ... */
- $"E973 290F 641E 8849 F996 EA66 D15C CA23" /* és).d.ˆIù–êfÑ\Ê# */
- $"C620 3090 94D8 F95F C58C 720B 7FFE 206C" /* Æ 0”Øù_ÅŒr..þ l */
- $"A3E0 EE49 AE89 4586 6617 FE87 4D7B D300" /* £àîI®‰E†f.þ‡M{Ó. */
- $"4CF6 E77F A882 E041 362F 710E AC03 D573" /* Löç.¨‚àA6/q.¬.Õs */
- $"69FF 7480 0018 484B 0D10 C800 0000 0C24" /* iÿt€..HK..È....$ */
- $"183F ADBF D900 0184 8481 E82C C758 1848" /* .?­¿Ù..„„è,ÇX.H */
- $"4840 6806 1212 B020 EA50 0818 484B F6E7" /* H@h...° êP..HKöç */
- $"7FA5 E774 6249 2F3D 5FF9 2FC0 0C24 1656" /* .¥çtbI/=_ù/À.$.V */
- $"1B91 8000 1846 D5F4 CA01 40C2 3F26 3D84" /* .‘€..FÕôÊ.@Â?&=„ */
- $"7B4A 811F 08D6 B47D 05C2 4402 D57B C1FC" /* {J..Ö´}.ÂD.Õ{Áü */
- $"7D32 E6FE 8125 F24E 514B 2820 7323 F96F" /* }2æþ%òNQK( s#ùo */
- $"B1F9 CDBD 94E4 C9BF 81D6 5A26 1C08 2131" /* ±ùͽ”äÉ¿ÖZ&..!1 */
- $"FF58 608E A4BB BEFD 703F C3EA B596 2AEA" /* ÿX`Ž¤»¾ýp?Ãêµ–*ê */
- $"48B2 2319 2F7A B9BC A14D EAB4 49CF 89E9" /* H²#./z¹¼¡Mê´Iωé */
- $"D312 5979 1910 6519 C45E 4B88 F709 D65D" /* Ó.Yy..e.Ä^Kˆ÷ÆÖ] */
- $"BF0F 86DC C883 8469 9757 7FC7 FB91 A851" /* ¿.†Üȃ„i—W.Çû‘¨Q */
- $"7834 0232 03F5 F552 B022 E799 431E 3FE8" /* x4.2.õõR°"ç™C.?è */
- $"BE7C A37B AAE1 D04F 9795 EA98 CAB0 6816" /* ¾|£{ªáÐO—•ê˜Ê°h. */
- $"047F 244A 2BD3 E0CF B862 B172 B1B3 F027" /* ..$J+Óàϸb±r±³ð' */
- $"6505 A5AA 6AB2 5F8E B98F 85CB D487 2603" /* e.¥ªj²_Ž¹…ËÔ‡&. */
- $"BDA4 4C6D 4B74 0A12 117F 6137 6A30 37CE" /* ½¤LmKtÂ...a7j07Î */
- $"0441 188C 63FC 46ED 5C9A B6A0 9012 6450" /* .A.ŒcüFí\š¶ .dP */
- $"A042 C4D3 8E69 8930 0797 25B3 B70D 5C62" /*  BÄÓŽi‰0.—%³·.\b */
- $"6A83 3964 5EF1 4A28 508D FF7F E847 17D0" /* jƒ9d^ñJ(Pÿ.èG.Ð */
- $"7C91 F4BC AA82 5462 99EF FF79 5A7A E45E" /* |‘ô¼ª‚Tb™ïÿyZzä^ */
- $"98FF 5B1E 90FE 7F80 9453 7AD1 4A63 8FFC" /* ˜ÿ[.þ.€”SzÑJcü */
- $"1B61 796C 4B90 7FE9 1959 752B 8579 95F8" /* .aylK.é.Yu+…y•ø */
- $"C5B9 7EC6 2D24 5185 1BCE 12D6 B418 B42C" /* Ź~Æ-$Q….Î.Ö´.´, */
- $"D40F 7AF7 657E 5184 9CAA 8834 B65C 4785" /* Ô.z÷e~Q„œªˆ4¶\G… */
- $"B934 7C3A 8000 0000 99F5 3F06 3790 6AF7" /* ¹4|:€...™õ?.7j÷ */
- $"0769 9D8E F19F 4FF3 EDE6 D059 B97C A1F0" /* .iŽñŸOóíæÐY¹|¡ð */
- $"0CE2 4FAF B846 8CCE 52E4 E898 D2E0 00A3" /* .âO¯¸FŒÎRäè˜Òà.£ */
- $"CB3D F2B1 E7F7 0C30 FF13 DB29 474C C00D" /* Ë=ò±ç÷.0ÿ.Û)GLÀ. */
- $"C6B7 6A2D 2F89 8E2F BDE7 F2BA C3DD 591B" /* Æ·j-/‰Ž/½çòºÃÝY. */
- $"CEDE C7DD 35BA 492C BB53 2AF6 7315 AC30" /* ÎÞÇÝ5ºI,»S*ös.¬0 */
- $"17D7 1C05 3AE4 4AB3 8D31 0DC9 7A9F 0A76" /* .×..:äJ³1.ÉzŸÂv */
- $"B4EE 95EE 6CB5 1C6A FE4F D27E 0966 CE51" /* ´î•îlµ.jþOÒ~ÆfÎQ */
- $"8607 E144 F4AD E999 5480 05FF 7FC2 C645" /* †.áDô­é™T€.ÿ.ÂÆE */
- $"D136 BB6E 89FA 9A2D F827 338F FEB9 B248" /* Ñ6»n‰úš-ø'3þ¹²H */
- $"23A6 377D 0E53 BBF3 D290 3AD8 F58B CE4C" /* #¦7}.S»óÒ:Øõ‹ÎL */
- $"24CA 8E49 76ED DA48 8856 904D C31F 305F" /* $ÊŽIvíÚHˆVMÃ.0_ */
- $"C441 7DAA 86D8 3FE1 5EA7 E20A CDBC 5F2A" /* ÄA}ª†Ø?á^§âÂͼ_* */
- $"35DC 107F DDE2 D88C 7B38 D700 4C54 9C81" /* 5Ü..ÝâØŒ{8×.LTœ */
- $"B8FD F39D 0F47 DE2B 6E17 7D4F E30F F60C" /* ¸ýó.GÞ+n.}Oã.ö. */
- $"0895 5694 3006 1211 EFEC D7F8 F743 3D43" /* .•V”0...ïì×ø÷C=C */
- $"6BA5 7C06 9025 9188 E369 0FC8 94CB F38E" /* k¥|.%‘ˆãi.È”ËóŽ */
- $"DF76 CA67 91C4 D786 F34F 1E56 332B 1404" /* ßvÊg‘Ä׆óO.V3+.. */
- $"B66B 2702 B13D 47B8 1FBD 38D7 A2DF 54EF" /* ¶k'.±=G¸.½8×¢ßTï */
- $"FD1C 00CC 5D05 5B28 3EBF 2FC7 7263 5880" /* ý..Ì].[(>¿/ÇrcX€ */
- $"0364 4A0B 982F 4A13 A55F 5D64 61D2 110C" /* .dJ.˜/J.¥_]daÒ.. */
- $"4319 318A 5BD6 94B7 DBA9 92F0 379B 0E87" /* C.1Š[Ö”·Û©’ð7›.‡ */
- $"4561 92A0 0000 0000 0000 12FE B897 0ABD" /* Ea’ .......þ¸—½ */
- $"B3C7 FEA8 AE43 B177 DA3F 2BA3 2D59 3358" /* ³Çþ¨®C±wÚ?+£-Y3X */
- $"9FAE 567F E53B 2877 9FFF 7FFF 7FFB 4B90" /* Ÿ®V.å;(wŸÿ.ÿ.ûK */
- $"C00D FEA3 7DF6 39C4 C825 2952 2C65 8FFF" /* À.þ£}ö9ÄÈ%)R,eÿ */
- $"7E91 DB49 1333 7DEC 6471 1E2E 394E A080" /* ~‘ÛI.3}ìdq..9N € */
- $"C1C9 0DD4 62C4 4FC9 E332 BC0D F9DD FEAB" /* ÁÉ.ÔbÄOÉã2¼.ùÝþ« */
- $"9D33 8271 2A01 8484 B009 6058 624E 2736" /* 3‚q*.„„°Æ`XbN'6 */
- $"529C A0F4 BCBB 846D 32FD 407C FA84 2D52" /* Rœ ô¼»„m2ý@|ú„-R */
- $"21DC 1623 210B 0410 4061 212D 0386 04FF" /* !Ü.#!...@a!-.†.ÿ */
- $"7F72 1DFF 6F83 6A31 2B6E 0A6B D1F1 9A43" /* .r.ÿoƒj1+nÂkÑñšC */
- $"F340 2C47 D413 DFAC FF76 46AC 4BDD 55F0" /* ó@,GÔ.߬ÿvF¬KÝUð */
- $"2F9A 3BC6 613E 2F69 F45C 08F3 3FCB F83F" /* /š;Æa>/iô\.ó?Ëø? */
- $"F7D8 DC38 0F99 4764 0309 0948 41C6 1212" /* ÷ØÜ8.™Gd.ÆÆHAÆ.. */
- $"293B 5EA3 BE56 F760 BAEF 61FF 43D4 2891" /* );^£¾V÷`ºïaÿCÔ(‘ */
- $"A380 672E FF7E 4B98 FBFB 1ACD 90F6 4A7E" /* £€g.ÿ~K˜ûû.ÍöJ~ */
- $"3B14 E9F4 B1B4 4120 E600 AF42 0056 B131" /* ;.éô±´A æ.¯B.V±1 */
- $"0310 EF4F EA97 E030 9090 A298 F514 CEFA" /* ..ïOê—à0¢˜õ.Îú */
- $"B200 0061 211A A495 FD76 5850 B8F7 1CF1" /* ²..a!.¤•ývXP¸÷.ñ */
- $"A979 F478 5BFF 7FFB E6D6 F6D8 03FF 7FFD" /* ©yôx[ÿ.ûæÖöØ.ÿ.ý */
- $"2A36 38D4 BA43 6280 D508 C4BD 735D 1C6F" /* *68ÔºCb€Õ.Ľs].o */
- $"2444 63E9 1C9A 969F 90A6 F34E D24D 94F2" /* $Dcé.š–Ÿ¦óNÒM”ò */
- $"1A09 F86A 2762 886F FBA0 96EA 1DC7 0364" /* .Æøj'bˆoû –ê.Ç.d */
- $"6192 A000 0000 0000 0000 0000 0061 BE9F" /* a’ ..........a¾Ÿ */
- $"2C25 5C25 4958 1428 AA60 5ABF 5551 6084" /* ,%\%IX.(ª`Z¿UQ`„ */
- $"D319 B739 1DC3 F92F 03A7 CF66 39CC 13BE" /* Ó.·9.Ãù/.§Ïf9Ì.¾ */
- $"100A 204E 9A06 CBD9 A8ED 9E4D CEED AE53" /* . Nš.ËÙ¨ížMÎí®S */
- $"023D B3BF AC07 F70E F7DD 2601 E2B4 B214" /* .=³¿¬.÷.÷Ý&.â´². */
- $"3B1D 74CD 0F60 7063 EFC5 24B8 3B0F DF21" /* ;.tÍ.`pcïÅ$¸;.ß! */
- $"2929 3755 A800 7D09 63D9 1548 5D89 6D22" /* ))7U¨.}ÆcÙ.H]‰m" */
- $"FAEF 37DC EB96 FF52 0018 EBDF 464C 8B34" /* úï7Üë–ÿR..ëßFL‹4 */
- $"DF85 2990 1CF1 7C84 CEDC D384 5003 D5A1" /* ß…).ñ|„ÎÜÓ„P.Õ¡ */
- $"2797 DBDC FDFB 0E8C 3703 470D 1FD5 B974" /* '—ÛÜýû.Œ7.G..Õ¹t */
- $"5A32 CF32 3D2A 0213 FDC8 8A0C B595 4840" /* Z2Ï2=*..ýÈŠ.µ•H@ */
- $"C240 6E40 D585 AF4C 004A F98F FC90 E5BB" /* Â@n@Õ…¯L.Jùüå» */
- $"D6AD 2A34 0A6E 1D4D 933D 2221 80B7 C8EF" /* Ö­*4Ân.M“="!€·Èï */
- $"7C61 2953 2991 F91A 61A3 B54E 56D2 77E1" /* |a)S)‘ù.a£µNVÒwá */
- $"1DB8 8B5F 5E9C 7D32 80A0 C23F BBE6 A2B2" /* .¸‹_^œ}2€ Â?»æ¢² */
- $"D49F C777 4BE6 FDA6 7B0F 2983 E19B 84FF" /* ÔŸÇwKæý¦{.)ƒá›„ÿ */
- $"4B7B 0DD6 A35E 60AD 632D D6D7 7030 0A9F" /* K{.Ö£^`­c-Ö×p0Ÿ */
- $"0FA2 0820 8451 9624 D0FF 1FB4 9B81 61CC" /* .¢. „Q–$Ðÿ.´›aÌ */
- $"591F 6D98 E1AF 16E4 AF42 1FE0 B7C7 30DF" /* Y.m˜á¯.ä¯B.à·Ç0ß */
- $"CFFC EC14 15A1 B07A 4E11 ED5F BDB3 FD2A" /* Ïüì..¡°zN.í_½³ý* */
- $"84B1 6901 4333 27BB 2E8C 3329 2064 A800" /* „±i.C3'».Œ3) d¨. */
- $"0001 2FDE 803E 817B C369 A30F FCF0 FF1D" /* ../Þ€>{Ãi£.üðÿ. */
- $"89A1 2FD7 FF71 B63D 19EC 98DE DFE2 D9B8" /* ‰¡/×ÿq¶=.ì˜ÞßâÙ¸ */
- $"9D39 1737 4722 2A89 D291 623B 279F BF0B" /* 9.7G"*‰Ò‘b;'Ÿ¿. */
- $"E8C0 8AF8 CBE4 0011 5D58 29AB 34B0 335C" /* èÀŠøËä..]X)«4°3\ */
- $"36B2 1383 D820 11B8 22DF 56E1 27EF 932D" /* 6².ƒØ .¸"ßVá'ï“- */
- $"30DE CC72 58E3 9BDD A88C 229A CBC8 A466" /* 0ÞÌrXã›Ý¨Œ"šËȤf */
- $"7C29 FDE8 E789 F28F 3258 A2DD 897B 1C6A" /* |)ýèç‰ò2X¢Ý‰{.j */
- $"C048 306A EEA7 3DF0 F8D4 BECC CDBD 9E43" /* ÀH0jî§=ðøÔ¾ÌͽžC */
- $"A29D 8052 478B 6470 79B7 B38A 5743 CAE7" /* ¢€RG‹dpy·³ŠWCÊç */
- $"0BD4 0F4A 23E1 4C85 39C9 DEB0 75AF 151E" /* .Ô.J#áL…9ÉÞ°u¯.. */
- $"45D5 1681 2BA4 74C9 13B5 746A E399 9467" /* EÕ.+¤tÉ.µtjã™”g */
- $"E6B9 D503 7F7C D57D 4D5F 7FC8 DD43 7D9B" /* æ¹Õ..|Õ}M_.ÈÝC}› */
- $"3CDC F9AD 167C 162B 4E6C 2110 DB2C DF34" /* <Üù­.|.+Nl!.Û,ß4 */
- $"AEED CCE4 05AC 4057 9829 B161 9CA0 8159" /* ®íÌä.¬@W˜)±aœ Y */
- $"A64F FD15 EC5A 4A51 CA6C FD10 9A25 4291" /* ¦Oý.ìZJQÊlý.š%B‘ */
- $"1E90 1FC2 3530 E0DB E4E6 232E CB64 AF95" /* ..Â50àÛäæ#.Ëd¯• */
- $"9494 656D D395 3D62 9EDA 2EC1 DB02 1FAA" /* ””emÓ•=bžÚ.ÁÛ..ª */
- $"6778 0FC0 C4A2 CCA8 EDC0 4DA8 F889 162F" /* gx.ÀĢ̨íÀM¨ø‰./ */
- $"03F9 A9C1 C635 1DAD 2E22 580B 0B2B 83E3" /* .ù©ÁÆ5.­."X..+ƒã */
- $"EC02 5552 3AA8 91BA 45AF 5439 4265 71F6" /* ì.UR:¨‘ºE¯T9Beqö */
- $"3E7A 4412 5DE5 1863 50E6 C0ED C470 3ED9" /* >zD.]å.cPæÀíÄp>Ù */
- $"0E3F 48BA 54C5 915E 03F0 D836 6429 2A67" /* .?HºTÅ‘^.ðØ6d)*g */
- $"B7FA 6AF9 069E 8E67 2848 B570 C3AC 7746" /* ·újù.žŽg(HµpìwF */
- $"EB48 0A2F 4BE4 8EB3 3F8F 791F 0646 DEDF" /* ëHÂ/K䎳?y..FÞß */
- $"316B EFDF 6FD8 C0B9 7319 CE94 8930 C6F6" /* 1kïßoØÀ¹s.Δ‰0Æö */
- $"6399 C4A9 79AD E967 4783 3F8D C538 3C15" /* c™Ä©y­égGƒ?Å8<. */
- $"E5B7 CE98 22B7 5333 A938 B26F 0E1E EF2E" /* å·Î˜"·S3©8²o..ï. */
- $"74B9 72EF 9D8A 80B7 FDC1 8334 A5F9 DCFB" /* t¹r·ýÁƒ4¥ùÜû */
- $"B891 BB38 373C 9BE8 59F4 6018 6E63 DA65" /* ¸‘»87<›èYô`.ncÚe */
- $"9B13 9DC8 28DB 3C15 0D2C 11FC 0E2D 7A0A" /* ›.È(Û<..,.ü.-z */
- $"F8FF 671F C3FF 7F8E 1210 C212 EA5A 5F0B" /* øÿg.Ãÿ.Ž..Â.êZ_. */
- $"9727 F770 25A5 236D 9789 75C7 4089 11DD" /* —'÷p%¥#m—‰uÇ@‰.Ý */
- $"E472 3865 B217 B946 CF22 5225 27DE 566D" /* är8e².¹FÏ"R%'ÞVm */
- $"6799 4F82 0D46 59F5 E466 F9E7 71C3 FA80" /* g™O‚.FYõäfùçqÃú€ */
- $"7826 E598 FF48 E181 6CA8 5A7E C354 0CAA" /* x&å˜ÿHál¨Z~ÃT.ª */
- $"B01C 9EC4 181F 849B 6A13 FB8D C477 70BD" /* °.žÄ..„›j.ûÄwp½ */
- $"F46B 278C 4467 B0CF 3E21 805E EF97 9696" /* ôk'ŒDg°Ï>!€^ï—–– */
- $"CBB9 E3F6 B62E DC26 001A 408F D7E2 07C3" /* ˹ãö¶.Ü&..@×â.à */
- $"C1A4 AD97 4235 8863 A088 1980 C505 6E1F" /* Á¤­—B5ˆc ˆ.€Å.n. */
- $"F392 0B24 B500 20DC 8295 5703 F9B9 FF70" /* ó’.$µ. Ü‚•W.ù¹ÿp */
- $"355C 9B8D BB49 898F 1AAB F65F 7D7E E28F" /* 5\›»I‰.«ö_}~â */
- $"4300 BDCC FB20 4F67 CA07 0CAE 3BAD AA36" /* C.½Ìû OgÊ..®;­ª6 */
- $"A4D8 3358 4176 1AD6 01FA 0450 0000 0042" /* ¤Ø3XAv.Ö.ú.P...B */
- $"7B49 E0E8 A7D8 4EA9 E1A5 597B DB80 BA6D" /* {Iàè§ØN©á¥Y{Û€ºm */
- $"8010 25EA 0A26 833F DE77 DBF7 78B9 564B" /* €.%êÂ&ƒ?ÞwÛ÷x¹VK */
- $"57B2 AF8C BC92 97D7 46A1 23C1 B595 A2EE" /* W²¯Œ¼’—×F¡#Áµ•¢î */
- $"F8A9 29FA 42C2 3557 6345 80B1 FCFD F322" /* ø©)úBÂ5WcE€±üýó" */
- $"E992 9262 A83F E43D B059 CB12 D425 FEF2" /* é’’b¨?ä=°YË.Ô%þò */
- $"9932 1BD8 C65C ED82 D05E E15C 5E9C 76B7" /* ™2.ØÆ\í‚Ð^á\^œv· */
- $"7C64 FCDB A247 D388 3CCB 86B5 C486 2261" /* |düÛ¢GÓˆ<ˆµÄ†"a */
- $"BFD1 7213 39C3 0D69 6AF0 2476 B711 7E91" /* ¿Ñr.9Ã.ijð$v·.~‘ */
- $"6B53 6A04 4F3C 2781 A090 3118 6C3F 49BA" /* kSj.O<' 1.l?Iº */
- $"B81A 3FEB D686 EFCE F487 8315 E33F 84DB" /* ¸.?ëÖ†ïÎô‡ƒ.ã?„Û */
- $"E2C9 F35F 28C5 10C4 FF7F FA4F E953 89FC" /* âÉó_(Å.Äÿ.úOéS‰ü */
- $"8B32 23C6 0D04 5E49 DADA F0FE BCA7 D2C9" /* ‹2#Æ..^IÚÚðþ¼§ÒÉ */
- $"5869 EAD4 F153 9BF5 A5EA 3298 CC8B 8721" /* XiêÔñS›õ¥ê2˜Ì‹‡! */
- $"F919 680B 3F8C 304A 2849 4970 41CF 0F60" /* ù.h.?Œ0J(IIpAÏ.` */
- $"76D9 5820 EF21 CD4A 205A 632F 7CC4 EFDF" /* vÙX ï!ÍJ Zc/|Äïß */
- $"33F3 CCA8 EDAF 405B 78E1 8F79 0F66 6573" /* 3ǫ́í¯@[xáy.fes */
- $"35A2 AD75 1E18 6018 AF23 7C9D A008 1A01" /* 5¢­u..`.¯#| ... */
- $"C5FE 69AA 2C8E D97E 244D D075 F213 0CC6" /* Åþiª,ŽÙ~$MÐuò..Æ */
- $"738F 4395 BBC0 5CB6 3ADC 3DA8 ACB8 E018" /* sC•»À\¶:Ü=¨¬¸à. */
- $"BA5B 13DB 0F6A CB18 DEAC 9749 F5B5 361D" /* º[.Û.jË.Þ¬—Iõµ6. */
- $"CF3A C107 9606 179F F4C7 F3DE CB0B 1F53" /* Ï:Á.–..ŸôÇóÞË..S */
- $"F27E 5D3C 11AB 66B4 8037 0644 AE98 19BF" /* ò~]<.«f´€7.D®˜.¿ */
- $"D564 973A 0CF2 C96F 56D4 5CB8 666F C68C" /* Õd—:.òÉoVÔ\¸foÆŒ */
- $"1E73 E515 8B33 75D2 D3B4 B3A3 8CDE DE0C" /* .så.‹3uÒÓ´³£ŒÞÞ. */
- $"DA37 A3DF 44D2 B57E 2DB2 E891 D36F CC23" /* Ú7£ßDÒµ~-²è‘ÓoÌ# */
- $"ADE8 45BC BB30 78D7 77BD D4A8 087F C83F" /* ­èE¼»0x×w½Ô¨..È? */
- $"E49A 6873 FAC4 C12B 0056 5E18 C3CB C2E9" /* äšhsúÄÁ+.V^.ÃËÂé */
- $"DCAE F0E8 A75F 18DD B8DD 1DCD B0F5 3A1C" /* Ü®ðè§_.ݸÝ.Í°õ:. */
- $"3816 51A8 0D93 00D0 6FF6 8F07 E4BE EDF9" /* 8.Q¨.“.Ðoö.ä¾íù */
- $"BF0E 6CAA 5384 5DF0 DF12 4CF4 E3B3 5D6C" /* ¿.lªS„]ðß.Lôã³]l */
- $"602A B6F1 C0E0 E520 B0D6 71FB 7996 4930" /* `*¶ñÀàå °Öqûy–I0 */
- $"23DD 3601 3653 C40D 1A64 DC2B D5C2 01C9" /* #Ý6.6SÄ..dÜ+ÕÂ.É */
- $"5002 6BBE 7338 81EE F87D 7687 0FE6 7CF9" /* P.k¾s8îø}v‡.æ|ù */
- $"BAB6 5B35 1A25 421C 5BBA 4D82 4E1F B1D4" /* º¶[5.%B.[ºM‚N.±Ô */
- $"1907 FF78 F534 4A16 7BB6 B598 51F6 E4D3" /* ..ÿxõ4J.{¶µ˜QöäÓ */
- $"A04B 1198 B926 CFAE FC03 22E3 8360 E696" /*  K.˜¹&Ï®ü."ãƒ`æ– */
- $"F546 62F9 7178 F327 E245 4520 8D17 41C4" /* õFbùqxó'âEE .AÄ */
- $"9EC6 EF8D 0924 9416 7901 CE87 5EBB 286D" /* žÆïÆ$”.y.·^»(m */
- $"53BF 09FA 41F6 5FBA 8F4C 79A8 75BA 277A" /* S¿ÆúAö_ºLy¨uº'z */
- $"7D42 642B 38EE 9A49 DEDB F1B3 80D0 E5D0" /* }Bd+8îšIÞÛñ³€ÐåÐ */
- $"2980 F797 E7D0 F90D 4B2F AFDD 4A69 3389" /* )€÷—çÐù.K/¯ÝJi3‰ */
- $"1418 EBD0 6DF0 E38D 6E2F D546 C1A8 C8DD" /* ..ëÐmðãn/ÕFÁ¨ÈÝ */
- $"8977 E053 9C26 053A CF69 97F9 7FB4 9000" /* ‰wàSœ&.:Ïi—ù.´. */
- $"0000 0115 0E67 B64C 0015 DD82 643D 6476" /* .....g¶L..Ý‚d=dv */
- $"ED28 6324 AD72 8124 1AF6 FB1B 21C9 0605" /* í(c$­r$.öû.!É.. */
- $"FAE6 04A6 31BF 6D67 FF7B B889 831A 4FFD" /* úæ.¦1¿mgÿ{¸‰ƒ.Oý */
- $"6BF5 F098 23AB A490 39F7 6AFC 3832 E2E1" /* kõð˜#«¤9÷jü82âá */
- $"11B2 ADB0 ECCA 83DE B4FF 3685 5106 75DE" /* .²­°ìʃ޴ÿ6…Q.uÞ */
- $"3047 28A0 EDBE AD29 17CD DA62 698B CE64" /* 0G( í¾­).ÍÚbi‹Îd */
- $"5999 2B8E BB7D C74F F009 A25D B2B5 BDD9" /* Y™+Ž»}ÇOðÆ¢]²µ½Ù */
- $"B852 BFFE 0B74 9C05 22D7 B0A3 2139 0979" /* ¸R¿þ.tœ."×°£!9Æy */
- $"5C29 BAE8 43DA F9E5 5383 AFD2 14EC 64AA" /* \)ºèCÚùåSƒ¯Ò.ìdª */
- $"442C CE71 74ED 5C27 4331 9374 AC77 47EE" /* D,Îqtí\'C1“t¬wGî */
- $"31AC 4C74 97BC 753C D5DC 3D8B F7D2 C612" /* 1¬Lt—¼u<ÕÜ=‹÷ÒÆ. */
- $"2399 F431 07A1 76CA DAE6 772B 309A C800" /* #™ô1.¡vÊÚæw+0šÈ. */
- $"9F2F D6DF A44C 48EB 853E 4140 A123 BCA3" /* Ÿ/ÖߤLHë…>A@¡#¼£ */
- $"D096 00DA 0822 DFB3 6887 B31F A18F 59BE" /* Ж.Ú."ß³h‡³.¡Y¾ */
- $"6B25 B5CF CFA3 8806 85B7 ED84 B20B CDA2" /* k%µÏÏ£ˆ.…·í„².Í¢ */
- $"A0C8 404B 3FFF 7FF3 3816 5BF0 A16B 85D0" /*  È@K?ÿ.ó8.[ð¡k…Ð */
- $"B87F E4BB 21F9 A3BB 9103 2944 434A 5789" /* ¸.ä»!ù£»‘.)DCJW‰ */
- $"E3EC B1E3 6F3E 154A 37E4 ACA6 4B02 6C5B" /* ãì±ão>.J7䬦K.l[ */
- $"D23A D4D4 83CE F291 CD7F 114F 5935 8EE0" /* Ò:ÔÔƒÎò‘Í..OY5Žà */
- $"17EA F0B3 1D93 BC5F 2CF8 511C E99F 21D8" /* .êð³.“¼_,øQ.éŸ!Ø */
- $"E286 EB17 6FC2 C34B 1110 6398 03BF CB08" /* â†ë.oÂÃK..c˜.¿Ë. */
- $"0018 4848 E24D 90A5 63F9 B1F8 6E20 EF6E" /* ..HHâM¥cù±øn ïn */
- $"25D5 858B 0AE4 2235 581B D4DA E01C B006" /* %Õ…‹Âä"5X.ÔÚà.°. */
- $"E5EB DE78 855B 19E7 4D80 DAC2 1E8F CB2B" /* åëÞx…[.çM€ÚÂ.Ë+ */
- $"0EC8 3FFF 7759 B569 0861 20CC 1D71 2121" /* .È?ÿwYµi.a Ì.q!! */
- $"71A7 FA20 B34B EAB3 4260 A827 6E91 2B3C" /* q§ú ³Kê³B`¨'n‘+< */
- $"5479 449A 3161 D24E 8489 C00A 18A6 3FEC" /* TyDš1aÒN„‰ÀÂ.¦?ì */
- $"61F2 4C86 23C1 85DB 6ECA 221D BCC2 C25F" /* aòL†#Á…ÛnÊ".¼ÂÂ_ */
- $"EFFF 7891 F475 0E20 DC0A 8F85 8208 4541" /* ïÿx‘ôu. ÜÂ…‚.EA */
- $"579B 5EE2 24C4 5C60 39B7 D9F1 ECFD 0F0C" /* W›^â$Ä\`9·Ùñìý.. */
- $"3719 72A8 A543 8BF5 94BF BF6C E6F7 E45A" /* 7.r¨¥C‹õ”¿¿læ÷äZ */
- $"C5CF 1FD7 32F5 2D70 041E 3641 2C46 E23D" /* ÅÏ.×2õ-p..6A,Fâ= */
- $"E072 6889 A892 A27F 44A8 564A 74A3 B421" /* àrh‰¨’¢.D¨VJt£´! */
- $"E1CC A0F3 50E2 2711 6919 76BE D84B D2FE" /* áÌ óPâ'.i.v¾ØKÒþ */
- $"AAED 2D64 7C8F 4C55 7FFF 7EFC 2CBF 05DE" /* ªí-d|LU.ÿ~ü,¿.Þ */
- $"25B2 001C 00EC 6D17 ED17 E559 9DFA F731" /* %²...ìm.í.åYú÷1 */
- $"B21A 7394 8B35 5948 BA4F 5858 020F FF7C" /* ².s”‹5YHºOXX..ÿ| */
- $"C89D 1CFA F89B 9F9C 841F 19EF D626 E6DE" /* È.úø›Ÿœ„..ïÖ&æÞ */
- $"DCC3 3148 38A0 C32F 898F BEC3 0AF3 318C" /* ÜÃ1H8 Ã/‰¾ÃÂó1Œ */
- $"5E09 119B 43C8 9FE6 73B2 F4B9 9789 4BFC" /* ^Æ.›CÈŸæs²ô¹—‰Kü */
- $"99A2 FF7F FF7A 4FD0 8C64 F459 410C 013C" /* ™¢ÿ.ÿzOÐŒdôYA..< */
- $"1C6C 85B5 1C8F D078 995D 714E 1C60 3090" /* .l…µ.Ðx™]qN.`0 */
- $"9058 77C4 BB80 5F57 1871 CA72 B2FD 0016" /* XwÄ»€_W.qÊr²ý.. */
- $"BAA7 F84F F4E9 ACDF F766 8CB4 475D 2F0B" /* º§øOôé¬ß÷fŒ´G]/. */
- $"37BC 18C8 6162 79C2 BDD7 8753 204B A536" /* 7¼.Èaby½ׇS K¥6 */
- $"9CBE 4972 316A BCB1 9442 4238 B88F 2F48" /* œ¾Ir1j¼±”BB8¸/H */
- $"7A45 5CD1 A306 3A23 5A78 354F CDB6 C0A5" /* zE\Ñ£.:#Zx5OͶÀ¥ */
- $"2A5C 19DA 0B0C CD84 8D85 D2B8 1DC9 059C" /* *\.Ú..Í„…Ò¸.É.œ */
- $"A8C4 8118 4848 9372 9372 566C 21E5 2665" /* ¨Ä.HH“r“rVl!å&e */
- $"D16C 6601 48A8 35CE 7FFF 7F19 B54E 7F04" /* Ñlf.H¨5Î.ÿ..µN.. */
- $"10EC 1AA3 13FF 4588 9722 A7AA B011 863C" /* .ì.£.ÿEˆ—"§ª°.†< */
- $"E4B1 717B 7C2D 21E6 267B 4B48 E790 FF76" /* ä±q{|-!æ&{KHçÿv */
- $"40CC F425 41CB 289F 809D 8170 A529 2EDA" /* @Ìô%AË(Ÿ€p¥).Ú */
- $"A105 B3AF FB44 7951 B87A 0091 5B53 5979" /* ¡.³¯ûDyQ¸z.‘[SYy */
- $"CDC6 5976 6393 34F2 21FF 7FFF 7FFF 7D43" /* ÍÆYvc“4ò!ÿ.ÿ.ÿ}C */
- $"4F4B C77F 73C7 0454 BE9C BE9C 282E 440E" /* OKÇ.sÇ.T¾œ¾œ(.D. */
- $"0608 A380 6121 2103 DBD2 250B 5D57 9159" /* ..£€a!!.ÛÒ%.]W‘Y */
- $"B69A 28CF E66A 154F F84F F4E9 99ED 48C4" /* ¶š(Ïæj.OøOôé™íHÄ */
- $"CA7E BE76 FC67 A7CD DC26 1C00 0184 8463" /* Ê~¾vüg§ÍÜ&...„„c */
- $"69A8 C0A9 127C 5830 CC3A 380A C742 E4DE" /* i¨À©.|X0Ì:8ÂÇBäÞ */
- $"06F5 7999 556D FD9F 268B 895F FF4B 7BB9" /* .õy™UmýŸ&‹‰_ÿK{¹ */
- $"C201 52B7 B483 0906 65EC 1848 4750 6F27" /* Â.R·´ƒÆ.eì.HGPo' */
- $"C86C 1F27 9108 6253 0416 4CD3 30E4 7F77" /* Èl.'‘.bS..LÓ0ä.w */
- $"0705 8420 83B6 BCB6 29DE B71E 8DC5 851A" /* ..„ ƒ¶¼¶)Þ·.Å…. */
- $"ABB0 83D8 F2E2 5113 55D2 AAF6 B3AB 7679" /* «°ƒØòâQ.UÒªö³«vy */
- $"49FE A1F8 6F30 0EC0 7D91 534C C78C DC5D" /* Iþ¡øo0.À}‘SLÇŒÜ] */
- $"5A42 CA06 37D8 E0ED 27FA 3E31 C849 D2BE" /* ZBÊ.7Øàí'ú>1ÈIÒ¾ */
- $"847C 0CCF 676F ACFE 91A3 0F62 B711 1897" /* „|.Ïgo¬þ‘£.b·..— */
- $"9DC3 8E37 3AF8 907E 0B69 1577 2856 AA36" /* ÃŽ7:ø~.i.w(Vª6 */
- $"FAC0 D56C 6686 0443 CA96 FDCD 051B 23A7" /* úÀÕlf†.CÊ–ýÍ..#§ */
- $"7DAC 8229 C5FC F840 103A 6407 49F7 6B32" /* }¬‚)Åüø@.:d.I÷k2 */
- $"254F 2B32 7FC1 F460 D5C0 5EE1 3046 612A" /* %O+2.Áô`ÕÀ^á0Fa* */
- $"1BC1 C143 7B76 B9EF ECCB 5EE9 8F0C 3F71" /* .ÁÁC{v¹ïìË^é.?q */
- $"E805 8B9B 17B7 9ECE C237 AF5C 0062 E61E" /* è.‹›.·žÎÂ7¯\.bæ. */
- $"DF6C C1F7 904E 4379 2A9C 92FC 1B04 00A8" /* ßlÁ÷NCy*œ’ü...¨ */
- $"F9D5 DB1B C4C6 9485 ABC2 1199 CCF2 0A47" /* ùÕÛ.ÄÆ”…«Â.™ÌòÂG */
- $"9693 C097 7AD0 449A FC53 DEC5 6EE8 6BF7" /* –“À—zÐDšüSÞÅnèk÷ */
- $"0D7D 4ED8 3426 DA7E ECF9 57ED 9252 9A6A" /* .}NØ4&Ú~ìùWí’Ršj */
- $"2B94 2614 1B6E A495 8261 4D5E DAEF 03FA" /* +”&..n¤•‚aM^Úï.ú */
- $"8A63 9496 E8AB A1A6 5B5C B03E E73E 2889" /* Šc”–è«¡¦[\°>ç>(‰ */
- $"D257 6C28 080A 68DC 226C 950F F55B E7CC" /* ÒWl(.ÂhÜ"l•.õ[çÌ */
- $"95AD FDA7 43EA 7489 A545 C0FC E9B0 2A25" /* •­ý§Cêt‰¥EÀüé°*% */
- $"719C EE06 9E5A 8FC0 D3B0 0C81 1EB0 C8C6" /* qœî.žZÀÓ°..°ÈÆ */
- $"25BD B383 33BD B80D D9A9 48F3 7539 D7D5" /* %½³ƒ3½¸.Ù©Hóu9×Õ */
- $"8021 5EBA 94A7 83A3 69FE 8179 9106 BC56" /* €!^º”§ƒ£iþy‘.¼V */
- $"14A4 427B 8C09 BACB 2FC9 B8F3 CAFA E51C" /* .¤B{ŒÆºË/ɸóÊúå. */
- $"9C07 9A69 033C 6159 163E 6ED8 259D 7AAB" /* œ.ši.<aY.>nØ%z« */
- $"D316 475C F6C7 BD0E 7972 4C59 DF3A D5B4" /* Ó.G\öǽ.yrLYß:Õ´ */
- $"44ED 7D01 B0FB 34D4 4C9C BC2D B8A6 5B65" /* Dí}.°û4ÔLœ¼-¸¦[e */
- $"134F 0C96 5CA1 21CC A249 F17D 4660 9835" /* .O.–\¡!Ì¢Iñ}F`˜5 */
- $"957C 7392 53A9 DE42 E650 604B 10E2 FF12" /* •|s’S©ÞBæP`K.âÿ. */
- $"B47A 044A 524A B8D3 60B5 A258 CEAB 55E8" /* ´z.JRJ¸Ó`µ¢XΫUè */
- $"5219 EC3E A9F6 0813 A2B4 930C EDE4 3BBE" /* R.ì>©ö..¢´“.íä;¾ */
- $"C0E3 7F93 1A3F 38EB 2DE3 492D A3BD FD00" /* Àã.“.?8ë-ãI-£½ý. */
- $"811C 530E 2FB8 9D68 2466 D288 EC29 9094" /* .S./¸h$fÒˆì)” */
- $"A3C7 2D32 0A25 BA73 2023 08CA C360 2C72" /* £Ç-2Â%ºs #.ÊÃ`,r */
- $"8BA9 516A 7081 F2FF 1E84 E1C2 F841 77CE" /* ‹©Qjpòÿ.„áÂøAwÎ */
- $"ABDF 6476 30A4 3018 F7F4 F3EE 1A5E 5DF0" /* «ßdv0¤0.÷ôóî.^]ð */
- $"CAAA AA77 C90D 52C4 6AA9 5755 33B9 1814" /* ʪªwÉ.RÄj©WU3¹.. */
- $"3528 E205 C379 648A E627 A23E D5DB 1CAE" /* 5(â.ÃydŠæ'¢>ÕÛ.® */
- $"4868 B7D4 F381 2534 1F48 2BCC 5211 3B0F" /* Hh·Ôó%4.H+ÌR.;. */
- $"9692 B002 4CFB 1F83 3628 D1EB 5416 0648" /* –’°.Lû.ƒ6(ÑëT..H */
- $"F0F0 B0F8 C7C7 6E92 8C54 6859 791B 7890" /* ðð°øÇÇn’ŒThYy.x */
- $"EBA3 BC74 5F3F C4AD 7C9D 6954 2D0C 15BF" /* 룼t_?Ä­|iT-..¿ */
- $"F699 82A6 4170 D2F1 02A5 7EF3 6061 C9CF" /* ö™‚¦ApÒñ.¥~ó`aÉÏ */
- $"C370 E129 F805 8CC8 C670 CBDC 2D44 D349" /* Ãpá)ø.ŒÈÆpËÜ-DÓI */
- $"F3E5 C5F9 357E 3DF2 CDF3 DC8A 1F13 5B2D" /* óåÅù5~=òÍóÜŠ..[- */
- $"C544 448D 1038 8293 4EEA 75A4 0738 7D9F" /* ÅDD.8‚“Nêu¤.8}Ÿ */
- $"C002 3D68 26D8 7B06 FB10 CCDF C4F3 5364" /* À.=h&Ø{.û.ÌßÄóSd */
- $"2342 154B F8FB 01ED 8893 9160 A3A0 B81D" /* #B.Køû.툓‘`£ ¸. */
- $"47A0 6C82 1CBA FAED 931D E025 BDFF 1535" /* G l‚.ºúí“.à%½ÿ.5 */
- $"CADF 68C5 41FD 3896 1AC9 F979 A885 F5AE" /* ÊßhÅAý8–.Éùy¨…õ® */
- $"EFBE C674 ED92 5FE9 E9AF FF52 D573 A6DD" /* ï¾Ætí’_éé¯ÿRÕs¦Ý */
- $"631B 27E4 62CB B76E 7020 EC65 75E2 DB6F" /* c.'äbË·np ìeuâÛo */
- $"0E10 980A 0EA3 2287 4CF8 D402 52B8 1491" /* ..˜Â.£"‡LøÔ.R¸.‘ */
- $"21C9 BC2B 48BC CBD4 464A C539 6CD5 28F1" /* !ɼ+H¼ËÔFJÅ9lÕ(ñ */
- $"CAE4 CA43 9CB8 B181 BF06 522B 4D19 8295" /* ÊäÊCœ¸±¿.R+M.‚• */
- $"05C8 D7CD 8CFA D3E7 7BC9 630C DCDD 7C7E" /* .È×ÍŒúÓç{Éc.ÜÝ|~ */
- $"E4C6 D7DC 5E38 67CC 5934 9E8D 9552 B837" /* äÆ×Ü^8gÌY4ž•R¸7 */
- $"53AE 6D39 FAB1 2EB6 886C 1855 26ED AD08" /* S®m9ú±.¶ˆl.U&í­. */
- $"1EBE 9570 EA2F DFFF 06F4 ABF3 4534 2831" /* .¾•pê/ßÿ.ô«óE4(1 */
- $"1AE2 0A99 2956 2A90 C2A4 58AC E49E F047" /* .â™)V*¤X¬äžðG */
- $"A9BA C394 E8F4 6427 7966 A79C 4269 9ADD" /* ©ºÃ”èôd'yf§œBišÝ */
- $"AD1D 1A7E 375C D3FB 8C25 0B6B 0460 5EB9" /* ­..~7\ÓûŒ%.k.`^¹ */
- $"416C AE82 DFC3 09DA 1F69 8796 6897 8CD0" /* Al®‚ßÃÆÚ.i‡–h—ŒÐ */
- $"3E1B FF7D 9AE9 7F6D 4E84 967C 674F CA41" /* >.ÿ}šé.mN„–|gOÊA */
- $"44C1 0575 93A9 2599 66D0 AB7B 6260 D32C" /* DÁ.u“©%™fЫ{b`Ó, */
- $"94AF 7FC8 82FD F692 92FE B6ED A660 750F" /* ”¯.È‚ýö’’þ¶í¦`u. */
- $"80A2 A8AA E6F6 7B9F E894 ED71 D223 6F4B" /* €¢¨ªæö{Ÿè”íqÒ#oK */
- $"A203 F64C 7560 DBB1 6F9E EE9F 2945 C994" /* ¢.öLu`Û±ožîŸ)EÉ” */
- $"BA00 D3D1 6414 A300 4296 670B 2350 CDD1" /* º.ÓÑd.£.B–g.#PÍÑ */
- $"DF61 29E8 EC17 87B6 BC62 B6BD 5F31 13B2" /* ßa)èì.‡¶¼b¶½_1.² */
- $"48A2 F723 53C7 6955 969B ED83 6A9B 1B06" /* H¢÷#SÇiU–›íƒj›.. */
- $"C7D0 2584 430B 8C52 D00A 736B D6FB AEDB" /* ÇÐ%„C.ŒRÐÂskÖû®Û */
- $"2BA1 5095 759B 0AFF 5138 58EF 3DC2 B14D" /* +¡P•u›ÂÿQ8Xï=±M */
- $"3B7D 62D0 DE12 CFEF 17A3 32C4 C79A C2DA" /* ;}bÐÞ.Ïï.£2ÄÇšÂÚ */
- $"6BA1 6478 B1D3 2278 3787 6C30 08FD 6095" /* k¡dx±Ó"x7‡l0.ý`• */
- $"FF65 1DF4 7606 34C3 B4EE E609 A3BF 7085" /* ÿe.ôv.4ôîæÆ£¿p… */
- $"8B3B 2C80 D860 6043 10A4 24B1 2D80 880D" /* ‹;,€Ø``C.¤$±-€ˆ. */
- $"671A 9A76 E1D4 2304 B4E0 9E47 129D 6316" /* g.šváÔ#.´àžG.c. */
- $"33DF C88C 3BB6 5232 475C D19D FA9B 3303" /* 3ßÈŒ;¶R2G\Ñú›3. */
- $"2956 D8B1 08A5 2735 CD4D F130 C700 DA0D" /* )Vر.¥'5ÍMñ0Ç.Ú. */
- $"7BAE 21FA FB1B 35A5 957E 0211 955B 25D0" /* {®!úû.5¥•~..•[%Ð */
- $"A3DD B72F 5BCD 8792 418E BCB6 C727 DD0F" /* £Ý·/[͇’AŽ¼¶Ç'Ý. */
- $"2D42 F031 2A73 C1F9 7964 B937 1E77 A757" /* -Bð1*sÁùyd¹7.w§W */
- $"D158 CB02 80D3 C310 E1C5 709C 5C69 7F04" /* ÑXË.€ÓÃ.áÅpœ\i.. */
- $"4476 F017 3FF2 B891 0160 D681 AEBC F8C9" /* Dvð.?ò¸‘.`Ö®¼øÉ */
- $"8F46 7922 4414 5CEE 0CA8 417B 33BB 5926" /* Fy"D.\î.¨A{3»Y& */
- $"B7A6 7094 6363 C5F2 9AD7 1751 2456 3B83" /* ·¦p”ccÅòš×.Q$V;ƒ */
- $"9BB0 0ECD 1420 6141 A097 DBF4 802A 2377" /* ›°.Í. aA —Ûô€*#w */
- $"CDAC EFE9 4A16 4B3C 5058 A5DC 1C40 169E" /* ͬïéJ.K<PX¥Ü.@.ž */
- $"3999 F0C2 C418 2E8F 0951 664A 7082 F49F" /* 9™ðÂÄ..ÆQfJp‚ôŸ */
- $"E576 B2B1 5918 E3EE 9B97 1686 6499 A572" /* åv²±Y.ãî›—.†d™¥r */
- $"B1F6 2F39 A798 6292 DE22 007B 60AD 1D94" /* ±ö/9§˜b’Þ".{`­.” */
- $"31BA 068D F15A 06DB 2654 6B52 F692 3C3A" /* 1º.ñZ.Û&TkRö’<: */
- $"0DA8 A74B 30F6 3852 76F0 A897 9086 FBD5" /* .¨§K0ö8Rv𨗆ûÕ */
- $"1C78 047E 7BF2 08EE 7B45 85C5 6ED5 AA43" /* .x.~{ò.î{E…ÅnÕªC */
- $"F423 8A4E 4111 C68E 172E DD87 AF9E BF19" /* ô#ŠNA.ÆŽ..݇¯ž¿. */
- $"D4D2 020C 6FD5 EE3F F0E8 289E 4E6C 0871" /* ÔÒ..oÕî?ðè(žNl.q */
- $"1187 D3F1 E458 94F5 4519 BF3C D239 D86C" /* .‡ÓñäX”õE.¿<Ò9Øl */
- $"17F1 8916 4206 2346 ACD8 1F08 9A44 0AB3" /* .ñ‰.B.#F¬Ø..šD³ */
- $"CEE6 441D 78D5 2909 4CEA 46F7 D6C6 D21A" /* ÎæD.xÕ)ÆLêF÷ÖÆÒ. */
- $"6D41 BB64 ADFF 6252 5A80 3556 C459 2845" /* mA»d­ÿbRZ€5VÄY(E */
- $"C05D C2C5 1F69 4087 0380 C0FF 61AA D5D1" /* À]ÂÅ.i@‡.€ÀÿaªÕÑ */
- $"E5C2 5FC0 CEF4 2D59 B4A3 6BA8 343E 184B" /* åÂ_ÀÎô-Y´£k¨4>.K */
- $"89CE 81FD AC96 C691 FDE5 F993 B9CB 6302" /* ‰Îý¬–Æ‘ýåù“¹Ëc. */
- $"B8EE 86B4 A2F7 19EA DAFD D511 B59F BBD2" /* ¸î†´¢÷.êÚýÕ.µŸ»Ò */
- $"5D4E F6A3 BC58 51D5 273F 2E2E 2B6A 2755" /* ]Nö£¼XQÕ'?..+j'U */
- $"38A3 CA29 BFAB D31D CD53 B29C 7418 40DB" /* 8£Ê)¿«Ó.ÍS²œt.@Û */
- $"FD56 1BF6 9350 5411 CF5C 8D26 B1FA 754F" /* ýV.ö“PT.Ï\&±úuO */
- $"E584 8277 6221 6866 257C 9FC9 65A5 6D93" /* å„‚wb!hf%|ŸÉe¥m“ */
- $"C524 B971 3F1D 34A0 BBF4 6B83 9722 CFAD" /* Å$¹q?.4 »ôkƒ—"Ï­ */
- $"8296 103F 53BB 1B22 8A84 2FAC 94DE 4994" /* ‚–.?S»."Š„/¬”ÞI” */
- $"2D31 56A5 DBCD B661 81D7 B360 4958 8FF5" /* -1V¥ÛͶa׳`IXõ */
- $"EB02 25A9 6386 8241 D936 A3CB AA88 9936" /* ë.%©c†‚AÙ6£Ëªˆ™6 */
- $"1698 4F59 765B 34EA 3741 D2D3 2DAC 854D" /* .˜OYv[4ê7AÒÓ-¬…M */
- $"366B C9A0 15F8 D2E6 7CCF 99EF A794 460C" /* 6kÉ .øÒæ|ϙ倫F. */
- $"934E C88B 2BF5 91F7 7BD1 3DC9 6ED3 91FE" /* “NÈ‹+õ‘÷{Ñ=ÉnÓ‘þ */
- $"E63B EDCC 3D4A CC1B AE5D 88D0 B241 20D1" /* æ;íÌ=JÌ.®]ˆÐ²A Ñ */
- $"AB6C 9FE2 E494 395E 8E3C 0EB0 1796 58CC" /* «lŸâä”9^Ž<.°.–XÌ */
- $"9791 D931 DB33 473E 003E 10CD B736 7295" /* —‘Ù1Û3G>.>.Í·6r• */
- $"DD81 B481 9A0A ED27 3C1E 6298 FD0D BDE0" /* Ý´šÂí'<.b˜ý.½à */
- $"11D6 8A21 79C1 DBB7 FEDC 6E48 8080 5ADB" /* .ÖŠ!yÁÛ·þÜnH€€ZÛ */
- $"E61D 9E0E E6A3 6D38 A028 4016 464D F534" /* æ.ž.æ£m8 (@.FMõ4 */
- $"D764 3AD7 55DF 3CAB 7B3D 12F5 9A8D DDCF" /* ×d:×Uß<«{=.õšÝÏ */
- $"6CCD 0387 C982 0FE9 D431 0FE3 E064 1700" /* lÍ.‡É‚.éÔ1.ãàd.. */
- $"1AAD F49E D6DE A939 8010 C91B 605B 4E0A" /* .­ôžÖÞ©9€.É.`[NÂ */
- $"FCBE ADE9 C17A EC1F 3990 9EB2 E6BF 92AA" /* ü¾­éÁzì.9ž²æ¿’ª */
- $"951C D27F A984 10A9 22DC 996E FF6E 12AE" /* •.Ò.©„.©"Ü™nÿn.® */
- $"DC03 5AB3 2CA0 8291 4174 C69E AE28 DBA8" /* Ü.Z³, ‚‘AtÆž®(Û¨ */
- $"38A8 FF12 67D3 F8A3 00D6 2A2E A564 CEFA" /* 8¨ÿ.gÓø£.Ö*.¥dÎú */
- $"0F00 4B44 62A7 CA9F F072 2821 DD3C 6A34" /* ..KDb§ÊŸðr(!Ý<j4 */
- $"926C 8F3C 1548 D31A 021F 2604 252D A929" /* ’l<.HÓ...&.%-©) */
- $"172B 8212 174F 2D2D CC7D DA15 F9A9 AD7E" /* .+‚..O--Ì}Ú.ù©­~ */
- $"59D3 7885 9215 C77B 6583 4D8F 3308 149C" /* YÓx…’.Ç{eƒM3..œ */
- $"270A 4508 21C9 A05B CDE9 BEF1 C18A 4B74" /* 'ÂE.!É [Íé¾ñÁŠKt */
- $"F07B 0DFE 007B E5AF D9AA CED7 8661 34C7" /* ð{.þ.{å¯ÙªÎ׆a4Ç */
- $"AA26 21AC D09C 6BAA EABB A7C4 486E 40A5" /* ª&!¬Ðœkªê»§ÄHn@¥ */
- $"C791 976A 1EC3 534F 84EC E6E9 7363 FF08" /* Ç‘—j.ÃSO„ìæéscÿ. */
- $"5B20 0E29 000C 5E8F 3339 6210 65CC FD34" /* [ .)..^39b.eÌý4 */
- $"76EB F1B2 76C6 5FDC C1A8 B0F5 53EE 103C" /* vëñ²vÆ_ÜÁ¨°õSî.< */
- $"50B0 650F 8459 9777 E890 E28A BB84 56B9" /* P°e.„Y—wè⊻„V¹ */
- $"0522 90F9 5B81 C982 979E E507 A4BC 26C3" /* ."ù[É‚—žå.¤¼&à */
- $"E356 F2A9 C0D1 BFF3 F882 EC0E 6AA9 CA0D" /* ãVò©ÀÑ¿óø‚ì.j©Ê. */
- $"4419 16FB 9BEF 947E F848 19BF 5CB6 EA4E" /* D..û›ï”~øH.¿\¶êN */
- $"C290 F254 020B 51DB 8094 4D05 E9A5 21A0" /* ÂòT..QÛ€”M.é¥!  */
- $"D3E6 84EA 5A3E 4380 650C B24F 31DA 209F" /* Óæ„êZ>C€e.²O1Ú Ÿ */
- $"F51A 9108 7912 32B0 52A6 A901 CADB A758" /* õ.‘.y.2°R¦©.ÊÛ§X */
- $"C00A D516 E462 35B4 C071 131A 0F01 9A95" /* ÀÂÕ.äb5´Àq....š• */
- $"9739 F131 0E5F 7FBA D8AD 925F 992C 0187" /* —9ñ1._.ºØ­’_™,.‡ */
- $"D97C 832B 847E 1148 0402 0449 FB25 D0F1" /* Ù|ƒ+„~.H...Iû%Ðñ */
- $"C1F8 2B8E CE97 D5A4 BEFE 7F0D E420 E43E" /* Áø+ŽÎ—Õ¤¾þ..ä ä> */
- $"801A 448D 9D61 D23C 5956 3DEB A1A6 0858" /* €.DaÒ<YV=롦.X */
- $"CD98 F32B 92E6 D960 C0E1 E542 294D 6FD3" /* ͘ó+’æÙ`ÀáåB)MoÓ */
- $"4234 37C9 3537 275F AC1E 936D 534A BF02" /* B47É57'_¬.“mSJ¿. */
- $"B742 8CAB BE88 E4FF 23DC D9EB 1FC4 9CF0" /* ·BŒ«¾ˆäÿ#ÜÙë.Äœð */
- $"C5D1 3F1D 5995 AD68 12E9 71B3 2100 AFB7" /* ÅÑ?.Y•­h.éq³!.¯· */
- $"CBF7 9ADB D5FF 48EE B1A2 AE4D E021 7C07" /* Ë÷šÛÕÿHî±¢®Mà!|. */
- $"5AD5 E94C A965 DFE8 B32A 23AB DE05 4FB1" /* ZÕéL©eßè³*#«Þ.O± */
- $"FDB7 ECC5 3611 73D9 B03C 399A D5F6 663D" /* ý·ìÅ6.sÙ°<9šÕöf= */
- $"0E78 0BEE 67D9 2F9D 0072 E938 509C 9779" /* .x.îgÙ/.ré8Pœ—y */
- $"6C64 03A1 B8C9 C1C0 2256 29EA 112C FB1C" /* ld.¡¸ÉÁÀ"V)ê.,û. */
- $"766C DF51 83B1 388F 902E EE03 337E 689A" /* vlßQƒ±8.î.3~hš */
- $"CA5A A9F0 09AF 3422 4115 D489 3FBD 22C1" /* ÊZ©ðƯ4"A.Ô‰?½"Á */
- $"4A4F 642A 0AC8 D01C 2950 18CA D441 780A" /* JOd*ÂÈÐ.)P.ÊÔAx */
- $"C929 A7FF 0AFA 956A A581 B590 9B7A 7D74" /* É)§ÿÂú•j¥µ›z}t */
- $"2084 3DC1 5D81 B12B DF9C 333D EFAD 0ADD" /* „=Á]±+ßœ3=ï­ÂÝ */
- $"3445 4F8C 132E F02F C2E7 E13F BE12 2F84" /* 4EOŒ..ð/Âçá?¾./„ */
- $"7FC3 D55F 876A BE1D 07F2 688D 774C FC3E" /* .ÃÕ_‡j¾..òhwLü> */
- $"A177 C3EA 4FE4 AFFE 1BFF 61D3 2F87 4BFC" /* ¡wÃêOä¯þ.ÿaÓ/‡Kü */
- $"946E 03F8 6CFF 06A3 FC28 FE13 BF0F 6B7E" /* ”n.ølÿ.£ü(þ.¿.k~ */
- $"1EB8 FC3B 47E1 ECEE EEDF F87D 51FF 07D5" /* .¸ü;Gáìîîßø}Qÿ.Õ */
- $"0BBB 87E1 D3FF 0779 FC3B 6FE1 D378 0DF0" /* .»‡áÓÿ.yü;oáÓx.ð */
- $"BD7C 29EB A2DD 17F2 6ADB E1DB 7F0D 97E1" /* ½|)ë¢Ý.òjÛáÛ..—á */
- $"E84D 7750 FC3E 906F C3E8 35DD 42ED AFE1" /* èMwPü>oÃè5ÝBí¯á */
- $"D33F 0E8D F86E 00F7 91DD 3D8B A94D D83C" /* Ó?.øn.÷‘Ý=‹©MØ< */
- $"B51B 129C 103F 899D B929 4724 C188 2C29" /* µ..œ.?‰¹)G$Áˆ,) */
- $"CE89 11F8 9065 1C37 E234 DFEF 60D7 3221" /* Ή.øe.7â4ßï`×2! */
- $"5343 F889 DCDB AFB3 6F20 F76A 31D9 986E" /* SCø‰ÜÛ¯³o ÷j1Ù˜n */
- $"A745 547E 6F18 076D A675 BA1A 1AAF 6558" /* §ET~o..m¦uº..¯eX */
- $"338A FF71 4707 0776 1B62 BCCC 89E5 4726" /* 3ŠÿqG..v.b¼Ì‰åG& */
- $"A7CB 8885 E07C DADC D741 3B1D D81F AB03" /* §Ëˆ…à|ÚÜ×A;.Ø.«. */
- $"2F84 F52D DFD5 7384 4649 7BA2 5AB1 14C8" /* /„õ-ßÕs„FI{¢Z±.È */
- $"3D8D B951 8183 C33A B08E 82CC EF1A F046" /* =¹QƒÃ:°Ž‚Ìï.ðF */
- $"5B62 C9E0 A926 F330 0A61 A30C 6194 7E1E" /* [bÉà©&ó0Âa£.a”~. */
- $"1EE9 3D0D 1ABE 5536 A026 8B32 830F C02F" /* .é=..¾U6 &‹2ƒ.À/ */
- $"3041 04B7 2C65 024D AC81 D2CC 03CA A08A" /* 0A.·,e.M¬ÒÌ.Ê Š */
- $"B105 F3F1 C365 6BCE 9876 A867 7DBA 63AF" /* ±.óñÃekΘv¨g}ºc¯ */
- $"0973 495F DCC1 3552 54BA 5BDB 618D C6C0" /* ÆsI_ÜÁ5RTº[ÛaÆÀ */
- $"91B8 4489 141B A7D3 F188 8A97 DAB0 8942" /* ‘¸D‰..§ÓñˆŠ—Ú°‰B */
- $"EA67 F235 E18A 871B 4B0C DAC6 9050 BA9C" /* êgò5ኇ.K.ÚÆPºœ */
- $"C432 95CE 13CA 93ED 4FD5 9495 377D C920" /* Ä2•Î.Ê“íOÕ”•7}É */
- $"C8A2 F997 5348 8890 91D5 0A23 50BF 3C37" /* È¢ù—SHˆ‘ÕÂ#P¿<7 */
- $"8372 7C96 32AA 1CD2 46BE 8220 C983 2A71" /* ƒr|–2ª.ÒF¾‚ Ƀ*q */
- $"7961 BF33 9590 C086 CCE9 578B 322E FB50" /* ya¿3•À†ÌéW‹2.ûP */
- $"CB68 6459 C127 EB9B E974 EF02 59F4 FF4D" /* ËhdYÁ'ë›étï.YôÿM */
- $"4525 1874 6A9F 99EB DFCC C1B1 72EA 9FA0" /* E%.tjŸ™ëßÌÁ±r꟠ */
- $"DE00 BBB9 D95F 36B9 406E 3CE0 3BCF 32B6" /* Þ.»¹Ù_6¹@n<à;Ï2¶ */
- $"8DC0 55D6 C6DA 3622 8A6E 63F6 28AE 08AC" /* ÀUÖÆÚ6"Šncö(®.¬ */
- $"03AC 288D 069A 750E CBBD 97D9 E42D BA93" /* .¬(.šu.˽—Ùä-º“ */
- $"E82A 4EB3 C008 CC7C B6A7 6F70 F1BC FDAA" /* è*N³À.Ì|¶§opñ¼ýª */
- $"1DF4 D2E4 3ECB 9702 444E 278F 6B50 F00E" /* .ôÒä>Ë—.DN'kPð. */
- $"C228 C132 E5E0 B4DE 93BF DBBD 2C85 ABF9" /* Â(Á2åà´Þ“¿Û½,…«ù */
- $"7FAD EC28 1D40 D390 5A2F 9B14 D348 8C76" /* .­ì(.@ÓZ/›.ÓHŒv */
- $"C04B 1173 BF19 8F50 7E3D 8311 BB79 FDA8" /* ÀK.s¿.P~=ƒ.»yý¨ */
- $"1FD4 24A9 5F59 8B76 709E 5C84 1902 8690" /* .Ô$©_Y‹vpž\„..† */
- $"AD49 334F 5AE8 E376 288C BDE7 EE13 FBDE" /* ­I3OZèãv(Œ½çî.ûÞ */
- $"7606 0135 6DB2 DCD9 F5B3 E7E2 B2B8 8BE1" /* v..5m²ÜÙõ³çⲸ‹á */
- $"1985 85D2 0EC1 5CCD BC74 D88B 7206 5075" /* .……Ò.Á\ͼtØ‹r.Pu */
- $"FB92 BF92 C5CB B6E3 024D EB71 D909 AF79" /* û’¿’Å˶ã.MëqÙƯy */
- $"DD82 BBF2 37F1 1193 74D0 373D 4043 C292" /* Ý‚»ò7ñ.“tÐ7=@CÂ’ */
- $"0B1D 4E8F 04F4 A035 451A 7DCB 02DB D77E" /* ..N.ô 5E.}Ë.Û×~ */
- $"DD1C 3667 1BA7 2584 C128 3835 4454 5C15" /* Ý.6g.§%„Á(85DT\. */
- $"5846 C7D1 4689 3D2A 1172 9BA8 9830 F037" /* XFÇÑF‰=*.r›¨˜0ð7 */
- $"0053 8FD6 4023 68C6 7122 CAC6 0325 5AF3" /* .SÖ@#hÆq"ÊÆ.%Zó */
- $"E104 A423 C5AE F551 6DF6 7B11 D5EB FD34" /* á.¤#Å®õQmö{.Õëý4 */
- $"DF67 C50C 737D 74D5 D5EC 7027 A2D8 C79A" /* ßgÅ.s}tÕÕìp'¢ØÇš */
- $"200D A972 A30A 509A C3DE 483F 8B53 D69C" /* .©r£ÂPšÃÞH?‹SÖœ */
- $"001F 47E9 BD2C 84EC DB83 B493 0326 DE6E" /* ..Gé½,„ìÛƒ´“.&Þn */
- $"336A 7C76 3225 8351 7B2D 37B5 D645 9866" /* 3j|v2%ƒQ{-7µÖE˜f */
- $"019E 6472 40C4 5853 3376 9D90 D3EA A727" /* .ždr@ÄXS3vÓê§' */
- $"07A1 A4B8 A32F 475A 22A2 059C AB5B F13E" /* .¡¤¸£/GZ"¢.œ«[ñ> */
- $"E2DF 5B3E E6B5 B27F 28AF A15F 400C 7D9F" /* âß[>æµ².(¯¡_@.}Ÿ */
- $"43ED 33D4 9B4D CB64 E550 5FED FC2F E485" /* Cí3Ô›MËdåP_íü/ä… */
- $"271E 2DB1 6AE5 6793 EFE8 FCC5 A784 4C95" /* '.-±jåg“ïèüŧ„L• */
- $"E488 B5AC A528 BACB 10FF 4ABD D554 E56B" /* 䈵¬¥(ºË.ÿJ½ÕTåk */
- $"F72E 8ED7 5E48 60A4 82D0 381F A2D4 625C" /* ÷.Ž×^H`¤‚Ð8.¢Ôb\ */
- $"9F80 2A63 5FD3 DD0C EDA8 3DE3 281E A65C" /* Ÿ€*c_ÓÝ.í¨=ã(.¦\ */
- $"88EA 1A96 626D DC03 79BE C4ED EA60 4FC5" /* ˆê.–bmÜ.y¾Äíê`OÅ */
- $"BB10 D9D5 99AF 0534 65C2 05AE 8D23 82B0" /* ».ÙÕ™¯.4eÂ.®#‚° */
- $"6FB7 881A 7BC5 0316 7A28 4B27 2763 A6C3" /* o·ˆ.{Å..z(K''c¦Ã */
- $"8FC7 073A 1391 81BB 707F 625D 355F B1DF" /* Ç.:.‘»p.b]5_±ß */
- $"A749 C3EE A157 EC1F 0F6C 70AB 1A36 5711" /* §IÃî¡Wì..lp«.6W. */
- $"C49B 1CA8 54A0 0FB9 6A2E 0F86 2E57 BC2F" /* Ä›.¨T .¹j..†.W¼/ */
- $"8CDD B76A F6DB 83F9 EEFF 4BF1 DE60 660E" /* ŒÝ·jöÛƒùîÿKñÞ`f. */
- $"BCBA 7D68 D5DE 8663 DF06 3F65 A981 38D7" /* ¼º}hÕÞ†cß.?e©8× */
- $"CC20 EBAE 6143 C79E D2F3 DCF4 FA0F 433E" /* Ì ë®aCÇžÒóÜôú.C> */
- $"6DFE 4C5F 032A F6DD DD11 F85F 5003 22CD" /* mþL_.*öÝÝ.ø_P."Í */
- $"C07E F1CC 40B9 8D61 825D 77C7 91A6 BD49" /* À~ñÌ@¹a‚]wÇ‘¦½I */
- $"2590 4BCD EB13 37A2 D5FA 2931 F311 9028" /* %KÍë.7¢Õú)1ó.( */
- $"6C02 96FC ACF5 1EA4 8E51 4BC9 FDE8 DFEF" /* l.–ü¬õ.¤ŽQKÉýèßï */
- $"C5A0 8082 7E0D C127 3A80 A65B 7989 CCEE" /* Å €‚~.Á':€¦[y‰Ìî */
- $"6F6A 8DDF FB5B 46A5 3757 7FC3 3EFD BC0A" /* ojßû[F¥7W.Ã>ý¼Â */
- $"8567 1CB0 3BE7 A153 D7CE 8F63 D2DC 8840" /* …g.°;ç¡S×ÎcÒ܈@ */
- $"D993 E028 0E86 AA99 3ADE CC55 A789 CFC8" /* Ù“à(.†ª™:ÞÌU§‰ÏÈ */
- $"D92B 9613 3850 B7B3 467A FA09 7D45 E174" /* Ù+–.8P·³FzúÆ}Eát */
- $"D351 3254 64A3 7FC5 0D8D 1EDB FEC9 3F05" /* ÓQ2Td£.Å..ÛþÉ?. */
- $"C3C2 264B ACB8 F3C3 1BFF 04A5 12CF C191" /* ÃÂ&K¬¸óÃ.ÿ.¥.ÏÁ‘ */
- $"8CA0 5985 E34C E583 A230 CD43 8602 BAAF" /* Œ Y…ãL僢0ÍC†.º¯ */
- $"1475 FCA7 B274 1314 051F AF06 089D 13B1" /* .uü§²t....¯...± */
- $"5C06 815E FAA5 6864 CECE D56A 127C 058B" /* \.^ú¥hdÎÎÕj.|.‹ */
- $"1859 E9E8 7A98 4299 3CFF 70CE C2DD 8676" /* .Yéèz˜B™<ÿpÎÂ݆v */
- $"1798 5F8E 9960 922E 9226 3F9B 5657 890F" /* .˜_Ž™`’.’&?›VW‰. */
- $"75BC FECF 6919 6701 D086 0EA5 26BA 8B78" /* u¼þÏi.g.І.¥&º‹x */
- $"7381 41FC 19AD 7201 BFD9 B3D3 2F00 1A1C" /* sAü.­r.¿Ù³Ó/... */
- $"E689 F3BC 5FC7 0418 66A2 5AEE 0374 DE30" /* æ‰ó¼_Ç..f¢Zî.tÞ0 */
- $"DC4B 70F1 ACC6 2BC6 06E9 461F E71B CD5E" /* ÜKpñ¬Æ+Æ.éF.ç.Í^ */
- $"2766 D533 884B A37F 7820 5CCA 3D60 1C3A" /* 'fÕ3ˆK£.x \Ê=`.: */
- $"8865 509F C1F0 86B6 9A91 0A52 426E CF1D" /* ˆePŸÁð†¶š‘ÂRBnÏ. */
- $"4B52 7AFE 9519 ECDB 9DD3 BFA1 80F7 50BD" /* KRzþ•.ìÛÓ¿¡€÷P½ */
- $"D2DD 6FAB F00D 3600 9104 37AC 81AA F9C3" /* ÒÝo«ð.6.‘.7¬ªùà */
- $"3933 A702 AC9C 42F1 4579 C5F2 CD99 165F" /* 93§.¬œBñEyÅòÍ™._ */
- $"2D84 FE8B D02C 055F F99C 1729 45C7 6B56" /* -„þ‹Ð,._ùœ.)EÇkV */
- $"EE73 818A 9940 BB46 1408 639B 9779 C805" /* îsŠ™@»F..c›—yÈ. */
- $"1B0B CC86 D42E E9BB 046D 0E93 7273 E00F" /* ..̆Ô.é».m.“rsà. */
- $"B7D5 D377 E0ED 2494 4623 5BDF C83C 54A5" /* ·ÕÓwàí$”F#[ßÈ<T¥ */
- $"6B6B D343 F20E AD4C B45C 2BF4 7C65 87A1" /* kkÓCò.­L´\+ô|e‡¡ */
- $"E2EA E2B7 FF17 F9A1 5606 D5A7 C113 F062" /* âêâ·ÿ.ù¡V.Õ§Á.ðb */
- $"D50E E647 922C 8746 7CBA 99C8 4400 979D" /* Õ.æG’,‡F|º™ÈD.— */
- $"3D09 19E7 3A84 E245 ED1F 1C14 3967 45CE" /* =Æ.ç:„âEí...9gEÎ */
- $"2B06 C383 F2A6 2CEE 02E6 A2A7 1821 0F3F" /* +.Ãò¦,î.梧.!.? */
- $"4057 F9E9 B830 94C7 65AA C396 6F97 2721" /* @Wùé¸0”ÇeªÃ–o—'! */
- $"F1AC 6AF7 6C6C 3F02 D2F1 343D 8B42 0F6F" /* ñ¬j÷ll?.Òñ4=‹B.o */
- $"E2D4 A7D8 7158 F033 C573 AD72 01B7 1CC7" /* âÔ§ØqXð3Ås­r.·.Ç */
- $"4CA6 78C2 BABD BB30 5E03 BDEE DF19 8240" /* L¦xº½»0^.½îß.‚@ */
- $"9521 A43A B142 2F42 3590 AD8C B9FD A409" /* •!¤:±B/B5­Œ¹ý¤Æ */
- $"9D77 38E7 B8F8 3BCD 4478 61C3 5768 0324" /* w8ç¸ø;ÍDxaÃWh.$ */
- $"4E55 4240 1E87 1F93 D0BA 6929 C235 7E76" /* NUB@.‡.“кi)Â5~v */
- $"F6E8 AA1B AF13 15FD EB95 2609 BE7D BFE8" /* öèª.¯..ýë•&ƾ}¿è */
- $"3E51 8F2E 4780 4EE6 891E F83D FF7D D1C3" /* >Q.G€Næ‰.ø=ÿ}Ñà */
- $"818F 28A2 2AC0 AD00 7F03 5781 2882 A44A" /* (¢*À­...W(‚¤J */
- $"6728 D9F6 E77F A883 C794 71AC 55E9 8112" /* g(Ùöç.¨ƒÇ”q¬Ué. */
- $"BF6F ECDA 9BD1 96B8 79AA A397 A6F2 C93F" /* ¿oìڛі¸yª£—¦òÉ? */
- $"3792 B8C4 8667 AAF4 659D 59F6 E77F A870" /* 7’¸Ä†gªôeYöç.¨p */
- $"24F1 5461 DB69 0F4C F8B3 F02A F6E7 7FA6" /* $ñTaÛi.Lø³ð*öç.¦ */
- $"26C9 5EDE 9BB6 A1C6 9467 854A 5327 BA38" /* &É^Þ›¶¡Æ”g…JS'º8 */
- $"F535 A01A B90A 9580 95A0 FE5C A623 DE0D" /* õ5 .¹Â•€• þ\¦#Þ. */
- $"6C3E BF23 66F2 9312 9490 EB88 1D63 7AF4" /* l>¿#fò“.”ëˆ.czô */
- $"9F5B 7F45 9078 3A5F CC36 7702 EAD5 FA4D" /* Ÿ[.Ex:_Ì6w.êÕúM */
- $"5F9D 258B 14A8 A235 6490 6B7D 2B05 42C3" /* _%‹.¨¢5dk}+.Bà */
- $"2A5A 791E 92C3 B1E8 B323 FF74 81FC B063" /* *Zy.’ñè³#ÿtü°c */
- $"4A31 CBBC 91E2 A64A F935 FE79 4C07 1376" /* J1˼‘â¦Jù5þyL..v */
- $"002A 4795 5221 70B2 005C 41F9 D631 126F" /* .*G•R!p².\AùÖ1.o */
- $"FF7F DF03 06BD 7214 71AB 4EF3 8EEA 0261" /* ÿ.ß..½r.q«NóŽê.a */
- $"D054 C087 EA15 CBD2 4645 2F9F 3600 4144" /* ÐTÀ‡ê.ËÒFE/Ÿ6.AD */
- $"5671 C61E D3CB 8B84 A60D B58E FB69 C71F" /* VqÆ.ÓË‹„¦.µŽûiÇ. */
- $"B09A EDD9 AAC0 6FBA D7FE 8C4D 8262 6C73" /* °šíÙªÀoº×þŒM‚bls */
- $"9F69 0E81 7581 1D52 FB27 C979 1597 69EA" /* Ÿi.u.Rû'Éy.—iê */
- $"F1DF E906 0B77 2E21 D31A 5CCD 9474 95A2" /* ñßé..w.!Ó.\Í”t•¢ */
- $"CB48 AB27 5F53 B82F 1638 16A4 87CD ED1F" /* ËH«'_S¸/.8.¤‡Íí. */
- $"20BC 2894 5EE1 C84C 1AC1 1158 0293 024E" /* ¼(”^áÈL.Á.X.“.N */
- $"1023 0E4F 9BD8 FA73 6E62 FF7F FD08 5797" /* .#.O›Øúsnbÿ.ý.W— */
- $"0788 A951 6DDA 2448 21D2 7FCA 20B4 E1BF" /* .ˆ©QmÚ$H!Ò.Ê ´á¿ */
- $"3262 89C7 5386 ACB1 8B89 6AC3 F907 1355" /* 2b‰ÇS†¬±‹‰jÃù..U */
- $"66D9 1E5A 5B54 19E9 2737 FF7C B8DF 1F5E" /* fÙ.Z[T.é'7ÿ|¸ß.^ */
- $"3592 B16D 6089 DE73 8F19 479D 626B 977D" /* 5’±m`‰Þs.Gbk—} */
- $"185E F7A3 AF62 AD92 E5AC 2F74 B991 F96F" /* .^÷£¯b­’å¬/t¹‘ùo */
- $"211F 5AE0 4C27 344F A9E1 C731 DB20 A0FF" /* !.ZàL'4O©áÇ1Û  ÿ */
- $"7FFF 7F2E 356F CC55 C6B8 C2C9 2AEF 2D31" /* .ÿ..5oÌUƸÂÉ*ï-1 */
- $"EFEB D878 C16F B1B1 3D47 240C 489C 7153" /* ïëØxÁo±±=G$.HœqS */
- $"E5F8 A5C8 6E2C 7650 AED0 C4B7 43EA 67B6" /* åø¥Èn,vP®ÐÄ·Cêg¶ */
- $"94E4 7274 CFEB 4CF3 FD3E 8065 B9CC 35A5" /* ”ärtÏëLóý>€e¹Ì5¥ */
- $"21B1 3804 AD98 4F8A 6FFC 50DA 014C 442B" /* !±8.­˜OŠoüPÚ.LD+ */
- $"AA41 1455 BD94 B366 A37D CA82 7FFC DE57" /* ªA.U½”³f£}Ê‚.üÞW */
- $"2EA9 98C2 5510 E51E 24CC 0428 4C83 1BBE" /* .©˜ÂU.å.$Ì.(Lƒ.¾ */
- $"0A46 A6DD 6963 D4CB 24E8 748B ED10 7B6D" /* ÂF¦ÝicÔË$èt‹í.{m */
- $"E61C 86C3 C80E 3030 FCE9 2263 C956 95A1" /* æ.†ÃÈ.00üé"cÉV•¡ */
- $"AED0 C4B1 D07C F701 9DA0 ED2C C401 BC1A" /* ®ÐıÐ|÷. í,Ä.¼. */
- $"9421 2D43 EF12 7494 8D46 CB82 3FE2 6439" /* ”!-Cï.t”FË‚?âd9 */
- $"6BDE C8CE 23B7 9D2E B6F9 DF4B C1A9 A145" /* kÞÈÎ#·.¶ùßKÁ©¡E */
- $"1512 85E6 30E6 98D1 AC22 EEBC 459C D841" /* ..…æ0æ˜Ñ¬"î¼EœØA */
- $"0A0F 1F31 2F75 7937 220F 7271 FE79 44A6" /* Â..1/uy7".rqþyD¦ */
- $"777E 1645 E0BA D980 0FFF 7D9F EC83 A930" /* w~.EàºÙ€.ÿ}Ÿìƒ©0 */
- $"D12B 216D 4D3F 4AD0 5EE9 DBC7 53D7 0A21" /* Ñ+!mM?JÐ^éÛÇS×Â! */
- $"2372 C608 6701 8AFA 8E33 4125 2B7E 38DA" /* #rÆ.g.ŠúŽ3A%+~8Ú */
- $"5990 99EE B1D0 B07C 9F9D 97DD D658 2C2A" /* Y™î±Ð°|Ÿ—ÝÖX,* */
- $"C7D6 4556 2AA7 297F ACBE 4802 B472 E76F" /* ÇÖEV*§).¬¾H.´rço */
- $"644F 2F11 17FF 7F9D CE1C 2989 7199 03B1" /* dO/..ÿ.Î.)‰q™.± */
- $"E719 2B3B 1131 C4CC 808B BC7A 26A4 479F" /* ç.+;.1ÄÌ€‹¼z&¤GŸ */
- $"4824 6486 E338 DB65 A502 454C C415 B8D0" /* H$d†ã8Ûe¥.ELÄ.¸Ð */
- $"7C77 7323 E381 5958 F415 95B9 142E 85F8" /* |ws#ãYXô.•¹..…ø */
- $"1742 E22F FF17 567B A195 DFF1 7EE0 8E40" /* .Bâ/ÿ.V{¡•ßñ~àŽ@ */
- $"431A B629 DDCE AED1 A925 9FCD 56B5 7945" /* C.¶)Ýήѩ%ŸÍVµyE */
- $"B8B9 77DF 732C CD1E 8137 2645 1135 9593" /* ¸¹wßs,Í.7&E.5•“ */
- $"E31C 333B 30E2 518D E202 A1E0 FEA6 C40E" /* ã.3;0âQâ.¡àþ¦Ä. */
- $"BB50 0174 C21D 0BFB 34C1 1A8D 8E5D FF77" /* »P.tÂ..û4Á.Ž]ÿw */
- $"909A 8111 3123 8200 AFC2 0525 13A1 C383" /* š.1#‚.¯Â.%.¡Ãƒ */
- $"5472 BA45 8D58 8818 E5CD 6FEA D858 47C5" /* TrºEXˆ.åÍoêØXGÅ */
- $"F5A0 7773 3C86 1CE8 9A67 FAA7 5726 643B" /* õ ws<†.èšgú§W&d; */
- $"1BF8 C2C1 E7AD D3CE E89B 97C4 0210 1FAE" /* .øÂÁç­ÓÎè›—Ä...® */
- $"9319 1F1F 7F89 0B76 5918 7EF8 9947 CF44" /* “....‰.vY.~ø™GÏD */
- $"6B5C 4B5D 5067 58A7 F35E CF39 7D01 C555" /* k\K]PgX§ó^Ï9}.ÅU */
- $"FCD3 E0F6 C1A4 9C8A 0B34 2D33 A20D F664" /* üÓàöÁ¤œŠ.4-3¢.öd */
- $"C174 CCE8 CAA1 C45F 2974 101B 86E7 68FD" /* ÁtÌèÊ¡Ä_)t..†çhý */
- $"D6FE 8FE9 AC95 5D3D DE38 1829 E3B9 37FE" /* Öþ鬕]=Þ8.)ã¹7þ */
- $"5008 F383 21C4 4D57 AE92 9F94 A9BB 3A76" /* P.óƒ!ÄMW®’Ÿ”©»:v */
- $"705F 8D2D 889C EB93 FD2B 05C5 89F2 500E" /* p_-ˆœë“ý+.ʼnòP. */
- $"4220 A486 F348 D466 4D62 E368 540A 1D25" /* B ¤†óHÔfMbãhTÂ.% */
- $"AF7C A9EF 43CC E423 16FC 6EE5 C407 DDAE" /* ¯|©ïCÌä#.ünåÄ.Ý® */
- $"EB28 23D2 3FDE 40EF 2ED1 D53A B87B 9C40" /* ë(#Ò?Þ@ï.ÑÕ:¸{œ@ */
- $"80A2 77EF CC8F D34E C33F 7BB4 4748 E4A6" /* €¢wïÌÓNÃ?{´GHä¦ */
- $"B177 05FF 085F CBF9 F1A0 8CA7 4200 32AC" /* ±w.ÿ._Ëùñ Œ§B.2¬ */
- $"7B87 A517 EA04 C96C F9A3 C6ED 5FFF 7FED" /* {‡¥.ê.Élù£Æí_ÿ.í */
- $"D5EB F835 3E15 6882 AED1 72BF B42C 87DE" /* Õëø5>.h‚®Ñr¿´,‡Þ */
- $"8111 0F7A 5DA6 CFEA 79A7 9174 89E8 E637" /* ..z]¦Ïêy§‘t‰èæ7 */
- $"7E56 B53E 9987 2013 8F1A 06A5 07A2 1856" /* ~Vµ>™‡ ...¥.¢.V */
- $"FE30 E259 128A 968B 881F E88D 8566 98D7" /* þ0âY.Š–‹ˆ.è…f˜× */
- $"C815 C397 64E8 9FAC 059A 5922 C863 F220" /* È.×d蟬.šY"Ècò */
- $"EC2A 4AF8 5DB2 A77D FC6A 3AC1 357E D5CC" /* ì*Jø]²§}üj:Á5~ÕÌ */
- $"142B 85B0 FEE0 2579 D845 CDFD F507 4C58" /* .+…°þà%yØEÍýõ.LX */
- $"D86A F299 0BBC A0A8 39A4 03D9 2144 6B3E" /* Øjò™.¼ ¨9¤.Ù!Dk> */
- $"6D67 242B 0FEB B6F4 79CB 58ED 2338 DB9F" /* mg$+.ë¶ôyËXí#8ÛŸ */
- $"6EC7 1626 0FDD 0C77 1E00 2AE4 8B46 F39C" /* nÇ.&.Ý.w..*ä‹Fóœ */
- $"6268 EE5F FF49 B5C8 30E7 9859 E163 A9D4" /* bhî_ÿIµÈ0ç˜Yác©Ô */
- $"C50F BC0C 46BB BBC7 9FFF 7D54 E81B 8936" /* Å.¼.F»»ÇŸÿ}Tè.‰6 */
- $"A032 72E8 6576 5FEA 9A3F A5A9 9E58 B9C2" /*  2rèev_êš?¥©žX¹Â */
- $"A089 A039 5695 766F 3295 A1FF 7F5F FBDB" /*  ‰ 9V•vo2•¡ÿ._ûÛ */
- $"A3FD 1F1F 76AD 6787 B4D0 D1A5 E4EA 72F8" /* £ý..v­g‡´ÐÑ¥äêrø */
- $"0276 0C35 EC34 65A8 000A CA35 6AAE 1800" /* .v.5ì4e¨.ÂÊ5j®.. */
- $"99CA 1B65 F56D 6C3B DF33 AB08 94A3 15CF" /* ™Ê.eõml;ß3«.”£.Ï */
- $"C9B8 D32E 35D7 D32D 57E6 86D2 A5BE 2B3A" /* ɸÓ.5×Ó-Wæ†Ò¥¾+: */
- $"4535 2C10 41FE FDA9 E202 3927 BC4F 5F90" /* E5,.Aþý©â.9'¼O_ */
- $"E637 311C DB00 E394 09F3 005B 7DB3 0DFE" /* æ71.Û.ã”Æó.[}³.þ */
- $"9F1F CAA4 DD03 B381 8330 AB38 E13B 2F9C" /* Ÿ.ʤÝ.³ƒ0«8á;/œ */
- $"3DB5 01C5 100A 5D16 5C8D 792C FA0E 1A85" /* =µ.Å.Â].\y,ú..… */
- $"E3FF 467A 6333 E4F1 F27C 9E2B 161E 18F0" /* ãÿFzc3äñò|ž+...ð */
- $"3F30 9C2C 631D BE74 4B7F 6E21 3FBC 404E" /* ?0œ,c.¾tK.n!?¼@N */
- $"E063 4152 D02D 68E4 869C E7E9 E4E6 4E95" /* àcARÐ-h䆜çéäæN• */
- $"3A66 1FDA 1145 DFB4 0796 9F97 503C E2C9" /* :f.Ú.Eß´.–Ÿ—P<âÉ */
- $"7F49 D644 1290 98BD 8EA0 2FA1 CF00 E383" /* .IÖD.˜½Ž /¡Ï.ム*/
- $"C003 7BFE D79B FF62 A38E 2C39 A64D 19FF" /* À.{þ×›ÿb£Ž,9¦M.ÿ */
- $"6A9D 976A 994B 6626 4F4D 7DC8 F0CA EDB7" /* j—j™Kf&OM}ÈðÊí· */
- $"F99E 21E2 36B4 3AAB E787 C6A2 1783 F623" /* ùž!â6´:«ç‡Æ¢.ƒö# */
- $"8755 1F66 AFBC 2959 6E6E 2E61 AC85 2198" /* ‡U.f¯¼)Ynn.a¬…!˜ */
- $"9978 EDFD 334C F0D6 7F76 9AF2 47AF 5E4B" /* ™xíý3LðÖ.všòG¯^K */
- $"805C 54D3 5F2A 16C5 6675 C288 B44F F851" /* €\TÓ_*.Åfuˆ´OøQ */
- $"1CE9 9F21 BF10 92B9 2366 5D69 AE8E 9989" /* .éŸ!¿.’¹#f]i®Ž™‰ */
- $"36A6 F9E6 75A7 0D47 C8B5 8727 0138 2BFA" /* 6¦ùæu§.Gȵ‡'.8+ú */
- $"5C4A 649C 123C 225E 2CEC 2007 5016 3F11" /* \Jdœ.<"^,ì .P.?. */
- $"B8FF 60CB 7150 EBFD DFED 147E 0A98 E096" /* ¸ÿ`ËqPëýßí.~Â˜à– */
- $"6B76 3AF0 39A5 5BF2 880C E857 174C 8735" /* kv:ð9¥[òˆ.èW.L‡5 */
- $"ACF6 E4B7 3477 6293 FF7C 8515 A8DE 4E73" /* ¬öä·4wb“ÿ|….¨ÞNs */
- $"8E37 8A0C 4384 0CF3 FA01 15F5 9639 ED05" /* Ž7Š.C„.óú..õ–9í. */
- $"C86B 28A0 C331 14BC 2817 FE9B F96A D60D" /* Èk( Ã1.¼(.þ›ùjÖ. */
- $"EBCB 14DA FF7F FF47 8A61 A2C7 F01F 10B7" /* ëË.Úÿ.ÿGŠa¢Çð..· */
- $"3DAF B01C B484 F55D 457E E3EC CC41 95DE" /* =¯°.´„õ]E~ãìÌA•Þ */
- $"097E 8117 F77F FEFB A490 8B96 1300 2B37" /* Æ~.÷.þû¤‹–..+7 */
- $"19FA E04C 4188 E9F6 8950 0668 B082 8FD8" /* .úàLAˆéö‰P.h°‚Ø */
- $"0B7D 6C32 4DBF F84F F4E9 ACAF 719A DC43" /* .}l2M¿øOô鬯qšÜC */
- $"9F8D A53E DF1A BDB0 AAA7 3267 9C2D 357A" /* Ÿ¥>ß.½°ª§2gœ-5z */
- $"9CA7 1AE1 59C4 F467 83D3 308B 004A 42C2" /* œ§.áYÄôgƒÓ0‹.JB */
- $"909B F979 41CE AB25 C6D1 9FE9 46E1 E837" /* ›ùyAΫ%ÆÑŸéFáè7 */
- $"7ADF FF72 225E 4472 D323 F55C BE19 1E50" /* zßÿr"^DrÓ#õ\¾..P */
- $"BF94 6787 CADB F576 300A 054B 0A2D E9B2" /* ¿”g‡ÊÛõv0Â.KÂ-é² */
- $"5C15 DB84 E735 F76D 5477 D8A7 28AF FF7A" /* \.Û„ç5÷mTwا(¯ÿz */
- $"7EB8 06F8 4FF4 E999 ED48 02C4 F111 F61D" /* ~¸.øOôé™íH.Äñ.ö. */
- $"8A6C 1CC6 AE54 94E4 8C5D 7655 4ECC 205F" /* Šl.Æ®T”äŒ]vUNÌ _ */
- $"DBF9 1BA7 83CC 52E9 E9C9 52A4 1151 7DE4" /* Ûù.§ƒÌRééÉR¤.Q}ä */
- $"051B E140 3FC0 D60B 0C11 663F 98A9 8B53" /* ..á@?ÀÖ...f?˜©‹S */
- $"776E BD8D 7678 AD62 ACEE 033F D134 B61E" /* wn½vx­b¬î.?Ñ4¶. */
- $"F86D 3384 AAE7 9074 F7CF 4509 F9B3 4F30" /* øm3„ªçt÷ÏEÆù³O0 */
- $"F32D 840F 1DDA E6B1 BDD4 951F 2379 F890" /* ó-„..Úæ±½Ô•.#yø */
- $"530A E915 A228 D3D8 B188 C692 2767 D628" /* SÂé.¢(ÓرˆÆ’'gÖ( */
- $"12F8 3FFA BA23 F76B 1D92 1FC1 EA73 30FC" /* .ø?úº#÷k.’.Áês0ü */
- $"CE72 0CA5 6695 6326 F93B B52F B9D4 F6F0" /* Îr.¥f•c&ù;µ/¹Ôöð */
- $"FF07 727B 80F9 EBFC 2176 788C 333F 4137" /* ÿ.r{€ùëü!vxŒ3?A7 */
- $"E82C D066 6088 A8EA 168F 40EA F1EE BDE8" /* è,Ðf`ˆ¨ê.@êñî½è */
- $"C023 75BA 66F2 335A 98C0 31A8 2137 7A7B" /* À#uºfò3Z˜À1¨!7z{ */
- $"DA0F 3962 D4B3 3E6E A5A1 3A19 5EED 48A7" /* Ú.9bÔ³>n¥¡:.^íH§ */
- $"7617 DE46 D178 BC48 D85D 7821 DFEC B30D" /* v.ÞFÑx¼HØ]x!ßì³. */
- $"F84F B7CD 80ED 55C7 9E1A F58D 7085 F625" /* øO·Í€íUÇž.õp…ö% */
- $"F564 3BF5 A09E B353 4E45 2F0B FC02 ECFD" /* õd;õ ž³SNE/.ü.ìý */
- $"539F 529C A652 34F1 C0CC BC04 FCE0 2C7D" /* SŸRœ¦R4ñÀ̼.üà,} */
- $"A8A9 9E67 79E9 ADE4 ABEE BFF6 4793 1B91" /* ¨©žgyé­ä«î¿öG“.‘ */
- $"413A 4302 7FB5 190C CB09 0DC9 3B33 E18D" /* A:C..µ..ËÆ.É;3á */
- $"DDAB 23C5 FABA 5DC1 554F C940 B964 7F6A" /* Ý«#Åúº]ÁUOÉ@¹d.j */
- $"A781 2032 BF9E 0262 7C99 CD96 9251 9FB6" /* § 2¿ž.b|™Í–’QŸ¶ */
- $"1C69 9141 7A13 3022 DE48 DA68 C959 A0B5" /* .i‘Az.0"ÞHÚhÉY µ */
- $"0F3A F19A 9301 5051 5855 9D7B 5173 EE47" /* .:ñš“.PQXU{QsîG */
- $"2B0D DB30 28CC 5E41 46F1 E79F 90B3 AB2A" /* +.Û0(Ì^AFñ石«* */
- $"CAEA 6128 10E1 2CC0 DDC2 EBF1 26F1 E1DC" /* Êêa(.á,ÀÝÂëñ&ñáÜ */
- $"EB87 87ED 55F3 827C A066 D932 FCF7 B134" /* 뇇íUó‚| fÙ2ü÷±4 */
- $"8BC9 CC70 B38C B019 8372 EA60 7C36 4D38" /* ‹ÉÌp³Œ°.ƒrê`|6M8 */
- $"F82F 16C2 2390 A91B 203A 8EBE D0EC E278" /* ø/.Â#©. :Ž¾Ðìâx */
- $"7AC4 8493 A217 6AC3 B85A 470D D74A B91D" /* zÄ„“¢.jøZG.×J¹. */
- $"0180 7BAB 4088 5671 6268 5B4A 54FE C179" /* .€{«@ˆVqbh[JTþÁy */
- $"1600 7677 830B 0E81 EEB2 6124 33F8 DBBD" /* ..vwƒ..î²a$3øÛ½ */
- $"1B35 D1F9 0568 3891 0ECB A836 5A86 9636" /* .5Ñù.h8‘.˨6Z†–6 */
- $"9F87 052F 0D66 8AA3 3362 1651 9B33 9057" /* Ÿ‡./.fŠ£3b.Q›3W */
- $"5B98 05EB 23CE 099F 2358 444E 0D64 A9F9" /* [˜.ë#ÎÆŸ#XDN.d©ù */
- $"A569 7D56 A50D 6256 69AF BDD9 7847 D651" /* ¥i}V¥.bVi¯½ÙxGÖQ */
- $"73E2 F76E F277 58DC BFB9 7B8E 593C 0E97" /* sâ÷nòwXÜ¿¹{ŽY<.— */
- $"3C4E 507D FA6C 7984 FAC8 6C42 6882 78AC" /* <NP}úly„úÈlBh‚x¬ */
- $"E40D B7A2 4E43 998B 1C29 D7C6 B7BA 58C9" /* ä.·¢NC™‹.)×Æ·ºXÉ */
- $"3503 114B 86B8 CB5D B605 832D 98FE 0257" /* 5..K†¸Ë]¶.ƒ-˜þ.W */
- $"FB50 8CA0 43D4 71BE E330 1584 5983 668F" /* ûPŒ CÔq¾ã0.„Yƒf */
- $"735C 2448 3B30 82E4 1932 5BF8 129F FE38" /* s\$H;0‚ä.2[ø.Ÿþ8 */
- $"749D 01ED DAFC 95B9 375D BBCB 60D9 FC58" /* t.íÚü•¹7]»Ë`ÙüX */
- $"0796 AEFC 2337 F89E 01F5 48BD 0BAF A61F" /* .–®ü#7øž.õH½.¯¦. */
- $"3EC4 C092 DC6A 584C AAAF 1A9F A20F CEA4" /* >ÄÀ’ÜjXLª¯.Ÿ¢.Τ */
- $"884B 2DB6 09F4 F51B 546F CD71 F4D3 6452" /* ˆK-¶Æôõ.ToÍqôÓdR */
- $"B6E5 3EFF 66F8 0D60 D916 F755 1348 E250" /* ¶å>ÿfø.`Ù.÷U.HâP */
- $"D8E2 6858 B424 B84B D59A 6885 24D3 D845" /* ØâhX´$¸KÕšh…$ÓØE */
- $"692F 4313 B616 584F 7419 0661 0064 C281" /* i/C.¶.XOt..a.d */
- $"A873 131C 5296 042B 1FD5 3EED BFC2 659E" /* ¨s..R–.+.Õ>í¿Âež */
- $"C4C7 2720 8002 28DD 141A BBE7 99F8 028F" /* ÄÇ' €.(Ý..»ç™ø. */
- $"8262 0577 5240 EB9A F866 2901 B75B 3FED" /* ‚b.wR@ëšøf).·[?í */
- $"9E78 9071 83FD 02BC FCDE 2135 42D1 F184" /* žxqƒý.¼üÞ!5BÑñ„ */
- $"309D F47E DF10 F797 4268 120A D377 04A4" /* 0ô~ß.÷—Bh.ÂÓw.¤ */
- $"2998 099E CA35 66AD FB20 8C14 1E0E 714E" /* )˜ÆžÊ5f­û Œ...qN */
- $"B9A7 70EE 5BA0 7A18 FC16 97EB 1A98 CB6C" /* ¹§pî[ z.ü.—ë.˜Ël */
- $"4B5D AC5B 3DC2 2062 E74A 18F2 0A76 6085" /* K]¬[=Â bçJ.òÂv`… */
- $"EF50 1C2F FE23 117A ED22 7BE8 0231 BC71" /* ïP./þ#.zí"{è.1¼q */
- $"707C 6736 BC3C 38AA 81C2 66B6 DCE5 13E9" /* p|g6¼<8ªÂf¶Üå.é */
- $"3076 C7AD 8C4B A962 C37E 4605 CDC0 8247" /* 0vÇ­ŒK©bÃ~F.ÍÀ‚G */
- $"190C 41CD 6923 8D00 BC94 5B5F E2AB 443B" /* ..AÍi#.¼”[_â«D; */
- $"3C5A 7FF6 213C 9E2D 9224 70B1 EA9B 7D36" /* <Z.ö!<ž-’$p±ê›}6 */
- $"E7EA 0D03 CB32 7413 AB26 CB30 1B56 CBDE" /* çê..Ë2t.«&Ë0.VËÞ */
- $"3C31 361D 24E2 F441 4D78 7825 1DA0 0C14" /* <16.$âôAMxx%. .. */
- $"5C84 B112 6FC1 77DB 42CA 7791 960B 9F09" /* \„±.oÁwÛBÊw‘–.ŸÆ */
- $"980A 5629 54C0 EC82 889A B0E3 38F4 E734" /* ˜ÂV)TÀ삈š°ã8ôç4 */
- $"FA91 D5CD 2C8F 43CD 5629 3DAD 81DA 5E0A" /* ú‘ÕÍ,CÍV)=­Ú^Â */
- $"C008 712F EAD3 2486 4CD2 C7BA 0FA9 BBD3" /* À.q/êÓ$†LÒǺ.©»Ó */
- $"6AC2 A912 7736 5A33 CC96 9EDC 9C5A 3084" /* j©.w6Z3Ì–žÜœZ0„ */
- $"C826 A3FB 0661 ED4B 9689 A921 22AB 2399" /* È&£û.aíK–‰©!"«#™ */
- $"6F2A 4A78 A5F8 A059 BE4B 7DFF 5D41 1A31" /* o*Jx¥ø Y¾K}ÿ]A.1 */
- $"E688 045C BD1E D1DB 7C5B 6B89 5C22 3CAF" /* æˆ.\½.ÑÛ|[k‰\"<¯ */
- $"F133 FF14 13A2 9A3F 6E42 54EB 5082 9F25" /* ñ3ÿ..¢š?nBTëP‚Ÿ% */
- $"7C07 6BA6 25EA A890 3560 E915 B058 CB68" /* |.k¦%ê¨5`é.°XËh */
- $"3601 4B07 ACE7 EC8A 2897 F908 D405 455E" /* 6.K.¬çìŠ(—ù.Ô.E^ */
- $"5EDD 427E 791A EA3D 6ACE 3BC0 0D43 731A" /* ^ÝB~y.ê=jÎ;À.Cs. */
- $"C9C6 8C03 BD83 6F85 EF75 7246 2F8E 1CFB" /* ÉÆŒ.½ƒo…ïurF/Ž.û */
- $"8DC9 2726 593F 1D87 A822 399F 9770 324C" /* É'&Y?.‡¨"9Ÿ—p2L */
- $"6ABF 38B9 E89E B2F5 D575 E7DB C449 63CF" /* j¿8¹èž²õÕuçÛÄIcÏ */
- $"EBE1 07BB 80A4 C099 6A15 9A47 96F3 8C8D" /* ëá.»€¤À™j.šG–óŒ */
- $"49E1 1F78 2119 9460 CA7A F257 EDA1 104B" /* Iá.x!.”`ÊzòWí¡.K */
- $"5C68 0E57 188C 62B0 FBE3 CF4F 5251 6525" /* \h.W.Œb°ûãÏORQe% */
- $"CB59 5E3D C6F4 6B04 5B2D 1ED2 3BE1 02BB" /* ËY^=Æôk.[-.Ò;á.» */
- $"7207 12AA BFEC 50F4 83FE 2797 121B 3D14" /* r..ª¿ìPôƒþ'—..=. */
- $"DA23 BE41 D647 E5CA DD2D CD48 8C4D A094" /* Ú#¾AÖGåÊÝ-ÍHŒM ” */
- $"B1A9 4ED5 4735 8818 C4F1 597D 3211 5D12" /* ±©NÕG5ˆ.ÄñY}2.]. */
- $"D96B 5A38 AB9A 7E89 C503 13B0 8354 C887" /* ÙkZ8«š~‰Å..°ƒTȇ */
- $"F766 96F0 EDAE C6B6 17B4 E9A4 9230 C2F5" /* ÷f–ðí®Æ¶.´é¤’0Âõ */
- $"029D 3D72 A1CF 5BB9 E975 DBFF 06DC F5B2" /* .=r¡Ï[¹éuÛÿ.Üõ² */
- $"686F 667B AD3E 1D8D 5BE4 0D6A 2CD7 DE66" /* hof{­>.[ä.j,×Þf */
- $"BE8E C996 696D 58EC 6CFE 40AD 3C95 EAF1" /* ¾ŽÉ–imXìlþ@­<•êñ */
- $"4591 1D62 836E D2E3 4CD8 E4A6 F4F4 C456" /* E‘.bƒnÒãLØä¦ôôÄV */
- $"A70C B3BE AA22 A188 DAB5 D3F7 4B7B 865D" /* §.³¾ª"¡ˆÚµÓ÷K{†] */
- $"4D89 77E6 99A6 46C9 14BA 25E1 55C5 ADBD" /* M‰w晦FÉ.º%áUÅ­½ */
- $"4379 96AF 26DA A399 F009 AE75 248B 0285" /* Cy–¯&Ú£™ðÆ®u$‹.… */
- $"B370 5704 6429 C8AF 0BD3 A332 90B2 8351" /* ³pW.d)ȯ.Ó£2²ƒQ */
- $"F715 32C9 347B EADE 2EBB 9D97 BF95 0C5A" /* ÷.2É4{êÞ.»—¿•.Z */
- $"9203 1EC5 7A8E CF46 C28C 39A2 DE74 C656" /* ’..ÅzŽÏFÂŒ9¢ÞtÆV */
- $"F0BF 3ABF CE5F BE71 B7CE 2FF3 F41B F3EA" /* ð¿:¿Î_¾q·Î/óô.óê */
- $"8BE7 B07E AB17 4F87 74FC FDE8 EF9F BF3F" /* ‹ç°~«.O‡tüýè? */
- $"A9EB F3D5 3F3E 83BE 7BAF EA5F E0FE 7ADF" /* ©ëóÕ?>ƒ¾{¯ê_àþzß */
- $"E7A7 7F9D 3FE7 3BF9 FA77 F9FA 3FF9 F7C7" /* ç§.?ç;ùúwùú?ù÷Ç */
- $"E7E9 871D E84F CFE8 83FC FE85 E3BB E7E7" /* çé‡.èOÏèƒüþ…ã»çç */
- $"AFFE 7D7F F9F5 57E7 AF70 6F9D 2DF3 9ED7" /* ¯þ}.ùõWç¯po-óž× */
- $"C81E F903 FEAB 8EF9 F50D F254 3F3E A4D1" /* È.ù.þ«Žùõ.òT?>¤Ñ */
- $"DD53 F3F6 F37E 7EC9 4775 1BE4 77F9 EEBF" /* ÝSóöó~~ÉGu.äwùî¿ */
- $"9ED1 F9DC 00F7 91DD 3D8B A94D D83C 797F" /* žÑùÜ.÷‘Ý=‹©MØ<y. */
- $"4243 1F04 D29C 94E6 FA35 A9C7 9C1C 0762" /* BC..Òœ”æú5©Çœ..b */
- $"AA92 7DF8 65D6 B16D 30C6 E3F2 22D5 8971" /* ª’}øeÖ±m0Æãò"Õ‰q */
- $"F890 651C 37E3 1F4A 29A4 6637 D7AE 7CB9" /* øe.7ã.J)¤f7×®|¹ */
- $"14C7 D06B 2595 45F8 89DC DBAF B284 6ADA" /* .ÇÐk%•Eø‰ÜÛ¯²„jÚ */
- $"E4DB 9D25 F76C CDA3 EB7E 1B5A 4264 8145" /* äÛ%÷lÍ£ë~.ZBdE */
- $"547E 6F18 076D A675 BA1A 1AB1 0BF1 AEB6" /* T~o..m¦uº..±.ñ®¶ */
- $"C8C2 AAE0 489F 4E11 7F77 336A 41A4 C050" /* ȪàHŸN..w3jA¤ÀP */
- $"D19E AE10 BD35 C5EC DA71 BDEF A017 C32D" /* Ñž®.½5ÅìÚq½ï .Ã- */
- $"CB15 0C8E 0B75 C179 FB84 FDF2 DD5D C21F" /* Ë..Ž.uÁyû„ýòÝ]Â. */
- $"56A5 397D C437 A82F 65F9 2E68 A785 0AF3" /* V¥9}Ä7¨/eù.h§…Âó */
- $"B9F0 7781 E6B8 ACFA 09DC B57D 6317 B29B" /* ¹ðw測úÆܵ}c.²› */
- $"C754 09FC 3635 9854 0DA1 A3BE D3EE CF40" /* ÇTÆü65˜T.¡£¾ÓîÏ@ */
- $"4BE4 A4D9 07C4 D65E 3887 C8A7 CD3A 83F5" /* Kä¤Ù.ÄÖ^8‡È§Í:ƒõ */
- $"DFA8 10A6 BB6D B811 852D 3877 8782 1E66" /* ߨ.¦»m¸.…-8w‡‚.f */
- $"AF11 43B8 CA3A 6146 3657 AFE0 B314 36CB" /* ¯.C¸Ê:aF6W¯à³.6Ë */
- $"8E1C 272D ED4B 634C AABA 0207 6A1A E2E3" /* Ž.'-íKcLªº..j.âã */
- $"C500 C0A4 894A BAD8 C9A1 0AE7 AC8D 750C" /* Å.À¤‰JºØÉ¡Âç¬u. */
- $"7D84 FBCC DB2E EE05 B04A 002B B383 46DE" /* }„ûÌÛ.î.°J.+³ƒFÞ */
- $"C18D 5BBD B442 9E88 BBB2 89CC 0EBA CF5A" /* Á[½´Bžˆ»²‰Ì.ºÏZ */
- $"5616 DDAB ED7B 4C2E 1C82 0C9D 4820 C0E8" /* V.Ý«í{L..‚.H Àè */
- $"1C4E 39A5 9041 9E33 A20A A73D 821A 238A" /* .N9¥Až3¢Â§=‚.#Š */
- $"3B24 14B9 D9A6 95AA F5B0 13C1 8CFD 790F" /* ;$.¹Ù¦•ªõ°.ÁŒýy. */
- $"33CB 82D3 FE12 0F27 F309 7453 05E0 DF8F" /* 3Ë‚Óþ..'óÆtS.àß */
- $"AAE8 F77A 31BA 0118 43E1 7AE7 69DC 5D12" /* ªè÷z1º..CázçiÜ]. */
- $"BD53 9858 EA6D D8D3 174C FE4C F487 3CCF" /* ½S˜XêmØÓ.LþLô‡<Ï */
- $"9098 7872 8FC3 EBAC 4C76 F503 6915 A1B3" /* ˜xrÃë¬Lvõ.i.¡³ */
- $"5FF8 81CD E13D D511 AAB8 5C7B 1376 C87F" /* _øÍá=Õ.ª¸\{.vÈ. */
- $"2DA1 557D 2053 3341 CC15 418C 0911 5378" /* -¡U} S3AÌ.AŒÆ.Sx */
- $"5FFE 324E 1412 2046 B049 3A77 69B7 417F" /* _þ2N.. F°I:wi·A. */
- $"AC17 B8B0 7FDA 6D19 59F0 DD68 8A88 E55A" /* ¬.¸°.Úm.YðÝhŠˆåZ */
- $"8098 0888 3714 713A 1D17 BB8D F01C 6005" /* €˜.ˆ7.q:..»ð.`. */
- $"8F2E 3D20 2753 1BB4 9BE3 DFD1 709F 99EB" /* .= 'S.´›ãßÑpŸ™ë */
- $"DFCC C1B1 717B 7FA3 52BB C12D E6B7 24D2" /* ßÌÁ±q{.£R»Á-æ·$Ò */
- $"F448 F23D C196 1BAA D61B F422 41B4 D620" /* ôHò=Á–.ªÖ.ô"A´Ö */
- $"466D 45F3 06F6 F631 3E88 5CDE F7F6 BC6F" /* FmEó.öö1>ˆ\Þ÷ö¼o */
- $"789C D06C 02CC 2E71 B6B0 03D2 297B BFCD" /* xœÐl.Ì.q¶°.Ò){¿Í */
- $"8C21 67AD CEE0 DB53 5749 A676 690C 11E3" /* Œ!g­ÎàÛSWI¦vi..ã */
- $"5AD2 905C 78E1 4AB0 E60E C920 4ECC 7CB6" /* ZÒ\xáJ°æ.É NÌ|¶ */
- $"A76F 70F1 BCFD AA1D F4D2 E43F E203 D0C8" /* §opñ¼ýª.ôÒä?â.ÐÈ */
- $"E11E 61AF F1A7 5762 600E 65BB D870 818A" /* á.a¯ñ§Wb`.e»ØpŠ */
- $"CDF0 DFC4 8C9C 1926 678B 2732 C52F 98FD" /* ÍðßÄŒœ.&g‹'2Å/˜ý */
- $"33B3 EE23 138D 5E5F C9C3 FEF9 6111 E3E6" /* 3³î#.^_ÉÃþùa.ãæ */
- $"AF79 A8A5 2949 D590 B463 EDF3 F72A 18FD" /* ¯y¨¥)IÕ´cíó÷*.ý */
- $"BB23 233B 7924 2DD1 A335 B949 467E A30C" /* »##;y$-Ñ£5¹IF~£. */
- $"3185 5FE5 DB63 6748 B22D AB3F 8A8C 0926" /* 1…_åÛcgH²-«?ŠŒÆ& */
- $"5450 E925 A69D 1185 7300 D694 EA1F 4DF2" /* TPé%¦.…s.Ö”ê.Mò */
- $"2413 F4ED 6D64 5B74 BBD5 0E65 26EF A8CD" /* $.ôímd[t»Õ.e&ï¨Í */
- $"5806 0C60 404F 90A0 06B6 AFD1 785F 9646" /* X..`@O .¶¯Ñx_–F */
- $"B1AD 2A45 5777 33FA 49DB 8D3D AC2A BAEA" /* ±­*EWw3úIÛ=¬*ºê */
- $"4527 B4DF 481A 6AB9 4485 05E6 7040 1B93" /* E'´ßH.j¹D….æp@.“ */
- $"D6E0 3BBF A334 E13B 68EC 934B C393 B621" /* Öà;¿£4á;hì“KÓ¶! */
- $"CFC8 69BE A6AC 672C 235E F1FC 4480 DE83" /* ÏÈi¾¦¬g,#^ñüD€Þƒ */
- $"32D7 D269 F78C F22D 5B9F F4DF DDDD D6DE" /* 2×Òi÷Œò-[ŸôßÝÝÖÞ */
- $"4C65 4D61 C1F0 26BF E4C3 D7C9 A034 163D" /* LeMaÁð&¿äÃ×É 4.= */
- $"FBAE 0167 4DF0 EBEF AA8B B742 2832 1F67" /* û®.gMðë懲·B(2.g */
- $"8CC0 80D0 4A6B 9843 DE59 2F7B F944 9DA4" /* ŒÀ€ÐJk˜CÞY/{ùD¤ */
- $"343D 9AD9 9E0B C7B5 0B7D 2CA1 F638 8A3B" /* 4=šÙž.ǵ.},¡ö8Š; */
- $"BB38 A39B 025A 9BA9 34AC ACF0 063D 5483" /* »8£›.Z›©4¬¬ð.=Tƒ */
- $"FE57 22E4 EB2C C699 AEF3 8EFB 1C8C A23A" /* þW"äë,Æ™®óŽû.Œ¢: */
- $"2C15 D2EF AC9A 91C9 993A 4CB0 2DDC 0A32" /* ,.Ò﬚‘É™:L°-ÜÂ2 */
- $"14B9 50D2 8579 8F9D 5AF2 88DB E726 1B39" /* .¹PÒ…yZòˆÛç&.9 */
- $"3E06 69F9 F300 09E4 D3E8 BB4C A704 10E0" /* >.iùó.ÆäÓè»L§..à */
- $"F1D0 53DE 91D8 6723 A047 11C7 57B3 C46C" /* ñÐSÞ‘Øg# G.ÇW³Äl */
- $"84A7 C2E1 C7CC 185C 9F21 7E2B 0F2E 64B1" /* „§ÂáÇÌ.\Ÿ!~+..d± */
- $"D734 4142 C65E A2FB 9ABE B62D 076B 2B65" /* ×4ABÆ^¢ûš¾¶-.k+e */
- $"9D6E 63F1 4825 79A9 3936 C7A7 531F EF6A" /* ncñH%y©96ǧS.ïj */
- $"F859 3084 0421 88A9 A648 8641 ACEB 95DE" /* øY0„.!ˆ©¦H†A¬ë•Þ */
- $"2E94 E3C9 442C 13AF CF63 0404 C5C6 5CE2" /* .”ãÉD,.¯Ïc..ÅÆ\â */
- $"CE90 F9CC A1B6 5713 031E C239 174F CC40" /* ÎùÌ¡¶W...Â9.OÌ@ */
- $"BCA4 EA9A EB6A 1D24 7962 F735 AF5A B937" /* ¼¤êšëj.$yb÷5¯Z¹7 */
- $"AC3B A12E 10A8 D332 6FE3 8ED1 6F01 B198" /* ¬;¡..¨Ó2oãŽÑo.±˜ */
- $"1543 A6A1 367E E226 5D76 B860 E0E1 8963" /* .C¦¡6~â&]v¸`àá‰c */
- $"AA7A F9EE DABF DB52 28F6 69F9 273F 8729" /* ªzùîÚ¿ÛR(öiù'?‡) */
- $"1D00 C7D2 20B9 3483 2125 88FC 94C0 54A6" /* ..ÇÒ ¹4ƒ!%ˆü”ÀT¦ */
- $"42FE F4E5 DA50 F495 F88B 5986 21CB 22E8" /* BþôåÚPô•ø‹Y†!Ë"è */
- $"EE5E 0622 2CB0 BCC8 0C6B 2B2B 23EB 0506" /* î^.",°¼È.k++#ë.. */
- $"A40F 09C2 726F 0C1F B8D4 55D3 2FE4 D629" /* ¤.ÆÂro..¸ÔUÓ/äÖ) */
- $"94C2 C913 BB28 4394 A9D2 8684 9E47 0445" /* ”ÂÉ.»(C”©Ò†„žG.E */
- $"B6CF 3E21 7072 B435 310C D7A3 063D 942B" /* ¶Ï>!pr´51.×£.=”+ */
- $"6AE9 350C 9442 C76E 1E6B A8C1 18A3 4309" /* jé5.”BÇn.k¨Á.£CÆ */
- $"6D55 E62F FC4E C4E9 6CF8 241D FAC5 2CC9" /* mUæ/üNÄélø$.úÅ,É */
- $"E020 6B12 31A6 9B11 710B 8850 FABE 5D63" /* à k.1¦›.q.ˆPú¾]c */
- $"068A 4018 2A90 93A5 9715 531E 8E7B AD7A" /* .Š@.*“¥—.S.Ž{­z */
- $"2921 115F 19CE 2B6A F643 DE89 2E76 890B" /* )!._.Î+jöCÞ‰.v‰. */
- $"5A69 1668 6A02 061F 4832 24EB FC82 6B4D" /* Zi.hj...H2$ëü‚kM */
- $"9B08 D22F CBBF D348 D18F 8B0C C684 6851" /* ›.Ò/Ë¿ÓHÑ‹.Æ„hQ */
- $"6CA9 E2FA 43CE 8A9A 7A58 FB28 0208 A6E0" /* l©âúCΊšzXû(..¦à */
- $"1ACF CE23 C624 5A38 C640 72C0 26F1 2818" /* .ÏÎ#Æ$Z8Æ@rÀ&ñ(. */
- $"07FD 74D9 F3D6 ED38 CA01 6485 CE8C 41A3" /* .ýtÙóÖí8Ê.d…ÎŒA£ */
- $"02C6 18E5 E4D2 2043 FA62 8768 3E14 7E80" /* .Æ.åäÒ Cúb‡h>.~€ */
- $"F2EB 67AD F743 75A0 2DDF 8724 1468 F88D" /* òëg­÷Cu -߇$.hø */
- $"9BF3 11EB 4D4C B372 D210 9B58 BAA0 646A" /* ›ó.ëML³rÒ.›Xº dj */
- $"222F 5E5A C781 1D86 5652 1B57 07AF C8FA" /* "/^ZÇ.†VR.W.¯Èú */
- $"9E77 DD7B FCB9 1D4C 8573 7B03 95AC D2DA" /* žwÝ{ü¹.L…s{.•¬ÒÚ */
- $"3314 4FFC CAF4 39B5 EAF4 9617 2CC5 9258" /* 3.OüÊô9µêô–.,Å’X */
- $"8F99 8C44 8D44 DA10 F1A5 51F7 5533 F13B" /* ™ŒDDÚ.ñ¥Q÷U3ñ; */
- $"CDDC B6D6 BE71 3C92 2628 3B69 DC32 C623" /* Íܶ־q<’&(;iÜ2Æ# */
- $"F497 3959 034A 67C3 10A8 26E2 572F B4B1" /* ô—9Y.JgÃ.¨&âW/´± */
- $"6C5C 3E47 FB9F AA7D D9A4 7A08 4BBA E854" /* l\>GûŸª}Ù¤z.KºèT */
- $"4370 CE77 C69A 11EB 1BD8 B9AF 8225 BC8E" /* CpÎwÆš.ë.ع¯‚%¼Ž */
- $"A261 1CAA A74D B531 A0B9 D462 35DF 9C21" /* ¢a.ª§Mµ1 ¹Ôb5ßœ! */
- $"73F1 EAC1 A13C E0BC AF6C 8111 03DF AF1F" /* sñêÁ¡<༯l..߯. */
- $"4748 1866 322C 535A 7C5E D2BC 4304 3541" /* GH.f2,SZ|^Ò¼C.5A */
- $"F14E 8412 296B 2C37 B642 9B4A 6417 EABB" /* ñN„.)k,7¶B›Jd.ê» */
- $"9034 1260 1B81 AFCC F903 4FAA A3F2 339E" /* 4.`.¯Ìù.Oª£ò3ž */
- $"F332 B080 8C32 31D7 4DEA B260 F190 43F1" /* ó2°€Œ21×Mê²`ñCñ */
- $"CCD5 A584 5C1C 343F FB87 CEA5 F246 8EAC" /* ÌÕ¥„\.4?û‡Î¥òFŽ¬ */
- $"C407 302C FEE7 3F59 F4B8 74ED ED62 D373" /* Ä.0,þç?Yô¸tííbÓs */
- $"A4BA B53A 0554 5403 9C2C E745 1087 5546" /* ¤ºµ:.TT.œ,çE.‡UF */
- $"2671 7BA6 3A33 703E BEF5 CD28 10A5 462B" /* &q{¦:3p>¾õÍ(.¥F+ */
- $"D902 9493 B2FC 176F 34BA 5A2D D2BC 0CBB" /* Ù.”“²ü.o4ºZ-Ò¼.» */
- $"5AB7 B854 08D3 CD79 3C71 1A89 E643 2FBC" /* Z·¸T.ÓÍy<q.‰æC/¼ */
- $"5A24 FEA6 EC06 1F23 79D9 3886 F6F4 7FB9" /* Z$þ¦ì..#yÙ8†öô.¹ */
- $"F892 1A20 DC66 1EB1 D6FD 1C48 52DE 4267" /* ø’. Üf.±Öý.HRÞBg */
- $"77E2 620B 2DC0 6828 575C F7CA 74BC FE73" /* wâb.-Àh(W\÷Êt¼þs */
- $"FABD C9ED 4E8F 71A7 8CCD 8D80 8BD2 8AA3" /* ú½ÉíNq§ŒÍ€‹ÒŠ£ */
- $"45C0 EF2A 387D 038E 8B00 BA81 12CD F93F" /* EÀï*8}.Ž‹.º.Íù? */
- $"E9BE 9134 2928 439B 69CF 3DB1 5DFC 3DAF" /* 龑4)(C›iÏ=±]ü=¯ */
- $"86CA 34A7 4574 C91C 3F99 3EA9 B6E9 F3AF" /* †Ê4§EtÉ.?™>©¶éó¯ */
- $"6757 09A3 C49E A9AD 7201 BFD9 B3FA 52B0" /* gWƣĞ©­r.¿Ù³úR° */
- $"0000 0030 908B 4E52 45F1 3CBE F04A D2E4" /* ...0‹NREñ<¾ðJÒä */
- $"83AF 6AEA 78E9 A438 C877 BAAD 65CB C703" /* ƒ¯jêxé¤8Èwº­eËÇ. */
- $"70B2 B9DD E19B 6B8C 0CE9 E402 0C9F 94F0" /* p²¹Ýá›kŒ.éä..Ÿ”ð */
- $"21BC 4E05 C03C 012A 66EF D0BC 2B72 292E" /* !¼N.À<.*fïм+r). */
- $"3592 1FDB 2A5C 8D2D C2FF 5C5B 6AB8 F695" /* 5’.Û*\-Âÿ\[j¸ö• */
- $"F279 2C54 0529 555A 6ACA 22A4 C28B D693" /* òy,T.)UZjÊ"¤Â‹Ö“ */
- $"1FC9 4492 43F3 A323 F990 0A31 9356 30D3" /* .ÉD’Có£#ùÂ1“V0Ó */
- $"D6F0 0D36 0091 043F F239 9D1E 114E 3693" /* Öð.6.‘.?ò9..N6“ */
- $"DF1C 23DF A27A 5B11 A44D 9199 07D1 AF2C" /* ß.#ߢz[.¤M‘™.ѯ, */
- $"63EB 21C5 D29F 8644 8C6A 129A 9CB9 ED72" /* cë!ÅÒŸ†DŒj.šœ¹ír */
- $"9286 3E0E B604 539A F262 B727 9284 01F9" /* ’†>.¶.Sšòb·'’„.ù */
- $"5AE1 DA5A 8A02 140E 5275 5433 BCDF 8038" /* ZáÚZŠ...RuT3¼ß€8 */
- $"0050 856F A747 857B 8376 255A 9185 28CC" /* .P…o§G…{ƒv%Z‘…(Ì */
- $"301A EC7C B5D3 89CC A695 1C87 8266 7CA8" /* 0.ì|µÓ‰Ì¦•.‡‚f|¨ */
- $"A203 7467 426E 9507 3DB3 1F90 F66B DC9F" /* ¢.tgBn•.=³.ökÜŸ */
- $"ACF6 CDB2 4FCC 5AE4 2F94 F555 CB9E D8AC" /* ¬öͲOÌZä/”õU˞ج */
- $"950B FF38 0FE4 5056 E5E8 F371 9A98 5697" /* •.ÿ8.äPVåèóqš˜V— */
- $"6319 5197 B545 E594 AADD B2F2 CA27 260D" /* c.Q—µE唪ݲòÊ'&. */
- $"9BAF 0E45 0846 5573 F96B 7AC1 CC89 E86E" /* ›¯.E.FUsùkzÁ̉èn */
- $"61E6 72E2 05E3 9F8D 26D8 F178 BCC0 0B18" /* aærâ.ãŸ&Øñx¼À.. */
- $"967C EA80 F7C1 45AE 8FAE A41C 41B6 438E" /* –|ê€÷ÁE®®¤.A¶CŽ */
- $"46EF 1094 D558 01A8 BBAD 7380 DA27 2772" /* Fï.”ÕX.¨»­s€Ú''r */
- $"9D67 1330 A48C 62EA 0643 14EC 3E22 A055" /* g.0¤Œbê.C.ì>" U */
- $"4E39 4E23 853D C587 99C8 CFD2 AEBB 9843" /* N9N#…=Ň™ÈÏÒ®»˜C */
- $"ECC9 0241 3253 8CF1 E068 1936 3BB2 56D3" /* ìÉ.A2SŒñàh.6;²VÓ */
- $"46F7 6A71 98D1 A300 1337 B3B0 7ABB 5752" /* F÷jq˜Ñ£..7³°z»WR */
- $"DB7A 7F85 5CFE 59DE A852 6987 DC11 C6B5" /* Ûz.…\þYÞ¨Ri‡Ü.Ƶ */
- $"E45B 7DD1 1F3A D566 C16D 3FBF 7BAD 7201" /* ä[}Ñ.:ÕfÁm?¿{­r. */
- $"B71C C74C A678 C2BB 10FD 534A 5E5D 79C0" /* ·.ÇL¦x».ýSJ^]yÀ */
- $"000C 2336 9113 B9C5 5D4A 1756 1C8B 0CD6" /* ..#6‘.¹Å]J.V.‹.Ö */
- $"AA8B DFF5 6CE3 CDAB B9B4 D85C 93FF 76AA" /* ª‹ßõlãÍ«¹´Ø\“ÿvª */
- $"15CF CF39 A864 B236 A172 03A1 65A1 9F76" /* .ÏÏ9¨d²6¡r.¡e¡Ÿv */
- $"FF55 00DE C7D0 C767 2787 9EB3 7CE5 C5BC" /* ÿU.ÞÇÐÇg'‡ž³|åż */
- $"8E08 6085 37A2 229C 73D3 2CC5 F6E8 AA1B" /* Ž.`…7¢"œsÓ,Åöèª. */
- $"AF13 15FD EB95 2609 6006 23C6 7910 8FFE" /* ¯..ýë•&Æ`.#Æy.þ */
- $"8C5E 60A6 A558 E899 0A05 0F37 EC94 8E51" /* Œ^`¦¥Xè™Â..7씎Q */
- $"7838 9A11 8483 88B0 E284 B88D CDEA 9D56" /* x8š.„ƒˆ°â„¸ÍêV */
- $"5C7E CFA2 8001 847E ABC9 360E 17EA 2D34" /* \~Ï¢€.„~«É6..ê-4 */
- $"8314 96C0 3810 D88F A54E 6E7C 6030 76FA" /* ƒ.–À8.Ø¥Nn|`0vú */
- $"18A4 A549 37FC 11F6 E77F A883 C794 71AC" /* .¤¥I7ü.öç.¨ƒÇ”q¬ */
- $"55F1 7F88 664A FEE4 01C4 5576 1BE6 9C41" /* Uñ.ˆfJþä.ÄUv.æœA */
- $"D800 6121 2FC0 E681 A16E 21AF D5FE 0E80" /* Ø.a!/Àæ¡n!¯Õþ.€ */
- $"A800 0000 3090 8C40 9184 82DA 7187 51C6" /* ¨...0Œ@‘„‚Úq‡QÆ */
- $"44DC C420 FF13 98AD D100 2C07 132C 8D6C" /* DÜÄ ÿ.˜­Ñ.,..,l */
- $"5D16 A089 D8F6 E77F A870 24F1 5461 DB69" /* ]. ‰Øöç.¨p$ñTaÛi */
- $"0F41 5029 7A41 B55F 0000 0184 846A 850C" /* .AP)zAµ_...„„j…. */
- $"241E E628 EDA6 4000 3090 6AA2 F6E7 7FA6" /* $.æ(í¦@.0j¢öç.¦ */
- $"26C9 5EDE 9BB6 A1B1 51E6 8D5D F800 0061" /* &É^Þ›¶¡±Qæ]ø..a */
- $"19B3 E47D 6F6F DB03 0885 4A53 27BA 38F5" /* .³ä}ooÛ..…JS'º8õ */
- $"35A0 1AB9 0A95 8FAE 85E3 F528 5A8B E645" /* 5 .¹Â•®…ãõ(Z‹æE */
- $"8419 0456 6A38 D0DA 4948 8987 2323 1216" /* „..Vj8ÐÚIH‰‡##.. */
- $"A4F8 FD1A C374 D30C BF43 CD86 B984 F23C" /* ¤øý.ÃtÓ.¿C͆¹„ò< */
- $"5487 B47F E217 F15A D8CF A66A 96A9 EAF3" /* T‡´.â.ñZØϦj–©êó */
- $"F966 0205 D320 1556 5C3C 073A 8E66 1E3F" /* ùf..Ó .V\<.:Žf.? */
- $"A74E FF2C BC45 E9DB 3B25 FF7F 46AD 13A9" /* §Nÿ,¼EéÛ;%ÿ.F­.© */
- $"5C21 458B 6AD4 829C 1DFB 54BA E5F2 3C76" /* \!E‹jÔ‚œ.ûTºåò<v */
- $"3898 11F6 D710 7470 00FC 0742 CA59 9E40" /* 8˜.ö×.tp.ü.BÊYž@ */
- $"757C 5952 61FF 4D28 0991 1673 9B01 06B9" /* u|YRaÿM(Æ‘.s›..¹ */
- $"3999 E9B5 06CD B1DA CB08 FF19 DE70 8D10" /* 9™éµ.ͱÚË.ÿ.Þp. */
- $"E725 848E D27D 2B0B 54F0 B60B 26AB CD92" /* ç%„ŽÒ}+.Tð¶.&«Í’ */
- $"E4F8 C007 FF68 6933 E2FF 31D5 435B FF7F" /* äøÀ.ÿhi3âÿ1ÕC[ÿ. */
- $"9A8E 9845 007F FEDA 4C63 9892 513A ABD9" /* šŽ˜E..þÚLc˜’Q:«Ù */
- $"A98A C012 5C99 31C0 D48F E334 671D A695" /* ©ŠÀ.\™1ÀÔã4g.¦• */
- $"C7EF 3AAA FF37 D381 4F42 983F FC4D AE82" /* Çï:ªÿ7ÓOB˜?üM®‚ */
- $"FF43 6555 9E7F 10A3 7B95 415D 41FF 20B3" /* ÿCeUž..£{•A]Aÿ ³ */
- $"8CB1 7302 0000 0000 584E AB14 398C A865" /* Œ±s.....XN«.9Œ¨e */
- $"5A7B 1650 52EB 8BCE 3E92 461D 071B 8F21" /* Z{.PRë‹Î>’F...! */
- $"2CFF 4F5F FD2E 999E B77D A47D 61B4 2C01" /* ,ÿO_ý.™ž·}¤}a´,. */
- $"D397 493D CB48 AB27 EB4A 13A7 8C89 7F64" /* Ó—I=ËH«'ëJ.§Œ‰.d */
- $"6C08 FF21 9696 98C7 6248 1615 541F EC81" /* l.ÿ!––˜ÇbH..T.ì */
- $"8E18 FAED 5257 3D01 2CBB 74C1 DA64 81A0" /* Ž.úíRW=.,»tÁÚd  */
- $"39BF B272 4068 15E8 A44A 007C 732C D9DC" /* 9¿²r@h.è¤J.|s,ÙÜ */
- $"1CF8 4612 8611 A36D 67BC 6E6A EA14 9D87" /* .øF.†.£mg¼njê.‡ */
- $"2962 C4B4 5442 9564 BFAA D0FB 991F 4288" /* )bÄ´TB•d¿ªÐû™.Bˆ */
- $"7CB2 2A41 333E 7827 5070 F3A6 67FF 7FFF" /* |²*A3>x'Ppó¦gÿ.ÿ */
- $"7601 CFFE E44B 4413 809B 3877 B59D BC19" /* v.ÏþäKD.€›8wµ¼. */
- $"548F 0A5B C1E9 A8D7 6B5D 8EC8 8A1A BB3D" /* TÂ[Áé¨×k]ŽÈŠ.»= */
- $"3CD1 3139 57CF 9E94 00E9 CF6E 3830 3561" /* <Ñ19WÏž”.éÏn805a */
- $"8DE4 A59F FD1B 45CF C608 D0FD 5D48 485E" /* 䥟ý.EÏÆ.Ðý]HH^ */
- $"D5A3 30A5 F9EE 5D55 B9C2 E552 3A9F B087" /* Õ£0¥ùî]U¹ÂåR:Ÿ°‡ */
- $"FE87 5DBC 5E73 0F16 9221 2B0D F399 AB6F" /* þ‡]¼^s..’!+.ó™«o */
- $"9950 0000 0000 0000 0008 2444 88CE 3BBD" /* ™P........$DˆÎ;½ */
- $"CC78 4932 9C47 DEFA 74E7 91BF 9827 FF7B" /* ÌxI2œGÞútç‘¿˜'ÿ{ */
- $"77EB 9B1B 9F7F FDAB 6552 35A1 0C22 E9C6" /* wë›.Ÿ.ý«eR5¡."éÆ */
- $"42E3 FF7F FF7F E9FD A23B 2F7D 3ADD FC90" /* Bãÿ.ÿ.éý¢;/}:Ýü */
- $"E4A1 F8B9 0560 0F86 D7FE 3F46 C953 2A03" /* ä¡ø¹.`.†×þ?FÉS*. */
- $"F1C7 F5AE D0C4 B743 EA67 B694 E47D 45CD" /* ñÇõ®ÐÄ·Cêg¶”ä}EÍ */
- $"6F92 178A E383 8B71 800E D9AF A55A F149" /* o’.Šãƒ‹q€.Ù¯¥ZñI */
- $"A838 5671 4C9A 8915 447A CDA9 C6B7 DD68" /* ¨8VqLš‰.DzÍ©Æ·Ýh */
- $"A5FB F404 CF63 A62E CC5E 89D3 FDB2 C841" /* ¥ûô.Ïc¦.Ì^‰Óý²ÈA */
- $"7A37 5B5D 5958 4B46 20B1 D389 5188 F9FE" /* z7[]YXKF ±Ó‰Qˆùþ */
- $"8FF1 D718 6C8C 3254 0000 0000 0000 0000" /* ñ×.lŒ2T........ */
- $"0000 00A1 EBEC C33A 8622 D0FF 7FFF 7FFF" /* ...¡ëìÃ:†"Ðÿ.ÿ.ÿ */
- $"705D C7FE 49E7 01B7 A65D D5BC 2041 80B0" /* p]ÇþIç.·¦]Õ¼ A€° */
- $"89ED F68A A000 F438 EBD0 C908 0B67 414F" /* ‰íöŠ .ô8ëÐÉ..gAO */
- $"C8F1 4312 2EC8 05E6 CA19 184F FF5B BA24" /* ÈñC..È.æÊ..Oÿ[º$ */
- $"57E8 A6B4 FBD3 FF79 4D8E FF44 BC50 6938" /* W覴ûÓÿyMŽÿD¼Pi8 */
- $"137F FF7D 6251 8D1A 9B33 CF7E 0BCB EAD7" /* ..ÿ}bQ.›3Ï~.Ëê× */
- $"2E0D EAE0 0003 0906 AA2B 66A8 C950 0000" /* ..êà..Æ.ª+f¨ÉP.. */
- $"0000 0000 0000 0000 0001 1E1F F600 1848" /* ............ö..H */
- $"4BF6 7A7C F92D 3E7A 437E 2254 51EB 4AF5" /* Köz|ù->zC~"TQëJõ */
- $"C6BF 442A 12CD 51FF 7FFE B8AE D0C4 B1D0" /* Æ¿D*.ÍQÿ.þ¸®ÐıР*/
- $"7CF7 019D A0ED 2CC4 01BC 1A94 212D 43EF" /* |÷. í,Ä.¼.”!-Cï */
- $"1274 9B67 94D5 062D 5FCC E23C 4816 416B" /* .t›g”Õ.-_Ìâ<H.Ak */
- $"1540 59C2 1D35 213D A11C EE70 8D15 5394" /* .@YÂ.5!=¡.îp.S” */
- $"53C6 29CF 4E19 F4CF 5B94 7FFF 7F8B 2813" /* SÆ)ÏN.ôÏ[”.ÿ.‹(. */
- $"3E95 DE81 30D0 3188 2A75 4F35 CB11 DDD5" /* >•Þ0Ð1ˆ*uO5Ë.ÝÕ */
- $"7FFD A983 95A9 71E7 A7A3 7D3F F944 0A7E" /* .ý©ƒ•©q秣}?ùDÂ~ */
- $"24D9 966F 6B6A 0FD0 23AC 7000 0000 0000" /* $Ù–okj.Ð#¬p..... */
- $"0009 D4AF 9196 E5A4 B8AC 407F F9EE C709" /* .ÆÔ¯‘–夸¬@.ùîÇÆ */
- $"F927 08C3 CA6C 3A3A D90F E306 BCC4 6D6C" /* ù'.ÃÊl::Ù.ã.¼Äml */
- $"C7A9 F042 6F4C FDC9 60AB A087 6338 8F12" /* Ç©ðBoLýÉ`« ‡c8. */
- $"4D29 D00C C575 C7B5 9FA4 E96C 1FA0 AAFB" /* M)Ð.ÅuǵŸ¤él. ªû */
- $"09E9 8DF9 1BE0 C62D 3C1D F55B DD77 A0FD" /* Æéù.àÆ-<.õ[Ýw ý */
- $"5C16 D959 BA08 0000 0000 0000 0145 AE01" /* \.ÙYº........E®. */
- $"712A 0E06 1212 70CD 94A8 0A2C 18F5 1E3B" /* q*....pÍ”¨Â,.õ.; */
- $"52FA C8F6 56F3 F7E4 69E6 54A0 3FF6 2487" /* RúÈöVó÷äiæT ?ö$‡ */
- $"C65F 0EFF 7F4F 8D07 C817 FE78 727D 3C75" /* Æ_.ÿ.O.È.þxr}<u */
- $"E4C6 1003 FECF 3E7E 6252 08C0 4A83 50D7" /* äÆ..þÏ>~bR.ÀJƒP× */
- $"DADA 8602 5949 900F D2B6 D10D 2661 3014" /* ÚÚ†.YI.Ò¶Ñ.&a0. */
- $"4541 17FF 2106 00DF AC82 0046 09BB A5AF" /* EA.ÿ!..߬‚.FÆ»¥¯ */
- $"CE51 0EBF F9AD 787A 907F 9F9A 628F E16B" /* ÎQ.¿ù­xz.Ÿšbák */
- $"C015 137E 9C68 FCFA A817 FF7F DD6B FDB6" /* À..~œhüú¨.ÿ.Ýký¶ */
- $"3DA3 7C9D 3309 0B8A B551 C370 4401 CD7F" /* =£|3Æ.ŠµQÃpD.Í. */
- $"7503 8425 E297 1B3F FF49 4FF8 3583 685A" /* u.„%â—.?ÿIOø5ƒhZ */
- $"B273 A7F7 CEBF F27E D78C 3E35 5332 152B" /* ²s§÷οò~׌>5S2.+ */
- $"033C C7FF 7B97 1AF0 F2A4 3C88 CC7B B96E" /* .<Çÿ{—.ðò¤<ˆÌ{¹n */
- $"65B3 533C F2F8 5E4B 6DBF 7D78 A316 310F" /* e³S<òø^Km¿}x£.1. */
- $"6B09 FD62 88D7 77FF 7447 524E C235 00A3" /* kÆýbˆ×wÿtGRNÂ5.£ */
- $"8F5A 4BEE D240 6154 C17C 2CC2 68F0 A959" /* ZKîÒ@aTÁ|,Âhð©Y */
- $"2F12 9B74 7E8E 423F BB1D BC9A C75B C618" /* /.›t~ŽB?».¼šÇ[Æ. */
- $"19D1 C6CB 0A15 BD77 99BD 96D3 CC07 F5AC" /* .ÑÆËÂ.½w™½–ÓÌ.õ¬ */
- $"D2ED DE5E F19D 5CFC B2B0 5407 0386 32C6" /* ÒíÞ^ñ\ü²°T..†2Æ */
- $"5F49 7BAD 3270 BF81 CF97 C934 7E23 7237" /* _I{­2p¿Ï—É4~#r7 */
- $"727B 0FA2 6DB0 D717 8C73 B109 E089 AAC5" /* r{.¢m°×.Œs±Æà‰ªÅ */
- $"7D98 9061 2956 EA75 0135 E870 3430 4E9B" /* }˜a)Vêu.5èp40N› */
- $"C76C D3D6 7EEB 83DB 9EEB C9A0 983D 1327" /* ÇlÓÖ~ëƒÛžëÉ ˜=.' */
- $"62D8 FD62 CA51 7135 80B0 ABFF 431B 9843" /* bØýbÊQq5€°«ÿC.˜C */
- $"68B4 A929 44E4 1F3E E3A1 22AA 5E87 579C" /* h´©)Dä.>ã¡"ª^‡Wœ */
- $"745B 9CA4 438C BFC2 9A1B 17BE BA75 06E4" /* t[œ¤CŒ¿Âš..¾ºu.ä */
- $"0108 698C E4F2 341C 24CC 7913 6237 ED48" /* ..iŒäò4.$Ìy.b7íH */
- $"E797 4D7A 0D5A D1EA ACDF F974 4F9F 9139" /* ç—Mz.ZÑê¬ßùtOŸ‘9 */
- $"6A87 3972 A1C8 0A2B 1E8B 6DB7 B811 4AB0" /* j‡9r¡ÈÂ+.‹m·¸.J° */
- $"EEE8 BB23 959C 239D 4165 DBED ACE4 F133" /* îè»#•œ#AeÛí¬äñ3 */
- $"8276 40BB C447 29FE 3EB6 5BA4 A6D0 2441" /* ‚v@»ÄG)þ>¶[¤¦Ð$A */
- $"1431 8B2D 8BFD 96B7 C8C2 9F9B DFB9 2B06" /* .1‹-‹ý–·ÈŸ›ß¹+. */
- $"E191 00FF 7E4B 8281 D609 D163 B8CB AF9A" /* á‘.ÿ~K‚ÖÆÑc¸Ë¯š */
- $"0995 7385 27FC 3C6A 5310 024D BAD1 8013" /* Æ•s…'ü<jS..MºÑ€. */
- $"8995 3DF4 FA80 FE12 8F5F 40E5 09E6 E7E8" /* ‰•=ôú€þ._@åÆæçè */
- $"C5E7 1309 3E97 E278 0228 1693 F565 F83E" /* Åç.Æ>—âx.(.“õeø> */
- $"4161 0037 E0AA D0CC 3AED 4E56 04E8 4456" /* Aa.7àªÐÌ:íNV.èDV */
- $"6E50 4626 C7E0 0790 014E 329B 0DDB D87D" /* nPF&Çà..N2›.ÛØ} */
- $"4532 6482 3F51 D651 3F62 D6EB 3BCA 75EB" /* E2d‚?QÖQ?bÖë;Êuë */
- $"5444 A42F 3CFB 4146 19FB 5376 876F 6BC1" /* TD¤/<ûAF.ûSv‡okÁ */
- $"B80B 7787 71DF 4CAA D70A 98BC 98E1 15A1" /* ¸.w‡qßLª×˜¼˜á.¡ */
- $"7996 F17F FF7A 91CF 350C FA04 5753 7ECB" /* y–ñ.ÿz‘Ï5.ú.WS~Ë */
- $"29F1 A4AD F335 59DB A580 EAA3 98AD FEB0" /* )ñ¤­ó5YÛ¥€ê£˜­þ° */
- $"275E BABE 6679 9AD4 B246 75F2 ECAA B042" /* '^º¾fyšÔ²Fuò쪰B */
- $"92C9 745E 1C58 58FF 2570 9228 4EAF 6F65" /* ’Ét^.XXÿ%p’(N¯oe */
- $"56F3 1D0C 85AA 9468 8000 0000 0101 3082" /* Vó..…ª”h€.....0‚ */
- $"08FD E30F FF75 70BF FCCA 2225 E5FC 3464" /* .ýã.ÿup¿üÊ"%åü4d */
- $"00CA 6C43 E833 80DE 2895 5F84 4B08 CEFA" /* .ÊlCè3€Þ(•_„K.Îú */
- $"AA94 EE33 24E7 CA20 A668 4717 FD5F F7F2" /* ª”î3$çÊ ¦hG.ý_÷ò */
- $"59E7 D6C6 6D0D 8E0F 1AC3 BBFA 3890 8ACB" /* YçÖÆm.Ž..ûú8ŠË */
- $"9250 6D82 E892 D4B9 1F14 D987 9818 877A" /* ’Pm‚è’Ô¹..Ù‡˜.‡z */
- $"66F0 905A B088 D761 B529 F02A 6964 6C65" /* fðZ°ˆ×aµ)ð*idle */
- $"8FB8 9A87 7771 9A12 C8A6 7F9C 9905 D643" /* ¸š‡wqš.Ȧ.œ™.ÖC */
- $"E554 91F5 0C26 4299 30C6 BC87 B38C 86FB" /* åT‘õ.&B™0Ƽ‡³Œ†û */
- $"ED50 C019 3822 52A8 97C6 1F49 176D FB8C" /* íPÀ.8"R¨—Æ.I.mûŒ */
- $"87B7 E37C 196E 3695 357A E2B8 FDE5 736E" /* ‡·ã|.n6•5zâ¸ýåsn */
- $"DF11 6026 3CD9 51CF 2A50 6F8A 53B0 0F16" /* ß.`&<ÙQÏ*PoŠS°.. */
- $"938B 745A F84D 571C A582 9723 90B4 49D7" /* “‹tZøMW.¥‚—#´I× */
- $"B11D 7BA6 45C1 2AFA D519 A471 60A3 17A9" /* ±.{¦EÁ*úÕ.¤q`£.© */
- $"2C13 6E04 D58E 3F37 0115 E4AE F51C 1BA8" /* ,.n.ÕŽ?7..ä®õ..¨ */
- $"EF7F 4C9F 7B47 8C5A D1D6 CAC7 D416 D6D4" /* ï.LŸ{GŒZÑÖÊÇÔ.ÖÔ */
- $"7F05 9504 5685 0D6D E0E8 6809 9307 7864" /* ..•.V….màèhÆ“.xd */
- $"1A86 1BA6 A321 D08C 1B0C 0981 9395 6DC0" /* .†.¦£!ÐŒ..Æ“•mÀ */
- $"C74F ECF7 CA1B FF4B 1896 BDBE 4876 8A4B" /* ÇOì÷Ê.ÿK.–½¾HvŠK */
- $"519F CC3C 7813 BE21 C40C B001 30F4 4FC7" /* QŸÌ<x.¾!Ä.°.0ôOÇ */
- $"B76C B9FA 26F6 38C8 116D B8F0 0B9D 818F" /* ·l¹ú&ö8È.m¸ð. */
- $"56F9 F934 AE60 71FD E583 8D07 A4A4 DE41" /* Vùù4®`qýåƒ.¤¤ÞA */
- $"FB75 B83F 384B 11C9 CC5E CD9D FF4C 05A8" /* ûu¸?8K.ÉÌ^ÍÿL.¨ */
- $"D59F 1E59 4797 FF7F DFD8 391C E8BA 72E2" /* ÕŸ.YG—ÿ.ßØ9.èºrâ */
- $"C1F8 9F5C 5317 01E3 EC2D 4120 97D2 BAEC" /* ÁøŸ\S..ãì-A —Òºì */
- $"DBB0 FF30 FC56 2E43 3716 1B7B A8CD 19AE" /* Û°ÿ0üV.C7..{¨Í.® */
- $"7FFF 7FF4 468B FF45 749B 3C67 EE31 1651" /* .ÿ.ôF‹ÿEt›<gî1.Q */
- $"17B2 B21C A982 A185 E8A3 03BC 2DCB C09A" /* .²².©‚¡…è£.¼-ËÀš */
- $"8522 64CF BB21 6955 068D F002 871B 05F3" /* …"dÏ»!iU.ð.‡..ó */
- $"9F44 7384 D624 E1FA A24D 67C7 BC5E F7BF" /* ŸDs„Ö$áú¢MgǼ^÷¿ */
- $"59BC DC3C BE4B 1456 0C6F F2C1 0841 038D" /* Y¼Ü<¾K.V.oòÁ.A. */
- $"723C 14FA 4F19 0AD4 1F88 0A1B FF14 3D93" /* r<.úO.ÂÔ.ˆÂ.ÿ.=“ */
- $"27AA 6E0B 4AA7 6A11 E06D 5D82 C930 1B53" /* 'ªn.J§j.àm]‚É0.S */
- $"0227 A9AA 253A 41E6 31D5 8B87 DC08 819B" /* .'©ª%:Aæ1Õ‹‡Ü.› */
- $"E5EE EA0F 6AA0 0000 0006 9BC0 594E 0004" /* åîê.j ....›ÀYN.. */
- $"D326 312C 0364 8835 C4D7 5040 3724 3CD9" /* Ó&1,.dˆ5Ä×P@7$<Ù */
- $"B889 2E14 12BC F0AD 9D2E 326B 1654 5952" /* ¸‰...¼ð­.2k.TYR */
- $"2B5F 1A9D 5403 C9C5 A731 1B3C 3443 783C" /* +_.T.Éŧ1.<4Cx< */
- $"A459 248B BBC7 DEDC 74AD E2A1 D647 5047" /* ¤Y$‹»ÇÞÜt­â¡ÖGPG */
- $"AD17 15AF FF5C 88C4 025F 4361 3F83 BFC9" /* ­..¯ÿ\ˆÄ._Ca?ƒ¿É */
- $"FF6D 7E58 128D 33D7 7076 E73A 9CF6 76D8" /* ÿm~X.3×pvç:œövØ */
- $"A0FF 2C44 2029 0B59 B427 3BDC 915B 87CF" /*  ÿ,D ).Y´';Ü‘[‡Ï */
- $"75D6 EC52 7793 6DFA A4E2 9E2D 7D25 FBC2" /* uÖìRw“mú¤âž-}%û */
- $"2028 DE78 D868 BEC5 E9D2 BFFA 8B12 9265" /* (ÞxØh¾ÅéÒ¿ú‹.’e */
- $"B01D 92F7 F71E 8782 F1CD 4E98 B46E 6DA5" /* °.’÷÷.‡‚ñÍN˜´nm¥ */
- $"8825 F851 1CE9 9F21 D8E2 86EB BAF4 126F" /* ˆ%øQ.éŸ!Øâ†ëºô.o */
- $"9CB3 0144 009A 6F38 0919 9C1F D0CE D23C" /* œ³.D.šo8Æ.œ.ÐÎÒ< */
- $"C9DD 9273 D8F6 6733 6E5A 2E7A 635C 8723" /* ÉÝ’sØög3nZ.zc\‡# */
- $"6E04 1283 1A43 02CA 74E4 8000 0309 08DB" /* n..ƒ.C.Êtä€..Æ.Û */
- $"EF05 DC00 D116 0D58 1A69 2055 1BA0 D8DE" /* ï.Ü.Ñ..X.i U. ØÞ */
- $"34B6 EA40 CC06 C673 559A 75F2 9B58 C474" /* 4¶ê@Ì.ÆsUšuò›XÄt */
- $"DD4C AB9A 9E6D 653B FCDF 4F33 3707 105E" /* ÝL«šžme;üßO37..^ */
- $"DBCE D327 45FB C663 E1AF 375B B106 B0B8" /* ÛÎÓ'EûÆcá¯7[±.°¸ */
- $"26EE AE4B 538A CF74 588E 928B 58C7 2D93" /* &î®KSŠÏtXŽ’‹XÇ-“ */
- $"371E BC81 0ED0 9F2C 1A18 8DD7 7E65 4FBF" /* 7.¼.П,..×~eO¿ */
- $"511B 63A1 8F26 2A08 A4D3 2BF3 96E6 FC32" /* Q.c¡&*.¤Ó+ó–æü2 */
- $"D457 8287 D843 6D19 2458 0EA4 AC8F 0512" /* ÔW‚‡ØCm.$X.¤¬.. */
- $"831D D4CA 9BFF 5A6E 951A 5897 451F 750C" /* ƒ.ÔÊ›ÿZn•.X—E.u. */
- $"CAD4 89C1 94A7 4BFA 4030 4828 1E37 C049" /* ÊÔ‰Á”§Kú@0H(.7ÀI */
- $"34C4 54B1 1054 2645 14E5 6DFF 7FFF 7328" /* 4ÄT±.T&E.åmÿ.ÿs( */
- $"F1A4 AAA2 4FD2 507D 86D5 FF7F FA43 F49A" /* ñ¤ª¢OÒP}†Õÿ.úCôš */
- $"5049 0839 5964 8186 EE46 1867 158E 9E2C" /* PI.9Yd†îF.g.Žž, */
- $"D618 8FF5 D416 6838 6187 9CF7 21BC DE1F" /* Ö.õÔ.h8a‡œ÷!¼Þ. */
- $"F84F F4E9 ACDB ECD8 6CA6 6725 85B4 4049" /* øOôé¬ÛìØl¦g%…´@I */
- $"AA9E 4935 7E1F 54E7 B0D5 A026 B073 899B" /* ªžI5~.Tç°Õ &°s‰› */
- $"51C4 8C2E 483C B3BF 38A0 4BCF 2042 EE90" /* QÄŒ.H<³¿8 KÏ Bî */
- $"4E1B 8C94 420F 99A7 9EA1 7D96 12A3 8C8D" /* N.Œ”B.™§ž¡}–.£Œ */
- $"819B C97D C518 51CB 0D8A A7A1 7159 EB10" /* ›É}Å.QË.Š§¡qYë. */
- $"4A27 5CD0 0ED7 2688 5F74 CE10 DF6A 5B4F" /* J'\Ð.×&ˆ_tÎ.ßj[O */
- $"E370 A282 105D 2F43 6E74 6B07 05EC 880E" /* ãp¢‚.]/Cntk..ìˆ. */
- $"15AF 5118 9D27 327D 2552 9996 020B 2D9A" /* .¯Q.'2}%R™–..-š */
- $"9AFC 6849 6068 6491 42FA 889C 7949 285A" /* šühI`hd‘BúˆœyI(Z */
- $"7FFE 5B6D DAF2 7FFF 772D E08E B9E4 65A3" /* .þ[mÚò.ÿw-àŽ¹äe£ */
- $"B49A DDC8 FF52 8DA3 B318 F84F F4E9 99ED" /* ´šÝÈÿR£³.øOôé™í */
- $"48C4 CA7E BE77 2634 6A22 1FAD 4752 8D9B" /* HÄÊ~¾w&4j".­GR› */
- $"B935 0449 1A27 9EAB B000 C242 3BB7 72B7" /* ¹5.I.'ž«°.ÂB;·r· */
- $"3ACC B41F 0AC9 CFFD 58DA D99F 498A 21CF" /* :Ì´.ÂÉÏýXÚÙŸIŠ!Ï */
- $"50B8 A155 9BB3 B3DA 13FE 251F 14F2 3431" /* P¸¡U›³³Ú.þ%..ò41 */
- $"6DBF 2774 3EFC 55BB 9CB3 40A4 CA00 A112" /* m¿'t>üU»œ³@¤Ê.¡. */
- $"3E83 51D4 9D13 DE0D F86D 3384 AAE7 9074" /* >ƒQÔ.Þ.øm3„ªçt */
- $"F7CF 4509 F99A 70B2 2E74 43C3 1363 021F" /* ÷ÏEÆùšp².tCÃ.c.. */
- $"6482 E471 22FA 6265 2DF9 C302 43F8 9053" /* d‚äq"úbe-ùÃ.CøS */
- $"0AE9 15A2 28D4 FD7C 05AF C7B8 26D5 7C0F" /* Âé.¢(Ôý|.¯Ç¸&Õ|. */
- $"22E0 4735 518D BE4B 4E83 1EF8 3FFA BA23" /* "àG5Q¾KNƒ.ø?úº# */
- $"3AE8 F76B 1D92 2038 64C1 EA73 30FC CE72" /* :è÷k.’ 8dÁês0üÎr */
- $"0CA5 6697 157E 55C4 8BAE E703 6FF5 F743" /* .¥f—.~UÄ‹®ç.oõ÷C */
- $"B456 C85F 3BFF 2629 95B7 02F4 F580 A49B" /* ´VÈ_;ÿ&)•·.ôõ€¤› */
- $"1587 2316 D131 66C1 C6DB F3DC C409 D801" /* .‡#.Ñ1fÁÆÛóÜÄÆØ. */
- $"E2DA 30B6 73FD 99EF AA26 25D7 DF07 FBEB" /* âÚ0¶sý™ïª&%×ß.ûë */
- $"094E 2E8E BD11 3C49 81BA E6BE 7666 ECBE" /* ÆN.Ž½.<Iºæ¾vfì¾ */
- $"59D2 4ACC B4CE 3FAD 2173 25CB E42F 37B8" /* YÒJÌ´Î?­!s%Ëä/7¸ */
- $"F3CC 79EF 695C 10F4 0381 2D14 1B0F D632" /* óÌyïi\.ô.-...Ö2 */
- $"8A1E 9C29 F617 6A4B 204E A147 C08D 1AA5" /* Š.œ)ö.jK N¡GÀ.¥ */
- $"7418 DED9 DE83 A555 A75B AB00 C650 247F" /* t.ÞÙÞƒ¥U§[«.ÆP$. */
- $"0222 5558 731B 54DB 14F6 3A0E 1FAD A8D8" /* ."UXs.TÛ.ö:..­¨Ø */
- $"F327 DC8F AF3F 630B 3BA9 7933 8D30 458C" /* ó'ܯ?c.;©y30EŒ */
- $"4C2F 6E3A 0A64 DDC5 926A 71CB 2347 EE4D" /* L/n:ÂdÝÅ’jqË#GîM */
- $"647B D94D BE24 7F62 6A14 EBE2 696F 8735" /* d{ÙM¾$.bj.ëâio‡5 */
- $"A96F E268 6912 A4A9 3254 0293 CB09 0DC0" /* ©oâhi.¤©2T.“ËÆ.À */
- $"206B EB7B F6B9 0643 5E74 4F2C 555A AE2D" /* kë{ö¹.C^tO,UZ®- */
- $"B16B 7FA3 8ADE 7EAC 764F 9A20 BC94 05F1" /* ±k.£ŠÞ~¬vOš ¼”.ñ */
- $"9AAC 0118 36B8 6B30 D696 6E84 EEC2 5342" /* š¬..6¸k0Ö–n„îÂSB */
- $"03A8 EFD3 CB37 D50D F676 35DB AD6C 280A" /* .¨ïÓË7Õ.öv5Û­l( */
- $"DB04 D23A 0922 A2E3 5F45 EBD1 5C49 F6AA" /* Û.Ò:Æ"¢ã_EëÑ\Iöª */
- $"4579 1BA2 D94E D3F0 7A7E C24E 79B0 5D24" /* Ey.¢ÙNÓðz~ÂNy°]$ */
- $"B98E 23E7 4C4F 54D9 A3CE 389F 63F6 2426" /* ¹Ž#çLOTÙ£Î8Ÿcö$& */
- $"7087 D921 86D6 709F 768D 5684 BB90 47B7" /* p‡Ù!†ÖpŸvV„»G· */
- $"AC32 98D7 E247 3668 E954 8105 EE44 AF58" /* ¬2˜×âG6héT.îD¯X */
- $"13FF 573A 9F89 06C9 FB77 277E 08C9 09E9" /* .ÿW:Ÿ‰.Éûw'~.ÉÆé */
- $"B180 F96E C5AB 1E5D 3029 E229 CE1B B2AD" /* ±€ùnÅ«.]0)â)Î.²­ */
- $"BA11 DD98 0D9C 4C45 66DD 8553 3BA2 6F5B" /* º.ݘ.œLEfÝ…S;¢o[ */
- $"699B CEF3 48A7 6C31 63E6 E189 9C68 B9EC" /* i›ÎóH§l1cæቜh¹ì */
- $"A663 411F EBCB 41AB 8F7E 7EAD 87DA 5BF3" /* ¦cA.ëËA«~~­‡Ú[ó */
- $"AAC9 975B AC1F 712B F7ED DEBD 04C3 B85A" /* ªÉ—[¬.q+÷íÞ½.øZ */
- $"470D D74A B91D 0180 7BAB 4088 5671 6268" /* G.×J¹..€{«@ˆVqbh */
- $"5B4A 54FE C179 1600 7677 830B 0E81 EEB4" /* [JTþÁy..vwƒ..î´ */
- $"056E 79FF 8251 AB20 A6BC 15A5 E71F 7D4A" /* .nyÿ‚Q« ¦¼.¥ç.}J */
- $"2F6E 951A DE36 7A81 C704 9A4A F239 E1DC" /* /n•.Þ6zÇ.šJò9áÜ */
- $"FF6C DE49 B4C8 F6C1 F764 8D19 4686 DFC2" /* ÿlÞI´ÈöÁ÷d.F†ß */
- $"5C72 4A52 9784 F974 DCA4 A177 21DA 9869" /* \rJR—„ùtܤ¡w!Ú˜i */
- $"80A4 5BC6 FD54 A56B C7B1 4705 3A32 C896" /* €¤[ÆýT¥kDZG.:2È– */
- $"4539 25E5 90CC F228 B7F9 ADA5 CC2C 59CA" /* E9%åÌò(·ù­¥Ì,YÊ */
- $"D14D 4B86 9CC0 D367 7EF5 DB6D C2E1 06DB" /* ÑMK†œÀÓg~õÛmÂá.Û */
- $"58BC 0D97 DCFE 3CB1 EA45 C36F 1B60 83C9" /* X¼.—Üþ<±êEÃo.`ƒÉ */
- $"663F B883 83BA A69F 2653 0747 18C7 6D20" /* f?¸ƒƒº¦Ÿ&S.G.Çm */
- $"F2C7 6E01 47DA AB9D 2D83 D5CE 1E9C 779A" /* òÇn.GÚ«-ƒÕÎ.œwš */
- $"5FAE 6015 63DE 317A EFCA 7142 F3F8 A7E1" /* _®`.cÞ1zïÊqBóø§á */
- $"F739 60AB DF24 41BF EB6C AF15 7223 E56C" /* ÷9`«ß$A¿ël¯.r#ål */
- $"8D61 D9D1 C61F 8F8E 8435 6452 C45A 917B" /* aÙÑÆ.Ž„5dRÄZ‘{ */
- $"0856 B8BA 14E2 0A77 ABA0 E605 2E39 63EA" /* .V¸º.âÂw« æ..9cê */
- $"E7F5 4804 6535 7672 575F 37EA 9E69 1A1C" /* çõH.e5vrW_7êži.. */
- $"E380 CB7D C109 2D50 73EF 4119 54BE CBFE" /* ã€Ë}ÁÆ-PsïA.T¾Ëþ */
- $"4552 74A1 3E73 C457 1436 9DFF 3C25 8231" /* ERt¡>sÄW.6ÿ<%‚1 */
- $"2C25 ACE4 F084 E842 60E8 355D 22BE 6FEE" /* ,%¬äð„èB`è5]"¾oî */
- $"93F9 DDE6 DAED 4E44 545A FE4E 5EA4 0487" /* “ùÝæÚíNDTZþN^¤.‡ */
- $"36F1 52AF 8683 2DE8 F30B 72DE E807 2068" /* 6ñR¯†ƒ-èó.rÞè. h */
- $"742B 7262 BF7E 516C D41F CA56 9DE1 E3B8" /* t+rb¿~QlÔ.ÊVá㸠*/
- $"8D72 2993 C073 516D A343 DDE0 984D F06A" /* r)“ÀsQm£CÝà˜Mðj */
- $"CD83 D22D C161 30D7 2E9A FED4 4E85 5D2E" /* ̓Ò-Áa0×.šþÔN…]. */
- $"CF72 2181 7F23 BC37 FF83 C30D 43E0 DBC7" /* Ïr!.#¼7ÿƒÃ.CàÛÇ */
- $"A277 B4D9 4E68 1FB1 AF7B 6D8B 8F43 2A1B" /* ¢w´ÙNh.±¯{m‹C*. */
- $"9FE4 6CCC E826 C4AA 96C9 98A9 4D3B 981F" /* ŸälÌè&Ī–ɘ©M;˜. */
- $"8786 8633 89B0 2B42 4266 BC27 0098 D2B3" /* ‡††3‰°+BBf¼'.˜Ò³ */
- $"E8E4 0D2C 6E14 D34D 3613 4568 4A1E 8E5E" /* èä.,n.ÓM6.EhJ.Ž^ */
- $"E328 D89C 85D3 D8C2 C15B 3533 989F F015" /* ã(Øœ…ÓØÂÁ[53˜Ÿð. */
- $"1B49 871D 031B 2DBE D49E 880D A557 0694" /* .I‡...-¾Ôžˆ.¥W.” */
- $"60C3 47A1 CD2A 961B F73C 94A3 6B17 4268" /* `ÃG¡Í*–.÷<”£k.Bh */
- $"F766 81DC 33BC 8C1D 5571 D2D7 FB1C 9378" /* ÷fÜ3¼Œ.UqÒ×û.“x */
- $"01B7 BDCC 5DD0 9171 5FA1 50DA 7EBF 1586" /* .·½Ì]Бq_¡PÚ~¿.† */
- $"FA82 9E6F CBE4 0977 9C9C 2373 E789 5A3E" /* ú‚žoËäÆwœœ#sç‰Z> */
- $"8743 EB0E ED13 7955 DB28 2874 8065 2078" /* ‡Cë.í.yUÛ((t€e x */
- $"97A7 6C13 2283 729A CCF9 E449 A627 7652" /* —§l."ƒršÌùäI¦'vR */
- $"E821 2F1F 574E 6887 1830 6E01 5A8D 02FB" /* è!/.WNh‡.0n.Z.û */
- $"DB61 8EEF 4E08 B607 26FA 2B4C FF47 38FE" /* ÛaŽïN.¶.&ú+LÿG8þ */
- $"9B7C A3E4 DB46 F898 CFE9 8F3C 8717 2975" /* ›|£äÛFø˜Ïé<‡.)u */
- $"9BA2 582E 86D1 D882 C127 EFD7 E71A B5DD" /* ›¢X.†ÑØ‚Á'ï×ç.µÝ */
- $"7772 6391 2722 2884 AA0F 9C72 9A96 F4F8" /* wrc‘'"(„ª.œrš–ôø */
- $"BFF8 869A FD00 3B41 A8C7 DCD0 2834 270C" /* ¿ø†šý.;A¨ÇÜÐ(4'. */
- $"B93C 8702 5B16 8A32 0289 979B 0A35 3A7B" /* ¹<‡.[.Š2.‰—›Â5:{ */
- $"5870 6189 03C2 DD00 FAB2 B137 AB93 3EF5" /* Xpa‰.ÂÝ.ú²±7«“>õ */
- $"24E3 1FE1 A206 963E 1344 FE12 285A 5C52" /* $ã.á¢.–>.Dþ.(Z\R */
- $"692E D315 6C73 2CBE 7ADC 81BC EBC8 13EA" /* i.Ó.ls,¾zܼëÈ.ê */
- $"796B 6056 E9E7 D971 6E09 7086 252C 6A19" /* yk`VéçÙqnÆp†%,j. */
- $"7351 153D F4C4 FE01 6235 917F B203 171A" /* sQ.=ôÄþ.b5‘.²... */
- $"1822 B42B 9226 D163 5572 7E7E C508 BEBA" /* ."´+’&ÑcUr~~Å.¾º */
- $"D0D2 1C24 8D62 565D C183 F78D 4726 0541" /* ÐÒ.$bV]Áƒ÷G&.A */
- $"F829 10C7 1B21 E59C C4E5 7688 6268 FABC" /* ø).Ç.!åœÄåvˆbhú¼ */
- $"C0B9 6C02 8820 3F44 54A7 8C83 F14F 61B8" /* À¹l.ˆ ?DT§ŒƒñOa¸ */
- $"707C AB32 9D59 F01E D18A 37FC 40F9 5C59" /* p|«2Yð.ÑŠ7ü@ù\Y */
- $"EEA8 E442 FDC8 CA73 970F 6EE0 1348 AC8E" /* î¨äBýÈÊs—.nà.H¬Ž */
- $"9D65 4DA9 2820 AEDB A7F3 C1B4 8E3F 8780" /* eM©( ®Û§óÁ´Ž?‡€ */
- $"8DA9 F7D9 F116 DD30 778E 4FB6 49D3 AFE8" /* ©÷Ùñ.Ý0wŽO¶IÓ¯è */
- $"74B1 EB63 92B8 4210 3B22 3613 6784 41A2" /* t±ëc’¸B.;"6.g„A¢ */
- $"5953 1EFF 16A9 1769 9852 73D0 B6C2 3523" /* YS.ÿ.©.i˜RsжÂ5# */
- $"854B 1247 531D 47C5 7AFC 1B6B F0C4 2E2F" /* …K.GS.GÅzü.kðÄ./ */
- $"6C60 82C9 9C4D 2FAD 25A5 BEC6 8590 7388" /* l`‚ÉœM/­%¥¾Æ…sˆ */
- $"5D15 9A65 E013 D48B 7D9C 34B2 A617 75A8" /* ].šeà.Ô‹}œ4²¦.u¨ */
- $"8E8E 2D91 1AEC 26D5 8B9C D03C A02A A829" /* ŽŽ-‘.ì&Õ‹œÐ< *¨) */
- $"738D 9A4E 8F31 82A9 39B7 7CFE D412 810E" /* sšN1‚©9·|þÔ.. */
- $"1372 6D79 8D49 BAC1 9FFB 5D52 56AD 488F" /* .rmyIºÁŸû]RV­H */
- $"4E1D A232 7348 1FE2 483F AB9F A23C 0997" /* N.¢2sH.âH?«Ÿ¢<Æ— */
- $"678D 1AB7 7F66 8927 7DED 2A66 E03B 05C9" /* g.·.f‰'}í*fà;.É */
- $"0420 66A2 E0AE E1B9 259E 64C9 FF0E A7C7" /* . f¢à®á¹%ždÉÿ.§Ç */
- $"5E9D 69F4 DD50 394C 344E 9DA9 6BCA 3D9F" /* ^iôÝP9L4N©kÊ=Ÿ */
- $"8FA9 C156 3248 2310 8AB9 6131 B94F FF36" /* ©ÁV2H#.Š¹a1¹Oÿ6 */
- $"DF00 9E80 5713 E9AD 3B07 879E C876 E063" /* ß.ž€W.é­;.‡žÈvàc */
- $"38D8 2776 3081 5810 1760 927C D93C EE88" /* 8Ø'v0X..`’|Ù<îˆ */
- $"518B 755A EBF1 B276 C65B 98DD 1421 8AA1" /* Q‹uZëñ²vÆ[˜Ý.!Š¡ */
- $"27D2 A8B2 5E3E B7B7 8F73 CDCB 9896 D80F" /* 'Ò¨²^>··s͢–Ø. */
- $"1D50 2E28 4F54 26A9 E68F 822C 3031 0A5B" /* .P.(OT&©æ‚,01Â[ */
- $"213A 8ED8 B1B8 C32C F5EF 6784 3641 A888" /* !:ŽØ±¸Ã,õïg„6A¨ˆ */
- $"1AF9 941B E9B2 42C0 D9BE AAD7 2727 9E13" /* .ù”.é²BÀÙ¾ª×''ž. */
- $"284F A530 1F62 679B 7860 E677 9E24 3663" /* (O¥0.bg›x`æwž$6c */
- $"E7D1 E4B5 D37B C274 9ECB CFA2 CC95 8A75" /* çÑäµÓ{ÂtžËϢ̕Šu */
- $"0C3A FB7D F074 1433 5EC7 1FC4 330E F221" /* .:û}ðt.3^Ç.Ä3.ò! */
- $"AE39 4A04 097F 4B21 27CD C193 39CB 3AB2" /* ®9J.Æ.K!'ÍÁ“9Ë:² */
- $"0B6E D8E0 54EA 0F75 15F9 D75D 0D82 624D" /* .nØàTê.u.ù×].‚bM */
- $"7D19 8E11 1AD0 764F CEA8 F0FE 2913 6841" /* }.Ž..ÐvOΨðþ).hA */
- $"89B8 CA62 C997 34B9 5950 4842 4F13 1ACD" /* ‰¸ÊbÉ—4¹YPHBO..Í */
- $"39AD 30CA 4ED2 A17D 0B09 206B 9426 EF50" /* 9­0ÊNÒ¡}.Æ k”&ïP */
- $"63C6 386E 74BB BDE0 420F 6154 5260 E1A2" /* cÆ8nt»½àB.aTR`ᢠ*/
- $"8546 3192 76D1 1F38 268E 7AC6 049F 321D" /* …F1’vÑ.8&ŽzÆ.Ÿ2. */
- $"CB51 35C7 067C 961B DA2F 4BCB E065 A8DB" /* ËQ5Ç.|–.Ú/KËàe¨Û */
- $"16C9 1F05 ABAF 93FF 333A F049 3161 6838" /* .É..«¯“ÿ3:ðI1ah8 */
- $"6E1A FEF2 564C 3F48 3800 BC9C F009 AF34" /* n.þòVL?H8.¼œðƯ4 */
- $"2241 15D4 764F 4764 CEDF 6D7D 2E9C 8141" /* "A.ÔvOGdÎßm}.œA */
- $"1E00 E109 D827 DDAA A47C 2854 9229 8998" /* ..áÆØ'ݪ¤|(T’)‰˜ */
- $"9175 1FFB 496B 36C7 3695 3631 390B 06E6" /* ‘u.ûIk6Ç6•619..æ */
- $"EB0D 3BA7 F1BE A2FF 6D3A 9FB6 FCFD ADEF" /* ë.;§ñ¾¢ÿm:Ÿ¶üý­ï */
- $"EDBA 3FDB 632F EDB1 BF6D BE7E DB9F 97ED" /* íº?Ûc/í±¿m¾~ÛŸ—í */
- $"45FD AB93 F6E8 7FED A7F7 DAC3 FC34 6F43" /* Eý«“öè.í§÷ÚÃü4oC */
- $"E1DB 5507 762F DB7E 5F51 DDF5 1DFE DD07" /* áÛU.v/Û~_QÝõ.þÝ. */
- $"E1FD A67F B4E6 7EDB 8BF6 AE3F B6BC D3E4" /* áý¦.´æ~Û‹ö®?¶¼Óä */
- $"D00B 0F87 A0FF 2AC3 3F6D 84F8 7475 99F2" /* Ð..‡ ÿ*Ã?m„øtu™ò */
- $"F382 BE95 100F 8FEE C1C8 D086 E345 E973" /* 󂾕..îÁÈІãEés */
- $"0FE4 06B6 7813 7115 B8D0 D91B C698 D10D" /* .ä.¶x.q.¸ÐÙ.ƘÑ. */
- $"A370 844F 9330 E047 0201 F880 D146 6522" /* £p„O“0àG..ø€ÑFe" */
- $"8E52 12DE 3D1A 9231 5315 682E 4706 8685" /* ŽR.Þ=.’1S.h.G.†… */
- $"DA39 C538 9828 7ED0 714F 3E27 532A 3840" /* Ú9Å8˜(~ÐqO>'S*8@ */
- $"C912 3E46 8205 3243 7835 7284 12D6 CCF5" /* É.>F‚.2Cx5r„.ÖÌõ */
- $"36AF 0975 8A27 4F44 3857 B5A3 160D 1391" /* 6¯ÆuŠ'OD8Wµ£...‘ */
- $"8005 2453 86CB 51B3 E493 EA9C 707F 7047" /* €.$S†ËQ³ä“êœp.pG */
- $"1DA8 1386 91D1 6105 7D84 1563 FC52 D5D3" /* .¨.†‘Ña.}„.cüRÕÓ */
- $"EDA7 D4A0 4AC1 BB4E 49D6 62F4 CA92 CE8E" /* í§Ô JÁ»NIÖbôÊ’ÎŽ */
- $"8DE0 84DC 418D ACE2 71AD 9206 3C98 3281" /* à„ÜA¬âq­’.<˜2 */
- $"104E A1F2 8982 6ED6 223E B67B BE6A C51F" /* .N¡ò‰‚nÖ">¶{¾jÅ. */
- $"4BF8 6C35 B6A4 5EC8 87BB 4834 7CF3 16AC" /* Køl5¶¤^ȇ»H4|ó.¬ */
- $"2453 B3DA 3503 94D6 2E70 2B6F 975E 21DB" /* $S³Ú5.”Ö.p+o—^!Û */
- $"F409 0368 9A2E DFB2 7A4B 9A6F 4165 1173" /* ôÆ.hš.ß²zKšoAe.s */
- $"A53E 329A 7925 FB80 9664 2C09 A9E5 715C" /* ¥>2šy%û€–d,Æ©åq\ */
- $"E42F 8E14 EC68 05A8 D565 53C2 9C98 86A2" /* ä/Ž.ìh.¨ÕeSÂœ˜†¢ */
- $"2C2D 6443 A1D0 A619 2320 6CD3 FE48 8006" /* ,-dC¡Ð¦.# lÓþH€. */
- $"FC0F 3690 DF76 1FD8 2E16 0705 D91F EEBE" /* ü.6ßv.Ø....Ù.î¾ */
- $"E961 32B9 E252 4F0E EE4A 6F73 AEBB 014A" /* éa2¹âRO.îJos®».J */
- $"8F45 1551 9123 7C3A 13F8 1B57 EB6A 0AFB" /* E.Q‘#|:.ø.WëjÂû */
- $"9AE9 65F5 9FDE 5F1C 7C23 84F1 6DCD CC52" /* šéeõŸÞ_.|#„ñmÍÌR */
- $"97DD 03E6 C571 0C23 F06B 9F21 2E2C 79D5" /* —Ý.æÅq.#ðkŸ!.,yÕ */
- $"1827 1436 E6FB C5FB BA11 617B 9B32 3DCD" /* .'.6æûÅûº.a{›2=Í */
- $"B0AD AA8F 53D0 2F20 849C D667 9436 A677" /* °­ªSÐ/ „œÖg”6¦w */
- $"38C9 1B5A 26E2 B4D4 29BB 2D9E 56D4 652D" /* 8É.Z&â´Ô)»-žVÔe- */
- $"9A12 FC7E FBD5 0075 3EC9 64FE D0CE 06A2" /* š.ü~ûÕ.u>ÉdþÐÎ.¢ */
- $"B63F 8731 DB8A 6917 26EA CCFC C1E6 10AA" /* ¶?‡1ÛŠi.&êÌüÁæ.ª */
- $"704E 20EA 7518 0416 6BBE 2867 9470 9FE6" /* pN êu...k¾(g”pŸæ */
- $"3D2A D178 6CD1 0B7D E518 4682 FC48 EA03" /* =*ÑxlÑ.}å.F‚üHê. */
- $"EFA0 ADEE B643 CDFD 796D C309 E13B 9DD3" /* ï ­î¶CÍýymÃÆá;Ó */
- $"82CC 1237 8D6B 9CB9 0438 AF1A 6190 136E" /* ‚Ì.7kœ¹.8¯.a.n */
- $"A170 6109 4BA8 FD0B 4C10 DE61 71A9 A5FF" /* ¡paÆK¨ý.L.Þaq©¥ÿ */
- $"5AD1 3895 15D0 912A BC62 5344 A7FD 7B9B" /* ZÑ8•.Б*¼bSD§ý{› */
- $"0360 8C71 DD04 20C7 4685 E6B7 7941 7BD7" /* .`ŒqÝ. ÇF…æ·yA{× */
- $"DBBB 3F61 742B D692 AD3D B778 6442 3DD1" /* Û»?at+Ö’­=·xdB=Ñ */
- $"A97E 1312 9AF4 05C1 7B33 9FE2 B3F5 D16C" /* ©~..šô.Á{3Ÿâ³õÑl */
- $"875D 7109 13EC BB96 0664 DF60 1958 8DE5" /* ‡]qÆ.ì»–.dß`.Xå */
- $"5B3F 3E75 9D21 0415 CE9C 3172 87C7 FF05" /* [?>u!..Îœ1r‡Çÿ. */
- $"F787 4F14 E63B 4DCE 247D B3A3 475C 5336" /* ÷‡O.æ;MÎ$}³£G\S6 */
- $"C794 AF23 6415 68C6 B893 1B16 8C81 3F43" /* Ç”¯#d.hƸ“..Œ?C */
- $"C455 6EB8 8D5A 6919 4C3A D980 BFB1 3699" /* ÄUn¸Zi.L:Ù€¿±6™ */
- $"C790 C7D1 7B05 12AA 803A 172B DEF2 00CC" /* ÇÇÑ{..ª€:.+Þò.Ì */
- $"FF38 62C8 1815 1D3A F60D 2B9B 87A0 05C5" /* ÿ8bÈ...:ö.+›‡ .Å */
- $"3587 0181 8754 06D7 2CFC 78B8 0C65 D5BC" /* 5‡.‡T.×,üx¸.eÕ¼ */
- $"2903 C07C 0631 A0B9 E94E 192F DE4B 4924" /* ).À|.1 ¹éN./ÞKI$ */
- $"A4F0 BB9A 49C5 B751 38EB 7289 9806 FC5C" /* ¤ð»šIÅ·Q8ër‰˜.ü\ */
- $"D822 ED93 CA92 14B6 5056 017F 7826 CDE1" /* Ø"í“Ê’.¶PV..x&Íá */
- $"8401 9F6C A7F7 4AD5 E86F FDC3 05AF 6AE3" /* „.Ÿl§÷JÕèoýÃ.¯jã */
- $"5EED 07E3 E5ED 7EE7 FB97 0B99 E191 605B" /* ^í.ãåí~çû—.™á‘`[ */
- $"955A 6A3C 33C6 2BB8 9562 0E38 09C1 1ED9" /* •Zj<3Æ+¸•b.8ÆÁ.Ù */
- $"8914 73AF E9AA 7B2F 214E 7EEA 98E8 B976" /* ‰.s¯éª{/!N~ê˜è¹v */
- $"E058 E0B5 6DB4 5B1C F212 2C8E 0AE5 7100" /* àXàµm´[.ò.,ŽÂåq. */
- $"BC1E 84CD 0598 7CF9 EA4E 1E96 2B4A DE9E" /* ¼.„Í.˜|ùêN.–+JÞž */
- $"6CE9 E79B 0336 9059 E109 DF83 A2AE 9E74" /* léç›.6YáÆ߃¢®žt */
- $"5BB1 0236 590C 66CD 0658 ECE5 50A2 EDDD" /* [±.6Y.fÍ.XìåP¢íÝ */
- $"D7BB DAF7 548B 7F21 2A40 7821 FDA2 62B6" /* ×»Ú÷T‹.!*@x!ý¢b¶ */
- $"C862 B0B2 96CF 27D5 EC9D F5C8 42D8 F42A" /* Èb°²–Ï'ÕìõÈBØô* */
- $"5962 F21A D191 6744 1AE2 64B4 6744 A1B2" /* Ybò.Ñ‘gD.âd´gD¡² */
- $"7625 FF0D F0CF A1F8 3273 C4B8 FCCE C2BC" /* v%ÿ.ðÏ¡ø2sĸüμ */
- $"EDD5 F0C6 765F 2446 5EF5 2195 04EE C94B" /* íÕðÆv_$F^õ!•.îÉK */
- $"C9C2 4F82 0D0F 6034 3560 64A8 C372 4E17" /* ÉÂO‚..`45`d¨ÃrN. */
- $"D4F6 B2DC 2162 A6DC 9B35 5F36 628E EA58" /* Ôö²Ü!b¦Ü›5_6bŽêX */
- $"B2EF D0B8 79FF 3F60 39DC 34C9 8DD1 C7DA" /* ²ïиyÿ?`9Ü4ÉÑÇÚ */
- $"BFFD 9220 B977 42CD 1F4E 00C7 1A7B F29F" /* ¿ý’ ¹wBÍ.N.Ç.{òŸ */
- $"9738 8D5E 3E5F BA1F D4BD 0592 2006 1216" /* —8^>_º.Ô½.’ ... */
- $"D478 DE72 171A A49D 9C4A 0691 CD59 6FB3" /* ÔxÞr..¤œJ.‘ÍYo³ */
- $"F3C5 B3CD DCC8 5794 133C 85B3 176A 0C6A" /* óųÍÜÈW”.<…³.j.j */
- $"323E C74F 7CE3 4042 38AB E9CA 5700 E39B" /* 2>ÇO|ã@B8«éÊW.ã› */
- $"26D3 62B7 59F8 966D A789 35AA C72D 9943" /* &Ób·Yø–m§‰5ªÇ-™C */
- $"C884 2E53 30B3 D351 EFCC 6BF8 9889 8AB6" /* È„.S0³ÓQïÌkø˜‰Š¶ */
- $"E284 F5A4 64BD F89F 98A4 8082 6292 48EB" /* â„õ¤d½øŸ˜¤€‚b’Hë */
- $"2039 4A80 D5D7 BEFC 2DC1 69A9 F484 9B4E" /* 9J€Õ×¾ü-Ái©ô„›N */
- $"94C9 6E87 31A6 6D4E 23DB 77A9 37D5 CEE9" /* ”Én‡1¦mN#Ûw©7ÕÎé */
- $"10B5 22DB 58B2 3DFB 973A E321 F02A 2985" /* .µ"ÛX²=û—:ã!ð*)… */
- $"AE7E F964 9A23 4B8D 90FD 75F4 9944 3CEB" /* ®~ùdš#Kýuô™D<ë */
- $"C5C5 B0BA DA1C AA0A B59A EFCA 903A 972B" /* ÅÅ°ºÚ.ªÂµšïÊ:—+ */
- $"10E9 2A66 2BAB 3E63 8312 E494 A82C AEE8" /* .é*f+«>cƒ.䔨,®è */
- $"DE3B 902F 4DE5 A934 7FA5 59D8 B355 75C7" /* Þ;/Må©4.¥YسUuÇ */
- $"DC51 6208 6D60 DE89 F04A F698 FC35 5341" /* ÜQb.m`Þ‰ðJö˜ü5SA */
- $"A8C7 894B 5E8F 0638 0F21 36AB 23FF 37BF" /* ¨Ç‰K^.8.!6«#ÿ7¿ */
- $"CA6E C0CE 1C93 9BB1 FEA7 49E8 9BA5 7F32" /* ÊnÀÎ.“›±þ§I蛥.2 */
- $"4C9D C8BA 821C 1E07 F277 BE63 241C D5F6" /* LȺ‚...òw¾c$.Õö */
- $"07CB 7A98 E51E B0FC B312 223C 21BF 5DEE" /* .Ëz˜å.°ü³."<!¿]î */
- $"0229 A0EE 8B90 5918 5910 F6A6 EEB6 503D" /* .) î‹Y.Y.ö¦î¶P= */
- $"8E76 A3B6 E583 FEFF 5B3D F804 F6EE 956E" /* Žv£¶åƒþÿ[=ø.öî•n */
- $"FEE7 D95F 9D05 AE0B 4926 52B4 23C3 D17A" /* þçÙ_.®.I&R´#ÃÑz */
- $"FC0F CC41 1264 0956 8CA2 6A30 C0D0 275F" /* ü.ÌA.dÆVŒ¢j0ÀÐ'_ */
- $"0CE8 C646 CC49 EF38 CC94 8B6C 1737 9636" /* .èÆFÌIï8Ì”‹l.7–6 */
- $"4EA7 0FE7 217B F3F1 A10D 7E49 242E 6F19" /* N§.ç!{óñ¡.~I$.o. */
- $"A8CF 369A 44DE 6C99 A9D4 24DA 6909 62C3" /* ¨Ï6šDÞl™©Ô$ÚiÆbà */
- $"0C4C D4CD D80E 72E6 FF6B A90E 7080 977B" /* .LÔÍØ.ræÿk©.p€—{ */
- $"4BEB 6A2A 72BB 0574 45FB 1E12 6408 C966" /* Këj*r».tEû..d.Éf */
- $"A632 9AC7 E67D 82C9 3FED 1E27 C1FA C47A" /* ¦2šÇæ}‚É?í.'ÁúÄz */
- $"AFCF 5719 3BCA 3975 BE3A 550B 6DC9 91CC" /* ¯ÏW.;Ê9u¾:U.mÉ‘Ì */
- $"F28E 751C 1B20 E7BB 58FF 0D92 2BF7 DE26" /* òŽu.. ç»Xÿ.’+÷Þ& */
- $"DFE3 B230 78F7 C64E ADF8 7741 F45A E3BC" /* ßã²0x÷ÆN­øwAôZã¼ */
- $"5185 1323 1C74 3288 F720 5DB7 B5C9 1EFD" /* Q….#.t2ˆ÷ ]·µÉ.ý */
- $"C844 7159 7047 A9BA 6CA1 403E CE2E 3522" /* ÈDqYpG©ºl¡@>Î.5" */
- $"1088 A628 490C 5F8D 64C4 7E17 CBD3 290D" /* .ˆ¦(I._dÄ~.ËÓ). */
- $"91B1 B073 AD4A BF5B A1E9 6306 3E9A F87E" /* ‘±°s­J¿[¡éc.>šø~ */
- $"2DEC 7390 2CF5 3305 93C2 15DA 7FFF 7FC6" /* -ìs,õ3.“Â.Ú.ÿ.Æ */
- $"0578 C93E BF93 5B69 25D4 E0F9 5726 0D7E" /* .xÉ>¿“[i%ÔàùW&.~ */
- $"9C06 C76B 1BF5 3206 F26C 4F57 6A13 7488" /* œ.Çk.õ2.òlOWj.tˆ */
- $"07F4 1787 316E 19B5 2CB4 D7B8 23EE BF15" /* .ô.‡1n.µ,´×¸#î¿. */
- $"84F7 C141 CE7E 358F F83B 081D 2680 C5CB" /* „÷ÁAÎ~5ø;..&€ÅË */
- $"2002 0FFB D329 10E3 1880 E0F6 29FF 14F6" /* ..ûÓ).ã.€àö)ÿ.ö */
- $"1447 24FF 4BDD 371B 00F3 0334 6FE5 D217" /* .G$ÿKÝ7..ó.4oåÒ. */
- $"8E7D 3CCB EC04 D019 0583 0792 D4F4 59E5" /* Ž}<Ëì.Ð..ƒ.’ÔôYå */
- $"0914 52FB CE7A 2EFD B899 ED16 38FB E1D4" /* Æ.RûÎz.ý¸™í.8ûáÔ */
- $"3312 BAAE 3EF3 45B7 2A77 62F3 4787 8900" /* 3.º®>óE·*wbóG‡‰. */
- $"050D 5A64 92D3 64E7 7950 4234 FCC0 0EC6" /* ..Zd’ÓdçyPB4üÀ.Æ */
- $"004C 8652 616B B5FF 87F6 72D0 400B 9574" /* .L†Rakµÿ‡örÐ@.•t */
- $"7ADD 2EE6 F979 EE70 393F 5E65 09EC 561B" /* zÝ.æùyîp9?^eÆìV. */
- $"2FF4 F6FA 9226 2AA7 C2D2 4517 2258 15C7" /* /ôöú’&*§ÂÒE."X.Ç */
- $"D27E DE80 0000 0009 BB69 0154 3C66 FD24" /* Ò~Þ€...Æ»i.T<fý$ */
- $"D6C1 DFFC 41CF 26FD 27E3 9482 7299 C4A3" /* ÖÁßüAÏ&ý'㔂r™Ä£ */
- $"A4B0 4F99 5ED7 6507 C196 C060 D7BD 7BA6" /* ¤°O™^×e.Á–À`×½{¦ */
- $"A0A2 C1E7 0ECE 98C4 36F0 B006 0526 5FC4" /*  ¢Áç.ΘÄ6ð°..&_Ä */
- $"CDEF A25D CE59 7B6F 507F C409 957F 43E6" /* Íï¢]ÎY{oP.ÄÆ•.Cæ */
- $"20AB C4BE 33C2 E794 46B7 5341 D8C9 5487" /* «Ä¾3Âç”F·SAØÉT‡ */
- $"3000 A3E6 41BE 7D2A B553 6A8D C345 2E1E" /* 0.£æA¾}*µSjÃE.. */
- $"BF55 F536 52DD 101F D6C9 BB65 B7E4 0CFC" /* ¿Uõ6RÝ..ÖÉ»e·ä.ü */
- $"03D7 F641 F641 7A4F 8EE2 BA7A 352C ED91" /* .×öAöAzOŽâºz5,í‘ */
- $"9057 F893 C46F 62F7 A791 A8DE 8A25 BB17" /* Wø“Äob÷§‘¨ÞŠ%». */
- $"F164 F2ED 43E5 A2E2 17E9 C95D DE1C 45F4" /* ñdòíCå¢â.éÉ]Þ.Eô */
- $"3019 8090 809D D124 EE5C B48E 6C92 2A74" /* 0.€€Ñ$î\´Žl’*t */
- $"ACA0 4F0A 1777 70CF EBEC 112A 9035 16AB" /* ¬ OÂ.wpÏëì.*5.« */
- $"B36D 13D6 9F72 69CD E213 F146 6733 BAA3" /* ³m.ÖŸriÍâ.ñFg3º£ */
- $"0080 0000 0000 0000 0001 0151 0AD3 43F0" /* .€.........QÂÓCð */
- $"14A4 0000 61F0 20D9 9F3A 47FC 60A2 4780" /* .¤..að ÙŸ:Gü`¢G€ */
- $"F2D0 2A57 2C4C D349 5B9A 1BE3 0D39 80AD" /* òÐ*W,LÓI[š.ã.9€­ */
- $"72C4 873D 5028 F09E F0F5 700F B776 4B38" /* rć=P(ðžðõp.·vK8 */
- $"4FC6 7D26 AE5D 219E DDCE 4AA3 9AA9 FE19" /* OÆ}&®]!žÝÎJ£š©þ. */
- $"EC25 FEF0 0626 D259 8ECF 0364 6192 A000" /* ì%þð.&ÒYŽÏ.da’ . */
- $"0000 0000 0000 0000 0184 84B4 4FF0 1848" /* .........„„´Oð.H */
- $"4BC2 3700 0000 0000 0000 00B5 DA5E 3FF1" /* KÂ7........µÚ^?ñ */
- $"C9FC 9186 4A80 0000 0000 0000 0000 0000" /* Éü‘†J€.......... */
- $"0510 0FC3 251B 71C0 D918 64A8 0000 0000" /* ...Ã%.qÀÙ.d¨.... */
- $"0000 0000 0000 07E1 1EE1 F164 E11A 319D" /* .......á.áñdá.1 */
- $"3806 659F 8C35 7012 B17E 6096 52F0 8E96" /* 8.eŸŒ5p.±~`–RðŽ– */
- $"1438 1EBF 363A 49C9 51BD 3517 4ADA 7060" /* .8.¿6:IÉQ½5.JÚp` */
- $"0849 8F8B FCEC FD48 0000 54DF 4C0B E043" /* .I‹üìýH..TßL.àC */
- $"F3B6 1CEB 518A F2B1 5A9C 9500 0000 0000" /* ó¶.ëQŠò±Zœ•..... */
- $"0196 C058 0636 AF4B 041F 37EC DE6F 4B4E" /* .–ÀX.6¯K..7ìÞoKN */
- $"291D A2A6 3CB8 9BAC 4B0C 5017 9031 0EF1" /* ).¢¦<¸›¬K.P.1.ñ */
- $"3CF7 F63B 73A1 B4A6 9EA7 0513 C571 8EA8" /* <÷ö;s¡´¦ž§..ÅqŽ¨ */
- $"5D0A 28FC DCB6 D27A 0000 0000 0159 D076" /* ]Â(üܶÒz.....YÐv */
- $"3D1E 84A9 1C76 876E 7B6B 8519 1F9F 01C6" /* =.„©.v‡n{k…..Ÿ.Æ */
- $"1A11 B2A2 4841 4D47 5463 5D18 2AFE 54F5" /* ..²¢HAMGTc].*þTõ */
- $"591E 5FF1 39C7 C0CD 0D20 F366 59DE FE22" /* Y._ñ9ÇÀÍ. ófYÞþ" */
- $"B12C 4608 009D F105 49C8 16B5 417A 6079" /* ±,F..ñ.IÈ.µAz`y */
- $"40B0 7E7A C4B3 83B8 485D 42B1 4000 0000" /* @°~zijƒ¸H]B±@... */
- $"0E9F 0340 5469 49BB 5767 B4BE 47AF 19B3" /* .Ÿ.@TiI»Wg´¾G¯.³ */
- $"4E69 B99F 25DF C3C0 1B9C 5455 41D2 F508" /* Ni¹Ÿ%ßÃÀ.œTUAÒõ. */
- $"9900 1F13 B43E C345 C4B3 C066 8A27 C3D3" /* ™...´>ÃEijÀfŠ'ÃÓ */
- $"7A8A 6368 2F2C 3F2F 5D43 59ED 5E40 9E4F" /* zŠch/,?/]CYí^@žO */
- $"59BB 6A03 B7F8 083A 021D F8F0 79AF 43B0" /* Y»j.·ø.:..øðy¯C° */
- $"2270 F775 B8D8 FB59 371A 8B22 9F0B 55FA" /* "p÷u¸ØûY7.‹"Ÿ.Uú */
- $"C9B1 5565 0914 AA67 2D9E 81B2 60FC 1333" /* ɱUeÆ.ªg-ž²`ü.3 */
- $"318F 21E9 97E4 1400 F69E F709 7AE3 82A5" /* 1!é—ä..öž÷Æzã‚¥ */
- $"C9DE 7D16 1DF8 EDF8 FC5E DB3E FC2A F822" /* ÉÞ}..øíøü^Û>ü*ø" */
- $"886E F247 9BC1 250E 905C 4AF7 4B22 3595" /* ˆnòG›Á%.\J÷K"5• */
- $"0835 2567 EEC1 C4C8 B70D D782 6A22 C9DA" /* .5%gîÁÄÈ·.ׂj"ÉÚ */
- $"ADA3 0370 EED9 E428 E163 963A E6F0 5D4A" /* ­£.pîÙä(ác–:æð]J */
- $"F42A D11F B46D 7FBC 2D87 4274 4756 896E" /* ô*Ñ.´m.¼-‡BtGV‰n */
- $"C489 80C0 62F6 88A8 184A 79BE 3068 A9AF" /* ĉ€Àböˆ¨.Jy¾0h©¯ */
- $"D703 390B 1A76 3136 B799 726A AAA8 C23D" /* ×.9..v16·™rjª¨Â= */
- $"EEB0 E0F1 49E1 A6B7 204F 7BF3 6E44 F25E" /* î°àñIᦷ O{ónDò^ */
- $"7E0A 5125 CA89 B477 15CD 83CC CD21 C6BE" /* ~ÂQ%ʉ´w.̓ÌÍ!ƾ */
- $"F20B 99F3 C30C 5113 2E0A FF7E 1034 1BFF" /* ò.™óÃ.Q..Âÿ~.4.ÿ */
- $"0378 72CF B0EE D132 2A2D 14A9 E37F 6B10" /* .xrÏ°îÑ2*-.©ã.k. */
- $"B5CE 0500 0000 0000 0000 0160 A7E3 A715" /* µÎ.........`§ã§. */
- $"0C13 DE44 025B 9720 0000 0000 0000 0001" /* ..ÞD.[— ........ */
- $"E0F5 5A21 77FB C1F6 EAF0 244A EE78 B6FA" /* àõZ!wûÁöêð$Jîx¶ú */
- $"1769 3D98 AA28 2EB6 9826 A16B D6B8 BA89" /* .i=˜ª(.¶˜&¡kÖ¸º‰ */
- $"26C6 25C9 9E66 FD9C 6D2D FCDA FCB9 6AB2" /* &Æ%Éžfýœm-üÚü¹j² */
- $"B42A 7008 5069 CB61 D530 B47A FCFF 7F95" /* ´*p.PiËaÕ0´züÿ.• */
- $"FA58 2D11 111A 53BF FB17 59E1 63E7 0FAD" /* úX-...S¿û.Yácç.­ */
- $"B016 A862 3107 8DF0 7112 DD6A B6E3 2477" /* °.¨b1.ðq.Ýj¶ã$w */
- $"3162 94F0 6826 75B0 D0B8 4C13 21C7 E4BC" /* 1b”ðh&u°Ð¸L.!Çä¼ */
- $"FB86 7A83 DF1C A4D9 C3B4 E3DE C334 1633" /* û†zƒß.¤ÙôãÞÃ4.3 */
- $"DC27 76B9 7ADF 50CA F95E C7C9 D5EB 402C" /* Ü'v¹zßPÊù^ÇÉÕë@, */
- $"276F A0B0 D88B CF4A 0FD2 380A E3E7 2BA5" /* 'o °Ø‹ÏJ.Ò8Âãç+¥ */
- $"DD24 A247 B631 75B1 6D3A 4C60 9BAB E4C5" /* Ý$¢G¶1u±m:L`›«äÅ */
- $"BBCB 2972 36B9 AC74 5FF5 B5DB 231B 95F3" /* »Ë)r6¹¬t_õµÛ#.•ó */
- $"7CFF 8E5F 86E9 1906 B3DF 75C7 0364 6192" /* |ÿŽ_†é..³ßuÇ.da’ */
- $"A000 0000 0000 0000 0000 003B B1A0 0000" /*  ..........;± .. */
- $"0000 0000 0000 0000 0000 0016 D51B CEEA" /* ............Õ.Îê */
- $"0406 C003 4E50 C0B8 8DB2 F37C FF8E 5F86" /* ..À.NPÀ¸²ó|ÿŽ_† */
- $"E919 06B3 DF75 C703 6461 92A0 0000 0000" /* é..³ßuÇ.da’ .... */
- $"0000 0000 0000 3BB1 A000 0000 0000 0000" /* ......;± ....... */
- $"0000 0000 0000 16D5 1BCE EA04 06C0 034E" /* .......Õ.Îê..À.N */
- $"50C0 B88D B2F4 4BED 0C57 2F64 38E7 DFE6" /* PÀ¸²ôKí.W/d8çßæ */
- $"95DB 93EF B9ED 1250 6A6A A6E3 4478 1E7E" /* •Û“ï¹í.Pjj¦ãDx.~ */
- $"F105 8E1B 961B 230C 9500 0000 0000 0C18" /* ñ.Ž.–.#.•....... */
- $"0EA3 5F13 6306 E1B5 4B22 3D26 79A1 06E4" /* .£_.c.áµK"=&y¡.ä */
- $"228F F320 0B74 8820 0000 0000 0000 0007" /* "ó .tˆ ........ */
- $"9F62 443B 9A51 EAB0 7C1A A374 E7F1 52F3" /* ŸbD;šQê°|.£tçñRó */
- $"3BB8 C1E0 5919 6C04 A2E2 1032 6917 1394" /* ;¸ÁàY.l.¢â.2i..” */
- $"CCBE 472A 0652 C144 6D1E 755C ECF9 9725" /* ̾G*.RÁDm.u\ìù—% */
- $"A84A 55AE 7A0E 6730 FCA7 B6E0 FF31 08C0" /* ¨JU®z.g0ü§¶àÿ1.À */
- $"3E76 4DDC 9E24 A60B C4A7 4CDD C221 1941" /* >vMÜž$¦.ħLÝÂ!.A */
- $"0810 2DE3 206F C551 4910 77AA 762A 1FF2" /* ..-ã oÅQI.wªv*.ò */
- $"D39A 0ADC 1089 90F8 D098 1E77 BDD1 AF74" /* ÓšÂÜ.‰øИ.w½Ñ¯t */
- $"4DEF D00D 0B2C CA2F 9EDC 27C4 35F9 F924" /* MïÐ..,Ê/žÜ'Ä5ùù$ */
- $"67FF 74E5 A746 B627 6267 F6D0 9B94 22D4" /* gÿtå§F¶'bgöЛ”"Ô */
- $"5FFE DF67 A7A9 E3CA 02A5 44D1 E926 DCA4" /* _þßg§©ãÊ.¥DÑé&ܤ */
- $"7490 4AB8 E094 7037 FF7C 8CF7 2A9B B784" /* tJ¸à”p7ÿ|Œ÷*›·„ */
- $"794E 9026 D48F FF7F F013 AABF F874 63DA" /* yN&Ôÿ.ð.ª¿øtcÚ */
- $"0302 FBFA AA6A 31D5 E2DF 85F7 2ACD D98C" /* ..ûúªj1Õâß…÷*ÍÙŒ */
- $"175D 1243 F1C0 CEA2 344C B6FC ADCF C6AA" /* .].CñÀ΢4L¶ü­Ïƪ */
- $"5CAE FA82 783F 58DD 754D 5C63 A018 19F8" /* \®ú‚x?XÝuM\c ..ø */
- $"7EFE 8953 AE16 22B9 4ED7 43D2 8A0B FA52" /* ~þ‰S®."¹N×CÒŠ.úR */
- $"5703 08CA 555B E51E 307B 0565 E165 22F3" /* W..ÊU[å.0{.eáe"ó */
- $"7130 0CEC CA23 576D 8D58 BED1 FEB6 9A2F" /* q0.ìÊ#WmX¾Ñþ¶š/ */
- $"DCEA 3288 3EEC B12A D43C B191 2627 7723" /* Üê2ˆ>ì±*Ô<±‘&'w# */
- $"F40F 1B7A F1E3 9A7E 366D 7490 EE80 3570" /* ô..zñãš~6mtî€5p */
- $"CB59 D05D F384 AA96 71FE 68E8 4D32 F9D2" /* ËYÐ]󄪖qþhèM2ùÒ */
- $"48BC 7B03 EA3B 879E 2E96 671F 8098 CE76" /* H¼{.ê;‡ž.–g.€˜Îv */
- $"87D8 0336 5C88 91F4 3C69 D76B 4DEF 29DA" /* ‡Ø.6\ˆ‘ô<i×kMï)Ú */
- $"F378 1035 720A CE61 C2E3 5776 CA53 F43B" /* óx.5rÂÎaÂãWvÊSô; */
- $"4FCB 79E4 5164 1270 A23E 6048 2089 7B12" /* OËyäQd.p¢>`H ‰{. */
- $"BCA8 E157 DFD5 E879 C14C 1B1A 3431 2856" /* ¼¨áWßÕèyÁL..41(V */
- $"0E74 D87F 7691 A923 632A 5EBC 6E95 6A46" /* .tØ.v‘©#c*^¼n•jF */
- $"8E68 7118 3704 6E41 37CB C9AC 7F84 1005" /* Žhq.7.nA7Ëɬ.„.. */
- $"C308 7C90 C6E0 B56C 8CF8 3C33 A97E C46C" /* Ã.|ÆàµlŒø<3©~Äl */
- $"E373 91A9 4A3F 7331 481D 843F 0472 59DC" /* ãs‘©J?s1H.„?.rYÜ */
- $"0837 85BA 4867 C202 6BFC 7433 F093 530F" /* .7…ºHgÂ.küt3ð“S. */
- $"D721 8927 26CF AA6B B4E1 7981 FCE4 9F4E" /* ×!‰'&Ϫk´áyüäŸN */
- $"1105 9E7B 7F68 1CE7 D811 E270 FCA3 9CDE" /* ..ž{.h.çØ.âpü£œÞ */
- $"BFE6 48BA AC07 B55E 4E7F 5946 115B B1DC" /* ¿æHº¬.µ^N.YF.[±Ü */
- $"F694 3A9B EADD 7971 E0F1 B6E1 C6FF 4337" /* ö”:›êÝyqàñ¶áÆÿC7 */
- $"F543 A074 FC74 AD1F 45BF 7867 C472 7605" /* õC tüt­.E¿xgÄrv. */
- $"1786 E496 2D22 22BE 5760 9ACE A5C9 22B9" /* .†ä–-""¾W`šÎ¥É"¹ */
- $"9A14 4136 93E4 3E4A 715C 6F69 8447 5764" /* š.A6“ä>Jq\oi„GWd */
- $"D761 77A8 2C3F E200 ACAD 8331 11D0 ABE6" /* ×aw¨,?â.¬­ƒ1.Ыæ */
- $"EA7B 5A22 58CF 097E 732F 894B E99C 6BAF" /* ê{Z"XÏÆ~s/‰Kéœk¯ */
- $"B36C 68AA 5668 EF92 66E9 DDF9 FF78 DB89" /* ³lhªVhï’féÝùÿxÛ‰ */
- $"FC78 2032 99D9 62F0 1380 3FE8 41DF F341" /* üx 2™Ùbð.€?èAßóA */
- $"F1FD 7F08 CE2E F09A 9335 6735 0FAD 8093" /* ñý..Î.ðš“5g5.­€“ */
- $"B6B1 53A2 964F EA7E 72A2 9A29 794D 98F0" /* ¶±S¢–Oê~r¢š)yM˜ð */
- $"DD57 AE65 C61E DDEC BDB4 35C2 D050 E063" /* ÝW®eÆ.Ýì½´5ÂÐPàc */
- $"5F54 BCA5 928D 786D CAE3 8F96 BFEB 027E" /* _T¼¥’xmÊã–¿ë.~ */
- $"6BBC 8795 7C88 1A2C 9908 36A1 6CAB 9268" /* k¼‡•|ˆ.,™.6¡l«’h */
- $"EB0D 816F F34D 55F5 B562 BCFF 4190 EE42" /* ë.oóMUõµb¼ÿAîB */
- $"F195 E7F3 E220 7E51 74A2 FA23 23F7 20F0" /* ñ•çóâ ~Qt¢ú##÷ ð */
- $"985F 011C 34B8 C988 C519 C623 81BC D026" /* ˜_..4¸ÉˆÅ.Æ#¼Ð& */
- $"A8C5 B82C 7A7F 86F7 E60E 44F2 CD53 6FAB" /* ¨Å¸,z.†÷æ.DòÍSo« */
- $"2D69 1FD4 75B7 A011 80E7 09B3 B9CF 4503" /* -i.Ôu· .€çƳ¹ÏE. */
- $"F4A5 1DE3 AE8A 96F7 E245 0DF9 3859 24FA" /* ô¥.㮊–÷âE.ù8Y$ú */
- $"7B43 665F B15E D4D3 FB2A 666E FB6A 6CA8" /* {Cf_±^ÔÓû*fnûjl¨ */
- $"9CAF C052 D658 6DC3 BDD1 C752 21FA 6426" /* œ¯ÀRÖXmýÑÇR!úd& */
- $"857C D05D 41C2 0241 306C 6FD4 81E3 69F7" /* …|Ð]AÂ.A0loÔãi÷ */
- $"A6F5 227F 39F9 780E 829A 17A9 C649 2BF5" /* ¦õ".9ùx.‚š.©ÆI+õ */
- $"01DD E500 A973 E599 890C A548 CE34 2877" /* .Ýå.©s噉.¥HÎ4(w */
- $"D160 A2EE 4B3B CC7A 0C87 6723 51FD C222" /* Ñ`¢îK;Ìz.‡g#QýÂ" */
- $"9BFB E72D 2769 6250 2054 22C9 ABB2 3125" /* ›ûç-'ibP T"É«²1% */
- $"7DA0 73A3 C083 1AAD 90F2 F0A8 C22D 9DF5" /* } s£Àƒ.­òð¨Â-õ */
- $"3FFB 6B56 18BE 61A6 B198 F1BC 1E4E 0CFE" /* ?ûkV.¾a¦±˜ñ¼.N.þ */
- $"B323 8275 A644 CAC4 D36B 9AF9 FCC8 5DEC" /* ³#‚u¦DÊÄÓkšùüÈ]ì */
- $"292B CC9B A0B6 9148 09DF E46D 1B2C 4EDF" /* )+Ì› ¶‘HÆßäm.,Nß */
- $"EDB9 2DB4 BAD5 C50B 2115 C476 E09A F407" /* í¹-´ºÕÅ.!.Ävàšô. */
- $"5EE8 2E9F 870F A319 32D4 EBEC CB7B FDE9" /* ^è.Ÿ‡.£.2ÔëìË{ýé */
- $"FB5C 0D41 61F3 BA97 0F9E 558F 6E39 C213" /* û\.Aaóº—.žUn9Â. */
- $"3101 A5E8 ECEC 15E5 4F29 F69A 58CD D82D" /* 1.¥èìì.åO)öšXÍØ- */
- $"986E E8E0 6898 17CC 98C4 C851 AC75 9306" /* ˜nèàh˜.̘ÄÈQ¬u“. */
- $"5241 0350 E2EB 38CA 1682 6132 FF45 578A" /* RA.Pâë8Ê.‚a2ÿEWŠ */
- $"FA7F 7557 AC2C 9A18 3835 A62B 7D09 0992" /* ú.uW¬,š.85¦+}ÆÆ’ */
- $"EF78 BD49 5317 373A B07D 6420 DC30 5067" /* ïx½IS.7:°}d Ü0Pg */
- $"A659 F316 4436 8E8E 9786 1163 A6A5 B841" /* ¦Yó.D6ŽŽ—†.c¦¥¸A */
- $"99AA 4E1C 6163 309A 3C23 0208 FF4B 2967" /* ™ªN.ac0š<#..ÿK)g */
- $"B7F7 37E4 A337 D0DC C48A A742 FB2D C529" /* ·÷7ä£7ÐÜÄŠ§Bû-Å) */
- $"BC6C 5BBE BC5C 03B1 F87F D7EA F5AC B94B" /* ¼l[¾¼\.±ø.×êõ¬¹K */
- $"5A88 84AB E44E BE6A F337 96B0 7CB6 1140" /* Zˆ„«äN¾jó7–°|¶.@ */
- $"25CB 45D6 BE02 A9D4 7868 1EDD F660 7963" /* %ËEÖ¾.©Ôxh.Ýö`yc */
- $"B438 C030 3EA5 51FA F451 FA84 A6FF 2E5A" /* ´8À0>¥QúôQú„¦ÿ.Z */
- $"EA95 2300 C0F4 39AA 42BA 4120 4EEC AFDD" /* ê•#.Àô9ªBºA Nì¯Ý */
- $"20B4 6C42 0552 1177 6F1A AC6D FE8B 98E1" /* ´lB.R.wo.¬mþ‹˜á */
- $"D3FB F52E BCE3 5BB1 7235 F597 3E0D 8C46" /* Óûõ.¼ã[±r5õ—>.ŒF */
- $"7361 1E2A C081 CA97 C8EA CD3F E91D 823F" /* sa.*ÀÊ—ÈêÍ?é.‚? */
- $"73A7 5EA1 F641 9CBD 219D D7E4 EE0D 270E" /* s§^¡öAœ½!×äî.'. */
- $"14DF F756 B4E5 062C 8251 4AD0 B090 A0AF" /* .ß÷V´å.,‚QJа ¯ */
- $"CD2A 3C80 6068 C9CD C3D7 3D7F 258B 365A" /* Í*<€`hÉÍÃ×=.%‹6Z */
- $"5E1A 90DC D058 4ED9 DF50 6F40 07A9 2BDE" /* ^.ÜÐXNÙßPo@.©+Þ */
- $"8486 5404 AB9C E323 0C4E D3DB 8352 0C0F" /* „†T.«œã#.NÓÛƒR.. */
- $"CD59 A5F5 56CC 0BB2 B603 85C3 C709 7D6E" /* ÍY¥õVÌ.²¶.…ÃÇÆ}n */
- $"A10E 33C2 AE0F D52F 5AD7 2279 E6EB 7E6C" /* ¡.3®.Õ/Z×"yæë~l */
- $"1757 589D C6DC B4FD 470C FFD9" /* .WXÆÜ´ýG.ÿÙ */
-};
-
diff --git a/indra/newview/installers/darwin/publicnightly-dmg/_DS_Store b/indra/newview/installers/darwin/publicnightly-dmg/_DS_Store
deleted file mode 100644
index 495ec37f53..0000000000
--- a/indra/newview/installers/darwin/publicnightly-dmg/_DS_Store
+++ /dev/null
Binary files differ
diff --git a/indra/newview/installers/darwin/publicnightly-dmg/_VolumeIcon.icns b/indra/newview/installers/darwin/publicnightly-dmg/_VolumeIcon.icns
deleted file mode 100644
index da5307e389..0000000000
--- a/indra/newview/installers/darwin/publicnightly-dmg/_VolumeIcon.icns
+++ /dev/null
Binary files differ
diff --git a/indra/newview/installers/darwin/publicnightly-dmg/background.jpg b/indra/newview/installers/darwin/publicnightly-dmg/background.jpg
deleted file mode 100644
index 55294dcc9a..0000000000
--- a/indra/newview/installers/darwin/publicnightly-dmg/background.jpg
+++ /dev/null
Binary files differ
diff --git a/indra/newview/installers/darwin/release-dmg/_DS_Store b/indra/newview/installers/darwin/release-dmg/_DS_Store
index 8f6c25c2f4..747ca961d8 100644
--- a/indra/newview/installers/darwin/release-dmg/_DS_Store
+++ b/indra/newview/installers/darwin/release-dmg/_DS_Store
Binary files differ
diff --git a/indra/newview/installers/darwin/releasecandidate-dmg/Applications-alias.r b/indra/newview/installers/darwin/releasecandidate-dmg/Applications-alias.r
deleted file mode 100644
index aa3cfb87d8..0000000000
--- a/indra/newview/installers/darwin/releasecandidate-dmg/Applications-alias.r
+++ /dev/null
@@ -1,6996 +0,0 @@
-data 'alis' (0) {
- $"0000 0000 0112 0002 0001 036D 6277 0000" /* ...........mbw.. */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 C135 A717 482B 0000 0000" /* ......Á5§.H+.... */
- $"0002 0C41 7070 6C69 6361 7469 6F6E 7300" /* ...Applications. */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 00E2 4F18 C2E8 9FB0 0000 0000 0000" /* ...âO.Â蟰...... */
- $"0000 FFFF FFFF 0000 0920 0000 0000 0000" /* ..ÿÿÿÿ..Æ ...... */
- $"0000 0000 0000 0000 0003 6D62 7700 0010" /* ..........mbw... */
- $"0008 0000 C136 0987 0000 0011 0008 0000" /* ....Á6Ƈ........ */
- $"C2E9 0220 0000 0001 0000 0002 0010 6D62" /* Âé. ..........mb */
- $"773A 4170 706C 6963 6174 696F 6E73 000E" /* w:Applications.. */
- $"001A 000C 0041 0070 0070 006C 0069 0063" /* .....A.p.p.l.i.c */
- $"0061 0074 0069 006F 006E 0073 000F 0008" /* .a.t.i.o.n.s.... */
- $"0003 006D 0062 0077 0012 000C 4170 706C" /* ...m.b.w....Appl */
- $"6963 6174 696F 6E73 0013 0001 2F00 FFFF" /* ications..../.ÿÿ */
- $"0000" /* .. */
-};
-
-
-data 'icns' (-16455) {
- $"6963 6E73 0001 B3AC 6973 3332 0000 0224" /* icns..³¬is32...$ */
- $"9F00 005F 8061 005D 8700 055D 9AA2 A0A4" /* Ÿ.._€a.]‡..]š¢ ¤ */
- $"8986 0008 557D B3B2 B1B3 A881 8081 8104" /* ‰†..U}³²±³¨€. */
- $"826F 577E AF82 A801 B3AE 82AD 03AF 7B7A" /* ‚oW~¯‚¨.³®‚­.¯{z */
- $"A781 A203 9EB7 C89D 81A2 03A6 776E 9A80" /* §¢.ž·È¢.¦wnš€ */
- $"9705 959F D3DC A295 8097 5899 6C67 8F8D" /* —.•ŸÓÜ¢•€—X™lg */
- $"8E89 85C9 BCA9 C883 898D 8D8E 6561 8585" /* Ž‰…ɼ©Èƒ‰Žea…… */
- $"83A8 B7F3 BAB4 DFB6 AA84 8585 605E 7B7D" /* ƒ¨·óº´ß¶ª„……`^{} */
- $"79D0 F9E0 F0F2 DAE1 D87C 7D7B 5D5B 7476" /* yÐùàðòÚáØ|}{][tv */
- $"7099 D876 7373 76CA 8A72 7673 5B5A 6D70" /* p™ØvssvÊŠrvs[Zmp */
- $"6B9B 816C 6F6F 67B3 C567 706C 5A59 686B" /* k›loog³ÅgplZYhk */
- $"6B67 686B 806A 056B 6F6A 6B67 5A88 5900" /* kghk€j.kojkgZˆY. */
- $"5882 598A 5801 0059 9F00 0482 8383 8480" /* X‚YŠX..YŸ..‚ƒƒ„€ */
- $"8700 057F B7BE BDC0 A786 0008 799E D0CE" /* ‡...·¾½À§†..yžÐÎ */
- $"CECF C5A1 A081 A105 A390 7AA0 D0CA 80C9" /* ÎÏÅ¡ ¡.£z ÐÊ€É */
- $"01CA D183 CE03 D09C 9ECD 81C9 03C7 D4DE" /* .ÊуÎ.ÐœžÍÉ.ÇÔÞ */
- $"C681 C903 CD9A 94C5 80C2 05C1 C6E3 E9C8" /* ÆÉ.Íš”Å€Â.ÁÆãéÈ */
- $"C180 C20D C491 8DBD BBBC B9B6 DDD7 CCDD" /* Á€Â.Ä‘½»¼¹¶Ý×ÌÝ */
- $"B5B9 80BC 468B 87B4 B4B3 C8D1 F7D3 CFEA" /* µ¹€¼F‹‡´´³ÈÑ÷ÓÏê */
- $"D0C9 B4B4 B385 83AA ABA9 E0FB EAF5 F6E5" /* ÐÉ´´³…ƒª«©àûêõöå */
- $"EAE5 AAAB A981 80A0 A39E BAE4 A2A0 A1A2" /* ê媫©€ £žºä¢ ¡¢ */
- $"DAAF 9FA3 9F7F 7E97 9B97 B8A6 979A 9A94" /* Ú¯Ÿ£Ÿ.~—›—¸¦—šš” */
- $"CAD6 949B 977D 7D90 9493 9091 8293 0496" /* ÊÖ”›—}}”“‘‚“.– */
- $"9294 907D 8E7C 8A7B 0100 7C9F 0000 7A80" /* ’”}Ž|Š{..|Ÿ..z€ */
- $"7C00 7887 0005 77B1 B8B7 BBA0 8600 0871" /* |.x‡..w±¸·» †..q */
- $"97CB C9C8 CAC0 9B99 819A 049C 8972 99CA" /* —ËÉÈÊÀ›™š.œ‰r™Ê */
- $"82C3 00CB 83C8 03CA 9596 C681 C203 BFCF" /* ‚Ã.˃È.Ê•–ÆÂ.¿Ï */
- $"DABF 81C2 03C6 938C BD80 BA05 B9BF E0E7" /* Ú¿Â.Æ“Œ½€º.¹¿àç */
- $"C1B9 80BA 57BC 8985 B5B3 B3B0 ADD9 D2C6" /* Á¹€ºW¼‰…µ³³°­ÙÒÆ */
- $"D9AC B0B3 B3B4 827F ACAB AAC2 CCF6 CECA" /* Ù¬°³³´‚.¬«ªÂÌöÎÊ */
- $"E8CB C3AB ACAA 7D7B A1A3 A0DD FAE9 F4F5" /* èË묪}{¡£ Ýúéôõ */
- $"E3E8 E3A2 A3A0 7A78 989B 96B3 E29A 9898" /* ãè㢣 zx˜›–³âš˜˜ */
- $"9AD7 A897 9B97 7776 8F93 8FB2 9F8F 9292" /* š×¨—›—wv“²Ÿ’’ */
- $"8BC5 D28C 938F 7575 888C 8B89 8982 8B04" /* ‹ÅÒŒ“uuˆŒ‹‰‰‚‹. */
- $"8F8A 8C88 758E 748A 7301 0074 7338 6D6B" /* ŠŒˆuŽtŠs..ts8mk */
- $"0000 0108 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 1E24 2424 1600 0000 0000" /* .......$$$...... */
- $"0000 0000 0011 BDC8 C8C8 9600 0000 0000" /* ......½ÈÈÈ–..... */
- $"0000 0000 048C FFFF FFFF F5A7 9C9E 9E9E" /* .....Œÿÿÿÿõ§œžžž */
- $"9E9E 6003 8AFF FCFC FCFC FEFF FFFF FFFF" /* žž`.Šÿüüüüþÿÿÿÿÿ */
- $"FFFF FF7A 89FF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿz‰ÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FF7A 73FF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿzsÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FF64 62FF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿdbÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FF53 53FF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿSSÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FF45 48FF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿEHÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FF3C 41FF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿ<Aÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FD35 3DFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿý5=ÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FA30 3CFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿú0<ÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FB2F 1247 4B4A 4A4A 4A4A 4A4A 4A4A" /* ÿÿû/.GKJJJJJJJJJ */
- $"4A4B 450F 0101 0201 0101 0101 0101 0101" /* JKE............. */
- $"0102 0001 696C 3332 0000 05AB FF00 BE00" /* ....il32...«ÿ.¾. */
- $"025A 7881 847F 0064 9200 0262 BBC4 83C2" /* .Zx„..d’..b»ÄƒÂ */
- $"02C7 8451 9000 0255 86BF 84BC 03BF A064" /* .Ç„Q..U†¿„¼.¿ d */
- $"6389 6400 6281 0003 5770 A2A2 85A1 01A3" /* c‰d.b..Wp¢¢…¡.£ */
- $"9D89 9B07 9C97 6758 005B 95AC 88A7 02A8" /* ‰›.œ—gX.[•¬ˆ§.¨ */
- $"A4A7 89A8 05AB 925A 61A7 AE88 AC03 ABCA" /* ¤§‰¨.«’Za§®ˆ¬.«Ê */
- $"AEAB 88AC 05AE A15E 5B9A A788 A503 A0D7" /* ®«ˆ¬.®¡^[š§ˆ¥. × */
- $"D79F 88A5 05A8 9559 5990 A288 9F04 9BAB" /* ןˆ¥.¨•YY¢ˆŸ.›« */
- $"FBAE 9C87 9F05 A28B 5857 879D 879A 0595" /* û®œ‡Ÿ.¢‹XW‡‡š.• */
- $"BDD6 E6E3 9487 9A05 9D82 5656 7F97 8594" /* ½Öæ㔇š.‚VV.—…” */
- $"0995 8FB3 F4CF B1FF AD90 9585 9405 977A" /* Æ•³ôϱÿ­•…”.—z */
- $"0000 7793 8690 078D CDF8 B886 E8E5 8B86" /* ..w“†.Íø¸†è勆 */
- $"9005 9372 0000 708F 828C 808B 0984 BBF7" /* .“r..p‚Œ€‹Æ„»÷ */
- $"C687 85AB FFA9 8580 8B82 8C05 8E6D 0000" /* Ƈ…«ÿ©…€‹‚Œ.Žm.. */
- $"6B8A 8287 0D88 8785 8FF3 FDA1 8186 84E5" /* kŠ‚‡.ˆ‡…óý¡†„å */
- $"E484 8684 8705 8868 0000 6685 8183 117E" /* 䄆„‡.ˆh..f…ƒ.~ */
- $"B3E3 D0D2 FFDC D4DF DDDB D2FD D0DE E2B7" /* ³ãÐÒÿÜÔßÝÛÒýÐÞâ· */
- $"8082 8304 6400 0062 8081 7F06 76C5 FFDB" /* €‚ƒ.d..b€..vÅÿÛ */
- $"F9F3 E381 FF06 F6D4 BFF4 FFD3 7882 7F03" /* ùóãÿ.öÔ¿ôÿÓx‚.. */
- $"6100 005F 827B 0675 B0D9 E1FF C8D8 82DF" /* a.._‚{.u°ÙáÿÈØ‚ß */
- $"05BF F3C9 DCB9 7681 7B04 7A5E 0000 5C82" /* .¿óÉܹv{.z^..\‚ */
- $"7706 786F 96FF E879 7281 7306 7278 C8C2" /* w.xo–ÿèyrs.rxÈÂ */
- $"7074 7880 7706 7875 5C00 005A 7382 7405" /* ptx€w.xu\..Zs‚t. */
- $"71C1 E19A 6D74 8173 0574 6BA2 FFAD 6C81" /* qÁášmts.tk¢ÿ­l */
- $"7406 7571 5B00 005A 6F81 7104 6F77 F2AF" /* t.uq[..Zoq.owò¯ */
- $"6984 7105 6E7E FAFB 836D 8071 0772 6D5A" /* i„q.n~úûƒm€q.rmZ */
- $"0000 586C 6F80 6E03 6C7B 9368 866E 0467" /* ..Xlo€n.l{“h†n.g */
- $"C3FA 8B69 806E 076F 6A59 0000 586A 6E81" /* Ãú‹i€n.ojY..Xjn */
- $"6D01 6C68 876D 036B 717D 6B81 6D07 6E69" /* m.lh‡m.kq}km.ni */
- $"5900 0058 666A 8E69 0168 6682 6903 6A65" /* Y..XfjŽi.hf‚i.je */
- $"5900 BD59 0000 9B59 9E00 FF00 BE00 027D" /* Y.½Y..›Yž.ÿ.¾..} */
- $"98A0 829E 029F 9E85 9200 0284 D5DE 83DC" /* ˜ ‚ž.Ÿž…’..„ÕÞƒÜ */
- $"02E0 A275 9000 0279 A7DB 84D8 03DB BD87" /* .à¢u..y§Û„Ø.Û½‡ */
- $"8689 8700 8581 0003 7A92 C0C0 85BF 01C0" /* †‰‡.…..z’ÀÀ…¿.À */
- $"BB89 B907 BAB4 887B 007E B7CC 88C7 01C8" /* »‰¹.º´ˆ{.~·ÌˆÇ.È */
- $"C68A C805 CBB2 7C84 CAD1 89CF 02DE CFCE" /* ÆŠÈ.˲|„ÊщÏ.ÞÏÎ */
- $"88CF 05D2 C380 7FBF CC88 CA03 C7E8 E5C6" /* ˆÏ.ÒÀ.¿ÌˆÊ.ÇèåÆ */
- $"88CA 05CD B87C 7CB7 CA88 C704 C4CD FCCD" /* ˆÊ.͸||·ÊˆÇ.ÄÍüÍ */
- $"C587 C705 CAB0 7A7A AFC7 87C4 05C1 D4E3" /* ŇÇ.Ê°zz¯Ç‡Ä.ÁÔã */
- $"F0ED C087 C405 C8A8 7979 A7C4 85C0 09C1" /* ðíÀ‡Ä.Ȩyy§Ä…ÀÆÁ */
- $"BDD0 F7E1 D1FF CDBE C185 C005 C4A1 0000" /* ½Ð÷áÑÿ;Á…À.Ä¡.. */
- $"A0C1 86BD 07BA DEFB D5B7 F2EE B986 BD05" /*  Á†½.ºÞûÕ·ò½. */
- $"C09A 0000 9ABE 85BA 09B6 D4F9 DBB8 B6CD" /* Àš..š¾…ºÆ¶ÔùÛ¸¶Í */
- $"FFCA B785 BA05 BD94 0000 94B9 83B6 0EB4" /* ÿÊ·…º.½”..”¹ƒ¶.´ */
- $"B3B9 F7FE C4B0 B4B2 EFED B2B4 B4B5 82B6" /* ³¹÷þÄ°´²ïí²´´µ‚¶ */
- $"05B8 8F00 008E B481 B211 AFCD EBDF E0FF" /* .¸..Ž´².¯Íëßàÿ */
- $"E8E2 E9E8 E6E0 FEDF E8EA D0B0 81B2 05B3" /* èâéèæàþßèêа².³ */
- $"8A00 0089 AF81 AD06 A8D9 FFE7 FBF7 EB81" /* Š..‰¯­.¨Ùÿçû÷ë */
- $"FF06 F9E1 D3F8 FFE3 A980 AD05 AEAD 8600" /* ÿ.ùáÓøÿã©€­.®­†. */
- $"0086 82A9 06A5 CBE5 EAFF DAE5 82EA 05D3" /* .†‚©.¥ËåêÿÚå‚ê.Ó */
- $"F7DA E8D1 A680 A906 AAA7 8300 0082 A382" /* ÷ÚèѦ€©.ª§ƒ..‚£‚ */
- $"A405 9FB7 FFF0 A5A1 81A2 05A1 A5D9 D39F" /* ¤.Ÿ·ÿ𥡢.¡¥ÙÓŸ */
- $"A281 A406 A5A1 8000 0080 9F82 A004 9ED2" /* ¢¤.¥¡€..€Ÿ‚ .žÒ */
- $"E9BA 9B83 A004 9ABF FFC5 9A81 A007 A19C" /* 麛ƒ .š¿ÿÅš .¡œ */
- $"7F00 007E 999D 809B 059A 9FF6 C696 9C83" /* ...~™€›.šŸöÆ–œƒ */
- $"9B05 99A4 FBFB A799 809B 079C 977D 0000" /* ›.™¤ûû§™€›.œ—}.. */
- $"7C95 9980 9803 97A1 B295 8698 0494 D5FC" /* |•™€˜.—¡²•†˜.”Õü */
- $"AC95 8098 0799 937C 0000 7C93 9782 9600" /* ¬•€˜.™“|..|“—‚–. */
- $"9387 9603 9599 A295 8196 0797 917C 0000" /* “‡–.•™¢•–.—‘|.. */
- $"7B8E 928D 9102 9290 8F82 9103 928C 7B00" /* {Ž’‘.’‚‘.’Œ{. */
- $"BD7C 0000 9B7C 9E00 FF00 BE00 0275 9199" /* ½|..›|ž.ÿ.¾..u‘™ */
- $"8498 007E 9200 027D D0D9 83D7 02DB 9B6C" /* „˜.~’..}ÐÙƒ×.Û›l */
- $"9000 0271 A0D5 84D2 03D5 B67F 7E89 7F00" /* ..q Õ„Ò.Õ¶.~‰.. */
- $"7D81 0003 728B BBBB 85BA 02BB B6B3 88B4" /* }..r‹»»…º.»¶³ˆ´ */
- $"08B5 AF81 7300 76B0 C6C2 87C1 01C2 C089" /* .µ¯s.v°Æ‡Á.ÂÀ‰ */
- $"C206 C3C5 AB75 7CC3 CA89 C801 DBC9 89C8" /* Â.ÃÅ«u|ÃʉÈ.ÛÉ‰È */
- $"05CB BD78 77B9 C588 C304 C0E5 E2BF C487" /* .˽xw¹ÅˆÃ.Àåâ¿Ä‡ */
- $"C305 C6B2 7574 B0C3 87C0 05BF BCC7 FCC7" /* Ã.Ʋut°Ã‡À.¿¼ÇüÇ */
- $"BE87 C005 C3A9 7272 A7BF 87BC 05B9 D0E1" /* ¾‡À.érr§¿‡¼.¹Ðá */
- $"EEEB B887 BC05 C0A1 7171 A0BC 86B8 07B5" /* î븇¼.À¡qq ¼†¸.µ */
- $"CBF6 DDCB FFC7 B586 B805 BB99 0000 98B9" /* ËöÝËÿǵ†¸.»™..˜¹ */
- $"86B5 07B2 DBFA D0AE F0EC B186 B505 B892" /* †µ.²ÛúЮð챆µ.¸’ */
- $"0000 91B5 82B2 80B1 09AC D0F9 D7AF ADC7" /* ..‘µ‚²€±Æ¬Ðùׯ­Ç */
- $"FFC4 AD80 B182 B205 B48C 0000 8BB1 81AD" /* ÿÄ­€±‚².´Œ..‹±­ */
- $"11AE ADAC ABB1 F6FD BDA8 ABAA EDEB A9AB" /* .®­¬«±öý½¨«ªíë©« */
- $"ACAC AE81 AD05 AF87 0000 86AB 81A9 11A6" /* ¬¬®­.¯‡..†«©.¦ */
- $"C8E9 DCDE FFE5 DFE7 E6E4 DDFE DCE6 E9CB" /* ÈéÜÞÿåßçæäÝþÜæéË */
- $"A781 A905 AA82 0000 81A6 81A5 069F D6FF" /* §©.ª‚..¦¥.ŸÖÿ */
- $"E4FA F6EA 81FF 06F8 DFCF F7FF E0A0 80A5" /* äúöêÿ.øßÏ÷ÿà €¥ */
- $"05A6 A47E 0000 7D82 A006 9BC6 E3E8 FFD6" /* .¦¤~..}‚ .›ÆãèÿÖ */
- $"E282 E805 CFF6 D7E6 CC9C 80A0 06A1 9E7B" /* â‚è.Ïö×æÌœ€ .¡ž{ */
- $"0000 7A9B 829C 0496 B1FF EF9D 8399 049C" /* ..z›‚œ.–±ÿ.œ */
- $"D6D0 969A 819C 069D 9979 0000 7897 8198" /* ÖЖšœ.™y..x—˜ */
- $"0597 95CF E7B4 9283 9704 91BA FFC0 9181" /* .—•Ïç´’ƒ—.‘ºÿÀ‘ */
- $"9807 9994 7700 0076 9295 8094 0493 98F5" /* ˜.™”w..v’•€”.“˜õ */
- $"C28E 8494 0592 9DFB FBA0 9180 9407 958F" /* ÂŽ„”.’ûû ‘€”.• */
- $"7500 0074 8E91 8090 038F 9AAC 8C86 9004" /* u..tŽ‘€.š¬Œ†. */
- $"8BD1 FBA6 8C80 9007 918B 7400 0074 8B8F" /* ‹Ñû¦Œ€.‘‹t..t‹ */
- $"808E 048F 8E8B 8E8F 848E 048F 8D91 9B8D" /* €Ž.Ž‹Ž„Ž.‘› */
- $"818E 078F 8974 0000 7487 8B8E 8A01 8987" /* Ž.‰t..t‡‹ŽŠ.‰‡ */
- $"828A 038B 8574 00BD 7400 009B 749E 006C" /* ‚Š.‹…t.½t..›tž.l */
- $"386D 6B00 0004 0800 0000 0000 0000 0000" /* 8mk............. */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0B76 8889 8989" /* ...........vˆ‰‰‰ */
- $"8989 8988 3800 0000 0000 0000 0000 0000" /* ‰‰‰ˆ8........... */
- $"0000 0000 0000 0000 0000 36FF FFFF FFFF" /* ..........6ÿÿÿÿÿ */
- $"FFFF FFFF A301 0000 0000 0000 0000 0000" /* ÿÿÿÿ£........... */
- $"0000 0000 0000 0000 0006 A4FF FFFF FFFF" /* ..........¤ÿÿÿÿÿ */
- $"FFFF FFFF DE59 3F40 4040 4040 4040 4040" /* ÿÿÿÿÞY?@@@@@@@@@ */
- $"4040 4033 0000 0000 1384 F8F3 F3F3 F3F3" /* @@@3.....„øóóóóó */
- $"F3F3 F3F3 F7F9 F7F7 F7F7 F7F7 F7F7 F7F7" /* óóóó÷ù÷÷÷÷÷÷÷÷÷÷ */
- $"F7F7 F7F1 520D 001D E1FF FAFB FBFB FBFB" /* ÷÷÷ñR...áÿúûûûûû */
- $"FBFB FBFB FBFB FBFB FBFB FBFB FBFB FBFB" /* ûûûûûûûûûûûûûûûû */
- $"FBFB FBFB FFCD 0E39 FFFF FFFF FFFF FFFF" /* ûûûûÿÍ.9ÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFF8 1F26 F6FF FFFF FFFF FFFF" /* ÿÿÿÿÿø.&öÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFE5 1318 ECFF FFFF FFFF FFFF" /* ÿÿÿÿÿå..ìÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFD5 0A0F DDFF FFFF FFFF FFFF" /* ÿÿÿÿÿÕÂ.Ýÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFC6 0206 D0FF FFFF FFFF FFFF" /* ÿÿÿÿÿÆ..Ðÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFB6 0000 C2FF FFFF FFFF FFFF" /* ÿÿÿÿÿ¶..Âÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFA5 0000 B2FF FFFF FFFF FFFF" /* ÿÿÿÿÿ¥..²ÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FF95 0000 A4FF FFFF FFFF FFFF" /* ÿÿÿÿÿ•..¤ÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FF87 0000 96FF FFFF FFFF FFFF" /* ÿÿÿÿÿ‡..–ÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FF7A 0000 8AFF FFFF FFFF FFFF" /* ÿÿÿÿÿz..Šÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FF6D 0000 7FFF FFFF FFFF FFFF" /* ÿÿÿÿÿm...ÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FF63 0000 77FF FFFF FFFF FFFF" /* ÿÿÿÿÿc..wÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FF5A 0000 6FFF FFFF FFFF FFFF" /* ÿÿÿÿÿZ..oÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FF54 0000 69FF FFFF FFFF FFFF" /* ÿÿÿÿÿT..iÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FF4F 0000 65FF FFFF FFFF FFFF" /* ÿÿÿÿÿO..eÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FF4C 0000 64FF FFFF FFFF FFFF" /* ÿÿÿÿÿL..dÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FF4B 0000 61FF FFFF FFFF FFFF" /* ÿÿÿÿÿK..aÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FF48 0004 2C6D 7574 7474 7474" /* ÿÿÿÿÿH..,muttttt */
- $"7474 7474 7474 7474 7474 7474 7474 7474" /* tttttttttttttttt */
- $"7474 7475 6824 0202 0D18 1C1C 1C1C 1C1C" /* tttuh$.......... */
- $"1C1C 1C1C 1C1C 1C1C 1C1C 1C1C 1C1C 1C1C" /* ................ */
- $"1C1C 1C1C 170C 0100 0103 0303 0303 0303" /* ................ */
- $"0303 0303 0303 0303 0303 0303 0303 0303" /* ................ */
- $"0303 0303 0301 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0069 6833 3200 0009 DEFF" /* .......ih32..ÆÞÿ */
- $"00FF 00FF 00AD 0001 5E66 8865 0261 5859" /* .ÿ.ÿ.­..^fˆe.aXY */
- $"9C00 025E A6BA 87B7 04B9 AE67 5659 9B00" /* œ..^¦º‡·.¹®gVY›. */
- $"0266 BABF 87BE 04BF BC70 5459 9A00 0252" /* .fº¿‡¾.¿¼pTYš..R */
- $"81BD 89BA 03BC 8652 5491 5585 0003 5580" /* ½‰º.¼†RT‘U…..U€ */
- $"B7BA 89B9 02BA B497 918F 0191 7683 0003" /* ·º‰¹.º´—‘.‘vƒ.. */
- $"5864 9399 8B97 0098 929B 039D 855F 5A80" /* Xd“™‹—.˜’›.…_Z€ */
- $"0002 649D A990 A500 A490 A509 A6A9 9B65" /* ..d©¥.¤¥Æ¦©›e */
- $"0000 85B4 AFAF 8EAE 03B0 AEAC AF8E AE07" /* ..…´¯¯Ž®.°®¬¯Ž®. */
- $"AFAF B280 0000 80AD 8FA9 04A8 B2E7 ACA8" /* ¯¯²€..€­©.¨²ç¬¨ */
- $"90A9 05AB 7A00 0076 A98F A604 A5A4 F1E0" /* ©.«z..v©¦.¥¤ñà */
- $"A08F A606 A7A6 7100 006D A390 A204 9DC8" /*  ¦.§¦q..m£¢.È */
- $"FFB9 9C8E A207 A3A0 6A00 0065 9D9F 8D9E" /* ÿ¹œŽ¢.£ j..eŸž */
- $"069F 9C96 A2FA EF9C 8E9E 079F 9A65 0000" /* .Ÿœ–¢úž.Ÿše.. */
- $"6097 9C8D 9B07 97A5 E2C6 D2FF C394 8D9B" /* `—œ›.—¥âÆÒÿÔ› */
- $"079C 9461 0000 5E90 988C 9709 959A D5CE" /* .œ”a..^˜Œ—Æ•šÕÎ */
- $"E4B2 FCF4 9A95 8C97 0799 8D5E 0000 5A8B" /* ä²üôš•Œ—.™^..Z‹ */
- $"968C 9409 8EC8 FFF6 C18D DDFF C78C 8C94" /* –Œ”ÆŽÈÿöÁÝÿÇŒŒ” */
- $"0796 875B 0000 5885 938B 910B 8F8F E5FF" /* .–‡[..X…“‹‘.åÿ */
- $"FFA9 87AA FFF7 988E 8B91 0793 8159 0000" /* ÿ©‡ªÿ÷˜Ž‹‘.“Y.. */
- $"577F 908B 8E0B 87CF D4D0 CA89 8D8B E0FF" /* W.‹Ž.‡ÏÔÐʉ‹àÿ */
- $"C786 8B8E 0790 7B58 0000 5779 8C86 8A81" /* dž‹Ž.{X..WyŒ†Š */
- $"8B0D 84A5 FFFF E38B 898B 85A8 FFF8 9387" /* ‹.„¥ÿÿ㋉‹…¨ÿø“‡ */
- $"818B 868A 078C 7557 0000 5674 8A85 8800" /* ‹†Š.ŒuW..VtŠ…ˆ. */
- $"8680 820E 8385 E4FF FFB9 7C83 8381 7FDD" /* †€‚.ƒ…äÿÿ¹|ƒƒ.Ý */
- $"FFC6 7E81 8200 8585 8807 8A71 5759 0056" /* ÿÆ~‚.……ˆ.ŠqWY.V */
- $"6F87 8485 1983 929F A3A0 94B0 FFFF E39D" /* o‡„….ƒ’Ÿ£ ”°ÿÿã */
- $"9F9E 9DA3 9AB0 FBF4 98A0 A09F A192 8484" /* Ÿž£š°ûô˜  Ÿ¡’„„ */
- $"8507 876D 5759 0056 6984 8482 197C A7EB" /* ….‡mWY.Vi„„‚.|§ë */
- $"FBF1 C2EC FFFB C1ED F2F6 ECFB EDD9 DBFF" /* ûñÂìÿûÁíòöìûíÙÛÿ */
- $"D4EE F0F6 F6B7 7C84 8207 8369 5700 5956" /* Ôîðöö·|„‚.ƒiW.YV */
- $"6481 847F 0979 A3FF FFEB CCFF FFD5 E084" /* d„.Æy£ÿÿëÌÿÿÕà„ */
- $"FF03 C8F1 BCC4 80FF 01C0 7785 7F06 6557" /* ÿ.Èñ¼Ä€ÿ.Àw…..eW */
- $"5959 5661 7E84 7D08 76A3 FFFF C3F4 FFF5" /* YYVa~„}.v£ÿÿÃôÿõ */
- $"CB85 FF08 EDA8 CCC0 F2FF FFC1 7485 7D06" /* Ë…ÿ.í¨ÌÀòÿÿÁt…}. */
- $"6358 5959 575E 7B84 7A09 7692 D0BE D6FF" /* cXYYW^{„zÆv’оÖÿ */
- $"FFC2 B9D0 84CF 08CD B9FF F1B1 CED0 A574" /* ÿ¹ЄÏ.͹ÿñ±ÎÐ¥t */
- $"847A 0679 6058 5959 585D 8678 0776 6A9C" /* „z.y`XYYX]†x.vjœ */
- $"FFFF F081 7086 7106 75D1 D89D 6A71 7484" /* ÿÿðp†q.uÑØjqt„ */
- $"7808 7976 5E58 5959 585B 7486 7505 73B9" /* x.yv^XYYX[t†u.s¹ */
- $"F5FF AC6D 8775 0570 8CEB F889 6F85 7508" /* õÿ¬m‡u.pŒëø‰o…u. */
- $"7672 5C58 5959 5859 7285 7306 6F8A E1C6" /* vr\XYYXYr…s.oŠáÆ */
- $"C176 7287 7306 7179 EEFF E173 7184 7308" /* Ávr‡s.qyîÿásq„s. */
- $"7470 5B58 5959 5859 7085 7205 6B97 FFE7" /* tp[XYYXYp…r.k—ÿç */
- $"776E 8972 0569 C6FF FFB4 6A84 7202 736E" /* wn‰r.iÆÿÿ´j„r.sn */
- $"5A81 5901 586D 856F 0567 B9D9 786B 7089" /* ZY.Xm…o.g¹Ùxkp‰ */
- $"6F06 6993 FFFF F173 6D83 6F01 706B 8259" /* o.i“ÿÿñsmƒo.pk‚Y */
- $"0157 6B85 6E03 6C8C 7269 8B6E 066D 6BD3" /* .Wk…n.lŒri‹n.mkÓ */
- $"FFCB 6C6D 836E 026F 6958 8159 0256 6A6E" /* ÿËlmƒn.oiXY.Vjn */
- $"856D 0169 6B8D 6D04 6A73 8A6D 6B84 6D02" /* …m.ikm.jsŠmk„m. */
- $"6E68 5881 5902 566A 6E98 6D02 6B67 6C85" /* nhXY.Vjn˜m.kgl… */
- $"6D02 6E68 5881 5902 5665 69A3 6802 6963" /* m.nhXY.Vei£h.ic */
- $"5881 5901 5858 A559 0058 B059 0000 AB59" /* XY.XX¥Y.X°Y..«Y */
- $"8000 A959 DF00 FF00 FF00 FF00 AD00 0081" /* €.©Yß.ÿ.ÿ.ÿ.­.. */
- $"8987 0283 7B7C 9C00 0280 C1D3 87D1 04D2" /* ‰‡.ƒ{|œ..€ÁÓ‡Ñ.Ò */
- $"C787 7A7C 9B00 0288 D4DA 87D9 04DA D68F" /* LJz|›..ˆÔÚ‡Ù.ÚÖ */
- $"787C 9A00 0276 A2D8 89D6 02D7 A476 9278" /* x|š..v¢Ø‰Ö.פv’x */
- $"8500 0379 A2D3 D789 D503 D6D0 B5AD 90AE" /* …..y¢Ó׉Õ.Öе­® */
- $"01B0 9683 0003 7C87 B1B7 8BB5 00B6 92B9" /* .°–ƒ..|‡±·‹µ.¶’¹ */
- $"03BA A282 7D80 0003 87BD C8C5 90C4 00C5" /* .º¢‚}€..‡½ÈÅÄ.Å */
- $"8FC4 08C5 C8B9 8700 00A7 D6D1 90D0 01CD" /* Ä.Åȹ‡..§ÖÑÐ.Í */
- $"CF90 D006 D1D3 A000 00A3 D18F CD04 CCD1" /* ÏÐ.ÑÓ ..£ÑÍ.ÌÑ */
- $"EECC CC90 CD05 CF9B 0000 9ACE 90CB 03CA" /* îÌÌÍ.Ï›..šÎË.Ê */
- $"F7E9 C68F CB07 CCCB 9300 0091 C9C9 8FC8" /* ÷éÆË.ÌË“..‘ÉÉÈ */
- $"04C6 DFFF D2C5 8EC8 07C9 C68D 0000 8BC5" /* .ÆßÿÒÅŽÈ.ÉÆ..‹Å */
- $"C78D C606 C7C5 BFC7 FDF3 C38E C607 C7C0" /* ÇÆ.ÇÅ¿ÇýóÃŽÆ.ÇÀ */
- $"8800 0086 C0C5 8DC4 07C2 C7EB DAE4 FFD9" /* ˆ..†ÀÅÄ.ÂÇëÚäÿÙ */
- $"C08D C407 C6BC 8400 0082 BBC4 8CC2 09C1" /* ÀÄ.Ƽ„..‚»ÄŒÂÆÁ */
- $"C2E2 DEED D1FD F7C1 C18C C207 C4B6 8100" /* ÂâÞíÑý÷ÁÁŒÂ.Ķ. */
- $"007F B5C2 8CC0 09BC DBFF F8D7 BBEA FFDB" /* ..µÂŒÀƼÛÿø×»êÿÛ */
- $"BA8C C007 C2B0 7E00 007C B0C0 8BBE 0BBD" /* ºŒÀ.°~..|°À‹¾.½ */
- $"BAED FFFF CCB8 CCFF F9BF BC8B BE07 C0AA" /* ºíÿÿ̸Ìÿù¿¼‹¾.Àª */
- $"7C00 007B ABBF 8BBC 0BB7 DEE1 DFDF B9BB" /* |..{«¿‹¼.·Þáßß¹» */
- $"BAED FFDA B78B BC07 BFA5 7B00 007A A5BC" /* ºíÿÚ·‹¼.¿¥{..z¥¼ */
- $"89B9 0EBA B6C6 FFFF ECB9 B9BA B6CB FFFA" /* ‰¹.º¶Æÿÿì¹¹º¶Ëÿú */
- $"BCB8 8AB9 07BC 9F7A 0000 799F B984 B601" /* ¼¸Š¹.¼Ÿz..yŸ¹„¶. */
- $"B7B5 82B3 0CEC FFFF D4AF B3B3 B2B1 EAFF" /* ·µ‚³.ìÿÿÔ¯³³²±êÿ */
- $"D9B0 81B3 01B5 B784 B607 B899 797C 0079" /* Ù°³.µ·„¶.¸™y|.y */
- $"99B7 84B4 13B3 B9BE C1C0 B9CB FFFF EDBE" /* ™·„´.³¹¾ÁÀ¹Ëÿÿí¾ */
- $"BFBE BEC1 BCCB FCF7 BB80 BF02 C0B9 B384" /* ¿¾¾Á¼Ëü÷»€¿.À¹³„ */
- $"B407 B694 797C 0079 93B4 84B1 19AD C7F1" /* ´.¶”y|.y“´„±.­Çñ */
- $"FBF5 D6F1 FFFD D5F2 F5F8 F1FB F2E4 E7FF" /* ûõÖñÿýÕòõøñûòäçÿ */
- $"E2F3 F4F8 F8D0 AD84 B107 B290 7A00 7C79" /* âóôøøЭ„±.²z.|y */
- $"8DB0 84AE 09AA C3FF FFF2 DCFF FFE2 E984" /* °„®ÆªÃÿÿòÜÿÿâé„ */
- $"FF03 D9F6 D1D8 80FF 01D6 A985 AE06 8C7A" /* ÿ.ÙöÑØ€ÿ.Ö©…®.Œz */
- $"7C7C 7989 AD84 AB08 A7C3 FFFF D5F7 FFF8" /* ||y‰­„«.§ÃÿÿÕ÷ÿø */
- $"DA85 FF08 F2C2 DAD3 F6FF FFD7 A583 AB08" /* Ú…ÿ.òÂÚÓöÿÿ×¥ƒ«. */
- $"ACAA 897A 7C7C 7A86 A984 A809 A5B7 E0D3" /* ¬ª‰z||z†©„¨Æ¥·àÓ */
- $"E2FF FFD6 D0E0 84DF 08DD CFFF F5CB DFE0" /* âÿÿÖÐà„ß.ÝÏÿõËßà */
- $"C3A4 83A8 07A9 A686 7A7C 7C7A 8386 A506" /* 䃨.©¦†z||zƒ†¥. */
- $"A39B BAFF FFF5 AA87 A006 A3DF E2BA 9BA1" /* £›ºÿÿõª‡ .£ß⺛¡ */
- $"A284 A507 A6A2 837B 7C7C 7B82 87A2 059F" /* ¢„¥.¦¢ƒ{||{‚‡¢.Ÿ */
- $"CCF8 FFC7 9C87 A205 9EAF F0F9 AD9E 85A2" /* ÌøÿÇœ‡¢.ž¯ðù­ž…¢ */
- $"08A3 9F81 7B7C 7C7B 7F9D 859F 069C AEE8" /* .£Ÿ{||{.…Ÿ.œ®è */
- $"D4D3 A09E 879F 069D A3F4 FFE8 9D9E 849F" /* ÔÓ ž‡Ÿ.£ôÿèž„Ÿ */
- $"09A0 9B7F 7B7C 7C7B 7E9A 9D84 9C05 98B5" /* Æ ›.{||{~š„œ.˜µ */
- $"FFEE 9F99 899C 0596 D7FF FFC9 9684 9C09" /* ÿ‰œ.–×ÿÿÉ–„œÆ */
- $"9D97 7E7B 7C7C 7B7C 989B 849A 0494 CCE4" /* —~{||{|˜›„š.”Ìä */
- $"A097 8A9A 0695 B3FF FFF4 9C99 839A 019B" /*  —Šš.•³ÿÿôœ™ƒš.› */
- $"9482 7C02 7B95 9984 9803 97AD 9B95 8B98" /* ”‚|.{•™„˜.—­›•‹˜ */
- $"0697 96E0 FFDA 9797 8398 0199 9282 7C02" /* .—–àÿÚ——ƒ˜.™’‚|. */
- $"7A93 9785 9601 9395 8D96 0494 9AAB 9695" /* z“—…–.“•–.”š«–• */
- $"8496 0297 8F7B 817C 027A 9297 9896 0294" /* „–.—{|.z’—˜–.” */
- $"9295 8596 0297 8F7B 817C 027A 8C91 A390" /* ’•…–.—{|.zŒ‘£ */
- $"0291 897A 817C 017B 7BA5 7C00 7BB0 7C00" /* .‘‰z|.{{¥|.{°|. */
- $"00AB 7C80 00A9 7CDF 00FF 00FF 00FF 00AD" /* .«|€.©|ß.ÿ.ÿ.ÿ.­ */
- $"0000 7A89 8002 7C73 749C 0002 79BC CE87" /* ..z‰€.|stœ..y¼Î‡ */
- $"CC04 CDC2 8172 749B 0002 80CF D587 D304" /* Ì.ÍÂrt›..€ÏÕ‡Ó. */
- $"D4D1 8870 749A 0002 6E9B D288 D003 D1D2" /* Ôшptš..n›ÒˆÐ.ÑÒ */
- $"9E6E 9270 8500 0371 9BCE D289 D002 D1CB" /* žn’p…..q›ÎÒ‰Ð.ÑË */
- $"AF91 A801 AA90 8300 0474 80AC B2AF 8AB0" /* ¯‘¨.ªƒ..t€¬²¯Š° */
- $"02B1 B3B4 90B3 03B5 9D7A 7580 0002 80B7" /* .±³´³.µzu€..€· */
- $"C3A4 BF09 C0C3 B57F 0000 A0CF CACA 8DC9" /* ä¿ÆÀõ... ÏÊÊÉ */
- $"04CA CAC6 C8CA 8EC9 07CA CACD 9900 009C" /* .ÊÊÆÈÊŽÉ.ÊÊÍ™..œ */
- $"CA8F C604 C5CB EDC5 C58F C606 C7C8 9400" /* ÊÆ.ÅËíÅÅÆ.ÇÈ”. */
- $"0093 C790 C403 C3F6 E7BF 8FC4 07C5 C48B" /* .“ÇÄ.Ãöç¿Ä.ÅÄ‹ */
- $"0000 8AC2 C28F C104 BEDA FFCE BE8E C107" /* ..ŠÂÂÁ.¾ÚÿξŽÁ. */
- $"C2BF 8600 0083 BEC0 8DBF 06C0 BEB8 C1FC" /* ¿†..ƒ¾À¿.À¾¸Áü */
- $"F3BC 8EBF 07C0 BA81 0000 7EB9 BE8D BD07" /* 󼎿.Àº..~¹¾½. */
- $"BAC0 E9D6 E1FF D5B8 8DBD 07BF B57C 0000" /* ºÀéÖáÿÕ¸½.¿µ|.. */
- $"7AB3 BC8C BA09 B9BB DFDB EBCB FDF7 BAB9" /* z³¼ŒºÆ¹»ßÛëËý÷º¹ */
- $"8CBA 07BC AE79 0000 77AE B98C B709 B3D7" /* Œº.¼®y..w®¹Œ·Æ³× */
- $"FFF8 D3B2 E8FF D7B1 8CB7 07B9 A876 0000" /* ÿøÓ²èÿ×±Œ·.¹¨v.. */
- $"74A9 B78A B50C B6B5 B2EC FFFF C6AF C6FF" /* t©·Šµ.¶µ²ìÿÿƯÆÿ */
- $"F9B8 B48B B507 B7A3 7400 0073 A3B6 8BB3" /* ù¸´‹µ.·£t..s£¶‹³ */
- $"0BAE DBDE DDDB B0B3 B1EA FFD7 AE8B B307" /* .®ÛÞÝÛ°³±êÿ×®‹³. */
- $"B59D 7300 0072 9CB3 8AB0 04AD C0FF FFEA" /* µs..rœ³Š°.­Àÿÿê */
- $"80B0 05AD C4FF F9B4 AF8A B007 B397 7200" /* €°.­Äÿù´¯Š°.³—r. */
- $"0071 97B1 85AE 00AC 80AA 0EAB AAEA FFFF" /* .q—±…®.¬€ª.«ªêÿÿ */
- $"CFA6 AAAA A9A7 E7FF D5A7 81AA 00AC 85AE" /* Ϧªª©§çÿÕ§ª.¬…® */
- $"07B0 9171 7400 7191 AE84 AB13 AAB2 B9BB" /* .°‘qt.q‘®„«.ª²¹» */
- $"BAB2 C6FF FFEB B7B9 B8B7 BBB6 C5FC F7B5" /* º²Æÿÿë·¹¸·»¶Åü÷µ */
- $"80B9 01BA B285 AB07 AD8C 7174 0070 8BAB" /* €¹.º²…«.­Œqt.p‹« */
- $"84A8 19A4 C1EF FBF4 D2F0 FFFC D1F1 F4F8" /* „¨.¤ÁïûôÒðÿüÑñôø */
- $"F0FB F1E2 E5FF DFF2 F3F8 F8CB A484 A807" /* ðûñâåÿßòóøøˤ„¨. */
- $"A988 7200 7471 85A7 84A5 09A1 BDFF FFF0" /* ©ˆr.tq…§„¥Æ¡½ÿÿð */
- $"D9FF FFE0 E784 FF03 D6F5 CDD4 80FF 01D2" /* Ùÿÿàç„ÿ.ÖõÍÔ€ÿ.Ò */
- $"9F85 A506 8472 7474 7181 A484 A208 9EBD" /* Ÿ…¥.„rttq¤„¢.ž½ */
- $"FFFF D2F6 FFF7 D785 FF08 F1BD D8CF F6FF" /* ÿÿÒöÿ÷×…ÿ.ñ½ØÏöÿ */
- $"FFD3 9C83 A208 A3A2 8172 7474 727E A084" /* ÿÓœƒ¢.£¢rttr~ „ */
- $"9F09 9CB0 DDCF DFFF FFD2 CCDD 84DC 08DA" /* ŸÆœ°ÝÏßÿÿÒÌÝ„Ü.Ú */
- $"CBFF F4C6 DCDD BE9B 839F 08A0 9E7E 7274" /* ËÿôÆÜݾ›ƒŸ. ž~rt */
- $"7472 7C9D 849C 089D 9B93 B5FF FFF4 A397" /* tr|„œ.›“µÿÿô£— */
- $"8598 0897 9BDD E0B4 9398 9A9D 839C 089D" /* …˜.—›Ýà´“˜šƒœ. */
- $"9A7B 7374 7473 7998 8699 0597 C8F7 FFC1" /* š{sttsy˜†™.—È÷ÿÁ */
- $"9387 9905 96A9 EEF9 A695 8599 089A 9679" /* “‡™.–©îù¦•…™.š–y */
- $"7374 7473 7795 8596 0693 A7E6 D1D0 9895" /* sttsw•…–.“§æÑИ• */
- $"8796 0695 9BF3 FFE7 9595 8496 0897 9377" /* ‡–.•›óÿç••„–.—“w */
- $"7374 7473 7693 8595 058F B0FF ED98 9289" /* sttsv“…•.°ÿ혒‰ */
- $"9505 8ED4 FFFF C58E 8495 0996 9076 7374" /* •.ŽÔÿÿÅŽ„•Æ–vst */
- $"7473 7490 9384 9204 8BC8 E299 8F8A 9206" /* tst“„’.‹È♊’. */
- $"8DAD FFFF F494 9183 9202 938C 7581 7402" /* ­ÿÿô”‘ƒ’.“Œut. */
- $"738D 9184 9003 8EA7 938D 8B90 068F 8EDD" /* s‘„.Ž§“‹.ŽÝ */
- $"FFD7 8E8F 8390 0191 8A82 7402 728B 8F85" /* ÿ׎ƒ.‘Š‚t.r‹… */
- $"8E01 8B8D 8D8E 048C 93A4 8E8D 848E 028F" /* Ž.‹Ž.Œ“¤Ž„Ž. */
- $"8773 8174 0272 8B8F 988E 028C 8A8D 858E" /* ‡st.r‹˜Ž.ŒŠ…Ž */
- $"028F 8773 8174 0272 8489 A388 0289 8173" /* .‡st.r„‰£ˆ.‰s */
- $"8174 0173 73A5 7400 73B0 7400 00AB 7480" /* t.ss¥t.s°t..«t€ */
- $"00A9 74DF 0068 386D 6B00 0009 0800 0000" /* .©tß.h8mk..Æ.... */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 002E 4549 4A4A 4A4A 4A4A 4A4A 4A4A" /* ....EIJJJJJJJJJJ */
- $"3B0A 0400 0000 0000 0000 0000 0000 0000" /* ;Â.............. */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 2FF9 FFFF FFFF FFFF FFFF FFFF FFFF" /* ../ùÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FD52 0802 0000 0000 0000 0000 0000 0000" /* ýR.............. */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 4DFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ..Mÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FF7E 1306 0000 0000 0000 0000 0000 0000" /* ÿ~.............. */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0002 ABFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ..«ÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFBB 2C11 0B0B 0B0B 0B0B 0B0B 0B0B 0B0B" /* ÿ»,............. */
- $"0B0B 0B0B 0B0B 0903 0000 0000 0000 0000" /* ......Æ......... */
- $"08B2 FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* .²ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF DFCC CCCC CCCC CCCC CCCC CCCC CCCC" /* ÿÿßÌÌÌÌÌÌÌÌÌÌÌÌÌ */
- $"CCCC CCCC CCCC CBC9 8000 0000 0000 0026" /* ÌÌÌÌÌÌËÉ€......& */
- $"71F2 EDEE EFEF EFEF EFEF EFEF EFEF EFEF" /* qòíîïïïïïïïïïïïï */
- $"EFEF F4F7 F7F7 F7F7 F7F7 F7F7 F7F7 F7F7" /* ïïô÷÷÷÷÷÷÷÷÷÷÷÷÷ */
- $"F7F7 F7F7 F7F7 F7F5 CE41 2000 0000 5EF7" /* ÷÷÷÷÷÷÷õÎA ...^÷ */
- $"FFF8 F8F9 F9F9 F9F9 F9F9 F9F9 F9F9 F9F9" /* ÿøøùùùùùùùùùùùùù */
- $"F9F9 F9F9 F9F9 F9F9 F9F9 F9F9 F9F9 F9F9" /* ùùùùùùùùùùùùùùùù */
- $"F9F9 F9F9 F9F9 F9F8 FAFF EE41 0000 C4FF" /* ùùùùùùùøúÿîA..Äÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFA1 0000 B6FF" /* ÿÿÿÿÿÿÿÿÿÿÿ¡..¶ÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FF91 0000 A2FF" /* ÿÿÿÿÿÿÿÿÿÿÿ‘..¢ÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FF7A 0000 8FFF" /* ÿÿÿÿÿÿÿÿÿÿÿz..ÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FF68 0000 79FF" /* ÿÿÿÿÿÿÿÿÿÿÿh..yÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FF57 0000 5EFF" /* ÿÿÿÿÿÿÿÿÿÿÿW..^ÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FF48 0000 4BFF" /* ÿÿÿÿÿÿÿÿÿÿÿH..Kÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FD3B 0000 3FFE" /* ÿÿÿÿÿÿÿÿÿÿý;..?þ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF F62F 0000 33F8" /* ÿÿÿÿÿÿÿÿÿÿö/..3ø */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF ED23 0000 27F2" /* ÿÿÿÿÿÿÿÿÿÿí#..'ò */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF DE1A 0000 1FE9" /* ÿÿÿÿÿÿÿÿÿÿÞ....é */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF CE10 0000 1ADF" /* ÿÿÿÿÿÿÿÿÿÿÎ....ß */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF C10B 0100 14D5" /* ÿÿÿÿÿÿÿÿÿÿÁ....Õ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF B509 0100 0FCD" /* ÿÿÿÿÿÿÿÿÿÿµÆ...Í */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF AA07 0001 0BC2" /* ÿÿÿÿÿÿÿÿÿÿª.... */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF A005 0101 09B3" /* ÿÿÿÿÿÿÿÿÿÿ ...Ƴ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF 9504 0101 08A6" /* ÿÿÿÿÿÿÿÿÿÿ•....¦ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF 8D04 0101 069A" /* ÿÿÿÿÿÿÿÿÿÿ....š */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF 8505 0101 0691" /* ÿÿÿÿÿÿÿÿÿÿ…....‘ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF 7D05 0101 078B" /* ÿÿÿÿÿÿÿÿÿÿ}....‹ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF 7606 0101 0885" /* ÿÿÿÿÿÿÿÿÿÿv....… */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF 7106 0102 0881" /* ÿÿÿÿÿÿÿÿÿÿq.... */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF 6D07 0102 0A7E" /* ÿÿÿÿÿÿÿÿÿÿm...Â~ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF 6A08 0102 0B7B" /* ÿÿÿÿÿÿÿÿÿÿj....{ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF 6709 0102 0C7C" /* ÿÿÿÿÿÿÿÿÿÿgÆ...| */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF 670A 0102 0C75" /* ÿÿÿÿÿÿÿÿÿÿgÂ...u */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF 600B 0102 113A" /* ÿÿÿÿÿÿÿÿÿÿ`....: */
- $"7B85 8585 8585 8585 8585 8585 8585 8585" /* {……………………………………… */
- $"8585 8585 8585 8585 8585 8585 8585 8585" /* ………………………………………… */
- $"8585 8585 8585 8585 8574 310F 0101 0B1E" /* ………………………t1..... */
- $"2B34 3535 3535 3535 3535 3535 3535 3535" /* +455555555555555 */
- $"3535 3535 3535 3535 3535 3535 3535 3535" /* 5555555555555555 */
- $"3535 3535 3535 3535 332A 1C0A 0100 040C" /* 555555553*.Â.... */
- $"1418 1818 1818 1818 1818 1818 1818 1818" /* ................ */
- $"1818 1818 1818 1818 1818 1818 1818 1818" /* ................ */
- $"1818 1818 1818 1818 1813 0B03 0000 0002" /* ................ */
- $"0304 0303 0303 0303 0303 0303 0303 0303" /* ................ */
- $"0303 0303 0303 0303 0303 0303 0303 0303" /* ................ */
- $"0303 0303 0303 0303 0402 0100 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0069 7433" /* .............it3 */
- $"3200 0025 F700 0000 00FF 00FF 00FF 00FF" /* 2..%÷....ÿ.ÿ.ÿ.ÿ */
- $"00FF 00FF 00FF 00FF 00FF 00FF 00FF 00FF" /* .ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ */
- $"00FF 00FF 00FF 00FF 00FF 00FF 00FF 00FF" /* .ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ */
- $"00FF 00FF 00FF 00FF 00FF 00DF 009F 59D7" /* .ÿ.ÿ.ÿ.ÿ.ÿ.ß.ŸY× */
- $"00A6 59D3 0001 5959 8000 9D58 8459 D000" /* .¦YÓ..YY€.X„YÐ. */
- $"0359 5900 569F 5901 5658 8359 D000 0257" /* .YY.VŸY.VXƒYÐ..W */
- $"6287 9D95 0494 917F 5E58 8359 CD00 0459" /* b‡•.”‘.^XƒYÍ..Y */
- $"005C 9ABA 9EBC 03B9 AE85 5883 59CD 0004" /* .\šºž¼.¹®…XƒYÍ.. */
- $"5900 6EB3 BE9E BF04 BEB6 9D62 5782 59CD" /* Y.n³¾ž¿.¾¶bW‚YÍ */
- $"0003 5900 74B6 A0BE 03B8 9F63 5782 59CC" /* ..Y.t¶ ¾.¸ŸcW‚YÌ */
- $"0004 5959 547A B8A0 BC03 B7A0 6357 8359" /* ..YYTz¸ ¼.· cWƒY */
- $"CB00 0459 5954 88B9 A0BB 03B7 A366 56B8" /* Ë..YYTˆ¹ ».·£fV¸ */
- $"5995 0005 5959 005B A0B9 A0BA 03B8 AA73" /* Y•..YY.[ ¹ º.¸ªs */
- $"55BA 5992 0006 5959 0053 7BB4 B9A0 BA04" /* UºY’..YY.S{´¹ º. */
- $"B9B2 905A 56BA 5990 0006 5959 0054 73AB" /* ¹²ZVºY..YY.Ts« */
- $"B8A2 B903 B5AB 865E B756 0300 5859 598E" /* ¸¢¹.µ«†^·V..XYYŽ */
- $"0007 5959 005A 83AD B6B7 A2B8 04B7 B4AD" /* ..YY.Zƒ­¶·¢¸.·´­ */
- $"9B87 B57D 047B 725D 0059 8D00 0759 5900" /* ›‡µ}.{r].Y..YY. */
- $"5A8F B2B6 B6A4 B704 B6B5 B4B2 B1B4 B003" /* Z²¶¶¤·.¶µ´²±´°. */
- $"ADA0 7600 8059 8900 8159 0355 77AC B0E2" /* ­ v.€Y‰.Y.Uw¬°â */
- $"B103 AFA4 7D56 8259 8600 0159 5980 0003" /* ±.¯¤}V‚Y†..YY€.. */
- $"5279 9697 E298 0496 9073 5456 8000 0159" /* Ry–—â˜.–sTV€..Y */
- $"5984 0008 5900 5457 6268 686D 7284 73A1" /* Y„..Y.TWbhhmr„s¡ */
- $"74B9 7309 706C 6868 6763 5900 5959 8200" /* t¹sÆplhhgcY.YY‚. */
- $"0759 0052 6E96 A4A7 A8E7 A980 A706 A6A0" /* .Y.Rn–¤§¨ç©€§.¦  */
- $"8E6A 5759 5982 0002 536F A782 B0E5 AF81" /* ŽjWYY‚..So§‚°å¯ */
- $"B006 AFAF AB99 6A00 5980 0004 5900 5A9B" /* °.¯¯«™j.Y€..Y.Z› */
- $"AEF0 AF0B AEA6 895B 0059 0000 5900 6CA7" /* ®ð¯.®¦‰[.Y..Y.l§ */
- $"B4AE 03AF ABAE AFB7 AE0A A996 6500 5900" /* ´®.¯«®¯·®Â©–e.Y. */
- $"0059 5470 A7B3 AD05 AEA8 A299 A8AE B6AD" /* .YTp§³­.®¨¢™¨®¶­ */
- $"0AA8 9666 0059 0059 5900 6CA3 B4AB 05A6" /* ¨–f.Y.YY.l£´«.¦ */
- $"EDE9 99A7 ACB5 AB0A A692 6200 5900 5959" /* í陧¬µ«Â¦’b.Y.YY */
- $"0063 9EB3 A905 A8A8 ECFF E195 B6A9 0BA3" /* .cž³©.¨¨ìÿᕶ©.£ */
- $"8D5F 5859 0059 5900 6099 A7B3 A806 A4DC" /* _XY.YY.`™§³¨.¤Ü */
- $"FFFF CA96 AAB4 A80B A187 5B58 5900 5959" /* ÿÿÊ–ª´¨.¡‡[XY.YY */
- $"005C 94A6 B3A7 01A3 C580 FF02 AD9D A8B3" /* .\”¦³§.£Å€ÿ.­¨³ */
- $"A70B 9F82 5A58 5900 5959 5857 8DA5 B3A6" /* §.Ÿ‚ZXY.YYXW¥³¦ */
- $"07A4 AEF8 FFFF ED97 A4B2 A603 A59C 7C58" /* .¤®øÿÿí—¤²¦.¥œ|X */
- $"8359 0257 87A3 B4A4 01A1 E180 FF02 CB94" /* ƒY.W‡£´¤.¡á€ÿ.Ë” */
- $"A6B1 A403 A399 7657 8359 0254 80A1 B4A2" /* ¦±¤.£™vWƒY.T€¡´¢ */
- $"019D C180 FF03 FEA4 9BA3 B0A2 03A1 9672" /* .Á€ÿ.þ¤›£°¢.¡–r */
- $"5783 5902 547A 9FB4 A202 A0A6 F380 FF02" /* WƒY.TzŸ´¢. ¦ó€ÿ. */
- $"E192 A3B0 A203 A094 6D56 8359 0255 759D" /* á’£°¢. ”mVƒY.Uu */
- $"B5A0 019B D381 FF02 B495 A1AF A006 9D90" /* µ .›Óÿ.´•¡¯ . */
- $"6957 5959 0080 5902 546D 9BB1 9E00 9F80" /* iWYY.€Y.Tm›±ž.Ÿ€ */
- $"A002 9CAF FD80 FF02 EF93 9DAF 9E06 9B8C" /*  .œ¯ý€ÿ.ž.›Œ */
- $"6657 5959 0080 5902 5568 97B0 9D07 9F95" /* fWYY.€Y.Uh—°.Ÿ• */
- $"8A89 8B98 9CE2 81FF 02C3 8F9E AE9D 0699" /* Š‰‹˜œâÿ.Þ®.™ */
- $"8861 5759 5900 8059 0256 6494 AF9C 089D" /* ˆaWYY.€Y.Vd”¯œ. */
- $"8C9E D0DD C793 8CBC 81FF 02F7 9899 AE9C" /* ŒžÐÝÇ“Œ¼ÿ.÷˜™®œ */
- $"0697 855F 5859 5900 8059 0257 5E91 AF9B" /* .—…_XYY.€Y.W^‘¯› */
- $"0195 B781 FF03 F69B 96ED 81FF 02CE 8B9C" /* .•·ÿ.ö›–íÿ.΋œ */
- $"AD9B 0D95 815D 5859 5900 0059 5957 5B8C" /* ­›.•]XYY..YYW[Œ */
- $"98AD 9903 9889 9AD8 81FF 02E0 89C4 81FF" /* ˜­™.˜‰šØÿ.à‰Äÿ */
- $"02FD 9E93 AD99 0D93 7C5A 5859 5900 0059" /* .ýž“­™.“|ZXYY..Y */
- $"5958 5987 96AC 970C 9889 D3CE 88A1 E8FF" /* YXY‡–¬—.˜‰ÓΈ¡èÿ */
- $"FFF9 9B9D F481 FF02 D788 98AC 9702 9079" /* ÿù›ôÿ.׈˜¬—.y */
- $"5A80 5901 0000 8059 0255 8395 AB96 0D97" /* Z€Y...€Y.Uƒ•«–.— */
- $"8DA4 FFFF F6B2 84B4 F6FB A28E CC82 FF02" /* ¤ÿÿö²„´öû¢ŽÌ‚ÿ. */
- $"A28F 97AB 9601 8E75 8159 0100 0080 5902" /* ¢—«–.ŽuY...€Y. */
- $"547F 94AB 9502 9688 E481 FF07 E99E 8CBC" /* T.”«•.–ˆäÿ.鞌¼ */
- $"9991 A2F8 81FF 02DD 8896 AA95 0394 8D71" /* ™‘¢øÿ.݈–ª•.”q */
- $"5880 5901 0000 8059 0255 7993 AA94 0295" /* X€Y...€Y.Uy“ª”.• */
- $"87B4 84FF 05D4 8C93 948F D182 FF02 A68C" /* ‡´„ÿ.ÔŒ“”Ñ‚ÿ.¦Œ */
- $"95A9 9403 938A 6D57 8059 0700 0059 595A" /* •©”.“ŠmW€Y...YYZ */
- $"5374 91AA 9302 908C F284 FF06 DD92 9293" /* St‘ª“.Œò„ÿ.Ý’’“ */
- $"8FA4 FB81 FF01 E086 AA93 0391 876A 5780" /* ¤ûÿ.à†ª“.‘‡jW€ */
- $"5907 0000 5959 5A53 6F8F A991 0292 87CA" /* Y...YYZSo©‘.’‡Ê */
- $"84FF 02F8 A18D 8091 018D D782 FF02 A788" /* „ÿ.ø¡€‘.ׂÿ.§ˆ */
- $"92A8 9103 8F84 6757 8059 0100 0080 5902" /* ’¨‘.„gW€Y...€Y. */
- $"556B 8DA9 9002 8E85 DB84 FF01 C78A 8190" /* Uk©.Ž…Û„ÿ.ÇŠ */
- $"028B A8FE 81FF 01E2 84A9 9003 8E82 6357" /* .‹¨þÿ.â„©.Ž‚cW */
- $"8059 0100 0080 5902 5466 8CA8 9005 9186" /* €Y...€Y.TfŒ¨.‘† */
- $"AB85 A6EE 81FF 02EE 958E 8190 028F 8CDC" /* «…¦îÿ.î•Ž.ŒÜ */
- $"82FF 02AA 8591 A790 038D 7F62 5880 5901" /* ‚ÿ.ª…‘§..bX€Y. */
- $"0000 8059 0254 618A A78E 0C8F 84A5 FFF0" /* ..€Y.TaŠ§Ž.„¥ÿð */
- $"A480 BBF9 FFFF B688 838E 0189 A982 FF01" /* ¤€»ùÿÿ¶ˆƒŽ.‰©‚ÿ. */
- $"E583 A88E 038B 7C5F 5880 5901 0000 8059" /* 僨Ž.‹|_X€Y...€Y */
- $"0256 5F87 A78D 028C 83E8 80FF 06DF 9087" /* .V_‡§.Œƒè€ÿ.߇ */
- $"D4E0 8C8C 838D 028C 8ADE 82FF 02AB 838E" /* ÔàŒŒƒ.ŒŠÞ‚ÿ.«ƒŽ */
- $"A68D 038A 7A5D 5880 5901 0000 8059 0257" /* ¦.Šz]X€Y...€Y.W */
- $"5C84 A68C 028D 7EB7 83FF 03C9 8B8E 8B85" /* \„¦Œ.~·ƒÿ.É‹Ž‹… */
- $"8C01 87AA 82FF 01E6 82A7 8C03 8877 5C58" /* Œ.‡ª‚ÿ.悧Œ.ˆw\X */
- $"8059 0100 0080 5902 5757 81A6 8A02 878A" /* €Y...€Y.WW¦Š.‡Š */
- $"F584 FF01 CB83 868A 0289 88E0 82FF 02A8" /* õ„ÿ.˃†Š.‰ˆà‚ÿ.¨ */
- $"808B A58A 0386 735B 5880 5901 0000 8059" /* €‹¥Š.†s[X€Y...€Y */
- $"0258 557F A58A 028B 7BC9 84FF 02F6 9987" /* .XU.¥Š.‹{É„ÿ.ö™‡ */
- $"878A 0184 AB82 FF01 E580 A68A 0285 715A" /* ‡Š.„«‚ÿ.倦Š.…qZ */
- $"8159 0100 0081 5902 577B 88A3 8902 8A81" /* Y...Y.W{ˆ£‰.Š */
- $"9685 FF01 BF82 8889 0288 87E0 82FF 02A7" /* –…ÿ.¿‚ˆ‰.ˆ‡à‚ÿ.§ */
- $"7F8A A489 0183 6F82 5901 0000 8159 0254" /* .Š¤‰.ƒo‚Y...Y.T */
- $"7787 A488 017A DC84 FF02 EA8C 8689 8801" /* w‡¤ˆ.zÜ„ÿ.ꌆ‰ˆ. */
- $"82A9 82FF 01E3 7EA4 8802 8781 6C82 5901" /* ‚©‚ÿ.ã~¤ˆ.‡l‚Y. */
- $"0000 8159 0151 7497 860E 8784 8686 8486" /* ..Y.Qt—†.‡„††„† */
- $"8684 8685 8486 877B A685 FF11 AD7D 8685" /* †„†…„†‡{¦…ÿ.­}†… */
- $"8486 8584 8784 8487 8485 8783 83DF 82FF" /* „†…„‡„„‡„…‡ƒƒß‚ÿ */
- $"0FA4 7D87 8584 8785 8487 8485 8784 8586" /* .¤}‡…„‡…„‡„…‡„…† */
- $"8596 8602 7F69 5881 5901 0000 8059 035A" /* …–†..iXY...€Y.Z */
- $"5170 8496 850E 8182 7F7F 827F 8082 7E81" /* Qp„–….‚..‚.€‚~ */
- $"8280 837E EC84 FF12 DB7E 817F 8082 7E81" /* ‚€ƒ~ì„ÿ.Û~.€‚~ */
- $"827E 8182 7E82 817E 827B A682 FF10 E07B" /* ‚~‚~‚~‚{¦‚ÿ.à{ */
- $"8380 827E 8181 7E82 817E 8280 7F81 8494" /* ƒ€‚~~‚~‚€.„” */
- $"8503 847D 6758 8159 0100 0080 5903 5A53" /* ….„}gXY...€Y.ZS */
- $"6E84 9585 0E82 90FB BCAC FFA4 B9FF 9BD3" /* n„•….‚û¼¬ÿ¤¹ÿ›Ó */
- $"FC97 7BB9 84FF 14FC 91AA FFA8 BFFF 92D1" /* ü—{¹„ÿ.ü‘ªÿ¨¿ÿ’Ñ */
- $"FB92 E5ED 87F4 DC95 FFCB 73DF 82FF 0FA0" /* û’åí‡ôÜ•ÿËsß‚ÿ.  */
- $"79DC F889 E5ED 90F6 D88F FFC7 AAC2 7D94" /* yÜø‰åíöØÿǪÂ}” */
- $"8503 847C 6558 8159 0100 0080 5903 5A52" /* ….„|eXY...€Y.ZR */
- $"6983 9584 0E81 92FF BCAA FFC4 D2FF 96D4" /* iƒ•„.’ÿ¼ªÿÄÒÿ–Ô */
- $"FF9A 82F8 84FF 14C6 78CE FFA6 BFFF B6E4" /* ÿš‚ø„ÿ.ÆxÎÿ¦¿ÿ¶ä */
- $"FF8D E8F9 AFFE DE91 FFE3 899E 82FF 0FDB" /* ÿèù¯þÞ‘ÿ㉞‚ÿ.Û */
- $"74E2 FFB1 F3F0 8AFA E9B4 FFC8 A6C7 7C94" /* tâÿ±óðŠúé´ÿȦÇ|” */
- $"8403 8379 6258 8159 0100 0080 5903 5A51" /* „.ƒybXY...€Y.ZQ */
- $"6581 9582 047F 90FF D5C8 81FF 04BB E5F9" /* e•‚..ÿÕÈÿ.»åù */
- $"86CA 84FF 06F2 82D6 FFFF C6D6 80FF 02FC" /* †Ê„ÿ.ò‚ÖÿÿÆÖ€ÿ.ü */
- $"B5EF 80FF 06E9 B8FF FFFA 8AD6 82FF 0196" /* µï€ÿ.é¸ÿÿúŠÖ‚ÿ.– */
- $"C680 FF02 F4B4 FA80 FF03 DCC9 C57A 9482" /* Æ€ÿ.ô´ú€ÿ.ÜÉÅz”‚ */
- $"0381 7761 5881 5901 0000 8059 035A 5262" /* .waXY...€Y.ZRb */
- $"7F95 8102 7E8F FA85 FF01 B190 85FF 01AC" /* .•.~ú…ÿ.±…ÿ.¬ */
- $"9A90 FF01 C494 82FF 02D5 8DF9 87FF 01BF" /* šÿ.Ä”‚ÿ.Õù‡ÿ.¿ */
- $"7994 8103 8075 5F58 8159 0100 0081 5902" /* y”.€u_XY...Y. */
- $"5461 7D95 8002 7D8E FA84 FF02 E779 DD84" /* Ta}•€.}Žú„ÿ.çyÝ„ */
- $"FF02 E47C E690 FF02 FC8A D281 FF02 FC8C" /* ÿ.ä|æÿ.üŠÒÿ.üŒ */
- $"C787 FF01 BF77 9480 037E 725E 5881 5901" /* LJÿ.¿w”€.~r^XY. */
- $"0000 8159 0254 5D7C 957F 027C 8EFA 84FF" /* ..Y.T]|•..|Žú„ÿ */
- $"019C A285 FF01 97AD 92FF 01C7 8F80 FF04" /* .œ¢…ÿ.—­’ÿ.Ç€ÿ. */
- $"FBC0 748B F986 FF01 BE76 947F 037D 715C" /* ûÀt‹ù†ÿ.¾v”..}q\ */
- $"5881 5901 0000 8159 0254 597B 957F 027C" /* XY...Y.TY{•..| */
- $"8EFA 83FF 02D7 7BEF 84FF 02D1 7EF4 92FF" /* Žúƒÿ.×{ï„ÿ.Ñ~ô’ÿ */
- $"09FE 8CC9 F8CB 8C64 9F83 C386 FF01 BE76" /* ÆþŒÉøËŒdŸƒÃ†ÿ.¾v */
- $"947F 037C 6F5B 5881 5901 0000 8159 0355" /* ”..|o[XY...Y.U */
- $"5779 7E94 7D02 7A8C FA82 FF02 FD8A B884" /* Wy~”}.zŒú‚ÿ.ýŠ¸„ */
- $"FF02 FA86 C094 FF09 CF74 7C64 7FCB FFC0" /* ÿ.ú†À”ÿÆÏt|d.ËÿÀ */
- $"80F7 85FF 01BD 7494 7D02 7A6D 5B82 5901" /* €÷…ÿ.½t”}.zm[‚Y. */
- $"0000 8159 0256 5677 957C 0279 8BFA 82FF" /* ..Y.VVw•|.y‹ú‚ÿ */
- $"02C3 82FB 84FF 02BB 86FE 95FF 088C 99D5" /* .Âû„ÿ.»†þ•ÿ.Œ™Õ */
- $"FCFF FFFA 7FBC 85FF 01BD 7394 7C02 796B" /* üÿÿú.¼…ÿ.½s”|.yk */
- $"5A82 5901 0000 8159 0257 5575 957B 0277" /* Z‚Y...Y.WUu•{.w */
- $"8BFA 81FF 02F4 7DCE 84FF 02EE 7BD6 96FF" /* ‹úÿ.ô}΄ÿ.î{Ö–ÿ */
- $"01D0 A782 FF02 C47B F484 FF01 BC72 947B" /* .Ч‚ÿ.Ä{ô„ÿ.¼r”{ */
- $"0178 6983 5901 0000 8159 0258 5272 957A" /* .xiƒY...Y.XRr•z */
- $"0877 8AE8 EEEC ECF2 AA91 85FF 02A8 92F2" /* .wŠèîììòª‘…ÿ.¨’ò */
- $"95EC 03ED ED93 DC81 FF03 FD83 B2F2 82EC" /* •ì.íí“Üÿ.ýƒ²ò‚ì */
- $"02F3 B573 947A 0176 6783 5901 0000 8159" /* .óµs”z.vgƒY...Y */
- $"0258 5070 9679 007A 817F 027E 71E3 84FF" /* .XPp–y.z..~qã„ÿ */
- $"03DF 797F 8096 7F02 8078 A382 FF02 C970" /* .ßy.€–..€x£‚ÿ.Ép */
- $"8083 7F00 7D95 7902 7565 5882 5901 0000" /* €ƒ..}•y.ueX‚Y... */
- $"8159 0258 4F6F 9779 8077 0278 69AB 85FF" /* Y.XOo—y€w.xi«…ÿ */
- $"029B 7378 9977 0178 DF81 FF02 B468 7583" /* .›sx™w.xßÿ.´huƒ */
- $"7700 7895 7902 7464 5882 5901 0000 8259" /* w.x•y.tdX‚Y...‚Y */
- $"0150 6D9A 7802 747A F384 FF02 CD72 779A" /* .Pmšx.tzó„ÿ.Írwš */
- $"7808 71A0 FFFF D98C 8FC6 6D9C 7801 7363" /* x.q ÿÿÙŒÆmœx.sc */
- $"8359 0100 0082 5901 516B 9A77 016B C484" /* ƒY...‚Y.Qkšw.kÄ„ */
- $"FF02 F68A 729B 770A 7677 9B8A 80BD FDFF" /* ÿ.öŠr›wÂvw›Š€½ýÿ */
- $"9C6A 789A 7702 7261 5882 5901 0000 8159" /* œjxšw.raX‚Y...Y */
- $"035A 4F68 7598 7602 737B F184 FF01 B96E" /* .ZOhu˜v.s{ñ„ÿ.¹n */
- $"9D76 0371 85D7 FB80 FF02 F076 719A 7602" /* v.q…×û€ÿ.ðvqšv. */
- $"7060 5882 5901 0000 8159 035A 4E66 7498" /* p`X‚Y...Y.ZNft˜ */
- $"7504 7380 77C3 FE81 FF02 E97B 729D 7502" /* u.s€wÃþÿ.é{ru. */
- $"727F EF82 FF01 CD66 9A75 026F 5E58 8259" /* r.ï‚ÿ.Ífšu.o^X‚Y */
- $"0100 0081 5903 5A4D 6473 9774 0672 76EE" /* ...Y.ZMds—t.rvî */
- $"CC73 83DA 80FF 01A4 6C9F 7401 6CBE 83FF" /* ÌsƒÚ€ÿ.¤lŸt.l¾ƒÿ */
- $"02A5 6575 9874 026D 5C58 8259 0100 0081" /* .¥eu˜t.m\X‚Y... */
- $"5902 5A4D 6298 730B 6F82 FAFF F9AD 6A97" /* Y.ZMb˜s.o‚úÿù­j— */
- $"F1DC 7172 9F73 016D 9283 FF03 F981 6B74" /* ñÜqrŸs.m’ƒÿ.ùkt */
- $"9773 026C 5B58 8259 0100 0081 5902 5A4D" /* —s.l[X‚Y...Y.ZM */
- $"6098 7301 6C94 81FF 04EC 957B 8470 A073" /* `˜s.l”ÿ.ì•{„p s */
- $"0271 75E7 83FF 02DD 6972 9773 026B 5C58" /* .quçƒÿ.Ýir—s.k\X */
- $"8259 0100 0081 5902 5A50 5F98 7201 69A8" /* ‚Y...Y.ZP_˜r.i¨ */
- $"83FF 019B 69A2 7201 6ABF 84FF 02AF 6473" /* ƒÿ.›i¢r.j¿„ÿ.¯ds */
- $"9672 026A 5B58 8259 0100 0081 5903 5A51" /* –r.j[X‚Y...Y.ZQ */
- $"5D70 9771 0167 BD81 FF02 F6A1 6FA3 7101" /* ]p—q.g½ÿ.ö¡o£q. */
- $"6B94 84FF 02F7 7B6D 9671 0169 5A83 5901" /* k”„ÿ.÷{m–q.iZƒY. */
- $"0000 8159 035A 505B 6F97 7101 69D5 80FF" /* ..Y.ZP[o—q.iÕ€ÿ */
- $"03E8 8B68 70A3 7102 6F74 E984 FF02 BC65" /* .è‹hp£q.oté„ÿ.¼e */
- $"7294 7102 7067 5883 5901 0000 8159 035A" /* r”q.pgXƒY...Y.Z */
- $"5059 6F96 7007 6F6F E7FF FFD4 7A69 A670" /* PYo–p.ooçÿÿÔzi¦p */
- $"0168 BD84 FF02 EC71 6E94 7002 6F67 5883" /* .h½„ÿ.ìqn”p.ogXƒ */
- $"5901 0000 8159 035A 5058 6E96 6F06 6C79" /* Y...Y.ZPXn–o.ly */
- $"F7FF BD6E 6BA7 6F02 6A8B FD83 FF02 FC83" /* ÷ÿ½nk§o.j‹ýƒÿ.üƒ */
- $"6B94 6F02 6E66 5783 5901 0000 8159 035A" /* k”o.nfWƒY...Y.Z */
- $"5056 6D96 6E05 688E FBA5 676C A86E 026D" /* PVm–n.hŽû¥gl¨n.m */
- $"6AD0 83FF 02F5 7D6B 946E 026D 6456 8359" /* jЃÿ.õ}k”n.mdVƒY */
- $"0100 0081 5903 5A4F 556C 966D 0468 9294" /* ...Y.ZOUl–m.h’” */
- $"656C AA6D 0268 87F8 82FF 01BC 6995 6D02" /* elªm.h‡ø‚ÿ.¼i•m. */
- $"6C63 5683 5901 0000 8159 035A 5054 6C97" /* lcVƒY...Y.ZPTl— */
- $"6D01 6C68 AD6D 0866 9EF7 FFFF F3B1 6C6B" /* m.lh­m.fž÷ÿÿó±lk */
- $"956D 026C 6256 8359 0100 0081 5903 5A50" /* •m.lbVƒY...Y.ZP */
- $"546C CA6D 0667 81A6 9D7A 666C 966D 026C" /* TlÊm.g¦zfl–m.l */
- $"6256 8359 0100 0081 5903 5A51 536C CB6D" /* bVƒY...Y.ZQSlËm */
- $"0369 6565 6998 6D02 6C62 5783 5901 0000" /* .ieei˜m.lbWƒY... */
- $"8159 035A 5152 6AEA 6C02 6B61 5783 5901" /* Y.ZQRjêl.kaWƒY. */
- $"0000 8159 035A 5252 6AEA 6C02 6B61 5783" /* ..Y.ZRRjêl.kaWƒ */
- $"5901 0000 8159 035A 5252 6AEA 6C02 6B61" /* Y...Y.ZRRjêl.ka */
- $"5783 5901 0000 8159 035A 5352 6AEA 6C02" /* WƒY...Y.ZSRjêl. */
- $"6B61 5783 5900 0082 5903 5A54 5168 EA6B" /* kaWƒY..‚Y.ZTQhêk */
- $"0269 5E56 8359 0000 8359 0257 4D5E EA63" /* .i^VƒY..ƒY.WM^êc */
- $"0260 5756 8359 0100 0082 5902 5A55 53EA" /* .`WVƒY...‚Y.ZUSê */
- $"5601 5556 8459 0100 00FB 5901 0000 FB59" /* V.UV„Y...ûY...ûY */
- $"0100 00FB 5901 0000 FB59 0100 00FA 5981" /* ...ûY...ûY...úY */
- $"00F9 5982 00F7 5983 00F6 5986 00F3 59FF" /* .ùY‚.÷Yƒ.öY†.óYÿ */
- $"00FF 0000 00FF 00FF 00FF 00FF 00FF 00FF" /* .ÿ...ÿ.ÿ.ÿ.ÿ.ÿ.ÿ */
- $"00FF 00FF 00FF 00FF 00FF 00FF 00FF 00FF" /* .ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ */
- $"00FF 00FF 00FF 00FF 00FF 00FF 00FF 00FF" /* .ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ */
- $"00FF 00FF 00FF 00DF 009F 7CD7 00A6 7CD3" /* .ÿ.ÿ.ÿ.ß.Ÿ|×.¦|Ó */
- $"0001 7C7C 8000 9D7B 847C D000 037C 7C00" /* ..||€.{„|Ð..||. */
- $"7C9F 7F01 7B7B 837C D000 027B 88A5 9EB0" /* |Ÿ..{{ƒ|Ð..{ˆ¥ž° */
- $"03AC 9D81 7B83 7CCD 0004 7C00 81B3 D09E" /* .¬{ƒ|Í..|.³Ðž */
- $"D302 D0C3 A184 7CCD 0004 7C00 8FCA D79F" /* Ó.Ðá„|Í..|.Êן */
- $"D803 CEB4 837A 827C CD00 037C 0095 CEA0" /* Ø.δƒz‚|Í..|.•Î  */
- $"D803 D1B7 847A 827C CC00 047C 7C78 9BD0" /* Ø.Ñ·„z‚|Ì..||x›Ð */
- $"A0D7 03D1 B884 7A83 7CCB 0004 7C7C 79A8" /*  ×.Ѹ„zƒ|Ë..||y¨ */
- $"D3A0 D703 D2BC 867A B87C 9500 057C 7C00" /* Ó ×.Ò¼†z¸|•..||. */
- $"81BD D5A0 D603 D3C3 9278 BA7C 9200 067C" /* ½Õ Ö.ÓÃ’xº|’..| */
- $"7C00 799D CED5 A0D6 04D4 CBAC 7D79 BA7C" /* |.yÎÕ Ö.Ôˬ}yº| */
- $"9000 067C 7C00 7B97 C5D3 A2D5 03D1 C4A3" /* ..||.{—ÅÓ¢Õ.ÑÄ£ */
- $"8280 7AB4 7B03 007B 7C7C 8E00 077C 7C00" /* ‚€z´{..{||Ž..||. */
- $"81A4 C8D2 D4A2 D505 D4D0 C8B7 A69F B19E" /* ¤ÈÒÔ¢Õ.ÔÐÈ·¦Ÿ±ž */
- $"079F 9F9E 9D94 8100 7C8D 0007 7C7C 0081" /* .ŸŸž”.|..||. */
- $"ADCD D3D3 A4D4 03D3 D2D0 CE80 CCB2 CB03" /* ­ÍÓÓ¤Ô.ÓÒÐ΀̲Ë. */
- $"C7B9 9500 807C 8900 817C 037A 98C6 CDE2" /* ǹ•.€|‰.|.z˜ÆÍâ */
- $"CE03 CCBE 9B7A 827C 8600 017C 7C80 0002" /* Î.̾›z‚|†..||€.. */
- $"7697 B181 B403 B5B5 B4B4 9EB5 01B4 B4B6" /* v—±´.µµ´´žµ.´´¶ */
- $"B506 B4B4 B3AA 9177 7980 0001 7C7C 8400" /* µ.´´³ª‘wy€..||„. */
- $"097C 0078 7D87 8B8B 8D94 95E2 960A 9592" /* Æ|.x}‡‹‹”•â–•’ */
- $"8E8C 8B8B 867D 007C 7C82 0009 7C00 7892" /* ŽŒ‹‹†}.||‚.Æ|.x’ */
- $"B5C1 C4C5 C6C6 81C7 03C6 C6C7 C79E C601" /* µÁÄÅÆÆÇ.ÆÆÇÇžÆ. */
- $"C7C7 82C6 01C7 C7AC C683 C70A C6C6 C4C3" /* ÇÇ‚Æ.ÇǬƃÇÂÆÆÄà */
- $"C3BD AB8C 7A7C 7C82 0005 7893 C5CE CFD0" /* ý«Œz||‚..x“ÅÎÏÐ */
- $"E9CF 08D0 D0CF CEC9 B58B 007C 8000 047C" /* éÏ.ÐÐÏÎɵ‹.|€..| */
- $"0080 B9CE F0D0 0CCF C5A7 7E00 7C00 007C" /* .€¹ÎðÐ.Ïŧ~.|..| */
- $"008F C5CE B3CF 03D0 CDCF D0B7 CF0A C9B2" /* .ÅγÏ.ÐÍÏзÏÂɲ */
- $"8600 7C00 007C 7894 C6B3 CF05 D0CB BEBA" /* †.|..|x”ƳÏ.Ð˾º */
- $"CCD0 B6CF 0ACA B487 007C 007C 7C00 8FC4" /* ÌжÏÂÊ´‡.|.||.Ä */
- $"B4CE 05C9 F2ED B9CC CFB5 CE0B C8B1 8400" /* ´Î.Éòí¹ÌϵÎ.ȱ„. */
- $"7C00 7C7C 0089 C0CC B3CD 05CC F3FF E7B9" /* |.||.‰À̳Í.Ìóÿç¹ */
- $"CEB5 CD0B C5AC 817B 7C00 7C7C 0085 BCCB" /* εÍ.Ŭ{|.||.…¼Ë */
- $"B3CC 06C9 EAFF FFD8 BDCE B4CC 0BC4 A77D" /* ³Ì.ÉêÿÿؽδÌ.ħ} */
- $"7B7C 007C 7C00 81B6 CAB3 CC01 C9DC 80FF" /* {|.||.¶Ê³Ì.ÉÜ€ÿ */
- $"02C6 C4CD B2CC 0DCB C1A3 7D7B 7C00 7C7C" /* .ÆÄͲÌ.ËÁ£}{|.|| */
- $"7B7D B1C9 CBB2 CA07 C9CF FBFF FFF1 BACB" /* {}±É˲Ê.ÉÏûÿÿñºË */
- $"B2CA 03C9 BE9D 7B83 7C02 7BAB C8B4 CA01" /* ²Ê.ɾ{ƒ|.{«È´Ê. */
- $"C8ED 80FF 02D9 BCCB B1CA 03C9 BC98 7A83" /* Èí€ÿ.ټ˱Ê.ɼ˜zƒ */
- $"7C02 7AA5 C6B4 C901 C6DA 80FF 03FD C1C4" /* |.z¥Æ´É.ÆÚ€ÿ.ýÁÄ */
- $"CAB0 C903 C7B9 957A 837C 0279 9FC4 B4C8" /* Ê°É.ǹ•zƒ|.yŸÄ´È */
- $"02C7 CAF7 80FF 02E8 B8C9 B0C8 03C5 B68F" /* .ÇÊ÷€ÿ.è¸É°È.Ŷ */
- $"7A83 7C02 799A C2B5 C701 C4E4 81FF 02CA" /* zƒ|.yšÂµÇ.Ääÿ.Ê */
- $"BFC8 AFC7 06C4 B38B 7A7C 7C00 807C 0278" /* ¿È¯Ç.ij‹z||.€|.x */
- $"93C0 B1C6 00C7 80C8 02C4 CFFD 80FF 01F2" /* “À±Æ.Ç€È.ÄÏý€ÿ.ò */
- $"B8B0 C606 C2AF 897A 7C7C 0080 7C02 798F" /* ¸°Æ.¯‰z||.€|.y */
- $"BEB0 C607 C8C0 B4B2 B6C3 C6ED 81FF 02D4" /* ¾°Æ.ÈÀ´²¶ÃÆíÿ.Ô */
- $"BBC7 AEC6 06C1 AC84 7A7C 7C00 807C 0279" /* »Ç®Æ.Á¬„z||.€|.y */
- $"8BBB AFC5 08C6 B6BA DCE5 D5B3 BAD8 81FF" /* ‹»¯Å.ƶºÜåÕ³ºØÿ */
- $"02F9 BBC4 AEC5 06C0 A982 7B7C 7C00 807C" /* .ù»Ä®Å.À©‚{||.€| */
- $"027A 85B7 AEC4 02C5 C1CE 81FF 03F7 BAC1" /* .z…·®Ä.ÅÁÎÿ.÷ºÁ */
- $"F481 FF02 DCB7 C6AD C40D BDA5 817B 7C7C" /* ôÿ.Ü·Æ­Ä.½¥{|| */
- $"0000 7C7C 7A83 B4C3 ADC4 03C3 B3BE E981" /* ..||zƒ´Ã­Ä.ó¾é */
- $"FF02 E8B6 DC81 FF02 FDBE C0AD C40D BCA1" /* ÿ.è¶Üÿ.ý¾À­Ä.¼¡ */
- $"7E7B 7C7C 0000 7C7C 7B80 B0C2 ACC3 0CC4" /* ~{||..||{€°Â¬Ã.Ä */
- $"B5DD DAAE C4F2 FFFF FAC2 C5F8 81FF 02E2" /* µÝÚ®ÄòÿÿúÂÅøÿ.â */
- $"B5C4 ACC3 01B9 9D81 7C07 0000 7C7C 7B7C" /* µÄ¬Ã.¹|...||{| */
- $"ABC0 ABC1 0DC2 BCC1 FFFF F7C7 ACD0 FBFC" /* «À«Á.¼Áÿÿ÷ǬÐûü */
- $"C7BC E082 FF02 C0BD C2AB C101 B79A 817C" /* Ǽà‚ÿ.À½Â«Á.·š| */
- $"0100 0080 7C02 7BA7 BFAB C102 C2B2 EB81" /* ...€|.{§¿«Á.²ë */
- $"FF07 EDB9 B3D7 C3BF C7FA 81FF 02E6 B3C2" /* ÿ.í¹³×ÿÇúÿ.æ³Â */
- $"AAC1 03C0 B595 7B80 7C01 0000 807C 027A" /* ªÁ.Àµ•{€|...€|.z */
- $"A3BE AAC0 02C1 B6CA 84FF 05DE B8C0 C0BD" /* £¾ªÀ.Á¶Ê„ÿ.Þ¸ÀÀ½ */
- $"E382 FF02 C2BA C1A9 C003 BFB2 927A 807C" /* ã‚ÿ.ºÁ©À.¿²’z€| */
- $"0100 0080 7C02 789D BCAA BF02 BEB3 F584" /* ...€|.x¼ª¿.¾³õ„ */
- $"FF06 EBBF BEBF BDC9 FC81 FF02 E8B2 C0A9" /* ÿ.뿾¿½Éüÿ.è²À© */
- $"BF03 BEB0 8F7A 807C 0100 0080 7C02 7898" /* ¿.¾°z€|...€|.x˜ */
- $"BAA9 BE02 BFB5 D984 FF02 FBC7 BC80 BE01" /* º©¾.¿µÙ„ÿ.ûǼ€¾. */
- $"BBE7 82FF 02C3 B7BF A8BE 03BC AD8B 7A80" /* »ç‚ÿ.÷¿¨¾.¼­‹z€ */
- $"7C01 0000 807C 0278 95B9 A9BD 02BC B3E9" /* |...€|.x•¹©½.¼³é */
- $"84FF 01DD B981 BD02 BACB FE81 FF02 EAB0" /* „ÿ.ݹ½.ºËþÿ.ê° */
- $"BEA8 BD03 BAAA 887A 807C 0100 0080 7C02" /* ¾¨½.ºªˆz€|...€|. */
- $"7890 B8A8 BD05 BEB2 C1AC C7F6 81FF 02F4" /* x¸¨½.¾²Á¬Çöÿ.ô */
- $"C0BC 82BD 01BB EA82 FF02 C4B6 BEA7 BD03" /* À¼‚½.»ê‚ÿ.Ķ¾§½. */
- $"BAA8 867A 807C 0100 0080 7C02 788B B5A7" /* º¨†z€|...€|.x‹µ§ */
- $"BC0C BDB5 C1FF F2BD AAD5 FCFF FFD3 B983" /* ¼.½µÁÿò½ªÕüÿÿÓ¹ƒ */
- $"BC01 B9CC 82FF 02EB AFBD A7BC 03B8 A584" /* ¼.¹Ì‚ÿ.믽§¼.¸¥„ */
- $"7B80 7C01 0000 807C 0279 88B3 A8BC 01AE" /* {€|...€|.yˆ³¨¼.® */
- $"ED80 FF06 E5B1 B1E6 ECBB BB84 BC01 B9EB" /* í€ÿ.å±±æì»»„¼.¹ë */
- $"82FF 02C5 B4BD A6BC 03B7 A381 7B80 7C01" /* ‚ÿ.Å´½¦¼.·£{€|. */
- $"0000 807C 027A 85B1 A6BB 02BC AFCC 82FF" /* ..€|.z…±¦».¼¯Ì‚ÿ */
- $"04FE D6AF BBBA 85BB 01B7 CC82 FF02 ECAE" /* .þÖ¯»º…».·Ì‚ÿ.ì® */
- $"BCA6 BB03 B5A0 807B 807C 0100 0080 7C03" /* ¼¦».µ €{€|...€|. */
- $"7A80 ADB9 A5BA 02B8 B0F7 84FF 01DE B486" /* z€­¹¥º.¸°÷„ÿ.Þ´† */
- $"BA02 B9B8 EB82 FF02 C3B2 BBA5 BA03 B39C" /* º.¹¸ë‚ÿ.ò»¥º.³œ */
- $"7F7B 807C 0100 0080 7C03 7B7E AAB7 A4B8" /* .{€|...€|.{~ª·¤¸ */
- $"02BA ABD8 84FF 02F9 C1B6 87B8 01B5 CC82" /* .º«Ø„ÿ.ùÁ¶‡¸.µÌ‚ */
- $"FF02 EBAC B9A5 B803 B199 7D7B 807C 0100" /* ÿ.묹¥¸.±™}{€|.. */
- $"0080 7C03 7B7D A7B6 A4B7 02B2 B7FE 84FF" /* .€|.{}§¶¤·.²·þ„ÿ */
- $"01D7 B388 B702 B6B6 EB82 FF02 C2B0 B8A4" /* .׳ˆ·.¶¶ë‚ÿ.°¸¤ */
- $"B701 AF96 827C 0100 0081 7C02 7BA3 B5A3" /* ·.¯–‚|...|.{£µ£ */
- $"B602 B7A8 E584 FF02 F1B8 B589 B601 B3CA" /* ¶.·¨å„ÿ.ñ¸µ‰¶.³Ê */
- $"82FF 02EA AAB7 A4B6 01AD 9382 7C01 0000" /* ‚ÿ.ꪷ¤¶.­“‚|... */
- $"817C 0278 9FB4 97B5 0DB4 B5B6 B4B6 B5B4" /* |.xŸ´—µ.´µ¶´¶µ´ */
- $"B6B5 B4B6 B6AD C085 FF11 CCB0 B6B5 B4B6" /* ¶µ´¶¶­À…ÿ.Ì°¶µ´¶ */
- $"B5B4 B6B5 B4B6 B4B5 B6B3 B4EB 82FF 0EC0" /* µ´¶µ´¶´µ¶³´ë‚ÿ.À */
- $"AFB6 B5B4 B6B4 B4B6 B4B5 B6B4 B5B6 97B5" /* ¯¶µ´¶´´¶´µ¶´µ¶—µ */
- $"01AB 9082 7C01 0000 817C 0278 9CB3 95B5" /* .«‚|...|.xœ³•µ */
- $"0FB6 AFA7 A9AA A7AA AAA7 ABA9 A7AC B1A9" /* .¶¯§©ª§ªª§«©§¬±© */
- $"F084 FF12 E9AA A6AA AAA7 ABA9 A7AB A8A8" /* ð„ÿ.骦ªª§«©§«¨¨ */
- $"ACA8 A8AB A7A5 C882 FF0F E8A8 B2A8 A8AB" /* ¬¨¨«§¥È‚ÿ.訲¨¨« */
- $"A8A8 ACA8 A9AC A7A9 AAAB 95B5 03B4 A98E" /* ¨¨¬¨©¬§©ª«•µ.´©Ž */
- $"7B81 7C01 0000 817C 0278 99B2 95B4 0EB3" /* {|...|.x™²•´.³ */
- $"B7F9 D2C7 FFC1 CEFF BCE1 FABB AACD 84FF" /* ·ùÒÇÿÁÎÿ¼áú»ªÍ„ÿ */
- $"14FD BAC6 FFC5 D3FF B7DF F9B7 EBF2 B0F6" /* .ýºÆÿÅÓÿ·ßù·ëò°ö */
- $"E6B9 FDDA A7EB 82FF 0FBD AAE6 F8B0 EBF1" /* æ¹ýÚ§ë‚ÿ.½ªæø°ëñ */
- $"B5F7 E3B4 FED9 C5D5 AF94 B403 B3A7 8B7B" /* µ÷ã´þÙÅÕ¯”´.³§‹{ */
- $"817C 0100 0081 7C02 7794 B195 B30E B1B9" /* |...|.w”±•³.±¹ */
- $"FFD2 C7FF D3DE FFBA E3FF BDAA F984 FF14" /* ÿÒÇÿÓÞÿºãÿ½ªù„ÿ. */
- $"DBA2 DAFF C4D4 FFCA EBFE B4EF FBC4 FEE9" /* Û¢ÚÿÄÔÿÊëþ´ïûÄþé */
- $"B6FF EAAB C082 FF0F E4A3 ECFF C5F6 F5B2" /* ¶ÿê«À‚ÿ.ä£ìÿÅöõ² */
- $"FBEF C8FF DAC4 DAAE 94B3 03B2 A589 7B81" /* ûïÈÿÚÄÚ®”³.²¥‰{ */
- $"7C01 0000 807C 037D 7690 AE95 B104 AFB7" /* |...€|.}v®•±.¯· */
- $"FFE0 D681 FF04 CDEC FCAE D884 FF06 F7AC" /* ÿàÖÿ.Íìü®Ø„ÿ.÷¬ */
- $"E0FF FFD4 E180 FF02 FDC9 F380 FF06 EFCA" /* àÿÿÔá€ÿ.ýÉó€ÿ.ïÊ */
- $"FFFF FAAE E582 FF01 B6DA 80FF 02F7 C7FB" /* ÿÿú®å‚ÿ.¶Ú€ÿ.÷Çû */
- $"80FF 03E5 D6D9 AC94 B103 B0A2 877B 817C" /* €ÿ.åÖÙ¬”±.°¢‡{| */
- $"0100 0081 7C02 768D AC95 B002 AEB7 FB85" /* ...|.v¬•°.®·û… */
- $"FF01 CDB1 85FF 01C9 B890 FF01 D5B8 82FF" /* ÿ.ͱ…ÿ.ɸÿ.Õ¸‚ÿ */
- $"02E0 B3FC 87FF 01D5 AA94 B003 AE9F 857B" /* .à³ü‡ÿ.Õª”°.®Ÿ…{ */
- $"817C 0100 0081 7C02 788A AB95 AF02 ADB6" /* |...|.xŠ«•¯.­¶ */
- $"FB84 FF02 F0A5 E584 FF02 EEA6 EC90 FF02" /* û„ÿ.ð¥å„ÿ.î¦ìÿ. */
- $"FCAE E281 FF02 FCB4 DB87 FF01 D5A9 94AF" /* ü®âÿ.ü´Û‡ÿ.Õ©”¯ */
- $"03AC 9D83 7B81 7C01 0000 817C 0278 86A9" /* .¬ƒ{|...|.x†© */
- $"95AD 02AB B4FB 84FF 01BE BD85 FF01 BAC3" /* •­.«´û„ÿ.¾½…ÿ.ºÃ */
- $"92FF 01D6 B480 FF04 FCD8 A4B3 FB86 FF01" /* ’ÿ.Ö´€ÿ.üؤ³û†ÿ. */
- $"D4A7 94AD 03AB 9A81 7B81 7C01 0000 817C" /* Ô§”­.«š{|...| */
- $"0278 83A7 95AC 02AA B3FB 83FF 02E5 A3F2" /* .xƒ§•¬.ª³ûƒÿ.å£ò */
- $"84FF 02E1 A5F6 92FF 09FD AEDC FBDE B595" /* „ÿ.á¥ö’ÿÆý®ÜûÞµ• */
- $"B6A9 D886 FF01 D3A6 94AC 03A9 9880 7B81" /* ¶©Ø†ÿ.Ó¦”¬.©˜€{ */
- $"7C01 0000 817C 0278 80A5 95AC 02AA B3FB" /* |...|.x€¥•¬.ª³û */
- $"82FF 02FE B0CB 84FF 02FC ADD0 94FF 09DB" /* ‚ÿ.þ°Ë„ÿ.ü­Ð”ÿÆÛ */
- $"A1A8 95A2 D6FF D1AA FA85 FF01 D3A6 94AC" /* ¡¨•¢ÖÿѪú…ÿ.Ó¦”¬ */
- $"03A8 967F 7B81 7C01 0000 817C 0279 7FA3" /* .¨–.{|...|.y.£ */
- $"95AB 02A9 B2FB 82FF 02D7 A7FB 84FF 02D2" /* •«.©²û‚ÿ.קû„ÿ.Ò */
- $"AAFD 95FF 08AD B4DD FCFF FFFA A5D3 85FF" /* ªý•ÿ.­´Ýüÿÿú¥Ó…ÿ */
- $"01D3 A594 AB03 A694 7E7B 817C 0100 0081" /* .Ó¥”«.¦”~{|... */
- $"7C02 7A7D A095 A902 A7B1 FB81 FF02 F8A5" /* |.z} •©.§±ûÿ.ø¥ */
- $"DA84 FF02 F4A4 E096 FF01 DCC2 82FF 02D3" /* Ú„ÿ.ô¤à–ÿ.Ü‚ÿ.Ó */
- $"A5F8 84FF 01D2 A394 A902 A491 7D82 7C01" /* ¥ø„ÿ.Ò£”©.¤‘}‚|. */
- $"0000 817C 027A 7A9E 95A8 08A6 B1EF F3F2" /* ..|.zzž•¨.¦±ïóò */
- $"F2F6 C6B0 85FF 02C5 B4F5 95F2 03F3 F2B5" /* òöÆ°…ÿ.Å´õ•ò.óòµ */
- $"E881 FF03 FCA7 CCF6 82F2 02F7 CDA3 94A8" /* èÿ.ü§Ìö‚ò.÷Í£”¨ */
- $"01A3 8F83 7C01 0000 817C 027B 779C 96A7" /* .£ƒ|...|.{wœ–§ */
- $"00A8 82AB 019C E984 FF03 E9A6 AAAC 96AB" /* .¨‚«.œé„ÿ.馪¬–« */
- $"02AC A6C1 82FF 02D8 A0AC 83AB 00A9 95A7" /* .¬¦Á‚ÿ.Ø ¬ƒ«.©•§ */
- $"01A1 8D83 7C01 0000 817C 037B 7699 A595" /* .¡ƒ|...|.{v™¥• */
- $"A600 A580 A402 A599 C085 FF02 BCA1 A599" /* ¦.¥€¤.¥™À…ÿ.¼¡¥™ */
- $"A401 A5E9 81FF 02CB 96A3 83A4 00A5 95A6" /* ¤.¥éÿ.Ë–£ƒ¤.¥•¦ */
- $"029F 8A7B 827C 0100 0082 7C02 7596 A399" /* .ŸŠ{‚|...‚|.u–£™ */
- $"A402 A29F F584 FF01 DDA0 9BA4 09A0 BFFF" /* ¤.¢Ÿõ„ÿ.Ý ›¤Æ ¿ÿ */
- $"FFE6 ADAB D299 A59B A402 9D88 7B82 7C01" /* ÿæ­«Ò™¥›¤.ˆ{‚|. */
- $"0000 827C 0276 94A2 98A3 02A4 98D1 84FF" /* ..‚|.v”¢˜£.¤˜Ñ„ÿ */
- $"02F9 AFA0 9CA3 09A4 B9A9 A0CB FCFF B599" /* .ù¯ œ£Æ¤¹© Ëüÿµ™ */
- $"A49A A302 9C87 7B82 7C01 0000 827C 0275" /* ¤š£.œ‡{‚|...‚|.u */
- $"92A2 98A3 02A1 A4F5 84FF 01CF 9E9D A303" /* ’¢˜£.¡¤õ„ÿ.Ïž£. */
- $"A0A9 DEFB 80FF 02F3 9CA0 9AA3 029B 867B" /*  ©Þû€ÿ.󜠚£.›†{ */
- $"827C 0100 0081 7C03 7D74 8FA1 97A2 05A3" /* ‚|...|.}t¡—¢.£ */
- $"9FA0 9ED6 FE81 FF02 F0A6 A09D A202 A0A9" /* Ÿ žÖþÿ.𦠢. © */
- $"F382 FF01 D893 9AA2 0299 837B 827C 0100" /* ó‚ÿ.Ø“š¢.™ƒ{‚|.. */
- $"0081 7C03 7D73 8D9F 97A0 069F 9FF1 D697" /* .|.}sŸ— .ŸŸñÖ— */
- $"A6E6 80FF 01C1 9B9F A001 9BD2 83FF 02BB" /* ¦æ€ÿ.Á›Ÿ .›Òƒÿ.» */
- $"94A1 98A0 0297 827B 827C 0100 0081 7C03" /* ”¡˜ .—‚{‚|...|. */
- $"7D72 8A9E 979F 0B9D A6FB FFF9 BF91 B6F6" /* }rŠž—Ÿ.¦ûÿù¿‘¶ö */
- $"E69E 9E9F 9F01 9BB4 83FF 03FA A199 A096" /* æžžŸŸ.›´ƒÿ.ú¡™ – */
- $"9F03 9E95 807B 827C 0100 0081 7C03 7D72" /* Ÿ.ž•€{‚|...|.}r */
- $"889D 979E 0199 B281 FF04 EFAD 9EA9 9CA0" /* ˆ—ž.™²ÿ.ï­ž©œ  */
- $"9E02 9D9F EE83 FF01 E492 979E 039D 9480" /* ž.Ÿîƒÿ.ä’—ž.”€ */
- $"7B82 7C01 0000 817C 037D 7487 9B97 9D01" /* {‚|...|.}t‡›—. */
- $"96BF 82FF 02FE B697 A29D 0198 D184 FF02" /* –¿‚ÿ.þ¶—¢.˜Ñ„ÿ. */
- $"C191 9E95 9D03 9C92 7F7B 827C 0100 0081" /* Á‘ž•.œ’.{‚|... */
- $"7C03 7D75 849A 979C 0194 CE81 FF02 F8BD" /* |.}u„š—œ.”Îÿ.ø½ */
- $"9BA3 9C01 98B4 84FF 02F8 9D99 959C 039B" /* ›£œ.˜´„ÿ.ø™•œ.› */
- $"907E 7B82 7C01 0000 817C 037D 7482 9997" /* ~{‚|...|.}t‚™— */
- $"9B01 94DF 80FF 03EE AD95 9AA3 9B02 9A9D" /* ›.”߀ÿ.î­•š£›.š */
- $"EF84 FF02 CC91 9C94 9B03 9A8F 7C7B 827C" /* ï„ÿ.Ì‘œ”›.š|{‚| */
- $"0100 0081 7C03 7D74 8098 979A 0697 ECFF" /* ...|.}t€˜—š.—ìÿ */
- $"FFE0 A195 A69A 0195 D084 FF02 F098 9994" /* ÿà¡•¦š.•Ð„ÿ.𘙔 */
- $"9A02 998D 7B83 7C01 0000 817C 037D 737E" /* š.™{ƒ|...|.}s~ */
- $"9896 9A06 989F F9FF D099 97A7 9A02 96AD" /* ˜–š.˜ŸùÿЙ—§š.–­ */
- $"FD83 FF02 FCA6 9794 9A02 998D 7B83 7C01" /* ýƒÿ.ü¦—”š.™{ƒ|. */
- $"0000 817C 037D 737D 9796 9905 95AD FCBE" /* ..|.}s}—–™.•­ü¾ */
- $"9498 A999 0196 DD83 FF02 F7A3 9794 9902" /* ”˜©™.–݃ÿ.÷£—”™. */
- $"988C 7A83 7C01 0000 817C 037D 737B 9696" /* ˜Œzƒ|...|.}s{–– */
- $"9803 95B0 B392 AB98 0294 AAF9 82FF 01CF" /* ˜.•°³’«˜.”ªù‚ÿ.Ï */
- $"9595 9802 978A 7A83 7C01 0000 817C 037D" /* ••˜.—Šzƒ|...|.} */
- $"747B 9498 9700 94AD 9708 93B9 F9FF FFF6" /* t{”˜—.”­—.“¹ùÿÿö */
- $"C797 9695 9702 9688 7983 7C01 0000 817C" /* Ç—–•—.–ˆyƒ|...| */
- $"037D 7479 93CA 9606 92A4 BEB8 9F91 9596" /* .}ty“Ê–.’¤¾¸Ÿ‘•– */
- $"9602 9588 7983 7C01 0000 817C 037D 7478" /* –.•ˆyƒ|...|.}tx */
- $"93CB 9603 9390 9193 9896 0294 8779 837C" /* “Ë–.“‘“˜–.”‡yƒ| */
- $"0100 0081 7C03 7D75 7892 EA95 0293 8679" /* ...|.}ux’ê•.“†y */
- $"837C 0100 0081 7C03 7D75 7892 EA95 0293" /* ƒ|...|.}ux’ê•.“ */
- $"8679 837C 0100 0081 7C03 7D76 7792 EA95" /* †yƒ|...|.}vw’ê• */
- $"0293 8679 837C 0100 0081 7C03 7D76 7792" /* .“†yƒ|...|.}vw’ */
- $"EA95 0293 8579 837C 0000 827C 037D 7776" /* ê•.“…yƒ|..‚|.}wv */
- $"8FEA 9402 9182 7883 7C00 0083 7C03 7A70" /* ê”.‘‚xƒ|..ƒ|.zp */
- $"8288 E989 0285 7A79 837C 0100 0082 7C02" /* ‚ˆé‰.…zyƒ|...‚|. */
- $"7D78 76EA 7901 7779 847C 0100 00FB 7C01" /* }xvêy.wy„|...û|. */
- $"0000 FB7C 0100 00FB 7C01 0000 FB7C 0100" /* ..û|...û|...û|.. */
- $"00FA 7C81 00F9 7C82 00F7 7C83 00F6 7C86" /* .ú|.ù|‚.÷|ƒ.ö|† */
- $"00F3 7CFF 00FF 0000 00FF 00FF 00FF 00FF" /* .ó|ÿ.ÿ...ÿ.ÿ.ÿ.ÿ */
- $"00FF 00FF 00FF 00FF 00FF 00FF 00FF 00FF" /* .ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ */
- $"00FF 00FF 00FF 00FF 00FF 00FF 00FF 00FF" /* .ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ */
- $"00FF 00FF 00FF 00FF 00FF 00DF 009F 74D7" /* .ÿ.ÿ.ÿ.ÿ.ÿ.ß.Ÿt× */
- $"00A6 74D3 0001 7474 8000 9D73 8474 D000" /* .¦tÓ..tt€.s„tÐ. */
- $"0374 7400 749E 7702 7673 7283 74D0 0003" /* .tt.tžw.vsrƒtÐ.. */
- $"7381 9FAB 9DAC 03A8 977A 7383 74CD 0004" /* sŸ«¬.¨—zsƒtÍ.. */
- $"7400 79AF CC9E CF03 CCBF 9B73 8374 CD00" /* t.y¯ÌžÏ.Ì¿›sƒtÍ. */
- $"0474 0088 C6D2 9FD3 03CA AF7C 7282 74CD" /* .t.ˆÆÒŸÓ.ʯ|r‚tÍ */
- $"0003 7400 8EC9 A0D3 03CC B27D 7282 74CC" /* ..t.ŽÉ Ó.̲}r‚tÌ */
- $"0004 7474 7094 CBA0 D203 CCB3 7C72 8374" /* ..ttp”Ë Ò.̳|rƒt */
- $"CB00 0474 7471 A1CE A0D1 03CC B67F 72B8" /* Ë..ttq¡Î Ñ.̶.r¸ */
- $"7495 0005 7474 0078 B7D0 A0D1 03CE BE8B" /* t•..tt.x·Ð Ñ.ξ‹ */
- $"70BA 7492 0006 7474 0070 96C9 CFA0 D004" /* pºt’..tt.p–ÉÏ Ð. */
- $"CFC6 A675 71BA 7490 0006 7474 0072 8FC0" /* ÏƦuqºt..tt.rÀ */
- $"CDA2 CF03 CBBF 9D7A B672 0473 0073 7474" /* Í¢Ï.Ë¿z¶r.s.stt */
- $"8E00 0674 7400 799D C3CD A3CF 04CE CAC3" /* Ž..tt.yÃÍ£Ï.ÎÊà */
- $"B2A0 B598 0496 8D79 0074 8D00 0774 7400" /* ² µ˜.–y.t..tt. */
- $"79A8 C8CE CEA4 CF03 CECD CBC9 B5C7 03C3" /* y¨ÈÎΤÏ.ÎÍËɵÇ.à */
- $"B58F 0080 7489 0081 7403 7192 C1C8 E2C9" /* µ.€t‰.t.q’ÁÈâÉ */
- $"03C7 B995 7282 7486 0001 7474 8000 026E" /* .ǹ•r‚t†..tt€..n */
- $"91AC E3AF 04AE A58A 6F71 8000 0174 7484" /* ‘¬ã¯.®¥Šoq€..tt„ */
- $"0008 7400 7075 8085 8487 8E80 8FAA 9000" /* ..t.pu€…„‡Ž€ª. */
- $"8FB0 9080 8F09 8B87 8584 847F 7600 7474" /* °€Æ‹‡…„„.v.tt */
- $"8200 0774 0070 8BAF BCBF C0E7 C109 C0BF" /* ‚..t.p‹¯¼¿ÀçÁÆÀ¿ */
- $"BEBE B8A6 8572 7474 8200 0370 8DC0 C9EE" /* ¾¾¸¦…rtt‚..pÀÉî */
- $"CA05 C9C4 B185 0074 8000 0474 0078 B4C8" /* Ê.Éı….t€..t.x´È */
- $"F0CA 0CC9 BFA1 7600 7400 0074 0088 BFC8" /* ðÊ.É¿¡v.t..t.ˆ¿È */
- $"B3C9 03CA C7C9 CAB7 C90A C3AD 7F00 7400" /* ³É.ÊÇÉÊ·ÉÂí..t. */
- $"0074 708C C0B3 C805 C9C3 B8B3 C4C9 B6C8" /* .tpŒÀ³È.Éø³ÄÉ¶È */
- $"0AC3 AE7F 0074 0074 7400 88BD B4C7 05C2" /* Âî..t.tt.ˆ½´Ç. */
- $"F1EC B2C4 C8B5 C70B C1AB 7C00 7400 7474" /* ñì²ÄȵÇ.Á«|.t.tt */
- $"0082 BAC6 B3C7 04C6 F2FF E6B3 B6C7 0BC0" /* .‚ºÆ³Ç.Æòÿ泶Ç.À */
- $"A67A 7374 0074 7400 7DB5 C5B3 C606 C3E7" /* ¦zst.tt.}µÅ³Æ.Ãç */
- $"FFFF D5B6 C8B4 C60B BDA1 7573 7400 7474" /* ÿÿնȴÆ.½¡ust.tt */
- $"0079 B0C4 B3C5 01C2 D880 FF02 C0BD C6B2" /* .y°Ä³Å.ÂØ€ÿ.À½Æ² */
- $"C50C C4BB 9D75 7374 0074 7473 75AA C2B3" /* Å.Ä»ust.ttsuªÂ³ */
- $"C406 C3C9 FAFF FFF0 B3B3 C403 C3B8 9673" /* Ä.ÃÉúÿÿð³³Ä.ø–s */
- $"8474 01A5 C1B4 C301 C1EB 80FF 02D6 B4C5" /* „t.¥Á´Ã.Áë€ÿ.Ö´Å */
- $"B1C3 03C2 B591 7283 7402 719E BFB4 C201" /* ±Ã.µ‘rƒt.qž¿´Â. */
- $"BFD5 80FF 03FD BBBD C3B0 C203 C0B2 8E72" /* ¿Õ€ÿ.ý»½Ã°Â.À²Žr */
- $"8374 0270 99BD B4C1 02C0 C4F6 80FF 02E6" /* ƒt.p™½´Á.ÀÄö€ÿ.æ */
- $"B1C2 B0C1 03BE AF87 7283 7402 7193 BBB5" /* ±Â°Á.¾¯‡rƒt.q“»µ */
- $"C001 BCE1 81FF 02C6 B7C1 AFC0 06BD AC84" /* À.¼áÿ.Æ·Á¯À.½¬„ */
- $"7274 7400 8074 0270 8CB9 B1BF 00C0 80C1" /* rtt.€t.pŒ¹±¿.À€Á */
- $"02BD CAFD 80FF 01F1 B1B0 BF06 BBA9 8172" /* .½Êý€ÿ.ñ±°¿.»©r */
- $"7474 0080 7402 7088 B7B0 BF07 C1B9 ACAB" /* tt.€t.pˆ·°¿.Á¹¬« */
- $"AEBC BEEB 81FF 02D1 B3C0 AEBF 06BA A67C" /* ®¼¾ëÿ.ѳÀ®¿.º¦| */
- $"7274 7400 8074 0271 83B4 AFBE 08BF AFB4" /* rtt.€t.qƒ´¯¾.¿¯´ */
- $"D9E3 D2AD B1D3 81FF 02F8 B4BC AEBE 06B8" /* ÙãÒ­±Óÿ.ø´¼®¾.¸ */
- $"A27A 7374 7400 8074 0372 7DB1 BCAE BD01" /* ¢zstt.€t.r}±¼®½. */
- $"B9CA 81FF 03F6 B4B9 F381 FF02 D8AF BEAD" /* ¹Êÿ.ö´¹óÿ.د¾­ */
- $"BD0D B69F 7973 7474 0000 7474 727A ADBB" /* ½.¶Ÿystt..ttrz­» */
- $"ADBC 03BB ABB7 E681 FF02 E6AE D881 FF02" /* ­¼.»«·æÿ.æ®Øÿ. */
- $"FDB7 B8AD BC0D B49A 7673 7474 0000 7474" /* ý·¸­¼.´švstt..tt */
- $"7378 A9BA ACBB 0CBC ACDB D7A6 BDF0 FFFF" /* sx©º¬».¼¬Ûצ½ðÿÿ */
- $"FABA BEF7 81FF 02DF ACBC ACBB 01B2 9781" /* úº¾÷ÿ.߬¼¬».²— */
- $"7407 0000 7474 7374 A4B8 ABB9 0DBA B3BB" /* t...ttst¤¸«¹.º³» */
- $"FFFF F7C2 A4CB FAFC C0B4 DC82 FF02 BAB4" /* ÿÿ÷¤ËúüÀ´Ü‚ÿ.º´ */
- $"BAAB B901 B093 8174 0100 0080 7402 729F" /* º«¹.°“t...€t.rŸ */
- $"B6AB B902 BAAA E981 FF07 ECB3 ABD1 BBB6" /* ¶«¹.ºªéÿ.쳫ѻ¶ */
- $"C0FA 81FF 02E4 AABA AAB9 03B8 AD8E 7380" /* Àúÿ.䪺ª¹.¸­Žs€ */
- $"7401 0000 8074 0272 9BB6 AAB8 02B9 ADC6" /* t...€t.r›¶ª¸.¹­Æ */
- $"84FF 05DC AFB7 B8B4 E082 FF02 BCB1 B9A9" /* „ÿ.ܯ·¸´à‚ÿ.¼±¹© */
- $"B803 B6AB 8A72 8074 0100 0080 7402 7095" /* ¸.¶«Šr€t...€t.p• */
- $"B4AA B602 B5AB F484 FF06 E9B6 B5B6 B4C2" /* ´ª¶.µ«ô„ÿ.鶵¶´Â */
- $"FC81 FF02 E6A9 B7A9 B603 B5A8 8872 8074" /* üÿ.æ©·©¶.µ¨ˆr€t */
- $"0100 0080 7402 6F91 B3A9 B602 B7AD D684" /* ...€t.o‘³©¶.·­Ö„ */
- $"FF02 FAC0 B480 B601 B3E4 82FF 02BD AFB7" /* ÿ.úÀ´€¶.³ä‚ÿ.½¯· */
- $"A8B6 03B4 A584 7280 7401 0000 8074 0270" /* ¨¶.´¥„r€t...€t.p */
- $"8DB2 A9B6 02B4 ACE7 84FF 01D9 B181 B602" /* ²©¶.´¬ç„ÿ.Ù±¶. */
- $"B3C5 FE81 FF02 E8A8 B7A8 B603 B3A3 8172" /* ³Åþÿ.訷¨¶.³£r */
- $"8074 0100 0080 7402 7087 B0A8 B505 B6AA" /* €t...€t.p‡°¨µ.¶ª */
- $"BDA4 C1F5 81FF 02F3 B8B4 82B5 01B2 E782" /* ½¤Áõÿ.ó¸´‚µ.²ç‚ */
- $"FF02 BFAD B6A7 B503 B2A1 7F72 8074 0100" /* ÿ.¿­¶§µ.²¡.r€t.. */
- $"0080 7402 7083 ADA7 B40C B5AC BBFF F2B8" /* .€t.pƒ­§´.µ¬»ÿò¸ */
- $"A2D0 FBFF FFCE B083 B401 B1C5 82FF 02EA" /* ¢Ðûÿÿΰƒ´.±Å‚ÿ.ê */
- $"A7B5 A7B4 03B0 9E7C 7380 7401 0000 8074" /* §µ§´.°ž|s€t...€t */
- $"0271 80AB A8B3 01A5 EC80 FF06 E4AA A9E2" /* .q€«¨³.¥ì€ÿ.䪩â */
- $"EAB2 B284 B301 B1E8 82FF 02BF ABB4 A6B3" /* ê²²„³.±è‚ÿ.¿«´¦³ */
- $"03AE 9B79 7380 7401 0000 8074 0272 7DA8" /* .®›ys€t...€t.r}¨ */
- $"A6B2 02B3 A6C8 82FF 04FE D3A8 B2B1 85B2" /* ¦².³¦È‚ÿ.þÓ¨²±…² */
- $"01AE C582 FF02 EAA6 B3A6 B203 AC98 7873" /* .®Å‚ÿ.꦳¦².¬˜xs */
- $"8074 0100 0080 7403 7278 A5B0 A5B1 02AF" /* €t...€t.rx¥°¥±.¯ */
- $"A9F7 84FF 01DA AB86 B102 B0AF E982 FF02" /* ©÷„ÿ.Ú«†±.°¯é‚ÿ. */
- $"BEA9 B2A5 B103 AB95 7773 8074 0100 0080" /* ¾©²¥±.«•ws€t...€ */
- $"7403 7276 A2AF A4B0 02B1 A2D5 84FF 02F8" /* t.rv¢¯¤°.±¢Õ„ÿ.ø */
- $"BAAE 87B0 01AC C682 FF02 EAA4 B1A5 B003" /* º®‡°.¬Æ‚ÿ.ꤱ¥°. */
- $"A991 7573 8074 0100 0080 7402 7375 9FA4" /* ©‘us€t...€t.suŸ¤ */
- $"AE03 AFA9 B0FE 84FF 01D3 AA88 AE02 ADAD" /* ®.¯©°þ„ÿ.Óªˆ®.­­ */
- $"E982 FF02 BCA7 AFA4 AE01 A78E 8274 0100" /* é‚ÿ.¼§¯¤®.§Ž‚t.. */
- $"0081 7402 729B ADA3 AE02 AFA0 E384 FF02" /* .t.r›­£®.¯ ã„ÿ. */
- $"F0B0 AD89 AE01 AAC4 82FF 02E9 A2AF A4AE" /* ð°­‰®.ªÄ‚ÿ.颯¤® */
- $"01A5 8C82 7401 0000 8174 0270 98AC 97AD" /* .¥Œ‚t...t.p˜¬—­ */
- $"0DAC ADAE ACAE ADAC AEAD ACAE AEA4 BB85" /* .¬­®¬®­¬®­¬®®¤»… */
- $"FF11 C7A7 AEAD ACAE ADAC AEAC ACAE ACAD" /* ÿ.ǧ®­¬®­¬®¬¬®¬­ */
- $"AEAB ABE9 82FF 0EBB A6AE ADAC AEAC ACAE" /* ®««é‚ÿ.»¦®­¬®¬¬® */
- $"ACAD AEAC ADAE 97AD 01A3 8982 7401 0000" /* ¬­®¬­®—­.£‰‚t... */
- $"8174 0270 94AA 95AC 0FAD A79F A1A2 9FA2" /* t.p”ª•¬.­§Ÿ¡¢Ÿ¢ */
- $"A29F A2A1 9FA4 A9A1 EF84 FF12 E6A2 9FA2" /* ¢Ÿ¢¡Ÿ¤©¡ï„ÿ.梟¢ */
- $"A1A0 A3A1 A0A2 A0A0 A3A0 A0A2 9F9D C282" /* ¡ £¡ ¢  £  ¢ŸÂ‚ */
- $"FF10 E6A0 A9A0 A0A2 A0A0 A2A0 A1A3 A0A1" /* ÿ.æ ©  ¢  ¢ ¡£ ¡ */
- $"A2A2 AB94 AC03 ABA1 8673 8174 0100 0081" /* ¢¢«”¬.«¡†st... */
- $"7402 7091 A995 AB0E A9AF FACE C2FF BCCA" /* t.p‘©•«.©¯úÎÂÿ¼Ê */
- $"FFB6 DEFA B4A1 C884 FF14 FDB2 C0FF BFCF" /* ÿ¶Þú´¡È„ÿ.ý²Àÿ¿Ï */
- $"FFAF DCFA AFEA F1A8 F5E4 B2FE D79D E982" /* ÿ¯Üú¯êñ¨õä²þ×é‚ */
- $"FF0F B8A1 E4F8 A9EA F0AE F7E0 ACFF D5C0" /* ÿ.¸¡äø©êð®÷à¬ÿÕÀ */
- $"D1A5 94AB 03AA 9F84 7381 7401 0000 8174" /* Ñ¥”«.ªŸ„st...t */
- $"026F 8CA8 95A9 0EA7 B1FF CEC2 FFD0 DBFF" /* .oŒ¨•©.§±ÿÎÂÿÐÛÿ */
- $"B3E0 FFB6 A2F9 84FF 14D7 99D8 FFBE D0FF" /* ³àÿ¶¢ù„ÿ.×™Øÿ¾Ðÿ */
- $"C5E9 FFAC EEFA C0FE E7B0 FFE8 A3B9 82FF" /* Åéÿ¬îúÀþç°ÿ裹‚ÿ */
- $"0FE2 99EA FFC1 F5F4 ABFB EDC4 FFD7 BED6" /* .â™êÿÁõô«ûíÄÿ×¾Ö */
- $"A394 A903 A89C 8173 8174 0100 0080 7403" /* £”©.¨œst...€t. */
- $"756E 88A6 95A8 04A6 B0FF DDD3 81FF 04C9" /* unˆ¦•¨.¦°ÿÝÓÿ.É */
- $"EBFB A6D5 84FF 06F6 A3DE FFFF D1DE 80FF" /* ëû¦Õ„ÿ.ö£ÞÿÿÑÞ€ÿ */
- $"02FD C4F2 80FF 06EE C6FF FFFA A7E2 82FF" /* .ýÄò€ÿ.îÆÿÿú§â‚ÿ */
- $"01B0 D780 FF02 F6C3 FB80 FF03 E3D3 D5A2" /* .°×€ÿ.öÃû€ÿ.ãÓÕ¢ */
- $"94A8 03A7 9A7F 7381 7401 0000 8074 0375" /* ”¨.§š.st...€t.u */
- $"6E85 A495 A702 A5AF FA85 FF01 C7AB 85FF" /* n…¤•§.¥¯ú…ÿ.Ç«…ÿ */
- $"01C4 B290 FF01 D1B1 82FF 02DD ACFB 87FF" /* .IJÿ.ѱ‚ÿ.ݬû‡ÿ */
- $"01D1 A194 A703 A598 7D73 8174 0100 0081" /* .Ñ¡”§.¥˜}st... */
- $"7402 7082 A295 A602 A4AE FB84 FF02 EF9C" /* t.p‚¢•¦.¤®û„ÿ.ïœ */
- $"E484 FF02 EC9E EB90 FF02 FCA7 DF81 FF02" /* ä„ÿ.ìžëÿ.ü§ßÿ. */
- $"FCAD D787 FF01 D0A0 94A6 03A3 957B 7381" /* ü­×‡ÿ.Р”¦.£•{s */
- $"7401 0000 8174 0270 7EA1 95A6 02A4 AEFB" /* t...t.p~¡•¦.¤®û */
- $"84FF 01B8 B885 FF01 B4BF 92FF 01D4 AD80" /* „ÿ.¸¸…ÿ.´¿’ÿ.Ô­€ */
- $"FF04 FCD4 9CAC FA86 FF01 D0A0 94A6 03A3" /* ÿ.üÔœ¬ú†ÿ.Р”¦.£ */
- $"937A 7381 7401 0000 8174 0270 7B9F 95A4" /* “zst...t.p{Ÿ•¤ */
- $"02A2 ACFA 83FF 02E3 9BF1 84FF 02DE 9EF5" /* .¢¬úƒÿ.ã›ñ„ÿ.Þžõ */
- $"92FF 09FD A8D9 FADB AD8B B1A1 D486 FF01" /* ’ÿÆý¨ÙúÛ­‹±¡Ô†ÿ. */
- $"CF9E 94A4 03A1 9178 7381 7401 0000 8174" /* Ïž”¤.¡‘xst...t */
- $"0270 779D 95A3 02A1 ACFA 82FF 02FD A9C7" /* .pw•£.¡¬ú‚ÿ.ý©Ç */
- $"84FF 02FC A5CD 94FF 09D9 989F 8B9B D3FF" /* „ÿ.ü¥Í”ÿÆÙ˜Ÿ‹›Óÿ */
- $"CDA1 F985 FF01 CF9D 94A3 03A0 8E77 7381" /* Í¡ù…ÿ.Ï”£. Žws */
- $"7401 0000 8174 0271 779A 95A2 02A0 ABFA" /* t...t.qwš•¢. «ú */
- $"82FF 02D4 A0FB 84FF 02CE A2FD 95FF 08A6" /* ‚ÿ.Ô û„ÿ.΢ý•ÿ.¦ */
- $"AEDB FCFF FFFA 9ECF 85FF 01CE 9C94 A203" /* ®ÛüÿÿúžÏ…ÿ.Îœ”¢. */
- $"9E8C 7673 8174 0100 0081 7402 7275 9895" /* žŒvst...t.ru˜• */
- $"A102 9FAA FA81 FF02 F79D D784 FF02 F29C" /* ¡.Ÿªúÿ.÷ׄÿ.òœ */
- $"DE96 FF01 DABD 82FF 02D0 9DF8 84FF 01CE" /* Þ–ÿ.Ú½‚ÿ.Ðø„ÿ.Î */
- $"9A94 A102 9C8A 7582 7401 0000 8174 0272" /* š”¡.œŠu‚t...t.r */
- $"7196 959F 089D A9EE F2F1 F1F6 C0AA 85FF" /* q–•Ÿ.©îòññöÀª…ÿ */
- $"02C0 ADF5 95F1 03F2 F1AE E681 FF03 FCA0" /* .À­õ•ñ.òñ®æÿ.ü  */
- $"C7F5 82F1 02F6 C89A 949F 029A 8775 8274" /* Çõ‚ñ.öÈš”Ÿ.š‡u‚t */
- $"0100 0081 7402 736F 9396 9E00 9F82 A201" /* ...t.so“–ž.Ÿ‚¢. */
- $"93E8 84FF 03E8 9EA2 A396 A202 A39D BB82" /* “è„ÿ.螢£–¢.£»‚ */
- $"FF02 D597 A383 A200 A195 9E01 9985 8374" /* ÿ.Õ—£ƒ¢.¡•ž.™…ƒt */
- $"0100 0081 7403 736E 929D 959E 009D 809C" /* ...t.sn’•ž.€œ */
- $"029D 91BC 84FF 03FE B599 9D99 9C01 9DE7" /* .‘¼„ÿ.þµ™™œ.ç */
- $"81FF 02C7 8D9B 839C 009D 959E 0198 8383" /* ÿ.Ç›ƒœ.•ž.˜ƒƒ */
- $"7401 0000 8274 016E 8F9A 9C02 9A98 F484" /* t...‚t.nšœ.š˜ô„ */
- $"FF01 DA99 9B9C 0997 B9FF FFE4 A7A6 CF91" /* ÿ.Ú™›œÆ—¹ÿÿ䧦ϑ */
- $"9D9B 9C02 9681 7382 7401 0000 8274 026F" /* ›œ.–s‚t...‚t.o */
- $"8C9A 989B 029C 90CF 84FF 02F8 A998 9D9B" /* Œš˜›.œÏ„ÿ.ø©˜› */
- $"08B3 A39A C8FC FFB0 919C 9A9B 0294 8073" /* .³£šÈüÿ°‘œš›.”€s */
- $"8274 0100 0082 7402 6D8A 9998 9A02 989C" /* ‚t...‚t.mŠ™˜š.˜œ */
- $"F484 FF01 CB94 9D9A 0397 A2DD FB80 FF02" /* ô„ÿ.Ë”š.—¢Ýû€ÿ. */
- $"F294 979A 9A02 927E 7382 7401 0000 8174" /* ò”—šš.’~s‚t...t */
- $"0375 6B87 9898 9904 969A 96D2 FE81 FF02" /* .uk‡˜˜™.–š–Òþÿ. */
- $"EF9E 979D 9902 97A1 F382 FF02 D68A 9A99" /* ïž—™.—¡ó‚ÿ.ÖŠš™ */
- $"9902 917C 7382 7401 0000 8174 0375 6A85" /* ™.‘|s‚t...t.uj… */
- $"9797 9806 9798 F1D3 8F9F E480 FF01 BB92" /* ——˜.—˜ñÓŸä€ÿ.»’ */
- $"9F98 0192 CF83 FF02 B68A 9998 9802 8F7B" /* Ÿ˜.’σÿ.¶Š™˜˜.{ */
- $"7382 7401 0000 8174 0375 6A82 9597 960B" /* s‚t...t.uj‚•—–. */
- $"939F FBFF F9BB 89B0 F5E4 9595 9F96 0192" /* “Ÿûÿù»‰°õä••Ÿ–.’ */
- $"AD83 FF03 FA9B 9097 9796 028D 7973 8274" /* ­ƒÿ.ú›——–.ys‚t */
- $"0100 0081 7403 756A 8195 9796 0191 AC81" /* ...t.uj•—–.‘¬ */
- $"FF04 EEA8 97A2 94A0 9602 9597 EC83 FF01" /* ÿ.¢” –.•—ìƒÿ. */
- $"E28A 9796 0395 8C78 7382 7401 0000 8174" /* ⊗–.•Œxs‚t...t */
- $"0375 6C7F 9497 9501 8EBB 82FF 02FE B28E" /* .ul.”—•.Ž»‚ÿ.þ²Ž */
- $"A295 018F CE84 FF02 BD89 9695 9503 948B" /* ¢•.΄ÿ.½‰–••.”‹ */
- $"7873 8274 0100 0081 7403 756D 7D92 9794" /* xs‚t...t.um}’—” */
- $"018C CB81 FF02 F8B8 93A3 9401 90AE 84FF" /* .ŒËÿ.ø¸“£”.®„ÿ */
- $"02F7 9691 9594 0393 8A77 7382 7401 0000" /* .÷–‘•”.“Šws‚t... */
- $"8174 0375 6C7B 9197 9301 8CDD 80FF 02ED" /* t.ul{‘—“.ŒÝ€ÿ.í */
- $"A78D A493 0292 96EE 84FF 02C8 8894 9493" /* §¤“.’–î„ÿ.Ȉ””“ */
- $"0392 8875 7382 7401 0000 8174 0375 6C79" /* .’ˆus‚t...t.uly */
- $"9096 9207 9190 EBFF FFDE 9A8D A692 018C" /* –’.‘ëÿÿÞš¦’.Œ */
- $"CC84 FF02 EF91 9194 9201 9186 8474 0100" /* Ì„ÿ.ï‘‘”’.‘†„t.. */
- $"0081 7403 756B 7790 9692 0690 97F8 FFCC" /* .t.ukw–’.—øÿÌ */
- $"918E A792 028E A6FD 83FF 02FC 9F8F 9492" /* ‘Ž§’.Ž¦ýƒÿ.üŸ”’ */
- $"0191 8584 7401 0000 8174 0375 6B75 8E96" /* .‘…„t...t.ukuŽ– */
- $"9005 8BA7 FCBA 8B8E A990 018D DB83 FF02" /* .‹§üº‹Ž©.Ûƒÿ. */
- $"F79B 8D94 9002 8F83 7383 7401 0000 8174" /* ÷›”.ƒsƒt...t */
- $"0375 6C74 8E96 9004 8CAA AD89 8FAA 9002" /* .ultŽ–.Œª­‰ª. */
- $"8CA3 F982 FF01 CB8C 9590 028F 8373 8374" /* Œ£ù‚ÿ.ËŒ•.ƒsƒt */
- $"0100 0081 7403 756B 728D 988F 008B AD8F" /* ...t.ukr˜.‹­ */
- $"088A B4F9 FFFF F6C3 8E8E 958F 028E 8172" /* .Š´ùÿÿöÃŽŽ•.Žr */
- $"8374 0100 0081 7403 756C 718C CA8E 068A" /* ƒt...t.ulqŒÊŽ.Š */
- $"9DBA B398 898D 968E 028D 8072 8374 0100" /* º³˜‰–Ž.€rƒt.. */
- $"0081 7403 756C 718B CB8E 038B 8888 8B98" /* .t.ulq‹ËŽ.‹ˆˆ‹˜ */
- $"8E02 8C80 7283 7401 0000 8174 0375 6D71" /* Ž.Œ€rƒt...t.umq */
- $"8BEA 8E02 8C80 7283 7401 0000 8174 0375" /* ‹êŽ.Œ€rƒt...t.u */
- $"6D70 8AEA 8D02 8B7F 7283 7401 0000 8174" /* mpŠê.‹.rƒt...t */
- $"0375 6E70 8AEA 8D02 8B7E 7283 7401 0000" /* .unpŠê.‹~rƒt... */
- $"8174 0375 6E70 8AEA 8D02 8B7E 7283 7400" /* t.unpŠê.‹~rƒt. */
- $"0082 7403 756F 6E88 EA8C 0289 7B71 8374" /* .‚t.uonˆêŒ.‰{qƒt */
- $"0000 8374 0372 697B 81E9 8202 7E73 7283" /* ..ƒt.ri{é‚.~srƒ */
- $"7401 0000 8274 0475 706E 7172 E671 0372" /* t...‚t.upnqræq.r */
- $"7270 7284 7401 0000 FB74 0100 00FB 7401" /* rpr„t...ût...ût. */
- $"0000 FB74 0100 00FB 7401 0000 FA74 8100" /* ..ût...ût...út. */
- $"F974 8200 F774 8300 F674 8600 F374 FF00" /* ùt‚.÷tƒ.öt†.ótÿ. */
- $"FF00 0000 7438 6D6B 0000 4008 0000 0000" /* ÿ...t8mk..@..... */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0101 0101 0202 0202 0202 0202 0202 0202" /* ................ */
- $"0202 0202 0202 0202 0202 0202 0202 0101" /* ................ */
- $"0101 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0102 0202" /* ................ */
- $"0304 0505 0606 0606 0606 0606 0606 0606" /* ................ */
- $"0606 0606 0606 0606 0606 0606 0606 0505" /* ................ */
- $"0503 0302 0100 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0001 0100 0000" /* ................ */
- $"0204 0506 0707 0707 0707 0707 0707 0707" /* ................ */
- $"0707 0707 0707 0707 0707 0707 0707 0606" /* ................ */
- $"090A 0805 0302 0100 0000 0000 0000 0000" /* ÆÂ.............. */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0101 001C 2F31" /* ............../1 */
- $"3436 383A 3A3A 3A3A 3A3A 3A3A 3A3A 3A3A" /* 468::::::::::::: */
- $"3A3A 3A3A 3A3A 3A3A 3A3A 3A3A 3A3A 3A34" /* :::::::::::::::4 */
- $"120B 0F0B 0704 0201 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0004 8FF3 FAF9" /* ............óúù */
- $"F9F9 F9F9 F9F9 F9F9 F9F9 F9F9 F9F9 F9F9" /* ùùùùùùùùùùùùùùùù */
- $"F9F9 F9F9 F9F9 F9F9 F9F9 F9F9 F9F9 FAFA" /* ùùùùùùùùùùùùùùúú */
- $"C433 1112 0C07 0402 0100 0000 0000 0000" /* Ä3.............. */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0001 0067 FFFF FFFF" /* ...........gÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFC3 201A 130C 0703 0100 0000 0000 0000" /* ÿÃ ............. */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0001 00A9 FFFF FFFF" /* ...........©ÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFF8 4A20 1B11 0A05 0200 0000 0000 0000" /* ÿøJ ..Â......... */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0002 00B6 FFFF FFFF" /* ...........¶ÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFB 5928 2216 0D07 0200 0000 0000 0000" /* ÿûY("........... */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0103 07CC FFFF FFFF" /* ...........Ìÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFD 6231 291B 1109 0401 0000 0000 0000" /* ÿýb1)..Æ........ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0201 21F0 FFFF FFFF" /* ..........!ðÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF 7337 2F21 160D 0704 0303 0303 0303" /* ÿÿs7/!.......... */
- $"0303 0303 0303 0303 0303 0303 0303 0303" /* ................ */
- $"0303 0303 0303 0303 0303 0303 0303 0303" /* ................ */
- $"0303 0303 0303 0303 0303 0302 0201 0100" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0001 0500 69FF FFFF FFFF" /* ..........iÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF 9A38 3628 1C14 0E0A 0909 0909 0909" /* ÿÿš86(...ÂÆÆÆÆÆÆ */
- $"0909 0909 0909 0909 0909 0909 0909 0909" /* ÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆ */
- $"0909 0909 0909 0909 0909 0909 0909 0909" /* ÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆ */
- $"0909 0909 0909 0909 0909 0807 0604 0302" /* ÆÆÆÆÆÆÆÆÆÆ...... */
- $"0100 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0203 0021 DFFF FFFF FFFF" /* .........!ßÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF E653 312D 231B 1512 1011 1010 1010" /* ÿÿæS1-#......... */
- $"1010 1010 1010 1010 1010 1010 1010 1010" /* ................ */
- $"1010 1010 1010 1010 1010 1010 1010 1010" /* ................ */
- $"1010 1010 1010 1010 1010 0E0C 0A08 0504" /* ............Â... */
- $"0301 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0002 0200 34D3 FFFF FFFF FFFF" /* ........4Óÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFD6 6E40 312A 2522 2121 2121 2121" /* ÿÿÿÖn@1*%"!!!!!! */
- $"2121 2121 2121 2121 2121 2121 2121 2121" /* !!!!!!!!!!!!!!!! */
- $"2121 2121 2121 2121 2121 2121 2121 2121" /* !!!!!!!!!!!!!!!! */
- $"2121 2121 2121 2121 2120 1E1B 1814 0D00" /* !!!!!!!!! ...... */
- $"0203 0100 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0102 006C F4FF FFFF FFFF FFFF" /* .......lôÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FEE8 DAD9 D9D8 D8D8 D8D8 D8D8" /* ÿÿÿÿþèÚÙÙØØØØØØØ */
- $"D8D8 D8D8 D8D8 D8D8 D8D8 D8D8 D8D8 D8D8" /* ØØØØØØØØØØØØØØØØ */
- $"D8D8 D8D8 D8D8 D8D8 D8D8 D8D8 D8D8 D8D8" /* ØØØØØØØØØØØØØØØØ */
- $"D8D8 D8D8 D8D8 D8D8 D8D8 D7D7 D6D5 D5A9" /* ØØØØØØØØØØ××ÖÕÕ© */
- $"1E00 0200 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0001 0300 71FF FFFF FFFF FFFF FFFF" /* ......qÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"8500 0402 0100 0000 0000 0000 0000 0000" /* …............... */
- $"0001 0203 0317 E1FF FFFF FFFF FFFF FFFF" /* ......áÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"9E03 0905 0302 0100 0000 0000 0000 0000" /* ž.Æ............. */
- $"0201 0000 002C E4E8 E8E9 EAEB ECEC EDED" /* .....,äèèéêëììíí */
- $"EDED EDED EDED EDED EDED EDED EDED EDED" /* íííííííííííííííí */
- $"EDED EDED EDED EDED EDED EDED EDED EDED" /* íííííííííííííííí */
- $"EDED EDED ECEC ECEC ECEC ECEC ECEC ECEC" /* ííííìììììììììììì */
- $"ECEC ECEC ECEC ECEC ECEC ECEC ECEC ECEC" /* ìììììììììììììììì */
- $"ECEC ECEC ECEC ECEC ECEC ECEC ECEC ECEC" /* ìììììììììììììììì */
- $"ECEC ECEC ECEC ECEC ECEC ECEB EAE9 E8F4" /* ìììììììììììëêéèô */
- $"8E02 0400 0000 0202 0000 0000 0000 0002" /* Ž............... */
- $"0012 6297 A3A9 BBBD C0C4 C7CA CCCD CECE" /* ..b—£©»½ÀÄÇÊÌÍÎÎ */
- $"CECE CECE CECE CECE CECE CECE CECE CECE" /* ÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎ */
- $"CECE CECE CECE CECE CECE CECE CECE CECE" /* ÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎ */
- $"CECE CECE CDCD CCCC CCCC CBCB CBCB CBCB" /* ÎÎÎÎÍÍÌÌÌÌËËËËËË */
- $"CBCB CBCB CBCB CBCB CBCB CBCB CBCB CBCB" /* ËËËËËËËËËËËËËËËË */
- $"CBCB CBCB CBCB CBCB CBCB CBCB CBCB CBCB" /* ËËËËËËËËËËËËËËËË */
- $"CBCB CBCB CBCB CBCB CBCB CBC9 C8C5 C2C0" /* ËËËËËËËËËËËÉÈÅÂÀ */
- $"B5A6 A5A1 8236 0002 0100 0000 0000 0100" /* µ¦¥¡‚6.......... */
- $"35DC FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* 5Üÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFE 8901 0101 0000 0000 001B" /* ÿÿÿÿÿþ‰......... */
- $"DFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FF73 0002 0000 0001 0082" /* ÿÿÿÿÿÿÿs.......‚ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFE4 1800 0100 0001 00C0" /* ÿÿÿÿÿÿÿä.......À */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF 4500 0200 0002 02C6" /* ÿÿÿÿÿÿÿÿE......Æ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF 4C00 0200 0103 00B3" /* ÿÿÿÿÿÿÿÿL......³ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFE 3D00 0300 0104 009C" /* ÿÿÿÿÿÿÿþ=......œ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFF4 2C04 0400 0105 0087" /* ÿÿÿÿÿÿÿô,......‡ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFE8 2007 0400 0105 0073" /* ÿÿÿÿÿÿÿè ......s */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFD9 1808 0400 0105 015C" /* ÿÿÿÿÿÿÿÙ.......\ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFC7 0E0A 0401 0105 034A" /* ÿÿÿÿÿÿÿÇ.Â.....J */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFB5 0A0A 0402 0105 043C" /* ÿÿÿÿÿÿÿµÂÂ.....< */
- $"FBFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFA1 080A 0402 0105 062B" /* ÿÿÿÿÿÿÿ¡.Â.....+ */
- $"F2FF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* òÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FF8E 050A 0402 0104 0720" /* ÿÿÿÿÿÿÿŽ.Â..... */
- $"E7FF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* çÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FF7C 0609 0300 0104 0817" /* ÿÿÿÿÿÿÿ|.Æ...... */
- $"D8FF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* Øÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FF68 0709 0300 0104 0A0E" /* ÿÿÿÿÿÿÿh.Æ....Â. */
- $"C8FF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* Èÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FF55 0809 0300 0104 0A0A" /* ÿÿÿÿÿÿÿU.Æ....ÂÂ */
- $"B7FF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ·ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FF47 0909 0300 0104 0A07" /* ÿÿÿÿÿÿÿGÆÆ....Â. */
- $"A4FF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ¤ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF F638 0B08 0300 0004 0A05" /* ÿÿÿÿÿÿö8......Â. */
- $"91FF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF EE2B 0C08 0300 0004 0905" /* ÿÿÿÿÿÿî+......Æ. */
- $"81FF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF E224 0D08 0300 0003 0906" /* ÿÿÿÿÿÿâ$......Æ. */
- $"71FF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* qÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF D51C 0E08 0300 0003 0907" /* ÿÿÿÿÿÿÕ.......Æ. */
- $"5EFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ^ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF C714 0F07 0200 0003 0908" /* ÿÿÿÿÿÿÇ.......Æ. */
- $"4FFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* Oÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF B811 0E07 0200 0003 090A" /* ÿÿÿÿÿÿ¸.......ÆÂ */
- $"43FD FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* Cýÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF A70E 0F07 0200 0003 080B" /* ÿÿÿÿÿÿ§......... */
- $"34F5 FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* 4õÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF 960C 0E06 0200 0002 080D" /* ÿÿÿÿÿÿ–......... */
- $"29EB FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* )ëÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF 850C 0E07 0200 0003 080E" /* ÿÿÿÿÿÿ…......... */
- $"22E0 FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* "àÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF 760D 0E06 0200 0003 080F" /* ÿÿÿÿÿÿv......... */
- $"1BD3 FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* .Óÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF 650E 0E06 0200 0002 080F" /* ÿÿÿÿÿÿe......... */
- $"14C7 FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* .Çÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF 580E 0D06 0200 0002 070F" /* ÿÿÿÿÿÿX......... */
- $"11B9 FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* .¹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF 4E10 0D06 0100 0002 070F" /* ÿÿÿÿÿÿN......... */
- $"10AB FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* .«ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFF8 4211 0D06 0200 0002 070F" /* ÿÿÿÿÿøB......... */
- $"0D9B FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* .›ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFF1 3513 0D06 0200 0002 080F" /* ÿÿÿÿÿñ5......... */
- $"0C8D FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* .ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFE9 2E13 0D05 0100 0002 070F" /* ÿÿÿÿÿé.......... */
- $"0D81 FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* .ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFDF 2914 0D06 0100 0002 070F" /* ÿÿÿÿÿß)......... */
- $"0E73 FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* .sÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFD4 2215 0C06 0100 0002 070F" /* ÿÿÿÿÿÔ"......... */
- $"0F64 FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* .dÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFC9 1C16 0C05 0100 0002 070F" /* ÿÿÿÿÿÉ.......... */
- $"1058 FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* .Xÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFBD 1A15 0C05 0100 0002 070F" /* ÿÿÿÿÿ½.......... */
- $"114F FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* .Oÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFB2 1815 0C05 0100 0002 070E" /* ÿÿÿÿÿ².......... */
- $"1246 FAFF FFFF FFFF FFFF FFFF FFFF FFFF" /* .Fúÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFA5 1615 0C05 0100 0002 070E" /* ÿÿÿÿÿ¥.......... */
- $"133B F4FF FFFF FFFF FFFF FFFF FFFF FFFF" /* .;ôÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FF98 1515 0C05 0100 0002 060E" /* ÿÿÿÿÿ˜.......... */
- $"1533 EEFF FFFF FFFF FFFF FFFF FFFF FFFF" /* .3îÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FF8D 1515 0B05 0100 0002 070E" /* ÿÿÿÿÿ.......... */
- $"152F E6FF FFFF FFFF FFFF FFFF FFFF FFFF" /* ./æÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FF82 1615 0B05 0100 0002 070E" /* ÿÿÿÿÿ‚.......... */
- $"1629 DDFF FFFF FFFF FFFF FFFF FFFF FFFF" /* .)Ýÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FF77 1615 0B05 0100 0002 060E" /* ÿÿÿÿÿw.......... */
- $"1624 D5FF FFFF FFFF FFFF FFFF FFFF FFFF" /* .$Õÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FF6B 1715 0B05 0100 0002 060E" /* ÿÿÿÿÿk.......... */
- $"1720 CCFF FFFF FFFF FFFF FFFF FFFF FFFF" /* . Ìÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FF61 1815 0B05 0100 0002 060E" /* ÿÿÿÿÿa.......... */
- $"181D C3FF FFFF FFFF FFFF FFFF FFFF FFFF" /* ..Ãÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FF5B 1914 0B05 0100 0002 060E" /* ÿÿÿÿÿ[.......... */
- $"181C BAFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ..ºÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FE54 1A14 0B05 0100 0002 070E" /* ÿÿÿÿþT.......... */
- $"181B B0FF FFFF FFFF FFFF FFFF FFFF FFFF" /* ..°ÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF F94C 1B15 0B04 0100 0002 060E" /* ÿÿÿÿùL.......... */
- $"181A A6FF FFFF FFFF FFFF FFFF FFFF FFFF" /* ..¦ÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF F544 1C15 0B05 0100 0002 070E" /* ÿÿÿÿõD.......... */
- $"1819 9DFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ..ÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF F13D 1D14 0B04 0100 0002 060E" /* ÿÿÿÿñ=.......... */
- $"1819 95FF FFFF FFFF FFFF FFFF FFFF FFFF" /* ..•ÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF EB3A 1D14 0B05 0100 0002 070E" /* ÿÿÿÿë:.......... */
- $"1819 8EFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ..Žÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF E537 1E14 0B05 0100 0002 070E" /* ÿÿÿÿå7.......... */
- $"181A 86FF FFFF FFFF FFFF FFFF FFFF FFFF" /* ..†ÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF DF34 1E14 0B05 0100 0002 070E" /* ÿÿÿÿß4.......... */
- $"181B 7EFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ..~ÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF D930 1F15 0B05 0100 0002 070E" /* ÿÿÿÿÙ0.......... */
- $"181B 78FF FFFF FFFF FFFF FFFF FFFF FFFF" /* ..xÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF D32D 1F15 0B05 0100 0002 070F" /* ÿÿÿÿÓ-.......... */
- $"191C 71FF FFFF FFFF FFFF FFFF FFFF FFFF" /* ..qÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF CE29 2015 0B05 0100 0002 070F" /* ÿÿÿÿÎ) ......... */
- $"191D 6AFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ..jÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF C828 2015 0B05 0100 0002 070F" /* ÿÿÿÿÈ( ......... */
- $"191D 65FF FFFF FFFF FFFF FFFF FFFF FFFF" /* ..eÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF C328 2015 0B05 0100 0002 070F" /* ÿÿÿÿÃ( ......... */
- $"191E 61FF FFFF FFFF FFFF FFFF FFFF FFFF" /* ..aÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF BE28 2115 0B05 0100 0002 070F" /* ÿÿÿÿ¾(!......... */
- $"191F 5DFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ..]ÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF B827 2115 0C05 0100 0002 070F" /* ÿÿÿÿ¸'!......... */
- $"1920 5AFE FFFF FFFF FFFF FFFF FFFF FFFF" /* . Zþÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF B427 2115 0C05 0100 0003 0710" /* ÿÿÿÿ´'!......... */
- $"1A21 58FD FFFF FFFF FFFF FFFF FFFF FFFF" /* .!Xýÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF B026 2115 0C05 0100 0003 0810" /* ÿÿÿÿ°&!......... */
- $"1A21 55FB FFFF FFFF FFFF FFFF FFFF FFFF" /* .!Uûÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF AC26 2116 0C05 0200 0003 0810" /* ÿÿÿÿ¬&!......... */
- $"1A22 52F9 FFFF FFFF FFFF FFFF FFFF FFFF" /* ."Rùÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF A826 2215 0C05 0100 0003 0810" /* ÿÿÿÿ¨&"......... */
- $"1A23 4FF7 FFFF FFFF FFFF FFFF FFFF FFFF" /* .#O÷ÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF A426 2316 0D06 0200 0003 0811" /* ÿÿÿÿ¤&#......... */
- $"1B24 4DF6 FFFF FFFF FFFF FFFF FFFF FFFF" /* .$Möÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF A126 2316 0D06 0200 0003 0911" /* ÿÿÿÿ¡&#.......Æ. */
- $"1C25 4CF5 FFFF FFFF FFFF FFFF FFFF FFFF" /* .%Lõÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF 9F26 2317 0D06 0200 0003 0912" /* ÿÿÿÿŸ&#.......Æ. */
- $"1C25 4CF5 FFFF FFFF FFFF FFFF FFFF FFFF" /* .%Lõÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF 9E26 2317 0D06 0200 0003 0912" /* ÿÿÿÿž&#.......Æ. */
- $"1C26 4BF4 FFFF FFFF FFFF FFFF FFFF FFFF" /* .&Kôÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF 9D27 2317 0D06 0200 0004 0912" /* ÿÿÿÿ'#.......Æ. */
- $"1C26 4AF3 FFFF FFFF FFFF FFFF FFFF FFFF" /* .&Jóÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF 9C27 2417 0D06 0200 0104 0912" /* ÿÿÿÿœ'$.......Æ. */
- $"1C26 47F2 FFFF FFFF FFFF FFFF FFFF FFFF" /* .&Gòÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF 9A27 2417 0D06 0200 0103 0911" /* ÿÿÿÿš'$.......Æ. */
- $"1B27 37D1 FFFF FFFF FFFF FFFF FFFF FFFF" /* .'7Ñÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF" /* ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ */
- $"FFFF FFFF 7329 2316 0D06 0200 0003 0810" /* ÿÿÿÿs)#......... */
- $"1A27 2F59 B7C6 C6C7 C7C7 C7C7 C7C7 C7C7" /* .'/Y·ÆÆÇÇÇÇÇÇÇÇÇ */
- $"C7C7 C7C7 C7C7 C7C7 C7C7 C7C7 C7C7 C7C7" /* ÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇ */
- $"C7C7 C7C7 C7C7 C7C7 C7C7 C7C7 C7C7 C7C7" /* ÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇ */
- $"C7C7 C7C7 C7C7 C7C7 C7C7 C7C7 C7C7 C7C7" /* ÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇ */
- $"C7C7 C7C7 C7C7 C7C7 C7C7 C7C7 C7C7 C7C7" /* ÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇ */
- $"C7C7 C7C7 C7C7 C7C7 C7C7 C7C7 C7C7 C7C7" /* ÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇ */
- $"C7C7 C7C7 C7C7 C7C7 C7C7 C7C7 C7C7 C7C7" /* ÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇ */
- $"C7C5 C689 372D 2015 0C06 0200 0003 070E" /* ÇÅƉ7- ......... */
- $"1723 3037 3C46 4C4F 5050 5050 5050 5050" /* .#07<FLOPPPPPPPP */
- $"5050 5050 5050 5050 5050 5050 5050 5050" /* PPPPPPPPPPPPPPPP */
- $"5050 5050 5050 5050 5050 5050 5050 5050" /* PPPPPPPPPPPPPPPP */
- $"5050 5050 5050 5050 5050 5050 5050 5050" /* PPPPPPPPPPPPPPPP */
- $"5050 5050 5050 5050 5050 5050 5050 5050" /* PPPPPPPPPPPPPPPP */
- $"5050 5050 5050 5050 5050 5050 5050 5050" /* PPPPPPPPPPPPPPPP */
- $"5050 5050 5050 5050 5050 5050 5050 5050" /* PPPPPPPPPPPPPPPP */
- $"4D49 4138 352A 1D13 0A05 0100 0003 060C" /* MIA85*..Â....... */
- $"141E 2934 3D44 494C 4D4E 4E4E 4E4E 4E4E" /* ..)4=DILMNNNNNNN */
- $"4E4E 4E4E 4E4E 4E4E 4E4E 4E4E 4E4E 4E4E" /* NNNNNNNNNNNNNNNN */
- $"4E4E 4E4E 4E4E 4E4E 4E4E 4E4E 4E4E 4E4E" /* NNNNNNNNNNNNNNNN */
- $"4E4E 4E4E 4E4E 4E4E 4E4E 4E4E 4E4E 4E4E" /* NNNNNNNNNNNNNNNN */
- $"4E4E 4E4E 4E4E 4E4E 4E4E 4E4E 4E4E 4E4E" /* NNNNNNNNNNNNNNNN */
- $"4E4E 4E4E 4E4E 4E4E 4E4E 4E4E 4E4E 4E4E" /* NNNNNNNNNNNNNNNN */
- $"4E4E 4E4E 4E4E 4E4E 4E4E 4E4E 4E4E 4E4D" /* NNNNNNNNNNNNNNNM */
- $"4B46 4039 2F24 1910 0904 0100 0002 050A" /* KF@9/$..Æ...... */
- $"1018 212B 3339 3D40 4142 4242 4242 4242" /* ..!+39=@ABBBBBBB */
- $"4242 4242 4242 4242 4242 4242 4242 4242" /* BBBBBBBBBBBBBBBB */
- $"4242 4242 4242 4242 4242 4242 4242 4242" /* BBBBBBBBBBBBBBBB */
- $"4242 4242 4242 4242 4242 4242 4242 4242" /* BBBBBBBBBBBBBBBB */
- $"4242 4242 4242 4242 4242 4242 4242 4242" /* BBBBBBBBBBBBBBBB */
- $"4242 4242 4242 4242 4242 4242 4242 4242" /* BBBBBBBBBBBBBBBB */
- $"4242 4242 4242 4242 4242 4242 4242 4140" /* BBBBBBBBBBBBBBA@ */
- $"3F3B 352F 261D 140D 0703 0100 0002 0407" /* ?;5/&........... */
- $"0C12 1920 272C 2F32 3233 3333 3333 3333" /* ... ',/223333333 */
- $"3333 3333 3333 3333 3333 3333 3333 3333" /* 3333333333333333 */
- $"3333 3333 3333 3333 3333 3333 3333 3333" /* 3333333333333333 */
- $"3333 3333 3333 3333 3333 3333 3333 3333" /* 3333333333333333 */
- $"3333 3333 3333 3333 3333 3333 3333 3333" /* 3333333333333333 */
- $"3333 3333 3333 3333 3333 3333 3333 3333" /* 3333333333333333 */
- $"3333 3333 3333 3333 3333 3333 3333 3332" /* 3333333333333332 */
- $"302D 2924 1D16 0F09 0502 0100 0001 0305" /* 0-)$...Æ........ */
- $"080D 1217 1C1F 2223 2425 2525 2525 2525" /* ......"#$%%%%%%% */
- $"2525 2525 2525 2525 2525 2525 2525 2525" /* %%%%%%%%%%%%%%%% */
- $"2525 2525 2525 2525 2525 2525 2525 2525" /* %%%%%%%%%%%%%%%% */
- $"2525 2525 2525 2525 2525 2525 2525 2525" /* %%%%%%%%%%%%%%%% */
- $"2525 2525 2525 2525 2525 2525 2525 2525" /* %%%%%%%%%%%%%%%% */
- $"2525 2525 2525 2525 2525 2525 2525 2525" /* %%%%%%%%%%%%%%%% */
- $"2525 2525 2525 2525 2525 2525 2525 2524" /* %%%%%%%%%%%%%%%$ */
- $"2221 1E19 1510 0B07 0402 0000 0000 0103" /* "!.............. */
- $"0609 0C10 1315 1718 1919 1919 1919 1919" /* .Æ.............. */
- $"1919 1919 1919 1919 1919 1919 1919 1919" /* ................ */
- $"1919 1919 1919 1919 1919 1919 1919 1919" /* ................ */
- $"1919 1919 1919 1919 1919 1919 1919 1919" /* ................ */
- $"1919 1919 1919 1919 1919 1919 1919 1919" /* ................ */
- $"1919 1919 1919 1919 1919 1919 1919 1919" /* ................ */
- $"1919 1919 1919 1919 1919 1919 1919 1918" /* ................ */
- $"1716 1411 0E0A 0704 0201 0000 0000 0002" /* .....Â.......... */
- $"0305 0709 0B0D 0E0F 0F0F 0F0F 0F0F 0F0F" /* ...Æ............ */
- $"0F0F 0F0F 0F0F 0F0F 0F0F 0F0F 0F0F 0F0F" /* ................ */
- $"0F0F 0F0F 0F0F 0F0F 0F0F 0F0F 0F0F 0F0F" /* ................ */
- $"0F0F 0F0F 0F0F 0F0F 0F0F 0F0F 0F0F 0F0F" /* ................ */
- $"0F0F 0F0F 0F0F 0F0F 0F0F 0F0F 0F0F 0F0F" /* ................ */
- $"0F0F 0F0F 0F0F 0F0F 0F0F 0F0F 0F0F 0F0F" /* ................ */
- $"0F0F 0F0F 0F0F 0F0F 0F0F 0F0F 0F0F 0F0F" /* ................ */
- $"0F0D 0C0A 0806 0402 0100 0000 0000 0001" /* ...Â............ */
- $"0103 0304 0607 0708 0808 0808 0808 0808" /* ................ */
- $"0808 0808 0808 0808 0808 0808 0808 0808" /* ................ */
- $"0808 0808 0808 0808 0808 0808 0808 0808" /* ................ */
- $"0808 0808 0808 0808 0808 0808 0808 0808" /* ................ */
- $"0808 0808 0808 0808 0808 0808 0808 0808" /* ................ */
- $"0808 0808 0808 0808 0808 0808 0808 0808" /* ................ */
- $"0808 0808 0808 0808 0808 0808 0808 0808" /* ................ */
- $"0707 0605 0403 0201 0000 0000 0000 0000" /* ................ */
- $"0001 0102 0202 0203 0303 0303 0303 0303" /* ................ */
- $"0303 0303 0303 0303 0303 0303 0303 0303" /* ................ */
- $"0303 0303 0303 0303 0303 0303 0303 0303" /* ................ */
- $"0303 0303 0303 0303 0303 0303 0303 0303" /* ................ */
- $"0303 0303 0303 0303 0303 0303 0303 0303" /* ................ */
- $"0303 0303 0303 0303 0303 0303 0303 0303" /* ................ */
- $"0303 0303 0303 0303 0303 0303 0303 0303" /* ................ */
- $"0202 0202 0201 0100 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 0000 0000" /* ................ */
- $"0000 0000 0000 0000 0000 0000 6963 3038" /* ............ic08 */
- $"0000 5CBD 0000 000C 6A50 2020 0D0A 870A" /* ..\½....jP .‡ */
- $"0000 0014 6674 7970 6A70 3220 0000 0000" /* ....ftypjp2 .... */
- $"6A70 3220 0000 004F 6A70 3268 0000 0016" /* jp2 ...Ojp2h.... */
- $"6968 6472 0000 0100 0000 0100 0004 0707" /* ihdr............ */
- $"0100 0000 000F 636F 6C72 0100 0000 0000" /* ......colr...... */
- $"1000 0000 2263 6465 6600 0400 0000 0000" /* ...."cdef....... */
- $"0100 0300 0100 0000 0100 0000 0200 0200" /* ................ */
- $"0000 0300 0000 006A 7032 63FF 4FFF 5100" /* .......jp2cÿOÿQ. */
- $"3200 0000 0001 0000 0001 0000 0000 0000" /* 2............... */
- $"0000 0000 0001 0000 0001 0000 0000 0000" /* ................ */
- $"0000 0000 0407 0101 0701 0107 0101 0701" /* ................ */
- $"01FF 5200 0C00 0000 0101 0504 0400 01FF" /* .ÿR............ÿ */
- $"5C00 1320 5058 5860 5858 6058 5860 5858" /* \.. PXX`XX`XX`XX */
- $"5850 5058 FF64 0011 0001 4B61 6B61 6475" /* XPPXÿd....Kakadu */
- $"2D76 352E 322E 31FF 9000 0A00 0000 005B" /* -v5.2.1ÿ.Â....[ */
- $"D000 01FF 93CF C100 1507 F18D 1991 E793" /* Ð..ÿ“ÏÁ...ñ.‘ç“ */
- $"D8B4 6B7C 459C 4F68 E4BF E0FF 0D3D C2DF" /* Ø´k|EœOhä¿àÿ.=Âß */
- $"FC16 8F7F 6C3A 7FEA ACD5 8632 D1AD 37A6" /* ü..l:.ê¬Õ†2Ñ­7¦ */
- $"22E3 4753 734F 3BFA 0372 1596 A8F1 7183" /* "ãGSsO;ú.r.–¨ñqƒ */
- $"2F17 0A65 C5C2 6A8E C0F9 1000 39CE 9180" /* /.ÂeÅÂjŽÀù..9Α€ */
- $"AE4A F551 B521 2839 FEE4 4D31 9F98 9F17" /* ®JõQµ!(9þäM1Ÿ˜Ÿ. */
- $"29F2 C91D 3B35 397E 15A1 8246 C3EA 3107" /* )òÉ.;59~.¡‚FÃê1. */
- $"5630 A744 5105 404A C843 0AE4 304B 4FE9" /* V0§DQ.@JÈCÂä0KOé */
- $"81E4 4C91 DF64 6885 8D23 6517 B254 DE23" /* äL‘ßdh…#e.²TÞ# */
- $"6101 3C94 9245 923D 4F4C 0F02 784C F319" /* a.<”’E’=OL..xLó. */
- $"CFC0 FC11 7EC2 D9C4 3907 5FDC 553A F1E1" /* ÏÀü.~ÂÙÄ9._ÜU:ñá */
- $"F2BC 6420 59D8 7D25 F42A 5BA5 8E8E 7166" /* ò¼d YØ}%ô*[¥ŽŽqf */
- $"AD5D 5C91 CC75 1452 ACDA 64CA 3249 CCE3" /* ­]\‘Ìu.R¬ÚdÊ2IÌã */
- $"6874 83E2 633E 64E7 8159 4AA2 FD3C 638D" /* htƒâc>dçYJ¢ý<c */
- $"F978 C3ED 328F C0F2 1F81 A80C BB81 9421" /* ùxÃí2Àò.¨.»”! */
- $"980D F457 0EA7 7782 676F 2AB3 EE8F 99C2" /* ˜.ôW.§w‚go*³î™Â */
- $"2221 9D95 8C80 C3A8 91F3 4C08 6A03 DE45" /* "!•Œ€Ã¨‘óL.j.ÞE */
- $"A985 9B7B 9ED3 A9A4 D929 A97F A125 FE22" /* ©…›{žÓ©¤Ù)©.¡%þ" */
- $"A893 77F3 EF0F C15C 3969 A153 3A7C 3110" /* ¨“wóï.Á\9i¡S:|1. */
- $"7A9C 9227 D2F6 BCA8 1A04 0219 8F36 21B7" /* zœ’'Òö¼¨....6!· */
- $"B37C 2AB6 678A 1675 BA9E 03B4 53BA 33B9" /* ³|*¶gŠ.uºž.´Sº3¹ */
- $"06AD 96D8 BDBC BFC8 5134 C040 7EBA B756" /* .­–ؽ¼¿ÈQ4À@~º·V */
- $"E619 DC67 BC83 BB39 AA42 65E1 5BBC 45B4" /* æ.Üg¼ƒ»9ªBeá[¼E´ */
- $"ECB6 E6ED D098 3C9F E17B 876D A039 553E" /* ì¶æíИ<Ÿá{‡m 9U> */
- $"5CF9 2D3F 6F47 4854 7085 62C1 C65D C07C" /* \ù-?oGHTp…bÁÆ]À| */
- $"86A0 3E43 500F 90D0 4787 8CE8 726C 5109" /* † >CP.ÐG‡ŒèrlQÆ */
- $"FD68 8099 E8FE 2A66 2F02 78F5 C78B 6A34" /* ýh€™èþ*f/.xõÇ‹j4 */
- $"0A9E 25FE 0DE3 E3C8 BD7B 3530 98D5 CF03" /* ž%þ.ããȽ{50˜ÕÏ. */
- $"CE64 A57D 620C 87C5 65B4 7BE1 34BC 3058" /* Îd¥}b.‡Åe´{á4¼0X */
- $"572A 9EBF 5E0C 5A01 80A3 B334 DF5A E1B8" /* W*ž¿^.Z.€£³4ßZḠ*/
- $"08C3 5C30 2CC4 C1F5 1341 F516 40FA 8A00" /* .Ã\0,ÄÁõ.Aõ.@úŠ. */
- $"477D B516 AD2F 4DD3 BE8C 58F0 7C77 A236" /* G}µ.­/MÓ¾ŒXð|w¢6 */
- $"DD43 6611 D582 F050 DC31 59D0 194D A6FD" /* ÝCf.Õ‚ðPÜ1YÐ.M¦ý */
- $"652E FA16 4BA7 25FE 0DE3 E3D9 B950 06E2" /* e.ú.K§%þ.ããÙ¹P.â */
- $"3A8A DA86 827A 4C68 5798 55FC FD46 A583" /* :ŠÚ†‚zLhW˜UüýF¥ƒ */
- $"064D 8FB0 29D9 8DAD 53CC 5229 B675 ACAB" /* .M°)Ù­SÌR)¶u¬« */
- $"8EED 34BC 2F12 142E 446C 0DF7 0BC3 D6E7" /* Ží4¼/...Dl.÷.ÃÖç */
- $"A086 8D72 6AE7 9270 B97C D981 C7F1 C38A" /*  †rjç’p¹|ÙÇñÊ */
- $"47EE E585 FC19 FCE3 668C C7E0 471F 813C" /* Gîå…ü.üãfŒÇàG.< */
- $"3F02 0005 B422 0345 FC66 9A91 446D DDCA" /* ?...´".Eüfš‘DmÝÊ */
- $"449B CCDB 8E8F A0B8 3942 A8FC 6409 F7F3" /* D›ÌÛŽ ¸9B¨üdÆ÷ó */
- $"ED01 353A 2B01 1B0C 2939 619B 9890 94E7" /* í.5:+...)9a›˜”ç */
- $"5FDA 75F2 7323 BF3A 7AED 757E 42D6 C336" /* _Úuòs#¿:zíu~BÖÃ6 */
- $"E74E 6B5F 2D43 4780 CA1C C462 6507 4801" /* çNk_-CG€Ê.Äbe.H. */
- $"EDEF 5B2A 7297 8FC6 1E13 E7FA 56B5 4279" /* íï[*r—Æ..çúVµBy */
- $"5BB4 B307 F4DE E273 4FC3 E9B1 72C3 EDA2" /* [´³.ôÞâsOÃé±rÃí¢ */
- $"A3F0 A9E0 FB5D C018 B35C 8B45 CD63 99FE" /* £ð©àû]À.³\‹EÍc™þ */
- $"11FB 8993 21D1 BA8B 69EB 5CB9 F258 468F" /* .û‰“!Ѻ‹ië\¹òXF */
- $"73D4 6804 C6E6 045E AE54 954C D0E5 D836" /* sÔh.Ææ.^®T•LÐåØ6 */
- $"EA0D DB9A 2806 36FA B3E9 5973 789D 6591" /* ê.Ûš(.6ú³éYsxe‘ */
- $"1EC2 F271 E9E2 5681 C542 A2FC F4EF 8111" /* .ÂòqéâVÅB¢üôï. */
- $"59D5 FC91 9749 52A3 EA37 B239 4939 8625" /* YÕü‘—IR£ê7²9I9†% */
- $"F248 18D2 075A 80A1 8005 9ED2 437F C705" /* òH.Ò.Z€¡€.žÒC.Ç. */
- $"2BFD 308C F1F0 E1BC 8FDA F5D5 50D9 9770" /* +ý0Œñðá¼ÚõÕPÙ—p */
- $"7EF5 213F 91F6 5B8B 189D EE67 70EF F40A" /* ~õ!?‘ö[‹.îgpïôÂ */
- $"2E24 C54B F37D 4941 FCD2 7779 5C8B 59CC" /* .$ÅKó}IAüÒwy\‹YÌ */
- $"F284 3377 A496 0399 6F17 47AC B5EA 3A84" /* ò„3w¤–.™o.G¬µê:„ */
- $"844E DC13 D058 BE9F 1BBE 8CE0 E615 D2E1" /* „NÜ.ÐX¾Ÿ.¾Œàæ.Òá */
- $"88A5 9DA6 9FB4 4EDE B804 ED14 A7EA 54E0" /* ˆ¥¦Ÿ´NÞ¸.í.§êTà */
- $"5A87 311B 5E69 70F5 EDA3 2E78 8862 7603" /* Z‡1.^ipõí£.xˆbv. */
- $"7761 094D 4A69 5AB0 A9BB 3F4F 92BE 205B" /* waÆMJiZ°©»?O’¾ [ */
- $"A226 24D5 C8B2 CCF7 E064 31C7 E727 6E2C" /* ¢&$ÕȲÌ÷àd1Çç'n, */
- $"D6A1 347F 41CD 5F70 E1C0 1AFC 4FBC 81A9" /* Ö¡4.AÍ_páÀ.üO¼© */
- $"A884 F03A CD84 B581 1F03 A523 838B 8038" /* ¨„ð:Í„µ..¥#ƒ‹€8 */
- $"02F4 6DE8 98FC EDD6 B331 21F7 4AC5 A31E" /* .ômè˜üíÖ³1!÷JÅ£. */
- $"9EB4 E770 D465 386E 18A6 D1BE EF6D B008" /* ž´çpÔe8n.¦Ñ¾ïm°. */
- $"63E6 1066 1374 4D10 3270 8C7F F297 F91D" /* cæ.f.tM.2pŒ.ò—ù. */
- $"DA61 677B 29FD A878 B122 E33C 17E3 8ED1" /* Úag{)ý¨x±"ã<.ãŽÑ */
- $"FB8E 4407 8B82 32AD 1B50 09DF BDA8 C80E" /* ûŽD.‹‚2­.PÆß½¨È. */
- $"7E28 ED9D A005 4297 B9C1 8D66 CA77 C41D" /* ~(í .B—¹ÁfÊwÄ. */
- $"41C5 E3B3 F94D 96E5 1308 7C59 1EB8 0871" /* AÅã³ùM–å..|Y.¸.q */
- $"C7A4 FED7 47F2 F800 6889 A21D 1FF4 9E93" /* Ǥþ×Gòø.h‰¢..ôž“ */
- $"1321 7377 D96E 86F5 A0CB EB17 C77A 81C0" /* .!swÙn†õ Ëë.ÇzÀ */
- $"7C8D A01F 0E91 00F9 1D00 94FD 4D32 E5DB" /* | ..‘.ù..”ýM2åÛ */
- $"0482 DEB8 CF1C 792A EA3B DECA 4470 4898" /* .‚Þ¸Ï.y*ê;ÞÊDpH˜ */
- $"81C0 5457 FE66 63DD CAF3 0B98 08E1 DC3F" /* ÀTWþfcÝÊó.˜.áÜ? */
- $"CF68 7F31 9BEE 73EF A3A5 8D57 8969 EEC3" /* Ïh.1›îsW‰iîà */
- $"0F13 3ED9 390D FC4C B37F C4F7 01E4 B115" /* ..>Ù9.üL³.Ä÷.ä±. */
- $"E9F9 9526 00FA 10D0 0D64 4CC5 8481 D231" /* éù•&.ú.Ð.dLÅ„Ò1 */
- $"DE6D 483E 8046 7F58 5BD3 1FFC CF82 297A" /* ÞmH>€F.X[Ó.üÏ‚)z */
- $"88A1 7E78 0668 3222 9E8B A287 30A3 DB10" /* ˆ¡~x.h2"ž‹¢‡0£Û. */
- $"A77F A842 87FC 164E 92B8 96DF 4920 EEC2" /* §.¨B‡ü.N’¸–ßI î */
- $"47B6 83F1 F68F 9309 63CE FAAC 3C8F 9FCF" /* G¶ƒñö“ÆcÎú¬<ŸÏ */
- $"A166 9621 ADC0 0ABB 7F1A 7E3C A4AD 3755" /* ¡f–!­À»..~<¤­7U */
- $"E2D8 E26D CAD1 6F24 F808 BC0D E94B EEBC" /* âØâmÊÑo$ø.¼.éKî¼ */
- $"D601 C1F5 30C1 F53B C0FA 97C0 90E6 901B" /* Ö.Áõ0Áõ;Àú—Àæ. */
- $"71C2 1EAB 8A4C 52A4 4431 058C DFB9 4148" /* qÂ.«ŠLR¤D1.Œß¹AH */
- $"185C 1E93 01C6 82D3 C81B 6398 8173 189D" /* .\.“.Æ‚ÓÈ.c˜s. */
- $"F73C 4887 5155 0C95 0088 4C69 0A27 3F39" /* ÷<H‡QU.•.ˆLiÂ'?9 */
- $"8CCA 32D8 1FD7 A3F4 CDD8 6275 5E7E 3619" /* ŒÊ2Ø.×£ôÍØbu^~6. */
- $"8D18 68C9 D2C7 0FCB 18EA FB01 5A68 4A52" /* .hÉÒÇ.Ë.êû.ZhJR */
- $"3C08 5313 5ED2 9B7D 31B5 953C 2F92 22F7" /* <.S.^Ò›}1µ•</’"÷ */
- $"3764 04E8 A9A6 C747 8DFD 9730 01DD 82E1" /* 7d.試ÇGý—0.Ý‚á */
- $"B08A FD72 7C33 A9BF AFEA 7188 AC4B 2B45" /* °Šýr|3©¿¯êqˆ¬K+E */
- $"BBB2 7826 6704 5864 9BAF 91FC 6BD3 E9D7" /* »²x&g.Xd›¯‘ükÓé× */
- $"0E30 E428 0FB2 4836 F94F 7CB9 3723 72A2" /* .0ä(.²H6ùO|¹7#r¢ */
- $"AB4C C0EB ED8F 823B B8D6 C4A6 E4B5 B41C" /* «LÀëí‚;¸ÖĦ䵴. */
- $"B0FC 0171 880F E77C 1EF8 9645 A8B4 969A" /* °ü.qˆ.ç|.ø–E¨´–š */
- $"5420 86B9 71CE 0DE5 7A40 B41A DD85 6B30" /* T †¹qÎ.åz@´.Ý…k0 */
- $"F02A 3B61 92B4 7A95 269E BF9F DDB3 9FB7" /* ð*;a’´z•&ž¿ŸÝ³Ÿ· */
- $"746B 1514 C89D 391B F835 73B8 0F1C 2567" /* tk..È9.ø5s¸..%g */
- $"A0C2 6B37 DFCE 5F4C 1DCD FD79 5CDA A8FF" /*  Âk7ßÎ_L.Íýy\Ú¨ÿ */
- $"0603 9014 308F AEB3 EDB7 D721 1709 3897" /* ...0®³í·×!.Æ8— */
- $"D3AB 181E 53BE 4025 3492 41C2 5EC7 BFC0" /* Ó«..S¾@%4’AÂ^Ç¿À */
- $"EA12 19D0 6158 530B A57B 8A2B 8DFF 18AF" /* ê..ÐaXS.¥{Š+ÿ.¯ */
- $"7651 65CF CD26 3F05 987E 0760 9C3C E3A6" /* vQeÏÍ&?.˜~.`œ<㦠*/
- $"86C0 DAB4 C6ED 7F19 8034 85FE DA7E 7963" /* †ÀÚ´Æí..€4…þÚ~yc */
- $"AFF2 9CBE 6AAA B6BB B2D3 6F41 BB45 B1EB" /* ¯òœ¾jª¶»²ÓoA»E±ë */
- $"9CC2 8803 907A 5CE1 F2D9 AF69 FF22 7DE8" /* œÂˆ.z\áòÙ¯iÿ"}è */
- $"D328 C2A1 0F97 2EE2 9575 E0E6 A665 B85A" /* Ó(¡.—.â•uàæ¦e¸Z */
- $"C5D7 6FA0 FE24 BC68 9D74 6CEB C4F9 615C" /* Å×o þ$¼htlëÄùa\ */
- $"4F34 48B3 7A64 2540 B64F EFBE 8D0F E427" /* O4H³zd%@¶Oï¾.ä' */
- $"4CCA 6DB3 83AC C5F6 EE52 7A43 8172 41E4" /* LÊm³ƒ¬ÅöîRzCrAä */
- $"2CE3 DF2F 1496 97DE 6AD1 2FFF 7E52 D993" /* ,ãß/.–—ÞjÑ/ÿ~RÙ“ */
- $"8AF9 AAA3 B192 0991 BFAE 4829 001E 963B" /* Šùª£±’Æ‘¿®H)..–; */
- $"019C 8A5D 78E8 6A56 F78C B81A F4D0 6312" /* .œŠ]xèjV÷Œ¸.ôÐc. */
- $"C0C4 A9BF 7CA5 75D9 9C23 F3EA 4F39 B325" /* ÀÄ©¿|¥uÙœ#óêO9³% */
- $"F6DE 6EF4 7D48 A279 8EA9 5395 0FBC C63F" /* öÞnô}H¢yŽ©S•.¼Æ? */
- $"679F CE93 2206 ECA9 079C 2BB7 D094 6A7B" /* gŸÎ“".ì©.œ+·Ð”j{ */
- $"1077 277F 88A6 21AE 84C3 EDD4 38FC 36B2" /* .w'.ˆ¦!®„ÃíÔ8ü6² */
- $"1F86 8F00 8F56 8825 7713 9061 800A A4CD" /* .†.Vˆ%w.a€Â¤Í */
- $"E3D3 0F3C B0AC 0C87 E368 8544 F251 5C39" /* ãÓ.<°¬.‡ãh…DòQ\9 */
- $"7D90 1BEF 7805 D624 7380 0A19 E093 3058" /* }.ïx.Ö$s€Â.à“0X */
- $"1C90 467F 5C70 4932 3947 4A95 A450 36C8" /* .F.\pI29GJ•¤P6È */
- $"D4D5 CA85 9922 FA12 D0D8 96CA 9A2F 40A2" /* ÔÕÊ…™"ú.ÐØ–Êš/@¢ */
- $"F105 054F 8C56 C164 85B5 C4E6 3EAB D76A" /* ñ..OŒVÁd…µÄæ>«×j */
- $"A227 4F09 072C 4682 9B0F 995C 7551 94E7" /* ¢'OÆ.,F‚›.™\uQ”ç */
- $"419A 0098 0283 19E8 0489 687B 4F66 B74C" /* Aš.˜.ƒ.è.‰h{Of·L */
- $"7F59 C07A A552 B04D 628F E401 E55C A4ED" /* .YÀz¥R°Mbä.å\¤í */
- $"390F C34D 81BB 9F88 0C50 F50F 9FBD A377" /* 9.ÃM»Ÿˆ.Põ.Ÿ½£w */
- $"F538 3F9C E243 FF47 D346 87F2 444B C479" /* õ8?œâCÿGÓF‡òDKÄy */
- $"F6B3 1C76 5125 F487 0FAF 294A DA20 EC56" /* ö³.vQ%ô‡.¯)JÚ ìV */
- $"07AB DE07 14C2 1721 F3E0 D687 1F67 039D" /* .«Þ..Â.!óàÖ‡.g. */
- $"461F 0D82 9CAA B2D4 DFC6 6AA5 D31E 4D01" /* F..‚œª²ÔßÆj¥Ó.M. */
- $"5AC2 B2BD FD97 7D6E 00D1 7ADF 377C 15A7" /* Z²½ý—}n.Ñzß7|.§ */
- $"9681 C7B2 8168 D706 425B 35EF 7298 C053" /* –Dzh×.B[5ïr˜ÀS */
- $"E198 B5E2 B835 712B 1AD8 BA77 CF86 83A3" /* ᘵâ¸5q+.غwφƒ£ */
- $"B0B9 C5E6 F37A A3DE D93B 8EC8 132F A52A" /* °¹Åæóz£ÞÙ;ŽÈ./¥* */
- $"AB20 E166 F719 7130 6482 5BE2 605B D78E" /* « áf÷.q0d‚[â`[׎ */
- $"672D 7AE6 3906 DA75 0E3D 1962 8A60 9294" /* g-zæ9.Úu.=.bŠ`’” */
- $"1FC8 C0F3 216D 815D 4DDE 5DDE D8AB 3F9C" /* .ÈÀó!m]MÞ]ÞØ«?œ */
- $"7F9F 24B3 7BBF CCB9 2F80 19B6 70AE 1B3D" /* .Ÿ$³{¿Ì¹/€.¶p®.= */
- $"C71A 1F7C 81D2 639F 0D03 24EA D4B1 D351" /* Ç..|ÒcŸ..$êÔ±ÓQ */
- $"DD10 FBD5 EA3F 4957 A7ED 04C6 384D C10F" /* Ý.ûÕê?IW§í.Æ8MÁ. */
- $"8A55 0C03 694F 0D18 70D8 0AC3 33C0 17D1" /* ŠU..iO..pØÂÃ3À.Ñ */
- $"73BB E85F 5204 090F FDFE 8AC5 9AD6 22D5" /* s»è_R.Æ.ýþŠÅšÖ"Õ */
- $"CA31 A6DE EF44 D910 B34A 0E59 7866 536F" /* Ê1¦ÞïDÙ.³J.YxfSo */
- $"9B0B A341 3AB8 C06C C64F 3F86 8160 DFB9" /* ›.£A:¸ÀlÆO?†`ß¹ */
- $"A709 59D8 88C3 3316 9FFA F83F 5120 E40E" /* §ÆY؈Ã3.Ÿúø?Q ä. */
- $"4DEA C88F C418 37F6 4C0B 7606 9632 EEC5" /* MêÈÄ.7öL.v.–2îÅ */
- $"6380 FB25 A69F AAE2 0888 B722 008F 35CB" /* c€û%¦Ÿªâ.ˆ·".5Ë */
- $"F6A7 90BF D0DB 6367 A14B 5A86 EE98 FD18" /* ö§¿ÐÛcg¡KZ†î˜ý. */
- $"A629 1BAB 3BE2 920D E99D BEC2 88B4 F909" /* ¦).«;â’.é¾Âˆ´ùÆ */
- $"66B1 535D 3940 AF78 8200 0C46 142A EA2A" /* f±S]9@¯x‚..F.*ê* */
- $"A991 95E8 FD2B D30B 0E4A 76E2 A97B FAA7" /* ©‘•èý+Ó..Jvâ©{ú§ */
- $"97E2 9B30 54FA 5E97 962A 7E83 5711 A707" /* —â›0Tú^—–*~ƒW.§. */
- $"2A21 3729 2046 9C41 8282 A161 E5F6 AB24" /* *!7) FœA‚‚¡aåö«$ */
- $"3324 74CF 1AF6 C935 D884 0008 DC18 663C" /* 3$tÏ.öÉ5Ø„..Ü.f< */
- $"3A00 25E4 92D7 8F23 4C07 3C63 DB6E 4924" /* :.%ä’×#L.<cÛnI$ */
- $"7362 34C9 2F1D 105B 97E2 03BF 648F C21C" /* sb4É/..[—â.¿dÂ. */
- $"C6AC 3657 2C72 ADAA 2889 0623 6A5D ACEC" /* Ƭ6W,r­ª(‰.#j]¬ì */
- $"3210 738F 51F5 CC65 9EA9 7AD3 95CB B265" /* 2.sQõÌež©zӕ˲e */
- $"D54E 6E1D E2A7 2673 E6C2 C247 2FFD C10E" /* ÕNn.â§&sæÂÂG/ýÁ. */
- $"5FC5 C1E1 2511 5C8F 6063 92AB E4B9 8212" /* _ÅÁá%.\`c’«ä¹‚. */
- $"3643 6D53 2492 3E58 3E71 15E3 A3B7 AB2A" /* 6CmS$’>X>q.㣷«* */
- $"A998 FE5A 74DB 537A CE3D CD46 49B6 DB6D" /* ©˜þZtÛSzÎ=ÍFI¶Ûm */
- $"B6DB 6DB2 8EE9 1D6F 6480 8613 D8D2 7D8F" /* ¶Ûm²Žé.od€†.ØÒ} */
- $"5615 3EAB B25B 722D ECB8 ED12 70F2 BA06" /* V.>«²[r-ì¸í.pòº. */
- $"E5A2 45C1 547C F861 A7D5 8E1C 08BC 346B" /* å¢EÁT|øa§ÕŽ..¼4k */
- $"2730 C670 2FD8 F159 6ABE 2092 ED98 AC34" /* '0Æp/ØñYj¾ ’혬4 */
- $"B4CA 8565 90CF 0034 6E68 F777 9672 F29D" /* ´Ê…eÏ.4nh÷w–rò */
- $"4621 6E73 9C90 5C3D A8DB F5B0 CACF A63E" /* F!nsœ\=¨Ûõ°ÊϦ> */
- $"861E 8B9E F490 8E15 69BC A01D EF59 E898" /* †.‹žôŽ.i¼ .ïYè˜ */
- $"7040 B817 5AA9 BFB1 09A0 FE74 D2F7 BEA8" /* p@¸.Z©¿±Æ þtÒ÷¾¨ */
- $"A4F3 FEAC 38A4 409E B504 9CC9 EAA3 533B" /* ¤óþ¬8¤@žµ.œÉê£S; */
- $"153D F710 FC9E 2055 A395 C374 2AF9 E7C5" /* .=÷.üž U£•Ãt*ùçÅ */
- $"E1E8 7F74 3CDB D568 B606 A9D5 B7AE E207" /* áè.t<ÛÕh¶.©Õ·®â. */
- $"947E 2E65 1C27 336D 927A 4F86 5422 0E04" /* ”~.e.'3m’zO†T".. */
- $"42C7 668A 9403 EAB7 21A3 C9F1 18BC 5380" /* BÇfŠ”.ê·!£Éñ.¼S€ */
- $"BED7 07B5 F9B1 B798 8727 D54A 7A6E E493" /* ¾×.µù±·˜‡'ÕJznä“ */
- $"5271 F27D 7C35 DCEE D0BC CB31 C1FB 879F" /* Rqò}|5ÜîмË1Áû‡Ÿ */
- $"E074 9EB9 D7BE C9ED D2C8 BD00 C7FC D05B" /* àtž¹×¾ÉíÒȽ.ÇüÐ[ */
- $"2B2C 9647 A924 9F22 A06D 62B4 A946 77B7" /* +,–G©$Ÿ" mb´©Fw· */
- $"AD6D 60EE C841 997D A7E8 7AD2 AFA8 EEC4" /* ­m`îÈA™}§èzÒ¯¨îÄ */
- $"D61F FC06 FD7A E761 AA33 0F74 A08F 8E5B" /* Ö.ü.ýzçaª3.t Ž[ */
- $"B7C0 7C9A 1201 F0F5 6403 E4D0 60D8 92D9" /* ·À|š..ðõd.äÐ`Ø’Ù */
- $"84ED 064F 1B29 D7A7 1D77 F4B3 61D6 2651" /* „í.O.)ק.wô³aÖ&Q */
- $"329E 2CA5 53B4 956D 1061 3A3A A73B FC8E" /* 2ž,¥S´•m.a::§;üŽ */
- $"DD3C 60C9 F855 32FB 3C04 6287 50F7 6BB3" /* Ý<`ÉøU2û<.b‡P÷k³ */
- $"B84A 05A6 3145 A832 3BBC CA56 115B 9D7F" /* ¸J.¦1E¨2;¼ÊV.[. */
- $"8ADB 5660 429D 1FF6 4E6D 4899 EFDA 592F" /* ŠÛV`B.öNmH™ïÚY/ */
- $"19DC 9790 802A 1C17 2250 ADEC 0312 2C23" /* .Ü—€*.."P­ì..,# */
- $"223B 1EC8 482C 6E26 DD67 528F 7CDC 1841" /* ";.ÈH,n&ÝgR|Ü.A */
- $"DBCB CF9E 6D26 B564 4FD4 0AB5 DA0B ADE2" /* ÛËÏžm&µdOÔµÚ.­â */
- $"C129 D895 00FF 105B 0D0B F4DB 286A B347" /* Á)Ø•.ÿ.[..ôÛ(j³G */
- $"A261 30A9 0A9B 7A0D 585B 3991 3217 6FF7" /* ¢a0©Â›z.X[9‘2.o÷ */
- $"A368 D6A8 E862 161A 3584 613E 04D9 DBCB" /* £hÖ¨èb..5„a>.ÙÛË */
- $"4D96 66A3 B736 F802 D67A 309F 04E6 AFD8" /* M–f£·6ø.Öz0Ÿ.æ¯Ø */
- $"888E A8A5 4461 F1F0 1B6B 2DC4 0DFE C676" /* ˆŽ¨¥Dañð.k-Ä.þÆv */
- $"8D4E 3750 C3E6 C233 EFC5 368B 6113 5B53" /* N7PÃæÂ3ïÅ6‹a.[S */
- $"08E0 C259 1B88 AA0C 74B0 862E 1024 BB3F" /* .àÂY.ˆª.t°†..$»? */
- $"2816 B320 715C 5DFA 9FF0 CBC3 6A85 777A" /* (.³ q\]úŸðËÃj…wz */
- $"23CB F89B D813 6706 313E 2CF5 A163 0848" /* #Ëø›Ø.g.1>,õ¡c.H */
- $"94C9 3288 B556 53DD 2A45 2302 F28E 7ED1" /* ”É2ˆµVSÝ*E#.òŽ~Ñ */
- $"B5A0 67C8 53BB 4CE4 45D9 317F 92AB B13B" /* µ gÈS»LäEÙ1.’«±; */
- $"7246 F6DE 5348 49C9 42A1 CA62 64B0 209E" /* rFöÞSHIÉB¡Êbd° ž */
- $"43F2 DF7C 9BBC 097F C94A EA52 8D01 ADEF" /* Còß|›¼Æ.ÉJêR.­ï */
- $"5241 7C9B 2876 75F4 D748 AF9D 6FBB 3306" /* RA|›(vuô×H¯o»3. */
- $"0AD1 3953 6C99 5BB7 F1F5 1C1F BCE7 CA83" /* ÂÑ9Sl™[·ñõ..¼çʃ */
- $"08C1 6811 FBC5 AE18 343C C6F5 E515 F9CF" /* .Áh.ûÅ®.4<Æõå.ùÏ */
- $"FE48 C6E9 956E 6712 DDCA D62C 7F37 6DFE" /* þHÆé•ng.ÝÊÖ,.7mþ */
- $"2465 A8EE 1BAF E106 CA62 101F 0144 31DC" /* $e¨î.¯á.Êb...D1Ü */
- $"029E ED0F 9E47 F22E 0C17 0D31 E60B 1662" /* .ží.žGò....1æ..b */
- $"C1F5 5C90 7D5A 6D03 EAB6 C0C8 1653 E821" /* Áõ\}Zm.ê¶ÀÈ.Sè! */
- $"5860 ED0B C711 39E5 E5C8 268D 2246 E3FB" /* X`í.Ç.9ååÈ&"Fãû */
- $"68A4 3B12 A487 350D FE94 3722 65AC 949B" /* h¤;.¤‡5.þ”7"e¬”› */
- $"2526 7CD5 0E28 E093 CFE8 314C BE18 5B60" /* %&|Õ.(à“Ïè1L¾.[` */
- $"827E 154B 9609 2536 F890 A361 BA29 8211" /* ‚~.K–Æ%6ø£aº)‚. */
- $"AF42 BEC6 1BCB CE6D 2910 8083 C890 D7FF" /* ¯B¾Æ.ËÎm).€ƒÈ×ÿ */
- $"6F04 CEF4 F47C 0D92 00BD D90F 4095 0A48" /* o.Îôô|.’.½Ù.@•ÂH */
- $"4DC6 210C 351D 34A5 5FDA E576 1E1B 1684" /* MÆ!.5.4¥_Úåv...„ */
- $"F2A0 B30A 589C 1DBC 4831 E906 0D67 0CDD" /* ò ³ÂXœ.¼H1é..g.Ý */
- $"876B 994F 6D66 47DD AF40 7158 4385 738E" /* ‡k™OmfGݯ@qXC…sŽ */
- $"82F8 E637 9B5C 7389 0AA5 2A04 D105 5E88" /* ‚øæ7›\s‰Â¥*.Ñ.^ˆ */
- $"C2A2 2943 E125 6C2F 0AD1 1E5C AF1F CFF6" /* ¢)Cá%l/ÂÑ.\¯.Ïö */
- $"B39B C799 0F39 6151 6625 BB66 C3C3 418B" /* ³›Ç™.9aQf%»fÃÃA‹ */
- $"90A4 F6F7 BD30 7A04 88E6 0F8A 3F0B FF2C" /* ¤ö÷½0z.ˆæ.Š?.ÿ, */
- $"D18B 1D88 1442 EB54 A6FC D226 251A 015D" /* Ñ‹.ˆ.BëT¦üÒ&%..] */
- $"4DA8 32CA 371B 86EB 4E89 1415 9A41 6AD2" /* M¨2Ê7.†ëN‰..šAjÒ */
- $"1F0F 7656 41E5 B874 72E7 5F88 ABDA 28D7" /* ..vVAå¸trç_ˆ«Ú(× */
- $"37D5 EE40 567F F751 2591 01A3 03B9 EFCD" /* 7Õî@V.÷Q%‘.£.¹ïÍ */
- $"E0A8 8CC8 8C8E 0945 3036 453A 1787 59C4" /* ਌ȌŽÆE06E:.‡YÄ */
- $"B99C 02D2 D5F6 1B5E E34C 551E 8C43 9A20" /* ¹œ.ÒÕö.^ãLU.ŒCš */
- $"981D 0B44 C6D1 E6AA 2B92 5F33 8016 C4F1" /* ˜..DÆÑæª+’_3€.Äñ */
- $"7AA6 E605 4676 A533 1D38 6ADA 9BC6 2C13" /* z¦æ.Fv¥3.8jÚ›Æ,. */
- $"385A 3DCE 7E2E B9A1 81BB 27C6 AFF8 FF5D" /* 8Z=Î~.¹¡»'Ưøÿ] */
- $"A511 4C25 DC70 082C B597 3EC4 004C D4B8" /* ¥.L%Üp.,µ—>Ä.LÔ¸ */
- $"BE6A B79D EF70 2610 B57B FEFE 6ACC 9EEE" /* ¾j·ïp&.µ{þþjÌžî */
- $"B94A 73A8 4B30 C207 7391 789E C0FE 6992" /* ¹Js¨K0Â.s‘xžÀþi’ */
- $"AB13 E2AA FF53 4B22 A338 0EA3 B476 D732" /* «.âªÿSK"£8.£´v×2 */
- $"EDA3 2009 3422 B4AA 64DE 26C3 5894 D6DD" /* í£ Æ4"´ªdÞ&ÃX”ÖÝ */
- $"F7A9 5A3B 6F31 5D2C EC22 1FAC 928B 647F" /* ÷©Z;o1],ì".¬’‹d. */
- $"1600 A961 11C3 FD11 E594 81F9 E0AC 20D4" /* ..©a.Ãý.å”ùà¬ Ô */
- $"0DCA 9CE0 FF14 3BE3 3010 00E1 9DFE F0C8" /* .Êœàÿ.;ã0..áþðÈ */
- $"70E7 D3A5 A7F9 884E 6941 CBCB FEBE 0C27" /* pçÓ¥§ùˆNiAËËþ¾.' */
- $"B3F5 BAA4 3068 BFC1 DB20 1E5F 9E83 BF7D" /* ³õº¤0h¿ÁÛ ._žƒ¿} */
- $"8EA3 8FB0 F355 FF02 DED2 5CC8 2B4D 4DA5" /* Ž£°óUÿ.ÞÒ\È+MM¥ */
- $"8122 C96A CDAB B130 2D35 B73E 2EE9 0AA9" /* "ÉjÍ«±0-5·>.é© */
- $"7DB8 B81D 7B0A 776B DFF3 2B02 1F6A EF5B" /* }¸¸.{Âwkßó+..jï[ */
- $"E6A6 177F D8C0 1C3B A88C 2154 18F3 BFB3" /* æ¦..ØÀ.;¨Œ!T.ó¿³ */
- $"F7EF 1249 860B F87F 60D6 AE06 B5B2 7824" /* ÷ï.I†.ø.`Ö®.µ²x$ */
- $"E601 91D7 1436 80CF 054C 9691 1321 B299" /* æ.‘×.6€Ï.L–‘.!²™ */
- $"11F3 2BA3 51F6 447E 1BC0 28CB 666B 9BA0" /* .ó+£QöD~.À(Ëfk›  */
- $"425A E39B 066C 1B7C 340B 950A BDCC E05D" /* BZã›.l.|4.•Â½Ìà] */
- $"C8DC 568C BDC6 54E9 0AA2 2D89 6E22 37E4" /* ÈÜVŒ½ÆTé¢-‰n"7ä */
- $"3508 39CC EE8F 8EE6 F926 626B E33F 4A06" /* 5.9ÌîŽæù&bkã?J. */
- $"4CD1 AE16 9063 3119 5554 58CA BB53 4A73" /* LѮ.c1.UTXʻSJs */
- $"AA2B 2A71 B86B 3E95 BED6 D9D2 9D59 3E60" /* ª+*q¸k>•¾ÖÙÒY>` */
- $"C5D1 FA4C E6A7 880F 30D8 A679 6467 697E" /* ÅÑúL槈.0ئydgi~ */
- $"F327 EAA4 E0D1 01F9 9B74 AAA1 6CDD 7DA7" /* ó'ê¤àÑ.ù›tª¡lÝ}§ */
- $"D2AB C9CB 63D6 D3DF C778 C6ED 71A5 0571" /* Ò«ÉËcÖÓßÇxÆíq¥.q */
- $"C7E1 4EC7 E16C 43F0 75B1 3C9E 91EA AAAC" /* ÇáNÇálCðu±<ž‘ꪬ */
- $"9A2E A47E 8DF0 873E 2275 3F71 F986 DF3D" /* š.¤~ð‡>"u?qù†ß= */
- $"DBE5 1F4C 0D83 C3F5 F2D4 5A7C 0BFB E4FC" /* Ûå.L.ƒÃõòÔZ|.ûäü */
- $"C83E D8A4 FAF4 F589 09F2 4909 40AA 2AA8" /* È>ؤúôõ‰ÆòIÆ@ª*¨ */
- $"C190 BE4D D484 1408 6EAD 722F 6BA6 7502" /* Á¾MÔ„..n­r/k¦u. */
- $"A53F 1B9A BE86 841A FC60 53F3 8AE9 2E4C" /* ¥?.š¾†„.ü`SóŠé.L */
- $"4B8E 1D09 F47C 3BAA CFB7 80DE 6A41 F007" /* KŽ.Æô|;ªÏ·€ÞjAð. */
- $"80A3 413A C568 5C02 6166 E8AF 9B6C EF86" /* €£A:Åh\.af诛lï† */
- $"F178 273B A803 89E9 520A ACFC 0E98 6198" /* ñx';¨.‰éR¬ü.˜a˜ */
- $"6ECE D094 76D1 8AF8 1035 D0C8 B9E5 ECC9" /* nÎДvÑŠø.5ÐȹåìÉ */
- $"08E6 748A F28B B0E0 F9AB 71B4 7971 9626" /* .ætŠò‹°àù«q´yq–& */
- $"5397 5D5A 31CB 5F9E 7C98 8300 72B1 2C67" /* S—]Z1Ë_ž|˜ƒ.r±,g */
- $"A38D 0C02 C603 C0C2 2000 E528 0CAA 9472" /* £..Æ.À .å(.ª”r */
- $"3115 8C05 0EE6 3F33 3F6D B6DB 64C7 AAB2" /* 1.Œ..æ?3?m¶ÛdǪ² */
- $"94EA DD85 D3DF F14E FF3F D3A2 778B 3749" /* ”êÝ…ÓßñNÿ?Ó¢w‹7I */
- $"B31B 6DB6 C5B6 5311 C782 3FCF 2880 6695" /* ³.m¶Å¶S.Ç‚?Ï(€f• */
- $"085A 35C2 3938 420E 8705 50BD 51C3 BD21" /* .Z5Â98B.‡.P½Qý! */
- $"41B9 C3ED 3A76 367F 40F5 DA53 3618 DF7A" /* A¹Ãí:v6.@õÚS6.ßz */
- $"EE11 B2D6 D9AD 4351 7D8F BC5A 7217 9352" /* î.²ÖÙ­CQ}¼Zr.“R */
- $"D43F 54B9 F618 3E0E 5FF8 1599 CD00 5489" /* Ô?T¹ö.>._ø.™Í.T‰ */
- $"459D 1B65 0538 7A92 D8EC 6AD5 E756 776E" /* E.e.8z’ØìjÕçVwn */
- $"5B66 A07C 36D6 A4B0 2E00 21E0 ABFC 2AB8" /* [f |6Ö¤°..!à«ü*¸ */
- $"F387 5784 0DB9 1978 67FE DEFF 0CCC CCCC" /* ó‡W„.¹.xgþÞÿ.ÌÌÌ */
- $"CCCC CCCC CCCC CCD3 5F84 850A F245 C370" /* ÌÌÌÌÌÌÌÓ_„…ÂòEÃp */
- $"786E 76C5 56A5 8C9B FC7F 6869 3085 EB26" /* xnvÅV¥Œ›ü.hi0…ë& */
- $"6162 A234 8BF4 868D 0BA5 77FA 56D2 31FD" /* ab¢4‹ô†.¥wúVÒ1ý */
- $"7436 0147 944C 2AAE C8C1 DE46 2A3A 2449" /* t6.G”L*®ÈÁÞF*:$I */
- $"EAD0 8E9E FF0B 129F 7F9C 1436 A6BC 10E6" /* êÐŽžÿ..Ÿ.œ.6¦¼.æ */
- $"3116 7A98 5FF6 97E9 FC84 7136 FEA5 C122" /* 1.z˜_ö—éü„q6þ¥Á" */
- $"E58F 44D6 D7A4 0AD3 E9B4 7C91 B833 1F91" /* åDÖפÂÓé´|‘¸3.‘ */
- $"5F0F D8F7 8A80 6560 B332 081A C68D 0FF9" /* _.Ø÷Š€e`³2..Æ.ù */
- $"899F 2CC7 E1D6 FC7E 1DEB C3ED EA04 F55D" /* ‰Ÿ,ÇáÖü~.ëÃíê.õ] */
- $"017D B775 48A1 A844 EAB2 8E3A 5FF2 20AF" /* .}·uH¡¨D겎:_ò ¯ */
- $"6231 D1B0 D4D9 D308 999B 09F2 95B1 7071" /* b1Ñ°ÔÙÓ.™›Æò•±pq */
- $"F57C 1F1E 7960 4639 6A62 5BC6 9E5A D45D" /* õ|..y`F9jb[ÆžZÔ] */
- $"F339 9597 BF1B 62EB D128 B3D8 9BD3 52BF" /* ó9•—¿.bëÑ(³Ø›ÓR¿ */
- $"0703 43F9 E1C7 940E EA41 F4B1 75E4 891F" /* ..CùáÇ”.êAô±uä‰. */
- $"09A4 D439 7DFF 6AB7 EB4F 1253 A9C0 8BBE" /* ƤÔ9}ÿj·ëO.S©À‹¾ */
- $"40A0 3CE6 965D F886 A9EF 7E69 712D 41C2" /* @ <æ–]ø†©ï~iq-A */
- $"0062 6917 5D06 6548 9FD6 1470 4A0C 8545" /* .bi.].eHŸÖ.pJ.…E */
- $"8417 6C73 0C2D DF44 0E4A D5F9 7443 D629" /* „.ls.-ßD.JÕùtCÖ) */
- $"E62D DE53 CCFA EAEA E08A F0E1 9D37 9616" /* æ-ÞSÌúêêàŠðá7–. */
- $"C0DA 1FD4 6A42 6CE6 1D10 AB6A 911A 19D2" /* ÀÚ.ÔjBlæ..«j‘..Ò */
- $"47A0 4AC5 6A3C 12FF 0FE8 3AFB 7DFD 3D27" /* G JÅj<.ÿ.è:û}ý=' */
- $"42C6 E2BA 6DDE D1ED 21CE 1EA0 F444 055B" /* BÆâºmÞÑí!Î. ôD.[ */
- $"122A 41EE D8C1 144C B39C 0EEA 014E 7448" /* .*AîØÁ.L³œ.ê.NtH */
- $"0B72 7C2C 92B6 0CAC 3CB5 ADA7 8BF8 0C56" /* .r|,’¶.¬<µ­§‹ø.V */
- $"1DD5 B763 907F 6B60 8A85 ED4A F87D FBDC" /* .Õ·c.k`Š…íJø}ûÜ */
- $"391D 822B CBF5 7266 0E6B B2D4 32DE 606C" /* 9.‚+Ëõrf.k²Ô2Þ`l */
- $"014E 64BF F969 E3A5 C8E4 09EC B205 6391" /* .Nd¿ùiã¥ÈäÆì².c‘ */
- $"3081 96F5 9A80 0599 50D2 38FF 635B 9C35" /* 0–õš€.™PÒ8ÿc[œ5 */
- $"97CF A325 D94F B8E1 A794 EABC DA8A 7CC3" /* —Ï£%ÙO¸á§”ê¼ÚŠ|à */
- $"8713 2EBB 1EA6 69B0 9A72 A93D 874A 1F30" /* ‡..».¦i°šr©=‡J.0 */
- $"4C7B B341 B8CF F61E 7CEE 60CC E9B0 6D85" /* L{³A¸Ïö.|î`Ìé°m… */
- $"4F96 977D F85D F85A 08AF 46EF F259 FD70" /* O–—}ø]øZ.¯FïòYýp */
- $"E364 C54D 1F3D C951 B1DD 2CB4 8B94 9350" /* ãdÅM.=ÉQ±Ý,´‹”“P */
- $"8FFC CD4E D39E 2FF5 DC65 9DB7 2133 6E97" /* üÍNÓž/õÜe·!3n— */
- $"9705 2AA6 2625 534E B2A2 D775 FCFA 60E0" /* —.*¦&%SN²¢×uüú`à */
- $"4929 3681 2E72 5087 F3CD FB3A 6386 36A2" /* I)6.rP‡óÍû:c†6¢ */
- $"5E62 8705 57E4 8441 1986 1487 E88F C834" /* ^b‡.Wä„A.†.‡èÈ4 */
- $"C59D D57C CCA2 D56F 3889 44AC 0E4D 0E88" /* ÅÕ|Ì¢Õo8‰D¬.M.ˆ */
- $"2592 A50A F98D DF1D 17F2 78BD D4AB FDB4" /* %’¥Âùß..òx½Ô«ý´ */
- $"4249 FBDE 3E56 BE58 B587 88B4 8D75 299F" /* BIûÞ>V¾Xµ‡ˆ´u)Ÿ */
- $"4C92 6D9A 6B17 6153 9A65 4770 E0EC BBEF" /* L’mšk.aSšeGpàì»ï */
- $"2F91 8C35 8FFA 04AF 880C D9B6 204A D65E" /* /‘Œ5ú.¯ˆ.Ù¶ JÖ^ */
- $"68DD DBE7 63BC E1C5 CCDD E994 3796 10EF" /* hÝÛçc¼áÅÌÝé”7–.ï */
- $"354D C0E7 7A72 E57E EFAC 7C75 E4CE F47F" /* 5MÀçzrå~ï¬|uäÎô. */
- $"2E82 A8D0 6401 3CC4 1ACC 4513 1211 DCC9" /* .‚¨Ðd.<Ä.ÌE...ÜÉ */
- $"BD7A 47CA F093 83C7 38EB 866D 1ED5 AC6C" /* ½zGÊð“ƒÇ8ë†m.Õ¬l */
- $"FF01 C348 CFA1 2532 DAD5 2BDD 8CCC 71C1" /* ÿ.ÃHÏ¡%2ÚÕ+ÝŒÌqÁ */
- $"1208 75AA 308B 4796 A89E 0EAF AB67 422A" /* ..uª0‹G–¨ž.¯«gB* */
- $"AA43 8162 68BC 9878 8578 419C AB2E 9518" /* ªCbh¼˜x…xAœ«.•. */
- $"A9E0 4298 DB46 36D7 ADD0 DE21 DC41 AEA7" /* ©àB˜ÛF6×­ÐÞ!ÜA®§ */
- $"A05D 795D AB14 E247 6750 3EA8 0A31 5A06" /*  ]y]«.âGgP>¨Â1Z. */
- $"FAEC AD07 ECF7 C636 A068 22AA E179 7613" /* úì­.ì÷Æ6 h"ªáyv. */
- $"30F9 831C 0AFA 38C0 E20B 96A9 464E B57A" /* 0ùƒ.Âú8Àâ.–©FNµz */
- $"5AF3 D612 DC70 2A8D 1D09 C7C9 967F 7F7B" /* ZóÖ.Üp*.ÆÇÉ–..{ */
- $"F47F 4017 A722 9853 37C2 DE55 34CF 104E" /* ô.@.§"˜S7ÂÞU4Ï.N */
- $"9DD3 35DF DEE2 589C FAF1 07DE 1803 86B1" /* Ó5ßÞâXœúñ.Þ..†± */
- $"2DE6 6B46 FC45 F24E 8718 3B6E D557 8008" /* -ækFüEòN‡.;nÕW€. */
- $"FF3B 8EC2 28BD 6146 3EF6 A0FB 0BCA 37C1" /* ÿ;ŽÂ(½aF>ö û.Ê7Á */
- $"749B 49F2 F419 9EC5 DC0A A6DE 0CFC 1BD2" /* t›Iòô.žÅܦÞ.ü.Ò */
- $"AAF5 4920 1AB3 842A 1813 606E 97CD 0EC2" /* ªõI .³„*..`n—Í. */
- $"50D4 84CD F427 569F 776D 940A A6F7 68D7" /* PÔ„Íô'VŸwm”¦÷h× */
- $"2A18 4C6D 2056 D254 1226 7F3C 1ED0 7AB8" /* *.Lm VÒT.&.<.Ðz¸ */
- $"BEFE 2050 50E6 C5FB 173C 1857 FF7F 86D9" /* ¾þ PPæÅû.<.Wÿ.†Ù */
- $"6CE3 E235 1AFA CBB4 D2BE 4E64 9713 B880" /* lãâ5.úË´Ò¾Nd—.¸€ */
- $"0C41 2E14 401B D14F 5BA4 AD20 7060 C05E" /* .A..@.ÑO[¤­ p`À^ */
- $"2011 000E C557 2951 009C A584 6178 50E8" /* ...ÅW)Q.œ¥„axPè */
- $"6E0D 922F BFF7 EC41 A907 0D2B EF09 3CE0" /* n.’/¿÷ìA©..+ïÆ<à */
- $"6344 B3D6 742A 0448 042D 44C3 390B 089B" /* cD³Öt*.H.-DÃ9..› */
- $"B0FF 2877 1C62 BE1E AC48 09B0 4667 19BC" /* °ÿ(w.b¾.¬HÆ°Fg.¼ */
- $"319D 1FEA ABB5 1EE9 02D8 C845 A20C 2E3F" /* 1.ꫵ.é.ØÈE¢..? */
- $"7010 FA38 E2A0 1F01 2933 0557 19BD 9DCD" /* p.ú8â ..)3.W.½Í */
- $"5486 F044 5838 C953 CC32 2DF8 6A04 30ED" /* T†ðDX8ÉSÌ2-øj.0í */
- $"2C42 0A7D 1B38 7F94 4936 5908 39F1 424F" /* ,BÂ}.8.”I6Y.9ñBO */
- $"2BFF 7F46 F53E 11D3 DA1E 41B4 67AB 296E" /* +ÿ.Fõ>.ÓÚ.A´g«)n */
- $"0B59 6213 9E16 1568 8787 ED75 8822 A102" /* .Yb.ž..h‡‡íuˆ"¡. */
- $"DAAC D7D6 FA63 ED91 52D2 E98C 6EEB ABBB" /* Ú¬×Öúcí‘RÒéŒnë«» */
- $"5465 7C7C 0CEB 3016 0CC6 5793 D7FF 7FFB" /* Te||.ë0..ÆW“×ÿ.û */
- $"34E7 7BDE 794E 6D8C 392D 051A 478B 4AD7" /* 4ç{ÞyNmŒ9-..G‹J× */
- $"028C 3119 EDCA 833C 2F1B A23A 5C69 908F" /* .Œ1.íʃ</.¢:\i */
- $"6F17 C143 83FF 31A8 709D 7BFA B0E4 A884" /* o.ÁCƒÿ1¨p{ú°ä¨„ */
- $"E3DC 88CC DF54 C132 6671 A0D0 B4C3 7721" /* ã܈ÌßTÁ2fq Ð´Ãw! */
- $"B5F0 84FF 0FDA 1588 5865 1B6B 94E3 9B46" /* µð„ÿ.Ú.ˆXe.k”ã›F */
- $"5CA1 7767 09F4 3448 2242 114C 2705 2C38" /* \¡wgÆô4H"B.L'.,8 */
- $"4565 F286 ABC2 AFF5 809D 0C5B BB5E 009C" /* Eeò†«Â¯õ€.[»^.œ */
- $"FCBA BC4C 84FF 45EF F42B 3F8E DEE0 A531" /* üº¼L„ÿEïô+?ŽÞà¥1 */
- $"DBBB 2113 7C30 8BB7 76FF 7E55 E6BC 012B" /* Û»!.|0‹·vÿ~Uæ¼.+ */
- $"EBDE EF62 0981 DCE1 AC6E 5AD7 D8AD 0560" /* ëÞïbÆÜá¬nZ×Ø­.` */
- $"5B36 3A62 5B57 3E03 75AC 25FB B396 1086" /* [6:b[W>.u¬%û³–.† */
- $"5EF0 4C11 ACE0 90D2 6568 EB55 75AB FF24" /* ^ðL.¬àÒehëUu«ÿ$ */
- $"54B8 0E77 3110 5C67 3138 8369 5BEA 3458" /* T¸.w1.\g18ƒi[ê4X */
- $"7FFE 6000 9940 0044 18C6 1A34 14B6 9CD2" /* .þ`.™@.D.Æ.4.¶œÒ */
- $"C039 2A00 00CC 8F27 9EFE FF80 1CAA 8000" /* À9*..Ì'žþÿ€.ª€. */
- $"0000 0000 D9B1 C1D0 BFE1 D01D 2DD4 E3DF" /* ....Ù±ÁпáÐ.-Ôãß */
- $"949B 6DB6 DB6D B83D 6B98 82BC 446D 0CB3" /* ”›m¶Ûm¸=k˜‚¼Dm.³ */
- $"55A5 C140 D9E5 5E98 37AF 0E38 4474 B8DC" /* U¥Á@Ùå^˜7¯.8Dt¸Ü */
- $"FCFA B14E BD14 730B DAA0 4B18 1B4D 81E7" /* üú±N½.s.Ú K..Mç */
- $"B8A8 26E7 EFB0 8272 4619 2A00 0000 0000" /* ¸¨&çï°‚rF.*..... */
- $"0000 0000 0000 060D CD91 05BE 3A07 80DE" /* ........Í‘.¾:.€Þ */
- $"29D6 2680 7867 5359 9411 F430 48D9 A22D" /* )Ö&€xgSY”.ô0HÙ¢- */
- $"DF74 0855 C0C4 C5AA D3F4 FC40 5815 C5FC" /* ßt.UÀÄŪÓôü@X.Åü */
- $"B741 3001 FF7F FDC6 00B8 F1BA FEC9 B662" /* ·A0.ÿ.ýÆ.¸ñºþɶb */
- $"4973 2EE9 5029 E237 296D D4A4 04DE 4DB9" /* Is.éP)â7)mÔ¤.ÞM¹ */
- $"5305 FD42 9A82 6842 EF09 9DA2 201D C6EF" /* S.ýBš‚hBïÆ¢ .Æï */
- $"4078 4FC3 038C B201 A1C0 0791 7B09 CF18" /* @xOÃ.Œ².¡À.‘{ÆÏ. */
- $"D61B DABD 0409 372B F69D 3CF8 E2E1 31A1" /* Ö.Ú½.Æ7+ö<øâá1¡ */
- $"023B B0FD 60B3 3933 16F2 C716 9259 82F8" /* .;°ý`³93.òÇ.’Y‚ø */
- $"77BB 3A47 46D2 D998 7AA1 01E1 DF78 8000" /* w»:GFÒÙ˜z¡.áßx€. */
- $"0000 0001 D8FD 4FB2 C620 0000 005A CD78" /* ....ØýO²Æ ...ZÍx */
- $"B755 53CD E910 3B50 96A8 4000 0000 0003" /* ·USÍé.;P–¨@..... */
- $"FD6F 5DD1 31D8 A087 6BC5 09F3 E81E B49F" /* ýo]Ñ1Ø ‡kÅÆóè.´Ÿ */
- $"5A88 0DB9 2492 4924 9234 EE49 0E46 EE5B" /* Zˆ.¹$’I$’4îI.Fî[ */
- $"8D2A E866 7AD0 1F3C 936D 50EF 6EF5 FDE7" /* *èfzÐ.<“mPïnõýç */
- $"BFFE 6EFF 82AD 0EDF 556D B01D C573 CA68" /* ¿þnÿ‚­.ßUm°.ÅsÊh */
- $"985A F307 82C5 D933 4C26 B9EE EEF7 D4C6" /* ˜Zó.‚ÅÙ3L&¹îî÷ÔÆ */
- $"BFB5 4130 F610 4AFE 602E 3723 0C95 0000" /* ¿µA0ö.Jþ`.7#.•.. */
- $"0000 0000 0000 0000 0002 7F7E DE44 DDEB" /* ...........~ÞDÝë */
- $"B8B1 0AB8 BA80 7F79 D59C 851A 0244 B8D1" /* ¸±Â¸º€.yÕœ…..D¸Ñ */
- $"6B92 AB1A 4997 5556 C0C7 5935 05AD B380" /* k’«.I—UVÀÇY5.­³€ */
- $"318D A387 1E5F 1523 0170 B5DB D9FA 0E80" /* 1£‡._.#.pµÛÙú.€ */
- $"7342 6634 1E36 FB10 615A 1862 FF53 1545" /* sBf4.6û.aZ.bÿS.E */
- $"C795 B42C 8282 534C 3AFD D370 7621 820E" /* Ç•´,‚‚SL:ýÓpv!‚. */
- $"9EDA AF3A 476B 3537 E327 52DE 4A99 73D1" /* žÚ¯:Gk57ã'RÞJ™sÑ */
- $"0718 7C16 82D5 99A5 32DD 0E83 9C4F 60F8" /* ..|.‚Õ™¥2Ý.ƒœO`ø */
- $"0743 325D 2056 84FF 06BC C6BB 338C 64CF" /* .C2] V„ÿ.¼Æ»3ŒdÏ */
- $"B7B9 C4C7 9800 E4DA EE0A 6636 DEE8 B8F8" /* ·¹Äǘ.äÚîÂf6Þè¸ø */
- $"739E 1EBD 408C C620 9790 A337 E987 2E54" /* sž.½@ŒÆ —£7é‡.T */
- $"DD4A E501 C0BF 44E6 E8EF ACCF 028F 253C" /* ÝJå.À¿Dæèï¬Ï.%< */
- $"F466 FA92 BEE6 A066 F4B6 5B41 CA80 3567" /* ôfú’¾æ fô¶[AÊ€5g */
- $"A079 E31D CEE9 CD64 0AED 265D E591 B98C" /*  yã.ÎéÍdÂí&]呹Œ */
- $"DF22 C203 3C43 E1D8 5D64 CA99 E6C7 EF30" /* ß"Â.<CáØ]dÊ™æÇï0 */
- $"68AF F4C9 97D5 F961 48CF 954C 2832 33A3" /* h¯ôÉ—ÕùaHÏ•L(23£ */
- $"0088 1417 0D84 DDE1 23FA C81D 487D C9AB" /* .ˆ...„Ýá#úÈ.H}É« */
- $"F239 ABB4 24E0 6694 291C 885C 23CE F212" /* ò9«´$àf”).ˆ\#Îò. */
- $"29F4 5656 7DD1 182A 2C11 AAEF 7534 24EE" /* )ôVV}Ñ.*,.ªïu4$î */
- $"9886 347F 28AD 6952 0A82 E9A4 6AA9 9390" /* ˜†4.(­iR‚é¤j©“ */
- $"06A8 EF47 527A EDF2 894B 5234 A900 82B1" /* .¨ïGRzíò‰KR4©.‚± */
- $"724D 791B 676C BC97 B3A5 94F7 137E FE8D" /* rMy.gl¼—³¥”÷.~þ */
- $"50F5 C1EE 0C5B 1F3D CEF4 DD64 709C 095B" /* PõÁî.[.=ÎôÝdpœÆ[ */
- $"A51A B239 3EC3 C9BA 39EC DBE2 FB9A 3C6F" /* ¥.²9>Ãɺ9ìÛâûš<o */
- $"BBC4 DE3E C5AF 0043 DC2D AE64 C0A7 2039" /* »ÄÞ>ů.CÜ-®dÀ§ 9 */
- $"A6C9 6079 72D6 0BC7 C501 A3A4 5EF4 A060" /* ¦É`yrÖ.ÇÅ.£¤^ô ` */
- $"C46E FCB9 1958 AD83 1176 0776 81C2 13C2" /* Änü¹.X­ƒ.v.vÂ. */
- $"DF08 4A76 137F DC5C 4867 0493 EE96 8373" /* ß.Jv..Ü\Hg.“î–ƒs */
- $"4644 13A4 F789 39FF 813B D226 575A 5A18" /* FD.¤÷‰9ÿ;Ò&WZZ. */
- $"3AF5 4B88 2747 3D47 681F 9670 0069 DD02" /* :õKˆ'G=Gh.–p.iÝ. */
- $"4252 ADB0 D6FB F1F1 1432 C24B D920 7290" /* BR­°Öûññ.2ÂKÙ r */
- $"3709 3D60 15D9 0C49 23EC 77F8 F791 F132" /* 7Æ=`.Ù.I#ìwø÷‘ñ2 */
- $"046E 0D05 9AFA 210A 9992 29D9 7AA6 F18E" /* .n..šú!™’)Ùz¦ñŽ */
- $"E245 75E0 018F BCEB 8D1B C2D0 083E 985F" /* âEuà.¼ë.ÂÐ.>˜_ */
- $"B791 554D F5F5 AD71 E064 75E6 1F3A D463" /* ·‘UMõõ­qàduæ.:Ôc */
- $"9A59 0A43 3457 BD7C 44A7 5C5E 9D19 C5D8" /* šYÂC4W½|D§\^.ÅØ */
- $"5880 C2CC 5DF0 2964 C0FD ABA1 004B 008D" /* X€ÂÌ]ð)dÀý«¡.K. */
- $"5205 7F2E 0843 E484 2D37 9C34 2425 7AFF" /* R....Cä„-7œ4$%zÿ */
- $"7021 D907 B6E1 F5E5 02C3 F3DD 44C8 2252" /* p!Ù.¶áõå.ÃóÝDÈ"R */
- $"0649 3C1A 1A80 449A 64D1 1720 76D6 4987" /* .I<..€DšdÑ. vÖI‡ */
- $"B4B1 E749 E899 BF69 5B35 F925 2EE6 6CE6" /* ´±çI虿i[5ù%.ælæ */
- $"B4FD CEB3 54C0 7C9D 4380 F93B 5701 F274" /* ´ýγTÀ|C€ù;W.òt */
- $"C4F3 CC20 F972 1FD1 56B3 911D 2995 5FC9" /* ÄóÌ ùr.ÑV³‘.)•_É */
- $"1F35 BAE0 9AC7 3082 1372 C1D5 4B23 D79E" /* .5ºàšÇ0‚.rÁÕK#מ */
- $"EF63 A93F 8E74 26FB AC68 CDBE BD3E 9720" /* ïc©?Žt&û¬h;½>— */
- $"DF71 956D 5D26 559E 2795 2F1B F798 7821" /* ßq•m]&Už'•/.÷˜x! */
- $"F3CB 1E6F 2351 11BD 0EFF 19B2 40A2 1C7F" /* óË.o#Q.½.ÿ.²@¢.. */
- $"267D D302 F6AE 5410 1E96 40DC 386E CB7B" /* &}Ó.ö®T..–@Ü8nË{ */
- $"7EA3 5CF7 46BA 8758 D0EE 12B3 34DF 46FE" /* ~£\÷Fº‡XÐî.³4ßFþ */
- $"517B E0F8 7E28 83A5 E93A C06D 7C3F 254B" /* Q{àø~(ƒ¥é:Àm|?%K */
- $"53DF 91ED F6AB FD0A 53A0 5257 F9B8 E8B7" /* Sß‘íö«ýÂS RWù¸è· */
- $"5A14 6036 C6DA E3FE C29D 799F 8B43 46D6" /* Z.`6ÆÚãþÂyŸ‹CFÖ */
- $"94DF 1954 073C 7C30 40F4 A00D 93D4 AADF" /* ”ß.T.<|0@ô .“ﻧ */
- $"4839 EF36 F92A 3758 97CE 955A 3521 3CB5" /* H9ï6ù*7X—ΕZ5!<µ */
- $"8269 30A7 2A93 6A40 07BE DCC3 50B6 C86B" /* ‚i0§*“j@.¾ÜÃP¶Èk */
- $"CE9A AF28 3B80 4FE6 873C DB8E A29C 15DC" /* Κ¯(;€Oæ‡<ÛŽ¢œ.Ü */
- $"81A8 F841 4F77 6237 7267 55C4 1289 2DA1" /* ¨øAOwb7rgUÄ.‰-¡ */
- $"8392 424A 398F 9FA7 8DBE 2CC6 44E9 A005" /* ƒ’BJ9Ÿ§¾,ÆDé . */
- $"0E57 6638 ADDD 9F15 D32E 13A9 F752 67BA" /* .Wf8­ÝŸ.Ó..©÷Rgº */
- $"9F1D 753C 0023 2BC1 2C48 19AF FF28 66E6" /* Ÿ.u<.#+Á,H.¯ÿ(fæ */
- $"0A05 1D62 536F C372 7DEC 5069 B44D AFD4" /* Â..bSoÃr}ìPi´M¯Ô */
- $"BE3C 9C16 161E 95B4 89E7 B034 4524 E373" /* ¾<œ...•´‰ç°4E$ãs */
- $"D4A2 2F82 F1BB 8F20 7861 0F95 7CDF C184" /* Ô¢/‚ñ» xa.•|ßÁ„ */
- $"5B65 6015 001B F6BD 5D52 D4BC 3A42 FD56" /* [e`...ö½]RÔ¼:BýV */
- $"D48F 3358 7432 09BD FF19 625D 3A11 13DA" /* Ô3Xt2ƽÿ.b]:..Ú */
- $"F222 12E8 5A1B 12BF 9B3B A234 A367 8FB6" /* ò".èZ..¿›;¢4£g¶ */
- $"4BF2 EE99 DB11 5D13 7021 71B4 2280 A1BC" /* Kòî™Û.].p!q´"€¡¼ */
- $"2AEF ECB5 D7EC 047C 0860 9676 78B1 CA76" /* *ïìµ×ì.|.`–vx±Êv */
- $"9AFB C995 D4EB 900A AD98 6423 E572 B68C" /* šûÉ•Ôë­˜d#år¶Œ */
- $"A271 A30B D157 8E95 8250 29BB 0323 E26C" /* ¢q£.ÑWŽ•‚P)».#âl */
- $"9223 91C7 0CD4 F0B0 442E 1BD3 1473 C699" /* ’#‘Ç.Ôð°D..Ó.sÆ™ */
- $"2D1C 8791 C699 920E 72C0 0D3E F6E9 9E2B" /* -.‡‘Æ™’.rÀ.>öéž+ */
- $"60B6 A87F 6CBE 146C 1224 90FC BF7B C6A9" /* `¶¨.l¾.l.$ü¿{Æ© */
- $"090E 3EAD C89D 5065 414B 3A1C F271 9327" /* Æ.>­ÈPeAK:.òq“' */
- $"D490 CD2B FBB3 BEFF 768D 4601 635B A746" /* ÔÍ+û³¾ÿvF.c[§F */
- $"8A4B 0981 8B8F EA85 D255 2113 8792 CC76" /* ŠKÆ‹ê…ÒU!.‡’Ìv */
- $"DE84 B950 C5F4 A4C1 D4EF 7D52 CC74 CCEE" /* Þ„¹PÅô¤ÁÔï}RÌtÌî */
- $"B40E B94F 9467 15CA 1DE0 3557 BF09 D787" /* ´.¹O”g.Ê.à5W¿Æׇ */
- $"ED66 345A E153 B4DC EF7C 2952 3161 5A99" /* íf4ZáS´Üï|)R1aZ™ */
- $"A193 D5EB 40F5 1300 65FA 8DFD 621A AE94" /* ¡“Õë@õ..eúýb.®” */
- $"30CD 6D25 A0FC 942E 37AC 52C8 CEAD 2D1F" /* 0Ím% ü”.7¬RÈέ-. */
- $"87D5 D078 F173 F5AD 7A56 DD1B 10C3 F9BF" /* ‡ÕÐxñsõ­zVÝ..Ãù¿ */
- $"69C1 9E6B E021 A0C7 84BF D87A 8AA8 327C" /* iÁžkà! Ç„¿ØzŠ¨2| */
- $"7D48 0D97 E584 FF7F AE07 2001 BF6C 2691" /* }H.—å„ÿ.®. .¿l&‘ */
- $"3032 E118 8741 42AD 7709 3086 8488 F9D3" /* 02á.‡AB­wÆ0†„ˆùÓ */
- $"0353 D79E 2E21 8F21 46CC 005C DA8A 0229" /* .Sמ.!!FÌ.\ÚŠ.) */
- $"A56B A72A C69E FCF7 7558 5D72 0050 2BDE" /* ¥k§*Æžü÷uX]r.P+Þ */
- $"0F36 E4F0 C744 89FC 37F0 7ECA F488 FE8C" /* .6äðÇD‰ü7ð~ÊôˆþŒ */
- $"1B6B 0158 B34D 1EA6 9B1F 154E FF79 01D4" /* .k.X³M.¦›..Nÿy.Ô */
- $"725F D9CF D9BF CCFF 439D 8F5C A92D D20D" /* r_ÙÏÙ¿ÌÿC\©-Ò. */
- $"0613 88F8 5C1C B6BD 07B9 9078 151D 8353" /* ..ˆø\.¶½.¹x..ƒS */
- $"0E68 8495 D521 92D8 E92D CF9B 10E6 ABDC" /* .h„•Õ!’Øé-Ï›.æ«Ü */
- $"53D9 DFB2 F2AF F964 14E3 74D6 3D64 01E2" /* SÙß²ò¯ùd.ãtÖ=d.â */
- $"FAFB 2D0B D303 DCF7 7718 E6CF 30DB 3FAE" /* úû-.Ó.Ü÷w.æÏ0Û?® */
- $"2873 3339 54A3 1E48 04D2 FDF2 E863 6201" /* (s39T£.H.Òýòècb. */
- $"01D1 182C 4C2A D85D AE26 DE15 9796 494C" /* .Ñ.,L*Ø]®&Þ.—–IL */
- $"82EA B4C0 2D3C 3D3E 1732 2ACA AC27 B7DB" /* ‚ê´À-<=>.2*ʬ'·Û */
- $"5CED 6F9D 3EDB FF04 5E83 BE60 1636 AE2C" /* \ío>Ûÿ.^ƒ¾`.6®, */
- $"754D 2928 7128 ACFD 15E8 C1A0 30A5 1063" /* uM)(q(¬ý.èÁ 0¥.c */
- $"1E6F 10F7 A946 B9B4 D921 5DB3 113F 332E" /* .o.÷©F¹´Ù!]³.?3. */
- $"61B8 AB3D 2F87 E081 C9D9 32B7 1060 785A" /* a¸«=/‡àÉÙ2·.`xZ */
- $"EFDD F472 0283 E235 4D42 E903 A06B 51CB" /* ïÝôr.ƒâ5MBé. kQË */
- $"39DC A412 A492 918E 235E F57C E4CE 4E0F" /* 9ܤ.¤’‘Ž#^õ|äÎN. */
- $"6BE6 7036 FA8A 7B2C 21FE 60B1 6FCA 7654" /* kæp6úŠ{,!þ`±oÊvT */
- $"C9FD DCDF E497 B2A6 D6D5 87ED 9D3B 5B86" /* ÉýÜßä—²¦ÖÕ‡í;[† */
- $"DA51 6B5B AE3E 520B 1DB3 5A6B 2B4D A777" /* ÚQk[®>R..³Zk+M§w */
- $"4F13 A04C 7D4F 819B 1FEB 086D 5F34 6643" /* O. L}O›.ë.m_4fC */
- $"0208 693A D70C 55B2 7A07 BC27 3A41 B739" /* ..i:×.U²z.¼':A·9 */
- $"C1F5 7425 07D5 D74C 1F56 F680 F1C4 B0CB" /* Áõt%.Õ×L.Vö€ñÄ°Ë */
- $"F3E0 DE80 53FC 256D EFD0 6B64 028C EC70" /* óàÞ€Sü%mïÐkd.Œìp */
- $"4973 06D4 242C DAAA 8373 DFAC B0C9 14A1" /* Is.Ô$,Úªƒs߬°É.¡ */
- $"BFBC 0BB4 E250 919E 3D2B B388 3A89 FB02" /* ¿¼.´âP‘ž=+³ˆ:‰û. */
- $"9796 86E6 20F8 C26C 8120 349C 757A 6875" /* —–†æ øÂl 4œuzhu */
- $"F63E AE68 84C3 03A3 6F64 F9EE F892 2CF8" /* ö>®h„Ã.£odùîø’,ø */
- $"61C1 B13A E941 0D67 DA36 4C05 9565 DC85" /* aÁ±:éA.gÚ6L.•eÜ… */
- $"D7F8 6EB9 D903 D428 F59A 3EBF C73E 5E95" /* ×øn¹Ù.Ô(õš>¿Ç>^• */
- $"764D 15FB 98F2 BECE 0FC8 EA3C 4E51 E1DD" /* vM.û˜ò¾Î.Èê<NQáÝ */
- $"5253 CE7A 2D16 8527 AF8E 9A17 757A A42F" /* RSÎz-.…'¯Žš.uz¤/ */
- $"6CA9 6BB3 7787 D84F 8E20 EA1F FB2D 15E3" /* l©k³w‡ØOŽ ê.û-.ã */
- $"0D2C 45A8 8C80 7DA1 89DB 5F46 F3FB 2871" /* .,E¨Œ€}¡‰Û_Fóû(q */
- $"539E 8CCA 5C03 EF20 B6B5 4956 EB82 172C" /* SžŒÊ\.ï ¶µIVë‚., */
- $"AB28 0D6D 4DF9 1F61 6F8D 61FE E962 778D" /* «(.mMù.aoaþébw */
- $"0C8E EC55 3BDC EC81 C9D1 E7D5 A811 C69A" /* .ŽìU;ÜìÉÑçÕ¨.Æš */
- $"6186 BC2C 75B4 DD3D C207 1151 4C3B 4175" /* a†¼,u´Ý=Â..QL;Au */
- $"942E 2ACF D3C7 7122 9D89 31B3 0918 EDC0" /* ”.*ÏÓÇq"‰1³Æ.íÀ */
- $"9D45 75D8 DE61 5036 6D9F 3373 4827 7ADE" /* EuØÞaP6mŸ3sH'zÞ */
- $"1BD1 16E8 8905 37D4 D811 1077 B359 0FF6" /* .Ñ.è‰.7ÔØ..w³Y.ö */
- $"0460 F360 20A5 B532 3418 142A B432 C2E9" /* .`ó` ¥µ24..*´2Âé */
- $"A0D6 DB04 317D 28F3 C893 AAE3 19B1 5742" /*  ÖÛ.1}(óÈ“ªã.±WB */
- $"7BF6 615C 0EAC F35E 0CD4 B142 A289 5458" /* {öa\.¬ó^.Ô±B¢‰TX */
- $"D699 1584 46FF 7174 758F B1F8 F540 F427" /* Ö™.„Fÿqtu±øõ@ô' */
- $"A496 8795 E66B 3DDC FB80 D0B8 9411 7240" /* ¤–‡•æk=Üû€Ð¸”.r@ */
- $"0374 54DC B2CA C982 BD5E FD06 4B02 5E8D" /* .tTܲÊÉ‚½^ý.K.^ */
- $"A958 79AA 5BE6 B5A2 76C3 7C23 0D45 6768" /* ©Xyª[æµ¢vÃ|#.Egh */
- $"D726 8259 FD2E E5CE 9B70 0600 22E7 82A3" /* ×&‚Yý.åΛp.."ç‚£ */
- $"8E14 9626 C4EC EED9 E7D8 13C9 623F 3DEB" /* Ž.–&ÄìîÙçØ.Éb?=ë */
- $"357B E617 A43A C9D4 328A C30A FF45 71BA" /* 5{æ.¤:ÉÔ2ŠÃÂÿEqº */
- $"1F8B 3945 8E06 0CF0 4749 0840 6F5A EDDB" /* .‹9EŽ..ðGI.@oZíÛ */
- $"29AC E877 27BD 6C8C A131 8A1C 9228 0FC5" /* )¬èw'½lŒ¡1Š.’(.Å */
- $"A029 D1A1 324D EFCE EB3F 2B92 150D FB8C" /*  )Ñ¡2MïÎë?+’..ûŒ */
- $"5399 1ABD D375 08BF 8F3F E788 684D 3064" /* S™.½Óu.¿?çˆhM0d */
- $"70B4 A733 4AB6 239A DC03 724F C8B8 F1BB" /* p´§3J¶#šÜ.rOȸñ» */
- $"8F1F A795 FF18 8256 0050 FF74 EDF1 3D05" /* .§•ÿ.‚V.Pÿtíñ=. */
- $"6CB0 E566 9272 E493 C085 3D06 3116 4ECE" /* l°åf’rä“À…=.1.NÎ */
- $"402D 329F 4BBB 2598 A7CF BEE1 333D 9019" /* @-2ŸK»%˜§Ï¾á3=. */
- $"61BB 1A29 2616 E907 2CD6 F64C 456F 9881" /* a».)&.é.,ÖöLEo˜ */
- $"725B 5C38 A40D 60D3 6B4F FDF1 87D7 4786" /* r[\8¤.`ÓkOýñ‡×G† */
- $"29BF CAEB 223A 044D 0F61 FDE6 0A3E 7727" /* )¿Êë":.M.aýæÂ>w' */
- $"DDEE 0A95 231F 04AC B6EF D134 C09D 1540" /* Ýî•#..¬¶ïÑ4À.@ */
- $"0E94 57E2 8418 C208 1F26 7396 96A0 D08F" /* .”Wâ„.Â..&s–– Ð */
- $"0CC0 40C8 C596 39BA 0CAE A6ED F8E8 7D6B" /* .À@ÈÅ–9º.®¦íøè}k */
- $"A76C 391B 6113 555F 62E0 6E14 5D27 E7BC" /* §l9.a.U_bàn.]'ç¼ */
- $"EDB7 D038 DED2 7BEE FC9D 6211 241E 0795" /* í·Ð8ÞÒ{îüb.$..• */
- $"9CDE 1607 B4C7 828E 24D2 4E9F FCA0 36EA" /* œÞ..´Ç‚Ž$ÒNŸü 6ê */
- $"004C C960 1680 01CE 7FF6 A201 EDAB 1ADF" /* .LÉ`.€.Î.ö¢.í«.ß */
- $"80D8 4524 390C 23DD EA8E 062C 5DDB 3C57" /* €ØE$9.#ÝêŽ.,]Û<W */
- $"BAEC 18E5 1ECE 91D7 A40E 08ED 23EA 55B6" /* ºì.å.Αפ..í#êU¶ */
- $"AA2C F48A 7B0E 8CAE 90DD 5840 41FF 7F4C" /* ª,ôŠ{.Œ®ÝX@Aÿ.L */
- $"47AD E774 87C4 9AB1 9CAD E633 DECD 3E36" /* G­çt‡Äš±œ­æ3ÞÍ>6 */
- $"00C2 0E05 134F 4802 3846 3575 1902 676D" /* .Â...OH.8F5u..gm */
- $"1006 D8AE 0D5F 1934 78F6 0721 F3C4 1000" /* ..Ø®._.4xö.!óÄ.. */
- $"8991 FA85 45B5 37A9 5A0C 54EE 014B 297B" /* ‰‘ú…Eµ7©Z.Tî.K){ */
- $"52F2 5ADD 7422 C97B EAA9 D291 45A7 A44A" /* RòZÝt"É{ê©Ò‘E§¤J */
- $"40FE AE73 5086 C7D3 85FD D734 67F2 8909" /* @þ®sP†ÇÓ…ý×4gò‰Æ */
- $"506D 36D8 2361 990C 802F A59E B603 9C94" /* Pm6Ø#a™.€/¥ž¶.œ” */
- $"F7BD AED9 8518 8651 DFFE 3D0E E920 E874" /* ÷½®Ù….†Qßþ=.é èt */
- $"FEB0 EE3C 3242 C249 4704 EEA8 9EFA DC61" /* þ°î<2BÂIG.úÜa */
- $"49C6 929E 2A9D 51CD FE0A FF02 3DDB 01EC" /* IÆ’ž*QÍþÂÿ.=Û.ì */
- $"80E8 630A B0C8 C9FC 7693 C60B 07E8 5D2F" /* €èc°ÈÉüv“Æ..è]/ */
- $"B97A 9F04 444E C836 DD68 FF12 EC9C 7E4F" /* ¹zŸ.DNÈ6Ýhÿ.ìœ~O */
- $"3CE9 83A8 191A 1E61 05F8 90FF 67E8 011A" /* <部...a.øÿgè.. */
- $"71EA 3EE8 AFBD 6328 ED84 9807 788D F3BC" /* qê>诽c(턘.xó¼ */
- $"2FA0 A210 7FFF 1D02 2519 4EC7 2A80 7FD0" /* / ¢..ÿ..%.NÇ*€.Ð */
- $"2064 A8F4 CC78 5EC8 88AF F1AB 868B 9F8D" /* d¨ôÌx^Ȉ¯ñ«†‹Ÿ */
- $"883E 3FDA D188 FBB7 3AFC 0C72 E01A CEF3" /* ˆ>?Úшû·:ü.rà.Îó */
- $"21E1 1718 4FDB 9A43 3767 424A 639B DFFE" /* !á..OÛšC7gBJc›ßþ */
- $"CA5F 7BA9 8F82 3EA6 6D4E 6986 6945 80DE" /* Ê_{©‚>¦mNi†iE€Þ */
- $"8274 4927 166A 6062 DF1D 0A72 F23B FA5A" /* ‚tI'.j`bß.Ârò;úZ */
- $"4DE4 5D19 54FC 488B 5237 FF5F 7B81 62C5" /* Mä].TüH‹R7ÿ_{bÅ */
- $"F6B7 B580 3016 11B6 22CF 63B8 428A D39A" /* ö·µ€0..¶"Ïc¸BŠÓš */
- $"5AC3 80FF 7310 8386 FF54 F361 304F 3BB5" /* ZÀÿs.ƒ†ÿTóa0O;µ */
- $"A7EB 0419 7DFB 6E56 20A8 3670 9018 9CB3" /* §ë..}ûnV ¨6p.œ³ */
- $"4B35 7082 32A7 E917 9CF8 FF7F FF80 0A6C" /* K5p‚2§é.œøÿ.ÿ€Âl */
- $"A48C 447E 3ECF 411D 89E4 F923 373B DCBE" /* ¤ŒD~>ÏA.‰äù#7;ܾ */
- $"2CE8 6580 0F87 1A23 1D93 62AE 48EF DEB8" /* ,èe€.‡.#.“b®HïÞ¸ */
- $"5DE8 DB68 1CA3 8D4B D3FE A476 7B3D ACAA" /* ]èÛh.£KÓþ¤v{=¬ª */
- $"284F 83EB 428F A201 D122 CB1A CCB2 C1FE" /* (OƒëB¢.Ñ"Ë.̲Áþ */
- $"367F 60D3 155D 8C00 22D8 ED33 D56B 1DE2" /* 6.`Ó.]Œ."Øí3Õk.â */
- $"98B0 A4A9 E041 2BF1 AA58 E78D 47E5 929F" /* ˜°¤©àA+ñªXçGå’Ÿ */
- $"85DA 699E C45A 0064 B931 CF2B 4169 44F0" /* …ÚižÄZ.d¹1Ï+AiDð */
- $"4B4F 083B 3D7C B2B2 D87B 785E 91A8 C614" /* KO.;=|²²Ø{x^‘¨Æ. */
- $"6EE6 A63C C8A7 B9E3 839D E245 4128 3BF9" /* næ¦<ȧ¹ãƒâEA(;ù */
- $"98CD 0C23 72EB E3A9 D21F 1BC2 4E13 274B" /* ˜Í.#rëã©Ò..ÂN.'K */
- $"19C8 CB39 5E7A D218 FBDB 0C42 51A1 1203" /* .ÈË9^zÒ.ûÛ.BQ¡.. */
- $"C0EB CDC2 9249 E461 1DE4 3DB6 FDFE 1334" /* ÀëÍÂ’Iäa.ä=¶ýþ.4 */
- $"1952 8231 CD71 A170 C55B 1FD0 6706 57F0" /* .R‚1Íq¡pÅ[.Ðg.Wð */
- $"282D 09A2 0893 A5BA 0314 43DD 32AF 3478" /* (-Æ¢.“¥º..CÝ2¯4x */
- $"EF6C 15F0 55C9 6A47 ECFE 3F3F 4DB4 5ED8" /* ïl.ðUÉjGìþ??M´^Ø */
- $"EFF8 8CA5 71F9 6669 078C 550C 943A 7046" /* ïøŒ¥qùfi.ŒU.”:pF */
- $"C031 6CE2 4681 4177 2913 CFE7 D857 C62A" /* À1lâFAw).ÏçØWÆ* */
- $"4652 88E2 8830 DF42 9C3D 2D76 E710 A8F1" /* FRˆâˆ0ßBœ=-vç.¨ñ */
- $"3626 45F2 55CC 008C EAB8 B891 A5F3 1AD2" /* 6&EòUÌ.Œê¸¸‘¥ó.Ò */
- $"AB11 6C48 3F18 40C0 51F0 DB88 0BD1 168C" /* «.lH?.@ÀQðÛˆ.Ñ.Œ */
- $"2E54 2DA6 CC60 BB05 4700 2C4E 179B 271B" /* .T-¦Ì`».G.,N.›'. */
- $"688C 1EE9 4D9A C781 8108 296B FE4F 028A" /* hŒ.éMšÇ.)kþO.Š */
- $"63D6 6EDF 6FEB FC17 BDFE 7A70 B48E D94E" /* cÖnßoëü.½þzp´ŽÙN */
- $"D985 3384 1BD2 B4C9 5213 B0D1 041B 876C" /* Ù…3„.Ò´ÉR.°Ñ..‡l */
- $"131C 4A9C 947B A79C A466 9779 E7C9 D2E1" /* ..Jœ”{§œ¤f—yçÉÒá */
- $"4E9F 0509 30E0 1115 E5C7 CAED 197B 818A" /* NŸ.Æ0à..åÇÊí.{Š */
- $"324D 8F8E ED44 BF44 5340 D647 1776 B983" /* 2MŽíD¿DS@ÖG.v¹ƒ */
- $"6D8C 88B1 6976 F7EB AFDB 6638 CAD3 F275" /* mŒˆ±iv÷ë¯Ûf8ÊÓòu */
- $"D93A 6CD3 9D6E C617 3969 D8E5 3059 947B" /* Ù:lÓnÆ.9iØå0Y”{ */
- $"6AFA 0E9B A19C 24C9 E1DC 089D 3545 89E4" /* jú.›¡œ$ÉáÜ.5E‰ä */
- $"E860 FB54 068C B464 EE9B 66B7 F267 34CF" /* è`ûT.Œ´dî›f·òg4Ï */
- $"1276 C6B2 47E6 8284 300B D1A9 1409 0C93" /* .vƲGæ‚„0.Ñ©.Æ.“ */
- $"E36A 8095 409A 7352 FF7A 0F50 A5E2 E678" /* ãj€•@šsRÿz.P¥âæx */
- $"C195 0898 E51E EB15 8D7A E918 29A6 D5CE" /* Á•.˜å.ë.zé.)¦ÕÎ */
- $"4DBC 978B 2CAA 9BA7 8727 EA1C 1C7A 6CC2" /* M¼—‹,ª›§‡'ê..zl */
- $"D172 DDF5 4BD4 9C69 607B 609F AEC8 FD84" /* ÑrÝõKÔœi`{`Ÿ®Èý„ */
- $"1DDA A076 C7E1 A7B1 F86C BC7E 1720 EB83" /* .Ú vÇ᧱øl¼~. ëƒ */
- $"095B F1C8 7239 10FD 6A26 D10E 534B E257" /* Æ[ñÈr9.ýj&Ñ.SKâW */
- $"B691 5D92 6949 E7D8 7470 AA8C 421F F945" /* ¶‘]’iIçØtpªŒB.ùE */
- $"99F6 9492 B806 E264 47B0 4EF5 6206 734E" /* ™ö”’¸.âdG°Nõb.sN */
- $"944B 102F A688 23A4 EAB0 CCEA 0017 0156" /* ”K./¦ˆ#¤ê°Ìê...V */
- $"A8C9 2A3F FF49 4137 E23A 09D0 97BB 0E5F" /* ¨É*?ÿIA7â:ÆЗ»._ */
- $"E2A2 2247 4980 6A20 B443 3E0B 0465 B9EF" /* â¢"GI€j ´C>..e¹ï */
- $"C490 B954 3AEA ABB7 3D53 111D 8897 551C" /* ĹT:ê«·=S..ˆ—U. */
- $"B865 1EA2 33F2 AD50 D488 1D6D 9733 27F3" /* ¸e.¢3ò­PÔˆ.m—3'ó */
- $"78AC C946 FB3C 4D2F 6580 1B3A 3368 3D54" /* x¬ÉFû<M/e€.:3h=T */
- $"55DF 6B52 1A54 9010 C4D2 12C8 D497 9CDB" /* UßkR.T.ÄÒ.ÈÔ—œÛ */
- $"173A 0609 66F1 C6C0 FD02 47A0 B2E2 D2E6" /* .:.ÆfñÆÀý.G ²âÒæ */
- $"096E F870 0776 4898 2F2B 84CF BA83 D656" /* Ænøp.vH˜/+„ϺƒÖV */
- $"7F77 79FF 0F1D 2A6E 03C6 4D0F E3EF D23B" /* .wyÿ..*n.ÆM.ãïÒ; */
- $"6F82 5F72 6701 98DF 5A63 DA7B 0ABC 75E2" /* o‚_rg.˜ßZcÚ{¼uâ */
- $"382D 0D93 3C8C 5308 19EA EF8D 7922 CD36" /* 8-.“<ŒS..êïy"Í6 */
- $"ED21 EB4D 3D77 5A8A 1380 E238 22E5 84AA" /* í!ëM=wZŠ.€â8"優 */
- $"4488 7DCE 91A0 CB4B 67FA 74AF EA3D 1C8E" /* Dˆ}Α ËKgút¯ê=.Ž */
- $"9279 611D FD02 D08F D952 B05D 2C11 B545" /* ’ya.ý.ÐÙR°],.µE */
- $"5F17 FF5C 1E9C 6A77 DA2F A474 B20C F5A2" /* _.ÿ\.œjwÚ/¤t².õ¢ */
- $"B2D4 176F 97E4 CE9E B576 C3E0 0F3D ECB9" /* ²Ô.o—äΞµvÃà.=ì¹ */
- $"7B35 DEBB 5ABA 9738 36F8 524D 74D8 08FF" /* {5Þ»Zº—86øRMtØ.ÿ */
- $"29A7 9B08 5B43 7C17 FB53 234E 4806 B0C3" /* )§›.[C|.ûS#NH.°Ã */
- $"AF3A FF38 CCAF FEAA C60F D103 32AC 7D7F" /* ¯:ÿ8̯þªÆ.Ñ.2¬}. */
- $"D2B8 51C1 7B7D 56FD 7CFB D2B5 C55B 7C7D" /* Ò¸QÁ{}Vý|ûÒµÅ[|} */
- $"7D30 10C2 4181 3358 5DD6 4625 4FFC EA30" /* }0.ÂA3X]ÖF%Oüê0 */
- $"3402 194F 6D0B 53D8 3C64 54AE E8DA 7874" /* 4..Om.SØ<dT®èÚxt */
- $"7FF1 DE25 3147 0AF0 D5B6 7BF7 88DD 5199" /* .ñÞ%1GÂðÕ¶{÷ˆÝQ™ */
- $"611E 526D B6DB 6DB6 DB69 9C6E 7A40 821D" /* a.Rm¶Ûm¶Ûiœnz@‚. */
- $"4416 6952 04BB 9C0A F19B 2C62 E698 A4F5" /* D.iR.»œÂñ›,b昤õ */
- $"9B83 3C59 8217 0000 0034 8080 DB92 4924" /* ›ƒ<Y‚....4€€Û’I$ */
- $"9249 247D 32D0 9B20 73FF 7E44 A49A 44BB" /* ’I$}2Л sÿ~D¤šD» */
- $"EB45 3E31 A4A0 C0CC BBC0 B29E 7771 4FDE" /* ëE>1¤ ÀÌ»À²žwqOÞ */
- $"1679 23F1 DE12 5574 68E3 60A1 9C00 CBEC" /* .y#ñÞ.Uthã`¡œ.Ëì */
- $"9C44 9009 0000 08DE 28C3 2776 AAA2 829A" /* œDÆ...Þ(Ã'vª¢‚š */
- $"05E0 47E9 0001 48A9 672C 0775 EE58 F075" /* .àGé..H©g,.uîXðu */
- $"7458 B48A 5455 DB33 3524 BE73 1D7C E223" /* tX´ŠTUÛ35$¾s.|â# */
- $"4EC4 732C EC4B 128D 341C 790C 00A2 1309" /* NÄs,ìK.4.y..¢.Æ */
- $"2D0B 5EA7 B07B C82C 976B 68C2 642A F095" /* -.^§°{È,—khÂd*ð• */
- $"A1C4 010E C94E D8A9 34BB FD3E 2B2F 92EC" /* ¡Ä..ÉNØ©4»ý>+/’ì */
- $"30E1 A7B3 040B C920 3FFF 7FA1 317B 90F7" /* 0᧳..É ?ÿ.¡1{÷ */
- $"C744 40B8 8325 4036 82FB 0C6C D800 19C4" /* ÇD@¸ƒ%@6‚û.lØ..Ä */
- $"2631 C4B8 3160 8649 2492 4924 9248 A747" /* &1ĸ1`†I$’I$’H§G */
- $"3D41 A17D 23A6 9AC7 9000 0000 0000 0000" /* =A¡}#¦šÇ....... */
- $"0000 0019 1A70 8823 BB21 7C62 4556 F257" /* .....pˆ#»!|bEVòW */
- $"62C0 CF0B 72EE F37E 64EC 43C2 AE04 9F58" /* bÀÏ.rîó~dìC®.ŸX */
- $"94DC E128 91EC BAA2 DADD 57A7 D5F7 1972" /* ”Üá(‘캢ÚÝW§Õ÷.r */
- $"7543 9A9A 0DB3 C3FD 42E0 19A3 8F45 7FDF" /* uCšš.³ÃýBà.£E.ß */
- $"CEB1 A7E5 8A09 5B4A F9E6 294B C5DC 80C9" /* α§åŠÆ[Jùæ)KÅÜ€É */
- $"9AEE 0729 374F 04FD 79D6 7170 D940 14F0" /* šî.)7O.ýyÖqpÙ@.ð */
- $"830F 0B71 50E7 3C76 97AF 0F71 A32D DC5A" /* ƒ..qPç<v—¯.q£-ÜZ */
- $"28A9 FE90 6CC0 9484 30D1 FCCD 4991 0758" /* (©þlÀ”„0ÑüÍI‘.X */
- $"BE36 B1DE 3A2E B6F8 2756 C568 2A7F D038" /* ¾6±Þ:.¶ø'VÅh*.Ð8 */
- $"2397 6E8F 32E0 C1AC 3736 32A3 C18E 13C4" /* #—n2àÁ¬762£ÁŽ.Ä */
- $"D298 8703 F9AF E24B A630 0627 6E63 ED70" /* Ò˜‡.ù¯âK¦0.'ncíp */
- $"0662 A833 6515 7225 C79D 8C1F 7410 45BF" /* .b¨3e.r%ÇŒ.t.E¿ */
- $"5019 F088 7C6C 43FC AE88 B794 5847 505F" /* P.ðˆ|lCü®ˆ·”XGP_ */
- $"2B73 6E58 E20E 18A2 01B4 DF7F F5BD D4BC" /* +snXâ..¢.´ß.õ½Ô¼ */
- $"B259 706B 754E 9740 BBF2 54FC FCB8 B293" /* ²YpkuN—@»òTüü¸²“ */
- $"4CEA 3670 D04B 8C42 B7C2 314D 1F53 956B" /* Lê6pÐKŒB·Â1M.S•k */
- $"CB14 9D05 8288 E7F0 D4FF 70AE EFB7 A10B" /* Ë..‚ˆçðÔÿp®ï·¡. */
- $"EDDE 3CFE 1B9D 7DBA 7B7D BD13 DF6F 45B8" /* íÞ<þ.}º{}½.ßoE¸ */
- $"FE1A 077D B444 FAB6 46FB 75FC E8AB DECC" /* þ..}´Dú¶Fûuüè«ÞÌ */
- $"AF0D 6C8A C695 8734 8A7A 5A21 F65D 05F6" /* ¯.lŠÆ•‡4ŠzZ!ö].ö */
- $"A417 27AC 998E 3646 07A8 0055 19DC B524" /* ¤.'¬™Ž6F.¨.U.ܵ$ */
- $"D2F2 842C DF9F BECA C26B C9C9 D0FD CA3B" /* Òò„,ߟ¾ÊÂkÉÉÐýÊ; */
- $"DB1B 3F81 F6A7 4465 001E 5552 4D0D 3BF3" /* Û.?ö§De..URM.;ó */
- $"0140 A2E9 7D63 8456 F9C7 665D F7FC 2DBF" /* .@¢é}c„VùÇf]÷ü-¿ */
- $"1B41 0667 7939 1B16 4997 5584 3CFE 81B9" /* .A.gy9..I—U„<þ¹ */
- $"C4A8 B346 EC6D E726 2560 5CB8 8B84 7699" /* Ĩ³Fìmç&%`\¸‹„v™ */
- $"3999 2CA0 91D9 A05A C96C 660C 267B 74A0" /* 9™, ‘Ù ZÉlf.&{t  */
- $"B935 73EB D464 D860 2694 7584 A4D4 DC52" /* ¹5sëÔdØ`&”u„¤ÔÜR */
- $"D136 D49A 1BEA 53F5 AE2F C19E 44E9 BA0A" /* Ñ6Ôš.êSõ®/ÁžDéºÂ */
- $"5D83 6587 7792 3DCB 449A B33E 4632 A395" /* ]ƒe‡w’=ËDš³>F2£• */
- $"57A3 0EC0 B3A3 969D 9DF0 6ACC 859F FF7F" /* W£.À³£–ðjÌ…Ÿÿ. */
- $"FF27 DAA0 AF8E 216C E5D8 874A 530F 555E" /* ÿ'Ú ¯Ž!lå؇JS.U^ */
- $"AF3F E231 5BAF F7B6 8E73 5742 2717 4031" /* ¯?â1[¯÷¶ŽsWB'.@1 */
- $"175D 5FDA F402 B756 AEAE 7E7E BFEE CE68" /* .]_Úô.·V®®~~¿îÎh */
- $"7878 870D 01C2 C2A4 61D5 64E3 E195 B914" /* xx‡..¤aÕdãᕹ. */
- $"A45F FF52 DC14 F5E9 E037 65E3 5477 62A5" /* ¤_ÿRÜ.õéà7eãTwb¥ */
- $"3EEC CA32 6558 5965 8B6E 3F13 9DB2 1361" /* >ìÊ2eXYe‹n?.².a */
- $"8426 9FD7 B329 4E75 FF1D 9B78 9735 4B1B" /* „&Ÿ×³)Nuÿ.›x—5K. */
- $"D80E 1781 192F 6777 8F94 F6A2 5016 726D" /* Ø.../gw”ö¢P.rm */
- $"1E0D D2CB 6F87 B3C6 09A2 1FE3 915E 8943" /* ..ÒËo‡³ÆÆ¢.ã‘^‰C */
- $"FE6C 6743 4733 D5BC A9DD 5338 C9E1 AF50" /* þlgCG3Õ¼©ÝS8Éá¯P */
- $"3634 C26C 0C1F 94E7 50B2 4310 DD62 4F09" /* 64Âl..”çP²C.ÝbOÆ */
- $"ABCD 7821 8B7B 7B87 2EEA 25A1 9D3C 55CC" /* «Íx!‹{{‡.ê%¡<UÌ */
- $"0644 1B14 3456 2E32 C013 815C 66C7 0526" /* .D..4V.2À.\fÇ.& */
- $"E24D CE15 B8FB 5D8B 0506 E30A 1D6A E2ED" /* âMÎ.¸û]‹..ãÂ.jâí */
- $"6145 D124 0EC9 1FAB 4E50 06C2 9DA5 8F6C" /* aEÑ$.É.«NP.Â¥l */
- $"C072 D11E BFEE DFE6 F6C7 12F4 E89C 35B7" /* ÀrÑ.¿îßæöÇ.ôèœ5· */
- $"097E 2E25 393F CEA3 03C6 D3C7 DED5 3882" /* Æ~.%9?Σ.ÆÓÇÞÕ8‚ */
- $"ED26 A3FD 9130 95B5 F3FA D31A 691F 8E09" /* í&£ý‘0•µóúÓ.i.ŽÆ */
- $"BFA8 7D7B 85BD B179 5C20 2855 1268 F9AF" /* ¿¨}{…½±y\ (U.hù¯ */
- $"553D 939E 6FC6 C67E 4611 F88C BBD4 773C" /* U=“žoÆÆ~F.øŒ»Ôw< */
- $"5F16 D598 D5C5 E649 B66E FD8D A2D7 9807" /* _.Õ˜ÕÅæI¶ný¢×˜. */
- $"EDA2 4621 2CF5 DDE3 C078 6455 1C29 3A07" /* í¢F!,õÝãÀxdU.):. */
- $"E992 C5DE 8D33 041B 83C6 56F6 7C95 168E" /* é’ÅÞ3..ƒÆVö|•.Ž */
- $"6127 40D2 DE11 CFF2 3379 DC22 20E3 5E1B" /* a'@ÒÞ.Ïò3yÜ" ã^. */
- $"DE83 DBB5 5B8A 8572 3DF2 2890 DC56 BE6E" /* ÞƒÛµ[Š…r=ò(ÜV¾n */
- $"D15F 9396 ECD4 725F 2E18 7616 394A 64C3" /* Ñ_“–ìÔr_..v.9Jdà */
- $"FDAA E6F2 3D6D 46BC B270 5B8F ACB4 9CAE" /* ýªæò=mF¼²p[¬´œ® */
- $"0D0D 3F29 6A02 1E92 347A E406 A52D 111A" /* ..?)j..’4zä.¥-.. */
- $"2E79 0340 1D82 C861 0C40 1963 3397 A4FD" /* .y.@.‚Èa.@.c3—¤ý */
- $"A998 0B63 E30A 7AA3 A5BC 8A8E 9CD0 4795" /* ©˜.cãÂz£¥¼ŠŽœÐG• */
- $"7538 7FB2 EC9A 952C CE29 C80F 369C 4E8D" /* u8.²ìš•,Î)È.6œN */
- $"8000 1C55 D5F3 E2AD 812E 4FAA AC2C D9BB" /* €..UÕóâ­.Oª¬,Ù» */
- $"F4CD 5568 5643 826F 3A38 91BD 6F70 92D3" /* ôÍUhVC‚o:8‘½op’Ó */
- $"23EC DB91 0FC4 C3BB 7542 023B 85F0 36C3" /* #ìÛ‘.ÄûuB.;…ð6à */
- $"8BF6 F6F8 4E77 EEE5 851F 219A CF99 7D9E" /* ‹ööøNwîå….!šÏ™}ž */
- $"856D A687 BC63 8E39 0407 B007 D184 10BD" /* …m¦‡¼cŽ9..°.Ñ„.½ */
- $"D9EF ACB1 B75A 46FA F95E 42DF 377B E2F7" /* Ùבּ·ZFúù^Bß7{â÷ */
- $"BEF2 357A 861C F486 B3F7 57E1 D39B 095B" /* ¾ò5z†.ô†³÷WáÓ›Æ[ */
- $"40C0 925C 0CA1 7885 CFEA 48B7 33E9 E8DE" /* @À’\.¡x…ÏêH·3éèÞ */
- $"D178 1E15 91D1 F6C5 BC87 CB7E CCC6 DEDE" /* Ñx..‘Ñöż‡Ë~ÌÆÞÞ */
- $"B017 A4C1 0B0F DD17 660E CB97 C098 C773" /* °.¤Á..Ý.f.Ë—À˜Çs */
- $"8A0A F4DB 59BD A218 055E 5348 05D8 B304" /* ŠÂôÛY½¢..^SH.س. */
- $"9F23 E1B1 0754 6DA2 FF33 34CB 2B12 7114" /* Ÿ#á±.Tm¢ÿ34Ë+.q. */
- $"62D2 4CA8 8091 CD34 8467 2752 B77A AA5B" /* bÒL¨€‘Í4„g'R·zª[ */
- $"15FC 2E56 7A29 9351 B6A4 AEE5 B56D 354D" /* .ü.Vz)“Q¶¤®åµm5M */
- $"3ED2 FA71 25E9 F887 B187 BADB B11B 2E01" /* >Òúq%éø‡±‡ºÛ±... */
- $"93B3 4206 45ED 7238 3F80 1441 50CA CCBA" /* “³B.Eír8?€.APÊ̺ */
- $"EF59 3BC5 4236 2ABF 9150 7335 49C5 0216" /* ïY;ÅB6*¿‘Ps5IÅ.. */
- $"F97B D5A5 1EF5 A69D 8B34 C25B 73E1 DA52" /* ù{Õ¥.õ¦‹4Â[sáÚR */
- $"79E5 9EB1 9CB1 0952 B3F5 E221 D426 4759" /* yåž±œ±ÆR³õâ!Ô&GY */
- $"D5CF 2D18 CC2A 270A 859D F10C 8108 52FF" /* ÕÏ-.Ì*'Â…ñ..Rÿ */
- $"2A7D D39E EFFD 568C 2DB3 7BD5 62D0 2403" /* *}ÓžïýVŒ-³{ÕbÐ$. */
- $"69D1 A4B6 2D24 E485 973D F6A5 E6DC 1DB5" /* iѤ¶-$ä…—=ö¥æÜ.µ */
- $"BF0B E185 5592 E3A0 6046 E050 5151 9546" /* ¿.á…U’ã `FàPQQ•F */
- $"17F7 0CF6 222F 17E0 40E5 3EF5 74EE BAB6" /* .÷.ö"/.à@å>õt */
- $"55BD 76C1 DD80 39C8 BAE0 37B8 398A B370" /* U½vÁÝ€9Ⱥà7¸9Š³p */
- $"D400 0C29 5DC9 94FF 069B 36E2 CD79 195F" /* Ô..)]É”ÿ.›6âÍy._ */
- $"5B9B 1237 1F18 C560 C901 F9A4 184B 7570" /* [›.7..Å`É.ù¤.Kup */
- $"433E 75BE 0297 C641 7D9B 7092 8D64 96F5" /* C>u¾.—ÆA}›p’d–õ */
- $"D70C 9B66 71D3 09B1 F635 0FC3 0B49 7D6E" /* ×.›fqÓƱö5.Ã.I}n */
- $"660C 8E1D 0257 672B 97EE C2A5 7B84 729E" /* f.Ž..Wg+—îÂ¥{„rž */
- $"6516 585E 354F 2E22 88A7 A515 B945 3745" /* e.X^5O."ˆ§¥.¹E7E */
- $"F6A5 5CB2 E212 10AD AB6F 07F5 FDA3 09EB" /* ö¥\²â..­«o.õý£Æë */
- $"A053 313B 9A8E 757D E132 D483 DC78 0882" /*  S1;šŽu}á2ÔƒÜx.‚ */
- $"A63C 95E0 036C 4626 F66B 5F6C 39A1 9401" /* ¦<•à.lF&ök_l9¡”. */
- $"7276 4DCE 4487 7D8C 12A3 B713 9139 AC0A" /* rvMÎD‡}Œ.£·.‘9¬Â */
- $"18AD 4DFD 2A3D 69E7 E76E 593C 8DAB FD56" /* .­Mý*=iççnY<«ýV */
- $"F959 BA6B FBA3 2853 D610 4DB0 7A30 3A09" /* ùYºkû£(SÖ.M°z0:Æ */
- $"916B DFF7 B3B4 F8D3 9619 0FD9 8FBC FC6B" /* ‘kß÷³´øÓ–..Ù¼ük */
- $"D73D ABD2 4C41 6AD0 6584 AF19 3074 AF6E" /* ×=«ÒLAjÐe„¯.0t¯n */
- $"369C BEB1 76D5 D311 6172 F157 D522 DDED" /* 6œ¾±vÕÓ.arñWÕ"Ýí */
- $"D4ED 0230 0BB5 E881 0E6B 9C4F 111F 4F6E" /* Ôí.0.µè.kœO..On */
- $"7CAD 4745 7BBF DA70 A9C4 051E FDEA 206C" /* |­GE{¿Úp©Ä..ýê l */
- $"9983 0E2D 4A4A A4DE 82E9 DAAF 5748 37AE" /* ™ƒ.-JJ¤Þ‚éÚ¯WH7® */
- $"4046 DCCB 0D1A 80DA 1804 20E2 F7CF AD69" /* @FÜË..€Ú.. â÷Ï­i */
- $"F9D8 5106 D02D 16E9 4437 9560 B618 1126" /* ùØQ.Ð-.éD7•`¶..& */
- $"95A2 4B23 89C4 78EE 898E D80C 8E49 5201" /* •¢K#‰ÄxØ.ŽIR. */
- $"2095 ABAF 9CA5 0F8E CB22 00D4 4289 59B3" /* •«¯œ¥.ŽË".ÔB‰Y³ */
- $"1835 1395 8AE5 3A88 7185 E7DD 57F3 4CE4" /* .5.•Šå:ˆq…çÝWóLä */
- $"1465 C878 6B72 7146 2AF1 F053 5B31 7697" /* .eÈxkrqF*ñðS[1v— */
- $"7300 A777 3919 099E BD1C 79C3 24C4 A355" /* s.§w9.Æž½.yÃ$Ä£U */
- $"0C88 C727 1831 D498 E513 47A5 F25F DDBE" /* .ˆÇ'.1Ô˜å.G¥ò_ݾ */
- $"46E7 40B5 EBCC 080F 6915 3FDF EDB9 A9B1" /* Fç@µëÌ..i.?ßí¹©± */
- $"39ED D794 60E1 A5A2 0EEC 7A09 46BF 201E" /* 9í×”`ᥢ.ìzÆF¿ . */
- $"311F EEEE 88EF C6C1 C10D E238 50C9 7F01" /* 1.îîˆïÆÁÁ.â8PÉ.. */
- $"DFF1 17BA D8F4 0017 47E7 75F2 4D82 679E" /* ßñ.ºØô..GçuòM‚gž */
- $"6867 60A4 6222 77B9 319B 186D FCB3 168A" /* hg`¤b"w¹1›.mü³.Š */
- $"EAF3 C227 1082 D7ED 2C70 E619 8676 0186" /* êóÂ'.‚×í,pæ.†v.† */
- $"8C23 5DE5 D4A0 61CB CDE4 AED5 E008 6F3C" /* Œ#]åÔ aËÍä®Õà.o< */
- $"D894 AC14 6FEC 5D4C C2FF 3A6C 512F E475" /* Ø”¬.oì]LÂÿ:lQ/äu */
- $"FCB8 DFA4 EB46 2DF4 E133 5858 364B 54E1" /* ü¸ß¤ëF-ôá3XX6KTá */
- $"A6E1 5D0C 157E D987 DF95 B1FB 3723 4F2F" /* ¦á]..~هߕ±û7#O/ */
- $"C9BF C6D4 D979 412E D0EB B285 8DFF 7CAC" /* É¿ÆÔÙyA.Ðë²…ÿ|¬ */
- $"F1BF 1825 8B89 9992 3848 C666 4184 4906" /* ñ¿.%‹‰™’8HÆfA„I. */
- $"0D61 6B58 9355 A5D9 C940 B6F2 6918 82E1" /* .akX“U¥ÙÉ@¶òi.‚á */
- $"FF7D 4F5F FE94 5208 650B B780 0D2B DD4F" /* ÿ}O_þ”R.e.·€.+ÝO */
- $"5874 3627 2353 6328 06B9 908C 6C95 D898" /* Xt6'#Sc(.¹Œl•Ø˜ */
- $"8C24 1D0F 641B 7763 CFBE E88A BB05 8639" /* Œ$..d.wcϾ芻.†9 */
- $"D91C 4A38 3A3F 75C6 61BD BFED CA10 2A73" /* Ù.J8:?uÆa½¿íÊ.*s */
- $"E3C5 E85C BF5B 0346 2105 4286 300D D812" /* ãÅè\¿[.F!.B†0.Ø. */
- $"8BE4 DAE4 292B A765 338E 7E42 50F1 8046" /* ‹äÚä)+§e3Ž~BPñ€F */
- $"3FDC 1A85 4616 61E5 7321 18D9 5AB9 8903" /* ?Ü.…F.aås!.ÙZ¹‰. */
- $"90BD 6F89 E7D0 35D1 0AA3 BBAE 3CF8 A7B7" /* ½o‰çÐ5Ñ£»®<ø§· */
- $"73C8 8B94 B409 16EC 60A6 E819 BCA7 BA66" /* sÈ‹”´Æ.ì`¦è.¼§ºf */
- $"2245 524C 718C 635D E4F7 ACA0 02C3 E0A7" /* "ERLqŒc]ä÷¬ .Ãৠ*/
- $"B542 0FF5 7029 FF4D 1D88 E3B3 D657 802B" /* µB.õp)ÿM.ˆã³ÖW€+ */
- $"8068 9BD4 B17F 9A6B CC1C 4B53 246F 81E5" /* €h›Ô±.škÌ.KS$oå */
- $"9168 48EC 4B44 3FFF 7B8B 5777 5677 134E" /* ‘hHìKD?ÿ{‹WwVw.N */
- $"1B8E 8C91 429F CE85 86EF 62B4 71AF EAE7" /* .ŽŒ‘BŸÎ…†ïb´q¯êç */
- $"E333 7BD3 2825 7230 C950 0000 1B8D 8BA6" /* ã3{Ó(%r0ÉP...‹¦ */
- $"04C1 56DC 30F0 619E DD6C D196 C91E 1ED4" /* .ÁVÜ0ðažÝlÑ–É..Ô */
- $"1285 94A8 F775 05A9 3440 78FF 7E52 8833" /* .…”¨÷u.©4@xÿ~Rˆ3 */
- $"E8A1 A4E4 4580 38DD ADE1 3BD5 AD19 74E6" /* 衤äE€8Ý­á;Õ­.tæ */
- $"EEA1 B4B1 0B0B 9BE9 08EC DB78 E6AA 37E5" /* î¡´±..›é.ìÛxæª7å */
- $"AD06 72A6 51FC 0004 4737 BF1A 89FF 7E11" /* ­.r¦Qü..G7¿.‰ÿ~. */
- $"0A68 EAD7 BDA5 4D5B 2C8D 0C7A 952E 2190" /* Âhê×½¥M[,.z•.! */
- $"8451 1B38 CEFD 2835 5ADD BDA2 01C2 A3D6" /* „Q.8Îý(5Zݽ¢.壅 */
- $"6046 4BD8 41DF D8B6 D9B1 1F96 5FF8 CC56" /* `FKØAßضٱ.–_øÌV */
- $"A63B 6E14 5035 26D6 946D 1F59 4D17 5507" /* ¦;n.P5&Ö”m.YM.U. */
- $"85F7 2DAF A737 4E30 9097 2E2E DAF8 37D1" /* …÷-¯§7N0—..Úø7Ñ */
- $"D987 4E59 ABFD CDF3 AAC3 30D1 8616 FAB3" /* Ù‡NY«ýÍóªÃ0ц.ú³ */
- $"2914 92AA 6913 C36F 66DA 4B0B 18FE DD55" /* ).’ªi.ÃofÚK..þÝU */
- $"1D2A 3F00 D80C 2423 D923 95C6 E11D 0069" /* .*?.Ø.$#Ù#•Æá..i */
- $"B5C9 0803 0907 B950 13DF 48EC F794 3D36" /* µÉ..Æ.¹P.ßHì÷”=6 */
- $"5249 2492 4924 9249 2489 9EF6 DC36 9A6B" /* RI$’I$’I$‰žöÜ6šk */
- $"1751 415E A37F 47EC A4EA 67AC A222 733C" /* .QA^£.Gì¤êg¬¢"s< */
- $"467D 1FFE C727 E6AA 6E99 C584 A87E DFFF" /* F}.þÇ'æªn™Å„¨~ßÿ */
- $"7FC3 7592 8204 71A2 6088 C38B 6E65 868E" /* .Ãu’‚.q¢`ˆÃ‹ne†Ž */
- $"5A3F FF7F F919 4069 CF10 A302 5125 525C" /* Z?ÿ.ù.@iÏ.£.Q%R\ */
- $"A443 88AF 4104 7807 1410 84BA E955 76E8" /* ¤Cˆ¯A.x...„ºéUvè */
- $"5F35 B612 A668 5694 9249 2492 4924 9249" /* _5¶.¦hV”’I$’I$’I */
- $"2492 4924 4C25 1941 A4EB 1996 7A28 19C1" /* $’I$L%.A¤ë.–z(.Á */
- $"A1B0 01D7 ACB2 3F83 42DC D154 27C9 F11F" /* ¡°.׬²?ƒBÜÑT'Éñ. */
- $"FC46 90B1 89C4 F78A 4C6F 5C2A 833D 8425" /* üF±‰Ä÷ŠLo\*ƒ=„% */
- $"D837 CA14 E4C7 7F8A 9833 99B7 E589 1376" /* Ø7Ê.äÇ.Š˜3™·å‰.v */
- $"C867 FF1D 200A 4C9B 624E 68E3 11AE C8AF" /* Ègÿ. ÂL›bNhã.®È¯ */
- $"1723 C741 CEAC 16CE C548 72FF 15CD 3E67" /* .#ÇAά.ÎÅHrÿ.Í>g */
- $"AF2C 323F 0FD0 6752 4973 55BD CC10 05B4" /* ¯,2?.ÐgRIsU½Ì..´ */
- $"AB3F 9302 00C3 EE70 1BA4 B650 FAB2 5821" /* «?“..Ãîp.¤¶Pú²X! */
- $"3856 3872 1B02 7D70 F1F9 0B28 A9DC CAE7" /* 8V8r..}pñù.(©ÜÊç */
- $"D9E7 6252 A768 A7DE 0FB1 FCB1 F54B 98C4" /* ÙçbR§h§Þ.±ü±õK˜Ä */
- $"7B6E 5E24 BC53 F945 741F 66A0 A51E EE5A" /* {n^$¼SùEt.f ¥.îZ */
- $"2A0D B951 4EEE A88B 4F2F C326 F326 1D12" /* *.¹QNO/Ã&ó&.. */
- $"524A 9E48 CC53 44EF C54F 1737 8505 46CF" /* RJžHÌSDïÅO.7….FÏ */
- $"351E 4354 05C7 C832 2A7D 8899 D009 E617" /* 5.CT.ÇÈ2*}ˆ™ÐÆæ. */
- $"0334 305D 9497 D845 E6D3 2CD2 178F 1316" /* .40]”—ØEæÓ,Ò... */
- $"65AD 239E 2ED5 ECCB 402A E728 09B5 E847" /* e­#ž.ÕìË@*ç(ƵèG */
- $"65BD 3F31 CAC5 F9D8 6606 B8AF 4F84 89FE" /* e½?1ÊÅùØf.¸¯O„‰þ */
- $"9004 4730 30BC E58F 5FB3 38CF 36B9 38FC" /* .G00¼å_³8Ï6¹8ü */
- $"FB9D 07EA D13F 9DB9 7185 0E88 0E3B 06E5" /* û.êÑ?¹q….ˆ.;.å */
- $"D476 CFCA 1587 3067 9257 B5DF 1E83 E7FF" /* ÔvÏÊ.‡0g’Wµß.ƒçÿ */
- $"7FFF 7FFF 0E68 E181 AC15 B980 2AFB 1D80" /* .ÿ.ÿ.há¬.¹€*û.€ */
- $"C5BB A88D E36A 4DC5 94CF 6DB2 0694 F977" /* Å»¨ãjMÅ”Ïm².”ùw */
- $"D708 02D1 F380 6773 016A CA84 3B1C 6A33" /* ×..Ñó€gs.jÊ„;.j3 */
- $"5AAC BA2D FEC5 7542 51FC 68D0 CDDD EA44" /* Z¬º-þÅuBQühÐÍÝêD */
- $"788E 2F96 D80C F159 FF45 3316 1494 A7F5" /* xŽ/–Ø.ñYÿE3..”§õ */
- $"98B4 FC39 0062 D59B 52A6 32CB F97C ABD6" /* ˜´ü9.bÕ›R¦2Ëù|«Ö */
- $"42AE AE46 6AA7 D986 0A4E DCDD 717E 8B7C" /* B®®Fj§Ù†ÂNÜÝq~‹| */
- $"8FB8 B396 65A6 83FF 6A4A A5C1 597F 70AF" /* ¸³–e¦ƒÿjJ¥ÁY.p¯ */
- $"DC96 E2EC 0C1D 7A00 3428 2C60 DE32 8DB8" /* Ü–âì..z.4(,`Þ2¸ */
- $"1604 C249 5E82 1F5B 6C23 E562 B2D4 754E" /* ..ÂI^‚.[l#åb²ÔuN */
- $"7F73 442A 25D3 C42A 6A6D 5D09 0E8C 2E67" /* .sD*%ÓÄ*jm]Æ.Œ.g */
- $"95EC 08FE B505 8B5A A4A8 0000 0000 0000" /* •ì.þµ.‹Z¤¨...... */
- $"0000 0000 6121 26B3 27C3 AEC0 FF52 2FEE" /* ....a!&³'îÀÿR/î */
- $"D4F3 92BB 06E2 ABE4 35DC A278 9084 B2F0" /* Ôó’».â«ä5Ü¢x„²ð */
- $"EE1A ADB2 F770 3D4E 120A FD01 B042 CD00" /* î.­²÷p=N.Âý.°BÍ. */
- $"B9C2 B661 40B0 E5FC DC59 59F0 61C5 53A7" /* ¹Â¶a@°åüÜYYðaÅS§ */
- $"7AC1 7EDC 77B7 1C84 0F9A E321 389C E693" /* zÁ~Üw·.„.šã!8œæ“ */
- $"AC98 5160 DDD0 C9A9 BE17 ED52 A10A 300C" /* ¬˜Q`ÝÐÉ©¾.íR¡Â0. */
- $"88ED BB5A 80DA C23B 1196 0C7C 6BA8 D4EA" /* ˆí»Z€ÚÂ;.–.|k¨Ôê */
- $"4FAB 08A9 EBE3 1CC9 6782 F6A9 85A4 1829" /* O«.©ëã.Ég‚ö©…¤.) */
- $"48BB D188 41E8 65BA 28BB 8AC1 8368 DC2F" /* H»ÑˆAèeº(»ŠÁƒhÜ/ */
- $"B2DE 61FE 95C0 BD88 C027 9CD9 3819 8A81" /* ²Þaþ•À½ˆÀ'œÙ8.Š */
- $"20FF 616C DEAE C6EA 15A3 D12F 764A B4E2" /* ÿalÞ®Æê.£Ñ/vJ´â */
- $"ECA3 AF32 36FF 29B0 E3CD 5046 527E 39B7" /* 죯26ÿ)°ãÍPFR~9· */
- $"921A ABF8 F0CB 7040 5FCD A182 4C57 986D" /* ’.«øðËp@_Í¡‚LW˜m */
- $"1115 DD94 687C 3663 7CFB 6C40 642D C8CA" /* ..Ý”h|6c|ûl@d-ÈÊ */
- $"1117 B5A9 8025 123D 9406 58F9 96B5 321E" /* ..µ©€%.=”.Xù–µ2. */
- $"7646 4BFD 48DE 0B9B DBEF B79F B6C7 031E" /* vFKýHÞ.›Ûï·Ÿ¶Ç.. */
- $"1D3B 1D18 B35D 2813 5601 3924 6AE1 FC21" /* .;..³](.V.9$jáü! */
- $"60B9 0B9F 6B4B AFB9 15D8 C57A 5345 7461" /* `¹.ŸkK¯¹.ØÅzSEta */
- $"0EF9 4B6B 88D1 7833 02DF 4FB8 DBEC 836A" /* .ùKkˆÑx3.ßO¸Ûìƒj */
- $"BEA7 3972 93C0 F973 37B5 C84F 1655 031C" /* ¾§9r“Àùs7µÈO.U.. */
- $"674D 741E 308E E3BA 6684 5BB0 4506 AB40" /* gMt.0Žãºf„[°E.«@ */
- $"14DE BFF2 9B38 4026 C5C2 3A44 FDFF 25CB" /* .Þ¿ò›8@&ÅÂ:Dýÿ%Ë */
- $"072E 1D99 62E3 22B8 DE8D 9CF1 79FA 1D38" /* ...™bã"¸Þœñyú.8 */
- $"8900 17CB A72B 8124 7EAF CF2F FC8D 34D6" /* ‰..˧+$~¯Ï/ü4Ö */
- $"E0AC 58ED 8BC1 0DAA 7964 FB91 BF08 EFA6" /* à¬Xí‹Á.ªydû‘¿.ï¦ */
- $"42FF 7FFF 7FE3 AF13 7C4B 1CF4 D643 3CD3" /* Bÿ.ÿ.ã¯.|K.ôÖC<Ó */
- $"5F1A 08BB 7C56 5CFB 6D27 04DE C66A 9AF1" /* _..»|V\ûm'.ÞÆjšñ */
- $"2053 D4B2 EE60 44FF 2A89 1FFC DFCC 57C1" /* SÔ²î`Dÿ*‰.üßÌWÁ */
- $"3800 1290 7854 7902 FF7A 9A36 D71E F8D1" /* 8..xTy.ÿzš6×.øÑ */
- $"D439 471B D02F 4A39 E5BC D25F FDF0 8B54" /* Ô9G.Ð/J9å¼Ò_ýð‹T */
- $"AE0A 3677 2625 B286 7DEC 8FF7 2457 2B25" /* ®Â6w&%²†}ì÷$W+% */
- $"C066 2A4E A605 EE16 7244 CCFD D3D3 FDA1" /* Àf*N¦.î.rDÌýÓÓý¡ */
- $"F3B8 76C3 1C5F 491C 0165 8735 D71D 19AD" /* ó¸vÃ._I..e‡5×..­ */
- $"9BB1 A40D E5BA 9D1C E34B B71C 9CF0 EC7A" /* ›±¤.åº.ãK·.œðìz */
- $"5E87 C4F0 A326 0913 9E2C 6517 50A3 E72B" /* ^‡Äð£&Æ.ž,e.P£ç+ */
- $"87FE D348 2E5D 0A00 0000 0000 0000 0000" /* ‡þÓH.]Â......... */
- $"0002 2C86 A73D 4030 2FE4 D32C 2B56 C74C" /* ..,†§=@0/äÓ,+VÇL */
- $"0869 A5C9 151A 69B9 9390 DA50 4411 8FFF" /* .i¥É..i¹“ÚPD.ÿ */
- $"4938 4E36 F9DD 09FB E4A0 C339 2431 ED8B" /* I8N6ùÝÆûä Ã9$1í‹ */
- $"793D 6354 12C0 97F9 C379 ADA9 7DEE E5EF" /* y=cT.À—ùÃy­©}îåï */
- $"2366 FF4F E2A2 F01A C90F 02E3 51CD B477" /* #fÿOâ¢ð.É..ãQÍ´w */
- $"2230 690A B47C E28B 463C 2E88 7579 7943" /* "0i´|â‹F<.ˆuyyC */
- $"5055 6D0A EEC5 F3BF 2404 37D8 EFE1 71AC" /* PUmÂîÅó¿$.7Øïáq¬ */
- $"6AFE A3E4 A7EB 28BF BFFE 4373 E5FF 7E4A" /* jþ£ä§ë(¿¿þCsåÿ~J */
- $"2D5D 1ED3 6D78 1657 9914 A061 7958 972C" /* -].Ómx.W™. ayX—, */
- $"56FB D5B0 1FFD A18B 7A29 0C81 295B DF7C" /* VûÕ°.ý¡‹z).)[ß| */
- $"83E3 CD36 0E66 7E2B D8FA 3096 AA44 7F9B" /* ƒãÍ6.f~+Øú0–ªD.› */
- $"F0B9 EA48 8CC7 0FFF 7E1C F394 CC5B 6A25" /* ð¹êHŒÇ.ÿ~.ó”Ì[j% */
- $"FD4C CECC 630B 38B7 D621 F081 73EE 9D40" /* ýLÎÌc.8·Ö!ðsî@ */
- $"7FAD FADD 8111 6492 599E DD2C 3600 FF6C" /* .­úÝ.d’YžÝ,6.ÿl */
- $"5A8D B0B8 2AE7 668D C5A0 826B FA0D C5B1" /* Z°¸*çfÅ ‚kú.ű */
- $"6873 D749 B533 9627 C2F6 4922 63F7 8944" /* hs×Iµ3–'ÂöI"c÷‰D */
- $"15C5 A1F9 8539 A21A 1CEB 1C2D 7D1B 0516" /* .Å¡ù…9¢..ë.-}... */
- $"FD6C 5D4F 92A3 14D9 126F C5FC 4116 B499" /* ýl]O’£.Ù.oÅüA.´™ */
- $"D878 D889 9123 D3C8 4637 36E3 8644 6F0B" /* Øx؉‘#ÓÈF76ã†Do. */
- $"D2C6 A599 B793 1367 B548 23BD 8836 11E5" /* ÒÆ¥™·“.gµH#½ˆ6.å */
- $"C323 7AD5 0534 3D05 A4E6 70B3 0376 2B0C" /* Ã#zÕ.4=.¤æp³.v+. */
- $"A964 173B F0BC 2A52 7FE4 2A53 85C2 22B2" /* ©d.;ð¼*R.ä*S…Â"² */
- $"B83F 7185 FB4C 3769 5B3E 4A24 E7E1 D0FD" /* ¸?q…ûL7i[>J$çáÐý */
- $"9B17 8737 FE8B E4C7 9FC1 0E30 D904 D0C5" /* ›.‡7þ‹äÇŸÁ.0Ù.ÐÅ */
- $"D2F5 05E4 3CD6 5FA7 B9AF FB98 755E 0BAF" /* Òõ.ä<Ö_§¹¯û˜u^.¯ */
- $"E4EE 408D A8BE 5E58 07A6 059D 1B33 37F3" /* äî@¨¾^X.¦..37ó */
- $"8D14 871A 7FC6 43ED 6A6F 8F41 9681 095E" /* .‡..ÆCíjoA–Æ^ */
- $"EE46 5BA4 1E15 F5F2 3063 E524 A62A 7C7F" /* îF[¤..õò0cå$¦*|. */
- $"0E38 5D00 A378 8F6D 3861 2088 EDD7 AC24" /* .8].£xm8a ˆí׬$ */
- $"D3B6 B052 DE10 357D B65A 1414 4596 8E3D" /* Ó¶°RÞ.5}¶Z..E–Ž= */
- $"97E3 D838 9ACC 3C84 AF82 EA8D 8BD3 0180" /* —ãØ8šÌ<„¯‚ê‹Ó.€ */
- $"1582 0654 BB61 1047 ACA1 29D3 7CFA 00C8" /* .‚.T»a.G¬¡)Ó|ú.È */
- $"BABC 146B 250C 8D19 8A4E A8B3 50D6 B986" /* º¼.k%..ŠN¨³PÖ¹† */
- $"2AD6 CEFA 02D6 AE11 FF7C B0A2 E6E0 30E9" /* *ÖÎú.Ö®.ÿ|°¢æà0é */
- $"D904 4C03 3BC1 8B68 5892 30B8 7D69 C2D6" /* Ù.L.;Á‹hX’0¸}iÂÖ */
- $"A9F8 56A2 7417 1E31 186F 09A1 4C11 6DCA" /* ©øV¢t..1.oÆ¡L.mÊ */
- $"A62E 5FCC F59A CCE8 6A29 B0DF E2BC E8BF" /* ¦._ÌõšÌèj)°ßâ¼è¿ */
- $"92DF 70C1 8B09 21DF 1440 1684 4413 2A60" /* ’ßpÁ‹Æ!ß.@.„D.*` */
- $"E033 6D92 8573 E63C 2746 6F40 D8F0 D0C9" /* à3m’…sæ<'Fo@ØðÐÉ */
- $"10AF 85A2 CFBF 373B B250 85E4 C1D3 85D2" /* .¯…¢Ï¿7;²P…äÁÓ…Ò */
- $"E167 1222 DF4A 67D9 B3D6 55B4 B047 8675" /* ág."ßJgÙ³ÖU´°G†u */
- $"C803 6AE5 E5AE AF92 C4B7 591A A040 98AC" /* È.jå宯’Ä·Y. @˜¬ */
- $"4412 45F8 BBC8 6482 F7BD 81B2 98FE 9D0B" /* D.Eø»Èd‚÷½²˜þ. */
- $"DAB1 2959 952C 9115 3504 9A24 BBA4 A04C" /* Ú±)Y•,‘.5.š$»¤ L */
- $"4125 5810 54F5 C268 63C2 1DB9 11CF 85BB" /* A%X.TõÂhcÂ.¹.Ï…» */
- $"D941 F5A1 0239 DED3 856D BBE5 7CF3 49C3" /* ÙAõ¡.9ÞÓ…m»å|óIà */
- $"C9CF 1BD1 A953 F58A F9AF E704 E70E 43B7" /* ÉÏ.Ñ©SõŠù¯ç.ç.C· */
- $"2B51 BE14 4FF3 262C 914B 90AF F2A9 E060" /* +Q¾.Oó&,‘K¯ò©à` */
- $"6A24 6553 B776 C48D 19AD ECD3 2DD3 8ECF" /* j$eS·vÄ.­ìÓ-ÓŽÏ */
- $"9EC7 8A0D 97F4 3C69 6E56 0881 1136 C147" /* žÇŠ.—ô<inV..6ÁG */
- $"E7D3 6FE5 A0C6 D7DC BCB0 76AC C4F8 DD65" /* çÓoå Æ×ܼ°v¬ÄøÝe */
- $"A5F9 02BF 2BFD 9A2C 354D 24C2 E088 6B63" /* ¥ù.¿+ýš,5M$Âàˆkc */
- $"E514 C014 E8F4 F5C2 B529 74FB EC02 032B" /* å.À.èôõµ)tûì..+ */
- $"A54B 696E B602 7D58 4542 824D BD8C 40FA" /* ¥Kin¶.}XEB‚M½Œ@ú */
- $"F675 5CD4 71C9 058E 7062 0E1B 10CC 72A9" /* öu\ÔqÉ.Žpb...Ìr© */
- $"95B8 C5FD 7EAF 995C 62ED DDE4 6579 3181" /* •¸Åý~¯™\bíÝäey1 */
- $"8BA1 A02B 1559 F5BC E9C9 914D 8CEB D7D8" /* ‹¡ +.Yõ¼éÉ‘MŒë×Ø */
- $"7D81 20C0 A609 18D2 B679 7C08 FB00 E4C6" /* } À¦Æ.Ò¶y|.û.äÆ */
- $"2797 518E 32CE 67CE 3C8E 6796 A832 F712" /* '—QŽ2ÎgÎ<Žg–¨2÷. */
- $"0037 059C 96CD 85A0 98E6 5D20 05F2 EC61" /* .7.œ–Í… ˜æ] .òìa */
- $"335D AFFF 14BC 3EF9 0779 7A53 BAA4 F47A" /* 3]¯ÿ.¼>ù.yzSº¤ôz */
- $"6926 DAD2 72F9 5D4B 1014 8BD5 A4FA 68EA" /* i&ÚÒrù]K..‹Õ¤úhê */
- $"D9F9 F684 BFD5 F2ED FB9E 4C18 91C3 FF17" /* Ùùö„¿ÕòíûžL.‘Ãÿ. */
- $"2D17 D99A DE29 FE6E 63A4 C901 8642 9357" /* -.ÙšÞ)þnc¤É.†B“W */
- $"3120 4386 1938 E7D2 572D 0C59 E3C9 7FED" /* 1 C†.8çÒW-.YãÉ.í */
- $"30FA E54A CEF8 A94C F92D AF19 76EA 3372" /* 0úåJÎø©Lù-¯.vê3r */
- $"B4E1 E7C5 8239 A4AC A247 4838 55E8 EB9B" /* ´áçÅ‚9¤¬¢GH8Uèë› */
- $"DE7D 94E9 DBD7 07FB D488 1672 E61D 9E4C" /* Þ}”éÛ×.ûÔˆ.ræ.žL */
- $"6DF2 97D5 4936 F89A 5CBC D37A 8C2C F7ED" /* mò—ÕI6øš\¼ÓzŒ,÷í */
- $"9755 19F2 0350 AB2E D851 F0B7 78B5 9770" /* —U.ò.P«.ØQð·xµ—p */
- $"4DF3 4212 9C9C CA3B 403A BA7B D497 9410" /* MóB.œœÊ;@:º{Ô—”. */
- $"04C6 288B 5058 5DC9 EB79 AB85 622C 9A55" /* .Æ(‹PX]Éëy«…b,šU */
- $"2DA7 C113 9315 7CAE D84E 6B50 4062 AE94" /* -§Á.“.|®ØNkP@b®” */
- $"8F5E 7969 4BA5 56B2 E881 8C02 ED3B 5259" /* ^yiK¥V²èŒ.í;RY */
- $"24CE C98A 4348 12B1 314F E3E3 B6A3 4E61" /* $ÎÉŠCH.±1Oã㶣Na */
- $"A426 6350 E380 B0B5 DEFF 64CF 72D6 D4B9" /* ¤&cP〰µÞÿdÏrÖÔ¹ */
- $"907C 9BE0 7E4D 39F9 2BB7 C3DE D7C3 DCD8" /* |›à~M9ù+·ÃÞ×ÃÜØ */
- $"1F93 775F 0F44 DF0F A717 C3E9 D603 F269" /* .“w_.Dß.§.ÃéÖ.òi */
- $"FBE1 D36F 87B3 6F87 B280 E8AB DECC AF0D" /* ûáÓo‡³o‡²€è«Þ̯. */
- $"6C8A C695 8734 87EB A75F 5130 05EC 9BA8" /* lŠÆ•‡4‡ë§_Q0.웨 */
- $"78DB 85A2 680C 75A0 EDD1 4AA2 7E1B BAFF" /* xÛ…¢h.u íÑJ¢~.ºÿ */
- $"5AFC FD6C 3E36 A6D9 923A 2DCE 24BC 35EF" /* Züýl>6¦Ù’:-Î$¼5ï */
- $"27F4 8813 7CC4 0141 3CD9 9568 BFE6 BBB3" /* 'ôˆ.|Ä.A<Ù•h¿æ»³ */
- $"219B 0442 5227 3796 635D 0DE7 499A A701" /* !›.BR'7–c].çIš§. */
- $"7F74 FB13 F9DF E737 08AB 0A91 3D9E B77D" /* .tû.ùßç7.«Â‘=ž·} */
- $"E616 57BB 8BAF 7A0D 1B28 42E6 D653 6BD3" /* æ.W»‹¯z..(BæÖSkÓ */
- $"D7A8 9A2B 0905 6198 8809 E5D0 D0A4 F589" /* רš+Æ.a˜ˆÆåÐФõ‰ */
- $"3D04 8161 C4CB 7BC9 96E2 9DA4 1C59 C982" /* =.aÄË{É–â¤.YÉ‚ */
- $"4705 B1BE 1E05 E391 5E89 43FE 6C67 4342" /* G.±¾..ã‘^‰CþlgCB */
- $"636F 80C5 6A98 16E6 6B80 27C8 D0D9 B28C" /* co€Åj˜.æk€'ÈÐÙ²Œ */
- $"6FD4 E109 61AB 8FCB D4CB 19ED 2BE7 B510" /* oÔáÆa«ËÔË.í+çµ. */
- $"C0E8 5883 0642 92A1 6094 7E45 5D3F 819A" /* ÀèXƒ.B’¡`”~E]?š */
- $"4B6F AE8E ED0B 4B30 ABB1 2789 5C58 EEFD" /* Ko®Ží.K0«±'‰\Xîý */
- $"06C9 EF2B 2A12 1731 7581 4428 C72D 2501" /* .Éï+*..1uD(Ç-%. */
- $"2C14 0DA4 2C98 035F FEA8 51A2 0E61 4C50" /* ,..¤,˜._þ¨Q¢.aLP */
- $"4A65 60DE FA1C F36C 62D9 A3FA 93A6 4CAC" /* Je`Þú.ólbÙ£ú“¦L¬ */
- $"C1D0 079D 912F A133 724B 13CC AFF4 1382" /* ÁÐ.‘/¡3rK.̯ô.‚ */
- $"D61F 8AF2 A48B CCA6 5D66 4F61 E6BE 657B" /* Ö.Šò¤‹Ì¦]fOaæ¾e{ */
- $"7F5B 6F20 397A BBC2 3F23 86DF 2355 4A18" /* .[o 9z»Â?#†ß#UJ. */
- $"15DB CB3E 201F FF7C 4AC9 C764 B098 CA46" /* .ÛË> .ÿ|JÉÇd°˜ÊF */
- $"C2CF 44C6 42E7 D30A FD05 380F 6BD3 24C1" /* ÂÏDÆBçÓÂý.8.kÓ$Á */
- $"3998 C5C1 E7D5 0E2C 8D50 7FBB 7A11 6CB7" /* 9˜ÅÁçÕ.,P.»z.l· */
- $"B80F 5A84 44BE E746 C43C 6B5D F055 7A3B" /* ¸.Z„D¾çFÄ<k]ðUz; */
- $"77CB BFA9 2B73 06AF 9C8B AF37 F600 E568" /* wË¿©+s.¯œ‹¯7ö.åh */
- $"EE70 09D2 B0A7 C201 94D9 AC58 E9A2 9D53" /* îpÆÒ°§Â.”Ù¬Xé¢S */
- $"94C0 D1C9 E379 E453 E4C7 27C5 C3F8 1161" /* ”ÀÑÉãyäSäÇ'ÅÃø.a */
- $"D631 3F3C 0CFE 13A3 F6EB 3048 F049 CF11" /* Ö1?<.þ.£öë0HðIÏ. */
- $"5962 65AE 5D8E F911 A2E2 7787 6C78 F63C" /* Ybe®]Žù.¢âw‡lxö< */
- $"E24C ED5B F634 B2B9 9DDF 51B0 94B9 1ABF" /* âLí[ö4²¹ßQ°”¹.¿ */
- $"BE93 4236 35A6 613E 3D1B C8FD 0587 27C7" /* ¾“B65¦a>=.Èý.‡'Ç */
- $"F936 55E0 D0CE BF1A 50D8 51CE 6253 0293" /* ù6UàÐο.PØQÎbS.“ */
- $"1958 3FA2 BF6C 54A5 B158 4236 7F88 7DE4" /* .X?¢¿lT¥±XB6.ˆ}ä */
- $"C231 6D0B 62F1 2C6C 1A1D F8AA 0317 C52D" /* Â1m.bñ,l..øª..Å- */
- $"D9D5 0B61 312B A074 B2B8 1905 FCF9 A102" /* ÙÕ.a1+ t²¸..üù¡. */
- $"6188 616D 74E6 8232 245D 9C8A 4FD8 E2FD" /* aˆamtæ‚2$]œŠOØâý */
- $"0C6C 8F2E 5C82 5724 C542 3AE5 BA0A EE0B" /* .l.\‚W$ÅB:åºÂî. */
- $"2A14 BCDE 8005 4446 25B1 CF8A 6744 9F5C" /* *.¼Þ€.DF%±ÏŠgDŸ\ */
- $"9B09 6571 3003 9F52 A42A 7669 CCAA 7A75" /* ›Æeq0.ŸR¤*vi̪zu */
- $"F807 2530 7BA9 1474 F318 5A7B E64A 5DD7" /* ø.%0{©.tó.Z{æJ]× */
- $"A6F2 13B0 AFA5 7BF8 46DC CABF 4D80 CC26" /* ¦ò.°¯¥{øFÜÊ¿M€Ì& */
- $"5838 4016 3C05 4550 C62F 1504 5B79 0816" /* X8@.<.EPÆ/..[y.. */
- $"556C 8524 5DDA E914 92F1 3124 5C5B 3213" /* Ul…$]Úé.’ñ1$\[2. */
- $"7851 D9B8 EE79 46CF 3F06 1EAB 662A FD9E" /* xQÙ¸îyFÏ?..«f*ýž */
- $"E7D8 2E8C 938F 43FA B1B1 34B0 9207 34EC" /* çØ.Œ“Cú±±4°’.4ì */
- $"7A09 46BF 201E 311F EEEE 88EF C6C1 C10D" /* zÆF¿ .1.îîˆïÆÁÁ. */
- $"E238 50C9 7F01 DFF0 2170 EDD1 7471 8C14" /* â8PÉ..ßð!píÑtqŒ. */
- $"FB17 6678 A8B9 6611 9713 D8BB 8840 427C" /* û.fx¨¹f.—.Ø»ˆ@B| */
- $"8E5E 1608 D5E6 79B6 0BD7 3592 5D97 3864" /* Ž^..Õæy¶.×5’]—8d */
- $"71DF 6137 C0E6 2EB0 F71D 466C CFFF 50EF" /* qßa7Àæ.°÷.FlÏÿPï */
- $"FE99 2E4D 0DBB 537F 32F1 DECB D5D4 39DF" /* þ™.M.»S.2ñÞËÕÔ9ß */
- $"4FCC 2FC2 C399 8EB9 FC8B 2806 3FB7 F227" /* OÌ/ÂÙŽ¹ü‹(.?·ò' */
- $"BA12 A288 9858 9159 B6ED 0DBF 3DCC 8FA1" /* º.¢ˆ˜X‘Y¶í.¿=Ì¡ */
- $"9CF5 836D 499F B9E7 DB4E 497F D3A4 57BF" /* œõƒmIŸ¹çÛNI.Ó¤W¿ */
- $"9F0A EECE 8E29 127A 82FF 4222 75AC 32D4" /* ŸÂîÎŽ).z‚ÿB"u¬2Ô */
- $"6540 8040 4137 9EB4 EFFF 7FEC 9D37 60B4" /* e@€@A7ž´ïÿ.ì7`´ */
- $"184A 9567 71E4 F5FE 1C55 BB95 9FD8 BE6D" /* .J•gqäõþ.U»•ŸØ¾m */
- $"037F 052C 035B 91D7 903B 6EEC 1642 3D18" /* ...,.[‘×;nì.B=. */
- $"0B05 FEC5 4C0C 9ED3 BFA5 94AF CBB1 E725" /* ..þÅL.žÓ¿¥”¯Ë±ç% */
- $"DFC3 AF74 2485 D5A2 7F79 1275 C7DD ADE1" /* ßït$…Õ¢.y.uÇÝ­á */
- $"3BD5 AD19 74E6 EE9F 6846 7900 C09D 090B" /* ;Õ­.tæîŸhFy.ÀÆ. */
- $"C17C FB0F 2C9F 4DEB B9FE 7152 A47E B1CB" /* Á|û.,ŸMë¹þqR¤~±Ë */
- $"FB0E 7108 21C7 EFAB 8FA3 8AF0 2FDC 17A9" /* û.q.!Çï«£Šð/Ü.© */
- $"2565 5082 BEBF 4DDD 0699 3265 82AE D421" /* %eP‚¾¿MÝ.™2e‚®Ô! */
- $"3776 341F C56C ECDA B302 0306 AE5F 37FF" /* 7v4.ÅlìÚ³...®_7ÿ */
- $"7FB7 1192 8D68 5475 EE0B 4D80 6149 DEBB" /* .·.’hTuî.M€aIÞ» */
- $"F9A7 D7E7 A35D 9515 8000 4F04 C4D6 670C" /* ù§×ç£]•.€.O.ÄÖg. */
- $"54B7 93BB D264 43E0 E8D4 2D4D D3E2 AEB0" /* T·“»ÒdCàèÔ-MÓâ®° */
- $"FBAE F5BD A155 A8F2 07B4 AAA6 CE0A 84CC" /* û®õ½¡U¨ò.´ª¦ÎÂ„Ì */
- $"907F D5C4 9900 8FE2 0E0D F385 55A0 CDFF" /* .ÕÄ™.â..ó…U Íÿ */
- $"7FFE D776 193F A5C4 0334 DD15 7A6A 0890" /* .þ×v.?¥Ä.4Ý.zj. */
- $"DE98 5707 7799 9A5B D638 31B9 982B 5623" /* Þ˜W.w™š[Ö81¹˜+V# */
- $"3AFA A84A 20E7 417C F56E 7776 0C54 0765" /* :ú¨J çA|õnwv.T.e */
- $"91DE A19E 3DD2 4D8B F9F9 0D61 6343 0746" /* ‘Þ¡ž=ÒM‹ùù.acC.F */
- $"7D72 600B 4E15 FC8F 60FA A273 4348 A86E" /* }r`.N.ü`ú¢sCH¨n */
- $"E11A CD6B 3FFF 7ED1 E486 AAAA A380 045A" /* á.Ík?ÿ~Ñ䆪ª£€.Z */
- $"70E5 3753 4FFF 7FC6 ADBE 8E71 66FF 8165" /* på7SOÿ.Æ­¾Žqfÿe */
- $"D782 24E8 7399 0C15 03BF 29B5 5685 FDA1" /* ׂ$ès™...¿)µV…ý¡ */
- $"5BAD 5751 6D53 799A A7C6 572E 6A37 B46A" /* [­WQmSyš§ÆW.j7´j */
- $"B9BF 05BF 3131 F7DB E3B8 8F11 EE2F 13D6" /* ¹¿.¿11÷Ûã¸.î/.Ö */
- $"7DE9 D552 0B25 FEAF AEFE F0A7 FBE9 487F" /* }éÕR.%þ¯®þð§ûéH. */
- $"9085 0FFA 23FE A9DB 0494 B0E1 FEFD 1D50" /* ….ú#þ©Û.”°áþý.P */
- $"15B4 6548 AAA0 0182 C5FF 7D24 05C8 B15E" /* .´eHª .‚Åÿ}$.ȱ^ */
- $"E45F A508 3C68 CA73 3A57 A35E 462D 9213" /* ä_¥.<hÊs:W£^F-’. */
- $"9D19 A4FE F266 C323 64FF 7B71 19F7 0BC3" /* .¤þòfÃ#dÿ{q.÷.Ã */
- $"062C 20C4 9745 F075 6FFF 31F0 A3AD 4C84" /* ., Ä—Eðuoÿ1ð£­L„ */
- $"00F3 104C 0064 3899 0DB9 8128 CB5F FF46" /* .ó.L.d8™.¹(Ë_ÿF */
- $"7184 41CB 7E58 4C0B ADD5 CBB2 1A61 E3D6" /* q„AË~XL.­Õ˲.aãÖ */
- $"B45F 489E 7FE9 D915 2B77 0776 98BD B3A6" /* ´_Hž.éÙ.+w.v˜½³¦ */
- $"230E B817 1D5A D937 3251 2449 6B0A 5A13" /* #.¸..ZÙ72Q$IkÂZ. */
- $"C4E0 BB45 CB72 9758 9E56 158D B1E6 9590" /* Äà»EËr—XžV.±æ• */
- $"4FC4 0611 EDBC 426F 6D2B D932 D595 A74E" /* OÄ..í¼Bom+Ù2Õ•§N */
- $"8728 58CD BD02 9746 DBA2 7EAB 0F07 363C" /* ‡(Xͽ.—FÛ¢~«..6< */
- $"BAB3 1228 E02A BDB4 373F F3FB FF7D 8D0D" /* º³.(à*½´7?óûÿ}. */
- $"2193 09F4 7603 A017 98B1 421E 7A47 D126" /* !“Æôv. .˜±B.zGÑ& */
- $"82FD 5449 B97F F864 5CD5 19F6 A8A4 F216" /* ‚ýTI¹.ød\Õ.ö¨¤ò. */
- $"A4B3 FF7F E820 4C58 DE4B 944B 6FD4 F4DA" /* ¤³ÿ.è LXÞK”KoÔôÚ */
- $"596E A688 456C 3F0D 7844 1596 2BED 0D5D" /* Yn¦ˆEl?.xD.–+í.] */
- $"FAFB 8D2E D7D0 ABCB B2BE 8D80 E74D 9EDC" /* úû.×Ы˲¾€çMžÜ */
- $"7FFF 7FC9 2FB9 3BDA F47A B9C2 E1B8 5CC8" /* .ÿ.É/¹;Úôz¹Âá¸\È */
- $"14AB D534 7208 32FE 73D2 EF23 862E 10F8" /* .«Õ4r.2þsÒï#†..ø */
- $"C16F 1FFF 6FBB FA97 5167 CDAD 4886 8FC2" /* Áo.ÿo»ú—QgÍ­H†Â */
- $"BFFF 7FFE 2B73 126E 1EC8 C82A 3F6D 6CC3" /* ¿ÿ.þ+s.n.ÈÈ*?mlà */
- $"D98A D501 1DC2 82FD FF57 9731 B866 2A7D" /* ÙŠÕ..‚ýÿW—1¸f*} */
- $"C983 5F41 893F 2D09 F81C E373 42C2 5963" /* Ƀ_A‰?-Æø.ãsBÂYc */
- $"7E9F C269 2B8B C21A 8247 D433 0DF7 491E" /* ~ŸÂi+‹Â.‚GÔ3.÷I. */
- $"D1BF 3D9E F4BD 1B50 8034 4EE9 4A69 B155" /* Ñ¿=žô½.P€4NéJi±U */
- $"849A B0F7 8CEA 3FD0 E4A0 C339 2431 ED8B" /* „š°÷Œê?Ðä Ã9$1í‹ */
- $"793D 6354 12C0 97F9 C379 ADA9 7DEE E5EF" /* y=cT.À—ùÃy­©}îåï */
- $"2366 FD9F 7F36 9703 7BCA 1455 6A98 F02E" /* #fýŸ.6—.{Ê.Uj˜ð. */
- $"1EDC 4707 C9A6 B325 A6E4 637D 612B B3DD" /* .ÜG.ɦ³%¦äc}a+³Ý */
- $"1E5A 3660 EEB0 BEFA 2C50 307B 5887 6D39" /* .Z6`î°¾ú,P0{X‡m9 */
- $"0EC7 2D81 C32E 6B72 8546 30E4 133F 3D3B" /* .Ç-Ã.kr…F0ä.?=; */
- $"0A76 21AA 4387 8F29 03C8 1C32 755C F553" /* Âv!ªC‡).È.2u\õS */
- $"5CA1 C16A 02EC 4654 97C8 6F10 BA2A 16E0" /* \¡Áj.ìFT—Èo.º*.à */
- $"DB18 605E 8A18 8A6E 4F35 1EF7 8C57 F8B2" /* Û.`^Š.ŠnO5.÷ŒWø² */
- $"0020 4D0A 1739 2287 ADE2 B0C2 D816 17D2" /* . MÂ.9"‡­â°ÂØ..Ò */
- $"21F8 3104 FEA8 38E3 8644 6F0B D2C6 A599" /* !ø1.þ¨8ã†Do.ÒÆ¥™ */
- $"B793 1367 B548 23BD 8836 1143 D5DB 2720" /* ·“.gµH#½ˆ6.CÕÛ' */
- $"73BB 1485 DEAF C96F 24E8 AA26 56B9 89D3" /* s».…Þ¯Éo$èª&V¹‰Ó */
- $"8F8D 2F3E 5EA5 466C BE3C 6879 6C0A 5891" /* />^¥Fl¾<hylÂX‘ */
- $"974E 6F22 0E47 66D4 BD1F 6A7D 1885 42CC" /* —No".GfÔ½.j}.…BÌ */
- $"7E13 126E AC98 74B7 B093 BDFF 37DB E527" /* ~..n¬˜t·°“½ÿ7Ûå' */
- $"E6D0 CF2A D7E6 E7EB 1095 05AF 6407 BB9B" /* æÐÏ*×æçë.•.¯d.»› */
- $"0227 D5EB 260A C844 340F B249 E84F 58A7" /* .'Õë&ÂÈD4.²IèOX§ */
- $"FA14 9D34 7614 73A6 BE73 ED76 B2CD 4515" /* ú.4v.s¦¾sív²ÍE. */
- $"F26C 3AD7 7C32 5480 5A3A C4DF 123A EA95" /* òl:×|2T€Z:Äß.:ê• */
- $"D2B4 A3D8 F88D E685 6505 A999 DD9E C8D1" /* Ò´£Øøæ…e.©™ÝžÈÑ */
- $"A073 3702 5A8F 3598 F7DC A36F 0058 065E" /*  s7.Z5˜÷Ü£o.X.^ */
- $"65E6 B5AC 2A85 0F1C 43BF 8A10 43A0 BB10" /* e浬*…..C¿Š.C ». */
- $"4C3A 8F4F 95AD 253D EEE9 FBE8 4023 4647" /* L:O•­%=îéûè@#FG */
- $"7A75 8F1C 9245 3C51 3FF5 BD2B DFD3 57EF" /* zu.’E<Q?õ½+ßÓWï */
- $"1FB4 900F 4546 6EFA A7AE 45EB EAE9 7B9D" /* .´.EFnú§®Eëêé{ */
- $"6408 1DCB F7AC BE44 7D08 1482 2257 A9CF" /* d..Ë÷¬¾D}..‚"W©Ï */
- $"8B78 3610 9816 9518 A64C 215A 4569 6C5F" /* ‹x6.˜.•.¦L!ZEil_ */
- $"57E0 4F89 F77C 88D6 ADFC 8E42 9299 A2C9" /* WàO‰÷|ˆÖ­üŽB’™¢É */
- $"0F7C EA0A 7E98 B7AF 70ED 09A8 0759 B1A7" /* .|êÂ~˜·¯píƨ.Y±§ */
- $"C18E 2CC9 883F A788 A2F1 57B9 7A0E F384" /* ÁŽ,Ɉ?§ˆ¢ñW¹z.ó„ */
- $"F0CE 46F0 E10A ED6F CE17 2BE1 25D5 3A36" /* ðÎFðáÂíoÎ.+á%Õ:6 */
- $"5C6A F3AA F2D1 7225 6C5C 514F 8F1F 64A5" /* \jóªòÑr%l\QO.d¥ */
- $"B08E D05D 3E2E B3E4 DE48 12A9 7DC6 6E03" /* °ŽÐ]>.³äÞH.©}Æn. */
- $"05B3 2AD0 EF87 EFB1 6D03 06E4 85AB 36C6" /* .³*Ðï‡ï±m..ä…«6Æ */
- $"9BF6 8382 74F2 F321 62DF 269C 8D95 8FBD" /* ›öƒ‚tòó!bß&œ•½ */
- $"C4CA 7278 FDBA C51B A4FC C224 BD43 5F76" /* ÄÊrxýºÅ.¤üÂ$½C_v */
- $"F9D9 0970 5EAA 5F05 FDCB 50DE 35E7 A82E" /* ùÙÆp^ª_.ýËPÞ5ç¨. */
- $"1E7E 584D 33D8 EF90 B221 622F 778E 460D" /* .~XM3Øï²!b/wŽF. */
- $"6DC9 383F CF41 7B89 7414 97EF EFE2 CC75" /* mÉ8?ÏA{‰t.—ïïâÌu */
- $"8895 6AFD C6E8 610E 5E29 7AE1 FAAF 9FD5" /* ˆ•jýÆèa.^)záú¯ŸÕ */
- $"435F 3F61 6F9F AC78 7EAD 62BE 7DF7 7CFD" /* C_?aoŸ¬x~­b¾}÷|ý */
- $"D3FD 5BAF 83F5 5B37 CF6D BE7E 9DDF 3F4D" /* Óý[¯ƒõ[7Ïm¾~ß?M */
- $"80E8 ABDE CCAF 0D6C 8AC6 9587 348A 7A5A" /* €è«Þ̯.lŠÆ•‡4ŠzZ */
- $"21F6 5D05 F6A4 1727 AC99 8E36 4607 A805" /* !ö].ö¤.'¬™Ž6F.¨. */
- $"1CA8 FB12 6979 4216 6FCF DF65 6135 AFF9" /* .¨û.iyB.oÏßea5¯ù */
- $"5A1E 01C1 15A0 4F38 E547 6F65 858D 0788" /* Z..Á. O8åGoe….ˆ */
- $"49E3 07A2 D476 B767 EC21 FF65 559D 3B3F" /* Iã.¢Ôv·gì!ÿeU;? */
- $"B8A5 C1A8 6496 5183 24E6 93A6 DF2F 52F1" /* ¸¥Á¨d–Qƒ$擦ß/Rñ */
- $"19CA BFD7 1479 8040 2F9C 0DB9 00F0 49C5" /* .Ê¿×.y€@/œ.¹.ðIÅ */
- $"3D32 5B0C 9453 8D1F 452F D9E7 75FD CD61" /* =2[.”S.E/ÙçuýÍa */
- $"44A9 62C3 F0C8 BAF0 6A66 A4D4 AA8B 73B0" /* D©bÃðȺðjf¤Ôª‹s° */
- $"C942 686A 4A1E E3A7 2343 A0ED D595 9AFC" /* ÉBhjJ.ã§#C íÕ•šü */
- $"5546 0ACB FD23 6F2E DCEE ABBD 70E7 FA93" /* UFÂËý#o.Üpçú“ */
- $"3FFF 7FC5 7D31 FA1C D910 1C70 6CDC 3362" /* ?ÿ.Å}1ú.Ù..plÜ3b */
- $"B0A1 C6F3 16D1 BE51 73D2 4697 37CA 8197" /* °¡Æó.ѾQsÒF—7Ê— */
- $"A8C6 89C1 FF78 99EB 31B8 5F88 7B08 C557" /* ¨Æ‰Áÿx™ë1¸_ˆ{.ÅW */
- $"5483 A35C 0713 94D5 D2DF B84C 36CA D9EC" /* Tƒ£\..”ÕÒ߸L6ÊÙì */
- $"8FC7 A305 814F 8B04 07D2 E391 5E89 43FE" /* Ç£.O‹..Òã‘^‰Cþ */
- $"6C67 4343 91DB DD56 C1D2 FEA6 9F1F 346F" /* lgCC‘ÛÝVÁÒþ¦Ÿ.4o */
- $"714B 79E1 7AC7 53A1 9934 69F4 E886 5A9C" /* qKyázÇS¡™4iôè†Zœ */
- $"6F9A D26F DD48 5F60 A72A 7E20 77F8 1BE8" /* ošÒoÝH_`§*~ wø.è */
- $"91B9 9018 8124 7694 3664 4202 7B94 1007" /* ‘¹.$v”6dB.{”.. */
- $"4234 15FC 04A2 6DE0 DC6B 5EDE 4332 F592" /* B4.ü.¢màÜk^ÞC2õ’ */
- $"779A A3BD 8E84 5464 DE08 6BAE AE2F 6EEF" /* wš£½Ž„TdÞ.k®®/nï */
- $"CB75 5862 59D8 1362 5D60 79D2 137C 7606" /* ËuXbYØ.b]`yÒ.|v. */
- $"F2B1 06DE 8A2F B76A A7D9 84DB 8F52 1107" /* ò±.ÞŠ/·j§Ù„ÛR.. */
- $"A42C 9803 2476 0448 42C9 A9E5 D0F5 9110" /* ¤,˜.$v.HBÉ©åÐõ‘. */
- $"2FAB AAF4 0752 81C9 6064 B8F7 6CEB 438E" /* /«ªô.RÉ`d¸÷lëCŽ */
- $"DC4B 916C 21F0 1C8F 2A6A 1919 9E26 2B36" /* ÜK‘l!ð.*j..ž&+6 */
- $"3E51 F543 F7C5 2549 66D0 2F14 D18F 42F1" /* >QõC÷Å%IfÐ/.ÑBñ */
- $"397B BA52 99ED 853C E07D 629B 92A1 2589" /* 9{ºR™í…<à}b›’¡%‰ */
- $"B3A9 B812 DC8D A368 3204 F8AA 7549 AF2B" /* ³©¸.Ü£h2.øªuI¯+ */
- $"2DE7 529C 1ECB 9747 A4B8 F6EC 8DDC 0AC4" /* -çRœ.Ë—G¤¸öìÜÂÄ */
- $"2C31 F042 C407 3F18 FD32 9280 60E4 60D8" /* ,1ðBÄ.?.ý2’€`ä`Ø */
- $"77B5 C019 A5FF 6E0D 8E35 A78E C7AA E95B" /* wµÀ.¥ÿn.Ž5§ŽÇªé[ */
- $"D37C D883 5DD2 756B 385A 08BB 7708 AA5E" /* Ó|؃]Òuk8Z.»w.ª^ */
- $"5B89 0628 F831 7775 3555 A523 BF2F 721A" /* [‰.(ø1wu5U¥#¿/r. */
- $"099B E6B4 5128 9EA6 41E1 9B8B 18C1 928C" /* Æ›æ´Q(ž¦Aᛋ.Á’Œ */
- $"72A0 BD1E 84D6 836A C947 0982 284A 9238" /* r ½.„ÖƒjÉGÆ‚(J’8 */
- $"A06F E390 1BD5 BBFD 323F BA86 2091 BAD5" /*  oã.Õ»ý2?º† ‘ºÕ */
- $"351D 16C5 1D44 E8C7 66C7 D469 047D 5548" /* 5..Å.DèÇfÇÔi.}UH */
- $"7049 7B42 B682 DF4C 68DE B5D2 2EDC C105" /* pI{B¶‚ßLhÞµÒ.ÜÁ. */
- $"4047 9A7E 0403 F48B 6215 C3ED 8DBA 12E9" /* @Gš~..ô‹b.Ãíº.é */
- $"EEFB B61B 906E F6F6 DDFD D030 CD1C 47FD" /* îû¶.nööÝýÐ0Í.Gý */
- $"7C37 E7C7 DC08 213E 3C33 08E6 74A0 F400" /* |7çÇÜ.!><3.æt ô. */
- $"7CFC 3B85 1A2E 5ACA 573F F24C 7D2C 0E3B" /* |ü;…..ZÊW?òL},.; */
- $"2A6D CEDC 6C9C 6E97 A572 915F A892 3833" /* *mÎÜlœn—¥r‘_¨’83 */
- $"A08F 0070 A602 FB49 0EA6 62FC 4237 C568" /*  .p¦.ûI.¦büB7Åh */
- $"E937 1DC1 1FC2 C3F1 AA30 AC4D DDB8 E747" /* é7.Á.ÂÃñª0¬MݸçG */
- $"5EE4 FD73 8124 56EB ADBE 6DB3 F27B 80C0" /* ^äýs$Vë­¾m³ò{€À */
- $"E536 971B 511B C76B AB20 8BA4 4DCD BFCB" /* å6—.Q.Çk« ‹¤MÍ¿Ë */
- $"4A0C 34DC 3DDC 9BEF 5122 89D0 99D1 9BE7" /* J.4Ü=Ü›ïQ"‰Ð™Ñ›ç */
- $"8840 002A A77A 25E2 9C2C F9BC 78F9 FB0E" /* ˆ@.*§z%âœ,ù¼xùû. */
- $"0DB7 4F14 B07A 12F6 65D3 ABE1 660D A84A" /* .·O.°z.öeÓ«áf.¨J */
- $"EFF9 A799 1852 8ED0 9582 B79A D812 1BE6" /* ïù§™.RŽÐ•‚·šØ..æ */
- $"F3D0 D5FA 9C76 5EBD DBFD 42A9 F7B3 885E" /* óÐÕúœv^½ÛýB©÷³ˆ^ */
- $"4A68 DBE7 9663 FB7F 1AC4 5004 197F 97F0" /* JhÛç–cû..ÄP...—ð */
- $"F57B 135D 19ED E0E0 1C84 139C BA3B 2493" /* õ{.].íàà.„.œº;$“ */
- $"D997 333D B6A7 9E83 619C FCE9 9875 134D" /* Ù—3=¶§žƒaœüé˜u.M */
- $"4B31 FCB3 5808 B917 C8BB 0B67 4564 488E" /* K1ü³X.¹.È».gEdHŽ */
- $"3554 8125 C3A4 DB4A 0BB2 E501 244C 1F49" /* 5T%äÛJ.²å.$L.I */
- $"C6A7 51E4 6C51 A134 3DF4 CE21 2993 FF3B" /* ƧQälQ¡4=ôÎ!)“ÿ; */
- $"80F6 AE0B B9F8 D1D5 8853 4531 6806 4F3E" /* €ö®.¹øÑÕˆSE1h.O> */
- $"D2B6 5F62 796A 683C D3C9 A22B 6D56 C497" /* Ò¶_byjh<ÓÉ¢+mVÄ— */
- $"D854 2E14 C281 0F94 0220 BEE7 3754 D077" /* ØT..Â.”. ¾ç7TÐw */
- $"EDB0 0F0E 95C1 A40B 55C9 B5AE 4DA8 A8A6" /* í°..•Á¤.Uɵ®M¨¨¦ */
- $"ADD6 4A11 DE81 B148 70D3 FA4F 795C 9171" /* ­ÖJ.Þ±HpÓúOy\‘q */
- $"C72E 7EF2 454C 0336 BE4A EE68 960E 25BA" /* Ç.~òEL.6¾Jîh–.%º */
- $"E686 01F4 6FF5 3C7C 8B33 60D8 24D3 70A1" /* æ†.ôoõ<|‹3`Ø$Óp¡ */
- $"06C6 E616 29D4 63D6 3334 379F 743E 745D" /* .Ææ.)ÔcÖ347Ÿt>t] */
- $"4EF5 ECB5 072E 9F62 0750 F7BA 6FDE B6B0" /* Nõìµ..Ÿb.P÷ºoÞ¶° */
- $"0BD0 4FCC 8F59 9B13 0C77 0A30 9BAE DF36" /* .ÐOÌY›..wÂ0›®ß6 */
- $"B13D D861 E92A 12C7 EC7A 0946 BF20 1E31" /* ±=Øaé*.ÇìzÆF¿ .1 */
- $"1FEE EE88 EFC6 C1C1 0DE2 3850 C97F 01DF" /* .îîˆïÆÁÁ.â8PÉ..ß */
- $"F021 605A D52A 570D 7089 0C1B B3FE 8B4D" /* ð!`ZÕ*W.p‰..³þ‹M */
- $"E441 70AC 5F71 3FCE 527F EBF4 048A A307" /* äAp¬_q?ÎR.ëô.Š£. */
- $"CEFD 4EB0 87ED BFE2 A36C 51B9 EAD3 37C6" /* ÎýN°‡í¿â£lQ¹êÓ7Æ */
- $"E8F0 9A3D 8F78 8747 81D4 33F0 9EEB 5EA0" /* èðš=x‡GÔ3ðžë^  */
- $"6FE0 A580 6B6B C126 1CE3 F1B2 DC9C CFCE" /* oीkkÁ&.ãñ²ÜœÏÎ */
- $"42EE 7E91 EF2F 0DDF CFDE 75EB 554D 6941" /* Bî~‘ï/.ßÏÞuëUMiA */
- $"07A5 21BE AD52 7CC1 49B5 FE74 AE40 F70F" /* .¥!¾­R|ÁIµþt®@÷. */
- $"AB3B 0C16 98F5 7742 3DCE 842D 0B2B 2FEB" /* «;..˜õwB=΄-.+/ë */
- $"5E90 DEBC 8BA9 81AC 40CC 0030 2853 FE9C" /* ^Þ¼‹©¬@Ì.0(Sþœ */
- $"6FC2 569B 2CD1 6200 2881 802D 7697 8442" /* oÂV›,Ñb.(€-v—„B */
- $"92C8 666B BC90 3252 F4D3 9BD2 AD14 0027" /* ’Èfk¼2RôÓ›Ò­..' */
- $"CE11 F5A4 437B 3F80 B250 AA4C 23B6 AD83" /* Î.õ¤C{?€²PªL#¶­ƒ */
- $"277E 5EF0 8132 6331 9325 D1A3 CFB6 6F73" /* '~^ð2c1“%ѣ϶os */
- $"D37D 780F 91CC CD40 6234 2FE2 F097 1681" /* Ó}x.‘ÌÍ@b4/âð—. */
- $"6097 88BD BFFF 18F5 2CBB FF67 FDBC 2F07" /* `—ˆ½¿ÿ.õ,»ÿgý¼/. */
- $"67FF 7FFF 1946 84C7 A551 03FF 7F52 A7C2" /* gÿ.ÿ.F„Ç¥Q.ÿ.R§Â */
- $"8AC8 1080 56FF 0C48 1804 A884 A5A2 08FF" /* ŠÈ.€Vÿ.H..¨„¥¢.ÿ */
- $"7FF5 3220 8043 9005 C25D DE15 02FB 7F2B" /* .õ2 €C.Â]Þ..û.+ */
- $"8205 5CA8 40BE EFB1 78F0 2656 2AD4 14FF" /* ‚.\¨@¾ï±xð&V*Ô.ÿ */
- $"7505 20CD 8BE2 8B15 47BB 9E26 105E 15DD" /* u. Í‹â‹.G»ž&.^.Ý */
- $"21A7 82AE E19D FE27 5D8B DDAD E13B D5AD" /* !§‚®áþ']‹Ý­á;Õ­ */
- $"1974 E6EE 9F68 4679 00C0 9D09 0BC1 7CFB" /* .tæîŸhFy.ÀÆ.Á|û */
- $"0F2C 9F4E 082C 2CB4 569B A7B0 0009 E098" /* .,ŸN.,,´V›§°.Æà˜ */
- $"9AB0 9892 B1FF 6957 1D78 2613 4289 24C6" /* š°˜’±ÿiW.x&.B‰$Æ */
- $"12BC E2EF C9AE E6D9 784F C157 77AB 3470" /* .¼âïÉ®æÙxOÁWw«4p */
- $"D8C7 C746 1978 322D D4E9 FA24 B8B2 5054" /* ØÇÇF.x2-Ôéú$¸²PT */
- $"D643 8270 9090 D6D8 0C24 16E5 1146 421C" /* ÖC‚pÖØ.$.å.FB. */
- $"D6A2 40D9 1864 A800 0000 0000 0001 4554" /* Ö¢@Ù.d¨.......ET */
- $"031E 793B 33D3 FD4A CE0A 3D8A 9D46 37B0" /* ..y;3ÓýJÎÂ=ŠF7° */
- $"4D2C 6F04 2BFF 071C 023F E153 6688 1815" /* M,o.+ÿ...?áSfˆ.. */
- $"BA20 BF61 DDDF 2979 84E3 3348 50F6 E9B8" /* º ¿aÝß)y„ã3HPöé¸ */
- $"634A 8937 FF7F F1AE E84B C95A 771F 4C9C" /* cJ‰7ÿ.ñ®èKÉZw.Lœ */
- $"3FFE 0734 7D7F 6E35 4A2E 21E0 E52F FF7E" /* ?þ.4}.n5J.!àå/ÿ~ */
- $"8532 8513 7869 A6E6 495D 3E58 F349 1EF5" /* …2….xi¦æI]>XóI.õ */
- $"886C 6441 9091 82E8 0C24 1507 0E02 A105" /* ˆldA‘‚è.$....¡. */
- $"95C5 1409 096C 9A37 F758 F13A 5ABF 149E" /* •Å.ÆÆlš7÷Xñ:Z¿.ž */
- $"DA31 52E9 0DA9 0BFF 45EB 20C7 1A1C E54C" /* Ú1Ré.©.ÿEë Ç..åL */
- $"29D1 6C8E D1EC 9D59 F945 4303 373F FF7F" /* )ÑlŽÑìYùEC.7?ÿ. */
- $"CE95 B027 88F7 AB06 28B9 92E7 D540 BC2B" /* Ε°'ˆ÷«.(¹’çÕ@¼+ */
- $"7167 8C6C C87E 32B0 C904 7D7D 278E E519" /* qgŒlÈ~2°É.}}'Žå. */
- $"707D 2C42 1714 C425 F9D0 DC01 D910 23DB" /* p},B..Ä%ùÐÜ.Ù.#Û */
- $"E7F3 391C A4E6 FAE1 C850 5A1F 456A 6690" /* çó9.¤æúáÈPZ.Ejf */
- $"3F37 F970 3841 73D3 1095 39CF 10A3 40F8" /* ?7ùp8AsÓ.•9Ï.£@ø */
- $"4CCC 4985 E3D5 127F 7CF4 92BC DCE9 2335" /* LÌI…ãÕ..|ô’¼Üé#5 */
- $"43FB 7460 8D5C C121 CFF2 1165 1CCE BBB2" /* Cût`\Á!Ïò.e.λ² */
- $"5EA8 0279 2C97 E45B A43D 328C 7A6C 5EBC" /* ^¨.y,—ä[¤=2Œzl^¼ */
- $"61DD BB2C E34E 25E4 1725 3C6B EC12 BFEF" /* aÝ»,ãN%ä.%<kì.¿ï */
- $"3E5E 0ACF 766D 9D4E 8978 2AC5 F138 755A" /* >^ÂÏvmN‰x*Åñ8uZ */
- $"CBDD 8421 F74E 9A07 A070 16ED 100C 769A" /* ËÝ„!÷Nš. p.í..vš */
- $"6571 1FA0 4D62 8ADC A3F1 0AAA 2253 1A39" /* eq. MbŠÜ£ñª"S.9 */
- $"0006 DF51 B09A 2267 BA13 3AD9 0120 8520" /* ..ßQ°š"gº.:Ù. … */
- $"7375 BB11 0715 9FFF 7FFF 276F 9A44 4D02" /* su»...Ÿÿ.ÿ'ošDM. */
- $"9DF2 BE32 729A 8C71 FBC9 4C73 FA4B 1D24" /* ò¾2ršŒqûÉLsúK.$ */
- $"4115 B69E 4FFF 7FFF 45B5 7091 9925 CEBD" /* A.¶žOÿ.ÿEµp‘™%ν */
- $"6A4E 1AA3 BFFF 7FFD AA3B 4043 EE5A 76B0" /* jN.£¿ÿ.ýª;@CîZv° */
- $"A073 CF17 7A58 3A06 649C B972 3CB8 897B" /*  sÏ.zX:.dœ¹r<¸‰{ */
- $"31E2 637A 05AC 83FA B94C 0F75 7113 FF7B" /* 1âcz.¬ƒú¹L.uq.ÿ{ */
- $"E690 225A FB16 A961 626A B7FE 22EF 864B" /* æ"Zû.©abj·þ"ï†K */
- $"F464 1D62 4127 02B3 DB08 1C01 3ECE 1326" /* ôd.bA'.³Û...>Î.& */
- $"CF03 BF05 5771 4992 75FE 29FC 5FFF 60D5" /* Ï.¿.WqI’uþ)ü_ÿ`Õ */
- $"DCC3 1B1F 40FF 6990 DC69 3E47 D09A 6E6A" /* ÜÃ..@ÿiÜi>GКnj */
- $"2866 9BA8 D74C BAAA 204E 05F9 DBFE E679" /* (f›¨×Lºª N.ùÛþæy */
- $"E76C 383D 9F92 BB32 1E14 2CA1 CBD5 E93C" /* çl8=Ÿ’»2..,¡ËÕé< */
- $"6C00 DFA2 B04F D650 3F14 60FF 7F73 29C3" /* l.ߢ°OÖP?.`ÿ.s)à */
- $"E20E 5672 C31B 6D72 FDCF 8097 B8B0 1482" /* â.VrÃ.mrýÏ€—¸°.‚ */
- $"C37E 4C4A 28FA 6E67 F061 E00C 371B 8655" /* Ã~LJ(úngðaà.7.†U */
- $"BDCB 2942 6AB1 0E31 38D3 6948 0D3F 6FEF" /* ½Ë)Bj±.18ÓiH.?oï */
- $"C2AB 669A E502 2490 C158 FC07 05F0 348A" /* «fšå.$ÁXü..ð4Š */
- $"0505 F0B2 E7E3 F934 19DA 2DB9 9686 603E" /* ..ð²çãù4.Ú-¹–†`> */
- $"C2C3 4B2F EB95 FB4E 62D2 F085 4364 9DCA" /* ÂÃK/ë•ûNbÒð…CdÊ */
- $"A6E8 94F8 CC41 2603 5BFC 4E90 C05F 068D" /* ¦è”øÌA&.[üNÀ_. */
- $"414C 618C 8860 58B1 7059 0B4C 39E8 FB58" /* ALaŒˆ`X±pY.L9èûX */
- $"C413 43C6 BF39 CC12 6E5B F65C F671 DD29" /* Ä.CÆ¿9Ì.n[ö\öqÝ) */
- $"8A03 BC15 FF06 2028 49E4 BF04 E6FC D4FD" /* Š.¼.ÿ. (Iä¿.æüÔý */
- $"401A CB9C 5F7F EFE7 8F41 E707 7803 9F1A" /* @.Ëœ_.ïçAç.x.Ÿ. */
- $"715F 951E E63A 9B4C 1404 32AA B5B7 98B0" /* q_•.æ:›L..2ªµ·˜° */
- $"D5F4 CD69 DD15 9E81 D2FD 09F7 462D AF3E" /* ÕôÍiÝ.žÒýÆ÷F-¯> */
- $"31DA 85C4 5053 8460 C06C 7018 908C 4821" /* 1Ú…ÄPS„`Àlp.ŒH! */
- $"D8AB AC44 7666 44D1 EA04 8979 3A4A A0FE" /* Ø«¬DvfDÑê.‰y:J þ */
- $"27D7 B0C3 DBAA 5233 F376 3CA8 4968 DF8A" /* '×°ÃÛªR3óv<¨Ihߊ */
- $"874C 2117 6A15 4664 03FF 7FFF 7F7C 2D12" /* ‡L!.j.Fd.ÿ.ÿ.|-. */
- $"B28B 8A4C 6D72 1106 16E0 BF7F 9822 2424" /* ²‹ŠLmr...à¿.˜"$$ */
- $"3C1B CBC8 2F76 1AC7 FF7F FF7F EB42 22AA" /* <.ËÈ/v.Çÿ.ÿ.ëB"ª */
- $"F30A 0C9D 6086 E561 E1BC C1D9 4E7F FADF" /* óÂ.`†åaá¼ÁÙN.úß */
- $"A85C B34C E2D4 FCF6 1A29 34F3 3B42 1DFC" /* ¨\³LâÔüö.)4ó;B.ü */
- $"C6BD 370B D203 B0C4 1C7D C348 1EE7 EAD9" /* ƽ7.Ò.°Ä.}ÃH.çêÙ */
- $"3145 E7FB 36CC 8E64 AB70 81DC 65E1 2C1D" /* 1Eçû6ÌŽd«pÜeá,. */
- $"9CB5 18A0 1C95 7DE2 96DF C185 7A40 50C7" /* œµ. .•}â–ßÁ…z@PÇ */
- $"E32C FCC1 FF6B 14F5 05FE 0E1C 8757 8D82" /* ã,üÁÿk.õ.þ..‡W‚ */
- $"3A41 284E 2906 8316 564F F479 4DCF FF7E" /* :A(N).ƒ.VOôyMÏÿ~ */
- $"5F11 3745 AC7F ED8D BC93 4205 7E12 E036" /* _.7E¬.í¼“B.~.à6 */
- $"0BE4 4B4F F99C F369 6B38 263E 63EC 6311" /* .äKOùœóik8&>cìc. */
- $"D577 8B5D 7957 D24D 7D64 A2B5 1107 4625" /* Õw‹]yWÒM}d¢µ..F% */
- $"E1EB 2460 41A2 E878 5967 CEAE AE16 D8D5" /* áë$`A¢èxYgή®.ØÕ */
- $"F960 B484 0B49 7253 26F2 714E 6A13 03E4" /* ù`´„.IrS&òqNj..ä */
- $"A0C3 3924 31ED 8B79 3D63 5412 C097 F9C3" /*  Ã9$1í‹y=cT.À—ùÃ */
- $"79AD A97D EEE5 EF23 66FF 15BD C854 5DFB" /* y­©}îåï#fÿ.½ÈT]û */
- $"5921 E05C 6A39 B68E 6444 6D55 3B7D 6DDA" /* Y!à\j9¶ŽdDmU;}mÚ */
- $"9003 8F53 5C49 D978 31CD 41C5 DD62 7DE4" /* .S\IÙx1ÍAÅÝb}ä */
- $"2F24 5932 A14F 9C9C 97B6 2652 5988 7970" /* /$Y2¡Oœœ—¶&RYˆyp */
- $"F890 8A5C 9614 EBF4 DAC8 15D1 6F3C 07E4" /* øŠ\–.ëôÚÈ.Ño<.ä */
- $"7B8B F763 6803 394F 2291 8D88 EB1B 3136" /* {‹÷ch.9O"‘ˆë.16 */
- $"10C9 5077 060A 7DB0 A890 CB7B 947F AD8B" /* .ÉPw.Â}°¨Ë{”.­‹ */
- $"0AAF 67FF 5D78 615A E459 013B 6923 5E0E" /* ¯gÿ]xaZäY.;i#^. */
- $"900D BA9C DFF2 37D0 0508 B5F3 EA48 FADE" /* .ºœßò7Ð..µóêHúÞ */
- $"D348 3F2F 8E71 E6CD B6BE 8941 8773 0E17" /* ÓH?/ŽqæͶ¾‰A‡s.. */
- $"E97A B699 5A4F 21C1 0766 538B B29A B8CA" /* éz¶™ZO!Á.fS‹²š¸Ê */
- $"FBAE 21FA 76A0 B197 C613 E523 B127 1FE4" /* û®!úv ±—Æ.å#±'.ä */
- $"0AA8 798D 688E 8F27 E386 446F 0BD2 C6A5" /* ¨yhŽ'ã†Do.ÒÆ¥ */
- $"99B7 9313 67B5 4823 BD88 3611 E5A8 8054" /* ™·“.gµH#½ˆ6.娀T */
- $"3C15 C120 1B02 5B2A 2195 DD25 F90A 48A6" /* <.Á ..[*!•Ý%ùÂH¦ */
- $"BF92 56B9 4639 F2BD AC5F 3350 9699 14A7" /* ¿’V¹F9ò½¬_3P–™.§ */
- $"30A2 4B91 C33D 3175 F806 15AA 4B01 558F" /* 0¢K‘Ã=1uø..ªK.U */
- $"400B 8148 DAF5 29FD 0561 1CA8 7239 51F4" /* @.HÚõ)ý.a.¨r9Qô */
- $"A169 A92B EE2F 4F3D 2F96 029B 186B 7219" /* ¡i©+î/O=/–.›.kr. */
- $"C673 0E85 6FAC 9889 C64A 90AE DBAF E8E3" /* Æs.…o¬˜‰ÆJ®Û¯èã */
- $"6607 DF2A C332 C690 840A 817A ABFF 3302" /* f.ß*Ã2Æ„Âz«ÿ3. */
- $"1464 A65F E1B3 04B0 90C6 51E5 6A2E 7EA2" /* .d¦_á³.°ÆQåj.~¢ */
- $"9222 EABA 0632 2F13 B1A3 2337 85B4 E390" /* ’"êº.2/.±£#7…´ã */
- $"766A 98DB BDDD 9813 F7BD 8AEA 1AB2 BEEC" /* vj˜Û½Ý˜.÷½Šê.²¾ì */
- $"BEE3 F4B7 EE35 6BB8 ADE1 E772 AEB0 7E66" /* ¾ãô·î5k¸­áçr®°~f */
- $"3F99 05C1 3339 69B2 C1D5 4CC7 DB0B 3C67" /* ?™.Á39i²ÁÕLÇÛ.<g */
- $"7F80 43C8 7B29 FA49 8C64 3FEB 6406 35FE" /* .€CÈ{)úIŒd?ëd.5þ */
- $"FAEB 4922 9410 5352 D4C0 00CB 72EA 56CE" /* úëI"”.SRÔÀ.ËrêVÎ */
- $"22F8 673A D3E8 AAFA E992 5B7F 827C A83D" /* "øg:Óèªúé’[.‚|¨= */
- $"586F 54B4 69F8 C6B7 FF14 CFD4 4069 C50F" /* XoT´iøÆ·ÿ.ÏÔ@iÅ. */
- $"9E23 797E DE78 5B86 FCAE BDE5 B920 9551" /* ž#y~Þx[†ü®½å¹ •Q */
- $"22EC 4155 0582 10F4 BF8C 144A 3251 97F3" /* "ìAU.‚.ô¿Œ.J2Q—ó */
- $"2E7D 1E04 969B 4C15 8BDB FAC1 9743 2B6C" /* .}..–›L.‹ÛúÁ—C+l */
- $"6EF5 C95E 47CB A380 A635 C17D AD97 42EA" /* nõÉ^GË£€¦5Á}­—Bê */
- $"88A1 A63E FC76 A19C AE08 C868 115F 098D" /* ˆ¡¦>üv¡œ®.Èh._Æ */
- $"A1BE 16D4 3BF4 91C9 6CF1 DBE0 E0CA 0DAA" /* ¡¾.Ô;ô‘ÉlñÛààÊ.ª */
- $"EFCB 2A06 908B 7BAC CCF3 4CF8 179A 615E" /* ïË*.‹{¬ÌóLø.ša^ */
- $"590D AB18 CB49 E032 B8ED 2A8E 584A ACDC" /* Y.«.ËIà2¸í*ŽXJ¬Ü */
- $"4797 F732 B8C9 24A4 0E5C 85A0 FED8 E30A" /* G—÷2¸É$¤.\… þØã */
- $"ECBF 08FB CDC1 E09D 9556 837A E086 95AC" /* ì¿.ûÍÁà•Vƒzà†•¬ */
- $"BA2C E411 756E F132 9CE6 EDC4 6C90 B09E" /* º,ä.unñ2œæíÄl°ž */
- $"3C59 DE78 44D0 E445 BCA0 3AE0 05D9 7440" /* <YÞxDÐäE¼ :à.Ùt@ */
- $"F09F 10EA E0BA 4596 84F5 81A2 550E 57A7" /* ðŸ.êàºE–„õ¢U.W§ */
- $"F2A8 B2DD D612 A18F D74A 671D B70C 994A" /* ò¨²ÝÖ.¡×Jg.·.™J */
- $"9441 8E10 12B8 80F0 6249 2075 CD39 3667" /* ”AŽ..¸€ðbI uÍ96g */
- $"6632 AFDD 5E48 6B22 15CC 179A C6FA 47AE" /* f2¯Ý^Hk".Ì.šÆúG® */
- $"66AF 7AFB 033D 03F1 B829 B852 F1BF 55DB" /* f¯zû.=.ñ¸)¸Rñ¿UÛ */
- $"17F6 E1EF A955 F266 ACFE 75F4 34FC 38B0" /* .öáï©Uòf¬þuô4ü8° */
- $"0068 7DD6 016E 98D4 57DB 6220 D269 4BE9" /* .h}Ö.n˜ÔWÛb ÒiKé */
- $"8007 22E8 9D82 8FCE EB41 317B D0FA 323B" /* €."è‚ÎëA1{Ðú2; */
- $"B2C0 06D3 99E3 ED9A 2423 78CD AE34 CF5B" /* ²À.Ó™ãíš$#xÍ®4Ï[ */
- $"58DA 8F69 9604 4804 8682 B58C C1DA 1E21" /* XÚi–.H.†‚µŒÁÚ.! */
- $"0E4E F709 83E1 B335 F208 6565 C882 70A0" /* .N÷ƃá³5ò.eeÈ‚p  */
- $"2F58 5379 3999 7F2E E63D 81E4 C2EB 58E3" /* /XSy9™..æ=äÂëXã */
- $"4605 35E7 76D7 C7D0 AEDA 26C5 8BB6 0F99" /* F.5çv×ÇЮÚ&Å‹¶.™ */
- $"77C0 D3D6 9870 8279 4C2E 29C6 518F 13E6" /* wÀÓÖ˜p‚yL.)ÆQ.æ */
- $"1373 FCB8 FD55 3D8F 8322 F8F4 CD80 3C09" /* .sü¸ýU=ƒ"øôÍ€<Æ */
- $"1496 931A E1BF 0AE6 2842 6FF7 6986 6AEE" /* .–“.á¿Âæ(Bo÷i†jî */
- $"1AE9 FF0A 947D E3F6 D93F B59B F6D5 5FB6" /* .éÿ”}ãöÙ?µ›öÕ_¶ */
- $"AAC7 EDD1 1FDB 5A5F 5549 7D55 2E1F B6A4" /* ªÇíÑ.ÛZ_UI}U..¶¤ */
- $"FDAA F7D4 DF7D 4E80 F173 72EC 2AD6 46CC" /* ýª÷Ôß}N€ñsrì*ÖFÌ */
- $"6653 9F8A F548 8CD9 F7CC 0758 DFBD 1976" /* fSŸŠõHŒÙ÷Ì.Xß½.v */
- $"0832 03BE 1A6C 242F 4978 025D 37A6 D46A" /* .2.¾.l$/Ix.]7¦Ôj */
- $"B859 037D 5250 D0D6 8FC0 4C05 AAAB 7F38" /* ¸Y.}RPÐÖÀL.ª«.8 */
- $"799B 43F9 E370 D367 B412 8CC2 F941 E270" /* y›CùãpÓg´.ŒÂùAâp */
- $"A967 1978 577B 7A22 541A 7DDD A593 75E5" /* ©g.xW{z"T.}Ý¥“uå */
- $"6B05 D950 D953 DA5E 7EBF D5D3 4314 5006" /* k.ÙPÙSÚ^~¿ÕÓC.P. */
- $"8EC3 8474 6B41 83B3 7B16 9C95 721B 5405" /* ŽÃ„tkAƒ³{.œ•r.T. */
- $"F4AE A41F 92D8 56DA F2C9 4BF8 5B0A EBC6" /* ô®¤.’ØVÚòÉKø[ÂëÆ */
- $"29D5 F4F3 36B9 A6D7 3BC4 75D7 972C 7465" /* )Õôó6¹¦×;Äu×—,te */
- $"CCBE 21FA 6EAF 6B26 465B 4676 356D E640" /* ̾!ún¯k&F[Fv5mæ@ */
- $"04C3 0E39 C431 FBA5 2B53 E001 8F9D 37F5" /* .Ã.9Ä1û¥+Sà.7õ */
- $"F289 EC84 85B8 5FC3 F74A 734B E0B1 ED8C" /* ò‰ì„…¸_Ã÷JsKà±íŒ */
- $"5DF4 6678 22E4 887C A45B 1478 DFC3 A9E9" /* ]ôfx"äˆ|¤[.xßéé */
- $"F234 5723 01B3 2685 2754 8133 8699 21C8" /* ò4W#.³&…'T3†™!È */
- $"180A 27F8 174C FED5 8F71 4082 C4E8 DB83" /* .Â'ø.LþÕq@‚ÄèÛƒ */
- $"BDA4 4506 3FA4 5286 5D63 00F7 905D A740" /* ½¤E.?¤R†]c.÷]§@ */
- $"5251 07FA 22F8 1334 FBA6 5640 7199 FA41" /* RQ.ú"ø.4û¦V@q™úA */
- $"A3C7 3CC1 ECF5 7F43 A9AE FBD5 C1F0 18B3" /* £Ç<Áìõ.C©®ûÕÁð.³ */
- $"7072 4809 0A4C 8127 6E10 5F7C 335C CC28" /* prHÆÂL'n._|3\Ì( */
- $"B723 3D12 724D 3DE5 37B3 1C2A 136D 2258" /* ·#=.rM=å7³.*.m"X */
- $"DCE6 BFA4 0DAD FB6E 72C1 70F7 6D71 785D" /* Ü濤.­ûnrÁp÷mqx] */
- $"BC75 69CE CE3B CF7A 170E 8343 CBA9 DE66" /* ¼uiÎÎ;Ïz..ƒCË©Þf */
- $"06ED 779C AA9F F28D 943D 5E3E DEDE 4769" /* .íwœªŸò”=^>ÞÞGi */
- $"289C 5523 9792 EFAC 19A6 A945 B504 9446" /* (œU#—’ï¬.¦©Eµ.”F */
- $"A4DF BAA6 B5EB BAEF 7B92 3E08 6D17 870F" /* ¤ßº¦µëºï{’>.m.‡. */
- $"9E0A 487E 8A60 90B5 E555 CD4F D2F1 FE67" /* žÂH~Š`µåUÍOÒñþg */
- $"88DE BB6A E653 A2B6 F9C7 B226 2544 A167" /* ˆÞ»jæS¢¶ùDz&%D¡g */
- $"5DF7 5F35 F38B DB99 30F8 C210 AF41 C7A4" /* ]÷_5ó‹Û™0øÂ.¯AǤ */
- $"167B 30B4 8B8D 0821 4ADB EFC6 5728 A86D" /* .{0´‹.!JÛïÆW(¨m */
- $"99A8 2A1D 51E2 4CE5 AEA5 7ECC 23CB 628B" /* ™¨*.QâL宥~Ì#Ëb‹ */
- $"E438 F41A A280 CF2E 8E51 5004 A9BA 64AB" /* ä8ô.¢€Ï.ŽQP.©ºd« */
- $"B0AA 608C 8C19 38F7 567B 0C45 B7C5 0E2D" /* °ª`ŒŒ.8÷V{.E·Å.- */
- $"0F3D A192 B0F5 A567 4EE1 9FF5 F085 979A" /* .=¡’°õ¥gNáŸõð…—š */
- $"13DA 6FC3 89D0 0370 C986 5F44 AADD CAB9" /* .ÚoÉÐ.pɆ_DªÝʹ */
- $"FBD0 8CDE 18D9 8FED 715E 264F 0D69 2CEF" /* ûÐŒÞ.Ùíq^&O.i,ï */
- $"63F0 7A64 D65B 094A 6976 E6D4 E3DC 1583" /* cðzdÖ[ÆJivæÔãÜ.ƒ */
- $"FE8C BD22 992E 3FDB AF18 03A7 0A74 8333" /* þŒ½"™.?Û¯..§Âtƒ3 */
- $"76E3 5195 C7FA A180 5123 7E0C 544B 9C8C" /* vãQ•Çú¡€Q#~.TKœŒ */
- $"928D 3DF6 F330 4D6E 8049 11AF 064E 4E3B" /* ’=öó0Mn€I.¯.NN; */
- $"B937 EE03 A4D2 F530 4513 47F0 5E98 E060" /* ¹7î.¤Òõ0E.Gð^˜à` */
- $"72C6 46EC B761 FAB4 B0FA 9A80 FF78 5408" /* rÆFì·aú´°úš€ÿxT. */
- $"9152 452E 0111 2383 5E5F 6C4F FC53 0EDE" /* ‘RE...#ƒ^_lOüS.Þ */
- $"1092 66D3 5F38 1AC8 1412 561A 4017 9110" /* .’fÓ_8.È..V.@.‘. */
- $"CA19 3E6F 8803 0908 5F57 A2E2 4744 E3C4" /* Ê.>oˆ.Æ._W¢âGDãÄ */
- $"F1BF 49F6 836F E294 610B 4098 2761 1502" /* ñ¿Iöƒoâ”a.@˜'a.. */
- $"CCB2 0C11 81DD 05B4 ACD8 8F28 C5DD 1DD8" /* ̲..Ý.´¬Ø(ÅÝ.Ø */
- $"58E0 C1E1 70A8 42BF 456F FE20 1261 1F81" /* XàÁáp¨B¿Eoþ .a. */
- $"08AC FEB1 F89C 3576 EF94 A20C 255F 3B3F" /* .¬þ±øœ5v.%_;? */
- $"5E6B B0C0 4B3F EADC 8536 55E9 8144 C946" /* ^k°ÀK?êÜ…6UéDÉF */
- $"7613 8662 DCB1 C761 2BDA 412D C7D6 2D5C" /* v.†bܱÇa+ÚA-ÇÖ-\ */
- $"BCC0 F84E 54E4 9B0B BDF7 4F45 FCA6 D6AE" /* ¼ÀøNTä›.½÷OEü¦Ö® */
- $"1754 31D1 E6CB 94F4 D163 2B1D 017D 4171" /* .T1ÑæË”ôÑc+..}Aq */
- $"ABE0 0285 395D 3D23 42D7 E641 348A 0C2E" /* «à.…9]=#B×æA4Š.. */
- $"9C16 42C9 8E99 B654 8046 C365 EA71 CE64" /* œ.BÉŽ™¶T€FÃeêqÎd */
- $"B762 0E4D 7C48 617B CDB9 6264 2C81 4A9F" /* ·b.M|Ha{͹bd,JŸ */
- $"8600 50B2 B985 EB73 DB96 82EA FF7D 1E50" /* †.P²¹…ësÛ–‚êÿ}.P */
- $"6A49 AEA3 78E3 2DFD 0D59 3013 F257 AAA9" /* jI®£xã-ý.Y0.òWª© */
- $"0E5D 81DA E983 8D48 41BE DF0B FB34 AEA5" /* .]ÚéƒHA¾ß.û4®¥ */
- $"07B6 B0AA 1E53 1D9F B9C7 4CE5 8D46 6151" /* .¶°ª.S.Ÿ¹ÇLåFaQ */
- $"8000 0C24 1D66 1946 1073 4456 2361 E486" /* €..$.f.F.sDV#aä† */
- $"120F 29F0 6121 2D6A AF51 0C82 F68C B571" /* ..)ða!-j¯Q.‚öŒµq */
- $"77AD BE59 9145 D105 DE8C 9500 0000 0000" /* w­¾Y‘EÑ.ÞŒ•..... */
- $"0000 0032 BC9A BD52 00B4 6C6F 3753 1A96" /* ...2¼š½R.´lo7S.– */
- $"9B00 FCD3 F055 A11A AFB1 FB95 1610 88D0" /* ›.üÓðU¡.¯±û•..ˆÐ */
- $"8D32 9653 FC10 55FD B965 C1A9 B6BD 2245" /* 2–Sü.Uý¹eÁ©¶½"E */
- $"D48B 8230 2EF5 56F1 6618 9F91 FEC4 4106" /* Ô‹‚0.õVñf.Ÿ‘þÄA. */
- $"F23B 7C8A 0320 79EA D7A0 D75F 09BD B985" /* ò;|Š. yê× ×_ƽ¹… */
- $"C22B E2F0 0508 64BA AA2F 2414 19D7 311D" /* Â+âð..dºª/$..×1. */
- $"F709 E05C 809B 9E62 83F8 FF13 2DE3 01D6" /* ÷Æà\€›žbƒøÿ.-ã.Ö */
- $"8ADC F118 5A80 77C8 DABC 2FB5 CEF6 FCFB" /* ŠÜñ.Z€wÈÚ¼/µÎöüû */
- $"7A94 2773 6CEC FAE2 7865 753C E612 E4AF" /* z”'slìúâxeu<æ.ä¯ */
- $"657C 5C67 8FB3 1E56 A319 1ED1 FE48 0D8D" /* e|\g³.V£..ÑþH. */
- $"2431 B10B 8E15 0A4B FF7F 7EB8 D068 5015" /* $1±.Ž.ÂKÿ.~¸ÐhP. */
- $"151E C37C 0390 F6CC 64A8 0000 0000 0000" /* ..Ã|.öÌd¨...... */
- $"0000 0002 5991 79E8 2B17 082C ABCB DA90" /* ....Y‘yè+..,«ËÚ */
- $"CE92 8CB0 E992 0710 2B8F CAAB D217 C4E9" /* Î’Œ°é’..+Ê«Ò.Äé */
- $"E55E 11D2 6200 B530 5EF4 6932 1CBF EA6C" /* å^.Òb.µ0^ôi2.¿êl */
- $"E58D 2AA9 68C2 89FF 7903 A6ED D674 F1FC" /* å*©h‰ÿy.¦íÖtñü */
- $"A256 3564 F7E0 4DDF CDA1 2729 F7FF 6EB2" /* ¢V5d÷àMßÍ¡')÷ÿn² */
- $"9D35 70A9 5447 924B B8E1 71D3 4A8A DECB" /* 5p©TG’K¸áqÓJŠÞË */
- $"93E1 8FA0 140E C9B7 6124 8020 D660 3D22" /* “á ..É·a$€ Ö`=" */
- $"C708 222E 7289 B890 0002 00E1 2BC6 84B9" /* Ç.".r‰¸...á+Æ„¹ */
- $"25DF 442F 97FF 7FEF 68EC 7325 B92C A150" /* %ßD/—ÿ.ïhìs%¹,¡P */
- $"EE19 48C3 2540 0000 0000 0000 0000 0749" /* î.HÃ%@.........I */
- $"DD4A 9891 375B B0E0 C176 A698 672E F295" /* ÝJ˜‘7[°àÁv¦˜g.ò• */
- $"0311 7B3E 2B87 B4B8 7FB3 5DF7 9C67 CBEA" /* ..{>+‡´¸.³]÷œgËê */
- $"6A19 4107 C9F4 2B19 6829 179A 3FFF 7E8C" /* j.A.Éô+.h).š?ÿ~Œ */
- $"44A2 15E8 8E37 B422 F825 1862 58FF 7FFE" /* D¢.èŽ7´"ø%.bXÿ.þ */
- $"8EA1 D38C 727A 3071 1FF0 541F 6AB4 EA83" /* Ž¡ÓŒrz0q.ðT.j´êƒ */
- $"44A0 086A BAD7 6966 FC5D 0E72 A66C C301" /* D .jº×ifü].r¦lÃ. */
- $"3E1F B82C 9192 20D5 0322 858F 224C 87F5" /* >.¸,‘’ Õ."…"L‡õ */
- $"E940 85ED 7B36 EC96 D05C 21FF 7B10 59E1" /* é@…í{6ì–Ð\!ÿ{.Yá */
- $"E125 6C79 7852 2031 F3BA 34FB 6E57 BC3B" /* á%lyxR 1óº4ûnW¼; */
- $"69F0 C303 3A2A A573 D1E0 9836 C703 D02C" /* iðÃ.:*¥sÑà˜6Ç.Ð, */
- $"58CC 3DA7 FF0D 4301 F607 07C1 31FA 7F66" /* XÌ=§ÿ.C.ö..Á1ú.f */
- $"89BD A759 90CD 107A E5BD 6398 D7BE F7BB" /* ‰½§YÍ.zå½c˜×¾÷» */
- $"E273 D09A F8EE D21B 1015 A513 18F5 5C7D" /* âsКøîÒ...¥..õ\} */
- $"FD20 E7C9 C6BE 3105 7A4B 831D 251B 4C36" /* ý çÉƾ1.zKƒ.%.L6 */
- $"2A49 3EAC 1A86 9F87 09CC 0B00 2CF4 643C" /* *I>¬.†Ÿ‡ÆÌ..,ôd< */
- $"7012 8574 D28F 952D E959 1093 FE7E F021" /* p.…tÒ•-éY.“þ~ð! */
- $"028C 74ED 0E90 8DCD 5F06 B4BE EA1A 4C53" /* .Œtí.Í_.´¾ê.LS */
- $"A47F 3706 93CB 8FAB 7864 D123 4A39 B6BA" /* ¤.7.“Ë«xdÑ#J9¶º */
- $"CDCB 8AA9 2128 54FA CFB5 C4E1 F470 AD6E" /* ÍËŠ©!(TúϵÄáôp­n */
- $"6A05 07C9 72AA 562E F22F C922 BCF9 7DDF" /* j..ÉrªV.ò/É"¼ù}ß */
- $"3565 1AD4 F707 7DC0 1038 129E 4EA0 297E" /* 5e.Ô÷.}À.8.žN )~ */
- $"1037 3516 64BB FF75 539A 5C03 F7A3 C14D" /* .75.d»ÿuSš\.÷£ÁM */
- $"C617 50C8 14F1 7C95 0372 1443 C3F0 7ED4" /* Æ.PÈ.ñ|•.r.CÃð~Ô */
- $"EFDA FA88 BDD2 E947 7A43 A4A3 2339 CD58" /* ïÚúˆ½ÒéGzC¤£#9ÍX */
- $"526C 8407 8211 1949 6431 DB89 390B EB27" /* Rl„.‚..Id1Û‰9.ë' */
- $"9975 F04F D507 AC80 5D51 95B0 992A 1AC6" /* ™uðOÕ.¬€]Q•°™*.Æ */
- $"8699 86CC E64E 441C 2EFD 4F8C 70C1 DB2A" /* †™†ÌæND..ýOŒpÁÛ* */
- $"5395 8DF7 E279 AA65 BA32 2FD1 48C9 F400" /* S•÷âyªeº2/ÑHÉô. */
- $"D0EA 663D 92FF 053E 130C A1A9 491B E583" /* Ðêf=’ÿ.>..¡©I.åƒ */
- $"6133 2EE1 AFBE 86B8 D218 B698 906D A5B9" /* a3.᯾†¸Ò.¶˜m¥¹ */
- $"ACD3 9DC7 8720 C668 E134 1A1C 9C71 EA49" /* ¬ÓLJ Æhá4..œqêI */
- $"7AE9 9276 56E9 78BB 5679 18E2 6044 2763" /* zé’vVéx»Vy.â`D'c */
- $"2342 64F4 3952 2712 F704 B2E8 C1D2 35CC" /* #Bdô9R'.÷.²èÁÒ5Ì */
- $"F0AB 5ABD 61A0 1CD5 5316 0E78 22E6 B807" /* ð«Z½a .ÕS..x"æ¸. */
- $"8774 CA36 91EF 0BFF D969 6330 3900 00D1" /* ‡tÊ6‘ï.ÿÙic09..Ñ */
- $"2300 0000 0C6A 5020 200D 0A87 0A00 0000" /* #....jP .‡Â... */
- $"1466 7479 706A 7032 2000 0000 006A 7032" /* .ftypjp2 ....jp2 */
- $"2000 0000 4F6A 7032 6800 0000 1669 6864" /* ...Ojp2h....ihd */
- $"7200 0002 0000 0002 0000 0407 0701 0000" /* r............... */
- $"0000 0F63 6F6C 7201 0000 0000 0010 0000" /* ...colr......... */
- $"0022 6364 6566 0004 0000 0000 0001 0003" /* ."cdef.......... */
- $"0001 0000 0001 0000 0002 0002 0000 0003" /* ................ */
- $"0000 0000 6A70 3263 FF4F FF51 0032 0000" /* ....jp2cÿOÿQ.2.. */
- $"0000 0200 0000 0200 0000 0000 0000 0000" /* ................ */
- $"0000 0200 0000 0200 0000 0000 0000 0000" /* ................ */
- $"0004 0701 0107 0101 0701 0107 0101 FF52" /* ..............ÿR */
- $"000C 0000 0001 0105 0404 0001 FF5C 0013" /* ............ÿ\.. */
- $"2050 5858 6058 5860 5858 6058 5858 5050" /* PXX`XX`XX`XXXPP */
- $"58FF 6400 1100 014B 616B 6164 752D 7635" /* Xÿd....Kakadu-v5 */
- $"2E32 2E31 FF90 000A 0000 0000 D036 0001" /* .2.1ÿ.Â....Ð6.. */
- $"FF93 CFC2 DC03 54F9 36EC A8DC 2A8C 3701" /* ÿ“ÏÂÜ.Tù6ì¨Ü*Œ7. */
- $"118B 95C3 F2B2 5A7A 0428 C30A 2C64 B704" /* .‹•Ãò²Zz.(ÃÂ,d·. */
- $"5C3C 6DED 8696 4890 6404 5638 430C 59C5" /* \<m톖Hd.V8C.YŠ*/
- $"D913 B06B 0B08 E00E 1802 6D82 7225 E695" /* Ù.°k..à...m‚r%æ• */
- $"9F1E E7B0 D1DF 323C 61DC 1F25 E3FF 83E2" /* Ÿ.ç°Ñß2<aÜ.%ãÿƒâ */
- $"A49A DED4 4495 A948 5B70 9E5A 01F1 2431" /* ¤šÞÔD•©H[pžZ.ñ$1 */
- $"8EE5 2B54 2863 9041 FAE9 9E9F 1B85 E206" /* Žå+T(cAú鞟.…â. */
- $"4104 106C 5027 632A 8716 C3A5 F047 B3D5" /* A..lP'c*‡.Ã¥ðG³Õ */
- $"EE2B 19CD 2B75 17D8 DFB6 E2BF 491E A41F" /* î+.Í+u.Ø߶â¿I.¤. */
- $"BC48 3493 DEFB 453D 64DE DEA0 68DB EF5B" /* ¼H4“ÞûE=dÞÞ hÛï[ */
- $"1E69 8F3F C55C 1FF6 1823 1543 F483 DF20" /* .i?Å\.ö.#.Côƒß */
- $"F5B4 08F4 5D20 4DF0 7D7D 2007 2ACA 5B5E" /* õ´.ô] Mð}} .*Ê[^ */
- $"159F EF4A 505D 811D A8A3 5476 5539 B45B" /* .ŸïJP].¨£TvU9´[ */
- $"3113 1AC7 00F3 F1A7 E9E3 9E88 5D91 6CD5" /* 1..Ç.óñ§é㞈]‘lÕ */
- $"2CC0 F92B 2063 FF29 4B0E 775A 06EE 75CC" /* ,Àù+ cÿ)K.wZ.îuÌ */
- $"DA54 AC2F B72D 1C25 1E46 A4F8 C3E1 7D8D" /* ÚT¬/·-.%.F¤øÃá} */
- $"85AE BBE6 3DBE EC4A 35F7 3B36 1FBF BC38" /* …®»æ=¾ìJ5÷;6.¿¼8 */
- $"2DC1 785C D644 2BED AB51 1950 2643 8730" /* -Áx\ÖD+í«Q.P&C‡0 */
- $"2AE9 E4EB 1B8E 8F90 BA0C FF2F 6F65 5F28" /* *éäë.Žº.ÿ/oe_( */
- $"1A3F 9398 FF20 01A2 69A0 02C9 8D1B C3EA" /* .?“˜ÿ .¢i .É.Ãê */
- $"A600 6417 3CA3 9E84 93EF 063D 59DC 702C" /* ¦.d.<£ž„“ï.=YÜp, */
- $"959D C3A6 B1ED DEF1 F321 5BA6 FCCD 7762" /* •Ã¦±íÞñó![¦üÍwb */
- $"6C23 7398 AA59 4BBA 0052 B8A7 0608 1AAC" /* l#s˜ªYKº.R¸§...¬ */
- $"5B2E AF60 17F4 278E 6433 6F75 7839 CED2" /* [.¯`.ô'Žd3oux9ÎÒ */
- $"F32E 5D7D 9D40 B145 4CFB A25C D8D7 4BCB" /* ó.]}@±ELû¢\Ø×KË */
- $"956D 88DD 4B92 64BF 4CD4 AFD5 6E56 9859" /* •mˆÝK’d¿LÔ¯ÕnV˜Y */
- $"ABEF BB40 AD0E 6E1F 9B3B 16A3 D9D3 58DF" /* «ï»@­.n.›;.£ÙÓXß */
- $"584E C303 1DAD D18B 6082 9C29 88EB 5163" /* XNÃ..­Ñ‹`‚œ)ˆëQc */
- $"A42D 061A 1570 64A9 0F1C E00D 56D9 E0CB" /* ¤-...pd©..à.VÙàË */
- $"7C66 799C 8EB4 BFCA CF5C CFC2 B611 4F0C" /* |fyœŽ´¿ÊÏ\϶.O. */
- $"AFDE 008C 3580 A270 0C1A 3737 50A1 9A89" /* ¯Þ.Œ5€¢p..77P¡š‰ */
- $"2546 BB2C 62A0 57BE 59CB C00A 1EE9 0F1D" /* %F»,b W¾YËÀÂ.é.. */
- $"C528 40D4 EA69 D281 AED4 B078 F27A 0B42" /* Å(@ÔêiÒ®Ô°xòz.B */
- $"7AD2 DADD 146B 7FFF 223D 6A74 2041 4FCF" /* zÒÚÝ.k.ÿ"=jt AOÏ */
- $"46E1 60C8 9ABE 841E E18D 1712 DB6D 902B" /* Fá`Èš¾„.á..Ûm+ */
- $"7BE6 56DA 7E4B 1704 A373 2802 B120 0184" /* {æVÚ~K..£s(.± .„ */
- $"0681 4499 2739 CE73 9CE8 99D8 C352 337C" /* .D™'9Îsœè™ØÃR3| */
- $"06AB BB71 6257 16EF B535 4972 8C2F 2EE0" /* .«»qbW.ïµ5IrŒ/.à */
- $"85CC 8431 D867 47EE CC43 6E87 A485 2316" /* …Ì„1ØgGîÌCn‡¤…#. */
- $"4927 AE22 C12D 49CE 739C E61C 97D0 99CC" /* I'®"Á-IÎsœæ.—Ð™Ì */
- $"3DC5 F26B 1A31 E742 3E56 464B 2944 108E" /* =Åòk.1çB>VFK)D.Ž */
- $"CB0C F4C7 E144 47E1 47C1 F6BD 8089 21DB" /* Ë.ôÇáDGáGÁö½€‰!Û */
- $"8279 4533 01BF B9CC C444 AD53 5F75 D706" /* ‚yE3.¿¹ÌÄD­S_u×. */
- $"3FDD CA27 5D6C 9F54 1CCF F838 38E4 B2E4" /* ?ÝÊ']lŸT.Ïø88ä²ä */
- $"F9FF 429F 59FE D27B 4A5E A69F 2C21 38F6" /* ùÿBŸYþÒ{J^¦Ÿ,!8ö */
- $"5A74 D405 2FEE 50B8 E5F1 C489 2693 5B33" /* ZtÔ./îP¸åñĉ&“[3 */
- $"D2C2 9DEC 68ED F55C 1FAC 1401 8D66 795A" /* ÒÂìhíõ\.¬..fyZ */
- $"F5F3 27A3 5874 6681 9AC6 F41D A4E6 40DA" /* õó'£XtfšÆô.¤æ@Ú */
- $"3EE5 CCEE 340C AF72 87FD 6B2A EB94 88EC" /* >åÌî4.¯r‡ýk*딈ì */
- $"A61D A536 7AC2 C6B8 85D9 CEBD 146C 83B5" /* ¦.¥6zÂƸ…Ùν.lƒµ */
- $"F5E0 A3C7 B524 BC64 B6B5 91A6 BF91 C547" /* õà£Çµ$¼d¶µ‘¦¿‘ÅG */
- $"BD87 811F D58E 8E51 BB89 FA6C 5257 33D9" /* ½‡.ÕŽŽQ»‰úlRW3Ù */
- $"A964 A4AB 3BB9 9608 BECC 0D9C D6B9 3D3A" /* ©d¤«;¹–.¾Ì.œÖ¹=: */
- $"CB64 28BE 3B07 6318 DF9D C134 9F16 567A" /* Ëd(¾;.c.ßÁ4Ÿ.Vz */
- $"8127 5FFD F396 BA0C B86F AA17 2301 022A" /* '_ýó–º.¸oª.#..* */
- $"3742 CE95 B1AF F858 C503 8156 35E0 8F2C" /* 7BΕ±¯øXÅ.V5à, */
- $"67D7 2D41 1F0B 5284 1535 AF16 6540 FB65" /* g×-A..R„.5¯.e@ûe */
- $"65BC 5F6B 136D 73A5 1C5D 3D92 FF5F 8494" /* e¼_k.ms¥.]=’ÿ_„” */
- $"FDBF E0C5 821F 072A 0EEB B855 6B42 CEE8" /* ý¿àÅ‚..*.ë¸UkBÎè */
- $"ABEE 381E 894E DF1E 29DD 4B78 3F0A F5EB" /* «î8.‰Nß.)ÝKx?Âõë */
- $"B9F8 61B8 8266 3BD8 A2AC 5BC1 38F4 5098" /* ¹øa¸‚f;Ø¢¬[Á8ôP˜ */
- $"3951 2437 1798 7BF9 EA00 12BF CF3E 9166" /* 9Q$7.˜{ùê..¿Ï>‘f */
- $"8253 6FF0 B942 70D7 C729 0866 33F7 3484" /* ‚Soð¹Bp×Ç).f3÷4„ */
- $"ADF8 C3D2 4EF6 1DF4 0E6F 8E64 B470 1D5E" /* ­øÃÒNö.ô.oŽd´p.^ */
- $"F311 9BD1 EDE1 BA5D 7601 2053 D70A FDCD" /* ó.›Ñíáº]v. S×ÂýÍ */
- $"82C0 1BDA A35C FAD2 67AD E569 7851 10A7" /* ‚À.Ú£\úÒg­åixQ.§ */
- $"EF9A 3533 EC03 E813 08B6 D984 1A1D 3DC0" /* ïš53ì.è..¶Ù„..=À */
- $"7C8E E03E 4A44 03E4 7894 FF1F 080E 2BFD" /* |Žà>JD.äx”ÿ...+ý */
- $"EEB4 E64A C757 389B 5780 3AF8 248C 580D" /* î´æJÇW8›W€:ø$ŒX. */
- $"461B D417 66BA CEB2 2042 3C84 DAF9 C127" /* F.Ô.fºÎ² B<„ÚùÁ' */
- $"63E9 168C A9E3 D418 61E8 C46C CF01 F59B" /* cé.Œ©ãÔ.aèÄlÏ.õ› */
- $"4518 8833 3E62 5B14 BFD1 41A8 45D6 D311" /* E.ˆ3>b[.¿ÑA¨EÖÓ. */
- $"8431 80DB 1FD5 5839 DE81 BCD9 EAFB EE26" /* „1€Û.ÕX9Þ¼Ùêûî& */
- $"33DD 9E73 0B6F F957 26EE E7BA E0DA FF22" /* 3Ýžs.oùW&îçºàÚÿ" */
- $"EA50 24BF A182 089D 749A 6AAF BFF2 224D" /* êP$¿¡‚.tšj¯¿ò"M */
- $"30D4 11D0 E07A A012 587A 0633 92B4 CBFC" /* 0Ô.Ðàz .Xz.3’´Ëü */
- $"8E1B E5AC 9025 A74D 2819 3F9D 8132 B795" /* Ž.å¬%§M(.?2·• */
- $"458E 4651 1589 158D D24C A5B0 CBFA 359E" /* EŽFQ.‰.ÒL¥°Ëú5ž */
- $"BDB0 E4FB BFE3 5854 3E88 A646 71B1 9CB2" /* ½°äû¿ãXT>ˆ¦Fq±œ² */
- $"BB4E BA8E E170 8CBF C1F5 3141 F537 C0FA" /* »NºŽápŒ¿Áõ1Aõ7Àú */
- $"9780 6448 BA3B 94D6 3E8B 7AF0 0B5A C7A2" /* —€dHº;”Ö>‹zð.ZÇ¢ */
- $"4D05 C6BB 7F47 7102 F66E E4E8 3681 1C97" /* M.Æ».Gq.önäè6.— */
- $"0996 4491 F713 2A24 3756 2715 4B55 762F" /* Æ–D‘÷.*$7V'.KUv/ */
- $"78CB 2608 0563 73F7 5626 9F35 0C54 6822" /* xË&..cs÷V&Ÿ5.Th" */
- $"F061 792A 4AFC 163A 9F83 8F82 638B 524D" /* ðay*Jü.:Ÿƒ‚c‹RM */
- $"C21C 3735 DB76 6F4B 01F2 3E7E 5755 5945" /* Â.75ÛvoK.ò>~WUYE */
- $"6149 AAEE 1A88 7748 DC47 79E4 0660 318C" /* aIªî.ˆwHÜGyä.`1Œ */
- $"AA94 E92D 9879 C9C1 AC17 C828 7BBB 997A" /* ª”é-˜yÉÁ¬.È({»™z */
- $"315E 858F F31D 3522 A6D2 B3BD E548 DBA2" /* 1^…ó.5"¦Ò³½åHÛ¢ */
- $"3274 749B 11C1 9570 D715 0350 4CC4 6820" /* 2tt›.Á•p×..PLÄh */
- $"560A 8542 A38D 913B 3863 FF5C 97F2 9BA5" /* VÂ…B£‘;8cÿ\—ò›¥ */
- $"893F 6C9B 15A2 EE40 BCD6 2676 80A9 AC89" /* ‰?l›.¢î@¼Ö&v€©¬‰ */
- $"9054 849D 859C 8DCD 181B 64F4 6D7B 71B4" /* T„…œÍ..dôm{q´ */
- $"FBD3 0C84 21D4 CC6C CF84 F40A A3CD C958" /* ûÓ.„!ÔÌlÏ„ô£ÍÉX */
- $"928E 97E5 346C 6497 2888 7903 5B0B 3277" /* ’Ž—å4ld—(ˆy.[.2w */
- $"B4D6 9AA4 86C3 C691 CA1A 3C92 FCFB 02DE" /* ´Öš¤†ÃÆ‘Ê.<’üû.Þ */
- $"A25E 5C5C C6A8 1CE2 F5B5 88AB 3673 F912" /* ¢^\\ƨ.âõµˆ«6sù. */
- $"96AF E6BC 67FF 40CC 068D C6E3 8435 48AF" /* –¯æ¼gÿ@Ì.Æã„5H¯ */
- $"B929 F509 0F59 3410 A9A6 1087 8352 11EC" /* ¹)õÆ.Y4.©¦.‡ƒR.ì */
- $"23CF CD2E 3F05 487E 0740 9BE7 236F 56FB" /* #ÏÍ.?.H~.@›ç#oVû */
- $"D0F4 677F 9514 C6E9 50BB A61A 6135 73FB" /* Ðôg.•.ÆéP»¦.a5sû */
- $"37AA FA5C 0967 671C 8485 5326 6EB5 4955" /* 7ªú\Ægg.„…S&nµIU */
- $"1AAE 5FCE C271 D992 9E8C B0DF 7795 E0F2" /* .®_ÎÂqÙ’žŒ°ßw•àò */
- $"A17A B50F E53A FE12 756F D1A1 5CE1 7C9B" /* ¡zµ.å:þ.uoÑ¡\á|› */
- $"D185 2C1A 9224 BC62 5C98 FA35 1649 6EA7" /* Ñ…,.’$¼b\˜ú5.In§ */
- $"4C7C C191 DF92 9D7A 6FE9 71D9 9A11 5A19" /* L|Á‘ß’zoéqÙš.Z. */
- $"214D F951 38FA C459 E39A 6DAE 1253 31DF" /* !MùQ8úÄYãšm®.S1ß */
- $"B335 3337 39D2 7591 BFC1 31E6 887A 8BAB" /* ³5379Òu‘¿Á1æˆz‹« */
- $"ECCD 7A58 8E4A AD65 A7E1 5FC6 8EB0 DA82" /* ìÍzXŽJ­e§á_ÆŽ°Ú‚ */
- $"0F81 6849 5CE5 AB32 B763 1227 3F4C 5691" /* .hI\å«2·c.'?LV‘ */
- $"43C7 DD24 E8D9 C4F3 7BB0 4666 7A24 1C5B" /* CÇÝ$èÙÄó{°Ffz$.[ */
- $"F57D 719F 2BDB 3794 66BA BBB6 9D8D A662" /* õ}qŸ+Û7”fº»¶¦b */
- $"CF99 4DDC E533 96D6 EEE0 3FC7 BFB8 B1B7" /* Ï™MÜå3–Öîà?Ç¿¸±· */
- $"9AE3 57C7 E1A8 B1F8 6C5C 3F0D 19C1 812D" /* šãWÇᨱøl\?..Á- */
- $"8D31 C88B C396 B5E7 3CE0 4E2C AE73 7876" /* 1ȋÖµç<àN,®sxv */
- $"0436 A295 BEC6 BDF1 C604 C41C 94E6 E7C1" /* .6¢•¾Æ½ñÆ.Ä.”æçÁ */
- $"AC78 356A B92A DB37 3360 3372 6638 0C5C" /* ¬x5j¹*Û73`3rf8.\ */
- $"F388 7CDE 4045 060F E713 C4C3 321E E08B" /* óˆ|Þ@E..ç.ÄÃ2.à‹ */
- $"0810 71EE A6AB C032 2B85 C34C 2671 8143" /* ..qÀ2+…ÃL&qC */
- $"AFDE 07D1 A40C D86A ADBE B961 EAA3 54BD" /* ¯Þ.Ѥ.Øj­¾¹aê£T½ */
- $"804D 6FA9 AA3F 7FBE BCD9 E785 A230 EA4E" /* €Mo©ª?.¾¼Ùç…¢0êN */
- $"1C08 1DF6 8373 7754 5039 7854 1192 1512" /* ...öƒswTP9xT.’.. */
- $"B956 E9A7 575E E3DB F5F9 4B02 F739 F2BB" /* ¹Vé§W^ãÛõùK.÷9ò» */
- $"91B2 73E1 3D19 EBB6 AD2F 291C 5BAC 5EEA" /* ‘²sá=.붭/).[¬^ê */
- $"EEDF 8DA7 5FCA 8E8C 952D 8FD0 441C 5BA4" /* îߧ_ÊŽŒ•-ÐD.[¤ */
- $"8AF6 21BE 1FAF DAE3 DADD EA91 EF73 58A0" /* Šö!¾.¯ÚãÚÝê‘ïsX  */
- $"29E6 89B2 E279 B02A D092 DD08 6187 9095" /* )扲ây°*Ð’Ý.a‡• */
- $"5C85 C903 0DD2 9ED3 538B D9BB E936 8ABB" /* \…É..ÒžÓS‹Ù»é6Š» */
- $"E203 DD03 2944 5317 7BC3 0297 2125 F198" /* â.Ý.)DS.{Ã.—!%ñ˜ */
- $"D117 8DDB E382 71F8 D0A7 14B1 6D7A A0EB" /* Ñ.Ûã‚qøЧ.±mz ë */
- $"7C6F 7651 D2EC ECA7 F670 D09F 6CF6 30DB" /* |ovQÒìì§öpПlö0Û */
- $"0830 39B5 BC45 3915 4054 4490 A7BA 5CEC" /* .09µ¼E9.@TD§º\ì */
- $"D37B FBC2 7890 B18F DEEA 4966 D46D 5FD2" /* Ó{ûÂx±ÞêIfÔm_Ò */
- $"7811 AAD0 8EBF FB40 0F30 D8A4 2B71 5A03" /* x.ªÐŽ¿û@.0ؤ+qZ. */
- $"636A C360 C889 891D D420 A828 E337 41CC" /* cjÃ`ȉ‰.Ô ¨(ã7AÌ */
- $"3314 5473 B91F 7B78 2B3B AC7A 1127 F2DE" /* 3.Ts¹.{x+;¬z.'òÞ */
- $"E997 2101 6008 26AE 43D5 7CE7 8532 B9CE" /* é—!.`.&®CÕ|ç…2¹Î */
- $"A81A 710E 5D87 49D7 3EF6 65A3 D533 977E" /* ¨.q.]‡I×>öe£Õ3—~ */
- $"7BE9 0CA7 8B28 9ADA AF4F 45A5 99BD E21D" /* {é.§‹(šÚ¯OE¥™½â. */
- $"D4B1 BB33 2508 C8D1 31E5 E9FB F917 A8E1" /* Ô±»3%.ÈÑ1åéûù.¨á */
- $"2955 9008 F531 9010 575A 3AFB 59F4 CD63" /* )U.õ1.WZ:ûYôÍc */
- $"3EEE 2409 BCD4 E5F1 1418 6155 B6D7 A94B" /* >î$ƼÔåñ..aU¶×©K */
- $"1D48 79A8 2F32 0770 476B CE28 023A DC86" /* .Hy¨/2.pGkÎ(.:܆ */
- $"E008 813B E64A 39F5 58CE 3E75 DAA6 BD7A" /* à.;æJ9õXÎ>uÚ¦½z */
- $"1528 FF50 0738 C132 5569 3C99 C4BC A20F" /* .(ÿP.8Á2Ui<™Ä¼¢. */
- $"6DED 9310 6FE1 8BE4 BF4D D0B1 993E 0FD3" /* mí“.oá‹ä¿Mб™>.Ó */
- $"4938 1302 E4A8 FDA2 A7D2 4615 CD89 1E52" /* I8..ä¨ý¢§ÒF.͉.R */
- $"4160 51F8 BABB FEED 4281 0E0C 31CD 91D7" /* A`Qøº»þíB..1Í‘× */
- $"C7CF E302 E155 4188 0F06 097F 6906 2EC9" /* ÇÏã.áUAˆ..Æ.i..É */
- $"BE00 A1FB 0D99 8FB1 3B3D E3D3 70B8 4296" /* ¾.¡û.™±;=ãÓp¸B– */
- $"F199 E066 15B5 920C 38A2 695F F2E8 81E1" /* ñ™àf.µ’.8¢i_òèá */
- $"E0EC 34E5 97B3 9580 459F A2D9 E267 B847" /* àì4å—³•€EŸ¢Ùâg¸G */
- $"E302 3AA0 8631 8C61 5F8E 88DE 2FBB 394B" /* ã.: †1Œa_ŽˆÞ/»9K */
- $"B9EC 234B 6515 BDF3 BA80 AA30 3D50 2F90" /* ¹ì#Ke.½óº€ª0=P/ */
- $"C26A D743 2198 707A 2DC1 9C64 1647 1FA3" /* Âj×C!˜pz-Áœd.G.£ */
- $"43A2 B1C7 C95D 1E19 9650 E616 F24B C118" /* C¢±ÇÉ]..–Pæ.òKÁ. */
- $"FB68 CE23 485E BF50 ACF8 F669 B5A3 92AA" /* ûhÎ#H^¿P¬øöiµ£’ª */
- $"5625 BF48 8584 A6E7 DAC0 E203 2AF0 89A0" /* V%¿H…„¦çÚÀâ.*ð‰  */
- $"DB92 4924 9249 1BF5 D855 0470 51D0 AAE2" /* Û’I$’I.õØU.pQЪâ */
- $"A1E5 FBC9 CB80 1798 2EB3 EB1E 9FD4 46E7" /* ¡åûÉË€.˜.³ë.ŸÔFç */
- $"63DB F02E 204B D35F 54DE 0FD3 2F81 FB63" /* cÛð. KÓ_TÞ.Ó/ûc */
- $"9CEC 37F1 C9FF 5B63 B13D BFBD 1169 0415" /* œì7ñÉÿ[c±=¿½.i.. */
- $"0E97 DA89 25E3 92C7 01F5 50E6 2181 A536" /* .—Ú‰%ã’Ç.õPæ!¥6 */
- $"4020 C49B 1977 1BF5 5226 FD7D 668A D76F" /* @ Ä›.w.õR&ý}fŠ×o */
- $"2954 58F1 F44F 2935 F136 18BD C844 05FD" /* )TXñôO)5ñ6.½ÈD.ý */
- $"E325 9012 9E92 6EC3 E822 D06F A958 C54C" /* ã%.ž’nÃè"Ðo©XÅL */
- $"6A4D 0A98 093C 481D 1424 7964 E810 7A60" /* jM˜Æ<H..$ydè.z` */
- $"F2C0 8287 A7F4 B307 FBDF 2550 567E 01EA" /* òÀ‚‡§ô³.ûß%PV~.ê */
- $"2C45 4614 9A0A 04E8 397B 3DEC 6CDA CA95" /* ,EF.šÂ.è9{=ìlÚÊ• */
- $"B754 699A FF29 B46B D6E3 BB8C 153C AEC0" /* ·Tišÿ)´kÖ㻌.<®À */
- $"BEFF 46AD 744B B945 4C07 F7F7 178D 059E" /* ¾ÿF­tK¹EL.÷÷..ž */
- $"2E80 10C4 6DD6 F19E B649 73D6 8C57 7A6C" /* .€.ÄmÖñž¶IsÖŒWzl */
- $"45DE 3D43 22DE C54A DFCD 64EA 9D77 1AC6" /* EÞ=C"ÞÅJßÍdêw.Æ */
- $"E15E A9A7 0D83 D53C 100B EC25 2B93 1D27" /* á^©§.ƒÕ<..ì%+“.' */
- $"367A 864E D9C4 F0B9 DF5C 538D B2C0 24EE" /* 6z†NÙÄð¹ß\S²À$î */
- $"46E7 424C 2127 6BED B492 3354 86C9 D855" /* FçBL!'kí´’3T†ÉØU */
- $"317B 6BE2 8205 C07C 9A42 03E4 D6B0 0F93" /* 1{kâ‚.À|šB.äÖ°.“ */
- $"4400 AFF0 AE8C D6D6 6729 AEBE 9CDE 5C69" /* D.¯ð®ŒÖÖg)®¾œÞ\i */
- $"D95C 01A0 28AF 1E57 B12C CA6D F010 ED89" /* Ù\. (¯.W±,Êmð.í‰ */
- $"4C46 38AA BAFC D67E 9E98 C6CA 85E4 433E" /* LF8ªºüÖ~ž˜ÆÊ…äC> */
- $"C450 03B7 E8DE 17B3 9CE7 02E1 BE72 100B" /* ÄP.·èÞ.³œç.á¾r.. */
- $"2EF5 787D 0D12 FC3B 855A 3F97 1850 05EF" /* .õx}..ü;…Z?—.P.ï */
- $"A05D 7CC2 405B BA6D 9175 7C99 BE1C 2370" /*  ]|Â@[ºm‘u|™¾.#p */
- $"1F57 2085 13F8 B672 728D 1152 8232 1EE4" /* .W ….ø¶rr.R‚2.ä */
- $"A666 BFD0 06A8 6CFF 3D73 D895 5968 A54A" /* ¦f¿Ð.¨lÿ=sØ•Yh¥J */
- $"3219 63AB D4CD 8E7D 52F3 D260 CE4D E329" /* 2.c«ÔÍŽ}RóÒ`ÎMã) */
- $"F554 C837 34CC 2866 FA1E 1F34 B209 B8C3" /* õTÈ74Ì(fú..4²Æ¸Ã */
- $"097B 8DBC 8788 F621 2A57 5468 5FD8 852B" /* Æ{¼‡ˆö!*WTh_Ø…+ */
- $"08A9 45F3 71A8 A26B F63C 2DB1 750F A833" /* .©Eóq¨¢kö<-±u.¨3 */
- $"4767 6D8A B551 FF10 9E54 AD5D EE2E 2207" /* GgmŠµQÿ.žT­]î.". */
- $"44EA 0D21 75D4 779D E96D 49FF 47CE D775" /* Dê.!uÔwémIÿGÎ×u */
- $"D7B0 2380 5F1C 4185 EF0B BECB 1A55 9696" /* ×°#€_.A…ï.¾Ë.U–– */
- $"81B8 94F2 4F5B 07D8 D5EC 9E2A 049D 5E87" /* ¸”òO[.ØÕìž*.^‡ */
- $"2601 FB44 4AD5 C57B A7B0 8088 B723 134E" /* &.ûDJÕÅ{§°€ˆ·#.N */
- $"0B8A 375E B972 F34F F25A 2B68 3F15 4496" /* .Š7^¹róOòZ+h?.D– */
- $"5734 FE10 D742 67F9 9FFF 639C FAFD 23DB" /* W4þ.×BgùŸÿcœúý#Û */
- $"B90C F402 17F0 81C6 2656 EFD0 E011 C866" /* ¹.ô..ðÆ&VïÐà.Èf */
- $"15C8 4927 3415 BEC1 7876 E693 74CB DBEA" /* .ÈI'4.¾Áxvæ“tËÛê */
- $"7206 2246 23EC DCCA 51CD 72C1 8C41 1B85" /* r."F#ìÜÊQÍrÁŒA.… */
- $"AE9B 6FA5 4286 03FB 7000 D94F 5A8B 8A85" /* ®›o¥B†.ûp.ÙOZ‹Š… */
- $"2F34 7575 E7AB 08FF 3CBD 328D D95D BDF5" /* /4uuç«.ÿ<½2Ù]½õ */
- $"8070 0FAD B573 A91E 5F83 D32D 3337 A5B7" /* €p.­µs©._ƒÓ-37¥· */
- $"C6A7 3048 8D7C 3F01 F6BF 1BAB D684 0585" /* Ƨ0H|?.ö¿.«Ö„.… */
- $"798A A28D 68A6 4993 22BC F35C E3A7 BABE" /* yŠ¢h¦I“"¼ó\㧺¾ */
- $"0D5B 7E43 2B91 5DA6 6821 0495 4B22 33C0" /* .[~C+‘]¦h!.•K"3À */
- $"1217 1302 A7EB 1093 C8BD 3622 F0FD 14C3" /* ....§ë.“Ƚ6"ðý.à */
- $"EDBA 60FA B4C2 07D5 6D80 C177 9C23 24FE" /* íº`ú´Â.Õm€Áwœ#$þ */
- $"C9E7 77A7 1945 4C1A 8945 129A 2581 498D" /* Éçw§.EL.‰E.š%I */
- $"F2BD 5AD6 EF89 4D80 3EC2 DA29 E093 A726" /* ò½ZÖï‰M€>ÂÚ)à“§& */
- $"88F1 0796 E9F0 8F36 D342 7AD3 DEC2 2CCA" /* ˆñ.–éð6ÓBzÓÞÂ,Ê */
- $"45B9 35A0 DE31 D18B 2954 C38C 4B3A EEA2" /* E¹5 Þ1Ñ‹)TÃŒK:î¢ */
- $"5CD5 333D 6C59 23C7 17B3 C98C 65EE 8117" /* \Õ3=lY#Ç.³ÉŒeî. */
- $"22A2 574D D223 581B D09B 6473 3F85 6E2A" /* "¢WMÒ#X.Лds?…n* */
- $"81B5 F600 CAB6 1A02 3B24 D726 4344 536F" /* µö.ʶ..;$×&CDSo */
- $"99AB 09C8 96EA B41B 01C9 7AC8 9478 B8AB" /* ™«ÆÈ–ê´..ÉzÈ”x¸« */
- $"69E3 1BF1 1100 AFF3 C59C 01FB 8EF9 047D" /* iã.ñ..¯óÅœ.ûŽù.} */
- $"21EF 11DE D2CA BEE2 8372 5DDB C39C DE6E" /* !ï.ÞÒʾâƒr]ÛÃœÞn */
- $"B652 35FE FDFB F1E8 2E91 778A 86C3 3117" /* ¶R5þýûñè.‘wŠ†Ã1. */
- $"87D8 A7D5 7862 68B7 30C1 3B32 D209 0256" /* ‡Ø§Õxbh·0Á;2ÒÆ.V */
- $"2BF7 DFEF 17C3 FC30 EF1D 9327 7041 FC3C" /* +÷ßï.Ãü0ï.“'pAü< */
- $"674F 3069 DAB2 0EA5 BB48 DC2C DC66 F660" /* gO0iÚ².¥»HÜ,Üfö` */
- $"9C9B C7C8 3734 C68B 7D5A 60A1 DF3D D3A8" /* œ›ÇÈ74Æ‹}Z`¡ß=Ó¨ */
- $"E60C D15A 11C7 FB3B F75A 358E A7F7 16CB" /* æ.ÑZ.Çû;÷Z5Ž§÷.Ë */
- $"67B5 097E E2A2 DE6C E40A FD52 8F75 43EF" /* gµÆ~â¢ÞläÂýRuCï */
- $"F5DF 5A51 BBF5 A074 791F F54F 9724 23C3" /* õßZQ»õ ty.õO—$#Ã */
- $"F5E6 C4A3 E22C 1E06 3B71 A9A2 1C17 0109" /* õæÄ£â,..;q©¢...Æ */
- $"1B59 2742 AB03 0497 3E5A AD73 7FD3 DA51" /* .Y'B«..—>Z­s.ÓÚQ */
- $"9F17 A10E B9CF 7503 3395 8788 9D9D 4A58" /* Ÿ.¡.¹Ïu.3•‡ˆJX */
- $"F9B8 4A61 3DDA 7489 8086 9EAC 4D7D 62DD" /* ù¸Ja=Út‰€†ž¬M}bÝ */
- $"BF8B 9462 1CC0 6912 69BE 3BFE FED7 3174" /* ¿‹”b.Ài.i¾;þþ×1t */
- $"CAA6 A806 FF59 B963 ABEE 508B F428 D15C" /* ʦ¨.ÿY¹c«îP‹ô(Ñ\ */
- $"82FC BA30 6907 C572 F2BD C0DB E9A2 44AF" /* ‚üº0i.Årò½ÀÛé¢D¯ */
- $"EED6 81F7 C602 F802 0374 CD1D 0F41 5E2E" /* îÖ÷Æ.ø..tÍ..A^. */
- $"F54F E7AB C492 54F8 C570 48A6 1603 35D3" /* õOç«Ä’TøÅpH¦..5Ó */
- $"EA1A 6A6D FD79 27E3 F928 4E16 3A2D 43FE" /* ê.jmýy'ãù(N.:-Cþ */
- $"6C3D AFC6 FA1C 578C 7BA9 7343 5B2C 7BB9" /* l=¯Æú.WŒ{©sC[,{¹ */
- $"0614 915A 24C4 CAC1 A2D3 0EAF EAE8 7257" /* ..‘Z$ÄÊÁ¢Ó.¯êèrW */
- $"EA2D 1ED2 3FFE 26A7 3E28 28D0 1AE1 D790" /* ê-.Ò?þ&§>((Ð.á× */
- $"A25D 1C6C BA20 E196 1EEC 9720 92EE 6E62" /* ¢].lº á–.ì— ’înb */
- $"E218 5609 944E 9A2E 9228 117A 6065 93FF" /* â.VÆ”Nš.’(.z`e“ÿ */
- $"2B32 B2C1 7876 E657 E39E 8641 F202 62B4" /* +2²ÁxvæW㞆Aò.b´ */
- $"20C5 99D9 F9E5 7D83 D807 EDB7 9A34 475B" /* Å™Ùùå}ƒØ.í·š4G[ */
- $"4F45 9AE8 ACD6 3098 A0C2 8D14 CBDB 9A2B" /* OEšè¬Ö0˜ Â.ËÛš+ */
- $"0EF7 CB30 8B49 169F 1ECD 6F33 F063 65DA" /* .÷Ë0‹I.Ÿ.Ío3ðceÚ */
- $"2A2F F0B0 EE29 91F7 CA11 748C 5E4E A447" /* *.ð°î)‘÷Ê.tŒ^N¤G */
- $"0F7F 4B32 DB7A 366C 27C4 F178 33B7 5E9B" /* ..K2Ûz6l'Äñx3·^› */
- $"BAAF 29CD A3EF 39BB 5FAD AD2B 5DCA 09E8" /* º¯)Í£ï9»_­­+]ÊÆè */
- $"DB9A DD07 84DD 870E 2A4C 850B BD04 7F9A" /* ÛšÝ.„݇.*L….½..š */
- $"1354 1DAA 0819 F583 1F47 5905 6597 5F07" /* .T.ª..õƒ.GY.e—_. */
- $"7ED6 DFFA BA65 FA6C D01D F65F F833 D479" /* ~ÖßúºeúlÐ.ö_ø3Ôy */
- $"BFD3 F3D8 57BB 3718 EBC8 5A2D 732E 464E" /* ¿ÓóØW»7.ëÈZ-s.FN */
- $"6B46 9512 778B 8066 D5DA D21A 819D 5384" /* kF•.w‹€fÕÚÒ.S„ */
- $"A84C AE56 92E2 2E9A 4D27 8A21 E02D 67FC" /* ¨L®V’â.šM'Š!à-gü */
- $"EAA4 B3D5 9306 1D06 CC9A 84C8 D6C4 C7E1" /* ꤳՓ...Ìš„ÈÖÄÇá */
- $"4F47 E168 43F0 6EB1 9276 ED11 2C29 F1CB" /* OGáhCðn±’ví.,)ñË */
- $"90AB 1975 3405 422B 78EC 7776 FA5C 0A2C" /* «.u4.B+xìwvú\Â, */
- $"F4B1 4F40 32CE D338 8911 EAB4 4CFC 7765" /* ô±O@2ÎÓ8‰.ê´Lüwe */
- $"D9ED C10E 114B 0909 1122 6832 A41E 3365" /* ÙíÁ..KÆÆ."h2¤.3e */
- $"96EF FC81 A398 2FE8 0464 5D18 0C9F C1AF" /* –ïü£˜/è.d]..ŸÁ¯ */
- $"8E6F 42CA BDC9 1DC4 770E 1C2E 01BD 62DB" /* ŽoBʽÉ.Äw....½bÛ */
- $"7798 4167 FC4F B27D D7E6 32CE 7F95 954F" /* w˜AgüO²}×æ2Î.••O */
- $"653C 833E B4F1 C6C2 307E 0796 686E 6F5C" /* e<ƒ>´ñÆÂ0~.–hno\ */
- $"6EE2 6260 4C0B 5329 36D8 839E 5F08 319C" /* nâb`L.S)6؃ž_.1œ */
- $"4CAE 85DE 6B64 F427 1358 C9FF 57B9 AF78" /* L®…Þkdô'.XÉÿW¹¯x */
- $"332B 82A6 0EBF 0F83 7A3C 8004 1402 6A12" /* 3+‚¦.¿.ƒz<€...j. */
- $"FEE8 1612 2D8A 47FE 5BDE 2714 B393 E32F" /* þè..-ŠGþ[Þ'.³“ã/ */
- $"013E BD7E 14FA 285D BF61 7CDA 3A92 734A" /* .>½~.ú(]¿a|Ú:’sJ */
- $"520E 978D 8736 6AA9 847B 05C9 F28B 3D9A" /* R.—‡6j©„{.Éò‹=š */
- $"9B2E 721C 9082 3EC1 362C D516 D306 1EB9" /* ›.r.‚>Á6,Õ.Ó..¹ */
- $"A95C EC63 3111 4ED2 054A EFF8 F26A 0E36" /* ©\ìc1.NÒ.Jïøòj.6 */
- $"7445 26A0 464F CEDC 924D B183 FAEF 28F7" /* tE& FOÎÜ’M±ƒúï(÷ */
- $"AF76 2DBA F15C 4F45 4BFD E003 CDC1 A878" /* ¯v-ºñ\OEKýà.ÍÁ¨x */
- $"6FB4 207C 2A45 1ED9 CE49 2495 F6A9 77E8" /* o´ |*E.ÙÎI$•ö©wè */
- $"E7FF 7FFF 7FFF 7FFF 70EC F373 E872 28BA" /* çÿ.ÿ.ÿ.ÿpìósèr(º */
- $"A0BB 38E4 AC79 94DA 6562 832A 9A7B EEA8" /*  »8ä¬y”Úebƒ*š{î¨ */
- $"6B09 FEA7 9249 2005 E7D1 D721 4761 B6DB" /* kÆþ§’I .çÑ×!Ga¶Û */
- $"6DB6 DB6D 98C5 C208 FD98 41AA F430 3EAE" /* m¶Ûm˜ÅÂ.ý˜Aªô0>® */
- $"7118 7229 50B1 07D8 C5CA 010D 4AB4 DE82" /* q.r)P±.ØÅÊ..J´Þ‚ */
- $"53D3 E184 6561 DE5F 7236 BBF5 550D 4A83" /* SÓá„eaÞ_r6»õU.Jƒ */
- $"555B 5C0F 9C0E F052 0080 F4AC 3912 DD30" /* U[\.œ.ðR.€ô¬9.Ý0 */
- $"47C9 B77E C632 15D7 8EB6 CD51 0454 A805" /* GÉ·~Æ2.׎¶ÍQ.T¨. */
- $"2DAD F687 6CB7 B37F 2289 759F F7D5 8839" /* -­ö‡l·³."‰uŸ÷Õˆ9 */
- $"B3E6 BCA5 AA89 9D9D 599A 5BDD 54B9 7F7D" /* ³æ¼¥ª‰Yš[ÝT¹.} */
- $"2770 11ED 2217 C539 0204 16FF 728A C52A" /* 'p.í".Å9...ÿrŠÅ* */
- $"2D24 5FC7 E1D7 C47E 1DE8 C3F0 EA38 E730" /* -$_Çá×Ä~.èÃðê8ç0 */
- $"2D9D 0AC5 991A F5DD 38EC 007B A963 8B4D" /* -ÂÅ™.õÝ8ì.{©c‹M */
- $"51BA A9FC AE25 908A 1B70 9145 EBA2 38C4" /* Qº©ü®%Š.p‘Eë¢8Ä */
- $"168F 70BB 10A5 CAA5 A249 1974 03F3 AB57" /* .p».¥Ê¥¢I.t.ó«W */
- $"3611 30C5 1F14 529F 040A A8EC EBDF F2FF" /* 6.0Å..RŸ.¨ìëßòÿ */
- $"232B 83FE C2D0 59D9 93C2 2A8A F86A 997F" /* #+ƒþÂÐYÙ“Â*Šøj™. */
- $"3207 03A7 C406 E96C C96F 23F1 1490 95DF" /* 2..§Ä.élÉo#ñ.•ß */
- $"4024 67DC 3DE6 E1B1 EB60 1026 8786 531C" /* @$gÜ=æá±ë`.&‡†S. */
- $"9A51 378D EE86 881F 496C 8854 9459 7799" /* šQ7.IlˆT”Yw™ */
- $"11EC 4196 0C22 0F05 3762 D8F4 C348 7299" /* .ìA–."..7bØôÃHr™ */
- $"793E 0718 14D3 D09C C192 80E1 9F7C 5CFA" /* y>...ÓÐœÁ’€áŸ|\ú */
- $"429C 7960 2F8B 9063 C7E1 1447 7F52 D850" /* Bœy`/‹cÇá.G.RØP */
- $"B80A F1D8 BE98 DC3C 9C44 3AB7 3DA7 E08C" /* ¸Âñؾ˜Ü<œD:·=§àŒ */
- $"E7B6 07CE 2B69 C0E9 0C21 6133 1EC5 DAB5" /* ç¶.Î+iÀé.!a3.ÅÚµ */
- $"B079 413B FBA4 0259 78B8 DA3A E6D1 4AAC" /* °yA;û¤.Yx¸Ú:æÑJ¬ */
- $"2459 93C8 AD9A D69C AC40 5CF7 7385 1B18" /* $Y“È­šÖœ¬@\÷s….. */
- $"D67D 82BD 5E44 3DF8 5D2F E6D3 CE47 0191" /* Ö}‚½^D=ø]/æÓÎG.‘ */
- $"6E57 0F2F E8E8 9FF0 14BC 21F1 7720 6F34" /* nW./èèŸð.¼!ñw o4 */
- $"1EEE 5EF6 F8FD 5481 44E3 AB6B B06E 2556" /* .î^öøýTDã«k°n%V */
- $"6F07 AD65 FC95 7C32 7487 10A0 3C20 9CA7" /* o.­eü•|2t‡. < œ§ */
- $"B0EB F703 2D09 F0A6 D3FD 55F6 354B EDB0" /* °ë÷.-Æð¦ÓýUö5Kí° */
- $"179B B267 B9EB 8DA1 ED8E 7D0F 1AFF 4D50" /* .›²g¹ë¡íŽ}..ÿMP */
- $"C1C7 A686 586C 6A26 3B0B 4292 60A0 A804" /* ÁǦ†Xlj&;.B’` ¨. */
- $"04F6 5FDB 0F76 E2BC D680 20B5 46AE 399D" /* .ö_Û.vâ¼Ö€ µF®9 */
- $"CC54 82A4 1DCA 08E7 E2B4 6710 ABD8 FC18" /* ÌT‚¤.Ê.çâ´g.«Øü. */
- $"949B 7076 11CD 598E 2A8B 99FC CC28 EC17" /* ”›pv.ÍYŽ*‹™üÌ(ì. */
- $"451C DE31 F7F4 C47E 3ABB AF03 FDC6 D875" /* E.Þ1÷ôÄ~:»¯.ýÆØu */
- $"BD0C AB3E B78F F942 A53E E5F8 CA09 414D" /* ½.«>·ùB¥>åøÊÆAM */
- $"7544 D5B4 8367 3256 6D8C CB66 6DE7 E99C" /* uDÕ´ƒg2VmŒËfmçéœ */
- $"88E9 FCDC EB55 F67B 20E7 F44D 7616 6B29" /* ˆéüÜëUö{ çôMv.k) */
- $"124A C9AB 95C7 E9A8 209D EDA5 499F 2D2F" /* .JÉ«•Çé¨ í¥IŸ-/ */
- $"20E5 DE8C 2EEE 92AF 4BD6 484B 7E18 2D81" /* åÞŒ.î’¯KÖHK~.- */
- $"0502 F439 C742 BA21 693B 43C5 60DF 8BA0" /* ..ô9ÇBº!i;CÅ`ß‹  */
- $"9EAC 0A98 DFE4 DB4B 0BE1 E526 9B74 5982" /* ž¬Â˜ßäÛK.áå&›tY‚ */
- $"1817 EA6B 067A D3E4 8786 883D 26DB D361" /* ..êk.zÓ䇆ˆ=&ÛÓa */
- $"C40F 89F4 B31F 2AF3 1369 FDA9 889A 5620" /* Ä.‰ô³.*ó.iý©ˆšV */
- $"9AE7 4384 7184 9D7F 6C37 F79B 9422 ADF3" /* šçC„q„.l7÷›”"­ó */
- $"2BEA A620 14CF 0267 110E AB20 594B F1DA" /* +ê¦ .Ï.g..« YKñÚ */
- $"9D7F DB53 3723 1A4E 0DEC DF68 3A10 078F" /* .ÛS7#.N.ìßh:.. */
- $"8CA5 471B 4400 0975 92AA A351 8C66 5DDA" /* Œ¥G.D.Æu’ª£QŒf]Ú */
- $"0E4E C7B1 286F 2F7C E0EB 24CC 0A8B CAF8" /* .NDZ(o/|àë$Ì‹Êø */
- $"4F0F 75E5 CACF 26F5 0FFE 86A8 1E77 5F03" /* O.uåÊÏ&õ.þ†¨.w_. */
- $"A8B5 A544 F04B A521 B3FA 854A 64FA 70CD" /* ¨µ¥DðK¥!³ú…JdúpÍ */
- $"526F 97AE 807A 05FC 3F67 2471 61E5 2715" /* Ro—®€z.ü?g$qaå'. */
- $"5774 E452 7E4A CDDA 6E48 0DA2 04B3 3A29" /* WtäR~JÍÚnH.¢.³:) */
- $"DE10 8F75 3A3A 559D A881 B948 74F3 AB92" /* Þ.u::U¨¹Htó«’ */
- $"B154 0F88 A11B A00B 25ED 9A59 B894 618E" /* ±T.ˆ¡. .%íšY¸”aŽ */
- $"AD45 3D59 9C08 49EA 076C CD63 8F49 B714" /* ­E=Yœ.Iê.lÍcI·. */
- $"32B3 8743 2506 F55A C011 CBEF C94A 8606" /* 2³‡C%.õZÀ.ËïÉJ†. */
- $"EDE4 BE7D 2DC9 8830 6C23 91E0 0209 440C" /* íä¾}-Ɉ0l#‘à.ÆD. */
- $"9409 1457 6CA0 2201 8FF4 7573 54F8 CCEC" /* ”Æ.Wl ".ôusTøÌì */
- $"D201 4A3A 66A6 B191 4E14 4CB1 08B4 2100" /* Ò.J:f¦±‘N.L±.´!. */
- $"BCF2 3A0D 696F 4582 F8B0 3A60 2D09 E9A7" /* ¼ò:.ioE‚ø°:`-Æé§ */
- $"8E83 CF44 A16A 6516 31C1 B51E 2DFE BDAC" /* ŽƒÏD¡je.1Áµ.-þ½¬ */
- $"356B F402 856C BEA0 109C A125 A759 E580" /* 5kô.…l¾ .œ¡%§Yå€ */
- $"3501 F500 F252 9533 F180 6E7D 30A8 FD62" /* 5.õ.òR•3ñ€n}0¨ýb */
- $"7FD6 B4EB 9120 8504 493A DD87 D79A 0CB1" /* .Ö´ë‘ ….I:݇ך.± */
- $"B674 7010 830D 8A38 5B44 B11D 3632 3FA5" /* ¶tp.ƒ.Š8[D±.62?¥ */
- $"CE31 CE9A 1670 AF20 16F6 BDA6 4980 002E" /* Î1Κ.p¯ .ö½¦I€.. */
- $"3E9E 8AB0 8B1F 63C5 28C3 7914 2833 137F" /* >žŠ°‹.cÅ(Ãy.(3.. */
- $"0915 DD39 7D38 49A3 6054 B5DC 2509 EE11" /* Æ.Ý9}8I£`TµÜ%Æî. */
- $"D68A 5C2A C75B 5B9F 7A9A FF3A D06F 3331" /* ÖŠ\*Ç[[Ÿzšÿ:Ðo31 */
- $"29E6 A9F4 8AD5 E0D9 7FB9 84B1 F403 8910" /* )æ©ôŠÕàÙ.¹„±ô.‰. */
- $"1168 1270 19E2 E385 0353 0FFF 697F 96BE" /* .h.p.âã….S.ÿi.–¾ */
- $"EF55 21CA 25A1 CE5E 0CD7 03A9 094F 51FE" /* ïU!Ê%¡Î^.×.©ÆOQþ */
- $"5314 E59F 90EB 907A E37A DD9D 182A E41C" /* S.åŸëzãzÝ.*ä. */
- $"CFFB 7262 0D9E B904 8D95 2DE3 E02B F5CB" /* Ïûrb.ž¹.•-ãà+õË */
- $"BF61 6012 924E 50D3 2D8D 6C25 FC60 8D19" /* ¿a`.’NPÓ-l%ü`. */
- $"9855 8BF2 5400 0000 04E3 7684 B40E 9EE7" /* ˜U‹òT....ãv„´.žç */
- $"21F8 CB76 250B 7CE0 2605 7C84 7E9F F226" /* !øËv%.|à&.|„~Ÿò& */
- $"6B94 0DB5 02AA 61E7 A9FF 5D9F A9F2 B546" /* k”.µ.ªaç©ÿ]Ÿ©òµF */
- $"2417 2E4D B238 ADDF 9233 5911 1D61 D35A" /* $..M²8­ß’3Y..aÓZ */
- $"8788 DF34 284A 9664 B91E 7A11 4568 B395" /* ‡ˆß4(J–d¹.z.Eh³• */
- $"7C74 C891 2A46 C056 EE92 0459 D81C A41F" /* |tÈ‘*FÀVî’.YØ.¤. */
- $"CA5E 4752 3ADE 89AB 995B 2BF2 D070 41B1" /* Ê^GR:Þ‰«™[+òÐpA± */
- $"EBFE 65BF FF61 55F5 5460 A4E0 33CF 7F1E" /* ëþe¿ÿaUõT`¤à3Ï.. */
- $"691A 0DA4 9372 4DCD 4A7C FF30 7DA5 4AD0" /* i..¤“rMÍJ|ÿ0}¥JÐ */
- $"1236 3C90 00C2 4517 FF78 771E DA05 952D" /* .6<.ÂE.ÿxw.Ú.•- */
- $"1085 D433 FD50 1E6F D583 2585 CBD6 5CFC" /* .…Ô3ýP.oÕƒ%…ËÖ\ü */
- $"9EF2 539B BE7A CCA1 ABF6 5AED 484B FF78" /* žòS›¾zÌ¡«öZíHKÿx */
- $"D6BD 435E E56E 5510 3047 49DE C511 72CF" /* Ö½C^ånU.0GIÞÅ.rÏ */
- $"72A0 B2CE 5E4D E2DA 0AFA FEDE BDFD 3167" /* r ²Î^MâÚÂúþÞ½ý1g */
- $"02FE 3FBE A1B9 7A5F 205B 7D60 1BA3 C975" /* .þ?¾¡¹z_ [}`.£Éu */
- $"5949 A641 5A3E 5AF2 F237 53BE FCAC 71F1" /* YI¦AZ>Zòò7S¾ü¬qñ */
- $"E3E3 6AEB 35B9 41BD C4B6 3400 DBA0 4B7F" /* ããjë5¹A½Ä¶4.Û K. */
- $"FF79 17FD 23F9 918D E532 F6BD F949 B633" /* ÿy.ý#ù‘å2ö½ùI¶3 */
- $"6A36 7600 17D8 C912 DB72 6F48 869C 0D66" /* j6v..ØÉ.ÛroH†œ.f */
- $"1410 074A 8F5B 629C 5B8B F293 6DB6 DB6D" /* ...J[bœ[‹ò“m¶Ûm */
- $"B6DB 6740 B8F8 BF85 2938 ECDA 6390 6537" /* ¶Ûg@¸ø¿…)8ìÚce7 */
- $"5986 A2A6 B52C A20D F057 C41F 660A C203" /* Y†¢¦µ,¢.ðWÄ.fÂÂ. */
- $"E5C1 68B0 9D56 DAD8 F20C 665C 5D04 4BA2" /* åÁh°VÚØò.f\].K¢ */
- $"46FF 7DB5 4880 6121 2EA3 5D2A 82F4 B18A" /* Fÿ}µH€a!.£]*‚ô±Š */
- $"50FC 2D12 DEFE 1F4D 01BF 3315 10D3 5D94" /* Pü-.Þþ.M.¿3..Ó]” */
- $"11B1 0221 28B8 56D9 4CED 012D D9C9 4005" /* .±.!(¸VÙLí.-ÙÉ@. */
- $"316F E887 29A8 3E83 9E25 FF1F A4C1 5D25" /* 1oè‡)¨>ƒž%ÿ.¤Á]% */
- $"8893 36E0 73BE DE25 456A 4678 B7C5 AD7A" /* ˆ“6às¾Þ%EjFx·Å­z */
- $"90C9 3950 942F 1459 C737 31EF 991F 241B" /* É9P”/.YÇ71ï™.$. */
- $"C294 7CFB 9461 B43A 8D37 8A6D BBC8 D7F6" /* ”|û”a´:7Šm»È×ö */
- $"A128 281D DF2B EAC5 A154 E6D9 FF53 984D" /* ¡((.ß+êÅ¡TæÙÿS˜M */
- $"550E 9C70 3F64 0E0E 0940 0AFC 5CC9 CF43" /* U.œp?d..Æ@Âü\ÉÏC */
- $"7184 3D0F 9FDE 08DF EC31 B86E 0D38 AF71" /* q„=.ŸÞ.ßì1¸n.8¯q */
- $"29F1 A21D 7847 7150 6DCA 9211 C778 F1A4" /* )ñ¢.xGqPmÊ’.Çxñ¤ */
- $"26AA B90D 1A39 DB92 4924 9249 2493 36D2" /* &ª¹..9Û’I$’I$“6Ò */
- $"4924 9249 2492 49FE 069C E7B9 CB0D 4E87" /* I$’I$’Iþ.œç¹Ë.N‡ */
- $"7D9E 9D29 FC64 8A6F 6185 2BD9 806F 760B" /* }ž)üdŠoa…+Ù€ov. */
- $"464D 4732 BD90 0E7D CABF 2B6F 2A78 8608" /* FMG2½.}Ê¿+o*x†. */
- $"DEF5 406F D401 3FD4 AE82 058D D6C8 B980" /* Þõ@oÔ.?Ô®‚.Öȹ€ */
- $"FECA D9B9 E7B6 3982 9FD3 81EA 544B 30BD" /* þÊÙ¹ç¶9‚ŸÓêTK0½ */
- $"7E56 FD78 66FD 5A41 D0BD 7714 5FAF 2A1E" /* ~VýxfýZAнw._¯*. */
- $"8FDA B705 EAAE F6F2 D69C 9812 7194 A56E" /* Ú·.ê®öòÖœ˜.q”¥n */
- $"DB55 BF75 C4E4 BDCD 9FC2 ACAD C428 829F" /* ÛU¿uÄä½ÍŸÂ¬­Ä(‚Ÿ */
- $"2409 3BB2 A894 8020 A8E7 FC16 F4FF 4E84" /* $Æ;²¨”€ ¨çü.ôÿN„ */
- $"C06E 889C 1C74 96AD 5420 F825 1A2B 015C" /* Ànˆœ.t–­T ø%.+.\ */
- $"6BC2 31EE 64AB 7A44 15E5 3458 8040 AEEF" /* kÂ1îd«zD.å4X€@®ï */
- $"F6BD 7D58 6478 8344 018F D3C6 2E33 69A4" /* ö½}XdxƒD.ÓÆ.3i¤ */
- $"E5E8 721A 5B2F 777B C0D8 0A05 2CE7 EEC8" /* åèr.[/w{ÀØÂ.,çîÈ */
- $"69EF 417B A960 D320 842E 84DE D442 AB2F" /* iïA{©`Ó „.„ÞÔB«/ */
- $"3B31 84FE DCFC A608 2E09 AA42 60F6 DB2E" /* ;1„þÜü¦..ƪB`öÛ. */
- $"DA5B C95D D10A 77BE AD48 B5FF 0557 A5AC" /* Ú[É]ÑÂw¾­Hµÿ.W¥¬ */
- $"327B F763 FDA1 32BF 7308 3EFC 0C2B 2D22" /* 2{÷cý¡2¿s.>ü.+-" */
- $"584A F9CA BFB4 78FF 6E67 42CC B491 492B" /* XJùÊ¿´xÿngBÌ´‘I+ */
- $"17C3 C746 9966 5780 BA6C 2798 472E 1CFF" /* .ÃÇF™fW€ºl'˜G..ÿ */
- $"6A32 69A0 86E0 44C6 1679 08F9 9928 48D9" /* j2i †àDÆ.y.ù™(HÙ */
- $"3DA0 CBA0 1E5E 2618 7162 51C9 DEF0 56A0" /* = Ë .^&.qbQÉÞðV  */
- $"1924 F126 CAAD F248 A1A4 2816 13A7 FE76" /* .$ñ&Ê­òH¡¤(..§þv */
- $"594E 647C 36C4 C014 CDC7 5C89 DBAB 9854" /* YNd|6ÄÀ.ÍÇ\‰Û«˜T */
- $"9094 FC96 5FED 7476 AA3C DF0B B47B C123" /* ”ü–_ítvª<ß.´{Á# */
- $"BE6D CD5A BA07 CC19 94FC DC37 B85C 0FD2" /* ¾mÍZº.Ì.”üÜ7¸\.Ò */
- $"9FED 62E6 F910 2F49 529E CE10 9738 D296" /* Ÿíbæù./IRžÎ.—8Ò– */
- $"A81C 1A0D 0FBF 7CAE DB93 40C0 3BC9 5A0C" /* ¨....¿|®Û“@À;ÉZ. */
- $"B23D FBD4 3863 C520 03A0 D966 5327 A0A2" /* ²=ûÔ8cÅ . ÙfS' ¢ */
- $"DD06 B7A1 942B 0A75 CB23 8664 4159 8647" /* Ý.·¡”+ÂuË#†dAY†G */
- $"2725 DAF6 693A 58D7 7A7D B34A 393D FE7A" /* '%Úöi:X×z}³J9=þz */
- $"C105 C374 193C 123C 130E 062C 8AB2 32FD" /* Á.Ãt.<.<...,Š²2ý */
- $"80E0 72E3 6AEA 2078 5D7C D3E5 4E20 D927" /* €àrãjê x]|ÓåN Ù' */
- $"157E 9DC5 1A29 2F0F C326 AFE3 3ACF C361" /* .~Å.)/.Ã&¯ã:ÏÃa */
- $"8C45 D79C EB27 7441 E4C7 8BFD 5832 DB93" /* ŒEלë'tAäÇ‹ýX2Û“ */
- $"78F5 B9DB BA4E 329E A262 C467 88DC C540" /* xõ¹ÛºN2ž¢bÄgˆÜÅ@ */
- $"78E0 4E55 34F3 806E 2DEA B371 E9B5 D8DF" /* xàNU4ó€n-ê³qéµØß */
- $"5EDA B5B9 1C48 5A11 ECAB E4F8 67B7 C76E" /* ^Úµ¹.HZ.ì«äøg·Çn */
- $"460F 8E6A C7BA B5F8 75F2 9105 1480 FD1A" /* F.ŽjǺµøuò‘..€ý. */
- $"80EB DB48 6115 AA6E 9AEA A07C 57B0 1A7F" /* €ëÛHa.ªnšê |W°.. */
- $"0CBF D5DE 47A7 89BE 4CAE 19FE 7B79 5839" /* .¿ÕÞG§‰¾L®.þ{yX9 */
- $"232D 495E 476C E267 D9D2 5257 F0E6 3EB5" /* #-I^GlâgÙÒRWðæ>µ */
- $"F140 AAAF 1E36 BA04 086A EEC5 3232 7958" /* ñ@ª¯.6º..jîÅ22yX */
- $"72E3 FCC3 9488 B44C 0C15 EF6B 811B CF97" /* rãüÔˆ´L..ïk.Ï— */
- $"0532 2B88 663D 8675 6050 AB94 A435 C0FC" /* .2+ˆf=†u`P«”¤5Àü */
- $"9E08 9873 92AF 6859 F7F5 64B0 0BA5 FA68" /* ž.˜s’¯hY÷õd°.¥úh */
- $"3557 0898 9E0D 5795 BF67 2866 5FB6 63C6" /* 5W.˜ž.W•¿g(f_¶cÆ */
- $"4F82 42CE A682 DC8D CB18 D4FE 6252 95D1" /* O‚BΦ‚ÜË.ÔþbR•Ñ */
- $"C85C 6B2C 0FC0 7C9D 5A80 F93B 8900 F93A" /* È\k,.À|Z€ù;‰.ù: */
- $"8EE6 7513 4AFA 1609 3CEE D5EB B420 A1CE" /* Žæu.Jú.Æ<îÕë´ ¡Î */
- $"318D 6F67 720A 7F84 4127 C0F2 9193 35CE" /* 1ogrÂ.„A'Àò‘“5Î */
- $"6D97 9682 5E5D B9FC 5A97 3B71 AB1F 64AA" /* m—–‚^]¹üZ—;q«.dª */
- $"3383 1F0E C0E9 26BE E6EB 24CD 499F F2BA" /* 3ƒ..Àé&¾æë$ÍIŸòº */
- $"997D E886 6FF8 C6B5 0607 1259 7715 7539" /* ™}è†oøƵ...Yw.u9 */
- $"4B57 F7A9 56A7 A04B 031F 0786 6C02 E7BC" /* KW÷©V§ K...†l.ç¼ */
- $"8256 7F27 A39A B66D 6B95 6C11 CDE4 C580" /* ‚V.'£š¶mk•l.ÍäÅ€ */
- $"54DE 7E26 129C EB67 ABC8 455E 6CC3 453E" /* TÞ~&.œëg«ÈE^lÃE> */
- $"F9A8 3ED5 9B43 4EB8 384E 0F7B 28E0 16FF" /* ù¨>Õ›CN¸8N.{(à.ÿ */
- $"1342 18B1 31B6 EAEF 4C40 36F7 0CFF 6AFF" /* .B.±1¶êïL@6÷.ÿjÿ */
- $"8059 5D1C 275B 4F7D B392 4DB0 5E5D 4304" /* €Y].'[O}³’M°^]C. */
- $"4848 2A3A C93F BAD6 638D 315A 8771 1150" /* HH*:É?ºÖc1Z‡q.P */
- $"1D41 B6A7 C9B8 782E 19D8 F8E7 07EB ED20" /* .A¶§É¸x..Øøç.ëí */
- $"7D4E AFFF 5FD2 4FA0 2B48 B549 6A50 AD81" /* }N¯ÿ_ÒO +HµIjP­ */
- $"F11D 357F 7CB2 4B8B F28B 6C97 2C23 58A3" /* ñ.5.|²K‹ò‹l—,#X£ */
- $"92E8 2BFB 77F2 1ECE 7A2A C437 47E3 A833" /* ’è+ûwò.Îz*Ä7Gã¨3 */
- $"D60C C3CA 168A 85B8 620C 109C 4134 35BF" /* Ö.ÃÊ.Š…¸b..œA45¿ */
- $"ECCB 3629 944F AD29 444A C4B6 F019 F19B" /* ìË6)”O­)DJĶð.ñ› */
- $"4189 B1D3 8F28 65B9 85D8 C715 2E1A 267D" /* A‰±Ó(e¹…ØÇ...&} */
- $"A7DB 4C90 9829 BC86 E14C 9F44 757D 5436" /* §ÛL˜)¼†áLŸDu}T6 */
- $"9C38 979D 3654 9A63 E572 7864 E513 A083" /* œ8—6Tšcårxdå. ƒ */
- $"C943 97C5 A88B 23A2 4ECC E4F1 AEED F3EC" /* ÉC—Ũ‹#¢NÌäñ®íóì */
- $"C57D F254 B087 7E1F 81B3 59E6 E2A0 E5CB" /* Å}òT°‡~.³Yæâ åË */
- $"B710 EF71 0598 01BF 1400 3814 0759 EDA8" /* ·.ïq.˜.¿..8..Yí¨ */
- $"386C 3DF0 F1C5 CA93 612F C58D 71BA 6ED6" /* 8l=ðñÅÊ“a/ÅqºnÖ */
- $"FE35 90B4 9C10 A938 33B6 6987 E407 AE7B" /* þ5´œ.©83¶i‡ä.®{ */
- $"5B1A 8E0E BE53 1C94 D747 9303 2ED9 13FA" /* [.Ž.¾S.”×G“..Ù.ú */
- $"226C F38A 7134 3CF6 1923 B85F A254 0048" /* "lóŠq4<ö.#¸_¢T.H */
- $"A765 B678 FC9C 1E2C E183 FC80 CA83 9572" /* §e¶xüœ.,áƒü€Êƒ•r */
- $"E573 B224 9894 7316 C931 4A49 C28F 6E33" /* ås²$˜”s.É1JIÂn3 */
- $"B579 EE14 84BC 61CC 351B 41FB 7095 5F8C" /* µyî.„¼aÌ5.Aûp•_Œ */
- $"1B15 6DAF FF7F F8EA 5A11 5453 6ECA 1C02" /* ..m¯ÿ.øêZ.TSnÊ.. */
- $"C8A4 F40F AD00 7BC9 EDFD AC3A 28E4 546F" /* Ȥô.­.{Éíý¬:(äTo */
- $"1E36 BE45 897E F5D5 BE25 E84B 57C6 9080" /* .6¾E‰~õÕ¾%èKWÆ€ */
- $"B6C4 79B8 153B 110F D90B 215D 401C 0453" /* ¶Äy¸.;..Ù.!]@..S */
- $"8243 BF4A CDAE 9270 0658 462F E0C7 82A8" /* ‚C¿JÍ®’p.XF/àÇ‚¨ */
- $"E155 C547 D144 EBAD 74EC EAFF 7799 6D50" /* áUÅGÑDë­tìêÿw™mP */
- $"D0F9 6BA4 D8B3 0FBB B75B BC48 D5BA 8EAB" /* Ðùk¤Ø³.»·[¼HÕºŽ« */
- $"FF7F 3A2A 820F D817 FB8B 7590 ED4A 3D7B" /* ÿ.:*‚.Ø.û‹uíJ={ */
- $"DAF8 C05F BDCF 1B7C 8862 53A8 95D6 C0DF" /* ÚøÀ_½Ï.|ˆbS¨•ÖÀß */
- $"4069 36DA 0739 783C C432 1E0C 7DA6 2D70" /* @i6Ú.9x<Ä2..}¦-p */
- $"B33A C5AD 810A FBBD E9BB B776 6463 9FDC" /* ³:Å­Âû½é»·vdcŸÜ */
- $"B401 211D 81BA A9FA 8761 ED36 A1EF 439D" /* ´.!.º©ú‡aí6¡ïC */
- $"9880 BE88 E045 3068 F59F 7AD7 EFFF 7FFC" /* ˜€¾ˆàE0hõŸz×ïÿ.ü */
- $"5562 1F00 0818 22D6 5002 F762 7A20 0DC0" /* Ub...."ÖP.÷bz .À */
- $"3ADD FF5D 1851 D391 F011 0000 0000 0000" /* :Ýÿ].QÓ‘ð....... */
- $"0000 0000 0138 5715 ED61 F2C5 2C28 30C0" /* .....8W.íaòÅ,(0À */
- $"F669 9389 6153 3A95 E010 CCA0 2FEF B36F" /* öi“‰aS:•à.Ì /ï³o */
- $"9576 F8C0 F17B 27F6 F6FA 412C 70C7 CF14" /* •vøÀñ{'ööúA,pÇÏ. */
- $"7625 6871 7FE2 16C9 B6E9 5BF1 1A16 E2F0" /* v%hq.â.ɶé[ñ..âð */
- $"945D E51E CCF9 0970 E586 517C 475F 8856" /* ”]å.ÌùÆpå†Q|G_ˆV */
- $"CA0C 1DD9 E001 D7BC 1876 745C 8077 672D" /* Ê..Ùà.×¼.vt\€wg- */
- $"CECA FF0B 01D1 76FA 32F5 C047 26FB 451F" /* ÎÊÿ..Ñvú2õÀG&ûE. */
- $"5261 79B6 5990 79C9 4DF7 5B69 D548 E894" /* Ray¶YyÉM÷[iÕHè” */
- $"F249 0C84 D3F0 9555 7B99 EA27 FA38 184E" /* òI.„Óð•U{™ê'ú8.N */
- $"F863 AFA1 CE80 AEBC CB89 DD99 B8E2 0BEC" /* øc¯¡Î€®¼Ë‰Ý™¸â.ì */
- $"2F74 E534 3FF4 B50A 4B04 02B1 C178 B189" /* /tå4?ôµÂK..±Áx±‰ */
- $"D30F 77DC 8A15 8C9E AF87 1DCD D545 AC6B" /* Ó.wÜŠ.Œž¯‡.ÍÕE¬k */
- $"CAFB 832B E240 6752 8EF2 9BDF 76E8 621D" /* Êûƒ+â@gRŽò›ßvèb. */
- $"892E 384C 7BF0 4DE8 F910 7689 C3F0 E7E9" /* ‰.8L{ðMèù.v‰Ãðçé */
- $"E401 C781 F341 A84F 6922 E97B FC22 E259" /* ä.ÇóA¨Oi"é{ü"âY */
- $"6B26 9B03 14A7 DFA1 B7BD CBED 9539 5DE3" /* k&›..§ß¡·½Ëí•9]ã */
- $"2041 2F5F A37A 2F23 00FC 6424 D7F8 902E" /* A/_£z/#.üd$×ø. */
- $"7261 227B B4EC F4D1 9C18 22C3 8CA5 EFF8" /* ra"{´ìôÑœ."ÃŒ¥ïø */
- $"5701 6734 9110 8B4E D9E0 EE8F 7FEA 202F" /* W.g4‘.‹NÙàî.ê / */
- $"CFF7 5CC7 6107 0B22 B0BE A87B 32EF 0FA8" /* Ï÷\Ça.."°¾¨{2ï.¨ */
- $"3D2D 794E 556E 6089 ACBA D46C 17EC A9DC" /* =-yNUn`‰¬ºÔl.ì©Ü */
- $"0F4E D57D B8C8 EED1 F9D4 F96A 7BEE 3794" /* .NÕ}¸ÈîÑùÔùj{î7” */
- $"49DE 3AA7 EE2E 0B25 A47C 966A D90D C792" /* IÞ:§î..%¤|–jÙ.Ç’ */
- $"6304 7C05 C6EB A26D 83B8 3E0C AAF5 AFFE" /* c.|.Æë¢mƒ¸>.ªõ¯þ */
- $"FDC3 F7C4 C0A3 C3ED E8D2 0FAB AC58 1F56" /* ýÃ÷ÄÀ£ÃíèÒ.«¬X.V */
- $"FF40 F44B 4289 C6D7 CC17 A019 AD4A C889" /* ÿ@ôKB‰Æ×Ì. .­Jȉ */
- $"67AD 0673 32A0 B6BA 087E 7279 19C2 025F" /* g­.s2 ¶º.~ry.Â._ */
- $"DB0E 0E97 02D9 2268 5BCA CDE6 B94E 8D9B" /* Û..—.Ù"h[ÊÍæ¹N› */
- $"03EB D786 1698 2D8A 2ECD 432E D615 931F" /* .ë׆.˜-Š.ÍC.Ö.“. */
- $"452B 5D40 0950 5BBE A70F BD95 9F0E 8B95" /* E+]@ÆP[¾§.½•Ÿ.‹• */
- $"86B7 47DE 0757 BFE4 9775 3082 9D22 863A" /* †·GÞ.W¿ä—u0‚"†: */
- $"E404 B84C 5E88 8424 31DD 689A D234 88E2" /* ä.¸L^ˆ„$1ÝhšÒ4ˆâ */
- $"971F 9E59 429C 6C7E 3670 8F7C 8F86 A80D" /* —.žYBœl~6p|†¨. */
- $"848E E78B 5331 058E E444 FEC2 269A 7E23" /* „Žç‹S1.ŽäDþÂ&š~# */
- $"608D 0502 E075 F7A4 DACF 515F AA08 31C1" /* `..àu÷¤ÚÏQ_ª.1Á */
- $"1275 02C0 F37E F465 ADE9 1918 F1F0 0E4F" /* .u.Àó~ôe­é..ñð.O */
- $"E5A4 41A5 F655 22D9 946A 7FEC 0720 3D3A" /* å¤A¥öU"Ù”j.ì. =: */
- $"4961 05B2 F02D 51D2 1212 084B B3EA 5DC9" /* Ia.²ð-QÒ...K³ê]É */
- $"F986 5763 A2AC E2AC 1144 5DC3 E6A5 D092" /* ù†Wc¢¬â¬.D]Ãæ¥Ð’ */
- $"3654 3737 A598 21C2 34FF 097C B8B8 5934" /* 6T77¥˜!Â4ÿÆ|¸¸Y4 */
- $"C947 05C9 B4BA F52B 99FF 3AFE 6B15 2CAE" /* ÉG.É´ºõ+™ÿ:þk.,® */
- $"06CF D962 CCDE D937 D4AE B3D9 7E92 E2AF" /* .ÏÙbÌÞÙ7Ô®³Ù~’⯠*/
- $"8F4E 31CE 06E7 0AD8 71DB 4456 7101 E221" /* N1Î.çÂØqÛDVq.â! */
- $"74AC 1159 9EDF 9841 CFA3 E04F DECF 6FD3" /* t¬.Yžß˜AÏ£àOÞÏoÓ */
- $"90CC C22F 63B0 45CC C98B 3125 33C0 CFBA" /* ÌÂ/c°EÌÉ‹1%3ÀϺ */
- $"4CE7 3FAD F2E4 85E7 0C74 35A5 97E9 8672" /* Lç?­òä…ç.t5¥—é†r */
- $"9180 E059 EF0F C416 E25F 0E83 095A 36AA" /* ‘€àYï.Ä.â_.ƒÆZ6ª */
- $"8E74 F1F7 11A8 49DD C47E 5098 D576 DC41" /* Žtñ÷.¨IÝÄ~P˜ÕvÜA */
- $"D6FC 7C37 E307 A2DB 997E A046 C114 CF04" /* Öü|7ã.¢Û™~ FÁ.Ï. */
- $"FD8E 32D1 2AC6 3A81 C8B6 C680 6E60 7826" /* ýŽ2Ñ*Æ:ȶƀn`x& */
- $"9A40 9C80 BA1B 4DE8 854B 09D9 33B3 95BE" /* š@œ€º.Mè…KÆÙ3³•¾ */
- $"7CE5 CCA3 C463 5D1C 1F2B A160 E208 AA0A" /* |åÌ£Äc]..+¡`â.ªÂ */
- $"D00F 1933 5FB5 2705 4E9C 3733 0FD0 2AA0" /* Ð..3_µ'.Nœ73.Ð*  */
- $"D116 F240 05EA 53BB 5A5A 0A4B 3D9E FCB7" /* Ñ.ò@.êS»ZZÂK=žü· */
- $"FE35 1D0B 1E56 C4AA 9B6C 8CE6 10CA DAA5" /* þ5...VĪ›lŒæ.ÊÚ¥ */
- $"6DF1 6F74 C332 BD93 556E 89F5 A94A 232D" /* mñotÃ2½“Un‰õ©J#- */
- $"E9EF C950 666C 7D3E D1BA C98F 4489 3C5D" /* éïÉPfl}>ѺÉD‰<] */
- $"F7FC 88D4 C90E EE9D 7691 C976 2CFE 6BA0" /* ÷üˆÔÉ.îv‘Év,þk  */
- $"B53E 5C59 749E FEBC 4AB4 490C A3B6 5187" /* µ>\Ytžþ¼J´I.£¶Q‡ */
- $"4A10 1076 6348 AEC1 054B 0A98 9196 29C3" /* J..vcH®Á.K˜‘–)à */
- $"F995 50E4 E003 F099 9495 7ECC 1C78 C536" /* ù•Päà.ð™”•~Ì.xÅ6 */
- $"AA8D 7305 BE7F FF72 99F7 25ED 4C38 0896" /* ªs.¾.ÿr™÷%íL8.– */
- $"A1BE F2D4 016E B744 CBB7 9CEE 1C88 5E3D" /* ¡¾òÔ.n·DË·œî.ˆ^= */
- $"1B9E E3CB 29D2 AAA7 C3F6 41F4 B6C0 5861" /* .žãË)Òª§ÃöAô¶ÀXa */
- $"93D3 4773 858E 3470 E670 4F94 E206 FBA3" /* “ÓGs…Ž4pæpO”â.û£ */
- $"7050 2A3D 6DC0 004E 32D7 6043 4E5E C44F" /* pP*=mÀ.N2×`CN^ÄO */
- $"284A 3214 97B7 19DE 41C4 6204 56CB 1695" /* (J2.—·.ÞAÄb.VË.• */
- $"BAD8 C308 0FFE BEB7 FE14 C6AC CEE8 5022" /* ºØÃ..þ¾·þ.ƬÎèP" */
- $"C27A 2CCA 4714 4C52 3975 615D A1C8 62BF" /* Âz,ÊG.LR9ua]¡Èb¿ */
- $"C477 FF7E 2637 3B89 8C43 6E09 285B 2D1A" /* Äwÿ~&7;‰ŒCnÆ([-. */
- $"8E9E 4110 CE7B E30A E21C A140 02C8 D0AD" /* ŽžA.Î{ãÂâ.¡@.ÈЭ */
- $"630B 5488 7CE7 B884 393A 6FDD 5A68 7FB9" /* c.Tˆ|縄9:oÝZh.¹ */
- $"60EC C73B 143E 3F61 3E31 1A3E 8438 7944" /* `ìÇ;.>?a>1.>„8yD */
- $"B652 14AE 63CA 803C 9B67 C6FE 2F5D 4CD0" /* ¶R.®cÊ€<›gÆþ/]LÐ */
- $"3A63 1328 8809 A4AB B4A1 8664 FE90 F03E" /* :c.(ˆÆ¤«´¡†dþð> */
- $"18E2 7982 7DDC A444 1306 4546 61B2 A710" /* .ây‚}ܤD..EFa²§. */
- $"CCED 529C 92CB D547 22F5 0DB0 B10F 8450" /* ÌíRœ’ËÕG"õ.°±.„P */
- $"E5AC 253A 6937 BFBD D0C6 8AED 14C7 787E" /* å¬%:i7¿½ÐÆŠí.Çx~ */
- $"21E7 860D 8567 633D A9E6 0466 93A5 6789" /* !ç†.…gc=©æ.f“¥g‰ */
- $"D643 2EEE 7542 7B02 086A 83C4 AD3C 785C" /* ÖC.îuB{..jƒÄ­<x\ */
- $"E3B4 BFC0 C27C 3762 1D98 0A0C B43D 8107" /* ã´¿ÀÂ|7b.˜Â.´=. */
- $"3003 FF74 C626 1BC1 44AA 08A0 7A68 0ADE" /* 0.ÿtÆ&.ÁDª. zhÂÞ */
- $"E9BD 94DB 3644 AA13 CFCA A9CB 0E8F 9061" /* é½”Û6Dª.ÏÊ©Ë.a */
- $"73BC 6A23 359D C129 F184 4EBA BE0F A772" /* s¼j#5Á)ñ„Nº¾.§r */
- $"9AB6 7DDC C179 81DB 9FDC EDA3 E6C5 21E2" /* š¶}ÜÁyÛŸÜí£æÅ!â */
- $"7049 87BC 00E3 34F5 8066 3FFE 7CA7 A588" /* pI‡¼.ã4õ€f?þ|§¥ˆ */
- $"6277 30DE 8FC1 950A A652 5B12 B0A4 B8BE" /* bw0ÞÁ•Â¦R[.°¤¸¾ */
- $"2297 4261 CB90 AEBB F3CB 2BEE 2FA8 149E" /* "—BaË®»óË+î/¨.ž */
- $"11E6 487B 3EFA 45B9 E4A8 17DF DF8E D5FF" /* .æH{>úE¹ä¨.ßߎÕÿ */
- $"750C 2E52 4F3F 5960 B3B7 3DEB CFE3 4EC3" /* u..RO?Y`³·=ëÏãNà */
- $"676F D76A F8C3 67EB 383B 042A C000 1CF5" /* go×jøÃgë8;.*À..õ */
- $"FB57 51DF 4E0F 9709 4A58 F371 8A53 79CD" /* ûWQßN.—ÆJXóqŠSyÍ */
- $"B935 29C8 5953 BBFB B216 24F0 FF5C F1BE" /* ¹5)ÈYS»û².$ðÿ\ñ¾ */
- $"1649 C9BE 754A CC45 62C3 44A2 3E12 A872" /* .IɾuJÌEbÃD¢>.¨r */
- $"736B 05DD F77C C7C6 F33D 8224 147E D163" /* sk.Ý÷|ÇÆó=‚$.~Ñc */
- $"02B4 0BC6 297A FA75 03A7 BFDD 709A A878" /* .´.Æ)zúu.§¿Ýpš¨x */
- $"734A 7236 791A BFF6 9F21 CC67 268D 160D" /* sJr6y.¿öŸ!Ìg&.. */
- $"A6D0 7988 72CF 6475 146C 81EB 8249 518A" /* ¦ÐyˆrÏdu.lë‚IQŠ */
- $"49B7 0389 FDB6 9CEB DCA2 41ED 085D 4E85" /* I·.‰ý¶œëÜ¢Aí.]N… */
- $"03E4 3F4E D8CF 25E1 658D 38F6 8F88 A499" /* .ä?NØÏ%áe8öˆ¤™ */
- $"B64A DD79 FDF2 39FB 5CEC F29B 714A 733B" /* ¶JÝyýò9û\ìò›qJs; */
- $"76E4 94E5 F567 3A71 28F0 13A6 7A74 CD91" /* vä”åõg:q(ð.¦ztÍ‘ */
- $"5804 065E D3C7 09B7 ED19 51E5 0913 4436" /* X..^ÓÇÆ·í.QåÆ.D6 */
- $"9791 BB58 10F3 7183 5DB6 4874 65D2 AAD2" /* —‘»X.óqƒ]¶HteÒªÒ */
- $"DBA2 C761 A70F 3EEE 9256 2EF0 945D E52D" /* Û¢Ça§.>î’V.ð”]å- */
- $"34CF 10DF B2AF 8E14 A5A4 E24F 0051 F63E" /* 4Ï.ß²¯Ž.¥¤âO.Qö> */
- $"F11C 5DAC 6D8D DEDD A585 96FC A2AB A5FF" /* ñ.]¬mÞÝ¥…–ü¢«¥ÿ */
- $"5298 6349 DB41 9276 C1C6 F1E2 9ABF 822B" /* R˜cIÛA’vÁÆñâš¿‚+ */
- $"346F 8679 726C 666A 9638 246A EABE 54A9" /* 4o†yrlfj–8$jê¾T© */
- $"49DD F22A BC62 5867 51F2 FDBD B33B 40E0" /* IÝò*¼bXgQòý½³;@à */
- $"220F 075D 031C EAAE 3CDE 67CF 2269 E26D" /* "..]..ê®<ÞgÏ"iâm */
- $"BEF3 1873 E610 D43E 8F03 A14F F04F 980B" /* ¾ó.sæ.Ô>.¡OðO˜. */
- $"69FF 1E4A 1925 DDE6 B473 84B5 6F53 75DD" /* iÿ.J.%Ýæ´s„µoSuÝ */
- $"CF71 C4C0 72DC 5403 7E7B 1A9B 6F16 BA87" /* ÏqÄÀrÜT.~{.›o.º‡ */
- $"A44D D4A2 8029 E15A 8C17 BE55 A30B 87B3" /* ¤MÔ¢€)áZŒ.¾U£.‡³ */
- $"DC5B CED9 2E4C A8F3 939B 6F82 8885 9BD5" /* Ü[ÎÙ.L¨ó“›o‚ˆ…›Õ */
- $"905B 6EE2 E3C9 D45E DE91 DD46 7EDD 23BB" /* [nâãÉÔ^Þ‘ÝF~Ý#» */
- $"6852 2BD3 3D31 2755 2D1B 7431 35EB 6CBD" /* hR+Ó=1'U-.t15ël½ */
- $"638C 9E5D F0EB 9AE0 49BC D327 7536 BCB3" /* cŒž]ðëšàI¼Ó'u6¼³ */
- $"65F1 992B E073 9D25 980D A244 7F9E 749F" /* eñ™+às%˜.¢D.žtŸ */
- $"53BD D08A C5EF 64A2 D672 7A55 9146 5CAD" /* S½ÐŠÅïd¢ÖrzU‘F\­ */
- $"7839 E1B6 7543 4556 146E C347 33E3 2798" /* x9á¶uCEV.nÃG3ã'˜ */
- $"4752 6F78 AAA5 AE5E 7B02 CD92 D5F1 FD30" /* GRoxª¥®^{.Í’Õñý0 */
- $"F78A 7BFB 03AB CF34 58BF 3810 B8A7 CDAB" /* ÷Š{û.«Ï4X¿8.¸§Í« */
- $"A573 658E 260A 7C50 000F 00AC D13F 618E" /* ¥seŽ&Â|P...¬Ñ?aŽ */
- $"A241 9458 3945 9D59 3F9B 13C5 04CC 600E" /* ¢A”X9EY?›.Å.Ì`. */
- $"FC51 8C8D FBA0 4150 5832 4539 730B 4631" /* üQŒû APX2E9s.F1 */
- $"0598 EE14 817C B560 97C5 B953 64D4 980D" /* .˜î.|µ`—ŹSdÔ˜. */
- $"C379 6FFF 3E63 6746 7BE8 D3AB 5215 B47F" /* Ãyoÿ>cgF{èÓ«R.´. */
- $"3CAE 42E4 D4BF B7BF 6580 3319 6A71 C2E9" /* <®BäÔ¿·¿e€3.jqÂé */
- $"48AA 2C5E 9D78 B9C3 F8DA B858 D5AB 99F4" /* Hª,^x¹ÃøÚ¸XÕ«™ô */
- $"B04F EAAC D0DE 2302 F874 7E64 A69B 89CE" /* °Oê¬ÐÞ#.øt~d¦›‰Î */
- $"AEAB A73F F815 0D06 B24E 39EC D8E9 EFB7" /* ®«§?ø...²N9ìØéï· */
- $"ED32 55A0 8E21 B52A E55C 17AE E07B 42F4" /* í2U Ž!µ*å\.®à{Bô */
- $"D451 CB7C E941 1578 3EE3 9565 087E 9A05" /* ÔQË|éA.x>ã•e.~š. */
- $"B5FC 403A AAA2 25CE 5AC1 B658 1EE9 9A53" /* µü@:ª¢%ÎZÁ¶X.éšS */
- $"4000 51DF 95E8 C605 97AC C7E1 A8B1 F86C" /* @.Qß•èÆ.—¬Çᨱøl */
- $"7C3F 0BCC E410 8FA7 78C0 7964 BDD0 E341" /* |?.Ìä.§xÀyd½ÐãA */
- $"5DC5 D977 EF99 460C FC48 A51A B5CD DE47" /* ]ÅÙwï™F.üH¥.µÍÞG */
- $"F9E2 194D 1F2D B2B6 556B 0F68 BD1B 5BEA" /* ùâ.M.-²¶Uk.h½.[ê */
- $"9FDD 1280 92A3 EF96 132C 22F6 CA8A 1C20" /* ŸÝ.€’£ï–.,"öÊŠ. */
- $"54DA F163 6119 BC02 7AE6 10CA A16B 993A" /* TÚñca.¼.zæ.Ê¡k™: */
- $"E22B CC58 D181 40E6 EA99 0897 5166 4C1F" /* â+ÌXÑ@æê™.—QfL. */
- $"6D58 D092 5119 1AF5 0C2B 1DC6 029D F0E8" /* mXÐ’Q..õ.+.Æ.ðè */
- $"1F6F 9F5C 17D8 68A0 F600 5C68 5C16 4269" /* .oŸ\.Øh ö.\h\.Bi */
- $"F5A9 4D97 32DE 3A9C 6609 86C2 1D0F BA56" /* õ©M—2Þ:œfƆÂ..ºV */
- $"3C8C 1046 E0DC 2ECB 9BDB D61E 6955 CE38" /* <Œ.FàÜ.Ë›ÛÖ.iUÎ8 */
- $"DB97 859B 9E73 78BF FDEB ED74 0C4E 4203" /* Û—…›žsx¿ýëít.NB. */
- $"431D 69C4 635D D1EA 1A9A 6462 BE48 DDB9" /* C.iÄc]Ñê.šdb¾Hݹ */
- $"6E63 C4D8 8886 51CB 19E6 A7C9 5941 8443" /* ncÄ؈†QË.æ§ÉYA„C */
- $"57E5 8C3B B907 FF17 4B41 08DA 7AFC 1B8B" /* WåŒ;¹.ÿ.KA.Úzü.‹ */
- $"9B05 622E 1F81 91D8 2C60 9C6A 3B23 608B" /* ›.b..‘Ø,`œj;#`‹ */
- $"F2EC E527 70F9 D963 D302 D7AC 18E2 2692" /* òìå'pùÙcÓ.׬.â&’ */
- $"AE0C D915 7E30 5B09 305C 8F5D 1346 3FF2" /* ®.Ù.~0[Æ0\].F?ò */
- $"8635 ECEC 1CB7 962D 0846 3FA9 5920 C1B0" /* †5ìì.·–-.F?©Y Á° */
- $"5582 FF3A 24E0 FAAE 8FAE 3843 DFCF B74F" /* U‚ÿ:$àú®®8CßÏ·O */
- $"CAEC 5602 D1C5 1760 5ECD 92C8 1DD1 4ABE" /* ÊìV.ÑÅ.`^Í’È.ÑJ¾ */
- $"2336 8A90 E444 6753 D3E0 0F02 8E99 7393" /* #6ŠäDgSÓà..Ž™s“ */
- $"8B26 6C9F BFB4 64DE 7867 73F7 10F0 477A" /* ‹&lŸ¿´dÞxgs÷.ðGz */
- $"8383 ADA5 49C3 722B 1FD7 0BB5 4118 4714" /* ƒƒ­¥IÃr+.×.µA.G. */
- $"D5F9 6C20 CDD0 8151 EAB4 457F FF4E 314C" /* Õùl ÍÐQê´E.ÿN1L */
- $"6E7F 04DB DE0C 611B 62AC 2A4E 869C 06FB" /* n..ÛÞ.a.b¬*N†œ.û */
- $"DB81 F238 C4FC 149E 8176 3F0C 4B83 0DFF" /* Ûò8Äü.žv?.Kƒ.ÿ */
- $"7FB4 A5F5 80C7 E4F0 47AD 8D3F 5426 B12A" /* .´¥õ€ÇäðG­?T&±* */
- $"8678 11E1 A0EF 5439 31D8 E97E 3AE9 E4DD" /* †x.á ïT91Øé~:éäÝ */
- $"3DB7 4A94 7FFF 7135 0C02 ACE2 70F5 626B" /* =·J”.ÿq5..¬âpõbk */
- $"271A 4401 DF00 AE70 E43B D3F8 75AD 0DAB" /* '.D.ß.®pä;Óøu­.« */
- $"794A C0C7 928F 8621 BE61 DA60 A89F 8E95" /* yJÀÇ’†!¾aÚ`¨ŸŽ• */
- $"64E1 4B82 9CA5 D1CB 26FA 3B49 2FDF 8007" /* dáK‚œ¥ÑË&ú;I/߀. */
- $"60B1 1C23 B192 973E 87DD 9323 E697 CA76" /* `±.#±’—>‡Ý“#æ—Êv */
- $"03D6 B09A 33FA 5CEC 856D 1D12 5249 2492" /* .Ö°š3ú\ì…m..RI$’ */
- $"4924 9249 2492 4924 9231 8B0A C6C2 C882" /* I$’I$’I$’1‹ÂÆÂÈ‚ */
- $"FC66 E59C E646 38B0 B26F A097 FEA2 30FE" /* üfåœæF8°²o —þ¢0þ */
- $"F5B9 90DC 3FEF 3116 73C4 7B20 6C09 EA40" /* õ¹Ü?ï1.sÄ{ lÆê@ */
- $"AB90 6257 8BAD 951C 002E 138D 7274 121D" /* «bW‹­•....rt.. */
- $"B91E 66F5 6038 8257 FD9A 18C9 0155 522C" /* ¹.fõ`8‚Wýš.É.UR, */
- $"D6CC 0F6A 6A4A 09F3 0C4A B702 47FF 7FFC" /* ÖÌ.jjJÆó.J·.Gÿ.ü */
- $"B504 0034 6682 CE19 CA7C 50BE F8B0 9DCB" /* µ..4f‚Î.Ê|P¾ø°Ë */
- $"0092 4924 9248 F298 B4D2 A612 6CEE 878F" /* .’I$’Hò˜´Ò¦.lî‡ */
- $"FF7F FF5F 8F59 B3E0 FE9F A74E 506D C924" /* ÿ.ÿ_Y³àþŸ§NPmÉ$ */
- $"9249 2492 4924 9249 2492 4924 924D 57A2" /* ’I$’I$’I$’I$’MW¢ */
- $"2CC8 426C 393A 96E4 50FB 0ACE 8874 7A86" /* ,ÈBl9:–äPûÂΈtz† */
- $"2B20 84D4 0F34 1532 DFF0 D633 0231 0F65" /* + „Ô.4.2ßðÖ3.1.e */
- $"91D1 8E19 A917 CD2A 8D35 89BE F64E D1A8" /* ‘ÑŽ.©.Í*5‰¾öNѨ */
- $"926C AE06 3A49 80F9 C1FE 0E81 52D8 5A8C" /* ’l®.:I€ùÁþ.RØZŒ */
- $"7A00 5EF2 9F04 3659 74EC D695 94B6 5B90" /* z.^òŸ.6YtìÖ•”¶[ */
- $"89C0 E661 DFC4 5E69 965B 4D1D 4B76 7C0E" /* ‰ÀæaßÄ^i–[M.Kv|. */
- $"89D2 C1E8 B1EF CF9E 5E96 3977 AEA6 532B" /* ‰ÒÁè±ïÏž^–9w®¦S+ */
- $"68B1 BD73 2BE6 BB5B 766E FA91 5C36 628C" /* h±½s+æ»[vnú‘\6bŒ */
- $"F45F FEEA C7DF 49F0 278F F459 E9B6 BDAC" /* ô_þêÇßIð'ôY鶽¬ */
- $"1A28 F485 45C5 2761 DC37 C72A 8A17 2D08" /* .(ô…EÅ'aÜ7Ç*Š.-. */
- $"5130 E9D5 E1BD 2D59 07B5 2290 00F9 F737" /* Q0éÕá½-Y.µ".ù÷7 */
- $"C1F4 5C78 1058 C4C6 13AB AE5C 45DE ACB4" /* Áô\x.XÄÆ.«®\EÞ¬´ */
- $"7DC9 03C4 0F82 7850 6F9E 5FD3 9223 36FE" /* }É.Ä.‚xPož_Ó’#6þ */
- $"8A1D 1D99 FBB3 646B 206B FC7E 668E 4730" /* Š..™û³dk kü~fŽG0 */
- $"7C8C 79D9 A37A 427B 1E91 E7A1 DED2 E57D" /* |ŒyÙ£zB{.‘ç¡ÞÒå} */
- $"E167 967A 8B9F A6C0 A36F 68E8 D03C 84C6" /* ág–z‹Ÿ¦À£ohèÐ<„Æ */
- $"E952 3CAF 039F 18CD 236C 4AE1 FB74 D7F6" /* éR<¯.Ÿ.Í#lJáût×ö */
- $"DFBF B7A4 AFDB D27E 2FB7 7BBF 86F0 DF6F" /* ß¿·¤¯ÛÒ~/·{¿†ðßo */
- $"4F9F C3A7 EC7F 0D0F BEDB 1EFB 77AA FB77" /* OŸÃ§ì...¾Û.ûwªûw */
- $"2CED 1CDE F39E A2F3 567D 91E9 4703 B8A2" /* ,í.Þóž¢óV}‘éG.¸¢ */
- $"5006 2494 6271 81F3 3B95 0B89 EDD5 7FE8" /* P.$”bqó;•.‰íÕ.è */
- $"B864 3D84 75CD 7478 A5D6 28C8 D483 39EF" /* ¸d=„uÍtx¥Ö(ÈÔƒ9ï */
- $"86CA 5763 87CA 97CF A9D4 AFA9 0450 6744" /* †ÊWc‡Ê—Ï©Ô¯©.PgD */
- $"16E3 8C0B 0015 88DA 5244 1AB2 9790 35B0" /* .ãŒ...ˆÚRD.²—5° */
- $"0489 B911 D871 2BB4 6576 C185 22B7 1F86" /* .‰¹.Øq+´evÁ…"·.† */
- $"230A 3CD3 ECB5 20A6 23BA A068 A53E 8EAD" /* #Â<Óìµ ¦#º h¥>Ž­ */
- $"3793 46B5 BA07 96A8 DF28 6A66 CE05 73CE" /* 7“Fµº.–¨ß(jfÎ.sÎ */
- $"1938 F9A6 9CBC 0D7F F193 E0D5 09CC 3426" /* .8ù¦œ¼..ñ“àÕÆÌ4& */
- $"4BB1 52B9 F337 0537 FA01 B010 5471 B015" /* K±R¹ó7.7ú.°.Tq°. */
- $"754C A1A6 E071 800C 1A26 243D 172B 1497" /* uL¡¦àq€..&$=.+.— */
- $"E5DF 1EB1 6A6C 6761 3BA6 52C0 C0B4 69BD" /* åß.±jlga;¦RÀÀ´i½ */
- $"E6B4 275E EB6E 42BF D693 8928 15A4 9DB2" /* æ´'^ënB¿Ö“‰(.¤² */
- $"D8FA E273 6C04 CBB5 06A9 8096 5E97 5D11" /* Øúâsl.˵.©€–^—]. */
- $"0B1B 8E93 BDCC 1AE8 4CBA 9413 A729 F6A7" /* ..Ž“½Ì.èLº”.§)ö§ */
- $"F24D 467F 0316 BF60 F777 C2E3 7FAA DC07" /* òMF...¿`÷wÂã.ªÜ. */
- $"148F 5C26 91C3 20B8 F3A0 9088 F893 6D47" /* .\&‘Ã ¸ó ˆø“mG */
- $"7AC1 A0D9 5483 8281 5B98 28AE 9EAB 94F0" /* zÁ ÙTƒ‚[˜(®ž«”ð */
- $"9B68 08E3 E3DA 7E3A AA84 9EED F083 117F" /* ›h.ããÚ~:ª„žíðƒ.. */
- $"FE75 781E E394 EEEC F9AC 21D6 FF5E DD57" /* þux.ã”îìù¬!Öÿ^ÝW */
- $"96CF A7DF 3C0D 7E2F F9E7 F212 83EE E629" /* –ϧß<.~/ùçò.ƒîæ) */
- $"9543 AA61 C10A 4B12 1DD8 6835 405A D739" /* •CªaÁÂK..Øh5@Z×9 */
- $"DBD7 1628 2816 909D 1DEB 81F2 16AF 8953" /* Û×.((..ëò.¯‰S */
- $"9239 B79D A64A 3275 E506 BFD3 0198 776C" /* ’9·¦J2uå.¿Ó.˜wl */
- $"F4C2 39CD 4CF8 2482 D781 526A 7D82 0B83" /* ôÂ9ÍLø$‚×Rj}‚.ƒ */
- $"120C B2AB 1FC0 2DAA 4A72 ACD9 B4C7 926A" /* ..²«.À-ªJr¬Ù´Ç’j */
- $"CE69 46FA C67E 904D 12D4 D6EC 2F77 AC43" /* ÎiFúÆ~M.ÔÖì/w¬C */
- $"0A82 A09A 8FAC 59F0 D192 4F8F E6D1 A8B3" /* ‚ š¬YðÑ’OæѨ³ */
- $"26FD EAD1 7727 E253 F826 580D 8786 8EAD" /* &ýêÑw'âSø&X.‡†Ž­ */
- $"4561 33FC 6C93 72E4 3F53 3E92 5E78 9597" /* Ea3ül“rä?S>’^x•— */
- $"895F 61B9 D382 514D 839E D4E8 A40B 6F99" /* ‰_a¹Ó‚QMƒžÔè¤.o™ */
- $"0BEC 889F F976 6F24 AEAC 2A18 479B 9CD0" /* .숟ùvo$®¬*.G›œÐ */
- $"A58D E4A8 4940 D7A9 26A7 8649 C387 22EB" /* ¥ä¨I@ש&§†IÇ"ë */
- $"10F3 AB7F 805D 57F4 6918 508A 429D FC32" /* .ó«.€]Wôi.PŠBü2 */
- $"0E49 3480 E5A6 0267 54A6 D677 422D 1B62" /* .I4€å¦.gT¦ÖwB-.b */
- $"4DFB C3A4 2E01 8C0D 029D D238 87B0 230E" /* Mûä..Œ..Ò8‡°#. */
- $"AB6E AEFD 64F3 F7AE 7BD7 DA13 2BCC DCFB" /* «n®ýdó÷®{×Ú.+ÌÜû */
- $"13EC E7EE A36F 86C6 A2D8 DD70 6174 04FA" /* .ìçî£o†Æ¢ØÝpat.ú */
- $"B7F7 A3BF 9C4C F99C C177 9B27 9148 3998" /* ·÷£¿œLùœÁw›'‘H9˜ */
- $"013A 4B0C E3A5 6905 6ADC 739C 3586 7009" /* .:K.ã¥i.jÜsœ5†pÆ */
- $"38DA 0496 C25E DFB2 F2AB 34C0 F138 4F81" /* 8Ú.–Â^ß²ò«4Àñ8O */
- $"7240 2774 4588 B153 267B DBBE DFDE AEAD" /* r@'tEˆ±S&{Û¾ßÞ®­ */
- $"1D90 BA71 2B83 D108 1CDB 8B36 7837 8AAA" /* .ºq+ƒÑ..Û‹6x7Šª */
- $"299C 2916 D66C CC2E 2FCF B0E3 228A 88C1" /* )œ).ÖlÌ./Ï°ã"ŠˆÁ */
- $"568F 12D8 D599 AB3F 29DE 1FA6 9336 132F" /* V.ØÕ™«?)Þ.¦“6./ */
- $"521E 8EB9 9BD4 30E4 362E 349E 209A 6EB6" /* R.Ž¹›Ô0ä6.4ž šn¶ */
- $"D5CC 985B E51E 8A74 B9A0 1718 2753 A1E0" /* Õ̘[å.Št¹ ..'S¡à */
- $"BDCC 77CC 5697 641D B916 AB08 C12F 102F" /* ½ÌwÌV—d.¹.«.Á/./ */
- $"59A0 4283 27A8 9F9E 1980 381A 4785 E896" /* Y Bƒ'¨Ÿž.€8.G…è– */
- $"B9C8 A383 0C1E EBDE A8DC D1A0 00FB 61C2" /* ¹È£ƒ..ëÞ¨ÜÑ .ûa */
- $"70F1 84C8 8368 337E DA6C 7A1A 014F 77C3" /* pñ„ȃh3~Úlz..Owà */
- $"EFFF 0CCC F88E E539 B4FF 3187 54EA 4B2E" /* ïÿ.ÌøŽå9´ÿ1‡TêK. */
- $"27BF 1121 0DCD 456F 5AB4 E115 9E30 8B1C" /* '¿.!.ÍEoZ´á.ž0‹. */
- $"FCFB 8634 E35F E3F0 2A65 8EC0 775F C0EE" /* üû†4ã_ãð*eŽÀw_Àî */
- $"37B2 6C5A AA44 2B7C 889A 5854 FBB4 DC29" /* 7²lZªD+|ˆšXTû´Ü) */
- $"E875 94AB D4F4 19C2 5989 594D 6B55 CB5E" /* èu”«Ôô.ÂY‰YMkUË^ */
- $"012C A350 BF1C 322E 6DC6 6CFB 052A B48D" /* .,£P¿.2.mÆlû.*´ */
- $"2FFE D908 D443 2FB2 706F 13A8 B2BF 2E97" /* /þÙ.ÔC/²po.¨²¿.— */
- $"D7EF 6FE2 7D0B 4D6C 89E6 24BB D547 A266" /* ×ïoâ}.Ml‰æ$»ÕG¢f */
- $"3B92 FF58 BE83 0D95 D587 B51D B83A B360" /* ;’ÿX¾ƒ.•Õ‡µ.¸:³` */
- $"DF16 A55F 5D17 5ED7 C7D7 88FD D24B 89C4" /* ß.¥_].^×Ç׈ýÒK‰Ä */
- $"17FF 1CE0 2FC5 E332 79FF 6532 D599 2C36" /* .ÿ.à/Åã2yÿe2Õ™,6 */
- $"7360 56F2 6017 1165 F8CD AC09 6435 530F" /* s`Vò`..eøͬÆd5S. */
- $"8E48 0152 06AE 7F31 9D5A A12E EC4A 26BD" /* ŽH.R.®.1Z¡.ìJ&½ */
- $"1D28 2D81 EBF2 625A 03C8 8240 FAB0 343C" /* .(-ëòbZ.È‚@ú°4< */
- $"3460 4650 A369 CBAF D533 EC55 DB4D 46F7" /* 4`FP£i˯Õ3ìUÛMF÷ */
- $"45C4 1B75 581D CC26 9E29 8B0F C424 5512" /* EÄ.uX.Ì&ž)‹.Ä$U. */
- $"9417 F11C 77C1 F3FD 57B1 487F D8F8 A086" /* ”.ñ.wÁóýW±H.Øø † */
- $"E60E 2356 E9E1 F3EC 7F31 52E1 E3DB C75E" /* æ.#Véáóì.1RáãÛÇ^ */
- $"7A4B 2D19 8F06 AB86 5A88 F23D C312 C565" /* zK-..«†Zˆò=Ã.Åe */
- $"1AF0 4B35 F0D9 D100 6634 A377 90C1 A69A" /* .ðK5ðÙÑ.f4£wÁ¦š */
- $"1C64 495A BEF2 5A5C 1714 0504 2639 71A2" /* .dIZ¾òZ\....&9q¢ */
- $"5989 FF6E F887 5ADD 9843 A719 60CC 5185" /* Y‰ÿnø‡ZݘC§.`ÌQ… */
- $"B308 2551 F63A 7543 2A92 3949 FCC5 5023" /* ³.%Qö:uC*’9IüÅP# */
- $"5A92 FE32 A26E FF00 9CFC 0CFF 4A08 60C7" /* Z’þ2¢nÿ.œü.ÿJ.`Ç */
- $"F76C 480A E682 3C58 66B8 7045 CDBA 616C" /* ÷lHÂæ‚<Xf¸pEͺal */
- $"9995 BEC1 809B 0892 A7EC 43EC 7FE8 F49F" /* ™•¾Á€›.’§ìCì.èôŸ */
- $"9E4B AFD6 66BB 0B88 38ED B165 9C1D F096" /* žK¯Öf».ˆ8í±eœ.ð– */
- $"64EC FD43 9A7A BC84 8CEF 2E65 F99B 4B43" /* dìýCšz¼„Œï.eù›KC */
- $"7D47 3AE8 D0DB A066 308B 201D FF3F ABC1" /* }G:èÐÛ f0‹ .ÿ?«Á */
- $"CD0D B822 3734 A23E AF05 D1E1 F9F5 AF09" /* Í.¸"74¢>¯.Ñáùõ¯Æ */
- $"6428 F517 1201 C3F1 1B80 0DD2 DCD9 CA31" /* d(õ...Ãñ.€.ÒÜÙÊ1 */
- $"B022 DAFB D990 A8B1 6FF1 004E 4847 E5C8" /* °"ÚûÙ¨±oñ.NHGåÈ */
- $"0580 DA86 704F E2FF 7E83 5167 5C3F ADB2" /* .€Ú†pOâÿ~ƒQg\?­² */
- $"4C44 A9D9 DB84 C360 68ED 1BF0 068E 04BF" /* LD©ÙÛ„Ã`hí.ð.Ž.¿ */
- $"D16E B55F 0701 3739 42FA E15C 0EA2 BF81" /* Ñnµ_..79Búá\.¢¿ */
- $"31C1 F1A3 A766 CAB8 C82E C96B 4868 D491" /* 1Áñ£§fʸÈ.ÉkHhÔ‘ */
- $"5ACB 6EED 4027 0C73 AACA 730C ECA6 DE42" /* ZËní@'.sªÊs.ì¦ÞB */
- $"38DA E07E CE64 BC49 7FDD FCCB 07B3 45BF" /* 8Úà~Îd¼I.ÝüË.³E¿ */
- $"B9DC FF13 039F D40E 43BB ACE4 B8F8 31F5" /* ¹Üÿ..ŸÔ.C»¬ä¸ø1õ */
- $"6743 9390 0B87 C9B1 194A 0200 FB53 29CD" /* gC“.‡É±.J..ûS)Í */
- $"3141 15F5 3C38 9F70 2B7E 0E46 B5A7 5C94" /* 1A.õ<8Ÿp+~.Fµ§\” */
- $"AED4 E415 1639 7B49 20DA 1541 9742 A3A6" /* ®Ôä..9{I Ú.A—B£¦ */
- $"B873 4C7C 9112 1322 7D7F 5F6E 14AB 57FC" /* ¸sL|‘.."}._n.«Wü */
- $"A01D 94EC BC05 F45B C4C4 1FC3 D61B F5D3" /*  .”ì¼.ô[ÄÄ.ÃÖ.õÓ */
- $"0E62 9C2F CAE6 C609 B0D2 803B AF5F CC7F" /* .bœ/ÊæÆÆ°Ò€;¯_Ì. */
- $"4085 5B49 F81B 0AB3 DB0C 27C1 7A95 45D6" /* @…[Iø.³Û.'Áz•EÖ */
- $"CDDD 4F06 1A20 A7FE 22F6 EA13 EB6E C723" /* ÍÝO.. §þ"öê.ënÇ# */
- $"87B9 A058 CAF9 9F59 C9C9 6AAD 8358 5147" /* ‡¹ XÊùŸYÉÉj­ƒXQG */
- $"2B3E 2FD8 506F A48B 305C 97C7 5D25 5C75" /* +>/ØPo¤‹0\—Ç]%\u */
- $"C5B1 E7B4 CBC7 C76A 2FE5 1669 302C 2318" /* űç´ËÇÇj/å.i0,#. */
- $"CB1D BB38 5B47 3563 F041 0F00 C23A B1E9" /* Ë.»8[G5cðA..Â:±é */
- $"1972 D9C9 2F2F 4013 F8EF A6CA 7E8E 705C" /* .rÙÉ//@.øï¦Ê~Žp\ */
- $"0CB6 1301 5ED4 25E6 F7D9 999D AB8F 4CAC" /* .¶..^Ô%æ÷Ù™«L¬ */
- $"6FF2 04C8 8307 016C 6E46 645B 5488 79C0" /* oò.ȃ..lnFd[TˆyÀ */
- $"C0E5 8A2A 46EB DB4C 65A0 27FC 6230 781C" /* ÀåŠ*FëÛLe 'üb0x. */
- $"EDB8 4666 1604 1937 9603 A2AA D8C3 43A6" /* í¸Ff...7–.¢ªØÃC¦ */
- $"E254 D745 866F D24A DD91 397E C575 F187" /* âT×E†oÒJÝ‘9~Åuñ‡ */
- $"193B F5F5 819B 7D57 EC83 0871 ED1B 64F6" /* .;õõ›}Wìƒ.qí.dö */
- $"E47A E1B0 65F9 67DF 5680 3642 52AA BB4B" /* äzá°eùgßV€6BRª»K */
- $"BA52 D8BA 8AF7 0A96 412A 92B2 045F 9739" /* ºRغŠ÷–A*’²._—9 */
- $"3A52 D961 6BC6 1D2E D90D 29A7 E9DE 2651" /* :RÙakÆ..Ù.)§éÞ&Q */
- $"CE3F 9921 03BC 7A7A CBFD 63E2 4C7C 9025" /* Î?™!.¼zzËýcâL|% */
- $"BCC3 D509 745E 9AE4 1675 0242 26EE E4F6" /* ¼ÃÕÆt^šä.u.B&îäö */
- $"B04B CFB3 E37F EADB 2840 E47E 0209 C8C5" /* °Kϳã.êÛ(@ä~.ÆÈÅ */
- $"56FC 6228 BB57 F43A BE32 0753 73FB EAE2" /* Vüb(»Wô:¾2.Ssûêâ */
- $"55B4 D581 42C8 10B8 AEA9 67C4 F685 982C" /* U´ÕBÈ.¸®©gÄö…˜, */
- $"3104 095F DCBD 3701 8749 9CBA A7A5 B714" /* 1.Æ_ܽ7.‡Iœº§¥·. */
- $"FDED FAA3 F034 54D8 728F 8640 4A61 560C" /* ýíú£ð4TØr†@JaV. */
- $"50D4 B224 A5F1 6715 6C8B 7EC6 BF5C 120D" /* PÔ²$¥ñg.l‹~Æ¿\.. */
- $"8797 B25E B0E1 C57E 69AF 1FF2 99C3 44B5" /* ‡—²^°áÅ~i¯.ò™ÃDµ */
- $"0508 0061 1F44 795F 27C0 511E 0796 9740" /* ...a.Dy_'ÀQ..–—@ */
- $"14FF 4C51 5651 34F3 658D 4CA8 3FBF 43CC" /* .ÿLQVQ4óeL¨?¿CÌ */
- $"8813 D372 1723 7DB5 6D44 4524 4E91 B644" /* ˆ.Ór.#}µmDE$N‘¶D */
- $"4B7D CDEC E0E0 8468 622D 87FE 80E3 E097" /* K}Íìàà„hb-‡þ€ãà— */
- $"303D 8894 1FFF 7FA6 9AAB C6E0 0B83 3EDD" /* 0=ˆ”.ÿ.¦š«Æà.ƒ>Ý */
- $"86A5 43D3 C650 0008 D364 A800 0000 0000" /* †¥CÓÆP..Ód¨..... */
- $"0000 07D7 8F92 61B9 E6E0 BCBF CD4A AB76" /* ...×’a¹æ༿ÍJ«v */
- $"5B6E 246A 8DFB D274 41F9 3583 773D 5165" /* [n$jûÒtAù5ƒw=Qe */
- $"2139 B773 476E DF91 33F0 8CDA F420 613F" /* !9·sGnß‘3ðŒÚô a? */
- $"9B35 33C9 8298 A661 A5DB 2CEF 1A1C BC3E" /* ›53É‚˜¦a¥Û,ï..¼> */
- $"09B4 5415 8511 4FE5 3FF8 B88C 339D C169" /* Æ´T.….Oå?ø¸Œ3Ái */
- $"9608 FF62 B2D6 285A 80A2 22C9 E4AA 5A99" /* –.ÿb²Ö(Z€¢"ÉäªZ™ */
- $"B3F5 E9D4 7FFF 7FF4 7D5C 4CC0 788F 0EB6" /* ³õéÔ.ÿ.ô}\LÀx.¶ */
- $"8024 0000 0A1E 1F40 0000 0000 0000 0000" /* €$..Â..@........ */
- $"CA54 CF6A 897B B6D7 9C90 87E9 FF6A 22A0" /* ÊTÏj‰{¶×œ‡éÿj"  */
- $"0765 4AE8 B827 B7A1 C412 4000 0000 0000" /* .eJè¸'·¡Ä.@..... */
- $"0000 2222 DAB7 AEED C4EB AFCB FF79 6610" /* ..""Ú·®íÄë¯Ëÿyf. */
- $"A362 D5F2 1401 DA9F 8978 3FC3 FF60 341C" /* £bÕò..ÚŸ‰x?Ãÿ`4. */
- $"524C CBF3 AF64 9BA4 637F F217 CA8C A4CE" /* RLËó¯d›¤c.ò.ÊŒ¤Î */
- $"A881 46DE C63F CB0B 4C86 F71C CDFF 6CDC" /* ¨FÞÆ?Ë.L†÷.ÍÿlÜ */
- $"3C86 AFD6 02EF 25B3 E392 0238 14ED F9FF" /* <†¯Ö.ï%³ã’.8.íùÿ */
- $"71EA 1A7B 7848 281D C18D 83C1 F0D1 C115" /* qê.{xH(.ÁƒÁðÑÁ. */
- $"C525 7E38 9E60 32A4 CED2 A5DE 8006 1212" /* Å%~8ž`2¤ÎÒ¥Þ€... */
- $"7136 14A1 74D1 9C7D F74C 708E 43DE 4154" /* q6.¡tÑœ}÷LpŽCÞAT */
- $"2939 179A 87BB 2AAF 7401 4404 CB30 458F" /* )9.š‡»*¯t.D.Ë0E */
- $"F1B7 EE42 3E46 458F B220 6F30 EE24 7D86" /* ñ·îB>FE² o0î$}† */
- $"2D28 3CA7 C184 60D3 4EBC 9C79 C402 02FC" /* -(<§Á„`ÓN¼œyÄ..ü */
- $"553C C62D DDC0 3D0C F12B C1FF 546D A4FF" /* U<Æ-ÝÀ=.ñ+ÁÿTm¤ÿ */
- $"5885 6B1B 9EF6 2206 8FB5 1CB0 2D3D B922" /* X…k.žö".µ.°-=¹" */
- $"644F D104 0152 70F8 BF41 4D6E 4F05 B928" /* dOÑ..Rpø¿AMnO.¹( */
- $"396A 4A92 9B1B 24AB 4611 6D95 87D6 2D7C" /* 9jJ’›.$«F.m•‡Ö-| */
- $"7546 B839 A3B1 C612 0F2A 796E 7911 5FF9" /* uF¸9£±Æ..*yny._ù */
- $"03C4 D13E EF00 2DEF 9CFE FDDE 3A2C FF3E" /* .ÄÑ>ï.-ïœþýÞ:,ÿ> */
- $"4567 F432 3673 3F84 8787 B65C 7A4F 2007" /* Egô26s?„‡‡¶\zO . */
- $"FF7C D894 A762 3872 8FA4 9563 D178 5039" /* ÿ|Ø”§b8r¤•cÑxP9 */
- $"C4BD 2EB4 0491 2A80 0000 0000 0000 0001" /* Ľ.´.‘*€........ */
- $"F172 6FA1 09F2 9F35 F3BC 2E0B 8E46 2557" /* ñro¡ÆòŸ5ó¼..ŽF%W */
- $"67C5 4F12 D1CF F08C BC61 0F89 E4A4 9249" /* gÅO.ÑÏðŒ¼a.‰ä¤’I */
- $"2492 4924 9249 221B 4708 65ED 84CA FDD2" /* $’I$’I".G.eí„ÊýÒ */
- $"D193 7C69 0CA3 95EF DDF2 33FF 556E D976" /* Ñ“|i.£•ïÝò3ÿUnÙv */
- $"2E4D FDCE E0FC 8669 83FF 768E 3CBB 179B" /* .MýÎàü†iƒÿvŽ<».› */
- $"DBB9 253D BFFF 79F1 5006 27BF 5548 40B9" /* Û¹%=¿ÿyñP.'¿UH@¹ */
- $"BADC F963 10BA 8BD9 367F E03A 6E29 5908" /* ºÜùc.º‹Ù6.à:n)Y. */
- $"0000 0000 0000 0000 0028 8080 0000 000A" /* .........(€€... */
- $"6370 D000 0142 83C0 0000 0011 CD3F D940" /* cpÐ..BƒÀ....Í?Ù@ */
- $"0022 C990 C912 501C 14FC 1926 5412 0E88" /* ."ÉÉ.P..ü.&T..ˆ */
- $"C32F B2ED E7A4 9249 2492 4924 9249 247E" /* Ã/²í礒I$’I$’I$~ */
- $"FB2C 999E D2ED 6DFF 783B 4C3A 3DB7 14A5" /* û,™žÒímÿx;L:=·.¥ */
- $"872C 2B85 8FC2 72EA 3412 FCA8 32E0 7A2E" /* ‡,+…Ârê4.ü¨2àz. */
- $"B109 F66C 3F99 7C32 2761 1522 7B9C 1851" /* ±Æöl?™|2'a."{œ.Q */
- $"B3CB 5373 0652 CE79 D8C5 B721 03D7 CD81" /* ³ËSs.RÎyØÅ·!.×Í */
- $"A03A CD5F CECF B58A 4122 7ED2 9FFF 7FFF" /*  :Í_ÎϵŠA"~ÒŸÿ.ÿ */
- $"1575 DF0B 430B 0A6C 6108 B421 B33F E9FA" /* .uß.C.Âla.´!³?éú */
- $"AC06 391C EB01 17F4 3BF4 4CDA 87DA 516F" /* ¬.9.ë..ô;ôLÚ‡ÚQo */
- $"EFA3 E7F9 651A 6902 C269 AF79 2EA4 D861" /* ï£çùe.i.Âi¯y.¤Øa */
- $"CBC1 7F37 146D 4163 38BB B16B AAD4 9AC2" /* ËÁ.7.mAc8»±kªÔšÂ */
- $"424A B3CE 1368 78EF B4B0 FE68 2FBA 0CB2" /* BJ³Î.hxï´°þh/º.² */
- $"E672 A89D 999E 64CD 417A 98A3 8458 0603" /* ær¨™ždÍAz˜£„X.. */
- $"C03D 9F9E B15E 8418 0FC6 F3E0 BA39 A3C1" /* À=Ÿž±^„..Æóàº9£Á */
- $"9929 0547 9C29 FC76 57CA B1E5 F887 AE73" /* ™).Gœ)üvWʱåø‡®s */
- $"78AA BA9F FF7F C07C 00F0 28E9 7533 0FC1" /* xªºŸÿ.À|.ð(éu3.Á */
- $"097C 4ABC F3CB 6604 EEC2 5194 A1F2 A201" /* Æ|J¼óËf.îÂQ”¡ò¢. */
- $"D6B0 C5F3 4AA3 8FD8 34DC A382 0CD4 134E" /* Ö°ÅóJ£Ø4Ü£‚.Ô.N */
- $"8275 37F5 2388 74C6 1A6C F889 1037 A348" /* ‚u7õ#ˆtÆ.lø‰.7£H */
- $"ACB4 EFF5 B446 564C C6DC 75F7 8445 013F" /* ¬´ïõ´FVLÆÜu÷„E.? */
- $"79FF 407B 05EE 9C66 8A53 FF7A 367A 6D06" /* yÿ@{.îœfŠSÿz6zm. */
- $"9ADF CBDD 25B5 0629 78A0 A071 35BA EE49" /* šßËÝ%µ.)x  q5ºîI */
- $"64E9 3EA3 9A07 917A 66E3 090C B916 3BF5" /* dé>£š.‘zfãÆ.¹.;õ */
- $"10D7 77D5 7281 248E 3F09 0C0F 319E 7F71" /* .×wÕr$Ž?Æ..1ž.q */
- $"98DA A34A C823 06A4 6BFD 8EA1 8C71 EB25" /* ˜Ú£JÈ#.¤kýŽ¡Œqë% */
- $"E5FC 0BA1 DB35 9514 A229 56F0 7E42 9FD0" /* åü.¡Û5•.¢)Vð~BŸÐ */
- $"5435 3CB7 AED9 0A4F 625B A493 D1B2 C654" /* T5<·®ÙÂOb[¤“ѲÆT */
- $"F691 87F9 F8E9 7459 1823 E06B 57D6 C638" /* ö‘‡ùøétY.#àkWÖÆ8 */
- $"7EE2 8CA0 1D79 4000 0000 0000 0000 0000" /* ~⌠.y@......... */
- $"0000 0000 442A 0D8C 8522 4E1A 3752 5040" /* ....D*.Œ…"N.7RP@ */
- $"E53D EE69 0B70 A6BF 9D0D D725 D66E 8D50" /* å=îi.p¦¿.×%ÖnP */
- $"10DB 966B 649B 0CA3 958B 6457 90CC 214A" /* .Û–kd›.£•‹dWÌ!J */
- $"C4C0 27A2 95F4 98AD 14C2 1892 EBE7 864B" /* ÄÀ'¢•ô˜­.Â.’ëç†K */
- $"18AA 55C7 50D2 4A15 7F4E 566A 9C13 9C52" /* .ªUÇPÒJ..NVjœ.œR */
- $"AC77 FE86 B3A2 5D92 D112 516C BA99 60EE" /* ¬wþ†³¢]’Ñ.Qlº™`î */
- $"221A F194 D9DF FF5F FF6B 77F9 4B01 4F8F" /* ".ñ”Ùßÿ_ÿkwùK.O */
- $"F681 8614 2F3E 31E3 EABB 7C34 6025 A491" /* ö†./>1ãê»|4`%¤‘ */
- $"9BC1 A348 628D 34AE 751A F8F7 7521 7F48" /* ›Á£Hb4®u.ø÷u!.H */
- $"68A4 6B9C F66F 252D 6021 9C97 39AB B637" /* h¤kœöo%-`!œ—9«¶7 */
- $"3B5D E8FB 56EE 824A F65D C84D E23C 7BF2" /* ;]èûVî‚Jö]ÈMâ<{ò */
- $"5400 0000 0000 0000 0000 0000 0014 080D" /* T............... */
- $"B05B 4688 1F60 376D 2209 1DE1 7E75 CD30" /* °[Fˆ.`7m"Æ.á~uÍ0 */
- $"5D2F 627B A077 8D86 2001 62AF 1031 6853" /* ]/b{ w† .b¯.1hS */
- $"2A8E 0308 16F6 C4EC E5B6 814A 1DF2 23EB" /* *Ž...öÄìå¶J.ò#ë */
- $"8C16 64F9 A1ED 8A1F 346E 2E1C 5ACB 4376" /* Œ.dù¡íŠ.4n..ZËCv */
- $"5014 B885 5212 5294 8F4F DF56 7339 8A5D" /* P.¸…R.R”OßVs9Š] */
- $"03C0 A05F D60B 5D58 2677 CD67 A4EE 3803" /* .À _Ö.]X&wÍg¤î8. */
- $"B2B1 9AD5 A41A C3EF 3281 3FFF 780A A5BD" /* ²±šÕ¤.Ãï2?ÿxÂ¥½ */
- $"861B 62F7 456F 1021 93CD A115 BD61 7E4C" /* †.b÷Eo.!“Í¡.½a~L */
- $"2306 D6BF D5D9 18AF 12BB 22D9 E32E 6976" /* #.Ö¿ÕÙ.¯.»"Ùã.iv */
- $"9282 5E47 A842 7983 2C87 64C5 6215 A0D9" /* ’‚^G¨Byƒ,‡dÅb. Ù */
- $"E45A EFAE 74F3 E5E5 7679 A7C0 D366 649C" /* äZï®tóååvy§ÀÓfdœ */
- $"9EF3 D763 2D6C D0AD 48E5 7A2A 9454 8B34" /* žó×c-lЭHåz*”T‹4 */
- $"B7FF 7FCD F604 90E4 2716 1C40 DD8A 8B1A" /* ·ÿ.Íö.ä'..@ÝŠ‹. */
- $"24C8 2F0C 06AC 999A 58B7 C15E E6B1 431B" /* $È/..¬™šX·Á^æ±C. */
- $"73D1 FEC5 5182 4A2D 33CB E920 AFBE 9F5A" /* sÑþÅQ‚J-3Ëé ¯¾ŸZ */
- $"0478 C2F3 80D7 241A 2E07 8BF3 FD3F 471A" /* .xÂó€×$...‹óý?G. */
- $"7C53 1C79 2F17 C32F D5C6 B977 E2F9 9D80" /* |S.y/.Ã/Õƹwâù€ */
- $"558B 7336 75BC 5945 3986 BD1C CE95 EA07" /* U‹s6u¼YE9†½.Εê. */
- $"7152 C778 65AD 73E9 F1B7 24D4 BDB0 7F24" /* qRÇxe­séñ·$Ô½°.$ */
- $"BACD 3C51 D344 33D7 21C7 BE9A 915D 2808" /* ºÍ<QÓD3×!Ǿš‘](. */
- $"3E68 3F1B 43AE 8F30 CE7F FF67 1C78 8498" /* >h?.C®0Î.ÿg.x„˜ */
- $"08D8 E1D9 3F1A E50B EB7C E564 6F4C 57F3" /* .ØáÙ?.å.ë|ådoLWó */
- $"9E60 5F9B 244E 83A9 33C9 668A 3951 7E33" /* ž`_›$Nƒ©3ÉfŠ9Q~3 */
- $"31D7 01E7 0342 6BC0 7FD1 7488 2BE1 9AD1" /* 1×.ç.BkÀ.Ñtˆ+ášÑ */
- $"1938 BBD8 7710 BAD3 BB92 2C80 A162 B2EF" /* .8»Øw.ºÓ»’,€¡b²ï */
- $"3FEA 6FC2 47D2 0D0E 28AB 03DA 4B34 4027" /* ?êoÂGÒ..(«.ÚK4@' */
- $"7FFD 87BC 9D96 E076 3C00 0000 0000 0000" /* .ý‡¼–àv<....... */
- $"0000 0000 0000 136C 1721 95F0 1991 3F80" /* .......l.!•ð.‘?€ */
- $"65DC 1F3F AEA0 BE5C 71D2 94CE C7FF 7FFF" /* eÜ.?® ¾\qÒ”ÎÇÿ.ÿ */
- $"7917 BEAD D458 935A 563C CC9C 6C0D CFFF" /* y.¾­ÔX“ZV<Ìœl.Ïÿ */
- $"55DA 93C2 F199 3D1E C4C2 3C5F A7BC D48E" /* UÚ“Âñ™=.ÄÂ<_§¼ÔŽ */
- $"4980 037B 9FCC F7BC 6E1E 78CD 2838 DC58" /* I€.{ŸÌ÷¼n.xÍ(8ÜX */
- $"F156 C827 88EA BFF7 BD95 BBD6 FE11 C305" /* ñVÈ'ˆê¿÷½•»Öþ.Ã. */
- $"A1D2 FA2A EA0B E56B 285B 91FE 551E F5E2" /* ¡Òú*ê.åk([‘þU.õâ */
- $"687C 5A51 1A67 64D3 BD76 4937 F455 4C94" /* h|ZQ.gdÓ½vI7ôUL” */
- $"6A7E B888 CB40 7AA3 DDEE 8BD8 2D9F 1EB6" /* j~¸ˆË@z£Ýî‹Ø-Ÿ.¶ */
- $"48DF 9C66 6BF3 A26A 3CC4 2D4D E47A 6D9A" /* Hßœfkó¢j<Ä-Mäzmš */
- $"DAB1 1DA4 083A D994 4416 C0D2 2E63 539E" /* Ú±.¤.:Ù”D.ÀÒ.cSž */
- $"7274 3C04 85F4 D7B5 EDEF 507A B2B7 1832" /* rt<.…ô×µíïPz²·.2 */
- $"6615 A186 4A80 0000 0000 0000 0000 0000" /* f.¡†J€.......... */
- $"07CF BF6C 3626 7453 BF7D 8B57 26C9 F556" /* .Ï¿l6&tS¿}‹W&ÉõV */
- $"1F12 0BB9 5DC4 797D 3C69 7DB2 2FFF 7F33" /* ...¹]Äy}<i}²/ÿ.3 */
- $"81FC E4ED 4BF8 9180 3FD2 0142 3F2D 1DF0" /* üäíKø‘€?Ò.B?-.ð */
- $"097B D61C 019A C409 B506 26FC D55D 7AE9" /* Æ{Ö..šÄƵ.&üÕ]zé */
- $"3464 6C57 13E7 565F 2553 70C3 3EC7 87AC" /* 4dlW.çV_%SpÃ>LJ¬ */
- $"3161 5289 3A6A FC0B E254 CAFA 6A32 2F8C" /* 1aR‰:jü.âTÊúj2/Œ */
- $"8B76 FA87 DADD 0333 2250 0058 F5C6 21CD" /* ‹vú‡ÚÝ.3"P.XõÆ!Í */
- $"D094 5CD5 10DD 2FA0 B74B 06FB AA9B 2B62" /* Д\Õ.Ý/ ·K.ûª›+b */
- $"E36D 708E B8F5 0739 3097 7F03 47BE 48F5" /* ãmpŽ¸õ.90—..G¾Hõ */
- $"D079 1641 CA5D DF28 C92B 0EFA B18F CE6F" /* Ðy.AÊ]ß(É+.ú±Îo */
- $"6648 DB26 DE5C 1D17 2BD3 28AF DD89 801C" /* fHÛ&Þ\..+Ó(¯Ý‰€. */
- $"AB0D 40D1 9016 D542 63A0 8222 9D7A F0F5" /* «.@Ñ.ÕBc ‚"zðõ */
- $"A171 2D28 3D2C C22E 09AB 3AA9 C50B 7545" /* ¡q-(=,Â.Æ«:©Å.uE */
- $"4C64 18E8 8E67 3A7D DDBE 36CE 2F97 5AD0" /* Ld.èŽg:}ݾ6Î/—ZÐ */
- $"E4F0 8AFB 6071 6268 E5F6 09EA 245F 9F87" /* äðŠû`qbhåöÆê$_Ÿ‡ */
- $"E304 242C 234C 9FF7 1D0A 11C7 4FE7 20BC" /* ã.$,#LŸ÷.Â.ÇOç ¼ */
- $"EC58 1A4B 5A8E DE45 0E5F 4A03 4C8A 5051" /* ìX.KZŽÞE._J.LŠPQ */
- $"E410 4405 321B BD82 AC69 94F7 AA5E 5C65" /* ä.D.2.½‚¬i”÷ª^\e */
- $"436F 861A C95F 1AB0 2E2B 9689 AA43 B247" /* Co†.É_.°.+–‰ªC²G */
- $"6DE3 4E9E F205 F221 D175 86BB 4434 C0EE" /* mãNžò.ò!Ñu†»D4Àî */
- $"C472 EA2B 499D 63FA B4C8 FAB3 91F3 060D" /* Ärê+Icú´Èú³‘ó.. */
- $"C203 A636 1D98 6B00 D678 0D3C BE92 309E" /* Â.¦6.˜k.Öx.<¾’0ž */
- $"759A 11D4 B514 24FB E4D2 7089 76DE 42DD" /* uš.Ôµ.$ûäÒp‰vÞBÝ */
- $"5338 4798 5943 4A6B 500A 472E 77BE AEBD" /* S8G˜YCJkPÂG.w¾®½ */
- $"93B0 117A 0E2D A8E4 DFED 5A76 1775 2BFF" /* “°.z.-¨äßíZv.u+ÿ */
- $"1A84 CBE1 B007 D3EA 11B0 9BB8 4B3F BB56" /* .„Ëá°.Óê.°›¸K?»V */
- $"33F6 B242 4C5C A63D 638F 1BA5 0AC5 698D" /* 3ö²BL\¦=c.¥ÂÅi */
- $"45B3 D343 D769 FEEE C45D 50B0 9AAA 4146" /* E³ÓC×iþîÄ]P°šªAF */
- $"0BFA F8CC 694B A42D FC1E C3F1 54F0 D3F9" /* .úøÌiK¤-ü.ÃñTðÓù */
- $"F051 5182 D373 5210 38AA F9B0 D3F3 6B07" /* ðQQ‚ÓsR.8ªù°Óók. */
- $"C944 7FCA 2126 D17A 01B1 7763 CDE8 D5FF" /* ÉD.Ê!&Ñz.±wcÍèÕÿ */
- $"00F4 08D7 4060 339C D8E2 7EA4 B00D 3171" /* .ô.×@`3œØâ~¤°.1q */
- $"ABB0 7F47 D146 13B9 398E 14B3 C55D 10AF" /* «°.GÑF.¹9Ž.³Å].¯ */
- $"8D0A 2444 26A0 EFEA 6CB2 51FD EA28 0FD7" /* Â$D& ïêl²Qýê(.× */
- $"4E2F F54F 0066 62F2 66F3 334C 5D9D 77ED" /* N/õO.fbòfó3L]wí */
- $"F3D0 12ED 7A95 89A1 B928 8429 DCFB 8C68" /* óÐ.íz•‰¡¹(„)ÜûŒh */
- $"C35C 3C77 5D7D 5180 A012 ADA3 AE60 AAE0" /* Ã\<w]}Q€ .­£®`ªà */
- $"0D88 09A4 4F7B FAC4 A2FD 327D E109 4F0B" /* .ˆÆ¤O{úÄ¢ý2}áÆO. */
- $"3343 C0ED D985 7402 93E2 7A2E 09B4 09A6" /* 3CÀíÙ…t.“âz.ƴƦ */
- $"5348 2E51 C037 BE62 C1A7 15C4 B9C8 7F4B" /* SH.QÀ7¾bÁ§.ĹÈ.K */
- $"FC22 3596 D989 C701 6701 5488 1001 22B2" /* ü"5–Ù‰Ç.g.Tˆ.."² */
- $"C06A A5D5 2C94 6BA9 D1C6 2B33 5910 8B1F" /* Àj¥Õ,”k©ÑÆ+3Y.‹. */
- $"0B0D 5531 BE0F 3E72 9C60 75A8 2669 220D" /* ..U1¾.>rœ`u¨&i". */
- $"E140 D538 7CD4 5763 D708 6D5E 45C0 AE61" /* á@Õ8|ÔWc×.m^EÀ®a */
- $"EC8B E180 1D9C 712C 4DB9 F177 6733 0F76" /* ì‹á€.œq,M¹ñwg3.v */
- $"9A72 7AD0 D18D 2BE6 9DCE 6294 4092 CE8E" /* šrzÐÑ+æÎb”@’ÎŽ */
- $"ACED 8B00 B050 AE53 C09C 98D6 CFD1 4208" /* ¬í‹.°P®SÀœ˜ÖÏÑB. */
- $"DEB2 AF01 5ED7 E1F4 4EAA 0B09 2263 FE09" /* Þ²¯.^×áôNª.Æ"cþÆ */
- $"2771 6EB7 9181 1DFE A5DD 9A12 4592 02FD" /* 'qn·‘.þ¥Ýš.E’.ý */
- $"5F2D D4D6 5C15 B454 B07C 9B6A B9F9 AEC2" /* _-ÔÖ\.´T°|›j¹ù®Â */
- $"D883 1F5F B9B1 8258 6732 C7E3 5C90 DB16" /* ؃._¹±‚Xg2Çã\Û. */
- $"42EC D875 2B9D FEAF 1FED BD80 261D BAAE" /* BìØu+þ¯.í½€&.º® */
- $"3799 FDC7 DBE5 E769 A11C 3304 5D3B 419C" /* 7™ýÇÛåçi¡.3.];Aœ */
- $"5844 E615 EE7A 5DCE 272E D055 121D 1F84" /* XDæ.îz]Î'.ÐU...„ */
- $"2EC6 E6B1 A7DA D03A D600 6D58 4FF0 9196" /* .Æ汧ÚÐ:Ö.mXOð‘– */
- $"FBCA CDDC 1B8D 9D1A BB7B 3782 0F3F 626C" /* ûÊÍÜ..»{7‚.?bl */
- $"26AA AF34 6A20 8210 1E96 ED21 5A26 EF04" /* &ª¯4j ‚..–í!Z&ï. */
- $"5F66 5C2D A8A4 F3BC 1871 AD1D FE4D 8C8B" /* _f\-¨¤ó¼.q­.þMŒ‹ */
- $"F1E5 A382 654B 08C7 EFC4 BFBA C29B 5C73" /* ñ壂eK.ÇïÄ¿ºÂ›\s */
- $"2420 9390 3B75 6DE6 0208 6F4F BB53 B2AA" /* $ “;umæ..oO»S²ª */
- $"AD28 4360 1A8A 4301 088C 6F17 68CC 9180" /* ­(C`.ŠC..Œo.hÌ‘€ */
- $"D757 7012 3BE3 C4AB DF05 97B9 4B57 B6FC" /* ×Wp.;ãÄ«ß.—¹KW¶ü */
- $"7693 36DE 89E8 E2AB 4352 A782 4520 DA28" /* v“6Þ‰èâ«CR§‚E Ú( */
- $"F1F2 34D6 2EAE E401 ED61 1E2E 4E74 D4EB" /* ñò4Ö.®ä.ía..NtÔë */
- $"98A9 94AD F856 8EE1 E3D0 06FC AA37 31E5" /* ˜©”­øVŽáãÐ.üª71å */
- $"1047 113E C151 CE86 B6A4 0F82 E5D9 CE50" /* .G.>ÁQΆ¶¤.‚åÙÎP */
- $"57A8 8F86 AFAD 21D1 2C4C F181 8BD7 106C" /* W¨†¯­!Ñ,Lñ‹×.l */
- $"3C77 649E 038E 3C63 66F4 EE1A 2906 755C" /* <wdž.Ž<cfôî.).u\ */
- $"EDD8 6093 6868 531C 9FA3 C5C9 3F3C 7786" /* íØ`“hhS.Ÿ£ÅÉ?<w† */
- $"BCC4 440C 13F9 0BCB 76BA 9364 A3CC 344F" /* ¼ÄD..ù.Ëvº“d£Ì4O */
- $"128B D594 CB9D A2DC 6C03 CA48 2D9E 9706" /* .‹Õ”Ë¢Ül.ÊH-ž—. */
- $"A281 5170 A91B 0033 4552 2A9A BF6F D4A9" /* ¢Qp©..3ER*š¿oÔ© */
- $"61B6 F6C1 7959 FDD2 8F3F C94B 2B90 29BB" /* a¶öÁyYýÒ?ÉK+)» */
- $"9FAA A83B FEFF 80A3 1EC2 B2D9 77CF 963B" /* Ÿª¨;þÿ€£.²ÙwÏ–; */
- $"85FF 5728 5CDD 2F01 7556 8155 F8AA 7984" /* …ÿW(\Ý/.uVUøªy„ */
- $"7543 0C18 A1FC 0353 DF5F D368 41E9 E0EF" /* uC..¡ü.Sß_ÓhAéàï */
- $"C363 A78F 3FE9 41E9 5F77 19A4 A811 FF43" /* Ãc§?éAé_w.¤¨.ÿC */
- $"8EE8 3FBA 00FA 54F6 15F5 CF3B 39A6 0984" /* Žè?º.úTö.õÏ;9¦Æ„ */
- $"CC99 7AE1 8E5B 71A9 1575 DB95 F166 D52F" /* Ì™záŽ[q©.uÛ•ñfÕ/ */
- $"A270 08D4 9515 3B89 2EA1 A097 12A3 B4E9" /* ¢p.Ô•.;‰.¡ —.£´é */
- $"5BFB AE47 8FD7 60F0 33DA E91B 234B 5D2F" /* [û®G×`ð3Úé.#K]/ */
- $"7C4B 00C2 60F1 7260 B78A 1835 B440 611B" /* |K.Â`ñr`·Š.5´@a. */
- $"042D F768 F9C9 8785 50AD 8421 77D4 B97A" /* .-÷hùɇ…P­„!wÔ¹z */
- $"6B02 828C E758 8B31 1E92 DF7F BE67 3DAB" /* k.‚ŒçX‹1.’ß.¾g=« */
- $"E5F8 F1FB FD8C 34F4 4B2F 98BF 24A9 4DF2" /* åøñûýŒ4ôK/˜¿$©Mò */
- $"32A9 A661 B01E F960 12E1 9C18 F197 CEA7" /* 2©¦a°.ù`.áœ.ñ—Χ */
- $"E1C4 4AB4 7CEB 2CE2 33F3 C23C F3FD 2CF9" /* áÄJ´|ë,â3óÂ<óý,ù */
- $"F132 8395 3D39 FD9D 983D 4454 9758 856B" /* ñ2ƒ•=9ý˜=DT—X…k */
- $"6556 B234 72B0 C2CA 71CA 9CEB 7AE4 FD7C" /* eV²4r°ÂÊqÊœëzäý| */
- $"0E3F 1930 6B17 7074 C216 3D9C 24BF 5B97" /* .?.0k.ptÂ.=œ$¿[— */
- $"A7EA 25F0 9DCC AFA5 BBEF 47E9 D7E6 7B0E" /* §ê%ð̯¥»ïGé×æ{. */
- $"E02F 87A2 EF87 68FC 9BF7 F274 5F00 FC3D" /* à/‡¢ï‡hü›÷òt_.ü= */
- $"A5F8 7AC7 F0FA A5F8 7D42 C03F 0F42 FE1D" /* ¥øzÇðú¥ø}BÀ?.Bþ. */
- $"ABF0 F7CF E1EE 40ED 1CBC E67A C7C3 33E9" /* «ð÷Ïáî@í.¼æzÇÃ3é */
- $"75CE 6202 697A FF68 B299 C0A6 2F39 4F64" /* uÎb.izÿh²™À¦/9Od */
- $"6775 1459 6387 68C9 941E E328 B150 8D7C" /* gu.Yc‡hÉ”.ã(±P| */
- $"24C4 D953 4443 9A50 E4CC 4E41 B3A9 F28A" /* $ÄÙSDCšPäÌNA³©òŠ */
- $"BB0E 943C 0DAB C98A 023C 332B AE2D AF60" /* ».”<.«ÉŠ.<3+®-¯` */
- $"4D30 BA77 9D1A 93DC CEBB 7560 EA33 084C" /* M0ºw.“Üλu`ê3.L */
- $"BCFD 2F47 685E 4CC9 8A76 F1C8 04AB 126F" /* ¼ý/Gh^LÉŠvñÈ.«.o */
- $"B9FD 4A34 E181 4147 9F56 2AB4 EB2C 50EF" /* ¹ýJ4áAGŸV*´ë,Pï */
- $"D652 4543 763B B857 210B 2B4A BB50 0EAE" /* ÖRECv;¸W!.+J»P.® */
- $"90BD EEEC F92B DD18 0881 9B3A C6DF A028" /* ½îìù+Ý..›:Æß ( */
- $"45EB 36D7 50B4 D756 FB49 9F08 D74D 037B" /* Eë6×P´×VûIŸ.×M.{ */
- $"83A1 001C 0977 1DCC 81D0 B6B9 828A 6851" /* ƒ¡..Æw.Ìж¹‚ŠhQ */
- $"3CAC B3FF 572B 543A 4C73 3F35 0561 EC81" /* <¬³ÿW+T:Ls?5.aì */
- $"A8D4 82BC 9148 5E30 FF3E 3164 C43E 5461" /* ¨Ô‚¼‘H^0ÿ>1dÄ>Ta */
- $"4BD0 139E 6390 0E05 4793 56B8 5080 CBF6" /* KÐ.žc..G“V¸P€Ëö */
- $"9E70 BEA1 FB26 DD1E AEE1 E78D 0D32 FA02" /* žp¾¡û&Ý.®áç.2ú. */
- $"43FC FBC6 7464 2C9A 14AD 2C7C 0969 995F" /* CüûÆtd,š.­,|Æi™_ */
- $"6363 3037 9C34 C5F8 42DF B339 D2B0 5C45" /* cc07œ4ÅøBß³9Ò°\E */
- $"6130 509D 28E7 D3A7 9308 74ED 9265 B7F9" /* a0P(çÓ§“.tí’e·ù */
- $"0F54 D265 33D9 EB57 07C4 852B E3C8 771F" /* .TÒe3ÙëW.Ä…+ãÈw. */
- $"21F8 ADA3 D807 625C 513A E395 604B 0D6A" /* !ø­£Ø.b\Q:ã•`K.j */
- $"A9FC 297E 63AF 7622 23B6 63E1 EF25 F572" /* ©ü)~c¯v"#¶cáï%õr */
- $"01B0 400D 18C6 C9FA 6AF5 3E26 4199 6E68" /* .°@..ÆÉújõ>&A™nh */
- $"99B5 B3A9 F861 3419 C6C7 B65C D0F6 353B" /* ™µ³©øa4.ÆǶ\Ðö5; */
- $"6551 1B0A 9D82 1F07 4185 8C46 5867 DC22" /* eQ.‚..A…ŒFXgÜ" */
- $"BD38 AFF7 27BA 1114 9266 5EF4 1EA9 89B4" /* ½8¯÷'º..’f^ô.©‰´ */
- $"A634 E917 65E5 502E 8028 D24E 725F 0C22" /* ¦4é.eåP.€(ÒNr_." */
- $"1513 7B38 5FEA 3150 520B 6D8A 03D8 F796" /* ..{8_ê1PR.mŠ.Ø÷– */
- $"D183 D8FA 82E2 C147 B662 593B 9FC8 A2A0" /* уØú‚âÁG¶bY;ŸÈ¢  */
- $"C63B D151 D905 072C 02E5 919B 0BE9 6D76" /* Æ;ÑQÙ..,.å‘›.émv */
- $"4BEF 7D51 FF67 C2F2 BB61 DDD2 7981 0B7E" /* Kï}QÿgÂò»aÝÒy.~ */
- $"D406 3679 DFA4 FAE3 A33C 28AC 06C6 93C1" /* Ô.6yߤúã£<(¬.Æ“Á */
- $"B82F 53DB 1EB8 A6F3 5A24 A44A 1A76 9204" /* ¸/SÛ.¸¦óZ$¤J.v’. */
- $"6543 FC80 18DA 3C5D 395B 01DC D7E8 C21E" /* eCü€.Ú<]9[.Ü×èÂ. */
- $"A66C 9AE3 08D6 DBFC EE95 9E73 F71D 7CCA" /* ¦lšã.ÖÛüî•žs÷.|Ê */
- $"2A6A F6D2 11D9 AC28 BEDE 8E1B 65EF A995" /* *jöÒ.Ù¬(¾ÞŽ.eï©• */
- $"F7B5 B19D 5F63 F42B D0AD D69A BD47 1EED" /* ÷µ±_cô+Э֚½G.í */
- $"2E5C 0276 3AEA F6D9 6E3F 314C 7F5F 52C3" /* .\.v:êöÙn?1L._RÃ */
- $"093D C8A9 23E4 C154 5587 294A 98A9 0643" /* Æ=È©#äÁTU‡)J˜©.C */
- $"AF18 0D20 51A4 6FE1 F326 11E7 5A91 2919" /* ¯.. Q¤oáó&.çZ‘). */
- $"DD53 B13B 2CB3 DE77 FAB9 420E BAFB 305B" /* ÝS±;,³Þwú¹B.ºû0[ */
- $"E9AB 7A2B 623B 78FE 346D 8BB6 BA40 AE40" /* é«z+b;xþ4m‹¶º@®@ */
- $"5B6D 6D53 81A1 076D 7058 E792 E410 3FA7" /* [mmS¡.mpXç’ä.?§ */
- $"AD06 7E2E 5158 D129 9233 6E1D 6B7C C701" /* ­.~.QXÑ)’3n.k|Ç. */
- $"D61D 42D8 472F D5E2 2710 0B6C 828A 2352" /* Ö.BØG/Õâ'..l‚Š#R */
- $"D400 65FA E227 A938 1832 18CC 2BCE 19A8" /* Ô.eúâ'©8.2.Ì+Î.¨ */
- $"773C 3CB1 C6BD D722 8EE1 8AE2 4D4B 97D4" /* w<<±Æ½×"ŽáŠâMK—Ô */
- $"1763 37E4 2F93 8578 534E 0BA9 B493 3B80" /* .c7ä/“…xSN.©´“;€ */
- $"F018 28BE 2A52 15B2 8499 08A8 005F F028" /* ð.(¾*R.²„™.¨._ð( */
- $"ADFD ACEB 238F 922A 75E4 1C65 F2C3 F14B" /* ­ý¬ë#’*uä.eòÃñK */
- $"213D 7263 4A9A 1C80 12BD 5895 0EC8 B955" /* !=rcJš.€.½X•.ȹU */
- $"8CD0 FB81 63CF FF7F B545 85DF E201 36A9" /* ŒÐûcÏÿ.µE…ßâ.6© */
- $"E524 1BD6 EDDA 7C33 8CD2 E114 BA93 51E0" /* å$.ÖíÚ|3ŒÒá.º“Qà */
- $"A113 A12A FBEA 8570 B5FE E1B6 7963 5B31" /* ¡.¡*ûê…pµþá¶yc[1 */
- $"512A 99B1 3A59 E50E C584 DD7F FF7F FF7E" /* Q*™±:Yå.Å„Ý.ÿ.ÿ~ */
- $"D3C9 019B 1FBC DB70 2C2A 14A6 E7F1 0147" /* ÓÉ.›.¼Ûp,*.¦çñ.G */
- $"5F3A A36C 6F8A 9038 ABD8 EB8F FF7F FE79" /* _:£loŠ8«Øëÿ.þy */
- $"6C12 2D6F FD6D F9A0 0392 0E82 0296 3C14" /* l.-oýmù .’.‚.–<. */
- $"FEFA 803C A3D4 1049 CF30 E22F 6542 7ABF" /* þú€<£Ô.IÏ0â/eBz¿ */
- $"378E 66B2 9091 D396 B953 DCF5 66D3 C5B5" /* 7Žf²‘Ó–¹SÜõfÓŵ */
- $"7719 028C 5C0F F898 00A1 0C1D E181 F9C7" /* w..Œ\.ø˜.¡..áùÇ */
- $"2E46 06D4 D623 1256 EFAE 89E3 4FFF 7FDD" /* .F.ÔÖ#.VﮉãOÿ.Ý */
- $"F00D 4E11 65D5 B8F9 7C0B A045 AC4A 1E42" /* ð.N.eÕ¸ù|. E¬J.B */
- $"221C B512 5480 EF2D CB80 A089 3603 2CA1" /* ".µ.T€ï-Ë€ ‰6.,¡ */
- $"391C 7925 C817 92E3 8438 C438 08D1 0637" /* 9.y%È.’ã„8Ä8.Ñ.7 */
- $"9FCD F4C2 C04C 40BB A484 5043 0C1E 7C85" /* ŸÍôÂÀL@»¤„PC..|… */
- $"D7F6 1F6D BFC7 60AA 4D18 A399 9A13 CCD0" /* ×ö.m¿Ç`ªM.£™š.ÌÐ */
- $"26DA 3F97 24CB E902 0668 67F7 FE63 7A2E" /* &Ú?—$Ëé..hg÷þcz. */
- $"16D6 987F FF7F AFC1 5C35 E63D BA36 6227" /* .Ö˜.ÿ.¯Á\5æ=º6b' */
- $"FF7C FD39 8B8B 1A5F 6026 831B 0764 8805" /* ÿ|ý9‹‹._`&ƒ..dˆ. */
- $"E40B 0F19 7FFF 7FFC DEBC DD5B 9008 0000" /* ä....ÿ.üÞ¼Ý[... */
- $"0C24 1D44 4641 3BC8 4248 E229 62D2 088D" /* .$.DFA;ÈBHâ)bÒ. */
- $"117F DE8D 0B52 C3FD 1DD9 3823 F138 4C98" /* ..Þ.RÃý.Ù8#ñ8L˜ */
- $"58A8 2683 519C F914 4961 5226 891F F863" /* X¨&ƒQœù.IaR&‰.øc */
- $"3FF2 B19F 113D BFEF 9D12 30C6 66BD E2A6" /* ?ò±Ÿ.=¿ï.0Æf½â¦ */
- $"5D8C BE7E BE19 3D8F 03F2 5D26 FF7F FF7E" /* ]Œ¾~¾.=.ò]&ÿ.ÿ~ */
- $"A82B 5E03 E7A8 E8F1 8C4D B6F1 F0E2 FC36" /* ¨+^.ç¨èñŒM¶ñðâü6 */
- $"DE7A 2F55 38B1 B436 2E50 7D25 E3F0 82C8" /* Þz/U8±´6.P}%ãð‚È */
- $"580F 0D19 C280 415C 2A7F FCD9 C720 E649" /* X...€A\*.üÙÇ æI */
- $"4064 2624 04AC 0B71 41FD 3937 8359 4137" /* @d&$.¬.qAý97ƒYA7 */
- $"8CA9 B642 C318 BD37 82D3 B786 8217 3252" /* Œ©¶BÃ.½7‚Ó·†‚.2R */
- $"44EA 4598 57D2 2F66 957F 39FE D712 F449" /* DêE˜WÒ/f•.9þ×.ôI */
- $"213A BEBB B6CC F551 FF7F EB0A AE45 8497" /* !:¾»¶ÌõQÿ.ë®E„— */
- $"0F4C FD34 4090 01FE CFC8 51AA C32A 7D95" /* .Lý4@.þÏÈQªÃ*}• */
- $"D414 2609 E22F 1B7D E10E 97BB 05D1 9D04" /* Ô.&Æâ/.}á.—».Ñ. */
- $"0592 9271 0D39 AB59 F165 0D09 549C B4E3" /* .’’q.9«Yñe.ÆTœ´ã */
- $"AEE5 555F 00A3 5E0A E4D3 BAFE 1EC6 2FCE" /* ®åU_.£^ÂäÓºþ.Æ/Î */
- $"FB04 C9BC 71D8 A42D 2F70 9FE1 EC17 C31D" /* û.ɼqؤ-/pŸáì.Ã. */
- $"ECB2 0A82 EFB1 914C F6D2 E54C 5316 B6C4" /* ì²Â‚ﱑLöÒåLS.¶Ä */
- $"4FFF 653B FD6E 27A6 9959 244B F458 B35C" /* Oÿe;ýn'¦™Y$KôX³\ */
- $"865C EB94 2CD7 7343 B74C C211 8A4D 2A99" /* †\ë”,×sC·LÂ.ŠM*™ */
- $"732E 3B43 CEAC C300 A520 924D 6F1F 8295" /* s.;CάÃ.¥ ’Mo.‚• */
- $"DF36 1FD4 E8F0 9221 6313 1B33 0C98 2721" /* ß6.Ôèð’!c..3.˜'! */
- $"8F55 5BA1 0E46 A755 1D7F A914 458D 9FFF" /* U[¡.F§U..©.EŸÿ */
- $"33CF 4CE3 AFC6 3383 BC4D A7E9 F546 FDCB" /* 3ÏLã¯Æ3ƒ¼M§éõFýË */
- $"8276 7778 2BBA EF7C 3677 6251 58C0 9EFF" /* ‚vwx+ºï|6wbQXÀžÿ */
- $"526C C883 6CFF 7FFF 7D4C 3F9F BD74 6BE9" /* Rlȃlÿ.ÿ}L?Ÿ½tké */
- $"B6EB 9003 823B 235D 6AD9 B382 FC45 F10C" /* ¶ë.‚;#]jÙ³‚üEñ. */
- $"8282 90ED 9D47 E949 FADC 7B04 1C1C 9EF1" /* ‚‚íGéIúÜ{...žñ */
- $"1ABB 270D 07BE 1943 4E14 70E0 48FF 81EE" /* .»'..¾.CN.pàHÿî */
- $"CE8A 5AAD 3CE9 090D 3126 F96A AEBA 5853" /* ΊZ­<éÆ.1&ùj®ºXS */
- $"D02E ADE8 4614 E2B7 2E7E 3DB6 DE6A 77A8" /* Ð.­èF.â·.~=¶Þjw¨ */
- $"48D0 2DBB BAF4 E94C 735D 27D6 87FF 7F80" /* HÐ-»ºôéLs]'Ö‡ÿ.€ */
- $"5BCC 3CA6 1168 D9E0 38B4 22B2 2154 02AA" /* [Ì<¦.hÙà8´"²!T.ª */
- $"A1FF 6D87 EB2B F3EB 3814 9F74 DEF3 4D86" /* ¡ÿm‡ë+óë8.ŸtÞóM† */
- $"ED68 7E75 9E81 1FD9 170B E013 7E4D 97B3" /* íh~už.Ù..à.~M—³ */
- $"51B0 6B2A 42AF EEB4 899B D2A2 6AC9 8EBF" /* Q°k*B¯î´‰›Ò¢jÉŽ¿ */
- $"2858 9FFC 5050 3364 8F2D 313E 94A9 5ED5" /* (XŸüPP3d-1>”©^Õ */
- $"6213 E9DD 6FF6 5813 72DA FE40 0F70 06C4" /* b.éÝoöX.rÚþ@.p.Ä */
- $"FF7D 053C 3E69 C976 DDFF 02D9 4688 D8D7" /* ÿ}.<>iÉvÝÿ.ÙFˆØ× */
- $"8DEF 5187 FCA3 40EE 3167 B6DD 7EE6 42AB" /* ïQ‡ü£@î1g¶Ý~æB« */
- $"B07A DB20 DC1D 7016 631F 8FB0 C83A 9CC2" /* °zÛ Ü.p.c.°È:œÂ */
- $"66B9 304B 74F5 03F7 217C D3E3 6000 ECE6" /* f¹0Ktõ.÷!|Óã`.ìæ */
- $"A319 FD9E 4131 7E74 59C6 FB3F 1B51 FE89" /* £.ýžA1~tYÆû?.Qþ‰ */
- $"52D3 C845 1BF0 4BFE 3BAE 4940 9830 8E9C" /* RÓÈE.ðKþ;®I@˜0Žœ */
- $"F843 F6A2 218E B2E2 8092 8E0E 3889 8137" /* øCö¢!Ž²â€’Ž.8‰7 */
- $"583C 394F CCE6 3D1B 37B8 C9A4 D805 B9E4" /* X<9OÌæ=.7¸É¤Ø.¹ä */
- $"A037 E45D 1167 9627 81E0 538C 1B6D EA0E" /*  7ä].g–'àSŒ.mê. */
- $"18CD 8E3C EE0C 5E0C B048 8DD2 C804 CA38" /* .ÍŽ<î.^.°HÒÈ.Ê8 */
- $"8678 CAA9 5EE1 8B6C E7D9 FDE1 5C14 D52A" /* †xÊ©^á‹lçÙýá\.Õ* */
- $"67F3 8A12 F698 857A 5692 1FB3 FF27 FE1B" /* góŠ.ö˜…zV’.³ÿ'þ. */
- $"7E31 5D25 B4A2 3647 FF07 064A 4D7B F160" /* ~1]%´¢6Gÿ..JM{ñ` */
- $"62D7 81CE 0940 AE5F CAEB F1A6 10C4 CB0E" /* b×ÎÆ@®_Êëñ¦.ÄË. */
- $"3D77 2C40 0146 8C72 B765 F6A9 3047 E748" /* =w,@.FŒr·eö©0GçH */
- $"0239 A725 8B4C 56F0 7E86 9A24 53D7 4832" /* .9§%‹LVð~†š$S×H2 */
- $"7924 73CB 4431 4977 0487 03FC F1B3 A21C" /* y$sËD1Iw.‡.üñ³¢. */
- $"2792 0B05 8183 8348 8EC0 2635 47D9 B51D" /* '’..ƒƒHŽÀ&5GÙµ. */
- $"CE40 1FA4 20C5 93A8 BEB4 B8CD 93D8 A79E" /* Î@.¤ Å“¨¾´¸Í“اž */
- $"62C5 846C 964D 0404 BE21 3AA5 9EC3 4450" /* bÅ„l–M..¾!:¥žÃDP */
- $"FAEE 938A A428 E4D0 7F1B 46A8 7AEC 97FB" /* úî“Š¤(äÐ..F¨zì—û */
- $"1AFF 71DA F26D B5B1 E6F2 66B4 865E 1F12" /* .ÿqÚòmµ±æòf´†^.. */
- $"CE0F 3A8A EDF1 6321 BC5A 22D5 D3D6 BE19" /* Î.:Šíñc!¼Z"ÕÓÖ¾. */
- $"671A 38C3 11E8 FC9D 93AC 895A 1B84 7C9B" /* g.8Ã.èü“¬‰Z.„|› */
- $"979F 5DC5 BBE6 19A8 5D03 BE83 6FA4 B8F2" /* —Ÿ]Å»æ.¨].¾ƒo¤¸ò */
- $"AFCD 8115 B21B C1D5 80B4 5E20 3B19 9E48" /* ¯Í.².ÁÕ€´^ ;.žH */
- $"29C0 68DA F799 EC0D 56B3 7049 5EC1 11CB" /* )ÀhÚ÷™ì.V³pI^Á.Ë */
- $"CBAF FA0A 5AF1 22F1 3A4C 6F13 635A C681" /* ˯úÂZñ"ñ:Lo.cZÆ */
- $"06DA 8B44 A35B CF31 9B6F 57E6 AEC2 8D59" /* .Ú‹D£[Ï1›oWæ®ÂY */
- $"1556 A43E A289 74DC C398 B209 31B9 8CD0" /* .V¤>¢‰tÜزÆ1¹ŒÐ */
- $"07BE D253 76AB 7D79 4F26 D099 7AE8 E52C" /* .¾ÒSv«}yO&Йzèå, */
- $"EA35 D7BB E968 CAA0 5F61 EAE5 E9A1 E903" /* ê5×»éhÊ _aêåé¡é. */
- $"100E ED2C 5A66 21E2 1426 BE74 7A19 8C98" /* ..í,Zf!â.&¾tz.Œ˜ */
- $"3D67 A4D2 370F C95D 7131 2D31 0971 6022" /* =g¤Ò7.É]q1-1Æq`" */
- $"F4F2 359E 1FBD D23A CD94 4467 205E F7B1" /* ôò5ž.½Ò:Í”Dg ^÷± */
- $"5D18 EE91 9078 176B ADC2 65EB EECF D1A8" /* ].î‘x.k­ÂeëîÏѨ */
- $"F1B3 B999 E7CC 3079 BD9C 82D8 DF6E 29E0" /* ñ³¹™çÌ0y½œ‚Øßn)à */
- $"9502 EC8D 5C13 629B 109E A7C0 F438 6674" /* •.ì\.b›.ž§Àô8ft */
- $"C48B E75A 7CAC 28AE 3E9C 0ECF 9ADF F7BF" /* Ä‹çZ|¬(®>œ.Ïšß÷¿ */
- $"C51A E20D 64F1 B1DD C986 0C6F 6BFF 5102" /* Å.â.dñ±ÝɆ.okÿQ. */
- $"B233 B826 EBC9 35E2 9799 0A0F E81D 0816" /* ²3¸&ëÉ5â—™Â.è... */
- $"E01C B1A8 E4D9 1CCF 7F2E 4DB3 371B 83C0" /* à.±¨äÙ.Ï..M³7.ƒÀ */
- $"9DFD A603 83D6 4412 7DCF 2E2F 85D8 8259" /* ý¦.ƒÖD.}Ï./…Ø‚Y */
- $"DC97 798F 2E8A 09F5 C1A7 1E56 55F3 BFD0" /* Ü—y.ŠÆõÁ§.VUó¿Ð */
- $"34CE 311A 98BE C87C 8CCE 6EDF C85C A788" /* 4Î1.˜¾È|ŒÎnßÈ\§ˆ */
- $"AA7E 47D5 72AF 1842 5C5F 9D6A C586 CA4C" /* ª~GÕr¯.B\_jņÊL */
- $"34D3 6315 D6CA 0D6D 5B75 6C85 551B E270" /* 4Óc.ÖÊ.m[ul…U.âp */
- $"E9DD 6127 C363 1F5A 0AA4 8F55 114F 9ED3" /* éÝa'Ãc.Z¤U.OžÓ */
- $"034E A968 1BF1 513A 2F0D 3E61 612A 15E6" /* .N©h.ñQ:/.>aa*.æ */
- $"B89F 1877 F38E 8C96 20C3 1952 A559 62AE" /* ¸Ÿ.w󎌖 Ã.R¥Yb® */
- $"20E0 BE7D BF7C FAA3 F56C FF75 6D5E 07E7" /* à¾}¿|ú£õlÿum^.ç */
- $"EB87 E7E9 BFE7 EE37 E7EE B60B E7DA F7CF" /* ë‡çé¿çî7çî¶.çÚ÷Ï */
- $"A6FF 2B5C 2F9F AC00 ED1C BCF0 084D B6D5" /* ¦ÿ+\/Ÿ¬.í.¼ð.M¶Õ */
- $"A3F8 3A1B 179B 5659 AE02 A536 8D65 B1A0" /* £ø:..›VY®.¥6e±  */
- $"F806 81C6 9453 B9E5 1E84 EF36 3D8C 9922" /* ø.Æ”S¹å.„ï6=Œ™" */
- $"A841 EBC7 584D 175D A8CF 5AE5 52F4 364A" /* ¨AëÇXM.]¨ÏZåRô6J */
- $"CACB F4FA 59D1 6C18 1FE0 5F96 0F70 465A" /* ÊËôúYÑl..à_–.pFZ */
- $"7CFD 0C37 59FF 6248 10C6 4872 8573 D54E" /* |ý.7YÿbH.ÆHr…sÕN */
- $"7839 337E D900 4336 CF58 B59C BCC4 602F" /* x93~Ù.C6ÏXµœ¼Ä`/ */
- $"EA1A 205F CD8D 635B AE0D 5750 3316 72C7" /* ê. _Íc[®.WP3.rÇ */
- $"A765 C2F2 CF8C 52FB 1892 F55E B7A5 6D85" /* §eÂòÏŒRû.’õ^·¥m… */
- $"5782 FAB6 FBB5 CDF3 2DC2 0256 2927 4F4F" /* W‚ú¶ûµÍó-Â.V)'OO */
- $"1F92 5F99 B540 87DD 7A80 991B 0677 AB00" /* .’_™µ@‡Ýz€™..w«. */
- $"2D82 C5F6 11F7 F21B 2652 B798 75D5 42A6" /* -‚Åö.÷ò.&R·˜uÕB¦ */
- $"7757 E0E7 3C3F DBA5 6106 9F44 1800 E044" /* wWàç<?Û¥a.ŸD..àD */
- $"5844 8C9D 83C0 C5D3 6B95 CE2A 3EBC D7FD" /* XDŒƒÀÅÓk•Î*>¼×ý */
- $"B79B E645 6FD3 A5EE ECE2 C9A7 53C7 B2E3" /* ·›æEoÓ¥îìâɧSDzã */
- $"C659 D5C5 0FBD 7C88 93C3 D3D9 D81F 0AEB" /* ÆYÕÅ.½|ˆ“ÃÓÙØ.Âë */
- $"5784 8BF9 DAD7 993D 0C8B 9873 08A4 254B" /* W„‹ùÚ×™=.‹˜s.¤%K */
- $"2452 F95D 29CA 8B3E D48D 18FB C813 4ECB" /* $Rù])Ê‹>Ô.ûÈ.NË */
- $"D118 E3FA 926C 7A5F E5CC F774 D1DB B5C1" /* Ñ.ãú’lz_åÌ÷tÑÛµÁ */
- $"579A 2647 619A 67A0 423D 6C64 B3A6 9357" /* Wš&Gašg B=ld³¦“W */
- $"B8C6 8FBE A3AC E380 E548 5ED3 D83D 7DB9" /* ¸Æ¾£¬ã€åH^ÓØ=}¹ */
- $"93E8 9071 F6E0 168F 6BEC F674 6D08 F4DA" /* “èqöà.kìötm.ôÚ */
- $"C1F7 11FD DEF8 2420 30DA 71E2 C605 81EB" /* Á÷.ýÞø$ 0ÚqâÆ.ë */
- $"565B D461 AF6E 3127 34AC BA64 C660 14E1" /* V[Ôa¯n1'4¬ºdÆ`.á */
- $"F6AB DA92 386B 3E7B BD42 90E9 ABA2 6EE7" /* ö«Ú’8k>{½Bé«¢nç */
- $"8D0D 373C D280 46EC 6746 310C EA41 862B" /* .7<Ò€FìgF1.êA†+ */
- $"6D1B 7BE9 93AF 17F6 1D3A E7AB CA55 8A4B" /* m.{铯.ö.:ç«ÊUŠK */
- $"E867 6EF3 29DF FF5F B839 75E1 FA04 DD81" /* ègnó)ßÿ_¸9uáú.Ý */
- $"B6C9 DA44 D268 3B1A FF63 60F5 37A5 DDCB" /* ¶ÉÚDÒh;.ÿc`õ7¥ÝË */
- $"1AB3 5275 7692 7F15 F8E8 6A96 CEB4 D9E5" /* .³Ruv’..øèj–δÙå */
- $"3E5A 0E16 B1D0 B056 D0D2 0360 0900 5773" /* >Z..±Ð°VÐÒ.`Æ.Ws */
- $"BB3F C215 FD55 C9BF E3FC 48A1 CFAB BD39" /* »?Â.ýUÉ¿ãüH¡Ï«½9 */
- $"CD3D 906E 21CB C3DD E4D3 548C 4731 E777" /* Í=n!ËÃÝäÓTŒG1çw */
- $"EE15 C0DE CEBC 0F2F 85A6 9822 F1FF 7B2F" /* î.ÀÞμ./…¦˜"ñÿ{/ */
- $"2530 48C7 0C39 3659 CD03 06C5 7C8E 3D49" /* %0HÇ.96YÍ..Å|Ž=I */
- $"FED5 7B72 4652 772C 39C7 8F1B 63E8 2DC1" /* þÕ{rFRw,9Ç.cè-Á */
- $"1242 CA35 E396 6103 15DF D939 0597 B8D4" /* .BÊ5ã–a..ßÙ9.—¸Ô */
- $"8858 ACE3 3C32 6EE5 69A3 8512 3447 2B3B" /* ˆX¬ã<2nåi£….4G+; */
- $"0647 8C1F 2D31 4E57 0D03 BE26 5235 5275" /* .GŒ.-1NW..¾&R5Ru */
- $"74E8 B8F6 CF32 E077 8C51 41DB ED67 EE30" /* tè¸öÏ2àwŒQAÛígî0 */
- $"AD97 7956 D279 B0A8 768D 00E3 F604 A240" /* ­—yVÒy°¨v.ãö.¢@ */
- $"9656 5BCD B309 D0CD 3ECE C477 31EC F88D" /* –V[ͳÆÐÍ>ÎÄw1ìø */
- $"782F 8B9E 37FA A741 C636 7B55 D047 64A4" /* x/‹ž7ú§AÆ6{UÐGd¤ */
- $"E2EC C69D F609 F38F 821E 8D20 8709 87FF" /* âìÆöÆó‚. ‡Æ‡ÿ */
- $"3C3A B1ED C420 1F0B 52E3 8999 C684 30F3" /* <:±íÄ ..R㉙Ƅ0ó */
- $"C4ED 7FA9 3A2C D0E7 AE48 1AC2 7196 9347" /* Äí.©:,Ðç®H.Âq–“G */
- $"6BC9 BEE1 4112 4209 93CA 307A 7FF7 8B12" /* kɾáA.BÆ“Ê0z.÷‹. */
- $"EE76 8890 A529 33CC F435 A84F 9414 A719" /* îvˆ¥)3Ìô5¨O”.§. */
- $"BFB2 6305 201F 372D 567F 30DF 2E47 D0B9" /* ¿²c. .7-V.0ß.Gй */
- $"C68F 5126 7EAA D95A 12D0 DA8A 8CF4 8A2A" /* ÆQ&~ªÙZ.ÐÚŠŒôŠ* */
- $"CBAE 0509 B614 A9E1 2CA2 D0E0 F017 E395" /* Ë®.ƶ.©á,¢Ðàð.ã• */
- $"AF82 85B5 4509 E75C 8E4D 5465 7DF2 CF39" /* ¯‚…µEÆç\ŽMTe}òÏ9 */
- $"ACFB DD5B C683 62C0 0B1C B7B9 EAEC 049C" /* ¬ûÝ[ƃbÀ..·¹êì.œ */
- $"8045 0178 6757 E317 872D ABC2 B077 6EF6" /* €E.xgWã.‡-«Â°wnö */
- $"3612 4132 3DD7 D39B B49A 04A8 207D 6135" /* 6.A2=×Ó›´š.¨ }a5 */
- $"C64F 3A0F 5028 7B6B 953E 8F19 920A 718F" /* ÆO:.P({k•>.’Âq */
- $"08E9 A079 EC51 A08F 4A77 5130 C807 9BC2" /* .é yìQ JwQ0È.›Â */
- $"B37B 4C7B 9BAA 40F3 4E94 BE51 C027 32B5" /* ³{L{›ª@óN”¾QÀ'2µ */
- $"751F 4793 7271 226E 82F3 CF14 8BC3 F927" /* u.G“rq"n‚óÏ.‹Ãù' */
- $"4C81 7F29 AB70 8B3B E948 86D6 569F FEC2" /* L.)«p‹;éH†ÖVŸþÂ */
- $"BF6C 92F9 1011 3BE3 9E91 6458 1634 34A3" /* ¿l’ù..;ãž‘dX.44£ */
- $"3042 520F 5D64 6429 32CE 04FD 1B98 0698" /* 0BR.]dd)2Î.ý.˜.˜ */
- $"3A36 655C 86C7 C272 4B02 E259 0537 4DB8" /* :6e\†ÇÂrK.âY.7M¸ */
- $"C6C2 6980 ECFB 0FC1 C6D9 0A2C D00F 282A" /* ÆÂi€ìû.ÁÆÙÂ,Ð.(* */
- $"7A0B D91F 08CA 762C A629 048E 9BCC CFD2" /* z.Ù..Êv,¦).Ž›ÌÏÒ */
- $"1EBC 8F60 2F64 F24D F1FB 81C6 8AEC CFDB" /* .¼`/dòMñûÆŠìÏÛ */
- $"623A 01A9 35D2 B5E1 B80A 2D32 084E 3857" /* b:.©5Òµá¸Â-2.N8W */
- $"C025 BCDA 4728 F3AD 35AD 9AAA E054 21B7" /* À%¼ÚG(ó­5­šªàT!· */
- $"A47E 62C5 9921 02C0 09E3 440D 063A 3789" /* ¤~bÅ™!.ÀÆãD..:7‰ */
- $"5072 E54A 4654 E148 AC2E 4A99 C6A5 3923" /* PråJFTáH¬.J™Æ¥9# */
- $"49B5 6906 6531 FD5E 7CCE 1C4B EEDE 7482" /* Iµi.e1ý^|Î.KîÞt‚ */
- $"9E3F 73AE C777 0214 C921 3131 C5CB 9F61" /* ž?s®Çw..É!11ÅËŸa */
- $"64A4 4E70 57C2 5C04 E25B 266E 6887 7477" /* d¤NpWÂ\.â[&nh‡tw */
- $"FCCB 1F0C 89F2 6CF6 713E 4D08 8AC8 9B0C" /* üË..‰òlöq>M.ŠÈ›. */
- $"00AC D9D7 A28A C219 B52B B46A D704 F919" /* .¬Ù×¢ŠÂ.µ+´j×.ù. */
- $"2050 6CCA 215A 299B 9129 9739 DA6F 3A67" /* PlÊ!Z)›‘)—9Úo:g */
- $"FE12 2BF1 4F8B 26ED D21F F727 5B59 22F3" /* þ.+ñO‹&íÒ.÷'[Y"ó */
- $"2E05 F4A0 9754 F431 9AED 1B65 038C CD7F" /* ..ô —Tô1ší.e.ŒÍ. */
- $"8254 E3AE 035C 18D7 0E28 6300 0DF0 998D" /* ‚Tã®.\.×.(c..ð™ */
- $"0191 85AF C71B B3CF F0D6 3A8F B1AA 5E99" /* .‘…¯Ç.³ÏðÖ:±ª^™ */
- $"BAB8 7C7F 0214 F864 4744 E747 7248 3C94" /* º¸|...ødGDçGrH<” */
- $"3AC8 CE04 1019 11ED 4BCC 76E9 FE4E 5728" /* :ÈÎ....íKÌvéþNW( */
- $"5BB0 986C D763 A3C7 AF8A 14E9 D24A AD17" /* [°˜l×c£Ç¯Š.éÒJ­. */
- $"FF66 611F B77C 0830 9093 A560 06FA E9CF" /* ÿfa.·|.0“¥`.úéÏ */
- $"054B 5846 1681 5DBF 34F9 49A9 45E0 8F20" /* .KXF.]¿4ùI©Eà */
- $"7FFD 6264 2193 031D A60F A111 B0B7 CFEE" /* .ýbd!“..¦.¡.°·Ïî */
- $"DE49 EC80 C0F1 D7F6 A495 900B 4126 40BE" /* ÞIì€Àñ×ö¤•.A&@¾ */
- $"185B DFFE C7B0 12AC C143 AA85 70E5 81EF" /* .[ßþÇ°.¬ÁCª…påï */
- $"79CE 1662 08E4 203F 1706 40FB CC39 CA8F" /* yÎ.b.ä ?..@ûÌ9Ê */
- $"8002 1CFA 3BCC 6B79 5C83 A4D2 7147 E38F" /* €..ú;Ìky\ƒ¤ÒqGã */
- $"C93B F2E8 6A15 6D30 C314 E898 81E3 FF7B" /* É;òèj.m0Ã.è˜ãÿ{ */
- $"5FC5 EE13 0449 1985 2CBC 73C7 C569 DCB1" /* _Åî..I.…,¼sÇÅiܱ */
- $"8024 F7CA CC7A FE3B CC15 4BCE 5B92 1BBB" /* €$÷ÊÌzþ;Ì.KÎ[’.» */
- $"0048 F291 579F FD20 F11A 1934 CC11 9C3F" /* .Hò‘WŸý ñ..4Ì.œ? */
- $"CE49 027A 9763 9E57 A2FF 7FFD 53E4 E50B" /* ÎI.z—cžW¢ÿ.ýSäå. */
- $"C747 02FF 7869 0537 1482 221E 0220 79D5" /* ÇG.ÿxi.7.‚".. yÕ */
- $"45B1 2E48 6A6C 8486 571F E1F1 BF39 0797" /* E±.Hjl„†W.áñ¿9.— */
- $"5D21 6964 EA9B 13F1 E6B7 C4B5 A2B7 E2BD" /* ]!idê›.ñæ·Äµ¢·â½ */
- $"09C2 B200 0000 0000 003E A392 6527 69B6" /* Ʋ......>£’e'i¶ */
- $"B189 8365 F55D 7A2B 0398 4196 BB60 D4F0" /* ±‰ƒeõ]z+.˜A–»`Ôð */
- $"06B6 100C 5B60 D76F 8FEE EFFB D525 0E2B" /* .¶..[`×oîïûÕ%.+ */
- $"3535 B765 22E7 F77C CF5C 8907 7626 62C0" /* 55·e"ç÷|Ï\‰.v&bÀ */
- $"3B04 A170 EEA6 A399 F26B CD7E 92BC 9E13" /* ;.¡p™òkÍ~’¼ž. */
- $"9D2D 6907 B06F 6B9A 957D 3C57 DC9F 06E6" /* -i.°okš•}<WÜŸ.æ */
- $"C3B6 16AD C91B E868 E000 1848 3BE4 5C3A" /* ö.­É.èhà..H;ä\: */
- $"1162 2272 401F 600B A973 281E 62B3 2654" /* .b"r@.`.©s(.b³&T */
- $"74B0 287C C53E A3DA 2A14 E38F 9FFE 3A8E" /* t°(|Å>£Ú*.ãŸþ:Ž */
- $"0D69 7E9D 5B07 1396 ED52 69BC 3971 5630" /* .i~[..–íRi¼9qV0 */
- $"7C63 8DA9 7A40 F364 CC6A FCAC DC7C 59DC" /* |c©z@ódÌjü¬Ü|YÜ */
- $"278A 92E3 6FBF F936 7157 2583 232E E558" /* 'Š’ão¿ù6qW%ƒ#.åX */
- $"0000 C241 6B90 4DCB 6421 F85A B681 4812" /* ..ÂAkMËd!øZ¶H. */
- $"9165 5C06 0195 F213 DB9F 5E2F 4BDE A075" /* ‘e\..•ò.ÛŸ^/KÞ u */
- $"BD9A 741B 971B 3411 1F73 7FF8 D719 BA55" /* ½št.—.4..s.ø×.ºU */
- $"8048 404F FEEA FC74 AEB1 84FD 03F9 5D43" /* €H@Oþêüt®±„ý.ù]C */
- $"BE42 E61F FF7F F4CA BA56 9654 B757 FF60" /* ¾Bæ.ÿ.ôʺV–T·Wÿ` */
- $"CA39 3290 054C E785 0EA7 F04D AF3E B342" /* Ê92.Lç….§ðM¯>³B */
- $"A80A 815D 3954 73F2 871A 51FF 7488 20CD" /* ¨Â]9Tsò‡.Qÿtˆ Í */
- $"90F3 23B8 80FE C6BF 726C 5426 83F2 5400" /* ó#¸€þÆ¿rlT&ƒòT. */
- $"0000 0000 0000 0000 BFA5 D802 777C F954" /* ........¿¥Ø.w|ùT */
- $"286B A586 76CF 26CE 72CA 6FE7 BD43 DB36" /* (k¥†vÏ&ÎrÊoç½CÛ6 */
- $"A826 870E 2EEF E2C4 2E22 E63C FF7F AF51" /* ¨&‡..ïâÄ."æ<ÿ.¯Q */
- $"40C1 B727 22F3 9ACC 894D 0C49 EC7A D998" /* @Á·'"óšÌ‰M.IìzÙ˜ */
- $"64A9 DD22 2545 B85C D621 0609 B73A 9D9F" /* d©Ý"%E¸\Ö!.Æ·:Ÿ */
- $"FF7F FF7F C0F7 00E1 B069 1D76 3BA1 E98C" /* ÿ.ÿ.À÷.á°i.v;¡éŒ */
- $"5F1B 1E11 B6F6 EB6D 6316 9DBC D1B2 DC90" /* _...¶öëmc.¼Ñ²Ü */
- $"5E1D 5EE0 3C65 57D0 B69C 3782 D1BE 3A77" /* ^.^à<eWжœ7‚Ѿ:w */
- $"436E 462B 45B7 FF61 4FA4 A45B 8C34 39D8" /* CnF+E·ÿaO¤¤[Œ49Ø */
- $"1B35 B876 A5F1 F2AD 3F78 D289 1C2E E3B4" /* .5¸v¥ñò­?xÒ‰..ã´ */
- $"A28B 64FA 1E2C 0CCD 0B1C AD42 8866 DDD6" /* ¢‹dú.,.Í..­BˆfÝÖ */
- $"62F0 225B 8DF7 32B3 FC3C 79E9 000B 1CA9" /* bð"[÷2³ü<yé...© */
- $"2C82 4874 34AB B158 47CD FA9F EBC8 0923" /* ,‚Ht4«±XGÍúŸëÈÆ# */
- $"B291 7229 8C3F E7FD 193C 330B A3B4 6969" /* ²‘r)Œ?çý.<3.£´ii */
- $"FCF6 E1BA 4C4A E64C B1BC 5BAF F402 C828" /* üöáºLJæL±¼[¯ô.È( */
- $"3A51 CC67 A851 E207 5A7C 3733 1031 FD5C" /* :QÌg¨Qâ.Z|73.1ý\ */
- $"E4D3 B69F FF67 2C6D 3FC7 D5B4 E63F 55B9" /* äÓ¶Ÿÿg,m?ÇÕ´æ?U¹ */
- $"FD5F 3DB1 4589 6ADF 54F0 F42A 498F 61C8" /* ý_=±E‰jßTðô*IaÈ */
- $"4872 5CD7 F70D 9C80 8880 EB9A 1FE7 C715" /* Hr\×÷.œ€ˆ€ëš.çÇ. */
- $"E57A 280F 96CF 014C 0411 EF44 C4F2 C64F" /* åz(.–Ï.L..ïDÄòÆO */
- $"F91B A9D6 EB9E F615 096F E5C0 5B30 BB79" /* ù.©Öëžö.ÆoåÀ[0»y */
- $"D645 BF4F B70A 2C40 3D24 A4C4 5A01 F3DB" /* ÖE¿O·Â,@=$¤ÄZ.óÛ */
- $"8879 D458 F558 4C8E 3C87 E83C 9C30 F0C3" /* ˆyÔXõXLŽ<‡è<œ0ðà */
- $"F7EB BE6A 2B3B B9CB 4F2E 3B49 CA98 6025" /* ÷ë¾j+;¹ËO.;Iʘ`% */
- $"D6C7 6B39 ED18 A784 5410 F9CD 4FB5 9E32" /* ÖÇk9í.§„T.ùÍOµž2 */
- $"EABF F72F 6ECC 217F E295 4BDA F0C8 2678" /* ê¿÷/nÌ!.â•KÚðÈ&x */
- $"B0F7 3381 2299 1033 5300 BB1C E72F 1EE0" /* °÷3"™.3S.».ç/.à */
- $"75D6 68D0 8C87 A574 580B 4AD8 7BC8 E1C4" /* uÖhÐŒ‡¥tX.JØ{ÈáÄ */
- $"64D3 76AA A080 1E28 FD04 890B B9A1 7E5C" /* dÓvª €.(ý.‰.¹¡~\ */
- $"79E2 31B9 1C3E DBAE 8BC6 DB23 53A4 0F06" /* yâ1¹.>Û®‹ÆÛ#S¤.. */
- $"74AA 7920 6233 E3BF B281 AFAA 957D FDFB" /* tªy b3㿲¯ª•}ýû */
- $"216A 3ECE 3139 37DF 8885 620B 5D55 D0FD" /* !j>Î197߈…b.]UÐý */
- $"F796 6A70 CEFD 33D8 B369 178E 99C0 9FFF" /* ÷–jpÎý3سi.Ž™ÀŸÿ */
- $"7FD2 27D4 D615 4840 B836 A0B5 1D6F 2A5A" /* .Ò'ÔÖ.H@¸6 µ.o*Z */
- $"1338 2369 83A0 D409 0FA7 77EF 19B9 21E6" /* .8#iƒ ÔÆ.§wï.¹!æ */
- $"3E21 0CB0 D4D3 362A EA6F 6340 8D73 27FB" /* >!.°ÔÓ6*êoc@s'û */
- $"C3EF 7823 33DF 7A8C 5C69 20C4 5816 72E4" /* Ãïx#3ßzŒ\i ÄX.rä */
- $"712C 3345 6755 76F3 FEAF 494B D0B4 3C8F" /* q,3EgUvóþ¯IKд< */
- $"B83F A050 C3E9 4CA2 6A6E 7AD0 D7FF 5860" /* ¸? PÃéL¢jnzÐ×ÿX` */
- $"548E 54E7 C3B9 6DDF 462C 54BE 5EF9 1A41" /* TŽTçùmßF,T¾^ù.A */
- $"6A46 A4FB 1C36 1CA4 77EC 2899 F147 3422" /* jF¤û.6.¤wì(™ñG4" */
- $"843C 7FAE 123E 6894 9B7F 3125 EB0F 3129" /* „<.®.>h”›.1%ë.1) */
- $"9DC1 8469 CE90 BB6E 4F2C 385A 0FD1 9AC7" /* Á„iλnO,8Z.ÑšÇ */
- $"3318 3BF0 B1AA A51A 9022 A143 29FF 7FC1" /* 3.;𱪥."¡C)ÿ.Á */
- $"0F0F 6570 67C4 7FA7 9906 DE4E 5439 A278" /* ..epgÄ.§™.ÞNT9¢x */
- $"34E1 3D57 BB0E 086E 4C71 4406 DA9D CA56" /* 4á=W»..nLqD.ÚÊV */
- $"3EFD D077 5DA5 CD7D C244 9128 F408 1F03" /* >ýÐw]¥Í}ÂD‘(ô... */
- $"0C8F FF4B 9274 2EC6 E208 13C5 EE1B 3CEA" /* .ÿK’t.Æâ..Åî.<ê */
- $"C5C0 06F5 0FA1 11FF 7FE3 A446 32E6 F4DA" /* ÅÀ.õ.¡.ÿ.ã¤F2æôÚ */
- $"23EC 5108 3AE0 CD16 AFFF 3965 8196 56E2" /* #ìQ.:àÍ.¯ÿ9e–Vâ */
- $"2881 4EB9 CA14 5C4A 8091 B176 8823 BF09" /* (N¹Ê.\J€‘±vˆ#¿Æ */
- $"CED5 0D88 E6BB DD95 1B72 36E8 809C D432" /* ÎÕ.ˆæ»Ý•.r6耜Ô2 */
- $"872D C08C 7DCB B30E 548B AE16 0D85 6B49" /* ‡-ÀŒ}˳.T‹®..…kI */
- $"9B28 D491 ECD6 F598 691A 0891 135A 63A0" /* ›(Ô‘ìÖõ˜i..‘.Zc  */
- $"593C 1FFD 8A54 4FB9 F2AB 20FC 5CF3 1B88" /* Y<.ýŠTO¹ò« ü\ó.ˆ */
- $"EE7E 8355 45D6 87C8 28CE 7B33 92A2 D8D6" /* î~ƒUEÖ‡È(Î{3’¢ØÖ */
- $"E8DF EF94 500A 0D78 DE9F 8657 F7BD 7F40" /* èßï”PÂ.xÞŸ†W÷½.@ */
- $"5E07 0789 EDC7 F3A5 A0BF 3929 6B19 A460" /* ^..‰íÇó¥ ¿9)k.¤` */
- $"7A50 91FF 42EA 5F12 DFA5 E0A0 84CC E869" /* zP‘ÿBê_.ߥࠄÌèi */
- $"BB1F 6EDA 2238 5DB0 7F22 3521 F04B FF6B" /* ».nÚ"8]°."5!ðKÿk */
- $"6827 722A DD5F 3C9D D3F4 2BE3 614D 0A3F" /* h'r*Ý_<Óô+ãaMÂ? */
- $"62C4 E6AC 95CA 5946 37E8 BC76 97FD 5167" /* bÄ欕ÊYF7è¼v—ýQg */
- $"C970 D4C7 0655 C470 5913 DBBD AA8C 87A4" /* ÉpÔÇ.UÄpY.Û½ªŒ‡¤ */
- $"3C63 0B7F 54CD 391E 574D F2D5 C728 20B7" /* <c..TÍ9.WMòÕÇ( · */
- $"9955 DAC8 72A5 DBBB F7ED 4C9F 6FFE 3A4E" /* ™UÚÈr¥Û»÷íLŸoþ:N */
- $"E165 1831 C0E5 8285 96C2 3959 1BE7 E884" /* áe.1Àå‚…–Â9Y.çè„ */
- $"E568 89C1 FD03 D443 F6D1 A7C9 4CFE F7B9" /* åh‰Áý.ÔCöѧÉLþ÷¹ */
- $"A0BA 5040 19D5 965F 0EB5 E503 4B32 E6C8" /*  ºP@.Õ–_.µå.K2æÈ */
- $"B9C1 DEBB B8B7 47DC A850 AF44 D3B7 F562" /* ¹ÁÞ»¸·GܨP¯DÓ·õb */
- $"4210 4DFF 42A0 3D9A 7C63 8124 22A9 B258" /* B.MÿB =š|c$"©²X */
- $"2256 6243 3077 FF57 7389 3FB6 A096 0EAB" /* "VbC0wÿWs‰?¶ –.« */
- $"DD33 EF25 C4B0 7338 F6D7 8730 FF2E DD0A" /* Ý3ï%Ä°s8öׇ0ÿ.Ý */
- $"BBDA 7A6E EFE8 58EE D64B A09E 2B00 EC04" /* »ÚznïèXîÖK ž+.ì. */
- $"09C9 A9F4 82A0 3132 4829 65CA E93B B827" /* ÆÉ©ô‚ 12H)eÊé;¸' */
- $"E81F B387 132B 5D15 E526 6FEC 2CB1 407F" /* è.³‡.+].å&oì,±@. */
- $"8485 FF32 4933 D357 FC45 0E44 EE66 D960" /* „…ÿ2I3ÓWüE.DîfÙ` */
- $"5AA3 A13A FC0B D8E2 622E 0BEE 714F 2672" /* Z£¡:ü.Øâb..îqO&r */
- $"3850 26C4 E626 F9BA 418C BC8A 7481 C6BE" /* 8P&Äæ&ùºAŒ¼Štƾ */
- $"BFA6 0D72 0603 3452 46C0 9FDB BE63 34D9" /* ¿¦.r..4RFÀŸÛ¾c4Ù */
- $"9599 7519 804B F1CE 0FC8 7572 F58E EB32" /* •™u.€KñÎ.ÈurõŽë2 */
- $"3501 CBB0 C05B 5643 485A 0012 64C2 8022" /* 5.Ë°À[VCHZ..d€" */
- $"BD39 EB39 2B57 0AA3 3931 93D4 885E CDF2" /* ½9ë9+W£91“Ôˆ^Íò */
- $"818D 7734 36C2 BEE1 4F55 116C 47A9 DC40" /* w46¾áOU.lG©Ü@ */
- $"A8A8 4532 7C33 9D7E 070A BA9E 36F7 2445" /* ¨¨E2|3~.ºž6÷$E */
- $"074C 181A 07B2 C470 FA15 8CCB C069 AD0F" /* .L...²Äpú.ŒËÀi­. */
- $"9DD2 8B21 6F22 7300 34B4 4378 25AB D9D2" /* Ò‹!o"s.4´Cx%«ÙÒ */
- $"1D9B B7F7 2F9C C3B1 926F DE61 4463 90BD" /* .›·÷/œÃ±’oÞaDc½ */
- $"BC76 27E7 A5B5 826F 908E 31BA 048F 97C1" /* ¼v'祵‚oŽ1º.—Á */
- $"1884 67A9 C4BA 4B2B 4A58 D0EE 0269 6832" /* .„g©ÄºK+JXÐî.ih2 */
- $"E8C6 03AA D2A2 D034 27AA D49E 9C01 069A" /* èÆ.ªÒ¢Ð4'ªÔžœ..š */
- $"1BDC C40B 3BA7 5F8D 0468 152D E505 7EC0" /* .ÜÄ.;§_.h.-å.~À */
- $"6BBF C4F4 2F45 99CB 1872 C713 FA0D 055F" /* k¿Äô/E™Ë.rÇ.ú.._ */
- $"551D 6E4D 5794 CC71 BAB5 C560 4D20 9464" /* U.nMW”ÌqºµÅ`M ”d */
- $"9F8C 94BA 1C96 0987 1AB4 61BB BA86 751B" /* ŸŒ”º.–Ƈ.´a»º†u. */
- $"9B79 D06A 7A3D A663 FB31 8B86 E588 5D15" /* ›yÐjz=¦cû1‹†åˆ]. */
- $"4A09 8B2B 81FC AE85 0D5A 1D8C A5B7 6DD9" /* JÆ‹+ü®….Z.Œ¥·mÙ */
- $"02F5 50CE 7017 1BDD 3D3D 86CB 250B 491B" /* .õPÎp..Ý==†Ë%.I. */
- $"AA1F 2D21 A416 E8E7 9A53 4299 8CDE CD59" /* ª.-!¤.èçšSB™ŒÞÍY */
- $"C678 B559 D85C C580 6795 AD5F F578 C9EE" /* ÆxµYØ\Å€g•­_õxÉî */
- $"73B2 8F4B 6EEA 6F07 F785 C1B3 374B E51F" /* s²Knêo.÷…Á³7Kå. */
- $"46DC 728C 05A4 6932 792A DB50 4E9A FD82" /* FÜrŒ.¤i2y*ÛPNšý‚ */
- $"A8A2 5EB8 024D C558 D6BC 350C 97B0 B2E8" /* ¨¢^¸.MÅXÖ¼5.—°²è */
- $"8F42 92FD 604D 6FB7 74B6 6EBE 97F6 CE03" /* B’ý`Mo·t¶n¾—öÎ. */
- $"0DFA C340 31C3 4C5E 0041 088B E097 383B" /* .úÃ@1ÃL^.A.‹à—8; */
- $"A236 97CC 8D2B 6F6D 0E58 4E56 1D49 32EC" /* ¢6—Ì+om.XNV.I2ì */
- $"626C C303 42BB D30B B8DE 5868 3C2F E39B" /* blÃ.B»Ó.¸ÞXh</ã› */
- $"A07A 236D 0F21 C0DD 1A0A 933A 7710 6605" /*  z#m.!ÀÝ.“:w.f. */
- $"343E 8D1A 9384 4F16 C01E 5AF7 DF53 0B38" /* 4>.“„O.À.Z÷ßS.8 */
- $"3615 80D7 428E 90F6 4620 02EA 4590 DF22" /* 6.€×BŽöF .êEß" */
- $"4B70 2FB2 CADA A529 F7FA E7C6 BC99 DFCD" /* Kp/²ÊÚ¥)÷úçƼ™ßÍ */
- $"5EE7 D677 B5BE F819 6A55 6070 E1A9 DF53" /* ^çÖwµ¾ø.jU`pá©ßS */
- $"3F82 0229 B6B7 D247 1967 8313 056F 9D27" /* ?‚.)¶·ÒG.gƒ..o' */
- $"753E E4DD EB7F 1372 C0F7 D72E 349B 2F9B" /* u>äÝë..rÀ÷×.4›/› */
- $"686C C9AF 0896 0865 7A3A 5A9D 807F 292A" /* hlɯ.–.ez:Z€.)* */
- $"8DDA A776 4B3C 0993 532D D682 A41B 9DC2" /* Ú§vK<Æ“S-Ö‚¤. */
- $"5113 9D60 934B 2055 D671 C6C4 1252 3CEF" /* Q.`“K UÖqÆÄ.R<ï */
- $"C72F AC19 4BED 185D BC60 5957 F81B 8278" /* Ç/¬.Kí.]¼`YWø.‚x */
- $"20B5 9173 4A1B FDC9 295D 54B7 8AFE 6938" /* µ‘sJ.ýÉ)]T·Šþi8 */
- $"FE49 BA78 3225 49A1 4243 823C 52B9 8489" /* þIºx2%I¡BC‚<R¹„‰ */
- $"9BDF 0AA1 9A6B 667D DCE2 FE18 C386 4EE9" /* ›ß¡škf}Üâþ.ÆNé */
- $"8AF7 92D0 4405 227C BD4C B9E4 34A7 2533" /* Š÷’ÐD."|½L¹ä4§%3 */
- $"D3C6 E915 D57B 681B B6DC FF03 D5D4 F1DD" /* ÓÆé.Õ{h.¶Üÿ.ÕÔñÝ */
- $"4FB5 BA54 262A 73C2 1CF4 4CD1 D842 E8C2" /* OµºT&*sÂ.ôLÑØBè */
- $"8169 3555 13EC 6A25 6DE0 3614 EC2E D1BB" /* i5U.ìj%mà6.ì.Ñ» */
- $"E597 BFC6 2ACB 6879 11D1 870D E79E 8422" /* å—¿Æ*Ëhy.ч.çž„" */
- $"C01D 4032 8887 6DBA FBEC 3077 F220 49E3" /* À.@2ˆ‡mºûì0wò Iã */
- $"8693 0B00 9F45 0F57 0A39 DA8E EAA5 CD48" /* †“..ŸE.WÂ9ÚŽê¥ÍH */
- $"2C93 C3EC BDE0 71D5 5749 0952 441C E3F8" /* ,“Ãì½àqÕWIÆRD.ãø */
- $"597F C1E6 FB6B BBED AD71 FC34 CFF8 5877" /* Y.Áæûk»í­qü4ÏøXw */
- $"DB67 5F6D 798F E163 5F6B 1CFA A87B ED7C" /* Ûg_myác_k.ú¨{í| */
- $"F176 3065 72FF 443D BA6B 8FBD 9E85 806A" /* ñv0erÿD=ºk½ž…€j */
- $"2A1B 368C 7A9E B1B1 93DE ABD8 263F 31B3" /* *.6Œzž±±“Þ«Ø&?1³ */
- $"1739 58F1 7233 FE7C 4EC4 32AA CDDB CF11" /* .9Xñr3þ|NÄ2ªÍÛÏ. */
- $"C519 9C61 B756 AF62 D55D 5D48 6AF7 4364" /* Å.œa·V¯bÕ]]Hj÷Cd */
- $"205E F14D AAD6 EFF5 2F0D CBE4 0F19 3159" /* ^ñMªÖïõ/.Ëä..1Y */
- $"94F4 910E 4217 990B CABE EBF5 2B67 2EF6" /* ”ô‘.B.™.ʾëõ+g.ö */
- $"FE41 0C44 1C50 43EA 69F5 4E73 5569 82A1" /* þA.D.PCêiõNsUi‚¡ */
- $"C13C 4899 3AA9 5E13 5F76 BF98 2105 1842" /* Á<H™:©^._v¿˜!..B */
- $"AF34 9AFD CFC8 D1E7 3479 E1F3 C86F D06F" /* ¯4šýÏÈÑç4yáóÈoÐo */
- $"9ED9 9DD8 E2E0 4B44 19F4 03E6 9CC0 3474" /* žÙØâàKD.ô.æœÀ4t */
- $"DFBD 078F D140 1C06 5F8C B6E2 665C 703A" /* ß½.Ñ@.._Œ¶âf\p: */
- $"2841 642E F538 C531 697D 5064 11AD 9E8C" /* (Ad.õ8Å1i}Pd.­žŒ */
- $"5A53 3174 7302 762E 9708 BEF5 AD41 0C01" /* ZS1ts.v.—.¾õ­A.. */
- $"D744 85FC D963 416A 9A3A 6898 F067 5B1C" /* ×D…üÙcAjš:h˜ðg[. */
- $"873B 42B6 72C4 FF18 337A 8A24 EDCE 6B8B" /* ‡;B¶rÄÿ.3zŠ$íÎk‹ */
- $"BF06 0EA4 0227 A131 8620 B03C A2B9 729E" /* ¿..¤.'¡1† °<¢¹rž */
- $"1242 EC64 E340 5C5C 9BFF 120A BB1B 75E5" /* .Bìdã@\\›ÿ.».uå */
- $"385B 68AF C7B7 8BA5 1E7B 6FC1 DDB2 F642" /* 8[h¯Ç·‹¥.{oÁݲöB */
- $"FF56 4D21 66B3 EA8C 7095 8FBD 92CC 7315" /* ÿVM!f³êŒp•½’Ìs. */
- $"665F B398 608C ADD4 11E0 DA38 734A C3DB" /* f_³˜`Œ­Ô.àÚ8sJÃÛ */
- $"9249 4640 27D6 D057 426E 651D BF14 F0DE" /* ’IF@'ÖÐWBne.¿.ðÞ */
- $"9130 2D17 8D66 9689 79BD 9A6D 5AF9 6C7C" /* ‘0-.f–‰y½šmZùl| */
- $"94BF 8531 6507 5621 1C11 8D8F F3A5 83D9" /* ”¿…1e.V!..ó¥ƒÙ */
- $"7EE3 1E6D 9B0A 8D44 F466 DE49 E606 E143" /* ~ã.m›ÂDôfÞIæ.áC */
- $"7E77 D417 D49D 9CF2 89AA B0FA 84A4 33A5" /* ~wÔ.Ôœò‰ª°ú„¤3¥ */
- $"8279 A26A 82C5 27CF FB64 D227 994E C6A7" /* ‚y¢j‚Å'ÏûdÒ'™NƧ */
- $"531C 7B7D D333 20D4 F79E 7C21 CC1E 7ADA" /* S.{}Ó3 Ô÷ž|!Ì.zÚ */
- $"F978 DEBB 1FF2 7420 A72D DE6B AB74 8DC6" /* ùxÞ».òt §-Þk«tÆ */
- $"DD0F 0386 BF57 5F23 4926 C874 D598 47A3" /* Ý..†¿W_#I&ÈtÕ˜G£ */
- $"FBC8 E9B0 38BB C695 B7F4 82A1 CC5F 1E22" /* ûÈé°8»Æ•·ô‚¡Ì_." */
- $"767C 20D5 E64D 44F1 B2D4 2298 C6A1 1842" /* v| ÕæMDñ²Ô"˜Æ¡.B */
- $"8139 0CC8 B9C5 284F 9FC8 945B 5342 94A8" /* 9.ȹÅ(OŸÈ”[SB”¨ */
- $"1A57 3351 E00E DB28 D5E3 9712 4346 6DBA" /* .W3Qà.Û(Õã—.CFmº */
- $"CC9B A1ED CD9B 778D 4523 1E9A AC69 8ED9" /* Ì›¡íÍ›wE#.š¬iŽÙ */
- $"67C4 C16D A548 A029 0075 0185 8D06 B7F0" /* gÄÁm¥H ).u.….·ð */
- $"8258 D26A EB95 D437 F0D2 8E91 D536 F534" /* ‚XÒjë•Ô7ðÒŽ‘Õ6õ4 */
- $"30A1 6DE7 E4B8 48DF 246E 6A43 4FE6 AED0" /* 0¡mçä¸Hß$njCOæ®Ð */
- $"48A0 5E1E C339 6C40 BE36 CEB8 870B F9EB" /* H ^.Ã9l@¾6θ‡.ùë */
- $"5ED8 3CA2 B3FA 8CD9 2D26 FF79 6468 862D" /* ^Ø<¢³úŒÙ-&ÿydh†- */
- $"6B87 3072 15D5 5640 D5D4 B4BA EAD3 84F1" /* k‡0r.ÕV@ÕÔ´ºêÓ„ñ */
- $"6A43 F378 100E 8088 A3FE 989B E75B F67F" /* jCóx..€ˆ£þ˜›ç[ö. */
- $"5B25 3AE2 C08C 8CB0 08DD A37F 94DD 7F03" /* [%:âÀŒŒ°.Ý£.”Ý.. */
- $"35C9 DF27 9A9A B829 6326 A95D 91F7 0BA3" /* 5Éß'šš¸)c&©]‘÷.£ */
- $"7220 E220 F062 D8DE ADE2 2AD6 DDFD C9E4" /* r â ðbØÞ­â*ÖÝýÉä */
- $"FAAE 543D 3CCB 5230 74F7 3120 02FD 6B45" /* ú®T=<ËR0t÷1 .ýkE */
- $"A2AB 805B 13FB 1879 6060 5600 1847 98E5" /* ¢«€[.û.y``V..G˜å */
- $"BF65 2CD4 ACD7 15D0 B77E 5A0F 8095 95CA" /* ¿e,Ô¬×.з~Z.€••Ê */
- $"1847 D25F 7D32 1AE2 89EA 9D49 074D A3E5" /* .GÒ_}2.â‰êI.M£å */
- $"201E 8AC7 CB9C 43BC 0732 70E0 3C4F E625" /* .ŠÇËœC¼.2pà<Oæ% */
- $"88E3 74DB 6FB7 7BE2 7006 F9E7 1F76 DBF3" /* ˆãtÛo·{âp.ùç.vÛó */
- $"C988 D665 F7AA 21E2 A5C1 E969 2917 3BA3" /* ɈÖe÷ª!â¥Áéi).;£ */
- $"17BF 925F F835 9827 813E DA4F EE9B 2DF3" /* .¿’_ø5˜'>ÚOî›-ó */
- $"B640 95E8 70A5 B577 8C1D 99D5 797D D482" /* ¶@•èp¥µwŒ.™Õy}Ô‚ */
- $"E23A 56DD 644D 9623 FEE2 63D2 A3DB E146" /* â:VÝdM–#þâcÒ£ÛáF */
- $"FC39 35A7 6C28 63D8 5240 0C80 0000 0000" /* ü95§l(cØR@.€.... */
- $"0001 4095 99D3 7A7A 0A05 B673 69BC DA9C" /* ..@•™ÓzzÂ.¶si¼Úœ */
- $"A108 DDEA EE48 6385 0790 FEA1 1AFC 2CED" /* ¡.ÝêîHc….þ¡.ü,í */
- $"2225 BE73 2ED7 00BB 2301 80FE 09DF E78E" /* "%¾s.×.»#.€þÆßçŽ */
- $"6FE6 4743 A0EE 0A03 4C9E F046 CDD8 E7F1" /* oæGC îÂ.LžðFÍØçñ */
- $"DB3F 1B67 F6E1 1F31 8096 90DF 5110 40B0" /* Û?.göá.1€–ßQ.@° */
- $"0000 0000 0000 0000 C0B9 E0FC 41FB A11C" /* ........À¹àüAû¡. */
- $"4696 89A0 DE42 F8C7 27D0 3F03 AA51 70FD" /* F–‰ ÞBøÇ'Ð?.ªQpý */
- $"DC5F D7B9 AFD3 A0F3 7BAA A910 9E5C 259E" /* Ü_×¹¯Ó ó{ª©.ž\%ž */
- $"E4FB 8F8E 01C1 96E2 0768 FE5A 0A43 E2F8" /* äûŽ.Á–â.hþZÂCâø */
- $"DA74 9500 C241 D1F6 3EFF 3F06 586F A511" /* Út•.ÂAÑö>ÿ?.Xo¥. */
- $"CCFE 8FE7 61E1 C392 D001 3F52 1CA8 CC23" /* ÌþçaáÃ’Ð.?R.¨Ì# */
- $"93F0 27DF 893F 4AC1 06C3 34DA 8953 BBC0" /* “ð'߉?JÁ.Ã4Ú‰S»À */
- $"84C0 4843 27E0 067E 5EBF FF7A 1540 4C0E" /* „ÀHC'à.~^¿ÿz.@L. */
- $"FA6C 44A1 A7BC DB24 6AD7 C367 EC93 33BF" /* úlD¡§¼Û$j×Ãgì“3¿ */
- $"FECB C1DF 83CC 5BF7 A7C0 DF62 2EFA 4283" /* þËÁ߃Ì[÷§Àßb.úBƒ */
- $"6E49 2492 4924 9249 2492 4924 9246 A4A5" /* nI$’I$’I$’I$’F¤¥ */
- $"7754 9685 B091 D8FF 1549 CF90 2079 3AFB" /* wT–…°‘Øÿ.IÏ y:û */
- $"E925 85CC 62A2 E49B 476B 47B9 319B 630F" /* é%…Ìb¢ä›GkG¹1›c. */
- $"A6B8 182C E282 D1CD 920A 4EB3 21BF 943C" /* ¦¸.,â‚ÑÍ’ÂN³!¿”< */
- $"27BF CCDE BD6E 481A 188C F70B C257 8118" /* '¿ÌÞ½nH..Œ÷.ÂW. */
- $"FBF7 FF78 F422 A3DB AE81 4980 0000 0000" /* û÷ÿxô"£Û®I€.... */
- $"0000 0000 0000 1EE1 BFBB C300 0000 0000" /* .......á¿»Ã..... */
- $"0000 0000 0000 14FB 3FE1 1B7A D142 E13F" /* .......û?á.zÑBá? */
- $"5B6F 704A 61CF 957D 258E F744 FB26 8356" /* [opJaÏ•}%Ž÷Dû&ƒV */
- $"74AD 1DDB 02F2 CF85 7AEB 3A06 6F12 084E" /* t­.Û.òÏ…zë:.o..N */
- $"8E93 D6DA E4FE 9FBE 2D16 1C87 701F 55C3" /* Ž“ÖÚäþŸ¾-..‡p.Uà */
- $"9966 3E8F 36CB 6D9F F3F6 F8D3 B3B9 E2C1" /* ™f>6ËmŸóöøÓ³¹âÁ */
- $"1019 C6E6 8FFF 7FDC 6948 D3AB C944 C64A" /* ..Ææÿ.ÜiHÓ«ÉDÆJ */
- $"8000 0000 0000 0000 000A B0CB 3806 445C" /* €........°Ë8.D\ */
- $"7110 4CDE 3651 AC94 777C 8AB0 5382 04AF" /* q.LÞ6Q¬”w|Š°S‚.¯ */
- $"32E5 68C2 122F 8A5B 12A8 FF39 CF5E 72FB" /* 2åhÂ./Š[.¨ÿ9Ï^rû */
- $"EFD4 1669 47C6 525E 88EF 0AAC 1EE1 98B6" /* ïÔ.iGÆR^ˆï¬.ᘶ */
- $"0BFF 7FAF 8A4B 7158 F7D7 1707 DE93 841E" /* .ÿ.¯ŠKqX÷×..Þ“„. */
- $"3C82 3260 1FFF 1C8B 6A6E 8C66 0000 0000" /* <‚2`.ÿ.‹jnŒf.... */
- $"0000 0000 0000 0121 EF03 234C 3124 0000" /* .......!ï.#L1$.. */
- $"0000 0000 0000 0000 077C 5957 204B A2ED" /* .........|YW K¢í */
- $"59B8 F3C4 CC60 8A58 7E23 0B9F A0FD 1DC8" /* Y¸óÄÌ`ŠX~#.Ÿ ý.È */
- $"8E0F FE2B 5F9F 12D8 09B3 57BB 7818 3CF5" /* Ž.þ+_Ÿ.ØƳW»x.<õ */
- $"D579 D427 5198 BD86 E2FC 8775 915B 37A5" /* ÕyÔ'Q˜½†âü‡u‘[7¥ */
- $"B2E6 6BD8 8404 31D9 4C54 3621 6561 5C3E" /* ²ækØ„.1ÙLT6!ea\> */
- $"4A80 0000 0000 0000 0000 0014 D22D 6758" /* J€..........Ò-gX */
- $"336C 63A1 C13F 3E94 9877 8E90 4E5D 0C70" /* 3lc¡Á?>”˜wŽN].p */
- $"F80A 4262 C2CC C7E4 DAE8 526F 393F 4558" /* øÂBbÂÌÇäÚèRo9?EX */
- $"5CC9 5DDA B2FF 7ED5 F809 3A02 F1EE 2760" /* \É]Ú²ÿ~ÕøÆ:.ñî'` */
- $"FF7E 5037 F054 4A1B 9602 92EA 8D26 A198" /* ÿ~P7ðTJ.–.’ê&¡˜ */
- $"9C4F 8238 A60E 7734 20F8 18FE 478F 5403" /* œO‚8¦.w4 ø.þGT. */
- $"1658 618B A80F 879F 4A98 E809 DEB2 7CE9" /* .Xa‹¨.‡ŸJ˜èÆÞ²|é */
- $"9724 407B B8C8 A48D 4F33 9126 751B 9FC2" /* —$@{¸È¤O3‘&u.ŸÂ */
- $"0283 44C3 5AFD 9546 FCE2 4212 4F5B 01D4" /* .ƒDÃZý•FüâB.O[.Ô */
- $"6E53 A032 DA91 40F4 4BDE 0C23 FF1E D5DE" /* nS 2Ú‘@ôKÞ.#ÿ.ÕÞ */
- $"B543 59DC C0DC 759A 6043 5883 A5FE C785" /* µCYÜÀÜuš`CXƒ¥þÇ… */
- $"BA68 9F46 C21A 4C50 20E3 0488 FB34 1043" /* ºhŸFÂ.LP ã.ˆû4.C */
- $"FC68 562B 635A EE8D E334 0C6F 25A9 E4C9" /* ühV+cZîã4.o%©äÉ */
- $"3484 2AC2 6188 7242 E3F6 AEAC 6F86 2DE2" /* 4„*ÂaˆrBãö®¬o†-â */
- $"C377 BD02 CB1C 9553 5485 6A5B E118 9BBD" /* Ãw½.Ë.•ST…j[á.›½ */
- $"DC6B 2C92 C6CC C866 6E7F FE63 AB01 FE7D" /* Ük,’ÆÌÈfn.þc«.þ} */
- $"FF7F BB81 EA94 87BE B101 F468 0E30 F111" /* ÿ.»ê”‡¾±.ôh.0ñ. */
- $"7BC9 FA0D F87F BDD0 811B 8588 1AE7 8387" /* {Éú.ø.½Ð.…ˆ.烇 */
- $"5C06 B3A9 E2ED 6E5B B524 35AA CBFF 50D6" /* \.³©âín[µ$5ªËÿPÖ */
- $"49D9 6918 3837 59BD E7CC 8796 B0AF 2729" /* IÙi.87Y½ç̇–°¯') */
- $"0512 5A97 66FF 1A85 E004 1882 0108 EA41" /* ..Z—fÿ.…à..‚..êA */
- $"BBCC 15E0 254C 59AF 877D 0722 15FB ADA1" /* »Ì.à%LY¯‡}.".û­¡ */
- $"84C2 9B83 DD5B C6B1 EE29 084C 08F7 06C8" /* „›ƒÝ[Ʊî).L.÷.È */
- $"4F07 9818 6BF2 66E2 582B 2F7D 29AD BAFA" /* O.˜.kòfâX+/})­ºú */
- $"8F9E 0AC8 60AE D10E 3E49 17BF E015 0C5E" /* žÂÈ`®Ñ.>I.¿à..^ */
- $"5C51 5D5B 5BC1 6C83 C428 4505 E9BB 61CB" /* \Q][[ÁlƒÄ(E.é»aË */
- $"D7C2 F3C6 C102 73F5 409E D0CF B43E E497" /* ×ÂóÆÁ.sõ@žÐÏ´>ä— */
- $"C1E0 707B 3F6F EAA8 2F10 9285 7D9D 9F81" /* Áàp{?oê¨/.’…}Ÿ */
- $"303D 3A70 2B3F 4A45 558D 63F6 EEB9 CF21" /* 0=:p+?JEUcöî¹Ï! */
- $"52C1 27C2 8439 0BE2 BE1F A553 A1C7 E44C" /* RÁ'„9.â¾.¥S¡ÇäL */
- $"5422 9BC0 356D 1B40 E53B 3064 AA69 F464" /* T"›À5m.@å;0dªiôd */
- $"7AA7 4E56 F7E2 7AE5 CB6E E538 8582 1927" /* z§NV÷âzåËnå8…‚.' */
- $"019D B4B0 E6D9 0F0E 9670 7723 62CF C422" /* .´°æÙ..–pw#bÏÄ" */
- $"DD53 ED12 92AE 20B0 6B63 6CB3 C596 4F4E" /* ÝSí.’® °kcl³Å–ON */
- $"18B6 FD06 93B2 6F73 A740 770D C39F B873" /* .¶ý.“²os§@w.߸s */
- $"598F 3667 6F7A 29E9 9E6F 9D04 48DD A175" /* Y6goz)éžo.HÝ¡u */
- $"2AFC 61BD D706 2A8E 9789 F513 B8AF B8EA" /* *üa½×.*Ž—‰õ.¸¯¸ê */
- $"2426 7EDF 1EFA 1D19 7A50 D22F D15E 76FE" /* $&~ß.ú..zPÒ/Ñ^vþ */
- $"CD34 19AD 8126 775C A5FB B209 9658 F850" /* Í4.­&w\¥û²Æ–XøP */
- $"F2FD A65F B487 9F50 7FF0 12FD BA8B FB6E" /* òý¦_´‡ŸP.ð.ýº‹ûn */
- $"49F5 50DF C349 B4F9 F4D7 EDEB 53BE DEB0" /* IõPßÃI´ùô×íëS¾Þ° */
- $"7F85 29FB 5DFF 36B9 BEDA 9BF8 3CF2 FDAE" /* .…)û]ÿ6¹¾Ú›ø<òý® */
- $"DFB5 ABBE D3DB ED2B FDBA CFFB 7606 FB74" /* ßµ«¾ÓÛí+ýºÏûv.ût */
- $"D3F8 6B96 83BA F7ED EB3F 7EDE AFE0 EECD" /* Óøk–ƒº÷íë?~Þ¯àîÍ */
- $"FB5E 7F6E 807E DB9B F6BD F0FE D32B EA21" /* û^.n€~Û›ö½ðþÓ+ê! */
- $"EFA8 1EFA 823F 6DCF FB6C 8BEA 6CFD B5AF" /* ï¨.ú‚?mÏûl‹êlýµ¯ */
- $"0774 CFDB D337 FB7A 3F83 BA5D F51F DF55" /* .tÏÛÓ7ûz?ƒº]õ.ßU */
- $"47FB 690F DA86 F791 DDD6 2CCB E6B8 C536" /* Gûi.Ú†÷‘ÝÖ,Ëæ¸Å6 */
- $"D512 AD5E 1B08 0B8A 8D03 2F75 60E5 6BF8" /* Õ.­^...Š./u`åkø */
- $"447B C66A 7EC2 7912 B45F 8E48 277C D8E1" /* D{Æj~Ây.´_ŽH'|Øá */
- $"809C 5755 D718 BAAC F891 2AE5 F97C 3F5E" /* €œWU×.º¬ø‘*åù|?^ */
- $"0116 3A00 99F4 5896 E0EA B189 F5A5 7929" /* ..:.™ôX–à걉õ¥y) */
- $"C491 B57F 2232 B0C2 52F8 89B1 DB2F B284" /* Ä‘µ."2°ÂRø‰±Û/²„ */
- $"C1EE 0C43 EF76 FD94 F871 4077 7E19 EC36" /* Áî.Cïvý”øq@w~.ì6 */
- $"BBFA 6DFF 3C0B 5A98 89B4 84BB 56DB 5FC2" /* »úmÿ<.Z˜‰´„»VÛ_ */
- $"16C2 351A B46E AF45 AAC7 DD2E 97ED 970C" /* .Â5.´n¯EªÇÝ.—í—. */
- $"76D8 F8D0 42EB E639 28E8 BE33 A530 3B58" /* vØøÐBëæ9(è¾3¥0;X */
- $"2374 6B1C 97B0 1CD5 ACD5 615F FD30 62C6" /* #tk.—°.Õ¬Õa_ý0bÆ */
- $"899A 977D 4B74 CAB1 E9EE 6588 4E67 8733" /* ‰š—}KtʱéîeˆNg‡3 */
- $"B359 BCC7 DC7B 9884 E4A8 78CB 77E7 675D" /* ³Y¼ÇÜ{˜„ä¨xËwçg] */
- $"FF2D FCE4 7744 BDD1 A833 6BEC C481 2DA8" /* ÿ-üäwD½Ñ¨3kìÄ-¨ */
- $"3D1C 5D57 7595 1DEB 2278 31AE 4188 B1F2" /* =.]Wu•.ë"x1®Aˆ±ò */
- $"54E1 113D DA75 96ED 71FF 1577 7820 4D22" /* Tá.=Úu–íqÿ.wx M" */
- $"2BD9 3841 A416 96A4 2549 1A9D 3A55 8E39" /* +Ù8A¤.–¤%I.:UŽ9 */
- $"A929 4B4E E11F 0F88 8BB6 7E08 2210 9D21" /* ©)KNá..ˆ‹¶~.".! */
- $"92BF 623B B974 D371 0208 1489 5713 0F66" /* ’¿b;¹tÓq...‰W..f */
- $"3C4C 8394 72A6 08A1 3D86 BA0C 198B CE8B" /* <Lƒ”r¦.¡=†º..‹Î‹ */
- $"FB71 18D8 E044 CE7C A642 F1E5 DC8B F8E6" /* ûq.ØàDÎ|¦BñåÜ‹øæ */
- $"2405 66E0 B6C5 6A4F B1AE 2231 3060 11D4" /* $.fà¶ÅjO±®"10`.Ô */
- $"9963 5EF4 BB3D 1F61 0807 0AE1 0DFC 4718" /* ™c^ô»=.a..Âá.üG. */
- $"6C97 80A7 D438 6A81 B76A 6E7E 7A64 87A1" /* l—€§Ô8j·jn~zd‡¡ */
- $"1D7A 8744 3227 F565 4B4A E311 FA0F B477" /* .z‡D2'õeKJã.ú.´w */
- $"9DD6 0662 8844 7138 BDF8 CBCC 007F BDB6" /* Ö.bˆDq8½øËÌ..½¶ */
- $"07C4 98CC 226B 9762 33D0 99EF 54D9 5800" /* .ĘÌ"k—b3ЙïTÙX. */
- $"509D C37B 39A7 E11B 8771 0999 AB8B AAA6" /* PÃ{9§á.‡qÆ™«‹ª¦ */
- $"C463 6C38 7FB0 9121 2CA2 7634 BBEE 41FB" /* Äcl8.°‘!,¢v4»îAû */
- $"4F3B B050 3E38 15C4 98A6 216D 31C2 7057" /* O;°P>8.ʦ!m1ÂpW */
- $"0B3D 429A 6CFB 0819 EB4D B9D2 549F 6601" /* .=Bšlû..ëM¹ÒTŸf. */
- $"2436 5BEA 9DAC BBDA AB3A AB4F ABFF 768D" /* $6[ꬻګ:«O«ÿv */
- $"E220 E451 7E45 49C5 21FD B2E6 DEFD 2505" /* â äQ~EIÅ!ý²æÞý%. */
- $"836B 3500 54D8 50B8 7538 C5BF B951 7FB2" /* ƒk5.TØP¸u8Å¿¹Q.² */
- $"F927 CBB1 7AA1 D0BD 51E2 D7F7 C440 5DA0" /* ù'˱z¡Ð½Qâ×÷Ä@]  */
- $"89EF FEEE BF2E A5E4 F98A B652 F25A D1DC" /* ‰ïþî¿.¥äùŠ¶RòZÑÜ */
- $"482A 40CB A288 250A 22CA BCB4 815D 077E" /* H*@Ë¢ˆ%Â"ʼ´].~ */
- $"229E 59B2 8249 D336 A3C1 5D5B FAE5 483C" /* "žY²‚IÓ6£Á][úåH< */
- $"67F3 255E 1530 AFB1 D900 48FE 254B C54E" /* gó%^.0¯±Ù.Hþ%KÅN */
- $"42DC EE54 066B CE83 B1C9 F021 2031 8DF1" /* BÜîT.k΃±Éð! 1ñ */
- $"FE58 9315 B761 79CA 409A 6CD6 337A 14A9" /* þX“.·ayÊ@šlÖ3z.© */
- $"8622 90BC 3474 727C 66CE 09C5 61B4 A386" /* †"¼4tr|fÎÆÅa´£† */
- $"7509 819F 6EEB 5FCC C0A7 084A 7742 A6E3" /* uÆŸnë_ÌÀ§.JwB¦ã */
- $"F69A 90CA 24AD EB53 60AB 5FD0 FD6F 3DE6" /* öšÊ$­ëS`«_Ðýo=æ */
- $"44CF 80FB A400 B71F 1DD4 C690 A3DB 54CF" /* DÏ€û¤.·..ÔÆ£ÛTÏ */
- $"F492 7EC7 540C 048F 3D35 FD63 7593 751B" /* ô’~ÇT..=5ýcu“u. */
- $"F88F 4B7D E355 6685 FD5F 2743 8DF3 D839" /* øK}ãUf…ý_'CóØ9 */
- $"0894 99DB 1FAA 22B2 8800 8C9F D91F E60B" /* .”™Û.ª"²ˆ.ŒŸÙ.æ. */
- $"0EEE 2870 2932 2AE5 F401 11F0 8B2B 53DB" /* .î(p)2*åô..ð‹+SÛ */
- $"8028 E39D 744F E70B 11F3 A220 ABF4 FCD5" /* €(ãtOç..ó¢ «ôüÕ */
- $"37C9 0AC8 8749 215E 1D89 4022 96D0 04FF" /* 7ÉÂȇI!^.‰@"–Ð.ÿ */
- $"0C57 AC3D 351A 8582 EBA4 EA2B B65B A14B" /* .W¬=5.…‚ë¤ê+¶[¡K */
- $"048B E031 DE15 251C 669F 8457 FF38 D131" /* .‹à1Þ.%.fŸ„Wÿ8Ñ1 */
- $"0027 BB20 9721 6636 A375 AFBA AF7B BDBA" /* .'» —!f6£u¯º¯{½º */
- $"05F3 3114 E55E DAA9 219F 9516 F3DF 12B4" /* .ó1.å^Ú©!Ÿ•.óß.´ */
- $"DA3F 83DF 13A0 9900 3FA6 17E9 B014 E404" /* Ú?ƒß. ™.?¦.é°.ä. */
- $"434D 02D4 4283 D73D F4D1 5D95 8B25 6A6A" /* CM.ÔBƒ×=ôÑ]•‹%jj */
- $"CD5E BA93 82DF 1A30 4B0D 0E21 65A1 0001" /* Í^º“‚ß.0K..!e¡.. */
- $"2869 F06A 8949 311F DB03 39EB E8E1 5BFB" /* (iðj‰I1.Û.9ëèá[û */
- $"F11C 05C6 2469 BAEA 4516 4CC4 DAF5 927A" /* ñ..Æ$iºêE.LÄÚõ’z */
- $"2CEB 3150 DB6F 4DE2 8EED 59C0 604F 9AE5" /* ,ë1PÛoMâŽíYÀ`Ošå */
- $"E136 83B0 F348 3D1A B44D 3A8E D77A B0DE" /* á6ƒ°óH=.´M:Ž×z°Þ */
- $"5267 1055 24F7 3C3D EB3E 08EF 97F9 4B29" /* Rg.U$÷<=ë>.ï—ùK) */
- $"454F 1B5D 4A6E 56E1 0F90 00A1 4467 7454" /* EO.]JnVá..¡DgtT */
- $"B556 362A 9A19 9E35 19E9 BFDF E2AD 91D6" /* µV6*š.ž5.é¿ßâ­‘Ö */
- $"7FB6 95B9 F19D 8D07 2FAF 3162 D880 0AA7" /* .¶•¹ñ./¯1b؀§ */
- $"C9C4 94AD C49A 1231 2D9F 780F 6E3E 57D2" /* ÉÄ”­Äš.1-Ÿx.n>WÒ */
- $"8C1C 582C 179A 721C 7063 F056 F938 4EA1" /* Œ.X,.šr.pcðVù8N¡ */
- $"F3E4 E458 D254 280F 92CA ABDC 4ECF 3EB7" /* óääXÒT(.’Ê«ÜNÏ>· */
- $"95DF A3B8 45C0 1427 BA54 B2E2 D1BC B67D" /* •ß£¸EÀ.'ºT²âѼ¶} */
- $"5A0F EE12 37D4 BE1C 5785 A90D 2E62 B301" /* Z.î.7Ô¾.W…©..b³. */
- $"F66D A637 374B 17DA 7446 C318 3B11 4F50" /* öm¦77K.ÚtFÃ.;.OP */
- $"ED27 AEB2 D8F6 C3E4 AB48 5E7C 1D46 9463" /* í'®²ØöÃä«H^|.F”c */
- $"E7BA 9296 7BFA FDBB 39F2 7E86 1A5D 8FFA" /* 纒–{úý»9ò~†.]ú */
- $"7E06 FC92 3472 7950 8B67 8329 FA9F 47AA" /* ~.ü’4ryP‹gƒ)úŸGª */
- $"51F3 01AD A6DA 224F E711 AF6F BA8F FA86" /* Qó.­¦Ú"Oç.¯oºú† */
- $"FF61 EBD1 5613 B076 3543 3515 FF1B 1E9C" /* ÿaëÑV.°v5C5.ÿ..œ */
- $"CE78 6A36 7CCF FD63 E9E3 00E6 EA60 1DBE" /* Îxj6|Ïýcéã.æê`.¾ */
- $"42FB 3E66 D69D 8BA6 A0E6 13E1 2087 20D7" /* Bû>fÖ‹¦ æ.á ‡ × */
- $"7941 E3C4 C7C6 67FF 2C9C A486 253A C206" /* yAãÄÇÆgÿ,œ¤†%:Â. */
- $"F961 4A0E D9DD D32A 6D67 A012 B1A2 B549" /* ùaJ.ÙÝÓ*mg .±¢µI */
- $"3F58 8BA1 CA98 94EB 6099 570C D139 09AA" /* ?X‹¡Ê˜”ë`™W.Ñ9ƪ */
- $"8DEB C31A 0812 5DAD 2926 6846 D789 4430" /* ëÃ...]­)&hF׉D0 */
- $"4931 16B5 0804 52F1 040D B0A7 DDD7 7052" /* I1.µ..Rñ..°§Ý×pR */
- $"4269 C765 98AA 3941 F9EE 987A 2EAD 46BE" /* BiÇe˜ª9Aùî˜z.­F¾ */
- $"AA2B DD79 D9F9 7AF7 9318 B633 97CC DB93" /* ª+ÝyÙùz÷“.¶3—ÌÛ“ */
- $"5AF7 23D4 08E5 1FD7 EA45 85E9 4C98 77B6" /* Z÷#Ô.å.×êE…éL˜w¶ */
- $"0038 8756 6C8F 1A76 8D36 D67C 0BBD 248F" /* .8‡Vl.v6Ö|.½$ */
- $"8465 4CC4 7B7A C1B7 6348 F763 66A7 F04E" /* „eLÄ{zÁ·cH÷cf§ðN */
- $"FF4E 1C72 1053 323F 9E55 F75D 4097 9C24" /* ÿN.r.S2?žU÷]@—œ$ */
- $"AD5D 3C1B 766A 50A8 7252 6563 2687 8251" /* ­]<.vjP¨rRec&‡‚Q */
- $"8AE2 2EAE 6AA9 6439 2831 281E 034D 7999" /* Šâ.®j©d9(1(..My™ */
- $"F46F 47C1 911D 553A D887 0E8F 6E83 1B48" /* ôoGÁ‘.U:؇.nƒ.H */
- $"F0D9 C566 C0FF 0F02 5E68 EA76 7381 25B1" /* ðÙÅfÀÿ..^hêvs%± */
- $"D388 A375 370B A655 625B B71A 191C CD9D" /* Óˆ£u7.¦Ub[·...Í */
- $"F3CA 83B2 88D6 3712 B3E3 6CEA 19DC 3295" /* óʃ²ˆÖ7.³ãlê.Ü2• */
- $"3398 DF4F 1279 B346 1DD8 ED24 186F BEE1" /* 3˜ßO.y³F.Øí$.o¾á */
- $"8FD4 5FAD EAFF 6960 DE17 A0A4 B89E 7CF3" /* Ô_­êÿi`Þ. ¤¸ž|ó */
- $"C360 9DA8 91BF 470F ECC0 C0AA E260 3430" /* Ã`¨‘¿G.ìÀÀªâ`40 */
- $"EF4E CAD6 F964 05B0 8E27 C1F6 7516 4350" /* ïNÊÖùd.°Ž'Áöu.CP */
- $"B87D 7D16 703E 7972 1232 2E0F 6577 664C" /* ¸}}.p>yr.2..ewfL */
- $"8FA6 1414 7FB2 A33D A69E FD2F CF21 FC8F" /* ¦...²£=¦žý/Ï!ü */
- $"23A5 6AED 3E28 34A0 F73F F7D6 7F7C 5B6B" /* #¥jí>(4 ÷?÷Ö.|[k */
- $"0596 8B6D BACA 52DF 8E72 CDBA E221 7092" /* .–‹mºÊRߎrͺâ!p’ */
- $"A3AB B99D 1EE3 3F21 1AD2 0F0B DC5A 8BE1" /* £«¹.ã?!.Ò..ÜZ‹á */
- $"9E35 D891 9A60 EF28 5934 FA3B 8009 DC42" /* ž5Ø‘š`ï(Y4ú;€ÆÜB */
- $"11BE 487F D776 AF26 0EBD BF3E 8DCC B940" /* .¾H.×v¯&.½¿>̹@ */
- $"2523 D6E1 447F EA8A 5F66 DE0B 0962 249E" /* %#ÖáD.êŠ_fÞ.Æb$ž */
- $"165D BB6D 1EBD 1237 021B F903 DEEF 78FE" /* .]»m.½.7..ù.Þïxþ */
- $"B3F3 76B7 429F 336D 0EFA FF47 5CBC E3DF" /* ³óv·BŸ3m.úÿG\¼ãß */
- $"FC44 41BA BC9D 67AE 0B43 D817 FBCE 4F36" /* üDAº¼g®.CØ.ûÎO6 */
- $"8209 CCB5 38F6 712E 7DEA 4E9E 4B38 3B80" /* ‚Æ̵8öq.}êNžK8;€ */
- $"7B16 28E3 AB59 340E 93F0 4C65 C281 A4F1" /* {.(ã«Y4.“ðLe¤ñ */
- $"08E4 26A6 31AA B6A4 F784 BA8E C7FA 8919" /* .ä&¦1ª¶¤÷„ºŽÇú‰. */
- $"4B19 FA98 09C8 3C79 27DA CB39 881C 3B0E" /* K.ú˜ÆÈ<y'ÚË9ˆ.;. */
- $"9BEA 1EF3 D655 CFEB B4F7 0888 971D 69EF" /* ›ê.óÖUÏë´÷.ˆ—.iï */
- $"1105 0EF2 80B8 FF1E F0BE 107F 9AB0 6C52" /* ...ò€¸ÿ.ð¾..š°lR */
- $"FF78 3AA4 8FE0 3370 40DF C5E8 478A 2FCF" /* ÿx:¤à3p@ßÅèGŠ/Ï */
- $"96C5 8D32 8E07 AA93 DA95 4D9B 60C6 2748" /* –Å2Ž.ª“Ú•M›`Æ'H */
- $"C8F4 8347 D2D9 2E35 75E4 333A 6494 B177" /* ÈôƒGÒÙ.5uä3:d”±w */
- $"C836 6E4F AF08 CDB0 0FA5 D565 A0EC 946F" /* È6nO¯.Í°.¥Õe ì”o */
- $"ED5C 03F6 E5DB FA4F D29A BF8F BC7F 12D8" /* í\.öåÛúOÒš¿¼..Ø */
- $"7730 8564 524D 4B31 F681 8C71 C5BC 1641" /* w0…dRMK1öŒqż.A */
- $"6988 F9CF 0385 B8EE 4C04 07DB 5AD2 531C" /* iˆùÏ.…¸îL..ÛZÒS. */
- $"48BA 3E6F E24E AF73 DB5E B729 A4BF 894A" /* Hº>oâN¯sÛ^·)¤¿‰J */
- $"782D E8F2 91C9 E628 322C F20C 2D0C 73DD" /* x-èò‘Éæ(2,ò.-.sÝ */
- $"F093 4ED7 63DF E121 E7B9 DB7E 530D E3BD" /* ð“N×cßá!ç¹Û~S.ã½ */
- $"3469 29CE 5768 BE0F 1E91 46B7 00A0 CC2E" /* 4i)ÎWh¾..‘F·. Ì. */
- $"183D 7D57 762C 062D 0707 EBA4 177D 73E8" /* .=}Wv,.-..ë¤.}sè */
- $"FA30 83A6 479B AA9A 702E B8FD 9B54 0FF3" /* ú0ƒ¦G›ªšp.¸ý›T.ó */
- $"8222 1EB0 4CDD 4CF7 F0AB 8972 B655 9426" /* ‚".°LÝL÷ð«‰r¶U”& */
- $"4EEE 3B88 A6D2 F8B9 6845 0467 D606 9DDD" /* Nî;ˆ¦Òø¹hE.gÖ.Ý */
- $"C547 A61F 71E7 5A8E 6B83 51FD B2C1 A732" /* ÅG¦.qçZŽkƒQý²Á§2 */
- $"A6EA A0AA 6D13 E80B 0EC4 5DF4 348F FF6E" /* ¦ê ªm.è..Ä]ô4ÿn */
- $"2289 CFB4 1AE2 18D1 340F B29B E1FF 16B1" /* "‰Ï´.â.Ñ4.²›áÿ.± */
- $"0F0F B5AD 260A 7FD9 B1F2 3D0C 404F 75A8" /* ..µ­&Â.Ù±ò=.@Ou¨ */
- $"E4DB 52EE 259B D762 E5E5 4FFD 22AC 4856" /* äÛRî%›×bååOý"¬HV */
- $"9C62 8DDB F5D8 58F8 4EC7 1110 30EC E0D8" /* œbÛõØXøNÇ..0ìàØ */
- $"7FED 0176 FEF2 53B3 75C6 34E1 A3A7 79DA" /* .í.vþòS³uÆ4ᣧyÚ */
- $"1FDC 42EC 83B2 F3EB 056C E41B 4E65 3699" /* .ÜB샲óë.lä.Ne6™ */
- $"4BD6 1AE3 85A9 DBF6 89D4 39B0 79F9 8877" /* KÖ.ã…©Ûö‰Ô9°yùˆw */
- $"161C 2CB5 3F3C 294B 8CA3 A6F6 556C 4CAD" /* ..,µ?<)KŒ£¦öUlL­ */
- $"A752 918D 7E61 BA54 02D2 CF5C AEBE 1A0B" /* §R‘~aºT.ÒÏ\®¾.. */
- $"B75C A9CA 9876 AB0B 6028 4D8E D46C E479" /* ·\©Ê˜v«.`(MŽÔläy */
- $"A186 EA09 496E 0935 04E2 4C25 FA18 270B" /* ¡†êÆInÆ5.âL%ú.'. */
- $"A054 DE1C 1BD8 A089 9D95 1335 E93C 7C21" /*  TÞ..Ø ‰•.5é<|! */
- $"435E A570 3C42 AA88 0075 BB20 20AF 90EC" /* C^¥p<Bªˆ.u» ¯ì */
- $"26F9 7E41 5CC7 2154 63A3 D965 075C 1A78" /* &ù~A\Ç!Tc£Ùe.\.x */
- $"2A13 753E DDD9 F846 467C EFC6 5308 2B46" /* *.u>ÝÙøFF|ïÆS.+F */
- $"5BD9 2BFF 5F26 72DB 523D D0FC CE49 47B0" /* [Ù+ÿ_&rÛR=ÐüÎIG° */
- $"D98B 4D36 1B60 7C3A 0707 F46A 8565 4CCB" /* Ù‹M6.`|:..ôj…eLË */
- $"5DC1 A50D C039 BF24 7418 78A7 6D4F DE55" /* ]Á¥.À9¿$t.x§mOÞU */
- $"1CB8 B787 158C 6C4D D840 920F 3130 7A92" /* .¸·‡.ŒlMØ@’.10z’ */
- $"1CF4 1B74 BC2B 8954 0A80 9636 BFC3 6330" /* .ô.t¼+‰T€–6¿Ãc0 */
- $"3E7F 7E4E A811 39F2 3D56 10D3 6A76 4E20" /* >.~N¨.9ò=V.ÓjvN */
- $"F646 5CD3 9166 D2D6 046F E398 A934 2D04" /* öF\Ó‘fÒÖ.o㘩4-. */
- $"2E01 C602 1332 8274 6AE2 D5C9 6226 30B3" /* ..Æ..2‚tjâÕÉb&0³ */
- $"07DB FDF3 B3BB 6C31 B162 FF63 0639 8E6F" /* .Ûýó³»l1±bÿc.9Žo */
- $"3501 A54C 1AA6 42EB EDE7 885E EE2F A6D9" /* 5.¥L.¦Bëíçˆ^î/¦Ù */
- $"B74A AE20 8FFB 6FCF A537 642D F17F A45E" /* ·J® ûoÏ¥7d-ñ.¤^ */
- $"EE37 DE05 7569 A81E F464 A35B 603B 4F40" /* î7Þ.ui¨.ôd£[`;O@ */
- $"D00F C3D2 D04A F943 AC3C 37E2 1B2B A1D3" /* Ð.ÃÒÐJùC¬<7â.+¡Ó */
- $"09D6 A92B F7CB B2FA 9FF7 97F2 83F9 BABC" /* ÆÖ©+÷˲úŸ÷—òƒùº¼ */
- $"E4BE F015 E804 97FC A16F 6E8B 9004 8424" /* ä¾ð.è.—ü¡on‹.„$ */
- $"04F7 1295 0A15 3C1A AA5D 6A75 372A 0BB4" /* .÷.•Â.<.ª]ju7*.´ */
- $"4849 DD4A 012F D969 23A9 FBA7 C3EB D29F" /* HIÝJ./Ùi#©û§ÃëÒŸ */
- $"5CE0 BD6F 8436 26BB 1B52 3BCB DCAA 0791" /* \à½o„6&».R;Ëܪ.‘ */
- $"02B3 8EC7 5A89 D402 C9FF 058E E2C8 AD72" /* .³ŽÇZ‰Ô.Éÿ.ŽâÈ­r */
- $"01BF D9B3 FA52 B000 0000 3090 8B4E 8809" /* .¿Ù³úR°...0‹NˆÆ */
- $"9E4F 59A7 8021 D030 169B 78E6 55B4 9FB8" /* žOY§€!Ð0.›xæU´Ÿ¸ */
- $"48A1 D2F4 BE8E A948 A89E 5E3E BE56 AE8C" /* H¡Òô¾Ž©H¨ž^>¾V®Œ */
- $"BF6C 6485 F435 4906 BE37 4D88 589A 85C0" /* ¿ld…ô5I.¾7MˆXš…À */
- $"5278 59EC 1FED 3652 3FE0 5229 0524 D686" /* RxYì.í6R?àR).$Ö† */
- $"1E5E 14D9 8C56 8742 9625 36BB 4674 0391" /* .^.ÙŒV‡B–%6»Ft.‘ */
- $"9647 FCC9 30C4 6D0D 5812 1271 E9C8 E89D" /* –GüÉ0Äm.X..qéÈè */
- $"7F9B 3420 0269 5F58 4554 F964 BDDA E9F3" /* .›4 .i_XETùd½Úéó */
- $"973A 5B5F 4C59 107B 2D9E 87CB D896 1F13" /* —:[_LY.{-ž‡ËØ–.. */
- $"AC52 F00D 3600 9104 3FF2 399A 0158 5153" /* ¬Rð.6.‘.?ò9š.XQS */
- $"139A A5C2 51CC D2C7 D082 C2A0 E35B FE05" /* .š¥ÂQÌÒÇЂ ã[þ. */
- $"06C9 DBB4 7036 39DB 80AF 4642 9F53 170C" /* .ÉÛ´p69Û€¯FBŸS.. */
- $"2856 38D5 0FA7 B562 4ED8 3BB5 B48A B1C8" /* (V8Õ.§µbNØ;µ´Š±È */
- $"B20B 4B42 4499 C5C1 242B A1BA CB74 D8F1" /* ².KBD™ÅÁ$+¡ºËtØñ */
- $"1CF1 241E 7A2A B847 111D 13DC CD3C 05A3" /* .ñ$.z*¸G...ÜÍ<.£ */
- $"024F 25B5 41E2 0A15 E1C4 1A0E A5D8 0742" /* .O%µAâÂ.áÄ..¥Ø.B */
- $"A359 2372 FD88 7447 1DB7 F766 5B7F E63E" /* £Y#rýˆtG.·÷f[.æ> */
- $"26B8 BC6E 7B72 E331 2BE1 73BD 04A0 E941" /* &¸¼n{rã1+ás½. éA */
- $"45EC 9039 8769 8BFF 1624 8D43 CA24 9D0D" /* Eì9‡i‹ÿ.$CÊ$. */
- $"A05B F467 7401 E777 0608 C4A6 A698 9A9B" /*  [ôgt.çw..Ħ¦˜š› */
- $"7066 11D3 606F 857E 18D8 D9D3 E226 38C0" /* pf.Ó`o…~.ØÙÓâ&8À */
- $"D89B 09D9 A2F1 0171 BAC9 D7BF AB2E BD58" /* Ø›ÆÙ¢ñ.qºÉ׿«.½X */
- $"7178 6CC2 608D 447D D92A 621C 1A82 B764" /* qxlÂ`D}Ù*b..‚·d */
- $"2ABE CBE8 07C0 E2A6 9B83 46A8 1109 FC87" /* *¾Ëè.À⦛ƒF¨.Æü‡ */
- $"F083 9598 26AE 8847 7E22 278D 9311 59FC" /* ðƒ•˜&®ˆG~"'“.Yü */
- $"2995 1D44 BA58 24BC 2A99 3946 0E00 9144" /* )•.DºX$¼*™9F..‘D */
- $"9113 0297 29E3 A7B5 B937 2D23 8405 86ED" /* ‘..—)㧵¹7-#„.†í */
- $"29F1 5254 6A8C 0FB8 4B13 F6C3 6028 2C14" /* )ñRTjŒ.¸K.öÃ`(,. */
- $"3B80 E317 225C 7A9B 405C 7E95 A2E4 311B" /* ;€ã."\z›@\~•¢ä1. */
- $"076A D7B8 A4B5 225A 1F29 FAA2 8239 D98F" /* .j׸¤µ"Z.)ú¢‚9Ù */
- $"071A F302 DA24 AE80 2AC0 D108 035D EA76" /* ..ó.Ú$®€*ÀÑ..]êv */
- $"2F7E 850F 9E87 6B19 B2F1 F1E5 F5B3 A5AF" /* /~….ž‡k.²ññåõ³¥¯ */
- $"35BB D867 8257 8A48 5E4F 6983 E22E 6DAD" /* 5»Øg‚WŠH^Oiƒâ.m­ */
- $"D361 1505 ECF2 3F3C DB84 1861 E5AB 6793" /* Óa..ìò?<Û„.aå«g“ */
- $"910D 8F56 6BB5 FD17 29DB 242A 6946 8022" /* ‘.Vkµý.)Û$*iF€" */
- $"7DAF 8120 02EB C840 3765 69EC BB8B F2FF" /* }¯ .ëÈ@7ei컋òÿ */
- $"6031 7BE4 EFC4 BECD 7BD7 CB0A 8B8C 75C2" /* `1{äïľÍ{×Ë‹Œu */
- $"E63A F4E4 B05B 1442 0CB1 BEBD E078 84F5" /* æ:ôä°[.B.±¾½àx„õ */
- $"3D95 24FA 952F 949B AD72 01B7 1CC7 4CA6" /* =•$ú•/”›­r.·.ÇL¦ */
- $"78C2 BA05 B757 517A 5CB1 A380 0C23 0680" /* xº.·WQz\±£€.#.€ */
- $"3113 0CBA 23B8 AA48 F832 B74F 997E 6E03" /* 1..º#¸ªHø2·O™~n. */
- $"D16C 577F 968F E9A4 73CA DA79 07B3 A5F1" /* ÑlW.–é¤sÊÚy.³¥ñ */
- $"2D20 C13D F821 62F9 41A0 A7AA 472A 368A" /* - Á=ø!bùA §ªG*6Š */
- $"28EE 7686 F7B4 D5CF 225E 004E 709F C4E8" /* (îv†÷´ÕÏ"^.NpŸÄè */
- $"FCBC B778 C976 A1E0 1968 1EF9 E998 2DC2" /* ü¼·xÉv¡à.h.ùé˜- */
- $"1693 C645 A4F5 787A 5B10 45C0 F010 8596" /* .“ÆE¤õxz[.EÀð.…– */
- $"A0F6 E8AA 1BAC C958 C0F6 101E 0C4D 2E61" /*  öèª.¬ÉXÀö...M.a */
- $"B76E 4019 58DD 3058 000C 2375 6EBC 6599" /* ·n@.XÝ0X..#un¼e™ */
- $"BEA3 9ADC 0002 F98F 24B3 B036 EA0D F2FD" /* ¾£šÜ..ù$³°6ê.òý */
- $"6823 E10A 59D7 5D0B F6C0 EFB2 7D9D A684" /* h#áÂY×].öÀï²}¦„ */
- $"3084 4AD6 92F2 BFB2 57CA 7294 FF2D 53C8" /* 0„JÖ’ò¿²WÊr”ÿ-SÈ */
- $"8D05 254E 2360 582F CE0C E209 240D FAB4" /* .%N#`X/Î.âÆ$.ú´ */
- $"C638 2103 7462 2AF1 5461 2036 09B4 294F" /* Æ8!.tb*ñTa 6Æ´)O */
- $"52A6 6553 F6B7 85F6 E77F A8B7 058C F201" /* R¦eSö·…öç.¨·.Œò. */
- $"19BA D75B 6612 0013 CFA6 F54F 8855 C000" /* .º×[f...ϦõOˆUÀ. */
- $"00BE 57DE C13B 77B0 AF81 F95D 8E88 7224" /* .¾WÞÁ;w°¯ù]Žˆr$ */
- $"002F C7BE 1D06 F540 58EF 1909 1D8F 037F" /* ./Ǿ..õ@Xï.Æ... */
- $"E973 290F 641E 8849 F996 EA66 D15C CA23" /* és).d.ˆIù–êfÑ\Ê# */
- $"C620 3090 94D8 F95F C58C 720B 7FFE 206C" /* Æ 0”Øù_ÅŒr..þ l */
- $"A3E0 EE49 AE89 4586 6617 FE87 4D7B D300" /* £àîI®‰E†f.þ‡M{Ó. */
- $"4CF6 E77F A882 E041 362F 710E AC03 D573" /* Löç.¨‚àA6/q.¬.Õs */
- $"69FF 7480 0018 484B 0D10 C800 0000 0C24" /* iÿt€..HK..È....$ */
- $"183F ADBF D900 0184 8481 E82C C758 1848" /* .?­¿Ù..„„è,ÇX.H */
- $"4840 6806 1212 B020 EA50 0818 484B F6E7" /* H@h...° êP..HKöç */
- $"7FA5 E774 6249 2F3D 5FF9 2FC0 0C24 1656" /* .¥çtbI/=_ù/À.$.V */
- $"1B91 8000 1846 D5F4 CA01 40C2 3F26 3D84" /* .‘€..FÕôÊ.@Â?&=„ */
- $"7B4A 811F 08D6 B47D 05C2 4402 D57B C1FC" /* {J..Ö´}.ÂD.Õ{Áü */
- $"7D32 E6FE 8125 F24E 514B 2820 7323 F96F" /* }2æþ%òNQK( s#ùo */
- $"B1F9 CDBD 94E4 C9BF 81D6 5A26 1C08 2131" /* ±ùͽ”äÉ¿ÖZ&..!1 */
- $"FF58 608E A4BB BEFD 703F C3EA B596 2AEA" /* ÿX`Ž¤»¾ýp?Ãêµ–*ê */
- $"48B2 2319 2F7A B9BC A14D EAB4 49CF 89E9" /* H²#./z¹¼¡Mê´Iωé */
- $"D312 5979 1910 6519 C45E 4B88 F709 D65D" /* Ó.Yy..e.Ä^Kˆ÷ÆÖ] */
- $"BF0F 86DC C883 8469 9757 7FC7 FB91 A851" /* ¿.†Üȃ„i—W.Çû‘¨Q */
- $"7834 0232 03F5 F552 B022 E799 431E 3FE8" /* x4.2.õõR°"ç™C.?è */
- $"BE7C A37B AAE1 D04F 9795 EA98 CAB0 6816" /* ¾|£{ªáÐO—•ê˜Ê°h. */
- $"047F 244A 2BD3 E0CF B862 B172 B1B3 F027" /* ..$J+Óàϸb±r±³ð' */
- $"6505 A5AA 6AB2 5F8E B98F 85CB D487 2603" /* e.¥ªj²_Ž¹…ËÔ‡&. */
- $"BDA4 4C6D 4B74 0A12 117F 6137 6A30 37CE" /* ½¤LmKtÂ...a7j07Î */
- $"0441 188C 63FC 46ED 5C9A B6A0 9012 6450" /* .A.ŒcüFí\š¶ .dP */
- $"A042 C4D3 8E69 8930 0797 25B3 B70D 5C62" /*  BÄÓŽi‰0.—%³·.\b */
- $"6A83 3964 5EF1 4A28 508D FF7F E847 17D0" /* jƒ9d^ñJ(Pÿ.èG.Ð */
- $"7C91 F4BC AA82 5462 99EF FF79 5A7A E45E" /* |‘ô¼ª‚Tb™ïÿyZzä^ */
- $"98FF 5B1E 90FE 7F80 9453 7AD1 4A63 8FFC" /* ˜ÿ[.þ.€”SzÑJcü */
- $"1B61 796C 4B90 7FE9 1959 752B 8579 95F8" /* .aylK.é.Yu+…y•ø */
- $"C5B9 7EC6 2D24 5185 1BCE 12D6 B418 B42C" /* Ź~Æ-$Q….Î.Ö´.´, */
- $"D40F 7AF7 657E 5184 9CAA 8834 B65C 4785" /* Ô.z÷e~Q„œªˆ4¶\G… */
- $"B934 7C3A 8000 0000 99F5 3F06 3790 6AF7" /* ¹4|:€...™õ?.7j÷ */
- $"0769 9D8E F19F 4FF3 EDE6 D059 B97C A1F0" /* .iŽñŸOóíæÐY¹|¡ð */
- $"0CE2 4FAF B846 8CCE 52E4 E898 D2E0 00A3" /* .âO¯¸FŒÎRäè˜Òà.£ */
- $"CB3D F2B1 E7F7 0C30 FF13 DB29 474C C00D" /* Ë=ò±ç÷.0ÿ.Û)GLÀ. */
- $"C6B7 6A2D 2F89 8E2F BDE7 F2BA C3DD 591B" /* Æ·j-/‰Ž/½çòºÃÝY. */
- $"CEDE C7DD 35BA 492C BB53 2AF6 7315 AC30" /* ÎÞÇÝ5ºI,»S*ös.¬0 */
- $"17D7 1C05 3AE4 4AB3 8D31 0DC9 7A9F 0A76" /* .×..:äJ³1.ÉzŸÂv */
- $"B4EE 95EE 6CB5 1C6A FE4F D27E 0966 CE51" /* ´î•îlµ.jþOÒ~ÆfÎQ */
- $"8607 E144 F4AD E999 5480 05FF 7FC2 C645" /* †.áDô­é™T€.ÿ.ÂÆE */
- $"D136 BB6E 89FA 9A2D F827 338F FEB9 B248" /* Ñ6»n‰úš-ø'3þ¹²H */
- $"23A6 377D 0E53 BBF3 D290 3AD8 F58B CE4C" /* #¦7}.S»óÒ:Øõ‹ÎL */
- $"24CA 8E49 76ED DA48 8856 904D C31F 305F" /* $ÊŽIvíÚHˆVMÃ.0_ */
- $"C441 7DAA 86D8 3FE1 5EA7 E20A CDBC 5F2A" /* ÄA}ª†Ø?á^§âÂͼ_* */
- $"35DC 107F DDE2 D88C 7B38 D700 4C54 9C81" /* 5Ü..ÝâØŒ{8×.LTœ */
- $"B8FD F39D 0F47 DE2B 6E17 7D4F E30F F60C" /* ¸ýó.GÞ+n.}Oã.ö. */
- $"0895 5694 3006 1211 EFEC D7F8 F743 3D43" /* .•V”0...ïì×ø÷C=C */
- $"6BA5 7C06 9025 9188 E369 0FC8 94CB F38E" /* k¥|.%‘ˆãi.È”ËóŽ */
- $"DF76 CA67 91C4 D786 F34F 1E56 332B 1404" /* ßvÊg‘Ä׆óO.V3+.. */
- $"B66B 2702 B13D 47B8 1FBD 38D7 A2DF 54EF" /* ¶k'.±=G¸.½8×¢ßTï */
- $"FD1C 00CC 5D05 5B28 3EBF 2FC7 7263 5880" /* ý..Ì].[(>¿/ÇrcX€ */
- $"0364 4A0B 982F 4A13 A55F 5D64 61D2 110C" /* .dJ.˜/J.¥_]daÒ.. */
- $"4319 318A 5BD6 94B7 DBA9 92F0 379B 0E87" /* C.1Š[Ö”·Û©’ð7›.‡ */
- $"4561 92A0 0000 0000 0000 12FE B897 0ABD" /* Ea’ .......þ¸—½ */
- $"B3C7 FEA8 AE43 B177 DA3F 2BA3 2D59 3358" /* ³Çþ¨®C±wÚ?+£-Y3X */
- $"9FAE 567F E53B 2877 9FFF 7FFF 7FFB 4B90" /* Ÿ®V.å;(wŸÿ.ÿ.ûK */
- $"C00D FEA3 7DF6 39C4 C825 2952 2C65 8FFF" /* À.þ£}ö9ÄÈ%)R,eÿ */
- $"7E91 DB49 1333 7DEC 6471 1E2E 394E A080" /* ~‘ÛI.3}ìdq..9N € */
- $"C1C9 0DD4 62C4 4FC9 E332 BC0D F9DD FEAB" /* ÁÉ.ÔbÄOÉã2¼.ùÝþ« */
- $"9D33 8271 2A01 8484 B009 6058 624E 2736" /* 3‚q*.„„°Æ`XbN'6 */
- $"529C A0F4 BCBB 846D 32FD 407C FA84 2D52" /* Rœ ô¼»„m2ý@|ú„-R */
- $"21DC 1623 210B 0410 4061 212D 0386 04FF" /* !Ü.#!...@a!-.†.ÿ */
- $"7F72 1DFF 6F83 6A31 2B6E 0A6B D1F1 9A43" /* .r.ÿoƒj1+nÂkÑñšC */
- $"F340 2C47 D413 DFAC FF76 46AC 4BDD 55F0" /* ó@,GÔ.߬ÿvF¬KÝUð */
- $"2F9A 3BC6 613E 2F69 F45C 08F3 3FCB F83F" /* /š;Æa>/iô\.ó?Ëø? */
- $"F7D8 DC38 0F99 4764 0309 0948 41C6 1212" /* ÷ØÜ8.™Gd.ÆÆHAÆ.. */
- $"293B 5EA3 BE56 F760 BAEF 61FF 43D4 2891" /* );^£¾V÷`ºïaÿCÔ(‘ */
- $"A380 672E FF7E 4B98 FBFB 1ACD 90F6 4A7E" /* £€g.ÿ~K˜ûû.ÍöJ~ */
- $"3B14 E9F4 B1B4 4120 E600 AF42 0056 B131" /* ;.éô±´A æ.¯B.V±1 */
- $"0310 EF4F EA97 E030 9090 A298 F514 CEFA" /* ..ïOê—à0¢˜õ.Îú */
- $"B200 0061 211A A495 FD76 5850 B8F7 1CF1" /* ²..a!.¤•ývXP¸÷.ñ */
- $"A979 F478 5BFF 7FFB E6D6 F6D8 03FF 7FFD" /* ©yôx[ÿ.ûæÖöØ.ÿ.ý */
- $"2A36 38D4 BA43 6280 D508 C4BD 735D 1C6F" /* *68ÔºCb€Õ.Ľs].o */
- $"2444 63E9 1C9A 969F 90A6 F34E D24D 94F2" /* $Dcé.š–Ÿ¦óNÒM”ò */
- $"1A09 F86A 2762 886F FBA0 96EA 1DC7 0364" /* .Æøj'bˆoû –ê.Ç.d */
- $"6192 A000 0000 0000 0000 0000 0061 BE9F" /* a’ ..........a¾Ÿ */
- $"2C25 5C25 4958 1428 AA60 5ABF 5551 6084" /* ,%\%IX.(ª`Z¿UQ`„ */
- $"D319 B739 1DC3 F92F 03A7 CF66 39CC 13BE" /* Ó.·9.Ãù/.§Ïf9Ì.¾ */
- $"100A 204E 9A06 CBD9 A8ED 9E4D CEED AE53" /* . Nš.ËÙ¨ížMÎí®S */
- $"023D B3BF AC07 F70E F7DD 2601 E2B4 B214" /* .=³¿¬.÷.÷Ý&.â´². */
- $"3B1D 74CD 0F60 7063 EFC5 24B8 3B0F DF21" /* ;.tÍ.`pcïÅ$¸;.ß! */
- $"2929 3755 A800 7D09 63D9 1548 5D89 6D22" /* ))7U¨.}ÆcÙ.H]‰m" */
- $"FAEF 37DC EB96 FF52 0018 EBDF 464C 8B34" /* úï7Üë–ÿR..ëßFL‹4 */
- $"DF85 2990 1CF1 7C84 CEDC D384 5003 D5A1" /* ß…).ñ|„ÎÜÓ„P.Õ¡ */
- $"2797 DBDC FDFB 0E8C 3703 470D 1FD5 B974" /* '—ÛÜýû.Œ7.G..Õ¹t */
- $"5A32 CF32 3D2A 0213 FDC8 8A0C B595 4840" /* Z2Ï2=*..ýÈŠ.µ•H@ */
- $"C240 6E40 D585 AF4C 004A F98F FC90 E5BB" /* Â@n@Õ…¯L.Jùüå» */
- $"D6AD 2A34 0A6E 1D4D 933D 2221 80B7 C8EF" /* Ö­*4Ân.M“="!€·Èï */
- $"7C61 2953 2991 F91A 61A3 B54E 56D2 77E1" /* |a)S)‘ù.a£µNVÒwá */
- $"1DB8 8B5F 5E9C 7D32 80A0 C23F BBE6 A2B2" /* .¸‹_^œ}2€ Â?»æ¢² */
- $"D49F C777 4BE6 FDA6 7B0F 2983 E19B 84FF" /* ÔŸÇwKæý¦{.)ƒá›„ÿ */
- $"4B7B 0DD6 A35E 60AD 632D D6D7 7030 0A9F" /* K{.Ö£^`­c-Ö×p0Ÿ */
- $"0FA2 0820 8451 9624 D0FF 1FB4 9B81 61CC" /* .¢. „Q–$Ðÿ.´›aÌ */
- $"591F 6D98 E1AF 16E4 AF42 1FE0 B7C7 30DF" /* Y.m˜á¯.ä¯B.à·Ç0ß */
- $"CFFC EC14 15A1 B07A 4E11 ED5F BDB3 FD2A" /* Ïüì..¡°zN.í_½³ý* */
- $"84B1 6901 4333 27BB 2E8C 3329 2064 A800" /* „±i.C3'».Œ3) d¨. */
- $"0001 2FDE 803E 817B C369 A30F FCF0 FF1D" /* ../Þ€>{Ãi£.üðÿ. */
- $"89A1 2FD7 FF71 B63D 19EC 98DE DFE2 D9B8" /* ‰¡/×ÿq¶=.ì˜ÞßâÙ¸ */
- $"9D39 1737 4722 2A89 D291 623B 279F BF0B" /* 9.7G"*‰Ò‘b;'Ÿ¿. */
- $"E8C0 8AF8 CBE4 0011 5D58 29AB 34B0 335C" /* èÀŠøËä..]X)«4°3\ */
- $"36B2 1383 D820 11B8 22DF 56E1 27EF 932D" /* 6².ƒØ .¸"ßVá'ï“- */
- $"30DE CC72 58E3 9BDD A88C 229A CBC8 A466" /* 0ÞÌrXã›Ý¨Œ"šËȤf */
- $"7C29 FDE8 E789 F28F 3258 A2DD 897B 1C6A" /* |)ýèç‰ò2X¢Ý‰{.j */
- $"C048 306A EEA7 3DF0 F8D4 BECC CDBD 9E43" /* ÀH0jî§=ðøÔ¾ÌͽžC */
- $"A29D 8052 478B 6470 79B7 B38A 5743 CAE7" /* ¢€RG‹dpy·³ŠWCÊç */
- $"0BD4 0F4A 23E1 4C85 39C9 DEB0 75AF 151E" /* .Ô.J#áL…9ÉÞ°u¯.. */
- $"45D5 1681 2BA4 74C9 13B5 746A E399 9467" /* EÕ.+¤tÉ.µtjã™”g */
- $"E6B9 D503 7F7C D57D 4D5F 7FC8 DD43 7D9B" /* æ¹Õ..|Õ}M_.ÈÝC}› */
- $"3CDC F9AD 167C 162B 4E6C 2110 DB2C DF34" /* <Üù­.|.+Nl!.Û,ß4 */
- $"AEED CCE4 05AC 4057 9829 B161 9CA0 8159" /* ®íÌä.¬@W˜)±aœ Y */
- $"A64F FD15 EC5A 4A51 CA6C FD10 9A25 4291" /* ¦Oý.ìZJQÊlý.š%B‘ */
- $"1E90 1FC2 3530 E0DB E4E6 232E CB64 AF95" /* ..Â50àÛäæ#.Ëd¯• */
- $"9494 656D D395 3D62 9EDA 2EC1 DB02 1FAA" /* ””emÓ•=bžÚ.ÁÛ..ª */
- $"6778 0FC0 C4A2 CCA8 EDC0 4DA8 F889 162F" /* gx.ÀĢ̨íÀM¨ø‰./ */
- $"03F9 A9C1 C635 1DAD 2E22 580B 0B2B 83E3" /* .ù©ÁÆ5.­."X..+ƒã */
- $"EC02 5552 3AA8 91BA 45AF 5439 4265 71F6" /* ì.UR:¨‘ºE¯T9Beqö */
- $"3E7A 4412 5DE5 1863 50E6 C0ED C470 3ED9" /* >zD.]å.cPæÀíÄp>Ù */
- $"0E3F 48BA 54C5 915E 03F0 D836 6429 2A67" /* .?HºTÅ‘^.ðØ6d)*g */
- $"B7FA 6AF9 069E 8E67 2848 B570 C3AC 7746" /* ·újù.žŽg(HµpìwF */
- $"EB48 0A2F 4BE4 8EB3 3F8F 791F 0646 DEDF" /* ëHÂ/K䎳?y..FÞß */
- $"316B EFDF 6FD8 C0B9 7319 CE94 8930 C6F6" /* 1kïßoØÀ¹s.Δ‰0Æö */
- $"6399 C4A9 79AD E967 4783 3F8D C538 3C15" /* c™Ä©y­égGƒ?Å8<. */
- $"E5B7 CE98 22B7 5333 A938 B26F 0E1E EF2E" /* å·Î˜"·S3©8²o..ï. */
- $"74B9 72EF 9D8A 80B7 FDC1 8334 A5F9 DCFB" /* t¹r·ýÁƒ4¥ùÜû */
- $"B891 BB38 373C 9BE8 59F4 6018 6E63 DA65" /* ¸‘»87<›èYô`.ncÚe */
- $"9B13 9DC8 28DB 3C15 0D2C 11FC 0E2D 7A0A" /* ›.È(Û<..,.ü.-z */
- $"F8FF 671F C3FF 7F8E 1210 C212 EA5A 5F0B" /* øÿg.Ãÿ.Ž..Â.êZ_. */
- $"9727 F770 25A5 236D 9789 75C7 4089 11DD" /* —'÷p%¥#m—‰uÇ@‰.Ý */
- $"E472 3865 B217 B946 CF22 5225 27DE 566D" /* är8e².¹FÏ"R%'ÞVm */
- $"6799 4F82 0D46 59F5 E466 F9E7 71C3 FA80" /* g™O‚.FYõäfùçqÃú€ */
- $"7826 E598 FF48 E181 6CA8 5A7E C354 0CAA" /* x&å˜ÿHál¨Z~ÃT.ª */
- $"B01C 9EC4 181F 849B 6A13 FB8D C477 70BD" /* °.žÄ..„›j.ûÄwp½ */
- $"F46B 278C 4467 B0CF 3E21 805E EF97 9696" /* ôk'ŒDg°Ï>!€^ï—–– */
- $"CBB9 E3F6 B62E DC26 001A 408F D7E2 07C3" /* ˹ãö¶.Ü&..@×â.à */
- $"C1A4 AD97 4235 8863 A088 1980 C505 6E1F" /* Á¤­—B5ˆc ˆ.€Å.n. */
- $"F392 0B24 B500 20DC 8295 5703 F9B9 FF70" /* ó’.$µ. Ü‚•W.ù¹ÿp */
- $"355C 9B8D BB49 898F 1AAB F65F 7D7E E28F" /* 5\›»I‰.«ö_}~â */
- $"4300 BDCC FB20 4F67 CA07 0CAE 3BAD AA36" /* C.½Ìû OgÊ..®;­ª6 */
- $"A4D8 3358 4176 1AD6 01FA 0450 0000 0042" /* ¤Ø3XAv.Ö.ú.P...B */
- $"7B49 E0E8 A7D8 4EA9 E1A5 597B DB80 BA6D" /* {Iàè§ØN©á¥Y{Û€ºm */
- $"8010 25EA 0A26 833F DE77 DBF7 78B9 564B" /* €.%êÂ&ƒ?ÞwÛ÷x¹VK */
- $"57B2 AF8C BC92 97D7 46A1 23C1 B595 A2EE" /* W²¯Œ¼’—×F¡#Áµ•¢î */
- $"F8A9 29FA 42C2 3557 6345 80B1 FCFD F322" /* ø©)úBÂ5WcE€±üýó" */
- $"E992 9262 A83F E43D B059 CB12 D425 FEF2" /* é’’b¨?ä=°YË.Ô%þò */
- $"9932 1BD8 C65C ED82 D05E E15C 5E9C 76B7" /* ™2.ØÆ\í‚Ð^á\^œv· */
- $"7C64 FCDB A247 D388 3CCB 86B5 C486 2261" /* |düÛ¢GÓˆ<ˆµÄ†"a */
- $"BFD1 7213 39C3 0D69 6AF0 2476 B711 7E91" /* ¿Ñr.9Ã.ijð$v·.~‘ */
- $"6B53 6A04 4F3C 2781 A090 3118 6C3F 49BA" /* kSj.O<' 1.l?Iº */
- $"B81A 3FEB D686 EFCE F487 8315 E33F 84DB" /* ¸.?ëÖ†ïÎô‡ƒ.ã?„Û */
- $"E2C9 F35F 28C5 10C4 FF7F FA4F E953 89FC" /* âÉó_(Å.Äÿ.úOéS‰ü */
- $"8B32 23C6 0D04 5E49 DADA F0FE BCA7 D2C9" /* ‹2#Æ..^IÚÚðþ¼§ÒÉ */
- $"5869 EAD4 F153 9BF5 A5EA 3298 CC8B 8721" /* XiêÔñS›õ¥ê2˜Ì‹‡! */
- $"F919 680B 3F8C 304A 2849 4970 41CF 0F60" /* ù.h.?Œ0J(IIpAÏ.` */
- $"76D9 5820 EF21 CD4A 205A 632F 7CC4 EFDF" /* vÙX ï!ÍJ Zc/|Äïß */
- $"33F3 CCA8 EDAF 405B 78E1 8F79 0F66 6573" /* 3ǫ́í¯@[xáy.fes */
- $"35A2 AD75 1E18 6018 AF23 7C9D A008 1A01" /* 5¢­u..`.¯#| ... */
- $"C5FE 69AA 2C8E D97E 244D D075 F213 0CC6" /* Åþiª,ŽÙ~$MÐuò..Æ */
- $"738F 4395 BBC0 5CB6 3ADC 3DA8 ACB8 E018" /* sC•»À\¶:Ü=¨¬¸à. */
- $"BA5B 13DB 0F6A CB18 DEAC 9749 F5B5 361D" /* º[.Û.jË.Þ¬—Iõµ6. */
- $"CF3A C107 9606 179F F4C7 F3DE CB0B 1F53" /* Ï:Á.–..ŸôÇóÞË..S */
- $"F27E 5D3C 11AB 66B4 8037 0644 AE98 19BF" /* ò~]<.«f´€7.D®˜.¿ */
- $"D564 973A 0CF2 C96F 56D4 5CB8 666F C68C" /* Õd—:.òÉoVÔ\¸foÆŒ */
- $"1E73 E515 8B33 75D2 D3B4 B3A3 8CDE DE0C" /* .så.‹3uÒÓ´³£ŒÞÞ. */
- $"DA37 A3DF 44D2 B57E 2DB2 E891 D36F CC23" /* Ú7£ßDÒµ~-²è‘ÓoÌ# */
- $"ADE8 45BC BB30 78D7 77BD D4A8 087F C83F" /* ­èE¼»0x×w½Ô¨..È? */
- $"E49A 6873 FAC4 C12B 0056 5E18 C3CB C2E9" /* äšhsúÄÁ+.V^.ÃËÂé */
- $"DCAE F0E8 A75F 18DD B8DD 1DCD B0F5 3A1C" /* Ü®ðè§_.ݸÝ.Í°õ:. */
- $"3816 51A8 0D93 00D0 6FF6 8F07 E4BE EDF9" /* 8.Q¨.“.Ðoö.ä¾íù */
- $"BF0E 6CAA 5384 5DF0 DF12 4CF4 E3B3 5D6C" /* ¿.lªS„]ðß.Lôã³]l */
- $"602A B6F1 C0E0 E520 B0D6 71FB 7996 4930" /* `*¶ñÀàå °Öqûy–I0 */
- $"23DD 3601 3653 C40D 1A64 DC2B D5C2 01C9" /* #Ý6.6SÄ..dÜ+ÕÂ.É */
- $"5002 6BBE 7338 81EE F87D 7687 0FE6 7CF9" /* P.k¾s8îø}v‡.æ|ù */
- $"BAB6 5B35 1A25 421C 5BBA 4D82 4E1F B1D4" /* º¶[5.%B.[ºM‚N.±Ô */
- $"1907 FF78 F534 4A16 7BB6 B598 51F6 E4D3" /* ..ÿxõ4J.{¶µ˜QöäÓ */
- $"A04B 1198 B926 CFAE FC03 22E3 8360 E696" /*  K.˜¹&Ï®ü."ãƒ`æ– */
- $"F546 62F9 7178 F327 E245 4520 8D17 41C4" /* õFbùqxó'âEE .AÄ */
- $"9EC6 EF8D 0924 9416 7901 CE87 5EBB 286D" /* žÆïÆ$”.y.·^»(m */
- $"53BF 09FA 41F6 5FBA 8F4C 79A8 75BA 277A" /* S¿ÆúAö_ºLy¨uº'z */
- $"7D42 642B 38EE 9A49 DEDB F1B3 80D0 E5D0" /* }Bd+8îšIÞÛñ³€ÐåÐ */
- $"2980 F797 E7D0 F90D 4B2F AFDD 4A69 3389" /* )€÷—çÐù.K/¯ÝJi3‰ */
- $"1418 EBD0 6DF0 E38D 6E2F D546 C1A8 C8DD" /* ..ëÐmðãn/ÕFÁ¨ÈÝ */
- $"8977 E053 9C26 053A CF69 97F9 7FB4 9000" /* ‰wàSœ&.:Ïi—ù.´. */
- $"0000 0115 0E67 B64C 0015 DD82 643D 6476" /* .....g¶L..Ý‚d=dv */
- $"ED28 6324 AD72 8124 1AF6 FB1B 21C9 0605" /* í(c$­r$.öû.!É.. */
- $"FAE6 04A6 31BF 6D67 FF7B B889 831A 4FFD" /* úæ.¦1¿mgÿ{¸‰ƒ.Oý */
- $"6BF5 F098 23AB A490 39F7 6AFC 3832 E2E1" /* kõð˜#«¤9÷jü82âá */
- $"11B2 ADB0 ECCA 83DE B4FF 3685 5106 75DE" /* .²­°ìʃ޴ÿ6…Q.uÞ */
- $"3047 28A0 EDBE AD29 17CD DA62 698B CE64" /* 0G( í¾­).ÍÚbi‹Îd */
- $"5999 2B8E BB7D C74F F009 A25D B2B5 BDD9" /* Y™+Ž»}ÇOðÆ¢]²µ½Ù */
- $"B852 BFFE 0B74 9C05 22D7 B0A3 2139 0979" /* ¸R¿þ.tœ."×°£!9Æy */
- $"5C29 BAE8 43DA F9E5 5383 AFD2 14EC 64AA" /* \)ºèCÚùåSƒ¯Ò.ìdª */
- $"442C CE71 74ED 5C27 4331 9374 AC77 47EE" /* D,Îqtí\'C1“t¬wGî */
- $"31AC 4C74 97BC 753C D5DC 3D8B F7D2 C612" /* 1¬Lt—¼u<ÕÜ=‹÷ÒÆ. */
- $"2399 F431 07A1 76CA DAE6 772B 309A C800" /* #™ô1.¡vÊÚæw+0šÈ. */
- $"9F2F D6DF A44C 48EB 853E 4140 A123 BCA3" /* Ÿ/ÖߤLHë…>A@¡#¼£ */
- $"D096 00DA 0822 DFB3 6887 B31F A18F 59BE" /* Ж.Ú."ß³h‡³.¡Y¾ */
- $"6B25 B5CF CFA3 8806 85B7 ED84 B20B CDA2" /* k%µÏÏ£ˆ.…·í„².Í¢ */
- $"A0C8 404B 3FFF 7FF3 3816 5BF0 A16B 85D0" /*  È@K?ÿ.ó8.[ð¡k…Ð */
- $"B87F E4BB 21F9 A3BB 9103 2944 434A 5789" /* ¸.ä»!ù£»‘.)DCJW‰ */
- $"E3EC B1E3 6F3E 154A 37E4 ACA6 4B02 6C5B" /* ãì±ão>.J7䬦K.l[ */
- $"D23A D4D4 83CE F291 CD7F 114F 5935 8EE0" /* Ò:ÔÔƒÎò‘Í..OY5Žà */
- $"17EA F0B3 1D93 BC5F 2CF8 511C E99F 21D8" /* .êð³.“¼_,øQ.éŸ!Ø */
- $"E286 EB17 6FC2 C34B 1110 6398 03BF CB08" /* â†ë.oÂÃK..c˜.¿Ë. */
- $"0018 4848 E24D 90A5 63F9 B1F8 6E20 EF6E" /* ..HHâM¥cù±øn ïn */
- $"25D5 858B 0AE4 2235 581B D4DA E01C B006" /* %Õ…‹Âä"5X.ÔÚà.°. */
- $"E5EB DE78 855B 19E7 4D80 DAC2 1E8F CB2B" /* åëÞx…[.çM€ÚÂ.Ë+ */
- $"0EC8 3FFF 7759 B569 0861 20CC 1D71 2121" /* .È?ÿwYµi.a Ì.q!! */
- $"71A7 FA20 B34B EAB3 4260 A827 6E91 2B3C" /* q§ú ³Kê³B`¨'n‘+< */
- $"5479 449A 3161 D24E 8489 C00A 18A6 3FEC" /* TyDš1aÒN„‰ÀÂ.¦?ì */
- $"61F2 4C86 23C1 85DB 6ECA 221D BCC2 C25F" /* aòL†#Á…ÛnÊ".¼ÂÂ_ */
- $"EFFF 7891 F475 0E20 DC0A 8F85 8208 4541" /* ïÿx‘ôu. ÜÂ…‚.EA */
- $"579B 5EE2 24C4 5C60 39B7 D9F1 ECFD 0F0C" /* W›^â$Ä\`9·Ùñìý.. */
- $"3719 72A8 A543 8BF5 94BF BF6C E6F7 E45A" /* 7.r¨¥C‹õ”¿¿læ÷äZ */
- $"C5CF 1FD7 32F5 2D70 041E 3641 2C46 E23D" /* ÅÏ.×2õ-p..6A,Fâ= */
- $"E072 6889 A892 A27F 44A8 564A 74A3 B421" /* àrh‰¨’¢.D¨VJt£´! */
- $"E1CC A0F3 50E2 2711 6919 76BE D84B D2FE" /* áÌ óPâ'.i.v¾ØKÒþ */
- $"AAED 2D64 7C8F 4C55 7FFF 7EFC 2CBF 05DE" /* ªí-d|LU.ÿ~ü,¿.Þ */
- $"25B2 001C 00EC 6D17 ED17 E559 9DFA F731" /* %²...ìm.í.åYú÷1 */
- $"B21A 7394 8B35 5948 BA4F 5858 020F FF7C" /* ².s”‹5YHºOXX..ÿ| */
- $"C89D 1CFA F89B 9F9C 841F 19EF D626 E6DE" /* È.úø›Ÿœ„..ïÖ&æÞ */
- $"DCC3 3148 38A0 C32F 898F BEC3 0AF3 318C" /* ÜÃ1H8 Ã/‰¾ÃÂó1Œ */
- $"5E09 119B 43C8 9FE6 73B2 F4B9 9789 4BFC" /* ^Æ.›CÈŸæs²ô¹—‰Kü */
- $"99A2 FF7F FF7A 4FD0 8C64 F459 410C 013C" /* ™¢ÿ.ÿzOÐŒdôYA..< */
- $"1C6C 85B5 1C8F D078 995D 714E 1C60 3090" /* .l…µ.Ðx™]qN.`0 */
- $"9058 77C4 BB80 5F57 1871 CA72 B2FD 0016" /* XwÄ»€_W.qÊr²ý.. */
- $"BAA7 F84F F4E9 ACDF F766 8CB4 475D 2F0B" /* º§øOôé¬ß÷fŒ´G]/. */
- $"37BC 18C8 6162 79C2 BDD7 8753 204B A536" /* 7¼.Èaby½ׇS K¥6 */
- $"9CBE 4972 316A BCB1 9442 4238 B88F 2F48" /* œ¾Ir1j¼±”BB8¸/H */
- $"7A45 5CD1 A306 3A23 5A78 354F CDB6 C0A5" /* zE\Ñ£.:#Zx5OͶÀ¥ */
- $"2A5C 19DA 0B0C CD84 8D85 D2B8 1DC9 059C" /* *\.Ú..Í„…Ò¸.É.œ */
- $"A8C4 8118 4848 9372 9372 566C 21E5 2665" /* ¨Ä.HH“r“rVl!å&e */
- $"D16C 6601 48A8 35CE 7FFF 7F19 B54E 7F04" /* Ñlf.H¨5Î.ÿ..µN.. */
- $"10EC 1AA3 13FF 4588 9722 A7AA B011 863C" /* .ì.£.ÿEˆ—"§ª°.†< */
- $"E4B1 717B 7C2D 21E6 267B 4B48 E790 FF76" /* ä±q{|-!æ&{KHçÿv */
- $"40CC F425 41CB 289F 809D 8170 A529 2EDA" /* @Ìô%AË(Ÿ€p¥).Ú */
- $"A105 B3AF FB44 7951 B87A 0091 5B53 5979" /* ¡.³¯ûDyQ¸z.‘[SYy */
- $"CDC6 5976 6393 34F2 21FF 7FFF 7FFF 7D43" /* ÍÆYvc“4ò!ÿ.ÿ.ÿ}C */
- $"4F4B C77F 73C7 0454 BE9C BE9C 282E 440E" /* OKÇ.sÇ.T¾œ¾œ(.D. */
- $"0608 A380 6121 2103 DBD2 250B 5D57 9159" /* ..£€a!!.ÛÒ%.]W‘Y */
- $"B69A 28CF E66A 154F F84F F4E9 99ED 48C4" /* ¶š(Ïæj.OøOôé™íHÄ */
- $"CA7E BE76 FC67 A7CD DC26 1C00 0184 8463" /* Ê~¾vüg§ÍÜ&...„„c */
- $"69A8 C0A9 127C 5830 CC3A 380A C742 E4DE" /* i¨À©.|X0Ì:8ÂÇBäÞ */
- $"06F5 7999 556D FD9F 268B 895F FF4B 7BB9" /* .õy™UmýŸ&‹‰_ÿK{¹ */
- $"C201 52B7 B483 0906 65EC 1848 4750 6F27" /* Â.R·´ƒÆ.eì.HGPo' */
- $"C86C 1F27 9108 6253 0416 4CD3 30E4 7F77" /* Èl.'‘.bS..LÓ0ä.w */
- $"0705 8420 83B6 BCB6 29DE B71E 8DC5 851A" /* ..„ ƒ¶¼¶)Þ·.Å…. */
- $"ABB0 83D8 F2E2 5113 55D2 AAF6 B3AB 7679" /* «°ƒØòâQ.UÒªö³«vy */
- $"49FE A1F8 6F30 0EC0 7D91 534C C78C DC5D" /* Iþ¡øo0.À}‘SLÇŒÜ] */
- $"5A42 CA06 37D8 E0ED 27FA 3E31 C849 D2BE" /* ZBÊ.7Øàí'ú>1ÈIÒ¾ */
- $"847C 0CCF 676F ACFE 91A3 0F62 B711 1897" /* „|.Ïgo¬þ‘£.b·..— */
- $"9DC3 8E37 3AF8 907E 0B69 1577 2856 AA36" /* ÃŽ7:ø~.i.w(Vª6 */
- $"FAC0 D56C 6686 0443 CA96 FDCD 051B 23A7" /* úÀÕlf†.CÊ–ýÍ..#§ */
- $"7DAC 8229 C5FC F840 103A 6407 49F7 6B32" /* }¬‚)Åüø@.:d.I÷k2 */
- $"254F 2B32 7FC1 F460 D5C0 5EE1 3046 612A" /* %O+2.Áô`ÕÀ^á0Fa* */
- $"1BC1 C143 7B76 B9EF ECCB 5EE9 8F0C 3F71" /* .ÁÁC{v¹ïìË^é.?q */
- $"E805 8B9B 17B7 9ECE C237 AF5C 0062 E61E" /* è.‹›.·žÎÂ7¯\.bæ. */
- $"DF6C C1F7 904E 4379 2A9C 92FC 1B04 00A8" /* ßlÁ÷NCy*œ’ü...¨ */
- $"F9D5 DB1B C4C6 9485 ABC2 1199 CCF2 0A47" /* ùÕÛ.ÄÆ”…«Â.™ÌòÂG */
- $"9693 C097 7AD0 449A FC53 DEC5 6EE8 6BF7" /* –“À—zÐDšüSÞÅnèk÷ */
- $"0D7D 4ED8 3426 DA7E ECF9 57ED 9252 9A6A" /* .}NØ4&Ú~ìùWí’Ršj */
- $"2B94 2614 1B6E A495 8261 4D5E DAEF 03FA" /* +”&..n¤•‚aM^Úï.ú */
- $"8A63 9496 E8AB A1A6 5B5C B03E E73E 2889" /* Šc”–è«¡¦[\°>ç>(‰ */
- $"D257 6C28 080A 68DC 226C 950F F55B E7CC" /* ÒWl(.ÂhÜ"l•.õ[çÌ */
- $"95AD FDA7 43EA 7489 A545 C0FC E9B0 2A25" /* •­ý§Cêt‰¥EÀüé°*% */
- $"719C EE06 9E5A 8FC0 D3B0 0C81 1EB0 C8C6" /* qœî.žZÀÓ°..°ÈÆ */
- $"25BD B383 33BD B80D D9A9 48F3 7539 D7D5" /* %½³ƒ3½¸.Ù©Hóu9×Õ */
- $"8021 5EBA 94A7 83A3 69FE 8179 9106 BC56" /* €!^º”§ƒ£iþy‘.¼V */
- $"14A4 427B 8C09 BACB 2FC9 B8F3 CAFA E51C" /* .¤B{ŒÆºË/ɸóÊúå. */
- $"9C07 9A69 033C 6159 163E 6ED8 259D 7AAB" /* œ.ši.<aY.>nØ%z« */
- $"D316 475C F6C7 BD0E 7972 4C59 DF3A D5B4" /* Ó.G\öǽ.yrLYß:Õ´ */
- $"44ED 7D01 B0FB 34D4 4C9C BC2D B8A6 5B65" /* Dí}.°û4ÔLœ¼-¸¦[e */
- $"134F 0C96 5CA1 21CC A249 F17D 4660 9835" /* .O.–\¡!Ì¢Iñ}F`˜5 */
- $"957C 7392 53A9 DE42 E650 604B 10E2 FF12" /* •|s’S©ÞBæP`K.âÿ. */
- $"B47A 044A 524A B8D3 60B5 A258 CEAB 55E8" /* ´z.JRJ¸Ó`µ¢XΫUè */
- $"5219 EC3E A9F6 0813 A2B4 930C EDE4 3BBE" /* R.ì>©ö..¢´“.íä;¾ */
- $"C0E3 7F93 1A3F 38EB 2DE3 492D A3BD FD00" /* Àã.“.?8ë-ãI-£½ý. */
- $"811C 530E 2FB8 9D68 2466 D288 EC29 9094" /* .S./¸h$fÒˆì)” */
- $"A3C7 2D32 0A25 BA73 2023 08CA C360 2C72" /* £Ç-2Â%ºs #.ÊÃ`,r */
- $"8BA9 516A 7081 F2FF 1E84 E1C2 F841 77CE" /* ‹©Qjpòÿ.„áÂøAwÎ */
- $"ABDF 6476 30A4 3018 F7F4 F3EE 1A5E 5DF0" /* «ßdv0¤0.÷ôóî.^]ð */
- $"CAAA AA77 C90D 52C4 6AA9 5755 33B9 1814" /* ʪªwÉ.RÄj©WU3¹.. */
- $"3528 E205 C379 648A E627 A23E D5DB 1CAE" /* 5(â.ÃydŠæ'¢>ÕÛ.® */
- $"4868 B7D4 F381 2534 1F48 2BCC 5211 3B0F" /* Hh·Ôó%4.H+ÌR.;. */
- $"9692 B002 4CFB 1F83 3628 D1EB 5416 0648" /* –’°.Lû.ƒ6(ÑëT..H */
- $"F0F0 B0F8 C7C7 6E92 8C54 6859 791B 7890" /* ðð°øÇÇn’ŒThYy.x */
- $"EBA3 BC74 5F3F C4AD 7C9D 6954 2D0C 15BF" /* 룼t_?Ä­|iT-..¿ */
- $"F699 82A6 4170 D2F1 02A5 7EF3 6061 C9CF" /* ö™‚¦ApÒñ.¥~ó`aÉÏ */
- $"C370 E129 F805 8CC8 C670 CBDC 2D44 D349" /* Ãpá)ø.ŒÈÆpËÜ-DÓI */
- $"F3E5 C5F9 357E 3DF2 CDF3 DC8A 1F13 5B2D" /* óåÅù5~=òÍóÜŠ..[- */
- $"C544 448D 1038 8293 4EEA 75A4 0738 7D9F" /* ÅDD.8‚“Nêu¤.8}Ÿ */
- $"C002 3D68 26D8 7B06 FB10 CCDF C4F3 5364" /* À.=h&Ø{.û.ÌßÄóSd */
- $"2342 154B F8FB 01ED 8893 9160 A3A0 B81D" /* #B.Køû.툓‘`£ ¸. */
- $"47A0 6C82 1CBA FAED 931D E025 BDFF 1535" /* G l‚.ºúí“.à%½ÿ.5 */
- $"CADF 68C5 41FD 3896 1AC9 F979 A885 F5AE" /* ÊßhÅAý8–.Éùy¨…õ® */
- $"EFBE C674 ED92 5FE9 E9AF FF52 D573 A6DD" /* ï¾Ætí’_éé¯ÿRÕs¦Ý */
- $"631B 27E4 62CB B76E 7020 EC65 75E2 DB6F" /* c.'äbË·np ìeuâÛo */
- $"0E10 980A 0EA3 2287 4CF8 D402 52B8 1491" /* ..˜Â.£"‡LøÔ.R¸.‘ */
- $"21C9 BC2B 48BC CBD4 464A C539 6CD5 28F1" /* !ɼ+H¼ËÔFJÅ9lÕ(ñ */
- $"CAE4 CA43 9CB8 B181 BF06 522B 4D19 8295" /* ÊäÊCœ¸±¿.R+M.‚• */
- $"05C8 D7CD 8CFA D3E7 7BC9 630C DCDD 7C7E" /* .È×ÍŒúÓç{Éc.ÜÝ|~ */
- $"E4C6 D7DC 5E38 67CC 5934 9E8D 9552 B837" /* äÆ×Ü^8gÌY4ž•R¸7 */
- $"53AE 6D39 FAB1 2EB6 886C 1855 26ED AD08" /* S®m9ú±.¶ˆl.U&í­. */
- $"1EBE 9570 EA2F DFFF 06F4 ABF3 4534 2831" /* .¾•pê/ßÿ.ô«óE4(1 */
- $"1AE2 0A99 2956 2A90 C2A4 58AC E49E F047" /* .â™)V*¤X¬äžðG */
- $"A9BA C394 E8F4 6427 7966 A79C 4269 9ADD" /* ©ºÃ”èôd'yf§œBišÝ */
- $"AD1D 1A7E 375C D3FB 8C25 0B6B 0460 5EB9" /* ­..~7\ÓûŒ%.k.`^¹ */
- $"416C AE82 DFC3 09DA 1F69 8796 6897 8CD0" /* Al®‚ßÃÆÚ.i‡–h—ŒÐ */
- $"3E1B FF7D 9AE9 7F6D 4E84 967C 674F CA41" /* >.ÿ}šé.mN„–|gOÊA */
- $"44C1 0575 93A9 2599 66D0 AB7B 6260 D32C" /* DÁ.u“©%™fЫ{b`Ó, */
- $"94AF 7FC8 82FD F692 92FE B6ED A660 750F" /* ”¯.È‚ýö’’þ¶í¦`u. */
- $"80A2 A8AA E6F6 7B9F E894 ED71 D223 6F4B" /* €¢¨ªæö{Ÿè”íqÒ#oK */
- $"A203 F64C 7560 DBB1 6F9E EE9F 2945 C994" /* ¢.öLu`Û±ožîŸ)EÉ” */
- $"BA00 D3D1 6414 A300 4296 670B 2350 CDD1" /* º.ÓÑd.£.B–g.#PÍÑ */
- $"DF61 29E8 EC17 87B6 BC62 B6BD 5F31 13B2" /* ßa)èì.‡¶¼b¶½_1.² */
- $"48A2 F723 53C7 6955 969B ED83 6A9B 1B06" /* H¢÷#SÇiU–›íƒj›.. */
- $"C7D0 2584 430B 8C52 D00A 736B D6FB AEDB" /* ÇÐ%„C.ŒRÐÂskÖû®Û */
- $"2BA1 5095 759B 0AFF 5138 58EF 3DC2 B14D" /* +¡P•u›ÂÿQ8Xï=±M */
- $"3B7D 62D0 DE12 CFEF 17A3 32C4 C79A C2DA" /* ;}bÐÞ.Ïï.£2ÄÇšÂÚ */
- $"6BA1 6478 B1D3 2278 3787 6C30 08FD 6095" /* k¡dx±Ó"x7‡l0.ý`• */
- $"FF65 1DF4 7606 34C3 B4EE E609 A3BF 7085" /* ÿe.ôv.4ôîæÆ£¿p… */
- $"8B3B 2C80 D860 6043 10A4 24B1 2D80 880D" /* ‹;,€Ø``C.¤$±-€ˆ. */
- $"671A 9A76 E1D4 2304 B4E0 9E47 129D 6316" /* g.šváÔ#.´àžG.c. */
- $"33DF C88C 3BB6 5232 475C D19D FA9B 3303" /* 3ßÈŒ;¶R2G\Ñú›3. */
- $"2956 D8B1 08A5 2735 CD4D F130 C700 DA0D" /* )Vر.¥'5ÍMñ0Ç.Ú. */
- $"7BAE 21FA FB1B 35A5 957E 0211 955B 25D0" /* {®!úû.5¥•~..•[%Ð */
- $"A3DD B72F 5BCD 8792 418E BCB6 C727 DD0F" /* £Ý·/[͇’AŽ¼¶Ç'Ý. */
- $"2D42 F031 2A73 C1F9 7964 B937 1E77 A757" /* -Bð1*sÁùyd¹7.w§W */
- $"D158 CB02 80D3 C310 E1C5 709C 5C69 7F04" /* ÑXË.€ÓÃ.áÅpœ\i.. */
- $"4476 F017 3FF2 B891 0160 D681 AEBC F8C9" /* Dvð.?ò¸‘.`Ö®¼øÉ */
- $"8F46 7922 4414 5CEE 0CA8 417B 33BB 5926" /* Fy"D.\î.¨A{3»Y& */
- $"B7A6 7094 6363 C5F2 9AD7 1751 2456 3B83" /* ·¦p”ccÅòš×.Q$V;ƒ */
- $"9BB0 0ECD 1420 6141 A097 DBF4 802A 2377" /* ›°.Í. aA —Ûô€*#w */
- $"CDAC EFE9 4A16 4B3C 5058 A5DC 1C40 169E" /* ͬïéJ.K<PX¥Ü.@.ž */
- $"3999 F0C2 C418 2E8F 0951 664A 7082 F49F" /* 9™ðÂÄ..ÆQfJp‚ôŸ */
- $"E576 B2B1 5918 E3EE 9B97 1686 6499 A572" /* åv²±Y.ãî›—.†d™¥r */
- $"B1F6 2F39 A798 6292 DE22 007B 60AD 1D94" /* ±ö/9§˜b’Þ".{`­.” */
- $"31BA 068D F15A 06DB 2654 6B52 F692 3C3A" /* 1º.ñZ.Û&TkRö’<: */
- $"0DA8 A74B 30F6 3852 76F0 A897 9086 FBD5" /* .¨§K0ö8Rv𨗆ûÕ */
- $"1C78 047E 7BF2 08EE 7B45 85C5 6ED5 AA43" /* .x.~{ò.î{E…ÅnÕªC */
- $"F423 8A4E 4111 C68E 172E DD87 AF9E BF19" /* ô#ŠNA.ÆŽ..݇¯ž¿. */
- $"D4D2 020C 6FD5 EE3F F0E8 289E 4E6C 0871" /* ÔÒ..oÕî?ðè(žNl.q */
- $"1187 D3F1 E458 94F5 4519 BF3C D239 D86C" /* .‡ÓñäX”õE.¿<Ò9Øl */
- $"17F1 8916 4206 2346 ACD8 1F08 9A44 0AB3" /* .ñ‰.B.#F¬Ø..šD³ */
- $"CEE6 441D 78D5 2909 4CEA 46F7 D6C6 D21A" /* ÎæD.xÕ)ÆLêF÷ÖÆÒ. */
- $"6D41 BB64 ADFF 6252 5A80 3556 C459 2845" /* mA»d­ÿbRZ€5VÄY(E */
- $"C05D C2C5 1F69 4087 0380 C0FF 61AA D5D1" /* À]ÂÅ.i@‡.€ÀÿaªÕÑ */
- $"E5C2 5FC0 CEF4 2D59 B4A3 6BA8 343E 184B" /* åÂ_ÀÎô-Y´£k¨4>.K */
- $"89CE 81FD AC96 C691 FDE5 F993 B9CB 6302" /* ‰Îý¬–Æ‘ýåù“¹Ëc. */
- $"B8EE 86B4 A2F7 19EA DAFD D511 B59F BBD2" /* ¸î†´¢÷.êÚýÕ.µŸ»Ò */
- $"5D4E F6A3 BC58 51D5 273F 2E2E 2B6A 2755" /* ]Nö£¼XQÕ'?..+j'U */
- $"38A3 CA29 BFAB D31D CD53 B29C 7418 40DB" /* 8£Ê)¿«Ó.ÍS²œt.@Û */
- $"FD56 1BF6 9350 5411 CF5C 8D26 B1FA 754F" /* ýV.ö“PT.Ï\&±úuO */
- $"E584 8277 6221 6866 257C 9FC9 65A5 6D93" /* å„‚wb!hf%|ŸÉe¥m“ */
- $"C524 B971 3F1D 34A0 BBF4 6B83 9722 CFAD" /* Å$¹q?.4 »ôkƒ—"Ï­ */
- $"8296 103F 53BB 1B22 8A84 2FAC 94DE 4994" /* ‚–.?S»."Š„/¬”ÞI” */
- $"2D31 56A5 DBCD B661 81D7 B360 4958 8FF5" /* -1V¥ÛͶa׳`IXõ */
- $"EB02 25A9 6386 8241 D936 A3CB AA88 9936" /* ë.%©c†‚AÙ6£Ëªˆ™6 */
- $"1698 4F59 765B 34EA 3741 D2D3 2DAC 854D" /* .˜OYv[4ê7AÒÓ-¬…M */
- $"366B C9A0 15F8 D2E6 7CCF 99EF A794 460C" /* 6kÉ .øÒæ|ϙ倫F. */
- $"934E C88B 2BF5 91F7 7BD1 3DC9 6ED3 91FE" /* “NÈ‹+õ‘÷{Ñ=ÉnÓ‘þ */
- $"E63B EDCC 3D4A CC1B AE5D 88D0 B241 20D1" /* æ;íÌ=JÌ.®]ˆÐ²A Ñ */
- $"AB6C 9FE2 E494 395E 8E3C 0EB0 1796 58CC" /* «lŸâä”9^Ž<.°.–XÌ */
- $"9791 D931 DB33 473E 003E 10CD B736 7295" /* —‘Ù1Û3G>.>.Í·6r• */
- $"DD81 B481 9A0A ED27 3C1E 6298 FD0D BDE0" /* Ý´šÂí'<.b˜ý.½à */
- $"11D6 8A21 79C1 DBB7 FEDC 6E48 8080 5ADB" /* .ÖŠ!yÁÛ·þÜnH€€ZÛ */
- $"E61D 9E0E E6A3 6D38 A028 4016 464D F534" /* æ.ž.æ£m8 (@.FMõ4 */
- $"D764 3AD7 55DF 3CAB 7B3D 12F5 9A8D DDCF" /* ×d:×Uß<«{=.õšÝÏ */
- $"6CCD 0387 C982 0FE9 D431 0FE3 E064 1700" /* lÍ.‡É‚.éÔ1.ãàd.. */
- $"1AAD F49E D6DE A939 8010 C91B 605B 4E0A" /* .­ôžÖÞ©9€.É.`[NÂ */
- $"FCBE ADE9 C17A EC1F 3990 9EB2 E6BF 92AA" /* ü¾­éÁzì.9ž²æ¿’ª */
- $"951C D27F A984 10A9 22DC 996E FF6E 12AE" /* •.Ò.©„.©"Ü™nÿn.® */
- $"DC03 5AB3 2CA0 8291 4174 C69E AE28 DBA8" /* Ü.Z³, ‚‘AtÆž®(Û¨ */
- $"38A8 FF12 67D3 F8A3 00D6 2A2E A564 CEFA" /* 8¨ÿ.gÓø£.Ö*.¥dÎú */
- $"0F00 4B44 62A7 CA9F F072 2821 DD3C 6A34" /* ..KDb§ÊŸðr(!Ý<j4 */
- $"926C 8F3C 1548 D31A 021F 2604 252D A929" /* ’l<.HÓ...&.%-©) */
- $"172B 8212 174F 2D2D CC7D DA15 F9A9 AD7E" /* .+‚..O--Ì}Ú.ù©­~ */
- $"59D3 7885 9215 C77B 6583 4D8F 3308 149C" /* YÓx…’.Ç{eƒM3..œ */
- $"270A 4508 21C9 A05B CDE9 BEF1 C18A 4B74" /* 'ÂE.!É [Íé¾ñÁŠKt */
- $"F07B 0DFE 007B E5AF D9AA CED7 8661 34C7" /* ð{.þ.{å¯ÙªÎ׆a4Ç */
- $"AA26 21AC D09C 6BAA EABB A7C4 486E 40A5" /* ª&!¬Ðœkªê»§ÄHn@¥ */
- $"C791 976A 1EC3 534F 84EC E6E9 7363 FF08" /* Ç‘—j.ÃSO„ìæéscÿ. */
- $"5B20 0E29 000C 5E8F 3339 6210 65CC FD34" /* [ .)..^39b.eÌý4 */
- $"76EB F1B2 76C6 5FDC C1A8 B0F5 53EE 103C" /* vëñ²vÆ_ÜÁ¨°õSî.< */
- $"50B0 650F 8459 9777 E890 E28A BB84 56B9" /* P°e.„Y—wè⊻„V¹ */
- $"0522 90F9 5B81 C982 979E E507 A4BC 26C3" /* ."ù[É‚—žå.¤¼&à */
- $"E356 F2A9 C0D1 BFF3 F882 EC0E 6AA9 CA0D" /* ãVò©ÀÑ¿óø‚ì.j©Ê. */
- $"4419 16FB 9BEF 947E F848 19BF 5CB6 EA4E" /* D..û›ï”~øH.¿\¶êN */
- $"C290 F254 020B 51DB 8094 4D05 E9A5 21A0" /* ÂòT..QÛ€”M.é¥!  */
- $"D3E6 84EA 5A3E 4380 650C B24F 31DA 209F" /* Óæ„êZ>C€e.²O1Ú Ÿ */
- $"F51A 9108 7912 32B0 52A6 A901 CADB A758" /* õ.‘.y.2°R¦©.ÊÛ§X */
- $"C00A D516 E462 35B4 C071 131A 0F01 9A95" /* ÀÂÕ.äb5´Àq....š• */
- $"9739 F131 0E5F 7FBA D8AD 925F 992C 0187" /* —9ñ1._.ºØ­’_™,.‡ */
- $"D97C 832B 847E 1148 0402 0449 FB25 D0F1" /* Ù|ƒ+„~.H...Iû%Ðñ */
- $"C1F8 2B8E CE97 D5A4 BEFE 7F0D E420 E43E" /* Áø+ŽÎ—Õ¤¾þ..ä ä> */
- $"801A 448D 9D61 D23C 5956 3DEB A1A6 0858" /* €.DaÒ<YV=롦.X */
- $"CD98 F32B 92E6 D960 C0E1 E542 294D 6FD3" /* ͘ó+’æÙ`ÀáåB)MoÓ */
- $"4234 37C9 3537 275F AC1E 936D 534A BF02" /* B47É57'_¬.“mSJ¿. */
- $"B742 8CAB BE88 E4FF 23DC D9EB 1FC4 9CF0" /* ·BŒ«¾ˆäÿ#ÜÙë.Äœð */
- $"C5D1 3F1D 5995 AD68 12E9 71B3 2100 AFB7" /* ÅÑ?.Y•­h.éq³!.¯· */
- $"CBF7 9ADB D5FF 48EE B1A2 AE4D E021 7C07" /* Ë÷šÛÕÿHî±¢®Mà!|. */
- $"5AD5 E94C A965 DFE8 B32A 23AB DE05 4FB1" /* ZÕéL©eßè³*#«Þ.O± */
- $"FDB7 ECC5 3611 73D9 B03C 399A D5F6 663D" /* ý·ìÅ6.sÙ°<9šÕöf= */
- $"0E78 0BEE 67D9 2F9D 0072 E938 509C 9779" /* .x.îgÙ/.ré8Pœ—y */
- $"6C64 03A1 B8C9 C1C0 2256 29EA 112C FB1C" /* ld.¡¸ÉÁÀ"V)ê.,û. */
- $"766C DF51 83B1 388F 902E EE03 337E 689A" /* vlßQƒ±8.î.3~hš */
- $"CA5A A9F0 09AF 3422 4115 D489 3FBD 22C1" /* ÊZ©ðƯ4"A.Ô‰?½"Á */
- $"4A4F 642A 0AC8 D01C 2950 18CA D441 780A" /* JOd*ÂÈÐ.)P.ÊÔAx */
- $"C929 A7FF 0AFA 956A A581 B590 9B7A 7D74" /* É)§ÿÂú•j¥µ›z}t */
- $"2084 3DC1 5D81 B12B DF9C 333D EFAD 0ADD" /* „=Á]±+ßœ3=ï­ÂÝ */
- $"3445 4F8C 132E F02F C2E7 E13F BE12 2F84" /* 4EOŒ..ð/Âçá?¾./„ */
- $"7FC3 D55F 876A BE1D 07F2 688D 774C FC3E" /* .ÃÕ_‡j¾..òhwLü> */
- $"A177 C3EA 4FE4 AFFE 1BFF 61D3 2F87 4BFC" /* ¡wÃêOä¯þ.ÿaÓ/‡Kü */
- $"946E 03F8 6CFF 06A3 FC28 FE13 BF0F 6B7E" /* ”n.ølÿ.£ü(þ.¿.k~ */
- $"1EB8 FC3B 47E1 ECEE EEDF F87D 51FF 07D5" /* .¸ü;Gáìîîßø}Qÿ.Õ */
- $"0BBB 87E1 D3FF 0779 FC3B 6FE1 D378 0DF0" /* .»‡áÓÿ.yü;oáÓx.ð */
- $"BD7C 29EB A2DD 17F2 6ADB E1DB 7F0D 97E1" /* ½|)ë¢Ý.òjÛáÛ..—á */
- $"E84D 7750 FC3E 906F C3E8 35DD 42ED AFE1" /* èMwPü>oÃè5ÝBí¯á */
- $"D33F 0E8D F86E 00F7 91DD 3D8B A94D D83C" /* Ó?.øn.÷‘Ý=‹©MØ< */
- $"B51B 129C 103F 899D B929 4724 C188 2C29" /* µ..œ.?‰¹)G$Áˆ,) */
- $"CE89 11F8 9065 1C37 E234 DFEF 60D7 3221" /* Ή.øe.7â4ßï`×2! */
- $"5343 F889 DCDB AFB3 6F20 F76A 31D9 986E" /* SCø‰ÜÛ¯³o ÷j1Ù˜n */
- $"A745 547E 6F18 076D A675 BA1A 1AAF 6558" /* §ET~o..m¦uº..¯eX */
- $"338A FF71 4707 0776 1B62 BCCC 89E5 4726" /* 3ŠÿqG..v.b¼Ì‰åG& */
- $"A7CB 8885 E07C DADC D741 3B1D D81F AB03" /* §Ëˆ…à|ÚÜ×A;.Ø.«. */
- $"2F84 F52D DFD5 7384 4649 7BA2 5AB1 14C8" /* /„õ-ßÕs„FI{¢Z±.È */
- $"3D8D B951 8183 C33A B08E 82CC EF1A F046" /* =¹QƒÃ:°Ž‚Ìï.ðF */
- $"5B62 C9E0 A926 F330 0A61 A30C 6194 7E1E" /* [bÉà©&ó0Âa£.a”~. */
- $"1EE9 3D0D 1ABE 5536 A026 8B32 830F C02F" /* .é=..¾U6 &‹2ƒ.À/ */
- $"3041 04B7 2C65 024D AC81 D2CC 03CA A08A" /* 0A.·,e.M¬ÒÌ.Ê Š */
- $"B105 F3F1 C365 6BCE 9876 A867 7DBA 63AF" /* ±.óñÃekΘv¨g}ºc¯ */
- $"0973 495F DCC1 3552 54BA 5BDB 618D C6C0" /* ÆsI_ÜÁ5RTº[ÛaÆÀ */
- $"91B8 4489 141B A7D3 F188 8A97 DAB0 8942" /* ‘¸D‰..§ÓñˆŠ—Ú°‰B */
- $"EA67 F235 E18A 871B 4B0C DAC6 9050 BA9C" /* êgò5ኇ.K.ÚÆPºœ */
- $"C432 95CE 13CA 93ED 4FD5 9495 377D C920" /* Ä2•Î.Ê“íOÕ”•7}É */
- $"C8A2 F997 5348 8890 91D5 0A23 50BF 3C37" /* È¢ù—SHˆ‘ÕÂ#P¿<7 */
- $"8372 7C96 32AA 1CD2 46BE 8220 C983 2A71" /* ƒr|–2ª.ÒF¾‚ Ƀ*q */
- $"7961 BF33 9590 C086 CCE9 578B 322E FB50" /* ya¿3•À†ÌéW‹2.ûP */
- $"CB68 6459 C127 EB9B E974 EF02 59F4 FF4D" /* ËhdYÁ'ë›étï.YôÿM */
- $"4525 1874 6A9F 99EB DFCC C1B1 72EA 9FA0" /* E%.tjŸ™ëßÌÁ±r꟠ */
- $"DE00 BBB9 D95F 36B9 406E 3CE0 3BCF 32B6" /* Þ.»¹Ù_6¹@n<à;Ï2¶ */
- $"8DC0 55D6 C6DA 3622 8A6E 63F6 28AE 08AC" /* ÀUÖÆÚ6"Šncö(®.¬ */
- $"03AC 288D 069A 750E CBBD 97D9 E42D BA93" /* .¬(.šu.˽—Ùä-º“ */
- $"E82A 4EB3 C008 CC7C B6A7 6F70 F1BC FDAA" /* è*N³À.Ì|¶§opñ¼ýª */
- $"1DF4 D2E4 3ECB 9702 444E 278F 6B50 F00E" /* .ôÒä>Ë—.DN'kPð. */
- $"C228 C132 E5E0 B4DE 93BF DBBD 2C85 ABF9" /* Â(Á2åà´Þ“¿Û½,…«ù */
- $"7FAD EC28 1D40 D390 5A2F 9B14 D348 8C76" /* .­ì(.@ÓZ/›.ÓHŒv */
- $"C04B 1173 BF19 8F50 7E3D 8311 BB79 FDA8" /* ÀK.s¿.P~=ƒ.»yý¨ */
- $"1FD4 24A9 5F59 8B76 709E 5C84 1902 8690" /* .Ô$©_Y‹vpž\„..† */
- $"AD49 334F 5AE8 E376 288C BDE7 EE13 FBDE" /* ­I3OZèãv(Œ½çî.ûÞ */
- $"7606 0135 6DB2 DCD9 F5B3 E7E2 B2B8 8BE1" /* v..5m²ÜÙõ³çⲸ‹á */
- $"1985 85D2 0EC1 5CCD BC74 D88B 7206 5075" /* .……Ò.Á\ͼtØ‹r.Pu */
- $"FB92 BF92 C5CB B6E3 024D EB71 D909 AF79" /* û’¿’Å˶ã.MëqÙƯy */
- $"DD82 BBF2 37F1 1193 74D0 373D 4043 C292" /* Ý‚»ò7ñ.“tÐ7=@CÂ’ */
- $"0B1D 4E8F 04F4 A035 451A 7DCB 02DB D77E" /* ..N.ô 5E.}Ë.Û×~ */
- $"DD1C 3667 1BA7 2584 C128 3835 4454 5C15" /* Ý.6g.§%„Á(85DT\. */
- $"5846 C7D1 4689 3D2A 1172 9BA8 9830 F037" /* XFÇÑF‰=*.r›¨˜0ð7 */
- $"0053 8FD6 4023 68C6 7122 CAC6 0325 5AF3" /* .SÖ@#hÆq"ÊÆ.%Zó */
- $"E104 A423 C5AE F551 6DF6 7B11 D5EB FD34" /* á.¤#Å®õQmö{.Õëý4 */
- $"DF67 C50C 737D 74D5 D5EC 7027 A2D8 C79A" /* ßgÅ.s}tÕÕìp'¢ØÇš */
- $"200D A972 A30A 509A C3DE 483F 8B53 D69C" /* .©r£ÂPšÃÞH?‹SÖœ */
- $"001F 47E9 BD2C 84EC DB83 B493 0326 DE6E" /* ..Gé½,„ìÛƒ´“.&Þn */
- $"336A 7C76 3225 8351 7B2D 37B5 D645 9866" /* 3j|v2%ƒQ{-7µÖE˜f */
- $"019E 6472 40C4 5853 3376 9D90 D3EA A727" /* .ždr@ÄXS3vÓê§' */
- $"07A1 A4B8 A32F 475A 22A2 059C AB5B F13E" /* .¡¤¸£/GZ"¢.œ«[ñ> */
- $"E2DF 5B3E E6B5 B27F 28AF A15F 400C 7D9F" /* âß[>æµ².(¯¡_@.}Ÿ */
- $"43ED 33D4 9B4D CB64 E550 5FED FC2F E485" /* Cí3Ô›MËdåP_íü/ä… */
- $"271E 2DB1 6AE5 6793 EFE8 FCC5 A784 4C95" /* '.-±jåg“ïèüŧ„L• */
- $"E488 B5AC A528 BACB 10FF 4ABD D554 E56B" /* 䈵¬¥(ºË.ÿJ½ÕTåk */
- $"F72E 8ED7 5E48 60A4 82D0 381F A2D4 625C" /* ÷.Ž×^H`¤‚Ð8.¢Ôb\ */
- $"9F80 2A63 5FD3 DD0C EDA8 3DE3 281E A65C" /* Ÿ€*c_ÓÝ.í¨=ã(.¦\ */
- $"88EA 1A96 626D DC03 79BE C4ED EA60 4FC5" /* ˆê.–bmÜ.y¾Äíê`OÅ */
- $"BB10 D9D5 99AF 0534 65C2 05AE 8D23 82B0" /* ».ÙÕ™¯.4eÂ.®#‚° */
- $"6FB7 881A 7BC5 0316 7A28 4B27 2763 A6C3" /* o·ˆ.{Å..z(K''c¦Ã */
- $"8FC7 073A 1391 81BB 707F 625D 355F B1DF" /* Ç.:.‘»p.b]5_±ß */
- $"A749 C3EE A157 EC1F 0F6C 70AB 1A36 5711" /* §IÃî¡Wì..lp«.6W. */
- $"C49B 1CA8 54A0 0FB9 6A2E 0F86 2E57 BC2F" /* Ä›.¨T .¹j..†.W¼/ */
- $"8CDD B76A F6DB 83F9 EEFF 4BF1 DE60 660E" /* ŒÝ·jöÛƒùîÿKñÞ`f. */
- $"BCBA 7D68 D5DE 8663 DF06 3F65 A981 38D7" /* ¼º}hÕÞ†cß.?e©8× */
- $"CC20 EBAE 6143 C79E D2F3 DCF4 FA0F 433E" /* Ì ë®aCÇžÒóÜôú.C> */
- $"6DFE 4C5F 032A F6DD DD11 F85F 5003 22CD" /* mþL_.*öÝÝ.ø_P."Í */
- $"C07E F1CC 40B9 8D61 825D 77C7 91A6 BD49" /* À~ñÌ@¹a‚]wÇ‘¦½I */
- $"2590 4BCD EB13 37A2 D5FA 2931 F311 9028" /* %KÍë.7¢Õú)1ó.( */
- $"6C02 96FC ACF5 1EA4 8E51 4BC9 FDE8 DFEF" /* l.–ü¬õ.¤ŽQKÉýèßï */
- $"C5A0 8082 7E0D C127 3A80 A65B 7989 CCEE" /* Å €‚~.Á':€¦[y‰Ìî */
- $"6F6A 8DDF FB5B 46A5 3757 7FC3 3EFD BC0A" /* ojßû[F¥7W.Ã>ý¼Â */
- $"8567 1CB0 3BE7 A153 D7CE 8F63 D2DC 8840" /* …g.°;ç¡S×ÎcÒ܈@ */
- $"D993 E028 0E86 AA99 3ADE CC55 A789 CFC8" /* Ù“à(.†ª™:ÞÌU§‰ÏÈ */
- $"D92B 9613 3850 B7B3 467A FA09 7D45 E174" /* Ù+–.8P·³FzúÆ}Eát */
- $"D351 3254 64A3 7FC5 0D8D 1EDB FEC9 3F05" /* ÓQ2Td£.Å..ÛþÉ?. */
- $"C3C2 264B ACB8 F3C3 1BFF 04A5 12CF C191" /* ÃÂ&K¬¸óÃ.ÿ.¥.ÏÁ‘ */
- $"8CA0 5985 E34C E583 A230 CD43 8602 BAAF" /* Œ Y…ãL僢0ÍC†.º¯ */
- $"1475 FCA7 B274 1314 051F AF06 089D 13B1" /* .uü§²t....¯...± */
- $"5C06 815E FAA5 6864 CECE D56A 127C 058B" /* \.^ú¥hdÎÎÕj.|.‹ */
- $"1859 E9E8 7A98 4299 3CFF 70CE C2DD 8676" /* .Yéèz˜B™<ÿpÎÂ݆v */
- $"1798 5F8E 9960 922E 9226 3F9B 5657 890F" /* .˜_Ž™`’.’&?›VW‰. */
- $"75BC FECF 6919 6701 D086 0EA5 26BA 8B78" /* u¼þÏi.g.І.¥&º‹x */
- $"7381 41FC 19AD 7201 BFD9 B3D3 2F00 1A1C" /* sAü.­r.¿Ù³Ó/... */
- $"E689 F3BC 5FC7 0418 66A2 5AEE 0374 DE30" /* æ‰ó¼_Ç..f¢Zî.tÞ0 */
- $"DC4B 70F1 ACC6 2BC6 06E9 461F E71B CD5E" /* ÜKpñ¬Æ+Æ.éF.ç.Í^ */
- $"2766 D533 884B A37F 7820 5CCA 3D60 1C3A" /* 'fÕ3ˆK£.x \Ê=`.: */
- $"8865 509F C1F0 86B6 9A91 0A52 426E CF1D" /* ˆePŸÁð†¶š‘ÂRBnÏ. */
- $"4B52 7AFE 9519 ECDB 9DD3 BFA1 80F7 50BD" /* KRzþ•.ìÛÓ¿¡€÷P½ */
- $"D2DD 6FAB F00D 3600 9104 37AC 81AA F9C3" /* ÒÝo«ð.6.‘.7¬ªùà */
- $"3933 A702 AC9C 42F1 4579 C5F2 CD99 165F" /* 93§.¬œBñEyÅòÍ™._ */
- $"2D84 FE8B D02C 055F F99C 1729 45C7 6B56" /* -„þ‹Ð,._ùœ.)EÇkV */
- $"EE73 818A 9940 BB46 1408 639B 9779 C805" /* îsŠ™@»F..c›—yÈ. */
- $"1B0B CC86 D42E E9BB 046D 0E93 7273 E00F" /* ..̆Ô.é».m.“rsà. */
- $"B7D5 D377 E0ED 2494 4623 5BDF C83C 54A5" /* ·ÕÓwàí$”F#[ßÈ<T¥ */
- $"6B6B D343 F20E AD4C B45C 2BF4 7C65 87A1" /* kkÓCò.­L´\+ô|e‡¡ */
- $"E2EA E2B7 FF17 F9A1 5606 D5A7 C113 F062" /* âêâ·ÿ.ù¡V.Õ§Á.ðb */
- $"D50E E647 922C 8746 7CBA 99C8 4400 979D" /* Õ.æG’,‡F|º™ÈD.— */
- $"3D09 19E7 3A84 E245 ED1F 1C14 3967 45CE" /* =Æ.ç:„âEí...9gEÎ */
- $"2B06 C383 F2A6 2CEE 02E6 A2A7 1821 0F3F" /* +.Ãò¦,î.梧.!.? */
- $"4057 F9E9 B830 94C7 65AA C396 6F97 2721" /* @Wùé¸0”ÇeªÃ–o—'! */
- $"F1AC 6AF7 6C6C 3F02 D2F1 343D 8B42 0F6F" /* ñ¬j÷ll?.Òñ4=‹B.o */
- $"E2D4 A7D8 7158 F033 C573 AD72 01B7 1CC7" /* âÔ§ØqXð3Ås­r.·.Ç */
- $"4CA6 78C2 BABD BB30 5E03 BDEE DF19 8240" /* L¦xº½»0^.½îß.‚@ */
- $"9521 A43A B142 2F42 3590 AD8C B9FD A409" /* •!¤:±B/B5­Œ¹ý¤Æ */
- $"9D77 38E7 B8F8 3BCD 4478 61C3 5768 0324" /* w8ç¸ø;ÍDxaÃWh.$ */
- $"4E55 4240 1E87 1F93 D0BA 6929 C235 7E76" /* NUB@.‡.“кi)Â5~v */
- $"F6E8 AA1B AF13 15FD EB95 2609 BE7D BFE8" /* öèª.¯..ýë•&ƾ}¿è */
- $"3E51 8F2E 4780 4EE6 891E F83D FF7D D1C3" /* >Q.G€Næ‰.ø=ÿ}Ñà */
- $"818F 28A2 2AC0 AD00 7F03 5781 2882 A44A" /* (¢*À­...W(‚¤J */
- $"6728 D9F6 E77F A883 C794 71AC 55E9 8112" /* g(Ùöç.¨ƒÇ”q¬Ué. */
- $"BF6F ECDA 9BD1 96B8 79AA A397 A6F2 C93F" /* ¿oìڛі¸yª£—¦òÉ? */
- $"3792 B8C4 8667 AAF4 659D 59F6 E77F A870" /* 7’¸Ä†gªôeYöç.¨p */
- $"24F1 5461 DB69 0F4C F8B3 F02A F6E7 7FA6" /* $ñTaÛi.Lø³ð*öç.¦ */
- $"26C9 5EDE 9BB6 A1C6 9467 854A 5327 BA38" /* &É^Þ›¶¡Æ”g…JS'º8 */
- $"F535 A01A B90A 9580 95A0 FE5C A623 DE0D" /* õ5 .¹Â•€• þ\¦#Þ. */
- $"6C3E BF23 66F2 9312 9490 EB88 1D63 7AF4" /* l>¿#fò“.”ëˆ.czô */
- $"9F5B 7F45 9078 3A5F CC36 7702 EAD5 FA4D" /* Ÿ[.Ex:_Ì6w.êÕúM */
- $"5F9D 258B 14A8 A235 6490 6B7D 2B05 42C3" /* _%‹.¨¢5dk}+.Bà */
- $"2A5A 791E 92C3 B1E8 B323 FF74 81FC B063" /* *Zy.’ñè³#ÿtü°c */
- $"4A31 CBBC 91E2 A64A F935 FE79 4C07 1376" /* J1˼‘â¦Jù5þyL..v */
- $"002A 4795 5221 70B2 005C 41F9 D631 126F" /* .*G•R!p².\AùÖ1.o */
- $"FF7F DF03 06BD 7214 71AB 4EF3 8EEA 0261" /* ÿ.ß..½r.q«NóŽê.a */
- $"D054 C087 EA15 CBD2 4645 2F9F 3600 4144" /* ÐTÀ‡ê.ËÒFE/Ÿ6.AD */
- $"5671 C61E D3CB 8B84 A60D B58E FB69 C71F" /* VqÆ.ÓË‹„¦.µŽûiÇ. */
- $"B09A EDD9 AAC0 6FBA D7FE 8C4D 8262 6C73" /* °šíÙªÀoº×þŒM‚bls */
- $"9F69 0E81 7581 1D52 FB27 C979 1597 69EA" /* Ÿi.u.Rû'Éy.—iê */
- $"F1DF E906 0B77 2E21 D31A 5CCD 9474 95A2" /* ñßé..w.!Ó.\Í”t•¢ */
- $"CB48 AB27 5F53 B82F 1638 16A4 87CD ED1F" /* ËH«'_S¸/.8.¤‡Íí. */
- $"20BC 2894 5EE1 C84C 1AC1 1158 0293 024E" /* ¼(”^áÈL.Á.X.“.N */
- $"1023 0E4F 9BD8 FA73 6E62 FF7F FD08 5797" /* .#.O›Øúsnbÿ.ý.W— */
- $"0788 A951 6DDA 2448 21D2 7FCA 20B4 E1BF" /* .ˆ©QmÚ$H!Ò.Ê ´á¿ */
- $"3262 89C7 5386 ACB1 8B89 6AC3 F907 1355" /* 2b‰ÇS†¬±‹‰jÃù..U */
- $"66D9 1E5A 5B54 19E9 2737 FF7C B8DF 1F5E" /* fÙ.Z[T.é'7ÿ|¸ß.^ */
- $"3592 B16D 6089 DE73 8F19 479D 626B 977D" /* 5’±m`‰Þs.Gbk—} */
- $"185E F7A3 AF62 AD92 E5AC 2F74 B991 F96F" /* .^÷£¯b­’å¬/t¹‘ùo */
- $"211F 5AE0 4C27 344F A9E1 C731 DB20 A0FF" /* !.ZàL'4O©áÇ1Û  ÿ */
- $"7FFF 7F2E 356F CC55 C6B8 C2C9 2AEF 2D31" /* .ÿ..5oÌUƸÂÉ*ï-1 */
- $"EFEB D878 C16F B1B1 3D47 240C 489C 7153" /* ïëØxÁo±±=G$.HœqS */
- $"E5F8 A5C8 6E2C 7650 AED0 C4B7 43EA 67B6" /* åø¥Èn,vP®ÐÄ·Cêg¶ */
- $"94E4 7274 CFEB 4CF3 FD3E 8065 B9CC 35A5" /* ”ärtÏëLóý>€e¹Ì5¥ */
- $"21B1 3804 AD98 4F8A 6FFC 50DA 014C 442B" /* !±8.­˜OŠoüPÚ.LD+ */
- $"AA41 1455 BD94 B366 A37D CA82 7FFC DE57" /* ªA.U½”³f£}Ê‚.üÞW */
- $"2EA9 98C2 5510 E51E 24CC 0428 4C83 1BBE" /* .©˜ÂU.å.$Ì.(Lƒ.¾ */
- $"0A46 A6DD 6963 D4CB 24E8 748B ED10 7B6D" /* ÂF¦ÝicÔË$èt‹í.{m */
- $"E61C 86C3 C80E 3030 FCE9 2263 C956 95A1" /* æ.†ÃÈ.00üé"cÉV•¡ */
- $"AED0 C4B1 D07C F701 9DA0 ED2C C401 BC1A" /* ®ÐıÐ|÷. í,Ä.¼. */
- $"9421 2D43 EF12 7494 8D46 CB82 3FE2 6439" /* ”!-Cï.t”FË‚?âd9 */
- $"6BDE C8CE 23B7 9D2E B6F9 DF4B C1A9 A145" /* kÞÈÎ#·.¶ùßKÁ©¡E */
- $"1512 85E6 30E6 98D1 AC22 EEBC 459C D841" /* ..…æ0æ˜Ñ¬"î¼EœØA */
- $"0A0F 1F31 2F75 7937 220F 7271 FE79 44A6" /* Â..1/uy7".rqþyD¦ */
- $"777E 1645 E0BA D980 0FFF 7D9F EC83 A930" /* w~.EàºÙ€.ÿ}Ÿìƒ©0 */
- $"D12B 216D 4D3F 4AD0 5EE9 DBC7 53D7 0A21" /* Ñ+!mM?JÐ^éÛÇS×Â! */
- $"2372 C608 6701 8AFA 8E33 4125 2B7E 38DA" /* #rÆ.g.ŠúŽ3A%+~8Ú */
- $"5990 99EE B1D0 B07C 9F9D 97DD D658 2C2A" /* Y™î±Ð°|Ÿ—ÝÖX,* */
- $"C7D6 4556 2AA7 297F ACBE 4802 B472 E76F" /* ÇÖEV*§).¬¾H.´rço */
- $"644F 2F11 17FF 7F9D CE1C 2989 7199 03B1" /* dO/..ÿ.Î.)‰q™.± */
- $"E719 2B3B 1131 C4CC 808B BC7A 26A4 479F" /* ç.+;.1ÄÌ€‹¼z&¤GŸ */
- $"4824 6486 E338 DB65 A502 454C C415 B8D0" /* H$d†ã8Ûe¥.ELÄ.¸Ð */
- $"7C77 7323 E381 5958 F415 95B9 142E 85F8" /* |ws#ãYXô.•¹..…ø */
- $"1742 E22F FF17 567B A195 DFF1 7EE0 8E40" /* .Bâ/ÿ.V{¡•ßñ~àŽ@ */
- $"431A B629 DDCE AED1 A925 9FCD 56B5 7945" /* C.¶)Ýήѩ%ŸÍVµyE */
- $"B8B9 77DF 732C CD1E 8137 2645 1135 9593" /* ¸¹wßs,Í.7&E.5•“ */
- $"E31C 333B 30E2 518D E202 A1E0 FEA6 C40E" /* ã.3;0âQâ.¡àþ¦Ä. */
- $"BB50 0174 C21D 0BFB 34C1 1A8D 8E5D FF77" /* »P.tÂ..û4Á.Ž]ÿw */
- $"909A 8111 3123 8200 AFC2 0525 13A1 C383" /* š.1#‚.¯Â.%.¡Ãƒ */
- $"5472 BA45 8D58 8818 E5CD 6FEA D858 47C5" /* TrºEXˆ.åÍoêØXGÅ */
- $"F5A0 7773 3C86 1CE8 9A67 FAA7 5726 643B" /* õ ws<†.èšgú§W&d; */
- $"1BF8 C2C1 E7AD D3CE E89B 97C4 0210 1FAE" /* .øÂÁç­ÓÎè›—Ä...® */
- $"9319 1F1F 7F89 0B76 5918 7EF8 9947 CF44" /* “....‰.vY.~ø™GÏD */
- $"6B5C 4B5D 5067 58A7 F35E CF39 7D01 C555" /* k\K]PgX§ó^Ï9}.ÅU */
- $"FCD3 E0F6 C1A4 9C8A 0B34 2D33 A20D F664" /* üÓàöÁ¤œŠ.4-3¢.öd */
- $"C174 CCE8 CAA1 C45F 2974 101B 86E7 68FD" /* ÁtÌèÊ¡Ä_)t..†çhý */
- $"D6FE 8FE9 AC95 5D3D DE38 1829 E3B9 37FE" /* Öþ鬕]=Þ8.)ã¹7þ */
- $"5008 F383 21C4 4D57 AE92 9F94 A9BB 3A76" /* P.óƒ!ÄMW®’Ÿ”©»:v */
- $"705F 8D2D 889C EB93 FD2B 05C5 89F2 500E" /* p_-ˆœë“ý+.ʼnòP. */
- $"4220 A486 F348 D466 4D62 E368 540A 1D25" /* B ¤†óHÔfMbãhTÂ.% */
- $"AF7C A9EF 43CC E423 16FC 6EE5 C407 DDAE" /* ¯|©ïCÌä#.ünåÄ.Ý® */
- $"EB28 23D2 3FDE 40EF 2ED1 D53A B87B 9C40" /* ë(#Ò?Þ@ï.ÑÕ:¸{œ@ */
- $"80A2 77EF CC8F D34E C33F 7BB4 4748 E4A6" /* €¢wïÌÓNÃ?{´GHä¦ */
- $"B177 05FF 085F CBF9 F1A0 8CA7 4200 32AC" /* ±w.ÿ._Ëùñ Œ§B.2¬ */
- $"7B87 A517 EA04 C96C F9A3 C6ED 5FFF 7FED" /* {‡¥.ê.Élù£Æí_ÿ.í */
- $"D5EB F835 3E15 6882 AED1 72BF B42C 87DE" /* Õëø5>.h‚®Ñr¿´,‡Þ */
- $"8111 0F7A 5DA6 CFEA 79A7 9174 89E8 E637" /* ..z]¦Ïêy§‘t‰èæ7 */
- $"7E56 B53E 9987 2013 8F1A 06A5 07A2 1856" /* ~Vµ>™‡ ...¥.¢.V */
- $"FE30 E259 128A 968B 881F E88D 8566 98D7" /* þ0âY.Š–‹ˆ.è…f˜× */
- $"C815 C397 64E8 9FAC 059A 5922 C863 F220" /* È.×d蟬.šY"Ècò */
- $"EC2A 4AF8 5DB2 A77D FC6A 3AC1 357E D5CC" /* ì*Jø]²§}üj:Á5~ÕÌ */
- $"142B 85B0 FEE0 2579 D845 CDFD F507 4C58" /* .+…°þà%yØEÍýõ.LX */
- $"D86A F299 0BBC A0A8 39A4 03D9 2144 6B3E" /* Øjò™.¼ ¨9¤.Ù!Dk> */
- $"6D67 242B 0FEB B6F4 79CB 58ED 2338 DB9F" /* mg$+.ë¶ôyËXí#8ÛŸ */
- $"6EC7 1626 0FDD 0C77 1E00 2AE4 8B46 F39C" /* nÇ.&.Ý.w..*ä‹Fóœ */
- $"6268 EE5F FF49 B5C8 30E7 9859 E163 A9D4" /* bhî_ÿIµÈ0ç˜Yác©Ô */
- $"C50F BC0C 46BB BBC7 9FFF 7D54 E81B 8936" /* Å.¼.F»»ÇŸÿ}Tè.‰6 */
- $"A032 72E8 6576 5FEA 9A3F A5A9 9E58 B9C2" /*  2rèev_êš?¥©žX¹Â */
- $"A089 A039 5695 766F 3295 A1FF 7F5F FBDB" /*  ‰ 9V•vo2•¡ÿ._ûÛ */
- $"A3FD 1F1F 76AD 6787 B4D0 D1A5 E4EA 72F8" /* £ý..v­g‡´ÐÑ¥äêrø */
- $"0276 0C35 EC34 65A8 000A CA35 6AAE 1800" /* .v.5ì4e¨.ÂÊ5j®.. */
- $"99CA 1B65 F56D 6C3B DF33 AB08 94A3 15CF" /* ™Ê.eõml;ß3«.”£.Ï */
- $"C9B8 D32E 35D7 D32D 57E6 86D2 A5BE 2B3A" /* ɸÓ.5×Ó-Wæ†Ò¥¾+: */
- $"4535 2C10 41FE FDA9 E202 3927 BC4F 5F90" /* E5,.Aþý©â.9'¼O_ */
- $"E637 311C DB00 E394 09F3 005B 7DB3 0DFE" /* æ71.Û.ã”Æó.[}³.þ */
- $"9F1F CAA4 DD03 B381 8330 AB38 E13B 2F9C" /* Ÿ.ʤÝ.³ƒ0«8á;/œ */
- $"3DB5 01C5 100A 5D16 5C8D 792C FA0E 1A85" /* =µ.Å.Â].\y,ú..… */
- $"E3FF 467A 6333 E4F1 F27C 9E2B 161E 18F0" /* ãÿFzc3äñò|ž+...ð */
- $"3F30 9C2C 631D BE74 4B7F 6E21 3FBC 404E" /* ?0œ,c.¾tK.n!?¼@N */
- $"E063 4152 D02D 68E4 869C E7E9 E4E6 4E95" /* àcARÐ-h䆜çéäæN• */
- $"3A66 1FDA 1145 DFB4 0796 9F97 503C E2C9" /* :f.Ú.Eß´.–Ÿ—P<âÉ */
- $"7F49 D644 1290 98BD 8EA0 2FA1 CF00 E383" /* .IÖD.˜½Ž /¡Ï.ム*/
- $"C003 7BFE D79B FF62 A38E 2C39 A64D 19FF" /* À.{þ×›ÿb£Ž,9¦M.ÿ */
- $"6A9D 976A 994B 6626 4F4D 7DC8 F0CA EDB7" /* j—j™Kf&OM}ÈðÊí· */
- $"F99E 21E2 36B4 3AAB E787 C6A2 1783 F623" /* ùž!â6´:«ç‡Æ¢.ƒö# */
- $"8755 1F66 AFBC 2959 6E6E 2E61 AC85 2198" /* ‡U.f¯¼)Ynn.a¬…!˜ */
- $"9978 EDFD 334C F0D6 7F76 9AF2 47AF 5E4B" /* ™xíý3LðÖ.všòG¯^K */
- $"805C 54D3 5F2A 16C5 6675 C288 B44F F851" /* €\TÓ_*.Åfuˆ´OøQ */
- $"1CE9 9F21 BF10 92B9 2366 5D69 AE8E 9989" /* .éŸ!¿.’¹#f]i®Ž™‰ */
- $"36A6 F9E6 75A7 0D47 C8B5 8727 0138 2BFA" /* 6¦ùæu§.Gȵ‡'.8+ú */
- $"5C4A 649C 123C 225E 2CEC 2007 5016 3F11" /* \Jdœ.<"^,ì .P.?. */
- $"B8FF 60CB 7150 EBFD DFED 147E 0A98 E096" /* ¸ÿ`ËqPëýßí.~Â˜à– */
- $"6B76 3AF0 39A5 5BF2 880C E857 174C 8735" /* kv:ð9¥[òˆ.èW.L‡5 */
- $"ACF6 E4B7 3477 6293 FF7C 8515 A8DE 4E73" /* ¬öä·4wb“ÿ|….¨ÞNs */
- $"8E37 8A0C 4384 0CF3 FA01 15F5 9639 ED05" /* Ž7Š.C„.óú..õ–9í. */
- $"C86B 28A0 C331 14BC 2817 FE9B F96A D60D" /* Èk( Ã1.¼(.þ›ùjÖ. */
- $"EBCB 14DA FF7F FF47 8A61 A2C7 F01F 10B7" /* ëË.Úÿ.ÿGŠa¢Çð..· */
- $"3DAF B01C B484 F55D 457E E3EC CC41 95DE" /* =¯°.´„õ]E~ãìÌA•Þ */
- $"097E 8117 F77F FEFB A490 8B96 1300 2B37" /* Æ~.÷.þû¤‹–..+7 */
- $"19FA E04C 4188 E9F6 8950 0668 B082 8FD8" /* .úàLAˆéö‰P.h°‚Ø */
- $"0B7D 6C32 4DBF F84F F4E9 ACAF 719A DC43" /* .}l2M¿øOô鬯qšÜC */
- $"9F8D A53E DF1A BDB0 AAA7 3267 9C2D 357A" /* Ÿ¥>ß.½°ª§2gœ-5z */
- $"9CA7 1AE1 59C4 F467 83D3 308B 004A 42C2" /* œ§.áYÄôgƒÓ0‹.JB */
- $"909B F979 41CE AB25 C6D1 9FE9 46E1 E837" /* ›ùyAΫ%ÆÑŸéFáè7 */
- $"7ADF FF72 225E 4472 D323 F55C BE19 1E50" /* zßÿr"^DrÓ#õ\¾..P */
- $"BF94 6787 CADB F576 300A 054B 0A2D E9B2" /* ¿”g‡ÊÛõv0Â.KÂ-é² */
- $"5C15 DB84 E735 F76D 5477 D8A7 28AF FF7A" /* \.Û„ç5÷mTwا(¯ÿz */
- $"7EB8 06F8 4FF4 E999 ED48 02C4 F111 F61D" /* ~¸.øOôé™íH.Äñ.ö. */
- $"8A6C 1CC6 AE54 94E4 8C5D 7655 4ECC 205F" /* Šl.Æ®T”äŒ]vUNÌ _ */
- $"DBF9 1BA7 83CC 52E9 E9C9 52A4 1151 7DE4" /* Ûù.§ƒÌRééÉR¤.Q}ä */
- $"051B E140 3FC0 D60B 0C11 663F 98A9 8B53" /* ..á@?ÀÖ...f?˜©‹S */
- $"776E BD8D 7678 AD62 ACEE 033F D134 B61E" /* wn½vx­b¬î.?Ñ4¶. */
- $"F86D 3384 AAE7 9074 F7CF 4509 F9B3 4F30" /* øm3„ªçt÷ÏEÆù³O0 */
- $"F32D 840F 1DDA E6B1 BDD4 951F 2379 F890" /* ó-„..Úæ±½Ô•.#yø */
- $"530A E915 A228 D3D8 B188 C692 2767 D628" /* SÂé.¢(ÓرˆÆ’'gÖ( */
- $"12F8 3FFA BA23 F76B 1D92 1FC1 EA73 30FC" /* .ø?úº#÷k.’.Áês0ü */
- $"CE72 0CA5 6695 6326 F93B B52F B9D4 F6F0" /* Îr.¥f•c&ù;µ/¹Ôöð */
- $"FF07 727B 80F9 EBFC 2176 788C 333F 4137" /* ÿ.r{€ùëü!vxŒ3?A7 */
- $"E82C D066 6088 A8EA 168F 40EA F1EE BDE8" /* è,Ðf`ˆ¨ê.@êñî½è */
- $"C023 75BA 66F2 335A 98C0 31A8 2137 7A7B" /* À#uºfò3Z˜À1¨!7z{ */
- $"DA0F 3962 D4B3 3E6E A5A1 3A19 5EED 48A7" /* Ú.9bÔ³>n¥¡:.^íH§ */
- $"7617 DE46 D178 BC48 D85D 7821 DFEC B30D" /* v.ÞFÑx¼HØ]x!ßì³. */
- $"F84F B7CD 80ED 55C7 9E1A F58D 7085 F625" /* øO·Í€íUÇž.õp…ö% */
- $"F564 3BF5 A09E B353 4E45 2F0B FC02 ECFD" /* õd;õ ž³SNE/.ü.ìý */
- $"539F 529C A652 34F1 C0CC BC04 FCE0 2C7D" /* SŸRœ¦R4ñÀ̼.üà,} */
- $"A8A9 9E67 79E9 ADE4 ABEE BFF6 4793 1B91" /* ¨©žgyé­ä«î¿öG“.‘ */
- $"413A 4302 7FB5 190C CB09 0DC9 3B33 E18D" /* A:C..µ..ËÆ.É;3á */
- $"DDAB 23C5 FABA 5DC1 554F C940 B964 7F6A" /* Ý«#Åúº]ÁUOÉ@¹d.j */
- $"A781 2032 BF9E 0262 7C99 CD96 9251 9FB6" /* § 2¿ž.b|™Í–’QŸ¶ */
- $"1C69 9141 7A13 3022 DE48 DA68 C959 A0B5" /* .i‘Az.0"ÞHÚhÉY µ */
- $"0F3A F19A 9301 5051 5855 9D7B 5173 EE47" /* .:ñš“.PQXU{QsîG */
- $"2B0D DB30 28CC 5E41 46F1 E79F 90B3 AB2A" /* +.Û0(Ì^AFñ石«* */
- $"CAEA 6128 10E1 2CC0 DDC2 EBF1 26F1 E1DC" /* Êêa(.á,ÀÝÂëñ&ñáÜ */
- $"EB87 87ED 55F3 827C A066 D932 FCF7 B134" /* 뇇íUó‚| fÙ2ü÷±4 */
- $"8BC9 CC70 B38C B019 8372 EA60 7C36 4D38" /* ‹ÉÌp³Œ°.ƒrê`|6M8 */
- $"F82F 16C2 2390 A91B 203A 8EBE D0EC E278" /* ø/.Â#©. :Ž¾Ðìâx */
- $"7AC4 8493 A217 6AC3 B85A 470D D74A B91D" /* zÄ„“¢.jøZG.×J¹. */
- $"0180 7BAB 4088 5671 6268 5B4A 54FE C179" /* .€{«@ˆVqbh[JTþÁy */
- $"1600 7677 830B 0E81 EEB2 6124 33F8 DBBD" /* ..vwƒ..î²a$3øÛ½ */
- $"1B35 D1F9 0568 3891 0ECB A836 5A86 9636" /* .5Ñù.h8‘.˨6Z†–6 */
- $"9F87 052F 0D66 8AA3 3362 1651 9B33 9057" /* Ÿ‡./.fŠ£3b.Q›3W */
- $"5B98 05EB 23CE 099F 2358 444E 0D64 A9F9" /* [˜.ë#ÎÆŸ#XDN.d©ù */
- $"A569 7D56 A50D 6256 69AF BDD9 7847 D651" /* ¥i}V¥.bVi¯½ÙxGÖQ */
- $"73E2 F76E F277 58DC BFB9 7B8E 593C 0E97" /* sâ÷nòwXÜ¿¹{ŽY<.— */
- $"3C4E 507D FA6C 7984 FAC8 6C42 6882 78AC" /* <NP}úly„úÈlBh‚x¬ */
- $"E40D B7A2 4E43 998B 1C29 D7C6 B7BA 58C9" /* ä.·¢NC™‹.)×Æ·ºXÉ */
- $"3503 114B 86B8 CB5D B605 832D 98FE 0257" /* 5..K†¸Ë]¶.ƒ-˜þ.W */
- $"FB50 8CA0 43D4 71BE E330 1584 5983 668F" /* ûPŒ CÔq¾ã0.„Yƒf */
- $"735C 2448 3B30 82E4 1932 5BF8 129F FE38" /* s\$H;0‚ä.2[ø.Ÿþ8 */
- $"749D 01ED DAFC 95B9 375D BBCB 60D9 FC58" /* t.íÚü•¹7]»Ë`ÙüX */
- $"0796 AEFC 2337 F89E 01F5 48BD 0BAF A61F" /* .–®ü#7øž.õH½.¯¦. */
- $"3EC4 C092 DC6A 584C AAAF 1A9F A20F CEA4" /* >ÄÀ’ÜjXLª¯.Ÿ¢.Τ */
- $"884B 2DB6 09F4 F51B 546F CD71 F4D3 6452" /* ˆK-¶Æôõ.ToÍqôÓdR */
- $"B6E5 3EFF 66F8 0D60 D916 F755 1348 E250" /* ¶å>ÿfø.`Ù.÷U.HâP */
- $"D8E2 6858 B424 B84B D59A 6885 24D3 D845" /* ØâhX´$¸KÕšh…$ÓØE */
- $"692F 4313 B616 584F 7419 0661 0064 C281" /* i/C.¶.XOt..a.d */
- $"A873 131C 5296 042B 1FD5 3EED BFC2 659E" /* ¨s..R–.+.Õ>í¿Âež */
- $"C4C7 2720 8002 28DD 141A BBE7 99F8 028F" /* ÄÇ' €.(Ý..»ç™ø. */
- $"8262 0577 5240 EB9A F866 2901 B75B 3FED" /* ‚b.wR@ëšøf).·[?í */
- $"9E78 9071 83FD 02BC FCDE 2135 42D1 F184" /* žxqƒý.¼üÞ!5BÑñ„ */
- $"309D F47E DF10 F797 4268 120A D377 04A4" /* 0ô~ß.÷—Bh.ÂÓw.¤ */
- $"2998 099E CA35 66AD FB20 8C14 1E0E 714E" /* )˜ÆžÊ5f­û Œ...qN */
- $"B9A7 70EE 5BA0 7A18 FC16 97EB 1A98 CB6C" /* ¹§pî[ z.ü.—ë.˜Ël */
- $"4B5D AC5B 3DC2 2062 E74A 18F2 0A76 6085" /* K]¬[=Â bçJ.òÂv`… */
- $"EF50 1C2F FE23 117A ED22 7BE8 0231 BC71" /* ïP./þ#.zí"{è.1¼q */
- $"707C 6736 BC3C 38AA 81C2 66B6 DCE5 13E9" /* p|g6¼<8ªÂf¶Üå.é */
- $"3076 C7AD 8C4B A962 C37E 4605 CDC0 8247" /* 0vÇ­ŒK©bÃ~F.ÍÀ‚G */
- $"190C 41CD 6923 8D00 BC94 5B5F E2AB 443B" /* ..AÍi#.¼”[_â«D; */
- $"3C5A 7FF6 213C 9E2D 9224 70B1 EA9B 7D36" /* <Z.ö!<ž-’$p±ê›}6 */
- $"E7EA 0D03 CB32 7413 AB26 CB30 1B56 CBDE" /* çê..Ë2t.«&Ë0.VËÞ */
- $"3C31 361D 24E2 F441 4D78 7825 1DA0 0C14" /* <16.$âôAMxx%. .. */
- $"5C84 B112 6FC1 77DB 42CA 7791 960B 9F09" /* \„±.oÁwÛBÊw‘–.ŸÆ */
- $"980A 5629 54C0 EC82 889A B0E3 38F4 E734" /* ˜ÂV)TÀ삈š°ã8ôç4 */
- $"FA91 D5CD 2C8F 43CD 5629 3DAD 81DA 5E0A" /* ú‘ÕÍ,CÍV)=­Ú^Â */
- $"C008 712F EAD3 2486 4CD2 C7BA 0FA9 BBD3" /* À.q/êÓ$†LÒǺ.©»Ó */
- $"6AC2 A912 7736 5A33 CC96 9EDC 9C5A 3084" /* j©.w6Z3Ì–žÜœZ0„ */
- $"C826 A3FB 0661 ED4B 9689 A921 22AB 2399" /* È&£û.aíK–‰©!"«#™ */
- $"6F2A 4A78 A5F8 A059 BE4B 7DFF 5D41 1A31" /* o*Jx¥ø Y¾K}ÿ]A.1 */
- $"E688 045C BD1E D1DB 7C5B 6B89 5C22 3CAF" /* æˆ.\½.ÑÛ|[k‰\"<¯ */
- $"F133 FF14 13A2 9A3F 6E42 54EB 5082 9F25" /* ñ3ÿ..¢š?nBTëP‚Ÿ% */
- $"7C07 6BA6 25EA A890 3560 E915 B058 CB68" /* |.k¦%ê¨5`é.°XËh */
- $"3601 4B07 ACE7 EC8A 2897 F908 D405 455E" /* 6.K.¬çìŠ(—ù.Ô.E^ */
- $"5EDD 427E 791A EA3D 6ACE 3BC0 0D43 731A" /* ^ÝB~y.ê=jÎ;À.Cs. */
- $"C9C6 8C03 BD83 6F85 EF75 7246 2F8E 1CFB" /* ÉÆŒ.½ƒo…ïurF/Ž.û */
- $"8DC9 2726 593F 1D87 A822 399F 9770 324C" /* É'&Y?.‡¨"9Ÿ—p2L */
- $"6ABF 38B9 E89E B2F5 D575 E7DB C449 63CF" /* j¿8¹èž²õÕuçÛÄIcÏ */
- $"EBE1 07BB 80A4 C099 6A15 9A47 96F3 8C8D" /* ëá.»€¤À™j.šG–óŒ */
- $"49E1 1F78 2119 9460 CA7A F257 EDA1 104B" /* Iá.x!.”`ÊzòWí¡.K */
- $"5C68 0E57 188C 62B0 FBE3 CF4F 5251 6525" /* \h.W.Œb°ûãÏORQe% */
- $"CB59 5E3D C6F4 6B04 5B2D 1ED2 3BE1 02BB" /* ËY^=Æôk.[-.Ò;á.» */
- $"7207 12AA BFEC 50F4 83FE 2797 121B 3D14" /* r..ª¿ìPôƒþ'—..=. */
- $"DA23 BE41 D647 E5CA DD2D CD48 8C4D A094" /* Ú#¾AÖGåÊÝ-ÍHŒM ” */
- $"B1A9 4ED5 4735 8818 C4F1 597D 3211 5D12" /* ±©NÕG5ˆ.ÄñY}2.]. */
- $"D96B 5A38 AB9A 7E89 C503 13B0 8354 C887" /* ÙkZ8«š~‰Å..°ƒTȇ */
- $"F766 96F0 EDAE C6B6 17B4 E9A4 9230 C2F5" /* ÷f–ðí®Æ¶.´é¤’0Âõ */
- $"029D 3D72 A1CF 5BB9 E975 DBFF 06DC F5B2" /* .=r¡Ï[¹éuÛÿ.Üõ² */
- $"686F 667B AD3E 1D8D 5BE4 0D6A 2CD7 DE66" /* hof{­>.[ä.j,×Þf */
- $"BE8E C996 696D 58EC 6CFE 40AD 3C95 EAF1" /* ¾ŽÉ–imXìlþ@­<•êñ */
- $"4591 1D62 836E D2E3 4CD8 E4A6 F4F4 C456" /* E‘.bƒnÒãLØä¦ôôÄV */
- $"A70C B3BE AA22 A188 DAB5 D3F7 4B7B 865D" /* §.³¾ª"¡ˆÚµÓ÷K{†] */
- $"4D89 77E6 99A6 46C9 14BA 25E1 55C5 ADBD" /* M‰w晦FÉ.º%áUÅ­½ */
- $"4379 96AF 26DA A399 F009 AE75 248B 0285" /* Cy–¯&Ú£™ðÆ®u$‹.… */
- $"B370 5704 6429 C8AF 0BD3 A332 90B2 8351" /* ³pW.d)ȯ.Ó£2²ƒQ */
- $"F715 32C9 347B EADE 2EBB 9D97 BF95 0C5A" /* ÷.2É4{êÞ.»—¿•.Z */
- $"9203 1EC5 7A8E CF46 C28C 39A2 DE74 C656" /* ’..ÅzŽÏFÂŒ9¢ÞtÆV */
- $"F0BF 3ABF CE5F BE71 B7CE 2FF3 F41B F3EA" /* ð¿:¿Î_¾q·Î/óô.óê */
- $"8BE7 B07E AB17 4F87 74FC FDE8 EF9F BF3F" /* ‹ç°~«.O‡tüýè? */
- $"A9EB F3D5 3F3E 83BE 7BAF EA5F E0FE 7ADF" /* ©ëóÕ?>ƒ¾{¯ê_àþzß */
- $"E7A7 7F9D 3FE7 3BF9 FA77 F9FA 3FF9 F7C7" /* ç§.?ç;ùúwùú?ù÷Ç */
- $"E7E9 871D E84F CFE8 83FC FE85 E3BB E7E7" /* çé‡.èOÏèƒüþ…ã»çç */
- $"AFFE 7D7F F9F5 57E7 AF70 6F9D 2DF3 9ED7" /* ¯þ}.ùõWç¯po-óž× */
- $"C81E F903 FEAB 8EF9 F50D F254 3F3E A4D1" /* È.ù.þ«Žùõ.òT?>¤Ñ */
- $"DD53 F3F6 F37E 7EC9 4775 1BE4 77F9 EEBF" /* ÝSóöó~~ÉGu.äwùî¿ */
- $"9ED1 F9DC 00F7 91DD 3D8B A94D D83C 797F" /* žÑùÜ.÷‘Ý=‹©MØ<y. */
- $"4243 1F04 D29C 94E6 FA35 A9C7 9C1C 0762" /* BC..Òœ”æú5©Çœ..b */
- $"AA92 7DF8 65D6 B16D 30C6 E3F2 22D5 8971" /* ª’}øeÖ±m0Æãò"Õ‰q */
- $"F890 651C 37E3 1F4A 29A4 6637 D7AE 7CB9" /* øe.7ã.J)¤f7×®|¹ */
- $"14C7 D06B 2595 45F8 89DC DBAF B284 6ADA" /* .ÇÐk%•Eø‰ÜÛ¯²„jÚ */
- $"E4DB 9D25 F76C CDA3 EB7E 1B5A 4264 8145" /* äÛ%÷lÍ£ë~.ZBdE */
- $"547E 6F18 076D A675 BA1A 1AB1 0BF1 AEB6" /* T~o..m¦uº..±.ñ®¶ */
- $"C8C2 AAE0 489F 4E11 7F77 336A 41A4 C050" /* ȪàHŸN..w3jA¤ÀP */
- $"D19E AE10 BD35 C5EC DA71 BDEF A017 C32D" /* Ñž®.½5ÅìÚq½ï .Ã- */
- $"CB15 0C8E 0B75 C179 FB84 FDF2 DD5D C21F" /* Ë..Ž.uÁyû„ýòÝ]Â. */
- $"56A5 397D C437 A82F 65F9 2E68 A785 0AF3" /* V¥9}Ä7¨/eù.h§…Âó */
- $"B9F0 7781 E6B8 ACFA 09DC B57D 6317 B29B" /* ¹ðw測úÆܵ}c.²› */
- $"C754 09FC 3635 9854 0DA1 A3BE D3EE CF40" /* ÇTÆü65˜T.¡£¾ÓîÏ@ */
- $"4BE4 A4D9 07C4 D65E 3887 C8A7 CD3A 83F5" /* Kä¤Ù.ÄÖ^8‡È§Í:ƒõ */
- $"DFA8 10A6 BB6D B811 852D 3877 8782 1E66" /* ߨ.¦»m¸.…-8w‡‚.f */
- $"AF11 43B8 CA3A 6146 3657 AFE0 B314 36CB" /* ¯.C¸Ê:aF6W¯à³.6Ë */
- $"8E1C 272D ED4B 634C AABA 0207 6A1A E2E3" /* Ž.'-íKcLªº..j.âã */
- $"C500 C0A4 894A BAD8 C9A1 0AE7 AC8D 750C" /* Å.À¤‰JºØÉ¡Âç¬u. */
- $"7D84 FBCC DB2E EE05 B04A 002B B383 46DE" /* }„ûÌÛ.î.°J.+³ƒFÞ */
- $"C18D 5BBD B442 9E88 BBB2 89CC 0EBA CF5A" /* Á[½´Bžˆ»²‰Ì.ºÏZ */
- $"5616 DDAB ED7B 4C2E 1C82 0C9D 4820 C0E8" /* V.Ý«í{L..‚.H Àè */
- $"1C4E 39A5 9041 9E33 A20A A73D 821A 238A" /* .N9¥Až3¢Â§=‚.#Š */
- $"3B24 14B9 D9A6 95AA F5B0 13C1 8CFD 790F" /* ;$.¹Ù¦•ªõ°.ÁŒýy. */
- $"33CB 82D3 FE12 0F27 F309 7453 05E0 DF8F" /* 3Ë‚Óþ..'óÆtS.àß */
- $"AAE8 F77A 31BA 0118 43E1 7AE7 69DC 5D12" /* ªè÷z1º..CázçiÜ]. */
- $"BD53 9858 EA6D D8D3 174C FE4C F487 3CCF" /* ½S˜XêmØÓ.LþLô‡<Ï */
- $"9098 7872 8FC3 EBAC 4C76 F503 6915 A1B3" /* ˜xrÃë¬Lvõ.i.¡³ */
- $"5FF8 81CD E13D D511 AAB8 5C7B 1376 C87F" /* _øÍá=Õ.ª¸\{.vÈ. */
- $"2DA1 557D 2053 3341 CC15 418C 0911 5378" /* -¡U} S3AÌ.AŒÆ.Sx */
- $"5FFE 324E 1412 2046 B049 3A77 69B7 417F" /* _þ2N.. F°I:wi·A. */
- $"AC17 B8B0 7FDA 6D19 59F0 DD68 8A88 E55A" /* ¬.¸°.Úm.YðÝhŠˆåZ */
- $"8098 0888 3714 713A 1D17 BB8D F01C 6005" /* €˜.ˆ7.q:..»ð.`. */
- $"8F2E 3D20 2753 1BB4 9BE3 DFD1 709F 99EB" /* .= 'S.´›ãßÑpŸ™ë */
- $"DFCC C1B1 717B 7FA3 52BB C12D E6B7 24D2" /* ßÌÁ±q{.£R»Á-æ·$Ò */
- $"F448 F23D C196 1BAA D61B F422 41B4 D620" /* ôHò=Á–.ªÖ.ô"A´Ö */
- $"466D 45F3 06F6 F631 3E88 5CDE F7F6 BC6F" /* FmEó.öö1>ˆ\Þ÷ö¼o */
- $"789C D06C 02CC 2E71 B6B0 03D2 297B BFCD" /* xœÐl.Ì.q¶°.Ò){¿Í */
- $"8C21 67AD CEE0 DB53 5749 A676 690C 11E3" /* Œ!g­ÎàÛSWI¦vi..ã */
- $"5AD2 905C 78E1 4AB0 E60E C920 4ECC 7CB6" /* ZÒ\xáJ°æ.É NÌ|¶ */
- $"A76F 70F1 BCFD AA1D F4D2 E43F E203 D0C8" /* §opñ¼ýª.ôÒä?â.ÐÈ */
- $"E11E 61AF F1A7 5762 600E 65BB D870 818A" /* á.a¯ñ§Wb`.e»ØpŠ */
- $"CDF0 DFC4 8C9C 1926 678B 2732 C52F 98FD" /* ÍðßÄŒœ.&g‹'2Å/˜ý */
- $"33B3 EE23 138D 5E5F C9C3 FEF9 6111 E3E6" /* 3³î#.^_ÉÃþùa.ãæ */
- $"AF79 A8A5 2949 D590 B463 EDF3 F72A 18FD" /* ¯y¨¥)IÕ´cíó÷*.ý */
- $"BB23 233B 7924 2DD1 A335 B949 467E A30C" /* »##;y$-Ñ£5¹IF~£. */
- $"3185 5FE5 DB63 6748 B22D AB3F 8A8C 0926" /* 1…_åÛcgH²-«?ŠŒÆ& */
- $"5450 E925 A69D 1185 7300 D694 EA1F 4DF2" /* TPé%¦.…s.Ö”ê.Mò */
- $"2413 F4ED 6D64 5B74 BBD5 0E65 26EF A8CD" /* $.ôímd[t»Õ.e&ï¨Í */
- $"5806 0C60 404F 90A0 06B6 AFD1 785F 9646" /* X..`@O .¶¯Ñx_–F */
- $"B1AD 2A45 5777 33FA 49DB 8D3D AC2A BAEA" /* ±­*EWw3úIÛ=¬*ºê */
- $"4527 B4DF 481A 6AB9 4485 05E6 7040 1B93" /* E'´ßH.j¹D….æp@.“ */
- $"D6E0 3BBF A334 E13B 68EC 934B C393 B621" /* Öà;¿£4á;hì“KÓ¶! */
- $"CFC8 69BE A6AC 672C 235E F1FC 4480 DE83" /* ÏÈi¾¦¬g,#^ñüD€Þƒ */
- $"32D7 D269 F78C F22D 5B9F F4DF DDDD D6DE" /* 2×Òi÷Œò-[ŸôßÝÝÖÞ */
- $"4C65 4D61 C1F0 26BF E4C3 D7C9 A034 163D" /* LeMaÁð&¿äÃ×É 4.= */
- $"FBAE 0167 4DF0 EBEF AA8B B742 2832 1F67" /* û®.gMðë懲·B(2.g */
- $"8CC0 80D0 4A6B 9843 DE59 2F7B F944 9DA4" /* ŒÀ€ÐJk˜CÞY/{ùD¤ */
- $"343D 9AD9 9E0B C7B5 0B7D 2CA1 F638 8A3B" /* 4=šÙž.ǵ.},¡ö8Š; */
- $"BB38 A39B 025A 9BA9 34AC ACF0 063D 5483" /* »8£›.Z›©4¬¬ð.=Tƒ */
- $"FE57 22E4 EB2C C699 AEF3 8EFB 1C8C A23A" /* þW"äë,Æ™®óŽû.Œ¢: */
- $"2C15 D2EF AC9A 91C9 993A 4CB0 2DDC 0A32" /* ,.Ò﬚‘É™:L°-ÜÂ2 */
- $"14B9 50D2 8579 8F9D 5AF2 88DB E726 1B39" /* .¹PÒ…yZòˆÛç&.9 */
- $"3E06 69F9 F300 09E4 D3E8 BB4C A704 10E0" /* >.iùó.ÆäÓè»L§..à */
- $"F1D0 53DE 91D8 6723 A047 11C7 57B3 C46C" /* ñÐSÞ‘Øg# G.ÇW³Äl */
- $"84A7 C2E1 C7CC 185C 9F21 7E2B 0F2E 64B1" /* „§ÂáÇÌ.\Ÿ!~+..d± */
- $"D734 4142 C65E A2FB 9ABE B62D 076B 2B65" /* ×4ABÆ^¢ûš¾¶-.k+e */
- $"9D6E 63F1 4825 79A9 3936 C7A7 531F EF6A" /* ncñH%y©96ǧS.ïj */
- $"F859 3084 0421 88A9 A648 8641 ACEB 95DE" /* øY0„.!ˆ©¦H†A¬ë•Þ */
- $"2E94 E3C9 442C 13AF CF63 0404 C5C6 5CE2" /* .”ãÉD,.¯Ïc..ÅÆ\â */
- $"CE90 F9CC A1B6 5713 031E C239 174F CC40" /* ÎùÌ¡¶W...Â9.OÌ@ */
- $"BCA4 EA9A EB6A 1D24 7962 F735 AF5A B937" /* ¼¤êšëj.$yb÷5¯Z¹7 */
- $"AC3B A12E 10A8 D332 6FE3 8ED1 6F01 B198" /* ¬;¡..¨Ó2oãŽÑo.±˜ */
- $"1543 A6A1 367E E226 5D76 B860 E0E1 8963" /* .C¦¡6~â&]v¸`àá‰c */
- $"AA7A F9EE DABF DB52 28F6 69F9 273F 8729" /* ªzùîÚ¿ÛR(öiù'?‡) */
- $"1D00 C7D2 20B9 3483 2125 88FC 94C0 54A6" /* ..ÇÒ ¹4ƒ!%ˆü”ÀT¦ */
- $"42FE F4E5 DA50 F495 F88B 5986 21CB 22E8" /* BþôåÚPô•ø‹Y†!Ë"è */
- $"EE5E 0622 2CB0 BCC8 0C6B 2B2B 23EB 0506" /* î^.",°¼È.k++#ë.. */
- $"A40F 09C2 726F 0C1F B8D4 55D3 2FE4 D629" /* ¤.ÆÂro..¸ÔUÓ/äÖ) */
- $"94C2 C913 BB28 4394 A9D2 8684 9E47 0445" /* ”ÂÉ.»(C”©Ò†„žG.E */
- $"B6CF 3E21 7072 B435 310C D7A3 063D 942B" /* ¶Ï>!pr´51.×£.=”+ */
- $"6AE9 350C 9442 C76E 1E6B A8C1 18A3 4309" /* jé5.”BÇn.k¨Á.£CÆ */
- $"6D55 E62F FC4E C4E9 6CF8 241D FAC5 2CC9" /* mUæ/üNÄélø$.úÅ,É */
- $"E020 6B12 31A6 9B11 710B 8850 FABE 5D63" /* à k.1¦›.q.ˆPú¾]c */
- $"068A 4018 2A90 93A5 9715 531E 8E7B AD7A" /* .Š@.*“¥—.S.Ž{­z */
- $"2921 115F 19CE 2B6A F643 DE89 2E76 890B" /* )!._.Î+jöCÞ‰.v‰. */
- $"5A69 1668 6A02 061F 4832 24EB FC82 6B4D" /* Zi.hj...H2$ëü‚kM */
- $"9B08 D22F CBBF D348 D18F 8B0C C684 6851" /* ›.Ò/Ë¿ÓHÑ‹.Æ„hQ */
- $"6CA9 E2FA 43CE 8A9A 7A58 FB28 0208 A6E0" /* l©âúCΊšzXû(..¦à */
- $"1ACF CE23 C624 5A38 C640 72C0 26F1 2818" /* .ÏÎ#Æ$Z8Æ@rÀ&ñ(. */
- $"07FD 74D9 F3D6 ED38 CA01 6485 CE8C 41A3" /* .ýtÙóÖí8Ê.d…ÎŒA£ */
- $"02C6 18E5 E4D2 2043 FA62 8768 3E14 7E80" /* .Æ.åäÒ Cúb‡h>.~€ */
- $"F2EB 67AD F743 75A0 2DDF 8724 1468 F88D" /* òëg­÷Cu -߇$.hø */
- $"9BF3 11EB 4D4C B372 D210 9B58 BAA0 646A" /* ›ó.ëML³rÒ.›Xº dj */
- $"222F 5E5A C781 1D86 5652 1B57 07AF C8FA" /* "/^ZÇ.†VR.W.¯Èú */
- $"9E77 DD7B FCB9 1D4C 8573 7B03 95AC D2DA" /* žwÝ{ü¹.L…s{.•¬ÒÚ */
- $"3314 4FFC CAF4 39B5 EAF4 9617 2CC5 9258" /* 3.OüÊô9µêô–.,Å’X */
- $"8F99 8C44 8D44 DA10 F1A5 51F7 5533 F13B" /* ™ŒDDÚ.ñ¥Q÷U3ñ; */
- $"CDDC B6D6 BE71 3C92 2628 3B69 DC32 C623" /* Íܶ־q<’&(;iÜ2Æ# */
- $"F497 3959 034A 67C3 10A8 26E2 572F B4B1" /* ô—9Y.JgÃ.¨&âW/´± */
- $"6C5C 3E47 FB9F AA7D D9A4 7A08 4BBA E854" /* l\>GûŸª}Ù¤z.KºèT */
- $"4370 CE77 C69A 11EB 1BD8 B9AF 8225 BC8E" /* CpÎwÆš.ë.ع¯‚%¼Ž */
- $"A261 1CAA A74D B531 A0B9 D462 35DF 9C21" /* ¢a.ª§Mµ1 ¹Ôb5ßœ! */
- $"73F1 EAC1 A13C E0BC AF6C 8111 03DF AF1F" /* sñêÁ¡<༯l..߯. */
- $"4748 1866 322C 535A 7C5E D2BC 4304 3541" /* GH.f2,SZ|^Ò¼C.5A */
- $"F14E 8412 296B 2C37 B642 9B4A 6417 EABB" /* ñN„.)k,7¶B›Jd.ê» */
- $"9034 1260 1B81 AFCC F903 4FAA A3F2 339E" /* 4.`.¯Ìù.Oª£ò3ž */
- $"F332 B080 8C32 31D7 4DEA B260 F190 43F1" /* ó2°€Œ21×Mê²`ñCñ */
- $"CCD5 A584 5C1C 343F FB87 CEA5 F246 8EAC" /* ÌÕ¥„\.4?û‡Î¥òFŽ¬ */
- $"C407 302C FEE7 3F59 F4B8 74ED ED62 D373" /* Ä.0,þç?Yô¸tííbÓs */
- $"A4BA B53A 0554 5403 9C2C E745 1087 5546" /* ¤ºµ:.TT.œ,çE.‡UF */
- $"2671 7BA6 3A33 703E BEF5 CD28 10A5 462B" /* &q{¦:3p>¾õÍ(.¥F+ */
- $"D902 9493 B2FC 176F 34BA 5A2D D2BC 0CBB" /* Ù.”“²ü.o4ºZ-Ò¼.» */
- $"5AB7 B854 08D3 CD79 3C71 1A89 E643 2FBC" /* Z·¸T.ÓÍy<q.‰æC/¼ */
- $"5A24 FEA6 EC06 1F23 79D9 3886 F6F4 7FB9" /* Z$þ¦ì..#yÙ8†öô.¹ */
- $"F892 1A20 DC66 1EB1 D6FD 1C48 52DE 4267" /* ø’. Üf.±Öý.HRÞBg */
- $"77E2 620B 2DC0 6828 575C F7CA 74BC FE73" /* wâb.-Àh(W\÷Êt¼þs */
- $"FABD C9ED 4E8F 71A7 8CCD 8D80 8BD2 8AA3" /* ú½ÉíNq§ŒÍ€‹ÒŠ£ */
- $"45C0 EF2A 387D 038E 8B00 BA81 12CD F93F" /* EÀï*8}.Ž‹.º.Íù? */
- $"E9BE 9134 2928 439B 69CF 3DB1 5DFC 3DAF" /* 龑4)(C›iÏ=±]ü=¯ */
- $"86CA 34A7 4574 C91C 3F99 3EA9 B6E9 F3AF" /* †Ê4§EtÉ.?™>©¶éó¯ */
- $"6757 09A3 C49E A9AD 7201 BFD9 B3FA 52B0" /* gWƣĞ©­r.¿Ù³úR° */
- $"0000 0030 908B 4E52 45F1 3CBE F04A D2E4" /* ...0‹NREñ<¾ðJÒä */
- $"83AF 6AEA 78E9 A438 C877 BAAD 65CB C703" /* ƒ¯jêxé¤8Èwº­eËÇ. */
- $"70B2 B9DD E19B 6B8C 0CE9 E402 0C9F 94F0" /* p²¹Ýá›kŒ.éä..Ÿ”ð */
- $"21BC 4E05 C03C 012A 66EF D0BC 2B72 292E" /* !¼N.À<.*fïм+r). */
- $"3592 1FDB 2A5C 8D2D C2FF 5C5B 6AB8 F695" /* 5’.Û*\-Âÿ\[j¸ö• */
- $"F279 2C54 0529 555A 6ACA 22A4 C28B D693" /* òy,T.)UZjÊ"¤Â‹Ö“ */
- $"1FC9 4492 43F3 A323 F990 0A31 9356 30D3" /* .ÉD’Có£#ùÂ1“V0Ó */
- $"D6F0 0D36 0091 043F F239 9D1E 114E 3693" /* Öð.6.‘.?ò9..N6“ */
- $"DF1C 23DF A27A 5B11 A44D 9199 07D1 AF2C" /* ß.#ߢz[.¤M‘™.ѯ, */
- $"63EB 21C5 D29F 8644 8C6A 129A 9CB9 ED72" /* cë!ÅÒŸ†DŒj.šœ¹ír */
- $"9286 3E0E B604 539A F262 B727 9284 01F9" /* ’†>.¶.Sšòb·'’„.ù */
- $"5AE1 DA5A 8A02 140E 5275 5433 BCDF 8038" /* ZáÚZŠ...RuT3¼ß€8 */
- $"0050 856F A747 857B 8376 255A 9185 28CC" /* .P…o§G…{ƒv%Z‘…(Ì */
- $"301A EC7C B5D3 89CC A695 1C87 8266 7CA8" /* 0.ì|µÓ‰Ì¦•.‡‚f|¨ */
- $"A203 7467 426E 9507 3DB3 1F90 F66B DC9F" /* ¢.tgBn•.=³.ökÜŸ */
- $"ACF6 CDB2 4FCC 5AE4 2F94 F555 CB9E D8AC" /* ¬öͲOÌZä/”õU˞ج */
- $"950B FF38 0FE4 5056 E5E8 F371 9A98 5697" /* •.ÿ8.äPVåèóqš˜V— */
- $"6319 5197 B545 E594 AADD B2F2 CA27 260D" /* c.Q—µE唪ݲòÊ'&. */
- $"9BAF 0E45 0846 5573 F96B 7AC1 CC89 E86E" /* ›¯.E.FUsùkzÁ̉èn */
- $"61E6 72E2 05E3 9F8D 26D8 F178 BCC0 0B18" /* aærâ.ãŸ&Øñx¼À.. */
- $"967C EA80 F7C1 45AE 8FAE A41C 41B6 438E" /* –|ê€÷ÁE®®¤.A¶CŽ */
- $"46EF 1094 D558 01A8 BBAD 7380 DA27 2772" /* Fï.”ÕX.¨»­s€Ú''r */
- $"9D67 1330 A48C 62EA 0643 14EC 3E22 A055" /* g.0¤Œbê.C.ì>" U */
- $"4E39 4E23 853D C587 99C8 CFD2 AEBB 9843" /* N9N#…=Ň™ÈÏÒ®»˜C */
- $"ECC9 0241 3253 8CF1 E068 1936 3BB2 56D3" /* ìÉ.A2SŒñàh.6;²VÓ */
- $"46F7 6A71 98D1 A300 1337 B3B0 7ABB 5752" /* F÷jq˜Ñ£..7³°z»WR */
- $"DB7A 7F85 5CFE 59DE A852 6987 DC11 C6B5" /* Ûz.…\þYÞ¨Ri‡Ü.Ƶ */
- $"E45B 7DD1 1F3A D566 C16D 3FBF 7BAD 7201" /* ä[}Ñ.:ÕfÁm?¿{­r. */
- $"B71C C74C A678 C2BB 10FD 534A 5E5D 79C0" /* ·.ÇL¦x».ýSJ^]yÀ */
- $"000C 2336 9113 B9C5 5D4A 1756 1C8B 0CD6" /* ..#6‘.¹Å]J.V.‹.Ö */
- $"AA8B DFF5 6CE3 CDAB B9B4 D85C 93FF 76AA" /* ª‹ßõlãÍ«¹´Ø\“ÿvª */
- $"15CF CF39 A864 B236 A172 03A1 65A1 9F76" /* .ÏÏ9¨d²6¡r.¡e¡Ÿv */
- $"FF55 00DE C7D0 C767 2787 9EB3 7CE5 C5BC" /* ÿU.ÞÇÐÇg'‡ž³|åż */
- $"8E08 6085 37A2 229C 73D3 2CC5 F6E8 AA1B" /* Ž.`…7¢"œsÓ,Åöèª. */
- $"AF13 15FD EB95 2609 6006 23C6 7910 8FFE" /* ¯..ýë•&Æ`.#Æy.þ */
- $"8C5E 60A6 A558 E899 0A05 0F37 EC94 8E51" /* Œ^`¦¥Xè™Â..7씎Q */
- $"7838 9A11 8483 88B0 E284 B88D CDEA 9D56" /* x8š.„ƒˆ°â„¸ÍêV */
- $"5C7E CFA2 8001 847E ABC9 360E 17EA 2D34" /* \~Ï¢€.„~«É6..ê-4 */
- $"8314 96C0 3810 D88F A54E 6E7C 6030 76FA" /* ƒ.–À8.Ø¥Nn|`0vú */
- $"18A4 A549 37FC 11F6 E77F A883 C794 71AC" /* .¤¥I7ü.öç.¨ƒÇ”q¬ */
- $"55F1 7F88 664A FEE4 01C4 5576 1BE6 9C41" /* Uñ.ˆfJþä.ÄUv.æœA */
- $"D800 6121 2FC0 E681 A16E 21AF D5FE 0E80" /* Ø.a!/Àæ¡n!¯Õþ.€ */
- $"A800 0000 3090 8C40 9184 82DA 7187 51C6" /* ¨...0Œ@‘„‚Úq‡QÆ */
- $"44DC C420 FF13 98AD D100 2C07 132C 8D6C" /* DÜÄ ÿ.˜­Ñ.,..,l */
- $"5D16 A089 D8F6 E77F A870 24F1 5461 DB69" /* ]. ‰Øöç.¨p$ñTaÛi */
- $"0F41 5029 7A41 B55F 0000 0184 846A 850C" /* .AP)zAµ_...„„j…. */
- $"241E E628 EDA6 4000 3090 6AA2 F6E7 7FA6" /* $.æ(í¦@.0j¢öç.¦ */
- $"26C9 5EDE 9BB6 A1B1 51E6 8D5D F800 0061" /* &É^Þ›¶¡±Qæ]ø..a */
- $"19B3 E47D 6F6F DB03 0885 4A53 27BA 38F5" /* .³ä}ooÛ..…JS'º8õ */
- $"35A0 1AB9 0A95 8FAE 85E3 F528 5A8B E645" /* 5 .¹Â•®…ãõ(Z‹æE */
- $"8419 0456 6A38 D0DA 4948 8987 2323 1216" /* „..Vj8ÐÚIH‰‡##.. */
- $"A4F8 FD1A C374 D30C BF43 CD86 B984 F23C" /* ¤øý.ÃtÓ.¿C͆¹„ò< */
- $"5487 B47F E217 F15A D8CF A66A 96A9 EAF3" /* T‡´.â.ñZØϦj–©êó */
- $"F966 0205 D320 1556 5C3C 073A 8E66 1E3F" /* ùf..Ó .V\<.:Žf.? */
- $"A74E FF2C BC45 E9DB 3B25 FF7F 46AD 13A9" /* §Nÿ,¼EéÛ;%ÿ.F­.© */
- $"5C21 458B 6AD4 829C 1DFB 54BA E5F2 3C76" /* \!E‹jÔ‚œ.ûTºåò<v */
- $"3898 11F6 D710 7470 00FC 0742 CA59 9E40" /* 8˜.ö×.tp.ü.BÊYž@ */
- $"757C 5952 61FF 4D28 0991 1673 9B01 06B9" /* u|YRaÿM(Æ‘.s›..¹ */
- $"3999 E9B5 06CD B1DA CB08 FF19 DE70 8D10" /* 9™éµ.ͱÚË.ÿ.Þp. */
- $"E725 848E D27D 2B0B 54F0 B60B 26AB CD92" /* ç%„ŽÒ}+.Tð¶.&«Í’ */
- $"E4F8 C007 FF68 6933 E2FF 31D5 435B FF7F" /* äøÀ.ÿhi3âÿ1ÕC[ÿ. */
- $"9A8E 9845 007F FEDA 4C63 9892 513A ABD9" /* šŽ˜E..þÚLc˜’Q:«Ù */
- $"A98A C012 5C99 31C0 D48F E334 671D A695" /* ©ŠÀ.\™1ÀÔã4g.¦• */
- $"C7EF 3AAA FF37 D381 4F42 983F FC4D AE82" /* Çï:ªÿ7ÓOB˜?üM®‚ */
- $"FF43 6555 9E7F 10A3 7B95 415D 41FF 20B3" /* ÿCeUž..£{•A]Aÿ ³ */
- $"8CB1 7302 0000 0000 584E AB14 398C A865" /* Œ±s.....XN«.9Œ¨e */
- $"5A7B 1650 52EB 8BCE 3E92 461D 071B 8F21" /* Z{.PRë‹Î>’F...! */
- $"2CFF 4F5F FD2E 999E B77D A47D 61B4 2C01" /* ,ÿO_ý.™ž·}¤}a´,. */
- $"D397 493D CB48 AB27 EB4A 13A7 8C89 7F64" /* Ó—I=ËH«'ëJ.§Œ‰.d */
- $"6C08 FF21 9696 98C7 6248 1615 541F EC81" /* l.ÿ!––˜ÇbH..T.ì */
- $"8E18 FAED 5257 3D01 2CBB 74C1 DA64 81A0" /* Ž.úíRW=.,»tÁÚd  */
- $"39BF B272 4068 15E8 A44A 007C 732C D9DC" /* 9¿²r@h.è¤J.|s,ÙÜ */
- $"1CF8 4612 8611 A36D 67BC 6E6A EA14 9D87" /* .øF.†.£mg¼njê.‡ */
- $"2962 C4B4 5442 9564 BFAA D0FB 991F 4288" /* )bÄ´TB•d¿ªÐû™.Bˆ */
- $"7CB2 2A41 333E 7827 5070 F3A6 67FF 7FFF" /* |²*A3>x'Ppó¦gÿ.ÿ */
- $"7601 CFFE E44B 4413 809B 3877 B59D BC19" /* v.ÏþäKD.€›8wµ¼. */
- $"548F 0A5B C1E9 A8D7 6B5D 8EC8 8A1A BB3D" /* TÂ[Áé¨×k]ŽÈŠ.»= */
- $"3CD1 3139 57CF 9E94 00E9 CF6E 3830 3561" /* <Ñ19WÏž”.éÏn805a */
- $"8DE4 A59F FD1B 45CF C608 D0FD 5D48 485E" /* 䥟ý.EÏÆ.Ðý]HH^ */
- $"D5A3 30A5 F9EE 5D55 B9C2 E552 3A9F B087" /* Õ£0¥ùî]U¹ÂåR:Ÿ°‡ */
- $"FE87 5DBC 5E73 0F16 9221 2B0D F399 AB6F" /* þ‡]¼^s..’!+.ó™«o */
- $"9950 0000 0000 0000 0008 2444 88CE 3BBD" /* ™P........$DˆÎ;½ */
- $"CC78 4932 9C47 DEFA 74E7 91BF 9827 FF7B" /* ÌxI2œGÞútç‘¿˜'ÿ{ */
- $"77EB 9B1B 9F7F FDAB 6552 35A1 0C22 E9C6" /* wë›.Ÿ.ý«eR5¡."éÆ */
- $"42E3 FF7F FF7F E9FD A23B 2F7D 3ADD FC90" /* Bãÿ.ÿ.éý¢;/}:Ýü */
- $"E4A1 F8B9 0560 0F86 D7FE 3F46 C953 2A03" /* ä¡ø¹.`.†×þ?FÉS*. */
- $"F1C7 F5AE D0C4 B743 EA67 B694 E47D 45CD" /* ñÇõ®ÐÄ·Cêg¶”ä}EÍ */
- $"6F92 178A E383 8B71 800E D9AF A55A F149" /* o’.Šãƒ‹q€.Ù¯¥ZñI */
- $"A838 5671 4C9A 8915 447A CDA9 C6B7 DD68" /* ¨8VqLš‰.DzÍ©Æ·Ýh */
- $"A5FB F404 CF63 A62E CC5E 89D3 FDB2 C841" /* ¥ûô.Ïc¦.Ì^‰Óý²ÈA */
- $"7A37 5B5D 5958 4B46 20B1 D389 5188 F9FE" /* z7[]YXKF ±Ó‰Qˆùþ */
- $"8FF1 D718 6C8C 3254 0000 0000 0000 0000" /* ñ×.lŒ2T........ */
- $"0000 00A1 EBEC C33A 8622 D0FF 7FFF 7FFF" /* ...¡ëìÃ:†"Ðÿ.ÿ.ÿ */
- $"705D C7FE 49E7 01B7 A65D D5BC 2041 80B0" /* p]ÇþIç.·¦]Õ¼ A€° */
- $"89ED F68A A000 F438 EBD0 C908 0B67 414F" /* ‰íöŠ .ô8ëÐÉ..gAO */
- $"C8F1 4312 2EC8 05E6 CA19 184F FF5B BA24" /* ÈñC..È.æÊ..Oÿ[º$ */
- $"57E8 A6B4 FBD3 FF79 4D8E FF44 BC50 6938" /* W覴ûÓÿyMŽÿD¼Pi8 */
- $"137F FF7D 6251 8D1A 9B33 CF7E 0BCB EAD7" /* ..ÿ}bQ.›3Ï~.Ëê× */
- $"2E0D EAE0 0003 0906 AA2B 66A8 C950 0000" /* ..êà..Æ.ª+f¨ÉP.. */
- $"0000 0000 0000 0000 0001 1E1F F600 1848" /* ............ö..H */
- $"4BF6 7A7C F92D 3E7A 437E 2254 51EB 4AF5" /* Köz|ù->zC~"TQëJõ */
- $"C6BF 442A 12CD 51FF 7FFE B8AE D0C4 B1D0" /* Æ¿D*.ÍQÿ.þ¸®ÐıР*/
- $"7CF7 019D A0ED 2CC4 01BC 1A94 212D 43EF" /* |÷. í,Ä.¼.”!-Cï */
- $"1274 9B67 94D5 062D 5FCC E23C 4816 416B" /* .t›g”Õ.-_Ìâ<H.Ak */
- $"1540 59C2 1D35 213D A11C EE70 8D15 5394" /* .@YÂ.5!=¡.îp.S” */
- $"53C6 29CF 4E19 F4CF 5B94 7FFF 7F8B 2813" /* SÆ)ÏN.ôÏ[”.ÿ.‹(. */
- $"3E95 DE81 30D0 3188 2A75 4F35 CB11 DDD5" /* >•Þ0Ð1ˆ*uO5Ë.ÝÕ */
- $"7FFD A983 95A9 71E7 A7A3 7D3F F944 0A7E" /* .ý©ƒ•©q秣}?ùDÂ~ */
- $"24D9 966F 6B6A 0FD0 23AC 7000 0000 0000" /* $Ù–okj.Ð#¬p..... */
- $"0009 D4AF 9196 E5A4 B8AC 407F F9EE C709" /* .ÆÔ¯‘–夸¬@.ùîÇÆ */
- $"F927 08C3 CA6C 3A3A D90F E306 BCC4 6D6C" /* ù'.ÃÊl::Ù.ã.¼Äml */
- $"C7A9 F042 6F4C FDC9 60AB A087 6338 8F12" /* Ç©ðBoLýÉ`« ‡c8. */
- $"4D29 D00C C575 C7B5 9FA4 E96C 1FA0 AAFB" /* M)Ð.ÅuǵŸ¤él. ªû */
- $"09E9 8DF9 1BE0 C62D 3C1D F55B DD77 A0FD" /* Æéù.àÆ-<.õ[Ýw ý */
- $"5C16 D959 BA08 0000 0000 0000 0145 AE01" /* \.ÙYº........E®. */
- $"712A 0E06 1212 70CD 94A8 0A2C 18F5 1E3B" /* q*....pÍ”¨Â,.õ.; */
- $"52FA C8F6 56F3 F7E4 69E6 54A0 3FF6 2487" /* RúÈöVó÷äiæT ?ö$‡ */
- $"C65F 0EFF 7F4F 8D07 C817 FE78 727D 3C75" /* Æ_.ÿ.O.È.þxr}<u */
- $"E4C6 1003 FECF 3E7E 6252 08C0 4A83 50D7" /* äÆ..þÏ>~bR.ÀJƒP× */
- $"DADA 8602 5949 900F D2B6 D10D 2661 3014" /* ÚÚ†.YI.Ò¶Ñ.&a0. */
- $"4541 17FF 2106 00DF AC82 0046 09BB A5AF" /* EA.ÿ!..߬‚.FÆ»¥¯ */
- $"CE51 0EBF F9AD 787A 907F 9F9A 628F E16B" /* ÎQ.¿ù­xz.Ÿšbák */
- $"C015 137E 9C68 FCFA A817 FF7F DD6B FDB6" /* À..~œhüú¨.ÿ.Ýký¶ */
- $"3DA3 7C9D 3309 0B8A B551 C370 4401 CD7F" /* =£|3Æ.ŠµQÃpD.Í. */
- $"7503 8425 E297 1B3F FF49 4FF8 3583 685A" /* u.„%â—.?ÿIOø5ƒhZ */
- $"B273 A7F7 CEBF F27E D78C 3E35 5332 152B" /* ²s§÷οò~׌>5S2.+ */
- $"033C C7FF 7B97 1AF0 F2A4 3C88 CC7B B96E" /* .<Çÿ{—.ðò¤<ˆÌ{¹n */
- $"65B3 533C F2F8 5E4B 6DBF 7D78 A316 310F" /* e³S<òø^Km¿}x£.1. */
- $"6B09 FD62 88D7 77FF 7447 524E C235 00A3" /* kÆýbˆ×wÿtGRNÂ5.£ */
- $"8F5A 4BEE D240 6154 C17C 2CC2 68F0 A959" /* ZKîÒ@aTÁ|,Âhð©Y */
- $"2F12 9B74 7E8E 423F BB1D BC9A C75B C618" /* /.›t~ŽB?».¼šÇ[Æ. */
- $"19D1 C6CB 0A15 BD77 99BD 96D3 CC07 F5AC" /* .ÑÆËÂ.½w™½–ÓÌ.õ¬ */
- $"D2ED DE5E F19D 5CFC B2B0 5407 0386 32C6" /* ÒíÞ^ñ\ü²°T..†2Æ */
- $"5F49 7BAD 3270 BF81 CF97 C934 7E23 7237" /* _I{­2p¿Ï—É4~#r7 */
- $"727B 0FA2 6DB0 D717 8C73 B109 E089 AAC5" /* r{.¢m°×.Œs±Æà‰ªÅ */
- $"7D98 9061 2956 EA75 0135 E870 3430 4E9B" /* }˜a)Vêu.5èp40N› */
- $"C76C D3D6 7EEB 83DB 9EEB C9A0 983D 1327" /* ÇlÓÖ~ëƒÛžëÉ ˜=.' */
- $"62D8 FD62 CA51 7135 80B0 ABFF 431B 9843" /* bØýbÊQq5€°«ÿC.˜C */
- $"68B4 A929 44E4 1F3E E3A1 22AA 5E87 579C" /* h´©)Dä.>ã¡"ª^‡Wœ */
- $"745B 9CA4 438C BFC2 9A1B 17BE BA75 06E4" /* t[œ¤CŒ¿Âš..¾ºu.ä */
- $"0108 698C E4F2 341C 24CC 7913 6237 ED48" /* ..iŒäò4.$Ìy.b7íH */
- $"E797 4D7A 0D5A D1EA ACDF F974 4F9F 9139" /* ç—Mz.ZÑê¬ßùtOŸ‘9 */
- $"6A87 3972 A1C8 0A2B 1E8B 6DB7 B811 4AB0" /* j‡9r¡ÈÂ+.‹m·¸.J° */
- $"EEE8 BB23 959C 239D 4165 DBED ACE4 F133" /* îè»#•œ#AeÛí¬äñ3 */
- $"8276 40BB C447 29FE 3EB6 5BA4 A6D0 2441" /* ‚v@»ÄG)þ>¶[¤¦Ð$A */
- $"1431 8B2D 8BFD 96B7 C8C2 9F9B DFB9 2B06" /* .1‹-‹ý–·ÈŸ›ß¹+. */
- $"E191 00FF 7E4B 8281 D609 D163 B8CB AF9A" /* á‘.ÿ~K‚ÖÆÑc¸Ë¯š */
- $"0995 7385 27FC 3C6A 5310 024D BAD1 8013" /* Æ•s…'ü<jS..MºÑ€. */
- $"8995 3DF4 FA80 FE12 8F5F 40E5 09E6 E7E8" /* ‰•=ôú€þ._@åÆæçè */
- $"C5E7 1309 3E97 E278 0228 1693 F565 F83E" /* Åç.Æ>—âx.(.“õeø> */
- $"4161 0037 E0AA D0CC 3AED 4E56 04E8 4456" /* Aa.7àªÐÌ:íNV.èDV */
- $"6E50 4626 C7E0 0790 014E 329B 0DDB D87D" /* nPF&Çà..N2›.ÛØ} */
- $"4532 6482 3F51 D651 3F62 D6EB 3BCA 75EB" /* E2d‚?QÖQ?bÖë;Êuë */
- $"5444 A42F 3CFB 4146 19FB 5376 876F 6BC1" /* TD¤/<ûAF.ûSv‡okÁ */
- $"B80B 7787 71DF 4CAA D70A 98BC 98E1 15A1" /* ¸.w‡qßLª×˜¼˜á.¡ */
- $"7996 F17F FF7A 91CF 350C FA04 5753 7ECB" /* y–ñ.ÿz‘Ï5.ú.WS~Ë */
- $"29F1 A4AD F335 59DB A580 EAA3 98AD FEB0" /* )ñ¤­ó5YÛ¥€ê£˜­þ° */
- $"275E BABE 6679 9AD4 B246 75F2 ECAA B042" /* '^º¾fyšÔ²Fuò쪰B */
- $"92C9 745E 1C58 58FF 2570 9228 4EAF 6F65" /* ’Ét^.XXÿ%p’(N¯oe */
- $"56F3 1D0C 85AA 9468 8000 0000 0101 3082" /* Vó..…ª”h€.....0‚ */
- $"08FD E30F FF75 70BF FCCA 2225 E5FC 3464" /* .ýã.ÿup¿üÊ"%åü4d */
- $"00CA 6C43 E833 80DE 2895 5F84 4B08 CEFA" /* .ÊlCè3€Þ(•_„K.Îú */
- $"AA94 EE33 24E7 CA20 A668 4717 FD5F F7F2" /* ª”î3$çÊ ¦hG.ý_÷ò */
- $"59E7 D6C6 6D0D 8E0F 1AC3 BBFA 3890 8ACB" /* YçÖÆm.Ž..ûú8ŠË */
- $"9250 6D82 E892 D4B9 1F14 D987 9818 877A" /* ’Pm‚è’Ô¹..Ù‡˜.‡z */
- $"66F0 905A B088 D761 B529 F02A 6964 6C65" /* fðZ°ˆ×aµ)ð*idle */
- $"8FB8 9A87 7771 9A12 C8A6 7F9C 9905 D643" /* ¸š‡wqš.Ȧ.œ™.ÖC */
- $"E554 91F5 0C26 4299 30C6 BC87 B38C 86FB" /* åT‘õ.&B™0Ƽ‡³Œ†û */
- $"ED50 C019 3822 52A8 97C6 1F49 176D FB8C" /* íPÀ.8"R¨—Æ.I.mûŒ */
- $"87B7 E37C 196E 3695 357A E2B8 FDE5 736E" /* ‡·ã|.n6•5zâ¸ýåsn */
- $"DF11 6026 3CD9 51CF 2A50 6F8A 53B0 0F16" /* ß.`&<ÙQÏ*PoŠS°.. */
- $"938B 745A F84D 571C A582 9723 90B4 49D7" /* “‹tZøMW.¥‚—#´I× */
- $"B11D 7BA6 45C1 2AFA D519 A471 60A3 17A9" /* ±.{¦EÁ*úÕ.¤q`£.© */
- $"2C13 6E04 D58E 3F37 0115 E4AE F51C 1BA8" /* ,.n.ÕŽ?7..ä®õ..¨ */
- $"EF7F 4C9F 7B47 8C5A D1D6 CAC7 D416 D6D4" /* ï.LŸ{GŒZÑÖÊÇÔ.ÖÔ */
- $"7F05 9504 5685 0D6D E0E8 6809 9307 7864" /* ..•.V….màèhÆ“.xd */
- $"1A86 1BA6 A321 D08C 1B0C 0981 9395 6DC0" /* .†.¦£!ÐŒ..Æ“•mÀ */
- $"C74F ECF7 CA1B FF4B 1896 BDBE 4876 8A4B" /* ÇOì÷Ê.ÿK.–½¾HvŠK */
- $"519F CC3C 7813 BE21 C40C B001 30F4 4FC7" /* QŸÌ<x.¾!Ä.°.0ôOÇ */
- $"B76C B9FA 26F6 38C8 116D B8F0 0B9D 818F" /* ·l¹ú&ö8È.m¸ð. */
- $"56F9 F934 AE60 71FD E583 8D07 A4A4 DE41" /* Vùù4®`qýåƒ.¤¤ÞA */
- $"FB75 B83F 384B 11C9 CC5E CD9D FF4C 05A8" /* ûu¸?8K.ÉÌ^ÍÿL.¨ */
- $"D59F 1E59 4797 FF7F DFD8 391C E8BA 72E2" /* ÕŸ.YG—ÿ.ßØ9.èºrâ */
- $"C1F8 9F5C 5317 01E3 EC2D 4120 97D2 BAEC" /* ÁøŸ\S..ãì-A —Òºì */
- $"DBB0 FF30 FC56 2E43 3716 1B7B A8CD 19AE" /* Û°ÿ0üV.C7..{¨Í.® */
- $"7FFF 7FF4 468B FF45 749B 3C67 EE31 1651" /* .ÿ.ôF‹ÿEt›<gî1.Q */
- $"17B2 B21C A982 A185 E8A3 03BC 2DCB C09A" /* .²².©‚¡…è£.¼-ËÀš */
- $"8522 64CF BB21 6955 068D F002 871B 05F3" /* …"dÏ»!iU.ð.‡..ó */
- $"9F44 7384 D624 E1FA A24D 67C7 BC5E F7BF" /* ŸDs„Ö$áú¢MgǼ^÷¿ */
- $"59BC DC3C BE4B 1456 0C6F F2C1 0841 038D" /* Y¼Ü<¾K.V.oòÁ.A. */
- $"723C 14FA 4F19 0AD4 1F88 0A1B FF14 3D93" /* r<.úO.ÂÔ.ˆÂ.ÿ.=“ */
- $"27AA 6E0B 4AA7 6A11 E06D 5D82 C930 1B53" /* 'ªn.J§j.àm]‚É0.S */
- $"0227 A9AA 253A 41E6 31D5 8B87 DC08 819B" /* .'©ª%:Aæ1Õ‹‡Ü.› */
- $"E5EE EA0F 6AA0 0000 0006 9BC0 594E 0004" /* åîê.j ....›ÀYN.. */
- $"D326 312C 0364 8835 C4D7 5040 3724 3CD9" /* Ó&1,.dˆ5Ä×P@7$<Ù */
- $"B889 2E14 12BC F0AD 9D2E 326B 1654 5952" /* ¸‰...¼ð­.2k.TYR */
- $"2B5F 1A9D 5403 C9C5 A731 1B3C 3443 783C" /* +_.T.Éŧ1.<4Cx< */
- $"A459 248B BBC7 DEDC 74AD E2A1 D647 5047" /* ¤Y$‹»ÇÞÜt­â¡ÖGPG */
- $"AD17 15AF FF5C 88C4 025F 4361 3F83 BFC9" /* ­..¯ÿ\ˆÄ._Ca?ƒ¿É */
- $"FF6D 7E58 128D 33D7 7076 E73A 9CF6 76D8" /* ÿm~X.3×pvç:œövØ */
- $"A0FF 2C44 2029 0B59 B427 3BDC 915B 87CF" /*  ÿ,D ).Y´';Ü‘[‡Ï */
- $"75D6 EC52 7793 6DFA A4E2 9E2D 7D25 FBC2" /* uÖìRw“mú¤âž-}%û */
- $"2028 DE78 D868 BEC5 E9D2 BFFA 8B12 9265" /* (ÞxØh¾ÅéÒ¿ú‹.’e */
- $"B01D 92F7 F71E 8782 F1CD 4E98 B46E 6DA5" /* °.’÷÷.‡‚ñÍN˜´nm¥ */
- $"8825 F851 1CE9 9F21 D8E2 86EB BAF4 126F" /* ˆ%øQ.éŸ!Øâ†ëºô.o */
- $"9CB3 0144 009A 6F38 0919 9C1F D0CE D23C" /* œ³.D.šo8Æ.œ.ÐÎÒ< */
- $"C9DD 9273 D8F6 6733 6E5A 2E7A 635C 8723" /* ÉÝ’sØög3nZ.zc\‡# */
- $"6E04 1283 1A43 02CA 74E4 8000 0309 08DB" /* n..ƒ.C.Êtä€..Æ.Û */
- $"EF05 DC00 D116 0D58 1A69 2055 1BA0 D8DE" /* ï.Ü.Ñ..X.i U. ØÞ */
- $"34B6 EA40 CC06 C673 559A 75F2 9B58 C474" /* 4¶ê@Ì.ÆsUšuò›XÄt */
- $"DD4C AB9A 9E6D 653B FCDF 4F33 3707 105E" /* ÝL«šžme;üßO37..^ */
- $"DBCE D327 45FB C663 E1AF 375B B106 B0B8" /* ÛÎÓ'EûÆcá¯7[±.°¸ */
- $"26EE AE4B 538A CF74 588E 928B 58C7 2D93" /* &î®KSŠÏtXŽ’‹XÇ-“ */
- $"371E BC81 0ED0 9F2C 1A18 8DD7 7E65 4FBF" /* 7.¼.П,..×~eO¿ */
- $"511B 63A1 8F26 2A08 A4D3 2BF3 96E6 FC32" /* Q.c¡&*.¤Ó+ó–æü2 */
- $"D457 8287 D843 6D19 2458 0EA4 AC8F 0512" /* ÔW‚‡ØCm.$X.¤¬.. */
- $"831D D4CA 9BFF 5A6E 951A 5897 451F 750C" /* ƒ.ÔÊ›ÿZn•.X—E.u. */
- $"CAD4 89C1 94A7 4BFA 4030 4828 1E37 C049" /* ÊÔ‰Á”§Kú@0H(.7ÀI */
- $"34C4 54B1 1054 2645 14E5 6DFF 7FFF 7328" /* 4ÄT±.T&E.åmÿ.ÿs( */
- $"F1A4 AAA2 4FD2 507D 86D5 FF7F FA43 F49A" /* ñ¤ª¢OÒP}†Õÿ.úCôš */
- $"5049 0839 5964 8186 EE46 1867 158E 9E2C" /* PI.9Yd†îF.g.Žž, */
- $"D618 8FF5 D416 6838 6187 9CF7 21BC DE1F" /* Ö.õÔ.h8a‡œ÷!¼Þ. */
- $"F84F F4E9 ACDB ECD8 6CA6 6725 85B4 4049" /* øOôé¬ÛìØl¦g%…´@I */
- $"AA9E 4935 7E1F 54E7 B0D5 A026 B073 899B" /* ªžI5~.Tç°Õ &°s‰› */
- $"51C4 8C2E 483C B3BF 38A0 4BCF 2042 EE90" /* QÄŒ.H<³¿8 KÏ Bî */
- $"4E1B 8C94 420F 99A7 9EA1 7D96 12A3 8C8D" /* N.Œ”B.™§ž¡}–.£Œ */
- $"819B C97D C518 51CB 0D8A A7A1 7159 EB10" /* ›É}Å.QË.Š§¡qYë. */
- $"4A27 5CD0 0ED7 2688 5F74 CE10 DF6A 5B4F" /* J'\Ð.×&ˆ_tÎ.ßj[O */
- $"E370 A282 105D 2F43 6E74 6B07 05EC 880E" /* ãp¢‚.]/Cntk..ìˆ. */
- $"15AF 5118 9D27 327D 2552 9996 020B 2D9A" /* .¯Q.'2}%R™–..-š */
- $"9AFC 6849 6068 6491 42FA 889C 7949 285A" /* šühI`hd‘BúˆœyI(Z */
- $"7FFE 5B6D DAF2 7FFF 772D E08E B9E4 65A3" /* .þ[mÚò.ÿw-àŽ¹äe£ */
- $"B49A DDC8 FF52 8DA3 B318 F84F F4E9 99ED" /* ´šÝÈÿR£³.øOôé™í */
- $"48C4 CA7E BE77 2634 6A22 1FAD 4752 8D9B" /* HÄÊ~¾w&4j".­GR› */
- $"B935 0449 1A27 9EAB B000 C242 3BB7 72B7" /* ¹5.I.'ž«°.ÂB;·r· */
- $"3ACC B41F 0AC9 CFFD 58DA D99F 498A 21CF" /* :Ì´.ÂÉÏýXÚÙŸIŠ!Ï */
- $"50B8 A155 9BB3 B3DA 13FE 251F 14F2 3431" /* P¸¡U›³³Ú.þ%..ò41 */
- $"6DBF 2774 3EFC 55BB 9CB3 40A4 CA00 A112" /* m¿'t>üU»œ³@¤Ê.¡. */
- $"3E83 51D4 9D13 DE0D F86D 3384 AAE7 9074" /* >ƒQÔ.Þ.øm3„ªçt */
- $"F7CF 4509 F99A 70B2 2E74 43C3 1363 021F" /* ÷ÏEÆùšp².tCÃ.c.. */
- $"6482 E471 22FA 6265 2DF9 C302 43F8 9053" /* d‚äq"úbe-ùÃ.CøS */
- $"0AE9 15A2 28D4 FD7C 05AF C7B8 26D5 7C0F" /* Âé.¢(Ôý|.¯Ç¸&Õ|. */
- $"22E0 4735 518D BE4B 4E83 1EF8 3FFA BA23" /* "àG5Q¾KNƒ.ø?úº# */
- $"3AE8 F76B 1D92 2038 64C1 EA73 30FC CE72" /* :è÷k.’ 8dÁês0üÎr */
- $"0CA5 6697 157E 55C4 8BAE E703 6FF5 F743" /* .¥f—.~UÄ‹®ç.oõ÷C */
- $"B456 C85F 3BFF 2629 95B7 02F4 F580 A49B" /* ´VÈ_;ÿ&)•·.ôõ€¤› */
- $"1587 2316 D131 66C1 C6DB F3DC C409 D801" /* .‡#.Ñ1fÁÆÛóÜÄÆØ. */
- $"E2DA 30B6 73FD 99EF AA26 25D7 DF07 FBEB" /* âÚ0¶sý™ïª&%×ß.ûë */
- $"094E 2E8E BD11 3C49 81BA E6BE 7666 ECBE" /* ÆN.Ž½.<Iºæ¾vfì¾ */
- $"59D2 4ACC B4CE 3FAD 2173 25CB E42F 37B8" /* YÒJÌ´Î?­!s%Ëä/7¸ */
- $"F3CC 79EF 695C 10F4 0381 2D14 1B0F D632" /* óÌyïi\.ô.-...Ö2 */
- $"8A1E 9C29 F617 6A4B 204E A147 C08D 1AA5" /* Š.œ)ö.jK N¡GÀ.¥ */
- $"7418 DED9 DE83 A555 A75B AB00 C650 247F" /* t.ÞÙÞƒ¥U§[«.ÆP$. */
- $"0222 5558 731B 54DB 14F6 3A0E 1FAD A8D8" /* ."UXs.TÛ.ö:..­¨Ø */
- $"F327 DC8F AF3F 630B 3BA9 7933 8D30 458C" /* ó'ܯ?c.;©y30EŒ */
- $"4C2F 6E3A 0A64 DDC5 926A 71CB 2347 EE4D" /* L/n:ÂdÝÅ’jqË#GîM */
- $"647B D94D BE24 7F62 6A14 EBE2 696F 8735" /* d{ÙM¾$.bj.ëâio‡5 */
- $"A96F E268 6912 A4A9 3254 0293 CB09 0DC0" /* ©oâhi.¤©2T.“ËÆ.À */
- $"206B EB7B F6B9 0643 5E74 4F2C 555A AE2D" /* kë{ö¹.C^tO,UZ®- */
- $"B16B 7FA3 8ADE 7EAC 764F 9A20 BC94 05F1" /* ±k.£ŠÞ~¬vOš ¼”.ñ */
- $"9AAC 0118 36B8 6B30 D696 6E84 EEC2 5342" /* š¬..6¸k0Ö–n„îÂSB */
- $"03A8 EFD3 CB37 D50D F676 35DB AD6C 280A" /* .¨ïÓË7Õ.öv5Û­l( */
- $"DB04 D23A 0922 A2E3 5F45 EBD1 5C49 F6AA" /* Û.Ò:Æ"¢ã_EëÑ\Iöª */
- $"4579 1BA2 D94E D3F0 7A7E C24E 79B0 5D24" /* Ey.¢ÙNÓðz~ÂNy°]$ */
- $"B98E 23E7 4C4F 54D9 A3CE 389F 63F6 2426" /* ¹Ž#çLOTÙ£Î8Ÿcö$& */
- $"7087 D921 86D6 709F 768D 5684 BB90 47B7" /* p‡Ù!†ÖpŸvV„»G· */
- $"AC32 98D7 E247 3668 E954 8105 EE44 AF58" /* ¬2˜×âG6héT.îD¯X */
- $"13FF 573A 9F89 06C9 FB77 277E 08C9 09E9" /* .ÿW:Ÿ‰.Éûw'~.ÉÆé */
- $"B180 F96E C5AB 1E5D 3029 E229 CE1B B2AD" /* ±€ùnÅ«.]0)â)Î.²­ */
- $"BA11 DD98 0D9C 4C45 66DD 8553 3BA2 6F5B" /* º.ݘ.œLEfÝ…S;¢o[ */
- $"699B CEF3 48A7 6C31 63E6 E189 9C68 B9EC" /* i›ÎóH§l1cæቜh¹ì */
- $"A663 411F EBCB 41AB 8F7E 7EAD 87DA 5BF3" /* ¦cA.ëËA«~~­‡Ú[ó */
- $"AAC9 975B AC1F 712B F7ED DEBD 04C3 B85A" /* ªÉ—[¬.q+÷íÞ½.øZ */
- $"470D D74A B91D 0180 7BAB 4088 5671 6268" /* G.×J¹..€{«@ˆVqbh */
- $"5B4A 54FE C179 1600 7677 830B 0E81 EEB4" /* [JTþÁy..vwƒ..î´ */
- $"056E 79FF 8251 AB20 A6BC 15A5 E71F 7D4A" /* .nyÿ‚Q« ¦¼.¥ç.}J */
- $"2F6E 951A DE36 7A81 C704 9A4A F239 E1DC" /* /n•.Þ6zÇ.šJò9áÜ */
- $"FF6C DE49 B4C8 F6C1 F764 8D19 4686 DFC2" /* ÿlÞI´ÈöÁ÷d.F†ß */
- $"5C72 4A52 9784 F974 DCA4 A177 21DA 9869" /* \rJR—„ùtܤ¡w!Ú˜i */
- $"80A4 5BC6 FD54 A56B C7B1 4705 3A32 C896" /* €¤[ÆýT¥kDZG.:2È– */
- $"4539 25E5 90CC F228 B7F9 ADA5 CC2C 59CA" /* E9%åÌò(·ù­¥Ì,YÊ */
- $"D14D 4B86 9CC0 D367 7EF5 DB6D C2E1 06DB" /* ÑMK†œÀÓg~õÛmÂá.Û */
- $"58BC 0D97 DCFE 3CB1 EA45 C36F 1B60 83C9" /* X¼.—Üþ<±êEÃo.`ƒÉ */
- $"663F B883 83BA A69F 2653 0747 18C7 6D20" /* f?¸ƒƒº¦Ÿ&S.G.Çm */
- $"F2C7 6E01 47DA AB9D 2D83 D5CE 1E9C 779A" /* òÇn.GÚ«-ƒÕÎ.œwš */
- $"5FAE 6015 63DE 317A EFCA 7142 F3F8 A7E1" /* _®`.cÞ1zïÊqBóø§á */
- $"F739 60AB DF24 41BF EB6C AF15 7223 E56C" /* ÷9`«ß$A¿ël¯.r#ål */
- $"8D61 D9D1 C61F 8F8E 8435 6452 C45A 917B" /* aÙÑÆ.Ž„5dRÄZ‘{ */
- $"0856 B8BA 14E2 0A77 ABA0 E605 2E39 63EA" /* .V¸º.âÂw« æ..9cê */
- $"E7F5 4804 6535 7672 575F 37EA 9E69 1A1C" /* çõH.e5vrW_7êži.. */
- $"E380 CB7D C109 2D50 73EF 4119 54BE CBFE" /* ã€Ë}ÁÆ-PsïA.T¾Ëþ */
- $"4552 74A1 3E73 C457 1436 9DFF 3C25 8231" /* ERt¡>sÄW.6ÿ<%‚1 */
- $"2C25 ACE4 F084 E842 60E8 355D 22BE 6FEE" /* ,%¬äð„èB`è5]"¾oî */
- $"93F9 DDE6 DAED 4E44 545A FE4E 5EA4 0487" /* “ùÝæÚíNDTZþN^¤.‡ */
- $"36F1 52AF 8683 2DE8 F30B 72DE E807 2068" /* 6ñR¯†ƒ-èó.rÞè. h */
- $"742B 7262 BF7E 516C D41F CA56 9DE1 E3B8" /* t+rb¿~QlÔ.ÊVá㸠*/
- $"8D72 2993 C073 516D A343 DDE0 984D F06A" /* r)“ÀsQm£CÝà˜Mðj */
- $"CD83 D22D C161 30D7 2E9A FED4 4E85 5D2E" /* ̓Ò-Áa0×.šþÔN…]. */
- $"CF72 2181 7F23 BC37 FF83 C30D 43E0 DBC7" /* Ïr!.#¼7ÿƒÃ.CàÛÇ */
- $"A277 B4D9 4E68 1FB1 AF7B 6D8B 8F43 2A1B" /* ¢w´ÙNh.±¯{m‹C*. */
- $"9FE4 6CCC E826 C4AA 96C9 98A9 4D3B 981F" /* ŸälÌè&Ī–ɘ©M;˜. */
- $"8786 8633 89B0 2B42 4266 BC27 0098 D2B3" /* ‡††3‰°+BBf¼'.˜Ò³ */
- $"E8E4 0D2C 6E14 D34D 3613 4568 4A1E 8E5E" /* èä.,n.ÓM6.EhJ.Ž^ */
- $"E328 D89C 85D3 D8C2 C15B 3533 989F F015" /* ã(Øœ…ÓØÂÁ[53˜Ÿð. */
- $"1B49 871D 031B 2DBE D49E 880D A557 0694" /* .I‡...-¾Ôžˆ.¥W.” */
- $"60C3 47A1 CD2A 961B F73C 94A3 6B17 4268" /* `ÃG¡Í*–.÷<”£k.Bh */
- $"F766 81DC 33BC 8C1D 5571 D2D7 FB1C 9378" /* ÷fÜ3¼Œ.UqÒ×û.“x */
- $"01B7 BDCC 5DD0 9171 5FA1 50DA 7EBF 1586" /* .·½Ì]Бq_¡PÚ~¿.† */
- $"FA82 9E6F CBE4 0977 9C9C 2373 E789 5A3E" /* ú‚žoËäÆwœœ#sç‰Z> */
- $"8743 EB0E ED13 7955 DB28 2874 8065 2078" /* ‡Cë.í.yUÛ((t€e x */
- $"97A7 6C13 2283 729A CCF9 E449 A627 7652" /* —§l."ƒršÌùäI¦'vR */
- $"E821 2F1F 574E 6887 1830 6E01 5A8D 02FB" /* è!/.WNh‡.0n.Z.û */
- $"DB61 8EEF 4E08 B607 26FA 2B4C FF47 38FE" /* ÛaŽïN.¶.&ú+LÿG8þ */
- $"9B7C A3E4 DB46 F898 CFE9 8F3C 8717 2975" /* ›|£äÛFø˜Ïé<‡.)u */
- $"9BA2 582E 86D1 D882 C127 EFD7 E71A B5DD" /* ›¢X.†ÑØ‚Á'ï×ç.µÝ */
- $"7772 6391 2722 2884 AA0F 9C72 9A96 F4F8" /* wrc‘'"(„ª.œrš–ôø */
- $"BFF8 869A FD00 3B41 A8C7 DCD0 2834 270C" /* ¿ø†šý.;A¨ÇÜÐ(4'. */
- $"B93C 8702 5B16 8A32 0289 979B 0A35 3A7B" /* ¹<‡.[.Š2.‰—›Â5:{ */
- $"5870 6189 03C2 DD00 FAB2 B137 AB93 3EF5" /* Xpa‰.ÂÝ.ú²±7«“>õ */
- $"24E3 1FE1 A206 963E 1344 FE12 285A 5C52" /* $ã.á¢.–>.Dþ.(Z\R */
- $"692E D315 6C73 2CBE 7ADC 81BC EBC8 13EA" /* i.Ó.ls,¾zܼëÈ.ê */
- $"796B 6056 E9E7 D971 6E09 7086 252C 6A19" /* yk`VéçÙqnÆp†%,j. */
- $"7351 153D F4C4 FE01 6235 917F B203 171A" /* sQ.=ôÄþ.b5‘.²... */
- $"1822 B42B 9226 D163 5572 7E7E C508 BEBA" /* ."´+’&ÑcUr~~Å.¾º */
- $"D0D2 1C24 8D62 565D C183 F78D 4726 0541" /* ÐÒ.$bV]Áƒ÷G&.A */
- $"F829 10C7 1B21 E59C C4E5 7688 6268 FABC" /* ø).Ç.!åœÄåvˆbhú¼ */
- $"C0B9 6C02 8820 3F44 54A7 8C83 F14F 61B8" /* À¹l.ˆ ?DT§ŒƒñOa¸ */
- $"707C AB32 9D59 F01E D18A 37FC 40F9 5C59" /* p|«2Yð.ÑŠ7ü@ù\Y */
- $"EEA8 E442 FDC8 CA73 970F 6EE0 1348 AC8E" /* î¨äBýÈÊs—.nà.H¬Ž */
- $"9D65 4DA9 2820 AEDB A7F3 C1B4 8E3F 8780" /* eM©( ®Û§óÁ´Ž?‡€ */
- $"8DA9 F7D9 F116 DD30 778E 4FB6 49D3 AFE8" /* ©÷Ùñ.Ý0wŽO¶IÓ¯è */
- $"74B1 EB63 92B8 4210 3B22 3613 6784 41A2" /* t±ëc’¸B.;"6.g„A¢ */
- $"5953 1EFF 16A9 1769 9852 73D0 B6C2 3523" /* YS.ÿ.©.i˜RsжÂ5# */
- $"854B 1247 531D 47C5 7AFC 1B6B F0C4 2E2F" /* …K.GS.GÅzü.kðÄ./ */
- $"6C60 82C9 9C4D 2FAD 25A5 BEC6 8590 7388" /* l`‚ÉœM/­%¥¾Æ…sˆ */
- $"5D15 9A65 E013 D48B 7D9C 34B2 A617 75A8" /* ].šeà.Ô‹}œ4²¦.u¨ */
- $"8E8E 2D91 1AEC 26D5 8B9C D03C A02A A829" /* ŽŽ-‘.ì&Õ‹œÐ< *¨) */
- $"738D 9A4E 8F31 82A9 39B7 7CFE D412 810E" /* sšN1‚©9·|þÔ.. */
- $"1372 6D79 8D49 BAC1 9FFB 5D52 56AD 488F" /* .rmyIºÁŸû]RV­H */
- $"4E1D A232 7348 1FE2 483F AB9F A23C 0997" /* N.¢2sH.âH?«Ÿ¢<Æ— */
- $"678D 1AB7 7F66 8927 7DED 2A66 E03B 05C9" /* g.·.f‰'}í*fà;.É */
- $"0420 66A2 E0AE E1B9 259E 64C9 FF0E A7C7" /* . f¢à®á¹%ždÉÿ.§Ç */
- $"5E9D 69F4 DD50 394C 344E 9DA9 6BCA 3D9F" /* ^iôÝP9L4N©kÊ=Ÿ */
- $"8FA9 C156 3248 2310 8AB9 6131 B94F FF36" /* ©ÁV2H#.Š¹a1¹Oÿ6 */
- $"DF00 9E80 5713 E9AD 3B07 879E C876 E063" /* ß.ž€W.é­;.‡žÈvàc */
- $"38D8 2776 3081 5810 1760 927C D93C EE88" /* 8Ø'v0X..`’|Ù<îˆ */
- $"518B 755A EBF1 B276 C65B 98DD 1421 8AA1" /* Q‹uZëñ²vÆ[˜Ý.!Š¡ */
- $"27D2 A8B2 5E3E B7B7 8F73 CDCB 9896 D80F" /* 'Ò¨²^>··s͢–Ø. */
- $"1D50 2E28 4F54 26A9 E68F 822C 3031 0A5B" /* .P.(OT&©æ‚,01Â[ */
- $"213A 8ED8 B1B8 C32C F5EF 6784 3641 A888" /* !:ŽØ±¸Ã,õïg„6A¨ˆ */
- $"1AF9 941B E9B2 42C0 D9BE AAD7 2727 9E13" /* .ù”.é²BÀÙ¾ª×''ž. */
- $"284F A530 1F62 679B 7860 E677 9E24 3663" /* (O¥0.bg›x`æwž$6c */
- $"E7D1 E4B5 D37B C274 9ECB CFA2 CC95 8A75" /* çÑäµÓ{ÂtžËϢ̕Šu */
- $"0C3A FB7D F074 1433 5EC7 1FC4 330E F221" /* .:û}ðt.3^Ç.Ä3.ò! */
- $"AE39 4A04 097F 4B21 27CD C193 39CB 3AB2" /* ®9J.Æ.K!'ÍÁ“9Ë:² */
- $"0B6E D8E0 54EA 0F75 15F9 D75D 0D82 624D" /* .nØàTê.u.ù×].‚bM */
- $"7D19 8E11 1AD0 764F CEA8 F0FE 2913 6841" /* }.Ž..ÐvOΨðþ).hA */
- $"89B8 CA62 C997 34B9 5950 4842 4F13 1ACD" /* ‰¸ÊbÉ—4¹YPHBO..Í */
- $"39AD 30CA 4ED2 A17D 0B09 206B 9426 EF50" /* 9­0ÊNÒ¡}.Æ k”&ïP */
- $"63C6 386E 74BB BDE0 420F 6154 5260 E1A2" /* cÆ8nt»½àB.aTR`ᢠ*/
- $"8546 3192 76D1 1F38 268E 7AC6 049F 321D" /* …F1’vÑ.8&ŽzÆ.Ÿ2. */
- $"CB51 35C7 067C 961B DA2F 4BCB E065 A8DB" /* ËQ5Ç.|–.Ú/KËàe¨Û */
- $"16C9 1F05 ABAF 93FF 333A F049 3161 6838" /* .É..«¯“ÿ3:ðI1ah8 */
- $"6E1A FEF2 564C 3F48 3800 BC9C F009 AF34" /* n.þòVL?H8.¼œðƯ4 */
- $"2241 15D4 764F 4764 CEDF 6D7D 2E9C 8141" /* "A.ÔvOGdÎßm}.œA */
- $"1E00 E109 D827 DDAA A47C 2854 9229 8998" /* ..áÆØ'ݪ¤|(T’)‰˜ */
- $"9175 1FFB 496B 36C7 3695 3631 390B 06E6" /* ‘u.ûIk6Ç6•619..æ */
- $"EB0D 3BA7 F1BE A2FF 6D3A 9FB6 FCFD ADEF" /* ë.;§ñ¾¢ÿm:Ÿ¶üý­ï */
- $"EDBA 3FDB 632F EDB1 BF6D BE7E DB9F 97ED" /* íº?Ûc/í±¿m¾~ÛŸ—í */
- $"45FD AB93 F6E8 7FED A7F7 DAC3 FC34 6F43" /* Eý«“öè.í§÷ÚÃü4oC */
- $"E1DB 5507 762F DB7E 5F51 DDF5 1DFE DD07" /* áÛU.v/Û~_QÝõ.þÝ. */
- $"E1FD A67F B4E6 7EDB 8BF6 AE3F B6BC D3E4" /* áý¦.´æ~Û‹ö®?¶¼Óä */
- $"D00B 0F87 A0FF 2AC3 3F6D 84F8 7475 99F2" /* Ð..‡ ÿ*Ã?m„øtu™ò */
- $"F382 BE95 100F 8FEE C1C8 D086 E345 E973" /* 󂾕..îÁÈІãEés */
- $"0FE4 06B6 7813 7115 B8D0 D91B C698 D10D" /* .ä.¶x.q.¸ÐÙ.ƘÑ. */
- $"A370 844F 9330 E047 0201 F880 D146 6522" /* £p„O“0àG..ø€ÑFe" */
- $"8E52 12DE 3D1A 9231 5315 682E 4706 8685" /* ŽR.Þ=.’1S.h.G.†… */
- $"DA39 C538 9828 7ED0 714F 3E27 532A 3840" /* Ú9Å8˜(~ÐqO>'S*8@ */
- $"C912 3E46 8205 3243 7835 7284 12D6 CCF5" /* É.>F‚.2Cx5r„.ÖÌõ */
- $"36AF 0975 8A27 4F44 3857 B5A3 160D 1391" /* 6¯ÆuŠ'OD8Wµ£...‘ */
- $"8005 2453 86CB 51B3 E493 EA9C 707F 7047" /* €.$S†ËQ³ä“êœp.pG */
- $"1DA8 1386 91D1 6105 7D84 1563 FC52 D5D3" /* .¨.†‘Ña.}„.cüRÕÓ */
- $"EDA7 D4A0 4AC1 BB4E 49D6 62F4 CA92 CE8E" /* í§Ô JÁ»NIÖbôÊ’ÎŽ */
- $"8DE0 84DC 418D ACE2 71AD 9206 3C98 3281" /* à„ÜA¬âq­’.<˜2 */
- $"104E A1F2 8982 6ED6 223E B67B BE6A C51F" /* .N¡ò‰‚nÖ">¶{¾jÅ. */
- $"4BF8 6C35 B6A4 5EC8 87BB 4834 7CF3 16AC" /* Køl5¶¤^ȇ»H4|ó.¬ */
- $"2453 B3DA 3503 94D6 2E70 2B6F 975E 21DB" /* $S³Ú5.”Ö.p+o—^!Û */
- $"F409 0368 9A2E DFB2 7A4B 9A6F 4165 1173" /* ôÆ.hš.ß²zKšoAe.s */
- $"A53E 329A 7925 FB80 9664 2C09 A9E5 715C" /* ¥>2šy%û€–d,Æ©åq\ */
- $"E42F 8E14 EC68 05A8 D565 53C2 9C98 86A2" /* ä/Ž.ìh.¨ÕeSÂœ˜†¢ */
- $"2C2D 6443 A1D0 A619 2320 6CD3 FE48 8006" /* ,-dC¡Ð¦.# lÓþH€. */
- $"FC0F 3690 DF76 1FD8 2E16 0705 D91F EEBE" /* ü.6ßv.Ø....Ù.î¾ */
- $"E961 32B9 E252 4F0E EE4A 6F73 AEBB 014A" /* éa2¹âRO.îJos®».J */
- $"8F45 1551 9123 7C3A 13F8 1B57 EB6A 0AFB" /* E.Q‘#|:.ø.WëjÂû */
- $"9AE9 65F5 9FDE 5F1C 7C23 84F1 6DCD CC52" /* šéeõŸÞ_.|#„ñmÍÌR */
- $"97DD 03E6 C571 0C23 F06B 9F21 2E2C 79D5" /* —Ý.æÅq.#ðkŸ!.,yÕ */
- $"1827 1436 E6FB C5FB BA11 617B 9B32 3DCD" /* .'.6æûÅûº.a{›2=Í */
- $"B0AD AA8F 53D0 2F20 849C D667 9436 A677" /* °­ªSÐ/ „œÖg”6¦w */
- $"38C9 1B5A 26E2 B4D4 29BB 2D9E 56D4 652D" /* 8É.Z&â´Ô)»-žVÔe- */
- $"9A12 FC7E FBD5 0075 3EC9 64FE D0CE 06A2" /* š.ü~ûÕ.u>ÉdþÐÎ.¢ */
- $"B63F 8731 DB8A 6917 26EA CCFC C1E6 10AA" /* ¶?‡1ÛŠi.&êÌüÁæ.ª */
- $"704E 20EA 7518 0416 6BBE 2867 9470 9FE6" /* pN êu...k¾(g”pŸæ */
- $"3D2A D178 6CD1 0B7D E518 4682 FC48 EA03" /* =*ÑxlÑ.}å.F‚üHê. */
- $"EFA0 ADEE B643 CDFD 796D C309 E13B 9DD3" /* ï ­î¶CÍýymÃÆá;Ó */
- $"82CC 1237 8D6B 9CB9 0438 AF1A 6190 136E" /* ‚Ì.7kœ¹.8¯.a.n */
- $"A170 6109 4BA8 FD0B 4C10 DE61 71A9 A5FF" /* ¡paÆK¨ý.L.Þaq©¥ÿ */
- $"5AD1 3895 15D0 912A BC62 5344 A7FD 7B9B" /* ZÑ8•.Б*¼bSD§ý{› */
- $"0360 8C71 DD04 20C7 4685 E6B7 7941 7BD7" /* .`ŒqÝ. ÇF…æ·yA{× */
- $"DBBB 3F61 742B D692 AD3D B778 6442 3DD1" /* Û»?at+Ö’­=·xdB=Ñ */
- $"A97E 1312 9AF4 05C1 7B33 9FE2 B3F5 D16C" /* ©~..šô.Á{3Ÿâ³õÑl */
- $"875D 7109 13EC BB96 0664 DF60 1958 8DE5" /* ‡]qÆ.ì»–.dß`.Xå */
- $"5B3F 3E75 9D21 0415 CE9C 3172 87C7 FF05" /* [?>u!..Îœ1r‡Çÿ. */
- $"F787 4F14 E63B 4DCE 247D B3A3 475C 5336" /* ÷‡O.æ;MÎ$}³£G\S6 */
- $"C794 AF23 6415 68C6 B893 1B16 8C81 3F43" /* Ç”¯#d.hƸ“..Œ?C */
- $"C455 6EB8 8D5A 6919 4C3A D980 BFB1 3699" /* ÄUn¸Zi.L:Ù€¿±6™ */
- $"C790 C7D1 7B05 12AA 803A 172B DEF2 00CC" /* ÇÇÑ{..ª€:.+Þò.Ì */
- $"FF38 62C8 1815 1D3A F60D 2B9B 87A0 05C5" /* ÿ8bÈ...:ö.+›‡ .Å */
- $"3587 0181 8754 06D7 2CFC 78B8 0C65 D5BC" /* 5‡.‡T.×,üx¸.eÕ¼ */
- $"2903 C07C 0631 A0B9 E94E 192F DE4B 4924" /* ).À|.1 ¹éN./ÞKI$ */
- $"A4F0 BB9A 49C5 B751 38EB 7289 9806 FC5C" /* ¤ð»šIÅ·Q8ër‰˜.ü\ */
- $"D822 ED93 CA92 14B6 5056 017F 7826 CDE1" /* Ø"í“Ê’.¶PV..x&Íá */
- $"8401 9F6C A7F7 4AD5 E86F FDC3 05AF 6AE3" /* „.Ÿl§÷JÕèoýÃ.¯jã */
- $"5EED 07E3 E5ED 7EE7 FB97 0B99 E191 605B" /* ^í.ãåí~çû—.™á‘`[ */
- $"955A 6A3C 33C6 2BB8 9562 0E38 09C1 1ED9" /* •Zj<3Æ+¸•b.8ÆÁ.Ù */
- $"8914 73AF E9AA 7B2F 214E 7EEA 98E8 B976" /* ‰.s¯éª{/!N~ê˜è¹v */
- $"E058 E0B5 6DB4 5B1C F212 2C8E 0AE5 7100" /* àXàµm´[.ò.,ŽÂåq. */
- $"BC1E 84CD 0598 7CF9 EA4E 1E96 2B4A DE9E" /* ¼.„Í.˜|ùêN.–+JÞž */
- $"6CE9 E79B 0336 9059 E109 DF83 A2AE 9E74" /* léç›.6YáÆ߃¢®žt */
- $"5BB1 0236 590C 66CD 0658 ECE5 50A2 EDDD" /* [±.6Y.fÍ.XìåP¢íÝ */
- $"D7BB DAF7 548B 7F21 2A40 7821 FDA2 62B6" /* ×»Ú÷T‹.!*@x!ý¢b¶ */
- $"C862 B0B2 96CF 27D5 EC9D F5C8 42D8 F42A" /* Èb°²–Ï'ÕìõÈBØô* */
- $"5962 F21A D191 6744 1AE2 64B4 6744 A1B2" /* Ybò.Ñ‘gD.âd´gD¡² */
- $"7625 FF0D F0CF A1F8 3273 C4B8 FCCE C2BC" /* v%ÿ.ðÏ¡ø2sĸüμ */
- $"EDD5 F0C6 765F 2446 5EF5 2195 04EE C94B" /* íÕðÆv_$F^õ!•.îÉK */
- $"C9C2 4F82 0D0F 6034 3560 64A8 C372 4E17" /* ÉÂO‚..`45`d¨ÃrN. */
- $"D4F6 B2DC 2162 A6DC 9B35 5F36 628E EA58" /* Ôö²Ü!b¦Ü›5_6bŽêX */
- $"B2EF D0B8 79FF 3F60 39DC 34C9 8DD1 C7DA" /* ²ïиyÿ?`9Ü4ÉÑÇÚ */
- $"BFFD 9220 B977 42CD 1F4E 00C7 1A7B F29F" /* ¿ý’ ¹wBÍ.N.Ç.{òŸ */
- $"9738 8D5E 3E5F BA1F D4BD 0592 2006 1216" /* —8^>_º.Ô½.’ ... */
- $"D478 DE72 171A A49D 9C4A 0691 CD59 6FB3" /* ÔxÞr..¤œJ.‘ÍYo³ */
- $"F3C5 B3CD DCC8 5794 133C 85B3 176A 0C6A" /* óųÍÜÈW”.<…³.j.j */
- $"323E C74F 7CE3 4042 38AB E9CA 5700 E39B" /* 2>ÇO|ã@B8«éÊW.ã› */
- $"26D3 62B7 59F8 966D A789 35AA C72D 9943" /* &Ób·Yø–m§‰5ªÇ-™C */
- $"C884 2E53 30B3 D351 EFCC 6BF8 9889 8AB6" /* È„.S0³ÓQïÌkø˜‰Š¶ */
- $"E284 F5A4 64BD F89F 98A4 8082 6292 48EB" /* â„õ¤d½øŸ˜¤€‚b’Hë */
- $"2039 4A80 D5D7 BEFC 2DC1 69A9 F484 9B4E" /* 9J€Õ×¾ü-Ái©ô„›N */
- $"94C9 6E87 31A6 6D4E 23DB 77A9 37D5 CEE9" /* ”Én‡1¦mN#Ûw©7ÕÎé */
- $"10B5 22DB 58B2 3DFB 973A E321 F02A 2985" /* .µ"ÛX²=û—:ã!ð*)… */
- $"AE7E F964 9A23 4B8D 90FD 75F4 9944 3CEB" /* ®~ùdš#Kýuô™D<ë */
- $"C5C5 B0BA DA1C AA0A B59A EFCA 903A 972B" /* ÅÅ°ºÚ.ªÂµšïÊ:—+ */
- $"10E9 2A66 2BAB 3E63 8312 E494 A82C AEE8" /* .é*f+«>cƒ.䔨,®è */
- $"DE3B 902F 4DE5 A934 7FA5 59D8 B355 75C7" /* Þ;/Må©4.¥YسUuÇ */
- $"DC51 6208 6D60 DE89 F04A F698 FC35 5341" /* ÜQb.m`Þ‰ðJö˜ü5SA */
- $"A8C7 894B 5E8F 0638 0F21 36AB 23FF 37BF" /* ¨Ç‰K^.8.!6«#ÿ7¿ */
- $"CA6E C0CE 1C93 9BB1 FEA7 49E8 9BA5 7F32" /* ÊnÀÎ.“›±þ§I蛥.2 */
- $"4C9D C8BA 821C 1E07 F277 BE63 241C D5F6" /* LȺ‚...òw¾c$.Õö */
- $"07CB 7A98 E51E B0FC B312 223C 21BF 5DEE" /* .Ëz˜å.°ü³."<!¿]î */
- $"0229 A0EE 8B90 5918 5910 F6A6 EEB6 503D" /* .) î‹Y.Y.ö¦î¶P= */
- $"8E76 A3B6 E583 FEFF 5B3D F804 F6EE 956E" /* Žv£¶åƒþÿ[=ø.öî•n */
- $"FEE7 D95F 9D05 AE0B 4926 52B4 23C3 D17A" /* þçÙ_.®.I&R´#ÃÑz */
- $"FC0F CC41 1264 0956 8CA2 6A30 C0D0 275F" /* ü.ÌA.dÆVŒ¢j0ÀÐ'_ */
- $"0CE8 C646 CC49 EF38 CC94 8B6C 1737 9636" /* .èÆFÌIï8Ì”‹l.7–6 */
- $"4EA7 0FE7 217B F3F1 A10D 7E49 242E 6F19" /* N§.ç!{óñ¡.~I$.o. */
- $"A8CF 369A 44DE 6C99 A9D4 24DA 6909 62C3" /* ¨Ï6šDÞl™©Ô$ÚiÆbà */
- $"0C4C D4CD D80E 72E6 FF6B A90E 7080 977B" /* .LÔÍØ.ræÿk©.p€—{ */
- $"4BEB 6A2A 72BB 0574 45FB 1E12 6408 C966" /* Këj*r».tEû..d.Éf */
- $"A632 9AC7 E67D 82C9 3FED 1E27 C1FA C47A" /* ¦2šÇæ}‚É?í.'ÁúÄz */
- $"AFCF 5719 3BCA 3975 BE3A 550B 6DC9 91CC" /* ¯ÏW.;Ê9u¾:U.mÉ‘Ì */
- $"F28E 751C 1B20 E7BB 58FF 0D92 2BF7 DE26" /* òŽu.. ç»Xÿ.’+÷Þ& */
- $"DFE3 B230 78F7 C64E ADF8 7741 F45A E3BC" /* ßã²0x÷ÆN­øwAôZã¼ */
- $"5185 1323 1C74 3288 F720 5DB7 B5C9 1EFD" /* Q….#.t2ˆ÷ ]·µÉ.ý */
- $"C844 7159 7047 A9BA 6CA1 403E CE2E 3522" /* ÈDqYpG©ºl¡@>Î.5" */
- $"1088 A628 490C 5F8D 64C4 7E17 CBD3 290D" /* .ˆ¦(I._dÄ~.ËÓ). */
- $"91B1 B073 AD4A BF5B A1E9 6306 3E9A F87E" /* ‘±°s­J¿[¡éc.>šø~ */
- $"2DEC 7390 2CF5 3305 93C2 15DA 7FFF 7FC6" /* -ìs,õ3.“Â.Ú.ÿ.Æ */
- $"0578 C93E BF93 5B69 25D4 E0F9 5726 0D7E" /* .xÉ>¿“[i%ÔàùW&.~ */
- $"9C06 C76B 1BF5 3206 F26C 4F57 6A13 7488" /* œ.Çk.õ2.òlOWj.tˆ */
- $"07F4 1787 316E 19B5 2CB4 D7B8 23EE BF15" /* .ô.‡1n.µ,´×¸#î¿. */
- $"84F7 C141 CE7E 358F F83B 081D 2680 C5CB" /* „÷ÁAÎ~5ø;..&€ÅË */
- $"2002 0FFB D329 10E3 1880 E0F6 29FF 14F6" /* ..ûÓ).ã.€àö)ÿ.ö */
- $"1447 24FF 4BDD 371B 00F3 0334 6FE5 D217" /* .G$ÿKÝ7..ó.4oåÒ. */
- $"8E7D 3CCB EC04 D019 0583 0792 D4F4 59E5" /* Ž}<Ëì.Ð..ƒ.’ÔôYå */
- $"0914 52FB CE7A 2EFD B899 ED16 38FB E1D4" /* Æ.RûÎz.ý¸™í.8ûáÔ */
- $"3312 BAAE 3EF3 45B7 2A77 62F3 4787 8900" /* 3.º®>óE·*wbóG‡‰. */
- $"050D 5A64 92D3 64E7 7950 4234 FCC0 0EC6" /* ..Zd’ÓdçyPB4üÀ.Æ */
- $"004C 8652 616B B5FF 87F6 72D0 400B 9574" /* .L†Rakµÿ‡örÐ@.•t */
- $"7ADD 2EE6 F979 EE70 393F 5E65 09EC 561B" /* zÝ.æùyîp9?^eÆìV. */
- $"2FF4 F6FA 9226 2AA7 C2D2 4517 2258 15C7" /* /ôöú’&*§ÂÒE."X.Ç */
- $"D27E DE80 0000 0009 BB69 0154 3C66 FD24" /* Ò~Þ€...Æ»i.T<fý$ */
- $"D6C1 DFFC 41CF 26FD 27E3 9482 7299 C4A3" /* ÖÁßüAÏ&ý'㔂r™Ä£ */
- $"A4B0 4F99 5ED7 6507 C196 C060 D7BD 7BA6" /* ¤°O™^×e.Á–À`×½{¦ */
- $"A0A2 C1E7 0ECE 98C4 36F0 B006 0526 5FC4" /*  ¢Áç.ΘÄ6ð°..&_Ä */
- $"CDEF A25D CE59 7B6F 507F C409 957F 43E6" /* Íï¢]ÎY{oP.ÄÆ•.Cæ */
- $"20AB C4BE 33C2 E794 46B7 5341 D8C9 5487" /* «Ä¾3Âç”F·SAØÉT‡ */
- $"3000 A3E6 41BE 7D2A B553 6A8D C345 2E1E" /* 0.£æA¾}*µSjÃE.. */
- $"BF55 F536 52DD 101F D6C9 BB65 B7E4 0CFC" /* ¿Uõ6RÝ..ÖÉ»e·ä.ü */
- $"03D7 F641 F641 7A4F 8EE2 BA7A 352C ED91" /* .×öAöAzOŽâºz5,í‘ */
- $"9057 F893 C46F 62F7 A791 A8DE 8A25 BB17" /* Wø“Äob÷§‘¨ÞŠ%». */
- $"F164 F2ED 43E5 A2E2 17E9 C95D DE1C 45F4" /* ñdòíCå¢â.éÉ]Þ.Eô */
- $"3019 8090 809D D124 EE5C B48E 6C92 2A74" /* 0.€€Ñ$î\´Žl’*t */
- $"ACA0 4F0A 1777 70CF EBEC 112A 9035 16AB" /* ¬ OÂ.wpÏëì.*5.« */
- $"B36D 13D6 9F72 69CD E213 F146 6733 BAA3" /* ³m.ÖŸriÍâ.ñFg3º£ */
- $"0080 0000 0000 0000 0001 0151 0AD3 43F0" /* .€.........QÂÓCð */
- $"14A4 0000 61F0 20D9 9F3A 47FC 60A2 4780" /* .¤..að ÙŸ:Gü`¢G€ */
- $"F2D0 2A57 2C4C D349 5B9A 1BE3 0D39 80AD" /* òÐ*W,LÓI[š.ã.9€­ */
- $"72C4 873D 5028 F09E F0F5 700F B776 4B38" /* rć=P(ðžðõp.·vK8 */
- $"4FC6 7D26 AE5D 219E DDCE 4AA3 9AA9 FE19" /* OÆ}&®]!žÝÎJ£š©þ. */
- $"EC25 FEF0 0626 D259 8ECF 0364 6192 A000" /* ì%þð.&ÒYŽÏ.da’ . */
- $"0000 0000 0000 0000 0184 84B4 4FF0 1848" /* .........„„´Oð.H */
- $"4BC2 3700 0000 0000 0000 00B5 DA5E 3FF1" /* KÂ7........µÚ^?ñ */
- $"C9FC 9186 4A80 0000 0000 0000 0000 0000" /* Éü‘†J€.......... */
- $"0510 0FC3 251B 71C0 D918 64A8 0000 0000" /* ...Ã%.qÀÙ.d¨.... */
- $"0000 0000 0000 07E1 1EE1 F164 E11A 319D" /* .......á.áñdá.1 */
- $"3806 659F 8C35 7012 B17E 6096 52F0 8E96" /* 8.eŸŒ5p.±~`–RðŽ– */
- $"1438 1EBF 363A 49C9 51BD 3517 4ADA 7060" /* .8.¿6:IÉQ½5.JÚp` */
- $"0849 8F8B FCEC FD48 0000 54DF 4C0B E043" /* .I‹üìýH..TßL.àC */
- $"F3B6 1CEB 518A F2B1 5A9C 9500 0000 0000" /* ó¶.ëQŠò±Zœ•..... */
- $"0196 C058 0636 AF4B 041F 37EC DE6F 4B4E" /* .–ÀX.6¯K..7ìÞoKN */
- $"291D A2A6 3CB8 9BAC 4B0C 5017 9031 0EF1" /* ).¢¦<¸›¬K.P.1.ñ */
- $"3CF7 F63B 73A1 B4A6 9EA7 0513 C571 8EA8" /* <÷ö;s¡´¦ž§..ÅqŽ¨ */
- $"5D0A 28FC DCB6 D27A 0000 0000 0159 D076" /* ]Â(üܶÒz.....YÐv */
- $"3D1E 84A9 1C76 876E 7B6B 8519 1F9F 01C6" /* =.„©.v‡n{k…..Ÿ.Æ */
- $"1A11 B2A2 4841 4D47 5463 5D18 2AFE 54F5" /* ..²¢HAMGTc].*þTõ */
- $"591E 5FF1 39C7 C0CD 0D20 F366 59DE FE22" /* Y._ñ9ÇÀÍ. ófYÞþ" */
- $"B12C 4608 009D F105 49C8 16B5 417A 6079" /* ±,F..ñ.IÈ.µAz`y */
- $"40B0 7E7A C4B3 83B8 485D 42B1 4000 0000" /* @°~zijƒ¸H]B±@... */
- $"0E9F 0340 5469 49BB 5767 B4BE 47AF 19B3" /* .Ÿ.@TiI»Wg´¾G¯.³ */
- $"4E69 B99F 25DF C3C0 1B9C 5455 41D2 F508" /* Ni¹Ÿ%ßÃÀ.œTUAÒõ. */
- $"9900 1F13 B43E C345 C4B3 C066 8A27 C3D3" /* ™...´>ÃEijÀfŠ'ÃÓ */
- $"7A8A 6368 2F2C 3F2F 5D43 59ED 5E40 9E4F" /* zŠch/,?/]CYí^@žO */
- $"59BB 6A03 B7F8 083A 021D F8F0 79AF 43B0" /* Y»j.·ø.:..øðy¯C° */
- $"2270 F775 B8D8 FB59 371A 8B22 9F0B 55FA" /* "p÷u¸ØûY7.‹"Ÿ.Uú */
- $"C9B1 5565 0914 AA67 2D9E 81B2 60FC 1333" /* ɱUeÆ.ªg-ž²`ü.3 */
- $"318F 21E9 97E4 1400 F69E F709 7AE3 82A5" /* 1!é—ä..öž÷Æzã‚¥ */
- $"C9DE 7D16 1DF8 EDF8 FC5E DB3E FC2A F822" /* ÉÞ}..øíøü^Û>ü*ø" */
- $"886E F247 9BC1 250E 905C 4AF7 4B22 3595" /* ˆnòG›Á%.\J÷K"5• */
- $"0835 2567 EEC1 C4C8 B70D D782 6A22 C9DA" /* .5%gîÁÄÈ·.ׂj"ÉÚ */
- $"ADA3 0370 EED9 E428 E163 963A E6F0 5D4A" /* ­£.pîÙä(ác–:æð]J */
- $"F42A D11F B46D 7FBC 2D87 4274 4756 896E" /* ô*Ñ.´m.¼-‡BtGV‰n */
- $"C489 80C0 62F6 88A8 184A 79BE 3068 A9AF" /* ĉ€Àböˆ¨.Jy¾0h©¯ */
- $"D703 390B 1A76 3136 B799 726A AAA8 C23D" /* ×.9..v16·™rjª¨Â= */
- $"EEB0 E0F1 49E1 A6B7 204F 7BF3 6E44 F25E" /* î°àñIᦷ O{ónDò^ */
- $"7E0A 5125 CA89 B477 15CD 83CC CD21 C6BE" /* ~ÂQ%ʉ´w.̓ÌÍ!ƾ */
- $"F20B 99F3 C30C 5113 2E0A FF7E 1034 1BFF" /* ò.™óÃ.Q..Âÿ~.4.ÿ */
- $"0378 72CF B0EE D132 2A2D 14A9 E37F 6B10" /* .xrÏ°îÑ2*-.©ã.k. */
- $"B5CE 0500 0000 0000 0000 0160 A7E3 A715" /* µÎ.........`§ã§. */
- $"0C13 DE44 025B 9720 0000 0000 0000 0001" /* ..ÞD.[— ........ */
- $"E0F5 5A21 77FB C1F6 EAF0 244A EE78 B6FA" /* àõZ!wûÁöêð$Jîx¶ú */
- $"1769 3D98 AA28 2EB6 9826 A16B D6B8 BA89" /* .i=˜ª(.¶˜&¡kÖ¸º‰ */
- $"26C6 25C9 9E66 FD9C 6D2D FCDA FCB9 6AB2" /* &Æ%Éžfýœm-üÚü¹j² */
- $"B42A 7008 5069 CB61 D530 B47A FCFF 7F95" /* ´*p.PiËaÕ0´züÿ.• */
- $"FA58 2D11 111A 53BF FB17 59E1 63E7 0FAD" /* úX-...S¿û.Yácç.­ */
- $"B016 A862 3107 8DF0 7112 DD6A B6E3 2477" /* °.¨b1.ðq.Ýj¶ã$w */
- $"3162 94F0 6826 75B0 D0B8 4C13 21C7 E4BC" /* 1b”ðh&u°Ð¸L.!Çä¼ */
- $"FB86 7A83 DF1C A4D9 C3B4 E3DE C334 1633" /* û†zƒß.¤ÙôãÞÃ4.3 */
- $"DC27 76B9 7ADF 50CA F95E C7C9 D5EB 402C" /* Ü'v¹zßPÊù^ÇÉÕë@, */
- $"276F A0B0 D88B CF4A 0FD2 380A E3E7 2BA5" /* 'o °Ø‹ÏJ.Ò8Âãç+¥ */
- $"DD24 A247 B631 75B1 6D3A 4C60 9BAB E4C5" /* Ý$¢G¶1u±m:L`›«äÅ */
- $"BBCB 2972 36B9 AC74 5FF5 B5DB 231B 95F3" /* »Ë)r6¹¬t_õµÛ#.•ó */
- $"7CFF 8E5F 86E9 1906 B3DF 75C7 0364 6192" /* |ÿŽ_†é..³ßuÇ.da’ */
- $"A000 0000 0000 0000 0000 003B B1A0 0000" /*  ..........;± .. */
- $"0000 0000 0000 0000 0000 0016 D51B CEEA" /* ............Õ.Îê */
- $"0406 C003 4E50 C0B8 8DB2 F37C FF8E 5F86" /* ..À.NPÀ¸²ó|ÿŽ_† */
- $"E919 06B3 DF75 C703 6461 92A0 0000 0000" /* é..³ßuÇ.da’ .... */
- $"0000 0000 0000 3BB1 A000 0000 0000 0000" /* ......;± ....... */
- $"0000 0000 0000 16D5 1BCE EA04 06C0 034E" /* .......Õ.Îê..À.N */
- $"50C0 B88D B2F4 4BED 0C57 2F64 38E7 DFE6" /* PÀ¸²ôKí.W/d8çßæ */
- $"95DB 93EF B9ED 1250 6A6A A6E3 4478 1E7E" /* •Û“ï¹í.Pjj¦ãDx.~ */
- $"F105 8E1B 961B 230C 9500 0000 0000 0C18" /* ñ.Ž.–.#.•....... */
- $"0EA3 5F13 6306 E1B5 4B22 3D26 79A1 06E4" /* .£_.c.áµK"=&y¡.ä */
- $"228F F320 0B74 8820 0000 0000 0000 0007" /* "ó .tˆ ........ */
- $"9F62 443B 9A51 EAB0 7C1A A374 E7F1 52F3" /* ŸbD;šQê°|.£tçñRó */
- $"3BB8 C1E0 5919 6C04 A2E2 1032 6917 1394" /* ;¸ÁàY.l.¢â.2i..” */
- $"CCBE 472A 0652 C144 6D1E 755C ECF9 9725" /* ̾G*.RÁDm.u\ìù—% */
- $"A84A 55AE 7A0E 6730 FCA7 B6E0 FF31 08C0" /* ¨JU®z.g0ü§¶àÿ1.À */
- $"3E76 4DDC 9E24 A60B C4A7 4CDD C221 1941" /* >vMÜž$¦.ħLÝÂ!.A */
- $"0810 2DE3 206F C551 4910 77AA 762A 1FF2" /* ..-ã oÅQI.wªv*.ò */
- $"D39A 0ADC 1089 90F8 D098 1E77 BDD1 AF74" /* ÓšÂÜ.‰øИ.w½Ñ¯t */
- $"4DEF D00D 0B2C CA2F 9EDC 27C4 35F9 F924" /* MïÐ..,Ê/žÜ'Ä5ùù$ */
- $"67FF 74E5 A746 B627 6267 F6D0 9B94 22D4" /* gÿtå§F¶'bgöЛ”"Ô */
- $"5FFE DF67 A7A9 E3CA 02A5 44D1 E926 DCA4" /* _þßg§©ãÊ.¥DÑé&ܤ */
- $"7490 4AB8 E094 7037 FF7C 8CF7 2A9B B784" /* tJ¸à”p7ÿ|Œ÷*›·„ */
- $"794E 9026 D48F FF7F F013 AABF F874 63DA" /* yN&Ôÿ.ð.ª¿øtcÚ */
- $"0302 FBFA AA6A 31D5 E2DF 85F7 2ACD D98C" /* ..ûúªj1Õâß…÷*ÍÙŒ */
- $"175D 1243 F1C0 CEA2 344C B6FC ADCF C6AA" /* .].CñÀ΢4L¶ü­Ïƪ */
- $"5CAE FA82 783F 58DD 754D 5C63 A018 19F8" /* \®ú‚x?XÝuM\c ..ø */
- $"7EFE 8953 AE16 22B9 4ED7 43D2 8A0B FA52" /* ~þ‰S®."¹N×CÒŠ.úR */
- $"5703 08CA 555B E51E 307B 0565 E165 22F3" /* W..ÊU[å.0{.eáe"ó */
- $"7130 0CEC CA23 576D 8D58 BED1 FEB6 9A2F" /* q0.ìÊ#WmX¾Ñþ¶š/ */
- $"DCEA 3288 3EEC B12A D43C B191 2627 7723" /* Üê2ˆ>ì±*Ô<±‘&'w# */
- $"F40F 1B7A F1E3 9A7E 366D 7490 EE80 3570" /* ô..zñãš~6mtî€5p */
- $"CB59 D05D F384 AA96 71FE 68E8 4D32 F9D2" /* ËYÐ]󄪖qþhèM2ùÒ */
- $"48BC 7B03 EA3B 879E 2E96 671F 8098 CE76" /* H¼{.ê;‡ž.–g.€˜Îv */
- $"87D8 0336 5C88 91F4 3C69 D76B 4DEF 29DA" /* ‡Ø.6\ˆ‘ô<i×kMï)Ú */
- $"F378 1035 720A CE61 C2E3 5776 CA53 F43B" /* óx.5rÂÎaÂãWvÊSô; */
- $"4FCB 79E4 5164 1270 A23E 6048 2089 7B12" /* OËyäQd.p¢>`H ‰{. */
- $"BCA8 E157 DFD5 E879 C14C 1B1A 3431 2856" /* ¼¨áWßÕèyÁL..41(V */
- $"0E74 D87F 7691 A923 632A 5EBC 6E95 6A46" /* .tØ.v‘©#c*^¼n•jF */
- $"8E68 7118 3704 6E41 37CB C9AC 7F84 1005" /* Žhq.7.nA7Ëɬ.„.. */
- $"C308 7C90 C6E0 B56C 8CF8 3C33 A97E C46C" /* Ã.|ÆàµlŒø<3©~Äl */
- $"E373 91A9 4A3F 7331 481D 843F 0472 59DC" /* ãs‘©J?s1H.„?.rYÜ */
- $"0837 85BA 4867 C202 6BFC 7433 F093 530F" /* .7…ºHgÂ.küt3ð“S. */
- $"D721 8927 26CF AA6B B4E1 7981 FCE4 9F4E" /* ×!‰'&Ϫk´áyüäŸN */
- $"1105 9E7B 7F68 1CE7 D811 E270 FCA3 9CDE" /* ..ž{.h.çØ.âpü£œÞ */
- $"BFE6 48BA AC07 B55E 4E7F 5946 115B B1DC" /* ¿æHº¬.µ^N.YF.[±Ü */
- $"F694 3A9B EADD 7971 E0F1 B6E1 C6FF 4337" /* ö”:›êÝyqàñ¶áÆÿC7 */
- $"F543 A074 FC74 AD1F 45BF 7867 C472 7605" /* õC tüt­.E¿xgÄrv. */
- $"1786 E496 2D22 22BE 5760 9ACE A5C9 22B9" /* .†ä–-""¾W`šÎ¥É"¹ */
- $"9A14 4136 93E4 3E4A 715C 6F69 8447 5764" /* š.A6“ä>Jq\oi„GWd */
- $"D761 77A8 2C3F E200 ACAD 8331 11D0 ABE6" /* ×aw¨,?â.¬­ƒ1.Ыæ */
- $"EA7B 5A22 58CF 097E 732F 894B E99C 6BAF" /* ê{Z"XÏÆ~s/‰Kéœk¯ */
- $"B36C 68AA 5668 EF92 66E9 DDF9 FF78 DB89" /* ³lhªVhï’féÝùÿxÛ‰ */
- $"FC78 2032 99D9 62F0 1380 3FE8 41DF F341" /* üx 2™Ùbð.€?èAßóA */
- $"F1FD 7F08 CE2E F09A 9335 6735 0FAD 8093" /* ñý..Î.ðš“5g5.­€“ */
- $"B6B1 53A2 964F EA7E 72A2 9A29 794D 98F0" /* ¶±S¢–Oê~r¢š)yM˜ð */
- $"DD57 AE65 C61E DDEC BDB4 35C2 D050 E063" /* ÝW®eÆ.Ýì½´5ÂÐPàc */
- $"5F54 BCA5 928D 786D CAE3 8F96 BFEB 027E" /* _T¼¥’xmÊã–¿ë.~ */
- $"6BBC 8795 7C88 1A2C 9908 36A1 6CAB 9268" /* k¼‡•|ˆ.,™.6¡l«’h */
- $"EB0D 816F F34D 55F5 B562 BCFF 4190 EE42" /* ë.oóMUõµb¼ÿAîB */
- $"F195 E7F3 E220 7E51 74A2 FA23 23F7 20F0" /* ñ•çóâ ~Qt¢ú##÷ ð */
- $"985F 011C 34B8 C988 C519 C623 81BC D026" /* ˜_..4¸ÉˆÅ.Æ#¼Ð& */
- $"A8C5 B82C 7A7F 86F7 E60E 44F2 CD53 6FAB" /* ¨Å¸,z.†÷æ.DòÍSo« */
- $"2D69 1FD4 75B7 A011 80E7 09B3 B9CF 4503" /* -i.Ôu· .€çƳ¹ÏE. */
- $"F4A5 1DE3 AE8A 96F7 E245 0DF9 3859 24FA" /* ô¥.㮊–÷âE.ù8Y$ú */
- $"7B43 665F B15E D4D3 FB2A 666E FB6A 6CA8" /* {Cf_±^ÔÓû*fnûjl¨ */
- $"9CAF C052 D658 6DC3 BDD1 C752 21FA 6426" /* œ¯ÀRÖXmýÑÇR!úd& */
- $"857C D05D 41C2 0241 306C 6FD4 81E3 69F7" /* …|Ð]AÂ.A0loÔãi÷ */
- $"A6F5 227F 39F9 780E 829A 17A9 C649 2BF5" /* ¦õ".9ùx.‚š.©ÆI+õ */
- $"01DD E500 A973 E599 890C A548 CE34 2877" /* .Ýå.©s噉.¥HÎ4(w */
- $"D160 A2EE 4B3B CC7A 0C87 6723 51FD C222" /* Ñ`¢îK;Ìz.‡g#QýÂ" */
- $"9BFB E72D 2769 6250 2054 22C9 ABB2 3125" /* ›ûç-'ibP T"É«²1% */
- $"7DA0 73A3 C083 1AAD 90F2 F0A8 C22D 9DF5" /* } s£Àƒ.­òð¨Â-õ */
- $"3FFB 6B56 18BE 61A6 B198 F1BC 1E4E 0CFE" /* ?ûkV.¾a¦±˜ñ¼.N.þ */
- $"B323 8275 A644 CAC4 D36B 9AF9 FCC8 5DEC" /* ³#‚u¦DÊÄÓkšùüÈ]ì */
- $"292B CC9B A0B6 9148 09DF E46D 1B2C 4EDF" /* )+Ì› ¶‘HÆßäm.,Nß */
- $"EDB9 2DB4 BAD5 C50B 2115 C476 E09A F407" /* í¹-´ºÕÅ.!.Ävàšô. */
- $"5EE8 2E9F 870F A319 32D4 EBEC CB7B FDE9" /* ^è.Ÿ‡.£.2ÔëìË{ýé */
- $"FB5C 0D41 61F3 BA97 0F9E 558F 6E39 C213" /* û\.Aaóº—.žUn9Â. */
- $"3101 A5E8 ECEC 15E5 4F29 F69A 58CD D82D" /* 1.¥èìì.åO)öšXÍØ- */
- $"986E E8E0 6898 17CC 98C4 C851 AC75 9306" /* ˜nèàh˜.̘ÄÈQ¬u“. */
- $"5241 0350 E2EB 38CA 1682 6132 FF45 578A" /* RA.Pâë8Ê.‚a2ÿEWŠ */
- $"FA7F 7557 AC2C 9A18 3835 A62B 7D09 0992" /* ú.uW¬,š.85¦+}ÆÆ’ */
- $"EF78 BD49 5317 373A B07D 6420 DC30 5067" /* ïx½IS.7:°}d Ü0Pg */
- $"A659 F316 4436 8E8E 9786 1163 A6A5 B841" /* ¦Yó.D6ŽŽ—†.c¦¥¸A */
- $"99AA 4E1C 6163 309A 3C23 0208 FF4B 2967" /* ™ªN.ac0š<#..ÿK)g */
- $"B7F7 37E4 A337 D0DC C48A A742 FB2D C529" /* ·÷7ä£7ÐÜÄŠ§Bû-Å) */
- $"BC6C 5BBE BC5C 03B1 F87F D7EA F5AC B94B" /* ¼l[¾¼\.±ø.×êõ¬¹K */
- $"5A88 84AB E44E BE6A F337 96B0 7CB6 1140" /* Zˆ„«äN¾jó7–°|¶.@ */
- $"25CB 45D6 BE02 A9D4 7868 1EDD F660 7963" /* %ËEÖ¾.©Ôxh.Ýö`yc */
- $"B438 C030 3EA5 51FA F451 FA84 A6FF 2E5A" /* ´8À0>¥QúôQú„¦ÿ.Z */
- $"EA95 2300 C0F4 39AA 42BA 4120 4EEC AFDD" /* ê•#.Àô9ªBºA Nì¯Ý */
- $"20B4 6C42 0552 1177 6F1A AC6D FE8B 98E1" /* ´lB.R.wo.¬mþ‹˜á */
- $"D3FB F52E BCE3 5BB1 7235 F597 3E0D 8C46" /* Óûõ.¼ã[±r5õ—>.ŒF */
- $"7361 1E2A C081 CA97 C8EA CD3F E91D 823F" /* sa.*ÀÊ—ÈêÍ?é.‚? */
- $"73A7 5EA1 F641 9CBD 219D D7E4 EE0D 270E" /* s§^¡öAœ½!×äî.'. */
- $"14DF F756 B4E5 062C 8251 4AD0 B090 A0AF" /* .ß÷V´å.,‚QJа ¯ */
- $"CD2A 3C80 6068 C9CD C3D7 3D7F 258B 365A" /* Í*<€`hÉÍÃ×=.%‹6Z */
- $"5E1A 90DC D058 4ED9 DF50 6F40 07A9 2BDE" /* ^.ÜÐXNÙßPo@.©+Þ */
- $"8486 5404 AB9C E323 0C4E D3DB 8352 0C0F" /* „†T.«œã#.NÓÛƒR.. */
- $"CD59 A5F5 56CC 0BB2 B603 85C3 C709 7D6E" /* ÍY¥õVÌ.²¶.…ÃÇÆ}n */
- $"A10E 33C2 AE0F D52F 5AD7 2279 E6EB 7E6C" /* ¡.3®.Õ/Z×"yæë~l */
- $"1757 589D C6DC B4FD 470C FFD9" /* .WXÆÜ´ýG.ÿÙ */
-};
-
diff --git a/indra/newview/installers/darwin/releasecandidate-dmg/_DS_Store b/indra/newview/installers/darwin/releasecandidate-dmg/_DS_Store
deleted file mode 100644
index 495ec37f53..0000000000
--- a/indra/newview/installers/darwin/releasecandidate-dmg/_DS_Store
+++ /dev/null
Binary files differ
diff --git a/indra/newview/installers/darwin/releasecandidate-dmg/_VolumeIcon.icns b/indra/newview/installers/darwin/releasecandidate-dmg/_VolumeIcon.icns
deleted file mode 100644
index da5307e389..0000000000
--- a/indra/newview/installers/darwin/releasecandidate-dmg/_VolumeIcon.icns
+++ /dev/null
Binary files differ
diff --git a/indra/newview/installers/darwin/releasecandidate-dmg/background.jpg b/indra/newview/installers/darwin/releasecandidate-dmg/background.jpg
deleted file mode 100644
index 55294dcc9a..0000000000
--- a/indra/newview/installers/darwin/releasecandidate-dmg/background.jpg
+++ /dev/null
Binary files differ
diff --git a/indra/newview/installers/windows/installer_template.nsi b/indra/newview/installers/windows/installer_template.nsi
index 4e8ed807ee..8a6114f0d5 100644
--- a/indra/newview/installers/windows/installer_template.nsi
+++ b/indra/newview/installers/windows/installer_template.nsi
@@ -1,840 +1,1036 @@
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; secondlife setup.nsi
-;; Copyright 2004-2010, Linden Research, Inc.
-;;
-;; NSIS Unicode 2.38.1 or higher required
-;; http://www.scratchpaper.com/
-;;
-;; Author: James Cook, Don Kjer, Callum Prentice
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; Compiler flags
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-SetOverwrite on ; overwrite files
-SetCompress auto ; compress iff saves space
-SetCompressor /solid lzma ; compress whole installer as one block
-SetDatablockOptimize off ; only saves us 0.1%, not worth it
-XPStyle on ; add an XP manifest to the installer
-RequestExecutionLevel admin ; on Vista we must be admin because we write to Program Files
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Project flags
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-%%VERSION%%
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; - language files - one for each language (or flavor thereof)
-;; (these files are in the same place as the nsi template but the python script generates a new nsi file in the
-;; application directory so we have to add a path to these include files)
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-!include "%%SOURCE%%\installers\windows\lang_da.nsi"
-!include "%%SOURCE%%\installers\windows\lang_de.nsi"
-!include "%%SOURCE%%\installers\windows\lang_en-us.nsi"
-!include "%%SOURCE%%\installers\windows\lang_es.nsi"
-!include "%%SOURCE%%\installers\windows\lang_fr.nsi"
-!include "%%SOURCE%%\installers\windows\lang_ja.nsi"
-!include "%%SOURCE%%\installers\windows\lang_it.nsi"
-!include "%%SOURCE%%\installers\windows\lang_ko.nsi"
-!include "%%SOURCE%%\installers\windows\lang_nl.nsi"
-!include "%%SOURCE%%\installers\windows\lang_pl.nsi"
-!include "%%SOURCE%%\installers\windows\lang_pt-br.nsi"
-!include "%%SOURCE%%\installers\windows\lang_zh.nsi"
-
-# *TODO: Move these into the language files themselves
-LangString LanguageCode ${LANG_DANISH} "da"
-LangString LanguageCode ${LANG_GERMAN} "de"
-LangString LanguageCode ${LANG_ENGLISH} "en"
-LangString LanguageCode ${LANG_SPANISH} "es"
-LangString LanguageCode ${LANG_FRENCH} "fr"
-LangString LanguageCode ${LANG_JAPANESE} "ja"
-LangString LanguageCode ${LANG_ITALIAN} "it"
-LangString LanguageCode ${LANG_KOREAN} "ko"
-LangString LanguageCode ${LANG_DUTCH} "nl"
-LangString LanguageCode ${LANG_POLISH} "pl"
-LangString LanguageCode ${LANG_PORTUGUESEBR} "pt"
-LangString LanguageCode ${LANG_SIMPCHINESE} "zh"
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; Tweak for different servers/builds (this placeholder is replaced by viewer_manifest.py)
-;; For example:
-;; !define INSTFLAGS "%(flags)s"
-;; !define INSTNAME "SecondLife%(grid_caps)s"
-;; !define SHORTCUT "Second Life (%(grid_caps)s)"
-;; !define URLNAME "secondlife%(grid)s"
-;; !define UNINSTALL_SETTINGS 1
-
-%%GRID_VARS%%
-
-Name ${INSTNAME}
-
-SubCaption 0 $(LicenseSubTitleSetup) ; override "license agreement" text
-
-BrandingText " " ; bottom of window text
-Icon %%SOURCE%%\installers\windows\install_icon.ico
-UninstallIcon %%SOURCE%%\installers\windows\uninstall_icon.ico
-WindowIcon on ; show our icon in left corner
-BGGradient off ; no big background window
-CRCCheck on ; make sure CRC is OK
-InstProgressFlags smooth colored ; new colored smooth look
-ShowInstDetails nevershow ; no details, no "show" button
-SetOverwrite on ; stomp files by default
-AutoCloseWindow true ; after all files install, close window
-
-InstallDir "$PROGRAMFILES\${INSTNAME}"
-InstallDirRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\${INSTNAME}" ""
-DirText $(DirectoryChooseTitle) $(DirectoryChooseSetup)
-Page directory dirPre
-Page instfiles
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Variables
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-Var INSTPROG
-Var INSTEXE
-Var INSTFLAGS
-Var INSTSHORTCUT
-Var COMMANDLINE ; command line passed to this installer, set in .onInit
-Var SHORTCUT_LANG_PARAM ; "--set InstallLanguage de", passes language to viewer
-Var SKIP_DIALOGS ; set from command line in .onInit. autoinstall
- ; GUI and the defaults.
-
-;;; Function definitions should go before file includes, because calls to
-;;; DLLs like LangDLL trigger an implicit file include, so if that call is at
-;;; the end of this script NSIS has to decompress the whole installer before
-;;; it can call the DLL function. JC
-
-!include "FileFunc.nsh" ; For GetParameters, GetOptions
-!insertmacro GetParameters
-!insertmacro GetOptions
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; After install completes, launch app
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-Function .onInstSuccess
- Push $R0 # Option value, unused
-
- StrCmp $SKIP_DIALOGS "true" label_launch
-
- ${GetOptions} $COMMANDLINE "/AUTOSTART" $R0
- # If parameter was there (no error) just launch
- # Otherwise ask
- IfErrors label_ask_launch label_launch
-
-label_ask_launch:
- # Don't launch by default when silent
- IfSilent label_no_launch
- MessageBox MB_YESNO $(InstSuccesssQuestion) \
- IDYES label_launch IDNO label_no_launch
-
-label_launch:
- # Assumes SetOutPath $INSTDIR
- Exec '"$INSTDIR\$INSTEXE" $INSTFLAGS $SHORTCUT_LANG_PARAM'
-label_no_launch:
- Pop $R0
-FunctionEnd
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Pre-directory page callback
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-Function dirPre
- StrCmp $SKIP_DIALOGS "true" 0 +2
- Abort
-FunctionEnd
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-; Make sure we're not on Windows 98 / ME
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-Function CheckWindowsVersion
- DetailPrint "Checking Windows version..."
- Call GetWindowsVersion
- Pop $R0
- ; Just get first two characters, ignore 4.0 part of "NT 4.0"
- StrCpy $R0 $R0 2
- ; Blacklist certain OS versions
- StrCmp $R0 "95" win_ver_bad
- StrCmp $R0 "98" win_ver_bad
- StrCmp $R0 "ME" win_ver_bad
- StrCmp $R0 "NT" win_ver_bad
- Return
-win_ver_bad:
- StrCmp $SKIP_DIALOGS "true" +2 ; If skip_dialogs is set just install
- MessageBox MB_YESNO $(CheckWindowsVersionMB) IDNO win_ver_abort
- Return
-win_ver_abort:
- Quit
-FunctionEnd
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-; Make sure the user can install/uninstall
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-Function CheckIfAdministrator
- DetailPrint $(CheckAdministratorInstDP)
- UserInfo::GetAccountType
- Pop $R0
- StrCmp $R0 "Admin" lbl_is_admin
- MessageBox MB_OK $(CheckAdministratorInstMB)
- Quit
-lbl_is_admin:
- Return
-FunctionEnd
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-Function un.CheckIfAdministrator
- DetailPrint $(CheckAdministratorUnInstDP)
- UserInfo::GetAccountType
- Pop $R0
- StrCmp $R0 "Admin" lbl_is_admin
- MessageBox MB_OK $(CheckAdministratorUnInstMB)
- Quit
-lbl_is_admin:
- Return
-FunctionEnd
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-; Checks to see if the current version has already been installed (according to the registry).
-; If it has, allow user to bail out of install process.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-Function CheckIfAlreadyCurrent
- Push $0
- ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Version"
- StrCmp $0 ${VERSION_LONG} 0 continue_install
- StrCmp $SKIP_DIALOGS "true" continue_install
- MessageBox MB_OKCANCEL $(CheckIfCurrentMB) /SD IDOK IDOK continue_install
- Quit
-continue_install:
- Pop $0
- Return
-FunctionEnd
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-; Close the program, if running. Modifies no variables.
-; Allows user to bail out of install process.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-Function CloseSecondLife
- Push $0
- FindWindow $0 "Second Life" ""
- IntCmp $0 0 DONE
-
- StrCmp $SKIP_DIALOGS "true" CLOSE
- MessageBox MB_OKCANCEL $(CloseSecondLifeInstMB) IDOK CLOSE IDCANCEL CANCEL_INSTALL
-
- CANCEL_INSTALL:
- Quit
-
- CLOSE:
- DetailPrint $(CloseSecondLifeInstDP)
- SendMessage $0 16 0 0
-
- LOOP:
- FindWindow $0 "Second Life" ""
- IntCmp $0 0 DONE
- Sleep 500
- Goto LOOP
-
- DONE:
- Pop $0
- Return
-FunctionEnd
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-; Test our connection to secondlife.com
-; Also allows us to count attempted installs by examining web logs.
-; *TODO: Return current SL version info and have installer check
-; if it is up to date.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-Function CheckNetworkConnection
- Push $0
- Push $1
- Push $2 # Option value for GetOptions
- DetailPrint $(CheckNetworkConnectionDP)
- ; Look for a tag value from the stub installer, used for statistics
- ; to correlate installs. Default to "" if not found on command line.
- StrCpy $2 ""
- ${GetOptions} $COMMANDLINE "/STUBTAG=" $2
- GetTempFileName $0
- !define HTTP_TIMEOUT 5000 ; milliseconds
- ; Don't show secondary progress bar, this will be quick.
- NSISdl::download_quiet \
- /TIMEOUT=${HTTP_TIMEOUT} \
- "http://install.secondlife.com/check/?stubtag=$2&version=${VERSION_LONG}" \
- $0
- Pop $1 ; Return value, either "success", "cancel" or an error message
- ; MessageBox MB_OK "Download result: $1"
- ; Result ignored for now
- ; StrCmp $1 "success" +2
- ; DetailPrint "Connection failed: $1"
- Delete $0 ; temporary file
- Pop $2
- Pop $1
- Pop $0
- Return
-FunctionEnd
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-; Delete files in Documents and Settings\<user>\SecondLife\cache
-; Delete files in Documents and Settings\All Users\SecondLife\cache
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;Function RemoveCacheFiles
-;
-;; Delete files in Documents and Settings\<user>\SecondLife
-;Push $0
-;Push $1
-;Push $2
-; DetailPrint $(RemoveCacheFilesDP)
-;
-; StrCpy $0 0 ; Index number used to iterate via EnumRegKey
-;
-; LOOP:
-; EnumRegKey $1 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" $0
-; StrCmp $1 "" DONE ; no more users
-;
-; ReadRegStr $2 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\$1" "ProfileImagePath"
-; StrCmp $2 "" CONTINUE 0 ; "ProfileImagePath" value is missing
-;
-; ; Required since ProfileImagePath is of type REG_EXPAND_SZ
-; ExpandEnvStrings $2 $2
-;
-; ; When explicitly uninstalling, everything goes away
-; RMDir /r "$2\Application Data\SecondLife\cache"
-;
-; CONTINUE:
-; IntOp $0 $0 + 1
-; Goto LOOP
-; DONE:
-;Pop $2
-;Pop $1
-;Pop $0
-;
-;; Delete files in Documents and Settings\All Users\SecondLife
-;Push $0
-; ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" "Common AppData"
-; StrCmp $0 "" +2
-; RMDir /r "$0\SecondLife\cache"
-;Pop $0
-;
-;; Delete filse in C:\Windows\Application Data\SecondLife
-;; If the user is running on a pre-NT system, Application Data lives here instead of
-;; in Documents and Settings.
-;RMDir /r "$WINDIR\Application Data\SecondLife\cache"
-;
-;FunctionEnd
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Delete the installed shader files
-;;; Since shaders are in active development, we'll likely need to shuffle them
-;;; around a bit from build to build. This ensures that shaders that we move
-;;; or rename in the dev tree don't get left behind in the install.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-Function RemoveOldShaders
-
-;; Remove old shader files first so fallbacks will work. see DEV-5663
-RMDir /r "$INSTDIR\app_settings\shaders\*"
-
-FunctionEnd
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Delete the installed XUI files
-;;; We've changed the directory hierarchy for skins, putting all XUI and texture
-;;; files under a specific skin directory, i.e. skins/default/xui/en-us as opposed
-;;; to skins/xui/en-us. Need to clean up the old path when upgrading
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-Function RemoveOldXUI
-
-;; remove old XUI and texture files
-RmDir /r "$INSTDIR\skins\html"
-RmDir /r "$INSTDIR\skins\xui"
-RmDir /r "$INSTDIR\skins\textures"
-Delete "$INSTDIR\skins\*.txt"
-
-FunctionEnd
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Remove any releasenotes files.
-;;; We are no longer including release notes with the viewer. This will delete
-;;; any that were left behind by an older installer. Delete will not fail if
-;;; the files do not exist
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-Function RemoveOldReleaseNotes
-
-;; remove releasenotes.txt file from application directory, and the shortcut
-;; from the start menu.
-Delete "$SMPROGRAMS\$INSTSHORTCUT\SL Release Notes.lnk"
-Delete "$INSTDIR\releasenotes.txt"
-
-FunctionEnd
-
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-; Delete files in Documents and Settings\<user>\SecondLife
-; Delete files in Documents and Settings\All Users\SecondLife
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-Function un.DocumentsAndSettingsFolder
-
-; Delete files in Documents and Settings\<user>\SecondLife
-Push $0
-Push $1
-Push $2
-
- DetailPrint "Deleting files in Documents and Settings folder"
-
- StrCpy $0 0 ; Index number used to iterate via EnumRegKey
-
- LOOP:
- EnumRegKey $1 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" $0
- StrCmp $1 "" DONE ; no more users
-
- ReadRegStr $2 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\$1" "ProfileImagePath"
- StrCmp $2 "" CONTINUE 0 ; "ProfileImagePath" value is missing
-
- ; Required since ProfileImagePath is of type REG_EXPAND_SZ
- ExpandEnvStrings $2 $2
-
- ; If uninstalling a normal install remove everything
- ; Otherwise (preview/dmz etc) just remove cache
- StrCmp $INSTFLAGS "" RM_ALL RM_CACHE
- RM_ALL:
- RMDir /r "$2\Application Data\SecondLife"
- RM_CACHE:
- # Local Settings directory is the cache, there is no "cache" subdir
- RMDir /r "$2\Local Settings\Application Data\SecondLife"
- # Vista version of the same
- RMDir /r "$2\AppData\Local\SecondLife"
- Delete "$2\Application Data\SecondLife\user_settings\settings_windlight.xml"
-
- CONTINUE:
- IntOp $0 $0 + 1
- Goto LOOP
- DONE:
-
-Pop $2
-Pop $1
-Pop $0
-
-; Delete files in Documents and Settings\All Users\SecondLife
-Push $0
- ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" "Common AppData"
- StrCmp $0 "" +2
- RMDir /r "$0\SecondLife"
-Pop $0
-
-; Delete filse in C:\Windows\Application Data\SecondLife
-; If the user is running on a pre-NT system, Application Data lives here instead of
-; in Documents and Settings.
-RMDir /r "$WINDIR\Application Data\SecondLife"
-
-FunctionEnd
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-; Close the program, if running. Modifies no variables.
-; Allows user to bail out of uninstall process.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-Function un.CloseSecondLife
- Push $0
- FindWindow $0 "Second Life" ""
- IntCmp $0 0 DONE
- MessageBox MB_OKCANCEL $(CloseSecondLifeUnInstMB) IDOK CLOSE IDCANCEL CANCEL_UNINSTALL
-
- CANCEL_UNINSTALL:
- Quit
-
- CLOSE:
- DetailPrint $(CloseSecondLifeUnInstDP)
- SendMessage $0 16 0 0
-
- LOOP:
- FindWindow $0 "Second Life" ""
- IntCmp $0 0 DONE
- Sleep 500
- Goto LOOP
-
- DONE:
- Pop $0
- Return
-FunctionEnd
-
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;
-; Delete the stored password for the current Windows user
-; DEV-10821 -- Unauthorised user can gain access to an SL account after a real user has uninstalled
-;
-Function un.RemovePassword
-
-DetailPrint "Removing Second Life password"
-
-SetShellVarContext current
-Delete "$APPDATA\SecondLife\user_settings\password.dat"
-SetShellVarContext all
-
-FunctionEnd
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Delete the installed files
-;;; This deletes the uninstall executable, but it works
-;;; because it is copied to temp directory before running
-;;;
-;;; Note: You must list all files here, because we only
-;;; want to delete our files, not things users left in the
-;;; application directories.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-Function un.ProgramFiles
-
-;; Remove mozilla file first so recursive directory deletion doesn't get hung up
-Delete "$INSTDIR\app_settings\mozilla\components"
-
-;; This placeholder is replaced by the complete list of files to uninstall by viewer_manifest.py
-%%DELETE_FILES%%
-
-;; Optional/obsolete files. Delete won't fail if they don't exist.
-Delete "$INSTDIR\dronesettings.ini"
-Delete "$INSTDIR\message_template.msg"
-Delete "$INSTDIR\newview.pdb"
-Delete "$INSTDIR\newview.map"
-Delete "$INSTDIR\SecondLife.pdb"
-Delete "$INSTDIR\SecondLife.map"
-Delete "$INSTDIR\comm.dat"
-Delete "$INSTDIR\*.glsl"
-Delete "$INSTDIR\motions\*.lla"
-Delete "$INSTDIR\trial\*.html"
-Delete "$INSTDIR\newview.exe"
-;; Remove entire help directory
-Delete "$INSTDIR\help\Advanced\*"
-RMDir "$INSTDIR\help\Advanced"
-Delete "$INSTDIR\help\basics\*"
-RMDir "$INSTDIR\help\basics"
-Delete "$INSTDIR\help\Concepts\*"
-RMDir "$INSTDIR\help\Concepts"
-Delete "$INSTDIR\help\welcome\*"
-RMDir "$INSTDIR\help\welcome"
-Delete "$INSTDIR\help\*"
-RMDir "$INSTDIR\help"
-
-Delete "$INSTDIR\uninst.exe"
-RMDir "$INSTDIR"
-
-IfFileExists "$INSTDIR" FOLDERFOUND NOFOLDER
-
-FOLDERFOUND:
- ; Silent uninstall always removes all files (/SD IDYES)
- MessageBox MB_YESNO $(DeleteProgramFilesMB) /SD IDYES IDNO NOFOLDER
- RMDir /r "$INSTDIR"
-
-NOFOLDER:
-
-FunctionEnd
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Uninstall settings
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-UninstallText $(UninstallTextMsg)
-ShowUninstDetails show
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Uninstall section
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-Section Uninstall
-
-; Start with some default values.
-StrCpy $INSTFLAGS ""
-StrCpy $INSTPROG "${INSTNAME}"
-StrCpy $INSTEXE "${INSTEXE}"
-StrCpy $INSTSHORTCUT "${SHORTCUT}"
-Call un.CheckIfAdministrator ; Make sure the user can install/uninstall
-
-; uninstall for all users (if you change this, change it in the install as well)
-SetShellVarContext all
-
-; Make sure we're not running
-Call un.CloseSecondLife
-
-; Clean up registry keys and subkeys (these should all be !defines somewhere)
-DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG"
-DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG"
-
-; Clean up shortcuts
-Delete "$SMPROGRAMS\$INSTSHORTCUT\*.*"
-RMDir "$SMPROGRAMS\$INSTSHORTCUT"
-
-Delete "$DESKTOP\$INSTSHORTCUT.lnk"
-Delete "$INSTDIR\$INSTSHORTCUT.lnk"
-Delete "$INSTDIR\Uninstall $INSTSHORTCUT.lnk"
-
-; Clean up cache and log files.
-; Leave them in-place for non AGNI installs.
-
-!ifdef UNINSTALL_SETTINGS
-Call un.DocumentsAndSettingsFolder
-!endif
-
-; remove stored password on uninstall
-Call un.RemovePassword
-
-Call un.ProgramFiles
-
-SectionEnd ; end of uninstall section
-
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-; (From the NSIS documentation, JC)
-; GetWindowsVersion
-;
-; Based on Yazno's function, http://yazno.tripod.com/powerpimpit/
-; Updated by Joost Verburg
-;
-; Returns on top of stack
-;
-; Windows Version (95, 98, ME, NT x.x, 2000, XP, 2003)
-; or
-; '' (Unknown Windows Version)
-;
-; Usage:
-; Call GetWindowsVersion
-; Pop $R0
-; ; at this point $R0 is "NT 4.0" or whatnot
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-Function GetWindowsVersion
-
- Push $R0
- Push $R1
-
- ReadRegStr $R0 HKLM \
- "SOFTWARE\Microsoft\Windows NT\CurrentVersion" CurrentVersion
-
- IfErrors 0 lbl_winnt
-
- ; we are not NT
- ReadRegStr $R0 HKLM \
- "SOFTWARE\Microsoft\Windows\CurrentVersion" VersionNumber
-
- StrCpy $R1 $R0 1
- StrCmp $R1 '4' 0 lbl_error
-
- StrCpy $R1 $R0 3
-
- StrCmp $R1 '4.0' lbl_win32_95
- StrCmp $R1 '4.9' lbl_win32_ME lbl_win32_98
-
- lbl_win32_95:
- StrCpy $R0 '95'
- Goto lbl_done
-
- lbl_win32_98:
- StrCpy $R0 '98'
- Goto lbl_done
-
- lbl_win32_ME:
- StrCpy $R0 'ME'
- Goto lbl_done
-
- lbl_winnt:
-
- StrCpy $R1 $R0 1
-
- StrCmp $R1 '3' lbl_winnt_x
- StrCmp $R1 '4' lbl_winnt_x
-
- StrCpy $R1 $R0 3
-
- StrCmp $R1 '5.0' lbl_winnt_2000
- StrCmp $R1 '5.1' lbl_winnt_XP
- StrCmp $R1 '5.2' lbl_winnt_2003 lbl_error
-
- lbl_winnt_x:
- StrCpy $R0 "NT $R0" 6
- Goto lbl_done
-
- lbl_winnt_2000:
- Strcpy $R0 '2000'
- Goto lbl_done
-
- lbl_winnt_XP:
- Strcpy $R0 'XP'
- Goto lbl_done
-
- lbl_winnt_2003:
- Strcpy $R0 '2003'
- Goto lbl_done
-
- lbl_error:
- Strcpy $R0 ''
- lbl_done:
-
- Pop $R1
- Exch $R0
-
-FunctionEnd
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; Note: to add new languages, add a language file include to the list
-;; at the top of this file, add an entry to the menu and then add an
-;; entry to the language ID selector below
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-Function .onInit
- Push $0
- ${GetParameters} $COMMANDLINE ; get our command line
-
- ${GetOptions} $COMMANDLINE "/SKIP_DIALOGS" $0
- IfErrors +2 0 ; If error jump past setting SKIP_DIALOGS
- StrCpy $SKIP_DIALOGS "true"
-
- ${GetOptions} $COMMANDLINE "/LANGID=" $0 ; /LANGID=1033 implies US English
- ; If no language (error), then proceed
- IfErrors lbl_configure_default_lang
- ; No error means we got a language, so use it
- StrCpy $LANGUAGE $0
- Goto lbl_return
-
-lbl_configure_default_lang:
- ; If we currently have a version of SL installed, default to the language of that install
- ; Otherwise don't change $LANGUAGE and it will default to the OS UI language.
- ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\${INSTNAME}" "InstallerLanguage"
- IfErrors +2 0 ; If error skip the copy instruction
- StrCpy $LANGUAGE $0
-
- ; For silent installs, no language prompt, use default
- IfSilent lbl_return
- StrCmp $SKIP_DIALOGS "true" lbl_return
-
-lbl_build_menu:
- Push ""
- # Use separate file so labels can be UTF-16 but we can still merge changes
- # into this ASCII file. JC
- !include "%%SOURCE%%\installers\windows\language_menu.nsi"
-
- Push A ; A means auto count languages for the auto count to work the first empty push (Push "") must remain
- LangDLL::LangDialog $(InstallerLanguageTitle) $(SelectInstallerLanguage)
- Pop $0
- StrCmp $0 "cancel" 0 +2
- Abort
- StrCpy $LANGUAGE $0
-
- ; save language in registry
- WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\${INSTNAME}" "InstallerLanguage" $LANGUAGE
-lbl_return:
- Pop $0
- Return
-FunctionEnd
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-Function un.onInit
- ; read language from registry and set for uninstaller
- ; Key will be removed on successful uninstall
- ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\${INSTNAME}" "InstallerLanguage"
- IfErrors lbl_end
- StrCpy $LANGUAGE $0
-lbl_end:
- Return
-FunctionEnd
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; MAIN SECTION
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-Section "" ; (default section)
-
-SetShellVarContext all ; install for all users (if you change this, change it in the uninstall as well)
-
-; Start with some default values.
-StrCpy $INSTFLAGS "${INSTFLAGS}"
-StrCpy $INSTPROG "${INSTNAME}"
-StrCpy $INSTEXE "${INSTEXE}"
-StrCpy $INSTSHORTCUT "${SHORTCUT}"
-
-Call CheckWindowsVersion ; warn if on Windows 98/ME
-Call CheckIfAdministrator ; Make sure the user can install/uninstall
-Call CheckIfAlreadyCurrent ; Make sure that we haven't already installed this version
-Call CloseSecondLife ; Make sure we're not running
-Call CheckNetworkConnection ; ping secondlife.com
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Don't remove cache files during a regular install, removing the inventory cache on upgrades results in lots of damage to the servers.
-;Call RemoveCacheFiles ; Installing over removes potentially corrupted
- ; VFS and cache files.
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Need to clean out shader files from previous installs to fix DEV-5663
-Call RemoveOldShaders
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Need to clean out old XUI files that predate skinning
-Call RemoveOldXUI
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Clear out old releasenotes.txt files. These are now on the public wiki.
-Call RemoveOldReleaseNotes
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Files
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; This placeholder is replaced by the complete list of all the files in the installer, by viewer_manifest.py
-%%INSTALL_FILES%%
-
-# Pass the installer's language to the client to use as a default
-StrCpy $SHORTCUT_LANG_PARAM "--set InstallLanguage $(LanguageCode)"
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-; Shortcuts in start menu
-CreateDirectory "$SMPROGRAMS\$INSTSHORTCUT"
-SetOutPath "$INSTDIR"
-CreateShortCut "$SMPROGRAMS\$INSTSHORTCUT\$INSTSHORTCUT.lnk" \
- "$INSTDIR\$INSTEXE" "$INSTFLAGS $SHORTCUT_LANG_PARAM"
-
-
-WriteINIStr "$SMPROGRAMS\$INSTSHORTCUT\SL Create Account.url" \
- "InternetShortcut" "URL" \
- "http://join.secondlife.com/"
-WriteINIStr "$SMPROGRAMS\$INSTSHORTCUT\SL Your Account.url" \
- "InternetShortcut" "URL" \
- "http://www.secondlife.com/account/"
-WriteINIStr "$SMPROGRAMS\$INSTSHORTCUT\SL Scripting Language Help.url" \
- "InternetShortcut" "URL" \
- "http://wiki.secondlife.com/wiki/LSL_Portal"
-CreateShortCut "$SMPROGRAMS\$INSTSHORTCUT\Uninstall $INSTSHORTCUT.lnk" \
- '"$INSTDIR\uninst.exe"' ''
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-; Other shortcuts
-SetOutPath "$INSTDIR"
-CreateShortCut "$DESKTOP\$INSTSHORTCUT.lnk" \
- "$INSTDIR\$INSTEXE" "$INSTFLAGS $SHORTCUT_LANG_PARAM"
-CreateShortCut "$INSTDIR\$INSTSHORTCUT.lnk" \
- "$INSTDIR\$INSTEXE" "$INSTFLAGS $SHORTCUT_LANG_PARAM"
-CreateShortCut "$INSTDIR\Uninstall $INSTSHORTCUT.lnk" \
- '"$INSTDIR\uninst.exe"' ''
-
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-; Write registry
-WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "" "$INSTDIR"
-WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Version" "${VERSION_LONG}"
-WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Flags" "$INSTFLAGS"
-WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Shortcut" "$INSTSHORTCUT"
-WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Exe" "$INSTEXE"
-WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" "DisplayName" "$INSTPROG (remove only)"
-WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" "UninstallString" '"$INSTDIR\uninst.exe"'
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-; Write URL registry info
-WriteRegStr HKEY_CLASSES_ROOT "${URLNAME}" "(default)" "URL:Second Life"
-WriteRegStr HKEY_CLASSES_ROOT "${URLNAME}" "URL Protocol" ""
-WriteRegStr HKEY_CLASSES_ROOT "${URLNAME}\DefaultIcon" "" '"$INSTDIR\$INSTEXE"'
-;; URL param must be last item passed to viewer, it ignores subsequent params
-;; to avoid parameter injection attacks.
-WriteRegExpandStr HKEY_CLASSES_ROOT "${URLNAME}\shell\open\command" "" '"$INSTDIR\$INSTEXE" $INSTFLAGS -url "%1"'
-WriteRegStr HKEY_CLASSES_ROOT "x-grid-location-info"(default)" "URL:Second Life"
-WriteRegStr HKEY_CLASSES_ROOT "x-grid-location-info" "URL Protocol" ""
-WriteRegStr HKEY_CLASSES_ROOT "x-grid-location-info\DefaultIcon" "" '"$INSTDIR\$INSTEXE"'
-;; URL param must be last item passed to viewer, it ignores subsequent params
-;; to avoid parameter injection attacks.
-WriteRegExpandStr HKEY_CLASSES_ROOT "x-grid-location-info\shell\open\command" "" '"$INSTDIR\$INSTEXE" $INSTFLAGS -url "%1"'
-
-; write out uninstaller
-WriteUninstaller "$INSTDIR\uninst.exe"
-
-; end of default section
-SectionEnd
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; EOF ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; secondlife setup.nsi
+;; Copyright 2004-2011, Linden Research, Inc.
+;;
+;; This library is free software; you can redistribute it and/or
+;; modify it under the terms of the GNU Lesser General Public
+;; License as published by the Free Software Foundation;
+;; version 2.1 of the License only.
+;;
+;; This library is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+;; Lesser General Public License for more details.
+;;
+;; You should have received a copy of the GNU Lesser General Public
+;; License along with this library; if not, write to the Free Software
+;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+;;
+;; Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+;;
+;; NSIS Unicode 2.38.1 or higher required
+;; http://www.scratchpaper.com/
+;;
+;; Author: James Cook, Don Kjer, Callum Prentice
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Compiler flags
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+SetOverwrite on ; overwrite files
+SetCompress auto ; compress iff saves space
+SetCompressor /solid lzma ; compress whole installer as one block
+SetDatablockOptimize off ; only saves us 0.1%, not worth it
+XPStyle on ; add an XP manifest to the installer
+RequestExecutionLevel admin ; on Vista we must be admin because we write to Program Files
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Project flags
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+%%VERSION%%
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; - language files - one for each language (or flavor thereof)
+;; (these files are in the same place as the nsi template but the python script generates a new nsi file in the
+;; application directory so we have to add a path to these include files)
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+!include "%%SOURCE%%\installers\windows\lang_da.nsi"
+!include "%%SOURCE%%\installers\windows\lang_de.nsi"
+!include "%%SOURCE%%\installers\windows\lang_en-us.nsi"
+!include "%%SOURCE%%\installers\windows\lang_es.nsi"
+!include "%%SOURCE%%\installers\windows\lang_fr.nsi"
+!include "%%SOURCE%%\installers\windows\lang_ja.nsi"
+!include "%%SOURCE%%\installers\windows\lang_it.nsi"
+!include "%%SOURCE%%\installers\windows\lang_pl.nsi"
+!include "%%SOURCE%%\installers\windows\lang_pt-br.nsi"
+!include "%%SOURCE%%\installers\windows\lang_ru.nsi"
+!include "%%SOURCE%%\installers\windows\lang_tr.nsi"
+!include "%%SOURCE%%\installers\windows\lang_zh.nsi"
+
+# *TODO: Move these into the language files themselves
+LangString LanguageCode ${LANG_DANISH} "da"
+LangString LanguageCode ${LANG_GERMAN} "de"
+LangString LanguageCode ${LANG_ENGLISH} "en"
+LangString LanguageCode ${LANG_SPANISH} "es"
+LangString LanguageCode ${LANG_FRENCH} "fr"
+LangString LanguageCode ${LANG_JAPANESE} "ja"
+LangString LanguageCode ${LANG_ITALIAN} "it"
+LangString LanguageCode ${LANG_POLISH} "pl"
+LangString LanguageCode ${LANG_PORTUGUESEBR} "pt"
+LangString LanguageCode ${LANG_RUSSIAN} "ru"
+LangString LanguageCode ${LANG_TURKISH} "tr"
+LangString LanguageCode ${LANG_TRADCHINESE} "zh"
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Tweak for different servers/builds (this placeholder is replaced by viewer_manifest.py)
+;; For example:
+;; !define INSTFLAGS "%(flags)s"
+;; !define INSTNAME "SecondLife%(grid_caps)s"
+;; !define SHORTCUT "Second Life (%(grid_caps)s)"
+;; !define URLNAME "secondlife%(grid)s"
+;; !define UNINSTALL_SETTINGS 1
+
+%%GRID_VARS%%
+
+Name ${INSTNAME}
+
+SubCaption 0 $(LicenseSubTitleSetup) ; override "license agreement" text
+
+BrandingText " " ; bottom of window text
+Icon %%SOURCE%%\installers\windows\install_icon.ico
+UninstallIcon %%SOURCE%%\installers\windows\uninstall_icon.ico
+WindowIcon on ; show our icon in left corner
+BGGradient off ; no big background window
+CRCCheck on ; make sure CRC is OK
+InstProgressFlags smooth colored ; new colored smooth look
+ShowInstDetails nevershow ; no details, no "show" button
+SetOverwrite on ; stomp files by default
+AutoCloseWindow true ; after all files install, close window
+
+InstallDir "$PROGRAMFILES\${INSTNAME}"
+InstallDirRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\${INSTNAME}" ""
+DirText $(DirectoryChooseTitle) $(DirectoryChooseSetup)
+Page directory dirPre
+Page instfiles
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Variables
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+Var INSTPROG
+Var INSTEXE
+Var INSTFLAGS
+Var INSTSHORTCUT
+Var COMMANDLINE ; command line passed to this installer, set in .onInit
+Var SHORTCUT_LANG_PARAM ; "--set InstallLanguage de", passes language to viewer
+Var SKIP_DIALOGS ; set from command line in .onInit. autoinstall
+ ; GUI and the defaults.
+Var DO_UNINSTALL_V2 ; If non-null, path to a previous Viewer 2 installation that will be uninstalled.
+
+;;; Function definitions should go before file includes, because calls to
+;;; DLLs like LangDLL trigger an implicit file include, so if that call is at
+;;; the end of this script NSIS has to decompress the whole installer before
+;;; it can call the DLL function. JC
+
+!include "FileFunc.nsh" ; For GetParameters, GetOptions
+!insertmacro GetParameters
+!insertmacro GetOptions
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; After install completes, launch app
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+Function .onInstSuccess
+ Push $R0 # Option value, unused
+
+ StrCmp $SKIP_DIALOGS "true" label_launch
+
+ ${GetOptions} $COMMANDLINE "/AUTOSTART" $R0
+ # If parameter was there (no error) just launch
+ # Otherwise ask
+ IfErrors label_ask_launch label_launch
+
+label_ask_launch:
+ # Don't launch by default when silent
+ IfSilent label_no_launch
+ MessageBox MB_YESNO $(InstSuccesssQuestion) \
+ IDYES label_launch IDNO label_no_launch
+
+label_launch:
+ # Assumes SetOutPath $INSTDIR
+ Exec '"$INSTDIR\$INSTEXE" $INSTFLAGS $SHORTCUT_LANG_PARAM'
+label_no_launch:
+ Pop $R0
+FunctionEnd
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Pre-directory page callback
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+Function dirPre
+ StrCmp $SKIP_DIALOGS "true" 0 +2
+ Abort
+FunctionEnd
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Make sure we're not on Windows 98 / ME
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+Function CheckWindowsVersion
+ DetailPrint "Checking Windows version..."
+ Call GetWindowsVersion
+ Pop $R0
+ ; Just get first two characters, ignore 4.0 part of "NT 4.0"
+ StrCpy $R0 $R0 2
+ ; Blacklist certain OS versions
+ StrCmp $R0 "95" win_ver_bad
+ StrCmp $R0 "98" win_ver_bad
+ StrCmp $R0 "ME" win_ver_bad
+ StrCmp $R0 "NT" win_ver_bad
+ Return
+win_ver_bad:
+ StrCmp $SKIP_DIALOGS "true" +2 ; If skip_dialogs is set just install
+ MessageBox MB_YESNO $(CheckWindowsVersionMB) IDNO win_ver_abort
+ Return
+win_ver_abort:
+ Quit
+FunctionEnd
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Make sure the user can install/uninstall
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+Function CheckIfAdministrator
+ DetailPrint $(CheckAdministratorInstDP)
+ UserInfo::GetAccountType
+ Pop $R0
+ StrCmp $R0 "Admin" lbl_is_admin
+ MessageBox MB_OK $(CheckAdministratorInstMB)
+ Quit
+lbl_is_admin:
+ Return
+FunctionEnd
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+Function un.CheckIfAdministrator
+ DetailPrint $(CheckAdministratorUnInstDP)
+ UserInfo::GetAccountType
+ Pop $R0
+ StrCmp $R0 "Admin" lbl_is_admin
+ MessageBox MB_OK $(CheckAdministratorUnInstMB)
+ Quit
+lbl_is_admin:
+ Return
+FunctionEnd
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Checks to see if the current version has already been installed (according to the registry).
+; If it has, allow user to bail out of install process.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+Function CheckIfAlreadyCurrent
+ Push $0
+ ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Version"
+ StrCmp $0 ${VERSION_LONG} 0 continue_install
+ StrCmp $SKIP_DIALOGS "true" continue_install
+ MessageBox MB_OKCANCEL $(CheckIfCurrentMB) /SD IDOK IDOK continue_install
+ Quit
+continue_install:
+ Pop $0
+ Return
+FunctionEnd
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Checks for CPU valid (must have SSE2 support)
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+Function CheckCPUFlags
+ Call GetWindowsVersion
+ Pop $R0
+ StrCmp $R0 "2000" OK_SSE ; sse check not available on win2k.
+
+ Push $1
+ System::Call 'kernel32::IsProcessorFeaturePresent(i) i(10) .r1'
+ IntCmp $1 1 OK_SSE
+ MessageBox MB_OKCANCEL $(MissingSSE2) /SD IDOK IDOK OK_SSE
+ Quit
+
+ OK_SSE:
+ Pop $1
+ Return
+FunctionEnd
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Close the program, if running. Modifies no variables.
+; Allows user to bail out of install process.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+Function CloseSecondLife
+ Push $0
+ FindWindow $0 "Second Life" ""
+ IntCmp $0 0 DONE
+
+ StrCmp $SKIP_DIALOGS "true" CLOSE
+ MessageBox MB_OKCANCEL $(CloseSecondLifeInstMB) IDOK CLOSE IDCANCEL CANCEL_INSTALL
+
+ CANCEL_INSTALL:
+ Quit
+
+ CLOSE:
+ DetailPrint $(CloseSecondLifeInstDP)
+ SendMessage $0 16 0 0
+
+ LOOP:
+ FindWindow $0 "Second Life" ""
+ IntCmp $0 0 DONE
+ Sleep 500
+ Goto LOOP
+
+ DONE:
+ Pop $0
+ Return
+FunctionEnd
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Test our connection to secondlife.com
+; Also allows us to count attempted installs by examining web logs.
+; *TODO: Return current SL version info and have installer check
+; if it is up to date.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+Function CheckNetworkConnection
+ Push $0
+ Push $1
+ Push $2 # Option value for GetOptions
+ DetailPrint $(CheckNetworkConnectionDP)
+ ; Look for a tag value from the stub installer, used for statistics
+ ; to correlate installs. Default to "" if not found on command line.
+ StrCpy $2 ""
+ ${GetOptions} $COMMANDLINE "/STUBTAG=" $2
+ GetTempFileName $0
+ !define HTTP_TIMEOUT 5000 ; milliseconds
+ ; Don't show secondary progress bar, this will be quick.
+ NSISdl::download_quiet \
+ /TIMEOUT=${HTTP_TIMEOUT} \
+ "http://install.secondlife.com/check/?stubtag=$2&version=${VERSION_LONG}" \
+ $0
+ Pop $1 ; Return value, either "success", "cancel" or an error message
+ ; MessageBox MB_OK "Download result: $1"
+ ; Result ignored for now
+ ; StrCmp $1 "success" +2
+ ; DetailPrint "Connection failed: $1"
+ Delete $0 ; temporary file
+ Pop $2
+ Pop $1
+ Pop $0
+ Return
+FunctionEnd
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Function CheckWillUninstallV2
+;
+; If we are being called through auto-update, we need to uninstall any
+; existing V2 installation. Otherwise, we wind up with
+; SecondLifeViewer2 and SecondLifeViewer installations existing side
+; by side no indication which to use.
+; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+Function CheckWillUninstallV2
+
+ StrCpy $DO_UNINSTALL_V2 ""
+
+ StrCmp $SKIP_DIALOGS "true" 0 CHECKV2_DONE
+ StrCmp $INSTDIR "$PROGRAMFILES\SecondLifeViewer2" CHECKV2_DONE ; don't uninstall our own install dir.
+ IfFileExists "$PROGRAMFILES\SecondLifeViewer2\uninst.exe" CHECKV2_FOUND CHECKV2_DONE
+
+CHECKV2_FOUND:
+ StrCpy $DO_UNINSTALL_V2 "true"
+
+CHECKV2_DONE:
+
+FunctionEnd
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Save user files to temp location
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+Function PreserveUserFiles
+
+Push $0
+Push $1
+Push $2
+
+ RMDir /r "$TEMP\SecondLifeSettingsBackup"
+ CreateDirectory "$TEMP\SecondLifeSettingsBackup"
+ StrCpy $0 0 ; Index number used to iterate via EnumRegKey
+
+ LOOP:
+ EnumRegKey $1 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" $0
+ StrCmp $1 "" DONE ; no more users
+
+ ReadRegStr $2 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\$1" "ProfileImagePath"
+ StrCmp $2 "" CONTINUE 0 ; "ProfileImagePath" value is missing
+
+ ; Required since ProfileImagePath is of type REG_EXPAND_SZ
+ ExpandEnvStrings $2 $2
+
+ CreateDirectory "$TEMP\SecondLifeSettingsBackup\$0"
+ CopyFiles /SILENT "$2\Application Data\SecondLife\*" "$TEMP\SecondLifeSettingsBackup\$0"
+
+ CONTINUE:
+ IntOp $0 $0 + 1
+ Goto LOOP
+ DONE:
+
+Pop $2
+Pop $1
+Pop $0
+
+; Copy files in Documents and Settings\All Users\SecondLife
+Push $0
+ ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" "Common AppData"
+ StrCmp $0 "" +2
+ CreateDirectory "$TEMP\SecondLifeSettingsBackup\AllUsers\"
+ CopyFiles /SILENT "$2\Application Data\SecondLife\*" "$TEMP\SecondLifeSettingsBackup\AllUsers\"
+Pop $0
+
+FunctionEnd
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Restore user files from temp location
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+Function RestoreUserFiles
+
+Push $0
+Push $1
+Push $2
+
+ StrCpy $0 0 ; Index number used to iterate via EnumRegKey
+
+ LOOP:
+ EnumRegKey $1 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" $0
+ StrCmp $1 "" DONE ; no more users
+
+ ReadRegStr $2 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\$1" "ProfileImagePath"
+ StrCmp $2 "" CONTINUE 0 ; "ProfileImagePath" value is missing
+
+ ; Required since ProfileImagePath is of type REG_EXPAND_SZ
+ ExpandEnvStrings $2 $2
+
+ CreateDirectory "$2\Application Data\SecondLife\"
+ CopyFiles /SILENT "$TEMP\SecondLifeSettingsBackup\$0\*" "$2\Application Data\SecondLife\"
+
+ CONTINUE:
+ IntOp $0 $0 + 1
+ Goto LOOP
+ DONE:
+
+Pop $2
+Pop $1
+Pop $0
+
+; Copy files in Documents and Settings\All Users\SecondLife
+Push $0
+ ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" "Common AppData"
+ StrCmp $0 "" +2
+ CreateDirectory "$2\Application Data\SecondLife\"
+ CopyFiles /SILENT "$TEMP\SecondLifeSettingsBackup\AllUsers\*" "$2\Application Data\SecondLife\"
+Pop $0
+
+FunctionEnd
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Remove temp dirs
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+Function RemoveTempUserFiles
+
+Push $0
+Push $1
+Push $2
+
+ StrCpy $0 0 ; Index number used to iterate via EnumRegKey
+
+ LOOP:
+ EnumRegKey $1 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" $0
+ StrCmp $1 "" DONE ; no more users
+
+ ReadRegStr $2 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\$1" "ProfileImagePath"
+ StrCmp $2 "" CONTINUE 0 ; "ProfileImagePath" value is missing
+
+ ; Required since ProfileImagePath is of type REG_EXPAND_SZ
+ ExpandEnvStrings $2 $2
+
+ RMDir /r "$TEMP\SecondLifeSettingsBackup\$0\*"
+
+ CONTINUE:
+ IntOp $0 $0 + 1
+ Goto LOOP
+ DONE:
+
+Pop $2
+Pop $1
+Pop $0
+
+; Copy files in Documents and Settings\All Users\SecondLife
+Push $0
+ ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" "Common AppData"
+ StrCmp $0 "" +2
+ RMDir /r "$TEMP\SecondLifeSettingsBackup\AllUsers\*"
+Pop $0
+
+FunctionEnd
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Clobber user files - TEST ONLY
+; This is here for testing, generally not desirable to call it.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;Function ClobberUserFilesTESTONLY
+
+;Push $0
+;Push $1
+;Push $2
+;
+; StrCpy $0 0 ; Index number used to iterate via EnumRegKey
+;
+; LOOP:
+; EnumRegKey $1 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" $0
+; StrCmp $1 "" DONE ; no more users
+;
+; ReadRegStr $2 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\$1" "ProfileImagePath"
+; StrCmp $2 "" CONTINUE 0 ; "ProfileImagePath" value is missing
+;
+; ; Required since ProfileImagePath is of type REG_EXPAND_SZ
+; ExpandEnvStrings $2 $2
+;
+; RMDir /r "$2\Application Data\SecondLife\"
+;
+; CONTINUE:
+; IntOp $0 $0 + 1
+; Goto LOOP
+; DONE:
+;
+;Pop $2
+;Pop $1
+;Pop $0
+;
+;; Copy files in Documents and Settings\All Users\SecondLife
+;Push $0
+; ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" "Common AppData"
+; StrCmp $0 "" +2
+; RMDir /r "$2\Application Data\SecondLife\"
+;Pop $0
+;
+;FunctionEnd
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Delete the installed shader files
+;;; Since shaders are in active development, we'll likely need to shuffle them
+;;; around a bit from build to build. This ensures that shaders that we move
+;;; or rename in the dev tree don't get left behind in the install.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+Function RemoveOldShaders
+
+;; Remove old shader files first so fallbacks will work. see DEV-5663
+RMDir /r "$INSTDIR\app_settings\shaders\*"
+
+FunctionEnd
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Delete the installed XUI files
+;;; We've changed the directory hierarchy for skins, putting all XUI and texture
+;;; files under a specific skin directory, i.e. skins/default/xui/en-us as opposed
+;;; to skins/xui/en-us. Need to clean up the old path when upgrading
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+Function RemoveOldXUI
+
+;; remove old XUI and texture files
+RmDir /r "$INSTDIR\skins\html"
+RmDir /r "$INSTDIR\skins\xui"
+RmDir /r "$INSTDIR\skins\textures"
+Delete "$INSTDIR\skins\*.txt"
+
+FunctionEnd
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Remove any releasenotes files.
+;;; We are no longer including release notes with the viewer. This will delete
+;;; any that were left behind by an older installer. Delete will not fail if
+;;; the files do not exist
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+Function RemoveOldReleaseNotes
+
+;; remove releasenotes.txt file from application directory, and the shortcut
+;; from the start menu.
+Delete "$SMPROGRAMS\$INSTSHORTCUT\SL Release Notes.lnk"
+Delete "$INSTDIR\releasenotes.txt"
+
+FunctionEnd
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Delete files in Documents and Settings\<user>\SecondLife
+; Delete files in Documents and Settings\All Users\SecondLife
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+Function un.DocumentsAndSettingsFolder
+
+; Delete files in Documents and Settings\<user>\SecondLife
+Push $0
+Push $1
+Push $2
+
+ DetailPrint "Deleting files in Documents and Settings folder"
+
+ StrCpy $0 0 ; Index number used to iterate via EnumRegKey
+
+ LOOP:
+ EnumRegKey $1 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" $0
+ StrCmp $1 "" DONE ; no more users
+
+ ReadRegStr $2 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\$1" "ProfileImagePath"
+ StrCmp $2 "" CONTINUE 0 ; "ProfileImagePath" value is missing
+
+ ; Required since ProfileImagePath is of type REG_EXPAND_SZ
+ ExpandEnvStrings $2 $2
+
+ ; Remove all cache and settings files but leave any other .txt files to preserve the chat logs
+; RMDir /r "$2\Application Data\SecondLife\logs"
+ RMDir /r "$2\Application Data\SecondLife\browser_profile"
+ RMDir /r "$2\Application Data\SecondLife\user_settings"
+ Delete "$2\Application Data\SecondLife\*.xml"
+ Delete "$2\Application Data\SecondLife\*.bmp"
+ Delete "$2\Application Data\SecondLife\search_history.txt"
+ Delete "$2\Application Data\SecondLife\plugin_cookies.txt"
+ Delete "$2\Application Data\SecondLife\typed_locations.txt"
+
+ CONTINUE:
+ IntOp $0 $0 + 1
+ Goto LOOP
+ DONE:
+
+Pop $2
+Pop $1
+Pop $0
+
+; Delete files in Documents and Settings\All Users\SecondLife
+Push $0
+ ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" "Common AppData"
+ StrCmp $0 "" +2
+ RMDir /r "$0\SecondLife"
+Pop $0
+
+; Delete files in C:\Windows\Application Data\SecondLife
+; If the user is running on a pre-NT system, Application Data lives here instead of
+; in Documents and Settings.
+RMDir /r "$WINDIR\Application Data\SecondLife"
+
+FunctionEnd
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Close the program, if running. Modifies no variables.
+; Allows user to bail out of uninstall process.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+Function un.CloseSecondLife
+ Push $0
+ FindWindow $0 "Second Life" ""
+ IntCmp $0 0 DONE
+ MessageBox MB_OKCANCEL $(CloseSecondLifeUnInstMB) IDOK CLOSE IDCANCEL CANCEL_UNINSTALL
+
+ CANCEL_UNINSTALL:
+ Quit
+
+ CLOSE:
+ DetailPrint $(CloseSecondLifeUnInstDP)
+ SendMessage $0 16 0 0
+
+ LOOP:
+ FindWindow $0 "Second Life" ""
+ IntCmp $0 0 DONE
+ Sleep 500
+ Goto LOOP
+
+ DONE:
+ Pop $0
+ Return
+FunctionEnd
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;
+; Delete the stored password for the current Windows user
+; DEV-10821 -- Unauthorised user can gain access to an SL account after a real user has uninstalled
+;
+Function un.RemovePassword
+
+DetailPrint "Removing Second Life password"
+
+SetShellVarContext current
+Delete "$APPDATA\SecondLife\user_settings\password.dat"
+SetShellVarContext all
+
+FunctionEnd
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Delete the installed files
+;;; This deletes the uninstall executable, but it works
+;;; because it is copied to temp directory before running
+;;;
+;;; Note: You must list all files here, because we only
+;;; want to delete our files, not things users left in the
+;;; application directories.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+Function un.ProgramFiles
+
+;; Remove mozilla file first so recursive directory deletion doesn't get hung up
+Delete "$INSTDIR\app_settings\mozilla\components"
+
+;; This placeholder is replaced by the complete list of files to uninstall by viewer_manifest.py
+%%DELETE_FILES%%
+
+;; Optional/obsolete files. Delete won't fail if they don't exist.
+Delete "$INSTDIR\dronesettings.ini"
+Delete "$INSTDIR\message_template.msg"
+Delete "$INSTDIR\newview.pdb"
+Delete "$INSTDIR\newview.map"
+Delete "$INSTDIR\SecondLife.pdb"
+Delete "$INSTDIR\SecondLife.map"
+Delete "$INSTDIR\comm.dat"
+Delete "$INSTDIR\*.glsl"
+Delete "$INSTDIR\motions\*.lla"
+Delete "$INSTDIR\trial\*.html"
+Delete "$INSTDIR\newview.exe"
+;; Remove entire help directory
+Delete "$INSTDIR\help\Advanced\*"
+RMDir "$INSTDIR\help\Advanced"
+Delete "$INSTDIR\help\basics\*"
+RMDir "$INSTDIR\help\basics"
+Delete "$INSTDIR\help\Concepts\*"
+RMDir "$INSTDIR\help\Concepts"
+Delete "$INSTDIR\help\welcome\*"
+RMDir "$INSTDIR\help\welcome"
+Delete "$INSTDIR\help\*"
+RMDir "$INSTDIR\help"
+
+Delete "$INSTDIR\uninst.exe"
+RMDir "$INSTDIR"
+
+IfFileExists "$INSTDIR" FOLDERFOUND NOFOLDER
+
+FOLDERFOUND:
+ ; Silent uninstall always removes all files (/SD IDYES)
+ MessageBox MB_YESNO $(DeleteProgramFilesMB) /SD IDYES IDNO NOFOLDER
+ RMDir /r "$INSTDIR"
+
+NOFOLDER:
+
+FunctionEnd
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Uninstall settings
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+UninstallText $(UninstallTextMsg)
+ShowUninstDetails show
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Uninstall section
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+Section Uninstall
+
+; Start with some default values.
+StrCpy $INSTFLAGS ""
+StrCpy $INSTPROG "${INSTNAME}"
+StrCpy $INSTEXE "${INSTEXE}"
+StrCpy $INSTSHORTCUT "${SHORTCUT}"
+Call un.CheckIfAdministrator ; Make sure the user can install/uninstall
+
+; uninstall for all users (if you change this, change it in the install as well)
+SetShellVarContext all
+
+; Make sure we're not running
+Call un.CloseSecondLife
+
+; Clean up registry keys and subkeys (these should all be !defines somewhere)
+DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG"
+DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG"
+
+; Clean up shortcuts
+Delete "$SMPROGRAMS\$INSTSHORTCUT\*.*"
+RMDir "$SMPROGRAMS\$INSTSHORTCUT"
+
+Delete "$DESKTOP\$INSTSHORTCUT.lnk"
+Delete "$INSTDIR\$INSTSHORTCUT.lnk"
+Delete "$INSTDIR\Uninstall $INSTSHORTCUT.lnk"
+
+; Clean up cache and log files.
+; Leave them in-place for non AGNI installs.
+
+!ifdef UNINSTALL_SETTINGS
+Call un.DocumentsAndSettingsFolder
+!endif
+
+; remove stored password on uninstall
+Call un.RemovePassword
+
+Call un.ProgramFiles
+
+SectionEnd ; end of uninstall section
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; (From the NSIS documentation, JC)
+; GetWindowsVersion
+;
+; Based on Yazno's function, http://yazno.tripod.com/powerpimpit/
+; Updated by Joost Verburg
+;
+; Returns on top of stack
+;
+; Windows Version (95, 98, ME, NT x.x, 2000, XP, 2003)
+; or
+; '' (Unknown Windows Version)
+;
+; Usage:
+; Call GetWindowsVersion
+; Pop $R0
+; ; at this point $R0 is "NT 4.0" or whatnot
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+Function GetWindowsVersion
+
+ Push $R0
+ Push $R1
+
+ ReadRegStr $R0 HKLM \
+ "SOFTWARE\Microsoft\Windows NT\CurrentVersion" CurrentVersion
+
+ IfErrors 0 lbl_winnt
+
+ ; we are not NT
+ ReadRegStr $R0 HKLM \
+ "SOFTWARE\Microsoft\Windows\CurrentVersion" VersionNumber
+
+ StrCpy $R1 $R0 1
+ StrCmp $R1 '4' 0 lbl_error
+
+ StrCpy $R1 $R0 3
+
+ StrCmp $R1 '4.0' lbl_win32_95
+ StrCmp $R1 '4.9' lbl_win32_ME lbl_win32_98
+
+ lbl_win32_95:
+ StrCpy $R0 '95'
+ Goto lbl_done
+
+ lbl_win32_98:
+ StrCpy $R0 '98'
+ Goto lbl_done
+
+ lbl_win32_ME:
+ StrCpy $R0 'ME'
+ Goto lbl_done
+
+ lbl_winnt:
+
+ StrCpy $R1 $R0 1
+
+ StrCmp $R1 '3' lbl_winnt_x
+ StrCmp $R1 '4' lbl_winnt_x
+
+ StrCpy $R1 $R0 3
+
+ StrCmp $R1 '5.0' lbl_winnt_2000
+ StrCmp $R1 '5.1' lbl_winnt_XP
+ StrCmp $R1 '5.2' lbl_winnt_2003 lbl_error
+
+ lbl_winnt_x:
+ StrCpy $R0 "NT $R0" 6
+ Goto lbl_done
+
+ lbl_winnt_2000:
+ Strcpy $R0 '2000'
+ Goto lbl_done
+
+ lbl_winnt_XP:
+ Strcpy $R0 'XP'
+ Goto lbl_done
+
+ lbl_winnt_2003:
+ Strcpy $R0 '2003'
+ Goto lbl_done
+
+ lbl_error:
+ Strcpy $R0 ''
+ lbl_done:
+
+ Pop $R1
+ Exch $R0
+
+FunctionEnd
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Note: to add new languages, add a language file include to the list
+;; at the top of this file, add an entry to the menu and then add an
+;; entry to the language ID selector below
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+Function .onInit
+ Push $0
+ ${GetParameters} $COMMANDLINE ; get our command line
+
+ ${GetOptions} $COMMANDLINE "/SKIP_DIALOGS" $0
+ IfErrors +2 0 ; If error jump past setting SKIP_DIALOGS
+ StrCpy $SKIP_DIALOGS "true"
+
+ ${GetOptions} $COMMANDLINE "/LANGID=" $0 ; /LANGID=1033 implies US English
+ ; If no language (error), then proceed
+ IfErrors lbl_configure_default_lang
+ ; No error means we got a language, so use it
+ StrCpy $LANGUAGE $0
+ Goto lbl_return
+
+lbl_configure_default_lang:
+ ; If we currently have a version of SL installed, default to the language of that install
+ ; Otherwise don't change $LANGUAGE and it will default to the OS UI language.
+ ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\${INSTNAME}" "InstallerLanguage"
+ IfErrors +2 0 ; If error skip the copy instruction
+ StrCpy $LANGUAGE $0
+
+ ; For silent installs, no language prompt, use default
+ IfSilent lbl_return
+ StrCmp $SKIP_DIALOGS "true" lbl_return
+
+lbl_build_menu:
+ Push ""
+ # Use separate file so labels can be UTF-16 but we can still merge changes
+ # into this ASCII file. JC
+ !include "%%SOURCE%%\installers\windows\language_menu.nsi"
+
+ Push A ; A means auto count languages for the auto count to work the first empty push (Push "") must remain
+ LangDLL::LangDialog $(InstallerLanguageTitle) $(SelectInstallerLanguage)
+ Pop $0
+ StrCmp $0 "cancel" 0 +2
+ Abort
+ StrCpy $LANGUAGE $0
+
+ ; save language in registry
+ WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\${INSTNAME}" "InstallerLanguage" $LANGUAGE
+lbl_return:
+ Pop $0
+ Return
+FunctionEnd
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+Function un.onInit
+ ; read language from registry and set for uninstaller
+ ; Key will be removed on successful uninstall
+ ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\${INSTNAME}" "InstallerLanguage"
+ IfErrors lbl_end
+ StrCpy $LANGUAGE $0
+lbl_end:
+ Return
+FunctionEnd
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; MAIN SECTION
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+Section "" ; (default section)
+
+SetShellVarContext all ; install for all users (if you change this, change it in the uninstall as well)
+
+; Start with some default values.
+StrCpy $INSTFLAGS "${INSTFLAGS}"
+StrCpy $INSTPROG "${INSTNAME}"
+StrCpy $INSTEXE "${INSTEXE}"
+StrCpy $INSTSHORTCUT "${SHORTCUT}"
+
+Call CheckWindowsVersion ; warn if on Windows 98/ME
+Call CheckCPUFlags ; Make sure we have SSE2 support
+Call CheckIfAdministrator ; Make sure the user can install/uninstall
+Call CheckIfAlreadyCurrent ; Make sure that we haven't already installed this version
+Call CloseSecondLife ; Make sure we're not running
+Call CheckNetworkConnection ; ping secondlife.com
+Call CheckWillUninstallV2 ; See if a V2 install exists and will be removed.
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+StrCmp $DO_UNINSTALL_V2 "" PRESERVE_DONE
+ Call PreserveUserFiles
+PRESERVE_DONE:
+
+;;; Don't remove cache files during a regular install, removing the inventory cache on upgrades results in lots of damage to the servers.
+;Call RemoveCacheFiles ; Installing over removes potentially corrupted
+ ; VFS and cache files.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Need to clean out shader files from previous installs to fix DEV-5663
+Call RemoveOldShaders
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Need to clean out old XUI files that predate skinning
+Call RemoveOldXUI
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Clear out old releasenotes.txt files. These are now on the public wiki.
+Call RemoveOldReleaseNotes
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Files
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; This placeholder is replaced by the complete list of all the files in the installer, by viewer_manifest.py
+%%INSTALL_FILES%%
+
+# Pass the installer's language to the client to use as a default
+StrCpy $SHORTCUT_LANG_PARAM "--set InstallLanguage $(LanguageCode)"
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Shortcuts in start menu
+CreateDirectory "$SMPROGRAMS\$INSTSHORTCUT"
+SetOutPath "$INSTDIR"
+CreateShortCut "$SMPROGRAMS\$INSTSHORTCUT\$INSTSHORTCUT.lnk" \
+ "$INSTDIR\$INSTEXE" "$INSTFLAGS $SHORTCUT_LANG_PARAM"
+
+
+WriteINIStr "$SMPROGRAMS\$INSTSHORTCUT\SL Create Account.url" \
+ "InternetShortcut" "URL" \
+ "http://join.secondlife.com/"
+WriteINIStr "$SMPROGRAMS\$INSTSHORTCUT\SL Your Account.url" \
+ "InternetShortcut" "URL" \
+ "http://www.secondlife.com/account/"
+WriteINIStr "$SMPROGRAMS\$INSTSHORTCUT\SL Scripting Language Help.url" \
+ "InternetShortcut" "URL" \
+ "http://wiki.secondlife.com/wiki/LSL_Portal"
+CreateShortCut "$SMPROGRAMS\$INSTSHORTCUT\Uninstall $INSTSHORTCUT.lnk" \
+ '"$INSTDIR\uninst.exe"' ''
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Other shortcuts
+SetOutPath "$INSTDIR"
+CreateShortCut "$DESKTOP\$INSTSHORTCUT.lnk" \
+ "$INSTDIR\$INSTEXE" "$INSTFLAGS $SHORTCUT_LANG_PARAM"
+CreateShortCut "$INSTDIR\$INSTSHORTCUT.lnk" \
+ "$INSTDIR\$INSTEXE" "$INSTFLAGS $SHORTCUT_LANG_PARAM"
+CreateShortCut "$INSTDIR\Uninstall $INSTSHORTCUT.lnk" \
+ '"$INSTDIR\uninst.exe"' ''
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Write registry
+WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "" "$INSTDIR"
+WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Version" "${VERSION_LONG}"
+WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Flags" "$INSTFLAGS"
+WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Shortcut" "$INSTSHORTCUT"
+WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Exe" "$INSTEXE"
+WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" "DisplayName" "$INSTPROG (remove only)"
+WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" "UninstallString" '"$INSTDIR\uninst.exe"'
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Write URL registry info
+WriteRegStr HKEY_CLASSES_ROOT "${URLNAME}" "(default)" "URL:Second Life"
+WriteRegStr HKEY_CLASSES_ROOT "${URLNAME}" "URL Protocol" ""
+WriteRegStr HKEY_CLASSES_ROOT "${URLNAME}\DefaultIcon" "" '"$INSTDIR\$INSTEXE"'
+;; URL param must be last item passed to viewer, it ignores subsequent params
+;; to avoid parameter injection attacks.
+WriteRegExpandStr HKEY_CLASSES_ROOT "${URLNAME}\shell\open\command" "" '"$INSTDIR\$INSTEXE" $INSTFLAGS -url "%1"'
+WriteRegStr HKEY_CLASSES_ROOT "x-grid-location-info"(default)" "URL:Second Life"
+WriteRegStr HKEY_CLASSES_ROOT "x-grid-location-info" "URL Protocol" ""
+WriteRegStr HKEY_CLASSES_ROOT "x-grid-location-info\DefaultIcon" "" '"$INSTDIR\$INSTEXE"'
+;; URL param must be last item passed to viewer, it ignores subsequent params
+;; to avoid parameter injection attacks.
+WriteRegExpandStr HKEY_CLASSES_ROOT "x-grid-location-info\shell\open\command" "" '"$INSTDIR\$INSTEXE" $INSTFLAGS -url "%1"'
+
+; write out uninstaller
+WriteUninstaller "$INSTDIR\uninst.exe"
+
+; Uninstall existing "Second Life Viewer 2" install if needed.
+StrCmp $DO_UNINSTALL_V2 "" REMOVE_SLV2_DONE
+ ExecWait '"$PROGRAMFILES\SecondLifeViewer2\uninst.exe" /S _?=$PROGRAMFILES\SecondLifeViewer2'
+ Delete "$PROGRAMFILES\SecondLifeViewer2\uninst.exe" ; with _? option above, uninst.exe will be left behind.
+ RMDir "$PROGRAMFILES\SecondLifeViewer2" ; will remove only if empty.
+
+ Call RestoreUserFiles
+ Call RemoveTempUserFiles
+REMOVE_SLV2_DONE:
+
+; end of default section
+SectionEnd
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; EOF ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
diff --git a/indra/newview/installers/windows/lang_en-us.nsi b/indra/newview/installers/windows/lang_en-us.nsi
index a01541377d..da0d7f54d2 100644
--- a/indra/newview/installers/windows/lang_en-us.nsi
+++ b/indra/newview/installers/windows/lang_en-us.nsi
Binary files differ
diff --git a/indra/newview/installers/windows/lang_ko.nsi b/indra/newview/installers/windows/lang_ko.nsi
deleted file mode 100644
index 5162b7ddad..0000000000
--- a/indra/newview/installers/windows/lang_ko.nsi
+++ /dev/null
Binary files differ
diff --git a/indra/newview/installers/windows/lang_nl.nsi b/indra/newview/installers/windows/lang_nl.nsi
deleted file mode 100644
index 8884b1e858..0000000000
--- a/indra/newview/installers/windows/lang_nl.nsi
+++ /dev/null
Binary files differ
diff --git a/indra/newview/installers/windows/lang_ru.nsi b/indra/newview/installers/windows/lang_ru.nsi
new file mode 100644
index 0000000000..de7affe08a
--- /dev/null
+++ b/indra/newview/installers/windows/lang_ru.nsi
Binary files differ
diff --git a/indra/newview/installers/windows/lang_tr.nsi b/indra/newview/installers/windows/lang_tr.nsi
new file mode 100644
index 0000000000..5e7e3d797b
--- /dev/null
+++ b/indra/newview/installers/windows/lang_tr.nsi
Binary files differ
diff --git a/indra/newview/installers/windows/lang_zh.nsi b/indra/newview/installers/windows/lang_zh.nsi
index d17e860df9..ecf1185fbb 100644
--- a/indra/newview/installers/windows/lang_zh.nsi
+++ b/indra/newview/installers/windows/lang_zh.nsi
Binary files differ
diff --git a/indra/newview/installers/windows/language_menu.nsi b/indra/newview/installers/windows/language_menu.nsi
index fef8d40c69..08ad42532f 100644
--- a/indra/newview/installers/windows/language_menu.nsi
+++ b/indra/newview/installers/windows/language_menu.nsi
Binary files differ
diff --git a/indra/newview/licenses-mac.txt b/indra/newview/licenses-mac.txt
index 1324fa1a86..af80bff5d9 100644
--- a/indra/newview/licenses-mac.txt
+++ b/indra/newview/licenses-mac.txt
@@ -315,516 +315,6 @@ This product includes cryptographic software written by Eric Young
Hudson (tjh@cryptsoft.com).
-===========
-Pth License
-===========
- ____ _ _
- | _ \| |_| |__ ``Ian Fleming was a UNIX fan!
- | |_) | __| '_ \ How do I know? Well, James Bond
- | __/| |_| | | | had the (license to kill) number 007,
- |_| \__|_| |_| i.e., he could execute anyone!''
-
- GNU Pth - The GNU Portable Threads
-
- LICENSE
- =======
-
- This library is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- For some people, it is not clear, what is the real intention of the
- author by using the GNU Lesser General Public License (LGPL) as the
- distribution license for GNU Pth. This is, because the LGPL and the
- GPL can be (and are often) interpreted very differently and some
- interpretations seem to be not compatible with others. So an explicit
- clarification for the use of the LGPL for GNU Pth from the authors
- point of view might be useful.
-
- The author places this library under the LGPL to make sure that it
- can be used both commercially and non-commercially provided that
- modifications to the code base are always donated back to the official
- code base under the same license conditions. Please keep in mind that
- especially using this library in code not staying under the GPL or
- the LGPL _is_ allowed and that any taint or license creap into code
- that uses the library is not the authors intention. It is just the
- case that _including_ this library into the source tree of other
- applications is a little bit more inconvinient because of the LGPL.
- But it has to be this way for good reasons. And keep in mind that
- inconvinient doesn't mean not allowed or even impossible.
-
- Even if you want to use this library in some BSD-style licensed
- packages, this _is_ possible as long as you are a little bit
- carefully. Usually this means you have to make sure that the code is
- still clearly separated into the source tree and that modifications to
- this source area are done under the conditions of the LGPL. Read below
- for more details on the conditions. Contact the author if you have
- more questions.
-
- The license text of the GNU Lesser General Public License follows:
- __________________________________________________________________________
-
- GNU LESSER GENERAL PUBLIC LICENSE
- Version 2.1, February 1999
-
- Copyright (C) 1991, 1999 Free Software Foundation, Inc.
- 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the Lesser GPL. It also counts
- as the successor of the GNU Library Public License, version 2, hence
- the version number 2.1.]
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
- This license, the Lesser General Public License, applies to some
-specially designated software packages--typically libraries--of the
-Free Software Foundation and other authors who decide to use it. You
-can use it too, but we suggest you first think carefully about whether
-this license or the ordinary General Public License is the better
-strategy to use in any particular case, based on the explanations below.
-
- When we speak of free software, we are referring to freedom of use,
-not price. Our General Public Licenses are designed to make sure that
-you have the freedom to distribute copies of free software (and charge
-for this service if you wish); that you receive source code or can get
-it if you want it; that you can change the software and use pieces of
-it in new free programs; and that you are informed that you can do
-these things.
-
- To protect your rights, we need to make restrictions that forbid
-distributors to deny you these rights or to ask you to surrender these
-rights. These restrictions translate to certain responsibilities for
-you if you distribute copies of the library or if you modify it.
-
- For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you. You must make sure that they, too, receive or can get the source
-code. If you link other code with the library, you must provide
-complete object files to the recipients, so that they can relink them
-with the library after making changes to the library and recompiling
-it. And you must show them these terms so they know their rights.
-
- We protect your rights with a two-step method: (1) we copyright the
-library, and (2) we offer you this license, which gives you legal
-permission to copy, distribute and/or modify the library.
-
- To protect each distributor, we want to make it very clear that
-there is no warranty for the free library. Also, if the library is
-modified by someone else and passed on, the recipients should know
-that what they have is not the original version, so that the original
-author's reputation will not be affected by problems that might be
-introduced by others.
-
- Finally, software patents pose a constant threat to the existence of
-any free program. We wish to make sure that a company cannot
-effectively restrict the users of a free program by obtaining a
-restrictive license from a patent holder. Therefore, we insist that
-any patent license obtained for a version of the library must be
-consistent with the full freedom of use specified in this license.
-
- Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License. This license, the GNU Lesser
-General Public License, applies to certain designated libraries, and
-is quite different from the ordinary General Public License. We use
-this license for certain libraries in order to permit linking those
-libraries into non-free programs.
-
- When a program is linked with a library, whether statically or using
-a shared library, the combination of the two is legally speaking a
-combined work, a derivative of the original library. The ordinary
-General Public License therefore permits such linking only if the
-entire combination fits its criteria of freedom. The Lesser General
-Public License permits more lax criteria for linking other code with
-the library.
-
- We call this license the "Lesser" General Public License because it
-does Less to protect the user's freedom than the ordinary General
-Public License. It also provides other free software developers Less
-of an advantage over competing non-free programs. These disadvantages
-are the reason we use the ordinary General Public License for many
-libraries. However, the Lesser license provides advantages in certain
-special circumstances.
-
- For example, on rare occasions, there may be a special need to
-encourage the widest possible use of a certain library, so that it becomes
-a de-facto standard. To achieve this, non-free programs must be
-allowed to use the library. A more frequent case is that a free
-library does the same job as widely used non-free libraries. In this
-case, there is little to gain by limiting the free library to free
-software only, so we use the Lesser General Public License.
-
- In other cases, permission to use a particular library in non-free
-programs enables a greater number of people to use a large body of
-free software. For example, permission to use the GNU C Library in
-non-free programs enables many more people to use the whole GNU
-operating system, as well as its variant, the GNU/Linux operating
-system.
-
- Although the Lesser General Public License is Less protective of the
-users' freedom, it does ensure that the user of a program that is
-linked with the Library has the freedom and the wherewithal to run
-that program using a modified version of the Library.
-
- The precise terms and conditions for copying, distribution and
-modification follow. Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library". The
-former contains code derived from the library, whereas the latter must
-be combined with the library in order to run.
-
- GNU LESSER GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License Agreement applies to any software library or other
-program which contains a notice placed by the copyright holder or
-other authorized party saying it may be distributed under the terms of
-this Lesser General Public License (also called "this License").
-Each licensee is addressed as "you".
-
- A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
- The "Library", below, refers to any such software library or work
-which has been distributed under these terms. A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language. (Hereinafter, translation is
-included without limitation in the term "modification".)
-
- "Source code" for a work means the preferred form of the work for
-making modifications to it. For a library, complete source code means
-all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation
-and installation of the library.
-
- Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it). Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-
- 1. You may copy and distribute verbatim copies of the Library's
-complete source code as you receive it, in any medium, provided that
-you conspicuously and appropriately publish on each copy an
-appropriate copyright notice and disclaimer of warranty; keep intact
-all the notices that refer to this License and to the absence of any
-warranty; and distribute a copy of this License along with the
-Library.
-
- You may charge a fee for the physical act of transferring a copy,
-and you may at your option offer warranty protection in exchange for a
-fee.
-
- 2. You may modify your copy or copies of the Library or any portion
-of it, thus forming a work based on the Library, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) The modified work must itself be a software library.
-
- b) You must cause the files modified to carry prominent notices
- stating that you changed the files and the date of any change.
-
- c) You must cause the whole of the work to be licensed at no
- charge to all third parties under the terms of this License.
-
- d) If a facility in the modified Library refers to a function or a
- table of data to be supplied by an application program that uses
- the facility, other than as an argument passed when the facility
- is invoked, then you must make a good faith effort to ensure that,
- in the event an application does not supply such function or
- table, the facility still operates, and performs whatever part of
- its purpose remains meaningful.
-
- (For example, a function in a library to compute square roots has
- a purpose that is entirely well-defined independent of the
- application. Therefore, Subsection 2d requires that any
- application-supplied function or table used by this function must
- be optional: if the application does not supply it, the square
- root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Library,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Library, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library. To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License. (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.) Do not make any other change in
-these notices.
-
- Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
- This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
- 4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you accompany
-it with the complete corresponding machine-readable source code, which
-must be distributed under the terms of Sections 1 and 2 above on a
-medium customarily used for software interchange.
-
- If distribution of object code is made by offering access to copy
-from a designated place, then offering equivalent access to copy the
-source code from the same place satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library". Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
- However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library". The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
- When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library. The
-threshold for this to be true is not precisely defined by law.
-
- If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work. (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
- Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-
- 6. As an exception to the Sections above, you may also combine or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
- You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License. You must supply a copy of this License. If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License. Also, you must do one
-of these things:
-
- a) Accompany the work with the complete corresponding
- machine-readable source code for the Library including whatever
- changes were used in the work (which must be distributed under
- Sections 1 and 2 above); and, if the work is an executable linked
- with the Library, with the complete machine-readable "work that
- uses the Library", as object code and/or source code, so that the
- user can modify the Library and then relink to produce a modified
- executable containing the modified Library. (It is understood
- that the user who changes the contents of definitions files in the
- Library will not necessarily be able to recompile the application
- to use the modified definitions.)
-
- b) Use a suitable shared library mechanism for linking with the
- Library. A suitable mechanism is one that (1) uses at run time a
- copy of the library already present on the user's computer system,
- rather than copying library functions into the executable, and (2)
- will operate properly with a modified version of the library, if
- the user installs one, as long as the modified version is
- interface-compatible with the version that the work was made with.
-
- c) Accompany the work with a written offer, valid for at
- least three years, to give the same user the materials
- specified in Subsection 6a, above, for a charge no more
- than the cost of performing this distribution.
-
- d) If distribution of the work is made by offering access to copy
- from a designated place, offer equivalent access to copy the above
- specified materials from the same place.
-
- e) Verify that the user has already received a copy of these
- materials or that you have already sent this user a copy.
-
- For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it. However, as a special exception,
-the materials to be distributed need not include anything that is
-normally distributed (in either source or binary form) with the major
-components (compiler, kernel, and so on) of the operating system on
-which the executable runs, unless that component itself accompanies
-the executable.
-
- It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system. Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-
- 7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
- a) Accompany the combined library with a copy of the same work
- based on the Library, uncombined with any other library
- facilities. This must be distributed under the terms of the
- Sections above.
-
- b) Give prominent notice with the combined library of the fact
- that part of it is a work based on the Library, and explaining
- where to find the accompanying uncombined form of the same work.
-
- 8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License. Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library is void, and will automatically terminate your
-rights under this License. However, parties who have received copies,
-or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
- 9. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Library or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
- 10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-subject to these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties with
-this License.
-
- 11. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Library at all. For example, if a patent
-license would not permit royalty-free redistribution of the Library by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply,
-and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library under this License may add
-an explicit geographical distribution limitation excluding those countries,
-so that distribution is permitted only in or among countries not thus
-excluded. In such case, this License incorporates the limitation as if
-written in the body of this License.
-
- 13. The Free Software Foundation may publish revised and/or new
-versions of the Lesser General Public License from time to time.
-Such new versions will be similar in spirit to the present version,
-but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Library
-specifies a version number of this License which applies to it and
-"any later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation. If the Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-
- 14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-write to the author to ask for permission. For software which is
-copyrighted by the Free Software Foundation, write to the Free
-Software Foundation; we sometimes make exceptions for this. Our
-decision will be guided by the two goals of preserving the free status
-of all derivatives of our free software and of promoting the sharing
-and reuse of software generally.
-
- NO WARRANTY
-
- 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
-KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
-LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
-FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
-LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
-
=======================
Original SSLeay License
=======================
diff --git a/indra/newview/licenses-win32.txt b/indra/newview/licenses-win32.txt
index 7e6d4b4561..8736626907 100644
--- a/indra/newview/licenses-win32.txt
+++ b/indra/newview/licenses-win32.txt
@@ -769,3 +769,72 @@ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+=============
+GLOD license
+=============
+The GLOD Open-Source License Version 1.0 June 16, 2004
+
+Copyright (C) 2003-04 Jonathan Cohen, Nat Duca, Chris Niski, Johns
+Hopkins University and David Luebke, Brenden Schubert, University of
+Virginia. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, is permitted provided that the following conditions are
+met:
+
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer and
+ request.
+
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer and
+ request in the documentation and/or other materials provided with
+ the distribution.
+
+3. The name "GLOD" must not be used to endorse or promote products
+ derived from this software without prior written permission.
+
+4. Redistributions of any modified version of this source, whether in
+ source or binary form , must include a form of the following
+ acknowledgment: "This product is derived from the GLOD library,
+ which is available from http://www.cs.jhu.edu/~graphics/GLOD."
+
+5. Redistributions of any modified version of this source in binary
+ form must provide, free of charge, access to the modified version
+ of the code.
+
+6. This license shall be governed by and construed and enforced in
+ accordance with the laws of the State of Maryland, without
+ reference to its conflicts of law provisions. The exclusive
+ jurisdiction and venue for all legal actions relating to this
+ license shall be in courts of competent subject matter jurisdiction
+ located in the State of Maryland.
+
+TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, GLOD IS PROVIDED
+UNDER THIS LICENSE ON AN AS IS BASIS, WITHOUT WARRANTY OF ANY KIND,
+EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
+THAT GLOD IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR
+PURPOSE OR NON-INFRINGING. ALL WARRANTIES ARE DISCLAIMED AND THE
+ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE CODE IS WITH
+YOU. SHOULD ANY CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE
+COPYRIGHT HOLDER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY
+NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY
+CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY CODE IS
+AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
+
+TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT SHALL
+THE COPYRIGHT HOLDER OR ANY OTHER CONTRIBUTOR BE LIABLE FOR ANY
+SPECIAL, INCIDENTAL, INDIRECT, OR CONSEQUENTIAL DAMAGES FOR LOSS OF
+PROFITS, REVENUE, OR FOR LOSS OF INFORMATION OR ANY OTHER LOSS.
+
+YOU EXPRESSLY AGREE TO FOREVER INDEMNIFY, DEFEND AND HOLD HARMLESS THE
+COPYRIGHT HOLDERS AND CONTRIBUTORS OF GLOD AGAINST ALL CLAIMS,
+DEMANDS, SUITS OR OTHER ACTIONS ARISING DIRECTLY OR INDIRECTLY FROM
+YOUR ACCEPTANCE AND USE OF GLOD.
+
+Although NOT REQUIRED, we would appreciate it if active users of GLOD
+put a link on their web site to the GLOD web site when possible.
+
+
diff --git a/indra/newview/linux_tools/wrapper.sh b/indra/newview/linux_tools/wrapper.sh
index d2df968544..283a28a0aa 100755
--- a/indra/newview/linux_tools/wrapper.sh
+++ b/indra/newview/linux_tools/wrapper.sh
@@ -92,23 +92,23 @@ cd "${RUN_PATH}"
## subprocesses that care.
export SAVED_LD_LIBRARY_PATH="${LD_LIBRARY_PATH}"
-if [ -n "$LL_TCMALLOC" ]; then
- tcmalloc_libs='/usr/lib/libtcmalloc.so.0 /usr/lib/libstacktrace.so.0 /lib/libpthread.so.0'
- all=1
- for f in $tcmalloc_libs; do
- if [ ! -f $f ]; then
- all=0
- fi
- done
- if [ $all != 1 ]; then
- echo 'Cannot use tcmalloc libraries: components missing' 1>&2
- else
- export LD_PRELOAD=$(echo $tcmalloc_libs | tr ' ' :)
- if [ -z "$HEAPCHECK" -a -z "$HEAPPROFILE" ]; then
- export HEAPCHECK=${HEAPCHECK:-normal}
- fi
- fi
-fi
+# if [ -n "$LL_TCMALLOC" ]; then
+# tcmalloc_libs='/usr/lib/libtcmalloc.so.0 /usr/lib/libstacktrace.so.0 /lib/libpthread.so.0'
+# all=1
+# for f in $tcmalloc_libs; do
+# if [ ! -f $f ]; then
+# all=0
+# fi
+# done
+# if [ $all != 1 ]; then
+# echo 'Cannot use tcmalloc libraries: components missing' 1>&2
+# else
+# export LD_PRELOAD=$(echo $tcmalloc_libs | tr ' ' :)
+# if [ -z "$HEAPCHECK" -a -z "$HEAPPROFILE" ]; then
+# export HEAPCHECK=${HEAPCHECK:-normal}
+# fi
+# fi
+#fi
export SL_ENV='LD_LIBRARY_PATH="`pwd`"/lib:"${LD_LIBRARY_PATH}"'
export SL_CMD='$LL_WRAPPER bin/do-not-directly-run-secondlife-bin'
diff --git a/indra/newview/llaccountingcostmanager.cpp b/indra/newview/llaccountingcostmanager.cpp
new file mode 100644
index 0000000000..8767955fcb
--- /dev/null
+++ b/indra/newview/llaccountingcostmanager.cpp
@@ -0,0 +1,181 @@
+/**
+ * @file LLAccountingQuotaManager.cpp
+ * @ Handles the setting and accessing for costs associated with mesh
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llaccountingcostmanager.h"
+#include "llagent.h"
+#include "llcurl.h"
+#include "llhttpclient.h"
+//===============================================================================
+LLAccountingCostManager::LLAccountingCostManager()
+{
+}
+//===============================================================================
+class LLAccountingCostResponder : public LLCurl::Responder
+{
+public:
+ LLAccountingCostResponder( const LLSD& objectIDs, const LLHandle<LLAccountingCostObserver>& observer_handle )
+ : mObjectIDs( objectIDs ),
+ mObserverHandle( observer_handle )
+ {
+ LLAccountingCostObserver* observer = mObserverHandle.get();
+ if (observer)
+ {
+ mTransactionID = observer->getTransactionID();
+ }
+ }
+
+ void clearPendingRequests ( void )
+ {
+ for ( LLSD::array_iterator iter = mObjectIDs.beginArray(); iter != mObjectIDs.endArray(); ++iter )
+ {
+ LLAccountingCostManager::getInstance()->removePendingObject( iter->asUUID() );
+ }
+ }
+
+ void error( U32 statusNum, const std::string& reason )
+ {
+ llwarns << "Transport error "<<reason<<llendl;
+ clearPendingRequests();
+
+ LLAccountingCostObserver* observer = mObserverHandle.get();
+ if (observer && observer->getTransactionID() == mTransactionID)
+ {
+ observer->setErrorStatus(statusNum, reason);
+ }
+ }
+
+ void result( const LLSD& content )
+ {
+ //Check for error
+ if ( !content.isMap() || content.has("error") )
+ {
+ llwarns << "Error on fetched data"<< llendl;
+ }
+ else if (content.has("selected"))
+ {
+ F32 physicsCost = 0.0f;
+ F32 networkCost = 0.0f;
+ F32 simulationCost = 0.0f;
+
+ physicsCost = content["selected"]["physics"].asReal();
+ networkCost = content["selected"]["streaming"].asReal();
+ simulationCost = content["selected"]["simulation"].asReal();
+
+ SelectionCost selectionCost( /*transactionID,*/ physicsCost, networkCost, simulationCost );
+
+ LLAccountingCostObserver* observer = mObserverHandle.get();
+ if (observer && observer->getTransactionID() == mTransactionID)
+ {
+ observer->onWeightsUpdate(selectionCost);
+ }
+ }
+
+ clearPendingRequests();
+ }
+
+private:
+ //List of posted objects
+ LLSD mObjectIDs;
+
+ // Current request ID
+ LLUUID mTransactionID;
+
+ // Cost update observer handle
+ LLHandle<LLAccountingCostObserver> mObserverHandle;
+};
+//===============================================================================
+void LLAccountingCostManager::fetchCosts( eSelectionType selectionType,
+ const std::string& url,
+ const LLHandle<LLAccountingCostObserver>& observer_handle )
+{
+ // Invoking system must have already determined capability availability
+ if ( !url.empty() )
+ {
+ LLSD objectList;
+ U32 objectIndex = 0;
+
+ IDIt IDIter = mObjectList.begin();
+ IDIt IDIterEnd = mObjectList.end();
+
+ for ( ; IDIter != IDIterEnd; ++IDIter )
+ {
+ // Check to see if a request for this object has already been made.
+ if ( mPendingObjectQuota.find( *IDIter ) == mPendingObjectQuota.end() )
+ {
+ mPendingObjectQuota.insert( *IDIter );
+ objectList[objectIndex++] = *IDIter;
+ }
+ }
+
+ mObjectList.clear();
+
+ //Post results
+ if ( objectList.size() > 0 )
+ {
+ std::string keystr;
+ if ( selectionType == Roots )
+ {
+ keystr="selected_roots";
+ }
+ else
+ if ( selectionType == Prims )
+ {
+ keystr="selected_prims";
+ }
+ else
+ {
+ llinfos<<"Invalid selection type "<<llendl;
+ mObjectList.clear();
+ mPendingObjectQuota.clear();
+ return;
+ }
+
+ LLSD dataToPost = LLSD::emptyMap();
+ dataToPost[keystr.c_str()] = objectList;
+
+ LLHTTPClient::post( url, dataToPost, new LLAccountingCostResponder( objectList, observer_handle ));
+ }
+ }
+ else
+ {
+ //url was empty - warn & continue
+ llwarns<<"Supplied url is empty "<<llendl;
+ mObjectList.clear();
+ mPendingObjectQuota.clear();
+ }
+}
+//===============================================================================
+void LLAccountingCostManager::addObject( const LLUUID& objectID )
+{
+ mObjectList.insert( objectID );
+}
+//===============================================================================
+void LLAccountingCostManager::removePendingObject( const LLUUID& objectID )
+{
+ mPendingObjectQuota.erase( objectID );
+}
+//===============================================================================
diff --git a/indra/newview/llaccountingcostmanager.h b/indra/newview/llaccountingcostmanager.h
new file mode 100644
index 0000000000..0bca1f54ef
--- /dev/null
+++ b/indra/newview/llaccountingcostmanager.h
@@ -0,0 +1,75 @@
+/**
+ * @file lllAccountingQuotaManager.h
+ * @
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_ACCOUNTINGQUOTAMANAGER_H
+#define LL_ACCOUNTINGQUOTAMANAGER_H
+//===============================================================================
+#include "llhandle.h"
+
+#include "llaccountingcost.h"
+//===============================================================================
+// An interface class for panels which display the parcel accounting information.
+class LLAccountingCostObserver
+{
+public:
+ LLAccountingCostObserver() { mObserverHandle.bind(this); }
+ virtual ~LLAccountingCostObserver() {}
+ virtual void onWeightsUpdate(const SelectionCost& selection_cost) = 0;
+ virtual void setErrorStatus(U32 status, const std::string& reason) = 0;
+ const LLHandle<LLAccountingCostObserver>& getObserverHandle() const { return mObserverHandle; }
+ const LLUUID& getTransactionID() { return mTransactionID; }
+
+protected:
+ virtual void generateTransactionID() = 0;
+
+ LLRootHandle<LLAccountingCostObserver> mObserverHandle;
+ LLUUID mTransactionID;
+};
+//===============================================================================
+class LLAccountingCostManager : public LLSingleton<LLAccountingCostManager>
+{
+public:
+ //Ctor
+ LLAccountingCostManager();
+ //Store an object that will be eventually fetched
+ void addObject( const LLUUID& objectID );
+ //Request quotas for object list
+ void fetchCosts( eSelectionType selectionType, const std::string& url,
+ const LLHandle<LLAccountingCostObserver>& observer_handle );
+ //Delete a specific object from the pending list
+ void removePendingObject( const LLUUID& objectID );
+
+private:
+ //Set of objects that will be used to generate a cost
+ std::set<LLUUID> mObjectList;
+ //During fetchCosts we move object into a the pending set to signify that
+ //a fetch has been instigated.
+ std::set<LLUUID> mPendingObjectQuota;
+ typedef std::set<LLUUID>::iterator IDIt;
+};
+//===============================================================================
+
+#endif // LLACCOUNTINGCOSTMANAGER
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index 001a6a8851..3870a3be2e 100644..100755
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -25,19 +25,23 @@
*/
#include "llviewerprecompiledheaders.h"
+
#include "llagent.h"
#include "pipeline.h"
+#include "llagentaccess.h"
#include "llagentcamera.h"
#include "llagentlistener.h"
#include "llagentwearables.h"
#include "llagentui.h"
#include "llanimationstates.h"
-#include "llbottomtray.h"
#include "llcallingcard.h"
+#include "llcapabilitylistener.h"
#include "llchannelmanager.h"
+#include "llchicletbar.h"
#include "llconsole.h"
+#include "llenvmanager.h"
#include "llfirstuse.h"
#include "llfloatercamera.h"
#include "llfloaterreg.h"
@@ -55,15 +59,21 @@
#include "llpaneltopinfobar.h"
#include "llparcel.h"
#include "llrendersphere.h"
+#include "llsdmessage.h"
#include "llsdutil.h"
#include "llsky.h"
+#include "llslurl.h"
#include "llsmoothstep.h"
#include "llstartup.h"
#include "llstatusbar.h"
#include "llteleportflags.h"
#include "lltool.h"
+#include "lltoolbarview.h"
+#include "lltoolpie.h"
#include "lltoolmgr.h"
#include "lltrans.h"
+#include "lluictrl.h"
+#include "llurlentry.h"
#include "llviewercontrol.h"
#include "llviewerdisplay.h"
#include "llviewerjoystick.h"
@@ -72,10 +82,12 @@
#include "llviewerobjectlist.h"
#include "llviewerparcelmgr.h"
#include "llviewerstats.h"
+#include "llviewerwindow.h"
#include "llvoavatarself.h"
#include "llwindow.h"
#include "llworld.h"
#include "llworldmap.h"
+#include "stringize.h"
using namespace LLVOAvatarDefines;
@@ -97,7 +109,6 @@ const F64 CHAT_AGE_FAST_RATE = 3.0;
const F32 MIN_FIDGET_TIME = 8.f; // seconds
const F32 MAX_FIDGET_TIME = 20.f; // seconds
-
// The agent instance.
LLAgent gAgent;
@@ -105,6 +116,9 @@ LLAgent gAgent;
// Statics
//
+/// minimum time after setting away state before coming back based on movement
+const F32 LLAgent::MIN_AFK_TIME = 10.0f;
+
const F32 LLAgent::TYPING_TIMEOUT_SECS = 5.f;
std::map<std::string, std::string> LLAgent::sTeleportErrorMessages;
@@ -140,6 +154,64 @@ bool handleSlowMotionAnimation(const LLSD& newvalue)
return true;
}
+// static
+void LLAgent::parcelChangedCallback()
+{
+ bool can_edit = LLToolMgr::getInstance()->canEdit();
+
+ gAgent.mCanEditParcel = can_edit;
+}
+
+// static
+bool LLAgent::isActionAllowed(const LLSD& sdname)
+{
+ bool retval = false;
+
+ const std::string& param = sdname.asString();
+
+ if (param == "speak")
+ {
+ if ( gAgent.isVoiceConnected() &&
+ LLViewerParcelMgr::getInstance()->allowAgentVoice() &&
+ ! LLVoiceClient::getInstance()->inTuningMode() )
+ {
+ retval = true;
+ }
+ else
+ {
+ retval = false;
+ }
+ }
+
+ return retval;
+}
+
+// static
+void LLAgent::pressMicrophone(const LLSD& name)
+{
+ LLFirstUse::speak(false);
+
+ LLVoiceClient::getInstance()->inputUserControlState(true);
+}
+
+// static
+void LLAgent::releaseMicrophone(const LLSD& name)
+{
+ LLVoiceClient::getInstance()->inputUserControlState(false);
+}
+
+// static
+void LLAgent::toggleMicrophone(const LLSD& name)
+{
+ LLVoiceClient::getInstance()->toggleUserPTTState();
+}
+
+// static
+bool LLAgent::isMicrophoneOn(const LLSD& sdname)
+{
+ return LLVoiceClient::getInstance()->getUserPTTState();
+}
+
// ************************************************************
// Enabled this definition to compile a 'hacked' viewer that
// locally believes the end user has godlike powers.
@@ -170,7 +242,9 @@ LLAgent::LLAgent() :
mbRunning(false),
mbTeleportKeepsLookAt(false),
- mAgentAccess(gSavedSettings),
+ mAgentAccess(new LLAgentAccess(gSavedSettings)),
+ mCanEditParcel(false),
+ mTeleportSourceSLURL(new LLSLURL),
mTeleportState( TELEPORT_NONE ),
mRegionp(NULL),
@@ -197,6 +271,7 @@ LLAgent::LLAgent() :
mAutoPilot(FALSE),
mAutoPilotFlyOnStop(FALSE),
+ mAutoPilotAllowFlying(TRUE),
mAutoPilotTargetGlobal(),
mAutoPilotStopDistance(1.f),
mAutoPilotUseRotation(FALSE),
@@ -207,7 +282,7 @@ LLAgent::LLAgent() :
mAutoPilotFinishedCallback(NULL),
mAutoPilotCallbackData(NULL),
- mEffectColor(LLColor4(0.f, 1.f, 1.f, 1.f)),
+ mEffectColor(new LLUIColor(LLColor4(0.f, 1.f, 1.f, 1.f))),
mHaveHomePosition(FALSE),
mHomeRegionHandle( 0 ),
@@ -217,8 +292,13 @@ LLAgent::LLAgent() :
mCurrentFidget(0),
mFirstLogin(FALSE),
mGenderChosen(FALSE),
+
+ mVoiceConnected(false),
+
+ mAppearanceSerialNum(0),
- mAppearanceSerialNum(0)
+ mMouselookModeInSignal(NULL),
+ mMouselookModeOutSignal(NULL)
{
for (U32 i = 0; i < TOTAL_CONTROLS; i++)
{
@@ -246,11 +326,13 @@ void LLAgent::init()
setFlying( gSavedSettings.getBOOL("FlyingAtExit") );
- mEffectColor = LLUIColorTable::instance().getColor("EffectColor");
+ *mEffectColor = LLUIColorTable::instance().getColor("EffectColor");
gSavedSettings.getControl("PreferredMaturity")->getValidateSignal()->connect(boost::bind(&LLAgent::validateMaturity, this, _2));
gSavedSettings.getControl("PreferredMaturity")->getSignal()->connect(boost::bind(&LLAgent::handleMaturity, this, _2));
-
+
+ LLViewerParcelMgr::getInstance()->addAgentParcelChangedCallback(boost::bind(&LLAgent::parcelChangedCallback));
+
mInitialized = TRUE;
}
@@ -269,7 +351,17 @@ LLAgent::~LLAgent()
{
cleanup();
- // *Note: this is where LLViewerCamera::getInstance() used to be deleted.
+ delete mMouselookModeInSignal;
+ mMouselookModeInSignal = NULL;
+ delete mMouselookModeOutSignal;
+ mMouselookModeOutSignal = NULL;
+
+ delete mAgentAccess;
+ mAgentAccess = NULL;
+ delete mEffectColor;
+ mEffectColor = NULL;
+ delete mTeleportSourceSLURL;
+ mTeleportSourceSLURL = NULL;
}
// Handle any actions that need to be performed when the main app gains focus
@@ -552,6 +644,11 @@ void LLAgent::setFlying(BOOL fly)
// static
void LLAgent::toggleFlying()
{
+ if ( gAgent.mAutoPilot )
+ {
+ LLToolPie::instance().stopClickToWalk();
+ }
+
BOOL fly = !gAgent.getFlying();
gAgent.mMoveTimer.reset();
@@ -583,6 +680,8 @@ void LLAgent::standUp()
//-----------------------------------------------------------------------------
void LLAgent::setRegion(LLViewerRegion *regionp)
{
+ bool teleport = true;
+
llassert(regionp);
if (mRegionp != regionp)
{
@@ -620,6 +719,8 @@ void LLAgent::setRegion(LLViewerRegion *regionp)
gSky.mVOGroundp->setRegion(regionp);
}
+ // Notify windlight managers
+ teleport = (gAgent.getTeleportState() != LLAgent::TELEPORT_NONE);
}
else
{
@@ -637,9 +738,16 @@ void LLAgent::setRegion(LLViewerRegion *regionp)
// Update all of the regions.
LLWorld::getInstance()->updateAgentOffset(mAgentOriginGlobal);
}
+
+ // Pass new region along to metrics components that care about this level of detail.
+ LLAppViewer::metricsUpdateRegion(regionp->getHandle());
}
mRegionp = regionp;
+ // Pass the region host to LLUrlEntryParcel to resolve parcel name
+ // with a server request.
+ LLUrlEntryParcel::setRegionHost(getRegionHost());
+
// Must shift hole-covering water object locations because local
// coordinate frame changed.
LLWorld::getInstance()->updateWaterObjects();
@@ -653,6 +761,15 @@ void LLAgent::setRegion(LLViewerRegion *regionp)
LLSelectMgr::getInstance()->updateSelectionCenter();
LLFloaterMove::sUpdateFlyingStatus();
+
+ if (teleport)
+ {
+ LLEnvManagerNew::instance().onTeleport();
+ }
+ else
+ {
+ LLEnvManagerNew::instance().onRegionCrossing();
+ }
}
@@ -980,20 +1097,11 @@ F32 LLAgent::clampPitchToLimits(F32 angle)
LLVector3 skyward = getReferenceUpVector();
- F32 look_down_limit;
- F32 look_up_limit = 10.f * DEG_TO_RAD;
+ const F32 look_down_limit = 179.f * DEG_TO_RAD;;
+ const F32 look_up_limit = 1.f * DEG_TO_RAD;
F32 angle_from_skyward = acos( mFrameAgent.getAtAxis() * skyward );
- if (isAgentAvatarValid() && gAgentAvatarp->isSitting())
- {
- look_down_limit = 130.f * DEG_TO_RAD;
- }
- else
- {
- look_down_limit = 170.f * DEG_TO_RAD;
- }
-
// clamp pitch to limits
if ((angle >= 0.f) && (angle_from_skyward + angle > look_down_limit))
{
@@ -1105,12 +1213,6 @@ void LLAgent::resetControlFlags()
//-----------------------------------------------------------------------------
void LLAgent::setAFK()
{
- // Drones can't go AFK
- if (gNoRender)
- {
- return;
- }
-
if (!gAgent.getRegion())
{
// Don't set AFK if we're not talking to a region yet.
@@ -1121,6 +1223,7 @@ void LLAgent::setAFK()
{
sendAnimationRequest(ANIM_AGENT_AWAY, ANIM_REQUEST_START);
setControlFlags(AGENT_CONTROL_AWAY | AGENT_CONTROL_STOP);
+ LL_INFOS("AFK") << "Setting Away" << LL_ENDL;
gAwayTimer.start();
if (gAFKMenu)
{
@@ -1144,6 +1247,7 @@ void LLAgent::clearAFK()
{
sendAnimationRequest(ANIM_AGENT_AWAY, ANIM_REQUEST_STOP);
clearControlFlags(AGENT_CONTROL_AWAY);
+ LL_INFOS("AFK") << "Clearing Away" << LL_ENDL;
if (gAFKMenu)
{
gAFKMenu->setLabel(LLTrans::getString("AvatarSetAway"));
@@ -1199,17 +1303,32 @@ BOOL LLAgent::getBusy() const
//-----------------------------------------------------------------------------
// startAutoPilotGlobal()
//-----------------------------------------------------------------------------
-void LLAgent::startAutoPilotGlobal(const LLVector3d &target_global, const std::string& behavior_name, const LLQuaternion *target_rotation, void (*finish_callback)(BOOL, void *), void *callback_data, F32 stop_distance, F32 rot_threshold)
+void LLAgent::startAutoPilotGlobal(
+ const LLVector3d &target_global,
+ const std::string& behavior_name,
+ const LLQuaternion *target_rotation,
+ void (*finish_callback)(BOOL, void *),
+ void *callback_data,
+ F32 stop_distance,
+ F32 rot_threshold,
+ BOOL allow_flying)
{
if (!isAgentAvatarValid())
{
return;
}
+ // Are there any pending callbacks from previous auto pilot requests?
+ if (mAutoPilotFinishedCallback)
+ {
+ mAutoPilotFinishedCallback(dist_vec(gAgent.getPositionGlobal(), mAutoPilotTargetGlobal) < mAutoPilotStopDistance, mAutoPilotCallbackData);
+ }
+
mAutoPilotFinishedCallback = finish_callback;
mAutoPilotCallbackData = callback_data;
mAutoPilotRotationThreshold = rot_threshold;
mAutoPilotBehaviorName = behavior_name;
+ mAutoPilotAllowFlying = allow_flying;
LLVector3d delta_pos( target_global );
delta_pos -= getPositionGlobal();
@@ -1230,21 +1349,30 @@ void LLAgent::startAutoPilotGlobal(const LLVector3d &target_global, const std::s
else
{
// Guess at a reasonable stop distance.
- mAutoPilotStopDistance = fsqrtf( distance );
+ mAutoPilotStopDistance = (F32) sqrt( distance );
if (mAutoPilotStopDistance < 0.5f)
{
mAutoPilotStopDistance = 0.5f;
}
}
- mAutoPilotFlyOnStop = getFlying();
+ if (mAutoPilotAllowFlying)
+ {
+ mAutoPilotFlyOnStop = getFlying();
+ }
+ else
+ {
+ mAutoPilotFlyOnStop = FALSE;
+ }
- if (distance > 30.0)
+ if (distance > 30.0 && mAutoPilotAllowFlying)
{
setFlying(TRUE);
}
- if ( distance > 1.f && heightDelta > (sqrtf(mAutoPilotStopDistance) + 1.f))
+ if ( distance > 1.f &&
+ mAutoPilotAllowFlying &&
+ heightDelta > (sqrtf(mAutoPilotStopDistance) + 1.f))
{
setFlying(TRUE);
// Do not force flying for "Sit" behavior to prevent flying after pressing "Stand"
@@ -1254,22 +1382,8 @@ void LLAgent::startAutoPilotGlobal(const LLVector3d &target_global, const std::s
}
mAutoPilot = TRUE;
- mAutoPilotTargetGlobal = target_global;
+ setAutoPilotTargetGlobal(target_global);
- // trace ray down to find height of destination from ground
- LLVector3d traceEndPt = target_global;
- traceEndPt.mdV[VZ] -= 20.f;
-
- LLVector3d targetOnGround;
- LLVector3 groundNorm;
- LLViewerObject *obj;
-
- LLWorld::getInstance()->resolveStepHeightGlobal(NULL, target_global, traceEndPt, targetOnGround, groundNorm, &obj);
- F64 target_height = llmax((F64)gAgentAvatarp->getPelvisToFoot(), target_global.mdV[VZ] - targetOnGround.mdV[VZ]);
-
- // clamp z value of target to minimum height above ground
- mAutoPilotTargetGlobal.mdV[VZ] = targetOnGround.mdV[VZ] + target_height;
- mAutoPilotTargetDist = (F32)dist_vec(gAgent.getPositionGlobal(), mAutoPilotTargetGlobal);
if (target_rotation)
{
mAutoPilotUseRotation = TRUE;
@@ -1287,12 +1401,36 @@ void LLAgent::startAutoPilotGlobal(const LLVector3d &target_global, const std::s
//-----------------------------------------------------------------------------
-// startFollowPilot()
+// setAutoPilotTargetGlobal
//-----------------------------------------------------------------------------
-void LLAgent::startFollowPilot(const LLUUID &leader_id)
+void LLAgent::setAutoPilotTargetGlobal(const LLVector3d &target_global)
{
- if (!mAutoPilot) return;
+ if (mAutoPilot)
+ {
+ mAutoPilotTargetGlobal = target_global;
+
+ // trace ray down to find height of destination from ground
+ LLVector3d traceEndPt = target_global;
+ traceEndPt.mdV[VZ] -= 20.f;
+ LLVector3d targetOnGround;
+ LLVector3 groundNorm;
+ LLViewerObject *obj;
+
+ LLWorld::getInstance()->resolveStepHeightGlobal(NULL, target_global, traceEndPt, targetOnGround, groundNorm, &obj);
+ F64 target_height = llmax((F64)gAgentAvatarp->getPelvisToFoot(), target_global.mdV[VZ] - targetOnGround.mdV[VZ]);
+
+ // clamp z value of target to minimum height above ground
+ mAutoPilotTargetGlobal.mdV[VZ] = targetOnGround.mdV[VZ] + target_height;
+ mAutoPilotTargetDist = (F32)dist_vec(gAgent.getPositionGlobal(), mAutoPilotTargetGlobal);
+ }
+}
+
+//-----------------------------------------------------------------------------
+// startFollowPilot()
+//-----------------------------------------------------------------------------
+void LLAgent::startFollowPilot(const LLUUID &leader_id, BOOL allow_flying, F32 stop_distance)
+{
mLeaderID = leader_id;
if ( mLeaderID.isNull() ) return;
@@ -1303,7 +1441,14 @@ void LLAgent::startFollowPilot(const LLUUID &leader_id)
return;
}
- startAutoPilotGlobal(object->getPositionGlobal());
+ startAutoPilotGlobal(object->getPositionGlobal(),
+ std::string(), // behavior_name
+ NULL, // target_rotation
+ NULL, // finish_callback
+ NULL, // callback_data
+ stop_distance,
+ 0.03f, // rotation_threshold
+ allow_flying);
}
@@ -1330,6 +1475,7 @@ void LLAgent::stopAutoPilot(BOOL user_cancel)
if (mAutoPilotFinishedCallback)
{
mAutoPilotFinishedCallback(!user_cancel && dist_vec(gAgent.getPositionGlobal(), mAutoPilotTargetGlobal) < mAutoPilotStopDistance, mAutoPilotCallbackData);
+ mAutoPilotFinishedCallback = NULL;
}
mLeaderID = LLUUID::null;
@@ -1369,7 +1515,7 @@ void LLAgent::autoPilot(F32 *delta_yaw)
if (!isAgentAvatarValid()) return;
- if (gAgentAvatarp->mInAir)
+ if (gAgentAvatarp->mInAir && mAutoPilotAllowFlying)
{
setFlying(TRUE);
}
@@ -1670,11 +1816,6 @@ void LLAgent::clearRenderState(U8 clearstate)
//-----------------------------------------------------------------------------
U8 LLAgent::getRenderState()
{
- if (gNoRender || gKeyboard == NULL)
- {
- return 0;
- }
-
// *FIX: don't do stuff in a getter! This is infinite loop city!
if ((mTypingTimer.getElapsedTimeF32() > TYPING_TIMEOUT_SECS)
&& (mRenderState & AGENT_STATE_TYPING))
@@ -1712,11 +1853,12 @@ void LLAgent::endAnimationUpdateUI()
// clean up UI from mode we're leaving
if (gAgentCamera.getLastCameraMode() == CAMERA_MODE_MOUSELOOK )
{
+ gToolBarView->setToolBarsVisible(true);
// show mouse cursor
gViewerWindow->showCursor();
// show menus
gMenuBarView->setVisible(TRUE);
- LLNavigationBar::getInstance()->setVisible(TRUE);
+ LLNavigationBar::getInstance()->setVisible(TRUE && gSavedSettings.getBOOL("ShowNavbarNavigationPanel"));
gStatusBar->setVisibleForMouselook(true);
if (gSavedSettings.getBOOL("ShowMiniLocationPanel"))
@@ -1724,7 +1866,7 @@ void LLAgent::endAnimationUpdateUI()
LLPanelTopInfoBar::getInstance()->setVisible(TRUE);
}
- LLBottomTray::getInstance()->onMouselookModeOut();
+ LLChicletBar::getInstance()->setVisible(TRUE);
LLPanelStandStopFlying::getInstance()->setVisible(TRUE);
@@ -1732,6 +1874,11 @@ void LLAgent::endAnimationUpdateUI()
LLFloaterCamera::onLeavingMouseLook();
+ if (mMouselookModeOutSignal)
+ {
+ (*mMouselookModeOutSignal)();
+ }
+
// Only pop if we have pushed...
if (TRUE == mViewsPushed)
{
@@ -1816,14 +1963,19 @@ void LLAgent::endAnimationUpdateUI()
//---------------------------------------------------------------------
if (gAgentCamera.getCameraMode() == CAMERA_MODE_MOUSELOOK)
{
- // hide menus
+ // clean up UI
+ // first show anything hidden by UI toggle
+ gViewerWindow->setUIVisibility(TRUE);
+
+ // then hide stuff we want hidden for mouselook
+ gToolBarView->setToolBarsVisible(false);
gMenuBarView->setVisible(FALSE);
LLNavigationBar::getInstance()->setVisible(FALSE);
gStatusBar->setVisibleForMouselook(false);
LLPanelTopInfoBar::getInstance()->setVisible(FALSE);
- LLBottomTray::getInstance()->onMouselookModeIn();
+ LLChicletBar::getInstance()->setVisible(FALSE);
LLPanelStandStopFlying::getInstance()->setVisible(FALSE);
@@ -1837,6 +1989,11 @@ void LLAgent::endAnimationUpdateUI()
mViewsPushed = TRUE;
+ if (mMouselookModeInSignal)
+ {
+ (*mMouselookModeInSignal)();
+ }
+
// hide all floaters except the mini map
#if 0 // Use this once all floaters are registered
@@ -1896,7 +2053,6 @@ void LLAgent::endAnimationUpdateUI()
}
}
}
-
}
else if (gAgentCamera.getCameraMode() == CAMERA_MODE_CUSTOMIZE_AVATAR)
{
@@ -1928,6 +2084,18 @@ void LLAgent::endAnimationUpdateUI()
gAgentCamera.updateLastCamera();
}
+boost::signals2::connection LLAgent::setMouselookModeInCallback( const camera_signal_t::slot_type& cb )
+{
+ if (!mMouselookModeInSignal) mMouselookModeInSignal = new camera_signal_t();
+ return mMouselookModeInSignal->connect(cb);
+}
+
+boost::signals2::connection LLAgent::setMouselookModeOutCallback( const camera_signal_t::slot_type& cb )
+{
+ if (!mMouselookModeOutSignal) mMouselookModeOutSignal = new camera_signal_t();
+ return mMouselookModeOutSignal->connect(cb);
+}
+
//-----------------------------------------------------------------------------
// heardChat()
//-----------------------------------------------------------------------------
@@ -2115,32 +2283,32 @@ void LLAgent::onAnimStop(const LLUUID& id)
bool LLAgent::isGodlike() const
{
- return mAgentAccess.isGodlike();
+ return mAgentAccess->isGodlike();
}
bool LLAgent::isGodlikeWithoutAdminMenuFakery() const
{
- return mAgentAccess.isGodlikeWithoutAdminMenuFakery();
+ return mAgentAccess->isGodlikeWithoutAdminMenuFakery();
}
U8 LLAgent::getGodLevel() const
{
- return mAgentAccess.getGodLevel();
+ return mAgentAccess->getGodLevel();
}
bool LLAgent::wantsPGOnly() const
{
- return mAgentAccess.wantsPGOnly();
+ return mAgentAccess->wantsPGOnly();
}
bool LLAgent::canAccessMature() const
{
- return mAgentAccess.canAccessMature();
+ return mAgentAccess->canAccessMature();
}
bool LLAgent::canAccessAdult() const
{
- return mAgentAccess.canAccessAdult();
+ return mAgentAccess->canAccessAdult();
}
bool LLAgent::canAccessMaturityInRegion( U64 region_handle ) const
@@ -2175,37 +2343,37 @@ bool LLAgent::canAccessMaturityAtGlobal( LLVector3d pos_global ) const
bool LLAgent::prefersPG() const
{
- return mAgentAccess.prefersPG();
+ return mAgentAccess->prefersPG();
}
bool LLAgent::prefersMature() const
{
- return mAgentAccess.prefersMature();
+ return mAgentAccess->prefersMature();
}
bool LLAgent::prefersAdult() const
{
- return mAgentAccess.prefersAdult();
+ return mAgentAccess->prefersAdult();
}
bool LLAgent::isTeen() const
{
- return mAgentAccess.isTeen();
+ return mAgentAccess->isTeen();
}
bool LLAgent::isMature() const
{
- return mAgentAccess.isMature();
+ return mAgentAccess->isMature();
}
bool LLAgent::isAdult() const
{
- return mAgentAccess.isAdult();
+ return mAgentAccess->isAdult();
}
void LLAgent::setTeen(bool teen)
{
- mAgentAccess.setTeen(teen);
+ mAgentAccess->setTeen(teen);
}
//static
@@ -2250,37 +2418,37 @@ bool LLAgent::sendMaturityPreferenceToServer(int preferredMaturity)
BOOL LLAgent::getAdminOverride() const
{
- return mAgentAccess.getAdminOverride();
+ return mAgentAccess->getAdminOverride();
}
void LLAgent::setMaturity(char text)
{
- mAgentAccess.setMaturity(text);
+ mAgentAccess->setMaturity(text);
}
void LLAgent::setAdminOverride(BOOL b)
{
- mAgentAccess.setAdminOverride(b);
+ mAgentAccess->setAdminOverride(b);
}
void LLAgent::setGodLevel(U8 god_level)
{
- mAgentAccess.setGodLevel(god_level);
+ mAgentAccess->setGodLevel(god_level);
}
void LLAgent::setAOTransition()
{
- mAgentAccess.setTransition();
+ mAgentAccess->setTransition();
}
const LLAgentAccess& LLAgent::getAgentAccess()
{
- return mAgentAccess;
+ return *mAgentAccess;
}
bool LLAgent::validateMaturity(const LLSD& newvalue)
{
- return mAgentAccess.canSetMaturity(newvalue.asInteger());
+ return mAgentAccess->canSetMaturity(newvalue.asInteger());
}
void LLAgent::handleMaturity(const LLSD& newvalue)
@@ -2612,12 +2780,12 @@ BOOL LLAgent::allowOperation(PermissionBit op,
const LLColor4 &LLAgent::getEffectColor()
{
- return mEffectColor;
+ return *mEffectColor;
}
void LLAgent::setEffectColor(const LLColor4 &color)
{
- mEffectColor = color;
+ *mEffectColor = color;
}
void LLAgent::initOriginGlobal(const LLVector3d &origin_global)
@@ -3142,6 +3310,7 @@ void LLAgent::processAgentCachedTextureResponse(LLMessageSystem *mesgsys, void *
}
llinfos << "Received cached texture response for " << num_results << " textures." << llendl;
+ gAgentAvatarp->outputRezTiming("Fetched agent wearables textures from cache. Will now load them");
gAgentAvatarp->updateMeshTextures();
@@ -3251,8 +3420,18 @@ bool LLAgent::teleportCore(bool is_local)
// hide land floater too - it'll be out of date
LLFloaterReg::hideInstance("about_land");
- // hide the search floater (EXT-8276)
- LLFloaterReg::hideInstance("search");
+ // hide the Region/Estate floater
+ LLFloaterReg::hideInstance("region_info");
+
+ // minimize the Search floater (STORM-1474)
+ {
+ LLFloater* instance = LLFloaterReg::getInstance("search");
+
+ if (instance && instance->getVisible())
+ {
+ instance->setMinimized(TRUE);
+ }
+ }
LLViewerParcelMgr::getInstance()->deselectLand();
LLViewerMediaFocus::getInstance()->clearFocus();
@@ -3445,7 +3624,7 @@ void LLAgent::setTeleportState(ETeleportState state)
case TELEPORT_MOVING:
// We're outa here. Save "back" slurl.
- LLAgentUI::buildSLURL(mTeleportSourceSLURL);
+ LLAgentUI::buildSLURL(*mTeleportSourceSLURL);
break;
case TELEPORT_ARRIVING:
@@ -3778,6 +3957,11 @@ void LLAgent::parseTeleportMessages(const std::string& xml_filename)
}//end for (all message sets in xml file)
}
+const void LLAgent::getTeleportSourceSLURL(LLSLURL& slurl) const
+{
+ slurl = *mTeleportSourceSLURL;
+}
+
void LLAgent::sendAgentUpdateUserInfo(bool im_via_email, const std::string& directory_visibility )
{
gMessageSystem->newMessageFast(_PREHASH_UpdateUserInfo);
@@ -3808,14 +3992,14 @@ void LLAgent::renderAutoPilotTarget()
F32 height_meters;
LLVector3d target_global;
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.pushMatrix();
// not textured
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
// lovely green
- glColor4f(0.f, 1.f, 1.f, 1.f);
+ gGL.color4f(0.f, 1.f, 1.f, 1.f);
target_global = mAutoPilotTargetGlobal;
@@ -3823,9 +4007,9 @@ void LLAgent::renderAutoPilotTarget()
height_meters = 1.f;
- glScalef(height_meters, height_meters, height_meters);
+ gGL.scalef(height_meters, height_meters, height_meters);
- gSphere.render(1500.f);
+ gSphere.render();
gGL.popMatrix();
}
diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h
index aebebad96a..740770bbdf 100644
--- a/indra/newview/llagent.h
+++ b/indra/newview/llagent.h
@@ -29,15 +29,13 @@
#include "indra_constants.h"
#include "llevent.h" // LLObservable base class
-#include "llagentaccess.h"
#include "llagentconstants.h"
#include "llagentdata.h" // gAgentID, gAgentSessionID
-#include "llcharacter.h" // LLAnimPauseRequest
+#include "llcharacter.h"
#include "llcoordframe.h" // for mFrameAgent
-#include "llpointer.h"
-#include "lluicolor.h"
#include "llvoavatardefines.h"
-#include "llslurl.h"
+
+#include <boost/signals2.hpp>
extern const BOOL ANIMATE;
extern const U8 AGENT_STATE_TYPING; // Typing indication
@@ -54,6 +52,10 @@ class LLFriendObserver;
class LLPickInfo;
class LLViewerObject;
class LLAgentDropGroupViewerNode;
+class LLAgentAccess;
+class LLSLURL;
+class LLPauseRequestHandle;
+class LLUIColor;
//--------------------------------------------------------------------
// Types
@@ -78,6 +80,8 @@ struct LLGroupData
class LLAgentListener;
+class LLAgentImpl;
+
//------------------------------------------------------------------------
// LLAgent
//------------------------------------------------------------------------
@@ -278,7 +282,23 @@ public:
static void toggleFlying();
static bool enableFlying();
BOOL canFly(); // Does this parcel allow you to fly?
-
+
+ //--------------------------------------------------------------------
+ // Voice
+ //--------------------------------------------------------------------
+public:
+ bool isVoiceConnected() const { return mVoiceConnected; }
+ void setVoiceConnected(const bool b) { mVoiceConnected = b; }
+
+ static void pressMicrophone(const LLSD& name);
+ static void releaseMicrophone(const LLSD& name);
+ static void toggleMicrophone(const LLSD& name);
+ static bool isMicrophoneOn(const LLSD& sdname);
+ static bool isActionAllowed(const LLSD& sdname);
+
+private:
+ bool mVoiceConnected;
+
//--------------------------------------------------------------------
// Chat
//--------------------------------------------------------------------
@@ -314,7 +334,8 @@ public:
void setAFK();
void clearAFK();
BOOL getAFK() const;
-
+ static const F32 MIN_AFK_TIME;
+
//--------------------------------------------------------------------
// Run
//--------------------------------------------------------------------
@@ -410,9 +431,15 @@ public:
BOOL getCustomAnim() const { return mCustomAnim; }
void setCustomAnim(BOOL anim) { mCustomAnim = anim; }
+ typedef boost::signals2::signal<void ()> camera_signal_t;
+ boost::signals2::connection setMouselookModeInCallback( const camera_signal_t::slot_type& cb );
+ boost::signals2::connection setMouselookModeOutCallback( const camera_signal_t::slot_type& cb );
+
private:
+ camera_signal_t* mMouselookModeInSignal;
+ camera_signal_t* mMouselookModeOutSignal;
BOOL mCustomAnim; // Current animation is ANIM_AGENT_CUSTOMIZE ?
- LLAnimPauseRequest mPauseRequest;
+ LLPointer<LLPauseRequestHandle> mPauseRequest;
BOOL mViewsPushed; // Keep track of whether or not we have pushed views
/** Animation
@@ -459,19 +486,29 @@ public:
public:
BOOL getAutoPilot() const { return mAutoPilot; }
LLVector3d getAutoPilotTargetGlobal() const { return mAutoPilotTargetGlobal; }
+ LLUUID getAutoPilotLeaderID() const { return mLeaderID; }
+ F32 getAutoPilotStopDistance() const { return mAutoPilotStopDistance; }
+ F32 getAutoPilotTargetDist() const { return mAutoPilotTargetDist; }
+ BOOL getAutoPilotUseRotation() const { return mAutoPilotUseRotation; }
+ LLVector3 getAutoPilotTargetFacing() const { return mAutoPilotTargetFacing; }
+ F32 getAutoPilotRotationThreshold() const { return mAutoPilotRotationThreshold; }
+ std::string getAutoPilotBehaviorName() const { return mAutoPilotBehaviorName; }
+
void startAutoPilotGlobal(const LLVector3d &pos_global,
const std::string& behavior_name = std::string(),
const LLQuaternion *target_rotation = NULL,
void (*finish_callback)(BOOL, void *) = NULL, void *callback_data = NULL,
- F32 stop_distance = 0.f, F32 rotation_threshold = 0.03f);
- void startFollowPilot(const LLUUID &leader_id);
+ F32 stop_distance = 0.f, F32 rotation_threshold = 0.03f,
+ BOOL allow_flying = TRUE);
+ void startFollowPilot(const LLUUID &leader_id, BOOL allow_flying = TRUE, F32 stop_distance = 0.5f);
void stopAutoPilot(BOOL user_cancel = FALSE);
- void setAutoPilotGlobal(const LLVector3d &pos_global);
+ void setAutoPilotTargetGlobal(const LLVector3d &target_global);
void autoPilot(F32 *delta_yaw); // Autopilot walking action, angles in radians
void renderAutoPilotTarget();
private:
BOOL mAutoPilot;
BOOL mAutoPilotFlyOnStop;
+ BOOL mAutoPilotAllowFlying;
LLVector3d mAutoPilotTargetGlobal;
F32 mAutoPilotStopDistance;
BOOL mAutoPilotUseRotation;
@@ -507,13 +544,13 @@ public:
public:
static void parseTeleportMessages(const std::string& xml_filename);
- const void getTeleportSourceSLURL(LLSLURL& slurl) const { slurl = mTeleportSourceSLURL; }
+ const void getTeleportSourceSLURL(LLSLURL& slurl) const;
public:
// ! TODO ! Define ERROR and PROGRESS enums here instead of exposing the mappings.
static std::map<std::string, std::string> sTeleportErrorMessages;
static std::map<std::string, std::string> sTeleportProgressMessages;
private:
- LLSLURL mTeleportSourceSLURL; // SLURL where last TP began
+ LLSLURL * mTeleportSourceSLURL; // SLURL where last TP began
//--------------------------------------------------------------------
// Teleport Actions
@@ -554,6 +591,14 @@ private:
** **
*******************************************************************************/
+ // Build
+public:
+ bool canEditParcel() const { return mCanEditParcel; }
+private:
+ bool mCanEditParcel;
+
+ static void parcelChangedCallback();
+
/********************************************************************************
** **
** ACCESS
@@ -572,7 +617,7 @@ public:
// ! BACKWARDS COMPATIBILITY ! This function can go away after the AO transition (see llstartup.cpp).
void setAOTransition();
private:
- LLAgentAccess mAgentAccess;
+ LLAgentAccess * mAgentAccess;
//--------------------------------------------------------------------
// God
@@ -652,7 +697,7 @@ public:
const LLColor4 &getEffectColor();
void setEffectColor(const LLColor4 &color);
private:
- LLUIColor mEffectColor;
+ LLUIColor * mEffectColor;
/** Rendering
** **
diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp
index 7c953cd2dc..751b73e1eb 100644
--- a/indra/newview/llagentcamera.cpp
+++ b/indra/newview/llagentcamera.cpp
@@ -282,25 +282,22 @@ void LLAgentCamera::resetView(BOOL reset_camera, BOOL change_camera)
gAgent.stopAutoPilot(TRUE);
}
- if (!gNoRender)
- {
- LLSelectMgr::getInstance()->unhighlightAll();
+ LLSelectMgr::getInstance()->unhighlightAll();
- // By popular request, keep land selection while walking around. JC
- // LLViewerParcelMgr::getInstance()->deselectLand();
+ // By popular request, keep land selection while walking around. JC
+ // LLViewerParcelMgr::getInstance()->deselectLand();
- // force deselect when walking and attachment is selected
- // this is so people don't wig out when their avatar moves without animating
- if (LLSelectMgr::getInstance()->getSelection()->isAttachment())
- {
- LLSelectMgr::getInstance()->deselectAll();
- }
+ // force deselect when walking and attachment is selected
+ // this is so people don't wig out when their avatar moves without animating
+ if (LLSelectMgr::getInstance()->getSelection()->isAttachment())
+ {
+ LLSelectMgr::getInstance()->deselectAll();
+ }
- if (gMenuHolder != NULL)
- {
- // Hide all popup menus
- gMenuHolder->hideMenus();
- }
+ if (gMenuHolder != NULL)
+ {
+ // Hide all popup menus
+ gMenuHolder->hideMenus();
}
if (change_camera && !gSavedSettings.getBOOL("FreezeTime"))
@@ -393,10 +390,10 @@ LLVector3 LLAgentCamera::calcFocusOffset(LLViewerObject *object, LLVector3 origi
{
return original_focus_point - obj_pos;
}
-
LLQuaternion inv_obj_rot = ~obj_rot; // get inverse of rotation
- LLVector3 object_extents = object->getScale();
+ LLVector3 object_extents = object->getScale();
+
// make sure they object extents are non-zero
object_extents.clamp(0.001f, F32_MAX);
@@ -554,7 +551,9 @@ BOOL LLAgentCamera::calcCameraMinDistance(F32 &obj_min_distance)
{
BOOL soft_limit = FALSE; // is the bounding box to be treated literally (volumes) or as an approximation (avatars)
- if (!mFocusObject || mFocusObject->isDead())
+ if (!mFocusObject || mFocusObject->isDead() ||
+ mFocusObject->isMesh() ||
+ gSavedSettings.getBOOL("DisableCameraConstraints"))
{
obj_min_distance = 0.f;
return TRUE;
@@ -2041,11 +2040,12 @@ void LLAgentCamera::resetCamera()
//-----------------------------------------------------------------------------
void LLAgentCamera::changeCameraToMouselook(BOOL animate)
{
- if (LLViewerJoystick::getInstance()->getOverrideCamera())
+ if (!gSavedSettings.getBOOL("EnableMouselook")
+ || LLViewerJoystick::getInstance()->getOverrideCamera())
{
return;
}
-
+
// visibility changes at end of animation
gViewerWindow->getWindow()->resetBusyCount();
@@ -2695,6 +2695,9 @@ void LLAgentCamera::lookAtLastChat()
new_camera_pos -= delta_pos * 0.4f;
new_camera_pos += left * 0.3f;
new_camera_pos += up * 0.2f;
+
+ setFocusOnAvatar(FALSE, FALSE);
+
if (chatter_av->mHeadp)
{
setFocusGlobal(gAgent.getPosGlobalFromAgent(chatter_av->mHeadp->getWorldPosition()), gAgent.getLastChatter());
@@ -2705,7 +2708,6 @@ void LLAgentCamera::lookAtLastChat()
setFocusGlobal(chatter->getPositionGlobal(), gAgent.getLastChatter());
mCameraFocusOffsetTarget = gAgent.getPosGlobalFromAgent(new_camera_pos) - chatter->getPositionGlobal();
}
- setFocusOnAvatar(FALSE, TRUE);
}
else
{
@@ -2725,9 +2727,10 @@ void LLAgentCamera::lookAtLastChat()
new_camera_pos += left * 0.3f;
new_camera_pos += up * 0.2f;
+ setFocusOnAvatar(FALSE, FALSE);
+
setFocusGlobal(chatter->getPositionGlobal(), gAgent.getLastChatter());
mCameraFocusOffsetTarget = gAgent.getPosGlobalFromAgent(new_camera_pos) - chatter->getPositionGlobal();
- setFocusOnAvatar(FALSE, TRUE);
}
}
diff --git a/indra/newview/llagentlistener.cpp b/indra/newview/llagentlistener.cpp
index d520debc31..a8d2222c03 100644
--- a/indra/newview/llagentlistener.cpp
+++ b/indra/newview/llagentlistener.cpp
@@ -31,76 +31,479 @@
#include "llagentlistener.h"
#include "llagent.h"
+#include "llvoavatar.h"
#include "llcommandhandler.h"
#include "llslurl.h"
#include "llurldispatcher.h"
#include "llviewerobject.h"
#include "llviewerobjectlist.h"
#include "llviewerregion.h"
+#include "llsdutil.h"
+#include "llsdutil_math.h"
+#include "lltoolgrab.h"
+#include "llhudeffectlookat.h"
+#include "llagentcamera.h"
LLAgentListener::LLAgentListener(LLAgent &agent)
: LLEventAPI("LLAgent",
"LLAgent listener to (e.g.) teleport, sit, stand, etc."),
mAgent(agent)
{
- add("requestTeleport",
+ add("requestTeleport",
"Teleport: [\"regionname\"], [\"x\"], [\"y\"], [\"z\"]\n"
"If [\"skip_confirmation\"] is true, use LLURLDispatcher rather than LLCommandDispatcher.",
&LLAgentListener::requestTeleport);
- add("requestSit",
- "Ask to sit on the object specified in [\"obj_uuid\"]",
+ add("requestSit",
+ "[\"obj_uuid\"]: id of object to sit on, use this or [\"position\"] to indicate the sit target"
+ "[\"position\"]: region position {x, y, z} where to find closest object to sit on",
&LLAgentListener::requestSit);
- add("requestStand",
+ add("requestStand",
"Ask to stand up",
&LLAgentListener::requestStand);
+ add("requestTouch",
+ "[\"obj_uuid\"]: id of object to touch, use this or [\"position\"] to indicate the object to touch"
+ "[\"position\"]: region position {x, y, z} where to find closest object to touch"
+ "[\"face\"]: optional object face number to touch[Default: 0]",
+ &LLAgentListener::requestTouch);
+ add("resetAxes",
+ "Set the agent to a fixed orientation (optionally specify [\"lookat\"] = array of [x, y, z])",
+ &LLAgentListener::resetAxes);
+ add("getAxes",
+ "Obsolete - use getPosition instead\n"
+ "Send information about the agent's orientation on [\"reply\"]:\n"
+ "[\"euler\"]: map of {roll, pitch, yaw}\n"
+ "[\"quat\"]: array of [x, y, z, w] quaternion values",
+ &LLAgentListener::getAxes,
+ LLSDMap("reply", LLSD()));
+ add("getPosition",
+ "Send information about the agent's position and orientation on [\"reply\"]:\n"
+ "[\"region\"]: array of region {x, y, z} position\n"
+ "[\"global\"]: array of global {x, y, z} position\n"
+ "[\"euler\"]: map of {roll, pitch, yaw}\n"
+ "[\"quat\"]: array of [x, y, z, w] quaternion values",
+ &LLAgentListener::getPosition,
+ LLSDMap("reply", LLSD()));
+ add("startAutoPilot",
+ "Start the autopilot system using the following parameters:\n"
+ "[\"target_global\"]: array of target global {x, y, z} position\n"
+ "[\"stop_distance\"]: target maxiumum distance from target [default: autopilot guess]\n"
+ "[\"target_rotation\"]: array of [x, y, z, w] quaternion values [default: no target]\n"
+ "[\"rotation_threshold\"]: target maximum angle from target facing rotation [default: 0.03 radians]\n"
+ "[\"behavior_name\"]: name of the autopilot behavior [default: \"\"]"
+ "[\"allow_flying\"]: allow flying during autopilot [default: True]",
+ //"[\"callback_pump\"]: pump to send success/failure and callback data to [default: none]\n"
+ //"[\"callback_data\"]: data to send back during a callback [default: none]",
+ &LLAgentListener::startAutoPilot);
+ add("getAutoPilot",
+ "Send information about current state of the autopilot system to [\"reply\"]:\n"
+ "[\"enabled\"]: boolean indicating whether or not autopilot is enabled\n"
+ "[\"target_global\"]: array of target global {x, y, z} position\n"
+ "[\"leader_id\"]: uuid of target autopilot is following\n"
+ "[\"stop_distance\"]: target maximum distance from target\n"
+ "[\"target_distance\"]: last known distance from target\n"
+ "[\"use_rotation\"]: boolean indicating if autopilot has a target facing rotation\n"
+ "[\"target_facing\"]: array of {x, y} target direction to face\n"
+ "[\"rotation_threshold\"]: target maximum angle from target facing rotation\n"
+ "[\"behavior_name\"]: name of the autopilot behavior",
+ &LLAgentListener::getAutoPilot,
+ LLSDMap("reply", LLSD()));
+ add("startFollowPilot",
+ "[\"leader_id\"]: uuid of target to follow using the autopilot system (optional with avatar_name)\n"
+ "[\"avatar_name\"]: avatar name to follow using the autopilot system (optional with leader_id)\n"
+ "[\"allow_flying\"]: allow flying during autopilot [default: True]\n"
+ "[\"stop_distance\"]: target maxiumum distance from target [default: autopilot guess]",
+ &LLAgentListener::startFollowPilot);
+ add("setAutoPilotTarget",
+ "Update target for currently running autopilot:\n"
+ "[\"target_global\"]: array of target global {x, y, z} position",
+ &LLAgentListener::setAutoPilotTarget);
+ add("stopAutoPilot",
+ "Stop the autopilot system:\n"
+ "[\"user_cancel\"] indicates whether or not to act as though user canceled autopilot [default: false]",
+ &LLAgentListener::stopAutoPilot);
+ add("lookAt",
+ "[\"type\"]: number to indicate the lookAt type, 0 to clear\n"
+ "[\"obj_uuid\"]: id of object to look at, use this or [\"position\"] to indicate the target\n"
+ "[\"position\"]: region position {x, y, z} where to find closest object or avatar to look at",
+ &LLAgentListener::lookAt);
}
void LLAgentListener::requestTeleport(LLSD const & event_data) const
{
- if(event_data["skip_confirmation"].asBoolean())
+ if(event_data["skip_confirmation"].asBoolean())
+ {
+ LLSD params(LLSD::emptyArray());
+ params.append(event_data["regionname"]);
+ params.append(event_data["x"]);
+ params.append(event_data["y"]);
+ params.append(event_data["z"]);
+ LLCommandDispatcher::dispatch("teleport", params, LLSD(), NULL, "clicked", true);
+ // *TODO - lookup other LLCommandHandlers for "agent", "classified", "event", "group", "floater", "parcel", "login", login_refresh", "balance", "chat"
+ // should we just compose LLCommandHandler and LLDispatchListener?
+ }
+ else
+ {
+ std::string url = LLSLURL(event_data["regionname"],
+ LLVector3(event_data["x"].asReal(),
+ event_data["y"].asReal(),
+ event_data["z"].asReal())).getSLURLString();
+ LLURLDispatcher::dispatch(url, "clicked", NULL, false);
+ }
+}
+
+void LLAgentListener::requestSit(LLSD const & event_data) const
+{
+ //mAgent.getAvatarObject()->sitOnObject();
+ // shamelessly ripped from llviewermenu.cpp:handle_sit_or_stand()
+ // *TODO - find a permanent place to share this code properly.
+
+ LLViewerObject *object = NULL;
+ if (event_data.has("obj_uuid"))
+ {
+ object = gObjectList.findObject(event_data["obj_uuid"]);
+ }
+ else if (event_data.has("position"))
{
- LLSD params(LLSD::emptyArray());
- params.append(event_data["regionname"]);
- params.append(event_data["x"]);
- params.append(event_data["y"]);
- params.append(event_data["z"]);
- LLCommandDispatcher::dispatch("teleport", params, LLSD(), NULL, true);
- // *TODO - lookup other LLCommandHandlers for "agent", "classified", "event", "group", "floater", "parcel", "login", login_refresh", "balance", "chat"
- // should we just compose LLCommandHandler and LLDispatchListener?
+ LLVector3 target_position = ll_vector3_from_sd(event_data["position"]);
+ object = findObjectClosestTo(target_position);
}
+
+ if (object && object->getPCode() == LL_PCODE_VOLUME)
+ {
+ gMessageSystem->newMessageFast(_PREHASH_AgentRequestSit);
+ gMessageSystem->nextBlockFast(_PREHASH_AgentData);
+ gMessageSystem->addUUIDFast(_PREHASH_AgentID, mAgent.getID());
+ gMessageSystem->addUUIDFast(_PREHASH_SessionID, mAgent.getSessionID());
+ gMessageSystem->nextBlockFast(_PREHASH_TargetObject);
+ gMessageSystem->addUUIDFast(_PREHASH_TargetID, object->mID);
+ gMessageSystem->addVector3Fast(_PREHASH_Offset, LLVector3(0,0,0));
+
+ object->getRegion()->sendReliableMessage();
+ }
else
{
- std::string url = LLSLURL(event_data["regionname"],
- LLVector3(event_data["x"].asReal(),
- event_data["y"].asReal(),
- event_data["z"].asReal())).getSLURLString();
- LLURLDispatcher::dispatch(url, NULL, false);
+ llwarns << "LLAgent requestSit could not find the sit target: "
+ << event_data << llendl;
}
}
-void LLAgentListener::requestSit(LLSD const & event_data) const
+void LLAgentListener::requestStand(LLSD const & event_data) const
+{
+ mAgent.setControlFlags(AGENT_CONTROL_STAND_UP);
+}
+
+
+LLViewerObject * LLAgentListener::findObjectClosestTo( const LLVector3 & position ) const
{
- //mAgent.getAvatarObject()->sitOnObject();
- // shamelessly ripped from llviewermenu.cpp:handle_sit_or_stand()
- // *TODO - find a permanent place to share this code properly.
- LLViewerObject *object = gObjectList.findObject(event_data["obj_uuid"]);
+ LLViewerObject *object = NULL;
+
+ // Find the object closest to that position
+ F32 min_distance = 10000.0f; // Start big
+ S32 num_objects = gObjectList.getNumObjects();
+ S32 cur_index = 0;
+ while (cur_index < num_objects)
+ {
+ LLViewerObject * cur_object = gObjectList.getObject(cur_index++);
+ if (cur_object)
+ { // Calculate distance from the target position
+ LLVector3 target_diff = cur_object->getPositionRegion() - position;
+ F32 distance_to_target = target_diff.length();
+ if (distance_to_target < min_distance)
+ { // Found an object closer
+ min_distance = distance_to_target;
+ object = cur_object;
+ }
+ }
+ }
+
+ return object;
+}
+
+
+void LLAgentListener::requestTouch(LLSD const & event_data) const
+{
+ LLViewerObject *object = NULL;
+
+ if (event_data.has("obj_uuid"))
+ {
+ object = gObjectList.findObject(event_data["obj_uuid"]);
+ }
+ else if (event_data.has("position"))
+ {
+ LLVector3 target_position = ll_vector3_from_sd(event_data["position"]);
+ object = findObjectClosestTo(target_position);
+ }
- if (object && object->getPCode() == LL_PCODE_VOLUME)
+ S32 face = 0;
+ if (event_data.has("face"))
{
- gMessageSystem->newMessageFast(_PREHASH_AgentRequestSit);
- gMessageSystem->nextBlockFast(_PREHASH_AgentData);
- gMessageSystem->addUUIDFast(_PREHASH_AgentID, mAgent.getID());
- gMessageSystem->addUUIDFast(_PREHASH_SessionID, mAgent.getSessionID());
- gMessageSystem->nextBlockFast(_PREHASH_TargetObject);
- gMessageSystem->addUUIDFast(_PREHASH_TargetID, object->mID);
- gMessageSystem->addVector3Fast(_PREHASH_Offset, LLVector3(0,0,0));
+ face = event_data["face"].asInteger();
+ }
+
+ if (object && object->getPCode() == LL_PCODE_VOLUME)
+ {
+ // Fake enough pick info to get it to (hopefully) work
+ LLPickInfo pick;
+ pick.mObjectFace = face;
+
+ /*
+ These values are sent to the simulator, but face seems to be easiest to use
- object->getRegion()->sendReliableMessage();
+ pick.mUVCoords "UVCoord"
+ pick.mSTCoords "STCoord"
+ pick.mObjectFace "FaceIndex"
+ pick.mIntersection "Position"
+ pick.mNormal "Normal"
+ pick.mBinormal "Binormal"
+ */
+
+ // A touch is a sketchy message sequence ... send a grab, immediately
+ // followed by un-grabbing, crossing fingers and hoping packets arrive in
+ // the correct order
+ send_ObjectGrab_message(object, pick, LLVector3::zero);
+ send_ObjectDeGrab_message(object, pick);
+ }
+ else
+ {
+ llwarns << "LLAgent requestTouch could not find the touch target "
+ << event_data["obj_uuid"].asUUID() << llendl;
}
}
-void LLAgentListener::requestStand(LLSD const & event_data) const
+
+void LLAgentListener::resetAxes(const LLSD& event_data) const
+{
+ if (event_data.has("lookat"))
+ {
+ mAgent.resetAxes(ll_vector3_from_sd(event_data["lookat"]));
+ }
+ else
+ {
+ // no "lookat", default call
+ mAgent.resetAxes();
+ }
+}
+
+void LLAgentListener::getAxes(const LLSD& event_data) const
+{
+ LLQuaternion quat(mAgent.getQuat());
+ F32 roll, pitch, yaw;
+ quat.getEulerAngles(&roll, &pitch, &yaw);
+ // The official query API for LLQuaternion's [x, y, z, w] values is its
+ // public member mQ...
+ LLSD reply = LLSD::emptyMap();
+ reply["quat"] = llsd_copy_array(boost::begin(quat.mQ), boost::end(quat.mQ));
+ reply["euler"] = LLSD::emptyMap();
+ reply["euler"]["roll"] = roll;
+ reply["euler"]["pitch"] = pitch;
+ reply["euler"]["yaw"] = yaw;
+ sendReply(reply, event_data);
+}
+
+void LLAgentListener::getPosition(const LLSD& event_data) const
{
- mAgent.setControlFlags(AGENT_CONTROL_STAND_UP);
+ F32 roll, pitch, yaw;
+ LLQuaternion quat(mAgent.getQuat());
+ quat.getEulerAngles(&roll, &pitch, &yaw);
+
+ LLSD reply = LLSD::emptyMap();
+ reply["quat"] = llsd_copy_array(boost::begin(quat.mQ), boost::end(quat.mQ));
+ reply["euler"] = LLSD::emptyMap();
+ reply["euler"]["roll"] = roll;
+ reply["euler"]["pitch"] = pitch;
+ reply["euler"]["yaw"] = yaw;
+ reply["region"] = ll_sd_from_vector3(mAgent.getPositionAgent());
+ reply["global"] = ll_sd_from_vector3d(mAgent.getPositionGlobal());
+
+ sendReply(reply, event_data);
}
+
+void LLAgentListener::startAutoPilot(LLSD const & event_data)
+{
+ LLQuaternion target_rotation_value;
+ LLQuaternion* target_rotation = NULL;
+ if (event_data.has("target_rotation"))
+ {
+ target_rotation_value = ll_quaternion_from_sd(event_data["target_rotation"]);
+ target_rotation = &target_rotation_value;
+ }
+ // *TODO: Use callback_pump and callback_data
+ F32 rotation_threshold = 0.03f;
+ if (event_data.has("rotation_threshold"))
+ {
+ rotation_threshold = event_data["rotation_threshold"].asReal();
+ }
+
+ BOOL allow_flying = TRUE;
+ if (event_data.has("allow_flying"))
+ {
+ allow_flying = (BOOL) event_data["allow_flying"].asBoolean();
+ mAgent.setFlying(allow_flying);
+ }
+
+ F32 stop_distance = 0.f;
+ if (event_data.has("stop_distance"))
+ {
+ stop_distance = event_data["stop_distance"].asReal();
+ }
+
+ // Clear follow target, this is doing a path
+ mFollowTarget.setNull();
+
+ mAgent.startAutoPilotGlobal(ll_vector3d_from_sd(event_data["target_global"]),
+ event_data["behavior_name"],
+ target_rotation,
+ NULL, NULL,
+ stop_distance,
+ rotation_threshold,
+ allow_flying);
+}
+
+void LLAgentListener::getAutoPilot(const LLSD& event_data) const
+{
+ LLSD reply = LLSD::emptyMap();
+
+ LLSD::Boolean enabled = mAgent.getAutoPilot();
+ reply["enabled"] = enabled;
+
+ reply["target_global"] = ll_sd_from_vector3d(mAgent.getAutoPilotTargetGlobal());
+
+ reply["leader_id"] = mAgent.getAutoPilotLeaderID();
+
+ reply["stop_distance"] = mAgent.getAutoPilotStopDistance();
+
+ reply["target_distance"] = mAgent.getAutoPilotTargetDist();
+ if (!enabled &&
+ mFollowTarget.notNull())
+ { // Get an actual distance from the target object we were following
+ LLViewerObject * target = gObjectList.findObject(mFollowTarget);
+ if (target)
+ { // Found the target AV, return the actual distance to them as well as their ID
+ LLVector3 difference = target->getPositionRegion() - mAgent.getPositionAgent();
+ reply["target_distance"] = difference.length();
+ reply["leader_id"] = mFollowTarget;
+ }
+ }
+
+ reply["use_rotation"] = (LLSD::Boolean) mAgent.getAutoPilotUseRotation();
+ reply["target_facing"] = ll_sd_from_vector3(mAgent.getAutoPilotTargetFacing());
+ reply["rotation_threshold"] = mAgent.getAutoPilotRotationThreshold();
+ reply["behavior_name"] = mAgent.getAutoPilotBehaviorName();
+ reply["fly"] = (LLSD::Boolean) mAgent.getFlying();
+
+ sendReply(reply, event_data);
+}
+
+void LLAgentListener::startFollowPilot(LLSD const & event_data)
+{
+ LLUUID target_id;
+
+ BOOL allow_flying = TRUE;
+ if (event_data.has("allow_flying"))
+ {
+ allow_flying = (BOOL) event_data["allow_flying"].asBoolean();
+ }
+
+ if (event_data.has("leader_id"))
+ {
+ target_id = event_data["leader_id"];
+ }
+ else if (event_data.has("avatar_name"))
+ { // Find the avatar with matching name
+ std::string target_name = event_data["avatar_name"].asString();
+
+ if (target_name.length() > 0)
+ {
+ S32 num_objects = gObjectList.getNumObjects();
+ S32 cur_index = 0;
+ while (cur_index < num_objects)
+ {
+ LLViewerObject * cur_object = gObjectList.getObject(cur_index++);
+ if (cur_object &&
+ cur_object->asAvatar() &&
+ cur_object->asAvatar()->getFullname() == target_name)
+ { // Found avatar with matching name, extract id and break out of loop
+ target_id = cur_object->getID();
+ break;
+ }
+ }
+ }
+ }
+
+ F32 stop_distance = 0.f;
+ if (event_data.has("stop_distance"))
+ {
+ stop_distance = event_data["stop_distance"].asReal();
+ }
+
+ if (target_id.notNull())
+ {
+ mAgent.setFlying(allow_flying);
+ mFollowTarget = target_id; // Save follow target so we can report distance later
+
+ mAgent.startFollowPilot(target_id, allow_flying, stop_distance);
+ }
+}
+
+void LLAgentListener::setAutoPilotTarget(LLSD const & event_data) const
+{
+ if (event_data.has("target_global"))
+ {
+ LLVector3d target_global(ll_vector3d_from_sd(event_data["target_global"]));
+ mAgent.setAutoPilotTargetGlobal(target_global);
+ }
+}
+
+void LLAgentListener::stopAutoPilot(LLSD const & event_data) const
+{
+ BOOL user_cancel = FALSE;
+ if (event_data.has("user_cancel"))
+ {
+ user_cancel = event_data["user_cancel"].asBoolean();
+ }
+ mAgent.stopAutoPilot(user_cancel);
+}
+
+void LLAgentListener::lookAt(LLSD const & event_data) const
+{
+ LLViewerObject *object = NULL;
+ if (event_data.has("obj_uuid"))
+ {
+ object = gObjectList.findObject(event_data["obj_uuid"]);
+ }
+ else if (event_data.has("position"))
+ {
+ LLVector3 target_position = ll_vector3_from_sd(event_data["position"]);
+ object = findObjectClosestTo(target_position);
+ }
+
+ S32 look_at_type = (S32) LOOKAT_TARGET_NONE;
+ if (event_data.has("type"))
+ {
+ look_at_type = event_data["type"].asInteger();
+ }
+ if (look_at_type >= (S32) LOOKAT_TARGET_NONE &&
+ look_at_type < (S32) LOOKAT_NUM_TARGETS)
+ {
+ gAgentCamera.setLookAt((ELookAtType) look_at_type, object);
+ }
+}
+
+void LLAgentListener::getGroups(const LLSD& event) const
+{
+ LLSD reply(LLSD::emptyArray());
+ for (LLDynamicArray<LLGroupData>::const_iterator
+ gi(mAgent.mGroups.begin()), gend(mAgent.mGroups.end());
+ gi != gend; ++gi)
+ {
+ reply.append(LLSDMap
+ ("id", gi->mID)
+ ("name", gi->mName)
+ ("insignia", gi->mInsigniaID)
+ ("notices", bool(gi->mAcceptNotices))
+ ("display", bool(gi->mListInProfile))
+ ("contrib", gi->mContribution));
+ }
+ sendReply(LLSDMap("groups", reply), event);
+}
diff --git a/indra/newview/llagentlistener.h b/indra/newview/llagentlistener.h
index 9b585152f4..9a9c4073fe 100644
--- a/indra/newview/llagentlistener.h
+++ b/indra/newview/llagentlistener.h
@@ -34,19 +34,35 @@
class LLAgent;
class LLSD;
+class LLViewerObject;
+class LLVector3d;
class LLAgentListener : public LLEventAPI
{
public:
- LLAgentListener(LLAgent &agent);
+ LLAgentListener(LLAgent &agent);
private:
- void requestTeleport(LLSD const & event_data) const;
- void requestSit(LLSD const & event_data) const;
- void requestStand(LLSD const & event_data) const;
+ void requestTeleport(LLSD const & event_data) const;
+ void requestSit(LLSD const & event_data) const;
+ void requestStand(LLSD const & event_data) const;
+ void requestTouch(LLSD const & event_data) const;
+ void resetAxes(const LLSD& event_data) const;
+ void getAxes(const LLSD& event_data) const;
+ void getGroups(const LLSD& event) const;
+ void getPosition(const LLSD& event_data) const;
+ void startAutoPilot(const LLSD& event_data);
+ void getAutoPilot(const LLSD& event_data) const;
+ void startFollowPilot(const LLSD& event_data);
+ void setAutoPilotTarget(const LLSD& event_data) const;
+ void stopAutoPilot(const LLSD& event_data) const;
+ void lookAt(LLSD const & event_data) const;
+
+ LLViewerObject * findObjectClosestTo( const LLVector3 & position ) const;
private:
- LLAgent & mAgent;
+ LLAgent & mAgent;
+ LLUUID mFollowTarget;
};
#endif // LL_LLAGENTLISTENER_H
diff --git a/indra/newview/llagentpilot.cpp b/indra/newview/llagentpilot.cpp
index 13e1023185..734c502fcf 100644
--- a/indra/newview/llagentpilot.cpp
+++ b/indra/newview/llagentpilot.cpp
@@ -34,12 +34,12 @@
#include "llagent.h"
#include "llappviewer.h"
#include "llviewercontrol.h"
+#include "llviewercamera.h"
+#include "llsdserialize.h"
+#include "llsdutil_math.h"
LLAgentPilot gAgentPilot;
-BOOL LLAgentPilot::sLoop = TRUE;
-BOOL LLAgentPilot::sReplaySession = FALSE;
-
LLAgentPilot::LLAgentPilot() :
mNumRuns(-1),
mQuitAfterRuns(FALSE),
@@ -47,7 +47,10 @@ LLAgentPilot::LLAgentPilot() :
mLastRecordTime(0.f),
mStarted(FALSE),
mPlaying(FALSE),
- mCurrentAction(0)
+ mCurrentAction(0),
+ mOverrideCamera(FALSE),
+ mLoop(TRUE),
+ mReplaySession(FALSE)
{
}
@@ -55,7 +58,26 @@ LLAgentPilot::~LLAgentPilot()
{
}
-void LLAgentPilot::load(const std::string& filename)
+void LLAgentPilot::load()
+{
+ std::string txt_filename = gSavedSettings.getString("StatsPilotFile");
+ std::string xml_filename = gSavedSettings.getString("StatsPilotXMLFile");
+ if (LLFile::isfile(xml_filename))
+ {
+ loadXML(xml_filename);
+ }
+ else if (LLFile::isfile(txt_filename))
+ {
+ loadTxt(txt_filename);
+ }
+ else
+ {
+ lldebugs << "no autopilot file found" << llendl;
+ return;
+ }
+}
+
+void LLAgentPilot::loadTxt(const std::string& filename)
{
if(filename.empty())
{
@@ -75,6 +97,7 @@ void LLAgentPilot::load(const std::string& filename)
llinfos << "Opening pilot file " << filename << llendl;
}
+ mActions.reset();
S32 num_actions;
file >> num_actions;
@@ -89,10 +112,59 @@ void LLAgentPilot::load(const std::string& filename)
mActions.put(new_action);
}
+ mOverrideCamera = false;
+
+ file.close();
+}
+
+void LLAgentPilot::loadXML(const std::string& filename)
+{
+ if(filename.empty())
+ {
+ return;
+ }
+
+ llifstream file(filename);
+
+ if (!file)
+ {
+ lldebugs << "Couldn't open " << filename
+ << ", aborting agentpilot load!" << llendl;
+ return;
+ }
+ else
+ {
+ llinfos << "Opening pilot file " << filename << llendl;
+ }
+
+ mActions.reset();
+ LLSD record;
+ while (!file.eof() && LLSDSerialize::fromXML(record, file))
+ {
+ Action action;
+ action.mTime = record["time"].asReal();
+ action.mType = (EActionType)record["type"].asInteger();
+ action.mCameraView = record["camera_view"].asReal();
+ action.mTarget = ll_vector3d_from_sd(record["target"]);
+ action.mCameraOrigin = ll_vector3_from_sd(record["camera_origin"]);
+ action.mCameraXAxis = ll_vector3_from_sd(record["camera_xaxis"]);
+ action.mCameraYAxis = ll_vector3_from_sd(record["camera_yaxis"]);
+ action.mCameraZAxis = ll_vector3_from_sd(record["camera_zaxis"]);
+ mActions.put(action);
+ }
+ mOverrideCamera = true;
file.close();
}
-void LLAgentPilot::save(const std::string& filename)
+void LLAgentPilot::save()
+{
+ std::string txt_filename = gSavedSettings.getString("StatsPilotFile");
+ std::string xml_filename = gSavedSettings.getString("StatsPilotXMLFile");
+ saveTxt(txt_filename);
+ saveXML(xml_filename);
+}
+
+void LLAgentPilot::saveTxt(const std::string& filename)
{
llofstream file;
file.open(filename);
@@ -108,12 +180,41 @@ void LLAgentPilot::save(const std::string& filename)
for (i = 0; i < mActions.count(); i++)
{
file << mActions[i].mTime << "\t" << mActions[i].mType << "\t";
- file << std::setprecision(32) << mActions[i].mTarget.mdV[VX] << "\t" << mActions[i].mTarget.mdV[VY] << "\t" << mActions[i].mTarget.mdV[VZ] << '\n';
+ file << std::setprecision(32) << mActions[i].mTarget.mdV[VX] << "\t" << mActions[i].mTarget.mdV[VY] << "\t" << mActions[i].mTarget.mdV[VZ];
+ file << '\n';
}
file.close();
}
+void LLAgentPilot::saveXML(const std::string& filename)
+{
+ llofstream file;
+ file.open(filename);
+
+ if (!file)
+ {
+ llinfos << "Couldn't open " << filename << ", aborting agentpilot save!" << llendl;
+ }
+
+ S32 i;
+ for (i = 0; i < mActions.count(); i++)
+ {
+ Action& action = mActions[i];
+ LLSD record;
+ record["time"] = (LLSD::Real)action.mTime;
+ record["type"] = (LLSD::Integer)action.mType;
+ record["camera_view"] = (LLSD::Real)action.mCameraView;
+ record["target"] = ll_sd_from_vector3d(action.mTarget);
+ record["camera_origin"] = ll_sd_from_vector3(action.mCameraOrigin);
+ record["camera_xaxis"] = ll_sd_from_vector3(action.mCameraXAxis);
+ record["camera_yaxis"] = ll_sd_from_vector3(action.mCameraYAxis);
+ record["camera_zaxis"] = ll_sd_from_vector3(action.mCameraZAxis);
+ LLSDSerialize::toXML(record, file);
+ }
+ file.close();
+}
+
void LLAgentPilot::startRecord()
{
mActions.reset();
@@ -125,7 +226,7 @@ void LLAgentPilot::startRecord()
void LLAgentPilot::stopRecord()
{
gAgentPilot.addAction(STRAIGHT);
- gAgentPilot.save(gSavedSettings.getString("StatsPilotFile"));
+ gAgentPilot.save();
mRecording = FALSE;
}
@@ -136,6 +237,12 @@ void LLAgentPilot::addAction(enum EActionType action_type)
action.mType = action_type;
action.mTarget = gAgent.getPositionGlobal();
action.mTime = mTimer.getElapsedTimeF32();
+ LLViewerCamera *cam = LLViewerCamera::getInstance();
+ action.mCameraView = cam->getView();
+ action.mCameraOrigin = cam->getOrigin();
+ action.mCameraXAxis = cam->getXAxis();
+ action.mCameraYAxis = cam->getYAxis();
+ action.mCameraZAxis = cam->getZAxis();
mLastRecordTime = (F32)action.mTime;
mActions.put(action);
}
@@ -152,6 +259,7 @@ void LLAgentPilot::startPlayback()
{
llinfos << "Starting playback, moving to waypoint 0" << llendl;
gAgent.startAutoPilotGlobal(mActions[0].mTarget);
+ moveCamera();
mStarted = FALSE;
}
else
@@ -172,12 +280,53 @@ void LLAgentPilot::stopPlayback()
gAgent.stopAutoPilot();
}
- if (sReplaySession)
+ if (mReplaySession)
{
LLAppViewer::instance()->forceQuit();
}
}
+void LLAgentPilot::moveCamera()
+{
+ if (!getOverrideCamera())
+ return;
+
+ if (mCurrentAction<mActions.count())
+ {
+ S32 start_index = llmax(mCurrentAction-1,0);
+ S32 end_index = mCurrentAction;
+ F32 t = 0.0;
+ F32 timedelta = mActions[end_index].mTime - mActions[start_index].mTime;
+ F32 tickelapsed = mTimer.getElapsedTimeF32()-mActions[start_index].mTime;
+ if (timedelta > 0.0)
+ {
+ t = tickelapsed/timedelta;
+ }
+
+ if ((t<0.0)||(t>1.0))
+ {
+ llwarns << "mCurrentAction is invalid, t = " << t << llendl;
+ return;
+ }
+
+ Action& start = mActions[start_index];
+ Action& end = mActions[end_index];
+
+ F32 view = lerp(start.mCameraView, end.mCameraView, t);
+ LLVector3 origin = lerp(start.mCameraOrigin, end.mCameraOrigin, t);
+ LLQuaternion start_quat(start.mCameraXAxis, start.mCameraYAxis, start.mCameraZAxis);
+ LLQuaternion end_quat(end.mCameraXAxis, end.mCameraYAxis, end.mCameraZAxis);
+ LLQuaternion quat = nlerp(t, start_quat, end_quat);
+ LLMatrix3 mat(quat);
+
+ LLViewerCamera::getInstance()->setView(view);
+ LLViewerCamera::getInstance()->setOrigin(origin);
+ LLViewerCamera::getInstance()->mXAxis = LLVector3(mat.mMatrix[0]);
+ LLViewerCamera::getInstance()->mYAxis = LLVector3(mat.mMatrix[1]);
+ LLViewerCamera::getInstance()->mZAxis = LLVector3(mat.mMatrix[2]);
+ }
+}
+
void LLAgentPilot::updateTarget()
{
if (mPlaying)
@@ -209,12 +358,13 @@ void LLAgentPilot::updateTarget()
if (mCurrentAction < mActions.count())
{
gAgent.startAutoPilotGlobal(mActions[mCurrentAction].mTarget);
+ moveCamera();
}
else
{
stopPlayback();
mNumRuns--;
- if (sLoop)
+ if (mLoop)
{
if ((mNumRuns < 0) || (mNumRuns > 0))
{
@@ -249,29 +399,8 @@ void LLAgentPilot::updateTarget()
}
}
-// static
-void LLAgentPilot::startRecord(void *)
-{
- gAgentPilot.startRecord();
-}
-
-void LLAgentPilot::saveRecord(void *)
+void LLAgentPilot::addWaypoint()
{
- gAgentPilot.stopRecord();
-}
-
-void LLAgentPilot::addWaypoint(void *)
-{
- gAgentPilot.addAction(STRAIGHT);
-}
-
-void LLAgentPilot::startPlayback(void *)
-{
- gAgentPilot.mNumRuns = -1;
- gAgentPilot.startPlayback();
+ addAction(STRAIGHT);
}
-void LLAgentPilot::stopPlayback(void *)
-{
- gAgentPilot.stopPlayback();
-}
diff --git a/indra/newview/llagentpilot.h b/indra/newview/llagentpilot.h
index f3d34246ae..dd1709ec0c 100644
--- a/indra/newview/llagentpilot.h
+++ b/indra/newview/llagentpilot.h
@@ -46,8 +46,12 @@ public:
LLAgentPilot();
virtual ~LLAgentPilot();
- void load(const std::string& filename);
- void save(const std::string& filename);
+ void load();
+ void loadTxt(const std::string& filename);
+ void loadXML(const std::string& filename);
+ void save();
+ void saveTxt(const std::string& filename);
+ void saveXML(const std::string& filename);
void startRecord();
void stopRecord();
@@ -56,19 +60,34 @@ public:
void startPlayback();
void stopPlayback();
+ bool isRecording() { return mRecording; }
+ bool isPlaying() { return mPlaying; }
+ bool getOverrideCamera() { return mOverrideCamera; }
+
void updateTarget();
- static void startRecord(void *);
- static void addWaypoint(void *);
- static void saveRecord(void *);
- static void startPlayback(void *);
- static void stopPlayback(void *);
- static BOOL sLoop;
- static BOOL sReplaySession;
+ void addWaypoint();
+ void moveCamera();
+
+ void setReplaySession(BOOL new_val) { mReplaySession = new_val; }
+ BOOL getReplaySession() { return mReplaySession; }
+
+ void setLoop(BOOL new_val) { mLoop = new_val; }
+ BOOL getLoop() { return mLoop; }
+
+ void setQuitAfterRuns(BOOL quit_val) { mQuitAfterRuns = quit_val; }
+ void setNumRuns(S32 num_runs) { mNumRuns = num_runs; }
+
+private:
+
+
+
+ BOOL mLoop;
+ BOOL mReplaySession;
S32 mNumRuns;
BOOL mQuitAfterRuns;
-private:
+
void setAutopilotTarget(const S32 id);
BOOL mRecording;
@@ -78,6 +97,8 @@ private:
BOOL mPlaying;
S32 mCurrentAction;
+ BOOL mOverrideCamera;
+
class Action
{
public:
@@ -85,10 +106,16 @@ private:
EActionType mType;
LLVector3d mTarget;
F64 mTime;
+ F32 mCameraView;
+ LLVector3 mCameraOrigin;
+ LLVector3 mCameraXAxis;
+ LLVector3 mCameraYAxis;
+ LLVector3 mCameraZAxis;
};
LLDynamicArray<Action> mActions;
LLTimer mTimer;
+
};
extern LLAgentPilot gAgentPilot;
diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp
index 055be4cae2..dd02a74a38 100644
--- a/indra/newview/llagentwearables.cpp
+++ b/indra/newview/llagentwearables.cpp
@@ -33,7 +33,7 @@
#include "llagentwearablesfetch.h"
#include "llappearancemgr.h"
#include "llcallbacklist.h"
-#include "llfolderview.h"
+#include "llfloatersidepanelcontainer.h"
#include "llgesturemgr.h"
#include "llinventorybridge.h"
#include "llinventoryfunctions.h"
@@ -43,8 +43,8 @@
#include "llnotificationsutil.h"
#include "lloutfitobserver.h"
#include "llsidepanelappearance.h"
-#include "llsidetray.h"
#include "lltexlayer.h"
+#include "lltooldraganddrop.h"
#include "llviewerregion.h"
#include "llvoavatarself.h"
#include "llwearable.h"
@@ -185,6 +185,7 @@ void LLAgentWearables::setAvatarObject(LLVOAvatarSelf *avatar)
{
if (avatar)
{
+ avatar->outputRezTiming("Sending wearables request");
sendAgentWearablesRequest();
}
}
@@ -816,12 +817,15 @@ void LLAgentWearables::popWearable(const LLWearableType::EType type, U32 index)
if (wearable)
{
mWearableDatas[type].erase(mWearableDatas[type].begin() + index);
+ if (isAgentAvatarValid())
+ {
gAgentAvatarp->wearableUpdated(wearable->getType(), TRUE);
+ }
wearable->setLabelUpdated();
}
}
-U32 LLAgentWearables::getWearableIndex(LLWearable *wearable)
+U32 LLAgentWearables::getWearableIndex(const LLWearable *wearable) const
{
if (wearable == NULL)
{
@@ -949,6 +953,11 @@ void LLAgentWearables::processAgentInitialWearablesUpdate(LLMessageSystem* mesgs
if (mInitialWearablesUpdateReceived)
return;
+ if (isAgentAvatarValid())
+ {
+ gAgentAvatarp->outputRezTiming("Received initial wearables update");
+ }
+
// notify subscribers that wearables started loading. See EXT-7777
// *TODO: find more proper place to not be called from deprecated method.
// Seems such place is found: LLInitialWearablesFetch::processContents()
@@ -1168,15 +1177,12 @@ private:
std::vector<LLWearable*> mWearablesAwaitingItems;
};
-void LLAgentWearables::createStandardWearables(BOOL female)
+void LLAgentWearables::createStandardWearables()
{
- llwarns << "Creating Standard " << (female ? "female" : "male")
- << " Wearables" << llendl;
+ llwarns << "Creating standard wearables" << llendl;
if (!isAgentAvatarValid()) return;
- gAgentAvatarp->setSex(female ? SEX_FEMALE : SEX_MALE);
-
const BOOL create[LLWearableType::WT_COUNT] =
{
TRUE, //LLWearableType::WT_SHAPE
@@ -1622,6 +1628,11 @@ void LLAgentWearables::queryWearableCache()
//VWR-22113: gAgent.getRegion() can return null if invalid, seen here on logout
if(gAgent.getRegion())
{
+ if (isAgentAvatarValid())
+ {
+ gAgentAvatarp->outputRezTiming("Fetching textures from cache");
+ }
+
llinfos << "Requesting texture cache entry for " << num_queries << " baked textures" << llendl;
gMessageSystem->sendReliable(gAgent.getRegion()->getHost());
gAgentQueryManager.mNumPendingQueries++;
@@ -1692,37 +1703,6 @@ void LLAgentWearables::userRemoveWearablesOfType(const LLWearableType::EType &ty
}
}
-// static
-void LLAgentWearables::userRemoveAllClothes()
-{
- // We have to do this up front to avoid having to deal with the case of multiple wearables being dirty.
- if (gAgentCamera.cameraCustomizeAvatar())
- {
- // switching to outfit editor should automagically save any currently edited wearable
- LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD().with("type", "edit_outfit"));
- }
- userRemoveAllClothesStep2(TRUE);
-}
-
-// static
-void LLAgentWearables::userRemoveAllClothesStep2(BOOL proceed)
-{
- if (proceed)
- {
- gAgentWearables.removeWearable(LLWearableType::WT_SHIRT,true,0);
- gAgentWearables.removeWearable(LLWearableType::WT_PANTS,true,0);
- gAgentWearables.removeWearable(LLWearableType::WT_SHOES,true,0);
- gAgentWearables.removeWearable(LLWearableType::WT_SOCKS,true,0);
- gAgentWearables.removeWearable(LLWearableType::WT_JACKET,true,0);
- gAgentWearables.removeWearable(LLWearableType::WT_GLOVES,true,0);
- gAgentWearables.removeWearable(LLWearableType::WT_UNDERSHIRT,true,0);
- gAgentWearables.removeWearable(LLWearableType::WT_UNDERPANTS,true,0);
- gAgentWearables.removeWearable(LLWearableType::WT_SKIRT,true,0);
- gAgentWearables.removeWearable(LLWearableType::WT_ALPHA,true,0);
- gAgentWearables.removeWearable(LLWearableType::WT_TATTOO,true,0);
- }
-}
-
// Combines userRemoveAllAttachments() and userAttachMultipleAttachments() logic to
// get attachments into desired state with minimal number of adds/removes.
void LLAgentWearables::userUpdateAttachments(LLInventoryModel::item_array_t& obj_item_array)
@@ -2045,8 +2025,9 @@ void LLAgentWearables::editWearable(const LLUUID& item_id)
return;
}
- LLPanel* panel = LLSideTray::getInstance()->getPanel("sidepanel_appearance");
- LLSidepanelAppearance::editWearable(wearable, panel);
+ const BOOL disable_camera_switch = LLWearableType::getDisableCameraSwitch(wearable->getType());
+ LLPanel* panel = LLFloaterSidePanelContainer::getPanel("appearance");
+ LLSidepanelAppearance::editWearable(wearable, panel, disable_camera_switch);
}
// Request editing the item after it gets worn.
diff --git a/indra/newview/llagentwearables.h b/indra/newview/llagentwearables.h
index d7e77a5a5b..01cae3ffd8 100644
--- a/indra/newview/llagentwearables.h
+++ b/indra/newview/llagentwearables.h
@@ -56,7 +56,7 @@ public:
LLAgentWearables();
virtual ~LLAgentWearables();
void setAvatarObject(LLVOAvatarSelf *avatar);
- void createStandardWearables(BOOL female);
+ void createStandardWearables();
void cleanup();
void dump();
@@ -124,7 +124,7 @@ public:
void setWearableOutfit(const LLInventoryItem::item_array_t& items, const LLDynamicArray< LLWearable* >& wearables, BOOL remove);
void setWearableName(const LLUUID& item_id, const std::string& new_name);
void addLocalTextureObject(const LLWearableType::EType wearable_type, const LLVOAvatarDefines::ETextureIndex texture_type, U32 wearable_index);
- U32 getWearableIndex(LLWearable *wearable);
+ U32 getWearableIndex(const LLWearable *wearable) const;
protected:
void setWearableFinal(LLInventoryItem* new_item, LLWearable* new_wearable, bool do_append = false);
@@ -165,7 +165,6 @@ private:
void removeWearableFinal(const LLWearableType::EType type, bool do_remove_all /*= false*/, U32 index /*= 0*/);
protected:
static bool onRemoveWearableDialog(const LLSD& notification, const LLSD& response);
- static void userRemoveAllClothesStep2(BOOL proceed); // userdata is NULL
//--------------------------------------------------------------------
// Server Communication
@@ -211,7 +210,6 @@ public:
public:
static void userRemoveWearable(const LLWearableType::EType &type, const U32 &index);
static void userRemoveWearablesOfType(const LLWearableType::EType &type);
- static void userRemoveAllClothes();
typedef std::vector<LLViewerObject*> llvo_vec_t;
diff --git a/indra/newview/llagentwearablesfetch.cpp b/indra/newview/llagentwearablesfetch.cpp
index 1edc96e165..8cba54347e 100644
--- a/indra/newview/llagentwearablesfetch.cpp
+++ b/indra/newview/llagentwearablesfetch.cpp
@@ -87,6 +87,10 @@ public:
LLInitialWearablesFetch::LLInitialWearablesFetch(const LLUUID& cof_id) :
LLInventoryFetchDescendentsObserver(cof_id)
{
+ if (isAgentAvatarValid())
+ {
+ gAgentAvatarp->outputRezTiming("Initial wearables fetch started");
+ }
}
LLInitialWearablesFetch::~LLInitialWearablesFetch()
@@ -101,6 +105,10 @@ void LLInitialWearablesFetch::done()
// idle tick instead.
gInventory.removeObserver(this);
doOnIdleOneTime(boost::bind(&LLInitialWearablesFetch::processContents,this));
+ if (isAgentAvatarValid())
+ {
+ gAgentAvatarp->outputRezTiming("Initial wearables fetch done");
+ }
}
void LLInitialWearablesFetch::add(InitialWearableData &data)
@@ -111,6 +119,12 @@ void LLInitialWearablesFetch::add(InitialWearableData &data)
void LLInitialWearablesFetch::processContents()
{
+ if(!gAgentAvatarp) //no need to process wearables if the agent avatar is deleted.
+ {
+ delete this;
+ return ;
+ }
+
// Fetch the wearable items from the Current Outfit Folder
LLInventoryModel::cat_array_t cat_array;
LLInventoryModel::item_array_t wearable_array;
diff --git a/indra/newview/llagentwearablesfetch.h b/indra/newview/llagentwearablesfetch.h
index 7dafab4a33..bedc445c0e 100644
--- a/indra/newview/llagentwearablesfetch.h
+++ b/indra/newview/llagentwearablesfetch.h
@@ -40,6 +40,8 @@
//--------------------------------------------------------------------
class LLInitialWearablesFetch : public LLInventoryFetchDescendentsObserver
{
+ LOG_CLASS(LLInitialWearablesFetch);
+
public:
LLInitialWearablesFetch(const LLUUID& cof_id);
~LLInitialWearablesFetch();
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index 4e0bfb2e22..33f5373d7e 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -34,6 +34,7 @@
#include "llattachmentsmgr.h"
#include "llcommandhandler.h"
#include "lleventtimer.h"
+#include "llfloatersidepanelcontainer.h"
#include "llgesturemgr.h"
#include "llinventorybridge.h"
#include "llinventoryfunctions.h"
@@ -43,7 +44,6 @@
#include "lloutfitslist.h"
#include "llselectmgr.h"
#include "llsidepanelappearance.h"
-#include "llsidetray.h"
#include "llviewerobjectlist.h"
#include "llvoavatar.h"
#include "llvoavatarself.h"
@@ -110,7 +110,13 @@ public:
{
// support secondlife:///app/appearance/show, but for now we just
// make all secondlife:///app/appearance SLapps behave this way
- LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD());
+ if (!LLUI::sSettingGroups["config"]->getBOOL("EnableAppearance"))
+ {
+ LLNotificationsUtil::add("NoAppearance", LLSD(), LLSD(), std::string("SwitchToStandardSkinAndQuit"));
+ return true;
+ }
+
+ LLFloaterSidePanelContainer::showPanel("appearance", LLSD());
return true;
}
};
@@ -262,6 +268,8 @@ struct LLFoundData
class LLWearableHoldingPattern
{
+ LOG_CLASS(LLWearableHoldingPattern);
+
public:
LLWearableHoldingPattern();
~LLWearableHoldingPattern();
@@ -430,6 +438,11 @@ void LLWearableHoldingPattern::checkMissingWearables()
void LLWearableHoldingPattern::onAllComplete()
{
+ if (isAgentAvatarValid())
+ {
+ gAgentAvatarp->outputRezTiming("Agent wearables fetch complete");
+ }
+
if (!isMostRecent())
{
llwarns << "skipping because LLWearableHolding pattern is invalid (superceded by later outfit request)" << llendl;
@@ -1300,8 +1313,16 @@ bool LLAppearanceMgr::getCanReplaceCOF(const LLUUID& outfit_cat_id)
return false;
}
- // Check whether the outfit contains the full set of body parts (shape+skin+hair+eyes).
- return getCanMakeFolderIntoOutfit(outfit_cat_id);
+ // Check whether the outfit contains any wearables we aren't wearing already (STORM-702).
+ LLInventoryModel::cat_array_t cats;
+ LLInventoryModel::item_array_t items;
+ LLFindWearablesEx is_worn(/*is_worn=*/ false, /*include_body_parts=*/ true);
+ gInventory.collectDescendentsIf(outfit_cat_id,
+ cats,
+ items,
+ LLInventoryModel::EXCLUDE_TRASH,
+ is_worn);
+ return items.size() > 0;
}
void LLAppearanceMgr::purgeBaseOutfitLink(const LLUUID& category)
@@ -1491,7 +1512,7 @@ void LLAppearanceMgr::updateCOF(const LLUUID& category, bool append)
void LLAppearanceMgr::updatePanelOutfitName(const std::string& name)
{
LLSidepanelAppearance* panel_appearance =
- dynamic_cast<LLSidepanelAppearance *>(LLSideTray::getInstance()->getPanel("sidepanel_appearance"));
+ dynamic_cast<LLSidepanelAppearance *>(LLFloaterSidePanelContainer::getPanel("appearance"));
if (panel_appearance)
{
panel_appearance->refreshCurrentOutfitName(name);
@@ -1929,7 +1950,7 @@ void LLAppearanceMgr::wearInventoryCategoryOnAvatar( LLInventoryCategory* catego
if (gAgentCamera.cameraCustomizeAvatar())
{
// switching to outfit editor should automagically save any currently edited wearable
- LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD().with("type", "edit_outfit"));
+ LLFloaterSidePanelContainer::showPanel("appearance", LLSD().with("type", "edit_outfit"));
}
LLAppearanceMgr::changeOutfit(TRUE, category->getUUID(), append);
@@ -2250,6 +2271,85 @@ void LLAppearanceMgr::updateIsDirty()
}
}
+// *HACK: Must match name in Library or agent inventory
+const std::string ROOT_GESTURES_FOLDER = "Gestures";
+const std::string COMMON_GESTURES_FOLDER = "Common Gestures";
+const std::string MALE_GESTURES_FOLDER = "Male Gestures";
+const std::string FEMALE_GESTURES_FOLDER = "Female Gestures";
+const std::string SPEECH_GESTURES_FOLDER = "Speech Gestures";
+const std::string OTHER_GESTURES_FOLDER = "Other Gestures";
+
+void LLAppearanceMgr::copyLibraryGestures()
+{
+ llinfos << "Copying library gestures" << llendl;
+
+ // Copy gestures
+ LLUUID lib_gesture_cat_id =
+ gInventory.findCategoryUUIDForType(LLFolderType::FT_GESTURE,false,true);
+ if (lib_gesture_cat_id.isNull())
+ {
+ llwarns << "Unable to copy gestures, source category not found" << llendl;
+ }
+ LLUUID dst_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_GESTURE);
+
+ std::vector<std::string> gesture_folders_to_copy;
+ gesture_folders_to_copy.push_back(MALE_GESTURES_FOLDER);
+ gesture_folders_to_copy.push_back(FEMALE_GESTURES_FOLDER);
+ gesture_folders_to_copy.push_back(COMMON_GESTURES_FOLDER);
+ gesture_folders_to_copy.push_back(SPEECH_GESTURES_FOLDER);
+ gesture_folders_to_copy.push_back(OTHER_GESTURES_FOLDER);
+
+ for(std::vector<std::string>::iterator it = gesture_folders_to_copy.begin();
+ it != gesture_folders_to_copy.end();
+ ++it)
+ {
+ std::string& folder_name = *it;
+
+ LLPointer<LLInventoryCallback> cb(NULL);
+
+ // After copying gestures, activate Common, Other, plus
+ // Male and/or Female, depending upon the initial outfit gender.
+ ESex gender = gAgentAvatarp->getSex();
+
+ std::string activate_male_gestures;
+ std::string activate_female_gestures;
+ switch (gender) {
+ case SEX_MALE:
+ activate_male_gestures = MALE_GESTURES_FOLDER;
+ break;
+ case SEX_FEMALE:
+ activate_female_gestures = FEMALE_GESTURES_FOLDER;
+ break;
+ case SEX_BOTH:
+ activate_male_gestures = MALE_GESTURES_FOLDER;
+ activate_female_gestures = FEMALE_GESTURES_FOLDER;
+ break;
+ }
+
+ if (folder_name == activate_male_gestures ||
+ folder_name == activate_female_gestures ||
+ folder_name == COMMON_GESTURES_FOLDER ||
+ folder_name == OTHER_GESTURES_FOLDER)
+ {
+ cb = new ActivateGestureCallback;
+ }
+
+ LLUUID cat_id = findDescendentCategoryIDByName(lib_gesture_cat_id,folder_name);
+ if (cat_id.isNull())
+ {
+ llwarns << "failed to find gesture folder for " << folder_name << llendl;
+ }
+ else
+ {
+ llinfos << "initiating fetch and copy for " << folder_name << " cat_id " << cat_id << llendl;
+ callAfterCategoryFetch(cat_id,
+ boost::bind(&LLAppearanceMgr::shallowCopyCategory,
+ &LLAppearanceMgr::instance(),
+ cat_id, dst_id, cb));
+ }
+ }
+}
+
void LLAppearanceMgr::autopopulateOutfits()
{
// If this is the very first time the user has logged into viewer2+ (from a legacy viewer, or new account)
@@ -2270,8 +2370,19 @@ void LLAppearanceMgr::autopopulateOutfits()
// Handler for anything that's deferred until avatar de-clouds.
void LLAppearanceMgr::onFirstFullyVisible()
{
+ gAgentAvatarp->outputRezTiming("Avatar fully loaded");
+ gAgentAvatarp->reportAvatarRezTime();
gAgentAvatarp->debugAvatarVisible();
- autopopulateOutfits();
+
+ // The auto-populate is failing at the point of generating outfits
+ // folders, so don't do the library copy until that is resolved.
+ // autopopulateOutfits();
+
+ // If this is the first time we've ever logged in,
+ // then copy default gestures from the library.
+ if (gAgent.isFirstLogin()) {
+ copyLibraryGestures();
+ }
}
bool LLAppearanceMgr::updateBaseOutfit()
@@ -2449,10 +2560,11 @@ public:
// add may be processed after login process is finished
if (mShowPanel)
{
- LLSideTray::getInstance()->showPanel("panel_outfits_inventory", key);
+ LLFloaterSidePanelContainer::showPanel("appearance", "panel_outfits_inventory", key);
+
}
LLOutfitsList *outfits_list =
- dynamic_cast<LLOutfitsList*>(LLSideTray::getInstance()->getPanel("outfitslist_tab"));
+ dynamic_cast<LLOutfitsList*>(LLFloaterSidePanelContainer::getPanel("appearance", "outfitslist_tab"));
if (outfits_list)
{
outfits_list->setSelectedOutfitByUUID(mFolderID);
@@ -2759,75 +2871,6 @@ BOOL LLAppearanceMgr::getIsProtectedCOFItem(const LLUUID& obj_id) const
*/
}
-// Shim class to allow arbitrary boost::bind
-// expressions to be run as one-time idle callbacks.
-//
-// TODO: rework idle function spec to take a boost::function in the first place.
-class OnIdleCallbackOneTime
-{
-public:
- OnIdleCallbackOneTime(nullary_func_t callable):
- mCallable(callable)
- {
- }
- static void onIdle(void *data)
- {
- gIdleCallbacks.deleteFunction(onIdle, data);
- OnIdleCallbackOneTime* self = reinterpret_cast<OnIdleCallbackOneTime*>(data);
- self->call();
- delete self;
- }
- void call()
- {
- mCallable();
- }
-private:
- nullary_func_t mCallable;
-};
-
-void doOnIdleOneTime(nullary_func_t callable)
-{
- OnIdleCallbackOneTime* cb_functor = new OnIdleCallbackOneTime(callable);
- gIdleCallbacks.addFunction(&OnIdleCallbackOneTime::onIdle,cb_functor);
-}
-
-// Shim class to allow generic boost functions to be run as
-// recurring idle callbacks. Callable should return true when done,
-// false to continue getting called.
-//
-// TODO: rework idle function spec to take a boost::function in the first place.
-class OnIdleCallbackRepeating
-{
-public:
- OnIdleCallbackRepeating(bool_func_t callable):
- mCallable(callable)
- {
- }
- // Will keep getting called until the callable returns true.
- static void onIdle(void *data)
- {
- OnIdleCallbackRepeating* self = reinterpret_cast<OnIdleCallbackRepeating*>(data);
- bool done = self->call();
- if (done)
- {
- gIdleCallbacks.deleteFunction(onIdle, data);
- delete self;
- }
- }
- bool call()
- {
- return mCallable();
- }
-private:
- bool_func_t mCallable;
-};
-
-void doOnIdleRepeating(bool_func_t callable)
-{
- OnIdleCallbackRepeating* cb_functor = new OnIdleCallbackRepeating(callable);
- gIdleCallbacks.addFunction(&OnIdleCallbackRepeating::onIdle,cb_functor);
-}
-
class CallAfterCategoryFetchStage2: public LLInventoryFetchItemsObserver
{
public:
@@ -2947,3 +2990,35 @@ void wear_multiple(const uuid_vec_t& ids, bool replace)
}
}
+// SLapp for easy-wearing of a stock (library) avatar
+//
+class LLWearFolderHandler : public LLCommandHandler
+{
+public:
+ // not allowed from outside the app
+ LLWearFolderHandler() : LLCommandHandler("wear_folder", UNTRUSTED_BLOCK) { }
+
+ bool handle(const LLSD& tokens, const LLSD& query_map,
+ LLMediaCtrl* web)
+ {
+ LLPointer<LLInventoryCategory> category = new LLInventoryCategory(query_map["folder_id"],
+ LLUUID::null,
+ LLFolderType::FT_CLOTHING,
+ "Quick Appearance");
+ LLSD::UUID folder_uuid = query_map["folder_id"].asUUID();
+ if ( gInventory.getCategory( folder_uuid ) != NULL )
+ {
+ LLAppearanceMgr::getInstance()->wearInventoryCategory(category, true, false);
+
+ // *TODOw: This may not be necessary if initial outfit is chosen already -- josh
+ gAgent.setGenderChosen(TRUE);
+ }
+
+ // release avatar picker keyboard focus
+ gFocusMgr.setKeyboardFocus( NULL );
+
+ return true;
+ }
+};
+
+LLWearFolderHandler gWearFolderHandler;
diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h
index c65d9dc9ee..c1d561781d 100644
--- a/indra/newview/llappearancemgr.h
+++ b/indra/newview/llappearancemgr.h
@@ -151,6 +151,9 @@ public:
// Create initial outfits from library.
void autopopulateOutfits();
+
+ // Copy initial gestures from library.
+ void copyLibraryGestures();
void wearBaseOutfit();
@@ -248,15 +251,6 @@ private:
LLUUID findDescendentCategoryIDByName(const LLUUID& parent_id,const std::string& name);
-typedef boost::function<void ()> nullary_func_t;
-typedef boost::function<bool ()> bool_func_t;
-
-// Call a given callable once in idle loop.
-void doOnIdleOneTime(nullary_func_t callable);
-
-// Repeatedly call a callable in idle loop until it returns true.
-void doOnIdleRepeating(bool_func_t callable);
-
// Invoke a given callable after category contents are fully fetched.
void callAfterCategoryFetch(const LLUUID& cat_id, nullary_func_t cb);
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index b6f52e3e15..047e9b1880 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -44,7 +44,11 @@
#include "llagentwearables.h"
#include "llwindow.h"
#include "llviewerstats.h"
+#include "llviewerstatsrecorder.h"
+#include "llmarketplacefunctions.h"
+#include "llmarketplacenotifications.h"
#include "llmd5.h"
+#include "llmeshrepository.h"
#include "llpumpio.h"
#include "llmimetypes.h"
#include "llslurl.h"
@@ -54,6 +58,7 @@
#include "llallocator.h"
#include "llares.h"
#include "llcurl.h"
+#include "llcalc.h"
#include "lltexturestats.h"
#include "lltexturestats.h"
#include "llviewerwindow.h"
@@ -72,25 +77,31 @@
//#include "llfirstuse.h"
#include "llrender.h"
#include "llteleporthistory.h"
+#include "lltoast.h"
#include "lllocationhistory.h"
#include "llfasttimerview.h"
+#include "llvector4a.h"
+#include "llviewermenufile.h"
#include "llvoicechannel.h"
#include "llvoavatarself.h"
-#include "llsidetray.h"
-#include "llfeaturemanager.h"
#include "llurlmatch.h"
#include "lltextutil.h"
-
+#include "lllogininstance.h"
+#include "llprogressview.h"
+#include "llvocache.h"
#include "llweb.h"
#include "llsecondlifeurls.h"
#include "llupdaterservice.h"
+#include "llcallfloater.h"
// Linden library includes
#include "llavatarnamecache.h"
+#include "lldiriterator.h"
#include "llimagej2c.h"
#include "llmemory.h"
#include "llprimitive.h"
#include "llurlaction.h"
+#include "llurlentry.h"
#include "llvfile.h"
#include "llvfsthread.h"
#include "llvolumemgr.h"
@@ -102,6 +113,8 @@
// Third party library includes
#include <boost/bind.hpp>
+#include <boost/foreach.hpp>
+
#if LL_WINDOWS
@@ -129,7 +142,7 @@
#include "lltoolmgr.h"
#include "llassetstorage.h"
#include "llpolymesh.h"
-#include "llcachename.h"
+#include "llproxy.h"
#include "llaudioengine.h"
#include "llstreamingaudio.h"
#include "llviewermenu.h"
@@ -192,11 +205,11 @@
#include "llparcel.h"
#include "llavatariconctrl.h"
#include "llgroupiconctrl.h"
+#include "llviewerassetstats.h"
// Include for security api initialization
#include "llsecapi.h"
#include "llmachineid.h"
-
#include "llmainlooprepeater.h"
// *FIX: These extern globals should be cleaned up.
@@ -239,7 +252,6 @@ extern BOOL gDebugGL;
////////////////////////////////////////////////////////////
// All from the last globals push...
-const F32 DEFAULT_AFK_TIMEOUT = 5.f * 60.f; // time with no input before user flagged as Away From Keyboard
F32 gSimLastTime; // Used in LLAppViewer::init and send_stats()
F32 gSimFrames;
@@ -314,6 +326,41 @@ static std::string gLaunchFileOnQuit;
// Used on Win32 for other apps to identify our window (eg, win_setup)
const char* const VIEWER_WINDOW_CLASSNAME = "Second Life";
+//-- LLDeferredTaskList ------------------------------------------------------
+
+/**
+ * A list of deferred tasks.
+ *
+ * We sometimes need to defer execution of some code until the viewer gets idle,
+ * e.g. removing an inventory item from within notifyObservers() may not work out.
+ *
+ * Tasks added to this list will be executed in the next LLAppViewer::idle() iteration.
+ * All tasks are executed only once.
+ */
+class LLDeferredTaskList: public LLSingleton<LLDeferredTaskList>
+{
+ LOG_CLASS(LLDeferredTaskList);
+
+ friend class LLAppViewer;
+ typedef boost::signals2::signal<void()> signal_t;
+
+ void addTask(const signal_t::slot_type& cb)
+ {
+ mSignal.connect(cb);
+ }
+
+ void run()
+ {
+ if (!mSignal.empty())
+ {
+ mSignal();
+ mSignal.disconnect_all_slots();
+ }
+ }
+
+ signal_t mSignal;
+};
+
//----------------------------------------------------------------------------
// List of entries from strings.xml to always replace
@@ -332,15 +379,66 @@ void init_default_trans_args()
const char *VFS_DATA_FILE_BASE = "data.db2.x.";
const char *VFS_INDEX_FILE_BASE = "index.db2.x.";
+
+struct SettingsFile : public LLInitParam::Block<SettingsFile>
+{
+ Mandatory<std::string> name;
+ Optional<std::string> file_name;
+ Optional<bool> required,
+ persistent;
+ Optional<std::string> file_name_setting;
+
+ SettingsFile()
+ : name("name"),
+ file_name("file_name"),
+ required("required", false),
+ persistent("persistent", true),
+ file_name_setting("file_name_setting")
+ {}
+};
+
+struct SettingsGroup : public LLInitParam::Block<SettingsGroup>
+{
+ Mandatory<std::string> name;
+ Mandatory<S32> path_index;
+ Multiple<SettingsFile> files;
+
+ SettingsGroup()
+ : name("name"),
+ path_index("path_index"),
+ files("file")
+ {}
+};
+
+struct SettingsFiles : public LLInitParam::Block<SettingsFiles>
+{
+ Multiple<SettingsGroup> groups;
+
+ SettingsFiles()
+ : groups("group")
+ {}
+};
+
static std::string gWindowTitle;
LLAppViewer::LLUpdaterInfo *LLAppViewer::sUpdaterInfo = NULL ;
+//----------------------------------------------------------------------------
+// Metrics logging control constants
+//----------------------------------------------------------------------------
+static const F32 METRICS_INTERVAL_DEFAULT = 600.0;
+static const F32 METRICS_INTERVAL_QA = 30.0;
+static F32 app_metrics_interval = METRICS_INTERVAL_DEFAULT;
+static bool app_metrics_qa_mode = false;
+
void idle_afk_check()
{
// check idle timers
- if (gSavedSettings.getS32("AFKTimeout") && (gAwayTriggerTimer.getElapsedTimeF32() > gSavedSettings.getS32("AFKTimeout")))
+ F32 current_idle = gAwayTriggerTimer.getElapsedTimeF32();
+ F32 afk_timeout = gSavedSettings.getS32("AFKTimeout");
+ if (afk_timeout && (current_idle > afk_timeout) && ! gAgent.getAFK())
{
+ LL_INFOS("IdleAway") << "Idle more than " << afk_timeout << " seconds: automatically changing to Away status" << LL_ENDL;
gAgent.setAFK();
}
}
@@ -414,18 +512,6 @@ void request_initial_instant_messages()
}
}
-// A settings system callback for CrashSubmitBehavior
-bool handleCrashSubmitBehaviorChanged(const LLSD& newvalue)
-{
- S32 cb = newvalue.asInteger();
- const S32 NEVER_SUBMIT_REPORT = 2;
- if(cb == NEVER_SUBMIT_REPORT)
- {
- LLAppViewer::instance()->destroyMainloopTimeout();
- }
- return true;
-}
-
// Use these strictly for things that are constructed at startup,
// or for things that are performance critical. JC
static void settings_to_globals()
@@ -439,12 +525,15 @@ static void settings_to_globals()
LLSurface::setTextureSize(gSavedSettings.getU32("RegionTextureSize"));
+ LLRender::sGLCoreProfile = gSavedSettings.getBOOL("RenderGLCoreProfile");
+
LLImageGL::sGlobalUseAnisotropic = gSavedSettings.getBOOL("RenderAnisotropic");
LLVOVolume::sLODFactor = gSavedSettings.getF32("RenderVolumeLODFactor");
LLVOVolume::sDistanceFactor = 1.f-LLVOVolume::sLODFactor * 0.1f;
LLVolumeImplFlexible::sUpdateFactor = gSavedSettings.getF32("RenderFlexTimeFactor");
LLVOTree::sTreeFactor = gSavedSettings.getF32("RenderTreeLODFactor");
LLVOAvatar::sLODFactor = gSavedSettings.getF32("RenderAvatarLODFactor");
+ LLVOAvatar::sPhysicsLODFactor = gSavedSettings.getF32("RenderAvatarPhysicsLODFactor");
LLVOAvatar::sMaxVisible = (U32)gSavedSettings.getS32("RenderAvatarMaxVisible");
LLVOAvatar::sVisibleInFirstPerson = gSavedSettings.getBOOL("FirstPersonAvatarVisible");
// clamp auto-open time to some minimum usable value
@@ -453,59 +542,25 @@ static void settings_to_globals()
LLSelectMgr::sRenderHiddenSelections = gSavedSettings.getBOOL("RenderHiddenSelections");
LLSelectMgr::sRenderLightRadius = gSavedSettings.getBOOL("RenderLightRadius");
- gAgentPilot.mNumRuns = gSavedSettings.getS32("StatsNumRuns");
- gAgentPilot.mQuitAfterRuns = gSavedSettings.getBOOL("StatsQuitAfterRuns");
+ gAgentPilot.setNumRuns(gSavedSettings.getS32("StatsNumRuns"));
+ gAgentPilot.setQuitAfterRuns(gSavedSettings.getBOOL("StatsQuitAfterRuns"));
gAgent.setHideGroupTitle(gSavedSettings.getBOOL("RenderHideGroupTitle"));
gDebugWindowProc = gSavedSettings.getBOOL("DebugWindowProc");
gShowObjectUpdates = gSavedSettings.getBOOL("ShowObjectUpdates");
LLWorldMapView::sMapScale = gSavedSettings.getF32("MapScale");
-
- LLCubeMap::sUseCubeMaps = LLFeatureManager::getInstance()->isFeatureAvailable("RenderCubeMap");
}
static void settings_modify()
{
- LLRenderTarget::sUseFBO = gSavedSettings.getBOOL("RenderUseFBO");
+ LLRenderTarget::sUseFBO = gSavedSettings.getBOOL("RenderDeferred");
+ LLPipeline::sRenderDeferred = gSavedSettings.getBOOL("RenderDeferred");
LLVOAvatar::sUseImpostors = gSavedSettings.getBOOL("RenderUseImpostors");
LLVOSurfacePatch::sLODFactor = gSavedSettings.getF32("RenderTerrainLODFactor");
LLVOSurfacePatch::sLODFactor *= LLVOSurfacePatch::sLODFactor; //square lod factor to get exponential range of [1,4]
gDebugGL = gSavedSettings.getBOOL("RenderDebugGL") || gDebugSession;
gDebugPipeline = gSavedSettings.getBOOL("RenderDebugPipeline");
gAuditTexture = gSavedSettings.getBOOL("AuditTexture");
-#if LL_VECTORIZE
- if (gSysCPU.hasAltivec())
- {
- gSavedSettings.setBOOL("VectorizeEnable", TRUE );
- gSavedSettings.setU32("VectorizeProcessor", 0 );
- }
- else
- if (gSysCPU.hasSSE2())
- {
- gSavedSettings.setBOOL("VectorizeEnable", TRUE );
- gSavedSettings.setU32("VectorizeProcessor", 2 );
- }
- else
- if (gSysCPU.hasSSE())
- {
- gSavedSettings.setBOOL("VectorizeEnable", TRUE );
- gSavedSettings.setU32("VectorizeProcessor", 1 );
- }
- else
- {
- // Don't bother testing or running if CPU doesn't support it. JC
- gSavedSettings.setBOOL("VectorizePerfTest", FALSE );
- gSavedSettings.setBOOL("VectorizeEnable", FALSE );
- gSavedSettings.setU32("VectorizeProcessor", 0 );
- gSavedSettings.setBOOL("VectorizeSkin", FALSE);
- }
-#else
- // This build target doesn't support SSE, don't test/run.
- gSavedSettings.setBOOL("VectorizePerfTest", FALSE );
- gSavedSettings.setBOOL("VectorizeEnable", FALSE );
- gSavedSettings.setU32("VectorizeProcessor", 0 );
- gSavedSettings.setBOOL("VectorizeSkin", FALSE);
-#endif
}
class LLFastTimerLogThread : public LLThread
@@ -514,7 +569,7 @@ public:
std::string mFile;
LLFastTimerLogThread(std::string& test_name) : LLThread("fast timer log")
- {
+ {
std::string file_name = test_name + std::string(".slp");
mFile = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, file_name);
}
@@ -532,7 +587,6 @@ public:
os.close();
}
-
};
//virtual
@@ -555,9 +609,6 @@ bool LLAppViewer::sendURLToOtherInstance(const std::string& url)
// Static members.
// The single viewer app.
LLAppViewer* LLAppViewer::sInstance = NULL;
-
-const std::string LLAppViewer::sGlobalSettingsName = "Global";
-
LLTextureCache* LLAppViewer::sTextureCache = NULL;
LLImageDecodeThread* LLAppViewer::sImageDecodeThread = NULL;
LLTextureFetch* LLAppViewer::sTextureFetch = NULL;
@@ -571,6 +622,7 @@ LLAppViewer::LLAppViewer() :
mPurgeOnExit(false),
mSecondInstance(false),
mSavedFinalSnapshot(false),
+ mSavePerAccountSettings(false), // don't save settings on logout unless login succeeded.
mForceGraphicsDetail(false),
mQuitRequested(false),
mLogoutRequestSent(false),
@@ -580,7 +632,8 @@ LLAppViewer::LLAppViewer() :
mRandomizeFramerate(LLCachedControl<bool>(gSavedSettings,"Randomize Framerate", FALSE)),
mPeriodicSlowFrame(LLCachedControl<bool>(gSavedSettings,"Periodic Slow Frame", FALSE)),
mFastTimerLogThread(NULL),
- mUpdater(new LLUpdaterService())
+ mUpdater(new LLUpdaterService()),
+ mSettingsLocationList(NULL)
{
if(NULL != sInstance)
{
@@ -590,10 +643,16 @@ LLAppViewer::LLAppViewer() :
setupErrorHandling();
sInstance = this;
gLoggedInTime.stop();
+
+ LLLoginInstance::instance().setUpdaterService(mUpdater.get());
}
LLAppViewer::~LLAppViewer()
{
+ delete mSettingsLocationList;
+
+ LLLoginInstance::instance().setUpdaterService(0);
+
destroyMainloopTimeout();
// If we got to this destructor somehow, the app didn't hang.
@@ -601,7 +660,7 @@ LLAppViewer::~LLAppViewer()
}
bool LLAppViewer::init()
-{
+{
//
// Start of the application
//
@@ -611,6 +670,9 @@ bool LLAppViewer::init()
//
LLFastTimer::reset();
+ // initialize SSE options
+ LLVector4a::initClass();
+
// Need to do this initialization before we do anything else, since anything
// that touches files should really go through the lldir API
gDirUtilp->initAppDirs("SecondLife");
@@ -629,6 +691,13 @@ bool LLAppViewer::init()
if (!initConfiguration())
return false;
+ LL_INFOS("InitInfo") << "Configuration initialized." << LL_ENDL ;
+
+ //set the max heap size.
+ initMaxHeapSize() ;
+
+ LLPrivateMemoryPoolManager::initClass((BOOL)gSavedSettings.getBOOL("MemoryPrivatePoolEnabled"), (U32)gSavedSettings.getU32("MemoryPrivatePoolSize")) ;
+
// write Google Breakpad minidump files to our log directory
std::string logdir = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "");
logdir += gDirUtilp->getDirDelimiter();
@@ -648,12 +717,60 @@ bool LLAppViewer::init()
mAlloc.setProfilingEnabled(gSavedSettings.getBOOL("MemProfiling"));
+#if LL_RECORD_VIEWER_STATS
+ LLViewerStatsRecorder::initClass();
+#endif
+
// *NOTE:Mani - LLCurl::initClass is not thread safe.
// Called before threads are created.
- LLCurl::initClass();
+ LLCurl::initClass(gSavedSettings.getF32("CurlRequestTimeOut"),
+ gSavedSettings.getS32("CurlMaximumNumberOfHandles"),
+ gSavedSettings.getBOOL("CurlUseMultipleThreads"));
+ LL_INFOS("InitInfo") << "LLCurl initialized." << LL_ENDL ;
+
LLMachineID::init();
+
+ {
+ // Viewer metrics initialization
+ static LLCachedControl<bool> metrics_submode(gSavedSettings,
+ "QAModeMetrics",
+ false,
+ "Enables QA features (logging, faster cycling) for metrics collector");
+
+ if (metrics_submode)
+ {
+ app_metrics_qa_mode = true;
+ app_metrics_interval = METRICS_INTERVAL_QA;
+ }
+ LLViewerAssetStatsFF::init();
+ }
+
+ initThreads();
+ LL_INFOS("InitInfo") << "Threads initialized." << LL_ENDL ;
+
+ // Initialize settings early so that the defaults for ignorable dialogs are
+ // picked up and then correctly re-saved after launching the updater (STORM-1268).
+ LLUI::settings_map_t settings_map;
+ settings_map["config"] = &gSavedSettings;
+ settings_map["ignores"] = &gWarningSettings;
+ settings_map["floater"] = &gSavedSettings; // *TODO: New settings file
+ settings_map["account"] = &gSavedPerAccountSettings;
+
+ LLUI::initClass(settings_map,
+ LLUIImageList::getInstance(),
+ ui_audio_callback,
+ &LLUI::sGLScaleFactor);
+ LL_INFOS("InitInfo") << "UI initialized." << LL_ENDL ;
+
+ // Setup paths and LLTrans after LLUI::initClass has been called.
+ LLUI::setupPaths();
+ LLTransUtil::parseStrings("strings.xml", default_trans_args);
+ LLTransUtil::parseLanguageStrings("language_settings.xml");
+
+ // Setup notifications after LLUI::setupPaths() has been called.
+ LLNotifications::instance();
+ LL_INFOS("InitInfo") << "Notifications initialized." << LL_ENDL ;
- initThreads();
writeSystemInfo();
// Initialize updater service (now that we have an io pump)
@@ -675,20 +792,11 @@ bool LLAppViewer::init()
//
// Various introspection concerning the libs we're using - particularly
- // the libs involved in getting to a full login screen.
+ // the libs involved in getting to a full login screen.
//
LL_INFOS("InitInfo") << "J2C Engine is: " << LLImageJ2C::getEngineInfo() << LL_ENDL;
LL_INFOS("InitInfo") << "libcurl version is: " << LLCurl::getVersionString() << LL_ENDL;
- // Get the single value from the crash settings file, if it exists
- std::string crash_settings_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE);
- gCrashSettings.loadFromFile(crash_settings_filename);
- if(gSavedSettings.getBOOL("IgnoreAllNotifications"))
- {
- gCrashSettings.setS32(CRASH_BEHAVIOR_SETTING, CRASH_BEHAVIOR_ALWAYS_SEND);
- gCrashSettings.saveToFile(crash_settings_filename, FALSE);
- }
-
/////////////////////////////////////////////////
// OS-specific login dialogs
/////////////////////////////////////////////////
@@ -704,38 +812,23 @@ bool LLAppViewer::init()
{
LLError::setPrintLocation(true);
}
-
- // Widget construction depends on LLUI being initialized
- LLUI::settings_map_t settings_map;
- settings_map["config"] = &gSavedSettings;
- settings_map["ignores"] = &gWarningSettings;
- settings_map["floater"] = &gSavedSettings; // *TODO: New settings file
- settings_map["account"] = &gSavedPerAccountSettings;
- LLUI::initClass(settings_map,
- LLUIImageList::getInstance(),
- ui_audio_callback,
- &LLUI::sGLScaleFactor);
-
- // Setup paths and LLTrans after LLUI::initClass has been called
- LLUI::setupPaths();
- LLTransUtil::parseStrings("strings.xml", default_trans_args);
- LLTransUtil::parseLanguageStrings("language_settings.xml");
-
// LLKeyboard relies on LLUI to know what some accelerator keys are called.
LLKeyboard::setStringTranslatorFunc( LLTrans::getKeyboardString );
LLWeb::initClass(); // do this after LLUI
// Provide the text fields with callbacks for opening Urls
- LLUrlAction::setOpenURLCallback(&LLWeb::loadURL);
- LLUrlAction::setOpenURLInternalCallback(&LLWeb::loadURLInternal);
- LLUrlAction::setOpenURLExternalCallback(&LLWeb::loadURLExternal);
+ LLUrlAction::setOpenURLCallback(boost::bind(&LLWeb::loadURL, _1, LLStringUtil::null, LLStringUtil::null));
+ LLUrlAction::setOpenURLInternalCallback(boost::bind(&LLWeb::loadURLInternal, _1, LLStringUtil::null, LLStringUtil::null));
+ LLUrlAction::setOpenURLExternalCallback(boost::bind(&LLWeb::loadURLExternal, _1, true, LLStringUtil::null));
LLUrlAction::setExecuteSLURLCallback(&LLURLDispatcher::dispatchFromTextEditor);
// Let code in llui access the viewer help floater
LLUI::sHelpImpl = LLViewerHelp::getInstance();
+ LL_INFOS("InitInfo") << "UI initialization is done." << LL_ENDL ;
+
// Load translations for tooltips
LLFloater::initClass();
@@ -754,8 +847,6 @@ bool LLAppViewer::init()
LLAgent::parseTeleportMessages("teleport_strings.xml");
- LLViewerJointMesh::updateVectorize();
-
// load MIME type -> media impl mappings
std::string mime_types_name;
#if LL_DARWIN
@@ -785,6 +876,7 @@ bool LLAppViewer::init()
// Early out from user choice.
return false;
}
+ LL_INFOS("InitInfo") << "Hardware test initialization done." << LL_ENDL ;
// Prepare for out-of-memory situations, during which we will crash on
// purpose and save a dump.
@@ -805,15 +897,20 @@ bool LLAppViewer::init()
OSMessageBox(msg.str(),LLStringUtil::null,OSMB_OK);
return 1;
}
-
+ LL_INFOS("InitInfo") << "Cache initialization is done." << LL_ENDL ;
+
// Initialize the repeater service.
LLMainLoopRepeater::instance().start();
-
+
//
// Initialize the window
//
gGLActive = TRUE;
initWindow();
+ LL_INFOS("InitInfo") << "Window is initialized." << LL_ENDL ;
+
+ // initWindow also initializes the Feature List, so now we can initialize this global.
+ LLCubeMap::sUseCubeMaps = LLFeatureManager::getInstance()->isFeatureAvailable("RenderCubeMap");
// call all self-registered classes
LLInitClassList::instance().fireCallbacks();
@@ -823,19 +920,25 @@ bool LLAppViewer::init()
gGLManager.getGLInfo(gDebugInfo);
gGLManager.printGLInfoString();
- //load key settings
- bind_keyboard_functions();
-
// Load Default bindings
- if (!gViewerKeyboard.loadBindings(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"keys.ini")))
+ std::string key_bindings_file = gDirUtilp->findFile("keys.xml",
+ gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, ""),
+ gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, ""));
+
+
+ if (!gViewerKeyboard.loadBindingsXML(key_bindings_file))
{
- LL_ERRS("InitInfo") << "Unable to open keys.ini" << LL_ENDL;
+ std::string key_bindings_file = gDirUtilp->findFile("keys.ini",
+ gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, ""),
+ gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, ""));
+ if (!gViewerKeyboard.loadBindings(key_bindings_file))
+ {
+ LL_ERRS("InitInfo") << "Unable to open keys.ini" << LL_ENDL;
+ }
}
- // Load Custom bindings (override defaults)
- gViewerKeyboard.loadBindings(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"custom_keys.ini"));
// If we don't have the right GL requirements, exit.
- if (!gGLManager.mHasRequirements && !gNoRender)
+ if (!gGLManager.mHasRequirements)
{
// can't use an alert here since we're exiting and
// all hell breaks lose.
@@ -846,6 +949,18 @@ bool LLAppViewer::init()
return 0;
}
+ // Without SSE2 support we will crash almost immediately, warn here.
+ if (!gSysCPU.hasSSE2())
+ {
+ // can't use an alert here since we're exiting and
+ // all hell breaks lose.
+ OSMessageBox(
+ LLNotifications::instance().getGlobalString("UnsupportedCPUSSE2"),
+ LLStringUtil::null,
+ OSMB_OK);
+ return 0;
+ }
+
// alert the user if they are using unsupported hardware
if(!gSavedSettings.getBOOL("AlertedUnsupportedHardware"))
{
@@ -905,8 +1020,8 @@ bool LLAppViewer::init()
gDebugInfo["GraphicsCard"] = LLFeatureManager::getInstance()->getGPUString();
// Save the current version to the prefs file
- gSavedSettings.setString("LastRunVersion",
- LLVersionInfo::getVersionAndChannel());
+ gSavedSettings.setString("LastRunVersion",
+ LLVersionInfo::getChannelAndVersion());
gSimLastTime = gRenderStartTime.getElapsedTimeF32();
gSimFrames = (F32)gFrameCount;
@@ -930,12 +1045,14 @@ bool LLAppViewer::init()
}
LLViewerMedia::initClass();
+ LL_INFOS("InitInfo") << "Viewer media initialized." << LL_ENDL ;
+
LLTextUtil::TextHelpers::iconCallbackCreationFunction = create_text_segment_icon_from_url_match;
//EXT-7013 - On windows for some locale (Japanese) standard
//datetime formatting functions didn't support some parameters such as "weekday".
//Names for days and months localized in xml are also useful for Polish locale(STORM-107).
- std::string language = LLControlGroup::getInstance(sGlobalSettingsName)->getString("Language");
+ std::string language = gSavedSettings.getString("Language");
if(language == "ja" || language == "pl")
{
LLStringOps::setupWeekDaysNames(LLTrans::getString("dateTimeWeekdaysNames"));
@@ -953,6 +1070,58 @@ bool LLAppViewer::init()
return true;
}
+void LLAppViewer::initMaxHeapSize()
+{
+ //set the max heap size.
+ //here is some info regarding to the max heap size:
+ //------------------------------------------------------------------------------------------
+ // OS | setting | SL address bits | max manageable memory space | max heap size
+ // Win 32 | default | 32-bit | 2GB | < 1.7GB
+ // Win 32 | /3G | 32-bit | 3GB | < 1.7GB or 2.7GB
+ //Linux 32 | default | 32-bit | 3GB | < 2.7GB
+ //Linux 32 |HUGEMEM | 32-bit | 4GB | < 3.7GB
+ //64-bit OS |default | 32-bit | 4GB | < 3.7GB
+ //64-bit OS |default | 64-bit | N/A (> 4GB) | N/A (> 4GB)
+ //------------------------------------------------------------------------------------------
+ //currently SL is built under 32-bit setting, we set its max heap size no more than 1.6 GB.
+
+ //F32 max_heap_size_gb = llmin(1.6f, (F32)gSavedSettings.getF32("MaxHeapSize")) ;
+ F32 max_heap_size_gb = gSavedSettings.getF32("MaxHeapSize") ;
+ BOOL enable_mem_failure_prevention = (BOOL)gSavedSettings.getBOOL("MemoryFailurePreventionEnabled") ;
+
+ LLMemory::initMaxHeapSizeGB(max_heap_size_gb, enable_mem_failure_prevention) ;
+}
+
+void LLAppViewer::checkMemory()
+{
+ const static F32 MEMORY_CHECK_INTERVAL = 1.0f ; //second
+ //const static F32 MAX_QUIT_WAIT_TIME = 30.0f ; //seconds
+ //static F32 force_quit_timer = MAX_QUIT_WAIT_TIME + MEMORY_CHECK_INTERVAL ;
+
+ if(!gGLManager.mDebugGPU)
+ {
+ return ;
+ }
+
+ if(MEMORY_CHECK_INTERVAL > mMemCheckTimer.getElapsedTimeF32())
+ {
+ return ;
+ }
+ mMemCheckTimer.reset() ;
+
+ //update the availability of memory
+ LLMemory::updateMemoryInfo() ;
+
+ bool is_low = LLMemory::isMemoryPoolLow() ;
+
+ LLPipeline::throttleNewMemoryAllocation(is_low) ;
+
+ if(is_low)
+ {
+ LLMemory::logMemoryInfo() ;
+ }
+}
+
static LLFastTimer::DeclareTimer FTM_MESSAGES("System Messages");
static LLFastTimer::DeclareTimer FTM_SLEEP("Sleep");
static LLFastTimer::DeclareTimer FTM_TEXTURE_CACHE("Texture Cache");
@@ -981,14 +1150,14 @@ bool LLAppViewer::mainLoop()
gServicePump = new LLPumpIO(gAPRPoolp);
LLHTTPClient::setPump(*gServicePump);
LLCurl::setCAFile(gDirUtilp->getCAFile());
-
+
// Note: this is where gLocalSpeakerMgr and gActiveSpeakerMgr used to be instantiated.
LLVoiceChannel::initClass();
LLVoiceClient::getInstance()->init(gServicePump);
+ LLVoiceChannel::setCurrentVoiceChannelChangedCallback(boost::bind(&LLCallFloater::sOnCurrentChannelChanged, _1), true);
LLTimer frameTimer,idleTimer;
LLTimer debugTime;
- LLFrameTimer memCheckTimer;
LLViewerJoystick* joystick(LLViewerJoystick::getInstance());
joystick->setNeedsReset(true);
@@ -999,7 +1168,9 @@ bool LLAppViewer::mainLoop()
// point of posting.
LLSD newFrame;
- const F32 memory_check_interval = 1.0f ; //second
+ //LLPrivateMemoryPoolTester::getInstance()->run(false) ;
+ //LLPrivateMemoryPoolTester::getInstance()->run(true) ;
+ //LLPrivateMemoryPoolTester::destroy() ;
// Handle messages
while (!LLApp::isExiting())
@@ -1010,18 +1181,8 @@ bool LLAppViewer::mainLoop()
llclearcallstacks;
//check memory availability information
- {
- if(memory_check_interval < memCheckTimer.getElapsedTimeF32())
- {
- memCheckTimer.reset() ;
-
- //update the availability of memory
- LLMemoryInfo::getAvailableMemoryKB(mAvailPhysicalMemInKB, mAvailVirtualMemInKB) ;
- }
- llcallstacks << "Available physical mem(KB): " << mAvailPhysicalMemInKB << llcallstacksendl ;
- llcallstacks << "Available virtual mem(KB): " << mAvailVirtualMemInKB << llcallstacksendl ;
- }
-
+ checkMemory() ;
+
try
{
pingMainloopTimeout("Main:MiscNativeWindowEvents");
@@ -1029,7 +1190,7 @@ bool LLAppViewer::mainLoop()
if (gViewerWindow)
{
LLFastTimer t2(FTM_MESSAGES);
- gViewerWindow->mWindow->processMiscNativeEvents();
+ gViewerWindow->getWindow()->processMiscNativeEvents();
}
pingMainloopTimeout("Main:GatherInput");
@@ -1042,7 +1203,7 @@ bool LLAppViewer::mainLoop()
llwarns << " Someone took over my signal/exception handler (post messagehandling)!" << llendl;
}
- gViewerWindow->mWindow->gatherInput();
+ gViewerWindow->getWindow()->gatherInput();
}
#if 1 && !LL_RELEASE_FOR_DOWNLOAD
@@ -1071,11 +1232,11 @@ bool LLAppViewer::mainLoop()
// Scan keyboard for movement keys. Command keys and typing
// are handled by windows callbacks. Don't do this until we're
// done initializing. JC
- if (gViewerWindow->mWindow->getVisible()
+ if ((gHeadlessClient || gViewerWindow->getWindow()->getVisible())
&& gViewerWindow->getActive()
- && !gViewerWindow->mWindow->getMinimized()
+ && !gViewerWindow->getWindow()->getMinimized()
&& LLStartUp::getStartupState() == STATE_STARTED
- && !gViewerWindow->getShowProgress()
+ && (gHeadlessClient || !gViewerWindow->getShowProgress())
&& !gFocusMgr.focusLocked())
{
LLMemType mjk(LLMemType::MTYPE_JOY_KEY);
@@ -1123,7 +1284,8 @@ bool LLAppViewer::mainLoop()
}
// Render scene.
- if (!LLApp::isExiting())
+ // *TODO: Should we run display() even during gHeadlessClient? DK 2011-02-18
+ if (!LLApp::isExiting() && !gHeadlessClient)
{
pingMainloopTimeout("Main:Display");
gGLActive = TRUE;
@@ -1151,8 +1313,7 @@ bool LLAppViewer::mainLoop()
}
// yield cooperatively when not running as foreground window
- if ( gNoRender
- || (gViewerWindow && !gViewerWindow->mWindow->getVisible())
+ if ( (gViewerWindow && !gViewerWindow->getWindow()->getVisible())
|| !gFocusMgr.getAppHasFocus())
{
// Sleep if we're not rendering, or the window is minimized.
@@ -1185,22 +1346,24 @@ bool LLAppViewer::mainLoop()
idleTimer.reset();
bool is_slow = (frameTimer.getElapsedTimeF64() > FRAME_SLOW_THRESHOLD) ;
S32 total_work_pending = 0;
- S32 total_io_pending = 0;
+ S32 total_io_pending = 0;
while(!is_slow)//do not unpause threads if the frame rates are very low.
{
S32 work_pending = 0;
S32 io_pending = 0;
+ F32 max_time = llmin(gFrameIntervalSeconds*10.f, 1.f);
+
{
LLFastTimer ftm(FTM_TEXTURE_CACHE);
- work_pending += LLAppViewer::getTextureCache()->update(1); // unpauses the texture cache thread
+ work_pending += LLAppViewer::getTextureCache()->update(max_time); // unpauses the texture cache thread
}
{
LLFastTimer ftm(FTM_DECODE);
- work_pending += LLAppViewer::getImageDecodeThread()->update(1); // unpauses the image thread
+ work_pending += LLAppViewer::getImageDecodeThread()->update(max_time); // unpauses the image thread
}
{
LLFastTimer ftm(FTM_DECODE);
- work_pending += LLAppViewer::getTextureFetch()->update(1); // unpauses the texture fetch thread
+ work_pending += LLAppViewer::getTextureFetch()->update(max_time); // unpauses the texture fetch thread
}
{
@@ -1225,6 +1388,12 @@ bool LLAppViewer::mainLoop()
break;
}
}
+ gMeshRepo.update() ;
+
+ if(!LLCurl::getCurlThread()->update(1))
+ {
+ LLCurl::getCurlThread()->pause() ; //nothing in the curl thread.
+ }
if(!total_work_pending) //pause texture fetching threads if nothing to process.
{
@@ -1248,19 +1417,11 @@ bool LLAppViewer::mainLoop()
resumeMainloopTimeout();
pingMainloopTimeout("Main:End");
- }
+ }
}
catch(std::bad_alloc)
{
- {
- llinfos << "Availabe physical memory(KB) at the beginning of the frame: " << mAvailPhysicalMemInKB << llendl ;
- llinfos << "Availabe virtual memory(KB) at the beginning of the frame: " << mAvailVirtualMemInKB << llendl ;
-
- LLMemoryInfo::getAvailableMemoryKB(mAvailPhysicalMemInKB, mAvailVirtualMemInKB) ;
-
- llinfos << "Current availabe physical memory(KB): " << mAvailPhysicalMemInKB << llendl ;
- llinfos << "Current availabe virtual memory(KB): " << mAvailVirtualMemInKB << llendl ;
- }
+ LLMemory::logMemoryInfo(TRUE) ;
//stop memory leaking simulation
LLFloaterMemLeak* mem_leak_instance =
@@ -1310,11 +1471,43 @@ bool LLAppViewer::mainLoop()
return true;
}
+void LLAppViewer::flushVFSIO()
+{
+ while (1)
+ {
+ S32 pending = LLVFSThread::updateClass(0);
+ pending += LLLFSThread::updateClass(0);
+ if (!pending)
+ {
+ break;
+ }
+ llinfos << "Waiting for pending IO to finish: " << pending << llendflush;
+ ms_sleep(100);
+ }
+}
+
bool LLAppViewer::cleanup()
{
+ //ditch LLVOAvatarSelf instance
+ gAgentAvatarp = NULL;
+
// workaround for DEV-35406 crash on shutdown
LLEventPumps::instance().reset();
+ if (LLFastTimerView::sAnalyzePerformance)
+ {
+ llinfos << "Analyzing performance" << llendl;
+ std::string baseline_name = LLFastTimer::sLogName + "_baseline.slp";
+ std::string current_name = LLFastTimer::sLogName + ".slp";
+ std::string report_name = LLFastTimer::sLogName + "_report.csv";
+
+ LLFastTimerView::doAnalysis(
+ gDirUtilp->getExpandedFilename(LL_PATH_LOGS, baseline_name),
+ gDirUtilp->getExpandedFilename(LL_PATH_LOGS, current_name),
+ gDirUtilp->getExpandedFilename(LL_PATH_LOGS, report_name));
+ }
+ LLMetricPerformanceTesterBasic::cleanClass();
+
// remove any old breakpad minidump files from the log directory
if (! isError())
{
@@ -1335,16 +1528,6 @@ bool LLAppViewer::cleanup()
}
mPlugins.clear();
- //----------------------------------------------
- //this test code will be removed after the test
- //test manual call stack tracer
- if(gSavedSettings.getBOOL("QAMode"))
- {
- LLError::LLCallStacks::print() ;
- }
- //end of the test code
- //----------------------------------------------
-
//flag all elements as needing to be destroyed immediately
// to ensure shutdown order
LLMortician::setZealous(TRUE);
@@ -1363,6 +1546,9 @@ bool LLAppViewer::cleanup()
llinfos << "Cleaning Up" << llendflush;
+ // shut down mesh streamer
+ gMeshRepo.shutdown();
+
// Must clean up texture references before viewer window is destroyed.
if(LLHUDManager::instanceExists())
{
@@ -1398,7 +1584,9 @@ bool LLAppViewer::cleanup()
// Note: this is where gLocalSpeakerMgr and gActiveSpeakerMgr used to be deleted.
LLWorldMap::getInstance()->reset(); // release any images
-
+
+ LLCalc::cleanUp();
+
llinfos << "Global stuff deleted" << llendflush;
if (gAudiop)
@@ -1449,17 +1637,7 @@ bool LLAppViewer::cleanup()
llinfos << "Cache files removed" << llendflush;
// Wait for any pending VFS IO
- while (1)
- {
- S32 pending = LLVFSThread::updateClass(0);
- pending += LLLFSThread::updateClass(0);
- if (!pending)
- {
- break;
- }
- llinfos << "Waiting for pending IO to finish: " << pending << llendflush;
- ms_sleep(100);
- }
+ flushVFSIO();
llinfos << "Shutting down Views" << llendflush;
// Destroy the UI
@@ -1505,9 +1683,7 @@ bool LLAppViewer::cleanup()
llinfos << "Cleaning up Objects" << llendflush;
LLViewerObject::cleanupVOClasses();
-
- LLWaterParamManager::cleanupClass();
- LLWLParamManager::cleanupClass();
+
LLPostProcess::cleanupClass();
LLTracker::cleanupInstance();
@@ -1567,16 +1743,19 @@ bool LLAppViewer::cleanup()
{
llinfos << "Not saving per-account settings; don't know the account name yet." << llendl;
}
+ // Only save per account settings if the previous login succeeded, otherwise
+ // we might end up with a cleared out settings file in case a previous login
+ // failed after loading per account settings.
+ else if (!mSavePerAccountSettings)
+ {
+ llinfos << "Not saving per-account settings; last login was not successful." << llendl;
+ }
else
{
gSavedPerAccountSettings.saveToFile(gSavedSettings.getString("PerAccountSettingsFile"), TRUE);
llinfos << "Saved settings" << llendflush;
}
- std::string crash_settings_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE);
- // save all settings, even if equals defaults
- gCrashSettings.saveToFile(crash_settings_filename, FALSE);
-
std::string warnings_settings_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, getSettingsFilename("Default", "Warnings"));
gWarningSettings.saveToFile(warnings_settings_filename, TRUE);
@@ -1620,6 +1799,7 @@ bool LLAppViewer::cleanup()
pending += LLAppViewer::getTextureFetch()->update(1); // unpauses the texture fetch thread
pending += LLVFSThread::updateClass(0);
pending += LLLFSThread::updateClass(0);
+ pending += LLCurl::getCurlThread()->update(1) ;
F64 idle_time = idleTimer.getElapsedTimeF64();
if(!pending)
{
@@ -1631,16 +1811,19 @@ bool LLAppViewer::cleanup()
break;
}
}
+ LLCurl::getCurlThread()->pause() ;
// Delete workers first
// shotdown all worker threads before deleting them in case of co-dependencies
- sTextureCache->shutdown();
sTextureFetch->shutdown();
+ sTextureCache->shutdown();
sImageDecodeThread->shutdown();
sTextureFetch->shutDownTextureCacheThread() ;
sTextureFetch->shutDownImageDecodeThread() ;
+ LLFilePickerThread::cleanupClass();
+
delete sTextureCache;
sTextureCache = NULL;
delete sTextureFetch;
@@ -1662,9 +1845,14 @@ bool LLAppViewer::cleanup()
gDirUtilp->getExpandedFilename(LL_PATH_LOGS, baseline_name),
gDirUtilp->getExpandedFilename(LL_PATH_LOGS, current_name),
gDirUtilp->getExpandedFilename(LL_PATH_LOGS, report_name));
- }
+ }
+
LLMetricPerformanceTesterBasic::cleanClass() ;
+#if LL_RECORD_VIEWER_STATS
+ LLViewerStatsRecorder::cleanupClass();
+#endif
+
llinfos << "Cleaning up Media and Textures" << llendflush;
//Note:
@@ -1699,10 +1887,11 @@ bool LLAppViewer::cleanup()
gSavedSettings.cleanup();
LLUIColorTable::instance().clear();
- gCrashSettings.cleanup();
LLWatchdog::getInstance()->cleanup();
+ LLViewerAssetStatsFF::cleanup();
+
llinfos << "Shutting down message system" << llendflush;
end_messaging_system();
@@ -1725,11 +1914,18 @@ bool LLAppViewer::cleanup()
LLWeb::loadURLExternal( gLaunchFileOnQuit, false );
llinfos << "File launched." << llendflush;
}
+ llinfos << "Cleaning up LLProxy." << llendl;
+ LLProxy::cleanupClass();
LLMainLoopRepeater::instance().stop();
+ //release all private memory pools.
+ LLPrivateMemoryPoolManager::destroyClass() ;
+
ll_close_fail_log();
+ MEM_TRACK_RELEASE
+
llinfos << "Goodbye!" << llendflush;
// return 0;
@@ -1763,14 +1959,18 @@ bool LLAppViewer::initThreads()
static const bool enable_threads = true;
#endif
+ LLImage::initClass();
+
LLVFSThread::initClass(enable_threads && false);
LLLFSThread::initClass(enable_threads && false);
// Image decoding
LLAppViewer::sImageDecodeThread = new LLImageDecodeThread(enable_threads && true);
LLAppViewer::sTextureCache = new LLTextureCache(enable_threads && true);
- LLAppViewer::sTextureFetch = new LLTextureFetch(LLAppViewer::getTextureCache(), sImageDecodeThread, enable_threads && true);
- LLImage::initClass();
+ LLAppViewer::sTextureFetch = new LLTextureFetch(LLAppViewer::getTextureCache(),
+ sImageDecodeThread,
+ enable_threads && true,
+ app_metrics_qa_mode);
if (LLFastTimer::sLog || LLFastTimer::sMetricLog)
{
@@ -1779,6 +1979,11 @@ bool LLAppViewer::initThreads()
mFastTimerLogThread->start();
}
+ // Mesh streaming and caching
+ gMeshRepo.init();
+
+ LLFilePickerThread::initClass();
+
// *FIX: no error handling here!
return true;
}
@@ -1825,85 +2030,78 @@ bool LLAppViewer::initLogging()
bool LLAppViewer::loadSettingsFromDirectory(const std::string& location_key,
bool set_defaults)
{
- // Find and vet the location key.
- if(!mSettingsLocationList.has(location_key))
+ if (!mSettingsLocationList)
{
- llerrs << "Requested unknown location: " << location_key << llendl;
- return false;
+ llerrs << "Invalid settings location list" << llendl;
}
- LLSD location = mSettingsLocationList.get(location_key);
-
- if(!location.has("PathIndex"))
- {
- llerrs << "Settings location is missing PathIndex value. Settings cannot be loaded." << llendl;
- return false;
- }
- ELLPath path_index = (ELLPath)(location.get("PathIndex").asInteger());
- if(path_index <= LL_PATH_NONE || path_index >= LL_PATH_LAST)
+ BOOST_FOREACH(const SettingsGroup& group, mSettingsLocationList->groups)
{
- llerrs << "Out of range path index in app_settings/settings_files.xml" << llendl;
- return false;
- }
-
- // Iterate through the locations list of files.
- LLSD files = location.get("Files");
- for(LLSD::map_iterator itr = files.beginMap(); itr != files.endMap(); ++itr)
- {
- std::string settings_group = (*itr).first;
- llinfos << "Attempting to load settings for the group " << settings_group
- << " - from location " << location_key << llendl;
+ // skip settings groups that aren't the one we requested
+ if (group.name() != location_key) continue;
- if(!LLControlGroup::getInstance(settings_group))
+ ELLPath path_index = (ELLPath)group.path_index();
+ if(path_index <= LL_PATH_NONE || path_index >= LL_PATH_LAST)
{
- llwarns << "No matching settings group for name " << settings_group << llendl;
- continue;
+ llerrs << "Out of range path index in app_settings/settings_files.xml" << llendl;
+ return false;
}
- LLSD file = (*itr).second;
-
- std::string full_settings_path;
- if(file.has("NameFromSetting"))
+ BOOST_FOREACH(const SettingsFile& file, group.files)
{
- std::string custom_name_setting = file.get("NameFromSetting");
- // *NOTE: Regardless of the group currently being lodaed,
- // this setting is always read from the Global settings.
- if(LLControlGroup::getInstance(sGlobalSettingsName)->controlExists(custom_name_setting))
+ llinfos << "Attempting to load settings for the group " << file.name()
+ << " - from location " << location_key << llendl;
+
+ LLControlGroup* settings_group = LLControlGroup::getInstance(file.name);
+ if(!settings_group)
{
- std::string file_name =
- LLControlGroup::getInstance(sGlobalSettingsName)->getString(custom_name_setting);
- full_settings_path = file_name;
+ llwarns << "No matching settings group for name " << file.name() << llendl;
+ continue;
}
- }
- if(full_settings_path.empty())
- {
- std::string file_name = file.get("Name");
- full_settings_path = gDirUtilp->getExpandedFilename(path_index, file_name);
- }
+ std::string full_settings_path;
- int requirement = 0;
- if(file.has("Requirement"))
- {
- requirement = file.get("Requirement").asInteger();
- }
-
- if(!LLControlGroup::getInstance(settings_group)->loadFromFile(full_settings_path, set_defaults))
- {
- if(requirement == 1)
+ if (file.file_name_setting.isProvided()
+ && gSavedSettings.controlExists(file.file_name_setting))
{
- llwarns << "Error: Cannot load required settings file from: "
- << full_settings_path << llendl;
- return false;
+ // try to find filename stored in file_name_setting control
+ full_settings_path = gSavedSettings.getString(file.file_name_setting);
+ if (full_settings_path.empty())
+ {
+ continue;
+ }
+ else if (!gDirUtilp->fileExists(full_settings_path))
+ {
+ // search in default path
+ full_settings_path = gDirUtilp->getExpandedFilename((ELLPath)path_index, full_settings_path);
+ }
}
else
{
- llinfos << "Cannot load " << full_settings_path << " - No settings found." << llendl;
+ // by default, use specified file name
+ full_settings_path = gDirUtilp->getExpandedFilename((ELLPath)path_index, file.file_name());
+ }
+
+ if(settings_group->loadFromFile(full_settings_path, set_defaults, file.persistent))
+ { // success!
+ llinfos << "Loaded settings file " << full_settings_path << llendl;
+ }
+ else
+ { // failed to load
+ if(file.required)
+ {
+ llerrs << "Error: Cannot load required settings file from: " << full_settings_path << llendl;
+ return false;
+ }
+ else
+ {
+ // only complain if we actually have a filename at this point
+ if (!full_settings_path.empty())
+ {
+ llinfos << "Cannot load " << full_settings_path << " - No settings found." << llendl;
+ }
+ }
}
- }
- else
- {
- llinfos << "Loaded settings file " << full_settings_path << llendl;
}
}
@@ -1913,18 +2111,20 @@ bool LLAppViewer::loadSettingsFromDirectory(const std::string& location_key,
std::string LLAppViewer::getSettingsFilename(const std::string& location_key,
const std::string& file)
{
- if(mSettingsLocationList.has(location_key))
+ BOOST_FOREACH(const SettingsGroup& group, mSettingsLocationList->groups)
{
- LLSD location = mSettingsLocationList.get(location_key);
- if(location.has("Files"))
+ if (group.name() == location_key)
{
- LLSD files = location.get("Files");
- if(files.has(file) && files[file].has("Name"))
+ BOOST_FOREACH(const SettingsFile& settings_file, group.files)
{
- return files.get(file).get("Name").asString();
+ if (settings_file.name() == file)
+ {
+ return settings_file.file_name;
+ }
}
}
}
+
return std::string();
}
@@ -1937,14 +2137,29 @@ bool LLAppViewer::initConfiguration()
{
//Load settings files list
std::string settings_file_list = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "settings_files.xml");
- LLControlGroup settings_control("SettingsFiles");
- llinfos << "Loading settings file list " << settings_file_list << llendl;
- if (0 == settings_control.loadFromFile(settings_file_list))
+ //LLControlGroup settings_control("SettingsFiles");
+ //llinfos << "Loading settings file list " << settings_file_list << llendl;
+ //if (0 == settings_control.loadFromFile(settings_file_list))
+ //{
+ // llerrs << "Cannot load default configuration file " << settings_file_list << llendl;
+ //}
+
+ LLXMLNodePtr root;
+ BOOL success = LLXMLNode::parseFile(settings_file_list, root, NULL);
+ if (!success)
{
llerrs << "Cannot load default configuration file " << settings_file_list << llendl;
}
- mSettingsLocationList = settings_control.getLLSD("Locations");
+ mSettingsLocationList = new SettingsFiles();
+
+ LLXUIParser parser;
+ parser.readXUI(root, *mSettingsLocationList, settings_file_list);
+
+ if (!mSettingsLocationList->validateBlock())
+ {
+ llerrs << "Invalid settings file list " << settings_file_list << llendl;
+ }
// The settings and command line parsing have a fragile
// order-of-operation:
@@ -1974,6 +2189,8 @@ bool LLAppViewer::initConfiguration()
gSavedSettings.setString("ClientSettingsFile",
gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, getSettingsFilename("Default", "Global")));
+ gSavedSettings.setString("VersionChannelName", LLVersionInfo::getChannel());
+
#ifndef LL_RELEASE_FOR_DOWNLOAD
// provide developer build only overrides for these control variables that are not
// persisted to settings.xml
@@ -1994,8 +2211,6 @@ bool LLAppViewer::initConfiguration()
gSavedSettings.setS32("WatchdogEnabled", 0);
#endif
- gCrashSettings.getControl(CRASH_BEHAVIOR_SETTING)->getSignal()->connect(boost::bind(&handleCrashSubmitBehaviorChanged, _2));
-
// These are warnings that appear on the first experience of that condition.
// They are already set in the settings_default.xml file, but still need to be added to LLFirstUse
// for disable/reset ability
@@ -2053,6 +2268,32 @@ bool LLAppViewer::initConfiguration()
// - load overrides from user_settings
loadSettingsFromDirectory("User");
+
+ if (gSavedSettings.getBOOL("FirstRunThisInstall"))
+ {
+ // Note that the "FirstRunThisInstall" settings is currently unused.
+ gSavedSettings.setBOOL("FirstRunThisInstall", FALSE);
+ }
+
+ if (clp.hasOption("sessionsettings"))
+ {
+ std::string session_settings_filename = clp.getOption("sessionsettings")[0];
+ gSavedSettings.setString("SessionSettingsFile", session_settings_filename);
+ llinfos << "Using session settings filename: "
+ << session_settings_filename << llendl;
+ }
+ loadSettingsFromDirectory("Session");
+
+ if (clp.hasOption("usersessionsettings"))
+ {
+ std::string user_session_settings_filename = clp.getOption("usersessionsettings")[0];
+ gSavedSettings.setString("UserSessionSettingsFile", user_session_settings_filename);
+ llinfos << "Using user session settings filename: "
+ << user_session_settings_filename << llendl;
+
+ }
+ loadSettingsFromDirectory("UserSession");
+
// - apply command line settings
clp.notify();
@@ -2100,15 +2341,33 @@ bool LLAppViewer::initConfiguration()
{
const std::string& name = *itr;
const std::string& value = *(++itr);
- LLControlVariable* c = LLControlGroup::getInstance(sGlobalSettingsName)->getControl(name);
- if(c)
+ std::string name_part;
+ std::string group_part;
+ LLControlVariable* control = NULL;
+
+ // Name can be further split into ControlGroup.Name, with the default control group being Global
+ size_t pos = name.find('.');
+ if (pos != std::string::npos)
+ {
+ group_part = name.substr(0, pos);
+ name_part = name.substr(pos+1);
+ llinfos << "Setting " << group_part << "." << name_part << " to " << value << llendl;
+ LLControlGroup* g = LLControlGroup::getInstance(group_part);
+ if (g) control = g->getControl(name_part);
+ }
+ else
+ {
+ llinfos << "Setting Global." << name << " to " << value << llendl;
+ control = gSavedSettings.getControl(name);
+ }
+
+ if (control)
{
- c->setValue(value, false);
+ control->setValue(value, false);
}
else
{
- llwarns << "'--set' specified with unknown setting: '"
- << name << "'." << llendl;
+ llwarns << "Failed --set " << name << ": setting name unknown." << llendl;
}
}
}
@@ -2118,7 +2377,6 @@ bool LLAppViewer::initConfiguration()
{
LLVersionInfo::resetChannel(clp.getOption("channel")[0]);
}
-
// If we have specified crash on startup, set the global so we'll trigger the crash at the right time
if(clp.hasOption("crashonstartup"))
@@ -2129,12 +2387,12 @@ bool LLAppViewer::initConfiguration()
if (clp.hasOption("logperformance"))
{
LLFastTimer::sLog = TRUE;
- LLFastTimer::sLogName = std::string("performance");
+ LLFastTimer::sLogName = std::string("performance");
}
if (clp.hasOption("logmetrics"))
- {
- LLFastTimer::sMetricLog = TRUE ;
+ {
+ LLFastTimer::sMetricLog = TRUE ;
// '--logmetrics' can be specified with a named test metric argument so the data gathering is done only on that test
// In the absence of argument, every metric is gathered (makes for a rather slow run and hard to decipher report...)
std::string test_name = clp.getOption("logmetrics")[0];
@@ -2148,7 +2406,7 @@ bool LLAppViewer::initConfiguration()
{
LLFastTimer::sLogName = test_name;
}
- }
+ }
if (clp.hasOption("graphicslevel"))
{
@@ -2191,12 +2449,12 @@ bool LLAppViewer::initConfiguration()
if (clp.hasOption("replaysession"))
{
- LLAgentPilot::sReplaySession = TRUE;
+ gAgentPilot.setReplaySession(TRUE);
}
if (clp.hasOption("nonotifications"))
{
- gSavedSettings.setBOOL("IgnoreAllNotifications", TRUE);
+ gSavedSettings.getControl("IgnoreAllNotifications")->setValue(true, false);
}
if (clp.hasOption("debugsession"))
@@ -2243,8 +2501,8 @@ bool LLAppViewer::initConfiguration()
if(skinfolder && LLStringUtil::null != skinfolder->getValue().asString())
{
// hack to force the skin to default.
- //gDirUtilp->setSkinFolder(skinfolder->getValue().asString());
- gDirUtilp->setSkinFolder("default");
+ gDirUtilp->setSkinFolder(skinfolder->getValue().asString());
+ //gDirUtilp->setSkinFolder("default");
}
mYieldTime = gSavedSettings.getS32("YieldTime");
@@ -2318,7 +2576,8 @@ bool LLAppViewer::initConfiguration()
// it relies on checking a marker file which will not work when running
// out of different directories
- if (LLStartUp::getStartSLURL().isValid())
+ if (LLStartUp::getStartSLURL().isValid() &&
+ (gSavedSettings.getBOOL("SLURLPassToOtherInstance")))
{
if (sendURLToOtherInstance(LLStartUp::getStartSLURL().getSLURLString()))
{
@@ -2327,6 +2586,14 @@ bool LLAppViewer::initConfiguration()
}
}
+ // If automatic login from command line with --login switch
+ // init StartSLURL location. In interactive login, LLPanelLogin
+ // will take care of it.
+ if ((clp.hasOption("login") || clp.hasOption("autologin")) && !clp.hasOption("url") && !clp.hasOption("slurl"))
+ {
+ LLStartUp::setStartSLURL(LLSLURL(gSavedSettings.getString("LoginLocation")));
+ }
+
if (!gSavedSettings.getBOOL("AllowMultipleViewers"))
{
//
@@ -2389,26 +2656,128 @@ bool LLAppViewer::initConfiguration()
}
namespace {
- // *TODO - decide if there's a better place for this function.
- // do we need a file llupdaterui.cpp or something? -brad
- bool notify_update(LLSD const & evt)
- {
+ // *TODO - decide if there's a better place for these functions.
+ // do we need a file llupdaterui.cpp or something? -brad
+
+ void apply_update_callback(LLSD const & notification, LLSD const & response)
+ {
+ lldebugs << "LLUpdate user response: " << response << llendl;
+ if(response["OK_okcancelbuttons"].asBoolean())
+ {
+ llinfos << "LLUpdate restarting viewer" << llendl;
+ static const bool install_if_ready = true;
+ // *HACK - this lets us launch the installer immediately for now
+ LLUpdaterService().startChecking(install_if_ready);
+ }
+ }
+
+ void apply_update_ok_callback(LLSD const & notification, LLSD const & response)
+ {
+ llinfos << "LLUpdate restarting viewer" << llendl;
+ static const bool install_if_ready = true;
+ // *HACK - this lets us launch the installer immediately for now
+ LLUpdaterService().startChecking(install_if_ready);
+ }
+
+ void on_update_downloaded(LLSD const & data)
+ {
+ std::string notification_name;
+ void (*apply_callback)(LLSD const &, LLSD const &) = NULL;
+
+ if(data["required"].asBoolean())
+ {
+ if(LLStartUp::getStartupState() <= STATE_LOGIN_WAIT)
+ {
+ // The user never saw the progress bar.
+ apply_callback = &apply_update_ok_callback;
+ notification_name = "RequiredUpdateDownloadedVerboseDialog";
+ }
+ else if(LLStartUp::getStartupState() < STATE_WORLD_INIT)
+ {
+ // The user is logging in but blocked.
+ apply_callback = &apply_update_ok_callback;
+ notification_name = "RequiredUpdateDownloadedDialog";
+ }
+ else
+ {
+ // The user is already logged in; treat like an optional update.
+ apply_callback = &apply_update_callback;
+ notification_name = "DownloadBackgroundTip";
+ }
+ }
+ else
+ {
+ apply_callback = &apply_update_callback;
+ if(LLStartUp::getStartupState() < STATE_STARTED)
+ {
+ // CHOP-262 we need to use a different notification
+ // method prior to login.
+ notification_name = "DownloadBackgroundDialog";
+ }
+ else
+ {
+ notification_name = "DownloadBackgroundTip";
+ }
+ }
+
+ LLSD substitutions;
+ substitutions["VERSION"] = data["version"];
+
+ // truncate version at the rightmost '.'
+ std::string version_short(data["version"]);
+ size_t short_length = version_short.rfind('.');
+ if (short_length != std::string::npos)
+ {
+ version_short.resize(short_length);
+ }
+
+ LLUIString relnotes_url("[RELEASE_NOTES_BASE_URL][CHANNEL_URL]/[VERSION_SHORT]");
+ relnotes_url.setArg("[VERSION_SHORT]", version_short);
+
+ // *TODO thread the update service's response through to this point
+ std::string const & channel = LLVersionInfo::getChannel();
+ boost::shared_ptr<char> channel_escaped(curl_escape(channel.c_str(), channel.size()), &curl_free);
+
+ relnotes_url.setArg("[CHANNEL_URL]", channel_escaped.get());
+ relnotes_url.setArg("[RELEASE_NOTES_BASE_URL]", LLTrans::getString("RELEASE_NOTES_BASE_URL"));
+ substitutions["RELEASE_NOTES_FULL_URL"] = relnotes_url.getString();
+
+ LLNotificationsUtil::add(notification_name, substitutions, LLSD(), apply_callback);
+ }
+
+ void install_error_callback(LLSD const & notification, LLSD const & response)
+ {
+ LLAppViewer::instance()->forceQuit();
+ }
+
+ bool notify_update(LLSD const & evt)
+ {
+ std::string notification_name;
switch (evt["type"].asInteger())
{
case LLUpdaterService::DOWNLOAD_COMPLETE:
- LLNotificationsUtil::add("DownloadBackground");
+ on_update_downloaded(evt);
break;
case LLUpdaterService::INSTALL_ERROR:
- LLNotificationsUtil::add("FailedUpdateInstall");
+ if(evt["required"].asBoolean()) {
+ LLNotificationsUtil::add("FailedRequiredUpdateInstall", LLSD(), LLSD(), &install_error_callback);
+ } else {
+ LLNotificationsUtil::add("FailedUpdateInstall");
+ }
break;
default:
- llinfos << "unhandled update event " << evt << llendl;
break;
}
// let others also handle this event by default
- return false;
- }
+ return false;
+ }
+
+ bool on_bandwidth_throttle(LLUpdaterService * updater, LLSD const & evt)
+ {
+ updater->setBandwidthLimit(evt.asInteger() * (1024/8));
+ return false; // Let others receive this event.
+ };
};
void LLAppViewer::initUpdater()
@@ -2431,7 +2800,10 @@ void LLAppViewer::initUpdater()
channel,
version);
mUpdater->setCheckPeriod(check_period);
- if(gSavedSettings.getBOOL("UpdaterServiceActive"))
+ mUpdater->setBandwidthLimit((int)gSavedSettings.getF32("UpdaterMaximumBandwidth") * (1024/8));
+ gSavedSettings.getControl("UpdaterMaximumBandwidth")->getSignal()->
+ connect(boost::bind(&on_bandwidth_throttle, mUpdater.get(), _2));
+ if(gSavedSettings.getU32("UpdaterServiceSetting"))
{
bool install_if_ready = true;
mUpdater->startChecking(install_if_ready);
@@ -2443,47 +2815,29 @@ void LLAppViewer::initUpdater()
void LLAppViewer::checkForCrash(void)
{
-
#if LL_SEND_CRASH_REPORTS
if (gLastExecEvent == LAST_EXEC_FROZE)
{
- llinfos << "Last execution froze, requesting to send crash report." << llendl;
- //
- // Pop up a freeze or crash warning dialog
- //
- S32 choice;
- if(gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING) == CRASH_BEHAVIOR_ASK)
- {
- std::ostringstream msg;
- msg << LLTrans::getString("MBFrozenCrashed");
- std::string alert = LLTrans::getString("APP_NAME") + " " + LLTrans::getString("MBAlert");
- choice = OSMessageBox(msg.str(),
- alert,
- OSMB_YESNO);
- }
- else if(gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING) == CRASH_BEHAVIOR_NEVER_SEND)
- {
- choice = OSBTN_NO;
- }
- else
- {
- choice = OSBTN_YES;
- }
-
- if (OSBTN_YES == choice)
- {
- llinfos << "Sending crash report." << llendl;
+ llinfos << "Last execution froze, sending a crash report." << llendl;
- bool report_freeze = true;
- handleCrashReporting(report_freeze);
- }
- else
- {
- llinfos << "Not sending crash report." << llendl;
- }
+ bool report_freeze = true;
+ handleCrashReporting(report_freeze);
}
#endif // LL_SEND_CRASH_REPORTS
-
+}
+
+//
+// This function decides whether the client machine meets the minimum requirements to
+// run in a maximized window, per the consensus of davep, boa and nyx on 3/30/2011.
+//
+bool LLAppViewer::meetsRequirementsForMaximizedStart()
+{
+ bool maximizedOk = (LLFeatureManager::getInstance()->getGPUClass() >= GPU_CLASS_2);
+
+ const U32 one_gigabyte_kb = 1024 * 1024;
+ maximizedOk &= (gSysMemory.getPhysicalMemoryKB() >= one_gigabyte_kb);
+
+ return maximizedOk;
}
bool LLAppViewer::initWindow()
@@ -2491,21 +2845,33 @@ bool LLAppViewer::initWindow()
LL_INFOS("AppInit") << "Initializing window..." << LL_ENDL;
// store setting in a global for easy access and modification
- gNoRender = gSavedSettings.getBOOL("DisableRendering");
+ gHeadlessClient = gSavedSettings.getBOOL("HeadlessClient");
// always start windowed
BOOL ignorePixelDepth = gSavedSettings.getBOOL("IgnorePixelDepth");
- gViewerWindow = new LLViewerWindow(gWindowTitle,
- VIEWER_WINDOW_CLASSNAME,
- gSavedSettings.getS32("WindowX"), gSavedSettings.getS32("WindowY"),
- gSavedSettings.getS32("WindowWidth"), gSavedSettings.getS32("WindowHeight"),
- FALSE, ignorePixelDepth);
+
+ LLViewerWindow::Params window_params;
+ window_params
+ .title(gWindowTitle)
+ .name(VIEWER_WINDOW_CLASSNAME)
+ .x(gSavedSettings.getS32("WindowX"))
+ .y(gSavedSettings.getS32("WindowY"))
+ .width(gSavedSettings.getU32("WindowWidth"))
+ .height(gSavedSettings.getU32("WindowHeight"))
+ .min_width(gSavedSettings.getU32("MinWindowWidth"))
+ .min_height(gSavedSettings.getU32("MinWindowHeight"))
+ .fullscreen(gSavedSettings.getBOOL("FullScreen"))
+ .ignore_pixel_depth(ignorePixelDepth);
+
+ gViewerWindow = new LLViewerWindow(window_params);
+
+ LL_INFOS("AppInit") << "gViewerwindow created." << LL_ENDL;
// Need to load feature table before cheking to start watchdog.
- const S32 NEVER_SUBMIT_REPORT = 2;
bool use_watchdog = false;
int watchdog_enabled_setting = gSavedSettings.getS32("WatchdogEnabled");
- if(watchdog_enabled_setting == -1){
+ if (watchdog_enabled_setting == -1)
+ {
use_watchdog = !LLFeatureManager::getInstance()->isFeatureAvailable("WatchdogDisabled");
}
else
@@ -2514,41 +2880,40 @@ bool LLAppViewer::initWindow()
use_watchdog = bool(watchdog_enabled_setting);
}
- bool send_reports = gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING) != NEVER_SUBMIT_REPORT;
- if(use_watchdog && send_reports)
+ if (use_watchdog)
{
LLWatchdog::getInstance()->init(watchdog_killer_callback);
}
+ LL_INFOS("AppInit") << "watchdog setting is done." << LL_ENDL;
LLNotificationsUI::LLNotificationManager::getInstance();
if (gSavedSettings.getBOOL("WindowMaximized"))
{
- gViewerWindow->mWindow->maximize();
+ gViewerWindow->getWindow()->maximize();
}
- if (!gNoRender)
+ //
+ // Initialize GL stuff
+ //
+
+ if (mForceGraphicsDetail)
{
- //
- // Initialize GL stuff
- //
+ LLFeatureManager::getInstance()->setGraphicsLevel(gSavedSettings.getU32("RenderQualityPerformance"), false);
+ }
+
+ // Set this flag in case we crash while initializing GL
+ gSavedSettings.setBOOL("RenderInitError", TRUE);
+ gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile"), TRUE );
- if (mForceGraphicsDetail)
- {
- LLFeatureManager::getInstance()->setGraphicsLevel(gSavedSettings.getU32("RenderQualityPerformance"), false);
- }
-
- // Set this flag in case we crash while initializing GL
- gSavedSettings.setBOOL("RenderInitError", TRUE);
- gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile"), TRUE );
-
- gPipeline.init();
- stop_glerror();
- gViewerWindow->initGLDefaults();
+ gPipeline.init();
+ LL_INFOS("AppInit") << "gPipeline Initialized" << LL_ENDL;
- gSavedSettings.setBOOL("RenderInitError", FALSE);
- gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile"), TRUE );
- }
+ stop_glerror();
+ gViewerWindow->initGLDefaults();
+
+ gSavedSettings.setBOOL("RenderInitError", FALSE);
+ gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile"), TRUE );
//If we have a startup crash, it's usually near GL initialization, so simulate that.
if(gCrashOnStartup)
@@ -2556,6 +2921,21 @@ bool LLAppViewer::initWindow()
LLAppViewer::instance()->forceErrorLLError();
}
+ //
+ // Determine if the window should start maximized on initial run based
+ // on graphics capability
+ //
+ if (gSavedSettings.getBOOL("FirstLoginThisInstall") && meetsRequirementsForMaximizedStart())
+ {
+ LL_INFOS("AppInit") << "This client met the requirements for a maximized initial screen." << LL_ENDL;
+ gSavedSettings.setBOOL("WindowMaximized", TRUE);
+ }
+
+ if (gSavedSettings.getBOOL("WindowMaximized"))
+ {
+ gViewerWindow->getWindow()->maximize();
+ }
+
LLUI::sWindow = gViewerWindow->getWindow();
// Show watch cursor
@@ -2565,9 +2945,9 @@ bool LLAppViewer::initWindow()
gViewerWindow->initBase();
// show viewer window
- //gViewerWindow->mWindow->show();
+ //gViewerWindow->getWindow()->show();
-
+ LL_INFOS("AppInit") << "Window initialization done." << LL_ENDL;
return true;
}
@@ -2590,24 +2970,21 @@ void LLAppViewer::cleanupSavedSettings()
gSavedSettings.setBOOL("ShowObjectUpdates", gShowObjectUpdates);
- if (!gNoRender)
+ if (gDebugView)
{
- if (gDebugView)
- {
- gSavedSettings.setBOOL("ShowDebugConsole", gDebugView->mDebugConsolep->getVisible());
- }
+ gSavedSettings.setBOOL("ShowDebugConsole", gDebugView->mDebugConsolep->getVisible());
}
// save window position if not maximized
// as we don't track it in callbacks
if(NULL != gViewerWindow)
{
- BOOL maximized = gViewerWindow->mWindow->getMaximized();
+ BOOL maximized = gViewerWindow->getWindow()->getMaximized();
if (!maximized)
{
LLCoordScreen window_pos;
-
- if (gViewerWindow->mWindow->getPosition(&window_pos))
+
+ if (gViewerWindow->getWindow()->getPosition(&window_pos))
{
gSavedSettings.setS32("WindowX", window_pos.mX);
gSavedSettings.setS32("WindowY", window_pos.mY);
@@ -2696,6 +3073,8 @@ void LLAppViewer::writeSystemInfo()
LL_INFOS("SystemInfo") << "OS: " << getOSInfo().getOSStringSimple() << LL_ENDL;
LL_INFOS("SystemInfo") << "OS info: " << getOSInfo() << LL_ENDL;
+ LL_INFOS("SystemInfo") << "Timers: " << LLFastTimer::sClockType << LL_ENDL;
+
writeDebugInfo(); // Save out debug_info.log early, in case of crash.
}
@@ -2705,6 +3084,8 @@ void LLAppViewer::handleViewerCrash()
llinfos << "Last render pool type: " << LLPipeline::sCurRenderPoolType << llendl ;
+ LLMemory::logMemoryInfo(true) ;
+
//print out recorded call stacks if there are any.
LLError::LLCallStacks::print();
@@ -2858,8 +3239,10 @@ void LLAppViewer::handleViewerCrash()
pApp->removeMarkerFile(false);
}
+#if LL_SEND_CRASH_REPORTS
// Call to pure virtual, handled by platform specific llappviewer instance.
pApp->handleCrashReporting();
+#endif
return;
}
@@ -2916,35 +3299,32 @@ void LLAppViewer::initMarkerFile()
std::string llerror_marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, LLERROR_MARKER_FILE_NAME);
std::string error_marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, ERROR_MARKER_FILE_NAME);
-
if (LLAPRFile::isExist(mMarkerFileName, NULL, LL_APR_RB) && !anotherInstanceRunning())
{
gLastExecEvent = LAST_EXEC_FROZE;
LL_INFOS("MarkerFile") << "Exec marker found: program froze on previous execution" << LL_ENDL;
}
-
if(LLAPRFile::isExist(logout_marker_file, NULL, LL_APR_RB))
{
- LL_INFOS("MarkerFile") << "Last exec LLError crashed, setting LastExecEvent to " << LAST_EXEC_LLERROR_CRASH << LL_ENDL;
gLastExecEvent = LAST_EXEC_LOGOUT_FROZE;
+ LL_INFOS("MarkerFile") << "Last exec LLError crashed, setting LastExecEvent to " << gLastExecEvent << LL_ENDL;
+ LLAPRFile::remove(logout_marker_file);
}
if(LLAPRFile::isExist(llerror_marker_file, NULL, LL_APR_RB))
{
- llinfos << "Last exec LLError crashed, setting LastExecEvent to " << LAST_EXEC_LLERROR_CRASH << llendl;
if(gLastExecEvent == LAST_EXEC_LOGOUT_FROZE) gLastExecEvent = LAST_EXEC_LOGOUT_CRASH;
else gLastExecEvent = LAST_EXEC_LLERROR_CRASH;
+ LL_INFOS("MarkerFile") << "Last exec LLError crashed, setting LastExecEvent to " << gLastExecEvent << LL_ENDL;
+ LLAPRFile::remove(llerror_marker_file);
}
if(LLAPRFile::isExist(error_marker_file, NULL, LL_APR_RB))
{
- LL_INFOS("MarkerFile") << "Last exec crashed, setting LastExecEvent to " << LAST_EXEC_OTHER_CRASH << LL_ENDL;
if(gLastExecEvent == LAST_EXEC_LOGOUT_FROZE) gLastExecEvent = LAST_EXEC_LOGOUT_CRASH;
else gLastExecEvent = LAST_EXEC_OTHER_CRASH;
+ LL_INFOS("MarkerFile") << "Last exec crashed, setting LastExecEvent to " << gLastExecEvent << LL_ENDL;
+ LLAPRFile::remove(error_marker_file);
}
-
- LLAPRFile::remove(logout_marker_file);
- LLAPRFile::remove(llerror_marker_file);
- LLAPRFile::remove(error_marker_file);
-
+
// No new markers if another instance is running.
if(anotherInstanceRunning())
{
@@ -2994,6 +3374,23 @@ void LLAppViewer::forceQuit()
LLApp::setQuitting();
}
+//TODO: remove
+void LLAppViewer::fastQuit(S32 error_code)
+{
+ // finish pending transfers
+ flushVFSIO();
+ // let sim know we're logging out
+ sendLogoutRequest();
+ // flush network buffers by shutting down messaging system
+ end_messaging_system();
+ // figure out the error code
+ S32 final_error_code = error_code ? error_code : (S32)isError();
+ // this isn't a crash
+ removeMarkerFile();
+ // get outta here
+ _exit(final_error_code);
+}
+
void LLAppViewer::requestQuit()
{
llinfos << "requestQuit" << llendl;
@@ -3002,11 +3399,21 @@ void LLAppViewer::requestQuit()
if( (LLStartUp::getStartupState() < STATE_STARTED) || !region )
{
+ // If we have a region, make some attempt to send a logout request first.
+ // This prevents the halfway-logged-in avatar from hanging around inworld for a couple minutes.
+ if(region)
+ {
+ sendLogoutRequest();
+ }
+
// Quit immediately
forceQuit();
return;
}
+ // Try to send metrics back to the grid
+ metricsSend(!gDisconnected);
+
LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral*)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_POINT, TRUE);
effectp->setPositionGlobal(gAgent.getPositionGlobal());
effectp->setColor(LLColor4U(gAgent.getEffectColor()));
@@ -3021,8 +3428,6 @@ void LLAppViewer::requestQuit()
gFloaterView->closeAllChildren(true);
}
- LLSideTray::getInstance()->notifyChildren(LLSD().with("request","quit"));
-
send_stats();
gLogoutTimer.reset();
@@ -3043,7 +3448,7 @@ static LLNotificationFunctorRegistration finish_quit_reg("ConfirmQuit", finish_q
void LLAppViewer::userQuit()
{
- if (gDisconnected)
+ if (gDisconnected || gViewerWindow->getProgressView()->getVisible())
{
requestQuit();
}
@@ -3066,12 +3471,12 @@ void LLAppViewer::earlyExit(const std::string& name, const LLSD& substitutions)
LLNotificationsUtil::add(name, substitutions, LLSD(), finish_early_exit);
}
-void LLAppViewer::forceExit(S32 arg)
+// case where we need the viewer to exit without any need for notifications
+void LLAppViewer::earlyExitNoNotify()
{
- removeMarkerFile();
-
- // *FIX:Mani - This kind of exit hardly seems appropriate.
- exit(arg);
+ llwarns << "app_early_exit with no notification: " << llendl;
+ gDoDisconnect = TRUE;
+ finish_early_exit( LLSD(), LLSD() );
}
void LLAppViewer::abortQuit()
@@ -3114,8 +3519,10 @@ void LLAppViewer::migrateCacheDirectory()
// Migrate inventory cache to avoid pain to inventory database after mass update
S32 file_count = 0;
std::string file_name;
- std::string mask = delimiter + "*.*";
- while (gDirUtilp->getNextFileInDir(old_cache_dir, mask, file_name))
+ std::string mask = "*.*";
+
+ LLDirIterator iter(old_cache_dir, mask);
+ while (iter.next(file_name))
{
if (file_name == "." || file_name == "..") continue;
std::string source_path = old_cache_dir + delimiter + file_name;
@@ -3214,10 +3621,10 @@ bool LLAppViewer::initCache()
LLAppViewer::getTextureCache()->setReadOnly(read_only) ;
LLVOCache::getInstance()->setReadOnly(read_only);
- BOOL texture_cache_mismatch = FALSE ;
+ bool texture_cache_mismatch = false;
if (gSavedSettings.getS32("LocalCacheVersion") != LLAppViewer::getTextureCacheVersion())
{
- texture_cache_mismatch = TRUE ;
+ texture_cache_mismatch = true;
if(!read_only)
{
gSavedSettings.setS32("LocalCacheVersion", LLAppViewer::getTextureCacheVersion());
@@ -3231,7 +3638,9 @@ bool LLAppViewer::initCache()
gSavedSettings.getBOOL("PurgeCacheOnNextStartup"))
{
gSavedSettings.setBOOL("PurgeCacheOnNextStartup", false);
- mPurgeCache = true;
+ mPurgeCache = true;
+ // STORM-1141 force purgeAllTextures to get called to prevent a crash here. -brad
+ texture_cache_mismatch = true;
}
// We have moved the location of the cache directory over time.
@@ -3266,11 +3675,25 @@ bool LLAppViewer::initCache()
// Init the texture cache
// Allocate 80% of the cache size for textures
- const S32 MB = 1024*1024;
+ const S32 MB = 1024 * 1024;
+ const S64 MIN_CACHE_SIZE = 64 * MB;
+ const S64 MAX_CACHE_SIZE = 9984ll * MB;
+ const S64 MAX_VFS_SIZE = 1024 * MB; // 1 GB
+
S64 cache_size = (S64)(gSavedSettings.getU32("CacheSize")) * MB;
- const S64 MAX_CACHE_SIZE = 1024*MB;
- cache_size = llmin(cache_size, MAX_CACHE_SIZE);
- S64 texture_cache_size = ((cache_size * 8)/10);
+ cache_size = llclamp(cache_size, MIN_CACHE_SIZE, MAX_CACHE_SIZE);
+
+ S64 texture_cache_size = ((cache_size * 8) / 10);
+ S64 vfs_size = cache_size - texture_cache_size;
+
+ if (vfs_size > MAX_VFS_SIZE)
+ {
+ // Give the texture cache more space, since the VFS can't be bigger than 1GB.
+ // This happens when the user's CacheSize setting is greater than 5GB.
+ vfs_size = MAX_VFS_SIZE;
+ texture_cache_size = cache_size - MAX_VFS_SIZE;
+ }
+
S64 extra = LLAppViewer::getTextureCache()->initCache(LL_PATH_CACHE, texture_cache_size, texture_cache_mismatch);
texture_cache_size -= extra;
@@ -3279,21 +3702,19 @@ bool LLAppViewer::initCache()
LLSplashScreen::update(LLTrans::getString("StartupInitializingVFS"));
// Init the VFS
- S64 vfs_size = cache_size - texture_cache_size;
- const S64 MAX_VFS_SIZE = 1024 * MB; // 1 GB
- vfs_size = llmin(vfs_size, MAX_VFS_SIZE);
+ vfs_size = llmin(vfs_size + extra, MAX_VFS_SIZE);
vfs_size = (vfs_size / MB) * MB; // make sure it is MB aligned
U32 vfs_size_u32 = (U32)vfs_size;
U32 old_vfs_size = gSavedSettings.getU32("VFSOldSize") * MB;
bool resize_vfs = (vfs_size_u32 != old_vfs_size);
if (resize_vfs)
{
- gSavedSettings.setU32("VFSOldSize", vfs_size_u32/MB);
+ gSavedSettings.setU32("VFSOldSize", vfs_size_u32 / MB);
}
- LL_INFOS("AppCache") << "VFS CACHE SIZE: " << vfs_size/(1024*1024) << " MB" << LL_ENDL;
+ LL_INFOS("AppCache") << "VFS CACHE SIZE: " << vfs_size / (1024*1024) << " MB" << LL_ENDL;
// This has to happen BEFORE starting the vfs
- //time_t ltime;
+ // time_t ltime;
srand(time(NULL)); // Flawfinder: ignore
U32 old_salt = gSavedSettings.getU32("VFSSalt");
U32 new_salt;
@@ -3314,10 +3735,10 @@ bool LLAppViewer::initCache()
do
{
new_salt = rand();
- } while( new_salt == old_salt );
+ } while(new_salt == old_salt);
}
- old_vfs_data_file = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,VFS_DATA_FILE_BASE) + llformat("%u",old_salt);
+ old_vfs_data_file = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, VFS_DATA_FILE_BASE) + llformat("%u", old_salt);
// make sure this file exists
llstat s;
@@ -3326,15 +3747,15 @@ bool LLAppViewer::initCache()
{
// doesn't exist, look for a data file
std::string mask;
- mask = gDirUtilp->getDirDelimiter();
- mask += VFS_DATA_FILE_BASE;
+ mask = VFS_DATA_FILE_BASE;
mask += "*";
std::string dir;
- dir = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,"");
+ dir = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "");
std::string found_file;
- if (gDirUtilp->getNextFileInDir(dir, mask, found_file))
+ LLDirIterator iter(dir, mask);
+ if (iter.next(found_file))
{
old_vfs_data_file = dir + gDirUtilp->getDirDelimiter() + found_file;
@@ -3347,7 +3768,7 @@ bool LLAppViewer::initCache()
}
}
- old_vfs_index_file = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,VFS_INDEX_FILE_BASE) + llformat("%u",old_salt);
+ old_vfs_index_file = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, VFS_INDEX_FILE_BASE) + llformat("%u", old_salt);
stat_result = LLFile::stat(old_vfs_index_file, &s);
if (stat_result)
@@ -3360,27 +3781,25 @@ bool LLAppViewer::initCache()
// Just in case, nuke any other old cache files in the directory.
std::string dir;
- dir = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,"");
+ dir = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "");
std::string mask;
- mask = gDirUtilp->getDirDelimiter();
- mask += VFS_DATA_FILE_BASE;
+ mask = VFS_DATA_FILE_BASE;
mask += "*";
gDirUtilp->deleteFilesInDir(dir, mask);
- mask = gDirUtilp->getDirDelimiter();
- mask += VFS_INDEX_FILE_BASE;
+ mask = VFS_INDEX_FILE_BASE;
mask += "*";
gDirUtilp->deleteFilesInDir(dir, mask);
}
- new_vfs_data_file = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,VFS_DATA_FILE_BASE) + llformat("%u",new_salt);
- new_vfs_index_file = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, VFS_INDEX_FILE_BASE) + llformat("%u",new_salt);
+ new_vfs_data_file = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, VFS_DATA_FILE_BASE) + llformat("%u", new_salt);
+ new_vfs_index_file = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, VFS_INDEX_FILE_BASE) + llformat("%u", new_salt);
- static_vfs_data_file = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"static_data.db2");
- static_vfs_index_file = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"static_index.db2");
+ static_vfs_data_file = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "static_data.db2");
+ static_vfs_index_file = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "static_index.db2");
if (resize_vfs)
{
@@ -3403,19 +3822,19 @@ bool LLAppViewer::initCache()
// Don't remove VFS after viewer crashes. If user has corrupt data, they can reinstall. JC
gVFS = LLVFS::createLLVFS(new_vfs_index_file, new_vfs_data_file, false, vfs_size_u32, false);
- if( !gVFS )
+ if (!gVFS)
{
return false;
}
gStaticVFS = LLVFS::createLLVFS(static_vfs_index_file, static_vfs_data_file, true, 0, false);
- if( !gStaticVFS )
+ if (!gStaticVFS)
{
return false;
}
BOOL success = gVFS->isValid() && gStaticVFS->isValid();
- if( !success )
+ if (!success)
{
return false;
}
@@ -3434,13 +3853,18 @@ bool LLAppViewer::initCache()
}
}
+void LLAppViewer::addOnIdleCallback(const boost::function<void()>& cb)
+{
+ LLDeferredTaskList::instance().addTask(cb);
+}
+
void LLAppViewer::purgeCache()
{
- LL_INFOS("AppCache") << "Purging Cache and Texture Cache..." << llendl;
+ LL_INFOS("AppCache") << "Purging Cache and Texture Cache..." << LL_ENDL;
LLAppViewer::getTextureCache()->purgeCache(LL_PATH_CACHE);
LLVOCache::getInstance()->removeCache(LL_PATH_CACHE);
- std::string mask = gDirUtilp->getDirDelimiter() + "*.*";
- gDirUtilp->deleteFilesInDir(gDirUtilp->getExpandedFilename(LL_PATH_CACHE,""),mask);
+ std::string mask = "*.*";
+ gDirUtilp->deleteFilesInDir(gDirUtilp->getExpandedFilename(LL_PATH_CACHE, ""), mask);
}
std::string LLAppViewer::getSecondLifeTitle() const
@@ -3536,7 +3960,7 @@ void LLAppViewer::badNetworkHandler()
// is destroyed.
void LLAppViewer::saveFinalSnapshot()
{
- if (!mSavedFinalSnapshot && !gNoRender)
+ if (!mSavedFinalSnapshot)
{
gSavedSettings.setVector3d("FocusPosOnLogout", gAgentCamera.calcFocusPositionTargetGlobal());
gSavedSettings.setVector3d("CameraPosOnLogout", gAgentCamera.calcCameraPositionTargetGlobal());
@@ -3559,6 +3983,7 @@ void LLAppViewer::loadNameCache()
// display names cache
std::string filename =
gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "avatar_name_cache.xml");
+ LL_INFOS("AvNameCache") << filename << LL_ENDL;
llifstream name_cache_stream(filename);
if(name_cache_stream.is_open())
{
@@ -3616,12 +4041,16 @@ public:
static LLFastTimer::DeclareTimer FTM_AUDIO_UPDATE("Update Audio");
static LLFastTimer::DeclareTimer FTM_CLEANUP("Cleanup");
+static LLFastTimer::DeclareTimer FTM_CLEANUP_DRAWABLES("Drawables");
+static LLFastTimer::DeclareTimer FTM_CLEANUP_OBJECTS("Objects");
static LLFastTimer::DeclareTimer FTM_IDLE_CB("Idle Callbacks");
static LLFastTimer::DeclareTimer FTM_LOD_UPDATE("Update LOD");
static LLFastTimer::DeclareTimer FTM_OBJECTLIST_UPDATE("Update Objectlist");
static LLFastTimer::DeclareTimer FTM_REGION_UPDATE("Update Region");
static LLFastTimer::DeclareTimer FTM_WORLD_UPDATE("Update World");
static LLFastTimer::DeclareTimer FTM_NETWORK("Network");
+static LLFastTimer::DeclareTimer FTM_AGENT_NETWORK("Agent Network");
+static LLFastTimer::DeclareTimer FTM_VLMANAGER("VL Manager");
///////////////////////////////////////////////////////
// idle()
@@ -3640,8 +4069,11 @@ void LLAppViewer::idle()
LLFrameTimer::updateFrameTime();
LLFrameTimer::updateFrameCount();
LLEventTimer::updateClass();
+ LLNotificationsUI::LLToast::updateClass();
LLCriticalDamp::updateInterpolants();
LLMortician::updateClass();
+ LLFilePickerThread::clearDead(); //calls LLFilePickerThread::notify()
+
F32 dt_raw = idle_timer.getElapsedTimeAndResetF32();
// Cap out-of-control frame times
@@ -3772,6 +4204,11 @@ void LLAppViewer::idle()
llinfos << "Unknown object updates: " << gObjectList.mNumUnknownUpdates << llendl;
gObjectList.mNumUnknownUpdates = 0;
}
+
+ // ViewerMetrics FPS piggy-backing on the debug timer.
+ // The 5-second interval is nice for this purpose. If the object debug
+ // bit moves or is disabled, please give this a suitable home.
+ LLViewerAssetStatsFF::record_fps_main(gFPSClamped);
}
}
@@ -3814,6 +4251,18 @@ void LLAppViewer::idle()
gInventory.idleNotifyObservers();
}
+ // Metrics logging (LLViewerAssetStats, etc.)
+ {
+ static LLTimer report_interval;
+
+ // *TODO: Add configuration controls for this
+ if (report_interval.getElapsedTimeF32() >= app_metrics_interval)
+ {
+ metricsSend(! gDisconnected);
+ report_interval.reset();
+ }
+ }
+
if (gDisconnected)
{
return;
@@ -3824,7 +4273,7 @@ void LLAppViewer::idle()
///////////////////////////////////////
// Agent and camera movement
//
- LLCoordGL current_mouse = gViewerWindow->getCurrentMouse();
+ LLCoordGL current_mouse = gViewerWindow->getCurrentMouse();
{
// After agent and camera moved, figure out if we need to
@@ -3859,8 +4308,14 @@ void LLAppViewer::idle()
{
LLFastTimer t(FTM_CLEANUP);
- gObjectList.cleanDeadObjects();
- LLDrawable::cleanupDeadDrawables();
+ {
+ LLFastTimer t(FTM_CLEANUP_OBJECTS);
+ gObjectList.cleanDeadObjects();
+ }
+ {
+ LLFastTimer t(FTM_CLEANUP_DRAWABLES);
+ LLDrawable::cleanupDeadDrawables();
+ }
}
//
@@ -3910,34 +4365,27 @@ void LLAppViewer::idle()
//
// Update weather effects
//
- if (!gNoRender)
- {
- LLWorld::getInstance()->updateClouds(gFrameDTClamped);
- gSky.propagateHeavenlyBodies(gFrameDTClamped); // moves sun, moon, and planets
+ gSky.propagateHeavenlyBodies(gFrameDTClamped); // moves sun, moon, and planets
- // Update wind vector
- LLVector3 wind_position_region;
- static LLVector3 average_wind;
+ // Update wind vector
+ LLVector3 wind_position_region;
+ static LLVector3 average_wind;
- LLViewerRegion *regionp;
- regionp = LLWorld::getInstance()->resolveRegionGlobal(wind_position_region, gAgent.getPositionGlobal()); // puts agent's local coords into wind_position
- if (regionp)
- {
- gWindVec = regionp->mWind.getVelocity(wind_position_region);
+ LLViewerRegion *regionp;
+ regionp = LLWorld::getInstance()->resolveRegionGlobal(wind_position_region, gAgent.getPositionGlobal()); // puts agent's local coords into wind_position
+ if (regionp)
+ {
+ gWindVec = regionp->mWind.getVelocity(wind_position_region);
- // Compute average wind and use to drive motion of water
-
- average_wind = regionp->mWind.getAverage();
- F32 cloud_density = regionp->mCloudLayer.getDensityRegion(wind_position_region);
-
- gSky.setCloudDensityAtAgent(cloud_density);
- gSky.setWind(average_wind);
- //LLVOWater::setWind(average_wind);
- }
- else
- {
- gWindVec.setVec(0.0f, 0.0f, 0.0f);
- }
+ // Compute average wind and use to drive motion of water
+
+ average_wind = regionp->mWind.getAverage();
+ gSky.setWind(average_wind);
+ //LLVOWater::setWind(average_wind);
+ }
+ else
+ {
+ gWindVec.setVec(0.0f, 0.0f, 0.0f);
}
//////////////////////////////////////
@@ -3946,16 +4394,17 @@ void LLAppViewer::idle()
// Here, particles are updated and drawables are moved.
//
- if (!gNoRender)
- {
- LLFastTimer t(FTM_WORLD_UPDATE);
- gPipeline.updateMove();
+ LLFastTimer t(FTM_WORLD_UPDATE);
+ gPipeline.updateMove();
- LLWorld::getInstance()->updateParticles();
- }
+ LLWorld::getInstance()->updateParticles();
- if (LLViewerJoystick::getInstance()->getOverrideCamera())
+ if (gAgentPilot.isPlaying() && gAgentPilot.getOverrideCamera())
{
+ gAgentPilot.moveCamera();
+ }
+ else if (LLViewerJoystick::getInstance()->getOverrideCamera())
+ {
LLViewerJoystick::getInstance()->moveFlycam();
}
else
@@ -3970,6 +4419,10 @@ void LLAppViewer::idle()
// update media focus
LLViewerMediaFocus::getInstance()->update();
+
+ // Update marketplace
+ LLMarketplaceInventoryImporter::update();
+ LLMarketplaceInventoryNotifications::update();
// objects and camera should be in sync, do LOD calculations now
{
@@ -3991,6 +4444,9 @@ void LLAppViewer::idle()
gAudiop->idle(max_audio_decode_time);
}
}
+
+ // Execute deferred tasks.
+ LLDeferredTaskList::instance().run();
// Handle shutdown process, for example,
// wait for floaters to close, send quit message,
@@ -4023,10 +4479,6 @@ void LLAppViewer::idleShutdown()
return;
}
- if (LLSideTray::getInstance()->notifyChildren(LLSD().with("request","wait_quit")))
- {
- return;
- }
@@ -4090,7 +4542,7 @@ void LLAppViewer::idleShutdown()
void LLAppViewer::sendLogoutRequest()
{
- if(!mLogoutRequestSent)
+ if(!mLogoutRequestSent && gMessageSystem)
{
LLMessageSystem* msg = gMessageSystem;
msg->newMessageFast(_PREHASH_LogoutRequest);
@@ -4103,7 +4555,10 @@ void LLAppViewer::sendLogoutRequest()
gLogoutMaxTime = LOGOUT_REQUEST_TIME;
mLogoutRequestSent = TRUE;
- LLVoiceClient::getInstance()->leaveChannel();
+ if(LLVoiceClient::instanceExists())
+ {
+ LLVoiceClient::getInstance()->leaveChannel();
+ }
//Set internal status variables and marker files
gLogoutInProgress = TRUE;
@@ -4190,6 +4645,11 @@ static F32 CheckMessagesMaxTime = CHECK_MESSAGES_DEFAULT_MAX_TIME;
#endif
static LLFastTimer::DeclareTimer FTM_IDLE_NETWORK("Idle Network");
+static LLFastTimer::DeclareTimer FTM_MESSAGE_ACKS("Message Acks");
+static LLFastTimer::DeclareTimer FTM_RETRANSMIT("Retransmit");
+static LLFastTimer::DeclareTimer FTM_TIMEOUT_CHECK("Timeout Check");
+static LLFastTimer::DeclareTimer FTM_DYNAMIC_THROTTLE("Dynamic Throttle");
+static LLFastTimer::DeclareTimer FTM_CHECK_REGION_CIRCUIT("Check Region Circuit");
void LLAppViewer::idleNetwork()
{
@@ -4315,12 +4775,9 @@ void LLAppViewer::disconnectViewer()
gSavedSettings.setBOOL("FlyingAtExit", gAgent.getFlying() );
// Un-minimize all windows so they don't get saved minimized
- if (!gNoRender)
+ if (gFloaterView)
{
- if (gFloaterView)
- {
- gFloaterView->restoreAll();
- }
+ gFloaterView->restoreAll();
}
if (LLSelectMgr::getInstance())
@@ -4360,6 +4817,10 @@ void LLAppViewer::disconnectViewer()
cleanup_xfer_manager();
gDisconnected = TRUE;
+
+ // Pass the connection state to LLUrlEntryParcel not to attempt
+ // parcel info requests while disconnected.
+ LLUrlEntryParcel::setDisconnected(gDisconnected);
}
void LLAppViewer::forceErrorLLError()
@@ -4503,6 +4964,10 @@ void LLAppViewer::handleLoginComplete()
mOnLoginCompleted();
writeDebugInfo();
+
+ // we logged in successfully, so save settings on logout
+ llinfos << "Login successful, per account settings will be saved on log out." << llendl;
+ mSavePerAccountSettings=true;
}
// *TODO - generalize this and move DSO wrangling to a helper class -brad
@@ -4527,6 +4992,35 @@ void LLAppViewer::loadEventHostModule(S32 listen_port)
return;
}
+ LL_INFOS("eventhost") << "Found lleventhost at '" << dso_path << "'" << LL_ENDL;
+#if ! defined(LL_WINDOWS)
+ {
+ std::string outfile("/tmp/lleventhost.file.out");
+ std::string command("file '" + dso_path + "' > '" + outfile + "' 2>&1");
+ int rc = system(command.c_str());
+ if (rc != 0)
+ {
+ LL_WARNS("eventhost") << command << " ==> " << rc << ':' << LL_ENDL;
+ }
+ else
+ {
+ LL_INFOS("eventhost") << command << ':' << LL_ENDL;
+ }
+ {
+ std::ifstream reader(outfile.c_str());
+ std::string line;
+ while (std::getline(reader, line))
+ {
+ size_t len = line.length();
+ if (len && line[len-1] == '\n')
+ line.erase(len-1);
+ LL_INFOS("eventhost") << line << LL_ENDL;
+ }
+ }
+ remove(outfile.c_str());
+ }
+#endif // LL_WINDOWS
+
apr_dso_handle_t * eventhost_dso_handle = NULL;
apr_pool_t * eventhost_dso_memory_pool = NULL;
@@ -4535,13 +5029,13 @@ void LLAppViewer::loadEventHostModule(S32 listen_port)
apr_status_t rv = apr_dso_load(&eventhost_dso_handle,
dso_path.c_str(),
eventhost_dso_memory_pool);
- ll_apr_assert_status(rv);
+ llassert_always(! ll_apr_warn_status(rv, eventhost_dso_handle));
llassert_always(eventhost_dso_handle != NULL);
int (*ll_plugin_start_func)(LLSD const &) = NULL;
rv = apr_dso_sym((apr_dso_handle_sym_t*)&ll_plugin_start_func, eventhost_dso_handle, "ll_plugin_start");
- ll_apr_assert_status(rv);
+ llassert_always(! ll_apr_warn_status(rv, eventhost_dso_handle));
llassert_always(ll_plugin_start_func != NULL);
LLSD args;
@@ -4713,3 +5207,75 @@ bool LLAppViewer::getMasterSystemAudioMute()
{
return gSavedSettings.getBOOL("MuteAudio");
}
+
+//----------------------------------------------------------------------------
+// Metrics-related methods (static and otherwise)
+//----------------------------------------------------------------------------
+
+/**
+ * LLViewerAssetStats collects data on a per-region (as defined by the agent's
+ * location) so we need to tell it about region changes which become a kind of
+ * hidden variable/global state in the collectors. For collectors not running
+ * on the main thread, we need to send a message to move the data over safely
+ * and cheaply (amortized over a run).
+ */
+void LLAppViewer::metricsUpdateRegion(U64 region_handle)
+{
+ if (0 != region_handle)
+ {
+ LLViewerAssetStatsFF::set_region_main(region_handle);
+ if (LLAppViewer::sTextureFetch)
+ {
+ // Send a region update message into 'thread1' to get the new region.
+ LLAppViewer::sTextureFetch->commandSetRegion(region_handle);
+ }
+ else
+ {
+ // No 'thread1', a.k.a. TextureFetch, so update directly
+ LLViewerAssetStatsFF::set_region_thread1(region_handle);
+ }
+ }
+}
+
+
+/**
+ * Attempts to start a multi-threaded metrics report to be sent back to
+ * the grid for consumption.
+ */
+void LLAppViewer::metricsSend(bool enable_reporting)
+{
+ if (! gViewerAssetStatsMain)
+ return;
+
+ if (LLAppViewer::sTextureFetch)
+ {
+ LLViewerRegion * regionp = gAgent.getRegion();
+
+ if (enable_reporting && regionp)
+ {
+ std::string caps_url = regionp->getCapability("ViewerMetrics");
+
+ // Make a copy of the main stats to send into another thread.
+ // Receiving thread takes ownership.
+ LLViewerAssetStats * main_stats(new LLViewerAssetStats(*gViewerAssetStatsMain));
+
+ // Send a report request into 'thread1' to get the rest of the data
+ // and provide some additional parameters while here.
+ LLAppViewer::sTextureFetch->commandSendMetrics(caps_url,
+ gAgentSessionID,
+ gAgentID,
+ main_stats);
+ main_stats = 0; // Ownership transferred
+ }
+ else
+ {
+ LLAppViewer::sTextureFetch->commandDataBreak();
+ }
+ }
+
+ // Reset even if we can't report. Rather than gather up a huge chunk of
+ // data, we'll keep to our sampling interval and retain the data
+ // resolution in time.
+ gViewerAssetStatsMain->reset();
+}
+
diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h
index aa4256a2bd..a3d19301e7 100644
--- a/indra/newview/llappviewer.h
+++ b/indra/newview/llappviewer.h
@@ -65,12 +65,14 @@ public:
virtual bool mainLoop(); // Override for the application main loop. Needs to at least gracefully notice the QUITTING state and exit.
// Application control
+ void flushVFSIO(); // waits for vfs transfers to complete
void forceQuit(); // Puts the viewer into 'shutting down without error' mode.
+ void fastQuit(S32 error_code = 0); // Shuts down the viewer immediately after sending a logout message
void requestQuit(); // Request a quit. A kinder, gentler quit.
void userQuit(); // The users asks to quit. Confirm, then requestQuit()
void earlyExit(const std::string& name,
const LLSD& substitutions = LLSD()); // Display an error dialog and forcibly quit.
- void forceExit(S32 arg); // exit() immediately (after some cleanup).
+ void earlyExitNoNotify(); // Do not display error dialog then forcibly quit.
void abortQuit(); // Called to abort a quit request.
bool quitRequested() { return mQuitRequested; }
@@ -162,11 +164,17 @@ public:
login_completed_signal_t mOnLoginCompleted;
boost::signals2::connection setOnLoginCompletedCallback( const login_completed_signal_t::slot_type& cb ) { return mOnLoginCompleted.connect(cb); }
+ void addOnIdleCallback(const boost::function<void()>& cb); // add a callback to fire (once) when idle
+
void purgeCache(); // Clear the local cache.
// mute/unmute the system's master audio
virtual void setMasterSystemAudioMute(bool mute);
- virtual bool getMasterSystemAudioMute();
+ virtual bool getMasterSystemAudioMute();
+
+ // Metrics policy helper statics.
+ static void metricsUpdateRegion(U64 region_handle);
+ static void metricsSend(bool enable_reporting);
protected:
virtual bool initWindow(); // Initialize the viewer's window.
@@ -181,14 +189,16 @@ protected:
virtual std::string generateSerialNumber() = 0; // Platforms specific classes generate this.
+ virtual bool meetsRequirementsForMaximizedStart(); // Used on first login to decide to launch maximized
private:
+ void initMaxHeapSize();
bool initThreads(); // Initialize viewer threads, return false on failure.
bool initConfiguration(); // Initialize settings from the command line/config file.
void initUpdater(); // Initialize the updater service.
bool initCache(); // Initialize local client cache.
-
+ void checkMemory() ;
// We have switched locations of both Mac and Windows cache, make sure
// files migrate and old cache is cleared out.
@@ -241,13 +251,14 @@ private:
bool mPurgeOnExit;
bool mSavedFinalSnapshot;
+ bool mSavePerAccountSettings; // only save per account settings if login succeeded
bool mForceGraphicsDetail;
bool mQuitRequested; // User wants to quit, may have modified documents open.
bool mLogoutRequestSent; // Disconnect message sent to simulator, no longer safe to send messages to the sim.
S32 mYieldTime;
- LLSD mSettingsLocationList;
+ struct SettingsFiles* mSettingsLocationList;
LLWatchdogTimeout* mMainloopTimeout;
@@ -262,8 +273,7 @@ private:
std::set<struct apr_dso_handle_t*> mPlugins;
- U32 mAvailPhysicalMemInKB ;
- U32 mAvailVirtualMemInKB ;
+ LLFrameTimer mMemCheckTimer;
boost::scoped_ptr<LLUpdaterService> mUpdater;
diff --git a/indra/newview/llappviewerlinux.cpp b/indra/newview/llappviewerlinux.cpp
index 898cc1c0ba..48d02dfeaa 100644
--- a/indra/newview/llappviewerlinux.cpp
+++ b/indra/newview/llappviewerlinux.cpp
@@ -30,6 +30,7 @@
#include "llcommandlineparser.h"
+#include "lldiriterator.h"
#include "llmemtype.h"
#include "llurldispatcher.h" // SLURL from other app instance
#include "llviewernetwork.h"
@@ -233,7 +234,7 @@ gboolean viewer_app_api_GoSLURL(ViewerAppAPI *obj, gchar *slurl, gboolean **succ
std::string url = slurl;
LLMediaCtrl* web = NULL;
const bool trusted_browser = false;
- if (LLURLDispatcher::dispatch(url, web, trusted_browser))
+ if (LLURLDispatcher::dispatch(url, "", web, trusted_browser))
{
// bring window to foreground, as it has just been "launched" from a URL
// todo: hmm, how to get there from here?
@@ -360,46 +361,35 @@ void LLAppViewerLinux::handleCrashReporting(bool reportFreeze)
}
else
{
- const S32 cb = gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING);
-
- // Always generate the report, have the logger do the asking, and
- // don't wait for the logger before exiting (-> total cleanup).
- if (CRASH_BEHAVIOR_NEVER_SEND != cb)
- {
- // launch the actual crash logger
- const char* ask_dialog = "-dialog";
- if (CRASH_BEHAVIOR_ASK != cb)
- ask_dialog = ""; // omit '-dialog' option
- const char * cmdargv[] =
- {cmd.c_str(),
- ask_dialog,
- "-user",
- (char*)LLGridManager::getInstance()->getGridLabel().c_str(),
- "-name",
- LLAppViewer::instance()->getSecondLifeTitle().c_str(),
- NULL};
- fflush(NULL);
- pid_t pid = fork();
- if (pid == 0)
- { // child
- execv(cmd.c_str(), (char* const*) cmdargv); /* Flawfinder: ignore */
- llwarns << "execv failure when trying to start " << cmd << llendl;
- _exit(1); // avoid atexit()
+ // launch the actual crash logger
+ const char * cmdargv[] =
+ {cmd.c_str(),
+ "-user",
+ (char*)LLGridManager::getInstance()->getGridLabel().c_str(),
+ "-name",
+ LLAppViewer::instance()->getSecondLifeTitle().c_str(),
+ NULL};
+ fflush(NULL);
+ pid_t pid = fork();
+ if (pid == 0)
+ { // child
+ execv(cmd.c_str(), (char* const*) cmdargv); /* Flawfinder: ignore */
+ llwarns << "execv failure when trying to start " << cmd << llendl;
+ _exit(1); // avoid atexit()
+ }
+ else
+ {
+ if (pid > 0)
+ {
+ // DO NOT wait for child proc to die; we want
+ // the logger to outlive us while we quit to
+ // free up the screen/keyboard/etc.
+ ////int childExitStatus;
+ ////waitpid(pid, &childExitStatus, 0);
}
else
{
- if (pid > 0)
- {
- // DO NOT wait for child proc to die; we want
- // the logger to outlive us while we quit to
- // free up the screen/keyboard/etc.
- ////int childExitStatus;
- ////waitpid(pid, &childExitStatus, 0);
- }
- else
- {
- llwarns << "fork failure." << llendl;
- }
+ llwarns << "fork failure." << llendl;
}
}
// Sometimes signals don't seem to quit the viewer. Also, we may
@@ -504,7 +494,9 @@ std::string LLAppViewerLinux::generateSerialNumber()
// trawl /dev/disk/by-uuid looking for a good-looking UUID to grab
std::string this_name;
- while (gDirUtilp->getNextFileInDir(uuiddir, "*", this_name))
+
+ LLDirIterator iter(uuiddir, "*");
+ while (iter.next(this_name))
{
if (this_name.length() > best.length() ||
(this_name.length() == best.length() &&
diff --git a/indra/newview/llappviewermacosx.cpp b/indra/newview/llappviewermacosx.cpp
index 1cd80986d8..c2916717bd 100644
--- a/indra/newview/llappviewermacosx.cpp
+++ b/indra/newview/llappviewermacosx.cpp
@@ -500,7 +500,7 @@ OSErr AEGURLHandler(const AppleEvent *messagein, AppleEvent *reply, long refIn)
LLMediaCtrl* web = NULL;
const bool trusted_browser = false;
- LLURLDispatcher::dispatch(url, web, trusted_browser);
+ LLURLDispatcher::dispatch(url, "", web, trusted_browser);
}
return(result);
diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp
index d328567a0e..bad60a9757 100644
--- a/indra/newview/llappviewerwin32.cpp
+++ b/indra/newview/llappviewerwin32.cpp
@@ -26,17 +26,16 @@
#include "llviewerprecompiledheaders.h"
-#if defined(_DEBUG)
-# if _MSC_VER >= 1400 // Visual C++ 2005 or later
-# define WINDOWS_CRT_MEM_CHECKS 1
-# endif
+#ifdef INCLUDE_VLD
+#include "vld.h"
#endif
#include "llappviewerwin32.h"
#include "llmemtype.h"
-#include "llwindowwin32.cpp" // *FIX: for setting gIconResource.
+#include "llwindowwin32.h" // *FIX: for setting gIconResource.
+#include "llgl.h"
#include "res/resource.h" // *FIX: for setting gIconResource.
#include <fcntl.h> //_O_APPEND
@@ -110,6 +109,14 @@ int APIENTRY WINMAIN(HINSTANCE hInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
+#ifdef INCLUDE_VLD
+ // only works for debug builds (hard coded into vld.h)
+ #ifdef _DEBUG
+ // start with Visual Leak Detector turned off
+ VLDGlobalDisable();
+ #endif // _DEBUG
+#endif // INCLUDE_VLD
+
LLMemType mt1(LLMemType::MTYPE_STARTUP);
const S32 MAX_HEAPS = 255;
@@ -301,23 +308,44 @@ void create_console()
// redirect unbuffered STDOUT to the console
l_std_handle = (long)GetStdHandle(STD_OUTPUT_HANDLE);
h_con_handle = _open_osfhandle(l_std_handle, _O_TEXT);
- fp = _fdopen( h_con_handle, "w" );
- *stdout = *fp;
- setvbuf( stdout, NULL, _IONBF, 0 );
+ if (h_con_handle == -1)
+ {
+ llwarns << "create_console() failed to open stdout handle" << llendl;
+ }
+ else
+ {
+ fp = _fdopen( h_con_handle, "w" );
+ *stdout = *fp;
+ setvbuf( stdout, NULL, _IONBF, 0 );
+ }
// redirect unbuffered STDIN to the console
l_std_handle = (long)GetStdHandle(STD_INPUT_HANDLE);
h_con_handle = _open_osfhandle(l_std_handle, _O_TEXT);
- fp = _fdopen( h_con_handle, "r" );
- *stdin = *fp;
- setvbuf( stdin, NULL, _IONBF, 0 );
+ if (h_con_handle == -1)
+ {
+ llwarns << "create_console() failed to open stdin handle" << llendl;
+ }
+ else
+ {
+ fp = _fdopen( h_con_handle, "r" );
+ *stdin = *fp;
+ setvbuf( stdin, NULL, _IONBF, 0 );
+ }
// redirect unbuffered STDERR to the console
l_std_handle = (long)GetStdHandle(STD_ERROR_HANDLE);
h_con_handle = _open_osfhandle(l_std_handle, _O_TEXT);
- fp = _fdopen( h_con_handle, "w" );
- *stderr = *fp;
- setvbuf( stderr, NULL, _IONBF, 0 );
+ if (h_con_handle == -1)
+ {
+ llwarns << "create_console() failed to open stderr handle" << llendl;
+ }
+ else
+ {
+ fp = _fdopen( h_con_handle, "w" );
+ *stderr = *fp;
+ setvbuf( stderr, NULL, _IONBF, 0 );
+ }
}
LLAppViewerWin32::LLAppViewerWin32(const char* cmd_line) :
@@ -388,11 +416,9 @@ bool LLAppViewerWin32::initHardwareTest()
//
if (FALSE == gSavedSettings.getBOOL("NoHardwareProbe"))
{
- BOOL vram_only = !gSavedSettings.getBOOL("ProbeHardwareOnStartup");
-
// per DEV-11631 - disable hardware probing for everything
// but vram.
- vram_only = TRUE;
+ BOOL vram_only = TRUE;
LLSplashScreen::update(LLTrans::getString("StartupDetectingHardware"));
@@ -440,7 +466,11 @@ bool LLAppViewerWin32::initHardwareTest()
LL_WARNS("AppInit") << " Someone took over my exception handler (post hardware probe)!" << LL_ENDL;
}
- gGLManager.mVRAM = gDXHardware.getVRAM();
+ if (gGLManager.mVRAM == 0)
+ {
+ gGLManager.mVRAM = gDXHardware.getVRAM();
+ }
+
LL_INFOS("AppInit") << "Detected VRAM: " << gGLManager.mVRAM << LL_ENDL;
return true;
@@ -499,11 +529,7 @@ void LLAppViewerWin32::handleCrashReporting(bool reportFreeze)
}
else
{
- S32 cb = gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING);
- if(cb != CRASH_BEHAVIOR_NEVER_SEND)
- {
- _spawnl(_P_NOWAIT, exe_path.c_str(), arg_str, NULL);
- }
+ _spawnl(_P_NOWAIT, exe_path.c_str(), arg_str, NULL);
}
}
diff --git a/indra/newview/llassetuploadqueue.cpp b/indra/newview/llassetuploadqueue.cpp
index 7e50098a17..f943759bb8 100644
--- a/indra/newview/llassetuploadqueue.cpp
+++ b/indra/newview/llassetuploadqueue.cpp
@@ -123,7 +123,9 @@ public:
for(LLSD::array_const_iterator line = compile_errors.beginArray();
line < compile_errors.endArray(); line++)
{
- mSupplier->log(line->asString());
+ std::string str = line->asString();
+ str.erase(std::remove(str.begin(), str.end(), '\n'), str.end());
+ mSupplier->log(str);
llinfos << content["errors"] << llendl;
}
}
diff --git a/indra/newview/llassetuploadresponders.cpp b/indra/newview/llassetuploadresponders.cpp
index f12bc16d4b..65bfc990d1 100644
--- a/indra/newview/llassetuploadresponders.cpp
+++ b/indra/newview/llassetuploadresponders.cpp
@@ -60,6 +60,7 @@
#include "llnotificationsutil.h"
#include "llscrolllistctrl.h"
#include "llsdserialize.h"
+#include "llsdutil.h"
#include "llvfs.h"
// When uploading multiple files, don't display any of them when uploading more than this number.
@@ -67,6 +68,125 @@ static const S32 FILE_COUNT_DISPLAY_THRESHOLD = 5;
void dialog_refresh_all();
+void on_new_single_inventory_upload_complete(
+ LLAssetType::EType asset_type,
+ LLInventoryType::EType inventory_type,
+ const std::string inventory_type_string,
+ const LLUUID& item_folder_id,
+ const std::string& item_name,
+ const std::string& item_description,
+ const LLSD& server_response,
+ S32 upload_price)
+{
+ bool success = false;
+
+ if ( upload_price > 0 )
+ {
+ // this upload costed us L$, update our balance
+ // and display something saying that it cost L$
+ LLStatusBar::sendMoneyBalanceRequest();
+
+ LLSD args;
+ args["AMOUNT"] = llformat("%d", upload_price);
+ LLNotificationsUtil::add("UploadPayment", args);
+ }
+
+ if( item_folder_id.notNull() )
+ {
+ U32 everyone_perms = PERM_NONE;
+ U32 group_perms = PERM_NONE;
+ U32 next_owner_perms = PERM_ALL;
+ if( server_response.has("new_next_owner_mask") )
+ {
+ // The server provided creation perms so use them.
+ // Do not assume we got the perms we asked for in
+ // since the server may not have granted them all.
+ everyone_perms = server_response["new_everyone_mask"].asInteger();
+ group_perms = server_response["new_group_mask"].asInteger();
+ next_owner_perms = server_response["new_next_owner_mask"].asInteger();
+ }
+ else
+ {
+ // The server doesn't provide creation perms
+ // so use old assumption-based perms.
+ if( inventory_type_string != "snapshot")
+ {
+ next_owner_perms = PERM_MOVE | PERM_TRANSFER;
+ }
+ }
+
+ LLPermissions new_perms;
+ new_perms.init(
+ gAgent.getID(),
+ gAgent.getID(),
+ LLUUID::null,
+ LLUUID::null);
+
+ new_perms.initMasks(
+ PERM_ALL,
+ PERM_ALL,
+ everyone_perms,
+ group_perms,
+ next_owner_perms);
+
+ U32 inventory_item_flags = 0;
+ if (server_response.has("inventory_flags"))
+ {
+ inventory_item_flags = (U32) server_response["inventory_flags"].asInteger();
+ if (inventory_item_flags != 0)
+ {
+ llinfos << "inventory_item_flags " << inventory_item_flags << llendl;
+ }
+ }
+ S32 creation_date_now = time_corrected();
+ LLPointer<LLViewerInventoryItem> item = new LLViewerInventoryItem(
+ server_response["new_inventory_item"].asUUID(),
+ item_folder_id,
+ new_perms,
+ server_response["new_asset"].asUUID(),
+ asset_type,
+ inventory_type,
+ item_name,
+ item_description,
+ LLSaleInfo::DEFAULT,
+ inventory_item_flags,
+ creation_date_now);
+
+ gInventory.updateItem(item);
+ gInventory.notifyObservers();
+ success = true;
+
+ // Show the preview panel for textures and sounds to let
+ // user know that the image (or snapshot) arrived intact.
+ LLInventoryPanel* panel = LLInventoryPanel::getActiveInventoryPanel();
+ if ( panel )
+ {
+ LLFocusableElement* focus = gFocusMgr.getKeyboardFocus();
+
+ panel->setSelection(
+ server_response["new_inventory_item"].asUUID(),
+ TAKE_FOCUS_NO);
+
+ // restore keyboard focus
+ gFocusMgr.setKeyboardFocus(focus);
+ }
+ }
+ else
+ {
+ llwarns << "Can't find a folder to put it in" << llendl;
+ }
+
+ // remove the "Uploading..." message
+ LLUploadDialog::modalUploadFinished();
+
+ // Let the Snapshot floater know we have finished uploading a snapshot to inventory.
+ LLFloater* floater_snapshot = LLFloaterReg::findInstance("snapshot");
+ if (asset_type == LLAssetType::AT_TEXTURE && floater_snapshot)
+ {
+ floater_snapshot->notify(LLSD().with("set-finished", LLSD().with("ok", success).with("msg", "inventory")));
+ }
+}
+
LLAssetUploadResponder::LLAssetUploadResponder(const LLSD &post_data,
const LLUUID& vfile_id,
LLAssetType::EType asset_type)
@@ -84,9 +204,10 @@ LLAssetUploadResponder::LLAssetUploadResponder(const LLSD &post_data,
}
}
-LLAssetUploadResponder::LLAssetUploadResponder(const LLSD &post_data,
- const std::string& file_name,
- LLAssetType::EType asset_type)
+LLAssetUploadResponder::LLAssetUploadResponder(
+ const LLSD &post_data,
+ const std::string& file_name,
+ LLAssetType::EType asset_type)
: LLHTTPClient::Responder(),
mPostData(post_data),
mFileName(file_name),
@@ -126,6 +247,7 @@ void LLAssetUploadResponder::error(U32 statusNum, const std::string& reason)
break;
}
LLUploadDialog::modalUploadFinished();
+ LLFilePicker::instance().reset(); // unlock file picker when bulk upload fails
}
//virtual
@@ -134,6 +256,7 @@ void LLAssetUploadResponder::result(const LLSD& content)
lldebugs << "LLAssetUploadResponder::result from capabilities" << llendl;
std::string state = content["state"];
+
if (state == "upload")
{
uploadUpload(content);
@@ -172,6 +295,11 @@ void LLAssetUploadResponder::uploadFailure(const LLSD& content)
{
// remove the "Uploading..." message
LLUploadDialog::modalUploadFinished();
+ LLFloater* floater_snapshot = LLFloaterReg::findInstance("snapshot");
+ if (floater_snapshot)
+ {
+ floater_snapshot->notify(LLSD().with("set-finished", LLSD().with("ok", false).with("msg", "inventory")));
+ }
std::string reason = content["state"];
// deal with L$ errors
@@ -195,16 +323,36 @@ void LLAssetUploadResponder::uploadComplete(const LLSD& content)
{
}
-LLNewAgentInventoryResponder::LLNewAgentInventoryResponder(const LLSD& post_data,
- const LLUUID& vfile_id,
- LLAssetType::EType asset_type)
-: LLAssetUploadResponder(post_data, vfile_id, asset_type)
+LLNewAgentInventoryResponder::LLNewAgentInventoryResponder(
+ const LLSD& post_data,
+ const LLUUID& vfile_id,
+ LLAssetType::EType asset_type)
+ : LLAssetUploadResponder(post_data, vfile_id, asset_type)
{
}
-LLNewAgentInventoryResponder::LLNewAgentInventoryResponder(const LLSD& post_data, const std::string& file_name, LLAssetType::EType asset_type)
-: LLAssetUploadResponder(post_data, file_name, asset_type)
+LLNewAgentInventoryResponder::LLNewAgentInventoryResponder(
+ const LLSD& post_data,
+ const std::string& file_name,
+ LLAssetType::EType asset_type)
+ : LLAssetUploadResponder(post_data, file_name, asset_type)
+{
+}
+
+// virtual
+void LLNewAgentInventoryResponder::error(U32 statusNum, const std::string& reason)
{
+ LLAssetUploadResponder::error(statusNum, reason);
+ //LLImportColladaAssetCache::getInstance()->assetUploaded(mVFileID, LLUUID(), FALSE);
+}
+
+
+//virtual
+void LLNewAgentInventoryResponder::uploadFailure(const LLSD& content)
+{
+ LLAssetUploadResponder::uploadFailure(content);
+
+ //LLImportColladaAssetCache::getInstance()->assetUploaded(mVFileID, content["new_asset"], FALSE);
}
//virtual
@@ -218,95 +366,31 @@ void LLNewAgentInventoryResponder::uploadComplete(const LLSD& content)
LLAssetType::EType asset_type = LLAssetType::lookup(mPostData["asset_type"].asString());
LLInventoryType::EType inventory_type = LLInventoryType::lookup(mPostData["inventory_type"].asString());
- S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload();
+ S32 expected_upload_cost = 0;
// Update L$ and ownership credit information
// since it probably changed on the server
if (asset_type == LLAssetType::AT_TEXTURE ||
asset_type == LLAssetType::AT_SOUND ||
- asset_type == LLAssetType::AT_ANIMATION)
+ asset_type == LLAssetType::AT_ANIMATION ||
+ asset_type == LLAssetType::AT_MESH)
{
- LLStatusBar::sendMoneyBalanceRequest();
-
- LLSD args;
- args["AMOUNT"] = llformat("%d", expected_upload_cost);
- LLNotificationsUtil::add("UploadPayment", args);
+ expected_upload_cost =
+ LLGlobalEconomy::Singleton::getInstance()->getPriceUpload();
}
- // Actually add the upload to viewer inventory
- llinfos << "Adding " << content["new_inventory_item"].asUUID() << " "
- << content["new_asset"].asUUID() << " to inventory." << llendl;
- if(mPostData["folder_id"].asUUID().notNull())
- {
- //std::ostringstream out;
- //LLSDXMLFormatter *formatter = new LLSDXMLFormatter;
- //formatter->format(mPostData, out, LLSDFormatter::OPTIONS_PRETTY);
- //llinfos << "Post Data: " << out.str() << llendl;
+ on_new_single_inventory_upload_complete(
+ asset_type,
+ inventory_type,
+ mPostData["asset_type"].asString(),
+ mPostData["folder_id"].asUUID(),
+ mPostData["name"],
+ mPostData["description"],
+ content,
+ expected_upload_cost);
- U32 everyone_perms = PERM_NONE;
- U32 group_perms = PERM_NONE;
- U32 next_owner_perms = PERM_ALL;
- if(content.has("new_next_owner_mask"))
- {
- // This is a new sim that provides creation perms so use them.
- // Do not assume we got the perms we asked for in mPostData
- // since the sim may not have granted them all.
- everyone_perms = content["new_everyone_mask"].asInteger();
- group_perms = content["new_group_mask"].asInteger();
- next_owner_perms = content["new_next_owner_mask"].asInteger();
- }
- else
- {
- // This old sim doesn't provide creation perms so use old assumption-based perms.
- if(mPostData["inventory_type"].asString() != "snapshot")
- {
- next_owner_perms = PERM_MOVE | PERM_TRANSFER;
- }
- }
- LLPermissions new_perms;
- new_perms.init(gAgent.getID(), gAgent.getID(), LLUUID::null, LLUUID::null);
- new_perms.initMasks(PERM_ALL, PERM_ALL, everyone_perms, group_perms, next_owner_perms);
- S32 creation_date_now = time_corrected();
- LLPointer<LLViewerInventoryItem> item
- = new LLViewerInventoryItem(content["new_inventory_item"].asUUID(),
- mPostData["folder_id"].asUUID(),
- new_perms,
- content["new_asset"].asUUID(),
- asset_type,
- inventory_type,
- mPostData["name"].asString(),
- mPostData["description"].asString(),
- LLSaleInfo::DEFAULT,
- LLInventoryItemFlags::II_FLAGS_NONE,
- creation_date_now);
- gInventory.updateItem(item);
- gInventory.notifyObservers();
+ // continue uploading for bulk uploads
- // Show the preview panel for textures and sounds to let
- // user know that the image (or snapshot) arrived intact.
- LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel();
- if (active_panel)
- {
- active_panel->setSelection(content["new_inventory_item"].asUUID(), TAKE_FOCUS_NO);
- if((LLAssetType::AT_TEXTURE == asset_type || LLAssetType::AT_SOUND == asset_type)
- && LLFilePicker::instance().getFileCount() <= FILE_COUNT_DISPLAY_THRESHOLD)
- {
- active_panel->openSelected();
- }
- //LLFloaterInventory::dumpSelectionInformation((void*)view);
- // restore keyboard focus
- LLFocusableElement* focus = gFocusMgr.getKeyboardFocus();
- gFocusMgr.setKeyboardFocus(focus);
- }
- }
- else
- {
- llwarns << "Can't find a folder to put it in" << llendl;
- }
-
- // remove the "Uploading..." message
- LLUploadDialog::modalUploadFinished();
-
// *FIX: This is a pretty big hack. What this does is check the
// file picker if there are any more pending uploads. If so,
// upload that file.
@@ -323,19 +407,42 @@ void LLNewAgentInventoryResponder::uploadComplete(const LLSD& content)
// Continuing the horrible hack above, we need to extract the originally requested permissions data, if any,
// and use them for each next file to be uploaded. Note the requested perms are not the same as the
- // granted ones found in the given "content" structure but can still be found in mPostData. -MG
- U32 everyone_perms = mPostData.has("everyone_mask") ? mPostData.get("everyone_mask" ).asInteger() : PERM_NONE;
- U32 group_perms = mPostData.has("group_mask") ? mPostData.get("group_mask" ).asInteger() : PERM_NONE;
- U32 next_owner_perms = mPostData.has("next_owner_mask") ? mPostData.get("next_owner_mask").asInteger() : PERM_NONE;
+ U32 everyone_perms =
+ content.has("new_everyone_mask") ?
+ content["new_everyone_mask"].asInteger() :
+ PERM_NONE;
+
+ U32 group_perms =
+ content.has("new_group_mask") ?
+ content["new_group_mask"].asInteger() :
+ PERM_NONE;
+
+ U32 next_owner_perms =
+ content.has("new_next_owner_mask") ?
+ content["new_next_owner_mask"].asInteger() :
+ PERM_NONE;
+
std::string display_name = LLStringUtil::null;
LLAssetStorage::LLStoreAssetCallback callback = NULL;
void *userdata = NULL;
- upload_new_resource(next_file, asset_name, asset_name,
- 0, LLFolderType::FT_NONE, LLInventoryType::IT_NONE,
- next_owner_perms, group_perms,
- everyone_perms, display_name,
- callback, expected_upload_cost, userdata);
+
+ upload_new_resource(
+ next_file,
+ asset_name,
+ asset_name,
+ 0,
+ LLFolderType::FT_NONE,
+ LLInventoryType::IT_NONE,
+ next_owner_perms,
+ group_perms,
+ everyone_perms,
+ display_name,
+ callback,
+ LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(),
+ userdata);
}
+
+ //LLImportColladaAssetCache::getInstance()->assetUploaded(mVFileID, content["new_asset"], TRUE);
}
LLSendTexLayerResponder::LLSendTexLayerResponder(const LLSD& post_data,
@@ -366,7 +473,7 @@ void LLSendTexLayerResponder::uploadComplete(const LLSD& content)
std::string result = content["state"];
LLUUID new_id = content["new_asset"];
- llinfos << "result: " << result << "new_id:" << new_id << llendl;
+ llinfos << "result: " << result << " new_id: " << new_id << llendl;
if (result == "complete"
&& mBakedUploadData != NULL)
{ // Invoke
@@ -389,17 +496,19 @@ void LLSendTexLayerResponder::error(U32 statusNum, const std::string& reason)
mBakedUploadData = NULL; // deleted in onTextureUploadComplete()
}
-LLUpdateAgentInventoryResponder::LLUpdateAgentInventoryResponder(const LLSD& post_data,
- const LLUUID& vfile_id,
- LLAssetType::EType asset_type)
-: LLAssetUploadResponder(post_data, vfile_id, asset_type)
+LLUpdateAgentInventoryResponder::LLUpdateAgentInventoryResponder(
+ const LLSD& post_data,
+ const LLUUID& vfile_id,
+ LLAssetType::EType asset_type)
+ : LLAssetUploadResponder(post_data, vfile_id, asset_type)
{
}
-LLUpdateAgentInventoryResponder::LLUpdateAgentInventoryResponder(const LLSD& post_data,
- const std::string& file_name,
- LLAssetType::EType asset_type)
-: LLAssetUploadResponder(post_data, file_name, asset_type)
+LLUpdateAgentInventoryResponder::LLUpdateAgentInventoryResponder(
+ const LLSD& post_data,
+ const std::string& file_name,
+ LLAssetType::EType asset_type)
+ : LLAssetUploadResponder(post_data, file_name, asset_type)
{
}
@@ -582,3 +691,474 @@ void LLUpdateTaskInventoryResponder::uploadComplete(const LLSD& content)
break;
}
}
+
+
+/////////////////////////////////////////////////////
+// LLNewAgentInventoryVariablePriceResponder::Impl //
+/////////////////////////////////////////////////////
+class LLNewAgentInventoryVariablePriceResponder::Impl
+{
+public:
+ Impl(
+ const LLUUID& vfile_id,
+ LLAssetType::EType asset_type,
+ const LLSD& inventory_data) :
+ mVFileID(vfile_id),
+ mAssetType(asset_type),
+ mInventoryData(inventory_data),
+ mFileName("")
+ {
+ if (!gVFS->getExists(vfile_id, asset_type))
+ {
+ llwarns
+ << "LLAssetUploadResponder called with nonexistant "
+ << "vfile_id " << vfile_id << llendl;
+ mVFileID.setNull();
+ mAssetType = LLAssetType::AT_NONE;
+ }
+ }
+
+ Impl(
+ const std::string& file_name,
+ LLAssetType::EType asset_type,
+ const LLSD& inventory_data) :
+ mFileName(file_name),
+ mAssetType(asset_type),
+ mInventoryData(inventory_data)
+ {
+ mVFileID.setNull();
+ }
+
+ std::string getFilenameOrIDString() const
+ {
+ return (mFileName.empty() ? mVFileID.asString() : mFileName);
+ }
+
+ LLUUID getVFileID() const
+ {
+ return mVFileID;
+ }
+
+ std::string getFilename() const
+ {
+ return mFileName;
+ }
+
+ LLAssetType::EType getAssetType() const
+ {
+ return mAssetType;
+ }
+
+ LLInventoryType::EType getInventoryType() const
+ {
+ return LLInventoryType::lookup(
+ mInventoryData["inventory_type"].asString());
+ }
+
+ std::string getInventoryTypeString() const
+ {
+ return mInventoryData["inventory_type"].asString();
+ }
+
+ LLUUID getFolderID() const
+ {
+ return mInventoryData["folder_id"].asUUID();
+ }
+
+ std::string getItemName() const
+ {
+ return mInventoryData["name"].asString();
+ }
+
+ std::string getItemDescription() const
+ {
+ return mInventoryData["description"].asString();
+ }
+
+ void displayCannotUploadReason(const std::string& reason)
+ {
+ LLSD args;
+ args["FILE"] = getFilenameOrIDString();
+ args["REASON"] = reason;
+
+
+ LLNotificationsUtil::add("CannotUploadReason", args);
+ LLUploadDialog::modalUploadFinished();
+ }
+
+ void onApplicationLevelError(const LLSD& error)
+ {
+ static const std::string _IDENTIFIER = "identifier";
+
+ static const std::string _INSUFFICIENT_FUNDS =
+ "NewAgentInventory_InsufficientLindenDollarBalance";
+ static const std::string _MISSING_REQUIRED_PARAMETER =
+ "NewAgentInventory_MissingRequiredParamater";
+ static const std::string _INVALID_REQUEST_BODY =
+ "NewAgentInventory_InvalidRequestBody";
+ static const std::string _RESOURCE_COST_DIFFERS =
+ "NewAgentInventory_ResourceCostDiffers";
+
+ static const std::string _MISSING_PARAMETER = "missing_parameter";
+ static const std::string _INVALID_PARAMETER = "invalid_parameter";
+ static const std::string _MISSING_RESOURCE = "missing_resource";
+ static const std::string _INVALID_RESOURCE = "invalid_resource";
+
+ // TODO* Add the other error_identifiers
+
+ std::string error_identifier = error[_IDENTIFIER].asString();
+
+ // TODO*: Pull these user visible strings from an xml file
+ // to be localized
+ if ( _INSUFFICIENT_FUNDS == error_identifier )
+ {
+ displayCannotUploadReason("You do not have a sufficient L$ balance to complete this upload.");
+ }
+ else if ( _MISSING_REQUIRED_PARAMETER == error_identifier )
+ {
+ // Missing parameters
+ if (error.has(_MISSING_PARAMETER) )
+ {
+ std::string message =
+ "Upload request was missing required parameter '[P]'";
+ LLStringUtil::replaceString(
+ message,
+ "[P]",
+ error[_MISSING_PARAMETER].asString());
+
+ displayCannotUploadReason(message);
+ }
+ else
+ {
+ std::string message =
+ "Upload request was missing a required parameter";
+ displayCannotUploadReason(message);
+ }
+ }
+ else if ( _INVALID_REQUEST_BODY == error_identifier )
+ {
+ // Invalid request body, check to see if
+ // a particular parameter was invalid
+ if ( error.has(_INVALID_PARAMETER) )
+ {
+ std::string message = "Upload parameter '[P]' is invalid.";
+ LLStringUtil::replaceString(
+ message,
+ "[P]",
+ error[_INVALID_PARAMETER].asString());
+
+ // See if the server also responds with what resource
+ // is missing.
+ if ( error.has(_MISSING_RESOURCE) )
+ {
+ message += "\nMissing resource '[R]'.";
+
+ LLStringUtil::replaceString(
+ message,
+ "[R]",
+ error[_MISSING_RESOURCE].asString());
+ }
+ else if ( error.has(_INVALID_RESOURCE) )
+ {
+ message += "\nInvalid resource '[R]'.";
+
+ LLStringUtil::replaceString(
+ message,
+ "[R]",
+ error[_INVALID_RESOURCE].asString());
+ }
+
+ displayCannotUploadReason(message);
+ }
+ else
+ {
+ std::string message = "Upload request was malformed";
+ displayCannotUploadReason(message);
+ }
+ }
+ else if ( _RESOURCE_COST_DIFFERS == error_identifier )
+ {
+ displayCannotUploadReason("The resource cost associated with this upload is not consistent with the server.");
+ }
+ else
+ {
+ displayCannotUploadReason("Unknown Error");
+ }
+ }
+
+ void onTransportError()
+ {
+ displayCannotUploadReason(
+ "The server is experiencing unexpected difficulties.");
+ }
+
+ void onTransportError(const LLSD& error)
+ {
+ static const std::string _IDENTIFIER = "identifier";
+
+ static const std::string _SERVER_ERROR_AFTER_CHARGE =
+ "NewAgentInventory_ServerErrorAfterCharge";
+
+ std::string error_identifier = error[_IDENTIFIER].asString();
+
+ // TODO*: Pull the user visible strings from an xml file
+ // to be localized
+
+ if ( _SERVER_ERROR_AFTER_CHARGE == error_identifier )
+ {
+ displayCannotUploadReason(
+ "The server is experiencing unexpected difficulties. You may have been charged for the upload.");
+ }
+ else
+ {
+ displayCannotUploadReason(
+ "The server is experiencing unexpected difficulties.");
+ }
+ }
+
+ bool uploadConfirmationCallback(
+ const LLSD& notification,
+ const LLSD& response,
+ boost::intrusive_ptr<LLNewAgentInventoryVariablePriceResponder> responder)
+ {
+ S32 option;
+ std::string confirmation_url;
+
+ option = LLNotificationsUtil::getSelectedOption(
+ notification,
+ response);
+
+ confirmation_url =
+ notification["payload"]["confirmation_url"].asString();
+
+ // Yay! We are confirming or cancelling our upload
+ switch(option)
+ {
+ case 0:
+ {
+ confirmUpload(confirmation_url, responder);
+ }
+ break;
+ case 1:
+ default:
+ break;
+ }
+
+ return false;
+ }
+
+ void confirmUpload(
+ const std::string& confirmation_url,
+ boost::intrusive_ptr<LLNewAgentInventoryVariablePriceResponder> responder)
+ {
+ if ( getFilename().empty() )
+ {
+ // we have no filename, use virtual file ID instead
+ LLHTTPClient::postFile(
+ confirmation_url,
+ getVFileID(),
+ getAssetType(),
+ responder);
+ }
+ else
+ {
+ LLHTTPClient::postFile(
+ confirmation_url,
+ getFilename(),
+ responder);
+ }
+ }
+
+
+private:
+ std::string mFileName;
+
+ LLSD mInventoryData;
+ LLAssetType::EType mAssetType;
+ LLUUID mVFileID;
+};
+
+///////////////////////////////////////////////
+// LLNewAgentInventoryVariablePriceResponder //
+///////////////////////////////////////////////
+LLNewAgentInventoryVariablePriceResponder::LLNewAgentInventoryVariablePriceResponder(
+ const LLUUID& vfile_id,
+ LLAssetType::EType asset_type,
+ const LLSD& inventory_info)
+{
+ mImpl = new Impl(
+ vfile_id,
+ asset_type,
+ inventory_info);
+}
+
+LLNewAgentInventoryVariablePriceResponder::LLNewAgentInventoryVariablePriceResponder(
+ const std::string& file_name,
+ LLAssetType::EType asset_type,
+ const LLSD& inventory_info)
+{
+ mImpl = new Impl(
+ file_name,
+ asset_type,
+ inventory_info);
+}
+
+LLNewAgentInventoryVariablePriceResponder::~LLNewAgentInventoryVariablePriceResponder()
+{
+ delete mImpl;
+}
+
+void LLNewAgentInventoryVariablePriceResponder::errorWithContent(
+ U32 statusNum,
+ const std::string& reason,
+ const LLSD& content)
+{
+ lldebugs
+ << "LLNewAgentInventoryVariablePrice::error " << statusNum
+ << " reason: " << reason << llendl;
+
+ if ( content.has("error") )
+ {
+ static const std::string _ERROR = "error";
+
+ mImpl->onTransportError(content[_ERROR]);
+ }
+ else
+ {
+ mImpl->onTransportError();
+ }
+}
+
+void LLNewAgentInventoryVariablePriceResponder::result(const LLSD& content)
+{
+ // Parse out application level errors and the appropriate
+ // responses for them
+ static const std::string _ERROR = "error";
+ static const std::string _STATE = "state";
+
+ static const std::string _COMPLETE = "complete";
+ static const std::string _CONFIRM_UPLOAD = "confirm_upload";
+
+ static const std::string _UPLOAD_PRICE = "upload_price";
+ static const std::string _RESOURCE_COST = "resource_cost";
+ static const std::string _RSVP = "rsvp";
+
+ // Check for application level errors
+ if ( content.has(_ERROR) )
+ {
+ onApplicationLevelError(content[_ERROR]);
+ return;
+ }
+
+ std::string state = content[_STATE];
+ LLAssetType::EType asset_type = mImpl->getAssetType();
+
+ if ( _COMPLETE == state )
+ {
+ // rename file in VFS with new asset id
+ if (mImpl->getFilename().empty())
+ {
+ // rename the file in the VFS to the actual asset id
+ // llinfos << "Changing uploaded asset UUID to " << content["new_asset"].asUUID() << llendl;
+ gVFS->renameFile(
+ mImpl->getVFileID(),
+ asset_type,
+ content["new_asset"].asUUID(),
+ asset_type);
+ }
+
+ on_new_single_inventory_upload_complete(
+ asset_type,
+ mImpl->getInventoryType(),
+ mImpl->getInventoryTypeString(),
+ mImpl->getFolderID(),
+ mImpl->getItemName(),
+ mImpl->getItemDescription(),
+ content,
+ content[_UPLOAD_PRICE].asInteger());
+
+ // TODO* Add bulk (serial) uploading or add
+ // a super class of this that does so
+ }
+ else if ( _CONFIRM_UPLOAD == state )
+ {
+ showConfirmationDialog(
+ content[_UPLOAD_PRICE].asInteger(),
+ content[_RESOURCE_COST].asInteger(),
+ content[_RSVP].asString());
+ }
+ else
+ {
+ onApplicationLevelError("");
+ }
+}
+
+void LLNewAgentInventoryVariablePriceResponder::onApplicationLevelError(
+ const LLSD& error)
+{
+ mImpl->onApplicationLevelError(error);
+}
+
+void LLNewAgentInventoryVariablePriceResponder::showConfirmationDialog(
+ S32 upload_price,
+ S32 resource_cost,
+ const std::string& confirmation_url)
+{
+ if ( 0 == upload_price )
+ {
+ // don't show confirmation dialog for free uploads, I mean,
+ // they're free!
+
+ // The creating of a new instrusive_ptr(this)
+ // creates a new boost::intrusive_ptr
+ // which is a copy of this. This code is required because
+ // 'this' is always of type Class* and not the intrusive_ptr,
+ // and thus, a reference to 'this' is not registered
+ // by using just plain 'this'.
+
+ // Since LLNewAgentInventoryVariablePriceResponder is a
+ // reference counted class, it is possible (since the
+ // reference to a plain 'this' would be missed here) that,
+ // when using plain ol' 'this', that this object
+ // would be deleted before the callback is triggered
+ // and cause sadness.
+ mImpl->confirmUpload(
+ confirmation_url,
+ boost::intrusive_ptr<LLNewAgentInventoryVariablePriceResponder>(this));
+ }
+ else
+ {
+ LLSD substitutions;
+ LLSD payload;
+
+ substitutions["PRICE"] = upload_price;
+
+ payload["confirmation_url"] = confirmation_url;
+
+ // The creating of a new instrusive_ptr(this)
+ // creates a new boost::intrusive_ptr
+ // which is a copy of this. This code is required because
+ // 'this' is always of type Class* and not the intrusive_ptr,
+ // and thus, a reference to 'this' is not registered
+ // by using just plain 'this'.
+
+ // Since LLNewAgentInventoryVariablePriceResponder is a
+ // reference counted class, it is possible (since the
+ // reference to a plain 'this' would be missed here) that,
+ // when using plain ol' 'this', that this object
+ // would be deleted before the callback is triggered
+ // and cause sadness.
+ LLNotificationsUtil::add(
+ "UploadCostConfirmation",
+ substitutions,
+ payload,
+ boost::bind(
+ &LLNewAgentInventoryVariablePriceResponder::Impl::uploadConfirmationCallback,
+ mImpl,
+ _1,
+ _2,
+ boost::intrusive_ptr<LLNewAgentInventoryVariablePriceResponder>(this)));
+ }
+}
+
+
diff --git a/indra/newview/llassetuploadresponders.h b/indra/newview/llassetuploadresponders.h
index 752c0dfe45..381b919c4a 100644
--- a/indra/newview/llassetuploadresponders.h
+++ b/indra/newview/llassetuploadresponders.h
@@ -55,20 +55,64 @@ protected:
std::string mFileName;
};
+// TODO*: Remove this once deprecated
class LLNewAgentInventoryResponder : public LLAssetUploadResponder
{
public:
- LLNewAgentInventoryResponder(const LLSD& post_data,
- const LLUUID& vfile_id,
- LLAssetType::EType asset_type);
- LLNewAgentInventoryResponder(const LLSD& post_data, const std::string& file_name,
- LLAssetType::EType asset_type);
+ LLNewAgentInventoryResponder(
+ const LLSD& post_data,
+ const LLUUID& vfile_id,
+ LLAssetType::EType asset_type);
+ LLNewAgentInventoryResponder(
+ const LLSD& post_data,
+ const std::string& file_name,
+ LLAssetType::EType asset_type);
+ virtual void error(U32 statusNum, const std::string& reason);
virtual void uploadComplete(const LLSD& content);
+ virtual void uploadFailure(const LLSD& content);
+};
+
+// A base class which goes through and performs some default
+// actions for variable price uploads. If more specific actions
+// are needed (such as different confirmation messages, etc.)
+// the functions onApplicationLevelError and showConfirmationDialog.
+class LLNewAgentInventoryVariablePriceResponder :
+ public LLHTTPClient::Responder
+{
+public:
+ LLNewAgentInventoryVariablePriceResponder(
+ const LLUUID& vfile_id,
+ LLAssetType::EType asset_type,
+ const LLSD& inventory_info);
+
+ LLNewAgentInventoryVariablePriceResponder(
+ const std::string& file_name,
+ LLAssetType::EType asset_type,
+ const LLSD& inventory_info);
+ virtual ~LLNewAgentInventoryVariablePriceResponder();
+
+ void errorWithContent(
+ U32 statusNum,
+ const std::string& reason,
+ const LLSD& content);
+ void result(const LLSD& content);
+
+ virtual void onApplicationLevelError(
+ const LLSD& error);
+ virtual void showConfirmationDialog(
+ S32 upload_price,
+ S32 resource_cost,
+ const std::string& confirmation_url);
+
+private:
+ class Impl;
+ Impl* mImpl;
};
struct LLBakedUploadData;
class LLSendTexLayerResponder : public LLAssetUploadResponder
{
+ LOG_CLASS(LLSendTexLayerResponder);
public:
LLSendTexLayerResponder(const LLSD& post_data,
const LLUUID& vfile_id,
diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp
index 066b4d8bc3..f618af9536 100644..100755
--- a/indra/newview/llavataractions.cpp
+++ b/indra/newview/llavataractions.cpp
@@ -47,7 +47,10 @@
#include "llfloatergroups.h"
#include "llfloaterreg.h"
#include "llfloaterpay.h"
+#include "llfloatersidepanelcontainer.h"
+#include "llfloaterwebcontent.h"
#include "llfloaterworldmap.h"
+#include "llfolderview.h"
#include "llgiveinventory.h"
#include "llinventorybridge.h"
#include "llinventorymodel.h" // for gInventory.findCategoryUUIDForType
@@ -56,9 +59,10 @@
#include "llmutelist.h"
#include "llnotificationsutil.h" // for LLNotificationsUtil
#include "llpaneloutfitedit.h"
+#include "llpanelprofile.h"
#include "llrecentpeople.h"
-#include "llsidetray.h"
#include "lltrans.h"
+#include "llviewercontrol.h"
#include "llviewerobjectlist.h"
#include "llviewermessage.h" // for handle_lure
#include "llviewerregion.h"
@@ -66,6 +70,7 @@
#include "lltrans.h"
#include "llcallingcard.h"
#include "llslurl.h" // IDEVO
+#include "llsidepanelinventory.h"
// static
void LLAvatarActions::requestFriendshipDialog(const LLUUID& id, const std::string& name)
@@ -276,7 +281,7 @@ bool LLAvatarActions::isCalling(const LLUUID &id)
//static
bool LLAvatarActions::canCall()
{
- return LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking();
+ return LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking();
}
// static
@@ -297,25 +302,65 @@ void LLAvatarActions::startConference(const uuid_vec_t& ids)
make_ui_sound("UISndStartIM");
}
+static const char* get_profile_floater_name(const LLUUID& avatar_id)
+{
+ // Use different floater XML for our profile to be able to save its rect.
+ return avatar_id == gAgentID ? "my_profile" : "profile";
+}
+
+static void on_avatar_name_show_profile(const LLUUID& agent_id, const LLAvatarName& av_name)
+{
+ std::string username = av_name.mUsername;
+ if (username.empty())
+ {
+ username = LLCacheName::buildUsername(av_name.mDisplayName);
+ }
+
+ llinfos << "opening web profile for " << username << llendl;
+ std::string url = getProfileURL(username);
+
+ // PROFILES: open in webkit window
+ LLFloaterWebContent::Params p;
+ p.url(url).
+ id(agent_id.asString());
+ LLFloaterReg::showInstance(get_profile_floater_name(agent_id), p);
+}
+
// static
void LLAvatarActions::showProfile(const LLUUID& id)
{
if (id.notNull())
{
- LLSD params;
- params["id"] = id;
- params["open_tab_name"] = "panel_profile";
+ LLAvatarNameCache::get(id, boost::bind(&on_avatar_name_show_profile, _1, _2));
+ }
+}
- //Show own profile
- if(gAgent.getID() == id)
- {
- LLSideTray::getInstance()->showPanel("panel_me", params);
- }
- //Show other user profile
- else
- {
- LLSideTray::getInstance()->showPanel("panel_profile_view", params);
- }
+//static
+bool LLAvatarActions::profileVisible(const LLUUID& id)
+{
+ LLSD sd;
+ sd["id"] = id;
+ LLFloater* browser = getProfileFloater(id);
+ return browser && browser->isShown();
+}
+
+//static
+LLFloater* LLAvatarActions::getProfileFloater(const LLUUID& id)
+{
+ LLFloaterWebContent *browser = dynamic_cast<LLFloaterWebContent*>
+ (LLFloaterReg::findInstance(get_profile_floater_name(id), LLSD().with("id", id)));
+ return browser;
+}
+
+//static
+void LLAvatarActions::hideProfile(const LLUUID& id)
+{
+ LLSD sd;
+ sd["id"] = id;
+ LLFloater* browser = getProfileFloater(id);
+ if (browser)
+ {
+ browser->closeFloater();
}
}
@@ -402,8 +447,7 @@ void LLAvatarActions::csr(const LLUUID& id, std::string name)
void LLAvatarActions::share(const LLUUID& id)
{
LLSD key;
- LLSideTray::getInstance()->showPanel("sidepanel_inventory", key);
-
+ LLFloaterSidePanelContainer::showPanel("inventory", key);
LLUUID session_id = gIMMgr->computeSessionID(IM_NOTHING_SPECIAL,id);
@@ -421,14 +465,12 @@ void LLAvatarActions::share(const LLUUID& id)
namespace action_give_inventory
{
- typedef std::set<LLUUID> uuid_set_t;
-
/**
* Returns a pointer to 'Add More' inventory panel of Edit Outfit SP.
*/
static LLInventoryPanel* get_outfit_editor_inventory_panel()
{
- LLPanelOutfitEdit* panel_outfit_edit = dynamic_cast<LLPanelOutfitEdit*>(LLSideTray::getInstance()->getPanel("panel_outfit_edit"));
+ LLPanelOutfitEdit* panel_outfit_edit = dynamic_cast<LLPanelOutfitEdit*>(LLFloaterSidePanelContainer::getPanel("appearance", "panel_outfit_edit"));
if (NULL == panel_outfit_edit) return NULL;
LLInventoryPanel* inventory_panel = panel_outfit_edit->findChild<LLInventoryPanel>("folder_view");
@@ -452,18 +494,16 @@ namespace action_give_inventory
/**
* Checks My Inventory visibility.
*/
+
static bool is_give_inventory_acceptable()
{
- LLInventoryPanel* active_panel = get_active_inventory_panel();
- if (!active_panel) return false;
-
// check selection in the panel
- const uuid_set_t inventory_selected_uuids = active_panel->getRootFolder()->getSelectionList();
+ const std::set<LLUUID> inventory_selected_uuids = LLAvatarActions::getInventorySelectedUUIDs();
if (inventory_selected_uuids.empty()) return false; // nothing selected
bool acceptable = false;
- uuid_set_t::const_iterator it = inventory_selected_uuids.begin();
- const uuid_set_t::const_iterator it_end = inventory_selected_uuids.end();
+ std::set<LLUUID>::const_iterator it = inventory_selected_uuids.begin();
+ const std::set<LLUUID>::const_iterator it_end = inventory_selected_uuids.end();
for (; it != it_end; ++it)
{
LLViewerInventoryCategory* inv_cat = gInventory.getCategory(*it);
@@ -506,12 +546,12 @@ namespace action_give_inventory
}
}
- static void build_items_string(const uuid_set_t& inventory_selected_uuids , std::string& items_string)
+ static void build_items_string(const std::set<LLUUID>& inventory_selected_uuids , std::string& items_string)
{
llassert(inventory_selected_uuids.size() > 0);
const std::string& separator = LLTrans::getString("words_separator");
- for (uuid_set_t::const_iterator it = inventory_selected_uuids.begin(); ; )
+ for (std::set<LLUUID>::const_iterator it = inventory_selected_uuids.begin(); ; )
{
LLViewerInventoryCategory* inv_cat = gInventory.getCategory(*it);
if (NULL != inv_cat)
@@ -547,10 +587,7 @@ namespace action_give_inventory
return;
}
- LLInventoryPanel* active_panel = get_active_inventory_panel();
- if (!active_panel) return;
-
- const uuid_set_t inventory_selected_uuids = active_panel->getRootFolder()->getSelectionList();
+ const std::set<LLUUID> inventory_selected_uuids = LLAvatarActions::getInventorySelectedUUIDs();
if (inventory_selected_uuids.empty())
{
return;
@@ -567,8 +604,8 @@ namespace action_give_inventory
// We souldn't open IM session, just calculate session ID for logging purpose. See EXT-6710
const LLUUID session_id = gIMMgr->computeSessionID(IM_NOTHING_SPECIAL, avatar_uuid);
- uuid_set_t::const_iterator it = inventory_selected_uuids.begin();
- const uuid_set_t::const_iterator it_end = inventory_selected_uuids.end();
+ std::set<LLUUID>::const_iterator it = inventory_selected_uuids.begin();
+ const std::set<LLUUID>::const_iterator it_end = inventory_selected_uuids.end();
const std::string& separator = LLTrans::getString("words_separator");
std::string noncopy_item_names;
@@ -631,10 +668,7 @@ namespace action_give_inventory
{
llassert(avatar_names.size() == avatar_uuids.size());
- LLInventoryPanel* active_panel = get_active_inventory_panel();
- if (!active_panel) return;
-
- const uuid_set_t inventory_selected_uuids = active_panel->getRootFolder()->getSelectionList();
+ const std::set<LLUUID> inventory_selected_uuids = LLAvatarActions::getInventorySelectedUUIDs();
if (inventory_selected_uuids.empty())
{
return;
@@ -646,13 +680,55 @@ namespace action_give_inventory
std::string items;
build_items_string(inventory_selected_uuids, items);
+ int folders_count = 0;
+ std::set<LLUUID>::const_iterator it = inventory_selected_uuids.begin();
+
+ //traverse through selected inventory items and count folders among them
+ for ( ; it != inventory_selected_uuids.end() && folders_count <=1 ; ++it)
+ {
+ LLViewerInventoryCategory* inv_cat = gInventory.getCategory(*it);
+ if (NULL != inv_cat)
+ {
+ folders_count++;
+ }
+ }
+
+ // EXP-1599
+ // In case of sharing multiple folders, make the confirmation
+ // dialog contain a warning that only one folder can be shared at a time.
+ std::string notification = (folders_count > 1) ? "ShareFolderConfirmation" : "ShareItemsConfirmation";
LLSD substitutions;
substitutions["RESIDENTS"] = residents;
substitutions["ITEMS"] = items;
LLShareInfo::instance().mAvatarNames = avatar_names;
LLShareInfo::instance().mAvatarUuids = avatar_uuids;
- LLNotificationsUtil::add("ShareItemsConfirmation", substitutions, LLSD(), &give_inventory_cb);
+ LLNotificationsUtil::add(notification, substitutions, LLSD(), &give_inventory_cb);
+ }
+}
+
+
+
+//static
+std::set<LLUUID> LLAvatarActions::getInventorySelectedUUIDs()
+{
+ std::set<LLUUID> inventory_selected_uuids;
+
+ LLInventoryPanel* active_panel = action_give_inventory::get_active_inventory_panel();
+ if (active_panel)
+ {
+ inventory_selected_uuids = active_panel->getRootFolder()->getSelectionList();
+ }
+
+ if (inventory_selected_uuids.empty())
+ {
+ LLSidepanelInventory *sidepanel_inventory = LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory");
+ if (sidepanel_inventory)
+ {
+ inventory_selected_uuids = sidepanel_inventory->getInboxSelectionList();
+ }
}
+
+ return inventory_selected_uuids;
}
//static
@@ -662,6 +738,11 @@ void LLAvatarActions::shareWithAvatars()
LLFloaterAvatarPicker* picker =
LLFloaterAvatarPicker::show(boost::bind(give_inventory, _1, _2), TRUE, FALSE);
+ if (!picker)
+ {
+ return;
+ }
+
picker->setOkBtnEnableCb(boost::bind(is_give_inventory_acceptable));
picker->openFriendsTab();
LLNotificationsUtil::add("ShareNotification");
@@ -682,12 +763,12 @@ bool LLAvatarActions::canShareSelectedItems(LLInventoryPanel* inv_panel /* = NUL
// check selection in the panel
LLFolderView* root_folder = inv_panel->getRootFolder();
- const uuid_set_t inventory_selected_uuids = root_folder->getSelectionList();
+ const std::set<LLUUID> inventory_selected_uuids = root_folder->getSelectionList();
if (inventory_selected_uuids.empty()) return false; // nothing selected
bool can_share = true;
- uuid_set_t::const_iterator it = inventory_selected_uuids.begin();
- const uuid_set_t::const_iterator it_end = inventory_selected_uuids.end();
+ std::set<LLUUID>::const_iterator it = inventory_selected_uuids.begin();
+ const std::set<LLUUID>::const_iterator it_end = inventory_selected_uuids.end();
for (; it != it_end; ++it)
{
LLViewerInventoryCategory* inv_cat = gInventory.getCategory(*it);
@@ -750,6 +831,10 @@ bool LLAvatarActions::canOfferTeleport(const LLUUID& id)
// static
bool LLAvatarActions::canOfferTeleport(const uuid_vec_t& ids)
{
+ // We can't send more than 250 lures in a single message, so disable this
+ // button when there are too many id's selected.
+ if(ids.size() > 250) return false;
+
bool result = true;
for (uuid_vec_t::const_iterator it = ids.begin(); it != ids.end(); ++it)
{
diff --git a/indra/newview/llavataractions.h b/indra/newview/llavataractions.h
index 2db2918eed..748b7cb3d1 100644
--- a/indra/newview/llavataractions.h
+++ b/indra/newview/llavataractions.h
@@ -35,6 +35,7 @@
#include <vector>
class LLInventoryPanel;
+class LLFloater;
/**
* Friend-related actions (add, remove, offer teleport, etc)
@@ -93,6 +94,9 @@ public:
* Show avatar profile.
*/
static void showProfile(const LLUUID& id);
+ static void hideProfile(const LLUUID& id);
+ static bool profileVisible(const LLUUID& id);
+ static LLFloater* getProfileFloater(const LLUUID& id);
/**
* Show avatar on world map.
@@ -194,6 +198,8 @@ public:
*/
static bool canShareSelectedItems(LLInventoryPanel* inv_panel = NULL);
+ static std::set<LLUUID> getInventorySelectedUUIDs();
+
private:
static bool callbackAddFriendWithMessage(const LLSD& notification, const LLSD& response);
static bool handleRemove(const LLSD& notification, const LLSD& response);
diff --git a/indra/newview/llavatariconctrl.cpp b/indra/newview/llavatariconctrl.cpp
index d0f4d19f56..b539ac38ed 100644..100755
--- a/indra/newview/llavatariconctrl.cpp
+++ b/indra/newview/llavatariconctrl.cpp
@@ -75,6 +75,9 @@ void LLAvatarIconIDCache::load ()
LLUUID icon_id;
LLDate date;
+ if (line.length()<=uuid_len*2)
+ continue; // short line, bail out to prevent substr calls throwing exception.
+
std::string avatar_id_str = line.substr(0,uuid_len);
std::string icon_id_str = line.substr(uuid_len,uuid_len);
@@ -141,7 +144,6 @@ LLAvatarIconCtrl::Params::Params()
draw_tooltip("draw_tooltip", true),
default_icon_name("default_icon_name")
{
- name = "avatar_icon";
}
diff --git a/indra/newview/llavatarlist.cpp b/indra/newview/llavatarlist.cpp
index ff7dfccc0a..771419f60a 100644
--- a/indra/newview/llavatarlist.cpp
+++ b/indra/newview/llavatarlist.cpp
@@ -240,6 +240,9 @@ void LLAvatarList::addAvalineItem(const LLUUID& item_id, const LLUUID& session_i
LLAvalineListItem* item = new LLAvalineListItem(/*hide_number=*/false);
item->setAvatarId(item_id, session_id, true, false);
item->setName(item_name);
+ item->showLastInteractionTime(mShowLastInteractionTime);
+ item->showSpeakingIndicator(mShowSpeakingIndicator);
+ item->setOnline(false);
addItem(item, item_id);
mIDs.push_back(item_id);
@@ -286,9 +289,18 @@ void LLAvatarList::refresh()
{
// *NOTE: If you change the UI to show a different string,
// be sure to change the filter code below.
- addNewItem(buddy_id,
- av_name.mDisplayName.empty() ? waiting_str : av_name.mDisplayName,
- LLAvatarTracker::instance().isBuddyOnline(buddy_id));
+ if (LLRecentPeople::instance().isAvalineCaller(buddy_id))
+ {
+ const LLSD& call_data = LLRecentPeople::instance().getData(buddy_id);
+ addAvalineItem(buddy_id, call_data["session_id"].asUUID(), call_data["call_number"].asString());
+ }
+ else
+ {
+ addNewItem(buddy_id,
+ av_name.mDisplayName.empty() ? waiting_str : av_name.mDisplayName,
+ LLAvatarTracker::instance().isBuddyOnline(buddy_id));
+ }
+
modified = true;
nadded++;
}
@@ -440,7 +452,7 @@ void LLAvatarList::addNewItem(const LLUUID& id, const std::string& name, BOOL is
BOOL LLAvatarList::handleRightMouseDown(S32 x, S32 y, MASK mask)
{
BOOL handled = LLUICtrl::handleRightMouseDown(x, y, mask);
- if ( mContextMenu )
+ if ( mContextMenu && !isAvalineItemSelected())
{
uuid_vec_t selected_uuids;
getSelectedUUIDs(selected_uuids);
@@ -449,6 +461,21 @@ BOOL LLAvatarList::handleRightMouseDown(S32 x, S32 y, MASK mask)
return handled;
}
+bool LLAvatarList::isAvalineItemSelected()
+{
+ std::vector<LLPanel*> selected_items;
+ getSelectedItems(selected_items);
+ std::vector<LLPanel*>::iterator it = selected_items.begin();
+
+ for(; it != selected_items.end(); ++it)
+ {
+ if (dynamic_cast<LLAvalineListItem*>(*it))
+ return true;
+ }
+
+ return false;
+}
+
void LLAvatarList::setVisible(BOOL visible)
{
if ( visible == FALSE && mContextMenu )
diff --git a/indra/newview/llavatarlist.h b/indra/newview/llavatarlist.h
index cacbcf7244..4814a88a79 100644
--- a/indra/newview/llavatarlist.h
+++ b/indra/newview/llavatarlist.h
@@ -112,6 +112,8 @@ protected:
private:
+ bool isAvalineItemSelected();
+
bool mIgnoreOnlineStatus;
bool mShowLastInteractionTime;
bool mDirty;
diff --git a/indra/newview/llavatarpropertiesprocessor.cpp b/indra/newview/llavatarpropertiesprocessor.cpp
index 99aeb4cbad..b1cd83a1fb 100644
--- a/indra/newview/llavatarpropertiesprocessor.cpp
+++ b/indra/newview/llavatarpropertiesprocessor.cpp
@@ -160,6 +160,12 @@ void LLAvatarPropertiesProcessor::sendAvatarClassifiedsRequest(const LLUUID& ava
void LLAvatarPropertiesProcessor::sendAvatarPropertiesUpdate(const LLAvatarData* avatar_props)
{
+ if (!gAgent.isInitialized() || (gAgent.getID() == LLUUID::null))
+ {
+ llwarns << "Sending avatarinfo update DENIED - invalid agent" << llendl;
+ return;
+ }
+
llinfos << "Sending avatarinfo update" << llendl;
// This value is required by sendAvatarPropertiesUpdate method.
@@ -168,20 +174,21 @@ void LLAvatarPropertiesProcessor::sendAvatarPropertiesUpdate(const LLAvatarData*
LLMessageSystem *msg = gMessageSystem;
- msg->newMessageFast(_PREHASH_AvatarPropertiesUpdate);
- msg->nextBlockFast(_PREHASH_AgentData);
- msg->addUUIDFast( _PREHASH_AgentID, gAgent.getID() );
- msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID() );
- msg->nextBlockFast(_PREHASH_PropertiesData);
+ msg->newMessageFast (_PREHASH_AvatarPropertiesUpdate);
+ msg->nextBlockFast (_PREHASH_AgentData);
+ msg->addUUIDFast (_PREHASH_AgentID, gAgent.getID() );
+ msg->addUUIDFast (_PREHASH_SessionID, gAgent.getSessionID() );
+ msg->nextBlockFast (_PREHASH_PropertiesData);
- msg->addUUIDFast( _PREHASH_ImageID, avatar_props->image_id);
- msg->addUUIDFast( _PREHASH_FLImageID, avatar_props->fl_image_id);
- msg->addStringFast( _PREHASH_AboutText, avatar_props->about_text);
- msg->addStringFast( _PREHASH_FLAboutText, avatar_props->fl_about_text);
+ msg->addUUIDFast (_PREHASH_ImageID, avatar_props->image_id);
+ msg->addUUIDFast (_PREHASH_FLImageID, avatar_props->fl_image_id);
+ msg->addStringFast (_PREHASH_AboutText, avatar_props->about_text);
+ msg->addStringFast (_PREHASH_FLAboutText, avatar_props->fl_about_text);
msg->addBOOL(_PREHASH_AllowPublish, avatar_props->allow_publish);
msg->addBOOL(_PREHASH_MaturePublish, mature);
msg->addString(_PREHASH_ProfileURL, avatar_props->profile_url);
+
gAgent.sendReliableMessage();
}
diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp
deleted file mode 100644
index 29c2b7565e..0000000000
--- a/indra/newview/llbottomtray.cpp
+++ /dev/null
@@ -1,1733 +0,0 @@
-/**
- * @file llbottomtray.cpp
- * @brief LLBottomTray class implementation
- *
- * $LicenseInfo:firstyear=2009&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h" // must be first include
-
-#define LLBOTTOMTRAY_CPP
-#include "llbottomtray.h"
-
-// library includes
-#include "llfloaterreg.h"
-#include "llflyoutbutton.h"
-#include "lllayoutstack.h"
-#include "llnotifications.h"
-#include "llnotificationsutil.h"
-#include "lltexteditor.h"
-
-// newview includes
-#include "llagentcamera.h"
-#include "llchiclet.h"
-#include "llfloatercamera.h"
-#include "llhints.h"
-#include "llimfloater.h" // for LLIMFloater
-#include "llnearbychatbar.h"
-#include "llspeakbutton.h"
-#include "llsplitbutton.h"
-#include "llsyswellwindow.h"
-#include "lltoolmgr.h"
-#include "llviewerparcelmgr.h"
-
-#include "llviewerwindow.h"
-#include "llsdserialize.h"
-
-// Distance from mouse down on which drag'n'drop should be started.
-#define DRAG_START_DISTANCE 3
-
-static const std::string SORTING_DATA_FILE_NAME = "bottomtray_buttons_order.xml";
-
-LLDefaultChildRegistry::Register<LLBottomtrayButton> bottomtray_button("bottomtray_button");
-
-// LLBottomtrayButton methods
-
-// virtual
-BOOL LLBottomtrayButton::handleHover(S32 x, S32 y, MASK mask)
-{
- S32 screenX, screenY;
- localPointToScreen(x, y, &screenX, &screenY);
- // pass hover to bottomtray
- LLBottomTray::getInstance()->onDraggableButtonHover(screenX, screenY);
- return FALSE;
-}
-//virtual
-BOOL LLBottomtrayButton::handleMouseUp(S32 x, S32 y, MASK mask)
-{
- S32 screenX, screenY;
- localPointToScreen(x, y, &screenX, &screenY);
- // pass mouse up to bottomtray
- LLBottomTray::getInstance()->onDraggableButtonMouseUp(this, screenX, screenY);
- LLButton::handleMouseUp(x, y, mask);
- return FALSE;
-}
-//virtual
-BOOL LLBottomtrayButton::handleMouseDown(S32 x, S32 y, MASK mask)
-{
- S32 screenX, screenY;
- localPointToScreen(x, y, &screenX, &screenY);
- // pass mouse up to bottomtray
- LLBottomTray::getInstance()->onDraggableButtonMouseDown(this, screenX, screenY);
- LLButton::handleMouseDown(x, y, mask);
- return FALSE;
-}
-
-static void update_build_button_enable_state()
-{
- bool can_edit = LLToolMgr::getInstance()->canEdit();
-
- LLBottomTray::getInstance()->getChildView("build_btn")->setEnabled(can_edit);
-}
-
-// Build time optimization, generate extern template once in .cpp file
-template class LLBottomTray* LLSingleton<class LLBottomTray>::getInstance();
-
-namespace
-{
- const std::string& PANEL_CHICLET_NAME = "chiclet_list_panel";
-
- S32 get_panel_min_width(LLLayoutStack* stack, LLView* panel)
- {
- S32 minimal_width = 0;
- llassert(stack);
- if ( stack && panel && panel->getVisible() )
- {
- stack->getPanelMinSize(panel->getName(), &minimal_width);
- }
- return minimal_width;
- }
-
- S32 get_panel_max_width(LLLayoutStack* stack, LLPanel* panel)
- {
- S32 max_width = 0;
- llassert(stack);
- if ( stack && panel && panel->getVisible() )
- {
- stack->getPanelMaxSize(panel->getName(), &max_width);
- }
- return max_width;
- }
-
- S32 get_curr_width(LLUICtrl* ctrl)
- {
- S32 cur_width = 0;
- if ( ctrl && ctrl->getVisible() )
- {
- cur_width = ctrl->getRect().getWidth();
- }
- return cur_width;
- }
-}
-
-class LLBottomTrayLite
- : public LLPanel
-{
-public:
- LLBottomTrayLite()
- : mNearbyChatBar(NULL),
- mChatBarContainer(NULL),
- mGesturePanel(NULL)
- {
- mFactoryMap["chat_bar"] = LLCallbackMap(LLBottomTray::createNearbyChatBar, NULL);
- buildFromFile("panel_bottomtray_lite.xml");
- // Necessary for focus movement among child controls
- setFocusRoot(TRUE);
- }
-
- BOOL postBuild()
- {
- mNearbyChatBar = findChild<LLNearbyChatBar>("chat_bar");
- mChatBarContainer = getChild<LLLayoutPanel>("chat_bar_layout_panel");
- mGesturePanel = getChild<LLPanel>("gesture_panel");
-
- // Hide "show_nearby_chat" button
- if (mNearbyChatBar)
- {
- LLLineEditor* chat_box = mNearbyChatBar->getChatBox();
- LLUICtrl* show_btn = mNearbyChatBar->getChild<LLUICtrl>("show_nearby_chat");
- S32 delta_width = show_btn->getRect().getWidth();
- show_btn->setVisible(FALSE);
- chat_box->reshape(chat_box->getRect().getWidth() + delta_width, chat_box->getRect().getHeight());
- }
- return TRUE;
- }
-
- void onFocusLost()
- {
- if (gAgentCamera.cameraMouselook())
- {
- LLBottomTray::getInstance()->setVisible(FALSE);
- }
- }
-
- LLNearbyChatBar* mNearbyChatBar;
- LLLayoutPanel* mChatBarContainer;
- LLPanel* mGesturePanel;
-};
-
-LLBottomTray::LLBottomTray(const LLSD&)
-: mChicletPanel(NULL),
- mSpeakPanel(NULL),
- mSpeakBtn(NULL),
- mNearbyChatBar(NULL),
- mChatBarContainer(NULL),
- mToolbarStack(NULL),
- mMovementButton(NULL),
- mResizeState(RS_NORESIZE),
- mBottomTrayContextMenu(NULL),
- mCamButton(NULL),
- mBottomTrayLite(NULL),
- mIsInLiteMode(false),
- mDragStarted(false),
- mDraggedItem(NULL),
- mLandingTab(NULL),
- mCheckForDrag(false)
-{
- // Firstly add ourself to IMSession observers, so we catch session events
- // before chiclets do that.
- LLIMMgr::getInstance()->addSessionObserver(this);
-
- mFactoryMap["chat_bar"] = LLCallbackMap(LLBottomTray::createNearbyChatBar, NULL);
-
- buildFromFile("panel_bottomtray.xml");
-
- LLUICtrl::CommitCallbackRegistry::defaultRegistrar().add("CameraPresets.ChangeView", boost::bind(&LLFloaterCamera::onClickCameraItem, _2));
-
- //this is to fix a crash that occurs because LLBottomTray is a singleton
- //and thus is deleted at the end of the viewers lifetime, but to be cleanly
- //destroyed LLBottomTray requires some subsystems that are long gone
- //LLUI::getRootView()->addChild(this);
-
- // Necessary for focus movement among child controls
- setFocusRoot(TRUE);
-
- {
- mBottomTrayLite = new LLBottomTrayLite();
- mBottomTrayLite->setFollowsAll();
- mBottomTrayLite->setVisible(FALSE);
- }
-
- mImageDragIndication = LLUI::getUIImage(getString("DragIndicationImageName"));
- mDesiredNearbyChatWidth = mNearbyChatBar ? mNearbyChatBar->getRect().getWidth() : 0;
-}
-
-LLBottomTray::~LLBottomTray()
-{
- if (!LLSingleton<LLIMMgr>::destroyed())
- {
- LLIMMgr::getInstance()->removeSessionObserver(this);
- }
-
- if (mNearbyChatBar)
- {
- // store custom width of chatbar panel.
- S32 custom_width = mChatBarContainer->getRect().getWidth();
- gSavedSettings.setS32("ChatBarCustomWidth", custom_width);
- }
-
- // emulate previous floater behavior to be hidden on startup.
- // override effect of save_visibility=true.
- // this attribute is necessary to button.initial_callback=Button.SetFloaterToggle works properly:
- // i.g when floater changes its visibility - button changes its toggle state.
- getChild<LLUICtrl>("build_btn")->setControlValue(false);
- getChild<LLUICtrl>("search_btn")->setControlValue(false);
- getChild<LLUICtrl>("world_map_btn")->setControlValue(false);
-}
-
-// *TODO Vadim: why void* ?
-void* LLBottomTray::createNearbyChatBar(void* userdata)
-{
- return new LLNearbyChatBar();
-}
-
-LLNearbyChatBar* LLBottomTray::getNearbyChatBar()
-{
- return mIsInLiteMode ? mBottomTrayLite->mNearbyChatBar : mNearbyChatBar;
-}
-
-LLIMChiclet* LLBottomTray::createIMChiclet(const LLUUID& session_id)
-{
- LLIMChiclet::EType im_chiclet_type = LLIMChiclet::getIMSessionType(session_id);
-
- switch (im_chiclet_type)
- {
- case LLIMChiclet::TYPE_IM:
- return getChicletPanel()->createChiclet<LLIMP2PChiclet>(session_id);
- case LLIMChiclet::TYPE_GROUP:
- return getChicletPanel()->createChiclet<LLIMGroupChiclet>(session_id);
- case LLIMChiclet::TYPE_AD_HOC:
- return getChicletPanel()->createChiclet<LLAdHocChiclet>(session_id);
- case LLIMChiclet::TYPE_UNKNOWN:
- break;
- }
-
- return NULL;
-}
-
-//virtual
-void LLBottomTray::sessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id)
-{
- if (!getChicletPanel()) return;
-
- LLIMModel::LLIMSession* session = LLIMModel::getInstance()->findIMSession(session_id);
- if (!session) return;
-
- // no need to spawn chiclets for participants in P2P calls called through Avaline
- if (session->isP2P() && session->isOtherParticipantAvaline()) return;
-
- if (getChicletPanel()->findChiclet<LLChiclet>(session_id)) return;
-
- LLIMChiclet* chiclet = createIMChiclet(session_id);
- if(chiclet)
- {
- chiclet->setIMSessionName(name);
- chiclet->setOtherParticipantId(other_participant_id);
-
- LLIMFloater::onIMChicletCreated(session_id);
-
- }
- else
- {
- llerrs << "Could not create chiclet" << llendl;
- }
-}
-
-//virtual
-void LLBottomTray::sessionRemoved(const LLUUID& session_id)
-{
- if(getChicletPanel())
- {
- // IM floater should be closed when session removed and associated chiclet closed
- LLIMFloater* iMfloater = LLFloaterReg::findTypedInstance<LLIMFloater>(
- "impanel", session_id);
- if (iMfloater != NULL)
- {
- iMfloater->closeFloater();
- }
-
- getChicletPanel()->removeChiclet(session_id);
- }
-}
-
-void LLBottomTray::sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id)
-{
- //this is only needed in case of outgoing ad-hoc/group chat sessions
- LLChicletPanel* chiclet_panel = getChicletPanel();
- if (chiclet_panel)
- {
- //it should be ad-hoc im chiclet or group im chiclet
- LLChiclet* chiclet = chiclet_panel->findChiclet<LLChiclet>(old_session_id);
- if (chiclet) chiclet->setSessionId(new_session_id);
- }
-}
-
-S32 LLBottomTray::getTotalUnreadIMCount()
-{
- return getChicletPanel()->getTotalUnreadIMCount();
-}
-
-// virtual
-void LLBottomTray::onChange(EStatusType status, const std::string &channelURI, bool proximal)
-{
- // Time it takes to connect to voice channel might be pretty long,
- // so don't expect user login or STATUS_VOICE_ENABLED to be followed by STATUS_JOINED.
- BOOL enable = FALSE;
-
- switch (status)
- {
- // Do not add STATUS_VOICE_ENABLED because voice chat is
- // inactive until STATUS_JOINED
- case STATUS_JOINED:
- enable = TRUE;
- break;
- default:
- enable = FALSE;
- break;
- }
-
- // We have to enable/disable right and left parts of speak button separately (EXT-4648)
- mSpeakBtn->setSpeakBtnEnabled(enable);
- // skipped to avoid button blinking
- if (status != STATUS_JOINING && status!= STATUS_LEFT_CHANNEL)
- {
- mSpeakBtn->setFlyoutBtnEnabled(LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking());
- }
-}
-
-void LLBottomTray::onMouselookModeOut()
-{
- mIsInLiteMode = false;
- mBottomTrayLite->setVisible(FALSE);
- mNearbyChatBar->getChatBox()->setText(mBottomTrayLite->mNearbyChatBar->getChatBox()->getText());
- setVisible(TRUE);
-}
-
-void LLBottomTray::onMouselookModeIn()
-{
- setVisible(FALSE);
-
- // Attach the lite bottom tray
- if (getParent() && mBottomTrayLite->getParent() != getParent())
- getParent()->addChild(mBottomTrayLite);
-
- mBottomTrayLite->setShape(getLocalRect());
- mBottomTrayLite->mNearbyChatBar->getChatBox()->setText(mNearbyChatBar->getChatBox()->getText());
- mBottomTrayLite->mGesturePanel->setVisible(gSavedSettings.getBOOL("ShowGestureButton"));
-
- mIsInLiteMode = true;
-}
-
-//virtual
-// setVisible used instead of onVisibilityChange, since LLAgent calls it on entering/leaving mouselook mode.
-// If bottom tray is already visible in mouselook mode, then onVisibilityChange will not be called from setVisible(true),
-void LLBottomTray::setVisible(BOOL visible)
-{
- if (mIsInLiteMode)
- {
- mBottomTrayLite->setVisible(visible);
- }
- else
- {
- LLPanel::setVisible(visible);
- }
- if(visible)
- gFloaterView->setSnapOffsetBottom(getRect().getHeight());
- else
- gFloaterView->setSnapOffsetBottom(0);
-}
-
-S32 LLBottomTray::notifyParent(const LLSD& info)
-{
- if(info.has("well_empty")) // implementation of EXT-3397
- {
- const std::string chiclet_name = info["well_name"];
-
- // only "im_well" or "notification_well" names are expected.
- // They are set in panel_bottomtray.xml in <chiclet_im_well> & <chiclet_notification>
- llassert("im_well" == chiclet_name || "notification_well" == chiclet_name);
-
- BOOL should_be_visible = !info["well_empty"];
- showWellButton("im_well" == chiclet_name ? RS_IM_WELL : RS_NOTIFICATION_WELL, should_be_visible);
- return 1;
- }
-
- if (info.has("action") && info["action"] == "resize")
- {
- const std::string& name = info["view_name"];
-
- // expected only resize of nearby chatbar
- if (mChatBarContainer->getName() != name) return LLPanel::notifyParent(info);
-
- const S32 new_width = info["new_width"];
-
- processChatbarCustomization(new_width);
-
- return 2;
- }
- return LLPanel::notifyParent(info);
-}
-
-void LLBottomTray::showBottomTrayContextMenu(S32 x, S32 y, MASK mask)
-{
- // We should show BottomTrayContextMenu in last turn
- if (mBottomTrayContextMenu && !LLMenuGL::sMenuContainer->getVisibleMenu())
- {
- //there are no other context menu (IM chiclet etc ), so we can show BottomTrayContextMenu
-
- updateContextMenu(x, y, mask);
- mBottomTrayContextMenu->buildDrawLabels();
- mBottomTrayContextMenu->updateParent(LLMenuGL::sMenuContainer);
- LLMenuGL::showPopup(this, mBottomTrayContextMenu, x, y);
-
- }
-}
-
-void LLBottomTray::updateContextMenu(S32 x, S32 y, MASK mask)
-{
- LLUICtrl* edit_box = mNearbyChatBar->getChild<LLUICtrl>("chat_box");
-
- S32 local_x = x - mChatBarContainer->getRect().mLeft - edit_box->getRect().mLeft;
- S32 local_y = y - mChatBarContainer->getRect().mBottom - edit_box->getRect().mBottom;
-
- bool in_edit_box = edit_box->pointInView(local_x, local_y);
-
- mBottomTrayContextMenu->setItemVisible("Separator", in_edit_box);
- mBottomTrayContextMenu->setItemVisible("NearbyChatBar_Cut", in_edit_box);
- mBottomTrayContextMenu->setItemVisible("NearbyChatBar_Copy", in_edit_box);
- mBottomTrayContextMenu->setItemVisible("NearbyChatBar_Paste", in_edit_box);
- mBottomTrayContextMenu->setItemVisible("NearbyChatBar_Delete", in_edit_box);
- mBottomTrayContextMenu->setItemVisible("NearbyChatBar_Select_All", in_edit_box);
-}
-
-void LLBottomTray::showGestureButton(BOOL visible)
-{
- setTrayButtonVisibleIfPossible(RS_BUTTON_GESTURES, visible);
-}
-
-void LLBottomTray::showMoveButton(BOOL visible)
-{
- setTrayButtonVisibleIfPossible(RS_BUTTON_MOVEMENT, visible);
-}
-
-void LLBottomTray::showCameraButton(BOOL visible)
-{
- setTrayButtonVisibleIfPossible(RS_BUTTON_CAMERA, visible);
-}
-
-void LLBottomTray::showSnapshotButton(BOOL visible)
-{
- setTrayButtonVisibleIfPossible(RS_BUTTON_SNAPSHOT, visible);
-}
-
-void LLBottomTray::toggleMovementControls()
-{
- if (mMovementButton)
- mMovementButton->onCommit();
-}
-
-void LLBottomTray::toggleCameraControls()
-{
- if (mCamButton)
- mCamButton->onCommit();
-}
-
-BOOL LLBottomTray::postBuild()
-{
-
- LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("NearbyChatBar.Action", boost::bind(&LLBottomTray::onContextMenuItemClicked, this, _2));
- LLUICtrl::EnableCallbackRegistry::currentRegistrar().add("NearbyChatBar.EnableMenuItem", boost::bind(&LLBottomTray::onContextMenuItemEnabled, this, _2));
-
- mBottomTrayContextMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_bottomtray.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
- gMenuHolder->addChild(mBottomTrayContextMenu);
-
- mNearbyChatBar = findChild<LLNearbyChatBar>("chat_bar");
- LLHints::registerHintTarget("chat_bar", mNearbyChatBar->LLView::getHandle());
-
- mChatBarContainer = getChild<LLLayoutPanel>("chat_bar_layout_panel");
-
- mToolbarStack = getChild<LLLayoutStack>("toolbar_stack");
- mMovementButton = getChild<LLButton>("movement_btn");
- LLHints::registerHintTarget("move_btn", mMovementButton->getHandle());
- mCamButton = getChild<LLButton>("camera_btn");
- setRightMouseDownCallback(boost::bind(&LLBottomTray::showBottomTrayContextMenu,this, _2, _3,_4));
-
- mSpeakPanel = getChild<LLPanel>("speak_panel");
- mSpeakBtn = getChild<LLSpeakButton>("talk");
-
- // Both parts of speak button should be initially disabled because
- // it takes some time between logging in to world and connecting to voice channel.
- mSpeakBtn->setSpeakBtnEnabled(false);
- mSpeakBtn->setFlyoutBtnEnabled(false);
-
- // Localization tool doesn't understand custom buttons like <talk_button>
- mSpeakBtn->setSpeakToolTip( getString("SpeakBtnToolTip") );
- mSpeakBtn->setShowToolTip( getString("VoiceControlBtnToolTip") );
-
- // Registering Chat Bar to receive Voice client status change notifications.
- LLVoiceClient::getInstance()->addObserver(this);
-
- mNearbyChatBar->getChatBox()->setContextMenu(NULL);
-
- mChicletPanel = getChild<LLChicletPanel>("chiclet_list");
-
- initResizeStateContainers();
-
- setButtonsControlsAndListeners();
-
- initButtonsVisibility();
-
- // update wells visibility:
- showWellButton(RS_IM_WELL, !LLIMWellWindow::getInstance()->isWindowEmpty());
- showWellButton(RS_NOTIFICATION_WELL, !LLNotificationWellWindow::getInstance()->isWindowEmpty());
-
- loadButtonsOrder();
-
- LLViewerParcelMgr::getInstance()->addAgentParcelChangedCallback(boost::bind(&update_build_button_enable_state));
-
- return TRUE;
-}
-
-//Drag-n-drop
-
-void LLBottomTray::onDraggableButtonMouseDown(LLUICtrl* ctrl, S32 x, S32 y)
-{
- if (ctrl == NULL) return;
- LLView* parent_view = ctrl->getParent();
- if(parent_view != NULL)
- {
- // we actually drag'n'drop panel (not button) in code, so have to find a parent
- // of button which called this method on mouse down.
- LLPanel* parent = dynamic_cast<LLPanel*>(parent_view);
- // It may happen that we clicked not usual button, but button inside widget(speak, gesture)
- // so we'll need to get a level higher to reach layout panel as a parent.
- if(parent == NULL) parent = dynamic_cast<LLPanel*>(parent_view->getParent());
- if (parent && parent->getVisible())
- {
- mDraggedItem = parent;
- mCheckForDrag = true;
- mStartX = x;
- mStartY = y;
- }
- }
-}
-
-LLPanel* LLBottomTray::findChildPanelByLocalCoords(S32 x, S32 y)
-{
- LLPanel* ctrl = 0;
- S32 screenX, screenY;
- const child_list_t* list = mToolbarStack->getChildList();
-
- localPointToScreen(x, y, &screenX, &screenY);
-
- // look for a child panel which contains the point (screenX, screenY) in it's rectangle
- for (child_list_const_iter_t i = list->begin(); i != list->end(); ++i)
- {
- LLRect rect;
- localRectToScreen((*i)->getRect(), &rect);
-
- if (rect.pointInRect(screenX, screenY))
- {
- ctrl = dynamic_cast<LLPanel*>(*i);
- break;
- }
- }
-
- return ctrl;
-}
-
-void LLBottomTray::onDraggableButtonHover(S32 x, S32 y)
-{
- // if mouse down on draggable item was done, check whether we should start DnD
- if (mCheckForDrag)
- {
- // Start drag'n'drop if mouse cursor was dragged away frome mouse down location enough
- if(sqrt((float)((mStartX-x)*(mStartX-x)+(mStartY-y)*(mStartY-y))) > DRAG_START_DISTANCE)
- {
- mDragStarted = true;
- mCheckForDrag = false;
- }
- }
- if (mDragStarted)
- {
- // Check whether the cursor is over draggable area, find which panel it is and set is as
- // landing tab for drag'n'drop
- if(isCursorOverDraggableArea(x, y))
- {
- LLPanel* panel = findChildPanelByLocalCoords(x,y);
- if (panel && panel != mDraggedItem) mLandingTab = panel;
- gViewerWindow->getWindow()->setCursor(UI_CURSOR_ARROWDRAG);
- }
- else
- {
- gViewerWindow->getWindow()->setCursor(UI_CURSOR_NO);
- }
- }
-}
-
-bool LLBottomTray::isCursorOverDraggableArea(S32 x, S32 y)
-{
- bool result = getRect().pointInRect(x, y);
- result = result && mNearbyChatBar->calcScreenRect().mRight < x;
- result = result && mChicletPanel->calcScreenRect().mRight > x;
- return result;
-}
-
-void LLBottomTray::updateButtonsOrdersAfterDnD()
-{
- // *TODO: change implementation of this method to support simplify it
- // (and according to future possible changes in the way button order is saved between sessions).
- state_object_map_t::const_iterator it = mStateProcessedObjectMap.begin();
- state_object_map_t::const_iterator it_end = mStateProcessedObjectMap.end();
- // Speak button is currently the only draggable button not in mStateProcessedObjectMap,
- // so if dragged_state is not found in that map, it should be RS_BUTTON_SPEAK. Change this code if any other
- // exclusions from mStateProcessedObjectMap will become draggable.
- EResizeState dragged_state = RS_BUTTON_SPEAK;
- EResizeState landing_state = RS_NORESIZE;
- bool landing_state_found = false;
- // Find states for dragged item and landing tab
- for (; it != it_end; ++it)
- {
- if (it->second == mDraggedItem)
- {
- dragged_state = it->first;
- }
- else if (it->second == mLandingTab)
- {
- landing_state = it->first;
- landing_state_found = true;
- }
- }
-
- // Update order of buttons according to drag'n'drop
- mButtonsOrder.erase(std::find(mButtonsOrder.begin(), mButtonsOrder.end(), dragged_state));
- if (!landing_state_found && mLandingTab == getChild<LLPanel>(PANEL_CHICLET_NAME))
- {
- mButtonsOrder.push_back(dragged_state);
- }
- else
- {
- if (!landing_state_found) landing_state = RS_BUTTON_SPEAK;
- mButtonsOrder.insert(std::find(mButtonsOrder.begin(), mButtonsOrder.end(), landing_state), dragged_state);
- }
- // Synchronize button process order with their order
- resize_state_vec_t::const_iterator it1 = mButtonsOrder.begin();
- const resize_state_vec_t::const_iterator it_end1 = mButtonsOrder.end();
- resize_state_vec_t::iterator it2 = mButtonsProcessOrder.begin();
- for (; it1 != it_end1; ++it1)
- {
- // Skip Speak because it is not in mButtonsProcessOrder(it's the reason why mButtonsOrder was introduced).
- // If any other draggable items will be added to bottomtray later, they should also be skipped here.
- if (*it1 != RS_BUTTON_SPEAK)
- {
- *it2 = *it1;
- ++it2;
- }
- }
-
- saveButtonsOrder();
-}
-
-void LLBottomTray::saveButtonsOrder()
-{
- std::string user_dir = gDirUtilp->getLindenUserDir();
- if (user_dir.empty()) return;
-
- std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, SORTING_DATA_FILE_NAME);
- LLSD settings_llsd;
- int i = 0;
- const resize_state_vec_t::const_iterator it_end = mButtonsOrder.end();
- // we use numbers as keys for map which is saved in file and contains resize states as its values
- for (resize_state_vec_t::const_iterator it = mButtonsOrder.begin(); it != it_end; ++it, i++)
- {
- std::string str = llformat("%d", i);
- settings_llsd[str] = *it;
- }
- llofstream file;
- file.open(filename);
- LLSDSerialize::toPrettyXML(settings_llsd, file);
-}
-
-void LLBottomTray::loadButtonsOrder()
-{
- // load per-resident sorting information
- std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, SORTING_DATA_FILE_NAME);
-
- LLSD settings_llsd;
- llifstream file;
- file.open(filename);
- if (!file.is_open()) return;
-
- LLSDSerialize::fromXML(settings_llsd, file);
-
-
- mButtonsOrder.clear();
- mButtonsProcessOrder.clear();
- int i = 0;
- // getting button order from file
- for (LLSD::map_const_iterator iter = settings_llsd.beginMap();
- iter != settings_llsd.endMap(); ++iter, ++i)
- {
- std::string str = llformat("%d", i);
- EResizeState state = (EResizeState)settings_llsd[str].asInteger();
- mButtonsOrder.push_back(state);
- // RS_BUTTON_SPEAK is skipped, because it shouldn't be in mButtonsProcessOrder (it does not hide or shrink).
- if (state != RS_BUTTON_SPEAK)
- {
- mButtonsProcessOrder.push_back(state);
- }
- }
-
- // There are other panels in layout stack order of which is not saved. Also, panels order of which is saved,
- // are already in layout stack but in wrong order. The most convenient way to place them is moving them
- // to front one by one (because in this case we don't have to pass the panel before which we want to insert our
- // panel to movePanel()). So panels are moved in order from the end of mButtonsOrder vector(reverse iterator is used).
- const resize_state_vec_t::const_reverse_iterator it_end = mButtonsOrder.rend();
- // placing panels in layout stack according to button order which we loaded in previous for
- for (resize_state_vec_t::const_reverse_iterator it = mButtonsOrder.rbegin(); it != it_end; ++it, ++i)
- {
- LLPanel* panel_to_move = *it == RS_BUTTON_SPEAK ? mSpeakPanel : mStateProcessedObjectMap[*it];
- mToolbarStack->movePanel(panel_to_move, NULL, true); // prepend
- }
- // Nearbychat is not stored in order settings file, but it must be the first of the panels, so moving it
- // manually here
- mToolbarStack->movePanel(mChatBarContainer, NULL, true);
-}
-
-void LLBottomTray::onDraggableButtonMouseUp(LLUICtrl* ctrl, S32 x, S32 y)
-{
- //if mouse up happened over area where drop is possible, change order of buttons
- if (mLandingTab != NULL && mDraggedItem != NULL && mDragStarted)
- {
- if(isCursorOverDraggableArea(x, y))
- {
- // change order of panels in layout stack
- mToolbarStack->movePanel(mDraggedItem, (LLPanel*)mLandingTab);
- // change order of buttons in order vectors
- updateButtonsOrdersAfterDnD();
- }
- }
- gViewerWindow->getWindow()->setCursor(UI_CURSOR_ARROW);
- mDragStarted = false;
- mDraggedItem = NULL;
- mLandingTab = NULL;
- mCheckForDrag = false;
-}
-
-void LLBottomTray::draw()
-{
- LLPanel::draw();
- if (mLandingTab)
- {
- static S32 w = mImageDragIndication->getWidth();
- static S32 h = mImageDragIndication->getHeight();
- LLRect rect = mLandingTab->calcScreenRect();
- mImageDragIndication->draw(rect.mLeft - w/2, rect.getHeight(), w, h);
- }
-}
-
-bool LLBottomTray::onContextMenuItemEnabled(const LLSD& userdata)
-{
- std::string item = userdata.asString();
- LLLineEditor* edit_box = mNearbyChatBar->findChild<LLLineEditor>("chat_box");
-
- if (item == "can_cut")
- {
- return edit_box->canCut();
- }
- else if (item == "can_copy")
- {
- return edit_box->canCopy();
- }
- else if (item == "can_paste")
- {
- return edit_box->canPaste();
- }
- else if (item == "can_delete")
- {
- return edit_box->canDoDelete();
- }
- else if (item == "can_select_all")
- {
- return edit_box->canSelectAll() && (edit_box->getLength()>0);
- }
- return true;
-}
-
-
-void LLBottomTray::onContextMenuItemClicked(const LLSD& userdata)
-{
- std::string item = userdata.asString();
- LLLineEditor* edit_box = mNearbyChatBar->findChild<LLLineEditor>("chat_box");
-
- if (item == "cut")
- {
- edit_box->cut();
- }
- else if (item == "copy")
- {
- edit_box->copy();
- }
- else if (item == "paste")
- {
- edit_box->paste();
- edit_box->setFocus(TRUE);
- }
- else if (item == "delete")
- {
- edit_box->doDelete();
- }
- else if (item == "select_all")
- {
- edit_box->selectAll();
- }
-}
-
-void LLBottomTray::log(LLView* panel, const std::string& descr)
-{
- if (NULL == panel) return;
- LLView* layout = panel->getParent();
- lldebugs << descr << ": "
- << "panel: " << panel->getName()
- << ", rect: " << panel->getRect()
-
-
- << "layout: " << layout->getName()
- << ", rect: " << layout->getRect()
- << llendl
- ;
-}
-
-void LLBottomTray::reshape(S32 width, S32 height, BOOL called_from_parent)
-{
- static S32 debug_calling_number = 0;
- lldebugs << "**************************************** " << ++debug_calling_number << llendl;
-
- S32 current_width = getRect().getWidth();
- S32 delta_width = width - current_width;
- lldebugs << "Reshaping: "
- << ", width: " << width
- << ", cur width: " << current_width
- << ", delta_width: " << delta_width
- << ", called_from_parent: " << called_from_parent
- << llendl;
-
- if (mNearbyChatBar) log(mNearbyChatBar, "before");
- if (mChicletPanel) log(mChicletPanel, "before");
-
- // stores width size on which bottom tray is less than width required by its children. EXT-991
- static S32 extra_shrink_width = 0;
- bool should_be_reshaped = true;
-
- if (mChicletPanel && mToolbarStack && mNearbyChatBar)
- {
- // Firstly, update layout stack to ensure we deal with correct panel sizes.
- {
- BOOL saved_anim = mToolbarStack->getAnimate();
- // Set chiclet panel to be autoresized by default.
- mToolbarStack->updatePanelAutoResize(PANEL_CHICLET_NAME, TRUE);
- // Disable animation to prevent layout updating in several frames.
- mToolbarStack->setAnimate(FALSE);
- // Force the updating of layout to reset panels collapse factor.
- mToolbarStack->updateLayout();
- // Restore animate state.
- mToolbarStack->setAnimate(saved_anim);
- }
-
- // bottom tray is narrowed
- if (delta_width < 0)
- {
- if (extra_shrink_width > 0)
- {
- // is world rect was extra shrunk and decreasing again only update this value
- // to delta_width negative
- extra_shrink_width -= delta_width; // use "-=" because delta_width is negative
- should_be_reshaped = false;
- }
- else
- {
- extra_shrink_width = processWidthDecreased(delta_width);
-
- // increase new width to extra_shrink_width value to not reshape less than bottom tray minimum
- width += extra_shrink_width;
- }
- }
- // bottom tray is widen
- else
- {
- if (extra_shrink_width > delta_width)
- {
- // Less than minimum width is more than increasing (delta_width)
- // only reduce it value and make no reshape
- extra_shrink_width -= delta_width;
- should_be_reshaped = false;
- }
- else
- {
- if (extra_shrink_width > 0)
- {
- // If we have some extra shrink width let's reduce delta_width & width
- delta_width -= extra_shrink_width;
- width -= extra_shrink_width;
- extra_shrink_width = 0;
- }
- processWidthIncreased(delta_width);
- }
- }
- }
-
- if (should_be_reshaped)
- {
- lldebugs << "Reshape all children with width: " << width << llendl;
- LLPanel::reshape(width, height, called_from_parent);
- }
-
- if (mNearbyChatBar) log(mNearbyChatBar, "after");
- if (mChicletPanel) log(mChicletPanel, "after");
-
-
- // Restore width of the chatbar on first reshape.
- // we can not to do this from postBuild because reshape is called from parent view on startup
- // creation after it and reset width according to resize logic.
- static bool needs_restore_custom_state = true;
- if (mChatBarContainer && needs_restore_custom_state)
- {
- // restore custom width of chatbar panel.
- S32 new_width = gSavedSettings.getS32("ChatBarCustomWidth");
- if (new_width > 0)
- {
- mDesiredNearbyChatWidth = new_width;
- processChatbarCustomization(new_width);
- mChatBarContainer->reshape(new_width, mChatBarContainer->getRect().getHeight());
- }
- needs_restore_custom_state = false;
- }
-
-}
-
-S32 LLBottomTray::processWidthDecreased(S32 delta_width)
-{
- bool still_should_be_processed = true;
-
- const S32 chiclet_panel_width = mChicletPanel->getParent()->getRect().getWidth();
- const S32 chiclet_panel_min_width = mChicletPanel->getMinWidth();
-
- // There are four steps of processing width decrease. If in one of them required width was reached,
- // further are not needed.
- // 1. Decreasing width of chiclet panel.
- if (chiclet_panel_width > chiclet_panel_min_width)
- {
- // we have some space to decrease chiclet panel
- S32 panel_delta_min = chiclet_panel_width - chiclet_panel_min_width;
-
- S32 delta_panel = llmin(-delta_width, panel_delta_min);
-
- lldebugs << "delta_width: " << delta_width
- << ", panel_delta_min: " << panel_delta_min
- << ", delta_panel: " << delta_panel
- << llendl;
-
- // is chiclet panel width enough to process resizing?
- delta_width += panel_delta_min;
-
- still_should_be_processed = delta_width < 0;
-
- mChicletPanel->getParent()->reshape(mChicletPanel->getParent()->getRect().getWidth() - delta_panel, mChicletPanel->getParent()->getRect().getHeight());
- log(mChicletPanel, "after processing panel decreasing via chiclet panel");
-
- lldebugs << "RS_CHICLET_PANEL"
- << ", delta_width: " << delta_width
- << llendl;
- }
-
- S32 buttons_freed_width = 0;
- // 2. Decreasing width of buttons.
- if (still_should_be_processed)
- {
- processShrinkButtons(delta_width, buttons_freed_width);
- }
- // 3. Decreasing width of nearby chat.
- const S32 chatbar_panel_min_width = get_panel_min_width(mToolbarStack, mChatBarContainer);
- const S32 chatbar_panel_width = mChatBarContainer->getRect().getWidth();
- if (still_should_be_processed && chatbar_panel_width > chatbar_panel_min_width)
- {
- // we have some space to decrease chatbar panel
- S32 panel_delta_min = chatbar_panel_width - chatbar_panel_min_width;
-
- S32 delta_panel = llmin(-delta_width, panel_delta_min);
-
- // whether chatbar panel width is enough to process resizing?
- delta_width += panel_delta_min;
-
- still_should_be_processed = delta_width < 0;
-
- // chatbar should only be shrunk here, not stretched
- if(delta_panel > 0)
- {
- mChatBarContainer->reshape(mNearbyChatBar->getRect().getWidth() - delta_panel, mChatBarContainer->getRect().getHeight());
- }
-
- log(mNearbyChatBar, "after processing panel decreasing via nearby chatbar panel");
-
- lldebugs << "RS_CHATBAR_INPUT"
- << ", delta_panel: " << delta_panel
- << ", delta_width: " << delta_width
- << llendl;
- }
-
- S32 extra_shrink_width = 0;
- // 4. Hiding buttons if needed.
- if (still_should_be_processed)
- {
- processHideButtons(delta_width, buttons_freed_width);
-
- if (delta_width < 0)
- {
- extra_shrink_width = -delta_width;
- llwarns << "There is no enough width to reshape all children: "
- << extra_shrink_width << llendl;
- }
-
- if (buttons_freed_width > 0)
- {
- S32 nearby_needed_width = mDesiredNearbyChatWidth - mNearbyChatBar->getRect().getWidth();
- if (nearby_needed_width > 0)
- {
- S32 compensative_width = nearby_needed_width > buttons_freed_width ? buttons_freed_width : nearby_needed_width;
- log(mNearbyChatBar, "before applying compensative width");
- mChatBarContainer->reshape(mChatBarContainer->getRect().getWidth() + compensative_width, mChatBarContainer->getRect().getHeight() );
- log(mNearbyChatBar, "after applying compensative width");
- lldebugs << buttons_freed_width << llendl;
- }
- }
- }
-
- return extra_shrink_width;
-}
-
-void LLBottomTray::processWidthIncreased(S32 delta_width)
-{
- if (delta_width <= 0) return;
-
- const S32 chiclet_panel_width = mChicletPanel->getParent()->getRect().getWidth();
- static const S32 chiclet_panel_min_width = mChicletPanel->getMinWidth();
-
- const S32 available_width_chiclet = chiclet_panel_width - chiclet_panel_min_width;
-
- // how many room we have to show hidden buttons
- S32 total_available_width = delta_width + available_width_chiclet;
-
- lldebugs << "Processing extending, available width:"
- << ", chiclets - " << available_width_chiclet
- << ", total - " << total_available_width
- << llendl;
-
- S32 available_width = total_available_width;
-
- processShowButtons(available_width);
-
- // if we have to show/extend some buttons but resized delta width is not enough...
- S32 processed_width = total_available_width - available_width;
- if (processed_width > delta_width)
- {
- // ... let's shrink nearby chat & chiclet panels
- S32 required_to_process_width = processed_width;
-
- // 1. use delta width of resizing
- required_to_process_width -= delta_width;
-
- // 2. use width available via decreasing of chiclet panel
- if (required_to_process_width > 0)
- {
- mChicletPanel->getParent()->reshape(mChicletPanel->getParent()->getRect().getWidth() - required_to_process_width, mChicletPanel->getParent()->getRect().getHeight());
- log(mChicletPanel, "after applying compensative width for chiclets: ");
- lldebugs << required_to_process_width << llendl;
- }
-
- }
-
- // shown buttons take some space, rest should be processed by nearby chatbar & chiclet panels
- delta_width -= processed_width;
-
-
- // how many space can nearby chatbar take?
- S32 chatbar_panel_width_ = mChatBarContainer->getRect().getWidth();
- if (delta_width > 0 && chatbar_panel_width_ < mDesiredNearbyChatWidth)
- {
- S32 delta_panel_max = mDesiredNearbyChatWidth - chatbar_panel_width_;
- S32 delta_panel = llmin(delta_width, delta_panel_max);
- lldebugs << "Unprocesed delta width: " << delta_width
- << ", can be applied to chatbar: " << delta_panel_max
- << ", will be applied: " << delta_panel
- << llendl;
-
- delta_width -= delta_panel_max;
- mChatBarContainer->reshape(chatbar_panel_width_ + delta_panel, mChatBarContainer->getRect().getHeight());
- log(mNearbyChatBar, "applied unprocessed delta width");
- }
- if (delta_width > 0)
- {
- processExtendButtons(delta_width);
- }
-}
-
-void LLBottomTray::processShowButtons(S32& available_width)
-{
- // process buttons from left to right
- resize_state_vec_t::const_iterator it = mButtonsProcessOrder.begin();
- const resize_state_vec_t::const_iterator it_end = mButtonsProcessOrder.end();
-
- for (; it != it_end; ++it)
- {
- // is there available space?
- if (available_width <= 0) break;
-
- // try to show next button
- processShowButton(*it, available_width);
- }
-}
-
-bool LLBottomTray::processShowButton(EResizeState shown_object_type, S32& available_width)
-{
- lldebugs << "Trying to show object type: " << shown_object_type << llendl;
- llassert(mStateProcessedObjectMap[shown_object_type] != NULL);
-
- LLPanel* panel = mStateProcessedObjectMap[shown_object_type];
- if (NULL == panel)
- {
- lldebugs << "There is no object to process for state: " << shown_object_type << llendl;
- return false;
- }
- bool can_be_shown = canButtonBeShown(shown_object_type);
- if (can_be_shown)
- {
- //validate if we have enough room to show this button
- const S32 required_width = panel->getRect().getWidth();
- can_be_shown = available_width >= required_width;
- if (can_be_shown)
- {
- available_width -= required_width;
-
- setTrayButtonVisible(shown_object_type, true);
-
- lldebugs << "processed object type: " << shown_object_type
- << ", rest available width: " << available_width
- << llendl;
- mResizeState &= ~shown_object_type;
- }
- }
- return can_be_shown;
-}
-
-void LLBottomTray::processHideButtons(S32& required_width, S32& buttons_freed_width)
-{
- // process buttons from right to left
- resize_state_vec_t::const_reverse_iterator it = mButtonsProcessOrder.rbegin();
- const resize_state_vec_t::const_reverse_iterator it_end = mButtonsProcessOrder.rend();
-
- for (; it != it_end; ++it)
- {
- // is it still necessary to hide a button?
- if (required_width >= 0) break;
-
- // try to hide next button
- processHideButton(*it, required_width, buttons_freed_width);
- }
-}
-
-void LLBottomTray::processHideButton(EResizeState processed_object_type, S32& required_width, S32& buttons_freed_width)
-{
- lldebugs << "Trying to hide object type: " << processed_object_type << llendl;
- llassert(mStateProcessedObjectMap[processed_object_type] != NULL);
-
- LLPanel* panel = mStateProcessedObjectMap[processed_object_type];
- if (NULL == panel)
- {
- lldebugs << "There is no object to process for state: " << processed_object_type << llendl;
- return;
- }
-
- if (panel->getVisible())
- {
- required_width += panel->getRect().getWidth();
-
- if (required_width > 0)
- {
- buttons_freed_width += required_width;
- }
-
- setTrayButtonVisible(processed_object_type, false);
-
- mResizeState |= processed_object_type;
-
- lldebugs << "processing object type: " << processed_object_type
- << ", buttons_freed_width: " << buttons_freed_width
- << llendl;
- }
-}
-
-void LLBottomTray::processShrinkButtons(S32& required_width, S32& buttons_freed_width)
-{
- // process buttons from right to left
- resize_state_vec_t::const_reverse_iterator it = mButtonsProcessOrder.rbegin();
- const resize_state_vec_t::const_reverse_iterator it_end = mButtonsProcessOrder.rend();
-
- // iterate through buttons in the mButtonsProcessOrder first
- for (; it != it_end; ++it)
- {
- // is it still necessary to hide a button?
- if (required_width >= 0) break;
-
- // try to shrink next button
- processShrinkButton(*it, required_width);
- }
-
- // then shrink Speak button
- if (required_width < 0)
- {
-
- S32 panel_min_width = 0;
- std::string panel_name = mSpeakPanel->getName();
- bool success = mToolbarStack->getPanelMinSize(panel_name, &panel_min_width);
- if (!success)
- {
- lldebugs << "Panel was not found to get its min width: " << panel_name << llendl;
- }
- else
- {
- S32 panel_width = mSpeakPanel->getRect().getWidth();
- S32 possible_shrink_width = panel_width - panel_min_width;
-
- if (possible_shrink_width > 0)
- {
- mSpeakBtn->setLabelVisible(false);
- mSpeakPanel->reshape(panel_width - possible_shrink_width, mSpeakPanel->getRect().getHeight());
-
- required_width += possible_shrink_width;
-
- if (required_width > 0)
- {
- buttons_freed_width += required_width;
- }
-
- lldebugs << "Shrunk Speak button panel: " << panel_name
- << ", shrunk width: " << possible_shrink_width
- << ", rest width to process: " << required_width
- << llendl;
- }
- }
- }
-}
-
-void LLBottomTray::processShrinkButton(EResizeState processed_object_type, S32& required_width)
-{
- llassert(mStateProcessedObjectMap[processed_object_type] != NULL);
- LLPanel* panel = mStateProcessedObjectMap[processed_object_type];
- if (NULL == panel)
- {
- lldebugs << "There is no object to process for type: " << processed_object_type << llendl;
- return;
- }
-
- if (panel->getVisible())
- {
- S32 panel_width = panel->getRect().getWidth();
- S32 panel_min_width = 0;
- std::string panel_name = panel->getName();
- bool success = mToolbarStack->getPanelMinSize(panel_name, &panel_min_width);
- S32 possible_shrink_width = panel_width - panel_min_width;
-
- if (!success)
- {
- lldebugs << "Panel was not found to get its min width: " << panel_name << llendl;
- }
- // we have some space to free by shrinking the button
- else if (possible_shrink_width > 0)
- {
- // let calculate real width to shrink
-
- // 1. apply all possible width
- required_width += possible_shrink_width;
-
- // 2. it it is too much...
- if (required_width > 0)
- {
- // reduce applied shrunk width to the excessive value.
- possible_shrink_width -= required_width;
- required_width = 0;
- }
- panel->reshape(panel_width - possible_shrink_width, panel->getRect().getHeight());
-
- lldebugs << "Shrunk panel: " << panel_name
- << ", shrunk width: " << possible_shrink_width
- << ", rest width to process: " << required_width
- << llendl;
- }
- }
-}
-
-
-void LLBottomTray::processExtendButtons(S32& available_width)
-{
- // do not allow extending any buttons if we have some buttons hidden via resize
- if (mResizeState & RS_BUTTONS_CAN_BE_HIDDEN) return;
-
- // process buttons from left to right
- resize_state_vec_t::const_iterator it = mButtonsProcessOrder.begin();
- const resize_state_vec_t::const_iterator it_end = mButtonsProcessOrder.end();
-
- // iterate through buttons in the mButtonsProcessOrder first
- for (; it != it_end; ++it)
- {
- // is there available space?
- if (available_width <= 0) break;
-
- // try to extend next button
- processExtendButton(*it, available_width);
- }
-
- // then try to extend Speak button
- if (available_width > 0)
- {
- S32 panel_max_width = mObjectDefaultWidthMap[RS_BUTTON_SPEAK];
- S32 panel_width = mSpeakPanel->getRect().getWidth();
- S32 possible_extend_width = panel_max_width - panel_width;
- if (possible_extend_width >= 0 && possible_extend_width <= available_width) // HACK: this button doesn't change size so possible_extend_width will be 0
- {
- mSpeakBtn->setLabelVisible(true);
- mSpeakPanel->reshape(panel_max_width, mSpeakPanel->getRect().getHeight());
- log(mSpeakBtn, "speak button is extended");
-
- available_width -= possible_extend_width;
-
- lldebugs << "Extending Speak button panel: " << mSpeakPanel->getName()
- << ", extended width: " << possible_extend_width
- << ", rest width to process: " << available_width
- << llendl;
- }
- }
-}
-
-void LLBottomTray::processExtendButton(EResizeState processed_object_type, S32& available_width)
-{
- llassert(mStateProcessedObjectMap[processed_object_type] != NULL);
- LLPanel* panel = mStateProcessedObjectMap[processed_object_type];
- if (NULL == panel)
- {
- lldebugs << "There is no object to process for type: " << processed_object_type << llendl;
- return;
- }
-
- if (!panel->getVisible()) return;
-
- S32 panel_max_width = mObjectDefaultWidthMap[processed_object_type];
- S32 panel_width = panel->getRect().getWidth();
- S32 possible_extend_width = panel_max_width - panel_width;
-
- if (possible_extend_width > 0)
- {
- // let calculate real width to extend
-
- // 1. apply all possible width
- available_width -= possible_extend_width;
-
- // 2. it it is too much...
- if (available_width < 0)
- {
- // reduce applied extended width to the excessive value.
- possible_extend_width += available_width;
- available_width = 0;
- }
- panel->reshape(panel_width + possible_extend_width, panel->getRect().getHeight());
-
- lldebugs << "Extending panel: " << panel->getName()
- << ", extended width: " << possible_extend_width
- << ", rest width to process: " << available_width
- << llendl;
- }
-}
-
-bool LLBottomTray::canButtonBeShown(EResizeState processed_object_type) const
-{
- // 0. Check if passed button was previously hidden on resize
- bool can_be_shown = mResizeState & processed_object_type;
- if (can_be_shown)
- {
- // Yes, it was. Lets now check that all buttons before it (that can be hidden on resize)
- // are already shown
-
- // process buttons in direct order (from left to right)
- resize_state_vec_t::const_iterator it = mButtonsProcessOrder.begin();
- const resize_state_vec_t::const_iterator it_end = mButtonsProcessOrder.end();
-
- // 1. Find and accumulate all buttons types before one passed into the method.
- MASK buttons_before_mask = RS_NORESIZE;
- for (; it != it_end; ++it)
- {
- const EResizeState button_type = *it;
- if (button_type == processed_object_type) break;
-
- buttons_before_mask |= button_type;
- }
-
- // 2. Check if some previous buttons are still hidden on resize
- can_be_shown = !(buttons_before_mask & mResizeState);
- }
- return can_be_shown;
-}
-
-void LLBottomTray::initResizeStateContainers()
-{
- // init map with objects should be processed for each type
- mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_GESTURES, getChild<LLPanel>("gesture_panel")));
- mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_MOVEMENT, getChild<LLPanel>("movement_panel")));
- mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_CAMERA, getChild<LLPanel>("cam_panel")));
- mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SNAPSHOT, getChild<LLPanel>("snapshot_panel")));
- mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_BUILD, getChild<LLPanel>("build_btn_panel")));
- mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SEARCH, getChild<LLPanel>("search_btn_panel")));
- mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_WORLD_MAP, getChild<LLPanel>("world_map_btn_panel")));
- mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_MINI_MAP, getChild<LLPanel>("mini_map_btn_panel")));
-
- // init an order of processed buttons
- mButtonsProcessOrder.push_back(RS_BUTTON_GESTURES);
- mButtonsProcessOrder.push_back(RS_BUTTON_MOVEMENT);
- mButtonsProcessOrder.push_back(RS_BUTTON_CAMERA);
- mButtonsProcessOrder.push_back(RS_BUTTON_SNAPSHOT);
- mButtonsProcessOrder.push_back(RS_BUTTON_BUILD);
- mButtonsProcessOrder.push_back(RS_BUTTON_SEARCH);
- mButtonsProcessOrder.push_back(RS_BUTTON_WORLD_MAP);
- mButtonsProcessOrder.push_back(RS_BUTTON_MINI_MAP);
-
- mButtonsOrder.push_back(RS_BUTTON_SPEAK);
- mButtonsOrder.insert(mButtonsOrder.end(), mButtonsProcessOrder.begin(), mButtonsProcessOrder.end());
-
- // init default widths
-
- // process buttons that can be hidden on resize...
- resize_state_vec_t::const_iterator it = mButtonsProcessOrder.begin();
- const resize_state_vec_t::const_iterator it_end = mButtonsProcessOrder.end();
-
- for (; it != it_end; ++it)
- {
- const EResizeState button_type = *it;
- // is there an appropriate object?
- llassert(mStateProcessedObjectMap.count(button_type) > 0);
- if (0 == mStateProcessedObjectMap.count(button_type)) continue;
-
- // set default width for it.
- mObjectDefaultWidthMap[button_type] = mStateProcessedObjectMap[button_type]->getRect().getWidth();
- }
-
- // ... and add Speak button because it also can be shrunk.
- mObjectDefaultWidthMap[RS_BUTTON_SPEAK] = mSpeakPanel->getRect().getWidth();
-
-}
-
-// this method must be called before restoring of the chat entry field on startup
-// because it resets chatbar's width according to resize logic.
-void LLBottomTray::initButtonsVisibility()
-{
- setVisibleAndFitWidths(RS_BUTTON_GESTURES, gSavedSettings.getBOOL("ShowGestureButton"));
- setVisibleAndFitWidths(RS_BUTTON_MOVEMENT, gSavedSettings.getBOOL("ShowMoveButton"));
- setVisibleAndFitWidths(RS_BUTTON_CAMERA, gSavedSettings.getBOOL("ShowCameraButton"));
- setVisibleAndFitWidths(RS_BUTTON_SNAPSHOT, gSavedSettings.getBOOL("ShowSnapshotButton"));
- setVisibleAndFitWidths(RS_BUTTON_BUILD, gSavedSettings.getBOOL("ShowBuildButton"));
- setVisibleAndFitWidths(RS_BUTTON_SEARCH, gSavedSettings.getBOOL("ShowSearchButton"));
- setVisibleAndFitWidths(RS_BUTTON_WORLD_MAP, gSavedSettings.getBOOL("ShowWorldMapButton"));
- setVisibleAndFitWidths(RS_BUTTON_MINI_MAP, gSavedSettings.getBOOL("ShowMiniMapButton"));
-}
-
-void LLBottomTray::setButtonsControlsAndListeners()
-{
- gSavedSettings.getControl("ShowGestureButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_GESTURES, _2));
- gSavedSettings.getControl("ShowMoveButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_MOVEMENT, _2));
- gSavedSettings.getControl("ShowCameraButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_CAMERA, _2));
- gSavedSettings.getControl("ShowSnapshotButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_SNAPSHOT, _2));
- gSavedSettings.getControl("ShowBuildButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_BUILD, _2));
- gSavedSettings.getControl("ShowSearchButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_SEARCH, _2));
- gSavedSettings.getControl("ShowWorldMapButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_WORLD_MAP, _2));
- gSavedSettings.getControl("ShowMiniMapButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_MINI_MAP, _2));
-
-
- LLButton* build_btn = getChild<LLButton>("build_btn");
- // set control name for Build button. It is not enough to link it with Button.SetFloaterToggle in xml
- std::string vis_control_name = LLFloaterReg::declareVisibilityControl("build");
- // Set the button control value (toggle state) to the floater visibility control (Sets the value as well)
- build_btn->setControlVariable(LLFloater::getControlGroup()->getControl(vis_control_name));
-}
-
-bool LLBottomTray::toggleShowButton(LLBottomTray::EResizeState button_type, const LLSD& new_visibility)
-{
- if (LLBottomTray::instanceExists())
- {
- LLBottomTray::getInstance()->setTrayButtonVisibleIfPossible(button_type, new_visibility.asBoolean());
- }
- return true;
-}
-
-void LLBottomTray::setTrayButtonVisible(EResizeState shown_object_type, bool visible)
-{
- llassert(mStateProcessedObjectMap[shown_object_type] != NULL);
- LLPanel* panel = mStateProcessedObjectMap[shown_object_type];
- if (NULL == panel)
- {
- lldebugs << "There is no object to show for state: " << shown_object_type << llendl;
- return;
- }
-
- panel->setVisible(visible);
-}
-
-void LLBottomTray::setTrayButtonVisibleIfPossible(EResizeState shown_object_type, bool visible, bool raise_notification)
-{
- if (!setVisibleAndFitWidths(shown_object_type, visible) && visible && raise_notification)
- {
- LLNotificationsUtil::add("BottomTrayButtonCanNotBeShown",
- LLSD(),
- LLSD(),
- LLNotificationFunctorRegistry::instance().DONOTHING);
- }
-}
-
-bool LLBottomTray::setVisibleAndFitWidths(EResizeState object_type, bool visible)
-{
- LLPanel* cur_panel = mStateProcessedObjectMap[object_type];
- if (NULL == cur_panel)
- {
- lldebugs << "There is no object to process for state: " << object_type << llendl;
- return false;
- }
-
- bool is_set = true;
-
- if (visible)
- {
- // Assume that only chiclet panel can be auto-resized
- const S32 available_width =
- mChicletPanel->getParent()->getRect().getWidth() - mChicletPanel->getMinWidth();
-
- S32 preferred_width = mObjectDefaultWidthMap[object_type];
- S32 current_width = cur_panel->getRect().getWidth();
- S32 result_width = 0;
- bool decrease_width = false;
-
- // Mark this button to be shown
- mResizeState |= object_type;
-
- if (preferred_width > 0 && available_width >= preferred_width)
- {
- result_width = preferred_width;
- }
- else if (available_width >= current_width)
- {
- result_width = current_width;
- }
- else
- {
- // Calculate the possible shrunk width as difference between current and minimal widths
- const S32 chatbar_shrunk_width =
- mChatBarContainer->getRect().getWidth() - get_panel_min_width(mToolbarStack, mChatBarContainer);
-
- S32 sum_of_min_widths = get_panel_min_width(mToolbarStack, mSpeakPanel);
- S32 sum_of_curr_widths = get_curr_width(mSpeakPanel);
-
- resize_state_vec_t::const_iterator it = mButtonsProcessOrder.begin();
- const resize_state_vec_t::const_iterator it_end = mButtonsProcessOrder.end();
-
- for (; it != it_end; ++it)
- {
- LLPanel * cur_panel = mStateProcessedObjectMap[*it];
- sum_of_min_widths += get_panel_min_width(mToolbarStack, cur_panel);
- sum_of_curr_widths += get_curr_width(cur_panel);
- }
-
- const S32 possible_shrunk_width =
- chatbar_shrunk_width + (sum_of_curr_widths - sum_of_min_widths);
-
- // Minimal width of current panel
- S32 minimal_width = 0;
- mToolbarStack->getPanelMinSize(cur_panel->getName(), &minimal_width);
-
- if ( (available_width + possible_shrunk_width) >= minimal_width)
- {
- // There is enough space for minimal width, but set the result_width
- // to preferred_width so buttons widths decreasing will be done in predefined order
- result_width = (preferred_width > 0) ? preferred_width : current_width;
- decrease_width = true;
- }
- else
- {
- // Nothing can be done, give up...
- return false;
- }
- }
-
- if (result_width != current_width)
- {
- cur_panel->reshape(result_width, cur_panel->getRect().getHeight());
- current_width = result_width;
- }
-
- is_set = processShowButton(object_type, current_width);
-
- // Shrink buttons if needed
- if (is_set && decrease_width)
- {
- processWidthDecreased( -result_width);
- }
- }
- else
- {
- const S32 delta_width = get_curr_width(cur_panel);
-
- setTrayButtonVisible(object_type, false);
-
- // Mark button NOT to show while future bottom tray extending
- mResizeState &= ~object_type;
-
- // Extend other buttons if need
- if (delta_width)
- {
- processWidthIncreased(delta_width);
- }
- }
- return is_set;
-}
-
-void LLBottomTray::showWellButton(EResizeState object_type, bool visible)
-{
- llassert( ((RS_NOTIFICATION_WELL | RS_IM_WELL) & object_type) == object_type );
-
- const std::string panel_name = RS_IM_WELL == object_type ? "im_well_panel" : "notification_well_panel";
-
- LLView * panel = getChild<LLView>(panel_name);
-
- // if necessary visibility is set nothing to do here
- if (panel->getVisible() == (BOOL)visible) return;
-
- S32 panel_width = panel->getRect().getWidth();
- panel->setVisible(visible);
-
- if (visible)
- {
- // method assumes that input param is a negative value
- processWidthDecreased(-panel_width);
- }
- else
- {
- processWidthIncreased(panel_width);
- }
-}
-
-void LLBottomTray::processChatbarCustomization(S32 new_width)
-{
- if (NULL == mNearbyChatBar) return;
-
- const S32 delta_width = mChatBarContainer->getRect().getWidth() - new_width;
-
- if (delta_width == 0) return;
-
- mDesiredNearbyChatWidth = new_width;
-
- LLView * chiclet_layout_panel = mChicletPanel->getParent();
- const S32 chiclet_min_width = get_panel_min_width(mToolbarStack, chiclet_layout_panel);
- const S32 chiclet_panel_width = chiclet_layout_panel->getRect().getWidth();
- const S32 available_chiclet_shrink_width = chiclet_panel_width - chiclet_min_width;
- llassert(available_chiclet_shrink_width >= 0);
-
- if (delta_width > 0) // panel gets narrowly
- {
- S32 total_possible_width = delta_width + available_chiclet_shrink_width;
- processShowButtons(total_possible_width);
- processExtendButtons(total_possible_width);
- }
- // here (delta_width < 0) // panel gets wider
- else //if (-delta_width > available_chiclet_shrink_width)
- {
- S32 required_width = delta_width + available_chiclet_shrink_width;
- S32 buttons_freed_width = 0;
- processShrinkButtons(required_width, buttons_freed_width);
- processHideButtons(required_width, buttons_freed_width);
- }
-}
-
-//EOF
diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h
deleted file mode 100644
index 8d8a42c553..0000000000
--- a/indra/newview/llbottomtray.h
+++ /dev/null
@@ -1,489 +0,0 @@
-/**
-* @file llbottomtray.h
-* @brief LLBottomTray class header file
-*
-* $LicenseInfo:firstyear=2009&license=viewerlgpl$
-* Second Life Viewer Source Code
-* Copyright (C) 2010, Linden Research, Inc.
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU Lesser General Public
-* License as published by the Free Software Foundation;
-* version 2.1 of the License only.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-* Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public
-* License along with this library; if not, write to the Free Software
-* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-*
-* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
-* $/LicenseInfo$
-*/
-
-#ifndef LL_LLBOTTOMPANEL_H
-#define LL_LLBOTTOMPANEL_H
-
-#include "llpanel.h"
-#include "llimview.h"
-#include "llbutton.h"
-
-class LLChicletPanel;
-class LLLayoutStack;
-class LLSpeakButton;
-class LLNearbyChatBar;
-class LLIMChiclet;
-class LLBottomTrayLite;
-class LLLayoutPanel;
-class LLMenuGL;
-
-// Build time optimization, generate once in .cpp file
-#ifndef LLBOTTOMTRAY_CPP
-extern template class LLBottomTray* LLSingleton<class LLBottomTray>::getInstance();
-#endif
-
-/**
- * Class for buttons that should have drag'n'drop ability in bottomtray.
- * These buttons pass mouse events handling to bottomtray.
- */
-class LLBottomtrayButton : public LLButton
-{
-public:
- struct Params : public LLInitParam::Block<Params, LLButton::Params>
- {
- Params(){}
- };
- /*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask);
- /*virtual*/ BOOL handleMouseUp(S32 x, S32 y, MASK mask);
- /*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask);
-
-protected:
- LLBottomtrayButton(const Params& p)
- : LLButton(p)
- {
-
- }
- friend class LLUICtrlFactory;
-};
-
-class LLBottomTray
- : public LLSingleton<LLBottomTray>
- , public LLPanel
- , public LLIMSessionObserver
- , public LLVoiceClientStatusObserver
-{
- LOG_CLASS(LLBottomTray);
- friend class LLSingleton<LLBottomTray>;
- friend class LLBottomTrayLite;
-public:
- ~LLBottomTray();
-
- BOOL postBuild();
-
- LLChicletPanel* getChicletPanel() {return mChicletPanel;}
- LLNearbyChatBar* getNearbyChatBar();
-
- void onCommitGesture(LLUICtrl* ctrl);
-
- // LLIMSessionObserver observe triggers
- virtual void sessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id);
- virtual void sessionRemoved(const LLUUID& session_id);
- void sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id);
-
- S32 getTotalUnreadIMCount();
-
- virtual void reshape(S32 width, S32 height, BOOL called_from_parent);
-
- virtual void setVisible(BOOL visible);
-
- /*virtual*/ S32 notifyParent(const LLSD& info);
-
- // Implements LLVoiceClientStatusObserver::onChange() to enable the speak
- // button when voice is available
- /*virtual*/ void onChange(EStatusType status, const std::string &channelURI, bool proximal);
-
- void showBottomTrayContextMenu(S32 x, S32 y, MASK mask);
-
- void showGestureButton(BOOL visible);
- void showMoveButton(BOOL visible);
- void showCameraButton(BOOL visible);
- void showSnapshotButton(BOOL visible);
-
- void toggleMovementControls();
- void toggleCameraControls();
-
- void onMouselookModeIn();
- void onMouselookModeOut();
-
- /**
- * Creates IM Chiclet based on session type (IM chat or Group chat)
- */
- LLIMChiclet* createIMChiclet(const LLUUID& session_id);
-
- // Below are methods that were introduced or overriden in bottomtray to handle drag'n'drop
-
- virtual void draw();
-
- /**
- * These three methods handle drag'n'drop, they may be called directly from child buttons.
- * handleHover and other virtual handle* couldn't be used here, because we should call LLPanel::handle*,
- * but x and y here are often outside of bottomtray.
- */
- void onDraggableButtonHover(S32 x, S32 y);
- void onDraggableButtonMouseDown(LLUICtrl* button, S32 x, S32 y);
- void onDraggableButtonMouseUp(LLUICtrl* button, S32 x, S32 y);
-
-
-private:
- typedef enum e_resize_status_type
- {
- RS_NORESIZE = 0x0000
- , RS_CHICLET_PANEL = 0x0001
- , RS_CHATBAR_INPUT = 0x0002
- , RS_BUTTON_SNAPSHOT = 0x0004
- , RS_BUTTON_CAMERA = 0x0008
- , RS_BUTTON_MOVEMENT = 0x0010
- , RS_BUTTON_GESTURES = 0x0020
- , RS_BUTTON_SPEAK = 0x0040
- , RS_IM_WELL = 0x0080
- , RS_NOTIFICATION_WELL = 0x0100
- , RS_BUTTON_BUILD = 0x0200
- , RS_BUTTON_SEARCH = 0x0400
- , RS_BUTTON_WORLD_MAP = 0x0800
- , RS_BUTTON_MINI_MAP = 0x1000
-
- /*
- Once new button that can be hidden on resize is added don't forget to update related places:
- - RS_BUTTONS_CAN_BE_HIDDEN enum value below.
- - initResizeStateContainers(): mStateProcessedObjectMap and mButtonsProcessOrder
- */
-
- /**
- * Specifies buttons which can be hidden when bottom tray is shrunk.
- * They are: Gestures, Movement (Move), Camera (View), Snapshot
- * new: Build, Search, Map, World Map, Mini-Map.
- */
- , RS_BUTTONS_CAN_BE_HIDDEN = RS_BUTTON_SNAPSHOT | RS_BUTTON_CAMERA | RS_BUTTON_MOVEMENT | RS_BUTTON_GESTURES
- | RS_BUTTON_BUILD | RS_BUTTON_SEARCH | RS_BUTTON_WORLD_MAP | RS_BUTTON_MINI_MAP
- }EResizeState;
-
- // Below are three methods that were introduced to handle drag'n'drop
-
- /**
- * finds a panel under the specified LOCAL point
- */
- LLPanel* findChildPanelByLocalCoords(S32 x, S32 y);
-
- /**
- * checks whether the cursor is over an area where the dragged button may be dropped
- */
- bool isCursorOverDraggableArea(S32 x, S32 y);
-
- /**
- * Updates process(shrink/show/hide) order of buttons and order in which they'll be stored for further save/load.
- * It is called when dragged button is dropped
- */
- void updateButtonsOrdersAfterDnD();
-
- // saves order of buttons to file on disk
- void saveButtonsOrder();
- // reads order of buttons from file on disk
- void loadButtonsOrder();
-
- /**
- * Updates child controls size and visibility when it is necessary to reduce total width.
- *
- * Process order:
- * - reduce chiclet panel to its minimal width;
- * - reduce chatbar to its minimal width;
- * - reduce visible buttons from right to left to their minimal width;
- * - hide visible buttons from right to left;
- * When button is hidden chatbar extended to fill released space if it is necessary.
- *
- * @param[in] delta_width - value by which bottom tray should be shrunk. It is a negative value.
- * @return positive value which bottom tray can not process when it reaches its minimal width.
- * Zero if there was enough space to process delta_width.
- */
- S32 processWidthDecreased(S32 delta_width);
-
- /**
- * Updates child controls size and visibility when it is necessary to extend total width.
- *
- * Process order:
- * - show invisible buttons should be shown from left to right if possible;
- * - extend visible buttons from left to right to their default width;
- * - extend chatbar to its maximal width;
- * - extend chiclet panel to all available space;
- * When chatbar & chiclet panels are wider then their minimal width they can be reduced to allow
- * a button gets visible in case if passed delta_width is not enough (chatbar first).
- *
- * @param[in] delta_width - value by which bottom tray should be extended. It is a positive value.
- */
- void processWidthIncreased(S32 delta_width);
-
- /** helper function to log debug messages */
- void log(LLView* panel, const std::string& descr);
-
- /**
- * Tries to show hidden by resize buttons using available width.
- *
- * Gets buttons visible if there is enough space. Reduces available_width in this case.
- *
- * @params[in, out] available_width - reference to available width to be used to show buttons.
- * @see processShowButton()
- */
- void processShowButtons(S32& available_width);
-
- /**
- * Tries to show panel with specified button using available width.
- *
- * Shows button specified by type if there is enough space. Reduces available_width in this case.
- *
- * @params[in] shown_object_type - type of button to be shown.
- * @params[in, out] available_width - reference to available width to be used to show button.
- *
- * @return true if button can be shown, false otherwise
- */
- bool processShowButton(EResizeState shown_object_type, S32& available_width);
-
- /**
- * Hides visible panels with all buttons that may be hidden by resize if it is necessary.
- *
- * When button gets hidden some space is released in bottom tray.
- * This space is taken into account for several consecutive calls for several buttons.
- *
- * @params[in, out] required_width - reference to required width to be released. This is a negative value.
- * Its absolute value is decreased by shown panel width.
- * @params[in, out] buttons_freed_width - reference to value released over required one.
- * If panel's width is more than required difference is added to buttons_freed_width.
- * @see processHideButton()
- */
- void processHideButtons(S32& required_width, S32& buttons_freed_width);
-
- /**
- * Hides panel with specified button if it is visible.
- *
- * When button gets hidden some space is released in bottom tray.
- * This space is taken into account for several consecutive calls for several buttons.
- *
- * @params[in] processed_object_type - type of button to be hide.
- * @params[in, out] required_width - reference to required width to be released. This is a negative value.
- * Its absolute value is decreased by panel width.
- * @params[in, out] buttons_freed_width - reference to value released over required one.
- * If panel's width is more than required difference is added to buttons_freed_width.
- */
- void processHideButton(EResizeState processed_object_type, S32& required_width, S32& buttons_freed_width);
-
- /**
- * Shrinks shown buttons to reduce total taken space.
- *
- * Shrinks buttons that may be shrunk smoothly first. Then shrinks Speak button.
- *
- * @param[in, out] required_width - reference to width value which should be released when buttons are shrunk. It is a negative value.
- * It is increased on the value processed by buttons.
- * @params[in, out] buttons_freed_width - reference to value released over required one.
- * If width of panel with Speak button is more than required that difference is added
- * to buttons_freed_width.
- * This is because Speak button shrinks discretely unlike other buttons which are changed smoothly.
- */
- void processShrinkButtons(S32& required_width, S32& buttons_freed_width);
-
- /**
- * Shrinks panel with specified button if it is visible.
- *
- * @params[in] processed_object_type - type of button to be shrunk.
- * @param[in, out] required_width - reference to width value which should be released when button is shrunk. It is a negative value.
- * It is increased on the value released by the button.
- */
- void processShrinkButton(EResizeState processed_object_type, S32& required_width);
-
- /**
- * Extends shown buttons to increase total taken space.
- *
- * Extends buttons that may be extended smoothly first. Then extends Speak button.
- *
- * @param[in, out] available_width - reference to width value which buttons can use to be extended.
- * It is a positive value. It is decreased on the value processed by buttons.
- */
- void processExtendButtons(S32& available_width);
-
- /**
- * Extends shown button to increase total taken space.
- *
- * @params[in] processed_object_type - type of button to be extended.
- * @param[in, out] available_width - reference to width value which button can use to be extended.
- * It is a positive value. It is decreased on the value processed by buttons.
- */
- void processExtendButton(EResizeState processed_object_type, S32& available_width);
-
- /**
- * Determines if specified by type object can be shown. It should be hidden by shrink before.
- *
- * Processes buttons a such way to show buttons in constant order:
- * - Gestures, Move, View, Snapshot
- */
- bool canButtonBeShown(EResizeState processed_object_type) const;
-
- /**
- * Initializes all containers stored data related to children resize state.
- *
- * @see mStateProcessedObjectMap
- * @see mObjectDefaultWidthMap
- * @see mButtonsProcessOrder
- */
- void initResizeStateContainers();
-
- /**
- * Initializes buttons' visibility depend on stored Control Settings.
- */
- void initButtonsVisibility();
-
- /**
- * Initializes listeners of Control Settings to toggle appropriate buttons' visibility.
- *
- * @see toggleShowButton()
- */
- void setButtonsControlsAndListeners();
-
- /**
- * Toggles visibility of specified button depend on passed value.
- *
- * @param button_type - type of button to be toggled
- * @param new_visibility - new visibility of the button
- *
- * @see setButtonsControlsAndListeners()
- */
- static bool toggleShowButton(EResizeState button_type, const LLSD& new_visibility);
-
- /**
- * Sets passed visibility to object specified by resize type.
- */
- void setTrayButtonVisible(EResizeState shown_object_type, bool visible);
-
- /**
- * Sets passed visibility to object specified by resize type if it is possible.
- *
- * If it is impossible to show required button due to there is no enough room in bottom tray
- * it will no be shown. Is called via context menu commands.
- * In this case Alert Dialog will be shown to notify user about that.
- *
- * Method also stores resize state to be processed while future bottom tray extending:
- * - if hidden while resizing button should be hidden it will not be shown while extending;
- * - if hidden via context menu button should be shown but there is no enough room for now
- * it will be shown while extending.
- */
- void setTrayButtonVisibleIfPossible(EResizeState shown_object_type, bool visible, bool raise_notification = true);
-
- /**
- * Sets passed visibility to required button and fit widths of shown
- * buttons(notice that method can shrink widths to
- * allocate needed room in bottom tray).
- * Returns true if visibility of required button was set.
- */
- bool setVisibleAndFitWidths(EResizeState object_type, bool visible);
-
- /**
- * Shows/hides panel with specified well button (IM or Notification)
- *
- * @param[in] object_type - type of well button to be processed.
- * Must be one of RS_IM_WELL or RS_NOTIFICATION_WELL.
- * @param[in] visible - flag specified whether button should be shown or hidden.
- */
- void showWellButton(EResizeState object_type, bool visible);
-
- /**
- * Handles a customization of chatbar width.
- *
- * When chatbar gets wider layout stack will reduce chiclet panel (it is auto-resizable)
- * But once chiclet panel reaches its minimal width Stack will force to reduce buttons width.
- * including Speak button. The similar behavior is when chatbar gets narrowly.
- * This methods force resize behavior to resize buttons properly in these cases.
- */
- void processChatbarCustomization(S32 new_width);
-
-
- MASK mResizeState;
-
- typedef std::map<EResizeState, LLPanel*> state_object_map_t;
- state_object_map_t mStateProcessedObjectMap;
-
- typedef std::map<EResizeState, S32> state_object_width_map_t;
- state_object_width_map_t mObjectDefaultWidthMap;
-
- typedef std::vector<EResizeState> resize_state_vec_t;
-
- /**
- * Contains order in which child buttons should be processed in show/hide, extend/shrink methods.
- */
- resize_state_vec_t mButtonsProcessOrder;
- /**
- * Contains order in which child buttons are shown.
- * It traces order of all bottomtray buttons that may change place via drag'n'drop and should
- * save and load it between sessions. mButtonsProcessOrder is not enough for it because it contains only
- * buttons that may be hidden.
- */
- resize_state_vec_t mButtonsOrder;
-
-protected:
-
- LLBottomTray(const LLSD& key = LLSD());
-
- static void* createNearbyChatBar(void* userdata);
-
- void updateContextMenu(S32 x, S32 y, MASK mask);
- void onContextMenuItemClicked(const LLSD& userdata);
- bool onContextMenuItemEnabled(const LLSD& userdata);
-
- // Either default or saved after user's manual resize width of nearby chat.
- // Nearby chat will not always have it, because sometimes it can be shrunk on resize,
- // but when possible it will be restored back to this value.
- S32 mDesiredNearbyChatWidth;
- LLChicletPanel* mChicletPanel;
- LLPanel* mSpeakPanel;
- LLSpeakButton* mSpeakBtn;
- LLNearbyChatBar* mNearbyChatBar;
- LLLayoutPanel* mChatBarContainer;
- LLLayoutStack* mToolbarStack;
- LLMenuGL* mBottomTrayContextMenu;
- LLButton* mCamButton;
- LLButton* mMovementButton;
- LLBottomTrayLite* mBottomTrayLite;
- bool mIsInLiteMode;
-
- // Drag'n'Drop
-
- /**
- * Is true if mouse down happened on draggable button.
- * Set false whether on drag start or on mouse up.
- */
- bool mCheckForDrag;
- /**
- * These two variables hold corrdinates of mouse down on draggable button.
- * They are used to compare with current coordinates of cursor and determine whether drag'n'drop should start.
- */
- S32 mStartX;
- S32 mStartY;
- /**
- * True if drag'n'drop is happening.
- */
- bool mDragStarted;
-
- /**
- * Pointer to panel which is currently dragged (though it seems to user that button is dragged,
- * we are changing place of layout panel).
- */
- LLPanel* mDraggedItem;
- /**
- * Panel before which the dragged button will be inserted.
- */
- LLPanel* mLandingTab;
- /**
- * Image used to show position where dragged button will be dropped.
- */
- LLUIImage* mImageDragIndication;
-};
-
-#endif // LL_LLBOTTOMPANEL_H
diff --git a/indra/newview/llbreastmotion.cpp b/indra/newview/llbreastmotion.cpp
new file mode 100644
index 0000000000..9a8cd5ceae
--- /dev/null
+++ b/indra/newview/llbreastmotion.cpp
@@ -0,0 +1,396 @@
+/**
+ * @file llbreastmotion.cpp
+ * @brief Implementation of LLBreastMotion class.
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+//-----------------------------------------------------------------------------
+// Header Files
+//-----------------------------------------------------------------------------
+#include "llviewerprecompiledheaders.h"
+#include "linden_common.h"
+
+#include "m3math.h"
+#include "v3dmath.h"
+
+#include "llbreastmotion.h"
+#include "llcharacter.h"
+#include "llviewercontrol.h"
+#include "llviewervisualparam.h"
+#include "llvoavatarself.h"
+
+#define MIN_REQUIRED_PIXEL_AREA_BREAST_MOTION 0.f;
+
+#define N_PARAMS 2
+
+// User-set params
+static const std::string breast_param_names_user[N_PARAMS] =
+{
+ "Breast_Female_Cleavage_Driver",
+ "Breast_Gravity_Driver"
+};
+
+// Params driven by this algorithm
+static const std::string breast_param_names_driven[N_PARAMS] =
+{
+ "Breast_Female_Cleavage",
+ "Breast_Gravity"
+};
+
+
+
+LLBreastMotion::LLBreastMotion(const LLUUID &id) :
+ LLMotion(id),
+ mCharacter(NULL)
+{
+ mName = "breast_motion";
+ mChestState = new LLJointState;
+
+ mBreastMassParam = (F32)1.0;
+ mBreastDragParam = LLVector3((F32)0.1, (F32)0.1, (F32)0.1);
+ mBreastSmoothingParam = (U32)2;
+ mBreastGravityParam = (F32)0.0;
+
+ mBreastSpringParam = LLVector3((F32)3.0, (F32)0.0, (F32)3.0);
+ mBreastGainParam = LLVector3((F32)50.0, (F32)0.0, (F32)50.0);
+ mBreastDampingParam = LLVector3((F32)0.3, (F32)0.0, (F32)0.3);
+ mBreastMaxVelocityParam = LLVector3((F32)10.0, (F32)0.0, (F32)10.0);
+
+ mBreastParamsUser[0] = mBreastParamsUser[1] = mBreastParamsUser[2] = NULL;
+ mBreastParamsDriven[0] = mBreastParamsDriven[1] = mBreastParamsDriven[2] = NULL;
+
+ mCharLastPosition_world_pt = LLVector3(0,0,0);
+ mCharLastVelocity_local_vec = LLVector3(0,0,0);
+ mCharLastAcceleration_local_vec = LLVector3(0,0,0);
+ mBreastLastPosition_local_pt = LLVector3(0,0,0);
+ mBreastLastUpdatePosition_local_pt = LLVector3(0,0,0);
+ mBreastVelocity_local_vec = LLVector3(0,0,0);
+}
+
+LLBreastMotion::~LLBreastMotion()
+{
+}
+
+BOOL LLBreastMotion::onActivate()
+{
+ return TRUE;
+}
+
+void LLBreastMotion::onDeactivate()
+{
+}
+
+LLMotion::LLMotionInitStatus LLBreastMotion::onInitialize(LLCharacter *character)
+{
+ mCharacter = character;
+
+ if (!mChestState->setJoint(character->getJoint("mChest")))
+ {
+ return STATUS_FAILURE;
+ }
+
+ mChestState->setUsage(LLJointState::ROT);
+ addJointState( mChestState );
+
+ for (U32 i=0; i < N_PARAMS; i++)
+ {
+ mBreastParamsUser[i] = NULL;
+ mBreastParamsDriven[i] = NULL;
+ mBreastParamsMin[i] = 0;
+ mBreastParamsMax[i] = 0;
+ if (breast_param_names_user[i] != "" && breast_param_names_driven[i] != "")
+ {
+ mBreastParamsUser[i] = (LLViewerVisualParam*)mCharacter->getVisualParam(breast_param_names_user[i].c_str());
+ mBreastParamsDriven[i] = (LLViewerVisualParam*)mCharacter->getVisualParam(breast_param_names_driven[i].c_str());
+ if (mBreastParamsDriven[i])
+ {
+ mBreastParamsMin[i] = mBreastParamsDriven[i]->getMinWeight();
+ mBreastParamsMax[i] = mBreastParamsDriven[i]->getMaxWeight();
+ }
+ }
+ }
+
+ mTimer.reset();
+ return STATUS_SUCCESS;
+}
+
+F32 LLBreastMotion::getMinPixelArea()
+{
+ return MIN_REQUIRED_PIXEL_AREA_BREAST_MOTION;
+}
+
+
+F32 LLBreastMotion::calculateTimeDelta()
+{
+ const F32 time = mTimer.getElapsedTimeF32();
+ const F32 time_delta = time - mLastTime;
+ mLastTime = time;
+ return time_delta;
+}
+
+// Local space means "parameter space".
+LLVector3 LLBreastMotion::toLocal(const LLVector3 &world_vector)
+{
+ LLVector3 local_vec(0,0,0);
+
+ LLJoint *chest_joint = mChestState->getJoint();
+ const LLQuaternion world_rot = chest_joint->getWorldRotation();
+
+ // Cleavage
+ LLVector3 breast_dir_world_vec = LLVector3(-1,0,0) * world_rot; // -1 b/c cleavage param changes opposite to direction
+ breast_dir_world_vec.normalize();
+ local_vec[0] = world_vector * breast_dir_world_vec;
+
+ // Up-Down Bounce
+ LLVector3 breast_up_dir_world_vec = LLVector3(0,0,1) * world_rot;
+ breast_up_dir_world_vec.normalize();
+ local_vec[1] = world_vector * breast_up_dir_world_vec;
+
+ return local_vec;
+}
+
+LLVector3 LLBreastMotion::calculateVelocity_local(const F32 time_delta)
+{
+ LLJoint *chest_joint = mChestState->getJoint();
+ const LLVector3 world_pos_pt = chest_joint->getWorldPosition();
+ const LLQuaternion world_rot = chest_joint->getWorldRotation();
+ const LLVector3 last_world_pos_pt = mCharLastPosition_world_pt;
+ const LLVector3 char_velocity_world_vec = (world_pos_pt-last_world_pos_pt) / time_delta;
+ const LLVector3 char_velocity_local_vec = toLocal(char_velocity_world_vec);
+
+ return char_velocity_local_vec;
+}
+
+LLVector3 LLBreastMotion::calculateAcceleration_local(const LLVector3 &new_char_velocity_local_vec,
+ const F32 time_delta)
+{
+ LLVector3 char_acceleration_local_vec = new_char_velocity_local_vec - mCharLastVelocity_local_vec;
+
+ char_acceleration_local_vec =
+ char_acceleration_local_vec * 1.0/mBreastSmoothingParam +
+ mCharLastAcceleration_local_vec * (mBreastSmoothingParam-1.0)/mBreastSmoothingParam;
+
+ mCharLastAcceleration_local_vec = char_acceleration_local_vec;
+
+ return char_acceleration_local_vec;
+}
+
+BOOL LLBreastMotion::onUpdate(F32 time, U8* joint_mask)
+{
+ // Skip if disabled globally.
+ if (!gSavedSettings.getBOOL("AvatarPhysics"))
+ {
+ return TRUE;
+ }
+
+ // Higher LOD is better. This controls the granularity
+ // and frequency of updates for the motions.
+ const F32 lod_factor = LLVOAvatar::sPhysicsLODFactor;
+ if (lod_factor == 0)
+ {
+ return TRUE;
+ }
+
+ if (mCharacter->getSex() != SEX_FEMALE) return TRUE;
+ const F32 time_delta = calculateTimeDelta();
+ if (time_delta < .01 || time_delta > 10.0) return TRUE;
+
+
+ ////////////////////////////////////////////////////////////////////////////////
+ // Get all parameters and settings
+ //
+
+ mBreastMassParam = mCharacter->getVisualParamWeight("Breast_Physics_Mass");
+ mBreastSmoothingParam = (U32)(mCharacter->getVisualParamWeight("Breast_Physics_Smoothing"));
+ mBreastGravityParam = mCharacter->getVisualParamWeight("Breast_Physics_Gravity");
+
+ mBreastSpringParam[0] = mCharacter->getVisualParamWeight("Breast_Physics_Side_Spring");
+ mBreastGainParam[0] = mCharacter->getVisualParamWeight("Breast_Physics_Side_Gain");
+ mBreastDampingParam[0] = mCharacter->getVisualParamWeight("Breast_Physics_Side_Damping");
+ mBreastMaxVelocityParam[0] = mCharacter->getVisualParamWeight("Breast_Physics_Side_Max_Velocity");
+ mBreastDragParam[0] = mCharacter->getVisualParamWeight("Breast_Physics_Side_Drag");
+
+ mBreastSpringParam[1] = mCharacter->getVisualParamWeight("Breast_Physics_UpDown_Spring");
+ mBreastGainParam[1] = mCharacter->getVisualParamWeight("Breast_Physics_UpDown_Gain");
+ mBreastDampingParam[1] = mCharacter->getVisualParamWeight("Breast_Physics_UpDown_Damping");
+ mBreastMaxVelocityParam[1] = mCharacter->getVisualParamWeight("Breast_Physics_UpDown_Max_Velocity");
+ mBreastDragParam[1] = mCharacter->getVisualParamWeight("Breast_Physics_UpDown_Drag");
+
+
+ // Get the current morph parameters.
+ LLVector3 breast_user_local_pt(0,0,0);
+ for (U32 i=0; i < N_PARAMS; i++)
+ {
+ if (mBreastParamsUser[i] != NULL)
+ {
+ breast_user_local_pt[i] = mBreastParamsUser[i]->getWeight();
+ }
+ }
+
+ LLVector3 breast_current_local_pt = mBreastLastPosition_local_pt;
+
+ //
+ // End parameters and settings
+ ////////////////////////////////////////////////////////////////////////////////
+
+
+ ////////////////////////////////////////////////////////////////////////////////
+ // Calculate velocity and acceleration in parameter space.
+ //
+
+ const LLVector3 char_velocity_local_vec = calculateVelocity_local(time_delta);
+ const LLVector3 char_acceleration_local_vec = calculateAcceleration_local(char_velocity_local_vec, time_delta);
+ mCharLastVelocity_local_vec = char_velocity_local_vec;
+
+ LLJoint *chest_joint = mChestState->getJoint();
+ mCharLastPosition_world_pt = chest_joint->getWorldPosition();
+
+ //
+ // End velocity and acceleration
+ ////////////////////////////////////////////////////////////////////////////////
+
+
+ ////////////////////////////////////////////////////////////////////////////////
+ // Calculate the total force
+ //
+
+ // Spring force is a restoring force towards the original user-set breast position.
+ // F = kx
+ const LLVector3 spring_length_local = breast_current_local_pt-breast_user_local_pt;
+ LLVector3 force_spring_local_vec = -spring_length_local; force_spring_local_vec *= mBreastSpringParam;
+
+ // Acceleration is the force that comes from the change in velocity of the torso.
+ // F = ma + mg
+ LLVector3 force_accel_local_vec = char_acceleration_local_vec * mBreastMassParam;
+ const LLVector3 force_gravity_local_vec = toLocal(LLVector3(0,0,1))* mBreastGravityParam * mBreastMassParam;
+ force_accel_local_vec += force_gravity_local_vec;
+ force_accel_local_vec *= mBreastGainParam;
+
+ // Damping is a restoring force that opposes the current velocity.
+ // F = -kv
+ LLVector3 force_damping_local_vec = -mBreastDampingParam;
+ force_damping_local_vec *= mBreastVelocity_local_vec;
+
+ // Drag is a force imparted by velocity, intuitively it is similar to wind resistance.
+ // F = .5v*v
+ LLVector3 force_drag_local_vec = .5*char_velocity_local_vec;
+ force_drag_local_vec *= char_velocity_local_vec;
+ force_drag_local_vec *= mBreastDragParam[0];
+
+ LLVector3 force_net_local_vec =
+ force_accel_local_vec +
+ force_gravity_local_vec +
+ force_spring_local_vec +
+ force_damping_local_vec +
+ force_drag_local_vec;
+
+ //
+ // End total force
+ ////////////////////////////////////////////////////////////////////////////////
+
+
+ ////////////////////////////////////////////////////////////////////////////////
+ // Calculate new params
+ //
+
+ // Calculate the new acceleration based on the net force.
+ // a = F/m
+ LLVector3 acceleration_local_vec = force_net_local_vec / mBreastMassParam;
+ mBreastVelocity_local_vec += acceleration_local_vec;
+ mBreastVelocity_local_vec.clamp(-mBreastMaxVelocityParam*100.0, mBreastMaxVelocityParam*100.0);
+
+ // Temporary debugging setting to cause all avatars to move, for profiling purposes.
+ if (gSavedSettings.getBOOL("AvatarPhysicsTest"))
+ {
+ mBreastVelocity_local_vec[0] = sin(mTimer.getElapsedTimeF32()*4.0)*5.0;
+ mBreastVelocity_local_vec[1] = sin(mTimer.getElapsedTimeF32()*3.0)*5.0;
+ }
+ // Calculate the new parameters and clamp them to the min/max ranges.
+ LLVector3 new_local_pt = breast_current_local_pt + mBreastVelocity_local_vec*time_delta;
+ new_local_pt.clamp(mBreastParamsMin,mBreastParamsMax);
+
+ // Set the new parameters.
+ for (U32 i=0; i < 3; i++)
+ {
+ // If the param is disabled, just set the param to the user value.
+ if (mBreastMaxVelocityParam[i] == 0)
+ {
+ new_local_pt[i] = breast_user_local_pt[i];
+ }
+ if (mBreastParamsDriven[i])
+ {
+ mCharacter->setVisualParamWeight(mBreastParamsDriven[i],
+ new_local_pt[i],
+ FALSE);
+ }
+ }
+
+ mBreastLastPosition_local_pt = new_local_pt;
+
+ //
+ // End calculate new params
+ ////////////////////////////////////////////////////////////////////////////////
+
+
+ ////////////////////////////////////////////////////////////////////////////////
+ // Conditionally update the visual params
+ //
+
+ // Updating the visual params (i.e. what the user sees) is fairly expensive.
+ // So only update if the params have changed enough, and also take into account
+ // the graphics LOD settings.
+
+ // For non-self, if the avatar is small enough visually, then don't update.
+ const BOOL is_self = (dynamic_cast<LLVOAvatarSelf *>(this) != NULL);
+ if (!is_self)
+ {
+ const F32 area_for_max_settings = 0.0;
+ const F32 area_for_min_settings = 1400.0;
+
+ const F32 area_for_this_setting = area_for_max_settings + (area_for_min_settings-area_for_max_settings)*(1.0-lod_factor);
+ const F32 pixel_area = fsqrtf(mCharacter->getPixelArea());
+ if (pixel_area < area_for_this_setting)
+ {
+ return TRUE;
+ }
+ }
+
+ // If the parameter hasn't changed enough, then don't update.
+ LLVector3 position_diff = mBreastLastUpdatePosition_local_pt-new_local_pt;
+ for (U32 i=0; i < 3; i++)
+ {
+ const F32 min_delta = (1.0-lod_factor)*(mBreastParamsMax[i]-mBreastParamsMin[i])/2.0;
+ if (llabs(position_diff[i]) > min_delta)
+ {
+ mCharacter->updateVisualParams();
+ mBreastLastUpdatePosition_local_pt = new_local_pt;
+ return TRUE;
+ }
+ }
+
+ //
+ // End update visual params
+ ////////////////////////////////////////////////////////////////////////////////
+
+ return TRUE;
+}
diff --git a/indra/newview/llbreastmotion.h b/indra/newview/llbreastmotion.h
new file mode 100644
index 0000000000..aa0fdf9f8b
--- /dev/null
+++ b/indra/newview/llbreastmotion.h
@@ -0,0 +1,154 @@
+/**
+ * @file llbreastmotion.h
+ * @brief Implementation of LLBreastMotion class.
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLBREASTMOTION_H
+#define LL_LLBREASTMOTION_H
+
+//-----------------------------------------------------------------------------
+// Header files
+//-----------------------------------------------------------------------------
+#include "llmotion.h"
+#include "llframetimer.h"
+
+#define BREAST_MOTION_FADEIN_TIME 1.0f
+#define BREAST_MOTION_FADEOUT_TIME 1.0f
+
+class LLViewerVisualParam;
+
+//-----------------------------------------------------------------------------
+// class LLBreastMotion
+//-----------------------------------------------------------------------------
+class LLBreastMotion :
+ public LLMotion
+{
+public:
+ // Constructor
+ LLBreastMotion(const LLUUID &id);
+
+ // Destructor
+ virtual ~LLBreastMotion();
+
+public:
+ //-------------------------------------------------------------------------
+ // functions to support MotionController and MotionRegistry
+ //-------------------------------------------------------------------------
+
+ // static constructor
+ // all subclasses must implement such a function and register it
+ static LLMotion *create(const LLUUID &id) { return new LLBreastMotion(id); }
+
+public:
+ //-------------------------------------------------------------------------
+ // animation callbacks to be implemented by subclasses
+ //-------------------------------------------------------------------------
+
+ // motions must specify whether or not they loop
+ virtual BOOL getLoop() { return TRUE; }
+
+ // motions must report their total duration
+ virtual F32 getDuration() { return 0.0; }
+
+ // motions must report their "ease in" duration
+ virtual F32 getEaseInDuration() { return BREAST_MOTION_FADEIN_TIME; }
+
+ // motions must report their "ease out" duration.
+ virtual F32 getEaseOutDuration() { return BREAST_MOTION_FADEOUT_TIME; }
+
+ // called to determine when a motion should be activated/deactivated based on avatar pixel coverage
+ virtual F32 getMinPixelArea();
+
+ // motions must report their priority
+ virtual LLJoint::JointPriority getPriority() { return LLJoint::MEDIUM_PRIORITY; }
+
+ virtual LLMotionBlendType getBlendType() { return ADDITIVE_BLEND; }
+
+ // run-time (post constructor) initialization,
+ // called after parameters have been set
+ // must return true to indicate success and be available for activation
+ virtual LLMotionInitStatus onInitialize(LLCharacter *character);
+
+ // called when a motion is activated
+ // must return TRUE to indicate success, or else
+ // it will be deactivated
+ virtual BOOL onActivate();
+
+ // called per time step
+ // must return TRUE while it is active, and
+ // must return FALSE when the motion is completed.
+ virtual BOOL onUpdate(F32 time, U8* joint_mask);
+
+ // called when a motion is deactivated
+ virtual void onDeactivate();
+
+protected:
+ LLVector3 toLocal(const LLVector3 &world_vector);
+ LLVector3 calculateVelocity_local(const F32 time_delta);
+ LLVector3 calculateAcceleration_local(const LLVector3 &new_char_velocity_local_vec,
+ const F32 time_delta);
+ F32 calculateTimeDelta();
+private:
+ //-------------------------------------------------------------------------
+ // joint states to be animated
+ //-------------------------------------------------------------------------
+ LLPointer<LLJointState> mChestState;
+ LLCharacter* mCharacter;
+
+
+ //-------------------------------------------------------------------------
+ // miscellaneous parameters
+ //-------------------------------------------------------------------------
+ LLViewerVisualParam *mBreastParamsUser[3];
+ LLViewerVisualParam *mBreastParamsDriven[3];
+ LLVector3 mBreastParamsMin;
+ LLVector3 mBreastParamsMax;
+
+ LLVector3 mCharLastPosition_world_pt; // Last position of the avatar
+ LLVector3 mCharLastVelocity_local_vec; // How fast the character is moving
+ LLVector3 mCharLastAcceleration_local_vec; // Change in character velocity
+
+ LLVector3 mBreastLastPosition_local_pt; // Last parameters for breast
+ LLVector3 mBreastVelocity_local_vec; // How fast the breast params are moving
+ LLVector3 mBreastLastUpdatePosition_local_pt; // Last parameters when visual update was sent
+
+
+ F32 mBreastMassParam;
+ F32 mBreastGravityParam;
+ U32 mBreastSmoothingParam;
+
+ LLVector3 mBreastSpringParam;
+ LLVector3 mBreastDampingParam;
+ LLVector3 mBreastGainParam;
+ LLVector3 mBreastMaxVelocityParam;
+ LLVector3 mBreastDragParam;
+
+ LLFrameTimer mTimer;
+ F32 mLastTime;
+
+ U32 mFileTicks;
+};
+
+#endif // LL_LLBREASTMOTION_H
+
diff --git a/indra/newview/llbrowsernotification.cpp b/indra/newview/llbrowsernotification.cpp
index d6a813d608..6e77d1e336 100644
--- a/indra/newview/llbrowsernotification.cpp
+++ b/indra/newview/llbrowsernotification.cpp
@@ -29,8 +29,9 @@
#include "llnotificationhandler.h"
#include "llnotifications.h"
-#include "llfloaterreg.h"
#include "llmediactrl.h"
+#include "llviewermedia.h"
+#include "llviewermediafocus.h"
using namespace LLNotificationsUI;
@@ -39,10 +40,19 @@ bool LLBrowserNotification::processNotification(const LLSD& notify)
LLNotificationPtr notification = LLNotifications::instance().find(notify["id"].asUUID());
if (!notification) return false;
- LLMediaCtrl* media_instance = LLMediaCtrl::getInstance(notification->getPayload()["media_id"].asUUID());
+ LLUUID media_id = notification->getPayload()["media_id"].asUUID();
+ LLMediaCtrl* media_instance = LLMediaCtrl::getInstance(media_id);
if (media_instance)
{
media_instance->showNotification(notification);
}
+ else if (LLViewerMediaFocus::instance().getControlsMediaID() == media_id)
+ {
+ LLViewerMediaImpl* impl = LLViewerMedia::getMediaImplFromTextureID(media_id);
+ if (impl)
+ {
+ impl->showNotification(notification);
+ }
+ }
return false;
}
diff --git a/indra/newview/llbuycurrencyhtml.cpp b/indra/newview/llbuycurrencyhtml.cpp
index d35c9ed853..e5a9be0203 100644
--- a/indra/newview/llbuycurrencyhtml.cpp
+++ b/indra/newview/llbuycurrencyhtml.cpp
@@ -33,6 +33,7 @@
#include "llfloaterreg.h"
#include "llcommandhandler.h"
#include "llviewercontrol.h"
+#include "llstatusbar.h"
// support for secondlife:///app/buycurrencyhtml/{ACTION}/{NEXT_ACTION}/{RETURN_CODE} SLapps
class LLBuyCurrencyHTMLHandler :
@@ -156,4 +157,7 @@ void LLBuyCurrencyHTML::closeDialog()
{
buy_currency_floater->closeFloater();
};
+
+ // Update L$ balance in the status bar in case L$ were purchased
+ LLStatusBar::sendMoneyBalanceRequest();
}
diff --git a/indra/newview/llcallbacklist.cpp b/indra/newview/llcallbacklist.cpp
index a54c77b4a0..357a6582d1 100644
--- a/indra/newview/llcallbacklist.cpp
+++ b/indra/newview/llcallbacklist.cpp
@@ -115,6 +115,71 @@ void LLCallbackList::callFunctions()
}
}
+// Shim class to allow arbitrary boost::bind
+// expressions to be run as one-time idle callbacks.
+class OnIdleCallbackOneTime
+{
+public:
+ OnIdleCallbackOneTime(nullary_func_t callable):
+ mCallable(callable)
+ {
+ }
+ static void onIdle(void *data)
+ {
+ gIdleCallbacks.deleteFunction(onIdle, data);
+ OnIdleCallbackOneTime* self = reinterpret_cast<OnIdleCallbackOneTime*>(data);
+ self->call();
+ delete self;
+ }
+ void call()
+ {
+ mCallable();
+ }
+private:
+ nullary_func_t mCallable;
+};
+
+void doOnIdleOneTime(nullary_func_t callable)
+{
+ OnIdleCallbackOneTime* cb_functor = new OnIdleCallbackOneTime(callable);
+ gIdleCallbacks.addFunction(&OnIdleCallbackOneTime::onIdle,cb_functor);
+}
+
+// Shim class to allow generic boost functions to be run as
+// recurring idle callbacks. Callable should return true when done,
+// false to continue getting called.
+class OnIdleCallbackRepeating
+{
+public:
+ OnIdleCallbackRepeating(bool_func_t callable):
+ mCallable(callable)
+ {
+ }
+ // Will keep getting called until the callable returns true.
+ static void onIdle(void *data)
+ {
+ OnIdleCallbackRepeating* self = reinterpret_cast<OnIdleCallbackRepeating*>(data);
+ bool done = self->call();
+ if (done)
+ {
+ gIdleCallbacks.deleteFunction(onIdle, data);
+ delete self;
+ }
+ }
+ bool call()
+ {
+ return mCallable();
+ }
+private:
+ bool_func_t mCallable;
+};
+
+void doOnIdleRepeating(bool_func_t callable)
+{
+ OnIdleCallbackRepeating* cb_functor = new OnIdleCallbackRepeating(callable);
+ gIdleCallbacks.addFunction(&OnIdleCallbackRepeating::onIdle,cb_functor);
+}
+
#ifdef _DEBUG
void test1(void *data)
diff --git a/indra/newview/llcallbacklist.h b/indra/newview/llcallbacklist.h
index 07ac21f5e9..97f3bfd9ee 100644
--- a/indra/newview/llcallbacklist.h
+++ b/indra/newview/llcallbacklist.h
@@ -52,6 +52,15 @@ protected:
callback_list_t mCallbackList;
};
+typedef boost::function<void ()> nullary_func_t;
+typedef boost::function<bool ()> bool_func_t;
+
+// Call a given callable once in idle loop.
+void doOnIdleOneTime(nullary_func_t callable);
+
+// Repeatedly call a callable in idle loop until it returns true.
+void doOnIdleRepeating(bool_func_t callable);
+
extern LLCallbackList gIdleCallbacks;
#endif
diff --git a/indra/newview/llcallfloater.cpp b/indra/newview/llcallfloater.cpp
index b2e9564f7d..f2375bfa4f 100644
--- a/indra/newview/llcallfloater.cpp
+++ b/indra/newview/llcallfloater.cpp
@@ -37,9 +37,9 @@
#include "llavatarnamecache.h"
#include "llavatariconctrl.h"
#include "llavatarlist.h"
-#include "llbottomtray.h"
#include "lldraghandle.h"
#include "llimfloater.h"
+#include "llimview.h"
#include "llfloaterreg.h"
#include "llparticipantlist.h"
#include "llspeakers.h"
@@ -50,6 +50,7 @@
#include "llviewerwindow.h"
#include "llvoicechannel.h"
#include "llviewerparcelmgr.h"
+#include "llfirstuse.h"
static void get_voice_participants_uuids(uuid_vec_t& speakers_uuids);
void reshape_floater(LLCallFloater* floater, S32 delta_height);
@@ -114,9 +115,6 @@ LLCallFloater::LLCallFloater(const LLSD& key)
LLVoiceClient::instance().addObserver(this);
LLTransientFloaterMgr::getInstance()->addControlView(this);
- // force docked state since this floater doesn't save it between recreations
- setDocked(true);
-
// update the agent's name if display name setting change
LLAvatarNameCache::addUseDisplayNamesCallback(boost::bind(&LLCallFloater::updateAgentModeratorState, this));
LLViewerDisplayName::addNameChangedCallback(boost::bind(&LLCallFloater::updateAgentModeratorState, this));
@@ -144,7 +142,6 @@ LLCallFloater::~LLCallFloater()
// virtual
BOOL LLCallFloater::postBuild()
{
- LLTransientDockableFloater::postBuild();
mAvatarList = getChild<LLAvatarList>("speakers_list");
mAvatarListRefreshConnection = mAvatarList->setRefreshCompleteCallback(boost::bind(&LLCallFloater::onAvatarListRefreshed, this));
@@ -153,29 +150,20 @@ BOOL LLCallFloater::postBuild()
mNonAvatarCaller = findChild<LLNonAvatarCaller>("non_avatar_caller");
mNonAvatarCaller->setVisible(FALSE);
- LLView *anchor_panel = LLBottomTray::getInstance()->getChild<LLView>("speak_flyout_btn");
-
- setDockControl(new LLDockControl(
- anchor_panel, this,
- getDockTongue(), LLDockControl::TOP));
-
initAgentData();
connectToChannel(LLVoiceChannel::getCurrentVoiceChannel());
- setIsChrome(true);
- //chrome="true" hides floater caption
- if (mDragHandle)
- mDragHandle->setTitleVisible(TRUE);
+ updateTransparency(TT_ACTIVE); // force using active floater transparency (STORM-730)
updateSession();
-
return TRUE;
}
// virtual
void LLCallFloater::onOpen(const LLSD& /*key*/)
{
+ LLFirstUse::speak(false);
}
// virtual
@@ -200,9 +188,20 @@ void LLCallFloater::draw()
// Need to resort the participant list if it's in sort by recent speaker order.
if (mParticipants)
- mParticipants->updateRecentSpeakersOrder();
+ mParticipants->update();
+
+ LLFloater::draw();
+}
+
+// virtual
+void LLCallFloater::setFocus( BOOL b )
+{
+ LLFloater::setFocus(b);
- LLTransientDockableFloater::draw();
+ // Force using active floater transparency (STORM-730).
+ // We have to override setFocus() for LLCallFloater because selecting an item
+ // of the voice morphing combobox causes the floater to lose focus and thus become transparent.
+ updateTransparency(TT_ACTIVE);
}
// virtual
@@ -334,6 +333,7 @@ void LLCallFloater::refreshParticipantList()
if (!non_avatar_caller)
{
+ llassert(mParticipants == NULL); // check for possible memory leak
mParticipants = new LLParticipantList(mSpeakerManager, mAvatarList, true, mVoiceType != VC_GROUP_CHAT && mVoiceType != VC_AD_HOC_CHAT, false);
mParticipants->setValidateSpeakerCallback(boost::bind(&LLCallFloater::validateSpeaker, this, _1));
const U32 speaker_sort_order = gSavedSettings.getU32("SpeakerParticipantDefaultOrder");
diff --git a/indra/newview/llcallfloater.h b/indra/newview/llcallfloater.h
index 3bc7043353..00a3f76e56 100644
--- a/indra/newview/llcallfloater.h
+++ b/indra/newview/llcallfloater.h
@@ -64,6 +64,7 @@ public:
/*virtual*/ BOOL postBuild();
/*virtual*/ void onOpen(const LLSD& key);
/*virtual*/ void draw();
+ /*virtual*/ void setFocus( BOOL b );
/**
* Is called by LLVoiceClient::notifyParticipantObservers when voice participant list is changed.
diff --git a/indra/newview/llcapabilityprovider.h b/indra/newview/llcapabilityprovider.h
index a6e743f625..9d91245597 100644
--- a/indra/newview/llcapabilityprovider.h
+++ b/indra/newview/llcapabilityprovider.h
@@ -46,7 +46,7 @@ public:
/**
* Get host to which to send that capability request.
*/
- virtual LLHost getHost() const = 0;
+ virtual const LLHost& getHost() const = 0;
/**
* Describe this LLCapabilityProvider for logging etc.
*/
diff --git a/indra/newview/llchannelmanager.cpp b/indra/newview/llchannelmanager.cpp
index 4ab3d8dc98..987651fc80 100644
--- a/indra/newview/llchannelmanager.cpp
+++ b/indra/newview/llchannelmanager.cpp
@@ -58,7 +58,10 @@ LLChannelManager::~LLChannelManager()
{
for(std::vector<ChannelElem>::iterator it = mChannelList.begin(); it != mChannelList.end(); ++it)
{
- delete (*it).channel;
+ LLScreenChannelBase* channel = it->channel.get();
+ if (!channel) continue;
+
+ delete channel;
}
mChannelList.clear();
@@ -68,9 +71,10 @@ LLChannelManager::~LLChannelManager()
LLScreenChannel* LLChannelManager::createNotificationChannel()
{
// creating params for a channel
- LLChannelManager::Params p;
+ LLScreenChannelBase::Params p;
p.id = LLUUID(gSavedSettings.getString("NotificationChannelUUID"));
p.channel_align = CA_RIGHT;
+ p.toast_align = NA_TOP;
// Getting a Channel for our notifications
return dynamic_cast<LLScreenChannel*> (LLChannelManager::getInstance()->getChannel(p));
@@ -84,16 +88,19 @@ void LLChannelManager::onLoginCompleted()
// calc a number of all offline notifications
for(std::vector<ChannelElem>::iterator it = mChannelList.begin(); it != mChannelList.end(); ++it)
{
+ LLScreenChannelBase* channel = it->channel.get();
+ if (!channel) continue;
+
// don't calc notifications for Nearby Chat
- if((*it).channel->getChannelID() == LLUUID(gSavedSettings.getString("NearByChatChannelUUID")))
+ if(channel->getChannelID() == LLUUID(gSavedSettings.getString("NearByChatChannelUUID")))
{
continue;
}
// don't calc notifications for channels that always show their notifications
- if(!(*it).channel->getDisplayToastsAlways())
+ if(!channel->getDisplayToastsAlways())
{
- away_notifications +=(*it).channel->getNumberOfHiddenToasts();
+ away_notifications +=channel->getNumberOfHiddenToasts();
}
}
@@ -106,7 +113,7 @@ void LLChannelManager::onLoginCompleted()
else
{
// create a channel for the StartUp Toast
- LLChannelManager::Params p;
+ LLScreenChannelBase::Params p;
p.id = LLUUID(gSavedSettings.getString("StartUpChannelUUID"));
p.channel_align = CA_RIGHT;
mStartUpChannel = createChannel(p);
@@ -157,33 +164,22 @@ LLScreenChannelBase* LLChannelManager::addChannel(LLScreenChannelBase* channel)
ChannelElem new_elem;
new_elem.id = channel->getChannelID();
- new_elem.channel = channel;
+ new_elem.channel = channel->getHandle();
mChannelList.push_back(new_elem);
return channel;
}
-LLScreenChannel* LLChannelManager::createChannel(LLChannelManager::Params& p)
+LLScreenChannel* LLChannelManager::createChannel(LLScreenChannelBase::Params& p)
{
- LLScreenChannel* new_channel = new LLScreenChannel(p.id);
-
- if(!new_channel)
- {
- llerrs << "LLChannelManager::getChannel(LLChannelManager::Params& p) - can't create a channel!" << llendl;
- }
- else
- {
- new_channel->setToastAlignment(p.toast_align);
- new_channel->setChannelAlignment(p.channel_align);
- new_channel->setDisplayToastsAlways(p.display_toasts_always);
+ LLScreenChannel* new_channel = new LLScreenChannel(p);
- addChannel(new_channel);
- }
+ addChannel(new_channel);
return new_channel;
}
-LLScreenChannelBase* LLChannelManager::getChannel(LLChannelManager::Params& p)
+LLScreenChannelBase* LLChannelManager::getChannel(LLScreenChannelBase::Params& p)
{
LLScreenChannelBase* new_channel = findChannelByID(p.id);
@@ -195,19 +191,19 @@ LLScreenChannelBase* LLChannelManager::getChannel(LLChannelManager::Params& p)
}
//--------------------------------------------------------------------------
-LLScreenChannelBase* LLChannelManager::findChannelByID(const LLUUID id)
+LLScreenChannelBase* LLChannelManager::findChannelByID(const LLUUID& id)
{
std::vector<ChannelElem>::iterator it = find(mChannelList.begin(), mChannelList.end(), id);
if(it != mChannelList.end())
{
- return (*it).channel;
+ return (*it).channel.get();
}
return NULL;
}
//--------------------------------------------------------------------------
-void LLChannelManager::removeChannelByID(const LLUUID id)
+void LLChannelManager::removeChannelByID(const LLUUID& id)
{
std::vector<ChannelElem>::iterator it = find(mChannelList.begin(), mChannelList.end(), id);
if(it != mChannelList.end())
@@ -222,7 +218,10 @@ void LLChannelManager::muteAllChannels(bool mute)
for (std::vector<ChannelElem>::iterator it = mChannelList.begin();
it != mChannelList.end(); it++)
{
- it->channel->setShowToasts(!mute);
+ if (it->channel.get())
+ {
+ it->channel.get()->setShowToasts(!mute);
+ }
}
}
diff --git a/indra/newview/llchannelmanager.h b/indra/newview/llchannelmanager.h
index db936b28d9..a5de8a5327 100644
--- a/indra/newview/llchannelmanager.h
+++ b/indra/newview/llchannelmanager.h
@@ -43,24 +43,15 @@ namespace LLNotificationsUI
*/
class LLChannelManager : public LLSingleton<LLChannelManager>
{
-public:
- struct Params
- {
- LLUUID id;
- bool display_toasts_always;
- EToastAlignment toast_align;
- EChannelAlignment channel_align;
+public:
- Params(): id(LLUUID("")), display_toasts_always(false), toast_align(NA_BOTTOM), channel_align(CA_LEFT)
- {}
- };
struct ChannelElem
{
- LLUUID id;
- LLScreenChannelBase* channel;
+ LLUUID id;
+ LLHandle<LLScreenChannelBase> channel;
- ChannelElem() : id(LLUUID("")), channel(NULL) { }
+ ChannelElem() { }
ChannelElem(const ChannelElem &elem)
{
@@ -83,18 +74,18 @@ public:
void onStartUpToastClose();
// creates a new ScreenChannel according to the given parameters or returns existing if present
- LLScreenChannelBase* getChannel(LLChannelManager::Params& p);
+ LLScreenChannelBase* getChannel(LLScreenChannelBase::Params& p);
LLScreenChannelBase* addChannel(LLScreenChannelBase* channel);
// returns a channel by its ID
- LLScreenChannelBase* findChannelByID(const LLUUID id);
+ LLScreenChannelBase* findChannelByID(const LLUUID& id);
// creator of the Notification channel, that is used in more than one handler
LLScreenChannel* createNotificationChannel();
// remove channel methods
- void removeChannelByID(const LLUUID id);
+ void removeChannelByID(const LLUUID& id);
/**
* Manages toasts showing for all channels.
@@ -116,7 +107,7 @@ public:
std::vector<ChannelElem>& getChannelList() { return mChannelList;}
private:
- LLScreenChannel* createChannel(LLChannelManager::Params& p);
+ LLScreenChannel* createChannel(LLScreenChannelBase::Params& p);
LLScreenChannel* mStartUpChannel;
std::vector<ChannelElem> mChannelList;
diff --git a/indra/newview/llchatbar.cpp b/indra/newview/llchatbar.cpp
index 6e58be8174..d6095cce07 100644
--- a/indra/newview/llchatbar.cpp
+++ b/indra/newview/llchatbar.cpp
@@ -60,7 +60,6 @@
#include "llui.h"
#include "llviewermenu.h"
#include "lluictrlfactory.h"
-#include "llbottomtray.h"
//
// Globals
@@ -95,7 +94,7 @@ LLChatBar::LLChatBar()
mGestureCombo(NULL),
mObserver(NULL)
{
- setIsChrome(TRUE);
+ //setIsChrome(TRUE);
}
@@ -671,6 +670,9 @@ void LLChatBar::onCommitGesture(LLUICtrl* ctrl)
}
}
+
+/* Cruft - global gChatHandler declared below has been commented out,
+ so this class is never used. See similar code in llnearbychatbar.cpp
class LLChatHandler : public LLCommandHandler
{
public:
@@ -691,7 +693,7 @@ public:
{
S32 channel = tokens[0].asInteger();
// VWR-19499 Restrict function to chat channels greater than 0.
- if ((channel > 0) && (channel < 2147483647))
+ if ((channel > 0) && (channel < CHAT_CHANNEL_DEBUG))
{
retval = true;
// Say mesg on channel
@@ -710,3 +712,4 @@ public:
// Creating the object registers with the dispatcher.
//LLChatHandler gChatHandler;
+cruft */
diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index 271ee0c4a4..f530d10ddc 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -42,6 +42,7 @@
#include "llavataractions.h"
#include "lltrans.h"
#include "llfloaterreg.h"
+#include "llfloatersidepanelcontainer.h"
#include "llmutelist.h"
#include "llstylemap.h"
#include "llslurl.h"
@@ -58,8 +59,6 @@
#include "llviewercontrol.h"
-#include "llsidetray.h"//for blocked objects panel
-
static LLDefaultChildRegistry::Register<LLChatHistory> r("chat_history");
const static std::string NEW_LINE(rawstr_to_utf8("\n"));
@@ -138,16 +137,13 @@ public:
if (level == "profile")
{
- LLSD params;
- params["object_id"] = getAvatarId();
-
- LLFloaterReg::showInstance("inspect_object", params);
+ LLFloaterReg::showInstance("inspect_remote_object", mObjectData);
}
else if (level == "block")
{
LLMuteList::getInstance()->add(LLMute(getAvatarId(), mFrom, LLMute::OBJECT));
- LLSideTray::getInstance()->showPanel("panel_block_list_sidetray", LLSD().with("blocked_to_select", getAvatarId()));
+ LLFloaterSidePanelContainer::showPanel("people", "panel_block_list_sidetray", LLSD().with("blocked_to_select", getAvatarId()));
}
}
@@ -229,7 +225,7 @@ public:
if (mSourceType == CHAT_SOURCE_OBJECT)
{
- LLFloaterReg::showInstance("inspect_object", LLSD().with("object_id", mAvatarID));
+ LLFloaterReg::showInstance("inspect_remote_object", mObjectData);
}
else if (mSourceType == CHAT_SOURCE_AGENT)
{
@@ -251,14 +247,14 @@ public:
const LLUUID& getAvatarId () const { return mAvatarID;}
- void setup(const LLChat& chat,const LLStyle::Params& style_params)
+ void setup(const LLChat& chat, const LLStyle::Params& style_params, const LLSD& args)
{
mAvatarID = chat.mFromID;
mSessionID = chat.mSessionID;
mSourceType = chat.mSourceType;
//*TODO overly defensive thing, source type should be maintained out there
- if((chat.mFromID.isNull() && chat.mFromName.empty()) || chat.mFromName == SYSTEM_FROM && chat.mFromID.isNull())
+ if((chat.mFromID.isNull() && chat.mFromName.empty()) || (chat.mFromName == SYSTEM_FROM && chat.mFromID.isNull()))
{
mSourceType = CHAT_SOURCE_SYSTEM;
}
@@ -332,7 +328,8 @@ public:
setTimeField(chat);
-
+
+ // Set up the icon.
LLAvatarIconCtrl* icon = getChild<LLAvatarIconCtrl>("avatar_icon");
if(mSourceType != CHAT_SOURCE_AGENT || mAvatarID.isNull())
@@ -352,6 +349,30 @@ public:
case CHAT_SOURCE_UNKNOWN:
icon->setValue(LLSD("Unknown_Icon"));
}
+
+ // In case the message came from an object, save the object info
+ // to be able properly show its profile.
+ if ( chat.mSourceType == CHAT_SOURCE_OBJECT)
+ {
+ std::string slurl = args["slurl"].asString();
+ if (slurl.empty())
+ {
+ LLViewerRegion *region = LLWorld::getInstance()->getRegionFromPosAgent(chat.mPosAgent);
+ if(region)
+ {
+ LLSLURL region_slurl(region->getName(), chat.mPosAgent);
+ slurl = region_slurl.getLocationString();
+ }
+ }
+
+ LLSD payload;
+ payload["object_id"] = chat.mFromID;
+ payload["name"] = chat.mFromName;
+ payload["owner_id"] = chat.mOwnerID;
+ payload["slurl"] = LLWeb::escapeURL(slurl);
+
+ mObjectData = payload;
+ }
}
/*virtual*/ void draw()
@@ -540,6 +561,7 @@ protected:
static LLUICtrl* sInfoCtrl;
LLUUID mAvatarID;
+ LLSD mObjectData;
EChatSourceType mSourceType;
std::string mFrom;
LLUUID mSessionID;
@@ -586,7 +608,7 @@ void LLChatHistory::initFromParams(const LLChatHistory::Params& p)
LLLayoutStack::Params layout_p;
layout_p.rect = stack_rect;
layout_p.follows.flags = FOLLOWS_ALL;
- layout_p.orientation = "vertical";
+ layout_p.orientation = LLLayoutStack::VERTICAL;
layout_p.mouse_opaque = false;
LLLayoutStack* stackp = LLUICtrlFactory::create<LLLayoutStack>(layout_p, this);
@@ -599,7 +621,6 @@ void LLChatHistory::initFromParams(const LLChatHistory::Params& p)
panel_p.has_border = false;
panel_p.mouse_opaque = false;
panel_p.min_dim = 30;
- panel_p.max_dim = S32_MAX;
panel_p.auto_resize = true;
panel_p.user_resize = false;
@@ -649,10 +670,10 @@ LLView* LLChatHistory::getSeparator()
return separator;
}
-LLView* LLChatHistory::getHeader(const LLChat& chat,const LLStyle::Params& style_params)
+LLView* LLChatHistory::getHeader(const LLChat& chat,const LLStyle::Params& style_params, const LLSD& args)
{
LLChatHistoryHeader* header = LLChatHistoryHeader::createInstance(mMessageHeaderFilename);
- header->setup(chat,style_params);
+ header->setup(chat, style_params, args);
return header;
}
@@ -770,43 +791,27 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
if ( chat.mSourceType == CHAT_SOURCE_OBJECT && chat.mFromID.notNull())
{
// for object IMs, create a secondlife:///app/objectim SLapp
- std::string url = LLSLURL("objectim", chat.mFromID, "").getSLURLString();
- url += "?name=" + chat.mFromName;
- url += "&owner=" + chat.mOwnerID.asString();
-
- std::string slurl = args["slurl"].asString();
- if (slurl.empty())
- {
- LLViewerRegion *region = LLWorld::getInstance()->getRegionFromPosAgent(chat.mPosAgent);
- if(region)
- {
- LLSLURL region_slurl(region->getName(), chat.mPosAgent);
- slurl = region_slurl.getLocationString();
- }
- }
- url += "&slurl=" + LLURI::escape(slurl);
+ std::string url = LLViewerChat::getSenderSLURL(chat, args);
// set the link for the object name to be the objectim SLapp
// (don't let object names with hyperlinks override our objectim Url)
LLStyle::Params link_params(style_params);
- link_params.color.control = "HTMLLinkColor";
+ LLColor4 link_color = LLUIColorTable::instance().getColor("HTMLLinkColor");
+ link_params.color = link_color;
+ link_params.readonly_color = link_color;
link_params.is_link = true;
link_params.link_href = url;
+
mEditor->appendText(chat.mFromName + delimiter,
false, link_params);
}
else if ( chat.mFromName != SYSTEM_FROM && chat.mFromID.notNull() && !message_from_log)
{
LLStyle::Params link_params(style_params);
-
- // Setting is_link = true for agent SLURL to avoid applying default style to it.
- // See LLTextBase::appendTextImpl().
- link_params.is_link = true;
- link_params.link_href = LLSLURL("agent", chat.mFromID, "inspect").getSLURLString();
+ link_params.overwriteFrom(LLStyleMap::instance().lookupAgent(chat.mFromID));
// Add link to avatar's inspector and delimiter to message.
- mEditor->appendText(chat.mFromName, false, link_params);
- mEditor->appendText(delimiter, false, style_params);
+ mEditor->appendText(std::string(link_params.link_href) + delimiter, false, link_params);
}
else
{
@@ -836,7 +841,7 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
}
else
{
- view = getHeader(chat, style_params);
+ view = getHeader(chat, style_params, args);
if (mEditor->getText().size() == 0)
p.top_pad = 0;
else
@@ -901,31 +906,14 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
}
}
- LLTextEditor* text_editor = notify_box->getChild<LLTextEditor>("text_editor_box", TRUE);
- S32 text_heigth = 0;
- if(text_editor != NULL)
- {
- text_heigth = text_editor->getTextBoundingRect().getHeight();
- }
-
//Prepare the rect for the view
LLRect target_rect = mEditor->getDocumentView()->getRect();
// squeeze down the widget by subtracting padding off left and right
target_rect.mLeft += mLeftWidgetPad + mEditor->getHPad();
target_rect.mRight -= mRightWidgetPad;
- notify_box->reshape(target_rect.getWidth(),
- notify_box->getRect().getHeight());
+ notify_box->reshape(target_rect.getWidth(), notify_box->getRect().getHeight());
notify_box->setOrigin(target_rect.mLeft, notify_box->getRect().mBottom);
- if (text_editor != NULL)
- {
- S32 text_heigth_delta =
- text_editor->getTextBoundingRect().getHeight()
- - text_heigth;
- notify_box->reshape(target_rect.getWidth(),
- notify_box->getRect().getHeight() + text_heigth_delta);
- }
-
LLInlineViewSegment::Params params;
params.view = notify_box;
params.left_pad = mLeftWidgetPad;
diff --git a/indra/newview/llchathistory.h b/indra/newview/llchathistory.h
index ac48d7bf29..28344e6a10 100644
--- a/indra/newview/llchathistory.h
+++ b/indra/newview/llchathistory.h
@@ -94,7 +94,7 @@ class LLChatHistory : public LLUICtrl
* Builds a message header.
* @return pointer to LLView header object.
*/
- LLView* getHeader(const LLChat& chat,const LLStyle::Params& style_params);
+ LLView* getHeader(const LLChat& chat,const LLStyle::Params& style_params, const LLSD& args);
void onClickMoreText();
diff --git a/indra/newview/llchatitemscontainerctrl.cpp b/indra/newview/llchatitemscontainerctrl.cpp
index 3afddc1145..9a84280f25 100644
--- a/indra/newview/llchatitemscontainerctrl.cpp
+++ b/indra/newview/llchatitemscontainerctrl.cpp
@@ -35,6 +35,7 @@
#include "llfloaterreg.h"
#include "lllocalcliprect.h"
#include "lltrans.h"
+#include "llnearbychatbar.h"
#include "llviewercontrol.h"
#include "llagentdata.h"
@@ -213,25 +214,15 @@ void LLNearbyChatToastPanel::init(LLSD& notification)
{
LLStyle::Params style_params_name;
- std::string href;
-
- if (mSourceType == CHAT_SOURCE_AGENT)
- {
- href = LLSLURL("agent", mFromID, "about").getSLURLString();
- }
- else
- {
- href = LLSLURL("object", mFromID, "inspect").getSLURLString();
- }
-
- style_params_name.color(textColor);
+ LLColor4 user_name_color = LLUIColorTable::instance().getColor("HTMLLinkColor");
+ style_params_name.color(user_name_color);
std::string font_name = LLFontGL::nameFromFont(messageFont);
std::string font_style_size = LLFontGL::sizeFromFont(messageFont);
style_params_name.font.name(font_name);
style_params_name.font.size(font_style_size);
- style_params_name.link_href = href;
+ style_params_name.link_href = notification["sender_slurl"].asString();
style_params_name.is_link = true;
msg_text->appendText(str_sender, FALSE, style_params_name);
@@ -325,12 +316,12 @@ BOOL LLNearbyChatToastPanel::handleMouseUp (S32 x, S32 y, MASK mask)
return TRUE;
else
{
- LLFloaterReg::showInstance("nearby_chat",LLSD());
+ LLNearbyChatBar::getInstance()->showHistory();
return FALSE;
}
}
- LLFloaterReg::showInstance("nearby_chat",LLSD());
+ LLNearbyChatBar::getInstance()->showHistory();
return LLPanel::handleMouseUp(x,y,mask);
}
diff --git a/indra/newview/llchatmsgbox.cpp b/indra/newview/llchatmsgbox.cpp
index 024ccbcd0b..aa6c9c094c 100644
--- a/indra/newview/llchatmsgbox.cpp
+++ b/indra/newview/llchatmsgbox.cpp
@@ -70,7 +70,7 @@ private:
LLChatMsgBox::Params::Params() :
block_spacing("block_spacing", 10)
{
- line_spacing.pixels = 4;
+ changeDefault(line_spacing.pixels, 4);
}
LLChatMsgBox::LLChatMsgBox(const Params& p) :
diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp
index 885d553524..a661808d1f 100644
--- a/indra/newview/llchiclet.cpp
+++ b/indra/newview/llchiclet.cpp
@@ -29,7 +29,7 @@
#include "llagent.h"
#include "llavataractions.h"
-#include "llbottomtray.h"
+#include "llchicletbar.h"
#include "lleventtimer.h"
#include "llgroupactions.h"
#include "lliconctrl.h"
@@ -126,9 +126,9 @@ LLSysWellChiclet::Params::Params()
, unread_notifications("unread_notifications")
, max_displayed_count("max_displayed_count", 99)
{
- button.name("button");
- button.tab_stop(FALSE);
- button.label(LLStringUtil::null);
+ button.name = "button";
+ button.tab_stop = FALSE;
+ button.label = LLStringUtil::null;
}
LLSysWellChiclet::LLSysWellChiclet(const Params& p)
@@ -214,10 +214,10 @@ void LLSysWellChiclet::updateWidget(bool is_window_empty)
{
mButton->setEnabled(!is_window_empty);
- LLSD params;
- params["well_empty"] = is_window_empty;
- params["well_name"] = getName();
- notifyParent(params);
+ if (LLChicletBar::instanceExists())
+ {
+ LLChicletBar::getInstance()->showWellButton(getName(), !is_window_empty);
+ }
}
// virtual
BOOL LLSysWellChiclet::handleRightMouseDown(S32 x, S32 y, MASK mask)
@@ -250,6 +250,12 @@ LLIMWellChiclet::LLIMWellChiclet(const Params& p)
LLIMWellChiclet::~LLIMWellChiclet()
{
+ LLIMWellWindow* im_well_window = LLIMWellWindow::findInstance();
+ if (im_well_window)
+ {
+ im_well_window->setSysWellChiclet(NULL);
+ }
+
LLIMMgr::getInstance()->removeSessionObserver(this);
}
@@ -296,8 +302,15 @@ void LLIMWellChiclet::createMenu()
void LLIMWellChiclet::messageCountChanged(const LLSD& session_data)
{
+ // The singleton class LLChicletBar instance might be already deleted
+ // so don't create a new one.
+ if (!LLChicletBar::instanceExists())
+ {
+ return;
+ }
+
const LLUUID& session_id = session_data["session_id"];
- const S32 counter = LLBottomTray::getInstance()->getTotalUnreadIMCount();
+ const S32 counter = LLChicletBar::getInstance()->getTotalUnreadIMCount();
const bool im_not_visible = !LLFloaterReg::instanceVisible("im_container")
&& !LLFloaterReg::instanceVisible("impanel", session_id);
@@ -483,8 +496,9 @@ void LLIMChiclet::setShowSpeaker(bool show)
if(needs_resize)
{
mShowSpeaker = show;
- toggleSpeakerControl();
}
+
+ toggleSpeakerControl();
}
void LLIMChiclet::enableCounterControl(bool enable)
@@ -1099,8 +1113,8 @@ LLChicletPanel::~LLChicletPanel()
}
}
-void im_chiclet_callback(LLChicletPanel* panel, const LLSD& data){
-
+void LLChicletPanel::onMessageCountChanged(const LLSD& data)
+{
LLUUID session_id = data["session_id"].asUUID();
S32 unread = data["participant_unread"].asInteger();
@@ -1125,7 +1139,7 @@ void im_chiclet_callback(LLChicletPanel* panel, const LLSD& data){
}
}
-void object_chiclet_callback(const LLSD& data)
+void LLChicletPanel::objectChicletCallback(const LLSD& data)
{
LLUUID notification_id = data["notification_id"];
bool new_message = data["new_message"];
@@ -1149,10 +1163,10 @@ void object_chiclet_callback(const LLSD& data)
BOOL LLChicletPanel::postBuild()
{
LLPanel::postBuild();
- LLIMModel::instance().addNewMsgCallback(boost::bind(im_chiclet_callback, this, _1));
- LLIMModel::instance().addNoUnreadMsgsCallback(boost::bind(im_chiclet_callback, this, _1));
- LLScriptFloaterManager::getInstance()->addNewObjectCallback(boost::bind(object_chiclet_callback, _1));
- LLScriptFloaterManager::getInstance()->addToggleObjectFloaterCallback(boost::bind(object_chiclet_callback, _1));
+ LLIMModel::instance().addNewMsgCallback(boost::bind(&LLChicletPanel::onMessageCountChanged, this, _1));
+ LLIMModel::instance().addNoUnreadMsgsCallback(boost::bind(&LLChicletPanel::onMessageCountChanged, this, _1));
+ LLScriptFloaterManager::getInstance()->addNewObjectCallback(boost::bind(&LLChicletPanel::objectChicletCallback, this, _1));
+ LLScriptFloaterManager::getInstance()->addToggleObjectFloaterCallback(boost::bind(&LLChicletPanel::objectChicletCallback, this, _1));
LLIMChiclet::sFindChicletsSignal.connect(boost::bind(&LLChicletPanel::findChiclet<LLChiclet>, this, _1));
LLVoiceChannel::setCurrentVoiceChannelChangedCallback(boost::bind(&LLChicletPanel::onCurrentVoiceChannelChanged, this, _1));
@@ -1183,6 +1197,10 @@ void LLChicletPanel::onCurrentVoiceChannelChanged(const LLUUID& session_id)
if(chiclet)
{
chiclet->setShowSpeaker(true);
+ if (gSavedSettings.getBOOL("OpenIMOnVoice"))
+ {
+ LLIMFloater::show(chiclet->getSessionId());
+ }
}
}
diff --git a/indra/newview/llchiclet.h b/indra/newview/llchiclet.h
index a6e12006a1..19683492c2 100644
--- a/indra/newview/llchiclet.h
+++ b/indra/newview/llchiclet.h
@@ -107,9 +107,9 @@ public:
{
Params()
{
- draw_tooltip(FALSE);
- mouse_opaque(FALSE);
- default_icon_name("Generic_Person");
+ changeDefault(draw_tooltip, FALSE);
+ changeDefault(mouse_opaque, FALSE);
+ changeDefault(default_icon_name, "Generic_Person");
};
};
@@ -131,9 +131,8 @@ public:
Optional<std::string> default_icon;
Params()
- : default_icon("default_icon", "Generic_Group")
- {
- };
+ : default_icon("default_icon", "Generic_Group")
+ {}
};
/**
@@ -162,9 +161,9 @@ public:
Optional<std::string> default_icon;
Params()
- : default_icon("default_icon", "Generic_Object_Small")
+ : default_icon("default_icon", "Generic_Object_Small")
{
- avatar_id = LLUUID::null;
+ changeDefault(avatar_id, LLUUID::null);
};
};
@@ -314,9 +313,7 @@ public:
TYPE_AD_HOC
};
struct Params : public LLInitParam::Block<Params, LLChiclet::Params>
- {
- Params(){}
- };
+ {};
virtual ~LLIMChiclet() {};
@@ -1161,6 +1158,10 @@ protected:
*/
void onChicletSizeChanged(LLChiclet* ctrl, const LLSD& param);
+ void onMessageCountChanged(const LLSD& data);
+
+ void objectChicletCallback(const LLSD& data);
+
typedef std::vector<LLChiclet*> chiclet_list_t;
/**
diff --git a/indra/newview/llchicletbar.cpp b/indra/newview/llchicletbar.cpp
new file mode 100644
index 0000000000..f1bc51fbe7
--- /dev/null
+++ b/indra/newview/llchicletbar.cpp
@@ -0,0 +1,345 @@
+/**
+ * @file llchicletbar.cpp
+ * @brief LLChicletBar class implementation
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h" // must be first include
+
+#include "llchicletbar.h"
+
+// library includes
+#include "llfloaterreg.h"
+#include "lllayoutstack.h"
+
+// newview includes
+#include "llchiclet.h"
+#include "llimfloater.h" // for LLIMFloater
+#include "llpaneltopinfobar.h"
+#include "llsyswellwindow.h"
+
+namespace
+{
+ const std::string& PANEL_CHICLET_NAME = "chiclet_list_panel";
+
+ S32 get_curr_width(LLUICtrl* ctrl)
+ {
+ S32 cur_width = 0;
+ if ( ctrl && ctrl->getVisible() )
+ {
+ cur_width = ctrl->getRect().getWidth();
+ }
+ return cur_width;
+ }
+}
+
+LLChicletBar::LLChicletBar(const LLSD&)
+: mChicletPanel(NULL),
+ mToolbarStack(NULL)
+{
+ // Firstly add our self to IMSession observers, so we catch session events
+ // before chiclets do that.
+ LLIMMgr::getInstance()->addSessionObserver(this);
+
+ buildFromFile("panel_chiclet_bar.xml");
+}
+
+LLChicletBar::~LLChicletBar()
+{
+ if (!LLSingleton<LLIMMgr>::destroyed())
+ {
+ LLIMMgr::getInstance()->removeSessionObserver(this);
+ }
+}
+
+LLIMChiclet* LLChicletBar::createIMChiclet(const LLUUID& session_id)
+{
+ LLIMChiclet::EType im_chiclet_type = LLIMChiclet::getIMSessionType(session_id);
+
+ switch (im_chiclet_type)
+ {
+ case LLIMChiclet::TYPE_IM:
+ return getChicletPanel()->createChiclet<LLIMP2PChiclet>(session_id);
+ case LLIMChiclet::TYPE_GROUP:
+ return getChicletPanel()->createChiclet<LLIMGroupChiclet>(session_id);
+ case LLIMChiclet::TYPE_AD_HOC:
+ return getChicletPanel()->createChiclet<LLAdHocChiclet>(session_id);
+ case LLIMChiclet::TYPE_UNKNOWN:
+ break;
+ }
+
+ return NULL;
+}
+
+//virtual
+void LLChicletBar::sessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id)
+{
+ if (!getChicletPanel()) return;
+
+ LLIMModel::LLIMSession* session = LLIMModel::getInstance()->findIMSession(session_id);
+ if (!session) return;
+
+ // no need to spawn chiclets for participants in P2P calls called through Avaline
+ if (session->isP2P() && session->isOtherParticipantAvaline()) return;
+
+ if (getChicletPanel()->findChiclet<LLChiclet>(session_id)) return;
+
+ LLIMChiclet* chiclet = createIMChiclet(session_id);
+ if(chiclet)
+ {
+ chiclet->setIMSessionName(name);
+ chiclet->setOtherParticipantId(other_participant_id);
+
+ LLIMFloater::onIMChicletCreated(session_id);
+
+ }
+ else
+ {
+ llwarns << "Could not create chiclet" << llendl;
+ }
+}
+
+//virtual
+void LLChicletBar::sessionRemoved(const LLUUID& session_id)
+{
+ if(getChicletPanel())
+ {
+ // IM floater should be closed when session removed and associated chiclet closed
+ LLIMFloater* iMfloater = LLFloaterReg::findTypedInstance<LLIMFloater>("impanel", session_id);
+ if (iMfloater != NULL)
+ {
+ iMfloater->closeFloater();
+ }
+
+ getChicletPanel()->removeChiclet(session_id);
+ }
+}
+
+void LLChicletBar::sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id)
+{
+ //this is only needed in case of outgoing ad-hoc/group chat sessions
+ LLChicletPanel* chiclet_panel = getChicletPanel();
+ if (chiclet_panel)
+ {
+ //it should be ad-hoc im chiclet or group im chiclet
+ LLChiclet* chiclet = chiclet_panel->findChiclet<LLChiclet>(old_session_id);
+ if (chiclet) chiclet->setSessionId(new_session_id);
+ }
+}
+
+S32 LLChicletBar::getTotalUnreadIMCount()
+{
+ return getChicletPanel()->getTotalUnreadIMCount();
+}
+
+BOOL LLChicletBar::postBuild()
+{
+ mToolbarStack = getChild<LLLayoutStack>("toolbar_stack");
+ mChicletPanel = getChild<LLChicletPanel>("chiclet_list");
+
+ showWellButton("im_well", !LLIMWellWindow::getInstance()->isWindowEmpty());
+ showWellButton("notification_well", !LLNotificationWellWindow::getInstance()->isWindowEmpty());
+
+ LLPanelTopInfoBar::instance().setResizeCallback(boost::bind(&LLChicletBar::fitWithTopInfoBar, this));
+ LLPanelTopInfoBar::instance().setVisibleCallback(boost::bind(&LLChicletBar::fitWithTopInfoBar, this));
+
+ return TRUE;
+}
+
+void LLChicletBar::showWellButton(const std::string& well_name, bool visible)
+{
+ LLView * panel = findChild<LLView>(well_name + "_panel");
+ if (!panel) return;
+
+ panel->setVisible(visible);
+}
+
+void LLChicletBar::log(LLView* panel, const std::string& descr)
+{
+ if (NULL == panel) return;
+ LLView* layout = panel->getParent();
+ LL_DEBUGS("Chiclet Bar Rects") << descr << ": "
+ << "panel: " << panel->getName()
+ << ", rect: " << panel->getRect()
+ << " layout: " << layout->getName()
+ << ", rect: " << layout->getRect()
+ << LL_ENDL;
+}
+
+void LLChicletBar::reshape(S32 width, S32 height, BOOL called_from_parent)
+{
+ static S32 debug_calling_number = 0;
+ lldebugs << "**************************************** " << ++debug_calling_number << llendl;
+
+ S32 current_width = getRect().getWidth();
+ S32 delta_width = width - current_width;
+ lldebugs << "Reshaping: "
+ << ", width: " << width
+ << ", cur width: " << current_width
+ << ", delta_width: " << delta_width
+ << ", called_from_parent: " << called_from_parent
+ << llendl;
+
+ if (mChicletPanel) log(mChicletPanel, "before");
+
+ // Difference between chiclet bar width required to fit its children and the actual width. (see EXT-991)
+ // Positive value means that chiclet bar is not wide enough.
+ // Negative value means that there is free space.
+ static S32 extra_shrink_width = 0;
+ bool should_be_reshaped = true;
+
+ if (mChicletPanel && mToolbarStack)
+ {
+ // Firstly, update layout stack to ensure we deal with correct panel sizes.
+ {
+ // Force the updating of layout to reset panels collapse factor.
+ mToolbarStack->updateLayout();
+ }
+
+ // chiclet bar is narrowed
+ if (delta_width < 0)
+ {
+ if (extra_shrink_width > 0) // not enough space
+ {
+ extra_shrink_width += llabs(delta_width);
+ should_be_reshaped = false;
+ }
+ else
+ {
+ extra_shrink_width = processWidthDecreased(delta_width);
+
+ // increase new width to extra_shrink_width value to not reshape less than chiclet bar minimum
+ width += extra_shrink_width;
+ }
+ }
+ // chiclet bar is widened
+ else
+ {
+ if (extra_shrink_width > delta_width)
+ {
+ // Still not enough space.
+ // Only subtract the delta from the required delta and don't reshape.
+ extra_shrink_width -= delta_width;
+ should_be_reshaped = false;
+ }
+ else if (extra_shrink_width > 0)
+ {
+ // If we have some extra shrink width let's reduce delta_width & width
+ delta_width -= extra_shrink_width;
+ width -= extra_shrink_width;
+ extra_shrink_width = 0;
+ }
+ }
+ }
+
+ if (should_be_reshaped)
+ {
+ lldebugs << "Reshape all children with width: " << width << llendl;
+ LLPanel::reshape(width, height, called_from_parent);
+ }
+
+ if (mChicletPanel) log(mChicletPanel, "after");
+}
+
+S32 LLChicletBar::processWidthDecreased(S32 delta_width)
+{
+ bool still_should_be_processed = true;
+
+ const S32 chiclet_panel_shrink_headroom = getChicletPanelShrinkHeadroom();
+
+ // Decreasing width of chiclet panel.
+ if (chiclet_panel_shrink_headroom > 0)
+ {
+ // we have some space to decrease chiclet panel
+ S32 shrink_by = llmin(-delta_width, chiclet_panel_shrink_headroom);
+
+ lldebugs << "delta_width: " << delta_width
+ << ", panel_delta_min: " << chiclet_panel_shrink_headroom
+ << ", shrink_by: " << shrink_by
+ << llendl;
+
+ // is chiclet panel wide enough to process resizing?
+ delta_width += chiclet_panel_shrink_headroom;
+
+ still_should_be_processed = delta_width < 0;
+
+ lldebugs << "Shrinking chiclet panel by " << shrink_by << " px" << llendl;
+ mChicletPanel->getParent()->reshape(mChicletPanel->getParent()->getRect().getWidth() - shrink_by, mChicletPanel->getParent()->getRect().getHeight());
+ log(mChicletPanel, "after processing panel decreasing via chiclet panel");
+
+ lldebugs << "RS_CHICLET_PANEL"
+ << ", delta_width: " << delta_width
+ << llendl;
+ }
+
+ S32 extra_shrink_width = 0;
+
+ if (still_should_be_processed)
+ {
+ extra_shrink_width = -delta_width;
+ llwarns << "There is no enough width to reshape all children: "
+ << extra_shrink_width << llendl;
+ }
+
+ return extra_shrink_width;
+}
+
+S32 LLChicletBar::getChicletPanelShrinkHeadroom() const
+{
+ static const S32 min_width = mChicletPanel->getMinWidth();
+ const S32 cur_width = mChicletPanel->getParent()->getRect().getWidth();
+
+ S32 shrink_headroom = cur_width - min_width;
+ llassert(shrink_headroom >= 0); // the panel cannot get narrower than the minimum
+ return shrink_headroom;
+}
+
+void LLChicletBar::fitWithTopInfoBar()
+{
+ LLPanelTopInfoBar& top_info_bar = LLPanelTopInfoBar::instance();
+
+ LLRect rect = getRect();
+ S32 width = rect.getWidth();
+
+ if (top_info_bar.getVisible())
+ {
+ S32 delta = top_info_bar.calcScreenRect().mRight - calcScreenRect().mLeft;
+ if (delta < 0 && rect.mLeft < llabs(delta))
+ delta = -rect.mLeft;
+ rect.setLeftTopAndSize(rect.mLeft + delta, rect.mTop, rect.getWidth(), rect.getHeight());
+ width = rect.getWidth() - delta;
+ }
+ else
+ {
+ LLView* parent = getParent();
+ if (parent)
+ {
+ LLRect parent_rect = parent->getRect();
+ rect.setLeftTopAndSize(0, rect.mTop, rect.getWidth(), rect.getHeight());
+ width = parent_rect.getWidth();
+ }
+ }
+
+ setRect(rect);
+ LLPanel::reshape(width, rect.getHeight(), false);
+}
diff --git a/indra/newview/llchicletbar.h b/indra/newview/llchicletbar.h
new file mode 100644
index 0000000000..1427bf95e0
--- /dev/null
+++ b/indra/newview/llchicletbar.h
@@ -0,0 +1,105 @@
+/**
+* @file llchicletbar.h
+* @brief LLChicletBar class header file
+*
+* $LicenseInfo:firstyear=2011&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2011, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+* $/LicenseInfo$
+*/
+
+#ifndef LL_LLCHICLETBAR_H
+#define LL_LLCHICLETBAR_H
+
+#include "llpanel.h"
+#include "llimview.h"
+
+class LLChicletPanel;
+class LLIMChiclet;
+class LLLayoutPanel;
+class LLLayoutStack;
+
+class LLChicletBar
+ : public LLSingleton<LLChicletBar>
+ , public LLPanel
+ , public LLIMSessionObserver
+{
+ LOG_CLASS(LLChicletBar);
+ friend class LLSingleton<LLChicletBar>;
+public:
+ ~LLChicletBar();
+
+ BOOL postBuild();
+
+ LLChicletPanel* getChicletPanel() { return mChicletPanel; }
+
+ // LLIMSessionObserver observe triggers
+ virtual void sessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id);
+ virtual void sessionRemoved(const LLUUID& session_id);
+ void sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id);
+
+ S32 getTotalUnreadIMCount();
+
+ /*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent);
+
+ /**
+ * Creates IM Chiclet based on session type (IM chat or Group chat)
+ */
+ LLIMChiclet* createIMChiclet(const LLUUID& session_id);
+
+ /**
+ * Shows/hides panel with specified well button (IM or Notification)
+ *
+ * @param well_name - name of the well panel to be processed.
+ * @param visible - a flag specifying whether a button should be shown or hidden.
+ */
+ void showWellButton(const std::string& well_name, bool visible);
+
+private:
+ /**
+ * Updates child controls size and visibility when it is necessary to reduce total width.
+ *
+ * @param delta_width - value by which chiclet bar should be shrunk. It is a negative value.
+ * @returns positive value which chiclet bar can not process when it reaches its minimal width.
+ * Zero if there was enough space to process delta_width.
+ */
+ S32 processWidthDecreased(S32 delta_width);
+
+ /** helper function to log debug messages */
+ void log(LLView* panel, const std::string& descr);
+
+ /**
+ * @return difference between current chiclet panel width and the minimum.
+ */
+ S32 getChicletPanelShrinkHeadroom() const;
+
+ /**
+ * function adjusts Chiclet bar width to prevent overlapping with Mini-Location bar
+ * EXP-1463
+ */
+ void fitWithTopInfoBar();
+
+protected:
+ LLChicletBar(const LLSD& key = LLSD());
+
+ LLChicletPanel* mChicletPanel;
+ LLLayoutStack* mToolbarStack;
+};
+
+#endif // LL_LLCHICLETBAR_H
diff --git a/indra/newview/llcloud.cpp b/indra/newview/llcloud.cpp
deleted file mode 100644
index cda0f6e4a2..0000000000
--- a/indra/newview/llcloud.cpp
+++ /dev/null
@@ -1,538 +0,0 @@
-/**
- * @file llcloud.cpp
- * @brief Implementation of viewer LLCloudLayer class
- *
- * $LicenseInfo:firstyear=2001&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llmath.h"
-//#include "vmath.h"
-#include "v3math.h"
-#include "v4math.h"
-#include "llquaternion.h"
-#include "llrand.h"
-#include "v4color.h"
-
-#include "llwind.h"
-#include "llcloud.h"
-#include "llgl.h"
-#include "llviewerobjectlist.h"
-#include "llvoclouds.h"
-#include "llvosky.h"
-#include "llsky.h"
-#include "llviewerregion.h"
-#include "patch_dct.h"
-#include "patch_code.h"
-#include "llglheaders.h"
-#include "pipeline.h"
-#include "lldrawpool.h"
-#include "llworld.h"
-
-extern LLPipeline gPipeline;
-
-const F32 CLOUD_UPDATE_RATE = 1.0f; // Global time dilation for clouds
-const F32 CLOUD_GROW_RATE = 0.05f;
-const F32 CLOUD_DECAY_RATE = -0.05f;
-const F32 CLOUD_VELOCITY_SCALE = 0.01f;
-const F32 CLOUD_DENSITY = 25.f;
-const S32 CLOUD_COUNT_MAX = 20;
-const F32 CLOUD_HEIGHT_RANGE = 48.f;
-const F32 CLOUD_HEIGHT_MEAN = 192.f;
-
-enum
-{
- LL_PUFF_GROWING = 0,
- LL_PUFF_DYING = 1
-};
-
-// Used for patch decoder
-S32 gBuffer[16*16];
-
-
-//static
-S32 LLCloudPuff::sPuffCount = 0;
-
-LLCloudPuff::LLCloudPuff() :
- mAlpha(0.01f),
- mRate(CLOUD_GROW_RATE*CLOUD_UPDATE_RATE),
- mLifeState(LL_PUFF_GROWING)
-{
-}
-
-LLCloudGroup::LLCloudGroup() :
- mCloudLayerp(NULL),
- mDensity(0.f),
- mTargetPuffCount(0),
- mVOCloudsp(NULL)
-{
-}
-
-void LLCloudGroup::cleanup()
-{
- if (mVOCloudsp)
- {
- if (!mVOCloudsp->isDead())
- {
- gObjectList.killObject(mVOCloudsp);
- }
- mVOCloudsp = NULL;
- }
-}
-
-void LLCloudGroup::setCenterRegion(const LLVector3 &center)
-{
- mCenterRegion = center;
-}
-
-void LLCloudGroup::updatePuffs(const F32 dt)
-{
- mDensity = mCloudLayerp->getDensityRegion(mCenterRegion);
-
- if (!mVOCloudsp)
- {
- mVOCloudsp = (LLVOClouds *)gObjectList.createObjectViewer(LLViewerObject::LL_VO_CLOUDS, mCloudLayerp->getRegion());
- mVOCloudsp->setCloudGroup(this);
- mVOCloudsp->setPositionRegion(mCenterRegion);
- mVOCloudsp->setScale(LLVector3(256.f/CLOUD_GROUPS_PER_EDGE + CLOUD_PUFF_WIDTH,
- 256.f/CLOUD_GROUPS_PER_EDGE + CLOUD_PUFF_WIDTH,
- CLOUD_HEIGHT_RANGE + CLOUD_PUFF_HEIGHT)*0.5f);
- gPipeline.createObject(mVOCloudsp);
- }
-
- LLVector3 velocity;
- LLVector3d vel_d;
- // Update the positions of all of the clouds
- for (U32 i = 0; i < mCloudPuffs.size(); i++)
- {
- LLCloudPuff &puff = mCloudPuffs[i];
- velocity = mCloudLayerp->getRegion()->mWind.getCloudVelocity(mCloudLayerp->getRegion()->getPosRegionFromGlobal(puff.mPositionGlobal));
- velocity *= CLOUD_VELOCITY_SCALE*CLOUD_UPDATE_RATE;
- vel_d.setVec(velocity);
- mCloudPuffs[i].mPositionGlobal += vel_d;
- mCloudPuffs[i].mAlpha += mCloudPuffs[i].mRate * dt;
- mCloudPuffs[i].mAlpha = llmin(1.f, mCloudPuffs[i].mAlpha);
- mCloudPuffs[i].mAlpha = llmax(0.f, mCloudPuffs[i].mAlpha);
- }
-}
-
-void LLCloudGroup::updatePuffOwnership()
-{
- U32 i = 0;
- while (i < mCloudPuffs.size())
- {
- if (mCloudPuffs[i].getLifeState() == LL_PUFF_DYING)
- {
- i++;
- continue;
- }
- if (inGroup(mCloudPuffs[i]))
- {
- i++;
- continue;
- }
-
- //llinfos << "Cloud moving to new group" << llendl;
- LLCloudGroup *new_cgp = LLWorld::getInstance()->findCloudGroup(mCloudPuffs[i]);
- if (!new_cgp)
- {
- //llinfos << "Killing puff not in group" << llendl;
- mCloudPuffs[i].setLifeState(LL_PUFF_DYING);
- mCloudPuffs[i].mRate = CLOUD_DECAY_RATE*CLOUD_UPDATE_RATE;
- i++;
- continue;
- }
- //llinfos << "Puff handed off!" << llendl;
- LLCloudPuff puff;
- puff.mPositionGlobal = mCloudPuffs[i].mPositionGlobal;
- puff.mAlpha = mCloudPuffs[i].mAlpha;
- mCloudPuffs.erase(mCloudPuffs.begin() + i);
- new_cgp->mCloudPuffs.push_back(puff);
- }
-
- //llinfos << "Puff count: " << LLCloudPuff::sPuffCount << llendl;
-}
-
-void LLCloudGroup::updatePuffCount()
-{
- if (!mVOCloudsp)
- {
- return;
- }
- S32 i;
- S32 target_puff_count = llround(CLOUD_DENSITY * mDensity);
- target_puff_count = llmax(0, target_puff_count);
- target_puff_count = llmin(CLOUD_COUNT_MAX, target_puff_count);
- S32 current_puff_count = (S32) mCloudPuffs.size();
- // Create a new cloud if we need one
- if (current_puff_count < target_puff_count)
- {
- LLVector3d puff_pos_global;
- mCloudPuffs.resize(target_puff_count);
- for (i = current_puff_count; i < target_puff_count; i++)
- {
- puff_pos_global = mVOCloudsp->getPositionGlobal();
- F32 x = ll_frand(256.f/CLOUD_GROUPS_PER_EDGE) - 128.f/CLOUD_GROUPS_PER_EDGE;
- F32 y = ll_frand(256.f/CLOUD_GROUPS_PER_EDGE) - 128.f/CLOUD_GROUPS_PER_EDGE;
- F32 z = ll_frand(CLOUD_HEIGHT_RANGE) - 0.5f*CLOUD_HEIGHT_RANGE;
- puff_pos_global += LLVector3d(x, y, z);
- mCloudPuffs[i].mPositionGlobal = puff_pos_global;
- mCloudPuffs[i].mAlpha = 0.01f;
- LLCloudPuff::sPuffCount++;
- }
- }
-
- // Count the number of live puffs
- S32 live_puff_count = 0;
- for (i = 0; i < (S32) mCloudPuffs.size(); i++)
- {
- if (mCloudPuffs[i].getLifeState() != LL_PUFF_DYING)
- {
- live_puff_count++;
- }
- }
-
-
- // Start killing enough puffs so the live puff count == target puff count
- S32 new_dying_count = llmax(0, live_puff_count - target_puff_count);
- i = 0;
- while (new_dying_count > 0)
- {
- if (mCloudPuffs[i].getLifeState() != LL_PUFF_DYING)
- {
- //llinfos << "Killing extra live cloud" << llendl;
- mCloudPuffs[i].setLifeState(LL_PUFF_DYING);
- mCloudPuffs[i].mRate = CLOUD_DECAY_RATE*CLOUD_UPDATE_RATE;
- new_dying_count--;
- }
- i++;
- }
-
- // Remove fully dead puffs
- i = 0;
- while (i < (S32) mCloudPuffs.size())
- {
- if (mCloudPuffs[i].isDead())
- {
- //llinfos << "Removing dead puff!" << llendl;
- mCloudPuffs.erase(mCloudPuffs.begin() + i);
- LLCloudPuff::sPuffCount--;
- }
- else
- {
- i++;
- }
- }
-}
-
-BOOL LLCloudGroup::inGroup(const LLCloudPuff &puff) const
-{
- // Do min/max check on center of the cloud puff
- F32 min_x, min_y, max_x, max_y;
- F32 delta = 128.f/CLOUD_GROUPS_PER_EDGE;
- min_x = mCenterRegion.mV[VX] - delta;
- min_y = mCenterRegion.mV[VY] - delta;
- max_x = mCenterRegion.mV[VX] + delta;
- max_y = mCenterRegion.mV[VY] + delta;
-
- LLVector3 pos_region = mCloudLayerp->getRegion()->getPosRegionFromGlobal(puff.getPositionGlobal());
-
- if ((pos_region.mV[VX] < min_x)
- || (pos_region.mV[VY] < min_y)
- || (pos_region.mV[VX] > max_x)
- || (pos_region.mV[VY] > max_y))
- {
- return FALSE;
- }
- return TRUE;
-}
-
-LLCloudLayer::LLCloudLayer()
-: mOriginGlobal(0.0f, 0.0f, 0.0f),
- mMetersPerEdge(1.0f),
- mMetersPerGrid(1.0f),
- mWindp(NULL),
- mDensityp(NULL)
-{
- S32 i, j;
- for (i = 0; i < 4; i++)
- {
- mNeighbors[i] = NULL;
- }
-
- F32 x, y;
- for (i = 0; i < CLOUD_GROUPS_PER_EDGE; i++)
- {
- y = (0.5f + i)*(256.f/CLOUD_GROUPS_PER_EDGE);
- for (j = 0; j < CLOUD_GROUPS_PER_EDGE; j++)
- {
- x = (0.5f + j)*(256.f/CLOUD_GROUPS_PER_EDGE);
-
- mCloudGroups[i][j].setCloudLayerp(this);
- mCloudGroups[i][j].setCenterRegion(LLVector3(x, y, CLOUD_HEIGHT_MEAN));
- }
- }
-}
-
-
-
-LLCloudLayer::~LLCloudLayer()
-{
- destroy();
-}
-
-
-void LLCloudLayer::create(LLViewerRegion *regionp)
-{
- llassert(regionp);
-
- mRegionp = regionp;
- mDensityp = new F32 [CLOUD_GRIDS_PER_EDGE * CLOUD_GRIDS_PER_EDGE];
-
- U32 i;
- for (i = 0; i < CLOUD_GRIDS_PER_EDGE*CLOUD_GRIDS_PER_EDGE; i++)
- {
- mDensityp[i] = 0.f;
- }
-}
-
-void LLCloudLayer::setRegion(LLViewerRegion *regionp)
-{
- mRegionp = regionp;
-}
-
-void LLCloudLayer::destroy()
-{
- reset();
-
- delete [] mDensityp;
- mDensityp = NULL;
- mWindp = NULL;
-}
-
-
-void LLCloudLayer::reset()
-{
- // Kill all of the existing puffs
- S32 i, j;
-
- for (i = 0; i < CLOUD_GROUPS_PER_EDGE; i++)
- {
- for (j = 0; j < CLOUD_GROUPS_PER_EDGE; j++)
- {
- mCloudGroups[i][j].cleanup();
- }
- }
-}
-
-void LLCloudLayer::setWindPointer(LLWind *windp)
-{
- if (mWindp)
- {
- mWindp->setCloudDensityPointer(NULL);
- }
- mWindp = windp;
- if (mWindp)
- {
- mWindp->setCloudDensityPointer(mDensityp);
- }
-}
-
-
-void LLCloudLayer::setWidth(F32 width)
-{
- mMetersPerEdge = width;
- mMetersPerGrid = width / CLOUD_GRIDS_PER_EDGE;
-}
-
-
-F32 LLCloudLayer::getDensityRegion(const LLVector3 &pos_region)
-{
- // "position" is region-local
- S32 i, j, ii, jj;
-
- i = lltrunc(pos_region.mV[VX] / mMetersPerGrid);
- j = lltrunc(pos_region.mV[VY] / mMetersPerGrid);
- ii = i + 1;
- jj = j + 1;
-
-
- // clamp
- if (i >= (S32)CLOUD_GRIDS_PER_EDGE)
- {
- i = CLOUD_GRIDS_PER_EDGE - 1;
- ii = i;
- }
- else if (i < 0)
- {
- i = 0;
- ii = i;
- }
- else if (ii >= (S32)CLOUD_GRIDS_PER_EDGE || ii < 0)
- {
- ii = i;
- }
-
- if (j >= (S32)CLOUD_GRIDS_PER_EDGE)
- {
- j = CLOUD_GRIDS_PER_EDGE - 1;
- jj = j;
- }
- else if (j < 0)
- {
- j = 0;
- jj = j;
- }
- else if (jj >= (S32)CLOUD_GRIDS_PER_EDGE || jj < 0)
- {
- jj = j;
- }
-
- F32 dx = (pos_region.mV[VX] - (F32) i * mMetersPerGrid) / mMetersPerGrid;
- F32 dy = (pos_region.mV[VY] - (F32) j * mMetersPerGrid) / mMetersPerGrid;
- F32 omdx = 1.0f - dx;
- F32 omdy = 1.0f - dy;
-
- F32 density = dx * dy * *(mDensityp + ii + jj * CLOUD_GRIDS_PER_EDGE) +
- dx * omdy * *(mDensityp + i + jj * CLOUD_GRIDS_PER_EDGE) +
- omdx * dy * *(mDensityp + ii + j * CLOUD_GRIDS_PER_EDGE) +
- omdx * omdy * *(mDensityp + i + j * CLOUD_GRIDS_PER_EDGE);
-
- return density;
-}
-
-void LLCloudLayer::decompress(LLBitPack &bitpack, LLGroupHeader *group_headerp)
-{
- LLPatchHeader patch_header;
-
- init_patch_decompressor(group_headerp->patch_size);
-
- // Don't use the packed group_header stride because the strides used on
- // simulator and viewer are not equal.
- group_headerp->stride = group_headerp->patch_size; // offset required to step up one row
- set_group_of_patch_header(group_headerp);
-
- decode_patch_header(bitpack, &patch_header);
- decode_patch(bitpack, gBuffer);
- decompress_patch(mDensityp, gBuffer, &patch_header);
-}
-
-void LLCloudLayer::updatePuffs(const F32 dt)
-{
- // We want to iterate through all of the cloud groups
- // and update their density targets
-
- S32 i, j;
-
- for (i = 0; i < CLOUD_GROUPS_PER_EDGE; i++)
- {
- for (j = 0; j < CLOUD_GROUPS_PER_EDGE; j++)
- {
- mCloudGroups[i][j].updatePuffs(dt);
- }
- }
-}
-
-void LLCloudLayer::updatePuffOwnership()
-{
- S32 i, j;
-
- for (i = 0; i < CLOUD_GROUPS_PER_EDGE; i++)
- {
- for (j = 0; j < CLOUD_GROUPS_PER_EDGE; j++)
- {
- mCloudGroups[i][j].updatePuffOwnership();
- }
- }
-}
-
-void LLCloudLayer::updatePuffCount()
-{
- S32 i, j;
-
- for (i = 0; i < CLOUD_GROUPS_PER_EDGE; i++)
- {
- for (j = 0; j < CLOUD_GROUPS_PER_EDGE; j++)
- {
- mCloudGroups[i][j].updatePuffCount();
- }
- }
-}
-
-LLCloudGroup *LLCloudLayer::findCloudGroup(const LLCloudPuff &puff)
-{
- S32 i, j;
-
- for (i = 0; i < CLOUD_GROUPS_PER_EDGE; i++)
- {
- for (j = 0; j < CLOUD_GROUPS_PER_EDGE; j++)
- {
- if (mCloudGroups[i][j].inGroup(puff))
- {
- return &(mCloudGroups[i][j]);
- }
- }
- }
- return NULL;
-}
-
-
-
-void LLCloudLayer::connectNeighbor(LLCloudLayer *cloudp, U32 direction)
-{
- if (direction >= 4)
- {
- // Only care about cardinal 4 directions.
- return;
- }
-
- mNeighbors[direction] = cloudp;
- if (cloudp)
- mNeighbors[direction]->mNeighbors[gDirOpposite[direction]] = this;
-}
-
-
-void LLCloudLayer::disconnectNeighbor(U32 direction)
-{
- if (direction >= 4)
- {
- // Only care about cardinal 4 directions.
- return;
- }
-
- if (mNeighbors[direction])
- {
- mNeighbors[direction]->mNeighbors[gDirOpposite[direction]] = NULL;
- mNeighbors[direction] = NULL;
- }
-}
-
-
-void LLCloudLayer::disconnectAllNeighbors()
-{
- S32 i;
- for (i = 0; i < 4; i++)
- {
- disconnectNeighbor(i);
- }
-}
diff --git a/indra/newview/llcloud.h b/indra/newview/llcloud.h
deleted file mode 100644
index 0435ba1ece..0000000000
--- a/indra/newview/llcloud.h
+++ /dev/null
@@ -1,199 +0,0 @@
-/**
- * @file llcloud.h
- * @brief Description of viewer LLCloudLayer class
- *
- * $LicenseInfo:firstyear=2001&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLCLOUD_H
-#define LL_LLCLOUD_H
-
-// Some ideas on how clouds should work
-//
-// Each region has a cloud layer
-// Each cloud layer has pre-allocated space for N clouds
-// The LLSky class knows the max number of clouds to render M.
-// All clouds use the same texture, but the tex-coords can take on 8 configurations
-// (four rotations, front and back)
-//
-// The sky's part
-// --------------
-// The sky knows that A clouds have been assigned to regions and there are B left over.
-// Divide B by number of active regions to get C.
-// Ask each region to add C more clouds and return total number D.
-// Add up all the D's to get a new A.
-//
-// The cloud layer's part
-// ----------------------
-// The cloud layer is a grid of possibility. Each grid's value represents the probablility
-// (0.0 to 1.0) that a cloud placement query will succeed.
-//
-// The sky asks the region to add C more clouds.
-// The cloud layer tries a total of E times to place clouds and returns total cloud count.
-//
-// Clouds move according to local wind velocity.
-// If a cloud moves out of region then it's location is sent to neighbor region
-// or it is allowed to drift and decay.
-//
-// The clouds in non-visible regions do not propagate every frame.
-// Each frame one non-visible region is allowed to propagate it's clouds
-// (might have to check to see if incoming cloud was already visible or not).
-//
-//
-
-#include "llmath.h"
-//#include "vmath.h"
-#include "v3math.h"
-#include "v3dmath.h"
-#include "v4math.h"
-#include "v4color.h"
-#include "llpointer.h"
-#include "lldarray.h"
-
-#include "llframetimer.h"
-
-const U32 CLOUD_GRIDS_PER_EDGE = 16;
-
-const F32 CLOUD_PUFF_WIDTH = 64.f;
-const F32 CLOUD_PUFF_HEIGHT = 48.f;
-
-class LLWind;
-class LLVOClouds;
-class LLViewerRegion;
-class LLCloudLayer;
-class LLBitPack;
-class LLGroupHeader;
-
-const S32 CLOUD_GROUPS_PER_EDGE = 4;
-
-class LLCloudPuff
-{
-public:
- LLCloudPuff();
-
- const LLVector3d &getPositionGlobal() const { return mPositionGlobal; }
- friend class LLCloudGroup;
-
- void updatePuffs(const F32 dt);
- void updatePuffOwnership();
-
- F32 getAlpha() const { return mAlpha; }
- U32 getLifeState() const { return mLifeState; }
- void setLifeState(const U32 state) { mLifeState = state; }
- BOOL isDead() const { return mAlpha <= 0.f; }
-
-
- static S32 sPuffCount;
-protected:
- F32 mAlpha;
- F32 mRate;
- LLVector3d mPositionGlobal;
-
- BOOL mLifeState;
-};
-
-class LLCloudGroup
-{
-public:
- LLCloudGroup();
-
- void cleanup();
-
- void setCloudLayerp(LLCloudLayer *clp) { mCloudLayerp = clp; }
- void setCenterRegion(const LLVector3 &center);
-
- void updatePuffs(const F32 dt);
- void updatePuffOwnership();
- void updatePuffCount();
-
- BOOL inGroup(const LLCloudPuff &puff) const;
-
- F32 getDensity() const { return mDensity; }
- S32 getNumPuffs() const { return (S32) mCloudPuffs.size(); }
- const LLCloudPuff &getPuff(const S32 i) { return mCloudPuffs[i]; }
-protected:
- LLCloudLayer *mCloudLayerp;
- LLVector3 mCenterRegion;
- F32 mDensity;
- S32 mTargetPuffCount;
-
- std::vector<LLCloudPuff> mCloudPuffs;
- LLPointer<LLVOClouds> mVOCloudsp;
-};
-
-
-class LLCloudLayer
-{
-public:
- LLCloudLayer();
- ~LLCloudLayer();
-
- void create(LLViewerRegion *regionp);
- void destroy();
-
- void reset(); // Clears all active cloud puffs
-
-
- void updatePuffs(const F32 dt);
- void updatePuffOwnership();
- void updatePuffCount();
-
- LLCloudGroup *findCloudGroup(const LLCloudPuff &puff);
-
- void setRegion(LLViewerRegion *regionp);
- LLViewerRegion* getRegion() const { return mRegionp; }
- void setWindPointer(LLWind *windp);
- void setOriginGlobal(const LLVector3d &origin_global) { mOriginGlobal = origin_global; }
- void setWidth(F32 width);
-
- void setBrightness(F32 brightness);
- void setSunColor(const LLColor4 &color);
-
- F32 getDensityRegion(const LLVector3 &pos_region); // "position" is in local coordinates
-
- void decompress(LLBitPack &bitpack, LLGroupHeader *group_header);
-
- LLCloudLayer* getNeighbor(const S32 n) const { return mNeighbors[n]; }
-
- void connectNeighbor(LLCloudLayer *cloudp, U32 direction);
- void disconnectNeighbor(U32 direction);
- void disconnectAllNeighbors();
-
-public:
- LLVector3d mOriginGlobal;
- F32 mMetersPerEdge;
- F32 mMetersPerGrid;
-
-
- F32 mMaxAlpha; // The max cloud puff _render_ alpha
-
-protected:
- LLCloudLayer *mNeighbors[4];
- LLWind *mWindp;
- LLViewerRegion *mRegionp;
- F32 *mDensityp; // the probability density grid
-
- LLCloudGroup mCloudGroups[CLOUD_GROUPS_PER_EDGE][CLOUD_GROUPS_PER_EDGE];
-};
-
-
-#endif
diff --git a/indra/newview/llcofwearables.cpp b/indra/newview/llcofwearables.cpp
index 84c560639e..e9c7a3fa03 100644
--- a/indra/newview/llcofwearables.cpp
+++ b/indra/newview/llcofwearables.cpp
@@ -33,6 +33,7 @@
#include "llagentdata.h"
#include "llagentwearables.h"
#include "llappearancemgr.h"
+#include "llfloatersidepanelcontainer.h"
#include "llinventory.h"
#include "llinventoryfunctions.h"
#include "lllistcontextmenu.h"
@@ -40,7 +41,6 @@
#include "llviewermenu.h"
#include "llwearableitemslist.h"
#include "llpaneloutfitedit.h"
-#include "llsidetray.h"
#include "lltrans.h"
static LLRegisterPanelClassWrapper<LLCOFWearables> t_cof_wearables("cof_wearables");
@@ -159,13 +159,8 @@ public:
protected:
static void replaceWearable(const LLUUID& item_id)
{
- // *TODO: Most probable that accessing to LLPanelOutfitEdit instance should be:
- // LLSideTray::getInstance()->getSidepanelAppearance()->getPanelOutfitEdit()
- // without casting. Getter methods provides possibility to check and construct
- // absent instance. Explicit relations between components avoids situations
- // when we tries to construct instance with unsatisfied implicit input conditions.
LLPanelOutfitEdit * panel_outfit_edit =
- dynamic_cast<LLPanelOutfitEdit*> (LLSideTray::getInstance()->getPanel(
+ dynamic_cast<LLPanelOutfitEdit*> (LLFloaterSidePanelContainer::getPanel("appearance",
"panel_outfit_edit"));
if (panel_outfit_edit != NULL)
{
@@ -235,9 +230,7 @@ protected:
LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar;
LLUUID selected_id = mUUIDs.back();
- // *HACK* need to pass pointer to LLPanelOutfitEdit instead of LLSideTray::getInstance()->getPanel().
- // LLSideTray::getInstance()->getPanel() is rather slow variant
- LLPanelOutfitEdit* panel_oe = dynamic_cast<LLPanelOutfitEdit*>(LLSideTray::getInstance()->getPanel("panel_outfit_edit"));
+ LLPanelOutfitEdit* panel_oe = dynamic_cast<LLPanelOutfitEdit*>(LLFloaterSidePanelContainer::getPanel("appearance", "panel_outfit_edit"));
registrar.add("BodyPart.Replace", boost::bind(&LLPanelOutfitEdit::onReplaceMenuItemClicked, panel_oe, selected_id));
registrar.add("BodyPart.Edit", boost::bind(LLAgentWearables::editWearable, selected_id));
registrar.add("BodyPart.Create", boost::bind(&CofBodyPartContextMenu::createNew, this, selected_id));
@@ -317,7 +310,6 @@ BOOL LLCOFWearables::postBuild()
mAttachments->setComparator(&WEARABLE_NAME_COMPARATOR);
mBodyParts->setComparator(&WEARABLE_NAME_COMPARATOR);
-
mClothingTab = getChild<LLAccordionCtrlTab>("tab_clothing");
mClothingTab->setDropDownStateChangedCallback(boost::bind(&LLCOFWearables::onAccordionTabStateChanged, this, _1, _2));
@@ -336,6 +328,19 @@ BOOL LLCOFWearables::postBuild()
return LLPanel::postBuild();
}
+void LLCOFWearables::setAttachmentsTitle()
+{
+ if (mAttachmentsTab)
+ {
+ U32 free_slots = MAX_AGENT_ATTACHMENTS - mAttachments->size();
+
+ LLStringUtil::format_map_t args_attachments;
+ args_attachments["[COUNT]"] = llformat ("%d", free_slots);
+ std::string attachments_title = LLTrans::getString("Attachments remain", args_attachments);
+ mAttachmentsTab->setTitle(attachments_title);
+ }
+}
+
void LLCOFWearables::onSelectionChange(LLFlatListView* selected_list)
{
if (!selected_list) return;
@@ -498,6 +503,11 @@ void LLCOFWearables::populateAttachmentsAndBodypartsLists(const LLInventoryModel
{
mAttachments->sort();
mAttachments->notify(REARRANGE); //notifying the parent about the list's size change (cause items were added with rearrange=false)
+ setAttachmentsTitle();
+ }
+ else
+ {
+ mAttachments->setNoItemsCommentText(LLTrans::getString("no_attachments"));
}
if (mBodyParts->size())
diff --git a/indra/newview/llcofwearables.h b/indra/newview/llcofwearables.h
index 1f8d6d0c94..9957d6a64e 100644
--- a/indra/newview/llcofwearables.h
+++ b/indra/newview/llcofwearables.h
@@ -91,6 +91,8 @@ public:
*/
void selectClothing(LLWearableType::EType clothing_type);
+ void setAttachmentsTitle();
+
protected:
void populateAttachmentsAndBodypartsLists(const LLInventoryModel::item_array_t& cof_items);
diff --git a/indra/newview/llcolorswatch.cpp b/indra/newview/llcolorswatch.cpp
index e7634ff0f4..5b942f283a 100644
--- a/indra/newview/llcolorswatch.cpp
+++ b/indra/newview/llcolorswatch.cpp
@@ -57,7 +57,6 @@ LLColorSwatchCtrl::Params::Params()
caption_text("caption_text"),
border("border")
{
- name = "colorswatch";
}
LLColorSwatchCtrl::LLColorSwatchCtrl(const Params& p)
@@ -185,6 +184,10 @@ BOOL LLColorSwatchCtrl::handleMouseUp(S32 x, S32 y, MASK mask)
llassert(getEnabled());
llassert(getVisible());
+ // Focus the widget now in order to return the focus
+ // after the color picker is closed.
+ setFocus(TRUE);
+
showPicker(FALSE);
}
}
@@ -195,7 +198,9 @@ BOOL LLColorSwatchCtrl::handleMouseUp(S32 x, S32 y, MASK mask)
// assumes GL state is set for 2D
void LLColorSwatchCtrl::draw()
{
- F32 alpha = getDrawContext().mAlpha;
+ // If we're in a focused floater, don't apply the floater's alpha to the color swatch (STORM-676).
+ F32 alpha = getTransparencyType() == TT_ACTIVE ? 1.0f : getCurrentTransparency();
+
mBorder->setKeyboardFocusHighlight(hasFocus());
// Draw border
LLRect border( 0, getRect().getHeight(), getRect().getWidth(), mLabelHeight );
@@ -207,19 +212,29 @@ void LLColorSwatchCtrl::draw()
// Check state
if ( mValid )
{
+ if (!mColor.isOpaque())
+ {
+ // Draw checker board.
+ gl_rect_2d_checkerboard(interior, alpha);
+ }
+
// Draw the color swatch
- gl_rect_2d_checkerboard( interior );
- gl_rect_2d(interior, mColor, TRUE);
- LLColor4 opaque_color = mColor;
- opaque_color.mV[VALPHA] = 1.f;
- gGL.color4fv(opaque_color.mV);
- if (mAlphaGradientImage.notNull())
+ gl_rect_2d(interior, mColor % alpha, TRUE);
+
+ if (!mColor.isOpaque())
{
- gGL.pushMatrix();
+ // Draw semi-transparent center area in filled with mColor.
+ LLColor4 opaque_color = mColor;
+ opaque_color.mV[VALPHA] = alpha;
+ gGL.color4fv(opaque_color.mV);
+ if (mAlphaGradientImage.notNull())
{
- mAlphaGradientImage->draw(interior, mColor);
+ gGL.pushMatrix();
+ {
+ mAlphaGradientImage->draw(interior, mColor % alpha);
+ }
+ gGL.popMatrix();
}
- gGL.popMatrix();
}
}
else
@@ -307,7 +322,7 @@ void LLColorSwatchCtrl::onColorChanged ( void* data, EColorPickOp pick_op )
// This is called when the main floatercustomize panel is closed.
// Since this class has pointers up to its parents, we need to cleanup
// this class first in order to avoid a crash.
-void LLColorSwatchCtrl::onParentFloaterClosed()
+void LLColorSwatchCtrl::closeFloaterColorPicker()
{
LLFloaterColorPicker* pickerp = (LLFloaterColorPicker*)mPickerHandle.get();
if (pickerp)
diff --git a/indra/newview/llcolorswatch.h b/indra/newview/llcolorswatch.h
index cd859ea128..5bdd1712d2 100644
--- a/indra/newview/llcolorswatch.h
+++ b/indra/newview/llcolorswatch.h
@@ -100,7 +100,7 @@ public:
/*virtual*/ void setEnabled( BOOL enabled );
static void onColorChanged ( void* data, EColorPickOp pick_op = COLOR_CHANGE );
- void onParentFloaterClosed();
+ void closeFloaterColorPicker();
protected:
BOOL mValid;
diff --git a/indra/newview/llcommanddispatcherlistener.cpp b/indra/newview/llcommanddispatcherlistener.cpp
index 5744d055a9..586f45fd8f 100644
--- a/indra/newview/llcommanddispatcherlistener.cpp
+++ b/indra/newview/llcommanddispatcherlistener.cpp
@@ -65,7 +65,7 @@ void LLCommandDispatcherListener::dispatch(const LLSD& params) const
trusted_browser = params["trusted"].asBoolean();
}
LLCommandDispatcher::dispatch(params["cmd"], params["params"], params["query"], NULL,
- trusted_browser);
+ "clicked", trusted_browser);
}
void LLCommandDispatcherListener::enumerate(const LLSD& params) const
diff --git a/indra/newview/llcommandhandler.cpp b/indra/newview/llcommandhandler.cpp
index 360ba080ac..19dba3f917 100644..100755
--- a/indra/newview/llcommandhandler.cpp
+++ b/indra/newview/llcommandhandler.cpp
@@ -35,7 +35,7 @@
// system includes
#include <boost/tokenizer.hpp>
-#define THROTTLE_PERIOD 15 // required secs between throttled commands
+#define THROTTLE_PERIOD 5 // required seconds between throttled commands
static LLCommandDispatcherListener sCommandDispatcherListener;
@@ -59,6 +59,7 @@ public:
const LLSD& params,
const LLSD& query_map,
LLMediaCtrl* web,
+ const std::string& nav_type,
bool trusted_browser);
private:
@@ -91,6 +92,7 @@ bool LLCommandHandlerRegistry::dispatch(const std::string& cmd,
const LLSD& params,
const LLSD& query_map,
LLMediaCtrl* web,
+ const std::string& nav_type,
bool trusted_browser)
{
static bool slurl_blocked = false;
@@ -120,11 +122,19 @@ bool LLCommandHandlerRegistry::dispatch(const std::string& cmd,
return true;
case LLCommandHandler::UNTRUSTED_THROTTLE:
+ // if users actually click on a link, we don't need to throttle it
+ // (throttling mechanism is used to prevent an avalanche of clicks via
+ // javascript
+ if ( nav_type == "clicked" )
+ {
+ break;
+ }
+
cur_time = LLTimer::getElapsedSeconds();
if (cur_time < last_throttle_time + THROTTLE_PERIOD)
{
// block request from external browser if it happened
- // within THROTTLE_PERIOD secs of the last command
+ // within THROTTLE_PERIOD seconds of the last command
LL_WARNS_ONCE("SLURL") << "Throttled SLURL command from untrusted browser" << LL_ENDL;
if (! slurl_throttled)
{
@@ -166,10 +176,11 @@ bool LLCommandDispatcher::dispatch(const std::string& cmd,
const LLSD& params,
const LLSD& query_map,
LLMediaCtrl* web,
+ const std::string& nav_type,
bool trusted_browser)
{
return LLCommandHandlerRegistry::instance().dispatch(
- cmd, params, query_map, web, trusted_browser);
+ cmd, params, query_map, web, nav_type, trusted_browser);
}
static std::string lookup(LLCommandHandler::EUntrustedAccess value);
diff --git a/indra/newview/llcommandhandler.h b/indra/newview/llcommandhandler.h
index 1e65b6de23..1e0895565a 100644
--- a/indra/newview/llcommandhandler.h
+++ b/indra/newview/llcommandhandler.h
@@ -95,6 +95,7 @@ public:
const LLSD& params,
const LLSD& query_map,
LLMediaCtrl* web,
+ const std::string& nav_type,
bool trusted_browser);
// Execute a command registered via the above mechanism,
// passing string parameters.
diff --git a/indra/newview/llcommandlineparser.cpp b/indra/newview/llcommandlineparser.cpp
index f31ff14df6..65c61c4a8b 100644
--- a/indra/newview/llcommandlineparser.cpp
+++ b/indra/newview/llcommandlineparser.cpp
@@ -345,7 +345,10 @@ bool LLCommandLineParser::parseCommandLine(int argc, char **argv)
bool LLCommandLineParser::parseCommandLineString(const std::string& str)
{
// Split the string content into tokens
- boost::escaped_list_separator<char> sep("\\", "\r\n ", "\"'");
+ const char* escape_chars = "\\";
+ const char* separator_chars = "\r\n ";
+ const char* quote_chars = "\"'";
+ boost::escaped_list_separator<char> sep(escape_chars, separator_chars, quote_chars);
boost::tokenizer< boost::escaped_list_separator<char> > tok(str, sep);
std::vector<std::string> tokens;
// std::copy(tok.begin(), tok.end(), std::back_inserter(tokens));
diff --git a/indra/newview/llcompilequeue.cpp b/indra/newview/llcompilequeue.cpp
index a42677845e..4f5f9e22b6 100644
--- a/indra/newview/llcompilequeue.cpp
+++ b/indra/newview/llcompilequeue.cpp
@@ -100,6 +100,7 @@ BOOL LLFloaterScriptQueue::postBuild()
{
childSetAction("close",onCloseBtn,this);
getChildView("close")->setEnabled(FALSE);
+ setVisible(true);
return TRUE;
}
@@ -158,7 +159,6 @@ void LLFloaterScriptQueue::addObject(const LLUUID& id)
BOOL LLFloaterScriptQueue::start()
{
- //llinfos << "LLFloaterCompileQueue::start()" << llendl;
std::string buffer;
LLSelectMgr *mgr = LLSelectMgr::getInstance();
@@ -178,7 +178,7 @@ BOOL LLFloaterScriptQueue::start()
args["[COUNT]"] = llformat ("%d", mObjectIDs.count());
buffer = getString ("Starting", args);
- getChild<LLScrollListCtrl>("queue output")->setCommentText(buffer);
+ getChild<LLScrollListCtrl>("queue output")->addSimpleElement(buffer, ADD_BOTTOM);
return nextObject();
}
@@ -211,7 +211,7 @@ BOOL LLFloaterScriptQueue::nextObject()
if(isDone() && !mDone)
{
mDone = true;
- getChild<LLScrollListCtrl>("queue output")->setCommentText(getString("Done"));
+ getChild<LLScrollListCtrl>("queue output")->addSimpleElement(getString("Done"), ADD_BOTTOM);
getChildView("close")->setEnabled(TRUE);
}
return successful_start;
@@ -277,7 +277,7 @@ public:
return;
}
- queue->getChild<LLScrollListCtrl>("queue output")->setCommentText(message);
+ queue->getChild<LLScrollListCtrl>("queue output")->addSimpleElement(message, ADD_BOTTOM);
}
private:
@@ -464,7 +464,7 @@ void LLFloaterCompileQueue::scriptArrived(LLVFS *vfs, const LLUUID& asset_id,
}
if(queue && (buffer.size() > 0))
{
- queue->getChild<LLScrollListCtrl>("queue output")->setCommentText(buffer);
+ queue->getChild<LLScrollListCtrl>("queue output")->addSimpleElement(buffer, ADD_BOTTOM);
}
delete data;
}
@@ -637,7 +637,7 @@ void LLFloaterResetQueue::handleInventory(LLViewerObject* viewer_obj,
LLInventoryItem* item = (LLInventoryItem*)((LLInventoryObject*)(*it));
std::string buffer;
buffer = getString("Resetting") + (": ") + item->getName();
- getChild<LLScrollListCtrl>("queue output")->setCommentText(buffer);
+ getChild<LLScrollListCtrl>("queue output")->addSimpleElement(buffer, ADD_BOTTOM);
LLMessageSystem* msg = gMessageSystem;
msg->newMessageFast(_PREHASH_ScriptReset);
msg->nextBlockFast(_PREHASH_AgentData);
@@ -690,7 +690,7 @@ void LLFloaterRunQueue::handleInventory(LLViewerObject* viewer_obj,
LLScrollListCtrl* list = getChild<LLScrollListCtrl>("queue output");
std::string buffer;
buffer = getString("Running") + (": ") + item->getName();
- list->setCommentText(buffer);
+ list->addSimpleElement(buffer, ADD_BOTTOM);
LLMessageSystem* msg = gMessageSystem;
msg->newMessageFast(_PREHASH_SetScriptRunning);
@@ -745,7 +745,7 @@ void LLFloaterNotRunQueue::handleInventory(LLViewerObject* viewer_obj,
LLScrollListCtrl* list = getChild<LLScrollListCtrl>("queue output");
std::string buffer;
buffer = getString("NotRunning") + (": ") +item->getName();
- list->setCommentText(buffer);
+ list->addSimpleElement(buffer, ADD_BOTTOM);
LLMessageSystem* msg = gMessageSystem;
msg->newMessageFast(_PREHASH_SetScriptRunning);
diff --git a/indra/newview/llcylinder.cpp b/indra/newview/llcylinder.cpp
index 4901e29691..f353851a25 100644
--- a/indra/newview/llcylinder.cpp
+++ b/indra/newview/llcylinder.cpp
@@ -37,261 +37,39 @@
#include "llgl.h"
#include "llglheaders.h"
-LLCylinder gCylinder;
LLCone gCone;
-GLUquadricObj* gQuadObj = NULL;
-
-static const GLint SLICES[] = { 30, 20, 12, 6 }; // same as sphere slices
-static const GLint STACKS = 2;
-static const GLfloat RADIUS = 0.5f;
-
-// draws a cylinder or cone
-// returns approximate number of triangles required
-U32 draw_cylinder_side(GLint slices, GLint stacks, GLfloat base_radius, GLfloat top_radius)
-{
- U32 triangles = 0;
- GLfloat height = 1.0f;
-
- if (!gQuadObj)
- {
- gQuadObj = gluNewQuadric();
- if (!gQuadObj) llerror("draw_cylindrical_body couldn't allocated quadric", 0);
- }
-
- gluQuadricDrawStyle(gQuadObj, GLU_FILL);
- gluQuadricNormals(gQuadObj, GLU_SMOOTH);
- gluQuadricOrientation(gQuadObj, GLU_OUTSIDE);
- gluQuadricTexture(gQuadObj, GL_TRUE);
- gluCylinder(gQuadObj, base_radius, top_radius, height, slices, stacks);
- triangles += stacks * (slices * 2);
-
-
- return triangles;
-}
-
-
-// Returns number of triangles required to draw
-// Need to know if top or not to set lighting normals
-const BOOL TOP = TRUE;
-const BOOL BOTTOM = FALSE;
-U32 draw_cylinder_cap(GLint slices, GLfloat base_radius, BOOL is_top)
-{
- U32 triangles = 0;
-
- if (!gQuadObj)
- {
- gQuadObj = gluNewQuadric();
- if (!gQuadObj) llerror("draw_cylinder_base couldn't allocated quadric", 0);
- }
-
- gluQuadricDrawStyle(gQuadObj, GLU_FILL);
- gluQuadricNormals(gQuadObj, GLU_SMOOTH);
- gluQuadricOrientation(gQuadObj, GLU_OUTSIDE);
- gluQuadricTexture(gQuadObj, GL_TRUE);
-
- // no hole in the middle of the disk, and just one ring
- GLdouble inner_radius = 0.0;
- GLint rings = 1;
-
- // normals point in +z for top, -z for base
- if (is_top)
- {
- gluQuadricOrientation(gQuadObj, GLU_OUTSIDE);
- }
- else
- {
- gluQuadricOrientation(gQuadObj, GLU_INSIDE);
- }
- gluDisk(gQuadObj, inner_radius, base_radius, slices, rings);
- triangles += slices;
-
- return triangles;
-}
-
-void LLCylinder::drawSide(S32 detail)
-{
- draw_cylinder_side(SLICES[detail], STACKS, RADIUS, RADIUS);
-}
-
-void LLCylinder::drawTop(S32 detail)
-{
- draw_cylinder_cap(SLICES[detail], RADIUS, TOP);
-}
-
-void LLCylinder::drawBottom(S32 detail)
-{
- draw_cylinder_cap(SLICES[detail], RADIUS, BOTTOM);
-}
-
-void LLCylinder::prerender()
-{
-}
-
-void LLCylinder::cleanupGL()
-{
- if (gQuadObj)
- {
- gluDeleteQuadric(gQuadObj);
- gQuadObj = NULL;
- }
-}
-
-void LLCylinder::render(F32 pixel_area)
-{
- renderface(pixel_area, 0);
- renderface(pixel_area, 1);
- renderface(pixel_area, 2);
-}
-
-
-void LLCylinder::renderface(F32 pixel_area, S32 face)
-{
- if (face < 0 || face > 2)
- {
- llerror("LLCylinder::renderface() invalid face number", face);
- return;
- }
-
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
-
- S32 level_of_detail;
-
- if (pixel_area > 20000.f)
- {
- level_of_detail = 0;
- }
- else if (pixel_area > 1600.f)
- {
- level_of_detail = 1;
- }
- else if (pixel_area > 200.f)
- {
- level_of_detail = 2;
- }
- else
- {
- level_of_detail = 3;
- }
-
- if (level_of_detail < 0 || CYLINDER_LEVELS_OF_DETAIL <= level_of_detail)
- {
- llerror("LLCylinder::renderface() invalid level of detail", level_of_detail);
- return;
- }
-
- LLVertexBuffer::unbind();
-
- switch(face)
- {
- case 0:
- glTranslatef(0.f, 0.f, -0.5f);
- drawSide(level_of_detail);
- break;
- case 1:
- glTranslatef(0.0f, 0.f, 0.5f);
- drawTop(level_of_detail);
- break;
- case 2:
- glTranslatef(0.0f, 0.f, -0.5f);
- drawBottom(level_of_detail);
- break;
- default:
- llerror("LLCylinder::renderface() fell out of switch", 0);
- break;
- }
-
- glMatrixMode(GL_MODELVIEW);
- glPopMatrix();
-}
-
-
//
// Cones
//
-void LLCone::prerender()
+void LLCone::render(S32 sides)
{
-}
+ gGL.begin(LLRender::TRIANGLE_FAN);
+ gGL.vertex3f(0,0,0);
-void LLCone::cleanupGL()
-{
- if (gQuadObj)
+ for (U32 i = 0; i < sides; i++)
{
- gluDeleteQuadric(gQuadObj);
- gQuadObj = NULL;
+ F32 a = (F32) i/sides * F_PI*2.f;
+ F32 x = cosf(a)*0.5f;
+ F32 y = sinf(a)*0.5f;
+ gGL.vertex3f(x,y,-.5f);
}
-}
+ gGL.vertex3f(cosf(0.f)*0.5f, sinf(0.f)*0.5f, -0.5f);
-void LLCone::drawSide(S32 detail)
-{
- draw_cylinder_side( SLICES[detail], STACKS, RADIUS, 0.f );
-}
-
-void LLCone::drawBottom(S32 detail)
-{
- draw_cylinder_cap( SLICES[detail], RADIUS, BOTTOM );
-}
-
-void LLCone::render(S32 level_of_detail)
-{
- GLfloat height = 1.0f;
+ gGL.end();
- if (level_of_detail < 0 || CONE_LEVELS_OF_DETAIL <= level_of_detail)
+ gGL.begin(LLRender::TRIANGLE_FAN);
+ gGL.vertex3f(0.f, 0.f, 0.5f);
+ for (U32 i = 0; i < sides; i++)
{
- llerror("LLCone::render() invalid level of detail", level_of_detail);
- return;
+ F32 a = (F32) i/sides * F_PI*2.f;
+ F32 x = cosf(a)*0.5f;
+ F32 y = sinf(a)*0.5f;
+ gGL.vertex3f(x,y,-0.5f);
}
+ gGL.vertex3f(cosf(0.f)*0.5f, sinf(0.f)*0.5f, -0.5f);
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
-
- // center object at 0
- glTranslatef(0.f, 0.f, - height / 2.0f);
-
- drawSide(level_of_detail);
- drawBottom(level_of_detail);
-
- glMatrixMode(GL_MODELVIEW);
- glPopMatrix();
+ gGL.end();
}
-
-void LLCone::renderface(S32 level_of_detail, S32 face)
-{
- if (face < 0 || face > 1)
- {
- llerror("LLCone::renderface() invalid face number", face);
- return;
- }
-
- if (level_of_detail < 0 || CONE_LEVELS_OF_DETAIL <= level_of_detail)
- {
- llerror("LLCone::renderface() invalid level of detail", level_of_detail);
- return;
- }
-
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
-
- LLVertexBuffer::unbind();
-
- switch(face)
- {
- case 0:
- glTranslatef(0.f, 0.f, -0.5f);
- drawSide(level_of_detail);
- break;
- case 1:
- glTranslatef(0.f, 0.f, -0.5f);
- drawBottom(level_of_detail);
- break;
- default:
- llerror("LLCylinder::renderface() fell out of switch", 0);
- break;
- }
-
- glMatrixMode(GL_MODELVIEW);
- glPopMatrix();
-}
diff --git a/indra/newview/llcylinder.h b/indra/newview/llcylinder.h
index 40a669ceb6..4369f06659 100644
--- a/indra/newview/llcylinder.h
+++ b/indra/newview/llcylinder.h
@@ -30,45 +30,18 @@
//#include "stdtypes.h"
//#include "llgl.h"
-//
-// Cylinders
-//
-const S32 CYLINDER_LEVELS_OF_DETAIL = 4;
-const S32 CYLINDER_FACES = 3;
-
-class LLCylinder
-{
-public:
- void prerender();
- void drawTop(S32 detail);
- void drawSide(S32 detail);
- void drawBottom(S32 detail);
- void cleanupGL();
-
- void render(F32 pixel_area);
- void renderface(F32 pixel_area, S32 face);
-};
-
+#include "llvertexbuffer.h"
//
// Cones
//
-const S32 CONE_LOD_HIGHEST = 0;
-const S32 CONE_LEVELS_OF_DETAIL = 4;
-const S32 CONE_FACES = 2;
-
class LLCone
{
public:
- void prerender();
- void cleanupGL();
- void drawSide(S32 detail);
- void drawBottom(S32 detail);
- void render(S32 level_of_detail);
- void renderface(S32 level_of_detail, S32 face);
+ void render(S32 sides = 12);
};
-extern LLCylinder gCylinder;
+
extern LLCone gCone;
#endif
diff --git a/indra/newview/lldateutil.cpp b/indra/newview/lldateutil.cpp
index fcc73a07bc..c7fc45f61e 100644
--- a/indra/newview/lldateutil.cpp
+++ b/indra/newview/lldateutil.cpp
@@ -27,14 +27,20 @@
#include "lldateutil.h"
+#include <boost/date_time/gregorian/gregorian.hpp>
+#include <boost/date_time/posix_time/ptime.hpp>
+
// Linden libraries
#include "lltrans.h"
#include "llui.h"
+using namespace boost::gregorian;
+using namespace boost::posix_time;
+
static S32 DAYS_PER_MONTH_NOLEAP[] =
- { 31, 28, 21, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
+ { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
static S32 DAYS_PER_MONTH_LEAP[] =
- { 31, 29, 21, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
+ { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
static S32 days_from_month(S32 year, S32 month)
{
@@ -186,3 +192,24 @@ std::string LLDateUtil::ageFromDate(const std::string& date_string)
//{
// return ageFromDateISO(date_string, LLDate::now());
//}
+
+S32 LLDateUtil::secondsSinceEpochFromString(const std::string& format, const std::string& str)
+{
+ date_input_facet *facet = new date_input_facet(format);
+
+ std::stringstream ss;
+ ss << str;
+ ss.imbue(std::locale(ss.getloc(), facet));
+
+ date d;
+ ss >> d;
+
+ ptime time_t_date(d);
+ ptime time_t_epoch(date(1970,1,1));
+
+ // We assume that the date defined by str is in UTC, so the difference
+ // is calculated with no time zone corrections.
+ time_duration diff = time_t_date - time_t_epoch;
+
+ return diff.total_seconds();
+}
diff --git a/indra/newview/lldateutil.h b/indra/newview/lldateutil.h
index 2843a357c9..f027d360f7 100644
--- a/indra/newview/lldateutil.h
+++ b/indra/newview/lldateutil.h
@@ -69,6 +69,20 @@ namespace LLDateUtil
//std::string ageFromDateISO(const std::string& date_string);
//std::string ageFromDate(S32 born_year, S32 born_month, S32 born_day, const LLDate& now);
+
+ /**
+ * Convert a string of a specified date format into seconds since the Epoch.
+ *
+ * Many of the format flags are those used by strftime(...), but not all.
+ * For the full list of supported time format specifiers
+ * see http://www.boost.org/doc/libs/1_47_0/doc/html/date_time/date_time_io.html#date_time.format_flags
+ *
+ * @param format Format characters string. Example: "%A %b %d, %Y"
+ * @param str Date string containing the time in specified format.
+ *
+ * @return Number of seconds since 01/01/1970 UTC.
+ */
+ S32 secondsSinceEpochFromString(const std::string& format, const std::string& str);
}
#endif
diff --git a/indra/newview/lldaycyclemanager.cpp b/indra/newview/lldaycyclemanager.cpp
new file mode 100644
index 0000000000..347a467a8b
--- /dev/null
+++ b/indra/newview/lldaycyclemanager.cpp
@@ -0,0 +1,230 @@
+/**
+ * @file lldaycyclemanager.cpp
+ * @brief Implementation for the LLDayCycleManager class.
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "lldaycyclemanager.h"
+
+#include "lldiriterator.h"
+
+void LLDayCycleManager::getPresetNames(preset_name_list_t& names) const
+{
+ names.clear();
+
+ for (dc_map_t::const_iterator it = mDayCycleMap.begin(); it != mDayCycleMap.end(); ++it)
+ {
+ names.push_back(it->first);
+ }
+}
+
+void LLDayCycleManager::getPresetNames(preset_name_list_t& user, preset_name_list_t& sys) const
+{
+ user.clear();
+ sys.clear();
+
+ for (dc_map_t::const_iterator it = mDayCycleMap.begin(); it != mDayCycleMap.end(); ++it)
+ {
+ const std::string& name = it->first;
+
+ if (isSystemPreset(name))
+ {
+ sys.push_back(name);
+ }
+ else
+ {
+ user.push_back(name);
+ }
+ }
+}
+
+void LLDayCycleManager::getUserPresetNames(preset_name_list_t& user) const
+{
+ preset_name_list_t sys; // unused
+ getPresetNames(user, sys);
+}
+
+bool LLDayCycleManager::getPreset(const std::string name, LLWLDayCycle& day_cycle) const
+{
+ dc_map_t::const_iterator it = mDayCycleMap.find(name);
+ if (it == mDayCycleMap.end())
+ {
+ return false;
+ }
+
+ day_cycle = it->second;
+ return true;
+}
+
+bool LLDayCycleManager::getPreset(const std::string name, LLSD& day_cycle) const
+{
+ LLWLDayCycle dc;
+ if (!getPreset(name, dc))
+ {
+ return false;
+ }
+
+ day_cycle = dc.asLLSD();
+ return true;
+}
+
+bool LLDayCycleManager::presetExists(const std::string name) const
+{
+ LLWLDayCycle dummy;
+ return getPreset(name, dummy);
+}
+
+bool LLDayCycleManager::isSystemPreset(const std::string& name) const
+{
+ return gDirUtilp->fileExists(getSysDir() + LLURI::escape(name) + ".xml");
+}
+
+bool LLDayCycleManager::savePreset(const std::string& name, const LLSD& data)
+{
+ // Save given preset.
+ LLWLDayCycle day;
+ day.loadDayCycle(data, LLEnvKey::SCOPE_LOCAL);
+ day.save(getUserDir() + LLURI::escape(name) + ".xml");
+
+ // Add it to our map.
+ addPreset(name, data);
+ mModifySignal();
+ return true;
+}
+
+bool LLDayCycleManager::deletePreset(const std::string& name)
+{
+ // Remove it from the map.
+ dc_map_t::iterator it = mDayCycleMap.find(name);
+ if (it == mDayCycleMap.end())
+ {
+ LL_WARNS("Windlight") << "No day cycle named " << name << LL_ENDL;
+ return false;
+ }
+ mDayCycleMap.erase(it);
+
+ // Remove from the filesystem.
+ std::string filename = LLURI::escape(name) + ".xml";
+ if (gDirUtilp->fileExists(getUserDir() + filename))
+ {
+ gDirUtilp->deleteFilesInDir(getUserDir(), filename);
+ }
+
+ // Signal interested parties.
+ mModifySignal();
+ return true;
+}
+
+bool LLDayCycleManager::isSkyPresetReferenced(const std::string& preset_name) const
+{
+ // We're traversing local day cycles, they can only reference local skies.
+ LLWLParamKey key(preset_name, LLEnvKey::SCOPE_LOCAL);
+
+ for (dc_map_t::const_iterator it = mDayCycleMap.begin(); it != mDayCycleMap.end(); ++it)
+ {
+ if (it->second.hasReferencesTo(key))
+ {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+boost::signals2::connection LLDayCycleManager::setModifyCallback(const modify_signal_t::slot_type& cb)
+{
+ return mModifySignal.connect(cb);
+}
+
+// virtual
+void LLDayCycleManager::initSingleton()
+{
+ LL_DEBUGS("Windlight") << "Loading all day cycles" << LL_ENDL;
+ loadAllPresets();
+}
+
+void LLDayCycleManager::loadAllPresets()
+{
+ mDayCycleMap.clear();
+
+ // First, load system (coming out of the box) day cycles.
+ loadPresets(getSysDir());
+
+ // Then load user presets. Note that user day cycles will modify any system ones already loaded.
+ loadPresets(getUserDir());
+}
+
+void LLDayCycleManager::loadPresets(const std::string& dir)
+{
+ LLDirIterator dir_iter(dir, "*.xml");
+
+ while (1)
+ {
+ std::string file;
+ if (!dir_iter.next(file)) break; // no more files
+ loadPreset(dir + file);
+ }
+}
+
+bool LLDayCycleManager::loadPreset(const std::string& path)
+{
+ LLSD data = LLWLDayCycle::loadDayCycleFromPath(path);
+ if (data.isUndefined())
+ {
+ llwarns << "Error loading day cycle from " << path << llendl;
+ return false;
+ }
+
+ std::string name(gDirUtilp->getBaseFileName(LLURI::unescape(path), /*strip_exten = */ true));
+ addPreset(name, data);
+
+ return true;
+}
+
+bool LLDayCycleManager::addPreset(const std::string& name, const LLSD& data)
+{
+ if (name.empty())
+ {
+ llassert(name.empty());
+ return false;
+ }
+
+ LLWLDayCycle day;
+ day.loadDayCycle(data, LLEnvKey::SCOPE_LOCAL);
+ mDayCycleMap[name] = day;
+ return true;
+}
+
+// static
+std::string LLDayCycleManager::getSysDir()
+{
+ return gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/days", "");
+}
+
+// static
+std::string LLDayCycleManager::getUserDir()
+{
+ return gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS , "windlight/days", "");
+}
diff --git a/indra/newview/lldaycyclemanager.h b/indra/newview/lldaycyclemanager.h
new file mode 100644
index 0000000000..3d2144960d
--- /dev/null
+++ b/indra/newview/lldaycyclemanager.h
@@ -0,0 +1,84 @@
+/**
+ * @file lldaycyclemanager.h
+ * @brief Implementation for the LLDayCycleManager class.
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLDAYCYCLEMANAGER_H
+#define LL_LLDAYCYCLEMANAGER_H
+
+#include <map>
+#include <string>
+
+#include "llwldaycycle.h"
+#include "llwlparammanager.h"
+
+/**
+ * WindLight day cycles manager class
+ *
+ * Provides interface for accessing, loading and saving day cycles.
+ */
+class LLDayCycleManager : public LLSingleton<LLDayCycleManager>
+{
+ LOG_CLASS(LLDayCycleManager);
+
+public:
+ typedef std::list<std::string> preset_name_list_t;
+
+ typedef std::map<std::string, LLWLDayCycle> dc_map_t;
+ typedef boost::signals2::signal<void()> modify_signal_t;
+
+ void getPresetNames(preset_name_list_t& names) const;
+ void getPresetNames(preset_name_list_t& user, preset_name_list_t& sys) const;
+ void getUserPresetNames(preset_name_list_t& user) const;
+
+ bool getPreset(const std::string name, LLWLDayCycle& day_cycle) const;
+ bool getPreset(const std::string name, LLSD& day_cycle) const;
+ bool presetExists(const std::string name) const;
+ bool isSystemPreset(const std::string& name) const;
+ bool savePreset(const std::string& name, const LLSD& data);
+ bool deletePreset(const std::string& name);
+
+ /// @return true if there is a day cycle that refers to the sky preset.
+ bool isSkyPresetReferenced(const std::string& preset_name) const;
+
+ /// Emitted when a preset gets added or deleted.
+ boost::signals2::connection setModifyCallback(const modify_signal_t::slot_type& cb);
+
+private:
+ friend class LLSingleton<LLDayCycleManager>;
+ /*virtual*/ void initSingleton();
+
+ void loadAllPresets();
+ void loadPresets(const std::string& dir);
+ bool loadPreset(const std::string& path);
+ bool addPreset(const std::string& name, const LLSD& data);
+
+ static std::string getSysDir();
+ static std::string getUserDir();
+
+ dc_map_t mDayCycleMap;
+ modify_signal_t mModifySignal;
+};
+
+#endif // LL_LLDAYCYCLEMANAGER_H
diff --git a/indra/newview/lldebugview.cpp b/indra/newview/lldebugview.cpp
index 0876c3fd99..7d3170cb76 100644
--- a/indra/newview/lldebugview.cpp
+++ b/indra/newview/lldebugview.cpp
@@ -39,7 +39,10 @@
#include "llviewerwindow.h"
#include "llappviewer.h"
#include "llmemoryview.h"
+#include "llsceneview.h"
#include "llviewertexture.h"
+#include "llfloaterreg.h"
+
//
// Globals
//
@@ -52,15 +55,30 @@ LLDebugView* gDebugView = NULL;
static LLDefaultChildRegistry::Register<LLDebugView> r("debug_view");
LLDebugView::LLDebugView(const LLDebugView::Params& p)
-: LLView(p)
+: LLView(p),
+ mFastTimerView(NULL),
+ mMemoryView(NULL),
+ mDebugConsolep(NULL),
+ mFloaterSnapRegion(NULL)
{}
+LLDebugView::~LLDebugView()
+{
+ // These have already been deleted. Fix the globals appropriately.
+ gDebugView = NULL;
+ gTextureView = NULL;
+ gSceneView = NULL;
+ gTextureSizeView = NULL;
+ gTextureCategoryView = NULL;
+}
+
void LLDebugView::init()
{
LLRect r;
LLRect rect = getLocalRect();
- r.set(10, rect.getHeight() - 100, rect.getWidth()/2, 100);
+ // Rectangle to draw debug data in (full height, 3/4 width)
+ r.set(10, rect.getHeight() - 100, ((rect.getWidth()*3)/4), 100);
LLConsole::Params cp;
cp.name("debug console");
cp.max_lines(20);
@@ -76,13 +94,15 @@ void LLDebugView::init()
r.setLeftTopAndSize(25, rect.getHeight() - 50, (S32) (gViewerWindow->getWindowRectScaled().getWidth() * 0.75f),
(S32) (gViewerWindow->getWindowRectScaled().getHeight() * 0.75f));
- mFastTimerView = new LLFastTimerView(r);
- mFastTimerView->setFollowsTop();
- mFastTimerView->setFollowsLeft();
- mFastTimerView->setVisible(FALSE); // start invisible
- addChild(mFastTimerView);
- mFastTimerView->setRect(rect);
-
+ mFastTimerView = dynamic_cast<LLFastTimerView*>(LLFloaterReg::getInstance("fast_timers"));
+
+ gSceneView = new LLSceneView(r);
+ gSceneView->setFollowsTop();
+ gSceneView->setFollowsLeft();
+ gSceneView->setVisible(FALSE);
+ addChild(gSceneView);
+ gSceneView->setRect(rect);
+
r.setLeftTopAndSize(25, rect.getHeight() - 50, (S32) (gViewerWindow->getWindowRectScaled().getWidth() * 0.75f),
(S32) (gViewerWindow->getWindowRectScaled().getHeight() * 0.75f));
LLMemoryView::Params mp;
@@ -103,6 +123,7 @@ void LLDebugView::init()
addChild(gTextureView);
//gTextureView->reshape(r.getWidth(), r.getHeight(), TRUE);
+
if(gAuditTexture)
{
r.set(150, rect.getHeight() - 50, 900 + LLImageGL::sTextureLoadedCounter.size() * 30, 100);
@@ -127,13 +148,16 @@ void LLDebugView::init()
}
}
-
-LLDebugView::~LLDebugView()
+void LLDebugView::draw()
{
- // These have already been deleted. Fix the globals appropriately.
- gDebugView = NULL;
- gTextureView = NULL;
- gTextureSizeView = NULL;
- gTextureCategoryView = NULL;
-}
+ if (mFloaterSnapRegion == NULL)
+ {
+ mFloaterSnapRegion = getRootView()->getChildView("floater_snap_region");
+ }
+
+ LLRect debug_rect;
+ mFloaterSnapRegion->localRectToOtherView(mFloaterSnapRegion->getLocalRect(), &debug_rect, getParent());
+ setShape(debug_rect);
+ LLView::draw();
+}
diff --git a/indra/newview/lldebugview.h b/indra/newview/lldebugview.h
index 5245f163c0..5aec77ad62 100644
--- a/indra/newview/lldebugview.h
+++ b/indra/newview/lldebugview.h
@@ -48,19 +48,22 @@ public:
{
Params()
{
- mouse_opaque = false;
+ changeDefault(mouse_opaque, false);
}
};
+
LLDebugView(const Params&);
~LLDebugView();
void init();
-
+ void draw();
+
void setStatsVisible(BOOL visible);
LLFastTimerView* mFastTimerView;
LLMemoryView* mMemoryView;
LLConsole* mDebugConsolep;
+ LLView* mFloaterSnapRegion;
};
extern LLDebugView* gDebugView;
diff --git a/indra/newview/lldirpicker.cpp b/indra/newview/lldirpicker.cpp
index 53101f0ce2..1e03582a29 100644
--- a/indra/newview/lldirpicker.cpp
+++ b/indra/newview/lldirpicker.cpp
@@ -35,6 +35,7 @@
#include "llframetimer.h"
#include "lltrans.h"
#include "llwindow.h" // beforeDialog()
+#include "llviewercontrol.h"
#if LL_LINUX || LL_SOLARIS
# include "llfilepicker.h"
@@ -53,6 +54,23 @@ LLDirPicker LLDirPicker::sInstance;
//
// Implementation
//
+
+// utility function to check if access to local file system via file browser
+// is enabled and if not, tidy up and indicate we're not allowed to do this.
+bool LLDirPicker::check_local_file_access_enabled()
+{
+ // if local file browsing is turned off, return without opening dialog
+ bool local_file_system_browsing_enabled = gSavedSettings.getBOOL("LocalFileSystemBrowsingEnabled");
+ if ( ! local_file_system_browsing_enabled )
+ {
+ mDir.clear(); // Windows
+ mFileName = NULL; // Mac/Linux
+ return false;
+ }
+
+ return true;
+}
+
#if LL_WINDOWS
LLDirPicker::LLDirPicker() :
@@ -72,6 +90,13 @@ BOOL LLDirPicker::getDir(std::string* filename)
{
return FALSE;
}
+
+ // if local file browsing is turned off, return without opening dialog
+ if ( check_local_file_access_enabled() == false )
+ {
+ return FALSE;
+ }
+
BOOL success = FALSE;
// Modal, so pause agent
@@ -192,12 +217,12 @@ OSStatus LLDirPicker::doNavChooseDialog()
error = NavCreateChooseFolderDialog(&mNavOptions, &doNavCallbackEvent, NULL, NULL, &navRef);
- gViewerWindow->mWindow->beforeDialog();
+ gViewerWindow->getWindow()->beforeDialog();
if (error == noErr)
error = NavDialogRun(navRef);
- gViewerWindow->mWindow->afterDialog();
+ gViewerWindow->getWindow()->afterDialog();
if (error == noErr)
error = NavDialogGetReply(navRef, &navReply);
@@ -231,7 +256,13 @@ BOOL LLDirPicker::getDir(std::string* filename)
if( mLocked ) return FALSE;
BOOL success = FALSE;
OSStatus error = noErr;
-
+
+ // if local file browsing is turned off, return without opening dialog
+ if ( check_local_file_access_enabled() == false )
+ {
+ return FALSE;
+ }
+
mFileName = filename;
// mNavOptions.saveFileName
@@ -289,6 +320,13 @@ void LLDirPicker::reset()
BOOL LLDirPicker::getDir(std::string* filename)
{
reset();
+
+ // if local file browsing is turned off, return without opening dialog
+ if ( check_local_file_access_enabled() == false )
+ {
+ return FALSE;
+ }
+
if (mFilePicker)
{
GtkWindow* picker = mFilePicker->buildFilePicker(false, true,
diff --git a/indra/newview/lldirpicker.h b/indra/newview/lldirpicker.h
index a360293fff..2188b7edd0 100644
--- a/indra/newview/lldirpicker.h
+++ b/indra/newview/lldirpicker.h
@@ -75,6 +75,7 @@ private:
};
void buildDirname( void );
+ bool check_local_file_access_enabled();
#if LL_DARWIN
NavDialogCreationOptions mNavOptions;
diff --git a/indra/newview/lldndbutton.cpp b/indra/newview/lldndbutton.cpp
index 8a38c8a643..7c9dda6b1d 100644
--- a/indra/newview/lldndbutton.cpp
+++ b/indra/newview/lldndbutton.cpp
@@ -31,16 +31,9 @@
static LLDefaultChildRegistry::Register<LLDragAndDropButton> r("dnd_button");
-LLDragAndDropButton::Params::Params()
-{
-
-}
-
LLDragAndDropButton::LLDragAndDropButton(const Params& params)
: LLButton(params)
-{
-
-}
+{}
BOOL LLDragAndDropButton::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, EDragAndDropType cargo_type, void* cargo_data, EAcceptance* accept, std::string& tooltip_msg)
{
diff --git a/indra/newview/lldndbutton.h b/indra/newview/lldndbutton.h
index 0642cbb7b9..53ea2f5ea7 100644
--- a/indra/newview/lldndbutton.h
+++ b/indra/newview/lldndbutton.h
@@ -43,10 +43,7 @@
class LLDragAndDropButton : public LLButton
{
public:
- struct Params : public LLInitParam::Block<Params, LLButton::Params>
- {
- Params();
- };
+ struct Params : public LLInitParam::Block<Params, LLButton::Params> {};
LLDragAndDropButton(const Params& params);
diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp
index 8106fada11..21b21c152a 100644
--- a/indra/newview/lldrawable.cpp
+++ b/indra/newview/lldrawable.cpp
@@ -35,6 +35,7 @@
#include "llcriticaldamp.h"
#include "llface.h"
#include "lllightconstants.h"
+#include "llmatrix4a.h"
#include "llsky.h"
#include "llsurfacepatch.h"
#include "llviewercamera.h"
@@ -85,6 +86,7 @@ void LLDrawable::incrementVisible()
sCurVisible++;
sCurPixelAngle = (F32) gViewerWindow->getWindowHeightRaw()/LLViewerCamera::getInstance()->getView();
}
+
void LLDrawable::init()
{
// mXform
@@ -92,7 +94,9 @@ void LLDrawable::init()
mRenderType = 0;
mCurrentScale = LLVector3(1,1,1);
mDistanceWRTCamera = 0.0f;
-
+ mPositionGroup.clear();
+ mExtents[0].clear();
+ mExtents[1].clear();
mQuietCount = 0;
mState = 0;
@@ -115,6 +119,11 @@ void LLDrawable::initClass()
void LLDrawable::destroy()
{
+ if (gDebugGL)
+ {
+ gPipeline.checkReferences(this);
+ }
+
if (isDead())
{
sNumZombieDrawables--;
@@ -133,6 +142,7 @@ void LLDrawable::destroy()
{
llinfos << "- Zombie drawables: " << sNumZombieDrawables << llendl;
}*/
+
}
void LLDrawable::markDead()
@@ -170,6 +180,11 @@ LLVOVolume* LLDrawable::getVOVolume() const
}
}
+const LLMatrix4& LLDrawable::getRenderMatrix() const
+{
+ return isRoot() ? getWorldMatrix() : getParent()->getWorldMatrix();
+}
+
BOOL LLDrawable::isLight() const
{
LLViewerObject* objectp = mVObjp;
@@ -183,20 +198,30 @@ BOOL LLDrawable::isLight() const
}
}
+static LLFastTimer::DeclareTimer FTM_CLEANUP_DRAWABLE("Cleanup Drawable");
+static LLFastTimer::DeclareTimer FTM_DEREF_DRAWABLE("Deref");
+static LLFastTimer::DeclareTimer FTM_DELETE_FACES("Faces");
+
void LLDrawable::cleanupReferences()
{
- LLFastTimer t(FTM_PIPELINE);
+ LLFastTimer t(FTM_CLEANUP_DRAWABLE);
- std::for_each(mFaces.begin(), mFaces.end(), DeletePointer());
- mFaces.clear();
+ {
+ LLFastTimer t(FTM_DELETE_FACES);
+ std::for_each(mFaces.begin(), mFaces.end(), DeletePointer());
+ mFaces.clear();
+ }
gObjectList.removeDrawable(this);
gPipeline.unlinkDrawable(this);
- // Cleanup references to other objects
- mVObjp = NULL;
- mParent = NULL;
+ {
+ LLFastTimer t(FTM_DEREF_DRAWABLE);
+ // Cleanup references to other objects
+ mVObjp = NULL;
+ mParent = NULL;
+ }
}
void LLDrawable::cleanupDeadDrawables()
@@ -362,7 +387,6 @@ void LLDrawable::makeActive()
pcode == LLViewerObject::LL_VO_SURFACE_PATCH ||
pcode == LLViewerObject::LL_VO_PART_GROUP ||
pcode == LLViewerObject::LL_VO_HUD_PART_GROUP ||
- pcode == LLViewerObject::LL_VO_CLOUDS ||
pcode == LLViewerObject::LL_VO_GROUND ||
pcode == LLViewerObject::LL_VO_SKY)
{
@@ -564,7 +588,10 @@ void LLDrawable::setRadius(F32 radius)
void LLDrawable::moveUpdatePipeline(BOOL moved)
{
- makeActive();
+ if (moved)
+ {
+ makeActive();
+ }
// Update the face centers.
for (S32 i = 0; i < getNumFaces(); i++)
@@ -672,7 +699,8 @@ void LLDrawable::updateDistance(LLCamera& camera, bool force_update)
{
if (LLViewerCamera::sCurCameraID != LLViewerCamera::CAMERA_WORLD)
{
- llerrs << "WTF?" << llendl;
+ llwarns << "Attempted to update distance for non-world camera." << llendl;
+ return;
}
//switch LOD with the spatial group to avoid artifacts
@@ -685,13 +713,15 @@ void LLDrawable::updateDistance(LLCamera& camera, bool force_update)
LLVOVolume* volume = getVOVolume();
if (volume)
{
- volume->updateRelativeXform();
- pos = volume->getRelativeXform().getTranslation();
- if (isStatic())
+ if (getSpatialGroup())
{
- pos += volume->getRegion()->getOriginAgent();
+ pos.set(getPositionGroup().getF32ptr());
}
-
+ else
+ {
+ pos = getPositionAgent();
+ }
+
if (isState(LLDrawable::HAS_ALPHA))
{
for (S32 i = 0; i < getNumFaces(); i++)
@@ -699,21 +729,23 @@ void LLDrawable::updateDistance(LLCamera& camera, bool force_update)
LLFace* facep = getFace(i);
if (force_update || facep->getPoolType() == LLDrawPool::POOL_ALPHA)
{
- LLVector3 box = (facep->mExtents[1] - facep->mExtents[0]) * 0.25f;
+ LLVector4a box;
+ box.setSub(facep->mExtents[1], facep->mExtents[0]);
+ box.mul(0.25f);
LLVector3 v = (facep->mCenterLocal-camera.getOrigin());
const LLVector3& at = camera.getAtAxis();
for (U32 j = 0; j < 3; j++)
{
- v.mV[j] -= box.mV[j] * at.mV[j];
+ v.mV[j] -= box[j] * at.mV[j];
}
facep->mDistance = v * camera.getAtAxis();
}
}
- }
+ }
}
else
{
- pos = LLVector3(getPositionGroup());
+ pos = LLVector3(getPositionGroup().getF32ptr());
}
pos -= camera.getOrigin();
@@ -739,7 +771,7 @@ void LLDrawable::updateTexture()
if (getVOVolume())
{
- if (isActive())
+ /*if (isActive())
{
if (isRoot())
{
@@ -749,7 +781,7 @@ void LLDrawable::updateTexture()
{
getParent()->mQuietCount = 0;
}
- }
+ }*/
gPipeline.markRebuild(this, LLDrawable::REBUILD_MATERIAL, TRUE);
}
@@ -762,7 +794,7 @@ BOOL LLDrawable::updateGeometry(BOOL priority)
return res;
}
-void LLDrawable::shiftPos(const LLVector3 &shift_vector)
+void LLDrawable::shiftPos(const LLVector4a &shift_vector)
{
if (isDead())
{
@@ -794,20 +826,19 @@ void LLDrawable::shiftPos(const LLVector3 &shift_vector)
for (S32 i = 0; i < getNumFaces(); i++)
{
LLFace *facep = getFace(i);
- facep->mCenterAgent += shift_vector;
- facep->mExtents[0] += shift_vector;
- facep->mExtents[1] += shift_vector;
+ facep->mCenterAgent += LLVector3(shift_vector.getF32ptr());
+ facep->mExtents[0].add(shift_vector);
+ facep->mExtents[1].add(shift_vector);
if (!volume && facep->hasGeometry())
{
- facep->mVertexBuffer = NULL;
- facep->mLastVertexBuffer = NULL;
+ facep->clearVertexBuffer();
}
}
- mExtents[0] += shift_vector;
- mExtents[1] += shift_vector;
- mPositionGroup += LLVector3d(shift_vector);
+ mExtents[0].add(shift_vector);
+ mExtents[1].add(shift_vector);
+ mPositionGroup.add(shift_vector);
}
else if (mSpatialBridge)
{
@@ -815,9 +846,9 @@ void LLDrawable::shiftPos(const LLVector3 &shift_vector)
}
else if (isAvatar())
{
- mExtents[0] += shift_vector;
- mExtents[1] += shift_vector;
- mPositionGroup += LLVector3d(shift_vector);
+ mExtents[0].add(shift_vector);
+ mExtents[1].add(shift_vector);
+ mPositionGroup.add(shift_vector);
}
mVObjp->onShift(shift_vector);
@@ -829,21 +860,26 @@ const LLVector3& LLDrawable::getBounds(LLVector3& min, LLVector3& max) const
return mXform.getPositionW();
}
-const LLVector3* LLDrawable::getSpatialExtents() const
+const LLVector4a* LLDrawable::getSpatialExtents() const
{
return mExtents;
}
-void LLDrawable::setSpatialExtents(LLVector3 min, LLVector3 max)
+void LLDrawable::setSpatialExtents(const LLVector3& min, const LLVector3& max)
+{
+ mExtents[0].load3(min.mV);
+ mExtents[1].load3(max.mV);
+}
+
+void LLDrawable::setSpatialExtents(const LLVector4a& min, const LLVector4a& max)
{
- LLVector3 size = max - min;
mExtents[0] = min;
- mExtents[1] = max;
+ mExtents[1] = max;
}
-void LLDrawable::setPositionGroup(const LLVector3d& pos)
+void LLDrawable::setPositionGroup(const LLVector4a& pos)
{
- mPositionGroup.setVec(pos);
+ mPositionGroup = pos;
}
void LLDrawable::updateSpatialExtents()
@@ -857,7 +893,7 @@ void LLDrawable::updateSpatialExtents()
if (mSpatialBridge.notNull())
{
- mPositionGroup.setVec(0,0,0);
+ mPositionGroup.splat(0.f);
}
}
@@ -910,6 +946,18 @@ void LLDrawable::setSpatialGroup(LLSpatialGroup *groupp)
{
mSpatialGroupp->setState(LLSpatialGroup::GEOM_DIRTY);
}*/
+
+ if (mSpatialGroupp != groupp && getVOVolume())
+ { //NULL out vertex buffer references for volumes on spatial group change to maintain
+ //requirement that every face vertex buffer is either NULL or points to a vertex buffer
+ //contained by its drawable's spatial group
+ for (S32 i = 0; i < getNumFaces(); ++i)
+ {
+ LLFace* facep = getFace(i);
+ facep->clearVertexBuffer();
+ }
+ }
+
mSpatialGroupp = groupp;
}
@@ -1027,8 +1075,9 @@ BOOL LLDrawable::isVisible() const
//=======================================
LLSpatialBridge::LLSpatialBridge(LLDrawable* root, BOOL render_by_group, U32 data_mask)
-: LLSpatialPartition(data_mask, render_by_group, FALSE)
+: LLSpatialPartition(data_mask, render_by_group, GL_STREAM_DRAW_ARB)
{
+ mBridge = this;
mDrawable = root;
root->setSpatialBridge(this);
@@ -1057,6 +1106,15 @@ LLSpatialBridge::~LLSpatialBridge()
{
group->mSpatialPartition->remove(this, group);
}
+
+ //delete octree here so listeners will still be able to access bridge specific state
+ destroyTree();
+}
+
+void LLSpatialBridge::destroyTree()
+{
+ delete mOctree;
+ mOctree = NULL;
}
void LLSpatialBridge::updateSpatialExtents()
@@ -1068,59 +1126,72 @@ void LLSpatialBridge::updateSpatialExtents()
root->rebound();
}
- LLXformMatrix* mat = mDrawable->getXform();
-
- LLVector3 offset = root->mBounds[0];
- LLVector3 size = root->mBounds[1];
+ LLVector4a offset;
+ LLVector4a size = root->mBounds[1];
- LLVector3 center = LLVector3(0,0,0) * mat->getWorldMatrix();
- LLQuaternion rotation = LLQuaternion(mat->getWorldMatrix());
+ //VECTORIZE THIS
+ LLMatrix4a mat;
+ mat.loadu(mDrawable->getXform()->getWorldMatrix());
+
+ LLVector4a t;
+ t.splat(0.f);
+
+ LLVector4a center;
+ mat.affineTransform(t, center);
- offset *= rotation;
- center += offset;
+ mat.rotate(root->mBounds[0], offset);
+ center.add(offset);
- LLVector3 v[4];
+ LLVector4a v[4];
+
//get 4 corners of bounding box
- v[0] = (size * rotation);
- v[1] = (LLVector3(-size.mV[0], -size.mV[1], size.mV[2]) * rotation);
- v[2] = (LLVector3(size.mV[0], -size.mV[1], -size.mV[2]) * rotation);
- v[3] = (LLVector3(-size.mV[0], size.mV[1], -size.mV[2]) * rotation);
+ mat.rotate(size,v[0]);
- LLVector3& newMin = mExtents[0];
- LLVector3& newMax = mExtents[1];
+ LLVector4a scale;
+
+ scale.set(-1.f, -1.f, 1.f);
+ scale.mul(size);
+ mat.rotate(scale, v[1]);
+
+ scale.set(1.f, -1.f, -1.f);
+ scale.mul(size);
+ mat.rotate(scale, v[2]);
+
+ scale.set(-1.f, 1.f, -1.f);
+ scale.mul(size);
+ mat.rotate(scale, v[3]);
+
+
+ LLVector4a& newMin = mExtents[0];
+ LLVector4a& newMax = mExtents[1];
newMin = newMax = center;
for (U32 i = 0; i < 4; i++)
{
- for (U32 j = 0; j < 3; j++)
- {
- F32 delta = fabsf(v[i].mV[j]);
- F32 min = center.mV[j] - delta;
- F32 max = center.mV[j] + delta;
-
- if (min < newMin.mV[j])
- {
- newMin.mV[j] = min;
- }
-
- if (max > newMax.mV[j])
- {
- newMax.mV[j] = max;
- }
- }
- }
+ LLVector4a delta;
+ delta.setAbs(v[i]);
+ LLVector4a min;
+ min.setSub(center, delta);
+ LLVector4a max;
+ max.setAdd(center, delta);
- LLVector3 diagonal = newMax - newMin;
- mRadius = diagonal.magVec() * 0.5f;
+ newMin.setMin(newMin, min);
+ newMax.setMax(newMax, max);
+ }
- mPositionGroup.setVec((newMin + newMax) * 0.5f);
+ LLVector4a diagonal;
+ diagonal.setSub(newMax, newMin);
+ mRadius = diagonal.getLength3().getF32() * 0.5f;
+
+ mPositionGroup.setAdd(newMin,newMax);
+ mPositionGroup.mul(0.5f);
updateBinRadius();
}
void LLSpatialBridge::updateBinRadius()
{
- mBinRadius = llmin((F32) mOctree->getSize().mdV[0]*0.5f, 256.f);
+ mBinRadius = llmin( mOctree->getSize()[0]*0.5f, 256.f);
}
LLCamera LLSpatialBridge::transformCamera(LLCamera& camera)
@@ -1261,8 +1332,12 @@ void LLSpatialBridge::setVisible(LLCamera& camera_in, std::vector<LLDrawable*>*
LLSpatialGroup* group = (LLSpatialGroup*) mOctree->getListener(0);
group->rebound();
- LLVector3 center = (mExtents[0] + mExtents[1]) * 0.5f;
- LLVector3 size = (mExtents[1]-mExtents[0]) * 0.5f;
+ LLVector4a center;
+ center.setAdd(mExtents[0], mExtents[1]);
+ center.mul(0.5f);
+ LLVector4a size;
+ size.setSub(mExtents[1], mExtents[0]);
+ size.mul(0.5f);
if ((LLPipeline::sShadowRender && camera_in.AABBInFrustum(center, size)) ||
LLPipeline::sImpostorRender ||
@@ -1375,11 +1450,11 @@ BOOL LLSpatialBridge::updateMove()
return TRUE;
}
-void LLSpatialBridge::shiftPos(const LLVector3& vec)
+void LLSpatialBridge::shiftPos(const LLVector4a& vec)
{
- mExtents[0] += vec;
- mExtents[1] += vec;
- mPositionGroup += LLVector3d(vec);
+ mExtents[0].add(vec);
+ mExtents[1].add(vec);
+ mPositionGroup.add(vec);
}
void LLSpatialBridge::cleanupReferences()
@@ -1453,10 +1528,6 @@ BOOL LLDrawable::isAnimating() const
{
return TRUE;
}
- if (mVObjp->getPCode() == LLViewerObject::LL_VO_CLOUDS)
- {
- return TRUE;
- }
if (!isRoot() && !mVObjp->getAngularVelocity().isExactlyZero())
{
@@ -1497,7 +1568,7 @@ F32 LLHUDBridge::calcPixelArea(LLSpatialGroup* group, LLCamera& camera)
}
-void LLHUDBridge::shiftPos(const LLVector3& vec)
+void LLHUDBridge::shiftPos(const LLVector4a& vec)
{
//don't shift hud bridges on region crossing
}
diff --git a/indra/newview/lldrawable.h b/indra/newview/lldrawable.h
index 2cea41df0a..e268640a21 100644
--- a/indra/newview/lldrawable.h
+++ b/indra/newview/lldrawable.h
@@ -35,6 +35,7 @@
#include "v4math.h"
#include "m4math.h"
#include "v4coloru.h"
+#include "llvector4a.h"
#include "llquaternion.h"
#include "xform.h"
#include "llmemtype.h"
@@ -61,6 +62,17 @@ const U32 SILHOUETTE_HIGHLIGHT = 0;
class LLDrawable : public LLRefCount
{
public:
+ LLDrawable(const LLDrawable& rhs)
+ {
+ *this = rhs;
+ }
+
+ const LLDrawable& operator=(const LLDrawable& rhs)
+ {
+ llerrs << "Illegal operation!" << llendl;
+ return *this;
+ }
+
static void initClass();
LLDrawable() { init(); }
@@ -84,19 +96,19 @@ public:
LLVOVolume* getVOVolume() const; // cast mVObjp tp LLVOVolume if OK
const LLMatrix4& getWorldMatrix() const { return mXform.getWorldMatrix(); }
- const LLMatrix4& getRenderMatrix() const { return isRoot() ? getWorldMatrix() : getParent()->getWorldMatrix(); }
+ const LLMatrix4& getRenderMatrix() const;
void setPosition(LLVector3 v) const { }
const LLVector3& getPosition() const { return mXform.getPosition(); }
const LLVector3& getWorldPosition() const { return mXform.getPositionW(); }
const LLVector3 getPositionAgent() const;
- const LLVector3d& getPositionGroup() const { return mPositionGroup; }
+ const LLVector4a& getPositionGroup() const { return mPositionGroup; }
const LLVector3& getScale() const { return mCurrentScale; }
void setScale(const LLVector3& scale) { mCurrentScale = scale; }
const LLQuaternion& getWorldRotation() const { return mXform.getWorldRotation(); }
const LLQuaternion& getRotation() const { return mXform.getRotation(); }
F32 getIntensity() const { return llmin(mXform.getScale().mV[0], 4.f); }
S32 getLOD() const { return mVObjp ? mVObjp->getLOD() : 1; }
- F64 getBinRadius() const { return mBinRadius; }
+ F32 getBinRadius() const { return mBinRadius; }
void getMinMax(LLVector3& min,LLVector3& max) const { mXform.getMinMax(min,max); }
LLXformMatrix* getXform() { return &mXform; }
@@ -150,7 +162,7 @@ public:
void updateSpecialHoverCursor(BOOL enabled);
- virtual void shiftPos(const LLVector3 &shift_vector);
+ virtual void shiftPos(const LLVector4a &shift_vector);
S32 getGeneration() const { return mGeneration; }
@@ -168,11 +180,12 @@ public:
const LLVector3& getBounds(LLVector3& min, LLVector3& max) const;
virtual void updateSpatialExtents();
virtual void updateBinRadius();
- const LLVector3* getSpatialExtents() const;
- void setSpatialExtents(LLVector3 min, LLVector3 max);
- void setPositionGroup(const LLVector3d& pos);
- void setPositionGroup(const LLVector3& pos) { setPositionGroup(LLVector3d(pos)); }
+ const LLVector4a* getSpatialExtents() const;
+ void setSpatialExtents(const LLVector3& min, const LLVector3& max);
+ void setSpatialExtents(const LLVector4a& min, const LLVector4a& max);
+ void setPositionGroup(const LLVector4a& pos);
+
void setRenderType(S32 type) { mRenderType = type; }
BOOL isRenderType(S32 type) { return mRenderType == type; }
S32 getRenderType() { return mRenderType; }
@@ -232,37 +245,45 @@ public:
typedef enum e_drawable_flags
{
- IN_REBUILD_Q1 = 0x00000002,
- IN_REBUILD_Q2 = 0x00000004,
- IN_LIGHT_Q = 0x00000008,
- EARLY_MOVE = 0x00000010,
- MOVE_UNDAMPED = 0x00000020,
- ON_MOVE_LIST = 0x00000040,
- USE_BACKLIGHT = 0x00000080,
- UV = 0x00000100,
- UNLIT = 0x00000200,
- LIGHT = 0x00000400,
- LIGHTING_BUILT = 0x00000800,
- REBUILD_VOLUME = 0x00001000, //volume changed LOD or parameters, or vertex buffer changed
- REBUILD_TCOORD = 0x00002000, //texture coordinates changed
- REBUILD_COLOR = 0x00004000, //color changed
- REBUILD_POSITION= 0x00010000, //vertex positions/normals changed
+ IN_REBUILD_Q1 = 0x00000001,
+ IN_REBUILD_Q2 = 0x00000002,
+ IN_LIGHT_Q = 0x00000004,
+ EARLY_MOVE = 0x00000008,
+ MOVE_UNDAMPED = 0x00000010,
+ ON_MOVE_LIST = 0x00000020,
+ USE_BACKLIGHT = 0x00000040,
+ UV = 0x00000080,
+ UNLIT = 0x00000100,
+ LIGHT = 0x00000200,
+ LIGHTING_BUILT = 0x00000400,
+ REBUILD_VOLUME = 0x00000800, //volume changed LOD or parameters, or vertex buffer changed
+ REBUILD_TCOORD = 0x00001000, //texture coordinates changed
+ REBUILD_COLOR = 0x00002000, //color changed
+ REBUILD_POSITION= 0x00004000, //vertex positions/normals changed
REBUILD_GEOMETRY= REBUILD_POSITION|REBUILD_TCOORD|REBUILD_COLOR,
REBUILD_MATERIAL= REBUILD_TCOORD|REBUILD_COLOR,
REBUILD_ALL = REBUILD_GEOMETRY|REBUILD_VOLUME,
- ON_SHIFT_LIST = 0x00100000,
- BLOCKER = 0x00400000,
- ACTIVE = 0x00800000,
- DEAD = 0x01000000,
- INVISIBLE = 0x02000000, // stay invisible until flag is cleared
- NEARBY_LIGHT = 0x04000000, // In gPipeline.mNearbyLightSet
- BUILT = 0x08000000,
- FORCE_INVISIBLE = 0x10000000, // stay invis until CLEAR_INVISIBLE is set (set of orphaned)
- CLEAR_INVISIBLE = 0x20000000, // clear FORCE_INVISIBLE next draw frame
- REBUILD_SHADOW = 0x40000000,
- HAS_ALPHA = 0x80000000,
+ REBUILD_RIGGED = 0x00008000,
+ ON_SHIFT_LIST = 0x00010000,
+ BLOCKER = 0x00020000,
+ ACTIVE = 0x00040000,
+ DEAD = 0x00080000,
+ INVISIBLE = 0x00100000, // stay invisible until flag is cleared
+ NEARBY_LIGHT = 0x00200000, // In gPipeline.mNearbyLightSet
+ BUILT = 0x00400000,
+ FORCE_INVISIBLE = 0x00800000, // stay invis until CLEAR_INVISIBLE is set (set of orphaned)
+ CLEAR_INVISIBLE = 0x01000000, // clear FORCE_INVISIBLE next draw frame
+ REBUILD_SHADOW = 0x02000000,
+ HAS_ALPHA = 0x04000000,
+ RIGGED = 0x08000000,
+ PARTITION_MOVE = 0x10000000,
} EDrawableFlags;
+private: //aligned members
+ LLVector4a mExtents[2];
+ LLVector4a mPositionGroup;
+
+public:
LLXformMatrix mXform;
// vis data
@@ -292,9 +313,7 @@ private:
mutable U32 mVisible;
F32 mRadius;
- LLVector3 mExtents[2];
- LLVector3d mPositionGroup;
- F64 mBinRadius;
+ F32 mBinRadius;
S32 mGeneration;
LLVector3 mCurrentScale;
diff --git a/indra/newview/lldrawpool.cpp b/indra/newview/lldrawpool.cpp
index ba576ff97f..35f8a85796 100644
--- a/indra/newview/lldrawpool.cpp
+++ b/indra/newview/lldrawpool.cpp
@@ -35,7 +35,6 @@
#include "lldrawpoolalpha.h"
#include "lldrawpoolavatar.h"
#include "lldrawpoolbump.h"
-#include "lldrawpoolclouds.h"
#include "lldrawpoolground.h"
#include "lldrawpoolsimple.h"
#include "lldrawpoolsky.h"
@@ -191,6 +190,17 @@ void LLDrawPool::renderPostDeferred(S32 pass)
//virtual
void LLDrawPool::endRenderPass( S32 pass )
{
+ /*for (U32 i = 0; i < gGLManager.mNumTextureImageUnits; i++)
+ { //dummy cleanup of any currently bound textures
+ if (gGL.getTexUnit(i)->getCurrType() != LLTexUnit::TT_NONE)
+ {
+ gGL.getTexUnit(i)->unbind(gGL.getTexUnit(i)->getCurrType());
+ gGL.getTexUnit(i)->disable();
+ }
+ }*/
+
+ //make sure channel 0 is active channel
+ gGL.getTexUnit(0)->activate();
}
//virtual
@@ -243,11 +253,6 @@ void LLFacePool::dirtyTextures(const std::set<LLViewerFetchedTexture*>& textures
{
}
-BOOL LLFacePool::moveFace(LLFace *face, LLDrawPool *poolp, BOOL copy_data)
-{
- return TRUE;
-}
-
// static
S32 LLFacePool::drawLoop(face_array_t& face_list)
{
@@ -379,7 +384,7 @@ BOOL LLFacePool::LLOverrideFaceColor::sOverrideFaceColor = FALSE;
void LLFacePool::LLOverrideFaceColor::setColor(const LLColor4& color)
{
- glColor4fv(color.mV);
+ gGL.diffuseColor4fv(color.mV);
}
void LLFacePool::LLOverrideFaceColor::setColor(const LLColor4U& color)
@@ -389,7 +394,7 @@ void LLFacePool::LLOverrideFaceColor::setColor(const LLColor4U& color)
void LLFacePool::LLOverrideFaceColor::setColor(F32 r, F32 g, F32 b, F32 a)
{
- glColor4f(r,g,b,a);
+ gGL.diffuseColor4f(r,g,b,a);
}
@@ -435,14 +440,14 @@ void LLRenderPass::renderTexture(U32 type, U32 mask)
pushBatches(type, mask, TRUE);
}
-void LLRenderPass::pushBatches(U32 type, U32 mask, BOOL texture)
+void LLRenderPass::pushBatches(U32 type, U32 mask, BOOL texture, BOOL batch_textures)
{
for (LLCullResult::drawinfo_list_t::iterator i = gPipeline.beginRenderMap(type); i != gPipeline.endRenderMap(type); ++i)
{
LLDrawInfo* pparams = *i;
if (pparams)
{
- pushBatch(*pparams, mask, texture);
+ pushBatch(*pparams, mask, texture, batch_textures);
}
}
}
@@ -452,35 +457,52 @@ void LLRenderPass::applyModelMatrix(LLDrawInfo& params)
if (params.mModelMatrix != gGLLastMatrix)
{
gGLLastMatrix = params.mModelMatrix;
- glLoadMatrixd(gGLModelView);
+ gGL.loadMatrix(gGLModelView);
if (params.mModelMatrix)
{
- glMultMatrixf((GLfloat*) params.mModelMatrix->mMatrix);
+ gGL.multMatrix((GLfloat*) params.mModelMatrix->mMatrix);
}
gPipeline.mMatrixOpCount++;
}
}
-void LLRenderPass::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture)
+void LLRenderPass::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture, BOOL batch_textures)
{
applyModelMatrix(params);
+ bool tex_setup = false;
+
if (texture)
{
- if (params.mTexture.notNull())
+ if (batch_textures && params.mTextureList.size() > 1)
{
- params.mTexture->addTextureStats(params.mVSize);
- gGL.getTexUnit(0)->bind(params.mTexture, TRUE) ;
- if (params.mTextureMatrix)
+ for (U32 i = 0; i < params.mTextureList.size(); ++i)
{
- glMatrixMode(GL_TEXTURE);
- glLoadMatrixf((GLfloat*) params.mTextureMatrix->mMatrix);
- gPipeline.mTextureMatrixOps++;
+ if (params.mTextureList[i].notNull())
+ {
+ gGL.getTexUnit(i)->bind(params.mTextureList[i], TRUE);
+ }
}
}
else
- {
- gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+ { //not batching textures or batch has only 1 texture -- might need a texture matrix
+ if (params.mTexture.notNull())
+ {
+ params.mTexture->addTextureStats(params.mVSize);
+ gGL.getTexUnit(0)->bind(params.mTexture, TRUE) ;
+ if (params.mTextureMatrix)
+ {
+ tex_setup = true;
+ gGL.getTexUnit(0)->activate();
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.loadMatrix((GLfloat*) params.mTextureMatrix->mMatrix);
+ gPipeline.mTextureMatrixOps++;
+ }
+ }
+ else
+ {
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+ }
}
}
@@ -495,10 +517,10 @@ void LLRenderPass::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture)
gPipeline.addTrianglesDrawn(params.mCount, params.mDrawMode);
}
- if (params.mTextureMatrix && texture && params.mTexture.notNull())
+ if (tex_setup)
{
- glLoadIdentity();
- glMatrixMode(GL_MODELVIEW);
+ gGL.loadIdentity();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
}
}
diff --git a/indra/newview/lldrawpool.h b/indra/newview/lldrawpool.h
index 1d6f99d346..64774d06df 100644
--- a/indra/newview/lldrawpool.h
+++ b/indra/newview/lldrawpool.h
@@ -47,14 +47,14 @@ public:
{
// Correspond to LLPipeline render type
POOL_SIMPLE = 1,
+ POOL_GROUND,
+ POOL_FULLBRIGHT,
+ POOL_BUMP,
POOL_TERRAIN,
- POOL_TREE,
POOL_SKY,
POOL_WL_SKY,
- POOL_GROUND,
+ POOL_TREE,
POOL_GRASS,
- POOL_FULLBRIGHT,
- POOL_BUMP,
POOL_INVISIBLE, // see below *
POOL_AVATAR,
POOL_VOIDWATER,
@@ -133,7 +133,7 @@ public:
PASS_ALPHA,
PASS_ALPHA_MASK,
PASS_FULLBRIGHT_ALPHA_MASK,
- PASS_ALPHA_SHADOW,
+ PASS_ALPHA_INVISIBLE,
NUM_RENDER_TYPES,
};
@@ -146,8 +146,8 @@ public:
void resetDrawOrders() { }
static void applyModelMatrix(LLDrawInfo& params);
- virtual void pushBatches(U32 type, U32 mask, BOOL texture = TRUE);
- virtual void pushBatch(LLDrawInfo& params, U32 mask, BOOL texture);
+ virtual void pushBatches(U32 type, U32 mask, BOOL texture = TRUE, BOOL batch_textures = FALSE);
+ virtual void pushBatch(LLDrawInfo& params, U32 mask, BOOL texture, BOOL batch_textures = FALSE);
virtual void renderGroup(LLSpatialGroup* group, U32 type, U32 mask, BOOL texture = TRUE);
virtual void renderGroups(U32 type, U32 mask, BOOL texture = TRUE);
virtual void renderTexture(U32 type, U32 mask);
@@ -182,8 +182,6 @@ public:
virtual void resetDrawOrders();
void resetAll();
- BOOL moveFace(LLFace *face, LLDrawPool *poolp, BOOL copy_data = FALSE);
-
void destroy();
void buildEdges();
diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp
index a2428d2de0..5b62dbc560 100644
--- a/indra/newview/lldrawpoolalpha.cpp
+++ b/indra/newview/lldrawpoolalpha.cpp
@@ -54,7 +54,7 @@ static BOOL deferred_render = FALSE;
LLDrawPoolAlpha::LLDrawPoolAlpha(U32 type) :
LLRenderPass(type), current_shader(NULL), target_shader(NULL),
- simple_shader(NULL), fullbright_shader(NULL),
+ simple_shader(NULL), fullbright_shader(NULL), emissive_shader(NULL),
mColorSFactor(LLRender::BF_UNDEF), mColorDFactor(LLRender::BF_UNDEF),
mAlphaSFactor(LLRender::BF_UNDEF), mAlphaDFactor(LLRender::BF_UNDEF)
{
@@ -88,31 +88,57 @@ void LLDrawPoolAlpha::endDeferredPass(S32 pass)
void LLDrawPoolAlpha::renderDeferred(S32 pass)
{
- gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.f);
- {
- LLFastTimer t(FTM_RENDER_GRASS);
- gDeferredTreeProgram.bind();
- LLGLEnable test(GL_ALPHA_TEST);
- //render alpha masked objects
- LLRenderPass::renderTexture(LLRenderPass::PASS_ALPHA_MASK, getVertexDataMask());
- gDeferredTreeProgram.unbind();
- }
- gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
+ LLFastTimer t(FTM_RENDER_GRASS);
+ gDeferredDiffuseAlphaMaskProgram.bind();
+ gDeferredDiffuseAlphaMaskProgram.setMinimumAlpha(0.33f);
+
+ //render alpha masked objects
+ LLRenderPass::pushBatches(LLRenderPass::PASS_ALPHA_MASK, getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE);
+ gDeferredDiffuseAlphaMaskProgram.unbind();
}
S32 LLDrawPoolAlpha::getNumPostDeferredPasses()
{
- return 1;
+ if (LLPipeline::sImpostorRender)
+ { //skip depth buffer filling pass when rendering impostors
+ return 1;
+ }
+ else if (gSavedSettings.getBOOL("RenderDepthOfField"))
+ {
+ return 2;
+ }
+ else
+ {
+ return 1;
+ }
}
void LLDrawPoolAlpha::beginPostDeferredPass(S32 pass)
{
LLFastTimer t(FTM_RENDER_ALPHA);
- simple_shader = &gDeferredAlphaProgram;
- fullbright_shader = &gDeferredFullbrightProgram;
-
+ if (pass == 0)
+ {
+ simple_shader = &gDeferredAlphaProgram;
+ fullbright_shader = &gObjectFullbrightAlphaMaskProgram;
+
+ //prime simple shader (loads shadow relevant uniforms)
+ gPipeline.bindDeferredShader(*simple_shader);
+ }
+ else
+ {
+ //update depth buffer sampler
+ gPipeline.mScreen.flush();
+ gPipeline.mDeferredDepth.copyContents(gPipeline.mDeferredScreen, 0, 0, gPipeline.mDeferredScreen.getWidth(), gPipeline.mDeferredScreen.getHeight(),
+ 0, 0, gPipeline.mDeferredDepth.getWidth(), gPipeline.mDeferredDepth.getHeight(), GL_DEPTH_BUFFER_BIT, GL_NEAREST);
+ gPipeline.mDeferredDepth.bindTarget();
+ simple_shader = NULL;
+ fullbright_shader = NULL;
+ gObjectFullbrightAlphaMaskProgram.bind();
+ gObjectFullbrightAlphaMaskProgram.setMinimumAlpha(0.33f);
+ }
+
deferred_render = TRUE;
if (mVertexShaderLevel > 0)
{
@@ -124,6 +150,14 @@ void LLDrawPoolAlpha::beginPostDeferredPass(S32 pass)
void LLDrawPoolAlpha::endPostDeferredPass(S32 pass)
{
+
+ if (pass == 1)
+ {
+ gPipeline.mDeferredDepth.flush();
+ gPipeline.mScreen.bindTarget();
+ gObjectFullbrightAlphaMaskProgram.unbind();
+ }
+
deferred_render = FALSE;
endRenderPass(pass);
}
@@ -139,13 +173,15 @@ void LLDrawPoolAlpha::beginRenderPass(S32 pass)
if (LLPipeline::sUnderWaterRender)
{
- simple_shader = &gObjectSimpleWaterProgram;
- fullbright_shader = &gObjectFullbrightWaterProgram;
+ simple_shader = &gObjectSimpleWaterAlphaMaskProgram;
+ fullbright_shader = &gObjectFullbrightWaterAlphaMaskProgram;
+ emissive_shader = &gObjectEmissiveWaterProgram;
}
else
{
- simple_shader = &gObjectSimpleProgram;
- fullbright_shader = &gObjectFullbrightProgram;
+ simple_shader = &gObjectSimpleAlphaMaskProgram;
+ fullbright_shader = &gObjectFullbrightAlphaMaskProgram;
+ emissive_shader = &gObjectEmissiveProgram;
}
if (mVertexShaderLevel > 0)
@@ -174,9 +210,16 @@ void LLDrawPoolAlpha::render(S32 pass)
LLGLSPipelineAlpha gls_pipeline_alpha;
- gGL.setColorMask(true, true);
+ if (deferred_render && pass == 1)
+ { //depth only
+ gGL.setColorMask(false, false);
+ }
+ else
+ {
+ gGL.setColorMask(true, true);
+ }
- if (LLPipeline::sAutoMaskAlphaNonDeferred && !deferred_render)
+ if (LLPipeline::sAutoMaskAlphaNonDeferred)
{
mColorSFactor = LLRender::BF_ONE; // }
mColorDFactor = LLRender::BF_ZERO; // } these are like disabling blend on the color channels, but we're still blending on the alpha channel so that we can suppress glow
@@ -184,57 +227,122 @@ void LLDrawPoolAlpha::render(S32 pass)
mAlphaDFactor = LLRender::BF_ZERO; // block (zero-out) glow where the alpha test succeeds
gGL.blendFunc(mColorSFactor, mColorDFactor, mAlphaSFactor, mAlphaDFactor);
- gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.33f);
if (mVertexShaderLevel > 0)
{
- if (!LLPipeline::sRenderDeferred)
+ if (!LLPipeline::sRenderDeferred || !deferred_render)
{
simple_shader->bind();
- pushBatches(LLRenderPass::PASS_ALPHA_MASK, getVertexDataMask());
+ simple_shader->setMinimumAlpha(0.33f);
+
+ pushBatches(LLRenderPass::PASS_ALPHA_MASK, getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE);
}
- fullbright_shader->bind();
- pushBatches(LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK, getVertexDataMask());
- LLGLSLShader::bindNoShader();
+ if (fullbright_shader)
+ {
+ fullbright_shader->bind();
+ fullbright_shader->setMinimumAlpha(0.33f);
+ }
+ pushBatches(LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK, getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE);
+ //LLGLSLShader::bindNoShader();
}
else
{
+ gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.33f); //OK
gPipeline.enableLightsFullbright(LLColor4(1,1,1,1));
pushBatches(LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK, getVertexDataMask());
gPipeline.enableLightsDynamic();
pushBatches(LLRenderPass::PASS_ALPHA_MASK, getVertexDataMask());
+ gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); //OK
}
- gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
}
- LLGLDepthTest depth(GL_TRUE, LLDrawPoolWater::sSkipScreenCopy ? GL_TRUE : GL_FALSE);
+ LLGLDepthTest depth(GL_TRUE, LLDrawPoolWater::sSkipScreenCopy ||
+ (deferred_render && pass == 1) ? GL_TRUE : GL_FALSE);
- mColorSFactor = LLRender::BF_SOURCE_ALPHA; // } regular alpha blend
- mColorDFactor = LLRender::BF_ONE_MINUS_SOURCE_ALPHA; // }
- mAlphaSFactor = LLRender::BF_ZERO; // } glow suppression
- mAlphaDFactor = LLRender::BF_ONE_MINUS_SOURCE_ALPHA; // }
- gGL.blendFunc(mColorSFactor, mColorDFactor, mAlphaSFactor, mAlphaDFactor);
+ if (deferred_render && pass == 1)
+ {
+ gGL.blendFunc(LLRender::BF_SOURCE_ALPHA, LLRender::BF_ONE_MINUS_SOURCE_ALPHA);
+ }
+ else
+ {
+ mColorSFactor = LLRender::BF_SOURCE_ALPHA; // } regular alpha blend
+ mColorDFactor = LLRender::BF_ONE_MINUS_SOURCE_ALPHA; // }
+ mAlphaSFactor = LLRender::BF_ZERO; // } glow suppression
+ mAlphaDFactor = LLRender::BF_ONE_MINUS_SOURCE_ALPHA; // }
+ gGL.blendFunc(mColorSFactor, mColorDFactor, mAlphaSFactor, mAlphaDFactor);
+
+ if (mVertexShaderLevel > 0)
+ {
+ if (LLPipeline::sImpostorRender)
+ {
+ fullbright_shader->bind();
+ fullbright_shader->setMinimumAlpha(0.5f);
+ simple_shader->bind();
+ simple_shader->setMinimumAlpha(0.5f);
+ }
+ else
+ {
+ fullbright_shader->bind();
+ fullbright_shader->setMinimumAlpha(0.f);
+ simple_shader->bind();
+ simple_shader->setMinimumAlpha(0.f);
+ }
+ }
+ else
+ {
+ if (LLPipeline::sImpostorRender)
+ {
+ gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.5f); //OK
+ }
+ else
+ {
+ gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); //OK
+ }
+ }
+ }
- renderAlpha(getVertexDataMask());
+ if (mVertexShaderLevel > 0)
+ {
+ renderAlpha(getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX);
+ }
+ else
+ {
+ renderAlpha(getVertexDataMask());
+ }
gGL.setColorMask(true, false);
- if (deferred_render && current_shader != NULL)
+ if (deferred_render && pass == 1)
{
- gPipeline.unbindDeferredShader(*current_shader);
+ gGL.setSceneBlendType(LLRender::BT_ALPHA);
}
if (sShowDebugAlpha)
{
- if(gPipeline.canUseWindLightShaders())
+ BOOL shaders = gPipeline.canUseVertexShaders();
+ if(shaders)
{
- LLGLSLShader::bindNoShader();
+ gHighlightProgram.bind();
}
- gPipeline.enableLightsFullbright(LLColor4(1,1,1,1));
- glColor4f(1,0,0,1);
+ else
+ {
+ gPipeline.enableLightsFullbright(LLColor4(1,1,1,1));
+ }
+
+ gGL.diffuseColor4f(1,0,0,1);
+
LLViewerFetchedTexture::sSmokeImagep->addTextureStats(1024.f*1024.f);
gGL.getTexUnit(0)->bind(LLViewerFetchedTexture::sSmokeImagep, TRUE) ;
renderAlphaHighlight(LLVertexBuffer::MAP_VERTEX |
LLVertexBuffer::MAP_TEXCOORD0);
+
+ pushBatches(LLRenderPass::PASS_ALPHA_MASK, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
+ pushBatches(LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
+ pushBatches(LLRenderPass::PASS_ALPHA_INVISIBLE, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
+
+ if(shaders)
+ {
+ gHighlightProgram.unbind();
+ }
}
}
@@ -274,24 +382,9 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask)
{
BOOL initialized_lighting = FALSE;
BOOL light_enabled = TRUE;
- S32 diffuse_channel = 0;
-
- //BOOL is_particle = FALSE;
- BOOL use_shaders = (LLPipeline::sUnderWaterRender && gPipeline.canUseVertexShaders())
- || gPipeline.canUseWindLightShadersOnObjects();
- // check to see if it's a particle and if it's "close"
- {
- if (LLPipeline::sImpostorRender)
- {
- gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.5f);
- }
- else
- {
- gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
- }
- }
-
+ BOOL use_shaders = gPipeline.canUseVertexShaders();
+
for (LLCullResult::sg_list_t::iterator i = gPipeline.beginAlphaGroups(); i != gPipeline.endAlphaGroups(); ++i)
{
LLSpatialGroup* group = *i;
@@ -304,7 +397,6 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask)
bool draw_glow_for_this_partition = mVertexShaderLevel > 0 && // no shaders = no glow.
// All particle systems seem to come off the wire with texture entries which claim that they glow. This is probably a bug in the data. Suppress.
group->mSpatialPartition->mPartitionType != LLViewerRegion::PARTITION_PARTICLE &&
- group->mSpatialPartition->mPartitionType != LLViewerRegion::PARTITION_CLOUD &&
group->mSpatialPartition->mPartitionType != LLViewerRegion::PARTITION_HUD_PARTICLE;
LLSpatialGroup::drawmap_elem_t& draw_info = group->mDrawMap[LLRenderPass::PASS_ALPHA];
@@ -315,92 +407,89 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask)
LLRenderPass::applyModelMatrix(params);
+
+ if (params.mFullbright)
{
- if (params.mFullbright)
- {
- // Turn off lighting if it hasn't already been so.
- if (light_enabled || !initialized_lighting)
- {
- initialized_lighting = TRUE;
- if (use_shaders)
- {
- target_shader = fullbright_shader;
- }
- else
- {
- gPipeline.enableLightsFullbright(LLColor4(1,1,1,1));
- }
- light_enabled = FALSE;
- }
- }
- // Turn on lighting if it isn't already.
- else if (!light_enabled || !initialized_lighting)
+ // Turn off lighting if it hasn't already been so.
+ if (light_enabled || !initialized_lighting)
{
initialized_lighting = TRUE;
if (use_shaders)
{
- target_shader = simple_shader;
+ target_shader = fullbright_shader;
}
else
{
- gPipeline.enableLightsDynamic();
+ gPipeline.enableLightsFullbright(LLColor4(1,1,1,1));
}
- light_enabled = TRUE;
+ light_enabled = FALSE;
}
-
- // If we need shaders, and we're not ALREADY using the proper shader, then bind it
- // (this way we won't rebind shaders unnecessarily).
- if(use_shaders && (current_shader != target_shader))
+ }
+ // Turn on lighting if it isn't already.
+ else if (!light_enabled || !initialized_lighting)
+ {
+ initialized_lighting = TRUE;
+ if (use_shaders)
{
- llassert(target_shader != NULL);
- if (deferred_render && current_shader != NULL)
- {
- gPipeline.unbindDeferredShader(*current_shader);
- diffuse_channel = 0;
- }
- current_shader = target_shader;
- if (deferred_render)
- {
- gPipeline.bindDeferredShader(*current_shader);
- diffuse_channel = current_shader->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
- }
- else
- {
- current_shader->bind();
- }
+ target_shader = simple_shader;
}
- else if (!use_shaders && current_shader != NULL)
+ else
{
- if (deferred_render)
- {
- gPipeline.unbindDeferredShader(*current_shader);
- diffuse_channel = 0;
- }
- LLGLSLShader::bindNoShader();
- current_shader = NULL;
+ gPipeline.enableLightsDynamic();
}
+ light_enabled = TRUE;
+ }
- if (params.mGroup)
- {
- params.mGroup->rebuildMesh();
- }
+ // If we need shaders, and we're not ALREADY using the proper shader, then bind it
+ // (this way we won't rebind shaders unnecessarily).
+ if(use_shaders && (current_shader != target_shader))
+ {
+ llassert(target_shader != NULL);
+ current_shader = target_shader;
+ current_shader->bind();
+ }
+ else if (!use_shaders && current_shader != NULL)
+ {
+ LLGLSLShader::bindNoShader();
+ current_shader = NULL;
+ }
-
- if (params.mTexture.notNull())
+ if (params.mGroup)
+ {
+ params.mGroup->rebuildMesh();
+ }
+
+ bool tex_setup = false;
+
+ if (use_shaders && params.mTextureList.size() > 1)
+ {
+ for (U32 i = 0; i < params.mTextureList.size(); ++i)
{
- gGL.getTexUnit(diffuse_channel)->bind(params.mTexture.get());
- if(params.mTexture.notNull())
+ if (params.mTextureList[i].notNull())
{
- params.mTexture->addTextureStats(params.mVSize);
+ gGL.getTexUnit(i)->bind(params.mTextureList[i], TRUE);
}
+ }
+ }
+ else
+ { //not batching textures or batch has only 1 texture -- might need a texture matrix
+ if (params.mTexture.notNull())
+ {
+ params.mTexture->addTextureStats(params.mVSize);
+ gGL.getTexUnit(0)->bind(params.mTexture, TRUE) ;
if (params.mTextureMatrix)
{
+ tex_setup = true;
gGL.getTexUnit(0)->activate();
- glMatrixMode(GL_TEXTURE);
- glLoadMatrixf((GLfloat*) params.mTextureMatrix->mMatrix);
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.loadMatrix((GLfloat*) params.mTextureMatrix->mMatrix);
gPipeline.mTextureMatrixOps++;
}
}
+ else
+ {
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+ }
}
params.mVertexBuffer->setBuffer(mask);
@@ -408,44 +497,41 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask)
gPipeline.addTrianglesDrawn(params.mCount, params.mDrawMode);
// If this alpha mesh has glow, then draw it a second time to add the destination-alpha (=glow). Interleaving these state-changing calls could be expensive, but glow must be drawn Z-sorted with alpha.
- if (draw_glow_for_this_partition &&
- params.mGlowColor.mV[3] > 0)
+ if (current_shader &&
+ draw_glow_for_this_partition &&
+ params.mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_EMISSIVE))
{
// install glow-accumulating blend mode
gGL.blendFunc(LLRender::BF_ZERO, LLRender::BF_ONE, // don't touch color
LLRender::BF_ONE, LLRender::BF_ONE); // add to alpha (glow)
+ emissive_shader->bind();
+
// glow doesn't use vertex colors from the mesh data
- params.mVertexBuffer->setBuffer(mask & ~LLVertexBuffer::MAP_COLOR);
- glColor4ubv(params.mGlowColor.mV);
-
+ params.mVertexBuffer->setBuffer((mask & ~LLVertexBuffer::MAP_COLOR) | LLVertexBuffer::MAP_EMISSIVE);
+
// do the actual drawing, again
params.mVertexBuffer->drawRange(params.mDrawMode, params.mStart, params.mEnd, params.mCount, params.mOffset);
gPipeline.addTrianglesDrawn(params.mCount, params.mDrawMode);
// restore our alpha blend mode
gGL.blendFunc(mColorSFactor, mColorDFactor, mAlphaSFactor, mAlphaDFactor);
+
+ current_shader->bind();
}
- if (params.mTextureMatrix && params.mTexture.notNull())
+ if (tex_setup)
{
gGL.getTexUnit(0)->activate();
- glLoadIdentity();
- glMatrixMode(GL_MODELVIEW);
+ gGL.loadIdentity();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
}
}
}
}
- if (deferred_render && current_shader != NULL)
- {
- gPipeline.unbindDeferredShader(*current_shader);
- LLVertexBuffer::unbind();
- LLGLState::checkStates();
- LLGLState::checkTextureChannels();
- LLGLState::checkClientArrays();
- }
-
+ LLVertexBuffer::unbind();
+
if (!light_enabled)
{
gPipeline.enableLightsDynamic();
diff --git a/indra/newview/lldrawpoolalpha.h b/indra/newview/lldrawpoolalpha.h
index 12a7ae92b1..a4245e561d 100644
--- a/indra/newview/lldrawpoolalpha.h
+++ b/indra/newview/lldrawpoolalpha.h
@@ -78,6 +78,7 @@ private:
LLGLSLShader* target_shader;
LLGLSLShader* simple_shader;
LLGLSLShader* fullbright_shader;
+ LLGLSLShader* emissive_shader;
// our 'normal' alpha blend function for this pass
LLRender::eBlendFactor mColorSFactor;
diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp
index dbd5da31a6..0103373fd2 100644
--- a/indra/newview/lldrawpoolavatar.cpp
+++ b/indra/newview/lldrawpoolavatar.cpp
@@ -31,15 +31,21 @@
#include "llvoavatar.h"
#include "m3math.h"
+#include "llmatrix4a.h"
+#include "llagent.h" //for gAgent.needsRenderAvatar()
#include "lldrawable.h"
+#include "lldrawpoolbump.h"
#include "llface.h"
+#include "llmeshrepository.h"
#include "llsky.h"
#include "llviewercamera.h"
#include "llviewerregion.h"
#include "noise.h"
#include "pipeline.h"
#include "llviewershadermgr.h"
+#include "llvovolume.h"
+#include "llvolume.h"
#include "llappviewer.h"
#include "llrendersphere.h"
#include "llviewerpartsim.h"
@@ -47,10 +53,15 @@
static U32 sDataMask = LLDrawPoolAvatar::VERTEX_DATA_MASK;
static U32 sBufferUsage = GL_STREAM_DRAW_ARB;
static U32 sShaderLevel = 0;
-static LLGLSLShader* sVertexProgram = NULL;
+
+LLGLSLShader* LLDrawPoolAvatar::sVertexProgram = NULL;
BOOL LLDrawPoolAvatar::sSkipOpaque = FALSE;
BOOL LLDrawPoolAvatar::sSkipTransparent = FALSE;
+S32 LLDrawPoolAvatar::sDiffuseChannel = 0;
+
+
+static bool is_deferred_render = false;
extern BOOL gUseGLPick;
@@ -86,7 +97,7 @@ BOOL gAvatarEmbossBumpMap = FALSE;
static BOOL sRenderingSkinned = FALSE;
S32 normal_channel = -1;
S32 specular_channel = -1;
-S32 diffuse_channel = -1;
+S32 cube_channel = -1;
static LLFastTimer::DeclareTimer FTM_SHADOW_AVATAR("Avatar Shadow");
@@ -142,21 +153,17 @@ LLMatrix4& LLDrawPoolAvatar::getModelView()
//-----------------------------------------------------------------------------
-S32 LLDrawPoolAvatar::getNumDeferredPasses()
-{
- return getNumPasses();
-}
void LLDrawPoolAvatar::beginDeferredPass(S32 pass)
{
LLFastTimer t(FTM_RENDER_CHARACTERS);
sSkipTransparent = TRUE;
-
+ is_deferred_render = true;
+
if (LLPipeline::sImpostorRender)
- {
- beginDeferredSkinned();
- return;
+ { //impostor pass does not have rigid or impostor rendering
+ pass += 2;
}
switch (pass)
@@ -170,6 +177,12 @@ void LLDrawPoolAvatar::beginDeferredPass(S32 pass)
case 2:
beginDeferredSkinned();
break;
+ case 3:
+ beginDeferredRiggedSimple();
+ break;
+ case 4:
+ beginDeferredRiggedBump();
+ break;
}
}
@@ -178,11 +191,11 @@ void LLDrawPoolAvatar::endDeferredPass(S32 pass)
LLFastTimer t(FTM_RENDER_CHARACTERS);
sSkipTransparent = FALSE;
+ is_deferred_render = false;
if (LLPipeline::sImpostorRender)
{
- endDeferredSkinned();
- return;
+ pass += 2;
}
switch (pass)
@@ -196,6 +209,12 @@ void LLDrawPoolAvatar::endDeferredPass(S32 pass)
case 2:
endDeferredSkinned();
break;
+ case 3:
+ endDeferredRiggedSimple();
+ break;
+ case 4:
+ endDeferredRiggedBump();
+ break;
}
}
@@ -206,77 +225,169 @@ void LLDrawPoolAvatar::renderDeferred(S32 pass)
S32 LLDrawPoolAvatar::getNumPostDeferredPasses()
{
- return 1;
+ return 6;
}
void LLDrawPoolAvatar::beginPostDeferredPass(S32 pass)
{
+ switch (pass)
+ {
+ case 0:
+ beginPostDeferredAlpha();
+ break;
+ case 1:
+ beginRiggedFullbright();
+ break;
+ case 2:
+ beginRiggedFullbrightShiny();
+ break;
+ case 3:
+ beginDeferredRiggedAlpha();
+ break;
+ case 4:
+ beginRiggedFullbrightAlpha();
+ break;
+ case 5:
+ beginRiggedGlow();
+ break;
+ }
+}
+
+void LLDrawPoolAvatar::beginPostDeferredAlpha()
+{
sSkipOpaque = TRUE;
sShaderLevel = mVertexShaderLevel;
sVertexProgram = &gDeferredAvatarAlphaProgram;
-
sRenderingSkinned = TRUE;
gPipeline.bindDeferredShader(*sVertexProgram);
- enable_vertex_weighting(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_WEIGHT]);
+ sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
+}
+
+void LLDrawPoolAvatar::beginDeferredRiggedAlpha()
+{
+ sVertexProgram = &gDeferredSkinnedAlphaProgram;
+ gPipeline.bindDeferredShader(*sVertexProgram);
+ sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
+ gPipeline.enableLightsDynamic();
+}
+
+void LLDrawPoolAvatar::endDeferredRiggedAlpha()
+{
+ LLVertexBuffer::unbind();
+ gPipeline.unbindDeferredShader(*sVertexProgram);
+ sDiffuseChannel = 0;
+ sVertexProgram = NULL;
}
void LLDrawPoolAvatar::endPostDeferredPass(S32 pass)
{
+ switch (pass)
+ {
+ case 0:
+ endPostDeferredAlpha();
+ break;
+ case 1:
+ endRiggedFullbright();
+ break;
+ case 2:
+ endRiggedFullbrightShiny();
+ break;
+ case 3:
+ endDeferredRiggedAlpha();
+ break;
+ case 4:
+ endRiggedFullbrightAlpha();
+ break;
+ case 5:
+ endRiggedGlow();
+ break;
+ }
+}
+
+void LLDrawPoolAvatar::endPostDeferredAlpha()
+{
// if we're in software-blending, remember to set the fence _after_ we draw so we wait till this rendering is done
sRenderingSkinned = FALSE;
sSkipOpaque = FALSE;
- disable_vertex_weighting(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_WEIGHT]);
-
+
gPipeline.unbindDeferredShader(*sVertexProgram);
-
+ sDiffuseChannel = 0;
sShaderLevel = mVertexShaderLevel;
}
void LLDrawPoolAvatar::renderPostDeferred(S32 pass)
{
- render(2); //pass 2 = skinned
+ const S32 actual_pass[] =
+ { //map post deferred pass numbers to what render() expects
+ 2, //skinned
+ 4, // rigged fullbright
+ 6, //rigged fullbright shiny
+ 7, //rigged alpha
+ 8, //rigged fullbright alpha
+ 9, //rigged glow
+ };
+
+ pass = actual_pass[pass];
+
+ if (LLPipeline::sImpostorRender)
+ { //HACK for impostors so actual pass ends up being proper pass
+ pass -= 2;
+ }
+
+ render(pass);
}
S32 LLDrawPoolAvatar::getNumShadowPasses()
{
- return 1;
+ return 2;
}
void LLDrawPoolAvatar::beginShadowPass(S32 pass)
{
LLFastTimer t(FTM_SHADOW_AVATAR);
- sVertexProgram = &gDeferredAvatarShadowProgram;
- if (sShaderLevel > 0)
+
+ if (pass == 0)
{
- gAvatarMatrixParam = sVertexProgram->mUniform[LLViewerShaderMgr::AVATAR_MATRIX];
- }
- gGL.setAlphaRejectSettings(LLRender::CF_GREATER_EQUAL, 0.2f);
-
- glColor4f(1,1,1,1);
+ sVertexProgram = &gDeferredAvatarShadowProgram;
+
+ //gGL.setAlphaRejectSettings(LLRender::CF_GREATER_EQUAL, 0.2f);
- if ((sShaderLevel > 0)) // for hardware blending
+ if ((sShaderLevel > 0)) // for hardware blending
+ {
+ sRenderingSkinned = TRUE;
+ sVertexProgram->bind();
+ }
+
+ gGL.diffuseColor4f(1,1,1,1);
+ }
+ else
{
- sRenderingSkinned = TRUE;
+ sVertexProgram = &gDeferredAttachmentShadowProgram;
+ sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
sVertexProgram->bind();
- enable_vertex_weighting(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_WEIGHT]);
}
-
}
void LLDrawPoolAvatar::endShadowPass(S32 pass)
{
LLFastTimer t(FTM_SHADOW_AVATAR);
- if (sShaderLevel > 0)
+ if (pass == 0)
{
- sRenderingSkinned = FALSE;
+ if (sShaderLevel > 0)
+ {
+ sRenderingSkinned = FALSE;
+ sVertexProgram->unbind();
+ }
+ }
+ else
+ {
+ LLVertexBuffer::unbind();
sVertexProgram->unbind();
- disable_vertex_weighting(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_WEIGHT]);
+ sVertexProgram = NULL;
}
-
- gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
}
void LLDrawPoolAvatar::renderShadow(S32 pass)
@@ -306,26 +417,53 @@ void LLDrawPoolAvatar::renderShadow(S32 pass)
return;
}
- if (sShaderLevel > 0)
+ if (pass == 0)
{
- gAvatarMatrixParam = sVertexProgram->mUniform[LLViewerShaderMgr::AVATAR_MATRIX];
+ avatarp->renderSkinned(AVATAR_RENDER_PASS_SINGLE);
+ }
+ else
+ {
+ renderRigged(avatarp, RIGGED_SIMPLE);
+ renderRigged(avatarp, RIGGED_ALPHA);
+ renderRigged(avatarp, RIGGED_FULLBRIGHT);
+ renderRigged(avatarp, RIGGED_FULLBRIGHT_SHINY);
+ renderRigged(avatarp, RIGGED_SHINY);
+ renderRigged(avatarp, RIGGED_FULLBRIGHT_ALPHA);
}
-
- avatarp->renderSkinned(AVATAR_RENDER_PASS_SINGLE);
-
}
S32 LLDrawPoolAvatar::getNumPasses()
{
- return LLPipeline::sImpostorRender ? 1 : 3;
+ if (LLPipeline::sImpostorRender)
+ {
+ return 8;
+ }
+ else
+ {
+ return 10;
+ }
}
+
+S32 LLDrawPoolAvatar::getNumDeferredPasses()
+{
+ if (LLPipeline::sImpostorRender)
+ {
+ return 3;
+ }
+ else
+ {
+ return 5;
+ }
+}
+
+
void LLDrawPoolAvatar::render(S32 pass)
{
LLFastTimer t(FTM_RENDER_CHARACTERS);
if (LLPipeline::sImpostorRender)
{
- renderAvatars(NULL, 2);
+ renderAvatars(NULL, pass+2);
return;
}
@@ -339,9 +477,8 @@ void LLDrawPoolAvatar::beginRenderPass(S32 pass)
LLVertexBuffer::unbind();
if (LLPipeline::sImpostorRender)
- {
- beginSkinned();
- return;
+ { //impostor render does not have impostors or rigid rendering
+ pass += 2;
}
switch (pass)
@@ -355,6 +492,32 @@ void LLDrawPoolAvatar::beginRenderPass(S32 pass)
case 2:
beginSkinned();
break;
+ case 3:
+ beginRiggedSimple();
+ break;
+ case 4:
+ beginRiggedFullbright();
+ break;
+ case 5:
+ beginRiggedShinySimple();
+ break;
+ case 6:
+ beginRiggedFullbrightShiny();
+ break;
+ case 7:
+ beginRiggedAlpha();
+ break;
+ case 8:
+ beginRiggedFullbrightAlpha();
+ break;
+ case 9:
+ beginRiggedGlow();
+ break;
+ }
+
+ if (pass == 0)
+ { //make sure no stale colors are left over from a previous render
+ gGL.diffuseColor4f(1,1,1,1);
}
}
@@ -364,8 +527,7 @@ void LLDrawPoolAvatar::endRenderPass(S32 pass)
if (LLPipeline::sImpostorRender)
{
- endSkinned();
- return;
+ pass += 2;
}
switch (pass)
@@ -378,6 +540,28 @@ void LLDrawPoolAvatar::endRenderPass(S32 pass)
break;
case 2:
endSkinned();
+ break;
+ case 3:
+ endRiggedSimple();
+ break;
+ case 4:
+ endRiggedFullbright();
+ break;
+ case 5:
+ endRiggedShinySimple();
+ break;
+ case 6:
+ endRiggedFullbrightShiny();
+ break;
+ case 7:
+ endRiggedAlpha();
+ break;
+ case 8:
+ endRiggedFullbrightAlpha();
+ break;
+ case 9:
+ endRiggedGlow();
+ break;
}
}
@@ -389,12 +573,22 @@ void LLDrawPoolAvatar::beginImpostor()
LLVOAvatar::sNumVisibleAvatars = 0;
}
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gImpostorProgram.bind();
+ gImpostorProgram.setMinimumAlpha(0.01f);
+ }
+
gPipeline.enableLightsFullbright(LLColor4(1,1,1,1));
- diffuse_channel = 0;
+ sDiffuseChannel = 0;
}
void LLDrawPoolAvatar::endImpostor()
{
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gImpostorProgram.unbind();
+ }
gPipeline.enableLightsDynamic();
}
@@ -404,16 +598,17 @@ void LLDrawPoolAvatar::beginRigid()
{
if (LLPipeline::sUnderWaterRender)
{
- sVertexProgram = &gObjectSimpleWaterProgram;
+ sVertexProgram = &gObjectAlphaMaskNoColorWaterProgram;
}
else
{
- sVertexProgram = &gObjectSimpleProgram;
+ sVertexProgram = &gObjectAlphaMaskNoColorProgram;
}
if (sVertexProgram != NULL)
{ //eyeballs render with the specular shader
sVertexProgram->bind();
+ sVertexProgram->setMinimumAlpha(0.2f);
}
}
else
@@ -441,11 +636,12 @@ void LLDrawPoolAvatar::beginDeferredImpostor()
sVertexProgram = &gDeferredImpostorProgram;
- normal_channel = sVertexProgram->enableTexture(LLViewerShaderMgr::DEFERRED_NORMAL);
specular_channel = sVertexProgram->enableTexture(LLViewerShaderMgr::SPECULAR_MAP);
- diffuse_channel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
+ normal_channel = sVertexProgram->enableTexture(LLViewerShaderMgr::DEFERRED_NORMAL);
+ sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
sVertexProgram->bind();
+ sVertexProgram->setMinimumAlpha(0.01f);
}
void LLDrawPoolAvatar::endDeferredImpostor()
@@ -460,14 +656,16 @@ void LLDrawPoolAvatar::endDeferredImpostor()
void LLDrawPoolAvatar::beginDeferredRigid()
{
- sVertexProgram = &gDeferredDiffuseProgram;
-
+ sVertexProgram = &gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram;
+ sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
sVertexProgram->bind();
+ sVertexProgram->setMinimumAlpha(0.2f);
}
void LLDrawPoolAvatar::endDeferredRigid()
{
sShaderLevel = mVertexShaderLevel;
+ sVertexProgram->disableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
sVertexProgram->unbind();
gGL.getTexUnit(0)->activate();
}
@@ -491,11 +689,11 @@ void LLDrawPoolAvatar::beginSkinned()
{
if (LLPipeline::sUnderWaterRender)
{
- sVertexProgram = &gObjectSimpleWaterProgram;
+ sVertexProgram = &gObjectAlphaMaskNoColorWaterProgram;
}
else
{
- sVertexProgram = &gObjectSimpleProgram;
+ sVertexProgram = &gObjectAlphaMaskNoColorProgram;
}
}
@@ -504,17 +702,6 @@ void LLDrawPoolAvatar::beginSkinned()
sRenderingSkinned = TRUE;
sVertexProgram->bind();
- if (sShaderLevel >= SHADER_LEVEL_CLOTH)
- {
- enable_cloth_weights(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_CLOTHING]);
- }
- enable_vertex_weighting(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_WEIGHT]);
-
- if (sShaderLevel >= SHADER_LEVEL_BUMP)
- {
- enable_binormals(sVertexProgram->mAttribute[LLViewerShaderMgr::BINORMAL]);
- }
-
sVertexProgram->enableTexture(LLViewerShaderMgr::BUMP_MAP);
gGL.getTexUnit(0)->activate();
}
@@ -527,6 +714,11 @@ void LLDrawPoolAvatar::beginSkinned()
sVertexProgram->bind();
}
}
+
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ sVertexProgram->setMinimumAlpha(0.2f);
+ }
}
void LLDrawPoolAvatar::endSkinned()
@@ -537,16 +729,6 @@ void LLDrawPoolAvatar::endSkinned()
sRenderingSkinned = FALSE;
sVertexProgram->disableTexture(LLViewerShaderMgr::BUMP_MAP);
gGL.getTexUnit(0)->activate();
- disable_vertex_weighting(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_WEIGHT]);
- if (sShaderLevel >= SHADER_LEVEL_BUMP)
- {
- disable_binormals(sVertexProgram->mAttribute[LLViewerShaderMgr::BINORMAL]);
- }
- if ((sShaderLevel >= SHADER_LEVEL_CLOTH))
- {
- disable_cloth_weights(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_CLOTHING]);
- }
-
sVertexProgram->unbind();
sShaderLevel = mVertexShaderLevel;
}
@@ -563,17 +745,279 @@ void LLDrawPoolAvatar::endSkinned()
gGL.getTexUnit(0)->activate();
}
+void LLDrawPoolAvatar::beginRiggedSimple()
+{
+ if (sShaderLevel > 0)
+ {
+ if (LLPipeline::sUnderWaterRender)
+ {
+ sVertexProgram = &gSkinnedObjectSimpleWaterProgram;
+ }
+ else
+ {
+ sVertexProgram = &gSkinnedObjectSimpleProgram;
+ }
+ }
+ else
+ {
+ if (LLPipeline::sUnderWaterRender)
+ {
+ sVertexProgram = &gObjectSimpleNonIndexedWaterProgram;
+ }
+ else
+ {
+ sVertexProgram = &gObjectSimpleNonIndexedProgram;
+ }
+ }
+
+ if (sShaderLevel > 0 || gPipeline.canUseVertexShaders())
+ {
+ sDiffuseChannel = 0;
+ sVertexProgram->bind();
+ }
+}
+
+void LLDrawPoolAvatar::endRiggedSimple()
+{
+ LLVertexBuffer::unbind();
+ if (sShaderLevel > 0 || gPipeline.canUseVertexShaders())
+ {
+ sVertexProgram->unbind();
+ sVertexProgram = NULL;
+ }
+}
+
+void LLDrawPoolAvatar::beginRiggedAlpha()
+{
+ beginRiggedSimple();
+}
+
+void LLDrawPoolAvatar::endRiggedAlpha()
+{
+ endRiggedSimple();
+}
+
+
+void LLDrawPoolAvatar::beginRiggedFullbrightAlpha()
+{
+ beginRiggedFullbright();
+}
+
+void LLDrawPoolAvatar::endRiggedFullbrightAlpha()
+{
+ endRiggedFullbright();
+}
+
+void LLDrawPoolAvatar::beginRiggedGlow()
+{
+ if (sShaderLevel > 0)
+ {
+ if (LLPipeline::sUnderWaterRender)
+ {
+ sVertexProgram = &gSkinnedObjectEmissiveWaterProgram;
+ }
+ else
+ {
+ sVertexProgram = &gSkinnedObjectEmissiveProgram;
+ }
+ }
+ else
+ {
+ if (LLPipeline::sUnderWaterRender)
+ {
+ sVertexProgram = &gObjectEmissiveNonIndexedWaterProgram;
+ }
+ else
+ {
+ sVertexProgram = &gObjectEmissiveNonIndexedProgram;
+ }
+ }
+
+ if (sShaderLevel > 0 || gPipeline.canUseVertexShaders())
+ {
+ sDiffuseChannel = 0;
+ sVertexProgram->bind();
+ }
+}
+
+void LLDrawPoolAvatar::endRiggedGlow()
+{
+ endRiggedFullbright();
+}
+
+void LLDrawPoolAvatar::beginRiggedFullbright()
+{
+ if (sShaderLevel > 0)
+ {
+ if (LLPipeline::sUnderWaterRender)
+ {
+ sVertexProgram = &gSkinnedObjectFullbrightWaterProgram;
+ }
+ else
+ {
+ sVertexProgram = &gSkinnedObjectFullbrightProgram;
+ }
+ }
+ else
+ {
+ if (LLPipeline::sUnderWaterRender)
+ {
+ sVertexProgram = &gObjectFullbrightNonIndexedWaterProgram;
+ }
+ else
+ {
+ sVertexProgram = &gObjectFullbrightNonIndexedProgram;
+ }
+ }
+
+ if (sShaderLevel > 0 || gPipeline.canUseVertexShaders())
+ {
+ sDiffuseChannel = 0;
+ sVertexProgram->bind();
+ }
+}
+
+void LLDrawPoolAvatar::endRiggedFullbright()
+{
+ LLVertexBuffer::unbind();
+ if (sShaderLevel > 0 || gPipeline.canUseVertexShaders())
+ {
+ sVertexProgram->unbind();
+ sVertexProgram = NULL;
+ }
+}
+
+void LLDrawPoolAvatar::beginRiggedShinySimple()
+{
+ if (sShaderLevel > 0)
+ {
+ if (LLPipeline::sUnderWaterRender)
+ {
+ sVertexProgram = &gSkinnedObjectShinySimpleWaterProgram;
+ }
+ else
+ {
+ sVertexProgram = &gSkinnedObjectShinySimpleProgram;
+ }
+ }
+ else
+ {
+ if (LLPipeline::sUnderWaterRender)
+ {
+ sVertexProgram = &gObjectShinyNonIndexedWaterProgram;
+ }
+ else
+ {
+ sVertexProgram = &gObjectShinyNonIndexedProgram;
+ }
+ }
+
+ if (sShaderLevel > 0 || gPipeline.canUseVertexShaders())
+ {
+ sVertexProgram->bind();
+ LLDrawPoolBump::bindCubeMap(sVertexProgram, 2, sDiffuseChannel, cube_channel, false);
+ }
+}
+
+void LLDrawPoolAvatar::endRiggedShinySimple()
+{
+ LLVertexBuffer::unbind();
+ if (sShaderLevel > 0 || gPipeline.canUseVertexShaders())
+ {
+ LLDrawPoolBump::unbindCubeMap(sVertexProgram, 2, sDiffuseChannel, cube_channel, false);
+ sVertexProgram->unbind();
+ sVertexProgram = NULL;
+ }
+}
+
+void LLDrawPoolAvatar::beginRiggedFullbrightShiny()
+{
+ if (sShaderLevel > 0)
+ {
+ if (LLPipeline::sUnderWaterRender)
+ {
+ sVertexProgram = &gSkinnedObjectFullbrightShinyWaterProgram;
+ }
+ else
+ {
+ sVertexProgram = &gSkinnedObjectFullbrightShinyProgram;
+ }
+ }
+ else
+ {
+ if (LLPipeline::sUnderWaterRender)
+ {
+ sVertexProgram = &gObjectFullbrightShinyNonIndexedWaterProgram;
+ }
+ else
+ {
+ sVertexProgram = &gObjectFullbrightShinyNonIndexedProgram;
+ }
+ }
+
+
+ if (sShaderLevel > 0 || gPipeline.canUseVertexShaders())
+ {
+ sVertexProgram->bind();
+ LLDrawPoolBump::bindCubeMap(sVertexProgram, 2, sDiffuseChannel, cube_channel, false);
+ }
+}
+
+void LLDrawPoolAvatar::endRiggedFullbrightShiny()
+{
+ LLVertexBuffer::unbind();
+ if (sShaderLevel > 0 || gPipeline.canUseVertexShaders())
+ {
+ LLDrawPoolBump::unbindCubeMap(sVertexProgram, 2, sDiffuseChannel, cube_channel, false);
+ sVertexProgram->unbind();
+ sVertexProgram = NULL;
+ }
+}
+
+
+void LLDrawPoolAvatar::beginDeferredRiggedSimple()
+{
+ sVertexProgram = &gDeferredSkinnedDiffuseProgram;
+ sDiffuseChannel = 0;
+ sVertexProgram->bind();
+}
+
+void LLDrawPoolAvatar::endDeferredRiggedSimple()
+{
+ LLVertexBuffer::unbind();
+ sVertexProgram->unbind();
+ sVertexProgram = NULL;
+}
+
+void LLDrawPoolAvatar::beginDeferredRiggedBump()
+{
+ sVertexProgram = &gDeferredSkinnedBumpProgram;
+ sVertexProgram->bind();
+ normal_channel = sVertexProgram->enableTexture(LLViewerShaderMgr::BUMP_MAP);
+ sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
+}
+
+void LLDrawPoolAvatar::endDeferredRiggedBump()
+{
+ LLVertexBuffer::unbind();
+ sVertexProgram->disableTexture(LLViewerShaderMgr::BUMP_MAP);
+ sVertexProgram->disableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
+ sVertexProgram->unbind();
+ normal_channel = -1;
+ sDiffuseChannel = 0;
+ sVertexProgram = NULL;
+}
+
void LLDrawPoolAvatar::beginDeferredSkinned()
{
sShaderLevel = mVertexShaderLevel;
sVertexProgram = &gDeferredAvatarProgram;
-
sRenderingSkinned = TRUE;
sVertexProgram->bind();
+ sVertexProgram->setMinimumAlpha(0.2f);
- enable_vertex_weighting(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_WEIGHT]);
-
+ sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
gGL.getTexUnit(0)->activate();
}
@@ -581,9 +1025,10 @@ void LLDrawPoolAvatar::endDeferredSkinned()
{
// if we're in software-blending, remember to set the fence _after_ we draw so we wait till this rendering is done
sRenderingSkinned = FALSE;
- disable_vertex_weighting(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_WEIGHT]);
sVertexProgram->unbind();
+ sVertexProgram->disableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
+
sShaderLevel = mVertexShaderLevel;
gGL.getTexUnit(0)->activate();
@@ -668,8 +1113,6 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
return;
}
- LLOverrideFaceColor color(this, 1.0f, 1.0f, 1.0f, 1.0f);
-
if (pass == 0)
{
if (!LLPipeline::sReflectionRender)
@@ -679,7 +1122,7 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
if (impostor)
{
- if (LLPipeline::sRenderDeferred && avatarp->mImpostor.isComplete())
+ if (LLPipeline::sRenderDeferred && !LLPipeline::sReflectionRender && avatarp->mImpostor.isComplete())
{
if (normal_channel > -1)
{
@@ -690,15 +1133,17 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
avatarp->mImpostor.bindTexture(1, specular_channel);
}
}
- avatarp->renderImpostor(LLColor4U(255,255,255,255), diffuse_channel);
+ avatarp->renderImpostor(LLColor4U(255,255,255,255), sDiffuseChannel);
}
return;
}
- if (single_avatar && avatarp->mSpecialRenderMode >= 1) // 1=anim preview, 2=image preview, 3=morph view
+ llassert(LLPipeline::sImpostorRender || !avatarp->isVisuallyMuted());
+
+ /*if (single_avatar && avatarp->mSpecialRenderMode >= 1) // 1=anim preview, 2=image preview, 3=morph view
{
gPipeline.enableLightsAvatarEdit(LLColor4(.5f, .5f, .5f, 1.f));
- }
+ }*/
if (pass == 1)
{
@@ -706,12 +1151,89 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
avatarp->renderRigid();
return;
}
-
- if (sShaderLevel > 0)
+
+ if (pass == 3)
{
- gAvatarMatrixParam = sVertexProgram->mUniform[LLViewerShaderMgr::AVATAR_MATRIX];
+ if (is_deferred_render)
+ {
+ renderDeferredRiggedSimple(avatarp);
+ }
+ else
+ {
+ renderRiggedSimple(avatarp);
+ }
+ return;
}
-
+
+ if (pass == 4)
+ {
+ if (is_deferred_render)
+ {
+ renderDeferredRiggedBump(avatarp);
+ }
+ else
+ {
+ renderRiggedFullbright(avatarp);
+ }
+
+ return;
+ }
+
+ if (pass == 5)
+ {
+ renderRiggedShinySimple(avatarp);
+ return;
+ }
+
+ if (pass == 6)
+ {
+ renderRiggedFullbrightShiny(avatarp);
+ return;
+ }
+
+ if (pass >= 7 && pass < 9)
+ {
+ LLGLEnable blend(GL_BLEND);
+
+ gGL.setColorMask(true, true);
+ gGL.blendFunc(LLRender::BF_SOURCE_ALPHA,
+ LLRender::BF_ONE_MINUS_SOURCE_ALPHA,
+ LLRender::BF_ZERO,
+ LLRender::BF_ONE_MINUS_SOURCE_ALPHA);
+
+
+ if (pass == 7)
+ {
+ renderRiggedAlpha(avatarp);
+ return;
+ }
+
+ if (pass == 8)
+ {
+ renderRiggedFullbrightAlpha(avatarp);
+ return;
+ }
+ }
+
+ if (pass == 9)
+ {
+ LLGLEnable blend(GL_BLEND);
+ LLGLDisable test(GL_ALPHA_TEST);
+ gGL.flush();
+
+ LLGLEnable polyOffset(GL_POLYGON_OFFSET_FILL);
+ glPolygonOffset(-1.0f, -1.0f);
+ gGL.setSceneBlendType(LLRender::BT_ADD);
+
+ LLGLDepthTest depth(GL_TRUE, GL_FALSE);
+ gGL.setColorMask(false, true);
+
+ renderRiggedGlow(avatarp);
+ gGL.setColorMask(true, false);
+ gGL.setSceneBlendType(LLRender::BT_ALPHA);
+ return;
+ }
+
if ((sShaderLevel >= SHADER_LEVEL_CLOTH))
{
LLMatrix4 rot_mat;
@@ -725,16 +1247,16 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
wind = wind * rot_mat;
wind.mV[VW] = avatarp->mWindVec.mV[VW];
- sVertexProgram->vertexAttrib4fv(LLViewerShaderMgr::AVATAR_WIND, wind.mV);
+ sVertexProgram->uniform4fv(LLViewerShaderMgr::AVATAR_WIND, 1, wind.mV);
F32 phase = -1.f * (avatarp->mRipplePhase);
F32 freq = 7.f + (noise1(avatarp->mRipplePhase) * 2.f);
LLVector4 sin_params(freq, freq, freq, phase);
- sVertexProgram->vertexAttrib4fv(LLViewerShaderMgr::AVATAR_SINWAVE, sin_params.mV);
+ sVertexProgram->uniform4fv(LLViewerShaderMgr::AVATAR_SINWAVE, 1, sin_params.mV);
LLVector4 gravity(0.f, 0.f, -CLOTHING_GRAVITY_EFFECT, 0.f);
gravity = gravity * rot_mat;
- sVertexProgram->vertexAttrib4fv(LLViewerShaderMgr::AVATAR_GRAVITY, gravity.mV);
+ sVertexProgram->uniform4fv(LLViewerShaderMgr::AVATAR_GRAVITY, 1, gravity.mV);
}
if( !single_avatar || (avatarp == single_avatar) )
@@ -743,6 +1265,385 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
}
}
+void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(LLVOAvatar* avatar, LLFace* face, const LLMeshSkinInfo* skin, LLVolume* volume, const LLVolumeFace& vol_face)
+{
+ LLVector4a* weight = vol_face.mWeights;
+ if (!weight)
+ {
+ return;
+ }
+
+ LLPointer<LLVertexBuffer> buffer = face->getVertexBuffer();
+ LLDrawable* drawable = face->getDrawable();
+
+ U32 data_mask = face->getRiggedVertexBufferDataMask();
+
+ if (buffer.isNull() ||
+ buffer->getTypeMask() != data_mask ||
+ buffer->getNumVerts() != vol_face.mNumVertices ||
+ buffer->getNumIndices() != vol_face.mNumIndices ||
+ (drawable && drawable->isState(LLDrawable::REBUILD_ALL)))
+ {
+ face->setGeomIndex(0);
+ face->setIndicesIndex(0);
+
+ if (buffer.isNull() || buffer->getTypeMask() != data_mask || !buffer->isWriteable())
+ { //make a new buffer
+ if (sShaderLevel > 0)
+ {
+ buffer = new LLVertexBuffer(data_mask, GL_DYNAMIC_DRAW_ARB);
+ }
+ else
+ {
+ buffer = new LLVertexBuffer(data_mask, GL_STREAM_DRAW_ARB);
+ }
+ buffer->allocateBuffer(vol_face.mNumVertices, vol_face.mNumIndices, true);
+ }
+ else
+ { //resize existing buffer
+ buffer->resizeBuffer(vol_face.mNumVertices, vol_face.mNumIndices);
+ }
+
+ face->setSize(vol_face.mNumVertices, vol_face.mNumIndices);
+ face->setVertexBuffer(buffer);
+
+ U16 offset = 0;
+
+ LLMatrix4 mat_vert = skin->mBindShapeMatrix;
+ glh::matrix4f m((F32*) mat_vert.mMatrix);
+ m = m.inverse().transpose();
+
+ F32 mat3[] =
+ { m.m[0], m.m[1], m.m[2],
+ m.m[4], m.m[5], m.m[6],
+ m.m[8], m.m[9], m.m[10] };
+
+ LLMatrix3 mat_normal(mat3);
+
+ //let getGeometryVolume know if alpha should override shiny
+ U32 type = gPipeline.getPoolTypeFromTE(face->getTextureEntry(), face->getTexture());
+
+ if (type == LLDrawPool::POOL_ALPHA)
+ {
+ face->setPoolType(LLDrawPool::POOL_ALPHA);
+ }
+ else
+ {
+ face->setPoolType(LLDrawPool::POOL_AVATAR);
+ }
+
+ face->getGeometryVolume(*volume, face->getTEOffset(), mat_vert, mat_normal, offset, true);
+
+ buffer->flush();
+ }
+
+ if (sShaderLevel <= 0 && face->mLastSkinTime < avatar->getLastSkinTime())
+ { //perform software vertex skinning for this face
+ LLStrider<LLVector3> position;
+ LLStrider<LLVector3> normal;
+
+ bool has_normal = buffer->hasDataType(LLVertexBuffer::TYPE_NORMAL);
+ buffer->getVertexStrider(position);
+
+ if (has_normal)
+ {
+ buffer->getNormalStrider(normal);
+ }
+
+ LLVector4a* pos = (LLVector4a*) position.get();
+
+ LLVector4a* norm = has_normal ? (LLVector4a*) normal.get() : NULL;
+
+ //build matrix palette
+ LLMatrix4a mp[64];
+ LLMatrix4* mat = (LLMatrix4*) mp;
+
+ for (U32 j = 0; j < skin->mJointNames.size(); ++j)
+ {
+ LLJoint* joint = avatar->getJoint(skin->mJointNames[j]);
+ if (joint)
+ {
+ mat[j] = skin->mInvBindMatrix[j];
+ mat[j] *= joint->getWorldMatrix();
+ }
+ }
+
+ LLMatrix4a bind_shape_matrix;
+ bind_shape_matrix.loadu(skin->mBindShapeMatrix);
+
+ for (U32 j = 0; j < buffer->getNumVerts(); ++j)
+ {
+ LLMatrix4a final_mat;
+ final_mat.clear();
+
+ S32 idx[4];
+
+ LLVector4 wght;
+
+ F32 scale = 0.f;
+ for (U32 k = 0; k < 4; k++)
+ {
+ F32 w = weight[j][k];
+
+ idx[k] = llclamp((S32) floorf(w), 0, 63);
+ wght[k] = w - floorf(w);
+ scale += wght[k];
+ }
+
+ wght *= 1.f/scale;
+
+ for (U32 k = 0; k < 4; k++)
+ {
+ F32 w = wght[k];
+
+ LLMatrix4a src;
+ src.setMul(mp[idx[k]], w);
+
+ final_mat.add(src);
+ }
+
+
+ LLVector4a& v = vol_face.mPositions[j];
+ LLVector4a t;
+ LLVector4a dst;
+ bind_shape_matrix.affineTransform(v, t);
+ final_mat.affineTransform(t, dst);
+ pos[j] = dst;
+
+ if (norm)
+ {
+ LLVector4a& n = vol_face.mNormals[j];
+ bind_shape_matrix.rotate(n, t);
+ final_mat.rotate(t, dst);
+ norm[j] = dst;
+ }
+ }
+ }
+
+ if (drawable && (face->getTEOffset() == drawable->getNumFaces()-1))
+ {
+ drawable->clearState(LLDrawable::REBUILD_ALL);
+ }
+}
+
+void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow)
+{
+ if (avatar->isSelf() && !gAgent.needsRenderAvatar() || !gMeshRepo.meshRezEnabled())
+ {
+ return;
+ }
+
+ stop_glerror();
+
+ for (U32 i = 0; i < mRiggedFace[type].size(); ++i)
+ {
+ LLFace* face = mRiggedFace[type][i];
+ LLDrawable* drawable = face->getDrawable();
+ if (!drawable)
+ {
+ continue;
+ }
+
+ LLVOVolume* vobj = drawable->getVOVolume();
+
+ if (!vobj)
+ {
+ continue;
+ }
+
+ LLVolume* volume = vobj->getVolume();
+ S32 te = face->getTEOffset();
+
+ if (!volume || volume->getNumVolumeFaces() <= te || !volume->isMeshAssetLoaded())
+ {
+ continue;
+ }
+
+ LLUUID mesh_id = volume->getParams().getSculptID();
+ if (mesh_id.isNull())
+ {
+ continue;
+ }
+
+ const LLMeshSkinInfo* skin = gMeshRepo.getSkinInfo(mesh_id, vobj);
+ if (!skin)
+ {
+ continue;
+ }
+
+ //stop_glerror();
+
+ //const LLVolumeFace& vol_face = volume->getVolumeFace(te);
+ //updateRiggedFaceVertexBuffer(avatar, face, skin, volume, vol_face);
+
+ //stop_glerror();
+
+ U32 data_mask = LLFace::getRiggedDataMask(type);
+
+ LLVertexBuffer* buff = face->getVertexBuffer();
+
+ if (buff)
+ {
+ if (sShaderLevel > 0)
+ { //upload matrix palette to shader
+ LLMatrix4 mat[64];
+
+ for (U32 i = 0; i < skin->mJointNames.size(); ++i)
+ {
+ LLJoint* joint = avatar->getJoint(skin->mJointNames[i]);
+ if (joint)
+ {
+ mat[i] = skin->mInvBindMatrix[i];
+ mat[i] *= joint->getWorldMatrix();
+ }
+ }
+
+ stop_glerror();
+
+ LLDrawPoolAvatar::sVertexProgram->uniformMatrix4fv("matrixPalette",
+ skin->mJointNames.size(),
+ FALSE,
+ (GLfloat*) mat[0].mMatrix);
+
+ stop_glerror();
+ }
+ else
+ {
+ data_mask &= ~LLVertexBuffer::MAP_WEIGHT4;
+ }
+
+ U16 start = face->getGeomStart();
+ U16 end = start + face->getGeomCount()-1;
+ S32 offset = face->getIndicesStart();
+ U32 count = face->getIndicesCount();
+
+ /*if (glow)
+ {
+ gGL.diffuseColor4f(0,0,0,face->getTextureEntry()->getGlow());
+ }*/
+
+ gGL.getTexUnit(sDiffuseChannel)->bind(face->getTexture());
+ if (normal_channel > -1)
+ {
+ LLDrawPoolBump::bindBumpMap(face, normal_channel);
+ }
+
+ if (face->mTextureMatrix)
+ {
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.loadMatrix((F32*) face->mTextureMatrix->mMatrix);
+ buff->setBuffer(data_mask);
+ buff->drawRange(LLRender::TRIANGLES, start, end, count, offset);
+ gGL.loadIdentity();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ }
+ else
+ {
+ buff->setBuffer(data_mask);
+ buff->drawRange(LLRender::TRIANGLES, start, end, count, offset);
+ }
+ }
+ }
+}
+
+void LLDrawPoolAvatar::renderDeferredRiggedSimple(LLVOAvatar* avatar)
+{
+ updateRiggedVertexBuffers(avatar);
+ renderRigged(avatar, RIGGED_DEFERRED_SIMPLE);
+}
+
+void LLDrawPoolAvatar::renderDeferredRiggedBump(LLVOAvatar* avatar)
+{
+ renderRigged(avatar, RIGGED_DEFERRED_BUMP);
+}
+
+void LLDrawPoolAvatar::updateRiggedVertexBuffers(LLVOAvatar* avatar)
+{
+ //update rigged vertex buffers
+ for (U32 type = 0; type < NUM_RIGGED_PASSES; ++type)
+ {
+ for (U32 i = 0; i < mRiggedFace[type].size(); ++i)
+ {
+ LLFace* face = mRiggedFace[type][i];
+ LLDrawable* drawable = face->getDrawable();
+ if (!drawable)
+ {
+ continue;
+ }
+
+ LLVOVolume* vobj = drawable->getVOVolume();
+
+ if (!vobj)
+ {
+ continue;
+ }
+
+ LLVolume* volume = vobj->getVolume();
+ S32 te = face->getTEOffset();
+
+ if (!volume || volume->getNumVolumeFaces() <= te)
+ {
+ continue;
+ }
+
+ LLUUID mesh_id = volume->getParams().getSculptID();
+ if (mesh_id.isNull())
+ {
+ continue;
+ }
+
+ const LLMeshSkinInfo* skin = gMeshRepo.getSkinInfo(mesh_id, vobj);
+ if (!skin)
+ {
+ continue;
+ }
+
+ stop_glerror();
+
+ const LLVolumeFace& vol_face = volume->getVolumeFace(te);
+ updateRiggedFaceVertexBuffer(avatar, face, skin, volume, vol_face);
+ }
+ }
+}
+
+void LLDrawPoolAvatar::renderRiggedSimple(LLVOAvatar* avatar)
+{
+ updateRiggedVertexBuffers(avatar);
+ renderRigged(avatar, RIGGED_SIMPLE);
+}
+
+void LLDrawPoolAvatar::renderRiggedFullbright(LLVOAvatar* avatar)
+{
+ renderRigged(avatar, RIGGED_FULLBRIGHT);
+}
+
+
+void LLDrawPoolAvatar::renderRiggedShinySimple(LLVOAvatar* avatar)
+{
+ renderRigged(avatar, RIGGED_SHINY);
+}
+
+void LLDrawPoolAvatar::renderRiggedFullbrightShiny(LLVOAvatar* avatar)
+{
+ renderRigged(avatar, RIGGED_FULLBRIGHT_SHINY);
+}
+
+void LLDrawPoolAvatar::renderRiggedAlpha(LLVOAvatar* avatar)
+{
+ renderRigged(avatar, RIGGED_ALPHA);
+}
+
+void LLDrawPoolAvatar::renderRiggedFullbrightAlpha(LLVOAvatar* avatar)
+{
+ renderRigged(avatar, RIGGED_FULLBRIGHT_ALPHA);
+}
+
+void LLDrawPoolAvatar::renderRiggedGlow(LLVOAvatar* avatar)
+{
+ renderRigged(avatar, RIGGED_GLOW, true);
+}
+
+
//-----------------------------------------------------------------------------
// getDebugTexture()
@@ -770,39 +1671,55 @@ LLColor3 LLDrawPoolAvatar::getDebugColor() const
return LLColor3(0.f, 1.f, 0.f);
}
-LLVertexBufferAvatar::LLVertexBufferAvatar()
-: LLVertexBuffer(sDataMask,
- GL_STREAM_DRAW_ARB) //avatars are always stream draw due to morph targets
+void LLDrawPoolAvatar::addRiggedFace(LLFace* facep, U32 type)
{
+ if (type >= NUM_RIGGED_PASSES)
+ {
+ llerrs << "Invalid rigged face type." << llendl;
+ }
+ if (facep->getRiggedIndex(type) != -1)
+ {
+ llerrs << "Tried to add a rigged face that's referenced elsewhere." << llendl;
+ }
+
+ facep->setRiggedIndex(type, mRiggedFace[type].size());
+ facep->setPool(this);
+ mRiggedFace[type].push_back(facep);
}
-
-void LLVertexBufferAvatar::setupVertexBuffer(U32 data_mask) const
+void LLDrawPoolAvatar::removeRiggedFace(LLFace* facep)
{
- if (sRenderingSkinned)
- {
- U8* base = useVBOs() ? NULL : mMappedData;
+ facep->setPool(NULL);
- glVertexPointer(3,GL_FLOAT, mStride, (void*)(base + 0));
- glNormalPointer(GL_FLOAT, mStride, (void*)(base + mOffsets[TYPE_NORMAL]));
- glTexCoordPointer(2,GL_FLOAT, mStride, (void*)(base + mOffsets[TYPE_TEXCOORD0]));
+ for (U32 i = 0; i < NUM_RIGGED_PASSES; ++i)
+ {
+ S32 index = facep->getRiggedIndex(i);
- set_vertex_weights(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_WEIGHT], mStride, (F32*)(base + mOffsets[TYPE_WEIGHT]));
-
- if (sShaderLevel >= LLDrawPoolAvatar::SHADER_LEVEL_BUMP)
+ if (index > -1)
{
- set_binormals(sVertexProgram->mAttribute[LLViewerShaderMgr::BINORMAL], mStride, (LLVector3*)(base + mOffsets[TYPE_BINORMAL]));
- }
-
- if (sShaderLevel >= LLDrawPoolAvatar::SHADER_LEVEL_CLOTH)
- {
- set_vertex_clothing_weights(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_CLOTHING], mStride, (LLVector4*)(base + mOffsets[TYPE_CLOTHWEIGHT]));
+ if (mRiggedFace[i].size() > index && mRiggedFace[i][index] == facep)
+ {
+ facep->setRiggedIndex(i,-1);
+ mRiggedFace[i].erase(mRiggedFace[i].begin()+index);
+ for (U32 j = index; j < mRiggedFace[i].size(); ++j)
+ { //bump indexes down for faces referenced after erased face
+ mRiggedFace[i][j]->setRiggedIndex(i, j);
+ }
+ }
+ else
+ {
+ llerrs << "Face reference data corrupt for rigged type " << i << llendl;
+ }
}
}
- else
- {
- LLVertexBuffer::setupVertexBuffer(data_mask);
- }
}
+LLVertexBufferAvatar::LLVertexBufferAvatar()
+: LLVertexBuffer(sDataMask,
+ GL_STREAM_DRAW_ARB) //avatars are always stream draw due to morph targets
+{
+
+}
+
+
diff --git a/indra/newview/lldrawpoolavatar.h b/indra/newview/lldrawpoolavatar.h
index f536d3c911..69e3068858 100644
--- a/indra/newview/lldrawpoolavatar.h
+++ b/indra/newview/lldrawpoolavatar.h
@@ -1,4 +1,4 @@
-/**
+ /**
* @file lldrawpoolavatar.h
* @brief LLDrawPoolAvatar class definition
*
@@ -30,6 +30,12 @@
#include "lldrawpool.h"
class LLVOAvatar;
+class LLGLSLShader;
+class LLFace;
+class LLMeshSkinInfo;
+class LLVolume;
+class LLVolumeFace;
+
class LLDrawPoolAvatar : public LLFacePool
{
@@ -83,7 +89,7 @@ public:
void beginRigid();
void beginImpostor();
void beginSkinned();
-
+
void endRigid();
void endImpostor();
void endSkinned();
@@ -95,21 +101,121 @@ public:
void endDeferredImpostor();
void endDeferredRigid();
void endDeferredSkinned();
+
+ void beginPostDeferredAlpha();
+ void endPostDeferredAlpha();
+
+ void beginRiggedSimple();
+ void beginRiggedFullbright();
+ void beginRiggedFullbrightShiny();
+ void beginRiggedShinySimple();
+ void beginRiggedAlpha();
+ void beginRiggedFullbrightAlpha();
+ void beginRiggedGlow();
+ void beginDeferredRiggedAlpha();
+
+ void endRiggedSimple();
+ void endRiggedFullbright();
+ void endRiggedFullbrightShiny();
+ void endRiggedShinySimple();
+ void endRiggedAlpha();
+ void endRiggedFullbrightAlpha();
+ void endRiggedGlow();
+ void endDeferredRiggedAlpha();
+
+ void beginDeferredRiggedSimple();
+ void beginDeferredRiggedBump();
+
+ void endDeferredRiggedSimple();
+ void endDeferredRiggedBump();
+ void updateRiggedFaceVertexBuffer(LLVOAvatar* avatar,
+ LLFace* facep,
+ const LLMeshSkinInfo* skin,
+ LLVolume* volume,
+ const LLVolumeFace& vol_face);
+ void updateRiggedVertexBuffers(LLVOAvatar* avatar);
+
+ void renderRigged(LLVOAvatar* avatar, U32 type, bool glow = false);
+ void renderRiggedSimple(LLVOAvatar* avatar);
+ void renderRiggedAlpha(LLVOAvatar* avatar);
+ void renderRiggedFullbrightAlpha(LLVOAvatar* avatar);
+ void renderRiggedFullbright(LLVOAvatar* avatar);
+ void renderRiggedShinySimple(LLVOAvatar* avatar);
+ void renderRiggedFullbrightShiny(LLVOAvatar* avatar);
+ void renderRiggedGlow(LLVOAvatar* avatar);
+ void renderDeferredRiggedSimple(LLVOAvatar* avatar);
+ void renderDeferredRiggedBump(LLVOAvatar* avatar);
+
+ typedef enum
+ {
+ RIGGED_SIMPLE = 0,
+ RIGGED_FULLBRIGHT,
+ RIGGED_SHINY,
+ RIGGED_FULLBRIGHT_SHINY,
+ RIGGED_GLOW,
+ RIGGED_ALPHA,
+ RIGGED_FULLBRIGHT_ALPHA,
+ RIGGED_DEFERRED_BUMP,
+ RIGGED_DEFERRED_SIMPLE,
+ NUM_RIGGED_PASSES,
+ RIGGED_UNKNOWN,
+ } eRiggedPass;
+
+ typedef enum
+ {
+ RIGGED_SIMPLE_MASK = LLVertexBuffer::MAP_VERTEX |
+ LLVertexBuffer::MAP_NORMAL |
+ LLVertexBuffer::MAP_TEXCOORD0 |
+ LLVertexBuffer::MAP_COLOR |
+ LLVertexBuffer::MAP_WEIGHT4,
+ RIGGED_FULLBRIGHT_MASK = LLVertexBuffer::MAP_VERTEX |
+ LLVertexBuffer::MAP_TEXCOORD0 |
+ LLVertexBuffer::MAP_COLOR |
+ LLVertexBuffer::MAP_WEIGHT4,
+ RIGGED_SHINY_MASK = RIGGED_SIMPLE_MASK,
+ RIGGED_FULLBRIGHT_SHINY_MASK = RIGGED_SIMPLE_MASK,
+ RIGGED_GLOW_MASK = LLVertexBuffer::MAP_VERTEX |
+ LLVertexBuffer::MAP_TEXCOORD0 |
+ LLVertexBuffer::MAP_EMISSIVE |
+ LLVertexBuffer::MAP_WEIGHT4,
+ RIGGED_ALPHA_MASK = RIGGED_SIMPLE_MASK,
+ RIGGED_FULLBRIGHT_ALPHA_MASK = RIGGED_FULLBRIGHT_MASK,
+ RIGGED_DEFERRED_BUMP_MASK = LLVertexBuffer::MAP_VERTEX |
+ LLVertexBuffer::MAP_NORMAL |
+ LLVertexBuffer::MAP_TEXCOORD0 |
+ LLVertexBuffer::MAP_BINORMAL |
+ LLVertexBuffer::MAP_COLOR |
+ LLVertexBuffer::MAP_WEIGHT4,
+ RIGGED_DEFERRED_SIMPLE_MASK = LLVertexBuffer::MAP_VERTEX |
+ LLVertexBuffer::MAP_NORMAL |
+ LLVertexBuffer::MAP_TEXCOORD0 |
+ LLVertexBuffer::MAP_COLOR |
+ LLVertexBuffer::MAP_WEIGHT4,
+ } eRiggedDataMask;
+
+ void addRiggedFace(LLFace* facep, U32 type);
+ void removeRiggedFace(LLFace* facep);
+
+ std::vector<LLFace*> mRiggedFace[NUM_RIGGED_PASSES];
+
/*virtual*/ LLViewerTexture *getDebugTexture();
/*virtual*/ LLColor3 getDebugColor() const; // For AGP debug display
void renderAvatars(LLVOAvatar *single_avatar, S32 pass = -1); // renders only one avatar if single_avatar is not null.
+
static BOOL sSkipOpaque;
static BOOL sSkipTransparent;
+ static S32 sDiffuseChannel;
+
+ static LLGLSLShader* sVertexProgram;
};
class LLVertexBufferAvatar : public LLVertexBuffer
{
public:
LLVertexBufferAvatar();
- virtual void setupVertexBuffer(U32 data_mask) const;
};
extern S32 AVATAR_OFFSET_POS;
diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp
index 223e4a438c..b58efe62ab 100644
--- a/indra/newview/lldrawpoolbump.cpp
+++ b/indra/newview/lldrawpoolbump.cpp
@@ -94,6 +94,13 @@ void LLStandardBumpmap::restoreGL()
// static
void LLStandardBumpmap::addstandard()
{
+ if(!gTextureList.isInitialized())
+ {
+ //Note: loading pre-configuration sometimes triggers this call.
+ //But it is safe to return here because bump images will be reloaded during initialization later.
+ return ;
+ }
+
// can't assert; we destroyGL and restoreGL a lot during *first* startup, which populates this list already, THEN we explicitly init the list as part of *normal* startup. Sigh. So clear the list every time before we (re-)add the standard bumpmaps.
//llassert( LLStandardBumpmap::sStandardBumpmapCount == 0 );
clear();
@@ -145,14 +152,10 @@ void LLStandardBumpmap::addstandard()
// llinfos << "Loading bumpmap: " << bump_image_id << " from viewerart" << llendl;
gStandardBumpmapList[LLStandardBumpmap::sStandardBumpmapCount].mLabel = label;
gStandardBumpmapList[LLStandardBumpmap::sStandardBumpmapCount].mImage =
- LLViewerTextureManager::getFetchedTexture(LLUUID(bump_image_id),
- TRUE,
- LLViewerTexture::BOOST_NONE,
- LLViewerTexture::LOD_TEXTURE,
- 0,
- 0);
+ LLViewerTextureManager::getFetchedTexture(LLUUID(bump_image_id));
gStandardBumpmapList[LLStandardBumpmap::sStandardBumpmapCount].mImage->setBoostLevel(LLViewerTexture::BOOST_BUMP) ;
gStandardBumpmapList[LLStandardBumpmap::sStandardBumpmapCount].mImage->setLoadedCallback(LLBumpImageList::onSourceStandardLoaded, 0, TRUE, FALSE, NULL, NULL );
+ gStandardBumpmapList[LLStandardBumpmap::sStandardBumpmapCount].mImage->forceToSaveRawImage(0) ;
LLStandardBumpmap::sStandardBumpmapCount++;
}
@@ -314,6 +317,9 @@ void LLDrawPoolBump::endRenderPass(S32 pass)
llassert(0);
break;
}
+
+ //to cleanup texture channels
+ LLRenderPass::endRenderPass(pass);
}
//static
@@ -334,30 +340,48 @@ void LLDrawPoolBump::beginShiny(bool invisible)
sVertexMask = VERTEX_MASK_SHINY | LLVertexBuffer::MAP_TEXCOORD0;
}
- if (LLPipeline::sUnderWaterRender)
+ if (getVertexShaderLevel() > 0)
{
- shader = &gObjectShinyWaterProgram;
+ if (LLPipeline::sUnderWaterRender)
+ {
+ shader = &gObjectShinyWaterProgram;
+ }
+ else
+ {
+ shader = &gObjectShinyProgram;
+ }
+ shader->bind();
}
else
{
- shader = &gObjectShinyProgram;
+ shader = NULL;
}
+ bindCubeMap(shader, mVertexShaderLevel, diffuse_channel, cube_channel, invisible);
+
+ if (mVertexShaderLevel > 1)
+ { //indexed texture rendering, channel 0 is always diffuse
+ diffuse_channel = 0;
+ }
+}
+
+//static
+void LLDrawPoolBump::bindCubeMap(LLGLSLShader* shader, S32 shader_level, S32& diffuse_channel, S32& cube_channel, bool invisible)
+{
LLCubeMap* cube_map = gSky.mVOSkyp ? gSky.mVOSkyp->getCubeMap() : NULL;
if( cube_map )
{
- if (!invisible && LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_OBJECT) > 0 )
+ if (!invisible && shader )
{
LLMatrix4 mat;
mat.initRows(LLVector4(gGLModelView+0),
LLVector4(gGLModelView+4),
LLVector4(gGLModelView+8),
LLVector4(gGLModelView+12));
- shader->bind();
LLVector3 vec = LLVector3(gShinyOrigin) * mat;
LLVector4 vec4(vec, gShinyOrigin.mV[3]);
shader->uniform4fv(LLViewerShaderMgr::SHINY_ORIGIN, 1, vec4.mV);
- if (mVertexShaderLevel > 1)
+ if (shader_level > 1)
{
cube_map->setMatrix(1);
// Make sure that texture coord generation happens for tex unit 1, as that's the one we use for
@@ -406,35 +430,29 @@ void LLDrawPoolBump::renderShiny(bool invisible)
LLGLEnable blend_enable(GL_BLEND);
if (!invisible && mVertexShaderLevel > 1)
{
- LLRenderPass::renderTexture(LLRenderPass::PASS_SHINY, sVertexMask);
+ LLRenderPass::pushBatches(LLRenderPass::PASS_SHINY, sVertexMask | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE);
}
else if (!invisible)
{
renderGroups(LLRenderPass::PASS_SHINY, sVertexMask);
}
- else // invisible
- {
- renderGroups(LLRenderPass::PASS_INVISI_SHINY, sVertexMask);
- }
+ //else // invisible (deprecated)
+ //{
+ //renderGroups(LLRenderPass::PASS_INVISI_SHINY, sVertexMask);
+ //}
}
}
-void LLDrawPoolBump::endShiny(bool invisible)
+//static
+void LLDrawPoolBump::unbindCubeMap(LLGLSLShader* shader, S32 shader_level, S32& diffuse_channel, S32& cube_channel, bool invisible)
{
- LLFastTimer t(FTM_RENDER_SHINY);
- if ((!invisible && !gPipeline.hasRenderBatches(LLRenderPass::PASS_SHINY))||
- (invisible && !gPipeline.hasRenderBatches(LLRenderPass::PASS_INVISI_SHINY)))
- {
- return;
- }
-
LLCubeMap* cube_map = gSky.mVOSkyp ? gSky.mVOSkyp->getCubeMap() : NULL;
if( cube_map )
{
cube_map->disable();
cube_map->restoreMatrix();
- if (!invisible && mVertexShaderLevel > 1)
+ if (!invisible && shader_level > 1)
{
shader->disableTexture(LLViewerShaderMgr::ENVIRONMENT_MAP, LLTexUnit::TT_CUBE_MAP);
@@ -445,14 +463,33 @@ void LLDrawPoolBump::endShiny(bool invisible)
shader->disableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
}
}
- shader->unbind();
}
}
- gGL.getTexUnit(diffuse_channel)->disable();
- gGL.getTexUnit(cube_channel)->disable();
- gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ gGL.getTexUnit(diffuse_channel)->disable();
+ gGL.getTexUnit(cube_channel)->disable();
+
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+ gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
+ }
+}
+
+void LLDrawPoolBump::endShiny(bool invisible)
+{
+ LLFastTimer t(FTM_RENDER_SHINY);
+ if ((!invisible && !gPipeline.hasRenderBatches(LLRenderPass::PASS_SHINY))||
+ (invisible && !gPipeline.hasRenderBatches(LLRenderPass::PASS_INVISI_SHINY)))
+ {
+ return;
+ }
+
+ unbindCubeMap(shader, mVertexShaderLevel, diffuse_channel, cube_channel, invisible);
+ if (shader)
+ {
+ shader->unbind();
+ }
diffuse_channel = -1;
cube_channel = 0;
@@ -473,7 +510,7 @@ void LLDrawPoolBump::beginFullbrightShiny()
if (LLPipeline::sUnderWaterRender)
{
- shader = &gObjectShinyWaterProgram;
+ shader = &gObjectFullbrightShinyWaterProgram;
}
else
{
@@ -505,6 +542,12 @@ void LLDrawPoolBump::beginFullbrightShiny()
gGL.getTexUnit(cube_channel)->bind(cube_map);
gGL.getTexUnit(0)->activate();
}
+
+ if (mVertexShaderLevel > 1)
+ { //indexed texture rendering, channel 0 is always diffuse
+ diffuse_channel = 0;
+ }
+
mShiny = TRUE;
}
@@ -519,7 +562,15 @@ void LLDrawPoolBump::renderFullbrightShiny()
if( gSky.mVOSkyp->getCubeMap() )
{
LLGLEnable blend_enable(GL_BLEND);
- LLRenderPass::renderTexture(LLRenderPass::PASS_FULLBRIGHT_SHINY, sVertexMask);
+
+ if (mVertexShaderLevel > 1)
+ {
+ LLRenderPass::pushBatches(LLRenderPass::PASS_FULLBRIGHT_SHINY, sVertexMask | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE);
+ }
+ else
+ {
+ LLRenderPass::renderTexture(LLRenderPass::PASS_FULLBRIGHT_SHINY, sVertexMask);
+ }
}
}
@@ -537,19 +588,19 @@ void LLDrawPoolBump::endFullbrightShiny()
cube_map->disable();
cube_map->restoreMatrix();
- if (diffuse_channel != 0)
+ /*if (diffuse_channel != 0)
{
shader->disableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
}
gGL.getTexUnit(0)->activate();
- gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);
+ gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);*/
shader->unbind();
- gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
+ //gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
}
- gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
+ //gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+ //gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
diffuse_channel = -1;
cube_channel = 0;
@@ -580,18 +631,37 @@ void LLDrawPoolBump::renderGroup(LLSpatialGroup* group, U32 type, U32 mask, BOOL
// static
BOOL LLDrawPoolBump::bindBumpMap(LLDrawInfo& params, S32 channel)
{
- LLViewerTexture* bump = NULL;
-
U8 bump_code = params.mBump;
+ return bindBumpMap(bump_code, params.mTexture, params.mVSize, channel);
+}
+
+//static
+BOOL LLDrawPoolBump::bindBumpMap(LLFace* face, S32 channel)
+{
+ const LLTextureEntry* te = face->getTextureEntry();
+ if (te)
+ {
+ U8 bump_code = te->getBumpmap();
+ return bindBumpMap(bump_code, face->getTexture(), face->getVirtualSize(), channel);
+ }
+
+ return FALSE;
+}
+
+//static
+BOOL LLDrawPoolBump::bindBumpMap(U8 bump_code, LLViewerTexture* texture, F32 vsize, S32 channel)
+{
//Note: texture atlas does not support bump texture now.
- LLViewerFetchedTexture* tex = LLViewerTextureManager::staticCastToFetchedTexture(params.mTexture) ;
+ LLViewerFetchedTexture* tex = LLViewerTextureManager::staticCastToFetchedTexture(texture) ;
if(!tex)
{
//if the texture is not a fetched texture
return FALSE;
}
+ LLViewerTexture* bump = NULL;
+
switch( bump_code )
{
case BE_NO_BUMP:
@@ -605,7 +675,7 @@ BOOL LLDrawPoolBump::bindBumpMap(LLDrawInfo& params, S32 channel)
if( bump_code < LLStandardBumpmap::sStandardBumpmapCount )
{
bump = gStandardBumpmapList[bump_code].mImage;
- gBumpImageList.addTextureStats(bump_code, tex->getID(), params.mVSize);
+ gBumpImageList.addTextureStats(bump_code, tex->getID(), vsize);
}
break;
}
@@ -624,7 +694,7 @@ BOOL LLDrawPoolBump::bindBumpMap(LLDrawInfo& params, S32 channel)
return TRUE;
}
-
+
return FALSE;
}
@@ -641,36 +711,44 @@ void LLDrawPoolBump::beginBump(U32 pass)
// Optional second pass: emboss bump map
stop_glerror();
- // TEXTURE UNIT 0
- // Output.rgb = texture at texture coord 0
- gGL.getTexUnit(0)->activate();
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gObjectBumpProgram.bind();
+ }
+ else
+ {
+ // TEXTURE UNIT 0
+ // Output.rgb = texture at texture coord 0
+ gGL.getTexUnit(0)->activate();
- gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_ALPHA);
- gGL.getTexUnit(0)->setTextureAlphaBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_ALPHA);
+ gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_ALPHA);
+ gGL.getTexUnit(0)->setTextureAlphaBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_ALPHA);
- // TEXTURE UNIT 1
- gGL.getTexUnit(1)->activate();
+ // TEXTURE UNIT 1
+ gGL.getTexUnit(1)->activate();
- gGL.getTexUnit(1)->enable(LLTexUnit::TT_TEXTURE);
+ gGL.getTexUnit(1)->enable(LLTexUnit::TT_TEXTURE);
+
+ gGL.getTexUnit(1)->setTextureColorBlend(LLTexUnit::TBO_ADD_SIGNED, LLTexUnit::TBS_PREV_COLOR, LLTexUnit::TBS_ONE_MINUS_TEX_ALPHA);
+ gGL.getTexUnit(1)->setTextureAlphaBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_ALPHA);
- gGL.getTexUnit(1)->setTextureColorBlend(LLTexUnit::TBO_ADD_SIGNED, LLTexUnit::TBS_PREV_COLOR, LLTexUnit::TBS_ONE_MINUS_TEX_ALPHA);
- gGL.getTexUnit(1)->setTextureAlphaBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_ALPHA);
+ // src = tex0 + (1 - tex1) - 0.5
+ // = (bump0/2 + 0.5) + (1 - (bump1/2 + 0.5)) - 0.5
+ // = (1 + bump0 - bump1) / 2
- // src = tex0 + (1 - tex1) - 0.5
- // = (bump0/2 + 0.5) + (1 - (bump1/2 + 0.5)) - 0.5
- // = (1 + bump0 - bump1) / 2
+ // Blend: src * dst + dst * src
+ // = 2 * src * dst
+ // = 2 * ((1 + bump0 - bump1) / 2) * dst [0 - 2 * dst]
+ // = (1 + bump0 - bump1) * dst.rgb
+ // = dst.rgb + dst.rgb * (bump0 - bump1)
+
+ gGL.getTexUnit(0)->activate();
+ gGL.getTexUnit(1)->unbind(LLTexUnit::TT_TEXTURE);
+ }
- // Blend: src * dst + dst * src
- // = 2 * src * dst
- // = 2 * ((1 + bump0 - bump1) / 2) * dst [0 - 2 * dst]
- // = (1 + bump0 - bump1) * dst.rgb
- // = dst.rgb + dst.rgb * (bump0 - bump1)
gGL.setSceneBlendType(LLRender::BT_MULT_X2);
- gGL.getTexUnit(0)->activate();
stop_glerror();
-
- gGL.getTexUnit(1)->unbind(LLTexUnit::TT_TEXTURE);
}
//static
@@ -685,7 +763,7 @@ void LLDrawPoolBump::renderBump(U32 pass)
LLGLDisable fog(GL_FOG);
LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE, GL_LEQUAL);
LLGLEnable blend(GL_BLEND);
- glColor4f(1,1,1,1);
+ gGL.diffuseColor4f(1,1,1,1);
/// Get rid of z-fighting with non-bump pass.
LLGLEnable polyOffset(GL_POLYGON_OFFSET_FILL);
glPolygonOffset(-1.0f, -1.0f);
@@ -700,14 +778,21 @@ void LLDrawPoolBump::endBump(U32 pass)
return;
}
- // Disable texture unit 1
- gGL.getTexUnit(1)->activate();
- gGL.getTexUnit(1)->disable();
- gGL.getTexUnit(1)->setTextureBlendType(LLTexUnit::TB_MULT);
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gObjectBumpProgram.unbind();
+ }
+ else
+ {
+ // Disable texture blending on unit 1
+ gGL.getTexUnit(1)->activate();
+ gGL.getTexUnit(1)->disable();
+ gGL.getTexUnit(1)->setTextureBlendType(LLTexUnit::TB_MULT);
- // Disable texture unit 0
- gGL.getTexUnit(0)->activate();
- gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
+ // Disable texture blending on unit 0
+ gGL.getTexUnit(0)->activate();
+ gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
+ }
gGL.setSceneBlendType(LLRender::BT_ALPHA);
}
@@ -800,6 +885,9 @@ void LLDrawPoolBump::endPostDeferredPass(S32 pass)
endBump(LLRenderPass::PASS_POST_BUMP);
break;
}
+
+ //to disable texture channels
+ LLRenderPass::endRenderPass(pass);
}
void LLDrawPoolBump::renderPostDeferred(S32 pass)
@@ -853,6 +941,12 @@ void LLBumpImageList::destroyGL()
void LLBumpImageList::restoreGL()
{
+ if(!gTextureList.isInitialized())
+ {
+ //safe to return here because bump images will be reloaded during initialization later.
+ return ;
+ }
+
LLStandardBumpmap::restoreGL();
// Images will be recreated as they are needed.
}
@@ -942,47 +1036,48 @@ LLViewerTexture* LLBumpImageList::getBrightnessDarknessImage(LLViewerFetchedText
llassert( (bump_code == BE_BRIGHTNESS) || (bump_code == BE_DARKNESS) );
LLViewerTexture* bump = NULL;
- const F32 BRIGHTNESS_DARKNESS_PIXEL_AREA_THRESHOLD = 1000;
- if( src_image->getMaxVirtualSize() > BRIGHTNESS_DARKNESS_PIXEL_AREA_THRESHOLD )
- {
- bump_image_map_t* entries_list = NULL;
- void (*callback_func)( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata ) = NULL;
+
+ bump_image_map_t* entries_list = NULL;
+ void (*callback_func)( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata ) = NULL;
- switch( bump_code )
- {
- case BE_BRIGHTNESS:
- entries_list = &mBrightnessEntries;
- callback_func = LLBumpImageList::onSourceBrightnessLoaded;
- break;
- case BE_DARKNESS:
- entries_list = &mDarknessEntries;
- callback_func = LLBumpImageList::onSourceDarknessLoaded;
- break;
- default:
- llassert(0);
- return NULL;
- }
+ switch( bump_code )
+ {
+ case BE_BRIGHTNESS:
+ entries_list = &mBrightnessEntries;
+ callback_func = LLBumpImageList::onSourceBrightnessLoaded;
+ break;
+ case BE_DARKNESS:
+ entries_list = &mDarknessEntries;
+ callback_func = LLBumpImageList::onSourceDarknessLoaded;
+ break;
+ default:
+ llassert(0);
+ return NULL;
+ }
- bump_image_map_t::iterator iter = entries_list->find(src_image->getID());
- if (iter != entries_list->end())
- {
- bump = iter->second;
- }
- else
- {
- LLPointer<LLImageRaw> raw = new LLImageRaw(1,1,1);
- raw->clear(0x77, 0x77, 0x77, 0xFF);
+ bump_image_map_t::iterator iter = entries_list->find(src_image->getID());
+ if (iter != entries_list->end() && iter->second.notNull())
+ {
+ bump = iter->second;
+ }
+ else
+ {
+ LLPointer<LLImageRaw> raw = new LLImageRaw(1,1,1);
+ raw->clear(0x77, 0x77, 0xFF, 0xFF);
- (*entries_list)[src_image->getID()] = LLViewerTextureManager::getLocalTexture( raw.get(), TRUE);
- (*entries_list)[src_image->getID()]->setExplicitFormat(GL_ALPHA8, GL_ALPHA);
+ (*entries_list)[src_image->getID()] = LLViewerTextureManager::getLocalTexture( raw.get(), TRUE);
+ bump = (*entries_list)[src_image->getID()]; // In case callback was called immediately and replaced the image
+ }
- // Note: this may create an LLImageGL immediately
+ if (!src_image->hasCallbacks())
+ { //if image has no callbacks but resolutions don't match, trigger raw image loaded callback again
+ if (src_image->getWidth() != bump->getWidth() ||
+ src_image->getHeight() != bump->getHeight())// ||
+ //(LLPipeline::sRenderDeferred && bump->getComponents() != 4))
+ {
src_image->setBoostLevel(LLViewerTexture::BOOST_BUMP) ;
src_image->setLoadedCallback( callback_func, 0, TRUE, FALSE, new LLUUID(src_image->getID()), NULL );
- bump = (*entries_list)[src_image->getID()]; // In case callback was called immediately and replaced the image
-
-// bump_total++;
-// llinfos << "*** Creating " << (void*)bump << " " << bump_total << llendl;
+ src_image->forceToSaveRawImage(0) ;
}
}
@@ -990,6 +1085,8 @@ LLViewerTexture* LLBumpImageList::getBrightnessDarknessImage(LLViewerFetchedText
}
+static LLFastTimer::DeclareTimer FTM_BUMP_SOURCE_STANDARD_LOADED("Bump Standard Callback");
+
// static
void LLBumpImageList::onSourceBrightnessLoaded( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata )
{
@@ -1012,14 +1109,24 @@ void LLBumpImageList::onSourceDarknessLoaded( BOOL success, LLViewerFetchedTextu
}
}
+static LLFastTimer::DeclareTimer FTM_BUMP_GEN_NORMAL("Generate Normal Map");
+static LLFastTimer::DeclareTimer FTM_BUMP_CREATE_TEXTURE("Create GL Normal Map");
+
void LLBumpImageList::onSourceStandardLoaded( BOOL success, LLViewerFetchedTexture* src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata)
{
if (success && LLPipeline::sRenderDeferred)
{
+ LLFastTimer t(FTM_BUMP_SOURCE_STANDARD_LOADED);
LLPointer<LLImageRaw> nrm_image = new LLImageRaw(src->getWidth(), src->getHeight(), 4);
- generateNormalMapFromAlpha(src, nrm_image);
+ {
+ LLFastTimer t(FTM_BUMP_GEN_NORMAL);
+ generateNormalMapFromAlpha(src, nrm_image);
+ }
src_vi->setExplicitFormat(GL_RGBA, GL_RGBA);
- src_vi->createGLTexture(src_vi->getDiscardLevel(), nrm_image);
+ {
+ LLFastTimer t(FTM_BUMP_CREATE_TEXTURE);
+ src_vi->createGLTexture(src_vi->getDiscardLevel(), nrm_image);
+ }
}
}
@@ -1078,14 +1185,43 @@ void LLBumpImageList::generateNormalMapFromAlpha(LLImageRaw* src, LLImageRaw* nr
}
}
+
+static LLFastTimer::DeclareTimer FTM_BUMP_SOURCE_LOADED("Bump Source Loaded");
+static LLFastTimer::DeclareTimer FTM_BUMP_SOURCE_ENTRIES_UPDATE("Entries Update");
+static LLFastTimer::DeclareTimer FTM_BUMP_SOURCE_MIN_MAX("Min/Max");
+static LLFastTimer::DeclareTimer FTM_BUMP_SOURCE_RGB2LUM("RGB to Luminance");
+static LLFastTimer::DeclareTimer FTM_BUMP_SOURCE_RESCALE("Rescale");
+static LLFastTimer::DeclareTimer FTM_BUMP_SOURCE_GEN_NORMAL("Generate Normal");
+static LLFastTimer::DeclareTimer FTM_BUMP_SOURCE_CREATE("Create");
+
// static
void LLBumpImageList::onSourceLoaded( BOOL success, LLViewerTexture *src_vi, LLImageRaw* src, LLUUID& source_asset_id, EBumpEffect bump_code )
{
if( success )
{
+ LLFastTimer t(FTM_BUMP_SOURCE_LOADED);
+
+
bump_image_map_t& entries_list(bump_code == BE_BRIGHTNESS ? gBumpImageList.mBrightnessEntries : gBumpImageList.mDarknessEntries );
bump_image_map_t::iterator iter = entries_list.find(source_asset_id);
- if (iter != entries_list.end()) // bump not cached yet
+
+ {
+ LLFastTimer t(FTM_BUMP_SOURCE_ENTRIES_UPDATE);
+ if (iter == entries_list.end() ||
+ iter->second.isNull() ||
+ iter->second->getWidth() != src->getWidth() ||
+ iter->second->getHeight() != src->getHeight()) // bump not cached yet or has changed resolution
+ { //make sure an entry exists for this image
+ LLPointer<LLImageRaw> raw = new LLImageRaw(1,1,1);
+ raw->clear(0x77, 0x77, 0xFF, 0xFF);
+
+ entries_list[src_vi->getID()] = LLViewerTextureManager::getLocalTexture( raw.get(), TRUE);
+ iter = entries_list.find(src_vi->getID());
+ }
+ }
+
+ //if (iter->second->getWidth() != src->getWidth() ||
+ // iter->second->getHeight() != src->getHeight()) // bump not cached yet or has changed resolution
{
LLPointer<LLImageRaw> dst_image = new LLImageRaw(src->getWidth(), src->getHeight(), 1);
U8* dst_data = dst_image->getData();
@@ -1112,50 +1248,56 @@ void LLBumpImageList::onSourceLoaded( BOOL success, LLViewerTexture *src_vi, LLI
{
case 1:
case 2:
- if( src_data_size == dst_data_size * src_components )
{
- for( S32 i = 0, j=0; i < dst_data_size; i++, j+= src_components )
+ LLFastTimer t(FTM_BUMP_SOURCE_MIN_MAX);
+ if( src_data_size == dst_data_size * src_components )
{
- dst_data[i] = src_data[j];
- if( dst_data[i] < minimum )
- {
- minimum = dst_data[i];
- }
- if( dst_data[i] > maximum )
+ for( S32 i = 0, j=0; i < dst_data_size; i++, j+= src_components )
{
- maximum = dst_data[i];
+ dst_data[i] = src_data[j];
+ if( dst_data[i] < minimum )
+ {
+ minimum = dst_data[i];
+ }
+ if( dst_data[i] > maximum )
+ {
+ maximum = dst_data[i];
+ }
}
}
- }
- else
- {
- llassert(0);
- dst_image->clear();
+ else
+ {
+ llassert(0);
+ dst_image->clear();
+ }
}
break;
case 3:
case 4:
- if( src_data_size == dst_data_size * src_components )
{
- for( S32 i = 0, j=0; i < dst_data_size; i++, j+= src_components )
+ LLFastTimer t(FTM_BUMP_SOURCE_RGB2LUM);
+ if( src_data_size == dst_data_size * src_components )
{
- // RGB to luminance
- dst_data[i] = (R_WEIGHT * src_data[j] + G_WEIGHT * src_data[j+1] + B_WEIGHT * src_data[j+2]) >> FIXED_PT;
- //llassert( dst_data[i] <= 255 );true because it's 8bit
- if( dst_data[i] < minimum )
- {
- minimum = dst_data[i];
- }
- if( dst_data[i] > maximum )
+ for( S32 i = 0, j=0; i < dst_data_size; i++, j+= src_components )
{
- maximum = dst_data[i];
+ // RGB to luminance
+ dst_data[i] = (R_WEIGHT * src_data[j] + G_WEIGHT * src_data[j+1] + B_WEIGHT * src_data[j+2]) >> FIXED_PT;
+ //llassert( dst_data[i] <= 255 );true because it's 8bit
+ if( dst_data[i] < minimum )
+ {
+ minimum = dst_data[i];
+ }
+ if( dst_data[i] > maximum )
+ {
+ maximum = dst_data[i];
+ }
}
}
- }
- else
- {
- llassert(0);
- dst_image->clear();
+ else
+ {
+ llassert(0);
+ dst_image->clear();
+ }
}
break;
default:
@@ -1166,6 +1308,7 @@ void LLBumpImageList::onSourceLoaded( BOOL success, LLViewerTexture *src_vi, LLI
if( maximum > minimum )
{
+ LLFastTimer t(FTM_BUMP_SOURCE_RESCALE);
U8 bias_and_scale_lut[256];
F32 twice_one_over_range = 2.f / (maximum - minimum);
S32 i;
@@ -1199,30 +1342,104 @@ void LLBumpImageList::onSourceLoaded( BOOL success, LLViewerTexture *src_vi, LLI
// accidentally releases it.
LLPointer<LLViewerTexture> bump = LLViewerTextureManager::getLocalTexture( TRUE );
+
if (!LLPipeline::sRenderDeferred)
{
+ LLFastTimer t(FTM_BUMP_SOURCE_CREATE);
bump->setExplicitFormat(GL_ALPHA8, GL_ALPHA);
bump->createGLTexture(0, dst_image);
}
- else
- {
- LLPointer<LLImageRaw> nrm_image = new LLImageRaw(dst_image->getWidth(), dst_image->getHeight(), 4);
- generateNormalMapFromAlpha(dst_image, nrm_image);
- bump->setExplicitFormat(GL_RGBA, GL_RGBA);
- bump->createGLTexture(0, nrm_image);
- }
+ else
+ { //convert to normal map
+ {
+ LLFastTimer t(FTM_BUMP_SOURCE_CREATE);
+ bump->setExplicitFormat(GL_RGBA8, GL_ALPHA);
+ bump->createGLTexture(0, dst_image);
+ }
-
+ {
+ LLFastTimer t(FTM_BUMP_SOURCE_GEN_NORMAL);
+ gPipeline.mScreen.bindTarget();
+
+ LLGLDepthTest depth(GL_FALSE);
+ LLGLDisable cull(GL_CULL_FACE);
+ LLGLDisable blend(GL_BLEND);
+ gGL.setColorMask(TRUE, TRUE);
+ gNormalMapGenProgram.bind();
+ gNormalMapGenProgram.uniform1f("norm_scale", gSavedSettings.getF32("RenderNormalMapScale"));
+ gNormalMapGenProgram.uniform1f("stepX", 1.f/bump->getWidth());
+ gNormalMapGenProgram.uniform1f("stepY", 1.f/bump->getHeight());
+
+ LLVector2 v((F32) bump->getWidth()/gPipeline.mScreen.getWidth(),
+ (F32) bump->getHeight()/gPipeline.mScreen.getHeight());
+
+ gGL.getTexUnit(0)->bind(bump);
+
+ S32 width = bump->getWidth();
+ S32 height = bump->getHeight();
+
+ S32 screen_width = gPipeline.mScreen.getWidth();
+ S32 screen_height = gPipeline.mScreen.getHeight();
+
+ glViewport(0, 0, screen_width, screen_height);
+
+ for (S32 left = 0; left < width; left += screen_width)
+ {
+ S32 right = left + screen_width;
+ right = llmin(right, width);
+
+ F32 left_tc = (F32) left/ width;
+ F32 right_tc = (F32) right/width;
+
+ for (S32 bottom = 0; bottom < height; bottom += screen_height)
+ {
+ S32 top = bottom+screen_height;
+ top = llmin(top, height);
+
+ F32 bottom_tc = (F32) bottom/height;
+ F32 top_tc = (F32)(bottom+screen_height)/height;
+ top_tc = llmin(top_tc, 1.f);
+
+ F32 screen_right = (F32) (right-left)/screen_width;
+ F32 screen_top = (F32) (top-bottom)/screen_height;
+
+ gGL.begin(LLRender::TRIANGLE_STRIP);
+ gGL.texCoord2f(left_tc, bottom_tc);
+ gGL.vertex2f(0, 0);
+
+ gGL.texCoord2f(left_tc, top_tc);
+ gGL.vertex2f(0, screen_top);
+
+ gGL.texCoord2f(right_tc, bottom_tc);
+ gGL.vertex2f(screen_right, 0);
+
+ gGL.texCoord2f(right_tc, top_tc);
+ gGL.vertex2f(screen_right, screen_top);
+
+ gGL.end();
+
+ gGL.flush();
+
+ S32 w = right-left;
+ S32 h = top-bottom;
+
+ glCopyTexSubImage2D(GL_TEXTURE_2D, 0, left, bottom, 0, 0, w, h);
+ }
+ }
+
+ glGenerateMipmap(GL_TEXTURE_2D);
+
+ gPipeline.mScreen.flush();
+
+ gNormalMapGenProgram.unbind();
+
+ //generateNormalMapFromAlpha(dst_image, nrm_image);
+ }
+ }
+
iter->second = bump; // derefs (and deletes) old image
//---------------------------------------------------
}
- else
- {
- // entry should have been added in LLBumpImageList::getImage().
-
- // Not a legit assertion - the bump texture could have been flushed by the bump image manager
- //llassert(0);
- }
}
}
@@ -1242,43 +1459,66 @@ void LLDrawPoolBump::renderBump(U32 type, U32 mask)
}
}
-void LLDrawPoolBump::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture)
+void LLDrawPoolBump::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture, BOOL batch_textures)
{
applyModelMatrix(params);
- if (params.mTextureMatrix)
+ bool tex_setup = false;
+
+ if (batch_textures && params.mTextureList.size() > 1)
{
- if (mShiny)
+ for (U32 i = 0; i < params.mTextureList.size(); ++i)
{
- gGL.getTexUnit(0)->activate();
- glMatrixMode(GL_TEXTURE);
+ if (params.mTextureList[i].notNull())
+ {
+ gGL.getTexUnit(i)->bind(params.mTextureList[i], TRUE);
+ }
}
- else
+ }
+ else
+ { //not batching textures or batch has only 1 texture -- might need a texture matrix
+ if (params.mTextureMatrix)
{
- gGL.getTexUnit(1)->activate();
- glMatrixMode(GL_TEXTURE);
- glLoadMatrixf((GLfloat*) params.mTextureMatrix->mMatrix);
- gPipeline.mTextureMatrixOps++;
- gGL.getTexUnit(0)->activate();
- }
+ if (mShiny)
+ {
+ gGL.getTexUnit(0)->activate();
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ }
+ else
+ {
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ gGL.getTexUnit(1)->activate();
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.loadMatrix((GLfloat*) params.mTextureMatrix->mMatrix);
+ }
- glLoadMatrixf((GLfloat*) params.mTextureMatrix->mMatrix);
- gPipeline.mTextureMatrixOps++;
- }
+ gGL.getTexUnit(0)->activate();
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.loadMatrix((GLfloat*) params.mTextureMatrix->mMatrix);
+ gPipeline.mTextureMatrixOps++;
+ }
- if (mShiny && mVertexShaderLevel > 1 && texture)
- {
- if (params.mTexture.notNull())
- {
- gGL.getTexUnit(diffuse_channel)->bind(params.mTexture) ;
- params.mTexture->addTextureStats(params.mVSize);
+ gGL.loadMatrix((GLfloat*) params.mTextureMatrix->mMatrix);
+ gPipeline.mTextureMatrixOps++;
+
+ tex_setup = true;
}
- else
+
+ if (mShiny && mVertexShaderLevel > 1 && texture)
{
- gGL.getTexUnit(diffuse_channel)->unbind(LLTexUnit::TT_TEXTURE);
+ if (params.mTexture.notNull())
+ {
+ gGL.getTexUnit(diffuse_channel)->bind(params.mTexture);
+ params.mTexture->addTextureStats(params.mVSize);
+ }
+ else
+ {
+ gGL.getTexUnit(diffuse_channel)->unbind(LLTexUnit::TT_TEXTURE);
+ }
}
}
-
+
if (params.mGroup)
{
params.mGroup->rebuildMesh();
@@ -1286,7 +1526,7 @@ void LLDrawPoolBump::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture)
params.mVertexBuffer->setBuffer(mask);
params.mVertexBuffer->drawRange(params.mDrawMode, params.mStart, params.mEnd, params.mCount, params.mOffset);
gPipeline.addTrianglesDrawn(params.mCount, params.mDrawMode);
- if (params.mTextureMatrix)
+ if (tex_setup)
{
if (mShiny)
{
@@ -1294,12 +1534,17 @@ void LLDrawPoolBump::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture)
}
else
{
- gGL.getTexUnit(1)->activate();
- glLoadIdentity();
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ gGL.getTexUnit(1)->activate();
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.loadIdentity();
+ }
gGL.getTexUnit(0)->activate();
+ gGL.matrixMode(LLRender::MM_TEXTURE);
}
- glLoadIdentity();
- glMatrixMode(GL_MODELVIEW);
+ gGL.loadIdentity();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
}
}
@@ -1307,6 +1552,11 @@ void LLDrawPoolInvisible::render(S32 pass)
{ //render invisiprims
LLFastTimer t(FTM_RENDER_INVISIBLE);
+ if (gPipeline.canUseVertexShaders())
+ {
+ gOcclusionProgram.bind();
+ }
+
U32 invisi_mask = LLVertexBuffer::MAP_VERTEX;
glStencilMask(0);
gGL.setColorMask(false, false);
@@ -1314,6 +1564,11 @@ void LLDrawPoolInvisible::render(S32 pass)
gGL.setColorMask(true, false);
glStencilMask(0xFFFFFFFF);
+ if (gPipeline.canUseVertexShaders())
+ {
+ gOcclusionProgram.unbind();
+ }
+
if (gPipeline.hasRenderBatches(LLRenderPass::PASS_INVISI_SHINY))
{
beginShiny(true);
@@ -1334,6 +1589,7 @@ void LLDrawPoolInvisible::endDeferredPass( S32 pass )
void LLDrawPoolInvisible::renderDeferred( S32 pass )
{ //render invisiprims; this doesn't work becaue it also blocks all the post-deferred stuff
+#if 0
LLFastTimer t(FTM_RENDER_INVISIBLE);
U32 invisi_mask = LLVertexBuffer::MAP_VERTEX;
@@ -1351,4 +1607,5 @@ void LLDrawPoolInvisible::renderDeferred( S32 pass )
renderShiny(true);
endShiny(true);
}
+#endif
}
diff --git a/indra/newview/lldrawpoolbump.h b/indra/newview/lldrawpoolbump.h
index 65a813ab94..476b1d41b7 100644
--- a/indra/newview/lldrawpoolbump.h
+++ b/indra/newview/lldrawpoolbump.h
@@ -35,6 +35,7 @@
class LLImageRaw;
class LLSpatialGroup;
class LLDrawInfo;
+class LLGLSLShader;
class LLViewerFetchedTexture;
class LLDrawPoolBump : public LLRenderPass
@@ -54,7 +55,7 @@ public:
virtual void endRenderPass( S32 pass );
virtual S32 getNumPasses();
/*virtual*/ void prerender();
- /*virtual*/ void pushBatch(LLDrawInfo& params, U32 mask, BOOL texture);
+ /*virtual*/ void pushBatch(LLDrawInfo& params, U32 mask, BOOL texture, BOOL batch_textures = FALSE);
void renderBump(U32 type, U32 mask);
void renderGroup(LLSpatialGroup* group, U32 type, U32 mask, BOOL texture);
@@ -73,6 +74,9 @@ public:
void renderBump(U32 pass = LLRenderPass::PASS_BUMP);
void endBump(U32 pass = LLRenderPass::PASS_BUMP);
+ static void bindCubeMap(LLGLSLShader* shader, S32 shader_level, S32& diffuse_channel, S32& cube_channel, bool invisible);
+ static void unbindCubeMap(LLGLSLShader* shader, S32 shader_level, S32& diffuse_channel, S32& cube_channel, bool invisible);
+
virtual S32 getNumDeferredPasses();
/*virtual*/ void beginDeferredPass(S32 pass);
/*virtual*/ void endDeferredPass(S32 pass);
@@ -83,7 +87,12 @@ public:
/*virtual*/ void endPostDeferredPass(S32 pass);
/*virtual*/ void renderPostDeferred(S32 pass);
- BOOL bindBumpMap(LLDrawInfo& params, S32 channel = -2);
+ static BOOL bindBumpMap(LLDrawInfo& params, S32 channel = -2);
+ static BOOL bindBumpMap(LLFace* face, S32 channel = -2);
+
+private:
+ static BOOL bindBumpMap(U8 bump_code, LLViewerTexture* tex, F32 vsize, S32 channel);
+
};
enum EBumpEffect
diff --git a/indra/newview/lldrawpoolclouds.cpp b/indra/newview/lldrawpoolclouds.cpp
deleted file mode 100644
index 5db1d8cfed..0000000000
--- a/indra/newview/lldrawpoolclouds.cpp
+++ /dev/null
@@ -1,97 +0,0 @@
-/**
- * @file lldrawpoolclouds.cpp
- * @brief LLDrawPoolClouds class implementation
- *
- * $LicenseInfo:firstyear=2006&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include "lldrawpoolclouds.h"
-
-#include "llface.h"
-#include "llsky.h"
-#include "llviewercamera.h"
-#include "llvoclouds.h"
-#include "pipeline.h"
-
-LLDrawPoolClouds::LLDrawPoolClouds() :
- LLDrawPool(POOL_CLOUDS)
-{
-}
-
-LLDrawPool *LLDrawPoolClouds::instancePool()
-{
- return new LLDrawPoolClouds();
-}
-
-BOOL LLDrawPoolClouds::addFace(LLFace* face)
-{
- llerrs << "WTF?" << llendl;
- return FALSE;
-}
-
-void LLDrawPoolClouds::enqueue(LLFace *facep)
-{
- mDrawFace.push_back(facep);
- facep->mDistance = (facep->mCenterAgent - gCamera->getOrigin()) * gCamera->getAtAxis();
-}
-
-void LLDrawPoolClouds::beginRenderPass(S32 pass)
-{
- glEnableClientState(GL_VERTEX_ARRAY);
- glEnableClientState(GL_TEXTURE_COORD_ARRAY);
- glEnableClientState(GL_NORMAL_ARRAY);
-}
-
-void LLDrawPoolClouds::prerender()
-{
- mVertexShaderLevel = gPipeline.getVertexShaderLevel(LLPipeline::SHADER_ENVIRONMENT);
-}
-
-void LLDrawPoolClouds::render(S32 pass)
-{
- LLFastTimer ftm(LLFastTimer::FTM_RENDER_CLOUDS);
- if (!(gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_CLOUDS)))
- {
- return;
- }
-
- if (mDrawFace.empty())
- {
- return;
- }
-
- LLGLSPipelineAlpha gls_pipeline_alpha;
- LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE);
- glAlphaFunc(GL_GREATER,0.01f);
-
- gPipeline.enableLightsFullbright(LLColor4(1.f,1.f,1.f));
-
- mDrawFace[0]->bindTexture();
-
- std::sort(mDrawFace.begin(), mDrawFace.end(), LLFace::CompareDistanceGreater());
-
- drawLoop();
-}
-
-
diff --git a/indra/newview/lldrawpoolclouds.h b/indra/newview/lldrawpoolclouds.h
deleted file mode 100644
index 019f11a795..0000000000
--- a/indra/newview/lldrawpoolclouds.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/**
- * @file lldrawpoolclouds.h
- * @brief LLDrawPoolClouds class definition
- *
- * $LicenseInfo:firstyear=2006&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLDRAWPOOLCLOUDS_H
-#define LL_LLDRAWPOOLCLOUDS_H
-
-#include "lldrawpool.h"
-
-class LLDrawPoolClouds : public LLDrawPool
-{
-public:
- enum
- {
- VERTEX_DATA_MASK = LLVertexBuffer::MAP_VERTEX |
- LLVertexBuffer::MAP_NORMAL |
- LLVertexBuffer::MAP_TEXCOORD0
- };
-
- BOOL addFace(LLFace* face);
- virtual U32 getVertexDataMask() { return VERTEX_DATA_MASK; }
-
- LLDrawPoolClouds();
-
- /*virtual*/ void prerender();
- /*virtual*/ LLDrawPool *instancePool();
- /*virtual*/ void enqueue(LLFace *face);
- /*virtual*/ void beginRenderPass(S32 pass);
- /*virtual*/ void render(S32 pass = 0);
-};
-
-#endif // LL_LLDRAWPOOLSKY_H
diff --git a/indra/newview/lldrawpoolground.cpp b/indra/newview/lldrawpoolground.cpp
index ce07e62122..59c3fbf7a1 100644
--- a/indra/newview/lldrawpoolground.cpp
+++ b/indra/newview/lldrawpoolground.cpp
@@ -71,9 +71,9 @@ void LLDrawPoolGround::render(S32 pass)
LLGLSquashToFarClip far_clip(glh_get_current_projection());
F32 water_height = gAgent.getRegion()->getWaterHeight();
- glPushMatrix();
+ gGL.pushMatrix();
LLVector3 origin = LLViewerCamera::getInstance()->getOrigin();
- glTranslatef(origin.mV[0], origin.mV[1], llmax(origin.mV[2], water_height));
+ gGL.translatef(origin.mV[0], origin.mV[1], llmax(origin.mV[2], water_height));
LLFace *facep = mDrawFace[0];
@@ -82,6 +82,6 @@ void LLDrawPoolGround::render(S32 pass)
LLOverrideFaceColor col(this, gSky.mVOSkyp->getGLFogColor());
facep->renderIndexed();
- glPopMatrix();
+ gGL.popMatrix();
}
diff --git a/indra/newview/lldrawpoolsimple.cpp b/indra/newview/lldrawpoolsimple.cpp
index 2e83167851..6e0ea78af2 100644
--- a/indra/newview/lldrawpoolsimple.cpp
+++ b/indra/newview/lldrawpoolsimple.cpp
@@ -44,7 +44,14 @@ static LLGLSLShader* fullbright_shader = NULL;
static LLFastTimer::DeclareTimer FTM_RENDER_SIMPLE_DEFERRED("Deferred Simple");
static LLFastTimer::DeclareTimer FTM_RENDER_GRASS_DEFERRED("Deferred Grass");
-void LLDrawPoolGlow::render(S32 pass)
+void LLDrawPoolGlow::beginPostDeferredPass(S32 pass)
+{
+ gDeferredEmissiveProgram.bind();
+}
+
+static LLFastTimer::DeclareTimer FTM_RENDER_GLOW_PUSH("Glow Push");
+
+void LLDrawPoolGlow::renderPostDeferred(S32 pass)
{
LLFastTimer t(FTM_RENDER_GLOW);
LLGLEnable blend(GL_BLEND);
@@ -55,34 +62,73 @@ void LLDrawPoolGlow::render(S32 pass)
glPolygonOffset(-1.0f, -1.0f);
gGL.setSceneBlendType(LLRender::BT_ADD);
- U32 shader_level = LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_OBJECT);
+ LLGLDepthTest depth(GL_TRUE, GL_FALSE);
+ gGL.setColorMask(false, true);
- if (shader_level > 0 && fullbright_shader)
{
- fullbright_shader->bind();
+ LLFastTimer t(FTM_RENDER_GLOW_PUSH);
+ pushBatches(LLRenderPass::PASS_GLOW, getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE);
+ }
+
+ gGL.setColorMask(true, false);
+ gGL.setSceneBlendType(LLRender::BT_ALPHA);
+}
+
+void LLDrawPoolGlow::endPostDeferredPass(S32 pass)
+{
+ gDeferredEmissiveProgram.unbind();
+ LLRenderPass::endRenderPass(pass);
+}
+
+S32 LLDrawPoolGlow::getNumPasses()
+{
+ if (LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_OBJECT) > 0)
+ {
+ return 1;
}
else
{
- gPipeline.enableLightsFullbright(LLColor4(1,1,1,1));
+ return 0;
}
+}
+
+void LLDrawPoolGlow::render(S32 pass)
+{
+ LLFastTimer t(FTM_RENDER_GLOW);
+ LLGLEnable blend(GL_BLEND);
+ LLGLDisable test(GL_ALPHA_TEST);
+ gGL.flush();
+ /// Get rid of z-fighting with non-glow pass.
+ LLGLEnable polyOffset(GL_POLYGON_OFFSET_FILL);
+ glPolygonOffset(-1.0f, -1.0f);
+ gGL.setSceneBlendType(LLRender::BT_ADD);
+
+ U32 shader_level = LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_OBJECT);
+
+ //should never get here without basic shaders enabled
+ llassert(shader_level > 0);
+
+ LLGLSLShader* shader = LLPipeline::sUnderWaterRender ? &gObjectEmissiveWaterProgram : &gObjectEmissiveProgram;
+ shader->bind();
LLGLDepthTest depth(GL_TRUE, GL_FALSE);
gGL.setColorMask(false, true);
- renderTexture(LLRenderPass::PASS_GLOW, getVertexDataMask());
+
+ pushBatches(LLRenderPass::PASS_GLOW, getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE);
gGL.setColorMask(true, false);
gGL.setSceneBlendType(LLRender::BT_ALPHA);
if (shader_level > 0 && fullbright_shader)
{
- fullbright_shader->unbind();
+ shader->unbind();
}
}
-void LLDrawPoolGlow::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture)
+void LLDrawPoolGlow::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture, BOOL batch_textures)
{
- glColor4ubv(params.mGlowColor.mV);
- LLRenderPass::pushBatch(params, mask, texture);
+ //gGL.diffuseColor4ubv(params.mGlowColor.mV);
+ LLRenderPass::pushBatch(params, mask, texture, batch_textures);
}
@@ -126,10 +172,11 @@ void LLDrawPoolSimple::beginRenderPass(S32 pass)
void LLDrawPoolSimple::endRenderPass(S32 pass)
{
LLFastTimer t(FTM_RENDER_SIMPLE);
+ stop_glerror();
LLRenderPass::endRenderPass(pass);
-
- if (mVertexShaderLevel > 0){
-
+ stop_glerror();
+ if (mVertexShaderLevel > 0)
+ {
simple_shader->unbind();
}
}
@@ -137,18 +184,29 @@ void LLDrawPoolSimple::endRenderPass(S32 pass)
void LLDrawPoolSimple::render(S32 pass)
{
LLGLDisable blend(GL_BLEND);
- LLGLDisable alpha_test(GL_ALPHA_TEST);
{ //render simple
LLFastTimer t(FTM_RENDER_SIMPLE);
gPipeline.enableLightsDynamic();
- renderTexture(LLRenderPass::PASS_SIMPLE, getVertexDataMask());
- if (LLPipeline::sRenderDeferred)
- { //if deferred rendering is enabled, bump faces aren't registered as simple
- //render bump faces here as simple so bump faces will appear under water
- renderTexture(LLRenderPass::PASS_BUMP, getVertexDataMask());
+ if (mVertexShaderLevel > 0)
+ {
+ U32 mask = getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX;
+
+ pushBatches(LLRenderPass::PASS_SIMPLE, mask, TRUE, TRUE);
+
+ if (LLPipeline::sRenderDeferred)
+ { //if deferred rendering is enabled, bump faces aren't registered as simple
+ //render bump faces here as simple so bump faces will appear under water
+ pushBatches(LLRenderPass::PASS_BUMP, mask, TRUE, TRUE);
+ }
}
+ else
+ {
+ LLGLDisable alpha_test(GL_ALPHA_TEST);
+ renderTexture(LLRenderPass::PASS_SIMPLE, getVertexDataMask());
+ }
+
}
}
@@ -177,7 +235,7 @@ void LLDrawPoolSimple::renderDeferred(S32 pass)
{ //render simple
LLFastTimer t(FTM_RENDER_SIMPLE_DEFERRED);
- renderTexture(LLRenderPass::PASS_SIMPLE, getVertexDataMask());
+ pushBatches(LLRenderPass::PASS_SIMPLE, getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE);
}
}
@@ -197,22 +255,25 @@ void LLDrawPoolGrass::prerender()
void LLDrawPoolGrass::beginRenderPass(S32 pass)
{
LLFastTimer t(FTM_RENDER_GRASS);
+ stop_glerror();
if (LLPipeline::sUnderWaterRender)
{
- simple_shader = &gObjectSimpleWaterProgram;
+ simple_shader = &gObjectAlphaMaskNonIndexedWaterProgram;
}
else
{
- simple_shader = &gObjectSimpleProgram;
+ simple_shader = &gObjectAlphaMaskNonIndexedProgram;
}
if (mVertexShaderLevel > 0)
{
simple_shader->bind();
+ simple_shader->setMinimumAlpha(0.5f);
}
else
{
+ gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.5f);
// don't use shaders!
if (gGLManager.mHasShaderObjects)
{
@@ -230,22 +291,23 @@ void LLDrawPoolGrass::endRenderPass(S32 pass)
{
simple_shader->unbind();
}
+ else
+ {
+ gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
+ }
}
void LLDrawPoolGrass::render(S32 pass)
{
LLGLDisable blend(GL_BLEND);
- gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.5f);
-
+
{
LLFastTimer t(FTM_RENDER_GRASS);
LLGLEnable test(GL_ALPHA_TEST);
gGL.setSceneBlendType(LLRender::BT_ALPHA);
//render grass
LLRenderPass::renderTexture(LLRenderPass::PASS_GRASS, getVertexDataMask());
- }
-
- gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
+ }
}
void LLDrawPoolGrass::beginDeferredPass(S32 pass)
@@ -260,17 +322,13 @@ void LLDrawPoolGrass::endDeferredPass(S32 pass)
void LLDrawPoolGrass::renderDeferred(S32 pass)
{
- gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.f);
-
{
LLFastTimer t(FTM_RENDER_GRASS_DEFERRED);
- gDeferredTreeProgram.bind();
- LLGLEnable test(GL_ALPHA_TEST);
+ gDeferredNonIndexedDiffuseAlphaMaskProgram.bind();
+ gDeferredNonIndexedDiffuseAlphaMaskProgram.setMinimumAlpha(0.5f);
//render grass
LLRenderPass::renderTexture(LLRenderPass::PASS_GRASS, getVertexDataMask());
}
-
- gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
}
@@ -285,6 +343,26 @@ void LLDrawPoolFullbright::prerender()
mVertexShaderLevel = LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_OBJECT);
}
+void LLDrawPoolFullbright::beginPostDeferredPass(S32 pass)
+{
+ gDeferredFullbrightProgram.bind();
+}
+
+void LLDrawPoolFullbright::renderPostDeferred(S32 pass)
+{
+ LLFastTimer t(FTM_RENDER_FULLBRIGHT);
+
+ gGL.setSceneBlendType(LLRender::BT_ALPHA);
+ U32 fullbright_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_COLOR | LLVertexBuffer::MAP_TEXTURE_INDEX;
+ pushBatches(LLRenderPass::PASS_FULLBRIGHT, fullbright_mask, TRUE, TRUE);
+}
+
+void LLDrawPoolFullbright::endPostDeferredPass(S32 pass)
+{
+ gDeferredFullbrightProgram.unbind();
+ LLRenderPass::endRenderPass(pass);
+}
+
void LLDrawPoolFullbright::beginRenderPass(S32 pass)
{
LLFastTimer t(FTM_RENDER_FULLBRIGHT);
@@ -304,34 +382,38 @@ void LLDrawPoolFullbright::endRenderPass(S32 pass)
LLFastTimer t(FTM_RENDER_FULLBRIGHT);
LLRenderPass::endRenderPass(pass);
+ stop_glerror();
+
if (mVertexShaderLevel > 0)
{
fullbright_shader->unbind();
}
+
+ stop_glerror();
}
void LLDrawPoolFullbright::render(S32 pass)
{ //render fullbright
LLFastTimer t(FTM_RENDER_FULLBRIGHT);
+ gGL.setSceneBlendType(LLRender::BT_ALPHA);
+
+ stop_glerror();
+
if (mVertexShaderLevel > 0)
{
fullbright_shader->bind();
fullbright_shader->uniform1f(LLViewerShaderMgr::FULLBRIGHT, 1.f);
+ U32 fullbright_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_COLOR | LLVertexBuffer::MAP_TEXTURE_INDEX;
+ pushBatches(LLRenderPass::PASS_FULLBRIGHT, fullbright_mask, TRUE, TRUE);
}
else
{
gPipeline.enableLightsFullbright(LLColor4(1,1,1,1));
+ U32 fullbright_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_COLOR;
+ renderTexture(LLRenderPass::PASS_FULLBRIGHT, fullbright_mask);
}
-
- //gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.25f);
-
- //LLGLEnable test(GL_ALPHA_TEST);
- //LLGLEnable blend(GL_BLEND);
- gGL.setSceneBlendType(LLRender::BT_ALPHA);
- U32 fullbright_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_COLOR;
- renderTexture(LLRenderPass::PASS_FULLBRIGHT, fullbright_mask);
- //gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
+ stop_glerror();
}
S32 LLDrawPoolFullbright::getNumPasses()
diff --git a/indra/newview/lldrawpoolsimple.h b/indra/newview/lldrawpoolsimple.h
index 5f3bbebbda..bd62bc7502 100644
--- a/indra/newview/lldrawpoolsimple.h
+++ b/indra/newview/lldrawpoolsimple.h
@@ -98,9 +98,9 @@ public:
LLDrawPoolFullbright();
/*virtual*/ S32 getNumPostDeferredPasses() { return 1; }
- /*virtual*/ void beginPostDeferredPass(S32 pass) { beginRenderPass(pass); }
- /*virtual*/ void endPostDeferredPass(S32 pass) { endRenderPass(pass); }
- /*virtual*/ void renderPostDeferred(S32 pass) { render(pass); }
+ /*virtual*/ void beginPostDeferredPass(S32 pass);
+ /*virtual*/ void endPostDeferredPass(S32 pass);
+ /*virtual*/ void renderPostDeferred(S32 pass);
/*virtual*/ void beginRenderPass(S32 pass);
/*virtual*/ void endRenderPass(S32 pass);
@@ -118,7 +118,8 @@ public:
enum
{
VERTEX_DATA_MASK = LLVertexBuffer::MAP_VERTEX |
- LLVertexBuffer::MAP_TEXCOORD0
+ LLVertexBuffer::MAP_TEXCOORD0 |
+ LLVertexBuffer::MAP_EMISSIVE
};
virtual U32 getVertexDataMask() { return VERTEX_DATA_MASK; }
@@ -126,12 +127,14 @@ public:
virtual void prerender() { }
/*virtual*/ S32 getNumPostDeferredPasses() { return 1; }
- /*virtual*/ void beginPostDeferredPass(S32 pass) { beginRenderPass(pass); }
- /*virtual*/ void endPostDeferredPass(S32 pass) { endRenderPass(pass); }
- /*virtual*/ void renderPostDeferred(S32 pass) { render(pass); }
+ /*virtual*/ void beginPostDeferredPass(S32 pass);
+ /*virtual*/ void endPostDeferredPass(S32 pass);
+ /*virtual*/ void renderPostDeferred(S32 pass);
+
+ /*virtual*/ S32 getNumPasses();
void render(S32 pass = 0);
- void pushBatch(LLDrawInfo& params, U32 mask, BOOL texture = TRUE);
+ void pushBatch(LLDrawInfo& params, U32 mask, BOOL texture = TRUE, BOOL batch_textures = FALSE);
};
diff --git a/indra/newview/lldrawpoolsky.cpp b/indra/newview/lldrawpoolsky.cpp
index 6b45c5abb0..7f7d9f65c6 100644
--- a/indra/newview/lldrawpoolsky.cpp
+++ b/indra/newview/lldrawpoolsky.cpp
@@ -63,6 +63,8 @@ void LLDrawPoolSky::prerender()
void LLDrawPoolSky::render(S32 pass)
{
+ gGL.flush();
+
if (mDrawFace.empty())
{
return;
@@ -74,11 +76,16 @@ void LLDrawPoolSky::render(S32 pass)
return;
}
- // use a shader only underwater
+ // don't render sky under water (background just gets cleared to fog color)
if(mVertexShaderLevel > 0 && LLPipeline::sUnderWaterRender)
{
- mShader = &gObjectFullbrightWaterProgram;
- mShader->bind();
+ return;
+ }
+
+
+ if (LLGLSLShader::sNoFixedFunction)
+ { //just use the UI shader (generic single texture no lighting)
+ gOneTextureNoColorProgram.bind();
}
else
{
@@ -105,20 +112,21 @@ void LLDrawPoolSky::render(S32 pass)
LLGLDisable clip(GL_CLIP_PLANE0);
- glPushMatrix();
+ gGL.pushMatrix();
LLVector3 origin = LLViewerCamera::getInstance()->getOrigin();
- glTranslatef(origin.mV[0], origin.mV[1], origin.mV[2]);
+ gGL.translatef(origin.mV[0], origin.mV[1], origin.mV[2]);
S32 face_count = (S32)mDrawFace.size();
+ LLVertexBuffer::unbind();
+ gGL.diffuseColor4f(1,1,1,1);
+
for (S32 i = 0; i < llmin(6, face_count); ++i)
{
renderSkyCubeFace(i);
}
- LLGLEnable blend(GL_BLEND);
-
- glPopMatrix();
+ gGL.popMatrix();
}
void LLDrawPoolSky::renderSkyCubeFace(U8 side)
@@ -136,9 +144,10 @@ void LLDrawPoolSky::renderSkyCubeFace(U8 side)
if (LLSkyTex::doInterpolate())
{
+
LLGLEnable blend(GL_BLEND);
mSkyTex[side].bindTexture(FALSE);
- glColor4f(1, 1, 1, LLSkyTex::getInterpVal()); // lighting is disabled
+ gGL.diffuseColor4f(1, 1, 1, LLSkyTex::getInterpVal()); // lighting is disabled
face.renderIndexed();
}
}
diff --git a/indra/newview/lldrawpoolterrain.cpp b/indra/newview/lldrawpoolterrain.cpp
index 84eeace9c6..b95d8296fa 100644
--- a/indra/newview/lldrawpoolterrain.cpp
+++ b/indra/newview/lldrawpoolterrain.cpp
@@ -62,13 +62,16 @@ LLDrawPoolTerrain::LLDrawPoolTerrain(LLViewerTexture *texturep) :
LLFacePool(POOL_TERRAIN),
mTexturep(texturep)
{
+ U32 format = GL_ALPHA8;
+ U32 int_format = GL_ALPHA;
+
// Hack!
sDetailScale = 1.f/gSavedSettings.getF32("RenderTerrainScale");
sDetailMode = gSavedSettings.getS32("RenderTerrainDetail");
mAlphaRampImagep = LLViewerTextureManager::getFetchedTextureFromFile("alpha_gradient.tga",
TRUE, LLViewerTexture::BOOST_UI,
LLViewerTexture::FETCHED_TEXTURE,
- GL_ALPHA8, GL_ALPHA,
+ format, int_format,
LLUUID("e97cf410-8e61-7005-ec06-629eba4cd1fb"));
//gGL.getTexUnit(0)->bind(mAlphaRampImagep.get());
@@ -77,7 +80,7 @@ LLDrawPoolTerrain::LLDrawPoolTerrain(LLViewerTexture *texturep) :
m2DAlphaRampImagep = LLViewerTextureManager::getFetchedTextureFromFile("alpha_gradient_2d.j2c",
TRUE, LLViewerTexture::BOOST_UI,
LLViewerTexture::FETCHED_TEXTURE,
- GL_ALPHA8, GL_ALPHA,
+ format, int_format,
LLUUID("38b86f85-2575-52a9-a531-23108d8da837"));
//gGL.getTexUnit(0)->bind(m2DAlphaRampImagep.get());
@@ -106,6 +109,10 @@ U32 LLDrawPoolTerrain::getVertexDataMask()
{
return LLVertexBuffer::MAP_VERTEX;
}
+ else if (LLGLSLShader::sCurBoundShaderPtr)
+ {
+ return VERTEX_DATA_MASK & ~(LLVertexBuffer::MAP_TEXCOORD2 | LLVertexBuffer::MAP_TEXCOORD3);
+ }
else
{
return VERTEX_DATA_MASK;
@@ -115,14 +122,7 @@ U32 LLDrawPoolTerrain::getVertexDataMask()
void LLDrawPoolTerrain::prerender()
{
mVertexShaderLevel = LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_ENVIRONMENT);
- if (mVertexShaderLevel > 0)
- {
- sDetailMode = 1;
- }
- else
- {
- sDetailMode = gSavedSettings.getS32("RenderTerrainDetail");
- }
+ sDetailMode = gSavedSettings.getS32("RenderTerrainDetail");
}
void LLDrawPoolTerrain::beginRenderPass( S32 pass )
@@ -132,7 +132,7 @@ void LLDrawPoolTerrain::beginRenderPass( S32 pass )
sShader = LLPipeline::sUnderWaterRender ?
&gTerrainWaterProgram :
- &gTerrainProgram;
+ &gTerrainProgram;
if (mVertexShaderLevel > 1 && sShader->mShaderLevel > 0)
{
@@ -143,7 +143,7 @@ void LLDrawPoolTerrain::beginRenderPass( S32 pass )
void LLDrawPoolTerrain::endRenderPass( S32 pass )
{
LLFastTimer t(FTM_RENDER_TERRAIN);
- LLFacePool::endRenderPass(pass);
+ //LLFacePool::endRenderPass(pass);
if (mVertexShaderLevel > 1 && sShader->mShaderLevel > 0) {
sShader->unbind();
@@ -174,6 +174,8 @@ void LLDrawPoolTerrain::render(S32 pass)
compp->mDetailTextures[i]->addTextureStats(1024.f*1024.f); // assume large pixel area
}
+ LLOverrideFaceColor override(this, 1.f, 1.f, 1.f, 1.f);
+
if (!gGLManager.mHasMultitexture)
{
// No multitexture, render simple land.
@@ -188,22 +190,27 @@ void LLDrawPoolTerrain::render(S32 pass)
}
LLGLSPipeline gls;
- LLOverrideFaceColor override(this, 1.f, 1.f, 1.f, 1.f);
-
+
if (mVertexShaderLevel > 1 && sShader->mShaderLevel > 0)
{
gPipeline.enableLightsDynamic();
+
renderFullShader();
}
else
{
gPipeline.enableLightsStatic();
- if (sDetailMode == 0){
+ if (sDetailMode == 0)
+ {
renderSimple();
- } else if (gGLManager.mNumTextureUnits < 4){
+ }
+ else if (gGLManager.mNumTextureUnits < 4)
+ {
renderFull2TU();
- } else {
+ }
+ else
+ {
renderFull4TU();
}
}
@@ -215,8 +222,11 @@ void LLDrawPoolTerrain::render(S32 pass)
{ //use fullbright shader for highlighting
LLGLSLShader* old_shader = sShader;
sShader->unbind();
- sShader = &gObjectFullbrightProgram;
+ sShader = &gHighlightProgram;
sShader->bind();
+ gGL.diffuseColor4f(1,1,1,1);
+ LLGLEnable polyOffset(GL_POLYGON_OFFSET_FILL);
+ glPolygonOffset(-1.0f, -1.0f);
renderOwnership();
sShader = old_shader;
sShader->bind();
@@ -310,16 +320,15 @@ void LLDrawPoolTerrain::renderFullShader()
gGL.getTexUnit(detail0)->bind(detail_texture0p);
gGL.getTexUnit(0)->activate();
- glEnable(GL_TEXTURE_GEN_S);
- glEnable(GL_TEXTURE_GEN_T);
- glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
- glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
+ LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr;
+ llassert(shader);
+
+ shader->uniform4fv("object_plane_s", 1, tp0.mV);
+ shader->uniform4fv("object_plane_t", 1, tp1.mV);
- glTexGenfv(GL_S, GL_OBJECT_PLANE, tp0.mV);
- glTexGenfv(GL_T, GL_OBJECT_PLANE, tp1.mV);
- glMatrixMode(GL_TEXTURE);
- glLoadIdentity();
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.loadIdentity();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
//
// detail texture 1
@@ -329,9 +338,9 @@ void LLDrawPoolTerrain::renderFullShader()
/// ALPHA TEXTURE COORDS 0:
gGL.getTexUnit(1)->activate();
- glMatrixMode(GL_TEXTURE);
- glLoadIdentity();
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.loadIdentity();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
// detail texture 2
//
@@ -341,10 +350,10 @@ void LLDrawPoolTerrain::renderFullShader()
gGL.getTexUnit(2)->activate();
/// ALPHA TEXTURE COORDS 1:
- glMatrixMode(GL_TEXTURE);
- glLoadIdentity();
- glTranslatef(-2.f, 0.f, 0.f);
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.loadIdentity();
+ gGL.translatef(-2.f, 0.f, 0.f);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
//
// detail texture 3
@@ -354,10 +363,10 @@ void LLDrawPoolTerrain::renderFullShader()
/// ALPHA TEXTURE COORDS 2:
gGL.getTexUnit(3)->activate();
- glMatrixMode(GL_TEXTURE);
- glLoadIdentity();
- glTranslatef(-1.f, 0.f, 0.f);
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.loadIdentity();
+ gGL.translatef(-1.f, 0.f, 0.f);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
//
// Alpha Ramp
@@ -378,38 +387,30 @@ void LLDrawPoolTerrain::renderFullShader()
gGL.getTexUnit(alpha_ramp)->unbind(LLTexUnit::TT_TEXTURE);
gGL.getTexUnit(4)->disable();
gGL.getTexUnit(4)->activate();
- glDisable(GL_TEXTURE_GEN_S);
- glDisable(GL_TEXTURE_GEN_T);
- glMatrixMode(GL_TEXTURE);
- glLoadIdentity();
- glMatrixMode(GL_MODELVIEW);
-
+
gGL.getTexUnit(detail3)->unbind(LLTexUnit::TT_TEXTURE);
gGL.getTexUnit(3)->disable();
gGL.getTexUnit(3)->activate();
- glDisable(GL_TEXTURE_GEN_S);
- glDisable(GL_TEXTURE_GEN_T);
- glMatrixMode(GL_TEXTURE);
- glLoadIdentity();
- glMatrixMode(GL_MODELVIEW);
+
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.loadIdentity();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.getTexUnit(detail2)->unbind(LLTexUnit::TT_TEXTURE);
gGL.getTexUnit(2)->disable();
gGL.getTexUnit(2)->activate();
- glDisable(GL_TEXTURE_GEN_S);
- glDisable(GL_TEXTURE_GEN_T);
- glMatrixMode(GL_TEXTURE);
- glLoadIdentity();
- glMatrixMode(GL_MODELVIEW);
+
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.loadIdentity();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.getTexUnit(detail1)->unbind(LLTexUnit::TT_TEXTURE);
gGL.getTexUnit(1)->disable();
gGL.getTexUnit(1)->activate();
- glDisable(GL_TEXTURE_GEN_S);
- glDisable(GL_TEXTURE_GEN_T);
- glMatrixMode(GL_TEXTURE);
- glLoadIdentity();
- glMatrixMode(GL_MODELVIEW);
+
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.loadIdentity();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
//----------------------------------------------------------------------------
// Restore Texture Unit 0 defaults
@@ -417,11 +418,9 @@ void LLDrawPoolTerrain::renderFullShader()
gGL.getTexUnit(detail0)->unbind(LLTexUnit::TT_TEXTURE);
gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);
gGL.getTexUnit(0)->activate();
- glDisable(GL_TEXTURE_GEN_S);
- glDisable(GL_TEXTURE_GEN_T);
- glMatrixMode(GL_TEXTURE);
- glLoadIdentity();
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.loadIdentity();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
}
void LLDrawPoolTerrain::renderFull4TU()
@@ -532,9 +531,9 @@ void LLDrawPoolTerrain::renderFull4TU()
gGL.getTexUnit(1)->activate();
// Set the texture matrix
- glMatrixMode(GL_TEXTURE);
- glLoadIdentity();
- glTranslatef(-2.f, 0.f, 0.f);
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.loadIdentity();
+ gGL.translatef(-2.f, 0.f, 0.f);
// Care about alpha only
gGL.getTexUnit(1)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_PREV_COLOR);
@@ -564,9 +563,9 @@ void LLDrawPoolTerrain::renderFull4TU()
gGL.getTexUnit(3)->activate();
// Set the texture matrix
- glMatrixMode(GL_TEXTURE);
- glLoadIdentity();
- glTranslatef(-1.f, 0.f, 0.f);
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.loadIdentity();
+ gGL.translatef(-1.f, 0.f, 0.f);
// Set alpha texture and do lighting modulation
gGL.getTexUnit(3)->setTextureColorBlend(LLTexUnit::TBO_MULT, LLTexUnit::TBS_PREV_COLOR, LLTexUnit::TBS_VERT_COLOR);
@@ -584,9 +583,9 @@ void LLDrawPoolTerrain::renderFull4TU()
gGL.getTexUnit(3)->disable();
gGL.getTexUnit(3)->activate();
- glMatrixMode(GL_TEXTURE);
- glLoadIdentity();
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.loadIdentity();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.getTexUnit(2)->unbind(LLTexUnit::TT_TEXTURE);
gGL.getTexUnit(2)->disable();
@@ -594,17 +593,17 @@ void LLDrawPoolTerrain::renderFull4TU()
glDisable(GL_TEXTURE_GEN_S);
glDisable(GL_TEXTURE_GEN_T);
- glMatrixMode(GL_TEXTURE);
- glLoadIdentity();
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.loadIdentity();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.getTexUnit(1)->unbind(LLTexUnit::TT_TEXTURE);
gGL.getTexUnit(1)->disable();
gGL.getTexUnit(1)->activate();
- glMatrixMode(GL_TEXTURE);
- glLoadIdentity();
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.loadIdentity();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
// Restore blend state
gGL.setSceneBlendType(LLRender::BT_ALPHA);
@@ -618,9 +617,9 @@ void LLDrawPoolTerrain::renderFull4TU()
glDisable(GL_TEXTURE_GEN_S);
glDisable(GL_TEXTURE_GEN_T);
- glMatrixMode(GL_TEXTURE);
- glLoadIdentity();
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.loadIdentity();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
}
@@ -712,9 +711,9 @@ void LLDrawPoolTerrain::renderFull2TU()
gGL.getTexUnit(0)->bind(m2DAlphaRampImagep);
// Set the texture matrix
- glMatrixMode(GL_TEXTURE);
- glLoadIdentity();
- glTranslatef(-1.f, 0.f, 0.f);
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.loadIdentity();
+ gGL.translatef(-1.f, 0.f, 0.f);
// Care about alpha only
gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_PREV_COLOR);
@@ -751,9 +750,9 @@ void LLDrawPoolTerrain::renderFull2TU()
gGL.getTexUnit(0)->activate();
gGL.getTexUnit(0)->bind(m2DAlphaRampImagep);
// Set the texture matrix
- glMatrixMode(GL_TEXTURE);
- glLoadIdentity();
- glTranslatef(-2.f, 0.f, 0.f);
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.loadIdentity();
+ gGL.translatef(-2.f, 0.f, 0.f);
// Care about alpha only
gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_PREV_COLOR);
@@ -791,9 +790,9 @@ void LLDrawPoolTerrain::renderFull2TU()
glDisable(GL_TEXTURE_GEN_S);
glDisable(GL_TEXTURE_GEN_T);
- glMatrixMode(GL_TEXTURE);
- glLoadIdentity();
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.loadIdentity();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
//----------------------------------------------------------------------------
// Restore Texture Unit 0 defaults
@@ -803,9 +802,9 @@ void LLDrawPoolTerrain::renderFull2TU()
glDisable(GL_TEXTURE_GEN_S);
glDisable(GL_TEXTURE_GEN_T);
- glMatrixMode(GL_TEXTURE);
- glLoadIdentity();
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.loadIdentity();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
}
@@ -829,13 +828,21 @@ void LLDrawPoolTerrain::renderSimple()
tp0.setVec(tscale, 0.f, 0.0f, -1.f*(origin_agent.mV[0]/256.f));
tp1.setVec(0.f, tscale, 0.0f, -1.f*(origin_agent.mV[1]/256.f));
- glEnable(GL_TEXTURE_GEN_S);
- glEnable(GL_TEXTURE_GEN_T);
- glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
- glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
- glTexGenfv(GL_S, GL_OBJECT_PLANE, tp0.mV);
- glTexGenfv(GL_T, GL_OBJECT_PLANE, tp1.mV);
-
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ sShader->uniform4fv("object_plane_s", 1, tp0.mV);
+ sShader->uniform4fv("object_plane_t", 1, tp1.mV);
+ }
+ else
+ {
+ glEnable(GL_TEXTURE_GEN_S);
+ glEnable(GL_TEXTURE_GEN_T);
+ glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
+ glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
+ glTexGenfv(GL_S, GL_OBJECT_PLANE, tp0.mV);
+ glTexGenfv(GL_T, GL_OBJECT_PLANE, tp1.mV);
+ }
+
gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_MULT, LLTexUnit::TBS_TEX_COLOR, LLTexUnit::TBS_VERT_COLOR);
drawLoop();
@@ -845,11 +852,14 @@ void LLDrawPoolTerrain::renderSimple()
gGL.getTexUnit(0)->activate();
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- glDisable(GL_TEXTURE_GEN_S);
- glDisable(GL_TEXTURE_GEN_T);
- glMatrixMode(GL_TEXTURE);
- glLoadIdentity();
- glMatrixMode(GL_MODELVIEW);
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ glDisable(GL_TEXTURE_GEN_S);
+ glDisable(GL_TEXTURE_GEN_T);
+ }
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.loadIdentity();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
}
@@ -880,11 +890,11 @@ void LLDrawPoolTerrain::renderOwnership()
// texture coordinates for pixel 256x256 is not 1,1. This makes the
// ownership map not line up with the selection. We address this with
// a texture matrix multiply.
- glMatrixMode(GL_TEXTURE);
- glPushMatrix();
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.pushMatrix();
const F32 TEXTURE_FUDGE = 257.f / 256.f;
- glScalef( TEXTURE_FUDGE, TEXTURE_FUDGE, 1.f );
+ gGL.scalef( TEXTURE_FUDGE, TEXTURE_FUDGE, 1.f );
for (std::vector<LLFace*>::iterator iter = mDrawFace.begin();
iter != mDrawFace.end(); iter++)
{
@@ -893,9 +903,9 @@ void LLDrawPoolTerrain::renderOwnership()
LLVertexBuffer::MAP_TEXCOORD0);
}
- glMatrixMode(GL_TEXTURE);
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.popMatrix();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
}
diff --git a/indra/newview/lldrawpoolterrain.h b/indra/newview/lldrawpoolterrain.h
index 3056da44d5..283ed87f1a 100644
--- a/indra/newview/lldrawpoolterrain.h
+++ b/indra/newview/lldrawpoolterrain.h
@@ -40,8 +40,7 @@ public:
LLVertexBuffer::MAP_TEXCOORD0 |
LLVertexBuffer::MAP_TEXCOORD1 |
LLVertexBuffer::MAP_TEXCOORD2 |
- LLVertexBuffer::MAP_TEXCOORD3 |
- LLVertexBuffer::MAP_COLOR
+ LLVertexBuffer::MAP_TEXCOORD3
};
virtual U32 getVertexDataMask();
diff --git a/indra/newview/lldrawpooltree.cpp b/indra/newview/lldrawpooltree.cpp
index f1198c9a8d..3165a3516c 100644
--- a/indra/newview/lldrawpooltree.cpp
+++ b/indra/newview/lldrawpooltree.cpp
@@ -62,24 +62,26 @@ void LLDrawPoolTree::prerender()
void LLDrawPoolTree::beginRenderPass(S32 pass)
{
LLFastTimer t(FTM_RENDER_TREES);
- gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.5f);
-
+
if (LLPipeline::sUnderWaterRender)
{
- shader = &gObjectSimpleWaterProgram;
+ shader = &gTreeWaterProgram;
}
else
{
- shader = &gObjectSimpleProgram;
+ shader = &gTreeProgram;
}
- if (gPipeline.canUseWindLightShadersOnObjects())
+ if (gPipeline.canUseVertexShaders())
{
shader->bind();
+ shader->setMinimumAlpha(0.5f);
+ gGL.diffuseColor4f(1,1,1,1);
}
else
{
gPipeline.enableLightsDynamic();
+ gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.5f);
}
}
@@ -92,27 +94,21 @@ void LLDrawPoolTree::render(S32 pass)
return;
}
- LLGLEnable test(GL_ALPHA_TEST);
+ LLGLState test(GL_ALPHA_TEST, LLGLSLShader::sNoFixedFunction ? 0 : 1);
LLOverrideFaceColor color(this, 1.f, 1.f, 1.f, 1.f);
- if (gSavedSettings.getBOOL("RenderAnimateTrees"))
- {
- renderTree();
- }
- else
+ gGL.getTexUnit(sDiffTex)->bind(mTexturep);
+
+ for (std::vector<LLFace*>::iterator iter = mDrawFace.begin();
+ iter != mDrawFace.end(); iter++)
{
- gGL.getTexUnit(sDiffTex)->bind(mTexturep);
-
- for (std::vector<LLFace*>::iterator iter = mDrawFace.begin();
- iter != mDrawFace.end(); iter++)
+ LLFace *face = *iter;
+ LLVertexBuffer* buff = face->getVertexBuffer();
+ if(buff)
{
- LLFace *face = *iter;
- if(face->mVertexBuffer.notNull())
- {
- face->mVertexBuffer->setBuffer(LLDrawPoolTree::VERTEX_DATA_MASK);
- face->mVertexBuffer->drawRange(LLRender::TRIANGLES, 0, face->mVertexBuffer->getRequestedVerts()-1, face->mVertexBuffer->getRequestedIndices(), 0);
- gPipeline.addTrianglesDrawn(face->mVertexBuffer->getRequestedIndices());
- }
+ buff->setBuffer(LLDrawPoolTree::VERTEX_DATA_MASK);
+ buff->drawRange(LLRender::TRIANGLES, 0, buff->getNumVerts()-1, buff->getNumIndices(), 0);
+ gPipeline.addTrianglesDrawn(buff->getNumIndices());
}
}
}
@@ -120,12 +116,16 @@ void LLDrawPoolTree::render(S32 pass)
void LLDrawPoolTree::endRenderPass(S32 pass)
{
LLFastTimer t(FTM_RENDER_TREES);
- gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
-
+
if (gPipeline.canUseWindLightShadersOnObjects())
{
shader->unbind();
}
+
+ if (mVertexShaderLevel <= 0)
+ {
+ gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
+ }
}
//============================================
@@ -134,10 +134,10 @@ void LLDrawPoolTree::endRenderPass(S32 pass)
void LLDrawPoolTree::beginDeferredPass(S32 pass)
{
LLFastTimer t(FTM_RENDER_TREES);
- gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.f);
shader = &gDeferredTreeProgram;
shader->bind();
+ shader->setMinimumAlpha(0.5f);
}
void LLDrawPoolTree::renderDeferred(S32 pass)
@@ -148,8 +148,7 @@ void LLDrawPoolTree::renderDeferred(S32 pass)
void LLDrawPoolTree::endDeferredPass(S32 pass)
{
LLFastTimer t(FTM_RENDER_TREES);
- gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
-
+
shader->unbind();
}
@@ -159,11 +158,12 @@ void LLDrawPoolTree::endDeferredPass(S32 pass)
void LLDrawPoolTree::beginShadowPass(S32 pass)
{
LLFastTimer t(FTM_SHADOW_TREE);
- gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.5f);
+
glPolygonOffset(gSavedSettings.getF32("RenderDeferredTreeShadowOffset"),
gSavedSettings.getF32("RenderDeferredTreeShadowBias"));
- gDeferredShadowProgram.bind();
+ gDeferredTreeShadowProgram.bind();
+ gDeferredTreeShadowProgram.setMinimumAlpha(0.5f);
}
void LLDrawPoolTree::renderShadow(S32 pass)
@@ -174,139 +174,10 @@ void LLDrawPoolTree::renderShadow(S32 pass)
void LLDrawPoolTree::endShadowPass(S32 pass)
{
LLFastTimer t(FTM_SHADOW_TREE);
- gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
-
+
glPolygonOffset(gSavedSettings.getF32("RenderDeferredSpotShadowOffset"),
gSavedSettings.getF32("RenderDeferredSpotShadowBias"));
-
- //gDeferredShadowProgram.unbind();
-}
-
-
-void LLDrawPoolTree::renderTree(BOOL selecting)
-{
- LLGLState normalize(GL_NORMALIZE, TRUE);
-
- // Bind the texture for this tree.
- gGL.getTexUnit(sDiffTex)->bind(mTexturep.get(), TRUE);
-
- U32 indices_drawn = 0;
-
- glMatrixMode(GL_MODELVIEW);
-
- for (std::vector<LLFace*>::iterator iter = mDrawFace.begin();
- iter != mDrawFace.end(); iter++)
- {
- LLFace *face = *iter;
- LLDrawable *drawablep = face->getDrawable();
-
- if (drawablep->isDead() || face->mVertexBuffer.isNull())
- {
- continue;
- }
-
- face->mVertexBuffer->setBuffer(LLDrawPoolTree::VERTEX_DATA_MASK);
- U16* indicesp = (U16*) face->mVertexBuffer->getIndicesPointer();
-
- // Render each of the trees
- LLVOTree *treep = (LLVOTree *)drawablep->getVObj().get();
-
- LLColor4U color(255,255,255,255);
-
- if (!selecting || treep->mGLName != 0)
- {
- if (selecting)
- {
- S32 name = treep->mGLName;
-
- color = LLColor4U((U8)(name >> 16), (U8)(name >> 8), (U8)name, 255);
- }
-
- gGLLastMatrix = NULL;
- glLoadMatrixd(gGLModelView);
- //glPushMatrix();
- F32 mat[16];
- for (U32 i = 0; i < 16; i++)
- mat[i] = (F32) gGLModelView[i];
-
- LLMatrix4 matrix(mat);
-
- // Translate to tree base HACK - adjustment in Z plants tree underground
- const LLVector3 &pos_agent = treep->getPositionAgent();
- //glTranslatef(pos_agent.mV[VX], pos_agent.mV[VY], pos_agent.mV[VZ] - 0.1f);
- LLMatrix4 trans_mat;
- trans_mat.setTranslation(pos_agent.mV[VX], pos_agent.mV[VY], pos_agent.mV[VZ] - 0.1f);
- trans_mat *= matrix;
-
- // Rotate to tree position and bend for current trunk/wind
- // Note that trunk stiffness controls the amount of bend at the trunk as
- // opposed to the crown of the tree
- //
- const F32 TRUNK_STIFF = 22.f;
-
- LLQuaternion rot =
- LLQuaternion(treep->mTrunkBend.magVec()*TRUNK_STIFF*DEG_TO_RAD, LLVector4(treep->mTrunkBend.mV[VX], treep->mTrunkBend.mV[VY], 0)) *
- LLQuaternion(90.f*DEG_TO_RAD, LLVector4(0,0,1)) *
- treep->getRotation();
-
- LLMatrix4 rot_mat(rot);
- rot_mat *= trans_mat;
-
- F32 radius = treep->getScale().magVec()*0.05f;
- LLMatrix4 scale_mat;
- scale_mat.mMatrix[0][0] =
- scale_mat.mMatrix[1][1] =
- scale_mat.mMatrix[2][2] = radius;
-
- scale_mat *= rot_mat;
-
- const F32 THRESH_ANGLE_FOR_BILLBOARD = 15.f;
- const F32 BLEND_RANGE_FOR_BILLBOARD = 3.f;
-
- F32 droop = treep->mDroop + 25.f*(1.f - treep->mTrunkBend.magVec());
-
- S32 stop_depth = 0;
- F32 app_angle = treep->getAppAngle()*LLVOTree::sTreeFactor;
- F32 alpha = 1.0;
- S32 trunk_LOD = LLVOTree::sMAX_NUM_TREE_LOD_LEVELS;
-
- for (S32 j = 0; j < 4; j++)
- {
-
- if (app_angle > LLVOTree::sLODAngles[j])
- {
- trunk_LOD = j;
- break;
- }
- }
- if(trunk_LOD >= LLVOTree::sMAX_NUM_TREE_LOD_LEVELS)
- {
- continue ; //do not render.
- }
-
- if (app_angle < (THRESH_ANGLE_FOR_BILLBOARD - BLEND_RANGE_FOR_BILLBOARD))
- {
- //
- // Draw only the billboard
- //
- // Only the billboard, can use closer to normal alpha func.
- stop_depth = -1;
- LLFacePool::LLOverrideFaceColor clr(this, color);
- indices_drawn += treep->drawBranchPipeline(scale_mat, indicesp, trunk_LOD, stop_depth, treep->mDepth, treep->mTrunkDepth, 1.0, treep->mTwist, droop, treep->mBranches, alpha);
- }
- else // if (app_angle > (THRESH_ANGLE_FOR_BILLBOARD + BLEND_RANGE_FOR_BILLBOARD))
- {
- //
- // Draw only the full geometry tree
- //
- //stop_depth = (app_angle < THRESH_ANGLE_FOR_RECURSION_REDUCTION);
- LLFacePool::LLOverrideFaceColor clr(this, color);
- indices_drawn += treep->drawBranchPipeline(scale_mat, indicesp, trunk_LOD, stop_depth, treep->mDepth, treep->mTrunkDepth, 1.0, treep->mTwist, droop, treep->mBranches, alpha);
- }
-
- //glPopMatrix();
- }
- }
+ gDeferredTreeShadowProgram.unbind();
}
BOOL LLDrawPoolTree::verify() const
diff --git a/indra/newview/lldrawpooltree.h b/indra/newview/lldrawpooltree.h
index ddb259bb82..e7e25453cf 100644
--- a/indra/newview/lldrawpooltree.h
+++ b/indra/newview/lldrawpooltree.h
@@ -68,9 +68,6 @@ public:
/*virtual*/ LLColor3 getDebugColor() const; // For AGP debug display
static S32 sDiffTex;
-
-private:
- void renderTree(BOOL selecting = FALSE);
};
#endif // LL_LLDRAWPOOLTREE_H
diff --git a/indra/newview/lldrawpoolwater.cpp b/indra/newview/lldrawpoolwater.cpp
index dc94924da4..4f6eaa5a5b 100644
--- a/indra/newview/lldrawpoolwater.cpp
+++ b/indra/newview/lldrawpoolwater.cpp
@@ -59,6 +59,8 @@ BOOL LLDrawPoolWater::sSkipScreenCopy = FALSE;
BOOL LLDrawPoolWater::sNeedsReflectionUpdate = TRUE;
BOOL LLDrawPoolWater::sNeedsDistortionUpdate = TRUE;
LLColor4 LLDrawPoolWater::sWaterFogColor = LLColor4(0.2f, 0.5f, 0.5f, 0.f);
+F32 LLDrawPoolWater::sWaterFogEnd = 0.f;
+
LLVector3 LLDrawPoolWater::sLightDir;
LLDrawPoolWater::LLDrawPoolWater() :
@@ -108,7 +110,7 @@ void LLDrawPoolWater::prerender()
// got rid of modulation by light color since it got a little too
// green at sunset and sl-57047 (underwater turns black at 8:00)
- sWaterFogColor = LLWaterParamManager::instance()->getFogColor();
+ sWaterFogColor = LLWaterParamManager::instance().getFogColor();
sWaterFogColor.mV[3] = 0;
}
@@ -219,7 +221,7 @@ void LLDrawPoolWater::render(S32 pass)
water_color.setVec(1.f, 1.f, 1.f, 0.5f*(1.f + up_dot));
}
- glColor4fv(water_color.mV);
+ gGL.diffuseColor4fv(water_color.mV);
// Automatically generate texture coords for detail map
glEnable(GL_TEXTURE_GEN_S); //texture unit 1
@@ -275,15 +277,15 @@ void LLDrawPoolWater::render(S32 pass)
gSky.mVOSkyp->getCubeMap()->enable(0);
gSky.mVOSkyp->getCubeMap()->bind();
- glMatrixMode(GL_TEXTURE);
- glLoadIdentity();
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.loadIdentity();
LLMatrix4 camera_mat = LLViewerCamera::getInstance()->getModelview();
LLMatrix4 camera_rot(camera_mat.getMat3());
camera_rot.invert();
- glLoadMatrixf((F32 *)camera_rot.mMatrix);
+ gGL.loadMatrix((F32 *)camera_rot.mMatrix);
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
LLOverrideFaceColor overrid(this, 1.f, 1.f, 1.f, 0.5f*up_dot);
gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
@@ -310,9 +312,9 @@ void LLDrawPoolWater::render(S32 pass)
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);
- glMatrixMode(GL_TEXTURE);
- glLoadIdentity();
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.loadIdentity();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
}
@@ -332,6 +334,21 @@ void LLDrawPoolWater::renderOpaqueLegacyWater()
{
LLVOSky *voskyp = gSky.mVOSkyp;
+ LLGLSLShader* shader = NULL;
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ if (LLPipeline::sUnderWaterRender)
+ {
+ shader = &gObjectSimpleNonIndexedTexGenWaterProgram;
+ }
+ else
+ {
+ shader = &gObjectSimpleNonIndexedTexGenProgram;
+ }
+
+ shader->bind();
+ }
+
stop_glerror();
// Depth sorting and write to depth buffer
@@ -354,10 +371,13 @@ void LLDrawPoolWater::renderOpaqueLegacyWater()
gGL.getTexUnit(0)->bind(mOpaqueWaterImagep);
// Automatically generate texture coords for water texture
- glEnable(GL_TEXTURE_GEN_S); //texture unit 0
- glEnable(GL_TEXTURE_GEN_T); //texture unit 0
- glTexGenf(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
- glTexGenf(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
+ if (!shader)
+ {
+ glEnable(GL_TEXTURE_GEN_S); //texture unit 0
+ glEnable(GL_TEXTURE_GEN_T); //texture unit 0
+ glTexGenf(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
+ glTexGenf(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
+ }
// Use the fact that we know all water faces are the same size
// to save some computation
@@ -380,10 +400,18 @@ void LLDrawPoolWater::renderOpaqueLegacyWater()
F32 tp0[4] = { 16.f / 256.f, 0.0f, 0.0f, offset };
F32 tp1[4] = { 0.0f, 16.f / 256.f, 0.0f, offset };
- glTexGenfv(GL_S, GL_OBJECT_PLANE, tp0);
- glTexGenfv(GL_T, GL_OBJECT_PLANE, tp1);
+ if (!shader)
+ {
+ glTexGenfv(GL_S, GL_OBJECT_PLANE, tp0);
+ glTexGenfv(GL_T, GL_OBJECT_PLANE, tp1);
+ }
+ else
+ {
+ shader->uniform4fv("object_plane_s", 1, tp0);
+ shader->uniform4fv("object_plane_t", 1, tp1);
+ }
- glColor3f(1.f, 1.f, 1.f);
+ gGL.diffuseColor3f(1.f, 1.f, 1.f);
for (std::vector<LLFace*>::iterator iter = mDrawFace.begin();
iter != mDrawFace.end(); iter++)
@@ -399,9 +427,12 @@ void LLDrawPoolWater::renderOpaqueLegacyWater()
stop_glerror();
- // Reset the settings back to expected values
- glDisable(GL_TEXTURE_GEN_S); //texture unit 0
- glDisable(GL_TEXTURE_GEN_T); //texture unit 0
+ if (!shader)
+ {
+ // Reset the settings back to expected values
+ glDisable(GL_TEXTURE_GEN_S); //texture unit 0
+ glDisable(GL_TEXTURE_GEN_T); //texture unit 0
+ }
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
@@ -527,7 +558,7 @@ void LLDrawPoolWater::shade()
//bind normal map
S32 bumpTex = shader->enableTexture(LLViewerShaderMgr::BUMP_MAP);
- LLWaterParamManager * param_mgr = LLWaterParamManager::instance();
+ LLWaterParamManager * param_mgr = &LLWaterParamManager::instance();
// change mWaterNormp if needed
if (mWaterNormp->getID() != param_mgr->getNormalMapID())
@@ -623,8 +654,6 @@ void LLDrawPoolWater::shade()
water_color.mV[3] = 0.9f;
}
- glColor4fv(water_color.mV);
-
{
LLGLEnable depth_clamp(gGLManager.mHasDepthClamp ? GL_DEPTH_CLAMP : 0);
LLGLDisable cullface(GL_CULL_FACE);
diff --git a/indra/newview/lldrawpoolwater.h b/indra/newview/lldrawpoolwater.h
index 99b541ca5a..aeeba179d6 100644
--- a/indra/newview/lldrawpoolwater.h
+++ b/indra/newview/lldrawpoolwater.h
@@ -49,6 +49,7 @@ public:
static LLVector3 sLightDir;
static LLColor4 sWaterFogColor;
+ static F32 sWaterFogEnd;
enum
{
diff --git a/indra/newview/lldrawpoolwlsky.cpp b/indra/newview/lldrawpoolwlsky.cpp
index eaa6aa7e37..caf15fe1cb 100644
--- a/indra/newview/lldrawpoolwlsky.cpp
+++ b/indra/newview/lldrawpoolwlsky.cpp
@@ -34,6 +34,8 @@
#include "llviewercamera.h"
#include "llimage.h"
#include "llwlparammanager.h"
+#include "llviewershadermgr.h"
+#include "llglslshader.h"
#include "llsky.h"
#include "llvowlsky.h"
#include "llviewerregion.h"
@@ -44,6 +46,8 @@ LLPointer<LLViewerTexture> LLDrawPoolWLSky::sCloudNoiseTexture = NULL;
LLPointer<LLImageRaw> LLDrawPoolWLSky::sCloudNoiseRawImage = NULL;
+static LLGLSLShader* cloud_shader = NULL;
+static LLGLSLShader* sky_shader = NULL;
LLDrawPoolWLSky::LLDrawPoolWLSky(void) :
@@ -58,15 +62,26 @@ LLDrawPoolWLSky::LLDrawPoolWLSky(void) :
llerrs << "Error: Failed to load cloud noise image " << cloudNoiseFilename << llendl;
}
- cloudNoiseFile->load(cloudNoiseFilename);
-
- sCloudNoiseRawImage = new LLImageRaw();
+ if(cloudNoiseFile->load(cloudNoiseFilename))
+ {
+ sCloudNoiseRawImage = new LLImageRaw();
- cloudNoiseFile->decode(sCloudNoiseRawImage, 0.0f);
+ if(cloudNoiseFile->decode(sCloudNoiseRawImage, 0.0f))
+ {
+ //debug use
+ lldebugs << "cloud noise raw image width: " << sCloudNoiseRawImage->getWidth() << " : height: " << sCloudNoiseRawImage->getHeight() << " : components: " <<
+ (S32)sCloudNoiseRawImage->getComponents() << " : data size: " << sCloudNoiseRawImage->getDataSize() << llendl ;
+ llassert_always(sCloudNoiseRawImage->getData()) ;
- sCloudNoiseTexture = LLViewerTextureManager::getLocalTexture(sCloudNoiseRawImage.get(), TRUE);
+ sCloudNoiseTexture = LLViewerTextureManager::getLocalTexture(sCloudNoiseRawImage.get(), TRUE);
+ }
+ else
+ {
+ sCloudNoiseRawImage = NULL ;
+ }
+ }
- LLWLParamManager::instance()->propagateParameters();
+ LLWLParamManager::getInstance()->propagateParameters();
}
LLDrawPoolWLSky::~LLDrawPoolWLSky()
@@ -83,64 +98,79 @@ LLViewerTexture *LLDrawPoolWLSky::getDebugTexture()
void LLDrawPoolWLSky::beginRenderPass( S32 pass )
{
+ sky_shader =
+ LLPipeline::sUnderWaterRender ?
+ &gObjectFullbrightNoColorWaterProgram :
+ &gWLSkyProgram;
+
+ cloud_shader =
+ LLPipeline::sUnderWaterRender ?
+ &gObjectFullbrightNoColorWaterProgram :
+ &gWLCloudProgram;
}
void LLDrawPoolWLSky::endRenderPass( S32 pass )
{
}
+void LLDrawPoolWLSky::beginDeferredPass(S32 pass)
+{
+ sky_shader = &gDeferredWLSkyProgram;
+ cloud_shader = &gDeferredWLCloudProgram;
+}
+
+void LLDrawPoolWLSky::endDeferredPass(S32 pass)
+{
+
+}
+
void LLDrawPoolWLSky::renderDome(F32 camHeightLocal, LLGLSLShader * shader) const
{
LLVector3 const & origin = LLViewerCamera::getInstance()->getOrigin();
llassert_always(NULL != shader);
- glPushMatrix();
+ gGL.pushMatrix();
//chop off translation
if (LLPipeline::sReflectionRender && origin.mV[2] > 256.f)
{
- glTranslatef(origin.mV[0], origin.mV[1], 256.f-origin.mV[2]*0.5f);
+ gGL.translatef(origin.mV[0], origin.mV[1], 256.f-origin.mV[2]*0.5f);
}
else
{
- glTranslatef(origin.mV[0], origin.mV[1], origin.mV[2]);
+ gGL.translatef(origin.mV[0], origin.mV[1], origin.mV[2]);
}
// the windlight sky dome works most conveniently in a coordinate system
// where Y is up, so permute our basis vectors accordingly.
- glRotatef(120.f, 1.f / F_SQRT3, 1.f / F_SQRT3, 1.f / F_SQRT3);
+ gGL.rotatef(120.f, 1.f / F_SQRT3, 1.f / F_SQRT3, 1.f / F_SQRT3);
- glScalef(0.333f, 0.333f, 0.333f);
+ gGL.scalef(0.333f, 0.333f, 0.333f);
- glTranslatef(0.f,-camHeightLocal, 0.f);
+ gGL.translatef(0.f,-camHeightLocal, 0.f);
// Draw WL Sky
shader->uniform3f("camPosLocal", 0.f, camHeightLocal, 0.f);
gSky.mVOWLSkyp->drawDome();
- glPopMatrix();
+ gGL.popMatrix();
}
void LLDrawPoolWLSky::renderSkyHaze(F32 camHeightLocal) const
{
if (gPipeline.canUseWindLightShaders() && gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_SKY))
{
- LLGLSLShader* shader =
- LLPipeline::sUnderWaterRender ?
- &gObjectSimpleWaterProgram :
- &gWLSkyProgram;
-
LLGLDisable blend(GL_BLEND);
- shader->bind();
+ sky_shader->bind();
/// Render the skydome
- renderDome(camHeightLocal, shader);
+ renderDome(camHeightLocal, sky_shader);
- shader->unbind();
+ sky_shader->unbind();
}
}
@@ -161,48 +191,57 @@ void LLDrawPoolWLSky::renderStars(void) const
// clamping and allow the star_alpha param to brighten the stars.
bool error;
LLColor4 star_alpha(LLColor4::black);
- star_alpha.mV[3] = LLWLParamManager::instance()->mCurParams.getFloat("star_brightness", error) / 2.f;
+ star_alpha.mV[3] = LLWLParamManager::getInstance()->mCurParams.getFloat("star_brightness", error) / 2.f;
llassert_always(!error);
gGL.getTexUnit(0)->bind(gSky.mVOSkyp->getBloomTex());
gGL.pushMatrix();
- glRotatef(gFrameTimeSeconds*0.01f, 0.f, 0.f, 1.f);
+ gGL.rotatef(gFrameTimeSeconds*0.01f, 0.f, 0.f, 1.f);
// gl_FragColor.rgb = gl_Color.rgb;
// gl_FragColor.a = gl_Color.a * star_alpha.a;
- gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_MULT, LLTexUnit::TBS_TEX_COLOR, LLTexUnit::TBS_VERT_COLOR);
- gGL.getTexUnit(0)->setTextureAlphaBlend(LLTexUnit::TBO_MULT_X2, LLTexUnit::TBS_CONST_ALPHA, LLTexUnit::TBS_TEX_ALPHA);
- glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, star_alpha.mV);
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gCustomAlphaProgram.bind();
+ gCustomAlphaProgram.uniform1f("custom_alpha", star_alpha.mV[3]);
+ }
+ else
+ {
+ gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_MULT, LLTexUnit::TBS_TEX_COLOR, LLTexUnit::TBS_VERT_COLOR);
+ gGL.getTexUnit(0)->setTextureAlphaBlend(LLTexUnit::TBO_MULT_X2, LLTexUnit::TBS_CONST_ALPHA, LLTexUnit::TBS_TEX_ALPHA);
+ glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, star_alpha.mV);
+ }
gSky.mVOWLSkyp->drawStars();
gGL.popMatrix();
-
- // and disable the combiner states
- gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
+
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gCustomAlphaProgram.unbind();
+ }
+ else
+ {
+ // and disable the combiner states
+ gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
+ }
}
void LLDrawPoolWLSky::renderSkyClouds(F32 camHeightLocal) const
{
- if (gPipeline.canUseWindLightShaders() && gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_CLOUDS))
+ if (gPipeline.canUseWindLightShaders() && gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_CLOUDS) && sCloudNoiseTexture.notNull())
{
- LLGLSLShader* shader =
- LLPipeline::sUnderWaterRender ?
- &gObjectSimpleWaterProgram :
- &gWLCloudProgram;
-
LLGLEnable blend(GL_BLEND);
- LLGLSBlendFunc blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
-
+ gGL.setSceneBlendType(LLRender::BT_ALPHA);
+
gGL.getTexUnit(0)->bind(sCloudNoiseTexture);
- shader->bind();
+ cloud_shader->bind();
/// Render the skydome
- renderDome(camHeightLocal, shader);
+ renderDome(camHeightLocal, cloud_shader);
- shader->unbind();
+ cloud_shader->unbind();
}
}
@@ -241,11 +280,69 @@ void LLDrawPoolWLSky::renderHeavenlyBodies()
color.mV[3] = llclamp(a, 0.f, 1.f);
+ if (gPipeline.canUseVertexShaders())
+ {
+ gHighlightProgram.bind();
+ }
+
LLFacePool::LLOverrideFaceColor color_override(this, color);
+
face->renderIndexed();
+
+ if (gPipeline.canUseVertexShaders())
+ {
+ gHighlightProgram.unbind();
+ }
}
}
+void LLDrawPoolWLSky::renderDeferred(S32 pass)
+{
+ if (!gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_SKY))
+ {
+ return;
+ }
+ LLFastTimer ftm(FTM_RENDER_WL_SKY);
+
+ const F32 camHeightLocal = LLWLParamManager::getInstance()->getDomeOffset() * LLWLParamManager::getInstance()->getDomeRadius();
+
+ LLGLSNoFog disableFog;
+ LLGLDepthTest depth(GL_TRUE, GL_FALSE);
+ LLGLDisable clip(GL_CLIP_PLANE0);
+
+ gGL.setColorMask(true, false);
+
+ LLGLSquashToFarClip far_clip(glh_get_current_projection());
+
+ renderSkyHaze(camHeightLocal);
+
+ LLVector3 const & origin = LLViewerCamera::getInstance()->getOrigin();
+ gGL.pushMatrix();
+
+
+ gGL.translatef(origin.mV[0], origin.mV[1], origin.mV[2]);
+
+ gDeferredStarProgram.bind();
+ // *NOTE: have to bind a texture here since register combiners blending in
+ // renderStars() requires something to be bound and we might as well only
+ // bind the moon's texture once.
+ gGL.getTexUnit(0)->bind(gSky.mVOSkyp->mFace[LLVOSky::FACE_MOON]->getTexture());
+
+ renderHeavenlyBodies();
+
+ renderStars();
+
+ gDeferredStarProgram.unbind();
+
+ gGL.popMatrix();
+
+ renderSkyClouds(camHeightLocal);
+
+ gGL.setColorMask(true, true);
+ //gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+
+}
+
void LLDrawPoolWLSky::render(S32 pass)
{
if (!gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_SKY))
@@ -254,7 +351,7 @@ void LLDrawPoolWLSky::render(S32 pass)
}
LLFastTimer ftm(FTM_RENDER_WL_SKY);
- const F32 camHeightLocal = LLWLParamManager::instance()->getDomeOffset() * LLWLParamManager::instance()->getDomeRadius();
+ const F32 camHeightLocal = LLWLParamManager::getInstance()->getDomeOffset() * LLWLParamManager::getInstance()->getDomeRadius();
LLGLSNoFog disableFog;
LLGLDepthTest depth(GL_TRUE, GL_FALSE);
@@ -265,9 +362,9 @@ void LLDrawPoolWLSky::render(S32 pass)
renderSkyHaze(camHeightLocal);
LLVector3 const & origin = LLViewerCamera::getInstance()->getOrigin();
- glPushMatrix();
+ gGL.pushMatrix();
- glTranslatef(origin.mV[0], origin.mV[1], origin.mV[2]);
+ gGL.translatef(origin.mV[0], origin.mV[1], origin.mV[2]);
// *NOTE: have to bind a texture here since register combiners blending in
// renderStars() requires something to be bound and we might as well only
@@ -279,7 +376,7 @@ void LLDrawPoolWLSky::render(S32 pass)
renderStars();
- glPopMatrix();
+ gGL.popMatrix();
renderSkyClouds(camHeightLocal);
@@ -314,5 +411,8 @@ void LLDrawPoolWLSky::cleanupGL()
//static
void LLDrawPoolWLSky::restoreGL()
{
- sCloudNoiseTexture = LLViewerTextureManager::getLocalTexture(sCloudNoiseRawImage.get(), TRUE);
+ if(sCloudNoiseRawImage.notNull())
+ {
+ sCloudNoiseTexture = LLViewerTextureManager::getLocalTexture(sCloudNoiseRawImage.get(), TRUE);
+ }
}
diff --git a/indra/newview/lldrawpoolwlsky.h b/indra/newview/lldrawpoolwlsky.h
index 8ca1ebb942..cd15c991ee 100644
--- a/indra/newview/lldrawpoolwlsky.h
+++ b/indra/newview/lldrawpoolwlsky.h
@@ -44,10 +44,10 @@ public:
/*virtual*/ BOOL isDead() { return FALSE; }
- /*virtual*/ S32 getNumPostDeferredPasses() { return getNumPasses(); }
- /*virtual*/ void beginPostDeferredPass(S32 pass) { beginRenderPass(pass); }
- /*virtual*/ void endPostDeferredPass(S32 pass) { endRenderPass(pass); }
- /*virtual*/ void renderPostDeferred(S32 pass) { render(pass); }
+ /*virtual*/ S32 getNumDeferredPasses() { return 1; }
+ /*virtual*/ void beginDeferredPass(S32 pass);
+ /*virtual*/ void endDeferredPass(S32 pass);
+ /*virtual*/ void renderDeferred(S32 pass);
/*virtual*/ LLViewerTexture *getDebugTexture();
/*virtual*/ void beginRenderPass( S32 pass );
diff --git a/indra/newview/lldriverparam.cpp b/indra/newview/lldriverparam.cpp
index 8f47d3c5e5..64eb11fc9b 100644
--- a/indra/newview/lldriverparam.cpp
+++ b/indra/newview/lldriverparam.cpp
@@ -139,7 +139,7 @@ void LLDriverParamInfo::toStream(std::ostream &out)
}
else
{
- llwarns << "could not get parameter " << driven.mDrivenID << " from avatar " << gAgentAvatarp << " for driver parameter " << getID() << llendl;
+ llwarns << "could not get parameter " << driven.mDrivenID << " from avatar " << gAgentAvatarp.get() << " for driver parameter " << getID() << llendl;
}
out << std::endl;
}
diff --git a/indra/newview/lldriverparam.h b/indra/newview/lldriverparam.h
index a0e45cf5e5..fb1b44458c 100644
--- a/indra/newview/lldriverparam.h
+++ b/indra/newview/lldriverparam.h
@@ -30,6 +30,7 @@
#include "llviewervisualparam.h"
#include "llwearabletype.h"
+class LLPhysicsMotion;
class LLVOAvatar;
class LLWearable;
@@ -76,6 +77,7 @@ protected:
class LLDriverParam : public LLViewerVisualParam
{
+ friend class LLPhysicsMotion; // physics motion needs to access driven params directly.
public:
LLDriverParam(LLVOAvatar *avatarp);
LLDriverParam(LLWearable *wearablep);
diff --git a/indra/newview/lldynamictexture.cpp b/indra/newview/lldynamictexture.cpp
index a3d2941114..a93b2b71de 100644
--- a/indra/newview/lldynamictexture.cpp
+++ b/indra/newview/lldynamictexture.cpp
@@ -40,6 +40,8 @@
#include "llvertexbuffer.h"
#include "llviewerdisplay.h"
#include "llrender.h"
+#include "pipeline.h"
+#include "llglslshader.h"
// static
LLViewerDynamicTexture::instance_list_t LLViewerDynamicTexture::sInstances[ LLViewerDynamicTexture::ORDER_COUNT ];
@@ -123,8 +125,16 @@ BOOL LLViewerDynamicTexture::render()
//-----------------------------------------------------------------------------
void LLViewerDynamicTexture::preRender(BOOL clear_depth)
{
- {
- // force rendering to on-screen portion of frame buffer
+ //only images up to 512x512 are supported
+ llassert(mFullHeight <= 512);
+ llassert(mFullWidth <= 512);
+
+ if (gGLManager.mHasFramebufferObject && gPipeline.mWaterDis.isComplete())
+ { //using offscreen render target, just use the bottom left corner
+ mOrigin.set(0, 0);
+ }
+ else
+ { // force rendering to on-screen portion of frame buffer
LLCoordScreen window_pos;
gViewerWindow->getWindow()->getPosition( &window_pos );
mOrigin.set(0, gViewerWindow->getWindowHeightRaw() - mFullHeight); // top left corner
@@ -138,9 +148,9 @@ void LLViewerDynamicTexture::preRender(BOOL clear_depth)
mOrigin.mY += window_pos.mY;
mOrigin.mY = llmax(mOrigin.mY, 0) ;
}
-
- gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
}
+
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
// Set up camera
LLViewerCamera* camera = LLViewerCamera::getInstance();
mCamera.setOrigin(*camera);
@@ -177,10 +187,6 @@ void LLViewerDynamicTexture::postRender(BOOL success)
generateGLTexture() ;
}
- if(gGLManager.mDebugGPU)
- {
- LLGLState::dumpStates() ;
- }
success = mGLTexturep->setSubImageFromFrameBuffer(0, 0, mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight);
}
}
@@ -205,11 +211,21 @@ void LLViewerDynamicTexture::postRender(BOOL success)
BOOL LLViewerDynamicTexture::updateAllInstances()
{
sNumRenders = 0;
- if (gGLManager.mIsDisabled)
+ if (gGLManager.mIsDisabled || LLPipeline::sMemAllocationThrottled)
{
return TRUE;
}
+ bool use_fbo = gGLManager.mHasFramebufferObject && gPipeline.mWaterDis.isComplete();
+
+ if (use_fbo)
+ {
+ gPipeline.mWaterDis.bindTarget();
+ }
+
+ LLGLSLShader::bindNoShader();
+ LLVertexBuffer::unbind();
+
BOOL result = FALSE;
BOOL ret = FALSE ;
for( S32 order = 0; order < ORDER_COUNT; order++ )
@@ -220,12 +236,6 @@ BOOL LLViewerDynamicTexture::updateAllInstances()
LLViewerDynamicTexture *dynamicTexture = *iter;
if (dynamicTexture->needsRender())
{
- if(gGLManager.mDebugGPU)
- {
- llinfos << "class type: " << (S32)dynamicTexture->getType() << llendl;
- LLGLState::dumpStates() ;
- }
-
glClear(GL_DEPTH_BUFFER_BIT);
gDepthDirty = TRUE;
@@ -246,6 +256,11 @@ BOOL LLViewerDynamicTexture::updateAllInstances()
}
}
+ if (use_fbo)
+ {
+ gPipeline.mWaterDis.flush();
+ }
+
return ret;
}
diff --git a/indra/newview/llenvmanager.cpp b/indra/newview/llenvmanager.cpp
new file mode 100644
index 0000000000..86fe6754dc
--- /dev/null
+++ b/indra/newview/llenvmanager.cpp
@@ -0,0 +1,678 @@
+/**
+ * @file llenvmanager.cpp
+ * @brief Implementation of classes managing WindLight and water settings.
+ *
+ * $LicenseInfo:firstyear=2009&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llenvmanager.h"
+
+#include "llagent.h"
+#include "lldaycyclemanager.h"
+#include "llviewercontrol.h" // for gSavedSettings
+#include "llviewerregion.h"
+#include "llwaterparammanager.h"
+#include "llwlhandlers.h"
+#include "llwlparammanager.h"
+
+std::string LLEnvPrefs::getWaterPresetName() const
+{
+ if (mWaterPresetName.empty())
+ {
+ llwarns << "Water preset name is empty" << llendl;
+ }
+
+ return mWaterPresetName;
+}
+
+std::string LLEnvPrefs::getSkyPresetName() const
+{
+ if (mSkyPresetName.empty())
+ {
+ llwarns << "Sky preset name is empty" << llendl;
+ }
+
+ return mSkyPresetName;
+}
+
+std::string LLEnvPrefs::getDayCycleName() const
+{
+ if (mDayCycleName.empty())
+ {
+ llwarns << "Day cycle name is empty" << llendl;
+ }
+
+ return mDayCycleName;
+}
+
+void LLEnvPrefs::setUseRegionSettings(bool val)
+{
+ mUseRegionSettings = val;
+}
+
+void LLEnvPrefs::setUseWaterPreset(const std::string& name)
+{
+ mUseRegionSettings = false;
+ mWaterPresetName = name;
+}
+
+void LLEnvPrefs::setUseSkyPreset(const std::string& name)
+{
+ mUseRegionSettings = false;
+ mUseDayCycle = false;
+ mSkyPresetName = name;
+}
+
+void LLEnvPrefs::setUseDayCycle(const std::string& name)
+{
+ mUseRegionSettings = false;
+ mUseDayCycle = true;
+ mDayCycleName = name;
+}
+
+//=============================================================================
+LLEnvManagerNew::LLEnvManagerNew()
+{
+ mInterpNextChangeMessage = true;
+
+ // Set default environment settings.
+ mUserPrefs.mUseRegionSettings = true;
+ mUserPrefs.mUseDayCycle = true;
+ mUserPrefs.mWaterPresetName = "Default";
+ mUserPrefs.mSkyPresetName = "Default";
+ mUserPrefs.mDayCycleName = "Default";
+}
+
+bool LLEnvManagerNew::getUseRegionSettings() const
+{
+ return mUserPrefs.getUseRegionSettings();
+}
+
+bool LLEnvManagerNew::getUseDayCycle() const
+{
+ return mUserPrefs.getUseDayCycle();
+}
+
+bool LLEnvManagerNew::getUseFixedSky() const
+{
+ return mUserPrefs.getUseFixedSky();
+}
+
+std::string LLEnvManagerNew::getWaterPresetName() const
+{
+ return mUserPrefs.getWaterPresetName();
+}
+
+std::string LLEnvManagerNew::getSkyPresetName() const
+{
+ return mUserPrefs.getSkyPresetName();
+}
+
+std::string LLEnvManagerNew::getDayCycleName() const
+{
+ return mUserPrefs.getDayCycleName();
+}
+
+const LLEnvironmentSettings& LLEnvManagerNew::getRegionSettings() const
+{
+ return !mNewRegionPrefs.isEmpty() ? mNewRegionPrefs : mCachedRegionPrefs;
+}
+
+void LLEnvManagerNew::setRegionSettings(const LLEnvironmentSettings& new_settings)
+{
+ // Set region settings override that will be used locally
+ // until user either uploads the changes or goes to another region.
+ mNewRegionPrefs = new_settings;
+}
+
+bool LLEnvManagerNew::usePrefs()
+{
+ LL_DEBUGS("Windlight") << "Displaying preferred environment" << LL_ENDL;
+ updateManagersFromPrefs(false);
+ return true;
+}
+
+bool LLEnvManagerNew::useDefaults()
+{
+ bool rslt;
+
+ rslt = useDefaultWater();
+ rslt &= useDefaultSky();
+
+ return rslt;
+}
+
+bool LLEnvManagerNew::useRegionSettings()
+{
+ bool rslt;
+
+ rslt = useRegionSky();
+ rslt &= useRegionWater();
+
+ return rslt;
+}
+
+bool LLEnvManagerNew::useWaterPreset(const std::string& name)
+{
+ LL_DEBUGS("Windlight") << "Displaying water preset " << name << LL_ENDL;
+ LLWaterParamManager& water_mgr = LLWaterParamManager::instance();
+ bool rslt = water_mgr.getParamSet(name, water_mgr.mCurParams);
+ llassert(rslt == true);
+ return rslt;
+}
+
+bool LLEnvManagerNew::useWaterParams(const LLSD& params)
+{
+ LL_DEBUGS("Windlight") << "Displaying water params" << LL_ENDL;
+ LLWaterParamManager::instance().mCurParams.setAll(params);
+ return true;
+}
+
+bool LLEnvManagerNew::useSkyPreset(const std::string& name)
+{
+ LLWLParamManager& sky_mgr = LLWLParamManager::instance();
+ LLWLParamSet param_set;
+
+ if (!sky_mgr.getParamSet(LLWLParamKey(name, LLEnvKey::SCOPE_LOCAL), param_set))
+ {
+ llwarns << "No sky preset named " << name << llendl;
+ return false;
+ }
+
+ LL_DEBUGS("Windlight") << "Displaying sky preset " << name << LL_ENDL;
+ sky_mgr.applySkyParams(param_set.getAll());
+ return true;
+}
+
+bool LLEnvManagerNew::useSkyParams(const LLSD& params)
+{
+ LL_DEBUGS("Windlight") << "Displaying sky params" << LL_ENDL;
+ LLWLParamManager::instance().applySkyParams(params);
+ return true;
+}
+
+bool LLEnvManagerNew::useDayCycle(const std::string& name, LLEnvKey::EScope scope)
+{
+ LLSD params;
+
+ if (scope == LLEnvKey::SCOPE_REGION)
+ {
+ LL_DEBUGS("Windlight") << "Displaying region day cycle " << name << LL_ENDL;
+ params = getRegionSettings().getWLDayCycle();
+ }
+ else
+ {
+ LL_DEBUGS("Windlight") << "Displaying local day cycle " << name << LL_ENDL;
+
+ if (!LLDayCycleManager::instance().getPreset(name, params))
+ {
+ llwarns << "No day cycle named " << name << llendl;
+ return false;
+ }
+ }
+
+ bool rslt = LLWLParamManager::instance().applyDayCycleParams(params, scope);
+ llassert(rslt == true);
+ return rslt;
+}
+
+bool LLEnvManagerNew::useDayCycleParams(const LLSD& params, LLEnvKey::EScope scope, F32 time /* = 0.5*/)
+{
+ LL_DEBUGS("Windlight") << "Displaying day cycle params" << LL_ENDL;
+ return LLWLParamManager::instance().applyDayCycleParams(params, scope);
+}
+
+void LLEnvManagerNew::setUseRegionSettings(bool val)
+{
+ mUserPrefs.setUseRegionSettings(val);
+ saveUserPrefs();
+ updateManagersFromPrefs(false);
+}
+
+void LLEnvManagerNew::setUseWaterPreset(const std::string& name)
+{
+ // *TODO: make sure the preset exists.
+ if (name.empty())
+ {
+ llwarns << "Empty water preset name passed" << llendl;
+ return;
+ }
+
+ mUserPrefs.setUseWaterPreset(name);
+ saveUserPrefs();
+ updateManagersFromPrefs(false);
+}
+
+void LLEnvManagerNew::setUseSkyPreset(const std::string& name)
+{
+ // *TODO: make sure the preset exists.
+ if (name.empty())
+ {
+ llwarns << "Empty sky preset name passed" << llendl;
+ return;
+ }
+
+ mUserPrefs.setUseSkyPreset(name);
+ saveUserPrefs();
+ updateManagersFromPrefs(false);
+}
+
+void LLEnvManagerNew::setUseDayCycle(const std::string& name)
+{
+ if (!LLDayCycleManager::instance().presetExists(name))
+ {
+ llwarns << "Invalid day cycle name passed" << llendl;
+ return;
+ }
+
+ mUserPrefs.setUseDayCycle(name);
+ saveUserPrefs();
+ updateManagersFromPrefs(false);
+}
+
+void LLEnvManagerNew::loadUserPrefs()
+{
+ // operate on members directly to avoid side effects
+ mUserPrefs.mWaterPresetName = gSavedSettings.getString("WaterPresetName");
+ mUserPrefs.mSkyPresetName = gSavedSettings.getString("SkyPresetName");
+ mUserPrefs.mDayCycleName = gSavedSettings.getString("DayCycleName");
+
+ mUserPrefs.mUseRegionSettings = gSavedSettings.getBOOL("UseEnvironmentFromRegion");
+ mUserPrefs.mUseDayCycle = gSavedSettings.getBOOL("UseDayCycle");
+}
+
+void LLEnvManagerNew::saveUserPrefs()
+{
+ gSavedSettings.setString("WaterPresetName", getWaterPresetName());
+ gSavedSettings.setString("SkyPresetName", getSkyPresetName());
+ gSavedSettings.setString("DayCycleName", getDayCycleName());
+
+ gSavedSettings.setBOOL("UseEnvironmentFromRegion", getUseRegionSettings());
+ gSavedSettings.setBOOL("UseDayCycle", getUseDayCycle());
+
+ mUsePrefsChangeSignal();
+}
+
+void LLEnvManagerNew::setUserPrefs(
+ const std::string& water_preset,
+ const std::string& sky_preset,
+ const std::string& day_cycle_preset,
+ bool use_fixed_sky,
+ bool use_region_settings)
+{
+ // operate on members directly to avoid side effects
+ mUserPrefs.mWaterPresetName = water_preset;
+ mUserPrefs.mSkyPresetName = sky_preset;
+ mUserPrefs.mDayCycleName = day_cycle_preset;
+
+ mUserPrefs.mUseRegionSettings = use_region_settings;
+ mUserPrefs.mUseDayCycle = !use_fixed_sky;
+
+ saveUserPrefs();
+ updateManagersFromPrefs(false);
+}
+
+void LLEnvManagerNew::dumpUserPrefs()
+{
+ LL_DEBUGS("Windlight") << "WaterPresetName: " << gSavedSettings.getString("WaterPresetName") << LL_ENDL;
+ LL_DEBUGS("Windlight") << "SkyPresetName: " << gSavedSettings.getString("SkyPresetName") << LL_ENDL;
+ LL_DEBUGS("Windlight") << "DayCycleName: " << gSavedSettings.getString("DayCycleName") << LL_ENDL;
+
+ LL_DEBUGS("Windlight") << "UseEnvironmentFromRegion: " << gSavedSettings.getBOOL("UseEnvironmentFromRegion") << LL_ENDL;
+ LL_DEBUGS("Windlight") << "UseDayCycle: " << gSavedSettings.getBOOL("UseDayCycle") << LL_ENDL;
+}
+
+void LLEnvManagerNew::dumpPresets()
+{
+ const LLEnvironmentSettings& region_settings = getRegionSettings();
+ std::string region_name = gAgent.getRegion() ? gAgent.getRegion()->getName() : "Unknown region";
+
+ // Dump water presets.
+ LL_DEBUGS("Windlight") << "Waters:" << LL_ENDL;
+ if (region_settings.getWaterParams().size() != 0)
+ {
+ LL_DEBUGS("Windlight") << " - " << region_name << LL_ENDL;
+ }
+ LLWaterParamManager::preset_name_list_t water_presets;
+ LLWaterParamManager::instance().getPresetNames(water_presets);
+ for (LLWaterParamManager::preset_name_list_t::const_iterator it = water_presets.begin(); it != water_presets.end(); ++it)
+ {
+ LL_DEBUGS("Windlight") << " - " << *it << LL_ENDL;
+ }
+
+ // Dump sky presets.
+ LL_DEBUGS("Windlight") << "Skies:" << LL_ENDL;
+ LLWLParamManager::preset_key_list_t sky_preset_keys;
+ LLWLParamManager::instance().getPresetKeys(sky_preset_keys);
+ for (LLWLParamManager::preset_key_list_t::const_iterator it = sky_preset_keys.begin(); it != sky_preset_keys.end(); ++it)
+ {
+ std::string preset_name = it->name;
+ std::string item_title;
+
+ if (it->scope == LLEnvKey::SCOPE_LOCAL) // local preset
+ {
+ item_title = preset_name;
+ }
+ else // region preset
+ {
+ item_title = preset_name + " (" + region_name + ")";
+ }
+ LL_DEBUGS("Windlight") << " - " << item_title << LL_ENDL;
+ }
+
+ // Dump day cycles.
+ LL_DEBUGS("Windlight") << "Days:" << LL_ENDL;
+ const LLSD& cur_region_dc = region_settings.getWLDayCycle();
+ if (cur_region_dc.size() != 0)
+ {
+ LL_DEBUGS("Windlight") << " - " << region_name << LL_ENDL;
+ }
+ LLDayCycleManager::preset_name_list_t days;
+ LLDayCycleManager::instance().getPresetNames(days);
+ for (LLDayCycleManager::preset_name_list_t::const_iterator it = days.begin(); it != days.end(); ++it)
+ {
+ LL_DEBUGS("Windlight") << " - " << *it << LL_ENDL;
+ }
+}
+
+void LLEnvManagerNew::requestRegionSettings()
+{
+ LLEnvironmentRequest::initiate();
+}
+
+bool LLEnvManagerNew::sendRegionSettings(const LLEnvironmentSettings& new_settings)
+{
+ LLSD metadata;
+
+ metadata["regionID"] = gAgent.getRegion()->getRegionID();
+ // add last received update ID to outbound message so simulator can handle concurrent updates
+ metadata["messageID"] = mLastReceivedID;
+
+ return LLEnvironmentApply::initiateRequest(new_settings.makePacket(metadata));
+}
+
+boost::signals2::connection LLEnvManagerNew::setPreferencesChangeCallback(const prefs_change_signal_t::slot_type& cb)
+{
+ return mUsePrefsChangeSignal.connect(cb);
+}
+
+boost::signals2::connection LLEnvManagerNew::setRegionSettingsChangeCallback(const region_settings_change_signal_t::slot_type& cb)
+{
+ return mRegionSettingsChangeSignal.connect(cb);
+}
+
+boost::signals2::connection LLEnvManagerNew::setRegionChangeCallback(const region_change_signal_t::slot_type& cb)
+{
+ return mRegionChangeSignal.connect(cb);
+}
+
+boost::signals2::connection LLEnvManagerNew::setRegionSettingsAppliedCallback(const region_settings_applied_signal_t::slot_type& cb)
+{
+ return mRegionSettingsAppliedSignal.connect(cb);
+}
+
+// static
+bool LLEnvManagerNew::canEditRegionSettings()
+{
+ LLViewerRegion* region = gAgent.getRegion();
+ BOOL owner_or_god = gAgent.isGodlike() || (region && region->getOwner() == gAgent.getID());
+ BOOL owner_or_god_or_manager = owner_or_god || (region && region->isEstateManager());
+
+ LL_DEBUGS("Windlight") << "Can edit region settings: " << (bool) owner_or_god_or_manager << LL_ENDL;
+ return owner_or_god_or_manager;
+}
+
+// static
+const std::string LLEnvManagerNew::getScopeString(LLEnvKey::EScope scope)
+{
+ switch(scope)
+ {
+ case LLEnvKey::SCOPE_LOCAL:
+ return LLTrans::getString("LocalSettings");
+ case LLEnvKey::SCOPE_REGION:
+ return LLTrans::getString("RegionSettings");
+ default:
+ return " (?)";
+ }
+}
+
+void LLEnvManagerNew::onRegionCrossing()
+{
+ LL_DEBUGS("Windlight") << "Crossed region" << LL_ENDL;
+ onRegionChange(true);
+}
+
+void LLEnvManagerNew::onTeleport()
+{
+ LL_DEBUGS("Windlight") << "Teleported" << LL_ENDL;
+ onRegionChange(false);
+}
+
+void LLEnvManagerNew::onRegionSettingsResponse(const LLSD& content)
+{
+ // If the message was valid, grab the UUID from it and save it for next outbound update message.
+ mLastReceivedID = content[0]["messageID"].asUUID();
+
+ // Refresh cached region settings.
+ LL_DEBUGS("Windlight") << "Caching region environment settings: " << content << LL_ENDL;
+ F32 sun_hour = 0; // *TODO
+ LLEnvironmentSettings new_settings(content[1], content[2], content[3], sun_hour);
+ mCachedRegionPrefs = new_settings;
+
+ // Load region sky presets.
+ LLWLParamManager::instance().refreshRegionPresets();
+
+ // If using server settings, update managers.
+ if (getUseRegionSettings())
+ {
+ updateManagersFromPrefs(mInterpNextChangeMessage);
+ }
+
+ // Let interested parties know about the region settings update.
+ mRegionSettingsChangeSignal();
+
+ // reset
+ mInterpNextChangeMessage = false;
+}
+
+void LLEnvManagerNew::onRegionSettingsApplyResponse(bool ok)
+{
+ LL_DEBUGS("Windlight") << "Applying region settings " << (ok ? "succeeded" : "failed") << LL_ENDL;
+
+ // Clear locally modified region settings because they have just been uploaded.
+ mNewRegionPrefs.clear();
+
+ mRegionSettingsAppliedSignal(ok);
+}
+
+//-- private methods ----------------------------------------------------------
+
+// virtual
+void LLEnvManagerNew::initSingleton()
+{
+ LL_DEBUGS("Windlight") << "Initializing LLEnvManagerNew" << LL_ENDL;
+
+ loadUserPrefs();
+}
+
+void LLEnvManagerNew::updateSkyFromPrefs()
+{
+ bool success = true;
+
+ // Sync sky with user prefs.
+ if (getUseRegionSettings()) // apply region-wide settings
+ {
+ success = useRegionSky();
+ }
+ else // apply user-specified settings
+ {
+ if (getUseDayCycle())
+ {
+ success = useDayCycle(getDayCycleName(), LLEnvKey::SCOPE_LOCAL);
+ }
+ else
+ {
+ success = useSkyPreset(getSkyPresetName());
+ }
+ }
+
+ // If something went wrong, fall back to defaults.
+ if (!success)
+ {
+ // *TODO: fix user prefs
+ useDefaultSky();
+ }
+}
+
+void LLEnvManagerNew::updateWaterFromPrefs(bool interpolate)
+{
+ LLWaterParamManager& water_mgr = LLWaterParamManager::instance();
+ LLSD target_water_params;
+
+ // Determine new water settings based on user prefs.
+
+ {
+ // Fall back to default water.
+ LLWaterParamSet default_water;
+ water_mgr.getParamSet("Default", default_water);
+ target_water_params = default_water.getAll();
+ }
+
+ if (getUseRegionSettings())
+ {
+ // *TODO: make sure whether region settings belong to the current region?
+ const LLSD& region_water_params = getRegionSettings().getWaterParams();
+ if (region_water_params.size() != 0) // region has no water settings
+ {
+ LL_DEBUGS("Windlight") << "Applying region water" << LL_ENDL;
+ target_water_params = region_water_params;
+ }
+ else
+ {
+ LL_DEBUGS("Windlight") << "Applying default water" << LL_ENDL;
+ }
+ }
+ else
+ {
+ std::string water = getWaterPresetName();
+ LL_DEBUGS("Windlight") << "Applying water preset [" << water << "]" << LL_ENDL;
+ LLWaterParamSet params;
+ if (!water_mgr.getParamSet(water, params))
+ {
+ llwarns << "No water preset named " << water << ", falling back to defaults" << llendl;
+ water_mgr.getParamSet("Default", params);
+
+ // *TODO: Fix user preferences accordingly.
+ }
+ target_water_params = params.getAll();
+ }
+
+ // Sync water with user prefs.
+ water_mgr.applyParams(target_water_params, interpolate);
+}
+
+void LLEnvManagerNew::updateManagersFromPrefs(bool interpolate)
+{
+ // Apply water settings.
+ updateWaterFromPrefs(interpolate);
+
+ // Apply sky settings.
+ updateSkyFromPrefs();
+}
+
+bool LLEnvManagerNew::useRegionSky()
+{
+ const LLEnvironmentSettings& region_settings = getRegionSettings();
+
+ // If region is set to defaults,
+ if (region_settings.getSkyMap().size() == 0)
+ {
+ // well... apply the default sky settings.
+ useDefaultSky();
+ return true;
+ }
+
+ // *TODO: Support fixed sky from region.
+
+ // Otherwise apply region day cycle.
+ LL_DEBUGS("Windlight") << "Applying region sky" << LL_ENDL;
+ return useDayCycleParams(
+ region_settings.getWLDayCycle(),
+ LLEnvKey::SCOPE_REGION,
+ region_settings.getDayTime());
+}
+
+bool LLEnvManagerNew::useRegionWater()
+{
+ const LLEnvironmentSettings& region_settings = getRegionSettings();
+ const LLSD& region_water = region_settings.getWaterParams();
+
+ // If region is set to defaults,
+ if (region_water.size() == 0)
+ {
+ // well... apply the default water settings.
+ return useDefaultWater();
+ }
+
+ // Otherwise apply region water.
+ LL_DEBUGS("Windlight") << "Applying region sky" << LL_ENDL;
+ return useWaterParams(region_water);
+}
+
+bool LLEnvManagerNew::useDefaultSky()
+{
+ return useDayCycle("Default", LLEnvKey::SCOPE_LOCAL);
+}
+
+bool LLEnvManagerNew::useDefaultWater()
+{
+ return useWaterPreset("Default");
+}
+
+
+void LLEnvManagerNew::onRegionChange(bool interpolate)
+{
+ // Avoid duplicating region setting requests
+ // by checking whether the region is actually changing.
+ LLViewerRegion* regionp = gAgent.getRegion();
+ LLUUID region_uuid = regionp ? regionp->getRegionID() : LLUUID::null;
+ if (region_uuid == mCurRegionUUID)
+ {
+ return;
+ }
+
+ // Clear locally modified region settings.
+ mNewRegionPrefs.clear();
+
+ // *TODO: clear environment settings of the previous region?
+
+ // Request environment settings of the new region.
+ LL_DEBUGS("Windlight") << "New viewer region: " << region_uuid << LL_ENDL;
+ mCurRegionUUID = region_uuid;
+ mInterpNextChangeMessage = interpolate;
+ requestRegionSettings();
+
+ // Let interested parties know agent region has been changed.
+ mRegionChangeSignal();
+}
diff --git a/indra/newview/llenvmanager.h b/indra/newview/llenvmanager.h
new file mode 100644
index 0000000000..ad56761bc7
--- /dev/null
+++ b/indra/newview/llenvmanager.h
@@ -0,0 +1,277 @@
+/**
+ * @file llenvmanager.h
+ * @brief Declaration of classes managing WindLight and water settings.
+ *
+ * $LicenseInfo:firstyear=2009&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLENVMANAGER_H
+#define LL_LLENVMANAGER_H
+
+#include "llmemory.h"
+#include "llsd.h"
+
+class LLWLParamManager;
+class LLWaterParamManager;
+class LLWLAnimator;
+
+// generic key
+struct LLEnvKey
+{
+public:
+ // Note: enum ordering is important; for example, a region-level floater (1) will see local and region (all values that are <=)
+ typedef enum e_scope
+ {
+ SCOPE_LOCAL, // 0
+ SCOPE_REGION//, // 1
+ // SCOPE_ESTATE, // 2
+ // etc.
+ } EScope;
+};
+
+class LLEnvironmentSettings
+{
+public:
+ LLEnvironmentSettings() :
+ mWLDayCycle(LLSD::emptyMap()),
+ mSkyMap(LLSD::emptyMap()),
+ mWaterParams(LLSD::emptyMap()),
+ mDayTime(0.f)
+ {}
+ LLEnvironmentSettings(const LLSD& dayCycle, const LLSD& skyMap, const LLSD& waterParams, F64 dayTime) :
+ mWLDayCycle(dayCycle),
+ mSkyMap(skyMap),
+ mWaterParams(waterParams),
+ mDayTime(dayTime)
+ {}
+ ~LLEnvironmentSettings() {}
+
+ void saveParams(const LLSD& dayCycle, const LLSD& skyMap, const LLSD& waterParams, F64 dayTime)
+ {
+ mWLDayCycle = dayCycle;
+ mSkyMap = skyMap;
+ mWaterParams = waterParams;
+ mDayTime = dayTime;
+ }
+
+ const LLSD& getWLDayCycle() const
+ {
+ return mWLDayCycle;
+ }
+
+ const LLSD& getWaterParams() const
+ {
+ return mWaterParams;
+ }
+
+ const LLSD& getSkyMap() const
+ {
+ return mSkyMap;
+ }
+
+ F64 getDayTime() const
+ {
+ return mDayTime;
+ }
+
+ bool isEmpty() const
+ {
+ return mWLDayCycle.size() == 0;
+ }
+
+ void clear()
+ {
+ *this = LLEnvironmentSettings();
+ }
+
+ LLSD makePacket(const LLSD& metadata) const
+ {
+ LLSD full_packet = LLSD::emptyArray();
+
+ // 0: metadata
+ full_packet.append(metadata);
+
+ // 1: day cycle
+ full_packet.append(mWLDayCycle);
+
+ // 2: map of sky setting names to sky settings (as LLSD)
+ full_packet.append(mSkyMap);
+
+ // 3: water params
+ full_packet.append(mWaterParams);
+
+ return full_packet;
+ }
+
+private:
+ LLSD mWLDayCycle, mWaterParams, mSkyMap;
+ F64 mDayTime;
+};
+
+/**
+ * User environment preferences.
+ */
+class LLEnvPrefs
+{
+public:
+ LLEnvPrefs() : mUseRegionSettings(true), mUseDayCycle(true) {}
+
+ bool getUseRegionSettings() const { return mUseRegionSettings; }
+ bool getUseDayCycle() const { return mUseDayCycle; }
+ bool getUseFixedSky() const { return !getUseDayCycle(); }
+
+ std::string getWaterPresetName() const;
+ std::string getSkyPresetName() const;
+ std::string getDayCycleName() const;
+
+ void setUseRegionSettings(bool val);
+ void setUseWaterPreset(const std::string& name);
+ void setUseSkyPreset(const std::string& name);
+ void setUseDayCycle(const std::string& name);
+
+ bool mUseRegionSettings;
+ bool mUseDayCycle;
+ std::string mWaterPresetName;
+ std::string mSkyPresetName;
+ std::string mDayCycleName;
+};
+
+/**
+ * Setting:
+ * 1. Use region settings.
+ * 2. Use my setting: <water preset> + <fixed_sky>|<day_cycle>
+ */
+class LLEnvManagerNew : public LLSingleton<LLEnvManagerNew>
+{
+ LOG_CLASS(LLEnvManagerNew);
+public:
+ typedef boost::signals2::signal<void()> prefs_change_signal_t;
+ typedef boost::signals2::signal<void()> region_settings_change_signal_t;
+ typedef boost::signals2::signal<void()> region_change_signal_t;
+ typedef boost::signals2::signal<void(bool)> region_settings_applied_signal_t;
+
+ LLEnvManagerNew();
+
+ // getters to access user env. preferences
+ bool getUseRegionSettings() const;
+ bool getUseDayCycle() const;
+ bool getUseFixedSky() const;
+ std::string getWaterPresetName() const;
+ std::string getSkyPresetName() const;
+ std::string getDayCycleName() const;
+
+ /// @return cached env. settings of the current region.
+ const LLEnvironmentSettings& getRegionSettings() const;
+
+ /**
+ * Set new region settings without uploading them to the region.
+ *
+ * The override will be reset when the changes are applied to the region (=uploaded)
+ * or user teleports to another region.
+ */
+ void setRegionSettings(const LLEnvironmentSettings& new_settings);
+
+ // Change environment w/o changing user preferences.
+ bool usePrefs();
+ bool useDefaults();
+ bool useRegionSettings();
+ bool useWaterPreset(const std::string& name);
+ bool useWaterParams(const LLSD& params);
+ bool useSkyPreset(const std::string& name);
+ bool useSkyParams(const LLSD& params);
+ bool useDayCycle(const std::string& name, LLEnvKey::EScope scope);
+ bool useDayCycleParams(const LLSD& params, LLEnvKey::EScope scope, F32 time = 0.5);
+
+ // setters for user env. preferences
+ void setUseRegionSettings(bool val);
+ void setUseWaterPreset(const std::string& name);
+ void setUseSkyPreset(const std::string& name);
+ void setUseDayCycle(const std::string& name);
+ void setUserPrefs(
+ const std::string& water_preset,
+ const std::string& sky_preset,
+ const std::string& day_cycle_preset,
+ bool use_fixed_sky,
+ bool use_region_settings);
+
+ // debugging methods
+ void dumpUserPrefs();
+ void dumpPresets();
+
+ // Misc.
+ void requestRegionSettings();
+ bool sendRegionSettings(const LLEnvironmentSettings& new_settings);
+ boost::signals2::connection setPreferencesChangeCallback(const prefs_change_signal_t::slot_type& cb);
+ boost::signals2::connection setRegionSettingsChangeCallback(const region_settings_change_signal_t::slot_type& cb);
+ boost::signals2::connection setRegionChangeCallback(const region_change_signal_t::slot_type& cb);
+ boost::signals2::connection setRegionSettingsAppliedCallback(const region_settings_applied_signal_t::slot_type& cb);
+
+ static bool canEditRegionSettings(); /// @return true if we have access to editing region environment
+ static const std::string getScopeString(LLEnvKey::EScope scope);
+
+ // Public callbacks.
+ void onRegionCrossing();
+ void onTeleport();
+ void onRegionSettingsResponse(const LLSD& content);
+ void onRegionSettingsApplyResponse(bool ok);
+
+private:
+ friend class LLSingleton<LLEnvManagerNew>;
+ /*virtual*/ void initSingleton();
+
+ void loadUserPrefs();
+ void saveUserPrefs();
+
+ void updateSkyFromPrefs();
+ void updateWaterFromPrefs(bool interpolate);
+ void updateManagersFromPrefs(bool interpolate);
+
+ bool useRegionSky();
+ bool useRegionWater();
+
+ bool useDefaultSky();
+ bool useDefaultWater();
+
+ void onRegionChange(bool interpolate);
+
+ /// Emitted when user environment preferences change.
+ prefs_change_signal_t mUsePrefsChangeSignal;
+
+ /// Emitted when region environment settings update comes.
+ region_settings_change_signal_t mRegionSettingsChangeSignal;
+
+ /// Emitted when agent region changes. Move to LLAgent?
+ region_change_signal_t mRegionChangeSignal;
+
+ /// Emitted when agent region changes. Move to LLAgent?
+ region_settings_applied_signal_t mRegionSettingsAppliedSignal;
+
+ LLEnvPrefs mUserPrefs; /// User environment preferences.
+ LLEnvironmentSettings mCachedRegionPrefs; /// Cached region environment settings.
+ LLEnvironmentSettings mNewRegionPrefs; /// Not-yet-uploaded modified region env. settings.
+ bool mInterpNextChangeMessage; /// Interpolate env. settings on next region change.
+ LLUUID mCurRegionUUID; /// To avoid duplicated region env. settings requests.
+ LLUUID mLastReceivedID; /// Id of last received region env. settings.
+};
+
+#endif // LL_LLENVMANAGER_H
+
diff --git a/indra/newview/llestateinfomodel.cpp b/indra/newview/llestateinfomodel.cpp
new file mode 100644
index 0000000000..7ed22d68f6
--- /dev/null
+++ b/indra/newview/llestateinfomodel.cpp
@@ -0,0 +1,230 @@
+/**
+ * @file llestateinfomodel.cpp
+ * @brief Estate info model
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llestateinfomodel.h"
+
+// libs
+#include "llhttpclient.h"
+#include "llregionflags.h"
+#include "message.h"
+
+// viewer
+#include "llagent.h"
+#include "llfloaterregioninfo.h" // for invoice id
+#include "llviewerregion.h"
+
+LLEstateInfoModel::LLEstateInfoModel()
+: mID(0)
+, mFlags(0)
+, mSunHour(0)
+{
+}
+
+boost::signals2::connection LLEstateInfoModel::setUpdateCallback(const update_signal_t::slot_type& cb)
+{
+ return mUpdateSignal.connect(cb);
+}
+
+boost::signals2::connection LLEstateInfoModel::setCommitCallback(const update_signal_t::slot_type& cb)
+{
+ return mCommitSignal.connect(cb);
+}
+
+void LLEstateInfoModel::sendEstateInfo()
+{
+ if (!commitEstateInfoCaps())
+ {
+ // the caps method failed, try the old way
+ LLFloaterRegionInfo::nextInvoice();
+ commitEstateInfoDataserver();
+ }
+}
+
+bool LLEstateInfoModel::getUseFixedSun() const { return mFlags & REGION_FLAGS_SUN_FIXED; }
+bool LLEstateInfoModel::getIsExternallyVisible() const { return mFlags & REGION_FLAGS_EXTERNALLY_VISIBLE; }
+bool LLEstateInfoModel::getAllowDirectTeleport() const { return mFlags & REGION_FLAGS_ALLOW_DIRECT_TELEPORT; }
+bool LLEstateInfoModel::getDenyAnonymous() const { return mFlags & REGION_FLAGS_DENY_ANONYMOUS; }
+bool LLEstateInfoModel::getDenyAgeUnverified() const { return mFlags & REGION_FLAGS_DENY_AGEUNVERIFIED; }
+bool LLEstateInfoModel::getAllowVoiceChat() const { return mFlags & REGION_FLAGS_ALLOW_VOICE; }
+
+void LLEstateInfoModel::setUseFixedSun(bool val) { setFlag(REGION_FLAGS_SUN_FIXED, val); }
+void LLEstateInfoModel::setIsExternallyVisible(bool val) { setFlag(REGION_FLAGS_EXTERNALLY_VISIBLE, val); }
+void LLEstateInfoModel::setAllowDirectTeleport(bool val) { setFlag(REGION_FLAGS_ALLOW_DIRECT_TELEPORT, val); }
+void LLEstateInfoModel::setDenyAnonymous(bool val) { setFlag(REGION_FLAGS_DENY_ANONYMOUS, val); }
+void LLEstateInfoModel::setDenyAgeUnverified(bool val) { setFlag(REGION_FLAGS_DENY_AGEUNVERIFIED, val); }
+void LLEstateInfoModel::setAllowVoiceChat(bool val) { setFlag(REGION_FLAGS_ALLOW_VOICE, val); }
+
+void LLEstateInfoModel::update(const strings_t& strings)
+{
+ // NOTE: LLDispatcher extracts strings with an extra \0 at the
+ // end. If we pass the std::string direct to the UI/renderer
+ // it draws with a weird character at the end of the string.
+ mName = strings[0].c_str();
+ mOwnerID = LLUUID(strings[1].c_str());
+ mID = strtoul(strings[2].c_str(), NULL, 10);
+ mFlags = strtoul(strings[3].c_str(), NULL, 10);
+ mSunHour = ((F32)(strtod(strings[4].c_str(), NULL)))/1024.0f;
+
+ LL_DEBUGS("Windlight Sync") << "Received estate info: "
+ << "is_sun_fixed = " << getUseFixedSun()
+ << ", sun_hour = " << getSunHour() << LL_ENDL;
+ lldebugs << getInfoDump() << llendl;
+
+ // Update region owner.
+ LLViewerRegion* regionp = gAgent.getRegion();
+ regionp->setOwner(mOwnerID);
+
+ // Let interested parties know that estate info has been updated.
+ mUpdateSignal();
+}
+
+void LLEstateInfoModel::notifyCommit()
+{
+ mCommitSignal();
+}
+
+//== PRIVATE STUFF ============================================================
+
+class LLEstateChangeInfoResponder : public LLHTTPClient::Responder
+{
+public:
+
+ // if we get a normal response, handle it here
+ virtual void result(const LLSD& content)
+ {
+ llinfos << "Committed estate info" << llendl;
+ LLEstateInfoModel::instance().notifyCommit();
+ }
+
+ // if we get an error response
+ virtual void error(U32 status, const std::string& reason)
+ {
+ llwarns << "Failed to commit estate info (" << status << "): " << reason << llendl;
+ }
+};
+
+// tries to send estate info using a cap; returns true if it succeeded
+bool LLEstateInfoModel::commitEstateInfoCaps()
+{
+ std::string url = gAgent.getRegion()->getCapability("EstateChangeInfo");
+
+ if (url.empty())
+ {
+ // whoops, couldn't find the cap, so bail out
+ return false;
+ }
+
+ LLSD body;
+ body["estate_name" ] = getName();
+ body["sun_hour" ] = getSunHour();
+
+ body["is_sun_fixed" ] = getUseFixedSun();
+ body["is_externally_visible"] = getIsExternallyVisible();
+ body["allow_direct_teleport"] = getAllowDirectTeleport();
+ body["deny_anonymous" ] = getDenyAnonymous();
+ body["deny_age_unverified" ] = getDenyAgeUnverified();
+ body["allow_voice_chat" ] = getAllowVoiceChat();
+
+ body["invoice" ] = LLFloaterRegionInfo::getLastInvoice();
+
+ LL_DEBUGS("Windlight Sync") << "Sending estate caps: "
+ << "is_sun_fixed = " << getUseFixedSun()
+ << ", sun_hour = " << getSunHour() << LL_ENDL;
+ lldebugs << body << LL_ENDL;
+
+ // we use a responder so that we can re-get the data after committing to the database
+ LLHTTPClient::post(url, body, new LLEstateChangeInfoResponder);
+ return true;
+}
+
+/* This is the old way of doing things, is deprecated, and should be
+ deleted when the dataserver model can be removed */
+// key = "estatechangeinfo"
+// strings[0] = str(estate_id) (added by simulator before relay - not here)
+// strings[1] = estate_name
+// strings[2] = str(estate_flags)
+// strings[3] = str((S32)(sun_hour * 1024.f))
+void LLEstateInfoModel::commitEstateInfoDataserver()
+{
+ LL_DEBUGS("Windlight Sync") << "Sending estate info: "
+ << "is_sun_fixed = " << getUseFixedSun()
+ << ", sun_hour = " << getSunHour() << LL_ENDL;
+ lldebugs << getInfoDump() << LL_ENDL;
+
+ LLMessageSystem* msg = gMessageSystem;
+ msg->newMessage("EstateOwnerMessage");
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ msg->addUUIDFast(_PREHASH_TransactionID, LLUUID::null); //not used
+
+ msg->nextBlock("MethodData");
+ msg->addString("Method", "estatechangeinfo");
+ msg->addUUID("Invoice", LLFloaterRegionInfo::getLastInvoice());
+
+ msg->nextBlock("ParamList");
+ msg->addString("Parameter", getName());
+
+ msg->nextBlock("ParamList");
+ msg->addString("Parameter", llformat("%u", getFlags()));
+
+ msg->nextBlock("ParamList");
+ msg->addString("Parameter", llformat("%d", (S32) (getSunHour() * 1024.0f)));
+
+ gAgent.sendMessage();
+}
+
+void LLEstateInfoModel::setFlag(U32 flag, bool val)
+{
+ if (val)
+ {
+ mFlags |= flag;
+ }
+ else
+ {
+ mFlags &= ~flag;
+ }
+}
+
+std::string LLEstateInfoModel::getInfoDump()
+{
+ LLSD dump;
+ dump["estate_name" ] = getName();
+ dump["sun_hour" ] = getSunHour();
+
+ dump["is_sun_fixed" ] = getUseFixedSun();
+ dump["is_externally_visible"] = getIsExternallyVisible();
+ dump["allow_direct_teleport"] = getAllowDirectTeleport();
+ dump["deny_anonymous" ] = getDenyAnonymous();
+ dump["deny_age_unverified" ] = getDenyAgeUnverified();
+ dump["allow_voice_chat" ] = getAllowVoiceChat();
+
+ std::stringstream dump_str;
+ dump_str << dump;
+ return dump_str.str();
+}
diff --git a/indra/newview/llestateinfomodel.h b/indra/newview/llestateinfomodel.h
new file mode 100644
index 0000000000..56391eda91
--- /dev/null
+++ b/indra/newview/llestateinfomodel.h
@@ -0,0 +1,103 @@
+/**
+ * @file llestateinfomodel.h
+ * @brief Estate info model
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLESTATEINFOMODEL_H
+#define LL_LLESTATEINFOMODEL_H
+
+class LLMessageSystem;
+
+#include "llsingleton.h"
+
+/**
+ * Contains estate info, notifies interested parties of its changes.
+ */
+class LLEstateInfoModel : public LLSingleton<LLEstateInfoModel>
+{
+ LOG_CLASS(LLEstateInfoModel);
+
+public:
+ typedef boost::signals2::signal<void()> update_signal_t;
+ boost::signals2::connection setUpdateCallback(const update_signal_t::slot_type& cb); /// the model has been externally updated
+ boost::signals2::connection setCommitCallback(const update_signal_t::slot_type& cb); /// our changes have been applied
+
+ void sendEstateInfo(); /// send estate info to the simulator
+
+ // getters
+ bool getUseFixedSun() const;
+ bool getIsExternallyVisible() const;
+ bool getAllowDirectTeleport() const;
+ bool getDenyAnonymous() const;
+ bool getDenyAgeUnverified() const;
+ bool getAllowVoiceChat() const;
+
+ const std::string& getName() const { return mName; }
+ const LLUUID& getOwnerID() const { return mOwnerID; }
+ U32 getID() const { return mID; }
+ F32 getSunHour() const { return getUseFixedSun() ? mSunHour : 0.f; }
+
+ // setters
+ void setUseFixedSun(bool val);
+ void setIsExternallyVisible(bool val);
+ void setAllowDirectTeleport(bool val);
+ void setDenyAnonymous(bool val);
+ void setDenyAgeUnverified(bool val);
+ void setAllowVoiceChat(bool val);
+
+ void setSunHour(F32 sun_hour) { mSunHour = sun_hour; }
+
+protected:
+ typedef std::vector<std::string> strings_t;
+
+ friend class LLSingleton<LLEstateInfoModel>;
+ friend class LLDispatchEstateUpdateInfo;
+ friend class LLEstateChangeInfoResponder;
+
+ LLEstateInfoModel();
+
+ /// refresh model with data from the incoming server message
+ void update(const strings_t& strings);
+
+ void notifyCommit();
+
+private:
+ bool commitEstateInfoCaps();
+ void commitEstateInfoDataserver();
+ U32 getFlags() const { return mFlags; }
+ void setFlag(U32 flag, bool val);
+ std::string getInfoDump();
+
+ // estate info
+ std::string mName; /// estate name
+ LLUUID mOwnerID; /// estate owner id
+ U32 mID; /// estate id
+ U32 mFlags; /// estate flags
+ F32 mSunHour; /// estate sun hour
+
+ update_signal_t mUpdateSignal; /// emitted when we receive update from sim
+ update_signal_t mCommitSignal; /// emitted when our update gets applied to sim
+};
+
+#endif // LL_LLESTATEINFOMODEL_H
diff --git a/indra/newview/lleventnotifier.h b/indra/newview/lleventnotifier.h
index 697a708762..3fee46c2f6 100644
--- a/indra/newview/lleventnotifier.h
+++ b/indra/newview/lleventnotifier.h
@@ -31,6 +31,7 @@
#include "v3dmath.h"
class LLEventNotification;
+class LLMessageSystem;
class LLEventNotifier
diff --git a/indra/newview/llexpandabletextbox.cpp b/indra/newview/llexpandabletextbox.cpp
index 5e10f60aba..935dcb74b0 100644
--- a/indra/newview/llexpandabletextbox.cpp
+++ b/indra/newview/llexpandabletextbox.cpp
@@ -55,7 +55,7 @@ public:
else
{
width = mEditor.getDocumentView()->getRect().getWidth() - mEditor.getHPad();
- height = llceil(mStyle->getFont()->getLineHeight());
+ height = mStyle->getFont()->getLineHeight();
}
return true;
}
@@ -123,10 +123,7 @@ void LLExpandableTextBox::LLTextBoxEx::reshape(S32 width, S32 height, BOOL calle
{
LLTextEditor::reshape(width, height, called_from_parent);
- if (getTextPixelHeight() > getRect().getHeight())
- {
- showExpandText();
- }
+ hideOrShowExpandTextAsNeeded();
}
void LLExpandableTextBox::LLTextBoxEx::setText(const LLStringExplicit& text,const LLStyle::Params& input_params)
@@ -136,17 +133,7 @@ void LLExpandableTextBox::LLTextBoxEx::setText(const LLStringExplicit& text,cons
mExpanderVisible = false;
LLTextEditor::setText(text, input_params);
- // text contents have changed, segments are cleared out
- // so hide the expander and determine if we need it
- //mExpanderVisible = false;
- if (getTextPixelHeight() > getRect().getHeight())
- {
- showExpandText();
- }
- else
- {
- hideExpandText();
- }
+ hideOrShowExpandTextAsNeeded();
}
@@ -200,6 +187,22 @@ S32 LLExpandableTextBox::LLTextBoxEx::getTextPixelHeight()
return getTextBoundingRect().getHeight();
}
+void LLExpandableTextBox::LLTextBoxEx::hideOrShowExpandTextAsNeeded()
+{
+ // Restore the text box contents to calculate the text height properly,
+ // otherwise if a part of the text is hidden under "More" link
+ // getTextPixelHeight() returns only the height of currently visible text
+ // including the "More" link. See STORM-250.
+ hideExpandText();
+
+ // Show the expander a.k.a. "More" link if we need it, depending on text
+ // contents height. If not, keep it hidden.
+ if (getTextPixelHeight() > getRect().getHeight())
+ {
+ showExpandText();
+ }
+}
+
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
@@ -412,6 +415,15 @@ void LLExpandableTextBox::onTopLost()
LLUICtrl::onTopLost();
}
+void LLExpandableTextBox::updateTextShape()
+{
+ // I guess this should be done on every reshape(),
+ // but adding this code to reshape() currently triggers bug VWR-26455,
+ // which makes the text virtually unreadable.
+ llassert(!mExpanded);
+ updateTextBoxRect();
+}
+
void LLExpandableTextBox::setValue(const LLSD& value)
{
collapseTextBox();
diff --git a/indra/newview/llexpandabletextbox.h b/indra/newview/llexpandabletextbox.h
index bce77225c4..399e48bea2 100644
--- a/indra/newview/llexpandabletextbox.h
+++ b/indra/newview/llexpandabletextbox.h
@@ -77,6 +77,12 @@ protected:
*/
void hideExpandText();
+ /**
+ * Shows the "More" link if the text is too high to be completely
+ * visible without expanding the text box. Hides that link otherwise.
+ */
+ void hideOrShowExpandTextAsNeeded();
+
protected:
LLTextBoxEx(const Params& p);
@@ -137,6 +143,10 @@ public:
*/
/*virtual*/ void onTopLost();
+ /**
+ * *HACK: Update the inner textbox shape.
+ */
+ void updateTextShape();
/**
* Draws text box, collapses text box if its expanded and its parent's position changed
diff --git a/indra/newview/llexternaleditor.cpp b/indra/newview/llexternaleditor.cpp
index 54968841ab..ed1d7e860a 100644
--- a/indra/newview/llexternaleditor.cpp
+++ b/indra/newview/llexternaleditor.cpp
@@ -27,6 +27,7 @@
#include "llviewerprecompiledheaders.h"
#include "llexternaleditor.h"
+#include "lltrans.h"
#include "llui.h"
// static
@@ -35,13 +36,13 @@ const std::string LLExternalEditor::sFilenameMarker = "%s";
// static
const std::string LLExternalEditor::sSetting = "ExternalEditor";
-bool LLExternalEditor::setCommand(const std::string& env_var, const std::string& override)
+LLExternalEditor::EErrorCode LLExternalEditor::setCommand(const std::string& env_var, const std::string& override)
{
std::string cmd = findCommand(env_var, override);
if (cmd.empty())
{
- llwarns << "Empty editor command" << llendl;
- return false;
+ llwarns << "Editor command is empty or not set" << llendl;
+ return EC_NOT_SPECIFIED;
}
// Add the filename marker if missing.
@@ -55,7 +56,7 @@ bool LLExternalEditor::setCommand(const std::string& env_var, const std::string&
if (tokenize(tokens, cmd) < 2) // 2 = bin + at least one arg (%s)
{
llwarns << "Error parsing editor command" << llendl;
- return false;
+ return EC_PARSE_ERROR;
}
// Check executable for existence.
@@ -63,7 +64,7 @@ bool LLExternalEditor::setCommand(const std::string& env_var, const std::string&
if (!LLFile::isfile(bin_path))
{
llwarns << "Editor binary [" << bin_path << "] not found" << llendl;
- return false;
+ return EC_BINARY_NOT_FOUND;
}
// Save command.
@@ -76,16 +77,16 @@ bool LLExternalEditor::setCommand(const std::string& env_var, const std::string&
}
llinfos << "Setting command [" << bin_path << " " << mArgs << "]" << llendl;
- return true;
+ return EC_SUCCESS;
}
-bool LLExternalEditor::run(const std::string& file_path)
+LLExternalEditor::EErrorCode LLExternalEditor::run(const std::string& file_path)
{
std::string args = mArgs;
if (mProcess.getExecutable().empty() || args.empty())
{
llwarns << "Editor command not set" << llendl;
- return false;
+ return EC_NOT_SPECIFIED;
}
// Substitute the filename marker in the command with the actual passed file name.
@@ -111,7 +112,22 @@ bool LLExternalEditor::run(const std::string& file_path)
mProcess.orphan();
}
- return result == 0;
+ return result == 0 ? EC_SUCCESS : EC_FAILED_TO_RUN;
+}
+
+// static
+std::string LLExternalEditor::getErrorMessage(EErrorCode code)
+{
+ switch (code)
+ {
+ case EC_SUCCESS: return LLTrans::getString("ok");
+ case EC_NOT_SPECIFIED: return LLTrans::getString("ExternalEditorNotSet");
+ case EC_PARSE_ERROR: return LLTrans::getString("ExternalEditorCommandParseError");
+ case EC_BINARY_NOT_FOUND: return LLTrans::getString("ExternalEditorNotFound");
+ case EC_FAILED_TO_RUN: return LLTrans::getString("ExternalEditorFailedToRun");
+ }
+
+ return LLTrans::getString("Unknown");
}
// static
diff --git a/indra/newview/llexternaleditor.h b/indra/newview/llexternaleditor.h
index 6ea210d5e2..ef5db56c6e 100644
--- a/indra/newview/llexternaleditor.h
+++ b/indra/newview/llexternaleditor.h
@@ -42,6 +42,14 @@ class LLExternalEditor
public:
+ typedef enum e_error_code {
+ EC_SUCCESS, /// No error.
+ EC_NOT_SPECIFIED, /// Editor path not specified.
+ EC_PARSE_ERROR, /// Editor command parsing error.
+ EC_BINARY_NOT_FOUND, /// Could find the editor binary (missing or not quoted).
+ EC_FAILED_TO_RUN, /// Could not execute the editor binary.
+ } EErrorCode;
+
/**
* Set editor command.
*
@@ -51,19 +59,25 @@ public:
* First tries the override, then a predefined setting (sSetting),
* then the environment variable.
*
- * @return Command if found, empty string otherwise.
+ * @return EC_SUCCESS if command is valid and refers to an existing executable,
+ * EC_NOT_SPECIFIED or EC_FAILED_TO_RUNan on error.
*
* @see sSetting
*/
- bool setCommand(const std::string& env_var, const std::string& override = LLStringUtil::null);
+ EErrorCode setCommand(const std::string& env_var, const std::string& override = LLStringUtil::null);
/**
* Run the editor with the given file.
*
* @param file_path File to edit.
- * @return true on success, false on error.
+ * @return EC_SUCCESS on success, error code on error.
+ */
+ EErrorCode run(const std::string& file_path);
+
+ /**
+ * Get a meaningful error message for the given status code.
*/
- bool run(const std::string& file_path);
+ static std::string getErrorMessage(EErrorCode code);
private:
diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp
index 2471da9da5..4108d69e82 100644
--- a/indra/newview/llface.cpp
+++ b/indra/newview/llface.cpp
@@ -33,8 +33,10 @@
#include "llviewercontrol.h"
#include "llvolume.h"
#include "m3math.h"
+#include "llmatrix4a.h"
#include "v3color.h"
+#include "lldrawpoolavatar.h"
#include "lldrawpoolbump.h"
#include "llgl.h"
#include "llrender.h"
@@ -67,35 +69,43 @@ The resulting texture coordinate <u,v> is:
u = 2(B dot P)
v = 2(T dot P)
*/
-void planarProjection(LLVector2 &tc, const LLVector3& normal,
- const LLVector3 &mCenter, const LLVector3& vec)
-{ //DONE!
- LLVector3 binormal;
- float d = normal * LLVector3(1,0,0);
+void planarProjection(LLVector2 &tc, const LLVector4a& normal,
+ const LLVector4a &center, const LLVector4a& vec)
+{
+ LLVector4a binormal;
+ F32 d = normal[0];
+
if (d >= 0.5f || d <= -0.5f)
{
- binormal = LLVector3(0,1,0);
- if (normal.mV[0] < 0)
+ if (d < 0)
+ {
+ binormal.set(0,-1,0);
+ }
+ else
{
- binormal = -binormal;
+ binormal.set(0, 1, 0);
}
}
else
{
- binormal = LLVector3(1,0,0);
- if (normal.mV[1] > 0)
+ if (normal[1] > 0)
{
- binormal = -binormal;
+ binormal.set(-1,0,0);
+ }
+ else
+ {
+ binormal.set(1,0,0);
}
}
- LLVector3 tangent = binormal % normal;
+ LLVector4a tangent;
+ tangent.setCross3(binormal,normal);
- tc.mV[1] = -((tangent*vec)*2 - 0.5f);
- tc.mV[0] = 1.0f+((binormal*vec)*2 - 0.5f);
+ tc.mV[1] = -((tangent.dot3(vec).getF32())*2 - 0.5f);
+ tc.mV[0] = 1.0f+((binormal.dot3(vec).getF32())*2 - 0.5f);
}
-void sphericalProjection(LLVector2 &tc, const LLVector3& normal,
- const LLVector3 &mCenter, const LLVector3& vec)
+void sphericalProjection(LLVector2 &tc, const LLVector4a& normal,
+ const LLVector4a &mCenter, const LLVector4a& vec)
{ //BROKEN
/*tc.mV[0] = acosf(vd.mNormal * LLVector3(1,0,0))/3.14159f;
@@ -106,7 +116,7 @@ void sphericalProjection(LLVector2 &tc, const LLVector3& normal,
}*/
}
-void cylindricalProjection(LLVector2 &tc, const LLVector3& normal, const LLVector3 &mCenter, const LLVector3& vec)
+void cylindricalProjection(LLVector2 &tc, const LLVector4a& normal, const LLVector4a &mCenter, const LLVector4a& vec)
{ //BROKEN
/*LLVector3 binormal;
float d = vd.mNormal * LLVector3(1,0,0);
@@ -138,6 +148,7 @@ void LLFace::init(LLDrawable* drawablep, LLViewerObject* objp)
{
mLastUpdateTime = gFrameTimeSeconds;
mLastMoveTime = 0.f;
+ mLastSkinTime = gFrameTimeSeconds;
mVSize = 0.f;
mPixelArea = 16.f;
mState = GLOBAL;
@@ -154,6 +165,7 @@ void LLFace::init(LLDrawable* drawablep, LLViewerObject* objp)
mIndexInTex = 0;
mTexture = NULL;
mTEOffset = -1;
+ mTextureIndex = 255;
setDrawable(drawablep);
mVObjp = objp;
@@ -179,9 +191,13 @@ void LLFace::init(LLDrawable* drawablep, LLViewerObject* objp)
mHasMedia = FALSE ;
}
-
void LLFace::destroy()
{
+ if (gDebugGL)
+ {
+ gPipeline.checkReferences(this);
+ }
+
if(mTexture.notNull())
{
mTexture->removeFace(this) ;
@@ -189,7 +205,15 @@ void LLFace::destroy()
if (mDrawPoolp)
{
- mDrawPoolp->removeFace(this);
+ if (this->isState(LLFace::RIGGED) && mDrawPoolp->getType() == LLDrawPool::POOL_AVATAR)
+ {
+ ((LLDrawPoolAvatar*) mDrawPoolp)->removeRiggedFace(this);
+ }
+ else
+ {
+ mDrawPoolp->removeFace(this);
+ }
+
mDrawPoolp = NULL;
}
@@ -210,8 +234,8 @@ void LLFace::destroy()
}
setDrawInfo(NULL);
-
removeAtlas();
+
mDrawablep = NULL;
mVObjp = NULL;
}
@@ -227,6 +251,11 @@ void LLFace::setWorldMatrix(const LLMatrix4 &mat)
llerrs << "Faces on this drawable are not independently modifiable\n" << llendl;
}
+void LLFace::setPool(LLFacePool* pool)
+{
+ mDrawPoolp = pool;
+}
+
void LLFace::setPool(LLFacePool* new_pool, LLViewerTexture *texturep)
{
LLMemType mt1(LLMemType::MTYPE_DRAWABLE);
@@ -329,8 +358,14 @@ void LLFace::setDrawable(LLDrawable *drawable)
mXform = &drawable->mXform;
}
-void LLFace::setSize(const S32 num_vertices, const S32 num_indices)
+void LLFace::setSize(S32 num_vertices, S32 num_indices, bool align)
{
+ if (align)
+ {
+ //allocate vertices in blocks of 4 for alignment
+ num_vertices = (num_vertices + 0x3) & ~0x3;
+ }
+
if (mGeomCount != num_vertices ||
mIndicesCount != num_indices)
{
@@ -339,8 +374,48 @@ void LLFace::setSize(const S32 num_vertices, const S32 num_indices)
mVertexBuffer = NULL;
mLastVertexBuffer = NULL;
}
+
+ llassert(verify());
+}
+
+void LLFace::setGeomIndex(U16 idx)
+{
+ if (mGeomIndex != idx)
+ {
+ mGeomIndex = idx;
+ mVertexBuffer = NULL;
+ }
}
+void LLFace::setTextureIndex(U8 index)
+{
+ if (index != mTextureIndex)
+ {
+ mTextureIndex = index;
+
+ if (mTextureIndex != 255)
+ {
+ mDrawablep->setState(LLDrawable::REBUILD_POSITION);
+ }
+ else
+ {
+ if (mDrawInfo && !mDrawInfo->mTextureList.empty())
+ {
+ llerrs << "Face with no texture index references indexed texture draw info." << llendl;
+ }
+ }
+ }
+}
+
+void LLFace::setIndicesIndex(S32 idx)
+{
+ if (mIndicesIndex != idx)
+ {
+ mIndicesIndex = idx;
+ mVertexBuffer = NULL;
+ }
+}
+
//============================================================================
U16 LLFace::getGeometryAvatar(
@@ -354,11 +429,11 @@ U16 LLFace::getGeometryAvatar(
if (mVertexBuffer.notNull())
{
- mVertexBuffer->getVertexStrider (vertices, mGeomIndex);
- mVertexBuffer->getNormalStrider (normals, mGeomIndex);
- mVertexBuffer->getTexCoord0Strider (tex_coords, mGeomIndex);
- mVertexBuffer->getWeightStrider(vertex_weights, mGeomIndex);
- mVertexBuffer->getClothWeightStrider(clothing_weights, mGeomIndex);
+ mVertexBuffer->getVertexStrider (vertices, mGeomIndex, mGeomCount);
+ mVertexBuffer->getNormalStrider (normals, mGeomIndex, mGeomCount);
+ mVertexBuffer->getTexCoord0Strider (tex_coords, mGeomIndex, mGeomCount);
+ mVertexBuffer->getWeightStrider(vertex_weights, mGeomIndex, mGeomCount);
+ mVertexBuffer->getClothWeightStrider(clothing_weights, mGeomIndex, mGeomCount);
}
return mGeomIndex;
@@ -371,17 +446,17 @@ U16 LLFace::getGeometry(LLStrider<LLVector3> &vertices, LLStrider<LLVector3> &no
if (mVertexBuffer.notNull())
{
- mVertexBuffer->getVertexStrider(vertices, mGeomIndex);
+ mVertexBuffer->getVertexStrider(vertices, mGeomIndex, mGeomCount);
if (mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_NORMAL))
{
- mVertexBuffer->getNormalStrider(normals, mGeomIndex);
+ mVertexBuffer->getNormalStrider(normals, mGeomIndex, mGeomCount);
}
if (mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_TEXCOORD0))
{
- mVertexBuffer->getTexCoord0Strider(tex_coords, mGeomIndex);
+ mVertexBuffer->getTexCoord0Strider(tex_coords, mGeomIndex, mGeomCount);
}
- mVertexBuffer->getIndexStrider(indicesp, mIndicesIndex);
+ mVertexBuffer->getIndexStrider(indicesp, mIndicesIndex, mIndicesCount);
}
return mGeomIndex;
@@ -421,16 +496,45 @@ void LLFace::renderSelected(LLViewerTexture *imagep, const LLColor4& color)
gGL.pushMatrix();
if (mDrawablep->isActive())
{
- glMultMatrixf((GLfloat*)mDrawablep->getRenderMatrix().mMatrix);
+ gGL.multMatrix((GLfloat*)mDrawablep->getRenderMatrix().mMatrix);
}
else
{
- glMultMatrixf((GLfloat*)mDrawablep->getRegion()->mRenderMatrix.mMatrix);
+ gGL.multMatrix((GLfloat*)mDrawablep->getRegion()->mRenderMatrix.mMatrix);
}
- glColor4fv(color.mV);
- mVertexBuffer->setBuffer(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0);
- mVertexBuffer->draw(LLRender::TRIANGLES, mIndicesCount, mIndicesIndex);
+ gGL.diffuseColor4fv(color.mV);
+
+ if (mDrawablep->isState(LLDrawable::RIGGED))
+ {
+ LLVOVolume* volume = mDrawablep->getVOVolume();
+ if (volume)
+ {
+ LLRiggedVolume* rigged = volume->getRiggedVolume();
+ if (rigged)
+ {
+ LLGLEnable offset(GL_POLYGON_OFFSET_FILL);
+ glPolygonOffset(-1.f, -1.f);
+ gGL.multMatrix((F32*) volume->getRelativeXform().mMatrix);
+ const LLVolumeFace& vol_face = rigged->getVolumeFace(getTEOffset());
+ LLVertexBuffer::unbind();
+ glVertexPointer(3, GL_FLOAT, 16, vol_face.mPositions);
+ if (vol_face.mTexCoords)
+ {
+ glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+ glTexCoordPointer(2, GL_FLOAT, 8, vol_face.mTexCoords);
+ }
+ gGL.syncMatrices();
+ glDrawElements(GL_TRIANGLES, vol_face.mNumIndices, GL_UNSIGNED_SHORT, vol_face.mIndices);
+ glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+ }
+ }
+ }
+ else
+ {
+ mVertexBuffer->setBuffer(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0);
+ mVertexBuffer->draw(LLRender::TRIANGLES, mIndicesCount, mIndicesIndex);
+ }
gGL.popMatrix();
}
@@ -454,17 +558,17 @@ void LLFace::renderSelectedUV()
// add green dither pattern on top of red/blue gradient
gGL.blendFunc(LLRender::BF_ONE, LLRender::BF_ONE);
- glMatrixMode(GL_TEXTURE);
- glPushMatrix();
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.pushMatrix();
// make green pattern repeat once per texel in red/blue texture
- glScalef(256.f, 256.f, 1.f);
- glMatrixMode(GL_MODELVIEW);
+ gGL.scalef(256.f, 256.f, 1.f);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
renderSelected(green_imagep, LLColor4::white);
- glMatrixMode(GL_TEXTURE);
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.popMatrix();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.blendFunc(LLRender::BF_SOURCE_ALPHA, LLRender::BF_ONE_MINUS_SOURCE_ALPHA);
}
*/
@@ -515,23 +619,26 @@ void LLFace::printDebugInfo() const
llinfos << "II: " << mIndicesIndex << " Count:" << mIndicesCount << llendl;
llinfos << llendl;
- poolp->printDebugInfo();
-
- S32 pool_references = 0;
- for (std::vector<LLFace*>::iterator iter = poolp->mReferences.begin();
- iter != poolp->mReferences.end(); iter++)
+ if (poolp)
{
- LLFace *facep = *iter;
- if (facep == this)
+ poolp->printDebugInfo();
+
+ S32 pool_references = 0;
+ for (std::vector<LLFace*>::iterator iter = poolp->mReferences.begin();
+ iter != poolp->mReferences.end(); iter++)
{
- llinfos << "Pool reference: " << pool_references << llendl;
- pool_references++;
+ LLFace *facep = *iter;
+ if (facep == this)
+ {
+ llinfos << "Pool reference: " << pool_references << llendl;
+ pool_references++;
+ }
}
- }
- if (pool_references != 1)
- {
- llinfos << "Incorrect number of pool references!" << llendl;
+ if (pool_references != 1)
+ {
+ llinfos << "Incorrect number of pool references!" << llendl;
+ }
}
#if 0
@@ -586,97 +693,192 @@ static void xform(LLVector2 &tex_coord, F32 cosAng, F32 sinAng, F32 offS, F32 of
tex_coord.mV[1] = t;
}
+// Transform the texture coordinates for this face.
+static void xform4a(LLVector4a &tex_coord, const LLVector4a& trans, const LLVector4Logical& mask, const LLVector4a& rot0, const LLVector4a& rot1, const LLVector4a& offset, const LLVector4a& scale)
+{
+ //tex coord is two coords, <s0, t0, s1, t1>
+ LLVector4a st;
+
+ // Texture transforms are done about the center of the face.
+ st.setAdd(tex_coord, trans);
+
+ // Handle rotation
+ LLVector4a rot_st;
+
+ // <s0 * cosAng, s0*-sinAng, s1*cosAng, s1*-sinAng>
+ LLVector4a s0;
+ s0.splat(st, 0);
+ LLVector4a s1;
+ s1.splat(st, 2);
+ LLVector4a ss;
+ ss.setSelectWithMask(mask, s1, s0);
+
+ LLVector4a a;
+ a.setMul(rot0, ss);
+
+ // <t0*sinAng, t0*cosAng, t1*sinAng, t1*cosAng>
+ LLVector4a t0;
+ t0.splat(st, 1);
+ LLVector4a t1;
+ t1.splat(st, 3);
+ LLVector4a tt;
+ tt.setSelectWithMask(mask, t1, t0);
+
+ LLVector4a b;
+ b.setMul(rot1, tt);
+
+ st.setAdd(a,b);
+
+ // Then scale
+ st.mul(scale);
+
+ // Then offset
+ tex_coord.setAdd(st, offset);
+}
+
+
+bool less_than_max_mag(const LLVector4a& vec)
+{
+ LLVector4a MAX_MAG;
+ MAX_MAG.splat(1024.f*1024.f);
+
+ LLVector4a val;
+ val.setAbs(vec);
+
+ S32 lt = val.lessThan(MAX_MAG).getGatheredBits() & 0x7;
+
+ return lt == 0x7;
+}
BOOL LLFace::genVolumeBBoxes(const LLVolume &volume, S32 f,
- const LLMatrix4& mat_vert, const LLMatrix3& mat_normal, BOOL global_volume)
+ const LLMatrix4& mat_vert_in, const LLMatrix3& mat_normal_in, BOOL global_volume)
{
LLMemType mt1(LLMemType::MTYPE_DRAWABLE);
//get bounding box
- if (mDrawablep->isState(LLDrawable::REBUILD_VOLUME | LLDrawable::REBUILD_POSITION))
+ if (mDrawablep->isState(LLDrawable::REBUILD_VOLUME | LLDrawable::REBUILD_POSITION | LLDrawable::REBUILD_RIGGED))
{
+ //VECTORIZE THIS
+ LLMatrix4a mat_vert;
+ mat_vert.loadu(mat_vert_in);
+
+ LLMatrix4a mat_normal;
+ mat_normal.loadu(mat_normal_in);
+
//if (mDrawablep->isState(LLDrawable::REBUILD_VOLUME))
//{ //vertex buffer no longer valid
// mVertexBuffer = NULL;
// mLastVertexBuffer = NULL;
//}
- LLVector3 min,max;
+ //VECTORIZE THIS
+ LLVector4a min,max;
if (f >= volume.getNumVolumeFaces())
{
- min = LLVector3(-1,-1,-1);
- max = LLVector3(1,1,1);
- }
- else
- {
- const LLVolumeFace &face = volume.getVolumeFace(f);
- min = face.mExtents[0];
- max = face.mExtents[1];
+ llwarns << "Generating bounding box for invalid face index!" << llendl;
+ f = 0;
}
+ const LLVolumeFace &face = volume.getVolumeFace(f);
+ min = face.mExtents[0];
+ max = face.mExtents[1];
+
+ llassert(less_than_max_mag(min));
+ llassert(less_than_max_mag(max));
+
//min, max are in volume space, convert to drawable render space
- LLVector3 center = ((min + max) * 0.5f)*mat_vert;
- LLVector3 size = ((max-min) * 0.5f);
+ LLVector4a center;
+ LLVector4a t;
+ t.setAdd(min, max);
+ t.mul(0.5f);
+ mat_vert.affineTransform(t, center);
+ LLVector4a size;
+ size.setSub(max, min);
+ size.mul(0.5f);
+
+ llassert(less_than_max_mag(min));
+ llassert(less_than_max_mag(max));
+
if (!global_volume)
{
- size.scaleVec(mDrawablep->getVObj()->getScale());
+ //VECTORIZE THIS
+ LLVector4a scale;
+ scale.load3(mDrawablep->getVObj()->getScale().mV);
+ size.mul(scale);
}
- LLMatrix3 mat = mat_normal;
- LLVector3 x = mat.getFwdRow();
- LLVector3 y = mat.getLeftRow();
- LLVector3 z = mat.getUpRow();
- x.normVec();
- y.normVec();
- z.normVec();
+ mat_normal.mMatrix[0].normalize3fast();
+ mat_normal.mMatrix[1].normalize3fast();
+ mat_normal.mMatrix[2].normalize3fast();
+
+ LLVector4a v[4];
- mat.setRows(x,y,z);
+ //get 4 corners of bounding box
+ mat_normal.rotate(size,v[0]);
- LLQuaternion rotation = LLQuaternion(mat);
+ //VECTORIZE THIS
+ LLVector4a scale;
- LLVector3 v[4];
- //get 4 corners of bounding box
- v[0] = (size * rotation);
- v[1] = (LLVector3(-size.mV[0], -size.mV[1], size.mV[2]) * rotation);
- v[2] = (LLVector3(size.mV[0], -size.mV[1], -size.mV[2]) * rotation);
- v[3] = (LLVector3(-size.mV[0], size.mV[1], -size.mV[2]) * rotation);
+ scale.set(-1.f, -1.f, 1.f);
+ scale.mul(size);
+ mat_normal.rotate(scale, v[1]);
+
+ scale.set(1.f, -1.f, -1.f);
+ scale.mul(size);
+ mat_normal.rotate(scale, v[2]);
+
+ scale.set(-1.f, 1.f, -1.f);
+ scale.mul(size);
+ mat_normal.rotate(scale, v[3]);
- LLVector3& newMin = mExtents[0];
- LLVector3& newMax = mExtents[1];
+ LLVector4a& newMin = mExtents[0];
+ LLVector4a& newMax = mExtents[1];
newMin = newMax = center;
+ llassert(less_than_max_mag(center));
+
for (U32 i = 0; i < 4; i++)
{
- for (U32 j = 0; j < 3; j++)
- {
- F32 delta = fabsf(v[i].mV[j]);
- F32 min = center.mV[j] - delta;
- F32 max = center.mV[j] + delta;
-
- if (min < newMin.mV[j])
- {
- newMin.mV[j] = min;
- }
-
- if (max > newMax.mV[j])
- {
- newMax.mV[j] = max;
- }
- }
+ LLVector4a delta;
+ delta.setAbs(v[i]);
+ LLVector4a min;
+ min.setSub(center, delta);
+ LLVector4a max;
+ max.setAdd(center, delta);
+
+ newMin.setMin(newMin,min);
+ newMax.setMax(newMax,max);
+
+ llassert(less_than_max_mag(newMin));
+ llassert(less_than_max_mag(newMax));
}
if (!mDrawablep->isActive())
{
- LLVector3 offset = mDrawablep->getRegion()->getOriginAgent();
- newMin += offset;
- newMax += offset;
+ LLVector4a offset;
+ offset.load3(mDrawablep->getRegion()->getOriginAgent().mV);
+ newMin.add(offset);
+ newMax.add(offset);
+
+ llassert(less_than_max_mag(newMin));
+ llassert(less_than_max_mag(newMax));
}
- mCenterLocal = (newMin+newMax)*0.5f;
- LLVector3 tmp = (newMin - newMax) ;
- mBoundingSphereRadius = tmp.length() * 0.5f ;
+ t.setAdd(newMin, newMax);
+ t.mul(0.5f);
+
+ llassert(less_than_max_mag(t));
+
+ //VECTORIZE THIS
+ mCenterLocal.set(t.getF32ptr());
+
+ llassert(less_than_max_mag(newMin));
+ llassert(less_than_max_mag(newMax));
+
+ t.setSub(newMax,newMin);
+ mBoundingSphereRadius = t.getLength3().getF32()*0.5f;
updateCenterAgent();
}
@@ -703,18 +905,26 @@ LLVector2 LLFace::surfaceToTexture(LLVector2 surface_coord, LLVector3 position,
return surface_coord;
}
+ //VECTORIZE THIS
// see if we have a non-default mapping
U8 texgen = getTextureEntry()->getTexGen();
if (texgen != LLTextureEntry::TEX_GEN_DEFAULT)
{
- LLVector3 center = mDrawablep->getVOVolume()->getVolume()->getVolumeFace(mTEOffset).mCenter;
+ LLVector4a& center = *(mDrawablep->getVOVolume()->getVolume()->getVolumeFace(mTEOffset).mCenter);
+
+ LLVector4a volume_position;
+ volume_position.load3(mDrawablep->getVOVolume()->agentPositionToVolume(position).mV);
- LLVector3 scale = (mDrawablep->getVOVolume()->isVolumeGlobal()) ? LLVector3(1,1,1) : mVObjp->getScale();
- LLVector3 volume_position = mDrawablep->getVOVolume()->agentPositionToVolume(position);
- volume_position.scaleVec(scale);
+ if (!mDrawablep->getVOVolume()->isVolumeGlobal())
+ {
+ LLVector4a scale;
+ scale.load3(mVObjp->getScale().mV);
+ volume_position.mul(scale);
+ }
- LLVector3 volume_normal = mDrawablep->getVOVolume()->agentDirectionToVolume(normal);
- volume_normal.normalize();
+ LLVector4a volume_normal;
+ volume_normal.load3(mDrawablep->getVOVolume()->agentDirectionToVolume(normal).mV);
+ volume_normal.normalize3fast();
switch (texgen)
{
@@ -755,10 +965,10 @@ void LLFace::getPlanarProjectedParams(LLQuaternion* face_rot, LLVector3* face_po
{
const LLMatrix4& vol_mat = getWorldMatrix();
const LLVolumeFace& vf = getViewerObject()->getVolume()->getVolumeFace(mTEOffset);
- LLVector3 normal = vf.mVertices[0].mNormal;
- LLVector3 binormal = vf.mVertices[0].mBinormal;
+ const LLVector4a& normal4a = vf.mNormals[0];
+ const LLVector4a& binormal4a = vf.mBinormals[0];
LLVector2 projected_binormal;
- planarProjection(projected_binormal, normal, vf.mCenter, binormal);
+ planarProjection(projected_binormal, normal4a, *vf.mCenter, binormal4a);
projected_binormal -= LLVector2(0.5f, 0.5f); // this normally happens in xform()
*scale = projected_binormal.length();
// rotate binormal to match what planarProjection() thinks it is,
@@ -766,6 +976,10 @@ void LLFace::getPlanarProjectedParams(LLQuaternion* face_rot, LLVector3* face_po
projected_binormal.normalize();
F32 ang = acos(projected_binormal.mV[VY]);
ang = (projected_binormal.mV[VX] < 0.f) ? -ang : ang;
+
+ //VECTORIZE THIS
+ LLVector3 binormal(binormal4a.getF32ptr());
+ LLVector3 normal(normal4a.getF32ptr());
binormal.rotVec(ang, normal);
LLQuaternion local_rot( binormal % normal, binormal, normal );
*face_rot = local_rot * vol_mat.quaternion();
@@ -848,35 +1062,79 @@ void LLFace::updateRebuildFlags()
bool LLFace::canRenderAsMask()
{
+ if (LLPipeline::sNoAlpha)
+ {
+ return true;
+ }
+
const LLTextureEntry* te = getTextureEntry();
- return (
- (
- (LLPipeline::sRenderDeferred && LLPipeline::sAutoMaskAlphaDeferred) ||
-
- (!LLPipeline::sRenderDeferred && LLPipeline::sAutoMaskAlphaNonDeferred)
- ) // do we want masks at all?
- &&
- (te->getColor().mV[3] == 1.0f) && // can't treat as mask if we have face alpha
- !(LLPipeline::sRenderDeferred && te->getFullbright()) && // hack: alpha masking renders fullbright faces invisible in deferred rendering mode, need to figure out why - for now, avoid
+
+ if ((te->getColor().mV[3] == 1.0f) && // can't treat as mask if we have face alpha
(te->getGlow() == 0.f) && // glowing masks are hard to implement - don't mask
+ getTexture()->getIsAlphaMask()) // texture actually qualifies for masking (lazily recalculated but expensive)
+ {
+ if (LLPipeline::sRenderDeferred)
+ {
+ if (getViewerObject()->isHUDAttachment() || te->getFullbright())
+ { //hud attachments and fullbright objects are NOT subject to the deferred rendering pipe
+ return LLPipeline::sAutoMaskAlphaNonDeferred;
+ }
+ else
+ {
+ return LLPipeline::sAutoMaskAlphaDeferred;
+ }
+ }
+ else
+ {
+ return LLPipeline::sAutoMaskAlphaNonDeferred;
+ }
+ }
- getTexture()->getIsAlphaMask() // texture actually qualifies for masking (lazily recalculated but expensive)
- );
+ return false;
}
static LLFastTimer::DeclareTimer FTM_FACE_GET_GEOM("Face Geom");
+static LLFastTimer::DeclareTimer FTM_FACE_GEOM_POSITION("Position");
+static LLFastTimer::DeclareTimer FTM_FACE_GEOM_NORMAL("Normal");
+static LLFastTimer::DeclareTimer FTM_FACE_GEOM_TEXTURE("Texture");
+static LLFastTimer::DeclareTimer FTM_FACE_GEOM_COLOR("Color");
+static LLFastTimer::DeclareTimer FTM_FACE_GEOM_EMISSIVE("Emissive");
+static LLFastTimer::DeclareTimer FTM_FACE_GEOM_WEIGHTS("Weights");
+static LLFastTimer::DeclareTimer FTM_FACE_GEOM_BINORMAL("Binormal");
+static LLFastTimer::DeclareTimer FTM_FACE_GEOM_INDEX("Index");
+static LLFastTimer::DeclareTimer FTM_FACE_GEOM_INDEX_TAIL("Tail");
+static LLFastTimer::DeclareTimer FTM_FACE_POSITION_STORE("Pos");
+static LLFastTimer::DeclareTimer FTM_FACE_TEXTURE_INDEX_STORE("TexIdx");
+static LLFastTimer::DeclareTimer FTM_FACE_POSITION_PAD("Pad");
+static LLFastTimer::DeclareTimer FTM_FACE_TEX_DEFAULT("Default");
+static LLFastTimer::DeclareTimer FTM_FACE_TEX_QUICK("Quick");
+static LLFastTimer::DeclareTimer FTM_FACE_TEX_QUICK_NO_XFORM("No Xform");
+static LLFastTimer::DeclareTimer FTM_FACE_TEX_QUICK_XFORM("Xform");
+
+static LLFastTimer::DeclareTimer FTM_FACE_TEX_QUICK_PLANAR("Quick Planar");
BOOL LLFace::getGeometryVolume(const LLVolume& volume,
const S32 &f,
- const LLMatrix4& mat_vert, const LLMatrix3& mat_normal,
- const U16 &index_offset)
+ const LLMatrix4& mat_vert_in, const LLMatrix3& mat_norm_in,
+ const U16 &index_offset,
+ bool force_rebuild)
{
LLFastTimer t(FTM_FACE_GET_GEOM);
+ llassert(verify());
const LLVolumeFace &vf = volume.getVolumeFace(f);
- S32 num_vertices = (S32)vf.mVertices.size();
- S32 num_indices = LLPipeline::sUseTriStrips ? (S32)vf.mTriStrip.size() : (S32) vf.mIndices.size();
+ S32 num_vertices = (S32)vf.mNumVertices;
+ S32 num_indices = (S32) vf.mNumIndices;
+ if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_OCTREE))
+ {
+ updateRebuildFlags();
+ }
+
+
+ //don't use map range (generates many redundant unmap calls)
+ bool map_range = false; //gGLManager.mHasMapBufferRange || gGLManager.mHasFlushBufferRange;
+
if (mVertexBuffer.notNull())
{
if (num_indices + (S32) mIndicesIndex > mVertexBuffer->getNumIndices())
@@ -900,15 +1158,16 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
}
}
- LLStrider<LLVector3> vertices;
+ LLStrider<LLVector3> vert;
LLStrider<LLVector2> tex_coords;
LLStrider<LLVector2> tex_coords2;
- LLStrider<LLVector3> normals;
+ LLStrider<LLVector3> norm;
LLStrider<LLColor4U> colors;
- LLStrider<LLVector3> binormals;
+ LLStrider<LLVector3> binorm;
LLStrider<U16> indicesp;
+ LLStrider<LLVector4> wght;
- BOOL full_rebuild = mDrawablep->isState(LLDrawable::REBUILD_VOLUME);
+ BOOL full_rebuild = force_rebuild || mDrawablep->isState(LLDrawable::REBUILD_VOLUME);
BOOL global_volume = mDrawablep->getVOVolume()->isVolumeGlobal();
LLVector3 scale;
@@ -921,27 +1180,16 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
scale = mVObjp->getScale();
}
- BOOL rebuild_pos = full_rebuild || mDrawablep->isState(LLDrawable::REBUILD_POSITION);
- BOOL rebuild_color = full_rebuild || mDrawablep->isState(LLDrawable::REBUILD_COLOR);
- BOOL rebuild_tcoord = full_rebuild || mDrawablep->isState(LLDrawable::REBUILD_TCOORD);
- BOOL rebuild_normal = rebuild_pos && mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_NORMAL);
- BOOL rebuild_binormal = rebuild_pos && mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_BINORMAL);
+ bool rebuild_pos = full_rebuild || mDrawablep->isState(LLDrawable::REBUILD_POSITION);
+ bool rebuild_color = full_rebuild || mDrawablep->isState(LLDrawable::REBUILD_COLOR);
+ bool rebuild_emissive = rebuild_color && mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_EMISSIVE);
+ bool rebuild_tcoord = full_rebuild || mDrawablep->isState(LLDrawable::REBUILD_TCOORD);
+ bool rebuild_normal = rebuild_pos && mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_NORMAL);
+ bool rebuild_binormal = rebuild_pos && mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_BINORMAL);
+ bool rebuild_weights = rebuild_pos && mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_WEIGHT4);
const LLTextureEntry *tep = mVObjp->getTE(f);
- U8 bump_code = tep ? tep->getBumpmap() : 0;
-
- if (rebuild_pos)
- {
- mVertexBuffer->getVertexStrider(vertices, mGeomIndex);
- }
- if (rebuild_normal)
- {
- mVertexBuffer->getNormalStrider(normals, mGeomIndex);
- }
- if (rebuild_binormal)
- {
- mVertexBuffer->getBinormalStrider(binormals, mGeomIndex);
- }
+ const U8 bump_code = tep ? tep->getBumpmap() : 0;
F32 tcoord_xoffset = 0.f ;
F32 tcoord_yoffset = 0.f ;
@@ -951,12 +1199,6 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
if (rebuild_tcoord)
{
- mVertexBuffer->getTexCoord0Strider(tex_coords, mGeomIndex);
- if (bump_code && mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_TEXCOORD1))
- {
- mVertexBuffer->getTexCoord1Strider(tex_coords2, mGeomIndex);
- }
-
in_atlas = isAtlasInUse() ;
if(in_atlas)
{
@@ -969,12 +1211,6 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
tcoord_yscale = tmp->mV[1] ;
}
}
- if (rebuild_color)
- {
- mVertexBuffer->getColorStrider(colors, mGeomIndex);
- }
-
- F32 r = 0, os = 0, ot = 0, ms = 0, mt = 0, cos_ang = 0, sin_ang = 0;
BOOL is_static = mDrawablep->isStatic();
BOOL is_global = is_static;
@@ -990,59 +1226,6 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
clearState(GLOBAL);
}
- LLVector2 tmin, tmax;
-
-
-
- if (rebuild_tcoord)
- {
- if (tep)
- {
- r = tep->getRotation();
- os = tep->mOffsetS;
- ot = tep->mOffsetT;
- ms = tep->mScaleS;
- mt = tep->mScaleT;
- cos_ang = cos(r);
- sin_ang = sin(r);
- }
- else
- {
- cos_ang = 1.0f;
- sin_ang = 0.0f;
- os = 0.0f;
- ot = 0.0f;
- ms = 1.0f;
- mt = 1.0f;
- }
- }
-
- U8 tex_mode = 0;
-
- if (isState(TEXTURE_ANIM))
- {
- LLVOVolume* vobj = (LLVOVolume*) (LLViewerObject*) mVObjp;
- tex_mode = vobj->mTexAnimMode;
-
- if (!tex_mode)
- {
- clearState(TEXTURE_ANIM);
- }
- else
- {
- os = ot = 0.f;
- r = 0.f;
- cos_ang = 1.f;
- sin_ang = 0.f;
- ms = mt = 1.f;
- }
-
- if (getVirtualSize() >= MIN_TEX_ANIM_SIZE)
- { //don't override texture transform during tc bake
- tex_mode = 0;
- }
- }
-
LLColor4U color = tep->getColor();
if (rebuild_color)
@@ -1064,276 +1247,691 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
}
}
- // INDICES
+ // INDICES
if (full_rebuild)
{
- mVertexBuffer->getIndexStrider(indicesp, mIndicesIndex);
- if (LLPipeline::sUseTriStrips)
+ LLFastTimer t(FTM_FACE_GEOM_INDEX);
+ mVertexBuffer->getIndexStrider(indicesp, mIndicesIndex, mIndicesCount, map_range);
+
+ volatile __m128i* dst = (__m128i*) indicesp.get();
+ __m128i* src = (__m128i*) vf.mIndices;
+ __m128i offset = _mm_set1_epi16(index_offset);
+
+ S32 end = num_indices/8;
+
+ for (S32 i = 0; i < end; i++)
{
- for (U32 i = 0; i < (U32) num_indices; i++)
- {
- *indicesp++ = vf.mTriStrip[i] + index_offset;
- }
+ __m128i res = _mm_add_epi16(src[i], offset);
+ _mm_storeu_si128((__m128i*) dst++, res);
}
- else
+
{
- for (U32 i = 0; i < (U32) num_indices; i++)
+ LLFastTimer t(FTM_FACE_GEOM_INDEX_TAIL);
+ U16* idx = (U16*) dst;
+
+ for (S32 i = end*8; i < num_indices; ++i)
{
- *indicesp++ = vf.mIndices[i] + index_offset;
+ *idx++ = vf.mIndices[i]+index_offset;
}
}
+
+ if (map_range)
+ {
+ mVertexBuffer->flush();
+ }
}
+ LLMatrix4a mat_normal;
+ mat_normal.loadu(mat_norm_in);
- //bump setup
- LLVector3 binormal_dir( -sin_ang, cos_ang, 0 );
- LLVector3 bump_s_primary_light_ray;
- LLVector3 bump_t_primary_light_ray;
+ //if it's not fullbright and has no normals, bake sunlight based on face normal
+ //bool bake_sunlight = !getTextureEntry()->getFullbright() &&
+ // !mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_NORMAL);
- LLQuaternion bump_quat;
- if (mDrawablep->isActive())
- {
- bump_quat = LLQuaternion(mDrawablep->getRenderMatrix());
- }
-
- if (bump_code)
+ F32 r = 0, os = 0, ot = 0, ms = 0, mt = 0, cos_ang = 0, sin_ang = 0;
+
+ if (rebuild_tcoord)
{
- mVObjp->getVolume()->genBinormals(f);
- F32 offset_multiple;
- switch( bump_code )
+ LLFastTimer t(FTM_FACE_GEOM_TEXTURE);
+ bool do_xform;
+
+ if (tep)
{
- case BE_NO_BUMP:
- offset_multiple = 0.f;
- break;
- case BE_BRIGHTNESS:
- case BE_DARKNESS:
- if( mTexture.notNull() && mTexture->hasGLTexture())
+ r = tep->getRotation();
+ os = tep->mOffsetS;
+ ot = tep->mOffsetT;
+ ms = tep->mScaleS;
+ mt = tep->mScaleT;
+ cos_ang = cos(r);
+ sin_ang = sin(r);
+
+ if (cos_ang != 1.f ||
+ sin_ang != 0.f ||
+ os != 0.f ||
+ ot != 0.f ||
+ ms != 1.f ||
+ mt != 1.f)
{
- // Offset by approximately one texel
- S32 cur_discard = mTexture->getDiscardLevel();
- S32 max_size = llmax( mTexture->getWidth(), mTexture->getHeight() );
- max_size <<= cur_discard;
- const F32 ARTIFICIAL_OFFSET = 2.f;
- offset_multiple = ARTIFICIAL_OFFSET / (F32)max_size;
+ do_xform = true;
}
else
{
- offset_multiple = 1.f/256;
- }
- break;
-
- default: // Standard bumpmap textures. Assumed to be 256x256
- offset_multiple = 1.f / 256;
- break;
+ do_xform = false;
+ }
}
-
- F32 s_scale = 1.f;
- F32 t_scale = 1.f;
- if( tep )
+ else
{
- tep->getScale( &s_scale, &t_scale );
+ do_xform = false;
}
- // Use the nudged south when coming from above sun angle, such
- // that emboss mapping always shows up on the upward faces of cubes when
- // it's noon (since a lot of builders build with the sun forced to noon).
- LLVector3 sun_ray = gSky.mVOSkyp->mBumpSunDir;
- LLVector3 moon_ray = gSky.getMoonDirection();
- LLVector3& primary_light_ray = (sun_ray.mV[VZ] > 0) ? sun_ray : moon_ray;
+
+ //bump setup
+ LLVector4a binormal_dir( -sin_ang, cos_ang, 0.f );
+ LLVector4a bump_s_primary_light_ray(0.f, 0.f, 0.f);
+ LLVector4a bump_t_primary_light_ray(0.f, 0.f, 0.f);
- bump_s_primary_light_ray = offset_multiple * s_scale * primary_light_ray;
- bump_t_primary_light_ray = offset_multiple * t_scale * primary_light_ray;
- }
-
- U8 texgen = getTextureEntry()->getTexGen();
- if (rebuild_tcoord && texgen != LLTextureEntry::TEX_GEN_DEFAULT)
- { //planar texgen needs binormals
- mVObjp->getVolume()->genBinormals(f);
- }
-
- for (S32 i = 0; i < num_vertices; i++)
- {
- if (rebuild_tcoord)
+ LLQuaternion bump_quat;
+ if (mDrawablep->isActive())
{
- LLVector2 tc = vf.mVertices[i].mTexCoord;
+ bump_quat = LLQuaternion(mDrawablep->getRenderMatrix());
+ }
- if (texgen != LLTextureEntry::TEX_GEN_DEFAULT)
+ if (bump_code)
+ {
+ mVObjp->getVolume()->genBinormals(f);
+ F32 offset_multiple;
+ switch( bump_code )
{
- LLVector3 vec = vf.mVertices[i].mPosition;
-
- vec.scaleVec(scale);
-
- switch (texgen)
+ case BE_NO_BUMP:
+ offset_multiple = 0.f;
+ break;
+ case BE_BRIGHTNESS:
+ case BE_DARKNESS:
+ if( mTexture.notNull() && mTexture->hasGLTexture())
{
- case LLTextureEntry::TEX_GEN_PLANAR:
- planarProjection(tc, vf.mVertices[i].mNormal, vf.mCenter, vec);
- break;
- case LLTextureEntry::TEX_GEN_SPHERICAL:
- sphericalProjection(tc, vf.mVertices[i].mNormal, vf.mCenter, vec);
- break;
- case LLTextureEntry::TEX_GEN_CYLINDRICAL:
- cylindricalProjection(tc, vf.mVertices[i].mNormal, vf.mCenter, vec);
- break;
- default:
- break;
- }
+ // Offset by approximately one texel
+ S32 cur_discard = mTexture->getDiscardLevel();
+ S32 max_size = llmax( mTexture->getWidth(), mTexture->getHeight() );
+ max_size <<= cur_discard;
+ const F32 ARTIFICIAL_OFFSET = 2.f;
+ offset_multiple = ARTIFICIAL_OFFSET / (F32)max_size;
+ }
+ else
+ {
+ offset_multiple = 1.f/256;
+ }
+ break;
+
+ default: // Standard bumpmap textures. Assumed to be 256x256
+ offset_multiple = 1.f / 256;
+ break;
+ }
+
+ F32 s_scale = 1.f;
+ F32 t_scale = 1.f;
+ if( tep )
+ {
+ tep->getScale( &s_scale, &t_scale );
}
+ // Use the nudged south when coming from above sun angle, such
+ // that emboss mapping always shows up on the upward faces of cubes when
+ // it's noon (since a lot of builders build with the sun forced to noon).
+ LLVector3 sun_ray = gSky.mVOSkyp->mBumpSunDir;
+ LLVector3 moon_ray = gSky.getMoonDirection();
+ LLVector3& primary_light_ray = (sun_ray.mV[VZ] > 0) ? sun_ray : moon_ray;
+
+ bump_s_primary_light_ray.load3((offset_multiple * s_scale * primary_light_ray).mV);
+ bump_t_primary_light_ray.load3((offset_multiple * t_scale * primary_light_ray).mV);
+ }
+
+ U8 texgen = getTextureEntry()->getTexGen();
+ if (rebuild_tcoord && texgen != LLTextureEntry::TEX_GEN_DEFAULT)
+ { //planar texgen needs binormals
+ mVObjp->getVolume()->genBinormals(f);
+ }
- if (tex_mode && mTextureMatrix)
+ U8 tex_mode = 0;
+
+ if (isState(TEXTURE_ANIM))
+ {
+ LLVOVolume* vobj = (LLVOVolume*) (LLViewerObject*) mVObjp;
+ tex_mode = vobj->mTexAnimMode;
+
+ if (!tex_mode)
{
- LLVector3 tmp(tc.mV[0], tc.mV[1], 0.f);
- tmp = tmp * *mTextureMatrix;
- tc.mV[0] = tmp.mV[0];
- tc.mV[1] = tmp.mV[1];
+ clearState(TEXTURE_ANIM);
}
else
{
- xform(tc, cos_ang, sin_ang, os, ot, ms, mt);
+ os = ot = 0.f;
+ r = 0.f;
+ cos_ang = 1.f;
+ sin_ang = 0.f;
+ ms = mt = 1.f;
+
+ do_xform = false;
}
- if(in_atlas)
- {
- //
- //manually calculate tex-coord per vertex for varying address modes.
- //should be removed if shader can handle this.
- //
+ if (getVirtualSize() >= MIN_TEX_ANIM_SIZE)
+ { //don't override texture transform during tc bake
+ tex_mode = 0;
+ }
+ }
+
+ LLVector4a scalea;
+ scalea.load3(scale.mV);
- S32 int_part = 0 ;
- switch(mTexture->getAddressMode())
+ bool do_bump = bump_code && mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_TEXCOORD1);
+ bool do_tex_mat = tex_mode && mTextureMatrix;
+
+ if (!in_atlas && !do_bump)
+ { //not in atlas or not bump mapped, might be able to do a cheap update
+ mVertexBuffer->getTexCoord0Strider(tex_coords, mGeomIndex, mGeomCount);
+
+ if (texgen != LLTextureEntry::TEX_GEN_PLANAR)
+ {
+ LLFastTimer t(FTM_FACE_TEX_QUICK);
+ if (!do_tex_mat)
{
- case LLTexUnit::TAM_CLAMP:
- if(tc.mV[0] < 0.f)
+ if (!do_xform)
{
- tc.mV[0] = 0.f ;
+ LLFastTimer t(FTM_FACE_TEX_QUICK_NO_XFORM);
+ LLVector4a::memcpyNonAliased16((F32*) tex_coords.get(), (F32*) vf.mTexCoords, num_vertices*2*sizeof(F32));
}
- else if(tc.mV[0] > 1.f)
+ else
{
- tc.mV[0] = 1.f;
- }
+ LLFastTimer t(FTM_FACE_TEX_QUICK_XFORM);
+ F32* dst = (F32*) tex_coords.get();
+ LLVector4a* src = (LLVector4a*) vf.mTexCoords;
- if(tc.mV[1] < 0.f)
- {
- tc.mV[1] = 0.f ;
- }
- else if(tc.mV[1] > 1.f)
- {
- tc.mV[1] = 1.f;
+ LLVector4a trans;
+ trans.splat(-0.5f);
+
+ LLVector4a rot0;
+ rot0.set(cos_ang, -sin_ang, cos_ang, -sin_ang);
+
+ LLVector4a rot1;
+ rot1.set(sin_ang, cos_ang, sin_ang, cos_ang);
+
+ LLVector4a scale;
+ scale.set(ms, mt, ms, mt);
+
+ LLVector4a offset;
+ offset.set(os+0.5f, ot+0.5f, os+0.5f, ot+0.5f);
+
+ LLVector4Logical mask;
+ mask.clear();
+ mask.setElement<2>();
+ mask.setElement<3>();
+
+ U32 count = num_vertices/2 + num_vertices%2;
+
+ for (S32 i = 0; i < count; i++)
+ {
+ LLVector4a res = *src++;
+ xform4a(res, trans, mask, rot0, rot1, offset, scale);
+ res.store4a(dst);
+ dst += 4;
+ }
}
- break;
- case LLTexUnit::TAM_MIRROR:
- if(tc.mV[0] < 0.f)
- {
- tc.mV[0] = -tc.mV[0] ;
+ }
+ else
+ { //do tex mat, no texgen, no atlas, no bump
+ for (S32 i = 0; i < num_vertices; i++)
+ {
+ LLVector2 tc(vf.mTexCoords[i]);
+ //LLVector4a& norm = vf.mNormals[i];
+ //LLVector4a& center = *(vf.mCenter);
+
+ LLVector3 tmp(tc.mV[0], tc.mV[1], 0.f);
+ tmp = tmp * *mTextureMatrix;
+ tc.mV[0] = tmp.mV[0];
+ tc.mV[1] = tmp.mV[1];
+ *tex_coords++ = tc;
}
- int_part = (S32)tc.mV[0] ;
- if(int_part & 1) //odd number
- {
- tc.mV[0] = int_part + 1 - tc.mV[0] ;
+ }
+ }
+ else
+ { //no bump, no atlas, tex gen planar
+ LLFastTimer t(FTM_FACE_TEX_QUICK_PLANAR);
+ if (do_tex_mat)
+ {
+ for (S32 i = 0; i < num_vertices; i++)
+ {
+ LLVector2 tc(vf.mTexCoords[i]);
+ LLVector4a& norm = vf.mNormals[i];
+ LLVector4a& center = *(vf.mCenter);
+ LLVector4a vec = vf.mPositions[i];
+ vec.mul(scalea);
+ planarProjection(tc, norm, center, vec);
+
+ LLVector3 tmp(tc.mV[0], tc.mV[1], 0.f);
+ tmp = tmp * *mTextureMatrix;
+ tc.mV[0] = tmp.mV[0];
+ tc.mV[1] = tmp.mV[1];
+
+ *tex_coords++ = tc;
}
- else //even number
- {
- tc.mV[0] -= int_part ;
+ }
+ else
+ {
+ for (S32 i = 0; i < num_vertices; i++)
+ {
+ LLVector2 tc(vf.mTexCoords[i]);
+ LLVector4a& norm = vf.mNormals[i];
+ LLVector4a& center = *(vf.mCenter);
+ LLVector4a vec = vf.mPositions[i];
+ vec.mul(scalea);
+ planarProjection(tc, norm, center, vec);
+
+ xform(tc, cos_ang, sin_ang, os, ot, ms, mt);
+
+ *tex_coords++ = tc;
}
+ }
+ }
- if(tc.mV[1] < 0.f)
- {
- tc.mV[1] = -tc.mV[1] ;
- }
- int_part = (S32)tc.mV[1] ;
- if(int_part & 1) //odd number
- {
- tc.mV[1] = int_part + 1 - tc.mV[1] ;
- }
- else //even number
- {
- tc.mV[1] -= int_part ;
- }
- break;
- case LLTexUnit::TAM_WRAP:
- if(tc.mV[0] > 1.f)
- tc.mV[0] -= (S32)(tc.mV[0] - 0.00001f) ;
- else if(tc.mV[0] < -1.f)
- tc.mV[0] -= (S32)(tc.mV[0] + 0.00001f) ;
-
- if(tc.mV[1] > 1.f)
- tc.mV[1] -= (S32)(tc.mV[1] - 0.00001f) ;
- else if(tc.mV[1] < -1.f)
- tc.mV[1] -= (S32)(tc.mV[1] + 0.00001f) ;
-
- if(tc.mV[0] < 0.f)
+ if (map_range)
+ {
+ mVertexBuffer->flush();
+ }
+ }
+ else
+ { //either bump mapped or in atlas, just do the whole expensive loop
+ LLFastTimer t(FTM_FACE_TEX_DEFAULT);
+ mVertexBuffer->getTexCoord0Strider(tex_coords, mGeomIndex, mGeomCount, map_range);
+
+ std::vector<LLVector2> bump_tc;
+
+ for (S32 i = 0; i < num_vertices; i++)
+ {
+ LLVector2 tc(vf.mTexCoords[i]);
+
+ LLVector4a& norm = vf.mNormals[i];
+
+ LLVector4a& center = *(vf.mCenter);
+
+ if (texgen != LLTextureEntry::TEX_GEN_DEFAULT)
+ {
+ LLVector4a vec = vf.mPositions[i];
+
+ vec.mul(scalea);
+
+ switch (texgen)
{
- tc.mV[0] = 1.0f + tc.mV[0] ;
- }
- if(tc.mV[1] < 0.f)
+ case LLTextureEntry::TEX_GEN_PLANAR:
+ planarProjection(tc, norm, center, vec);
+ break;
+ case LLTextureEntry::TEX_GEN_SPHERICAL:
+ sphericalProjection(tc, norm, center, vec);
+ break;
+ case LLTextureEntry::TEX_GEN_CYLINDRICAL:
+ cylindricalProjection(tc, norm, center, vec);
+ break;
+ default:
+ break;
+ }
+ }
+
+ if (tex_mode && mTextureMatrix)
+ {
+ LLVector3 tmp(tc.mV[0], tc.mV[1], 0.f);
+ tmp = tmp * *mTextureMatrix;
+ tc.mV[0] = tmp.mV[0];
+ tc.mV[1] = tmp.mV[1];
+ }
+ else
+ {
+ xform(tc, cos_ang, sin_ang, os, ot, ms, mt);
+ }
+
+ if(in_atlas)
+ {
+ //
+ //manually calculate tex-coord per vertex for varying address modes.
+ //should be removed if shader can handle this.
+ //
+
+ S32 int_part = 0 ;
+ switch(mTexture->getAddressMode())
{
- tc.mV[1] = 1.0f + tc.mV[1] ;
+ case LLTexUnit::TAM_CLAMP:
+ if(tc.mV[0] < 0.f)
+ {
+ tc.mV[0] = 0.f ;
+ }
+ else if(tc.mV[0] > 1.f)
+ {
+ tc.mV[0] = 1.f;
+ }
+
+ if(tc.mV[1] < 0.f)
+ {
+ tc.mV[1] = 0.f ;
+ }
+ else if(tc.mV[1] > 1.f)
+ {
+ tc.mV[1] = 1.f;
+ }
+ break;
+ case LLTexUnit::TAM_MIRROR:
+ if(tc.mV[0] < 0.f)
+ {
+ tc.mV[0] = -tc.mV[0] ;
+ }
+ int_part = (S32)tc.mV[0] ;
+ if(int_part & 1) //odd number
+ {
+ tc.mV[0] = int_part + 1 - tc.mV[0] ;
+ }
+ else //even number
+ {
+ tc.mV[0] -= int_part ;
+ }
+
+ if(tc.mV[1] < 0.f)
+ {
+ tc.mV[1] = -tc.mV[1] ;
+ }
+ int_part = (S32)tc.mV[1] ;
+ if(int_part & 1) //odd number
+ {
+ tc.mV[1] = int_part + 1 - tc.mV[1] ;
+ }
+ else //even number
+ {
+ tc.mV[1] -= int_part ;
+ }
+ break;
+ case LLTexUnit::TAM_WRAP:
+ if(tc.mV[0] > 1.f)
+ tc.mV[0] -= (S32)(tc.mV[0] - 0.00001f) ;
+ else if(tc.mV[0] < -1.f)
+ tc.mV[0] -= (S32)(tc.mV[0] + 0.00001f) ;
+
+ if(tc.mV[1] > 1.f)
+ tc.mV[1] -= (S32)(tc.mV[1] - 0.00001f) ;
+ else if(tc.mV[1] < -1.f)
+ tc.mV[1] -= (S32)(tc.mV[1] + 0.00001f) ;
+
+ if(tc.mV[0] < 0.f)
+ {
+ tc.mV[0] = 1.0f + tc.mV[0] ;
+ }
+ if(tc.mV[1] < 0.f)
+ {
+ tc.mV[1] = 1.0f + tc.mV[1] ;
+ }
+ break;
+ default:
+ break;
}
- break;
- default:
- break;
+
+ tc.mV[0] = tcoord_xoffset + tcoord_xscale * tc.mV[0] ;
+ tc.mV[1] = tcoord_yoffset + tcoord_yscale * tc.mV[1] ;
+ }
+
+
+ *tex_coords++ = tc;
+ if (do_bump)
+ {
+ bump_tc.push_back(tc);
}
-
- tc.mV[0] = tcoord_xoffset + tcoord_xscale * tc.mV[0] ;
- tc.mV[1] = tcoord_yoffset + tcoord_yscale * tc.mV[1] ;
}
-
- *tex_coords++ = tc;
-
- if (bump_code && mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_TEXCOORD1))
+ if (map_range)
{
- LLVector3 tangent = vf.mVertices[i].mBinormal % vf.mVertices[i].mNormal;
+ mVertexBuffer->flush();
+ }
- LLMatrix3 tangent_to_object;
- tangent_to_object.setRows(tangent, vf.mVertices[i].mBinormal, vf.mVertices[i].mNormal);
- LLVector3 binormal = binormal_dir * tangent_to_object;
- binormal = binormal * mat_normal;
-
- if (mDrawablep->isActive())
+ if (do_bump)
+ {
+ mVertexBuffer->getTexCoord1Strider(tex_coords2, mGeomIndex, mGeomCount, map_range);
+
+ for (S32 i = 0; i < num_vertices; i++)
{
- binormal *= bump_quat;
+ LLVector4a tangent;
+ tangent.setCross3(vf.mBinormals[i], vf.mNormals[i]);
+
+ LLMatrix4a tangent_to_object;
+ tangent_to_object.setRows(tangent, vf.mBinormals[i], vf.mNormals[i]);
+ LLVector4a t;
+ tangent_to_object.rotate(binormal_dir, t);
+ LLVector4a binormal;
+ mat_normal.rotate(t, binormal);
+
+ //VECTORIZE THIS
+ if (mDrawablep->isActive())
+ {
+ LLVector3 t;
+ t.set(binormal.getF32ptr());
+ t *= bump_quat;
+ binormal.load3(t.mV);
+ }
+
+ binormal.normalize3fast();
+ LLVector2 tc = bump_tc[i];
+ tc += LLVector2( bump_s_primary_light_ray.dot3(tangent).getF32(), bump_t_primary_light_ray.dot3(binormal).getF32() );
+
+ *tex_coords2++ = tc;
}
- binormal.normVec();
- tc += LLVector2( bump_s_primary_light_ray * tangent, bump_t_primary_light_ray * binormal );
-
- *tex_coords2++ = tc;
- }
+ if (map_range)
+ {
+ mVertexBuffer->flush();
+ }
+ }
}
+ }
+
+ if (rebuild_pos)
+ {
+ LLFastTimer t(FTM_FACE_GEOM_POSITION);
+ llassert(num_vertices > 0);
+
+ mVertexBuffer->getVertexStrider(vert, mGeomIndex, mGeomCount, map_range);
- if (rebuild_pos)
+
+ LLMatrix4a mat_vert;
+ mat_vert.loadu(mat_vert_in);
+
+ LLVector4a* src = vf.mPositions;
+ volatile F32* dst = (volatile F32*) vert.get();
+
+ volatile F32* end = dst+num_vertices*4;
+ LLVector4a res;
+
+ LLVector4a texIdx;
+
+ U8 index = mTextureIndex < 255 ? mTextureIndex : 0;
+
+ F32 val = 0.f;
+ U8* vp = (U8*) &val;
+ vp[0] = index;
+ vp[1] = 0;
+ vp[2] = 0;
+ vp[3] = 0;
+
+ llassert(index <= LLGLSLShader::sIndexedTextureChannels-1);
+
+ LLVector4Logical mask;
+ mask.clear();
+ mask.setElement<3>();
+
+ texIdx.set(0,0,0,val);
+
{
- *vertices++ = vf.mVertices[i].mPosition * mat_vert;
+ LLFastTimer t(FTM_FACE_POSITION_STORE);
+ LLVector4a tmp;
+
+ do
+ {
+ mat_vert.affineTransform(*src++, res);
+ tmp.setSelectWithMask(mask, texIdx, res);
+ tmp.store4a((F32*) dst);
+ dst += 4;
+ }
+ while(dst < end);
}
+
+ {
+ LLFastTimer t(FTM_FACE_POSITION_PAD);
+ S32 aligned_pad_vertices = mGeomCount - num_vertices;
+ res.set(res[0], res[1], res[2], 0.f);
+
+ while (aligned_pad_vertices > 0)
+ {
+ --aligned_pad_vertices;
+ res.store4a((F32*) dst);
+ dst += 4;
+ }
+ }
+
+ if (map_range)
+ {
+ mVertexBuffer->flush();
+ }
+ }
- if (rebuild_normal)
+ if (rebuild_normal)
+ {
+ LLFastTimer t(FTM_FACE_GEOM_NORMAL);
+ mVertexBuffer->getNormalStrider(norm, mGeomIndex, mGeomCount, map_range);
+ F32* normals = (F32*) norm.get();
+
+ for (S32 i = 0; i < num_vertices; i++)
+ {
+ LLVector4a normal;
+ mat_normal.rotate(vf.mNormals[i], normal);
+ normal.normalize3fast();
+ normal.store4a(normals);
+ normals += 4;
+ }
+
+ if (map_range)
{
- LLVector3 normal = vf.mVertices[i].mNormal * mat_normal;
- normal.normVec();
-
- *normals++ = normal;
+ mVertexBuffer->flush();
}
+ }
+
+ if (rebuild_binormal)
+ {
+ LLFastTimer t(FTM_FACE_GEOM_BINORMAL);
+ mVertexBuffer->getBinormalStrider(binorm, mGeomIndex, mGeomCount, map_range);
+ F32* binormals = (F32*) binorm.get();
- if (rebuild_binormal)
+ for (S32 i = 0; i < num_vertices; i++)
+ {
+ LLVector4a binormal;
+ mat_normal.rotate(vf.mBinormals[i], binormal);
+ binormal.normalize3fast();
+ binormal.store4a(binormals);
+ binormals += 4;
+ }
+
+ if (map_range)
{
- LLVector3 binormal = vf.mVertices[i].mBinormal * mat_normal;
- binormal.normVec();
- *binormals++ = binormal;
+ mVertexBuffer->flush();
}
+ }
+
+ if (rebuild_weights && vf.mWeights)
+ {
+ LLFastTimer t(FTM_FACE_GEOM_WEIGHTS);
+ mVertexBuffer->getWeight4Strider(wght, mGeomIndex, mGeomCount, map_range);
+ F32* weights = (F32*) wght.get();
+ LLVector4a::memcpyNonAliased16(weights, (F32*) vf.mWeights, num_vertices*4*sizeof(F32));
+ if (map_range)
+ {
+ mVertexBuffer->flush();
+ }
+ }
+
+ if (rebuild_color && mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_COLOR) )
+ {
+ LLFastTimer t(FTM_FACE_GEOM_COLOR);
+ mVertexBuffer->getColorStrider(colors, mGeomIndex, mGeomCount, map_range);
+
+ LLVector4a src;
+
+ U32 vec[4];
+ vec[0] = vec[1] = vec[2] = vec[3] = color.mAll;
- if (rebuild_color)
+ src.loadua((F32*) vec);
+
+ F32* dst = (F32*) colors.get();
+ S32 num_vecs = num_vertices/4;
+ if (num_vertices%4 > 0)
+ {
+ ++num_vecs;
+ }
+
+ for (S32 i = 0; i < num_vecs; i++)
+ {
+ src.store4a(dst);
+ dst += 4;
+ }
+
+ if (map_range)
{
- *colors++ = color;
+ mVertexBuffer->flush();
}
}
+ if (rebuild_emissive)
+ {
+ LLFastTimer t(FTM_FACE_GEOM_EMISSIVE);
+ LLStrider<LLColor4U> emissive;
+ mVertexBuffer->getEmissiveStrider(emissive, mGeomIndex, mGeomCount, map_range);
+
+ U8 glow = (U8) llclamp((S32) (getTextureEntry()->getGlow()*255), 0, 255);
+
+ LLVector4a src;
+
+
+ U32 glow32 = glow |
+ (glow << 8) |
+ (glow << 16) |
+ (glow << 24);
+
+ U32 vec[4];
+ vec[0] = vec[1] = vec[2] = vec[3] = glow32;
+
+ src.loadua((F32*) vec);
+
+ F32* dst = (F32*) emissive.get();
+ S32 num_vecs = num_vertices/4;
+ if (num_vertices%4 > 0)
+ {
+ ++num_vecs;
+ }
+
+ for (S32 i = 0; i < num_vecs; i++)
+ {
+ src.store4a(dst);
+ dst += 4;
+ }
+
+ if (map_range)
+ {
+ mVertexBuffer->flush();
+ }
+ }
if (rebuild_tcoord)
{
mTexExtents[0].setVec(0,0);
mTexExtents[1].setVec(1,1);
xform(mTexExtents[0], cos_ang, sin_ang, os, ot, ms, mt);
- xform(mTexExtents[1], cos_ang, sin_ang, os, ot, ms, mt);
+ xform(mTexExtents[1], cos_ang, sin_ang, os, ot, ms, mt);
+
+ F32 es = vf.mTexCoordExtents[1].mV[0] - vf.mTexCoordExtents[0].mV[0] ;
+ F32 et = vf.mTexCoordExtents[1].mV[1] - vf.mTexCoordExtents[0].mV[1] ;
+ mTexExtents[0][0] *= es ;
+ mTexExtents[1][0] *= es ;
+ mTexExtents[0][1] *= et ;
+ mTexExtents[1][1] *= et ;
}
+
mLastVertexBuffer = mVertexBuffer;
mLastGeomCount = mGeomCount;
mLastGeomIndex = mGeomIndex;
@@ -1411,20 +2009,32 @@ F32 LLFace::getTextureVirtualSize()
BOOL LLFace::calcPixelArea(F32& cos_angle_to_view_dir, F32& radius)
{
+ //VECTORIZE THIS
//get area of circle around face
- LLVector3 center = getPositionAgent();
- LLVector3 size = (mExtents[1] - mExtents[0]) * 0.5f;
+ LLVector4a center;
+ center.load3(getPositionAgent().mV);
+ LLVector4a size;
+ size.setSub(mExtents[1], mExtents[0]);
+ size.mul(0.5f);
+
LLViewerCamera* camera = LLViewerCamera::getInstance();
- F32 size_squared = size.lengthSquared() ;
- LLVector3 lookAt = center - camera->getOrigin();
- F32 dist = lookAt.normVec() ;
+ F32 size_squared = size.dot3(size).getF32();
+ LLVector4a lookAt;
+ LLVector4a t;
+ t.load3(camera->getOrigin().mV);
+ lookAt.setSub(center, t);
+ F32 dist = lookAt.getLength3().getF32();
+ dist = llmax(dist-size.getLength3().getF32(), 0.f);
+ lookAt.normalize3fast() ;
//get area of circle around node
- F32 app_angle = atanf(fsqrtf(size_squared) / dist);
+ F32 app_angle = atanf((F32) sqrt(size_squared) / dist);
radius = app_angle*LLDrawable::sCurPixelAngle;
mPixelArea = radius*radius * 3.14159f;
- cos_angle_to_view_dir = lookAt * camera->getXAxis() ;
+ LLVector4a x_axis;
+ x_axis.load3(camera->getXAxis().mV);
+ cos_angle_to_view_dir = lookAt.dot3(x_axis).getF32();
//if has media, check if the face is out of the view frustum.
if(hasMedia())
@@ -1440,7 +2050,10 @@ BOOL LLFace::calcPixelArea(F32& cos_angle_to_view_dir, F32& radius)
}
else
{
- if(dist * dist * (lookAt - camera->getXAxis()).lengthSquared() < size_squared)
+ LLVector4a d;
+ d.setSub(lookAt, x_axis);
+
+ if(dist * dist * d.dot3(d) < size_squared)
{
cos_angle_to_view_dir = 1.0f ;
}
@@ -1555,16 +2168,7 @@ BOOL LLFace::verify(const U32* indices_array) const
BOOL ok = TRUE;
if( mVertexBuffer.isNull() )
- {
- if( mGeomCount )
- {
- // This happens before teleports as faces are torn down.
- // Stop the crash in DEV-31893 with a null pointer check,
- // but present this info.
- // To clean up the log, the geometry could be cleared, or the
- // face could otherwise be marked for no ::verify.
- llinfos << "Face with no vertex buffer and " << mGeomCount << " mGeomCount" << llendl;
- }
+ { //no vertex buffer, face is implicitly valid
return TRUE;
}
@@ -1572,7 +2176,7 @@ BOOL LLFace::verify(const U32* indices_array) const
if ((mGeomIndex + mGeomCount) > mVertexBuffer->getNumVerts())
{
ok = FALSE;
- llinfos << "Face not within pool range!" << llendl;
+ llinfos << "Face references invalid vertices!" << llendl;
}
S32 indices_count = (S32)getIndicesCount();
@@ -1588,6 +2192,12 @@ BOOL LLFace::verify(const U32* indices_array) const
llinfos << "Face has bogus indices count" << llendl;
}
+ if (mIndicesIndex + mIndicesCount > mVertexBuffer->getNumIndices())
+ {
+ ok = FALSE;
+ llinfos << "Face references invalid indices!" << llendl;
+ }
+
#if 0
S32 geom_start = getGeomStart();
S32 geom_count = mGeomCount;
@@ -1644,7 +2254,7 @@ void LLFace::renderSetColor() const
{
const LLColor4* color = &(getRenderColor());
- glColor4fv(color->mV);
+ gGL.diffuseColor4fv(color->mV);
}
}
@@ -1679,10 +2289,10 @@ S32 LLFace::renderElements(const U16 *index_array) const
}
else
{
- glPushMatrix();
- glMultMatrixf((float*)getRenderMatrix().mMatrix);
+ gGL.pushMatrix();
+ gGL.multMatrix((float*)getRenderMatrix().mMatrix);
ret = pushVertices(index_array);
- glPopMatrix();
+ gGL.popMatrix();
}
return ret;
@@ -1721,13 +2331,13 @@ S32 LLFace::getColors(LLStrider<LLColor4U> &colors)
}
// llassert(mGeomIndex >= 0);
- mVertexBuffer->getColorStrider(colors, mGeomIndex);
+ mVertexBuffer->getColorStrider(colors, mGeomIndex, mGeomCount);
return mGeomIndex;
}
S32 LLFace::getIndices(LLStrider<U16> &indicesp)
{
- mVertexBuffer->getIndexStrider(indicesp, mIndicesIndex);
+ mVertexBuffer->getIndexStrider(indicesp, mIndicesIndex, mIndicesCount);
llassert(indicesp[0] != indicesp[1]);
return mIndicesIndex;
}
@@ -1896,3 +2506,78 @@ BOOL LLFace::switchTexture()
return mUsingAtlas ;
}
+
+void LLFace::setVertexBuffer(LLVertexBuffer* buffer)
+{
+ mVertexBuffer = buffer;
+ llassert(verify());
+}
+
+void LLFace::clearVertexBuffer()
+{
+ mVertexBuffer = NULL;
+ mLastVertexBuffer = NULL;
+}
+
+//static
+U32 LLFace::getRiggedDataMask(U32 type)
+{
+ static const U32 rigged_data_mask[] = {
+ LLDrawPoolAvatar::RIGGED_SIMPLE_MASK,
+ LLDrawPoolAvatar::RIGGED_FULLBRIGHT_MASK,
+ LLDrawPoolAvatar::RIGGED_SHINY_MASK,
+ LLDrawPoolAvatar::RIGGED_FULLBRIGHT_SHINY_MASK,
+ LLDrawPoolAvatar::RIGGED_GLOW_MASK,
+ LLDrawPoolAvatar::RIGGED_ALPHA_MASK,
+ LLDrawPoolAvatar::RIGGED_FULLBRIGHT_ALPHA_MASK,
+ LLDrawPoolAvatar::RIGGED_DEFERRED_BUMP_MASK,
+ LLDrawPoolAvatar::RIGGED_DEFERRED_SIMPLE_MASK,
+ };
+
+ llassert(type < sizeof(rigged_data_mask)/sizeof(U32));
+
+ return rigged_data_mask[type];
+}
+
+U32 LLFace::getRiggedVertexBufferDataMask() const
+{
+ U32 data_mask = 0;
+ for (U32 i = 0; i < mRiggedIndex.size(); ++i)
+ {
+ if (mRiggedIndex[i] > -1)
+ {
+ data_mask |= LLFace::getRiggedDataMask(i);
+ }
+ }
+
+ return data_mask;
+}
+
+S32 LLFace::getRiggedIndex(U32 type) const
+{
+ if (mRiggedIndex.empty())
+ {
+ return -1;
+ }
+
+ llassert(type < mRiggedIndex.size());
+
+ return mRiggedIndex[type];
+}
+
+void LLFace::setRiggedIndex(U32 type, S32 index)
+{
+ if (mRiggedIndex.empty())
+ {
+ mRiggedIndex.resize(LLDrawPoolAvatar::NUM_RIGGED_PASSES);
+ for (U32 i = 0; i < mRiggedIndex.size(); ++i)
+ {
+ mRiggedIndex[i] = -1;
+ }
+ }
+
+ llassert(type < mRiggedIndex.size());
+
+ mRiggedIndex[type] = index;
+}
+
diff --git a/indra/newview/llface.h b/indra/newview/llface.h
index 6c941bd092..82e4ab61b7 100644
--- a/indra/newview/llface.h
+++ b/indra/newview/llface.h
@@ -59,6 +59,17 @@ class LLFace
{
public:
+ LLFace(const LLFace& rhs)
+ {
+ *this = rhs;
+ }
+
+ const LLFace& operator=(const LLFace& rhs)
+ {
+ llerrs << "Illegal operation!" << llendl;
+ return *this;
+ }
+
enum EMasks
{
LIGHT = 0x0001,
@@ -67,6 +78,7 @@ public:
HUD_RENDER = 0x0008,
USE_FACE_COLOR = 0x0010,
TEXTURE_ANIM = 0x0020,
+ RIGGED = 0x0040,
};
static void initClass();
@@ -82,6 +94,8 @@ public:
U16 getGeomCount() const { return mGeomCount; } // vertex count for this face
U16 getGeomIndex() const { return mGeomIndex; } // index into draw pool
U16 getGeomStart() const { return mGeomIndex; } // index into draw pool
+ void setTextureIndex(U8 index);
+ U8 getTextureIndex() const { return mTextureIndex; }
void setTexture(LLViewerTexture* tex) ;
void switchTexture(LLViewerTexture* new_texture);
void dirtyTexture();
@@ -119,14 +133,14 @@ public:
LLDrawable* getDrawable() const { return mDrawablep; }
LLViewerObject* getViewerObject() const { return mVObjp; }
S32 getLOD() const { return mVObjp.notNull() ? mVObjp->getLOD() : 0; }
- LLVertexBuffer* getVertexBuffer() const { return mVertexBuffer; }
void setPoolType(U32 type) { mPoolType = type; }
S32 getTEOffset() { return mTEOffset; }
LLViewerTexture* getTexture() const;
void setViewerObject(LLViewerObject* object);
void setPool(LLFacePool *pool, LLViewerTexture *texturep);
-
+ void setPool(LLFacePool* pool);
+
void setDrawable(LLDrawable *drawable);
void setTEOffset(const S32 te_offset);
@@ -142,7 +156,8 @@ public:
BOOL getGeometryVolume(const LLVolume& volume,
const S32 &f,
const LLMatrix4& mat_vert, const LLMatrix3& mat_normal,
- const U16 &index_offset);
+ const U16 &index_offset,
+ bool force_rebuild = false);
// For avatar
U16 getGeometryAvatar(
@@ -161,7 +176,7 @@ public:
S32 getColors(LLStrider<LLColor4U> &colors);
S32 getIndices(LLStrider<U16> &indices);
- void setSize(const S32 numVertices, const S32 num_indices = 0);
+ void setSize(S32 numVertices, S32 num_indices = 0, bool align = false);
BOOL genVolumeBBoxes(const LLVolume &volume, S32 f,
const LLMatrix4& mat, const LLMatrix3& inv_trans_mat, BOOL global_volume = FALSE);
@@ -183,8 +198,8 @@ public:
BOOL verify(const U32* indices_array = NULL) const;
void printDebugInfo() const;
- void setGeomIndex(U16 idx) { mGeomIndex = idx; }
- void setIndicesIndex(S32 idx) { mIndicesIndex = idx; }
+ void setGeomIndex(U16 idx);
+ void setIndicesIndex(S32 idx);
void setDrawInfo(LLDrawInfo* draw_info);
F32 getTextureVirtualSize() ;
@@ -205,6 +220,19 @@ public:
void removeAtlas() ;
BOOL switchTexture() ;
+ //vertex buffer tracking
+ void setVertexBuffer(LLVertexBuffer* buffer);
+ void clearVertexBuffer(); //sets mVertexBuffer and mLastVertexBuffer to NULL
+ LLVertexBuffer* getVertexBuffer() const { return mVertexBuffer; }
+ U32 getRiggedVertexBufferDataMask() const;
+ S32 getRiggedIndex(U32 type) const;
+ void setRiggedIndex(U32 type, S32 index);
+
+ static U32 getRiggedDataMask(U32 type);
+
+public: //aligned members
+ LLVector4a mExtents[2];
+
private:
F32 adjustPartialOverlapPixelArea(F32 cos_angle_to_view_dir, F32 radius );
BOOL calcPixelArea(F32& cos_angle_to_view_dir, F32& radius) ;
@@ -216,20 +244,19 @@ public:
LLVector3 mCenterLocal;
LLVector3 mCenterAgent;
- LLVector3 mExtents[2];
+
LLVector2 mTexExtents[2];
F32 mDistance;
- LLPointer<LLVertexBuffer> mVertexBuffer;
- LLPointer<LLVertexBuffer> mLastVertexBuffer;
F32 mLastUpdateTime;
+ F32 mLastSkinTime;
F32 mLastMoveTime;
LLMatrix4* mTextureMatrix;
LLDrawInfo* mDrawInfo;
private:
- friend class LLGeometryManager;
- friend class LLVolumeGeometryManager;
-
+ LLPointer<LLVertexBuffer> mVertexBuffer;
+ LLPointer<LLVertexBuffer> mLastVertexBuffer;
+
U32 mState;
LLFacePool* mDrawPoolp;
U32 mPoolType;
@@ -237,6 +264,7 @@ private:
U16 mGeomCount; // vertex count for this face
U16 mGeomIndex; // index into draw pool
+ U8 mTextureIndex; // index of texture channel to use for pseudo-atlasing
U32 mIndicesCount;
U32 mIndicesIndex; // index into draw pool for indices (yeah, I know!)
S32 mIndexInTex ;
@@ -254,6 +282,8 @@ private:
S32 mTEOffset;
S32 mReferenceIndex;
+ std::vector<S32> mRiggedIndex;
+
F32 mVSize;
F32 mPixelArea;
@@ -299,13 +329,9 @@ public:
{
return lhs->getTexture() < rhs->getTexture();
}
- else if (lte->getBumpShinyFullbright() != rte->getBumpShinyFullbright())
- {
- return lte->getBumpShinyFullbright() < rte->getBumpShinyFullbright();
- }
else
{
- return lte->getGlow() < rte->getGlow();
+ return lte->getBumpShinyFullbright() < rte->getBumpShinyFullbright();
}
}
};
diff --git a/indra/newview/llfasttimerview.cpp b/indra/newview/llfasttimerview.cpp
index 92a3b9b2f5..9664aa7dbe 100644
--- a/indra/newview/llfasttimerview.cpp
+++ b/indra/newview/llfasttimerview.cpp
@@ -32,7 +32,9 @@
#include "llrect.h"
#include "llerror.h"
#include "llgl.h"
+#include "llimagepng.h"
#include "llrender.h"
+#include "llrendertarget.h"
#include "lllocalcliprect.h"
#include "llmath.h"
#include "llfontgl.h"
@@ -49,6 +51,8 @@
#include "llfasttimer.h"
#include "lltreeiterators.h"
#include "llmetricperformancetester.h"
+#include "llviewerstats.h"
+
//////////////////////////////////////////////////////////////////////////////
static const S32 MAX_VISIBLE_HISTORY = 10;
@@ -76,12 +80,10 @@ static timer_tree_iterator_t end_timer_tree()
return timer_tree_iterator_t();
}
-LLFastTimerView::LLFastTimerView(const LLRect& rect)
-: LLFloater(LLSD()),
+LLFastTimerView::LLFastTimerView(const LLSD& key)
+: LLFloater(key),
mHoverTimer(NULL)
{
- setRect(rect);
- setVisible(FALSE);
mDisplayMode = 0;
mAvgCountTotal = 0;
mMaxCountTotal = 0;
@@ -94,10 +96,31 @@ LLFastTimerView::LLFastTimerView(const LLRect& rect)
FTV_NUM_TIMERS = LLFastTimer::NamedTimer::instanceCount();
mPrintStats = -1;
mAverageCyclesPerTimer = 0;
- setCanMinimize(false);
- setCanClose(true);
}
+void LLFastTimerView::onPause()
+{
+ LLFastTimer::sPauseHistory = !LLFastTimer::sPauseHistory;
+ // reset scroll to bottom when unpausing
+ if (!LLFastTimer::sPauseHistory)
+ {
+ mScrollIndex = 0;
+ LLFastTimer::sResetHistory = true;
+ getChild<LLButton>("pause_btn")->setLabel(getString("pause"));
+ }
+ else
+ {
+ getChild<LLButton>("pause_btn")->setLabel(getString("run"));
+ }
+}
+
+BOOL LLFastTimerView::postBuild()
+{
+ LLButton& pause_btn = getChildRef<LLButton>("pause_btn");
+
+ pause_btn.setCommitCallback(boost::bind(&LLFastTimerView::onPause, this));
+ return TRUE;
+}
BOOL LLFastTimerView::handleRightMouseDown(S32 x, S32 y, MASK mask)
{
@@ -112,19 +135,21 @@ BOOL LLFastTimerView::handleRightMouseDown(S32 x, S32 y, MASK mask)
{
mHoverTimer->getParent()->setCollapsed(true);
}
+ return TRUE;
}
else if (mBarRect.pointInRect(x, y))
{
S32 bar_idx = MAX_VISIBLE_HISTORY - ((y - mBarRect.mBottom) * (MAX_VISIBLE_HISTORY + 2) / mBarRect.getHeight());
bar_idx = llclamp(bar_idx, 0, MAX_VISIBLE_HISTORY);
mPrintStats = LLFastTimer::NamedTimer::HISTORY_NUM - mScrollIndex - bar_idx;
+ return TRUE;
}
- return FALSE;
+ return LLFloater::handleRightMouseDown(x, y, mask);
}
LLFastTimer::NamedTimer* LLFastTimerView::getLegendID(S32 y)
{
- S32 idx = (getRect().getHeight() - y) / ((S32) LLFontGL::getFontMonospace()->getLineHeight()+2) - 5;
+ S32 idx = (getRect().getHeight() - y) / (LLFontGL::getFontMonospace()->getLineHeight()+2) - 5;
if (idx >= 0 && idx < (S32)ft_display_idx.size())
{
@@ -147,18 +172,6 @@ BOOL LLFastTimerView::handleDoubleClick(S32 x, S32 y, MASK mask)
BOOL LLFastTimerView::handleMouseDown(S32 x, S32 y, MASK mask)
{
-
- {
- S32 local_x = x - mButtons[BUTTON_CLOSE]->getRect().mLeft;
- S32 local_y = y - mButtons[BUTTON_CLOSE]->getRect().mBottom;
- if(mButtons[BUTTON_CLOSE]->getVisible()
- && mButtons[BUTTON_CLOSE]->pointInView(local_x, local_y) )
- {
- return LLFloater::handleMouseDown(x, y, mask);;
- }
- }
-
-
if (x < mBarRect.mLeft)
{
LLFastTimer::NamedTimer* idp = getLegendID(y);
@@ -192,36 +205,42 @@ BOOL LLFastTimerView::handleMouseDown(S32 x, S32 y, MASK mask)
{
mDisplayCenter = (ChildAlignment)((mDisplayCenter + 1) % ALIGN_COUNT);
}
- else
+ else if (mGraphRect.pointInRect(x, y))
{
- // pause/unpause
- LLFastTimer::sPauseHistory = !LLFastTimer::sPauseHistory;
- // reset scroll to bottom when unpausing
- if (!LLFastTimer::sPauseHistory)
- {
- mScrollIndex = 0;
- }
+ gFocusMgr.setMouseCapture(this);
+ return TRUE;
}
- // SJB: Don't pass mouse clicks through the display
- return TRUE;
+ //else
+ //{
+ // // pause/unpause
+ // LLFastTimer::sPauseHistory = !LLFastTimer::sPauseHistory;
+ // // reset scroll to bottom when unpausing
+ // if (!LLFastTimer::sPauseHistory)
+ // {
+ // mScrollIndex = 0;
+ // }
+ //}
+ return LLFloater::handleMouseDown(x, y, mask);
}
BOOL LLFastTimerView::handleMouseUp(S32 x, S32 y, MASK mask)
{
+ if (hasMouseCapture())
{
- S32 local_x = x - mButtons[BUTTON_CLOSE]->getRect().mLeft;
- S32 local_y = y - mButtons[BUTTON_CLOSE]->getRect().mBottom;
- if(mButtons[BUTTON_CLOSE]->getVisible()
- && mButtons[BUTTON_CLOSE]->pointInView(local_x, local_y) )
- {
- return LLFloater::handleMouseUp(x, y, mask);;
- }
+ gFocusMgr.setMouseCapture(NULL);
}
- return FALSE;
+ return LLFloater::handleMouseUp(x, y, mask);;
}
BOOL LLFastTimerView::handleHover(S32 x, S32 y, MASK mask)
{
+ if (hasMouseCapture())
+ {
+ F32 lerp = llclamp(1.f - (F32) (x - mGraphRect.mLeft) / (F32) mGraphRect.getWidth(), 0.f, 1.f);
+ mScrollIndex = llround( lerp * (F32)(LLFastTimer::NamedTimer::HISTORY_NUM - MAX_VISIBLE_HISTORY));
+ mScrollIndex = llclamp( mScrollIndex, 0, LLFastTimer::getLastFrameIndex());
+ return TRUE;
+ }
mHoverTimer = NULL;
mHoverID = NULL;
@@ -248,7 +267,15 @@ BOOL LLFastTimerView::handleHover(S32 x, S32 y, MASK mask)
x < mBarEnd[mHoverBarIndex][i])
{
mHoverID = (*it);
- mHoverTimer = (*it);
+ if (mHoverTimer != *it)
+ {
+ // could be that existing tooltip is for a parent and is thus
+ // covering region for this new timer, go ahead and unblock
+ // so we can create a new tooltip
+ LLToolTipMgr::instance().unblockToolTips();
+ mHoverTimer = (*it);
+ }
+
mToolTipRect.set(mBarStart[mHoverBarIndex][i],
mBarRect.mBottom + llround(((F32)(MAX_VISIBLE_HISTORY - mHoverBarIndex + 1)) * ((F32)mBarRect.getHeight() / ((F32)MAX_VISIBLE_HISTORY + 2.f))),
mBarEnd[mHoverBarIndex][i],
@@ -270,7 +297,7 @@ BOOL LLFastTimerView::handleHover(S32 x, S32 y, MASK mask)
}
}
- return FALSE;
+ return LLFloater::handleHover(x, y, mask);
}
@@ -306,15 +333,15 @@ BOOL LLFastTimerView::handleToolTip(S32 x, S32 y, MASK mask)
}
}
}
-
- return FALSE;
+
+ return LLFloater::handleToolTip(x, y, mask);
}
BOOL LLFastTimerView::handleScrollWheel(S32 x, S32 y, S32 clicks)
{
LLFastTimer::sPauseHistory = TRUE;
- mScrollIndex = llclamp(mScrollIndex - clicks,
- 0,
+ mScrollIndex = llclamp( mScrollIndex + clicks,
+ 0,
llmin(LLFastTimer::getLastFrameIndex(), (S32)LLFastTimer::NamedTimer::HISTORY_NUM - MAX_VISIBLE_HISTORY));
return TRUE;
}
@@ -333,8 +360,8 @@ void LLFastTimerView::draw()
F64 iclock_freq = 1000.0 / clock_freq;
S32 margin = 10;
- S32 height = (S32) (gViewerWindow->getWindowRectScaled().getHeight()*0.75f);
- S32 width = (S32) (gViewerWindow->getWindowRectScaled().getWidth() * 0.75f);
+ S32 height = getRect().getHeight();
+ S32 width = getRect().getWidth();
LLRect new_rect;
new_rect.setLeftTopAndSize(getRect().mLeft, getRect().mTop, width, height);
@@ -525,7 +552,7 @@ void LLFastTimerView::draw()
// update rectangle that includes timer bars
mBarRect.mLeft = xleft;
mBarRect.mRight = getRect().getWidth();
- mBarRect.mTop = ytop - ((S32)LLFontGL::getFontMonospace()->getLineHeight() + 4);
+ mBarRect.mTop = ytop - (LLFontGL::getFontMonospace()->getLineHeight() + 4);
mBarRect.mBottom = margin + LINE_GRAPH_HEIGHT;
y = ytop;
@@ -565,6 +592,7 @@ void LLFastTimerView::draw()
{
mAvgCountTotal = ticks;
mMaxCountTotal = ticks;
+ LLFastTimer::sResetHistory = false;
}
}
@@ -618,7 +646,6 @@ void LLFastTimerView::draw()
LLFontGL::LEFT, LLFontGL::TOP);
}
- LLRect graph_rect;
// Draw borders
{
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
@@ -651,9 +678,9 @@ void LLFastTimerView::draw()
by = LINE_GRAPH_HEIGHT-barh-dy-7;
//line graph
- graph_rect = LLRect(xleft-5, by, getRect().getWidth()-5, 5);
+ mGraphRect = LLRect(xleft-5, by, getRect().getWidth()-5, 5);
- gl_rect_2d(graph_rect, FALSE);
+ gl_rect_2d(mGraphRect, FALSE);
}
mBarStart.clear();
@@ -801,7 +828,7 @@ void LLFastTimerView::draw()
//draw line graph history
{
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- LLLocalClipRect clip(graph_rect);
+ LLLocalClipRect clip(mGraphRect);
//normalize based on last frame's maximum
static U64 last_max = 0;
@@ -818,8 +845,8 @@ void LLFastTimerView::draw()
else
tdesc = llformat("%4.2f ms", ms);
- x = graph_rect.mRight - LLFontGL::getFontMonospace()->getWidth(tdesc)-5;
- y = graph_rect.mTop - ((S32)LLFontGL::getFontMonospace()->getLineHeight());
+ x = mGraphRect.mRight - LLFontGL::getFontMonospace()->getWidth(tdesc)-5;
+ y = mGraphRect.mTop - LLFontGL::getFontMonospace()->getLineHeight();
LLFontGL::getFontMonospace()->renderUTF8(tdesc, 0, x, y, LLColor4::white,
LLFontGL::LEFT, LLFontGL::TOP);
@@ -829,24 +856,24 @@ void LLFastTimerView::draw()
S32 first_frame = LLFastTimer::NamedTimer::HISTORY_NUM - mScrollIndex;
S32 last_frame = first_frame - MAX_VISIBLE_HISTORY;
- F32 frame_delta = ((F32) (graph_rect.getWidth()))/(LLFastTimer::NamedTimer::HISTORY_NUM-1);
+ F32 frame_delta = ((F32) (mGraphRect.getWidth()))/(LLFastTimer::NamedTimer::HISTORY_NUM-1);
- F32 right = (F32) graph_rect.mLeft + frame_delta*first_frame;
- F32 left = (F32) graph_rect.mLeft + frame_delta*last_frame;
+ F32 right = (F32) mGraphRect.mLeft + frame_delta*first_frame;
+ F32 left = (F32) mGraphRect.mLeft + frame_delta*last_frame;
gGL.color4f(0.5f,0.5f,0.5f,0.3f);
- gl_rect_2d((S32) left, graph_rect.mTop, (S32) right, graph_rect.mBottom);
+ gl_rect_2d((S32) left, mGraphRect.mTop, (S32) right, mGraphRect.mBottom);
if (mHoverBarIndex >= 0)
{
S32 bar_frame = first_frame - mHoverBarIndex;
- F32 bar = (F32) graph_rect.mLeft + frame_delta*bar_frame;
+ F32 bar = (F32) mGraphRect.mLeft + frame_delta*bar_frame;
gGL.color4f(0.5f,0.5f,0.5f,1);
gGL.begin(LLRender::LINES);
- gGL.vertex2i((S32)bar, graph_rect.mBottom);
- gGL.vertex2i((S32)bar, graph_rect.mTop);
+ gGL.vertex2i((S32)bar, mGraphRect.mBottom);
+ gGL.vertex2i((S32)bar, mGraphRect.mTop);
gGL.end();
}
}
@@ -871,7 +898,7 @@ void LLFastTimerView::draw()
if (mHoverID != NULL &&
idp != mHoverID)
- { //fade out non-hihglighted timers
+ { //fade out non-highlighted timers
if (idp->getParent() != mHoverID)
{
alpha = alpha_interp;
@@ -879,8 +906,10 @@ void LLFastTimerView::draw()
}
gGL.color4f(col[0], col[1], col[2], alpha);
- gGL.begin(LLRender::LINE_STRIP);
- for (U32 j = 0; j < LLFastTimer::NamedTimer::HISTORY_NUM; j++)
+ gGL.begin(LLRender::TRIANGLE_STRIP);
+ for (U32 j = llmax(0, LLFastTimer::NamedTimer::HISTORY_NUM - LLFastTimer::getLastFrameIndex());
+ j < LLFastTimer::NamedTimer::HISTORY_NUM;
+ j++)
{
U64 ticks = idp->getHistoricalCount(j);
@@ -900,9 +929,10 @@ void LLFastTimerView::draw()
//normalize to highlighted timer
cur_max = llmax(cur_max, ticks);
}
- F32 x = graph_rect.mLeft + ((F32) (graph_rect.getWidth()))/(LLFastTimer::NamedTimer::HISTORY_NUM-1)*j;
- F32 y = graph_rect.mBottom + (F32) graph_rect.getHeight()/max_ticks*ticks;
+ F32 x = mGraphRect.mLeft + ((F32) (mGraphRect.getWidth()))/(LLFastTimer::NamedTimer::HISTORY_NUM-1)*j;
+ F32 y = mGraphRect.mBottom + (F32) mGraphRect.getHeight()/max_ticks*ticks;
gGL.vertex2f(x,y);
+ gGL.vertex2f(x,mGraphRect.mBottom);
}
gGL.end();
@@ -920,18 +950,20 @@ void LLFastTimerView::draw()
}
//interpolate towards new maximum
- F32 dt = gFrameIntervalSeconds*3.f;
- last_max = (U64) ((F32) last_max + ((F32) cur_max- (F32) last_max) * dt);
+ last_max = (U64) lerp((F32)last_max, (F32) cur_max, LLCriticalDamp::getInterpolant(0.1f));
+ if (last_max - cur_max <= 1 || cur_max - last_max <= 1)
+ {
+ last_max = cur_max;
+ }
F32 alpha_target = last_max > cur_max ?
llmin((F32) last_max/ (F32) cur_max - 1.f,1.f) :
llmin((F32) cur_max/ (F32) last_max - 1.f,1.f);
-
- alpha_interp = alpha_interp + (alpha_target-alpha_interp) * dt;
+ alpha_interp = lerp(alpha_interp, alpha_target, LLCriticalDamp::getInterpolant(0.1f));
if (mHoverID != NULL)
{
- x = (graph_rect.mRight + graph_rect.mLeft)/2;
- y = graph_rect.mBottom + 8;
+ x = (mGraphRect.mRight + mGraphRect.mLeft)/2;
+ y = mGraphRect.mBottom + 8;
LLFontGL::getFontMonospace()->renderUTF8(
mHoverID->getName(),
@@ -1020,6 +1052,327 @@ F64 LLFastTimerView::getTime(const std::string& name)
return 0.0;
}
+void saveChart(const std::string& label, const char* suffix, LLImageRaw* scratch)
+{
+ //read result back into raw image
+ glReadPixels(0, 0, 1024, 512, GL_RGB, GL_UNSIGNED_BYTE, scratch->getData());
+
+ //write results to disk
+ LLPointer<LLImagePNG> result = new LLImagePNG();
+ result->encode(scratch, 0.f);
+
+ std::string ext = result->getExtension();
+ std::string filename = llformat("%s_%s.%s", label.c_str(), suffix, ext.c_str());
+
+ std::string out_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, filename);
+ result->save(out_file);
+}
+
+//static
+void LLFastTimerView::exportCharts(const std::string& base, const std::string& target)
+{
+ //allocate render target for drawing charts
+ LLRenderTarget buffer;
+ buffer.allocate(1024,512, GL_RGB, FALSE, FALSE);
+
+
+ LLSD cur;
+
+ LLSD base_data;
+
+ { //read base log into memory
+ S32 i = 0;
+ std::ifstream is(base.c_str());
+ while (!is.eof() && LLSDSerialize::fromXML(cur, is))
+ {
+ base_data[i++] = cur;
+ }
+ is.close();
+ }
+
+ LLSD cur_data;
+ std::set<std::string> chart_names;
+
+ { //read current log into memory
+ S32 i = 0;
+ std::ifstream is(target.c_str());
+ while (!is.eof() && LLSDSerialize::fromXML(cur, is))
+ {
+ cur_data[i++] = cur;
+
+ for (LLSD::map_iterator iter = cur.beginMap(); iter != cur.endMap(); ++iter)
+ {
+ std::string label = iter->first;
+ chart_names.insert(label);
+ }
+ }
+ is.close();
+ }
+
+ //get time domain
+ LLSD::Real cur_total_time = 0.0;
+
+ for (U32 i = 0; i < cur_data.size(); ++i)
+ {
+ cur_total_time += cur_data[i]["Total"]["Time"].asReal();
+ }
+
+ LLSD::Real base_total_time = 0.0;
+ for (U32 i = 0; i < base_data.size(); ++i)
+ {
+ base_total_time += base_data[i]["Total"]["Time"].asReal();
+ }
+
+ //allocate raw scratch space
+ LLPointer<LLImageRaw> scratch = new LLImageRaw(1024, 512, 3);
+
+ gGL.pushMatrix();
+ gGL.loadIdentity();
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.loadIdentity();
+ gGL.ortho(-0.05f, 1.05f, -0.05f, 1.05f, -1.0f, 1.0f);
+
+ //render charts
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+
+ buffer.bindTarget();
+
+ for (std::set<std::string>::iterator iter = chart_names.begin(); iter != chart_names.end(); ++iter)
+ {
+ std::string label = *iter;
+
+ LLSD::Real max_time = 0.0;
+ LLSD::Integer max_calls = 0;
+ LLSD::Real max_execution = 0.0;
+
+ std::vector<LLSD::Real> cur_execution;
+ std::vector<LLSD::Real> cur_times;
+ std::vector<LLSD::Integer> cur_calls;
+
+ std::vector<LLSD::Real> base_execution;
+ std::vector<LLSD::Real> base_times;
+ std::vector<LLSD::Integer> base_calls;
+
+ for (U32 i = 0; i < cur_data.size(); ++i)
+ {
+ LLSD::Real time = cur_data[i][label]["Time"].asReal();
+ LLSD::Integer calls = cur_data[i][label]["Calls"].asInteger();
+
+ LLSD::Real execution = 0.0;
+ if (calls > 0)
+ {
+ execution = time/calls;
+ cur_execution.push_back(execution);
+ cur_times.push_back(time);
+ }
+
+ cur_calls.push_back(calls);
+ }
+
+ for (U32 i = 0; i < base_data.size(); ++i)
+ {
+ LLSD::Real time = base_data[i][label]["Time"].asReal();
+ LLSD::Integer calls = base_data[i][label]["Calls"].asInteger();
+
+ LLSD::Real execution = 0.0;
+ if (calls > 0)
+ {
+ execution = time/calls;
+ base_execution.push_back(execution);
+ base_times.push_back(time);
+ }
+
+ base_calls.push_back(calls);
+ }
+
+ std::sort(base_calls.begin(), base_calls.end());
+ std::sort(base_times.begin(), base_times.end());
+ std::sort(base_execution.begin(), base_execution.end());
+
+ std::sort(cur_calls.begin(), cur_calls.end());
+ std::sort(cur_times.begin(), cur_times.end());
+ std::sort(cur_execution.begin(), cur_execution.end());
+
+ //remove outliers
+ const U32 OUTLIER_CUTOFF = 512;
+ if (base_times.size() > OUTLIER_CUTOFF)
+ {
+ ll_remove_outliers(base_times, 1.f);
+ }
+
+ if (base_execution.size() > OUTLIER_CUTOFF)
+ {
+ ll_remove_outliers(base_execution, 1.f);
+ }
+
+ if (cur_times.size() > OUTLIER_CUTOFF)
+ {
+ ll_remove_outliers(cur_times, 1.f);
+ }
+
+ if (cur_execution.size() > OUTLIER_CUTOFF)
+ {
+ ll_remove_outliers(cur_execution, 1.f);
+ }
+
+
+ max_time = llmax(base_times.empty() ? 0.0 : *base_times.rbegin(), cur_times.empty() ? 0.0 : *cur_times.rbegin());
+ max_calls = llmax(base_calls.empty() ? 0 : *base_calls.rbegin(), cur_calls.empty() ? 0 : *cur_calls.rbegin());
+ max_execution = llmax(base_execution.empty() ? 0.0 : *base_execution.rbegin(), cur_execution.empty() ? 0.0 : *cur_execution.rbegin());
+
+
+ LLVector3 last_p;
+
+ //====================================
+ // basic
+ //====================================
+ buffer.clear();
+
+ last_p.clear();
+
+ LLGLDisable cull(GL_CULL_FACE);
+
+ LLVector3 base_col(0, 0.7f, 0.f);
+ LLVector3 cur_col(1.f, 0.f, 0.f);
+
+ gGL.setSceneBlendType(LLRender::BT_ADD);
+
+ gGL.color3fv(base_col.mV);
+ for (U32 i = 0; i < base_times.size(); ++i)
+ {
+ gGL.begin(LLRender::TRIANGLE_STRIP);
+ gGL.vertex3fv(last_p.mV);
+ gGL.vertex3f(last_p.mV[0], 0.f, 0.f);
+ last_p.set((F32)i/(F32) base_times.size(), base_times[i]/max_time, 0.f);
+ gGL.vertex3fv(last_p.mV);
+ gGL.vertex3f(last_p.mV[0], 0.f, 0.f);
+ gGL.end();
+ }
+
+ gGL.flush();
+
+
+ last_p.clear();
+ {
+ LLGLEnable blend(GL_BLEND);
+
+ gGL.color3fv(cur_col.mV);
+ for (U32 i = 0; i < cur_times.size(); ++i)
+ {
+ gGL.begin(LLRender::TRIANGLE_STRIP);
+ gGL.vertex3f(last_p.mV[0], 0.f, 0.f);
+ gGL.vertex3fv(last_p.mV);
+ last_p.set((F32) i / (F32) cur_times.size(), cur_times[i]/max_time, 0.f);
+ gGL.vertex3f(last_p.mV[0], 0.f, 0.f);
+ gGL.vertex3fv(last_p.mV);
+ gGL.end();
+ }
+
+ gGL.flush();
+ }
+
+ saveChart(label, "time", scratch);
+
+ //======================================
+ // calls
+ //======================================
+ buffer.clear();
+
+ last_p.clear();
+
+ gGL.color3fv(base_col.mV);
+ for (U32 i = 0; i < base_calls.size(); ++i)
+ {
+ gGL.begin(LLRender::TRIANGLE_STRIP);
+ gGL.vertex3fv(last_p.mV);
+ gGL.vertex3f(last_p.mV[0], 0.f, 0.f);
+ last_p.set((F32) i / (F32) base_calls.size(), (F32)base_calls[i]/max_calls, 0.f);
+ gGL.vertex3fv(last_p.mV);
+ gGL.vertex3f(last_p.mV[0], 0.f, 0.f);
+ gGL.end();
+ }
+
+ gGL.flush();
+
+ {
+ LLGLEnable blend(GL_BLEND);
+ gGL.color3fv(cur_col.mV);
+ last_p.clear();
+
+ for (U32 i = 0; i < cur_calls.size(); ++i)
+ {
+ gGL.begin(LLRender::TRIANGLE_STRIP);
+ gGL.vertex3f(last_p.mV[0], 0.f, 0.f);
+ gGL.vertex3fv(last_p.mV);
+ last_p.set((F32) i / (F32) cur_calls.size(), (F32) cur_calls[i]/max_calls, 0.f);
+ gGL.vertex3f(last_p.mV[0], 0.f, 0.f);
+ gGL.vertex3fv(last_p.mV);
+ gGL.end();
+
+ }
+
+ gGL.flush();
+ }
+
+ saveChart(label, "calls", scratch);
+
+ //======================================
+ // execution
+ //======================================
+ buffer.clear();
+
+
+ gGL.color3fv(base_col.mV);
+ U32 count = 0;
+ U32 total_count = base_execution.size();
+
+ last_p.clear();
+
+ for (std::vector<LLSD::Real>::iterator iter = base_execution.begin(); iter != base_execution.end(); ++iter)
+ {
+ gGL.begin(LLRender::TRIANGLE_STRIP);
+ gGL.vertex3fv(last_p.mV);
+ gGL.vertex3f(last_p.mV[0], 0.f, 0.f);
+ last_p.set((F32)count/(F32)total_count, *iter/max_execution, 0.f);
+ gGL.vertex3fv(last_p.mV);
+ gGL.vertex3f(last_p.mV[0], 0.f, 0.f);
+ gGL.end();
+ count++;
+ }
+
+ last_p.clear();
+
+ {
+ LLGLEnable blend(GL_BLEND);
+ gGL.color3fv(cur_col.mV);
+ count = 0;
+ total_count = cur_execution.size();
+
+ for (std::vector<LLSD::Real>::iterator iter = cur_execution.begin(); iter != cur_execution.end(); ++iter)
+ {
+ gGL.begin(LLRender::TRIANGLE_STRIP);
+ gGL.vertex3f(last_p.mV[0], 0.f, 0.f);
+ gGL.vertex3fv(last_p.mV);
+ last_p.set((F32)count/(F32)total_count, *iter/max_execution, 0.f);
+ gGL.vertex3f(last_p.mV[0], 0.f, 0.f);
+ gGL.vertex3fv(last_p.mV);
+ gGL.end();
+ count++;
+ }
+
+ gGL.flush();
+ }
+
+ saveChart(label, "execution", scratch);
+ }
+
+ buffer.flush();
+
+ gGL.popMatrix();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.popMatrix();
+}
+
//static
LLSD LLFastTimerView::analyzePerformanceLogDefault(std::istream& is)
{
@@ -1030,6 +1383,10 @@ LLSD LLFastTimerView::analyzePerformanceLogDefault(std::istream& is)
LLSD::Real total_time = 0.0;
LLSD::Integer total_frames = 0;
+ typedef std::map<std::string,LLViewerStats::StatsAccumulator> stats_map_t;
+ stats_map_t time_stats;
+ stats_map_t sample_stats;
+
while (!is.eof() && LLSDSerialize::fromXML(cur, is))
{
for (LLSD::map_iterator iter = cur.beginMap(); iter != cur.endMap(); ++iter)
@@ -1046,35 +1403,31 @@ LLSD LLFastTimerView::analyzePerformanceLogDefault(std::istream& is)
if (time > 0.0)
{
- ret[label]["TotalTime"] = ret[label]["TotalTime"].asReal() + time;
- ret[label]["MaxTime"] = llmax(time, ret[label]["MaxTime"].asReal());
-
- if (ret[label]["MinTime"].asReal() == 0)
- {
- ret[label]["MinTime"] = time;
- }
- else
- {
- ret[label]["MinTime"] = llmin(ret[label]["MinTime"].asReal(), time);
- }
-
LLSD::Integer samples = iter->second["Calls"].asInteger();
- ret[label]["Samples"] = ret[label]["Samples"].asInteger() + samples;
- ret[label]["MaxSamples"] = llmax(ret[label]["MaxSamples"].asInteger(), samples);
-
- if (ret[label]["MinSamples"].asInteger() == 0)
- {
- ret[label]["MinSamples"] = samples;
- }
- else
- {
- ret[label]["MinSamples"] = llmin(ret[label]["MinSamples"].asInteger(), samples);
- }
+ time_stats[label].push(time);
+ sample_stats[label].push(samples);
}
}
total_frames++;
}
+
+ for(stats_map_t::iterator it = time_stats.begin(); it != time_stats.end(); ++it)
+ {
+ std::string label = it->first;
+ ret[label]["TotalTime"] = time_stats[label].mSum;
+ ret[label]["MeanTime"] = time_stats[label].getMean();
+ ret[label]["MaxTime"] = time_stats[label].getMaxValue();
+ ret[label]["MinTime"] = time_stats[label].getMinValue();
+ ret[label]["StdDevTime"] = time_stats[label].getStdDev();
+
+ ret[label]["Samples"] = sample_stats[label].mSum;
+ ret[label]["MaxSamples"] = sample_stats[label].getMaxValue();
+ ret[label]["MinSamples"] = sample_stats[label].getMinValue();
+ ret[label]["StdDevSamples"] = sample_stats[label].getStdDev();
+
+ ret[label]["Frames"] = (LLSD::Integer)time_stats[label].getCount();
+ }
ret["SessionTime"] = total_time;
ret["FrameCount"] = total_frames;
@@ -1109,8 +1462,27 @@ void LLFastTimerView::doAnalysisDefault(std::string baseline, std::string target
std::ofstream os(output.c_str());
LLSD::Real session_time = current["SessionTime"].asReal();
-
- os << "Label, % Change, % of Session, Cur Min, Cur Max, Cur Mean, Cur Total, Cur Samples, Base Min, Base Max, Base Mean, Base Total, Base Samples\n";
+ os <<
+ "Label, "
+ "% Change, "
+ "% of Session, "
+ "Cur Min, "
+ "Cur Max, "
+ "Cur Mean/sample, "
+ "Cur Mean/frame, "
+ "Cur StdDev/frame, "
+ "Cur Total, "
+ "Cur Frames, "
+ "Cur Samples, "
+ "Base Min, "
+ "Base Max, "
+ "Base Mean/sample, "
+ "Base Mean/frame, "
+ "Base StdDev/frame, "
+ "Base Total, "
+ "Base Frames, "
+ "Base Samples\n";
+
for (LLSD::map_iterator iter = base.beginMap(); iter != base.endMap(); ++iter)
{
LLSD::String label = iter->first;
@@ -1122,63 +1494,41 @@ void LLFastTimerView::doAnalysisDefault(std::string baseline, std::string target
continue;
}
LLSD::Real a = base[label]["TotalTime"].asReal() / base[label]["Samples"].asReal();
- LLSD::Real b = current[label]["TotalTime"].asReal() / base[label]["Samples"].asReal();
+ LLSD::Real b = current[label]["TotalTime"].asReal() / current[label]["Samples"].asReal();
LLSD::Real diff = b-a;
LLSD::Real perc = diff/a * 100;
- os << llformat("%s, %.2f, %.4f, %.4f, %.4f, %.4f, %.4f, %d, %.4f, %.4f, %.4f, %.4f, %d\n",
+ os << llformat("%s, %.2f, %.4f, %.4f, %.4f, %.4f, %.4f, %.4f, %.4f, %d, %d, %.4f, %.4f, %.4f, %.4f, %.4f, %.4f, %d, %d\n",
label.c_str(),
(F32) perc,
(F32) (current[label]["TotalTime"].asReal()/session_time * 100.0),
+
(F32) current[label]["MinTime"].asReal(),
(F32) current[label]["MaxTime"].asReal(),
(F32) b,
+ (F32) current[label]["MeanTime"].asReal(),
+ (F32) current[label]["StdDevTime"].asReal(),
(F32) current[label]["TotalTime"].asReal(),
+ current[label]["Frames"].asInteger(),
current[label]["Samples"].asInteger(),
(F32) base[label]["MinTime"].asReal(),
(F32) base[label]["MaxTime"].asReal(),
(F32) a,
+ (F32) base[label]["MeanTime"].asReal(),
+ (F32) base[label]["StdDevTime"].asReal(),
(F32) base[label]["TotalTime"].asReal(),
+ base[label]["Frames"].asInteger(),
base[label]["Samples"].asInteger());
}
-
+ exportCharts(baseline, target);
+
os.flush();
os.close();
}
-//-------------------------
-//static
-LLSD LLFastTimerView::analyzeMetricPerformanceLog(std::istream& is)
-{
- LLSD ret;
- LLSD cur;
-
- while (!is.eof() && LLSDSerialize::fromXML(cur, is))
- {
- for (LLSD::map_iterator iter = cur.beginMap(); iter != cur.endMap(); ++iter)
- {
- std::string label = iter->first;
-
- LLMetricPerformanceTesterBasic* tester = LLMetricPerformanceTesterBasic::getTester(iter->second["Name"].asString()) ;
- if(tester)
- {
- ret[label]["Name"] = iter->second["Name"] ;
-
- S32 num_of_metrics = tester->getNumberOfMetrics() ;
- for(S32 index = 0 ; index < num_of_metrics ; index++)
- {
- ret[label][ tester->getMetricName(index) ] = iter->second[ tester->getMetricName(index) ] ;
- }
- }
- }
- }
-
- return ret;
-}
-
//static
void LLFastTimerView::outputAllMetrics()
{
@@ -1194,48 +1544,6 @@ void LLFastTimerView::outputAllMetrics()
}
//static
-void LLFastTimerView::doAnalysisMetrics(std::string baseline, std::string target, std::string output)
-{
- if(!LLMetricPerformanceTesterBasic::hasMetricPerformanceTesters())
- {
- return ;
- }
-
- // Open baseline and current target, exit if one is inexistent
- std::ifstream base_is(baseline.c_str());
- std::ifstream target_is(target.c_str());
- if (!base_is.is_open() || !target_is.is_open())
- {
- llwarns << "'-analyzeperformance' error : baseline or current target file inexistent" << llendl;
- base_is.close();
- target_is.close();
- return;
- }
-
- //analyze baseline
- LLSD base = analyzeMetricPerformanceLog(base_is);
- base_is.close();
-
- //analyze current
- LLSD current = analyzeMetricPerformanceLog(target_is);
- target_is.close();
-
- //output comparision
- std::ofstream os(output.c_str());
-
- os << "Label, Metric, Base(B), Target(T), Diff(T-B), Percentage(100*T/B)\n";
- for(LLMetricPerformanceTesterBasic::name_tester_map_t::iterator iter = LLMetricPerformanceTesterBasic::sTesterMap.begin() ;
- iter != LLMetricPerformanceTesterBasic::sTesterMap.end() ; ++iter)
- {
- LLMetricPerformanceTesterBasic* tester = ((LLMetricPerformanceTesterBasic*)iter->second) ;
- tester->analyzePerformance(&os, &base, &current) ;
- }
-
- os.flush();
- os.close();
-}
-
-//static
void LLFastTimerView::doAnalysis(std::string baseline, std::string target, std::string output)
{
if(LLFastTimer::sLog)
@@ -1246,7 +1554,7 @@ void LLFastTimerView::doAnalysis(std::string baseline, std::string target, std::
if(LLFastTimer::sMetricLog)
{
- doAnalysisMetrics(baseline, target, output) ;
+ LLMetricPerformanceTesterBasic::doAnalysisMetrics(baseline, target, output) ;
return ;
}
}
diff --git a/indra/newview/llfasttimerview.h b/indra/newview/llfasttimerview.h
index 1a54a53f09..a349e7ad4c 100644
--- a/indra/newview/llfasttimerview.h
+++ b/indra/newview/llfasttimerview.h
@@ -33,8 +33,9 @@
class LLFastTimerView : public LLFloater
{
public:
- LLFastTimerView(const LLRect& rect);
-
+ LLFastTimerView(const LLSD&);
+ BOOL postBuild();
+
static BOOL sAnalyzePerformance;
static void outputAllMetrics();
@@ -42,9 +43,9 @@ public:
private:
static void doAnalysisDefault(std::string baseline, std::string target, std::string output) ;
- static void doAnalysisMetrics(std::string baseline, std::string target, std::string output) ;
- static LLSD analyzeMetricPerformanceLog(std::istream& is) ;
static LLSD analyzePerformanceLogDefault(std::istream& is) ;
+ static void exportCharts(const std::string& base, const std::string& target);
+ void onPause();
public:
@@ -90,6 +91,7 @@ private:
LLFrameTimer mHighlightTimer;
S32 mPrintStats;
S32 mAverageCyclesPerTimer;
+ LLRect mGraphRect;
};
#endif
diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp
index a1ba370c26..575b613ccf 100644
--- a/indra/newview/llfavoritesbar.cpp
+++ b/indra/newview/llfavoritesbar.cpp
@@ -31,6 +31,7 @@
#include "llfocusmgr.h"
#include "llinventory.h"
#include "lllandmarkactions.h"
+#include "lltoolbarview.h"
#include "lltrans.h"
#include "lluictrlfactory.h"
#include "llmenugl.h"
@@ -38,13 +39,13 @@
#include "llagent.h"
#include "llclipboard.h"
-#include "llinventoryclipboard.h"
+#include "llclipboard.h"
#include "llinventorybridge.h"
#include "llinventoryfunctions.h"
+#include "llfloatersidepanelcontainer.h"
#include "llfloaterworldmap.h"
#include "lllandmarkactions.h"
#include "llnotificationsutil.h"
-#include "llsidetray.h"
#include "lltoggleablemenu.h"
#include "llviewerinventory.h"
#include "llviewermenu.h"
@@ -54,6 +55,7 @@
static LLDefaultChildRegistry::Register<LLFavoritesBarCtrl> r("favorites_bar");
const S32 DROP_DOWN_MENU_WIDTH = 250;
+const S32 DROP_DOWN_MENU_TOP_PAD = 13;
/**
* Helper for LLFavoriteLandmarkButton and LLFavoriteLandmarkMenuItem.
@@ -360,7 +362,7 @@ struct LLFavoritesSort
LLFavoritesBarCtrl::Params::Params()
: image_drag_indication("image_drag_indication"),
- chevron_button("chevron_button"),
+ more_button("more_button"),
label("label")
{
}
@@ -368,14 +370,15 @@ LLFavoritesBarCtrl::Params::Params()
LLFavoritesBarCtrl::LLFavoritesBarCtrl(const LLFavoritesBarCtrl::Params& p)
: LLUICtrl(p),
mFont(p.font.isProvided() ? p.font() : LLFontGL::getFontSansSerifSmall()),
- mPopupMenuHandle(),
- mInventoryItemsPopupMenuHandle(),
+ mOverflowMenuHandle(),
+ mContextMenuHandle(),
mImageDragIndication(p.image_drag_indication),
mShowDragMarker(FALSE),
mLandingTab(NULL),
mLastTab(NULL),
mTabsHighlightEnabled(TRUE)
, mUpdateDropDownItems(true)
+, mRestoreOverflowMenu(false)
{
// Register callback for menus with current registrar (will be parent panel's registrar)
LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("Favorites.DoToSelected",
@@ -388,10 +391,10 @@ LLFavoritesBarCtrl::LLFavoritesBarCtrl(const LLFavoritesBarCtrl::Params& p)
gInventory.addObserver(this);
//make chevron button
- LLButton::Params chevron_button_params(p.chevron_button);
- chevron_button_params.click_callback.function(boost::bind(&LLFavoritesBarCtrl::showDropDownMenu, this));
- mChevronButton = LLUICtrlFactory::create<LLButton> (chevron_button_params);
- addChild(mChevronButton);
+ LLTextBox::Params more_button_params(p.more_button);
+ mMoreTextBox = LLUICtrlFactory::create<LLTextBox> (more_button_params);
+ mMoreTextBox->setClickedCallback(boost::bind(&LLFavoritesBarCtrl::showDropDownMenu, this));
+ addChild(mMoreTextBox);
LLTextBox::Params label_param(p.label);
mBarLabel = LLUICtrlFactory::create<LLTextBox> (label_param);
@@ -402,8 +405,8 @@ LLFavoritesBarCtrl::~LLFavoritesBarCtrl()
{
gInventory.removeObserver(this);
- LLView::deleteViewByHandle(mPopupMenuHandle);
- LLView::deleteViewByHandle(mInventoryItemsPopupMenuHandle);
+ if (mOverflowMenuHandle.get()) mOverflowMenuHandle.get()->die();
+ if (mContextMenuHandle.get()) mContextMenuHandle.get()->die();
}
BOOL LLFavoritesBarCtrl::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
@@ -440,17 +443,17 @@ BOOL LLFavoritesBarCtrl::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
{
setLandingTab(dest);
}
- /*
- * the condition dest == NULL can be satisfied not only in the case
- * of dragging to the right from the last tab of the favbar. there is a
- * small gap between each tab. if the user drags something exactly there
- * then mLandingTab will be set to NULL and the dragged item will be pushed
- * to the end of the favorites bar. this is incorrect behavior. that's why
- * we need an additional check which excludes the case described previously
- * making sure that the mouse pointer is beyond the last tab.
- */
- else if (mLastTab && x >= mLastTab->getRect().mRight)
+ else if (mLastTab && (x >= mLastTab->getRect().mRight))
{
+ /*
+ * the condition dest == NULL can be satisfied not only in the case
+ * of dragging to the right from the last tab of the favbar. there is a
+ * small gap between each tab. if the user drags something exactly there
+ * then mLandingTab will be set to NULL and the dragged item will be pushed
+ * to the end of the favorites bar. this is incorrect behavior. that's why
+ * we need an additional check which excludes the case described previously
+ * making sure that the mouse pointer is beyond the last tab.
+ */
setLandingTab(NULL);
}
@@ -464,7 +467,6 @@ BOOL LLFavoritesBarCtrl::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
if (drop)
{
handleExistingFavoriteDragAndDrop(x, y);
- showDragMarker(FALSE);
}
}
else
@@ -487,7 +489,6 @@ BOOL LLFavoritesBarCtrl::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
setLandingTab(NULL);
}
handleNewFavoriteDragAndDrop(item, favorites_id, x, y);
- showDragMarker(FALSE);
}
}
}
@@ -501,26 +502,35 @@ BOOL LLFavoritesBarCtrl::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
void LLFavoritesBarCtrl::handleExistingFavoriteDragAndDrop(S32 x, S32 y)
{
+ // Identify the button hovered and the side to drop
LLFavoriteLandmarkButton* dest = dynamic_cast<LLFavoriteLandmarkButton*>(mLandingTab);
+ bool insert_before = true;
+ if (!dest)
+ {
+ insert_before = false;
+ dest = dynamic_cast<LLFavoriteLandmarkButton*>(mLastTab);
+ }
- // there is no need to handle if an item was dragged onto itself
+ // There is no need to handle if an item was dragged onto itself
if (dest && dest->getLandmarkId() == mDragItemId)
{
return;
}
+ // Insert the dragged item in the right place
if (dest)
{
- LLInventoryModel::updateItemsOrder(mItems, mDragItemId, dest->getLandmarkId());
+ LLInventoryModel::updateItemsOrder(mItems, mDragItemId, dest->getLandmarkId(), insert_before);
}
else
{
+ // This can happen when the item list is empty
mItems.push_back(gInventory.getItem(mDragItemId));
}
gInventory.saveItemsOrder(mItems);
- LLToggleableMenu* menu = (LLToggleableMenu*) mPopupMenuHandle.get();
+ LLToggleableMenu* menu = (LLToggleableMenu*) mOverflowMenuHandle.get();
if (menu && menu->getVisible())
{
@@ -531,22 +541,35 @@ void LLFavoritesBarCtrl::handleExistingFavoriteDragAndDrop(S32 x, S32 y)
void LLFavoritesBarCtrl::handleNewFavoriteDragAndDrop(LLInventoryItem *item, const LLUUID& favorites_id, S32 x, S32 y)
{
- LLFavoriteLandmarkButton* dest = dynamic_cast<LLFavoriteLandmarkButton*>(mLandingTab);
-
- // there is no need to handle if an item was dragged onto itself
+ // Identify the button hovered and the side to drop
+ LLFavoriteLandmarkButton* dest = NULL;
+ bool insert_before = true;
+ if (!mItems.empty())
+ {
+ dest = dynamic_cast<LLFavoriteLandmarkButton*>(mLandingTab);
+ if (!dest)
+ {
+ insert_before = false;
+ dest = dynamic_cast<LLFavoriteLandmarkButton*>(mLastTab);
+ }
+ }
+
+ // There is no need to handle if an item was dragged onto itself
if (dest && dest->getLandmarkId() == mDragItemId)
{
return;
}
-
+
LLPointer<LLViewerInventoryItem> viewer_item = new LLViewerInventoryItem(item);
+ // Insert the dragged item in the right place
if (dest)
{
- insertBeforeItem(mItems, dest->getLandmarkId(), viewer_item);
+ insertItem(mItems, dest->getLandmarkId(), viewer_item, insert_before);
}
else
{
+ // This can happen when the item list is empty
mItems.push_back(viewer_item);
}
@@ -576,7 +599,11 @@ void LLFavoritesBarCtrl::handleNewFavoriteDragAndDrop(LLInventoryItem *item, con
if (tool_dad->getSource() == LLToolDragAndDrop::SOURCE_NOTECARD)
{
viewer_item->setType(LLAssetType::AT_LANDMARK);
- copy_inventory_from_notecard(tool_dad->getObjectID(), tool_dad->getSourceID(), viewer_item.get(), gInventoryCallbacks.registerCB(cb));
+ copy_inventory_from_notecard(favorites_id,
+ tool_dad->getObjectID(),
+ tool_dad->getSourceID(),
+ viewer_item.get(),
+ gInventoryCallbacks.registerCB(cb));
}
else
{
@@ -606,6 +633,15 @@ void LLFavoritesBarCtrl::changed(U32 mask)
}
else
{
+ LLInventoryModel::item_array_t items;
+ LLInventoryModel::cat_array_t cats;
+ LLIsType is_type(LLAssetType::AT_LANDMARK);
+ gInventory.collectDescendentsIf(mFavoriteFolderId, cats, items, LLInventoryModel::EXCLUDE_TRASH, is_type);
+
+ for (LLInventoryModel::item_array_t::iterator i = items.begin(); i != items.end(); ++i)
+ {
+ (*i)->getSLURL();
+ }
updateButtons();
}
}
@@ -630,7 +666,7 @@ void LLFavoritesBarCtrl::draw()
{
// mouse pointer hovers over an existing tab
LLRect rect = mLandingTab->getRect();
- mImageDragIndication->draw(rect.mLeft - w/2, rect.getHeight(), w, h);
+ mImageDragIndication->draw(rect.mLeft, rect.getHeight(), w, h);
}
else if (mLastTab)
{
@@ -638,6 +674,8 @@ void LLFavoritesBarCtrl::draw()
LLRect rect = mLastTab->getRect();
mImageDragIndication->draw(rect.mRight, rect.getHeight(), w, h);
}
+ // Once drawn, mark this false so we won't draw it again (unless we hit the favorite bar again)
+ mShowDragMarker = FALSE;
}
}
@@ -682,7 +720,7 @@ void LLFavoritesBarCtrl::updateButtons()
const child_list_t* childs = getChildList();
child_list_const_iter_t child_it = childs->begin();
int first_changed_item_index = 0;
- int rightest_point = getRect().mRight - mChevronButton->getRect().getWidth();
+ int rightest_point = getRect().mRight - mMoreTextBox->getRect().getWidth();
//lets find first changed button
while (child_it != childs->end() && first_changed_item_index < mItems.count())
{
@@ -709,7 +747,7 @@ void LLFavoritesBarCtrl::updateButtons()
if (first_changed_item_index <= mItems.count())
{
// Rebuild the buttons only
- // child_list_t is a linked list, so safe to erase from the middle if we pre-incrament the iterator
+ // child_list_t is a linked list, so safe to erase from the middle if we pre-increment the iterator
while (child_it != childs->end())
{
@@ -725,9 +763,9 @@ void LLFavoritesBarCtrl::updateButtons()
}
// we have to remove ChevronButton to make sure that the last item will be LandmarkButton to get the right aligning
// keep in mind that we are cutting all buttons in space between the last visible child of favbar and ChevronButton
- if (mChevronButton->getParent() == this)
+ if (mMoreTextBox->getParent() == this)
{
- removeChild(mChevronButton);
+ removeChild(mMoreTextBox);
}
int last_right_edge = 0;
//calculate new buttons offset
@@ -767,16 +805,16 @@ void LLFavoritesBarCtrl::updateButtons()
S32 buttonHGap = button_params.rect.left; // default value
LLRect rect;
// Chevron button should stay right aligned
- rect.setOriginAndSize(getRect().mRight - mChevronButton->getRect().getWidth() - buttonHGap, 0,
- mChevronButton->getRect().getWidth(),
- mChevronButton->getRect().getHeight());
+ rect.setOriginAndSize(getRect().mRight - mMoreTextBox->getRect().getWidth() - buttonHGap, 0,
+ mMoreTextBox->getRect().getWidth(),
+ mMoreTextBox->getRect().getHeight());
- addChild(mChevronButton);
- mChevronButton->setRect(rect);
- mChevronButton->setVisible(TRUE);
+ addChild(mMoreTextBox);
+ mMoreTextBox->setRect(rect);
+ mMoreTextBox->setVisible(TRUE);
}
// Update overflow menu
- LLToggleableMenu* overflow_menu = static_cast <LLToggleableMenu*> (mPopupMenuHandle.get());
+ LLToggleableMenu* overflow_menu = static_cast <LLToggleableMenu*> (mOverflowMenuHandle.get());
if (overflow_menu && overflow_menu->getVisible())
{
overflow_menu->setVisible(FALSE);
@@ -798,16 +836,16 @@ LLButton* LLFavoritesBarCtrl::createButton(const LLPointer<LLViewerInventoryItem
/**
* WORKAROUND:
- * there are some problem with displaying of fonts in buttons.
- * Empty space (or ...) is displaying instead of last symbols, even though the width of the button is enough.
- * Problem will gone, if we stretch out the button. For that reason I have to put additional 20 pixels.
+ * There are some problem with displaying of fonts in buttons.
+ * Empty space or ellipsis might be displayed instead of last symbols, even though the width of the button is enough.
+ * The problem disappears if we pad the button with 20 pixels.
*/
int required_width = mFont->getWidth(item->getName()) + 20;
int width = required_width > def_button_width? def_button_width : required_width;
LLFavoriteLandmarkButton* fav_btn = NULL;
- // do we have a place for next button + double buttonHGap + mChevronButton ?
- if(curr_x + width + 2*button_x_delta + mChevronButton->getRect().getWidth() > getRect().mRight )
+ // do we have a place for next button + double buttonHGap + mMoreTextBox ?
+ if(curr_x + width + 2*button_x_delta + mMoreTextBox->getRect().getWidth() > getRect().mRight )
{
return NULL;
}
@@ -828,7 +866,6 @@ LLButton* LLFavoritesBarCtrl::createButton(const LLPointer<LLViewerInventoryItem
fav_btn->setRect(butt_rect);
// change only left and save bottom
fav_btn->setFont(mFont);
- fav_btn->setName(item->getName());
fav_btn->setLabel(item->getName());
fav_btn->setToolTip(item->getName());
fav_btn->setCommitCallback(boost::bind(&LLFavoritesBarCtrl::onButtonClick, this, item->getUUID()));
@@ -850,7 +887,7 @@ BOOL LLFavoritesBarCtrl::postBuild()
menu = LLUICtrlFactory::getDefaultWidget<LLMenuGL>("inventory_menu");
}
menu->setBackgroundColor(LLUIColorTable::instance().getColor("MenuPopupBgColor"));
- mInventoryItemsPopupMenuHandle = menu->getHandle();
+ mContextMenuHandle = menu->getHandle();
return TRUE;
}
@@ -881,86 +918,159 @@ BOOL LLFavoritesBarCtrl::collectFavoriteItems(LLInventoryModel::item_array_t &it
void LLFavoritesBarCtrl::showDropDownMenu()
{
- if (mPopupMenuHandle.isDead())
+ if (mOverflowMenuHandle.isDead())
+ {
+ createOverflowMenu();
+ }
+
+ LLToggleableMenu* menu = (LLToggleableMenu*)mOverflowMenuHandle.get();
+ if (menu && menu->toggleVisibility())
+ {
+ if (mUpdateDropDownItems)
+ {
+ updateMenuItems(menu);
+ }
+
+ menu->buildDrawLabels();
+ menu->updateParent(LLMenuGL::sMenuContainer);
+ menu->setButtonRect(mMoreTextBox->getRect(), this);
+ positionAndShowMenu(menu);
+ }
+}
+
+void LLFavoritesBarCtrl::createOverflowMenu()
+{
+ LLToggleableMenu::Params menu_p;
+ menu_p.name("favorites menu");
+ menu_p.can_tear_off(false);
+ menu_p.visible(false);
+ menu_p.scrollable(true);
+ menu_p.max_scrollable_items = 10;
+ menu_p.preferred_width = DROP_DOWN_MENU_WIDTH;
+
+ LLToggleableMenu* menu = LLUICtrlFactory::create<LLFavoriteLandmarkToggleableMenu>(menu_p);
+ mOverflowMenuHandle = menu->getHandle();
+}
+
+void LLFavoritesBarCtrl::updateMenuItems(LLToggleableMenu* menu)
+{
+ menu->empty();
+
+ U32 widest_item = 0;
+
+ for (S32 i = mFirstDropDownItem; i < mItems.count(); i++)
{
- LLToggleableMenu::Params menu_p;
- menu_p.name("favorites menu");
- menu_p.can_tear_off(false);
- menu_p.visible(false);
- menu_p.scrollable(true);
- menu_p.max_scrollable_items = 10;
- menu_p.preferred_width = DROP_DOWN_MENU_WIDTH;
+ LLViewerInventoryItem* item = mItems.get(i);
+ const std::string& item_name = item->getName();
+
+ LLFavoriteLandmarkMenuItem::Params item_params;
+ item_params.name(item_name);
+ item_params.label(item_name);
+ item_params.on_click.function(boost::bind(&LLFavoritesBarCtrl::onButtonClick, this, item->getUUID()));
+
+ LLFavoriteLandmarkMenuItem *menu_item = LLUICtrlFactory::create<LLFavoriteLandmarkMenuItem>(item_params);
+ menu_item->initFavoritesBarPointer(this);
+ menu_item->setRightMouseDownCallback(boost::bind(&LLFavoritesBarCtrl::onButtonRightClick, this, item->getUUID(), _1, _2, _3, _4));
+ menu_item->LLUICtrl::setMouseDownCallback(boost::bind(&LLFavoritesBarCtrl::onButtonMouseDown, this, item->getUUID(), _1, _2, _3, _4));
+ menu_item->LLUICtrl::setMouseUpCallback(boost::bind(&LLFavoritesBarCtrl::onButtonMouseUp, this, item->getUUID(), _1, _2, _3, _4));
+ menu_item->setLandmarkID(item->getUUID());
+
+ fitLabelWidth(menu_item);
+
+ widest_item = llmax(widest_item, menu_item->getNominalWidth());
- LLToggleableMenu* menu = LLUICtrlFactory::create<LLFavoriteLandmarkToggleableMenu>(menu_p);
- mPopupMenuHandle = menu->getHandle();
+ menu->addChild(menu_item);
}
- LLToggleableMenu* menu = (LLToggleableMenu*)mPopupMenuHandle.get();
+ addOpenLandmarksMenuItem(menu);
+ mUpdateDropDownItems = false;
+}
+
+void LLFavoritesBarCtrl::fitLabelWidth(LLMenuItemCallGL* menu_item)
+{
+ U32 max_width = llmin(DROP_DOWN_MENU_WIDTH, getRect().getWidth());
+ std::string item_name = menu_item->getName();
- if (menu)
+ // Check whether item name wider than menu
+ if (menu_item->getNominalWidth() > max_width)
{
- if (!menu->toggleVisibility())
- return;
+ S32 chars_total = item_name.length();
+ S32 chars_fitted = 1;
+ menu_item->setLabel(LLStringExplicit(""));
+ S32 label_space = max_width - menu_item->getFont()->getWidth("...") -
+ menu_item->getNominalWidth();// This returns width of menu item with empty label (pad pixels)
- U32 max_width = llmin(DROP_DOWN_MENU_WIDTH, getRect().getWidth());
- if (mUpdateDropDownItems)
+ while (chars_fitted < chars_total
+ && menu_item->getFont()->getWidth(item_name, 0, chars_fitted) < label_space)
{
- menu->empty();
+ chars_fitted++;
+ }
+ chars_fitted--; // Rolling back one char, that doesn't fit
- U32 widest_item = 0;
+ menu_item->setLabel(item_name.substr(0, chars_fitted) + "...");
+ }
+}
- for (S32 i = mFirstDropDownItem; i < mItems.count(); i++)
- {
- LLViewerInventoryItem* item = mItems.get(i);
- const std::string& item_name = item->getName();
-
- LLFavoriteLandmarkMenuItem::Params item_params;
- item_params.name(item_name);
- item_params.label(item_name);
-
- item_params.on_click.function(boost::bind(
- &LLFavoritesBarCtrl::onButtonClick, this,
- item->getUUID()));
- LLFavoriteLandmarkMenuItem *menu_item = LLUICtrlFactory::create<LLFavoriteLandmarkMenuItem>(item_params);
- menu_item->initFavoritesBarPointer(this);
- menu_item->setRightMouseDownCallback(boost::bind(&LLFavoritesBarCtrl::onButtonRightClick, this, item->getUUID(), _1, _2, _3, _4));
- menu_item->LLUICtrl::setMouseDownCallback(boost::bind(&LLFavoritesBarCtrl::onButtonMouseDown, this, item->getUUID(), _1, _2, _3, _4));
- menu_item->LLUICtrl::setMouseUpCallback(boost::bind(&LLFavoritesBarCtrl::onButtonMouseUp, this, item->getUUID(), _1, _2, _3, _4));
- menu_item->setLandmarkID(item->getUUID());
-
- // Check whether item name wider than menu
- if (menu_item->getNominalWidth() > max_width)
- {
- S32 chars_total = item_name.length();
- S32 chars_fitted = 1;
- menu_item->setLabel(LLStringExplicit(""));
- S32 label_space = max_width - menu_item->getFont()->getWidth("...") -
- menu_item->getNominalWidth();// This returns width of menu item with empty label (pad pixels)
-
- while (chars_fitted < chars_total
- && menu_item->getFont()->getWidth(item_name, 0, chars_fitted) < label_space)
- {
- chars_fitted++;
- }
- chars_fitted--; // Rolling back one char, that doesn't fit
+void LLFavoritesBarCtrl::addOpenLandmarksMenuItem(LLToggleableMenu* menu)
+{
+ std::string label_untrans = "Open landmarks";
+ std::string label_transl;
+ bool translated = LLTrans::findString(label_transl, label_untrans);
+
+ LLMenuItemCallGL::Params item_params;
+ item_params.name("open_my_landmarks");
+ item_params.label(translated ? label_transl: label_untrans);
+ LLSD key;
+ key["type"] = "open_landmark_tab";
+ item_params.on_click.function(boost::bind(&LLFloaterSidePanelContainer::showPanel, "places", key));
+ LLMenuItemCallGL* menu_item = LLUICtrlFactory::create<LLMenuItemCallGL>(item_params);
+
+ fitLabelWidth(menu_item);
+
+ LLMenuItemSeparatorGL::Params sep_params;
+ sep_params.enabled_color=LLUIColorTable::instance().getColor("MenuItemEnabledColor");
+ sep_params.disabled_color=LLUIColorTable::instance().getColor("MenuItemDisabledColor");
+ sep_params.highlight_bg_color=LLUIColorTable::instance().getColor("MenuItemHighlightBgColor");
+ sep_params.highlight_fg_color=LLUIColorTable::instance().getColor("MenuItemHighlightFgColor");
+ LLMenuItemSeparatorGL* separator = LLUICtrlFactory::create<LLMenuItemSeparatorGL>(sep_params);
+
+ menu->addChild(separator);
+ menu->addChild(menu_item);
+}
- menu_item->setLabel(item_name.substr(0, chars_fitted)
- + "...");
- }
- widest_item = llmax(widest_item, menu_item->getNominalWidth());
+void LLFavoritesBarCtrl::positionAndShowMenu(LLToggleableMenu* menu)
+{
+ U32 max_width = llmin(DROP_DOWN_MENU_WIDTH, getRect().getWidth());
- menu->addChild(menu_item);
- }
- mUpdateDropDownItems = false;
+ S32 menu_x = getRect().getWidth() - max_width;
+ S32 menu_y = getParent()->getRect().mBottom - DROP_DOWN_MENU_TOP_PAD;
+
+ // the menu should be offset of the right edge of the window
+ // so it's no covered by buttons in the right-side toolbar.
+ LLToolBar* right_toolbar = gToolBarView->getChild<LLToolBar>("toolbar_right");
+ if (right_toolbar && right_toolbar->hasButtons())
+ {
+ S32 toolbar_top = 0;
+
+ if (LLView* top_border_panel = right_toolbar->getChild<LLView>("button_panel"))
+ {
+ toolbar_top = top_border_panel->calcScreenRect().mTop;
}
- menu->buildDrawLabels();
- menu->updateParent(LLMenuGL::sMenuContainer);
+ // Calculating the bottom (in screen coord) of the drop down menu
+ S32 menu_top = getParent()->getRect().mBottom - DROP_DOWN_MENU_TOP_PAD;
+ S32 menu_bottom = menu_top - menu->getRect().getHeight();
+ S32 menu_bottom_screen = 0;
- menu->setButtonRect(mChevronButton->getRect(), this);
+ localPointToScreen(0, menu_bottom, &menu_top, &menu_bottom_screen);
- LLMenuGL::showPopup(this, menu, getRect().getWidth() - max_width, 0);
+ if (menu_bottom_screen < toolbar_top)
+ {
+ menu_x -= right_toolbar->getRect().getWidth();
+ }
}
+
+ LLMenuGL::showPopup(this, menu, menu_x, menu_y);
}
void LLFavoritesBarCtrl::onButtonClick(LLUUID item_id)
@@ -973,11 +1083,19 @@ void LLFavoritesBarCtrl::onButtonRightClick( LLUUID item_id,LLView* fav_button,S
{
mSelectedItemID = item_id;
- LLMenuGL* menu = (LLMenuGL*)mInventoryItemsPopupMenuHandle.get();
+ LLMenuGL* menu = (LLMenuGL*)mContextMenuHandle.get();
if (!menu)
{
return;
}
+
+ // Remember that the context menu was shown simultaneously with the overflow menu,
+ // so that we can restore the overflow menu when user clicks a context menu item
+ // (which hides the overflow menu).
+ {
+ LLView* overflow_menu = mOverflowMenuHandle.get();
+ mRestoreOverflowMenu = overflow_menu && overflow_menu->getVisible();
+ }
// Release mouse capture so hover events go to the popup menu
// because this is happening during a mouse down.
@@ -1000,7 +1118,7 @@ BOOL LLFavoritesBarCtrl::handleRightMouseDown(S32 x, S32 y, MASK mask)
}
void copy_slurl_to_clipboard_cb(std::string& slurl)
{
- gClipboard.copyFromString(utf8str_to_wstring(slurl));
+ LLClipboard::instance().copyToClipboard(utf8str_to_wstring(slurl),0,slurl.size());
LLSD args;
args["SLURL"] = slurl;
@@ -1039,7 +1157,7 @@ void LLFavoritesBarCtrl::doToSelected(const LLSD& userdata)
key["type"] = "landmark";
key["id"] = mSelectedItemID;
- LLSideTray::getInstance()->showPanel("panel_places", key);
+ LLFloaterSidePanelContainer::showPanel("places", key);
}
else if (action == "copy_slurl")
{
@@ -1069,7 +1187,7 @@ void LLFavoritesBarCtrl::doToSelected(const LLSD& userdata)
}
else if (action == "copy")
{
- LLInventoryClipboard::instance().store(mSelectedItemID);
+ LLClipboard::instance().copyToClipboard(mSelectedItemID, LLAssetType::AT_LANDMARK);
}
else if (action == "paste")
{
@@ -1082,22 +1200,24 @@ void LLFavoritesBarCtrl::doToSelected(const LLSD& userdata)
// Pop-up the overflow menu again (it gets hidden whenever the user clicks a context menu item).
// See EXT-4217 and STORM-207.
- LLToggleableMenu* menu = (LLToggleableMenu*) mPopupMenuHandle.get();
- if (menu && !menu->getVisible())
+ LLToggleableMenu* menu = (LLToggleableMenu*) mOverflowMenuHandle.get();
+ if (mRestoreOverflowMenu && menu && !menu->getVisible())
{
+ menu->resetScrollPositionOnShow(false);
showDropDownMenu();
+ menu->resetScrollPositionOnShow(true);
}
}
BOOL LLFavoritesBarCtrl::isClipboardPasteable() const
{
- if (!LLInventoryClipboard::instance().hasContents())
+ if (!LLClipboard::instance().hasContents())
{
return FALSE;
}
LLDynamicArray<LLUUID> objects;
- LLInventoryClipboard::instance().retrieve(objects);
+ LLClipboard::instance().pasteFromClipboard(objects);
S32 count = objects.count();
for(S32 i = 0; i < count; i++)
{
@@ -1126,7 +1246,7 @@ void LLFavoritesBarCtrl::pastFromClipboard() const
{
LLInventoryItem* item = NULL;
LLDynamicArray<LLUUID> objects;
- LLInventoryClipboard::instance().retrieve(objects);
+ LLClipboard::instance().pasteFromClipboard(objects);
S32 count = objects.count();
LLUUID parent_id(mFavoriteFolderId);
for(S32 i = 0; i < count; i++)
@@ -1149,11 +1269,11 @@ void LLFavoritesBarCtrl::pastFromClipboard() const
void LLFavoritesBarCtrl::onButtonMouseDown(LLUUID id, LLUICtrl* ctrl, S32 x, S32 y, MASK mask)
{
// EXT-6997 (Fav bar: Pop-up menu for LM in overflow dropdown is kept after LM was dragged away)
- // mInventoryItemsPopupMenuHandle.get() - is a pop-up menu (of items) in already opened dropdown menu.
+ // mContextMenuHandle.get() - is a pop-up menu (of items) in already opened dropdown menu.
// We have to check and set visibility of pop-up menu in such a way instead of using
// LLMenuHolderGL::hideMenus() because it will close both menus(dropdown and pop-up), but
// we need to close only pop-up menu while dropdown one should be still opened.
- LLMenuGL* menu = (LLMenuGL*)mInventoryItemsPopupMenuHandle.get();
+ LLMenuGL* menu = (LLMenuGL*)mContextMenuHandle.get();
if(menu && menu->getVisible())
{
menu->setVisible(FALSE);
@@ -1207,25 +1327,24 @@ BOOL LLFavoritesBarCtrl::handleHover(S32 x, S32 y, MASK mask)
LLUICtrl* LLFavoritesBarCtrl::findChildByLocalCoords(S32 x, S32 y)
{
- LLUICtrl* ctrl = 0;
- S32 screenX, screenY;
+ LLUICtrl* ctrl = NULL;
const child_list_t* list = getChildList();
- localPointToScreen(x, y, &screenX, &screenY);
-
- // look for a child which contains the point (screenX, screenY) in it's rectangle
for (child_list_const_iter_t i = list->begin(); i != list->end(); ++i)
{
- LLRect rect;
- localRectToScreen((*i)->getRect(), &rect);
-
- if (rect.pointInRect(screenX, screenY))
+ // Look only for children that are favorite buttons
+ if ((*i)->getName() == "favorites_bar_btn")
{
- ctrl = dynamic_cast<LLUICtrl*>(*i);
- break;
+ LLRect rect = (*i)->getRect();
+ // We consider a button hit if the cursor is left of the right side
+ // This makes the hit a bit less finicky than hitting directly on the button itself
+ if (x <= rect.mRight)
+ {
+ ctrl = dynamic_cast<LLUICtrl*>(*i);
+ break;
+ }
}
}
-
return ctrl;
}
@@ -1246,29 +1365,28 @@ BOOL LLFavoritesBarCtrl::needToSaveItemsOrder(const LLInventoryModel::item_array
return result;
}
-LLInventoryModel::item_array_t::iterator LLFavoritesBarCtrl::findItemByUUID(LLInventoryModel::item_array_t& items, const LLUUID& id)
+void LLFavoritesBarCtrl::insertItem(LLInventoryModel::item_array_t& items, const LLUUID& dest_item_id, LLViewerInventoryItem* insertedItem, bool insert_before)
{
- LLInventoryModel::item_array_t::iterator result = items.end();
+ // Get the iterator to the destination item
+ LLInventoryModel::item_array_t::iterator it_dest = LLInventoryModel::findItemIterByUUID(items, dest_item_id);
+ if (it_dest == items.end())
+ return;
- for (LLInventoryModel::item_array_t::iterator i = items.begin(); i != items.end(); ++i)
+ // Go to the next element if one wishes to insert after the dest element
+ if (!insert_before)
{
- if ((*i)->getUUID() == id)
- {
- result = i;
- break;
- }
+ ++it_dest;
}
-
- return result;
-}
-
-void LLFavoritesBarCtrl::insertBeforeItem(LLInventoryModel::item_array_t& items, const LLUUID& beforeItemId, LLViewerInventoryItem* insertedItem)
-{
- LLViewerInventoryItem* beforeItem = gInventory.getItem(beforeItemId);
- llassert(beforeItem);
- if (beforeItem)
+
+ // Insert the source item in the right place
+ if (it_dest != items.end())
+ {
+ items.insert(it_dest, insertedItem);
+ }
+ else
{
- items.insert(findItemByUUID(items, beforeItem->getUUID()), insertedItem);
+ // Append to the list if it_dest reached the end
+ items.push_back(insertedItem);
}
}
diff --git a/indra/newview/llfavoritesbar.h b/indra/newview/llfavoritesbar.h
index 37645523f6..2f75b3bb0e 100644
--- a/indra/newview/llfavoritesbar.h
+++ b/indra/newview/llfavoritesbar.h
@@ -34,13 +34,16 @@
#include "llinventoryobserver.h"
#include "llinventorymodel.h"
+class LLMenuItemCallGL;
+class LLToggleableMenu;
+
class LLFavoritesBarCtrl : public LLUICtrl, public LLInventoryObserver
{
public:
struct Params : public LLInitParam::Block<Params, LLUICtrl::Params>
{
Optional<LLUIImage*> image_drag_indication;
- Optional<LLButton::Params> chevron_button;
+ Optional<LLTextBox::Params> more_button;
Optional<LLTextBox::Params> label;
Params();
};
@@ -91,13 +94,14 @@ protected:
void showDropDownMenu();
- LLHandle<LLView> mPopupMenuHandle;
- LLHandle<LLView> mInventoryItemsPopupMenuHandle;
+ LLHandle<LLView> mOverflowMenuHandle;
+ LLHandle<LLView> mContextMenuHandle;
LLUUID mFavoriteFolderId;
const LLFontGL *mFont;
S32 mFirstDropDownItem;
bool mUpdateDropDownItems;
+ bool mRestoreOverflowMenu;
LLUUID mSelectedItemID;
@@ -126,15 +130,26 @@ private:
* inserts an item identified by insertedItemId BEFORE an item identified by beforeItemId.
* this function assumes that an item identified by insertedItemId doesn't exist in items array.
*/
- void insertBeforeItem(LLInventoryModel::item_array_t& items, const LLUUID& beforeItemId, LLViewerInventoryItem* insertedItem);
+ void insertItem(LLInventoryModel::item_array_t& items, const LLUUID& dest_item_id, LLViewerInventoryItem* insertedItem, bool insert_before);
// finds an item by it's UUID in the items array
LLInventoryModel::item_array_t::iterator findItemByUUID(LLInventoryModel::item_array_t& items, const LLUUID& id);
+ void createOverflowMenu();
+
+ void updateMenuItems(LLToggleableMenu* menu);
+
+ // Fits menu item label width with favorites menu width
+ void fitLabelWidth(LLMenuItemCallGL* menu_item);
+
+ void addOpenLandmarksMenuItem(LLToggleableMenu* menu);
+
+ void positionAndShowMenu(LLToggleableMenu* menu);
+
BOOL mShowDragMarker;
LLUICtrl* mLandingTab;
LLUICtrl* mLastTab;
- LLButton* mChevronButton;
+ LLTextBox* mMoreTextBox;
LLTextBox* mBarLabel;
LLUUID mDragItemId;
diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp
index ca2ef5f5b8..08f9d26705 100644
--- a/indra/newview/llfeaturemanager.cpp
+++ b/indra/newview/llfeaturemanager.cpp
@@ -51,6 +51,7 @@
#include "llcontrol.h"
#include "llboost.h"
#include "llweb.h"
+#include "llviewershadermgr.h"
#if LL_WINDOWS
#include "lldxhardware.h"
@@ -106,7 +107,7 @@ BOOL LLFeatureList::isFeatureAvailable(const std::string& name)
return mFeatures[name].mAvailable;
}
- LL_WARNS("RenderInit") << "Feature " << name << " not on feature list!" << LL_ENDL;
+ LL_WARNS_ONCE("RenderInit") << "Feature " << name << " not on feature list!" << LL_ENDL;
// changing this to TRUE so you have to explicitly disable
// something for it to be disabled
@@ -120,7 +121,7 @@ F32 LLFeatureList::getRecommendedValue(const std::string& name)
return mFeatures[name].mRecommendedLevel;
}
- LL_WARNS("RenderInit") << "Feature " << name << " not on feature list or not available!" << LL_ENDL;
+ LL_WARNS_ONCE("RenderInit") << "Feature " << name << " not on feature list or not available!" << LL_ENDL;
return 0;
}
@@ -203,7 +204,7 @@ BOOL LLFeatureManager::maskFeatures(const std::string& name)
LL_DEBUGS("RenderInit") << "Unknown feature mask " << name << LL_ENDL;
return FALSE;
}
- LL_DEBUGS("RenderInit") << "Applying Feature Mask: " << name << LL_ENDL;
+ LL_INFOS("RenderInit") << "Applying GPU Feature list: " << name << LL_ENDL;
return maskList(*maskp);
}
@@ -290,11 +291,9 @@ BOOL LLFeatureManager::parseFeatureTable(std::string filename)
mTableVersion = version;
LLFeatureList *flp = NULL;
- while (!file.eof() && file.good())
+ while (file >> name)
{
char buffer[MAX_STRING]; /*Flawfinder: ignore*/
-
- file >> name;
if (name.substr(0,2) == "//")
{
@@ -303,13 +302,6 @@ BOOL LLFeatureManager::parseFeatureTable(std::string filename)
continue;
}
- if (name.empty())
- {
- // This is a blank line
- file.getline(buffer, MAX_STRING);
- continue;
- }
-
if (name == "list")
{
if (flp)
@@ -387,13 +379,16 @@ void LLFeatureManager::parseGPUTable(std::string filename)
return;
}
- std::string renderer = gGLManager.getRawGLString();
+ std::string rawRenderer = gGLManager.getRawGLString();
+ std::string renderer = rawRenderer;
for (std::string::iterator i = renderer.begin(); i != renderer.end(); ++i)
{
*i = tolower(*i);
}
-
- while (!file.eof())
+
+ bool gpuFound;
+ U32 lineNumber;
+ for (gpuFound = false, lineNumber = 0; !gpuFound && !file.eof(); lineNumber++)
{
char buffer[MAX_STRING]; /*Flawfinder: ignore*/
buffer[0] = 0;
@@ -440,6 +435,7 @@ void LLFeatureManager::parseGPUTable(std::string filename)
if (label.empty() || expr.empty() || cls.empty() || supported.empty())
{
+ LL_WARNS("RenderInit") << "invald gpu_table.txt:" << lineNumber << ": '" << buffer << "'" << LL_ENDL;
continue;
}
@@ -453,18 +449,26 @@ void LLFeatureManager::parseGPUTable(std::string filename)
if(boost::regex_search(renderer, re))
{
// if we found it, stop!
- file.close();
- LL_INFOS("RenderInit") << "GPU is " << label << llendl;
+ gpuFound = true;
mGPUString = label;
mGPUClass = (EGPUClass) strtol(cls.c_str(), NULL, 10);
mGPUSupported = (BOOL) strtol(supported.c_str(), NULL, 10);
- file.close();
- return;
}
}
file.close();
- LL_WARNS("RenderInit") << "Couldn't match GPU to a class: " << gGLManager.getRawGLString() << LL_ENDL;
+ if ( gpuFound )
+ {
+ LL_INFOS("RenderInit") << "GPU '" << rawRenderer << "' recognized as '" << mGPUString << "'" << LL_ENDL;
+ if (!mGPUSupported)
+ {
+ LL_INFOS("RenderInit") << "GPU '" << mGPUString << "' is not supported." << LL_ENDL;
+ }
+ }
+ else
+ {
+ LL_WARNS("RenderInit") << "GPU '" << rawRenderer << "' not recognized" << LL_ENDL;
+ }
}
// responder saves table into file
@@ -659,8 +663,10 @@ void LLFeatureManager::applyFeatures(bool skipFeatures)
void LLFeatureManager::setGraphicsLevel(S32 level, bool skipFeatures)
{
- applyBaseMasks();
+ LLViewerShaderMgr::sSkipReload = true;
+ applyBaseMasks();
+
switch (level)
{
case 0:
@@ -681,6 +687,9 @@ void LLFeatureManager::setGraphicsLevel(S32 level, bool skipFeatures)
}
applyFeatures(skipFeatures);
+
+ LLViewerShaderMgr::sSkipReload = false;
+ LLViewerShaderMgr::instance()->setShaders();
}
void LLFeatureManager::applyBaseMasks()
@@ -722,7 +731,7 @@ void LLFeatureManager::applyBaseMasks()
{
maskFeatures("NoPixelShaders");
}
- if (!gGLManager.mHasVertexShader)
+ if (!gGLManager.mHasVertexShader || !mGPUSupported)
{
maskFeatures("NoVertexShaders");
}
@@ -738,6 +747,10 @@ void LLFeatureManager::applyBaseMasks()
{
maskFeatures("ATI");
}
+ if (gGLManager.mHasATIMemInfo && gGLManager.mVRAM < 256)
+ {
+ maskFeatures("ATIVramLT256");
+ }
if (gGLManager.mATIOldDriver)
{
maskFeatures("ATIOldDriver");
@@ -754,6 +767,18 @@ void LLFeatureManager::applyBaseMasks()
{
maskFeatures("OpenGLPre15");
}
+ if (gGLManager.mGLVersion < 3.f)
+ {
+ maskFeatures("OpenGLPre30");
+ }
+ if (gGLManager.mNumTextureImageUnits <= 8)
+ {
+ maskFeatures("TexUnit8orLess");
+ }
+ if (gGLManager.mHasMapBufferRange)
+ {
+ maskFeatures("MapBufferRange");
+ }
// now mask by gpu string
// Replaces ' ' with '_' in mGPUString to deal with inability for parser to handle spaces
diff --git a/indra/newview/llfilepicker.cpp b/indra/newview/llfilepicker.cpp
index c14be89641..8986a694f9 100644
--- a/indra/newview/llfilepicker.cpp
+++ b/indra/newview/llfilepicker.cpp
@@ -33,6 +33,7 @@
#include "lldir.h"
#include "llframetimer.h"
#include "lltrans.h"
+#include "llviewercontrol.h"
#include "llwindow.h" // beforeDialog()
#if LL_SDL
@@ -48,13 +49,16 @@ LLFilePicker LLFilePicker::sInstance;
#if LL_WINDOWS
#define SOUND_FILTER L"Sounds (*.wav)\0*.wav\0"
#define IMAGE_FILTER L"Images (*.tga; *.bmp; *.jpg; *.jpeg; *.png)\0*.tga;*.bmp;*.jpg;*.jpeg;*.png\0"
-#define ANIM_FILTER L"Animations (*.bvh)\0*.bvh\0"
+#define ANIM_FILTER L"Animations (*.bvh; *.anim)\0*.bvh;*.anim\0"
+#define COLLADA_FILTER L"Scene (*.dae)\0*.dae\0"
#ifdef _CORY_TESTING
#define GEOMETRY_FILTER L"SL Geometry (*.slg)\0*.slg\0"
#endif
#define XML_FILTER L"XML files (*.xml)\0*.xml\0"
#define SLOBJECT_FILTER L"Objects (*.slobject)\0*.slobject\0"
#define RAW_FILTER L"RAW files (*.raw)\0*.raw\0"
+#define MODEL_FILTER L"Model files (*.dae)\0*.dae\0"
+#define SCRIPT_FILTER L"Script files (*.lsl)\0*.lsl\0"
#endif
//
@@ -104,6 +108,20 @@ LLFilePicker::~LLFilePicker()
// nothing
}
+// utility function to check if access to local file system via file browser
+// is enabled and if not, tidy up and indicate we're not allowed to do this.
+bool LLFilePicker::check_local_file_access_enabled()
+{
+ // if local file browsing is turned off, return without opening dialog
+ bool local_file_system_browsing_enabled = gSavedSettings.getBOOL("LocalFileSystemBrowsingEnabled");
+ if ( ! local_file_system_browsing_enabled )
+ {
+ mFiles.clear();
+ return false;
+ }
+
+ return true;
+}
const std::string LLFilePicker::getFirstFile()
{
@@ -170,6 +188,10 @@ BOOL LLFilePicker::setupFilter(ELoadFilter filter)
mOFN.lpstrFilter = ANIM_FILTER \
L"\0";
break;
+ case FFLOAD_COLLADA:
+ mOFN.lpstrFilter = COLLADA_FILTER \
+ L"\0";
+ break;
#ifdef _CORY_TESTING
case FFLOAD_GEOMETRY:
mOFN.lpstrFilter = GEOMETRY_FILTER \
@@ -188,6 +210,14 @@ BOOL LLFilePicker::setupFilter(ELoadFilter filter)
mOFN.lpstrFilter = RAW_FILTER \
L"\0";
break;
+ case FFLOAD_MODEL:
+ mOFN.lpstrFilter = MODEL_FILTER \
+ L"\0";
+ break;
+ case FFLOAD_SCRIPT:
+ mOFN.lpstrFilter = SCRIPT_FILTER \
+ L"\0";
+ break;
default:
res = FALSE;
break;
@@ -195,7 +225,7 @@ BOOL LLFilePicker::setupFilter(ELoadFilter filter)
return res;
}
-BOOL LLFilePicker::getOpenFile(ELoadFilter filter)
+BOOL LLFilePicker::getOpenFile(ELoadFilter filter, bool blocking)
{
if( mLocked )
{
@@ -203,6 +233,12 @@ BOOL LLFilePicker::getOpenFile(ELoadFilter filter)
}
BOOL success = FALSE;
+ // if local file browsing is turned off, return without opening dialog
+ if ( check_local_file_access_enabled() == false )
+ {
+ return FALSE;
+ }
+
// don't provide default file selection
mFilesW[0] = '\0';
@@ -214,8 +250,11 @@ BOOL LLFilePicker::getOpenFile(ELoadFilter filter)
setupFilter(filter);
- // Modal, so pause agent
- send_agent_pause();
+ if (blocking)
+ {
+ // Modal, so pause agent
+ send_agent_pause();
+ }
reset();
@@ -226,10 +265,14 @@ BOOL LLFilePicker::getOpenFile(ELoadFilter filter)
std::string filename = utf16str_to_utf8str(llutf16string(mFilesW));
mFiles.push_back(filename);
}
- send_agent_resume();
- // Account for the fact that the app has been stalled.
- LLFrameTimer::updateFrameTime();
+ if (blocking)
+ {
+ send_agent_resume();
+ // Account for the fact that the app has been stalled.
+ LLFrameTimer::updateFrameTime();
+ }
+
return success;
}
@@ -241,6 +284,12 @@ BOOL LLFilePicker::getMultipleOpenFiles(ELoadFilter filter)
}
BOOL success = FALSE;
+ // if local file browsing is turned off, return without opening dialog
+ if ( check_local_file_access_enabled() == false )
+ {
+ return FALSE;
+ }
+
// don't provide default file selection
mFilesW[0] = '\0';
@@ -304,6 +353,12 @@ BOOL LLFilePicker::getSaveFile(ESaveFilter filter, const std::string& filename)
}
BOOL success = FALSE;
+ // if local file browsing is turned off, return without opening dialog
+ if ( check_local_file_access_enabled() == false )
+ {
+ return FALSE;
+ }
+
mOFN.lpstrFile = mFilesW;
if (!filename.empty())
{
@@ -370,9 +425,9 @@ BOOL LLFilePicker::getSaveFile(ESaveFilter filter, const std::string& filename)
{
wcsncpy( mFilesW,L"untitled.jpeg", FILENAME_BUFFER_SIZE); /*Flawfinder: ignore*/
}
- mOFN.lpstrDefExt = L"jpeg";
+ mOFN.lpstrDefExt = L"jpg";
mOFN.lpstrFilter =
- L"JPEG Images (*.jpeg)\0*.jpeg\0" \
+ L"JPEG Images (*.jpg *.jpeg)\0*.jpg;*.jpeg\0" \
L"\0";
break;
case FFSAVE_AVI:
@@ -447,6 +502,14 @@ BOOL LLFilePicker::getSaveFile(ESaveFilter filter, const std::string& filename)
L"Compressed Images (*.j2c)\0*.j2c\0" \
L"\0";
break;
+ case FFSAVE_SCRIPT:
+ if (filename.empty())
+ {
+ wcsncpy( mFilesW,L"untitled.lsl", FILENAME_BUFFER_SIZE);
+ }
+ mOFN.lpstrDefExt = L"txt";
+ mOFN.lpstrFilter = L"LSL Files (*.lsl)\0*.lsl\0" L"\0";
+ break;
default:
return FALSE;
}
@@ -530,8 +593,19 @@ Boolean LLFilePicker::navOpenFilterProc(AEDesc *theItem, void *info, void *callB
}
else if (filter == FFLOAD_ANIM)
{
- if (fileInfo.filetype != 'BVH ' &&
- (fileInfo.extension && (CFStringCompare(fileInfo.extension, CFSTR("bvh"), kCFCompareCaseInsensitive) != kCFCompareEqualTo))
+ if (fileInfo.filetype != 'BVH ' &&
+ fileInfo.filetype != 'ANIM' &&
+ (fileInfo.extension && (CFStringCompare(fileInfo.extension, CFSTR("bvh"), kCFCompareCaseInsensitive) != kCFCompareEqualTo) &&
+ fileInfo.extension && (CFStringCompare(fileInfo.extension, CFSTR("anim"), kCFCompareCaseInsensitive) != kCFCompareEqualTo))
+ )
+ {
+ result = false;
+ }
+ }
+ else if (filter == FFLOAD_COLLADA)
+ {
+ if (fileInfo.filetype != 'DAE ' &&
+ (fileInfo.extension && (CFStringCompare(fileInfo.extension, CFSTR("dae"), kCFCompareCaseInsensitive) != kCFCompareEqualTo))
)
{
result = false;
@@ -561,6 +635,14 @@ Boolean LLFilePicker::navOpenFilterProc(AEDesc *theItem, void *info, void *callB
result = false;
}
}
+ else if (filter == FFLOAD_SCRIPT)
+ {
+ if (fileInfo.filetype != 'LSL ' &&
+ (fileInfo.extension && (CFStringCompare(fileInfo.extension, CFSTR("lsl"), kCFCompareCaseInsensitive) != kCFCompareEqualTo)) )
+ {
+ result = false;
+ }
+ }
if (fileInfo.extension)
{
@@ -581,6 +663,12 @@ OSStatus LLFilePicker::doNavChooseDialog(ELoadFilter filter)
NavDialogRef navRef = NULL;
NavReplyRecord navReply;
+ // if local file browsing is turned off, return without opening dialog
+ if ( check_local_file_access_enabled() == false )
+ {
+ return FALSE;
+ }
+
memset(&navReply, 0, sizeof(navReply));
// NOTE: we are passing the address of a local variable here.
@@ -588,12 +676,12 @@ OSStatus LLFilePicker::doNavChooseDialog(ELoadFilter filter)
// (It is destroyed by NavDialogDispose() below.)
error = NavCreateChooseFileDialog(&mNavOptions, NULL, NULL, NULL, navOpenFilterProc, (void*)(&filter), &navRef);
- gViewerWindow->mWindow->beforeDialog();
+ gViewerWindow->getWindow()->beforeDialog();
if (error == noErr)
error = NavDialogRun(navRef);
- gViewerWindow->mWindow->afterDialog();
+ gViewerWindow->getWindow()->afterDialog();
if (error == noErr)
error = NavDialogGetReply(navRef, &navReply);
@@ -701,6 +789,12 @@ OSStatus LLFilePicker::doNavSaveDialog(ESaveFilter filter, const std::string& fi
extension = CFSTR(".j2c");
break;
+ case FFSAVE_SCRIPT:
+ type = 'LSL ';
+ creator = '\?\?\?\?';
+ extension = CFSTR(".lsl");
+ break;
+
case FFSAVE_ALL:
default:
type = '\?\?\?\?';
@@ -743,13 +837,13 @@ OSStatus LLFilePicker::doNavSaveDialog(ESaveFilter filter, const std::string& fi
}
}
- gViewerWindow->mWindow->beforeDialog();
+ gViewerWindow->getWindow()->beforeDialog();
// Run the dialog
if (error == noErr)
error = NavDialogRun(navRef);
- gViewerWindow->mWindow->afterDialog();
+ gViewerWindow->getWindow()->afterDialog();
if (error == noErr)
error = NavDialogGetReply(navRef, &navReply);
@@ -802,13 +896,19 @@ OSStatus LLFilePicker::doNavSaveDialog(ESaveFilter filter, const std::string& fi
return error;
}
-BOOL LLFilePicker::getOpenFile(ELoadFilter filter)
+BOOL LLFilePicker::getOpenFile(ELoadFilter filter, bool blocking)
{
if( mLocked )
return FALSE;
BOOL success = FALSE;
+ // if local file browsing is turned off, return without opening dialog
+ if ( check_local_file_access_enabled() == false )
+ {
+ return FALSE;
+ }
+
OSStatus error = noErr;
reset();
@@ -821,20 +921,29 @@ BOOL LLFilePicker::getOpenFile(ELoadFilter filter)
mNavOptions.optionFlags |= kNavSupportPackages;
}
- // Modal, so pause agent
- send_agent_pause();
+ if (blocking)
+ {
+ // Modal, so pause agent
+ send_agent_pause();
+ }
+
{
error = doNavChooseDialog(filter);
}
- send_agent_resume();
+
if (error == noErr)
{
if (getFileCount())
success = true;
}
- // Account for the fact that the app has been stalled.
- LLFrameTimer::updateFrameTime();
+ if (blocking)
+ {
+ send_agent_resume();
+ // Account for the fact that the app has been stalled.
+ LLFrameTimer::updateFrameTime();
+ }
+
return success;
}
@@ -845,6 +954,12 @@ BOOL LLFilePicker::getMultipleOpenFiles(ELoadFilter filter)
BOOL success = FALSE;
+ // if local file browsing is turned off, return without opening dialog
+ if ( check_local_file_access_enabled() == false )
+ {
+ return FALSE;
+ }
+
OSStatus error = noErr;
reset();
@@ -876,6 +991,12 @@ BOOL LLFilePicker::getSaveFile(ESaveFilter filter, const std::string& filename)
BOOL success = FALSE;
OSStatus error = noErr;
+ // if local file browsing is turned off, return without opening dialog
+ if ( check_local_file_access_enabled() == false )
+ {
+ return FALSE;
+ }
+
reset();
mNavOptions.optionFlags &= ~kNavAllowMultipleFiles;
@@ -954,8 +1075,11 @@ void LLFilePicker::chooser_responder(GtkWidget *widget, gint response, gpointer
}
// set the default path for this usage context.
- picker->mContextToPathMap[picker->mCurContextName] =
- gtk_file_chooser_get_current_folder(GTK_FILE_CHOOSER(widget));
+ const char* cur_folder = gtk_file_chooser_get_current_folder(GTK_FILE_CHOOSER(widget));
+ if (cur_folder != NULL)
+ {
+ picker->mContextToPathMap[picker->mCurContextName] = cur_folder;
+ }
gtk_widget_destroy(widget);
gtk_main_quit();
@@ -1077,10 +1201,20 @@ static std::string add_wav_filter_to_gtkchooser(GtkWindow *picker)
LLTrans::getString("sound_files") + " (*.wav)");
}
-static std::string add_bvh_filter_to_gtkchooser(GtkWindow *picker)
+static std::string add_anim_filter_to_gtkchooser(GtkWindow *picker)
{
- return add_simple_pattern_filter_to_gtkchooser(picker, "*.bvh",
- LLTrans::getString("animation_files") + " (*.bvh)");
+ GtkFileFilter *gfilter = gtk_file_filter_new();
+ gtk_file_filter_add_pattern(gfilter, "*.bvh");
+ gtk_file_filter_add_pattern(gfilter, "*.anim");
+ std::string filtername = LLTrans::getString("animation_files") + " (*.bvh; *.anim)";
+ add_common_filters_to_gtkchooser(gfilter, picker, filtername);
+ return filtername;
+}
+
+static std::string add_collada_filter_to_gtkchooser(GtkWindow *picker)
+{
+ return add_simple_pattern_filter_to_gtkchooser(picker, "*.dae",
+ LLTrans::getString("scene_files") + " (*.dae)");
}
static std::string add_imageload_filter_to_gtkchooser(GtkWindow *picker)
@@ -1094,13 +1228,24 @@ static std::string add_imageload_filter_to_gtkchooser(GtkWindow *picker)
add_common_filters_to_gtkchooser(gfilter, picker, filtername);
return filtername;
}
-
+
+static std::string add_script_filter_to_gtkchooser(GtkWindow *picker)
+{
+ return add_simple_mime_filter_to_gtkchooser(picker, "text/plain",
+ LLTrans::getString("script_files") + " (*.lsl)");
+}
BOOL LLFilePicker::getSaveFile( ESaveFilter filter, const std::string& filename )
{
BOOL rtn = FALSE;
- gViewerWindow->mWindow->beforeDialog();
+ // if local file browsing is turned off, return without opening dialog
+ if ( check_local_file_access_enabled() == false )
+ {
+ return FALSE;
+ }
+
+ gViewerWindow->getWindow()->beforeDialog();
reset();
@@ -1154,6 +1299,10 @@ BOOL LLFilePicker::getSaveFile( ESaveFilter filter, const std::string& filename
LLTrans::getString("compressed_image_files") + " (*.j2c)");
suggest_ext = ".j2c";
break;
+ case FFSAVE_SCRIPT:
+ caption += add_script_filter_to_gtkchooser(picker);
+ suggest_ext = ".lsl";
+ break;
default:;
break;
}
@@ -1180,16 +1329,22 @@ BOOL LLFilePicker::getSaveFile( ESaveFilter filter, const std::string& filename
rtn = (getFileCount() == 1);
}
- gViewerWindow->mWindow->afterDialog();
+ gViewerWindow->getWindow()->afterDialog();
return rtn;
}
-BOOL LLFilePicker::getOpenFile( ELoadFilter filter )
+BOOL LLFilePicker::getOpenFile( ELoadFilter filter, bool blocking )
{
BOOL rtn = FALSE;
- gViewerWindow->mWindow->beforeDialog();
+ // if local file browsing is turned off, return without opening dialog
+ if ( check_local_file_access_enabled() == false )
+ {
+ return FALSE;
+ }
+
+ gViewerWindow->getWindow()->beforeDialog();
reset();
@@ -1205,11 +1360,17 @@ BOOL LLFilePicker::getOpenFile( ELoadFilter filter )
filtername = add_wav_filter_to_gtkchooser(picker);
break;
case FFLOAD_ANIM:
- filtername = add_bvh_filter_to_gtkchooser(picker);
+ filtername = add_anim_filter_to_gtkchooser(picker);
+ break;
+ case FFLOAD_COLLADA:
+ filtername = add_collada_filter_to_gtkchooser(picker);
break;
case FFLOAD_IMAGE:
filtername = add_imageload_filter_to_gtkchooser(picker);
break;
+ case FFLOAD_SCRIPT:
+ filtername = add_script_filter_to_gtkchooser(picker);
+ break;
default:;
break;
}
@@ -1224,7 +1385,7 @@ BOOL LLFilePicker::getOpenFile( ELoadFilter filter )
rtn = (getFileCount() == 1);
}
- gViewerWindow->mWindow->afterDialog();
+ gViewerWindow->getWindow()->afterDialog();
return rtn;
}
@@ -1233,7 +1394,13 @@ BOOL LLFilePicker::getMultipleOpenFiles( ELoadFilter filter )
{
BOOL rtn = FALSE;
- gViewerWindow->mWindow->beforeDialog();
+ // if local file browsing is turned off, return without opening dialog
+ if ( check_local_file_access_enabled() == false )
+ {
+ return FALSE;
+ }
+
+ gViewerWindow->getWindow()->beforeDialog();
reset();
@@ -1251,7 +1418,7 @@ BOOL LLFilePicker::getMultipleOpenFiles( ELoadFilter filter )
rtn = !mFiles.empty();
}
- gViewerWindow->mWindow->afterDialog();
+ gViewerWindow->getWindow()->afterDialog();
return rtn;
}
@@ -1263,6 +1430,13 @@ BOOL LLFilePicker::getMultipleOpenFiles( ELoadFilter filter )
BOOL LLFilePicker::getSaveFile( ESaveFilter filter, const std::string& filename )
{
+ // if local file browsing is turned off, return without opening dialog
+ // (Even though this is a stub, I think we still should not return anything at all)
+ if ( check_local_file_access_enabled() == false )
+ {
+ return FALSE;
+ }
+
reset();
llinfos << "getSaveFile suggested filename is [" << filename
@@ -1277,6 +1451,13 @@ BOOL LLFilePicker::getSaveFile( ESaveFilter filter, const std::string& filename
BOOL LLFilePicker::getOpenFile( ELoadFilter filter )
{
+ // if local file browsing is turned off, return without opening dialog
+ // (Even though this is a stub, I think we still should not return anything at all)
+ if ( check_local_file_access_enabled() == false )
+ {
+ return FALSE;
+ }
+
reset();
// HACK: Static filenames for 'open' until we implement filepicker
@@ -1295,6 +1476,13 @@ BOOL LLFilePicker::getOpenFile( ELoadFilter filter )
BOOL LLFilePicker::getMultipleOpenFiles( ELoadFilter filter )
{
+ // if local file browsing is turned off, return without opening dialog
+ // (Even though this is a stub, I think we still should not return anything at all)
+ if ( check_local_file_access_enabled() == false )
+ {
+ return FALSE;
+ }
+
reset();
return FALSE;
}
diff --git a/indra/newview/llfilepicker.h b/indra/newview/llfilepicker.h
index 5819ac4fd8..a4d5d68ff5 100644
--- a/indra/newview/llfilepicker.h
+++ b/indra/newview/llfilepicker.h
@@ -82,6 +82,9 @@ public:
FFLOAD_XML = 6,
FFLOAD_SLOBJECT = 7,
FFLOAD_RAW = 8,
+ FFLOAD_MODEL = 9,
+ FFLOAD_COLLADA = 10,
+ FFLOAD_SCRIPT = 11,
};
enum ESaveFilter
@@ -101,11 +104,12 @@ public:
FFSAVE_J2C = 12,
FFSAVE_PNG = 13,
FFSAVE_JPEG = 14,
+ FFSAVE_SCRIPT = 15,
};
// open the dialog. This is a modal operation
BOOL getSaveFile( ESaveFilter filter = FFSAVE_ALL, const std::string& filename = LLStringUtil::null );
- BOOL getOpenFile( ELoadFilter filter = FFLOAD_ALL );
+ BOOL getOpenFile( ELoadFilter filter = FFLOAD_ALL, bool blocking = true );
BOOL getMultipleOpenFiles( ELoadFilter filter = FFLOAD_ALL );
// Get the filename(s) found. getFirstFile() sets the pointer to
@@ -140,6 +144,10 @@ private:
//FILENAME_BUFFER_SIZE = 65536
FILENAME_BUFFER_SIZE = 65000
};
+
+ // utility function to check if access to local file system via file browser
+ // is enabled and if not, tidy up and indicate we're not allowed to do this.
+ bool check_local_file_access_enabled();
#if LL_WINDOWS
OPENFILENAMEW mOFN; // for open and save dialogs
@@ -186,4 +194,6 @@ public:
~LLFilePicker();
};
+const std::string upload_pick(void* data);
+
#endif
diff --git a/indra/newview/llfilteredwearablelist.cpp b/indra/newview/llfilteredwearablelist.cpp
index cd5e779c4d..a29ccf2b6d 100644
--- a/indra/newview/llfilteredwearablelist.cpp
+++ b/indra/newview/llfilteredwearablelist.cpp
@@ -31,6 +31,7 @@
#include "llinventoryfunctions.h"
#include "llinventoryitemslist.h"
#include "llinventorymodel.h"
+#include "llviewerinventory.h"
LLFilteredWearableListManager::LLFilteredWearableListManager(LLInventoryItemsList* list, LLInventoryCollectFunctor* collector)
diff --git a/indra/newview/llfirstuse.cpp b/indra/newview/llfirstuse.cpp
index b08c113923..a9f52282a5 100644
--- a/indra/newview/llfirstuse.cpp
+++ b/indra/newview/llfirstuse.cpp
@@ -78,6 +78,12 @@ void LLFirstUse::otherAvatarChatFirst(bool enable)
}
// static
+void LLFirstUse::speak(bool enable)
+{
+ firstUseNotification("FirstSpeak", enable, "HintSpeak", LLSD(), LLSD().with("target", "speak_btn").with("direction", "top"));
+}
+
+// static
void LLFirstUse::sit(bool enable)
{
firstUseNotification("FirstSit", enable, "HintSit", LLSD(), LLSD().with("target", "stand_btn").with("direction", "top"));
@@ -100,7 +106,7 @@ void LLFirstUse::useSandbox()
void LLFirstUse::notUsingDestinationGuide(bool enable)
{
// not doing this yet
- //firstUseNotification("FirstNotUseDestinationGuide", enable, "HintDestinationGuide", LLSD(), LLSD().with("target", "dest_guide_btn").with("direction", "left"));
+ firstUseNotification("FirstNotUseDestinationGuide", enable, "HintDestinationGuide", LLSD(), LLSD().with("target", "dest_guide_btn").with("direction", "top"));
}
// static
@@ -113,7 +119,19 @@ void LLFirstUse::notUsingSidePanel(bool enable)
// static
void LLFirstUse::notMoving(bool enable)
{
+ // fire off 2 notifications and rely on filtering to select the relevant one
firstUseNotification("FirstNotMoving", enable, "HintMove", LLSD(), LLSD().with("target", "move_btn").with("direction", "top"));
+ firstUseNotification("FirstNotMoving", enable, "HintMoveClick", LLSD(), LLSD()
+ .with("target", "nav_bar")
+ .with("direction", "bottom")
+ .with("hint_image", "click_to_move.png")
+ .with("up_arrow", ""));
+}
+
+// static
+void LLFirstUse::viewPopup(bool enable)
+{
+// firstUseNotification("FirstViewPopup", enable, "HintView", LLSD(), LLSD().with("target", "view_popup").with("direction", "right"));
}
// static
diff --git a/indra/newview/llfirstuse.h b/indra/newview/llfirstuse.h
index 3b7ff6383b..4c8c9d3cde 100644
--- a/indra/newview/llfirstuse.h
+++ b/indra/newview/llfirstuse.h
@@ -68,6 +68,8 @@ object or from inventory.
13. First time you open the debug menus (ctrl-alt-shift D)
14. First time you create/edit a sculpted prim.
+
+15. Explanation of Speak&flyout buttons.
*/
class LLNotification;
@@ -85,10 +87,12 @@ public:
static void resetFirstUse();
static void otherAvatarChatFirst(bool enable = true);
+ static void speak(bool enable = true);
static void sit(bool enable = true);
static void notUsingDestinationGuide(bool enable = true);
static void notUsingSidePanel(bool enable = true);
static void notMoving(bool enable = true);
+ static void viewPopup(bool enable = true);
static void newInventory(bool enable = true);
static void receiveLindens(bool enable = true);
static void setDisplayName(bool enable = true);
diff --git a/indra/newview/llflexibleobject.cpp b/indra/newview/llflexibleobject.cpp
index 8ab2229235..32a533570a 100644
--- a/indra/newview/llflexibleobject.cpp
+++ b/indra/newview/llflexibleobject.cpp
@@ -91,11 +91,13 @@ void LLVolumeImplFlexible::onParameterChanged(U16 param_type, LLNetworkData *dat
}
}
-void LLVolumeImplFlexible::onShift(const LLVector3 &shift_vector)
+void LLVolumeImplFlexible::onShift(const LLVector4a &shift_vector)
{
+ //VECTORIZE THIS
+ LLVector3 shift(shift_vector.getF32ptr());
for (int section = 0; section < (1<<FLEXIBLE_OBJECT_MAX_SECTIONS)+1; ++section)
{
- mSection[section].mPosition += shift_vector;
+ mSection[section].mPosition += shift;
}
}
@@ -314,11 +316,13 @@ BOOL LLVolumeImplFlexible::doIdleUpdate(LLAgent &agent, LLWorld &world, const F6
return FALSE; // (we are not initialized or updated)
}
- if (force_update)
+ bool visible = mVO->mDrawable->isVisible();
+
+ if (force_update && visible)
{
gPipeline.markRebuild(mVO->mDrawable, LLDrawable::REBUILD_POSITION, FALSE);
}
- else if (mVO->mDrawable->isVisible() &&
+ else if (visible &&
!mVO->mDrawable->isState(LLDrawable::IN_REBUILD_Q1) &&
mVO->getPixelArea() > 256.f)
{
@@ -362,7 +366,7 @@ void LLVolumeImplFlexible::doFlexibleUpdate()
LLFastTimer ftm(FTM_DO_FLEXIBLE_UPDATE);
LLVolume* volume = mVO->getVolume();
LLPath *path = &volume->getPath();
- if (mSimulateRes == 0)
+ if ((mSimulateRes == 0 || !mInitialized) && mVO->mDrawable->isVisible())
{
mVO->markForUpdate(TRUE);
if (!doIdleUpdate(gAgent, *LLWorld::getInstance(), 0.0))
@@ -371,7 +375,11 @@ void LLVolumeImplFlexible::doFlexibleUpdate()
}
}
- llassert_always(mInitialized);
+ if(!mInitialized)
+ {
+ //the object is not visible
+ return ;
+ }
S32 num_sections = 1 << mSimulateRes;
@@ -690,6 +698,8 @@ BOOL LLVolumeImplFlexible::doUpdateGeometry(LLDrawable *drawable)
}
volume->updateRelativeXform();
+
+ if (mRenderRes > -1)
{
LLFastTimer t(FTM_DO_FLEXIBLE_UPDATE);
doFlexibleUpdate();
diff --git a/indra/newview/llflexibleobject.h b/indra/newview/llflexibleobject.h
index 9b952f1985..fef43d464d 100644
--- a/indra/newview/llflexibleobject.h
+++ b/indra/newview/llflexibleobject.h
@@ -84,7 +84,7 @@ class LLVolumeImplFlexible : public LLVolumeInterface
void onSetVolume(const LLVolumeParams &volume_params, const S32 detail);
void onSetScale(const LLVector3 &scale, BOOL damped);
void onParameterChanged(U16 param_type, LLNetworkData *data, BOOL in_use, bool local_origin);
- void onShift(const LLVector3 &shift_vector);
+ void onShift(const LLVector4a &shift_vector);
bool isVolumeUnique() const { return true; }
bool isVolumeGlobal() const { return true; }
bool isActive() const { return true; }
diff --git a/indra/newview/llfloaterabout.cpp b/indra/newview/llfloaterabout.cpp
index 8ae3ccbae3..83fb887d81 100644
--- a/indra/newview/llfloaterabout.cpp
+++ b/indra/newview/llfloaterabout.cpp
@@ -26,6 +26,8 @@
*/
#include "llviewerprecompiledheaders.h"
+#include <iostream>
+#include <fstream>
#include "llfloaterabout.h"
@@ -68,6 +70,22 @@ extern U32 gPacketsIn;
static std::string get_viewer_release_notes_url();
+///----------------------------------------------------------------------------
+/// Class LLServerReleaseNotesURLFetcher
+///----------------------------------------------------------------------------
+class LLServerReleaseNotesURLFetcher : public LLHTTPClient::Responder
+{
+ LOG_CLASS(LLServerReleaseNotesURLFetcher);
+public:
+
+ static void startFetch();
+ /*virtual*/ void completedHeader(U32 status, const std::string& reason, const LLSD& content);
+ /*virtual*/ void completedRaw(
+ U32 status,
+ const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer);
+};
///----------------------------------------------------------------------------
/// Class LLFloaterAbout
@@ -87,6 +105,11 @@ public:
/// separated so that we can programmatically access the same info.
static LLSD getInfo();
void onClickCopyToClipboard();
+
+ void updateServerReleaseNotesURL(const std::string& url);
+
+private:
+ void setSupportText(const std::string& server_release_notes_url);
};
@@ -108,90 +131,88 @@ BOOL LLFloaterAbout::postBuild()
LLViewerTextEditor *support_widget =
getChild<LLViewerTextEditor>("support_editor", true);
- LLViewerTextEditor *credits_widget =
- getChild<LLViewerTextEditor>("credits_editor", true);
+ LLViewerTextEditor *linden_names_widget =
+ getChild<LLViewerTextEditor>("linden_names", true);
+
+ LLViewerTextEditor *contrib_names_widget =
+ getChild<LLViewerTextEditor>("contrib_names", true);
+
+ LLViewerTextEditor *trans_names_widget =
+ getChild<LLViewerTextEditor>("trans_names", true);
getChild<LLUICtrl>("copy_btn")->setCommitCallback(
boost::bind(&LLFloaterAbout::onClickCopyToClipboard, this));
-#if LL_WINDOWS
- getWindow()->incBusyCount();
- getWindow()->setCursor(UI_CURSOR_ARROW);
-#endif
- LLSD info(getInfo());
-#if LL_WINDOWS
- getWindow()->decBusyCount();
- getWindow()->setCursor(UI_CURSOR_ARROW);
-#endif
-
- std::ostringstream support;
+ if (gAgent.getRegion())
+ {
+ // start fetching server release notes URL
+ setSupportText(LLTrans::getString("RetrievingData"));
+ LLServerReleaseNotesURLFetcher::startFetch();
+ }
+ else // not logged in
+ {
+ setSupportText(LLStringUtil::null);
+ }
- // Render the LLSD from getInfo() as a format_map_t
- LLStringUtil::format_map_t args;
+ support_widget->blockUndo();
- // allow the "Release Notes" URL label to be localized
- args["ReleaseNotes"] = LLTrans::getString("ReleaseNotes");
+ // Fix views
+ support_widget->setEnabled(FALSE);
+ support_widget->startOfDoc();
- for (LLSD::map_const_iterator ii(info.beginMap()), iend(info.endMap());
- ii != iend; ++ii)
+ // Get the names of Lindens, added by viewer_manifest.py at build time
+ std::string lindens_path = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"lindens.txt");
+ llifstream linden_file;
+ std::string lindens;
+ linden_file.open(lindens_path); /* Flawfinder: ignore */
+ if (linden_file.is_open())
{
- if (! ii->second.isArray())
- {
- // Scalar value
- if (ii->second.isUndefined())
- {
- args[ii->first] = getString("none");
- }
- else
- {
- // don't forget to render value asString()
- args[ii->first] = ii->second.asString();
- }
- }
- else
- {
- // array value: build KEY_0, KEY_1 etc. entries
- for (LLSD::Integer n(0), size(ii->second.size()); n < size; ++n)
- {
- args[STRINGIZE(ii->first << '_' << n)] = ii->second[n].asString();
- }
- }
+ std::getline(linden_file, lindens); // all names are on a single line
+ linden_file.close();
+ linden_names_widget->setText(lindens);
}
-
- // Now build the various pieces
- support << getString("AboutHeader", args);
- if (info.has("REGION"))
+ else
{
- support << "\n\n" << getString("AboutPosition", args);
+ LL_INFOS("AboutInit") << "Could not read lindens file at " << lindens_path << LL_ENDL;
}
- support << "\n\n" << getString("AboutSystem", args);
- support << "\n";
- if (info.has("GRAPHICS_DRIVER_VERSION"))
+ linden_names_widget->setEnabled(FALSE);
+ linden_names_widget->startOfDoc();
+
+ // Get the names of contributors, extracted from .../doc/contributions.txt by viewer_manifest.py at build time
+ std::string contributors_path = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"contributors.txt");
+ llifstream contrib_file;
+ std::string contributors;
+ contrib_file.open(contributors_path); /* Flawfinder: ignore */
+ if (contrib_file.is_open())
{
- support << "\n" << getString("AboutDriver", args);
+ std::getline(contrib_file, contributors); // all names are on a single line
+ contrib_file.close();
}
- support << "\n" << getString("AboutLibs", args);
- if (info.has("COMPILER"))
+ else
{
- support << "\n" << getString("AboutCompiler", args);
+ LL_WARNS("AboutInit") << "Could not read contributors file at " << contributors_path << LL_ENDL;
}
- if (info.has("PACKETS_IN"))
+ contrib_names_widget->setText(contributors);
+ contrib_names_widget->setEnabled(FALSE);
+ contrib_names_widget->startOfDoc();
+
+ // Get the names of translators, extracted from .../doc/tranlations.txt by viewer_manifest.py at build time
+ std::string translators_path = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"translators.txt");
+ llifstream trans_file;
+ std::string translators;
+ trans_file.open(translators_path); /* Flawfinder: ignore */
+ if (trans_file.is_open())
{
- support << '\n' << getString("AboutTraffic", args);
+ std::getline(trans_file, translators); // all names are on a single line
+ trans_file.close();
}
-
- support_widget->appendText(support.str(),
- FALSE,
- LLStyle::Params()
- .color(LLUIColorTable::instance().getColor("TextFgReadOnlyColor")));
- support_widget->blockUndo();
-
- // Fix views
- support_widget->setEnabled(FALSE);
- support_widget->startOfDoc();
-
- credits_widget->setEnabled(FALSE);
- credits_widget->startOfDoc();
+ else
+ {
+ LL_WARNS("AboutInit") << "Could not read translators file at " << translators_path << LL_ENDL;
+ }
+ trans_names_widget->setText(translators);
+ trans_names_widget->setEnabled(FALSE);
+ trans_names_widget->startOfDoc();
return TRUE;
}
@@ -235,7 +256,6 @@ LLSD LLFloaterAbout::getInfo()
info["HOSTNAME"] = gAgent.getRegion()->getHost().getHostName();
info["HOSTIP"] = gAgent.getRegion()->getHost().getString();
info["SERVER_VERSION"] = gLastVersionChannel;
- info["SERVER_RELEASE_NOTES_URL"] = LLWeb::escapeURL(region->getCapability("ServerReleaseNotes"));
}
// CPU
@@ -272,7 +292,7 @@ LLSD LLFloaterAbout::getInfo()
}
// TODO: Implement media plugin version query
- info["QT_WEBKIT_VERSION"] = "4.6 (version number hard-coded)";
+ info["QT_WEBKIT_VERSION"] = "4.7.1 (version number hard-coded)";
if (gPacketsIn > 0)
{
@@ -330,6 +350,98 @@ void LLFloaterAbout::onClickCopyToClipboard()
support_widget->deselect();
}
+void LLFloaterAbout::updateServerReleaseNotesURL(const std::string& url)
+{
+ setSupportText(url);
+}
+
+void LLFloaterAbout::setSupportText(const std::string& server_release_notes_url)
+{
+#if LL_WINDOWS
+ getWindow()->incBusyCount();
+ getWindow()->setCursor(UI_CURSOR_ARROW);
+#endif
+ LLSD info(getInfo());
+#if LL_WINDOWS
+ getWindow()->decBusyCount();
+ getWindow()->setCursor(UI_CURSOR_ARROW);
+#endif
+
+ if (LLStringUtil::startsWith(server_release_notes_url, "http")) // it's an URL
+ {
+ info["SERVER_RELEASE_NOTES_URL"] = "[" + LLWeb::escapeURL(server_release_notes_url) + " " + LLTrans::getString("ReleaseNotes") + "]";
+ }
+ else
+ {
+ info["SERVER_RELEASE_NOTES_URL"] = server_release_notes_url;
+ }
+
+ LLViewerTextEditor *support_widget =
+ getChild<LLViewerTextEditor>("support_editor", true);
+
+ std::ostringstream support;
+
+ // Render the LLSD from getInfo() as a format_map_t
+ LLStringUtil::format_map_t args;
+
+ // allow the "Release Notes" URL label to be localized
+ args["ReleaseNotes"] = LLTrans::getString("ReleaseNotes");
+
+ for (LLSD::map_const_iterator ii(info.beginMap()), iend(info.endMap());
+ ii != iend; ++ii)
+ {
+ if (! ii->second.isArray())
+ {
+ // Scalar value
+ if (ii->second.isUndefined())
+ {
+ args[ii->first] = getString("none");
+ }
+ else
+ {
+ // don't forget to render value asString()
+ args[ii->first] = ii->second.asString();
+ }
+ }
+ else
+ {
+ // array value: build KEY_0, KEY_1 etc. entries
+ for (LLSD::Integer n(0), size(ii->second.size()); n < size; ++n)
+ {
+ args[STRINGIZE(ii->first << '_' << n)] = ii->second[n].asString();
+ }
+ }
+ }
+
+ // Now build the various pieces
+ support << getString("AboutHeader", args);
+ if (info.has("REGION"))
+ {
+ support << "\n\n" << getString("AboutPosition", args);
+ }
+ support << "\n\n" << getString("AboutSystem", args);
+ support << "\n";
+ if (info.has("GRAPHICS_DRIVER_VERSION"))
+ {
+ support << "\n" << getString("AboutDriver", args);
+ }
+ support << "\n" << getString("AboutLibs", args);
+ if (info.has("COMPILER"))
+ {
+ support << "\n" << getString("AboutCompiler", args);
+ }
+ if (info.has("PACKETS_IN"))
+ {
+ support << '\n' << getString("AboutTraffic", args);
+ }
+
+ support_widget->clear();
+ support_widget->appendText(support.str(),
+ FALSE,
+ LLStyle::Params()
+ .color(LLUIColorTable::instance().getColor("TextFgReadOnlyColor")));
+}
+
///----------------------------------------------------------------------------
/// LLFloaterAboutUtil
///----------------------------------------------------------------------------
@@ -339,3 +451,52 @@ void LLFloaterAboutUtil::registerFloater()
&LLFloaterReg::build<LLFloaterAbout>);
}
+
+///----------------------------------------------------------------------------
+/// Class LLServerReleaseNotesURLFetcher implementation
+///----------------------------------------------------------------------------
+// static
+void LLServerReleaseNotesURLFetcher::startFetch()
+{
+ LLViewerRegion* region = gAgent.getRegion();
+ if (!region) return;
+
+ // We cannot display the URL returned by the ServerReleaseNotes capability
+ // because opening it in an external browser will trigger a warning about untrusted
+ // SSL certificate.
+ // So we query the URL ourselves, expecting to find
+ // an URL suitable for external browsers in the "Location:" HTTP header.
+ std::string cap_url = region->getCapability("ServerReleaseNotes");
+ LLHTTPClient::get(cap_url, new LLServerReleaseNotesURLFetcher);
+}
+
+// virtual
+void LLServerReleaseNotesURLFetcher::completedHeader(U32 status, const std::string& reason, const LLSD& content)
+{
+ lldebugs << "Status: " << status << llendl;
+ lldebugs << "Reason: " << reason << llendl;
+ lldebugs << "Headers: " << content << llendl;
+
+ LLFloaterAbout* floater_about = LLFloaterReg::getTypedInstance<LLFloaterAbout>("sl_about");
+ if (floater_about)
+ {
+ std::string location = content["location"].asString();
+ if (location.empty())
+ {
+ location = floater_about->getString("ErrorFetchingServerReleaseNotesURL");
+ }
+ floater_about->updateServerReleaseNotesURL(location);
+ }
+}
+
+// virtual
+void LLServerReleaseNotesURLFetcher::completedRaw(
+ U32 status,
+ const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer)
+{
+ // Do nothing.
+ // We're overriding just because the base implementation tries to
+ // deserialize LLSD which triggers warnings.
+}
diff --git a/indra/newview/llfloateranimpreview.cpp b/indra/newview/llfloateranimpreview.cpp
deleted file mode 100644
index deebd69ec1..0000000000
--- a/indra/newview/llfloateranimpreview.cpp
+++ /dev/null
@@ -1,1169 +0,0 @@
-/**
- * @file llfloateranimpreview.cpp
- * @brief LLFloaterAnimPreview class implementation
- *
- * $LicenseInfo:firstyear=2004&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llfloateranimpreview.h"
-
-#include "llbvhloader.h"
-#include "lldatapacker.h"
-#include "lldir.h"
-#include "lleconomy.h"
-#include "llnotificationsutil.h"
-#include "llvfile.h"
-#include "llapr.h"
-#include "llstring.h"
-
-#include "llagent.h"
-#include "llanimationstates.h"
-#include "llbbox.h"
-#include "llbutton.h"
-#include "llcheckboxctrl.h"
-#include "llcombobox.h"
-#include "lldrawable.h"
-#include "lldrawpoolavatar.h"
-#include "llrender.h"
-#include "llface.h"
-#include "llfocusmgr.h"
-#include "llkeyframemotion.h"
-#include "lllineeditor.h"
-#include "llfloaterperms.h"
-#include "llsliderctrl.h"
-#include "llspinctrl.h"
-#include "lltextbox.h"
-#include "lltoolmgr.h"
-#include "llui.h"
-#include "llviewercamera.h"
-#include "llviewerobjectlist.h"
-#include "llviewerwindow.h"
-#include "llviewermenufile.h" // upload_new_resource()
-#include "llvoavatar.h"
-#include "pipeline.h"
-#include "lluictrlfactory.h"
-#include "lltrans.h"
-
-const S32 PREVIEW_BORDER_WIDTH = 2;
-const S32 PREVIEW_RESIZE_HANDLE_SIZE = S32(RESIZE_HANDLE_WIDTH * OO_SQRT2) + PREVIEW_BORDER_WIDTH;
-const S32 PREVIEW_HPAD = PREVIEW_RESIZE_HANDLE_SIZE;
-const S32 PREF_BUTTON_HEIGHT = 16;
-const S32 PREVIEW_TEXTURE_HEIGHT = 300;
-
-const F32 PREVIEW_CAMERA_DISTANCE = 4.f;
-
-const F32 MIN_CAMERA_ZOOM = 0.5f;
-const F32 MAX_CAMERA_ZOOM = 10.f;
-
-const F32 BASE_ANIM_TIME_OFFSET = 5.f;
-
-std::string STATUS[] =
-{
- "E_ST_OK",
- "E_ST_EOF",
- "E_ST_NO_CONSTRAINT",
- "E_ST_NO_FILE",
- "E_ST_NO_HIER",
- "E_ST_NO_JOINT",
- "E_ST_NO_NAME",
- "E_ST_NO_OFFSET",
- "E_ST_NO_CHANNELS",
- "E_ST_NO_ROTATION",
- "E_ST_NO_AXIS",
- "E_ST_NO_MOTION",
- "E_ST_NO_FRAMES",
- "E_ST_NO_FRAME_TIME",
- "E_ST_NO_POS",
- "E_ST_NO_ROT",
- "E_ST_NO_XLT_FILE",
- "E_ST_NO_XLT_HEADER",
- "E_ST_NO_XLT_NAME",
- "E_ST_NO_XLT_IGNORE",
- "E_ST_NO_XLT_RELATIVE",
- "E_ST_NO_XLT_OUTNAME",
- "E_ST_NO_XLT_MATRIX",
- "E_ST_NO_XLT_MERGECHILD",
- "E_ST_NO_XLT_MERGEPARENT",
- "E_ST_NO_XLT_PRIORITY",
- "E_ST_NO_XLT_LOOP",
- "E_ST_NO_XLT_EASEIN",
- "E_ST_NO_XLT_EASEOUT",
- "E_ST_NO_XLT_HAND",
- "E_ST_NO_XLT_EMOTE",
-"E_ST_BAD_ROOT"
-};
-
-//-----------------------------------------------------------------------------
-// LLFloaterAnimPreview()
-//-----------------------------------------------------------------------------
-LLFloaterAnimPreview::LLFloaterAnimPreview(const std::string& filename) :
- LLFloaterNameDesc(filename)
-{
- mLastMouseX = 0;
- mLastMouseY = 0;
-
- mIDList["Standing"] = ANIM_AGENT_STAND;
- mIDList["Walking"] = ANIM_AGENT_FEMALE_WALK;
- mIDList["Sitting"] = ANIM_AGENT_SIT_FEMALE;
- mIDList["Flying"] = ANIM_AGENT_HOVER;
-
- mIDList["[None]"] = LLUUID::null;
- mIDList["Aaaaah"] = ANIM_AGENT_EXPRESS_OPEN_MOUTH;
- mIDList["Afraid"] = ANIM_AGENT_EXPRESS_AFRAID;
- mIDList["Angry"] = ANIM_AGENT_EXPRESS_ANGER;
- mIDList["Big Smile"] = ANIM_AGENT_EXPRESS_TOOTHSMILE;
- mIDList["Bored"] = ANIM_AGENT_EXPRESS_BORED;
- mIDList["Cry"] = ANIM_AGENT_EXPRESS_CRY;
- mIDList["Disdain"] = ANIM_AGENT_EXPRESS_DISDAIN;
- mIDList["Embarrassed"] = ANIM_AGENT_EXPRESS_EMBARRASSED;
- mIDList["Frown"] = ANIM_AGENT_EXPRESS_FROWN;
- mIDList["Kiss"] = ANIM_AGENT_EXPRESS_KISS;
- mIDList["Laugh"] = ANIM_AGENT_EXPRESS_LAUGH;
- mIDList["Plllppt"] = ANIM_AGENT_EXPRESS_TONGUE_OUT;
- mIDList["Repulsed"] = ANIM_AGENT_EXPRESS_REPULSED;
- mIDList["Sad"] = ANIM_AGENT_EXPRESS_SAD;
- mIDList["Shrug"] = ANIM_AGENT_EXPRESS_SHRUG;
- mIDList["Smile"] = ANIM_AGENT_EXPRESS_SMILE;
- mIDList["Surprise"] = ANIM_AGENT_EXPRESS_SURPRISE;
- mIDList["Wink"] = ANIM_AGENT_EXPRESS_WINK;
- mIDList["Worry"] = ANIM_AGENT_EXPRESS_WORRY;
-}
-
-//-----------------------------------------------------------------------------
-// setAnimCallbacks()
-//-----------------------------------------------------------------------------
-void LLFloaterAnimPreview::setAnimCallbacks()
-{
- getChild<LLUICtrl>("playback_slider")->setCommitCallback(boost::bind(&LLFloaterAnimPreview::onSliderMove, this));
-
- getChild<LLUICtrl>("preview_base_anim")->setCommitCallback(boost::bind(&LLFloaterAnimPreview::onCommitBaseAnim, this));
- getChild<LLUICtrl>("preview_base_anim")->setValue("Standing");
-
- getChild<LLUICtrl>("priority")->setCommitCallback(boost::bind(&LLFloaterAnimPreview::onCommitPriority, this));
- getChild<LLUICtrl>("loop_check")->setCommitCallback(boost::bind(&LLFloaterAnimPreview::onCommitLoop, this));
- getChild<LLUICtrl>("loop_in_point")->setCommitCallback(boost::bind(&LLFloaterAnimPreview::onCommitLoopIn, this));
- getChild<LLUICtrl>("loop_in_point")->setValidateBeforeCommit( boost::bind(&LLFloaterAnimPreview::validateLoopIn, this, _1));
- getChild<LLUICtrl>("loop_out_point")->setCommitCallback(boost::bind(&LLFloaterAnimPreview::onCommitLoopOut, this));
- getChild<LLUICtrl>("loop_out_point")->setValidateBeforeCommit( boost::bind(&LLFloaterAnimPreview::validateLoopOut, this, _1));
-
- getChild<LLUICtrl>("hand_pose_combo")->setCommitCallback(boost::bind(&LLFloaterAnimPreview::onCommitHandPose, this));
-
- getChild<LLUICtrl>("emote_combo")->setCommitCallback(boost::bind(&LLFloaterAnimPreview::onCommitEmote, this));
- getChild<LLUICtrl>("emote_combo")->setValue("[None]");
-
- getChild<LLUICtrl>("ease_in_time")->setCommitCallback(boost::bind(&LLFloaterAnimPreview::onCommitEaseIn, this));
- getChild<LLUICtrl>("ease_in_time")->setValidateBeforeCommit( boost::bind(&LLFloaterAnimPreview::validateEaseIn, this, _1));
- getChild<LLUICtrl>("ease_out_time")->setCommitCallback(boost::bind(&LLFloaterAnimPreview::onCommitEaseOut, this));
- getChild<LLUICtrl>("ease_out_time")->setValidateBeforeCommit( boost::bind(&LLFloaterAnimPreview::validateEaseOut, this, _1));
-}
-
-//-----------------------------------------------------------------------------
-// postBuild()
-//-----------------------------------------------------------------------------
-BOOL LLFloaterAnimPreview::postBuild()
-{
- LLKeyframeMotion* motionp = NULL;
- LLBVHLoader* loaderp = NULL;
-
- if (!LLFloaterNameDesc::postBuild())
- {
- return FALSE;
- }
-
- getChild<LLUICtrl>("name_form")->setCommitCallback(boost::bind(&LLFloaterAnimPreview::onCommitName, this));
-
- childSetAction("ok_btn", onBtnOK, this);
- setDefaultBtn();
-
- mPreviewRect.set(PREVIEW_HPAD,
- PREVIEW_TEXTURE_HEIGHT,
- getRect().getWidth() - PREVIEW_HPAD,
- PREVIEW_HPAD + PREF_BUTTON_HEIGHT + PREVIEW_HPAD);
- mPreviewImageRect.set(0.f, 1.f, 1.f, 0.f);
-
- mPlayButton = getChild<LLButton>( "play_btn");
- mPlayButton->setClickedCallback(boost::bind(&LLFloaterAnimPreview::onBtnPlay, this));
- mPlayButton->setVisible(true);
-
- mPauseButton = getChild<LLButton>( "pause_btn");
- mPauseButton->setClickedCallback(boost::bind(&LLFloaterAnimPreview::onBtnPause, this));
- mPauseButton->setVisible(false);
-
- mStopButton = getChild<LLButton>( "stop_btn");
- mStopButton->setClickedCallback(boost::bind(&LLFloaterAnimPreview::onBtnStop, this));
-
- getChildView("bad_animation_text")->setVisible(FALSE);
-
- std::string exten = gDirUtilp->getExtension(mFilename);
- if (exten == "bvh")
- {
- // loading a bvh file
-
- // now load bvh file
- S32 file_size;
-
- LLAPRFile infile ;
- infile.open(mFilenameAndPath, LL_APR_RB, NULL, &file_size);
-
- if (!infile.getFileHandle())
- {
- llwarns << "Can't open BVH file:" << mFilename << llendl;
- }
- else
- {
- char* file_buffer;
-
- file_buffer = new char[file_size + 1];
-
- if (file_size == infile.read(file_buffer, file_size))
- {
- file_buffer[file_size] = '\0';
- llinfos << "Loading BVH file " << mFilename << llendl;
- ELoadStatus load_status = E_ST_OK;
- S32 line_number = 0;
- loaderp = new LLBVHLoader(file_buffer, load_status, line_number);
- std::string status = getString(STATUS[load_status]);
-
- if(load_status == E_ST_NO_XLT_FILE)
- {
- llwarns << "NOTE: No translation table found." << llendl;
- }
- else
- {
- llwarns << "ERROR: [line: " << line_number << "] " << status << llendl;
- }
- }
-
- infile.close() ;
- delete[] file_buffer;
- }
- }
-
- if (loaderp && loaderp->isInitialized() && loaderp->getDuration() <= MAX_ANIM_DURATION)
- {
- // generate unique id for this motion
- mTransactionID.generate();
- mMotionID = mTransactionID.makeAssetID(gAgent.getSecureSessionID());
-
- mAnimPreview = new LLPreviewAnimation(256, 256);
-
- // motion will be returned, but it will be in a load-pending state, as this is a new motion
- // this motion will not request an asset transfer until next update, so we have a chance to
- // load the keyframe data locally
- motionp = (LLKeyframeMotion*)mAnimPreview->getDummyAvatar()->createMotion(mMotionID);
-
- // create data buffer for keyframe initialization
- S32 buffer_size = loaderp->getOutputSize();
- U8* buffer = new U8[buffer_size];
-
- LLDataPackerBinaryBuffer dp(buffer, buffer_size);
-
- // pass animation data through memory buffer
- loaderp->serialize(dp);
- dp.reset();
- BOOL success = motionp && motionp->deserialize(dp);
-
- delete []buffer;
-
- if (success)
- {
- setAnimCallbacks() ;
-
- const LLBBoxLocal &pelvis_bbox = motionp->getPelvisBBox();
-
- LLVector3 temp = pelvis_bbox.getCenter();
- // only consider XY?
- //temp.mV[VZ] = 0.f;
- F32 pelvis_offset = temp.magVec();
-
- temp = pelvis_bbox.getExtent();
- //temp.mV[VZ] = 0.f;
- F32 pelvis_max_displacement = pelvis_offset + (temp.magVec() * 0.5f) + 1.f;
-
- F32 camera_zoom = LLViewerCamera::getInstance()->getDefaultFOV() / (2.f * atan(pelvis_max_displacement / PREVIEW_CAMERA_DISTANCE));
-
- mAnimPreview->setZoom(camera_zoom);
-
- motionp->setName(getChild<LLUICtrl>("name_form")->getValue().asString());
- mAnimPreview->getDummyAvatar()->startMotion(mMotionID);
-
- getChild<LLSlider>("playback_slider")->setMinValue(0.0);
- getChild<LLSlider>("playback_slider")->setMaxValue(1.0);
-
- getChild<LLUICtrl>("loop_check")->setValue(LLSD(motionp->getLoop()));
- getChild<LLUICtrl>("loop_in_point")->setValue(LLSD(motionp->getLoopIn() / motionp->getDuration() * 100.f));
- getChild<LLUICtrl>("loop_out_point")->setValue(LLSD(motionp->getLoopOut() / motionp->getDuration() * 100.f));
- getChild<LLUICtrl>("priority")->setValue(LLSD((F32)motionp->getPriority()));
- getChild<LLUICtrl>("hand_pose_combo")->setValue(LLHandMotion::getHandPoseName(motionp->getHandPose()));
- getChild<LLUICtrl>("ease_in_time")->setValue(LLSD(motionp->getEaseInDuration()));
- getChild<LLUICtrl>("ease_out_time")->setValue(LLSD(motionp->getEaseOutDuration()));
- setEnabled(TRUE);
- std::string seconds_string;
- seconds_string = llformat(" - %.2f seconds", motionp->getDuration());
-
- setTitle(mFilename + std::string(seconds_string));
- }
- else
- {
- mAnimPreview = NULL;
- mMotionID.setNull();
- getChild<LLUICtrl>("bad_animation_text")->setValue(getString("failed_to_initialize"));
- }
- }
- else
- {
- if ( loaderp )
- {
- if (loaderp->getDuration() > MAX_ANIM_DURATION)
- {
- LLUIString out_str = getString("anim_too_long");
- out_str.setArg("[LENGTH]", llformat("%.1f", loaderp->getDuration()));
- out_str.setArg("[MAX_LENGTH]", llformat("%.1f", MAX_ANIM_DURATION));
- getChild<LLUICtrl>("bad_animation_text")->setValue(out_str.getString());
- }
- else
- {
- LLUIString out_str = getString("failed_file_read");
- out_str.setArg("[STATUS]", getString(STATUS[loaderp->getStatus()]));
- getChild<LLUICtrl>("bad_animation_text")->setValue(out_str.getString());
- }
- }
-
- //setEnabled(FALSE);
- mMotionID.setNull();
- mAnimPreview = NULL;
- }
-
- refresh();
-
- delete loaderp;
-
- return TRUE;
-}
-
-//-----------------------------------------------------------------------------
-// LLFloaterAnimPreview()
-//-----------------------------------------------------------------------------
-LLFloaterAnimPreview::~LLFloaterAnimPreview()
-{
- mAnimPreview = NULL;
-
- setEnabled(FALSE);
-}
-
-//-----------------------------------------------------------------------------
-// draw()
-//-----------------------------------------------------------------------------
-void LLFloaterAnimPreview::draw()
-{
- LLFloater::draw();
- LLRect r = getRect();
-
- refresh();
-
- if (mMotionID.notNull() && mAnimPreview)
- {
- gGL.color3f(1.f, 1.f, 1.f);
-
- gGL.getTexUnit(0)->bind(mAnimPreview);
-
- gGL.begin( LLRender::QUADS );
- {
- gGL.texCoord2f(0.f, 1.f);
- gGL.vertex2i(PREVIEW_HPAD, PREVIEW_TEXTURE_HEIGHT);
- gGL.texCoord2f(0.f, 0.f);
- gGL.vertex2i(PREVIEW_HPAD, PREVIEW_HPAD + PREF_BUTTON_HEIGHT + PREVIEW_HPAD);
- gGL.texCoord2f(1.f, 0.f);
- gGL.vertex2i(r.getWidth() - PREVIEW_HPAD, PREVIEW_HPAD + PREF_BUTTON_HEIGHT + PREVIEW_HPAD);
- gGL.texCoord2f(1.f, 1.f);
- gGL.vertex2i(r.getWidth() - PREVIEW_HPAD, PREVIEW_TEXTURE_HEIGHT);
- }
- gGL.end();
-
- gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
-
- LLVOAvatar* avatarp = mAnimPreview->getDummyAvatar();
- if (!avatarp->areAnimationsPaused())
- {
- mAnimPreview->requestUpdate();
- }
- }
-}
-
-//-----------------------------------------------------------------------------
-// resetMotion()
-//-----------------------------------------------------------------------------
-void LLFloaterAnimPreview::resetMotion()
-{
- LLVOAvatar* avatarp = mAnimPreview->getDummyAvatar();
- BOOL paused = avatarp->areAnimationsPaused();
-
- // *TODO: Fix awful casting hack
- LLKeyframeMotion* motionp = (LLKeyframeMotion*)avatarp->findMotion(mMotionID);
-
- // Set emotion
- std::string emote = getChild<LLUICtrl>("emote_combo")->getValue().asString();
- motionp->setEmote(mIDList[emote]);
-
- LLUUID base_id = mIDList[getChild<LLUICtrl>("preview_base_anim")->getValue().asString()];
- avatarp->deactivateAllMotions();
- avatarp->startMotion(mMotionID, 0.0f);
- avatarp->startMotion(base_id, BASE_ANIM_TIME_OFFSET);
- getChild<LLUICtrl>("playback_slider")->setValue(0.0f);
-
- // Set pose
- std::string handpose = getChild<LLUICtrl>("hand_pose_combo")->getValue().asString();
- avatarp->startMotion( ANIM_AGENT_HAND_MOTION, 0.0f );
- motionp->setHandPose(LLHandMotion::getHandPose(handpose));
-
- if (paused)
- {
- mPauseRequest = avatarp->requestPause();
- }
- else
- {
- mPauseRequest = NULL;
- }
-}
-
-//-----------------------------------------------------------------------------
-// handleMouseDown()
-//-----------------------------------------------------------------------------
-BOOL LLFloaterAnimPreview::handleMouseDown(S32 x, S32 y, MASK mask)
-{
- if (mPreviewRect.pointInRect(x, y))
- {
- bringToFront( x, y );
- gFocusMgr.setMouseCapture(this);
- gViewerWindow->hideCursor();
- mLastMouseX = x;
- mLastMouseY = y;
- return TRUE;
- }
-
- return LLFloater::handleMouseDown(x, y, mask);
-}
-
-//-----------------------------------------------------------------------------
-// handleMouseUp()
-//-----------------------------------------------------------------------------
-BOOL LLFloaterAnimPreview::handleMouseUp(S32 x, S32 y, MASK mask)
-{
- gFocusMgr.setMouseCapture(FALSE);
- gViewerWindow->showCursor();
- return LLFloater::handleMouseUp(x, y, mask);
-}
-
-//-----------------------------------------------------------------------------
-// handleHover()
-//-----------------------------------------------------------------------------
-BOOL LLFloaterAnimPreview::handleHover(S32 x, S32 y, MASK mask)
-{
- MASK local_mask = mask & ~MASK_ALT;
-
- if (mAnimPreview && hasMouseCapture())
- {
- if (local_mask == MASK_PAN)
- {
- // pan here
- mAnimPreview->pan((F32)(x - mLastMouseX) * -0.005f, (F32)(y - mLastMouseY) * -0.005f);
- }
- else if (local_mask == MASK_ORBIT)
- {
- F32 yaw_radians = (F32)(x - mLastMouseX) * -0.01f;
- F32 pitch_radians = (F32)(y - mLastMouseY) * 0.02f;
-
- mAnimPreview->rotate(yaw_radians, pitch_radians);
- }
- else
- {
- F32 yaw_radians = (F32)(x - mLastMouseX) * -0.01f;
- F32 zoom_amt = (F32)(y - mLastMouseY) * 0.02f;
-
- mAnimPreview->rotate(yaw_radians, 0.f);
- mAnimPreview->zoom(zoom_amt);
- }
-
- mAnimPreview->requestUpdate();
-
- LLUI::setMousePositionLocal(this, mLastMouseX, mLastMouseY);
- }
-
- if (!mPreviewRect.pointInRect(x, y) || !mAnimPreview)
- {
- return LLFloater::handleHover(x, y, mask);
- }
- else if (local_mask == MASK_ORBIT)
- {
- gViewerWindow->setCursor(UI_CURSOR_TOOLCAMERA);
- }
- else if (local_mask == MASK_PAN)
- {
- gViewerWindow->setCursor(UI_CURSOR_TOOLPAN);
- }
- else
- {
- gViewerWindow->setCursor(UI_CURSOR_TOOLZOOMIN);
- }
-
- return TRUE;
-}
-
-//-----------------------------------------------------------------------------
-// handleScrollWheel()
-//-----------------------------------------------------------------------------
-BOOL LLFloaterAnimPreview::handleScrollWheel(S32 x, S32 y, S32 clicks)
-{
- mAnimPreview->zoom((F32)clicks * -0.2f);
- mAnimPreview->requestUpdate();
-
- return TRUE;
-}
-
-//-----------------------------------------------------------------------------
-// onMouseCaptureLost()
-//-----------------------------------------------------------------------------
-void LLFloaterAnimPreview::onMouseCaptureLost()
-{
- gViewerWindow->showCursor();
-}
-
-//-----------------------------------------------------------------------------
-// onBtnPlay()
-//-----------------------------------------------------------------------------
-void LLFloaterAnimPreview::onBtnPlay()
-{
- if (!getEnabled())
- return;
-
- if (mMotionID.notNull() && mAnimPreview)
- {
- LLVOAvatar* avatarp = mAnimPreview->getDummyAvatar();
-
- if (!avatarp->isMotionActive(mMotionID))
- {
- resetMotion();
- mPauseRequest = NULL;
- }
- else if (avatarp->areAnimationsPaused())
- {
- mPauseRequest = NULL;
- }
- }
-}
-
-//-----------------------------------------------------------------------------
-// onBtnPause()
-//-----------------------------------------------------------------------------
-void LLFloaterAnimPreview::onBtnPause()
-{
- if (!getEnabled())
- return;
-
- if (mMotionID.notNull() && mAnimPreview)
- {
- LLVOAvatar* avatarp = mAnimPreview->getDummyAvatar();
-
- if (avatarp->isMotionActive(mMotionID))
- {
- if (!avatarp->areAnimationsPaused())
- {
- mPauseRequest = avatarp->requestPause();
- }
- }
- }
-}
-
-//-----------------------------------------------------------------------------
-// onBtnStop()
-//-----------------------------------------------------------------------------
-void LLFloaterAnimPreview::onBtnStop()
-{
- if (!getEnabled())
- return;
-
- if (mMotionID.notNull() && mAnimPreview)
- {
- LLVOAvatar* avatarp = mAnimPreview->getDummyAvatar();
- resetMotion();
- mPauseRequest = avatarp->requestPause();
- }
-}
-
-//-----------------------------------------------------------------------------
-// onSliderMove()
-//-----------------------------------------------------------------------------
-void LLFloaterAnimPreview::onSliderMove()
-{
- if (!getEnabled())
- return;
-
- if (mAnimPreview)
- {
- LLVOAvatar* avatarp = mAnimPreview->getDummyAvatar();
- F32 slider_value = (F32)getChild<LLUICtrl>("playback_slider")->getValue().asReal();
- LLUUID base_id = mIDList[getChild<LLUICtrl>("preview_base_anim")->getValue().asString()];
- LLMotion* motionp = avatarp->findMotion(mMotionID);
- F32 duration = motionp->getDuration();// + motionp->getEaseOutDuration();
- F32 delta_time = duration * slider_value;
- avatarp->deactivateAllMotions();
- avatarp->startMotion(base_id, delta_time + BASE_ANIM_TIME_OFFSET);
- avatarp->startMotion(mMotionID, delta_time);
- mPauseRequest = avatarp->requestPause();
- refresh();
- }
-
-}
-
-//-----------------------------------------------------------------------------
-// onCommitBaseAnim()
-//-----------------------------------------------------------------------------
-void LLFloaterAnimPreview::onCommitBaseAnim()
-{
- if (!getEnabled())
- return;
-
- if (mAnimPreview)
- {
- LLVOAvatar* avatarp = mAnimPreview->getDummyAvatar();
-
- BOOL paused = avatarp->areAnimationsPaused();
-
- // stop all other possible base motions
- avatarp->stopMotion(mIDList["Standing"], TRUE);
- avatarp->stopMotion(mIDList["Walking"], TRUE);
- avatarp->stopMotion(mIDList["Sitting"], TRUE);
- avatarp->stopMotion(mIDList["Flying"], TRUE);
-
- resetMotion();
-
- if (!paused)
- {
- mPauseRequest = NULL;
- }
- }
-}
-
-//-----------------------------------------------------------------------------
-// onCommitLoop()
-//-----------------------------------------------------------------------------
-void LLFloaterAnimPreview::onCommitLoop()
-{
- if (!getEnabled())
- return;
-
- LLVOAvatar* avatarp = mAnimPreview->getDummyAvatar();
- LLKeyframeMotion* motionp = (LLKeyframeMotion*)avatarp->findMotion(mMotionID);
-
- if (motionp)
- {
- motionp->setLoop(getChild<LLUICtrl>("loop_check")->getValue().asBoolean());
- motionp->setLoopIn((F32)getChild<LLUICtrl>("loop_in_point")->getValue().asReal() * 0.01f * motionp->getDuration());
- motionp->setLoopOut((F32)getChild<LLUICtrl>("loop_out_point")->getValue().asReal() * 0.01f * motionp->getDuration());
- }
-}
-
-//-----------------------------------------------------------------------------
-// onCommitLoopIn()
-//-----------------------------------------------------------------------------
-void LLFloaterAnimPreview::onCommitLoopIn()
-{
- if (!getEnabled())
- return;
-
- LLVOAvatar* avatarp = mAnimPreview->getDummyAvatar();
- LLKeyframeMotion* motionp = (LLKeyframeMotion*)avatarp->findMotion(mMotionID);
-
- if (motionp)
- {
- motionp->setLoopIn((F32)getChild<LLUICtrl>("loop_in_point")->getValue().asReal() / 100.f);
- resetMotion();
- getChild<LLUICtrl>("loop_check")->setValue(LLSD(TRUE));
- onCommitLoop();
- }
-}
-
-//-----------------------------------------------------------------------------
-// onCommitLoopOut()
-//-----------------------------------------------------------------------------
-void LLFloaterAnimPreview::onCommitLoopOut()
-{
- if (!getEnabled())
- return;
-
- LLVOAvatar* avatarp = mAnimPreview->getDummyAvatar();
- LLKeyframeMotion* motionp = (LLKeyframeMotion*)avatarp->findMotion(mMotionID);
-
- if (motionp)
- {
- motionp->setLoopOut((F32)getChild<LLUICtrl>("loop_out_point")->getValue().asReal() * 0.01f * motionp->getDuration());
- resetMotion();
- getChild<LLUICtrl>("loop_check")->setValue(LLSD(TRUE));
- onCommitLoop();
- }
-}
-
-//-----------------------------------------------------------------------------
-// onCommitName()
-//-----------------------------------------------------------------------------
-void LLFloaterAnimPreview::onCommitName()
-{
- if (!getEnabled())
- return;
-
- LLVOAvatar* avatarp = mAnimPreview->getDummyAvatar();
- LLKeyframeMotion* motionp = (LLKeyframeMotion*)avatarp->findMotion(mMotionID);
-
- if (motionp)
- {
- motionp->setName(getChild<LLUICtrl>("name_form")->getValue().asString());
- }
-
- doCommit();
-}
-
-//-----------------------------------------------------------------------------
-// onCommitHandPose()
-//-----------------------------------------------------------------------------
-void LLFloaterAnimPreview::onCommitHandPose()
-{
- if (!getEnabled())
- return;
-
- resetMotion(); // sets hand pose
-}
-
-//-----------------------------------------------------------------------------
-// onCommitEmote()
-//-----------------------------------------------------------------------------
-void LLFloaterAnimPreview::onCommitEmote()
-{
- if (!getEnabled())
- return;
-
- resetMotion(); // ssts emote
-}
-
-//-----------------------------------------------------------------------------
-// onCommitPriority()
-//-----------------------------------------------------------------------------
-void LLFloaterAnimPreview::onCommitPriority()
-{
- if (!getEnabled())
- return;
-
- LLVOAvatar* avatarp = mAnimPreview->getDummyAvatar();
- LLKeyframeMotion* motionp = (LLKeyframeMotion*)avatarp->findMotion(mMotionID);
-
- motionp->setPriority(llfloor((F32)getChild<LLUICtrl>("priority")->getValue().asReal()));
-}
-
-//-----------------------------------------------------------------------------
-// onCommitEaseIn()
-//-----------------------------------------------------------------------------
-void LLFloaterAnimPreview::onCommitEaseIn()
-{
- if (!getEnabled())
- return;
-
- LLVOAvatar* avatarp = mAnimPreview->getDummyAvatar();
- LLKeyframeMotion* motionp = (LLKeyframeMotion*)avatarp->findMotion(mMotionID);
-
- motionp->setEaseIn((F32)getChild<LLUICtrl>("ease_in_time")->getValue().asReal());
- resetMotion();
-}
-
-//-----------------------------------------------------------------------------
-// onCommitEaseOut()
-//-----------------------------------------------------------------------------
-void LLFloaterAnimPreview::onCommitEaseOut()
-{
- if (!getEnabled())
- return;
-
- LLVOAvatar* avatarp = mAnimPreview->getDummyAvatar();
- LLKeyframeMotion* motionp = (LLKeyframeMotion*)avatarp->findMotion(mMotionID);
-
- motionp->setEaseOut((F32)getChild<LLUICtrl>("ease_out_time")->getValue().asReal());
- resetMotion();
-}
-
-//-----------------------------------------------------------------------------
-// validateEaseIn()
-//-----------------------------------------------------------------------------
-bool LLFloaterAnimPreview::validateEaseIn(const LLSD& data)
-{
- if (!getEnabled())
- return false;
-
- LLVOAvatar* avatarp = mAnimPreview->getDummyAvatar();
- LLKeyframeMotion* motionp = (LLKeyframeMotion*)avatarp->findMotion(mMotionID);
-
- if (!motionp->getLoop())
- {
- F32 new_ease_in = llclamp((F32)getChild<LLUICtrl>("ease_in_time")->getValue().asReal(), 0.f, motionp->getDuration() - motionp->getEaseOutDuration());
- getChild<LLUICtrl>("ease_in_time")->setValue(LLSD(new_ease_in));
- }
-
- return true;
-}
-
-//-----------------------------------------------------------------------------
-// validateEaseOut()
-//-----------------------------------------------------------------------------
-bool LLFloaterAnimPreview::validateEaseOut(const LLSD& data)
-{
- if (!getEnabled())
- return false;
-
- LLVOAvatar* avatarp = mAnimPreview->getDummyAvatar();
- LLKeyframeMotion* motionp = (LLKeyframeMotion*)avatarp->findMotion(mMotionID);
-
- if (!motionp->getLoop())
- {
- F32 new_ease_out = llclamp((F32)getChild<LLUICtrl>("ease_out_time")->getValue().asReal(), 0.f, motionp->getDuration() - motionp->getEaseInDuration());
- getChild<LLUICtrl>("ease_out_time")->setValue(LLSD(new_ease_out));
- }
-
- return true;
-}
-
-//-----------------------------------------------------------------------------
-// validateLoopIn()
-//-----------------------------------------------------------------------------
-bool LLFloaterAnimPreview::validateLoopIn(const LLSD& data)
-{
- if (!getEnabled())
- return false;
-
- F32 loop_in_value = (F32)getChild<LLUICtrl>("loop_in_point")->getValue().asReal();
- F32 loop_out_value = (F32)getChild<LLUICtrl>("loop_out_point")->getValue().asReal();
-
- if (loop_in_value < 0.f)
- {
- loop_in_value = 0.f;
- }
- else if (loop_in_value > 100.f)
- {
- loop_in_value = 100.f;
- }
- else if (loop_in_value > loop_out_value)
- {
- loop_in_value = loop_out_value;
- }
-
- getChild<LLUICtrl>("loop_in_point")->setValue(LLSD(loop_in_value));
- return true;
-}
-
-//-----------------------------------------------------------------------------
-// validateLoopOut()
-//-----------------------------------------------------------------------------
-bool LLFloaterAnimPreview::validateLoopOut(const LLSD& data)
-{
- if (!getEnabled())
- return false;
-
- F32 loop_out_value = (F32)getChild<LLUICtrl>("loop_out_point")->getValue().asReal();
- F32 loop_in_value = (F32)getChild<LLUICtrl>("loop_in_point")->getValue().asReal();
-
- if (loop_out_value < 0.f)
- {
- loop_out_value = 0.f;
- }
- else if (loop_out_value > 100.f)
- {
- loop_out_value = 100.f;
- }
- else if (loop_out_value < loop_in_value)
- {
- loop_out_value = loop_in_value;
- }
-
- getChild<LLUICtrl>("loop_out_point")->setValue(LLSD(loop_out_value));
- return true;
-}
-
-
-//-----------------------------------------------------------------------------
-// refresh()
-//-----------------------------------------------------------------------------
-void LLFloaterAnimPreview::refresh()
-{
- // Are we showing the play button (default) or the pause button?
- bool show_play = true;
- if (!mAnimPreview)
- {
- getChildView("bad_animation_text")->setVisible(TRUE);
- // play button visible but disabled
- mPlayButton->setEnabled(FALSE);
- mStopButton->setEnabled(FALSE);
- getChildView("ok_btn")->setEnabled(FALSE);
- }
- else
- {
- getChildView("bad_animation_text")->setVisible(FALSE);
- // re-enabled in case previous animation was bad
- mPlayButton->setEnabled(TRUE);
- mStopButton->setEnabled(TRUE);
- LLVOAvatar* avatarp = mAnimPreview->getDummyAvatar();
- if (avatarp->isMotionActive(mMotionID))
- {
- mStopButton->setEnabled(TRUE);
- LLKeyframeMotion* motionp = (LLKeyframeMotion*)avatarp->findMotion(mMotionID);
- if (!avatarp->areAnimationsPaused())
- {
- // animation is playing
- if (motionp)
- {
- F32 fraction_complete = motionp->getLastUpdateTime() / motionp->getDuration();
- getChild<LLUICtrl>("playback_slider")->setValue(fraction_complete);
- }
- show_play = false;
- }
- }
- else
- {
- // Motion just finished playing
- mPauseRequest = avatarp->requestPause();
- }
- getChildView("ok_btn")->setEnabled(TRUE);
- mAnimPreview->requestUpdate();
- }
- mPlayButton->setVisible(show_play);
- mPauseButton->setVisible(!show_play);
-}
-
-//-----------------------------------------------------------------------------
-// onBtnOK()
-//-----------------------------------------------------------------------------
-void LLFloaterAnimPreview::onBtnOK(void* userdata)
-{
- LLFloaterAnimPreview* floaterp = (LLFloaterAnimPreview*)userdata;
- if (!floaterp->getEnabled()) return;
-
- if (floaterp->mAnimPreview)
- {
- LLKeyframeMotion* motionp = (LLKeyframeMotion*)floaterp->mAnimPreview->getDummyAvatar()->findMotion(floaterp->mMotionID);
-
- S32 file_size = motionp->getFileSize();
- U8* buffer = new U8[file_size];
-
- LLDataPackerBinaryBuffer dp(buffer, file_size);
- if (motionp->serialize(dp))
- {
- LLVFile file(gVFS, motionp->getID(), LLAssetType::AT_ANIMATION, LLVFile::APPEND);
-
- S32 size = dp.getCurrentSize();
- file.setMaxSize(size);
- if (file.write((U8*)buffer, size))
- {
- std::string name = floaterp->getChild<LLUICtrl>("name_form")->getValue().asString();
- std::string desc = floaterp->getChild<LLUICtrl>("description_form")->getValue().asString();
- LLAssetStorage::LLStoreAssetCallback callback = NULL;
- S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload();
- void *userdata = NULL;
- upload_new_resource(floaterp->mTransactionID, // tid
- LLAssetType::AT_ANIMATION,
- name,
- desc,
- 0,
- LLFolderType::FT_NONE,
- LLInventoryType::IT_ANIMATION,
- LLFloaterPerms::getNextOwnerPerms(), LLFloaterPerms::getGroupPerms(), LLFloaterPerms::getEveryonePerms(),
- name,
- callback, expected_upload_cost, userdata);
- }
- else
- {
- llwarns << "Failure writing animation data." << llendl;
- LLNotificationsUtil::add("WriteAnimationFail");
- }
- }
-
- delete [] buffer;
- // clear out cache for motion data
- floaterp->mAnimPreview->getDummyAvatar()->removeMotion(floaterp->mMotionID);
- LLKeyframeDataCache::removeKeyframeData(floaterp->mMotionID);
- }
-
- floaterp->closeFloater(false);
-}
-
-//-----------------------------------------------------------------------------
-// LLPreviewAnimation
-//-----------------------------------------------------------------------------
-LLPreviewAnimation::LLPreviewAnimation(S32 width, S32 height) : LLViewerDynamicTexture(width, height, 3, ORDER_MIDDLE, FALSE)
-{
- mNeedsUpdate = TRUE;
- mCameraDistance = PREVIEW_CAMERA_DISTANCE;
- mCameraYaw = 0.f;
- mCameraPitch = 0.f;
- mCameraZoom = 1.f;
-
- mDummyAvatar = (LLVOAvatar*)gObjectList.createObjectViewer(LL_PCODE_LEGACY_AVATAR, gAgent.getRegion());
- mDummyAvatar->createDrawable(&gPipeline);
- mDummyAvatar->mIsDummy = TRUE;
- mDummyAvatar->mSpecialRenderMode = 1;
- mDummyAvatar->setPositionAgent(LLVector3::zero);
- mDummyAvatar->slamPosition();
- mDummyAvatar->updateJointLODs();
- mDummyAvatar->updateGeometry(mDummyAvatar->mDrawable);
- mDummyAvatar->startMotion(ANIM_AGENT_STAND, BASE_ANIM_TIME_OFFSET);
- mDummyAvatar->hideSkirt();
- gPipeline.markVisible(mDummyAvatar->mDrawable, *LLViewerCamera::getInstance());
-
- // stop extraneous animations
- mDummyAvatar->stopMotion( ANIM_AGENT_HEAD_ROT, TRUE );
- mDummyAvatar->stopMotion( ANIM_AGENT_EYE, TRUE );
- mDummyAvatar->stopMotion( ANIM_AGENT_BODY_NOISE, TRUE );
- mDummyAvatar->stopMotion( ANIM_AGENT_BREATHE_ROT, TRUE );
-}
-
-//-----------------------------------------------------------------------------
-// LLPreviewAnimation()
-//-----------------------------------------------------------------------------
-LLPreviewAnimation::~LLPreviewAnimation()
-{
- mDummyAvatar->markDead();
-}
-
-//virtual
-S8 LLPreviewAnimation::getType() const
-{
- return LLViewerDynamicTexture::LL_PREVIEW_ANIMATION ;
-}
-
-//-----------------------------------------------------------------------------
-// update()
-//-----------------------------------------------------------------------------
-BOOL LLPreviewAnimation::render()
-{
- mNeedsUpdate = FALSE;
- LLVOAvatar* avatarp = mDummyAvatar;
-
- glMatrixMode(GL_PROJECTION);
- gGL.pushMatrix();
- glLoadIdentity();
- glOrtho(0.0f, mFullWidth, 0.0f, mFullHeight, -1.0f, 1.0f);
-
- glMatrixMode(GL_MODELVIEW);
- gGL.pushMatrix();
- glLoadIdentity();
-
- LLGLSUIDefault def;
- gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- gGL.color4f(0.15f, 0.2f, 0.3f, 1.f);
-
- gl_rect_2d_simple( mFullWidth, mFullHeight );
-
- glMatrixMode(GL_PROJECTION);
- gGL.popMatrix();
-
- glMatrixMode(GL_MODELVIEW);
- gGL.popMatrix();
-
- gGL.flush();
-
- LLVector3 target_pos = avatarp->mRoot.getWorldPosition();
-
- LLQuaternion camera_rot = LLQuaternion(mCameraPitch, LLVector3::y_axis) *
- LLQuaternion(mCameraYaw, LLVector3::z_axis);
-
- LLQuaternion av_rot = avatarp->mRoot.getWorldRotation() * camera_rot;
- LLViewerCamera::getInstance()->setOriginAndLookAt(
- target_pos + ((LLVector3(mCameraDistance, 0.f, 0.f) + mCameraOffset) * av_rot), // camera
- LLVector3::z_axis, // up
- target_pos + (mCameraOffset * av_rot) ); // point of interest
-
- LLViewerCamera::getInstance()->setView(LLViewerCamera::getInstance()->getDefaultFOV() / mCameraZoom);
- LLViewerCamera::getInstance()->setPerspective(FALSE, mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight, FALSE);
-
- mCameraRelPos = LLViewerCamera::getInstance()->getOrigin() - avatarp->mHeadp->getWorldPosition();
-
- //avatarp->setAnimationData("LookAtPoint", (void *)&mCameraRelPos);
-
- //SJB: Animation is updated in LLVOAvatar::updateCharacter
-
- if (avatarp->mDrawable.notNull())
- {
- avatarp->updateLOD();
-
- LLVertexBuffer::unbind();
- LLGLDepthTest gls_depth(GL_TRUE);
-
- LLDrawPoolAvatar *avatarPoolp = (LLDrawPoolAvatar *)avatarp->mDrawable->getFace(0)->getPool();
- avatarp->dirtyMesh();
- avatarPoolp->renderAvatars(avatarp); // renders only one avatar
- }
-
- gGL.color4f(1,1,1,1);
- return TRUE;
-}
-
-//-----------------------------------------------------------------------------
-// requestUpdate()
-//-----------------------------------------------------------------------------
-void LLPreviewAnimation::requestUpdate()
-{
- mNeedsUpdate = TRUE;
-}
-
-//-----------------------------------------------------------------------------
-// rotate()
-//-----------------------------------------------------------------------------
-void LLPreviewAnimation::rotate(F32 yaw_radians, F32 pitch_radians)
-{
- mCameraYaw = mCameraYaw + yaw_radians;
-
- mCameraPitch = llclamp(mCameraPitch + pitch_radians, F_PI_BY_TWO * -0.8f, F_PI_BY_TWO * 0.8f);
-}
-
-//-----------------------------------------------------------------------------
-// zoom()
-//-----------------------------------------------------------------------------
-void LLPreviewAnimation::zoom(F32 zoom_delta)
-{
- setZoom(mCameraZoom + zoom_delta);
-}
-
-//-----------------------------------------------------------------------------
-// setZoom()
-//-----------------------------------------------------------------------------
-void LLPreviewAnimation::setZoom(F32 zoom_amt)
-{
- mCameraZoom = llclamp(zoom_amt, MIN_CAMERA_ZOOM, MAX_CAMERA_ZOOM);
-}
-
-//-----------------------------------------------------------------------------
-// pan()
-//-----------------------------------------------------------------------------
-void LLPreviewAnimation::pan(F32 right, F32 up)
-{
- mCameraOffset.mV[VY] = llclamp(mCameraOffset.mV[VY] + right * mCameraDistance / mCameraZoom, -1.f, 1.f);
- mCameraOffset.mV[VZ] = llclamp(mCameraOffset.mV[VZ] + up * mCameraDistance / mCameraZoom, -1.f, 1.f);
-}
-
-
-
diff --git a/indra/newview/llfloateranimpreview.h b/indra/newview/llfloateranimpreview.h
deleted file mode 100644
index f1ffb6547f..0000000000
--- a/indra/newview/llfloateranimpreview.h
+++ /dev/null
@@ -1,131 +0,0 @@
-/**
- * @file llfloateranimpreview.h
- * @brief LLFloaterAnimPreview class definition
- *
- * $LicenseInfo:firstyear=2004&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLFLOATERANIMPREVIEW_H
-#define LL_LLFLOATERANIMPREVIEW_H
-
-#include "llassettype.h"
-#include "llfloaternamedesc.h"
-#include "lldynamictexture.h"
-#include "llcharacter.h"
-#include "llquaternion.h"
-
-class LLVOAvatar;
-class LLViewerJointMesh;
-
-class LLPreviewAnimation : public LLViewerDynamicTexture
-{
-protected:
- virtual ~LLPreviewAnimation();
-
-public:
- LLPreviewAnimation(S32 width, S32 height);
-
- /*virtual*/ S8 getType() const ;
-
- BOOL render();
- void requestUpdate();
- void rotate(F32 yaw_radians, F32 pitch_radians);
- void zoom(F32 zoom_delta);
- void setZoom(F32 zoom_amt);
- void pan(F32 right, F32 up);
- virtual BOOL needsUpdate() { return mNeedsUpdate; }
-
- LLVOAvatar* getDummyAvatar() { return mDummyAvatar; }
-
-protected:
- BOOL mNeedsUpdate;
- F32 mCameraDistance;
- F32 mCameraYaw;
- F32 mCameraPitch;
- F32 mCameraZoom;
- LLVector3 mCameraOffset;
- LLVector3 mCameraRelPos;
- LLPointer<LLVOAvatar> mDummyAvatar;
-};
-
-class LLFloaterAnimPreview : public LLFloaterNameDesc
-{
-public:
- LLFloaterAnimPreview(const std::string& filename);
- virtual ~LLFloaterAnimPreview();
-
- BOOL postBuild();
-
- BOOL handleMouseDown(S32 x, S32 y, MASK mask);
- BOOL handleMouseUp(S32 x, S32 y, MASK mask);
- BOOL handleHover(S32 x, S32 y, MASK mask);
- BOOL handleScrollWheel(S32 x, S32 y, S32 clicks);
- void onMouseCaptureLost();
-
- void refresh();
-
- void onBtnPlay();
- void onBtnPause();
- void onBtnStop();
- void onSliderMove();
- void onCommitBaseAnim();
- void onCommitLoop();
- void onCommitLoopIn();
- void onCommitLoopOut();
- bool validateLoopIn(const LLSD& data);
- bool validateLoopOut(const LLSD& data);
- void onCommitName();
- void onCommitHandPose();
- void onCommitEmote();
- void onCommitPriority();
- void onCommitEaseIn();
- void onCommitEaseOut();
- bool validateEaseIn(const LLSD& data);
- bool validateEaseOut(const LLSD& data);
- static void onBtnOK(void*);
- static void onSaveComplete(const LLUUID& asset_uuid,
- LLAssetType::EType type,
- void* user_data,
- S32 status, LLExtStat ext_status);
-private:
- void setAnimCallbacks() ;
-
-protected:
- void draw();
- void resetMotion();
-
- LLPointer< LLPreviewAnimation > mAnimPreview;
- S32 mLastMouseX;
- S32 mLastMouseY;
- LLButton* mPlayButton;
- LLButton* mPauseButton;
- LLButton* mStopButton;
- LLRect mPreviewRect;
- LLRectf mPreviewImageRect;
- LLAssetID mMotionID;
- LLTransactionID mTransactionID;
- LLAnimPauseRequest mPauseRequest;
-
- std::map<std::string, LLUUID> mIDList;
-};
-
-#endif // LL_LLFLOATERANIMPREVIEW_H
diff --git a/indra/newview/llfloaterauction.cpp b/indra/newview/llfloaterauction.cpp
index 252c7b51ae..2939d31087 100644
--- a/indra/newview/llfloaterauction.cpp
+++ b/indra/newview/llfloaterauction.cpp
@@ -27,7 +27,6 @@
#include "llviewerprecompiledheaders.h"
#include "llfloaterauction.h"
-#include "llfloaterregioninfo.h"
#include "llgl.h"
#include "llimagej2c.h"
@@ -40,6 +39,7 @@
#include "llagent.h"
#include "llcombobox.h"
+#include "llestateinfomodel.h"
#include "llmimetypes.h"
#include "llnotifications.h"
#include "llnotificationsutil.h"
@@ -55,6 +55,7 @@
#include "llrender.h"
#include "llsdutil.h"
#include "llsdutil_math.h"
+#include "lltrans.h"
///----------------------------------------------------------------------------
/// Local function declarations, constants, enums, and typedefs
@@ -113,16 +114,9 @@ void LLFloaterAuction::initialize()
getChildView("reset_parcel_btn")->setEnabled(TRUE);
getChildView("start_auction_btn")->setEnabled(TRUE);
- LLPanelEstateInfo* panel = LLFloaterRegionInfo::getPanelEstate();
- if (panel)
- { // Only enable "Sell to Anyone" on Teen grid or if we don't know the ID yet
- U32 estate_id = panel->getEstateID();
- getChildView("sell_to_anyone_btn")->setEnabled((estate_id == ESTATE_TEEN || estate_id == 0));
- }
- else
- { // Don't have the panel up, so don't know if we're on the teen grid or not. Default to enabling it
- getChildView("sell_to_anyone_btn")->setEnabled(TRUE);
- }
+ U32 estate_id = LLEstateInfoModel::instance().getID();
+ // Only enable "Sell to Anyone" on Teen grid or if we don't know the ID yet
+ getChildView("sell_to_anyone_btn")->setEnabled(estate_id == ESTATE_TEEN || estate_id == 0);
}
else
{
@@ -351,8 +345,8 @@ void LLFloaterAuction::doResetParcel()
body["media_height"] = (S32) 0;
body["auto_scale"] = (S32) 0;
body["media_loop"] = (S32) 0;
- body["obscure_media"] = (S32) 0;
- body["obscure_music"] = (S32) 0;
+ body["obscure_media"] = (S32) 0; // OBSOLETE - no longer used
+ body["obscure_music"] = (S32) 0; // OBSOLETE - no longer used
body["media_id"] = LLUUID::null;
body["group_id"] = MAINTENANCE_GROUP_ID; // Use maintenance group
body["pass_price"] = (S32) 10; // Defaults to $10
@@ -457,7 +451,7 @@ void LLFloaterAuction::onClickSellToAnyone(void* data)
LLSD args;
args["LAND_SIZE"] = llformat("%d", area);
args["SALE_PRICE"] = llformat("%d", sale_price);
- args["NAME"] = "Anyone";
+ args["NAME"] = LLTrans::getString("Anyone");
LLNotification::Params params("ConfirmLandSaleChange"); // Re-use existing dialog
params.substitutions(args)
diff --git a/indra/newview/llfloateravatar.cpp b/indra/newview/llfloateravatar.cpp
new file mode 100644
index 0000000000..bdc5b581a9
--- /dev/null
+++ b/indra/newview/llfloateravatar.cpp
@@ -0,0 +1,54 @@
+/**
+ * @file llfloateravatar.h
+ * @author Leyla Farazha
+ * @brief floater for the avatar changer
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+/**
+ * Floater that appears when buying an object, giving a preview
+ * of its contents and their permissions.
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloateravatar.h"
+#include "lluictrlfactory.h"
+
+
+LLFloaterAvatar::LLFloaterAvatar(const LLSD& key)
+ : LLFloater(key)
+{
+}
+
+LLFloaterAvatar::~LLFloaterAvatar()
+{
+}
+
+BOOL LLFloaterAvatar::postBuild()
+{
+ enableResizeCtrls(true, true, false);
+ return TRUE;
+}
+
+
diff --git a/indra/newview/llfloateravatar.h b/indra/newview/llfloateravatar.h
new file mode 100644
index 0000000000..cadc5e4028
--- /dev/null
+++ b/indra/newview/llfloateravatar.h
@@ -0,0 +1,43 @@
+/**
+ * @file llfloateravatar.h
+ * @author Leyla Farazha
+ * @brief floater for the avatar changer
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_FLOATER_AVATAR_H
+#define LL_FLOATER_AVATAR_H
+
+#include "llfloater.h"
+
+class LLFloaterAvatar:
+ public LLFloater
+{
+ friend class LLFloaterReg;
+private:
+ LLFloaterAvatar(const LLSD& key);
+ /*virtual*/ ~LLFloaterAvatar();
+ /*virtual*/ BOOL postBuild();
+};
+
+#endif
diff --git a/indra/newview/llfloateravatarpicker.cpp b/indra/newview/llfloateravatarpicker.cpp
index aa66fcf9b8..0290e7cdf0 100644
--- a/indra/newview/llfloateravatarpicker.cpp
+++ b/indra/newview/llfloateravatarpicker.cpp
@@ -63,6 +63,11 @@ LLFloaterAvatarPicker* LLFloaterAvatarPicker::show(select_callback_t callback,
// *TODO: Use a key to allow this not to be an effective singleton
LLFloaterAvatarPicker* floater =
LLFloaterReg::showTypedInstance<LLFloaterAvatarPicker>("avatar_picker");
+ if (!floater)
+ {
+ llwarns << "Cannot instantiate avatar picker" << llendl;
+ return NULL;
+ }
floater->mSelectionCallback = callback;
floater->setAllowMultiple(allow_multiple);
diff --git a/indra/newview/llfloaterbeacons.cpp b/indra/newview/llfloaterbeacons.cpp
index e24df948c4..316294a477 100644
--- a/indra/newview/llfloaterbeacons.cpp
+++ b/indra/newview/llfloaterbeacons.cpp
@@ -48,6 +48,7 @@ LLFloaterBeacons::LLFloaterBeacons(const LLSD& seed)
LLPipeline::setRenderParticleBeacons( gSavedSettings.getBOOL("particlesbeacon"));
LLPipeline::setRenderHighlights( gSavedSettings.getBOOL("renderhighlights"));
LLPipeline::setRenderBeacons( gSavedSettings.getBOOL("renderbeacons"));
+ LLPipeline::setRenderMOAPBeacons( gSavedSettings.getBOOL("moapbeacon"));
mCommitCallbackRegistrar.add("Beacons.UICheck", boost::bind(&LLFloaterBeacons::onClickUICheck, this,_1));
}
@@ -96,6 +97,7 @@ void LLFloaterBeacons::onClickUICheck(LLUICtrl *ctrl)
else if(name == "physical") LLPipeline::setRenderPhysicalBeacons(check->get());
else if(name == "sounds") LLPipeline::setRenderSoundBeacons(check->get());
else if(name == "particles") LLPipeline::setRenderParticleBeacons(check->get());
+ else if(name == "moapbeacon") LLPipeline::setRenderMOAPBeacons(check->get());
else if(name == "highlights")
{
LLPipeline::toggleRenderHighlights(NULL);
diff --git a/indra/newview/llfloaterbuildoptions.cpp b/indra/newview/llfloaterbuildoptions.cpp
index 4b6fe4a115..1b65d8d683 100644
--- a/indra/newview/llfloaterbuildoptions.cpp
+++ b/indra/newview/llfloaterbuildoptions.cpp
@@ -34,15 +34,34 @@
#include "llfloaterbuildoptions.h"
#include "lluictrlfactory.h"
+#include "llcombobox.h"
+#include "llselectmgr.h"
+
//
// Methods
//
+
LLFloaterBuildOptions::LLFloaterBuildOptions(const LLSD& key)
: LLFloater(key)
{
}
LLFloaterBuildOptions::~LLFloaterBuildOptions()
+{}
+
+BOOL LLFloaterBuildOptions::postBuild()
+{
+ return TRUE;
+}
+
+// virtual
+void LLFloaterBuildOptions::onOpen(const LLSD& key)
{
+ mObjectSelection = LLSelectMgr::getInstance()->getEditSelection();
}
+// virtual
+void LLFloaterBuildOptions::onClose(bool app_quitting)
+{
+ mObjectSelection = NULL;
+}
diff --git a/indra/newview/llfloaterbuildoptions.h b/indra/newview/llfloaterbuildoptions.h
index 164944d7bc..02c56cb6a9 100644
--- a/indra/newview/llfloaterbuildoptions.h
+++ b/indra/newview/llfloaterbuildoptions.h
@@ -33,15 +33,27 @@
#define LL_LLFLOATERBUILDOPTIONS_H
#include "llfloater.h"
+#include "llselectmgr.h"
+class LLObjectSelection;
+
+typedef LLSafeHandle<LLObjectSelection> LLObjectSelectionHandle;
class LLFloaterBuildOptions
: public LLFloater
{
- friend class LLFloaterReg;
+public:
+ virtual BOOL postBuild();
+
+ /*virtual*/ void onOpen(const LLSD& key);
+ /*virtual*/ void onClose(bool app_quitting);
+
private:
+ friend class LLFloaterReg;
+
LLFloaterBuildOptions(const LLSD& key);
~LLFloaterBuildOptions();
-};
+ LLObjectSelectionHandle mObjectSelection;
+};
#endif
diff --git a/indra/newview/llfloaterbump.cpp b/indra/newview/llfloaterbump.cpp
index 61cf4dad93..eeb81085bb 100644
--- a/indra/newview/llfloaterbump.cpp
+++ b/indra/newview/llfloaterbump.cpp
@@ -38,13 +38,11 @@
///----------------------------------------------------------------------------
/// Class LLFloaterBump
///----------------------------------------------------------------------------
-extern BOOL gNoRender;
// Default constructor
LLFloaterBump::LLFloaterBump(const LLSD& key)
: LLFloater(key)
{
- if(gNoRender) return;
}
diff --git a/indra/newview/llfloaterbuy.cpp b/indra/newview/llfloaterbuy.cpp
index ee8487b160..087b0007e1 100644
--- a/indra/newview/llfloaterbuy.cpp
+++ b/indra/newview/llfloaterbuy.cpp
@@ -239,8 +239,9 @@ void LLFloaterBuy::inventoryChanged(LLViewerObject* obj,
// Compute icon for this item
BOOL item_is_multi = FALSE;
- if ( inv_item->getFlags() & LLInventoryItemFlags::II_FLAGS_LANDMARK_VISITED
+ if (( inv_item->getFlags() & LLInventoryItemFlags::II_FLAGS_LANDMARK_VISITED
|| inv_item->getFlags() & LLInventoryItemFlags::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS)
+ && !(inv_item->getFlags() & LLInventoryItemFlags::II_FLAGS_WEARABLES_MASK))
{
item_is_multi = TRUE;
}
diff --git a/indra/newview/llfloaterbuycontents.cpp b/indra/newview/llfloaterbuycontents.cpp
index a7388d21a3..bca4b5e447 100644
--- a/indra/newview/llfloaterbuycontents.cpp
+++ b/indra/newview/llfloaterbuycontents.cpp
@@ -210,7 +210,9 @@ void LLFloaterBuyContents::inventoryChanged(LLViewerObject* obj,
LLSD row;
BOOL item_is_multi = FALSE;
- if ( inv_item->getFlags() & LLInventoryItemFlags::II_FLAGS_LANDMARK_VISITED )
+ if ((inv_item->getFlags() & LLInventoryItemFlags::II_FLAGS_LANDMARK_VISITED
+ || inv_item->getFlags() & LLInventoryItemFlags::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS)
+ && !(inv_item->getFlags() & LLInventoryItemFlags::II_FLAGS_WEARABLES_MASK))
{
item_is_multi = TRUE;
}
diff --git a/indra/newview/llfloaterbuycurrency.cpp b/indra/newview/llfloaterbuycurrency.cpp
index 58c79fdf15..e21a8594bc 100644
--- a/indra/newview/llfloaterbuycurrency.cpp
+++ b/indra/newview/llfloaterbuycurrency.cpp
@@ -267,17 +267,23 @@ void LLFloaterBuyCurrencyUI::onClickBuy()
{
mManager.buy(getString("buy_currency"));
updateUI();
+ // Update L$ balance
+ LLStatusBar::sendMoneyBalanceRequest();
}
void LLFloaterBuyCurrencyUI::onClickCancel()
{
closeFloater();
+ // Update L$ balance
+ LLStatusBar::sendMoneyBalanceRequest();
}
void LLFloaterBuyCurrencyUI::onClickErrorWeb()
{
LLWeb::loadURLExternal(mManager.errorURI());
closeFloater();
+ // Update L$ balance
+ LLStatusBar::sendMoneyBalanceRequest();
}
// static
diff --git a/indra/newview/llfloaterbuycurrencyhtml.cpp b/indra/newview/llfloaterbuycurrencyhtml.cpp
index bde620d965..013cf74c7b 100644
--- a/indra/newview/llfloaterbuycurrencyhtml.cpp
+++ b/indra/newview/llfloaterbuycurrencyhtml.cpp
@@ -82,7 +82,7 @@ void LLFloaterBuyCurrencyHTML::navigateToFinalURL()
LLStringUtil::format( buy_currency_url, replace );
// write final URL to debug console
- llinfos << "Buy currency HTML prased URL is " << buy_currency_url << llendl;
+ llinfos << "Buy currency HTML parsed URL is " << buy_currency_url << llendl;
// kick off the navigation
mBrowser->navigateTo( buy_currency_url, "text/html" );
@@ -105,7 +105,7 @@ void LLFloaterBuyCurrencyHTML::handleMediaEvent( LLPluginClassMedia* self, EMedi
//
void LLFloaterBuyCurrencyHTML::onClose( bool app_quitting )
{
- // update L$ balanace one more time
+ // Update L$ balance one more time
LLStatusBar::sendMoneyBalanceRequest();
destroy();
diff --git a/indra/newview/llfloaterbuyland.cpp b/indra/newview/llfloaterbuyland.cpp
index 83105ef27c..8223e89b64 100644
--- a/indra/newview/llfloaterbuyland.cpp
+++ b/indra/newview/llfloaterbuyland.cpp
@@ -459,10 +459,18 @@ void LLFloaterBuyLandUI::updateParcelInfo()
return;
}
- if (!authorizedBuyer.isNull() && buyer != authorizedBuyer)
+ if (!authorizedBuyer.isNull() && buyer != authorizedBuyer)
{
- mCannotBuyReason = getString("set_to_sell_to_other");
- return;
+ // Maybe the parcel is set for sale to a group we are in.
+ bool authorized_group =
+ gAgent.hasPowerInGroup(authorizedBuyer,GP_LAND_DEED)
+ && gAgent.hasPowerInGroup(authorizedBuyer,GP_LAND_SET_SALE_INFO);
+
+ if (!authorized_group)
+ {
+ mCannotBuyReason = getString("set_to_sell_to_other");
+ return;
+ }
}
}
else
@@ -500,7 +508,9 @@ void LLFloaterBuyLandUI::updateCovenantInfo()
LLIconCtrl* rating_icon = getChild<LLIconCtrl>("rating_icon");
LLRect rect = rating_icon->getRect();
- S32 icon_left_pad = region_name->getRect().mLeft + region_name->getTextBoundingRect().getWidth() + ICON_PAD;
+ S32 region_name_width = llmin(region_name->getRect().getWidth(), region_name->getTextBoundingRect().getWidth());
+ S32 icon_left_pad = region_name->getRect().mLeft + region_name_width + ICON_PAD;
+ region_name->setToolTip(region_name->getText());
rating_icon->setRect(rect.setOriginAndSize(icon_left_pad, rect.mBottom, rect.getWidth(), rect.getHeight()));
switch(sim_access)
@@ -521,7 +531,8 @@ void LLFloaterBuyLandUI::updateCovenantInfo()
LLTextBox* region_type = getChild<LLTextBox>("region_type_text");
if (region_type)
{
- region_type->setText(region->getSimProductName());
+ region_type->setText(region->getLocalizedSimProductName());
+ region_type->setToolTip(region->getLocalizedSimProductName());
}
LLTextBox* resellable_clause = getChild<LLTextBox>("resellable_clause");
@@ -611,7 +622,8 @@ void LLFloaterBuyLandUI::updateFloaterCovenantText(const std::string &string, co
void LLFloaterBuyLandUI::updateFloaterEstateName(const std::string& name)
{
LLTextBox* box = getChild<LLTextBox>("estate_name_text");
- if (box) box->setText(name);
+ box->setText(name);
+ box->setToolTip(name);
}
void LLFloaterBuyLandUI::updateFloaterLastModified(const std::string& text)
diff --git a/indra/newview/llfloaterbvhpreview.cpp b/indra/newview/llfloaterbvhpreview.cpp
new file mode 100644
index 0000000000..b050a638dc
--- /dev/null
+++ b/indra/newview/llfloaterbvhpreview.cpp
@@ -0,0 +1,1174 @@
+/**
+ * @file llfloaterbvhpreview.cpp
+ * @brief LLFloaterBvhPreview class implementation
+ *
+ * $LicenseInfo:firstyear=2004&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloaterbvhpreview.h"
+
+#include "llbvhloader.h"
+#include "lldatapacker.h"
+#include "lldir.h"
+#include "lleconomy.h"
+#include "llnotificationsutil.h"
+#include "llvfile.h"
+#include "llapr.h"
+#include "llstring.h"
+
+#include "llagent.h"
+#include "llanimationstates.h"
+#include "llbbox.h"
+#include "llbutton.h"
+#include "llcheckboxctrl.h"
+#include "llcombobox.h"
+#include "lldrawable.h"
+#include "lldrawpoolavatar.h"
+#include "llrender.h"
+#include "llface.h"
+#include "llfocusmgr.h"
+#include "llkeyframemotion.h"
+#include "lllineeditor.h"
+#include "llfloaterperms.h"
+#include "llsliderctrl.h"
+#include "llspinctrl.h"
+#include "lltextbox.h"
+#include "lltoolmgr.h"
+#include "llui.h"
+#include "llviewercamera.h"
+#include "llviewerobjectlist.h"
+#include "llviewerwindow.h"
+#include "llviewermenufile.h" // upload_new_resource()
+#include "llvoavatar.h"
+#include "pipeline.h"
+#include "lluictrlfactory.h"
+#include "lltrans.h"
+
+const S32 PREVIEW_BORDER_WIDTH = 2;
+const S32 PREVIEW_RESIZE_HANDLE_SIZE = S32(RESIZE_HANDLE_WIDTH * OO_SQRT2) + PREVIEW_BORDER_WIDTH;
+const S32 PREVIEW_HPAD = PREVIEW_RESIZE_HANDLE_SIZE;
+const S32 PREF_BUTTON_HEIGHT = 16;
+const S32 PREVIEW_TEXTURE_HEIGHT = 300;
+
+const F32 PREVIEW_CAMERA_DISTANCE = 4.f;
+
+const F32 MIN_CAMERA_ZOOM = 0.5f;
+const F32 MAX_CAMERA_ZOOM = 10.f;
+
+const F32 BASE_ANIM_TIME_OFFSET = 5.f;
+
+std::string STATUS[] =
+{
+ "E_ST_OK",
+ "E_ST_EOF",
+ "E_ST_NO_CONSTRAINT",
+ "E_ST_NO_FILE",
+ "E_ST_NO_HIER",
+ "E_ST_NO_JOINT",
+ "E_ST_NO_NAME",
+ "E_ST_NO_OFFSET",
+ "E_ST_NO_CHANNELS",
+ "E_ST_NO_ROTATION",
+ "E_ST_NO_AXIS",
+ "E_ST_NO_MOTION",
+ "E_ST_NO_FRAMES",
+ "E_ST_NO_FRAME_TIME",
+ "E_ST_NO_POS",
+ "E_ST_NO_ROT",
+ "E_ST_NO_XLT_FILE",
+ "E_ST_NO_XLT_HEADER",
+ "E_ST_NO_XLT_NAME",
+ "E_ST_NO_XLT_IGNORE",
+ "E_ST_NO_XLT_RELATIVE",
+ "E_ST_NO_XLT_OUTNAME",
+ "E_ST_NO_XLT_MATRIX",
+ "E_ST_NO_XLT_MERGECHILD",
+ "E_ST_NO_XLT_MERGEPARENT",
+ "E_ST_NO_XLT_PRIORITY",
+ "E_ST_NO_XLT_LOOP",
+ "E_ST_NO_XLT_EASEIN",
+ "E_ST_NO_XLT_EASEOUT",
+ "E_ST_NO_XLT_HAND",
+ "E_ST_NO_XLT_EMOTE",
+"E_ST_BAD_ROOT"
+};
+
+//-----------------------------------------------------------------------------
+// LLFloaterBvhPreview()
+//-----------------------------------------------------------------------------
+LLFloaterBvhPreview::LLFloaterBvhPreview(const std::string& filename) :
+ LLFloaterNameDesc(filename)
+{
+ mLastMouseX = 0;
+ mLastMouseY = 0;
+
+ mIDList["Standing"] = ANIM_AGENT_STAND;
+ mIDList["Walking"] = ANIM_AGENT_FEMALE_WALK;
+ mIDList["Sitting"] = ANIM_AGENT_SIT_FEMALE;
+ mIDList["Flying"] = ANIM_AGENT_HOVER;
+
+ mIDList["[None]"] = LLUUID::null;
+ mIDList["Aaaaah"] = ANIM_AGENT_EXPRESS_OPEN_MOUTH;
+ mIDList["Afraid"] = ANIM_AGENT_EXPRESS_AFRAID;
+ mIDList["Angry"] = ANIM_AGENT_EXPRESS_ANGER;
+ mIDList["Big Smile"] = ANIM_AGENT_EXPRESS_TOOTHSMILE;
+ mIDList["Bored"] = ANIM_AGENT_EXPRESS_BORED;
+ mIDList["Cry"] = ANIM_AGENT_EXPRESS_CRY;
+ mIDList["Disdain"] = ANIM_AGENT_EXPRESS_DISDAIN;
+ mIDList["Embarrassed"] = ANIM_AGENT_EXPRESS_EMBARRASSED;
+ mIDList["Frown"] = ANIM_AGENT_EXPRESS_FROWN;
+ mIDList["Kiss"] = ANIM_AGENT_EXPRESS_KISS;
+ mIDList["Laugh"] = ANIM_AGENT_EXPRESS_LAUGH;
+ mIDList["Plllppt"] = ANIM_AGENT_EXPRESS_TONGUE_OUT;
+ mIDList["Repulsed"] = ANIM_AGENT_EXPRESS_REPULSED;
+ mIDList["Sad"] = ANIM_AGENT_EXPRESS_SAD;
+ mIDList["Shrug"] = ANIM_AGENT_EXPRESS_SHRUG;
+ mIDList["Smile"] = ANIM_AGENT_EXPRESS_SMILE;
+ mIDList["Surprise"] = ANIM_AGENT_EXPRESS_SURPRISE;
+ mIDList["Wink"] = ANIM_AGENT_EXPRESS_WINK;
+ mIDList["Worry"] = ANIM_AGENT_EXPRESS_WORRY;
+}
+
+//-----------------------------------------------------------------------------
+// setAnimCallbacks()
+//-----------------------------------------------------------------------------
+void LLFloaterBvhPreview::setAnimCallbacks()
+{
+ getChild<LLUICtrl>("playback_slider")->setCommitCallback(boost::bind(&LLFloaterBvhPreview::onSliderMove, this));
+
+ getChild<LLUICtrl>("preview_base_anim")->setCommitCallback(boost::bind(&LLFloaterBvhPreview::onCommitBaseAnim, this));
+ getChild<LLUICtrl>("preview_base_anim")->setValue("Standing");
+
+ getChild<LLUICtrl>("priority")->setCommitCallback(boost::bind(&LLFloaterBvhPreview::onCommitPriority, this));
+ getChild<LLUICtrl>("loop_check")->setCommitCallback(boost::bind(&LLFloaterBvhPreview::onCommitLoop, this));
+ getChild<LLUICtrl>("loop_in_point")->setCommitCallback(boost::bind(&LLFloaterBvhPreview::onCommitLoopIn, this));
+ getChild<LLUICtrl>("loop_in_point")->setValidateBeforeCommit( boost::bind(&LLFloaterBvhPreview::validateLoopIn, this, _1));
+ getChild<LLUICtrl>("loop_out_point")->setCommitCallback(boost::bind(&LLFloaterBvhPreview::onCommitLoopOut, this));
+ getChild<LLUICtrl>("loop_out_point")->setValidateBeforeCommit( boost::bind(&LLFloaterBvhPreview::validateLoopOut, this, _1));
+
+ getChild<LLUICtrl>("hand_pose_combo")->setCommitCallback(boost::bind(&LLFloaterBvhPreview::onCommitHandPose, this));
+
+ getChild<LLUICtrl>("emote_combo")->setCommitCallback(boost::bind(&LLFloaterBvhPreview::onCommitEmote, this));
+ getChild<LLUICtrl>("emote_combo")->setValue("[None]");
+
+ getChild<LLUICtrl>("ease_in_time")->setCommitCallback(boost::bind(&LLFloaterBvhPreview::onCommitEaseIn, this));
+ getChild<LLUICtrl>("ease_in_time")->setValidateBeforeCommit( boost::bind(&LLFloaterBvhPreview::validateEaseIn, this, _1));
+ getChild<LLUICtrl>("ease_out_time")->setCommitCallback(boost::bind(&LLFloaterBvhPreview::onCommitEaseOut, this));
+ getChild<LLUICtrl>("ease_out_time")->setValidateBeforeCommit( boost::bind(&LLFloaterBvhPreview::validateEaseOut, this, _1));
+}
+
+//-----------------------------------------------------------------------------
+// postBuild()
+//-----------------------------------------------------------------------------
+BOOL LLFloaterBvhPreview::postBuild()
+{
+ LLKeyframeMotion* motionp = NULL;
+ LLBVHLoader* loaderp = NULL;
+
+ if (!LLFloaterNameDesc::postBuild())
+ {
+ return FALSE;
+ }
+
+ getChild<LLUICtrl>("name_form")->setCommitCallback(boost::bind(&LLFloaterBvhPreview::onCommitName, this));
+
+ childSetAction("ok_btn", onBtnOK, this);
+ setDefaultBtn();
+
+ mPreviewRect.set(PREVIEW_HPAD,
+ PREVIEW_TEXTURE_HEIGHT,
+ getRect().getWidth() - PREVIEW_HPAD,
+ PREVIEW_HPAD + PREF_BUTTON_HEIGHT + PREVIEW_HPAD);
+ mPreviewImageRect.set(0.f, 1.f, 1.f, 0.f);
+
+ mPlayButton = getChild<LLButton>( "play_btn");
+ mPlayButton->setClickedCallback(boost::bind(&LLFloaterBvhPreview::onBtnPlay, this));
+ mPlayButton->setVisible(true);
+
+ mPauseButton = getChild<LLButton>( "pause_btn");
+ mPauseButton->setClickedCallback(boost::bind(&LLFloaterBvhPreview::onBtnPause, this));
+ mPauseButton->setVisible(false);
+
+ mStopButton = getChild<LLButton>( "stop_btn");
+ mStopButton->setClickedCallback(boost::bind(&LLFloaterBvhPreview::onBtnStop, this));
+
+ getChildView("bad_animation_text")->setVisible(FALSE);
+
+ std::string exten = gDirUtilp->getExtension(mFilename);
+ if (exten == "bvh")
+ {
+ // loading a bvh file
+
+ // now load bvh file
+ S32 file_size;
+
+ LLAPRFile infile ;
+ infile.open(mFilenameAndPath, LL_APR_RB, NULL, &file_size);
+
+ if (!infile.getFileHandle())
+ {
+ llwarns << "Can't open BVH file:" << mFilename << llendl;
+ }
+ else
+ {
+ char* file_buffer;
+
+ file_buffer = new char[file_size + 1];
+
+ if (file_size == infile.read(file_buffer, file_size))
+ {
+ file_buffer[file_size] = '\0';
+ llinfos << "Loading BVH file " << mFilename << llendl;
+ ELoadStatus load_status = E_ST_OK;
+ S32 line_number = 0;
+ loaderp = new LLBVHLoader(file_buffer, load_status, line_number);
+ std::string status = getString(STATUS[load_status]);
+
+ if(load_status == E_ST_NO_XLT_FILE)
+ {
+ llwarns << "NOTE: No translation table found." << llendl;
+ }
+ else
+ {
+ llwarns << "ERROR: [line: " << line_number << "] " << status << llendl;
+ }
+ }
+
+ infile.close() ;
+ delete[] file_buffer;
+ }
+ }
+
+ if (loaderp && loaderp->isInitialized() && loaderp->getDuration() <= MAX_ANIM_DURATION)
+ {
+ // generate unique id for this motion
+ mTransactionID.generate();
+ mMotionID = mTransactionID.makeAssetID(gAgent.getSecureSessionID());
+
+ mAnimPreview = new LLPreviewAnimation(256, 256);
+
+ // motion will be returned, but it will be in a load-pending state, as this is a new motion
+ // this motion will not request an asset transfer until next update, so we have a chance to
+ // load the keyframe data locally
+ motionp = (LLKeyframeMotion*)mAnimPreview->getDummyAvatar()->createMotion(mMotionID);
+
+ // create data buffer for keyframe initialization
+ S32 buffer_size = loaderp->getOutputSize();
+ U8* buffer = new U8[buffer_size];
+
+ LLDataPackerBinaryBuffer dp(buffer, buffer_size);
+
+ // pass animation data through memory buffer
+ loaderp->serialize(dp);
+ dp.reset();
+ BOOL success = motionp && motionp->deserialize(dp);
+
+ delete []buffer;
+
+ if (success)
+ {
+ setAnimCallbacks() ;
+
+ const LLBBoxLocal &pelvis_bbox = motionp->getPelvisBBox();
+
+ LLVector3 temp = pelvis_bbox.getCenter();
+ // only consider XY?
+ //temp.mV[VZ] = 0.f;
+ F32 pelvis_offset = temp.magVec();
+
+ temp = pelvis_bbox.getExtent();
+ //temp.mV[VZ] = 0.f;
+ F32 pelvis_max_displacement = pelvis_offset + (temp.magVec() * 0.5f) + 1.f;
+
+ F32 camera_zoom = LLViewerCamera::getInstance()->getDefaultFOV() / (2.f * atan(pelvis_max_displacement / PREVIEW_CAMERA_DISTANCE));
+
+ mAnimPreview->setZoom(camera_zoom);
+
+ motionp->setName(getChild<LLUICtrl>("name_form")->getValue().asString());
+ mAnimPreview->getDummyAvatar()->startMotion(mMotionID);
+
+ getChild<LLSlider>("playback_slider")->setMinValue(0.0);
+ getChild<LLSlider>("playback_slider")->setMaxValue(1.0);
+
+ getChild<LLUICtrl>("loop_check")->setValue(LLSD(motionp->getLoop()));
+ getChild<LLUICtrl>("loop_in_point")->setValue(LLSD(motionp->getLoopIn() / motionp->getDuration() * 100.f));
+ getChild<LLUICtrl>("loop_out_point")->setValue(LLSD(motionp->getLoopOut() / motionp->getDuration() * 100.f));
+ getChild<LLUICtrl>("priority")->setValue(LLSD((F32)motionp->getPriority()));
+ getChild<LLUICtrl>("hand_pose_combo")->setValue(LLHandMotion::getHandPoseName(motionp->getHandPose()));
+ getChild<LLUICtrl>("ease_in_time")->setValue(LLSD(motionp->getEaseInDuration()));
+ getChild<LLUICtrl>("ease_out_time")->setValue(LLSD(motionp->getEaseOutDuration()));
+ setEnabled(TRUE);
+ std::string seconds_string;
+ seconds_string = llformat(" - %.2f seconds", motionp->getDuration());
+
+ setTitle(mFilename + std::string(seconds_string));
+ }
+ else
+ {
+ mAnimPreview = NULL;
+ mMotionID.setNull();
+ getChild<LLUICtrl>("bad_animation_text")->setValue(getString("failed_to_initialize"));
+ }
+ }
+ else
+ {
+ if ( loaderp )
+ {
+ if (loaderp->getDuration() > MAX_ANIM_DURATION)
+ {
+ LLUIString out_str = getString("anim_too_long");
+ out_str.setArg("[LENGTH]", llformat("%.1f", loaderp->getDuration()));
+ out_str.setArg("[MAX_LENGTH]", llformat("%.1f", MAX_ANIM_DURATION));
+ getChild<LLUICtrl>("bad_animation_text")->setValue(out_str.getString());
+ }
+ else
+ {
+ LLUIString out_str = getString("failed_file_read");
+ out_str.setArg("[STATUS]", getString(STATUS[loaderp->getStatus()]));
+ getChild<LLUICtrl>("bad_animation_text")->setValue(out_str.getString());
+ }
+ }
+
+ //setEnabled(FALSE);
+ mMotionID.setNull();
+ mAnimPreview = NULL;
+ }
+
+ refresh();
+
+ delete loaderp;
+
+ return TRUE;
+}
+
+//-----------------------------------------------------------------------------
+// LLFloaterBvhPreview()
+//-----------------------------------------------------------------------------
+LLFloaterBvhPreview::~LLFloaterBvhPreview()
+{
+ mAnimPreview = NULL;
+
+ setEnabled(FALSE);
+}
+
+//-----------------------------------------------------------------------------
+// draw()
+//-----------------------------------------------------------------------------
+void LLFloaterBvhPreview::draw()
+{
+ LLFloater::draw();
+ LLRect r = getRect();
+
+ refresh();
+
+ if (mMotionID.notNull() && mAnimPreview)
+ {
+ gGL.color3f(1.f, 1.f, 1.f);
+
+ gGL.getTexUnit(0)->bind(mAnimPreview);
+
+ gGL.begin( LLRender::QUADS );
+ {
+ gGL.texCoord2f(0.f, 1.f);
+ gGL.vertex2i(PREVIEW_HPAD, PREVIEW_TEXTURE_HEIGHT);
+ gGL.texCoord2f(0.f, 0.f);
+ gGL.vertex2i(PREVIEW_HPAD, PREVIEW_HPAD + PREF_BUTTON_HEIGHT + PREVIEW_HPAD);
+ gGL.texCoord2f(1.f, 0.f);
+ gGL.vertex2i(r.getWidth() - PREVIEW_HPAD, PREVIEW_HPAD + PREF_BUTTON_HEIGHT + PREVIEW_HPAD);
+ gGL.texCoord2f(1.f, 1.f);
+ gGL.vertex2i(r.getWidth() - PREVIEW_HPAD, PREVIEW_TEXTURE_HEIGHT);
+ }
+ gGL.end();
+
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+
+ LLVOAvatar* avatarp = mAnimPreview->getDummyAvatar();
+ if (!avatarp->areAnimationsPaused())
+ {
+ mAnimPreview->requestUpdate();
+ }
+ }
+}
+
+//-----------------------------------------------------------------------------
+// resetMotion()
+//-----------------------------------------------------------------------------
+void LLFloaterBvhPreview::resetMotion()
+{
+ LLVOAvatar* avatarp = mAnimPreview->getDummyAvatar();
+ BOOL paused = avatarp->areAnimationsPaused();
+
+ // *TODO: Fix awful casting hack
+ LLKeyframeMotion* motionp = (LLKeyframeMotion*)avatarp->findMotion(mMotionID);
+
+ // Set emotion
+ std::string emote = getChild<LLUICtrl>("emote_combo")->getValue().asString();
+ motionp->setEmote(mIDList[emote]);
+
+ LLUUID base_id = mIDList[getChild<LLUICtrl>("preview_base_anim")->getValue().asString()];
+ avatarp->deactivateAllMotions();
+ avatarp->startMotion(mMotionID, 0.0f);
+ avatarp->startMotion(base_id, BASE_ANIM_TIME_OFFSET);
+ getChild<LLUICtrl>("playback_slider")->setValue(0.0f);
+
+ // Set pose
+ std::string handpose = getChild<LLUICtrl>("hand_pose_combo")->getValue().asString();
+ avatarp->startMotion( ANIM_AGENT_HAND_MOTION, 0.0f );
+ motionp->setHandPose(LLHandMotion::getHandPose(handpose));
+
+ if (paused)
+ {
+ mPauseRequest = avatarp->requestPause();
+ }
+ else
+ {
+ mPauseRequest = NULL;
+ }
+}
+
+//-----------------------------------------------------------------------------
+// handleMouseDown()
+//-----------------------------------------------------------------------------
+BOOL LLFloaterBvhPreview::handleMouseDown(S32 x, S32 y, MASK mask)
+{
+ if (mPreviewRect.pointInRect(x, y))
+ {
+ bringToFront( x, y );
+ gFocusMgr.setMouseCapture(this);
+ gViewerWindow->hideCursor();
+ mLastMouseX = x;
+ mLastMouseY = y;
+ return TRUE;
+ }
+
+ return LLFloater::handleMouseDown(x, y, mask);
+}
+
+//-----------------------------------------------------------------------------
+// handleMouseUp()
+//-----------------------------------------------------------------------------
+BOOL LLFloaterBvhPreview::handleMouseUp(S32 x, S32 y, MASK mask)
+{
+ gFocusMgr.setMouseCapture(FALSE);
+ gViewerWindow->showCursor();
+ return LLFloater::handleMouseUp(x, y, mask);
+}
+
+//-----------------------------------------------------------------------------
+// handleHover()
+//-----------------------------------------------------------------------------
+BOOL LLFloaterBvhPreview::handleHover(S32 x, S32 y, MASK mask)
+{
+ MASK local_mask = mask & ~MASK_ALT;
+
+ if (mAnimPreview && hasMouseCapture())
+ {
+ if (local_mask == MASK_PAN)
+ {
+ // pan here
+ mAnimPreview->pan((F32)(x - mLastMouseX) * -0.005f, (F32)(y - mLastMouseY) * -0.005f);
+ }
+ else if (local_mask == MASK_ORBIT)
+ {
+ F32 yaw_radians = (F32)(x - mLastMouseX) * -0.01f;
+ F32 pitch_radians = (F32)(y - mLastMouseY) * 0.02f;
+
+ mAnimPreview->rotate(yaw_radians, pitch_radians);
+ }
+ else
+ {
+ F32 yaw_radians = (F32)(x - mLastMouseX) * -0.01f;
+ F32 zoom_amt = (F32)(y - mLastMouseY) * 0.02f;
+
+ mAnimPreview->rotate(yaw_radians, 0.f);
+ mAnimPreview->zoom(zoom_amt);
+ }
+
+ mAnimPreview->requestUpdate();
+
+ LLUI::setMousePositionLocal(this, mLastMouseX, mLastMouseY);
+ }
+
+ if (!mPreviewRect.pointInRect(x, y) || !mAnimPreview)
+ {
+ return LLFloater::handleHover(x, y, mask);
+ }
+ else if (local_mask == MASK_ORBIT)
+ {
+ gViewerWindow->setCursor(UI_CURSOR_TOOLCAMERA);
+ }
+ else if (local_mask == MASK_PAN)
+ {
+ gViewerWindow->setCursor(UI_CURSOR_TOOLPAN);
+ }
+ else
+ {
+ gViewerWindow->setCursor(UI_CURSOR_TOOLZOOMIN);
+ }
+
+ return TRUE;
+}
+
+//-----------------------------------------------------------------------------
+// handleScrollWheel()
+//-----------------------------------------------------------------------------
+BOOL LLFloaterBvhPreview::handleScrollWheel(S32 x, S32 y, S32 clicks)
+{
+ mAnimPreview->zoom((F32)clicks * -0.2f);
+ mAnimPreview->requestUpdate();
+
+ return TRUE;
+}
+
+//-----------------------------------------------------------------------------
+// onMouseCaptureLost()
+//-----------------------------------------------------------------------------
+void LLFloaterBvhPreview::onMouseCaptureLost()
+{
+ gViewerWindow->showCursor();
+}
+
+//-----------------------------------------------------------------------------
+// onBtnPlay()
+//-----------------------------------------------------------------------------
+void LLFloaterBvhPreview::onBtnPlay()
+{
+ if (!getEnabled())
+ return;
+
+ if (mMotionID.notNull() && mAnimPreview)
+ {
+ LLVOAvatar* avatarp = mAnimPreview->getDummyAvatar();
+
+ if (!avatarp->isMotionActive(mMotionID))
+ {
+ resetMotion();
+ mPauseRequest = NULL;
+ }
+ else if (avatarp->areAnimationsPaused())
+ {
+ mPauseRequest = NULL;
+ }
+ }
+}
+
+//-----------------------------------------------------------------------------
+// onBtnPause()
+//-----------------------------------------------------------------------------
+void LLFloaterBvhPreview::onBtnPause()
+{
+ if (!getEnabled())
+ return;
+
+ if (mMotionID.notNull() && mAnimPreview)
+ {
+ LLVOAvatar* avatarp = mAnimPreview->getDummyAvatar();
+
+ if (avatarp->isMotionActive(mMotionID))
+ {
+ if (!avatarp->areAnimationsPaused())
+ {
+ mPauseRequest = avatarp->requestPause();
+ }
+ }
+ }
+}
+
+//-----------------------------------------------------------------------------
+// onBtnStop()
+//-----------------------------------------------------------------------------
+void LLFloaterBvhPreview::onBtnStop()
+{
+ if (!getEnabled())
+ return;
+
+ if (mMotionID.notNull() && mAnimPreview)
+ {
+ LLVOAvatar* avatarp = mAnimPreview->getDummyAvatar();
+ resetMotion();
+ mPauseRequest = avatarp->requestPause();
+ }
+}
+
+//-----------------------------------------------------------------------------
+// onSliderMove()
+//-----------------------------------------------------------------------------
+void LLFloaterBvhPreview::onSliderMove()
+{
+ if (!getEnabled())
+ return;
+
+ if (mAnimPreview)
+ {
+ LLVOAvatar* avatarp = mAnimPreview->getDummyAvatar();
+ F32 slider_value = (F32)getChild<LLUICtrl>("playback_slider")->getValue().asReal();
+ LLUUID base_id = mIDList[getChild<LLUICtrl>("preview_base_anim")->getValue().asString()];
+ LLMotion* motionp = avatarp->findMotion(mMotionID);
+ F32 duration = motionp->getDuration();// + motionp->getEaseOutDuration();
+ F32 delta_time = duration * slider_value;
+ avatarp->deactivateAllMotions();
+ avatarp->startMotion(base_id, delta_time + BASE_ANIM_TIME_OFFSET);
+ avatarp->startMotion(mMotionID, delta_time);
+ mPauseRequest = avatarp->requestPause();
+ refresh();
+ }
+
+}
+
+//-----------------------------------------------------------------------------
+// onCommitBaseAnim()
+//-----------------------------------------------------------------------------
+void LLFloaterBvhPreview::onCommitBaseAnim()
+{
+ if (!getEnabled())
+ return;
+
+ if (mAnimPreview)
+ {
+ LLVOAvatar* avatarp = mAnimPreview->getDummyAvatar();
+
+ BOOL paused = avatarp->areAnimationsPaused();
+
+ // stop all other possible base motions
+ avatarp->stopMotion(mIDList["Standing"], TRUE);
+ avatarp->stopMotion(mIDList["Walking"], TRUE);
+ avatarp->stopMotion(mIDList["Sitting"], TRUE);
+ avatarp->stopMotion(mIDList["Flying"], TRUE);
+
+ resetMotion();
+
+ if (!paused)
+ {
+ mPauseRequest = NULL;
+ }
+ }
+}
+
+//-----------------------------------------------------------------------------
+// onCommitLoop()
+//-----------------------------------------------------------------------------
+void LLFloaterBvhPreview::onCommitLoop()
+{
+ if (!getEnabled())
+ return;
+
+ LLVOAvatar* avatarp = mAnimPreview->getDummyAvatar();
+ LLKeyframeMotion* motionp = (LLKeyframeMotion*)avatarp->findMotion(mMotionID);
+
+ if (motionp)
+ {
+ motionp->setLoop(getChild<LLUICtrl>("loop_check")->getValue().asBoolean());
+ motionp->setLoopIn((F32)getChild<LLUICtrl>("loop_in_point")->getValue().asReal() * 0.01f * motionp->getDuration());
+ motionp->setLoopOut((F32)getChild<LLUICtrl>("loop_out_point")->getValue().asReal() * 0.01f * motionp->getDuration());
+ }
+}
+
+//-----------------------------------------------------------------------------
+// onCommitLoopIn()
+//-----------------------------------------------------------------------------
+void LLFloaterBvhPreview::onCommitLoopIn()
+{
+ if (!getEnabled())
+ return;
+
+ LLVOAvatar* avatarp = mAnimPreview->getDummyAvatar();
+ LLKeyframeMotion* motionp = (LLKeyframeMotion*)avatarp->findMotion(mMotionID);
+
+ if (motionp)
+ {
+ motionp->setLoopIn((F32)getChild<LLUICtrl>("loop_in_point")->getValue().asReal() / 100.f);
+ resetMotion();
+ getChild<LLUICtrl>("loop_check")->setValue(LLSD(TRUE));
+ onCommitLoop();
+ }
+}
+
+//-----------------------------------------------------------------------------
+// onCommitLoopOut()
+//-----------------------------------------------------------------------------
+void LLFloaterBvhPreview::onCommitLoopOut()
+{
+ if (!getEnabled())
+ return;
+
+ LLVOAvatar* avatarp = mAnimPreview->getDummyAvatar();
+ LLKeyframeMotion* motionp = (LLKeyframeMotion*)avatarp->findMotion(mMotionID);
+
+ if (motionp)
+ {
+ motionp->setLoopOut((F32)getChild<LLUICtrl>("loop_out_point")->getValue().asReal() * 0.01f * motionp->getDuration());
+ resetMotion();
+ getChild<LLUICtrl>("loop_check")->setValue(LLSD(TRUE));
+ onCommitLoop();
+ }
+}
+
+//-----------------------------------------------------------------------------
+// onCommitName()
+//-----------------------------------------------------------------------------
+void LLFloaterBvhPreview::onCommitName()
+{
+ if (!getEnabled())
+ return;
+
+ LLVOAvatar* avatarp = mAnimPreview->getDummyAvatar();
+ LLKeyframeMotion* motionp = (LLKeyframeMotion*)avatarp->findMotion(mMotionID);
+
+ if (motionp)
+ {
+ motionp->setName(getChild<LLUICtrl>("name_form")->getValue().asString());
+ }
+
+ doCommit();
+}
+
+//-----------------------------------------------------------------------------
+// onCommitHandPose()
+//-----------------------------------------------------------------------------
+void LLFloaterBvhPreview::onCommitHandPose()
+{
+ if (!getEnabled())
+ return;
+
+ resetMotion(); // sets hand pose
+}
+
+//-----------------------------------------------------------------------------
+// onCommitEmote()
+//-----------------------------------------------------------------------------
+void LLFloaterBvhPreview::onCommitEmote()
+{
+ if (!getEnabled())
+ return;
+
+ resetMotion(); // ssts emote
+}
+
+//-----------------------------------------------------------------------------
+// onCommitPriority()
+//-----------------------------------------------------------------------------
+void LLFloaterBvhPreview::onCommitPriority()
+{
+ if (!getEnabled())
+ return;
+
+ LLVOAvatar* avatarp = mAnimPreview->getDummyAvatar();
+ LLKeyframeMotion* motionp = (LLKeyframeMotion*)avatarp->findMotion(mMotionID);
+
+ motionp->setPriority(llfloor((F32)getChild<LLUICtrl>("priority")->getValue().asReal()));
+}
+
+//-----------------------------------------------------------------------------
+// onCommitEaseIn()
+//-----------------------------------------------------------------------------
+void LLFloaterBvhPreview::onCommitEaseIn()
+{
+ if (!getEnabled())
+ return;
+
+ LLVOAvatar* avatarp = mAnimPreview->getDummyAvatar();
+ LLKeyframeMotion* motionp = (LLKeyframeMotion*)avatarp->findMotion(mMotionID);
+
+ motionp->setEaseIn((F32)getChild<LLUICtrl>("ease_in_time")->getValue().asReal());
+ resetMotion();
+}
+
+//-----------------------------------------------------------------------------
+// onCommitEaseOut()
+//-----------------------------------------------------------------------------
+void LLFloaterBvhPreview::onCommitEaseOut()
+{
+ if (!getEnabled())
+ return;
+
+ LLVOAvatar* avatarp = mAnimPreview->getDummyAvatar();
+ LLKeyframeMotion* motionp = (LLKeyframeMotion*)avatarp->findMotion(mMotionID);
+
+ motionp->setEaseOut((F32)getChild<LLUICtrl>("ease_out_time")->getValue().asReal());
+ resetMotion();
+}
+
+//-----------------------------------------------------------------------------
+// validateEaseIn()
+//-----------------------------------------------------------------------------
+bool LLFloaterBvhPreview::validateEaseIn(const LLSD& data)
+{
+ if (!getEnabled())
+ return false;
+
+ LLVOAvatar* avatarp = mAnimPreview->getDummyAvatar();
+ LLKeyframeMotion* motionp = (LLKeyframeMotion*)avatarp->findMotion(mMotionID);
+
+ if (!motionp->getLoop())
+ {
+ F32 new_ease_in = llclamp((F32)getChild<LLUICtrl>("ease_in_time")->getValue().asReal(), 0.f, motionp->getDuration() - motionp->getEaseOutDuration());
+ getChild<LLUICtrl>("ease_in_time")->setValue(LLSD(new_ease_in));
+ }
+
+ return true;
+}
+
+//-----------------------------------------------------------------------------
+// validateEaseOut()
+//-----------------------------------------------------------------------------
+bool LLFloaterBvhPreview::validateEaseOut(const LLSD& data)
+{
+ if (!getEnabled())
+ return false;
+
+ LLVOAvatar* avatarp = mAnimPreview->getDummyAvatar();
+ LLKeyframeMotion* motionp = (LLKeyframeMotion*)avatarp->findMotion(mMotionID);
+
+ if (!motionp->getLoop())
+ {
+ F32 new_ease_out = llclamp((F32)getChild<LLUICtrl>("ease_out_time")->getValue().asReal(), 0.f, motionp->getDuration() - motionp->getEaseInDuration());
+ getChild<LLUICtrl>("ease_out_time")->setValue(LLSD(new_ease_out));
+ }
+
+ return true;
+}
+
+//-----------------------------------------------------------------------------
+// validateLoopIn()
+//-----------------------------------------------------------------------------
+bool LLFloaterBvhPreview::validateLoopIn(const LLSD& data)
+{
+ if (!getEnabled())
+ return false;
+
+ F32 loop_in_value = (F32)getChild<LLUICtrl>("loop_in_point")->getValue().asReal();
+ F32 loop_out_value = (F32)getChild<LLUICtrl>("loop_out_point")->getValue().asReal();
+
+ if (loop_in_value < 0.f)
+ {
+ loop_in_value = 0.f;
+ }
+ else if (loop_in_value > 100.f)
+ {
+ loop_in_value = 100.f;
+ }
+ else if (loop_in_value > loop_out_value)
+ {
+ loop_in_value = loop_out_value;
+ }
+
+ getChild<LLUICtrl>("loop_in_point")->setValue(LLSD(loop_in_value));
+ return true;
+}
+
+//-----------------------------------------------------------------------------
+// validateLoopOut()
+//-----------------------------------------------------------------------------
+bool LLFloaterBvhPreview::validateLoopOut(const LLSD& data)
+{
+ if (!getEnabled())
+ return false;
+
+ F32 loop_out_value = (F32)getChild<LLUICtrl>("loop_out_point")->getValue().asReal();
+ F32 loop_in_value = (F32)getChild<LLUICtrl>("loop_in_point")->getValue().asReal();
+
+ if (loop_out_value < 0.f)
+ {
+ loop_out_value = 0.f;
+ }
+ else if (loop_out_value > 100.f)
+ {
+ loop_out_value = 100.f;
+ }
+ else if (loop_out_value < loop_in_value)
+ {
+ loop_out_value = loop_in_value;
+ }
+
+ getChild<LLUICtrl>("loop_out_point")->setValue(LLSD(loop_out_value));
+ return true;
+}
+
+
+//-----------------------------------------------------------------------------
+// refresh()
+//-----------------------------------------------------------------------------
+void LLFloaterBvhPreview::refresh()
+{
+ // Are we showing the play button (default) or the pause button?
+ bool show_play = true;
+ if (!mAnimPreview)
+ {
+ getChildView("bad_animation_text")->setVisible(TRUE);
+ // play button visible but disabled
+ mPlayButton->setEnabled(FALSE);
+ mStopButton->setEnabled(FALSE);
+ getChildView("ok_btn")->setEnabled(FALSE);
+ }
+ else
+ {
+ getChildView("bad_animation_text")->setVisible(FALSE);
+ // re-enabled in case previous animation was bad
+ mPlayButton->setEnabled(TRUE);
+ mStopButton->setEnabled(TRUE);
+ LLVOAvatar* avatarp = mAnimPreview->getDummyAvatar();
+ if (avatarp->isMotionActive(mMotionID))
+ {
+ mStopButton->setEnabled(TRUE);
+ LLKeyframeMotion* motionp = (LLKeyframeMotion*)avatarp->findMotion(mMotionID);
+ if (!avatarp->areAnimationsPaused())
+ {
+ // animation is playing
+ if (motionp)
+ {
+ F32 fraction_complete = motionp->getLastUpdateTime() / motionp->getDuration();
+ getChild<LLUICtrl>("playback_slider")->setValue(fraction_complete);
+ }
+ show_play = false;
+ }
+ }
+ else
+ {
+ // Motion just finished playing
+ mPauseRequest = avatarp->requestPause();
+ }
+ getChildView("ok_btn")->setEnabled(TRUE);
+ mAnimPreview->requestUpdate();
+ }
+ mPlayButton->setVisible(show_play);
+ mPauseButton->setVisible(!show_play);
+}
+
+//-----------------------------------------------------------------------------
+// onBtnOK()
+//-----------------------------------------------------------------------------
+void LLFloaterBvhPreview::onBtnOK(void* userdata)
+{
+ LLFloaterBvhPreview* floaterp = (LLFloaterBvhPreview*)userdata;
+ if (!floaterp->getEnabled()) return;
+
+ if (floaterp->mAnimPreview)
+ {
+ LLKeyframeMotion* motionp = (LLKeyframeMotion*)floaterp->mAnimPreview->getDummyAvatar()->findMotion(floaterp->mMotionID);
+
+ S32 file_size = motionp->getFileSize();
+ U8* buffer = new U8[file_size];
+
+ LLDataPackerBinaryBuffer dp(buffer, file_size);
+ if (motionp->serialize(dp))
+ {
+ LLVFile file(gVFS, motionp->getID(), LLAssetType::AT_ANIMATION, LLVFile::APPEND);
+
+ S32 size = dp.getCurrentSize();
+ file.setMaxSize(size);
+ if (file.write((U8*)buffer, size))
+ {
+ std::string name = floaterp->getChild<LLUICtrl>("name_form")->getValue().asString();
+ std::string desc = floaterp->getChild<LLUICtrl>("description_form")->getValue().asString();
+ LLAssetStorage::LLStoreAssetCallback callback = NULL;
+ S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload();
+ void *userdata = NULL;
+ upload_new_resource(floaterp->mTransactionID, // tid
+ LLAssetType::AT_ANIMATION,
+ name,
+ desc,
+ 0,
+ LLFolderType::FT_NONE,
+ LLInventoryType::IT_ANIMATION,
+ LLFloaterPerms::getNextOwnerPerms(), LLFloaterPerms::getGroupPerms(), LLFloaterPerms::getEveryonePerms(),
+ name,
+ callback, expected_upload_cost, userdata);
+
+ }
+ else
+ {
+ llwarns << "Failure writing animation data." << llendl;
+ LLNotificationsUtil::add("WriteAnimationFail");
+ }
+ }
+
+ delete [] buffer;
+ // clear out cache for motion data
+ floaterp->mAnimPreview->getDummyAvatar()->removeMotion(floaterp->mMotionID);
+ LLKeyframeDataCache::removeKeyframeData(floaterp->mMotionID);
+ }
+
+ floaterp->closeFloater(false);
+}
+
+//-----------------------------------------------------------------------------
+// LLPreviewAnimation
+//-----------------------------------------------------------------------------
+LLPreviewAnimation::LLPreviewAnimation(S32 width, S32 height) : LLViewerDynamicTexture(width, height, 3, ORDER_MIDDLE, FALSE)
+{
+ mNeedsUpdate = TRUE;
+ mCameraDistance = PREVIEW_CAMERA_DISTANCE;
+ mCameraYaw = 0.f;
+ mCameraPitch = 0.f;
+ mCameraZoom = 1.f;
+
+ mDummyAvatar = (LLVOAvatar*)gObjectList.createObjectViewer(LL_PCODE_LEGACY_AVATAR, gAgent.getRegion());
+ mDummyAvatar->createDrawable(&gPipeline);
+ mDummyAvatar->mIsDummy = TRUE;
+ mDummyAvatar->mSpecialRenderMode = 1;
+ mDummyAvatar->setPositionAgent(LLVector3::zero);
+ mDummyAvatar->slamPosition();
+ mDummyAvatar->updateJointLODs();
+ mDummyAvatar->updateGeometry(mDummyAvatar->mDrawable);
+ mDummyAvatar->startMotion(ANIM_AGENT_STAND, BASE_ANIM_TIME_OFFSET);
+ mDummyAvatar->hideSkirt();
+
+ // stop extraneous animations
+ mDummyAvatar->stopMotion( ANIM_AGENT_HEAD_ROT, TRUE );
+ mDummyAvatar->stopMotion( ANIM_AGENT_EYE, TRUE );
+ mDummyAvatar->stopMotion( ANIM_AGENT_BODY_NOISE, TRUE );
+ mDummyAvatar->stopMotion( ANIM_AGENT_BREATHE_ROT, TRUE );
+}
+
+//-----------------------------------------------------------------------------
+// LLPreviewAnimation()
+//-----------------------------------------------------------------------------
+LLPreviewAnimation::~LLPreviewAnimation()
+{
+ mDummyAvatar->markDead();
+}
+
+//virtual
+S8 LLPreviewAnimation::getType() const
+{
+ return LLViewerDynamicTexture::LL_PREVIEW_ANIMATION ;
+}
+
+//-----------------------------------------------------------------------------
+// update()
+//-----------------------------------------------------------------------------
+BOOL LLPreviewAnimation::render()
+{
+ mNeedsUpdate = FALSE;
+ LLVOAvatar* avatarp = mDummyAvatar;
+
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.pushMatrix();
+ gGL.loadIdentity();
+ gGL.ortho(0.0f, mFullWidth, 0.0f, mFullHeight, -1.0f, 1.0f);
+
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.pushMatrix();
+ gGL.loadIdentity();
+
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gUIProgram.bind();
+ }
+
+ LLGLSUIDefault def;
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+ gGL.color4f(0.15f, 0.2f, 0.3f, 1.f);
+
+ gl_rect_2d_simple( mFullWidth, mFullHeight );
+
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.popMatrix();
+
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.popMatrix();
+
+ gGL.flush();
+
+ LLVector3 target_pos = avatarp->mRoot.getWorldPosition();
+
+ LLQuaternion camera_rot = LLQuaternion(mCameraPitch, LLVector3::y_axis) *
+ LLQuaternion(mCameraYaw, LLVector3::z_axis);
+
+ LLQuaternion av_rot = avatarp->mRoot.getWorldRotation() * camera_rot;
+ LLViewerCamera::getInstance()->setOriginAndLookAt(
+ target_pos + ((LLVector3(mCameraDistance, 0.f, 0.f) + mCameraOffset) * av_rot), // camera
+ LLVector3::z_axis, // up
+ target_pos + (mCameraOffset * av_rot) ); // point of interest
+
+ LLViewerCamera::getInstance()->setView(LLViewerCamera::getInstance()->getDefaultFOV() / mCameraZoom);
+ LLViewerCamera::getInstance()->setPerspective(FALSE, mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight, FALSE);
+
+ mCameraRelPos = LLViewerCamera::getInstance()->getOrigin() - avatarp->mHeadp->getWorldPosition();
+
+ //avatarp->setAnimationData("LookAtPoint", (void *)&mCameraRelPos);
+
+ //SJB: Animation is updated in LLVOAvatar::updateCharacter
+
+ if (avatarp->mDrawable.notNull())
+ {
+ avatarp->updateLOD();
+
+ LLVertexBuffer::unbind();
+ LLGLDepthTest gls_depth(GL_TRUE);
+
+ LLDrawPoolAvatar *avatarPoolp = (LLDrawPoolAvatar *)avatarp->mDrawable->getFace(0)->getPool();
+ avatarp->dirtyMesh();
+ avatarPoolp->renderAvatars(avatarp); // renders only one avatar
+ }
+
+ gGL.color4f(1,1,1,1);
+ return TRUE;
+}
+
+//-----------------------------------------------------------------------------
+// requestUpdate()
+//-----------------------------------------------------------------------------
+void LLPreviewAnimation::requestUpdate()
+{
+ mNeedsUpdate = TRUE;
+}
+
+//-----------------------------------------------------------------------------
+// rotate()
+//-----------------------------------------------------------------------------
+void LLPreviewAnimation::rotate(F32 yaw_radians, F32 pitch_radians)
+{
+ mCameraYaw = mCameraYaw + yaw_radians;
+
+ mCameraPitch = llclamp(mCameraPitch + pitch_radians, F_PI_BY_TWO * -0.8f, F_PI_BY_TWO * 0.8f);
+}
+
+//-----------------------------------------------------------------------------
+// zoom()
+//-----------------------------------------------------------------------------
+void LLPreviewAnimation::zoom(F32 zoom_delta)
+{
+ setZoom(mCameraZoom + zoom_delta);
+}
+
+//-----------------------------------------------------------------------------
+// setZoom()
+//-----------------------------------------------------------------------------
+void LLPreviewAnimation::setZoom(F32 zoom_amt)
+{
+ mCameraZoom = llclamp(zoom_amt, MIN_CAMERA_ZOOM, MAX_CAMERA_ZOOM);
+}
+
+//-----------------------------------------------------------------------------
+// pan()
+//-----------------------------------------------------------------------------
+void LLPreviewAnimation::pan(F32 right, F32 up)
+{
+ mCameraOffset.mV[VY] = llclamp(mCameraOffset.mV[VY] + right * mCameraDistance / mCameraZoom, -1.f, 1.f);
+ mCameraOffset.mV[VZ] = llclamp(mCameraOffset.mV[VZ] + up * mCameraDistance / mCameraZoom, -1.f, 1.f);
+}
+
+
+
diff --git a/indra/newview/llfloaterbvhpreview.h b/indra/newview/llfloaterbvhpreview.h
new file mode 100644
index 0000000000..b81cc6e3a5
--- /dev/null
+++ b/indra/newview/llfloaterbvhpreview.h
@@ -0,0 +1,132 @@
+/**
+ * @file llfloaterbvhpreview.h
+ * @brief LLFloaterBvhPreview class definition
+ *
+ * $LicenseInfo:firstyear=2004&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLFLOATERBVHPREVIEW_H
+#define LL_LLFLOATERBVHPREVIEW_H
+
+#include "llassettype.h"
+#include "llfloaternamedesc.h"
+#include "lldynamictexture.h"
+#include "llcharacter.h"
+#include "llquaternion.h"
+#include "llextendedstatus.h"
+
+class LLVOAvatar;
+class LLViewerJointMesh;
+
+class LLPreviewAnimation : public LLViewerDynamicTexture
+{
+protected:
+ virtual ~LLPreviewAnimation();
+
+public:
+ LLPreviewAnimation(S32 width, S32 height);
+
+ /*virtual*/ S8 getType() const ;
+
+ BOOL render();
+ void requestUpdate();
+ void rotate(F32 yaw_radians, F32 pitch_radians);
+ void zoom(F32 zoom_delta);
+ void setZoom(F32 zoom_amt);
+ void pan(F32 right, F32 up);
+ virtual BOOL needsUpdate() { return mNeedsUpdate; }
+
+ LLVOAvatar* getDummyAvatar() { return mDummyAvatar; }
+
+protected:
+ BOOL mNeedsUpdate;
+ F32 mCameraDistance;
+ F32 mCameraYaw;
+ F32 mCameraPitch;
+ F32 mCameraZoom;
+ LLVector3 mCameraOffset;
+ LLVector3 mCameraRelPos;
+ LLPointer<LLVOAvatar> mDummyAvatar;
+};
+
+class LLFloaterBvhPreview : public LLFloaterNameDesc
+{
+public:
+ LLFloaterBvhPreview(const std::string& filename);
+ virtual ~LLFloaterBvhPreview();
+
+ BOOL postBuild();
+
+ BOOL handleMouseDown(S32 x, S32 y, MASK mask);
+ BOOL handleMouseUp(S32 x, S32 y, MASK mask);
+ BOOL handleHover(S32 x, S32 y, MASK mask);
+ BOOL handleScrollWheel(S32 x, S32 y, S32 clicks);
+ void onMouseCaptureLost();
+
+ void refresh();
+
+ void onBtnPlay();
+ void onBtnPause();
+ void onBtnStop();
+ void onSliderMove();
+ void onCommitBaseAnim();
+ void onCommitLoop();
+ void onCommitLoopIn();
+ void onCommitLoopOut();
+ bool validateLoopIn(const LLSD& data);
+ bool validateLoopOut(const LLSD& data);
+ void onCommitName();
+ void onCommitHandPose();
+ void onCommitEmote();
+ void onCommitPriority();
+ void onCommitEaseIn();
+ void onCommitEaseOut();
+ bool validateEaseIn(const LLSD& data);
+ bool validateEaseOut(const LLSD& data);
+ static void onBtnOK(void*);
+ static void onSaveComplete(const LLUUID& asset_uuid,
+ LLAssetType::EType type,
+ void* user_data,
+ S32 status, LLExtStat ext_status);
+private:
+ void setAnimCallbacks() ;
+
+protected:
+ void draw();
+ void resetMotion();
+
+ LLPointer< LLPreviewAnimation > mAnimPreview;
+ S32 mLastMouseX;
+ S32 mLastMouseY;
+ LLButton* mPlayButton;
+ LLButton* mPauseButton;
+ LLButton* mStopButton;
+ LLRect mPreviewRect;
+ LLRectf mPreviewImageRect;
+ LLAssetID mMotionID;
+ LLTransactionID mTransactionID;
+ LLAnimPauseRequest mPauseRequest;
+
+ std::map<std::string, LLUUID> mIDList;
+};
+
+#endif // LL_LLFLOATERBVHPREVIEW_H
diff --git a/indra/newview/llfloatercamera.cpp b/indra/newview/llfloatercamera.cpp
index ad24c6534a..21b58d3e3d 100644
--- a/indra/newview/llfloatercamera.cpp
+++ b/indra/newview/llfloatercamera.cpp
@@ -36,10 +36,11 @@
#include "lljoystickbutton.h"
#include "llviewercontrol.h"
#include "llviewercamera.h"
-#include "llbottomtray.h"
#include "lltoolmgr.h"
#include "lltoolfocus.h"
#include "llslider.h"
+#include "llfirstuse.h"
+#include "llhints.h"
static LLDefaultChildRegistry::Register<LLPanelCameraItem> r("panel_camera_item");
@@ -73,6 +74,8 @@ protected:
void onZoomPlusHeldDown();
void onZoomMinusHeldDown();
void onSliderValueChanged();
+ void onCameraTrack();
+ void onCameraRotate();
F32 getOrbitRate(F32 time);
private:
@@ -162,6 +165,8 @@ LLPanelCameraZoom::LLPanelCameraZoom()
mCommitCallbackRegistrar.add("Zoom.minus", boost::bind(&LLPanelCameraZoom::onZoomMinusHeldDown, this));
mCommitCallbackRegistrar.add("Zoom.plus", boost::bind(&LLPanelCameraZoom::onZoomPlusHeldDown, this));
mCommitCallbackRegistrar.add("Slider.value_changed", boost::bind(&LLPanelCameraZoom::onSliderValueChanged, this));
+ mCommitCallbackRegistrar.add("Camera.track", boost::bind(&LLPanelCameraZoom::onCameraTrack, this));
+ mCommitCallbackRegistrar.add("Camera.rotate", boost::bind(&LLPanelCameraZoom::onCameraRotate, this));
}
BOOL LLPanelCameraZoom::postBuild()
@@ -198,6 +203,18 @@ void LLPanelCameraZoom::onZoomMinusHeldDown()
gAgentCamera.setOrbitOutKey(getOrbitRate(time));
}
+void LLPanelCameraZoom::onCameraTrack()
+{
+ // EXP-202 when camera panning activated, remove the hint
+ LLFirstUse::viewPopup( false );
+}
+
+void LLPanelCameraZoom::onCameraRotate()
+{
+ // EXP-202 when camera rotation activated, remove the hint
+ LLFirstUse::viewPopup( false );
+}
+
F32 LLPanelCameraZoom::getOrbitRate(F32 time)
{
if( time < NUDGE_TIME )
@@ -294,11 +311,7 @@ LLFloaterCamera* LLFloaterCamera::findInstance()
void LLFloaterCamera::onOpen(const LLSD& key)
{
- LLButton *anchor_panel = LLBottomTray::getInstance()->getChild<LLButton>("camera_btn");
-
- setDockControl(new LLDockControl(
- anchor_panel, this,
- getDockTongue(), LLDockControl::TOP));
+ LLFirstUse::viewPopup();
mZoom->onOpen(key);
@@ -323,26 +336,24 @@ void LLFloaterCamera::onClose(bool app_quitting)
if (mCurrMode == CAMERA_CTRL_MODE_PAN)
mPrevMode = CAMERA_CTRL_MODE_PAN;
- // HACK: Should always close as docked to prevent toggleInstance without calling onOpen.
- if ( !isDocked() )
- setDocked(true);
switchMode(CAMERA_CTRL_MODE_PAN);
mClosed = TRUE;
}
LLFloaterCamera::LLFloaterCamera(const LLSD& val)
-: LLTransientDockableFloater(NULL, true, val),
+: LLFloater(val),
mClosed(FALSE),
mCurrMode(CAMERA_CTRL_MODE_PAN),
mPrevMode(CAMERA_CTRL_MODE_PAN)
{
+ LLHints::registerHintTarget("view_popup", getHandle());
+ mCommitCallbackRegistrar.add("CameraPresets.ChangeView", boost::bind(&LLFloaterCamera::onClickCameraItem, _2));
}
// virtual
BOOL LLFloaterCamera::postBuild()
{
- setIsChrome(TRUE);
- setTitleVisible(TRUE); // restore title visibility after chrome applying
+ updateTransparency(TT_ACTIVE); // force using active floater transparency (STORM-730)
mRotate = getChild<LLJoystickCameraRotate>(ORBIT);
mZoom = findChild<LLPanelCameraZoom>(ZOOM);
@@ -357,7 +368,7 @@ BOOL LLFloaterCamera::postBuild()
// ensure that appearance mode is handled while building. See EXT-7796.
handleAvatarEditingAppearance(sAppearanceEditing);
- return LLDockableFloater::postBuild();
+ return LLFloater::postBuild();
}
void LLFloaterCamera::fillFlatlistFromPanel (LLFlatListView* list, LLPanel* panel)
@@ -422,26 +433,6 @@ void LLFloaterCamera::setMode(ECameraControlMode mode)
updateState();
}
-void LLFloaterCamera::setModeTitle(const ECameraControlMode mode)
-{
- std::string title;
- switch(mode)
- {
- case CAMERA_CTRL_MODE_MODES:
- title = getString("camera_modes_title");
- break;
- case CAMERA_CTRL_MODE_PAN:
- title = getString("pan_mode_title");
- break;
- case CAMERA_CTRL_MODE_PRESETS:
- title = getString("presets_mode_title");
- break;
- default:
- break;
- }
- setTitle(title);
-}
-
void LLFloaterCamera::switchMode(ECameraControlMode mode)
{
setMode(mode);
@@ -521,7 +512,6 @@ void LLFloaterCamera::updateState()
{
iter->second->setToggleState(iter->first == mCurrMode);
}
- setModeTitle(mCurrMode);
}
void LLFloaterCamera::updateItemsSelection()
diff --git a/indra/newview/llfloatercamera.h b/indra/newview/llfloatercamera.h
index 424191ef26..4d6d03f22d 100644
--- a/indra/newview/llfloatercamera.h
+++ b/indra/newview/llfloatercamera.h
@@ -27,7 +27,7 @@
#ifndef LLFLOATERCAMERA_H
#define LLFLOATERCAMERA_H
-#include "lltransientdockablefloater.h"
+#include "llfloater.h"
#include "lliconctrl.h"
#include "lltextbox.h"
#include "llflatlistview.h"
@@ -45,8 +45,7 @@ enum ECameraControlMode
CAMERA_CTRL_MODE_PRESETS
};
-class LLFloaterCamera
- : public LLTransientDockableFloater
+class LLFloaterCamera : public LLFloater
{
friend class LLFloaterReg;
@@ -103,9 +102,6 @@ private:
/* sets a new mode preserving previous one and updates ui*/
void setMode(ECameraControlMode mode);
- /** set title appropriate to passed mode */
- void setModeTitle(const ECameraControlMode mode);
-
/* updates the state (UI) according to the current mode */
void updateState();
diff --git a/indra/newview/llfloaterchat.cpp b/indra/newview/llfloaterchat.cpp
deleted file mode 100644
index c2c2e7fe22..0000000000
--- a/indra/newview/llfloaterchat.cpp
+++ /dev/null
@@ -1,484 +0,0 @@
-/**
- * @file llfloaterchat.cpp
- * @brief LLFloaterChat class implementation
- *
- * $LicenseInfo:firstyear=2002&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-/**
- * Actually the "Chat History" floater.
- * Should be llfloaterchathistory, not llfloaterchat.
- */
-
-#include "llviewerprecompiledheaders.h"
-
-// project include
-#include "llagent.h"
-#include "llappviewer.h"
-#include "llbutton.h"
-#include "llcheckboxctrl.h"
-#include "llcombobox.h"
-#include "llconsole.h"
-#include "llfloateractivespeakers.h"
-#include "llfloaterchatterbox.h"
-#include "llfloaterreg.h"
-#include "llfloaterscriptdebug.h"
-#include "llkeyboard.h"
-//#include "lllineeditor.h"
-#include "llmutelist.h"
-//#include "llresizehandle.h"
-#include "llchatbar.h"
-#include "llrecentpeople.h"
-#include "llpanelblockedlist.h"
-#include "llslurl.h"
-#include "llstatusbar.h"
-#include "llviewertexteditor.h"
-#include "llviewergesture.h" // for triggering gestures
-#include "llviewermessage.h"
-#include "llviewerwindow.h"
-#include "llviewercontrol.h"
-#include "lluictrlfactory.h"
-#include "lllogchat.h"
-#include "lltexteditor.h"
-#include "lltextparser.h"
-#include "llweb.h"
-#include "llstylemap.h"
-
-// linden library includes
-#include "llaudioengine.h"
-#include "llchat.h"
-#include "llfontgl.h"
-#include "llrect.h"
-#include "llerror.h"
-#include "llstring.h"
-#include "llwindow.h"
-#include "message.h"
-
-//
-// Constants
-//
-const F32 INSTANT_MSG_SIZE = 8.0f;
-const F32 CHAT_MSG_SIZE = 8.0f;
-
-
-//
-// Global statics
-//
-LLColor4 get_text_color(const LLChat& chat);
-
-//
-// Member Functions
-//
-LLFloaterChat::LLFloaterChat(const LLSD& seed)
- : LLFloater(seed),
- mPanel(NULL)
-{
- mFactoryMap["chat_panel"] = LLCallbackMap(createChatPanel, NULL);
- mFactoryMap["active_speakers_panel"] = LLCallbackMap(createSpeakersPanel, NULL);
- //Called from floater reg: LLUICtrlFactory::getInstance()->buildFloater(this,"floater_chat_history.xml");
-
-}
-
-LLFloaterChat::~LLFloaterChat()
-{
- // Children all cleaned up by default view destructor.
-}
-
-void LLFloaterChat::draw()
-{
- // enable say and shout only when text available
-
- childSetValue("toggle_active_speakers_btn", childIsVisible("active_speakers_panel"));
-
- LLChatBar* chat_barp = findChild<LLChatBar>("chat_panel", TRUE);
- if (chat_barp)
- {
- chat_barp->refresh();
- }
-
- mPanel->refreshSpeakers();
- LLFloater::draw();
-}
-
-BOOL LLFloaterChat::postBuild()
-{
- // Hide the chat overlay when our history is visible.
- setVisibleCallback(boost::bind(&LLFloaterChat::updateConsoleVisibility, this));
-
- mPanel = (LLPanelActiveSpeakers*)getChild<LLPanel>("active_speakers_panel");
-
- childSetCommitCallback("show mutes",onClickToggleShowMute,this); //show mutes
- childSetVisible("Chat History Editor with mute",FALSE);
- childSetAction("toggle_active_speakers_btn", onClickToggleActiveSpeakers, this);
-
- return TRUE;
-}
-
-void LLFloaterChat::updateConsoleVisibility()
-{
- if(gDisconnected)
- {
- return;
- }
- // determine whether we should show console due to not being visible
- gConsole->setVisible( !isInVisibleChain() // are we not in part of UI being drawn?
- || isMinimized() // are we minimized?
- || (getHost() && getHost()->isMinimized() )); // are we hosted in a minimized floater?
-}
-
-void add_timestamped_line(LLViewerTextEditor* edit, LLChat chat, const LLColor4& color)
-{
- std::string line = chat.mText;
- bool prepend_newline = true;
- if (gSavedSettings.getBOOL("ChatShowTimestamps"))
- {
- edit->appendTime(prepend_newline);
- prepend_newline = false;
- }
-
- // If the msg is from an agent (not yourself though),
- // extract out the sender name and replace it with the hotlinked name.
- if (chat.mSourceType == CHAT_SOURCE_AGENT &&
- chat.mFromID != LLUUID::null)
- {
- chat.mURL = LLSLURL("agent", chat.mFromID, "inspect").getSLURLString();
- }
-
- // If the chat line has an associated url, link it up to the name.
- if (!chat.mURL.empty()
- && (line.length() > chat.mFromName.length() && line.find(chat.mFromName,0) == 0))
- {
- std::string start_line = line.substr(0, chat.mFromName.length() + 1);
- line = line.substr(chat.mFromName.length() + 1);
- edit->appendText(start_line, prepend_newline, LLStyleMap::instance().lookup(chat.mFromID,chat.mURL));
- edit->blockUndo();
- prepend_newline = false;
- }
- edit->appendText(line, prepend_newline, LLStyle::Params().color(color));
- edit->blockUndo();
-}
-
-// static
-void LLFloaterChat::addChatHistory(const LLChat& chat, bool log_to_file)
-{
- if (log_to_file && (gSavedPerAccountSettings.getBOOL("LogChat")))
- {
- if (chat.mChatType != CHAT_TYPE_WHISPER && chat.mChatType != CHAT_TYPE_SHOUT)
- {
- LLLogChat::saveHistory("chat", chat.mFromName, chat.mFromID, chat.mText);
- }
- else
- {
- LLLogChat::saveHistory("chat", "", chat.mFromID, chat.mFromName + " " + chat.mText);
- }
- }
-
- LLColor4 color = get_text_color(chat);
-
- if (!log_to_file) color = LLColor4::grey; //Recap from log file.
-
- if (chat.mChatType == CHAT_TYPE_DEBUG_MSG)
- {
- if(gSavedSettings.getBOOL("ShowScriptErrors") == FALSE)
- return;
- if (gSavedSettings.getS32("ShowScriptErrorsLocation") == 1)
- {
- LLFloaterScriptDebug::addScriptLine(chat.mText,
- chat.mFromName,
- color,
- chat.mFromID);
- return;
- }
- }
-
- // could flash the chat button in the status bar here. JC
- LLFloaterChat* chat_floater = LLFloaterChat::getInstance();
- LLViewerTextEditor* history_editor = chat_floater->getChild<LLViewerTextEditor>("Chat History Editor");
- LLViewerTextEditor* history_editor_with_mute = chat_floater->getChild<LLViewerTextEditor>("Chat History Editor with mute");
-
- if (!chat.mMuted)
- {
- add_timestamped_line(history_editor, chat, color);
- add_timestamped_line(history_editor_with_mute, chat, color);
- }
- else
- {
- // desaturate muted chat
- LLColor4 muted_color = lerp(color, LLColor4::grey, 0.5f);
- add_timestamped_line(history_editor_with_mute, chat, color);
- }
-
- // add objects as transient speakers that can be muted
- if (chat.mSourceType == CHAT_SOURCE_OBJECT)
- {
- chat_floater->mPanel->setSpeaker(chat.mFromID, chat.mFromName, LLSpeaker::STATUS_NOT_IN_CHANNEL, LLSpeaker::SPEAKER_OBJECT);
- }
-
- // start tab flashing on incoming text from other users (ignoring system text, etc)
- if (!chat_floater->isInVisibleChain() && chat.mSourceType == CHAT_SOURCE_AGENT)
- {
- LLFloaterChatterBox::getInstance()->setFloaterFlashing(chat_floater, TRUE);
- }
-}
-
-// static
-void LLFloaterChat::setHistoryCursorAndScrollToEnd()
-{
- LLViewerTextEditor* history_editor = LLFloaterChat::getInstance()->getChild<LLViewerTextEditor>("Chat History Editor");
- LLViewerTextEditor* history_editor_with_mute = LLFloaterChat::getInstance()->getChild<LLViewerTextEditor>("Chat History Editor with mute");
-
- if (history_editor)
- {
- history_editor->setCursorAndScrollToEnd();
- }
- if (history_editor_with_mute)
- {
- history_editor_with_mute->setCursorAndScrollToEnd();
- }
-}
-
-
-//static
-void LLFloaterChat::onClickMute(void *data)
-{
- LLFloaterChat* self = (LLFloaterChat*)data;
-
- LLComboBox* chatter_combo = self->getChild<LLComboBox>("chatter combobox");
-
- const std::string& name = chatter_combo->getSimple();
- LLUUID id = chatter_combo->getCurrentID();
-
- if (name.empty()) return;
-
- LLMute mute(id);
- mute.setFromDisplayName(name);
- LLMuteList::getInstance()->add(mute);
- LLPanelBlockedList::showPanelAndSelect(mute.mID);
-}
-
-//static
-void LLFloaterChat::onClickToggleShowMute(LLUICtrl* caller, void *data)
-{
- LLFloaterChat* floater = (LLFloaterChat*)data;
-
-
- //LLCheckBoxCtrl*
- BOOL show_mute = floater->getChild<LLCheckBoxCtrl>("show mutes")->get();
- LLViewerTextEditor* history_editor = floater->getChild<LLViewerTextEditor>("Chat History Editor");
- LLViewerTextEditor* history_editor_with_mute = floater->getChild<LLViewerTextEditor>("Chat History Editor with mute");
-
- if (!history_editor || !history_editor_with_mute)
- return;
-
- //BOOL show_mute = floater->mShowMuteCheckBox->get();
- if (show_mute)
- {
- history_editor->setVisible(FALSE);
- history_editor_with_mute->setVisible(TRUE);
- history_editor_with_mute->setCursorAndScrollToEnd();
- }
- else
- {
- history_editor->setVisible(TRUE);
- history_editor_with_mute->setVisible(FALSE);
- history_editor->setCursorAndScrollToEnd();
- }
-}
-
-// Put a line of chat in all the right places
-void LLFloaterChat::addChat(const LLChat& chat, BOOL local_agent)
-{
- triggerAlerts(chat.mText);
-
- // Add the sender to the list of people with which we've recently interacted.
- // this is not the best place to add _all_ messages to recent list
- // comment this for now, may remove later on code cleanup
- //if(chat.mSourceType == CHAT_SOURCE_AGENT && chat.mFromID.notNull())
- // LLRecentPeople::instance().add(chat.mFromID);
-
- addChatHistory(chat, true);
-}
-
-// Moved from lltextparser.cpp to break llui/llaudio library dependency.
-//static
-void LLFloaterChat::triggerAlerts(const std::string& text)
-{
- LLTextParser* parser = LLTextParser::getInstance();
-// bool spoken=FALSE;
- for (S32 i=0;i<parser->mHighlights.size();i++)
- {
- LLSD& highlight = parser->mHighlights[i];
- if (parser->findPattern(text,highlight) >= 0 )
- {
- if(gAudiop)
- {
- if ((std::string)highlight["sound_lluuid"] != LLUUID::null.asString())
- {
- gAudiop->triggerSound(highlight["sound_lluuid"].asUUID(),
- gAgent.getID(),
- 1.f,
- LLAudioEngine::AUDIO_TYPE_UI,
- gAgent.getPositionGlobal() );
- }
-/*
- if (!spoken)
- {
- LLTextToSpeech* text_to_speech = NULL;
- text_to_speech = LLTextToSpeech::getInstance();
- spoken = text_to_speech->speak((LLString)highlight["voice"],text);
- }
- */
- }
- if (highlight["flash"])
- {
- LLWindow* viewer_window = gViewerWindow->getWindow();
- if (viewer_window && viewer_window->getMinimized())
- {
- viewer_window->flashIcon(5.f);
- }
- }
- }
- }
-}
-
-LLColor4 get_text_color(const LLChat& chat)
-{
- LLColor4 text_color;
-
- if(chat.mMuted)
- {
- text_color.setVec(0.8f, 0.8f, 0.8f, 1.f);
- }
- else
- {
- switch(chat.mSourceType)
- {
- case CHAT_SOURCE_SYSTEM:
- text_color = LLUIColorTable::instance().getColor("SystemChatColor");
- break;
- case CHAT_SOURCE_AGENT:
- if (chat.mFromID.isNull())
- {
- text_color = LLUIColorTable::instance().getColor("SystemChatColor");
- }
- else
- {
- if(gAgent.getID() == chat.mFromID)
- {
- text_color = LLUIColorTable::instance().getColor("UserChatColor");
- }
- else
- {
- text_color = LLUIColorTable::instance().getColor("AgentChatColor");
- }
- }
- break;
- case CHAT_SOURCE_OBJECT:
- if (chat.mChatType == CHAT_TYPE_DEBUG_MSG)
- {
- text_color = LLUIColorTable::instance().getColor("ScriptErrorColor");
- }
- else if ( chat.mChatType == CHAT_TYPE_OWNER )
- {
- text_color = LLUIColorTable::instance().getColor("llOwnerSayChatColor");
- }
- else
- {
- text_color = LLUIColorTable::instance().getColor("ObjectChatColor");
- }
- break;
- default:
- text_color.setToWhite();
- }
-
- if (!chat.mPosAgent.isExactlyZero())
- {
- LLVector3 pos_agent = gAgent.getPositionAgent();
- F32 distance = dist_vec(pos_agent, chat.mPosAgent);
- if (distance > gAgent.getNearChatRadius())
- {
- // diminish far-off chat
- text_color.mV[VALPHA] = 0.8f;
- }
- }
- }
-
- return text_color;
-}
-
-//static
-void LLFloaterChat::loadHistory()
-{
- LLLogChat::loadHistory(std::string("chat"), &chatFromLogFile, (void *)LLFloaterChat::getInstance());
-}
-
-//static
-void LLFloaterChat::chatFromLogFile(LLLogChat::ELogLineType type , const LLSD& line, void* userdata)
-{
- switch (type)
- {
- case LLLogChat::LOG_EMPTY:
- case LLLogChat::LOG_END:
- // *TODO: nice message from XML file here
- break;
- case LLLogChat::LOG_LINE:
- case LLLogChat::LOG_LLSD:
- {
- LLChat chat;
- chat.mText = line["message"].asString();
- get_text_color(chat);
- addChatHistory(chat, FALSE);
- }
- break;
- default:
- // nothing
- break;
- }
-}
-
-//static
-void* LLFloaterChat::createSpeakersPanel(void* data)
-{
- return new LLPanelActiveSpeakers(LLLocalSpeakerMgr::getInstance(), TRUE);
-}
-
-//static
-void* LLFloaterChat::createChatPanel(void* data)
-{
- LLChatBar* chatp = new LLChatBar();
- return chatp;
-}
-
-// static
-void LLFloaterChat::onClickToggleActiveSpeakers(void* userdata)
-{
- LLFloaterChat* self = (LLFloaterChat*)userdata;
-
- self->childSetVisible("active_speakers_panel", !self->childIsVisible("active_speakers_panel"));
-}
-
-//static
- LLFloaterChat* LLFloaterChat::getInstance()
- {
- return LLFloaterReg::getTypedInstance<LLFloaterChat>("chat", LLSD()) ;
-
- }
diff --git a/indra/newview/llfloaterchat.h b/indra/newview/llfloaterchat.h
deleted file mode 100644
index fb2aabbfdf..0000000000
--- a/indra/newview/llfloaterchat.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/**
- * @file llfloaterchat.h
- * @brief LLFloaterChat class definition
- *
- * $LicenseInfo:firstyear=2002&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-/*
- * Actually the "Chat History" floater.
- * Should be llfloaterchathistory, not llfloaterchat.
- */
-
-#ifndef LL_LLFLOATERCHAT_H
-#define LL_LLFLOATERCHAT_H
-
-#include "llfloater.h"
-#include "lllogchat.h"
-
-class LLChat;
-class LLPanelActiveSpeakers;
-class LLLogChat;
-
-class LLFloaterChat : public LLFloater
-{
-public:
- LLFloaterChat(const LLSD& seed);
- ~LLFloaterChat();
-
- virtual void draw();
- virtual BOOL postBuild();
-
- void updateConsoleVisibility();
-
- static void setHistoryCursorAndScrollToEnd();
-
- // *TODO:Skinning - move these to LLChat (or LLViewerChat?)
- // Add chat to console and history list.
- // Color based on source, type, distance.
- static void addChat(const LLChat& chat, BOOL local_agent = FALSE);
- // Add chat to history alone.
- static void addChatHistory(const LLChat& chat, bool log_to_file = true);
-
- static void triggerAlerts(const std::string& text);
-
- static void onClickMute(void *data);
- static void onClickToggleShowMute(LLUICtrl* caller, void *data);
- static void onClickToggleActiveSpeakers(void* userdata);
- static void chatFromLogFile(LLLogChat::ELogLineType type, const LLSD& line, void* userdata);
- static void loadHistory();
- static void* createSpeakersPanel(void* data);
- static void* createChatPanel(void* data);
-
- static LLFloaterChat* getInstance(); // *TODO:Skinning Deprecate
-
- LLPanelActiveSpeakers* mPanel;
- BOOL mScrolledToEnd;
-};
-
-#endif
diff --git a/indra/newview/llfloaterchatterbox.cpp b/indra/newview/llfloaterchatterbox.cpp
deleted file mode 100644
index dc33e45dd4..0000000000
--- a/indra/newview/llfloaterchatterbox.cpp
+++ /dev/null
@@ -1,344 +0,0 @@
-/**
- * @file llfloaterchatterbox.cpp
- * @author Richard
- * @date 2007-05-08
- * @brief Implementation of the chatterbox integrated conversation ui
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llfloaterreg.h"
-#include "llfloaterchatterbox.h"
-#include "lluictrlfactory.h"
-#include "llfloaterfriends.h"
-#include "llfloatergroups.h"
-#include "llviewercontrol.h"
-#include "llvoicechannel.h"
-#include "llimpanel.h"
-#include "llimview.h"
-
-//
-// LLFloaterMyFriends
-//
-
-LLFloaterMyFriends::LLFloaterMyFriends(const LLSD& seed)
- : LLFloater(seed)
-{
- mFactoryMap["friends_panel"] = LLCallbackMap(LLFloaterMyFriends::createFriendsPanel, NULL);
- mFactoryMap["groups_panel"] = LLCallbackMap(LLFloaterMyFriends::createGroupsPanel, NULL);
- //Called from floater reg: LLUICtrlFactory::getInstance()->buildFloater(this, "floater_my_friends.xml");
-}
-
-LLFloaterMyFriends::~LLFloaterMyFriends()
-{
-}
-
-BOOL LLFloaterMyFriends::postBuild()
-{
- return TRUE;
-}
-
-void LLFloaterMyFriends::onOpen(const LLSD& key)
-{
- if (key.asString() == "friends")
- {
- childShowTab("friends_and_groups", "friends_panel");
- }
- else if (key.asString() == "groups")
- {
- childShowTab("friends_and_groups", "groups_panel");
- }
-}
-
-//static
-void* LLFloaterMyFriends::createFriendsPanel(void* data)
-{
- return new LLPanelFriends();
-}
-
-//static
-void* LLFloaterMyFriends::createGroupsPanel(void* data)
-{
- return new LLPanelGroups();
-}
-
-//static
-LLFloaterMyFriends* LLFloaterMyFriends::getInstance()
-{
- return LLFloaterReg::getTypedInstance<LLFloaterMyFriends>("contacts", "friends") ;
-}
-
-//
-// LLFloaterChatterBox
-//
-LLFloaterChatterBox::LLFloaterChatterBox(const LLSD& seed)
-: LLMultiFloater(seed),
- mActiveVoiceFloater(NULL)
-{
- mAutoResize = FALSE;
-
- //Called from floater reg: LLUICtrlFactory::getInstance()->buildFloater(this, "floater_chatterbox.xml", FALSE);
-}
-
-LLFloaterChatterBox::~LLFloaterChatterBox()
-{
-}
-
-BOOL LLFloaterChatterBox::postBuild()
-{
- setVisibleCallback(boost::bind(&LLFloaterChatterBox::onVisibilityChange, this, _2));
-
- if (gSavedSettings.getBOOL("ContactsTornOff"))
- {
- LLFloaterMyFriends* floater_contacts = LLFloaterMyFriends::getInstance();
- if(floater_contacts)
- {
- // add then remove to set up relationship for re-attach
- addFloater(floater_contacts, FALSE);
- removeFloater(floater_contacts);
- // reparent to floater view
- gFloaterView->addChild(floater_contacts);
- }
- }
- else
- {
- addFloater(LLFloaterMyFriends::getInstance(), TRUE);
- }
-
- mTabContainer->lockTabs();
- return TRUE;
-}
-
-BOOL LLFloaterChatterBox::handleKeyHere(KEY key, MASK mask)
-{
- if (key == 'W' && mask == MASK_CONTROL)
- {
- LLFloater* floater = getActiveFloater();
- // is user closeable and is system closeable
- if (floater && floater->canClose())
- {
- if (floater->isCloseable())
- {
- floater->closeFloater();
- }
- else
- {
- // close chatterbox window if frontmost tab is reserved, non-closeable tab
- // such as contacts or near me
- closeFloater();
- }
- }
- return TRUE;
- }
-
- return LLMultiFloater::handleKeyHere(key, mask);
-}
-
-void LLFloaterChatterBox::draw()
-{
- // clear new im notifications when chatterbox is visible
- if (!isMinimized())
- {
- gIMMgr->clearNewIMNotification();
- }
- LLFloater* current_active_floater = getCurrentVoiceFloater();
- // set icon on tab for floater currently associated with active voice channel
- if(mActiveVoiceFloater != current_active_floater)
- {
- // remove image from old floater's tab
- if (mActiveVoiceFloater)
- {
- mTabContainer->setTabImage(mActiveVoiceFloater, "");
- }
- }
-
- // update image on current active tab
- if (current_active_floater)
- {
- LLColor4 icon_color = LLColor4::white;
- LLVoiceChannel* channelp = LLVoiceChannel::getCurrentVoiceChannel();
- if (channelp)
- {
- if (channelp->isActive())
- {
- icon_color = LLColor4::green;
- }
- else if (channelp->getState() == LLVoiceChannel::STATE_ERROR)
- {
- icon_color = LLColor4::red;
- }
- else // active, but not connected
- {
- icon_color = LLColor4::yellow;
- }
- }
- mTabContainer->setTabImage(current_active_floater, "active_voice_tab.tga", icon_color);
- }
-
- mActiveVoiceFloater = current_active_floater;
-
- LLMultiFloater::draw();
-}
-
-void LLFloaterChatterBox::onOpen(const LLSD& key)
-{
- //*TODO:Skinning show the session id associated with key
- if (key.asString() == "local")
- {
- }
- else if (key.isDefined())
- {
- /*LLFloaterIMPanel* impanel = gIMMgr->findFloaterBySession(key.asUUID());
- if (impanel)
- {
- impanel->openFloater();
- }*/
- }
-}
-
-void LLFloaterChatterBox::onVisibilityChange ( const LLSD& new_visibility )
-{
-}
-
-void LLFloaterChatterBox::removeFloater(LLFloater* floaterp)
-{
- if(!floaterp) return;
-
- if (floaterp->getName() == "chat floater")
- {
- // only my friends floater now locked
- mTabContainer->lockTabs(mTabContainer->getNumLockedTabs() - 1);
- gSavedSettings.setBOOL("ChatHistoryTornOff", TRUE);
- floaterp->setCanClose(TRUE);
- }
- else if (floaterp->getName() == "floater_my_friends")
- {
- // only chat floater now locked
- mTabContainer->lockTabs(mTabContainer->getNumLockedTabs() - 1);
- gSavedSettings.setBOOL("ContactsTornOff", TRUE);
- floaterp->setCanClose(TRUE);
- }
- LLMultiFloater::removeFloater(floaterp);
-}
-
-void LLFloaterChatterBox::addFloater(LLFloater* floaterp,
- BOOL select_added_floater,
- LLTabContainer::eInsertionPoint insertion_point)
-{
- if(!floaterp) return;
-
- S32 num_locked_tabs = mTabContainer->getNumLockedTabs();
-
- // already here
- if (floaterp->getHost() == this)
- {
- openFloater(floaterp->getKey());
- return;
- }
-
- // make sure my friends and chat history both locked when re-attaching chat history
- if (floaterp->getName() == "chat floater")
- {
- mTabContainer->unlockTabs();
- // add chat history as second tab if contact window is present, first tab otherwise
- if (getChildView("floater_my_friends"))
- {
- // assuming contacts window is first tab, select it
- mTabContainer->selectFirstTab();
- // and add ourselves after
- LLMultiFloater::addFloater(floaterp, select_added_floater, LLTabContainer::RIGHT_OF_CURRENT);
- }
- else
- {
- LLMultiFloater::addFloater(floaterp, select_added_floater, LLTabContainer::START);
- }
-
- // make sure first two tabs are now locked
- mTabContainer->lockTabs(num_locked_tabs + 1);
- gSavedSettings.setBOOL("ChatHistoryTornOff", FALSE);
- floaterp->setCanClose(FALSE);
- }
- else if (floaterp->getName() == "floater_my_friends")
- {
- mTabContainer->unlockTabs();
- // add contacts window as first tab
- LLMultiFloater::addFloater(floaterp, select_added_floater, LLTabContainer::START);
- // make sure first two tabs are now locked
- mTabContainer->lockTabs(num_locked_tabs + 1);
- gSavedSettings.setBOOL("ContactsTornOff", FALSE);
- floaterp->setCanClose(FALSE);
- }
- else
- {
- LLMultiFloater::addFloater(floaterp, select_added_floater, insertion_point);
- // openFloater(floaterp->getKey());
- }
-
- // make sure active voice icon shows up for new tab
- if (floaterp == mActiveVoiceFloater)
- {
- mTabContainer->setTabImage(floaterp, "active_voice_tab.tga");
- }
-}
-
-//static
-LLFloaterChatterBox* LLFloaterChatterBox::getInstance()
-{
- return LLFloaterReg::getTypedInstance<LLFloaterChatterBox>("communicate", LLSD()) ;
-}
-
-//static
-LLFloater* LLFloaterChatterBox::getCurrentVoiceFloater()
-{
- if (!LLVoiceClient::getInstance()->voiceEnabled())
- {
- return NULL;
- }
- if (LLVoiceChannelProximal::getInstance() == LLVoiceChannel::getCurrentVoiceChannel())
- {
- return NULL;
- }
- else
- {
- LLFloaterChatterBox* floater = LLFloaterChatterBox::getInstance();
- if(!floater) return NULL;
- // iterator over all IM tabs (skip friends and near me)
- for (S32 i = 0; i < floater->getFloaterCount(); i++)
- {
- LLPanel* panelp = floater->mTabContainer->getPanelByIndex(i);
- if (panelp->getName() == "im_floater")
- {
- // only LLFloaterIMPanels are called "im_floater"
- LLFloaterIMPanel* im_floaterp = (LLFloaterIMPanel*)panelp;
- LLVoiceChannel* voice_channel = LLIMModel::getInstance()->getVoiceChannel(im_floaterp->getSessionID());
- if (voice_channel == LLVoiceChannel::getCurrentVoiceChannel())
- {
- return im_floaterp;
- }
- }
- }
- }
- return NULL;
-}
diff --git a/indra/newview/llfloaterchatterbox.h b/indra/newview/llfloaterchatterbox.h
deleted file mode 100644
index 3a8bfe2fa4..0000000000
--- a/indra/newview/llfloaterchatterbox.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/**
- * @file llfloaterchatterbox.h
- * @author Richard
- * @date 2007-05-04
- * @brief Integrated friends and group management/communication tool
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLFLOATERCHATTERBOX_H
-#define LL_LLFLOATERCHATTERBOX_H
-
-#include "llfloater.h"
-#include "llmultifloater.h"
-#include "llstring.h"
-#include "llimpanel.h"
-
-class LLTabContainer;
-
-class LLFloaterChatterBox : public LLMultiFloater
-{
-public:
- LLFloaterChatterBox(const LLSD& seed);
- virtual ~LLFloaterChatterBox();
-
- /*virtual*/ BOOL postBuild();
- /*virtual*/ BOOL handleKeyHere(KEY key, MASK mask);
- /*virtual*/ void draw();
- /*virtual*/ void onOpen(const LLSD& key);
-
- /*virtual*/ void removeFloater(LLFloater* floaterp);
- /*virtual*/ void addFloater(LLFloater* floaterp,
- BOOL select_added_floater,
- LLTabContainer::eInsertionPoint insertion_point = LLTabContainer::END);
-
- static LLFloaterChatterBox* getInstance(); // *TODO:Skinning Deprecate
- static LLFloater* getCurrentVoiceFloater();
-
-protected:
- void onVisibilityChange ( const LLSD& new_visibility );
-
- LLFloater* mActiveVoiceFloater;
-};
-
-
-class LLFloaterMyFriends : public LLFloater
-{
-public:
- LLFloaterMyFriends(const LLSD& seed);
- virtual ~LLFloaterMyFriends();
-
- /*virtual*/ BOOL postBuild();
- /*virtual*/ void onOpen(const LLSD& key);
-
- static LLFloaterMyFriends* getInstance(); // *TODO:Skinning Deprecate
-
- static void* createFriendsPanel(void* data);
- static void* createGroupsPanel(void* data);
-};
-
-#endif // LL_LLFLOATERCHATTERBOX_H
diff --git a/indra/newview/llfloatercolorpicker.cpp b/indra/newview/llfloatercolorpicker.cpp
index 69f1774ff8..05d73c2416 100644
--- a/indra/newview/llfloatercolorpicker.cpp
+++ b/indra/newview/llfloatercolorpicker.cpp
@@ -271,7 +271,7 @@ void LLFloaterColorPicker::destroyUI ()
if ( mSwatchView )
{
this->removeChild ( mSwatchView );
- delete mSwatchView;
+ mSwatchView->die();;
mSwatchView = NULL;
}
}
@@ -472,6 +472,12 @@ void LLFloaterColorPicker::onMouseCaptureLost()
setMouseDownInLumRegion(FALSE);
}
+F32 LLFloaterColorPicker::getSwatchTransparency()
+{
+ // If the floater is focused, don't apply its alpha to the color swatch (STORM-676).
+ return getTransparencyType() == TT_ACTIVE ? 1.f : LLFloater::getCurrentTransparency();
+}
+
//////////////////////////////////////////////////////////////////////////////
//
void LLFloaterColorPicker::draw()
@@ -533,8 +539,10 @@ void LLFloaterColorPicker::draw()
// base floater stuff
LLFloater::draw ();
+ const F32 alpha = getSwatchTransparency();
+
// draw image for RGB area (not really RGB but you'll see what I mean...
- gl_draw_image ( mRGBViewerImageLeft, mRGBViewerImageTop - mRGBViewerImageHeight, mRGBImage, LLColor4::white );
+ gl_draw_image ( mRGBViewerImageLeft, mRGBViewerImageTop - mRGBViewerImageHeight, mRGBImage, LLColor4::white % alpha);
// update 'cursor' into RGB Section
S32 xPos = ( S32 ) ( ( F32 )mRGBViewerImageWidth * getCurH () ) - 8;
@@ -556,7 +564,7 @@ void LLFloaterColorPicker::draw()
mRGBViewerImageTop - mRGBViewerImageHeight,
mRGBViewerImageLeft + mRGBViewerImageWidth + 1,
mRGBViewerImageTop,
- LLColor4 ( 0.0f, 0.0f, 0.0f, 1.0f ),
+ LLColor4 ( 0.0f, 0.0f, 0.0f, alpha ),
FALSE );
// draw luminance slider
@@ -569,7 +577,7 @@ void LLFloaterColorPicker::draw()
mLumRegionTop - mLumRegionHeight + y,
mLumRegionLeft + mLumRegionWidth,
mLumRegionTop - mLumRegionHeight + y - 1,
- LLColor4 ( rValSlider, gValSlider, bValSlider, 1.0f ) );
+ LLColor4 ( rValSlider, gValSlider, bValSlider, alpha ) );
}
@@ -594,7 +602,7 @@ void LLFloaterColorPicker::draw()
mSwatchRegionTop - mSwatchRegionHeight,
mSwatchRegionLeft + mSwatchRegionWidth,
mSwatchRegionTop,
- LLColor4 ( getCurR (), getCurG (), getCurB (), 1.0f ),
+ LLColor4 ( getCurR (), getCurG (), getCurB (), alpha ),
TRUE );
// draw selected color swatch outline
@@ -634,6 +642,7 @@ const LLColor4& LLFloaterColorPicker::getComplimentaryColor ( const LLColor4& ba
void LLFloaterColorPicker::drawPalette ()
{
S32 curEntry = 0;
+ const F32 alpha = getSwatchTransparency();
for ( S32 y = 0; y < numPaletteRows; ++y )
{
@@ -648,7 +657,7 @@ void LLFloaterColorPicker::drawPalette ()
// draw palette entry color
if ( mPalette [ curEntry ] )
{
- gl_rect_2d ( x1 + 2, y1 - 2, x2 - 2, y2 + 2, *mPalette [ curEntry++ ], TRUE );
+ gl_rect_2d ( x1 + 2, y1 - 2, x2 - 2, y2 + 2, *mPalette [ curEntry++ ] % alpha, TRUE );
gl_rect_2d ( x1 + 1, y1 - 1, x2 - 1, y2 + 1, LLColor4 ( 0.0f, 0.0f, 0.0f, 1.0f ), FALSE );
}
}
diff --git a/indra/newview/llfloatercolorpicker.h b/indra/newview/llfloatercolorpicker.h
index 110fa43b9c..8e387c4f7c 100644
--- a/indra/newview/llfloatercolorpicker.h
+++ b/indra/newview/llfloatercolorpicker.h
@@ -55,6 +55,7 @@ class LLFloaterColorPicker
virtual BOOL handleMouseUp ( S32 x, S32 y, MASK mask );
virtual BOOL handleHover ( S32 x, S32 y, MASK mask );
virtual void onMouseCaptureLost();
+ virtual F32 getSwatchTransparency();
// implicit methods
void createUI ();
diff --git a/indra/newview/llfloaterdaycycle.cpp b/indra/newview/llfloaterdaycycle.cpp
deleted file mode 100644
index 22816ee802..0000000000
--- a/indra/newview/llfloaterdaycycle.cpp
+++ /dev/null
@@ -1,531 +0,0 @@
-/**
- * @file llfloaterdaycycle.cpp
- * @brief LLFloaterDayCycle class definition
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llfloaterdaycycle.h"
-
-#include "pipeline.h"
-#include "llsky.h"
-
-#include "llsliderctrl.h"
-#include "llmultislider.h"
-#include "llmultisliderctrl.h"
-#include "llspinctrl.h"
-#include "llcheckboxctrl.h"
-#include "lluictrlfactory.h"
-#include "llviewercamera.h"
-#include "llcombobox.h"
-#include "lllineeditor.h"
-#include "llwlanimator.h"
-
-#include "v4math.h"
-#include "llviewerdisplay.h"
-#include "llviewercontrol.h"
-#include "llviewerwindow.h"
-
-#include "llwlparamset.h"
-#include "llwlparammanager.h"
-#include "llpostprocess.h"
-#include "llfloaterwindlight.h"
-
-
-std::map<std::string, LLWLSkyKey> LLFloaterDayCycle::sSliderToKey;
-const F32 LLFloaterDayCycle::sHoursPerDay = 24.0f;
-
-LLFloaterDayCycle::LLFloaterDayCycle(const LLSD& key)
-: LLFloater(key)
-{
-}
-
-BOOL LLFloaterDayCycle::postBuild()
-{
- // add the combo boxes
- LLComboBox* keyCombo = getChild<LLComboBox>("WLKeyPresets");
-
- if(keyCombo != NULL)
- {
- keyCombo->removeall();
- std::map<std::string, LLWLParamSet>::iterator mIt =
- LLWLParamManager::instance()->mParamList.begin();
- for(; mIt != LLWLParamManager::instance()->mParamList.end(); mIt++)
- {
- keyCombo->add(std::string(mIt->first));
- }
-
- // set defaults on combo boxes
- keyCombo->selectFirstItem();
- }
-
- // add the time slider
- LLMultiSliderCtrl* sldr = getChild<LLMultiSliderCtrl>("WLTimeSlider");
-
- sldr->addSlider();
-
- // load it up
- initCallbacks();
-
- syncMenu();
- syncSliderTrack();
-
- return TRUE;
-}
-
-LLFloaterDayCycle::~LLFloaterDayCycle()
-{
-}
-
-void LLFloaterDayCycle::initCallbacks(void)
-{
- // WL Day Cycle
- getChild<LLUICtrl>("WLTimeSlider")->setCommitCallback(boost::bind(&LLFloaterDayCycle::onTimeSliderMoved, this, _1));
- getChild<LLUICtrl>("WLDayCycleKeys")->setCommitCallback(boost::bind(&LLFloaterDayCycle::onKeyTimeMoved, this, _1));
- getChild<LLUICtrl>("WLCurKeyHour")->setCommitCallback(boost::bind(&LLFloaterDayCycle::onKeyTimeChanged, this, _1));
- getChild<LLUICtrl>("WLCurKeyMin")->setCommitCallback(boost::bind(&LLFloaterDayCycle::onKeyTimeChanged, this, _1));
- getChild<LLUICtrl>("WLKeyPresets")->setCommitCallback(boost::bind(&LLFloaterDayCycle::onKeyPresetChanged, this, _1));
-
- getChild<LLUICtrl>("WLLengthOfDayHour")->setCommitCallback(boost::bind(&LLFloaterDayCycle::onTimeRateChanged, this, _1));
- getChild<LLUICtrl>("WLLengthOfDayMin")->setCommitCallback(boost::bind(&LLFloaterDayCycle::onTimeRateChanged, this, _1));
- getChild<LLUICtrl>("WLLengthOfDaySec")->setCommitCallback(boost::bind(&LLFloaterDayCycle::onTimeRateChanged, this, _1));
- getChild<LLUICtrl>("WLUseLindenTime")->setCommitCallback(boost::bind(&LLFloaterDayCycle::onUseLindenTime, this, _1));
- getChild<LLUICtrl>("WLAnimSky")->setCommitCallback(boost::bind(&LLFloaterDayCycle::onRunAnimSky, this, _1));
- getChild<LLUICtrl>("WLStopAnimSky")->setCommitCallback(boost::bind(&LLFloaterDayCycle::onStopAnimSky, this, _1));
-
- getChild<LLUICtrl>("WLLoadDayCycle")->setCommitCallback(boost::bind(&LLFloaterDayCycle::onLoadDayCycle, this, _1));
- getChild<LLUICtrl>("WLSaveDayCycle")->setCommitCallback(boost::bind(&LLFloaterDayCycle::onSaveDayCycle, this, _1));
-
- getChild<LLUICtrl>("WLAddKey")->setCommitCallback(boost::bind(&LLFloaterDayCycle::onAddKey, this, _1));
- getChild<LLUICtrl>("WLDeleteKey")->setCommitCallback(boost::bind(&LLFloaterDayCycle::onDeleteKey, this, _1));
-}
-
-void LLFloaterDayCycle::syncMenu()
-{
-// std::map<std::string, LLVector4> & currentParams = LLWLParamManager::instance()->mCurParams.mParamValues;
-
- // set time
- LLMultiSliderCtrl* sldr = getChild<LLMultiSliderCtrl>("WLTimeSlider");
- sldr->setCurSliderValue((F32)LLWLParamManager::instance()->mAnimator.getDayTime() * sHoursPerDay);
-
- LLSpinCtrl* secSpin = getChild<LLSpinCtrl>("WLLengthOfDaySec");
- LLSpinCtrl* minSpin = getChild<LLSpinCtrl>("WLLengthOfDayMin");
- LLSpinCtrl* hourSpin = getChild<LLSpinCtrl>("WLLengthOfDayHour");
-
- F32 curRate;
- F32 hours, min, sec;
-
- // get the current rate
- curRate = LLWLParamManager::instance()->mDay.mDayRate;
- hours = (F32)((int)(curRate / 60 / 60));
- curRate -= (hours * 60 * 60);
- min = (F32)((int)(curRate / 60));
- curRate -= (min * 60);
- sec = curRate;
-
- hourSpin->setValue(hours);
- minSpin->setValue(min);
- secSpin->setValue(sec);
-
- // turn off Use Estate Time button if it's already being used
- if( LLWLParamManager::instance()->mAnimator.mUseLindenTime == true)
- {
- getChildView("WLUseLindenTime")->setEnabled(FALSE);
- }
- else
- {
- getChildView("WLUseLindenTime")->setEnabled(TRUE);
- }
-}
-
-void LLFloaterDayCycle::syncSliderTrack()
-{
- // clear the slider
- LLMultiSliderCtrl* kSldr = getChild<LLMultiSliderCtrl>("WLDayCycleKeys");
-
- kSldr->clear();
- sSliderToKey.clear();
-
- // add sliders
- std::map<F32, std::string>::iterator mIt =
- LLWLParamManager::instance()->mDay.mTimeMap.begin();
- for(; mIt != LLWLParamManager::instance()->mDay.mTimeMap.end(); mIt++)
- {
- addSliderKey(mIt->first * sHoursPerDay, mIt->second);
- }
-}
-
-void LLFloaterDayCycle::syncTrack()
-{
- // if no keys, do nothing
- if(sSliderToKey.size() == 0)
- {
- return;
- }
-
- LLMultiSliderCtrl* sldr;
- sldr = getChild<LLMultiSliderCtrl>(
- "WLDayCycleKeys");
- llassert_always(sSliderToKey.size() == sldr->getValue().size());
-
- LLMultiSliderCtrl* tSldr;
- tSldr = getChild<LLMultiSliderCtrl>(
- "WLTimeSlider");
-
- // create a new animation track
- LLWLParamManager::instance()->mDay.clearKeys();
-
- // add the keys one by one
- std::map<std::string, LLWLSkyKey>::iterator mIt = sSliderToKey.begin();
- for(; mIt != sSliderToKey.end(); mIt++)
- {
- LLWLParamManager::instance()->mDay.addKey(mIt->second.time / sHoursPerDay,
- mIt->second.presetName);
- }
-
- // set the param manager's track to the new one
- LLWLParamManager::instance()->resetAnimator(
- tSldr->getCurSliderValue() / sHoursPerDay, false);
-
- LLWLParamManager::instance()->mAnimator.update(
- LLWLParamManager::instance()->mCurParams);
-}
-
-void LLFloaterDayCycle::onRunAnimSky(LLUICtrl* ctrl)
-{
- // if no keys, do nothing
- if(sSliderToKey.size() == 0)
- {
- return;
- }
-
- LLMultiSliderCtrl* sldr;
- sldr = getChild<LLMultiSliderCtrl>("WLDayCycleKeys");
- llassert_always(sSliderToKey.size() == sldr->getValue().size());
-
- LLMultiSliderCtrl* tSldr;
- tSldr = getChild<LLMultiSliderCtrl>("WLTimeSlider");
-
- // turn off linden time
- LLWLParamManager::instance()->mAnimator.mUseLindenTime = false;
-
- // set the param manager's track to the new one
- LLWLParamManager::instance()->resetAnimator(
- tSldr->getCurSliderValue() / sHoursPerDay, true);
-
- llassert_always(LLWLParamManager::instance()->mAnimator.mTimeTrack.size() == sldr->getValue().size());
-}
-
-void LLFloaterDayCycle::onStopAnimSky(LLUICtrl* ctrl)
-{
- // if no keys, do nothing
- if(sSliderToKey.size() == 0) {
- return;
- }
-
- // turn off animation and using linden time
- LLWLParamManager::instance()->mAnimator.mIsRunning = false;
- LLWLParamManager::instance()->mAnimator.mUseLindenTime = false;
-}
-
-void LLFloaterDayCycle::onUseLindenTime(LLUICtrl* ctrl)
-{
- LLComboBox* box = getChild<LLComboBox>("WLPresetsCombo");
- box->selectByValue("");
-
- LLWLParamManager::instance()->mAnimator.mIsRunning = true;
- LLWLParamManager::instance()->mAnimator.mUseLindenTime = true;
-}
-
-void LLFloaterDayCycle::onLoadDayCycle(LLUICtrl* ctrl)
-{
- LLWLParamManager::instance()->mDay.loadDayCycle("Default.xml");
-
- // sync it all up
- syncSliderTrack();
- syncMenu();
-
- // set the param manager's track to the new one
- LLMultiSliderCtrl* tSldr;
- tSldr = getChild<LLMultiSliderCtrl>(
- "WLTimeSlider");
- LLWLParamManager::instance()->resetAnimator(
- tSldr->getCurSliderValue() / sHoursPerDay, false);
-
- // and draw it
- LLWLParamManager::instance()->mAnimator.update(
- LLWLParamManager::instance()->mCurParams);
-}
-
-void LLFloaterDayCycle::onSaveDayCycle(LLUICtrl* ctrl)
-{
- LLWLParamManager::instance()->mDay.saveDayCycle("Default.xml");
-}
-
-
-void LLFloaterDayCycle::onTimeSliderMoved(LLUICtrl* ctrl)
-{
- LLMultiSliderCtrl* sldr = getChild<LLMultiSliderCtrl>(
- "WLTimeSlider");
-
- /// get the slider value
- F32 val = sldr->getCurSliderValue() / sHoursPerDay;
-
- // set the value, turn off animation
- LLWLParamManager::instance()->mAnimator.setDayTime((F64)val);
- LLWLParamManager::instance()->mAnimator.mIsRunning = false;
- LLWLParamManager::instance()->mAnimator.mUseLindenTime = false;
-
- // then call update once
- LLWLParamManager::instance()->mAnimator.update(
- LLWLParamManager::instance()->mCurParams);
-}
-
-void LLFloaterDayCycle::onKeyTimeMoved(LLUICtrl* ctrl)
-{
- LLComboBox* comboBox = getChild<LLComboBox>("WLKeyPresets");
- LLMultiSliderCtrl* sldr = getChild<LLMultiSliderCtrl>("WLDayCycleKeys");
- LLSpinCtrl* hourSpin = getChild<LLSpinCtrl>("WLCurKeyHour");
- LLSpinCtrl* minSpin = getChild<LLSpinCtrl>("WLCurKeyMin");
-
- if(sldr->getValue().size() == 0) {
- return;
- }
-
- // make sure we have a slider
- const std::string& curSldr = sldr->getCurSlider();
- if(curSldr == "") {
- return;
- }
-
- F32 time = sldr->getCurSliderValue();
-
- // check to see if a key exists
- std::string presetName = sSliderToKey[curSldr].presetName;
- sSliderToKey[curSldr].time = time;
-
- // if it exists, turn on check box
- comboBox->selectByValue(presetName);
-
- // now set the spinners
- F32 hour = (F32)((S32)time);
- F32 min = (time - hour) * 60;
-
- // handle imprecision
- if(min >= 59) {
- min = 0;
- hour += 1;
- }
-
- hourSpin->set(hour);
- minSpin->set(min);
-
- syncTrack();
-
-}
-
-void LLFloaterDayCycle::onKeyTimeChanged(LLUICtrl* ctrl)
-{
- // if no keys, skipped
- if(sSliderToKey.size() == 0) {
- return;
- }
-
- LLMultiSliderCtrl* sldr = getChild<LLMultiSliderCtrl>(
- "WLDayCycleKeys");
- LLSpinCtrl* hourSpin = getChild<LLSpinCtrl>(
- "WLCurKeyHour");
- LLSpinCtrl* minSpin = getChild<LLSpinCtrl>(
- "WLCurKeyMin");
-
- F32 hour = hourSpin->get();
- F32 min = minSpin->get();
- F32 val = hour + min / 60.0f;
-
- const std::string& curSldr = sldr->getCurSlider();
- sldr->setCurSliderValue(val, TRUE);
- F32 time = sldr->getCurSliderValue() / sHoursPerDay;
-
- // now set the key's time in the sliderToKey map
- std::string presetName = sSliderToKey[curSldr].presetName;
- sSliderToKey[curSldr].time = time;
-
- syncTrack();
-}
-
-void LLFloaterDayCycle::onKeyPresetChanged(LLUICtrl* ctrl)
-{
- // get the time
- LLComboBox* comboBox = getChild<LLComboBox>(
- "WLKeyPresets");
- LLMultiSliderCtrl* sldr = getChild<LLMultiSliderCtrl>(
- "WLDayCycleKeys");
-
- // do nothing if no sliders
- if(sldr->getValue().size() == 0) {
- return;
- }
-
- // change the map
- std::string newPreset(comboBox->getSelectedValue().asString());
- const std::string& curSldr = sldr->getCurSlider();
-
- // if null, don't use
- if(curSldr == "") {
- return;
- }
-
- sSliderToKey[curSldr].presetName = newPreset;
-
- syncTrack();
-}
-
-void LLFloaterDayCycle::onTimeRateChanged(LLUICtrl* ctrl)
-{
- // get the time
- LLSpinCtrl* secSpin = getChild<LLSpinCtrl>(
- "WLLengthOfDaySec");
-
- LLSpinCtrl* minSpin = getChild<LLSpinCtrl>(
- "WLLengthOfDayMin");
-
- LLSpinCtrl* hourSpin = getChild<LLSpinCtrl>(
- "WLLengthOfDayHour");
-
- F32 hour;
- hour = (F32)hourSpin->getValue().asReal();
- F32 min;
- min = (F32)minSpin->getValue().asReal();
- F32 sec;
- sec = (F32)secSpin->getValue().asReal();
-
- F32 time = 60.0f * 60.0f * hour + 60.0f * min + sec;
- if(time <= 0) {
- time = 1;
- }
- LLWLParamManager::instance()->mDay.mDayRate = time;
-
- syncTrack();
-}
-
-void LLFloaterDayCycle::onAddKey(LLUICtrl* ctrl)
-{
- LLComboBox* comboBox = getChild<LLComboBox>(
- "WLKeyPresets");
- LLMultiSliderCtrl* kSldr = getChild<LLMultiSliderCtrl>(
- "WLDayCycleKeys");
- LLMultiSliderCtrl* tSldr = getChild<LLMultiSliderCtrl>(
- "WLTimeSlider");
-
- llassert_always(sSliderToKey.size() == kSldr->getValue().size());
-
- // get the values
- std::string newPreset(comboBox->getSelectedValue().asString());
-
- // add the slider key
- addSliderKey(tSldr->getCurSliderValue(), newPreset);
-
- syncTrack();
-}
-
-void LLFloaterDayCycle::addSliderKey(F32 time, const std::string & presetName)
-{
- LLMultiSliderCtrl* kSldr = getChild<LLMultiSliderCtrl>(
- "WLDayCycleKeys");
-
- // make a slider
- const std::string& sldrName = kSldr->addSlider(time);
- if(sldrName == "") {
- return;
- }
-
- // set the key
- LLWLSkyKey newKey;
- newKey.presetName = presetName;
- newKey.time = kSldr->getCurSliderValue();
-
- llassert_always(sldrName != LLStringUtil::null);
-
- // add to map
- sSliderToKey.insert(std::pair<std::string, LLWLSkyKey>(sldrName, newKey));
-
- llassert_always(sSliderToKey.size() == kSldr->getValue().size());
-
-}
-
-void LLFloaterDayCycle::deletePreset(std::string& presetName)
-{
- LLMultiSliderCtrl* sldr = getChild<LLMultiSliderCtrl>("WLDayCycleKeys");
-
- /// delete any reference
- std::map<std::string, LLWLSkyKey>::iterator curr_preset, next_preset;
- for(curr_preset = sSliderToKey.begin(); curr_preset != sSliderToKey.end(); curr_preset = next_preset)
- {
- next_preset = curr_preset;
- ++next_preset;
- if (curr_preset->second.presetName == presetName)
- {
- sldr->deleteSlider(curr_preset->first);
- sSliderToKey.erase(curr_preset);
- }
- }
-}
-
-void LLFloaterDayCycle::onDeleteKey(LLUICtrl* ctrl)
-{
- if(sSliderToKey.size() == 0) {
- return;
- }
-
- LLComboBox* comboBox = getChild<LLComboBox>(
- "WLKeyPresets");
- LLMultiSliderCtrl* sldr = getChild<LLMultiSliderCtrl>("WLDayCycleKeys");
-
- // delete from map
- const std::string& sldrName = sldr->getCurSlider();
- std::map<std::string, LLWLSkyKey>::iterator mIt = sSliderToKey.find(sldrName);
- sSliderToKey.erase(mIt);
-
- sldr->deleteCurSlider();
-
- if(sSliderToKey.size() == 0) {
- return;
- }
-
- const std::string& name = sldr->getCurSlider();
- comboBox->selectByValue(sSliderToKey[name].presetName);
- F32 time = sSliderToKey[name].time;
-
- LLSpinCtrl* hourSpin = getChild<LLSpinCtrl>("WLCurKeyHour");
- LLSpinCtrl* minSpin = getChild<LLSpinCtrl>("WLCurKeyMin");
-
- // now set the spinners
- F32 hour = (F32)((S32)time);
- F32 min = (time - hour) / 60;
- hourSpin->set(hour);
- minSpin->set(min);
-
- syncTrack();
-
-}
diff --git a/indra/newview/llfloaterdaycycle.h b/indra/newview/llfloaterdaycycle.h
deleted file mode 100644
index 993ddb8f07..0000000000
--- a/indra/newview/llfloaterdaycycle.h
+++ /dev/null
@@ -1,120 +0,0 @@
-/**
- * @file llfloaterdaycycle.h
- * @brief LLFloaterDayCycle class definition
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLFLOATERDAYCYCLE_H
-#define LL_LLFLOATERDAYCYCLE_H
-
-#include "llfloater.h"
-
-#include <vector>
-#include "llwlparamset.h"
-#include "llwlanimator.h"
-
-struct WLColorControl;
-struct WLFloatControl;
-
-/// convenience class for holding keys mapped to sliders
-struct LLWLSkyKey
-{
-public:
- std::string presetName;
- F32 time;
-};
-
-/// Menu for all of windlight's functionality.
-/// Menuing system for adjusting the atmospheric settings of the world.
-class LLFloaterDayCycle : public LLFloater
-{
-public:
-
- LLFloaterDayCycle(const LLSD& key);
- virtual ~LLFloaterDayCycle();
- /*virtual*/ BOOL postBuild();
-
- /// initialize all
- void initCallbacks(void);
-
- /// on time slider moved
- void onTimeSliderMoved(LLUICtrl* ctrl);
-
- /// what happens when you move the key frame
- void onKeyTimeMoved(LLUICtrl* ctrl);
-
- /// what happens when you change the key frame's time
- void onKeyTimeChanged(LLUICtrl* ctrl);
-
- /// if you change the combo box, change the frame
- void onKeyPresetChanged(LLUICtrl* ctrl);
-
- /// run this when user says to run the sky animation
- void onRunAnimSky(LLUICtrl* ctrl);
-
- /// run this when user says to stop the sky animation
- void onStopAnimSky(LLUICtrl* ctrl);
-
- /// if you change the combo box, change the frame
- void onTimeRateChanged(LLUICtrl* ctrl);
-
- /// add a new key on slider
- void onAddKey(LLUICtrl* ctrl);
-
- /// delete any and all reference to a preset
- void deletePreset(std::string& presetName);
-
- /// delete a key frame
- void onDeleteKey(LLUICtrl* ctrl);
-
- /// button to load day
- void onLoadDayCycle(LLUICtrl* ctrl);
-
- /// button to save day
- void onSaveDayCycle(LLUICtrl* ctrl);
-
- /// toggle for Linden time
- void onUseLindenTime(LLUICtrl* ctrl);
-
- /// sync up sliders with day cycle structure
- void syncMenu();
-
- // makes sure key slider has what's in day cycle
- void syncSliderTrack();
-
- /// makes sure day cycle data structure has what's in menu
- void syncTrack();
-
- /// add a slider to the track
- void addSliderKey(F32 time, const std::string& presetName);
-
-private:
-
- // map of sliders to parameters
- static std::map<std::string, LLWLSkyKey> sSliderToKey;
-
- static const F32 sHoursPerDay;
-};
-
-
-#endif
diff --git a/indra/newview/llfloaterdeleteenvpreset.cpp b/indra/newview/llfloaterdeleteenvpreset.cpp
new file mode 100644
index 0000000000..d08aa81cfe
--- /dev/null
+++ b/indra/newview/llfloaterdeleteenvpreset.cpp
@@ -0,0 +1,285 @@
+/**
+ * @file llfloaterdeleteenvpreset.cpp
+ * @brief Floater to delete a water / sky / day cycle preset.
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloaterdeleteenvpreset.h"
+
+// libs
+#include "llbutton.h"
+#include "llcombobox.h"
+#include "llnotificationsutil.h"
+
+// newview
+#include "lldaycyclemanager.h"
+#include "llwaterparammanager.h"
+
+static bool confirmation_callback(const LLSD& notification, const LLSD& response, boost::function<void()> cb)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ if (option == 0)
+ {
+ cb();
+ }
+ return false;
+
+}
+
+LLFloaterDeleteEnvPreset::LLFloaterDeleteEnvPreset(const LLSD &key)
+: LLFloater(key)
+, mPresetCombo(NULL)
+{
+}
+
+// virtual
+BOOL LLFloaterDeleteEnvPreset::postBuild()
+{
+ mPresetCombo = getChild<LLComboBox>("preset_combo");
+ mPresetCombo->setCommitCallback(boost::bind(&LLFloaterDeleteEnvPreset::postPopulate, this));
+
+ getChild<LLButton>("delete")->setCommitCallback(boost::bind(&LLFloaterDeleteEnvPreset::onBtnDelete, this));
+ getChild<LLButton>("cancel")->setCommitCallback(boost::bind(&LLFloaterDeleteEnvPreset::onBtnCancel, this));
+
+ // Listen to user preferences change, in which case we need to rebuild the presets list
+ // to disable the [new] current preset.
+ LLEnvManagerNew::instance().setPreferencesChangeCallback(boost::bind(&LLFloaterDeleteEnvPreset::populatePresetsList, this));
+
+ // Listen to presets addition/removal.
+ LLDayCycleManager::instance().setModifyCallback(boost::bind(&LLFloaterDeleteEnvPreset::populateDayCyclesList, this));
+ LLWLParamManager::instance().setPresetListChangeCallback(boost::bind(&LLFloaterDeleteEnvPreset::populateSkyPresetsList, this));
+ LLWaterParamManager::instance().setPresetListChangeCallback(boost::bind(&LLFloaterDeleteEnvPreset::populateWaterPresetsList, this));
+
+ return TRUE;
+}
+
+// virtual
+void LLFloaterDeleteEnvPreset::onOpen(const LLSD& key)
+{
+ std::string param = key.asString();
+ std::string floater_title = getString(std::string("title_") + param);
+ std::string combo_label = getString(std::string("label_" + param));
+
+ // Update floater title.
+ setTitle(floater_title);
+
+ // Update the combobox label.
+ getChild<LLUICtrl>("label")->setValue(combo_label);
+
+ // Populate the combobox.
+ populatePresetsList();
+}
+
+void LLFloaterDeleteEnvPreset::onBtnDelete()
+{
+ std::string param = mKey.asString();
+ std::string preset_name = mPresetCombo->getValue().asString();
+ boost::function<void()> confirm_cb;
+
+ if (param == "water")
+ {
+ // Don't allow deleting system presets.
+ if (LLWaterParamManager::instance().isSystemPreset(preset_name))
+ {
+ LLNotificationsUtil::add("WLNoEditDefault");
+ return;
+ }
+
+ confirm_cb = boost::bind(&LLFloaterDeleteEnvPreset::onDeleteWaterPresetConfirmation, this);
+ }
+ else if (param == "sky")
+ {
+ // Don't allow deleting presets referenced by local day cycles.
+ if (LLDayCycleManager::instance().isSkyPresetReferenced(preset_name))
+ {
+ LLNotificationsUtil::add("GenericAlert", LLSD().with("MESSAGE", getString("msg_sky_is_referenced")));
+ return;
+ }
+
+ LLWLParamManager& wl_mgr = LLWLParamManager::instance();
+
+ // Don't allow deleting system presets.
+ if (wl_mgr.isSystemPreset(preset_name))
+ {
+ LLNotificationsUtil::add("WLNoEditDefault");
+ return;
+ }
+
+ confirm_cb = boost::bind(&LLFloaterDeleteEnvPreset::onDeleteSkyPresetConfirmation, this);
+ }
+ else if (param == "day_cycle")
+ {
+ LLDayCycleManager& day_mgr = LLDayCycleManager::instance();
+
+ // Don't allow deleting system presets.
+ if (day_mgr.isSystemPreset(preset_name))
+ {
+ LLNotificationsUtil::add("WLNoEditDefault");
+ return;
+ }
+
+ confirm_cb = boost::bind(&LLFloaterDeleteEnvPreset::onDeleteDayCycleConfirmation, this);
+ }
+ else
+ {
+ llwarns << "Unrecognized key" << llendl;
+ }
+
+ LLSD args;
+ args["MESSAGE"] = getString("msg_confirm_deletion");
+ LLNotificationsUtil::add("GenericAlertYesCancel", args, LLSD(),
+ boost::bind(&confirmation_callback, _1, _2, confirm_cb));
+}
+
+void LLFloaterDeleteEnvPreset::onBtnCancel()
+{
+ closeFloater();
+}
+
+void LLFloaterDeleteEnvPreset::populatePresetsList()
+{
+ std::string param = mKey.asString();
+
+ if (param == "water")
+ {
+ populateWaterPresetsList();
+ }
+ else if (param == "sky")
+ {
+ populateSkyPresetsList();
+ }
+ else if (param == "day_cycle")
+ {
+ populateDayCyclesList();
+ }
+ else
+ {
+ llwarns << "Unrecognized key" << llendl;
+ }
+}
+
+void LLFloaterDeleteEnvPreset::populateWaterPresetsList()
+{
+ if (mKey.asString() != "water") return;
+
+ mPresetCombo->removeall();
+
+ std::string cur_preset;
+ LLEnvManagerNew& env_mgr = LLEnvManagerNew::instance();
+ if (!env_mgr.getUseRegionSettings())
+ {
+ cur_preset = env_mgr.getWaterPresetName();
+ }
+
+ LLWaterParamManager::preset_name_list_t presets;
+ LLWaterParamManager::instance().getUserPresetNames(presets); // list only user presets
+ for (LLWaterParamManager::preset_name_list_t::const_iterator it = presets.begin(); it != presets.end(); ++it)
+ {
+ std::string name = *it;
+
+ bool enabled = (name != cur_preset); // don't allow deleting current preset
+ mPresetCombo->add(name, ADD_BOTTOM, enabled);
+ }
+
+ postPopulate();
+}
+
+void LLFloaterDeleteEnvPreset::populateSkyPresetsList()
+{
+ if (mKey.asString() != "sky") return;
+
+ mPresetCombo->removeall();
+
+ std::string cur_preset;
+ LLEnvManagerNew& env_mgr = LLEnvManagerNew::instance();
+ if (!env_mgr.getUseRegionSettings() && env_mgr.getUseFixedSky())
+ {
+ cur_preset = env_mgr.getSkyPresetName();
+ }
+
+ LLWLParamManager::preset_name_list_t user_presets;
+ LLWLParamManager::instance().getUserPresetNames(user_presets);
+ for (LLWLParamManager::preset_name_list_t::const_iterator it = user_presets.begin(); it != user_presets.end(); ++it)
+ {
+ const std::string& name = *it;
+ mPresetCombo->add(name, ADD_BOTTOM, /*enabled = */ name != cur_preset);
+ }
+
+ postPopulate();
+}
+
+void LLFloaterDeleteEnvPreset::populateDayCyclesList()
+{
+ if (mKey.asString() != "day_cycle") return;
+
+ mPresetCombo->removeall();
+
+ std::string cur_day;
+ LLEnvManagerNew& env_mgr = LLEnvManagerNew::instance();
+ if (!env_mgr.getUseRegionSettings() && env_mgr.getUseDayCycle())
+ {
+ cur_day = env_mgr.getDayCycleName();
+ }
+
+ LLDayCycleManager& day_mgr = LLDayCycleManager::instance();
+ LLDayCycleManager::preset_name_list_t user_days;
+ day_mgr.getUserPresetNames(user_days); // list only user presets
+ for (LLDayCycleManager::preset_name_list_t::const_iterator it = user_days.begin(); it != user_days.end(); ++it)
+ {
+ const std::string& name = *it;
+ mPresetCombo->add(name, ADD_BOTTOM, name != cur_day);
+ }
+
+ postPopulate();
+}
+
+void LLFloaterDeleteEnvPreset::postPopulate()
+{
+ // Handle empty list and empty selection.
+ bool has_selection = mPresetCombo->getItemCount() > 0 && mPresetCombo->getSelectedValue().isDefined();
+
+ if (!has_selection)
+ {
+ mPresetCombo->setLabel(getString("combo_label"));
+ }
+
+ getChild<LLButton>("delete")->setEnabled(has_selection);
+}
+
+void LLFloaterDeleteEnvPreset::onDeleteDayCycleConfirmation()
+{
+ LLDayCycleManager::instance().deletePreset(mPresetCombo->getValue().asString());
+}
+
+void LLFloaterDeleteEnvPreset::onDeleteSkyPresetConfirmation()
+{
+ LLWLParamKey key(mPresetCombo->getValue().asString(), LLEnvKey::SCOPE_LOCAL);
+ LLWLParamManager::instance().removeParamSet(key, true);
+}
+
+void LLFloaterDeleteEnvPreset::onDeleteWaterPresetConfirmation()
+{
+ LLWaterParamManager::instance().removeParamSet(mPresetCombo->getValue().asString(), true);
+}
diff --git a/indra/newview/llfloaterdeleteenvpreset.h b/indra/newview/llfloaterdeleteenvpreset.h
new file mode 100644
index 0000000000..1211505273
--- /dev/null
+++ b/indra/newview/llfloaterdeleteenvpreset.h
@@ -0,0 +1,62 @@
+/**
+ * @file llfloaterdeleteenvpreset.h
+ * @brief Floater to delete a water / sky / day cycle preset.
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLFLOATERDELETEENVPRESET_H
+#define LL_LLFLOATERDELETEENVPRESET_H
+
+#include "llfloater.h"
+
+class LLComboBox;
+
+class LLFloaterDeleteEnvPreset : public LLFloater
+{
+ LOG_CLASS(LLFloaterDeleteEnvPreset);
+
+public:
+ LLFloaterDeleteEnvPreset(const LLSD &key);
+
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void onOpen(const LLSD& key);
+
+ void onBtnDelete();
+ void onBtnCancel();
+
+private:
+ void populatePresetsList();
+ void populateWaterPresetsList();
+ void populateSkyPresetsList();
+ void populateDayCyclesList();
+
+ void postPopulate();
+
+ void onDeleteDayCycleConfirmation();
+ void onDeleteSkyPresetConfirmation();
+ void onDeleteWaterPresetConfirmation();
+
+ LLComboBox* mPresetCombo;
+};
+
+#endif // LL_LLFLOATERDELETEENVPRESET_H
diff --git a/indra/newview/llfloaterdestinations.cpp b/indra/newview/llfloaterdestinations.cpp
new file mode 100644
index 0000000000..af21cb593f
--- /dev/null
+++ b/indra/newview/llfloaterdestinations.cpp
@@ -0,0 +1,54 @@
+/**
+ * @file llfloaterdestinations.h
+ * @author Leyla Farazha
+ * @brief floater for the destinations guide
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+/**
+ * Floater that appears when buying an object, giving a preview
+ * of its contents and their permissions.
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloaterdestinations.h"
+#include "lluictrlfactory.h"
+
+
+LLFloaterDestinations::LLFloaterDestinations(const LLSD& key)
+ : LLFloater(key)
+{
+}
+
+LLFloaterDestinations::~LLFloaterDestinations()
+{
+}
+
+BOOL LLFloaterDestinations::postBuild()
+{
+ enableResizeCtrls(true, true, false);
+ return TRUE;
+}
+
+
diff --git a/indra/newview/llfloaterdestinations.h b/indra/newview/llfloaterdestinations.h
new file mode 100644
index 0000000000..85d9b3391e
--- /dev/null
+++ b/indra/newview/llfloaterdestinations.h
@@ -0,0 +1,43 @@
+/**
+ * @file llfloaterdestinations.h
+ * @author Leyla Farazha
+ * @brief floater for the destinations guide
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_FLOATER_DESTINATIONS_H
+#define LL_FLOATER_DESTINATIONS_H
+
+#include "llfloater.h"
+
+class LLFloaterDestinations:
+ public LLFloater
+{
+ friend class LLFloaterReg;
+private:
+ LLFloaterDestinations(const LLSD& key);
+ /*virtual*/ ~LLFloaterDestinations();
+ /*virtual*/ BOOL postBuild();
+};
+
+#endif
diff --git a/indra/newview/llfloatereditdaycycle.cpp b/indra/newview/llfloatereditdaycycle.cpp
new file mode 100644
index 0000000000..b63677b258
--- /dev/null
+++ b/indra/newview/llfloatereditdaycycle.cpp
@@ -0,0 +1,825 @@
+/**
+ * @file llfloatereditdaycycle.cpp
+ * @brief Floater to create or edit a day cycle
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloatereditdaycycle.h"
+
+// libs
+#include "llbutton.h"
+#include "llcheckboxctrl.h"
+#include "llcombobox.h"
+#include "llloadingindicator.h"
+#include "llmultisliderctrl.h"
+#include "llnotifications.h"
+#include "llnotificationsutil.h"
+#include "llspinctrl.h"
+#include "lltimectrl.h"
+
+// newview
+#include "llagent.h"
+#include "lldaycyclemanager.h"
+#include "llenvmanager.h"
+#include "llregioninfomodel.h"
+#include "llviewerregion.h"
+#include "llwlparammanager.h"
+
+const F32 LLFloaterEditDayCycle::sHoursPerDay = 24.0f;
+
+LLFloaterEditDayCycle::LLFloaterEditDayCycle(const LLSD &key)
+: LLFloater(key)
+, mDayCycleNameEditor(NULL)
+, mDayCyclesCombo(NULL)
+, mTimeSlider(NULL)
+, mKeysSlider(NULL)
+, mSkyPresetsCombo(NULL)
+, mTimeCtrl(NULL)
+, mMakeDefaultCheckBox(NULL)
+, mSaveButton(NULL)
+{
+}
+
+// virtual
+BOOL LLFloaterEditDayCycle::postBuild()
+{
+ mDayCycleNameEditor = getChild<LLLineEditor>("day_cycle_name");
+ mDayCyclesCombo = getChild<LLComboBox>("day_cycle_combo");
+
+ mTimeSlider = getChild<LLMultiSliderCtrl>("WLTimeSlider");
+ mKeysSlider = getChild<LLMultiSliderCtrl>("WLDayCycleKeys");
+ mSkyPresetsCombo = getChild<LLComboBox>("WLSkyPresets");
+ mTimeCtrl = getChild<LLTimeCtrl>("time");
+ mSaveButton = getChild<LLButton>("save");
+ mMakeDefaultCheckBox = getChild<LLCheckBoxCtrl>("make_default_cb");
+
+ initCallbacks();
+
+ // add the time slider
+ mTimeSlider->addSlider();
+
+ return TRUE;
+}
+
+// virtual
+void LLFloaterEditDayCycle::onOpen(const LLSD& key)
+{
+ bool new_day = isNewDay();
+ std::string param = key.asString();
+ std::string floater_title = getString(std::string("title_") + param);
+ std::string hint = getString(std::string("hint_" + param));
+
+ // Update floater title.
+ setTitle(floater_title);
+
+ // Update the hint at the top.
+ getChild<LLUICtrl>("hint")->setValue(hint);
+
+ // Hide the hint to the right of the combo if we're invoked to create a new preset.
+ getChildView("note")->setVisible(!new_day);
+
+ // Switch between the day cycle presets combobox and day cycle name input field.
+ mDayCyclesCombo->setVisible(!new_day);
+ mDayCycleNameEditor->setVisible(new_day);
+
+ // TODO: Make sure only one instance of the floater exists?
+
+ reset();
+}
+
+// virtual
+void LLFloaterEditDayCycle::onClose(bool app_quitting)
+{
+ if (!app_quitting) // there's no point to change environment if we're quitting
+ {
+ LLEnvManagerNew::instance().usePrefs(); // revert changes made to current day cycle
+ }
+}
+
+// virtual
+void LLFloaterEditDayCycle::draw()
+{
+ syncTimeSlider();
+ LLFloater::draw();
+}
+
+void LLFloaterEditDayCycle::initCallbacks(void)
+{
+ mDayCycleNameEditor->setKeystrokeCallback(boost::bind(&LLFloaterEditDayCycle::onDayCycleNameEdited, this), NULL);
+ mDayCyclesCombo->setCommitCallback(boost::bind(&LLFloaterEditDayCycle::onDayCycleSelected, this));
+ mDayCyclesCombo->setTextEntryCallback(boost::bind(&LLFloaterEditDayCycle::onDayCycleNameEdited, this));
+ mTimeSlider->setCommitCallback(boost::bind(&LLFloaterEditDayCycle::onTimeSliderMoved, this));
+ mKeysSlider->setCommitCallback(boost::bind(&LLFloaterEditDayCycle::onKeyTimeMoved, this));
+ mTimeCtrl->setCommitCallback(boost::bind(&LLFloaterEditDayCycle::onKeyTimeChanged, this));
+ mSkyPresetsCombo->setCommitCallback(boost::bind(&LLFloaterEditDayCycle::onKeyPresetChanged, this));
+
+ getChild<LLButton>("WLAddKey")->setClickedCallback(boost::bind(&LLFloaterEditDayCycle::onAddKey, this));
+ getChild<LLButton>("WLDeleteKey")->setClickedCallback(boost::bind(&LLFloaterEditDayCycle::onDeleteKey, this));
+
+ mSaveButton->setCommitCallback(boost::bind(&LLFloaterEditDayCycle::onBtnSave, this));
+ mSaveButton->setRightMouseDownCallback(boost::bind(&LLFloaterEditDayCycle::dumpTrack, this));
+ getChild<LLButton>("cancel")->setCommitCallback(boost::bind(&LLFloaterEditDayCycle::onBtnCancel, this));
+
+ // Connect to env manager events.
+ LLEnvManagerNew& env_mgr = LLEnvManagerNew::instance();
+ env_mgr.setRegionSettingsChangeCallback(boost::bind(&LLFloaterEditDayCycle::onRegionSettingsChange, this));
+ env_mgr.setRegionChangeCallback(boost::bind(&LLFloaterEditDayCycle::onRegionChange, this));
+ env_mgr.setRegionSettingsAppliedCallback(boost::bind(&LLFloaterEditDayCycle::onRegionSettingsApplied, this, _1));
+
+ // Connect to day cycle manager events.
+ LLDayCycleManager::instance().setModifyCallback(boost::bind(&LLFloaterEditDayCycle::onDayCycleListChange, this));
+
+ // Connect to sky preset list changes.
+ LLWLParamManager::instance().setPresetListChangeCallback(boost::bind(&LLFloaterEditDayCycle::onSkyPresetListChange, this));
+
+ // Connect to region info updates.
+ LLRegionInfoModel::instance().setUpdateCallback(boost::bind(&LLFloaterEditDayCycle::onRegionInfoUpdate, this));
+}
+
+void LLFloaterEditDayCycle::syncTimeSlider()
+{
+ // set time
+ mTimeSlider->setCurSliderValue((F32)LLWLParamManager::getInstance()->mAnimator.getDayTime() * sHoursPerDay);
+}
+
+void LLFloaterEditDayCycle::loadTrack()
+{
+ // clear the slider
+ mKeysSlider->clear();
+ mSliderToKey.clear();
+
+ // add sliders
+
+ lldebugs << "Adding " << LLWLParamManager::getInstance()->mDay.mTimeMap.size() << " keys to slider" << llendl;
+
+ LLWLDayCycle& cur_dayp = LLWLParamManager::instance().mDay;
+ for (std::map<F32, LLWLParamKey>::iterator it = cur_dayp.mTimeMap.begin(); it != cur_dayp.mTimeMap.end(); ++it)
+ {
+ addSliderKey(it->first * sHoursPerDay, it->second);
+ }
+
+ // set drop-down menu to match preset of currently-selected keyframe (one is automatically selected initially)
+ const std::string& cur_sldr = mKeysSlider->getCurSlider();
+ if (strlen(cur_sldr.c_str()) > 0) // only do this if there is a curSldr, otherwise we put an invalid entry into the map
+ {
+ mSkyPresetsCombo->selectByValue(mSliderToKey[cur_sldr].keyframe.toStringVal());
+ }
+
+ syncTimeSlider();
+}
+
+void LLFloaterEditDayCycle::applyTrack()
+{
+ lldebugs << "Applying track (" << mSliderToKey.size() << ")" << llendl;
+
+ // if no keys, do nothing
+ if (mSliderToKey.size() == 0)
+ {
+ lldebugs << "No keys, not syncing" << llendl;
+ return;
+ }
+
+ llassert_always(mSliderToKey.size() == mKeysSlider->getValue().size());
+
+ // create a new animation track
+ LLWLParamManager::getInstance()->mDay.clearKeyframes();
+
+ // add the keys one by one
+ for (std::map<std::string, SliderKey>::iterator it = mSliderToKey.begin();
+ it != mSliderToKey.end(); ++it)
+ {
+ LLWLParamManager::getInstance()->mDay.addKeyframe(it->second.time / sHoursPerDay,
+ it->second.keyframe);
+ }
+
+ // set the param manager's track to the new one
+ LLWLParamManager::getInstance()->resetAnimator(
+ mTimeSlider->getCurSliderValue() / sHoursPerDay, false);
+
+ LLWLParamManager::getInstance()->mAnimator.update(
+ LLWLParamManager::getInstance()->mCurParams);
+}
+
+void LLFloaterEditDayCycle::refreshSkyPresetsList()
+{
+ // Don't allow selecting region skies for a local day cycle,
+ // because thus we may end up with invalid day cycle.
+ bool include_region_skies = getSelectedDayCycle().scope == LLEnvKey::SCOPE_REGION;
+
+ mSkyPresetsCombo->removeall();
+
+ LLWLParamManager::preset_name_list_t region_presets;
+ LLWLParamManager::preset_name_list_t user_presets, sys_presets;
+ LLWLParamManager::instance().getPresetNames(region_presets, user_presets, sys_presets);
+
+ if (include_region_skies)
+ {
+ // Add region presets.
+ for (LLWLParamManager::preset_name_list_t::const_iterator it = region_presets.begin(); it != region_presets.end(); ++it)
+ {
+ std::string preset_name = *it;
+ std::string item_title = preset_name + " (" + getRegionName() + ")";
+ mSkyPresetsCombo->add(preset_name, LLWLParamKey(*it, LLEnvKey::SCOPE_REGION).toStringVal());
+ }
+
+ if (!region_presets.empty())
+ {
+ mSkyPresetsCombo->addSeparator();
+ }
+ }
+
+ // Add user presets.
+ for (LLWLParamManager::preset_name_list_t::const_iterator it = user_presets.begin(); it != user_presets.end(); ++it)
+ {
+ mSkyPresetsCombo->add(*it, LLWLParamKey(*it, LLEnvKey::SCOPE_LOCAL).toStringVal());
+ }
+
+ if (!user_presets.empty())
+ {
+ mSkyPresetsCombo->addSeparator();
+ }
+
+ // Add system presets.
+ for (LLWLParamManager::preset_name_list_t::const_iterator it = sys_presets.begin(); it != sys_presets.end(); ++it)
+ {
+ mSkyPresetsCombo->add(*it, LLWLParamKey(*it, LLEnvKey::SCOPE_LOCAL).toStringVal());
+ }
+
+ // set defaults on combo boxes
+ mSkyPresetsCombo->selectFirstItem();
+}
+
+void LLFloaterEditDayCycle::refreshDayCyclesList()
+{
+ llassert(isNewDay() == false);
+
+ mDayCyclesCombo->removeall();
+
+#if 0 // Disable editing existing day cycle until the workflow is clear enough.
+ const LLSD& region_day = LLEnvManagerNew::instance().getRegionSettings().getWLDayCycle();
+ if (region_day.size() > 0)
+ {
+ LLWLParamKey key(getRegionName(), LLEnvKey::SCOPE_REGION);
+ mDayCyclesCombo->add(key.name, key.toLLSD());
+ mDayCyclesCombo->addSeparator();
+ }
+#endif
+
+ LLDayCycleManager::preset_name_list_t user_days, sys_days;
+ LLDayCycleManager::instance().getPresetNames(user_days, sys_days);
+
+ // Add user days.
+ for (LLDayCycleManager::preset_name_list_t::const_iterator it = user_days.begin(); it != user_days.end(); ++it)
+ {
+ mDayCyclesCombo->add(*it, LLWLParamKey(*it, LLEnvKey::SCOPE_LOCAL).toLLSD());
+ }
+
+ if (user_days.size() > 0)
+ {
+ mDayCyclesCombo->addSeparator();
+ }
+
+ // Add system days.
+ for (LLDayCycleManager::preset_name_list_t::const_iterator it = sys_days.begin(); it != sys_days.end(); ++it)
+ {
+ mDayCyclesCombo->add(*it, LLWLParamKey(*it, LLEnvKey::SCOPE_LOCAL).toLLSD());
+ }
+
+ mDayCyclesCombo->setLabel(getString("combo_label"));
+}
+
+void LLFloaterEditDayCycle::onTimeSliderMoved()
+{
+ /// get the slider value
+ F32 val = mTimeSlider->getCurSliderValue() / sHoursPerDay;
+
+ // set the value, turn off animation
+ LLWLParamManager::getInstance()->mAnimator.setDayTime((F64)val);
+ LLWLParamManager::getInstance()->mAnimator.deactivate();
+
+ // then call update once
+ LLWLParamManager::getInstance()->mAnimator.update(
+ LLWLParamManager::getInstance()->mCurParams);
+}
+
+void LLFloaterEditDayCycle::onKeyTimeMoved()
+{
+ if (mKeysSlider->getValue().size() == 0)
+ {
+ return;
+ }
+
+ // make sure we have a slider
+ const std::string& cur_sldr = mKeysSlider->getCurSlider();
+ if (cur_sldr == "")
+ {
+ return;
+ }
+
+ F32 time24 = mKeysSlider->getCurSliderValue();
+
+ // check to see if a key exists
+ LLWLParamKey key = mSliderToKey[cur_sldr].keyframe;
+ lldebugs << "Setting key time: " << time24 << LL_ENDL;
+ mSliderToKey[cur_sldr].time = time24;
+
+ // if it exists, turn on check box
+ mSkyPresetsCombo->selectByValue(key.toStringVal());
+
+ mTimeCtrl->setTime24(time24);
+
+ applyTrack();
+}
+
+void LLFloaterEditDayCycle::onKeyTimeChanged()
+{
+ // if no keys, skipped
+ if (mSliderToKey.size() == 0)
+ {
+ return;
+ }
+
+ F32 time24 = mTimeCtrl->getTime24();
+
+ const std::string& cur_sldr = mKeysSlider->getCurSlider();
+ mKeysSlider->setCurSliderValue(time24, TRUE);
+ F32 time = mKeysSlider->getCurSliderValue() / sHoursPerDay;
+
+ // now set the key's time in the sliderToKey map
+ lldebugs << "Setting key time: " << time << LL_ENDL;
+ mSliderToKey[cur_sldr].time = time;
+
+ applyTrack();
+}
+
+void LLFloaterEditDayCycle::onKeyPresetChanged()
+{
+ // do nothing if no sliders
+ if (mKeysSlider->getValue().size() == 0)
+ {
+ return;
+ }
+
+ // change the map
+
+ std::string stringVal = mSkyPresetsCombo->getSelectedValue().asString();
+ LLWLParamKey new_key(stringVal);
+ llassert(!new_key.name.empty());
+ const std::string& cur_sldr = mKeysSlider->getCurSlider();
+
+ // if null, don't use
+ if (cur_sldr == "")
+ {
+ return;
+ }
+
+ mSliderToKey[cur_sldr].keyframe = new_key;
+
+ // Apply changes to current day cycle.
+ applyTrack();
+}
+
+void LLFloaterEditDayCycle::onAddKey()
+{
+ llassert_always(mSliderToKey.size() == mKeysSlider->getValue().size());
+
+ S32 max_sliders;
+ LLEnvKey::EScope scope = LLEnvKey::SCOPE_LOCAL; // *TODO: editing region day cycle
+ switch (scope)
+ {
+ case LLEnvKey::SCOPE_LOCAL:
+ max_sliders = 20; // *HACK this should be LLWLPacketScrubber::MAX_LOCAL_KEY_FRAMES;
+ break;
+ case LLEnvKey::SCOPE_REGION:
+ max_sliders = 12; // *HACK this should be LLWLPacketScrubber::MAX_REGION_KEY_FRAMES;
+ break;
+ default:
+ max_sliders = (S32) mKeysSlider->getMaxValue();
+ break;
+ }
+
+ if ((S32)mSliderToKey.size() >= max_sliders)
+ {
+ LLSD args;
+ args["SCOPE"] = LLEnvManagerNew::getScopeString(scope);
+ args["MAX"] = max_sliders;
+ LLNotificationsUtil::add("DayCycleTooManyKeyframes", args, LLSD(), LLNotificationFunctorRegistry::instance().DONOTHING);
+ return;
+ }
+
+ // add the slider key
+ std::string key_val = mSkyPresetsCombo->getSelectedValue().asString();
+ LLWLParamKey sky_params(key_val);
+ llassert(!sky_params.name.empty());
+
+ F32 time = mTimeSlider->getCurSliderValue();
+ addSliderKey(time, sky_params);
+
+ // apply the change to current day cycles
+ applyTrack();
+}
+
+void LLFloaterEditDayCycle::addSliderKey(F32 time, LLWLParamKey keyframe)
+{
+ // make a slider
+ const std::string& sldr_name = mKeysSlider->addSlider(time);
+ if (sldr_name.empty())
+ {
+ return;
+ }
+
+ // set the key
+ SliderKey newKey(keyframe, mKeysSlider->getCurSliderValue());
+
+ llassert_always(sldr_name != LLStringUtil::null);
+
+ // add to map
+ mSliderToKey.insert(std::pair<std::string, SliderKey>(sldr_name, newKey));
+
+ llassert_always(mSliderToKey.size() == mKeysSlider->getValue().size());
+}
+
+LLWLParamKey LLFloaterEditDayCycle::getSelectedDayCycle()
+{
+ LLWLParamKey dc_key;
+
+ if (mDayCycleNameEditor->getVisible())
+ {
+ dc_key.name = mDayCycleNameEditor->getText();
+ dc_key.scope = LLEnvKey::SCOPE_LOCAL;
+ }
+ else
+ {
+ LLSD combo_val = mDayCyclesCombo->getValue();
+
+ if (!combo_val.isArray()) // manually typed text
+ {
+ dc_key.name = combo_val.asString();
+ dc_key.scope = LLEnvKey::SCOPE_LOCAL;
+ }
+ else
+ {
+ dc_key.fromLLSD(combo_val);
+ }
+ }
+
+ return dc_key;
+}
+
+bool LLFloaterEditDayCycle::isNewDay() const
+{
+ return mKey.asString() == "new";
+}
+
+void LLFloaterEditDayCycle::dumpTrack()
+{
+ LL_DEBUGS("Windlight") << "Dumping day cycle" << LL_ENDL;
+
+ LLWLDayCycle& cur_dayp = LLWLParamManager::instance().mDay;
+ for (std::map<F32, LLWLParamKey>::iterator it = cur_dayp.mTimeMap.begin(); it != cur_dayp.mTimeMap.end(); ++it)
+ {
+ F32 time = it->first * 24.0f;
+ S32 h = (S32) time;
+ S32 m = (S32) ((time - h) * 60.0f);
+ LL_DEBUGS("Windlight") << llformat("(%.3f) %02d:%02d", time, h, m) << " => " << it->second.name << LL_ENDL;
+ }
+}
+
+void LLFloaterEditDayCycle::enableEditing(bool enable)
+{
+ mSkyPresetsCombo->setEnabled(enable);
+ mTimeCtrl->setEnabled(enable);
+ getChild<LLPanel>("day_cycle_slider_panel")->setCtrlsEnabled(enable);
+ mSaveButton->setEnabled(enable);
+ mMakeDefaultCheckBox->setEnabled(enable);
+}
+
+void LLFloaterEditDayCycle::reset()
+{
+ // clear the slider
+ mKeysSlider->clear();
+ mSliderToKey.clear();
+
+ refreshSkyPresetsList();
+
+ if (isNewDay())
+ {
+ mDayCycleNameEditor->setValue(LLSD());
+ F32 time = 0.5f * sHoursPerDay;
+ mSaveButton->setEnabled(FALSE); // will be enabled as soon as users enters a name
+ mTimeSlider->setCurSliderValue(time);
+
+ addSliderKey(time, LLWLParamKey("Default", LLEnvKey::SCOPE_LOCAL));
+ onKeyTimeMoved(); // update the time control and sky sky combo
+
+ applyTrack();
+ }
+ else
+ {
+ refreshDayCyclesList();
+
+ // Disable controls until a day cycle to edit is selected.
+ enableEditing(false);
+ }
+}
+
+void LLFloaterEditDayCycle::saveRegionDayCycle()
+{
+ LLEnvManagerNew& env_mgr = LLEnvManagerNew::instance();
+ LLWLDayCycle& cur_dayp = LLWLParamManager::instance().mDay; // the day cycle being edited
+
+ // Get current day cycle and the sky preset it references.
+ LLSD day_cycle = cur_dayp.asLLSD();
+ LLSD sky_map;
+ cur_dayp.getSkyMap(sky_map);
+
+ // Apply it to the region.
+ LLEnvironmentSettings new_region_settings;
+ new_region_settings.saveParams(day_cycle, sky_map, env_mgr.getRegionSettings().getWaterParams(), 0.0f);
+
+#if 1
+ LLEnvManagerNew::instance().setRegionSettings(new_region_settings);
+#else // Temporary disabled ability to upload new region settings from the Day Cycle Editor.
+ if (!LLEnvManagerNew::instance().sendRegionSettings(new_region_settings))
+ {
+ llwarns << "Error applying region environment settings" << llendl;
+ return;
+ }
+
+ setApplyProgress(true);
+#endif
+}
+
+void LLFloaterEditDayCycle::setApplyProgress(bool started)
+{
+ LLLoadingIndicator* indicator = getChild<LLLoadingIndicator>("progress_indicator");
+
+ indicator->setVisible(started);
+
+ if (started)
+ {
+ indicator->start();
+ }
+ else
+ {
+ indicator->stop();
+ }
+}
+
+bool LLFloaterEditDayCycle::getApplyProgress() const
+{
+ return getChild<LLLoadingIndicator>("progress_indicator")->getVisible();
+}
+
+void LLFloaterEditDayCycle::onDeleteKey()
+{
+ if (mSliderToKey.size() == 0)
+ {
+ return;
+ }
+ else if (mSliderToKey.size() == 1)
+ {
+ LLNotifications::instance().add("EnvCannotDeleteLastDayCycleKey", LLSD(), LLSD());
+ return;
+ }
+
+ // delete from map
+ const std::string& sldr_name = mKeysSlider->getCurSlider();
+ std::map<std::string, SliderKey>::iterator mIt = mSliderToKey.find(sldr_name);
+ mSliderToKey.erase(mIt);
+
+ mKeysSlider->deleteCurSlider();
+
+ if (mSliderToKey.size() == 0)
+ {
+ return;
+ }
+
+ const std::string& name = mKeysSlider->getCurSlider();
+ mSkyPresetsCombo->selectByValue(mSliderToKey[name].keyframe.toStringVal());
+ F32 time24 = mSliderToKey[name].time;
+
+ mTimeCtrl->setTime24(time24);
+
+ applyTrack();
+}
+
+void LLFloaterEditDayCycle::onRegionSettingsChange()
+{
+ LL_DEBUGS("Windlight") << "Region settings changed" << LL_ENDL;
+
+ if (getApplyProgress()) // our region settings have being applied
+ {
+ setApplyProgress(false);
+
+ // Change preference if requested.
+ if (mMakeDefaultCheckBox->getValue())
+ {
+ LL_DEBUGS("Windlight") << "Changed environment preference to region settings" << llendl;
+ LLEnvManagerNew::instance().setUseRegionSettings(true);
+ }
+
+ closeFloater();
+ }
+}
+
+void LLFloaterEditDayCycle::onRegionChange()
+{
+ LL_DEBUGS("Windlight") << "Region changed" << LL_ENDL;
+
+ // If we're editing the region day cycle
+ if (getSelectedDayCycle().scope == LLEnvKey::SCOPE_REGION)
+ {
+ reset(); // undoes all unsaved changes
+ }
+}
+
+void LLFloaterEditDayCycle::onRegionSettingsApplied(bool success)
+{
+ LL_DEBUGS("Windlight") << "Region settings applied: " << success << LL_ENDL;
+
+ if (!success)
+ {
+ // stop progress indicator
+ setApplyProgress(false);
+ }
+}
+
+void LLFloaterEditDayCycle::onRegionInfoUpdate()
+{
+ LL_DEBUGS("Windlight") << "Region info updated" << LL_ENDL;
+ bool can_edit = true;
+
+ // If we've selected the region day cycle for editing.
+ if (getSelectedDayCycle().scope == LLEnvKey::SCOPE_REGION)
+ {
+ // check whether we have the access
+ can_edit = LLEnvManagerNew::canEditRegionSettings();
+ }
+
+ enableEditing(can_edit);
+}
+
+void LLFloaterEditDayCycle::onDayCycleNameEdited()
+{
+ // Disable saving a day cycle having empty name.
+ LLWLParamKey key = getSelectedDayCycle();
+ mSaveButton->setEnabled(!key.name.empty());
+}
+
+void LLFloaterEditDayCycle::onDayCycleSelected()
+{
+ LLSD day_data;
+ LLWLParamKey dc_key = getSelectedDayCycle();
+ bool can_edit = true;
+
+ if (dc_key.scope == LLEnvKey::SCOPE_LOCAL)
+ {
+ if (!LLDayCycleManager::instance().getPreset(dc_key.name, day_data))
+ {
+ llwarns << "No day cycle named " << dc_key.name << llendl;
+ return;
+ }
+ }
+ else
+ {
+ day_data = LLEnvManagerNew::instance().getRegionSettings().getWLDayCycle();
+ if (day_data.size() == 0)
+ {
+ llwarns << "Empty region day cycle" << llendl;
+ llassert(day_data.size() > 0);
+ return;
+ }
+
+ can_edit = LLEnvManagerNew::canEditRegionSettings();
+ }
+
+ // We may need to add or remove region skies from the list.
+ refreshSkyPresetsList();
+
+ F32 slider_time = mTimeSlider->getCurSliderValue() / sHoursPerDay;
+ LLWLParamManager::instance().applyDayCycleParams(day_data, dc_key.scope, slider_time);
+ loadTrack();
+
+ enableEditing(can_edit);
+}
+
+void LLFloaterEditDayCycle::onBtnSave()
+{
+ LLDayCycleManager& day_mgr = LLDayCycleManager::instance();
+ LLWLParamKey selected_day = getSelectedDayCycle();
+
+ if (selected_day.scope == LLEnvKey::SCOPE_REGION)
+ {
+ saveRegionDayCycle();
+ closeFloater();
+ return;
+ }
+
+ std::string name = selected_day.name;
+ if (name.empty())
+ {
+ // *TODO: show an alert
+ llwarns << "Empty day cycle name" << llendl;
+ return;
+ }
+
+ // Don't allow overwriting system presets.
+ if (day_mgr.isSystemPreset(name))
+ {
+ LLNotificationsUtil::add("WLNoEditDefault");
+ return;
+ }
+
+ // Save, ask for confirmation for overwriting an existing preset.
+ if (day_mgr.presetExists(name))
+ {
+ LLNotificationsUtil::add("WLSavePresetAlert", LLSD(), LLSD(), boost::bind(&LLFloaterEditDayCycle::onSaveAnswer, this, _1, _2));
+ }
+ else
+ {
+ // new preset, hence no confirmation needed
+ onSaveConfirmed();
+ }
+}
+
+void LLFloaterEditDayCycle::onBtnCancel()
+{
+ closeFloater();
+}
+
+bool LLFloaterEditDayCycle::onSaveAnswer(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+
+ // If they choose save, do it. Otherwise, don't do anything
+ if (option == 0)
+ {
+ onSaveConfirmed();
+ }
+
+ return false;
+}
+
+void LLFloaterEditDayCycle::onSaveConfirmed()
+{
+ std::string name = getSelectedDayCycle().name;
+
+ // Save preset.
+ LLSD data = LLWLParamManager::instance().mDay.asLLSD();
+ LL_DEBUGS("Windlight") << "Saving day cycle " << name << ": " << data << LL_ENDL;
+ LLDayCycleManager::instance().savePreset(name, data);
+
+ // Change preference if requested.
+ if (mMakeDefaultCheckBox->getValue())
+ {
+ LL_DEBUGS("Windlight") << name << " is now the new preferred day cycle" << llendl;
+ LLEnvManagerNew::instance().setUseDayCycle(name);
+ }
+
+ closeFloater();
+}
+
+void LLFloaterEditDayCycle::onDayCycleListChange()
+{
+ if (!isNewDay())
+ {
+ refreshDayCyclesList();
+ }
+}
+
+void LLFloaterEditDayCycle::onSkyPresetListChange()
+{
+ refreshSkyPresetsList();
+
+ // Refresh sliders from the currently visible day cycle.
+ loadTrack();
+}
+
+// static
+std::string LLFloaterEditDayCycle::getRegionName()
+{
+ return gAgent.getRegion() ? gAgent.getRegion()->getName() : LLTrans::getString("Unknown");
+}
diff --git a/indra/newview/llfloatereditdaycycle.h b/indra/newview/llfloatereditdaycycle.h
new file mode 100644
index 0000000000..e6e4fe39c1
--- /dev/null
+++ b/indra/newview/llfloatereditdaycycle.h
@@ -0,0 +1,137 @@
+/**
+ * @file llfloatereditdaycycle.h
+ * @brief Floater to create or edit a day cycle
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLFLOATEREDITDAYCYCLE_H
+#define LL_LLFLOATEREDITDAYCYCLE_H
+
+#include "llfloater.h"
+
+#include "llwlparammanager.h" // for LLWLParamKey
+
+class LLCheckBoxCtrl;
+class LLComboBox;
+class LLLineEditor;
+class LLMultiSliderCtrl;
+class LLTimeCtrl;
+
+/**
+ * Floater for creating or editing a day cycle.
+ */
+class LLFloaterEditDayCycle : public LLFloater
+{
+ LOG_CLASS(LLFloaterEditDayCycle);
+
+public:
+ LLFloaterEditDayCycle(const LLSD &key);
+
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void onOpen(const LLSD& key);
+ /*virtual*/ void onClose(bool app_quitting);
+ /*virtual*/ void draw();
+
+private:
+
+ /// sync the time slider with day cycle structure
+ void syncTimeSlider();
+
+ // makes sure key slider has what's in day cycle
+ void loadTrack();
+
+ /// makes sure day cycle data structure has what's in menu
+ void applyTrack();
+
+ /// refresh the sky presets combobox
+ void refreshSkyPresetsList();
+
+ /// refresh the day cycle combobox
+ void refreshDayCyclesList();
+
+ /// add a slider to the track
+ void addSliderKey(F32 time, LLWLParamKey keyframe);
+
+ void initCallbacks();
+ LLWLParamKey getSelectedDayCycle();
+ bool isNewDay() const;
+ void dumpTrack();
+ void enableEditing(bool enable);
+ void reset();
+ void saveRegionDayCycle();
+
+ void setApplyProgress(bool started);
+ bool getApplyProgress() const;
+
+ void onTimeSliderMoved(); /// time slider moved
+ void onKeyTimeMoved(); /// a key frame moved
+ void onKeyTimeChanged(); /// a key frame's time changed
+ void onKeyPresetChanged(); /// sky preset selected
+ void onAddKey(); /// new key added on slider
+ void onDeleteKey(); /// a key frame deleted
+
+ void onRegionSettingsChange();
+ void onRegionChange();
+ void onRegionSettingsApplied(bool success);
+ void onRegionInfoUpdate();
+
+ void onDayCycleNameEdited();
+ void onDayCycleSelected();
+ void onBtnSave();
+ void onBtnCancel();
+
+ bool onSaveAnswer(const LLSD& notification, const LLSD& response);
+ void onSaveConfirmed();
+
+ void onDayCycleListChange();
+ void onSkyPresetListChange();
+
+ static std::string getRegionName();
+
+ /// convenience class for holding keyframes mapped to sliders
+ struct SliderKey
+ {
+ public:
+ SliderKey(LLWLParamKey kf, F32 t) : keyframe(kf), time(t) {}
+ SliderKey() : keyframe(), time(0.f) {} // Don't use this default constructor
+
+ LLWLParamKey keyframe;
+ F32 time;
+ };
+
+ static const F32 sHoursPerDay;
+
+ LLLineEditor* mDayCycleNameEditor;
+ LLComboBox* mDayCyclesCombo;
+ LLMultiSliderCtrl* mTimeSlider;
+ LLMultiSliderCtrl* mKeysSlider;
+ LLComboBox* mSkyPresetsCombo;
+ LLTimeCtrl* mTimeCtrl;
+ LLCheckBoxCtrl* mMakeDefaultCheckBox;
+ LLButton* mSaveButton;
+
+ // map of sliders to parameters
+ std::map<std::string, SliderKey> mSliderToKey;
+};
+
+#endif // LL_LLFLOATEREDITDAYCYCLE_H
diff --git a/indra/newview/llfloatereditsky.cpp b/indra/newview/llfloatereditsky.cpp
new file mode 100644
index 0000000000..352361ce9e
--- /dev/null
+++ b/indra/newview/llfloatereditsky.cpp
@@ -0,0 +1,922 @@
+/**
+ * @file llfloatereditsky.cpp
+ * @brief Floater to create or edit a sky preset
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloatereditsky.h"
+
+// libs
+#include "llbutton.h"
+#include "llcheckboxctrl.h"
+#include "llcombobox.h"
+#include "llmultisliderctrl.h"
+#include "llnotifications.h"
+#include "llnotificationsutil.h"
+#include "llsliderctrl.h"
+#include "lltabcontainer.h"
+#include "lltimectrl.h"
+
+// newview
+#include "llagent.h"
+#include "llcolorswatch.h"
+#include "llregioninfomodel.h"
+#include "llviewerregion.h"
+
+static const F32 WL_SUN_AMBIENT_SLIDER_SCALE = 3.0f;
+static const F32 WL_BLUE_HORIZON_DENSITY_SCALE = 2.0f;
+static const F32 WL_CLOUD_SLIDER_SCALE = 1.0f;
+
+static F32 sun_pos_to_time24(F32 sun_pos)
+{
+ return fmodf(sun_pos * 24.0f + 6, 24.0f);
+}
+
+static F32 time24_to_sun_pos(F32 time24)
+{
+ F32 sun_pos = fmodf((time24 - 6) / 24.0f, 1.0f);
+ if (sun_pos < 0) ++sun_pos;
+ return sun_pos;
+}
+
+LLFloaterEditSky::LLFloaterEditSky(const LLSD &key)
+: LLFloater(key)
+, mSkyPresetNameEditor(NULL)
+, mSkyPresetCombo(NULL)
+, mMakeDefaultCheckBox(NULL)
+, mSaveButton(NULL)
+{
+}
+
+// virtual
+BOOL LLFloaterEditSky::postBuild()
+{
+ mSkyPresetNameEditor = getChild<LLLineEditor>("sky_preset_name");
+ mSkyPresetCombo = getChild<LLComboBox>("sky_preset_combo");
+ mMakeDefaultCheckBox = getChild<LLCheckBoxCtrl>("make_default_cb");
+ mSaveButton = getChild<LLButton>("save");
+
+ initCallbacks();
+
+ // Create the sun position scrubber on the slider.
+ getChild<LLMultiSliderCtrl>("WLSunPos")->addSlider(12.f);
+
+ return TRUE;
+}
+
+// virtual
+void LLFloaterEditSky::onOpen(const LLSD& key)
+{
+ bool new_preset = isNewPreset();
+ std::string param = key.asString();
+ std::string floater_title = getString(std::string("title_") + param);
+ std::string hint = getString(std::string("hint_" + param));
+
+ // Update floater title.
+ setTitle(floater_title);
+
+ // Update the hint at the top.
+ getChild<LLUICtrl>("hint")->setValue(hint);
+
+ // Hide the hint to the right of the combo if we're invoked to create a new preset.
+ getChildView("note")->setVisible(!new_preset);
+
+ // Switch between the sky presets combobox and preset name input field.
+ mSkyPresetCombo->setVisible(!new_preset);
+ mSkyPresetNameEditor->setVisible(new_preset);
+
+ reset();
+}
+
+// virtual
+void LLFloaterEditSky::onClose(bool app_quitting)
+{
+ if (!app_quitting) // there's no point to change environment if we're quitting
+ {
+ LLEnvManagerNew::instance().usePrefs(); // revert changes made to current environment
+ }
+}
+
+// virtual
+void LLFloaterEditSky::draw()
+{
+ syncControls();
+ LLFloater::draw();
+}
+
+void LLFloaterEditSky::initCallbacks(void)
+{
+ // *TODO: warn user if a region environment update comes while we're editing a region sky preset.
+
+ mSkyPresetNameEditor->setKeystrokeCallback(boost::bind(&LLFloaterEditSky::onSkyPresetNameEdited, this), NULL);
+ mSkyPresetCombo->setCommitCallback(boost::bind(&LLFloaterEditSky::onSkyPresetSelected, this));
+ mSkyPresetCombo->setTextEntryCallback(boost::bind(&LLFloaterEditSky::onSkyPresetNameEdited, this));
+
+ mSaveButton->setCommitCallback(boost::bind(&LLFloaterEditSky::onBtnSave, this));
+ getChild<LLButton>("cancel")->setCommitCallback(boost::bind(&LLFloaterEditSky::onBtnCancel, this));
+
+ LLEnvManagerNew::instance().setRegionSettingsChangeCallback(boost::bind(&LLFloaterEditSky::onRegionSettingsChange, this));
+ LLWLParamManager::instance().setPresetListChangeCallback(boost::bind(&LLFloaterEditSky::onSkyPresetListChange, this));
+
+ // Connect to region info updates.
+ LLRegionInfoModel::instance().setUpdateCallback(boost::bind(&LLFloaterEditSky::onRegionInfoUpdate, this));
+
+ //-------------------------------------------------------------------------
+
+ LLWLParamManager& param_mgr = LLWLParamManager::instance();
+
+ // blue horizon
+ getChild<LLUICtrl>("WLBlueHorizon")->setCommitCallback(boost::bind(&LLFloaterEditSky::onColorControlMoved, this, _1, &param_mgr.mBlueHorizon));
+
+ // haze density, horizon, mult, and altitude
+ getChild<LLUICtrl>("WLHazeDensity")->setCommitCallback(boost::bind(&LLFloaterEditSky::onFloatControlMoved, this, _1, &param_mgr.mHazeDensity));
+ getChild<LLUICtrl>("WLHazeHorizon")->setCommitCallback(boost::bind(&LLFloaterEditSky::onFloatControlMoved, this, _1, &param_mgr.mHazeHorizon));
+ getChild<LLUICtrl>("WLDensityMult")->setCommitCallback(boost::bind(&LLFloaterEditSky::onFloatControlMoved, this, _1, &param_mgr.mDensityMult));
+ getChild<LLUICtrl>("WLMaxAltitude")->setCommitCallback(boost::bind(&LLFloaterEditSky::onFloatControlMoved, this, _1, &param_mgr.mMaxAlt));
+
+ // blue density
+ getChild<LLUICtrl>("WLBlueDensity")->setCommitCallback(boost::bind(&LLFloaterEditSky::onColorControlMoved, this, _1, &param_mgr.mBlueDensity));
+
+ // Lighting
+
+ // sunlight
+ getChild<LLUICtrl>("WLSunlight")->setCommitCallback(boost::bind(&LLFloaterEditSky::onColorControlMoved, this, _1, &param_mgr.mSunlight));
+
+ // glow
+ getChild<LLUICtrl>("WLGlowR")->setCommitCallback(boost::bind(&LLFloaterEditSky::onGlowRMoved, this, _1, &param_mgr.mGlow));
+ getChild<LLUICtrl>("WLGlowB")->setCommitCallback(boost::bind(&LLFloaterEditSky::onGlowBMoved, this, _1, &param_mgr.mGlow));
+
+ // ambient
+ getChild<LLUICtrl>("WLAmbient")->setCommitCallback(boost::bind(&LLFloaterEditSky::onColorControlMoved, this, _1, &param_mgr.mAmbient));
+
+ // time of day
+ getChild<LLUICtrl>("WLSunPos")->setCommitCallback(boost::bind(&LLFloaterEditSky::onSunMoved, this, _1, &param_mgr.mLightnorm)); // multi-slider
+ getChild<LLTimeCtrl>("WLDayTime")->setCommitCallback(boost::bind(&LLFloaterEditSky::onTimeChanged, this)); // time ctrl
+ getChild<LLUICtrl>("WLEastAngle")->setCommitCallback(boost::bind(&LLFloaterEditSky::onSunMoved, this, _1, &param_mgr.mLightnorm));
+
+ // Clouds
+
+ // Cloud Color
+ getChild<LLUICtrl>("WLCloudColor")->setCommitCallback(boost::bind(&LLFloaterEditSky::onColorControlMoved, this, _1, &param_mgr.mCloudColor));
+
+ // Cloud
+ getChild<LLUICtrl>("WLCloudX")->setCommitCallback(boost::bind(&LLFloaterEditSky::onColorControlRMoved, this, _1, &param_mgr.mCloudMain));
+ getChild<LLUICtrl>("WLCloudY")->setCommitCallback(boost::bind(&LLFloaterEditSky::onColorControlGMoved, this, _1, &param_mgr.mCloudMain));
+ getChild<LLUICtrl>("WLCloudDensity")->setCommitCallback(boost::bind(&LLFloaterEditSky::onColorControlBMoved, this, _1, &param_mgr.mCloudMain));
+
+ // Cloud Detail
+ getChild<LLUICtrl>("WLCloudDetailX")->setCommitCallback(boost::bind(&LLFloaterEditSky::onColorControlRMoved, this, _1, &param_mgr.mCloudDetail));
+ getChild<LLUICtrl>("WLCloudDetailY")->setCommitCallback(boost::bind(&LLFloaterEditSky::onColorControlGMoved, this, _1, &param_mgr.mCloudDetail));
+ getChild<LLUICtrl>("WLCloudDetailDensity")->setCommitCallback(boost::bind(&LLFloaterEditSky::onColorControlBMoved, this, _1, &param_mgr.mCloudDetail));
+
+ // Cloud extras
+ getChild<LLUICtrl>("WLCloudCoverage")->setCommitCallback(boost::bind(&LLFloaterEditSky::onFloatControlMoved, this, _1, &param_mgr.mCloudCoverage));
+ getChild<LLUICtrl>("WLCloudScale")->setCommitCallback(boost::bind(&LLFloaterEditSky::onFloatControlMoved, this, _1, &param_mgr.mCloudScale));
+ getChild<LLUICtrl>("WLCloudLockX")->setCommitCallback(boost::bind(&LLFloaterEditSky::onCloudScrollXToggled, this, _1));
+ getChild<LLUICtrl>("WLCloudLockY")->setCommitCallback(boost::bind(&LLFloaterEditSky::onCloudScrollYToggled, this, _1));
+ getChild<LLUICtrl>("WLCloudScrollX")->setCommitCallback(boost::bind(&LLFloaterEditSky::onCloudScrollXMoved, this, _1));
+ getChild<LLUICtrl>("WLCloudScrollY")->setCommitCallback(boost::bind(&LLFloaterEditSky::onCloudScrollYMoved, this, _1));
+ getChild<LLUICtrl>("WLDistanceMult")->setCommitCallback(boost::bind(&LLFloaterEditSky::onFloatControlMoved, this, _1, &param_mgr.mDistanceMult));
+
+ // Dome
+ getChild<LLUICtrl>("WLGamma")->setCommitCallback(boost::bind(&LLFloaterEditSky::onFloatControlMoved, this, _1, &param_mgr.mWLGamma));
+ getChild<LLUICtrl>("WLStarAlpha")->setCommitCallback(boost::bind(&LLFloaterEditSky::onStarAlphaMoved, this, _1));
+}
+
+//=================================================================================================
+
+void LLFloaterEditSky::syncControls()
+{
+ bool err;
+
+ LLWLParamManager * param_mgr = LLWLParamManager::getInstance();
+
+ LLWLParamSet& cur_params = param_mgr->mCurParams;
+
+ // blue horizon
+ param_mgr->mBlueHorizon = cur_params.getVector(param_mgr->mBlueHorizon.mName, err);
+ setColorSwatch("WLBlueHorizon", param_mgr->mBlueHorizon, WL_BLUE_HORIZON_DENSITY_SCALE);
+
+ // haze density, horizon, mult, and altitude
+ param_mgr->mHazeDensity = cur_params.getFloat(param_mgr->mHazeDensity.mName, err);
+ childSetValue("WLHazeDensity", (F32) param_mgr->mHazeDensity);
+ param_mgr->mHazeHorizon = cur_params.getFloat(param_mgr->mHazeHorizon.mName, err);
+ childSetValue("WLHazeHorizon", (F32) param_mgr->mHazeHorizon);
+ param_mgr->mDensityMult = cur_params.getFloat(param_mgr->mDensityMult.mName, err);
+ childSetValue("WLDensityMult", ((F32) param_mgr->mDensityMult) * param_mgr->mDensityMult.mult);
+ param_mgr->mMaxAlt = cur_params.getFloat(param_mgr->mMaxAlt.mName, err);
+ childSetValue("WLMaxAltitude", (F32) param_mgr->mMaxAlt);
+
+ // blue density
+ param_mgr->mBlueDensity = cur_params.getVector(param_mgr->mBlueDensity.mName, err);
+ setColorSwatch("WLBlueDensity", param_mgr->mBlueDensity, WL_BLUE_HORIZON_DENSITY_SCALE);
+
+ // Lighting
+
+ // sunlight
+ param_mgr->mSunlight = cur_params.getVector(param_mgr->mSunlight.mName, err);
+ setColorSwatch("WLSunlight", param_mgr->mSunlight, WL_SUN_AMBIENT_SLIDER_SCALE);
+
+ // glow
+ param_mgr->mGlow = cur_params.getVector(param_mgr->mGlow.mName, err);
+ childSetValue("WLGlowR", 2 - param_mgr->mGlow.r / 20.0f);
+ childSetValue("WLGlowB", -param_mgr->mGlow.b / 5.0f);
+
+ // ambient
+ param_mgr->mAmbient = cur_params.getVector(param_mgr->mAmbient.mName, err);
+ setColorSwatch("WLAmbient", param_mgr->mAmbient, WL_SUN_AMBIENT_SLIDER_SCALE);
+
+ F32 time24 = sun_pos_to_time24(param_mgr->mCurParams.getFloat("sun_angle",err) / F_TWO_PI);
+ getChild<LLMultiSliderCtrl>("WLSunPos")->setCurSliderValue(time24, TRUE);
+ getChild<LLTimeCtrl>("WLDayTime")->setTime24(time24);
+ childSetValue("WLEastAngle", param_mgr->mCurParams.getFloat("east_angle",err) / F_TWO_PI);
+
+ // Clouds
+
+ // Cloud Color
+ param_mgr->mCloudColor = cur_params.getVector(param_mgr->mCloudColor.mName, err);
+ setColorSwatch("WLCloudColor", param_mgr->mCloudColor, WL_CLOUD_SLIDER_SCALE);
+
+ // Cloud
+ param_mgr->mCloudMain = cur_params.getVector(param_mgr->mCloudMain.mName, err);
+ childSetValue("WLCloudX", param_mgr->mCloudMain.r);
+ childSetValue("WLCloudY", param_mgr->mCloudMain.g);
+ childSetValue("WLCloudDensity", param_mgr->mCloudMain.b);
+
+ // Cloud Detail
+ param_mgr->mCloudDetail = cur_params.getVector(param_mgr->mCloudDetail.mName, err);
+ childSetValue("WLCloudDetailX", param_mgr->mCloudDetail.r);
+ childSetValue("WLCloudDetailY", param_mgr->mCloudDetail.g);
+ childSetValue("WLCloudDetailDensity", param_mgr->mCloudDetail.b);
+
+ // Cloud extras
+ param_mgr->mCloudCoverage = cur_params.getFloat(param_mgr->mCloudCoverage.mName, err);
+ param_mgr->mCloudScale = cur_params.getFloat(param_mgr->mCloudScale.mName, err);
+ childSetValue("WLCloudCoverage", (F32) param_mgr->mCloudCoverage);
+ childSetValue("WLCloudScale", (F32) param_mgr->mCloudScale);
+
+ // cloud scrolling
+ bool lockX = !param_mgr->mCurParams.getEnableCloudScrollX();
+ bool lockY = !param_mgr->mCurParams.getEnableCloudScrollY();
+ childSetValue("WLCloudLockX", lockX);
+ childSetValue("WLCloudLockY", lockY);
+
+ // disable if locked, enable if not
+ if (lockX)
+ {
+ childDisable("WLCloudScrollX");
+ }
+ else
+ {
+ childEnable("WLCloudScrollX");
+ }
+ if (lockY)
+ {
+ childDisable("WLCloudScrollY");
+ }
+ else
+ {
+ childEnable("WLCloudScrollY");
+ }
+
+ // *HACK cloud scrolling is off my an additive of 10
+ childSetValue("WLCloudScrollX", param_mgr->mCurParams.getCloudScrollX() - 10.0f);
+ childSetValue("WLCloudScrollY", param_mgr->mCurParams.getCloudScrollY() - 10.0f);
+
+ param_mgr->mDistanceMult = cur_params.getFloat(param_mgr->mDistanceMult.mName, err);
+ childSetValue("WLDistanceMult", (F32) param_mgr->mDistanceMult);
+
+ // Tweak extras
+
+ param_mgr->mWLGamma = cur_params.getFloat(param_mgr->mWLGamma.mName, err);
+ childSetValue("WLGamma", (F32) param_mgr->mWLGamma);
+
+ childSetValue("WLStarAlpha", param_mgr->mCurParams.getStarBrightness());
+}
+
+void LLFloaterEditSky::setColorSwatch(const std::string& name, const WLColorControl& from_ctrl, F32 k)
+{
+ // Set the value, dividing it by <k> first.
+ LLVector4 color_vec = from_ctrl;
+ getChild<LLColorSwatchCtrl>(name)->set(LLColor4(color_vec / k));
+}
+
+// color control callbacks
+void LLFloaterEditSky::onColorControlMoved(LLUICtrl* ctrl, WLColorControl* color_ctrl)
+{
+ LLWLParamManager::getInstance()->mAnimator.deactivate();
+
+ LLColorSwatchCtrl* swatch = static_cast<LLColorSwatchCtrl*>(ctrl);
+ LLVector4 color_vec(swatch->get().mV);
+
+ // Set intensity to maximum of the RGB values.
+ color_vec.mV[3] = llmax(color_vec.mV[0], llmax(color_vec.mV[1], color_vec.mV[2]));
+
+ // Multiply RGB values by the appropriate factor.
+ F32 k = WL_CLOUD_SLIDER_SCALE;
+ if (color_ctrl->isSunOrAmbientColor)
+ {
+ k = WL_SUN_AMBIENT_SLIDER_SCALE;
+ }
+ if (color_ctrl->isBlueHorizonOrDensity)
+ {
+ k = WL_BLUE_HORIZON_DENSITY_SCALE;
+ }
+
+ color_vec *= k; // intensity isn't affected by the multiplication
+
+ // Apply the new RGBI value.
+ *color_ctrl = color_vec;
+ color_ctrl->update(LLWLParamManager::getInstance()->mCurParams);
+ LLWLParamManager::getInstance()->propagateParameters();
+}
+
+void LLFloaterEditSky::onColorControlRMoved(LLUICtrl* ctrl, void* userdata)
+{
+ LLWLParamManager::getInstance()->mAnimator.deactivate();
+
+ LLSliderCtrl* sldr_ctrl = static_cast<LLSliderCtrl*>(ctrl);
+ WLColorControl* color_ctrl = static_cast<WLColorControl *>(userdata);
+
+ color_ctrl->r = sldr_ctrl->getValueF32();
+ if (color_ctrl->isSunOrAmbientColor)
+ {
+ color_ctrl->r *= WL_SUN_AMBIENT_SLIDER_SCALE;
+ }
+ if (color_ctrl->isBlueHorizonOrDensity)
+ {
+ color_ctrl->r *= WL_BLUE_HORIZON_DENSITY_SCALE;
+ }
+
+ // move i if it's the max
+ if (color_ctrl->r >= color_ctrl->g && color_ctrl->r >= color_ctrl->b && color_ctrl->hasSliderName)
+ {
+ color_ctrl->i = color_ctrl->r;
+ std::string name = color_ctrl->mSliderName;
+ name.append("I");
+
+ if (color_ctrl->isSunOrAmbientColor)
+ {
+ childSetValue(name, color_ctrl->r / WL_SUN_AMBIENT_SLIDER_SCALE);
+ }
+ else if (color_ctrl->isBlueHorizonOrDensity)
+ {
+ childSetValue(name, color_ctrl->r / WL_BLUE_HORIZON_DENSITY_SCALE);
+ }
+ else
+ {
+ childSetValue(name, color_ctrl->r);
+ }
+ }
+
+ color_ctrl->update(LLWLParamManager::getInstance()->mCurParams);
+
+ LLWLParamManager::getInstance()->propagateParameters();
+}
+
+void LLFloaterEditSky::onColorControlGMoved(LLUICtrl* ctrl, void* userdata)
+{
+ LLWLParamManager::getInstance()->mAnimator.deactivate();
+
+ LLSliderCtrl* sldr_ctrl = static_cast<LLSliderCtrl*>(ctrl);
+ WLColorControl* color_ctrl = static_cast<WLColorControl *>(userdata);
+
+ color_ctrl->g = sldr_ctrl->getValueF32();
+ if (color_ctrl->isSunOrAmbientColor)
+ {
+ color_ctrl->g *= WL_SUN_AMBIENT_SLIDER_SCALE;
+ }
+ if (color_ctrl->isBlueHorizonOrDensity)
+ {
+ color_ctrl->g *= WL_BLUE_HORIZON_DENSITY_SCALE;
+ }
+
+ // move i if it's the max
+ if (color_ctrl->g >= color_ctrl->r && color_ctrl->g >= color_ctrl->b && color_ctrl->hasSliderName)
+ {
+ color_ctrl->i = color_ctrl->g;
+ std::string name = color_ctrl->mSliderName;
+ name.append("I");
+
+ if (color_ctrl->isSunOrAmbientColor)
+ {
+ childSetValue(name, color_ctrl->g / WL_SUN_AMBIENT_SLIDER_SCALE);
+ }
+ else if (color_ctrl->isBlueHorizonOrDensity)
+ {
+ childSetValue(name, color_ctrl->g / WL_BLUE_HORIZON_DENSITY_SCALE);
+ }
+ else
+ {
+ childSetValue(name, color_ctrl->g);
+ }
+ }
+
+ color_ctrl->update(LLWLParamManager::getInstance()->mCurParams);
+
+ LLWLParamManager::getInstance()->propagateParameters();
+}
+
+void LLFloaterEditSky::onColorControlBMoved(LLUICtrl* ctrl, void* userdata)
+{
+ LLWLParamManager::getInstance()->mAnimator.deactivate();
+
+ LLSliderCtrl* sldr_ctrl = static_cast<LLSliderCtrl*>(ctrl);
+ WLColorControl* color_ctrl = static_cast<WLColorControl *>(userdata);
+
+ color_ctrl->b = sldr_ctrl->getValueF32();
+ if (color_ctrl->isSunOrAmbientColor)
+ {
+ color_ctrl->b *= WL_SUN_AMBIENT_SLIDER_SCALE;
+ }
+ if (color_ctrl->isBlueHorizonOrDensity)
+ {
+ color_ctrl->b *= WL_BLUE_HORIZON_DENSITY_SCALE;
+ }
+
+ // move i if it's the max
+ if (color_ctrl->b >= color_ctrl->r && color_ctrl->b >= color_ctrl->g && color_ctrl->hasSliderName)
+ {
+ color_ctrl->i = color_ctrl->b;
+ std::string name = color_ctrl->mSliderName;
+ name.append("I");
+
+ if (color_ctrl->isSunOrAmbientColor)
+ {
+ childSetValue(name, color_ctrl->b / WL_SUN_AMBIENT_SLIDER_SCALE);
+ }
+ else if (color_ctrl->isBlueHorizonOrDensity)
+ {
+ childSetValue(name, color_ctrl->b / WL_BLUE_HORIZON_DENSITY_SCALE);
+ }
+ else
+ {
+ childSetValue(name, color_ctrl->b);
+ }
+ }
+
+ color_ctrl->update(LLWLParamManager::getInstance()->mCurParams);
+
+ LLWLParamManager::getInstance()->propagateParameters();
+}
+
+/// GLOW SPECIFIC CODE
+void LLFloaterEditSky::onGlowRMoved(LLUICtrl* ctrl, void* userdata)
+{
+ LLWLParamManager::getInstance()->mAnimator.deactivate();
+
+ LLSliderCtrl* sldr_ctrl = static_cast<LLSliderCtrl*>(ctrl);
+ WLColorControl* color_ctrl = static_cast<WLColorControl *>(userdata);
+
+ // scaled by 20
+ color_ctrl->r = (2 - sldr_ctrl->getValueF32()) * 20;
+
+ color_ctrl->update(LLWLParamManager::getInstance()->mCurParams);
+ LLWLParamManager::getInstance()->propagateParameters();
+}
+
+/// \NOTE that we want NEGATIVE (-) B
+void LLFloaterEditSky::onGlowBMoved(LLUICtrl* ctrl, void* userdata)
+{
+ LLWLParamManager::getInstance()->mAnimator.deactivate();
+
+ LLSliderCtrl* sldr_ctrl = static_cast<LLSliderCtrl*>(ctrl);
+ WLColorControl* color_ctrl = static_cast<WLColorControl *>(userdata);
+
+ /// \NOTE that we want NEGATIVE (-) B and NOT by 20 as 20 is too big
+ color_ctrl->b = -sldr_ctrl->getValueF32() * 5;
+
+ color_ctrl->update(LLWLParamManager::getInstance()->mCurParams);
+ LLWLParamManager::getInstance()->propagateParameters();
+}
+
+void LLFloaterEditSky::onFloatControlMoved(LLUICtrl* ctrl, void* userdata)
+{
+ LLWLParamManager::getInstance()->mAnimator.deactivate();
+
+ LLSliderCtrl* sldr_ctrl = static_cast<LLSliderCtrl*>(ctrl);
+ WLFloatControl * floatControl = static_cast<WLFloatControl *>(userdata);
+
+ floatControl->x = sldr_ctrl->getValueF32() / floatControl->mult;
+
+ floatControl->update(LLWLParamManager::getInstance()->mCurParams);
+ LLWLParamManager::getInstance()->propagateParameters();
+}
+
+
+// Lighting callbacks
+
+// time of day
+void LLFloaterEditSky::onSunMoved(LLUICtrl* ctrl, void* userdata)
+{
+ LLWLParamManager::getInstance()->mAnimator.deactivate();
+
+ LLMultiSliderCtrl* sun_msldr = getChild<LLMultiSliderCtrl>("WLSunPos");
+ LLSliderCtrl* east_sldr = getChild<LLSliderCtrl>("WLEastAngle");
+ LLTimeCtrl* time_ctrl = getChild<LLTimeCtrl>("WLDayTime");
+ WLColorControl* color_ctrl = static_cast<WLColorControl *>(userdata);
+
+ F32 time24 = sun_msldr->getCurSliderValue();
+ time_ctrl->setTime24(time24); // sync the time ctrl with the new sun position
+
+ // get the two angles
+ LLWLParamManager * param_mgr = LLWLParamManager::getInstance();
+
+ param_mgr->mCurParams.setSunAngle(F_TWO_PI * time24_to_sun_pos(time24));
+ param_mgr->mCurParams.setEastAngle(F_TWO_PI * east_sldr->getValueF32());
+
+ // set the sun vector
+ color_ctrl->r = -sin(param_mgr->mCurParams.getEastAngle()) *
+ cos(param_mgr->mCurParams.getSunAngle());
+ color_ctrl->g = sin(param_mgr->mCurParams.getSunAngle());
+ color_ctrl->b = cos(param_mgr->mCurParams.getEastAngle()) *
+ cos(param_mgr->mCurParams.getSunAngle());
+ color_ctrl->i = 1.f;
+
+ color_ctrl->update(param_mgr->mCurParams);
+ param_mgr->propagateParameters();
+}
+
+void LLFloaterEditSky::onTimeChanged()
+{
+ F32 time24 = getChild<LLTimeCtrl>("WLDayTime")->getTime24();
+ getChild<LLMultiSliderCtrl>("WLSunPos")->setCurSliderValue(time24, TRUE);
+ onSunMoved(getChild<LLUICtrl>("WLSunPos"), &LLWLParamManager::instance().mLightnorm);
+}
+
+void LLFloaterEditSky::onStarAlphaMoved(LLUICtrl* ctrl)
+{
+ LLWLParamManager::getInstance()->mAnimator.deactivate();
+
+ LLSliderCtrl* sldr_ctrl = static_cast<LLSliderCtrl*>(ctrl);
+
+ LLWLParamManager::getInstance()->mCurParams.setStarBrightness(sldr_ctrl->getValueF32());
+}
+
+// Clouds
+void LLFloaterEditSky::onCloudScrollXMoved(LLUICtrl* ctrl)
+{
+ LLWLParamManager::getInstance()->mAnimator.deactivate();
+
+ LLSliderCtrl* sldr_ctrl = static_cast<LLSliderCtrl*>(ctrl);
+ // *HACK all cloud scrolling is off by an additive of 10.
+ LLWLParamManager::getInstance()->mCurParams.setCloudScrollX(sldr_ctrl->getValueF32() + 10.0f);
+}
+
+void LLFloaterEditSky::onCloudScrollYMoved(LLUICtrl* ctrl)
+{
+ LLWLParamManager::getInstance()->mAnimator.deactivate();
+
+ LLSliderCtrl* sldr_ctrl = static_cast<LLSliderCtrl*>(ctrl);
+
+ // *HACK all cloud scrolling is off by an additive of 10.
+ LLWLParamManager::getInstance()->mCurParams.setCloudScrollY(sldr_ctrl->getValueF32() + 10.0f);
+}
+
+void LLFloaterEditSky::onCloudScrollXToggled(LLUICtrl* ctrl)
+{
+ LLWLParamManager::getInstance()->mAnimator.deactivate();
+
+ LLCheckBoxCtrl* cb_ctrl = static_cast<LLCheckBoxCtrl*>(ctrl);
+
+ bool lock = cb_ctrl->get();
+ LLWLParamManager::getInstance()->mCurParams.setEnableCloudScrollX(!lock);
+
+ LLSliderCtrl* sldr = getChild<LLSliderCtrl>("WLCloudScrollX");
+
+ if (cb_ctrl->get())
+ {
+ sldr->setEnabled(false);
+ }
+ else
+ {
+ sldr->setEnabled(true);
+ }
+
+}
+
+void LLFloaterEditSky::onCloudScrollYToggled(LLUICtrl* ctrl)
+{
+ LLWLParamManager::getInstance()->mAnimator.deactivate();
+
+ LLCheckBoxCtrl* cb_ctrl = static_cast<LLCheckBoxCtrl*>(ctrl);
+ bool lock = cb_ctrl->get();
+ LLWLParamManager::getInstance()->mCurParams.setEnableCloudScrollY(!lock);
+
+ LLSliderCtrl* sldr = getChild<LLSliderCtrl>("WLCloudScrollY");
+
+ if (cb_ctrl->get())
+ {
+ sldr->setEnabled(false);
+ }
+ else
+ {
+ sldr->setEnabled(true);
+ }
+}
+
+//=================================================================================================
+
+void LLFloaterEditSky::reset()
+{
+ if (isNewPreset())
+ {
+ mSkyPresetNameEditor->setValue(LLSD());
+ mSaveButton->setEnabled(FALSE); // will be enabled as soon as users enters a name
+ }
+ else
+ {
+ refreshSkyPresetsList();
+
+ // Disable controls until a sky preset to edit is selected.
+ enableEditing(false);
+ }
+}
+
+bool LLFloaterEditSky::isNewPreset() const
+{
+ return mKey.asString() == "new";
+}
+
+void LLFloaterEditSky::refreshSkyPresetsList()
+{
+ mSkyPresetCombo->removeall();
+
+ LLWLParamManager::preset_name_list_t region_presets, user_presets, sys_presets;
+ LLWLParamManager::instance().getPresetNames(region_presets, user_presets, sys_presets);
+
+#if 0 // Disable editing region skies until the workflow is clear enough.
+ // Add region presets.
+ std::string region_name = gAgent.getRegion() ? gAgent.getRegion()->getName() : LLTrans::getString("Unknown");
+ for (LLWLParamManager::preset_name_list_t::const_iterator it = region_presets.begin(); it != region_presets.end(); ++it)
+ {
+ std::string item_title = *it + " (" + region_name + ")";
+ mSkyPresetCombo->add(item_title, LLWLParamKey(*it, LLEnvKey::SCOPE_REGION).toLLSD());
+ }
+ if (region_presets.size() > 0)
+ {
+ mSkyPresetCombo->addSeparator();
+ }
+#endif
+
+ // Add user presets.
+ for (LLWLParamManager::preset_name_list_t::const_iterator it = user_presets.begin(); it != user_presets.end(); ++it)
+ {
+ mSkyPresetCombo->add(*it, LLWLParamKey(*it, LLEnvKey::SCOPE_LOCAL).toLLSD());
+ }
+ if (user_presets.size() > 0)
+ {
+ mSkyPresetCombo->addSeparator();
+ }
+
+ // Add system presets.
+ for (LLWLParamManager::preset_name_list_t::const_iterator it = sys_presets.begin(); it != sys_presets.end(); ++it)
+ {
+ mSkyPresetCombo->add(*it, LLWLParamKey(*it, LLEnvKey::SCOPE_LOCAL).toLLSD());
+ }
+
+ mSkyPresetCombo->setLabel(getString("combo_label"));
+}
+
+void LLFloaterEditSky::enableEditing(bool enable)
+{
+ // Enable/disable the tab and their contents.
+ LLTabContainer* tab_container = getChild<LLTabContainer>("WindLight Tabs");
+ tab_container->setEnabled(enable);
+ for (S32 i = 0; i < tab_container->getTabCount(); ++i)
+ {
+ tab_container->enableTabButton(i, enable);
+ tab_container->getPanelByIndex(i)->setCtrlsEnabled(enable);
+ }
+
+ // Enable/disable saving.
+ mSaveButton->setEnabled(enable);
+ mMakeDefaultCheckBox->setEnabled(enable);
+}
+
+void LLFloaterEditSky::saveRegionSky()
+{
+ LLWLParamKey key(getSelectedSkyPreset());
+ llassert(key.scope == LLEnvKey::SCOPE_REGION);
+
+ LL_DEBUGS("Windlight") << "Saving region sky preset: " << key.name << llendl;
+ LLWLParamManager& wl_mgr = LLWLParamManager::instance();
+ wl_mgr.mCurParams.mName = key.name;
+ wl_mgr.setParamSet(key, wl_mgr.mCurParams);
+
+ // *TODO: save to cached region settings.
+ LL_WARNS("Windlight") << "Saving region sky is not fully implemented yet" << LL_ENDL;
+}
+
+LLWLParamKey LLFloaterEditSky::getSelectedSkyPreset()
+{
+ LLWLParamKey key;
+
+ if (mSkyPresetNameEditor->getVisible())
+ {
+ key.name = mSkyPresetNameEditor->getText();
+ key.scope = LLEnvKey::SCOPE_LOCAL;
+ }
+ else
+ {
+ LLSD combo_val = mSkyPresetCombo->getValue();
+
+ if (!combo_val.isArray()) // manually typed text
+ {
+ key.name = combo_val.asString();
+ key.scope = LLEnvKey::SCOPE_LOCAL;
+ }
+ else
+ {
+ key.fromLLSD(combo_val);
+ }
+ }
+
+ return key;
+}
+
+void LLFloaterEditSky::onSkyPresetNameEdited()
+{
+ // Disable saving a sky preset having empty name.
+ LLWLParamKey key = getSelectedSkyPreset();
+ mSaveButton->setEnabled(!key.name.empty());
+}
+
+void LLFloaterEditSky::onSkyPresetSelected()
+{
+ LLWLParamKey key = getSelectedSkyPreset();
+ LLWLParamSet sky_params;
+
+ if (!LLWLParamManager::instance().getParamSet(key, sky_params))
+ {
+ // Manually entered string?
+ LL_WARNS("Windlight") << "No sky preset named " << key.toString() << LL_ENDL;
+ return;
+ }
+
+ LLEnvManagerNew::instance().useSkyParams(sky_params.getAll());
+ //syncControls();
+
+ bool can_edit = (key.scope == LLEnvKey::SCOPE_LOCAL || LLEnvManagerNew::canEditRegionSettings());
+ enableEditing(can_edit);
+
+ mMakeDefaultCheckBox->setEnabled(key.scope == LLEnvKey::SCOPE_LOCAL);
+}
+
+bool LLFloaterEditSky::onSaveAnswer(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+
+ // If they choose save, do it. Otherwise, don't do anything
+ if (option == 0)
+ {
+ onSaveConfirmed();
+ }
+
+ return false;
+}
+
+void LLFloaterEditSky::onSaveConfirmed()
+{
+ // Save current params to the selected preset.
+ LLWLParamKey key(getSelectedSkyPreset());
+
+ LL_DEBUGS("Windlight") << "Saving sky preset " << key.name << LL_ENDL;
+ LLWLParamManager& wl_mgr = LLWLParamManager::instance();
+ if (wl_mgr.hasParamSet(key))
+ {
+ wl_mgr.setParamSet(key, wl_mgr.mCurParams);
+ }
+ else
+ {
+ wl_mgr.addParamSet(key, wl_mgr.mCurParams);
+ }
+
+ wl_mgr.savePreset(key);
+
+ // Change preference if requested.
+ if (mMakeDefaultCheckBox->getValue())
+ {
+ LL_DEBUGS("Windlight") << key.name << " is now the new preferred sky preset" << llendl;
+ LLEnvManagerNew::instance().setUseSkyPreset(key.name);
+ }
+
+ closeFloater();
+}
+
+void LLFloaterEditSky::onBtnSave()
+{
+ LLWLParamKey selected_sky = getSelectedSkyPreset();
+ LLWLParamManager& wl_mgr = LLWLParamManager::instance();
+
+ if (selected_sky.scope == LLEnvKey::SCOPE_REGION)
+ {
+ saveRegionSky();
+ closeFloater();
+ return;
+ }
+
+ std::string name = selected_sky.name;
+ if (name.empty())
+ {
+ // *TODO: show an alert
+ llwarns << "Empty sky preset name" << llendl;
+ return;
+ }
+
+ // Don't allow overwriting system presets.
+ if (wl_mgr.isSystemPreset(name))
+ {
+ LLNotificationsUtil::add("WLNoEditDefault");
+ return;
+ }
+
+ // Save, ask for confirmation for overwriting an existing preset.
+ if (wl_mgr.hasParamSet(selected_sky))
+ {
+ LLNotificationsUtil::add("WLSavePresetAlert", LLSD(), LLSD(), boost::bind(&LLFloaterEditSky::onSaveAnswer, this, _1, _2));
+ }
+ else
+ {
+ // new preset, hence no confirmation needed
+ onSaveConfirmed();
+ }
+}
+
+void LLFloaterEditSky::onBtnCancel()
+{
+ closeFloater();
+}
+
+void LLFloaterEditSky::onSkyPresetListChange()
+{
+ LLWLParamKey key = getSelectedSkyPreset(); // preset being edited
+ if (!LLWLParamManager::instance().hasParamSet(key))
+ {
+ // Preset we've been editing doesn't exist anymore. Close the floater.
+ closeFloater(false);
+ }
+ else
+ {
+ // A new preset has been added.
+ // Refresh the presets list, though it may not make sense as the floater is about to be closed.
+ refreshSkyPresetsList();
+ }
+}
+
+void LLFloaterEditSky::onRegionSettingsChange()
+{
+ // If creating a new sky, don't bother.
+ if (isNewPreset())
+ {
+ return;
+ }
+
+ if (getSelectedSkyPreset().scope == LLEnvKey::SCOPE_REGION) // if editing a region sky
+ {
+ // reset the floater to its initial state
+ reset();
+
+ // *TODO: Notify user?
+ }
+ else // editing a local sky
+ {
+ refreshSkyPresetsList();
+ }
+}
+
+void LLFloaterEditSky::onRegionInfoUpdate()
+{
+ bool can_edit = true;
+
+ // If we've selected a region sky preset for editing.
+ if (getSelectedSkyPreset().scope == LLEnvKey::SCOPE_REGION)
+ {
+ // check whether we have the access
+ can_edit = LLEnvManagerNew::canEditRegionSettings();
+ }
+
+ enableEditing(can_edit);
+}
diff --git a/indra/newview/llfloatereditsky.h b/indra/newview/llfloatereditsky.h
new file mode 100644
index 0000000000..a06c4fc5fa
--- /dev/null
+++ b/indra/newview/llfloatereditsky.h
@@ -0,0 +1,113 @@
+/**
+ * @file llfloatereditsky.h
+ * @brief Floater to create or edit a sky preset
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLFLOATEREDITSKY_H
+#define LL_LLFLOATEREDITSKY_H
+
+#include "llfloater.h"
+#include "llwlparammanager.h"
+
+class LLButton;
+class LLCheckBoxCtrl;
+class LLComboBox;
+class LLLineEditor;
+
+/**
+ * Floater for creating or editing a sky preset.
+ */
+class LLFloaterEditSky : public LLFloater
+{
+ LOG_CLASS(LLFloaterEditSky);
+
+public:
+ LLFloaterEditSky(const LLSD &key);
+
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void onOpen(const LLSD& key);
+ /*virtual*/ void onClose(bool app_quitting);
+ /*virtual*/ void draw();
+
+private:
+ void initCallbacks(void);
+
+ //-- WL stuff begins ------------------------------------------------------
+
+ void syncControls(); /// sync up sliders with parameters
+
+ void setColorSwatch(const std::string& name, const WLColorControl& from_ctrl, F32 k);
+
+ // general purpose callbacks for dealing with color controllers
+ void onColorControlMoved(LLUICtrl* ctrl, WLColorControl* color_ctrl);
+ void onColorControlRMoved(LLUICtrl* ctrl, void* userdata);
+ void onColorControlGMoved(LLUICtrl* ctrl, void* userdata);
+ void onColorControlBMoved(LLUICtrl* ctrl, void* userdata);
+ void onFloatControlMoved(LLUICtrl* ctrl, void* userdata);
+
+ // lighting callbacks for glow
+ void onGlowRMoved(LLUICtrl* ctrl, void* userdata);
+ void onGlowBMoved(LLUICtrl* ctrl, void* userdata);
+
+ // lighting callbacks for sun
+ void onSunMoved(LLUICtrl* ctrl, void* userdata);
+ void onTimeChanged();
+
+ // for handling when the star slider is moved to adjust the alpha
+ void onStarAlphaMoved(LLUICtrl* ctrl);
+
+ // handle cloud scrolling
+ void onCloudScrollXMoved(LLUICtrl* ctrl);
+ void onCloudScrollYMoved(LLUICtrl* ctrl);
+ void onCloudScrollXToggled(LLUICtrl* ctrl);
+ void onCloudScrollYToggled(LLUICtrl* ctrl);
+
+ //-- WL stuff ends --------------------------------------------------------
+
+ void reset(); /// reset the floater to its initial state
+ bool isNewPreset() const;
+ void refreshSkyPresetsList();
+ void enableEditing(bool enable);
+ void saveRegionSky();
+ LLWLParamKey getSelectedSkyPreset();
+
+ void onSkyPresetNameEdited();
+ void onSkyPresetSelected();
+ bool onSaveAnswer(const LLSD& notification, const LLSD& response);
+ void onSaveConfirmed();
+
+ void onBtnSave();
+ void onBtnCancel();
+
+ void onSkyPresetListChange();
+ void onRegionSettingsChange();
+ void onRegionInfoUpdate();
+
+ LLLineEditor* mSkyPresetNameEditor;
+ LLComboBox* mSkyPresetCombo;
+ LLCheckBoxCtrl* mMakeDefaultCheckBox;
+ LLButton* mSaveButton;
+};
+
+#endif // LL_LLFLOATEREDITSKY_H
diff --git a/indra/newview/llfloatereditwater.cpp b/indra/newview/llfloatereditwater.cpp
new file mode 100644
index 0000000000..64cfc4054f
--- /dev/null
+++ b/indra/newview/llfloatereditwater.cpp
@@ -0,0 +1,772 @@
+/**
+ * @file llfloatereditwater.cpp
+ * @brief Floater to create or edit a water preset
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloatereditwater.h"
+
+// libs
+#include "llbutton.h"
+#include "llcheckboxctrl.h"
+#include "llcolorswatch.h"
+#include "llcombobox.h"
+//#include "llnotifications.h"
+#include "llnotificationsutil.h"
+#include "llsliderctrl.h"
+#include "lltexturectrl.h"
+
+// newview
+#include "llagent.h"
+#include "llregioninfomodel.h"
+#include "llviewerregion.h"
+#include "llwaterparammanager.h"
+
+#undef max // Fixes a Windows compiler error
+
+LLFloaterEditWater::LLFloaterEditWater(const LLSD &key)
+: LLFloater(key)
+, mWaterPresetNameEditor(NULL)
+, mWaterPresetCombo(NULL)
+, mMakeDefaultCheckBox(NULL)
+, mSaveButton(NULL)
+{
+}
+
+// virtual
+BOOL LLFloaterEditWater::postBuild()
+{
+ mWaterPresetNameEditor = getChild<LLLineEditor>("water_preset_name");
+ mWaterPresetCombo = getChild<LLComboBox>("water_preset_combo");
+ mMakeDefaultCheckBox = getChild<LLCheckBoxCtrl>("make_default_cb");
+ mSaveButton = getChild<LLButton>("save");
+
+ initCallbacks();
+ refreshWaterPresetsList();
+ syncControls();
+
+ return TRUE;
+}
+
+// virtual
+void LLFloaterEditWater::onOpen(const LLSD& key)
+{
+ bool new_preset = isNewPreset();
+ std::string param = key.asString();
+ std::string floater_title = getString(std::string("title_") + param);
+ std::string hint = getString(std::string("hint_" + param));
+
+ // Update floater title.
+ setTitle(floater_title);
+
+ // Update the hint at the top.
+ getChild<LLUICtrl>("hint")->setValue(hint);
+
+ // Hide the hint to the right of the combo if we're invoked to create a new preset.
+ getChildView("note")->setVisible(!new_preset);
+
+ // Switch between the water presets combobox and preset name input field.
+ mWaterPresetCombo->setVisible(!new_preset);
+ mWaterPresetNameEditor->setVisible(new_preset);
+
+ reset();
+}
+
+// virtual
+void LLFloaterEditWater::onClose(bool app_quitting)
+{
+ if (!app_quitting) // there's no point to change environment if we're quitting
+ {
+ LLEnvManagerNew::instance().usePrefs(); // revert changes made to current environment
+ }
+}
+
+// virtual
+void LLFloaterEditWater::draw()
+{
+ syncControls();
+ LLFloater::draw();
+}
+
+void LLFloaterEditWater::initCallbacks(void)
+{
+ mWaterPresetNameEditor->setKeystrokeCallback(boost::bind(&LLFloaterEditWater::onWaterPresetNameEdited, this), NULL);
+ mWaterPresetCombo->setCommitCallback(boost::bind(&LLFloaterEditWater::onWaterPresetSelected, this));
+ mWaterPresetCombo->setTextEntryCallback(boost::bind(&LLFloaterEditWater::onWaterPresetNameEdited, this));
+
+ mSaveButton->setCommitCallback(boost::bind(&LLFloaterEditWater::onBtnSave, this));
+ getChild<LLButton>("cancel")->setCommitCallback(boost::bind(&LLFloaterEditWater::onBtnCancel, this));
+
+ LLEnvManagerNew::instance().setRegionSettingsChangeCallback(boost::bind(&LLFloaterEditWater::onRegionSettingsChange, this));
+ LLWaterParamManager::instance().setPresetListChangeCallback(boost::bind(&LLFloaterEditWater::onWaterPresetListChange, this));
+
+ // Connect to region info updates.
+ LLRegionInfoModel::instance().setUpdateCallback(boost::bind(&LLFloaterEditWater::onRegionInfoUpdate, this));
+
+ //-------------------------------------------------------------------------
+
+ LLWaterParamManager& water_mgr = LLWaterParamManager::instance();
+
+ getChild<LLUICtrl>("WaterFogColor")->setCommitCallback(boost::bind(&LLFloaterEditWater::onWaterFogColorMoved, this, _1, &water_mgr.mFogColor));
+ //getChild<LLUICtrl>("WaterGlow")->setCommitCallback(boost::bind(&LLFloaterEditWater::onColorControlAMoved, this, _1, &water_mgr.mFogColor));
+
+ // fog density
+ getChild<LLUICtrl>("WaterFogDensity")->setCommitCallback(boost::bind(&LLFloaterEditWater::onExpFloatControlMoved, this, _1, &water_mgr.mFogDensity));
+ getChild<LLUICtrl>("WaterUnderWaterFogMod")->setCommitCallback(boost::bind(&LLFloaterEditWater::onFloatControlMoved, this, _1, &water_mgr.mUnderWaterFogMod));
+
+ // blue density
+ getChild<LLUICtrl>("WaterNormalScaleX")->setCommitCallback(boost::bind(&LLFloaterEditWater::onVector3ControlXMoved, this, _1, &water_mgr.mNormalScale));
+ getChild<LLUICtrl>("WaterNormalScaleY")->setCommitCallback(boost::bind(&LLFloaterEditWater::onVector3ControlYMoved, this, _1, &water_mgr.mNormalScale));
+ getChild<LLUICtrl>("WaterNormalScaleZ")->setCommitCallback(boost::bind(&LLFloaterEditWater::onVector3ControlZMoved, this, _1, &water_mgr.mNormalScale));
+
+ // fresnel
+ getChild<LLUICtrl>("WaterFresnelScale")->setCommitCallback(boost::bind(&LLFloaterEditWater::onFloatControlMoved, this, _1, &water_mgr.mFresnelScale));
+ getChild<LLUICtrl>("WaterFresnelOffset")->setCommitCallback(boost::bind(&LLFloaterEditWater::onFloatControlMoved, this, _1, &water_mgr.mFresnelOffset));
+
+ // scale above/below
+ getChild<LLUICtrl>("WaterScaleAbove")->setCommitCallback(boost::bind(&LLFloaterEditWater::onFloatControlMoved, this, _1, &water_mgr.mScaleAbove));
+ getChild<LLUICtrl>("WaterScaleBelow")->setCommitCallback(boost::bind(&LLFloaterEditWater::onFloatControlMoved, this, _1, &water_mgr.mScaleBelow));
+
+ // blur mult
+ getChild<LLUICtrl>("WaterBlurMult")->setCommitCallback(boost::bind(&LLFloaterEditWater::onFloatControlMoved, this, _1, &water_mgr.mBlurMultiplier));
+
+ // wave direction
+ getChild<LLUICtrl>("WaterWave1DirX")->setCommitCallback(boost::bind(&LLFloaterEditWater::onVector2ControlXMoved, this, _1, &water_mgr.mWave1Dir));
+ getChild<LLUICtrl>("WaterWave1DirY")->setCommitCallback(boost::bind(&LLFloaterEditWater::onVector2ControlYMoved, this, _1, &water_mgr.mWave1Dir));
+ getChild<LLUICtrl>("WaterWave2DirX")->setCommitCallback(boost::bind(&LLFloaterEditWater::onVector2ControlXMoved, this, _1, &water_mgr.mWave2Dir));
+ getChild<LLUICtrl>("WaterWave2DirY")->setCommitCallback(boost::bind(&LLFloaterEditWater::onVector2ControlYMoved, this, _1, &water_mgr.mWave2Dir));
+
+ LLTextureCtrl* texture_ctrl = getChild<LLTextureCtrl>("WaterNormalMap");
+ texture_ctrl->setDefaultImageAssetID(DEFAULT_WATER_NORMAL);
+ texture_ctrl->setCommitCallback(boost::bind(&LLFloaterEditWater::onNormalMapPicked, this, _1));
+}
+
+//=============================================================================
+
+void LLFloaterEditWater::syncControls()
+{
+ // *TODO: Eliminate slow getChild() calls.
+
+ bool err;
+
+ LLWaterParamManager& water_mgr = LLWaterParamManager::instance();
+
+ LLWaterParamSet& current_params = water_mgr.mCurParams;
+
+ // blue horizon
+ water_mgr.mFogColor = current_params.getVector4(water_mgr.mFogColor.mName, err);
+
+ LLColor4 col = water_mgr.getFogColor();
+ //getChild<LLUICtrl>("WaterGlow")->setValue(col.mV[3]);
+ col.mV[3] = 1.0f;
+ getChild<LLColorSwatchCtrl>("WaterFogColor")->set(col);
+
+ // fog and wavelets
+ water_mgr.mFogDensity.mExp =
+ log(current_params.getFloat(water_mgr.mFogDensity.mName, err)) /
+ log(water_mgr.mFogDensity.mBase);
+ water_mgr.setDensitySliderValue(water_mgr.mFogDensity.mExp);
+ getChild<LLUICtrl>("WaterFogDensity")->setValue(water_mgr.mFogDensity.mExp);
+
+ water_mgr.mUnderWaterFogMod.mX =
+ current_params.getFloat(water_mgr.mUnderWaterFogMod.mName, err);
+ getChild<LLUICtrl>("WaterUnderWaterFogMod")->setValue(water_mgr.mUnderWaterFogMod.mX);
+
+ water_mgr.mNormalScale = current_params.getVector3(water_mgr.mNormalScale.mName, err);
+ getChild<LLUICtrl>("WaterNormalScaleX")->setValue(water_mgr.mNormalScale.mX);
+ getChild<LLUICtrl>("WaterNormalScaleY")->setValue(water_mgr.mNormalScale.mY);
+ getChild<LLUICtrl>("WaterNormalScaleZ")->setValue(water_mgr.mNormalScale.mZ);
+
+ // Fresnel
+ water_mgr.mFresnelScale.mX = current_params.getFloat(water_mgr.mFresnelScale.mName, err);
+ getChild<LLUICtrl>("WaterFresnelScale")->setValue(water_mgr.mFresnelScale.mX);
+ water_mgr.mFresnelOffset.mX = current_params.getFloat(water_mgr.mFresnelOffset.mName, err);
+ getChild<LLUICtrl>("WaterFresnelOffset")->setValue(water_mgr.mFresnelOffset.mX);
+
+ // Scale Above/Below
+ water_mgr.mScaleAbove.mX = current_params.getFloat(water_mgr.mScaleAbove.mName, err);
+ getChild<LLUICtrl>("WaterScaleAbove")->setValue(water_mgr.mScaleAbove.mX);
+ water_mgr.mScaleBelow.mX = current_params.getFloat(water_mgr.mScaleBelow.mName, err);
+ getChild<LLUICtrl>("WaterScaleBelow")->setValue(water_mgr.mScaleBelow.mX);
+
+ // blur mult
+ water_mgr.mBlurMultiplier.mX = current_params.getFloat(water_mgr.mBlurMultiplier.mName, err);
+ getChild<LLUICtrl>("WaterBlurMult")->setValue(water_mgr.mBlurMultiplier.mX);
+
+ // wave directions
+ water_mgr.mWave1Dir = current_params.getVector2(water_mgr.mWave1Dir.mName, err);
+ getChild<LLUICtrl>("WaterWave1DirX")->setValue(water_mgr.mWave1Dir.mX);
+ getChild<LLUICtrl>("WaterWave1DirY")->setValue(water_mgr.mWave1Dir.mY);
+
+ water_mgr.mWave2Dir = current_params.getVector2(water_mgr.mWave2Dir.mName, err);
+ getChild<LLUICtrl>("WaterWave2DirX")->setValue(water_mgr.mWave2Dir.mX);
+ getChild<LLUICtrl>("WaterWave2DirY")->setValue(water_mgr.mWave2Dir.mY);
+
+ LLTextureCtrl* textCtrl = getChild<LLTextureCtrl>("WaterNormalMap");
+ textCtrl->setImageAssetID(water_mgr.getNormalMapID());
+}
+
+// color control callbacks
+void LLFloaterEditWater::onColorControlRMoved(LLUICtrl* ctrl, WaterColorControl* color_ctrl)
+{
+ LLSliderCtrl* sldr_ctrl = static_cast<LLSliderCtrl*>(ctrl);
+
+ color_ctrl->mR = sldr_ctrl->getValueF32();
+
+ // move i if it's the max
+ if (color_ctrl->mR >= color_ctrl->mG
+ && color_ctrl->mR >= color_ctrl->mB
+ && color_ctrl->mHasSliderName)
+ {
+ color_ctrl->mI = color_ctrl->mR;
+ std::string name = color_ctrl->mSliderName;
+ name.append("I");
+
+ getChild<LLUICtrl>(name)->setValue(color_ctrl->mR);
+ }
+
+ color_ctrl->update(LLWaterParamManager::getInstance()->mCurParams);
+
+ LLWaterParamManager::getInstance()->propagateParameters();
+}
+
+void LLFloaterEditWater::onColorControlGMoved(LLUICtrl* ctrl, WaterColorControl* color_ctrl)
+{
+ LLSliderCtrl* sldr_ctrl = static_cast<LLSliderCtrl*>(ctrl);
+
+ color_ctrl->mG = sldr_ctrl->getValueF32();
+
+ // move i if it's the max
+ if (color_ctrl->mG >= color_ctrl->mR
+ && color_ctrl->mG >= color_ctrl->mB
+ && color_ctrl->mHasSliderName)
+ {
+ color_ctrl->mI = color_ctrl->mG;
+ std::string name = color_ctrl->mSliderName;
+ name.append("I");
+
+ getChild<LLUICtrl>(name)->setValue(color_ctrl->mG);
+
+ }
+
+ color_ctrl->update(LLWaterParamManager::getInstance()->mCurParams);
+
+ LLWaterParamManager::getInstance()->propagateParameters();
+}
+
+void LLFloaterEditWater::onColorControlBMoved(LLUICtrl* ctrl, WaterColorControl* color_ctrl)
+{
+ LLSliderCtrl* sldr_ctrl = static_cast<LLSliderCtrl*>(ctrl);
+
+ color_ctrl->mB = sldr_ctrl->getValueF32();
+
+ // move i if it's the max
+ if (color_ctrl->mB >= color_ctrl->mR
+ && color_ctrl->mB >= color_ctrl->mG
+ && color_ctrl->mHasSliderName)
+ {
+ color_ctrl->mI = color_ctrl->mB;
+ std::string name = color_ctrl->mSliderName;
+ name.append("I");
+
+ getChild<LLUICtrl>(name)->setValue(color_ctrl->mB);
+ }
+
+ color_ctrl->update(LLWaterParamManager::getInstance()->mCurParams);
+
+ LLWaterParamManager::getInstance()->propagateParameters();
+}
+
+void LLFloaterEditWater::onColorControlAMoved(LLUICtrl* ctrl, WaterColorControl* color_ctrl)
+{
+ LLSliderCtrl* sldr_ctrl = static_cast<LLSliderCtrl*>(ctrl);
+
+ color_ctrl->mA = sldr_ctrl->getValueF32();
+
+ color_ctrl->update(LLWaterParamManager::getInstance()->mCurParams);
+
+ LLWaterParamManager::getInstance()->propagateParameters();
+}
+
+
+void LLFloaterEditWater::onColorControlIMoved(LLUICtrl* ctrl, WaterColorControl* color_ctrl)
+{
+ LLSliderCtrl* sldr_ctrl = static_cast<LLSliderCtrl*>(ctrl);
+
+ color_ctrl->mI = sldr_ctrl->getValueF32();
+
+ // only for sliders where we pass a name
+ if (color_ctrl->mHasSliderName)
+ {
+ // set it to the top
+ F32 maxVal = std::max(std::max(color_ctrl->mR, color_ctrl->mG), color_ctrl->mB);
+ F32 iVal;
+
+ iVal = color_ctrl->mI;
+
+ // get the names of the other sliders
+ std::string rName = color_ctrl->mSliderName;
+ rName.append("R");
+ std::string gName = color_ctrl->mSliderName;
+ gName.append("G");
+ std::string bName = color_ctrl->mSliderName;
+ bName.append("B");
+
+ // handle if at 0
+ if (iVal == 0)
+ {
+ color_ctrl->mR = 0;
+ color_ctrl->mG = 0;
+ color_ctrl->mB = 0;
+
+ // if all at the start
+ // set them all to the intensity
+ }
+ else if (maxVal == 0)
+ {
+ color_ctrl->mR = iVal;
+ color_ctrl->mG = iVal;
+ color_ctrl->mB = iVal;
+ }
+ else
+ {
+ // add delta amounts to each
+ F32 delta = (iVal - maxVal) / maxVal;
+ color_ctrl->mR *= (1.0f + delta);
+ color_ctrl->mG *= (1.0f + delta);
+ color_ctrl->mB *= (1.0f + delta);
+ }
+
+ // set the sliders to the new vals
+ getChild<LLUICtrl>(rName)->setValue(color_ctrl->mR);
+ getChild<LLUICtrl>(gName)->setValue(color_ctrl->mG);
+ getChild<LLUICtrl>(bName)->setValue(color_ctrl->mB);
+ }
+
+ // now update the current parameters and send them to shaders
+ color_ctrl->update(LLWaterParamManager::getInstance()->mCurParams);
+ LLWaterParamManager::getInstance()->propagateParameters();
+}
+
+// vector control callbacks
+void LLFloaterEditWater::onVector3ControlXMoved(LLUICtrl* ctrl, WaterVector3Control* vector_ctrl)
+{
+ LLSliderCtrl* sldr_ctrl = static_cast<LLSliderCtrl*>(ctrl);
+
+ vector_ctrl->mX = sldr_ctrl->getValueF32();
+
+ vector_ctrl->update(LLWaterParamManager::getInstance()->mCurParams);
+
+ LLWaterParamManager::getInstance()->propagateParameters();
+}
+
+// vector control callbacks
+void LLFloaterEditWater::onVector3ControlYMoved(LLUICtrl* ctrl, WaterVector3Control* vector_ctrl)
+{
+ LLSliderCtrl* sldr_ctrl = static_cast<LLSliderCtrl*>(ctrl);
+
+ vector_ctrl->mY = sldr_ctrl->getValueF32();
+
+ vector_ctrl->update(LLWaterParamManager::getInstance()->mCurParams);
+
+ LLWaterParamManager::getInstance()->propagateParameters();
+}
+
+// vector control callbacks
+void LLFloaterEditWater::onVector3ControlZMoved(LLUICtrl* ctrl, WaterVector3Control* vector_ctrl)
+{
+ LLSliderCtrl* sldr_ctrl = static_cast<LLSliderCtrl*>(ctrl);
+
+ vector_ctrl->mZ = sldr_ctrl->getValueF32();
+
+ vector_ctrl->update(LLWaterParamManager::getInstance()->mCurParams);
+
+ LLWaterParamManager::getInstance()->propagateParameters();
+}
+
+
+// vector control callbacks
+void LLFloaterEditWater::onVector2ControlXMoved(LLUICtrl* ctrl, WaterVector2Control* vector_ctrl)
+{
+ LLSliderCtrl* sldr_ctrl = static_cast<LLSliderCtrl*>(ctrl);
+
+ vector_ctrl->mX = sldr_ctrl->getValueF32();
+
+ vector_ctrl->update(LLWaterParamManager::getInstance()->mCurParams);
+
+ LLWaterParamManager::getInstance()->propagateParameters();
+}
+
+// vector control callbacks
+void LLFloaterEditWater::onVector2ControlYMoved(LLUICtrl* ctrl, WaterVector2Control* vector_ctrl)
+{
+ LLSliderCtrl* sldr_ctrl = static_cast<LLSliderCtrl*>(ctrl);
+
+ vector_ctrl->mY = sldr_ctrl->getValueF32();
+
+ vector_ctrl->update(LLWaterParamManager::getInstance()->mCurParams);
+
+ LLWaterParamManager::getInstance()->propagateParameters();
+}
+
+void LLFloaterEditWater::onFloatControlMoved(LLUICtrl* ctrl, WaterFloatControl* floatControl)
+{
+ LLSliderCtrl* sldr_ctrl = static_cast<LLSliderCtrl*>(ctrl);
+
+ floatControl->mX = sldr_ctrl->getValueF32() / floatControl->mMult;
+
+ floatControl->update(LLWaterParamManager::getInstance()->mCurParams);
+ LLWaterParamManager::getInstance()->propagateParameters();
+}
+
+void LLFloaterEditWater::onExpFloatControlMoved(LLUICtrl* ctrl, WaterExpFloatControl* expFloatControl)
+{
+ LLSliderCtrl* sldr_ctrl = static_cast<LLSliderCtrl*>(ctrl);
+
+ F32 val = sldr_ctrl->getValueF32();
+ expFloatControl->mExp = val;
+ LLWaterParamManager::getInstance()->setDensitySliderValue(val);
+
+ expFloatControl->update(LLWaterParamManager::getInstance()->mCurParams);
+ LLWaterParamManager::getInstance()->propagateParameters();
+}
+
+void LLFloaterEditWater::onWaterFogColorMoved(LLUICtrl* ctrl, WaterColorControl* color_ctrl)
+{
+ LLColorSwatchCtrl* swatch = static_cast<LLColorSwatchCtrl*>(ctrl);
+ *color_ctrl = swatch->get();
+
+ color_ctrl->update(LLWaterParamManager::getInstance()->mCurParams);
+ LLWaterParamManager::getInstance()->propagateParameters();
+}
+
+void LLFloaterEditWater::onNormalMapPicked(LLUICtrl* ctrl)
+{
+ LLTextureCtrl* textCtrl = static_cast<LLTextureCtrl*>(ctrl);
+ LLUUID textID = textCtrl->getImageAssetID();
+ LLWaterParamManager::getInstance()->setNormalMapID(textID);
+}
+
+//=============================================================================
+
+void LLFloaterEditWater::reset()
+{
+ if (isNewPreset())
+ {
+ mWaterPresetNameEditor->setValue(LLSD());
+ mSaveButton->setEnabled(FALSE); // will be enabled as soon as users enters a name
+ }
+ else
+ {
+ refreshWaterPresetsList();
+
+ // Disable controls until a water preset to edit is selected.
+ enableEditing(false);
+ }
+}
+
+bool LLFloaterEditWater::isNewPreset() const
+{
+ return mKey.asString() == "new";
+}
+
+void LLFloaterEditWater::refreshWaterPresetsList()
+{
+ mWaterPresetCombo->removeall();
+
+#if 0 // *TODO: enable when we have a clear workflow to edit existing region environment
+ // If the region already has water params, add them to the list.
+ const LLEnvironmentSettings& region_settings = LLEnvManagerNew::instance().getRegionSettings();
+ if (region_settings.getWaterParams().size() != 0)
+ {
+ const std::string& region_name = gAgent.getRegion()->getName();
+ mWaterPresetCombo->add(region_name, LLSD().with(0, region_name).with(1, LLEnvKey::SCOPE_REGION));
+ mWaterPresetCombo->addSeparator();
+ }
+#endif
+
+ std::list<std::string> user_presets, system_presets;
+ LLWaterParamManager::instance().getPresetNames(user_presets, system_presets);
+
+ // Add local user presets first.
+ for (std::list<std::string>::const_iterator it = user_presets.begin(); it != user_presets.end(); ++it)
+ {
+ const std::string& name = *it;
+ mWaterPresetCombo->add(name, LLSD().with(0, name).with(1, LLEnvKey::SCOPE_LOCAL)); // [<name>, <scope>]
+ }
+
+ if (user_presets.size() > 0)
+ {
+ mWaterPresetCombo->addSeparator();
+ }
+
+ // Add local system presets.
+ for (std::list<std::string>::const_iterator it = system_presets.begin(); it != system_presets.end(); ++it)
+ {
+ const std::string& name = *it;
+ mWaterPresetCombo->add(name, LLSD().with(0, name).with(1, LLEnvKey::SCOPE_LOCAL)); // [<name>, <scope>]
+ }
+
+ mWaterPresetCombo->setLabel(getString("combo_label"));
+}
+
+void LLFloaterEditWater::enableEditing(bool enable)
+{
+ // Enable/disable water controls.
+ getChild<LLPanel>("panel_water_preset")->setCtrlsEnabled(enable);
+
+ // Enable/disable saving.
+ mSaveButton->setEnabled(enable);
+ mMakeDefaultCheckBox->setEnabled(enable);
+}
+
+void LLFloaterEditWater::saveRegionWater()
+{
+ llassert(getCurrentScope() == LLEnvKey::SCOPE_REGION); // make sure we're editing region water
+
+ LL_DEBUGS("Windlight") << "Saving region water preset" << llendl;
+
+ //LLWaterParamSet region_water = water_mgr.mCurParams;
+
+ // *TODO: save to cached region settings.
+ LL_WARNS("Windlight") << "Saving region water is not fully implemented yet" << LL_ENDL;
+}
+
+std::string LLFloaterEditWater::getCurrentPresetName() const
+{
+ std::string name;
+ LLEnvKey::EScope scope;
+ getSelectedPreset(name, scope);
+ return name;
+}
+
+LLEnvKey::EScope LLFloaterEditWater::getCurrentScope() const
+{
+ std::string name;
+ LLEnvKey::EScope scope;
+ getSelectedPreset(name, scope);
+ return scope;
+}
+
+void LLFloaterEditWater::getSelectedPreset(std::string& name, LLEnvKey::EScope& scope) const
+{
+ if (mWaterPresetNameEditor->getVisible())
+ {
+ name = mWaterPresetNameEditor->getText();
+ scope = LLEnvKey::SCOPE_LOCAL;
+ }
+ else
+ {
+ LLSD combo_val = mWaterPresetCombo->getValue();
+
+ if (!combo_val.isArray()) // manually typed text
+ {
+ name = combo_val.asString();
+ scope = LLEnvKey::SCOPE_LOCAL;
+ }
+ else
+ {
+ name = combo_val[0].asString();
+ scope = (LLEnvKey::EScope) combo_val[1].asInteger();
+ }
+ }
+}
+
+void LLFloaterEditWater::onWaterPresetNameEdited()
+{
+ // Disable saving a water preset having empty name.
+ mSaveButton->setEnabled(!getCurrentPresetName().empty());
+}
+
+void LLFloaterEditWater::onWaterPresetSelected()
+{
+ LLWaterParamSet water_params;
+ std::string name;
+ LLEnvKey::EScope scope;
+
+ getSelectedPreset(name, scope);
+
+ // Display selected preset.
+ if (scope == LLEnvKey::SCOPE_REGION)
+ {
+ water_params.setAll(LLEnvManagerNew::instance().getRegionSettings().getWaterParams());
+ }
+ else // local preset selected
+ {
+ if (!LLWaterParamManager::instance().getParamSet(name, water_params))
+ {
+ // Manually entered string?
+ LL_WARNS("Windlight") << "No water preset named " << name << LL_ENDL;
+ return;
+ }
+ }
+
+ LLEnvManagerNew::instance().useWaterParams(water_params.getAll());
+
+ bool can_edit = (scope == LLEnvKey::SCOPE_LOCAL || LLEnvManagerNew::canEditRegionSettings());
+ enableEditing(can_edit);
+
+ mMakeDefaultCheckBox->setEnabled(scope == LLEnvKey::SCOPE_LOCAL);
+}
+
+bool LLFloaterEditWater::onSaveAnswer(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+
+ // If they choose save, do it. Otherwise, don't do anything
+ if (option == 0)
+ {
+ onSaveConfirmed();
+ }
+
+ return false;
+}
+
+void LLFloaterEditWater::onSaveConfirmed()
+{
+ // Save currently displayed water params to the selected preset.
+ std::string name = getCurrentPresetName();
+
+ LL_DEBUGS("Windlight") << "Saving sky preset " << name << LL_ENDL;
+ LLWaterParamManager& water_mgr = LLWaterParamManager::instance();
+ if (water_mgr.hasParamSet(name))
+ {
+ water_mgr.setParamSet(name, water_mgr.mCurParams);
+ }
+ else
+ {
+ water_mgr.addParamSet(name, water_mgr.mCurParams);
+ }
+
+ water_mgr.savePreset(name);
+
+ // Change preference if requested.
+ if (mMakeDefaultCheckBox->getEnabled() && mMakeDefaultCheckBox->getValue())
+ {
+ LL_DEBUGS("Windlight") << name << " is now the new preferred water preset" << llendl;
+ LLEnvManagerNew::instance().setUseWaterPreset(name);
+ }
+
+ closeFloater();
+}
+
+void LLFloaterEditWater::onBtnSave()
+{
+ LLEnvKey::EScope scope;
+ std::string name;
+ getSelectedPreset(name, scope);
+
+ if (scope == LLEnvKey::SCOPE_REGION)
+ {
+ saveRegionWater();
+ closeFloater();
+ return;
+ }
+
+ if (name.empty())
+ {
+ // *TODO: show an alert
+ llwarns << "Empty water preset name" << llendl;
+ return;
+ }
+
+ // Don't allow overwriting system presets.
+ LLWaterParamManager& water_mgr = LLWaterParamManager::instance();
+ if (water_mgr.isSystemPreset(name))
+ {
+ LLNotificationsUtil::add("WLNoEditDefault");
+ return;
+ }
+
+ // Save, ask for confirmation for overwriting an existing preset.
+ if (water_mgr.hasParamSet(name))
+ {
+ LLNotificationsUtil::add("WLSavePresetAlert", LLSD(), LLSD(), boost::bind(&LLFloaterEditWater::onSaveAnswer, this, _1, _2));
+ }
+ else
+ {
+ // new preset, hence no confirmation needed
+ onSaveConfirmed();
+ }
+}
+
+void LLFloaterEditWater::onBtnCancel()
+{
+ closeFloater();
+}
+
+void LLFloaterEditWater::onWaterPresetListChange()
+{
+ std::string name;
+ LLEnvKey::EScope scope;
+ getSelectedPreset(name, scope); // preset being edited
+
+ if (scope == LLEnvKey::SCOPE_LOCAL && !LLWaterParamManager::instance().hasParamSet(name))
+ {
+ // Preset we've been editing doesn't exist anymore. Close the floater.
+ closeFloater(false);
+ }
+ else
+ {
+ // A new preset has been added.
+ // Refresh the presets list, though it may not make sense as the floater is about to be closed.
+ refreshWaterPresetsList();
+ }
+}
+
+void LLFloaterEditWater::onRegionSettingsChange()
+{
+ // If creating a new preset, don't bother.
+ if (isNewPreset())
+ {
+ return;
+ }
+
+ if (getCurrentScope() == LLEnvKey::SCOPE_REGION) // if editing region water
+ {
+ // reset the floater to its initial state
+ reset();
+
+ // *TODO: Notify user?
+ }
+ else // editing a local preset
+ {
+ refreshWaterPresetsList();
+ }
+}
+
+void LLFloaterEditWater::onRegionInfoUpdate()
+{
+ bool can_edit = true;
+
+ // If we've selected the region water for editing.
+ if (getCurrentScope() == LLEnvKey::SCOPE_REGION)
+ {
+ // check whether we have the access
+ can_edit = LLEnvManagerNew::canEditRegionSettings();
+ }
+
+ enableEditing(can_edit);
+}
diff --git a/indra/newview/llfloatereditwater.h b/indra/newview/llfloatereditwater.h
new file mode 100644
index 0000000000..2211bca59f
--- /dev/null
+++ b/indra/newview/llfloatereditwater.h
@@ -0,0 +1,115 @@
+/**
+ * @file llfloatereditwater.h
+ * @brief Floater to create or edit a water preset
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLFLOATEREDITWATER_H
+#define LL_LLFLOATEREDITWATER_H
+
+#include "llfloater.h"
+#include "llenvmanager.h" // for LLEnvKey
+
+class LLButton;
+class LLCheckBoxCtrl;
+class LLComboBox;
+class LLLineEditor;
+
+struct WaterVector2Control;
+struct WaterVector3Control;
+struct WaterColorControl;
+struct WaterFloatControl;
+struct WaterExpFloatControl;
+
+class LLFloaterEditWater : public LLFloater
+{
+ LOG_CLASS(LLFloaterEditWater);
+
+public:
+ LLFloaterEditWater(const LLSD &key);
+
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void onOpen(const LLSD& key);
+ /*virtual*/ void onClose(bool app_quitting);
+ /*virtual*/ void draw();
+
+private:
+ void initCallbacks(void);
+
+ //-- WL stuff begins ------------------------------------------------------
+
+ void syncControls(); /// sync up sliders with parameters
+
+ // general purpose callbacks for dealing with color controllers
+ void onColorControlRMoved(LLUICtrl* ctrl, WaterColorControl* color_ctrl);
+ void onColorControlGMoved(LLUICtrl* ctrl, WaterColorControl* color_ctrl);
+ void onColorControlBMoved(LLUICtrl* ctrl, WaterColorControl* color_ctrl);
+ void onColorControlAMoved(LLUICtrl* ctrl, WaterColorControl* color_ctrl);
+ void onColorControlIMoved(LLUICtrl* ctrl, WaterColorControl* color_ctrl);
+
+ void onVector3ControlXMoved(LLUICtrl* ctrl, WaterVector3Control* vector_ctrl);
+ void onVector3ControlYMoved(LLUICtrl* ctrl, WaterVector3Control* vector_ctrl);
+ void onVector3ControlZMoved(LLUICtrl* ctrl, WaterVector3Control* vector_ctrl);
+
+ void onVector2ControlXMoved(LLUICtrl* ctrl, WaterVector2Control* vector_ctrl);
+ void onVector2ControlYMoved(LLUICtrl* ctrl, WaterVector2Control* vector_ctrl);
+
+ void onFloatControlMoved(LLUICtrl* ctrl, WaterFloatControl* floatControl);
+
+ void onExpFloatControlMoved(LLUICtrl* ctrl, WaterExpFloatControl* expFloatControl);
+
+ void onWaterFogColorMoved(LLUICtrl* ctrl, WaterColorControl* color_ctrl);
+
+ void onNormalMapPicked(LLUICtrl* ctrl); /// handle if they choose a new normal map
+
+ //-- WL stuff ends --------------------------------------------------------
+
+ void reset();
+ bool isNewPreset() const;
+ void refreshWaterPresetsList();
+ void enableEditing(bool enable);
+ void saveRegionWater();
+
+ std::string getCurrentPresetName() const;
+ LLEnvKey::EScope getCurrentScope() const;
+ void getSelectedPreset(std::string& name, LLEnvKey::EScope& scope) const;
+
+ void onWaterPresetNameEdited();
+ void onWaterPresetSelected();
+ bool onSaveAnswer(const LLSD& notification, const LLSD& response);
+ void onSaveConfirmed();
+
+ void onBtnSave();
+ void onBtnCancel();
+
+ void onWaterPresetListChange();
+ void onRegionSettingsChange();
+ void onRegionInfoUpdate();
+
+ LLLineEditor* mWaterPresetNameEditor;
+ LLComboBox* mWaterPresetCombo;
+ LLCheckBoxCtrl* mMakeDefaultCheckBox;
+ LLButton* mSaveButton;
+};
+
+#endif // LL_LLFLOATEREDITWATER_H
diff --git a/indra/newview/llfloaterenvironmentsettings.cpp b/indra/newview/llfloaterenvironmentsettings.cpp
new file mode 100644
index 0000000000..4dbc8cdee0
--- /dev/null
+++ b/indra/newview/llfloaterenvironmentsettings.cpp
@@ -0,0 +1,282 @@
+/**
+ * @file llfloaterenvironmentsettings.cpp
+ * @brief LLFloaterEnvironmentSettings class definition
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloaterenvironmentsettings.h"
+
+#include "llcombobox.h"
+#include "llradiogroup.h"
+
+#include "lldaycyclemanager.h"
+#include "llenvmanager.h"
+#include "llwaterparammanager.h"
+#include "llwlparamset.h"
+#include "llwlparammanager.h"
+
+LLFloaterEnvironmentSettings::LLFloaterEnvironmentSettings(const LLSD &key)
+: LLFloater(key)
+ ,mRegionSettingsRadioGroup(NULL)
+ ,mDayCycleSettingsRadioGroup(NULL)
+ ,mWaterPresetCombo(NULL)
+ ,mSkyPresetCombo(NULL)
+ ,mDayCyclePresetCombo(NULL)
+{
+}
+
+// virtual
+BOOL LLFloaterEnvironmentSettings::postBuild()
+{
+ mRegionSettingsRadioGroup = getChild<LLRadioGroup>("region_settings_radio_group");
+ mRegionSettingsRadioGroup->setCommitCallback(boost::bind(&LLFloaterEnvironmentSettings::onSwitchRegionSettings, this));
+
+ mDayCycleSettingsRadioGroup = getChild<LLRadioGroup>("sky_dayc_settings_radio_group");
+ mDayCycleSettingsRadioGroup->setCommitCallback(boost::bind(&LLFloaterEnvironmentSettings::onSwitchDayCycle, this));
+
+ mWaterPresetCombo = getChild<LLComboBox>("water_settings_preset_combo");
+ mWaterPresetCombo->setCommitCallback(boost::bind(&LLFloaterEnvironmentSettings::onSelectWaterPreset, this));
+
+ mSkyPresetCombo = getChild<LLComboBox>("sky_settings_preset_combo");
+ mSkyPresetCombo->setCommitCallback(boost::bind(&LLFloaterEnvironmentSettings::onSelectSkyPreset, this));
+
+ mDayCyclePresetCombo = getChild<LLComboBox>("dayc_settings_preset_combo");
+ mDayCyclePresetCombo->setCommitCallback(boost::bind(&LLFloaterEnvironmentSettings::onSelectDayCyclePreset, this));
+
+ childSetCommitCallback("ok_btn", boost::bind(&LLFloaterEnvironmentSettings::onBtnOK, this), NULL);
+ getChild<LLUICtrl>("ok_btn")->setRightMouseDownCallback(boost::bind(&LLEnvManagerNew::dumpUserPrefs, LLEnvManagerNew::getInstance()));
+ childSetCommitCallback("cancel_btn", boost::bind(&LLFloaterEnvironmentSettings::onBtnCancel, this), NULL);
+ getChild<LLUICtrl>("cancel_btn")->setRightMouseDownCallback(boost::bind(&LLEnvManagerNew::dumpPresets, LLEnvManagerNew::getInstance()));
+
+ setCloseCallback(boost::bind(&LLFloaterEnvironmentSettings::cancel, this));
+
+ LLEnvManagerNew::instance().setPreferencesChangeCallback(boost::bind(&LLFloaterEnvironmentSettings::refresh, this));
+ LLDayCycleManager::instance().setModifyCallback(boost::bind(&LLFloaterEnvironmentSettings::populateDayCyclePresetsList, this));
+ LLWLParamManager::instance().setPresetListChangeCallback(boost::bind(&LLFloaterEnvironmentSettings::populateSkyPresetsList, this));
+ LLWaterParamManager::instance().setPresetListChangeCallback(boost::bind(&LLFloaterEnvironmentSettings::populateWaterPresetsList, this));
+
+ return TRUE;
+}
+
+// virtual
+void LLFloaterEnvironmentSettings::onOpen(const LLSD& key)
+{
+ refresh();
+}
+
+void LLFloaterEnvironmentSettings::onSwitchRegionSettings()
+{
+ getChild<LLView>("user_environment_settings")->setEnabled(mRegionSettingsRadioGroup->getSelectedIndex() != 0);
+
+ apply();
+}
+
+void LLFloaterEnvironmentSettings::onSwitchDayCycle()
+{
+ bool is_fixed_sky = mDayCycleSettingsRadioGroup->getSelectedIndex() == 0;
+
+ mSkyPresetCombo->setEnabled(is_fixed_sky);
+ mDayCyclePresetCombo->setEnabled(!is_fixed_sky);
+
+ apply();
+}
+
+void LLFloaterEnvironmentSettings::onSelectWaterPreset()
+{
+ apply();
+}
+
+void LLFloaterEnvironmentSettings::onSelectSkyPreset()
+{
+ apply();
+}
+
+void LLFloaterEnvironmentSettings::onSelectDayCyclePreset()
+{
+ apply();
+}
+
+void LLFloaterEnvironmentSettings::onBtnOK()
+{
+ // Save and apply new user preferences.
+ bool use_region_settings = mRegionSettingsRadioGroup->getSelectedIndex() == 0;
+ bool use_fixed_sky = mDayCycleSettingsRadioGroup->getSelectedIndex() == 0;
+ std::string water_preset = mWaterPresetCombo->getValue().asString();
+ std::string sky_preset = mSkyPresetCombo->getValue().asString();
+ std::string day_cycle = mDayCyclePresetCombo->getValue().asString();
+
+ LLEnvManagerNew::instance().setUserPrefs(
+ water_preset,
+ sky_preset,
+ day_cycle,
+ use_fixed_sky,
+ use_region_settings);
+
+ // *TODO: This triggers applying user preferences again, which is suboptimal.
+ closeFloater();
+}
+
+void LLFloaterEnvironmentSettings::onBtnCancel()
+{
+ closeFloater();
+}
+
+void LLFloaterEnvironmentSettings::refresh()
+{
+ LLEnvManagerNew& env_mgr = LLEnvManagerNew::instance();
+
+ bool use_region_settings = env_mgr.getUseRegionSettings();
+ bool use_fixed_sky = env_mgr.getUseFixedSky();
+
+ // Set up radio buttons according to user preferences.
+ mRegionSettingsRadioGroup->setSelectedIndex(use_region_settings ? 0 : 1);
+ mDayCycleSettingsRadioGroup->setSelectedIndex(use_fixed_sky ? 0 : 1);
+
+ // Populate the combo boxes with appropriate lists of available presets.
+ populateWaterPresetsList();
+ populateSkyPresetsList();
+ populateDayCyclePresetsList();
+
+ // Enable/disable other controls based on user preferences.
+ getChild<LLView>("user_environment_settings")->setEnabled(!use_region_settings);
+ mSkyPresetCombo->setEnabled(use_fixed_sky);
+ mDayCyclePresetCombo->setEnabled(!use_fixed_sky);
+
+ // Select the current presets in combo boxes.
+ mWaterPresetCombo->selectByValue(env_mgr.getWaterPresetName());
+ mSkyPresetCombo->selectByValue(env_mgr.getSkyPresetName());
+ mDayCyclePresetCombo->selectByValue(env_mgr.getDayCycleName());
+}
+
+void LLFloaterEnvironmentSettings::apply()
+{
+ // Update environment with the user choice.
+ bool use_region_settings = mRegionSettingsRadioGroup->getSelectedIndex() == 0;
+ bool use_fixed_sky = mDayCycleSettingsRadioGroup->getSelectedIndex() == 0;
+ std::string water_preset = mWaterPresetCombo->getValue().asString();
+ std::string sky_preset = mSkyPresetCombo->getValue().asString();
+ std::string day_cycle = mDayCyclePresetCombo->getValue().asString();
+
+ LLEnvManagerNew& env_mgr = LLEnvManagerNew::instance();
+ if (use_region_settings)
+ {
+ env_mgr.useRegionSettings();
+ }
+ else
+ {
+ if (use_fixed_sky)
+ {
+ env_mgr.useSkyPreset(sky_preset);
+ }
+ else
+ {
+ env_mgr.useDayCycle(day_cycle, LLEnvKey::SCOPE_LOCAL);
+ }
+
+ env_mgr.useWaterPreset(water_preset);
+ }
+}
+
+void LLFloaterEnvironmentSettings::cancel()
+{
+ // Revert environment to user preferences.
+ LLEnvManagerNew::instance().usePrefs();
+}
+
+void LLFloaterEnvironmentSettings::populateWaterPresetsList()
+{
+ mWaterPresetCombo->removeall();
+
+ std::list<std::string> user_presets, system_presets;
+ LLWaterParamManager::instance().getPresetNames(user_presets, system_presets);
+
+ // Add user presets first.
+ for (std::list<std::string>::const_iterator it = user_presets.begin(); it != user_presets.end(); ++it)
+ {
+ mWaterPresetCombo->add(*it);
+ }
+
+ if (user_presets.size() > 0)
+ {
+ mWaterPresetCombo->addSeparator();
+ }
+
+ // Add system presets.
+ for (std::list<std::string>::const_iterator it = system_presets.begin(); it != system_presets.end(); ++it)
+ {
+ mWaterPresetCombo->add(*it);
+ }
+}
+
+void LLFloaterEnvironmentSettings::populateSkyPresetsList()
+{
+ mSkyPresetCombo->removeall();
+
+ LLWLParamManager::preset_name_list_t region_presets; // unused as we don't list region presets here
+ LLWLParamManager::preset_name_list_t user_presets, sys_presets;
+ LLWLParamManager::instance().getPresetNames(region_presets, user_presets, sys_presets);
+
+ // Add user presets.
+ for (LLWLParamManager::preset_name_list_t::const_iterator it = user_presets.begin(); it != user_presets.end(); ++it)
+ {
+ mSkyPresetCombo->add(*it);
+ }
+
+ if (!user_presets.empty())
+ {
+ mSkyPresetCombo->addSeparator();
+ }
+
+ // Add system presets.
+ for (LLWLParamManager::preset_name_list_t::const_iterator it = sys_presets.begin(); it != sys_presets.end(); ++it)
+ {
+ mSkyPresetCombo->add(*it);
+ }
+}
+
+void LLFloaterEnvironmentSettings::populateDayCyclePresetsList()
+{
+ mDayCyclePresetCombo->removeall();
+
+ LLDayCycleManager::preset_name_list_t user_days, sys_days;
+ LLDayCycleManager::instance().getPresetNames(user_days, sys_days);
+
+ // Add user days.
+ for (LLDayCycleManager::preset_name_list_t::const_iterator it = user_days.begin(); it != user_days.end(); ++it)
+ {
+ mDayCyclePresetCombo->add(*it);
+ }
+
+ if (user_days.size() > 0)
+ {
+ mDayCyclePresetCombo->addSeparator();
+ }
+
+ // Add system days.
+ for (LLDayCycleManager::preset_name_list_t::const_iterator it = sys_days.begin(); it != sys_days.end(); ++it)
+ {
+ mDayCyclePresetCombo->add(*it);
+ }
+}
diff --git a/indra/newview/llfloaterenvironmentsettings.h b/indra/newview/llfloaterenvironmentsettings.h
new file mode 100644
index 0000000000..0ab458a0f6
--- /dev/null
+++ b/indra/newview/llfloaterenvironmentsettings.h
@@ -0,0 +1,71 @@
+/**
+ * @file llfloaterenvironmentsettings.h
+ * @brief LLFloaterEnvironmentSettings class definition
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLFLOATERENVIRONMENTSETTINGS_H
+#define LL_LLFLOATERENVIRONMENTSETTINGS_H
+
+#include "llfloater.h"
+
+class LLComboBox;
+class LLRadioGroup;
+
+class LLFloaterEnvironmentSettings : public LLFloater
+{
+ LOG_CLASS(LLFloaterEnvironmentSettings);
+
+public:
+ LLFloaterEnvironmentSettings(const LLSD &key);
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void onOpen(const LLSD& key);
+
+private:
+ void onSwitchRegionSettings();
+ void onSwitchDayCycle();
+
+ void onSelectWaterPreset();
+ void onSelectSkyPreset();
+ void onSelectDayCyclePreset();
+
+ void onBtnOK();
+ void onBtnCancel();
+
+ void refresh(); /// update controls with user prefs
+ void apply();
+ void cancel();
+
+ void populateWaterPresetsList();
+ void populateSkyPresetsList();
+ void populateDayCyclePresetsList();
+
+ LLRadioGroup* mRegionSettingsRadioGroup;
+ LLRadioGroup* mDayCycleSettingsRadioGroup;
+
+ LLComboBox* mWaterPresetCombo;
+ LLComboBox* mSkyPresetCombo;
+ LLComboBox* mDayCyclePresetCombo;
+};
+
+#endif // LL_LLFLOATERENVIRONMENTSETTINGS_H
diff --git a/indra/newview/llfloaterenvsettings.cpp b/indra/newview/llfloaterenvsettings.cpp
deleted file mode 100644
index fcaef1f34b..0000000000
--- a/indra/newview/llfloaterenvsettings.cpp
+++ /dev/null
@@ -1,268 +0,0 @@
-/**
- * @file llfloaterenvsettings.cpp
- * @brief LLFloaterEnvSettings class definition
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llfloaterenvsettings.h"
-
-#include "llfloaterreg.h"
-#include "llfloaterwindlight.h"
-#include "llfloaterwater.h"
-#include "lluictrlfactory.h"
-#include "llsliderctrl.h"
-#include "llcombobox.h"
-#include "llcolorswatch.h"
-#include "llwlanimator.h"
-
-#include "llwlparamset.h"
-#include "llwlparammanager.h"
-#include "llwaterparammanager.h"
-#include "llmath.h"
-#include "llviewerwindow.h"
-
-#include "pipeline.h"
-
-#include <sstream>
-
-LLFloaterEnvSettings::LLFloaterEnvSettings(const LLSD& key)
- : LLFloater(key)
-{
-}
-// virtual
-LLFloaterEnvSettings::~LLFloaterEnvSettings()
-{
-}
-// virtual
-BOOL LLFloaterEnvSettings::postBuild()
-{
- // load it up
- initCallbacks();
- syncMenu();
- return TRUE;
-}
-
-void LLFloaterEnvSettings::initCallbacks(void)
-{
- // our three sliders
- getChild<LLUICtrl>("EnvTimeSlider")->setCommitCallback(boost::bind(&LLFloaterEnvSettings::onChangeDayTime, this, _1));
- getChild<LLUICtrl>("EnvCloudSlider")->setCommitCallback(boost::bind(&LLFloaterEnvSettings::onChangeCloudCoverage, this, _1));
- getChild<LLUICtrl>("EnvWaterFogSlider")->setCommitCallback(boost::bind(&LLFloaterEnvSettings::onChangeWaterFogDensity, this, _1, &LLWaterParamManager::instance()->mFogDensity));
-
- // color picker
- getChild<LLUICtrl>("EnvWaterColor")->setCommitCallback(boost::bind(&LLFloaterEnvSettings::onChangeWaterColor, this, _1, &LLWaterParamManager::instance()->mFogColor));
-
- // WL Top
- getChild<LLUICtrl>("EnvAdvancedSkyButton")->setCommitCallback(boost::bind(&LLFloaterEnvSettings::onOpenAdvancedSky, this));
- getChild<LLUICtrl>("EnvAdvancedWaterButton")->setCommitCallback(boost::bind(&LLFloaterEnvSettings::onOpenAdvancedWater, this));
- getChild<LLUICtrl>("EnvUseEstateTimeButton")->setCommitCallback(boost::bind(&LLFloaterEnvSettings::onUseEstateTime, this));
-}
-
-// menu maintenance functions
-
-void LLFloaterEnvSettings::syncMenu()
-{
- LLSliderCtrl* sldr;
- sldr = getChild<LLSliderCtrl>("EnvTimeSlider");
-
- // sync the clock
- F32 val = (F32)LLWLParamManager::instance()->mAnimator.getDayTime();
- std::string timeStr = timeToString(val);
-
- LLTextBox* textBox;
- textBox = getChild<LLTextBox>("EnvTimeText");
-
- textBox->setValue(timeStr);
-
- // sync time slider which starts at 6 AM
- val -= 0.25;
- if(val < 0)
- {
- val++;
- }
- sldr->setValue(val);
-
- // sync cloud coverage
- bool err;
- getChild<LLUICtrl>("EnvCloudSlider")->setValue(LLWLParamManager::instance()->mCurParams.getFloat("cloud_shadow", err));
-
- LLWaterParamManager * param_mgr = LLWaterParamManager::instance();
- // sync water params
- LLColor4 col = param_mgr->getFogColor();
- LLColorSwatchCtrl* colCtrl = getChild<LLColorSwatchCtrl>("EnvWaterColor");
- col.mV[3] = 1.0f;
- colCtrl->set(col);
-
- getChild<LLUICtrl>("EnvWaterFogSlider")->setValue(param_mgr->mFogDensity.mExp);
- param_mgr->setDensitySliderValue(param_mgr->mFogDensity.mExp);
-
- // turn off Use Estate Time button if it's already being used
- if(LLWLParamManager::instance()->mAnimator.mUseLindenTime)
- {
- getChildView("EnvUseEstateTimeButton")->setEnabled(FALSE);
- } else {
- getChildView("EnvUseEstateTimeButton")->setEnabled(TRUE);
- }
-
- if(!gPipeline.canUseVertexShaders())
- {
- getChildView("EnvWaterColor")->setEnabled(FALSE);
- getChildView("EnvWaterColorText")->setEnabled(FALSE);
- //getChildView("EnvAdvancedWaterButton")->setEnabled(FALSE);
- }
- else
- {
- getChildView("EnvWaterColor")->setEnabled(TRUE);
- getChildView("EnvWaterColorText")->setEnabled(TRUE);
- //getChildView("EnvAdvancedWaterButton")->setEnabled(TRUE);
- }
-
- // only allow access to these if they are using windlight
- if(!gPipeline.canUseWindLightShaders())
- {
-
- getChildView("EnvCloudSlider")->setEnabled(FALSE);
- getChildView("EnvCloudText")->setEnabled(FALSE);
- //getChildView("EnvAdvancedSkyButton")->setEnabled(FALSE);
- }
- else
- {
- getChildView("EnvCloudSlider")->setEnabled(TRUE);
- getChildView("EnvCloudText")->setEnabled(TRUE);
- //getChildView("EnvAdvancedSkyButton")->setEnabled(TRUE);
- }
-}
-
-void LLFloaterEnvSettings::onChangeDayTime(LLUICtrl* ctrl)
-{
- LLSliderCtrl* sldr = static_cast<LLSliderCtrl*>(ctrl);
-
- // deactivate animator
- LLWLParamManager::instance()->mAnimator.mIsRunning = false;
- LLWLParamManager::instance()->mAnimator.mUseLindenTime = false;
-
- F32 val = sldr->getValueF32() + 0.25f;
- if(val > 1.0)
- {
- val--;
- }
-
- LLWLParamManager::instance()->mAnimator.setDayTime((F64)val);
- LLWLParamManager::instance()->mAnimator.update(
- LLWLParamManager::instance()->mCurParams);
-}
-
-void LLFloaterEnvSettings::onChangeCloudCoverage(LLUICtrl* ctrl)
-{
- LLSliderCtrl* sldr = static_cast<LLSliderCtrl*>(ctrl);
-
- // deactivate animator
- //LLWLParamManager::instance()->mAnimator.mIsRunning = false;
- //LLWLParamManager::instance()->mAnimator.mUseLindenTime = false;
-
- F32 val = sldr->getValueF32();
- LLWLParamManager::instance()->mCurParams.set("cloud_shadow", val);
-}
-
-void LLFloaterEnvSettings::onChangeWaterFogDensity(LLUICtrl* ctrl, WaterExpFloatControl* expFloatControl)
-{
- LLSliderCtrl* sldr;
- sldr = getChild<LLSliderCtrl>("EnvWaterFogSlider");
-
- F32 val = sldr->getValueF32();
- expFloatControl->mExp = val;
- LLWaterParamManager::instance()->setDensitySliderValue(val);
-
- expFloatControl->update(LLWaterParamManager::instance()->mCurParams);
- LLWaterParamManager::instance()->propagateParameters();
-}
-
-void LLFloaterEnvSettings::onChangeWaterColor(LLUICtrl* ctrl, WaterColorControl* colorControl)
-{
- LLColorSwatchCtrl* swatch = static_cast<LLColorSwatchCtrl*>(ctrl);
- *colorControl = swatch->get();
-
- colorControl->update(LLWaterParamManager::instance()->mCurParams);
- LLWaterParamManager::instance()->propagateParameters();
-}
-
-
-void LLFloaterEnvSettings::onOpenAdvancedSky()
-{
- LLFloaterReg::showInstance("env_windlight");
-}
-
-void LLFloaterEnvSettings::onOpenAdvancedWater()
-{
- LLFloaterReg::showInstance("env_water");
-}
-
-
-void LLFloaterEnvSettings::onUseEstateTime()
-{
- LLFloaterWindLight* wl = LLFloaterReg::findTypedInstance<LLFloaterWindLight>("env_windlight");
- if(wl)
- {
- LLComboBox* box = wl->getChild<LLComboBox>("WLPresetsCombo");
- box->selectByValue("");
- }
-
- LLWLParamManager::instance()->mAnimator.mIsRunning = true;
- LLWLParamManager::instance()->mAnimator.mUseLindenTime = true;
-}
-
-std::string LLFloaterEnvSettings::timeToString(F32 curTime)
-{
- S32 hours;
- S32 min;
-
- // get hours and minutes
- hours = (S32) (24.0 * curTime);
- curTime -= ((F32) hours / 24.0f);
- min = llround(24.0f * 60.0f * curTime);
-
- // handle case where it's 60
- if(min == 60)
- {
- hours++;
- min = 0;
- }
-
- std::string newTime = getString("timeStr");
- struct tm * timeT;
- time_t secT = time(0);
- timeT = gmtime (&secT);
-
- timeT->tm_hour = hours;
- timeT->tm_min = min;
- secT = mktime (timeT);
- secT -= LLStringOps::getLocalTimeOffset ();
-
- LLSD substitution;
- substitution["datetime"] = (S32) secT;
-
- LLStringUtil::format (newTime, substitution);
- return newTime;
-}
diff --git a/indra/newview/llfloaterenvsettings.h b/indra/newview/llfloaterenvsettings.h
deleted file mode 100644
index a6280cfb97..0000000000
--- a/indra/newview/llfloaterenvsettings.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/**
- * @file llfloaterskysettings.h
- * @brief LLFloaterEnvSettings class definition
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-/*
- * Simple menu for adjusting the atmospheric settings of the world
- */
-
-#ifndef LL_LLFLOATERENVSETTINGS_H
-#define LL_LLFLOATERENVSETTINGS_H
-
-#include "llfloater.h"
-
-struct WaterColorControl;
-struct WaterExpFloatControl;
-
-/// Menuing system for all of windlight's functionality
-class LLFloaterEnvSettings : public LLFloater
-{
-public:
-
- LLFloaterEnvSettings(const LLSD& key);
- /*virtual*/ ~LLFloaterEnvSettings();
- /*virtual*/ BOOL postBuild();
- /// initialize all the callbacks for the menu
- void initCallbacks(void);
-
- /// handle if time of day is changed
- void onChangeDayTime(LLUICtrl* ctrl);
-
- /// handle if cloud coverage is changed
- void onChangeCloudCoverage(LLUICtrl* ctrl);
-
- /// handle change in water fog density
- void onChangeWaterFogDensity(LLUICtrl* ctrl, WaterExpFloatControl* expFloatControl);
-
- /// handle change in water fog color
- void onChangeWaterColor(LLUICtrl* ctrl, WaterColorControl* colorControl);
-
- /// open the advanced sky settings menu
- void onOpenAdvancedSky();
-
- /// open the advanced water settings menu
- void onOpenAdvancedWater();
-
- /// sync time with the server
- void onUseEstateTime();
-
- //// menu management
-
- /// sync up sliders with parameters
- void syncMenu();
-
- /// convert the present time to a digital clock time
- std::string timeToString(F32 curTime);
-
-private:
-};
-
-
-#endif
diff --git a/indra/newview/llfloaterevent.cpp b/indra/newview/llfloaterevent.cpp
index 0b5ac8e798..a6dafda3e6 100644
--- a/indra/newview/llfloaterevent.cpp
+++ b/indra/newview/llfloaterevent.cpp
@@ -117,8 +117,3 @@ void LLFloaterEvent::setEventID(const U32 event_id)
}
}
-
-void LLFloaterEvent::draw()
-{
- LLPanel::draw();
-}
diff --git a/indra/newview/llfloaterevent.h b/indra/newview/llfloaterevent.h
index b1963309da..ed90055d95 100644
--- a/indra/newview/llfloaterevent.h
+++ b/indra/newview/llfloaterevent.h
@@ -43,7 +43,6 @@ public:
/*virtual*/ ~LLFloaterEvent();
/*virtual*/ BOOL postBuild();
- /*virtual*/ void draw();
void setEventID(const U32 event_id);
diff --git a/indra/newview/llfloaterfriends.cpp b/indra/newview/llfloaterfriends.cpp
deleted file mode 100644
index f93568d617..0000000000
--- a/indra/newview/llfloaterfriends.cpp
+++ /dev/null
@@ -1,807 +0,0 @@
-/**
- * @file llfloaterfriends.cpp
- * @author Phoenix
- * @date 2005-01-13
- * @brief Implementation of the friends floater
- *
- * $LicenseInfo:firstyear=2005&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llfloaterfriends.h"
-
-#include <sstream>
-
-#include "lldir.h"
-
-#include "llagent.h"
-#include "llappviewer.h" // for gLastVersionChannel
-#include "llfloateravatarpicker.h"
-#include "llviewerwindow.h"
-#include "llbutton.h"
-#include "llavataractions.h"
-#include "llinventorymodel.h"
-#include "llnamelistctrl.h"
-#include "llnotificationsutil.h"
-#include "llresmgr.h"
-#include "llscrolllistctrl.h"
-#include "llscrolllistitem.h"
-#include "llscrolllistcell.h"
-#include "lluictrlfactory.h"
-#include "llmenucommands.h"
-#include "llviewercontrol.h"
-#include "llviewermessage.h"
-#include "lleventtimer.h"
-#include "lltextbox.h"
-#include "llvoiceclient.h"
-
-// *TODO: Move more common stuff to LLAvatarActions?
-
-//Maximum number of people you can select to do an operation on at once.
-#define MAX_FRIEND_SELECT 20
-#define DEFAULT_PERIOD 5.0
-#define RIGHTS_CHANGE_TIMEOUT 5.0
-#define OBSERVER_TIMEOUT 0.5
-
-#define ONLINE_SIP_ICON_NAME "slim_icon_16_viewer.tga"
-
-// simple class to observe the calling cards.
-class LLLocalFriendsObserver : public LLFriendObserver, public LLEventTimer
-{
-public:
- LLLocalFriendsObserver(LLPanelFriends* floater) : mFloater(floater), LLEventTimer(OBSERVER_TIMEOUT)
- {
- mEventTimer.stop();
- }
- virtual ~LLLocalFriendsObserver()
- {
- mFloater = NULL;
- }
- virtual void changed(U32 mask)
- {
- // events can arrive quickly in bulk - we need not process EVERY one of them -
- // so we wait a short while to let others pile-in, and process them in aggregate.
- mEventTimer.start();
-
- // save-up all the mask-bits which have come-in
- mMask |= mask;
- }
- virtual BOOL tick()
- {
- mFloater->updateFriends(mMask);
-
- mEventTimer.stop();
- mMask = 0;
-
- return FALSE;
- }
-
-protected:
- LLPanelFriends* mFloater;
- U32 mMask;
-};
-
-LLPanelFriends::LLPanelFriends() :
- LLPanel(),
- LLEventTimer(DEFAULT_PERIOD),
- mObserver(NULL),
- mShowMaxSelectWarning(TRUE),
- mAllowRightsChange(TRUE),
- mNumRightsChanged(0)
-{
- mEventTimer.stop();
- mObserver = new LLLocalFriendsObserver(this);
- LLAvatarTracker::instance().addObserver(mObserver);
- // For notification when SIP online status changes.
- LLVoiceClient::getInstance()->addObserver(mObserver);
-}
-
-LLPanelFriends::~LLPanelFriends()
-{
- // For notification when SIP online status changes.
- LLVoiceClient::getInstance()->removeObserver(mObserver);
- LLAvatarTracker::instance().removeObserver(mObserver);
- delete mObserver;
-}
-
-BOOL LLPanelFriends::tick()
-{
- mEventTimer.stop();
- mPeriod = DEFAULT_PERIOD;
- mAllowRightsChange = TRUE;
- updateFriends(LLFriendObserver::ADD);
- return FALSE;
-}
-
-void LLPanelFriends::updateFriends(U32 changed_mask)
-{
- LLUUID selected_id;
- LLCtrlListInterface *friends_list = childGetListInterface("friend_list");
- if (!friends_list) return;
- LLCtrlScrollInterface *friends_scroll = childGetScrollInterface("friend_list");
- if (!friends_scroll) return;
-
- // We kill the selection warning, otherwise we'll spam with warning popups
- // if the maximum amount of friends are selected
- mShowMaxSelectWarning = false;
-
- std::vector<LLUUID> selected_friends = getSelectedIDs();
- if(changed_mask & (LLFriendObserver::ADD | LLFriendObserver::REMOVE | LLFriendObserver::ONLINE))
- {
- refreshNames(changed_mask);
- }
- else if(changed_mask & LLFriendObserver::POWERS)
- {
- --mNumRightsChanged;
- if(mNumRightsChanged > 0)
- {
- mPeriod = RIGHTS_CHANGE_TIMEOUT;
- mEventTimer.start();
- mAllowRightsChange = FALSE;
- }
- else
- {
- tick();
- }
- }
- if(selected_friends.size() > 0)
- {
- // only non-null if friends was already found. This may fail,
- // but we don't really care here, because refreshUI() will
- // clean up the interface.
- friends_list->setCurrentByID(selected_id);
- for(std::vector<LLUUID>::iterator itr = selected_friends.begin(); itr != selected_friends.end(); ++itr)
- {
- friends_list->setSelectedByValue(*itr, true);
- }
- }
-
- refreshUI();
- mShowMaxSelectWarning = true;
-}
-
-// virtual
-BOOL LLPanelFriends::postBuild()
-{
- mFriendsList = getChild<LLScrollListCtrl>("friend_list");
- mFriendsList->setMaxSelectable(MAX_FRIEND_SELECT);
- mFriendsList->setMaximumSelectCallback(boost::bind(&LLPanelFriends::onMaximumSelect));
- mFriendsList->setCommitOnSelectionChange(TRUE);
- mFriendsList->setContextMenu(LLScrollListCtrl::MENU_AVATAR);
- childSetCommitCallback("friend_list", onSelectName, this);
- getChild<LLScrollListCtrl>("friend_list")->setDoubleClickCallback(onClickIM, this);
-
- U32 changed_mask = LLFriendObserver::ADD | LLFriendObserver::REMOVE | LLFriendObserver::ONLINE;
- refreshNames(changed_mask);
-
- childSetAction("im_btn", onClickIM, this);
- childSetAction("profile_btn", onClickProfile, this);
- childSetAction("offer_teleport_btn", onClickOfferTeleport, this);
- childSetAction("pay_btn", onClickPay, this);
- childSetAction("add_btn", onClickAddFriend, this);
- childSetAction("remove_btn", onClickRemove, this);
-
- setDefaultBtn("im_btn");
-
- updateFriends(LLFriendObserver::ADD);
- refreshUI();
-
- // primary sort = online status, secondary sort = name
- mFriendsList->sortByColumn(std::string("friend_name"), TRUE);
- mFriendsList->sortByColumn(std::string("icon_online_status"), FALSE);
-
- return TRUE;
-}
-
-BOOL LLPanelFriends::addFriend(const LLUUID& agent_id)
-{
- LLAvatarTracker& at = LLAvatarTracker::instance();
- const LLRelationship* relationInfo = at.getBuddyInfo(agent_id);
- if(!relationInfo) return FALSE;
-
- bool isOnlineSIP = LLVoiceClient::getInstance()->isOnlineSIP(agent_id);
- bool isOnline = relationInfo->isOnline();
-
- std::string fullname;
- BOOL have_name = gCacheName->getFullName(agent_id, fullname);
-
- LLSD element;
- element["id"] = agent_id;
- LLSD& friend_column = element["columns"][LIST_FRIEND_NAME];
- friend_column["column"] = "friend_name";
- friend_column["value"] = fullname;
- friend_column["font"]["name"] = "SANSSERIF";
- friend_column["font"]["style"] = "NORMAL";
-
- LLSD& online_status_column = element["columns"][LIST_ONLINE_STATUS];
- online_status_column["column"] = "icon_online_status";
- online_status_column["type"] = "icon";
-
- if (isOnline)
- {
- friend_column["font"]["style"] = "BOLD";
- online_status_column["value"] = "icon_avatar_online.tga";
- }
- else if(isOnlineSIP)
- {
- friend_column["font"]["style"] = "BOLD";
- online_status_column["value"] = ONLINE_SIP_ICON_NAME;
- }
-
- LLSD& online_column = element["columns"][LIST_VISIBLE_ONLINE];
- online_column["column"] = "icon_visible_online";
- online_column["type"] = "checkbox";
- online_column["value"] = relationInfo->isRightGrantedTo(LLRelationship::GRANT_ONLINE_STATUS);
-
- LLSD& visible_map_column = element["columns"][LIST_VISIBLE_MAP];
- visible_map_column["column"] = "icon_visible_map";
- visible_map_column["type"] = "checkbox";
- visible_map_column["value"] = relationInfo->isRightGrantedTo(LLRelationship::GRANT_MAP_LOCATION);
-
- LLSD& edit_my_object_column = element["columns"][LIST_EDIT_MINE];
- edit_my_object_column["column"] = "icon_edit_mine";
- edit_my_object_column["type"] = "checkbox";
- edit_my_object_column["value"] = relationInfo->isRightGrantedTo(LLRelationship::GRANT_MODIFY_OBJECTS);
-
- LLSD& edit_their_object_column = element["columns"][LIST_EDIT_THEIRS];
- edit_their_object_column["column"] = "icon_edit_theirs";
- edit_their_object_column["type"] = "checkbox";
- edit_their_object_column["enabled"] = "";
- edit_their_object_column["value"] = relationInfo->isRightGrantedFrom(LLRelationship::GRANT_MODIFY_OBJECTS);
-
- LLSD& update_gen_column = element["columns"][LIST_FRIEND_UPDATE_GEN];
- update_gen_column["column"] = "friend_last_update_generation";
- update_gen_column["value"] = have_name ? relationInfo->getChangeSerialNum() : -1;
-
- mFriendsList->addElement(element, ADD_BOTTOM);
- return have_name;
-}
-
-// propagate actual relationship to UI.
-// Does not resort the UI list because it can be called frequently. JC
-BOOL LLPanelFriends::updateFriendItem(const LLUUID& agent_id, const LLRelationship* info)
-{
- if (!info) return FALSE;
- LLScrollListItem* itemp = mFriendsList->getItem(agent_id);
- if (!itemp) return FALSE;
-
- bool isOnlineSIP = LLVoiceClient::getInstance()->isOnlineSIP(itemp->getUUID());
- bool isOnline = info->isOnline();
-
- std::string fullname;
- BOOL have_name = gCacheName->getFullName(agent_id, fullname);
-
- // Name of the status icon to use
- std::string statusIcon;
-
- if(isOnline)
- {
- statusIcon = "icon_avatar_online.tga";
- }
- else if(isOnlineSIP)
- {
- statusIcon = ONLINE_SIP_ICON_NAME;
- }
-
- itemp->getColumn(LIST_ONLINE_STATUS)->setValue(statusIcon);
-
- itemp->getColumn(LIST_FRIEND_NAME)->setValue(fullname);
- // render name of online friends in bold text
- ((LLScrollListText*)itemp->getColumn(LIST_FRIEND_NAME))->setFontStyle((isOnline || isOnlineSIP) ? LLFontGL::BOLD : LLFontGL::NORMAL);
- itemp->getColumn(LIST_VISIBLE_ONLINE)->setValue(info->isRightGrantedTo(LLRelationship::GRANT_ONLINE_STATUS));
- itemp->getColumn(LIST_VISIBLE_MAP)->setValue(info->isRightGrantedTo(LLRelationship::GRANT_MAP_LOCATION));
- itemp->getColumn(LIST_EDIT_MINE)->setValue(info->isRightGrantedTo(LLRelationship::GRANT_MODIFY_OBJECTS));
- S32 change_generation = have_name ? info->getChangeSerialNum() : -1;
- itemp->getColumn(LIST_FRIEND_UPDATE_GEN)->setValue(change_generation);
-
- // enable this item, in case it was disabled after user input
- itemp->setEnabled(TRUE);
-
- // Do not resort, this function can be called frequently.
- return have_name;
-}
-
-void LLPanelFriends::refreshRightsChangeList()
-{
- std::vector<LLUUID> friends = getSelectedIDs();
- S32 num_selected = friends.size();
-
- bool can_offer_teleport = num_selected >= 1;
- bool selected_friends_online = true;
-
- const LLRelationship* friend_status = NULL;
- for(std::vector<LLUUID>::iterator itr = friends.begin(); itr != friends.end(); ++itr)
- {
- friend_status = LLAvatarTracker::instance().getBuddyInfo(*itr);
- if (friend_status)
- {
- if(!friend_status->isOnline())
- {
- can_offer_teleport = false;
- selected_friends_online = false;
- }
- }
- else // missing buddy info, don't allow any operations
- {
- can_offer_teleport = false;
- }
- }
-
- if (num_selected == 0) // nothing selected
- {
- childSetEnabled("im_btn", FALSE);
- childSetEnabled("offer_teleport_btn", FALSE);
- }
- else // we have at least one friend selected...
- {
- // only allow IMs to groups when everyone in the group is online
- // to be consistent with context menus in inventory and because otherwise
- // offline friends would be silently dropped from the session
- childSetEnabled("im_btn", selected_friends_online || num_selected == 1);
- childSetEnabled("offer_teleport_btn", can_offer_teleport);
- }
-}
-
-struct SortFriendsByID
-{
- bool operator() (const LLScrollListItem* const a, const LLScrollListItem* const b) const
- {
- return a->getValue().asUUID() < b->getValue().asUUID();
- }
-};
-
-void LLPanelFriends::refreshNames(U32 changed_mask)
-{
- std::vector<LLUUID> selected_ids = getSelectedIDs();
- S32 pos = mFriendsList->getScrollPos();
-
- // get all buddies we know about
- LLAvatarTracker::buddy_map_t all_buddies;
- LLAvatarTracker::instance().copyBuddyList(all_buddies);
-
- BOOL have_names = TRUE;
-
- if(changed_mask & (LLFriendObserver::ADD | LLFriendObserver::REMOVE))
- {
- have_names &= refreshNamesSync(all_buddies);
- }
-
- if(changed_mask & LLFriendObserver::ONLINE)
- {
- have_names &= refreshNamesPresence(all_buddies);
- }
-
- if (!have_names)
- {
- mEventTimer.start();
- }
- // Changed item in place, need to request sort and update columns
- // because we might have changed data in a column on which the user
- // has already sorted. JC
- mFriendsList->updateSort();
-
- // re-select items
- mFriendsList->selectMultiple(selected_ids);
- mFriendsList->setScrollPos(pos);
-}
-
-BOOL LLPanelFriends::refreshNamesSync(const LLAvatarTracker::buddy_map_t & all_buddies)
-{
- mFriendsList->deleteAllItems();
-
- BOOL have_names = TRUE;
- LLAvatarTracker::buddy_map_t::const_iterator buddy_it = all_buddies.begin();
-
- for(; buddy_it != all_buddies.end(); ++buddy_it)
- {
- have_names &= addFriend(buddy_it->first);
- }
-
- return have_names;
-}
-
-BOOL LLPanelFriends::refreshNamesPresence(const LLAvatarTracker::buddy_map_t & all_buddies)
-{
- std::vector<LLScrollListItem*> items = mFriendsList->getAllData();
- std::sort(items.begin(), items.end(), SortFriendsByID());
-
- LLAvatarTracker::buddy_map_t::const_iterator buddy_it = all_buddies.begin();
- std::vector<LLScrollListItem*>::const_iterator item_it = items.begin();
- BOOL have_names = TRUE;
-
- while(true)
- {
- if(item_it == items.end() || buddy_it == all_buddies.end())
- {
- break;
- }
-
- const LLUUID & buddy_uuid = buddy_it->first;
- const LLUUID & item_uuid = (*item_it)->getValue().asUUID();
- if(item_uuid == buddy_uuid)
- {
- const LLRelationship* info = buddy_it->second;
- if (!info)
- {
- ++item_it;
- continue;
- }
-
- S32 last_change_generation = (*item_it)->getColumn(LIST_FRIEND_UPDATE_GEN)->getValue().asInteger();
- if (last_change_generation < info->getChangeSerialNum())
- {
- // update existing item in UI
- have_names &= updateFriendItem(buddy_it->first, info);
- }
-
- ++buddy_it;
- ++item_it;
- }
- else if(item_uuid < buddy_uuid)
- {
- ++item_it;
- }
- else //if(item_uuid > buddy_uuid)
- {
- ++buddy_it;
- }
- }
-
- return have_names;
-}
-
-void LLPanelFriends::refreshUI()
-{
- BOOL single_selected = FALSE;
- BOOL multiple_selected = FALSE;
- int num_selected = mFriendsList->getAllSelected().size();
- if(num_selected > 0)
- {
- single_selected = TRUE;
- if(num_selected > 1)
- {
- multiple_selected = TRUE;
- }
- }
-
-
- //Options that can only be performed with one friend selected
- childSetEnabled("profile_btn", single_selected && !multiple_selected);
- childSetEnabled("pay_btn", single_selected && !multiple_selected);
-
- //Options that can be performed with up to MAX_FRIEND_SELECT friends selected
- //(single_selected will always be true in this situations)
- childSetEnabled("remove_btn", single_selected);
- childSetEnabled("im_btn", single_selected);
-// childSetEnabled("friend_rights", single_selected);
-
- refreshRightsChangeList();
-}
-
-std::vector<LLUUID> LLPanelFriends::getSelectedIDs()
-{
- LLUUID selected_id;
- std::vector<LLUUID> friend_ids;
- std::vector<LLScrollListItem*> selected = mFriendsList->getAllSelected();
- for(std::vector<LLScrollListItem*>::iterator itr = selected.begin(); itr != selected.end(); ++itr)
- {
- friend_ids.push_back((*itr)->getUUID());
- }
- return friend_ids;
-}
-
-// static
-void LLPanelFriends::onSelectName(LLUICtrl* ctrl, void* user_data)
-{
- LLPanelFriends* panelp = (LLPanelFriends*)user_data;
-
- if(panelp)
- {
- panelp->refreshUI();
- // check to see if rights have changed
- panelp->applyRightsToFriends();
- }
-}
-
-//static
-void LLPanelFriends::onMaximumSelect()
-{
- LLSD args;
- args["MAX_SELECT"] = llformat("%d", MAX_FRIEND_SELECT);
- LLNotificationsUtil::add("MaxListSelectMessage", args);
-};
-
-// static
-void LLPanelFriends::onClickProfile(void* user_data)
-{
- LLPanelFriends* panelp = (LLPanelFriends*)user_data;
-
- std::vector<LLUUID> ids = panelp->getSelectedIDs();
- if(ids.size() > 0)
- {
- LLUUID agent_id = ids[0];
- LLAvatarActions::showProfile(agent_id);
- }
-}
-
-// static
-void LLPanelFriends::onClickIM(void* user_data)
-{
- LLPanelFriends* panelp = (LLPanelFriends*)user_data;
-
- std::vector<LLUUID> ids = panelp->getSelectedIDs();
- if(ids.size() > 0)
- {
- if(ids.size() == 1)
- {
- LLAvatarActions::startIM(ids[0]);
- }
- else
- {
- LLAvatarActions::startConference(ids);
- }
- }
-}
-
-// static
-void LLPanelFriends::onPickAvatar(const std::vector<std::string>& names,
- const std::vector<LLUUID>& ids)
-{
- if (names.empty()) return;
- if (ids.empty()) return;
- LLAvatarActions::requestFriendshipDialog(ids[0], names[0]);
-}
-
-// static
-void LLPanelFriends::onClickAddFriend(void* user_data)
-{
- LLPanelFriends* panelp = (LLPanelFriends*)user_data;
- LLFloater* root_floater = gFloaterView->getParentFloater(panelp);
- LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(boost::bind(&LLPanelFriends::onPickAvatar, _1,_2), FALSE, TRUE);
- if (root_floater)
- {
- root_floater->addDependentFloater(picker);
- }
-}
-
-// static
-void LLPanelFriends::onClickRemove(void* user_data)
-{
- LLPanelFriends* panelp = (LLPanelFriends*)user_data;
- LLAvatarActions::removeFriendsDialog(panelp->getSelectedIDs());
-}
-
-// static
-void LLPanelFriends::onClickOfferTeleport(void* user_data)
-{
- LLPanelFriends* panelp = (LLPanelFriends*)user_data;
- LLAvatarActions::offerTeleport(panelp->getSelectedIDs());
-}
-
-// static
-void LLPanelFriends::onClickPay(void* user_data)
-{
- LLPanelFriends* panelp = (LLPanelFriends*)user_data;
-
- std::vector<LLUUID> ids = panelp->getSelectedIDs();
- if(ids.size() == 1)
- {
- LLAvatarActions::pay(ids[0]);
- }
-}
-
-void LLPanelFriends::confirmModifyRights(rights_map_t& ids, EGrantRevoke command)
-{
- if (ids.empty()) return;
-
- LLSD args;
- if(ids.size() > 0)
- {
- rights_map_t* rights = new rights_map_t(ids);
-
- // for single friend, show their name
- if(ids.size() == 1)
- {
- LLUUID agent_id = ids.begin()->first;
- std::string first, last;
- if(gCacheName->getName(agent_id, first, last))
- {
- args["FIRST_NAME"] = first;
- args["LAST_NAME"] = last;
- }
- if (command == GRANT)
- {
- LLNotificationsUtil::add("GrantModifyRights",
- args,
- LLSD(),
- boost::bind(&LLPanelFriends::modifyRightsConfirmation, this, _1, _2, rights));
- }
- else
- {
- LLNotificationsUtil::add("RevokeModifyRights",
- args,
- LLSD(),
- boost::bind(&LLPanelFriends::modifyRightsConfirmation, this, _1, _2, rights));
- }
- }
- else
- {
- if (command == GRANT)
- {
- LLNotificationsUtil::add("GrantModifyRightsMultiple",
- args,
- LLSD(),
- boost::bind(&LLPanelFriends::modifyRightsConfirmation, this, _1, _2, rights));
- }
- else
- {
- LLNotificationsUtil::add("RevokeModifyRightsMultiple",
- args,
- LLSD(),
- boost::bind(&LLPanelFriends::modifyRightsConfirmation, this, _1, _2, rights));
- }
- }
- }
-}
-
-bool LLPanelFriends::modifyRightsConfirmation(const LLSD& notification, const LLSD& response, rights_map_t* rights)
-{
- S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
- if(0 == option)
- {
- sendRightsGrant(*rights);
- }
- else
- {
- // need to resync view with model, since user cancelled operation
- rights_map_t::iterator rights_it;
- for (rights_it = rights->begin(); rights_it != rights->end(); ++rights_it)
- {
- const LLRelationship* info = LLAvatarTracker::instance().getBuddyInfo(rights_it->first);
- updateFriendItem(rights_it->first, info);
- }
- }
- refreshUI();
-
- delete rights;
- return false;
-}
-
-void LLPanelFriends::applyRightsToFriends()
-{
- BOOL rights_changed = FALSE;
-
- // store modify rights separately for confirmation
- rights_map_t rights_updates;
-
- BOOL need_confirmation = FALSE;
- EGrantRevoke confirmation_type = GRANT;
-
- // this assumes that changes only happened to selected items
- std::vector<LLScrollListItem*> selected = mFriendsList->getAllSelected();
- for(std::vector<LLScrollListItem*>::iterator itr = selected.begin(); itr != selected.end(); ++itr)
- {
- LLUUID id = (*itr)->getValue();
- const LLRelationship* buddy_relationship = LLAvatarTracker::instance().getBuddyInfo(id);
- if (buddy_relationship == NULL) continue;
-
- bool show_online_staus = (*itr)->getColumn(LIST_VISIBLE_ONLINE)->getValue().asBoolean();
- bool show_map_location = (*itr)->getColumn(LIST_VISIBLE_MAP)->getValue().asBoolean();
- bool allow_modify_objects = (*itr)->getColumn(LIST_EDIT_MINE)->getValue().asBoolean();
-
- S32 rights = buddy_relationship->getRightsGrantedTo();
- if(buddy_relationship->isRightGrantedTo(LLRelationship::GRANT_ONLINE_STATUS) != show_online_staus)
- {
- rights_changed = TRUE;
- if(show_online_staus)
- {
- rights |= LLRelationship::GRANT_ONLINE_STATUS;
- }
- else
- {
- // ONLINE_STATUS necessary for MAP_LOCATION
- rights &= ~LLRelationship::GRANT_ONLINE_STATUS;
- rights &= ~LLRelationship::GRANT_MAP_LOCATION;
- // propagate rights constraint to UI
- (*itr)->getColumn(LIST_VISIBLE_MAP)->setValue(FALSE);
- }
- }
- if(buddy_relationship->isRightGrantedTo(LLRelationship::GRANT_MAP_LOCATION) != show_map_location)
- {
- rights_changed = TRUE;
- if(show_map_location)
- {
- // ONLINE_STATUS necessary for MAP_LOCATION
- rights |= LLRelationship::GRANT_MAP_LOCATION;
- rights |= LLRelationship::GRANT_ONLINE_STATUS;
- (*itr)->getColumn(LIST_VISIBLE_ONLINE)->setValue(TRUE);
- }
- else
- {
- rights &= ~LLRelationship::GRANT_MAP_LOCATION;
- }
- }
-
- // now check for change in modify object rights, which requires confirmation
- if(buddy_relationship->isRightGrantedTo(LLRelationship::GRANT_MODIFY_OBJECTS) != allow_modify_objects)
- {
- rights_changed = TRUE;
- need_confirmation = TRUE;
-
- if(allow_modify_objects)
- {
- rights |= LLRelationship::GRANT_MODIFY_OBJECTS;
- confirmation_type = GRANT;
- }
- else
- {
- rights &= ~LLRelationship::GRANT_MODIFY_OBJECTS;
- confirmation_type = REVOKE;
- }
- }
-
- if (rights_changed)
- {
- rights_updates.insert(std::make_pair(id, rights));
- // disable these ui elements until response from server
- // to avoid race conditions
- (*itr)->setEnabled(FALSE);
- }
- }
-
- // separately confirm grant and revoke of modify rights
- if (need_confirmation)
- {
- confirmModifyRights(rights_updates, confirmation_type);
- }
- else
- {
- sendRightsGrant(rights_updates);
- }
-}
-
-void LLPanelFriends::sendRightsGrant(rights_map_t& ids)
-{
- if (ids.empty()) return;
-
- LLMessageSystem* msg = gMessageSystem;
-
- // setup message header
- msg->newMessageFast(_PREHASH_GrantUserRights);
- msg->nextBlockFast(_PREHASH_AgentData);
- msg->addUUID(_PREHASH_AgentID, gAgent.getID());
- msg->addUUID(_PREHASH_SessionID, gAgent.getSessionID());
-
- rights_map_t::iterator id_it;
- rights_map_t::iterator end_it = ids.end();
- for(id_it = ids.begin(); id_it != end_it; ++id_it)
- {
- msg->nextBlockFast(_PREHASH_Rights);
- msg->addUUID(_PREHASH_AgentRelated, id_it->first);
- msg->addS32(_PREHASH_RelatedRights, id_it->second);
- }
-
- mNumRightsChanged = ids.size();
- gAgent.sendReliableMessage();
-}
diff --git a/indra/newview/llfloaterfriends.h b/indra/newview/llfloaterfriends.h
deleted file mode 100644
index a303477c95..0000000000
--- a/indra/newview/llfloaterfriends.h
+++ /dev/null
@@ -1,140 +0,0 @@
-/**
- * @file llfloaterfriends.h
- * @author Phoenix
- * @date 2005-01-13
- * @brief Declaration of class for displaying the local agent's friends.
- *
- * $LicenseInfo:firstyear=2005&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLFLOATERFRIENDS_H
-#define LL_LLFLOATERFRIENDS_H
-
-#include "llpanel.h"
-#include "llstring.h"
-#include "lluuid.h"
-#include "lltimer.h"
-#include "llcallingcard.h"
-
-class LLFriendObserver;
-class LLRelationship;
-class LLScrollListItem;
-class LLScrollListCtrl;
-
-/**
- * @class LLPanelFriends
- * @brief An instance of this class is used for displaying your friends
- * and gives you quick access to all agents which a user relationship.
- *
- * @sa LLFloater
- */
-class LLPanelFriends : public LLPanel, public LLEventTimer
-{
-public:
- LLPanelFriends();
- virtual ~LLPanelFriends();
-
- /**
- * @brief This method either creates or brings to the front the
- * current instantiation of this floater. There is only once since
- * you can currently only look at your local friends.
- */
- virtual BOOL tick();
-
- /**
- * @brief This method is called in response to the LLAvatarTracker
- * sending out a changed() message.
- */
- void updateFriends(U32 changed_mask);
-
- virtual BOOL postBuild();
-
- // *HACK Made public to remove friends from LLAvatarIconCtrl context menu
- static bool handleRemove(const LLSD& notification, const LLSD& response);
-
-private:
-
- enum FRIENDS_COLUMN_ORDER
- {
- LIST_ONLINE_STATUS,
- LIST_FRIEND_NAME,
- LIST_VISIBLE_ONLINE,
- LIST_VISIBLE_MAP,
- LIST_EDIT_MINE,
- LIST_EDIT_THEIRS,
- LIST_FRIEND_UPDATE_GEN
- };
-
- // protected members
- typedef std::map<LLUUID, S32> rights_map_t;
- void refreshNames(U32 changed_mask);
- BOOL refreshNamesSync(const LLAvatarTracker::buddy_map_t & all_buddies);
- BOOL refreshNamesPresence(const LLAvatarTracker::buddy_map_t & all_buddies);
- void refreshUI();
- void refreshRightsChangeList();
- void applyRightsToFriends();
- BOOL addFriend(const LLUUID& agent_id);
- BOOL updateFriendItem(const LLUUID& agent_id, const LLRelationship* relationship);
-
- typedef enum
- {
- GRANT,
- REVOKE
- } EGrantRevoke;
- void confirmModifyRights(rights_map_t& ids, EGrantRevoke command);
- void sendRightsGrant(rights_map_t& ids);
-
- // return empty vector if nothing is selected
- std::vector<LLUUID> getSelectedIDs();
-
- // callback methods
- static void onSelectName(LLUICtrl* ctrl, void* user_data);
- static bool callbackAddFriend(const LLSD& notification, const LLSD& response);
- static bool callbackAddFriendWithMessage(const LLSD& notification, const LLSD& response);
- static void onPickAvatar(const std::vector<std::string>& names, const std::vector<LLUUID>& ids);
- static void onMaximumSelect();
-
- static void onClickIM(void* user_data);
- static void onClickProfile(void* user_data);
- static void onClickAddFriend(void* user_data);
- static void onClickRemove(void* user_data);
-
- static void onClickOfferTeleport(void* user_data);
- static void onClickPay(void* user_data);
-
- static void onClickModifyStatus(LLUICtrl* ctrl, void* user_data);
-
- bool modifyRightsConfirmation(const LLSD& notification, const LLSD& response, rights_map_t* rights);
-
-private:
- // member data
- LLFriendObserver* mObserver;
- LLUUID mAddFriendID;
- std::string mAddFriendName;
- LLScrollListCtrl* mFriendsList;
- BOOL mShowMaxSelectWarning;
- BOOL mAllowRightsChange;
- S32 mNumRightsChanged;
-};
-
-
-#endif // LL_LLFLOATERFRIENDS_H
diff --git a/indra/newview/llfloatergesture.cpp b/indra/newview/llfloatergesture.cpp
index ef3c8b764e..56051ff684 100644
--- a/indra/newview/llfloatergesture.cpp
+++ b/indra/newview/llfloatergesture.cpp
@@ -32,7 +32,7 @@
#include "llinventorybridge.h"
#include "llinventoryfunctions.h"
#include "llinventorymodel.h"
-#include "llinventoryclipboard.h"
+#include "llclipboard.h"
#include "llagent.h"
#include "llappearancemgr.h"
@@ -90,6 +90,12 @@ public:
if(mFloater)
{
mFloater->addGesture(inv_item,NULL,mFloater->getChild<LLScrollListCtrl>("gesture_list"));
+
+ // EXP-1909 (Pasted gesture displayed twice)
+ // The problem is that addGesture is called here for the second time for the same item (which is copied)
+ // First time addGesture is called from LLFloaterGestureObserver::changed(), which is a callback for inventory
+ // change. So we need to refresh the gesture list to avoid duplicates.
+ mFloater->refreshAll();
}
}
};
@@ -365,6 +371,8 @@ void LLFloaterGesture::addGesture(const LLUUID& item_id , LLMultiGesture* gestur
element["columns"][3]["font"]["style"] = font_style;
}
+ LL_DEBUGS("Gesture") << "Added gesture [" << item_name << "]" << LL_ENDL;
+
LLScrollListItem* sl_item = list->addElement(element, ADD_BOTTOM);
if(sl_item)
{
@@ -389,11 +397,11 @@ bool LLFloaterGesture::isActionEnabled(const LLSD& command)
std::string command_name = command.asString();
if("paste" == command_name)
{
- if(!LLInventoryClipboard::instance().hasContents())
+ if(!LLClipboard::instance().hasContents())
return false;
LLDynamicArray<LLUUID> ids;
- LLInventoryClipboard::instance().retrieve(ids);
+ LLClipboard::instance().pasteFromClipboard(ids);
for(LLDynamicArray<LLUUID>::iterator it = ids.begin(); it != ids.end(); it++)
{
LLInventoryItem* item = gInventory.getItem(*it);
@@ -488,27 +496,26 @@ void LLFloaterGesture::onActivateBtnClick()
void LLFloaterGesture::onCopyPasteAction(const LLSD& command)
{
std::string command_name = command.asString();
- // since we select this comman inventory item had already arrived .
+ // Since we select this command, the inventory items must have already arrived
if("copy_gesture" == command_name)
{
uuid_vec_t ids;
getSelectedIds(ids);
- // make sure that clopboard is empty
- LLInventoryClipboard::instance().reset();
+ // Make sure the clipboard is empty
+ LLClipboard::instance().reset();
for(uuid_vec_t::iterator it = ids.begin(); it != ids.end(); it++)
{
LLInventoryItem* item = gInventory.getItem(*it);
if(item && item->getInventoryType() == LLInventoryType::IT_GESTURE)
{
- LLInventoryClipboard::instance().add(item->getUUID());
+ LLClipboard::instance().addToClipboard(item->getUUID(),LLAssetType::AT_GESTURE);
}
}
}
else if ("paste" == command_name)
{
- LLInventoryClipboard& clipbord = LLInventoryClipboard::instance();
LLDynamicArray<LLUUID> ids;
- clipbord.retrieve(ids);
+ LLClipboard::instance().pasteFromClipboard(ids);
if(ids.empty() || !gInventory.isCategoryComplete(mGestureFolderID))
return;
LLInventoryCategory* gesture_dir = gInventory.getCategory(mGestureFolderID);
@@ -528,11 +535,11 @@ void LLFloaterGesture::onCopyPasteAction(const LLSD& command)
gesture_dir->getUUID(), getString("copy_name", string_args), cb);
}
}
- clipbord.reset();
+ LLClipboard::instance().reset();
}
else if ("copy_uuid" == command_name)
{
- gClipboard.copyFromString(utf8str_to_wstring(mGestureList->getCurrentID().asString()), mGestureList->getCurrentID());
+ LLClipboard::instance().copyToClipboard(mGestureList->getCurrentID(),LLAssetType::AT_GESTURE);
}
}
diff --git a/indra/newview/llfloatergodtools.cpp b/indra/newview/llfloatergodtools.cpp
index a34e0353ec..fb905eae11 100644
--- a/indra/newview/llfloatergodtools.cpp
+++ b/indra/newview/llfloatergodtools.cpp
@@ -1123,8 +1123,12 @@ bool LLPanelObjectTools::callbackSimWideDeletes( const LLSD& notification, const
void LLPanelObjectTools::onClickSet()
{
+ LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(boost::bind(&LLPanelObjectTools::callbackAvatarID, this, _1,_2));
// grandparent is a floater, which can have a dependent
- gFloaterView->getParentFloater(this)->addDependentFloater(LLFloaterAvatarPicker::show(boost::bind(&LLPanelObjectTools::callbackAvatarID, this, _1,_2)));
+ if (picker)
+ {
+ gFloaterView->getParentFloater(this)->addDependentFloater(picker);
+ }
}
void LLPanelObjectTools::onClickSetBySelection(void* data)
diff --git a/indra/newview/llfloaterhardwaresettings.cpp b/indra/newview/llfloaterhardwaresettings.cpp
index 1e91710552..f9a403cf9f 100644
--- a/indra/newview/llfloaterhardwaresettings.cpp
+++ b/indra/newview/llfloaterhardwaresettings.cpp
@@ -34,7 +34,9 @@
#include "llviewercontrol.h"
#include "llviewertexturelist.h"
#include "llfeaturemanager.h"
+#include "llspinctrl.h"
#include "llstartup.h"
+#include "lltextbox.h"
#include "pipeline.h"
// Linden library includes
@@ -50,7 +52,6 @@ LLFloaterHardwareSettings::LLFloaterHardwareSettings(const LLSD& key)
// but init them anyway
mUseVBO(0),
mUseAniso(0),
- mUseFBO(0),
mFSAASamples(0),
mGamma(0.0),
mVideoCardMem(0),
@@ -75,7 +76,6 @@ void LLFloaterHardwareSettings::refresh()
mUseVBO = gSavedSettings.getBOOL("RenderVBOEnable");
mUseAniso = gSavedSettings.getBOOL("RenderAnisotropic");
- mUseFBO = gSavedSettings.getBOOL("RenderUseFBO");
mFSAASamples = gSavedSettings.getU32("RenderFSAASamples");
mGamma = gSavedSettings.getF32("RenderGamma");
mVideoCardMem = gSavedSettings.getS32("TextureMemory");
@@ -100,18 +100,40 @@ void LLFloaterHardwareSettings::refreshEnabledState()
}
// if no windlight shaders, turn off nighttime brightness, gamma, and fog distance
- getChildView("gamma")->setEnabled(!gPipeline.canUseWindLightShaders());
+ LLSpinCtrl* gamma_ctrl = getChild<LLSpinCtrl>("gamma");
+ gamma_ctrl->setEnabled(!gPipeline.canUseWindLightShaders());
getChildView("(brightness, lower is brighter)")->setEnabled(!gPipeline.canUseWindLightShaders());
getChildView("fog")->setEnabled(!gPipeline.canUseWindLightShaders());
- getChildView("fsaa")->setEnabled(gPipeline.canUseAntiAliasing());
- getChildView("antialiasing restart")->setVisible(!gSavedSettings.getBOOL("RenderUseFBO"));
- /* Enable to reset fsaa value to disabled when feature is not available.
- if (!gPipeline.canUseAntiAliasing())
+ // anti-aliasing
{
- getChild<LLUICtrl>("fsaa")->setValue((LLSD::Integer) 0);
+ LLUICtrl* fsaa_ctrl = getChild<LLUICtrl>("fsaa");
+ LLTextBox* fsaa_text = getChild<LLTextBox>("antialiasing label");
+ LLView* fsaa_restart = getChildView("antialiasing restart");
+
+ // Enable or disable the control, the "Antialiasing:" label and the restart warning
+ // based on code support for the feature on the current hardware.
+
+ if (gPipeline.canUseAntiAliasing())
+ {
+ fsaa_ctrl->setEnabled(TRUE);
+
+ // borrow the text color from the gamma control for consistency
+ fsaa_text->setColor(gamma_ctrl->getEnabledTextColor());
+
+ fsaa_restart->setVisible(!gSavedSettings.getBOOL("RenderDeferred"));
+ }
+ else
+ {
+ fsaa_ctrl->setEnabled(FALSE);
+ fsaa_ctrl->setValue((LLSD::Integer) 0);
+
+ // borrow the text color from the gamma control for consistency
+ fsaa_text->setColor(gamma_ctrl->getDisabledTextColor());
+
+ fsaa_restart->setVisible(FALSE);
+ }
}
- */
}
//============================================================================
@@ -139,7 +161,6 @@ void LLFloaterHardwareSettings::cancel()
{
gSavedSettings.setBOOL("RenderVBOEnable", mUseVBO);
gSavedSettings.setBOOL("RenderAnisotropic", mUseAniso);
- gSavedSettings.setBOOL("RenderUseFBO", mUseFBO);
gSavedSettings.setU32("RenderFSAASamples", mFSAASamples);
gSavedSettings.setF32("RenderGamma", mGamma);
gSavedSettings.setS32("TextureMemory", mVideoCardMem);
diff --git a/indra/newview/llfloaterhelpbrowser.cpp b/indra/newview/llfloaterhelpbrowser.cpp
index cec98e9992..fd9c37ae73 100644
--- a/indra/newview/llfloaterhelpbrowser.cpp
+++ b/indra/newview/llfloaterhelpbrowser.cpp
@@ -39,6 +39,7 @@
#include "llurlhistory.h"
#include "llmediactrl.h"
#include "llviewermedia.h"
+#include "llviewerhelp.h"
LLFloaterHelpBrowser::LLFloaterHelpBrowser(const LLSD& key)
@@ -50,6 +51,7 @@ BOOL LLFloaterHelpBrowser::postBuild()
{
mBrowser = getChild<LLMediaCtrl>("browser");
mBrowser->addObserver(this);
+ mBrowser->setErrorPageURL(gSavedSettings.getString("GenericErrorPageURL"));
childSetAction("open_browser", onClickOpenWebBrowser, this);
@@ -70,9 +72,29 @@ void LLFloaterHelpBrowser::buildURLHistory()
}
}
+void LLFloaterHelpBrowser::onOpen(const LLSD& key)
+{
+ gSavedSettings.setBOOL("HelpFloaterOpen", TRUE);
+
+ std::string topic = key.asString();
+
+ if (topic == "__local")
+ {
+ mBrowser->navigateToLocalPage( "help-offline" , "index.html" );
+ }
+ else
+ {
+ mBrowser->navigateTo(LLViewerHelp::instance().getURL(topic));
+ }
+}
+
//virtual
void LLFloaterHelpBrowser::onClose(bool app_quitting)
{
+ if (!app_quitting)
+ {
+ gSavedSettings.setBOOL("HelpFloaterOpen", FALSE);
+ }
// really really destroy the help browser when it's closed, it'll be recreated.
destroy(); // really destroy this dialog on closure, it's relatively heavyweight.
}
@@ -132,13 +154,9 @@ void LLFloaterHelpBrowser::onClickOpenWebBrowser(void* user_data)
void LLFloaterHelpBrowser::openMedia(const std::string& media_url)
{
- mBrowser->setHomePageUrl(media_url);
- //mBrowser->navigateTo("data:text/html;charset=utf-8,I'd really love to be going to:<br><b>" + media_url + "</b>"); // tofu HACK for debugging =:)
- mBrowser->navigateTo(media_url);
+ // explicitly make the media mime type for this floater since it will
+ // only ever display one type of content (Web).
+ mBrowser->setHomePageUrl(media_url, "text/html");
+ mBrowser->navigateTo(media_url, "text/html");
setCurrentURL(media_url);
}
-
-void LLFloaterHelpBrowser::navigateToLocalPage( const std::string& subdir, const std::string& filename_in )
-{
- mBrowser->navigateToLocalPage(subdir, filename_in);
-}
diff --git a/indra/newview/llfloaterhelpbrowser.h b/indra/newview/llfloaterhelpbrowser.h
index 2731c81b9c..bf4f544a14 100644
--- a/indra/newview/llfloaterhelpbrowser.h
+++ b/indra/newview/llfloaterhelpbrowser.h
@@ -1,5 +1,5 @@
/**
- * @file llfloatermediabrowser.h
+ * @file llfloaterhelpbrowser.h
* @brief HTML Help floater - uses embedded web browser control
*
* $LicenseInfo:firstyear=2006&license=viewerlgpl$
@@ -42,13 +42,12 @@ class LLFloaterHelpBrowser :
/*virtual*/ BOOL postBuild();
/*virtual*/ void onClose(bool app_quitting);
+ /*virtual*/ void onOpen(const LLSD& key);
// inherited from LLViewerMediaObserver
/*virtual*/ void handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event);
void openMedia(const std::string& media_url);
-
- void navigateToLocalPage( const std::string& subdir, const std::string& filename_in );
private:
void buildURLHistory();
diff --git a/indra/newview/llfloaterhud.cpp b/indra/newview/llfloaterhud.cpp
index 4181d1906e..58c76a0b85 100644
--- a/indra/newview/llfloaterhud.cpp
+++ b/indra/newview/llfloaterhud.cpp
@@ -54,14 +54,6 @@ LLFloaterHUD::LLFloaterHUD(const LLSD& key)
return;
}
- // Don't grab the focus as it will impede performing in-world actions
- // while using the HUD
- setIsChrome(TRUE);
-
- // Chrome doesn't show the window title by default, but here we
- // want to show it.
- setTitleVisible(true);
-
// Opaque background since we never get the focus
setBackgroundOpaque(TRUE);
}
diff --git a/indra/newview/llfloaterimagepreview.cpp b/indra/newview/llfloaterimagepreview.cpp
index c7fbdd5745..92ee8ddac6 100644
--- a/indra/newview/llfloaterimagepreview.cpp
+++ b/indra/newview/llfloaterimagepreview.cpp
@@ -50,6 +50,7 @@
#include "llvoavatar.h"
#include "pipeline.h"
#include "lluictrlfactory.h"
+#include "llviewershadermgr.h"
#include "llviewertexturelist.h"
#include "llstring.h"
@@ -62,8 +63,9 @@
const S32 PREVIEW_BORDER_WIDTH = 2;
const S32 PREVIEW_RESIZE_HANDLE_SIZE = S32(RESIZE_HANDLE_WIDTH * OO_SQRT2) + PREVIEW_BORDER_WIDTH;
const S32 PREVIEW_HPAD = PREVIEW_RESIZE_HANDLE_SIZE;
+const S32 PREVIEW_VPAD = -24; // yuk, hard coded
const S32 PREF_BUTTON_HEIGHT = 16 + 7 + 16;
-const S32 PREVIEW_TEXTURE_HEIGHT = 300;
+const S32 PREVIEW_TEXTURE_HEIGHT = 320;
//-----------------------------------------------------------------------------
// LLFloaterImagePreview()
@@ -98,7 +100,7 @@ BOOL LLFloaterImagePreview::postBuild()
childSetCommitCallback("clothing_type_combo", onPreviewTypeCommit, this);
mPreviewRect.set(PREVIEW_HPAD,
- PREVIEW_TEXTURE_HEIGHT,
+ PREVIEW_TEXTURE_HEIGHT + PREVIEW_VPAD,
getRect().getWidth() - PREVIEW_HPAD,
PREVIEW_HPAD + PREF_BUTTON_HEIGHT + PREVIEW_HPAD);
mPreviewImageRect.set(0.f, 1.f, 1.f, 0.f);
@@ -270,13 +272,13 @@ void LLFloaterImagePreview::draw()
gGL.begin( LLRender::QUADS );
{
gGL.texCoord2f(mPreviewImageRect.mLeft, mPreviewImageRect.mTop);
- gGL.vertex2i(PREVIEW_HPAD, PREVIEW_TEXTURE_HEIGHT);
+ gGL.vertex2i(PREVIEW_HPAD, PREVIEW_TEXTURE_HEIGHT + PREVIEW_VPAD);
gGL.texCoord2f(mPreviewImageRect.mLeft, mPreviewImageRect.mBottom);
gGL.vertex2i(PREVIEW_HPAD, PREVIEW_HPAD + PREF_BUTTON_HEIGHT + PREVIEW_HPAD);
gGL.texCoord2f(mPreviewImageRect.mRight, mPreviewImageRect.mBottom);
gGL.vertex2i(r.getWidth() - PREVIEW_HPAD, PREVIEW_HPAD + PREF_BUTTON_HEIGHT + PREVIEW_HPAD);
gGL.texCoord2f(mPreviewImageRect.mRight, mPreviewImageRect.mTop);
- gGL.vertex2i(r.getWidth() - PREVIEW_HPAD, PREVIEW_TEXTURE_HEIGHT);
+ gGL.vertex2i(r.getWidth() - PREVIEW_HPAD, PREVIEW_TEXTURE_HEIGHT + PREVIEW_VPAD);
}
gGL.end();
@@ -302,13 +304,13 @@ void LLFloaterImagePreview::draw()
gGL.begin( LLRender::QUADS );
{
gGL.texCoord2f(0.f, 1.f);
- gGL.vertex2i(PREVIEW_HPAD, PREVIEW_TEXTURE_HEIGHT);
+ gGL.vertex2i(PREVIEW_HPAD, PREVIEW_TEXTURE_HEIGHT + PREVIEW_VPAD);
gGL.texCoord2f(0.f, 0.f);
gGL.vertex2i(PREVIEW_HPAD, PREVIEW_HPAD + PREF_BUTTON_HEIGHT + PREVIEW_HPAD);
gGL.texCoord2f(1.f, 0.f);
gGL.vertex2i(r.getWidth() - PREVIEW_HPAD, PREVIEW_HPAD + PREF_BUTTON_HEIGHT + PREVIEW_HPAD);
gGL.texCoord2f(1.f, 1.f);
- gGL.vertex2i(r.getWidth() - PREVIEW_HPAD, PREVIEW_TEXTURE_HEIGHT);
+ gGL.vertex2i(r.getWidth() - PREVIEW_HPAD, PREVIEW_TEXTURE_HEIGHT + PREVIEW_VPAD);
}
gGL.end();
@@ -325,122 +327,51 @@ void LLFloaterImagePreview::draw()
bool LLFloaterImagePreview::loadImage(const std::string& src_filename)
{
std::string exten = gDirUtilp->getExtension(src_filename);
-
- U32 codec = IMG_CODEC_INVALID;
- std::string temp_str;
- if( exten == "bmp")
- {
- codec = IMG_CODEC_BMP;
- }
- else if( exten == "tga")
- {
- codec = IMG_CODEC_TGA;
- }
- else if( exten == "jpg" || exten == "jpeg")
- {
- codec = IMG_CODEC_JPEG;
- }
- else if( exten == "png" )
- {
- codec = IMG_CODEC_PNG;
- }
+ U32 codec = LLImageBase::getCodecFromExtension(exten);
LLImageDimensionsInfo image_info;
- if(!image_info.load(src_filename,codec))
+ if (!image_info.load(src_filename,codec))
{
mImageLoadError = image_info.getLastError();
return false;
}
S32 max_width = gSavedSettings.getS32("max_texture_dimension_X");
- S32 max_heigh = gSavedSettings.getS32("max_texture_dimension_Y");
+ S32 max_height = gSavedSettings.getS32("max_texture_dimension_Y");
- if(image_info.getWidth() > max_width|| image_info.getHeight() > max_heigh)
+ if ((image_info.getWidth() > max_width) || (image_info.getHeight() > max_height))
{
LLStringUtil::format_map_t args;
args["WIDTH"] = llformat("%d", max_width);
- args["HEIGHT"] = llformat("%d", max_heigh);
+ args["HEIGHT"] = llformat("%d", max_height);
mImageLoadError = LLTrans::getString("texture_load_dimensions_error", args);
return false;
}
-
+ // Load the image
+ LLPointer<LLImageFormatted> image = LLImageFormatted::createFromType(codec);
+ if (image.isNull())
+ {
+ return false;
+ }
+ if (!image->load(src_filename))
+ {
+ return false;
+ }
+ // Decompress or expand it in a raw image structure
LLPointer<LLImageRaw> raw_image = new LLImageRaw;
-
- switch (codec)
+ if (!image->decode(raw_image, 0.0f))
{
- case IMG_CODEC_BMP:
- {
- LLPointer<LLImageBMP> bmp_image = new LLImageBMP;
-
- if (!bmp_image->load(src_filename))
- {
- return false;
- }
-
- if (!bmp_image->decode(raw_image, 0.0f))
- {
- return false;
- }
- }
- break;
- case IMG_CODEC_TGA:
- {
- LLPointer<LLImageTGA> tga_image = new LLImageTGA;
-
- if (!tga_image->load(src_filename))
- {
- return false;
- }
-
- if (!tga_image->decode(raw_image))
- {
- return false;
- }
-
- if( (tga_image->getComponents() != 3) &&
- (tga_image->getComponents() != 4) )
- {
- tga_image->setLastError( "Image files with less than 3 or more than 4 components are not supported." );
- return false;
- }
- }
- break;
- case IMG_CODEC_JPEG:
- {
- LLPointer<LLImageJPEG> jpeg_image = new LLImageJPEG;
-
- if (!jpeg_image->load(src_filename))
- {
- return false;
- }
-
- if (!jpeg_image->decode(raw_image, 0.0f))
- {
- return false;
- }
- }
- break;
- case IMG_CODEC_PNG:
- {
- LLPointer<LLImagePNG> png_image = new LLImagePNG;
-
- if (!png_image->load(src_filename))
- {
- return false;
- }
-
- if (!png_image->decode(raw_image, 0.0f))
- {
- return false;
- }
- }
- break;
- default:
return false;
}
-
+ // Check the image constraints
+ if ((image->getComponents() != 3) && (image->getComponents() != 4))
+ {
+ image->setLastError("Image files with less than 3 or more than 4 components are not supported.");
+ return false;
+ }
+
raw_image->biasedScaleToPowerOfTwo(1024);
mRawImagep = raw_image;
@@ -720,25 +651,30 @@ BOOL LLImagePreviewAvatar::render()
gGL.pushUIMatrix();
gGL.loadUIIdentity();
- glMatrixMode(GL_PROJECTION);
+ gGL.matrixMode(LLRender::MM_PROJECTION);
gGL.pushMatrix();
- glLoadIdentity();
- glOrtho(0.0f, mFullWidth, 0.0f, mFullHeight, -1.0f, 1.0f);
+ gGL.loadIdentity();
+ gGL.ortho(0.0f, mFullWidth, 0.0f, mFullHeight, -1.0f, 1.0f);
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.pushMatrix();
- glLoadIdentity();
+ gGL.loadIdentity();
LLGLSUIDefault def;
gGL.color4f(0.15f, 0.2f, 0.3f, 1.f);
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gUIProgram.bind();
+ }
+
gl_rect_2d_simple( mFullWidth, mFullHeight );
- glMatrixMode(GL_PROJECTION);
+ gGL.matrixMode(LLRender::MM_PROJECTION);
gGL.popMatrix();
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.popMatrix();
gGL.flush();
@@ -761,8 +697,7 @@ BOOL LLImagePreviewAvatar::render()
LLVertexBuffer::unbind();
avatarp->updateLOD();
-
-
+
if (avatarp->mDrawable.notNull())
{
LLGLDepthTest gls_depth(GL_TRUE, GL_TRUE);
@@ -770,7 +705,7 @@ BOOL LLImagePreviewAvatar::render()
LLGLDisable no_blend(GL_BLEND);
LLDrawPoolAvatar *avatarPoolp = (LLDrawPoolAvatar *)avatarp->mDrawable->getFace(0)->getPool();
-
+ gPipeline.enableLightsPreview();
avatarPoolp->renderAvatars(avatarp); // renders only one avatar
}
@@ -858,27 +793,37 @@ void LLImagePreviewSculpted::setPreviewTarget(LLImageRaw* imagep, F32 distance)
}
const LLVolumeFace &vf = mVolume->getVolumeFace(0);
- U32 num_indices = vf.mIndices.size();
- U32 num_vertices = vf.mVertices.size();
+ U32 num_indices = vf.mNumIndices;
+ U32 num_vertices = vf.mNumVertices;
- mVertexBuffer = new LLVertexBuffer(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL, 0);
+ mVertexBuffer = new LLVertexBuffer(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0, 0);
mVertexBuffer->allocateBuffer(num_vertices, num_indices, TRUE);
LLStrider<LLVector3> vertex_strider;
LLStrider<LLVector3> normal_strider;
+ LLStrider<LLVector2> tc_strider;
LLStrider<U16> index_strider;
mVertexBuffer->getVertexStrider(vertex_strider);
mVertexBuffer->getNormalStrider(normal_strider);
+ mVertexBuffer->getTexCoord0Strider(tc_strider);
mVertexBuffer->getIndexStrider(index_strider);
// build vertices and normals
+ LLStrider<LLVector3> pos;
+ pos = (LLVector3*) vf.mPositions; pos.setStride(16);
+ LLStrider<LLVector3> norm;
+ norm = (LLVector3*) vf.mNormals; norm.setStride(16);
+ LLStrider<LLVector2> tc;
+ tc = (LLVector2*) vf.mTexCoords; tc.setStride(8);
+
for (U32 i = 0; i < num_vertices; i++)
{
- *(vertex_strider++) = vf.mVertices[i].mPosition;
- LLVector3 normal = vf.mVertices[i].mNormal;
+ *(vertex_strider++) = *pos++;
+ LLVector3 normal = *norm++;
normal.normalize();
*(normal_strider++) = normal;
+ *(tc_strider++) = *tc++;
}
// build indices
@@ -895,29 +840,33 @@ void LLImagePreviewSculpted::setPreviewTarget(LLImageRaw* imagep, F32 distance)
BOOL LLImagePreviewSculpted::render()
{
mNeedsUpdate = FALSE;
-
LLGLSUIDefault def;
LLGLDisable no_blend(GL_BLEND);
LLGLEnable cull(GL_CULL_FACE);
LLGLDepthTest depth(GL_TRUE);
- glMatrixMode(GL_PROJECTION);
+ gGL.matrixMode(LLRender::MM_PROJECTION);
gGL.pushMatrix();
- glLoadIdentity();
- glOrtho(0.0f, mFullWidth, 0.0f, mFullHeight, -1.0f, 1.0f);
+ gGL.loadIdentity();
+ gGL.ortho(0.0f, mFullWidth, 0.0f, mFullHeight, -1.0f, 1.0f);
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.pushMatrix();
- glLoadIdentity();
+ gGL.loadIdentity();
gGL.color4f(0.15f, 0.2f, 0.3f, 1.f);
- gl_rect_2d_simple( mFullWidth, mFullHeight );
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gUIProgram.bind();
+ }
- glMatrixMode(GL_PROJECTION);
+ gl_rect_2d_simple( mFullWidth, mFullHeight );
+
+ gGL.matrixMode(LLRender::MM_PROJECTION);
gGL.popMatrix();
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.popMatrix();
glClear(GL_DEPTH_BUFFER_BIT);
@@ -940,20 +889,30 @@ BOOL LLImagePreviewSculpted::render()
LLViewerCamera::getInstance()->setPerspective(FALSE, mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight, FALSE);
const LLVolumeFace &vf = mVolume->getVolumeFace(0);
- U32 num_indices = vf.mIndices.size();
+ U32 num_indices = vf.mNumIndices;
- mVertexBuffer->setBuffer(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL);
-
gPipeline.enableLightsAvatar();
+
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gObjectPreviewProgram.bind();
+ }
gGL.pushMatrix();
const F32 SCALE = 1.25f;
gGL.scalef(SCALE, SCALE, SCALE);
const F32 BRIGHTNESS = 0.9f;
gGL.color3f(BRIGHTNESS, BRIGHTNESS, BRIGHTNESS);
+
+ mVertexBuffer->setBuffer(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0);
mVertexBuffer->draw(LLRender::TRIANGLES, num_indices, 0);
gGL.popMatrix();
-
+
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gObjectPreviewProgram.unbind();
+ }
+
return TRUE;
}
diff --git a/indra/newview/llfloaterinspect.cpp b/indra/newview/llfloaterinspect.cpp
index a09b9ea235..cece8d299c 100644
--- a/indra/newview/llfloaterinspect.cpp
+++ b/indra/newview/llfloaterinspect.cpp
@@ -37,6 +37,7 @@
#include "llselectmgr.h"
#include "lltoolcomp.h"
#include "lltoolmgr.h"
+#include "lltrans.h"
#include "llviewercontrol.h"
#include "llviewerobject.h"
#include "lluictrlfactory.h"
@@ -166,6 +167,15 @@ LLUUID LLFloaterInspect::getSelectedUUID()
return LLUUID::null;
}
+void LLFloaterInspect::onGetAvNameCallback(const LLUUID& idCreator, const LLAvatarName& av_name, void* FloaterPtr)
+{
+ if (FloaterPtr)
+ {
+ LLFloaterInspect* floater = (LLFloaterInspect*)FloaterPtr;
+ floater->dirty();
+ }
+}
+
void LLFloaterInspect::refresh()
{
LLUUID creator_id;
@@ -205,11 +215,32 @@ void LLFloaterInspect::refresh()
substitution["datetime"] = (S32) timestamp;
LLStringUtil::format (timeStr, substitution);
+ const LLUUID& idOwner = obj->mPermissions->getOwner();
+ const LLUUID& idCreator = obj->mPermissions->getCreator();
LLAvatarName av_name;
- LLAvatarNameCache::get(obj->mPermissions->getOwner(), &av_name);
- owner_name = av_name.getCompleteName();
- LLAvatarNameCache::get(obj->mPermissions->getCreator(), &av_name);
- creator_name = av_name.getCompleteName();
+
+ // Only work with the names if we actually get a result
+ // from the name cache. If not, defer setting the
+ // actual name and set a placeholder.
+ if (LLAvatarNameCache::get(idOwner, &av_name))
+ {
+ owner_name = av_name.getCompleteName();
+ }
+ else
+ {
+ owner_name = LLTrans::getString("RetrievingData");
+ LLAvatarNameCache::get(idOwner, boost::bind(&LLFloaterInspect::onGetAvNameCallback, _1, _2, this));
+ }
+
+ if (LLAvatarNameCache::get(idCreator, &av_name))
+ {
+ creator_name = av_name.getCompleteName();
+ }
+ else
+ {
+ creator_name = LLTrans::getString("RetrievingData");
+ LLAvatarNameCache::get(idCreator, boost::bind(&LLFloaterInspect::onGetAvNameCallback, _1, _2, this));
+ }
row["id"] = obj->getObject()->getID();
row["columns"][0]["column"] = "object_name";
diff --git a/indra/newview/llfloaterinspect.h b/indra/newview/llfloaterinspect.h
index d9ffdf114b..7ee83ccdb4 100644
--- a/indra/newview/llfloaterinspect.h
+++ b/indra/newview/llfloaterinspect.h
@@ -29,6 +29,7 @@
#ifndef LL_LLFLOATERINSPECT_H
#define LL_LLFLOATERINSPECT_H
+#include "llavatarname.h"
#include "llfloater.h"
//class LLTool;
@@ -53,6 +54,9 @@ public:
void onClickCreatorProfile();
void onClickOwnerProfile();
void onSelectObject();
+
+ static void onGetAvNameCallback(const LLUUID& idCreator, const LLAvatarName& av_name, void* FloaterPtr);
+
LLScrollListCtrl* mObjectList;
protected:
// protected members
diff --git a/indra/newview/llfloaterinventory.cpp b/indra/newview/llfloaterinventory.cpp
index df769bdd88..9b9b90e521 100644
--- a/indra/newview/llfloaterinventory.cpp
+++ b/indra/newview/llfloaterinventory.cpp
@@ -98,3 +98,12 @@ void LLFloaterInventory::onOpen(const LLSD& key)
{
//LLFirstUse::useInventory();
}
+
+void LLFloaterInventory::onClose(bool app_quitting)
+{
+ LLFloater::onClose(app_quitting);
+ if (mKey.asInteger() > 1)
+ {
+ destroy();
+ }
+}
diff --git a/indra/newview/llfloaterinventory.h b/indra/newview/llfloaterinventory.h
index f59a015b07..823c4903b4 100644
--- a/indra/newview/llfloaterinventory.h
+++ b/indra/newview/llfloaterinventory.h
@@ -58,6 +58,7 @@ public:
// Inherited functionality
/*virtual*/ void onOpen(const LLSD& key);
+ /*virtual*/ void onClose(bool app_quitting);
LLInventoryPanel* getPanel();
LLPanelMainInventory* getMainInventoryPanel() { return mPanelMainInventory;}
diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp
index a6025661b7..ee18c95b34 100644
--- a/indra/newview/llfloaterland.cpp
+++ b/indra/newview/llfloaterland.cpp
@@ -38,6 +38,7 @@
#include "message.h"
#include "llagent.h"
+#include "llagentaccess.h"
#include "llbutton.h"
#include "llcheckboxctrl.h"
#include "llcombobox.h"
@@ -432,7 +433,6 @@ BOOL LLPanelLandGeneral::postBuild()
mTextDwell = getChild<LLTextBox>("DwellText");
-
mBtnBuyLand = getChild<LLButton>("Buy Land...");
mBtnBuyLand->setClickedCallback(onClickBuyLand, (void*)&BUY_PERSONAL_LAND);
@@ -565,10 +565,7 @@ void LLPanelLandGeneral::refresh()
if (regionp)
{
insert_maturity_into_textbox(mContentRating, gFloaterView->getParentFloater(this), MATURITY);
-
- std::string land_type;
- bool is_land_type_localized = LLTrans::findString(land_type, regionp->getSimProductName());
- mLandType->setText(is_land_type_localized ? land_type : regionp->getSimProductName());
+ mLandType->setText(regionp->getLocalizedSimProductName());
}
// estate owner/manager cannot edit other parts of the parcel
@@ -698,20 +695,26 @@ void LLPanelLandGeneral::refresh()
S32 area;
S32 claim_price;
S32 rent_price;
- F32 dwell;
+ F32 dwell = DWELL_NAN;
LLViewerParcelMgr::getInstance()->getDisplayInfo(&area,
&claim_price,
&rent_price,
&for_sale,
&dwell);
-
// Area
LLUIString price = getString("area_size_text");
price.setArg("[AREA]", llformat("%d",area));
mTextPriceLabel->setText(getString("area_text"));
mTextPrice->setText(price.getString());
- mTextDwell->setText(llformat("%.0f", dwell));
+ if (dwell == DWELL_NAN)
+ {
+ mTextDwell->setText(LLTrans::getString("LoadingData"));
+ }
+ else
+ {
+ mTextDwell->setText(llformat("%.0f", dwell));
+ }
if (for_sale)
{
@@ -1803,7 +1806,6 @@ LLPanelLandOptions::LLPanelLandOptions(LLParcelSelectionHandle& parcel)
mCheckEditGroupObjects(NULL),
mCheckAllObjectEntry(NULL),
mCheckGroupObjectEntry(NULL),
- mCheckEditLand(NULL),
mCheckSafe(NULL),
mCheckFly(NULL),
mCheckGroupScripts(NULL),
@@ -1817,6 +1819,7 @@ LLPanelLandOptions::LLPanelLandOptions(LLParcelSelectionHandle& parcel)
mClearBtn(NULL),
mMatureCtrl(NULL),
mPushRestrictionCtrl(NULL),
+ mSeeAvatarsCtrl(NULL),
mParcel(parcel)
{
}
@@ -1836,10 +1839,6 @@ BOOL LLPanelLandOptions::postBuild()
mCheckGroupObjectEntry = getChild<LLCheckBoxCtrl>( "group object entry check");
childSetCommitCallback("group object entry check", onCommitAny, this);
- mCheckEditLand = getChild<LLCheckBoxCtrl>( "edit land check");
- childSetCommitCallback("edit land check", onCommitAny, this);
-
-
mCheckGroupScripts = getChild<LLCheckBoxCtrl>( "check group scripts");
childSetCommitCallback("check group scripts", onCommitAny, this);
@@ -1859,6 +1858,9 @@ BOOL LLPanelLandOptions::postBuild()
mPushRestrictionCtrl = getChild<LLCheckBoxCtrl>( "PushRestrictCheck");
childSetCommitCallback("PushRestrictCheck", onCommitAny, this);
+ mSeeAvatarsCtrl = getChild<LLCheckBoxCtrl>( "SeeAvatarsCheck");
+ childSetCommitCallback("SeeAvatarsCheck", onCommitAny, this);
+
mCheckShowDirectory = getChild<LLCheckBoxCtrl>( "ShowDirectoryCheck");
childSetCommitCallback("ShowDirectoryCheck", onCommitAny, this);
@@ -1949,9 +1951,6 @@ void LLPanelLandOptions::refresh()
mCheckGroupObjectEntry ->set(FALSE);
mCheckGroupObjectEntry ->setEnabled(FALSE);
- mCheckEditLand ->set(FALSE);
- mCheckEditLand ->setEnabled(FALSE);
-
mCheckSafe ->set(FALSE);
mCheckSafe ->setEnabled(FALSE);
@@ -1967,6 +1966,9 @@ void LLPanelLandOptions::refresh()
mPushRestrictionCtrl->set(FALSE);
mPushRestrictionCtrl->setEnabled(FALSE);
+ mSeeAvatarsCtrl->set(TRUE);
+ mSeeAvatarsCtrl->setEnabled(FALSE);
+
mLandingTypeCombo->setCurrentByIndex(0);
mLandingTypeCombo->setEnabled(FALSE);
@@ -1996,11 +1998,7 @@ void LLPanelLandOptions::refresh()
mCheckGroupObjectEntry ->set( parcel->getAllowGroupObjectEntry() || parcel->getAllowAllObjectEntry());
mCheckGroupObjectEntry ->setEnabled( can_change_options && !parcel->getAllowAllObjectEntry() );
-
- BOOL can_change_terraform = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_EDIT);
- mCheckEditLand ->set( parcel->getAllowTerraform() );
- mCheckEditLand ->setEnabled( can_change_terraform );
-
+
mCheckSafe ->set( !parcel->getAllowDamage() );
mCheckSafe ->setEnabled( can_change_options );
@@ -2026,6 +2024,9 @@ void LLPanelLandOptions::refresh()
mPushRestrictionCtrl->setEnabled(can_change_options);
}
+ mSeeAvatarsCtrl->set(parcel->getSeeAVs());
+ mSeeAvatarsCtrl->setEnabled(can_change_options && parcel->getHaveNewParcelLimitData());
+
BOOL can_change_landing_point = LLViewerParcelMgr::isParcelModifiableByAgent(parcel,
GP_LAND_SET_LANDING_POINT);
mLandingTypeCombo->setCurrentByIndex((S32)parcel->getLandingType());
@@ -2221,7 +2222,7 @@ void LLPanelLandOptions::onCommitAny(LLUICtrl *ctrl, void *userdata)
BOOL create_group_objects = self->mCheckEditGroupObjects->get() || self->mCheckEditObjects->get();
BOOL all_object_entry = self->mCheckAllObjectEntry->get();
BOOL group_object_entry = self->mCheckGroupObjectEntry->get() || self->mCheckAllObjectEntry->get();
- BOOL allow_terraform = self->mCheckEditLand->get();
+ BOOL allow_terraform = false; // removed from UI so always off now - self->mCheckEditLand->get();
BOOL allow_damage = !self->mCheckSafe->get();
BOOL allow_fly = self->mCheckFly->get();
BOOL allow_landmark = TRUE; // cannot restrict landmark creation
@@ -2230,6 +2231,7 @@ void LLPanelLandOptions::onCommitAny(LLUICtrl *ctrl, void *userdata)
BOOL allow_publish = FALSE;
BOOL mature_publish = self->mMatureCtrl->get();
BOOL push_restriction = self->mPushRestrictionCtrl->get();
+ BOOL see_avs = self->mSeeAvatarsCtrl->get();
BOOL show_directory = self->mCheckShowDirectory->get();
// we have to get the index from a lookup, not from the position in the dropdown!
S32 category_index = LLParcel::getCategoryFromString(self->mCategoryCombo->getSelectedValue());
@@ -2263,6 +2265,7 @@ void LLPanelLandOptions::onCommitAny(LLUICtrl *ctrl, void *userdata)
parcel->setCategory((LLParcel::ECategory)category_index);
parcel->setLandingType((LLParcel::ELandingType)landing_type_index);
parcel->setSnapshotID(snapshot_id);
+ parcel->setSeeAVs(see_avs);
// Send current parcel data upstream to server
LLViewerParcelMgr::getInstance()->sendParcelPropertiesUpdate( parcel );
@@ -2471,27 +2474,6 @@ void LLPanelLandAccess::refresh()
mListBanned->addNameItem(entry.mID, ADD_DEFAULT, TRUE, suffix);
}
}
-
- LLCheckBoxWithTBAcess* maturity_checkbox = (LLCheckBoxWithTBAcess*) getChild<LLCheckBoxCtrl>( "public_access");
- LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion();
- if(region)
- {
- LLTextBox* maturity_textbox = maturity_checkbox->getTextBox();
- insert_maturity_into_textbox(maturity_textbox, gFloaterView->getParentFloater(this), getString("allow_public_access"));
- maturity_checkbox->reshape(maturity_checkbox->getRect().getWidth(), maturity_checkbox->getRect().getHeight(), FALSE);
- }
- else
- {
- std::string maturity_string = getString("allow_public_access");
- size_t maturity_pos = maturity_string.find(MATURITY);
-
- if (maturity_pos != std::string::npos)
- {
- maturity_string.replace(maturity_pos, MATURITY.length(), std::string(""));
- }
-
- maturity_checkbox->setLabel(maturity_string);
- }
if(parcel->getRegionDenyAnonymousOverride())
{
@@ -2757,7 +2739,12 @@ void LLPanelLandAccess::onCommitAny(LLUICtrl *ctrl, void *userdata)
void LLPanelLandAccess::onClickAddAccess()
{
- gFloaterView->getParentFloater(this)->addDependentFloater(LLFloaterAvatarPicker::show(boost::bind(&LLPanelLandAccess::callbackAvatarCBAccess, this, _1)) );
+ LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(
+ boost::bind(&LLPanelLandAccess::callbackAvatarCBAccess, this, _1));
+ if (picker)
+ {
+ gFloaterView->getParentFloater(this)->addDependentFloater(picker);
+ }
}
void LLPanelLandAccess::callbackAvatarCBAccess(const uuid_vec_t& ids)
@@ -2801,7 +2788,12 @@ void LLPanelLandAccess::onClickRemoveAccess(void* data)
// static
void LLPanelLandAccess::onClickAddBanned()
{
- gFloaterView->getParentFloater(this)->addDependentFloater(LLFloaterAvatarPicker::show(boost::bind(&LLPanelLandAccess::callbackAvatarCBBanned, this, _1)));
+ LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(
+ boost::bind(&LLPanelLandAccess::callbackAvatarCBBanned, this, _1));
+ if (picker)
+ {
+ gFloaterView->getParentFloater(this)->addDependentFloater(picker);
+ }
}
// static
@@ -2869,10 +2861,7 @@ void LLPanelLandCovenant::refresh()
}
LLTextBox* region_landtype = getChild<LLTextBox>("region_landtype_text");
- if (region_landtype)
- {
- region_landtype->setText(region->getSimProductName());
- }
+ region_landtype->setText(region->getLocalizedSimProductName());
LLTextBox* region_maturity = getChild<LLTextBox>("region_maturity_text");
if (region_maturity)
diff --git a/indra/newview/llfloaterland.h b/indra/newview/llfloaterland.h
index a096fb64cd..4f1c10274a 100644
--- a/indra/newview/llfloaterland.h
+++ b/indra/newview/llfloaterland.h
@@ -43,11 +43,12 @@ class LLButton;
class LLCheckBoxCtrl;
class LLRadioGroup;
class LLComboBox;
-class LLNameListCtrl;
-class LLSpinCtrl;
class LLLineEditor;
+class LLMessageSystem;
+class LLNameListCtrl;
class LLRadioGroup;
class LLParcelSelectionObserver;
+class LLSpinCtrl;
class LLTabContainer;
class LLTextBox;
class LLTextEditor;
@@ -329,7 +330,6 @@ private:
LLCheckBoxCtrl* mCheckEditGroupObjects;
LLCheckBoxCtrl* mCheckAllObjectEntry;
LLCheckBoxCtrl* mCheckGroupObjectEntry;
- LLCheckBoxCtrl* mCheckEditLand;
LLCheckBoxCtrl* mCheckSafe;
LLCheckBoxCtrl* mCheckFly;
LLCheckBoxCtrl* mCheckGroupScripts;
@@ -347,6 +347,7 @@ private:
LLCheckBoxCtrl *mMatureCtrl;
LLCheckBoxCtrl *mPushRestrictionCtrl;
+ LLCheckBoxCtrl *mSeeAvatarsCtrl;
LLSafeHandle<LLParcelSelection>& mParcel;
};
diff --git a/indra/newview/llfloatermap.cpp b/indra/newview/llfloatermap.cpp
index 351b9ac5da..a65e9e911a 100644
--- a/indra/newview/llfloatermap.cpp
+++ b/indra/newview/llfloatermap.cpp
@@ -42,7 +42,6 @@
#include "llviewercamera.h"
#include "lldraghandle.h"
#include "lltextbox.h"
-#include "llviewermenu.h"
#include "llfloaterworldmap.h"
#include "llagent.h"
@@ -63,7 +62,6 @@ const S32 MAP_PADDING_BOTTOM = 0;
LLFloaterMap::LLFloaterMap(const LLSD& key)
: LLFloater(key),
- mPopupMenu(NULL),
mTextBoxEast(NULL),
mTextBoxNorth(NULL),
mTextBoxWest(NULL),
@@ -83,8 +81,14 @@ LLFloaterMap::~LLFloaterMap()
BOOL LLFloaterMap::postBuild()
{
mMap = getChild<LLNetMap>("Net Map");
- mMap->setScale(gSavedSettings.getF32("MiniMapScale"));
- mMap->setToolTipMsg(getString("ToolTipMsg"));
+ if (gSavedSettings.getBOOL("DoubleClickTeleport"))
+ {
+ mMap->setToolTipMsg(getString("AltToolTipMsg"));
+ }
+ else if (gSavedSettings.getBOOL("DoubleClickShowWorldMap"))
+ {
+ mMap->setToolTipMsg(getString("ToolTipMsg"));
+ }
sendChildToBack(mMap);
mTextBoxNorth = getChild<LLTextBox> ("floater_map_north");
@@ -96,28 +100,11 @@ BOOL LLFloaterMap::postBuild()
mTextBoxSouthWest = getChild<LLTextBox> ("floater_map_southwest");
mTextBoxNorthWest = getChild<LLTextBox> ("floater_map_northwest");
- LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
-
- registrar.add("Minimap.Zoom", boost::bind(&LLFloaterMap::handleZoom, this, _2));
- registrar.add("Minimap.Tracker", boost::bind(&LLFloaterMap::handleStopTracking, this, _2));
-
- mPopupMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_mini_map.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
- if (mPopupMenu && !LLTracker::isTracking(0))
- {
- mPopupMenu->setItemEnabled ("Stop Tracking", false);
- }
-
- stretchMiniMap(getRect().getWidth() - MAP_PADDING_LEFT - MAP_PADDING_RIGHT
- ,getRect().getHeight() - MAP_PADDING_TOP - MAP_PADDING_BOTTOM);
-
updateMinorDirections();
// Get the drag handle all the way in back
sendChildToBack(getDragHandle());
- setIsChrome(TRUE);
- getDragHandle()->setTitleVisible(TRUE);
-
// keep onscreen
gFloaterView->adjustToFitScreen(this, FALSE);
@@ -150,24 +137,13 @@ BOOL LLFloaterMap::handleDoubleClick(S32 x, S32 y, MASK mask)
// If DoubleClickTeleport is on, double clicking the minimap will teleport there
gAgent.teleportViaLocationLookAt(pos_global);
}
- else
+ else if (gSavedSettings.getBOOL("DoubleClickShowWorldMap"))
{
LLFloaterReg::showInstance("world_map");
}
return TRUE;
}
-BOOL LLFloaterMap::handleRightMouseDown(S32 x, S32 y, MASK mask)
-{
- if (mPopupMenu)
- {
- mPopupMenu->buildDrawLabels();
- mPopupMenu->updateParent(LLMenuGL::sMenuContainer);
- LLMenuGL::showPopup(this, mPopupMenu, x, y);
- }
- return TRUE;
-}
-
void LLFloaterMap::setDirectionPos( LLTextBox* text_box, F32 rotation )
{
// Rotation is in radians.
@@ -238,48 +214,13 @@ void LLFloaterMap::draw()
getDragHandle()->setMouseOpaque(TRUE);
}
- if (LLTracker::isTracking(0))
- {
- mPopupMenu->setItemEnabled ("Stop Tracking", true);
- }
-
LLFloater::draw();
}
-// virtual
-void LLFloaterMap::onFocusReceived()
-{
- setBackgroundOpaque(true);
- LLPanel::onFocusReceived();
-}
-
-// virtual
-void LLFloaterMap::onFocusLost()
-{
- setBackgroundOpaque(false);
- LLPanel::onFocusLost();
-}
-
-void LLFloaterMap::stretchMiniMap(S32 width,S32 height)
-{
- //fix for ext-7112
- //by default ctrl can't overlap caption area
- if(mMap)
- {
- LLRect map_rect;
- map_rect.setLeftTopAndSize( MAP_PADDING_LEFT, getRect().getHeight() - MAP_PADDING_TOP, width, height);
- mMap->reshape( width, height, 1);
- mMap->setRect(map_rect);
- }
-}
-
void LLFloaterMap::reshape(S32 width, S32 height, BOOL called_from_parent)
{
LLFloater::reshape(width, height, called_from_parent);
- stretchMiniMap(width - MAP_PADDING_LEFT - MAP_PADDING_RIGHT
- ,height - MAP_PADDING_TOP - MAP_PADDING_BOTTOM);
-
updateMinorDirections();
}
@@ -288,7 +229,16 @@ void LLFloaterMap::handleZoom(const LLSD& userdata)
std::string level = userdata.asString();
F32 scale = 0.0f;
- if (level == std::string("close"))
+ if (level == std::string("default"))
+ {
+ LLControlVariable *pvar = gSavedSettings.getControl("MiniMapScale");
+ if(pvar)
+ {
+ pvar->resetToDefault();
+ scale = gSavedSettings.getF32("MiniMapScale");
+ }
+ }
+ else if (level == std::string("close"))
scale = LLNetMap::MAP_SCALE_MAX;
else if (level == std::string("medium"))
scale = LLNetMap::MAP_SCALE_MID;
@@ -296,28 +246,6 @@ void LLFloaterMap::handleZoom(const LLSD& userdata)
scale = LLNetMap::MAP_SCALE_MIN;
if (scale != 0.0f)
{
- gSavedSettings.setF32("MiniMapScale", scale );
mMap->setScale(scale);
}
}
-
-void LLFloaterMap::handleStopTracking (const LLSD& userdata)
-{
- if (mPopupMenu)
- {
- mPopupMenu->setItemEnabled ("Stop Tracking", false);
- LLTracker::stopTracking ((void*)LLTracker::isTracking(NULL));
- }
-}
-void LLFloaterMap::setMinimized(BOOL b)
-{
- LLFloater::setMinimized(b);
- if(b)
- {
- setTitle(getString("mini_map_caption"));
- }
- else
- {
- setTitle("");
- }
-}
diff --git a/indra/newview/llfloatermap.h b/indra/newview/llfloatermap.h
index 4cbb48fb3e..8a1b965e62 100644
--- a/indra/newview/llfloatermap.h
+++ b/indra/newview/llfloatermap.h
@@ -29,7 +29,6 @@
#include "llfloater.h"
-class LLMenuGL;
class LLNetMap;
class LLTextBox;
@@ -44,24 +43,14 @@ public:
/*virtual*/ BOOL postBuild();
/*virtual*/ BOOL handleDoubleClick( S32 x, S32 y, MASK mask );
- /*virtual*/ BOOL handleRightMouseDown( S32 x, S32 y, MASK mask );
/*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
/*virtual*/ void draw();
- /*virtual*/ void onFocusLost();
- /*virtual*/ void onFocusReceived();
- /*virtual*/ void setMinimized(BOOL b);
-
private:
void handleZoom(const LLSD& userdata);
- void handleStopTracking (const LLSD& userdata);
void setDirectionPos( LLTextBox* text_box, F32 rotation );
void updateMinorDirections();
- void stretchMiniMap(S32 width,S32 height);
-
- LLMenuGL* mPopupMenu;
-
LLTextBox* mTextBoxEast;
LLTextBox* mTextBoxNorth;
LLTextBox* mTextBoxWest;
diff --git a/indra/newview/llfloatermediabrowser.cpp b/indra/newview/llfloatermediabrowser.cpp
deleted file mode 100644
index d20092e344..0000000000
--- a/indra/newview/llfloatermediabrowser.cpp
+++ /dev/null
@@ -1,458 +0,0 @@
-/**
- * @file llfloatermediabrowser.cpp
- * @brief media browser floater - uses embedded media browser control
- *
- * $LicenseInfo:firstyear=2006&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llfloatermediabrowser.h"
-
-#include "llfloaterreg.h"
-#include "llparcel.h"
-#include "llpluginclassmedia.h"
-#include "lluictrlfactory.h"
-#include "llmediactrl.h"
-#include "llviewerwindow.h"
-#include "llviewercontrol.h"
-#include "llviewerparcelmgr.h"
-#include "llweb.h"
-#include "llui.h"
-#include "roles_constants.h"
-
-#include "llurlhistory.h"
-#include "llmediactrl.h"
-#include "llviewermedia.h"
-#include "llviewerparcelmedia.h"
-#include "llcombobox.h"
-#include "llwindow.h"
-#include "lllayoutstack.h"
-#include "llcheckboxctrl.h"
-
-#include "llnotifications.h"
-
-// TEMP
-#include "llsdutil.h"
-
-LLFloaterMediaBrowser::LLFloaterMediaBrowser(const LLSD& key)
- : LLFloater(key)
-{
-}
-
-//static
-void LLFloaterMediaBrowser::create(const std::string &url, const std::string& target, const std::string& uuid)
-{
- lldebugs << "url = " << url << ", target = " << target << ", uuid = " << uuid << llendl;
-
- std::string tag = target;
-
- if(target.empty() || target == "_blank")
- {
- if(!uuid.empty())
- {
- tag = uuid;
- }
- else
- {
- // create a unique tag for this instance
- LLUUID id;
- id.generate();
- tag = id.asString();
- }
- }
-
- S32 browser_window_limit = gSavedSettings.getS32("MediaBrowserWindowLimit");
-
- if(LLFloaterReg::findInstance("media_browser", tag) != NULL)
- {
- // There's already a media browser for this tag, so we won't be opening a new window.
- }
- else if(browser_window_limit != 0)
- {
- // showInstance will open a new window. Figure out how many media browsers are already open,
- // and close the least recently opened one if this will put us over the limit.
-
- LLFloaterReg::const_instance_list_t &instances = LLFloaterReg::getFloaterList("media_browser");
- lldebugs << "total instance count is " << instances.size() << llendl;
-
- for(LLFloaterReg::const_instance_list_t::const_iterator iter = instances.begin(); iter != instances.end(); iter++)
- {
- lldebugs << " " << (*iter)->getKey() << llendl;
- }
-
- if(instances.size() >= (size_t)browser_window_limit)
- {
- // Destroy the least recently opened instance
- (*instances.begin())->closeFloater();
- }
- }
-
- LLFloaterMediaBrowser *browser = dynamic_cast<LLFloaterMediaBrowser*> (LLFloaterReg::showInstance("media_browser", tag));
- llassert(browser);
- if(browser)
- {
- browser->mUUID = uuid;
-
- // tell the browser instance to load the specified URL
- browser->openMedia(url, target);
- LLViewerMedia::proxyWindowOpened(target, uuid);
- }
-}
-
-//static
-void LLFloaterMediaBrowser::closeRequest(const std::string &uuid)
-{
- LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("media_browser");
- lldebugs << "instance list size is " << inst_list.size() << ", incoming uuid is " << uuid << llendl;
- for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end(); ++iter)
- {
- LLFloaterMediaBrowser* i = dynamic_cast<LLFloaterMediaBrowser*>(*iter);
- lldebugs << " " << i->mUUID << llendl;
- if (i && i->mUUID == uuid)
- {
- i->closeFloater(false);
- return;
- }
- }
-}
-
-//static
-void LLFloaterMediaBrowser::geometryChanged(const std::string &uuid, S32 x, S32 y, S32 width, S32 height)
-{
- LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("media_browser");
- lldebugs << "instance list size is " << inst_list.size() << ", incoming uuid is " << uuid << llendl;
- for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end(); ++iter)
- {
- LLFloaterMediaBrowser* i = dynamic_cast<LLFloaterMediaBrowser*>(*iter);
- lldebugs << " " << i->mUUID << llendl;
- if (i && i->mUUID == uuid)
- {
- i->geometryChanged(x, y, width, height);
- return;
- }
-}
-}
-
-void LLFloaterMediaBrowser::geometryChanged(S32 x, S32 y, S32 width, S32 height)
-{
- // Make sure the layout of the browser control is updated, so this calculation is correct.
- LLLayoutStack::updateClass();
-
- // TODO: need to adjust size and constrain position to make sure floaters aren't moved outside the window view, etc.
- LLCoordWindow window_size;
- getWindow()->getSize(&window_size);
-
- // Adjust width and height for the size of the chrome on the Media Browser window.
- width += getRect().getWidth() - mBrowser->getRect().getWidth();
- height += getRect().getHeight() - mBrowser->getRect().getHeight();
-
- LLRect geom;
- geom.setOriginAndSize(x, window_size.mY - (y + height), width, height);
-
- lldebugs << "geometry change: " << geom << llendl;
-
- handleReshape(geom,false);
-}
-
-
-void LLFloaterMediaBrowser::draw()
-{
- getChildView("go")->setEnabled(!mAddressCombo->getValue().asString().empty());
- LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
- if(parcel)
- {
- getChildView("parcel_owner_controls")->setVisible( LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_CHANGE_MEDIA));
- getChildView("assign")->setEnabled(!mAddressCombo->getValue().asString().empty());
- }
- bool show_time_controls = false;
- bool media_playing = false;
- if(mBrowser)
- {
- LLPluginClassMedia* media_plugin = mBrowser->getMediaPlugin();
- if(media_plugin)
- {
- show_time_controls = media_plugin->pluginSupportsMediaTime();
- media_playing = media_plugin->getStatus() == LLPluginClassMediaOwner::MEDIA_PLAYING;
- }
- }
- getChildView("rewind")->setVisible( show_time_controls);
- getChildView("play")->setVisible( show_time_controls && ! media_playing);
- getChildView("pause")->setVisible( show_time_controls && media_playing);
- getChildView("stop")->setVisible( show_time_controls);
- getChildView("seek")->setVisible( show_time_controls);
-
- getChildView("play")->setEnabled(! media_playing);
- getChildView("stop")->setEnabled(media_playing);
-
- getChildView("back")->setEnabled(mBrowser->canNavigateBack());
- getChildView("forward")->setEnabled(mBrowser->canNavigateForward());
-
- LLFloater::draw();
-}
-
-BOOL LLFloaterMediaBrowser::postBuild()
-{
- mBrowser = getChild<LLMediaCtrl>("browser");
- mBrowser->addObserver(this);
-
- mAddressCombo = getChild<LLComboBox>("address");
- mAddressCombo->setCommitCallback(onEnterAddress, this);
- mAddressCombo->sortByName();
-
- childSetAction("back", onClickBack, this);
- childSetAction("forward", onClickForward, this);
- childSetAction("reload", onClickRefresh, this);
- childSetAction("rewind", onClickRewind, this);
- childSetAction("play", onClickPlay, this);
- childSetAction("stop", onClickStop, this);
- childSetAction("pause", onClickPlay, this);
- childSetAction("seek", onClickSeek, this);
- childSetAction("go", onClickGo, this);
- childSetAction("close", onClickClose, this);
- childSetAction("open_browser", onClickOpenWebBrowser, this);
- childSetAction("assign", onClickAssign, this);
-
- buildURLHistory();
-
- return TRUE;
-}
-
-void LLFloaterMediaBrowser::buildURLHistory()
-{
- LLCtrlListInterface* url_list = childGetListInterface("address");
- if (url_list)
- {
- url_list->operateOnAll(LLCtrlListInterface::OP_DELETE);
- }
-
- // Get all of the entries in the "browser" collection
- LLSD browser_history = LLURLHistory::getURLHistory("browser");
-
- LLSD::array_iterator iter_history =
- browser_history.beginArray();
- LLSD::array_iterator end_history =
- browser_history.endArray();
- for(; iter_history != end_history; ++iter_history)
- {
- std::string url = (*iter_history).asString();
- if(! url.empty())
- url_list->addSimpleElement(url);
- }
-
- // initialize URL history in the plugin
- if(mBrowser && mBrowser->getMediaPlugin())
- {
- mBrowser->getMediaPlugin()->initializeUrlHistory(browser_history);
- }
-}
-
-std::string LLFloaterMediaBrowser::getSupportURL()
-{
- return getString("support_page_url");
-}
-
-//virtual
-void LLFloaterMediaBrowser::onClose(bool app_quitting)
-{
- LLViewerMedia::proxyWindowClosed(mUUID);
- //setVisible(FALSE);
- destroy();
-}
-
-void LLFloaterMediaBrowser::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event)
-{
- if(event == MEDIA_EVENT_LOCATION_CHANGED)
- {
- setCurrentURL(self->getLocation());
- }
- else if(event == MEDIA_EVENT_NAVIGATE_COMPLETE)
- {
- // This is the event these flags are sent with.
- getChildView("back")->setEnabled(self->getHistoryBackAvailable());
- getChildView("forward")->setEnabled(self->getHistoryForwardAvailable());
- }
- else if(event == MEDIA_EVENT_CLOSE_REQUEST)
- {
- // The browser instance wants its window closed.
- closeFloater();
- }
- else if(event == MEDIA_EVENT_GEOMETRY_CHANGE)
- {
- geometryChanged(self->getGeometryX(), self->getGeometryY(), self->getGeometryWidth(), self->getGeometryHeight());
- }
-}
-
-void LLFloaterMediaBrowser::setCurrentURL(const std::string& url)
-{
- mCurrentURL = url;
-
- // redirects will navigate momentarily to about:blank, don't add to history
- if (mCurrentURL != "about:blank")
- {
- mAddressCombo->remove(mCurrentURL);
- mAddressCombo->add(mCurrentURL);
- mAddressCombo->selectByValue(mCurrentURL);
-
- // Serialize url history
- LLURLHistory::removeURL("browser", mCurrentURL);
- LLURLHistory::addURL("browser", mCurrentURL);
- }
- getChildView("back")->setEnabled(mBrowser->canNavigateBack());
- getChildView("forward")->setEnabled(mBrowser->canNavigateForward());
- getChildView("reload")->setEnabled(TRUE);
-}
-
-//static
-void LLFloaterMediaBrowser::onEnterAddress(LLUICtrl* ctrl, void* user_data)
-{
- LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data;
- self->mBrowser->navigateTo(self->mAddressCombo->getValue().asString());
-}
-
-//static
-void LLFloaterMediaBrowser::onClickRefresh(void* user_data)
-{
- LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data;
-
- self->mAddressCombo->remove(0);
- self->mBrowser->navigateTo(self->mCurrentURL);
-}
-
-//static
-void LLFloaterMediaBrowser::onClickForward(void* user_data)
-{
- LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data;
-
- self->mBrowser->navigateForward();
-}
-
-//static
-void LLFloaterMediaBrowser::onClickBack(void* user_data)
-{
- LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data;
-
- self->mBrowser->navigateBack();
-}
-
-//static
-void LLFloaterMediaBrowser::onClickGo(void* user_data)
-{
- LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data;
-
- self->mBrowser->navigateTo(self->mAddressCombo->getValue().asString());
-}
-
-//static
-void LLFloaterMediaBrowser::onClickClose(void* user_data)
-{
- LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data;
-
- self->closeFloater();
-}
-
-//static
-void LLFloaterMediaBrowser::onClickOpenWebBrowser(void* user_data)
-{
- LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data;
-
- std::string url = self->mCurrentURL.empty() ?
- self->mBrowser->getHomePageUrl() :
- self->mCurrentURL;
- LLWeb::loadURLExternal(url);
-}
-
-void LLFloaterMediaBrowser::onClickAssign(void* user_data)
-{
- LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data;
-
- LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
- if (!parcel)
- {
- return;
- }
- std::string media_url = self->mAddressCombo->getValue().asString();
- LLStringUtil::trim(media_url);
-
- if(parcel->getMediaType() != "text/html")
- {
- parcel->setMediaURL(media_url);
- parcel->setMediaCurrentURL(media_url);
- parcel->setMediaType(std::string("text/html"));
- LLViewerParcelMgr::getInstance()->sendParcelPropertiesUpdate( parcel, true );
- LLViewerParcelMedia::sendMediaNavigateMessage(media_url);
- LLViewerParcelMedia::stop();
- // LLViewerParcelMedia::update( parcel );
- }
- LLViewerParcelMedia::sendMediaNavigateMessage(media_url);
-}
-//static
-void LLFloaterMediaBrowser::onClickRewind(void* user_data)
-{
- LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data;
-
- if(self->mBrowser->getMediaPlugin())
- self->mBrowser->getMediaPlugin()->start(-2.0f);
-}
-//static
-void LLFloaterMediaBrowser::onClickPlay(void* user_data)
-{
- LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data;
-
- LLPluginClassMedia* plugin = self->mBrowser->getMediaPlugin();
- if(plugin)
- {
- if(plugin->getStatus() == LLPluginClassMediaOwner::MEDIA_PLAYING)
- {
- plugin->pause();
- }
- else
- {
- plugin->start();
- }
- }
-}
-//static
-void LLFloaterMediaBrowser::onClickStop(void* user_data)
-{
- LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data;
-
- if(self->mBrowser->getMediaPlugin())
- self->mBrowser->getMediaPlugin()->stop();
-}
-//static
-void LLFloaterMediaBrowser::onClickSeek(void* user_data)
-{
- LLFloaterMediaBrowser* self = (LLFloaterMediaBrowser*)user_data;
-
- if(self->mBrowser->getMediaPlugin())
- self->mBrowser->getMediaPlugin()->start(2.0f);
-}
-void LLFloaterMediaBrowser::openMedia(const std::string& media_url, const std::string& target)
-{
- mBrowser->setHomePageUrl(media_url);
- mBrowser->setTarget(target);
- mBrowser->navigateTo(media_url);
- setCurrentURL(media_url);
-}
-
-
diff --git a/indra/newview/llfloatermediabrowser.h b/indra/newview/llfloatermediabrowser.h
deleted file mode 100644
index 152d221a01..0000000000
--- a/indra/newview/llfloatermediabrowser.h
+++ /dev/null
@@ -1,86 +0,0 @@
-/**
- * @file llfloatermediabrowser.h
- * @brief media browser floater - uses embedded media browser control
- *
- * $LicenseInfo:firstyear=2006&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLFLOATERMEDIABROWSER_H
-#define LL_LLFLOATERMEDIABROWSER_H
-
-#include "llfloater.h"
-#include "llmediactrl.h"
-
-
-class LLComboBox;
-class LLMediaCtrl;
-class LLNotification;
-
-class LLFloaterMediaBrowser :
- public LLFloater,
- public LLViewerMediaObserver
-{
-public:
- LOG_CLASS(LLFloaterMediaBrowser);
- LLFloaterMediaBrowser(const LLSD& key);
-
- static void create(const std::string &url, const std::string& target, const std::string& uuid = LLStringUtil::null);
-
- static void closeRequest(const std::string &uuid);
- static void geometryChanged(const std::string &uuid, S32 x, S32 y, S32 width, S32 height);
- void geometryChanged(S32 x, S32 y, S32 width, S32 height);
-
- /*virtual*/ BOOL postBuild();
- /*virtual*/ void onClose(bool app_quitting);
- /*virtual*/ void draw();
-
- // inherited from LLViewerMediaObserver
- /*virtual*/ void handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event);
-
- void openMedia(const std::string& media_url, const std::string& target);
- void buildURLHistory();
- std::string getSupportURL();
- void setCurrentURL(const std::string& url);
-
- static void onEnterAddress(LLUICtrl* ctrl, void* user_data);
- static void onClickRefresh(void* user_data);
- static void onClickBack(void* user_data);
- static void onClickForward(void* user_data);
- static void onClickGo(void* user_data);
- static void onClickClose(void* user_data);
- static void onClickOpenWebBrowser(void* user_data);
- static void onClickAssign(void* user_data);
- static void onClickRewind(void* user_data);
- static void onClickPlay(void* user_data);
- static void onClickStop(void* user_data);
- static void onClickSeek(void* user_data);
-
-private:
- LLMediaCtrl* mBrowser;
- LLComboBox* mAddressCombo;
- std::string mCurrentURL;
- boost::shared_ptr<LLNotification> mCurNotification;
- std::string mUUID;
-};
-
-#endif // LL_LLFLOATERMEDIABROWSER_H
-
diff --git a/indra/newview/llfloatermediasettings.cpp b/indra/newview/llfloatermediasettings.cpp
index b5f1b967df..4f2a6ec1b7 100644
--- a/indra/newview/llfloatermediasettings.cpp
+++ b/indra/newview/llfloatermediasettings.cpp
@@ -212,10 +212,13 @@ void LLFloaterMediaSettings::commitFields()
//static
void LLFloaterMediaSettings::clearValues( bool editable)
{
- // clean up all panels before updating
- sInstance->mPanelMediaSettingsGeneral ->clearValues(sInstance->mPanelMediaSettingsGeneral, editable);
- sInstance->mPanelMediaSettingsSecurity ->clearValues(sInstance->mPanelMediaSettingsSecurity, editable);
- sInstance->mPanelMediaSettingsPermissions->clearValues(sInstance->mPanelMediaSettingsPermissions, editable);
+ if (sInstance)
+ {
+ // clean up all panels before updating
+ sInstance->mPanelMediaSettingsGeneral ->clearValues(sInstance->mPanelMediaSettingsGeneral, editable);
+ sInstance->mPanelMediaSettingsSecurity ->clearValues(sInstance->mPanelMediaSettingsSecurity, editable);
+ sInstance->mPanelMediaSettingsPermissions->clearValues(sInstance->mPanelMediaSettingsPermissions, editable);
+ }
}
////////////////////////////////////////////////////////////////////////////////
@@ -309,3 +312,9 @@ bool LLFloaterMediaSettings::haveValuesChanged() const
return values_changed;
}
+bool LLFloaterMediaSettings::instanceExists()
+{
+ return LLFloaterReg::findTypedInstance<LLFloaterMediaSettings>("media_settings");
+}
+
+
diff --git a/indra/newview/llfloatermediasettings.h b/indra/newview/llfloatermediasettings.h
index ecc55d2cbc..1d25530986 100644
--- a/indra/newview/llfloatermediasettings.h
+++ b/indra/newview/llfloatermediasettings.h
@@ -45,6 +45,7 @@ public:
/*virtual*/ void onClose(bool app_quitting);
static LLFloaterMediaSettings* getInstance();
+ static bool instanceExists();
static void apply();
static void initValues( const LLSD& media_settings , bool editable);
static void clearValues( bool editable);
diff --git a/indra/newview/llfloatermemleak.cpp b/indra/newview/llfloatermemleak.cpp
index 58931d112e..9edfe1e354 100644
--- a/indra/newview/llfloatermemleak.cpp
+++ b/indra/newview/llfloatermemleak.cpp
@@ -90,6 +90,11 @@ LLFloaterMemLeak::~LLFloaterMemLeak()
void LLFloaterMemLeak::release()
{
+ if(mLeakedMem.empty())
+ {
+ return ;
+ }
+
for(S32 i = 0 ; i < (S32)mLeakedMem.size() ; i++)
{
delete[] mLeakedMem[i] ;
diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp
new file mode 100755
index 0000000000..4b8beba546
--- /dev/null
+++ b/indra/newview/llfloatermodelpreview.cpp
@@ -0,0 +1,5883 @@
+/**
+ * @file llfloatermodelpreview.cpp
+ * @brief LLFloaterModelPreview class implementation
+ *
+ * $LicenseInfo:firstyear=2004&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#if LL_MSVC
+#pragma warning (disable : 4263)
+#pragma warning (disable : 4264)
+#endif
+#include "dae.h"
+//#include "dom.h"
+#include "dom/domAsset.h"
+#include "dom/domBind_material.h"
+#include "dom/domCOLLADA.h"
+#include "dom/domConstants.h"
+#include "dom/domController.h"
+#include "dom/domEffect.h"
+#include "dom/domGeometry.h"
+#include "dom/domInstance_geometry.h"
+#include "dom/domInstance_material.h"
+#include "dom/domInstance_node.h"
+#include "dom/domInstance_effect.h"
+#include "dom/domMaterial.h"
+#include "dom/domMatrix.h"
+#include "dom/domNode.h"
+#include "dom/domProfile_COMMON.h"
+#include "dom/domRotate.h"
+#include "dom/domScale.h"
+#include "dom/domTranslate.h"
+#include "dom/domVisual_scene.h"
+#if LL_MSVC
+#pragma warning (default : 4263)
+#pragma warning (default : 4264)
+#endif
+
+#include "llfloatermodelpreview.h"
+
+#include "llfilepicker.h"
+#include "llimagebmp.h"
+#include "llimagetga.h"
+#include "llimagejpeg.h"
+#include "llimagepng.h"
+
+#include "llagent.h"
+#include "llbutton.h"
+#include "llcombobox.h"
+#include "lldatapacker.h"
+#include "lldrawable.h"
+#include "lldrawpoolavatar.h"
+#include "llrender.h"
+#include "llface.h"
+#include "lleconomy.h"
+#include "llfocusmgr.h"
+#include "llfloaterperms.h"
+#include "lliconctrl.h"
+#include "llmatrix4a.h"
+#include "llmenubutton.h"
+#include "llmeshrepository.h"
+#include "llnotificationsutil.h"
+#include "llsdutil_math.h"
+#include "lltextbox.h"
+#include "lltoolmgr.h"
+#include "llui.h"
+#include "llvector4a.h"
+#include "llviewercamera.h"
+#include "llviewerwindow.h"
+#include "llvoavatar.h"
+#include "llvoavatarself.h"
+#include "pipeline.h"
+#include "lluictrlfactory.h"
+#include "llviewercontrol.h"
+#include "llviewermenu.h"
+#include "llviewermenufile.h"
+#include "llviewerregion.h"
+#include "llviewertexturelist.h"
+#include "llstring.h"
+#include "llbutton.h"
+#include "llcheckboxctrl.h"
+#include "llradiogroup.h"
+#include "llsdserialize.h"
+#include "llsliderctrl.h"
+#include "llspinctrl.h"
+#include "lltoggleablemenu.h"
+#include "lltrans.h"
+#include "llvfile.h"
+#include "llvfs.h"
+#include "llcallbacklist.h"
+#include "llviewerobjectlist.h"
+#include "llanimationstates.h"
+#include "llviewernetwork.h"
+#include "llviewershadermgr.h"
+#include "glod/glod.h"
+#include <boost/algorithm/string.hpp>
+
+
+const S32 SLM_SUPPORTED_VERSION = 3;
+
+//static
+S32 LLFloaterModelPreview::sUploadAmount = 10;
+LLFloaterModelPreview* LLFloaterModelPreview::sInstance = NULL;
+std::list<LLModelLoader*> LLModelLoader::sActiveLoaderList;
+
+const S32 PREVIEW_BORDER_WIDTH = 2;
+const S32 PREVIEW_RESIZE_HANDLE_SIZE = S32(RESIZE_HANDLE_WIDTH * OO_SQRT2) + PREVIEW_BORDER_WIDTH;
+const S32 PREVIEW_HPAD = PREVIEW_RESIZE_HANDLE_SIZE;
+const S32 PREF_BUTTON_HEIGHT = 16 + 7 + 16;
+const S32 PREVIEW_TEXTURE_HEIGHT = 300;
+
+// "Retain%" decomp parameter has values from 0.0 to 1.0 by 0.01
+// But according to the UI spec for upload model floater, this parameter
+// should be represented by Retain spinner with values from 1 to 100 by 1.
+// To achieve this, RETAIN_COEFFICIENT is used while creating spinner
+// and when value is requested from spinner.
+const double RETAIN_COEFFICIENT = 100;
+
+// "Cosine%" decomp parameter has values from 0.9 to 1 by 0.001
+// But according to the UI spec for upload model floater, this parameter
+// should be represented by Smooth combobox with only 10 values.
+// So this const is used as a size of Smooth combobox list.
+const S32 SMOOTH_VALUES_NUMBER = 10;
+
+void drawBoxOutline(const LLVector3& pos, const LLVector3& size);
+
+
+std::string lod_name[NUM_LOD+1] =
+{
+ "lowest",
+ "low",
+ "medium",
+ "high",
+ "I went off the end of the lod_name array. Me so smart."
+};
+
+std::string lod_triangles_name[NUM_LOD+1] =
+{
+ "lowest_triangles",
+ "low_triangles",
+ "medium_triangles",
+ "high_triangles",
+ "I went off the end of the lod_triangles_name array. Me so smart."
+};
+
+std::string lod_vertices_name[NUM_LOD+1] =
+{
+ "lowest_vertices",
+ "low_vertices",
+ "medium_vertices",
+ "high_vertices",
+ "I went off the end of the lod_vertices_name array. Me so smart."
+};
+
+std::string lod_status_name[NUM_LOD+1] =
+{
+ "lowest_status",
+ "low_status",
+ "medium_status",
+ "high_status",
+ "I went off the end of the lod_status_name array. Me so smart."
+};
+
+std::string lod_icon_name[NUM_LOD+1] =
+{
+ "status_icon_lowest",
+ "status_icon_low",
+ "status_icon_medium",
+ "status_icon_high",
+ "I went off the end of the lod_status_name array. Me so smart."
+};
+
+std::string lod_status_image[NUM_LOD+1] =
+{
+ "ModelImport_Status_Good",
+ "ModelImport_Status_Warning",
+ "ModelImport_Status_Error",
+ "I went off the end of the lod_status_image array. Me so smart."
+};
+
+std::string lod_label_name[NUM_LOD+1] =
+{
+ "lowest_label",
+ "low_label",
+ "medium_label",
+ "high_label",
+ "I went off the end of the lod_label_name array. Me so smart."
+};
+
+std::string colladaVersion[VERSIONTYPE_COUNT+1] =
+{
+ "1.4.0",
+ "1.4.1",
+ "Unsupported"
+};
+
+
+#define LL_DEGENERACY_TOLERANCE 1e-7f
+
+inline F32 dot3fpu(const LLVector4a& a, const LLVector4a& b)
+{
+ volatile F32 p0 = a[0] * b[0];
+ volatile F32 p1 = a[1] * b[1];
+ volatile F32 p2 = a[2] * b[2];
+ return p0 + p1 + p2;
+}
+
+bool ll_is_degenerate(const LLVector4a& a, const LLVector4a& b, const LLVector4a& c, F32 tolerance = LL_DEGENERACY_TOLERANCE)
+{
+ // small area check
+ {
+ LLVector4a edge1; edge1.setSub( a, b );
+ LLVector4a edge2; edge2.setSub( a, c );
+ //////////////////////////////////////////////////////////////////////////
+ /// Linden Modified
+ //////////////////////////////////////////////////////////////////////////
+
+ // If no one edge is more than 10x longer than any other edge, we weaken
+ // the tolerance by a factor of 1e-4f.
+
+ LLVector4a edge3; edge3.setSub( c, b );
+ const F32 len1sq = edge1.dot3(edge1).getF32();
+ const F32 len2sq = edge2.dot3(edge2).getF32();
+ const F32 len3sq = edge3.dot3(edge3).getF32();
+ bool abOK = (len1sq <= 100.f * len2sq) && (len1sq <= 100.f * len3sq);
+ bool acOK = (len2sq <= 100.f * len1sq) && (len1sq <= 100.f * len3sq);
+ bool cbOK = (len3sq <= 100.f * len1sq) && (len1sq <= 100.f * len2sq);
+ if ( abOK && acOK && cbOK )
+ {
+ tolerance *= 1e-4f;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ /// End Modified
+ //////////////////////////////////////////////////////////////////////////
+
+ LLVector4a cross; cross.setCross3( edge1, edge2 );
+
+ LLVector4a edge1b; edge1b.setSub( b, a );
+ LLVector4a edge2b; edge2b.setSub( b, c );
+ LLVector4a crossb; crossb.setCross3( edge1b, edge2b );
+
+ if ( ( cross.dot3(cross).getF32() < tolerance ) || ( crossb.dot3(crossb).getF32() < tolerance ))
+ {
+ return true;
+ }
+ }
+
+ // point triangle distance check
+ {
+ LLVector4a Q; Q.setSub(a, b);
+ LLVector4a R; R.setSub(c, b);
+
+ const F32 QQ = dot3fpu(Q, Q);
+ const F32 RR = dot3fpu(R, R);
+ const F32 QR = dot3fpu(R, Q);
+
+ volatile F32 QQRR = QQ * RR;
+ volatile F32 QRQR = QR * QR;
+ F32 Det = (QQRR - QRQR);
+
+ if( Det == 0.0f )
+ {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+bool validate_face(const LLVolumeFace& face)
+{
+ for (U32 i = 0; i < face.mNumIndices; ++i)
+ {
+ if (face.mIndices[i] >= face.mNumVertices)
+ {
+ llwarns << "Face has invalid index." << llendl;
+ return false;
+ }
+ }
+
+ if (face.mNumIndices % 3 != 0 || face.mNumIndices == 0)
+ {
+ llwarns << "Face has invalid number of indices." << llendl;
+ return false;
+ }
+
+ /*const LLVector4a scale(0.5f);
+
+ for (U32 i = 0; i < face.mNumIndices; i+=3)
+ {
+ U16 idx1 = face.mIndices[i];
+ U16 idx2 = face.mIndices[i+1];
+ U16 idx3 = face.mIndices[i+2];
+
+ LLVector4a v1; v1.setMul(face.mPositions[idx1], scale);
+ LLVector4a v2; v2.setMul(face.mPositions[idx2], scale);
+ LLVector4a v3; v3.setMul(face.mPositions[idx3], scale);
+
+ if (ll_is_degenerate(v1,v2,v3))
+ {
+ llwarns << "Degenerate face found!" << llendl;
+ return false;
+ }
+ }*/
+
+ return true;
+}
+
+bool validate_model(const LLModel* mdl)
+{
+ if (mdl->getNumVolumeFaces() == 0)
+ {
+ llwarns << "Model has no faces!" << llendl;
+ return false;
+ }
+
+ for (S32 i = 0; i < mdl->getNumVolumeFaces(); ++i)
+ {
+ if (mdl->getVolumeFace(i).mNumVertices == 0)
+ {
+ llwarns << "Face has no vertices." << llendl;
+ return false;
+ }
+
+ if (mdl->getVolumeFace(i).mNumIndices == 0)
+ {
+ llwarns << "Face has no indices." << llendl;
+ return false;
+ }
+
+ if (!validate_face(mdl->getVolumeFace(i)))
+ {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+BOOL stop_gloderror()
+{
+ GLuint error = glodGetError();
+
+ if (error != GLOD_NO_ERROR)
+ {
+ llwarns << "GLOD error detected, cannot generate LOD: " << std::hex << error << llendl;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+
+LLMeshFilePicker::LLMeshFilePicker(LLModelPreview* mp, S32 lod)
+ : LLFilePickerThread(LLFilePicker::FFLOAD_COLLADA)
+ {
+ mMP = mp;
+ mLOD = lod;
+ }
+
+void LLMeshFilePicker::notify(const std::string& filename)
+{
+ mMP->loadModel(mFile, mLOD);
+}
+
+
+//-----------------------------------------------------------------------------
+// LLFloaterModelPreview()
+//-----------------------------------------------------------------------------
+LLFloaterModelPreview::LLFloaterModelPreview(const LLSD& key) :
+LLFloaterModelUploadBase(key),
+mUploadBtn(NULL),
+mCalculateBtn(NULL)
+{
+ sInstance = this;
+ mLastMouseX = 0;
+ mLastMouseY = 0;
+ mGLName = 0;
+ mStatusLock = new LLMutex(NULL);
+ mModelPreview = NULL;
+
+ mLODMode[LLModel::LOD_HIGH] = 0;
+ for (U32 i = 0; i < LLModel::LOD_HIGH; i++)
+ {
+ mLODMode[i] = 1;
+ }
+}
+
+//-----------------------------------------------------------------------------
+// postBuild()
+//-----------------------------------------------------------------------------
+BOOL LLFloaterModelPreview::postBuild()
+{
+ if (!LLFloater::postBuild())
+ {
+ return FALSE;
+ }
+
+ childSetCommitCallback("cancel_btn", onCancel, this);
+ childSetCommitCallback("crease_angle", onGenerateNormalsCommit, this);
+ getChild<LLCheckBoxCtrl>("gen_normals")->setCommitCallback(boost::bind(&LLFloaterModelPreview::toggleGenarateNormals, this));
+
+ childSetCommitCallback("lod_generate", onAutoFillCommit, this);
+
+ for (S32 lod = 0; lod <= LLModel::LOD_HIGH; ++lod)
+ {
+ LLComboBox* lod_source_combo = getChild<LLComboBox>("lod_source_" + lod_name[lod]);
+ lod_source_combo->setCommitCallback(boost::bind(&LLFloaterModelPreview::onLoDSourceCommit, this, lod));
+ lod_source_combo->setCurrentByIndex(mLODMode[lod]);
+
+ getChild<LLButton>("lod_browse_" + lod_name[lod])->setCommitCallback(boost::bind(&LLFloaterModelPreview::onBrowseLOD, this, lod));
+ getChild<LLComboBox>("lod_mode_" + lod_name[lod])->setCommitCallback(boost::bind(&LLFloaterModelPreview::onLODParamCommit, this, lod, false));
+ getChild<LLSpinCtrl>("lod_error_threshold_" + lod_name[lod])->setCommitCallback(boost::bind(&LLFloaterModelPreview::onLODParamCommit, this, lod, false));
+ getChild<LLSpinCtrl>("lod_triangle_limit_" + lod_name[lod])->setCommitCallback(boost::bind(&LLFloaterModelPreview::onLODParamCommit, this, lod, true));
+ }
+
+ childSetCommitCallback("upload_skin", boost::bind(&LLFloaterModelPreview::toggleCalculateButton, this), NULL);
+ childSetCommitCallback("upload_joints", boost::bind(&LLFloaterModelPreview::toggleCalculateButton, this), NULL);
+ childSetCommitCallback("upload_textures", boost::bind(&LLFloaterModelPreview::toggleCalculateButton, this), NULL);
+
+ childSetTextArg("status", "[STATUS]", getString("status_idle"));
+
+ childSetAction("ok_btn", onUpload, this);
+ childDisable("ok_btn");
+
+ childSetAction("reset_btn", onReset, this);
+
+ childSetCommitCallback("preview_lod_combo", onPreviewLODCommit, this);
+
+ childSetCommitCallback("upload_skin", onUploadSkinCommit, this);
+ childSetCommitCallback("upload_joints", onUploadJointsCommit, this);
+
+ childSetCommitCallback("import_scale", onImportScaleCommit, this);
+ childSetCommitCallback("pelvis_offset", onPelvisOffsetCommit, this);
+
+ getChild<LLCheckBoxCtrl>("show_edges")->setCommitCallback(boost::bind(&LLFloaterModelPreview::onViewOptionChecked, this, _1));
+ getChild<LLCheckBoxCtrl>("show_physics")->setCommitCallback(boost::bind(&LLFloaterModelPreview::onViewOptionChecked, this, _1));
+ getChild<LLCheckBoxCtrl>("show_textures")->setCommitCallback(boost::bind(&LLFloaterModelPreview::onViewOptionChecked, this, _1));
+ getChild<LLCheckBoxCtrl>("show_skin_weight")->setCommitCallback(boost::bind(&LLFloaterModelPreview::onViewOptionChecked, this, _1));
+ getChild<LLCheckBoxCtrl>("show_joint_positions")->setCommitCallback(boost::bind(&LLFloaterModelPreview::onViewOptionChecked, this, _1));
+
+ childDisable("upload_skin");
+ childDisable("upload_joints");
+
+ initDecompControls();
+
+ LLView* preview_panel = getChild<LLView>("preview_panel");
+
+ mPreviewRect = preview_panel->getRect();
+
+ initModelPreview();
+
+ //set callbacks for left click on line editor rows
+ for (U32 i = 0; i <= LLModel::LOD_HIGH; i++)
+ {
+ LLTextBox* text = getChild<LLTextBox>(lod_label_name[i]);
+ if (text)
+ {
+ text->setMouseDownCallback(boost::bind(&LLModelPreview::setPreviewLOD, mModelPreview, i));
+ }
+
+ text = getChild<LLTextBox>(lod_triangles_name[i]);
+ if (text)
+ {
+ text->setMouseDownCallback(boost::bind(&LLModelPreview::setPreviewLOD, mModelPreview, i));
+ }
+
+ text = getChild<LLTextBox>(lod_vertices_name[i]);
+ if (text)
+ {
+ text->setMouseDownCallback(boost::bind(&LLModelPreview::setPreviewLOD, mModelPreview, i));
+ }
+
+ text = getChild<LLTextBox>(lod_status_name[i]);
+ if (text)
+ {
+ text->setMouseDownCallback(boost::bind(&LLModelPreview::setPreviewLOD, mModelPreview, i));
+ }
+ }
+ std::string current_grid = LLGridManager::getInstance()->getGridLabel();
+ std::transform(current_grid.begin(),current_grid.end(),current_grid.begin(),::tolower);
+ std::string validate_url;
+ if (current_grid == "agni")
+ {
+ validate_url = "http://secondlife.com/my/account/mesh.php";
+ }
+ else if (current_grid == "damballah")
+ {
+ // Staging grid has its own naming scheme.
+ validate_url = "http://secondlife-staging.com/my/account/mesh.php";
+ }
+ else
+ {
+ validate_url = llformat("http://secondlife.%s.lindenlab.com/my/account/mesh.php",current_grid.c_str());
+ }
+ getChild<LLTextBox>("warning_message")->setTextArg("[VURL]", validate_url);
+
+ mUploadBtn = getChild<LLButton>("ok_btn");
+ mCalculateBtn = getChild<LLButton>("calculate_btn");
+
+ mCalculateBtn->setClickedCallback(boost::bind(&LLFloaterModelPreview::onClickCalculateBtn, this));
+
+ toggleCalculateButton(true);
+
+ return TRUE;
+}
+
+//-----------------------------------------------------------------------------
+// LLFloaterModelPreview()
+//-----------------------------------------------------------------------------
+LLFloaterModelPreview::~LLFloaterModelPreview()
+{
+ sInstance = NULL;
+
+ if ( mModelPreview )
+ {
+ delete mModelPreview;
+ }
+
+ if (mGLName)
+ {
+ LLImageGL::deleteTextures(1, &mGLName );
+ }
+
+ delete mStatusLock;
+ mStatusLock = NULL;
+}
+
+void LLFloaterModelPreview::initModelPreview()
+{
+ if (mModelPreview)
+ {
+ delete mModelPreview;
+ }
+
+ mModelPreview = new LLModelPreview(512, 512, this );
+ mModelPreview->setPreviewTarget(16.f);
+ mModelPreview->setDetailsCallback(boost::bind(&LLFloaterModelPreview::setDetails, this, _1, _2, _3, _4, _5));
+ mModelPreview->setModelUpdatedCallback(boost::bind(&LLFloaterModelPreview::toggleCalculateButton, this, _1));
+}
+
+void LLFloaterModelPreview::onViewOptionChecked(LLUICtrl* ctrl)
+{
+ if (mModelPreview)
+ {
+ mModelPreview->mViewOption[ctrl->getName()] = !mModelPreview->mViewOption[ctrl->getName()];
+
+ mModelPreview->refresh();
+ }
+}
+
+bool LLFloaterModelPreview::isViewOptionChecked(const LLSD& userdata)
+{
+ if (mModelPreview)
+ {
+ return mModelPreview->mViewOption[userdata.asString()];
+ }
+
+ return false;
+}
+
+bool LLFloaterModelPreview::isViewOptionEnabled(const LLSD& userdata)
+{
+ return childIsEnabled(userdata.asString());
+}
+
+void LLFloaterModelPreview::setViewOptionEnabled(const std::string& option, bool enabled)
+{
+ childSetEnabled(option, enabled);
+}
+
+void LLFloaterModelPreview::enableViewOption(const std::string& option)
+{
+ setViewOptionEnabled(option, true);
+}
+
+void LLFloaterModelPreview::disableViewOption(const std::string& option)
+{
+ setViewOptionEnabled(option, false);
+}
+
+void LLFloaterModelPreview::loadModel(S32 lod)
+{
+ mModelPreview->mLoading = true;
+
+ (new LLMeshFilePicker(mModelPreview, lod))->getFile();
+}
+
+void LLFloaterModelPreview::loadModel(S32 lod, const std::string& file_name, bool force_disable_slm)
+{
+ mModelPreview->mLoading = true;
+
+ mModelPreview->loadModel(file_name, lod, force_disable_slm);
+}
+
+void LLFloaterModelPreview::onClickCalculateBtn()
+{
+ mModelPreview->rebuildUploadData();
+
+ bool upload_skinweights = childGetValue("upload_skin").asBoolean();
+ bool upload_joint_positions = childGetValue("upload_joints").asBoolean();
+
+ mUploadModelUrl.clear();
+
+ gMeshRepo.uploadModel(mModelPreview->mUploadData, mModelPreview->mPreviewScale,
+ childGetValue("upload_textures").asBoolean(), upload_skinweights, upload_joint_positions, mUploadModelUrl, false,
+ getWholeModelFeeObserverHandle());
+
+ toggleCalculateButton(false);
+ mUploadBtn->setEnabled(false);
+}
+
+//static
+void LLFloaterModelPreview::onImportScaleCommit(LLUICtrl*,void* userdata)
+{
+ LLFloaterModelPreview *fp =(LLFloaterModelPreview *)userdata;
+
+ if (!fp->mModelPreview)
+ {
+ return;
+ }
+
+ fp->mModelPreview->mDirty = true;
+
+ fp->toggleCalculateButton(true);
+
+ fp->mModelPreview->refresh();
+}
+//static
+void LLFloaterModelPreview::onPelvisOffsetCommit( LLUICtrl*, void* userdata )
+{
+ LLFloaterModelPreview *fp =(LLFloaterModelPreview*)userdata;
+
+ if (!fp->mModelPreview)
+ {
+ return;
+ }
+
+ fp->mModelPreview->mDirty = true;
+
+ fp->toggleCalculateButton(true);
+
+ fp->mModelPreview->refresh();
+}
+
+//static
+void LLFloaterModelPreview::onUploadJointsCommit(LLUICtrl*,void* userdata)
+{
+ LLFloaterModelPreview *fp =(LLFloaterModelPreview *)userdata;
+
+ if (!fp->mModelPreview)
+ {
+ return;
+ }
+
+ fp->mModelPreview->refresh();
+}
+
+//static
+void LLFloaterModelPreview::onUploadSkinCommit(LLUICtrl*,void* userdata)
+{
+ LLFloaterModelPreview *fp =(LLFloaterModelPreview *)userdata;
+
+ if (!fp->mModelPreview)
+ {
+ return;
+ }
+ fp->mModelPreview->refresh();
+ fp->mModelPreview->resetPreviewTarget();
+ fp->mModelPreview->clearBuffers();
+}
+
+//static
+void LLFloaterModelPreview::onPreviewLODCommit(LLUICtrl* ctrl, void* userdata)
+{
+ LLFloaterModelPreview *fp =(LLFloaterModelPreview *)userdata;
+
+ if (!fp->mModelPreview)
+ {
+ return;
+ }
+
+ S32 which_mode = 0;
+
+ LLComboBox* combo = (LLComboBox*) ctrl;
+
+ which_mode = (NUM_LOD-1)-combo->getFirstSelectedIndex(); // combo box list of lods is in reverse order
+
+ fp->mModelPreview->setPreviewLOD(which_mode);
+}
+
+//static
+void LLFloaterModelPreview::onGenerateNormalsCommit(LLUICtrl* ctrl, void* userdata)
+{
+ LLFloaterModelPreview* fp = (LLFloaterModelPreview*) userdata;
+
+ fp->mModelPreview->generateNormals();
+}
+
+void LLFloaterModelPreview::toggleGenarateNormals()
+{
+ bool enabled = childGetValue("gen_normals").asBoolean();
+ childSetEnabled("crease_angle", enabled);
+}
+
+//static
+void LLFloaterModelPreview::onExplodeCommit(LLUICtrl* ctrl, void* userdata)
+{
+ LLFloaterModelPreview* fp = LLFloaterModelPreview::sInstance;
+
+ fp->mModelPreview->refresh();
+}
+
+//static
+void LLFloaterModelPreview::onAutoFillCommit(LLUICtrl* ctrl, void* userdata)
+{
+ LLFloaterModelPreview* fp = (LLFloaterModelPreview*) userdata;
+
+ fp->mModelPreview->genLODs();
+}
+
+void LLFloaterModelPreview::onLODParamCommit(S32 lod, bool enforce_tri_limit)
+{
+ mModelPreview->onLODParamCommit(lod, enforce_tri_limit);
+}
+
+
+//-----------------------------------------------------------------------------
+// draw()
+//-----------------------------------------------------------------------------
+void LLFloaterModelPreview::draw()
+{
+ LLFloater::draw();
+ LLRect r = getRect();
+
+ mModelPreview->update();
+
+ if (!mModelPreview->mLoading)
+ {
+ if ( mModelPreview->getLoadState() == LLModelLoader::ERROR_MATERIALS )
+ {
+ childSetTextArg("status", "[STATUS]", getString("status_material_mismatch"));
+ }
+ else
+ if ( mModelPreview->getLoadState() > LLModelLoader::ERROR_PARSING )
+ {
+ childSetTextArg("status", "[STATUS]", getString(LLModel::getStatusString(mModelPreview->getLoadState() - LLModelLoader::ERROR_PARSING)));
+ }
+ else
+ if ( mModelPreview->getLoadState() == LLModelLoader::ERROR_PARSING )
+ {
+ childSetTextArg("status", "[STATUS]", getString("status_parse_error"));
+ toggleCalculateButton(false);
+ }
+ else
+ {
+ childSetTextArg("status", "[STATUS]", getString("status_idle"));
+ }
+ }
+
+ childSetTextArg("prim_cost", "[PRIM_COST]", llformat("%d", mModelPreview->mResourceCost));
+ childSetTextArg("description_label", "[TEXTURES]", llformat("%d", mModelPreview->mTextureSet.size()));
+
+ if (mModelPreview)
+ {
+ gGL.color3f(1.f, 1.f, 1.f);
+
+ gGL.getTexUnit(0)->bind(mModelPreview);
+
+
+ LLView* preview_panel = getChild<LLView>("preview_panel");
+
+ LLRect rect = preview_panel->getRect();
+ if (rect != mPreviewRect)
+ {
+ mModelPreview->refresh();
+ mPreviewRect = preview_panel->getRect();
+ }
+
+ gGL.begin( LLRender::QUADS );
+ {
+ gGL.texCoord2f(0.f, 1.f);
+ gGL.vertex2i(mPreviewRect.mLeft, mPreviewRect.mTop-1);
+ gGL.texCoord2f(0.f, 0.f);
+ gGL.vertex2i(mPreviewRect.mLeft, mPreviewRect.mBottom);
+ gGL.texCoord2f(1.f, 0.f);
+ gGL.vertex2i(mPreviewRect.mRight-1, mPreviewRect.mBottom);
+ gGL.texCoord2f(1.f, 1.f);
+ gGL.vertex2i(mPreviewRect.mRight-1, mPreviewRect.mTop-1);
+ }
+ gGL.end();
+
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+ }
+}
+
+//-----------------------------------------------------------------------------
+// handleMouseDown()
+//-----------------------------------------------------------------------------
+BOOL LLFloaterModelPreview::handleMouseDown(S32 x, S32 y, MASK mask)
+{
+ if (mPreviewRect.pointInRect(x, y))
+ {
+ bringToFront( x, y );
+ gFocusMgr.setMouseCapture(this);
+ gViewerWindow->hideCursor();
+ mLastMouseX = x;
+ mLastMouseY = y;
+ return TRUE;
+ }
+
+ return LLFloater::handleMouseDown(x, y, mask);
+}
+
+//-----------------------------------------------------------------------------
+// handleMouseUp()
+//-----------------------------------------------------------------------------
+BOOL LLFloaterModelPreview::handleMouseUp(S32 x, S32 y, MASK mask)
+{
+ gFocusMgr.setMouseCapture(FALSE);
+ gViewerWindow->showCursor();
+ return LLFloater::handleMouseUp(x, y, mask);
+}
+
+//-----------------------------------------------------------------------------
+// handleHover()
+//-----------------------------------------------------------------------------
+BOOL LLFloaterModelPreview::handleHover (S32 x, S32 y, MASK mask)
+{
+ MASK local_mask = mask & ~MASK_ALT;
+
+ if (mModelPreview && hasMouseCapture())
+ {
+ if (local_mask == MASK_PAN)
+ {
+ // pan here
+ mModelPreview->pan((F32)(x - mLastMouseX) * -0.005f, (F32)(y - mLastMouseY) * -0.005f);
+ }
+ else if (local_mask == MASK_ORBIT)
+ {
+ F32 yaw_radians = (F32)(x - mLastMouseX) * -0.01f;
+ F32 pitch_radians = (F32)(y - mLastMouseY) * 0.02f;
+
+ mModelPreview->rotate(yaw_radians, pitch_radians);
+ }
+ else
+ {
+
+ F32 yaw_radians = (F32)(x - mLastMouseX) * -0.01f;
+ F32 zoom_amt = (F32)(y - mLastMouseY) * 0.02f;
+
+ mModelPreview->rotate(yaw_radians, 0.f);
+ mModelPreview->zoom(zoom_amt);
+ }
+
+
+ mModelPreview->refresh();
+
+ LLUI::setMousePositionLocal(this, mLastMouseX, mLastMouseY);
+ }
+
+ if (!mPreviewRect.pointInRect(x, y) || !mModelPreview)
+ {
+ return LLFloater::handleHover(x, y, mask);
+ }
+ else if (local_mask == MASK_ORBIT)
+ {
+ gViewerWindow->setCursor(UI_CURSOR_TOOLCAMERA);
+ }
+ else if (local_mask == MASK_PAN)
+ {
+ gViewerWindow->setCursor(UI_CURSOR_TOOLPAN);
+ }
+ else
+ {
+ gViewerWindow->setCursor(UI_CURSOR_TOOLZOOMIN);
+ }
+
+ return TRUE;
+}
+
+//-----------------------------------------------------------------------------
+// handleScrollWheel()
+//-----------------------------------------------------------------------------
+BOOL LLFloaterModelPreview::handleScrollWheel(S32 x, S32 y, S32 clicks)
+{
+ if (mPreviewRect.pointInRect(x, y) && mModelPreview)
+ {
+ mModelPreview->zoom((F32)clicks * -0.2f);
+ mModelPreview->refresh();
+ }
+
+ return TRUE;
+}
+
+/*virtual*/
+void LLFloaterModelPreview::onOpen(const LLSD& key)
+{
+ requestAgentUploadPermissions();
+}
+
+//static
+void LLFloaterModelPreview::onPhysicsParamCommit(LLUICtrl* ctrl, void* data)
+{
+ if (LLConvexDecomposition::getInstance() == NULL)
+ {
+ llinfos << "convex decomposition tool is a stub on this platform. cannot get decomp." << llendl;
+ return;
+ }
+
+ if (sInstance)
+ {
+ LLCDParam* param = (LLCDParam*) data;
+ std::string name(param->mName);
+
+ LLSD value = ctrl->getValue();
+
+ if("Retain%" == name)
+ {
+ value = ctrl->getValue().asReal() / RETAIN_COEFFICIENT;
+ }
+
+ sInstance->mDecompParams[name] = value;
+
+ if (name == "Simplify Method")
+ {
+ bool show_retain = false;
+ bool show_detail = true;
+
+ if (ctrl->getValue().asInteger() == 0)
+ {
+ show_retain = true;
+ show_detail = false;
+ }
+
+ sInstance->childSetVisible("Retain%", show_retain);
+ sInstance->childSetVisible("Retain%_label", show_retain);
+
+ sInstance->childSetVisible("Detail Scale", show_detail);
+ sInstance->childSetVisible("Detail Scale label", show_detail);
+ }
+ }
+}
+
+//static
+void LLFloaterModelPreview::onPhysicsStageExecute(LLUICtrl* ctrl, void* data)
+{
+ LLCDStageData* stage_data = (LLCDStageData*) data;
+ std::string stage = stage_data->mName;
+
+ if (sInstance)
+ {
+ if (!sInstance->mCurRequest.empty())
+ {
+ llinfos << "Decomposition request still pending." << llendl;
+ return;
+ }
+
+ if (sInstance->mModelPreview)
+ {
+ for (S32 i = 0; i < sInstance->mModelPreview->mModel[LLModel::LOD_PHYSICS].size(); ++i)
+ {
+ LLModel* mdl = sInstance->mModelPreview->mModel[LLModel::LOD_PHYSICS][i];
+ DecompRequest* request = new DecompRequest(stage, mdl);
+ sInstance->mCurRequest.insert(request);
+ gMeshRepo.mDecompThread->submitRequest(request);
+ }
+ }
+
+ if (stage == "Decompose")
+ {
+ sInstance->setStatusMessage(sInstance->getString("decomposing"));
+ sInstance->childSetVisible("Decompose", false);
+ sInstance->childSetVisible("decompose_cancel", true);
+ sInstance->childDisable("Simplify");
+ }
+ else if (stage == "Simplify")
+ {
+ sInstance->setStatusMessage(sInstance->getString("simplifying"));
+ sInstance->childSetVisible("Simplify", false);
+ sInstance->childSetVisible("simplify_cancel", true);
+ sInstance->childDisable("Decompose");
+ }
+ }
+}
+
+//static
+void LLFloaterModelPreview::onPhysicsBrowse(LLUICtrl* ctrl, void* userdata)
+{
+ sInstance->loadModel(LLModel::LOD_PHYSICS);
+}
+
+//static
+void LLFloaterModelPreview::onPhysicsUseLOD(LLUICtrl* ctrl, void* userdata)
+{
+ S32 num_lods = 4;
+ S32 which_mode;
+
+ LLCtrlSelectionInterface* iface = sInstance->childGetSelectionInterface("physics_lod_combo");
+ if (iface)
+ {
+ which_mode = iface->getFirstSelectedIndex();
+ }
+ else
+ {
+ llwarns << "no iface" << llendl;
+ return;
+ }
+
+ if (which_mode <= 0)
+ {
+ llwarns << "which_mode out of range, " << which_mode << llendl;
+ }
+
+ S32 file_mode = iface->getItemCount() - 1;
+ if (which_mode < file_mode)
+ {
+ S32 which_lod = num_lods - which_mode;
+ sInstance->mModelPreview->setPhysicsFromLOD(which_lod);
+ }
+
+ LLModelPreview *model_preview = sInstance->mModelPreview;
+ if (model_preview)
+ {
+ model_preview->refresh();
+ model_preview->updateStatusMessages();
+ }
+}
+
+//static
+void LLFloaterModelPreview::onCancel(LLUICtrl* ctrl, void* data)
+{
+ if (sInstance)
+ {
+ sInstance->closeFloater(false);
+ }
+}
+
+//static
+void LLFloaterModelPreview::onPhysicsStageCancel(LLUICtrl* ctrl, void*data)
+{
+ if (sInstance)
+ {
+ for (std::set<LLPointer<DecompRequest> >::iterator iter = sInstance->mCurRequest.begin();
+ iter != sInstance->mCurRequest.end(); ++iter)
+ {
+ DecompRequest* req = *iter;
+ req->mContinue = 0;
+ }
+
+ sInstance->mCurRequest.clear();
+
+ if (sInstance->mModelPreview)
+ {
+ sInstance->mModelPreview->updateStatusMessages();
+ }
+ }
+}
+
+void LLFloaterModelPreview::initDecompControls()
+{
+ LLSD key;
+
+ childSetCommitCallback("simplify_cancel", onPhysicsStageCancel, NULL);
+ childSetCommitCallback("decompose_cancel", onPhysicsStageCancel, NULL);
+
+ childSetCommitCallback("physics_lod_combo", onPhysicsUseLOD, NULL);
+ childSetCommitCallback("physics_browse", onPhysicsBrowse, NULL);
+
+ static const LLCDStageData* stage = NULL;
+ static S32 stage_count = 0;
+
+ if (!stage && LLConvexDecomposition::getInstance() != NULL)
+ {
+ stage_count = LLConvexDecomposition::getInstance()->getStages(&stage);
+ }
+
+ static const LLCDParam* param = NULL;
+ static S32 param_count = 0;
+ if (!param && LLConvexDecomposition::getInstance() != NULL)
+ {
+ param_count = LLConvexDecomposition::getInstance()->getParameters(&param);
+ }
+
+ for (S32 j = stage_count-1; j >= 0; --j)
+ {
+ LLButton* button = getChild<LLButton>(stage[j].mName);
+ if (button)
+ {
+ button->setCommitCallback(onPhysicsStageExecute, (void*) &stage[j]);
+ }
+
+ gMeshRepo.mDecompThread->mStageID[stage[j].mName] = j;
+ // protected against stub by stage_count being 0 for stub above
+ LLConvexDecomposition::getInstance()->registerCallback(j, LLPhysicsDecomp::llcdCallback);
+
+ //llinfos << "Physics decomp stage " << stage[j].mName << " (" << j << ") parameters:" << llendl;
+ //llinfos << "------------------------------------" << llendl;
+
+ for (S32 i = 0; i < param_count; ++i)
+ {
+ if (param[i].mStage != j)
+ {
+ continue;
+ }
+
+ std::string name(param[i].mName ? param[i].mName : "");
+ std::string description(param[i].mDescription ? param[i].mDescription : "");
+
+ std::string type = "unknown";
+
+ llinfos << name << " - " << description << llendl;
+
+ if (param[i].mType == LLCDParam::LLCD_FLOAT)
+ {
+ mDecompParams[param[i].mName] = LLSD(param[i].mDefault.mFloat);
+ //llinfos << "Type: float, Default: " << param[i].mDefault.mFloat << llendl;
+
+
+ LLUICtrl* ctrl = getChild<LLUICtrl>(name);
+ if (LLSliderCtrl* slider = dynamic_cast<LLSliderCtrl*>(ctrl))
+ {
+ slider->setMinValue(param[i].mDetails.mRange.mLow.mFloat);
+ slider->setMaxValue(param[i].mDetails.mRange.mHigh.mFloat);
+ slider->setIncrement(param[i].mDetails.mRange.mDelta.mFloat);
+ slider->setValue(param[i].mDefault.mFloat);
+ slider->setCommitCallback(onPhysicsParamCommit, (void*) &param[i]);
+ }
+ else if (LLSpinCtrl* spinner = dynamic_cast<LLSpinCtrl*>(ctrl))
+ {
+ bool is_retain_ctrl = "Retain%" == name;
+ double coefficient = is_retain_ctrl ? RETAIN_COEFFICIENT : 1.f;
+
+ spinner->setMinValue(param[i].mDetails.mRange.mLow.mFloat * coefficient);
+ spinner->setMaxValue(param[i].mDetails.mRange.mHigh.mFloat * coefficient);
+ spinner->setIncrement(param[i].mDetails.mRange.mDelta.mFloat * coefficient);
+ spinner->setValue(param[i].mDefault.mFloat * coefficient);
+ spinner->setCommitCallback(onPhysicsParamCommit, (void*) &param[i]);
+ }
+ else if (LLComboBox* combo_box = dynamic_cast<LLComboBox*>(ctrl))
+ {
+ float min = param[i].mDetails.mRange.mLow.mFloat;
+ float max = param[i].mDetails.mRange.mHigh.mFloat;
+ float delta = param[i].mDetails.mRange.mDelta.mFloat;
+
+ if ("Cosine%" == name)
+ {
+ createSmoothComboBox(combo_box, min, max);
+ }
+ else
+ {
+ for(float value = min; value <= max; value += delta)
+ {
+ std::string label = llformat("%.1f", value);
+ combo_box->add(label, value, ADD_BOTTOM, true);
+ }
+ combo_box->setValue(param[i].mDefault.mFloat);
+
+ }
+
+ combo_box->setCommitCallback(onPhysicsParamCommit, (void*) &param[i]);
+ }
+ }
+ else if (param[i].mType == LLCDParam::LLCD_INTEGER)
+ {
+ mDecompParams[param[i].mName] = LLSD(param[i].mDefault.mIntOrEnumValue);
+ //llinfos << "Type: integer, Default: " << param[i].mDefault.mIntOrEnumValue << llendl;
+
+
+ LLUICtrl* ctrl = getChild<LLUICtrl>(name);
+ if (LLSliderCtrl* slider = dynamic_cast<LLSliderCtrl*>(ctrl))
+ {
+ slider->setMinValue(param[i].mDetails.mRange.mLow.mIntOrEnumValue);
+ slider->setMaxValue(param[i].mDetails.mRange.mHigh.mIntOrEnumValue);
+ slider->setIncrement(param[i].mDetails.mRange.mDelta.mIntOrEnumValue);
+ slider->setValue(param[i].mDefault.mIntOrEnumValue);
+ slider->setCommitCallback(onPhysicsParamCommit, (void*) &param[i]);
+ }
+ else if (LLComboBox* combo_box = dynamic_cast<LLComboBox*>(ctrl))
+ {
+ for(int k = param[i].mDetails.mRange.mLow.mIntOrEnumValue; k<=param[i].mDetails.mRange.mHigh.mIntOrEnumValue; k+=param[i].mDetails.mRange.mDelta.mIntOrEnumValue)
+ {
+ std::string name = llformat("%.1d", k);
+ combo_box->add(name, k, ADD_BOTTOM, true);
+ }
+ combo_box->setValue(param[i].mDefault.mIntOrEnumValue);
+ combo_box->setCommitCallback(onPhysicsParamCommit, (void*) &param[i]);
+ }
+ }
+ else if (param[i].mType == LLCDParam::LLCD_BOOLEAN)
+ {
+ mDecompParams[param[i].mName] = LLSD(param[i].mDefault.mBool);
+ //llinfos << "Type: boolean, Default: " << (param[i].mDefault.mBool ? "True" : "False") << llendl;
+
+ LLCheckBoxCtrl* check_box = getChild<LLCheckBoxCtrl>(name);
+ if (check_box)
+ {
+ check_box->setValue(param[i].mDefault.mBool);
+ check_box->setCommitCallback(onPhysicsParamCommit, (void*) &param[i]);
+ }
+ }
+ else if (param[i].mType == LLCDParam::LLCD_ENUM)
+ {
+ mDecompParams[param[i].mName] = LLSD(param[i].mDefault.mIntOrEnumValue);
+ //llinfos << "Type: enum, Default: " << param[i].mDefault.mIntOrEnumValue << llendl;
+
+ { //plug into combo box
+
+ //llinfos << "Accepted values: " << llendl;
+ LLComboBox* combo_box = getChild<LLComboBox>(name);
+ for (S32 k = 0; k < param[i].mDetails.mEnumValues.mNumEnums; ++k)
+ {
+ //llinfos << param[i].mDetails.mEnumValues.mEnumsArray[k].mValue
+ // << " - " << param[i].mDetails.mEnumValues.mEnumsArray[k].mName << llendl;
+
+ std::string name(param[i].mDetails.mEnumValues.mEnumsArray[k].mName);
+ std::string localized_name;
+ bool is_localized = LLTrans::findString(localized_name, name);
+
+ combo_box->add(is_localized ? localized_name : name,
+ LLSD::Integer(param[i].mDetails.mEnumValues.mEnumsArray[k].mValue));
+ }
+ combo_box->setValue(param[i].mDefault.mIntOrEnumValue);
+ combo_box->setCommitCallback(onPhysicsParamCommit, (void*) &param[i]);
+ }
+
+ //llinfos << "----" << llendl;
+ }
+ //llinfos << "-----------------------------" << llendl;
+ }
+ }
+
+ childSetCommitCallback("physics_explode", LLFloaterModelPreview::onExplodeCommit, this);
+}
+
+void LLFloaterModelPreview::createSmoothComboBox(LLComboBox* combo_box, float min, float max)
+{
+ float delta = (max - min) / SMOOTH_VALUES_NUMBER;
+ int ilabel = 0;
+
+ combo_box->add("0 (none)", ADD_BOTTOM, true);
+
+ for(float value = min + delta; value < max; value += delta)
+ {
+ std::string label = (++ilabel == SMOOTH_VALUES_NUMBER) ? "10 (max)" : llformat("%.1d", ilabel);
+ combo_box->add(label, value, ADD_BOTTOM, true);
+ }
+
+
+}
+
+//-----------------------------------------------------------------------------
+// onMouseCaptureLost()
+//-----------------------------------------------------------------------------
+// static
+void LLFloaterModelPreview::onMouseCaptureLostModelPreview(LLMouseHandler* handler)
+{
+ gViewerWindow->showCursor();
+}
+
+//-----------------------------------------------------------------------------
+// LLModelLoader
+//-----------------------------------------------------------------------------
+LLModelLoader::LLModelLoader( std::string filename, S32 lod, LLModelPreview* preview, JointTransformMap& jointMap,
+ std::deque<std::string>& jointsFromNodes )
+: mJointList( jointMap )
+, mJointsFromNode( jointsFromNodes )
+, LLThread("Model Loader"), mFilename(filename), mLod(lod), mPreview(preview), mFirstTransform(TRUE), mNumOfFetchingTextures(0)
+{
+ mJointMap["mPelvis"] = "mPelvis";
+ mJointMap["mTorso"] = "mTorso";
+ mJointMap["mChest"] = "mChest";
+ mJointMap["mNeck"] = "mNeck";
+ mJointMap["mHead"] = "mHead";
+ mJointMap["mSkull"] = "mSkull";
+ mJointMap["mEyeRight"] = "mEyeRight";
+ mJointMap["mEyeLeft"] = "mEyeLeft";
+ mJointMap["mCollarLeft"] = "mCollarLeft";
+ mJointMap["mShoulderLeft"] = "mShoulderLeft";
+ mJointMap["mElbowLeft"] = "mElbowLeft";
+ mJointMap["mWristLeft"] = "mWristLeft";
+ mJointMap["mCollarRight"] = "mCollarRight";
+ mJointMap["mShoulderRight"] = "mShoulderRight";
+ mJointMap["mElbowRight"] = "mElbowRight";
+ mJointMap["mWristRight"] = "mWristRight";
+ mJointMap["mHipRight"] = "mHipRight";
+ mJointMap["mKneeRight"] = "mKneeRight";
+ mJointMap["mAnkleRight"] = "mAnkleRight";
+ mJointMap["mFootRight"] = "mFootRight";
+ mJointMap["mToeRight"] = "mToeRight";
+ mJointMap["mHipLeft"] = "mHipLeft";
+ mJointMap["mKneeLeft"] = "mKneeLeft";
+ mJointMap["mAnkleLeft"] = "mAnkleLeft";
+ mJointMap["mFootLeft"] = "mFootLeft";
+ mJointMap["mToeLeft"] = "mToeLeft";
+
+ mJointMap["avatar_mPelvis"] = "mPelvis";
+ mJointMap["avatar_mTorso"] = "mTorso";
+ mJointMap["avatar_mChest"] = "mChest";
+ mJointMap["avatar_mNeck"] = "mNeck";
+ mJointMap["avatar_mHead"] = "mHead";
+ mJointMap["avatar_mSkull"] = "mSkull";
+ mJointMap["avatar_mEyeRight"] = "mEyeRight";
+ mJointMap["avatar_mEyeLeft"] = "mEyeLeft";
+ mJointMap["avatar_mCollarLeft"] = "mCollarLeft";
+ mJointMap["avatar_mShoulderLeft"] = "mShoulderLeft";
+ mJointMap["avatar_mElbowLeft"] = "mElbowLeft";
+ mJointMap["avatar_mWristLeft"] = "mWristLeft";
+ mJointMap["avatar_mCollarRight"] = "mCollarRight";
+ mJointMap["avatar_mShoulderRight"] = "mShoulderRight";
+ mJointMap["avatar_mElbowRight"] = "mElbowRight";
+ mJointMap["avatar_mWristRight"] = "mWristRight";
+ mJointMap["avatar_mHipRight"] = "mHipRight";
+ mJointMap["avatar_mKneeRight"] = "mKneeRight";
+ mJointMap["avatar_mAnkleRight"] = "mAnkleRight";
+ mJointMap["avatar_mFootRight"] = "mFootRight";
+ mJointMap["avatar_mToeRight"] = "mToeRight";
+ mJointMap["avatar_mHipLeft"] = "mHipLeft";
+ mJointMap["avatar_mKneeLeft"] = "mKneeLeft";
+ mJointMap["avatar_mAnkleLeft"] = "mAnkleLeft";
+ mJointMap["avatar_mFootLeft"] = "mFootLeft";
+ mJointMap["avatar_mToeLeft"] = "mToeLeft";
+
+
+ mJointMap["hip"] = "mPelvis";
+ mJointMap["abdomen"] = "mTorso";
+ mJointMap["chest"] = "mChest";
+ mJointMap["neck"] = "mNeck";
+ mJointMap["head"] = "mHead";
+ mJointMap["figureHair"] = "mSkull";
+ mJointMap["lCollar"] = "mCollarLeft";
+ mJointMap["lShldr"] = "mShoulderLeft";
+ mJointMap["lForeArm"] = "mElbowLeft";
+ mJointMap["lHand"] = "mWristLeft";
+ mJointMap["rCollar"] = "mCollarRight";
+ mJointMap["rShldr"] = "mShoulderRight";
+ mJointMap["rForeArm"] = "mElbowRight";
+ mJointMap["rHand"] = "mWristRight";
+ mJointMap["rThigh"] = "mHipRight";
+ mJointMap["rShin"] = "mKneeRight";
+ mJointMap["rFoot"] = "mFootRight";
+ mJointMap["lThigh"] = "mHipLeft";
+ mJointMap["lShin"] = "mKneeLeft";
+ mJointMap["lFoot"] = "mFootLeft";
+
+ if (mPreview)
+ {
+ //only try to load from slm if viewer is configured to do so and this is the
+ //initial model load (not an LoD or physics shape)
+ mTrySLM = gSavedSettings.getBOOL("MeshImportUseSLM") && mPreview->mUploadData.empty();
+ mPreview->setLoadState(STARTING);
+ }
+ else
+ {
+ mTrySLM = false;
+ }
+
+ assert_main_thread();
+ sActiveLoaderList.push_back(this) ;
+}
+
+LLModelLoader::~LLModelLoader()
+{
+ assert_main_thread();
+ sActiveLoaderList.remove(this);
+}
+
+void stretch_extents(LLModel* model, LLMatrix4a& mat, LLVector4a& min, LLVector4a& max, BOOL& first_transform)
+{
+ LLVector4a box[] =
+ {
+ LLVector4a(-1, 1,-1),
+ LLVector4a(-1, 1, 1),
+ LLVector4a(-1,-1,-1),
+ LLVector4a(-1,-1, 1),
+ LLVector4a( 1, 1,-1),
+ LLVector4a( 1, 1, 1),
+ LLVector4a( 1,-1,-1),
+ LLVector4a( 1,-1, 1),
+ };
+
+ for (S32 j = 0; j < model->getNumVolumeFaces(); ++j)
+ {
+ const LLVolumeFace& face = model->getVolumeFace(j);
+
+ LLVector4a center;
+ center.setAdd(face.mExtents[0], face.mExtents[1]);
+ center.mul(0.5f);
+ LLVector4a size;
+ size.setSub(face.mExtents[1],face.mExtents[0]);
+ size.mul(0.5f);
+
+ for (U32 i = 0; i < 8; i++)
+ {
+ LLVector4a t;
+ t.setMul(size, box[i]);
+ t.add(center);
+
+ LLVector4a v;
+
+ mat.affineTransform(t, v);
+
+ if (first_transform)
+ {
+ first_transform = FALSE;
+ min = max = v;
+ }
+ else
+ {
+ update_min_max(min, max, v);
+ }
+ }
+ }
+}
+
+void stretch_extents(LLModel* model, LLMatrix4& mat, LLVector3& min, LLVector3& max, BOOL& first_transform)
+{
+ LLVector4a mina, maxa;
+ LLMatrix4a mata;
+
+ mata.loadu(mat);
+ mina.load3(min.mV);
+ maxa.load3(max.mV);
+
+ stretch_extents(model, mata, mina, maxa, first_transform);
+
+ min.set(mina.getF32ptr());
+ max.set(maxa.getF32ptr());
+}
+
+void LLModelLoader::run()
+{
+ doLoadModel();
+ doOnIdleOneTime(boost::bind(&LLModelLoader::loadModelCallback,this));
+}
+
+bool LLModelLoader::doLoadModel()
+{
+ //first, look for a .slm file of the same name that was modified later
+ //than the .dae
+
+ if (mTrySLM)
+ {
+ std::string filename = mFilename;
+
+ std::string::size_type i = filename.rfind(".");
+ if (i != std::string::npos)
+ {
+ filename.replace(i, filename.size()-1, ".slm");
+ llstat slm_status;
+ if (LLFile::stat(filename, &slm_status) == 0)
+ { //slm file exists
+ llstat dae_status;
+ if (LLFile::stat(mFilename, &dae_status) != 0 ||
+ dae_status.st_mtime < slm_status.st_mtime)
+ {
+ if (loadFromSLM(filename))
+ { //slm successfully loaded, if this fails, fall through and
+ //try loading from dae
+
+ mLod = -1; //successfully loading from an slm implicitly sets all
+ //LoDs
+ return true;
+ }
+ }
+ }
+ }
+ }
+
+ //no suitable slm exists, load from the .dae file
+ DAE dae;
+ domCOLLADA* dom = dae.open(mFilename);
+
+ if (!dom)
+ {
+ llinfos<<" Error with dae - traditionally indicates a corrupt file."<<llendl;
+ setLoadState( ERROR_PARSING );
+ return false;
+ }
+ //Dom version
+ daeString domVersion = dae.getDomVersion();
+ std::string sldom(domVersion);
+ llinfos<<"Collada Importer Version: "<<sldom<<llendl;
+ //Dae version
+ domVersionType docVersion = dom->getVersion();
+ //0=1.4
+ //1=1.4.1
+ //2=Currently unsupported, however may work
+ if (docVersion > 1 )
+ {
+ docVersion = VERSIONTYPE_COUNT;
+ }
+ llinfos<<"Dae version "<<colladaVersion[docVersion]<<llendl;
+
+
+ daeDatabase* db = dae.getDatabase();
+
+ daeInt count = db->getElementCount(NULL, COLLADA_TYPE_MESH);
+
+ daeDocument* doc = dae.getDoc(mFilename);
+ if (!doc)
+ {
+ llwarns << "can't find internal doc" << llendl;
+ return false;
+ }
+
+ daeElement* root = doc->getDomRoot();
+ if (!root)
+ {
+ llwarns << "document has no root" << llendl;
+ return false;
+ }
+
+ //Verify some basic properties of the dae
+ //1. Basic validity check on controller
+ U32 controllerCount = (int) db->getElementCount( NULL, "controller" );
+ bool result = false;
+ for ( int i=0; i<controllerCount; ++i )
+ {
+ domController* pController = NULL;
+ db->getElement( (daeElement**) &pController, i , NULL, "controller" );
+ result = mPreview->verifyController( pController );
+ if (!result)
+ {
+ setLoadState( ERROR_PARSING );
+ return true;
+ }
+ }
+
+
+ //get unit scale
+ mTransform.setIdentity();
+
+ domAsset::domUnit* unit = daeSafeCast<domAsset::domUnit>(root->getDescendant(daeElement::matchType(domAsset::domUnit::ID())));
+
+ if (unit)
+ {
+ F32 meter = unit->getMeter();
+ mTransform.mMatrix[0][0] = meter;
+ mTransform.mMatrix[1][1] = meter;
+ mTransform.mMatrix[2][2] = meter;
+ }
+
+ //get up axis rotation
+ LLMatrix4 rotation;
+
+ domUpAxisType up = UPAXISTYPE_Y_UP; // default is Y_UP
+ domAsset::domUp_axis* up_axis =
+ daeSafeCast<domAsset::domUp_axis>(root->getDescendant(daeElement::matchType(domAsset::domUp_axis::ID())));
+
+ if (up_axis)
+ {
+ up = up_axis->getValue();
+ }
+
+ if (up == UPAXISTYPE_X_UP)
+ {
+ rotation.initRotation(0.0f, 90.0f * DEG_TO_RAD, 0.0f);
+ }
+ else if (up == UPAXISTYPE_Y_UP)
+ {
+ rotation.initRotation(90.0f * DEG_TO_RAD, 0.0f, 0.0f);
+ }
+
+ rotation *= mTransform;
+ mTransform = rotation;
+
+
+ for (daeInt idx = 0; idx < count; ++idx)
+ { //build map of domEntities to LLModel
+ domMesh* mesh = NULL;
+ db->getElement((daeElement**) &mesh, idx, NULL, COLLADA_TYPE_MESH);
+
+ if (mesh)
+ {
+ LLPointer<LLModel> model = LLModel::loadModelFromDomMesh(mesh);
+
+ if(model->getStatus() != LLModel::NO_ERRORS)
+ {
+ setLoadState(ERROR_PARSING + model->getStatus()) ;
+ return false; //abort
+ }
+
+ if (model.notNull() && validate_model(model))
+ {
+ mModelList.push_back(model);
+ mModel[mesh] = model;
+ }
+ }
+ }
+
+ count = db->getElementCount(NULL, COLLADA_TYPE_SKIN);
+ for (daeInt idx = 0; idx < count; ++idx)
+ { //add skinned meshes as instances
+ domSkin* skin = NULL;
+ db->getElement((daeElement**) &skin, idx, NULL, COLLADA_TYPE_SKIN);
+
+ if (skin)
+ {
+ domGeometry* geom = daeSafeCast<domGeometry>(skin->getSource().getElement());
+
+ if (geom)
+ {
+ domMesh* mesh = geom->getMesh();
+ if (mesh)
+ {
+ LLModel* model = mModel[mesh];
+ if (model)
+ {
+ LLVector3 mesh_scale_vector;
+ LLVector3 mesh_translation_vector;
+ model->getNormalizedScaleTranslation(mesh_scale_vector, mesh_translation_vector);
+
+ LLMatrix4 normalized_transformation;
+ normalized_transformation.setTranslation(mesh_translation_vector);
+
+ LLMatrix4 mesh_scale;
+ mesh_scale.initScale(mesh_scale_vector);
+ mesh_scale *= normalized_transformation;
+ normalized_transformation = mesh_scale;
+
+ glh::matrix4f inv_mat((F32*) normalized_transformation.mMatrix);
+ inv_mat = inv_mat.inverse();
+ LLMatrix4 inverse_normalized_transformation(inv_mat.m);
+
+ domSkin::domBind_shape_matrix* bind_mat = skin->getBind_shape_matrix();
+
+ if (bind_mat)
+ { //get bind shape matrix
+ domFloat4x4& dom_value = bind_mat->getValue();
+
+ LLMeshSkinInfo& skin_info = model->mSkinInfo;
+
+ for (int i = 0; i < 4; i++)
+ {
+ for(int j = 0; j < 4; j++)
+ {
+ skin_info.mBindShapeMatrix.mMatrix[i][j] = dom_value[i + j*4];
+ }
+ }
+
+ LLMatrix4 trans = normalized_transformation;
+ trans *= skin_info.mBindShapeMatrix;
+ skin_info.mBindShapeMatrix = trans;
+ }
+
+
+ //Some collada setup for accessing the skeleton
+ daeElement* pElement = 0;
+ dae.getDatabase()->getElement( &pElement, 0, 0, "skeleton" );
+
+ //Try to get at the skeletal instance controller
+ domInstance_controller::domSkeleton* pSkeleton = daeSafeCast<domInstance_controller::domSkeleton>( pElement );
+ bool missingSkeletonOrScene = false;
+
+ //If no skeleton, do a breadth-first search to get at specific joints
+ bool rootNode = false;
+ bool skeletonWithNoRootNode = false;
+
+ //Need to test for a skeleton that does not have a root node
+ //This occurs when your instance controller does not have an associated scene
+ if ( pSkeleton )
+ {
+ daeElement* pSkeletonRootNode = pSkeleton->getValue().getElement();
+ if ( pSkeletonRootNode )
+ {
+ rootNode = true;
+ }
+ else
+ {
+ skeletonWithNoRootNode = true;
+ }
+
+ }
+ if ( !pSkeleton || !rootNode )
+ {
+ daeElement* pScene = root->getDescendant("visual_scene");
+ if ( !pScene )
+ {
+ llwarns<<"No visual scene - unable to parse bone offsets "<<llendl;
+ missingSkeletonOrScene = true;
+ }
+ else
+ {
+ //Get the children at this level
+ daeTArray< daeSmartRef<daeElement> > children = pScene->getChildren();
+ S32 childCount = children.getCount();
+
+ //Process any children that are joints
+ //Not all children are joints, some code be ambient lights, cameras, geometry etc..
+ for (S32 i = 0; i < childCount; ++i)
+ {
+ domNode* pNode = daeSafeCast<domNode>(children[i]);
+ if ( isNodeAJoint( pNode ) )
+ {
+ processJointNode( pNode, mJointList );
+ }
+ }
+ }
+ }
+ else
+ //Has Skeleton
+ {
+ //Get the root node of the skeleton
+ daeElement* pSkeletonRootNode = pSkeleton->getValue().getElement();
+ if ( pSkeletonRootNode )
+ {
+ //Once we have the root node - start acccessing it's joint components
+ const int jointCnt = mJointMap.size();
+ std::map<std::string, std::string> :: const_iterator jointIt = mJointMap.begin();
+
+ //Loop over all the possible joints within the .dae - using the allowed joint list in the ctor.
+ for ( int i=0; i<jointCnt; ++i, ++jointIt )
+ {
+ //Build a joint for the resolver to work with
+ char str[64]={0};
+ sprintf(str,"./%s",(*jointIt).first.c_str() );
+ //llwarns<<"Joint "<< str <<llendl;
+
+ //Setup the resolver
+ daeSIDResolver resolver( pSkeletonRootNode, str );
+
+ //Look for the joint
+ domNode* pJoint = daeSafeCast<domNode>( resolver.getElement() );
+ if ( pJoint )
+ {
+ //Pull out the translate id and store it in the jointTranslations map
+ daeSIDResolver jointResolverA( pJoint, "./translate" );
+ domTranslate* pTranslateA = daeSafeCast<domTranslate>( jointResolverA.getElement() );
+ daeSIDResolver jointResolverB( pJoint, "./location" );
+ domTranslate* pTranslateB = daeSafeCast<domTranslate>( jointResolverB.getElement() );
+
+ LLMatrix4 workingTransform;
+
+ //Translation via SID
+ if ( pTranslateA )
+ {
+ extractTranslation( pTranslateA, workingTransform );
+ }
+ else
+ if ( pTranslateB )
+ {
+ extractTranslation( pTranslateB, workingTransform );
+ }
+ else
+ {
+ //Translation via child from element
+ daeElement* pTranslateElement = getChildFromElement( pJoint, "translate" );
+ if ( pTranslateElement && pTranslateElement->typeID() != domTranslate::ID() )
+ {
+ llwarns<< "The found element is not a translate node" <<llendl;
+ missingSkeletonOrScene = true;
+ }
+ else
+ if ( pTranslateElement )
+ {
+ extractTranslationViaElement( pTranslateElement, workingTransform );
+ }
+ else
+ {
+ extractTranslationViaSID( pJoint, workingTransform );
+ }
+
+ }
+
+ //Store the joint transform w/respect to it's name.
+ mJointList[(*jointIt).second.c_str()] = workingTransform;
+ }
+ }
+
+ //If anything failed in regards to extracting the skeleton, joints or translation id,
+ //mention it
+ if ( missingSkeletonOrScene )
+ {
+ llwarns<< "Partial jointmap found in asset - did you mean to just have a partial map?" << llendl;
+ }
+ }//got skeleton?
+ }
+
+
+ domSkin::domJoints* joints = skin->getJoints();
+
+ domInputLocal_Array& joint_input = joints->getInput_array();
+
+ for (size_t i = 0; i < joint_input.getCount(); ++i)
+ {
+ domInputLocal* input = joint_input.get(i);
+ xsNMTOKEN semantic = input->getSemantic();
+
+ if (strcmp(semantic, COMMON_PROFILE_INPUT_JOINT) == 0)
+ { //found joint source, fill model->mJointMap and model->mSkinInfo.mJointNames
+ daeElement* elem = input->getSource().getElement();
+
+ domSource* source = daeSafeCast<domSource>(elem);
+ if (source)
+ {
+
+
+ domName_array* names_source = source->getName_array();
+
+ if (names_source)
+ {
+ domListOfNames &names = names_source->getValue();
+
+ for (size_t j = 0; j < names.getCount(); ++j)
+ {
+ std::string name(names.get(j));
+ if (mJointMap.find(name) != mJointMap.end())
+ {
+ name = mJointMap[name];
+ }
+ model->mSkinInfo.mJointNames.push_back(name);
+ model->mSkinInfo.mJointMap[name] = j;
+ }
+ }
+ else
+ {
+ domIDREF_array* names_source = source->getIDREF_array();
+ if (names_source)
+ {
+ xsIDREFS& names = names_source->getValue();
+
+ for (size_t j = 0; j < names.getCount(); ++j)
+ {
+ std::string name(names.get(j).getID());
+ if (mJointMap.find(name) != mJointMap.end())
+ {
+ name = mJointMap[name];
+ }
+ model->mSkinInfo.mJointNames.push_back(name);
+ model->mSkinInfo.mJointMap[name] = j;
+ }
+ }
+ }
+ }
+ }
+ else if (strcmp(semantic, COMMON_PROFILE_INPUT_INV_BIND_MATRIX) == 0)
+ { //found inv_bind_matrix array, fill model->mInvBindMatrix
+ domSource* source = daeSafeCast<domSource>(input->getSource().getElement());
+ if (source)
+ {
+ domFloat_array* t = source->getFloat_array();
+ if (t)
+ {
+ domListOfFloats& transform = t->getValue();
+ S32 count = transform.getCount()/16;
+
+ for (S32 k = 0; k < count; ++k)
+ {
+ LLMatrix4 mat;
+
+ for (int i = 0; i < 4; i++)
+ {
+ for(int j = 0; j < 4; j++)
+ {
+ mat.mMatrix[i][j] = transform[k*16 + i + j*4];
+ }
+ }
+
+ model->mSkinInfo.mInvBindMatrix.push_back(mat);
+ }
+ }
+ }
+ }
+ }
+
+ //Now that we've parsed the joint array, let's determine if we have a full rig
+ //(which means we have all the joint sthat are required for an avatar versus
+ //a skinned asset attached to a node in a file that contains an entire skeleton,
+ //but does not use the skeleton).
+ buildJointToNodeMappingFromScene( root );
+ mPreview->critiqueRigForUploadApplicability( model->mSkinInfo.mJointNames );
+
+ if ( !missingSkeletonOrScene )
+ {
+ //Set the joint translations on the avatar - if it's a full mapping
+ //The joints are reset in the dtor
+ if ( mPreview->getRigWithSceneParity() )
+ {
+ std::map<std::string, std::string> :: const_iterator masterJointIt = mJointMap.begin();
+ std::map<std::string, std::string> :: const_iterator masterJointItEnd = mJointMap.end();
+ for (;masterJointIt!=masterJointItEnd;++masterJointIt )
+ {
+ std::string lookingForJoint = (*masterJointIt).first.c_str();
+
+ if ( mJointList.find( lookingForJoint ) != mJointList.end() )
+ {
+ //llinfos<<"joint "<<lookingForJoint.c_str()<<llendl;
+ LLMatrix4 jointTransform = mJointList[lookingForJoint];
+ LLJoint* pJoint = mPreview->getPreviewAvatar()->getJoint( lookingForJoint );
+ if ( pJoint )
+ {
+ pJoint->storeCurrentXform( jointTransform.getTranslation() );
+ }
+ else
+ {
+ //Most likely an error in the asset.
+ llwarns<<"Tried to apply joint position from .dae, but it did not exist in the avatar rig." << llendl;
+ }
+ }
+ }
+ }
+ } //missingSkeletonOrScene
+
+
+ //We need to construct the alternate bind matrix (which contains the new joint positions)
+ //in the same order as they were stored in the joint buffer. The joints associated
+ //with the skeleton are not stored in the same order as they are in the exported joint buffer.
+ //This remaps the skeletal joints to be in the same order as the joints stored in the model.
+ std::vector<std::string> :: const_iterator jointIt = model->mSkinInfo.mJointNames.begin();
+ const int jointCnt = model->mSkinInfo.mJointNames.size();
+ for ( int i=0; i<jointCnt; ++i, ++jointIt )
+ {
+ std::string lookingForJoint = (*jointIt).c_str();
+ //Look for the joint xform that we extracted from the skeleton, using the jointIt as the key
+ //and store it in the alternate bind matrix
+ if ( mJointList.find( lookingForJoint ) != mJointList.end() )
+ {
+ LLMatrix4 jointTransform = mJointList[lookingForJoint];
+ LLMatrix4 newInverse = model->mSkinInfo.mInvBindMatrix[i];
+ newInverse.setTranslation( mJointList[lookingForJoint].getTranslation() );
+ model->mSkinInfo.mAlternateBindMatrix.push_back( newInverse );
+ }
+ else
+ {
+ llwarns<<"Possibly misnamed/missing joint [" <<lookingForJoint.c_str()<<" ] "<<llendl;
+ }
+ }
+
+ //grab raw position array
+
+ domVertices* verts = mesh->getVertices();
+ if (verts)
+ {
+ domInputLocal_Array& inputs = verts->getInput_array();
+ for (size_t i = 0; i < inputs.getCount() && model->mPosition.empty(); ++i)
+ {
+ if (strcmp(inputs[i]->getSemantic(), COMMON_PROFILE_INPUT_POSITION) == 0)
+ {
+ domSource* pos_source = daeSafeCast<domSource>(inputs[i]->getSource().getElement());
+ if (pos_source)
+ {
+ domFloat_array* pos_array = pos_source->getFloat_array();
+ if (pos_array)
+ {
+ domListOfFloats& pos = pos_array->getValue();
+
+ for (size_t j = 0; j < pos.getCount(); j += 3)
+ {
+ if (pos.getCount() <= j+2)
+ {
+ llerrs << "Invalid position array size." << llendl;
+ }
+
+ LLVector3 v(pos[j], pos[j+1], pos[j+2]);
+
+ //transform from COLLADA space to volume space
+ v = v * inverse_normalized_transformation;
+
+ model->mPosition.push_back(v);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ //grab skin weights array
+ domSkin::domVertex_weights* weights = skin->getVertex_weights();
+ if (weights)
+ {
+ domInputLocalOffset_Array& inputs = weights->getInput_array();
+ domFloat_array* vertex_weights = NULL;
+ for (size_t i = 0; i < inputs.getCount(); ++i)
+ {
+ if (strcmp(inputs[i]->getSemantic(), COMMON_PROFILE_INPUT_WEIGHT) == 0)
+ {
+ domSource* weight_source = daeSafeCast<domSource>(inputs[i]->getSource().getElement());
+ if (weight_source)
+ {
+ vertex_weights = weight_source->getFloat_array();
+ }
+ }
+ }
+
+ if (vertex_weights)
+ {
+ domListOfFloats& w = vertex_weights->getValue();
+ domListOfUInts& vcount = weights->getVcount()->getValue();
+ domListOfInts& v = weights->getV()->getValue();
+
+ U32 c_idx = 0;
+ for (size_t vc_idx = 0; vc_idx < vcount.getCount(); ++vc_idx)
+ { //for each vertex
+ daeUInt count = vcount[vc_idx];
+
+ //create list of weights that influence this vertex
+ LLModel::weight_list weight_list;
+
+ for (daeUInt i = 0; i < count; ++i)
+ { //for each weight
+ daeInt joint_idx = v[c_idx++];
+ daeInt weight_idx = v[c_idx++];
+
+ if (joint_idx == -1)
+ {
+ //ignore bindings to bind_shape_matrix
+ continue;
+ }
+
+ F32 weight_value = w[weight_idx];
+
+ weight_list.push_back(LLModel::JointWeight(joint_idx, weight_value));
+ }
+
+ //sort by joint weight
+ std::sort(weight_list.begin(), weight_list.end(), LLModel::CompareWeightGreater());
+
+ std::vector<LLModel::JointWeight> wght;
+
+ F32 total = 0.f;
+
+ for (U32 i = 0; i < llmin((U32) 4, (U32) weight_list.size()); ++i)
+ { //take up to 4 most significant weights
+ if (weight_list[i].mWeight > 0.f)
+ {
+ wght.push_back( weight_list[i] );
+ total += weight_list[i].mWeight;
+ }
+ }
+
+ F32 scale = 1.f/total;
+ if (scale != 1.f)
+ { //normalize weights
+ for (U32 i = 0; i < wght.size(); ++i)
+ {
+ wght[i].mWeight *= scale;
+ }
+ }
+
+ model->mSkinWeights[model->mPosition[vc_idx]] = wght;
+ }
+
+ //add instance to scene for this model
+
+ LLMatrix4 transformation = mTransform;
+ // adjust the transformation to compensate for mesh normalization
+
+ LLMatrix4 mesh_translation;
+ mesh_translation.setTranslation(mesh_translation_vector);
+ mesh_translation *= transformation;
+ transformation = mesh_translation;
+
+ LLMatrix4 mesh_scale;
+ mesh_scale.initScale(mesh_scale_vector);
+ mesh_scale *= transformation;
+ transformation = mesh_scale;
+
+ std::map<std::string, LLImportMaterial> materials;
+ for (U32 i = 0; i < model->mMaterialList.size(); ++i)
+ {
+ materials[model->mMaterialList[i]] = LLImportMaterial();
+ }
+ mScene[transformation].push_back(LLModelInstance(model, model->mLabel, transformation, materials));
+ stretch_extents(model, transformation, mExtents[0], mExtents[1], mFirstTransform);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ daeElement* scene = root->getDescendant("visual_scene");
+
+ if (!scene)
+ {
+ llwarns << "document has no visual_scene" << llendl;
+ setLoadState( ERROR_PARSING );
+ return true;
+ }
+
+ setLoadState( DONE );
+
+ bool badElement = false;
+
+ processElement( scene, badElement );
+
+ if ( badElement )
+ {
+ setLoadState( ERROR_PARSING );
+ }
+
+ return true;
+}
+
+void LLModelLoader::setLoadState(U32 state)
+{
+ if (mPreview)
+ {
+ mPreview->setLoadState(state);
+ }
+}
+
+bool LLModelLoader::loadFromSLM(const std::string& filename)
+{
+ //only need to populate mScene with data from slm
+ llstat stat;
+
+ if (LLFile::stat(filename, &stat))
+ { //file does not exist
+ return false;
+ }
+
+ S32 file_size = (S32) stat.st_size;
+
+ llifstream ifstream(filename, std::ifstream::in | std::ifstream::binary);
+ LLSD data;
+ LLSDSerialize::fromBinary(data, ifstream, file_size);
+ ifstream.close();
+
+ //build model list for each LoD
+ model_list model[LLModel::NUM_LODS];
+
+ if (data["version"].asInteger() != SLM_SUPPORTED_VERSION)
+ { //unsupported version
+ return false;
+ }
+
+ LLSD& mesh = data["mesh"];
+
+ LLVolumeParams volume_params;
+ volume_params.setType(LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE);
+
+ for (S32 lod = 0; lod < LLModel::NUM_LODS; ++lod)
+ {
+ for (U32 i = 0; i < mesh.size(); ++i)
+ {
+ std::stringstream str(mesh[i].asString());
+ LLPointer<LLModel> loaded_model = new LLModel(volume_params, (F32) lod);
+ if (loaded_model->loadModel(str))
+ {
+ loaded_model->mLocalID = i;
+ model[lod].push_back(loaded_model);
+
+ if (lod == LLModel::LOD_HIGH && !loaded_model->mSkinInfo.mJointNames.empty())
+ {
+ //check to see if rig is valid
+ mPreview->critiqueRigForUploadApplicability( loaded_model->mSkinInfo.mJointNames );
+ }
+ }
+ }
+ }
+
+ if (model[LLModel::LOD_HIGH].empty())
+ { //failed to load high lod
+ return false;
+ }
+
+ // Set name.
+ std::string name = data["name"];
+ if (!name.empty())
+ {
+ model[LLModel::LOD_HIGH][0]->mLabel = name;
+ }
+
+
+ //load instance list
+ model_instance_list instance_list;
+
+ LLSD& instance = data["instance"];
+
+ for (U32 i = 0; i < instance.size(); ++i)
+ {
+ //deserialize instance list
+ instance_list.push_back(LLModelInstance(instance[i]));
+
+ //match up model instance pointers
+ S32 idx = instance_list[i].mLocalMeshID;
+
+ for (U32 lod = 0; lod < LLModel::NUM_LODS; ++lod)
+ {
+ if (!model[lod].empty())
+ {
+ instance_list[i].mLOD[lod] = model[lod][idx];
+ }
+ }
+
+ instance_list[i].mModel = model[LLModel::LOD_HIGH][idx];
+ }
+
+
+ //convert instance_list to mScene
+ mFirstTransform = TRUE;
+ for (U32 i = 0; i < instance_list.size(); ++i)
+ {
+ LLModelInstance& cur_instance = instance_list[i];
+ mScene[cur_instance.mTransform].push_back(cur_instance);
+ stretch_extents(cur_instance.mModel, cur_instance.mTransform, mExtents[0], mExtents[1], mFirstTransform);
+ }
+
+ setLoadState( DONE );
+
+ return true;
+}
+
+//static
+bool LLModelLoader::isAlive(LLModelLoader* loader)
+{
+ if(!loader)
+ {
+ return false ;
+ }
+
+ std::list<LLModelLoader*>::iterator iter = sActiveLoaderList.begin() ;
+ for(; iter != sActiveLoaderList.end() && (*iter) != loader; ++iter) ;
+
+ return *iter == loader ;
+}
+
+void LLModelLoader::loadModelCallback()
+{
+ assert_main_thread();
+
+ if (mPreview)
+ {
+ mPreview->loadModelCallback(mLod);
+ }
+
+ while (!isStopped())
+ { //wait until this thread is stopped before deleting self
+ apr_sleep(100);
+ }
+
+ //doubel check if "this" is valid before deleting it, in case it is aborted during running.
+ if(!isAlive(this))
+ {
+ return ;
+ }
+
+ //cleanup model loader
+ if (mPreview)
+ {
+ mPreview->mModelLoader = NULL;
+ }
+
+ delete this;
+}
+//-----------------------------------------------------------------------------
+// buildJointToNodeMappingFromScene()
+//-----------------------------------------------------------------------------
+void LLModelLoader::buildJointToNodeMappingFromScene( daeElement* pRoot )
+{
+ daeElement* pScene = pRoot->getDescendant("visual_scene");
+ if ( pScene )
+ {
+ daeTArray< daeSmartRef<daeElement> > children = pScene->getChildren();
+ S32 childCount = children.getCount();
+ for (S32 i = 0; i < childCount; ++i)
+ {
+ domNode* pNode = daeSafeCast<domNode>(children[i]);
+ processJointToNodeMapping( pNode );
+ }
+ }
+}
+//-----------------------------------------------------------------------------
+// processJointToNodeMapping()
+//-----------------------------------------------------------------------------
+void LLModelLoader::processJointToNodeMapping( domNode* pNode )
+{
+ if ( isNodeAJoint( pNode ) )
+ {
+ //1.Store the parent
+ std::string nodeName = pNode->getName();
+ if ( !nodeName.empty() )
+ {
+ mJointsFromNode.push_front( pNode->getName() );
+ }
+ //2. Handle the kiddo's
+ processChildJoints( pNode );
+ }
+ else
+ {
+ //Determine if the're any children wrt to this failed node.
+ //This occurs when an armature is exported and ends up being what essentially amounts to
+ //as the root for the visual_scene
+ if ( pNode )
+ {
+ processChildJoints( pNode );
+ }
+ else
+ {
+ llinfos<<"Node is NULL"<<llendl;
+ }
+
+ }
+}
+//-----------------------------------------------------------------------------
+// processChildJoint()
+//-----------------------------------------------------------------------------
+void LLModelLoader::processChildJoints( domNode* pParentNode )
+{
+ daeTArray< daeSmartRef<daeElement> > childOfChild = pParentNode->getChildren();
+ S32 childOfChildCount = childOfChild.getCount();
+ for (S32 i = 0; i < childOfChildCount; ++i)
+ {
+ domNode* pChildNode = daeSafeCast<domNode>( childOfChild[i] );
+ if ( pChildNode )
+ {
+ processJointToNodeMapping( pChildNode );
+ }
+ }
+}
+
+//-----------------------------------------------------------------------------
+// critiqueRigForUploadApplicability()
+//-----------------------------------------------------------------------------
+void LLModelPreview::critiqueRigForUploadApplicability( const std::vector<std::string> &jointListFromAsset )
+{
+ critiqueJointToNodeMappingFromScene();
+
+ //Determines the following use cases for a rig:
+ //1. It is suitable for upload with skin weights & joint positions, or
+ //2. It is suitable for upload as standard av with just skin weights
+
+ bool isJointPositionUploadOK = isRigSuitableForJointPositionUpload( jointListFromAsset );
+ bool isRigLegacyOK = isRigLegacy( jointListFromAsset );
+
+ //It's OK that both could end up being true, both default to false
+ if ( isJointPositionUploadOK )
+ {
+ setRigValidForJointPositionUpload( true );
+ }
+
+ if ( isRigLegacyOK)
+ {
+ setLegacyRigValid( true );
+ }
+
+}
+//-----------------------------------------------------------------------------
+// critiqueJointToNodeMappingFromScene()
+//-----------------------------------------------------------------------------
+void LLModelPreview::critiqueJointToNodeMappingFromScene( void )
+{
+ //Do the actual nodes back the joint listing from the dae?
+ //if yes then this is a fully rigged asset, otherwise it's just a partial rig
+
+ std::deque<std::string>::iterator jointsFromNodeIt = mJointsFromNode.begin();
+ std::deque<std::string>::iterator jointsFromNodeEndIt = mJointsFromNode.end();
+ bool result = true;
+
+ if ( !mJointsFromNode.empty() )
+ {
+ for ( ;jointsFromNodeIt!=jointsFromNodeEndIt;++jointsFromNodeIt )
+ {
+ std::string name = *jointsFromNodeIt;
+ if ( mJointTransformMap.find( name ) != mJointTransformMap.end() )
+ {
+ continue;
+ }
+ else
+ {
+ llinfos<<"critiqueJointToNodeMappingFromScene is missing a: "<<name<<llendl;
+ result = false;
+ }
+ }
+ }
+ else
+ {
+ result = false;
+ }
+
+ //Determines the following use cases for a rig:
+ //1. Full av rig w/1-1 mapping from the scene and joint array
+ //2. Partial rig but w/o parity between the scene and joint array
+ if ( result )
+ {
+ setRigWithSceneParity( true );
+ }
+}
+//-----------------------------------------------------------------------------
+// isRigLegacy()
+//-----------------------------------------------------------------------------
+bool LLModelPreview::isRigLegacy( const std::vector<std::string> &jointListFromAsset )
+{
+ //No joints in asset
+ if ( jointListFromAsset.size() == 0 )
+ {
+ return false;
+ }
+
+ bool result = false;
+
+ std::deque<std::string> :: const_iterator masterJointIt = mMasterLegacyJointList.begin();
+ std::deque<std::string> :: const_iterator masterJointEndIt = mMasterLegacyJointList.end();
+
+ std::vector<std::string> :: const_iterator modelJointIt = jointListFromAsset.begin();
+ std::vector<std::string> :: const_iterator modelJointItEnd = jointListFromAsset.end();
+
+ for ( ;masterJointIt!=masterJointEndIt;++masterJointIt )
+ {
+ result = false;
+ modelJointIt = jointListFromAsset.begin();
+
+ for ( ;modelJointIt!=modelJointItEnd; ++modelJointIt )
+ {
+ if ( *masterJointIt == *modelJointIt )
+ {
+ result = true;
+ break;
+ }
+ }
+ if ( !result )
+ {
+ llinfos<<" Asset did not contain the joint (if you're u/l a fully rigged asset w/joint positions - it is required)." << *masterJointIt<< llendl;
+ break;
+ }
+ }
+ return result;
+}
+//-----------------------------------------------------------------------------
+// isRigSuitableForJointPositionUpload()
+//-----------------------------------------------------------------------------
+bool LLModelPreview::isRigSuitableForJointPositionUpload( const std::vector<std::string> &jointListFromAsset )
+{
+ bool result = false;
+
+ std::deque<std::string> :: const_iterator masterJointIt = mMasterJointList.begin();
+ std::deque<std::string> :: const_iterator masterJointEndIt = mMasterJointList.end();
+
+ std::vector<std::string> :: const_iterator modelJointIt = jointListFromAsset.begin();
+ std::vector<std::string> :: const_iterator modelJointItEnd = jointListFromAsset.end();
+
+ for ( ;masterJointIt!=masterJointEndIt;++masterJointIt )
+ {
+ result = false;
+ modelJointIt = jointListFromAsset.begin();
+
+ for ( ;modelJointIt!=modelJointItEnd; ++modelJointIt )
+ {
+ if ( *masterJointIt == *modelJointIt )
+ {
+ result = true;
+ break;
+ }
+ }
+ if ( !result )
+ {
+ llinfos<<" Asset did not contain the joint (if you're u/l a fully rigged asset w/joint positions - it is required)." << *masterJointIt<< llendl;
+ break;
+ }
+ }
+ return result;
+}
+
+
+//called in the main thread
+void LLModelLoader::loadTextures()
+{
+ BOOL is_paused = isPaused() ;
+ pause() ; //pause the loader
+
+ for(scene::iterator iter = mScene.begin(); iter != mScene.end(); ++iter)
+ {
+ for(U32 i = 0 ; i < iter->second.size(); i++)
+ {
+ for(std::map<std::string, LLImportMaterial>::iterator j = iter->second[i].mMaterial.begin();
+ j != iter->second[i].mMaterial.end(); ++j)
+ {
+ LLImportMaterial& material = j->second;
+
+ if(!material.mDiffuseMapFilename.empty())
+ {
+ material.mDiffuseMap =
+ LLViewerTextureManager::getFetchedTextureFromUrl("file://" + material.mDiffuseMapFilename, TRUE, LLViewerTexture::BOOST_PREVIEW);
+ material.mDiffuseMap->setLoadedCallback(LLModelPreview::textureLoadedCallback, 0, TRUE, FALSE, mPreview, NULL, FALSE);
+ material.mDiffuseMap->forceToSaveRawImage(0, F32_MAX);
+ mNumOfFetchingTextures++ ;
+ }
+ }
+ }
+ }
+
+ if(!is_paused)
+ {
+ unpause() ;
+ }
+}
+
+//-----------------------------------------------------------------------------
+// isNodeAJoint()
+//-----------------------------------------------------------------------------
+bool LLModelLoader::isNodeAJoint( domNode* pNode )
+{
+ if ( !pNode )
+ {
+ llinfos<<"Created node is NULL"<<llendl;
+ return false;
+ }
+
+ if ( pNode->getName() == NULL )
+ {
+ llinfos<<"Parsed node has no name "<<llendl;
+ //Attempt to write the node id, if possible (aids in debugging the visual scene)
+ if ( pNode->getId() )
+ {
+ llinfos<<"Parsed node ID: "<<pNode->getId()<<llendl;
+ }
+ return false;
+ }
+
+ if ( mJointMap.find( pNode->getName() ) != mJointMap.end() )
+ {
+ return true;
+ }
+
+ return false;
+}
+//-----------------------------------------------------------------------------
+// verifyCount
+//-----------------------------------------------------------------------------
+bool LLModelPreview::verifyCount( int expected, int result )
+{
+ if ( expected != result )
+ {
+ llinfos<< "Error: (expected/got)"<<expected<<"/"<<result<<"verts"<<llendl;
+ return false;
+ }
+ return true;
+}
+//-----------------------------------------------------------------------------
+// verifyController
+//-----------------------------------------------------------------------------
+bool LLModelPreview::verifyController( domController* pController )
+{
+
+ bool result = true;
+
+ domSkin* pSkin = pController->getSkin();
+
+ if ( pSkin )
+ {
+ xsAnyURI & uri = pSkin->getSource();
+ domElement* pElement = uri.getElement();
+
+ if ( !pElement )
+ {
+ llinfos<<"Can't resolve skin source"<<llendl;
+ return false;
+ }
+
+ daeString type_str = pElement->getTypeName();
+ if ( stricmp(type_str, "geometry") == 0 )
+ {
+ //Skin is reference directly by geometry and get the vertex count from skin
+ domSkin::domVertex_weights* pVertexWeights = pSkin->getVertex_weights();
+ U32 vertexWeightsCount = pVertexWeights->getCount();
+ domGeometry* pGeometry = (domGeometry*) (domElement*) uri.getElement();
+ domMesh* pMesh = pGeometry->getMesh();
+
+ if ( pMesh )
+ {
+ //Get vertex count from geometry
+ domVertices* pVertices = pMesh->getVertices();
+ if ( !pVertices )
+ {
+ llinfos<<"No vertices!"<<llendl;
+ return false;
+ }
+
+ if ( pVertices )
+ {
+ xsAnyURI src = pVertices->getInput_array()[0]->getSource();
+ domSource* pSource = (domSource*) (domElement*) src.getElement();
+ U32 verticesCount = pSource->getTechnique_common()->getAccessor()->getCount();
+ result = verifyCount( verticesCount, vertexWeightsCount );
+ if ( !result )
+ {
+ return result;
+ }
+ }
+ }
+
+ U32 vcountCount = (U32) pVertexWeights->getVcount()->getValue().getCount();
+ result = verifyCount( vcountCount, vertexWeightsCount );
+ if ( !result )
+ {
+ return result;
+ }
+
+ domInputLocalOffset_Array& inputs = pVertexWeights->getInput_array();
+ U32 sum = 0;
+ for (size_t i=0; i<vcountCount; i++)
+ {
+ sum += pVertexWeights->getVcount()->getValue()[i];
+ }
+ result = verifyCount( sum * inputs.getCount(), (domInt) pVertexWeights->getV()->getValue().getCount() );
+ }
+ }
+
+ return result;
+}
+
+//-----------------------------------------------------------------------------
+// extractTranslation()
+//-----------------------------------------------------------------------------
+void LLModelLoader::extractTranslation( domTranslate* pTranslate, LLMatrix4& transform )
+{
+ domFloat3 jointTrans = pTranslate->getValue();
+ LLVector3 singleJointTranslation( jointTrans[0], jointTrans[1], jointTrans[2] );
+ transform.setTranslation( singleJointTranslation );
+}
+//-----------------------------------------------------------------------------
+// extractTranslationViaElement()
+//-----------------------------------------------------------------------------
+void LLModelLoader::extractTranslationViaElement( daeElement* pTranslateElement, LLMatrix4& transform )
+{
+ if ( pTranslateElement )
+ {
+ domTranslate* pTranslateChild = dynamic_cast<domTranslate*>( pTranslateElement );
+ domFloat3 translateChild = pTranslateChild->getValue();
+ LLVector3 singleJointTranslation( translateChild[0], translateChild[1], translateChild[2] );
+ transform.setTranslation( singleJointTranslation );
+ }
+}
+//-----------------------------------------------------------------------------
+// extractTranslationViaSID()
+//-----------------------------------------------------------------------------
+void LLModelLoader::extractTranslationViaSID( daeElement* pElement, LLMatrix4& transform )
+{
+ if ( pElement )
+ {
+ daeSIDResolver resolver( pElement, "./transform" );
+ domMatrix* pMatrix = daeSafeCast<domMatrix>( resolver.getElement() );
+ //We are only extracting out the translational component atm
+ LLMatrix4 workingTransform;
+ if ( pMatrix )
+ {
+ domFloat4x4 domArray = pMatrix->getValue();
+ for ( int i = 0; i < 4; i++ )
+ {
+ for( int j = 0; j < 4; j++ )
+ {
+ workingTransform.mMatrix[i][j] = domArray[i + j*4];
+ }
+ }
+ LLVector3 trans = workingTransform.getTranslation();
+ transform.setTranslation( trans );
+ }
+ }
+ else
+ {
+ llwarns<<"Element is nonexistent - empty/unsupported node."<<llendl;
+ }
+}
+//-----------------------------------------------------------------------------
+// processJointNode()
+//-----------------------------------------------------------------------------
+void LLModelLoader::processJointNode( domNode* pNode, JointTransformMap& jointTransforms )
+{
+ if (pNode->getName() == NULL)
+ {
+ llwarns << "nameless node, can't process" << llendl;
+ return;
+ }
+
+ //llwarns<<"ProcessJointNode# Node:" <<pNode->getName()<<llendl;
+
+ //1. handle the incoming node - extract out translation via SID or element
+
+ LLMatrix4 workingTransform;
+
+ //Pull out the translate id and store it in the jointTranslations map
+ daeSIDResolver jointResolverA( pNode, "./translate" );
+ domTranslate* pTranslateA = daeSafeCast<domTranslate>( jointResolverA.getElement() );
+ daeSIDResolver jointResolverB( pNode, "./location" );
+ domTranslate* pTranslateB = daeSafeCast<domTranslate>( jointResolverB.getElement() );
+
+ //Translation via SID was successful
+ if ( pTranslateA )
+ {
+ extractTranslation( pTranslateA, workingTransform );
+ }
+ else
+ if ( pTranslateB )
+ {
+ extractTranslation( pTranslateB, workingTransform );
+ }
+ else
+ {
+ //Translation via child from element
+ daeElement* pTranslateElement = getChildFromElement( pNode, "translate" );
+ if ( !pTranslateElement || pTranslateElement->typeID() != domTranslate::ID() )
+ {
+ //llwarns<< "The found element is not a translate node" <<llendl;
+ daeSIDResolver jointResolver( pNode, "./matrix" );
+ domMatrix* pMatrix = daeSafeCast<domMatrix>( jointResolver.getElement() );
+ if ( pMatrix )
+ {
+ //llinfos<<"A matrix SID was however found!"<<llendl;
+ domFloat4x4 domArray = pMatrix->getValue();
+ for ( int i = 0; i < 4; i++ )
+ {
+ for( int j = 0; j < 4; j++ )
+ {
+ workingTransform.mMatrix[i][j] = domArray[i + j*4];
+ }
+ }
+ }
+ else
+ {
+ llwarns<< "The found element is not translate or matrix node - most likely a corrupt export!" <<llendl;
+ }
+ }
+ else
+ {
+ extractTranslationViaElement( pTranslateElement, workingTransform );
+ }
+ }
+
+ //Store the working transform relative to the nodes name.
+ jointTransforms[ pNode->getName() ] = workingTransform;
+
+ //2. handle the nodes children
+
+ //Gather and handle the incoming nodes children
+ daeTArray< daeSmartRef<daeElement> > childOfChild = pNode->getChildren();
+ S32 childOfChildCount = childOfChild.getCount();
+
+ for (S32 i = 0; i < childOfChildCount; ++i)
+ {
+ domNode* pChildNode = daeSafeCast<domNode>( childOfChild[i] );
+ if ( pChildNode )
+ {
+ processJointNode( pChildNode, jointTransforms );
+ }
+ }
+}
+//-----------------------------------------------------------------------------
+// getChildFromElement()
+//-----------------------------------------------------------------------------
+daeElement* LLModelLoader::getChildFromElement( daeElement* pElement, std::string const & name )
+{
+ daeElement* pChildOfElement = pElement->getChild( name.c_str() );
+ if ( pChildOfElement )
+ {
+ return pChildOfElement;
+ }
+ llwarns<< "Could not find a child [" << name << "] for the element: \"" << pElement->getAttribute("id") << "\"" << llendl;
+ return NULL;
+}
+
+void LLModelLoader::processElement( daeElement* element, bool& badElement )
+{
+ LLMatrix4 saved_transform = mTransform;
+
+ domTranslate* translate = daeSafeCast<domTranslate>(element);
+ if (translate)
+ {
+ domFloat3 dom_value = translate->getValue();
+
+ LLMatrix4 translation;
+ translation.setTranslation(LLVector3(dom_value[0], dom_value[1], dom_value[2]));
+
+ translation *= mTransform;
+ mTransform = translation;
+ }
+
+ domRotate* rotate = daeSafeCast<domRotate>(element);
+ if (rotate)
+ {
+ domFloat4 dom_value = rotate->getValue();
+
+ LLMatrix4 rotation;
+ rotation.initRotTrans(dom_value[3] * DEG_TO_RAD, LLVector3(dom_value[0], dom_value[1], dom_value[2]), LLVector3(0, 0, 0));
+
+ rotation *= mTransform;
+ mTransform = rotation;
+ }
+
+ domScale* scale = daeSafeCast<domScale>(element);
+ if (scale)
+ {
+ domFloat3 dom_value = scale->getValue();
+
+
+ LLVector3 scale_vector = LLVector3(dom_value[0], dom_value[1], dom_value[2]);
+ scale_vector.abs(); // Set all values positive, since we don't currently support mirrored meshes
+ LLMatrix4 scaling;
+ scaling.initScale(scale_vector);
+
+ scaling *= mTransform;
+ mTransform = scaling;
+ }
+
+ domMatrix* matrix = daeSafeCast<domMatrix>(element);
+ if (matrix)
+ {
+ domFloat4x4 dom_value = matrix->getValue();
+
+ LLMatrix4 matrix_transform;
+
+ for (int i = 0; i < 4; i++)
+ {
+ for(int j = 0; j < 4; j++)
+ {
+ matrix_transform.mMatrix[i][j] = dom_value[i + j*4];
+ }
+ }
+
+ matrix_transform *= mTransform;
+ mTransform = matrix_transform;
+ }
+
+ domInstance_geometry* instance_geo = daeSafeCast<domInstance_geometry>(element);
+ if (instance_geo)
+ {
+ domGeometry* geo = daeSafeCast<domGeometry>(instance_geo->getUrl().getElement());
+ if (geo)
+ {
+ domMesh* mesh = daeSafeCast<domMesh>(geo->getDescendant(daeElement::matchType(domMesh::ID())));
+ if (mesh)
+ {
+ LLModel* model = mModel[mesh];
+ if (model)
+ {
+ LLMatrix4 transformation = mTransform;
+
+ if (mTransform.determinant() < 0)
+ { //negative scales are not supported
+ llinfos << "Negative scale detected, unsupported transform. domInstance_geometry: " << LLModel::getElementLabel(instance_geo) << llendl;
+ badElement = true;
+ }
+
+ std::map<std::string, LLImportMaterial> materials = getMaterials(model, instance_geo);
+
+ // adjust the transformation to compensate for mesh normalization
+ LLVector3 mesh_scale_vector;
+ LLVector3 mesh_translation_vector;
+ model->getNormalizedScaleTranslation(mesh_scale_vector, mesh_translation_vector);
+
+ LLMatrix4 mesh_translation;
+ mesh_translation.setTranslation(mesh_translation_vector);
+ mesh_translation *= transformation;
+ transformation = mesh_translation;
+
+ LLMatrix4 mesh_scale;
+ mesh_scale.initScale(mesh_scale_vector);
+ mesh_scale *= transformation;
+ transformation = mesh_scale;
+
+ std::string label = getElementLabel(instance_geo);
+ mScene[transformation].push_back(LLModelInstance(model, label, transformation, materials));
+
+ stretch_extents(model, transformation, mExtents[0], mExtents[1], mFirstTransform);
+ }
+ }
+ }
+ else
+ {
+ llinfos<<"Unable to resolve geometry URL."<<llendl;
+ badElement = true;
+ }
+
+ }
+
+ domInstance_node* instance_node = daeSafeCast<domInstance_node>(element);
+ if (instance_node)
+ {
+ daeElement* instance = instance_node->getUrl().getElement();
+ if (instance)
+ {
+ processElement(instance,badElement);
+ }
+ }
+
+ //process children
+ daeTArray< daeSmartRef<daeElement> > children = element->getChildren();
+ int childCount = children.getCount();
+ for (S32 i = 0; i < childCount; i++)
+ {
+ processElement(children[i],badElement);
+ }
+
+ domNode* node = daeSafeCast<domNode>(element);
+ if (node)
+ { //this element was a node, restore transform before processiing siblings
+ mTransform = saved_transform;
+ }
+}
+
+std::map<std::string, LLImportMaterial> LLModelLoader::getMaterials(LLModel* model, domInstance_geometry* instance_geo)
+{
+ std::map<std::string, LLImportMaterial> materials;
+ for (int i = 0; i < model->mMaterialList.size(); i++)
+ {
+ LLImportMaterial import_material;
+
+ domInstance_material* instance_mat = NULL;
+
+ domBind_material::domTechnique_common* technique =
+ daeSafeCast<domBind_material::domTechnique_common>(instance_geo->getDescendant(daeElement::matchType(domBind_material::domTechnique_common::ID())));
+
+ if (technique)
+ {
+ daeTArray< daeSmartRef<domInstance_material> > inst_materials = technique->getChildrenByType<domInstance_material>();
+ for (int j = 0; j < inst_materials.getCount(); j++)
+ {
+ std::string symbol(inst_materials[j]->getSymbol());
+
+ if (symbol == model->mMaterialList[i]) // found the binding
+ {
+ instance_mat = inst_materials[j];
+ }
+ }
+ }
+
+ if (instance_mat)
+ {
+ domMaterial* material = daeSafeCast<domMaterial>(instance_mat->getTarget().getElement());
+ if (material)
+ {
+ domInstance_effect* instance_effect =
+ daeSafeCast<domInstance_effect>(material->getDescendant(daeElement::matchType(domInstance_effect::ID())));
+ if (instance_effect)
+ {
+ domEffect* effect = daeSafeCast<domEffect>(instance_effect->getUrl().getElement());
+ if (effect)
+ {
+ domProfile_COMMON* profile =
+ daeSafeCast<domProfile_COMMON>(effect->getDescendant(daeElement::matchType(domProfile_COMMON::ID())));
+ if (profile)
+ {
+ import_material = profileToMaterial(profile);
+ }
+ }
+ }
+ }
+ }
+
+ import_material.mBinding = model->mMaterialList[i];
+ materials[model->mMaterialList[i]] = import_material;
+ }
+
+ return materials;
+}
+
+LLImportMaterial LLModelLoader::profileToMaterial(domProfile_COMMON* material)
+{
+ LLImportMaterial mat;
+ mat.mFullbright = FALSE;
+
+ daeElement* diffuse = material->getDescendant("diffuse");
+ if (diffuse)
+ {
+ domCommon_color_or_texture_type_complexType::domTexture* texture =
+ daeSafeCast<domCommon_color_or_texture_type_complexType::domTexture>(diffuse->getDescendant("texture"));
+ if (texture)
+ {
+ domCommon_newparam_type_Array newparams = material->getNewparam_array();
+ for (S32 i = 0; i < newparams.getCount(); i++)
+ {
+ domFx_surface_common* surface = newparams[i]->getSurface();
+ if (surface)
+ {
+ domFx_surface_init_common* init = surface->getFx_surface_init_common();
+ if (init)
+ {
+ domFx_surface_init_from_common_Array init_from = init->getInit_from_array();
+
+ if (init_from.getCount() > i)
+ {
+ domImage* image = daeSafeCast<domImage>(init_from[i]->getValue().getElement());
+ if (image)
+ {
+ // we only support init_from now - embedded data will come later
+ domImage::domInit_from* init = image->getInit_from();
+ if (init)
+ {
+ mat.mDiffuseMapFilename = cdom::uriToNativePath(init->getValue().str());
+ mat.mDiffuseMapLabel = getElementLabel(material);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ domCommon_color_or_texture_type_complexType::domColor* color =
+ daeSafeCast<domCommon_color_or_texture_type_complexType::domColor>(diffuse->getDescendant("color"));
+ if (color)
+ {
+ domFx_color_common domfx_color = color->getValue();
+ LLColor4 value = LLColor4(domfx_color[0], domfx_color[1], domfx_color[2], domfx_color[3]);
+ mat.mDiffuseColor = value;
+ }
+ }
+
+ daeElement* emission = material->getDescendant("emission");
+ if (emission)
+ {
+ LLColor4 emission_color = getDaeColor(emission);
+ if (((emission_color[0] + emission_color[1] + emission_color[2]) / 3.0) > 0.25)
+ {
+ mat.mFullbright = TRUE;
+ }
+ }
+
+ return mat;
+}
+
+// try to get a decent label for this element
+std::string LLModelLoader::getElementLabel(daeElement *element)
+{
+ // if we have a name attribute, use it
+ std::string name = element->getAttribute("name");
+ if (name.length())
+ {
+ return name;
+ }
+
+ // if we have an ID attribute, use it
+ if (element->getID())
+ {
+ return std::string(element->getID());
+ }
+
+ // if we have a parent, use it
+ daeElement* parent = element->getParent();
+ if (parent)
+ {
+ // if parent has a name, use it
+ std::string name = parent->getAttribute("name");
+ if (name.length())
+ {
+ return name;
+ }
+
+ // if parent has an ID, use it
+ if (parent->getID())
+ {
+ return std::string(parent->getID());
+ }
+ }
+
+ // try to use our type
+ daeString element_name = element->getElementName();
+ if (element_name)
+ {
+ return std::string(element_name);
+ }
+
+ // if all else fails, use "object"
+ return std::string("object");
+}
+
+LLColor4 LLModelLoader::getDaeColor(daeElement* element)
+{
+ LLColor4 value;
+ domCommon_color_or_texture_type_complexType::domColor* color =
+ daeSafeCast<domCommon_color_or_texture_type_complexType::domColor>(element->getDescendant("color"));
+ if (color)
+ {
+ domFx_color_common domfx_color = color->getValue();
+ value = LLColor4(domfx_color[0], domfx_color[1], domfx_color[2], domfx_color[3]);
+ }
+
+ return value;
+}
+
+//-----------------------------------------------------------------------------
+// LLModelPreview
+//-----------------------------------------------------------------------------
+
+LLModelPreview::LLModelPreview(S32 width, S32 height, LLFloater* fmp)
+: LLViewerDynamicTexture(width, height, 3, ORDER_MIDDLE, FALSE), LLMutex(NULL)
+, mPelvisZOffset( 0.0f )
+, mLegacyRigValid( false )
+, mRigValidJointUpload( false )
+, mResetJoints( false )
+, mRigParityWithScene( false )
+, mLastJointUpdate( false )
+{
+ mNeedsUpdate = TRUE;
+ mCameraDistance = 0.f;
+ mCameraYaw = 0.f;
+ mCameraPitch = 0.f;
+ mCameraZoom = 1.f;
+ mTextureName = 0;
+ mPreviewLOD = 0;
+ mModelLoader = NULL;
+ mMaxTriangleLimit = 0;
+ mDirty = false;
+ mGenLOD = false;
+ mLoading = false;
+ mLoadState = LLModelLoader::STARTING;
+ mGroup = 0;
+ mLODFrozen = false;
+ mBuildShareTolerance = 0.f;
+ mBuildQueueMode = GLOD_QUEUE_GREEDY;
+ mBuildBorderMode = GLOD_BORDER_UNLOCK;
+ mBuildOperator = GLOD_OPERATOR_EDGE_COLLAPSE;
+
+ for (U32 i = 0; i < LLModel::NUM_LODS; ++i)
+ {
+ mRequestedTriangleCount[i] = 0;
+ mRequestedCreaseAngle[i] = -1.f;
+ mRequestedLoDMode[i] = 0;
+ mRequestedErrorThreshold[i] = 0.f;
+ mRequestedBuildOperator[i] = 0;
+ mRequestedQueueMode[i] = 0;
+ mRequestedBorderMode[i] = 0;
+ mRequestedShareTolerance[i] = 0.f;
+ }
+
+ mViewOption["show_textures"] = false;
+
+ mFMP = fmp;
+
+ mHasPivot = false;
+ mModelPivot = LLVector3( 0.0f, 0.0f, 0.0f );
+
+ glodInit();
+
+ //move into joint mapper class
+ //1. joints for joint offset verification
+ mMasterJointList.push_front("mPelvis");
+ mMasterJointList.push_front("mTorso");
+ mMasterJointList.push_front("mChest");
+ mMasterJointList.push_front("mNeck");
+ mMasterJointList.push_front("mHead");
+ mMasterJointList.push_front("mCollarLeft");
+ mMasterJointList.push_front("mShoulderLeft");
+ mMasterJointList.push_front("mElbowLeft");
+ mMasterJointList.push_front("mWristLeft");
+ mMasterJointList.push_front("mCollarRight");
+ mMasterJointList.push_front("mShoulderRight");
+ mMasterJointList.push_front("mElbowRight");
+ mMasterJointList.push_front("mWristRight");
+ mMasterJointList.push_front("mHipRight");
+ mMasterJointList.push_front("mKneeRight");
+ mMasterJointList.push_front("mFootRight");
+ mMasterJointList.push_front("mHipLeft");
+ mMasterJointList.push_front("mKneeLeft");
+ mMasterJointList.push_front("mFootLeft");
+ //2. legacy joint list - used to verify rigs that will not be using joint offsets
+ mMasterLegacyJointList.push_front("mPelvis");
+ mMasterLegacyJointList.push_front("mTorso");
+ mMasterLegacyJointList.push_front("mChest");
+ mMasterLegacyJointList.push_front("mNeck");
+ mMasterLegacyJointList.push_front("mHead");
+ mMasterLegacyJointList.push_front("mHipRight");
+ mMasterLegacyJointList.push_front("mKneeRight");
+ mMasterLegacyJointList.push_front("mFootRight");
+ mMasterLegacyJointList.push_front("mHipLeft");
+ mMasterLegacyJointList.push_front("mKneeLeft");
+ mMasterLegacyJointList.push_front("mFootLeft");
+
+ createPreviewAvatar();
+}
+
+LLModelPreview::~LLModelPreview()
+{
+ if (mModelLoader)
+ {
+ mModelLoader->mPreview = NULL;
+ mModelLoader = NULL;
+ }
+ //*HACK : *TODO : turn this back on when we understand why this crashes
+ //glodShutdown();
+}
+
+U32 LLModelPreview::calcResourceCost()
+{
+ assert_main_thread();
+
+ rebuildUploadData();
+
+ //Upload skin is selected BUT check to see if the joints coming in from the asset were malformed.
+ if ( mFMP && mFMP->childGetValue("upload_skin").asBoolean() )
+ {
+ bool uploadingJointPositions = mFMP->childGetValue("upload_joints").asBoolean();
+ if ( uploadingJointPositions && !isRigValidForJointPositionUpload() )
+ {
+ mFMP->childDisable("ok_btn");
+ }
+ }
+
+ std::set<LLModel*> accounted;
+ U32 num_points = 0;
+ U32 num_hulls = 0;
+
+ F32 debug_scale = mFMP ? mFMP->childGetValue("import_scale").asReal() : 1.f;
+ mPelvisZOffset = mFMP ? mFMP->childGetValue("pelvis_offset").asReal() : 3.0f;
+
+ if ( mFMP && mFMP->childGetValue("upload_joints").asBoolean() )
+ {
+ getPreviewAvatar()->setPelvisOffset( mPelvisZOffset );
+ }
+
+ F32 streaming_cost = 0.f;
+ F32 physics_cost = 0.f;
+ for (U32 i = 0; i < mUploadData.size(); ++i)
+ {
+ LLModelInstance& instance = mUploadData[i];
+
+ if (accounted.find(instance.mModel) == accounted.end())
+ {
+ accounted.insert(instance.mModel);
+
+ LLModel::Decomposition& decomp =
+ instance.mLOD[LLModel::LOD_PHYSICS] ?
+ instance.mLOD[LLModel::LOD_PHYSICS]->mPhysics :
+ instance.mModel->mPhysics;
+
+ //update instance skin info for each lods pelvisZoffset
+ for ( int j=0; j<LLModel::NUM_LODS; ++j )
+ {
+ if ( instance.mLOD[j] )
+ {
+ instance.mLOD[j]->mSkinInfo.mPelvisOffset = mPelvisZOffset;
+ }
+ }
+
+ std::stringstream ostr;
+ LLSD ret = LLModel::writeModel(ostr,
+ instance.mLOD[4],
+ instance.mLOD[3],
+ instance.mLOD[2],
+ instance.mLOD[1],
+ instance.mLOD[0],
+ decomp,
+ mFMP->childGetValue("upload_skin").asBoolean(),
+ mFMP->childGetValue("upload_joints").asBoolean(),
+ TRUE);
+
+ num_hulls += decomp.mHull.size();
+ for (U32 i = 0; i < decomp.mHull.size(); ++i)
+ {
+ num_points += decomp.mHull[i].size();
+ }
+
+ //calculate streaming cost
+ LLMatrix4 transformation = instance.mTransform;
+
+ LLVector3 position = LLVector3(0, 0, 0) * transformation;
+
+ LLVector3 x_transformed = LLVector3(1, 0, 0) * transformation - position;
+ LLVector3 y_transformed = LLVector3(0, 1, 0) * transformation - position;
+ LLVector3 z_transformed = LLVector3(0, 0, 1) * transformation - position;
+ F32 x_length = x_transformed.normalize();
+ F32 y_length = y_transformed.normalize();
+ F32 z_length = z_transformed.normalize();
+ LLVector3 scale = LLVector3(x_length, y_length, z_length);
+
+ F32 radius = scale.length()*0.5f*debug_scale;
+
+ streaming_cost += LLMeshRepository::getStreamingCost(ret, radius);
+ }
+ }
+
+ F32 scale = mFMP ? mFMP->childGetValue("import_scale").asReal()*2.f : 2.f;
+
+ mDetailsSignal(mPreviewScale[0]*scale, mPreviewScale[1]*scale, mPreviewScale[2]*scale, streaming_cost, physics_cost);
+
+ updateStatusMessages();
+
+ return (U32) streaming_cost;
+}
+
+void LLFloaterModelPreview::setDetails(F32 x, F32 y, F32 z, F32 streaming_cost, F32 physics_cost)
+{
+ assert_main_thread();
+ childSetTextArg("import_dimensions", "[X]", llformat("%.3f", x));
+ childSetTextArg("import_dimensions", "[Y]", llformat("%.3f", y));
+ childSetTextArg("import_dimensions", "[Z]", llformat("%.3f", z));
+}
+
+
+void LLModelPreview::rebuildUploadData()
+{
+ assert_main_thread();
+
+ mUploadData.clear();
+ mTextureSet.clear();
+
+ //fill uploaddata instance vectors from scene data
+
+ std::string requested_name = mFMP->getChild<LLUICtrl>("description_form")->getValue().asString();
+
+ std::string metric = mFMP->getChild<LLUICtrl>("model_category_combo")->getValue().asString();
+
+ LLSpinCtrl* scale_spinner = mFMP->getChild<LLSpinCtrl>("import_scale");
+
+ F32 scale = scale_spinner->getValue().asReal();
+
+ LLMatrix4 scale_mat;
+ scale_mat.initScale(LLVector3(scale, scale, scale));
+
+ F32 max_scale = 0.f;
+
+ //reorder materials to match mBaseModel
+ for (U32 i = 0; i < LLModel::NUM_LODS-1; i++)
+ {
+ if (mBaseModel.size() == mModel[i].size())
+ {
+ for (U32 j = 0; j < mBaseModel.size(); ++j)
+ {
+
+ int refFaceCnt = 0;
+ int modelFaceCnt = 0;
+
+ if ( !mModel[i][j]->matchMaterialOrder(mBaseModel[j], refFaceCnt, modelFaceCnt ) )
+ {
+ setLoadState( LLModelLoader::ERROR_MATERIALS );
+ mFMP->childDisable( "calculate_btn" );
+ }
+ }
+ }
+ }
+
+ for (LLModelLoader::scene::iterator iter = mBaseScene.begin(); iter != mBaseScene.end(); ++iter)
+ { //for each transform in scene
+ LLMatrix4 mat = iter->first;
+
+ // compute position
+ LLVector3 position = LLVector3(0, 0, 0) * mat;
+
+ // compute scale
+ LLVector3 x_transformed = LLVector3(1, 0, 0) * mat - position;
+ LLVector3 y_transformed = LLVector3(0, 1, 0) * mat - position;
+ LLVector3 z_transformed = LLVector3(0, 0, 1) * mat - position;
+ F32 x_length = x_transformed.normalize();
+ F32 y_length = y_transformed.normalize();
+ F32 z_length = z_transformed.normalize();
+
+ max_scale = llmax(llmax(llmax(max_scale, x_length), y_length), z_length);
+
+ mat *= scale_mat;
+
+ for (LLModelLoader::model_instance_list::iterator model_iter = iter->second.begin(); model_iter != iter->second.end(); ++model_iter)
+ { //for each instance with said transform applied
+ LLModelInstance instance = *model_iter;
+
+ LLModel* base_model = instance.mModel;
+
+ if (base_model)
+ {
+ base_model->mRequestedLabel = requested_name;
+ base_model->mMetric = metric;
+ }
+
+ S32 idx = 0;
+ for (idx = 0; idx < mBaseModel.size(); ++idx)
+ { //find reference instance for this model
+ if (mBaseModel[idx] == base_model)
+ {
+ break;
+ }
+ }
+
+ if(idx < mBaseModel.size())
+ {
+ for (U32 i = 0; i < LLModel::NUM_LODS; i++)
+ { //fill LOD slots based on reference model index
+ if (mModel[i].size() > idx)
+ {
+ instance.mLOD[i] = mModel[i][idx];
+ }
+ else
+ {
+ instance.mLOD[i] = NULL;
+ }
+ }
+ }
+ instance.mTransform = mat;
+ mUploadData.push_back(instance);
+ }
+ }
+
+ F32 max_import_scale = (DEFAULT_MAX_PRIM_SCALE-0.1f)/max_scale;
+
+ F32 max_axis = llmax(mPreviewScale.mV[0], mPreviewScale.mV[1]);
+ max_axis = llmax(max_axis, mPreviewScale.mV[2]);
+ max_axis *= 2.f;
+
+ //clamp scale so that total imported model bounding box is smaller than 240m on a side
+ max_import_scale = llmin(max_import_scale, 240.f/max_axis);
+
+ scale_spinner->setMaxValue(max_import_scale);
+
+ if (max_import_scale < scale)
+ {
+ scale_spinner->setValue(max_import_scale);
+ }
+
+}
+
+void LLModelPreview::saveUploadData(bool save_skinweights, bool save_joint_positions)
+{
+ if (!mLODFile[LLModel::LOD_HIGH].empty())
+ {
+ std::string filename = mLODFile[LLModel::LOD_HIGH];
+
+ std::string::size_type i = filename.rfind(".");
+ if (i != std::string::npos)
+ {
+ filename.replace(i, filename.size()-1, ".slm");
+ saveUploadData(filename, save_skinweights, save_joint_positions);
+ }
+ }
+}
+
+void LLModelPreview::saveUploadData(const std::string& filename, bool save_skinweights, bool save_joint_positions)
+{
+ if (!gSavedSettings.getBOOL("MeshImportUseSLM"))
+ {
+ return;
+ }
+
+ std::set<LLPointer<LLModel> > meshes;
+ std::map<LLModel*, std::string> mesh_binary;
+
+ LLModel::hull empty_hull;
+
+ LLSD data;
+
+ data["version"] = SLM_SUPPORTED_VERSION;
+ if (!mBaseModel.empty())
+ {
+ data["name"] = mBaseModel[0]->getName();
+ }
+
+ S32 mesh_id = 0;
+
+ //build list of unique models and initialize local id
+ for (U32 i = 0; i < mUploadData.size(); ++i)
+ {
+ LLModelInstance& instance = mUploadData[i];
+
+ if (meshes.find(instance.mModel) == meshes.end())
+ {
+ instance.mModel->mLocalID = mesh_id++;
+ meshes.insert(instance.mModel);
+
+ std::stringstream str;
+
+ LLModel::Decomposition& decomp =
+ instance.mLOD[LLModel::LOD_PHYSICS].notNull() ?
+ instance.mLOD[LLModel::LOD_PHYSICS]->mPhysics :
+ instance.mModel->mPhysics;
+
+ LLModel::writeModel(str,
+ instance.mLOD[LLModel::LOD_PHYSICS],
+ instance.mLOD[LLModel::LOD_HIGH],
+ instance.mLOD[LLModel::LOD_MEDIUM],
+ instance.mLOD[LLModel::LOD_LOW],
+ instance.mLOD[LLModel::LOD_IMPOSTOR],
+ decomp,
+ save_skinweights, save_joint_positions, FALSE, TRUE);
+
+
+ data["mesh"][instance.mModel->mLocalID] = str.str();
+ }
+
+ data["instance"][i] = instance.asLLSD();
+ }
+
+ llofstream out(filename, std::ios_base::out | std::ios_base::binary);
+ LLSDSerialize::toBinary(data, out);
+ out.flush();
+ out.close();
+}
+
+void LLModelPreview::clearModel(S32 lod)
+{
+ if (lod < 0 || lod > LLModel::LOD_PHYSICS)
+ {
+ return;
+ }
+
+ mVertexBuffer[lod].clear();
+ mModel[lod].clear();
+ mScene[lod].clear();
+}
+
+void LLModelPreview::loadModel(std::string filename, S32 lod, bool force_disable_slm)
+{
+ assert_main_thread();
+
+ LLMutexLock lock(this);
+
+ if (lod < LLModel::LOD_IMPOSTOR || lod > LLModel::NUM_LODS - 1)
+ {
+ llwarns << "Invalid level of detail: " << lod << llendl;
+ assert(lod >= LLModel::LOD_IMPOSTOR && lod < LLModel::NUM_LODS);
+ return;
+ }
+
+ // This triggers if you bring up the file picker and then hit CANCEL.
+ // Just use the previous model (if any) and ignore that you brought up
+ // the file picker.
+
+ if (filename.empty())
+ {
+ if (mBaseModel.empty())
+ {
+ // this is the initial file picking. Close the whole floater
+ // if we don't have a base model to show for high LOD.
+ mFMP->closeFloater(false);
+ mLoading = false;
+ }
+ return;
+ }
+
+ if (mModelLoader)
+ {
+ llwarns << "Incompleted model load operation pending." << llendl;
+ return;
+ }
+
+ mLODFile[lod] = filename;
+
+ if (lod == LLModel::LOD_HIGH)
+ {
+ clearGLODGroup();
+ }
+
+ mModelLoader = new LLModelLoader(filename, lod, this, mJointTransformMap, mJointsFromNode );
+
+ if (force_disable_slm)
+ {
+ mModelLoader->mTrySLM = false;
+ }
+
+ mModelLoader->start();
+
+ mFMP->childSetTextArg("status", "[STATUS]", mFMP->getString("status_reading_file"));
+
+ setPreviewLOD(lod);
+
+ if ( getLoadState() >= LLModelLoader::ERROR_PARSING )
+ {
+ mFMP->childDisable("ok_btn");
+ mFMP->childDisable( "calculate_btn" );
+ }
+
+ if (lod == mPreviewLOD)
+ {
+ mFMP->childSetText("lod_file_" + lod_name[lod], mLODFile[lod]);
+ }
+ else if (lod == LLModel::LOD_PHYSICS)
+ {
+ mFMP->childSetText("physics_file", mLODFile[lod]);
+ }
+
+ mFMP->openFloater();
+}
+
+void LLModelPreview::setPhysicsFromLOD(S32 lod)
+{
+ assert_main_thread();
+
+ if (lod >= 0 && lod <= 3)
+ {
+ mModel[LLModel::LOD_PHYSICS] = mModel[lod];
+ mScene[LLModel::LOD_PHYSICS] = mScene[lod];
+ mLODFile[LLModel::LOD_PHYSICS].clear();
+ mFMP->childSetText("physics_file", mLODFile[LLModel::LOD_PHYSICS]);
+ mVertexBuffer[LLModel::LOD_PHYSICS].clear();
+ rebuildUploadData();
+ refresh();
+ updateStatusMessages();
+ }
+}
+
+void LLModelPreview::clearIncompatible(S32 lod)
+{
+ //Don't discard models if specified model is the physic rep
+ if ( lod == LLModel::LOD_PHYSICS )
+ {
+ return;
+ }
+
+ for (U32 i = 0; i <= LLModel::LOD_HIGH; i++)
+ { //clear out any entries that aren't compatible with this model
+ if (i != lod)
+ {
+ if (mModel[i].size() != mModel[lod].size())
+ {
+ mModel[i].clear();
+ mScene[i].clear();
+ mVertexBuffer[i].clear();
+
+ if (i == LLModel::LOD_HIGH)
+ {
+ mBaseModel = mModel[lod];
+ clearGLODGroup();
+ mBaseScene = mScene[lod];
+ mVertexBuffer[5].clear();
+ }
+ }
+ }
+ }
+}
+
+void LLModelPreview::clearGLODGroup()
+{
+ if (mGroup)
+ {
+ for (std::map<LLPointer<LLModel>, U32>::iterator iter = mObject.begin(); iter != mObject.end(); ++iter)
+ {
+ glodDeleteObject(iter->second);
+ stop_gloderror();
+ }
+ mObject.clear();
+
+ glodDeleteGroup(mGroup);
+ stop_gloderror();
+ mGroup = 0;
+ }
+}
+
+void LLModelPreview::loadModelCallback(S32 lod)
+{
+ assert_main_thread();
+
+ LLMutexLock lock(this);
+ if (!mModelLoader)
+ {
+ mLoading = false ;
+ return;
+ }
+ if(getLoadState() >= LLModelLoader::ERROR_PARSING)
+ {
+ mLoading = false ;
+ return ;
+ }
+
+ mModelLoader->loadTextures() ;
+
+ if (lod == -1)
+ { //populate all LoDs from model loader scene
+ mBaseModel.clear();
+ mBaseScene.clear();
+
+ bool skin_weights = false;
+ bool joint_positions = false;
+
+ for (S32 lod = 0; lod < LLModel::NUM_LODS; ++lod)
+ { //for each LoD
+
+ //clear scene and model info
+ mScene[lod].clear();
+ mModel[lod].clear();
+ mVertexBuffer[lod].clear();
+
+ if (mModelLoader->mScene.begin()->second[0].mLOD[lod].notNull())
+ { //if this LoD exists in the loaded scene
+
+ //copy scene to current LoD
+ mScene[lod] = mModelLoader->mScene;
+
+ //touch up copied scene to look like current LoD
+ for (LLModelLoader::scene::iterator iter = mScene[lod].begin(); iter != mScene[lod].end(); ++iter)
+ {
+ LLModelLoader::model_instance_list& list = iter->second;
+
+ for (LLModelLoader::model_instance_list::iterator list_iter = list.begin(); list_iter != list.end(); ++list_iter)
+ {
+ //override displayed model with current LoD
+ list_iter->mModel = list_iter->mLOD[lod];
+
+ //add current model to current LoD's model list (LLModel::mLocalID makes a good vector index)
+ S32 idx = list_iter->mModel->mLocalID;
+
+ if (mModel[lod].size() <= idx)
+ { //stretch model list to fit model at given index
+ mModel[lod].resize(idx+1);
+ }
+
+ mModel[lod][idx] = list_iter->mModel;
+ if (!list_iter->mModel->mSkinWeights.empty())
+ {
+ skin_weights = true;
+
+ if (!list_iter->mModel->mSkinInfo.mAlternateBindMatrix.empty())
+ {
+ joint_positions = true;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if (mFMP)
+ {
+ LLFloaterModelPreview* fmp = (LLFloaterModelPreview*) mFMP;
+
+ if (skin_weights)
+ { //enable uploading/previewing of skin weights if present in .slm file
+ fmp->enableViewOption("show_skin_weight");
+ mViewOption["show_skin_weight"] = true;
+ fmp->childSetValue("upload_skin", true);
+ }
+
+ if (joint_positions)
+ {
+ fmp->enableViewOption("show_joint_positions");
+ mViewOption["show_joint_positions"] = true;
+ fmp->childSetValue("upload_joints", true);
+ }
+ }
+
+ //copy high lod to base scene for LoD generation
+ mBaseScene = mScene[LLModel::LOD_HIGH];
+ mBaseModel = mModel[LLModel::LOD_HIGH];
+
+ mDirty = true;
+ resetPreviewTarget();
+ }
+ else
+ { //only replace given LoD
+ mModel[lod] = mModelLoader->mModelList;
+ mScene[lod] = mModelLoader->mScene;
+ mVertexBuffer[lod].clear();
+
+ setPreviewLOD(lod);
+
+ if (lod == LLModel::LOD_HIGH)
+ { //save a copy of the highest LOD for automatic LOD manipulation
+ if (mBaseModel.empty())
+ { //first time we've loaded a model, auto-gen LoD
+ mGenLOD = true;
+ }
+
+ mBaseModel = mModel[lod];
+ clearGLODGroup();
+
+ mBaseScene = mScene[lod];
+ mVertexBuffer[5].clear();
+ }
+
+ clearIncompatible(lod);
+
+ mDirty = true;
+
+ if (lod == LLModel::LOD_HIGH)
+ {
+ resetPreviewTarget();
+ }
+ }
+
+ mLoading = false;
+ if (mFMP)
+ {
+ mFMP->getChild<LLCheckBoxCtrl>("confirm_checkbox")->set(FALSE);
+ if (!mBaseModel.empty())
+ {
+ if (mFMP->getChild<LLUICtrl>("description_form")->getValue().asString().empty())
+ {
+ const std::string& model_name = mBaseModel[0]->getName();
+ mFMP->getChild<LLUICtrl>("description_form")->setValue(model_name);
+ }
+ }
+ }
+ refresh();
+
+ mModelLoadedSignal();
+}
+
+void LLModelPreview::resetPreviewTarget()
+{
+ if ( mModelLoader )
+ {
+ mPreviewTarget = (mModelLoader->mExtents[0] + mModelLoader->mExtents[1]) * 0.5f;
+ mPreviewScale = (mModelLoader->mExtents[1] - mModelLoader->mExtents[0]) * 0.5f;
+ }
+
+ setPreviewTarget(mPreviewScale.magVec()*10.f);
+}
+
+void LLModelPreview::generateNormals()
+{
+ assert_main_thread();
+
+ S32 which_lod = mPreviewLOD;
+
+
+ if (which_lod > 4 || which_lod < 0 ||
+ mModel[which_lod].empty())
+ {
+ return;
+ }
+
+ F32 angle_cutoff = mFMP->childGetValue("crease_angle").asReal();
+
+ mRequestedCreaseAngle[which_lod] = angle_cutoff;
+
+ angle_cutoff *= DEG_TO_RAD;
+
+ if (which_lod == 3 && !mBaseModel.empty())
+ {
+ for (LLModelLoader::model_list::iterator iter = mBaseModel.begin(); iter != mBaseModel.end(); ++iter)
+ {
+ (*iter)->generateNormals(angle_cutoff);
+ }
+
+ mVertexBuffer[5].clear();
+ }
+
+ for (LLModelLoader::model_list::iterator iter = mModel[which_lod].begin(); iter != mModel[which_lod].end(); ++iter)
+ {
+ (*iter)->generateNormals(angle_cutoff);
+ }
+
+ mVertexBuffer[which_lod].clear();
+ refresh();
+ updateStatusMessages();
+}
+
+void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_limit)
+{
+ // Allow LoD from -1 to LLModel::LOD_PHYSICS
+ if (which_lod < -1 || which_lod > LLModel::NUM_LODS - 1)
+ {
+ llwarns << "Invalid level of detail: " << which_lod << llendl;
+ assert(which_lod >= -1 && which_lod < LLModel::NUM_LODS);
+ return;
+ }
+
+ if (mBaseModel.empty())
+ {
+ return;
+ }
+
+ LLVertexBuffer::unbind();
+
+ bool no_ff = LLGLSLShader::sNoFixedFunction;
+ LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr;
+ LLGLSLShader::sNoFixedFunction = false;
+
+ if (shader)
+ {
+ shader->unbind();
+ }
+
+ stop_gloderror();
+ static U32 cur_name = 1;
+
+ S32 limit = -1;
+
+ U32 triangle_count = 0;
+
+ for (LLModelLoader::model_list::iterator iter = mBaseModel.begin(); iter != mBaseModel.end(); ++iter)
+ {
+ LLModel* mdl = *iter;
+ for (S32 i = 0; i < mdl->getNumVolumeFaces(); ++i)
+ {
+ triangle_count += mdl->getVolumeFace(i).mNumIndices/3;
+ }
+ }
+
+ U32 base_triangle_count = triangle_count;
+
+ U32 type_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0;
+
+ U32 lod_mode = 0;
+
+ F32 lod_error_threshold = 0;
+
+ // The LoD should be in range from Lowest to High
+ if (which_lod > -1 && which_lod < NUM_LOD)
+ {
+ LLCtrlSelectionInterface* iface = mFMP->childGetSelectionInterface("lod_mode_" + lod_name[which_lod]);
+ if (iface)
+ {
+ lod_mode = iface->getFirstSelectedIndex();
+ }
+
+ lod_error_threshold = mFMP->childGetValue("lod_error_threshold_" + lod_name[which_lod]).asReal();
+ }
+
+ if (which_lod != -1)
+ {
+ mRequestedLoDMode[which_lod] = lod_mode;
+ }
+
+ if (lod_mode == 0)
+ {
+ lod_mode = GLOD_TRIANGLE_BUDGET;
+
+ // The LoD should be in range from Lowest to High
+ if (which_lod > -1 && which_lod < NUM_LOD)
+ {
+ limit = mFMP->childGetValue("lod_triangle_limit_" + lod_name[which_lod]).asInteger();
+ }
+ }
+ else
+ {
+ lod_mode = GLOD_ERROR_THRESHOLD;
+ }
+
+ bool object_dirty = false;
+
+ if (mGroup == 0)
+ {
+ object_dirty = true;
+ mGroup = cur_name++;
+ glodNewGroup(mGroup);
+ }
+
+ if (object_dirty)
+ {
+ for (LLModelLoader::model_list::iterator iter = mBaseModel.begin(); iter != mBaseModel.end(); ++iter)
+ { //build GLOD objects for each model in base model list
+ LLModel* mdl = *iter;
+
+ if (mObject[mdl] != 0)
+ {
+ glodDeleteObject(mObject[mdl]);
+ }
+
+ mObject[mdl] = cur_name++;
+
+ glodNewObject(mObject[mdl], mGroup, GLOD_DISCRETE);
+ stop_gloderror();
+
+ if (iter == mBaseModel.begin() && !mdl->mSkinWeights.empty())
+ { //regenerate vertex buffer for skinned models to prevent animation feedback during LOD generation
+ mVertexBuffer[5].clear();
+ }
+
+ if (mVertexBuffer[5].empty())
+ {
+ genBuffers(5, false);
+ }
+
+ U32 tri_count = 0;
+ for (U32 i = 0; i < mVertexBuffer[5][mdl].size(); ++i)
+ {
+ LLVertexBuffer* buff = mVertexBuffer[5][mdl][i];
+ buff->setBuffer(type_mask & buff->getTypeMask());
+
+ U32 num_indices = mVertexBuffer[5][mdl][i]->getNumIndices();
+ if (num_indices > 2)
+ {
+ glodInsertElements(mObject[mdl], i, GL_TRIANGLES, num_indices, GL_UNSIGNED_SHORT, (U8*) mVertexBuffer[5][mdl][i]->getIndicesPointer(), 0, 0.f);
+ }
+ tri_count += num_indices/3;
+ stop_gloderror();
+ }
+
+ glodBuildObject(mObject[mdl]);
+ stop_gloderror();
+ }
+ }
+
+
+ S32 start = LLModel::LOD_HIGH;
+ S32 end = 0;
+
+ if (which_lod != -1)
+ {
+ start = end = which_lod;
+ }
+
+ mMaxTriangleLimit = base_triangle_count;
+
+ for (S32 lod = start; lod >= end; --lod)
+ {
+ if (which_lod == -1)
+ {
+ if (lod < start)
+ {
+ triangle_count /= decimation;
+ }
+ }
+ else
+ {
+ if (enforce_tri_limit)
+ {
+ triangle_count = limit;
+ }
+ else
+ {
+ for (S32 j=LLModel::LOD_HIGH; j>which_lod; --j)
+ {
+ triangle_count /= decimation;
+ }
+ }
+ }
+
+ mModel[lod].clear();
+ mModel[lod].resize(mBaseModel.size());
+ mVertexBuffer[lod].clear();
+
+ U32 actual_tris = 0;
+ U32 actual_verts = 0;
+ U32 submeshes = 0;
+
+ mRequestedTriangleCount[lod] = triangle_count;
+ mRequestedErrorThreshold[lod] = lod_error_threshold;
+
+ glodGroupParameteri(mGroup, GLOD_ADAPT_MODE, lod_mode);
+ stop_gloderror();
+
+ glodGroupParameteri(mGroup, GLOD_ERROR_MODE, GLOD_OBJECT_SPACE_ERROR);
+ stop_gloderror();
+
+ glodGroupParameterf(mGroup, GLOD_OBJECT_SPACE_ERROR_THRESHOLD, lod_error_threshold);
+ stop_gloderror();
+
+ if (lod_mode != GLOD_TRIANGLE_BUDGET)
+ {
+ glodGroupParameteri(mGroup, GLOD_MAX_TRIANGLES, 0);
+ }
+ else
+ {
+ //SH-632: always add 1 to desired amount to avoid decimating below desired amount
+ glodGroupParameteri(mGroup, GLOD_MAX_TRIANGLES, triangle_count+1);
+ }
+
+ stop_gloderror();
+ glodAdaptGroup(mGroup);
+ stop_gloderror();
+
+ for (U32 mdl_idx = 0; mdl_idx < mBaseModel.size(); ++mdl_idx)
+ {
+ LLModel* base = mBaseModel[mdl_idx];
+
+ GLint patch_count = 0;
+ glodGetObjectParameteriv(mObject[base], GLOD_NUM_PATCHES, &patch_count);
+ stop_gloderror();
+
+ LLVolumeParams volume_params;
+ volume_params.setType(LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE);
+ mModel[lod][mdl_idx] = new LLModel(volume_params, 0.f);
+
+ GLint* sizes = new GLint[patch_count*2];
+ glodGetObjectParameteriv(mObject[base], GLOD_PATCH_SIZES, sizes);
+ stop_gloderror();
+
+ GLint* names = new GLint[patch_count];
+ glodGetObjectParameteriv(mObject[base], GLOD_PATCH_NAMES, names);
+ stop_gloderror();
+
+ mModel[lod][mdl_idx]->setNumVolumeFaces(patch_count);
+
+ LLModel* target_model = mModel[lod][mdl_idx];
+
+ for (GLint i = 0; i < patch_count; ++i)
+ {
+ type_mask = mVertexBuffer[5][base][i]->getTypeMask();
+
+ LLPointer<LLVertexBuffer> buff = new LLVertexBuffer(type_mask, 0);
+
+ if (sizes[i*2+1] > 0 && sizes[i*2] > 0)
+ {
+ buff->allocateBuffer(sizes[i*2+1], sizes[i*2], true);
+ buff->setBuffer(type_mask);
+ glodFillElements(mObject[base], names[i], GL_UNSIGNED_SHORT, (U8*) buff->getIndicesPointer());
+ stop_gloderror();
+ }
+ else
+ { //this face was eliminated, create a dummy triangle (one vertex, 3 indices, all 0)
+ buff->allocateBuffer(1, 3, true);
+ memset((U8*) buff->getMappedData(), 0, buff->getSize());
+ memset((U8*) buff->getIndicesPointer(), 0, buff->getIndicesSize());
+ }
+
+ buff->validateRange(0, buff->getNumVerts()-1, buff->getNumIndices(), 0);
+
+ LLStrider<LLVector3> pos;
+ LLStrider<LLVector3> norm;
+ LLStrider<LLVector2> tc;
+ LLStrider<U16> index;
+
+ buff->getVertexStrider(pos);
+ if (type_mask & LLVertexBuffer::MAP_NORMAL)
+ {
+ buff->getNormalStrider(norm);
+ }
+ if (type_mask & LLVertexBuffer::MAP_TEXCOORD0)
+ {
+ buff->getTexCoord0Strider(tc);
+ }
+
+ buff->getIndexStrider(index);
+
+ target_model->setVolumeFaceData(names[i], pos, norm, tc, index, buff->getNumVerts(), buff->getNumIndices());
+ actual_tris += buff->getNumIndices()/3;
+ actual_verts += buff->getNumVerts();
+ ++submeshes;
+
+ if (!validate_face(target_model->getVolumeFace(names[i])))
+ {
+ llerrs << "Invalid face generated during LOD generation." << llendl;
+ }
+ }
+
+ //blind copy skin weights and just take closest skin weight to point on
+ //decimated mesh for now (auto-generating LODs with skin weights is still a bit
+ //of an open problem).
+ target_model->mPosition = base->mPosition;
+ target_model->mSkinWeights = base->mSkinWeights;
+ target_model->mSkinInfo = base->mSkinInfo;
+ //copy material list
+ target_model->mMaterialList = base->mMaterialList;
+
+ if (!validate_model(target_model))
+ {
+ llerrs << "Invalid model generated when creating LODs" << llendl;
+ }
+
+ delete [] sizes;
+ delete [] names;
+ }
+
+ //rebuild scene based on mBaseScene
+ mScene[lod].clear();
+ mScene[lod] = mBaseScene;
+
+ for (U32 i = 0; i < mBaseModel.size(); ++i)
+ {
+ LLModel* mdl = mBaseModel[i];
+ LLModel* target = mModel[lod][i];
+ if (target)
+ {
+ for (LLModelLoader::scene::iterator iter = mScene[lod].begin(); iter != mScene[lod].end(); ++iter)
+ {
+ for (U32 j = 0; j < iter->second.size(); ++j)
+ {
+ if (iter->second[j].mModel == mdl)
+ {
+ iter->second[j].mModel = target;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ mResourceCost = calcResourceCost();
+
+ LLVertexBuffer::unbind();
+ LLGLSLShader::sNoFixedFunction = no_ff;
+ if (shader)
+ {
+ shader->bind();
+ }
+
+ /*if (which_lod == -1 && mScene[LLModel::LOD_PHYSICS].empty())
+ { //build physics scene
+ mScene[LLModel::LOD_PHYSICS] = mScene[LLModel::LOD_LOW];
+ mModel[LLModel::LOD_PHYSICS] = mModel[LLModel::LOD_LOW];
+
+ for (U32 i = 1; i < mModel[LLModel::LOD_PHYSICS].size(); ++i)
+ {
+ mPhysicsQ.push(mModel[LLModel::LOD_PHYSICS][i]);
+ }
+ }*/
+}
+
+void LLModelPreview::updateStatusMessages()
+{
+ assert_main_thread();
+
+ //triangle/vertex/submesh count for each mesh asset for each lod
+ std::vector<S32> tris[LLModel::NUM_LODS];
+ std::vector<S32> verts[LLModel::NUM_LODS];
+ std::vector<S32> submeshes[LLModel::NUM_LODS];
+
+ //total triangle/vertex/submesh count for each lod
+ S32 total_tris[LLModel::NUM_LODS];
+ S32 total_verts[LLModel::NUM_LODS];
+ S32 total_submeshes[LLModel::NUM_LODS];
+
+ for (S32 lod = 0; lod < LLModel::NUM_LODS; ++lod)
+ {
+ //initialize total for this lod to 0
+ total_tris[lod] = total_verts[lod] = total_submeshes[lod] = 0;
+
+ for (U32 i = 0; i < mModel[lod].size(); ++i)
+ { //for each model in the lod
+ S32 cur_tris = 0;
+ S32 cur_verts = 0;
+ S32 cur_submeshes = mModel[lod][i]->getNumVolumeFaces();
+
+ for (S32 j = 0; j < cur_submeshes; ++j)
+ { //for each submesh (face), add triangles and vertices to current total
+ const LLVolumeFace& face = mModel[lod][i]->getVolumeFace(j);
+ cur_tris += face.mNumIndices/3;
+ cur_verts += face.mNumVertices;
+ }
+
+ //add this model to the lod total
+ total_tris[lod] += cur_tris;
+ total_verts[lod] += cur_verts;
+ total_submeshes[lod] += cur_submeshes;
+
+ //store this model's counts to asset data
+ tris[lod].push_back(cur_tris);
+ verts[lod].push_back(cur_verts);
+ submeshes[lod].push_back(cur_submeshes);
+ }
+ }
+
+ if (mMaxTriangleLimit == 0)
+ {
+ mMaxTriangleLimit = total_tris[LLModel::LOD_HIGH];
+ }
+
+ bool has_degenerate = false;
+
+ {//check for degenerate triangles in physics mesh
+ U32 lod = LLModel::LOD_PHYSICS;
+ const LLVector4a scale(0.5f);
+ for (U32 i = 0; i < mModel[lod].size() && !has_degenerate; ++i)
+ { //for each model in the lod
+ if (mModel[lod][i]->mPhysics.mHull.empty())
+ { //no decomp exists
+ S32 cur_submeshes = mModel[lod][i]->getNumVolumeFaces();
+ for (S32 j = 0; j < cur_submeshes && !has_degenerate; ++j)
+ { //for each submesh (face), add triangles and vertices to current total
+ const LLVolumeFace& face = mModel[lod][i]->getVolumeFace(j);
+ for (S32 k = 0; k < face.mNumIndices && !has_degenerate; )
+ {
+ LLVector4a v1; v1.setMul(face.mPositions[face.mIndices[k++]], scale);
+ LLVector4a v2; v2.setMul(face.mPositions[face.mIndices[k++]], scale);
+ LLVector4a v3; v3.setMul(face.mPositions[face.mIndices[k++]], scale);
+
+ if (ll_is_degenerate(v1,v2,v3))
+ {
+ has_degenerate = true;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ mFMP->childSetTextArg("submeshes_info", "[SUBMESHES]", llformat("%d", total_submeshes[LLModel::LOD_HIGH]));
+
+ std::string mesh_status_na = mFMP->getString("mesh_status_na");
+
+ S32 upload_status[LLModel::LOD_HIGH+1];
+
+ bool upload_ok = true;
+
+ for (S32 lod = 0; lod <= LLModel::LOD_HIGH; ++lod)
+ {
+ upload_status[lod] = 0;
+
+ std::string message = "mesh_status_good";
+
+ if (total_tris[lod] > 0)
+ {
+ mFMP->childSetText(lod_triangles_name[lod], llformat("%d", total_tris[lod]));
+ mFMP->childSetText(lod_vertices_name[lod], llformat("%d", total_verts[lod]));
+ }
+ else
+ {
+ if (lod == LLModel::LOD_HIGH)
+ {
+ upload_status[lod] = 2;
+ message = "mesh_status_missing_lod";
+ }
+ else
+ {
+ for (S32 i = lod-1; i >= 0; --i)
+ {
+ if (total_tris[i] > 0)
+ {
+ upload_status[lod] = 2;
+ message = "mesh_status_missing_lod";
+ }
+ }
+ }
+
+ mFMP->childSetText(lod_triangles_name[lod], mesh_status_na);
+ mFMP->childSetText(lod_vertices_name[lod], mesh_status_na);
+ }
+
+ const U32 lod_high = LLModel::LOD_HIGH;
+
+ if (lod != lod_high)
+ {
+ if (total_submeshes[lod] && total_submeshes[lod] != total_submeshes[lod_high])
+ { //number of submeshes is different
+ message = "mesh_status_submesh_mismatch";
+ upload_status[lod] = 2;
+ }
+ else if (!tris[lod].empty() && tris[lod].size() != tris[lod_high].size())
+ { //number of meshes is different
+ message = "mesh_status_mesh_mismatch";
+ upload_status[lod] = 2;
+ }
+ else if (!verts[lod].empty())
+ {
+ S32 sum_verts_higher_lod = 0;
+ S32 sum_verts_this_lod = 0;
+ for (U32 i = 0; i < verts[lod].size(); ++i)
+ {
+ sum_verts_higher_lod += ((i < verts[lod+1].size()) ? verts[lod+1][i] : 0);
+ sum_verts_this_lod += verts[lod][i];
+ }
+
+ if ((sum_verts_higher_lod > 0) &&
+ (sum_verts_this_lod > sum_verts_higher_lod))
+ {
+ //too many vertices in this lod
+ message = "mesh_status_too_many_vertices";
+ upload_status[lod] = 2;
+ }
+ }
+ }
+
+ LLIconCtrl* icon = mFMP->getChild<LLIconCtrl>(lod_icon_name[lod]);
+ LLUIImagePtr img = LLUI::getUIImage(lod_status_image[upload_status[lod]]);
+ icon->setVisible(true);
+ icon->setImage(img);
+
+ if (upload_status[lod] >= 2)
+ {
+ upload_ok = false;
+ }
+
+ if (lod == mPreviewLOD)
+ {
+ mFMP->childSetText("lod_status_message_text", mFMP->getString(message));
+ icon = mFMP->getChild<LLIconCtrl>("lod_status_message_icon");
+ icon->setImage(img);
+ }
+
+ updateLodControls(lod);
+ }
+
+
+ //make sure no hulls have more than 256 points in them
+ for (U32 i = 0; upload_ok && i < mModel[LLModel::LOD_PHYSICS].size(); ++i)
+ {
+ LLModel* mdl = mModel[LLModel::LOD_PHYSICS][i];
+
+ for (U32 j = 0; upload_ok && j < mdl->mPhysics.mHull.size(); ++j)
+ {
+ if (mdl->mPhysics.mHull[j].size() > 256)
+ {
+ upload_ok = false;
+ }
+ }
+ }
+
+ bool errorStateFromLoader = getLoadState() >= LLModelLoader::ERROR_PARSING ? true : false;
+
+ bool skinAndRigOk = true;
+ bool uploadingSkin = mFMP->childGetValue("upload_skin").asBoolean();
+ bool uploadingJointPositions = mFMP->childGetValue("upload_joints").asBoolean();
+
+ if ( uploadingSkin )
+ {
+ if ( uploadingJointPositions && !isRigValidForJointPositionUpload() )
+ {
+ skinAndRigOk = false;
+ }
+ }
+
+ if(upload_ok && mModelLoader)
+ {
+ if(!mModelLoader->areTexturesReady() && mFMP->childGetValue("upload_textures").asBoolean())
+ {
+ upload_ok = false ;
+ }
+ }
+
+ if (!upload_ok || errorStateFromLoader || !skinAndRigOk || has_degenerate)
+ {
+ mFMP->childDisable("ok_btn");
+ }
+
+ //add up physics triangles etc
+ S32 start = 0;
+ S32 end = mModel[LLModel::LOD_PHYSICS].size();
+
+ S32 phys_tris = 0;
+ S32 phys_hulls = 0;
+ S32 phys_points = 0;
+
+ for (S32 i = start; i < end; ++i)
+ { //add up hulls and points and triangles for selected mesh(es)
+ LLModel* model = mModel[LLModel::LOD_PHYSICS][i];
+ S32 cur_submeshes = model->getNumVolumeFaces();
+
+ LLModel::convex_hull_decomposition& decomp = model->mPhysics.mHull;
+
+ if (!decomp.empty())
+ {
+ phys_hulls += decomp.size();
+ for (U32 i = 0; i < decomp.size(); ++i)
+ {
+ phys_points += decomp[i].size();
+ }
+ }
+ else
+ { //choose physics shape OR decomposition, can't use both
+ for (S32 j = 0; j < cur_submeshes; ++j)
+ { //for each submesh (face), add triangles and vertices to current total
+ const LLVolumeFace& face = model->getVolumeFace(j);
+ phys_tris += face.mNumIndices/3;
+ }
+ }
+ }
+
+ if (phys_tris > 0)
+ {
+ mFMP->childSetTextArg("physics_triangles", "[TRIANGLES]", llformat("%d", phys_tris));
+ }
+ else
+ {
+ mFMP->childSetTextArg("physics_triangles", "[TRIANGLES]", mesh_status_na);
+ }
+
+ if (phys_hulls > 0)
+ {
+ mFMP->childSetTextArg("physics_hulls", "[HULLS]", llformat("%d", phys_hulls));
+ mFMP->childSetTextArg("physics_points", "[POINTS]", llformat("%d", phys_points));
+ }
+ else
+ {
+ mFMP->childSetTextArg("physics_hulls", "[HULLS]", mesh_status_na);
+ mFMP->childSetTextArg("physics_points", "[POINTS]", mesh_status_na);
+ }
+
+ LLFloaterModelPreview* fmp = LLFloaterModelPreview::sInstance;
+ if (fmp)
+ {
+ if (phys_tris > 0 || phys_hulls > 0)
+ {
+ if (!fmp->isViewOptionEnabled("show_physics"))
+ {
+ fmp->enableViewOption("show_physics");
+ mViewOption["show_physics"] = true;
+ fmp->childSetValue("show_physics", true);
+ }
+ }
+ else
+ {
+ fmp->disableViewOption("show_physics");
+ mViewOption["show_physics"] = false;
+ fmp->childSetValue("show_physics", false);
+
+ }
+
+ //bool use_hull = fmp->childGetValue("physics_use_hull").asBoolean();
+
+ //fmp->childSetEnabled("physics_optimize", !use_hull);
+
+ bool enable = (phys_tris > 0 || phys_hulls > 0) && fmp->mCurRequest.empty();
+ //enable = enable && !use_hull && fmp->childGetValue("physics_optimize").asBoolean();
+
+ //enable/disable "analysis" UI
+ LLPanel* panel = fmp->getChild<LLPanel>("physics analysis");
+ LLView* child = panel->getFirstChild();
+ while (child)
+ {
+ child->setEnabled(enable);
+ child = panel->findNextSibling(child);
+ }
+
+ enable = phys_hulls > 0 && fmp->mCurRequest.empty();
+ //enable/disable "simplification" UI
+ panel = fmp->getChild<LLPanel>("physics simplification");
+ child = panel->getFirstChild();
+ while (child)
+ {
+ child->setEnabled(enable);
+ child = panel->findNextSibling(child);
+ }
+
+ if (fmp->mCurRequest.empty())
+ {
+ fmp->childSetVisible("Simplify", true);
+ fmp->childSetVisible("simplify_cancel", false);
+ fmp->childSetVisible("Decompose", true);
+ fmp->childSetVisible("decompose_cancel", false);
+
+ if (phys_hulls > 0)
+ {
+ fmp->childEnable("Simplify");
+ }
+
+ if (phys_tris || phys_hulls > 0)
+ {
+ fmp->childEnable("Decompose");
+ }
+ }
+ else
+ {
+ fmp->childEnable("simplify_cancel");
+ fmp->childEnable("decompose_cancel");
+ }
+ }
+
+
+ LLCtrlSelectionInterface* iface = fmp->childGetSelectionInterface("physics_lod_combo");
+ S32 which_mode = 0;
+ S32 file_mode = 1;
+ if (iface)
+ {
+ which_mode = iface->getFirstSelectedIndex();
+ file_mode = iface->getItemCount() - 1;
+ }
+
+ if (which_mode == file_mode)
+ {
+ mFMP->childEnable("physics_file");
+ mFMP->childEnable("physics_browse");
+ }
+ else
+ {
+ mFMP->childDisable("physics_file");
+ mFMP->childDisable("physics_browse");
+ }
+
+ LLSpinCtrl* crease = mFMP->getChild<LLSpinCtrl>("crease_angle");
+
+ if (mRequestedCreaseAngle[mPreviewLOD] == -1.f)
+ {
+ mFMP->childSetColor("crease_label", LLColor4::grey);
+ crease->forceSetValue(75.f);
+ }
+ else
+ {
+ mFMP->childSetColor("crease_label", LLColor4::white);
+ crease->forceSetValue(mRequestedCreaseAngle[mPreviewLOD]);
+ }
+
+ mModelUpdatedSignal(true);
+
+}
+
+void LLModelPreview::updateLodControls(S32 lod)
+{
+ if (lod < LLModel::LOD_IMPOSTOR || lod > LLModel::LOD_HIGH)
+ {
+ llwarns << "Invalid level of detail: " << lod << llendl;
+ assert(lod >= LLModel::LOD_IMPOSTOR && lod <= LLModel::LOD_HIGH);
+ return;
+ }
+
+ const char* lod_controls[] =
+ {
+ "lod_mode_",
+ "lod_triangle_limit_",
+ "lod_error_threshold_"
+ };
+ const U32 num_lod_controls = sizeof(lod_controls)/sizeof(char*);
+
+ const char* file_controls[] =
+ {
+ "lod_browse_",
+ "lod_file_",
+ };
+ const U32 num_file_controls = sizeof(file_controls)/sizeof(char*);
+
+ LLFloaterModelPreview* fmp = LLFloaterModelPreview::sInstance;
+ if (!fmp) return;
+
+ LLComboBox* lod_combo = mFMP->findChild<LLComboBox>("lod_source_" + lod_name[lod]);
+ if (!lod_combo) return;
+
+ S32 lod_mode = lod_combo->getCurrentIndex();
+ if (lod_mode == 0) // LoD from file
+ {
+ fmp->mLODMode[lod] = 0;
+ for (U32 i = 0; i < num_file_controls; ++i)
+ {
+ mFMP->childShow(file_controls[i] + lod_name[lod]);
+ }
+
+ for (U32 i = 0; i < num_lod_controls; ++i)
+ {
+ mFMP->childHide(lod_controls[i] + lod_name[lod]);
+ }
+ }
+ else if (lod_mode == 2) // use LoD above
+ {
+ fmp->mLODMode[lod] = 2;
+ for (U32 i = 0; i < num_file_controls; ++i)
+ {
+ mFMP->childHide(file_controls[i] + lod_name[lod]);
+ }
+
+ for (U32 i = 0; i < num_lod_controls; ++i)
+ {
+ mFMP->childHide(lod_controls[i] + lod_name[lod]);
+ }
+
+ if (lod < LLModel::LOD_HIGH)
+ {
+ mModel[lod] = mModel[lod + 1];
+ mScene[lod] = mScene[lod + 1];
+ mVertexBuffer[lod].clear();
+
+ // Also update lower LoD
+ if (lod > LLModel::LOD_IMPOSTOR)
+ {
+ updateLodControls(lod - 1);
+ }
+ }
+ }
+ else // auto generate, the default case for all LoDs except High
+ {
+ fmp->mLODMode[lod] = 1;
+
+ //don't actually regenerate lod when refreshing UI
+ mLODFrozen = true;
+
+ for (U32 i = 0; i < num_file_controls; ++i)
+ {
+ mFMP->childHide(file_controls[i] + lod_name[lod]);
+ }
+
+ for (U32 i = 0; i < num_lod_controls; ++i)
+ {
+ mFMP->childShow(lod_controls[i] + lod_name[lod]);
+ }
+
+
+ LLSpinCtrl* threshold = mFMP->getChild<LLSpinCtrl>("lod_error_threshold_" + lod_name[lod]);
+ LLSpinCtrl* limit = mFMP->getChild<LLSpinCtrl>("lod_triangle_limit_" + lod_name[lod]);
+
+ limit->setMaxValue(mMaxTriangleLimit);
+ limit->forceSetValue(mRequestedTriangleCount[lod]);
+
+ threshold->forceSetValue(mRequestedErrorThreshold[lod]);
+
+ mFMP->getChild<LLComboBox>("lod_mode_" + lod_name[lod])->selectNthItem(mRequestedLoDMode[lod]);
+
+ if (mRequestedLoDMode[lod] == 0)
+ {
+ limit->setVisible(true);
+ threshold->setVisible(false);
+
+ limit->setMaxValue(mMaxTriangleLimit);
+ limit->setIncrement(mMaxTriangleLimit/32);
+ }
+ else
+ {
+ limit->setVisible(false);
+ threshold->setVisible(true);
+ }
+
+ mLODFrozen = false;
+ }
+}
+
+void LLModelPreview::setPreviewTarget(F32 distance)
+{
+ mCameraDistance = distance;
+ mCameraZoom = 1.f;
+ mCameraPitch = 0.f;
+ mCameraYaw = 0.f;
+ mCameraOffset.clearVec();
+}
+
+void LLModelPreview::clearBuffers()
+{
+ for (U32 i = 0; i < 6; i++)
+ {
+ mVertexBuffer[i].clear();
+ }
+}
+
+void LLModelPreview::genBuffers(S32 lod, bool include_skin_weights)
+{
+ U32 tri_count = 0;
+ U32 vertex_count = 0;
+ U32 mesh_count = 0;
+
+
+ LLModelLoader::model_list* model = NULL;
+
+ if (lod < 0 || lod > 4)
+ {
+ model = &mBaseModel;
+ lod = 5;
+ }
+ else
+ {
+ model = &(mModel[lod]);
+ }
+
+ if (!mVertexBuffer[lod].empty())
+ {
+ mVertexBuffer[lod].clear();
+ }
+
+ mVertexBuffer[lod].clear();
+
+ LLModelLoader::model_list::iterator base_iter = mBaseModel.begin();
+
+ for (LLModelLoader::model_list::iterator iter = model->begin(); iter != model->end(); ++iter)
+ {
+ LLModel* mdl = *iter;
+ if (!mdl)
+ {
+ continue;
+ }
+
+ LLModel* base_mdl = *base_iter;
+ base_iter++;
+
+ for (S32 i = 0; i < mdl->getNumVolumeFaces(); ++i)
+ {
+ const LLVolumeFace &vf = mdl->getVolumeFace(i);
+ U32 num_vertices = vf.mNumVertices;
+ U32 num_indices = vf.mNumIndices;
+
+ if (!num_vertices || ! num_indices)
+ {
+ continue;
+ }
+
+ LLVertexBuffer* vb = NULL;
+
+ bool skinned = include_skin_weights && !mdl->mSkinWeights.empty();
+
+ U32 mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0 ;
+
+ if (skinned)
+ {
+ mask |= LLVertexBuffer::MAP_WEIGHT4;
+ }
+
+ vb = new LLVertexBuffer(mask, 0);
+
+ vb->allocateBuffer(num_vertices, num_indices, TRUE);
+
+ LLStrider<LLVector3> vertex_strider;
+ LLStrider<LLVector3> normal_strider;
+ LLStrider<LLVector2> tc_strider;
+ LLStrider<U16> index_strider;
+ LLStrider<LLVector4> weights_strider;
+
+ vb->getVertexStrider(vertex_strider);
+ vb->getIndexStrider(index_strider);
+
+ if (skinned)
+ {
+ vb->getWeight4Strider(weights_strider);
+ }
+
+ LLVector4a::memcpyNonAliased16((F32*) vertex_strider.get(), (F32*) vf.mPositions, num_vertices*4*sizeof(F32));
+
+ if (vf.mTexCoords)
+ {
+ vb->getTexCoord0Strider(tc_strider);
+ LLVector4a::memcpyNonAliased16((F32*) tc_strider.get(), (F32*) vf.mTexCoords, num_vertices*2*sizeof(F32));
+ }
+
+ if (vf.mNormals)
+ {
+ vb->getNormalStrider(normal_strider);
+ LLVector4a::memcpyNonAliased16((F32*) normal_strider.get(), (F32*) vf.mNormals, num_vertices*4*sizeof(F32));
+ }
+
+ if (skinned)
+ {
+ for (U32 i = 0; i < num_vertices; i++)
+ {
+ //find closest weight to vf.mVertices[i].mPosition
+ LLVector3 pos(vf.mPositions[i].getF32ptr());
+
+ const LLModel::weight_list& weight_list = base_mdl->getJointInfluences(pos);
+
+ LLVector4 w(0,0,0,0);
+
+ for (U32 i = 0; i < weight_list.size(); ++i)
+ {
+ F32 wght = llmin(weight_list[i].mWeight, 0.999999f);
+ F32 joint = (F32) weight_list[i].mJointIdx;
+ w.mV[i] = joint + wght;
+ }
+
+ *(weights_strider++) = w;
+ }
+ }
+
+ // build indices
+ for (U32 i = 0; i < num_indices; i++)
+ {
+ *(index_strider++) = vf.mIndices[i];
+ }
+
+ mVertexBuffer[lod][mdl].push_back(vb);
+
+ vertex_count += num_vertices;
+ tri_count += num_indices/3;
+ ++mesh_count;
+
+ }
+ }
+}
+
+void LLModelPreview::update()
+{
+ if (mDirty)
+ {
+ mDirty = false;
+ mResourceCost = calcResourceCost();
+ refresh();
+ updateStatusMessages();
+ }
+
+ if (mGenLOD)
+ {
+ mGenLOD = false;
+ genLODs();
+ refresh();
+ updateStatusMessages();
+ }
+
+}
+//-----------------------------------------------------------------------------
+// getTranslationForJointOffset()
+//-----------------------------------------------------------------------------
+LLVector3 LLModelPreview::getTranslationForJointOffset( std::string joint )
+{
+ LLMatrix4 jointTransform;
+ if ( mJointTransformMap.find( joint ) != mJointTransformMap.end() )
+ {
+ jointTransform = mJointTransformMap[joint];
+ return jointTransform.getTranslation();
+ }
+ return LLVector3(0.0f,0.0f,0.0f);
+}
+//-----------------------------------------------------------------------------
+// createPreviewAvatar
+//-----------------------------------------------------------------------------
+void LLModelPreview::createPreviewAvatar( void )
+{
+ mPreviewAvatar = (LLVOAvatar*)gObjectList.createObjectViewer( LL_PCODE_LEGACY_AVATAR, gAgent.getRegion() );
+ if ( mPreviewAvatar )
+ {
+ mPreviewAvatar->createDrawable( &gPipeline );
+ mPreviewAvatar->mIsDummy = TRUE;
+ mPreviewAvatar->mSpecialRenderMode = 1;
+ mPreviewAvatar->setPositionAgent( LLVector3::zero );
+ mPreviewAvatar->slamPosition();
+ mPreviewAvatar->updateJointLODs();
+ mPreviewAvatar->updateGeometry( mPreviewAvatar->mDrawable );
+ mPreviewAvatar->startMotion( ANIM_AGENT_STAND );
+ mPreviewAvatar->hideSkirt();
+ }
+ else
+ {
+ llinfos<<"Failed to create preview avatar for upload model window"<<llendl;
+ }
+}
+
+void LLModelPreview::addEmptyFace( LLModel* pTarget )
+{
+ U32 type_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0;
+
+ LLPointer<LLVertexBuffer> buff = new LLVertexBuffer(type_mask, 0);
+
+ buff->allocateBuffer(1, 3, true);
+ memset( (U8*) buff->getMappedData(), 0, buff->getSize() );
+ memset( (U8*) buff->getIndicesPointer(), 0, buff->getIndicesSize() );
+
+ buff->validateRange( 0, buff->getNumVerts()-1, buff->getNumIndices(), 0 );
+
+ LLStrider<LLVector3> pos;
+ LLStrider<LLVector3> norm;
+ LLStrider<LLVector2> tc;
+ LLStrider<U16> index;
+
+ buff->getVertexStrider(pos);
+
+ if ( type_mask & LLVertexBuffer::MAP_NORMAL )
+ {
+ buff->getNormalStrider(norm);
+ }
+ if ( type_mask & LLVertexBuffer::MAP_TEXCOORD0 )
+ {
+ buff->getTexCoord0Strider(tc);
+ }
+
+ buff->getIndexStrider(index);
+
+ //resize face array
+ int faceCnt = pTarget->getNumVolumeFaces();
+ pTarget->setNumVolumeFaces( faceCnt+1 );
+ pTarget->setVolumeFaceData( faceCnt+1, pos, norm, tc, index, buff->getNumVerts(), buff->getNumIndices() );
+
+}
+//-----------------------------------------------------------------------------
+// render()
+//-----------------------------------------------------------------------------
+BOOL LLModelPreview::render()
+{
+ assert_main_thread();
+
+ LLMutexLock lock(this);
+ mNeedsUpdate = FALSE;
+
+ bool use_shaders = LLGLSLShader::sNoFixedFunction;
+
+ bool edges = mViewOption["show_edges"];
+ bool joint_positions = mViewOption["show_joint_positions"];
+ bool skin_weight = mViewOption["show_skin_weight"];
+ bool textures = mViewOption["show_textures"];
+ bool physics = mViewOption["show_physics"];
+
+ S32 width = getWidth();
+ S32 height = getHeight();
+
+ LLGLSUIDefault def;
+ LLGLDisable no_blend(GL_BLEND);
+ LLGLEnable cull(GL_CULL_FACE);
+ LLGLDepthTest depth(GL_TRUE);
+ LLGLDisable fog(GL_FOG);
+
+ {
+ if (use_shaders)
+ {
+ gUIProgram.bind();
+ }
+ //clear background to blue
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.pushMatrix();
+ gGL.loadIdentity();
+ gGL.ortho(0.0f, width, 0.0f, height, -1.0f, 1.0f);
+
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.pushMatrix();
+ gGL.loadIdentity();
+
+ gGL.color4f(0.169f, 0.169f, 0.169f, 1.f);
+
+ gl_rect_2d_simple( width, height );
+
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.popMatrix();
+
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.popMatrix();
+ if (use_shaders)
+ {
+ gUIProgram.unbind();
+ }
+ }
+
+ LLFloaterModelPreview* fmp = LLFloaterModelPreview::sInstance;
+
+ bool has_skin_weights = false;
+ bool upload_skin = mFMP->childGetValue("upload_skin").asBoolean();
+ bool upload_joints = mFMP->childGetValue("upload_joints").asBoolean();
+
+ bool resetJoints = false;
+ if ( upload_joints != mLastJointUpdate )
+ {
+ if ( mLastJointUpdate )
+ {
+ resetJoints = true;
+ }
+
+ mLastJointUpdate = upload_joints;
+
+ }
+
+ for (LLModelLoader::scene::iterator iter = mScene[mPreviewLOD].begin(); iter != mScene[mPreviewLOD].end(); ++iter)
+ {
+ for (LLModelLoader::model_instance_list::iterator model_iter = iter->second.begin(); model_iter != iter->second.end(); ++model_iter)
+ {
+ LLModelInstance& instance = *model_iter;
+ LLModel* model = instance.mModel;
+ model->mPelvisOffset = mPelvisZOffset;
+ if (!model->mSkinWeights.empty())
+ {
+ has_skin_weights = true;
+ }
+ }
+ }
+
+ if (has_skin_weights)
+ { //model has skin weights, enable view options for skin weights and joint positions
+ if (fmp && isLegacyRigValid() )
+ {
+ fmp->enableViewOption("show_skin_weight");
+ fmp->setViewOptionEnabled("show_joint_positions", skin_weight);
+ mFMP->childEnable("upload_skin");
+ }
+ }
+ else
+ {
+ mFMP->childDisable("upload_skin");
+ if (fmp)
+ {
+ mViewOption["show_skin_weight"] = false;
+ fmp->disableViewOption("show_skin_weight");
+ fmp->disableViewOption("show_joint_positions");
+ }
+ skin_weight = false;
+ }
+
+ if (upload_skin && !has_skin_weights)
+ { //can't upload skin weights if model has no skin weights
+ mFMP->childSetValue("upload_skin", false);
+ upload_skin = false;
+ }
+
+ if (!upload_skin && upload_joints)
+ { //can't upload joints if not uploading skin weights
+ mFMP->childSetValue("upload_joints", false);
+ upload_joints = false;
+ }
+
+ //Only enable joint offsets if it passed the earlier critiquing
+ if ( isRigValidForJointPositionUpload() )
+ {
+ mFMP->childSetEnabled("upload_joints", upload_skin);
+ }
+
+ F32 explode = mFMP->childGetValue("physics_explode").asReal();
+
+ glClear(GL_DEPTH_BUFFER_BIT);
+
+ LLRect preview_rect;
+
+ preview_rect = mFMP->getChildView("preview_panel")->getRect();
+
+ F32 aspect = (F32) preview_rect.getWidth()/preview_rect.getHeight();
+
+ LLViewerCamera::getInstance()->setAspect(aspect);
+
+ LLViewerCamera::getInstance()->setView(LLViewerCamera::getInstance()->getDefaultFOV() / mCameraZoom);
+
+ LLVector3 offset = mCameraOffset;
+ LLVector3 target_pos = mPreviewTarget+offset;
+
+ F32 z_near = 0.001f;
+ F32 z_far = mCameraDistance*10.0f+mPreviewScale.magVec()+mCameraOffset.magVec();
+
+ if (skin_weight)
+ {
+ target_pos = getPreviewAvatar()->getPositionAgent();
+ z_near = 0.01f;
+ z_far = 1024.f;
+ mCameraDistance = 16.f;
+
+ //render avatar previews every frame
+ refresh();
+ }
+
+ gGL.loadIdentity();
+ gPipeline.enableLightsPreview();
+
+ LLQuaternion camera_rot = LLQuaternion(mCameraPitch, LLVector3::y_axis) *
+ LLQuaternion(mCameraYaw, LLVector3::z_axis);
+
+ LLQuaternion av_rot = camera_rot;
+ LLViewerCamera::getInstance()->setOriginAndLookAt(
+ target_pos + ((LLVector3(mCameraDistance, 0.f, 0.f) + offset) * av_rot), // camera
+ LLVector3::z_axis, // up
+ target_pos); // point of interest
+
+
+ z_near = llclamp(z_far * 0.001f, 0.001f, 0.1f);
+
+ LLViewerCamera::getInstance()->setPerspective(FALSE, mOrigin.mX, mOrigin.mY, width, height, FALSE, z_near, z_far);
+
+ stop_glerror();
+
+ gGL.pushMatrix();
+ const F32 BRIGHTNESS = 0.9f;
+ gGL.color3f(BRIGHTNESS, BRIGHTNESS, BRIGHTNESS);
+
+ const U32 type_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0;
+
+ if (use_shaders)
+ {
+ gObjectPreviewProgram.bind();
+ }
+
+ LLGLEnable normalize(GL_NORMALIZE);
+
+ if (!mBaseModel.empty() && mVertexBuffer[5].empty())
+ {
+ genBuffers(-1, skin_weight);
+ //genBuffers(3);
+ //genLODs();
+ }
+
+ if (!mModel[mPreviewLOD].empty())
+ {
+ mFMP->childEnable("reset_btn");
+
+ bool regen = mVertexBuffer[mPreviewLOD].empty();
+ if (!regen)
+ {
+ const std::vector<LLPointer<LLVertexBuffer> >& vb_vec = mVertexBuffer[mPreviewLOD].begin()->second;
+ if (!vb_vec.empty())
+ {
+ const LLVertexBuffer* buff = vb_vec[0];
+ regen = buff->hasDataType(LLVertexBuffer::TYPE_WEIGHT4) != skin_weight;
+ }
+ }
+
+ //make sure material lists all match
+ for (U32 i = 0; i < LLModel::NUM_LODS-1; i++)
+ {
+ if (mBaseModel.size() == mModel[i].size())
+ {
+ for (U32 j = 0; j < mBaseModel.size(); ++j)
+ {
+ int refFaceCnt = 0;
+ int modelFaceCnt = 0;
+
+ if ( !mModel[i][j]->matchMaterialOrder(mBaseModel[j], refFaceCnt, modelFaceCnt ) )
+ {
+ mFMP->childDisable( "calculate_btn" );
+ }
+ }
+ }
+ }
+
+ if (regen)
+ {
+ genBuffers(mPreviewLOD, skin_weight);
+ }
+
+ if (!skin_weight)
+ {
+ for (LLMeshUploadThread::instance_list::iterator iter = mUploadData.begin(); iter != mUploadData.end(); ++iter)
+ {
+ LLModelInstance& instance = *iter;
+
+ LLModel* model = instance.mLOD[mPreviewLOD];
+
+ if (!model)
+ {
+ continue;
+ }
+
+ gGL.pushMatrix();
+ LLMatrix4 mat = instance.mTransform;
+
+ gGL.multMatrix((GLfloat*) mat.mMatrix);
+
+ for (U32 i = 0; i < mVertexBuffer[mPreviewLOD][model].size(); ++i)
+ {
+ LLVertexBuffer* buffer = mVertexBuffer[mPreviewLOD][model][i];
+
+ buffer->setBuffer(type_mask & buffer->getTypeMask());
+
+ if (textures)
+ {
+ int materialCnt = instance.mModel->mMaterialList.size();
+ if ( i < materialCnt )
+ {
+ const std::string& binding = instance.mModel->mMaterialList[i];
+ const LLImportMaterial& material = instance.mMaterial[binding];
+
+ gGL.diffuseColor4fv(material.mDiffuseColor.mV);
+
+ if (material.mDiffuseMap.notNull())
+ {
+ if (material.mDiffuseMap->getDiscardLevel() > -1)
+ {
+ gGL.getTexUnit(0)->bind(material.mDiffuseMap, true);
+ mTextureSet.insert(material.mDiffuseMap.get());
+ }
+ }
+ }
+ }
+ else
+ {
+ gGL.diffuseColor4f(1,1,1,1);
+ }
+
+ buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts()-1, buffer->getNumIndices(), 0);
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+ gGL.diffuseColor3f(0.4f, 0.4f, 0.4f);
+
+ if (edges)
+ {
+ glLineWidth(3.f);
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts()-1, buffer->getNumIndices(), 0);
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ glLineWidth(1.f);
+ }
+ }
+ gGL.popMatrix();
+ }
+
+ if (physics)
+ {
+ glClear(GL_DEPTH_BUFFER_BIT);
+
+ for (U32 i = 0; i < 2; i++)
+ {
+ if (i == 0)
+ { //depth only pass
+ gGL.setColorMask(false, false);
+ }
+ else
+ {
+ gGL.setColorMask(true, true);
+ }
+
+ //enable alpha blending on second pass but not first pass
+ LLGLState blend(GL_BLEND, i);
+
+ gGL.blendFunc(LLRender::BF_SOURCE_ALPHA, LLRender::BF_ONE_MINUS_SOURCE_ALPHA);
+
+ for (LLMeshUploadThread::instance_list::iterator iter = mUploadData.begin(); iter != mUploadData.end(); ++iter)
+ {
+ LLModelInstance& instance = *iter;
+
+ LLModel* model = instance.mLOD[LLModel::LOD_PHYSICS];
+
+ if (!model)
+ {
+ continue;
+ }
+
+ gGL.pushMatrix();
+ LLMatrix4 mat = instance.mTransform;
+
+ gGL.multMatrix((GLfloat*) mat.mMatrix);
+
+
+ bool render_mesh = true;
+
+ LLPhysicsDecomp* decomp = gMeshRepo.mDecompThread;
+ if (decomp)
+ {
+ LLMutexLock(decomp->mMutex);
+
+ LLModel::Decomposition& physics = model->mPhysics;
+
+ if (!physics.mHull.empty())
+ {
+ render_mesh = false;
+
+ if (physics.mMesh.empty())
+ { //build vertex buffer for physics mesh
+ gMeshRepo.buildPhysicsMesh(physics);
+ }
+
+ if (!physics.mMesh.empty())
+ { //render hull instead of mesh
+ for (U32 i = 0; i < physics.mMesh.size(); ++i)
+ {
+ if (explode > 0.f)
+ {
+ gGL.pushMatrix();
+
+ LLVector3 offset = model->mHullCenter[i]-model->mCenterOfHullCenters;
+ offset *= explode;
+
+ gGL.translatef(offset.mV[0], offset.mV[1], offset.mV[2]);
+ }
+
+ static std::vector<LLColor4U> hull_colors;
+
+ if (i+1 >= hull_colors.size())
+ {
+ hull_colors.push_back(LLColor4U(rand()%128+127, rand()%128+127, rand()%128+127, 128));
+ }
+
+ glColor4ubv(hull_colors[i].mV);
+ LLVertexBuffer::drawArrays(LLRender::TRIANGLES, physics.mMesh[i].mPositions, physics.mMesh[i].mNormals);
+
+ if (explode > 0.f)
+ {
+ gGL.popMatrix();
+ }
+ }
+ }
+ }
+ }
+
+ if (render_mesh)
+ {
+ if (mVertexBuffer[LLModel::LOD_PHYSICS].empty())
+ {
+ genBuffers(LLModel::LOD_PHYSICS, false);
+ }
+ for (U32 i = 0; i < mVertexBuffer[LLModel::LOD_PHYSICS][model].size(); ++i)
+ {
+ LLVertexBuffer* buffer = mVertexBuffer[LLModel::LOD_PHYSICS][model][i];
+
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+ gGL.diffuseColor4f(0.4f, 0.4f, 0.0f, 0.4f);
+
+ buffer->setBuffer(type_mask & buffer->getTypeMask());
+ buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts()-1, buffer->getNumIndices(), 0);
+
+ gGL.diffuseColor3f(1.f, 1.f, 0.f);
+
+ glLineWidth(2.f);
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts()-1, buffer->getNumIndices(), 0);
+
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ glLineWidth(1.f);
+ }
+ }
+
+ gGL.popMatrix();
+ }
+
+ glLineWidth(3.f);
+ glPointSize(8.f);
+ gPipeline.enableLightsFullbright(LLColor4::white);
+ //show degenerate triangles
+ LLGLDepthTest depth(GL_TRUE, GL_TRUE, GL_ALWAYS);
+ LLGLDisable cull(GL_CULL_FACE);
+ gGL.diffuseColor4f(1.f,0.f,0.f,1.f);
+ const LLVector4a scale(0.5f);
+
+ for (LLMeshUploadThread::instance_list::iterator iter = mUploadData.begin(); iter != mUploadData.end(); ++iter)
+ {
+ LLModelInstance& instance = *iter;
+
+ LLModel* model = instance.mLOD[LLModel::LOD_PHYSICS];
+
+ if (!model)
+ {
+ continue;
+ }
+
+ gGL.pushMatrix();
+ LLMatrix4 mat = instance.mTransform;
+
+ gGL.multMatrix((GLfloat*) mat.mMatrix);
+
+
+ LLPhysicsDecomp* decomp = gMeshRepo.mDecompThread;
+ if (decomp)
+ {
+ LLMutexLock(decomp->mMutex);
+
+ LLModel::Decomposition& physics = model->mPhysics;
+
+ if (physics.mHull.empty())
+ {
+ if (mVertexBuffer[LLModel::LOD_PHYSICS].empty())
+ {
+ genBuffers(LLModel::LOD_PHYSICS, false);
+ }
+
+ for (U32 i = 0; i < mVertexBuffer[LLModel::LOD_PHYSICS][model].size(); ++i)
+ {
+ LLVertexBuffer* buffer = mVertexBuffer[LLModel::LOD_PHYSICS][model][i];
+
+ buffer->setBuffer(type_mask & buffer->getTypeMask());
+
+ LLStrider<LLVector3> pos_strider;
+ buffer->getVertexStrider(pos_strider, 0);
+ LLVector4a* pos = (LLVector4a*) pos_strider.get();
+
+ LLStrider<U16> idx;
+ buffer->getIndexStrider(idx, 0);
+
+ for (U32 i = 0; i < buffer->getNumIndices(); i += 3)
+ {
+ LLVector4a v1; v1.setMul(pos[*idx++], scale);
+ LLVector4a v2; v2.setMul(pos[*idx++], scale);
+ LLVector4a v3; v3.setMul(pos[*idx++], scale);
+
+ if (ll_is_degenerate(v1,v2,v3))
+ {
+ buffer->draw(LLRender::LINE_LOOP, 3, i);
+ buffer->draw(LLRender::POINTS, 3, i);
+ }
+ }
+ }
+ }
+ }
+
+ gGL.popMatrix();
+ }
+ glLineWidth(1.f);
+ glPointSize(1.f);
+ gPipeline.enableLightsPreview();
+ gGL.setSceneBlendType(LLRender::BT_ALPHA);
+ }
+ }
+ }
+ else
+ {
+ target_pos = getPreviewAvatar()->getPositionAgent();
+
+ LLViewerCamera::getInstance()->setOriginAndLookAt(
+ target_pos + ((LLVector3(mCameraDistance, 0.f, 0.f) + offset) * av_rot), // camera
+ LLVector3::z_axis, // up
+ target_pos); // point of interest
+
+ if (joint_positions)
+ {
+ LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr;
+ if (shader)
+ {
+ gDebugProgram.bind();
+ }
+ getPreviewAvatar()->renderCollisionVolumes();
+ if (shader)
+ {
+ shader->bind();
+ }
+ }
+
+ for (LLModelLoader::scene::iterator iter = mScene[mPreviewLOD].begin(); iter != mScene[mPreviewLOD].end(); ++iter)
+ {
+ for (LLModelLoader::model_instance_list::iterator model_iter = iter->second.begin(); model_iter != iter->second.end(); ++model_iter)
+ {
+ LLModelInstance& instance = *model_iter;
+ LLModel* model = instance.mModel;
+
+ if (!model->mSkinWeights.empty())
+ {
+ for (U32 i = 0; i < mVertexBuffer[mPreviewLOD][model].size(); ++i)
+ {
+ LLVertexBuffer* buffer = mVertexBuffer[mPreviewLOD][model][i];
+
+ const LLVolumeFace& face = model->getVolumeFace(i);
+
+ LLStrider<LLVector3> position;
+ buffer->getVertexStrider(position);
+
+ LLStrider<LLVector4> weight;
+ buffer->getWeight4Strider(weight);
+
+ //quick 'n dirty software vertex skinning
+
+ //build matrix palette
+
+ LLMatrix4 mat[64];
+ for (U32 j = 0; j < model->mSkinInfo.mJointNames.size(); ++j)
+ {
+ LLJoint* joint = getPreviewAvatar()->getJoint(model->mSkinInfo.mJointNames[j]);
+ if (joint)
+ {
+ mat[j] = model->mSkinInfo.mInvBindMatrix[j];
+ mat[j] *= joint->getWorldMatrix();
+ }
+ }
+
+ for (U32 j = 0; j < buffer->getNumVerts(); ++j)
+ {
+ LLMatrix4 final_mat;
+ final_mat.mMatrix[0][0] = final_mat.mMatrix[1][1] = final_mat.mMatrix[2][2] = final_mat.mMatrix[3][3] = 0.f;
+
+ LLVector4 wght;
+ S32 idx[4];
+
+ F32 scale = 0.f;
+ for (U32 k = 0; k < 4; k++)
+ {
+ F32 w = weight[j].mV[k];
+
+ idx[k] = (S32) floorf(w);
+ wght.mV[k] = w - floorf(w);
+ scale += wght.mV[k];
+ }
+
+ wght *= 1.f/scale;
+
+ for (U32 k = 0; k < 4; k++)
+ {
+ F32* src = (F32*) mat[idx[k]].mMatrix;
+ F32* dst = (F32*) final_mat.mMatrix;
+
+ F32 w = wght.mV[k];
+
+ for (U32 l = 0; l < 16; l++)
+ {
+ dst[l] += src[l]*w;
+ }
+ }
+
+ //VECTORIZE THIS
+ LLVector3 v(face.mPositions[j].getF32ptr());
+
+ v = v * model->mSkinInfo.mBindShapeMatrix;
+ v = v * final_mat;
+
+ position[j] = v;
+ }
+
+ const std::string& binding = instance.mModel->mMaterialList[i];
+ const LLImportMaterial& material = instance.mMaterial[binding];
+
+ buffer->setBuffer(type_mask & buffer->getTypeMask());
+ gGL.diffuseColor4fv(material.mDiffuseColor.mV);
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+ buffer->draw(LLRender::TRIANGLES, buffer->getNumIndices(), 0);
+ gGL.diffuseColor3f(0.4f, 0.4f, 0.4f);
+
+ if (edges)
+ {
+ glLineWidth(3.f);
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ buffer->draw(LLRender::TRIANGLES, buffer->getNumIndices(), 0);
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ glLineWidth(1.f);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if (use_shaders)
+ {
+ gObjectPreviewProgram.unbind();
+ }
+
+ gGL.popMatrix();
+
+ return TRUE;
+}
+
+//-----------------------------------------------------------------------------
+// refresh()
+//-----------------------------------------------------------------------------
+void LLModelPreview::refresh()
+{
+ mNeedsUpdate = TRUE;
+}
+
+//-----------------------------------------------------------------------------
+// rotate()
+//-----------------------------------------------------------------------------
+void LLModelPreview::rotate(F32 yaw_radians, F32 pitch_radians)
+{
+ mCameraYaw = mCameraYaw + yaw_radians;
+
+ mCameraPitch = llclamp(mCameraPitch + pitch_radians, F_PI_BY_TWO * -0.8f, F_PI_BY_TWO * 0.8f);
+}
+
+//-----------------------------------------------------------------------------
+// zoom()
+//-----------------------------------------------------------------------------
+void LLModelPreview::zoom(F32 zoom_amt)
+{
+ F32 new_zoom = mCameraZoom+zoom_amt;
+
+ mCameraZoom = llclamp(new_zoom, 1.f, 10.f);
+}
+
+void LLModelPreview::pan(F32 right, F32 up)
+{
+ mCameraOffset.mV[VY] = llclamp(mCameraOffset.mV[VY] + right * mCameraDistance / mCameraZoom, -1.f, 1.f);
+ mCameraOffset.mV[VZ] = llclamp(mCameraOffset.mV[VZ] + up * mCameraDistance / mCameraZoom, -1.f, 1.f);
+}
+
+void LLModelPreview::setPreviewLOD(S32 lod)
+{
+ lod = llclamp(lod, 0, (S32) LLModel::LOD_HIGH);
+
+ if (lod != mPreviewLOD)
+ {
+ mPreviewLOD = lod;
+
+ LLComboBox* combo_box = mFMP->getChild<LLComboBox>("preview_lod_combo");
+ combo_box->setCurrentByIndex((NUM_LOD-1)-mPreviewLOD); // combo box list of lods is in reverse order
+ mFMP->childSetText("lod_file_" + lod_name[mPreviewLOD], mLODFile[mPreviewLOD]);
+
+ LLComboBox* combo_box2 = mFMP->getChild<LLComboBox>("preview_lod_combo2");
+ combo_box2->setCurrentByIndex((NUM_LOD-1)-mPreviewLOD); // combo box list of lods is in reverse order
+
+ LLComboBox* combo_box3 = mFMP->getChild<LLComboBox>("preview_lod_combo3");
+ combo_box3->setCurrentByIndex((NUM_LOD-1)-mPreviewLOD); // combo box list of lods is in reverse order
+
+ LLColor4 highlight_color = LLUIColorTable::instance().getColor("MeshImportTableHighlightColor");
+ LLColor4 normal_color = LLUIColorTable::instance().getColor("MeshImportTableNormalColor");
+
+ for (S32 i = 0; i <= LLModel::LOD_HIGH; ++i)
+ {
+ const LLColor4& color = (i == lod) ? highlight_color : normal_color;
+
+ mFMP->childSetColor(lod_status_name[i], color);
+ mFMP->childSetColor(lod_label_name[i], color);
+ mFMP->childSetColor(lod_triangles_name[i], color);
+ mFMP->childSetColor(lod_vertices_name[i], color);
+ }
+ }
+ refresh();
+ updateStatusMessages();
+}
+
+void LLFloaterModelPreview::onBrowseLOD(S32 lod)
+{
+ assert_main_thread();
+
+ loadModel(lod);
+}
+
+//static
+void LLFloaterModelPreview::onReset(void* user_data)
+{
+ assert_main_thread();
+
+ LLFloaterModelPreview* fmp = (LLFloaterModelPreview*) user_data;
+ fmp->childDisable("reset_btn");
+ LLModelPreview* mp = fmp->mModelPreview;
+ std::string filename = mp->mLODFile[3];
+
+ fmp->resetDisplayOptions();
+ //reset model preview
+ fmp->initModelPreview();
+
+ mp = fmp->mModelPreview;
+ mp->loadModel(filename,3,true);
+}
+
+//static
+void LLFloaterModelPreview::onUpload(void* user_data)
+{
+ assert_main_thread();
+
+ LLFloaterModelPreview* mp = (LLFloaterModelPreview*) user_data;
+
+ mp->mUploadBtn->setEnabled(false);
+
+ mp->mModelPreview->rebuildUploadData();
+
+ bool upload_skinweights = mp->childGetValue("upload_skin").asBoolean();
+ bool upload_joint_positions = mp->childGetValue("upload_joints").asBoolean();
+
+ mp->mModelPreview->saveUploadData(upload_skinweights, upload_joint_positions);
+
+ gMeshRepo.uploadModel(mp->mModelPreview->mUploadData, mp->mModelPreview->mPreviewScale,
+ mp->childGetValue("upload_textures").asBoolean(), upload_skinweights, upload_joint_positions, mp->mUploadModelUrl,
+ true, LLHandle<LLWholeModelFeeObserver>(), mp->getWholeModelUploadObserverHandle());
+}
+
+
+void LLFloaterModelPreview::refresh()
+{
+ sInstance->toggleCalculateButton(true);
+ sInstance->mModelPreview->mDirty = true;
+}
+
+//static
+void LLModelPreview::textureLoadedCallback( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* src_aux, S32 discard_level, BOOL final, void* userdata )
+{
+ LLModelPreview* preview = (LLModelPreview*) userdata;
+ preview->refresh();
+
+ if(final && preview->mModelLoader)
+ {
+ if(preview->mModelLoader->mNumOfFetchingTextures > 0)
+ {
+ preview->mModelLoader->mNumOfFetchingTextures-- ;
+ }
+ }
+}
+
+void LLModelPreview::onLODParamCommit(S32 lod, bool enforce_tri_limit)
+{
+ if (!mLODFrozen)
+ {
+ genLODs(lod, 3, enforce_tri_limit);
+ refresh();
+ }
+}
+
+LLFloaterModelPreview::DecompRequest::DecompRequest(const std::string& stage, LLModel* mdl)
+{
+ mStage = stage;
+ mContinue = 1;
+ mModel = mdl;
+ mDecompID = &mdl->mDecompID;
+ mParams = sInstance->mDecompParams;
+
+ //copy out positions and indices
+ assignData(mdl) ;
+}
+
+void LLFloaterModelPreview::setStatusMessage(const std::string& msg)
+{
+ LLMutexLock lock(mStatusLock);
+ mStatusMessage = msg;
+}
+
+void LLFloaterModelPreview::toggleCalculateButton()
+{
+ toggleCalculateButton(true);
+}
+
+void LLFloaterModelPreview::toggleCalculateButton(bool visible)
+{
+ mCalculateBtn->setVisible(visible);
+
+ bool uploadingSkin = childGetValue("upload_skin").asBoolean();
+ bool uploadingJointPositions = childGetValue("upload_joints").asBoolean();
+ if ( uploadingSkin )
+ {
+ //Disable the calculate button *if* the rig is invalid - which is determined during the critiquing process
+ if ( uploadingJointPositions && !mModelPreview->isRigValidForJointPositionUpload() )
+ {
+ mCalculateBtn->setVisible( false );
+ }
+ }
+
+ mUploadBtn->setVisible(!visible);
+ mUploadBtn->setEnabled(mHasUploadPerm && !mUploadModelUrl.empty());
+
+ if (visible)
+ {
+ std::string tbd = getString("tbd");
+ childSetTextArg("prim_weight", "[EQ]", tbd);
+ childSetTextArg("download_weight", "[ST]", tbd);
+ childSetTextArg("server_weight", "[SIM]", tbd);
+ childSetTextArg("physics_weight", "[PH]", tbd);
+ childSetTextArg("upload_fee", "[FEE]", tbd);
+ childSetTextArg("price_breakdown", "[STREAMING]", tbd);
+ childSetTextArg("price_breakdown", "[PHYSICS]", tbd);
+ childSetTextArg("price_breakdown", "[INSTANCES]", tbd);
+ childSetTextArg("price_breakdown", "[TEXTURES]", tbd);
+ childSetTextArg("price_breakdown", "[MODEL]", tbd);
+ }
+}
+
+void LLFloaterModelPreview::onLoDSourceCommit(S32 lod)
+{
+ mModelPreview->updateLodControls(lod);
+ refresh();
+}
+
+void LLFloaterModelPreview::resetDisplayOptions()
+{
+ std::map<std::string,bool>::iterator option_it = mModelPreview->mViewOption.begin();
+
+ for(;option_it != mModelPreview->mViewOption.end(); ++option_it)
+ {
+ LLUICtrl* ctrl = getChild<LLUICtrl>(option_it->first);
+ ctrl->setValue(false);
+ }
+}
+
+void LLFloaterModelPreview::onModelPhysicsFeeReceived(const LLSD& result, std::string upload_url)
+{
+ mModelPhysicsFee = result;
+ mModelPhysicsFee["url"] = upload_url;
+
+ doOnIdleOneTime(boost::bind(&LLFloaterModelPreview::handleModelPhysicsFeeReceived,this));
+}
+
+void LLFloaterModelPreview::handleModelPhysicsFeeReceived()
+{
+ const LLSD& result = mModelPhysicsFee;
+ mUploadModelUrl = result["url"].asString();
+
+ childSetTextArg("prim_weight", "[EQ]", llformat("%0.3f", result["resource_cost"].asReal()));
+ childSetTextArg("download_weight", "[ST]", llformat("%0.3f", result["model_streaming_cost"].asReal()));
+ childSetTextArg("server_weight", "[SIM]", llformat("%0.3f", result["simulation_cost"].asReal()));
+ childSetTextArg("physics_weight", "[PH]", llformat("%0.3f", result["physics_cost"].asReal()));
+ childSetTextArg("upload_fee", "[FEE]", llformat("%d", result["upload_price"].asInteger()));
+ childSetTextArg("price_breakdown", "[STREAMING]", llformat("%d", result["upload_price_breakdown"]["mesh_streaming"].asInteger()));
+ childSetTextArg("price_breakdown", "[PHYSICS]", llformat("%d", result["upload_price_breakdown"]["mesh_physics"].asInteger()));
+ childSetTextArg("price_breakdown", "[INSTANCES]", llformat("%d", result["upload_price_breakdown"]["mesh_instance"].asInteger()));
+ childSetTextArg("price_breakdown", "[TEXTURES]", llformat("%d", result["upload_price_breakdown"]["texture"].asInteger()));
+ childSetTextArg("price_breakdown", "[MODEL]", llformat("%d", result["upload_price_breakdown"]["model"].asInteger()));
+ childSetVisible("upload_fee", true);
+ childSetVisible("price_breakdown", true);
+ mUploadBtn->setEnabled(mHasUploadPerm && !mUploadModelUrl.empty());
+}
+
+void LLFloaterModelPreview::setModelPhysicsFeeErrorStatus(U32 status, const std::string& reason)
+{
+ llwarns << "LLFloaterModelPreview::setModelPhysicsFeeErrorStatus(" << status << " : " << reason << ")" << llendl;
+ doOnIdleOneTime(boost::bind(&LLFloaterModelPreview::toggleCalculateButton, this, true));
+}
+
+/*virtual*/
+void LLFloaterModelPreview::onModelUploadSuccess()
+{
+ assert_main_thread();
+ closeFloater(false);
+}
+
+/*virtual*/
+void LLFloaterModelPreview::onModelUploadFailure()
+{
+ assert_main_thread();
+ toggleCalculateButton(true);
+ mUploadBtn->setEnabled(true);
+}
+
+S32 LLFloaterModelPreview::DecompRequest::statusCallback(const char* status, S32 p1, S32 p2)
+{
+ if (mContinue)
+ {
+ setStatusMessage(llformat("%s: %d/%d", status, p1, p2));
+ if (LLFloaterModelPreview::sInstance)
+ {
+ LLFloaterModelPreview::sInstance->setStatusMessage(mStatusMessage);
+ }
+ }
+
+ return mContinue;
+}
+
+void LLFloaterModelPreview::DecompRequest::completed()
+{ //called from the main thread
+ if (mContinue)
+ {
+ mModel->setConvexHullDecomposition(mHull);
+
+ if (sInstance)
+ {
+ if (mContinue)
+ {
+ if (sInstance->mModelPreview)
+ {
+ sInstance->mModelPreview->mDirty = true;
+ LLFloaterModelPreview::sInstance->mModelPreview->refresh();
+ }
+ }
+
+ sInstance->mCurRequest.erase(this);
+ }
+ }
+ else if (sInstance)
+ {
+ llassert(sInstance->mCurRequest.find(this) == sInstance->mCurRequest.end());
+ }
+}
+
+void dump_llsd_to_file(const LLSD& content, std::string filename);
+
+void LLFloaterModelPreview::onPermissionsReceived(const LLSD& result)
+{
+ dump_llsd_to_file(result,"perm_received.xml");
+ std::string upload_status = result["mesh_upload_status"].asString();
+ // BAP HACK: handle "" for case that MeshUploadFlag cap is broken.
+ mHasUploadPerm = (("" == upload_status) || ("valid" == upload_status));
+
+ //mUploadBtn->setEnabled(mHasUploadPerm);
+ mUploadBtn->setEnabled(mHasUploadPerm && !mUploadModelUrl.empty());
+ getChild<LLTextBox>("warning_title")->setVisible(!mHasUploadPerm);
+ getChild<LLTextBox>("warning_message")->setVisible(!mHasUploadPerm);
+}
+
+void LLFloaterModelPreview::setPermissonsErrorStatus(U32 status, const std::string& reason)
+{
+ llwarns << "LLFloaterModelPreview::setPermissonsErrorStatus(" << status << " : " << reason << ")" << llendl;
+
+ LLNotificationsUtil::add("MeshUploadPermError");
+}
diff --git a/indra/newview/llfloatermodelpreview.h b/indra/newview/llfloatermodelpreview.h
new file mode 100644
index 0000000000..c522e6f734
--- /dev/null
+++ b/indra/newview/llfloatermodelpreview.h
@@ -0,0 +1,473 @@
+/**
+ * @file llfloatermodelpreview.h
+ * @brief LLFloaterModelPreview class definition
+ *
+ * $LicenseInfo:firstyear=2004&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLFLOATERMODELPREVIEW_H
+#define LL_LLFLOATERMODELPREVIEW_H
+
+#include "llfloaternamedesc.h"
+
+#include "lldynamictexture.h"
+#include "llquaternion.h"
+#include "llmeshrepository.h"
+#include "llmodel.h"
+#include "llthread.h"
+#include "llviewermenufile.h"
+#include "llfloatermodeluploadbase.h"
+
+class LLComboBox;
+class LLJoint;
+class LLViewerJointMesh;
+class LLVOAvatar;
+class LLTextBox;
+class LLVertexBuffer;
+class LLModelPreview;
+class LLFloaterModelPreview;
+class daeElement;
+class domProfile_COMMON;
+class domInstance_geometry;
+class domNode;
+class domTranslate;
+class domController;
+class LLMenuButton;
+class LLToggleableMenu;
+
+typedef std::map<std::string, LLMatrix4> JointTransformMap;
+typedef std::map<std::string, LLMatrix4>:: iterator JointTransformMapIt;
+
+const S32 NUM_LOD = 4;
+
+class LLModelLoader : public LLThread
+{
+public:
+ typedef enum
+ {
+ STARTING = 0,
+ READING_FILE,
+ CREATING_FACES,
+ GENERATING_VERTEX_BUFFERS,
+ GENERATING_LOD,
+ DONE,
+ ERROR_PARSING, //basically loading failed
+ ERROR_MATERIALS,
+ } eLoadState;
+
+ U32 mState;
+ std::string mFilename;
+ S32 mLod;
+ LLModelPreview* mPreview;
+ LLMatrix4 mTransform;
+ BOOL mFirstTransform;
+ LLVector3 mExtents[2];
+ bool mTrySLM;
+
+ std::map<daeElement*, LLPointer<LLModel> > mModel;
+
+ typedef std::vector<LLPointer<LLModel> > model_list;
+ model_list mModelList;
+
+ typedef std::vector<LLModelInstance> model_instance_list;
+
+ typedef std::map<LLMatrix4, model_instance_list > scene;
+
+ scene mScene;
+
+ typedef std::queue<LLPointer<LLModel> > model_queue;
+
+ //queue of models that need a physics rep
+ model_queue mPhysicsQ;
+
+ LLModelLoader( std::string filename, S32 lod, LLModelPreview* preview, JointTransformMap& jointMap,
+ std::deque<std::string>& jointsFromNodes );
+ ~LLModelLoader() ;
+
+ virtual void run();
+ bool doLoadModel();
+ bool loadFromSLM(const std::string& filename);
+ void loadModelCallback();
+
+ void loadTextures() ; //called in the main thread.
+ void processElement(daeElement* element, bool& badElement);
+ std::map<std::string, LLImportMaterial> getMaterials(LLModel* model, domInstance_geometry* instance_geo);
+ LLImportMaterial profileToMaterial(domProfile_COMMON* material);
+ std::string getElementLabel(daeElement *element);
+ LLColor4 getDaeColor(daeElement* element);
+
+ daeElement* getChildFromElement( daeElement* pElement, std::string const & name );
+
+ bool isNodeAJoint( domNode* pNode );
+ void processJointNode( domNode* pNode, std::map<std::string,LLMatrix4>& jointTransforms );
+ void extractTranslation( domTranslate* pTranslate, LLMatrix4& transform );
+ void extractTranslationViaElement( daeElement* pTranslateElement, LLMatrix4& transform );
+ void extractTranslationViaSID( daeElement* pElement, LLMatrix4& transform );
+
+ void setLoadState(U32 state);
+
+ void buildJointToNodeMappingFromScene( daeElement* pRoot );
+ void processJointToNodeMapping( domNode* pNode );
+ void processChildJoints( domNode* pParentNode );
+
+ //map of avatar joints as named in COLLADA assets to internal joint names
+ std::map<std::string, std::string> mJointMap;
+ JointTransformMap& mJointList;
+ std::deque<std::string>& mJointsFromNode;
+
+ S32 mNumOfFetchingTextures ; //updated in the main thread
+ bool areTexturesReady() { return !mNumOfFetchingTextures; } //called in the main thread.
+
+private:
+ static std::list<LLModelLoader*> sActiveLoaderList;
+ static bool isAlive(LLModelLoader* loader) ;
+};
+
+class LLFloaterModelPreview : public LLFloaterModelUploadBase
+{
+public:
+
+ class DecompRequest : public LLPhysicsDecomp::Request
+ {
+ public:
+ S32 mContinue;
+ LLPointer<LLModel> mModel;
+
+ DecompRequest(const std::string& stage, LLModel* mdl);
+ virtual S32 statusCallback(const char* status, S32 p1, S32 p2);
+ virtual void completed();
+
+ };
+ static LLFloaterModelPreview* sInstance;
+
+ LLFloaterModelPreview(const LLSD& key);
+ virtual ~LLFloaterModelPreview();
+
+ virtual BOOL postBuild();
+
+ void initModelPreview();
+
+ BOOL handleMouseDown(S32 x, S32 y, MASK mask);
+ BOOL handleMouseUp(S32 x, S32 y, MASK mask);
+ BOOL handleHover(S32 x, S32 y, MASK mask);
+ BOOL handleScrollWheel(S32 x, S32 y, S32 clicks);
+
+ /*virtual*/ void onOpen(const LLSD& key);
+
+ static void onMouseCaptureLostModelPreview(LLMouseHandler*);
+ static void setUploadAmount(S32 amount) { sUploadAmount = amount; }
+
+ void setDetails(F32 x, F32 y, F32 z, F32 streaming_cost, F32 physics_cost);
+
+ void onBrowseLOD(S32 lod);
+
+ static void onReset(void* data);
+
+ static void onUpload(void* data);
+
+ void refresh();
+
+ void loadModel(S32 lod);
+ void loadModel(S32 lod, const std::string& file_name, bool force_disable_slm = false);
+
+ void onViewOptionChecked(LLUICtrl* ctrl);
+ bool isViewOptionChecked(const LLSD& userdata);
+ bool isViewOptionEnabled(const LLSD& userdata);
+ void setViewOptionEnabled(const std::string& option, bool enabled);
+ void enableViewOption(const std::string& option);
+ void disableViewOption(const std::string& option);
+
+ // shows warning message if agent has no permissions to upload model
+ /*virtual*/ void onPermissionsReceived(const LLSD& result);
+
+ // called when error occurs during permissions request
+ /*virtual*/ void setPermissonsErrorStatus(U32 status, const std::string& reason);
+
+ /*virtual*/ void onModelPhysicsFeeReceived(const LLSD& result, std::string upload_url);
+ void handleModelPhysicsFeeReceived();
+ /*virtual*/ void setModelPhysicsFeeErrorStatus(U32 status, const std::string& reason);
+
+ /*virtual*/ void onModelUploadSuccess();
+
+ /*virtual*/ void onModelUploadFailure();
+
+protected:
+ friend class LLModelPreview;
+ friend class LLMeshFilePicker;
+ friend class LLPhysicsDecomp;
+
+ static void onImportScaleCommit(LLUICtrl*, void*);
+ static void onPelvisOffsetCommit(LLUICtrl*, void*);
+ static void onUploadJointsCommit(LLUICtrl*,void*);
+ static void onUploadSkinCommit(LLUICtrl*,void*);
+
+ static void onPreviewLODCommit(LLUICtrl*,void*);
+
+ static void onGenerateNormalsCommit(LLUICtrl*,void*);
+
+ void toggleGenarateNormals();
+
+ static void onAutoFillCommit(LLUICtrl*,void*);
+
+ void onLODParamCommit(S32 lod, bool enforce_tri_limit);
+
+ static void onExplodeCommit(LLUICtrl*, void*);
+
+ static void onPhysicsParamCommit(LLUICtrl* ctrl, void* userdata);
+ static void onPhysicsStageExecute(LLUICtrl* ctrl, void* userdata);
+ static void onCancel(LLUICtrl* ctrl, void* userdata);
+ static void onPhysicsStageCancel(LLUICtrl* ctrl, void* userdata);
+
+ static void onPhysicsBrowse(LLUICtrl* ctrl, void* userdata);
+ static void onPhysicsUseLOD(LLUICtrl* ctrl, void* userdata);
+ static void onPhysicsOptimize(LLUICtrl* ctrl, void* userdata);
+ static void onPhysicsDecomposeBack(LLUICtrl* ctrl, void* userdata);
+ static void onPhysicsSimplifyBack(LLUICtrl* ctrl, void* userdata);
+
+ void draw();
+
+ void initDecompControls();
+
+ void setStatusMessage(const std::string& msg);
+
+ LLModelPreview* mModelPreview;
+
+ LLPhysicsDecomp::decomp_params mDecompParams;
+
+ S32 mLastMouseX;
+ S32 mLastMouseY;
+ LLRect mPreviewRect;
+ U32 mGLName;
+ static S32 sUploadAmount;
+
+ std::set<LLPointer<DecompRequest> > mCurRequest;
+ std::string mStatusMessage;
+
+ //use "disabled" as false by default
+ std::map<std::string, bool> mViewOptionDisabled;
+
+ //store which lod mode each LOD is using
+ // 0 - load from file
+ // 1 - auto generate
+ // 2 - use LoD above
+ S32 mLODMode[4];
+
+ LLMutex* mStatusLock;
+
+ LLSD mModelPhysicsFee;
+
+private:
+ void onClickCalculateBtn();
+ void toggleCalculateButton();
+
+ void onLoDSourceCommit(S32 lod);
+
+ // Toggles between "Calculate weights & fee" and "Upload" buttons.
+ void toggleCalculateButton(bool visible);
+
+ // resets display options of model preview to their defaults.
+ void resetDisplayOptions();
+
+ void createSmoothComboBox(LLComboBox* combo_box, float min, float max);
+
+ LLButton* mUploadBtn;
+ LLButton* mCalculateBtn;
+};
+
+class LLMeshFilePicker : public LLFilePickerThread
+{
+public:
+ LLMeshFilePicker(LLModelPreview* mp, S32 lod);
+ virtual void notify(const std::string& filename);
+
+private:
+ LLModelPreview* mMP;
+ S32 mLOD;
+};
+
+
+class LLModelPreview : public LLViewerDynamicTexture, public LLMutex
+{
+ typedef boost::signals2::signal<void (F32 x, F32 y, F32 z, F32 streaming_cost, F32 physics_cost)> details_signal_t;
+ typedef boost::signals2::signal<void (void)> model_loaded_signal_t;
+ typedef boost::signals2::signal<void (bool)> model_updated_signal_t;
+
+public:
+ LLModelPreview(S32 width, S32 height, LLFloater* fmp);
+ virtual ~LLModelPreview();
+
+ void resetPreviewTarget();
+ void setPreviewTarget(F32 distance);
+ void setTexture(U32 name) { mTextureName = name; }
+
+ void setPhysicsFromLOD(S32 lod);
+ BOOL render();
+ void update();
+ void genBuffers(S32 lod, bool skinned);
+ void clearBuffers();
+ void refresh();
+ void rotate(F32 yaw_radians, F32 pitch_radians);
+ void zoom(F32 zoom_amt);
+ void pan(F32 right, F32 up);
+ virtual BOOL needsRender() { return mNeedsUpdate; }
+ void setPreviewLOD(S32 lod);
+ void clearModel(S32 lod);
+ void loadModel(std::string filename, S32 lod, bool force_disable_slm = false);
+ void loadModelCallback(S32 lod);
+ void genLODs(S32 which_lod = -1, U32 decimation = 3, bool enforce_tri_limit = false);
+ void generateNormals();
+ U32 calcResourceCost();
+ void rebuildUploadData();
+ void saveUploadData(bool save_skinweights, bool save_joint_poisitions);
+ void saveUploadData(const std::string& filename, bool save_skinweights, bool save_joint_poisitions);
+ void clearIncompatible(S32 lod);
+ void updateStatusMessages();
+ void updateLodControls(S32 lod);
+ void clearGLODGroup();
+ void onLODParamCommit(S32 lod, bool enforce_tri_limit);
+ void addEmptyFace( LLModel* pTarget );
+
+ const bool getModelPivot( void ) const { return mHasPivot; }
+ void setHasPivot( bool val ) { mHasPivot = val; }
+ void setModelPivot( const LLVector3& pivot ) { mModelPivot = pivot; }
+
+ //Determines the viability of an asset to be used as an avatar rig (w or w/o joint upload caps)
+ void critiqueRigForUploadApplicability( const std::vector<std::string> &jointListFromAsset );
+ void critiqueJointToNodeMappingFromScene( void );
+ //Is a rig valid so that it can be used as a criteria for allowing for uploading of joint positions
+ //Accessors for joint position upload friendly rigs
+ const bool isRigValidForJointPositionUpload( void ) const { return mRigValidJointUpload; }
+ void setRigValidForJointPositionUpload( bool rigValid ) { mRigValidJointUpload = rigValid; }
+ bool isRigSuitableForJointPositionUpload( const std::vector<std::string> &jointListFromAsset );
+ //Determines if a rig is a legacy from the joint list
+ bool isRigLegacy( const std::vector<std::string> &jointListFromAsset );
+ //Accessors for the legacy rigs
+ const bool isLegacyRigValid( void ) const { return mLegacyRigValid; }
+ void setLegacyRigValid( bool rigValid ) { mLegacyRigValid = rigValid; }
+ //Verify that a controller matches vertex counts
+ bool verifyController( domController* pController );
+
+ static void textureLoadedCallback( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* src_aux, S32 discard_level, BOOL final, void* userdata );
+
+ boost::signals2::connection setDetailsCallback( const details_signal_t::slot_type& cb ){ return mDetailsSignal.connect(cb); }
+ boost::signals2::connection setModelLoadedCallback( const model_loaded_signal_t::slot_type& cb ){ return mModelLoadedSignal.connect(cb); }
+ boost::signals2::connection setModelUpdatedCallback( const model_updated_signal_t::slot_type& cb ){ return mModelUpdatedSignal.connect(cb); }
+
+ void setLoadState( U32 state ) { mLoadState = state; }
+ U32 getLoadState() { return mLoadState; }
+ void setRigWithSceneParity( bool state ) { mRigParityWithScene = state; }
+ const bool getRigWithSceneParity( void ) const { return mRigParityWithScene; }
+
+ LLVector3 getTranslationForJointOffset( std::string joint );
+
+private:
+ //Utility function for controller vertex compare
+ bool verifyCount( int expected, int result );
+ //Creates the dummy avatar for the preview window
+ void createPreviewAvatar( void );
+ //Accessor for the dummy avatar
+ LLVOAvatar* getPreviewAvatar( void ) { return mPreviewAvatar; }
+
+ protected:
+ friend class LLModelLoader;
+ friend class LLFloaterModelPreview;
+ friend class LLFloaterModelPreview::DecompRequest;
+ friend class LLPhysicsDecomp;
+
+ LLFloater* mFMP;
+
+ BOOL mNeedsUpdate;
+ bool mDirty;
+ bool mGenLOD;
+ U32 mTextureName;
+ F32 mCameraDistance;
+ F32 mCameraYaw;
+ F32 mCameraPitch;
+ F32 mCameraZoom;
+ LLVector3 mCameraOffset;
+ LLVector3 mPreviewTarget;
+ LLVector3 mPreviewScale;
+ S32 mPreviewLOD;
+ U32 mResourceCost;
+ std::string mLODFile[LLModel::NUM_LODS];
+ bool mLoading;
+ U32 mLoadState;
+ bool mResetJoints;
+ bool mRigParityWithScene;
+
+ std::map<std::string, bool> mViewOption;
+
+ //GLOD object parameters (must rebuild object if these change)
+ bool mLODFrozen;
+ F32 mBuildShareTolerance;
+ U32 mBuildQueueMode;
+ U32 mBuildOperator;
+ U32 mBuildBorderMode;
+ U32 mRequestedLoDMode[LLModel::NUM_LODS];
+ S32 mRequestedTriangleCount[LLModel::NUM_LODS];
+ F32 mRequestedErrorThreshold[LLModel::NUM_LODS];
+ U32 mRequestedBuildOperator[LLModel::NUM_LODS];
+ U32 mRequestedQueueMode[LLModel::NUM_LODS];
+ U32 mRequestedBorderMode[LLModel::NUM_LODS];
+ F32 mRequestedShareTolerance[LLModel::NUM_LODS];
+ F32 mRequestedCreaseAngle[LLModel::NUM_LODS];
+
+ LLModelLoader* mModelLoader;
+
+ LLModelLoader::scene mScene[LLModel::NUM_LODS];
+ LLModelLoader::scene mBaseScene;
+
+ LLModelLoader::model_list mModel[LLModel::NUM_LODS];
+ LLModelLoader::model_list mBaseModel;
+
+ U32 mGroup;
+ std::map<LLPointer<LLModel>, U32> mObject;
+ U32 mMaxTriangleLimit;
+
+ LLMeshUploadThread::instance_list mUploadData;
+ std::set<LLViewerFetchedTexture* > mTextureSet;
+
+ //map of vertex buffers to models (one vertex buffer in vector per face in model
+ std::map<LLModel*, std::vector<LLPointer<LLVertexBuffer> > > mVertexBuffer[LLModel::NUM_LODS+1];
+
+ details_signal_t mDetailsSignal;
+ model_loaded_signal_t mModelLoadedSignal;
+ model_updated_signal_t mModelUpdatedSignal;
+
+ LLVector3 mModelPivot;
+ bool mHasPivot;
+
+ float mPelvisZOffset;
+
+ bool mRigValidJointUpload;
+ bool mLegacyRigValid;
+
+ bool mLastJointUpdate;
+
+ std::deque<std::string> mMasterJointList;
+ std::deque<std::string> mMasterLegacyJointList;
+ std::deque<std::string> mJointsFromNode;
+ JointTransformMap mJointTransformMap;
+ LLPointer<LLVOAvatar> mPreviewAvatar;
+};
+
+#endif // LL_LLFLOATERMODELPREVIEW_H
diff --git a/indra/newview/llfloatermodeluploadbase.cpp b/indra/newview/llfloatermodeluploadbase.cpp
new file mode 100644
index 0000000000..6d3800bfa4
--- /dev/null
+++ b/indra/newview/llfloatermodeluploadbase.cpp
@@ -0,0 +1,58 @@
+/**
+ * @file llfloatermodeluploadbase.cpp
+ * @brief LLFloaterUploadModelBase class definition
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloatermodeluploadbase.h"
+#include "llagent.h"
+#include "llviewerregion.h"
+#include "llnotificationsutil.h"
+
+LLFloaterModelUploadBase::LLFloaterModelUploadBase(const LLSD& key)
+:LLFloater(key),
+ mHasUploadPerm(false)
+{
+}
+
+void LLFloaterModelUploadBase::requestAgentUploadPermissions()
+{
+ std::string capability = "MeshUploadFlag";
+ std::string url = gAgent.getRegion()->getCapability(capability);
+
+ if (!url.empty())
+ {
+ llinfos<< typeid(*this).name() <<"::requestAgentUploadPermissions() requesting for upload model permissions from: "<< url <<llendl;
+ LLHTTPClient::get(url, new LLUploadModelPremissionsResponder(getPermObserverHandle()));
+ }
+ else
+ {
+ LLSD args;
+ args["CAPABILITY"] = capability;
+ LLNotificationsUtil::add("RegionCapabilityRequestError", args);
+ // BAP HACK avoid being blocked by broken server side stuff
+ mHasUploadPerm = true;
+ }
+}
diff --git a/indra/newview/llfloatermodeluploadbase.h b/indra/newview/llfloatermodeluploadbase.h
new file mode 100644
index 0000000000..a52bc28687
--- /dev/null
+++ b/indra/newview/llfloatermodeluploadbase.h
@@ -0,0 +1,61 @@
+/**
+ * @file llfloatermodeluploadbase.h
+ * @brief LLFloaterUploadModelBase class declaration
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLFLOATERMODELUPLOADBASE_H
+#define LL_LLFLOATERMODELUPLOADBASE_H
+
+#include "lluploadfloaterobservers.h"
+
+class LLFloaterModelUploadBase : public LLFloater, public LLUploadPermissionsObserver, public LLWholeModelFeeObserver, public LLWholeModelUploadObserver
+{
+public:
+
+ LLFloaterModelUploadBase(const LLSD& key);
+
+ virtual ~LLFloaterModelUploadBase(){};
+
+ virtual void setPermissonsErrorStatus(U32 status, const std::string& reason) = 0;
+
+ virtual void onPermissionsReceived(const LLSD& result) = 0;
+
+ virtual void onModelPhysicsFeeReceived(const LLSD& result, std::string upload_url) = 0;
+
+ virtual void setModelPhysicsFeeErrorStatus(U32 status, const std::string& reason) = 0;
+
+ virtual void onModelUploadSuccess() {};
+
+ virtual void onModelUploadFailure() {};
+
+protected:
+
+ // requests agent's permissions to upload model
+ void requestAgentUploadPermissions();
+
+ std::string mUploadModelUrl;
+ bool mHasUploadPerm;
+};
+
+#endif /* LL_LLFLOATERMODELUPLOADBASE_H */
diff --git a/indra/newview/llfloaternamedesc.cpp b/indra/newview/llfloaternamedesc.cpp
index ae95d4392a..27b1c3b9cd 100644
--- a/indra/newview/llfloaternamedesc.cpp
+++ b/indra/newview/llfloaternamedesc.cpp
@@ -204,3 +204,43 @@ BOOL LLFloaterSoundPreview::postBuild()
getChild<LLUICtrl>("ok_btn")->setCommitCallback(boost::bind(&LLFloaterNameDesc::onBtnOK, this));
return TRUE;
}
+
+
+//-----------------------------------------------------------------------------
+// LLFloaterAnimPreview()
+//-----------------------------------------------------------------------------
+
+LLFloaterAnimPreview::LLFloaterAnimPreview(const LLSD& filename )
+ : LLFloaterNameDesc(filename)
+{
+}
+
+BOOL LLFloaterAnimPreview::postBuild()
+{
+ if (!LLFloaterNameDesc::postBuild())
+ {
+ return FALSE;
+ }
+ getChild<LLUICtrl>("ok_btn")->setCommitCallback(boost::bind(&LLFloaterNameDesc::onBtnOK, this));
+ return TRUE;
+}
+
+//-----------------------------------------------------------------------------
+// LLFloaterScriptPreview()
+//-----------------------------------------------------------------------------
+
+LLFloaterScriptPreview::LLFloaterScriptPreview(const LLSD& filename )
+ : LLFloaterNameDesc(filename)
+{
+ mIsText = TRUE;
+}
+
+BOOL LLFloaterScriptPreview::postBuild()
+{
+ if (!LLFloaterNameDesc::postBuild())
+ {
+ return FALSE;
+ }
+ getChild<LLUICtrl>("ok_btn")->setCommitCallback(boost::bind(&LLFloaterNameDesc::onBtnOK, this));
+ return TRUE;
+}
diff --git a/indra/newview/llfloaternamedesc.h b/indra/newview/llfloaternamedesc.h
index 7381a6334a..41643681ac 100644
--- a/indra/newview/llfloaternamedesc.h
+++ b/indra/newview/llfloaternamedesc.h
@@ -51,6 +51,7 @@ protected:
protected:
BOOL mIsAudio;
+ bool mIsText;
std::string mFilenameAndPath;
std::string mFilename;
@@ -62,5 +63,19 @@ public:
LLFloaterSoundPreview(const LLSD& filename );
virtual BOOL postBuild();
};
-
+
+class LLFloaterAnimPreview : public LLFloaterNameDesc
+{
+public:
+ LLFloaterAnimPreview(const LLSD& filename );
+ virtual BOOL postBuild();
+};
+
+class LLFloaterScriptPreview : public LLFloaterNameDesc
+{
+public:
+ LLFloaterScriptPreview(const LLSD& filename );
+ virtual BOOL postBuild();
+};
+
#endif // LL_LLFLOATERNAMEDESC_H
diff --git a/indra/newview/llfloaternotificationsconsole.cpp b/indra/newview/llfloaternotificationsconsole.cpp
index 42dc60f9e0..2681d4b34d 100644
--- a/indra/newview/llfloaternotificationsconsole.cpp
+++ b/indra/newview/llfloaternotificationsconsole.cpp
@@ -174,6 +174,7 @@ BOOL LLFloaterNotificationConsole::postBuild()
// these are in the order of processing
addChannel("Unexpired");
addChannel("Ignore");
+ addChannel("VisibilityRules");
addChannel("Visible", true);
// all the ones below attach to the Visible channel
addChannel("Persistent");
@@ -219,7 +220,7 @@ void LLFloaterNotificationConsole::addChannel(const std::string& name, bool open
void LLFloaterNotificationConsole::removeChannel(const std::string& name)
{
LLPanel* panelp = getChild<LLPanel>(name);
- getChildRef<LLLayoutStack>("notification_channels").removePanel(panelp);
+ getChildRef<LLView>("notification_channels").removeChild(panelp);
delete panelp;
updateResizeLimits();
diff --git a/indra/newview/llfloaterobjectweights.cpp b/indra/newview/llfloaterobjectweights.cpp
new file mode 100644
index 0000000000..0862cd2897
--- /dev/null
+++ b/indra/newview/llfloaterobjectweights.cpp
@@ -0,0 +1,266 @@
+/**
+ * @file llfloaterobjectweights.cpp
+ * @brief Object weights advanced view floater
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloaterobjectweights.h"
+
+#include "llparcel.h"
+
+#include "llfloaterreg.h"
+#include "lltextbox.h"
+
+#include "llagent.h"
+#include "llviewerparcelmgr.h"
+#include "llviewerregion.h"
+
+// virtual
+bool LLCrossParcelFunctor::apply(LLViewerObject* obj)
+{
+ // Add the root object box.
+ mBoundingBox.addBBoxAgent(LLBBox(obj->getPositionRegion(), obj->getRotationRegion(), obj->getScale() * -0.5f, obj->getScale() * 0.5f).getAxisAligned());
+
+ // Extend the bounding box across all the children.
+ LLViewerObject::const_child_list_t children = obj->getChildren();
+ for (LLViewerObject::const_child_list_t::const_iterator iter = children.begin();
+ iter != children.end(); iter++)
+ {
+ LLViewerObject* child = *iter;
+ mBoundingBox.addBBoxAgent(LLBBox(child->getPositionRegion(), child->getRotationRegion(), child->getScale() * -0.5f, child->getScale() * 0.5f).getAxisAligned());
+ }
+
+ bool result = false;
+
+ LLViewerRegion* region = obj->getRegion();
+ if (region)
+ {
+ std::vector<LLBBox> boxes;
+ boxes.push_back(mBoundingBox);
+ result = region->objectsCrossParcel(boxes);
+ }
+
+ return result;
+}
+
+LLFloaterObjectWeights::LLFloaterObjectWeights(const LLSD& key)
+: LLFloater(key),
+ mSelectedObjects(NULL),
+ mSelectedPrims(NULL),
+ mSelectedDownloadWeight(NULL),
+ mSelectedPhysicsWeight(NULL),
+ mSelectedServerWeight(NULL),
+ mSelectedDisplayWeight(NULL),
+ mSelectedOnLand(NULL),
+ mRezzedOnLand(NULL),
+ mRemainingCapacity(NULL),
+ mTotalCapacity(NULL)
+{
+}
+
+LLFloaterObjectWeights::~LLFloaterObjectWeights()
+{
+}
+
+// virtual
+BOOL LLFloaterObjectWeights::postBuild()
+{
+ mSelectedObjects = getChild<LLTextBox>("objects");
+ mSelectedPrims = getChild<LLTextBox>("prims");
+
+ mSelectedDownloadWeight = getChild<LLTextBox>("download");
+ mSelectedPhysicsWeight = getChild<LLTextBox>("physics");
+ mSelectedServerWeight = getChild<LLTextBox>("server");
+ mSelectedDisplayWeight = getChild<LLTextBox>("display");
+
+ mSelectedOnLand = getChild<LLTextBox>("selected");
+ mRezzedOnLand = getChild<LLTextBox>("rezzed_on_land");
+ mRemainingCapacity = getChild<LLTextBox>("remaining_capacity");
+ mTotalCapacity = getChild<LLTextBox>("total_capacity");
+
+ return TRUE;
+}
+
+// virtual
+void LLFloaterObjectWeights::onOpen(const LLSD& key)
+{
+ refresh();
+ updateLandImpacts(LLViewerParcelMgr::getInstance()->getFloatingParcelSelection()->getParcel());
+}
+
+// virtual
+void LLFloaterObjectWeights::onWeightsUpdate(const SelectionCost& selection_cost)
+{
+ mSelectedDownloadWeight->setText(llformat("%.1f", selection_cost.mNetworkCost));
+ mSelectedPhysicsWeight->setText(llformat("%.1f", selection_cost.mPhysicsCost));
+ mSelectedServerWeight->setText(llformat("%.1f", selection_cost.mSimulationCost));
+
+ S32 render_cost = LLSelectMgr::getInstance()->getSelection()->getSelectedObjectRenderCost();
+ mSelectedDisplayWeight->setText(llformat("%d", render_cost));
+
+ toggleWeightsLoadingIndicators(false);
+}
+
+//virtual
+void LLFloaterObjectWeights::setErrorStatus(U32 status, const std::string& reason)
+{
+ const std::string text = getString("nothing_selected");
+
+ mSelectedDownloadWeight->setText(text);
+ mSelectedPhysicsWeight->setText(text);
+ mSelectedServerWeight->setText(text);
+ mSelectedDisplayWeight->setText(text);
+
+ toggleWeightsLoadingIndicators(false);
+}
+
+void LLFloaterObjectWeights::updateLandImpacts(const LLParcel* parcel)
+{
+ if (!parcel || LLSelectMgr::getInstance()->getSelection()->isEmpty())
+ {
+ updateIfNothingSelected();
+ }
+ else
+ {
+ S32 rezzed_prims = parcel->getSimWidePrimCount();
+ S32 total_capacity = parcel->getSimWideMaxPrimCapacity();
+
+ mRezzedOnLand->setText(llformat("%d", rezzed_prims));
+ mRemainingCapacity->setText(llformat("%d", total_capacity - rezzed_prims));
+ mTotalCapacity->setText(llformat("%d", total_capacity));
+
+ toggleLandImpactsLoadingIndicators(false);
+ }
+}
+
+void LLFloaterObjectWeights::refresh()
+{
+ LLSelectMgr* sel_mgr = LLSelectMgr::getInstance();
+
+ if (sel_mgr->getSelection()->isEmpty())
+ {
+ updateIfNothingSelected();
+ }
+ else
+ {
+ S32 prim_count = sel_mgr->getSelection()->getObjectCount();
+ S32 link_count = sel_mgr->getSelection()->getRootObjectCount();
+ F32 prim_equiv = sel_mgr->getSelection()->getSelectedLinksetCost();
+
+ mSelectedObjects->setText(llformat("%d", link_count));
+ mSelectedPrims->setText(llformat("%d", prim_count));
+ mSelectedOnLand->setText(llformat("%.1d", (S32)prim_equiv));
+
+ LLCrossParcelFunctor func;
+ if (sel_mgr->getSelection()->applyToRootObjects(&func, true))
+ {
+ // Some of the selected objects cross parcel bounds.
+ // We don't display object weights and land impacts in this case.
+ const std::string text = getString("nothing_selected");
+
+ mRezzedOnLand->setText(text);
+ mRemainingCapacity->setText(text);
+ mTotalCapacity->setText(text);
+
+ toggleLandImpactsLoadingIndicators(false);
+ }
+
+ LLViewerRegion* region = gAgent.getRegion();
+ if (region && region->capabilitiesReceived())
+ {
+ for (LLObjectSelection::valid_root_iterator iter = sel_mgr->getSelection()->valid_root_begin();
+ iter != sel_mgr->getSelection()->valid_root_end(); ++iter)
+ {
+ LLAccountingCostManager::getInstance()->addObject((*iter)->getObject()->getID());
+ }
+
+ std::string url = region->getCapability("ResourceCostSelected");
+ if (!url.empty())
+ {
+ // Update the transaction id before the new fetch request
+ generateTransactionID();
+
+ LLAccountingCostManager::getInstance()->fetchCosts(Roots, url, getObserverHandle());
+ toggleWeightsLoadingIndicators(true);
+ }
+ }
+ else
+ {
+ llwarns << "Failed to get region capabilities" << llendl;
+ }
+ }
+}
+
+// virtual
+void LLFloaterObjectWeights::generateTransactionID()
+{
+ mTransactionID.generate();
+}
+
+void LLFloaterObjectWeights::toggleWeightsLoadingIndicators(bool visible)
+{
+ childSetVisible("download_loading_indicator", visible);
+ childSetVisible("physics_loading_indicator", visible);
+ childSetVisible("server_loading_indicator", visible);
+ childSetVisible("display_loading_indicator", visible);
+
+ mSelectedDownloadWeight->setVisible(!visible);
+ mSelectedPhysicsWeight->setVisible(!visible);
+ mSelectedServerWeight->setVisible(!visible);
+ mSelectedDisplayWeight->setVisible(!visible);
+}
+
+void LLFloaterObjectWeights::toggleLandImpactsLoadingIndicators(bool visible)
+{
+ childSetVisible("selected_loading_indicator", visible);
+ childSetVisible("rezzed_on_land_loading_indicator", visible);
+ childSetVisible("remaining_capacity_loading_indicator", visible);
+ childSetVisible("total_capacity_loading_indicator", visible);
+
+ mSelectedOnLand->setVisible(!visible);
+ mRezzedOnLand->setVisible(!visible);
+ mRemainingCapacity->setVisible(!visible);
+ mTotalCapacity->setVisible(!visible);
+}
+
+void LLFloaterObjectWeights::updateIfNothingSelected()
+{
+ const std::string text = getString("nothing_selected");
+
+ mSelectedObjects->setText(text);
+ mSelectedPrims->setText(text);
+
+ mSelectedDownloadWeight->setText(text);
+ mSelectedPhysicsWeight->setText(text);
+ mSelectedServerWeight->setText(text);
+ mSelectedDisplayWeight->setText(text);
+
+ mSelectedOnLand->setText(text);
+ mRezzedOnLand->setText(text);
+ mRemainingCapacity->setText(text);
+ mTotalCapacity->setText(text);
+
+ toggleWeightsLoadingIndicators(false);
+ toggleLandImpactsLoadingIndicators(false);
+}
diff --git a/indra/newview/llfloaterobjectweights.h b/indra/newview/llfloaterobjectweights.h
new file mode 100644
index 0000000000..9a244573be
--- /dev/null
+++ b/indra/newview/llfloaterobjectweights.h
@@ -0,0 +1,93 @@
+/**
+ * @file llfloaterobjectweights.h
+ * @brief Object weights advanced view floater
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLFLOATEROBJECTWEIGHTS_H
+#define LL_LLFLOATEROBJECTWEIGHTS_H
+
+#include "llfloater.h"
+
+#include "llaccountingcostmanager.h"
+#include "llselectmgr.h"
+
+class LLParcel;
+class LLTextBox;
+
+/**
+ * struct LLCrossParcelFunctor
+ *
+ * A functor that checks whether a bounding box for all
+ * selected objects crosses a region or parcel bounds.
+ */
+struct LLCrossParcelFunctor : public LLSelectedObjectFunctor
+{
+ /*virtual*/ bool apply(LLViewerObject* obj);
+
+private:
+ LLBBox mBoundingBox;
+};
+
+
+class LLFloaterObjectWeights : public LLFloater, LLAccountingCostObserver
+{
+public:
+ LOG_CLASS(LLFloaterObjectWeights);
+
+ LLFloaterObjectWeights(const LLSD& key);
+ ~LLFloaterObjectWeights();
+
+ /*virtual*/ BOOL postBuild();
+
+ /*virtual*/ void onOpen(const LLSD& key);
+
+ /*virtual*/ void onWeightsUpdate(const SelectionCost& selection_cost);
+ /*virtual*/ void setErrorStatus(U32 status, const std::string& reason);
+
+ void updateLandImpacts(const LLParcel* parcel);
+ void refresh();
+
+private:
+ /*virtual*/ void generateTransactionID();
+
+ void toggleWeightsLoadingIndicators(bool visible);
+ void toggleLandImpactsLoadingIndicators(bool visible);
+
+ void updateIfNothingSelected();
+
+ LLTextBox *mSelectedObjects;
+ LLTextBox *mSelectedPrims;
+
+ LLTextBox *mSelectedDownloadWeight;
+ LLTextBox *mSelectedPhysicsWeight;
+ LLTextBox *mSelectedServerWeight;
+ LLTextBox *mSelectedDisplayWeight;
+
+ LLTextBox *mSelectedOnLand;
+ LLTextBox *mRezzedOnLand;
+ LLTextBox *mRemainingCapacity;
+ LLTextBox *mTotalCapacity;
+};
+
+#endif //LL_LLFLOATEROBJECTWEIGHTS_H
diff --git a/indra/newview/llfloateropenobject.cpp b/indra/newview/llfloateropenobject.cpp
index 8b6619def2..4bfef8b45f 100644
--- a/indra/newview/llfloateropenobject.cpp
+++ b/indra/newview/llfloateropenobject.cpp
@@ -162,26 +162,66 @@ void LLFloaterOpenObject::moveToInventory(bool wear)
{
parent_category_id = gInventory.getRootFolderID();
}
+
+ LLCategoryCreate* cat_data = new LLCategoryCreate(object_id, wear);
+
LLUUID category_id = gInventory.createNewCategory(parent_category_id,
- LLFolderType::FT_NONE,
- name);
+ LLFolderType::FT_NONE,
+ name,
+ callbackCreateInventoryCategory,
+ (void*)cat_data);
+
+ //If we get a null category ID, we are using a capability in createNewCategory and we will
+ //handle the following in the callbackCreateInventoryCategory routine.
+ if ( category_id.notNull() )
+ {
+ delete cat_data;
+
+ LLCatAndWear* data = new LLCatAndWear;
+ data->mCatID = category_id;
+ data->mWear = wear;
+ data->mFolderResponded = false;
+
+ // Copy and/or move the items into the newly created folder.
+ // Ignore any "you're going to break this item" messages.
+ BOOL success = move_inv_category_world_to_agent(object_id, category_id, TRUE,
+ callbackMoveInventory,
+ (void*)data);
+ if (!success)
+ {
+ delete data;
+ data = NULL;
- LLCatAndWear* data = new LLCatAndWear;
- data->mCatID = category_id;
- data->mWear = wear;
+ LLNotificationsUtil::add("OpenObjectCannotCopy");
+ }
+ }
+}
+// static
+void LLFloaterOpenObject::callbackCreateInventoryCategory(const LLSD& result, void* data)
+{
+ LLCategoryCreate* cat_data = (LLCategoryCreate*)data;
+
+ LLUUID category_id = result["folder_id"].asUUID();
+ LLCatAndWear* wear_data = new LLCatAndWear;
+
+ wear_data->mCatID = category_id;
+ wear_data->mWear = cat_data->mWear;
+ wear_data->mFolderResponded = true;
+
// Copy and/or move the items into the newly created folder.
// Ignore any "you're going to break this item" messages.
- BOOL success = move_inv_category_world_to_agent(object_id, category_id, TRUE,
+ BOOL success = move_inv_category_world_to_agent(cat_data->mObjectID, category_id, TRUE,
callbackMoveInventory,
- (void*)data);
+ (void*)wear_data);
if (!success)
{
- delete data;
- data = NULL;
-
+ delete wear_data;
+ wear_data = NULL;
+
LLNotificationsUtil::add("OpenObjectCannotCopy");
}
+ delete cat_data;
}
// static
diff --git a/indra/newview/llfloateropenobject.h b/indra/newview/llfloateropenobject.h
index 0706e99f16..bf7fe69c65 100644
--- a/indra/newview/llfloateropenobject.h
+++ b/indra/newview/llfloateropenobject.h
@@ -45,10 +45,20 @@ public:
void dirty();
+ class LLCategoryCreate
+ {
+ public:
+ LLCategoryCreate(LLUUID object_id, bool wear) : mObjectID(object_id), mWear(wear) {}
+ public:
+ LLUUID mObjectID;
+ bool mWear;
+ };
+
struct LLCatAndWear
{
LLUUID mCatID;
bool mWear;
+ bool mFolderResponded;
};
protected:
@@ -62,6 +72,7 @@ protected:
void onClickMoveToInventory();
void onClickMoveAndWear();
+ static void callbackCreateInventoryCategory(const LLSD& result, void* data);
static void callbackMoveInventory(S32 result, void* data);
private:
diff --git a/indra/newview/llfloateroutbox.cpp b/indra/newview/llfloateroutbox.cpp
new file mode 100644
index 0000000000..540f977305
--- /dev/null
+++ b/indra/newview/llfloateroutbox.cpp
@@ -0,0 +1,567 @@
+/**
+ * @file llfloateroutbox.cpp
+ * @brief Implementation of the merchant outbox window
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloateroutbox.h"
+
+#include "llfloaterreg.h"
+#include "llfolderview.h"
+#include "llinventorybridge.h"
+#include "llinventorymodelbackgroundfetch.h"
+#include "llinventoryobserver.h"
+#include "llinventorypanel.h"
+#include "llmarketplacefunctions.h"
+#include "llnotificationhandler.h"
+#include "llnotificationmanager.h"
+#include "llnotificationsutil.h"
+#include "lltextbox.h"
+#include "lltransientfloatermgr.h"
+#include "lltrans.h"
+#include "llviewernetwork.h"
+#include "llwindowshade.h"
+
+#define USE_WINDOWSHADE_DIALOGS 0
+
+
+///----------------------------------------------------------------------------
+/// LLOutboxNotification class
+///----------------------------------------------------------------------------
+
+bool LLNotificationsUI::LLOutboxNotification::processNotification(const LLSD& notify)
+{
+ LLFloaterOutbox* outbox_floater = LLFloaterReg::getTypedInstance<LLFloaterOutbox>("outbox");
+
+ outbox_floater->showNotification(notify);
+
+ return false;
+}
+
+
+///----------------------------------------------------------------------------
+/// LLOutboxAddedObserver helper class
+///----------------------------------------------------------------------------
+
+class LLOutboxAddedObserver : public LLInventoryCategoryAddedObserver
+{
+public:
+ LLOutboxAddedObserver(LLFloaterOutbox * outboxFloater)
+ : LLInventoryCategoryAddedObserver()
+ , mOutboxFloater(outboxFloater)
+ {
+ }
+
+ void done()
+ {
+ for (cat_vec_t::iterator it = mAddedCategories.begin(); it != mAddedCategories.end(); ++it)
+ {
+ LLViewerInventoryCategory* added_category = *it;
+
+ LLFolderType::EType added_category_type = added_category->getPreferredType();
+
+ if (added_category_type == LLFolderType::FT_OUTBOX)
+ {
+ mOutboxFloater->setupOutbox(added_category->getUUID());
+ }
+ }
+ }
+
+private:
+ LLFloaterOutbox * mOutboxFloater;
+};
+
+///----------------------------------------------------------------------------
+/// LLFloaterOutbox
+///----------------------------------------------------------------------------
+
+LLFloaterOutbox::LLFloaterOutbox(const LLSD& key)
+ : LLFloater(key)
+ , mCategoriesObserver(NULL)
+ , mCategoryAddedObserver(NULL)
+ , mImportBusy(false)
+ , mImportButton(NULL)
+ , mInventoryFolderCountText(NULL)
+ , mInventoryImportInProgress(NULL)
+ , mInventoryPlaceholder(NULL)
+ , mInventoryText(NULL)
+ , mInventoryTitle(NULL)
+ , mOutboxId(LLUUID::null)
+ , mOutboxInventoryPanel(NULL)
+ , mOutboxItemCount(0)
+ , mOutboxTopLevelDropZone(NULL)
+ , mWindowShade(NULL)
+{
+}
+
+LLFloaterOutbox::~LLFloaterOutbox()
+{
+ if (mCategoriesObserver && gInventory.containsObserver(mCategoriesObserver))
+ {
+ gInventory.removeObserver(mCategoriesObserver);
+ }
+ delete mCategoriesObserver;
+
+ if (mCategoryAddedObserver && gInventory.containsObserver(mCategoryAddedObserver))
+ {
+ gInventory.removeObserver(mCategoryAddedObserver);
+ }
+ delete mCategoryAddedObserver;
+}
+
+BOOL LLFloaterOutbox::postBuild()
+{
+ mInventoryFolderCountText = getChild<LLTextBox>("outbox_folder_count");
+ mInventoryImportInProgress = getChild<LLView>("import_progress_indicator");
+ mInventoryPlaceholder = getChild<LLView>("outbox_inventory_placeholder_panel");
+ mInventoryText = mInventoryPlaceholder->getChild<LLTextBox>("outbox_inventory_placeholder_text");
+ mInventoryTitle = mInventoryPlaceholder->getChild<LLTextBox>("outbox_inventory_placeholder_title");
+
+ mImportButton = getChild<LLButton>("outbox_import_btn");
+ mImportButton->setCommitCallback(boost::bind(&LLFloaterOutbox::onImportButtonClicked, this));
+
+ mOutboxTopLevelDropZone = getChild<LLPanel>("outbox_generic_drag_target");
+
+ LLFocusableElement::setFocusReceivedCallback(boost::bind(&LLFloaterOutbox::onFocusReceived, this));
+
+ return TRUE;
+}
+
+void LLFloaterOutbox::onClose(bool app_quitting)
+{
+ if (mWindowShade)
+ {
+ delete mWindowShade;
+
+ mWindowShade = NULL;
+ }
+}
+
+void LLFloaterOutbox::onOpen(const LLSD& key)
+{
+ //
+ // Look for an outbox and set up the inventory API
+ //
+
+ if (mOutboxId.isNull())
+ {
+ const bool do_not_create_folder = false;
+ const bool do_not_find_in_library = false;
+
+ const LLUUID outbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTBOX, do_not_create_folder, do_not_find_in_library);
+
+ if (outbox_id.isNull())
+ {
+ // Observe category creation to catch outbox creation
+ mCategoryAddedObserver = new LLOutboxAddedObserver(this);
+ gInventory.addObserver(mCategoryAddedObserver);
+ }
+ else
+ {
+ setupOutbox(outbox_id);
+ }
+ }
+
+ updateView();
+
+ //
+ // Trigger fetch of outbox contents
+ //
+
+ fetchOutboxContents();
+}
+
+void LLFloaterOutbox::onFocusReceived()
+{
+ fetchOutboxContents();
+}
+
+void LLFloaterOutbox::fetchOutboxContents()
+{
+ if (mOutboxId.notNull())
+ {
+ LLInventoryModelBackgroundFetch::instance().start(mOutboxId);
+ }
+}
+
+void LLFloaterOutbox::setupOutbox(const LLUUID& outboxId)
+{
+ llassert(outboxId.notNull());
+ llassert(mOutboxId.isNull());
+ llassert(mCategoriesObserver == NULL);
+
+ mOutboxId = outboxId;
+
+ // No longer need to observe new category creation
+ if (mCategoryAddedObserver && gInventory.containsObserver(mCategoryAddedObserver))
+ {
+ gInventory.removeObserver(mCategoryAddedObserver);
+ delete mCategoryAddedObserver;
+ mCategoryAddedObserver = NULL;
+ }
+
+ // Create observer for outbox modifications
+ mCategoriesObserver = new LLInventoryCategoriesObserver();
+ gInventory.addObserver(mCategoriesObserver);
+
+ mCategoriesObserver->addCategory(mOutboxId, boost::bind(&LLFloaterOutbox::onOutboxChanged, this));
+
+ //
+ // Set up the outbox inventory view
+ //
+
+ mOutboxInventoryPanel =
+ LLUICtrlFactory::createFromFile<LLInventoryPanel>("panel_outbox_inventory.xml",
+ mInventoryPlaceholder->getParent(),
+ LLInventoryPanel::child_registry_t::instance());
+
+ llassert(mOutboxInventoryPanel);
+
+ // Reshape the inventory to the proper size
+ LLRect inventory_placeholder_rect = mInventoryPlaceholder->getRect();
+ mOutboxInventoryPanel->setShape(inventory_placeholder_rect);
+
+ // Set the sort order newest to oldest
+ mOutboxInventoryPanel->setSortOrder(LLInventoryFilter::SO_FOLDERS_BY_NAME);
+ mOutboxInventoryPanel->getFilter()->markDefault();
+
+ fetchOutboxContents();
+
+ //
+ // Initialize the marketplace import API
+ //
+
+ LLMarketplaceInventoryImporter& importer = LLMarketplaceInventoryImporter::instance();
+
+ importer.setInitializationErrorCallback(boost::bind(&LLFloaterOutbox::initializationReportError, this, _1, _2));
+ importer.setStatusChangedCallback(boost::bind(&LLFloaterOutbox::importStatusChanged, this, _1));
+ importer.setStatusReportCallback(boost::bind(&LLFloaterOutbox::importReportResults, this, _1, _2));
+ importer.initialize();
+}
+
+void LLFloaterOutbox::setStatusString(const std::string& statusString)
+{
+ llassert(mInventoryFolderCountText != NULL);
+
+ mInventoryFolderCountText->setText(statusString);
+}
+
+void LLFloaterOutbox::updateFolderCount()
+{
+ S32 item_count = 0;
+
+ if (mOutboxId.notNull())
+ {
+ LLInventoryModel::cat_array_t * cats;
+ LLInventoryModel::item_array_t * items;
+ gInventory.getDirectDescendentsOf(mOutboxId, cats, items);
+
+ item_count = cats->count() + items->count();
+ }
+
+ mOutboxItemCount = item_count;
+
+ if (!mImportBusy)
+ {
+ updateFolderCountStatus();
+ }
+}
+
+void LLFloaterOutbox::updateFolderCountStatus()
+{
+ if (mOutboxInventoryPanel)
+ {
+ switch (mOutboxItemCount)
+ {
+ case 0: setStatusString(getString("OutboxFolderCount0")); break;
+ case 1: setStatusString(getString("OutboxFolderCount1")); break;
+ default:
+ {
+ std::string item_count_str = llformat("%d", mOutboxItemCount);
+
+ LLStringUtil::format_map_t args;
+ args["[NUM]"] = item_count_str;
+
+ setStatusString(getString("OutboxFolderCountN", args));
+ break;
+ }
+ }
+ }
+
+ mImportButton->setEnabled(mOutboxItemCount > 0);
+}
+
+void LLFloaterOutbox::updateView()
+{
+ updateFolderCount();
+
+ if (mOutboxItemCount > 0)
+ {
+ mOutboxInventoryPanel->setVisible(TRUE);
+ mInventoryPlaceholder->setVisible(FALSE);
+ }
+ else
+ {
+ if (mOutboxInventoryPanel)
+ {
+ mOutboxInventoryPanel->setVisible(FALSE);
+ }
+
+ mInventoryPlaceholder->setVisible(TRUE);
+
+ std::string outbox_text;
+ std::string outbox_title;
+ std::string outbox_tooltip;
+
+ const LLSD& subs = getMarketplaceStringSubstitutions();
+
+ if (mOutboxId.notNull())
+ {
+ outbox_text = LLTrans::getString("InventoryOutboxNoItems", subs);
+ outbox_title = LLTrans::getString("InventoryOutboxNoItemsTitle");
+ outbox_tooltip = LLTrans::getString("InventoryOutboxNoItemsTooltip");
+ }
+ else
+ {
+ outbox_text = LLTrans::getString("InventoryOutboxNotMerchant", subs);
+ outbox_title = LLTrans::getString("InventoryOutboxNotMerchantTitle");
+ outbox_tooltip = LLTrans::getString("InventoryOutboxNotMerchantTooltip");
+ }
+
+ mInventoryText->setValue(outbox_text);
+ mInventoryTitle->setValue(outbox_title);
+ mInventoryPlaceholder->getParent()->setToolTip(outbox_tooltip);
+ }
+}
+
+bool isAccepted(EAcceptance accept)
+{
+ return (accept >= ACCEPT_YES_COPY_SINGLE);
+}
+
+BOOL LLFloaterOutbox::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
+ EDragAndDropType cargo_type,
+ void* cargo_data,
+ EAcceptance* accept,
+ std::string& tooltip_msg)
+{
+ if ((mOutboxInventoryPanel == NULL) ||
+ (mWindowShade && mWindowShade->isShown()) ||
+ LLMarketplaceInventoryImporter::getInstance()->isImportInProgress())
+ {
+ return FALSE;
+ }
+
+ LLView * handled_view = childrenHandleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg);
+ BOOL handled = (handled_view != NULL);
+
+ // Determine if the mouse is inside the inventory panel itself or just within the floater
+ bool pointInInventoryPanel = false;
+ bool pointInInventoryPanelChild = false;
+ LLFolderView * root_folder = mOutboxInventoryPanel->getRootFolder();
+ if (mOutboxInventoryPanel->getVisible())
+ {
+ S32 inv_x, inv_y;
+ localPointToOtherView(x, y, &inv_x, &inv_y, mOutboxInventoryPanel);
+
+ pointInInventoryPanel = mOutboxInventoryPanel->getRect().pointInRect(inv_x, inv_y);
+
+ LLView * inventory_panel_child_at_point = mOutboxInventoryPanel->childFromPoint(inv_x, inv_y, true);
+ pointInInventoryPanelChild = (inventory_panel_child_at_point != root_folder);
+ }
+
+ // Pass all drag and drop for this floater to the outbox inventory control
+ if (!handled || !isAccepted(*accept))
+ {
+ // Handle the drag and drop directly to the root of the outbox if we're not in the inventory panel
+ // (otherwise the inventory panel itself will handle the drag and drop operation, without any override)
+ if (!pointInInventoryPanel)
+ {
+ handled = root_folder->handleDragAndDropToThisFolder(mask, drop, cargo_type, cargo_data, accept, tooltip_msg);
+ }
+
+ mOutboxTopLevelDropZone->setBackgroundVisible(handled && !drop && isAccepted(*accept));
+ }
+ else
+ {
+ mOutboxTopLevelDropZone->setBackgroundVisible(!pointInInventoryPanelChild);
+ }
+
+ return handled;
+}
+
+BOOL LLFloaterOutbox::handleHover(S32 x, S32 y, MASK mask)
+{
+ mOutboxTopLevelDropZone->setBackgroundVisible(FALSE);
+
+ return LLFloater::handleHover(x, y, mask);
+}
+
+void LLFloaterOutbox::onMouseLeave(S32 x, S32 y, MASK mask)
+{
+ mOutboxTopLevelDropZone->setBackgroundVisible(FALSE);
+
+ LLFloater::onMouseLeave(x, y, mask);
+}
+
+void LLFloaterOutbox::onImportButtonClicked()
+{
+ mOutboxInventoryPanel->clearSelection();
+
+ mImportBusy = LLMarketplaceInventoryImporter::instance().triggerImport();
+}
+
+void LLFloaterOutbox::onOutboxChanged()
+{
+ llassert(!mOutboxId.isNull());
+
+ if (mOutboxInventoryPanel)
+ {
+ mOutboxInventoryPanel->requestSort();
+ }
+
+ fetchOutboxContents();
+
+ updateView();
+}
+
+void LLFloaterOutbox::importReportResults(U32 status, const LLSD& content)
+{
+ if (status == MarketplaceErrorCodes::IMPORT_DONE)
+ {
+ LLNotificationsUtil::add("OutboxImportComplete");
+ }
+ else if (status == MarketplaceErrorCodes::IMPORT_DONE_WITH_ERRORS)
+ {
+ const LLSD& subs = getMarketplaceStringSubstitutions();
+
+ LLNotificationsUtil::add("OutboxImportHadErrors", subs);
+ }
+ else
+ {
+ char status_string[16];
+ sprintf(status_string, "%d", status);
+
+ LLSD subs;
+ subs["[ERROR_CODE]"] = status_string;
+
+ LLNotificationsUtil::add("OutboxImportFailed", subs);
+ }
+
+ updateView();
+}
+
+void LLFloaterOutbox::importStatusChanged(bool inProgress)
+{
+ if (inProgress)
+ {
+ if (mImportBusy)
+ {
+ setStatusString(getString("OutboxImporting"));
+ }
+ else
+ {
+ setStatusString(getString("OutboxInitializing"));
+ }
+
+ mImportBusy = true;
+ mImportButton->setEnabled(false);
+ mInventoryImportInProgress->setVisible(true);
+ }
+ else
+ {
+ mImportBusy = false;
+ mImportButton->setEnabled(mOutboxItemCount > 0);
+ mInventoryImportInProgress->setVisible(false);
+ }
+
+ updateView();
+}
+
+void LLFloaterOutbox::initializationReportError(U32 status, const LLSD& content)
+{
+ if (status != MarketplaceErrorCodes::IMPORT_DONE)
+ {
+ char status_string[16];
+ sprintf(status_string, "%d", status);
+
+ LLSD subs;
+ subs["[ERROR_CODE]"] = status_string;
+
+ LLNotificationsUtil::add("OutboxInitFailed", subs);
+ }
+
+ updateView();
+}
+
+void LLFloaterOutbox::showNotification(const LLSD& notify)
+{
+ LLNotificationPtr notification = LLNotifications::instance().find(notify["id"].asUUID());
+
+ if (!notification)
+ {
+ llerrs << "Unable to find outbox notification!" << notify.asString() << llendl;
+
+ return;
+ }
+
+#if USE_WINDOWSHADE_DIALOGS
+
+ if (mWindowShade)
+ {
+ delete mWindowShade;
+ }
+
+ LLRect floater_rect = getLocalRect();
+ floater_rect.mTop -= getHeaderHeight();
+ floater_rect.stretch(-5, 0);
+
+ LLWindowShade::Params params;
+ params.name = "notification_shade";
+ params.rect = floater_rect;
+ params.follows.flags = FOLLOWS_ALL;
+ params.modal = true;
+ params.can_close = false;
+ params.shade_color = LLColor4::white % 0.25f;
+ params.text_color = LLColor4::white;
+
+ mWindowShade = LLUICtrlFactory::create<LLWindowShade>(params);
+
+ addChild(mWindowShade);
+ mWindowShade->show(notification);
+
+#else
+
+ LLNotificationsUI::LLEventHandler * handler =
+ LLNotificationsUI::LLNotificationManager::instance().getHandlerForNotification("alertmodal");
+
+ LLNotificationsUI::LLSysHandler * sys_handler = dynamic_cast<LLNotificationsUI::LLSysHandler *>(handler);
+ llassert(sys_handler);
+
+ sys_handler->processNotification(notify);
+
+#endif
+}
+
diff --git a/indra/newview/llfloateroutbox.h b/indra/newview/llfloateroutbox.h
new file mode 100644
index 0000000000..18baccf1c9
--- /dev/null
+++ b/indra/newview/llfloateroutbox.h
@@ -0,0 +1,114 @@
+/**
+ * @file llfloateroutbox.h
+ * @brief LLFloaterOutbox
+ * class definition
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * ABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLFLOATEROUTBOX_H
+#define LL_LLFLOATEROUTBOX_H
+
+#include "llfloater.h"
+#include "llfoldertype.h"
+#include "llnotificationptr.h"
+
+
+class LLButton;
+class LLInventoryCategoriesObserver;
+class LLInventoryCategoryAddedObserver;
+class LLInventoryPanel;
+class LLLoadingIndicator;
+class LLNotification;
+class LLTextBox;
+class LLView;
+class LLWindowShade;
+
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLFloaterOutbox
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+class LLFloaterOutbox : public LLFloater
+{
+public:
+ LLFloaterOutbox(const LLSD& key);
+ ~LLFloaterOutbox();
+
+ void setupOutbox(const LLUUID& outboxId);
+
+ // virtuals
+ BOOL postBuild();
+ BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
+ EDragAndDropType cargo_type,
+ void* cargo_data,
+ EAcceptance* accept,
+ std::string& tooltip_msg);
+
+ void showNotification(const LLSD& notify);
+
+ BOOL handleHover(S32 x, S32 y, MASK mask);
+ void onMouseLeave(S32 x, S32 y, MASK mask);
+
+protected:
+ void fetchOutboxContents();
+
+ void importReportResults(U32 status, const LLSD& content);
+ void importStatusChanged(bool inProgress);
+ void initializationReportError(U32 status, const LLSD& content);
+
+ void onClose(bool app_quitting);
+ void onOpen(const LLSD& key);
+
+ void onFocusReceived();
+
+ void onImportButtonClicked();
+ void onOutboxChanged();
+
+ void setStatusString(const std::string& statusString);
+
+ void updateFolderCount();
+ void updateFolderCountStatus();
+ void updateView();
+
+private:
+ LLInventoryCategoriesObserver * mCategoriesObserver;
+ LLInventoryCategoryAddedObserver * mCategoryAddedObserver;
+
+ bool mImportBusy;
+ LLButton * mImportButton;
+
+ LLTextBox * mInventoryFolderCountText;
+ LLView * mInventoryImportInProgress;
+ LLView * mInventoryPlaceholder;
+ LLTextBox * mInventoryText;
+ LLTextBox * mInventoryTitle;
+
+ LLUUID mOutboxId;
+ LLInventoryPanel * mOutboxInventoryPanel;
+ U32 mOutboxItemCount;
+ LLPanel * mOutboxTopLevelDropZone;
+
+ LLWindowShade * mWindowShade;
+};
+
+#endif // LL_LLFLOATEROUTBOX_H
diff --git a/indra/newview/llfloaterpostcard.cpp b/indra/newview/llfloaterpostcard.cpp
deleted file mode 100644
index 220d33016a..0000000000
--- a/indra/newview/llfloaterpostcard.cpp
+++ /dev/null
@@ -1,377 +0,0 @@
-/**
- * @file llfloaterpostcard.cpp
- * @brief Postcard send floater, allows setting name, e-mail address, etc.
- *
- * $LicenseInfo:firstyear=2004&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llfloaterpostcard.h"
-
-#include "llfontgl.h"
-#include "llsys.h"
-#include "llgl.h"
-#include "v3dmath.h"
-#include "lldir.h"
-
-#include "llagent.h"
-#include "llui.h"
-#include "lllineeditor.h"
-#include "llbutton.h"
-#include "lltexteditor.h"
-#include "llfloaterreg.h"
-#include "llnotificationsutil.h"
-#include "llviewercontrol.h"
-#include "llviewernetwork.h"
-#include "lluictrlfactory.h"
-#include "lluploaddialog.h"
-#include "llviewerstats.h"
-#include "llviewerwindow.h"
-#include "llstatusbar.h"
-#include "llviewerregion.h"
-#include "lleconomy.h"
-#include "message.h"
-
-#include "llimagejpeg.h"
-#include "llimagej2c.h"
-#include "llvfile.h"
-#include "llvfs.h"
-#include "llviewertexture.h"
-#include "llassetuploadresponders.h"
-#include "llagentui.h"
-
-#include <boost/regex.hpp> //boost.regex lib
-
-///----------------------------------------------------------------------------
-/// Local function declarations, constants, enums, and typedefs
-///----------------------------------------------------------------------------
-
-///----------------------------------------------------------------------------
-/// Class LLFloaterPostcard
-///----------------------------------------------------------------------------
-
-LLFloaterPostcard::LLFloaterPostcard(const LLSD& key)
-: LLFloater(key),
- mJPEGImage(NULL),
- mViewerImage(NULL),
- mHasFirstMsgFocus(false)
-{
-}
-
-// Destroys the object
-LLFloaterPostcard::~LLFloaterPostcard()
-{
- mJPEGImage = NULL; // deletes image
-}
-
-BOOL LLFloaterPostcard::postBuild()
-{
- // pick up the user's up-to-date email address
- gAgent.sendAgentUserInfoRequest();
-
- childSetAction("cancel_btn", onClickCancel, this);
- childSetAction("send_btn", onClickSend, this);
-
- getChildView("from_form")->setEnabled(FALSE);
-
- std::string name_string;
- LLAgentUI::buildFullname(name_string);
- getChild<LLUICtrl>("name_form")->setValue(LLSD(name_string));
-
- // For the first time a user focusess to .the msg box, all text will be selected.
- getChild<LLUICtrl>("msg_form")->setFocusChangedCallback(boost::bind(onMsgFormFocusRecieved, _1, this));
-
- getChild<LLUICtrl>("to_form")->setFocus(TRUE);
-
- return TRUE;
-}
-
-// static
-LLFloaterPostcard* LLFloaterPostcard::showFromSnapshot(LLImageJPEG *jpeg, LLViewerTexture *img, const LLVector2 &image_scale, const LLVector3d& pos_taken_global)
-{
- // Take the images from the caller
- // It's now our job to clean them up
- LLFloaterPostcard* instance = LLFloaterReg::showTypedInstance<LLFloaterPostcard>("postcard", LLSD(img->getID()));
-
- instance->mJPEGImage = jpeg;
- instance->mViewerImage = img;
- instance->mImageScale = image_scale;
- instance->mPosTakenGlobal = pos_taken_global;
-
- return instance;
-}
-
-void LLFloaterPostcard::draw()
-{
- LLGLSUIDefault gls_ui;
- LLFloater::draw();
-
- if(!isMinimized() && mViewerImage.notNull() && mJPEGImage.notNull())
- {
- LLRect rect(getRect());
-
- // first set the max extents of our preview
- rect.translate(-rect.mLeft, -rect.mBottom);
- rect.mLeft += 280;
- rect.mRight -= 10;
- rect.mTop -= 20;
- rect.mBottom = rect.mTop - 130;
-
- // then fix the aspect ratio
- F32 ratio = (F32)mJPEGImage->getWidth() / (F32)mJPEGImage->getHeight();
- if ((F32)rect.getWidth() / (F32)rect.getHeight() >= ratio)
- {
- rect.mRight = LLRect::tCoordType((F32)rect.mLeft + ((F32)rect.getHeight() * ratio));
- }
- else
- {
- rect.mBottom = LLRect::tCoordType((F32)rect.mTop - ((F32)rect.getWidth() / ratio));
- }
- {
- gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- gl_rect_2d(rect, LLColor4(0.f, 0.f, 0.f, 1.f));
- rect.stretch(-1);
- }
- {
-
- glMatrixMode(GL_TEXTURE);
- glPushMatrix();
- {
- glScalef(mImageScale.mV[VX], mImageScale.mV[VY], 1.f);
- glMatrixMode(GL_MODELVIEW);
- gl_draw_scaled_image(rect.mLeft,
- rect.mBottom,
- rect.getWidth(),
- rect.getHeight(),
- mViewerImage.get(),
- LLColor4::white);
- }
- glMatrixMode(GL_TEXTURE);
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW);
- }
- }
-}
-
-// static
-void LLFloaterPostcard::onClickCancel(void* data)
-{
- if (data)
- {
- LLFloaterPostcard *self = (LLFloaterPostcard *)data;
-
- self->closeFloater(false);
- }
-}
-
-class LLSendPostcardResponder : public LLAssetUploadResponder
-{
-public:
- LLSendPostcardResponder(const LLSD &post_data,
- const LLUUID& vfile_id,
- LLAssetType::EType asset_type):
- LLAssetUploadResponder(post_data, vfile_id, asset_type)
- {
- }
- // *TODO define custom uploadFailed here so it's not such a generic message
- void uploadComplete(const LLSD& content)
- {
- // we don't care about what the server returns from this post, just clean up the UI
- LLUploadDialog::modalUploadFinished();
- }
-};
-
-// static
-void LLFloaterPostcard::onClickSend(void* data)
-{
- if (data)
- {
- LLFloaterPostcard *self = (LLFloaterPostcard *)data;
-
- std::string from(self->getChild<LLUICtrl>("from_form")->getValue().asString());
- std::string to(self->getChild<LLUICtrl>("to_form")->getValue().asString());
-
- boost::regex emailFormat("[A-Za-z0-9.%+-_]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}(,[ \t]*[A-Za-z0-9.%+-_]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,})*");
-
- if (to.empty() || !boost::regex_match(to, emailFormat))
- {
- LLNotificationsUtil::add("PromptRecipientEmail");
- return;
- }
-
- if (from.empty() || !boost::regex_match(from, emailFormat))
- {
- LLNotificationsUtil::add("PromptSelfEmail");
- return;
- }
-
- std::string subject(self->getChild<LLUICtrl>("subject_form")->getValue().asString());
- if(subject.empty() || !self->mHasFirstMsgFocus)
- {
- LLNotificationsUtil::add("PromptMissingSubjMsg", LLSD(), LLSD(), boost::bind(&LLFloaterPostcard::missingSubjMsgAlertCallback, self, _1, _2));
- return;
- }
-
- if (self->mJPEGImage.notNull())
- {
- self->sendPostcard();
- }
- else
- {
- LLNotificationsUtil::add("ErrorProcessingSnapshot");
- }
- }
-}
-
-// static
-void LLFloaterPostcard::uploadCallback(const LLUUID& asset_id, void *user_data, S32 result, LLExtStat ext_status) // StoreAssetData callback (fixed)
-{
- LLFloaterPostcard *self = (LLFloaterPostcard *)user_data;
-
- LLUploadDialog::modalUploadFinished();
-
- if (result)
- {
- LLSD args;
- args["REASON"] = std::string(LLAssetStorage::getErrorString(result));
- LLNotificationsUtil::add("ErrorUploadingPostcard", args);
- }
- else
- {
- // only create the postcard once the upload succeeds
-
- // request the postcard
- LLMessageSystem* msg = gMessageSystem;
- msg->newMessage("SendPostcard");
- msg->nextBlock("AgentData");
- msg->addUUID("AgentID", gAgent.getID());
- msg->addUUID("SessionID", gAgent.getSessionID());
- msg->addUUID("AssetID", self->mAssetID);
- msg->addVector3d("PosGlobal", self->mPosTakenGlobal);
- msg->addString("To", self->getChild<LLUICtrl>("to_form")->getValue().asString());
- msg->addString("From", self->getChild<LLUICtrl>("from_form")->getValue().asString());
- msg->addString("Name", self->getChild<LLUICtrl>("name_form")->getValue().asString());
- msg->addString("Subject", self->getChild<LLUICtrl>("subject_form")->getValue().asString());
- msg->addString("Msg", self->getChild<LLUICtrl>("msg_form")->getValue().asString());
- msg->addBOOL("AllowPublish", FALSE);
- msg->addBOOL("MaturePublish", FALSE);
- gAgent.sendReliableMessage();
- }
-
- self->closeFloater();
-}
-
-// static
-void LLFloaterPostcard::updateUserInfo(const std::string& email)
-{
- LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("postcard");
- for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin();
- iter != inst_list.end(); ++iter)
- {
- LLFloater* instance = *iter;
- const std::string& text = instance->getChild<LLUICtrl>("from_form")->getValue().asString();
- if (text.empty())
- {
- // there's no text in this field yet, pre-populate
- instance->getChild<LLUICtrl>("from_form")->setValue(LLSD(email));
- }
- }
-}
-
-void LLFloaterPostcard::onMsgFormFocusRecieved(LLFocusableElement* receiver, void* data)
-{
- LLFloaterPostcard* self = (LLFloaterPostcard *)data;
- if(self)
- {
- LLTextEditor* msgForm = self->getChild<LLTextEditor>("msg_form");
- if(msgForm && msgForm == receiver && msgForm->hasFocus() && !(self->mHasFirstMsgFocus))
- {
- self->mHasFirstMsgFocus = true;
- msgForm->setText(LLStringUtil::null);
- }
- }
-}
-
-bool LLFloaterPostcard::missingSubjMsgAlertCallback(const LLSD& notification, const LLSD& response)
-{
- S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
- if(0 == option)
- {
- // User clicked OK
- if((getChild<LLUICtrl>("subject_form")->getValue().asString()).empty())
- {
- // Stuff the subject back into the form.
- getChild<LLUICtrl>("subject_form")->setValue(getString("default_subject"));
- }
-
- if(!mHasFirstMsgFocus)
- {
- // The user never switched focus to the messagee window.
- // Using the default string.
- getChild<LLUICtrl>("msg_form")->setValue(getString("default_message"));
- }
-
- sendPostcard();
- }
- return false;
-}
-
-void LLFloaterPostcard::sendPostcard()
-{
- mTransactionID.generate();
- mAssetID = mTransactionID.makeAssetID(gAgent.getSecureSessionID());
- LLVFile::writeFile(mJPEGImage->getData(), mJPEGImage->getDataSize(), gVFS, mAssetID, LLAssetType::AT_IMAGE_JPEG);
-
- // upload the image
- std::string url = gAgent.getRegion()->getCapability("SendPostcard");
- if(!url.empty())
- {
- llinfos << "Send Postcard via capability" << llendl;
- LLSD body = LLSD::emptyMap();
- // the capability already encodes: agent ID, region ID
- body["pos-global"] = mPosTakenGlobal.getValue();
- body["to"] = getChild<LLUICtrl>("to_form")->getValue().asString();
- body["from"] = getChild<LLUICtrl>("from_form")->getValue().asString();
- body["name"] = getChild<LLUICtrl>("name_form")->getValue().asString();
- body["subject"] = getChild<LLUICtrl>("subject_form")->getValue().asString();
- body["msg"] = getChild<LLUICtrl>("msg_form")->getValue().asString();
- LLHTTPClient::post(url, body, new LLSendPostcardResponder(body, mAssetID, LLAssetType::AT_IMAGE_JPEG));
- }
- else
- {
- gAssetStorage->storeAssetData(mTransactionID, LLAssetType::AT_IMAGE_JPEG, &uploadCallback, (void *)this, FALSE);
- }
-
- LLUploadDialog::modalUploadDialog(getString("upload_message"));
-
- // don't destroy the window until the upload is done
- // this way we keep the information in the form
- setVisible(FALSE);
-
- // also remove any dependency on another floater
- // so that we can be sure to outlive it while we
- // need to.
- LLFloater* dependee = getDependee();
- if (dependee)
- dependee->removeDependentFloater(this);
-}
diff --git a/indra/newview/llfloaterpostcard.h b/indra/newview/llfloaterpostcard.h
deleted file mode 100644
index 472592154f..0000000000
--- a/indra/newview/llfloaterpostcard.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/**
- * @file llfloaterpostcard.h
- * @brief Postcard send floater, allows setting name, e-mail address, etc.
- *
- * $LicenseInfo:firstyear=2004&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLFLOATERPOSTCARD_H
-#define LL_LLFLOATERPOSTCARD_H
-
-#include "llfloater.h"
-#include "llcheckboxctrl.h"
-
-#include "llpointer.h"
-
-class LLTextEditor;
-class LLLineEditor;
-class LLButton;
-class LLViewerTexture;
-class LLImageJPEG;
-
-class LLFloaterPostcard
-: public LLFloater
-{
-public:
- LLFloaterPostcard(const LLSD& key);
- virtual ~LLFloaterPostcard();
-
- virtual BOOL postBuild();
- virtual void draw();
-
- static LLFloaterPostcard* showFromSnapshot(LLImageJPEG *jpeg, LLViewerTexture *img, const LLVector2& img_scale, const LLVector3d& pos_taken_global);
-
- static void onClickCancel(void* data);
- static void onClickSend(void* data);
-
- static void uploadCallback(const LLUUID& asset_id,
- void *user_data,
- S32 result, LLExtStat ext_status);
-
- static void updateUserInfo(const std::string& email);
-
- static void onMsgFormFocusRecieved(LLFocusableElement* receiver, void* data);
- bool missingSubjMsgAlertCallback(const LLSD& notification, const LLSD& response);
-
- void sendPostcard();
-
-private:
-
- LLPointer<LLImageJPEG> mJPEGImage;
- LLPointer<LLViewerTexture> mViewerImage;
- LLTransactionID mTransactionID;
- LLAssetID mAssetID;
- LLVector2 mImageScale;
- LLVector3d mPosTakenGlobal;
- bool mHasFirstMsgFocus;
-};
-
-
-#endif // LL_LLFLOATERPOSTCARD_H
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index 6a7b5171b5..173b0e538c 100644..100755
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -43,12 +43,14 @@
#include "llcombobox.h"
#include "llcommandhandler.h"
#include "lldirpicker.h"
+#include "lleventtimer.h"
#include "llfeaturemanager.h"
#include "llfocusmgr.h"
//#include "llfirstuse.h"
#include "llfloaterreg.h"
#include "llfloaterabout.h"
#include "llfloaterhardwaresettings.h"
+#include "llfloatersidepanelcontainer.h"
#include "llimfloater.h"
#include "llkeyboard.h"
#include "llmodaldialog.h"
@@ -65,7 +67,6 @@
#include "llscrolllistctrl.h"
#include "llscrolllistitem.h"
#include "llsliderctrl.h"
-#include "llsidetray.h"
#include "lltabcontainer.h"
#include "lltrans.h"
#include "llviewercontrol.h"
@@ -73,6 +74,7 @@
#include "llviewerwindow.h"
#include "llviewermessage.h"
#include "llviewershadermgr.h"
+#include "llviewerthrottle.h"
#include "llvotree.h"
#include "llvosky.h"
@@ -103,11 +105,14 @@
#include "llviewermedia.h"
#include "llpluginclassmedia.h"
#include "llteleporthistorystorage.h"
+#include "llproxy.h"
#include "lllogininstance.h" // to check if logged in yet
+#include "llsdserialize.h"
const F32 MAX_USER_FAR_CLIP = 512.f;
const F32 MIN_USER_FAR_CLIP = 64.f;
+const F32 BANDWIDTH_UPDATER_TIMEOUT = 0.5f;
//control value for middle mouse as talk2push button
const static std::string MIDDLE_MOUSE_CV = "MiddleMouse";
@@ -154,7 +159,7 @@ BOOL LLVoiceSetKeyDialog::handleKeyHere(KEY key, MASK mask)
{
BOOL result = TRUE;
- if(key == 'Q' && mask == MASK_CONTROL)
+ if (key == 'Q' && mask == MASK_CONTROL)
{
result = FALSE;
}
@@ -183,12 +188,26 @@ void LLVoiceSetKeyDialog::onCancel(void* user_data)
void handleNameTagOptionChanged(const LLSD& newvalue);
void handleDisplayNamesOptionChanged(const LLSD& newvalue);
bool callback_clear_browser_cache(const LLSD& notification, const LLSD& response);
+bool callback_clear_cache(const LLSD& notification, const LLSD& response);
//bool callback_skip_dialogs(const LLSD& notification, const LLSD& response, LLFloaterPreference* floater);
//bool callback_reset_dialogs(const LLSD& notification, const LLSD& response, LLFloaterPreference* floater);
void fractionFromDecimal(F32 decimal_val, S32& numerator, S32& denominator);
+bool callback_clear_cache(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ if ( option == 0 ) // YES
+ {
+ // flag client texture cache for clearing next time the client runs
+ gSavedSettings.setBOOL("PurgeCacheOnNextStartup", TRUE);
+ LLNotificationsUtil::add("CacheWillClear");
+ }
+
+ return false;
+}
+
bool callback_clear_browser_cache(const LLSD& notification, const LLSD& response)
{
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
@@ -284,8 +303,10 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)
mGotPersonalInfo(false),
mOriginalIMViaEmail(false),
mLanguageChanged(false),
- mDoubleClickActionDirty(false)
+ mAvatarDataInitialized(false),
+ mClickActionDirty(false)
{
+
//Build Floater is now Called from LLFloaterReg::add("preferences", "floater_preferences.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPreference>);
static bool registered_dialog = false;
@@ -299,7 +320,7 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)
mCommitCallbackRegistrar.add("Pref.Cancel", boost::bind(&LLFloaterPreference::onBtnCancel, this));
mCommitCallbackRegistrar.add("Pref.OK", boost::bind(&LLFloaterPreference::onBtnOK, this));
-// mCommitCallbackRegistrar.add("Pref.ClearCache", boost::bind(&LLFloaterPreference::onClickClearCache, this));
+ mCommitCallbackRegistrar.add("Pref.ClearCache", boost::bind(&LLFloaterPreference::onClickClearCache, this));
mCommitCallbackRegistrar.add("Pref.WebClearCache", boost::bind(&LLFloaterPreference::onClickBrowserClearCache, this));
mCommitCallbackRegistrar.add("Pref.SetCache", boost::bind(&LLFloaterPreference::onClickSetCache, this));
mCommitCallbackRegistrar.add("Pref.ResetCache", boost::bind(&LLFloaterPreference::onClickResetCache, this));
@@ -307,29 +328,97 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)
mCommitCallbackRegistrar.add("Pref.SelectSkin", boost::bind(&LLFloaterPreference::onSelectSkin, this));
mCommitCallbackRegistrar.add("Pref.VoiceSetKey", boost::bind(&LLFloaterPreference::onClickSetKey, this));
mCommitCallbackRegistrar.add("Pref.VoiceSetMiddleMouse", boost::bind(&LLFloaterPreference::onClickSetMiddleMouse, this));
+ mCommitCallbackRegistrar.add("Pref.SetSounds", boost::bind(&LLFloaterPreference::onClickSetSounds, this));
// mCommitCallbackRegistrar.add("Pref.ClickSkipDialogs", boost::bind(&LLFloaterPreference::onClickSkipDialogs, this));
// mCommitCallbackRegistrar.add("Pref.ClickResetDialogs", boost::bind(&LLFloaterPreference::onClickResetDialogs, this));
mCommitCallbackRegistrar.add("Pref.ClickEnablePopup", boost::bind(&LLFloaterPreference::onClickEnablePopup, this));
mCommitCallbackRegistrar.add("Pref.ClickDisablePopup", boost::bind(&LLFloaterPreference::onClickDisablePopup, this));
mCommitCallbackRegistrar.add("Pref.LogPath", boost::bind(&LLFloaterPreference::onClickLogPath, this));
- mCommitCallbackRegistrar.add("Pref.HardwareSettings", boost::bind(&LLFloaterPreference::onOpenHardwareSettings, this));
- mCommitCallbackRegistrar.add("Pref.HardwareDefaults", boost::bind(&LLFloaterPreference::setHardwareDefaults, this));
- mCommitCallbackRegistrar.add("Pref.VertexShaderEnable", boost::bind(&LLFloaterPreference::onVertexShaderEnable, this));
- mCommitCallbackRegistrar.add("Pref.WindowedMod", boost::bind(&LLFloaterPreference::onCommitWindowedMode, this));
- mCommitCallbackRegistrar.add("Pref.UpdateSliderText", boost::bind(&LLFloaterPreference::onUpdateSliderText,this, _1,_2));
- mCommitCallbackRegistrar.add("Pref.QualityPerformance", boost::bind(&LLFloaterPreference::onChangeQuality, this, _2));
+ mCommitCallbackRegistrar.add("Pref.HardwareSettings", boost::bind(&LLFloaterPreference::onOpenHardwareSettings, this));
+ mCommitCallbackRegistrar.add("Pref.HardwareDefaults", boost::bind(&LLFloaterPreference::setHardwareDefaults, this));
+ mCommitCallbackRegistrar.add("Pref.VertexShaderEnable", boost::bind(&LLFloaterPreference::onVertexShaderEnable, this));
+ mCommitCallbackRegistrar.add("Pref.WindowedMod", boost::bind(&LLFloaterPreference::onCommitWindowedMode, this));
+ mCommitCallbackRegistrar.add("Pref.UpdateSliderText", boost::bind(&LLFloaterPreference::onUpdateSliderText,this, _1,_2));
+ mCommitCallbackRegistrar.add("Pref.QualityPerformance", boost::bind(&LLFloaterPreference::onChangeQuality, this, _2));
mCommitCallbackRegistrar.add("Pref.applyUIColor", boost::bind(&LLFloaterPreference::applyUIColor, this ,_1, _2));
mCommitCallbackRegistrar.add("Pref.getUIColor", boost::bind(&LLFloaterPreference::getUIColor, this ,_1, _2));
mCommitCallbackRegistrar.add("Pref.MaturitySettings", boost::bind(&LLFloaterPreference::onChangeMaturity, this));
mCommitCallbackRegistrar.add("Pref.BlockList", boost::bind(&LLFloaterPreference::onClickBlockList, this));
- mCommitCallbackRegistrar.add("Pref.CommitDoubleClickChekbox", boost::bind(&LLFloaterPreference::onDoubleClickCheckBox, this, _1));
- mCommitCallbackRegistrar.add("Pref.CommitRadioDoubleClick", boost::bind(&LLFloaterPreference::onDoubleClickRadio, this));
-
- sSkin = gSavedSettings.getString("SkinCurrent");
+ mCommitCallbackRegistrar.add("Pref.Proxy", boost::bind(&LLFloaterPreference::onClickProxySettings, this));
+ mCommitCallbackRegistrar.add("Pref.TranslationSettings", boost::bind(&LLFloaterPreference::onClickTranslationSettings, this));
+ sSkin = gSavedSettings.getString("SkinCurrent");
+
+ mCommitCallbackRegistrar.add("Pref.ClickActionChange", boost::bind(&LLFloaterPreference::onClickActionChange, this));
+
gSavedSettings.getControl("NameTagShowUsernames")->getCommitSignal()->connect(boost::bind(&handleNameTagOptionChanged, _2));
gSavedSettings.getControl("NameTagShowFriends")->getCommitSignal()->connect(boost::bind(&handleNameTagOptionChanged, _2));
gSavedSettings.getControl("UseDisplayNames")->getCommitSignal()->connect(boost::bind(&handleDisplayNamesOptionChanged, _2));
+
+ LLAvatarPropertiesProcessor::getInstance()->addObserver( gAgent.getID(), this );
+}
+
+void LLFloaterPreference::processProperties( void* pData, EAvatarProcessorType type )
+{
+ if ( APT_PROPERTIES == type )
+ {
+ const LLAvatarData* pAvatarData = static_cast<const LLAvatarData*>( pData );
+ if (pAvatarData && (gAgent.getID() == pAvatarData->avatar_id) && (pAvatarData->avatar_id != LLUUID::null))
+ {
+ storeAvatarProperties( pAvatarData );
+ processProfileProperties( pAvatarData );
+ }
+ }
+}
+
+void LLFloaterPreference::storeAvatarProperties( const LLAvatarData* pAvatarData )
+{
+ if (LLStartUp::getStartupState() == STATE_STARTED)
+ {
+ mAvatarProperties.avatar_id = pAvatarData->avatar_id;
+ mAvatarProperties.image_id = pAvatarData->image_id;
+ mAvatarProperties.fl_image_id = pAvatarData->fl_image_id;
+ mAvatarProperties.about_text = pAvatarData->about_text;
+ mAvatarProperties.fl_about_text = pAvatarData->fl_about_text;
+ mAvatarProperties.profile_url = pAvatarData->profile_url;
+ mAvatarProperties.flags = pAvatarData->flags;
+ mAvatarProperties.allow_publish = pAvatarData->flags & AVATAR_ALLOW_PUBLISH;
+
+ mAvatarDataInitialized = true;
+ }
+}
+
+void LLFloaterPreference::processProfileProperties(const LLAvatarData* pAvatarData )
+{
+ getChild<LLUICtrl>("online_searchresults")->setValue( (bool)(pAvatarData->flags & AVATAR_ALLOW_PUBLISH) );
+}
+
+void LLFloaterPreference::saveAvatarProperties( void )
+{
+ const BOOL allowPublish = getChild<LLUICtrl>("online_searchresults")->getValue();
+
+ if (allowPublish)
+ {
+ mAvatarProperties.flags |= AVATAR_ALLOW_PUBLISH;
+ }
+
+ //
+ // NOTE: We really don't want to send the avatar properties unless we absolutely
+ // need to so we can avoid the accidental profile reset bug, so, if we're
+ // logged in, the avatar data has been initialized and we have a state change
+ // for the "allow publish" flag, then set the flag to its new value and send
+ // the properties update.
+ //
+ // NOTE: The only reason we can not remove this update altogether is because of the
+ // "allow publish" flag, the last remaining profile setting in the viewer
+ // that doesn't exist in the web profile.
+ //
+ if ((LLStartUp::getStartupState() == STATE_STARTED) && mAvatarDataInitialized && (allowPublish != mAvatarProperties.allow_publish))
+ {
+ mAvatarProperties.allow_publish = allowPublish;
+
+ LLAvatarPropertiesProcessor::getInstance()->sendAvatarPropertiesUpdate( &mAvatarProperties );
+ }
}
BOOL LLFloaterPreference::postBuild()
@@ -342,12 +431,14 @@ BOOL LLFloaterPreference::postBuild()
gSavedSettings.getControl("ChatFontSize")->getSignal()->connect(boost::bind(&LLNearbyChat::processChatHistoryStyleUpdate, _2));
+ gSavedSettings.getControl("ChatFontSize")->getSignal()->connect(boost::bind(&LLViewerChat::signalChatFontChanged));
+
+ gSavedSettings.getControl("ChatBubbleOpacity")->getSignal()->connect(boost::bind(&LLFloaterPreference::onNameTagOpacityChange, this, _2));
+
LLTabContainer* tabcontainer = getChild<LLTabContainer>("pref core");
if (!tabcontainer->selectTab(gSavedSettings.getS32("LastPrefTab")))
tabcontainer->selectFirstTab();
- updateDoubleClickControls();
-
getChild<LLUICtrl>("cache_location")->setEnabled(FALSE); // make it read-only but selectable (STORM-227)
std::string cache_location = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "");
setCacheLocation(cache_location);
@@ -366,7 +457,7 @@ BOOL LLFloaterPreference::postBuild()
void LLFloaterPreference::onBusyResponseChanged()
{
// set "BusyResponseChanged" TRUE if user edited message differs from default, FALSE otherwise
- if(LLTrans::getString("BusyModeResponseDefault") != getChild<LLUICtrl>("busy_response")->getValue().asString())
+ if (LLTrans::getString("BusyModeResponseDefault") != getChild<LLUICtrl>("busy_response")->getValue().asString())
{
gSavedPerAccountSettings.setBOOL("BusyResponseChanged", TRUE );
}
@@ -413,6 +504,8 @@ void LLFloaterPreference::saveSettings()
void LLFloaterPreference::apply()
{
+ LLAvatarPropertiesProcessor::getInstance()->addObserver( gAgent.getID(), this );
+
LLTabContainer* tabcontainer = getChild<LLTabContainer>("pref core");
if (sSkin != gSavedSettings.getString("SkinCurrent"))
{
@@ -446,7 +539,7 @@ void LLFloaterPreference::apply()
LLViewerMedia::setCookiesEnabled(getChild<LLUICtrl>("cookies_enabled")->getValue());
- if(hasChild("web_proxy_enabled") &&hasChild("web_proxy_editor") && hasChild("web_proxy_port"))
+ if (hasChild("web_proxy_enabled") &&hasChild("web_proxy_editor") && hasChild("web_proxy_port"))
{
bool proxy_enable = getChild<LLUICtrl>("web_proxy_enabled")->getValue();
std::string proxy_address = getChild<LLUICtrl>("web_proxy_editor")->getValue();
@@ -459,13 +552,13 @@ void LLFloaterPreference::apply()
gSavedSettings.setBOOL("PlainTextChatHistory", getChild<LLUICtrl>("plain_text_chat_history")->getValue().asBoolean());
- if(mGotPersonalInfo)
+ if (mGotPersonalInfo)
{
// gSavedSettings.setString("BusyModeResponse2", std::string(wstring_to_utf8str(busy_response)));
bool new_im_via_email = getChild<LLUICtrl>("send_im_to_email")->getValue().asBoolean();
bool new_hide_online = getChild<LLUICtrl>("online_visibility")->getValue().asBoolean();
- if((new_im_via_email != mOriginalIMViaEmail)
+ if ((new_im_via_email != mOriginalIMViaEmail)
||(new_hide_online != mOriginalHideOnlineStatus))
{
// This hack is because we are representing several different
@@ -473,21 +566,23 @@ void LLFloaterPreference::apply()
// can only select between 2 values, we represent it as a
// checkbox. This breaks down a little bit for liaisons, but
// works out in the end.
- if(new_hide_online != mOriginalHideOnlineStatus)
- {
- if(new_hide_online) mDirectoryVisibility = VISIBILITY_HIDDEN;
+ if (new_hide_online != mOriginalHideOnlineStatus)
+ {
+ if (new_hide_online) mDirectoryVisibility = VISIBILITY_HIDDEN;
else mDirectoryVisibility = VISIBILITY_DEFAULT;
//Update showonline value, otherwise multiple applys won't work
mOriginalHideOnlineStatus = new_hide_online;
- }
+ }
gAgent.sendAgentUpdateUserInfo(new_im_via_email,mDirectoryVisibility);
}
}
- if (mDoubleClickActionDirty)
+ saveAvatarProperties();
+
+ if (mClickActionDirty)
{
- updateDoubleClickSettings();
- mDoubleClickActionDirty = false;
+ updateClickActionSettings();
+ mClickActionDirty = false;
}
}
@@ -505,6 +600,9 @@ void LLFloaterPreference::cancel()
}
// hide joystick pref floater
LLFloaterReg::hideInstance("pref_joystick");
+
+ // hide translation settings floater
+ LLFloaterReg::hideInstance("prefs_translation");
// cancel hardware menu
LLFloaterHardwareSettings* hardware_settings = LLFloaterReg::getTypedInstance<LLFloaterHardwareSettings>("prefs_hardware_settings");
@@ -516,15 +614,22 @@ void LLFloaterPreference::cancel()
// reverts any changes to current skin
gSavedSettings.setString("SkinCurrent", sSkin);
- if (mDoubleClickActionDirty)
+ if (mClickActionDirty)
+ {
+ updateClickActionControls();
+ mClickActionDirty = false;
+ }
+
+ LLFloaterPreferenceProxy * advanced_proxy_settings = LLFloaterReg::findTypedInstance<LLFloaterPreferenceProxy>("prefs_proxy");
+ if (advanced_proxy_settings)
{
- updateDoubleClickControls();
- mDoubleClickActionDirty = false;
+ advanced_proxy_settings->cancel();
}
}
void LLFloaterPreference::onOpen(const LLSD& key)
{
+
// this variable and if that follows it are used to properly handle busy mode response message
static bool initialized = FALSE;
// if user is logged in and we haven't initialized busy_response yet, do it
@@ -551,7 +656,7 @@ void LLFloaterPreference::onOpen(const LLSD& key)
(gAgent.isMature() || gAgent.isGodlike());
LLComboBox* maturity_combo = getChild<LLComboBox>("maturity_desired_combobox");
-
+ LLAvatarPropertiesProcessor::getInstance()->sendAvatarPropertiesRequest( gAgent.getID() );
if (can_choose_maturity)
{
// if they're not adult or a god, they shouldn't see the adult selection, so delete it
@@ -579,6 +684,9 @@ void LLFloaterPreference::onOpen(const LLSD& key)
// Display selected maturity icons.
onChangeMaturity();
+ // Load (double-)click to walk/teleport settings.
+ updateClickActionControls();
+
// Enabled/disabled popups, might have been changed by user actions
// while preferences floater was closed.
buildPopupLists();
@@ -633,7 +741,8 @@ void LLFloaterPreference::onClose(bool app_quitting)
void LLFloaterPreference::onOpenHardwareSettings()
{
- LLFloaterReg::showInstance("prefs_hardware_settings");
+ LLFloater* floater = LLFloaterReg::showInstance("prefs_hardware_settings");
+ addDependentFloater(floater, FALSE);
}
// static
void LLFloaterPreference::onBtnOK()
@@ -655,10 +764,7 @@ void LLFloaterPreference::onBtnOK()
closeFloater(false);
LLUIColorTable::instance().saveUserSettings();
- gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile"), TRUE );
- std::string crash_settings_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE);
- // save all settings, even if equals defaults
- gCrashSettings.saveToFile(crash_settings_filename, FALSE);
+ gSavedSettings.saveToFile(gSavedSettings.getString("ClientSettingsFile"), TRUE);
}
else
{
@@ -706,7 +812,7 @@ void LLFloaterPreference::onBtnCancel()
void LLFloaterPreference::updateUserInfo(const std::string& visibility, bool im_via_email, const std::string& email)
{
LLFloaterPreference* instance = LLFloaterReg::findTypedInstance<LLFloaterPreference>("preferences");
- if(instance)
+ if (instance)
{
instance->setPersonalInfo(visibility, im_via_email, email);
}
@@ -716,7 +822,7 @@ void LLFloaterPreference::updateUserInfo(const std::string& visibility, bool im_
void LLFloaterPreference::refreshEnabledGraphics()
{
LLFloaterPreference* instance = LLFloaterReg::findTypedInstance<LLFloaterPreference>("preferences");
- if(instance)
+ if (instance)
{
instance->refresh();
//instance->refreshEnabledState();
@@ -728,6 +834,11 @@ void LLFloaterPreference::refreshEnabledGraphics()
}
}
+void LLFloaterPreference::onClickClearCache()
+{
+ LLNotificationsUtil::add("ConfirmClearCache", LLSD(), LLSD(), callback_clear_cache);
+}
+
void LLFloaterPreference::onClickBrowserClearCache()
{
LLNotificationsUtil::add("ConfirmClearBrowserCache", LLSD(), LLSD(), callback_clear_browser_cache);
@@ -745,6 +856,16 @@ void LLFloaterPreference::onLanguageChange()
}
}
+void LLFloaterPreference::onNameTagOpacityChange(const LLSD& newvalue)
+{
+ LLColorSwatchCtrl* color_swatch = findChild<LLColorSwatchCtrl>("background");
+ if (color_swatch)
+ {
+ LLColor4 new_color = color_swatch->get();
+ color_swatch->set( new_color.setAlpha(newvalue.asReal()) );
+ }
+}
+
void LLFloaterPreference::onClickSetCache()
{
std::string cur_name(gSavedSettings.getString("CacheLocation"));
@@ -777,14 +898,15 @@ void LLFloaterPreference::onClickSetCache()
void LLFloaterPreference::onClickResetCache()
{
- if (!gSavedSettings.getString("CacheLocation").empty())
+ if (gDirUtilp->getCacheDir(false) == gDirUtilp->getCacheDir(true))
{
- gSavedSettings.setString("NewCacheLocation", "");
- gSavedSettings.setString("NewCacheLocationTopFolder", "");
+ // The cache location was already the default.
+ return;
}
-
+ gSavedSettings.setString("NewCacheLocation", "");
+ gSavedSettings.setString("NewCacheLocationTopFolder", "");
LLNotificationsUtil::add("CacheWillBeMoved");
- std::string cache_location = gDirUtilp->getCacheDir(true);
+ std::string cache_location = gDirUtilp->getCacheDir(false);
gSavedSettings.setString("CacheLocation", cache_location);
std::string top_folder(gDirUtilp->getBaseFileName(cache_location));
gSavedSettings.setString("CacheLocationTopFolder", top_folder);
@@ -896,9 +1018,15 @@ void LLFloaterPreference::refreshEnabledState()
LLCheckBoxCtrl* ctrl_avatar_vp = getChild<LLCheckBoxCtrl>("AvatarVertexProgram");
// Avatar Render Mode
LLCheckBoxCtrl* ctrl_avatar_cloth = getChild<LLCheckBoxCtrl>("AvatarCloth");
+
+ bool avatar_vp_enabled = LLFeatureManager::getInstance()->isFeatureAvailable("RenderAvatarVP");
+ if (LLViewerShaderMgr::sInitialized)
+ {
+ S32 max_avatar_shader = LLViewerShaderMgr::instance()->mMaxAvatarShaderLevel;
+ avatar_vp_enabled = (max_avatar_shader > 0) ? TRUE : FALSE;
+ }
- S32 max_avatar_shader = LLViewerShaderMgr::instance()->mMaxAvatarShaderLevel;
- ctrl_avatar_vp->setEnabled((max_avatar_shader > 0) ? TRUE : FALSE);
+ ctrl_avatar_vp->setEnabled(avatar_vp_enabled);
if (gSavedSettings.getBOOL("VertexShaderEnable") == FALSE ||
gSavedSettings.getBOOL("RenderAvatarVP") == FALSE)
@@ -915,7 +1043,7 @@ void LLFloaterPreference::refreshEnabledState()
LLCheckBoxCtrl* ctrl_shader_enable = getChild<LLCheckBoxCtrl>("BasicShaders");
// radio set for terrain detail mode
LLRadioGroup* mRadioTerrainDetail = getChild<LLRadioGroup>("TerrainDetailRadio"); // can be linked with control var
-
+
ctrl_shader_enable->setEnabled(LLFeatureManager::getInstance()->isFeatureAvailable("VertexShaderEnable"));
BOOL shaders = ctrl_shader_enable->get();
@@ -938,26 +1066,28 @@ void LLFloaterPreference::refreshEnabledState()
//Deferred/SSAO/Shadows
LLCheckBoxCtrl* ctrl_deferred = getChild<LLCheckBoxCtrl>("UseLightShaders");
- if (LLFeatureManager::getInstance()->isFeatureAvailable("RenderUseFBO") &&
- LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred") &&
- shaders)
- {
- BOOL enabled = (ctrl_wind_light->get()) ? TRUE : FALSE;
+
+ BOOL enabled = LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred") &&
+ shaders &&
+ gGLManager.mHasFramebufferObject &&
+ gSavedSettings.getBOOL("RenderAvatarVP") &&
+ (ctrl_wind_light->get()) ? TRUE : FALSE;
- ctrl_deferred->setEnabled(enabled);
+ ctrl_deferred->setEnabled(enabled);
- LLCheckBoxCtrl* ctrl_ssao = getChild<LLCheckBoxCtrl>("UseSSAO");
- LLComboBox* ctrl_shadow = getChild<LLComboBox>("ShadowDetail");
+ LLCheckBoxCtrl* ctrl_ssao = getChild<LLCheckBoxCtrl>("UseSSAO");
+ LLCheckBoxCtrl* ctrl_dof = getChild<LLCheckBoxCtrl>("UseDoF");
+ LLComboBox* ctrl_shadow = getChild<LLComboBox>("ShadowDetail");
- enabled = enabled && LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferredSSAO") && (ctrl_deferred->get() ? TRUE : FALSE);
+ enabled = enabled && LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferredSSAO") && (ctrl_deferred->get() ? TRUE : FALSE);
- ctrl_ssao->setEnabled(enabled);
+ ctrl_ssao->setEnabled(enabled);
+ ctrl_dof->setEnabled(enabled);
- enabled = enabled && LLFeatureManager::getInstance()->isFeatureAvailable("RenderShadowDetail");
-
- ctrl_shadow->setEnabled(enabled);
- }
+ enabled = enabled && LLFeatureManager::getInstance()->isFeatureAvailable("RenderShadowDetail");
+ ctrl_shadow->setEnabled(enabled);
+
// now turn off any features that are unavailable
disableUnavailableSettings();
@@ -976,9 +1106,10 @@ void LLFloaterPreference::disableUnavailableSettings()
LLCheckBoxCtrl* ctrl_deferred = getChild<LLCheckBoxCtrl>("UseLightShaders");
LLComboBox* ctrl_shadows = getChild<LLComboBox>("ShadowDetail");
LLCheckBoxCtrl* ctrl_ssao = getChild<LLCheckBoxCtrl>("UseSSAO");
+ LLCheckBoxCtrl* ctrl_dof = getChild<LLCheckBoxCtrl>("UseDoF");
// if vertex shaders off, disable all shader related products
- if(!LLFeatureManager::getInstance()->isFeatureAvailable("VertexShaderEnable"))
+ if (!LLFeatureManager::getInstance()->isFeatureAvailable("VertexShaderEnable"))
{
ctrl_shader_enable->setEnabled(FALSE);
ctrl_shader_enable->setValue(FALSE);
@@ -1001,12 +1132,15 @@ void LLFloaterPreference::disableUnavailableSettings()
ctrl_ssao->setEnabled(FALSE);
ctrl_ssao->setValue(FALSE);
+ ctrl_dof->setEnabled(FALSE);
+ ctrl_dof->setValue(FALSE);
+
ctrl_deferred->setEnabled(FALSE);
ctrl_deferred->setValue(FALSE);
}
// disabled windlight
- if(!LLFeatureManager::getInstance()->isFeatureAvailable("WindLightUseAtmosShaders"))
+ if (!LLFeatureManager::getInstance()->isFeatureAvailable("WindLightUseAtmosShaders"))
{
ctrl_wind_light->setEnabled(FALSE);
ctrl_wind_light->setValue(FALSE);
@@ -1018,12 +1152,16 @@ void LLFloaterPreference::disableUnavailableSettings()
ctrl_ssao->setEnabled(FALSE);
ctrl_ssao->setValue(FALSE);
+ ctrl_dof->setEnabled(FALSE);
+ ctrl_dof->setValue(FALSE);
+
ctrl_deferred->setEnabled(FALSE);
ctrl_deferred->setValue(FALSE);
}
// disabled deferred
- if(!LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred"))
+ if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred") ||
+ !gGLManager.mHasFramebufferObject)
{
ctrl_shadows->setEnabled(FALSE);
ctrl_shadows->setValue(0);
@@ -1031,33 +1169,36 @@ void LLFloaterPreference::disableUnavailableSettings()
ctrl_ssao->setEnabled(FALSE);
ctrl_ssao->setValue(FALSE);
+ ctrl_dof->setEnabled(FALSE);
+ ctrl_dof->setValue(FALSE);
+
ctrl_deferred->setEnabled(FALSE);
ctrl_deferred->setValue(FALSE);
}
// disabled deferred SSAO
- if(!LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferredSSAO"))
+ if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferredSSAO"))
{
ctrl_ssao->setEnabled(FALSE);
ctrl_ssao->setValue(FALSE);
}
// disabled deferred shadows
- if(!LLFeatureManager::getInstance()->isFeatureAvailable("RenderShadowDetail"))
+ if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderShadowDetail"))
{
ctrl_shadows->setEnabled(FALSE);
ctrl_shadows->setValue(0);
}
// disabled reflections
- if(!LLFeatureManager::getInstance()->isFeatureAvailable("RenderReflectionDetail"))
+ if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderReflectionDetail"))
{
ctrl_reflections->setEnabled(FALSE);
ctrl_reflections->setValue(FALSE);
}
// disabled av
- if(!LLFeatureManager::getInstance()->isFeatureAvailable("RenderAvatarVP"))
+ if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderAvatarVP"))
{
ctrl_avatar_vp->setEnabled(FALSE);
ctrl_avatar_vp->setValue(FALSE);
@@ -1072,19 +1213,22 @@ void LLFloaterPreference::disableUnavailableSettings()
ctrl_ssao->setEnabled(FALSE);
ctrl_ssao->setValue(FALSE);
+ ctrl_dof->setEnabled(FALSE);
+ ctrl_dof->setValue(FALSE);
+
ctrl_deferred->setEnabled(FALSE);
ctrl_deferred->setValue(FALSE);
}
// disabled cloth
- if(!LLFeatureManager::getInstance()->isFeatureAvailable("RenderAvatarCloth"))
+ if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderAvatarCloth"))
{
ctrl_avatar_cloth->setEnabled(FALSE);
ctrl_avatar_cloth->setValue(FALSE);
}
// disabled impostors
- if(!LLFeatureManager::getInstance()->isFeatureAvailable("RenderUseImpostors"))
+ if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderUseImpostors"))
{
ctrl_avatar_impostors->setEnabled(FALSE);
ctrl_avatar_impostors->setValue(FALSE);
@@ -1102,6 +1246,7 @@ void LLFloaterPreference::refresh()
updateSliderText(getChild<LLSliderCtrl>("FlexibleMeshDetail", true), getChild<LLTextBox>("FlexibleMeshDetailText", true));
updateSliderText(getChild<LLSliderCtrl>("TreeMeshDetail", true), getChild<LLTextBox>("TreeMeshDetailText", true));
updateSliderText(getChild<LLSliderCtrl>("AvatarMeshDetail", true), getChild<LLTextBox>("AvatarMeshDetailText", true));
+ updateSliderText(getChild<LLSliderCtrl>("AvatarPhysicsDetail", true), getChild<LLTextBox>("AvatarPhysicsDetailText", true));
updateSliderText(getChild<LLSliderCtrl>("TerrainMeshDetail", true), getChild<LLTextBox>("TerrainMeshDetailText", true));
updateSliderText(getChild<LLSliderCtrl>("RenderPostProcess", true), getChild<LLTextBox>("PostProcessText", true));
updateSliderText(getChild<LLSliderCtrl>("SkyMeshDetail", true), getChild<LLTextBox>("SkyMeshDetailText", true));
@@ -1152,6 +1297,14 @@ void LLFloaterPreference::onClickSetMiddleMouse()
p2t_line_editor->setValue(advanced_preferences->getString("middle_mouse"));
}
}
+
+void LLFloaterPreference::onClickSetSounds()
+{
+ // Disable Enable gesture sounds checkbox if the master sound is disabled
+ // or if sound effects are disabled.
+ getChild<LLCheckBoxCtrl>("gesture_audio_play_btn")->setEnabled(!gSavedSettings.getBOOL("MuteSounds"));
+}
+
/*
void LLFloaterPreference::onClickSkipDialogs()
{
@@ -1241,12 +1394,12 @@ void LLFloaterPreference::setPersonalInfo(const std::string& visibility, bool im
mOriginalIMViaEmail = im_via_email;
mDirectoryVisibility = visibility;
- if(visibility == VISIBILITY_DEFAULT)
+ if (visibility == VISIBILITY_DEFAULT)
{
mOriginalHideOnlineStatus = false;
getChildView("online_visibility")->setEnabled(TRUE);
}
- else if(visibility == VISIBILITY_HIDDEN)
+ else if (visibility == VISIBILITY_HIDDEN)
{
mOriginalHideOnlineStatus = true;
getChildView("online_visibility")->setEnabled(TRUE);
@@ -1256,6 +1409,8 @@ void LLFloaterPreference::setPersonalInfo(const std::string& visibility, bool im
mOriginalHideOnlineStatus = true;
}
+ getChild<LLUICtrl>("online_searchresults")->setEnabled(TRUE);
+
getChildView("include_im_in_chat_history")->setEnabled(TRUE);
getChildView("show_timestamps_check_im")->setEnabled(TRUE);
getChildView("friends_online_notify_checkbox")->setEnabled(TRUE);
@@ -1276,6 +1431,7 @@ void LLFloaterPreference::setPersonalInfo(const std::string& visibility, bool im
// getChild<LLUICtrl>("busy_response")->setValue(gSavedSettings.getString("BusyModeResponse2"));
+ getChildView("favorites_on_login_check")->setEnabled(TRUE);
getChildView("log_nearby_chat")->setEnabled(TRUE);
getChildView("log_instant_messages")->setEnabled(TRUE);
getChildView("show_timestamps_check_im")->setEnabled(TRUE);
@@ -1291,7 +1447,7 @@ void LLFloaterPreference::onUpdateSliderText(LLUICtrl* ctrl, const LLSD& name)
{
std::string ctrl_name = name.asString();
- if((ctrl_name =="" )|| !hasChild(ctrl_name, true))
+ if ((ctrl_name =="" )|| !hasChild(ctrl_name, true))
return;
LLTextBox* text_box = getChild<LLTextBox>(name.asString());
@@ -1301,7 +1457,7 @@ void LLFloaterPreference::onUpdateSliderText(LLUICtrl* ctrl, const LLSD& name)
void LLFloaterPreference::updateSliderText(LLSliderCtrl* ctrl, LLTextBox* text_box)
{
- if(text_box == NULL || ctrl== NULL)
+ if (text_box == NULL || ctrl== NULL)
return;
// get range and points when text should change
@@ -1314,7 +1470,7 @@ void LLFloaterPreference::updateSliderText(LLSliderCtrl* ctrl, LLTextBox* text_b
F32 highPoint = min + (2.0f * range / 3.0f);
// choose the right text
- if(value < midPoint)
+ if (value < midPoint)
{
text_box->setText(LLTrans::getString("GraphicsQualityLow"));
}
@@ -1346,74 +1502,42 @@ void LLFloaterPreference::onChangeMaturity()
// but the UI for this will still be enabled
void LLFloaterPreference::onClickBlockList()
{
- // don't create side tray on demand
- if (LLSideTray::instanceCreated())
- {
- LLSideTray::getInstance()->showPanel("panel_block_list_sidetray");
- }
+ LLFloaterSidePanelContainer::showPanel("people", "panel_block_list_sidetray", LLSD());
}
-void LLFloaterPreference::onDoubleClickCheckBox(LLUICtrl* ctrl)
+void LLFloaterPreference::onClickProxySettings()
{
- if (!ctrl) return;
- mDoubleClickActionDirty = true;
- LLRadioGroup* radio_double_click_action = getChild<LLRadioGroup>("double_click_action");
- if (!radio_double_click_action) return;
- // select default value("teleport") in radio-group.
- radio_double_click_action->setSelectedIndex(0);
- // set radio-group enabled depending on state of checkbox
- radio_double_click_action->setEnabled(ctrl->getValue());
+ LLFloaterReg::showInstance("prefs_proxy");
}
-void LLFloaterPreference::onDoubleClickRadio()
+void LLFloaterPreference::onClickTranslationSettings()
{
- mDoubleClickActionDirty = true;
+ LLFloaterReg::showInstance("prefs_translation");
}
-void LLFloaterPreference::updateDoubleClickSettings()
+void LLFloaterPreference::onClickActionChange()
{
- LLCheckBoxCtrl* double_click_action_cb = getChild<LLCheckBoxCtrl>("double_click_chkbox");
- if (!double_click_action_cb) return;
- bool enable = double_click_action_cb->getValue().asBoolean();
+ mClickActionDirty = true;
+}
- LLRadioGroup* radio_double_click_action = getChild<LLRadioGroup>("double_click_action");
- if (!radio_double_click_action) return;
-
- // enable double click radio-group depending on state of checkbox
- radio_double_click_action->setEnabled(enable);
-
- if (!enable)
- {
- // set double click action settings values to false if checkbox was unchecked
- gSavedSettings.setBOOL("DoubleClickAutoPilot", false);
- gSavedSettings.setBOOL("DoubleClickTeleport", false);
- }
- else
- {
- std::string selected = radio_double_click_action->getValue().asString();
- bool teleport_selected = selected == "radio_teleport";
- // set double click action settings values depending on chosen radio-button
- gSavedSettings.setBOOL( "DoubleClickTeleport", teleport_selected );
- gSavedSettings.setBOOL( "DoubleClickAutoPilot", !teleport_selected );
- }
+void LLFloaterPreference::updateClickActionSettings()
+{
+ const int single_clk_action = getChild<LLComboBox>("single_click_action_combo")->getValue().asInteger();
+ const int double_clk_action = getChild<LLComboBox>("double_click_action_combo")->getValue().asInteger();
+
+ gSavedSettings.setBOOL("ClickToWalk", single_clk_action == 1);
+ gSavedSettings.setBOOL("DoubleClickAutoPilot", double_clk_action == 1);
+ gSavedSettings.setBOOL("DoubleClickTeleport", double_clk_action == 2);
}
-void LLFloaterPreference::updateDoubleClickControls()
+void LLFloaterPreference::updateClickActionControls()
{
- // check is one of double-click actions settings enabled
- bool double_click_action_enabled = gSavedSettings.getBOOL("DoubleClickAutoPilot") || gSavedSettings.getBOOL("DoubleClickTeleport");
- LLCheckBoxCtrl* double_click_action_cb = getChild<LLCheckBoxCtrl>("double_click_chkbox");
- if (double_click_action_cb)
- {
- // check checkbox if one of double-click actions settings enabled, uncheck otherwise
- double_click_action_cb->setValue(double_click_action_enabled);
- }
- LLRadioGroup* double_click_action_radio = getChild<LLRadioGroup>("double_click_action");
- if (!double_click_action_radio) return;
- // set radio-group enabled if one of double-click actions settings enabled
- double_click_action_radio->setEnabled(double_click_action_enabled);
- // select button in radio-group depending on setting
- double_click_action_radio->setSelectedIndex(gSavedSettings.getBOOL("DoubleClickAutoPilot"));
+ const bool click_to_walk = gSavedSettings.getBOOL("ClickToWalk");
+ const bool dbl_click_to_walk = gSavedSettings.getBOOL("DoubleClickAutoPilot");
+ const bool dbl_click_to_teleport = gSavedSettings.getBOOL("DoubleClickTeleport");
+
+ getChild<LLComboBox>("single_click_action_combo")->setValue((int)click_to_walk);
+ getChild<LLComboBox>("double_click_action_combo")->setValue(dbl_click_to_teleport ? 2 : (int)dbl_click_to_walk);
}
void LLFloaterPreference::applyUIColor(LLUICtrl* ctrl, const LLSD& param)
@@ -1434,12 +1558,59 @@ void LLFloaterPreference::setCacheLocation(const LLStringExplicit& location)
cache_location_editor->setToolTip(location);
}
+//------------------------------Updater---------------------------------------
+
+static bool handleBandwidthChanged(const LLSD& newvalue)
+{
+ gViewerThrottle.setMaxBandwidth((F32) newvalue.asReal());
+ return true;
+}
+
+class LLPanelPreference::Updater : public LLEventTimer
+{
+
+public:
+
+ typedef boost::function<bool(const LLSD&)> callback_t;
+
+ Updater(callback_t cb, F32 period)
+ :LLEventTimer(period),
+ mCallback(cb)
+ {
+ mEventTimer.stop();
+ }
+
+ virtual ~Updater(){}
+
+ void update(const LLSD& new_value)
+ {
+ mNewValue = new_value;
+ mEventTimer.start();
+ }
+
+protected:
+
+ BOOL tick()
+ {
+ mCallback(mNewValue);
+ mEventTimer.stop();
+
+ return FALSE;
+ }
+
+private:
+
+ LLSD mNewValue;
+ callback_t mCallback;
+};
//----------------------------------------------------------------------------
static LLRegisterPanelClassWrapper<LLPanelPreference> t_places("panel_preference");
LLPanelPreference::LLPanelPreference()
-: LLPanel()
+: LLPanel(),
+ mBandWidthUpdater(NULL)
{
mCommitCallbackRegistrar.add("Pref.setControlFalse", boost::bind(&LLPanelPreference::setControlFalse,this, _2));
+ mCommitCallbackRegistrar.add("Pref.updateMediaAutoPlayCheckbox", boost::bind(&LLPanelPreference::updateMediaAutoPlayCheckbox, this, _1));
}
//virtual
@@ -1447,7 +1618,7 @@ BOOL LLPanelPreference::postBuild()
{
////////////////////// PanelVoice ///////////////////
- if(hasChild("voice_unavailable"))
+ if (hasChild("voice_unavailable"))
{
BOOL voice_disabled = gSavedSettings.getBOOL("CmdLineDisableVoice");
getChildView("voice_unavailable")->setVisible( voice_disabled);
@@ -1469,7 +1640,7 @@ BOOL LLPanelPreference::postBuild()
}
- if(hasChild("online_visibility") && hasChild("send_im_to_email"))
+ if (hasChild("online_visibility") && hasChild("send_im_to_email"))
{
getChild<LLUICtrl>("email_address")->setValue(getString("log_in_to_change") );
// getChild<LLUICtrl>("busy_response")->setValue(getString("log_in_to_change"));
@@ -1491,6 +1662,10 @@ BOOL LLPanelPreference::postBuild()
{
getChild<LLCheckBoxCtrl>("voice_call_friends_only_check")->setCommitCallback(boost::bind(&showFriendsOnlyWarning, _1, _2));
}
+ if (hasChild("favorites_on_login_check"))
+ {
+ getChild<LLCheckBoxCtrl>("favorites_on_login_check")->setCommitCallback(boost::bind(&showFavoritesOnLoginWarning, _1, _2));
+ }
// Panel Advanced
if (hasChild("modifier_combo"))
@@ -1502,10 +1677,24 @@ BOOL LLPanelPreference::postBuild()
}
}
+ //////////////////////PanelSetup ///////////////////
+ if (hasChild("max_bandwidth"))
+ {
+ mBandWidthUpdater = new LLPanelPreference::Updater(boost::bind(&handleBandwidthChanged, _1), BANDWIDTH_UPDATER_TIMEOUT);
+ gSavedSettings.getControl("ThrottleBandwidthKBPS")->getSignal()->connect(boost::bind(&LLPanelPreference::Updater::update, mBandWidthUpdater, _2));
+ }
+
apply();
return true;
}
+LLPanelPreference::~LLPanelPreference()
+{
+ if (mBandWidthUpdater)
+ {
+ delete mBandWidthUpdater;
+ }
+}
void LLPanelPreference::apply()
{
// no-op
@@ -1558,6 +1747,14 @@ void LLPanelPreference::showFriendsOnlyWarning(LLUICtrl* checkbox, const LLSD& v
}
}
+void LLPanelPreference::showFavoritesOnLoginWarning(LLUICtrl* checkbox, const LLSD& value)
+{
+ if (checkbox && checkbox->getValue())
+ {
+ LLNotificationsUtil::add("FavoritesOnLogin");
+ }
+}
+
void LLPanelPreference::cancel()
{
for (control_values_map_t::iterator iter = mSavedValues.begin();
@@ -1572,7 +1769,7 @@ void LLPanelPreference::cancel()
iter != mSavedColors.end(); ++iter)
{
LLColorSwatchCtrl* color_swatch = findChild<LLColorSwatchCtrl>(iter->first);
- if(color_swatch)
+ if (color_swatch)
{
color_swatch->set(iter->second);
color_swatch->onCommit();
@@ -1589,7 +1786,61 @@ void LLPanelPreference::setControlFalse(const LLSD& user_data)
control->set(LLSD(FALSE));
}
+void LLPanelPreference::updateMediaAutoPlayCheckbox(LLUICtrl* ctrl)
+{
+ std::string name = ctrl->getName();
+
+ // Disable "Allow Media to auto play" only when both
+ // "Streaming Music" and "Media" are unchecked. STORM-513.
+ if ((name == "enable_music") || (name == "enable_media"))
+ {
+ bool music_enabled = getChild<LLCheckBoxCtrl>("enable_music")->get();
+ bool media_enabled = getChild<LLCheckBoxCtrl>("enable_media")->get();
+
+ getChild<LLCheckBoxCtrl>("media_auto_play_btn")->setEnabled(music_enabled || media_enabled);
+ }
+}
+
+class LLPanelPreferencePrivacy : public LLPanelPreference
+{
+public:
+ LLPanelPreferencePrivacy()
+ {
+ mAccountIndependentSettings.push_back("VoiceCallsFriendsOnly");
+ mAccountIndependentSettings.push_back("AutoDisengageMic");
+ }
+
+ /*virtual*/ void saveSettings()
+ {
+ LLPanelPreference::saveSettings();
+
+ // Don't save (=erase from the saved values map) per-account privacy settings
+ // if we're not logged in, otherwise they will be reset to defaults on log off.
+ if (LLStartUp::getStartupState() != STATE_STARTED)
+ {
+ // Erase only common settings, assuming there are no color settings on Privacy page.
+ for (control_values_map_t::iterator it = mSavedValues.begin(); it != mSavedValues.end(); )
+ {
+ const std::string setting = it->first->getName();
+ if (std::find(mAccountIndependentSettings.begin(),
+ mAccountIndependentSettings.end(), setting) == mAccountIndependentSettings.end())
+ {
+ mSavedValues.erase(it++);
+ }
+ else
+ {
+ ++it;
+ }
+ }
+ }
+ }
+
+private:
+ std::list<std::string> mAccountIndependentSettings;
+};
+
static LLRegisterPanelClassWrapper<LLPanelPreferenceGraphics> t_pref_graph("panel_preference_graphics");
+static LLRegisterPanelClassWrapper<LLPanelPreferencePrivacy> t_pref_privacy("panel_preference_privacy");
BOOL LLPanelPreferenceGraphics::postBuild()
{
@@ -1601,12 +1852,11 @@ void LLPanelPreferenceGraphics::draw()
LLButton* button_apply = findChild<LLButton>("Apply");
- if(button_apply && button_apply->getVisible())
+ if (button_apply && button_apply->getVisible())
{
bool enable = hasDirtyChilds();
button_apply->setEnabled(enable);
-
}
}
bool LLPanelPreferenceGraphics::hasDirtyChilds()
@@ -1622,7 +1872,7 @@ bool LLPanelPreferenceGraphics::hasDirtyChilds()
LLUICtrl* ctrl = dynamic_cast<LLUICtrl*>(curview);
if (ctrl)
{
- if(ctrl->isDirty())
+ if (ctrl->isDirty())
return true;
}
// Push children onto the end of the work stack
@@ -1678,3 +1928,187 @@ void LLPanelPreferenceGraphics::setHardwareDefaults()
resetDirtyChilds();
LLPanelPreference::setHardwareDefaults();
}
+
+LLFloaterPreferenceProxy::LLFloaterPreferenceProxy(const LLSD& key)
+ : LLFloater(key),
+ mSocksSettingsDirty(false)
+{
+ mCommitCallbackRegistrar.add("Proxy.OK", boost::bind(&LLFloaterPreferenceProxy::onBtnOk, this));
+ mCommitCallbackRegistrar.add("Proxy.Cancel", boost::bind(&LLFloaterPreferenceProxy::onBtnCancel, this));
+ mCommitCallbackRegistrar.add("Proxy.Change", boost::bind(&LLFloaterPreferenceProxy::onChangeSocksSettings, this));
+}
+
+LLFloaterPreferenceProxy::~LLFloaterPreferenceProxy()
+{
+}
+
+BOOL LLFloaterPreferenceProxy::postBuild()
+{
+ LLRadioGroup* socksAuth = getChild<LLRadioGroup>("socks5_auth_type");
+ if (!socksAuth)
+ {
+ return FALSE;
+ }
+ if (socksAuth->getSelectedValue().asString() == "None")
+ {
+ getChild<LLLineEditor>("socks5_username")->setEnabled(false);
+ getChild<LLLineEditor>("socks5_password")->setEnabled(false);
+ }
+ else
+ {
+ // Populate the SOCKS 5 credential fields with protected values.
+ LLPointer<LLCredential> socks_cred = gSecAPIHandler->loadCredential("SOCKS5");
+ getChild<LLLineEditor>("socks5_username")->setValue(socks_cred->getIdentifier()["username"].asString());
+ getChild<LLLineEditor>("socks5_password")->setValue(socks_cred->getAuthenticator()["creds"].asString());
+ }
+
+ return TRUE;
+}
+
+void LLFloaterPreferenceProxy::onOpen(const LLSD& key)
+{
+ saveSettings();
+}
+
+void LLFloaterPreferenceProxy::onClose(bool app_quitting)
+{
+ if (mSocksSettingsDirty)
+ {
+
+ // If the user plays with the Socks proxy settings after login, it's only fair we let them know
+ // it will not be updated until next restart.
+ if (LLStartUp::getStartupState()>STATE_LOGIN_WAIT)
+ {
+ LLNotifications::instance().add("ChangeProxySettings", LLSD(), LLSD());
+ mSocksSettingsDirty = false; // we have notified the user now be quiet again
+ }
+ }
+}
+
+void LLFloaterPreferenceProxy::saveSettings()
+{
+ // Save the value of all controls in the hierarchy
+ mSavedValues.clear();
+ std::list<LLView*> view_stack;
+ view_stack.push_back(this);
+ while(!view_stack.empty())
+ {
+ // Process view on top of the stack
+ LLView* curview = view_stack.front();
+ view_stack.pop_front();
+
+ LLUICtrl* ctrl = dynamic_cast<LLUICtrl*>(curview);
+ if (ctrl)
+ {
+ LLControlVariable* control = ctrl->getControlVariable();
+ if (control)
+ {
+ mSavedValues[control] = control->getValue();
+ }
+ }
+
+ // Push children onto the end of the work stack
+ for (child_list_t::const_iterator iter = curview->getChildList()->begin();
+ iter != curview->getChildList()->end(); ++iter)
+ {
+ view_stack.push_back(*iter);
+ }
+ }
+}
+
+void LLFloaterPreferenceProxy::onBtnOk()
+{
+ // commit any outstanding text entry
+ if (hasFocus())
+ {
+ LLUICtrl* cur_focus = dynamic_cast<LLUICtrl*>(gFocusMgr.getKeyboardFocus());
+ if (cur_focus && cur_focus->acceptsTextInput())
+ {
+ cur_focus->onCommit();
+ }
+ }
+
+ // Save SOCKS proxy credentials securely if password auth is enabled
+ LLRadioGroup* socksAuth = getChild<LLRadioGroup>("socks5_auth_type");
+ if (socksAuth->getSelectedValue().asString() == "UserPass")
+ {
+ LLSD socks_id = LLSD::emptyMap();
+ socks_id["type"] = "SOCKS5";
+ socks_id["username"] = getChild<LLLineEditor>("socks5_username")->getValue().asString();
+
+ LLSD socks_authenticator = LLSD::emptyMap();
+ socks_authenticator["type"] = "SOCKS5";
+ socks_authenticator["creds"] = getChild<LLLineEditor>("socks5_password")->getValue().asString();
+
+ // Using "SOCKS5" as the "grid" argument since the same proxy
+ // settings will be used for all grids and because there is no
+ // way to specify the type of credential.
+ LLPointer<LLCredential> socks_cred = gSecAPIHandler->createCredential("SOCKS5", socks_id, socks_authenticator);
+ gSecAPIHandler->saveCredential(socks_cred, true);
+ }
+ else
+ {
+ // Clear SOCKS5 credentials since they are no longer needed.
+ LLPointer<LLCredential> socks_cred = new LLCredential("SOCKS5");
+ gSecAPIHandler->deleteCredential(socks_cred);
+ }
+
+ closeFloater(false);
+}
+
+void LLFloaterPreferenceProxy::onBtnCancel()
+{
+ if (hasFocus())
+ {
+ LLUICtrl* cur_focus = dynamic_cast<LLUICtrl*>(gFocusMgr.getKeyboardFocus());
+ if (cur_focus && cur_focus->acceptsTextInput())
+ {
+ cur_focus->onCommit();
+ }
+ refresh();
+ }
+
+ cancel();
+}
+
+void LLFloaterPreferenceProxy::cancel()
+{
+
+ for (control_values_map_t::iterator iter = mSavedValues.begin();
+ iter != mSavedValues.end(); ++iter)
+ {
+ LLControlVariable* control = iter->first;
+ LLSD ctrl_value = iter->second;
+ control->set(ctrl_value);
+ }
+
+ closeFloater();
+}
+
+void LLFloaterPreferenceProxy::onChangeSocksSettings()
+{
+ mSocksSettingsDirty = true;
+
+ LLRadioGroup* socksAuth = getChild<LLRadioGroup>("socks5_auth_type");
+ if (socksAuth->getSelectedValue().asString() == "None")
+ {
+ getChild<LLLineEditor>("socks5_username")->setEnabled(false);
+ getChild<LLLineEditor>("socks5_password")->setEnabled(false);
+ }
+ else
+ {
+ getChild<LLLineEditor>("socks5_username")->setEnabled(true);
+ getChild<LLLineEditor>("socks5_password")->setEnabled(true);
+ }
+
+ // Check for invalid states for the other HTTP proxy radio
+ LLRadioGroup* otherHttpProxy = getChild<LLRadioGroup>("other_http_proxy_type");
+ if ((otherHttpProxy->getSelectedValue().asString() == "Socks" &&
+ getChild<LLCheckBoxCtrl>("socks_proxy_enabled")->get() == FALSE )||(
+ otherHttpProxy->getSelectedValue().asString() == "Web" &&
+ getChild<LLCheckBoxCtrl>("web_proxy_enabled")->get() == FALSE ) )
+ {
+ otherHttpProxy->selectFirstItem();
+ }
+
+};
diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h
index bb871e7e25..ec5994e917 100644
--- a/indra/newview/llfloaterpreference.h
+++ b/indra/newview/llfloaterpreference.h
@@ -34,6 +34,7 @@
#define LL_LLFLOATERPREFERENCE_H
#include "llfloater.h"
+#include "llavatarpropertiesprocessor.h"
class LLPanelPreference;
class LLPanelLCD;
@@ -55,7 +56,7 @@ typedef enum
// Floater to control preferences (display, audio, bandwidth, general.
-class LLFloaterPreference : public LLFloater
+class LLFloaterPreference : public LLFloater, public LLAvatarPropertiesObserver
{
public:
LLFloaterPreference(const LLSD& key);
@@ -77,13 +78,20 @@ public:
// translate user's busy response message according to current locale if message is default, otherwise do nothing
static void initBusyResponse();
+ void processProperties( void* pData, EAvatarProcessorType type );
+ void processProfileProperties(const LLAvatarData* pAvatarData );
+ void storeAvatarProperties( const LLAvatarData* pAvatarData );
+ void saveAvatarProperties( void );
+
protected:
void onBtnOK();
void onBtnCancel();
void onBtnApply();
- void onClickBrowserClearCache();
+ void onClickClearCache(); // Clear viewer texture cache, vfs, and VO cache on next startup
+ void onClickBrowserClearCache(); // Clear web history and caches as well as viewer caches above
void onLanguageChange();
+ void onNameTagOpacityChange(const LLSD& newvalue);
// set value of "BusyResponseChanged" in account settings depending on whether busy response
// string differs from default after user changes.
@@ -92,18 +100,17 @@ protected:
void onChangeCustom();
void updateMeterText(LLUICtrl* ctrl);
void onOpenHardwareSettings();
- /// callback for defaults
+ // callback for defaults
void setHardwareDefaults();
// callback for when client turns on shaders
void onVertexShaderEnable();
- // callback for changing double click action checkbox
- void onDoubleClickCheckBox(LLUICtrl* ctrl);
- // callback for selecting double click action radio-button
- void onDoubleClickRadio();
- // updates double-click action settings depending on controls from preferences
- void updateDoubleClickSettings();
- // updates double-click action controls depending on values from settings.xml
- void updateDoubleClickControls();
+
+ // callback for commit in the "Single click on land" and "Double click on land" comboboxes.
+ void onClickActionChange();
+ // updates click/double-click action settings depending on controls values
+ void updateClickActionSettings();
+ // updates click/double-click action controls depending on values from settings.xml
+ void updateClickActionControls();
// This function squirrels away the current values of the controls so that
// cancel() can restore them.
@@ -121,6 +128,7 @@ public:
void onClickSetKey();
void setKey(KEY key);
void onClickSetMiddleMouse();
+ void onClickSetSounds();
// void onClickSkipDialogs();
// void onClickResetDialogs();
void onClickEnablePopup();
@@ -147,6 +155,8 @@ public:
void applyResolution();
void onChangeMaturity();
void onClickBlockList();
+ void onClickProxySettings();
+ void onClickTranslationSettings();
void applyUIColor(LLUICtrl* ctrl, const LLSD& param);
void getUIColor(LLUICtrl* ctrl, const LLSD& param);
@@ -154,15 +164,16 @@ public:
static void refreshSkin(void* data);
private:
static std::string sSkin;
- // set true if state of double-click action checkbox or radio-group was changed by user
- // (reset back to false on apply or cancel)
- bool mDoubleClickActionDirty;
+ bool mClickActionDirty; ///< Set to true when the click/double-click options get changed by user.
bool mGotPersonalInfo;
bool mOriginalIMViaEmail;
bool mLanguageChanged;
+ bool mAvatarDataInitialized;
bool mOriginalHideOnlineStatus;
std::string mDirectoryVisibility;
+
+ LLAvatarData mAvatarProperties;
};
class LLPanelPreference : public LLPanel
@@ -171,24 +182,37 @@ public:
LLPanelPreference();
/*virtual*/ BOOL postBuild();
+ virtual ~LLPanelPreference();
+
virtual void apply();
virtual void cancel();
void setControlFalse(const LLSD& user_data);
virtual void setHardwareDefaults(){};
+ // Disables "Allow Media to auto play" check box only when both
+ // "Streaming Music" and "Media" are unchecked. Otherwise enables it.
+ void updateMediaAutoPlayCheckbox(LLUICtrl* ctrl);
+
// This function squirrels away the current values of the controls so that
// cancel() can restore them.
virtual void saveSettings();
-private:
- //for "Only friends and groups can call or IM me"
- static void showFriendsOnlyWarning(LLUICtrl*, const LLSD&);
+ class Updater;
+protected:
typedef std::map<LLControlVariable*, LLSD> control_values_map_t;
control_values_map_t mSavedValues;
+private:
+ //for "Only friends and groups can call or IM me"
+ static void showFriendsOnlyWarning(LLUICtrl*, const LLSD&);
+ //for "Show my Favorite Landmarks at Login"
+ static void showFavoritesOnLoginWarning(LLUICtrl* checkbox, const LLSD& value);
+
typedef std::map<std::string, LLColor4> string_color_map_t;
string_color_map_t mSavedColors;
+
+ Updater* mBandWidthUpdater;
};
class LLPanelPreferenceGraphics : public LLPanelPreference
@@ -206,4 +230,33 @@ protected:
};
+class LLFloaterPreferenceProxy : public LLFloater
+{
+public:
+ LLFloaterPreferenceProxy(const LLSD& key);
+ ~LLFloaterPreferenceProxy();
+
+ /// show off our menu
+ static void show();
+ void cancel();
+
+protected:
+ BOOL postBuild();
+ void onOpen(const LLSD& key);
+ void onClose(bool app_quitting);
+ void saveSettings();
+ void onBtnOk();
+ void onBtnCancel();
+
+ void onChangeSocksSettings();
+
+private:
+
+ bool mSocksSettingsDirty;
+ typedef std::map<LLControlVariable*, LLSD> control_values_map_t;
+ control_values_map_t mSavedValues;
+
+};
+
+
#endif // LL_LLPREFERENCEFLOATER_H
diff --git a/indra/newview/llfloaterproperties.cpp b/indra/newview/llfloaterproperties.cpp
index dd12fa64d3..3f00ba39c7 100644
--- a/indra/newview/llfloaterproperties.cpp
+++ b/indra/newview/llfloaterproperties.cpp
@@ -887,18 +887,14 @@ void LLFloaterProperties::dirtyAll()
LLMultiProperties::LLMultiProperties()
: LLMultiFloater(LLSD())
{
- // *TODO: There should be a .xml file for this
- const LLRect& nextrect = LLFloaterReg::getFloaterRect("properties"); // place where the next properties should show up
- if (nextrect.getWidth() > 0)
- {
- setRect(nextrect);
- }
- else
- {
- // start with a small rect in the top-left corner ; will get resized
- LLRect rect;
- rect.setLeftTopAndSize(0, gViewerWindow->getWindowHeightScaled(), 20, 20);
- setRect(rect);
+ // start with a small rect in the top-left corner ; will get resized
+ LLRect rect;
+ rect.setLeftTopAndSize(0, gViewerWindow->getWindowHeightScaled(), 20, 20);
+ setRect(rect);
+ LLFloater* last_floater = LLFloaterReg::getLastFloaterInGroup("properties");
+ if (last_floater)
+ {
+ stackWith(*last_floater);
}
setTitle(LLTrans::getString("MultiPropertiesTitle"));
buildTabContainer();
diff --git a/indra/newview/llfloaterregiondebugconsole.cpp b/indra/newview/llfloaterregiondebugconsole.cpp
index b3b7645dd4..c7fab2573f 100644
--- a/indra/newview/llfloaterregiondebugconsole.cpp
+++ b/indra/newview/llfloaterregiondebugconsole.cpp
@@ -3,31 +3,25 @@
* @author Brad Kittenbrink <brad@lindenlab.com>
* @brief Quick and dirty console for region debug settings
*
- * $LicenseInfo:firstyear=2010&license=viewergpl$
- *
- * Copyright (c) 2010-2010, Linden Research, Inc.
- *
+ * $LicenseInfo:firstyear=2010&license=viewerlgpl$
* Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
*
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
*
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
@@ -64,8 +58,6 @@ namespace
{
// Signal used to notify the floater of responses from the asynchronous
// API.
- typedef boost::signals2::signal<
- void (const std::string& output)> console_reply_signal_t;
console_reply_signal_t sConsoleReplySignal;
const std::string PROMPT("\n\n> ");
@@ -138,6 +130,11 @@ namespace
};
}
+boost::signals2::connection LLFloaterRegionDebugConsole::setConsoleReplyCallback(const console_reply_signal_t::slot_type& cb)
+{
+ return sConsoleReplySignal.connect(cb);
+}
+
LLFloaterRegionDebugConsole::LLFloaterRegionDebugConsole(LLSD const & key)
: LLFloater(key), mOutput(NULL)
{
diff --git a/indra/newview/llfloaterregiondebugconsole.h b/indra/newview/llfloaterregiondebugconsole.h
index 4171a4da6b..fd3af4152e 100644
--- a/indra/newview/llfloaterregiondebugconsole.h
+++ b/indra/newview/llfloaterregiondebugconsole.h
@@ -3,31 +3,25 @@
* @author Brad Kittenbrink <brad@lindenlab.com>
* @brief Quick and dirty console for region debug settings
*
- * $LicenseInfo:firstyear=2010&license=viewergpl$
- *
- * Copyright (c) 2010-2010, Linden Research, Inc.
- *
+ * $LicenseInfo:firstyear=2010&license=viewerlgpl$
* Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
*
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
*
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
@@ -41,6 +35,9 @@
class LLTextEditor;
+typedef boost::signals2::signal<
+ void (const std::string& output)> console_reply_signal_t;
+
class LLFloaterRegionDebugConsole : public LLFloater, public LLHTTPClient::Responder
{
public:
@@ -54,6 +51,8 @@ public:
LLTextEditor * mOutput;
+ static boost::signals2::connection setConsoleReplyCallback(const console_reply_signal_t::slot_type& cb);
+
private:
void onReplyReceived(const std::string& output);
diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp
index 7792b3fb40..17850ff35d 100644
--- a/indra/newview/llfloaterregioninfo.cpp
+++ b/indra/newview/llfloaterregioninfo.cpp
@@ -40,6 +40,10 @@
#include "llxfermanager.h"
#include "indra_constants.h"
#include "message.h"
+#include "llloadingindicator.h"
+#include "llradiogroup.h"
+#include "llsd.h"
+#include "llsdserialize.h"
#include "llagent.h"
#include "llappviewer.h"
@@ -48,18 +52,22 @@
#include "llbutton.h"
#include "llcheckboxctrl.h"
#include "llcombobox.h"
+#include "lldaycyclemanager.h"
+#include "llenvmanager.h"
+#include "llestateinfomodel.h"
#include "llfilepicker.h"
#include "llfloatergodtools.h" // for send_sim_wide_deletes()
#include "llfloatertopobjects.h" // added to fix SL-32336
#include "llfloatergroups.h"
#include "llfloaterreg.h"
+#include "llfloaterregiondebugconsole.h"
#include "llfloatertelehub.h"
-#include "llfloaterwindlight.h"
#include "llinventorymodel.h"
#include "lllineeditor.h"
#include "llnamelistctrl.h"
#include "llnotifications.h"
#include "llnotificationsutil.h"
+#include "llregioninfomodel.h"
#include "llscrolllistitem.h"
#include "llsliderctrl.h"
#include "llslurl.h"
@@ -79,12 +87,16 @@
#include "llviewertexteditor.h"
#include "llviewerwindow.h"
#include "llvlcomposition.h"
+#include "llwaterparammanager.h"
#include "lltrans.h"
#include "llagentui.h"
+#include "llmeshrepository.h"
const S32 TERRAIN_TEXTURE_COUNT = 4;
const S32 CORNER_COUNT = 4;
+#define TMP_DISABLE_WLES // STORM-1180
+
///----------------------------------------------------------------------------
/// Local class declaration
///----------------------------------------------------------------------------
@@ -159,32 +171,32 @@ bool estate_dispatch_initialized = false;
//S32 LLFloaterRegionInfo::sRequestSerial = 0;
LLUUID LLFloaterRegionInfo::sRequestInvoice;
+
LLFloaterRegionInfo::LLFloaterRegionInfo(const LLSD& seed)
: LLFloater(seed)
-{
-}
+{}
BOOL LLFloaterRegionInfo::postBuild()
{
mTab = getChild<LLTabContainer>("region_panels");
+ mTab->setCommitCallback(boost::bind(&LLFloaterRegionInfo::onTabSelected, this, _2));
// contruct the panels
LLPanelRegionInfo* panel;
- panel = new LLPanelRegionGeneralInfo;
+ panel = new LLPanelEstateInfo;
mInfoPanels.push_back(panel);
- panel->getCommitCallbackRegistrar().add("RegionInfo.ManageTelehub", boost::bind(&LLPanelRegionInfo::onClickManageTelehub, panel));
-
- panel->buildFromFile("panel_region_general.xml");
+ panel->buildFromFile("panel_region_estate.xml");
mTab->addTabPanel(LLTabContainer::TabPanelParams().panel(panel).select_tab(true));
- panel = new LLPanelRegionDebugInfo;
+ panel = new LLPanelEstateCovenant;
mInfoPanels.push_back(panel);
- panel->buildFromFile("panel_region_debug.xml");
+ panel->buildFromFile("panel_region_covenant.xml");
mTab->addTabPanel(panel);
- panel = new LLPanelRegionTextureInfo;
+ panel = new LLPanelRegionGeneralInfo;
mInfoPanels.push_back(panel);
- panel->buildFromFile("panel_region_texture.xml");
+ panel->getCommitCallbackRegistrar().add("RegionInfo.ManageTelehub", boost::bind(&LLPanelRegionInfo::onClickManageTelehub, panel));
+ panel->buildFromFile("panel_region_general.xml");
mTab->addTabPanel(panel);
panel = new LLPanelRegionTerrainInfo;
@@ -192,31 +204,34 @@ BOOL LLFloaterRegionInfo::postBuild()
panel->buildFromFile("panel_region_terrain.xml");
mTab->addTabPanel(panel);
- panel = new LLPanelEstateInfo;
+ panel = new LLPanelEnvironmentInfo;
mInfoPanels.push_back(panel);
- panel->buildFromFile("panel_region_estate.xml");
+ panel->buildFromFile("panel_region_environment.xml");
mTab->addTabPanel(panel);
- panel = new LLPanelEstateCovenant;
+ panel = new LLPanelRegionDebugInfo;
mInfoPanels.push_back(panel);
- panel->buildFromFile("panel_region_covenant.xml");
+ panel->buildFromFile("panel_region_debug.xml");
mTab->addTabPanel(panel);
gMessageSystem->setHandlerFunc(
"EstateOwnerMessage",
&processEstateOwnerRequest);
+ // Request region info when agent region changes.
+ LLEnvManagerNew::instance().setRegionChangeCallback(boost::bind(&LLFloaterRegionInfo::requestRegionInfo, this));
+
return TRUE;
}
LLFloaterRegionInfo::~LLFloaterRegionInfo()
-{
-}
+{}
void LLFloaterRegionInfo::onOpen(const LLSD& key)
{
refreshFromRegion(gAgent.getRegion());
requestRegionInfo();
+ requestMeshRezInfo();
}
// static
@@ -282,17 +297,25 @@ void LLFloaterRegionInfo::processRegionInfo(LLMessageSystem* msg)
{
LLPanel* panel;
LLFloaterRegionInfo* floater = LLFloaterReg::getTypedInstance<LLFloaterRegionInfo>("region_info");
- llinfos << "LLFloaterRegionInfo::processRegionInfo" << llendl;
if(!floater)
{
return;
}
+
+ // We need to re-request environment setting here,
+ // otherwise after we apply (send) updated region settings we won't get them back,
+ // so our environment won't be updated.
+ // This is also the way to know about externally changed region environment.
+ LLEnvManagerNew::instance().requestRegionSettings();
LLTabContainer* tab = floater->getChild<LLTabContainer>("region_panels");
LLViewerRegion* region = gAgent.getRegion();
BOOL allow_modify = gAgent.isGodlike() || (region && region->canManageEstate());
+ // *TODO: Replace parsing msg with accessing the region info model.
+ LLRegionInfoModel& region_info = LLRegionInfoModel::instance();
+
// extract message
std::string sim_name;
std::string sim_type = LLTrans::getString("land_type_unknown");
@@ -322,6 +345,7 @@ void LLFloaterRegionInfo::processRegionInfo(LLMessageSystem* msg)
msg->getSize("RegionInfo2", "ProductName") > 0)
{
msg->getString("RegionInfo2", "ProductName", sim_type);
+ LLTrans::findString(sim_type, sim_type); // try localizing sim product name
}
// GENERAL PANEL
@@ -364,15 +388,10 @@ void LLFloaterRegionInfo::processRegionInfo(LLMessageSystem* msg)
panel = tab->getChild<LLPanel>("Terrain");
panel->getChild<LLUICtrl>("region_text")->setValue(LLSD(sim_name));
- panel->getChild<LLUICtrl>("water_height_spin")->setValue(LLSD(water_height));
- panel->getChild<LLUICtrl>("terrain_raise_spin")->setValue(LLSD(terrain_raise_limit));
- panel->getChild<LLUICtrl>("terrain_lower_spin")->setValue(LLSD(terrain_lower_limit));
- panel->getChild<LLUICtrl>("use_estate_sun_check")->setValue(LLSD(use_estate_sun));
-
- panel->getChild<LLUICtrl>("fixed_sun_check")->setValue(LLSD((BOOL)(region_flags & REGION_FLAGS_SUN_FIXED)));
- panel->getChildView("fixed_sun_check")->setEnabled(allow_modify && !use_estate_sun);
- panel->getChild<LLUICtrl>("sun_hour_slider")->setValue(LLSD(sun_hour));
- panel->getChildView("sun_hour_slider")->setEnabled(allow_modify && !use_estate_sun);
+ panel->getChild<LLUICtrl>("water_height_spin")->setValue(region_info.mWaterHeight);
+ panel->getChild<LLUICtrl>("terrain_raise_spin")->setValue(region_info.mTerrainRaiseLimit);
+ panel->getChild<LLUICtrl>("terrain_lower_spin")->setValue(region_info.mTerrainLowerLimit);
+
panel->setCtrlsEnabled(allow_modify);
floater->refreshFromRegion( gAgent.getRegion() );
@@ -398,6 +417,29 @@ LLPanelEstateCovenant* LLFloaterRegionInfo::getPanelCovenant()
return panel;
}
+// static
+LLPanelRegionTerrainInfo* LLFloaterRegionInfo::getPanelRegionTerrain()
+{
+ LLFloaterRegionInfo* floater = LLFloaterReg::getTypedInstance<LLFloaterRegionInfo>("region_info");
+ if (!floater)
+ {
+ llassert(floater);
+ return NULL;
+ }
+
+ LLTabContainer* tab_container = floater->getChild<LLTabContainer>("region_panels");
+ LLPanelRegionTerrainInfo* panel =
+ dynamic_cast<LLPanelRegionTerrainInfo*>(tab_container->getChild<LLPanel>("Terrain"));
+ llassert(panel);
+ return panel;
+}
+
+void LLFloaterRegionInfo::onTabSelected(const LLSD& param)
+{
+ LLPanel* active_panel = getChild<LLPanel>(param.asString());
+ active_panel->onOpen(LLSD());
+}
+
void LLFloaterRegionInfo::refreshFromRegion(LLViewerRegion* region)
{
if (!region)
@@ -478,8 +520,13 @@ void LLPanelRegionInfo::onChangeText(LLLineEditor* caller, void* user_data)
// virtual
BOOL LLPanelRegionInfo::postBuild()
{
- getChild<LLUICtrl>("apply_btn")->setCommitCallback(boost::bind(&LLPanelRegionInfo::onBtnSet, this));
- getChildView("apply_btn")->setEnabled(FALSE);
+ // If the panel has an Apply button, set a callback for it.
+ LLUICtrl* apply_btn = findChild<LLUICtrl>("apply_btn");
+ if (apply_btn)
+ {
+ apply_btn->setCommitCallback(boost::bind(&LLPanelRegionInfo::onBtnSet, this));
+ }
+
refresh();
return TRUE;
}
@@ -531,12 +578,14 @@ void LLPanelRegionInfo::sendEstateOwnerMessage(
void LLPanelRegionInfo::enableButton(const std::string& btn_name, BOOL enable)
{
- getChildView(btn_name)->setEnabled(enable);
+ LLView* button = findChildView(btn_name);
+ if (button) button->setEnabled(enable);
}
void LLPanelRegionInfo::disableButton(const std::string& btn_name)
{
- getChildView(btn_name)->setEnabled(FALSE);
+ LLView* button = findChildView(btn_name);
+ if (button) button->setEnabled(FALSE);
}
void LLPanelRegionInfo::initCtrl(const std::string& name)
@@ -601,7 +650,10 @@ void LLPanelRegionGeneralInfo::onClickKick()
// in order to set up floater dependency
LLFloater* parent_floater = gFloaterView->getParentFloater(this);
LLFloater* child_floater = LLFloaterAvatarPicker::show(boost::bind(&LLPanelRegionGeneralInfo::onKickCommit, this, _1), FALSE, TRUE);
- parent_floater->addDependentFloater(child_floater);
+ if (child_floater)
+ {
+ parent_floater->addDependentFloater(child_floater);
+ }
}
void LLPanelRegionGeneralInfo::onKickCommit(const uuid_vec_t& ids)
@@ -691,7 +743,42 @@ bool LLPanelRegionGeneralInfo::onMessageCommit(const LLSD& notification, const L
return false;
}
+class ConsoleRequestResponder : public LLHTTPClient::Responder
+{
+public:
+ /*virtual*/
+ void error(U32 status, const std::string& reason)
+ {
+ llwarns << "requesting mesh_rez_enabled failed" << llendl;
+ }
+};
+
+// called if this request times out.
+class ConsoleUpdateResponder : public LLHTTPClient::Responder
+{
+public:
+ /* virtual */
+ void error(U32 status, const std::string& reason)
+ {
+ llwarns << "Updating mesh enabled region setting failed" << llendl;
+ }
+};
+
+void LLFloaterRegionInfo::requestMeshRezInfo()
+{
+ std::string sim_console_url = gAgent.getRegion()->getCapability("SimConsoleAsync");
+
+ if (!sim_console_url.empty())
+ {
+ std::string request_str = "get mesh_rez_enabled";
+
+ LLHTTPClient::post(
+ sim_console_url,
+ LLSD(request_str),
+ new ConsoleRequestResponder);
+ }
+}
// setregioninfo
// strings[0] = 'Y' - block terraform, 'N' - not
@@ -967,131 +1054,7 @@ void LLPanelRegionDebugInfo::onClickCancelRestart(void* data)
}
-/////////////////////////////////////////////////////////////////////////////
-// LLPanelRegionTextureInfo
-//
-LLPanelRegionTextureInfo::LLPanelRegionTextureInfo() : LLPanelRegionInfo()
-{
- // nothing.
-}
-
-bool LLPanelRegionTextureInfo::refreshFromRegion(LLViewerRegion* region)
-{
- BOOL allow_modify = gAgent.isGodlike() || (region && region->canManageEstate());
- setCtrlsEnabled(allow_modify);
- getChildView("apply_btn")->setEnabled(FALSE);
-
- if (region)
- {
- getChild<LLUICtrl>("region_text")->setValue(LLSD(region->getName()));
- }
- else
- {
- getChild<LLUICtrl>("region_text")->setValue(LLSD(""));
- }
-
- if (!region) return LLPanelRegionInfo::refreshFromRegion(region);
-
- LLVLComposition* compp = region->getComposition();
- LLTextureCtrl* texture_ctrl;
- std::string buffer;
- for(S32 i = 0; i < TERRAIN_TEXTURE_COUNT; ++i)
- {
- buffer = llformat("texture_detail_%d", i);
- texture_ctrl = getChild<LLTextureCtrl>(buffer);
- if(texture_ctrl)
- {
- lldebugs << "Detail Texture " << i << ": "
- << compp->getDetailTextureID(i) << llendl;
- LLUUID tmp_id(compp->getDetailTextureID(i));
- texture_ctrl->setImageAssetID(tmp_id);
- }
- }
-
- for(S32 i = 0; i < CORNER_COUNT; ++i)
- {
- buffer = llformat("height_start_spin_%d", i);
- getChild<LLUICtrl>(buffer)->setValue(LLSD(compp->getStartHeight(i)));
- buffer = llformat("height_range_spin_%d", i);
- getChild<LLUICtrl>(buffer)->setValue(LLSD(compp->getHeightRange(i)));
- }
-
- // Call the parent for common book-keeping
- return LLPanelRegionInfo::refreshFromRegion(region);
-}
-
-
-BOOL LLPanelRegionTextureInfo::postBuild()
-{
- LLPanelRegionInfo::postBuild();
- std::string buffer;
- for(S32 i = 0; i < TERRAIN_TEXTURE_COUNT; ++i)
- {
- buffer = llformat("texture_detail_%d", i);
- initCtrl(buffer);
- }
-
- for(S32 i = 0; i < CORNER_COUNT; ++i)
- {
- buffer = llformat("height_start_spin_%d", i);
- initCtrl(buffer);
- buffer = llformat("height_range_spin_%d", i);
- initCtrl(buffer);
- }
-
-// LLButton* btn = ("dump", LLRect(0, 20, 100, 0), "", onClickDump, this);
-// btn->setFollows(FOLLOWS_TOP|FOLLOWS_LEFT);
-// addChild(btn);
-
- return LLPanelRegionInfo::postBuild();
-}
-
-BOOL LLPanelRegionTextureInfo::sendUpdate()
-{
- llinfos << "LLPanelRegionTextureInfo::sendUpdate()" << llendl;
-
- // Make sure user hasn't chosen wacky textures.
- if (!validateTextureSizes())
- {
- return FALSE;
- }
-
- LLTextureCtrl* texture_ctrl;
- std::string buffer;
- std::string id_str;
- LLMessageSystem* msg = gMessageSystem;
- strings_t strings;
-
- LLUUID invoice(LLFloaterRegionInfo::getLastInvoice());
-
- for(S32 i = 0; i < TERRAIN_TEXTURE_COUNT; ++i)
- {
- buffer = llformat("texture_detail_%d", i);
- texture_ctrl = getChild<LLTextureCtrl>(buffer);
- if(texture_ctrl)
- {
- LLUUID tmp_id(texture_ctrl->getImageAssetID());
- tmp_id.toString(id_str);
- buffer = llformat("%d %s", i, id_str.c_str());
- strings.push_back(buffer);
- }
- }
- sendEstateOwnerMessage(msg, "texturedetail", invoice, strings);
- strings.clear();
- for(S32 i = 0; i < CORNER_COUNT; ++i)
- {
- buffer = llformat("height_start_spin_%d", i);
- std::string buffer2 = llformat("height_range_spin_%d", i);
- std::string buffer3 = llformat("%d %f %f", i, (F32)getChild<LLUICtrl>(buffer)->getValue().asReal(), (F32)getChild<LLUICtrl>(buffer2)->getValue().asReal());
- strings.push_back(buffer3);
- }
- sendEstateOwnerMessage(msg, "textureheights", invoice, strings);
- strings.clear();
- sendEstateOwnerMessage(msg, "texturecommit", invoice, strings);
- return TRUE;
-}
-
-BOOL LLPanelRegionTextureInfo::validateTextureSizes()
+BOOL LLPanelRegionTerrainInfo::validateTextureSizes()
{
for(S32 i = 0; i < TERRAIN_TEXTURE_COUNT; ++i)
{
@@ -1134,49 +1097,86 @@ BOOL LLPanelRegionTextureInfo::validateTextureSizes()
return TRUE;
}
-
-// static
-void LLPanelRegionTextureInfo::onClickDump(void* data)
-{
- llinfos << "LLPanelRegionTextureInfo::onClickDump()" << llendl;
-}
-
-
/////////////////////////////////////////////////////////////////////////////
// LLPanelRegionTerrainInfo
/////////////////////////////////////////////////////////////////////////////
+// Initialize statics
+
BOOL LLPanelRegionTerrainInfo::postBuild()
{
LLPanelRegionInfo::postBuild();
-
+
initCtrl("water_height_spin");
initCtrl("terrain_raise_spin");
initCtrl("terrain_lower_spin");
- initCtrl("fixed_sun_check");
- getChild<LLUICtrl>("fixed_sun_check")->setCommitCallback(boost::bind(&LLPanelRegionTerrainInfo::onChangeFixedSun, this));
- getChild<LLUICtrl>("use_estate_sun_check")->setCommitCallback(boost::bind(&LLPanelRegionTerrainInfo::onChangeUseEstateTime, this));
- getChild<LLUICtrl>("sun_hour_slider")->setCommitCallback(boost::bind(&LLPanelRegionTerrainInfo::onChangeSunHour, this));
+ std::string buffer;
+ for(S32 i = 0; i < TERRAIN_TEXTURE_COUNT; ++i)
+ {
+ buffer = llformat("texture_detail_%d", i);
+ initCtrl(buffer);
+ }
+
+ for(S32 i = 0; i < CORNER_COUNT; ++i)
+ {
+ buffer = llformat("height_start_spin_%d", i);
+ initCtrl(buffer);
+ buffer = llformat("height_range_spin_%d", i);
+ initCtrl(buffer);
+ }
childSetAction("download_raw_btn", onClickDownloadRaw, this);
childSetAction("upload_raw_btn", onClickUploadRaw, this);
childSetAction("bake_terrain_btn", onClickBakeTerrain, this);
- return TRUE;
+ return LLPanelRegionInfo::postBuild();
}
// virtual
bool LLPanelRegionTerrainInfo::refreshFromRegion(LLViewerRegion* region)
{
- llinfos << "LLPanelRegionTerrainInfo::refreshFromRegion" << llendl;
-
BOOL owner_or_god = gAgent.isGodlike()
|| (region && (region->getOwner() == gAgent.getID()));
BOOL owner_or_god_or_manager = owner_or_god
|| (region && region->isEstateManager());
setCtrlsEnabled(owner_or_god_or_manager);
+
getChildView("apply_btn")->setEnabled(FALSE);
+ if (region)
+ {
+ getChild<LLUICtrl>("region_text")->setValue(LLSD(region->getName()));
+
+ LLVLComposition* compp = region->getComposition();
+ LLTextureCtrl* texture_ctrl;
+ std::string buffer;
+ for(S32 i = 0; i < TERRAIN_TEXTURE_COUNT; ++i)
+ {
+ buffer = llformat("texture_detail_%d", i);
+ texture_ctrl = getChild<LLTextureCtrl>(buffer);
+ if(texture_ctrl)
+ {
+ lldebugs << "Detail Texture " << i << ": "
+ << compp->getDetailTextureID(i) << llendl;
+ LLUUID tmp_id(compp->getDetailTextureID(i));
+ texture_ctrl->setImageAssetID(tmp_id);
+ }
+ }
+
+ for(S32 i = 0; i < CORNER_COUNT; ++i)
+ {
+ buffer = llformat("height_start_spin_%d", i);
+ getChild<LLUICtrl>(buffer)->setValue(LLSD(compp->getStartHeight(i)));
+ buffer = llformat("height_range_spin_%d", i);
+ getChild<LLUICtrl>(buffer)->setValue(LLSD(compp->getHeightRange(i)));
+ }
+ }
+ else
+ {
+ lldebugs << "no region set" << llendl;
+ getChild<LLUICtrl>("region_text")->setValue(LLSD(""));
+ }
+
getChildView("download_raw_btn")->setEnabled(owner_or_god);
getChildView("upload_raw_btn")->setEnabled(owner_or_god);
getChildView("bake_terrain_btn")->setEnabled(owner_or_god);
@@ -1184,6 +1184,7 @@ bool LLPanelRegionTerrainInfo::refreshFromRegion(LLViewerRegion* region)
return LLPanelRegionInfo::refreshFromRegion(region);
}
+
// virtual
BOOL LLPanelRegionTerrainInfo::sendUpdate()
{
@@ -1192,76 +1193,62 @@ BOOL LLPanelRegionTerrainInfo::sendUpdate()
strings_t strings;
LLUUID invoice(LLFloaterRegionInfo::getLastInvoice());
- buffer = llformat("%f", (F32)getChild<LLUICtrl>("water_height_spin")->getValue().asReal());
- strings.push_back(buffer);
- buffer = llformat("%f", (F32)getChild<LLUICtrl>("terrain_raise_spin")->getValue().asReal());
- strings.push_back(buffer);
- buffer = llformat("%f", (F32)getChild<LLUICtrl>("terrain_lower_spin")->getValue().asReal());
- strings.push_back(buffer);
- buffer = llformat("%s", (getChild<LLUICtrl>("use_estate_sun_check")->getValue().asBoolean() ? "Y" : "N"));
- strings.push_back(buffer);
- buffer = llformat("%s", (getChild<LLUICtrl>("fixed_sun_check")->getValue().asBoolean() ? "Y" : "N"));
- strings.push_back(buffer);
- buffer = llformat("%f", (F32)getChild<LLUICtrl>("sun_hour_slider")->getValue().asReal() );
- strings.push_back(buffer);
-
- // Grab estate information in case the user decided to set the
- // region back to estate time. JC
- LLFloaterRegionInfo* floater = LLFloaterReg::getTypedInstance<LLFloaterRegionInfo>("region_info");
- if (!floater) return true;
-
- LLTabContainer* tab = floater->getChild<LLTabContainer>("region_panels");
- if (!tab) return true;
+ // update the model
+ LLRegionInfoModel& region_info = LLRegionInfoModel::instance();
+ region_info.mWaterHeight = (F32) getChild<LLUICtrl>("water_height_spin")->getValue().asReal();
+ region_info.mTerrainRaiseLimit = (F32) getChild<LLUICtrl>("terrain_raise_spin")->getValue().asReal();
+ region_info.mTerrainLowerLimit = (F32) getChild<LLUICtrl>("terrain_lower_spin")->getValue().asReal();
- LLPanelEstateInfo* panel = (LLPanelEstateInfo*)tab->getChild<LLPanel>("Estate");
- if (!panel) return true;
+ // and sync the region with it
+ region_info.sendRegionTerrain(invoice);
+
+ // =======================================
+ // Assemble and send texturedetail message
- BOOL estate_global_time = panel->getGlobalTime();
- BOOL estate_fixed_sun = panel->getFixedSun();
- F32 estate_sun_hour;
- if (estate_global_time)
+ // Make sure user hasn't chosen wacky textures.
+ if (!validateTextureSizes())
{
- estate_sun_hour = 0.f;
+ return FALSE;
}
- else
+
+ LLTextureCtrl* texture_ctrl;
+ std::string id_str;
+ LLMessageSystem* msg = gMessageSystem;
+
+ for(S32 i = 0; i < TERRAIN_TEXTURE_COUNT; ++i)
{
- estate_sun_hour = panel->getSunHour();
+ buffer = llformat("texture_detail_%d", i);
+ texture_ctrl = getChild<LLTextureCtrl>(buffer);
+ if(texture_ctrl)
+ {
+ LLUUID tmp_id(texture_ctrl->getImageAssetID());
+ tmp_id.toString(id_str);
+ buffer = llformat("%d %s", i, id_str.c_str());
+ strings.push_back(buffer);
+ }
}
+ sendEstateOwnerMessage(msg, "texturedetail", invoice, strings);
+ strings.clear();
- buffer = llformat("%s", (estate_global_time ? "Y" : "N") );
- strings.push_back(buffer);
- buffer = llformat("%s", (estate_fixed_sun ? "Y" : "N") );
- strings.push_back(buffer);
- buffer = llformat("%f", estate_sun_hour);
- strings.push_back(buffer);
-
- sendEstateOwnerMessage(gMessageSystem, "setregionterrain", invoice, strings);
- return TRUE;
-}
+ // ========================================
+ // Assemble and send textureheights message
-void LLPanelRegionTerrainInfo::onChangeUseEstateTime()
-{
- BOOL use_estate_sun = getChild<LLUICtrl>("use_estate_sun_check")->getValue().asBoolean();
- getChildView("fixed_sun_check")->setEnabled(!use_estate_sun);
- getChildView("sun_hour_slider")->setEnabled(!use_estate_sun);
- if (use_estate_sun)
+ for(S32 i = 0; i < CORNER_COUNT; ++i)
{
- getChild<LLUICtrl>("fixed_sun_check")->setValue(LLSD(FALSE));
- getChild<LLUICtrl>("sun_hour_slider")->setValue(LLSD(0.f));
+ buffer = llformat("height_start_spin_%d", i);
+ std::string buffer2 = llformat("height_range_spin_%d", i);
+ std::string buffer3 = llformat("%d %f %f", i, (F32)getChild<LLUICtrl>(buffer)->getValue().asReal(), (F32)getChild<LLUICtrl>(buffer2)->getValue().asReal());
+ strings.push_back(buffer3);
}
- getChildView("apply_btn")->setEnabled(TRUE);
-}
+ sendEstateOwnerMessage(msg, "textureheights", invoice, strings);
+ strings.clear();
-void LLPanelRegionTerrainInfo::onChangeFixedSun()
-{
- // Just enable the apply button. We let the sun-hour slider be enabled
- // for both fixed-sun and non-fixed-sun. JC
- getChildView("apply_btn")->setEnabled(TRUE);
-}
+ // ========================================
+ // Send texturecommit message
-void LLPanelRegionTerrainInfo::onChangeSunHour()
-{
- getChildView("apply_btn")->setEnabled(TRUE);
+ sendEstateOwnerMessage(msg, "texturecommit", invoice, strings);
+
+ return TRUE;
}
// static
@@ -1321,6 +1308,7 @@ bool LLPanelRegionTerrainInfo::callbackBakeTerrain(const LLSD& notification, con
strings.push_back("bake");
LLUUID invoice(LLFloaterRegionInfo::getLastInvoice());
sendEstateOwnerMessage(gMessageSystem, "terrain", invoice, strings);
+
return false;
}
@@ -1332,6 +1320,9 @@ LLPanelEstateInfo::LLPanelEstateInfo()
: LLPanelRegionInfo(),
mEstateID(0) // invalid
{
+ LLEstateInfoModel& estate_info = LLEstateInfoModel::instance();
+ estate_info.setCommitCallback(boost::bind(&LLPanelEstateInfo::refreshFromEstate, this));
+ estate_info.setUpdateCallback(boost::bind(&LLPanelEstateInfo::refreshFromEstate, this));
}
// static
@@ -1354,41 +1345,9 @@ void LLPanelEstateInfo::initDispatch(LLDispatcher& dispatch)
estate_dispatch_initialized = true;
}
-// Disables the sun-hour slider and the use fixed time check if the use global time is check
-void LLPanelEstateInfo::onChangeUseGlobalTime()
-{
- bool enabled = !getChild<LLUICtrl>("use_global_time_check")->getValue().asBoolean();
- getChildView("sun_hour_slider")->setEnabled(enabled);
- getChildView("fixed_sun_check")->setEnabled(enabled);
- getChild<LLUICtrl>("fixed_sun_check")->setValue(LLSD(FALSE));
- enableButton("apply_btn");
-}
-
-// Enables the sun-hour slider if the fixed-sun checkbox is set
-void LLPanelEstateInfo::onChangeFixedSun()
-{
- bool enabled = !getChild<LLUICtrl>("fixed_sun_check")->getValue().asBoolean();
- getChildView("use_global_time_check")->setEnabled(enabled);
- getChild<LLUICtrl>("use_global_time_check")->setValue(LLSD(FALSE));
- enableButton("apply_btn");
-}
-
-
-
-
//---------------------------------------------------------------------------
// Add/Remove estate access button callbacks
//---------------------------------------------------------------------------
-void LLPanelEstateInfo::onClickEditSky()
-{
- LLFloaterReg::showInstance("env_windlight");
-}
-
-void LLPanelEstateInfo::onClickEditDayCycle()
-{
- LLFloaterReg::showInstance("env_day_cycle");
-}
-
void LLPanelEstateInfo::onClickAddAllowedAgent()
{
LLCtrlListInterface *list = childGetListInterface("allowed_avatar_name_list");
@@ -1514,7 +1473,10 @@ void LLPanelEstateInfo::onClickKickUser()
// in order to set up floater dependency
LLFloater* parent_floater = gFloaterView->getParentFloater(this);
LLFloater* child_floater = LLFloaterAvatarPicker::show(boost::bind(&LLPanelEstateInfo::onKickUserCommit, this, _1), FALSE, TRUE);
- parent_floater->addDependentFloater(child_floater);
+ if (child_floater)
+ {
+ parent_floater->addDependentFloater(child_floater);
+ }
}
void LLPanelEstateInfo::onKickUserCommit(const uuid_vec_t& ids)
@@ -1588,10 +1550,7 @@ std::string all_estates_text()
// static
bool LLPanelEstateInfo::isLindenEstate()
{
- LLPanelEstateInfo* panel = LLFloaterRegionInfo::getPanelEstate();
- if (!panel) return false;
-
- U32 estate_id = panel->getEstateID();
+ U32 estate_id = LLEstateInfoModel::instance().getID();
return (estate_id <= ESTATE_LAST_LINDEN);
}
@@ -1938,6 +1897,26 @@ void LLPanelEstateInfo::sendEstateAccessDelta(U32 flags, const LLUUID& agent_or_
gAgent.sendReliableMessage();
}
+// static
+void LLPanelEstateInfo::updateEstateOwnerName(const std::string& name)
+{
+ LLPanelEstateInfo* panelp = LLFloaterRegionInfo::getPanelEstate();
+ if (panelp)
+ {
+ panelp->setOwnerName(name);
+ }
+}
+
+// static
+void LLPanelEstateInfo::updateEstateName(const std::string& name)
+{
+ LLPanelEstateInfo* panelp = LLFloaterRegionInfo::getPanelEstate();
+ if (panelp)
+ {
+ panelp->getChildRef<LLTextBox>("estate_name").setText(name);
+ }
+}
+
void LLPanelEstateInfo::updateControls(LLViewerRegion* region)
{
BOOL god = gAgent.isGodlike();
@@ -1945,7 +1924,6 @@ void LLPanelEstateInfo::updateControls(LLViewerRegion* region)
BOOL manager = (region && region->isEstateManager());
setCtrlsEnabled(god || owner || manager);
- getChildView("apply_btn")->setEnabled(FALSE);
getChildView("add_allowed_avatar_btn")->setEnabled(god || owner || manager);
getChildView("remove_allowed_avatar_btn")->setEnabled(god || owner || manager);
getChildView("add_allowed_group_btn")->setEnabled(god || owner || manager);
@@ -1954,7 +1932,7 @@ void LLPanelEstateInfo::updateControls(LLViewerRegion* region)
// Can't ban people from mainland, orientation islands, etc. because this
// creates much network traffic and server load.
// Disable their accounts in CSR tool instead.
- bool linden_estate = (getEstateID() <= ESTATE_LAST_LINDEN);
+ bool linden_estate = isLindenEstate();
bool enable_ban = (god || owner || manager) && !linden_estate;
getChildView("add_banned_avatar_btn")->setEnabled(enable_ban);
getChildView("remove_banned_avatar_btn")->setEnabled(enable_ban);
@@ -1966,6 +1944,8 @@ void LLPanelEstateInfo::updateControls(LLViewerRegion* region)
getChildView("add_estate_manager_btn")->setEnabled(god || owner);
getChildView("remove_estate_manager_btn")->setEnabled(god || owner);
getChildView("estate_manager_name_list")->setEnabled(god || owner);
+
+ refresh();
}
bool LLPanelEstateInfo::refreshFromRegion(LLViewerRegion* region)
@@ -2003,10 +1983,6 @@ void LLPanelEstateInfo::updateChild(LLUICtrl* child_ctrl)
{
// do nothing
}
- else if (checkSunHourSlider(child_ctrl))
- {
- // do nothing
- }
}
bool LLPanelEstateInfo::estateUpdate(LLMessageSystem* msg)
@@ -2020,18 +1996,11 @@ BOOL LLPanelEstateInfo::postBuild()
{
// set up the callbacks for the generic controls
initCtrl("externally_visible_check");
- initCtrl("use_global_time_check");
- initCtrl("fixed_sun_check");
initCtrl("allow_direct_teleport");
initCtrl("limit_payment");
initCtrl("limit_age_verified");
initCtrl("voice_chat_check");
- // set up the use global time checkbox
- getChild<LLUICtrl>("use_global_time_check")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeUseGlobalTime, this));
- getChild<LLUICtrl>("fixed_sun_check")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeFixedSun, this));
- getChild<LLUICtrl>("sun_hour_slider")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeChildCtrl, this, _1));
-
getChild<LLUICtrl>("allowed_avatar_name_list")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeChildCtrl, this, _1));
LLNameListCtrl *avatar_name_list = getChild<LLNameListCtrl>("allowed_avatar_name_list");
if (avatar_name_list)
@@ -2078,18 +2047,18 @@ BOOL LLPanelEstateInfo::postBuild()
childSetAction("message_estate_btn", boost::bind(&LLPanelEstateInfo::onClickMessageEstate, this));
childSetAction("kick_user_from_estate_btn", boost::bind(&LLPanelEstateInfo::onClickKickUser, this));
- childSetAction("WLEditSky", boost::bind(&LLPanelEstateInfo::onClickEditSky, this));
- childSetAction("WLEditDayCycle", boost::bind(&LLPanelEstateInfo::onClickEditDayCycle, this));
-
return LLPanelRegionInfo::postBuild();
}
void LLPanelEstateInfo::refresh()
{
+ // Disable access restriction controls if they make no sense.
bool public_access = getChild<LLUICtrl>("externally_visible_check")->getValue().asBoolean();
+
getChildView("Only Allow")->setEnabled(public_access);
getChildView("limit_payment")->setEnabled(public_access);
getChildView("limit_age_verified")->setEnabled(public_access);
+
// if this is set to false, then the limit fields are meaningless and should be turned off
if (public_access == false)
{
@@ -2098,6 +2067,39 @@ void LLPanelEstateInfo::refresh()
}
}
+void LLPanelEstateInfo::refreshFromEstate()
+{
+ const LLEstateInfoModel& estate_info = LLEstateInfoModel::instance();
+
+ getChild<LLUICtrl>("estate_name")->setValue(estate_info.getName());
+ setOwnerName(LLSLURL("agent", estate_info.getOwnerID(), "inspect").getSLURLString());
+
+ getChild<LLUICtrl>("externally_visible_check")->setValue(estate_info.getIsExternallyVisible());
+ getChild<LLUICtrl>("voice_chat_check")->setValue(estate_info.getAllowVoiceChat());
+ getChild<LLUICtrl>("allow_direct_teleport")->setValue(estate_info.getAllowDirectTeleport());
+ getChild<LLUICtrl>("limit_payment")->setValue(estate_info.getDenyAnonymous());
+ getChild<LLUICtrl>("limit_age_verified")->setValue(estate_info.getDenyAgeUnverified());
+
+ // If visible from mainland, disable the access allowed
+ // UI, as anyone can teleport there.
+ // However, gods need to be able to edit the access list for
+ // linden estates, regardless of visibility, to allow object
+ // and L$ transfers.
+ {
+ bool visible_from_mainland = estate_info.getIsExternallyVisible();
+ bool god = gAgent.isGodlike();
+ bool linden_estate = isLindenEstate();
+
+ bool enable_agent = (!visible_from_mainland || (god && linden_estate));
+ bool enable_group = enable_agent;
+ bool enable_ban = !linden_estate;
+
+ setAccessAllowedEnabled(enable_agent, enable_group, enable_ban);
+ }
+
+ refresh();
+}
+
BOOL LLPanelEstateInfo::sendUpdate()
{
llinfos << "LLPanelEsateInfo::sendUpdate()" << llendl;
@@ -2105,7 +2107,7 @@ BOOL LLPanelEstateInfo::sendUpdate()
LLNotification::Params params("ChangeLindenEstate");
params.functor.function(boost::bind(&LLPanelEstateInfo::callbackChangeLindenEstate, this, _1, _2));
- if (getEstateID() <= ESTATE_LAST_LINDEN)
+ if (isLindenEstate())
{
// trying to change reserved estate, warn
LLNotifications::instance().add(params);
@@ -2124,13 +2126,21 @@ bool LLPanelEstateInfo::callbackChangeLindenEstate(const LLSD& notification, con
switch(option)
{
case 0:
- // send the update
- if (!commitEstateInfoCaps())
{
- // the caps method failed, try the old way
- LLFloaterRegionInfo::nextInvoice();
- commitEstateInfoDataserver();
+ LLEstateInfoModel& estate_info = LLEstateInfoModel::instance();
+
+ // update model
+ estate_info.setUseFixedSun(false); // we don't support fixed sun estates anymore
+ estate_info.setIsExternallyVisible(getChild<LLUICtrl>("externally_visible_check")->getValue().asBoolean());
+ estate_info.setAllowDirectTeleport(getChild<LLUICtrl>("allow_direct_teleport")->getValue().asBoolean());
+ estate_info.setDenyAnonymous(getChild<LLUICtrl>("limit_payment")->getValue().asBoolean());
+ estate_info.setDenyAgeUnverified(getChild<LLUICtrl>("limit_age_verified")->getValue().asBoolean());
+ estate_info.setAllowVoiceChat(getChild<LLUICtrl>("voice_chat_check")->getValue().asBoolean());
+
+ // send the update to sim
+ estate_info.sendEstateInfo();
}
+
// we don't want to do this because we'll get it automatically from the sim
// after the spaceserver processes it
// else
@@ -2187,6 +2197,8 @@ public:
// if we get a normal response, handle it here
virtual void result(const LLSD& content)
{
+ LL_INFOS("Windlight") << "Successfully committed estate info" << llendl;
+
// refresh the panel from the database
LLPanelEstateInfo* panel = dynamic_cast<LLPanelEstateInfo*>(mpPanel.get());
if (panel)
@@ -2203,185 +2215,6 @@ private:
LLHandle<LLPanel> mpPanel;
};
-// tries to send estate info using a cap; returns true if it succeeded
-bool LLPanelEstateInfo::commitEstateInfoCaps()
-{
- std::string url = gAgent.getRegion()->getCapability("EstateChangeInfo");
-
- if (url.empty())
- {
- // whoops, couldn't find the cap, so bail out
- return false;
- }
-
- LLSD body;
- body["estate_name"] = getEstateName();
-
- body["is_externally_visible"] = getChild<LLUICtrl>("externally_visible_check")->getValue().asBoolean();
- body["allow_direct_teleport"] = getChild<LLUICtrl>("allow_direct_teleport")->getValue().asBoolean();
- body["is_sun_fixed" ] = getChild<LLUICtrl>("fixed_sun_check")->getValue().asBoolean();
- body["deny_anonymous" ] = getChild<LLUICtrl>("limit_payment")->getValue().asBoolean();
- body["deny_age_unverified" ] = getChild<LLUICtrl>("limit_age_verified")->getValue().asBoolean();
- body["allow_voice_chat" ] = getChild<LLUICtrl>("voice_chat_check")->getValue().asBoolean();
- body["invoice" ] = LLFloaterRegionInfo::getLastInvoice();
-
- // block fly is in estate database but not in estate UI, so we're not supporting it
- //body["block_fly" ] = getChild<LLUICtrl>("")->getValue().asBoolean();
-
- F32 sun_hour = getSunHour();
- if (getChild<LLUICtrl>("use_global_time_check")->getValue().asBoolean())
- {
- sun_hour = 0.f; // 0 = global time
- }
- body["sun_hour"] = sun_hour;
-
- // we use a responder so that we can re-get the data after committing to the database
- LLHTTPClient::post(url, body, new LLEstateChangeInfoResponder(this));
- return true;
-}
-
-/* This is the old way of doing things, is deprecated, and should be
- deleted when the dataserver model can be removed */
-// key = "estatechangeinfo"
-// strings[0] = str(estate_id) (added by simulator before relay - not here)
-// strings[1] = estate_name
-// strings[2] = str(estate_flags)
-// strings[3] = str((S32)(sun_hour * 1024.f))
-void LLPanelEstateInfo::commitEstateInfoDataserver()
-{
- LLMessageSystem* msg = gMessageSystem;
- msg->newMessage("EstateOwnerMessage");
- msg->nextBlockFast(_PREHASH_AgentData);
- msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
- msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
- msg->addUUIDFast(_PREHASH_TransactionID, LLUUID::null); //not used
-
- msg->nextBlock("MethodData");
- msg->addString("Method", "estatechangeinfo");
- msg->addUUID("Invoice", LLFloaterRegionInfo::getLastInvoice());
-
- msg->nextBlock("ParamList");
- msg->addString("Parameter", getEstateName());
-
- std::string buffer;
- buffer = llformat("%u", computeEstateFlags());
- msg->nextBlock("ParamList");
- msg->addString("Parameter", buffer);
-
- F32 sun_hour = getSunHour();
- if (getChild<LLUICtrl>("use_global_time_check")->getValue().asBoolean())
- {
- sun_hour = 0.f; // 0 = global time
- }
-
- buffer = llformat("%d", (S32)(sun_hour*1024.0f));
- msg->nextBlock("ParamList");
- msg->addString("Parameter", buffer);
-
- gAgent.sendMessage();
-}
-
-void LLPanelEstateInfo::setEstateFlags(U32 flags)
-{
- getChild<LLUICtrl>("externally_visible_check")->setValue(LLSD(flags & REGION_FLAGS_EXTERNALLY_VISIBLE ? TRUE : FALSE) );
- getChild<LLUICtrl>("fixed_sun_check")->setValue(LLSD(flags & REGION_FLAGS_SUN_FIXED ? TRUE : FALSE) );
- getChild<LLUICtrl>("voice_chat_check")->setValue(
- LLSD(flags & REGION_FLAGS_ALLOW_VOICE ? TRUE : FALSE));
- getChild<LLUICtrl>("allow_direct_teleport")->setValue(LLSD(flags & REGION_FLAGS_ALLOW_DIRECT_TELEPORT ? TRUE : FALSE) );
- getChild<LLUICtrl>("limit_payment")->setValue(LLSD(flags & REGION_FLAGS_DENY_ANONYMOUS ? TRUE : FALSE) );
- getChild<LLUICtrl>("limit_age_verified")->setValue(LLSD(flags & REGION_FLAGS_DENY_AGEUNVERIFIED ? TRUE : FALSE) );
-
- refresh();
-}
-
-U32 LLPanelEstateInfo::computeEstateFlags()
-{
- U32 flags = 0;
-
- if (getChild<LLUICtrl>("externally_visible_check")->getValue().asBoolean())
- {
- flags |= REGION_FLAGS_EXTERNALLY_VISIBLE;
- }
-
- if ( getChild<LLUICtrl>("voice_chat_check")->getValue().asBoolean() )
- {
- flags |= REGION_FLAGS_ALLOW_VOICE;
- }
-
- if (getChild<LLUICtrl>("allow_direct_teleport")->getValue().asBoolean())
- {
- flags |= REGION_FLAGS_ALLOW_DIRECT_TELEPORT;
- }
-
- if (getChild<LLUICtrl>("fixed_sun_check")->getValue().asBoolean())
- {
- flags |= REGION_FLAGS_SUN_FIXED;
- }
-
- if (getChild<LLUICtrl>("limit_payment")->getValue().asBoolean())
- {
- flags |= REGION_FLAGS_DENY_ANONYMOUS;
- }
-
- if (getChild<LLUICtrl>("limit_age_verified")->getValue().asBoolean())
- {
- flags |= REGION_FLAGS_DENY_AGEUNVERIFIED;
- }
-
-
- return flags;
-}
-
-BOOL LLPanelEstateInfo::getGlobalTime()
-{
- return getChild<LLUICtrl>("use_global_time_check")->getValue().asBoolean();
-}
-
-void LLPanelEstateInfo::setGlobalTime(bool b)
-{
- getChild<LLUICtrl>("use_global_time_check")->setValue(LLSD(b));
- getChildView("fixed_sun_check")->setEnabled(LLSD(!b));
- getChildView("sun_hour_slider")->setEnabled(LLSD(!b));
- if (b)
- {
- getChild<LLUICtrl>("sun_hour_slider")->setValue(LLSD(0.f));
- }
-}
-
-
-BOOL LLPanelEstateInfo::getFixedSun()
-{
- return getChild<LLUICtrl>("fixed_sun_check")->getValue().asBoolean();
-}
-
-void LLPanelEstateInfo::setSunHour(F32 sun_hour)
-{
- if(sun_hour < 6.0f)
- {
- sun_hour = 24.0f + sun_hour;
- }
- getChild<LLUICtrl>("sun_hour_slider")->setValue(LLSD(sun_hour));
-}
-
-F32 LLPanelEstateInfo::getSunHour()
-{
- if (getChildView("sun_hour_slider")->getEnabled())
- {
- return (F32)getChild<LLUICtrl>("sun_hour_slider")->getValue().asReal();
- }
- return 0.f;
-}
-
-const std::string LLPanelEstateInfo::getEstateName() const
-{
- return getChild<LLUICtrl>("estate_name")->getValue().asString();
-}
-
-void LLPanelEstateInfo::setEstateName(const std::string& name)
-{
- getChild<LLUICtrl>("estate_name")->setValue(LLSD(name));
-}
-
const std::string LLPanelEstateInfo::getOwnerName() const
{
return getChild<LLUICtrl>("estate_owner")->getValue().asString();
@@ -2481,17 +2314,6 @@ BOOL LLPanelEstateInfo::checkRemovalButton(std::string name)
return (btn_name != "");
}
-BOOL LLPanelEstateInfo::checkSunHourSlider(LLUICtrl* child_ctrl)
-{
- BOOL found_child_ctrl = FALSE;
- if (child_ctrl->getName() == "sun_hour_slider")
- {
- enableButton("apply_btn");
- found_child_ctrl = TRUE;
- }
- return found_child_ctrl;
-}
-
// static
void LLPanelEstateInfo::onClickMessageEstate(void* userdata)
{
@@ -2566,11 +2388,7 @@ bool LLPanelEstateCovenant::refreshFromRegion(LLViewerRegion* region)
}
LLTextBox* region_landtype = getChild<LLTextBox>("region_landtype_text");
- if (region_landtype)
- {
- region_landtype->setText(region->getSimProductName());
- }
-
+ region_landtype->setText(region->getLocalizedSimProductName());
// let the parent class handle the general data collection.
bool rv = LLPanelRegionInfo::refreshFromRegion(region);
@@ -2893,53 +2711,12 @@ bool LLDispatchEstateUpdateInfo::operator()(
const LLUUID& invoice,
const sparam_t& strings)
{
- LLPanelEstateInfo* panel = LLFloaterRegionInfo::getPanelEstate();
- if (!panel) return true;
-
- // NOTE: LLDispatcher extracts strings with an extra \0 at the
- // end. If we pass the std::string direct to the UI/renderer
- // it draws with a weird character at the end of the string.
- std::string estate_name = strings[0].c_str(); // preserve c_str() call!
- panel->setEstateName(estate_name);
-
- LLViewerRegion* regionp = gAgent.getRegion();
-
- LLUUID owner_id(strings[1]);
- regionp->setOwner(owner_id);
- // Update estate owner name in UI
- std::string owner_name = LLSLURL("agent", owner_id, "inspect").getSLURLString();
- panel->setOwnerName(owner_name);
-
- U32 estate_id = strtoul(strings[2].c_str(), NULL, 10);
- panel->setEstateID(estate_id);
+ lldebugs << "Received estate update" << llendl;
- U32 flags = strtoul(strings[3].c_str(), NULL, 10);
- panel->setEstateFlags(flags);
-
- F32 sun_hour = ((F32)(strtod(strings[4].c_str(), NULL)))/1024.0f;
- if(sun_hour == 0 && (flags & REGION_FLAGS_SUN_FIXED ? FALSE : TRUE))
- {
- panel->setGlobalTime(TRUE);
- }
- else
- {
- panel->setGlobalTime(FALSE);
- panel->setSunHour(sun_hour);
- }
-
- bool visible_from_mainland = (bool)(flags & REGION_FLAGS_EXTERNALLY_VISIBLE);
- bool god = gAgent.isGodlike();
- bool linden_estate = (estate_id <= ESTATE_LAST_LINDEN);
-
- // If visible from mainland, disable the access allowed
- // UI, as anyone can teleport there.
- // However, gods need to be able to edit the access list for
- // linden estates, regardless of visibility, to allow object
- // and L$ transfers.
- bool enable_agent = (!visible_from_mainland || (god && linden_estate));
- bool enable_group = enable_agent;
- bool enable_ban = !linden_estate;
- panel->setAccessAllowedEnabled(enable_agent, enable_group, enable_ban);
+ // Update estate info model.
+ // This will call LLPanelEstateInfo::refreshFromEstate().
+ // *TODO: Move estate message handling stuff to llestateinfomodel.cpp.
+ LLEstateInfoModel::instance().update(strings);
return true;
}
@@ -3113,3 +2890,595 @@ bool LLDispatchSetEstateAccess::operator()(
return true;
}
+
+LLPanelEnvironmentInfo::LLPanelEnvironmentInfo()
+: mEnableEditing(false),
+ mRegionSettingsRadioGroup(NULL),
+ mDayCycleSettingsRadioGroup(NULL),
+ mWaterPresetCombo(NULL),
+ mSkyPresetCombo(NULL),
+ mDayCyclePresetCombo(NULL)
+{
+}
+
+// virtual
+BOOL LLPanelEnvironmentInfo::postBuild()
+{
+ mRegionSettingsRadioGroup = getChild<LLRadioGroup>("region_settings_radio_group");
+ mRegionSettingsRadioGroup->setCommitCallback(boost::bind(&LLPanelEnvironmentInfo::onSwitchRegionSettings, this));
+
+ mDayCycleSettingsRadioGroup = getChild<LLRadioGroup>("sky_dayc_settings_radio_group");
+ mDayCycleSettingsRadioGroup->setCommitCallback(boost::bind(&LLPanelEnvironmentInfo::onSwitchDayCycle, this));
+
+ mWaterPresetCombo = getChild<LLComboBox>("water_settings_preset_combo");
+ mWaterPresetCombo->setCommitCallback(boost::bind(&LLPanelEnvironmentInfo::onSelectWaterPreset, this));
+
+ mSkyPresetCombo = getChild<LLComboBox>("sky_settings_preset_combo");
+ mSkyPresetCombo->setCommitCallback(boost::bind(&LLPanelEnvironmentInfo::onSelectSkyPreset, this));
+
+ mDayCyclePresetCombo = getChild<LLComboBox>("dayc_settings_preset_combo");
+ mDayCyclePresetCombo->setCommitCallback(boost::bind(&LLPanelEnvironmentInfo::onSelectDayCycle, this));
+
+ childSetCommitCallback("apply_btn", boost::bind(&LLPanelEnvironmentInfo::onBtnApply, this), NULL);
+ getChild<LLButton>("apply_btn")->setRightMouseDownCallback(boost::bind(&LLEnvManagerNew::dumpUserPrefs, LLEnvManagerNew::getInstance()));
+ childSetCommitCallback("cancel_btn", boost::bind(&LLPanelEnvironmentInfo::onBtnCancel, this), NULL);
+ getChild<LLButton>("cancel_btn")->setRightMouseDownCallback(boost::bind(&LLEnvManagerNew::dumpPresets, LLEnvManagerNew::getInstance()));
+
+ LLEnvManagerNew::instance().setRegionSettingsChangeCallback(boost::bind(&LLPanelEnvironmentInfo::onRegionSettingschange, this));
+ LLEnvManagerNew::instance().setRegionSettingsAppliedCallback(boost::bind(&LLPanelEnvironmentInfo::onRegionSettingsApplied, this, _1));
+
+ LLDayCycleManager::instance().setModifyCallback(boost::bind(&LLPanelEnvironmentInfo::populateDayCyclesList, this));
+ LLWLParamManager::instance().setPresetListChangeCallback(boost::bind(&LLPanelEnvironmentInfo::populateSkyPresetsList, this));
+ LLWaterParamManager::instance().setPresetListChangeCallback(boost::bind(&LLPanelEnvironmentInfo::populateWaterPresetsList, this));
+
+ return TRUE;
+}
+
+// virtual
+void LLPanelEnvironmentInfo::onOpen(const LLSD& key)
+{
+ LL_DEBUGS("Windlight") << "Panel opened, refreshing" << LL_ENDL;
+ refresh();
+}
+
+// virtual
+void LLPanelEnvironmentInfo::handleVisibilityChange(BOOL new_visibility)
+{
+ // If hiding (user switched to another tab or closed the floater),
+ // display user's preferred environment.
+ if (!new_visibility)
+ {
+ LLEnvManagerNew::instance().usePrefs();
+ }
+}
+
+// virtual
+bool LLPanelEnvironmentInfo::refreshFromRegion(LLViewerRegion* region)
+{
+ LL_DEBUGS("Windlight") << "Region updated, enabling/disabling controls" << LL_ENDL;
+ BOOL owner_or_god = gAgent.isGodlike() || (region && (region->getOwner() == gAgent.getID()));
+ BOOL owner_or_god_or_manager = owner_or_god || (region && region->isEstateManager());
+
+ // Don't refresh from region settings to avoid flicker after applying new region settings.
+ mEnableEditing = owner_or_god_or_manager;
+ setControlsEnabled(mEnableEditing);
+
+ return LLPanelRegionInfo::refreshFromRegion(region);
+}
+
+void LLPanelEnvironmentInfo::refresh()
+{
+ populateWaterPresetsList();
+ populateSkyPresetsList();
+ populateDayCyclesList();
+
+ // Init radio groups.
+ const LLEnvironmentSettings& settings = LLEnvManagerNew::instance().getRegionSettings();
+ const LLSD& dc = settings.getWLDayCycle();
+ LLSD::Real first_frame_time = dc.size() > 0 ? dc[0][0].asReal() : 0.0f;
+ const bool use_fixed_sky = dc.size() == 1 && first_frame_time < 0;
+ mRegionSettingsRadioGroup->setSelectedIndex(settings.getSkyMap().size() == 0 ? 0 : 1);
+ mDayCycleSettingsRadioGroup->setSelectedIndex(use_fixed_sky ? 0 : 1);
+
+ setControlsEnabled(mEnableEditing);
+
+ setDirty(false);
+}
+
+void LLPanelEnvironmentInfo::setControlsEnabled(bool enabled)
+{
+ mRegionSettingsRadioGroup->setEnabled(enabled);
+ mDayCycleSettingsRadioGroup->setEnabled(enabled);
+
+ mWaterPresetCombo->setEnabled(enabled);
+ mSkyPresetCombo->setEnabled(enabled);
+ mDayCyclePresetCombo->setEnabled(enabled);
+
+ getChildView("apply_btn")->setEnabled(enabled);
+ getChildView("cancel_btn")->setEnabled(enabled);
+
+ if (enabled)
+ {
+ // Enable/disable some controls based on currently selected radio buttons.
+ bool use_defaults = mRegionSettingsRadioGroup->getSelectedIndex() == 0;
+ getChild<LLView>("user_environment_settings")->setEnabled(!use_defaults);
+
+ bool is_fixed_sky = mDayCycleSettingsRadioGroup->getSelectedIndex() == 0;
+ mSkyPresetCombo->setEnabled(is_fixed_sky);
+ mDayCyclePresetCombo->setEnabled(!is_fixed_sky);
+ }
+}
+
+void LLPanelEnvironmentInfo::setApplyProgress(bool started)
+{
+ LLLoadingIndicator* indicator = getChild<LLLoadingIndicator>("progress_indicator");
+
+ indicator->setVisible(started);
+
+ if (started)
+ {
+ indicator->start();
+ }
+ else
+ {
+ indicator->stop();
+ }
+}
+
+void LLPanelEnvironmentInfo::setDirty(bool dirty)
+{
+ getChildView("apply_btn")->setEnabled(dirty);
+ getChildView("cancel_btn")->setEnabled(dirty);
+}
+
+void LLPanelEnvironmentInfo::sendRegionSunUpdate()
+{
+ LLRegionInfoModel& region_info = LLRegionInfoModel::instance();
+
+ // If the region is being switched to fixed sky,
+ // change the region's sun hour according to the (fixed) sun position.
+ // This is needed for llGetSunDirection() LSL function to work properly (STORM-1330).
+ const LLSD& sky_map = mNewRegionSettings.getSkyMap();
+ bool region_use_fixed_sky = sky_map.size() == 1;
+ if (region_use_fixed_sky)
+ {
+ LLWLParamSet param_set;
+ llassert(sky_map.isMap());
+ param_set.setAll(sky_map.beginMap()->second);
+ F32 sun_angle = param_set.getSunAngle();
+
+ LL_DEBUGS("Windlight Sync") << "Old sun hour: " << region_info.mSunHour << LL_ENDL;
+ // convert value range from 0..2pi to 6..30
+ region_info.mSunHour = fmodf((sun_angle / F_TWO_PI) * 24.f, 24.f) + 6.f;
+ }
+
+ region_info.setUseFixedSun(region_use_fixed_sky);
+ region_info.mUseEstateSun = !region_use_fixed_sky;
+ LL_DEBUGS("Windlight Sync") << "Sun hour: " << region_info.mSunHour << LL_ENDL;
+
+ region_info.sendRegionTerrain(LLFloaterRegionInfo::getLastInvoice());
+}
+
+void LLPanelEnvironmentInfo::fixEstateSun()
+{
+ // We don't support fixed sun estates anymore and need to fix
+ // such estates for region day cycle to take effect.
+ // *NOTE: Assuming that current estate settings have arrived already.
+ LLEstateInfoModel& estate_info = LLEstateInfoModel::instance();
+ if (estate_info.getUseFixedSun())
+ {
+ llinfos << "Switching estate to global sun" << llendl;
+ estate_info.setUseFixedSun(false);
+ estate_info.sendEstateInfo();
+ }
+}
+
+void LLPanelEnvironmentInfo::populateWaterPresetsList()
+{
+ mWaterPresetCombo->removeall();
+
+ // If the region already has water params, add them to the list.
+ const LLEnvironmentSettings& region_settings = LLEnvManagerNew::instance().getRegionSettings();
+ if (region_settings.getWaterParams().size() != 0)
+ {
+ const std::string& region_name = gAgent.getRegion()->getName();
+ mWaterPresetCombo->add(region_name, LLWLParamKey(region_name, LLEnvKey::SCOPE_REGION).toLLSD());
+ mWaterPresetCombo->addSeparator();
+ }
+
+ std::list<std::string> user_presets, system_presets;
+ LLWaterParamManager::instance().getPresetNames(user_presets, system_presets);
+
+ // Add local user presets first.
+ for (std::list<std::string>::const_iterator it = user_presets.begin(); it != user_presets.end(); ++it)
+ {
+ mWaterPresetCombo->add(*it, LLWLParamKey(*it, LLEnvKey::SCOPE_LOCAL).toLLSD());
+ }
+
+ if (user_presets.size() > 0)
+ {
+ mWaterPresetCombo->addSeparator();
+ }
+
+ // Add local system presets.
+ for (std::list<std::string>::const_iterator it = system_presets.begin(); it != system_presets.end(); ++it)
+ {
+ mWaterPresetCombo->add(*it, LLWLParamKey(*it, LLEnvKey::SCOPE_LOCAL).toLLSD());
+ }
+
+ // There's no way to select current preset because its name is not stored on server.
+}
+
+void LLPanelEnvironmentInfo::populateSkyPresetsList()
+{
+ mSkyPresetCombo->removeall();
+
+ LLWLParamManager::preset_name_list_t region_presets;
+ LLWLParamManager::preset_name_list_t user_presets, sys_presets;
+ LLWLParamManager::instance().getPresetNames(region_presets, user_presets, sys_presets);
+
+ // Add region presets.
+ std::string region_name = gAgent.getRegion() ? gAgent.getRegion()->getName() : LLTrans::getString("Unknown");
+ for (LLWLParamManager::preset_name_list_t::const_iterator it = region_presets.begin(); it != region_presets.end(); ++it)
+ {
+ std::string preset_name = *it;
+ std::string item_title = preset_name + " (" + region_name + ")";
+ mSkyPresetCombo->add(item_title, LLWLParamKey(preset_name, LLEnvKey::SCOPE_REGION).toStringVal());
+ }
+
+ if (!region_presets.empty())
+ {
+ mSkyPresetCombo->addSeparator();
+ }
+
+ // Add user presets.
+ for (LLWLParamManager::preset_name_list_t::const_iterator it = user_presets.begin(); it != user_presets.end(); ++it)
+ {
+ mSkyPresetCombo->add(*it, LLWLParamKey(*it, LLEnvKey::SCOPE_LOCAL).toStringVal());
+ }
+
+ if (!user_presets.empty())
+ {
+ mSkyPresetCombo->addSeparator();
+ }
+
+ // Add system presets.
+ for (LLWLParamManager::preset_name_list_t::const_iterator it = sys_presets.begin(); it != sys_presets.end(); ++it)
+ {
+ mSkyPresetCombo->add(*it, LLWLParamKey(*it, LLEnvKey::SCOPE_LOCAL).toStringVal());
+ }
+
+ // Select current preset.
+ LLSD sky_map = LLEnvManagerNew::instance().getRegionSettings().getSkyMap();
+ if (sky_map.size() == 1) // if the region is set to fixed sky
+ {
+ std::string preset_name = sky_map.beginMap()->first;
+ mSkyPresetCombo->selectByValue(LLWLParamKey(preset_name, LLEnvKey::SCOPE_REGION).toStringVal());
+ }
+}
+
+void LLPanelEnvironmentInfo::populateDayCyclesList()
+{
+ mDayCyclePresetCombo->removeall();
+
+ // If the region already has env. settings, add its day cycle to the list.
+ const LLSD& cur_region_dc = LLEnvManagerNew::instance().getRegionSettings().getWLDayCycle();
+ if (cur_region_dc.size() != 0)
+ {
+ LLViewerRegion* region = gAgent.getRegion();
+ llassert(region != NULL);
+
+ LLWLParamKey key(region->getName(), LLEnvKey::SCOPE_REGION);
+ mDayCyclePresetCombo->add(region->getName(), key.toStringVal());
+ mDayCyclePresetCombo->addSeparator();
+ }
+
+ // Add local user day cycles.
+ LLDayCycleManager::preset_name_list_t user_days, sys_days;
+ LLDayCycleManager::instance().getPresetNames(user_days, sys_days);
+ for (LLDayCycleManager::preset_name_list_t::const_iterator it = user_days.begin(); it != user_days.end(); ++it)
+ {
+ mDayCyclePresetCombo->add(*it, LLWLParamKey(*it, LLEnvKey::SCOPE_LOCAL).toStringVal());
+ }
+
+ if (user_days.size() > 0)
+ {
+ mDayCyclePresetCombo->addSeparator();
+ }
+
+ // Add local system day cycles.
+ for (LLDayCycleManager::preset_name_list_t::const_iterator it = sys_days.begin(); it != sys_days.end(); ++it)
+ {
+ mDayCyclePresetCombo->add(*it, LLWLParamKey(*it, LLEnvKey::SCOPE_LOCAL).toStringVal());
+ }
+
+ // Current day cycle is already selected.
+}
+
+bool LLPanelEnvironmentInfo::getSelectedWaterParams(LLSD& water_params)
+{
+ LLWLParamKey water_key(mWaterPresetCombo->getSelectedValue());
+
+ if (water_key.scope == LLEnvKey::SCOPE_REGION)
+ {
+ water_params = LLEnvManagerNew::instance().getRegionSettings().getWaterParams();
+ }
+ else
+ {
+ LLWaterParamSet param_set;
+ if (!LLWaterParamManager::instance().getParamSet(water_key.name, param_set))
+ {
+ llwarns << "Error getting water preset: " << water_key.name << llendl;
+ return false;
+ }
+
+ water_params = param_set.getAll();
+ }
+
+ return true;
+}
+
+bool LLPanelEnvironmentInfo::getSelectedSkyParams(LLSD& sky_params, std::string& preset_name)
+{
+ std::string preset_key(mSkyPresetCombo->getValue().asString());
+ LLWLParamKey preset(preset_key);
+
+ // Get the preset sky params.
+ LLWLParamSet param_set;
+ if (!LLWLParamManager::instance().getParamSet(preset, param_set))
+ {
+ llwarns << "Error getting sky params: " << preset.toLLSD() << llendl;
+ return false;
+ }
+
+ sky_params = param_set.getAll();
+ preset_name = preset.name;
+ return true;
+}
+
+bool LLPanelEnvironmentInfo::getSelectedDayCycleParams(LLSD& day_cycle, LLSD& sky_map, short& scope)
+{
+ std::string preset_key(mDayCyclePresetCombo->getValue().asString());
+ LLWLParamKey dc(preset_key);
+ LL_DEBUGS("Windlight") << "Use day cycle: " << dc.toLLSD() << LL_ENDL;
+
+ if (dc.scope == LLEnvKey::SCOPE_REGION) // current region day cycle
+ {
+ const LLEnvironmentSettings& cur_region_settings = LLEnvManagerNew::instance().getRegionSettings();
+ day_cycle = cur_region_settings.getWLDayCycle();
+ sky_map = cur_region_settings.getSkyMap();
+ }
+ else // a local day cycle
+ {
+ if (!LLDayCycleManager::instance().getPreset(dc.name, day_cycle))
+ {
+ llwarns << "Error getting day cycle " << dc.name << llendl;
+ return false;
+ }
+
+ // Create sky map from the day cycle.
+ {
+ LLWLDayCycle tmp_day;
+ tmp_day.loadDayCycle(day_cycle, dc.scope);
+ tmp_day.getSkyMap(sky_map);
+ }
+ }
+
+ scope = dc.scope;
+
+ return true;
+}
+void LLPanelEnvironmentInfo::onSwitchRegionSettings()
+{
+ bool use_defaults = mRegionSettingsRadioGroup->getSelectedIndex() == 0;
+ getChild<LLView>("user_environment_settings")->setEnabled(!use_defaults);
+
+ if (use_defaults)
+ {
+ LLEnvManagerNew::instance().useDefaults();
+ }
+ else
+ {
+ onSelectWaterPreset();
+ onSwitchDayCycle();
+ }
+
+ setDirty(true);
+}
+
+void LLPanelEnvironmentInfo::onSwitchDayCycle()
+{
+ bool is_fixed_sky = mDayCycleSettingsRadioGroup->getSelectedIndex() == 0;
+
+ mSkyPresetCombo->setEnabled(is_fixed_sky);
+ mDayCyclePresetCombo->setEnabled(!is_fixed_sky);
+
+ if (is_fixed_sky)
+ {
+ onSelectSkyPreset();
+ }
+ else
+ {
+ onSelectDayCycle();
+ }
+
+ setDirty(true);
+}
+
+void LLPanelEnvironmentInfo::onSelectWaterPreset()
+{
+ LLSD water_params;
+
+ if (getSelectedWaterParams(water_params))
+ {
+ LLEnvManagerNew::instance().useWaterParams(water_params);
+ }
+
+ setDirty(true);
+}
+
+void LLPanelEnvironmentInfo::onSelectSkyPreset()
+{
+ LLSD params;
+ std::string dummy;
+
+ if (getSelectedSkyParams(params, dummy))
+ {
+ LLEnvManagerNew::instance().useSkyParams(params);
+ }
+
+ setDirty(true);
+}
+
+void LLPanelEnvironmentInfo::onSelectDayCycle()
+{
+ LLSD day_cycle;
+ LLSD sky_map; // unused
+ short scope;
+
+ if (getSelectedDayCycleParams(day_cycle, sky_map, scope))
+ {
+ LLEnvManagerNew::instance().useDayCycleParams(day_cycle, (LLEnvKey::EScope) scope);
+ }
+
+ setDirty(true);
+}
+
+void LLPanelEnvironmentInfo::onBtnApply()
+{
+ const bool use_defaults = mRegionSettingsRadioGroup->getSelectedIndex() == 0;
+ const bool use_fixed_sky = mDayCycleSettingsRadioGroup->getSelectedIndex() == 0;
+
+ LLSD day_cycle;
+ LLSD sky_map;
+ LLSD water_params;
+
+ if (use_defaults)
+ {
+ // settings will be empty
+ LL_DEBUGS("Windlight") << "Defaults" << LL_ENDL;
+ }
+ else // use custom region settings
+ {
+ if (use_fixed_sky)
+ {
+ LL_DEBUGS("Windlight") << "Use fixed sky" << LL_ENDL;
+
+ // Get selected sky params.
+ LLSD params;
+ std::string preset_name;
+ if (!getSelectedSkyParams(params, preset_name))
+ {
+ return;
+ }
+
+ // Create a day cycle consisting of a single sky preset.
+ LLSD key(LLSD::emptyArray());
+ key.append(-1.0f); // indicate that user preference is actually fixed sky, not a day cycle
+ key.append(preset_name);
+ day_cycle.append(key);
+
+ // Create a sky map consisting of only the sky preset.
+ std::map<LLWLParamKey, LLWLParamSet> refs;
+ LLWLParamSet param_set;
+ param_set.setAll(params);
+ refs[LLWLParamKey(preset_name, LLEnvKey::SCOPE_LOCAL)] = param_set; // scope doesn't matter here
+ sky_map = LLWLParamManager::createSkyMap(refs);
+ }
+ else // use day cycle
+ {
+ LL_DEBUGS("Windlight") << "Use day cycle" << LL_ENDL;
+
+ short scope; // unused
+ if (!getSelectedDayCycleParams(day_cycle, sky_map, scope))
+ {
+ return;
+ }
+
+ // If it's a special single-preset day cycle meaning using a fixed sky,
+ // reset the frame time to a non-negative value,
+ // so that the region setting is displayed in the floater as
+ // a day cycle, not a preset. (STORM-1289)
+ if (day_cycle.size() == 1 && day_cycle[0][0].asReal() < 0.0f)
+ {
+ LL_DEBUGS("Windlight") << "Fixing negative time" << LL_ENDL;
+ day_cycle[0][0] = 0.0f;
+ }
+ }
+
+ // Get water params.
+ if (!getSelectedWaterParams(water_params))
+ {
+ // *TODO: show a notification?
+ return;
+ }
+ }
+
+ // Send settings apply request.
+ LLEnvironmentSettings new_region_settings;
+ new_region_settings.saveParams(day_cycle, sky_map, water_params, 0.0f);
+ if (!LLEnvManagerNew::instance().sendRegionSettings(new_region_settings))
+ {
+ llwarns << "Error applying region environment settings" << llendl;
+ return;
+ }
+
+ // When the settings get applied, we'll also send the region sun position update.
+ // To determine the sun angle we're going to need the new settings.
+ mNewRegionSettings = new_region_settings;
+
+ // Start spinning the progress indicator.
+ setApplyProgress(true);
+}
+
+void LLPanelEnvironmentInfo::onBtnCancel()
+{
+ // Reload last saved region settings.
+ refresh();
+
+ // Apply them.
+ LLEnvManagerNew& env_mgr = LLEnvManagerNew::instance();
+ const LLEnvironmentSettings& cur_settings = env_mgr.getRegionSettings();
+ const LLSD& region_day_cycle = cur_settings.getWLDayCycle();
+ const LLSD& region_water = cur_settings.getWaterParams();
+ env_mgr.useWaterParams(region_water);
+ env_mgr.useDayCycleParams(region_day_cycle, LLEnvKey::SCOPE_REGION);
+}
+
+void LLPanelEnvironmentInfo::onRegionSettingschange()
+{
+ LL_DEBUGS("Windlight") << "Region settings changed, refreshing" << LL_ENDL;
+ refresh();
+
+ // Stop applying progress indicator (it may be running if it's us who initiated settings update).
+ setApplyProgress(false);
+}
+
+void LLPanelEnvironmentInfo::onRegionSettingsApplied(bool ok)
+{
+ // If applying new settings has failed, stop the indicator right away.
+ // Otherwise it will be stopped when we receive the updated settings from server.
+ if (ok)
+ {
+ // Set the region sun phase/flags according to the chosen new preferences.
+ //
+ // If we do this earlier we may get jerky transition from fixed sky to a day cycle (STORM-1481).
+ // That is caused by the simulator re-sending the region info, which in turn makes us
+ // re-request and display old region environment settings while the new ones haven't been applied yet.
+ sendRegionSunUpdate();
+
+ // Switch estate to not using fixed sun for the region day cycle to work properly (STORM-1506).
+ fixEstateSun();
+ }
+ else
+ {
+ setApplyProgress(false);
+
+ // We need to re-request environment setting here,
+ // otherwise our subsequent attempts to change region settings will fail with the following error:
+ // "Unable to update environment settings because the last update your viewer saw was not the same
+ // as the last update sent from the simulator. Try sending your update again, and if this
+ // does not work, try leaving and returning to the region."
+ LLEnvManagerNew::instance().requestRegionSettings();
+ }
+}
diff --git a/indra/newview/llfloaterregioninfo.h b/indra/newview/llfloaterregioninfo.h
index c0758fa92d..e36ef4604b 100644
--- a/indra/newview/llfloaterregioninfo.h
+++ b/indra/newview/llfloaterregioninfo.h
@@ -33,6 +33,9 @@
#include "llfloater.h"
#include "llhost.h"
#include "llpanel.h"
+#include "llextendedstatus.h"
+
+#include "llenvmanager.h" // for LLEnvironmentSettings
class LLAvatarName;
class LLDispatcher;
@@ -46,6 +49,7 @@ class LLInventoryItem;
class LLCheckBoxCtrl;
class LLComboBox;
class LLNameListCtrl;
+class LLRadioGroup;
class LLSliderCtrl;
class LLSpinCtrl;
class LLTextBox;
@@ -53,11 +57,17 @@ class LLVFS;
class LLPanelRegionGeneralInfo;
class LLPanelRegionDebugInfo;
-class LLPanelRegionTextureInfo;
class LLPanelRegionTerrainInfo;
class LLPanelEstateInfo;
class LLPanelEstateCovenant;
+class LLEventTimer;
+class LLEnvironmentSettings;
+class LLWLParamManager;
+class LLWaterParamManager;
+class LLWLParamSet;
+class LLWaterParamSet;
+
class LLFloaterRegionInfo : public LLFloater
{
friend class LLFloaterReg;
@@ -79,11 +89,13 @@ public:
static LLPanelEstateInfo* getPanelEstate();
static LLPanelEstateCovenant* getPanelCovenant();
+ static LLPanelRegionTerrainInfo* getPanelRegionTerrain();
// from LLPanel
virtual void refresh();
void requestRegionInfo();
+ void requestMeshRezInfo();
private:
@@ -91,6 +103,7 @@ private:
~LLFloaterRegionInfo();
protected:
+ void onTabSelected(const LLSD& param);
void refreshFromRegion(LLViewerRegion* region);
// member data
@@ -203,44 +216,25 @@ private:
/////////////////////////////////////////////////////////////////////////////
-class LLPanelRegionTextureInfo : public LLPanelRegionInfo
+class LLPanelRegionTerrainInfo : public LLPanelRegionInfo
{
+ LOG_CLASS(LLPanelRegionTerrainInfo);
+
public:
- LLPanelRegionTextureInfo();
- ~LLPanelRegionTextureInfo() {}
-
- virtual bool refreshFromRegion(LLViewerRegion* region);
-
- // LLPanel && LLView
- virtual BOOL postBuild();
+ LLPanelRegionTerrainInfo() : LLPanelRegionInfo() {}
+ ~LLPanelRegionTerrainInfo() {}
-protected:
- virtual BOOL sendUpdate();
+ virtual BOOL postBuild(); // LLPanel
- static void onClickDump(void* data);
- BOOL validateTextureSizes();
-};
+ virtual bool refreshFromRegion(LLViewerRegion* region); // refresh local settings from region update from simulator
+ void setEnvControls(bool available); // Whether environment settings are available for this region
-/////////////////////////////////////////////////////////////////////////////
+ BOOL validateTextureSizes();
-class LLPanelRegionTerrainInfo : public LLPanelRegionInfo
-{
-public:
- LLPanelRegionTerrainInfo()
- : LLPanelRegionInfo() {}
- ~LLPanelRegionTerrainInfo() {}
- // LLPanel
- virtual BOOL postBuild();
-
- virtual bool refreshFromRegion(LLViewerRegion* region);
+ //static void onChangeAnything(LLUICtrl* ctrl, void* userData); // callback for any change, to enable commit button
-protected:
virtual BOOL sendUpdate();
- void onChangeUseEstateTime();
- void onChangeFixedSun();
- void onChangeSunHour();
-
static void onClickDownloadRaw(void*);
static void onClickUploadRaw(void*);
static void onClickBakeTerrain(void*);
@@ -300,6 +294,9 @@ public:
void updateControls(LLViewerRegion* region);
+ static void updateEstateName(const std::string& name);
+ static void updateEstateOwnerName(const std::string& name);
+
virtual bool refreshFromRegion(LLViewerRegion* region);
virtual bool estateUpdate(LLMessageSystem* msg);
@@ -307,23 +304,9 @@ public:
virtual BOOL postBuild();
virtual void updateChild(LLUICtrl* child_ctrl);
virtual void refresh();
-
- U32 computeEstateFlags();
- void setEstateFlags(U32 flags);
-
- BOOL getGlobalTime();
- void setGlobalTime(bool b);
- BOOL getFixedSun();
-
- F32 getSunHour();
- void setSunHour(F32 sun_hour);
+ void refreshFromEstate();
- const std::string getEstateName() const;
- void setEstateName(const std::string& name);
-
- U32 getEstateID() const { return mEstateID; }
- void setEstateID(U32 estate_id) { mEstateID = estate_id; }
static bool isLindenEstate();
const std::string getOwnerName() const;
@@ -332,14 +315,11 @@ public:
// If visible from mainland, allowed agent and allowed groups
// are ignored, so must disable UI.
void setAccessAllowedEnabled(bool enable_agent, bool enable_group, bool enable_ban);
-
protected:
virtual BOOL sendUpdate();
// confirmation dialog callback
bool callbackChangeLindenEstate(const LLSD& notification, const LLSD& response);
- void commitEstateInfoDataserver();
- bool commitEstateInfoCaps();
void commitEstateAccess();
void commitEstateManagers();
@@ -412,4 +392,66 @@ protected:
EAssetStatus mAssetStatus;
};
+/////////////////////////////////////////////////////////////////////////////
+
+class LLPanelEnvironmentInfo : public LLPanelRegionInfo
+{
+ LOG_CLASS(LLPanelEnvironmentInfo);
+
+public:
+ LLPanelEnvironmentInfo();
+
+ // LLPanel
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void onOpen(const LLSD& key);
+
+ // LLView
+ /*virtual*/ void handleVisibilityChange(BOOL new_visibility);
+
+ // LLPanelRegionInfo
+ /*virtual*/ bool refreshFromRegion(LLViewerRegion* region);
+
+private:
+ void refresh();
+ void setControlsEnabled(bool enabled);
+ void setApplyProgress(bool started);
+ void setDirty(bool dirty);
+
+ void sendRegionSunUpdate();
+ void fixEstateSun();
+
+ void populateWaterPresetsList();
+ void populateSkyPresetsList();
+ void populateDayCyclesList();
+
+ bool getSelectedWaterParams(LLSD& water_params);
+ bool getSelectedSkyParams(LLSD& sky_params, std::string& preset_name);
+ bool getSelectedDayCycleParams(LLSD& day_cycle, LLSD& sky_map, short& scope);
+
+ void onSwitchRegionSettings();
+ void onSwitchDayCycle();
+
+ void onSelectWaterPreset();
+ void onSelectSkyPreset();
+ void onSelectDayCycle();
+
+ void onBtnApply();
+ void onBtnCancel();
+
+ void onRegionSettingschange();
+ void onRegionSettingsApplied(bool ok);
+
+ /// New environment settings that are being applied to the region.
+ LLEnvironmentSettings mNewRegionSettings;
+
+ bool mEnableEditing;
+
+ LLRadioGroup* mRegionSettingsRadioGroup;
+ LLRadioGroup* mDayCycleSettingsRadioGroup;
+
+ LLComboBox* mWaterPresetCombo;
+ LLComboBox* mSkyPresetCombo;
+ LLComboBox* mDayCyclePresetCombo;
+};
+
#endif
diff --git a/indra/newview/llfloaterreporter.cpp b/indra/newview/llfloaterreporter.cpp
index c08848b1ea..3ec1e372eb 100644
--- a/indra/newview/llfloaterreporter.cpp
+++ b/indra/newview/llfloaterreporter.cpp
@@ -285,7 +285,11 @@ void LLFloaterReporter::getObjectInfo(const LLUUID& object_id)
void LLFloaterReporter::onClickSelectAbuser()
{
- gFloaterView->getParentFloater(this)->addDependentFloater(LLFloaterAvatarPicker::show(boost::bind(&LLFloaterReporter::callbackAvatarID, this, _1, _2), FALSE, TRUE ));
+ LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(boost::bind(&LLFloaterReporter::callbackAvatarID, this, _1, _2), FALSE, TRUE );
+ if (picker)
+ {
+ gFloaterView->getParentFloater(this)->addDependentFloater(picker);
+ }
}
void LLFloaterReporter::callbackAvatarID(const uuid_vec_t& ids, const std::vector<LLAvatarName> names)
diff --git a/indra/newview/llfloaterreporter.h b/indra/newview/llfloaterreporter.h
index cd98f7be57..7d68431710 100644
--- a/indra/newview/llfloaterreporter.h
+++ b/indra/newview/llfloaterreporter.h
@@ -31,6 +31,7 @@
#include "llfloater.h"
#include "lluuid.h"
#include "v3math.h"
+#include "llextendedstatus.h"
class LLAvatarName;
class LLMessageSystem;
diff --git a/indra/newview/llfloaterscriptdebug.cpp b/indra/newview/llfloaterscriptdebug.cpp
index a0d1a32e12..b691db1049 100644
--- a/indra/newview/llfloaterscriptdebug.cpp
+++ b/indra/newview/llfloaterscriptdebug.cpp
@@ -106,7 +106,11 @@ void LLFloaterScriptDebug::addScriptLine(const std::string &utf8mesg, const std:
if (objectp)
{
objectp->setIcon(LLViewerTextureManager::getFetchedTextureFromFile("script_error.j2c", TRUE, LLViewerTexture::BOOST_UI));
- floater_label = llformat("%s(%.2f, %.2f)", user_name.c_str(), objectp->getPositionRegion().mV[VX], objectp->getPositionRegion().mV[VY]);
+ floater_label = llformat("%s(%.0f, %.0f, %.0f)",
+ user_name.c_str(),
+ objectp->getPositionRegion().mV[VX],
+ objectp->getPositionRegion().mV[VY],
+ objectp->getPositionRegion().mV[VZ]);
}
else
{
diff --git a/indra/newview/llfloatersearch.cpp b/indra/newview/llfloatersearch.cpp
index 3ed4aec89a..2a946b1edf 100644
--- a/indra/newview/llfloatersearch.cpp
+++ b/indra/newview/llfloatersearch.cpp
@@ -31,6 +31,7 @@
#include "llfloaterreg.h"
#include "llfloatersearch.h"
#include "llmediactrl.h"
+#include "llnotificationsutil.h"
#include "lllogininstance.h"
#include "lluri.h"
#include "llagent.h"
@@ -46,6 +47,12 @@ public:
LLSearchHandler() : LLCommandHandler("search", UNTRUSTED_THROTTLE) { }
bool handle(const LLSD& tokens, const LLSD& query_map, LLMediaCtrl* web)
{
+ if (!LLUI::sSettingGroups["config"]->getBOOL("EnableSearch"))
+ {
+ LLNotificationsUtil::add("NoSearch", LLSD(), LLSD(), std::string("SwitchToStandardSkinAndQuit"));
+ return true;
+ }
+
const size_t parts = tokens.size();
// get the (optional) category for the search
@@ -63,21 +70,24 @@ public:
}
// create the LLSD arguments for the search floater
- LLSD args;
- args["category"] = category;
- args["id"] = LLURI::unescape(search_text);
+ LLFloaterSearch::Params p;
+ p.search.category = category;
+ p.search.query = LLURI::unescape(search_text);
// open the search floater and perform the requested search
- LLFloaterReg::showInstance("search", args);
+ LLFloaterReg::showInstance("search", p);
return true;
}
};
LLSearchHandler gSearchHandler;
-LLFloaterSearch::LLFloaterSearch(const LLSD& key) :
- LLFloater(key),
- LLViewerMediaObserver(),
- mBrowser(NULL),
+LLFloaterSearch::SearchQuery::SearchQuery()
+: category("category", ""),
+ query("query")
+{}
+
+LLFloaterSearch::LLFloaterSearch(const Params& key) :
+ LLFloaterWebContent(key),
mSearchGodLevel(0)
{
// declare a map that transforms a category name into
@@ -95,53 +105,45 @@ LLFloaterSearch::LLFloaterSearch(const LLSD& key) :
BOOL LLFloaterSearch::postBuild()
{
- mBrowser = getChild<LLMediaCtrl>("browser");
- mBrowser->addObserver(this);
+ LLFloaterWebContent::postBuild();
+ mWebBrowser->addObserver(this);
return TRUE;
}
void LLFloaterSearch::onOpen(const LLSD& key)
{
- search(key);
+ Params p(key);
+ p.trusted_content = true;
+ p.allow_address_entry = false;
+
+ LLFloaterWebContent::onOpen(p);
+ search(p.search);
}
void LLFloaterSearch::onClose(bool app_quitting)
{
+ LLFloaterWebContent::onClose(app_quitting);
// tear down the web view so we don't show the previous search
// result when the floater is opened next time
destroy();
}
-void LLFloaterSearch::handleMediaEvent(LLPluginClassMedia *self, EMediaEvent event)
-{
- switch (event)
- {
- case MEDIA_EVENT_NAVIGATE_BEGIN:
- getChild<LLUICtrl>("status_text")->setValue(getString("loading_text"));
- break;
-
- case MEDIA_EVENT_NAVIGATE_COMPLETE:
- getChild<LLUICtrl>("status_text")->setValue(getString("done_text"));
- break;
-
- default:
- break;
- }
-}
-
void LLFloaterSearch::godLevelChanged(U8 godlevel)
{
// search results can change based upon god level - if the user
// changes god level, then give them a warning (we don't refresh
// the search as this might undo any page navigation or
// AJAX-driven changes since the last search).
- getChildView("refresh_search")->setVisible( (godlevel != mSearchGodLevel));
+
+ //FIXME: set status bar text
+
+ //getChildView("refresh_search")->setVisible( (godlevel != mSearchGodLevel));
}
-void LLFloaterSearch::search(const LLSD &key)
+void LLFloaterSearch::search(const SearchQuery &p)
{
- if (! mBrowser)
+ if (! mWebBrowser || !p.validateBlock())
{
return;
}
@@ -152,10 +154,9 @@ void LLFloaterSearch::search(const LLSD &key)
// work out the subdir to use based on the requested category
LLSD subs;
- std::string category = key.has("category") ? key["category"].asString() : "";
- if (mCategoryPaths.has(category))
+ if (mCategoryPaths.has(p.category))
{
- subs["CATEGORY"] = mCategoryPaths[category].asString();
+ subs["CATEGORY"] = mCategoryPaths[p.category].asString();
}
else
{
@@ -163,8 +164,7 @@ void LLFloaterSearch::search(const LLSD &key)
}
// add the search query string
- std::string search_text = key.has("id") ? key["id"].asString() : "";
- subs["QUERY"] = LLURI::escape(search_text);
+ subs["QUERY"] = LLURI::escape(p.query);
// add the permissions token that login.cgi gave us
// We use "search_token", and fallback to "auth_token" if not present.
@@ -200,5 +200,5 @@ void LLFloaterSearch::search(const LLSD &key)
url = LLWeb::expandURLSubstitutions(url, subs);
// and load the URL in the web view
- mBrowser->navigateTo(url);
+ mWebBrowser->navigateTo(url, "text/html");
}
diff --git a/indra/newview/llfloatersearch.h b/indra/newview/llfloatersearch.h
index ba4dc4c0fa..35b268e1b2 100644
--- a/indra/newview/llfloatersearch.h
+++ b/indra/newview/llfloatersearch.h
@@ -28,7 +28,7 @@
#ifndef LL_LLFLOATERSEARCH_H
#define LL_LLFLOATERSEARCH_H
-#include "llfloater.h"
+#include "llfloaterwebcontent.h"
#include "llviewermediaobserver.h"
#include <string>
@@ -43,11 +43,25 @@ class LLMediaCtrl;
/// so that the user can click on teleport links in search results.
///
class LLFloaterSearch :
- public LLFloater,
- public LLViewerMediaObserver
+ public LLFloaterWebContent
{
public:
- LLFloaterSearch(const LLSD& key);
+ struct SearchQuery : public LLInitParam::Block<SearchQuery>
+ {
+ Optional<std::string> category;
+ Optional<std::string> query;
+
+ SearchQuery();
+ };
+
+ struct _Params : public LLInitParam::Block<_Params, LLFloaterWebContent::Params>
+ {
+ Optional<SearchQuery> search;
+ };
+
+ typedef LLSDParamAdapter<_Params> Params;
+
+ LLFloaterSearch(const Params& key);
/// show the search floater with a new search
/// see search() for details on the key parameter.
@@ -60,7 +74,7 @@ public:
/// - "id": specifies the text phrase to search for
/// - "category": one of "all" (default), "people", "places",
/// "events", "groups", "wiki", "destinations", "classifieds"
- void search(const LLSD &key);
+ void search(const SearchQuery &query);
/// changing godmode can affect the search results that are
/// returned by the search website - use this method to tell the
@@ -70,10 +84,6 @@ public:
private:
/*virtual*/ BOOL postBuild();
- // inherited from LLViewerMediaObserver
- /*virtual*/ void handleMediaEvent(LLPluginClassMedia *self, EMediaEvent event);
-
- LLMediaCtrl *mBrowser;
LLSD mCategoryPaths;
U8 mSearchGodLevel;
};
diff --git a/indra/newview/llfloatersellland.cpp b/indra/newview/llfloatersellland.cpp
index 8558a1277c..64c0dfa023 100644
--- a/indra/newview/llfloatersellland.cpp
+++ b/indra/newview/llfloatersellland.cpp
@@ -41,6 +41,7 @@
#include "llviewerparcelmgr.h"
#include "lluictrlfactory.h"
#include "llviewerwindow.h"
+#include "lltrans.h"
class LLAvatarName;
@@ -391,8 +392,12 @@ void LLFloaterSellLandUI::onChangeValue(LLUICtrl *ctrl, void *userdata)
void LLFloaterSellLandUI::doSelectAgent()
{
+ LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(boost::bind(&LLFloaterSellLandUI::callbackAvatarPick, this, _1, _2), FALSE, TRUE);
// grandparent is a floater, in order to set up dependency
- addDependentFloater(LLFloaterAvatarPicker::show(boost::bind(&LLFloaterSellLandUI::callbackAvatarPick, this, _1, _2), FALSE, TRUE));
+ if (picker)
+ {
+ addDependentFloater(picker);
+ }
}
void LLFloaterSellLandUI::callbackAvatarPick(const uuid_vec_t& ids, const std::vector<LLAvatarName> names)
@@ -451,7 +456,7 @@ void LLFloaterSellLandUI::doSellLand(void *userdata)
// Do a confirmation
S32 sale_price = self->getChild<LLUICtrl>("price")->getValue();
S32 area = parcel->getArea();
- std::string authorizedBuyerName = "Anyone";
+ std::string authorizedBuyerName = LLTrans::getString("Anyone");
bool sell_to_anyone = true;
if ("user" == self->getChild<LLUICtrl>("sell_to")->getValue().asString())
{
diff --git a/indra/newview/llfloatersettingsdebug.cpp b/indra/newview/llfloatersettingsdebug.cpp
index 71882fbb83..07f5220ab7 100644
--- a/indra/newview/llfloatersettingsdebug.cpp
+++ b/indra/newview/llfloatersettingsdebug.cpp
@@ -178,7 +178,7 @@ void LLFloaterSettingsDebug::onClickDefault()
if (controlp)
{
- controlp->resetToDefault();
+ controlp->resetToDefault(true);
updateControl(controlp);
}
}
diff --git a/indra/newview/llfloatersidepanelcontainer.cpp b/indra/newview/llfloatersidepanelcontainer.cpp
new file mode 100644
index 0000000000..5385977d95
--- /dev/null
+++ b/indra/newview/llfloatersidepanelcontainer.cpp
@@ -0,0 +1,114 @@
+/**
+ * @file llfloatersidepanelcontainer.cpp
+ * @brief LLFloaterSidePanelContainer class definition
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloaterreg.h"
+#include "llfloatersidepanelcontainer.h"
+
+// newview includes
+#include "llsidetraypanelcontainer.h"
+#include "lltransientfloatermgr.h"
+
+//static
+const std::string LLFloaterSidePanelContainer::sMainPanelName("main_panel");
+
+LLFloaterSidePanelContainer::LLFloaterSidePanelContainer(const LLSD& key, const Params& params)
+: LLFloater(key, params)
+{
+ // Prevent transient floaters (e.g. IM windows) from hiding
+ // when this floater is clicked.
+ LLTransientFloaterMgr::getInstance()->addControlView(LLTransientFloaterMgr::GLOBAL, this);
+}
+
+LLFloaterSidePanelContainer::~LLFloaterSidePanelContainer()
+{
+ LLTransientFloaterMgr::getInstance()->removeControlView(LLTransientFloaterMgr::GLOBAL, this);
+}
+
+void LLFloaterSidePanelContainer::onOpen(const LLSD& key)
+{
+ getChild<LLPanel>(sMainPanelName)->onOpen(key);
+}
+
+LLPanel* LLFloaterSidePanelContainer::openChildPanel(const std::string& panel_name, const LLSD& params)
+{
+ LLView* view = findChildView(panel_name, true);
+ if (!view) return NULL;
+
+ if (!getVisible())
+ {
+ openFloater();
+ }
+
+ LLPanel* panel = NULL;
+
+ LLSideTrayPanelContainer* container = dynamic_cast<LLSideTrayPanelContainer*>(view->getParent());
+ if (container)
+ {
+ LLSD new_params = params;
+ new_params[LLSideTrayPanelContainer::PARAM_SUB_PANEL_NAME] = panel_name;
+ container->onOpen(new_params);
+
+ panel = container->getCurrentPanel();
+ }
+ else if ((panel = dynamic_cast<LLPanel*>(view)) != NULL)
+ {
+ panel->onOpen(params);
+ }
+
+ return panel;
+}
+
+void LLFloaterSidePanelContainer::showPanel(const std::string& floater_name, const LLSD& key)
+{
+ LLFloaterSidePanelContainer* floaterp = LLFloaterReg::getTypedInstance<LLFloaterSidePanelContainer>(floater_name);
+ if (floaterp)
+ {
+ floaterp->openChildPanel(sMainPanelName, key);
+ }
+}
+
+void LLFloaterSidePanelContainer::showPanel(const std::string& floater_name, const std::string& panel_name, const LLSD& key)
+{
+ LLFloaterSidePanelContainer* floaterp = LLFloaterReg::getTypedInstance<LLFloaterSidePanelContainer>(floater_name);
+ if (floaterp)
+ {
+ floaterp->openChildPanel(panel_name, key);
+ }
+}
+
+LLPanel* LLFloaterSidePanelContainer::getPanel(const std::string& floater_name, const std::string& panel_name)
+{
+ LLFloaterSidePanelContainer* floaterp = LLFloaterReg::getTypedInstance<LLFloaterSidePanelContainer>(floater_name);
+
+ if (floaterp)
+ {
+ return floaterp->findChild<LLPanel>(panel_name, true);
+ }
+
+ return NULL;
+}
diff --git a/indra/newview/llfloatersidepanelcontainer.h b/indra/newview/llfloatersidepanelcontainer.h
new file mode 100644
index 0000000000..10d85867ce
--- /dev/null
+++ b/indra/newview/llfloatersidepanelcontainer.h
@@ -0,0 +1,81 @@
+/**
+ * @file llfloatersidepanelcontainer.h
+ * @brief LLFloaterSidePanelContainer class
+ *
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLFLOATERSIDEPANELCONTAINER_H
+#define LL_LLFLOATERSIDEPANELCONTAINER_H
+
+#include "llfloater.h"
+
+/**
+ * Class LLFloaterSidePanelContainer
+ *
+ * Provides an interface for all former Side Tray panels.
+ *
+ * This class helps to make sure that clicking a floater containing the side panel
+ * doesn't make transient floaters (e.g. IM windows) hide, so that it's possible to
+ * drag an inventory item from My Inventory window to a docked IM window,
+ * i.e. share the item (see VWR-22891).
+ */
+class LLFloaterSidePanelContainer : public LLFloater
+{
+private:
+ static const std::string sMainPanelName;
+
+public:
+ LLFloaterSidePanelContainer(const LLSD& key, const Params& params = getDefaultParams());
+ ~LLFloaterSidePanelContainer();
+
+ /*virtual*/ void onOpen(const LLSD& key);
+
+ LLPanel* openChildPanel(const std::string& panel_name, const LLSD& params);
+
+ static void showPanel(const std::string& floater_name, const LLSD& key);
+
+ static void showPanel(const std::string& floater_name, const std::string& panel_name, const LLSD& key);
+
+ static LLPanel* getPanel(const std::string& floater_name, const std::string& panel_name = sMainPanelName);
+
+ /**
+ * Gets the panel of given type T (doesn't show it or do anything else with it).
+ *
+ * @param floater_name a string specifying the floater to be searched for a child panel.
+ * @param panel_name a string specifying the child panel to get.
+ * @returns a pointer to the panel of given type T.
+ */
+ template <typename T>
+ static T* getPanel(const std::string& floater_name, const std::string& panel_name = sMainPanelName)
+ {
+ T* panel = dynamic_cast<T*>(getPanel(floater_name, panel_name));
+ if (!panel)
+ {
+ llwarns << "Child named \"" << panel_name << "\" of type " << typeid(T*).name() << " not found" << llendl;
+ }
+ return panel;
+ }
+};
+
+#endif // LL_LLFLOATERSIDEPANELCONTAINER_H
diff --git a/indra/newview/llfloatersidetraytab.cpp b/indra/newview/llfloatersidetraytab.cpp
deleted file mode 100644
index f13b4db3a0..0000000000
--- a/indra/newview/llfloatersidetraytab.cpp
+++ /dev/null
@@ -1,45 +0,0 @@
-/**
- * @file llfloatersidetraytab.cpp
- * @brief LLFloaterSideTrayTab class definition
- *
- * $LicenseInfo:firstyear=2010&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llfloatersidetraytab.h"
-
-// newview includes
-#include "lltransientfloatermgr.h"
-
-LLFloaterSideTrayTab::LLFloaterSideTrayTab(const LLSD& key, const Params& params)
-: LLFloater(key, params)
-{
- // Prevent transient floaters (e.g. IM windows) from hiding
- // when this floater is clicked.
- LLTransientFloaterMgr::getInstance()->addControlView(LLTransientFloaterMgr::GLOBAL, this);
-}
-
-LLFloaterSideTrayTab::~LLFloaterSideTrayTab()
-{
- LLTransientFloaterMgr::getInstance()->removeControlView(LLTransientFloaterMgr::GLOBAL, this);
-}
diff --git a/indra/newview/llfloatersidetraytab.h b/indra/newview/llfloatersidetraytab.h
deleted file mode 100644
index e47f82e8ba..0000000000
--- a/indra/newview/llfloatersidetraytab.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/**
- * @file llfloatersidetraytab.h
- * @brief LLFloaterSideTrayTab class definition
- *
- * $LicenseInfo:firstyear=2010&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLFLOATERSIDETRAYTAB_H
-#define LL_LLFLOATERSIDETRAYTAB_H
-
-#include "llfloater.h"
-
-/**
- * When a side tray tab gets detached, it's wrapped in an instance of this class.
- *
- * This class helps to make sure that clicking a detached side tray tab doesn't
- * make transient floaters (e.g. IM windows) hide, so that it's possible to
- * drag an inventory item from detached My Inventory window to a docked IM window,
- * i.e. share the item (see VWR-22891).
- */
-class LLFloaterSideTrayTab : public LLFloater
-{
-public:
- LLFloaterSideTrayTab(const LLSD& key, const Params& params = getDefaultParams());
- ~LLFloaterSideTrayTab();
-};
-
-#endif // LL_LLFLOATERSIDETRAYTAB_H
diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp
index d55272c558..d8d62e5bbb 100644
--- a/indra/newview/llfloatersnapshot.cpp
+++ b/indra/newview/llfloatersnapshot.cpp
@@ -42,6 +42,8 @@
#include "llcombobox.h"
#include "lleconomy.h"
#include "lllandmarkactions.h"
+#include "llpanelsnapshot.h"
+#include "llsidetraypanelcontainer.h"
#include "llsliderctrl.h"
#include "llspinctrl.h"
#include "llviewercontrol.h"
@@ -50,9 +52,8 @@
#include "llviewercamera.h"
#include "llviewerwindow.h"
#include "llviewermenufile.h" // upload_new_resource()
-#include "llfloaterpostcard.h"
#include "llcheckboxctrl.h"
-#include "llradiogroup.h"
+#include "llslurl.h"
#include "lltoolfocus.h"
#include "lltoolmgr.h"
#include "llwebsharing.h"
@@ -75,18 +76,17 @@
#include "llimagej2c.h"
#include "lllocalcliprect.h"
#include "llnotificationsutil.h"
+#include "llpostcard.h"
#include "llresmgr.h" // LLLocale
#include "llvfile.h"
#include "llvfs.h"
+#include "llwebprofile.h"
#include "llwindow.h"
///----------------------------------------------------------------------------
/// Local function declarations, constants, enums, and typedefs
///----------------------------------------------------------------------------
-S32 LLFloaterSnapshot::sUIWinHeightLong = 530 ;
-S32 LLFloaterSnapshot::sUIWinHeightShort = LLFloaterSnapshot::sUIWinHeightLong - 240 ;
-S32 LLFloaterSnapshot::sUIWinWidth = 215 ;
-
+LLUICtrl* LLFloaterSnapshot::sThumbnailPlaceholder = NULL;
LLSnapshotFloaterView* gSnapshotFloaterView = NULL;
const F32 AUTO_SNAPSHOT_TIME_DELAY = 1.f;
@@ -107,6 +107,7 @@ static LLDefaultChildRegistry::Register<LLSnapshotFloaterView> r("snapshot_float
///----------------------------------------------------------------------------
class LLSnapshotLivePreview : public LLView
{
+ LOG_CLASS(LLSnapshotLivePreview);
public:
enum ESnapshotType
{
@@ -134,7 +135,11 @@ public:
/*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent);
void setSize(S32 w, S32 h);
+ void setWidth(S32 w) { mWidth[mCurImageIndex] = w; }
+ void setHeight(S32 h) { mHeight[mCurImageIndex] = h; }
void getSize(S32& w, S32& h) const;
+ S32 getWidth() const { return mWidth[mCurImageIndex]; }
+ S32 getHeight() const { return mHeight[mCurImageIndex]; }
S32 getDataSize() const { return mDataSize; }
void setMaxImageSize(S32 size) ;
S32 getMaxImageSize() {return mMaxImageSize ;}
@@ -151,8 +156,10 @@ public:
LLViewerTexture* getCurrentImage();
F32 getImageAspect();
F32 getAspect() ;
- LLRect getImageRect();
- BOOL isImageScaled();
+ const LLRect& getImageRect() const { return mImageRect[mCurImageIndex]; }
+ BOOL isImageScaled() const { return mImageScaled[mCurImageIndex]; }
+ void setImageScaled(BOOL scaled) { mImageScaled[mCurImageIndex] = scaled; }
+ const LLVector3d& getPosTakenGlobal() const { return mPosTakenGlobal; }
void setSnapshotType(ESnapshotType type) { mSnapshotType = type; }
void setSnapshotFormat(LLFloaterSnapshot::ESnapshotFormat type) { mSnapshotFormat = type; }
@@ -160,10 +167,13 @@ public:
void setSnapshotBufferType(LLViewerWindow::ESnapshotType type) { mSnapshotBufferType = type; }
void updateSnapshot(BOOL new_snapshot, BOOL new_thumbnail = FALSE, F32 delay = 0.f);
void saveWeb();
- LLFloaterPostcard* savePostcard();
void saveTexture();
BOOL saveLocal();
+ LLPointer<LLImageFormatted> getFormattedImage() const { return mFormattedImage; }
+ LLPointer<LLImageRaw> getEncodedImage() const { return mPreviewImageEncoded; }
+
+ /// Sets size of preview thumbnail image and thhe surrounding rect.
BOOL setThumbnailImageSize() ;
void generateThumbnailImage(BOOL force_update = FALSE) ;
void resetThumbnailImage() { mThumbnailImage = NULL ; }
@@ -292,7 +302,7 @@ LLViewerTexture* LLSnapshotLivePreview::getCurrentImage()
F32 LLSnapshotLivePreview::getAspect()
{
- F32 image_aspect_ratio = ((F32)mWidth[mCurImageIndex]) / ((F32)mHeight[mCurImageIndex]);
+ F32 image_aspect_ratio = ((F32)getWidth()) / ((F32)getHeight());
F32 window_aspect_ratio = ((F32)getRect().getWidth()) / ((F32)getRect().getHeight());
if (!mKeepAspectRatio)//gSavedSettings.getBOOL("KeepAspectForSnapshot"))
@@ -307,7 +317,7 @@ F32 LLSnapshotLivePreview::getAspect()
F32 LLSnapshotLivePreview::getImageAspect()
{
- if (!mViewerImage[mCurImageIndex])
+ if (!getCurrentImage())
{
return 0.f;
}
@@ -315,32 +325,24 @@ F32 LLSnapshotLivePreview::getImageAspect()
return getAspect() ;
}
-LLRect LLSnapshotLivePreview::getImageRect()
-{
- return mImageRect[mCurImageIndex];
-}
-
-BOOL LLSnapshotLivePreview::isImageScaled()
-{
- return mImageScaled[mCurImageIndex];
-}
-
void LLSnapshotLivePreview::updateSnapshot(BOOL new_snapshot, BOOL new_thumbnail, F32 delay)
-{
- if (mSnapshotUpToDate)
+{
+ // Invalidate current image.
+ lldebugs << "updateSnapshot: mSnapshotUpToDate = " << getSnapshotUpToDate() << llendl;
+ if (getSnapshotUpToDate())
{
S32 old_image_index = mCurImageIndex;
mCurImageIndex = (mCurImageIndex + 1) % 2;
- mWidth[mCurImageIndex] = mWidth[old_image_index];
- mHeight[mCurImageIndex] = mHeight[old_image_index];
+ setSize(mWidth[old_image_index], mHeight[old_image_index]);
mFallAnimTimer.start();
}
mSnapshotUpToDate = FALSE;
+ // Update snapshot source rect depending on whether we keep the aspect ratio.
LLRect& rect = mImageRect[mCurImageIndex];
rect.set(0, getRect().getHeight(), getRect().getWidth(), 0);
- F32 image_aspect_ratio = ((F32)mWidth[mCurImageIndex]) / ((F32)mHeight[mCurImageIndex]);
+ F32 image_aspect_ratio = ((F32)getWidth()) / ((F32)getHeight());
F32 window_aspect_ratio = ((F32)getRect().getWidth()) / ((F32)getRect().getHeight());
if (mKeepAspectRatio)//gSavedSettings.getBOOL("KeepAspectForSnapshot"))
@@ -361,17 +363,22 @@ void LLSnapshotLivePreview::updateSnapshot(BOOL new_snapshot, BOOL new_thumbnail
}
}
+ // Stop shining animation.
mShineAnimTimer.stop();
+
+ // Update snapshot if requested.
if (new_snapshot)
{
mSnapshotDelayTimer.start();
mSnapshotDelayTimer.setTimerExpirySec(delay);
+ LLFloaterSnapshot::preUpdate();
}
+
+ // Update thumbnail if requested.
if(new_thumbnail)
{
mThumbnailUpToDate = FALSE ;
}
- setThumbnailImageSize();
}
void LLSnapshotLivePreview::setSnapshotQuality(S32 quality)
@@ -427,26 +434,26 @@ void LLSnapshotLivePreview::drawPreviewRect(S32 offset_x, S32 offset_y)
//called when the frame is frozen.
void LLSnapshotLivePreview::draw()
{
- if (mViewerImage[mCurImageIndex].notNull() &&
+ if (getCurrentImage() &&
mPreviewImageEncoded.notNull() &&
- mSnapshotUpToDate)
+ getSnapshotUpToDate())
{
LLColor4 bg_color(0.f, 0.f, 0.3f, 0.4f);
gl_rect_2d(getRect(), bg_color);
- LLRect &rect = mImageRect[mCurImageIndex];
- LLRect shadow_rect = mImageRect[mCurImageIndex];
+ const LLRect& rect = getImageRect();
+ LLRect shadow_rect = rect;
shadow_rect.stretch(BORDER_WIDTH);
gl_drop_shadow(shadow_rect.mLeft, shadow_rect.mTop, shadow_rect.mRight, shadow_rect.mBottom, LLColor4(0.f, 0.f, 0.f, mNeedsFlash ? 0.f :0.5f), 10);
LLColor4 image_color(1.f, 1.f, 1.f, 1.f);
gGL.color4fv(image_color.mV);
- gGL.getTexUnit(0)->bind(mViewerImage[mCurImageIndex]);
+ gGL.getTexUnit(0)->bind(getCurrentImage());
// calculate UV scale
- F32 uv_width = mImageScaled[mCurImageIndex] ? 1.f : llmin((F32)mWidth[mCurImageIndex] / (F32)mViewerImage[mCurImageIndex]->getWidth(), 1.f);
- F32 uv_height = mImageScaled[mCurImageIndex] ? 1.f : llmin((F32)mHeight[mCurImageIndex] / (F32)mViewerImage[mCurImageIndex]->getHeight(), 1.f);
- glPushMatrix();
+ F32 uv_width = isImageScaled() ? 1.f : llmin((F32)getWidth() / (F32)getCurrentImage()->getWidth(), 1.f);
+ F32 uv_height = isImageScaled() ? 1.f : llmin((F32)getHeight() / (F32)getCurrentImage()->getHeight(), 1.f);
+ gGL.pushMatrix();
{
- glTranslatef((F32)rect.mLeft, (F32)rect.mBottom, 0.f);
+ gGL.translatef((F32)rect.mLeft, (F32)rect.mBottom, 0.f);
gGL.begin(LLRender::QUADS);
{
gGL.texCoord2f(uv_width, uv_height);
@@ -463,7 +470,7 @@ void LLSnapshotLivePreview::draw()
}
gGL.end();
}
- glPopMatrix();
+ gGL.popMatrix();
gGL.color4f(1.f, 1.f, 1.f, mFlashAlpha);
gl_rect_2d(getRect());
@@ -483,6 +490,7 @@ void LLSnapshotLivePreview::draw()
mFlashAlpha = lerp(mFlashAlpha, 0.f, LLCriticalDamp::getInterpolant(0.15f));
}
+ // Draw shining animation if appropriate.
if (mShineCountdown > 0)
{
mShineCountdown--;
@@ -493,6 +501,7 @@ void LLSnapshotLivePreview::draw()
}
else if (mShineAnimTimer.getStarted())
{
+ lldebugs << "Drawing shining animation" << llendl;
F32 shine_interp = llmin(1.f, mShineAnimTimer.getElapsedTimeF32() / SHINE_TIME);
// draw "shine" effect
@@ -537,7 +546,7 @@ void LLSnapshotLivePreview::draw()
{
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
gGL.color4f(1.f, 1.f, 1.f, 1.f);
- LLRect outline_rect = mImageRect[mCurImageIndex];
+ const LLRect& outline_rect = getImageRect();
gGL.begin(LLRender::QUADS);
{
gGL.vertex2i(outline_rect.mLeft - BORDER_WIDTH, outline_rect.mTop + BORDER_WIDTH);
@@ -569,6 +578,7 @@ void LLSnapshotLivePreview::draw()
S32 old_image_index = (mCurImageIndex + 1) % 2;
if (mViewerImage[old_image_index].notNull() && mFallAnimTimer.getElapsedTimeF32() < FALL_TIME)
{
+ lldebugs << "Drawing fall animation" << llendl;
F32 fall_interp = mFallAnimTimer.getElapsedTimeF32() / FALL_TIME;
F32 alpha = clamp_rescale(fall_interp, 0.f, 1.f, 0.8f, 0.4f);
LLColor4 image_color(1.f, 1.f, 1.f, alpha);
@@ -579,11 +589,11 @@ void LLSnapshotLivePreview::draw()
BOOL rescale = !mImageScaled[old_image_index] && mViewerImage[mCurImageIndex].notNull();
F32 uv_width = rescale ? llmin((F32)mWidth[old_image_index] / (F32)mViewerImage[mCurImageIndex]->getWidth(), 1.f) : 1.f;
F32 uv_height = rescale ? llmin((F32)mHeight[old_image_index] / (F32)mViewerImage[mCurImageIndex]->getHeight(), 1.f) : 1.f;
- glPushMatrix();
+ gGL.pushMatrix();
{
LLRect& rect = mImageRect[old_image_index];
- glTranslatef((F32)rect.mLeft, (F32)rect.mBottom - llround(getRect().getHeight() * 2.f * (fall_interp * fall_interp)), 0.f);
- glRotatef(-45.f * fall_interp, 0.f, 0.f, 1.f);
+ gGL.translatef((F32)rect.mLeft, (F32)rect.mBottom - llround(getRect().getHeight() * 2.f * (fall_interp * fall_interp)), 0.f);
+ gGL.rotatef(-45.f * fall_interp, 0.f, 0.f, 1.f);
gGL.begin(LLRender::QUADS);
{
gGL.texCoord2f(uv_width, uv_height);
@@ -600,7 +610,7 @@ void LLSnapshotLivePreview::draw()
}
gGL.end();
}
- glPopMatrix();
+ gGL.popMatrix();
}
}
}
@@ -612,13 +622,14 @@ void LLSnapshotLivePreview::reshape(S32 width, S32 height, BOOL called_from_pare
LLView::reshape(width, height, called_from_parent);
if (old_rect.getWidth() != width || old_rect.getHeight() != height)
{
+ lldebugs << "window reshaped, updating thumbnail" << llendl;
updateSnapshot(FALSE, TRUE);
}
}
BOOL LLSnapshotLivePreview::setThumbnailImageSize()
{
- if(mWidth[mCurImageIndex] < 10 || mHeight[mCurImageIndex] < 10)
+ if(getWidth() < 10 || getHeight() < 10)
{
return FALSE ;
}
@@ -628,8 +639,10 @@ BOOL LLSnapshotLivePreview::setThumbnailImageSize()
F32 window_aspect_ratio = ((F32)window_width) / ((F32)window_height);
// UI size for thumbnail
- S32 max_width = LLFloaterSnapshot::getUIWinWidth() - 20;
- S32 max_height = 90;
+ // *FIXME: the rect does not change, so maybe there's no need to recalculate max w/h.
+ const LLRect& thumbnail_rect = LLFloaterSnapshot::getThumbnailPlaceholderRect();
+ S32 max_width = thumbnail_rect.getWidth();
+ S32 max_height = thumbnail_rect.getHeight();
if (window_aspect_ratio > (F32)max_width / max_height)
{
@@ -652,11 +665,11 @@ BOOL LLSnapshotLivePreview::setThumbnailImageSize()
S32 left = 0 , top = mThumbnailHeight, right = mThumbnailWidth, bottom = 0 ;
if(!mKeepAspectRatio)
{
- F32 ratio_x = (F32)mWidth[mCurImageIndex] / window_width ;
- F32 ratio_y = (F32)mHeight[mCurImageIndex] / window_height ;
+ F32 ratio_x = (F32)getWidth() / window_width ;
+ F32 ratio_y = (F32)getHeight() / window_height ;
- //if(mWidth[mCurImageIndex] > window_width ||
- // mHeight[mCurImageIndex] > window_height )
+ //if(getWidth() > window_width ||
+ // getHeight() > window_height )
{
if(ratio_x > ratio_y)
{
@@ -688,11 +701,11 @@ void LLSnapshotLivePreview::generateThumbnailImage(BOOL force_update)
{
return ;
}
- if(mThumbnailUpToDate && !force_update)//already updated
+ if(getThumbnailUpToDate() && !force_update)//already updated
{
return ;
}
- if(mWidth[mCurImageIndex] < 10 || mHeight[mCurImageIndex] < 10)
+ if(getWidth() < 10 || getHeight() < 10)
{
return ;
}
@@ -712,25 +725,19 @@ void LLSnapshotLivePreview::generateThumbnailImage(BOOL force_update)
resetThumbnailImage() ;
}
- LLPointer<LLImageRaw> raw = NULL ;
- S32 w , h ;
- w = get_lower_power_two(mThumbnailWidth, 512) * 2 ;
- h = get_lower_power_two(mThumbnailHeight, 512) * 2 ;
-
+ LLPointer<LLImageRaw> raw = new LLImageRaw;
+ if(!gViewerWindow->thumbnailSnapshot(raw,
+ mThumbnailWidth, mThumbnailHeight,
+ gSavedSettings.getBOOL("RenderUIInSnapshot"),
+ FALSE,
+ mSnapshotBufferType) )
{
- raw = new LLImageRaw ;
- if(!gViewerWindow->thumbnailSnapshot(raw,
- w, h,
- gSavedSettings.getBOOL("RenderUIInSnapshot"),
- FALSE,
- mSnapshotBufferType) )
- {
- raw = NULL ;
- }
+ raw = NULL ;
}
if(raw)
{
+ raw->expandToPowerOfTwo();
mThumbnailImage = LLViewerTextureManager::getLocalTexture(raw.get(), FALSE);
mThumbnailUpToDate = TRUE ;
}
@@ -745,8 +752,14 @@ void LLSnapshotLivePreview::generateThumbnailImage(BOOL force_update)
//static
BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview )
{
- LLSnapshotLivePreview* previewp = (LLSnapshotLivePreview*)snapshot_preview;
+ LLSnapshotLivePreview* previewp = (LLSnapshotLivePreview*)snapshot_preview;
+ if (previewp->getWidth() == 0 || previewp->getHeight() == 0)
+ {
+ llwarns << "Incorrect dimensions: " << previewp->getWidth() << "x" << previewp->getHeight() << llendl;
+ return FALSE;
+ }
+ // If we're in freeze-frame mode and camera has moved, update snapshot.
LLVector3 new_camera_pos = LLViewerCamera::getInstance()->getOrigin();
LLQuaternion new_camera_rot = LLViewerCamera::getInstance()->getQuaternion();
if (gSavedSettings.getBOOL("FreezeTime") &&
@@ -756,6 +769,7 @@ BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview )
previewp->mCameraRot = new_camera_rot;
// request a new snapshot whenever the camera moves, with a time delay
BOOL autosnap = gSavedSettings.getBOOL("AutoSnapshot");
+ lldebugs << "camera moved, updating thumbnail" << llendl;
previewp->updateSnapshot(
autosnap, // whether a new snapshot is needed or merely invalidate the existing one
FALSE, // or if 1st arg is false, whether to produce a new thumbnail image.
@@ -772,7 +786,9 @@ BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview )
}
// time to produce a snapshot
+ previewp->setThumbnailImageSize();
+ lldebugs << "producing snapshot" << llendl;
if (!previewp->mPreviewImage)
{
previewp->mPreviewImage = new LLImageRaw;
@@ -787,13 +803,13 @@ BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview )
previewp->setEnabled(FALSE);
previewp->getWindow()->incBusyCount();
- previewp->mImageScaled[previewp->mCurImageIndex] = FALSE;
+ previewp->setImageScaled(FALSE);
// grab the raw image and encode it into desired format
if(gViewerWindow->rawSnapshot(
previewp->mPreviewImage,
- previewp->mWidth[previewp->mCurImageIndex],
- previewp->mHeight[previewp->mCurImageIndex],
+ previewp->getWidth(),
+ previewp->getHeight(),
previewp->mKeepAspectRatio,//gSavedSettings.getBOOL("KeepAspectForSnapshot"),
previewp->getSnapshotType() == LLSnapshotLivePreview::SNAPSHOT_TEXTURE,
gSavedSettings.getBOOL("RenderUIInSnapshot"),
@@ -808,6 +824,7 @@ BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview )
if(previewp->getSnapshotType() == SNAPSHOT_TEXTURE)
{
+ lldebugs << "Encoding new image of format J2C" << llendl;
LLPointer<LLImageJ2C> formatted = new LLImageJ2C;
LLPointer<LLImageRaw> scaled = new LLImageRaw(
previewp->mPreviewImage->getData(),
@@ -815,8 +832,8 @@ BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview )
previewp->mPreviewImage->getHeight(),
previewp->mPreviewImage->getComponents());
- scaled->biasedScaleToPowerOfTwo(512);
- previewp->mImageScaled[previewp->mCurImageIndex] = TRUE;
+ scaled->biasedScaleToPowerOfTwo(MAX_TEXTURE_SIZE);
+ previewp->setImageScaled(TRUE);
if (formatted->encode(scaled, 0.f))
{
previewp->mDataSize = formatted->getDataSize();
@@ -828,18 +845,8 @@ BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview )
// delete any existing image
previewp->mFormattedImage = NULL;
// now create the new one of the appropriate format.
- // note: postcards and web hardcoded to use jpeg always.
- LLFloaterSnapshot::ESnapshotFormat format;
-
- if (previewp->getSnapshotType() == SNAPSHOT_POSTCARD ||
- previewp->getSnapshotType() == SNAPSHOT_WEB)
- {
- format = LLFloaterSnapshot::SNAPSHOT_FORMAT_JPEG;
- }
- else
- {
- format = previewp->getSnapshotFormat();
- }
+ LLFloaterSnapshot::ESnapshotFormat format = previewp->getSnapshotFormat();
+ lldebugs << "Encoding new image of format " << format << llendl;
switch(format)
{
@@ -881,7 +888,7 @@ BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview )
{
// go ahead and shrink image to appropriate power of 2 for display
scaled->biasedScaleToPowerOfTwo(1024);
- previewp->mImageScaled[previewp->mCurImageIndex] = TRUE;
+ previewp->setImageScaled(TRUE);
}
else
{
@@ -919,56 +926,28 @@ BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview )
{
previewp->generateThumbnailImage() ;
}
+ lldebugs << "done creating snapshot" << llendl;
+ LLFloaterSnapshot::postUpdate();
return TRUE;
}
void LLSnapshotLivePreview::setSize(S32 w, S32 h)
{
- mWidth[mCurImageIndex] = w;
- mHeight[mCurImageIndex] = h;
+ lldebugs << "setSize(" << w << ", " << h << ")" << llendl;
+ setWidth(w);
+ setHeight(h);
}
void LLSnapshotLivePreview::getSize(S32& w, S32& h) const
{
- w = mWidth[mCurImageIndex];
- h = mHeight[mCurImageIndex];
-}
-
-LLFloaterPostcard* LLSnapshotLivePreview::savePostcard()
-{
- if(mViewerImage[mCurImageIndex].isNull())
- {
- //this should never happen!!
- llwarns << "The snapshot image has not been generated!" << llendl ;
- return NULL ;
- }
-
- // calculate and pass in image scale in case image data only use portion
- // of viewerimage buffer
- LLVector2 image_scale(1.f, 1.f);
- if (!isImageScaled())
- {
- image_scale.setVec(llmin(1.f, (F32)mWidth[mCurImageIndex] / (F32)getCurrentImage()->getWidth()), llmin(1.f, (F32)mHeight[mCurImageIndex] / (F32)getCurrentImage()->getHeight()));
- }
-
- LLImageJPEG* jpg = dynamic_cast<LLImageJPEG*>(mFormattedImage.get());
- if(!jpg)
- {
- llwarns << "Formatted image not a JPEG" << llendl;
- return NULL;
- }
- LLFloaterPostcard* floater = LLFloaterPostcard::showFromSnapshot(jpg, mViewerImage[mCurImageIndex], image_scale, mPosTakenGlobal);
- // relinquish lifetime of jpeg image to postcard floater
- mFormattedImage = NULL;
- mDataSize = 0;
- updateSnapshot(FALSE, FALSE);
-
- return floater;
+ w = getWidth();
+ h = getHeight();
}
void LLSnapshotLivePreview::saveTexture()
{
+ lldebugs << "saving texture: " << mPreviewImage->getWidth() << "x" << mPreviewImage->getHeight() << llendl;
// gen a new uuid for this asset
LLTransactionID tid;
tid.generate();
@@ -980,8 +959,9 @@ void LLSnapshotLivePreview::saveTexture()
mPreviewImage->getHeight(),
mPreviewImage->getComponents());
- scaled->biasedScaleToPowerOfTwo(512);
-
+ scaled->biasedScaleToPowerOfTwo(MAX_TEXTURE_SIZE);
+ lldebugs << "scaled texture to " << scaled->getWidth() << "x" << scaled->getHeight() << llendl;
+
if (formatted->encode(scaled, 0.0f))
{
LLVFile::writeFile(formatted->getData(), formatted->getDataSize(), gVFS, new_asset_id, LLAssetType::AT_TEXTURE);
@@ -1004,6 +984,7 @@ void LLSnapshotLivePreview::saveTexture()
LLFloaterPerms::getEveryonePerms(),
"Snapshot : " + pos_string,
callback, expected_upload_cost, userdata);
+ gViewerWindow->playSnapshotAnimAndSound();
}
else
{
@@ -1020,11 +1001,10 @@ BOOL LLSnapshotLivePreview::saveLocal()
{
BOOL success = gViewerWindow->saveImageNumbered(mFormattedImage);
- // Relinquish image memory. Save button will be disabled as a side-effect.
- mFormattedImage = NULL;
- mDataSize = 0;
- updateSnapshot(FALSE, FALSE);
-
+ if(success)
+ {
+ gViewerWindow->playSnapshotAnimAndSound();
+ }
return success;
}
@@ -1044,6 +1024,8 @@ void LLSnapshotLivePreview::saveWeb()
LLLandmarkActions::getRegionNameAndCoordsFromPosGlobal(gAgentCamera.getCameraPositionGlobal(),
boost::bind(&LLSnapshotLivePreview::regionNameCallback, this, jpg, metadata, _1, _2, _3, _4));
+
+ gViewerWindow->playSnapshotAnimAndSound();
}
void LLSnapshotLivePreview::regionNameCallback(LLImageJPEG* snapshot, LLSD& metadata, const std::string& name, S32 x, S32 y, S32 z)
@@ -1059,11 +1041,21 @@ void LLSnapshotLivePreview::regionNameCallback(LLImageJPEG* snapshot, LLSD& meta
class LLFloaterSnapshot::Impl
{
+ LOG_CLASS(LLFloaterSnapshot::Impl);
public:
+ typedef enum e_status
+ {
+ STATUS_READY,
+ STATUS_WORKING,
+ STATUS_FINISHED
+ } EStatus;
+
Impl()
: mAvatarPauseHandles(),
mLastToolset(NULL),
- mAspectRatioCheckOff(false)
+ mAspectRatioCheckOff(false),
+ mNeedRefresh(false),
+ mStatus(STATUS_READY)
{
}
~Impl()
@@ -1072,43 +1064,49 @@ public:
mAvatarPauseHandles.clear();
}
- static void onClickDiscard(void* data);
- static void onClickKeep(void* data);
- static void onCommitSave(LLUICtrl* ctrl, void* data);
static void onClickNewSnapshot(void* data);
static void onClickAutoSnap(LLUICtrl *ctrl, void* data);
//static void onClickAdvanceSnap(LLUICtrl *ctrl, void* data);
- static void onClickLess(void* data) ;
static void onClickMore(void* data) ;
static void onClickUICheck(LLUICtrl *ctrl, void* data);
static void onClickHUDCheck(LLUICtrl *ctrl, void* data);
- static void onClickKeepOpenCheck(LLUICtrl *ctrl, void* data);
- static void onClickKeepAspectCheck(LLUICtrl *ctrl, void* data);
- static void onCommitQuality(LLUICtrl* ctrl, void* data);
- static void onCommitResolution(LLUICtrl* ctrl, void* data) { updateResolution(ctrl, data); }
+ static void applyKeepAspectCheck(LLFloaterSnapshot* view, BOOL checked);
static void updateResolution(LLUICtrl* ctrl, void* data, BOOL do_update = TRUE);
static void onCommitFreezeFrame(LLUICtrl* ctrl, void* data);
static void onCommitLayerTypes(LLUICtrl* ctrl, void*data);
- static void onCommitSnapshotType(LLUICtrl* ctrl, void* data);
- static void onCommitSnapshotFormat(LLUICtrl* ctrl, void* data);
- static void onCommitCustomResolution(LLUICtrl *ctrl, void* data);
- static void resetSnapshotSizeOnUI(LLFloaterSnapshot *view, S32 width, S32 height) ;
+ static void onImageQualityChange(LLFloaterSnapshot* view, S32 quality_val);
+ static void onImageFormatChange(LLFloaterSnapshot* view);
+ static void applyCustomResolution(LLFloaterSnapshot* view, S32 w, S32 h);
+ static void onSnapshotUploadFinished(bool status);
+ static void onSendingPostcardFinished(bool status);
static BOOL checkImageSize(LLSnapshotLivePreview* previewp, S32& width, S32& height, BOOL isWidthChanged, S32 max_value);
+ static void setImageSizeSpinnersValues(LLFloaterSnapshot *view, S32 width, S32 height) ;
+ static void updateSpinners(LLFloaterSnapshot* view, LLSnapshotLivePreview* previewp, S32& width, S32& height, BOOL is_width_changed);
+
+ static LLPanelSnapshot* getActivePanel(LLFloaterSnapshot* floater, bool ok_if_not_found = true);
+ static LLSnapshotLivePreview::ESnapshotType getActiveSnapshotType(LLFloaterSnapshot* floater);
+ static LLFloaterSnapshot::ESnapshotFormat getImageFormat(LLFloaterSnapshot* floater);
+ static LLSpinCtrl* getWidthSpinner(LLFloaterSnapshot* floater);
+ static LLSpinCtrl* getHeightSpinner(LLFloaterSnapshot* floater);
+ static void enableAspectRatioCheckbox(LLFloaterSnapshot* floater, BOOL enable);
+ static void setAspectRatioCheckboxValue(LLFloaterSnapshot* floater, BOOL checked);
static LLSnapshotLivePreview* getPreviewView(LLFloaterSnapshot *floater);
static void setResolution(LLFloaterSnapshot* floater, const std::string& comboname);
static void updateControls(LLFloaterSnapshot* floater);
static void updateLayout(LLFloaterSnapshot* floater);
- static void updateResolutionTextEntry(LLFloaterSnapshot* floater);
+ static void setStatus(EStatus status, bool ok = true, const std::string& msg = LLStringUtil::null);
+ EStatus getStatus() const { return mStatus; }
+ static void setNeedRefresh(LLFloaterSnapshot* floater, bool need);
private:
- static LLSnapshotLivePreview::ESnapshotType getTypeIndex(LLFloaterSnapshot* floater);
- static LLSD getTypeName(LLSnapshotLivePreview::ESnapshotType index);
- static ESnapshotFormat getFormatIndex(LLFloaterSnapshot* floater);
static LLViewerWindow::ESnapshotType getLayerType(LLFloaterSnapshot* floater);
static void comboSetCustom(LLFloaterSnapshot *floater, const std::string& comboname);
static void checkAutoSnapshot(LLSnapshotLivePreview* floater, BOOL update_thumbnail = FALSE);
static void checkAspectRatio(LLFloaterSnapshot *view, S32 index) ;
+ static void setWorking(LLFloaterSnapshot* floater, bool working);
+ static void setFinished(LLFloaterSnapshot* floater, bool finished, bool ok = true, const std::string& msg = LLStringUtil::null);
+
public:
std::vector<LLAnimPauseRequest> mAvatarPauseHandles;
@@ -1116,84 +1114,98 @@ public:
LLToolset* mLastToolset;
LLHandle<LLView> mPreviewHandle;
bool mAspectRatioCheckOff ;
+ bool mNeedRefresh;
+ EStatus mStatus;
};
// static
-LLSnapshotLivePreview* LLFloaterSnapshot::Impl::getPreviewView(LLFloaterSnapshot *floater)
+LLPanelSnapshot* LLFloaterSnapshot::Impl::getActivePanel(LLFloaterSnapshot* floater, bool ok_if_not_found)
{
- LLSnapshotLivePreview* previewp = (LLSnapshotLivePreview*)floater->impl.mPreviewHandle.get();
- return previewp;
+ LLSideTrayPanelContainer* panel_container = floater->getChild<LLSideTrayPanelContainer>("panel_container");
+ LLPanelSnapshot* active_panel = dynamic_cast<LLPanelSnapshot*>(panel_container->getCurrentPanel());
+ if (!ok_if_not_found)
+ {
+ llassert_always(active_panel != NULL);
+ }
+ return active_panel;
}
// static
-LLSnapshotLivePreview::ESnapshotType LLFloaterSnapshot::Impl::getTypeIndex(LLFloaterSnapshot* floater)
+LLSnapshotLivePreview::ESnapshotType LLFloaterSnapshot::Impl::getActiveSnapshotType(LLFloaterSnapshot* floater)
{
- LLSnapshotLivePreview::ESnapshotType index = LLSnapshotLivePreview::SNAPSHOT_POSTCARD;
- LLSD value = floater->getChild<LLUICtrl>("snapshot_type_radio")->getValue();
+ LLSnapshotLivePreview::ESnapshotType type = LLSnapshotLivePreview::SNAPSHOT_WEB;
+ std::string name;
+ LLPanelSnapshot* spanel = getActivePanel(floater);
- const std::string id = value.asString();
- if (id == "postcard")
+ if (spanel)
{
- index = LLSnapshotLivePreview::SNAPSHOT_POSTCARD;
+ name = spanel->getName();
}
- else if (id == "texture")
+
+ if (name == "panel_snapshot_postcard")
{
- index = LLSnapshotLivePreview::SNAPSHOT_TEXTURE;
+ type = LLSnapshotLivePreview::SNAPSHOT_POSTCARD;
}
- else if (id == "local")
+ else if (name == "panel_snapshot_inventory")
{
- index = LLSnapshotLivePreview::SNAPSHOT_LOCAL;
+ type = LLSnapshotLivePreview::SNAPSHOT_TEXTURE;
}
- else if (id == "share_to_web")
+ else if (name == "panel_snapshot_local")
{
- index = LLSnapshotLivePreview::SNAPSHOT_WEB;
+ type = LLSnapshotLivePreview::SNAPSHOT_LOCAL;
}
- return index;
+ return type;
+}
+
+// static
+LLFloaterSnapshot::ESnapshotFormat LLFloaterSnapshot::Impl::getImageFormat(LLFloaterSnapshot* floater)
+{
+ LLPanelSnapshot* active_panel = getActivePanel(floater);
+ // FIXME: if the default is not PNG, profile uploads may fail.
+ return active_panel ? active_panel->getImageFormat() : LLFloaterSnapshot::SNAPSHOT_FORMAT_PNG;
+}
+
+// static
+LLSpinCtrl* LLFloaterSnapshot::Impl::getWidthSpinner(LLFloaterSnapshot* floater)
+{
+ LLPanelSnapshot* active_panel = getActivePanel(floater);
+ return active_panel ? active_panel->getWidthSpinner() : floater->getChild<LLSpinCtrl>("snapshot_width");
+}
+
+// static
+LLSpinCtrl* LLFloaterSnapshot::Impl::getHeightSpinner(LLFloaterSnapshot* floater)
+{
+ LLPanelSnapshot* active_panel = getActivePanel(floater);
+ return active_panel ? active_panel->getHeightSpinner() : floater->getChild<LLSpinCtrl>("snapshot_height");
}
// static
-LLSD LLFloaterSnapshot::Impl::getTypeName(LLSnapshotLivePreview::ESnapshotType index)
+void LLFloaterSnapshot::Impl::enableAspectRatioCheckbox(LLFloaterSnapshot* floater, BOOL enable)
{
- std::string id;
- switch (index)
+ LLPanelSnapshot* active_panel = getActivePanel(floater);
+ if (active_panel)
{
- case LLSnapshotLivePreview::SNAPSHOT_WEB:
- id = "share_to_web";
- break;
- case LLSnapshotLivePreview::SNAPSHOT_POSTCARD:
- id = "postcard";
- break;
- case LLSnapshotLivePreview::SNAPSHOT_TEXTURE:
- id = "texture";
- break;
- case LLSnapshotLivePreview::SNAPSHOT_LOCAL:
- default:
- id = "local";
- break;
+ active_panel->enableAspectRatioCheckbox(enable);
}
- return LLSD(id);
}
// static
-LLFloaterSnapshot::ESnapshotFormat LLFloaterSnapshot::Impl::getFormatIndex(LLFloaterSnapshot* floater)
+void LLFloaterSnapshot::Impl::setAspectRatioCheckboxValue(LLFloaterSnapshot* floater, BOOL checked)
{
- ESnapshotFormat index = SNAPSHOT_FORMAT_PNG;
- if(floater->hasChild("local_format_combo"))
+ LLPanelSnapshot* active_panel = getActivePanel(floater);
+ if (active_panel)
{
- LLComboBox* local_format_combo = floater->findChild<LLComboBox>("local_format_combo");
- const std::string id = local_format_combo->getSelectedItemLabel();
- if (id == "PNG")
- index = SNAPSHOT_FORMAT_PNG;
- else if (id == "JPEG")
- index = SNAPSHOT_FORMAT_JPEG;
- else if (id == "BMP")
- index = SNAPSHOT_FORMAT_BMP;
+ active_panel->getChild<LLUICtrl>(active_panel->getAspectRatioCBName())->setValue(checked);
}
- return index;
}
-
+// static
+LLSnapshotLivePreview* LLFloaterSnapshot::Impl::getPreviewView(LLFloaterSnapshot *floater)
+{
+ LLSnapshotLivePreview* previewp = (LLSnapshotLivePreview*)floater->impl.mPreviewHandle.get();
+ return previewp;
+}
// static
LLViewerWindow::ESnapshotType LLFloaterSnapshot::Impl::getLayerType(LLFloaterSnapshot* floater)
@@ -1221,20 +1233,28 @@ void LLFloaterSnapshot::Impl::updateLayout(LLFloaterSnapshot* floaterp)
{
LLSnapshotLivePreview* previewp = getPreviewView(floaterp);
- S32 delta_height = gSavedSettings.getBOOL("AdvanceSnapshot") ? 0 : floaterp->getUIWinHeightShort() - floaterp->getUIWinHeightLong() ;
+ BOOL advanced = gSavedSettings.getBOOL("AdvanceSnapshot");
- if(!gSavedSettings.getBOOL("AdvanceSnapshot")) //set to original window resolution
+ // Show/hide advanced options.
+ LLPanel* advanced_options_panel = floaterp->getChild<LLPanel>("advanced_options_panel");
+ floaterp->getChild<LLButton>("advanced_options_btn")->setImageOverlay(advanced ? "TabIcon_Open_Off" : "TabIcon_Close_Off");
+ if (advanced != advanced_options_panel->getVisible())
+ {
+ S32 panel_width = advanced_options_panel->getRect().getWidth();
+ floaterp->getChild<LLPanel>("advanced_options_panel")->setVisible(advanced);
+ S32 floater_width = floaterp->getRect().getWidth();
+ floater_width += (advanced ? panel_width : -panel_width);
+ floaterp->reshape(floater_width, floaterp->getRect().getHeight());
+ }
+
+ if(!advanced) //set to original window resolution
{
previewp->mKeepAspectRatio = TRUE;
+ floaterp->getChild<LLComboBox>("profile_size_combo")->setCurrentByIndex(0);
floaterp->getChild<LLComboBox>("postcard_size_combo")->setCurrentByIndex(0);
- gSavedSettings.setS32("SnapshotPostcardLastResolution", 0);
-
floaterp->getChild<LLComboBox>("texture_size_combo")->setCurrentByIndex(0);
- gSavedSettings.setS32("SnapshotTextureLastResolution", 0);
-
floaterp->getChild<LLComboBox>("local_size_combo")->setCurrentByIndex(0);
- gSavedSettings.setS32("SnapshotLocalLastResolution", 0);
LLSnapshotLivePreview* previewp = getPreviewView(floaterp);
previewp->setSize(gViewerWindow->getWindowWidthRaw(), gViewerWindow->getWindowHeightRaw());
@@ -1248,7 +1268,8 @@ void LLFloaterSnapshot::Impl::updateLayout(LLFloaterSnapshot* floaterp)
floaterp->getParent()->setMouseOpaque(TRUE);
// shrink to smaller layout
- floaterp->reshape(floaterp->getRect().getWidth(), floaterp->getUIWinHeightLong() + delta_height);
+ // *TODO: unneeded?
+ floaterp->reshape(floaterp->getRect().getWidth(), floaterp->getRect().getHeight());
// can see and interact with fullscreen preview now
if (previewp)
@@ -1278,7 +1299,8 @@ void LLFloaterSnapshot::Impl::updateLayout(LLFloaterSnapshot* floaterp)
else // turning off freeze frame mode
{
floaterp->getParent()->setMouseOpaque(FALSE);
- floaterp->reshape(floaterp->getRect().getWidth(), floaterp->getUIWinHeightLong() + delta_height);
+ // *TODO: unneeded?
+ floaterp->reshape(floaterp->getRect().getWidth(), floaterp->getRect().getHeight());
if (previewp)
{
previewp->setVisible(FALSE);
@@ -1304,68 +1326,75 @@ void LLFloaterSnapshot::Impl::updateLayout(LLFloaterSnapshot* floaterp)
// No other methods should be changing any of the controls directly except for helpers called by this method.
// The basic pattern for programmatically changing the GUI settings is to first set the
// appropriate saved settings and then call this method to sync the GUI with them.
+// FIXME: The above comment seems obsolete now.
// static
void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshot* floater)
{
- LLRadioGroup* snapshot_type_radio = floater->getChild<LLRadioGroup>("snapshot_type_radio");
- LLSnapshotLivePreview::ESnapshotType shot_type = (LLSnapshotLivePreview::ESnapshotType)gSavedSettings.getS32("LastSnapshotType");
- snapshot_type_radio->setSelectedByValue(getTypeName(shot_type), true);
-
+ LLSnapshotLivePreview::ESnapshotType shot_type = getActiveSnapshotType(floater);
ESnapshotFormat shot_format = (ESnapshotFormat)gSavedSettings.getS32("SnapshotFormat");
LLViewerWindow::ESnapshotType layer_type = getLayerType(floater);
+#if 0
floater->getChildView("share_to_web")->setVisible( gSavedSettings.getBOOL("SnapshotSharingEnabled"));
+#endif
- floater->getChildView("postcard_size_combo")->setVisible( FALSE);
- floater->getChildView("texture_size_combo")->setVisible( FALSE);
- floater->getChildView("local_size_combo")->setVisible( FALSE);
-
- floater->getChild<LLComboBox>("postcard_size_combo")->selectNthItem(gSavedSettings.getS32("SnapshotPostcardLastResolution"));
- floater->getChild<LLComboBox>("texture_size_combo")->selectNthItem(gSavedSettings.getS32("SnapshotTextureLastResolution"));
- floater->getChild<LLComboBox>("local_size_combo")->selectNthItem(gSavedSettings.getS32("SnapshotLocalLastResolution"));
floater->getChild<LLComboBox>("local_format_combo")->selectNthItem(gSavedSettings.getS32("SnapshotFormat"));
-
- // *TODO: Separate settings for Web images from postcards
- floater->getChildView("send_btn")->setVisible( shot_type == LLSnapshotLivePreview::SNAPSHOT_POSTCARD ||
- shot_type == LLSnapshotLivePreview::SNAPSHOT_WEB);
- floater->getChildView("upload_btn")->setVisible(shot_type == LLSnapshotLivePreview::SNAPSHOT_TEXTURE);
- floater->getChildView("save_btn")->setVisible( shot_type == LLSnapshotLivePreview::SNAPSHOT_LOCAL);
- floater->getChildView("keep_aspect_check")->setEnabled(shot_type != LLSnapshotLivePreview::SNAPSHOT_TEXTURE && !floater->impl.mAspectRatioCheckOff);
+ enableAspectRatioCheckbox(floater, !floater->impl.mAspectRatioCheckOff);
+ setAspectRatioCheckboxValue(floater, gSavedSettings.getBOOL("KeepAspectForSnapshot"));
floater->getChildView("layer_types")->setEnabled(shot_type == LLSnapshotLivePreview::SNAPSHOT_LOCAL);
- BOOL is_advance = gSavedSettings.getBOOL("AdvanceSnapshot");
- BOOL is_local = shot_type == LLSnapshotLivePreview::SNAPSHOT_LOCAL;
- BOOL show_slider = (shot_type == LLSnapshotLivePreview::SNAPSHOT_POSTCARD ||
- shot_type == LLSnapshotLivePreview::SNAPSHOT_WEB ||
- (is_local && shot_format == LLFloaterSnapshot::SNAPSHOT_FORMAT_JPEG));
-
- floater->getChildView("more_btn")->setVisible( !is_advance); // the only item hidden in advanced mode
- floater->getChildView("less_btn")->setVisible( is_advance);
- floater->getChildView("type_label2")->setVisible( is_advance);
- floater->getChildView("format_label")->setVisible( is_advance && is_local);
- floater->getChildView("local_format_combo")->setVisible( is_advance && is_local);
- floater->getChildView("layer_types")->setVisible( is_advance);
- floater->getChildView("layer_type_label")->setVisible( is_advance);
- floater->getChildView("snapshot_width")->setVisible( is_advance);
- floater->getChildView("snapshot_height")->setVisible( is_advance);
- floater->getChildView("keep_aspect_check")->setVisible( is_advance);
- floater->getChildView("ui_check")->setVisible( is_advance);
- floater->getChildView("hud_check")->setVisible( is_advance);
- floater->getChildView("keep_open_check")->setVisible( is_advance);
- floater->getChildView("freeze_frame_check")->setVisible( is_advance);
- floater->getChildView("auto_snapshot_check")->setVisible( is_advance);
- floater->getChildView("image_quality_slider")->setVisible( is_advance && show_slider);
+ LLPanelSnapshot* active_panel = getActivePanel(floater);
+ if (active_panel)
+ {
+ LLSpinCtrl* width_ctrl = getWidthSpinner(floater);
+ LLSpinCtrl* height_ctrl = getHeightSpinner(floater);
+
+ // Initialize spinners.
+ if (width_ctrl->getValue().asInteger() == 0)
+ {
+ S32 w = gViewerWindow->getWindowWidthRaw();
+ lldebugs << "Initializing width spinner (" << width_ctrl->getName() << "): " << w << llendl;
+ width_ctrl->setValue(w);
+ }
+ if (height_ctrl->getValue().asInteger() == 0)
+ {
+ S32 h = gViewerWindow->getWindowHeightRaw();
+ lldebugs << "Initializing height spinner (" << height_ctrl->getName() << "): " << h << llendl;
+ height_ctrl->setValue(h);
+ }
+
+ // Сlamp snapshot resolution to window size when showing UI or HUD in snapshot.
+ if (gSavedSettings.getBOOL("RenderUIInSnapshot") || gSavedSettings.getBOOL("RenderHUDInSnapshot"))
+ {
+ S32 width = gViewerWindow->getWindowWidthRaw();
+ S32 height = gViewerWindow->getWindowHeightRaw();
+
+ width_ctrl->setMaxValue(width);
+
+ height_ctrl->setMaxValue(height);
+ if (width_ctrl->getValue().asInteger() > width)
+ {
+ width_ctrl->forceSetValue(width);
+ }
+ if (height_ctrl->getValue().asInteger() > height)
+ {
+ height_ctrl->forceSetValue(height);
+ }
+ }
+ else
+ {
+ width_ctrl->setMaxValue(6016);
+ height_ctrl->setMaxValue(6016);
+ }
+ }
+
LLSnapshotLivePreview* previewp = getPreviewView(floater);
BOOL got_bytes = previewp && previewp->getDataSize() > 0;
BOOL got_snap = previewp && previewp->getSnapshotUpToDate();
// *TODO: Separate maximum size for Web images from postcards
- floater->getChildView("send_btn")->setEnabled((shot_type == LLSnapshotLivePreview::SNAPSHOT_POSTCARD ||
- shot_type == LLSnapshotLivePreview::SNAPSHOT_WEB) &&
- got_snap && previewp->getDataSize() <= MAX_POSTCARD_DATASIZE);
- floater->getChildView("upload_btn")->setEnabled(shot_type == LLSnapshotLivePreview::SNAPSHOT_TEXTURE && got_snap);
- floater->getChildView("save_btn")->setEnabled(shot_type == LLSnapshotLivePreview::SNAPSHOT_LOCAL && got_snap);
+ lldebugs << "Is snapshot up-to-date? " << got_snap << llendl;
LLLocale locale(LLLocale::USER_LOCALE);
std::string bytes_string;
@@ -1373,155 +1402,111 @@ void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshot* floater)
{
LLResMgr::getInstance()->getIntegerString(bytes_string, (previewp->getDataSize()) >> 10 );
}
- S32 upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload();
- floater->getChild<LLUICtrl>("texture")->setLabelArg("[AMOUNT]", llformat("%d",upload_cost));
- floater->getChild<LLUICtrl>("upload_btn")->setLabelArg("[AMOUNT]", llformat("%d",upload_cost));
+
+ // Update displayed image resolution.
+ LLTextBox* image_res_tb = floater->getChild<LLTextBox>("image_res_text");
+ image_res_tb->setVisible(got_snap);
+ if (got_snap)
+ {
+ LLPointer<LLImageRaw> img = previewp->getEncodedImage();
+ image_res_tb->setTextArg("[WIDTH]", llformat("%d", img->getWidth()));
+ image_res_tb->setTextArg("[HEIGHT]", llformat("%d", img->getHeight()));
+ }
+
floater->getChild<LLUICtrl>("file_size_label")->setTextArg("[SIZE]", got_snap ? bytes_string : floater->getString("unknown"));
floater->getChild<LLUICtrl>("file_size_label")->setColor(
shot_type == LLSnapshotLivePreview::SNAPSHOT_POSTCARD
&& got_bytes
&& previewp->getDataSize() > MAX_POSTCARD_DATASIZE ? LLUIColor(LLColor4::red) : LLUIColorTable::instance().getColor( "LabelTextColor" ));
+ // Update the width and height spinners based on the corresponding resolution combos. (?)
switch(shot_type)
{
- // *TODO: Separate settings for Web images from postcards
case LLSnapshotLivePreview::SNAPSHOT_WEB:
+ layer_type = LLViewerWindow::SNAPSHOT_TYPE_COLOR;
+ floater->getChild<LLUICtrl>("layer_types")->setValue("colors");
+ setResolution(floater, "profile_size_combo");
+ break;
case LLSnapshotLivePreview::SNAPSHOT_POSTCARD:
layer_type = LLViewerWindow::SNAPSHOT_TYPE_COLOR;
floater->getChild<LLUICtrl>("layer_types")->setValue("colors");
- if(is_advance)
- {
- setResolution(floater, "postcard_size_combo");
- }
+ setResolution(floater, "postcard_size_combo");
break;
case LLSnapshotLivePreview::SNAPSHOT_TEXTURE:
layer_type = LLViewerWindow::SNAPSHOT_TYPE_COLOR;
floater->getChild<LLUICtrl>("layer_types")->setValue("colors");
- if(is_advance)
- {
- setResolution(floater, "texture_size_combo");
- }
+ setResolution(floater, "texture_size_combo");
break;
case LLSnapshotLivePreview::SNAPSHOT_LOCAL:
- if(is_advance)
- {
- setResolution(floater, "local_size_combo");
- }
+ setResolution(floater, "local_size_combo");
break;
default:
break;
}
- updateResolutionTextEntry(floater);
-
if (previewp)
{
previewp->setSnapshotType(shot_type);
previewp->setSnapshotFormat(shot_format);
previewp->setSnapshotBufferType(layer_type);
}
-}
-// static
-void LLFloaterSnapshot::Impl::updateResolutionTextEntry(LLFloaterSnapshot* floater)
-{
- LLSpinCtrl* width_spinner = floater->getChild<LLSpinCtrl>("snapshot_width");
- LLSpinCtrl* height_spinner = floater->getChild<LLSpinCtrl>("snapshot_height");
-
- if(getTypeIndex(floater) == LLSnapshotLivePreview::SNAPSHOT_TEXTURE)
- {
- width_spinner->setAllowEdit(FALSE);
- height_spinner->setAllowEdit(FALSE);
- }
- else
+ LLPanelSnapshot* current_panel = Impl::getActivePanel(floater);
+ if (current_panel)
{
- width_spinner->setAllowEdit(TRUE);
- height_spinner->setAllowEdit(TRUE);
+ LLSD info;
+ info["have-snapshot"] = got_snap;
+ current_panel->updateControls(info);
}
+ lldebugs << "finished updating controls" << llendl;
}
// static
-void LLFloaterSnapshot::Impl::checkAutoSnapshot(LLSnapshotLivePreview* previewp, BOOL update_thumbnail)
+void LLFloaterSnapshot::Impl::setStatus(EStatus status, bool ok, const std::string& msg)
{
- if (previewp)
+ LLFloaterSnapshot* floater = LLFloaterSnapshot::getInstance();
+ switch (status)
{
- BOOL autosnap = gSavedSettings.getBOOL("AutoSnapshot");
- previewp->updateSnapshot(autosnap, update_thumbnail, autosnap ? AUTO_SNAPSHOT_TIME_DELAY : 0.f);
+ case STATUS_READY:
+ setWorking(floater, false);
+ setFinished(floater, false);
+ break;
+ case STATUS_WORKING:
+ setWorking(floater, true);
+ setFinished(floater, false);
+ break;
+ case STATUS_FINISHED:
+ setWorking(floater, false);
+ setFinished(floater, true, ok, msg);
+ break;
}
-}
-// static
-void LLFloaterSnapshot::Impl::onClickDiscard(void* data)
-{
- LLFloaterSnapshot *view = (LLFloaterSnapshot *)data;
-
- if (view)
- {
- view->closeFloater();
- }
+ floater->impl.mStatus = status;
}
-
// static
-void LLFloaterSnapshot::Impl::onCommitSave(LLUICtrl* ctrl, void* data)
+void LLFloaterSnapshot::Impl::setNeedRefresh(LLFloaterSnapshot* floater, bool need)
{
- if (ctrl->getValue().asString() == "save as")
+ if (!floater) return;
+
+ // Don't display the "Refresh to save" message if we're in auto-refresh mode.
+ if (gSavedSettings.getBOOL("AutoSnapshot"))
{
- gViewerWindow->resetSnapshotLoc();
+ need = false;
}
- onClickKeep(data);
+
+ floater->mRefreshLabel->setVisible(need);
+ floater->impl.mNeedRefresh = need;
}
// static
-void LLFloaterSnapshot::Impl::onClickKeep(void* data)
+void LLFloaterSnapshot::Impl::checkAutoSnapshot(LLSnapshotLivePreview* previewp, BOOL update_thumbnail)
{
- LLFloaterSnapshot *view = (LLFloaterSnapshot *)data;
- LLSnapshotLivePreview* previewp = getPreviewView(view);
-
if (previewp)
{
- switch (previewp->getSnapshotType())
- {
- case LLSnapshotLivePreview::SNAPSHOT_WEB:
- previewp->saveWeb();
- break;
-
- case LLSnapshotLivePreview::SNAPSHOT_POSTCARD:
- {
- LLFloaterPostcard* floater = previewp->savePostcard();
- // if still in snapshot mode, put postcard floater in snapshot floaterview
- // and link it to snapshot floater
- if (floater && !gSavedSettings.getBOOL("CloseSnapshotOnKeep"))
- {
- gFloaterView->removeChild(floater);
- gSnapshotFloaterView->addChild(floater);
- view->addDependentFloater(floater, FALSE);
- }
- }
- break;
-
- case LLSnapshotLivePreview::SNAPSHOT_TEXTURE:
- previewp->saveTexture();
- break;
-
- case LLSnapshotLivePreview::SNAPSHOT_LOCAL:
- previewp->saveLocal();
- break;
-
- default:
- break;
- }
-
- if (gSavedSettings.getBOOL("CloseSnapshotOnKeep"))
- {
- view->closeFloater();
- }
- else
- {
- checkAutoSnapshot(previewp);
- }
-
- updateControls(view);
+ BOOL autosnap = gSavedSettings.getBOOL("AutoSnapshot");
+ lldebugs << "updating " << (autosnap ? "snapshot" : "thumbnail") << llendl;
+ previewp->updateSnapshot(autosnap, update_thumbnail, autosnap ? AUTO_SNAPSHOT_TIME_DELAY : 0.f);
}
}
@@ -1532,9 +1517,9 @@ void LLFloaterSnapshot::Impl::onClickNewSnapshot(void* data)
LLFloaterSnapshot *view = (LLFloaterSnapshot *)data;
if (previewp && view)
{
+ view->impl.setStatus(Impl::STATUS_READY);
+ lldebugs << "updating snapshot" << llendl;
previewp->updateSnapshot(TRUE);
-
- gViewerWindow->playSnapshotAnimAndSound();
}
}
@@ -1554,36 +1539,15 @@ void LLFloaterSnapshot::Impl::onClickAutoSnap(LLUICtrl *ctrl, void* data)
void LLFloaterSnapshot::Impl::onClickMore(void* data)
{
- gSavedSettings.setBOOL( "AdvanceSnapshot", TRUE );
+ BOOL visible = gSavedSettings.getBOOL("AdvanceSnapshot");
- LLFloaterSnapshot *view = (LLFloaterSnapshot *)data;
- if (view)
- {
- view->translate( 0, view->getUIWinHeightShort() - view->getUIWinHeightLong() );
- view->reshape(view->getRect().getWidth(), view->getUIWinHeightLong());
- updateControls(view) ;
- updateLayout(view) ;
- if(getPreviewView(view))
- {
- getPreviewView(view)->setThumbnailImageSize() ;
- }
- }
-}
-void LLFloaterSnapshot::Impl::onClickLess(void* data)
-{
- gSavedSettings.setBOOL( "AdvanceSnapshot", FALSE );
-
- LLFloaterSnapshot *view = (LLFloaterSnapshot *)data;
+ LLFloaterSnapshot *view = (LLFloaterSnapshot *)data;
if (view)
{
- view->translate( 0, view->getUIWinHeightLong() - view->getUIWinHeightShort() );
- view->reshape(view->getRect().getWidth(), view->getUIWinHeightShort());
+ view->impl.setStatus(Impl::STATUS_READY);
+ gSavedSettings.setBOOL("AdvanceSnapshot", !visible);
updateControls(view) ;
updateLayout(view) ;
- if(getPreviewView(view))
- {
- getPreviewView(view)->setThumbnailImageSize() ;
- }
}
}
@@ -1616,20 +1580,10 @@ void LLFloaterSnapshot::Impl::onClickHUDCheck(LLUICtrl *ctrl, void* data)
}
// static
-void LLFloaterSnapshot::Impl::onClickKeepOpenCheck(LLUICtrl* ctrl, void* data)
+void LLFloaterSnapshot::Impl::applyKeepAspectCheck(LLFloaterSnapshot* view, BOOL checked)
{
- LLCheckBoxCtrl *check = (LLCheckBoxCtrl *)ctrl;
-
- gSavedSettings.setBOOL( "CloseSnapshotOnKeep", !check->get() );
-}
+ gSavedSettings.setBOOL("KeepAspectForSnapshot", checked);
-// static
-void LLFloaterSnapshot::Impl::onClickKeepAspectCheck(LLUICtrl* ctrl, void* data)
-{
- LLCheckBoxCtrl *check = (LLCheckBoxCtrl *)ctrl;
- gSavedSettings.setBOOL( "KeepAspectForSnapshot", check->get() );
-
- LLFloaterSnapshot *view = (LLFloaterSnapshot *)data;
if (view)
{
LLSnapshotLivePreview* previewp = getPreviewView(view) ;
@@ -1639,11 +1593,9 @@ void LLFloaterSnapshot::Impl::onClickKeepAspectCheck(LLUICtrl* ctrl, void* data)
S32 w, h ;
previewp->getSize(w, h) ;
- if(checkImageSize(previewp, w, h, TRUE, previewp->getMaxImageSize()))
- {
- resetSnapshotSizeOnUI(view, w, h) ;
- }
+ updateSpinners(view, previewp, w, h, TRUE); // may change w and h
+ lldebugs << "updating thumbnail" << llendl;
previewp->setSize(w, h) ;
previewp->updateSnapshot(FALSE, TRUE);
checkAutoSnapshot(previewp, TRUE);
@@ -1652,20 +1604,6 @@ void LLFloaterSnapshot::Impl::onClickKeepAspectCheck(LLUICtrl* ctrl, void* data)
}
// static
-void LLFloaterSnapshot::Impl::onCommitQuality(LLUICtrl* ctrl, void* data)
-{
- LLSliderCtrl* slider = (LLSliderCtrl*)ctrl;
- S32 quality_val = llfloor((F32)slider->getValue().asReal());
-
- LLSnapshotLivePreview* previewp = getPreviewView((LLFloaterSnapshot *)data);
- if (previewp)
- {
- previewp->setSnapshotQuality(quality_val);
- }
- checkAutoSnapshot(previewp, TRUE);
-}
-
-// static
void LLFloaterSnapshot::Impl::onCommitFreezeFrame(LLUICtrl* ctrl, void* data)
{
LLCheckBoxCtrl* check_box = (LLCheckBoxCtrl*)ctrl;
@@ -1687,74 +1625,83 @@ void LLFloaterSnapshot::Impl::checkAspectRatio(LLFloaterSnapshot *view, S32 inde
LLSnapshotLivePreview *previewp = getPreviewView(view) ;
// Don't round texture sizes; textures are commonly stretched in world, profiles, etc and need to be "squashed" during upload, not cropped here
-#if 0
- if(LLSnapshotLivePreview::SNAPSHOT_TEXTURE == getTypeIndex(view))
+ if(LLSnapshotLivePreview::SNAPSHOT_TEXTURE == getActiveSnapshotType(view))
{
previewp->mKeepAspectRatio = FALSE ;
return ;
}
-#endif
-
- if(0 == index) //current window size
- {
- view->impl.mAspectRatioCheckOff = true ;
- view->getChildView("keep_aspect_check")->setEnabled(FALSE) ;
- if(previewp)
- {
- previewp->mKeepAspectRatio = TRUE ;
- }
+ BOOL keep_aspect = FALSE, enable_cb = FALSE;
+
+ if (0 == index) // current window size
+ {
+ enable_cb = FALSE;
+ keep_aspect = TRUE;
}
- else if(-1 == index) //custom
+ else if (-1 == index) // custom
{
- view->impl.mAspectRatioCheckOff = false ;
- //if(LLSnapshotLivePreview::SNAPSHOT_TEXTURE != gSavedSettings.getS32("LastSnapshotType"))
- {
- view->getChildView("keep_aspect_check")->setEnabled(TRUE) ;
-
- if(previewp)
- {
- previewp->mKeepAspectRatio = gSavedSettings.getBOOL("KeepAspectForSnapshot") ;
- }
- }
+ enable_cb = TRUE;
+ keep_aspect = gSavedSettings.getBOOL("KeepAspectForSnapshot");
}
- else
+ else // predefined resolution
{
- view->impl.mAspectRatioCheckOff = true ;
- view->getChildView("keep_aspect_check")->setEnabled(FALSE) ;
-
- if(previewp)
- {
- previewp->mKeepAspectRatio = FALSE ;
- }
+ enable_cb = FALSE;
+ keep_aspect = FALSE;
}
- return ;
+ view->impl.mAspectRatioCheckOff = !enable_cb;
+ enableAspectRatioCheckbox(view, enable_cb);
+ if (previewp)
+ {
+ previewp->mKeepAspectRatio = keep_aspect;
+ }
}
-static std::string lastSnapshotWidthName()
+// Show/hide upload progress indicators.
+// static
+void LLFloaterSnapshot::Impl::setWorking(LLFloaterSnapshot* floater, bool working)
{
- switch(gSavedSettings.getS32("LastSnapshotType"))
+ LLUICtrl* working_lbl = floater->getChild<LLUICtrl>("working_lbl");
+ working_lbl->setVisible(working);
+ floater->getChild<LLUICtrl>("working_indicator")->setVisible(working);
+
+ if (working)
+ {
+ const std::string panel_name = getActivePanel(floater, false)->getName();
+ const std::string prefix = panel_name.substr(std::string("panel_snapshot_").size());
+ std::string progress_text = floater->getString(prefix + "_" + "progress_str");
+ working_lbl->setValue(progress_text);
+ }
+
+ // All controls should be disabled while posting.
+ floater->setCtrlsEnabled(!working);
+ LLPanelSnapshot* active_panel = getActivePanel(floater);
+ if (active_panel)
{
- // *TODO: Separate settings for Web snapshots and postcards
- case LLSnapshotLivePreview::SNAPSHOT_WEB: return "LastSnapshotToEmailWidth";
- case LLSnapshotLivePreview::SNAPSHOT_POSTCARD: return "LastSnapshotToEmailWidth";
- case LLSnapshotLivePreview::SNAPSHOT_TEXTURE: return "LastSnapshotToInventoryWidth";
- default: return "LastSnapshotToDiskWidth";
+ active_panel->enableControls(!working);
}
}
-static std::string lastSnapshotHeightName()
+
+// Show/hide upload status message.
+// static
+void LLFloaterSnapshot::Impl::setFinished(LLFloaterSnapshot* floater, bool finished, bool ok, const std::string& msg)
{
- switch(gSavedSettings.getS32("LastSnapshotType"))
+ floater->mSucceessLblPanel->setVisible(finished && ok);
+ floater->mFailureLblPanel->setVisible(finished && !ok);
+
+ if (finished)
{
- // *TODO: Separate settings for Web snapshots and postcards
- case LLSnapshotLivePreview::SNAPSHOT_WEB: return "LastSnapshotToEmailHeight";
- case LLSnapshotLivePreview::SNAPSHOT_POSTCARD: return "LastSnapshotToEmailHeight";
- case LLSnapshotLivePreview::SNAPSHOT_TEXTURE: return "LastSnapshotToInventoryHeight";
- default: return "LastSnapshotToDiskHeight";
+ LLUICtrl* finished_lbl = floater->getChild<LLUICtrl>(ok ? "succeeded_lbl" : "failed_lbl");
+ std::string result_text = floater->getString(msg + "_" + (ok ? "succeeded_str" : "failed_str"));
+ finished_lbl->setValue(result_text);
+
+ LLSideTrayPanelContainer* panel_container = floater->getChild<LLSideTrayPanelContainer>("panel_container");
+ panel_container->openPreviousPanel();
+ panel_container->getCurrentPanel()->onOpen(LLSD());
}
}
+// Apply a new resolution selected from the given combobox.
// static
void LLFloaterSnapshot::Impl::updateResolution(LLUICtrl* ctrl, void* data, BOOL do_update)
{
@@ -1763,14 +1710,10 @@ void LLFloaterSnapshot::Impl::updateResolution(LLUICtrl* ctrl, void* data, BOOL
if (!view || !combobox)
{
+ llassert(view && combobox);
return;
}
- // save off all selected resolution values
- gSavedSettings.setS32("SnapshotPostcardLastResolution", view->getChild<LLComboBox>("postcard_size_combo")->getCurrentIndex());
- gSavedSettings.setS32("SnapshotTextureLastResolution", view->getChild<LLComboBox>("texture_size_combo")->getCurrentIndex());
- gSavedSettings.setS32("SnapshotLocalLastResolution", view->getChild<LLComboBox>("local_size_combo")->getCurrentIndex());
-
std::string sdstring = combobox->getSelectedValue();
LLSD sdres;
std::stringstream sstream(sdstring);
@@ -1788,16 +1731,42 @@ void LLFloaterSnapshot::Impl::updateResolution(LLUICtrl* ctrl, void* data, BOOL
if (width == 0 || height == 0)
{
// take resolution from current window size
+ lldebugs << "Setting preview res from window: " << gViewerWindow->getWindowWidthRaw() << "x" << gViewerWindow->getWindowHeightRaw() << llendl;
previewp->setSize(gViewerWindow->getWindowWidthRaw(), gViewerWindow->getWindowHeightRaw());
}
else if (width == -1 || height == -1)
{
// load last custom value
- previewp->setSize(gSavedSettings.getS32(lastSnapshotWidthName()), gSavedSettings.getS32(lastSnapshotHeightName()));
+ S32 new_width = 0, new_height = 0;
+ LLPanelSnapshot* spanel = getActivePanel(view);
+ if (spanel)
+ {
+ lldebugs << "Loading typed res from panel " << spanel->getName() << llendl;
+ new_width = spanel->getTypedPreviewWidth();
+ new_height = spanel->getTypedPreviewHeight();
+
+ // Limit custom size for inventory snapshots to 512x512 px.
+ if (getActiveSnapshotType(view) == LLSnapshotLivePreview::SNAPSHOT_TEXTURE)
+ {
+ new_width = llmin(new_width, MAX_TEXTURE_SIZE);
+ new_height = llmin(new_height, MAX_TEXTURE_SIZE);
+ }
+ }
+ else
+ {
+ lldebugs << "No custom res chosen, setting preview res from window: "
+ << gViewerWindow->getWindowWidthRaw() << "x" << gViewerWindow->getWindowHeightRaw() << llendl;
+ new_width = gViewerWindow->getWindowWidthRaw();
+ new_height = gViewerWindow->getWindowHeightRaw();
+ }
+
+ llassert(new_width > 0 && new_height > 0);
+ previewp->setSize(new_width, new_height);
}
else
{
// use the resolution from the selected pre-canned drop-down choice
+ lldebugs << "Setting preview res selected from combo: " << width << "x" << height << llendl;
previewp->setSize(width, height);
}
@@ -1805,15 +1774,18 @@ void LLFloaterSnapshot::Impl::updateResolution(LLUICtrl* ctrl, void* data, BOOL
previewp->getSize(width, height);
- if(checkImageSize(previewp, width, height, TRUE, previewp->getMaxImageSize()))
- {
- resetSnapshotSizeOnUI(view, width, height) ;
+ if (gSavedSettings.getBOOL("RenderUIInSnapshot") || gSavedSettings.getBOOL("RenderHUDInSnapshot"))
+ { //clamp snapshot resolution to window size when showing UI or HUD in snapshot
+ width = llmin(width, gViewerWindow->getWindowWidthRaw());
+ height = llmin(height, gViewerWindow->getWindowHeightRaw());
}
+
+ updateSpinners(view, previewp, width, height, TRUE); // may change width and height
- if(view->getChild<LLUICtrl>("snapshot_width")->getValue().asInteger() != width || view->getChild<LLUICtrl>("snapshot_height")->getValue().asInteger() != height)
+ if(getWidthSpinner(view)->getValue().asInteger() != width || getHeightSpinner(view)->getValue().asInteger() != height)
{
- view->getChild<LLUICtrl>("snapshot_width")->setValue(width);
- view->getChild<LLUICtrl>("snapshot_height")->setValue(height);
+ getWidthSpinner(view)->setValue(width);
+ getHeightSpinner(view)->setValue(height);
}
if(original_width != width || original_height != height)
@@ -1822,10 +1794,13 @@ void LLFloaterSnapshot::Impl::updateResolution(LLUICtrl* ctrl, void* data, BOOL
// hide old preview as the aspect ratio could be wrong
checkAutoSnapshot(previewp, FALSE);
+ lldebugs << "updating thumbnail" << llendl;
getPreviewView(view)->updateSnapshot(FALSE, TRUE);
if(do_update)
{
+ lldebugs << "Will update controls" << llendl;
updateControls(view);
+ setNeedRefresh(view, true);
}
}
}
@@ -1849,96 +1824,46 @@ void LLFloaterSnapshot::Impl::onCommitLayerTypes(LLUICtrl* ctrl, void*data)
}
}
-//static
-void LLFloaterSnapshot::Impl::onCommitSnapshotType(LLUICtrl* ctrl, void* data)
+// static
+void LLFloaterSnapshot::Impl::onImageQualityChange(LLFloaterSnapshot* view, S32 quality_val)
{
- LLFloaterSnapshot *view = (LLFloaterSnapshot *)data;
- if (view)
+ LLSnapshotLivePreview* previewp = getPreviewView(view);
+ if (previewp)
{
- gSavedSettings.setS32("LastSnapshotType", getTypeIndex(view));
- getPreviewView(view)->updateSnapshot(TRUE);
- updateControls(view);
+ previewp->setSnapshotQuality(quality_val);
}
+ checkAutoSnapshot(previewp, TRUE);
}
-
-//static
-void LLFloaterSnapshot::Impl::onCommitSnapshotFormat(LLUICtrl* ctrl, void* data)
+// static
+void LLFloaterSnapshot::Impl::onImageFormatChange(LLFloaterSnapshot* view)
{
- LLFloaterSnapshot *view = (LLFloaterSnapshot *)data;
if (view)
{
- gSavedSettings.setS32("SnapshotFormat", getFormatIndex(view));
+ gSavedSettings.setS32("SnapshotFormat", getImageFormat(view));
+ lldebugs << "image format changed, updating snapshot" << llendl;
getPreviewView(view)->updateSnapshot(TRUE);
updateControls(view);
+ setNeedRefresh(view, false); // we're refreshing
}
}
-
-
// Sets the named size combo to "custom" mode.
// static
void LLFloaterSnapshot::Impl::comboSetCustom(LLFloaterSnapshot* floater, const std::string& comboname)
{
LLComboBox* combo = floater->getChild<LLComboBox>(comboname);
-
combo->setCurrentByIndex(combo->getItemCount() - 1); // "custom" is always the last index
-
- if(comboname == "postcard_size_combo")
- {
- gSavedSettings.setS32("SnapshotPostcardLastResolution", combo->getCurrentIndex());
- }
- else if(comboname == "texture_size_combo")
- {
- gSavedSettings.setS32("SnapshotTextureLastResolution", combo->getCurrentIndex());
- }
- else if(comboname == "local_size_combo")
- {
- gSavedSettings.setS32("SnapshotLocalLastResolution", combo->getCurrentIndex());
- }
-
checkAspectRatio(floater, -1); // -1 means custom
}
-
-
+// Update supplied width and height according to the constrain proportions flag; limit them by max_val.
//static
BOOL LLFloaterSnapshot::Impl::checkImageSize(LLSnapshotLivePreview* previewp, S32& width, S32& height, BOOL isWidthChanged, S32 max_value)
{
S32 w = width ;
S32 h = height ;
- //if texture, ignore aspect ratio setting, round image size to power of 2.
-#if 0 // Don't round texture sizes; textures are commonly stretched in world, profiles, etc and need to be "squashed" during upload, not cropped here
- if(LLSnapshotLivePreview::SNAPSHOT_TEXTURE == gSavedSettings.getS32("LastSnapshotType"))
- {
- if(width > max_value)
- {
- width = max_value ;
- }
- if(height > max_value)
- {
- height = max_value ;
- }
-
- //round to nearest power of 2 based on the direction of movement
- // i.e. higher power of two if increasing texture resolution
- if(gSavedSettings.getS32("LastSnapshotToInventoryWidth") < width ||
- gSavedSettings.getS32("LastSnapshotToInventoryHeight") < height)
- {
- // Up arrow pressed
- width = get_next_power_two(width, MAX_TEXTURE_SIZE) ;
- height = get_next_power_two(height, MAX_TEXTURE_SIZE) ;
- }
- else
- {
- // Down or no change
- width = get_lower_power_two(width, MAX_TEXTURE_SIZE) ;
- height = get_lower_power_two(height, MAX_TEXTURE_SIZE) ;
- }
- }
- else
-#endif
if(previewp && previewp->mKeepAspectRatio)
{
if(gViewerWindow->getWindowWidthRaw() < 1 || gViewerWindow->getWindowHeightRaw() < 1)
@@ -1952,11 +1877,11 @@ BOOL LLFloaterSnapshot::Impl::checkImageSize(LLSnapshotLivePreview* previewp, S3
//change another value proportionally
if(isWidthChanged)
{
- height = (S32)(width / aspect_ratio) ;
+ height = llround(width / aspect_ratio) ;
}
else
{
- width = (S32)(height * aspect_ratio) ;
+ width = llround(height * aspect_ratio) ;
}
//bound w/h by the max_value
@@ -1974,87 +1899,79 @@ BOOL LLFloaterSnapshot::Impl::checkImageSize(LLSnapshotLivePreview* previewp, S3
}
}
}
- else
- {
- }
return (w != width || h != height) ;
}
//static
-void LLFloaterSnapshot::Impl::resetSnapshotSizeOnUI(LLFloaterSnapshot *view, S32 width, S32 height)
+void LLFloaterSnapshot::Impl::setImageSizeSpinnersValues(LLFloaterSnapshot *view, S32 width, S32 height)
{
- view->getChild<LLSpinCtrl>("snapshot_width")->forceSetValue(width);
- view->getChild<LLSpinCtrl>("snapshot_height")->forceSetValue(height);
- gSavedSettings.setS32(lastSnapshotWidthName(), width);
- gSavedSettings.setS32(lastSnapshotHeightName(), height);
+ getWidthSpinner(view)->forceSetValue(width);
+ getHeightSpinner(view)->forceSetValue(height);
}
-//static
-void LLFloaterSnapshot::Impl::onCommitCustomResolution(LLUICtrl *ctrl, void* data)
+// static
+void LLFloaterSnapshot::Impl::updateSpinners(LLFloaterSnapshot* view, LLSnapshotLivePreview* previewp, S32& width, S32& height, BOOL is_width_changed)
{
- LLFloaterSnapshot *view = (LLFloaterSnapshot *)data;
- if (view)
+ if (checkImageSize(previewp, width, height, is_width_changed, previewp->getMaxImageSize()))
{
- S32 w = llfloor((F32)view->getChild<LLUICtrl>("snapshot_width")->getValue().asReal());
- S32 h = llfloor((F32)view->getChild<LLUICtrl>("snapshot_height")->getValue().asReal());
+ setImageSizeSpinnersValues(view, width, height);
+ }
+}
- LLSnapshotLivePreview* previewp = getPreviewView(view);
- if (previewp)
+// static
+void LLFloaterSnapshot::Impl::applyCustomResolution(LLFloaterSnapshot* view, S32 w, S32 h)
+{
+ bool need_refresh = false;
+
+ lldebugs << "applyCustomResolution(" << w << ", " << h << ")" << llendl;
+ if (!view) return;
+
+ LLSnapshotLivePreview* previewp = getPreviewView(view);
+ if (previewp)
+ {
+ S32 curw,curh;
+ previewp->getSize(curw, curh);
+
+ if (w != curw || h != curh)
{
- S32 curw,curh;
- previewp->getSize(curw, curh);
-
- if (w != curw || h != curh)
- {
- BOOL update_ = FALSE ;
- //if to upload a snapshot, process spinner input in a special way.
-#if 0 // Don't round texture sizes; textures are commonly stretched in world, profiles, etc and need to be "squashed" during upload, not cropped here
- if(LLSnapshotLivePreview::SNAPSHOT_TEXTURE == gSavedSettings.getS32("LastSnapshotType"))
- {
- S32 spinner_increment = (S32)((LLSpinCtrl*)ctrl)->getIncrement() ;
- S32 dw = w - curw ;
- S32 dh = h - curh ;
- dw = (dw == spinner_increment) ? 1 : ((dw == -spinner_increment) ? -1 : 0) ;
- dh = (dh == spinner_increment) ? 1 : ((dh == -spinner_increment) ? -1 : 0) ;
-
- if(dw)
- {
- w = (dw > 0) ? curw << dw : curw >> -dw ;
- update_ = TRUE ;
- }
- if(dh)
- {
- h = (dh > 0) ? curh << dh : curh >> -dh ;
- update_ = TRUE ;
- }
- }
-#endif
- previewp->setMaxImageSize((S32)((LLSpinCtrl *)ctrl)->getMaxValue()) ;
-
- // Check image size changes the value of height and width
- if(checkImageSize(previewp, w, h, w != curw, previewp->getMaxImageSize())
- || update_)
- {
- resetSnapshotSizeOnUI(view, w, h) ;
- }
+ //if to upload a snapshot, process spinner input in a special way.
+ previewp->setMaxImageSize((S32) getWidthSpinner(view)->getMaxValue()) ;
- previewp->setSize(w,h);
- checkAutoSnapshot(previewp, FALSE);
- previewp->updateSnapshot(FALSE, TRUE);
- comboSetCustom(view, "postcard_size_combo");
- comboSetCustom(view, "texture_size_combo");
- comboSetCustom(view, "local_size_combo");
- }
- }
+ updateSpinners(view, previewp, w, h, w != curw); // may change w and h
- gSavedSettings.setS32(lastSnapshotWidthName(), w);
- gSavedSettings.setS32(lastSnapshotHeightName(), h);
+ previewp->setSize(w,h);
+ checkAutoSnapshot(previewp, FALSE);
+ lldebugs << "applied custom resolution, updating thumbnail" << llendl;
+ previewp->updateSnapshot(FALSE, TRUE);
+ comboSetCustom(view, "profile_size_combo");
+ comboSetCustom(view, "postcard_size_combo");
+ comboSetCustom(view, "texture_size_combo");
+ comboSetCustom(view, "local_size_combo");
+ need_refresh = true;
+ }
+ }
- updateControls(view);
+ updateControls(view);
+ if (need_refresh)
+ {
+ setNeedRefresh(view, true); // need to do this after updateControls()
}
}
+// static
+void LLFloaterSnapshot::Impl::onSnapshotUploadFinished(bool status)
+{
+ setStatus(STATUS_FINISHED, status, "profile");
+}
+
+
+// static
+void LLFloaterSnapshot::Impl::onSendingPostcardFinished(bool status)
+{
+ setStatus(STATUS_FINISHED, status, "postcard");
+}
+
///----------------------------------------------------------------------------
/// Class LLFloaterSnapshot
///----------------------------------------------------------------------------
@@ -2062,6 +1979,10 @@ void LLFloaterSnapshot::Impl::onCommitCustomResolution(LLUICtrl *ctrl, void* dat
// Default constructor
LLFloaterSnapshot::LLFloaterSnapshot(const LLSD& key)
: LLFloater(key),
+ mRefreshBtn(NULL),
+ mRefreshLabel(NULL),
+ mSucceessLblPanel(NULL),
+ mFailureLblPanel(NULL),
impl (*(new Impl))
{
}
@@ -2069,7 +1990,7 @@ LLFloaterSnapshot::LLFloaterSnapshot(const LLSD& key)
// Destroys the object
LLFloaterSnapshot::~LLFloaterSnapshot()
{
- LLView::deleteViewByHandle(impl.mPreviewHandle);
+ if (impl.mPreviewHandle.get()) impl.mPreviewHandle.get()->die();
//unfreeze everything else
gSavedSettings.setBOOL("FreezeTime", FALSE);
@@ -2091,24 +2012,13 @@ BOOL LLFloaterSnapshot::postBuild()
LLWebSharing::instance().init();
}
- childSetCommitCallback("snapshot_type_radio", Impl::onCommitSnapshotType, this);
- childSetCommitCallback("local_format_combo", Impl::onCommitSnapshotFormat, this);
-
+ mRefreshBtn = getChild<LLUICtrl>("new_snapshot_btn");
childSetAction("new_snapshot_btn", Impl::onClickNewSnapshot, this);
+ mRefreshLabel = getChild<LLUICtrl>("refresh_lbl");
+ mSucceessLblPanel = getChild<LLUICtrl>("succeeded_panel");
+ mFailureLblPanel = getChild<LLUICtrl>("failed_panel");
- childSetAction("more_btn", Impl::onClickMore, this);
- childSetAction("less_btn", Impl::onClickLess, this);
-
- childSetAction("upload_btn", Impl::onClickKeep, this);
- childSetAction("send_btn", Impl::onClickKeep, this);
- childSetCommitCallback("save_btn", Impl::onCommitSave, this);
- childSetAction("discard_btn", Impl::onClickDiscard, this);
-
- childSetCommitCallback("image_quality_slider", Impl::onCommitQuality, this);
- getChild<LLUICtrl>("image_quality_slider")->setValue(gSavedSettings.getS32("SnapshotQuality"));
-
- childSetCommitCallback("snapshot_width", Impl::onCommitCustomResolution, this);
- childSetCommitCallback("snapshot_height", Impl::onCommitCustomResolution, this);
+ childSetAction("advanced_options_btn", Impl::onClickMore, this);
childSetCommitCallback("ui_check", Impl::onClickUICheck, this);
getChild<LLUICtrl>("ui_check")->setValue(gSavedSettings.getBOOL("RenderUIInSnapshot"));
@@ -2116,28 +2026,22 @@ BOOL LLFloaterSnapshot::postBuild()
childSetCommitCallback("hud_check", Impl::onClickHUDCheck, this);
getChild<LLUICtrl>("hud_check")->setValue(gSavedSettings.getBOOL("RenderHUDInSnapshot"));
- childSetCommitCallback("keep_open_check", Impl::onClickKeepOpenCheck, this);
- getChild<LLUICtrl>("keep_open_check")->setValue(!gSavedSettings.getBOOL("CloseSnapshotOnKeep"));
-
- childSetCommitCallback("keep_aspect_check", Impl::onClickKeepAspectCheck, this);
- getChild<LLUICtrl>("keep_aspect_check")->setValue(gSavedSettings.getBOOL("KeepAspectForSnapshot"));
+ impl.setAspectRatioCheckboxValue(this, gSavedSettings.getBOOL("KeepAspectForSnapshot"));
childSetCommitCallback("layer_types", Impl::onCommitLayerTypes, this);
getChild<LLUICtrl>("layer_types")->setValue("colors");
getChildView("layer_types")->setEnabled(FALSE);
- getChild<LLUICtrl>("snapshot_width")->setValue(gSavedSettings.getS32(lastSnapshotWidthName()));
- getChild<LLUICtrl>("snapshot_height")->setValue(gSavedSettings.getS32(lastSnapshotHeightName()));
-
getChild<LLUICtrl>("freeze_frame_check")->setValue(gSavedSettings.getBOOL("UseFreezeFrame"));
childSetCommitCallback("freeze_frame_check", Impl::onCommitFreezeFrame, this);
getChild<LLUICtrl>("auto_snapshot_check")->setValue(gSavedSettings.getBOOL("AutoSnapshot"));
childSetCommitCallback("auto_snapshot_check", Impl::onClickAutoSnap, this);
- childSetCommitCallback("postcard_size_combo", Impl::onCommitResolution, this);
- childSetCommitCallback("texture_size_combo", Impl::onCommitResolution, this);
- childSetCommitCallback("local_size_combo", Impl::onCommitResolution, this);
+ LLWebProfile::setImageUploadResultCallback(boost::bind(&LLFloaterSnapshot::Impl::onSnapshotUploadFinished, _1));
+ LLPostCard::setPostResultCallback(boost::bind(&LLFloaterSnapshot::Impl::onSendingPostcardFinished, _1));
+
+ sThumbnailPlaceholder = getChild<LLUICtrl>("thumbnail_placeholder");
// create preview window
LLRect full_screen_rect = getRootView()->getRect();
@@ -2155,6 +2059,13 @@ BOOL LLFloaterSnapshot::postBuild()
gFloaterView->removeChild(this);
gSnapshotFloaterView->addChild(this);
+ // Pre-select "Current Window" resolution.
+ getChild<LLComboBox>("profile_size_combo")->selectNthItem(0);
+ getChild<LLComboBox>("postcard_size_combo")->selectNthItem(0);
+ getChild<LLComboBox>("texture_size_combo")->selectNthItem(0);
+ getChild<LLComboBox>("local_size_combo")->selectNthItem(0);
+ getChild<LLComboBox>("local_format_combo")->selectNthItem(0);
+
impl.mPreviewHandle = previewp->getHandle();
impl.updateControls(this);
impl.updateLayout(this);
@@ -2174,21 +2085,69 @@ void LLFloaterSnapshot::draw()
LLFloater::draw();
- if (previewp)
+ if (previewp && !isMinimized())
{
if(previewp->getThumbnailImage())
{
- LLRect thumbnail_rect = getChild<LLUICtrl>("thumbnail_placeholder")->getRect();
-
- S32 offset_x = (getRect().getWidth() - previewp->getThumbnailWidth()) / 2 ;
- S32 offset_y = thumbnail_rect.mBottom + (thumbnail_rect.getHeight() - previewp->getThumbnailHeight()) / 2 ;
-
- glMatrixMode(GL_MODELVIEW);
+ bool working = impl.getStatus() == Impl::STATUS_WORKING;
+ const LLRect& thumbnail_rect = getThumbnailPlaceholderRect();
+ const S32 thumbnail_w = previewp->getThumbnailWidth();
+ const S32 thumbnail_h = previewp->getThumbnailHeight();
+
+ // calc preview offset within the preview rect
+ const S32 local_offset_x = (thumbnail_rect.getWidth() - thumbnail_w) / 2 ;
+ const S32 local_offset_y = (thumbnail_rect.getHeight() - thumbnail_h) / 2 ; // preview y pos within the preview rect
+
+ // calc preview offset within the floater rect
+ S32 offset_x = thumbnail_rect.mLeft + local_offset_x;
+ S32 offset_y = thumbnail_rect.mBottom + local_offset_y;
+
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ // Apply floater transparency to the texture unless the floater is focused.
+ F32 alpha = getTransparencyType() == TT_ACTIVE ? 1.0f : getCurrentTransparency();
+ LLColor4 color = working ? LLColor4::grey4 : LLColor4::white;
gl_draw_scaled_image(offset_x, offset_y,
- previewp->getThumbnailWidth(), previewp->getThumbnailHeight(),
- previewp->getThumbnailImage(), LLColor4::white);
+ thumbnail_w, thumbnail_h,
+ previewp->getThumbnailImage(), color % alpha);
previewp->drawPreviewRect(offset_x, offset_y) ;
+
+ // Draw some controls on top of the preview thumbnail.
+ static const S32 PADDING = 5;
+ static const S32 REFRESH_LBL_BG_HEIGHT = 32;
+
+ // Reshape and position the posting result message panels at the top of the thumbnail.
+ // Do this regardless of current posting status (finished or not) to avoid flicker
+ // when the result message is displayed for the first time.
+ // if (impl.getStatus() == Impl::STATUS_FINISHED)
+ {
+ LLRect result_lbl_rect = mSucceessLblPanel->getRect();
+ const S32 result_lbl_h = result_lbl_rect.getHeight();
+ result_lbl_rect.setLeftTopAndSize(local_offset_x, local_offset_y + thumbnail_h, thumbnail_w - 1, result_lbl_h);
+ mSucceessLblPanel->reshape(result_lbl_rect.getWidth(), result_lbl_h);
+ mSucceessLblPanel->setRect(result_lbl_rect);
+ mFailureLblPanel->reshape(result_lbl_rect.getWidth(), result_lbl_h);
+ mFailureLblPanel->setRect(result_lbl_rect);
+ }
+
+ // Position the refresh button in the bottom left corner of the thumbnail.
+ mRefreshBtn->setOrigin(local_offset_x + PADDING, local_offset_y + PADDING);
+
+ if (impl.mNeedRefresh)
+ {
+ // Place the refresh hint text to the right of the refresh button.
+ const LLRect& refresh_btn_rect = mRefreshBtn->getRect();
+ mRefreshLabel->setOrigin(refresh_btn_rect.mLeft + refresh_btn_rect.getWidth() + PADDING, refresh_btn_rect.mBottom);
+
+ // Draw the refresh hint background.
+ LLRect refresh_label_bg_rect(offset_x, offset_y + REFRESH_LBL_BG_HEIGHT, offset_x + thumbnail_w - 1, offset_y);
+ gl_rect_2d(refresh_label_bg_rect, LLColor4::white % 0.9f, TRUE);
+ }
+
+ gGL.pushUIMatrix();
+ LLUI::translate((F32) thumbnail_rect.mLeft, (F32) thumbnail_rect.mBottom);
+ sThumbnailPlaceholder->draw();
+ gGL.popUIMatrix();
}
}
}
@@ -2198,6 +2157,7 @@ void LLFloaterSnapshot::onOpen(const LLSD& key)
LLSnapshotLivePreview* preview = LLFloaterSnapshot::Impl::getPreviewView(this);
if(preview)
{
+ lldebugs << "opened, updating snapshot" << llendl;
preview->updateSnapshot(TRUE);
}
focusFirstItem(FALSE);
@@ -2205,7 +2165,8 @@ void LLFloaterSnapshot::onOpen(const LLSD& key)
gSnapshotFloaterView->setVisible(TRUE);
gSnapshotFloaterView->adjustToFitScreen(this, FALSE);
- gViewerWindow->playSnapshotAnimAndSound();
+ // Initialize default tab.
+ getChild<LLSideTrayPanelContainer>("panel_container")->getCurrentPanel()->onOpen(LLSD());
}
void LLFloaterSnapshot::onClose(bool app_quitting)
@@ -2213,6 +2174,62 @@ void LLFloaterSnapshot::onClose(bool app_quitting)
getParent()->setMouseOpaque(FALSE);
}
+// virtual
+S32 LLFloaterSnapshot::notify(const LLSD& info)
+{
+ // A child panel wants to change snapshot resolution.
+ if (info.has("combo-res-change"))
+ {
+ std::string combo_name = info["combo-res-change"]["control-name"].asString();
+ impl.updateResolution(getChild<LLUICtrl>(combo_name), this);
+ return 1;
+ }
+
+ if (info.has("custom-res-change"))
+ {
+ LLSD res = info["custom-res-change"];
+ impl.applyCustomResolution(this, res["w"].asInteger(), res["h"].asInteger());
+ return 1;
+ }
+
+ if (info.has("keep-aspect-change"))
+ {
+ impl.applyKeepAspectCheck(this, info["keep-aspect-change"].asBoolean());
+ return 1;
+ }
+
+ if (info.has("image-quality-change"))
+ {
+ impl.onImageQualityChange(this, info["image-quality-change"].asInteger());
+ return 1;
+ }
+
+ if (info.has("image-format-change"))
+ {
+ impl.onImageFormatChange(this);
+ return 1;
+ }
+
+ if (info.has("set-ready"))
+ {
+ impl.setStatus(Impl::STATUS_READY);
+ return 1;
+ }
+
+ if (info.has("set-working"))
+ {
+ impl.setStatus(Impl::STATUS_WORKING);
+ return 1;
+ }
+
+ if (info.has("set-finished"))
+ {
+ LLSD data = info["set-finished"];
+ impl.setStatus(Impl::STATUS_FINISHED, data["ok"].asBoolean(), data["msg"].asString());
+ return 1;
+ }
+ return 0;
+}
//static
void LLFloaterSnapshot::update()
@@ -2222,6 +2239,7 @@ void LLFloaterSnapshot::update()
return;
BOOL changed = FALSE;
+ lldebugs << "npreviews: " << LLSnapshotLivePreview::sList.size() << llendl;
for (std::set<LLSnapshotLivePreview*>::iterator iter = LLSnapshotLivePreview::sList.begin();
iter != LLSnapshotLivePreview::sList.end(); ++iter)
{
@@ -2229,10 +2247,181 @@ void LLFloaterSnapshot::update()
}
if(changed)
{
+ lldebugs << "changed" << llendl;
inst->impl.updateControls(inst);
}
}
+// static
+LLFloaterSnapshot* LLFloaterSnapshot::getInstance()
+{
+ return LLFloaterReg::getTypedInstance<LLFloaterSnapshot>("snapshot");
+}
+
+// static
+void LLFloaterSnapshot::saveTexture()
+{
+ lldebugs << "saveTexture" << llendl;
+
+ // FIXME: duplicated code
+ LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot");
+ if (!instance)
+ {
+ llassert(instance != NULL);
+ return;
+ }
+ LLSnapshotLivePreview* previewp = Impl::getPreviewView(instance);
+ if (!previewp)
+ {
+ llassert(previewp != NULL);
+ return;
+ }
+
+ previewp->saveTexture();
+}
+
+// static
+BOOL LLFloaterSnapshot::saveLocal()
+{
+ lldebugs << "saveLocal" << llendl;
+ // FIXME: duplicated code
+ LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot");
+ if (!instance)
+ {
+ llassert(instance != NULL);
+ return FALSE;
+ }
+ LLSnapshotLivePreview* previewp = Impl::getPreviewView(instance);
+ if (!previewp)
+ {
+ llassert(previewp != NULL);
+ return FALSE;
+ }
+
+ return previewp->saveLocal();
+}
+
+// static
+void LLFloaterSnapshot::preUpdate()
+{
+ // FIXME: duplicated code
+ LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot");
+ if (instance)
+ {
+ // Disable the send/post/save buttons until snapshot is ready.
+ Impl::updateControls(instance);
+
+ // Force hiding the "Refresh to save" hint because we know we've just started refresh.
+ Impl::setNeedRefresh(instance, false);
+ }
+}
+
+// static
+void LLFloaterSnapshot::postUpdate()
+{
+ // FIXME: duplicated code
+ LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot");
+ if (instance)
+ {
+ // Enable the send/post/save buttons.
+ Impl::updateControls(instance);
+
+ // We've just done refresh.
+ Impl::setNeedRefresh(instance, false);
+
+ // The refresh button is initially hidden. We show it after the first update,
+ // i.e. when preview appears.
+ if (!instance->mRefreshBtn->getVisible())
+ {
+ instance->mRefreshBtn->setVisible(true);
+ }
+ }
+}
+
+// static
+void LLFloaterSnapshot::postSave()
+{
+ LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot");
+ if (!instance)
+ {
+ llassert(instance != NULL);
+ return;
+ }
+
+ instance->impl.updateControls(instance);
+ instance->impl.setStatus(Impl::STATUS_WORKING);
+}
+
+// static
+void LLFloaterSnapshot::postPanelSwitch()
+{
+ LLFloaterSnapshot* instance = getInstance();
+ instance->impl.updateControls(instance);
+
+ // Remove the success/failure indicator whenever user presses a snapshot option button.
+ instance->impl.setStatus(Impl::STATUS_READY);
+}
+
+// static
+LLPointer<LLImageFormatted> LLFloaterSnapshot::getImageData()
+{
+ // FIXME: May not work for textures.
+
+ LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot");
+ if (!instance)
+ {
+ llassert(instance != NULL);
+ return NULL;
+ }
+
+ LLSnapshotLivePreview* previewp = Impl::getPreviewView(instance);
+ if (!previewp)
+ {
+ llassert(previewp != NULL);
+ return NULL;
+ }
+
+ LLPointer<LLImageFormatted> img = previewp->getFormattedImage();
+ if (!img.get())
+ {
+ llwarns << "Empty snapshot image data" << llendl;
+ llassert(img.get() != NULL);
+ }
+
+ return img;
+}
+
+// static
+const LLVector3d& LLFloaterSnapshot::getPosTakenGlobal()
+{
+ LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot");
+ if (!instance)
+ {
+ llassert(instance != NULL);
+ return LLVector3d::zero;
+ }
+
+ LLSnapshotLivePreview* previewp = Impl::getPreviewView(instance);
+ if (!previewp)
+ {
+ llassert(previewp != NULL);
+ return LLVector3d::zero;
+ }
+
+ return previewp->getPosTakenGlobal();
+}
+
+// static
+void LLFloaterSnapshot::setAgentEmail(const std::string& email)
+{
+ LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot");
+ if (instance)
+ {
+ LLSideTrayPanelContainer* panel_container = instance->getChild<LLSideTrayPanelContainer>("panel_container");
+ LLPanel* postcard_panel = panel_container->getPanelByName("panel_snapshot_postcard");
+ postcard_panel->notify(LLSD().with("agent-email", email));
+ }
+}
///----------------------------------------------------------------------------
/// Class LLSnapshotFloaterView
diff --git a/indra/newview/llfloatersnapshot.h b/indra/newview/llfloatersnapshot.h
index c92d9efde5..afe135fa40 100644
--- a/indra/newview/llfloatersnapshot.h
+++ b/indra/newview/llfloatersnapshot.h
@@ -27,11 +27,15 @@
#ifndef LL_LLFLOATERSNAPSHOT_H
#define LL_LLFLOATERSNAPSHOT_H
+#include "llimage.h"
#include "llfloater.h"
+class LLSpinCtrl;
class LLFloaterSnapshot : public LLFloater
{
+ LOG_CLASS(LLFloaterSnapshot);
+
public:
typedef enum e_snapshot_format
{
@@ -47,20 +51,31 @@ public:
/*virtual*/ void draw();
/*virtual*/ void onOpen(const LLSD& key);
/*virtual*/ void onClose(bool app_quitting);
+ /*virtual*/ S32 notify(const LLSD& info);
static void update();
-
- static S32 getUIWinHeightLong() {return sUIWinHeightLong ;}
- static S32 getUIWinHeightShort() {return sUIWinHeightShort ;}
- static S32 getUIWinWidth() {return sUIWinWidth ;}
+
+ // TODO: create a snapshot model instead
+ static LLFloaterSnapshot* getInstance();
+ static void saveTexture();
+ static BOOL saveLocal();
+ static void preUpdate();
+ static void postUpdate();
+ static void postSave();
+ static void postPanelSwitch();
+ static LLPointer<LLImageFormatted> getImageData();
+ static const LLVector3d& getPosTakenGlobal();
+ static void setAgentEmail(const std::string& email);
+
+ static const LLRect& getThumbnailPlaceholderRect() { return sThumbnailPlaceholder->getRect(); }
private:
+ static LLUICtrl* sThumbnailPlaceholder;
+ LLUICtrl *mRefreshBtn, *mRefreshLabel;
+ LLUICtrl *mSucceessLblPanel, *mFailureLblPanel;
+
class Impl;
Impl& impl;
-
- static S32 sUIWinHeightLong ;
- static S32 sUIWinHeightShort ;
- static S32 sUIWinWidth ;
};
class LLSnapshotFloaterView : public LLFloaterView
diff --git a/indra/newview/llfloatersounddevices.cpp b/indra/newview/llfloatersounddevices.cpp
new file mode 100644
index 0000000000..72c077d215
--- /dev/null
+++ b/indra/newview/llfloatersounddevices.cpp
@@ -0,0 +1,86 @@
+/**
+ * @file llfloatersounddevices.cpp
+ * @author Leyla Farazha
+ * @brief Sound Preferences used for minimal skin
+ *
+* $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloatersounddevices.h"
+
+#include "lldraghandle.h"
+
+#include "llpanelvoicedevicesettings.h"
+
+// Library includes
+#include "indra_constants.h"
+
+// protected
+LLFloaterSoundDevices::LLFloaterSoundDevices(const LLSD& key)
+: LLTransientDockableFloater(NULL, false, key)
+{
+ LLTransientFloaterMgr::getInstance()->addControlView(this);
+
+ // force docked state since this floater doesn't save it between recreations
+ setDocked(true);
+}
+
+LLFloaterSoundDevices::~LLFloaterSoundDevices()
+{
+ LLTransientFloaterMgr::getInstance()->removeControlView(this);
+}
+
+// virtual
+BOOL LLFloaterSoundDevices::postBuild()
+{
+ LLTransientDockableFloater::postBuild();
+
+ updateTransparency(TT_ACTIVE); // force using active floater transparency (STORM-730)
+
+ LLPanelVoiceDeviceSettings* panel = findChild<LLPanelVoiceDeviceSettings>("device_settings_panel");
+ if (panel)
+ {
+ panel->setUseTuningMode(false);
+ getChild<LLUICtrl>("voice_input_device")->setCommitCallback(boost::bind(&LLPanelVoiceDeviceSettings::apply, panel));
+ getChild<LLUICtrl>("voice_output_device")->setCommitCallback(boost::bind(&LLPanelVoiceDeviceSettings::apply, panel));
+ getChild<LLUICtrl>("mic_volume_slider")->setCommitCallback(boost::bind(&LLPanelVoiceDeviceSettings::apply, panel));
+ }
+ return TRUE;
+}
+
+//virtual
+void LLFloaterSoundDevices::setDocked(bool docked, bool pop_on_undock/* = true*/)
+{
+ LLTransientDockableFloater::setDocked(docked, pop_on_undock);
+}
+
+// virtual
+void LLFloaterSoundDevices::setFocus( BOOL b )
+{
+ LLTransientDockableFloater::setFocus(b);
+
+ // Force using active floater transparency
+ // We have to override setFocus() for because selecting an item of the
+ // combobox causes the floater to lose focus and thus become transparent.
+ updateTransparency(TT_ACTIVE);
+}
diff --git a/indra/newview/llfloatersounddevices.h b/indra/newview/llfloatersounddevices.h
new file mode 100644
index 0000000000..f09ee3b069
--- /dev/null
+++ b/indra/newview/llfloatersounddevices.h
@@ -0,0 +1,49 @@
+/**
+ * @file llfloatersounddevices.h
+ * @author Leyla Farazha
+ * @brief Sound Preferences used for minimal skin
+ *
+* $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLFLOATERSOUNDDEVICES_H
+#define LL_LLFLOATERSOUNDDEVICES_H
+
+#include "lltransientdockablefloater.h"
+
+class LLFloaterSoundDevices : public LLTransientDockableFloater
+{
+public:
+
+ LOG_CLASS(LLFloaterSoundDevices);
+
+ LLFloaterSoundDevices(const LLSD& key);
+ ~LLFloaterSoundDevices();
+
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void setDocked(bool docked, bool pop_on_undock = true);
+ /*virtual*/ void setFocus( BOOL b );
+};
+
+
+#endif //LL_LLFLOATERSOUNDDEVICES_H
+
diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp
index 370bf05bf7..6978e6a430 100644
--- a/indra/newview/llfloatertools.cpp
+++ b/indra/newview/llfloatertools.cpp
@@ -32,6 +32,7 @@
#include "llcoord.h"
//#include "llgl.h"
+#include "llagent.h"
#include "llagentcamera.h"
#include "llbutton.h"
#include "llcheckboxctrl.h"
@@ -41,6 +42,7 @@
#include "llfloaterbuildoptions.h"
#include "llfloatermediasettings.h"
#include "llfloateropenobject.h"
+#include "llfloaterobjectweights.h"
#include "llfloaterreg.h"
#include "llfocusmgr.h"
#include "llmediaentry.h"
@@ -54,6 +56,7 @@
#include "llpanelobject.h"
#include "llpanelvolume.h"
#include "llpanelpermissions.h"
+#include "llparcel.h"
#include "llradiogroup.h"
#include "llresmgr.h"
#include "llselectmgr.h"
@@ -84,6 +87,7 @@
#include "llviewerwindow.h"
#include "llvovolume.h"
#include "lluictrlfactory.h"
+#include "llmeshrepository.h"
// Globals
LLFloaterTools *gFloaterTools = NULL;
@@ -98,7 +102,9 @@ const std::string PANEL_NAMES[LLFloaterTools::PANEL_COUNT] =
std::string("Content"), // PANEL_CONTENTS,
};
+
// Local prototypes
+void commit_grid_mode(LLUICtrl *ctrl);
void commit_select_component(void *data);
void click_show_more(void*);
void click_popup_info(void*);
@@ -113,9 +119,26 @@ void commit_radio_group_focus(LLUICtrl* ctrl);
void commit_radio_group_move(LLUICtrl* ctrl);
void commit_radio_group_edit(LLUICtrl* ctrl);
void commit_radio_group_land(LLUICtrl* ctrl);
-void commit_grid_mode(LLUICtrl *);
void commit_slider_zoom(LLUICtrl *ctrl);
+/**
+ * Class LLLandImpactsObserver
+ *
+ * An observer class to monitor parcel selection and update
+ * the land impacts data from a parcel containing the selected object.
+ */
+class LLLandImpactsObserver : public LLParcelObserver
+{
+public:
+ virtual void changed()
+ {
+ LLFloaterTools* tools_floater = LLFloaterReg::getTypedInstance<LLFloaterTools>("build");
+ if(tools_floater)
+ {
+ tools_floater->updateLandImpacts();
+ }
+ }
+};
//static
void* LLFloaterTools::createPanelPermissions(void* data)
@@ -220,6 +243,8 @@ BOOL LLFloaterTools::postBuild()
mRadioGroupEdit = getChild<LLRadioGroup>("edit_radio_group");
mBtnGridOptions = getChild<LLButton>("Options...");
mTitleMedia = getChild<LLMediaCtrl>("title_media");
+ mBtnLink = getChild<LLButton>("link_btn");
+ mBtnUnlink = getChild<LLButton>("unlink_btn");
mCheckSelectIndividual = getChild<LLCheckBoxCtrl>("checkbox edit linked parts");
getChild<LLUICtrl>("checkbox edit linked parts")->setValue((BOOL)gSavedSettings.getBOOL("EditLinkedParts"));
@@ -264,6 +289,8 @@ BOOL LLFloaterTools::postBuild()
// the setting stores the actual force multiplier, but the slider is logarithmic, so we convert here
getChild<LLUICtrl>("slider force")->setValue(log10(gSavedSettings.getF32("LandBrushForce")));
+ mCostTextBorder = getChild<LLViewBorder>("cost_text_border");
+
mTab = getChild<LLTabContainer>("Object Info Tabs");
if(mTab)
{
@@ -315,6 +342,9 @@ LLFloaterTools::LLFloaterTools(const LLSD& key)
mBtnRotateReset(NULL),
mBtnRotateRight(NULL),
+ mBtnLink(NULL),
+ mBtnUnlink(NULL),
+
mBtnDelete(NULL),
mBtnDuplicate(NULL),
mBtnDuplicateInPlace(NULL),
@@ -336,12 +366,16 @@ LLFloaterTools::LLFloaterTools(const LLSD& key)
mPanelFace(NULL),
mPanelLandInfo(NULL),
+ mCostTextBorder(NULL),
mTabLand(NULL),
+
+ mLandImpactsObserver(NULL),
+
mDirty(TRUE),
mNeedMediaTitle(TRUE)
{
gFloaterTools = this;
-
+
setAutoFocus(FALSE);
mFactoryMap["General"] = LLCallbackMap(createPanelPermissions, this);//LLPanelPermissions
mFactoryMap["Object"] = LLCallbackMap(createPanelObject, this);//LLPanelObject
@@ -356,22 +390,30 @@ LLFloaterTools::LLFloaterTools(const LLSD& key)
mCommitCallbackRegistrar.add("BuildTool.commitRadioMove", boost::bind(&commit_radio_group_move,_1));
mCommitCallbackRegistrar.add("BuildTool.commitRadioEdit", boost::bind(&commit_radio_group_edit,_1));
+ mCommitCallbackRegistrar.add("BuildTool.gridMode", boost::bind(&commit_grid_mode,_1));
mCommitCallbackRegistrar.add("BuildTool.selectComponent", boost::bind(&commit_select_component, this));
mCommitCallbackRegistrar.add("BuildTool.gridOptions", boost::bind(&LLFloaterTools::onClickGridOptions,this));
mCommitCallbackRegistrar.add("BuildTool.applyToSelection", boost::bind(&click_apply_to_selection, this));
- mCommitCallbackRegistrar.add("BuildTool.gridMode", boost::bind(&commit_grid_mode,_1));
mCommitCallbackRegistrar.add("BuildTool.commitRadioLand", boost::bind(&commit_radio_group_land,_1));
mCommitCallbackRegistrar.add("BuildTool.LandBrushForce", boost::bind(&commit_slider_dozer_force,_1));
mCommitCallbackRegistrar.add("BuildTool.AddMedia", boost::bind(&LLFloaterTools::onClickBtnAddMedia,this));
mCommitCallbackRegistrar.add("BuildTool.DeleteMedia", boost::bind(&LLFloaterTools::onClickBtnDeleteMedia,this));
mCommitCallbackRegistrar.add("BuildTool.EditMedia", boost::bind(&LLFloaterTools::onClickBtnEditMedia,this));
+ mCommitCallbackRegistrar.add("BuildTool.LinkObjects", boost::bind(&LLSelectMgr::linkObjects, LLSelectMgr::getInstance()));
+ mCommitCallbackRegistrar.add("BuildTool.UnlinkObjects", boost::bind(&LLSelectMgr::unlinkObjects, LLSelectMgr::getInstance()));
+
+ mLandImpactsObserver = new LLLandImpactsObserver();
+ LLViewerParcelMgr::getInstance()->addObserver(mLandImpactsObserver);
}
LLFloaterTools::~LLFloaterTools()
{
// children automatically deleted
gFloaterTools = NULL;
+
+ LLViewerParcelMgr::getInstance()->removeObserver(mLandImpactsObserver);
+ delete mLandImpactsObserver;
}
void LLFloaterTools::setStatusText(const std::string& text)
@@ -412,27 +454,75 @@ void LLFloaterTools::refresh()
// Refresh object and prim count labels
LLLocale locale(LLLocale::USER_LOCALE);
- std::string obj_count_string;
- LLResMgr::getInstance()->getIntegerString(obj_count_string, LLSelectMgr::getInstance()->getSelection()->getRootObjectCount());
- getChild<LLUICtrl>("obj_count")->setTextArg("[COUNT]", obj_count_string);
- std::string prim_count_string;
- LLResMgr::getInstance()->getIntegerString(prim_count_string, LLSelectMgr::getInstance()->getSelection()->getObjectCount());
- getChild<LLUICtrl>("prim_count")->setTextArg("[COUNT]", prim_count_string);
-
- // calculate selection rendering cost
- if (sShowObjectCost)
- {
- std::string prim_cost_string;
- LLResMgr::getInstance()->getIntegerString(prim_cost_string, calcRenderCost());
- getChild<LLUICtrl>("RenderingCost")->setTextArg("[COUNT]", prim_cost_string);
+#if 0
+ if (!gMeshRepo.meshRezEnabled())
+ {
+ std::string obj_count_string;
+ LLResMgr::getInstance()->getIntegerString(obj_count_string, LLSelectMgr::getInstance()->getSelection()->getRootObjectCount());
+ getChild<LLUICtrl>("selection_count")->setTextArg("[OBJ_COUNT]", obj_count_string);
+ std::string prim_count_string;
+ LLResMgr::getInstance()->getIntegerString(prim_count_string, LLSelectMgr::getInstance()->getSelection()->getObjectCount());
+ getChild<LLUICtrl>("selection_count")->setTextArg("[PRIM_COUNT]", prim_count_string);
+
+ // calculate selection rendering cost
+ if (sShowObjectCost)
+ {
+ std::string prim_cost_string;
+ S32 render_cost = LLSelectMgr::getInstance()->getSelection()->getSelectedObjectRenderCost();
+ LLResMgr::getInstance()->getIntegerString(prim_cost_string, render_cost);
+ getChild<LLUICtrl>("RenderingCost")->setTextArg("[COUNT]", prim_cost_string);
+ }
+
+ // disable the object and prim counts if nothing selected
+ bool have_selection = ! LLSelectMgr::getInstance()->getSelection()->isEmpty();
+ getChildView("obj_count")->setEnabled(have_selection);
+ getChildView("prim_count")->setEnabled(have_selection);
+ getChildView("RenderingCost")->setEnabled(have_selection && sShowObjectCost);
}
+ else
+#endif
+ {
+ F32 link_cost = LLSelectMgr::getInstance()->getSelection()->getSelectedLinksetCost();
+ S32 link_count = LLSelectMgr::getInstance()->getSelection()->getRootObjectCount();
+ LLCrossParcelFunctor func;
+ if (LLSelectMgr::getInstance()->getSelection()->applyToRootObjects(&func, true))
+ {
+ // Selection crosses parcel bounds.
+ // We don't display remaining land capacity in this case.
+ const LLStringExplicit empty_str("");
+ childSetTextArg("remaining_capacity", "[CAPACITY_STRING]", empty_str);
+ }
+ else
+ {
+ LLViewerObject* selected_object = mObjectSelection->getFirstObject();
+ if (selected_object)
+ {
+ // Select a parcel at the currently selected object's position.
+ LLViewerParcelMgr::getInstance()->selectParcelAt(selected_object->getPositionGlobal());
+ }
+ else
+ {
+ llwarns << "Failed to get selected object" << llendl;
+ }
+ }
+
+ LLStringUtil::format_map_t selection_args;
+ selection_args["OBJ_COUNT"] = llformat("%.1d", link_count);
+ selection_args["LAND_IMPACT"] = llformat("%.1d", (S32)link_cost);
+
+ std::ostringstream selection_info;
+
+ selection_info << getString("status_selectcount", selection_args);
+
+ getChild<LLTextBox>("selection_count")->setText(selection_info.str());
+
+ bool have_selection = !LLSelectMgr::getInstance()->getSelection()->isEmpty();
+ childSetVisible("selection_count", have_selection);
+ childSetVisible("remaining_capacity", have_selection);
+ childSetVisible("selection_empty", !have_selection);
+ }
- // disable the object and prim counts if nothing selected
- bool have_selection = ! LLSelectMgr::getInstance()->getSelection()->isEmpty();
- getChildView("obj_count")->setEnabled(have_selection);
- getChildView("prim_count")->setEnabled(have_selection);
- getChildView("RenderingCost")->setEnabled(have_selection && sShowObjectCost);
// Refresh child tabs
mPanelPermissions->refresh();
@@ -442,6 +532,13 @@ void LLFloaterTools::refresh()
refreshMedia();
mPanelContents->refresh();
mPanelLandInfo->refresh();
+
+ // Refresh the advanced weights floater
+ LLFloaterObjectWeights* object_weights_floater = LLFloaterReg::findTypedInstance<LLFloaterObjectWeights>("object_weights");
+ if(object_weights_floater && object_weights_floater->getVisible())
+ {
+ object_weights_floater->refresh();
+ }
}
void LLFloaterTools::draw()
@@ -566,6 +663,12 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask)
bool linked_parts = gSavedSettings.getBOOL("EditLinkedParts");
getChildView("RenderingCost")->setVisible( !linked_parts && (edit_visible || focus_visible || move_visible) && sShowObjectCost);
+ mBtnLink->setVisible(edit_visible);
+ mBtnUnlink->setVisible(edit_visible);
+
+ mBtnLink->setEnabled(LLSelectMgr::instance().enableLinkObjects());
+ mBtnUnlink->setEnabled(LLSelectMgr::instance().enableUnlinkObjects());
+
if (mCheckSelectIndividual)
{
mCheckSelectIndividual->setVisible(edit_visible);
@@ -597,25 +700,25 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask)
switch (mObjectSelection->getSelectType())
{
- case SELECT_TYPE_HUD:
- mComboGridMode->add(getString("grid_screen_text"));
- mComboGridMode->add(getString("grid_local_text"));
- //mComboGridMode->add(getString("grid_reference_text"));
- break;
- case SELECT_TYPE_WORLD:
- mComboGridMode->add(getString("grid_world_text"));
- mComboGridMode->add(getString("grid_local_text"));
- mComboGridMode->add(getString("grid_reference_text"));
- break;
- case SELECT_TYPE_ATTACHMENT:
- mComboGridMode->add(getString("grid_attachment_text"));
- mComboGridMode->add(getString("grid_local_text"));
- mComboGridMode->add(getString("grid_reference_text"));
- break;
+ case SELECT_TYPE_HUD:
+ mComboGridMode->add(getString("grid_screen_text"));
+ mComboGridMode->add(getString("grid_local_text"));
+ break;
+ case SELECT_TYPE_WORLD:
+ mComboGridMode->add(getString("grid_world_text"));
+ mComboGridMode->add(getString("grid_local_text"));
+ mComboGridMode->add(getString("grid_reference_text"));
+ break;
+ case SELECT_TYPE_ATTACHMENT:
+ mComboGridMode->add(getString("grid_attachment_text"));
+ mComboGridMode->add(getString("grid_local_text"));
+ mComboGridMode->add(getString("grid_reference_text"));
+ break;
}
mComboGridMode->setCurrentByIndex(index);
}
+
// Snap to grid disabled for grab tool - very confusing
if (mCheckSnapToGrid) mCheckSnapToGrid->setVisible( edit_visible /* || tool == LLToolGrab::getInstance() */ );
if (mBtnGridOptions) mBtnGridOptions->setVisible( edit_visible /* || tool == LLToolGrab::getInstance() */ );
@@ -664,6 +767,8 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask)
// Land buttons
BOOL land_visible = (tool == LLToolBrushLand::getInstance() || tool == LLToolSelectLand::getInstance() );
+ mCostTextBorder->setVisible(!land_visible);
+
if (mBtnLand) mBtnLand ->setToggleState( land_visible );
mRadioGroupLand->setVisible( land_visible );
@@ -716,8 +821,12 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask)
getChildView("Strength:")->setVisible( land_visible);
}
- getChildView("obj_count")->setVisible( !land_visible);
- getChildView("prim_count")->setVisible( !land_visible);
+ bool have_selection = !LLSelectMgr::getInstance()->getSelection()->isEmpty();
+
+ getChildView("selection_count")->setVisible(!land_visible && have_selection);
+ getChildView("remaining_capacity")->setVisible(!land_visible && have_selection);
+ getChildView("selection_empty")->setVisible(!land_visible && !have_selection);
+
mTab->setVisible(!land_visible);
mPanelLandInfo->setVisible(land_visible);
}
@@ -779,6 +888,9 @@ void LLFloaterTools::onClose(bool app_quitting)
//gMenuBarView->setItemVisible("BuildTools", FALSE);
LLFloaterReg::hideInstance("media_settings");
+
+ // hide the advanced object weights floater
+ LLFloaterReg::hideInstance("object_weights");
}
void click_popup_info(void*)
@@ -949,13 +1061,6 @@ void commit_select_component(void *data)
}
}
-void commit_grid_mode(LLUICtrl *ctrl)
-{
- LLComboBox* combo = (LLComboBox*)ctrl;
-
- LLSelectMgr::getInstance()->setGridMode((EGridMode)combo->getCurrentIndex());
-}
-
// static
void LLFloaterTools::setObjectType( LLPCode pcode )
{
@@ -964,6 +1069,13 @@ void LLFloaterTools::setObjectType( LLPCode pcode )
gFocusMgr.setMouseCapture(NULL);
}
+void commit_grid_mode(LLUICtrl *ctrl)
+{
+ LLComboBox* combo = (LLComboBox*)ctrl;
+
+ LLSelectMgr::getInstance()->setGridMode((EGridMode)combo->getCurrentIndex());
+}
+
void LLFloaterTools::onClickGridOptions()
{
@@ -972,32 +1084,6 @@ void LLFloaterTools::onClickGridOptions()
//floaterp->addDependentFloater(LLFloaterBuildOptions::getInstance(), FALSE);
}
-S32 LLFloaterTools::calcRenderCost()
-{
- S32 cost = 0;
- std::set<LLUUID> textures;
-
- for (LLObjectSelection::iterator selection_iter = LLSelectMgr::getInstance()->getSelection()->begin();
- selection_iter != LLSelectMgr::getInstance()->getSelection()->end();
- ++selection_iter)
- {
- LLSelectNode *select_node = *selection_iter;
- if (select_node)
- {
- LLVOVolume *viewer_volume = (LLVOVolume*)select_node->getObject();
- if (viewer_volume)
- {
- cost += viewer_volume->getRenderCost(textures);
- cost += textures.size() * LLVOVolume::ARC_TEXTURE_COST;
- textures.clear();
- }
- }
- }
-
-
- return cost;
-}
-
// static
void LLFloaterTools::setEditTool(void* tool_pointer)
{
@@ -1073,6 +1159,37 @@ bool LLFloaterTools::selectedMediaEditable()
return selected_Media_editable;
}
+void LLFloaterTools::updateLandImpacts()
+{
+ LLParcel *parcel = mParcelSelection->getParcel();
+ if (!parcel)
+ {
+ return;
+ }
+
+ S32 rezzed_prims = parcel->getSimWidePrimCount();
+ S32 total_capacity = parcel->getSimWideMaxPrimCapacity();
+
+ std::string remaining_capacity_str = "";
+
+ bool show_mesh_cost = gMeshRepo.meshRezEnabled();
+ if (show_mesh_cost)
+ {
+ LLStringUtil::format_map_t remaining_capacity_args;
+ remaining_capacity_args["LAND_CAPACITY"] = llformat("%d", total_capacity - rezzed_prims);
+ remaining_capacity_str = getString("status_remaining_capacity", remaining_capacity_args);
+ }
+
+ childSetTextArg("remaining_capacity", "[CAPACITY_STRING]", remaining_capacity_str);
+
+ // Update land impacts info in the weights floater
+ LLFloaterObjectWeights* object_weights_floater = LLFloaterReg::findTypedInstance<LLFloaterObjectWeights>("object_weights");
+ if(object_weights_floater)
+ {
+ object_weights_floater->updateLandImpacts(parcel);
+ }
+}
+
void LLFloaterTools::getMediaState()
{
LLObjectSelectionHandle selected_objects =LLSelectMgr::getInstance()->getSelection();
@@ -1156,6 +1273,7 @@ void LLFloaterTools::getMediaState()
}
} func;
+
// check if all faces have media(or, all dont have media)
LLFloaterMediaSettings::getInstance()->mIdenticalHasMediaInfo = selected_objects->getSelectedTEValue( &func, bool_has_media );
@@ -1331,9 +1449,7 @@ bool LLFloaterTools::deleteMediaConfirm(const LLSD& notification, const LLSD& re
//
void LLFloaterTools::clearMediaSettings()
{
- LLFloaterMediaSettings::getInstance();
LLFloaterMediaSettings::clearValues(false);
-
}
//////////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/llfloatertools.h b/indra/newview/llfloatertools.h
index 87c3d2ab47..7a19d093a4 100644
--- a/indra/newview/llfloatertools.h
+++ b/indra/newview/llfloatertools.h
@@ -32,8 +32,8 @@
#include "llparcelselection.h"
class LLButton;
-class LLComboBox;
class LLCheckBoxCtrl;
+class LLComboBox;
class LLPanelPermissions;
class LLPanelObject;
class LLPanelVolume;
@@ -48,6 +48,7 @@ class LLMediaCtrl;
class LLTool;
class LLParcelSelection;
class LLObjectSelection;
+class LLLandImpactsObserver;
typedef LLSafeHandle<LLObjectSelection> LLObjectSelectionHandle;
@@ -104,6 +105,7 @@ public:
void updateMediaTitle();
void navigateToTitleMedia( const std::string url );
bool selectedMediaEditable();
+ void updateLandImpacts();
private:
void refresh();
@@ -114,7 +116,6 @@ private:
static bool multipleFacesSelectedConfirm(const LLSD& notification, const LLSD& response);
static void setObjectType( LLPCode pcode );
void onClickGridOptions();
- S32 calcRenderCost();
public:
LLButton *mBtnFocus;
@@ -135,6 +136,8 @@ public:
LLRadioGroup* mRadioGroupEdit;
LLCheckBoxCtrl *mCheckSelectIndividual;
+ LLButton* mBtnLink;
+ LLButton* mBtnUnlink;
LLCheckBoxCtrl* mCheckSnapToGrid;
LLButton* mBtnGridOptions;
@@ -177,8 +180,12 @@ public:
LLPanelFace *mPanelFace;
LLPanelLandInfo *mPanelLandInfo;
+ LLViewBorder* mCostTextBorder;
+
LLTabContainer* mTabLand;
+ LLLandImpactsObserver* mLandImpactsObserver;
+
LLParcelSelectionHandle mParcelSelection;
LLObjectSelectionHandle mObjectSelection;
diff --git a/indra/newview/llfloatertopobjects.cpp b/indra/newview/llfloatertopobjects.cpp
index 2aaf403d5f..87d048c15b 100644
--- a/indra/newview/llfloatertopobjects.cpp
+++ b/indra/newview/llfloatertopobjects.cpp
@@ -185,7 +185,7 @@ void LLFloaterTopObjects::handleReply(LLMessageSystem *msg, void** data)
have_extended_data = true;
msg->getU32("DataExtended", "TimeStamp", time_stamp, block);
msg->getF32("DataExtended", "MonoScore", mono_score, block);
- msg->getS32(_PREHASH_ReportData,"PublicURLs",public_urls,block);
+ msg->getS32("DataExtended", "PublicURLs", public_urls, block);
}
LLSD element;
@@ -223,7 +223,8 @@ void LLFloaterTopObjects::handleReply(LLMessageSystem *msg, void** data)
columns[3]["value"] = llformat("<%0.1f,%0.1f,%0.1f>", location_x, location_y, location_z);
columns[3]["font"] = "SANSSERIF";
columns[4]["column"] = "time";
- columns[4]["value"] = formatted_time((time_t)time_stamp);
+ columns[4]["type"] = "date";
+ columns[4]["value"] = LLDate((time_t)time_stamp);
columns[4]["font"] = "SANSSERIF";
if (mCurrentMode == STAT_REPORT_TOP_SCRIPTS
diff --git a/indra/newview/llfloatertoybox.cpp b/indra/newview/llfloatertoybox.cpp
new file mode 100644
index 0000000000..324afe661f
--- /dev/null
+++ b/indra/newview/llfloatertoybox.cpp
@@ -0,0 +1,191 @@
+/**
+ * @file llfloatertoybox.cpp
+ * @brief The toybox for flexibilizing the UI.
+ *
+ * $LicenseInfo:firstyear=2002&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloatertoybox.h"
+
+#include "llbutton.h"
+#include "llcommandmanager.h"
+#include "llnotifications.h"
+#include "llnotificationsutil.h"
+#include "llpanel.h"
+#include "lltoolbar.h"
+#include "lltoolbarview.h"
+#include "lltrans.h"
+
+LLFloaterToybox::LLFloaterToybox(const LLSD& key)
+ : LLFloater(key)
+ , mToolBar(NULL)
+{
+ mCommitCallbackRegistrar.add("Toybox.RestoreDefaults", boost::bind(&LLFloaterToybox::onBtnRestoreDefaults, this));
+ mCommitCallbackRegistrar.add("Toybox.ClearAll", boost::bind(&LLFloaterToybox::onBtnClearAll, this));
+}
+
+LLFloaterToybox::~LLFloaterToybox()
+{
+}
+
+bool compare_localized_command_labels(LLCommand * cmd1, LLCommand * cmd2)
+{
+ std::string lab1 = LLTrans::getString(cmd1->labelRef());
+ std::string lab2 = LLTrans::getString(cmd2->labelRef());
+
+ return (lab1 < lab2);
+}
+
+BOOL LLFloaterToybox::postBuild()
+{
+ mToolBar = getChild<LLToolBar>("toybox_toolbar");
+
+ mToolBar->setStartDragCallback(boost::bind(LLToolBarView::startDragTool,_1,_2,_3));
+ mToolBar->setHandleDragCallback(boost::bind(LLToolBarView::handleDragTool,_1,_2,_3,_4));
+ mToolBar->setHandleDropCallback(boost::bind(LLToolBarView::handleDropTool,_1,_2,_3,_4));
+ mToolBar->setButtonEnterCallback(boost::bind(&LLFloaterToybox::onToolBarButtonEnter,this,_1));
+
+ //
+ // Sort commands by localized labels so they will appear alphabetized in all languages
+ //
+
+ std::list<LLCommand *> alphabetized_commands;
+
+ LLCommandManager& cmdMgr = LLCommandManager::instance();
+ for (U32 i = 0; i < cmdMgr.commandCount(); i++)
+ {
+ LLCommand * command = cmdMgr.getCommand(i);
+
+ if (command->availableInToybox())
+ {
+ alphabetized_commands.push_back(command);
+ }
+ }
+
+ alphabetized_commands.sort(compare_localized_command_labels);
+
+ //
+ // Create Buttons
+ //
+
+ for (std::list<LLCommand *>::iterator it = alphabetized_commands.begin(); it != alphabetized_commands.end(); ++it)
+ {
+ mToolBar->addCommand((*it)->id());
+ }
+
+ return TRUE;
+}
+
+void LLFloaterToybox::draw()
+{
+ llassert(gToolBarView != NULL);
+
+ const command_id_list_t& command_list = mToolBar->getCommandsList();
+
+ for (command_id_list_t::const_iterator it = command_list.begin(); it != command_list.end(); ++it)
+ {
+ const LLCommandId& id = *it;
+
+ const bool command_not_present = (gToolBarView->hasCommand(id) == LLToolBarView::TOOLBAR_NONE);
+ mToolBar->enableCommand(id, command_not_present);
+ }
+
+ LLFloater::draw();
+}
+
+static bool finish_restore_toybox(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+
+ if (option == 0)
+ {
+ LLToolBarView::loadDefaultToolbars();
+ }
+
+ return false;
+}
+
+static bool finish_clear_all_toybox(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+
+ if (option == 0)
+ {
+ LLToolBarView::clearAllToolbars();
+ }
+
+ return false;
+}
+
+static LLNotificationFunctorRegistration finish_restore_toybox_reg("ConfirmRestoreToybox", finish_restore_toybox);
+static LLNotificationFunctorRegistration finish_clear_all_toybox_reg("ConfirmClearAllToybox", finish_clear_all_toybox);
+
+void LLFloaterToybox::onBtnRestoreDefaults()
+{
+ LLNotificationsUtil::add("ConfirmRestoreToybox");
+}
+
+void LLFloaterToybox::onBtnClearAll()
+{
+ LLNotificationsUtil::add("ConfirmClearAllToybox");
+}
+
+BOOL LLFloaterToybox::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
+ EDragAndDropType cargo_type,
+ void* cargo_data,
+ EAcceptance* accept,
+ std::string& tooltip_msg)
+{
+ S32 local_x = x - mToolBar->getRect().mLeft;
+ S32 local_y = y - mToolBar->getRect().mBottom;
+ return mToolBar->handleDragAndDrop(local_x, local_y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg);
+}
+
+void LLFloaterToybox::onToolBarButtonEnter(LLView* button)
+{
+ std::string suffix = "";
+
+ LLCommandId commandId(button->getName());
+ LLCommand* command = LLCommandManager::instance().getCommand(commandId);
+
+ if (command)
+ {
+ S32 command_loc = gToolBarView->hasCommand(commandId);
+
+ switch(command_loc)
+ {
+ case LLToolBarView::TOOLBAR_BOTTOM: suffix = LLTrans::getString("Toolbar_Bottom_Tooltip"); break;
+ case LLToolBarView::TOOLBAR_LEFT: suffix = LLTrans::getString("Toolbar_Left_Tooltip"); break;
+ case LLToolBarView::TOOLBAR_RIGHT: suffix = LLTrans::getString("Toolbar_Right_Tooltip"); break;
+
+ default:
+ break;
+ }
+ }
+
+ mToolBar->setTooltipButtonSuffix(suffix);
+}
+
+
+// eof
diff --git a/indra/newview/llfloatertoybox.h b/indra/newview/llfloatertoybox.h
new file mode 100644
index 0000000000..10aee0e6f5
--- /dev/null
+++ b/indra/newview/llfloatertoybox.h
@@ -0,0 +1,62 @@
+/**
+ * @file llfloatertoybox.h
+ * @brief The toybox for flexibilizing the UI.
+ *
+ * $LicenseInfo:firstyear=2002&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLFLOATERTOYBOX_H
+#define LL_LLFLOATERTOYBOX_H
+
+#include "llfloater.h"
+
+
+class LLButton;
+class LLToolBar;
+
+
+class LLFloaterToybox : public LLFloater
+{
+public:
+ LLFloaterToybox(const LLSD& key);
+ virtual ~LLFloaterToybox();
+
+ // virtuals
+ BOOL postBuild();
+ void draw();
+ /*virtual*/ BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
+ EDragAndDropType cargo_type,
+ void* cargo_data,
+ EAcceptance* accept,
+ std::string& tooltip_msg);
+
+protected:
+ void onBtnClearAll();
+ void onBtnRestoreDefaults();
+
+ void onToolBarButtonEnter(LLView* button);
+
+public:
+ LLToolBar * mToolBar;
+};
+
+#endif // LL_LLFLOATERTOYBOX_H
diff --git a/indra/newview/llfloatertranslationsettings.cpp b/indra/newview/llfloatertranslationsettings.cpp
new file mode 100644
index 0000000000..1a17183efd
--- /dev/null
+++ b/indra/newview/llfloatertranslationsettings.cpp
@@ -0,0 +1,298 @@
+/**
+ * @file llfloatertranslationsettings.cpp
+ * @brief Machine translation settings for chat
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloatertranslationsettings.h"
+
+// Viewer includes
+#include "llnearbychatbar.h"
+#include "lltranslate.h"
+#include "llviewercontrol.h" // for gSavedSettings
+
+// Linden library includes
+#include "llbutton.h"
+#include "llcheckboxctrl.h"
+#include "llcombobox.h"
+#include "llfloaterreg.h"
+#include "lllineeditor.h"
+#include "llnotificationsutil.h"
+#include "llradiogroup.h"
+
+class EnteredKeyVerifier : public LLTranslate::KeyVerificationReceiver
+{
+public:
+ EnteredKeyVerifier(LLTranslate::EService service, bool alert)
+ : LLTranslate::KeyVerificationReceiver(service)
+ , mAlert(alert)
+ {
+ }
+
+private:
+ /*virtual*/ void setVerificationStatus(bool ok)
+ {
+ LLFloaterTranslationSettings* floater =
+ LLFloaterReg::getTypedInstance<LLFloaterTranslationSettings>("prefs_translation");
+
+ if (!floater)
+ {
+ llwarns << "Cannot find translation settings floater" << llendl;
+ return;
+ }
+
+ switch (getService())
+ {
+ case LLTranslate::SERVICE_BING:
+ floater->setBingVerified(ok, mAlert);
+ break;
+ case LLTranslate::SERVICE_GOOGLE:
+ floater->setGoogleVerified(ok, mAlert);
+ break;
+ }
+ }
+
+ bool mAlert;
+};
+
+LLFloaterTranslationSettings::LLFloaterTranslationSettings(const LLSD& key)
+: LLFloater(key)
+, mMachineTranslationCB(NULL)
+, mLanguageCombo(NULL)
+, mTranslationServiceRadioGroup(NULL)
+, mBingAPIKeyEditor(NULL)
+, mGoogleAPIKeyEditor(NULL)
+, mBingVerifyBtn(NULL)
+, mGoogleVerifyBtn(NULL)
+, mOKBtn(NULL)
+, mBingKeyVerified(false)
+, mGoogleKeyVerified(false)
+{
+}
+
+// virtual
+BOOL LLFloaterTranslationSettings::postBuild()
+{
+ mMachineTranslationCB = getChild<LLCheckBoxCtrl>("translate_chat_checkbox");
+ mLanguageCombo = getChild<LLComboBox>("translate_language_combo");
+ mTranslationServiceRadioGroup = getChild<LLRadioGroup>("translation_service_rg");
+ mBingAPIKeyEditor = getChild<LLLineEditor>("bing_api_key");
+ mGoogleAPIKeyEditor = getChild<LLLineEditor>("google_api_key");
+ mBingVerifyBtn = getChild<LLButton>("verify_bing_api_key_btn");
+ mGoogleVerifyBtn = getChild<LLButton>("verify_google_api_key_btn");
+ mOKBtn = getChild<LLButton>("ok_btn");
+
+ mMachineTranslationCB->setCommitCallback(boost::bind(&LLFloaterTranslationSettings::updateControlsEnabledState, this));
+ mTranslationServiceRadioGroup->setCommitCallback(boost::bind(&LLFloaterTranslationSettings::updateControlsEnabledState, this));
+ mOKBtn->setClickedCallback(boost::bind(&LLFloaterTranslationSettings::onBtnOK, this));
+ getChild<LLButton>("cancel_btn")->setClickedCallback(boost::bind(&LLFloater::closeFloater, this, false));
+ mBingVerifyBtn->setClickedCallback(boost::bind(&LLFloaterTranslationSettings::onBtnBingVerify, this));
+ mGoogleVerifyBtn->setClickedCallback(boost::bind(&LLFloaterTranslationSettings::onBtnGoogleVerify, this));
+
+ mBingAPIKeyEditor->setFocusReceivedCallback(boost::bind(&LLFloaterTranslationSettings::onEditorFocused, this, _1));
+ mBingAPIKeyEditor->setKeystrokeCallback(boost::bind(&LLFloaterTranslationSettings::onBingKeyEdited, this), NULL);
+ mGoogleAPIKeyEditor->setFocusReceivedCallback(boost::bind(&LLFloaterTranslationSettings::onEditorFocused, this, _1));
+ mGoogleAPIKeyEditor->setKeystrokeCallback(boost::bind(&LLFloaterTranslationSettings::onGoogleKeyEdited, this), NULL);
+
+ center();
+ return TRUE;
+}
+
+// virtual
+void LLFloaterTranslationSettings::onOpen(const LLSD& key)
+{
+ mMachineTranslationCB->setValue(gSavedSettings.getBOOL("TranslateChat"));
+ mLanguageCombo->setSelectedByValue(gSavedSettings.getString("TranslateLanguage"), TRUE);
+ mTranslationServiceRadioGroup->setSelectedByValue(gSavedSettings.getString("TranslationService"), TRUE);
+
+ std::string bing_key = gSavedSettings.getString("BingTranslateAPIKey");
+ if (!bing_key.empty())
+ {
+ mBingAPIKeyEditor->setText(bing_key);
+ mBingAPIKeyEditor->setTentative(FALSE);
+ verifyKey(LLTranslate::SERVICE_BING, bing_key, false);
+ }
+ else
+ {
+ mBingAPIKeyEditor->setTentative(TRUE);
+ mBingKeyVerified = FALSE;
+ }
+
+ std::string google_key = gSavedSettings.getString("GoogleTranslateAPIKey");
+ if (!google_key.empty())
+ {
+ mGoogleAPIKeyEditor->setText(google_key);
+ mGoogleAPIKeyEditor->setTentative(FALSE);
+ verifyKey(LLTranslate::SERVICE_GOOGLE, google_key, false);
+ }
+ else
+ {
+ mGoogleAPIKeyEditor->setTentative(TRUE);
+ mGoogleKeyVerified = FALSE;
+ }
+
+ updateControlsEnabledState();
+}
+
+void LLFloaterTranslationSettings::setBingVerified(bool ok, bool alert)
+{
+ if (alert)
+ {
+ showAlert(ok ? "bing_api_key_verified" : "bing_api_key_not_verified");
+ }
+
+ mBingKeyVerified = ok;
+ updateControlsEnabledState();
+}
+
+void LLFloaterTranslationSettings::setGoogleVerified(bool ok, bool alert)
+{
+ if (alert)
+ {
+ showAlert(ok ? "google_api_key_verified" : "google_api_key_not_verified");
+ }
+
+ mGoogleKeyVerified = ok;
+ updateControlsEnabledState();
+}
+
+std::string LLFloaterTranslationSettings::getSelectedService() const
+{
+ return mTranslationServiceRadioGroup->getSelectedValue().asString();
+}
+
+std::string LLFloaterTranslationSettings::getEnteredBingKey() const
+{
+ return mBingAPIKeyEditor->getTentative() ? LLStringUtil::null : mBingAPIKeyEditor->getText();
+}
+
+std::string LLFloaterTranslationSettings::getEnteredGoogleKey() const
+{
+ return mGoogleAPIKeyEditor->getTentative() ? LLStringUtil::null : mGoogleAPIKeyEditor->getText();
+}
+
+void LLFloaterTranslationSettings::showAlert(const std::string& msg_name) const
+{
+ LLSD args;
+ args["MESSAGE"] = getString(msg_name);
+ LLNotificationsUtil::add("GenericAlert", args);
+}
+
+void LLFloaterTranslationSettings::updateControlsEnabledState()
+{
+ // Enable/disable controls based on the checkbox value.
+ bool on = mMachineTranslationCB->getValue().asBoolean();
+ std::string service = getSelectedService();
+ bool bing_selected = service == "bing";
+ bool google_selected = service == "google";
+
+ mTranslationServiceRadioGroup->setEnabled(on);
+ mLanguageCombo->setEnabled(on);
+
+ getChild<LLTextBox>("bing_api_key_label")->setEnabled(on);
+ mBingAPIKeyEditor->setEnabled(on);
+
+ getChild<LLTextBox>("google_api_key_label")->setEnabled(on);
+ mGoogleAPIKeyEditor->setEnabled(on);
+
+ mBingAPIKeyEditor->setEnabled(on && bing_selected);
+ mGoogleAPIKeyEditor->setEnabled(on && google_selected);
+
+ mBingVerifyBtn->setEnabled(on && bing_selected &&
+ !mBingKeyVerified && !getEnteredBingKey().empty());
+ mGoogleVerifyBtn->setEnabled(on && google_selected &&
+ !mGoogleKeyVerified && !getEnteredGoogleKey().empty());
+
+ mOKBtn->setEnabled(
+ !on || (
+ (bing_selected && mBingKeyVerified) ||
+ (google_selected && mGoogleKeyVerified)
+ ));
+}
+
+void LLFloaterTranslationSettings::verifyKey(int service, const std::string& key, bool alert)
+{
+ LLTranslate::KeyVerificationReceiverPtr receiver =
+ new EnteredKeyVerifier((LLTranslate::EService) service, alert);
+ LLTranslate::verifyKey(receiver, key);
+}
+
+void LLFloaterTranslationSettings::onEditorFocused(LLFocusableElement* control)
+{
+ LLLineEditor* editor = dynamic_cast<LLLineEditor*>(control);
+ if (editor && editor->hasTabStop()) // if enabled. getEnabled() doesn't work
+ {
+ if (editor->getTentative())
+ {
+ editor->setText(LLStringUtil::null);
+ editor->setTentative(FALSE);
+ }
+ }
+}
+
+void LLFloaterTranslationSettings::onBingKeyEdited()
+{
+ if (mBingAPIKeyEditor->isDirty())
+ {
+ setBingVerified(false, false);
+ }
+}
+
+void LLFloaterTranslationSettings::onGoogleKeyEdited()
+{
+ if (mGoogleAPIKeyEditor->isDirty())
+ {
+ setGoogleVerified(false, false);
+ }
+}
+
+void LLFloaterTranslationSettings::onBtnBingVerify()
+{
+ std::string key = getEnteredBingKey();
+ if (!key.empty())
+ {
+ verifyKey(LLTranslate::SERVICE_BING, key);
+ }
+}
+
+void LLFloaterTranslationSettings::onBtnGoogleVerify()
+{
+ std::string key = getEnteredGoogleKey();
+ if (!key.empty())
+ {
+ verifyKey(LLTranslate::SERVICE_GOOGLE, key);
+ }
+}
+
+void LLFloaterTranslationSettings::onBtnOK()
+{
+ gSavedSettings.setBOOL("TranslateChat", mMachineTranslationCB->getValue().asBoolean());
+ gSavedSettings.setString("TranslateLanguage", mLanguageCombo->getSelectedValue().asString());
+ gSavedSettings.setString("TranslationService", getSelectedService());
+ gSavedSettings.setString("BingTranslateAPIKey", getEnteredBingKey());
+ gSavedSettings.setString("GoogleTranslateAPIKey", getEnteredGoogleKey());
+ LLNearbyChatBar::getInstance()->showTranslationCheckbox(LLTranslate::isTranslationConfigured());
+ closeFloater(false);
+}
diff --git a/indra/newview/llfloatertranslationsettings.h b/indra/newview/llfloatertranslationsettings.h
new file mode 100644
index 0000000000..9b47ad72ed
--- /dev/null
+++ b/indra/newview/llfloatertranslationsettings.h
@@ -0,0 +1,76 @@
+/**
+ * @file llfloatertranslationsettings.h
+ * @brief Machine translation settings for chat
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLFLOATERTRANSLATIONSETTINGS_H
+#define LL_LLFLOATERTRANSLATIONSETTINGS_H
+
+#include "llfloater.h"
+
+class LLButton;
+class LLCheckBoxCtrl;
+class LLComboBox;
+class LLLineEditor;
+class LLRadioGroup;
+
+class LLFloaterTranslationSettings : public LLFloater
+{
+public:
+ LLFloaterTranslationSettings(const LLSD& key);
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void onOpen(const LLSD& key);
+
+ void setBingVerified(bool ok, bool alert);
+ void setGoogleVerified(bool ok, bool alert);
+
+private:
+ std::string getSelectedService() const;
+ std::string getEnteredBingKey() const;
+ std::string getEnteredGoogleKey() const;
+ void showAlert(const std::string& msg_name) const;
+ void updateControlsEnabledState();
+ void verifyKey(int service, const std::string& key, bool alert = true);
+
+ void onEditorFocused(LLFocusableElement* control);
+ void onBingKeyEdited();
+ void onGoogleKeyEdited();
+ void onBtnBingVerify();
+ void onBtnGoogleVerify();
+ void onBtnOK();
+
+ LLCheckBoxCtrl* mMachineTranslationCB;
+ LLComboBox* mLanguageCombo;
+ LLLineEditor* mBingAPIKeyEditor;
+ LLLineEditor* mGoogleAPIKeyEditor;
+ LLRadioGroup* mTranslationServiceRadioGroup;
+ LLButton* mBingVerifyBtn;
+ LLButton* mGoogleVerifyBtn;
+ LLButton* mOKBtn;
+
+ bool mBingKeyVerified;
+ bool mGoogleKeyVerified;
+};
+
+#endif // LL_LLFLOATERTRANSLATIONSETTINGS_H
diff --git a/indra/newview/llfloateruipreview.cpp b/indra/newview/llfloateruipreview.cpp
index 11b3379814..d741b5b133 100644
--- a/indra/newview/llfloateruipreview.cpp
+++ b/indra/newview/llfloateruipreview.cpp
@@ -35,6 +35,7 @@
#include "llfloateruipreview.h" // Own header
// Internal utility
+#include "lldiriterator.h"
#include "lleventtimer.h"
#include "llexternaleditor.h"
#include "llrender.h"
@@ -481,9 +482,11 @@ BOOL LLFloaterUIPreview::postBuild()
std::string language_directory;
std::string xui_dir = get_xui_dir(); // directory containing localizations -- don't forget trailing delim
mLanguageSelection->removeall(); // clear out anything temporarily in list from XML
+
+ LLDirIterator iter(xui_dir, "*");
while(found) // for every directory
{
- if((found = gDirUtilp->getNextFileInDir(xui_dir, "*", language_directory))) // get next directory
+ if((found = iter.next(language_directory))) // get next directory
{
std::string full_path = xui_dir + language_directory;
if(LLFile::isfile(full_path.c_str())) // if it's not a directory, skip it
@@ -635,42 +638,51 @@ void LLFloaterUIPreview::refreshList()
mFileList->clearRows(); // empty list
std::string name;
BOOL found = TRUE;
+
+ LLDirIterator floater_iter(getLocalizedDirectory(), "floater_*.xml");
while(found) // for every floater file that matches the pattern
{
- if((found = gDirUtilp->getNextFileInDir(getLocalizedDirectory(), "floater_*.xml", name))) // get next file matching pattern
+ if((found = floater_iter.next(name))) // get next file matching pattern
{
addFloaterEntry(name.c_str()); // and add it to the list (file name only; localization code takes care of rest of path)
}
}
found = TRUE;
+
+ LLDirIterator inspect_iter(getLocalizedDirectory(), "inspect_*.xml");
while(found) // for every inspector file that matches the pattern
{
- if((found = gDirUtilp->getNextFileInDir(getLocalizedDirectory(), "inspect_*.xml", name))) // get next file matching pattern
+ if((found = inspect_iter.next(name))) // get next file matching pattern
{
addFloaterEntry(name.c_str()); // and add it to the list (file name only; localization code takes care of rest of path)
}
}
found = TRUE;
+
+ LLDirIterator menu_iter(getLocalizedDirectory(), "menu_*.xml");
while(found) // for every menu file that matches the pattern
{
- if((found = gDirUtilp->getNextFileInDir(getLocalizedDirectory(), "menu_*.xml", name))) // get next file matching pattern
+ if((found = menu_iter.next(name))) // get next file matching pattern
{
addFloaterEntry(name.c_str()); // and add it to the list (file name only; localization code takes care of rest of path)
}
}
found = TRUE;
+
+ LLDirIterator panel_iter(getLocalizedDirectory(), "panel_*.xml");
while(found) // for every panel file that matches the pattern
{
- if((found = gDirUtilp->getNextFileInDir(getLocalizedDirectory(), "panel_*.xml", name))) // get next file matching pattern
+ if((found = panel_iter.next(name))) // get next file matching pattern
{
addFloaterEntry(name.c_str()); // and add it to the list (file name only; localization code takes care of rest of path)
}
}
-
found = TRUE;
+
+ LLDirIterator sidepanel_iter(getLocalizedDirectory(), "sidepanel_*.xml");
while(found) // for every sidepanel file that matches the pattern
{
- if((found = gDirUtilp->getNextFileInDir(getLocalizedDirectory(), "sidepanel_*.xml", name))) // get next file matching pattern
+ if((found = sidepanel_iter.next(name))) // get next file matching pattern
{
addFloaterEntry(name.c_str()); // and add it to the list (file name only; localization code takes care of rest of path)
}
@@ -903,14 +915,16 @@ void LLFloaterUIPreview::displayFloater(BOOL click, S32 ID, bool save)
{
panel->buildFromFile(path); // build it
LLRect new_size = panel->getRect(); // get its rectangle
- panel->setOrigin(0,0); // reset its origin point so it's not offset by -left or other XUI attributes
+ panel->setOrigin(2,2); // reset its origin point so it's not offset by -left or other XUI attributes
(*floaterp)->setTitle(path); // use the file name as its title, since panels have no guaranteed meaningful name attribute
panel->setUseBoundingRect(TRUE); // enable the use of its outer bounding rect (normally disabled because it's O(n) on the number of sub-elements)
panel->updateBoundingRect(); // update bounding rect
LLRect bounding_rect = panel->getBoundingRect(); // get the bounding rect
LLRect new_rect = panel->getRect(); // get the panel's rect
new_rect.unionWith(bounding_rect); // union them to make sure we get the biggest one possible
- (*floaterp)->reshape(new_rect.getWidth(), new_rect.getHeight() + floater_header_size); // reshape floater to match the union rect's dimensions
+ LLRect floater_rect = new_rect;
+ floater_rect.stretch(4, 4);
+ (*floaterp)->reshape(floater_rect.getWidth(), floater_rect.getHeight() + floater_header_size); // reshape floater to match the union rect's dimensions
panel->reshape(new_rect.getWidth(), new_rect.getHeight()); // reshape panel to match the union rect's dimensions as well (both are needed)
(*floaterp)->addChild(panel); // add panel as child
(*floaterp)->openFloater(); // open floater (needed?)
@@ -1037,18 +1051,29 @@ void LLFloaterUIPreview::onClickEditFloater()
cmd_override = bin + " " + args;
}
}
- if (!mExternalEditor.setCommand("LL_XUI_EDITOR", cmd_override))
+
+ LLExternalEditor::EErrorCode status = mExternalEditor.setCommand("LL_XUI_EDITOR", cmd_override);
+ if (status != LLExternalEditor::EC_SUCCESS)
{
- std::string warning = "Select an editor by setting the environment variable LL_XUI_EDITOR "
- "or the ExternalEditor setting or specifying its path in the \"Editor Path\" field.";
+ std::string warning;
+
+ if (status == LLExternalEditor::EC_NOT_SPECIFIED) // Use custom message for this error.
+ {
+ warning = getString("ExternalEditorNotSet");
+ }
+ else
+ {
+ warning = LLExternalEditor::getErrorMessage(status);
+ }
+
popupAndPrintWarning(warning);
return;
}
// Run the editor.
- if (!mExternalEditor.run(file_path))
+ if (mExternalEditor.run(file_path) != LLExternalEditor::EC_SUCCESS)
{
- popupAndPrintWarning("Failed to run editor");
+ popupAndPrintWarning(LLExternalEditor::getErrorMessage(status));
return;
}
}
diff --git a/indra/newview/llfloatervoiceeffect.cpp b/indra/newview/llfloatervoiceeffect.cpp
index 2a3950f9b1..227720bee3 100644
--- a/indra/newview/llfloatervoiceeffect.cpp
+++ b/indra/newview/llfloatervoiceeffect.cpp
@@ -145,7 +145,9 @@ void LLFloaterVoiceEffect::refreshEffectList()
for (voice_effect_list_t::const_iterator it = template_list.begin(); it != template_list.end(); ++it)
{
const LLUUID& effect_id = it->second;
- std::string effect_name = it->first;
+
+ std::string localized_effect = "effect_" + it->first;
+ std::string effect_name = hasString(localized_effect) ? getString(localized_effect) : it->first; // XML contains localized effects names
LLSD effect_properties = effect_interface->getVoiceEffectProperties(effect_id);
diff --git a/indra/newview/llfloaterwater.cpp b/indra/newview/llfloaterwater.cpp
deleted file mode 100644
index be4b144f41..0000000000
--- a/indra/newview/llfloaterwater.cpp
+++ /dev/null
@@ -1,625 +0,0 @@
-/**
- * @file llfloaterwater.cpp
- * @brief LLFloaterWater class definition
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llfloaterwater.h"
-
-#include "pipeline.h"
-#include "llsky.h"
-
-#include "llfloaterreg.h"
-#include "llsliderctrl.h"
-#include "llspinctrl.h"
-#include "llcolorswatch.h"
-#include "llcheckboxctrl.h"
-#include "lltexturectrl.h"
-#include "lluictrlfactory.h"
-#include "llviewercamera.h"
-#include "llcombobox.h"
-#include "lllineeditor.h"
-#include "llnotificationsutil.h"
-#include "llfloaterdaycycle.h"
-#include "llboost.h"
-#include "llmultisliderctrl.h"
-
-#include "v4math.h"
-#include "llviewerdisplay.h"
-#include "llviewercontrol.h"
-#include "llviewerwindow.h"
-#include "llsavedsettingsglue.h"
-
-#include "llwaterparamset.h"
-#include "llwaterparammanager.h"
-#include "llpostprocess.h"
-
-#undef max
-
-std::set<std::string> LLFloaterWater::sDefaultPresets;
-
-LLFloaterWater::LLFloaterWater(const LLSD& key)
- : LLFloater(key)
-{
-}
-
-LLFloaterWater::~LLFloaterWater()
-{
-}
-BOOL LLFloaterWater::postBuild()
-{
-
- std::string def_water = getString("WLDefaultWaterNames");
-
- // no editing or deleting of the blank string
- sDefaultPresets.insert("");
- boost_tokenizer tokens(def_water, boost::char_separator<char>(":"));
- for (boost_tokenizer::iterator token_iter = tokens.begin(); token_iter != tokens.end(); ++token_iter)
- {
- std::string tok(*token_iter);
- sDefaultPresets.insert(tok);
- }
-
- // add the combo boxes
- LLComboBox* comboBox = getChild<LLComboBox>("WaterPresetsCombo");
-
- if(comboBox != NULL) {
-
- std::map<std::string, LLWaterParamSet>::iterator mIt =
- LLWaterParamManager::instance()->mParamList.begin();
- for(; mIt != LLWaterParamManager::instance()->mParamList.end(); mIt++)
- {
- comboBox->add(mIt->first);
- }
-
- // set defaults on combo boxes
- comboBox->selectByValue(LLSD("Default"));
- }
- // load it up
- initCallbacks();
- syncMenu();
- return TRUE;
-}
-void LLFloaterWater::initCallbacks(void) {
-
- LLWaterParamManager * param_mgr = LLWaterParamManager::instance();
-
- getChild<LLUICtrl>("WaterFogColor")->setCommitCallback(boost::bind(&LLFloaterWater::onWaterFogColorMoved, this, _1, &param_mgr->mFogColor));
-
- //
- getChild<LLUICtrl>("WaterGlow")->setCommitCallback(boost::bind(&LLFloaterWater::onColorControlAMoved, this, _1, &param_mgr->mFogColor));
-
- // fog density
- getChild<LLUICtrl>("WaterFogDensity")->setCommitCallback(boost::bind(&LLFloaterWater::onExpFloatControlMoved, this, _1, &param_mgr->mFogDensity));
- getChild<LLUICtrl>("WaterUnderWaterFogMod")->setCommitCallback(boost::bind(&LLFloaterWater::onFloatControlMoved, this, _1, &param_mgr->mUnderWaterFogMod));
-
- // blue density
- getChild<LLUICtrl>("WaterNormalScaleX")->setCommitCallback(boost::bind(&LLFloaterWater::onVector3ControlXMoved, this, _1, &param_mgr->mNormalScale));
- getChild<LLUICtrl>("WaterNormalScaleY")->setCommitCallback(boost::bind(&LLFloaterWater::onVector3ControlYMoved, this, _1, &param_mgr->mNormalScale));
- getChild<LLUICtrl>("WaterNormalScaleZ")->setCommitCallback(boost::bind(&LLFloaterWater::onVector3ControlZMoved, this, _1, &param_mgr->mNormalScale));
-
- // fresnel
- getChild<LLUICtrl>("WaterFresnelScale")->setCommitCallback(boost::bind(&LLFloaterWater::onFloatControlMoved, this, _1, &param_mgr->mFresnelScale));
- getChild<LLUICtrl>("WaterFresnelOffset")->setCommitCallback(boost::bind(&LLFloaterWater::onFloatControlMoved, this, _1, &param_mgr->mFresnelOffset));
-
- // scale above/below
- getChild<LLUICtrl>("WaterScaleAbove")->setCommitCallback(boost::bind(&LLFloaterWater::onFloatControlMoved, this, _1, &param_mgr->mScaleAbove));
- getChild<LLUICtrl>("WaterScaleBelow")->setCommitCallback(boost::bind(&LLFloaterWater::onFloatControlMoved, this, _1, &param_mgr->mScaleBelow));
-
- // blur mult
- getChild<LLUICtrl>("WaterBlurMult")->setCommitCallback(boost::bind(&LLFloaterWater::onFloatControlMoved, this, _1, &param_mgr->mBlurMultiplier));
-
- // Load/save
-// getChild<LLUICtrl>("WaterLoadPreset")->setCommitCallback(boost::bind(&LLFloaterWater::onLoadPreset, this));
- getChild<LLUICtrl>("WaterNewPreset")->setCommitCallback(boost::bind(&LLFloaterWater::onNewPreset, this));
- getChild<LLUICtrl>("WaterSavePreset")->setCommitCallback(boost::bind(&LLFloaterWater::onSavePreset, this));
- getChild<LLUICtrl>("WaterDeletePreset")->setCommitCallback(boost::bind(&LLFloaterWater::onDeletePreset, this));
-
- // wave direction
- getChild<LLUICtrl>("WaterWave1DirX")->setCommitCallback(boost::bind(&LLFloaterWater::onVector2ControlXMoved, this, _1, &param_mgr->mWave1Dir));
- getChild<LLUICtrl>("WaterWave1DirY")->setCommitCallback(boost::bind(&LLFloaterWater::onVector2ControlYMoved, this, _1, &param_mgr->mWave1Dir));
- getChild<LLUICtrl>("WaterWave2DirX")->setCommitCallback(boost::bind(&LLFloaterWater::onVector2ControlXMoved, this, _1, &param_mgr->mWave2Dir));
- getChild<LLUICtrl>("WaterWave2DirY")->setCommitCallback(boost::bind(&LLFloaterWater::onVector2ControlYMoved, this, _1, &param_mgr->mWave2Dir));
-
- getChild<LLUICtrl>("WaterPresetsCombo")->setCommitCallback(boost::bind(&LLFloaterWater::onChangePresetName, this, _1));
-
- LLTextureCtrl* textCtrl = getChild<LLTextureCtrl>("WaterNormalMap");
- textCtrl->setDefaultImageAssetID(DEFAULT_WATER_NORMAL);
- getChild<LLUICtrl>("WaterNormalMap")->setCommitCallback(boost::bind(&LLFloaterWater::onNormalMapPicked, this, _1));
-}
-
-bool LLFloaterWater::newPromptCallback(const LLSD& notification, const LLSD& response)
-{
- std::string text = response["message"].asString();
- S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
-
- if(text == "")
- {
- return false;
- }
-
- if(option == 0) {
- LLComboBox* comboBox = getChild<LLComboBox>( "WaterPresetsCombo");
-
- LLWaterParamManager * param_mgr = LLWaterParamManager::instance();
-
- // add the current parameters to the list
- // see if it's there first
- std::map<std::string, LLWaterParamSet>::iterator mIt =
- param_mgr->mParamList.find(text);
-
- // if not there, add a new one
- if(mIt == param_mgr->mParamList.end())
- {
- param_mgr->addParamSet(text, param_mgr->mCurParams);
- comboBox->add(text);
- comboBox->sortByName();
-
- comboBox->setSelectedByValue(text, true);
-
- param_mgr->savePreset(text);
-
- // otherwise, send a message to the user
- }
- else
- {
- LLNotificationsUtil::add("ExistsWaterPresetAlert");
- }
- }
- return false;
-}
-
-void LLFloaterWater::syncMenu()
-{
- bool err;
-
- LLWaterParamManager * param_mgr = LLWaterParamManager::instance();
-
- LLWaterParamSet & current_params = param_mgr->mCurParams;
-
- // blue horizon
- param_mgr->mFogColor = current_params.getVector4(param_mgr->mFogColor.mName, err);
-
- LLColor4 col = param_mgr->getFogColor();
- getChild<LLUICtrl>("WaterGlow")->setValue(col.mV[3]);
- col.mV[3] = 1.0f;
- LLColorSwatchCtrl* colCtrl = getChild<LLColorSwatchCtrl>("WaterFogColor");
-
- colCtrl->set(col);
-
- // fog and wavelets
- param_mgr->mFogDensity.mExp =
- log(current_params.getFloat(param_mgr->mFogDensity.mName, err)) /
- log(param_mgr->mFogDensity.mBase);
- param_mgr->setDensitySliderValue(param_mgr->mFogDensity.mExp);
- getChild<LLUICtrl>("WaterFogDensity")->setValue(param_mgr->mFogDensity.mExp);
-
- param_mgr->mUnderWaterFogMod.mX =
- current_params.getFloat(param_mgr->mUnderWaterFogMod.mName, err);
- getChild<LLUICtrl>("WaterUnderWaterFogMod")->setValue(param_mgr->mUnderWaterFogMod.mX);
-
- param_mgr->mNormalScale = current_params.getVector3(param_mgr->mNormalScale.mName, err);
- getChild<LLUICtrl>("WaterNormalScaleX")->setValue(param_mgr->mNormalScale.mX);
- getChild<LLUICtrl>("WaterNormalScaleY")->setValue(param_mgr->mNormalScale.mY);
- getChild<LLUICtrl>("WaterNormalScaleZ")->setValue(param_mgr->mNormalScale.mZ);
-
- // Fresnel
- param_mgr->mFresnelScale.mX = current_params.getFloat(param_mgr->mFresnelScale.mName, err);
- getChild<LLUICtrl>("WaterFresnelScale")->setValue(param_mgr->mFresnelScale.mX);
- param_mgr->mFresnelOffset.mX = current_params.getFloat(param_mgr->mFresnelOffset.mName, err);
- getChild<LLUICtrl>("WaterFresnelOffset")->setValue(param_mgr->mFresnelOffset.mX);
-
- // Scale Above/Below
- param_mgr->mScaleAbove.mX = current_params.getFloat(param_mgr->mScaleAbove.mName, err);
- getChild<LLUICtrl>("WaterScaleAbove")->setValue(param_mgr->mScaleAbove.mX);
- param_mgr->mScaleBelow.mX = current_params.getFloat(param_mgr->mScaleBelow.mName, err);
- getChild<LLUICtrl>("WaterScaleBelow")->setValue(param_mgr->mScaleBelow.mX);
-
- // blur mult
- param_mgr->mBlurMultiplier.mX = current_params.getFloat(param_mgr->mBlurMultiplier.mName, err);
- getChild<LLUICtrl>("WaterBlurMult")->setValue(param_mgr->mBlurMultiplier.mX);
-
- // wave directions
- param_mgr->mWave1Dir = current_params.getVector2(param_mgr->mWave1Dir.mName, err);
- getChild<LLUICtrl>("WaterWave1DirX")->setValue(param_mgr->mWave1Dir.mX);
- getChild<LLUICtrl>("WaterWave1DirY")->setValue(param_mgr->mWave1Dir.mY);
-
- param_mgr->mWave2Dir = current_params.getVector2(param_mgr->mWave2Dir.mName, err);
- getChild<LLUICtrl>("WaterWave2DirX")->setValue(param_mgr->mWave2Dir.mX);
- getChild<LLUICtrl>("WaterWave2DirY")->setValue(param_mgr->mWave2Dir.mY);
-
- LLTextureCtrl* textCtrl = getChild<LLTextureCtrl>("WaterNormalMap");
- textCtrl->setImageAssetID(param_mgr->getNormalMapID());
-}
-
-
-// vector control callbacks
-void LLFloaterWater::onVector3ControlXMoved(LLUICtrl* ctrl, WaterVector3Control* vectorControl)
-{
- LLSliderCtrl* sldrCtrl = static_cast<LLSliderCtrl*>(ctrl);
-
- vectorControl->mX = sldrCtrl->getValueF32();
-
- vectorControl->update(LLWaterParamManager::instance()->mCurParams);
-
- LLWaterParamManager::instance()->propagateParameters();
-}
-
-// vector control callbacks
-void LLFloaterWater::onVector3ControlYMoved(LLUICtrl* ctrl, WaterVector3Control* vectorControl)
-{
- LLSliderCtrl* sldrCtrl = static_cast<LLSliderCtrl*>(ctrl);
-
- vectorControl->mY = sldrCtrl->getValueF32();
-
- vectorControl->update(LLWaterParamManager::instance()->mCurParams);
-
- LLWaterParamManager::instance()->propagateParameters();
-}
-
-// vector control callbacks
-void LLFloaterWater::onVector3ControlZMoved(LLUICtrl* ctrl, WaterVector3Control* vectorControl)
-{
- LLSliderCtrl* sldrCtrl = static_cast<LLSliderCtrl*>(ctrl);
-
- vectorControl->mZ = sldrCtrl->getValueF32();
-
- vectorControl->update(LLWaterParamManager::instance()->mCurParams);
-
- LLWaterParamManager::instance()->propagateParameters();
-}
-
-
-// vector control callbacks
-void LLFloaterWater::onVector2ControlXMoved(LLUICtrl* ctrl, WaterVector2Control* vectorControl)
-{
- LLSliderCtrl* sldrCtrl = static_cast<LLSliderCtrl*>(ctrl);
-
- vectorControl->mX = sldrCtrl->getValueF32();
-
- vectorControl->update(LLWaterParamManager::instance()->mCurParams);
-
- LLWaterParamManager::instance()->propagateParameters();
-}
-
-// vector control callbacks
-void LLFloaterWater::onVector2ControlYMoved(LLUICtrl* ctrl, WaterVector2Control* vectorControl)
-{
- LLSliderCtrl* sldrCtrl = static_cast<LLSliderCtrl*>(ctrl);
-
- vectorControl->mY = sldrCtrl->getValueF32();
-
- vectorControl->update(LLWaterParamManager::instance()->mCurParams);
-
- LLWaterParamManager::instance()->propagateParameters();
-}
-
-// color control callbacks
-void LLFloaterWater::onColorControlRMoved(LLUICtrl* ctrl, WaterColorControl* colorControl)
-{
- LLSliderCtrl* sldrCtrl = static_cast<LLSliderCtrl*>(ctrl);
-
- colorControl->mR = sldrCtrl->getValueF32();
-
- // move i if it's the max
- if(colorControl->mR >= colorControl->mG
- && colorControl->mR >= colorControl->mB
- && colorControl->mHasSliderName)
- {
- colorControl->mI = colorControl->mR;
- std::string name = colorControl->mSliderName;
- name.append("I");
-
- getChild<LLUICtrl>(name)->setValue(colorControl->mR);
- }
-
- colorControl->update(LLWaterParamManager::instance()->mCurParams);
-
- LLWaterParamManager::instance()->propagateParameters();
-}
-
-void LLFloaterWater::onColorControlGMoved(LLUICtrl* ctrl, WaterColorControl* colorControl)
-{
- LLSliderCtrl* sldrCtrl = static_cast<LLSliderCtrl*>(ctrl);
-
- colorControl->mG = sldrCtrl->getValueF32();
-
- // move i if it's the max
- if(colorControl->mG >= colorControl->mR
- && colorControl->mG >= colorControl->mB
- && colorControl->mHasSliderName)
- {
- colorControl->mI = colorControl->mG;
- std::string name = colorControl->mSliderName;
- name.append("I");
-
- getChild<LLUICtrl>(name)->setValue(colorControl->mG);
-
- }
-
- colorControl->update(LLWaterParamManager::instance()->mCurParams);
-
- LLWaterParamManager::instance()->propagateParameters();
-}
-
-void LLFloaterWater::onColorControlBMoved(LLUICtrl* ctrl, WaterColorControl* colorControl)
-{
- LLSliderCtrl* sldrCtrl = static_cast<LLSliderCtrl*>(ctrl);
-
- colorControl->mB = sldrCtrl->getValueF32();
-
- // move i if it's the max
- if(colorControl->mB >= colorControl->mR
- && colorControl->mB >= colorControl->mG
- && colorControl->mHasSliderName)
- {
- colorControl->mI = colorControl->mB;
- std::string name = colorControl->mSliderName;
- name.append("I");
-
- getChild<LLUICtrl>(name)->setValue(colorControl->mB);
- }
-
- colorControl->update(LLWaterParamManager::instance()->mCurParams);
-
- LLWaterParamManager::instance()->propagateParameters();
-}
-
-void LLFloaterWater::onColorControlAMoved(LLUICtrl* ctrl, WaterColorControl* colorControl)
-{
- LLSliderCtrl* sldrCtrl = static_cast<LLSliderCtrl*>(ctrl);
-
- colorControl->mA = sldrCtrl->getValueF32();
-
- colorControl->update(LLWaterParamManager::instance()->mCurParams);
-
- LLWaterParamManager::instance()->propagateParameters();
-}
-
-
-void LLFloaterWater::onColorControlIMoved(LLUICtrl* ctrl, WaterColorControl* colorControl)
-{
- LLSliderCtrl* sldrCtrl = static_cast<LLSliderCtrl*>(ctrl);
-
- colorControl->mI = sldrCtrl->getValueF32();
-
- // only for sliders where we pass a name
- if(colorControl->mHasSliderName)
- {
- // set it to the top
- F32 maxVal = std::max(std::max(colorControl->mR, colorControl->mG), colorControl->mB);
- F32 iVal;
-
- iVal = colorControl->mI;
-
- // get the names of the other sliders
- std::string rName = colorControl->mSliderName;
- rName.append("R");
- std::string gName = colorControl->mSliderName;
- gName.append("G");
- std::string bName = colorControl->mSliderName;
- bName.append("B");
-
- // handle if at 0
- if(iVal == 0)
- {
- colorControl->mR = 0;
- colorControl->mG = 0;
- colorControl->mB = 0;
-
- // if all at the start
- // set them all to the intensity
- }
- else if (maxVal == 0)
- {
- colorControl->mR = iVal;
- colorControl->mG = iVal;
- colorControl->mB = iVal;
- }
- else
- {
- // add delta amounts to each
- F32 delta = (iVal - maxVal) / maxVal;
- colorControl->mR *= (1.0f + delta);
- colorControl->mG *= (1.0f + delta);
- colorControl->mB *= (1.0f + delta);
- }
-
- // set the sliders to the new vals
- getChild<LLUICtrl>(rName)->setValue(colorControl->mR);
- getChild<LLUICtrl>(gName)->setValue(colorControl->mG);
- getChild<LLUICtrl>(bName)->setValue(colorControl->mB);
- }
-
- // now update the current parameters and send them to shaders
- colorControl->update(LLWaterParamManager::instance()->mCurParams);
- LLWaterParamManager::instance()->propagateParameters();
-}
-
-void LLFloaterWater::onExpFloatControlMoved(LLUICtrl* ctrl, WaterExpFloatControl* expFloatControl)
-{
- LLSliderCtrl* sldrCtrl = static_cast<LLSliderCtrl*>(ctrl);
-
- F32 val = sldrCtrl->getValueF32();
- expFloatControl->mExp = val;
- LLWaterParamManager::instance()->setDensitySliderValue(val);
-
- expFloatControl->update(LLWaterParamManager::instance()->mCurParams);
- LLWaterParamManager::instance()->propagateParameters();
-}
-
-void LLFloaterWater::onFloatControlMoved(LLUICtrl* ctrl, WaterFloatControl* floatControl)
-{
- LLSliderCtrl* sldrCtrl = static_cast<LLSliderCtrl*>(ctrl);
-
- floatControl->mX = sldrCtrl->getValueF32() / floatControl->mMult;
-
- floatControl->update(LLWaterParamManager::instance()->mCurParams);
- LLWaterParamManager::instance()->propagateParameters();
-}
-void LLFloaterWater::onWaterFogColorMoved(LLUICtrl* ctrl, WaterColorControl* colorControl)
-{
- LLColorSwatchCtrl* swatch = static_cast<LLColorSwatchCtrl*>(ctrl);
- *colorControl = swatch->get();
-
- colorControl->update(LLWaterParamManager::instance()->mCurParams);
- LLWaterParamManager::instance()->propagateParameters();
-}
-
-void LLFloaterWater::onNormalMapPicked(LLUICtrl* ctrl)
-{
- LLTextureCtrl* textCtrl = static_cast<LLTextureCtrl*>(ctrl);
- LLUUID textID = textCtrl->getImageAssetID();
- LLWaterParamManager::instance()->setNormalMapID(textID);
-}
-
-void LLFloaterWater::onNewPreset()
-{
- LLNotificationsUtil::add("NewWaterPreset", LLSD(), LLSD(), boost::bind(&LLFloaterWater::newPromptCallback, this, _1, _2));
-}
-
-void LLFloaterWater::onSavePreset()
-{
- // get the name
- LLComboBox* comboBox = getChild<LLComboBox>("WaterPresetsCombo");
-
- // don't save the empty name
- if(comboBox->getSelectedItemLabel() == "")
- {
- return;
- }
-
- LLWaterParamManager::instance()->mCurParams.mName =
- comboBox->getSelectedItemLabel();
-
- // check to see if it's a default and shouldn't be overwritten
- std::set<std::string>::iterator sIt = sDefaultPresets.find(
- comboBox->getSelectedItemLabel());
- if(sIt != sDefaultPresets.end() && !gSavedSettings.getBOOL("WaterEditPresets"))
- {
- LLNotificationsUtil::add("WLNoEditDefault");
- return;
- }
-
- LLNotificationsUtil::add("WLSavePresetAlert", LLSD(), LLSD(), boost::bind(&LLFloaterWater::saveAlertCallback, this, _1, _2));
-}
-
-bool LLFloaterWater::saveAlertCallback(const LLSD& notification, const LLSD& response)
-{
- S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
- // if they choose save, do it. Otherwise, don't do anything
- if(option == 0)
- {
- LLWaterParamManager * param_mgr = LLWaterParamManager::instance();
-
- param_mgr->setParamSet(
- param_mgr->mCurParams.mName,
- param_mgr->mCurParams);
-
- // comment this back in to save to file
- param_mgr->savePreset(param_mgr->mCurParams.mName);
- }
- return false;
-}
-
-void LLFloaterWater::onDeletePreset()
-{
- LLComboBox* combo_box = getChild<LLComboBox>("WaterPresetsCombo");
-
- if(combo_box->getSelectedValue().asString() == "")
- {
- return;
- }
-
- LLSD args;
- args["SKY"] = combo_box->getSelectedValue().asString();
- LLNotificationsUtil::add("WLDeletePresetAlert", args, LLSD(), boost::bind(&LLFloaterWater::deleteAlertCallback, this, _1, _2));
-}
-
-bool LLFloaterWater::deleteAlertCallback(const LLSD& notification, const LLSD& response)
-{
- S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
- // if they choose delete, do it. Otherwise, don't do anything
- if(option == 0)
- {
- LLComboBox* combo_box = getChild<LLComboBox>("WaterPresetsCombo");
- LLFloaterDayCycle* day_cycle = LLFloaterReg::findTypedInstance<LLFloaterDayCycle>("env_day_cycle");
- LLComboBox* key_combo = NULL;
-
- if (day_cycle)
- {
- key_combo = day_cycle->getChild<LLComboBox>("WaterKeyPresets");
- }
-
- std::string name = combo_box->getSelectedValue().asString();
-
- // check to see if it's a default and shouldn't be deleted
- std::set<std::string>::iterator sIt = sDefaultPresets.find(name);
- if(sIt != sDefaultPresets.end())
- {
- LLNotificationsUtil::add("WaterNoEditDefault");
- return false;
- }
-
- LLWaterParamManager::instance()->removeParamSet(name, true);
-
- // remove and choose another
- S32 new_index = combo_box->getCurrentIndex();
-
- combo_box->remove(name);
-
- if(key_combo != NULL)
- {
- key_combo->remove(name);
-
- // remove from slider, as well
- day_cycle->deletePreset(name);
- }
-
- // pick the previously selected index after delete
- if(new_index > 0)
- {
- new_index--;
- }
-
- if(combo_box->getItemCount() > 0)
- {
- combo_box->setCurrentByIndex(new_index);
- }
- }
- return false;
-}
-
-
-void LLFloaterWater::onChangePresetName(LLUICtrl* ctrl)
-{
- std::string data = ctrl->getValue().asString();
- if(!data.empty())
- {
- LLWaterParamManager::instance()->loadPreset(data);
- syncMenu();
- }
-}
-
diff --git a/indra/newview/llfloaterwater.h b/indra/newview/llfloaterwater.h
deleted file mode 100644
index e3db91e80d..0000000000
--- a/indra/newview/llfloaterwater.h
+++ /dev/null
@@ -1,107 +0,0 @@
-/**
- * @file llfloaterwindlight.h
- * @brief LLFloaterWater class definition
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-/*
- * Menu for adjusting the atmospheric settings of the world
- */
-
-#ifndef LL_LLFLOATER_WATER_H
-#define LL_LLFLOATER_WATER_H
-
-#include "llfloater.h"
-
-#include <vector>
-#include "llwlparamset.h"
-
-struct WaterVector2Control;
-struct WaterVector3Control;
-struct WaterColorControl;
-struct WaterFloatControl;
-struct WaterExpFloatControl;
-
-/// Menuing system for all of windlight's functionality
-class LLFloaterWater : public LLFloater
-{
-public:
-
- LLFloaterWater(const LLSD& key);
- virtual ~LLFloaterWater();
- /*virtual*/ BOOL postBuild();
- /// initialize all
- void initCallbacks(void);
-
- bool newPromptCallback(const LLSD& notification, const LLSD& response);
-
- /// general purpose callbacks for dealing with color controllers
- void onColorControlRMoved(LLUICtrl* ctrl, WaterColorControl* colorControl);
- void onColorControlGMoved(LLUICtrl* ctrl, WaterColorControl* colorControl);
- void onColorControlBMoved(LLUICtrl* ctrl, WaterColorControl* colorControl);
- void onColorControlAMoved(LLUICtrl* ctrl, WaterColorControl* colorControl);
- void onColorControlIMoved(LLUICtrl* ctrl, WaterColorControl* colorControl);
-
- void onVector3ControlXMoved(LLUICtrl* ctrl, WaterVector3Control* vectorControl);
- void onVector3ControlYMoved(LLUICtrl* ctrl, WaterVector3Control* vectorControl);
- void onVector3ControlZMoved(LLUICtrl* ctrl, WaterVector3Control* vectorControl);
-
- void onVector2ControlXMoved(LLUICtrl* ctrl, WaterVector2Control* vectorControl);
- void onVector2ControlYMoved(LLUICtrl* ctrl, WaterVector2Control* vectorControl);
-
- void onFloatControlMoved(LLUICtrl* ctrl, WaterFloatControl* floatControl);
-
- void onExpFloatControlMoved(LLUICtrl* ctrl, WaterExpFloatControl* expFloatControl);
-
- void onWaterFogColorMoved(LLUICtrl* ctrl, WaterColorControl* colorControl);
-
- /// handle if they choose a new normal map
- void onNormalMapPicked(LLUICtrl* ctrl);
-
- /// when user hits the load preset button
- void onNewPreset();
-
- /// when user hits the save preset button
- void onSavePreset();
-
- /// prompts a user when overwriting a preset
- bool saveAlertCallback(const LLSD& notification, const LLSD& response);
-
- /// when user hits the save preset button
- void onDeletePreset();
-
- /// prompts a user when overwriting a preset
- bool deleteAlertCallback(const LLSD& notification, const LLSD& response);
-
- /// what to do when you change the preset name
- void onChangePresetName(LLUICtrl* ctrl);
-
- /// sync up sliders with parameters
- void syncMenu();
-
-private:
- static std::set<std::string> sDefaultPresets;
-};
-
-
-#endif
diff --git a/indra/newview/llfloaterwebcontent.cpp b/indra/newview/llfloaterwebcontent.cpp
new file mode 100644
index 0000000000..3fe2518de6
--- /dev/null
+++ b/indra/newview/llfloaterwebcontent.cpp
@@ -0,0 +1,467 @@
+/**
+ * @file llfloaterwebcontent.cpp
+ * @brief floater for displaying web content - e.g. profiles and search (eventually)
+ *
+ * $LicenseInfo:firstyear=2006&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llcombobox.h"
+#include "lliconctrl.h"
+#include "llfloaterreg.h"
+#include "lllayoutstack.h"
+#include "llpluginclassmedia.h"
+#include "llprogressbar.h"
+#include "lltextbox.h"
+#include "llurlhistory.h"
+#include "llviewercontrol.h"
+#include "llweb.h"
+#include "llwindow.h"
+
+#include "llfloaterwebcontent.h"
+
+LLFloaterWebContent::_Params::_Params()
+: url("url"),
+ target("target"),
+ id("id"),
+ window_class("window_class", "web_content"),
+ show_chrome("show_chrome", true),
+ allow_address_entry("allow_address_entry", true),
+ preferred_media_size("preferred_media_size"),
+ trusted_content("trusted_content", false),
+ show_page_title("show_page_title", true)
+{}
+
+LLFloaterWebContent::LLFloaterWebContent( const Params& params )
+: LLFloater( params ),
+ LLInstanceTracker<LLFloaterWebContent, std::string>(params.id()),
+ mWebBrowser(NULL),
+ mAddressCombo(NULL),
+ mSecureLockIcon(NULL),
+ mStatusBarText(NULL),
+ mStatusBarProgress(NULL),
+ mBtnBack(NULL),
+ mBtnForward(NULL),
+ mBtnReload(NULL),
+ mBtnStop(NULL),
+ mUUID(params.id()),
+ mShowPageTitle(params.show_page_title)
+{
+ mCommitCallbackRegistrar.add( "WebContent.Back", boost::bind( &LLFloaterWebContent::onClickBack, this ));
+ mCommitCallbackRegistrar.add( "WebContent.Forward", boost::bind( &LLFloaterWebContent::onClickForward, this ));
+ mCommitCallbackRegistrar.add( "WebContent.Reload", boost::bind( &LLFloaterWebContent::onClickReload, this ));
+ mCommitCallbackRegistrar.add( "WebContent.Stop", boost::bind( &LLFloaterWebContent::onClickStop, this ));
+ mCommitCallbackRegistrar.add( "WebContent.EnterAddress", boost::bind( &LLFloaterWebContent::onEnterAddress, this ));
+ mCommitCallbackRegistrar.add( "WebContent.PopExternal", boost::bind( &LLFloaterWebContent::onPopExternal, this ));
+}
+
+BOOL LLFloaterWebContent::postBuild()
+{
+ // these are used in a bunch of places so cache them
+ mWebBrowser = getChild< LLMediaCtrl >( "webbrowser" );
+ mAddressCombo = getChild< LLComboBox >( "address" );
+ mStatusBarText = getChild< LLTextBox >( "statusbartext" );
+ mStatusBarProgress = getChild<LLProgressBar>("statusbarprogress" );
+
+ mBtnBack = getChildView( "back" );
+ mBtnForward = getChildView( "forward" );
+ mBtnReload = getChildView( "reload" );
+ mBtnStop = getChildView( "stop" );
+
+ // observe browser events
+ mWebBrowser->addObserver( this );
+
+ // these buttons are always enabled
+ mBtnReload->setEnabled( true );
+ getChildView("popexternal")->setEnabled( true );
+
+ // cache image for secure browsing
+ mSecureLockIcon = getChild< LLIconCtrl >("media_secure_lock_flag");
+
+ // initialize the URL history using the system URL History manager
+ initializeURLHistory();
+
+ return TRUE;
+}
+
+void LLFloaterWebContent::initializeURLHistory()
+{
+ // start with an empty list
+ LLCtrlListInterface* url_list = childGetListInterface("address");
+ if (url_list)
+ {
+ url_list->operateOnAll(LLCtrlListInterface::OP_DELETE);
+ }
+
+ // Get all of the entries in the "browser" collection
+ LLSD browser_history = LLURLHistory::getURLHistory("browser");
+ LLSD::array_iterator iter_history = browser_history.beginArray();
+ LLSD::array_iterator end_history = browser_history.endArray();
+ for(; iter_history != end_history; ++iter_history)
+ {
+ std::string url = (*iter_history).asString();
+ if(! url.empty())
+ url_list->addSimpleElement(url);
+ }
+}
+
+bool LLFloaterWebContent::matchesKey(const LLSD& key)
+{
+ Params p(mKey);
+ Params other_p(key);
+ if (!other_p.target().empty() && other_p.target() != "_blank")
+ {
+ return other_p.target() == p.target();
+ }
+ else
+ {
+ return other_p.id() == p.id();
+ }
+}
+
+//static
+LLFloater* LLFloaterWebContent::create( Params p)
+{
+ preCreate(p);
+ return new LLFloaterWebContent(p);
+}
+
+//static
+void LLFloaterWebContent::closeRequest(const std::string &uuid)
+{
+ LLFloaterWebContent* floaterp = instance_tracker_t::getInstance(uuid);
+ if (floaterp)
+ {
+ floaterp->closeFloater(false);
+ }
+}
+
+//static
+void LLFloaterWebContent::geometryChanged(const std::string &uuid, S32 x, S32 y, S32 width, S32 height)
+{
+ LLFloaterWebContent* floaterp = instance_tracker_t::getInstance(uuid);
+ if (floaterp)
+ {
+ floaterp->geometryChanged(x, y, width, height);
+ }
+}
+
+void LLFloaterWebContent::geometryChanged(S32 x, S32 y, S32 width, S32 height)
+{
+ // Make sure the layout of the browser control is updated, so this calculation is correct.
+ getChild<LLLayoutStack>("stack1")->updateLayout();
+
+ // TODO: need to adjust size and constrain position to make sure floaters aren't moved outside the window view, etc.
+ LLCoordWindow window_size;
+ getWindow()->getSize(&window_size);
+
+ // Adjust width and height for the size of the chrome on the web Browser window.
+ LLRect browser_rect;
+ mWebBrowser->localRectToOtherView(mWebBrowser->getLocalRect(), &browser_rect, this);
+
+ S32 requested_browser_bottom = window_size.mY - (y + height);
+ LLRect geom;
+ geom.setOriginAndSize(x - browser_rect.mLeft,
+ requested_browser_bottom - browser_rect.mBottom,
+ width + getRect().getWidth() - browser_rect.getWidth(),
+ height + getRect().getHeight() - browser_rect.getHeight());
+
+ lldebugs << "geometry change: " << geom << llendl;
+
+ LLRect new_rect;
+ getParent()->screenRectToLocal(geom, &new_rect);
+ setShape(new_rect);
+}
+
+// static
+void LLFloaterWebContent::preCreate(LLFloaterWebContent::Params& p)
+{
+ lldebugs << "url = " << p.url() << ", target = " << p.target() << ", uuid = " << p.id() << llendl;
+
+ if (!p.id.isProvided())
+ {
+ p.id = LLUUID::generateNewID().asString();
+ }
+
+ if(p.target().empty() || p.target() == "_blank")
+ {
+ p.target = p.id();
+ }
+
+ S32 browser_window_limit = gSavedSettings.getS32("WebContentWindowLimit");
+ if(browser_window_limit != 0)
+ {
+ // showInstance will open a new window. Figure out how many web browsers are already open,
+ // and close the least recently opened one if this will put us over the limit.
+
+ LLFloaterReg::const_instance_list_t &instances = LLFloaterReg::getFloaterList(p.window_class);
+ lldebugs << "total instance count is " << instances.size() << llendl;
+
+ for(LLFloaterReg::const_instance_list_t::const_iterator iter = instances.begin(); iter != instances.end(); iter++)
+ {
+ lldebugs << " " << (*iter)->getKey()["target"] << llendl;
+ }
+
+ if(instances.size() >= (size_t)browser_window_limit)
+ {
+ // Destroy the least recently opened instance
+ (*instances.begin())->closeFloater();
+ }
+ }
+}
+
+void LLFloaterWebContent::open_media(const Params& p)
+{
+ // Specifying a mime type of text/html here causes the plugin system to skip the MIME type probe and just open a browser plugin.
+ LLViewerMedia::proxyWindowOpened(p.target(), p.id());
+ mWebBrowser->setHomePageUrl(p.url, "text/html");
+ mWebBrowser->setTarget(p.target);
+ mWebBrowser->navigateTo(p.url, "text/html");
+
+ set_current_url(p.url);
+
+ getChild<LLLayoutPanel>("status_bar")->setVisible(p.show_chrome);
+ getChild<LLLayoutPanel>("nav_controls")->setVisible(p.show_chrome);
+ bool address_entry_enabled = p.allow_address_entry && !p.trusted_content;
+ getChildView("address")->setEnabled(address_entry_enabled);
+ getChildView("popexternal")->setEnabled(address_entry_enabled);
+
+ if (!address_entry_enabled)
+ {
+ mWebBrowser->setFocus(TRUE);
+ }
+
+ if (!p.show_chrome)
+ {
+ setResizeLimits(100, 100);
+ }
+
+ if (!p.preferred_media_size().isEmpty())
+ {
+ getChild<LLLayoutStack>("stack1")->updateLayout();
+ LLRect browser_rect = mWebBrowser->calcScreenRect();
+ LLCoordWindow window_size;
+ getWindow()->getSize(&window_size);
+
+ geometryChanged(browser_rect.mLeft, window_size.mY - browser_rect.mTop, p.preferred_media_size().getWidth(), p.preferred_media_size().getHeight());
+ }
+
+}
+
+void LLFloaterWebContent::onOpen(const LLSD& key)
+{
+ Params params(key);
+
+ if (!params.validateBlock())
+ {
+ closeFloater();
+ return;
+ }
+
+ mWebBrowser->setTrustedContent(params.trusted_content);
+
+ // tell the browser instance to load the specified URL
+ open_media(params);
+}
+
+//virtual
+void LLFloaterWebContent::onClose(bool app_quitting)
+{
+ LLViewerMedia::proxyWindowClosed(mUUID);
+ destroy();
+}
+
+// virtual
+void LLFloaterWebContent::draw()
+{
+ // this is asynchronous so we need to keep checking
+ mBtnBack->setEnabled( mWebBrowser->canNavigateBack() );
+ mBtnForward->setEnabled( mWebBrowser->canNavigateForward() );
+
+ LLFloater::draw();
+}
+
+// virtual
+void LLFloaterWebContent::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event)
+{
+ if(event == MEDIA_EVENT_LOCATION_CHANGED)
+ {
+ const std::string url = self->getLocation();
+
+ if ( url.length() )
+ mStatusBarText->setText( url );
+
+ set_current_url( url );
+ }
+ else if(event == MEDIA_EVENT_NAVIGATE_BEGIN)
+ {
+ // flags are sent with this event
+ mBtnBack->setEnabled( self->getHistoryBackAvailable() );
+ mBtnForward->setEnabled( self->getHistoryForwardAvailable() );
+
+ // toggle visibility of these buttons based on browser state
+ mBtnReload->setVisible( false );
+ mBtnStop->setVisible( true );
+
+ // turn "on" progress bar now we're about to start loading
+ mStatusBarProgress->setVisible( true );
+ }
+ else if(event == MEDIA_EVENT_NAVIGATE_COMPLETE)
+ {
+ // flags are sent with this event
+ mBtnBack->setEnabled( self->getHistoryBackAvailable() );
+ mBtnForward->setEnabled( self->getHistoryForwardAvailable() );
+
+ // toggle visibility of these buttons based on browser state
+ mBtnReload->setVisible( true );
+ mBtnStop->setVisible( false );
+
+ // turn "off" progress bar now we're loaded
+ mStatusBarProgress->setVisible( false );
+
+ // we populate the status bar with URLs as they change so clear it now we're done
+ const std::string end_str = "";
+ mStatusBarText->setText( end_str );
+
+ // decide if secure browsing icon should be displayed
+ std::string prefix = std::string("https://");
+ std::string test_prefix = mCurrentURL.substr(0, prefix.length());
+ LLStringUtil::toLower(test_prefix);
+ if(test_prefix == prefix)
+ {
+ mSecureLockIcon->setVisible(true);
+ }
+ else
+ {
+ mSecureLockIcon->setVisible(false);
+ }
+ }
+ else if(event == MEDIA_EVENT_CLOSE_REQUEST)
+ {
+ // The browser instance wants its window closed.
+ closeFloater();
+ }
+ else if(event == MEDIA_EVENT_GEOMETRY_CHANGE)
+ {
+ geometryChanged(self->getGeometryX(), self->getGeometryY(), self->getGeometryWidth(), self->getGeometryHeight());
+ }
+ else if(event == MEDIA_EVENT_STATUS_TEXT_CHANGED )
+ {
+ const std::string text = self->getStatusText();
+ if ( text.length() )
+ mStatusBarText->setText( text );
+ }
+ else if(event == MEDIA_EVENT_PROGRESS_UPDATED )
+ {
+ int percent = (int)self->getProgressPercent();
+ mStatusBarProgress->setValue( percent );
+ }
+ else if(event == MEDIA_EVENT_NAME_CHANGED )
+ {
+ std::string page_title = self->getMediaName();
+ // simulate browser behavior - title is empty, use the current URL
+ if (mShowPageTitle)
+ {
+ if ( page_title.length() > 0 )
+ setTitle( page_title );
+ else
+ setTitle( mCurrentURL );
+ }
+ }
+ else if(event == MEDIA_EVENT_LINK_HOVERED )
+ {
+ const std::string link = self->getHoverLink();
+ mStatusBarText->setText( link );
+ }
+}
+
+void LLFloaterWebContent::set_current_url(const std::string& url)
+{
+ mCurrentURL = url;
+
+ // serialize url history into the system URL History manager
+ LLURLHistory::removeURL("browser", mCurrentURL);
+ LLURLHistory::addURL("browser", mCurrentURL);
+
+ mAddressCombo->remove( mCurrentURL );
+ mAddressCombo->add( mCurrentURL );
+ mAddressCombo->selectByValue( mCurrentURL );
+}
+
+void LLFloaterWebContent::onClickForward()
+{
+ mWebBrowser->navigateForward();
+}
+
+void LLFloaterWebContent::onClickBack()
+{
+ mWebBrowser->navigateBack();
+}
+
+void LLFloaterWebContent::onClickReload()
+{
+
+ if( mWebBrowser->getMediaPlugin() )
+ {
+ bool ignore_cache = true;
+ mWebBrowser->getMediaPlugin()->browse_reload( ignore_cache );
+ }
+ else
+ {
+ mWebBrowser->navigateTo(mCurrentURL);
+ }
+}
+
+void LLFloaterWebContent::onClickStop()
+{
+ if( mWebBrowser->getMediaPlugin() )
+ mWebBrowser->getMediaPlugin()->browse_stop();
+
+ // still should happen when we catch the navigate complete event
+ // but sometimes (don't know why) that event isn't sent from Qt
+ // and we ghetto a point where the stop button stays active.
+ mBtnReload->setVisible( true );
+ mBtnStop->setVisible( false );
+}
+
+void LLFloaterWebContent::onEnterAddress()
+{
+ // make sure there is at least something there.
+ // (perhaps this test should be for minimum length of a URL)
+ std::string url = mAddressCombo->getValue().asString();
+ if ( url.length() > 0 )
+ {
+ mWebBrowser->navigateTo( url, "text/html");
+ };
+}
+
+void LLFloaterWebContent::onPopExternal()
+{
+ // make sure there is at least something there.
+ // (perhaps this test should be for minimum length of a URL)
+ std::string url = mAddressCombo->getValue().asString();
+ if ( url.length() > 0 )
+ {
+ LLWeb::loadURLExternal( url );
+ };
+}
diff --git a/indra/newview/llfloaterwebcontent.h b/indra/newview/llfloaterwebcontent.h
new file mode 100644
index 0000000000..cfc87e9015
--- /dev/null
+++ b/indra/newview/llfloaterwebcontent.h
@@ -0,0 +1,113 @@
+/**
+ * @file llfloaterwebcontent.h
+ * @brief floater for displaying web content - e.g. profiles and search (eventually)
+ *
+ * $LicenseInfo:firstyear=2006&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLFLOATERWEBCONTENT_H
+#define LL_LLFLOATERWEBCONTENT_H
+
+#include "llfloater.h"
+#include "llmediactrl.h"
+#include "llsdparam.h"
+
+class LLMediaCtrl;
+class LLComboBox;
+class LLTextBox;
+class LLProgressBar;
+class LLIconCtrl;
+
+class LLFloaterWebContent :
+ public LLFloater,
+ public LLViewerMediaObserver,
+ public LLInstanceTracker<LLFloaterWebContent, std::string>
+{
+public:
+ typedef LLInstanceTracker<LLFloaterWebContent, std::string> instance_tracker_t;
+ LOG_CLASS(LLFloaterWebContent);
+
+ struct _Params : public LLInitParam::Block<_Params>
+ {
+ Optional<std::string> url,
+ target,
+ window_class,
+ id;
+ Optional<bool> show_chrome,
+ allow_address_entry,
+ trusted_content,
+ show_page_title;
+ Optional<LLRect> preferred_media_size;
+
+ _Params();
+ };
+
+ typedef LLSDParamAdapter<_Params> Params;
+
+ LLFloaterWebContent(const Params& params);
+
+ void initializeURLHistory();
+
+ static LLFloater* create(Params);
+
+ static void closeRequest(const std::string &uuid);
+ static void geometryChanged(const std::string &uuid, S32 x, S32 y, S32 width, S32 height);
+ void geometryChanged(S32 x, S32 y, S32 width, S32 height);
+
+ /* virtual */ BOOL postBuild();
+ /* virtual */ void onOpen(const LLSD& key);
+ /* virtual */ bool matchesKey(const LLSD& key);
+ /* virtual */ void onClose(bool app_quitting);
+ /* virtual */ void draw();
+
+protected:
+ // inherited from LLViewerMediaObserver
+ /*virtual*/ void handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event);
+
+ void onClickBack();
+ void onClickForward();
+ void onClickReload();
+ void onClickStop();
+ void onEnterAddress();
+ void onPopExternal();
+
+ static void preCreate(Params& p);
+ void open_media(const Params& );
+ void set_current_url(const std::string& url);
+
+ LLMediaCtrl* mWebBrowser;
+ LLComboBox* mAddressCombo;
+ LLIconCtrl* mSecureLockIcon;
+ LLTextBox* mStatusBarText;
+ LLProgressBar* mStatusBarProgress;
+
+ LLView* mBtnBack;
+ LLView* mBtnForward;
+ LLView* mBtnReload;
+ LLView* mBtnStop;
+
+ std::string mCurrentURL;
+ std::string mUUID;
+ bool mShowPageTitle;
+};
+
+#endif // LL_LLFLOATERWEBCONTENT_H
diff --git a/indra/newview/llfloaterwebprofile.cpp b/indra/newview/llfloaterwebprofile.cpp
new file mode 100644
index 0000000000..c41f6f148f
--- /dev/null
+++ b/indra/newview/llfloaterwebprofile.cpp
@@ -0,0 +1,79 @@
+/**
+ * @file llfloaterwebprofile.cpp
+ * @brief Avatar profile floater.
+ *
+ * $LicenseInfo:firstyear=2009&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloaterwebprofile.h"
+
+#include "llviewercontrol.h"
+
+LLFloaterWebProfile::LLFloaterWebProfile(const Params& key) :
+ LLFloaterWebContent(key)
+{
+}
+
+void LLFloaterWebProfile::onOpen(const LLSD& key)
+{
+ Params p(key);
+ p.show_chrome(false).
+ window_class("profile");
+ LLFloaterWebContent::onOpen(p);
+ applyPreferredRect();
+}
+
+// virtual
+void LLFloaterWebProfile::handleReshape(const LLRect& new_rect, bool by_user)
+{
+ lldebugs << "handleReshape: " << new_rect << llendl;
+
+ if (by_user && !isMinimized())
+ {
+ lldebugs << "Storing new rect" << llendl;
+ gSavedSettings.setRect("WebProfileFloaterRect", new_rect);
+ }
+
+ LLFloaterWebContent::handleReshape(new_rect, by_user);
+}
+
+LLFloater* LLFloaterWebProfile::create(const LLSD& key)
+{
+ LLFloaterWebContent::Params p(key);
+ preCreate(p);
+ return new LLFloaterWebProfile(p);
+}
+
+void LLFloaterWebProfile::applyPreferredRect()
+{
+ const LLRect preferred_rect = gSavedSettings.getRect("WebProfileFloaterRect");
+ lldebugs << "Applying preferred rect: " << preferred_rect << llendl;
+
+ // Don't override position that may have been set by floater stacking code.
+ LLRect new_rect = getRect();
+ new_rect.setLeftTopAndSize(
+ new_rect.mLeft, new_rect.mTop,
+ preferred_rect.getWidth(), preferred_rect.getHeight());
+ setShape(new_rect);
+}
diff --git a/indra/newview/llfloaterwebprofile.h b/indra/newview/llfloaterwebprofile.h
new file mode 100644
index 0000000000..4c355e401b
--- /dev/null
+++ b/indra/newview/llfloaterwebprofile.h
@@ -0,0 +1,59 @@
+/**
+ * @file llfloaterwebprofile.h
+ * @brief Avatar profile floater.
+ *
+ * $LicenseInfo:firstyear=2009&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLFLOATERWEBPROFILE_H
+#define LL_LLFLOATERWEBPROFILE_H
+
+#include "llfloaterwebcontent.h"
+#include "llviewermediaobserver.h"
+
+#include <string>
+
+class LLMediaCtrl;
+
+/**
+ * Displays avatar profile web page.
+ */
+class LLFloaterWebProfile
+: public LLFloaterWebContent
+{
+ LOG_CLASS(LLFloaterWebProfile);
+public:
+ typedef LLFloaterWebContent::Params Params;
+
+ LLFloaterWebProfile(const Params& key);
+
+ /*virtual*/ void onOpen(const LLSD& key);
+ /*virtual*/ void handleReshape(const LLRect& new_rect, bool by_user = false);
+
+ static LLFloater* create(const LLSD& key);
+
+private:
+ void applyPreferredRect();
+};
+
+#endif // LL_LLFLOATERWEBPROFILE_H
+
diff --git a/indra/newview/llfloaterwindlight.cpp b/indra/newview/llfloaterwindlight.cpp
deleted file mode 100644
index ae98b2cf99..0000000000
--- a/indra/newview/llfloaterwindlight.cpp
+++ /dev/null
@@ -1,875 +0,0 @@
-/**
- * @file llfloaterwindlight.cpp
- * @brief LLFloaterWindLight class definition
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llfloaterwindlight.h"
-
-#include "pipeline.h"
-#include "llsky.h"
-
-#include "llfloaterreg.h"
-#include "llsliderctrl.h"
-#include "llmultislider.h"
-#include "llmultisliderctrl.h"
-#include "llnotificationsutil.h"
-#include "llspinctrl.h"
-#include "llcheckboxctrl.h"
-#include "lluictrlfactory.h"
-#include "llviewercamera.h"
-#include "llcombobox.h"
-#include "lllineeditor.h"
-#include "llfloaterdaycycle.h"
-#include "llboost.h"
-
-#include "v4math.h"
-#include "llviewerdisplay.h"
-#include "llviewercontrol.h"
-#include "llviewerwindow.h"
-#include "llsavedsettingsglue.h"
-
-#include "llwlparamset.h"
-#include "llwlparammanager.h"
-#include "llpostprocess.h"
-#include "lltabcontainer.h"
-
-
-#undef max
-
-std::set<std::string> LLFloaterWindLight::sDefaultPresets;
-
-static const F32 WL_SUN_AMBIENT_SLIDER_SCALE = 3.0f;
-
-LLFloaterWindLight::LLFloaterWindLight(const LLSD& key)
- : LLFloater(key)
-{
-}
-
-LLFloaterWindLight::~LLFloaterWindLight()
-{
-}
-
-BOOL LLFloaterWindLight::postBuild()
-{
- // add the list of presets
- std::string def_days = getString("WLDefaultSkyNames");
-
- // no editing or deleting of the blank string
- sDefaultPresets.insert("");
- boost_tokenizer tokens(def_days, boost::char_separator<char>(":"));
- for (boost_tokenizer::iterator token_iter = tokens.begin(); token_iter != tokens.end(); ++token_iter)
- {
- std::string tok(*token_iter);
- sDefaultPresets.insert(tok);
- }
-
- // add the combo boxes
- LLComboBox* comboBox = getChild<LLComboBox>("WLPresetsCombo");
-
- if(comboBox != NULL) {
-
- std::map<std::string, LLWLParamSet>::iterator mIt =
- LLWLParamManager::instance()->mParamList.begin();
- for(; mIt != LLWLParamManager::instance()->mParamList.end(); mIt++)
- {
- comboBox->add(mIt->first);
- }
-
- // entry for when we're in estate time
- comboBox->add(LLStringUtil::null);
-
- // set defaults on combo boxes
- comboBox->selectByValue(LLSD("Default"));
- }
- // load it up
- initCallbacks();
-
- syncMenu();
-
- return TRUE;
-}
-void LLFloaterWindLight::initCallbacks(void) {
-
- LLWLParamManager * param_mgr = LLWLParamManager::instance();
-
- // blue horizon
- getChild<LLUICtrl>("WLBlueHorizonR")->setCommitCallback(boost::bind(&LLFloaterWindLight::onColorControlRMoved, this, _1, &param_mgr->mBlueHorizon));
- getChild<LLUICtrl>("WLBlueHorizonG")->setCommitCallback(boost::bind(&LLFloaterWindLight::onColorControlGMoved, this, _1, &param_mgr->mBlueHorizon));
- getChild<LLUICtrl>("WLBlueHorizonB")->setCommitCallback(boost::bind(&LLFloaterWindLight::onColorControlBMoved, this, _1, &param_mgr->mBlueHorizon));
- getChild<LLUICtrl>("WLBlueHorizonI")->setCommitCallback(boost::bind(&LLFloaterWindLight::onColorControlIMoved, this, _1, &param_mgr->mBlueHorizon));
-
- // haze density, horizon, mult, and altitude
- getChild<LLUICtrl>("WLHazeDensity")->setCommitCallback(boost::bind(&LLFloaterWindLight::onColorControlRMoved, this, _1, &param_mgr->mHazeDensity));
- getChild<LLUICtrl>("WLHazeHorizon")->setCommitCallback(boost::bind(&LLFloaterWindLight::onColorControlRMoved, this, _1, &param_mgr->mHazeHorizon));
- getChild<LLUICtrl>("WLDensityMult")->setCommitCallback(boost::bind(&LLFloaterWindLight::onFloatControlMoved, this, _1, &param_mgr->mDensityMult));
- getChild<LLUICtrl>("WLMaxAltitude")->setCommitCallback(boost::bind(&LLFloaterWindLight::onFloatControlMoved, this, _1, &param_mgr->mMaxAlt));
-
- // blue density
- getChild<LLUICtrl>("WLBlueDensityR")->setCommitCallback(boost::bind(&LLFloaterWindLight::onColorControlRMoved, this, _1, &param_mgr->mBlueDensity));
- getChild<LLUICtrl>("WLBlueDensityG")->setCommitCallback(boost::bind(&LLFloaterWindLight::onColorControlGMoved, this, _1, &param_mgr->mBlueDensity));
- getChild<LLUICtrl>("WLBlueDensityB")->setCommitCallback(boost::bind(&LLFloaterWindLight::onColorControlBMoved, this, _1, &param_mgr->mBlueDensity));
- getChild<LLUICtrl>("WLBlueDensityI")->setCommitCallback(boost::bind(&LLFloaterWindLight::onColorControlIMoved, this, _1, &param_mgr->mBlueDensity));
-
- // Lighting
-
- // sunlight
- getChild<LLUICtrl>("WLSunlightR")->setCommitCallback(boost::bind(&LLFloaterWindLight::onColorControlRMoved, this, _1, &param_mgr->mSunlight));
- getChild<LLUICtrl>("WLSunlightG")->setCommitCallback(boost::bind(&LLFloaterWindLight::onColorControlGMoved, this, _1, &param_mgr->mSunlight));
- getChild<LLUICtrl>("WLSunlightB")->setCommitCallback(boost::bind(&LLFloaterWindLight::onColorControlBMoved, this, _1, &param_mgr->mSunlight));
- getChild<LLUICtrl>("WLSunlightI")->setCommitCallback(boost::bind(&LLFloaterWindLight::onColorControlIMoved, this, _1, &param_mgr->mSunlight));
-
- // glow
- getChild<LLUICtrl>("WLGlowR")->setCommitCallback(boost::bind(&LLFloaterWindLight::onGlowRMoved, this, _1, &param_mgr->mGlow));
- getChild<LLUICtrl>("WLGlowB")->setCommitCallback(boost::bind(&LLFloaterWindLight::onGlowBMoved, this, _1, &param_mgr->mGlow));
-
- // ambient
- getChild<LLUICtrl>("WLAmbientR")->setCommitCallback(boost::bind(&LLFloaterWindLight::onColorControlRMoved, this, _1, &param_mgr->mAmbient));
- getChild<LLUICtrl>("WLAmbientG")->setCommitCallback(boost::bind(&LLFloaterWindLight::onColorControlGMoved, this, _1, &param_mgr->mAmbient));
- getChild<LLUICtrl>("WLAmbientB")->setCommitCallback(boost::bind(&LLFloaterWindLight::onColorControlBMoved, this, _1, &param_mgr->mAmbient));
- getChild<LLUICtrl>("WLAmbientI")->setCommitCallback(boost::bind(&LLFloaterWindLight::onColorControlIMoved, this, _1, &param_mgr->mAmbient));
-
- // time of day
- getChild<LLUICtrl>("WLSunAngle")->setCommitCallback(boost::bind(&LLFloaterWindLight::onSunMoved, this, _1, &param_mgr->mLightnorm));
- getChild<LLUICtrl>("WLEastAngle")->setCommitCallback(boost::bind(&LLFloaterWindLight::onSunMoved, this, _1, &param_mgr->mLightnorm));
-
- // Clouds
-
- // Cloud Color
- getChild<LLUICtrl>("WLCloudColorR")->setCommitCallback(boost::bind(&LLFloaterWindLight::onColorControlRMoved, this, _1, &param_mgr->mCloudColor));
- getChild<LLUICtrl>("WLCloudColorG")->setCommitCallback(boost::bind(&LLFloaterWindLight::onColorControlGMoved, this, _1, &param_mgr->mCloudColor));
- getChild<LLUICtrl>("WLCloudColorB")->setCommitCallback(boost::bind(&LLFloaterWindLight::onColorControlBMoved, this, _1, &param_mgr->mCloudColor));
- getChild<LLUICtrl>("WLCloudColorI")->setCommitCallback(boost::bind(&LLFloaterWindLight::onColorControlIMoved, this, _1, &param_mgr->mCloudColor));
-
- // Cloud
- getChild<LLUICtrl>("WLCloudX")->setCommitCallback(boost::bind(&LLFloaterWindLight::onColorControlRMoved, this, _1, &param_mgr->mCloudMain));
- getChild<LLUICtrl>("WLCloudY")->setCommitCallback(boost::bind(&LLFloaterWindLight::onColorControlGMoved, this, _1, &param_mgr->mCloudMain));
- getChild<LLUICtrl>("WLCloudDensity")->setCommitCallback(boost::bind(&LLFloaterWindLight::onColorControlBMoved, this, _1, &param_mgr->mCloudMain));
-
- // Cloud Detail
- getChild<LLUICtrl>("WLCloudDetailX")->setCommitCallback(boost::bind(&LLFloaterWindLight::onColorControlRMoved, this, _1, &param_mgr->mCloudDetail));
- getChild<LLUICtrl>("WLCloudDetailY")->setCommitCallback(boost::bind(&LLFloaterWindLight::onColorControlGMoved, this, _1, &param_mgr->mCloudDetail));
- getChild<LLUICtrl>("WLCloudDetailDensity")->setCommitCallback(boost::bind(&LLFloaterWindLight::onColorControlBMoved, this, _1, &param_mgr->mCloudDetail));
-
- // Cloud extras
- getChild<LLUICtrl>("WLCloudCoverage")->setCommitCallback(boost::bind(&LLFloaterWindLight::onFloatControlMoved, this, _1, &param_mgr->mCloudCoverage));
- getChild<LLUICtrl>("WLCloudScale")->setCommitCallback(boost::bind(&LLFloaterWindLight::onFloatControlMoved, this, _1, &param_mgr->mCloudScale));
- getChild<LLUICtrl>("WLCloudLockX")->setCommitCallback(boost::bind(&LLFloaterWindLight::onCloudScrollXToggled, this, _1));
- getChild<LLUICtrl>("WLCloudLockY")->setCommitCallback(boost::bind(&LLFloaterWindLight::onCloudScrollYToggled, this, _1));
- getChild<LLUICtrl>("WLCloudScrollX")->setCommitCallback(boost::bind(&LLFloaterWindLight::onCloudScrollXMoved, this, _1));
- getChild<LLUICtrl>("WLCloudScrollY")->setCommitCallback(boost::bind(&LLFloaterWindLight::onCloudScrollYMoved, this, _1));
- getChild<LLUICtrl>("WLDistanceMult")->setCommitCallback(boost::bind(&LLFloaterWindLight::onFloatControlMoved, this, _1, &param_mgr->mDistanceMult));
- getChild<LLUICtrl>("DrawClassicClouds")->setCommitCallback(boost::bind(LLSavedSettingsGlue::setBOOL, _1, "SkyUseClassicClouds"));
-
- // WL Top
- getChild<LLUICtrl>("WLDayCycleMenuButton")->setCommitCallback(boost::bind(&LLFloaterWindLight::onOpenDayCycle, this));
- // Load/save
- LLComboBox* comboBox = getChild<LLComboBox>("WLPresetsCombo");
-
- //childSetAction("WLLoadPreset", onLoadPreset, comboBox);
- getChild<LLUICtrl>("WLNewPreset")->setCommitCallback(boost::bind(&LLFloaterWindLight::onNewPreset, this));
- getChild<LLUICtrl>("WLSavePreset")->setCommitCallback(boost::bind(&LLFloaterWindLight::onSavePreset, this));
- getChild<LLUICtrl>("WLDeletePreset")->setCommitCallback(boost::bind(&LLFloaterWindLight::onDeletePreset, this));
-
- comboBox->setCommitCallback(boost::bind(&LLFloaterWindLight::onChangePresetName, this, _1));
-
-
- // Dome
- getChild<LLUICtrl>("WLGamma")->setCommitCallback(boost::bind(&LLFloaterWindLight::onFloatControlMoved, this, _1, &param_mgr->mWLGamma));
- getChild<LLUICtrl>("WLStarAlpha")->setCommitCallback(boost::bind(&LLFloaterWindLight::onStarAlphaMoved, this, _1));
-}
-
-bool LLFloaterWindLight::newPromptCallback(const LLSD& notification, const LLSD& response)
-{
- std::string text = response["message"].asString();
- S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
-
- if(text == "")
- {
- return false;
- }
-
- if(option == 0) {
- LLComboBox* comboBox = getChild<LLComboBox>("WLPresetsCombo");
-
- LLFloaterDayCycle* day_cycle = LLFloaterReg::findTypedInstance<LLFloaterDayCycle>("env_day_cycle");
- LLComboBox* keyCombo = NULL;
- if(day_cycle)
- {
- keyCombo = day_cycle->getChild<LLComboBox>("WLKeyPresets");
- }
-
- // add the current parameters to the list
- // see if it's there first
- std::map<std::string, LLWLParamSet>::iterator mIt =
- LLWLParamManager::instance()->mParamList.find(text);
-
- // if not there, add a new one
- if(mIt == LLWLParamManager::instance()->mParamList.end())
- {
- LLWLParamManager::instance()->addParamSet(text,
- LLWLParamManager::instance()->mCurParams);
- comboBox->add(text);
- comboBox->sortByName();
-
- // add a blank to the bottom
- comboBox->selectFirstItem();
- if(comboBox->getSimple() == "")
- {
- comboBox->remove(0);
- }
- comboBox->add(LLStringUtil::null);
-
- comboBox->setSelectedByValue(text, true);
- if(keyCombo)
- {
- keyCombo->add(text);
- keyCombo->sortByName();
- }
- LLWLParamManager::instance()->savePreset(text);
-
- // otherwise, send a message to the user
- }
- else
- {
- LLNotificationsUtil::add("ExistsSkyPresetAlert");
- }
- }
- return false;
-}
-
-void LLFloaterWindLight::syncMenu()
-{
- bool err;
-
- LLWLParamManager * param_mgr = LLWLParamManager::instance();
-
- LLWLParamSet& currentParams = param_mgr->mCurParams;
- //std::map<std::string, LLVector4> & currentParams = param_mgr->mCurParams.mParamValues;
-
- // blue horizon
- param_mgr->mBlueHorizon = currentParams.getVector(param_mgr->mBlueHorizon.mName, err);
- getChild<LLUICtrl>("WLBlueHorizonR")->setValue(param_mgr->mBlueHorizon.r / 2.0);
- getChild<LLUICtrl>("WLBlueHorizonG")->setValue(param_mgr->mBlueHorizon.g / 2.0);
- getChild<LLUICtrl>("WLBlueHorizonB")->setValue(param_mgr->mBlueHorizon.b / 2.0);
- getChild<LLUICtrl>("WLBlueHorizonI")->setValue(
- std::max(param_mgr->mBlueHorizon.r / 2.0,
- std::max(param_mgr->mBlueHorizon.g / 2.0,
- param_mgr->mBlueHorizon.b / 2.0)));
-
- // haze density, horizon, mult, and altitude
- param_mgr->mHazeDensity = currentParams.getVector(param_mgr->mHazeDensity.mName, err);
- getChild<LLUICtrl>("WLHazeDensity")->setValue(param_mgr->mHazeDensity.r);
- param_mgr->mHazeHorizon = currentParams.getVector(param_mgr->mHazeHorizon.mName, err);
- getChild<LLUICtrl>("WLHazeHorizon")->setValue(param_mgr->mHazeHorizon.r);
- param_mgr->mDensityMult = currentParams.getVector(param_mgr->mDensityMult.mName, err);
- getChild<LLUICtrl>("WLDensityMult")->setValue(param_mgr->mDensityMult.x *
- param_mgr->mDensityMult.mult);
- param_mgr->mMaxAlt = currentParams.getVector(param_mgr->mMaxAlt.mName, err);
- getChild<LLUICtrl>("WLMaxAltitude")->setValue(param_mgr->mMaxAlt.x);
-
- // blue density
- param_mgr->mBlueDensity = currentParams.getVector(param_mgr->mBlueDensity.mName, err);
- getChild<LLUICtrl>("WLBlueDensityR")->setValue(param_mgr->mBlueDensity.r / 2.0);
- getChild<LLUICtrl>("WLBlueDensityG")->setValue(param_mgr->mBlueDensity.g / 2.0);
- getChild<LLUICtrl>("WLBlueDensityB")->setValue(param_mgr->mBlueDensity.b / 2.0);
- getChild<LLUICtrl>("WLBlueDensityI")->setValue(
- std::max(param_mgr->mBlueDensity.r / 2.0,
- std::max(param_mgr->mBlueDensity.g / 2.0, param_mgr->mBlueDensity.b / 2.0)));
-
- // Lighting
-
- // sunlight
- param_mgr->mSunlight = currentParams.getVector(param_mgr->mSunlight.mName, err);
- getChild<LLUICtrl>("WLSunlightR")->setValue(param_mgr->mSunlight.r / WL_SUN_AMBIENT_SLIDER_SCALE);
- getChild<LLUICtrl>("WLSunlightG")->setValue(param_mgr->mSunlight.g / WL_SUN_AMBIENT_SLIDER_SCALE);
- getChild<LLUICtrl>("WLSunlightB")->setValue(param_mgr->mSunlight.b / WL_SUN_AMBIENT_SLIDER_SCALE);
- getChild<LLUICtrl>("WLSunlightI")->setValue(
- std::max(param_mgr->mSunlight.r / WL_SUN_AMBIENT_SLIDER_SCALE,
- std::max(param_mgr->mSunlight.g / WL_SUN_AMBIENT_SLIDER_SCALE, param_mgr->mSunlight.b / WL_SUN_AMBIENT_SLIDER_SCALE)));
-
- // glow
- param_mgr->mGlow = currentParams.getVector(param_mgr->mGlow.mName, err);
- getChild<LLUICtrl>("WLGlowR")->setValue(2 - param_mgr->mGlow.r / 20.0f);
- getChild<LLUICtrl>("WLGlowB")->setValue(-param_mgr->mGlow.b / 5.0f);
-
- // ambient
- param_mgr->mAmbient = currentParams.getVector(param_mgr->mAmbient.mName, err);
- getChild<LLUICtrl>("WLAmbientR")->setValue(param_mgr->mAmbient.r / WL_SUN_AMBIENT_SLIDER_SCALE);
- getChild<LLUICtrl>("WLAmbientG")->setValue(param_mgr->mAmbient.g / WL_SUN_AMBIENT_SLIDER_SCALE);
- getChild<LLUICtrl>("WLAmbientB")->setValue(param_mgr->mAmbient.b / WL_SUN_AMBIENT_SLIDER_SCALE);
- getChild<LLUICtrl>("WLAmbientI")->setValue(
- std::max(param_mgr->mAmbient.r / WL_SUN_AMBIENT_SLIDER_SCALE,
- std::max(param_mgr->mAmbient.g / WL_SUN_AMBIENT_SLIDER_SCALE, param_mgr->mAmbient.b / WL_SUN_AMBIENT_SLIDER_SCALE)));
-
- getChild<LLUICtrl>("WLSunAngle")->setValue(param_mgr->mCurParams.getFloat("sun_angle",err) / F_TWO_PI);
- getChild<LLUICtrl>("WLEastAngle")->setValue(param_mgr->mCurParams.getFloat("east_angle",err) / F_TWO_PI);
-
- // Clouds
-
- // Cloud Color
- param_mgr->mCloudColor = currentParams.getVector(param_mgr->mCloudColor.mName, err);
- getChild<LLUICtrl>("WLCloudColorR")->setValue(param_mgr->mCloudColor.r);
- getChild<LLUICtrl>("WLCloudColorG")->setValue(param_mgr->mCloudColor.g);
- getChild<LLUICtrl>("WLCloudColorB")->setValue(param_mgr->mCloudColor.b);
- getChild<LLUICtrl>("WLCloudColorI")->setValue(
- std::max(param_mgr->mCloudColor.r,
- std::max(param_mgr->mCloudColor.g, param_mgr->mCloudColor.b)));
-
- // Cloud
- param_mgr->mCloudMain = currentParams.getVector(param_mgr->mCloudMain.mName, err);
- getChild<LLUICtrl>("WLCloudX")->setValue(param_mgr->mCloudMain.r);
- getChild<LLUICtrl>("WLCloudY")->setValue(param_mgr->mCloudMain.g);
- getChild<LLUICtrl>("WLCloudDensity")->setValue(param_mgr->mCloudMain.b);
-
- // Cloud Detail
- param_mgr->mCloudDetail = currentParams.getVector(param_mgr->mCloudDetail.mName, err);
- getChild<LLUICtrl>("WLCloudDetailX")->setValue(param_mgr->mCloudDetail.r);
- getChild<LLUICtrl>("WLCloudDetailY")->setValue(param_mgr->mCloudDetail.g);
- getChild<LLUICtrl>("WLCloudDetailDensity")->setValue(param_mgr->mCloudDetail.b);
-
- // Cloud extras
- param_mgr->mCloudCoverage = currentParams.getVector(param_mgr->mCloudCoverage.mName, err);
- param_mgr->mCloudScale = currentParams.getVector(param_mgr->mCloudScale.mName, err);
- getChild<LLUICtrl>("WLCloudCoverage")->setValue(param_mgr->mCloudCoverage.x);
- getChild<LLUICtrl>("WLCloudScale")->setValue(param_mgr->mCloudScale.x);
-
- // cloud scrolling
- bool lockX = !param_mgr->mCurParams.getEnableCloudScrollX();
- bool lockY = !param_mgr->mCurParams.getEnableCloudScrollY();
- getChild<LLUICtrl>("WLCloudLockX")->setValue(lockX);
- getChild<LLUICtrl>("WLCloudLockY")->setValue(lockY);
- getChild<LLUICtrl>("DrawClassicClouds")->setValue(gSavedSettings.getBOOL("SkyUseClassicClouds"));
-
- // disable if locked, enable if not
- if(lockX)
- {
- getChildView("WLCloudScrollX")->setEnabled(FALSE);
- } else {
- getChildView("WLCloudScrollX")->setEnabled(TRUE);
- }
- if(lockY)
- {
- getChildView("WLCloudScrollY")->setEnabled(FALSE);
- } else {
- getChildView("WLCloudScrollY")->setEnabled(TRUE);
- }
-
- // *HACK cloud scrolling is off my an additive of 10
- getChild<LLUICtrl>("WLCloudScrollX")->setValue(param_mgr->mCurParams.getCloudScrollX() - 10.0f);
- getChild<LLUICtrl>("WLCloudScrollY")->setValue(param_mgr->mCurParams.getCloudScrollY() - 10.0f);
-
- param_mgr->mDistanceMult = currentParams.getVector(param_mgr->mDistanceMult.mName, err);
- getChild<LLUICtrl>("WLDistanceMult")->setValue(param_mgr->mDistanceMult.x);
-
- // Tweak extras
-
- param_mgr->mWLGamma = currentParams.getVector(param_mgr->mWLGamma.mName, err);
- getChild<LLUICtrl>("WLGamma")->setValue(param_mgr->mWLGamma.x);
-
- getChild<LLUICtrl>("WLStarAlpha")->setValue(param_mgr->mCurParams.getStarBrightness());
-
- LLTabContainer* tab = getChild<LLTabContainer>("WindLight Tabs");
- LLPanel* panel = getChild<LLPanel>("Scattering");
-
- tab->enableTabButton(tab->getIndexForPanel(panel), gSavedSettings.getBOOL("RenderDeferredGI"));
-}
-
-
-// color control callbacks
-void LLFloaterWindLight::onColorControlRMoved(LLUICtrl* ctrl, WLColorControl* colorControl)
-{
- deactivateAnimator();
-
- LLSliderCtrl* sldrCtrl = static_cast<LLSliderCtrl*>(ctrl);
-
- colorControl->r = sldrCtrl->getValueF32();
- if(colorControl->isSunOrAmbientColor) {
- colorControl->r *= 3;
- }
- if(colorControl->isBlueHorizonOrDensity) {
- colorControl->r *= 2;
- }
-
- // move i if it's the max
- if(colorControl->r >= colorControl->g && colorControl->r >= colorControl->b
- && colorControl->hasSliderName) {
- colorControl->i = colorControl->r;
- std::string name = colorControl->mSliderName;
- name.append("I");
-
- if(colorControl->isSunOrAmbientColor) {
- getChild<LLUICtrl>(name)->setValue(colorControl->r / 3);
- } else if(colorControl->isBlueHorizonOrDensity) {
- getChild<LLUICtrl>(name)->setValue(colorControl->r / 2);
- } else {
- getChild<LLUICtrl>(name)->setValue(colorControl->r);
- }
- }
-
- colorControl->update(LLWLParamManager::instance()->mCurParams);
-
- LLWLParamManager::instance()->propagateParameters();
-}
-
-void LLFloaterWindLight::onColorControlGMoved(LLUICtrl* ctrl, WLColorControl* colorControl)
-{
- deactivateAnimator();
-
- LLSliderCtrl* sldrCtrl = static_cast<LLSliderCtrl*>(ctrl);
-
- colorControl->g = sldrCtrl->getValueF32();
- if(colorControl->isSunOrAmbientColor) {
- colorControl->g *= 3;
- }
- if(colorControl->isBlueHorizonOrDensity) {
- colorControl->g *= 2;
- }
-
- // move i if it's the max
- if(colorControl->g >= colorControl->r && colorControl->g >= colorControl->b
- && colorControl->hasSliderName) {
- colorControl->i = colorControl->g;
- std::string name = colorControl->mSliderName;
- name.append("I");
-
- if(colorControl->isSunOrAmbientColor) {
- getChild<LLUICtrl>(name)->setValue(colorControl->g / 3);
- } else if(colorControl->isBlueHorizonOrDensity) {
- getChild<LLUICtrl>(name)->setValue(colorControl->g / 2);
- } else {
- getChild<LLUICtrl>(name)->setValue(colorControl->g);
- }
- }
-
- colorControl->update(LLWLParamManager::instance()->mCurParams);
-
- LLWLParamManager::instance()->propagateParameters();
-}
-
-void LLFloaterWindLight::onColorControlBMoved(LLUICtrl* ctrl, WLColorControl* colorControl)
-{
- deactivateAnimator();
-
- LLSliderCtrl* sldrCtrl = static_cast<LLSliderCtrl*>(ctrl);
-
- colorControl->b = sldrCtrl->getValueF32();
- if(colorControl->isSunOrAmbientColor) {
- colorControl->b *= 3;
- }
- if(colorControl->isBlueHorizonOrDensity) {
- colorControl->b *= 2;
- }
-
- // move i if it's the max
- if(colorControl->b >= colorControl->r && colorControl->b >= colorControl->g
- && colorControl->hasSliderName) {
- colorControl->i = colorControl->b;
- std::string name = colorControl->mSliderName;
- name.append("I");
-
- if(colorControl->isSunOrAmbientColor) {
- getChild<LLUICtrl>(name)->setValue(colorControl->b / 3);
- } else if(colorControl->isBlueHorizonOrDensity) {
- getChild<LLUICtrl>(name)->setValue(colorControl->b / 2);
- } else {
- getChild<LLUICtrl>(name)->setValue(colorControl->b);
- }
- }
-
- colorControl->update(LLWLParamManager::instance()->mCurParams);
-
- LLWLParamManager::instance()->propagateParameters();
-}
-
-void LLFloaterWindLight::onColorControlIMoved(LLUICtrl* ctrl, WLColorControl* colorControl)
-{
- deactivateAnimator();
-
- LLSliderCtrl* sldrCtrl = static_cast<LLSliderCtrl*>(ctrl);
-
- colorControl->i = sldrCtrl->getValueF32();
-
- // only for sliders where we pass a name
- if(colorControl->hasSliderName) {
-
- // set it to the top
- F32 maxVal = std::max(std::max(colorControl->r, colorControl->g), colorControl->b);
- F32 iVal;
-
- if(colorControl->isSunOrAmbientColor)
- {
- iVal = colorControl->i * 3;
- }
- else if(colorControl->isBlueHorizonOrDensity)
- {
- iVal = colorControl->i * 2;
- }
- else
- {
- iVal = colorControl->i;
- }
-
- // get the names of the other sliders
- std::string rName = colorControl->mSliderName;
- rName.append("R");
- std::string gName = colorControl->mSliderName;
- gName.append("G");
- std::string bName = colorControl->mSliderName;
- bName.append("B");
-
- // handle if at 0
- if(iVal == 0) {
- colorControl->r = 0;
- colorControl->g = 0;
- colorControl->b = 0;
-
- // if all at the start
- // set them all to the intensity
- } else if (maxVal == 0) {
- colorControl->r = iVal;
- colorControl->g = iVal;
- colorControl->b = iVal;
-
- } else {
-
- // add delta amounts to each
- F32 delta = (iVal - maxVal) / maxVal;
- colorControl->r *= (1.0f + delta);
- colorControl->g *= (1.0f + delta);
- colorControl->b *= (1.0f + delta);
- }
-
- // divide sun color vals by three
- if(colorControl->isSunOrAmbientColor)
- {
- getChild<LLUICtrl>(rName)->setValue(colorControl->r/3);
- getChild<LLUICtrl>(gName)->setValue(colorControl->g/3);
- getChild<LLUICtrl>(bName)->setValue(colorControl->b/3);
-
- }
- else if(colorControl->isBlueHorizonOrDensity)
- {
- getChild<LLUICtrl>(rName)->setValue(colorControl->r/2);
- getChild<LLUICtrl>(gName)->setValue(colorControl->g/2);
- getChild<LLUICtrl>(bName)->setValue(colorControl->b/2);
-
- }
- else
- {
- // set the sliders to the new vals
- getChild<LLUICtrl>(rName)->setValue(colorControl->r);
- getChild<LLUICtrl>(gName)->setValue(colorControl->g);
- getChild<LLUICtrl>(bName)->setValue(colorControl->b);
- }
- }
-
- // now update the current parameters and send them to shaders
- colorControl->update(LLWLParamManager::instance()->mCurParams);
- LLWLParamManager::instance()->propagateParameters();
-}
-
-/// GLOW SPECIFIC CODE
-void LLFloaterWindLight::onGlowRMoved(LLUICtrl* ctrl, WLColorControl* colorControl)
-{
- deactivateAnimator();
-
- LLSliderCtrl* sldrCtrl = static_cast<LLSliderCtrl*>(ctrl);
-
- // scaled by 20
- colorControl->r = (2 - sldrCtrl->getValueF32()) * 20;
-
- colorControl->update(LLWLParamManager::instance()->mCurParams);
- LLWLParamManager::instance()->propagateParameters();
-}
-
-/// \NOTE that we want NEGATIVE (-) B
-void LLFloaterWindLight::onGlowBMoved(LLUICtrl* ctrl, WLColorControl* colorControl)
-{
- deactivateAnimator();
-
- LLSliderCtrl* sldrCtrl = static_cast<LLSliderCtrl*>(ctrl);
-
- /// \NOTE that we want NEGATIVE (-) B and NOT by 20 as 20 is too big
- colorControl->b = -sldrCtrl->getValueF32() * 5;
-
- colorControl->update(LLWLParamManager::instance()->mCurParams);
- LLWLParamManager::instance()->propagateParameters();
-}
-
-void LLFloaterWindLight::onFloatControlMoved(LLUICtrl* ctrl, WLFloatControl* floatControl)
-{
- deactivateAnimator();
-
- LLSliderCtrl* sldrCtrl = static_cast<LLSliderCtrl*>(ctrl);
-
- floatControl->x = sldrCtrl->getValueF32() / floatControl->mult;
-
- floatControl->update(LLWLParamManager::instance()->mCurParams);
- LLWLParamManager::instance()->propagateParameters();
-}
-
-// Lighting callbacks
-
-// time of day
-void LLFloaterWindLight::onSunMoved(LLUICtrl* ctrl, WLColorControl* colorControl)
-{
- deactivateAnimator();
-
- LLSliderCtrl* sunSldr = getChild<LLSliderCtrl>("WLSunAngle");
- LLSliderCtrl* eastSldr = getChild<LLSliderCtrl>("WLEastAngle");
-
- // get the two angles
- LLWLParamManager * param_mgr = LLWLParamManager::instance();
-
- param_mgr->mCurParams.setSunAngle(F_TWO_PI * sunSldr->getValueF32());
- param_mgr->mCurParams.setEastAngle(F_TWO_PI * eastSldr->getValueF32());
-
- // set the sun vector
- colorControl->r = -sin(param_mgr->mCurParams.getEastAngle()) *
- cos(param_mgr->mCurParams.getSunAngle());
- colorControl->g = sin(param_mgr->mCurParams.getSunAngle());
- colorControl->b = cos(param_mgr->mCurParams.getEastAngle()) *
- cos(param_mgr->mCurParams.getSunAngle());
- colorControl->i = 1.f;
-
- colorControl->update(param_mgr->mCurParams);
- param_mgr->propagateParameters();
-}
-
-void LLFloaterWindLight::onStarAlphaMoved(LLUICtrl* ctrl)
-{
- deactivateAnimator();
-
- LLSliderCtrl* sldrCtrl = static_cast<LLSliderCtrl*>(ctrl);
-
- LLWLParamManager::instance()->mCurParams.setStarBrightness(sldrCtrl->getValueF32());
-}
-
-void LLFloaterWindLight::onNewPreset()
-{
- LLNotificationsUtil::add("NewSkyPreset", LLSD(), LLSD(), boost::bind(&LLFloaterWindLight::newPromptCallback, this, _1, _2));
-}
-
-void LLFloaterWindLight::onSavePreset()
-{
- // get the name
- LLComboBox* comboBox = getChild<LLComboBox>(
- "WLPresetsCombo");
-
- // don't save the empty name
- if(comboBox->getSelectedItemLabel() == "")
- {
- return;
- }
-
- // check to see if it's a default and shouldn't be overwritten
- std::set<std::string>::iterator sIt = sDefaultPresets.find(
- comboBox->getSelectedItemLabel());
- if(sIt != sDefaultPresets.end() && !gSavedSettings.getBOOL("SkyEditPresets"))
- {
- LLNotificationsUtil::add("WLNoEditDefault");
- return;
- }
-
- LLWLParamManager::instance()->mCurParams.mName =
- comboBox->getSelectedItemLabel();
-
- LLNotificationsUtil::add("WLSavePresetAlert", LLSD(), LLSD(), boost::bind(&LLFloaterWindLight::saveAlertCallback, this, _1, _2));
-}
-
-bool LLFloaterWindLight::saveAlertCallback(const LLSD& notification, const LLSD& response)
-{
- S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
- // if they choose save, do it. Otherwise, don't do anything
- if(option == 0)
- {
- LLWLParamManager * param_mgr = LLWLParamManager::instance();
-
- param_mgr->setParamSet(param_mgr->mCurParams.mName, param_mgr->mCurParams);
-
- // comment this back in to save to file
- param_mgr->savePreset(param_mgr->mCurParams.mName);
- }
- return false;
-}
-
-void LLFloaterWindLight::onDeletePreset()
-{
- LLComboBox* combo_box = getChild<LLComboBox>(
- "WLPresetsCombo");
-
- if(combo_box->getSelectedValue().asString() == "")
- {
- return;
- }
-
- LLSD args;
- args["SKY"] = combo_box->getSelectedValue().asString();
- LLNotificationsUtil::add("WLDeletePresetAlert", args, LLSD(),
- boost::bind(&LLFloaterWindLight::deleteAlertCallback, this, _1, _2));
-}
-
-bool LLFloaterWindLight::deleteAlertCallback(const LLSD& notification, const LLSD& response)
-{
- S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
-
- // if they choose delete, do it. Otherwise, don't do anything
- if(option == 0)
- {
- LLComboBox* combo_box = getChild<LLComboBox>("WLPresetsCombo");
- LLFloaterDayCycle* day_cycle = LLFloaterReg::findTypedInstance<LLFloaterDayCycle>("env_day_cycle");
- LLComboBox* key_combo = NULL;
-
- if (day_cycle)
- {
- key_combo = day_cycle->getChild<LLComboBox>("WLKeyPresets");
- }
-
- std::string name(combo_box->getSelectedValue().asString());
-
- // check to see if it's a default and shouldn't be deleted
- std::set<std::string>::iterator sIt = sDefaultPresets.find(name);
- if(sIt != sDefaultPresets.end())
- {
- LLNotificationsUtil::add("WLNoEditDefault");
- return false;
- }
-
- LLWLParamManager::instance()->removeParamSet(name, true);
-
- // remove and choose another
- S32 new_index = combo_box->getCurrentIndex();
-
- combo_box->remove(name);
- if(key_combo != NULL)
- {
- key_combo->remove(name);
-
- // remove from slider, as well
- day_cycle->deletePreset(name);
- }
-
- // pick the previously selected index after delete
- if(new_index > 0)
- {
- new_index--;
- }
-
- if(combo_box->getItemCount() > 0)
- {
- combo_box->setCurrentByIndex(new_index);
- }
- }
- return false;
-}
-
-
-void LLFloaterWindLight::onChangePresetName(LLUICtrl* ctrl)
-{
- deactivateAnimator();
-
- std::string data = ctrl->getValue().asString();
- if(!data.empty())
- {
- LLWLParamManager::instance()->loadPreset( data);
- syncMenu();
- }
-}
-
-void LLFloaterWindLight::onOpenDayCycle()
-{
- LLFloaterReg::showInstance("env_day_cycle");
-}
-
-// Clouds
-void LLFloaterWindLight::onCloudScrollXMoved(LLUICtrl* ctrl)
-{
- deactivateAnimator();
-
- LLSliderCtrl* sldrCtrl = static_cast<LLSliderCtrl*>(ctrl);
- // *HACK all cloud scrolling is off by an additive of 10.
- LLWLParamManager::instance()->mCurParams.setCloudScrollX(sldrCtrl->getValueF32() + 10.0f);
-}
-
-void LLFloaterWindLight::onCloudScrollYMoved(LLUICtrl* ctrl)
-{
- deactivateAnimator();
-
- LLSliderCtrl* sldrCtrl = static_cast<LLSliderCtrl*>(ctrl);
-
- // *HACK all cloud scrolling is off by an additive of 10.
- LLWLParamManager::instance()->mCurParams.setCloudScrollY(sldrCtrl->getValueF32() + 10.0f);
-}
-
-void LLFloaterWindLight::onCloudScrollXToggled(LLUICtrl* ctrl)
-{
- deactivateAnimator();
-
- LLCheckBoxCtrl* cbCtrl = static_cast<LLCheckBoxCtrl*>(ctrl);
-
- bool lock = cbCtrl->get();
- LLWLParamManager::instance()->mCurParams.setEnableCloudScrollX(!lock);
-
- LLSliderCtrl* sldr = getChild<LLSliderCtrl>(
- "WLCloudScrollX");
-
- if(cbCtrl->get())
- {
- sldr->setEnabled(false);
- }
- else
- {
- sldr->setEnabled(true);
- }
-
-}
-
-void LLFloaterWindLight::onCloudScrollYToggled(LLUICtrl* ctrl)
-{
- deactivateAnimator();
-
- LLCheckBoxCtrl* cbCtrl = static_cast<LLCheckBoxCtrl*>(ctrl);
- bool lock = cbCtrl->get();
- LLWLParamManager::instance()->mCurParams.setEnableCloudScrollY(!lock);
-
- LLSliderCtrl* sldr = getChild<LLSliderCtrl>(
- "WLCloudScrollY");
-
- if(cbCtrl->get())
- {
- sldr->setEnabled(false);
- }
- else
- {
- sldr->setEnabled(true);
- }
-}
-
-void LLFloaterWindLight::deactivateAnimator()
-{
- LLWLParamManager::instance()->mAnimator.mIsRunning = false;
- LLWLParamManager::instance()->mAnimator.mUseLindenTime = false;
-}
diff --git a/indra/newview/llfloaterwindlight.h b/indra/newview/llfloaterwindlight.h
deleted file mode 100644
index b43edc2c11..0000000000
--- a/indra/newview/llfloaterwindlight.h
+++ /dev/null
@@ -1,112 +0,0 @@
-/**
- * @file llfloaterwindlight.h
- * @brief LLFloaterWindLight class definition
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-/*
- * Menu for adjusting the atmospheric settings of the world
- */
-
-#ifndef LL_LLFLOATERWINDLIGHT_H
-#define LL_LLFLOATERWINDLIGHT_H
-
-#include "llfloater.h"
-
-#include <vector>
-#include "llwlparamset.h"
-
-struct WLColorControl;
-struct WLFloatControl;
-
-
-/// Menuing system for all of windlight's functionality
-class LLFloaterWindLight : public LLFloater
-{
-public:
-
- LLFloaterWindLight(const LLSD& key);
- virtual ~LLFloaterWindLight();
- /*virtual*/ BOOL postBuild();
- /// initialize all
- void initCallbacks(void);
-
- bool newPromptCallback(const LLSD& notification, const LLSD& response);
-
- /// general purpose callbacks for dealing with color controllers
- void onColorControlRMoved(LLUICtrl* ctrl, WLColorControl* userData);
- void onColorControlGMoved(LLUICtrl* ctrl, WLColorControl* userData);
- void onColorControlBMoved(LLUICtrl* ctrl, WLColorControl* userData);
- void onColorControlIMoved(LLUICtrl* ctrl, WLColorControl* userData);
- void onFloatControlMoved(LLUICtrl* ctrl, WLFloatControl* userData);
-
- /// lighting callbacks for glow
- void onGlowRMoved(LLUICtrl* ctrl, WLColorControl* userData);
- //static void onGlowGMoved(LLUICtrl* ctrl, void* userData);
- void onGlowBMoved(LLUICtrl* ctrl, WLColorControl* userData);
-
- /// lighting callbacks for sun
- void onSunMoved(LLUICtrl* ctrl, WLColorControl* userData);
-
- /// for handling when the star slider is moved to adjust the alpha
- void onStarAlphaMoved(LLUICtrl* ctrl);
-
- /// when user hits the load preset button
- void onNewPreset();
-
- /// when user hits the save preset button
- void onSavePreset();
-
- /// prompts a user when overwriting a preset
- bool saveAlertCallback(const LLSD& notification, const LLSD& response);
-
- /// when user hits the save preset button
- void onDeletePreset();
-
- /// prompts a user when overwriting a preset
- bool deleteAlertCallback(const LLSD& notification, const LLSD& response);
-
- /// what to do when you change the preset name
- void onChangePresetName(LLUICtrl* ctrl);
-
- /// when user hits the save preset button
- void onOpenDayCycle();
-
- /// handle cloud scrolling
- void onCloudScrollXMoved(LLUICtrl* ctrl);
- void onCloudScrollYMoved(LLUICtrl* ctrl);
- void onCloudScrollXToggled(LLUICtrl* ctrl);
- void onCloudScrollYToggled(LLUICtrl* ctrl);
-
- /// sync up sliders with parameters
- void syncMenu();
-
- /// turn off animated skies
- static void deactivateAnimator();
-
-private:
- static std::set<std::string> sDefaultPresets;
-};
-
-
-#endif
diff --git a/indra/newview/llfloaterwindowsize.cpp b/indra/newview/llfloaterwindowsize.cpp
index a70f2af11a..ec161018b8 100644
--- a/indra/newview/llfloaterwindowsize.cpp
+++ b/indra/newview/llfloaterwindowsize.cpp
@@ -58,33 +58,12 @@ bool extractWindowSizeFromString(const std::string& instr, U32 *width, U32 *heig
}
-///----------------------------------------------------------------------------
-/// Class LLFloaterWindowSize
-///----------------------------------------------------------------------------
-class LLFloaterWindowSize
-: public LLFloater
-{
- friend class LLFloaterReg;
-private:
- LLFloaterWindowSize(const LLSD& key);
- virtual ~LLFloaterWindowSize();
-
-public:
- /*virtual*/ BOOL postBuild();
- void initWindowSizeControls();
- void onClickSet();
- void onClickCancel();
-};
-
-
LLFloaterWindowSize::LLFloaterWindowSize(const LLSD& key)
: LLFloater(key)
-{
-}
+{}
LLFloaterWindowSize::~LLFloaterWindowSize()
-{
-}
+{}
BOOL LLFloaterWindowSize::postBuild()
{
@@ -145,13 +124,3 @@ void LLFloaterWindowSize::onClickCancel()
{
closeFloater();
}
-
-///----------------------------------------------------------------------------
-/// LLFloaterWindowSizeUtil
-///----------------------------------------------------------------------------
-void LLFloaterWindowSizeUtil::registerFloater()
-{
- LLFloaterReg::add("window_size", "floater_window_size.xml",
- &LLFloaterReg::build<LLFloaterWindowSize>);
-
-}
diff --git a/indra/newview/llfloaterwindowsize.h b/indra/newview/llfloaterwindowsize.h
index 40f1a25bb3..a71e5e273c 100644
--- a/indra/newview/llfloaterwindowsize.h
+++ b/indra/newview/llfloaterwindowsize.h
@@ -26,10 +26,24 @@
#ifndef LLFLOATERWINDOWSIZE_H
#define LLFLOATERWINDOWSIZE_H
-// Allow user to set the window size for filming tutorials, machinima, etc
-namespace LLFloaterWindowSizeUtil
+#include "llfloater.h"
+
+///----------------------------------------------------------------------------
+/// Class LLFloaterWindowSize
+///----------------------------------------------------------------------------
+class LLFloaterWindowSize
+ : public LLFloater
{
- void registerFloater();
-}
+ friend class LLFloaterReg;
+private:
+ LLFloaterWindowSize(const LLSD& key);
+ virtual ~LLFloaterWindowSize();
+
+public:
+ /*virtual*/ BOOL postBuild();
+ void initWindowSizeControls();
+ void onClickSet();
+ void onClickCancel();
+};
#endif
diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp
index ba0eb8a711..137b5446cf 100644..100755
--- a/indra/newview/llfloaterworldmap.cpp
+++ b/indra/newview/llfloaterworldmap.cpp
@@ -70,10 +70,10 @@
#include "llappviewer.h"
#include "llmapimagetype.h"
#include "llweb.h"
-#include "llslider.h"
+#include "llsliderctrl.h"
#include "message.h"
-
#include "llwindow.h" // copyTextToClipboard()
+#include <algorithm>
//---------------------------------------------------------------------------
// Constants
@@ -86,6 +86,16 @@ static const F32 MAP_ZOOM_TIME = 0.2f;
// Currently (01/26/09), this value allows the whole grid to be visible in a 1024x1024 window.
static const S32 MAX_VISIBLE_REGIONS = 512;
+// It would be more logical to have this inside the method where it is used but to compile under gcc this
+// struct has to be here.
+struct SortRegionNames
+{
+ inline bool operator ()(std::pair <U64, LLSimInfo*> const& _left, std::pair <U64, LLSimInfo*> const& _right)
+ {
+ return(LLStringUtil::compareInsensitive(_left.second->getName(), _right.second->getName()) < 0);
+ }
+};
+
enum EPanDirection
{
PAN_UP,
@@ -106,32 +116,75 @@ class LLWorldMapHandler : public LLCommandHandler
{
public:
// requires trusted browser to trigger
- LLWorldMapHandler() : LLCommandHandler("worldmap", UNTRUSTED_THROTTLE) { }
-
+ LLWorldMapHandler() : LLCommandHandler("worldmap", UNTRUSTED_THROTTLE ) { }
+
bool handle(const LLSD& params, const LLSD& query_map,
LLMediaCtrl* web)
{
+ if (!LLUI::sSettingGroups["config"]->getBOOL("EnableWorldMap"))
+ {
+ LLNotificationsUtil::add("NoWorldMap", LLSD(), LLSD(), std::string("SwitchToStandardSkinAndQuit"));
+ return true;
+ }
+
if (params.size() == 0)
{
// support the secondlife:///app/worldmap SLapp
LLFloaterReg::showInstance("world_map", "center");
return true;
}
-
+
// support the secondlife:///app/worldmap/{LOCATION}/{COORDS} SLapp
const std::string region_name = LLURI::unescape(params[0].asString());
S32 x = (params.size() > 1) ? params[1].asInteger() : 128;
S32 y = (params.size() > 2) ? params[2].asInteger() : 128;
S32 z = (params.size() > 3) ? params[3].asInteger() : 0;
-
+
LLFloaterWorldMap::getInstance()->trackURL(region_name, x, y, z);
LLFloaterReg::showInstance("world_map", "center");
-
+
return true;
}
};
LLWorldMapHandler gWorldMapHandler;
+// SocialMap handler secondlife:///app/maptrackavatar/id
+class LLMapTrackAvatarHandler : public LLCommandHandler
+{
+public:
+ // requires trusted browser to trigger
+ LLMapTrackAvatarHandler() : LLCommandHandler("maptrackavatar", UNTRUSTED_THROTTLE)
+ {
+ }
+
+ bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web)
+ {
+ if (!LLUI::sSettingGroups["config"]->getBOOL("EnableWorldMap"))
+ {
+ LLNotificationsUtil::add("NoWorldMap", LLSD(), LLSD(), std::string("SwitchToStandardSkinAndQuit"));
+ return true;
+ }
+
+ //Make sure we have some parameters
+ if (params.size() == 0)
+ {
+ return false;
+ }
+
+ //Get the ID
+ LLUUID id;
+ if (!id.set( params[0], FALSE ))
+ {
+ return false;
+ }
+
+ LLFloaterWorldMap::getInstance()->avatarTrackFromSlapp( id );
+ LLFloaterReg::showInstance( "world_map", "center" );
+
+ return true;
+ }
+};
+LLMapTrackAvatarHandler gMapTrackAvatar;
LLFloaterWorldMap* gFloaterWorldMap = NULL;
@@ -142,7 +195,7 @@ public:
virtual ~LLMapInventoryObserver() {}
virtual void changed(U32 mask);
};
-
+
void LLMapInventoryObserver::changed(U32 mask)
{
// if there's a change we're interested in.
@@ -193,7 +246,10 @@ LLFloaterWorldMap::LLFloaterWorldMap(const LLSD& key)
mIsClosing(FALSE),
mSetToUserPosition(TRUE),
mTrackedLocation(0,0,0),
- mTrackedStatus(LLTracker::TRACKING_NOTHING)
+ mTrackedStatus(LLTracker::TRACKING_NOTHING),
+ mListFriendCombo(NULL),
+ mListLandmarkCombo(NULL),
+ mListSearchResults(NULL)
{
gFloaterWorldMap = this;
@@ -210,7 +266,7 @@ LLFloaterWorldMap::LLFloaterWorldMap(const LLSD& key)
mCommitCallbackRegistrar.add("WMap.ShowAgent", boost::bind(&LLFloaterWorldMap::onShowAgentBtn, this));
mCommitCallbackRegistrar.add("WMap.Clear", boost::bind(&LLFloaterWorldMap::onClearBtn, this));
mCommitCallbackRegistrar.add("WMap.CopySLURL", boost::bind(&LLFloaterWorldMap::onCopySLURL, this));
-
+
gSavedSettings.getControl("PreferredMaturity")->getSignal()->connect(boost::bind(&LLFloaterWorldMap::onChangeMaturity, this));
}
@@ -223,32 +279,35 @@ void* LLFloaterWorldMap::createWorldMapView(void* data)
BOOL LLFloaterWorldMap::postBuild()
{
mPanel = getChild<LLPanel>("objects_mapview");
-
+
LLComboBox *avatar_combo = getChild<LLComboBox>("friend combo");
avatar_combo->selectFirstItem();
avatar_combo->setPrearrangeCallback( boost::bind(&LLFloaterWorldMap::onAvatarComboPrearrange, this) );
avatar_combo->setTextEntryCallback( boost::bind(&LLFloaterWorldMap::onComboTextEntry, this) );
-
+ mListFriendCombo = dynamic_cast<LLCtrlListInterface *>(avatar_combo);
+
LLSearchEditor *location_editor = getChild<LLSearchEditor>("location");
location_editor->setFocusChangedCallback(boost::bind(&LLFloaterWorldMap::onLocationFocusChanged, this, _1));
location_editor->setKeystrokeCallback( boost::bind(&LLFloaterWorldMap::onSearchTextEntry, this));
getChild<LLScrollListCtrl>("search_results")->setDoubleClickCallback( boost::bind(&LLFloaterWorldMap::onClickTeleportBtn, this));
-
+ mListSearchResults = childGetListInterface("search_results");
+
LLComboBox *landmark_combo = getChild<LLComboBox>( "landmark combo");
landmark_combo->selectFirstItem();
landmark_combo->setPrearrangeCallback( boost::bind(&LLFloaterWorldMap::onLandmarkComboPrearrange, this) );
landmark_combo->setTextEntryCallback( boost::bind(&LLFloaterWorldMap::onComboTextEntry, this) );
-
+ mListLandmarkCombo = dynamic_cast<LLCtrlListInterface *>(landmark_combo);
+
mCurZoomVal = log(LLWorldMapView::sMapScale)/log(2.f);
getChild<LLUICtrl>("zoom slider")->setValue(LLWorldMapView::sMapScale);
-
+
setDefaultBtn(NULL);
-
+
mZoomTimer.stop();
-
+
onChangeMaturity();
-
+
return TRUE;
}
@@ -257,11 +316,11 @@ LLFloaterWorldMap::~LLFloaterWorldMap()
{
// All cleaned up by LLView destructor
mPanel = NULL;
-
+
// Inventory deletes all observers on shutdown
mInventory = NULL;
mInventoryObserver = NULL;
-
+
// avatar tracker will delete this for us.
mFriendObserver = NULL;
@@ -285,13 +344,13 @@ void LLFloaterWorldMap::onClose(bool app_quitting)
void LLFloaterWorldMap::onOpen(const LLSD& key)
{
bool center_on_target = (key.asString() == "center");
-
+
mIsClosing = FALSE;
-
+
LLWorldMapView* map_panel;
map_panel = (LLWorldMapView*)gFloaterWorldMap->mPanel;
map_panel->clearLastClick();
-
+
{
// reset pan on show, so it centers on you again
if (!center_on_target)
@@ -299,27 +358,27 @@ void LLFloaterWorldMap::onOpen(const LLSD& key)
LLWorldMapView::setPan(0, 0, TRUE);
}
map_panel->updateVisibleBlocks();
-
+
// Reload items as they may have changed
LLWorldMap::getInstance()->reloadItems();
-
+
// We may already have a bounding box for the regions of the world,
// so use that to adjust the view.
adjustZoomSliderBounds();
-
+
// Could be first show
//LLFirstUse::useMap();
-
+
// Start speculative download of landmarks
const LLUUID landmark_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK);
LLInventoryModelBackgroundFetch::instance().start(landmark_folder_id);
-
+
getChild<LLUICtrl>("location")->setFocus( TRUE);
gFocusMgr.triggerFocusFlash();
-
+
buildAvatarIDList();
buildLandmarkIDLists();
-
+
// If nothing is being tracked, set flag so the user position will be found
mSetToUserPosition = ( LLTracker::getTrackingStatus() == LLTracker::TRACKING_NOTHING );
}
@@ -356,7 +415,7 @@ BOOL LLFloaterWorldMap::handleScrollWheel(S32 x, S32 y, S32 clicks)
return TRUE;
}
}
-
+
return LLFloater::handleScrollWheel(x, y, clicks);
}
@@ -381,7 +440,7 @@ void LLFloaterWorldMap::draw()
bool agent_on_prelude = (regionp && regionp->isPrelude());
bool enable_go_home = gAgent.isGodlike() || !agent_on_prelude;
getChildView("Go Home")->setEnabled(enable_go_home);
-
+
updateLocation();
LLTracker::ETrackingStatus tracking_status = LLTracker::getTrackingStatus();
@@ -393,7 +452,7 @@ void LLFloaterWorldMap::draw()
{
getChild<LLUICtrl>("avatar_icon")->setColor( map_track_disabled_color);
}
-
+
if (LLTracker::TRACKING_LANDMARK == tracking_status)
{
getChild<LLUICtrl>("landmark_icon")->setColor( map_track_color);
@@ -402,7 +461,7 @@ void LLFloaterWorldMap::draw()
{
getChild<LLUICtrl>("landmark_icon")->setColor( map_track_disabled_color);
}
-
+
if (LLTracker::TRACKING_LOCATION == tracking_status)
{
getChild<LLUICtrl>("location_icon")->setColor( map_track_color);
@@ -422,21 +481,21 @@ void LLFloaterWorldMap::draw()
getChild<LLUICtrl>("location_icon")->setColor( map_track_disabled_color);
}
}
-
+
// check for completion of tracking data
if (mWaitingForTracker)
{
centerOnTarget(TRUE);
}
-
+
getChildView("Teleport")->setEnabled((BOOL)tracking_status);
-// getChildView("Clear")->setEnabled((BOOL)tracking_status);
+ // getChildView("Clear")->setEnabled((BOOL)tracking_status);
getChildView("Show Destination")->setEnabled((BOOL)tracking_status || LLWorldMap::getInstance()->isTracking());
getChildView("copy_slurl")->setEnabled((mSLURL.isValid()) );
-
+
setMouseOpaque(TRUE);
getDragHandle()->setMouseOpaque(TRUE);
-
+
//RN: snaps to zoom value because interpolation caused jitter in the text rendering
if (!mZoomTimer.getStarted() && mCurZoomVal != (F32)getChild<LLUICtrl>("zoom slider")->getValue().asReal())
{
@@ -451,7 +510,7 @@ void LLFloaterWorldMap::draw()
mCurZoomVal = lerp(mCurZoomVal, (F32)getChild<LLUICtrl>("zoom slider")->getValue().asReal(), interp);
F32 map_scale = 256.f*pow(2.f, mCurZoomVal);
LLWorldMapView::setScale( map_scale );
-
+
// Enable/disable checkboxes depending on the zoom level
// If above threshold level (i.e. low res) -> Disable all checkboxes
// If under threshold level (i.e. high res) -> Enable all checkboxes
@@ -477,7 +536,7 @@ void LLFloaterWorldMap::trackAvatar( const LLUUID& avatar_id, const std::string&
{
LLCtrlSelectionInterface *iface = childGetSelectionInterface("friend combo");
if (!iface) return;
-
+
buildAvatarIDList();
if(iface->setCurrentByID(avatar_id) || gAgent.isGodlike())
{
@@ -507,7 +566,7 @@ void LLFloaterWorldMap::trackLandmark( const LLUUID& landmark_item_id )
{
LLCtrlSelectionInterface *iface = childGetSelectionInterface("landmark combo");
if (!iface) return;
-
+
buildLandmarkIDLists();
BOOL found = FALSE;
S32 idx;
@@ -519,7 +578,7 @@ void LLFloaterWorldMap::trackLandmark( const LLUUID& landmark_item_id )
break;
}
}
-
+
if (found && iface->setCurrentByID( landmark_item_id ) )
{
LLUUID asset_id = mLandmarkAssetIDList.get( idx );
@@ -528,17 +587,17 @@ void LLFloaterWorldMap::trackLandmark( const LLUUID& landmark_item_id )
if (combo) name = combo->getSimple();
mTrackedStatus = LLTracker::TRACKING_LANDMARK;
LLTracker::trackLandmark(mLandmarkAssetIDList.get( idx ), // assetID
- mLandmarkItemIDList.get( idx ), // itemID
- name); // name
-
+ mLandmarkItemIDList.get( idx ), // itemID
+ name); // name
+
if( asset_id != sHomeID )
{
// start the download process
gLandmarkList.getAsset( asset_id);
}
-
+
// We have to download both region info and landmark data, so set busy. JC
-// getWindow()->incBusyCount();
+ // getWindow()->incBusyCount();
}
else
{
@@ -574,10 +633,10 @@ void LLFloaterWorldMap::trackLocation(const LLVector3d& pos_global)
S32 world_y = S32(pos_global.mdV[1] / 256);
LLWorldMapMessage::getInstance()->sendMapBlockRequest(world_x, world_y, world_x, world_y, true);
setDefaultBtn("");
-
+
// clicked on a non-region - turn off coord display
enableTeleportCoordsDisplay( false );
-
+
return;
}
if (sim_info->isDown())
@@ -588,33 +647,33 @@ void LLFloaterWorldMap::trackLocation(const LLVector3d& pos_global)
LLWorldMap::getInstance()->setTrackingInvalid();
LLTracker::stopTracking(NULL);
setDefaultBtn("");
-
+
// clicked on a down region - turn off coord display
enableTeleportCoordsDisplay( false );
-
+
return;
}
-
+
std::string sim_name = sim_info->getName();
F32 region_x = (F32)fmod( pos_global.mdV[VX], (F64)REGION_WIDTH_METERS );
F32 region_y = (F32)fmod( pos_global.mdV[VY], (F64)REGION_WIDTH_METERS );
std::string full_name = llformat("%s (%d, %d, %d)",
- sim_name.c_str(),
- llround(region_x),
- llround(region_y),
- llround((F32)pos_global.mdV[VZ]));
-
+ sim_name.c_str(),
+ llround(region_x),
+ llround(region_y),
+ llround((F32)pos_global.mdV[VZ]));
+
std::string tooltip("");
mTrackedStatus = LLTracker::TRACKING_LOCATION;
LLTracker::trackLocation(pos_global, full_name, tooltip);
LLWorldMap::getInstance()->cancelTracking(); // The floater is taking over the tracking
-
+
LLVector3d coord_pos = LLTracker::getTrackedPositionGlobal();
updateTeleportCoordsDisplay( coord_pos );
-
+
// we have a valid region - turn on coord display
enableTeleportCoordsDisplay( true );
-
+
setDefaultBtn("Teleport");
}
@@ -631,7 +690,7 @@ void LLFloaterWorldMap::updateTeleportCoordsDisplay( const LLVector3d& pos )
{
// if we're going to update their value, we should also enable them
enableTeleportCoordsDisplay( true );
-
+
// convert global specified position to a local one
F32 region_local_x = (F32)fmod( pos.mdV[VX], (F64)REGION_WIDTH_METERS );
F32 region_local_y = (F32)fmod( pos.mdV[VY], (F64)REGION_WIDTH_METERS );
@@ -646,16 +705,16 @@ void LLFloaterWorldMap::updateTeleportCoordsDisplay( const LLVector3d& pos )
void LLFloaterWorldMap::updateLocation()
{
bool gotSimName;
-
+
LLTracker::ETrackingStatus status = LLTracker::getTrackingStatus();
-
+
// These values may get updated by a message, so need to check them every frame
// The fields may be changed by the user, so only update them if the data changes
LLVector3d pos_global = LLTracker::getTrackedPositionGlobal();
if (pos_global.isExactlyZero())
{
LLVector3d agentPos = gAgent.getPositionGlobal();
-
+
// Set to avatar's current postion if nothing is selected
if ( status == LLTracker::TRACKING_NOTHING && mSetToUserPosition )
{
@@ -665,19 +724,19 @@ void LLFloaterWorldMap::updateLocation()
if ( gotSimName )
{
mSetToUserPosition = FALSE;
-
+
// Fill out the location field
getChild<LLUICtrl>("location")->setValue(agent_sim_name);
-
+
// update the coordinate display with location of avatar in region
updateTeleportCoordsDisplay( agentPos );
-
+
// Figure out where user is
// Set the current SLURL
mSLURL = LLSLURL(agent_sim_name, gAgent.getPositionGlobal());
}
}
-
+
return; // invalid location
}
std::string sim_name;
@@ -699,17 +758,17 @@ void LLFloaterWorldMap::updateLocation()
pos_global[2] = 200;
}
}
-
+
getChild<LLUICtrl>("location")->setValue(sim_name);
-
+
// refresh coordinate display to reflect where user clicked.
LLVector3d coord_pos = LLTracker::getTrackedPositionGlobal();
updateTeleportCoordsDisplay( coord_pos );
-
+
// simNameFromPosGlobal can fail, so don't give the user an invalid SLURL
if ( gotSimName )
{
- mSLURL = LLSLURL(sim_name, pos_global);
+ mSLURL = LLSLURL(sim_name, pos_global);
}
else
{ // Empty SLURL will disable the "Copy SLURL to clipboard" button
@@ -736,12 +795,12 @@ void LLFloaterWorldMap::trackURL(const std::string& region_name, S32 x_coord, S3
{
// fill in UI based on URL
gFloaterWorldMap->getChild<LLUICtrl>("location")->setValue(region_name);
-
+
// Save local coords to highlight position after region global
// position is returned.
gFloaterWorldMap->mCompletingRegionPos.set(
- (F32)x_coord, (F32)y_coord, (F32)z_coord);
-
+ (F32)x_coord, (F32)y_coord, (F32)z_coord);
+
// pass sim name to combo box
gFloaterWorldMap->mCompletingRegionName = region_name;
LLWorldMapMessage::getInstance()->sendNamedRegionRequest(region_name);
@@ -811,9 +870,9 @@ void LLFloaterWorldMap::friendsChanged()
// No longer really builds a list. Instead, just updates mAvatarCombo.
void LLFloaterWorldMap::buildAvatarIDList()
{
- LLCtrlListInterface *list = childGetListInterface("friend combo");
+ LLCtrlListInterface *list = mListFriendCombo;
if (!list) return;
-
+
// Delete all but the "None" entry
S32 list_size = list->getItemCount();
if (list_size > 1)
@@ -821,7 +880,7 @@ void LLFloaterWorldMap::buildAvatarIDList()
list->selectItemRange(1, -1);
list->operateOnSelection(LLCtrlListInterface::OP_DELETE);
}
-
+
// Get all of the calling cards for avatar that are currently online
LLCollectMappableBuddies collector;
LLAvatarTracker::instance().applyFunctor(collector);
@@ -833,7 +892,7 @@ void LLFloaterWorldMap::buildAvatarIDList()
{
list->addSimpleElement((*it).first, ADD_BOTTOM, (*it).second);
}
-
+
list->setCurrentByID( LLAvatarTracker::instance().getAvatarID() );
list->selectFirstItem();
}
@@ -841,9 +900,9 @@ void LLFloaterWorldMap::buildAvatarIDList()
void LLFloaterWorldMap::buildLandmarkIDLists()
{
- LLCtrlListInterface *list = childGetListInterface("landmark combo");
+ LLCtrlListInterface *list = mListLandmarkCombo;
if (!list) return;
-
+
// Delete all but the "None" entry
S32 list_size = list->getItemCount();
if (list_size > 1)
@@ -851,17 +910,17 @@ void LLFloaterWorldMap::buildLandmarkIDLists()
list->selectItemRange(1, -1);
list->operateOnSelection(LLCtrlListInterface::OP_DELETE);
}
-
+
mLandmarkItemIDList.reset();
mLandmarkAssetIDList.reset();
-
+
// Get all of the current landmarks
mLandmarkAssetIDList.put( LLUUID::null );
mLandmarkItemIDList.put( LLUUID::null );
-
+
mLandmarkAssetIDList.put( sHomeID );
mLandmarkItemIDList.put( sHomeID );
-
+
LLInventoryModel::cat_array_t cats;
LLInventoryModel::item_array_t items;
LLIsType is_landmark(LLAssetType::AT_LANDMARK);
@@ -870,20 +929,20 @@ void LLFloaterWorldMap::buildLandmarkIDLists()
items,
LLInventoryModel::EXCLUDE_TRASH,
is_landmark);
-
+
std::sort(items.begin(), items.end(), LLViewerInventoryItem::comparePointers());
S32 count = items.count();
for(S32 i = 0; i < count; ++i)
{
LLInventoryItem* item = items.get(i);
-
+
list->addSimpleElement(item->getName(), ADD_BOTTOM, item->getUUID());
-
+
mLandmarkAssetIDList.put( item->getAssetUUID() );
mLandmarkItemIDList.put( item->getUUID() );
}
-
+
list->selectFirstItem();
}
@@ -902,7 +961,7 @@ F32 LLFloaterWorldMap::getDistanceToDestination(const LLVector3d &destination,
void LLFloaterWorldMap::clearLocationSelection(BOOL clear_ui)
{
- LLCtrlListInterface *list = childGetListInterface("search_results");
+ LLCtrlListInterface *list = mListSearchResults;
if (list)
{
list->operateOnAll(LLCtrlListInterface::OP_DELETE);
@@ -916,7 +975,7 @@ void LLFloaterWorldMap::clearLandmarkSelection(BOOL clear_ui)
{
if (clear_ui || !childHasKeyboardFocus("landmark combo"))
{
- LLCtrlListInterface *list = childGetListInterface("landmark combo");
+ LLCtrlListInterface *list = mListLandmarkCombo;
if (list)
{
list->selectByValue( "None" );
@@ -930,7 +989,7 @@ void LLFloaterWorldMap::clearAvatarSelection(BOOL clear_ui)
if (clear_ui || !childHasKeyboardFocus("friend combo"))
{
mTrackedStatus = LLTracker::TRACKING_NOTHING;
- LLCtrlListInterface *list = childGetListInterface("friend combo");
+ LLCtrlListInterface *list = mListFriendCombo;
if (list)
{
list->selectByValue( "None" );
@@ -949,34 +1008,34 @@ void LLFloaterWorldMap::adjustZoomSliderBounds()
// Currently (01/26/09), this value allows the whole grid to be visible in a 1024x1024 window.
S32 world_width_regions = MAX_VISIBLE_REGIONS;
S32 world_height_regions = MAX_VISIBLE_REGIONS;
-
+
// Find how much space we have to display the world
LLWorldMapView* map_panel;
map_panel = (LLWorldMapView*)mPanel;
LLRect view_rect = map_panel->getRect();
-
+
// View size in pixels
S32 view_width = view_rect.getWidth();
S32 view_height = view_rect.getHeight();
-
+
// Pixels per region to display entire width/height
F32 width_pixels_per_region = (F32) view_width / (F32) world_width_regions;
F32 height_pixels_per_region = (F32) view_height / (F32) world_height_regions;
-
+
F32 pixels_per_region = llmin(width_pixels_per_region,
height_pixels_per_region);
-
+
// Round pixels per region to an even number of slider increments
S32 slider_units = llfloor(pixels_per_region / 0.2f);
pixels_per_region = slider_units * 0.2f;
-
+
// Make sure the zoom slider can be moved at least a little bit.
// Likewise, less than the increment pixels per region is just silly.
pixels_per_region = llclamp(pixels_per_region, 1.f, ZOOM_MAX);
-
+
F32 min_power = log(pixels_per_region/256.f)/log(2.f);
- getChild<LLSlider>("zoom slider")->setMinValue(min_power);
+ getChild<LLSliderCtrl>("zoom slider")->setMinValue(min_power);
}
@@ -997,19 +1056,19 @@ void LLFloaterWorldMap::onLandmarkComboPrearrange( )
{
return;
}
-
- LLCtrlListInterface *list = childGetListInterface("landmark combo");
+
+ LLCtrlListInterface *list = mListLandmarkCombo;
if (!list) return;
-
+
LLUUID current_choice = list->getCurrentID();
-
+
buildLandmarkIDLists();
-
+
if( current_choice.isNull() || !list->setCurrentByID( current_choice ) )
{
LLTracker::stopTracking(NULL);
}
-
+
}
void LLFloaterWorldMap::onComboTextEntry()
@@ -1017,7 +1076,7 @@ void LLFloaterWorldMap::onComboTextEntry()
// Reset the tracking whenever we start typing into any of the search fields,
// so that hitting <enter> does an auto-complete versus teleporting us to the
// previously selected landmark/friend.
- LLTracker::clearFocus();
+ LLTracker::stopTracking(NULL);
}
void LLFloaterWorldMap::onSearchTextEntry( )
@@ -1033,18 +1092,18 @@ void LLFloaterWorldMap::onLandmarkComboCommit()
{
return;
}
-
- LLCtrlListInterface *list = childGetListInterface("landmark combo");
+
+ LLCtrlListInterface *list = mListLandmarkCombo;
if (!list) return;
-
+
LLUUID asset_id;
LLUUID item_id = list->getCurrentID();
-
+
LLTracker::stopTracking(NULL);
-
+
//RN: stopTracking() clears current combobox selection, need to reassert it here
list->setCurrentByID(item_id);
-
+
if( item_id.isNull() )
{
}
@@ -1068,7 +1127,7 @@ void LLFloaterWorldMap::onLandmarkComboCommit()
trackLandmark( item_id);
onShowTargetBtn();
-
+
// Reset to user postion if nothing is tracked
mSetToUserPosition = ( LLTracker::getTrackingStatus() == LLTracker::TRACKING_NOTHING );
}
@@ -1080,19 +1139,19 @@ void LLFloaterWorldMap::onAvatarComboPrearrange( )
{
return;
}
-
- LLCtrlListInterface *list = childGetListInterface("friend combo");
+
+ LLCtrlListInterface *list = mListFriendCombo;
if (!list) return;
-
+
LLUUID current_choice;
-
+
if( LLAvatarTracker::instance().haveTrackingInfo() )
{
current_choice = LLAvatarTracker::instance().getAvatarID();
}
-
+
buildAvatarIDList();
-
+
if( !list->setCurrentByID( current_choice ) || current_choice.isNull() )
{
LLTracker::stopTracking(NULL);
@@ -1105,10 +1164,10 @@ void LLFloaterWorldMap::onAvatarComboCommit()
{
return;
}
-
- LLCtrlListInterface *list = childGetListInterface("friend combo");
+
+ LLCtrlListInterface *list = mListFriendCombo;
if (!list) return;
-
+
const LLUUID& new_avatar_id = list->getCurrentID();
if (new_avatar_id.notNull())
{
@@ -1124,6 +1183,12 @@ void LLFloaterWorldMap::onAvatarComboCommit()
}
}
+void LLFloaterWorldMap::avatarTrackFromSlapp( const LLUUID& id )
+{
+ trackAvatar( id, "av" );
+ onShowTargetBtn();
+}
+
void LLFloaterWorldMap::onLocationFocusChanged( LLFocusableElement* focus )
{
updateSearchEnabled();
@@ -1148,13 +1213,13 @@ void LLFloaterWorldMap::onLocationCommit()
{
return;
}
-
+
clearLocationSelection(FALSE);
mCompletingRegionName = "";
mLastRegionName = "";
-
+
std::string str = getChild<LLUICtrl>("location")->getValue().asString();
-
+
// Trim any leading and trailing spaces in the search target
std::string saved_str = str;
LLStringUtil::trim( str );
@@ -1163,6 +1228,12 @@ void LLFloaterWorldMap::onLocationCommit()
getChild<LLUICtrl>("location")->setValue(str);
}
+ // Don't try completing empty name (STORM-1427).
+ if (str.empty())
+ {
+ return;
+ }
+
LLStringUtil::toLower(str);
mCompletingRegionName = str;
LLWorldMap::getInstance()->setTrackingCommit();
@@ -1183,13 +1254,13 @@ void LLFloaterWorldMap::onCoordinatesCommit()
{
return;
}
-
+
S32 x_coord = (S32)childGetValue("teleport_coordinate_x").asReal();
S32 y_coord = (S32)childGetValue("teleport_coordinate_y").asReal();
S32 z_coord = (S32)childGetValue("teleport_coordinate_z").asReal();
-
+
const std::string region_name = childGetValue("location").asString();
-
+
trackURL( region_name, x_coord, y_coord, z_coord );
}
@@ -1225,7 +1296,7 @@ void LLFloaterWorldMap::onCopySLURL()
LLSD args;
args["SLURL"] = mSLURL.getSLURLString();
-
+
LLNotificationsUtil::add("CopySLURL", args);
}
@@ -1246,26 +1317,26 @@ void LLFloaterWorldMap::centerOnTarget(BOOL animate)
else
{
// We've got the position finally, so we're no longer busy. JC
-// getWindow()->decBusyCount();
+ // getWindow()->decBusyCount();
pos_global = LLTracker::getTrackedPositionGlobal() - gAgentCamera.getCameraPositionGlobal();
}
}
else if(LLWorldMap::getInstance()->isTracking())
{
pos_global = LLWorldMap::getInstance()->getTrackedPositionGlobal() - gAgentCamera.getCameraPositionGlobal();;
-
-
-
+
+
+
}
else
{
// default behavior = center on agent
pos_global.clearVec();
}
-
+
LLWorldMapView::setPan( -llfloor((F32)(pos_global.mdV[VX] * (F64)LLWorldMapView::sMapScale / REGION_WIDTH_METERS)),
- -llfloor((F32)(pos_global.mdV[VY] * (F64)LLWorldMapView::sMapScale / REGION_WIDTH_METERS)),
- !animate);
+ -llfloor((F32)(pos_global.mdV[VY] * (F64)LLWorldMapView::sMapScale / REGION_WIDTH_METERS)),
+ !animate);
mWaitingForTracker = FALSE;
}
@@ -1273,7 +1344,7 @@ void LLFloaterWorldMap::centerOnTarget(BOOL animate)
void LLFloaterWorldMap::fly()
{
LLVector3d pos_global = LLTracker::getTrackedPositionGlobal();
-
+
// Start the autopilot and close the floater,
// so we can see where we're flying
if (!pos_global.isExactlyZero())
@@ -1294,7 +1365,7 @@ void LLFloaterWorldMap::teleport()
BOOL teleport_home = FALSE;
LLVector3d pos_global;
LLAvatarTracker& av_tracker = LLAvatarTracker::instance();
-
+
LLTracker::ETrackingStatus tracking_status = LLTracker::getTrackingStatus();
if (LLTracker::TRACKING_AVATAR == tracking_status
&& av_tracker.haveTrackingInfo() )
@@ -1317,10 +1388,10 @@ void LLFloaterWorldMap::teleport()
&& landmark->getRegionID(region_id))
{
LLLandmark::requestRegionHandle(
- gMessageSystem,
- gAgent.getRegionHost(),
- region_id,
- NULL);
+ gMessageSystem,
+ gAgent.getRegionHost(),
+ region_id,
+ NULL);
}
}
}
@@ -1332,7 +1403,7 @@ void LLFloaterWorldMap::teleport()
{
make_ui_sound("UISndInvalidOp");
}
-
+
// Do the teleport, which will also close the floater
if (teleport_home)
{
@@ -1367,7 +1438,7 @@ void LLFloaterWorldMap::teleportToLandmark()
{
BOOL has_destination = FALSE;
LLUUID destination_id; // Null means "home"
-
+
if( LLTracker::getTrackedLandmarkAssetID() == sHomeID )
{
has_destination = TRUE;
@@ -1388,14 +1459,14 @@ void LLFloaterWorldMap::teleportToLandmark()
if(landmark->getRegionID(region_id))
{
LLLandmark::requestRegionHandle(
- gMessageSystem,
- gAgent.getRegionHost(),
- region_id,
- NULL);
+ gMessageSystem,
+ gAgent.getRegionHost(),
+ region_id,
+ NULL);
}
}
}
-
+
if( has_destination )
{
gAgent.teleportViaLandmark( destination_id );
@@ -1428,22 +1499,25 @@ void LLFloaterWorldMap::updateSims(bool found_null_sim)
{
return;
}
-
+
LLScrollListCtrl *list = getChild<LLScrollListCtrl>("search_results");
list->operateOnAll(LLCtrlListInterface::OP_DELETE);
-
+
S32 name_length = mCompletingRegionName.length();
-
- LLSD match;
+ LLSD match;
+
S32 num_results = 0;
- std::map<U64, LLSimInfo*>::const_iterator it;
- for (it = LLWorldMap::getInstance()->getRegionMap().begin(); it != LLWorldMap::getInstance()->getRegionMap().end(); ++it)
+
+ std::vector<std::pair <U64, LLSimInfo*> > sim_info_vec(LLWorldMap::getInstance()->getRegionMap().begin(), LLWorldMap::getInstance()->getRegionMap().end());
+ std::sort(sim_info_vec.begin(), sim_info_vec.end(), SortRegionNames());
+
+ for (std::vector<std::pair <U64, LLSimInfo*> >::const_iterator it = sim_info_vec.begin(); it != sim_info_vec.end(); ++it)
{
LLSimInfo* info = it->second;
std::string sim_name_lower = info->getName();
LLStringUtil::toLower(sim_name_lower);
-
+
if (sim_name_lower.substr(0, name_length) == mCompletingRegionName)
{
if (sim_name_lower == mCompletingRegionName)
@@ -1459,23 +1533,30 @@ void LLFloaterWorldMap::updateSims(bool found_null_sim)
num_results++;
}
}
-
+
if (found_null_sim)
{
mCompletingRegionName = "";
}
-
- // if match found, highlight it and go
- if (!match.isUndefined())
+
+ if (num_results > 0)
{
- list->selectByValue(match);
+ // if match found, highlight it and go
+ if (!match.isUndefined())
+ {
+ list->selectByValue(match);
+ }
+ // else select first found item
+ else
+ {
+ list->selectFirstItem();
+ }
getChild<LLUICtrl>("search_results")->setFocus(TRUE);
onCommitSearchResult();
}
-
- // if we found nothing, say "none"
- if (num_results == 0)
+ else
{
+ // if we found nothing, say "none"
list->setCommentText(LLTrans::getString("worldmap_results_none_found"));
list->operateOnAll(LLCtrlListInterface::OP_DESELECT);
}
@@ -1484,9 +1565,9 @@ void LLFloaterWorldMap::updateSims(bool found_null_sim)
void LLFloaterWorldMap::onCommitSearchResult()
{
- LLCtrlListInterface *list = childGetListInterface("search_results");
+ LLCtrlListInterface *list = mListSearchResults;
if (!list) return;
-
+
LLSD selected_value = list->getSelectedValue();
std::string sim_name = selected_value.asString();
if (sim_name.empty())
@@ -1494,19 +1575,19 @@ void LLFloaterWorldMap::onCommitSearchResult()
return;
}
LLStringUtil::toLower(sim_name);
-
+
std::map<U64, LLSimInfo*>::const_iterator it;
for (it = LLWorldMap::getInstance()->getRegionMap().begin(); it != LLWorldMap::getInstance()->getRegionMap().end(); ++it)
{
LLSimInfo* info = it->second;
-
+
if (info->isName(sim_name))
{
LLVector3d pos_global = info->getGlobalOrigin();
-
+
const F64 SIM_COORD_DEFAULT = 128.0;
LLVector3 pos_local(SIM_COORD_DEFAULT, SIM_COORD_DEFAULT, 0.0f);
-
+
// Did this value come from a trackURL() request?
if (!mCompletingRegionPos.isExactlyZero())
{
@@ -1516,14 +1597,14 @@ void LLFloaterWorldMap::onCommitSearchResult()
pos_global.mdV[VX] += (F64)pos_local.mV[VX];
pos_global.mdV[VY] += (F64)pos_local.mV[VY];
pos_global.mdV[VZ] = (F64)pos_local.mV[VZ];
-
+
getChild<LLUICtrl>("location")->setValue(sim_name);
trackLocation(pos_global);
setDefaultBtn("Teleport");
break;
}
}
-
+
onShowTargetBtn();
}
@@ -1531,15 +1612,15 @@ void LLFloaterWorldMap::onChangeMaturity()
{
bool can_access_mature = gAgent.canAccessMature();
bool can_access_adult = gAgent.canAccessAdult();
-
+
getChildView("events_mature_icon")->setVisible( can_access_mature);
getChildView("events_mature_label")->setVisible( can_access_mature);
getChildView("events_mature_chk")->setVisible( can_access_mature);
-
+
getChildView("events_adult_icon")->setVisible( can_access_adult);
getChildView("events_adult_label")->setVisible( can_access_adult);
getChildView("events_adult_chk")->setVisible( can_access_adult);
-
+
// disable mature / adult events.
if (!can_access_mature)
{
diff --git a/indra/newview/llfloaterworldmap.h b/indra/newview/llfloaterworldmap.h
index 1628a421ec..e3b83b2579 100644
--- a/indra/newview/llfloaterworldmap.h
+++ b/indra/newview/llfloaterworldmap.h
@@ -39,6 +39,7 @@
#include "lltracker.h"
#include "llslurl.h"
+class LLCtrlListInterface;
class LLFriendObserver;
class LLInventoryModel;
class LLInventoryObserver;
@@ -106,6 +107,11 @@ public:
// teleport to the tracked item, if there is one
void teleport();
void onChangeMaturity();
+
+
+ //Slapp instigated avatar tracking
+ void avatarTrackFromSlapp( const LLUUID& id );
+
protected:
void onGoHome();
@@ -185,6 +191,10 @@ private:
std::string mTrackedSimName;
std::string mTrackedAvatarName;
LLSLURL mSLURL;
+
+ LLCtrlListInterface * mListFriendCombo;
+ LLCtrlListInterface * mListLandmarkCombo;
+ LLCtrlListInterface * mListSearchResults;
};
extern LLFloaterWorldMap* gFloaterWorldMap;
diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp
index 62ba746a02..1fa194ab19 100644
--- a/indra/newview/llfolderview.cpp
+++ b/indra/newview/llfolderview.cpp
@@ -30,7 +30,7 @@
#include "llcallbacklist.h"
#include "llinventorybridge.h"
-#include "llinventoryclipboard.h" // *TODO: remove this once hack below gone.
+#include "llclipboard.h" // *TODO: remove this once hack below gone.
#include "llinventoryfilter.h"
#include "llinventoryfunctions.h"
#include "llinventorymodelbackgroundfetch.h"
@@ -165,15 +165,55 @@ void LLCloseAllFoldersFunctor::doItem(LLFolderViewItem* item)
{ }
///----------------------------------------------------------------------------
+/// Class LLFolderViewScrollContainer
+///----------------------------------------------------------------------------
+
+// virtual
+const LLRect LLFolderViewScrollContainer::getScrolledViewRect() const
+{
+ LLRect rect = LLRect::null;
+ if (mScrolledView)
+ {
+ LLFolderView* folder_view = dynamic_cast<LLFolderView*>(mScrolledView);
+ if (folder_view)
+ {
+ S32 height = folder_view->mRunningHeight;
+
+ rect = mScrolledView->getRect();
+ rect.setLeftTopAndSize(rect.mLeft, rect.mTop, rect.getWidth(), height);
+ }
+ }
+
+ return rect;
+}
+
+LLFolderViewScrollContainer::LLFolderViewScrollContainer(const LLScrollContainer::Params& p)
+: LLScrollContainer(p)
+{}
+
+///----------------------------------------------------------------------------
/// Class LLFolderView
///----------------------------------------------------------------------------
+LLFolderView::Params::Params()
+: task_id("task_id"),
+ title("title"),
+ use_label_suffix("use_label_suffix"),
+ allow_multiselect("allow_multiselect", true),
+ show_empty_message("show_empty_message", true),
+ show_load_status("show_load_status", true),
+ use_ellipses("use_ellipses", false)
+{
+}
+
// Default constructor
LLFolderView::LLFolderView(const Params& p)
: LLFolderViewFolder(p),
+ mRunningHeight(0),
mScrollContainer( NULL ),
mPopupMenuHandle(),
- mAllowMultiSelect(TRUE),
+ mAllowMultiSelect(p.allow_multiselect),
+ mShowEmptyMessage(p.show_empty_message),
mShowFolderHierarchy(FALSE),
mSourceID(p.task_id),
mRenameItem( NULL ),
@@ -194,10 +234,14 @@ LLFolderView::LLFolderView(const Params& p)
mDragAndDropThisFrame(FALSE),
mCallbackRegistrar(NULL),
mParentPanel(p.parent_panel),
- mUseEllipses(false),
+ mUseEllipses(p.use_ellipses),
mDraggingOverItem(NULL),
mStatusTextBox(NULL)
{
+ mRoot = this;
+
+ mShowLoadStatus = p.show_load_status();
+
LLRect rect = p.rect;
LLRect new_rect(rect.mLeft, rect.mBottom + getRect().getHeight(), rect.mLeft + getRect().getWidth(), rect.mBottom);
setRect( rect );
@@ -238,7 +282,7 @@ LLFolderView::LLFolderView(const Params& p)
LLRect new_r = LLRect(rect.mLeft + ICON_PAD,
rect.mTop - TEXT_PAD,
rect.mRight,
- rect.mTop - TEXT_PAD - llfloor(font->getLineHeight()));
+ rect.mTop - TEXT_PAD - font->getLineHeight());
text_p.rect(new_r);
text_p.name(std::string(p.name));
text_p.font(font);
@@ -263,6 +307,7 @@ LLFolderView::LLFolderView(const Params& p)
menu->setBackgroundColor(LLUIColorTable::instance().getColor("MenuPopupBgColor"));
mPopupMenuHandle = menu->getHandle();
+ mListener->openItem();
}
// Destroys the object
@@ -283,7 +328,7 @@ LLFolderView::~LLFolderView( void )
mAutoOpenItems.removeAllNodes();
gIdleCallbacks.deleteFunction(idle, this);
- LLView::deleteViewByHandle(mPopupMenuHandle);
+ if (mPopupMenuHandle.get()) mPopupMenuHandle.get()->die();
mAutoOpenItems.removeAllNodes();
clearSelection();
@@ -301,18 +346,6 @@ BOOL LLFolderView::canFocusChildren() const
return FALSE;
}
-void LLFolderView::checkTreeResortForModelChanged()
-{
- if (mSortOrder & LLInventoryFilter::SO_DATE && !(mSortOrder & LLInventoryFilter::SO_FOLDERS_BY_NAME))
- {
- // This is the case where something got added or removed. If we are date sorting
- // everything including folders, then we need to rebuild the whole tree.
- // Just set to something not SO_DATE to force the folder most resent date resort.
- mSortOrder = mSortOrder & ~LLInventoryFilter::SO_DATE;
- setSortOrder(mSortOrder | LLInventoryFilter::SO_DATE);
- }
-}
-
static LLFastTimer::DeclareTimer FTM_SORT("Sort Inventory");
void LLFolderView::setSortOrder(U32 order)
@@ -320,15 +353,10 @@ void LLFolderView::setSortOrder(U32 order)
if (order != mSortOrder)
{
LLFastTimer t(FTM_SORT);
+
mSortOrder = order;
- for (folders_t::iterator iter = mFolders.begin();
- iter != mFolders.end();)
- {
- folders_t::iterator fit = iter++;
- (*fit)->sortBy(order);
- }
-
+ sortBy(order);
arrangeAll();
}
}
@@ -350,11 +378,7 @@ BOOL LLFolderView::addFolder( LLFolderViewFolder* folder)
{
mFolders.insert(mFolders.begin(), folder);
}
- if (folder->numSelected())
- {
- recursiveIncrementNumDescendantsSelected(folder->numSelected());
- }
- folder->setShowLoadStatus(true);
+ folder->setShowLoadStatus(mShowLoadStatus);
folder->setOrigin(0, 0);
folder->reshape(getRect().getWidth(), 0);
folder->setVisible(FALSE);
@@ -371,16 +395,6 @@ void LLFolderView::closeAllFolders()
arrangeAll();
}
-void LLFolderView::openFolder(const std::string& foldername)
-{
- LLFolderViewFolder* inv = findChild<LLFolderViewFolder>(foldername);
- if (inv)
- {
- setSelection(inv, FALSE, FALSE);
- inv->setOpen(TRUE);
- }
-}
-
void LLFolderView::openTopLevelFolders()
{
for (folders_t::iterator iter = mFolders.begin();
@@ -401,9 +415,19 @@ void LLFolderView::setOpenArrangeRecursively(BOOL openitem, ERecurseType recurse
static LLFastTimer::DeclareTimer FTM_ARRANGE("Arrange");
-// This view grows and shinks to enclose all of its children items and folders.
+// This view grows and shrinks to enclose all of its children items and folders.
S32 LLFolderView::arrange( S32* unused_width, S32* unused_height, S32 filter_generation )
{
+ if (getListener()->getUUID().notNull())
+ {
+ if (mNeedsSort)
+ {
+ mFolders.sort(mSortFunction);
+ mItems.sort(mSortFunction);
+ mNeedsSort = false;
+ }
+ }
+
LLFastTimer t2(FTM_ARRANGE);
filter_generation = mFilter->getMinRequiredGeneration();
@@ -417,7 +441,7 @@ S32 LLFolderView::arrange( S32* unused_width, S32* unused_height, S32 filter_gen
getRoot()->getFilter()->getShowFolderState();
S32 total_width = LEFT_PAD;
- S32 running_height = mDebugFilters ? llceil(LLFontGL::getFontMonospace()->getLineHeight()) : 0;
+ S32 running_height = mDebugFilters ? LLFontGL::getFontMonospace()->getLineHeight() : 0;
S32 target_height = running_height;
S32 parent_item_height = getRect().getHeight();
@@ -432,15 +456,11 @@ S32 LLFolderView::arrange( S32* unused_width, S32* unused_height, S32 filter_gen
}
else
{
- folderp->setVisible(show_folder_state == LLInventoryFilter::SHOW_ALL_FOLDERS || // always show folders?
- (folderp->getFiltered(filter_generation) || folderp->hasFilteredDescendants(filter_generation))); // passed filter or has descendants that passed filter
+ folderp->setVisible((show_folder_state == LLInventoryFilter::SHOW_ALL_FOLDERS || // always show folders?
+ (folderp->getFiltered(filter_generation) || folderp->hasFilteredDescendants(filter_generation))));
}
- // Need to call arrange regardless of visibility, since children's visibility
- // might need to be changed too (e.g. even though a folder is invisible, its
- // children also need to be set invisible for state-tracking purposes, e.g.
- // llfolderviewitem::filter).
- // if (folderp->getVisible())
+ if (folderp->getVisible())
{
S32 child_height = 0;
S32 child_width = 0;
@@ -485,6 +505,7 @@ S32 LLFolderView::arrange( S32* unused_width, S32* unused_height, S32 filter_gen
target_height = running_height;
}
+ mRunningHeight = running_height;
LLRect scroll_rect = mScrollContainer->getContentWindowRect();
reshape( llmax(scroll_rect.getWidth(), total_width), running_height );
@@ -530,16 +551,19 @@ void LLFolderView::reshape(S32 width, S32 height, BOOL called_from_parent)
LLRect scroll_rect;
if (mScrollContainer)
{
+ LLView::reshape(width, height, called_from_parent);
scroll_rect = mScrollContainer->getContentWindowRect();
}
- width = llmax(mMinWidth, scroll_rect.getWidth());
+ width = llmax(mMinWidth, scroll_rect.getWidth());
+ height = llmax(mRunningHeight, scroll_rect.getHeight());
- // restrict width with scroll container's width
- if (mUseEllipses)
+ // Restrict width within scroll container's width
+ if (mUseEllipses && mScrollContainer)
+ {
width = scroll_rect.getWidth();
+ }
LLView::reshape(width, height, called_from_parent);
-
mReshapeSignal(mSelectedItems, FALSE);
}
@@ -696,28 +720,10 @@ BOOL LLFolderView::changeSelection(LLFolderViewItem* selection, BOOL selected)
return rv;
}
-void LLFolderView::extendSelection(LLFolderViewItem* selection, LLFolderViewItem* last_selected, LLDynamicArray<LLFolderViewItem*>& items)
-{
- // now store resulting selection
- if (mAllowMultiSelect)
- {
- LLFolderViewItem *cur_selection = getCurSelectedItem();
- LLFolderViewFolder::extendSelection(selection, cur_selection, items);
- for (S32 i = 0; i < items.count(); i++)
- {
- addToSelectionList(items[i]);
- }
- }
- else
- {
- setSelection(selection, FALSE, FALSE);
- }
-
- mSignalSelectCallback = SIGNAL_KEYBOARD_FOCUS;
-}
-
+static LLFastTimer::DeclareTimer FTM_SANITIZE_SELECTION("Sanitize Selection");
void LLFolderView::sanitizeSelection()
{
+ LLFastTimer _(FTM_SANITIZE_SELECTION);
// store off current item in case it is automatically deselected
// and we want to preserve context
LLFolderViewItem* original_selected_item = getCurSelectedItem();
@@ -776,7 +782,7 @@ void LLFolderView::sanitizeSelection()
}
// Don't allow invisible items (such as root folders) to be selected.
- if (item->getHidden())
+ if (item == getRoot())
{
items_to_remove.push_back(item);
}
@@ -791,7 +797,7 @@ void LLFolderView::sanitizeSelection()
// if nothing selected after prior constraints...
if (mSelectedItems.empty())
{
- // ...select first available parent of original selection, or "My Inventory" otherwise
+ // ...select first available parent of original selection
LLFolderViewItem* new_selection = NULL;
if (original_selected_item)
{
@@ -799,7 +805,7 @@ void LLFolderView::sanitizeSelection()
parent_folder;
parent_folder = parent_folder->getParentFolder())
{
- if (parent_folder->potentiallyVisible() && !parent_folder->getHidden())
+ if (parent_folder->potentiallyVisible())
{
// give initial selection to first ancestor folder that potentially passes the filter
if (!new_selection)
@@ -818,13 +824,7 @@ void LLFolderView::sanitizeSelection()
}
else
{
- // nothing selected to start with, so pick "My Inventory" as best guess
- new_selection = getItemByID(gInventory.getRootFolderID());
- // ... except if it's hidden from the UI.
- if (new_selection && new_selection->getHidden())
- {
- new_selection = NULL;
- }
+ new_selection = NULL;
}
if (new_selection)
@@ -938,19 +938,20 @@ void LLFolderView::draw()
mStatusText.clear();
mStatusTextBox->setVisible( FALSE );
}
- else
+ else if (mShowEmptyMessage)
{
- if (LLInventoryModelBackgroundFetch::instance().backgroundFetchActive() || mCompletedFilterGeneration < mFilter->getMinRequiredGeneration())
+ if (LLInventoryModelBackgroundFetch::instance().folderFetchActive() || mCompletedFilterGeneration < mFilter->getMinRequiredGeneration())
{
mStatusText = LLTrans::getString("Searching");
- //font->renderUTF8(mStatusText, 0, 2, 1, sSearchStatusColor, LLFontGL::LEFT, LLFontGL::TOP, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE );
}
else
{
- LLStringUtil::format_map_t args;
- args["[SEARCH_TERM]"] = LLURI::escape(getFilter()->getFilterSubStringOrig());
- mStatusText = LLTrans::getString(getFilter()->getEmptyLookupMessage(), args);
- //font->renderUTF8(mStatusText, 0, 2, 1, sSearchStatusColor, LLFontGL::LEFT, LLFontGL::TOP, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE );
+ if (getFilter())
+ {
+ LLStringUtil::format_map_t args;
+ args["[SEARCH_TERM]"] = LLURI::escape(getFilter()->getFilterSubStringOrig());
+ mStatusText = LLTrans::getString(getFilter()->getEmptyLookupMessage(), args);
+ }
}
mStatusTextBox->setValue(mStatusText);
mStatusTextBox->setVisible( TRUE );
@@ -970,11 +971,15 @@ void LLFolderView::draw()
// We should call this method to also notify parent about required rect.
// See EXT-7564, EXT-7047.
arrangeFromRoot();
+ LLUI::popMatrix();
+ LLUI::pushMatrix();
+ LLUI::translate((F32)getRect().mLeft, (F32)getRect().mBottom);
}
-
}
- LLFolderViewFolder::draw();
+ // skip over LLFolderViewFolder::draw since we don't want the folder icon, label,
+ // and arrow for the root folder
+ LLView::draw();
mDragAndDropThisFrame = FALSE;
}
@@ -1013,6 +1018,51 @@ void LLFolderView::removeSelectedItems( void )
LLNotificationsUtil::add("DeleteItems", args, LLSD(), boost::bind(&LLFolderView::onItemsRemovalConfirmation, this, _1, _2));
}
+bool isDescendantOfASelectedItem(LLFolderViewItem* item, const std::vector<LLFolderViewItem*>& selectedItems)
+{
+ LLFolderViewItem* item_parent = dynamic_cast<LLFolderViewItem*>(item->getParent());
+
+ if (item_parent)
+ {
+ for(std::vector<LLFolderViewItem*>::const_iterator it = selectedItems.begin(); it != selectedItems.end(); ++it)
+ {
+ const LLFolderViewItem* const selected_item = (*it);
+
+ LLFolderViewItem* parent = item_parent;
+
+ while (parent)
+ {
+ if (selected_item == parent)
+ {
+ return true;
+ }
+
+ parent = dynamic_cast<LLFolderViewItem*>(parent->getParent());
+ }
+ }
+ }
+
+ return false;
+}
+
+// static
+void LLFolderView::removeCutItems()
+{
+ // There's no item in "cut" mode on the clipboard -> exit
+ if (!LLClipboard::instance().isCutMode())
+ return;
+
+ // Get the list of clipboard item uuids and iterate through them
+ LLDynamicArray<LLUUID> objects;
+ LLClipboard::instance().pasteFromClipboard(objects);
+ for (LLDynamicArray<LLUUID>::const_iterator iter = objects.begin();
+ iter != objects.end();
+ ++iter)
+ {
+ gInventory.removeObject(*iter);
+ }
+}
+
void LLFolderView::onItemsRemovalConfirmation(const LLSD& notification, const LLSD& response)
{
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
@@ -1034,7 +1084,7 @@ void LLFolderView::onItemsRemovalConfirmation(const LLSD& notification, const LL
for (item_it = mSelectedItems.begin(); item_it != mSelectedItems.end(); ++item_it)
{
item = *item_it;
- if(item->isRemovable())
+ if (item && item->isRemovable())
{
items.push_back(item);
}
@@ -1087,7 +1137,7 @@ void LLFolderView::onItemsRemovalConfirmation(const LLSD& notification, const LL
if (!new_selection)
{
new_selection = last_item->getPreviousOpenNode(FALSE);
- while (new_selection && new_selection->isSelected())
+ while (new_selection && (new_selection->isSelected() || isDescendantOfASelectedItem(new_selection, items)))
{
new_selection = new_selection->getPreviousOpenNode(FALSE);
}
@@ -1198,7 +1248,9 @@ void LLFolderView::changeType(LLInventoryModel *model, LLFolderType::EType new_f
void LLFolderView::autoOpenItem( LLFolderViewFolder* item )
{
- if (mAutoOpenItems.check() == item || mAutoOpenItems.getDepth() >= (U32)AUTO_OPEN_STACK_DEPTH)
+ if ((mAutoOpenItems.check() == item) ||
+ (mAutoOpenItems.getDepth() >= (U32)AUTO_OPEN_STACK_DEPTH) ||
+ item->isOpen())
{
return;
}
@@ -1290,7 +1342,7 @@ BOOL LLFolderView::canCopy() const
void LLFolderView::copy()
{
// *NOTE: total hack to clear the inventory clipboard
- LLInventoryClipboard::instance().reset();
+ LLClipboard::instance().reset();
S32 count = mSelectedItems.size();
if(getVisible() && getEnabled() && (count > 0))
{
@@ -1331,7 +1383,7 @@ BOOL LLFolderView::canCut() const
void LLFolderView::cut()
{
// clear the inventory clipboard
- LLInventoryClipboard::instance().reset();
+ LLClipboard::instance().reset();
S32 count = mSelectedItems.size();
if(getVisible() && getEnabled() && (count > 0))
{
@@ -1345,6 +1397,7 @@ void LLFolderView::cut()
listener->cutToClipboard();
}
}
+ LLFolderView::removeCutItems();
}
mSearchString.clear();
}
@@ -1654,11 +1707,7 @@ BOOL LLFolderView::handleKeyHere( KEY key, MASK mask )
LLFolderViewItem* parent_folder = last_selected->getParentFolder();
if (!last_selected->isOpen() && parent_folder && parent_folder->getParentFolder())
{
- // Don't change selectin to hidden folder. See EXT-5328.
- if (!parent_folder->getHidden())
- {
- setSelection(parent_folder, FALSE, TRUE);
- }
+ setSelection(parent_folder, FALSE, TRUE);
}
else
{
@@ -1703,7 +1752,7 @@ BOOL LLFolderView::handleUnicodeCharHere(llwchar uni_char)
}
BOOL handled = FALSE;
- if (gFocusMgr.childHasKeyboardFocus(getRoot()))
+ if (mParentPanel->hasFocus())
{
// SL-51858: Key presses are not being passed to the Popup menu.
// A proper fix is non-trivial so instead just close the menu.
@@ -1854,31 +1903,9 @@ BOOL LLFolderView::handleRightMouseDown( S32 x, S32 y, MASK mask )
{
if (mCallbackRegistrar)
mCallbackRegistrar->pushScope();
- //menu->empty();
- const LLView::child_list_t *list = menu->getChildList();
- LLView::child_list_t::const_iterator menu_itor;
- for (menu_itor = list->begin(); menu_itor != list->end(); ++menu_itor)
- {
- (*menu_itor)->setVisible(FALSE);
- (*menu_itor)->pushVisible(TRUE);
- (*menu_itor)->setEnabled(TRUE);
- }
-
- // Successively filter out invalid options
-
- U32 flags = FIRST_SELECTED_ITEM;
- for (selected_items_t::iterator item_itor = mSelectedItems.begin();
- item_itor != mSelectedItems.end();
- ++item_itor)
- {
- LLFolderViewItem* selected_item = (*item_itor);
- selected_item->buildContextMenu(*menu, flags);
- flags = 0x0;
- }
+ updateMenuOptions(menu);
- addNoOptions(menu);
-
menu->updateParent(LLMenuGL::sMenuContainer);
LLMenuGL::showPopup(this, menu, x, y);
if (mCallbackRegistrar)
@@ -1938,14 +1965,26 @@ BOOL LLFolderView::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
std::string& tooltip_msg)
{
mDragAndDropThisFrame = TRUE;
+ // have children handle it first
BOOL handled = LLView::handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data,
accept, tooltip_msg);
- // When there are no visible children drag and drop is handled
+ // when drop is not handled by child, it should be handled
// by the folder which is the hierarchy root.
- if (!handled && !hasVisibleChildren())
+ if (!handled)
{
- handled = mFolders.front()->handleDragAndDropFromChild(mask,drop,cargo_type,cargo_data,accept,tooltip_msg);
+ if (getListener()->getUUID().notNull())
+ {
+ handled = LLFolderViewFolder::handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg);
+ }
+ else
+ {
+ if (!mFolders.empty())
+ {
+ // dispatch to last folder as a hack to support "Contents" folder in object inventory
+ handled = mFolders.back()->handleDragAndDropFromChild(mask,drop,cargo_type,cargo_data,accept,tooltip_msg);
+ }
+ }
}
if (handled)
@@ -1959,29 +1998,26 @@ BOOL LLFolderView::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
void LLFolderView::deleteAllChildren()
{
closeRenamer();
- LLView::deleteViewByHandle(mPopupMenuHandle);
+ if (mPopupMenuHandle.get()) mPopupMenuHandle.get()->die();
mPopupMenuHandle = LLHandle<LLView>();
- mRenamer = NULL;
+ mScrollContainer = NULL;
mRenameItem = NULL;
+ mRenamer = NULL;
+ mStatusTextBox = NULL;
+
clearSelection();
LLView::deleteAllChildren();
}
void LLFolderView::scrollToShowSelection()
{
- // If items are filtered while background fetch is in progress
- // scrollbar resets to the first filtered item. See EXT-3981.
- // However we allow scrolling for folder views with mAutoSelectOverride
- // (used in Places SP) as an exception because the selection in them
- // is not reset during items filtering. See STORM-133.
- if ( (!LLInventoryModelBackgroundFetch::instance().backgroundFetchActive() || mAutoSelectOverride)
- && mSelectedItems.size() )
+ if ( mSelectedItems.size() )
{
mNeedsScroll = TRUE;
}
}
-// If the parent is scroll containter, scroll it to make the selection
+// If the parent is scroll container, scroll it to make the selection
// is maximally visible.
void LLFolderView::scrollToShowItem(LLFolderViewItem* item, const LLRect& constraint_rect)
{
@@ -2002,7 +2038,7 @@ void LLFolderView::scrollToShowItem(LLFolderViewItem* item, const LLRect& constr
LLRect visible_doc_rect = mScrollContainer->getVisibleContentRect();
S32 icon_height = mIcon.isNull() ? 0 : mIcon->getHeight();
- S32 label_height = llround(getLabelFontForStyle(mLabelStyle)->getLineHeight());
+ S32 label_height = getLabelFontForStyle(mLabelStyle)->getLineHeight();
// when navigating with keyboard, only move top of opened folder on screen, otherwise show whole folder
S32 max_height_to_show = item->isOpen() && mScrollContainer->hasFocus() ? (llmax( icon_height, label_height ) + ICON_PAD) : local_rect.getHeight();
@@ -2063,9 +2099,11 @@ void LLFolderView::removeItemID(const LLUUID& id)
mItemMap.erase(id);
}
+LLFastTimer::DeclareTimer FTM_GET_ITEM_BY_ID("Get FolderViewItem by ID");
LLFolderViewItem* LLFolderView::getItemByID(const LLUUID& id)
{
- if (id.isNull())
+ LLFastTimer _(FTM_GET_ITEM_BY_ID);
+ if (id == getListener()->getUUID())
{
return this;
}
@@ -2082,7 +2120,7 @@ LLFolderViewItem* LLFolderView::getItemByID(const LLUUID& id)
LLFolderViewFolder* LLFolderView::getFolderByID(const LLUUID& id)
{
- if (id.isNull())
+ if (id == getListener()->getUUID())
{
return this;
}
@@ -2114,10 +2152,10 @@ bool LLFolderView::doToSelected(LLInventoryModel* model, const LLSD& userdata)
removeSelectedItems();
return true;
}
-
- if ("copy" == action)
- {
- LLInventoryClipboard::instance().reset();
+ if (("copy" == action) || ("cut" == action))
+ {
+ // Clear the clipboard before we start adding things on it
+ LLClipboard::instance().reset();
}
static const std::string change_folder_string = "change_folder_type_";
@@ -2198,46 +2236,56 @@ void LLFolderView::doIdle()
arrangeAll();
}
+ if (mFilter->isModified() && mFilter->isNotDefault())
+ {
+ mNeedsAutoSelect = TRUE;
+ }
mFilter->clearModified();
- BOOL filter_modified_and_active = mCompletedFilterGeneration < mFilter->getCurrentGeneration() &&
- mFilter->isNotDefault();
- mNeedsAutoSelect = filter_modified_and_active &&
- !(gFocusMgr.childHasKeyboardFocus(this) || gFocusMgr.getMouseCapture());
- // filter to determine visiblity before arranging
+ // filter to determine visibility before arranging
filterFromRoot();
- // automatically show matching items, and select first one
- // do this every frame until user puts keyboard focus into the inventory window
- // signaling the end of the automatic update
- // only do this when mNeedsFilter is set, meaning filtered items have
- // potentially changed
+ // automatically show matching items, and select first one if we had a selection
if (mNeedsAutoSelect)
{
LLFastTimer t3(FTM_AUTO_SELECT);
// select new item only if a filtered item not currently selected
LLFolderViewItem* selected_itemp = mSelectedItems.empty() ? NULL : mSelectedItems.back();
- if ((!selected_itemp || !selected_itemp->getFiltered()) && !mAutoSelectOverride)
+ if (!mAutoSelectOverride && (!selected_itemp || !selected_itemp->potentiallyFiltered()))
{
- // select first filtered item
- LLSelectFirstFilteredItem filter;
- applyFunctorRecursively(filter);
+ // these are named variables to get around gcc not binding non-const references to rvalues
+ // and functor application is inherently non-const to allow for stateful functors
+ LLSelectFirstFilteredItem functor;
+ applyFunctorRecursively(functor);
}
// Open filtered folders for folder views with mAutoSelectOverride=TRUE.
// Used by LLPlacesFolderView.
if (mAutoSelectOverride && !mFilter->getFilterSubString().empty())
{
- LLOpenFilteredFolders filter;
- applyFunctorRecursively(filter);
+ // these are named variables to get around gcc not binding non-const references to rvalues
+ // and functor application is inherently non-const to allow for stateful functors
+ LLOpenFilteredFolders functor;
+ applyFunctorRecursively(functor);
}
scrollToShowSelection();
}
+ BOOL filter_finished = mCompletedFilterGeneration >= mFilter->getCurrentGeneration()
+ && !LLInventoryModelBackgroundFetch::instance().folderFetchActive();
+ if (filter_finished
+ || gFocusMgr.childHasKeyboardFocus(inventory_panel)
+ || gFocusMgr.childHasMouseCapture(inventory_panel))
+ {
+ // finishing the filter process, giving focus to the folder view, or dragging the scrollbar all stop the auto select process
+ mNeedsAutoSelect = FALSE;
+ }
+
+
// during filtering process, try to pin selected item's location on screen
// this will happen when searching your inventory and when new items arrive
- if (filter_modified_and_active)
+ if (!filter_finished)
{
// calculate rectangle to pin item to at start of animated rearrange
if (!mPinningSelectedItem && !mSelectedItems.empty())
@@ -2303,7 +2351,7 @@ void LLFolderView::doIdle()
{
scrollToShowItem(mSelectedItems.back(), constraint_rect);
// continue scrolling until animated layout change is done
- if (!filter_modified_and_active
+ if (filter_finished
&& (!needsArrange() || !is_visible))
{
mNeedsScroll = FALSE;
@@ -2365,6 +2413,45 @@ void LLFolderView::updateRenamerPosition()
}
}
+// Update visibility and availability (i.e. enabled/disabled) of context menu items.
+void LLFolderView::updateMenuOptions(LLMenuGL* menu)
+{
+ const LLView::child_list_t *list = menu->getChildList();
+
+ LLView::child_list_t::const_iterator menu_itor;
+ for (menu_itor = list->begin(); menu_itor != list->end(); ++menu_itor)
+ {
+ (*menu_itor)->setVisible(FALSE);
+ (*menu_itor)->pushVisible(TRUE);
+ (*menu_itor)->setEnabled(TRUE);
+ }
+
+ // Successively filter out invalid options
+
+ U32 flags = FIRST_SELECTED_ITEM;
+ for (selected_items_t::iterator item_itor = mSelectedItems.begin();
+ item_itor != mSelectedItems.end();
+ ++item_itor)
+ {
+ LLFolderViewItem* selected_item = (*item_itor);
+ selected_item->buildContextMenu(*menu, flags);
+ flags = 0x0;
+ }
+
+ addNoOptions(menu);
+}
+
+// Refresh the context menu (that is already shown).
+void LLFolderView::updateMenu()
+{
+ LLMenuGL* menu = (LLMenuGL*)mPopupMenuHandle.get();
+ if (menu && menu->getVisible())
+ {
+ updateMenuOptions(menu);
+ menu->needsArrange(); // update menu height if needed
+ }
+}
+
bool LLFolderView::selectFirstItem()
{
for (folders_t::iterator iter = mFolders.begin();
@@ -2491,11 +2578,6 @@ BOOL LLFolderView::isFilterModified()
return mFilter->isNotDefault();
}
-BOOL LLFolderView::getAllowMultiSelect()
-{
- return mAllowMultiSelect;
-}
-
void delete_selected_item(void* user_data)
{
if(user_data)
diff --git a/indra/newview/llfolderview.h b/indra/newview/llfolderview.h
index afaac86b04..da8bb15f8e 100644
--- a/indra/newview/llfolderview.h
+++ b/indra/newview/llfolderview.h
@@ -44,6 +44,7 @@
#include "lldepthstack.h"
#include "lleditmenuhandler.h"
#include "llfontgl.h"
+#include "llscrollcontainer.h"
#include "lltooldraganddrop.h"
#include "llviewertexture.h"
@@ -54,31 +55,33 @@ class LLInventoryModel;
class LLPanel;
class LLLineEditor;
class LLMenuGL;
-class LLScrollContainer;
class LLUICtrl;
class LLTextBox;
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLFolderViewFunctor
-//
-// Simple abstract base class for applying a functor to folders and
-// items in a folder view hierarchy. This is suboptimal for algorithms
-// that only work folders or only work on items, but I'll worry about
-// that later when it's determined to be too slow.
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-class LLFolderViewFunctor
+/**
+ * Class LLFolderViewScrollContainer
+ *
+ * A scroll container which provides the information about the height
+ * of currently displayed folder view contents.
+ * Used for updating vertical scroll bar visibility in inventory panel.
+ * See LLScrollContainer::calcVisibleSize().
+ */
+class LLFolderViewScrollContainer : public LLScrollContainer
{
public:
- virtual ~LLFolderViewFunctor() {}
- virtual void doFolder(LLFolderViewFolder* folder) = 0;
- virtual void doItem(LLFolderViewItem* item) = 0;
+ /*virtual*/ ~LLFolderViewScrollContainer() {};
+ /*virtual*/ const LLRect getScrolledViewRect() const;
+
+protected:
+ LLFolderViewScrollContainer(const LLScrollContainer::Params& p);
+ friend class LLUICtrlFactory;
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLFolderView
//
-// Th LLFolderView represents the root level folder view object. It
-// manages the screen region of the folder view.
+// The LLFolderView represents the root level folder view object.
+// It manages the screen region of the folder view.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class LLFolderView : public LLFolderViewFolder, public LLEditMenuHandler
@@ -89,8 +92,17 @@ public:
Mandatory<LLPanel*> parent_panel;
Optional<LLUUID> task_id;
Optional<std::string> title;
- Optional<bool> use_label_suffix;
+ Optional<bool> use_label_suffix,
+ allow_multiselect,
+ show_empty_message,
+ show_load_status,
+ use_ellipses;
+
+ Params();
};
+
+ friend class LLFolderViewScrollContainer;
+
LLFolderView(const Params&);
virtual ~LLFolderView( void );
@@ -98,12 +110,10 @@ public:
virtual LLFolderView* getRoot() { return this; }
- // FolderViews default to sort by name. This will change that,
+ // FolderViews default to sort by name. This will change that,
// and resort the items if necessary.
void setSortOrder(U32 order);
- void checkTreeResortForModelChanged();
void setFilterPermMask(PermissionMask filter_perm_mask);
- void setAllowMultiSelect(BOOL allow) { mAllowMultiSelect = allow; }
typedef boost::signals2::signal<void (const std::deque<LLFolderViewItem*>& items, BOOL user_action)> signal_t;
void setSelectCallback(const signal_t::slot_type& cb) { mSelectSignal.connect(cb); }
@@ -118,31 +128,31 @@ public:
//LLInventoryFilter::EFolderShow getShowFolderState();
U32 getSortOrder() const;
BOOL isFilterModified();
- BOOL getAllowMultiSelect();
+
+ bool getAllowMultiSelect() { return mAllowMultiSelect; }
// Close all folders in the view
void closeAllFolders();
- void openFolder(const std::string& foldername);
void openTopLevelFolders();
virtual void toggleOpen() {};
virtual void setOpenArrangeRecursively(BOOL openitem, ERecurseType recurse);
virtual BOOL addFolder( LLFolderViewFolder* folder);
- // Finds width and height of this object and it's children. Also
- // makes sure that this view and it's children are the right size.
+ // Find width and height of this object and its children. Also
+ // makes sure that this view and its children are the right size.
virtual S32 arrange( S32* width, S32* height, S32 filter_generation );
void arrangeAll() { mArrangeGeneration++; }
S32 getArrangeGeneration() { return mArrangeGeneration; }
- // applies filters to control visibility of inventory items
+ // Apply filters to control visibility of inventory items
virtual void filter( LLInventoryFilter& filter);
- // get the last selected item
+ // Get the last selected item
virtual LLFolderViewItem* getCurSelectedItem( void );
- // Record the selected item and pass it down the hierachy.
+ // Record the selected item and pass it down the hierarchy.
virtual BOOL setSelection(LLFolderViewItem* selection, BOOL openitem,
BOOL take_keyboard_focus);
@@ -152,15 +162,13 @@ public:
// Called once a frame to update the selection if mSelectThisID has been set
void updateSelection();
- // This method is used to toggle the selection of an item. Walks
- // children, and keeps track of selected objects.
+ // This method is used to toggle the selection of an item.
+ // Walks children and keeps track of selected objects.
virtual BOOL changeSelection(LLFolderViewItem* selection, BOOL selected);
- virtual void extendSelection(LLFolderViewItem* selection, LLFolderViewItem* last_selected, LLDynamicArray<LLFolderViewItem*>& items);
-
virtual std::set<LLUUID> getSelectionList() const;
- // make sure if ancestor is selected, descendents are not
+ // Make sure if ancestor is selected, descendents are not
void sanitizeSelection();
void clearSelection();
void addToSelectionList(LLFolderViewItem* item);
@@ -171,22 +179,22 @@ public:
void setDraggingOverItem(LLFolderViewItem* item) { mDraggingOverItem = item; }
LLFolderViewItem* getDraggingOverItem() { return mDraggingOverItem; }
-
- // deletion functionality
+ // Deletion functionality
void removeSelectedItems();
+ static void removeCutItems();
- // open the selected item.
+ // Open the selected item
void openSelectedItems( void );
void propertiesSelectedItems( void );
- // change the folder type
+ // Change the folder type
void changeType(LLInventoryModel *model, LLFolderType::EType new_folder_type);
void autoOpenItem(LLFolderViewFolder* item);
void closeAutoOpenedFolders();
BOOL autoOpenTest(LLFolderViewFolder* item);
- // copy & paste
+ // Copy & paste
virtual void copy();
virtual BOOL canCopy() const;
@@ -199,7 +207,7 @@ public:
virtual void doDelete();
virtual BOOL canDoDelete() const;
- // public rename functionality - can only start the process
+ // Public rename functionality - can only start the process
void startRenamingSelectedItem( void );
// These functions were used when there was only one folderview,
@@ -239,7 +247,6 @@ public:
void setShowSingleSelection(BOOL show);
BOOL getShowSingleSelection() { return mShowSingleSelection; }
F32 getSelectionFadeElapsedTime() { return mMultiSelectionFadeTimer.getElapsedTimeF32(); }
- void setUseEllipses(bool use_ellipses) { mUseEllipses = use_ellipses; }
bool getUseEllipses() { return mUseEllipses; }
void addItemID(const LLUUID& id, LLFolderViewItem* itemp);
@@ -269,7 +276,10 @@ public:
virtual S32 notify(const LLSD& info) ;
bool useLabelSuffix() { return mUseLabelSuffix; }
+ void updateMenu();
+
private:
+ void updateMenuOptions(LLMenuGL* menu);
void updateRenamerPosition();
protected:
@@ -295,6 +305,7 @@ protected:
selected_items_t mSelectedItems;
BOOL mKeyboardSelection;
BOOL mAllowMultiSelect;
+ BOOL mShowEmptyMessage;
BOOL mShowFolderHierarchy;
LLUUID mSourceID;
@@ -327,6 +338,7 @@ protected:
signal_t mReshapeSignal;
S32 mSignalSelectCallback;
S32 mMinWidth;
+ S32 mRunningHeight;
std::map<LLUUID, LLFolderViewItem*> mItemMap;
BOOL mDragAndDropThisFrame;
@@ -336,7 +348,7 @@ protected:
/**
* Is used to determine if we need to cut text In LLFolderViewItem to avoid horizontal scroll.
- * NOTE: For now it uses only to cut LLFolderViewItem::mLabel text to be used for Landmarks in Places Panel.
+ * NOTE: For now it's used only to cut LLFolderViewItem::mLabel text for Landmarks in Places Panel.
*/
bool mUseEllipses; // See EXT-719
diff --git a/indra/newview/llfoldervieweventlistener.h b/indra/newview/llfoldervieweventlistener.h
index 3bfbf36110..06682dcbf1 100644
--- a/indra/newview/llfoldervieweventlistener.h
+++ b/indra/newview/llfoldervieweventlistener.h
@@ -75,7 +75,7 @@ public:
virtual void move( LLFolderViewEventListener* parent_listener ) = 0;
virtual BOOL isItemCopyable() const = 0;
virtual BOOL copyToClipboard() const = 0;
- virtual void cutToClipboard() = 0;
+ virtual BOOL cutToClipboard() const = 0;
virtual BOOL isClipboardPasteable() const = 0;
virtual void pasteFromClipboard() = 0;
virtual void pasteLinkFromClipboard() = 0;
@@ -96,7 +96,8 @@ public:
// otherwise FALSE.
virtual BOOL dragOrDrop(MASK mask, BOOL drop,
EDragAndDropType cargo_type,
- void* cargo_data) = 0;
+ void* cargo_data,
+ std::string& tooltip_msg) = 0;
};
#endif
diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp
index 3c36248c1f..d2b4866987 100644
--- a/indra/newview/llfolderviewitem.cpp
+++ b/indra/newview/llfolderviewitem.cpp
@@ -30,14 +30,17 @@
// viewer includes
#include "llfolderview.h" // Items depend extensively on LLFolderViews
#include "llfoldervieweventlistener.h"
+#include "llviewerfoldertype.h"
#include "llinventorybridge.h" // for LLItemBridge in LLInventorySort::operator()
#include "llinventoryfilter.h"
+#include "llinventoryfunctions.h"
#include "llinventorymodelbackgroundfetch.h"
#include "llpanel.h"
#include "llviewercontrol.h" // gSavedSettings
#include "llviewerwindow.h" // Argh, only for setCursor()
// linden library includes
+#include "llclipboard.h"
#include "llfocusmgr.h" // gFocusMgr
#include "lltrans.h"
@@ -99,10 +102,7 @@ LLFolderViewItem::Params::Params()
item_height("item_height"),
item_top_pad("item_top_pad"),
creation_date()
-{
- mouse_opaque(true);
- follows.flags(FOLLOWS_LEFT|FOLLOWS_TOP|FOLLOWS_RIGHT);
-}
+{}
// Default constructor
LLFolderViewItem::LLFolderViewItem(const LLFolderViewItem::Params& p)
@@ -130,10 +130,15 @@ LLFolderViewItem::LLFolderViewItem(const LLFolderViewItem::Params& p)
mIconOpen(p.icon_open),
mIconOverlay(p.icon_overlay),
mListener(p.listener),
- mHidden(false),
- mShowLoadStatus(false)
+ mShowLoadStatus(false),
+ mIsMouseOverTitle(false)
+{
+}
+
+BOOL LLFolderViewItem::postBuild()
{
refresh();
+ return TRUE;
}
// Destroys the object
@@ -195,7 +200,7 @@ LLFolderViewItem* LLFolderViewItem::getPreviousOpenNode(BOOL include_children)
LLFolderViewItem* itemp = mParentFolder->getPreviousFromChild( this, include_children );
// Skip over items that are invisible or are hidden from the UI.
- while(itemp && (!itemp->getVisible() || itemp->getHidden()))
+ while(itemp && !itemp->getVisible())
{
LLFolderViewItem* next_itemp = itemp->mParentFolder->getPreviousFromChild( itemp, include_children );
if (itemp == next_itemp)
@@ -216,6 +221,11 @@ BOOL LLFolderViewItem::potentiallyVisible()
{
// we haven't been checked against min required filter
// or we have and we passed
+ return potentiallyFiltered();
+}
+
+BOOL LLFolderViewItem::potentiallyFiltered()
+{
return getLastFilterGeneration() < getRoot()->getFilter()->getMinRequiredGeneration() || getFiltered();
}
@@ -278,9 +288,9 @@ void LLFolderViewItem::refreshFromListener()
setToolTip(mLabel);
setIcon(mListener->getIcon());
time_t creation_date = mListener->getCreationDate();
- if (mCreationDate != creation_date)
+ if ((creation_date > 0) && (mCreationDate != creation_date))
{
- mCreationDate = mListener->getCreationDate();
+ setCreationDate(creation_date);
dirtyFilter();
}
if (mRoot->useLabelSuffix())
@@ -351,7 +361,10 @@ void LLFolderViewItem::arrangeAndSet(BOOL set_selection,
BOOL take_keyboard_focus)
{
LLFolderView* root = getRoot();
+ if (getParentFolder())
+ {
getParentFolder()->requestArrange();
+ }
if(set_selection)
{
setSelectionFromRoot(this, TRUE, take_keyboard_focus);
@@ -379,13 +392,6 @@ void LLFolderViewItem::changeSelectionFromRoot(LLFolderViewItem* selection, BOOL
getRoot()->changeSelection(selection, selected);
}
-void LLFolderViewItem::extendSelectionFromRoot(LLFolderViewItem* selection)
-{
- LLDynamicArray<LLFolderViewItem*> selected_items;
-
- getRoot()->extendSelection(selection, NULL, selected_items);
-}
-
std::set<LLUUID> LLFolderViewItem::getSelectionList() const
{
std::set<LLUUID> selection;
@@ -410,8 +416,8 @@ BOOL LLFolderViewItem::addToFolder(LLFolderViewFolder* folder, LLFolderView* roo
}
-// Finds width and height of this object and it's children. Also
-// makes sure that this view and it's children are the right size.
+// Finds width and height of this object and its children. Also
+// makes sure that this view and its children are the right size.
S32 LLFolderViewItem::arrange( S32* width, S32* height, S32 filter_generation)
{
const Params& p = LLUICtrlFactory::getDefaultParams<LLFolderViewItem>();
@@ -423,7 +429,7 @@ S32 LLFolderViewItem::arrange( S32* width, S32* height, S32 filter_generation)
: 0;
if (mLabelWidthDirty)
{
- mLabelWidth = ARROW_SIZE + TEXT_PAD + ICON_WIDTH + ICON_PAD + getLabelFontForStyle(mLabelStyle)->getWidth(mSearchableLabel);
+ mLabelWidth = ARROW_SIZE + TEXT_PAD + ICON_WIDTH + ICON_PAD + getLabelFontForStyle(mLabelStyle)->getWidth(mLabel) + getLabelFontForStyle(mLabelStyle)->getWidth(mLabelSuffix) + TEXT_PAD_RIGHT;
mLabelWidthDirty = false;
}
@@ -442,23 +448,20 @@ S32 LLFolderViewItem::arrange( S32* width, S32* height, S32 filter_generation)
S32 LLFolderViewItem::getItemHeight()
{
- if (getHidden()) return 0;
-
return mItemHeight;
}
void LLFolderViewItem::filter( LLInventoryFilter& filter)
{
const BOOL previous_passed_filter = mPassedFilter;
- const BOOL passed_filter = mListener && filter.check(this);
+ const BOOL passed_filter = filter.check(this);
// If our visibility will change as a result of this filter, then
// we need to be rearranged in our parent folder
if (mParentFolder)
{
- if (getVisible() != passed_filter)
- mParentFolder->requestArrange();
- if (passed_filter != previous_passed_filter)
+ if (getVisible() != passed_filter
+ || previous_passed_filter != passed_filter )
mParentFolder->requestArrange();
}
@@ -492,10 +495,6 @@ BOOL LLFolderViewItem::setSelection(LLFolderViewItem* selection, BOOL openitem,
if (selection == this && !mIsSelected)
{
selectItem();
- if (mListener)
- {
- mListener->selectItem();
- }
}
else if (mIsSelected) // Deselect everything else.
{
@@ -506,7 +505,7 @@ BOOL LLFolderViewItem::setSelection(LLFolderViewItem* selection, BOOL openitem,
BOOL LLFolderViewItem::changeSelection(LLFolderViewItem* selection, BOOL selected)
{
- if (selection == this && mIsSelected != selected)
+ if (selection == this)
{
if (mIsSelected)
{
@@ -516,10 +515,6 @@ BOOL LLFolderViewItem::changeSelection(LLFolderViewItem* selection, BOOL selecte
{
selectItem();
}
- if (mListener)
- {
- mListener->selectItem();
- }
return TRUE;
}
return FALSE;
@@ -527,29 +522,18 @@ BOOL LLFolderViewItem::changeSelection(LLFolderViewItem* selection, BOOL selecte
void LLFolderViewItem::deselectItem(void)
{
- llassert(mIsSelected);
-
mIsSelected = FALSE;
-
- // Update ancestors' count of selected descendents.
- LLFolderViewFolder* parent_folder = getParentFolder();
- if (parent_folder)
- {
- parent_folder->recursiveIncrementNumDescendantsSelected(-1);
- }
}
void LLFolderViewItem::selectItem(void)
{
- llassert(!mIsSelected);
-
- mIsSelected = TRUE;
-
- // Update ancestors' count of selected descendents.
- LLFolderViewFolder* parent_folder = getParentFolder();
- if (parent_folder)
+ if (mIsSelected == FALSE)
{
- parent_folder->recursiveIncrementNumDescendantsSelected(1);
+ if (mListener)
+ {
+ mListener->selectItem();
+ }
+ mIsSelected = TRUE;
}
}
@@ -654,7 +638,7 @@ LLViewerInventoryItem * LLFolderViewItem::getInventoryItem(void)
return gInventory.getItem(getListener()->getUUID());
}
-std::string LLFolderViewItem::getName( void ) const
+const std::string& LLFolderViewItem::getName( void ) const
{
if(mListener)
{
@@ -693,7 +677,7 @@ BOOL LLFolderViewItem::handleMouseDown( S32 x, S32 y, MASK mask )
}
else if (mask & MASK_SHIFT)
{
- extendSelectionFromRoot(this);
+ getParentFolder()->extendSelectionTo(this);
}
else
{
@@ -718,6 +702,8 @@ BOOL LLFolderViewItem::handleMouseDown( S32 x, S32 y, MASK mask )
BOOL LLFolderViewItem::handleHover( S32 x, S32 y, MASK mask )
{
+ mIsMouseOverTitle = (y > (getRect().getHeight() - mItemHeight));
+
if( hasMouseCapture() && isMovable() )
{
S32 screen_x;
@@ -806,7 +792,7 @@ BOOL LLFolderViewItem::handleMouseUp( S32 x, S32 y, MASK mask )
}
else if (mask & MASK_SHIFT)
{
- extendSelectionFromRoot(this);
+ getParentFolder()->extendSelectionTo(this);
}
else
{
@@ -824,6 +810,11 @@ BOOL LLFolderViewItem::handleMouseUp( S32 x, S32 y, MASK mask )
return TRUE;
}
+void LLFolderViewItem::onMouseLeave(S32 x, S32 y, MASK mask)
+{
+ mIsMouseOverTitle = false;
+}
+
BOOL LLFolderViewItem::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
EDragAndDropType cargo_type,
void* cargo_data,
@@ -834,7 +825,7 @@ BOOL LLFolderViewItem::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
BOOL handled = FALSE;
if(mListener)
{
- accepted = mListener->dragOrDrop(mask,drop,cargo_type,cargo_data);
+ accepted = mListener->dragOrDrop(mask,drop,cargo_type,cargo_data, tooltip_msg);
handled = accepted;
if (accepted)
{
@@ -863,11 +854,6 @@ BOOL LLFolderViewItem::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
void LLFolderViewItem::draw()
{
- if (getHidden())
- {
- return;
- }
-
static LLUIColor sFgColor = LLUIColorTable::instance().getColor("MenuItemEnabledColor", DEFAULT_WHITE);
static LLUIColor sHighlightBgColor = LLUIColorTable::instance().getColor("MenuItemHighlightBgColor", DEFAULT_WHITE);
static LLUIColor sHighlightFgColor = LLUIColorTable::instance().getColor("MenuItemHighlightFgColor", DEFAULT_WHITE);
@@ -878,6 +864,7 @@ void LLFolderViewItem::draw()
static LLUIColor sLibraryColor = LLUIColorTable::instance().getColor("InventoryItemLibraryColor", DEFAULT_WHITE);
static LLUIColor sLinkColor = LLUIColorTable::instance().getColor("InventoryItemLinkColor", DEFAULT_WHITE);
static LLUIColor sSearchStatusColor = LLUIColorTable::instance().getColor("InventorySearchStatusColor", DEFAULT_WHITE);
+ static LLUIColor sMouseOverColor = LLUIColorTable::instance().getColor("InventoryMouseOverColor", DEFAULT_WHITE);
const Params& default_params = LLUICtrlFactory::getDefaultParams<LLFolderViewItem>();
const S32 TOP_PAD = default_params.item_top_pad;
@@ -891,8 +878,8 @@ void LLFolderViewItem::draw()
// Draw open folder arrow
//
const bool up_to_date = mListener && mListener->isUpToDate();
- const bool possibly_has_children = ((up_to_date && hasVisibleChildren()) || // we fetched our children and some of them have passed the filter...
- (!up_to_date && mListener && mListener->hasChildren())); // ...or we know we have children but haven't fetched them (doesn't obey filter)
+ const bool possibly_has_children = ((up_to_date && hasVisibleChildren()) // we fetched our children and some of them have passed the filter...
+ || (!up_to_date && mListener && mListener->hasChildren())); // ...or we know we have children but haven't fetched them (doesn't obey filter)
if (possibly_has_children)
{
LLUIImage* arrow_image = default_params.folder_arrow_image;
@@ -959,6 +946,14 @@ void LLFolderViewItem::draw()
}
}
}
+ else if (mIsMouseOverTitle)
+ {
+ gl_rect_2d(FOCUS_LEFT,
+ focus_top,
+ getRect().getWidth() - 2,
+ focus_bottom,
+ sMouseOverColor, FALSE);
+ }
//--------------------------------------------------------------------------------//
// Draw DragNDrop highlight
@@ -1013,7 +1008,7 @@ void LLFolderViewItem::draw()
LLColor4 color = (mIsSelected && filled) ? sHighlightFgColor : sFgColor;
if (highlight_link) color = sLinkColor;
if (in_library) color = sLibraryColor;
-
+
F32 right_x = 0;
F32 y = (F32)getRect().getHeight() - font->getLineHeight() - (F32)TEXT_PAD - (F32)TOP_PAD;
F32 text_left = (F32)(ARROW_SIZE + TEXT_PAD + ICON_WIDTH + ICON_PAD + mIndentation);
@@ -1054,8 +1049,11 @@ void LLFolderViewItem::draw()
{
root_is_loading = LLInventoryModelBackgroundFetch::instance().libraryFetchInProgress();
}
- if ((mIsLoading && mTimeSinceRequestStart.getElapsedTimeF32() >= gSavedSettings.getF32("FolderLoadingMessageWaitTime")) ||
- (LLInventoryModelBackgroundFetch::instance().backgroundFetchActive() && root_is_loading && (mShowLoadStatus || mHidden)))
+ if ((mIsLoading
+ && mTimeSinceRequestStart.getElapsedTimeF32() >= gSavedSettings.getF32("FolderLoadingMessageWaitTime"))
+ || (LLInventoryModelBackgroundFetch::instance().folderFetchActive()
+ && root_is_loading
+ && mShowLoadStatus))
{
std::string load_string = " ( " + LLTrans::getString("LoadingData") + " ) ";
font->renderUTF8(load_string, 0, right_x, y, sSearchStatusColor,
@@ -1107,7 +1105,6 @@ void LLFolderViewItem::draw()
LLFolderViewFolder::LLFolderViewFolder( const LLFolderViewItem::Params& p ):
LLFolderViewItem( p ), // 0 = no create time
- mNumDescendantsSelected(0),
mIsOpen(FALSE),
mExpanderHighlighted(FALSE),
mCurHeight(0.f),
@@ -1119,7 +1116,8 @@ LLFolderViewFolder::LLFolderViewFolder( const LLFolderViewItem::Params& p ):
mLastCalculatedWidth(0),
mCompletedFilterGeneration(-1),
mMostFilteredDescendantGeneration(-1),
- mNeedsSort(false)
+ mNeedsSort(false),
+ mPassedFolderFilter(FALSE)
{
}
@@ -1131,6 +1129,17 @@ LLFolderViewFolder::~LLFolderViewFolder( void )
gFocusMgr.releaseFocusIfNeeded( this ); // calls onCommit()
}
+void LLFolderViewFolder::setFilteredFolder(bool filtered, S32 filter_generation)
+{
+ mPassedFolderFilter = filtered;
+ mLastFilterGeneration = filter_generation;
+}
+
+bool LLFolderViewFolder::getFilteredFolder(S32 filter_generation)
+{
+ return mPassedFolderFilter && mLastFilterGeneration >= getRoot()->getFilter()->getMinRequiredGeneration();
+}
+
// addToFolder() returns TRUE if it succeeds. FALSE otherwise
BOOL LLFolderViewFolder::addToFolder(LLFolderViewFolder* folder, LLFolderView* root)
{
@@ -1143,8 +1152,8 @@ BOOL LLFolderViewFolder::addToFolder(LLFolderViewFolder* folder, LLFolderView* r
return folder->addFolder(this);
}
-// Finds width and height of this object and it's children. Also
-// makes sure that this view and it's children are the right size.
+// Finds width and height of this object and its children. Also
+// makes sure that this view and its children are the right size.
S32 LLFolderViewFolder::arrange( S32* width, S32* height, S32 filter_generation)
{
// sort before laying out contents
@@ -1155,9 +1164,37 @@ S32 LLFolderViewFolder::arrange( S32* width, S32* height, S32 filter_generation)
mNeedsSort = false;
}
- mHasVisibleChildren = hasFilteredDescendants(filter_generation);
+ // evaluate mHasVisibleChildren
+ mHasVisibleChildren = false;
+ if (hasFilteredDescendants(filter_generation))
+ {
+ // We have to verify that there's at least one child that's not filtered out
+ bool found = false;
+ // Try the items first
+ for (items_t::iterator iit = mItems.begin(); iit != mItems.end(); ++iit)
+ {
+ LLFolderViewItem* itemp = (*iit);
+ found = (itemp->getFiltered(filter_generation));
+ if (found)
+ break;
+ }
+ if (!found)
+ {
+ // If no item found, try the folders
+ for (folders_t::iterator fit = mFolders.begin(); fit != mFolders.end(); ++fit)
+ {
+ LLFolderViewFolder* folderp = (*fit);
+ found = ( folderp->getListener()
+ && (folderp->getFiltered(filter_generation)
+ || (folderp->getFilteredFolder(filter_generation)
+ && folderp->hasFilteredDescendants(filter_generation))));
+ if (found)
+ break;
+ }
+ }
- LLInventoryFilter::EFolderShow show_folder_state = getRoot()->getFilter()->getShowFolderState();
+ mHasVisibleChildren = found;
+ }
// calculate height as a single item (without any children), and reshapes rectangle to match
LLFolderViewItem::arrange( width, height, filter_generation );
@@ -1190,8 +1227,10 @@ S32 LLFolderViewFolder::arrange( S32* width, S32* height, S32 filter_generation)
}
else
{
- folderp->setVisible(show_folder_state == LLInventoryFilter::SHOW_ALL_FOLDERS || // always show folders?
- (folderp->getFiltered(filter_generation) || folderp->hasFilteredDescendants(filter_generation))); // passed filter or has descendants that passed filter
+ folderp->setVisible( folderp->getListener()
+ && (folderp->getFiltered(filter_generation)
+ || (folderp->getFilteredFolder(filter_generation)
+ && folderp->hasFilteredDescendants(filter_generation)))); // passed filter or has descendants that passed filter
}
if (folderp->getVisible())
@@ -1308,10 +1347,12 @@ void LLFolderViewFolder::requestSort()
void LLFolderViewFolder::setCompletedFilterGeneration(S32 generation, BOOL recurse_up)
{
- mMostFilteredDescendantGeneration = llmin(mMostFilteredDescendantGeneration, generation);
+ //mMostFilteredDescendantGeneration = llmin(mMostFilteredDescendantGeneration, generation);
mCompletedFilterGeneration = generation;
// only aggregate up if we are a lower (older) value
- if (recurse_up && mParentFolder && generation < mParentFolder->getCompletedFilterGeneration())
+ if (recurse_up
+ && mParentFolder
+ && generation < mParentFolder->getCompletedFilterGeneration())
{
mParentFolder->setCompletedFilterGeneration(generation, TRUE);
}
@@ -1336,21 +1377,20 @@ void LLFolderViewFolder::filter( LLInventoryFilter& filter)
// filter folder itself
if (getLastFilterGeneration() < filter_generation)
{
- if (getLastFilterGeneration() >= must_pass_generation && // folder has been compared to a valid precursor filter
- !mPassedFilter) // and did not pass the filter
+ if (getLastFilterGeneration() >= must_pass_generation // folder has been compared to a valid precursor filter
+ && !mPassedFilter) // and did not pass the filter
{
// go ahead and flag this folder as done
- mLastFilterGeneration = filter_generation;
+ mLastFilterGeneration = filter_generation;
+ mStringMatchOffset = std::string::npos;
}
- else
+ else // filter self only on first pass through
{
- // filter self only on first pass through
+ // filter against folder rules
+ filterFolder(filter);
+ // and then item rules
LLFolderViewItem::filter( filter );
}
- if (mHidden)
- {
- setOpen();
- }
}
if (getRoot()->getDebugFilters())
@@ -1377,7 +1417,10 @@ void LLFolderViewFolder::filter( LLInventoryFilter& filter)
}
// when applying a filter, matching folders get their contents downloaded first
- if (filter.isNotDefault() && getFiltered(filter.getMinRequiredGeneration()) && (mListener && !gInventory.isCategoryComplete(mListener->getUUID())))
+ if (filter.isNotDefault()
+ && getFiltered(filter.getMinRequiredGeneration())
+ && (mListener
+ && !gInventory.isCategoryComplete(mListener->getUUID())))
{
LLInventoryModelBackgroundFetch::instance().start(mListener->getUUID());
}
@@ -1403,6 +1446,7 @@ void LLFolderViewFolder::filter( LLInventoryFilter& filter)
if (folder->getFiltered() || folder->hasFilteredDescendants(filter.getMinRequiredGeneration()))
{
mMostFilteredDescendantGeneration = filter_generation;
+ requestArrange();
}
// just skip it, it has already been filtered
continue;
@@ -1415,6 +1459,7 @@ void LLFolderViewFolder::filter( LLInventoryFilter& filter)
if (folder->getFiltered() || folder->hasFilteredDescendants(filter_generation))
{
mMostFilteredDescendantGeneration = filter_generation;
+ requestArrange();
if (getRoot()->needsAutoSelect() && autoopen_folders)
{
folder->setOpenArrangeRecursively(TRUE);
@@ -1436,6 +1481,7 @@ void LLFolderViewFolder::filter( LLInventoryFilter& filter)
if (item->getFiltered())
{
mMostFilteredDescendantGeneration = filter_generation;
+ requestArrange();
}
continue;
}
@@ -1454,6 +1500,7 @@ void LLFolderViewFolder::filter( LLInventoryFilter& filter)
if (item->getFiltered(filter.getMinRequiredGeneration()))
{
mMostFilteredDescendantGeneration = filter_generation;
+ requestArrange();
}
}
@@ -1467,6 +1514,31 @@ void LLFolderViewFolder::filter( LLInventoryFilter& filter)
}
}
+void LLFolderViewFolder::filterFolder(LLInventoryFilter& filter)
+{
+ const BOOL previous_passed_filter = mPassedFolderFilter;
+ const BOOL passed_filter = filter.checkFolder(this);
+
+ // If our visibility will change as a result of this filter, then
+ // we need to be rearranged in our parent folder
+ if (mParentFolder)
+ {
+ if (getVisible() != passed_filter
+ || previous_passed_filter != passed_filter )
+ {
+ mParentFolder->requestArrange();
+ }
+ }
+
+ setFilteredFolder(passed_filter, filter.getCurrentGeneration());
+ filter.decrementFilterCount();
+
+ if (getRoot()->getDebugFilters())
+ {
+ mStatusText = llformat("%d", mLastFilterGeneration);
+ }
+}
+
void LLFolderViewFolder::setFiltered(BOOL filtered, S32 filter_generation)
{
// if this folder is now filtered, but wasn't before
@@ -1488,24 +1560,26 @@ void LLFolderViewFolder::dirtyFilter()
LLFolderViewItem::dirtyFilter();
}
-BOOL LLFolderViewFolder::hasFilteredDescendants()
-{
- return mMostFilteredDescendantGeneration >= getRoot()->getFilter()->getCurrentGeneration();
+BOOL LLFolderViewFolder::getFiltered()
+{
+ return getFilteredFolder(getRoot()->getFilter()->getMinRequiredGeneration())
+ && LLFolderViewItem::getFiltered();
}
-void LLFolderViewFolder::recursiveIncrementNumDescendantsSelected(S32 increment)
+BOOL LLFolderViewFolder::getFiltered(S32 filter_generation)
{
- LLFolderViewFolder* parent_folder = this;
- do
- {
- parent_folder->mNumDescendantsSelected += increment;
+ return getFilteredFolder(filter_generation) && LLFolderViewItem::getFiltered(filter_generation);
+}
- // Make sure we don't have negative values.
- llassert(parent_folder->mNumDescendantsSelected >= 0);
+BOOL LLFolderViewFolder::hasFilteredDescendants(S32 filter_generation)
+{
+ return mMostFilteredDescendantGeneration >= filter_generation;
+}
- parent_folder = parent_folder->getParentFolder();
- }
- while(parent_folder);
+
+BOOL LLFolderViewFolder::hasFilteredDescendants()
+{
+ return mMostFilteredDescendantGeneration >= getRoot()->getFilter()->getCurrentGeneration();
}
// Passes selection information on to children and record selection
@@ -1520,10 +1594,6 @@ BOOL LLFolderViewFolder::setSelection(LLFolderViewItem* selection, BOOL openitem
{
selectItem();
}
- if (mListener)
- {
- mListener->selectItem();
- }
rv = TRUE;
}
else
@@ -1584,10 +1654,6 @@ BOOL LLFolderViewFolder::changeSelection(LLFolderViewItem* selection, BOOL selec
deselectItem();
}
}
- if (mListener && selected)
- {
- mListener->selectItem();
- }
}
for (folders_t::iterator iter = mFolders.begin();
@@ -1611,119 +1677,261 @@ BOOL LLFolderViewFolder::changeSelection(LLFolderViewItem* selection, BOOL selec
return rv;
}
-void LLFolderViewFolder::extendSelection(LLFolderViewItem* selection, LLFolderViewItem* last_selected, LLDynamicArray<LLFolderViewItem*>& selected_items)
+LLFolderViewFolder* LLFolderViewFolder::getCommonAncestor(LLFolderViewItem* item_a, LLFolderViewItem* item_b, bool& reverse)
{
- // pass on to child folders first
- for (folders_t::iterator iter = mFolders.begin();
- iter != mFolders.end();)
+ if (!item_a->getParentFolder() || !item_b->getParentFolder()) return NULL;
+
+ std::deque<LLFolderViewFolder*> item_a_ancestors;
+
+ LLFolderViewFolder* parent = item_a->getParentFolder();
+ while(parent)
{
- folders_t::iterator fit = iter++;
- (*fit)->extendSelection(selection, last_selected, selected_items);
+ item_a_ancestors.push_back(parent);
+ parent = parent->getParentFolder();
}
- // handle selection of our immediate children...
- BOOL reverse_select = FALSE;
- BOOL found_last_selected = FALSE;
- BOOL found_selection = FALSE;
- LLDynamicArray<LLFolderViewItem*> items_to_select;
- LLFolderViewItem* item;
+ std::deque<LLFolderViewFolder*> item_b_ancestors;
+
+ parent = item_b->getParentFolder();
+ while(parent)
+ {
+ item_b_ancestors.push_back(parent);
+ parent = parent->getParentFolder();
+ }
- //...folders first...
- for (folders_t::iterator iter = mFolders.begin();
- iter != mFolders.end();)
+ LLFolderViewFolder* common_ancestor = item_a->getRoot();
+
+ while(item_a_ancestors.size() > item_b_ancestors.size())
{
- folders_t::iterator fit = iter++;
- item = (*fit);
- if(item == selection)
- {
- found_selection = TRUE;
- }
- else if (item == last_selected)
+ item_a = item_a_ancestors.front();
+ item_a_ancestors.pop_front();
+ }
+
+ while(item_b_ancestors.size() > item_a_ancestors.size())
+ {
+ item_b = item_b_ancestors.front();
+ item_b_ancestors.pop_front();
+ }
+
+ while(item_a_ancestors.size())
+ {
+ common_ancestor = item_a_ancestors.front();
+
+ if (item_a_ancestors.front() == item_b_ancestors.front())
{
- found_last_selected = TRUE;
- if (found_selection)
+ // which came first, sibling a or sibling b?
+ for (folders_t::iterator it = common_ancestor->mFolders.begin(), end_it = common_ancestor->mFolders.end();
+ it != end_it;
+ ++it)
{
- reverse_select = TRUE;
+ LLFolderViewItem* item = *it;
+
+ if (item == item_a)
+ {
+ reverse = false;
+ return common_ancestor;
+ }
+ if (item == item_b)
+ {
+ reverse = true;
+ return common_ancestor;
+ }
}
- }
- if (found_selection || found_last_selected)
- {
- // deselect currently selected items so they can be pushed back on queue
- if (item->isSelected())
+ for (items_t::iterator it = common_ancestor->mItems.begin(), end_it = common_ancestor->mItems.end();
+ it != end_it;
+ ++it)
{
- item->changeSelection(item, FALSE);
+ LLFolderViewItem* item = *it;
+
+ if (item == item_a)
+ {
+ reverse = false;
+ return common_ancestor;
+ }
+ if (item == item_b)
+ {
+ reverse = true;
+ return common_ancestor;
+ }
}
- items_to_select.put(item);
+ break;
}
- if (found_selection && found_last_selected)
- {
- break;
- }
+ item_a = item_a_ancestors.front();
+ item_a_ancestors.pop_front();
+ item_b = item_b_ancestors.front();
+ item_b_ancestors.pop_front();
}
- if (!(found_selection && found_last_selected))
+ return NULL;
+}
+
+void LLFolderViewFolder::gatherChildRangeExclusive(LLFolderViewItem* start, LLFolderViewItem* end, bool reverse, std::vector<LLFolderViewItem*>& items)
+{
+ bool selecting = start == NULL;
+ if (reverse)
{
- //,,,then items
- for (items_t::iterator iter = mItems.begin();
- iter != mItems.end();)
+ for (items_t::reverse_iterator it = mItems.rbegin(), end_it = mItems.rend();
+ it != end_it;
+ ++it)
{
- items_t::iterator iit = iter++;
- item = (*iit);
- if(item == selection)
+ if (*it == end)
{
- found_selection = TRUE;
+ return;
}
- else if (item == last_selected)
+ if (selecting)
{
- found_last_selected = TRUE;
- if (found_selection)
- {
- reverse_select = TRUE;
- }
+ items.push_back(*it);
}
- if (found_selection || found_last_selected)
+ if (*it == start)
{
- // deselect currently selected items so they can be pushed back on queue
- if (item->isSelected())
- {
- item->changeSelection(item, FALSE);
- }
- items_to_select.put(item);
+ selecting = true;
+ }
+ }
+ for (folders_t::reverse_iterator it = mFolders.rbegin(), end_it = mFolders.rend();
+ it != end_it;
+ ++it)
+ {
+ if (*it == end)
+ {
+ return;
}
- if (found_selection && found_last_selected)
+ if (selecting)
{
- break;
+ items.push_back(*it);
+ }
+
+ if (*it == start)
+ {
+ selecting = true;
}
}
}
-
- if (found_last_selected && found_selection)
+ else
{
- // we have a complete selection inside this folder
- for (S32 index = reverse_select ? items_to_select.getLength() - 1 : 0;
- reverse_select ? index >= 0 : index < items_to_select.getLength(); reverse_select ? index-- : index++)
+ for (folders_t::iterator it = mFolders.begin(), end_it = mFolders.end();
+ it != end_it;
+ ++it)
{
- LLFolderViewItem* item = items_to_select[index];
- if (item->changeSelection(item, TRUE))
+ if (*it == end)
+ {
+ return;
+ }
+
+ if (selecting)
+ {
+ items.push_back(*it);
+ }
+
+ if (*it == start)
{
- selected_items.put(item);
+ selecting = true;
}
}
+ for (items_t::iterator it = mItems.begin(), end_it = mItems.end();
+ it != end_it;
+ ++it)
+ {
+ if (*it == end)
+ {
+ return;
+ }
+
+ if (selecting)
+ {
+ items.push_back(*it);
+ }
+
+ if (*it == start)
+ {
+ selecting = true;
+ }
+ }
+ }
+}
+
+void LLFolderViewFolder::extendSelectionTo(LLFolderViewItem* new_selection)
+{
+ if (getRoot()->getAllowMultiSelect() == FALSE) return;
+
+ LLFolderViewItem* cur_selected_item = getRoot()->getCurSelectedItem();
+ if (cur_selected_item == NULL)
+ {
+ cur_selected_item = new_selection;
}
- else if (found_selection)
+
+
+ bool reverse = false;
+ LLFolderViewFolder* common_ancestor = getCommonAncestor(cur_selected_item, new_selection, reverse);
+ if (!common_ancestor) return;
+
+ LLFolderViewItem* last_selected_item_from_cur = cur_selected_item;
+ LLFolderViewFolder* cur_folder = cur_selected_item->getParentFolder();
+
+ std::vector<LLFolderViewItem*> items_to_select_forward;
+
+ while(cur_folder != common_ancestor)
{
- // last selection was not in this folder....go ahead and select just the new item
- if (selection->changeSelection(selection, TRUE))
+ cur_folder->gatherChildRangeExclusive(last_selected_item_from_cur, NULL, reverse, items_to_select_forward);
+
+ last_selected_item_from_cur = cur_folder;
+ cur_folder = cur_folder->getParentFolder();
+ }
+
+ std::vector<LLFolderViewItem*> items_to_select_reverse;
+
+ LLFolderViewItem* last_selected_item_from_new = new_selection;
+ cur_folder = new_selection->getParentFolder();
+ while(cur_folder != common_ancestor)
+ {
+ cur_folder->gatherChildRangeExclusive(last_selected_item_from_new, NULL, !reverse, items_to_select_reverse);
+
+ last_selected_item_from_new = cur_folder;
+ cur_folder = cur_folder->getParentFolder();
+ }
+
+ common_ancestor->gatherChildRangeExclusive(last_selected_item_from_cur, last_selected_item_from_new, reverse, items_to_select_forward);
+
+ for (std::vector<LLFolderViewItem*>::reverse_iterator it = items_to_select_reverse.rbegin(), end_it = items_to_select_reverse.rend();
+ it != end_it;
+ ++it)
+ {
+ items_to_select_forward.push_back(*it);
+ }
+
+ LLFolderView* root = getRoot();
+
+ for (std::vector<LLFolderViewItem*>::iterator it = items_to_select_forward.begin(), end_it = items_to_select_forward.end();
+ it != end_it;
+ ++it)
+ {
+ LLFolderViewItem* item = *it;
+ if (item->isSelected())
{
- selected_items.put(selection);
+ root->removeFromSelectionList(item);
}
+ else
+ {
+ item->selectItem();
+ }
+ root->addToSelectionList(item);
}
+
+ if (new_selection->isSelected())
+ {
+ root->removeFromSelectionList(new_selection);
+ }
+ else
+ {
+ new_selection->selectItem();
+ }
+ root->addToSelectionList(new_selection);
}
+
void LLFolderViewFolder::destroyView()
{
for (items_t::iterator iter = mItems.begin();
@@ -1743,7 +1951,7 @@ void LLFolderViewFolder::destroyView()
folderp->destroyView(); // removes entry from mFolders
}
- deleteAllChildren();
+ //deleteAllChildren();
if (mParentFolder)
{
@@ -1795,19 +2003,11 @@ void LLFolderViewFolder::extractItem( LLFolderViewItem* item )
ft = std::find(mFolders.begin(), mFolders.end(), f);
if (ft != mFolders.end())
{
- if ((*ft)->numSelected())
- {
- recursiveIncrementNumDescendantsSelected(-(*ft)->numSelected());
- }
mFolders.erase(ft);
}
}
else
{
- if ((*it)->isSelected())
- {
- recursiveIncrementNumDescendantsSelected(-1);
- }
mItems.erase(it);
}
//item has been removed, need to update filter
@@ -1835,7 +2035,7 @@ void LLFolderViewFolder::sortBy(U32 order)
return;
}
- // Propegate this change to sub folders
+ // Propagate this change to sub folders
for (folders_t::iterator iter = mFolders.begin();
iter != mFolders.end();)
{
@@ -1843,8 +2043,12 @@ void LLFolderViewFolder::sortBy(U32 order)
(*fit)->sortBy(order);
}
- mFolders.sort(mSortFunction);
- mItems.sort(mSortFunction);
+ // Don't sort the topmost folders (My Inventory and Library)
+ if (mListener->getUUID().notNull())
+ {
+ mFolders.sort(mSortFunction);
+ mItems.sort(mSortFunction);
+ }
if (order & LLInventoryFilter::SO_DATE)
{
@@ -1971,16 +2175,46 @@ BOOL LLFolderViewFolder::isRemovable()
BOOL LLFolderViewFolder::addItem(LLFolderViewItem* item)
{
mItems.push_back(item);
- if (item->isSelected())
- {
- recursiveIncrementNumDescendantsSelected(1);
- }
+
item->setRect(LLRect(0, 0, getRect().getWidth(), 0));
item->setVisible(FALSE);
- addChild( item );
+
+ addChild(item);
+
item->dirtyFilter();
+
+ // Update the folder creation date if the folder has no creation date
+ bool setting_date = false;
+ const time_t item_creation_date = item->getCreationDate();
+ if ((item_creation_date > 0) && (mCreationDate == 0))
+ {
+ setCreationDate(item_creation_date);
+ setting_date = true;
+ }
+
+ // Handle sorting
requestArrange();
requestSort();
+
+ // Traverse parent folders and update creation date and resort, if necessary
+ LLFolderViewFolder* parentp = getParentFolder();
+ while (parentp)
+ {
+ // Update the parent folder creation date
+ if (setting_date && (parentp->mCreationDate == 0))
+ {
+ parentp->setCreationDate(item_creation_date);
+ }
+
+ if (parentp->mSortFunction.isByDate())
+ {
+ // parent folder doesn't have a time stamp yet, so get it from us
+ parentp->requestSort();
+ }
+
+ parentp = parentp->getParentFolder();
+ }
+
return TRUE;
}
@@ -1988,10 +2222,6 @@ BOOL LLFolderViewFolder::addItem(LLFolderViewItem* item)
BOOL LLFolderViewFolder::addFolder(LLFolderViewFolder* folder)
{
mFolders.push_back(folder);
- if (folder->numSelected())
- {
- recursiveIncrementNumDescendantsSelected(folder->numSelected());
- }
folder->setOrigin(0, 0);
folder->reshape(getRect().getWidth(), 0);
folder->setVisible(FALSE);
@@ -2000,6 +2230,13 @@ BOOL LLFolderViewFolder::addFolder(LLFolderViewFolder* folder)
// rearrange all descendants too, as our indentation level might have changed
folder->requestArrange(TRUE);
requestSort();
+ LLFolderViewFolder* parentp = getParentFolder();
+ while (parentp && !parentp->mSortFunction.isByDate())
+ {
+ // parent folder doesn't have a time stamp yet, so get it from us
+ parentp->requestSort();
+ parentp = parentp->getParentFolder();
+ }
return TRUE;
}
@@ -2059,7 +2296,9 @@ void LLFolderViewFolder::setOpenArrangeRecursively(BOOL openitem, ERecurseType r
(*fit)->setOpenArrangeRecursively(openitem, RECURSE_DOWN); /* Flawfinder: ignore */
}
}
- if (mParentFolder && (recurse == RECURSE_UP || recurse == RECURSE_UP_DOWN))
+ if (mParentFolder
+ && (recurse == RECURSE_UP
+ || recurse == RECURSE_UP_DOWN))
{
mParentFolder->setOpenArrangeRecursively(openitem, RECURSE_UP);
}
@@ -2077,7 +2316,7 @@ BOOL LLFolderViewFolder::handleDragAndDropFromChild(MASK mask,
EAcceptance* accept,
std::string& tooltip_msg)
{
- BOOL accepted = mListener && mListener->dragOrDrop(mask,drop,c_type,cargo_data);
+ BOOL accepted = mListener && mListener->dragOrDrop(mask,drop,c_type,cargo_data, tooltip_msg);
if (accepted)
{
mDragAndDropTarget = TRUE;
@@ -2158,33 +2397,16 @@ BOOL LLFolderViewFolder::handleDragAndDrop(S32 x, S32 y, MASK mask,
EAcceptance* accept,
std::string& tooltip_msg)
{
- LLFolderView* root_view = getRoot();
-
BOOL handled = FALSE;
- if(mIsOpen)
+
+ if (mIsOpen)
{
- handled = childrenHandleDragAndDrop(x, y, mask, drop, cargo_type,
- cargo_data, accept, tooltip_msg) != NULL;
+ handled = (childrenHandleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg) != NULL);
}
if (!handled)
{
- BOOL accepted = mListener && mListener->dragOrDrop(mask, drop,cargo_type,cargo_data);
-
- if (accepted)
- {
- mDragAndDropTarget = TRUE;
- *accept = ACCEPT_YES_MULTI;
- }
- else
- {
- *accept = ACCEPT_NO;
- }
-
- if (!drop && accepted)
- {
- root_view->autoOpenTest(this);
- }
+ handleDragAndDropToThisFolder(mask, drop, cargo_type, cargo_data, accept, tooltip_msg);
lldebugst(LLERR_USER_INPUT) << "dragAndDrop handled by LLFolderViewFolder" << llendl;
}
@@ -2192,6 +2414,33 @@ BOOL LLFolderViewFolder::handleDragAndDrop(S32 x, S32 y, MASK mask,
return TRUE;
}
+BOOL LLFolderViewFolder::handleDragAndDropToThisFolder(MASK mask,
+ BOOL drop,
+ EDragAndDropType cargo_type,
+ void* cargo_data,
+ EAcceptance* accept,
+ std::string& tooltip_msg)
+{
+ BOOL accepted = mListener && mListener->dragOrDrop(mask, drop, cargo_type, cargo_data, tooltip_msg);
+
+ if (accepted)
+ {
+ mDragAndDropTarget = TRUE;
+ *accept = ACCEPT_YES_MULTI;
+ }
+ else
+ {
+ *accept = ACCEPT_NO;
+ }
+
+ if (!drop && accepted)
+ {
+ getRoot()->autoOpenTest(this);
+ }
+
+ return TRUE;
+}
+
BOOL LLFolderViewFolder::handleRightMouseDown( S32 x, S32 y, MASK mask )
{
@@ -2214,6 +2463,8 @@ BOOL LLFolderViewFolder::handleRightMouseDown( S32 x, S32 y, MASK mask )
BOOL LLFolderViewFolder::handleHover(S32 x, S32 y, MASK mask)
{
+ mIsMouseOverTitle = (y > (getRect().getHeight() - mItemHeight));
+
BOOL handled = LLView::handleHover(x, y, mask);
if (!handled)
@@ -2301,13 +2552,16 @@ void LLFolderViewFolder::draw()
bool possibly_has_children = false;
bool up_to_date = mListener && mListener->isUpToDate();
- if(!up_to_date && mListener && mListener->hasChildren()) // we know we have children but haven't fetched them (doesn't obey filter)
+ if(!up_to_date
+ && mListener->hasChildren()) // we know we have children but haven't fetched them (doesn't obey filter)
{
possibly_has_children = true;
}
- BOOL loading = ( mIsOpen && possibly_has_children && !up_to_date );
+ BOOL loading = (mIsOpen
+ && possibly_has_children
+ && !up_to_date );
if ( loading && !mIsLoading )
{
@@ -2573,7 +2827,8 @@ bool LLInventorySort::operator()(const LLFolderViewItem* const& a, const LLFolde
{
// ignore sort order for landmarks in the Favorites folder.
// they should be always sorted as in Favorites bar. See EXT-719
- if (a->getSortGroup() == SG_ITEM && b->getSortGroup() == SG_ITEM
+ if (a->getSortGroup() == SG_ITEM
+ && b->getSortGroup() == SG_ITEM
&& a->getListener()->getInventoryType() == LLInventoryType::IT_LANDMARK
&& b->getListener()->getInventoryType() == LLInventoryType::IT_LANDMARK)
{
diff --git a/indra/newview/llfolderviewitem.h b/indra/newview/llfolderviewitem.h
index 2006e094a8..3c7592046a 100644
--- a/indra/newview/llfolderviewitem.h
+++ b/indra/newview/llfolderviewitem.h
@@ -28,6 +28,7 @@
#include "llview.h"
#include "lldarray.h" // *TODO: Eliminate, forward declare
+#include "lluiimage.h"
class LLFontGL;
class LLFolderView;
@@ -65,6 +66,7 @@ public:
// Returns true if order has changed
bool updateSort(U32 order);
U32 getSort() { return mSortOrder; }
+ bool isByDate() { return mByDate; }
bool operator()(const LLFolderViewItem* const& a, const LLFolderViewItem* const& b);
private:
@@ -93,7 +95,7 @@ public:
Optional<LLUIImage*> icon_open; // used for folders
Optional<LLUIImage*> icon_overlay; // for links
Optional<LLFolderView*> root;
- Optional<LLFolderViewEventListener*> listener;
+ Mandatory<LLFolderViewEventListener*> listener;
Optional<LLUIImage*> folder_arrow_image;
Optional<S32> folder_indentation; // pixels
@@ -112,6 +114,7 @@ public:
static const S32 ICON_PAD = 2;
static const S32 ICON_WIDTH = 16;
static const S32 TEXT_PAD = 1;
+ static const S32 TEXT_PAD_RIGHT = 4;
static const S32 ARROW_SIZE = 12;
static const S32 MAX_FOLDER_ITEM_OVERLAP = 2;
// animation parameters
@@ -120,6 +123,8 @@ public:
// Mostly for debugging printout purposes.
const std::string& getSearchableLabel() { return mSearchableLabel; }
+
+ BOOL isLoading() const { return mIsLoading; }
private:
BOOL mIsSelected;
@@ -156,23 +161,24 @@ protected:
BOOL mDragAndDropTarget;
BOOL mIsLoading;
LLTimer mTimeSinceRequestStart;
- bool mHidden;
bool mShowLoadStatus;
+ bool mIsMouseOverTitle;
// helper function to change the selection from the root.
void changeSelectionFromRoot(LLFolderViewItem* selection, BOOL selected);
- // helper function to change the selection from the root.
- void extendSelectionFromRoot(LLFolderViewItem* selection);
-
// this is an internal method used for adding items to folders. A
- // no-op at this leve, but reimplemented in derived classes.
+ // no-op at this level, but reimplemented in derived classes.
virtual BOOL addItem(LLFolderViewItem*) { return FALSE; }
virtual BOOL addFolder(LLFolderViewFolder*) { return FALSE; }
static LLFontGL* getLabelFontForStyle(U8 style);
+ virtual void setCreationDate(time_t creation_date_utc) { mCreationDate = creation_date_utc; }
+
public:
+ BOOL postBuild();
+
// This function clears the currently selected item, and records
// the specified selected item appropriately for display and use
// in the UI. If open is TRUE, then folders are opened up along
@@ -201,11 +207,6 @@ public:
virtual S32 arrange( S32* width, S32* height, S32 filter_generation );
virtual S32 getItemHeight();
- // Hide the folder from the UI, such as if you want to hide the root
- // folder in an inventory panel.
- void setHidden(bool hidden) { mHidden = hidden; }
- bool getHidden() const { return mHidden; }
-
// applies filters to control visibility of inventory items
virtual void filter( LLInventoryFilter& filter);
@@ -223,14 +224,11 @@ public:
// Returns TRUE if the selection state of this item was changed.
virtual BOOL changeSelection(LLFolderViewItem* selection, BOOL selected);
- // this method is used to group select items
- virtual void extendSelection(LLFolderViewItem* selection, LLFolderViewItem* last_selected, LLDynamicArray<LLFolderViewItem*>& items) { }
-
// this method is used to deselect this element
void deselectItem();
// this method is used to select this element
- void selectItem();
+ virtual void selectItem();
// gets multiple-element selection
virtual std::set<LLUUID> getSelectionList() const;
@@ -266,7 +264,7 @@ public:
// This method returns the actual name of the thing being
// viewed. This method will ask the viewed object itself.
- std::string getName( void ) const;
+ const std::string& getName( void ) const;
const std::string& getSearchableLabel( void ) const;
@@ -306,7 +304,8 @@ public:
BOOL isDescendantOf( const LLFolderViewFolder* potential_ancestor );
S32 getIndentation() { return mIndentation; }
- virtual BOOL potentiallyVisible(); // do we know for a fact that this item has been filtered out?
+ virtual BOOL potentiallyVisible(); // do we know for a fact that this item won't be displayed?
+ virtual BOOL potentiallyFiltered(); // do we know for a fact that this item has been filtered out?
virtual BOOL getFiltered();
virtual BOOL getFiltered(S32 filter_generation);
@@ -328,6 +327,10 @@ public:
virtual BOOL handleMouseUp( S32 x, S32 y, MASK mask );
virtual BOOL handleDoubleClick( S32 x, S32 y, MASK mask );
+ virtual void onMouseLeave(S32 x, S32 y, MASK mask);
+
+ virtual LLView* findChildView(const std::string& name, BOOL recurse) const { return NULL; }
+
// virtual void handleDropped();
virtual void draw();
virtual BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
@@ -365,16 +368,10 @@ public:
UNKNOWN, TRASH, NOT_TRASH
} ETrash;
-private:
- S32 mNumDescendantsSelected;
-
-public: // Accessed needed by LLFolderViewItem
- void recursiveIncrementNumDescendantsSelected(S32 increment);
- S32 numSelected(void) const { return mNumDescendantsSelected + (isSelected() ? 1 : 0); }
-
-protected:
typedef std::list<LLFolderViewItem*> items_t;
typedef std::list<LLFolderViewFolder*> folders_t;
+
+protected:
items_t mItems;
folders_t mFolders;
LLInventorySort mSortFunction;
@@ -391,6 +388,8 @@ protected:
S32 mCompletedFilterGeneration;
S32 mMostFilteredDescendantGeneration;
bool mNeedsSort;
+ bool mPassedFolderFilter;
+
public:
typedef enum e_recurse_type
{
@@ -424,13 +423,21 @@ public:
virtual void setCompletedFilterGeneration(S32 generation, BOOL recurse_up);
virtual S32 getCompletedFilterGeneration() { return mCompletedFilterGeneration; }
- BOOL hasFilteredDescendants(S32 filter_generation) { return mMostFilteredDescendantGeneration >= filter_generation; }
+ BOOL hasFilteredDescendants(S32 filter_generation);
BOOL hasFilteredDescendants();
// applies filters to control visibility of inventory items
virtual void filter( LLInventoryFilter& filter);
virtual void setFiltered(BOOL filtered, S32 filter_generation);
+ virtual BOOL getFiltered();
+ virtual BOOL getFiltered(S32 filter_generation);
+
virtual void dirtyFilter();
+
+ // folder-specific filtering (filter status propagates top down instead of bottom up)
+ void filterFolder(LLInventoryFilter& filter);
+ void setFilteredFolder(bool filtered, S32 filter_generation);
+ bool getFilteredFolder(S32 filter_generation);
// Passes selection information on to children and record
// selection information if necessary.
@@ -445,7 +452,7 @@ public:
virtual BOOL changeSelection(LLFolderViewItem* selection, BOOL selected);
// this method is used to group select items
- virtual void extendSelection(LLFolderViewItem* selection, LLFolderViewItem* last_selected, LLDynamicArray<LLFolderViewItem*>& items);
+ void extendSelectionTo(LLFolderViewItem* selection);
// Returns true is this object and all of its children can be removed.
virtual BOOL isRemovable();
@@ -531,11 +538,25 @@ public:
void* cargo_data,
EAcceptance* accept,
std::string& tooltip_msg);
+ BOOL handleDragAndDropToThisFolder(MASK mask, BOOL drop,
+ EDragAndDropType cargo_type,
+ void* cargo_data,
+ EAcceptance* accept,
+ std::string& tooltip_msg);
virtual void draw();
time_t getCreationDate() const;
bool isTrash() const;
- S32 getNumSelectedDescendants(void) const { return mNumDescendantsSelected; }
+
+ folders_t::const_iterator getFoldersBegin() const { return mFolders.begin(); }
+ folders_t::const_iterator getFoldersEnd() const { return mFolders.end(); }
+ folders_t::size_type getFoldersCount() const { return mFolders.size(); }
+
+ items_t::const_iterator getItemsBegin() const { return mItems.begin(); }
+ items_t::const_iterator getItemsEnd() const { return mItems.end(); }
+ items_t::size_type getItemsCount() const { return mItems.size(); }
+ LLFolderViewFolder* getCommonAncestor(LLFolderViewItem* item_a, LLFolderViewItem* item_b, bool& reverse);
+ void gatherChildRangeExclusive(LLFolderViewItem* start, LLFolderViewItem* end, bool reverse, std::vector<LLFolderViewItem*>& items);
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/indra/newview/llfriendcard.cpp b/indra/newview/llfriendcard.cpp
index e9f1e3bc22..11401d6c68 100644
--- a/indra/newview/llfriendcard.cpp
+++ b/indra/newview/llfriendcard.cpp
@@ -28,6 +28,7 @@
#include "llfriendcard.h"
+#include "llagent.h"
#include "llavatarnamecache.h"
#include "llinventory.h"
#include "llinventoryfunctions.h"
@@ -95,6 +96,36 @@ const LLUUID& get_folder_uuid(const LLUUID& parentFolderUUID, LLInventoryCollect
}
/**
+ * Class LLFindAgentCallingCard
+ *
+ * An inventory collector functor for checking that agent's own calling card
+ * exists within the Calling Cards category and its sub-folders.
+ */
+class LLFindAgentCallingCard : public LLInventoryCollectFunctor
+{
+public:
+ LLFindAgentCallingCard() : mIsAgentCallingCardFound(false) {}
+ virtual ~LLFindAgentCallingCard() {}
+ virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item);
+ bool isAgentCallingCardFound() { return mIsAgentCallingCardFound; }
+
+private:
+ bool mIsAgentCallingCardFound;
+};
+
+bool LLFindAgentCallingCard::operator()(LLInventoryCategory* cat, LLInventoryItem* item)
+{
+ if (mIsAgentCallingCardFound) return true;
+
+ if (item && item->getType() == LLAssetType::AT_CALLINGCARD && item->getCreatorUUID() == gAgentID)
+ {
+ mIsAgentCallingCardFound = true;
+ }
+
+ return mIsAgentCallingCardFound;
+}
+
+/**
* Class for fetching initial friend cards data
*
* Implemented to fix an issue when Inventory folders are in incomplete state.
@@ -290,58 +321,6 @@ void LLFriendCardsManager::syncFriendCardsFolders()
boost::bind(&LLFriendCardsManager::ensureFriendsFolderExists, this));
}
-void LLFriendCardsManager::collectFriendsLists(folderid_buddies_map_t& folderBuddiesMap) const
-{
- folderBuddiesMap.clear();
-
- static bool syncronize_friends_folders = true;
- if (syncronize_friends_folders)
- {
- // Checks whether "Friends" and "Friends/All" folders exist in "Calling Cards" folder,
- // fetches their contents if needed and synchronizes it with buddies list.
- // If the folders are not found they are created.
- LLFriendCardsManager::instance().syncFriendCardsFolders();
- syncronize_friends_folders = false;
- }
-
-
- LLInventoryModel::cat_array_t* listFolders;
- LLInventoryModel::item_array_t* items;
-
- // get folders in the Friend folder. Items should be NULL due to Cards should be in lists.
- gInventory.getDirectDescendentsOf(findFriendFolderUUIDImpl(), listFolders, items);
-
- if (NULL == listFolders)
- return;
-
- LLInventoryModel::cat_array_t::const_iterator itCats; // to iterate Friend Lists (categories)
- LLInventoryModel::item_array_t::const_iterator itBuddy; // to iterate Buddies in each List
- LLInventoryModel::cat_array_t* fakeCatsArg;
- for (itCats = listFolders->begin(); itCats != listFolders->end(); ++itCats)
- {
- if (items)
- items->clear();
-
- // *HACK: Only Friends/All content will be shown for now
- // *TODO: Remove this hack, implement sorting if it will be needded by spec.
- if ((*itCats)->getUUID() != findFriendAllSubfolderUUIDImpl())
- continue;
-
- gInventory.getDirectDescendentsOf((*itCats)->getUUID(), fakeCatsArg, items);
-
- if (NULL == items)
- continue;
-
- uuid_vec_t buddyUUIDs;
- for (itBuddy = items->begin(); itBuddy != items->end(); ++itBuddy)
- {
- buddyUUIDs.push_back((*itBuddy)->getCreatorUUID());
- }
-
- folderBuddiesMap.insert(make_pair((*itCats)->getUUID(), buddyUUIDs));
- }
-}
-
/************************************************************************/
/* Private Methods */
@@ -499,21 +478,31 @@ void LLFriendCardsManager::syncFriendsFolder()
LLAvatarTracker::buddy_map_t all_buddies;
LLAvatarTracker::instance().copyBuddyList(all_buddies);
- // 1. Remove Friend Cards for non-friends
+ // 1. Check if own calling card exists
+ const LLUUID calling_cards_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD);
+
LLInventoryModel::cat_array_t cats;
LLInventoryModel::item_array_t items;
+ LLFindAgentCallingCard collector;
+ gInventory.collectDescendentsIf(calling_cards_folder_id, cats, items, LLInventoryModel::EXCLUDE_TRASH, collector);
- gInventory.collectDescendents(findFriendAllSubfolderUUIDImpl(), cats, items, LLInventoryModel::EXCLUDE_TRASH);
-
- LLInventoryModel::item_array_t::const_iterator it;
- for (it = items.begin(); it != items.end(); ++it)
+ // Create own calling card if it was not found in Friends/All folder
+ if (!collector.isAgentCallingCardFound())
{
- lldebugs << "Check if buddy is in list: " << (*it)->getName() << " " << (*it)->getCreatorUUID() << llendl;
- if (NULL == get_ptr_in_map(all_buddies, (*it)->getCreatorUUID()))
- {
- lldebugs << "NONEXISTS, so remove it" << llendl;
- removeFriendCardFromInventory((*it)->getCreatorUUID());
- }
+ LLAvatarName av_name;
+ LLAvatarNameCache::get( gAgentID, &av_name );
+
+ create_inventory_item(gAgentID,
+ gAgent.getSessionID(),
+ calling_cards_folder_id,
+ LLTransactionID::tnull,
+ av_name.getCompleteName(),
+ gAgentID.asString(),
+ LLAssetType::AT_CALLINGCARD,
+ LLInventoryType::IT_CALLINGCARD,
+ NOT_WEARABLE,
+ PERM_MOVE | PERM_TRANSFER,
+ NULL);
}
// 2. Add missing Friend Cards for friends
diff --git a/indra/newview/llfriendcard.h b/indra/newview/llfriendcard.h
index b7f0bada14..48a9f70079 100644
--- a/indra/newview/llfriendcard.h
+++ b/indra/newview/llfriendcard.h
@@ -79,19 +79,6 @@ public:
*/
void syncFriendCardsFolders();
- /*!
- * \brief
- * Collects folders' IDs with the buddies' IDs in the Inventory Calling Card/Friends folder.
- *
- * \param folderBuddiesMap
- * map into collected data will be put. It will be cleared before adding new data.
- *
- * Each item in the out map is a pair where first is an LLViewerInventoryCategory UUID,
- * second is a vector with UUID of Avatars from this folder.
- *
- */
- void collectFriendsLists(folderid_buddies_map_t& folderBuddiesMap) const;
-
private:
typedef boost::function<void()> callback_t;
diff --git a/indra/newview/llgesturelistener.cpp b/indra/newview/llgesturelistener.cpp
new file mode 100644
index 0000000000..2fff506681
--- /dev/null
+++ b/indra/newview/llgesturelistener.cpp
@@ -0,0 +1,159 @@
+/**
+ * @file llgesturelistener.cpp
+ * @author Dave Simmons
+ * @date 2011-03-28
+ * @brief Implementation for LLGestureListener.
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llgesturelistener.h"
+#include "llgesturemgr.h"
+#include "llmultigesture.h"
+
+
+LLGestureListener::LLGestureListener()
+ : LLEventAPI("LLGesture",
+ "LLGesture listener interface to control gestures")
+{
+ add("getActiveGestures",
+ "Return information about the agent's available gestures [\"reply\"]:\n"
+ "[\"gestures\"]: a dictionary with UUID strings as keys\n"
+ " and the following dict values for each entry:\n"
+ " [\"name\"]: name of the gesture, may be empty\n"
+ " [\"trigger\"]: trigger string used to invoke via user chat, may be empty\n"
+ " [\"playing\"]: true or false indicating the playing state",
+ &LLGestureListener::getActiveGestures,
+ LLSDMap("reply", LLSD()));
+ add("isGesturePlaying",
+ "[\"id\"]: UUID of the gesture to query. Returns True or False in [\"playing\"] value of the result",
+ &LLGestureListener::isGesturePlaying);
+ add("startGesture",
+ "[\"id\"]: UUID of the gesture to start playing",
+ &LLGestureListener::startGesture);
+ add("stopGesture",
+ "[\"id\"]: UUID of the gesture to stop",
+ &LLGestureListener::stopGesture);
+}
+
+
+// "getActiveGestures" command
+void LLGestureListener::getActiveGestures(const LLSD& event_data) const
+{
+ LLSD reply = LLSD::emptyMap();
+ LLSD gesture_map = LLSD::emptyMap();
+
+ const LLGestureMgr::item_map_t& active_gestures = LLGestureMgr::instance().getActiveGestures();
+
+ // Scan active gesture map and get all the names
+ LLGestureMgr::item_map_t::const_iterator it;
+ for (it = active_gestures.begin(); it != active_gestures.end(); ++it)
+ {
+ LLMultiGesture* gesture = (*it).second;
+ if (gesture)
+ { // Add an entry to the result map with the LLUUID as key with a map containing data
+ LLSD info = LLSD::emptyMap();
+ info["name"] = (LLSD::String) gesture->mName;
+ info["trigger"] = (LLSD::String) gesture->mTrigger;
+ info["playing"] = (LLSD::Boolean) gesture->mPlaying;
+
+ gesture_map[(*it).first.asString()] = info;
+ }
+ }
+
+ reply["gestures"] = gesture_map;
+ sendReply(reply, event_data);
+}
+
+
+
+// "isGesturePlaying" command
+void LLGestureListener::isGesturePlaying(const LLSD& event_data) const
+{
+ bool is_playing = false;
+ if (event_data.has("id"))
+ {
+ LLUUID gesture_id = event_data["id"].asUUID();
+ if (gesture_id.notNull())
+ {
+ is_playing = LLGestureMgr::instance().isGesturePlaying(gesture_id);
+ }
+ else
+ {
+ llwarns << "isGesturePlaying did not find a gesture object for " << gesture_id << llendl;
+ }
+ }
+ else
+ {
+ llwarns << "isGesturePlaying didn't have 'id' value passed in" << llendl;
+ }
+
+ LLSD reply = LLSD::emptyMap();
+ reply["playing"] = (LLSD::Boolean) is_playing;
+ sendReply(reply, event_data);
+}
+
+
+// "startGesture" command
+void LLGestureListener::startGesture(LLSD const & event_data) const
+{
+ startOrStopGesture(event_data, true);
+}
+
+
+// "stopGesture" command
+void LLGestureListener::stopGesture(LLSD const & event_data) const
+{
+ startOrStopGesture(event_data, false);
+}
+
+
+// Real code for "startGesture" or "stopGesture"
+void LLGestureListener::startOrStopGesture(LLSD const & event_data, bool start) const
+{
+ if (event_data.has("id"))
+ {
+ LLUUID gesture_id = event_data["id"].asUUID();
+ if (gesture_id.notNull())
+ {
+ if (start)
+ {
+ LLGestureMgr::instance().playGesture(gesture_id);
+ }
+ else
+ {
+ LLGestureMgr::instance().stopGesture(gesture_id);
+ }
+ }
+ else
+ {
+ llwarns << "startOrStopGesture did not find a gesture object for " << gesture_id << llendl;
+ }
+ }
+ else
+ {
+ llwarns << "startOrStopGesture didn't have 'id' value passed in" << llendl;
+ }
+}
+
diff --git a/indra/newview/llgesturelistener.h b/indra/newview/llgesturelistener.h
new file mode 100644
index 0000000000..6f59698ed1
--- /dev/null
+++ b/indra/newview/llgesturelistener.h
@@ -0,0 +1,52 @@
+/**
+ * @file llgesturelistener.h
+ * @author Dave Simmons
+ * @date 2011-03-15
+ * @brief Class definition for LLGestureListener.
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+
+#ifndef LL_LLGESTURELISTENER_H
+#define LL_LLGESTURELISTENER_H
+
+#include "lleventapi.h"
+
+class LLSD;
+
+class LLGestureListener : public LLEventAPI
+{
+public:
+ LLGestureListener();
+
+private:
+ void getActiveGestures(LLSD const & gesture_data) const;
+ void isGesturePlaying(LLSD const & gesture_data) const;
+ void startGesture(LLSD const & gesture_data) const;
+ void stopGesture(LLSD const & gesture_data) const;
+
+ void startOrStopGesture(LLSD const & event_data, bool start) const;
+};
+
+#endif // LL_LLGESTURELISTENER_H
+
diff --git a/indra/newview/llgesturemgr.cpp b/indra/newview/llgesturemgr.cpp
index f658287fb1..66ca76bfb0 100644
--- a/indra/newview/llgesturemgr.cpp
+++ b/indra/newview/llgesturemgr.cpp
@@ -33,8 +33,10 @@
#include <algorithm>
// library
+#include "llaudioengine.h"
#include "lldatapacker.h"
#include "llinventory.h"
+#include "llkeyframemotion.h"
#include "llmultigesture.h"
#include "llnotificationsutil.h"
#include "llstl.h"
@@ -51,6 +53,7 @@
#include "llviewerstats.h"
#include "llnearbychatbar.h"
#include "llappearancemgr.h"
+#include "llgesturelistener.h"
// Longest time, in seconds, to wait for all animations to stop playing
const F32 MAX_WAIT_ANIM_SECS = 30.f;
@@ -68,6 +71,7 @@ LLGestureMgr::LLGestureMgr()
mLoadingCount(0)
{
gInventory.addObserver(this);
+ mListener.reset(new LLGestureListener());
}
@@ -526,6 +530,66 @@ void LLGestureMgr::playGesture(LLMultiGesture* gesture)
gesture->mPlaying = TRUE;
mPlaying.push_back(gesture);
+ // Load all needed assets to minimize the delays
+ // when gesture is playing.
+ for (std::vector<LLGestureStep*>::iterator steps_it = gesture->mSteps.begin();
+ steps_it != gesture->mSteps.end();
+ ++steps_it)
+ {
+ LLGestureStep* step = *steps_it;
+ switch(step->getType())
+ {
+ case STEP_ANIMATION:
+ {
+ LLGestureStepAnimation* anim_step = (LLGestureStepAnimation*)step;
+ const LLUUID& anim_id = anim_step->mAnimAssetID;
+
+ // Don't request the animation if this step stops it or if it is already in Static VFS
+ if (!(anim_id.isNull()
+ || anim_step->mFlags & ANIM_FLAG_STOP
+ || gAssetStorage->hasLocalAsset(anim_id, LLAssetType::AT_ANIMATION)))
+ {
+ mLoadingAssets.insert(anim_id);
+
+ LLUUID* id = new LLUUID(gAgentID);
+ gAssetStorage->getAssetData(anim_id,
+ LLAssetType::AT_ANIMATION,
+ onAssetLoadComplete,
+ (void *)id,
+ TRUE);
+ }
+ break;
+ }
+ case STEP_SOUND:
+ {
+ LLGestureStepSound* sound_step = (LLGestureStepSound*)step;
+ const LLUUID& sound_id = sound_step->mSoundAssetID;
+ if (!(sound_id.isNull()
+ || gAssetStorage->hasLocalAsset(sound_id, LLAssetType::AT_SOUND)))
+ {
+ mLoadingAssets.insert(sound_id);
+
+ gAssetStorage->getAssetData(sound_id,
+ LLAssetType::AT_SOUND,
+ onAssetLoadComplete,
+ NULL,
+ TRUE);
+ }
+ break;
+ }
+ case STEP_CHAT:
+ case STEP_WAIT:
+ case STEP_EOF:
+ {
+ break;
+ }
+ default:
+ {
+ llwarns << "Unknown gesture step type: " << step->getType() << llendl;
+ }
+ }
+ }
+
// And get it going
stepGesture(gesture);
@@ -741,7 +805,7 @@ void LLGestureMgr::stepGesture(LLMultiGesture* gesture)
{
return;
}
- if (!isAgentAvatarValid()) return;
+ if (!isAgentAvatarValid() || hasLoadingAssets(gesture)) return;
// Of the ones that started playing, have any stopped?
@@ -1091,6 +1155,98 @@ void LLGestureMgr::onLoadComplete(LLVFS *vfs,
}
}
+// static
+void LLGestureMgr::onAssetLoadComplete(LLVFS *vfs,
+ const LLUUID& asset_uuid,
+ LLAssetType::EType type,
+ void* user_data, S32 status, LLExtStat ext_status)
+{
+ LLGestureMgr& self = LLGestureMgr::instance();
+
+ // Complete the asset loading process depending on the type and
+ // remove the asset id from pending downloads list.
+ switch(type)
+ {
+ case LLAssetType::AT_ANIMATION:
+ {
+ LLKeyframeMotion::onLoadComplete(vfs, asset_uuid, type, user_data, status, ext_status);
+
+ self.mLoadingAssets.erase(asset_uuid);
+
+ break;
+ }
+ case LLAssetType::AT_SOUND:
+ {
+ LLAudioEngine::assetCallback(vfs, asset_uuid, type, user_data, status, ext_status);
+
+ self.mLoadingAssets.erase(asset_uuid);
+
+ break;
+ }
+ default:
+ {
+ llwarns << "Unexpected asset type: " << type << llendl;
+
+ // We don't want to return from this callback without
+ // an animation or sound callback being fired
+ // and *user_data handled to avoid memory leaks.
+ llassert(type == LLAssetType::AT_ANIMATION || type == LLAssetType::AT_SOUND);
+ }
+ }
+}
+
+// static
+bool LLGestureMgr::hasLoadingAssets(LLMultiGesture* gesture)
+{
+ LLGestureMgr& self = LLGestureMgr::instance();
+
+ for (std::vector<LLGestureStep*>::iterator steps_it = gesture->mSteps.begin();
+ steps_it != gesture->mSteps.end();
+ ++steps_it)
+ {
+ LLGestureStep* step = *steps_it;
+ switch(step->getType())
+ {
+ case STEP_ANIMATION:
+ {
+ LLGestureStepAnimation* anim_step = (LLGestureStepAnimation*)step;
+ const LLUUID& anim_id = anim_step->mAnimAssetID;
+
+ if (!(anim_id.isNull()
+ || anim_step->mFlags & ANIM_FLAG_STOP
+ || self.mLoadingAssets.find(anim_id) == self.mLoadingAssets.end()))
+ {
+ return true;
+ }
+ break;
+ }
+ case STEP_SOUND:
+ {
+ LLGestureStepSound* sound_step = (LLGestureStepSound*)step;
+ const LLUUID& sound_id = sound_step->mSoundAssetID;
+
+ if (!(sound_id.isNull()
+ || self.mLoadingAssets.find(sound_id) == self.mLoadingAssets.end()))
+ {
+ return true;
+ }
+ break;
+ }
+ case STEP_CHAT:
+ case STEP_WAIT:
+ case STEP_EOF:
+ {
+ break;
+ }
+ default:
+ {
+ llwarns << "Unknown gesture step type: " << step->getType() << llendl;
+ }
+ }
+ }
+
+ return false;
+}
void LLGestureMgr::stopGesture(LLMultiGesture* gesture)
{
diff --git a/indra/newview/llgesturemgr.h b/indra/newview/llgesturemgr.h
index b9935efeb3..26a5924ec3 100644
--- a/indra/newview/llgesturemgr.h
+++ b/indra/newview/llgesturemgr.h
@@ -37,6 +37,7 @@
#include "llviewerinventory.h"
class LLMultiGesture;
+class LLGestureListener;
class LLGestureStep;
class LLUUID;
class LLVFS;
@@ -158,6 +159,17 @@ protected:
LLAssetType::EType type,
void* user_data, S32 status, LLExtStat ext_status);
+ // Used by playGesture to load an asset file
+ // required to play a gesture step
+ static void onAssetLoadComplete(LLVFS *vfs,
+ const LLUUID& asset_uuid,
+ LLAssetType::EType type,
+ void* user_data, S32 status, LLExtStat ext_status);
+
+ // Checks whether all animation and sound assets
+ // needed to play a gesture are loaded.
+ static bool hasLoadingAssets(LLMultiGesture* gesture);
+
private:
// Active gestures.
// NOTE: The gesture pointer CAN BE NULL. This means that
@@ -172,6 +184,11 @@ private:
callback_map_t mCallbackMap;
std::vector<LLMultiGesture*> mPlaying;
BOOL mValid;
+
+ std::set<LLUUID> mLoadingAssets;
+
+ // LLEventHost interface
+ boost::shared_ptr<LLGestureListener> mListener;
};
#endif
diff --git a/indra/newview/llgiveinventory.cpp b/indra/newview/llgiveinventory.cpp
index f990b9294d..30858871ec 100644
--- a/indra/newview/llgiveinventory.cpp
+++ b/indra/newview/llgiveinventory.cpp
@@ -311,6 +311,9 @@ void LLGiveInventory::logInventoryOffer(const LLUUID& to_agent, const LLUUID &im
std::string full_name;
if (gCacheName->getFullName(to_agent, full_name))
{
+ // Build a new format username or firstname_lastname for legacy names
+ // to use it for a history log filename.
+ full_name = LLCacheName::buildUsername(full_name);
LLIMModel::instance().logToFile(full_name, LLTrans::getString("SECOND_LIFE"), im_session_id, LLTrans::getString("inventory_item_offered-im"));
}
}
diff --git a/indra/newview/llglsandbox.cpp b/indra/newview/llglsandbox.cpp
index 842911ecc0..1208c9378e 100644
--- a/indra/newview/llglsandbox.cpp
+++ b/indra/newview/llglsandbox.cpp
@@ -115,7 +115,7 @@ void LLToolSelectRect::handleRectangleSelection(S32 x, S32 y, MASK mask)
S32 center_y = (top + bottom) / 2;
// save drawing mode
- glMatrixMode(GL_PROJECTION);
+ gGL.matrixMode(LLRender::MM_PROJECTION);
gGL.pushMatrix();
BOOL limit_select_distance = gSavedSettings.getBOOL("LimitSelectDistance");
@@ -230,9 +230,9 @@ void LLToolSelectRect::handleRectangleSelection(S32 x, S32 y, MASK mask)
}
// restore drawing mode
- glMatrixMode(GL_PROJECTION);
+ gGL.matrixMode(LLRender::MM_PROJECTION);
gGL.popMatrix();
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
// restore camera
LLViewerCamera::getInstance()->setFar(old_far_plane);
@@ -240,7 +240,7 @@ void LLToolSelectRect::handleRectangleSelection(S32 x, S32 y, MASK mask)
gViewerWindow->setup3DRender();
}
-const F32 WIND_ALTITUDE = 180.f;
+const F32 WIND_RELATIVE_ALTITUDE = 25.f;
void LLWind::renderVectors()
{
@@ -254,13 +254,13 @@ void LLWind::renderVectors()
gGL.pushMatrix();
LLVector3 origin_agent;
origin_agent = gAgent.getPosAgentFromGlobal(mOriginGlobal);
- gGL.translatef(origin_agent.mV[VX], origin_agent.mV[VY], WIND_ALTITUDE);
+ gGL.translatef(origin_agent.mV[VX], origin_agent.mV[VY], gAgent.getPositionAgent().mV[VZ] + WIND_RELATIVE_ALTITUDE);
for (j = 0; j < mSize; j++)
{
for (i = 0; i < mSize; i++)
{
- x = mCloudVelX[i + j*mSize] * WIND_SCALE_HACK;
- y = mCloudVelY[i + j*mSize] * WIND_SCALE_HACK;
+ x = mVelX[i + j*mSize] * WIND_SCALE_HACK;
+ y = mVelY[i + j*mSize] * WIND_SCALE_HACK;
gGL.pushMatrix();
gGL.translatef((F32)i * region_width_meters/mSize, (F32)j * region_width_meters/mSize, 0.0);
gGL.color3f(0,1,0);
@@ -620,7 +620,7 @@ void LLViewerParcelMgr::renderCollisionSegments(U8* segments, BOOL use_pass, LLV
F32 pos_y = pos.mV[VY];
LLGLSUIDefault gls_ui;
- LLGLDepthTest gls_depth(GL_TRUE);
+ LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE);
LLGLDisable cull(GL_CULL_FACE);
if (mCollisionBanned == BA_BANNED)
@@ -777,13 +777,17 @@ void LLViewerObjectList::renderObjectBeacons()
LLGLSUIDefault gls_ui;
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gUIProgram.bind();
+ }
+
{
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
S32 last_line_width = -1;
// gGL.begin(LLRender::LINES); // Always happens in (line_width != last_line_width)
- BOOL flush = FALSE;
for (std::vector<LLDebugBeacon>::iterator iter = mDebugBeacons.begin(); iter != mDebugBeacons.end(); ++iter)
{
const LLDebugBeacon &debug_beacon = *iter;
@@ -792,18 +796,14 @@ void LLViewerObjectList::renderObjectBeacons()
S32 line_width = debug_beacon.mLineWidth;
if (line_width != last_line_width)
{
- if (flush)
- {
- gGL.end();
- }
- flush = TRUE;
gGL.flush();
glLineWidth( (F32)line_width );
last_line_width = line_width;
- gGL.begin(LLRender::LINES);
}
const LLVector3 &thisline = debug_beacon.mPositionAgent;
+
+ gGL.begin(LLRender::LINES);
gGL.color4fv(color.mV);
gGL.vertex3f(thisline.mV[VX],thisline.mV[VY],thisline.mV[VZ] - 50.f);
gGL.vertex3f(thisline.mV[VX],thisline.mV[VY],thisline.mV[VZ] + 50.f);
@@ -813,8 +813,9 @@ void LLViewerObjectList::renderObjectBeacons()
gGL.vertex3f(thisline.mV[VX],thisline.mV[VY] + 2.f,thisline.mV[VZ]);
draw_line_cube(0.10f, thisline);
+
+ gGL.end();
}
- gGL.end();
}
{
@@ -824,7 +825,6 @@ void LLViewerObjectList::renderObjectBeacons()
S32 last_line_width = -1;
// gGL.begin(LLRender::LINES); // Always happens in (line_width != last_line_width)
- BOOL flush = FALSE;
for (std::vector<LLDebugBeacon>::iterator iter = mDebugBeacons.begin(); iter != mDebugBeacons.end(); ++iter)
{
const LLDebugBeacon &debug_beacon = *iter;
@@ -832,18 +832,13 @@ void LLViewerObjectList::renderObjectBeacons()
S32 line_width = debug_beacon.mLineWidth;
if (line_width != last_line_width)
{
- if (flush)
- {
- gGL.end();
- }
- flush = TRUE;
gGL.flush();
glLineWidth( (F32)line_width );
last_line_width = line_width;
- gGL.begin(LLRender::LINES);
}
const LLVector3 &thisline = debug_beacon.mPositionAgent;
+ gGL.begin(LLRender::LINES);
gGL.color4fv(debug_beacon.mColor.mV);
gGL.vertex3f(thisline.mV[VX],thisline.mV[VY],thisline.mV[VZ] - 0.5f);
gGL.vertex3f(thisline.mV[VX],thisline.mV[VY],thisline.mV[VZ] + 0.5f);
@@ -853,9 +848,10 @@ void LLViewerObjectList::renderObjectBeacons()
gGL.vertex3f(thisline.mV[VX],thisline.mV[VY] + 0.5f,thisline.mV[VZ]);
draw_line_cube(0.10f, thisline);
+
+ gGL.end();
}
- gGL.end();
gGL.flush();
glLineWidth(1.f);
diff --git a/indra/newview/llgroupactions.cpp b/indra/newview/llgroupactions.cpp
index 5393678a6b..623ebb76f2 100644
--- a/indra/newview/llgroupactions.cpp
+++ b/indra/newview/llgroupactions.cpp
@@ -34,16 +34,18 @@
#include "llagent.h"
#include "llcommandhandler.h"
#include "llfloaterreg.h"
+#include "llfloatersidepanelcontainer.h"
#include "llgroupmgr.h"
#include "llimview.h" // for gIMMgr
#include "llnotificationsutil.h"
-#include "llsidetray.h"
#include "llstatusbar.h" // can_afford_transaction()
#include "llimfloater.h"
+#include "groupchatlistener.h"
//
// Globals
//
+static GroupChatListener sGroupChatListener;
class LLGroupHandler : public LLCommandHandler
{
@@ -53,6 +55,12 @@ public:
bool handle(const LLSD& tokens, const LLSD& query_map,
LLMediaCtrl* web)
{
+ if (!LLUI::sSettingGroups["config"]->getBOOL("EnableGroupInfo"))
+ {
+ LLNotificationsUtil::add("NoGroupInfo", LLSD(), LLSD(), std::string("SwitchToStandardSkinAndQuit"));
+ return true;
+ }
+
if (tokens.size() < 1)
{
return false;
@@ -75,7 +83,7 @@ public:
{
LLSD params;
params["people_panel_tab_name"] = "groups_panel";
- LLSideTray::getInstance()->showPanel("panel_people", params);
+ LLFloaterSidePanelContainer::showPanel("people", "panel_people", params);
return true;
}
return false;
@@ -235,7 +243,7 @@ static bool isGroupUIVisible()
{
static LLPanel* panel = 0;
if(!panel)
- panel = LLSideTray::getInstance()->getPanel("panel_group_info_sidetray");
+ panel = LLFloaterSidePanelContainer::getPanel("people", "panel_group_info_sidetray");
if(!panel)
return false;
return panel->isInVisibleChain();
@@ -257,7 +265,7 @@ void LLGroupActions::show(const LLUUID& group_id)
params["group_id"] = group_id;
params["open_tab_name"] = "panel_group_info_sidetray";
- LLSideTray::getInstance()->showPanel("panel_group_info_sidetray", params);
+ LLFloaterSidePanelContainer::showPanel("people", "panel_group_info_sidetray", params);
}
void LLGroupActions::refresh_notices()
@@ -270,7 +278,7 @@ void LLGroupActions::refresh_notices()
params["open_tab_name"] = "panel_group_info_sidetray";
params["action"] = "refresh_notices";
- LLSideTray::getInstance()->showPanel("panel_group_info_sidetray", params);
+ LLFloaterSidePanelContainer::showPanel("people", "panel_group_info_sidetray", params);
}
//static
@@ -284,7 +292,7 @@ void LLGroupActions::refresh(const LLUUID& group_id)
params["open_tab_name"] = "panel_group_info_sidetray";
params["action"] = "refresh";
- LLSideTray::getInstance()->showPanel("panel_group_info_sidetray", params);
+ LLFloaterSidePanelContainer::showPanel("people", "panel_group_info_sidetray", params);
}
//static
@@ -295,7 +303,7 @@ void LLGroupActions::createGroup()
params["open_tab_name"] = "panel_group_info_sidetray";
params["action"] = "create";
- LLSideTray::getInstance()->showPanel("panel_group_info_sidetray", params);
+ LLFloaterSidePanelContainer::showPanel("people", "panel_group_info_sidetray", params);
}
//static
@@ -309,15 +317,14 @@ void LLGroupActions::closeGroup(const LLUUID& group_id)
params["open_tab_name"] = "panel_group_info_sidetray";
params["action"] = "close";
- LLSideTray::getInstance()->showPanel("panel_group_info_sidetray", params);
+ LLFloaterSidePanelContainer::showPanel("people", "panel_group_info_sidetray", params);
}
// static
-void LLGroupActions::startIM(const LLUUID& group_id)
+LLUUID LLGroupActions::startIM(const LLUUID& group_id)
{
- if (group_id.isNull())
- return;
+ if (group_id.isNull()) return LLUUID::null;
LLGroupData group_data;
if (gAgent.getGroupData(group_id, group_data))
@@ -331,12 +338,14 @@ void LLGroupActions::startIM(const LLUUID& group_id)
LLIMFloater::show(session_id);
}
make_ui_sound("UISndStartIM");
+ return session_id;
}
else
{
// this should never happen, as starting a group IM session
// relies on you belonging to the group and hence having the group data
make_ui_sound("UISndInvalidOp");
+ return LLUUID::null;
}
}
diff --git a/indra/newview/llgroupactions.h b/indra/newview/llgroupactions.h
index c52a25818b..3f9852f194 100644
--- a/indra/newview/llgroupactions.h
+++ b/indra/newview/llgroupactions.h
@@ -87,7 +87,7 @@ public:
/**
* Start group instant messaging session.
*/
- static void startIM(const LLUUID& group_id);
+ static LLUUID startIM(const LLUUID& group_id);
/**
* End group instant messaging session.
diff --git a/indra/newview/llgrouplist.cpp b/indra/newview/llgrouplist.cpp
index c3e6e1c2dc..129cddda45 100644
--- a/indra/newview/llgrouplist.cpp
+++ b/indra/newview/llgrouplist.cpp
@@ -95,7 +95,7 @@ LLGroupList::LLGroupList(const Params& p)
LLGroupList::~LLGroupList()
{
gAgent.removeListener(this);
- LLView::deleteViewByHandle(mContextMenuHandle);
+ if (mContextMenuHandle.get()) mContextMenuHandle.get()->die();
}
// virtual
@@ -123,6 +123,22 @@ BOOL LLGroupList::handleRightMouseDown(S32 x, S32 y, MASK mask)
return handled;
}
+// virtual
+BOOL LLGroupList::handleDoubleClick(S32 x, S32 y, MASK mask)
+{
+ BOOL handled = LLView::handleDoubleClick(x, y, mask);
+ // Handle double click only for the selected item in the list, skip clicks on empty space.
+ if (handled)
+ {
+ if (mDoubleClickSignal)
+ {
+ (*mDoubleClickSignal)(this, x, y, mask);
+ }
+ }
+
+ return handled;
+}
+
void LLGroupList::setNameFilter(const std::string& filter)
{
std::string filter_upper = filter;
diff --git a/indra/newview/llgrouplist.h b/indra/newview/llgrouplist.h
index d7051db891..8abf14b3d0 100644
--- a/indra/newview/llgrouplist.h
+++ b/indra/newview/llgrouplist.h
@@ -51,6 +51,7 @@ public:
virtual void draw(); // from LLView
/*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask); // from LLView
+ /*virtual*/ BOOL handleDoubleClick(S32 x, S32 y, MASK mask); // from LLView
void setNameFilter(const std::string& filter);
void toggleIcons();
diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp
index 7546c070ea..efffd0f98e 100644
--- a/indra/newview/llgroupmgr.cpp
+++ b/indra/newview/llgroupmgr.cpp
@@ -52,6 +52,7 @@
#include <boost/regex.hpp>
#if LL_MSVC
+#pragma warning(push)
// disable boost::lexical_cast warning
#pragma warning (disable:4702)
#endif
@@ -856,7 +857,7 @@ void LLGroupMgr::processGroupMembersReply(LLMessageSystem* msg, void** data)
msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id );
if (gAgent.getID() != agent_id)
{
- llwarns << "Got group properties reply for another agent!" << llendl;
+ llwarns << "Got group members reply for another agent!" << llendl;
return;
}
@@ -866,10 +867,10 @@ void LLGroupMgr::processGroupMembersReply(LLMessageSystem* msg, void** data)
LLUUID request_id;
msg->getUUIDFast(_PREHASH_GroupData, _PREHASH_RequestID, request_id);
- LLGroupMgrGroupData* group_datap = LLGroupMgr::getInstance()->createGroupData(group_id);
- if (group_datap->mMemberRequestID != request_id)
+ LLGroupMgrGroupData* group_datap = LLGroupMgr::getInstance()->getGroupData(group_id);
+ if (!group_datap || (group_datap->mMemberRequestID != request_id))
{
- llwarns << "processGroupMembersReply: Received incorrect (stale?) request id" << llendl;
+ llwarns << "processGroupMembersReply: Received incorrect (stale?) group or request id" << llendl;
return;
}
@@ -1027,7 +1028,7 @@ void LLGroupMgr::processGroupRoleDataReply(LLMessageSystem* msg, void** data)
msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id );
if (gAgent.getID() != agent_id)
{
- llwarns << "Got group properties reply for another agent!" << llendl;
+ llwarns << "Got group role data reply for another agent!" << llendl;
return;
}
@@ -1037,14 +1038,14 @@ void LLGroupMgr::processGroupRoleDataReply(LLMessageSystem* msg, void** data)
LLUUID request_id;
msg->getUUIDFast(_PREHASH_GroupData, _PREHASH_RequestID, request_id);
- LLGroupMgrGroupData* group_data = LLGroupMgr::getInstance()->createGroupData(group_id);
- if (group_data->mRoleDataRequestID != request_id)
+ LLGroupMgrGroupData* group_datap = LLGroupMgr::getInstance()->getGroupData(group_id);
+ if (!group_datap || (group_datap->mRoleDataRequestID != request_id))
{
- llwarns << "processGroupRoleDataReply: Received incorrect (stale?) request id" << llendl;
+ llwarns << "processGroupPropertiesReply: Received incorrect (stale?) group or request id" << llendl;
return;
}
- msg->getS32(_PREHASH_GroupData, "RoleCount", group_data->mRoleCount );
+ msg->getS32(_PREHASH_GroupData, "RoleCount", group_datap->mRoleCount );
std::string name;
std::string title;
@@ -1085,22 +1086,22 @@ void LLGroupMgr::processGroupRoleDataReply(LLMessageSystem* msg, void** data)
lldebugs << "Adding role data: " << name << " {" << role_id << "}" << llendl;
LLGroupRoleData* rd = new LLGroupRoleData(role_id,name,title,desc,powers,member_count);
- group_data->mRoles[role_id] = rd;
+ group_datap->mRoles[role_id] = rd;
}
- if (group_data->mRoles.size() == (U32)group_data->mRoleCount)
+ if (group_datap->mRoles.size() == (U32)group_datap->mRoleCount)
{
- group_data->mRoleDataComplete = TRUE;
- group_data->mRoleDataRequestID.setNull();
+ group_datap->mRoleDataComplete = TRUE;
+ group_datap->mRoleDataRequestID.setNull();
// We don't want to make role-member data requests until we have all the role data
- if (group_data->mPendingRoleMemberRequest)
+ if (group_datap->mPendingRoleMemberRequest)
{
- group_data->mPendingRoleMemberRequest = FALSE;
- LLGroupMgr::getInstance()->sendGroupRoleMembersRequest(group_data->mID);
+ group_datap->mPendingRoleMemberRequest = FALSE;
+ LLGroupMgr::getInstance()->sendGroupRoleMembersRequest(group_datap->mID);
}
}
- group_data->mChanged = TRUE;
+ group_datap->mChanged = TRUE;
LLGroupMgr::getInstance()->notifyObservers(GC_ROLE_DATA);
}
@@ -1112,7 +1113,7 @@ void LLGroupMgr::processGroupRoleMembersReply(LLMessageSystem* msg, void** data)
msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id );
if (gAgent.getID() != agent_id)
{
- llwarns << "Got group properties reply for another agent!" << llendl;
+ llwarns << "Got group role members reply for another agent!" << llendl;
return;
}
@@ -1125,11 +1126,10 @@ void LLGroupMgr::processGroupRoleMembersReply(LLMessageSystem* msg, void** data)
U32 total_pairs;
msg->getU32(_PREHASH_AgentData, "TotalPairs", total_pairs);
- LLGroupMgrGroupData* group_data = LLGroupMgr::getInstance()->createGroupData(group_id);
-
- if (group_data->mRoleMembersRequestID != request_id)
+ LLGroupMgrGroupData* group_datap = LLGroupMgr::getInstance()->getGroupData(group_id);
+ if (!group_datap || (group_datap->mRoleMembersRequestID != request_id))
{
- llwarns << "processGroupRoleMembersReply: Received incorrect (stale?) role member request id" << llendl;
+ llwarns << "processGroupRoleMembersReply: Received incorrect (stale?) group or request id" << llendl;
return;
}
@@ -1154,15 +1154,15 @@ void LLGroupMgr::processGroupRoleMembersReply(LLMessageSystem* msg, void** data)
if (role_id.notNull() && member_id.notNull() )
{
rd = NULL;
- ri = group_data->mRoles.find(role_id);
- if (ri != group_data->mRoles.end())
+ ri = group_datap->mRoles.find(role_id);
+ if (ri != group_datap->mRoles.end())
{
rd = ri->second;
}
md = NULL;
- mi = group_data->mMembers.find(member_id);
- if (mi != group_data->mMembers.end())
+ mi = group_datap->mMembers.find(member_id);
+ if (mi != group_datap->mMembers.end())
{
md = mi->second;
}
@@ -1181,21 +1181,21 @@ void LLGroupMgr::processGroupRoleMembersReply(LLMessageSystem* msg, void** data)
}
}
- group_data->mReceivedRoleMemberPairs += num_blocks;
+ group_datap->mReceivedRoleMemberPairs += num_blocks;
}
- if (group_data->mReceivedRoleMemberPairs == total_pairs)
+ if (group_datap->mReceivedRoleMemberPairs == total_pairs)
{
// Add role data for the 'everyone' role to all members
- LLGroupRoleData* everyone = group_data->mRoles[LLUUID::null];
+ LLGroupRoleData* everyone = group_datap->mRoles[LLUUID::null];
if (!everyone)
{
llwarns << "Everyone role not found!" << llendl;
}
else
{
- for (LLGroupMgrGroupData::member_list_t::iterator mi = group_data->mMembers.begin();
- mi != group_data->mMembers.end(); ++mi)
+ for (LLGroupMgrGroupData::member_list_t::iterator mi = group_datap->mMembers.begin();
+ mi != group_datap->mMembers.end(); ++mi)
{
LLGroupMemberData* data = mi->second;
if (data)
@@ -1205,11 +1205,11 @@ void LLGroupMgr::processGroupRoleMembersReply(LLMessageSystem* msg, void** data)
}
}
- group_data->mRoleMemberDataComplete = TRUE;
- group_data->mRoleMembersRequestID.setNull();
+ group_datap->mRoleMemberDataComplete = TRUE;
+ group_datap->mRoleMembersRequestID.setNull();
}
- group_data->mChanged = TRUE;
+ group_datap->mChanged = TRUE;
LLGroupMgr::getInstance()->notifyObservers(GC_ROLE_MEMBER_DATA);
}
@@ -1227,15 +1227,13 @@ void LLGroupMgr::processGroupTitlesReply(LLMessageSystem* msg, void** data)
LLUUID group_id;
msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_GroupID, group_id );
-
- LLGroupMgrGroupData* group_data = LLGroupMgr::getInstance()->createGroupData(group_id);
-
LLUUID request_id;
msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_RequestID, request_id);
-
- if (group_data->mTitlesRequestID != request_id)
+
+ LLGroupMgrGroupData* group_datap = LLGroupMgr::getInstance()->getGroupData(group_id);
+ if (!group_datap || (group_datap->mTitlesRequestID != request_id))
{
- llwarns << "processGroupTitlesReply: Received incorrect (stale?) title request id" << llendl;
+ llwarns << "processGroupTitlesReply: Received incorrect (stale?) group" << llendl;
return;
}
@@ -1252,11 +1250,11 @@ void LLGroupMgr::processGroupTitlesReply(LLMessageSystem* msg, void** data)
if (!title.mTitle.empty())
{
lldebugs << "LLGroupMgr adding title: " << title.mTitle << ", " << title.mRoleID << ", " << (title.mSelected ? 'Y' : 'N') << llendl;
- group_data->mTitles.push_back(title);
+ group_datap->mTitles.push_back(title);
}
}
- group_data->mChanged = TRUE;
+ group_datap->mChanged = TRUE;
LLGroupMgr::getInstance()->notifyObservers(GC_TITLES);
}
diff --git a/indra/newview/llhints.cpp b/indra/newview/llhints.cpp
index 3f0deb98cd..e15862e2a4 100644
--- a/indra/newview/llhints.cpp
+++ b/indra/newview/llhints.cpp
@@ -33,6 +33,7 @@
#include "lltextbox.h"
#include "llviewerwindow.h"
#include "llviewercontrol.h"
+#include "lliconctrl.h"
#include "llsdparam.h"
class LLHintPopup : public LLPanel
@@ -80,7 +81,8 @@ public:
up_arrow,
right_arrow,
down_arrow,
- lower_left_arrow;
+ lower_left_arrow,
+ hint_image;
Optional<S32> left_arrow_offset,
up_arrow_offset,
@@ -96,6 +98,7 @@ public:
right_arrow("right_arrow"),
down_arrow("down_arrow"),
lower_left_arrow("lower_left_arrow"),
+ hint_image("hint_image"),
left_arrow_offset("left_arrow_offset"),
up_arrow_offset("up_arrow_offset"),
right_arrow_offset("right_arrow_offset"),
@@ -166,7 +169,15 @@ LLHintPopup::LLHintPopup(const LLHintPopup::Params& p)
mDirection = p.target_params.direction;
mTarget = p.target_params.target;
}
- buildFromFile( "panel_hint.xml", NULL, p);
+ if (p.hint_image.isProvided())
+ {
+ buildFromFile("panel_hint_image.xml", NULL, p);
+ getChild<LLIconCtrl>("hint_image")->setImage(p.hint_image());
+ }
+ else
+ {
+ buildFromFile( "panel_hint.xml", NULL, p);
+ }
}
BOOL LLHintPopup::postBuild()
@@ -180,6 +191,8 @@ BOOL LLHintPopup::postBuild()
LLRect text_bounds = hint_text.getTextBoundingRect();
S32 delta_height = text_bounds.getHeight() - hint_text.getRect().getHeight();
reshape(getRect().getWidth(), getRect().getHeight() + delta_height);
+ hint_text.reshape(hint_text.getRect().getWidth(), hint_text.getRect().getHeight() + delta_height);
+// hint_text.translate(0, -delta_height);
return TRUE;
}
@@ -200,6 +213,24 @@ void LLHintPopup::draw()
alpha = clamp_rescale(mFadeTimer.getElapsedTimeF32(), 0.f, mFadeInTime, 0.f, 1.f);
}
+ LLIconCtrl* hint_icon = findChild<LLIconCtrl>("hint_image");
+
+ if (hint_icon)
+ {
+ LLUIImagePtr hint_image = hint_icon->getImage();
+ S32 image_height = hint_image.isNull() ? 0 : hint_image->getHeight();
+ S32 image_width = hint_image.isNull() ? 0 : hint_image->getWidth();
+
+ LLView* layout_stack = hint_icon->getParent()->getParent();
+ S32 delta_height = image_height - layout_stack->getRect().getHeight();
+ hint_icon->getParent()->reshape(image_width, hint_icon->getParent()->getRect().getHeight());
+ layout_stack->reshape(layout_stack->getRect().getWidth(), image_height);
+ layout_stack->translate(0, -delta_height);
+
+ LLRect hint_rect = getLocalRect();
+ reshape(hint_rect.getWidth(), hint_rect.getHeight() + delta_height);
+ }
+
{ LLViewDrawContext context(alpha);
if (mTarget.empty())
diff --git a/indra/newview/llhudeffectbeam.cpp b/indra/newview/llhudeffectbeam.cpp
index 37b7b2e75d..8abad3d292 100644
--- a/indra/newview/llhudeffectbeam.cpp
+++ b/indra/newview/llhudeffectbeam.cpp
@@ -295,13 +295,13 @@ void LLHUDEffectBeam::render()
F32 alpha = mFadeInterp.getCurVal()*mColor.mV[3];
alpha *= mInterpFade[i].getCurVal();
coloru.mV[3] = (U8)alpha;
- glColor4ubv(coloru.mV);
+ gGL.color4ubv(coloru.mV);
- glPushMatrix();
- glTranslatef(pos_agent.mV[0], pos_agent.mV[1], pos_agent.mV[2]);
- glScalef(scale, scale, scale);
- gSphere.render(0);
- glPopMatrix();
+ gGL.pushMatrix();
+ gGL.translatef(pos_agent.mV[0], pos_agent.mV[1], pos_agent.mV[2]);
+ gGL.scalef(scale, scale, scale);
+ gSphere.render();
+ gGL.popMatrix();
}
}
diff --git a/indra/newview/llhudeffectblob.cpp b/indra/newview/llhudeffectblob.cpp
new file mode 100644
index 0000000000..c909551b51
--- /dev/null
+++ b/indra/newview/llhudeffectblob.cpp
@@ -0,0 +1,98 @@
+/**
+ * @file llhudeffecttrail.cpp
+ * @brief LLHUDEffectSpiral class implementation
+ *
+ * $LicenseInfo:firstyear=2002&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llhudeffectblob.h"
+
+#include "llagent.h"
+#include "llviewercamera.h"
+#include "llui.h"
+
+LLHUDEffectBlob::LLHUDEffectBlob(const U8 type)
+: LLHUDEffect(type),
+ mPixelSize(10)
+{
+ mTimer.start();
+ mImage = LLUI::getUIImage("Camera_Drag_Dot");
+}
+
+LLHUDEffectBlob::~LLHUDEffectBlob()
+{
+}
+
+void LLHUDEffectBlob::markDead()
+{
+ mImage = NULL;
+
+ LLHUDEffect::markDead();
+}
+
+void LLHUDEffectBlob::render()
+{
+ F32 time = mTimer.getElapsedTimeF32();
+ if (mDuration < time)
+ {
+ markDead();
+ return;
+ }
+
+ LLVector3 pos_agent = gAgent.getPosAgentFromGlobal(mPositionGlobal);
+
+ LLVector3 pixel_up, pixel_right;
+
+ LLViewerCamera::instance().getPixelVectors(pos_agent, pixel_up, pixel_right);
+
+ LLGLSPipelineAlpha gls_pipeline_alpha;
+ gGL.getTexUnit(0)->bind(mImage->getImage());
+
+ LLColor4U color = mColor;
+ color.mV[VALPHA] = (U8)clamp_rescale(time, 0.f, mDuration, 255.f, 0.f);
+ gGL.color4ubv(color.mV);
+
+ { gGL.pushMatrix();
+ gGL.translatef(pos_agent.mV[0], pos_agent.mV[1], pos_agent.mV[2]);
+ LLVector3 u_scale = pixel_right * (F32)mPixelSize;
+ LLVector3 v_scale = pixel_up * (F32)mPixelSize;
+
+ { gGL.begin(LLRender::QUADS);
+ gGL.texCoord2f(0.f, 1.f);
+ gGL.vertex3fv((v_scale - u_scale).mV);
+ gGL.texCoord2f(0.f, 0.f);
+ gGL.vertex3fv((-v_scale - u_scale).mV);
+ gGL.texCoord2f(1.f, 0.f);
+ gGL.vertex3fv((-v_scale + u_scale).mV);
+ gGL.texCoord2f(1.f, 1.f);
+ gGL.vertex3fv((v_scale + u_scale).mV);
+ } gGL.end();
+
+ } gGL.popMatrix();
+}
+
+void LLHUDEffectBlob::renderForTimer()
+{
+}
+
diff --git a/indra/newview/llhudeffectblob.h b/indra/newview/llhudeffectblob.h
new file mode 100644
index 0000000000..ce3e8500fc
--- /dev/null
+++ b/indra/newview/llhudeffectblob.h
@@ -0,0 +1,54 @@
+/**
+ * @file llhudeffectblob.h
+ * @brief LLHUDEffectBlob class definition
+ *
+ * $LicenseInfo:firstyear=2002&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLHUDEFFECTBLOB_H
+#define LL_LLHUDEFFECTBLOB_H
+
+#include "llhudeffect.h"
+#include "lluiimage.h"
+
+class LLHUDEffectBlob : public LLHUDEffect
+{
+public:
+ friend class LLHUDObject;
+
+ void markDead();
+
+ void setPixelSize(S32 pixels) { mPixelSize = pixels; }
+
+protected:
+ LLHUDEffectBlob(const U8 type);
+ ~LLHUDEffectBlob();
+
+ /*virtual*/ void render();
+ /*virtual*/ void renderForTimer();
+private:
+ S32 mPixelSize;
+ LLFrameTimer mTimer;
+ LLPointer<LLUIImage> mImage;
+};
+
+#endif // LL_LLHUDEFFECTBLOB_H
diff --git a/indra/newview/llhudeffectlookat.cpp b/indra/newview/llhudeffectlookat.cpp
index 8cf7d23f88..bc3b220dc0 100644
--- a/indra/newview/llhudeffectlookat.cpp
+++ b/indra/newview/llhudeffectlookat.cpp
@@ -56,7 +56,7 @@ const S32 PKT_SIZE = 57;
// throttle
const F32 MAX_SENDS_PER_SEC = 4.f;
-const F32 MIN_DELTAPOS_FOR_UPDATE = 0.05f;
+const F32 MIN_DELTAPOS_FOR_UPDATE_SQUARED = 0.05f * 0.05f;
const F32 MIN_TARGET_OFFSET_SQUARED = 0.0001f;
@@ -416,7 +416,7 @@ BOOL LLHUDEffectLookAt::setLookAt(ELookAtType target_type, LLViewerObject *objec
BOOL lookAtChanged = (target_type != mTargetType) || (object != mTargetObject);
// lookat position has moved a certain amount and we haven't just sent an update
- lookAtChanged = lookAtChanged || ((dist_vec(position, mLastSentOffsetGlobal) > MIN_DELTAPOS_FOR_UPDATE) &&
+ lookAtChanged = lookAtChanged || ((dist_vec_squared(position, mLastSentOffsetGlobal) > MIN_DELTAPOS_FOR_UPDATE_SQUARED) &&
((current_time - mLastSendTime) > (1.f / MAX_SENDS_PER_SEC)));
if (lookAtChanged)
@@ -498,10 +498,10 @@ void LLHUDEffectLookAt::render()
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
LLVector3 target = mTargetPos + ((LLVOAvatar*)(LLViewerObject*)mSourceObject)->mHeadp->getWorldPosition();
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.pushMatrix();
gGL.translatef(target.mV[VX], target.mV[VY], target.mV[VZ]);
- glScalef(0.3f, 0.3f, 0.3f);
+ gGL.scalef(0.3f, 0.3f, 0.3f);
gGL.begin(LLRender::LINES);
{
LLColor3 color = (*mAttentions)[mTargetType].mColor;
@@ -587,11 +587,6 @@ void LLHUDEffectLookAt::update()
*/
bool LLHUDEffectLookAt::calcTargetPosition()
{
- if (gNoRender)
- {
- return false;
- }
-
LLViewerObject *target_obj = (LLViewerObject *)mTargetObject;
LLVector3 local_offset;
diff --git a/indra/newview/llhudeffectpointat.cpp b/indra/newview/llhudeffectpointat.cpp
index bfb0f150b3..114a633821 100644
--- a/indra/newview/llhudeffectpointat.cpp
+++ b/indra/newview/llhudeffectpointat.cpp
@@ -48,7 +48,7 @@ const S32 PKT_SIZE = 57;
// throttle
const F32 MAX_SENDS_PER_SEC = 4.f;
-const F32 MIN_DELTAPOS_FOR_UPDATE = 0.05f;
+const F32 MIN_DELTAPOS_FOR_UPDATE_SQUARED = 0.05f * 0.05f;
// timeouts
// can't use actual F32_MAX, because we add this to the current frametime
@@ -244,7 +244,7 @@ BOOL LLHUDEffectPointAt::setPointAt(EPointAtType target_type, LLViewerObject *ob
BOOL targetTypeChanged = (target_type != mTargetType) ||
(object != mTargetObject);
- BOOL targetPosChanged = (dist_vec(position, mLastSentOffsetGlobal) > MIN_DELTAPOS_FOR_UPDATE) &&
+ BOOL targetPosChanged = (dist_vec_squared(position, mLastSentOffsetGlobal) > MIN_DELTAPOS_FOR_UPDATE_SQUARED) &&
((current_time - mLastSendTime) > (1.f / MAX_SENDS_PER_SEC));
if (targetTypeChanged || targetPosChanged)
@@ -327,7 +327,7 @@ void LLHUDEffectPointAt::render()
LLVector3 target = mTargetPos + mSourceObject->getRenderPosition();
gGL.pushMatrix();
gGL.translatef(target.mV[VX], target.mV[VY], target.mV[VZ]);
- glScalef(0.3f, 0.3f, 0.3f);
+ gGL.scalef(0.3f, 0.3f, 0.3f);
gGL.begin(LLRender::LINES);
{
gGL.color3f(1.f, 0.f, 0.f);
diff --git a/indra/newview/llhudicon.cpp b/indra/newview/llhudicon.cpp
index 568b0ae585..7e1025c41b 100644
--- a/indra/newview/llhudicon.cpp
+++ b/indra/newview/llhudicon.cpp
@@ -33,6 +33,7 @@
#include "llviewerobject.h"
#include "lldrawable.h"
+#include "llvector4a.h"
#include "llviewercamera.h"
#include "llviewertexture.h"
#include "llviewerwindow.h"
@@ -255,21 +256,42 @@ BOOL LLHUDIcon::lineSegmentIntersect(const LLVector3& start, const LLVector3& en
LLVector3 x_scale = image_aspect * (F32)gViewerWindow->getWindowHeightScaled() * mScale * scale_factor * x_pixel_vec;
LLVector3 y_scale = (F32)gViewerWindow->getWindowHeightScaled() * mScale * scale_factor * y_pixel_vec;
- LLVector3 lower_left = icon_position - (x_scale * 0.5f);
- LLVector3 lower_right = icon_position + (x_scale * 0.5f);
- LLVector3 upper_left = icon_position - (x_scale * 0.5f) + y_scale;
- LLVector3 upper_right = icon_position + (x_scale * 0.5f) + y_scale;
+ LLVector4a x_scalea;
+ LLVector4a icon_positiona;
+ LLVector4a y_scalea;
-
- F32 t = 0.f;
- LLVector3 dir = end-start;
+ x_scalea.load3(x_scale.mV);
+ x_scalea.mul(0.5f);
+ y_scalea.load3(y_scale.mV);
+
+ icon_positiona.load3(icon_position.mV);
+
+ LLVector4a lower_left;
+ lower_left.setSub(icon_positiona, x_scalea);
+ LLVector4a lower_right;
+ lower_right.setAdd(icon_positiona, x_scalea);
+ LLVector4a upper_left;
+ upper_left.setAdd(lower_left, y_scalea);
+ LLVector4a upper_right;
+ upper_right.setAdd(lower_right, y_scalea);
+
+ LLVector4a enda;
+ enda.load3(end.mV);
+ LLVector4a starta;
+ starta.load3(start.mV);
+ LLVector4a dir;
+ dir.setSub(enda, starta);
+
+ F32 a,b,t;
- if (LLTriangleRayIntersect(upper_right, upper_left, lower_right, start, dir, NULL, NULL, &t, FALSE) ||
- LLTriangleRayIntersect(upper_left, lower_left, lower_right, start, dir, NULL, NULL, &t, FALSE))
+ if (LLTriangleRayIntersect(upper_right, upper_left, lower_right, starta, dir, a,b,t) ||
+ LLTriangleRayIntersect(upper_left, lower_left, lower_right, starta, dir, a,b,t))
{
if (intersection)
{
- *intersection = start + dir*t;
+ dir.mul(t);
+ starta.add(dir);
+ *intersection = LLVector3(starta.getF32ptr());
}
return TRUE;
}
diff --git a/indra/newview/llhudmanager.cpp b/indra/newview/llhudmanager.cpp
index 5f3178b955..8f14b53db0 100644
--- a/indra/newview/llhudmanager.cpp
+++ b/indra/newview/llhudmanager.cpp
@@ -38,8 +38,6 @@
#include "llviewercontrol.h"
#include "llviewerobjectlist.h"
-extern BOOL gNoRender;
-
// These are loaded from saved settings.
LLColor4 LLHUDManager::sParentColor;
LLColor4 LLHUDManager::sChildColor;
@@ -150,11 +148,6 @@ LLHUDEffect *LLHUDManager::createViewerEffect(const U8 type, BOOL send_to_sim, B
//static
void LLHUDManager::processViewerEffect(LLMessageSystem *mesgsys, void **user_data)
{
- if (gNoRender)
- {
- return;
- }
-
LLHUDEffect *effectp = NULL;
LLUUID effect_id;
U8 effect_type = 0;
diff --git a/indra/newview/llhudnametag.cpp b/indra/newview/llhudnametag.cpp
index c099a3964b..482294c8a6 100644
--- a/indra/newview/llhudnametag.cpp
+++ b/indra/newview/llhudnametag.cpp
@@ -87,6 +87,7 @@ LLHUDNameTag::LLHUDNameTag(const U8 type)
mZCompare(TRUE),
mVisibleOffScreen(FALSE),
mOffscreen(FALSE),
+ mColor(1.f, 1.f, 1.f, 1.f),
// mScale(),
mWidth(0.f),
mHeight(0.f),
@@ -108,8 +109,6 @@ LLHUDNameTag::LLHUDNameTag(const U8 type)
{
LLPointer<LLHUDNameTag> ptr(this);
sTextObjects.insert(ptr);
-
- mColor = LLUIColorTable::instance().getColor("BackgroundChatColor");
}
LLHUDNameTag::~LLHUDNameTag()
@@ -147,24 +146,43 @@ BOOL LLHUDNameTag::lineSegmentIntersect(const LLVector3& start, const LLVector3&
mOffsetY = lltrunc(mHeight * ((mVertAlignment == ALIGN_VERT_CENTER) ? 0.5f : 1.f));
+ LLVector3 position = mPositionAgent;
+
+ if (mSourceObject)
+ { //get intersection of eye through mPositionAgent to plane of source object
+ //using this position keeps the camera from focusing on some seemingly random
+ //point several meters in front of the nametag
+ const LLVector3& p = mSourceObject->getPositionAgent();
+ const LLVector3& n = LLViewerCamera::getInstance()->getAtAxis();
+ const LLVector3& eye = LLViewerCamera::getInstance()->getOrigin();
+
+ LLVector3 ray = position-eye;
+ ray.normalize();
+
+ LLVector3 delta = p-position;
+ F32 dist = delta*n;
+ F32 dt = dist/(ray*n);
+ position += ray*dt;
+ }
+
// scale screen size of borders down
//RN: for now, text on hud objects is never occluded
LLVector3 x_pixel_vec;
LLVector3 y_pixel_vec;
- LLViewerCamera::getInstance()->getPixelVectors(mPositionAgent, y_pixel_vec, x_pixel_vec);
+ LLViewerCamera::getInstance()->getPixelVectors(position, y_pixel_vec, x_pixel_vec);
LLVector3 width_vec = mWidth * x_pixel_vec;
LLVector3 height_vec = mHeight * y_pixel_vec;
LLCoordGL screen_pos;
- LLViewerCamera::getInstance()->projectPosAgentToScreen(mPositionAgent, screen_pos, FALSE);
+ LLViewerCamera::getInstance()->projectPosAgentToScreen(position, screen_pos, FALSE);
LLVector2 screen_offset;
screen_offset = updateScreenPos(mPositionOffset);
- LLVector3 render_position = mPositionAgent
+ LLVector3 render_position = position
+ (x_pixel_vec * screen_offset.mV[VX])
+ (y_pixel_vec * screen_offset.mV[VY]);
@@ -198,10 +216,10 @@ BOOL LLHUDNameTag::lineSegmentIntersect(const LLVector3& start, const LLVector3&
}
LLVector3 dir = end-start;
- F32 t = 0.f;
+ F32 a, b, t;
- if (LLTriangleRayIntersect(v[0], v[1], v[2], start, dir, NULL, NULL, &t, FALSE) ||
- LLTriangleRayIntersect(v[2], v[3], v[0], start, dir, NULL, NULL, &t, FALSE) )
+ if (LLTriangleRayIntersect(v[0], v[1], v[2], start, dir, a, b, t, FALSE) ||
+ LLTriangleRayIntersect(v[2], v[3], v[0], start, dir, a, b, t, FALSE) )
{
if (t <= 1.f)
{
@@ -257,7 +275,6 @@ void LLHUDNameTag::renderText(BOOL for_select)
LLColor4 shadow_color(0.f, 0.f, 0.f, 1.f);
F32 alpha_factor = 1.f;
- mColor = LLUIColorTable::instance().getColor("BackgroundChatColor");
LLColor4 text_color = mColor;
if (mDoFade)
{
@@ -460,7 +477,7 @@ void LLHUDNameTag::renderText(BOOL for_select)
// Render label
{
- gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
+ //gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
for(std::vector<LLHUDTextSegment>::iterator segment_iter = mLabelSegments.begin();
segment_iter != mLabelSegments.end(); ++segment_iter )
@@ -523,6 +540,7 @@ void LLHUDNameTag::renderText(BOOL for_select)
x_offset += 1;
}
+ text_color = segment_iter->mColor;
text_color.mV[VALPHA] *= alpha_factor;
hud_render_text(segment_iter->getText(), render_position, *fontp, style, shadow, x_offset, y_offset, text_color, FALSE);
diff --git a/indra/newview/llhudobject.cpp b/indra/newview/llhudobject.cpp
index 5e762ee037..95d57d08d8 100644
--- a/indra/newview/llhudobject.cpp
+++ b/indra/newview/llhudobject.cpp
@@ -32,6 +32,7 @@
#include "llhudtext.h"
#include "llhudicon.h"
#include "llhudeffectbeam.h"
+#include "llhudeffectblob.h"
#include "llhudeffecttrail.h"
#include "llhudeffectlookat.h"
#include "llhudeffectpointat.h"
@@ -237,6 +238,9 @@ LLHUDEffect *LLHUDObject::addHUDEffect(const U8 type)
case LL_HUD_EFFECT_POINTAT:
hud_objectp = new LLHUDEffectPointAt(type);
break;
+ case LL_HUD_EFFECT_BLOB:
+ hud_objectp = new LLHUDEffectBlob(type);
+ break;
default:
llwarns << "Unknown type of hud effect:" << (U32) type << llendl;
}
diff --git a/indra/newview/llhudobject.h b/indra/newview/llhudobject.h
index 33e6394445..2f7a98c86c 100644
--- a/indra/newview/llhudobject.h
+++ b/indra/newview/llhudobject.h
@@ -95,7 +95,8 @@ public:
LL_HUD_EFFECT_LOOKAT,
LL_HUD_EFFECT_POINTAT,
LL_HUD_EFFECT_VOICE_VISUALIZER, // Ventrella
- LL_HUD_NAME_TAG
+ LL_HUD_NAME_TAG,
+ LL_HUD_EFFECT_BLOB
};
protected:
static void sortObjects();
diff --git a/indra/newview/llhudrender.cpp b/indra/newview/llhudrender.cpp
index 1156e764a1..dff310ecf9 100644
--- a/indra/newview/llhudrender.cpp
+++ b/indra/newview/llhudrender.cpp
@@ -107,14 +107,24 @@ void hud_render_text(const LLWString &wstr, const LLVector3 &pos_agent,
viewport[1] = world_view_rect.mBottom;
viewport[2] = world_view_rect.getWidth();
viewport[3] = world_view_rect.getHeight();
+
+ F64 mdlv[16];
+ F64 proj[16];
+
+ for (U32 i = 0; i < 16; i++)
+ {
+ mdlv[i] = (F64) gGLModelView[i];
+ proj[i] = (F64) gGLProjection[i];
+ }
+
gluProject(render_pos.mV[0], render_pos.mV[1], render_pos.mV[2],
- gGLModelView, gGLProjection, (GLint*) viewport,
+ mdlv, proj, (GLint*) viewport,
&winX, &winY, &winZ);
//fonts all render orthographically, set up projection``
- glMatrixMode(GL_PROJECTION);
- glPushMatrix();
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.pushMatrix();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.pushMatrix();
LLUI::pushMatrix();
@@ -124,16 +134,16 @@ void hud_render_text(const LLWString &wstr, const LLVector3 &pos_agent,
winX -= world_view_rect.mLeft;
winY -= world_view_rect.mBottom;
LLUI::loadIdentity();
- glLoadIdentity();
+ gGL.loadIdentity();
LLUI::translate((F32) winX*1.0f/LLFontGL::sScaleX, (F32) winY*1.0f/(LLFontGL::sScaleY), -(((F32) winZ*2.f)-1.f));
F32 right_x;
- font.render(wstr, 0, 0, 0, color, LLFontGL::LEFT, LLFontGL::BASELINE, style, shadow, wstr.length(), 1000, &right_x);
+ font.render(wstr, 0, 0, 1, color, LLFontGL::LEFT, LLFontGL::BASELINE, style, shadow, wstr.length(), 1000, &right_x);
LLUI::popMatrix();
gGL.popMatrix();
- glMatrixMode(GL_PROJECTION);
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.popMatrix();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
}
diff --git a/indra/newview/llhudtext.cpp b/indra/newview/llhudtext.cpp
index f7e5103d88..579b6008ae 100644
--- a/indra/newview/llhudtext.cpp
+++ b/indra/newview/llhudtext.cpp
@@ -194,9 +194,6 @@ void LLHUDText::renderText()
mRadius = (width_vec + height_vec).magVec() * 0.5f;
- LLCoordGL screen_pos;
- LLViewerCamera::getInstance()->projectPosAgentToScreen(mPositionAgent, screen_pos, FALSE);
-
LLVector2 screen_offset;
screen_offset = mPositionOffset;
@@ -230,7 +227,7 @@ void LLHUDText::renderText()
segment_iter != mTextSegments.end(); ++segment_iter )
{
const LLFontGL* fontp = segment_iter->mFont;
- y_offset -= fontp->getLineHeight();
+ y_offset -= fontp->getLineHeight() - 1; // correction factor to match legacy font metrics
U8 style = segment_iter->mStyle;
LLFontGL::ShadowType shadow = LLFontGL::DROP_SHADOW;
@@ -483,8 +480,6 @@ void LLHUDText::updateSize()
F32 width = 0.f;
S32 max_lines = getMaxLines();
- //S32 lines = (max_lines < 0) ? (S32)mTextSegments.size() : llmin((S32)mTextSegments.size(), max_lines);
- //F32 height = (F32)mFontp->getLineHeight() * (lines + mLabelSegments.size());
S32 start_segment;
if (max_lines < 0) start_segment = 0;
@@ -494,7 +489,7 @@ void LLHUDText::updateSize()
while (iter != mTextSegments.end())
{
const LLFontGL* fontp = iter->mFont;
- height += fontp->getLineHeight();
+ height += fontp->getLineHeight() - 1; // correction factor to match legacy font metrics
width = llmax(width, llmin(iter->getWidth(fontp), HUD_TEXT_MAX_WIDTH));
++iter;
}
diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index bdc0dfa7e2..f67464078b 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -34,9 +34,9 @@
#include "llappviewer.h"
#include "llavatarnamecache.h"
#include "llbutton.h"
-#include "llbottomtray.h"
#include "llchannelmanager.h"
#include "llchiclet.h"
+#include "llchicletbar.h"
#include "llfloaterreg.h"
#include "llimfloatercontainer.h" // to replace separate IM Floaters with multifloater container
#include "llinventoryfunctions.h"
@@ -55,14 +55,9 @@
#include "llinventorymodel.h"
#include "llrootview.h"
#include "llspeakers.h"
-#include "llsidetray.h"
+#include "llviewerchat.h"
-static const S32 RECT_PADDING_NOT_INIT = -1;
-static const S32 RECT_PADDING_NEED_RECALC = -2;
-
-S32 LLIMFloater::sAllowedRectRightPadding = RECT_PADDING_NOT_INIT;
-
LLIMFloater::LLIMFloater(const LLUUID& session_id)
: LLTransientDockableFloater(NULL, true, session_id),
mControlPanel(NULL),
@@ -122,14 +117,14 @@ void LLIMFloater::onFocusLost()
{
LLIMModel::getInstance()->resetActiveSessionID();
- LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(mSessionID, false);
+ LLChicletBar::getInstance()->getChicletPanel()->setChicletToggleState(mSessionID, false);
}
void LLIMFloater::onFocusReceived()
{
LLIMModel::getInstance()->setActiveSessionID(mSessionID);
- LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(mSessionID, true);
+ LLChicletBar::getInstance()->getChicletPanel()->setChicletToggleState(mSessionID, true);
if (getVisible())
{
@@ -239,12 +234,6 @@ LLIMFloater::~LLIMFloater()
//virtual
BOOL LLIMFloater::postBuild()
{
- // User-resizable control panels in P2P sessions look ugly (EXT-3470).
- if (mDialog == IM_NOTHING_SPECIAL || mDialog == IM_SESSION_P2P_INVITE)
- {
- getChild<LLLayoutStack>("im_panels")->setPanelUserResize("panel_im_control_panel", FALSE);
- }
-
const LLUUID& other_party_id = LLIMModel::getInstance()->getOtherParticipantID(mSessionID);
if (other_party_id.notNull())
{
@@ -266,7 +255,9 @@ BOOL LLIMFloater::postBuild()
mInputEditor->setMaxTextLength(1023);
// enable line history support for instant message bar
mInputEditor->setEnableLineHistory(TRUE);
-
+
+ LLFontGL* font = LLViewerChat::getChatFont();
+ mInputEditor->setFont(font);
mInputEditor->setFocusReceivedCallback( boost::bind(onInputEditorFocusReceived, _1, this) );
mInputEditor->setFocusLostCallback( boost::bind(onInputEditorFocusLost, _1, this) );
@@ -388,9 +379,6 @@ void LLIMFloater::onSlide()
getChild<LLButton>("slide_left_btn")->setVisible(mControlPanel->getParent()->getVisible());
getChild<LLButton>("slide_right_btn")->setVisible(!mControlPanel->getParent()->getVisible());
-
- LLLayoutStack* stack = getChild<LLLayoutStack>("im_panels");
- if (stack) stack->setAnimate(true);
}
//static
@@ -447,7 +435,7 @@ LLIMFloater* LLIMFloater::show(const LLUUID& session_id)
if (floater->getDockControl() == NULL)
{
LLChiclet* chiclet =
- LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLChiclet>(
+ LLChicletBar::getInstance()->getChicletPanel()->findChiclet<LLChiclet>(
session_id);
if (chiclet == NULL)
{
@@ -455,11 +443,11 @@ LLIMFloater* LLIMFloater::show(const LLUUID& session_id)
}
else
{
- LLBottomTray::getInstance()->getChicletPanel()->scrollToChiclet(chiclet);
+ LLChicletBar::getInstance()->getChicletPanel()->scrollToChiclet(chiclet);
}
floater->setDockControl(new LLDockControl(chiclet, floater, floater->getDockTongue(),
- LLDockControl::TOP, boost::bind(&LLIMFloater::getAllowedRect, floater, _1)));
+ LLDockControl::BOTTOM));
}
// window is positioned, now we can show it.
@@ -469,46 +457,6 @@ LLIMFloater* LLIMFloater::show(const LLUUID& session_id)
return floater;
}
-//static
-bool LLIMFloater::resetAllowedRectPadding(const LLSD& newvalue)
-{
- //reset allowed rect right padding if "SidebarCameraMovement" option
- //or sidebar state changed
- sAllowedRectRightPadding = RECT_PADDING_NEED_RECALC ;
- return true;
-}
-
-void LLIMFloater::getAllowedRect(LLRect& rect)
-{
- if (sAllowedRectRightPadding == RECT_PADDING_NOT_INIT) //wasn't initialized
- {
- gSavedSettings.getControl("SidebarCameraMovement")->getSignal()->connect(boost::bind(&LLIMFloater::resetAllowedRectPadding, _2));
-
- LLSideTray* side_bar = LLSideTray::getInstance();
- side_bar->getCollapseSignal().connect(boost::bind(&LLIMFloater::resetAllowedRectPadding, _2));
- sAllowedRectRightPadding = RECT_PADDING_NEED_RECALC;
- }
-
- rect = gViewerWindow->getWorldViewRectScaled();
- if (sAllowedRectRightPadding == RECT_PADDING_NEED_RECALC) //recalc allowed rect right padding
- {
- LLPanel* side_bar_tabs =
- gViewerWindow->getRootView()->getChild<LLPanel> (
- "side_bar_tabs");
- sAllowedRectRightPadding = side_bar_tabs->getRect().getWidth();
- LLTransientFloaterMgr::getInstance()->addControlView(side_bar_tabs);
-
- if (gSavedSettings.getBOOL("SidebarCameraMovement") == FALSE)
- {
- LLSideTray* side_bar = LLSideTray::getInstance();
-
- if (side_bar->getVisible() && !side_bar->getCollapsed())
- sAllowedRectRightPadding += side_bar->getRect().getWidth();
- }
- }
- rect.mRight -= sAllowedRectRightPadding;
-}
-
void LLIMFloater::setDocked(bool docked, bool pop_on_undock)
{
// update notification channel state
@@ -560,7 +508,7 @@ void LLIMFloater::setVisible(BOOL visible)
if(!visible)
{
- LLIMChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(mSessionID);
+ LLIMChiclet* chiclet = LLChicletBar::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(mSessionID);
if(chiclet)
{
chiclet->setToggleState(false);
@@ -894,6 +842,7 @@ void LLIMFloater::updateChatHistoryStyle()
void LLIMFloater::processChatHistoryStyleUpdate(const LLSD& newvalue)
{
+ LLFontGL* font = LLViewerChat::getChatFont();
LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("impanel");
for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin();
iter != inst_list.end(); ++iter)
@@ -902,6 +851,7 @@ void LLIMFloater::processChatHistoryStyleUpdate(const LLSD& newvalue)
if (floater)
{
floater->updateChatHistoryStyle();
+ floater->mInputEditor->setFont(font);
}
}
diff --git a/indra/newview/llimfloater.h b/indra/newview/llimfloater.h
index e80e45e64a..f7cd35b5eb 100644
--- a/indra/newview/llimfloater.h
+++ b/indra/newview/llimfloater.h
@@ -145,8 +145,6 @@ private:
static void* createPanelIMControl(void* userdata);
static void* createPanelGroupControl(void* userdata);
static void* createPanelAdHocControl(void* userdata);
- // gets a rect that bounds possible positions for the LLIMFloater on a screen (EXT-1111)
- void getAllowedRect(LLRect& rect);
// Add the "User is typing..." indicator.
void addTypingIndicator(const LLIMInfo* im_info);
@@ -156,10 +154,6 @@ private:
static void closeHiddenIMToasts();
- static bool resetAllowedRectPadding(const LLSD& newvalue);
- //need to keep this static for performance issues
- static S32 sAllowedRectRightPadding;
-
static void confirmLeaveCallCallback(const LLSD& notification, const LLSD& response);
LLPanelChatControlPanel* mControlPanel;
diff --git a/indra/newview/llimfloatercontainer.cpp b/indra/newview/llimfloatercontainer.cpp
index 33cb3a54a7..c8e48b0d42 100644
--- a/indra/newview/llimfloatercontainer.cpp
+++ b/indra/newview/llimfloatercontainer.cpp
@@ -47,12 +47,13 @@ LLIMFloaterContainer::LLIMFloaterContainer(const LLSD& seed)
LLIMFloaterContainer::~LLIMFloaterContainer()
{
+ mNewMessageConnection.disconnect();
LLTransientFloaterMgr::getInstance()->removeControlView(LLTransientFloaterMgr::IM, this);
}
BOOL LLIMFloaterContainer::postBuild()
{
- LLIMModel::instance().mNewMsgSignal.connect(boost::bind(&LLIMFloaterContainer::onNewMessageReceived, this, _1));
+ mNewMessageConnection = LLIMModel::instance().mNewMsgSignal.connect(boost::bind(&LLIMFloaterContainer::onNewMessageReceived, this, _1));
// Do not call base postBuild to not connect to mCloseSignal to not close all floaters via Close button
// mTabContainer will be initialized in LLMultiFloater::addChild()
return TRUE;
diff --git a/indra/newview/llimfloatercontainer.h b/indra/newview/llimfloatercontainer.h
index 53dfcd78ff..892ecef48d 100644
--- a/indra/newview/llimfloatercontainer.h
+++ b/indra/newview/llimfloatercontainer.h
@@ -62,7 +62,7 @@ public:
private:
typedef std::map<LLUUID,LLFloater*> avatarID_panel_map_t;
avatarID_panel_map_t mSessions;
-
+ boost::signals2::connection mNewMessageConnection;
void onNewMessageReceived(const LLSD& data);
};
diff --git a/indra/newview/llimhandler.cpp b/indra/newview/llimhandler.cpp
index cd71da7393..07d73c8c66 100644
--- a/indra/newview/llimhandler.cpp
+++ b/indra/newview/llimhandler.cpp
@@ -42,7 +42,7 @@ LLIMHandler::LLIMHandler(e_notification_type type, const LLSD& id)
mType = type;
// Getting a Channel for our notifications
- mChannel = LLChannelManager::getInstance()->createNotificationChannel();
+ mChannel = LLChannelManager::getInstance()->createNotificationChannel()->getHandle();
}
//--------------------------------------------------------------------------
@@ -55,13 +55,13 @@ void LLIMHandler::initChannel()
{
S32 channel_right_bound = gViewerWindow->getWorldViewRectScaled().mRight - gSavedSettings.getS32("NotificationChannelRightMargin");
S32 channel_width = gSavedSettings.getS32("NotifyBoxWidth");
- mChannel->init(channel_right_bound - channel_width, channel_right_bound);
+ mChannel.get()->init(channel_right_bound - channel_width, channel_right_bound);
}
//--------------------------------------------------------------------------
bool LLIMHandler::processNotification(const LLSD& notify)
{
- if(!mChannel)
+ if(mChannel.isDead())
{
return false;
}
@@ -72,7 +72,7 @@ bool LLIMHandler::processNotification(const LLSD& notify)
return false;
// arrange a channel on a screen
- if(!mChannel->getVisible())
+ if(!mChannel.get()->getVisible())
{
initChannel();
}
@@ -104,7 +104,7 @@ bool LLIMHandler::processNotification(const LLSD& notify)
p.panel = im_box;
p.can_be_stored = false;
p.on_delete_toast = boost::bind(&LLIMHandler::onDeleteToast, this, _1);
- LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel);
+ LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel.get());
if(channel)
channel->addToast(p);
@@ -113,7 +113,7 @@ bool LLIMHandler::processNotification(const LLSD& notify)
}
else if (notify["sigtype"].asString() == "delete")
{
- mChannel->killToastByNotificationID(notification->getID());
+ mChannel.get()->killToastByNotificationID(notification->getID());
}
return false;
}
diff --git a/indra/newview/llimpanel.cpp b/indra/newview/llimpanel.cpp
index b3b0c93b99..0250af6a0e 100644
--- a/indra/newview/llimpanel.cpp
+++ b/indra/newview/llimpanel.cpp
@@ -41,7 +41,6 @@
#include "llagent.h"
#include "llbutton.h"
-#include "llbottomtray.h"
#include "llcallingcard.h"
#include "llchannelmanager.h"
#include "llchat.h"
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index f5f59d5973..a7c4618fa4 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -46,7 +46,6 @@
#include "llagentui.h"
#include "llappviewer.h"
#include "llavatariconctrl.h"
-#include "llbottomtray.h"
#include "llcallingcard.h"
#include "llchat.h"
#include "llimfloater.h"
@@ -61,6 +60,7 @@
#include "llnearbychat.h"
#include "llspeakers.h" //for LLIMSpeakerMgr
#include "lltextbox.h"
+#include "lltoolbarview.h"
#include "llviewercontrol.h"
#include "llviewerparcelmgr.h"
@@ -171,8 +171,8 @@ void LLIMModel::setActiveSessionID(const LLUUID& session_id)
LLIMModel::LLIMModel()
{
- addNewMsgCallback(LLIMFloater::newIMCallback);
- addNewMsgCallback(toast_callback);
+ addNewMsgCallback(boost::bind(&LLIMFloater::newIMCallback, _1));
+ addNewMsgCallback(boost::bind(&toast_callback, _1));
}
LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, const LLUUID& other_participant_id, const uuid_vec_t& ids, bool voice)
@@ -195,7 +195,7 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string&
// set P2P type by default
mSessionType = P2P_SESSION;
- if (IM_NOTHING_SPECIAL == type || IM_SESSION_P2P_INVITE == type)
+ if (IM_NOTHING_SPECIAL == mType || IM_SESSION_P2P_INVITE == mType)
{
mVoiceChannel = new LLVoiceChannelP2P(session_id, name, other_participant_id);
mOtherParticipantIsAvatar = LLVoiceClient::getInstance()->isParticipantAvatar(mSessionID);
@@ -249,7 +249,7 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string&
new LLSessionTimeoutTimer(mSessionID, SESSION_INITIALIZATION_TIMEOUT);
}
- if (IM_NOTHING_SPECIAL == type)
+ if (IM_NOTHING_SPECIAL == mType)
{
mCallBackEnabled = LLVoiceClient::getInstance()->isSessionCallBackPossible(mSessionID);
mTextIMPossible = LLVoiceClient::getInstance()->isSessionTextIMPossible(mSessionID);
@@ -269,30 +269,30 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string&
// Localizing name of ad-hoc session. STORM-153
// Changing name should happen here- after the history file was created, so that
// history files have consistent (English) names in different locales.
- if (isAdHocSessionType() && IM_SESSION_INVITE == type)
+ if (isAdHocSessionType() && IM_SESSION_INVITE == mType)
{
- LLAvatarNameCache::get(mOtherParticipantID,
- boost::bind(&LLIMModel::LLIMSession::onAdHocNameCache,
+ LLAvatarNameCache::get(mOtherParticipantID,
+ boost::bind(&LLIMModel::LLIMSession::onAdHocNameCache,
this, _2));
}
}
void LLIMModel::LLIMSession::onAdHocNameCache(const LLAvatarName& av_name)
{
- if (av_name.mIsDummy)
- {
- S32 separator_index = mName.rfind(" ");
- std::string name = mName.substr(0, separator_index);
- ++separator_index;
- std::string conference_word = mName.substr(separator_index, mName.length());
-
- // additional check that session name is what we expected
- if ("Conference" == conference_word)
- {
- LLStringUtil::format_map_t args;
- args["[AGENT_NAME]"] = name;
- LLTrans::findString(mName, "conference-title-incoming", args);
- }
+ if (av_name.mIsTemporaryName)
+ {
+ S32 separator_index = mName.rfind(" ");
+ std::string name = mName.substr(0, separator_index);
+ ++separator_index;
+ std::string conference_word = mName.substr(separator_index, mName.length());
+
+ // additional check that session name is what we expected
+ if ("Conference" == conference_word)
+ {
+ LLStringUtil::format_map_t args;
+ args["[AGENT_NAME]"] = name;
+ LLTrans::findString(mName, "conference-title-incoming", args);
+ }
}
else
{
@@ -553,23 +553,10 @@ bool LLIMModel::LLIMSession::isOtherParticipantAvaline()
return !mOtherParticipantIsAvatar;
}
-void LLIMModel::LLIMSession::onAvatarNameCache(const LLUUID& avatar_id, const LLAvatarName& av_name)
-{
- if (av_name.mUsername.empty())
- {
- // display names is off, use mDisplayName which will be the legacy name
- mHistoryFileName = LLCacheName::buildUsername(av_name.mDisplayName);
- }
- else
- {
- mHistoryFileName = av_name.mUsername;
- }
-}
-
void LLIMModel::LLIMSession::buildHistoryFileName()
{
mHistoryFileName = mName;
-
+
//ad-hoc requires sophisticated chat history saving schemes
if (isAdHoc())
{
@@ -583,17 +570,35 @@ void LLIMModel::LLIMSession::buildHistoryFileName()
{
std::set<LLUUID> sorted_uuids(mInitialTargetIDs.begin(), mInitialTargetIDs.end());
mHistoryFileName = mName + " hash" + generateHash(sorted_uuids);
- return;
}
-
- //in case of incoming ad-hoc sessions
- mHistoryFileName = mName + " " + LLLogChat::timestamp(true) + " " + mSessionID.asString().substr(0, 4);
+ else
+ {
+ //in case of incoming ad-hoc sessions
+ mHistoryFileName = mName + " " + LLLogChat::timestamp(true) + " " + mSessionID.asString().substr(0, 4);
+ }
}
-
- // look up username to use as the log name
- if (isP2P())
+ else if (isP2P()) // look up username to use as the log name
{
- LLAvatarNameCache::get(mOtherParticipantID, boost::bind(&LLIMModel::LLIMSession::onAvatarNameCache, this, _1, _2));
+ LLAvatarName av_name;
+ // For outgoing sessions we already have a cached name
+ // so no need for a callback in LLAvatarNameCache::get()
+ if (LLAvatarNameCache::get(mOtherParticipantID, &av_name))
+ {
+ if (av_name.mUsername.empty())
+ {
+ // Display names are off, use mDisplayName which will be the legacy name
+ mHistoryFileName = LLCacheName::buildUsername(av_name.mDisplayName);
+ }
+ else
+ {
+ mHistoryFileName = av_name.mUsername;
+ }
+ }
+ else
+ {
+ // Incoming P2P sessions include a name that we can use to build a history file name
+ mHistoryFileName = LLCacheName::buildUsername(mName);
+ }
}
}
@@ -615,7 +620,6 @@ std::string LLIMModel::LLIMSession::generateHash(const std::set<LLUUID>& sorted_
return participants_md5_hash.asString();
}
-
void LLIMModel::processSessionInitializedReply(const LLUUID& old_session_id, const LLUUID& new_session_id)
{
LLIMSession* session = findIMSession(old_session_id);
@@ -798,11 +802,6 @@ bool LLIMModel::logToFile(const std::string& file_name, const std::string& from,
}
}
-bool LLIMModel::logToFile(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, const std::string& utf8_text)
-{
- return logToFile(LLIMModel::getInstance()->getHistoryFileName(session_id), from, from_id, utf8_text);
-}
-
bool LLIMModel::proccessOnlineOfflineNotification(
const LLUUID& session_id,
const std::string& utf8_text)
@@ -856,8 +855,11 @@ LLIMModel::LLIMSession* LLIMModel::addMessageSilently(const LLUUID& session_id,
}
addToHistory(session_id, from_name, from_id, utf8_text);
- if (log2file) logToFile(session_id, from_name, from_id, utf8_text);
-
+ if (log2file)
+ {
+ logToFile(getHistoryFileName(session_id), from_name, from_id, utf8_text);
+ }
+
session->mNumUnread++;
//update count of unread messages from real participant
@@ -1673,27 +1675,48 @@ LLCallDialog::~LLCallDialog()
LLUI::removePopup(this);
}
-void LLCallDialog::getAllowedRect(LLRect& rect)
+BOOL LLCallDialog::postBuild()
{
- rect = gViewerWindow->getWorldViewRectScaled();
+ if (!LLDockableFloater::postBuild() || !gToolBarView)
+ return FALSE;
+
+ dockToToolbarButton("speak");
+
+ return TRUE;
}
-BOOL LLCallDialog::postBuild()
+void LLCallDialog::dockToToolbarButton(const std::string& toolbarButtonName)
{
- if (!LLDockableFloater::postBuild())
- return FALSE;
+ LLDockControl::DocAt dock_pos = getDockControlPos(toolbarButtonName);
+ LLView *anchor_panel = gToolBarView->findChildView(toolbarButtonName);
- // dock the dialog to the Speak Button, where other sys messages appear
- LLView *anchor_panel = LLBottomTray::getInstance()->getChild<LLView>("speak_panel");
+ setUseTongue(anchor_panel);
- setDockControl(new LLDockControl(
- anchor_panel, this,
- getDockTongue(), LLDockControl::TOP,
- boost::bind(&LLCallDialog::getAllowedRect, this, _1)));
+ setDockControl(new LLDockControl(anchor_panel, this, getDockTongue(dock_pos), dock_pos));
+}
- return TRUE;
+LLDockControl::DocAt LLCallDialog::getDockControlPos(const std::string& toolbarButtonName)
+{
+ LLCommandId command_id(toolbarButtonName);
+ S32 toolbar_loc = gToolBarView->hasCommand(command_id);
+
+ LLDockControl::DocAt doc_at = LLDockControl::TOP;
+
+ switch (toolbar_loc)
+ {
+ case LLToolBarView::TOOLBAR_LEFT:
+ doc_at = LLDockControl::RIGHT;
+ break;
+
+ case LLToolBarView::TOOLBAR_RIGHT:
+ doc_at = LLDockControl::LEFT;
+ break;
+ }
+
+ return doc_at;
}
+
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLOutgoingCallDialog
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -2107,7 +2130,7 @@ void LLIncomingCallDialog::onOpen(const LLSD& key)
void LLIncomingCallDialog::onAccept(void* user_data)
{
LLIncomingCallDialog* self = (LLIncomingCallDialog*)user_data;
- self->processCallResponse(0);
+ processCallResponse(0, self->mPayload);
self->closeFloater();
}
@@ -2115,7 +2138,7 @@ void LLIncomingCallDialog::onAccept(void* user_data)
void LLIncomingCallDialog::onReject(void* user_data)
{
LLIncomingCallDialog* self = (LLIncomingCallDialog*)user_data;
- self->processCallResponse(1);
+ processCallResponse(1, self->mPayload);
self->closeFloater();
}
@@ -2123,20 +2146,21 @@ void LLIncomingCallDialog::onReject(void* user_data)
void LLIncomingCallDialog::onStartIM(void* user_data)
{
LLIncomingCallDialog* self = (LLIncomingCallDialog*)user_data;
- self->processCallResponse(2);
+ processCallResponse(2, self->mPayload);
self->closeFloater();
}
-void LLIncomingCallDialog::processCallResponse(S32 response)
+// static
+void LLIncomingCallDialog::processCallResponse(S32 response, const LLSD &payload)
{
if (!gIMMgr || gDisconnected)
return;
- LLUUID session_id = mPayload["session_id"].asUUID();
- LLUUID caller_id = mPayload["caller_id"].asUUID();
- std::string session_name = mPayload["session_name"].asString();
- EInstantMessage type = (EInstantMessage)mPayload["type"].asInteger();
- LLIMMgr::EInvitationType inv_type = (LLIMMgr::EInvitationType)mPayload["inv_type"].asInteger();
+ LLUUID session_id = payload["session_id"].asUUID();
+ LLUUID caller_id = payload["caller_id"].asUUID();
+ std::string session_name = payload["session_name"].asString();
+ EInstantMessage type = (EInstantMessage)payload["type"].asInteger();
+ LLIMMgr::EInvitationType inv_type = (LLIMMgr::EInvitationType)payload["inv_type"].asInteger();
bool voice = true;
switch(response)
{
@@ -2153,8 +2177,8 @@ void LLIncomingCallDialog::processCallResponse(S32 response)
session_id = gIMMgr->addP2PSession(
session_name,
caller_id,
- mPayload["session_handle"].asString(),
- mPayload["session_uri"].asString());
+ payload["session_handle"].asString(),
+ payload["session_uri"].asString());
if (voice)
{
@@ -2218,10 +2242,10 @@ void LLIncomingCallDialog::processCallResponse(S32 response)
inv_type));
// send notification message to the corresponding chat
- if (mPayload["notify_box_type"].asString() == "VoiceInviteGroup" || mPayload["notify_box_type"].asString() == "VoiceInviteAdHoc")
+ if (payload["notify_box_type"].asString() == "VoiceInviteGroup" || payload["notify_box_type"].asString() == "VoiceInviteAdHoc")
{
LLStringUtil::format_map_t string_args;
- string_args["[NAME]"] = mPayload["caller_name"].asString();
+ string_args["[NAME]"] = payload["caller_name"].asString();
std::string message = LLTrans::getString("name_started_call", string_args);
LLIMModel::getInstance()->addMessageSilently(session_id, SYSTEM_FROM, LLUUID::null, message);
}
@@ -2238,7 +2262,7 @@ void LLIncomingCallDialog::processCallResponse(S32 response)
{
if(LLVoiceClient::getInstance())
{
- std::string s = mPayload["session_handle"].asString();
+ std::string s = payload["session_handle"].asString();
LLVoiceClient::getInstance()->declineInvite(s);
}
}
@@ -2379,15 +2403,6 @@ void LLIMMgr::addMessage(
bool link_name) // If this is true, then we insert the name and link it to a profile
{
LLUUID other_participant_id = target_id;
-
- // don't process muted IMs
- if (LLMuteList::getInstance()->isMuted(
- other_participant_id,
- LLMute::flagTextChat) && !LLMuteList::getInstance()->isLinden(from))
- {
- return;
- }
-
LLUUID new_session_id = session_id;
if (new_session_id.isNull())
{
@@ -2428,10 +2443,28 @@ void LLIMMgr::addMessage(
LLIMModel::instance().addMessage(new_session_id, from, other_participant_id, bonus_info.str());
}
+ // Logically it would make more sense to reject the session sooner, in another area of the
+ // code, but the session has to be established inside the server before it can be left.
+ if (LLMuteList::getInstance()->isMuted(other_participant_id) && !LLMuteList::getInstance()->isLinden(from))
+ {
+ llwarns << "Leaving IM session from initiating muted resident " << from << llendl;
+ if(!gIMMgr->leaveSession(new_session_id))
+ {
+ llinfos << "Session " << new_session_id << " does not exist." << llendl;
+ }
+ return;
+ }
+
make_ui_sound("UISndNewIncomingIMSession");
}
- LLIMModel::instance().addMessage(new_session_id, from, other_participant_id, msg);
+ bool skip_message = (gSavedSettings.getBOOL("VoiceCallsFriendsOnly") &&
+ LLAvatarTracker::instance().getBuddyInfo(other_participant_id) == NULL);
+
+ if (!LLMuteList::getInstance()->isMuted(other_participant_id, LLMute::flagTextChat) && !skip_message)
+ {
+ LLIMModel::instance().addMessage(new_session_id, from, other_participant_id, msg);
+ }
}
void LLIMMgr::addSystemMessage(const LLUUID& session_id, const std::string& message_name, const LLSD& args)
@@ -2446,8 +2479,10 @@ void LLIMMgr::addSystemMessage(const LLUUID& session_id, const std::string& mess
LLChat chat(message);
chat.mSourceType = CHAT_SOURCE_SYSTEM;
+
+ LLFloater* chat_bar = LLFloaterReg::getInstance("chat_bar");
+ LLNearbyChat* nearby_chat = chat_bar->findChild<LLNearbyChat>("nearby_chat");
- LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD());
if(nearby_chat)
{
nearby_chat->addMessage(chat);
@@ -2467,6 +2502,7 @@ void LLIMMgr::addSystemMessage(const LLUUID& session_id, const std::string& mess
std::string session_name;
// since we select user to share item with - his name is already in cache
gCacheName->getFullName(args["user_id"], session_name);
+ session_name = LLCacheName::buildUsername(session_name);
LLIMModel::instance().logToFile(session_name, SYSTEM_FROM, LLUUID::null, message.getString());
}
}
@@ -2634,27 +2670,27 @@ void LLIMMgr::inviteToSession(
const std::string& session_handle,
const std::string& session_uri)
{
- //ignore invites from muted residents
- if (LLMuteList::getInstance()->isMuted(caller_id))
- {
- return;
- }
-
std::string notify_box_type;
// voice invite question is different from default only for group call (EXT-7118)
std::string question_type = "VoiceInviteQuestionDefault";
BOOL ad_hoc_invite = FALSE;
+ BOOL voice_invite = FALSE;
+ bool is_linden = LLMuteList::getInstance()->isLinden(caller_name);
+
+
if(type == IM_SESSION_P2P_INVITE)
{
//P2P is different...they only have voice invitations
notify_box_type = "VoiceInviteP2P";
+ voice_invite = TRUE;
}
else if ( gAgent.isInGroup(session_id) )
{
//only really old school groups have voice invitations
notify_box_type = "VoiceInviteGroup";
question_type = "VoiceInviteQuestionGroup";
+ voice_invite = TRUE;
}
else if ( inv_type == INVITATION_TYPE_VOICE )
{
@@ -2662,6 +2698,7 @@ void LLIMMgr::inviteToSession(
//and a voice ad-hoc
notify_box_type = "VoiceInviteAdHoc";
ad_hoc_invite = TRUE;
+ voice_invite = TRUE;
}
else if ( inv_type == INVITATION_TYPE_IMMEDIATE )
{
@@ -2680,28 +2717,37 @@ void LLIMMgr::inviteToSession(
payload["session_uri"] = session_uri;
payload["notify_box_type"] = notify_box_type;
payload["question_type"] = question_type;
-
+
+ //ignore invites from muted residents
+ if (LLMuteList::getInstance()->isMuted(caller_id) && !is_linden)
+ {
+ if (voice_invite && "VoiceInviteQuestionDefault" == question_type)
+ {
+ llinfos << "Rejecting voice call from initiating muted resident " << caller_name << llendl;
+ LLIncomingCallDialog::processCallResponse(1, payload);
+ }
+ return;
+ }
+
LLVoiceChannel* channelp = LLVoiceChannel::getChannelByID(session_id);
if (channelp && channelp->callStarted())
{
// you have already started a call to the other user, so just accept the invite
- LLNotifications::instance().forceResponse(LLNotification::Params("VoiceInviteP2P").payload(payload), 0);
+ LLIncomingCallDialog::processCallResponse(0, payload);
return;
}
- if (type == IM_SESSION_P2P_INVITE || ad_hoc_invite)
+ if (voice_invite)
{
- // is the inviter a friend?
- if (LLAvatarTracker::instance().getBuddyInfo(caller_id) == NULL)
+ if ( // if we are rejecting group calls
+ (gSavedSettings.getBOOL("VoiceCallsRejectGroup") && notify_box_type == "VoiceInviteGroup") ||
+ // or we're rejecting non-friend voice calls and this isn't a friend
+ (gSavedSettings.getBOOL("VoiceCallsFriendsOnly") && (LLAvatarTracker::instance().getBuddyInfo(caller_id) == NULL))
+ )
{
- // if not, and we are ignoring voice invites from non-friends
- // then silently decline
- if (gSavedSettings.getBOOL("VoiceCallsFriendsOnly"))
- {
- // invite not from a friend, so decline
- LLNotifications::instance().forceResponse(LLNotification::Params("VoiceInviteP2P").payload(payload), 1);
- return;
- }
+ // silently decline the call
+ LLIncomingCallDialog::processCallResponse(1, payload);
+ return;
}
}
@@ -2716,6 +2762,15 @@ void LLIMMgr::inviteToSession(
{
LLFloaterReg::showInstance("incoming_call", payload, FALSE);
}
+
+ // Add the caller to the Recent List here (at this point
+ // "incoming_call" floater is shown and the recipient can
+ // reject the call), because even if a recipient will reject
+ // the call, the caller should be added to the recent list
+ // anyway. STORM-507.
+ if(type == IM_SESSION_P2P_INVITE)
+ LLRecentPeople::instance().add(caller_id);
+
mPendingInvitations[session_id.asString()] = LLSD();
}
}
@@ -2925,6 +2980,17 @@ bool LLIMMgr::isVoiceCall(const LLUUID& session_id)
return im_session->mStartedAsIMCall;
}
+void LLIMMgr::addNotifiedNonFriendSessionID(const LLUUID& session_id)
+{
+ mNotifiedNonFriendSessions.insert(session_id);
+}
+
+bool LLIMMgr::isNonFriendSessionNotified(const LLUUID& session_id)
+{
+ return mNotifiedNonFriendSessions.end() != mNotifiedNonFriendSessions.find(session_id);
+
+}
+
void LLIMMgr::noteOfflineUsers(
const LLUUID& session_id,
const LLDynamicArray<LLUUID>& ids)
@@ -3171,10 +3237,6 @@ public:
//just like a normal IM
//this is just replicated code from process_improved_im
//and should really go in it's own function -jwolk
- if (gNoRender)
- {
- return;
- }
LLChat chat;
std::string message = message_params["message"].asString();
@@ -3200,7 +3262,7 @@ public:
chat.mFromID = from_id;
chat.mFromName = name;
- if (!is_linden && (is_busy || is_muted))
+ if (!is_linden && is_busy)
{
return;
}
@@ -3232,6 +3294,11 @@ public:
ll_vector3_from_sd(message_params["position"]),
true);
+ if (LLMuteList::getInstance()->isMuted(from_id, name, LLMute::flagTextChat))
+ {
+ return;
+ }
+
//K now we want to accept the invitation
std::string url = gAgent.getRegion()->getCapability(
"ChatSessionRequest");
@@ -3251,11 +3318,6 @@ public:
} //end if invitation has instant message
else if ( input["body"].has("voice") )
{
- if (gNoRender)
- {
- return;
- }
-
if(!LLVoiceClient::getInstance()->voiceEnabled() || !LLVoiceClient::getInstance()->isVoiceWorking())
{
// Don't display voice invites unless the user has voice enabled.
diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h
index 3f72d66bfb..7c2cd03d97 100644
--- a/indra/newview/llimview.h
+++ b/indra/newview/llimview.h
@@ -98,13 +98,6 @@ public:
/** ad-hoc sessions involve sophisticated chat history file naming schemes */
void buildHistoryFileName();
- void onAvatarNameCache(const LLUUID& avatar_id, const LLAvatarName& av_name);
-
- void onAdHocNameCache(const LLAvatarName& av_name);
-
- //*TODO make private
- static std::string generateHash(const std::set<LLUUID>& sorted_uuids);
-
LLUUID mSessionID;
std::string mName;
EInstantMessage mType;
@@ -139,6 +132,11 @@ public:
//if IM session is created for a voice call
bool mStartedAsIMCall;
+
+ private:
+ void onAdHocNameCache(const LLAvatarName& av_name);
+
+ static std::string generateHash(const std::set<LLUUID>& sorted_uuids);
};
@@ -155,7 +153,6 @@ public:
std::map<LLUUID, LLIMSession*> mId2SessionMap;
typedef boost::signals2::signal<void(const LLSD&)> session_signal_t;
- typedef boost::function<void(const LLSD&)> session_callback_t;
session_signal_t mNewMsgSignal;
session_signal_t mNoUnreadMsgsSignal;
@@ -176,8 +173,8 @@ public:
*/
void processSessionInitializedReply(const LLUUID& old_session_id, const LLUUID& new_session_id);
- boost::signals2::connection addNewMsgCallback( session_callback_t cb ) { return mNewMsgSignal.connect(cb); }
- boost::signals2::connection addNoUnreadMsgsCallback( session_callback_t cb ) { return mNoUnreadMsgsSignal.connect(cb); }
+ boost::signals2::connection addNewMsgCallback(const session_signal_t::slot_type& cb ) { return mNewMsgSignal.connect(cb); }
+ boost::signals2::connection addNoUnreadMsgsCallback(const session_signal_t::slot_type& cb ) { return mNoUnreadMsgsSignal.connect(cb); }
/**
* Create new session object in a model
@@ -293,12 +290,7 @@ private:
/**
* Add message to a list of message associated with session specified by session_id
*/
- bool addToHistory(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, const std::string& utf8_text);
-
- /**
- * Save an IM message into a file
- */
- bool logToFile(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, const std::string& utf8_text);
+ bool addToHistory(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, const std::string& utf8_text);
};
class LLIMSessionObserver
@@ -445,6 +437,10 @@ public:
bool isVoiceCall(const LLUUID& session_id);
+ void addNotifiedNonFriendSessionID(const LLUUID& session_id);
+
+ bool isNonFriendSessionNotified(const LLUUID& session_id);
+
private:
/**
@@ -472,6 +468,14 @@ private:
typedef std::list <LLIMSessionObserver *> session_observers_list_t;
session_observers_list_t mSessionObservers;
+ // EXP-901
+ // If "Only friends and groups can IM me" option is ON but the user got message from non-friend,
+ // the user should be notified that to be able to see this message the option should be OFF.
+ // This set stores session IDs in which user was notified. Need to store this IDs so that the user
+ // be notified only one time per session with non-friend.
+ typedef std::set<LLUUID> notified_non_friend_sessions_t;
+ notified_non_friend_sessions_t mNotifiedNonFriendSessions;
+
LLSD mPendingInvitations;
LLSD mPendingAgentListUpdates;
};
@@ -498,14 +502,16 @@ class LLCallDialog : public LLDockableFloater
{
public:
LLCallDialog(const LLSD& payload);
- ~LLCallDialog();
+ virtual ~LLCallDialog();
virtual BOOL postBuild();
+ void dockToToolbarButton(const std::string& toolbarButtonName);
+
// check timer state
/*virtual*/ void draw();
/*virtual*/ void onOpen(const LLSD& key);
-
+
protected:
// lifetime timer for a notification
LLTimer mLifetimeTimer;
@@ -515,8 +521,6 @@ protected:
virtual bool lifetimeHasExpired();
virtual void onLifetimeExpired();
- virtual void getAllowedRect(LLRect& rect);
-
/**
* Sets icon depend on session.
*
@@ -528,6 +532,9 @@ protected:
void setIcon(const LLSD& session_id, const LLSD& participant_id);
LLSD mPayload;
+
+private:
+ LLDockControl::DocAt getDockControlPos(const std::string& toolbarButtonName);
};
class LLIncomingCallDialog : public LLCallDialog
@@ -542,6 +549,7 @@ public:
static void onReject(void* user_data);
static void onStartIM(void* user_data);
+ static void processCallResponse(S32 response, const LLSD& payload);
private:
void setCallerName(const std::string& ui_title,
const std::string& ui_label,
@@ -551,7 +559,6 @@ private:
const std::string& call_type);
/*virtual*/ void onLifetimeExpired();
- void processCallResponse(S32 response);
};
class LLOutgoingCallDialog : public LLCallDialog
diff --git a/indra/newview/llinspectavatar.cpp b/indra/newview/llinspectavatar.cpp
index 91ede6d221..17d0b0ffbb 100644
--- a/indra/newview/llinspectavatar.cpp
+++ b/indra/newview/llinspectavatar.cpp
@@ -47,6 +47,7 @@
#include "llvoiceclient.h"
#include "llviewerobjectlist.h"
#include "lltransientfloatermgr.h"
+#include "llnotificationsutil.h"
// Linden libraries
#include "llfloater.h"
@@ -126,16 +127,20 @@ private:
void onClickReport();
void onClickFreeze();
void onClickEject();
+ void onClickKick();
+ void onClickCSR();
void onClickZoomIn();
void onClickFindOnMap();
bool onVisibleFindOnMap();
- bool onVisibleFreezeEject();
+ bool onVisibleEject();
+ bool onVisibleFreeze();
bool onVisibleZoomIn();
void onClickMuteVolume();
void onVolumeChange(const LLSD& data);
bool enableMute();
bool enableUnmute();
bool enableTeleportOffer();
+ bool godModeEnabled();
// Is used to determine if "Add friend" option should be enabled in gear menu
bool isNotFriend();
@@ -214,20 +219,21 @@ LLInspectAvatar::LLInspectAvatar(const LLSD& sd)
mCommitCallbackRegistrar.add("InspectAvatar.Pay", boost::bind(&LLInspectAvatar::onClickPay, this));
mCommitCallbackRegistrar.add("InspectAvatar.Share", boost::bind(&LLInspectAvatar::onClickShare, this));
mCommitCallbackRegistrar.add("InspectAvatar.ToggleMute", boost::bind(&LLInspectAvatar::onToggleMute, this));
- mCommitCallbackRegistrar.add("InspectAvatar.Freeze",
- boost::bind(&LLInspectAvatar::onClickFreeze, this));
- mCommitCallbackRegistrar.add("InspectAvatar.Eject",
- boost::bind(&LLInspectAvatar::onClickEject, this));
+ mCommitCallbackRegistrar.add("InspectAvatar.Freeze", boost::bind(&LLInspectAvatar::onClickFreeze, this));
+ mCommitCallbackRegistrar.add("InspectAvatar.Eject", boost::bind(&LLInspectAvatar::onClickEject, this));
+ mCommitCallbackRegistrar.add("InspectAvatar.Kick", boost::bind(&LLInspectAvatar::onClickKick, this));
+ mCommitCallbackRegistrar.add("InspectAvatar.CSR", boost::bind(&LLInspectAvatar::onClickCSR, this));
mCommitCallbackRegistrar.add("InspectAvatar.Report", boost::bind(&LLInspectAvatar::onClickReport, this));
mCommitCallbackRegistrar.add("InspectAvatar.FindOnMap", boost::bind(&LLInspectAvatar::onClickFindOnMap, this));
mCommitCallbackRegistrar.add("InspectAvatar.ZoomIn", boost::bind(&LLInspectAvatar::onClickZoomIn, this));
mCommitCallbackRegistrar.add("InspectAvatar.DisableVoice", boost::bind(&LLInspectAvatar::toggleSelectedVoice, this, false));
mCommitCallbackRegistrar.add("InspectAvatar.EnableVoice", boost::bind(&LLInspectAvatar::toggleSelectedVoice, this, true));
+
+ mEnableCallbackRegistrar.add("InspectAvatar.EnableGod", boost::bind(&LLInspectAvatar::godModeEnabled, this));
mEnableCallbackRegistrar.add("InspectAvatar.VisibleFindOnMap", boost::bind(&LLInspectAvatar::onVisibleFindOnMap, this));
- mEnableCallbackRegistrar.add("InspectAvatar.VisibleFreezeEject",
- boost::bind(&LLInspectAvatar::onVisibleFreezeEject, this));
- mEnableCallbackRegistrar.add("InspectAvatar.VisibleZoomIn",
- boost::bind(&LLInspectAvatar::onVisibleZoomIn, this));
+ mEnableCallbackRegistrar.add("InspectAvatar.VisibleEject", boost::bind(&LLInspectAvatar::onVisibleEject, this));
+ mEnableCallbackRegistrar.add("InspectAvatar.VisibleFreeze", boost::bind(&LLInspectAvatar::onVisibleFreeze, this));
+ mEnableCallbackRegistrar.add("InspectAvatar.VisibleZoomIn", boost::bind(&LLInspectAvatar::onVisibleZoomIn, this));
mEnableCallbackRegistrar.add("InspectAvatar.Gear.Enable", boost::bind(&LLInspectAvatar::isNotFriend, this));
mEnableCallbackRegistrar.add("InspectAvatar.Gear.EnableCall", boost::bind(&LLAvatarActions::canCall));
mEnableCallbackRegistrar.add("InspectAvatar.Gear.EnableTeleportOffer", boost::bind(&LLInspectAvatar::enableTeleportOffer, this));
@@ -656,11 +662,18 @@ bool LLInspectAvatar::onVisibleFindOnMap()
return gAgent.isGodlike() || is_agent_mappable(mAvatarID);
}
-bool LLInspectAvatar::onVisibleFreezeEject()
+bool LLInspectAvatar::onVisibleEject()
{
return enable_freeze_eject( LLSD(mAvatarID) );
}
+bool LLInspectAvatar::onVisibleFreeze()
+{
+ // either user is a god and can do long distance freeze
+ // or check for target proximity and permissions
+ return gAgent.isGodlike() || enable_freeze_eject(LLSD(mAvatarID));
+}
+
bool LLInspectAvatar::onVisibleZoomIn()
{
return gObjectList.findObject(mAvatarID);
@@ -704,7 +717,7 @@ void LLInspectAvatar::onClickShare()
void LLInspectAvatar::onToggleMute()
{
- LLMute mute(mAvatarID, mAvatarName.getLegacyName(), LLMute::AGENT);
+ LLMute mute(mAvatarID, mAvatarName.mDisplayName, LLMute::AGENT);
if (LLMuteList::getInstance()->isMuted(mute.mID, mute.mName))
{
@@ -725,9 +738,41 @@ void LLInspectAvatar::onClickReport()
closeFloater();
}
+bool godlike_freeze(const LLSD& notification, const LLSD& response)
+{
+ LLUUID avatar_id = notification["payload"]["avatar_id"].asUUID();
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+
+ switch (option)
+ {
+ case 0:
+ LLAvatarActions::freeze(avatar_id);
+ break;
+ case 1:
+ LLAvatarActions::unfreeze(avatar_id);
+ break;
+ default:
+ break;
+ }
+
+ return false;
+}
+
void LLInspectAvatar::onClickFreeze()
{
- handle_avatar_freeze( LLSD(mAvatarID) );
+ if (gAgent.isGodlike())
+ {
+ // use godlike freeze-at-a-distance, with confirmation
+ LLNotificationsUtil::add("FreezeAvatar",
+ LLSD(),
+ LLSD().with("avatar_id", mAvatarID),
+ godlike_freeze);
+ }
+ else
+ {
+ // use default "local" version of freezing that requires avatar to be in range
+ handle_avatar_freeze( LLSD(mAvatarID) );
+ }
closeFloater();
}
@@ -737,6 +782,20 @@ void LLInspectAvatar::onClickEject()
closeFloater();
}
+void LLInspectAvatar::onClickKick()
+{
+ LLAvatarActions::kick(mAvatarID);
+ closeFloater();
+}
+
+void LLInspectAvatar::onClickCSR()
+{
+ std::string name;
+ gCacheName->getFullName(mAvatarID, name);
+ LLAvatarActions::csr(mAvatarID, name);
+ closeFloater();
+}
+
void LLInspectAvatar::onClickZoomIn()
{
handle_zoom_to_object(mAvatarID);
@@ -785,6 +844,11 @@ bool LLInspectAvatar::enableTeleportOffer()
return LLAvatarActions::canOfferTeleport(mAvatarID);
}
+bool LLInspectAvatar::godModeEnabled()
+{
+ return gAgent.isGodlike();
+}
+
//////////////////////////////////////////////////////////////////////////////
// LLInspectAvatarUtil
//////////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/llinspectobject.cpp b/indra/newview/llinspectobject.cpp
index ee076f68ea..acc139c569 100644
--- a/indra/newview/llinspectobject.cpp
+++ b/indra/newview/llinspectobject.cpp
@@ -28,6 +28,7 @@
#include "llinspectobject.h"
// Viewer
+#include "llfloatersidepanelcontainer.h"
#include "llinspect.h"
#include "llmediaentry.h"
#include "llnotificationsutil.h" // *TODO: Eliminate, add LLNotificationsUtil wrapper
@@ -45,7 +46,6 @@
#include "llmenubutton.h"
#include "llresmgr.h" // getMonetaryString
#include "llsafehandle.h"
-#include "llsidetray.h"
#include "lltextbox.h" // for description truncation
#include "lltoggleablemenu.h"
#include "lltrans.h"
@@ -640,7 +640,7 @@ void LLInspectObject::onClickMoreInfo()
{
LLSD key;
key["task"] = "task";
- LLSideTray::getInstance()->showPanel("sidepanel_inventory", key);
+ LLFloaterSidePanelContainer::showPanel("inventory", key);
closeFloater();
}
diff --git a/indra/newview/llinspectremoteobject.cpp b/indra/newview/llinspectremoteobject.cpp
index bf6cf52298..a12ec390af 100644
--- a/indra/newview/llinspectremoteobject.cpp
+++ b/indra/newview/llinspectremoteobject.cpp
@@ -60,12 +60,10 @@ public:
private:
void update();
- void onNameCache(const LLUUID& id, const std::string& name, bool is_group);
private:
LLUUID mObjectID;
LLUUID mOwnerID;
- std::string mOwnerLegacyName;
std::string mSLurl;
std::string mName;
bool mGroupOwned;
@@ -75,7 +73,6 @@ LLInspectRemoteObject::LLInspectRemoteObject(const LLSD& sd) :
LLInspect(LLSD()),
mObjectID(NULL),
mOwnerID(NULL),
- mOwnerLegacyName(),
mSLurl(""),
mName(""),
mGroupOwned(false)
@@ -111,14 +108,6 @@ void LLInspectRemoteObject::onOpen(const LLSD& data)
mGroupOwned = data["group_owned"].asBoolean();
mSLurl = data["slurl"].asString();
- // work out the owner's name
- mOwnerLegacyName = "";
- if (gCacheName)
- {
- gCacheName->get(mOwnerID, mGroupOwned, // muting
- boost::bind(&LLInspectRemoteObject::onNameCache, this, _1, _2, _3));
- }
-
// update the inspector with the current object state
update();
@@ -144,8 +133,7 @@ void LLInspectRemoteObject::onClickMap()
void LLInspectRemoteObject::onClickBlock()
{
- LLMute::EType mute_type = mGroupOwned ? LLMute::GROUP : LLMute::AGENT;
- LLMute mute(mOwnerID, mOwnerLegacyName, mute_type);
+ LLMute mute(mObjectID, mName, LLMute::OBJECT);
LLMuteList::getInstance()->add(mute);
LLPanelBlockedList::showPanelAndSelect(mute.mID);
closeFloater();
@@ -156,12 +144,6 @@ void LLInspectRemoteObject::onClickClose()
closeFloater();
}
-void LLInspectRemoteObject::onNameCache(const LLUUID& id, const std::string& name, bool is_group)
-{
- mOwnerLegacyName = name;
- update();
-}
-
void LLInspectRemoteObject::update()
{
// show the object name as the inspector's title
@@ -198,8 +180,8 @@ void LLInspectRemoteObject::update()
// disable the Map button if we don't have a SLurl
getChild<LLUICtrl>("map_btn")->setEnabled(! mSLurl.empty());
- // disable the Block button if we don't have the owner ID
- getChild<LLUICtrl>("block_btn")->setEnabled(! mOwnerID.isNull());
+ // disable the Block button if we don't have the object ID (will this ever happen?)
+ getChild<LLUICtrl>("block_btn")->setEnabled(! mObjectID.isNull());
}
//////////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/llinspecttoast.cpp b/indra/newview/llinspecttoast.cpp
index 58b3f0309f..f4fe5dec01 100644
--- a/indra/newview/llinspecttoast.cpp
+++ b/indra/newview/llinspecttoast.cpp
@@ -46,6 +46,7 @@ public:
virtual ~LLInspectToast();
/*virtual*/ void onOpen(const LLSD& notification_id);
+ /*virtual*/ BOOL handleToolTip(S32 x, S32 y, MASK mask);
private:
void onToastDestroy(LLToast * toast);
@@ -71,8 +72,11 @@ LLInspectToast::LLInspectToast(const LLSD& notification_id) :
LLInspectToast::~LLInspectToast()
{
LLTransientFloaterMgr::getInstance()->removeControlView(this);
+
+ mConnection.disconnect();
}
+// virtual
void LLInspectToast::onOpen(const LLSD& notification_id)
{
LLInspect::onOpen(notification_id);
@@ -103,6 +107,15 @@ void LLInspectToast::onOpen(const LLSD& notification_id)
LLUI::positionViewNearMouse(this);
}
+// virtual
+BOOL LLInspectToast::handleToolTip(S32 x, S32 y, MASK mask)
+{
+ // We don't like the way LLInspect handles tooltips
+ // (black tooltips look weird),
+ // so force using the default implementation (STORM-511).
+ return LLFloater::handleToolTip(x, y, mask);
+}
+
void LLInspectToast::onToastDestroy(LLToast * toast)
{
closeFloater(false);
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index 5ba87423c7..b86c453d61 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -39,18 +39,21 @@
#include "llavataractions.h"
#include "llfloateropenobject.h"
#include "llfloaterreg.h"
+#include "llfloatersidepanelcontainer.h"
#include "llfloaterworldmap.h"
+#include "llfolderview.h"
#include "llfriendcard.h"
#include "llgesturemgr.h"
#include "llgiveinventory.h"
#include "llimfloater.h"
#include "llimview.h"
-#include "llinventoryclipboard.h"
+#include "llclipboard.h"
#include "llinventorydefines.h"
#include "llinventoryfunctions.h"
#include "llinventorymodel.h"
#include "llinventorymodelbackgroundfetch.h"
#include "llinventorypanel.h"
+#include "llmarketplacefunctions.h"
#include "llnotifications.h"
#include "llnotificationsutil.h"
#include "llpreviewanim.h"
@@ -58,7 +61,7 @@
#include "llpreviewtexture.h"
#include "llselectmgr.h"
#include "llsidepanelappearance.h"
-#include "llsidetray.h"
+#include "lltooldraganddrop.h"
#include "lltrans.h"
#include "llviewerassettype.h"
#include "llviewerfoldertype.h"
@@ -69,6 +72,11 @@
#include "llvoavatarself.h"
#include "llwearablelist.h"
+// Marketplace outbox current disabled
+#define ENABLE_MERCHANT_OUTBOX_CONTEXT_MENU 1
+#define ENABLE_MERCHANT_SEND_TO_MARKETPLACE_CONTEXT_MENU 0
+#define BLOCK_WORN_ITEMS_IN_OUTBOX 1
+
typedef std::pair<LLUUID, LLUUID> two_uuids_t;
typedef std::list<two_uuids_t> two_uuids_list_t;
@@ -104,6 +112,72 @@ void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_
bool move_task_inventory_callback(const LLSD& notification, const LLSD& response, LLMoveInv*);
bool confirm_attachment_rez(const LLSD& notification, const LLSD& response);
void teleport_via_landmark(const LLUUID& asset_id);
+static BOOL can_move_to_outfit(LLInventoryItem* inv_item, BOOL move_is_into_current_outfit);
+static bool check_category(LLInventoryModel* model,
+ const LLUUID& cat_id,
+ LLFolderView* active_folder_view,
+ LLInventoryFilter* filter);
+static bool check_item(const LLUUID& item_id,
+ LLFolderView* active_folder_view,
+ LLInventoryFilter* filter);
+
+// Helper functions
+
+bool isAddAction(const std::string& action)
+{
+ return ("wear" == action || "attach" == action || "activate" == action);
+}
+
+bool isRemoveAction(const std::string& action)
+{
+ return ("take_off" == action || "detach" == action || "deactivate" == action);
+}
+
+bool isMarketplaceCopyAction(const std::string& action)
+{
+ return (("copy_to_outbox" == action) || ("move_to_outbox" == action));
+}
+
+bool isMarketplaceSendAction(const std::string& action)
+{
+ return ("send_to_marketplace" == action);
+}
+
+// Used by LLFolderBridge as callback for directory fetching recursion
+class LLRightClickInventoryFetchDescendentsObserver : public LLInventoryFetchDescendentsObserver
+{
+public:
+ LLRightClickInventoryFetchDescendentsObserver(const uuid_vec_t& ids) : LLInventoryFetchDescendentsObserver(ids) {}
+ ~LLRightClickInventoryFetchDescendentsObserver() {}
+ virtual void execute(bool clear_observer = false);
+ virtual void done()
+ {
+ execute(true);
+ }
+};
+
+// Used by LLFolderBridge as callback for directory content items fetching
+class LLRightClickInventoryFetchObserver : public LLInventoryFetchItemsObserver
+{
+public:
+ LLRightClickInventoryFetchObserver(const uuid_vec_t& ids) : LLInventoryFetchItemsObserver(ids) { };
+ ~LLRightClickInventoryFetchObserver() {}
+ void execute(bool clear_observer = false)
+ {
+ if (clear_observer)
+ {
+ dec_busy_count();
+ gInventory.removeObserver(this);
+ delete this;
+ }
+ // we've downloaded all the items, so repaint the dialog
+ LLFolderBridge::staticFolderOptionsMenu();
+ }
+ virtual void done()
+ {
+ execute(true);
+ }
+};
// +=================================================+
// | LLInvFVBridge |
@@ -117,7 +191,7 @@ LLInvFVBridge::LLInvFVBridge(LLInventoryPanel* inventory,
mInvType(LLInventoryType::IT_NONE),
mIsLink(FALSE)
{
- mInventoryPanel = inventory->getHandle();
+ mInventoryPanel = inventory->getInventoryPanelHandle();
const LLInventoryObject* obj = getInventoryObject();
mIsLink = obj && obj->getIsLinkType();
}
@@ -177,13 +251,27 @@ BOOL LLInvFVBridge::isLink() const
/**
* @brief Adds this item into clipboard storage
*/
-void LLInvFVBridge::cutToClipboard()
+BOOL LLInvFVBridge::cutToClipboard() const
{
- if(isItemMovable())
+ const LLInventoryObject* obj = gInventory.getObject(mUUID);
+ if (obj && isItemMovable() && isItemRemovable())
{
- LLInventoryClipboard::instance().cut(mUUID);
+ LLClipboard::instance().setCutMode(true);
+ return LLClipboard::instance().addToClipboard(mUUID);
}
+ return FALSE;
+}
+
+BOOL LLInvFVBridge::copyToClipboard() const
+{
+ const LLInventoryObject* obj = gInventory.getObject(mUUID);
+ if (obj && isItemCopyable())
+ {
+ return LLClipboard::instance().addToClipboard(mUUID);
+ }
+ return FALSE;
}
+
// *TODO: make sure this does the right thing
void LLInvFVBridge::showProperties()
{
@@ -358,6 +446,11 @@ void LLInvFVBridge::removeBatchNoCheck(LLDynamicArray<LLFolderViewEventListener*
for(; it != end; ++it)
{
gInventory.moveObject((*it), trash_id);
+ LLViewerInventoryItem* item = gInventory.getItem(*it);
+ if (item)
+ {
+ model->updateItem(item);
+ }
}
// notify inventory observers.
@@ -366,7 +459,8 @@ void LLInvFVBridge::removeBatchNoCheck(LLDynamicArray<LLFolderViewEventListener*
BOOL LLInvFVBridge::isClipboardPasteable() const
{
- if (!LLInventoryClipboard::instance().hasContents() || !isAgentInventory())
+ // Return FALSE on degenerated cases: empty clipboard, no inventory, no agent
+ if (!LLClipboard::instance().hasContents() || !isAgentInventory())
{
return FALSE;
}
@@ -376,37 +470,42 @@ BOOL LLInvFVBridge::isClipboardPasteable() const
return FALSE;
}
- const LLUUID &agent_id = gAgent.getID();
+ // In cut mode, whatever is on the clipboard is always pastable
+ if (LLClipboard::instance().isCutMode())
+ {
+ return TRUE;
+ }
+ // In normal mode, we need to check each element of the clipboard to know if we can paste or not
LLDynamicArray<LLUUID> objects;
- LLInventoryClipboard::instance().retrieve(objects);
+ LLClipboard::instance().pasteFromClipboard(objects);
S32 count = objects.count();
for(S32 i = 0; i < count; i++)
{
const LLUUID &item_id = objects.get(i);
- // Can't paste folders
+ // Folders are pastable if all items in there are copyable
const LLInventoryCategory *cat = model->getCategory(item_id);
if (cat)
{
+ LLFolderBridge cat_br(mInventoryPanel.get(), mRoot, item_id);
+ if (!cat_br.isItemCopyable())
return FALSE;
+ // Skip to the next item in the clipboard
+ continue;
}
- const LLInventoryItem *item = model->getItem(item_id);
- if (item)
- {
- if (!item->getPermissions().allowCopyBy(agent_id))
- {
+ // Each item must be copyable to be pastable
+ LLItemBridge item_br(mInventoryPanel.get(), mRoot, item_id);
+ if (!item_br.isItemCopyable())
return FALSE;
}
- }
- }
return TRUE;
}
BOOL LLInvFVBridge::isClipboardPasteableAsLink() const
{
- if (!LLInventoryClipboard::instance().hasContents() || !isAgentInventory())
+ if (!LLClipboard::instance().hasContents() || !isAgentInventory())
{
return FALSE;
}
@@ -417,7 +516,7 @@ BOOL LLInvFVBridge::isClipboardPasteableAsLink() const
}
LLDynamicArray<LLUUID> objects;
- LLInventoryClipboard::instance().retrieve(objects);
+ LLClipboard::instance().pasteFromClipboard(objects);
S32 count = objects.count();
for(S32 i = 0; i < count; i++)
{
@@ -440,14 +539,13 @@ BOOL LLInvFVBridge::isClipboardPasteableAsLink() const
void hide_context_entries(LLMenuGL& menu,
const menuentry_vec_t &entries_to_show,
- const menuentry_vec_t &disabled_entries,
- BOOL append) // If append is TRUE, then new enabled entries
+ const menuentry_vec_t &disabled_entries)
{
const LLView::child_list_t *list = menu.getChildList();
// For removing double separators or leading separator. Start at true so that
// if the first element is a separator, it will not be shown.
- BOOL is_previous_entry_separator = TRUE;
+ bool is_previous_entry_separator = true;
for (LLView::child_list_t::const_iterator itor = list->begin();
itor != list->end();
@@ -463,7 +561,6 @@ void hide_context_entries(LLMenuGL& menu,
hide_context_entries(*branchp->getBranch(), entries_to_show, disabled_entries);
}
-
bool found = false;
menuentry_vec_t::const_iterator itor2;
for (itor2 = entries_to_show.begin(); itor2 != entries_to_show.end(); ++itor2)
@@ -471,6 +568,7 @@ void hide_context_entries(LLMenuGL& menu,
if (*itor2 == name)
{
found = true;
+ break;
}
}
@@ -478,9 +576,8 @@ void hide_context_entries(LLMenuGL& menu,
// between two separators).
if (found)
{
- const BOOL is_entry_separator = (dynamic_cast<LLMenuItemSeparatorGL *>(menu_item) != NULL);
- if (is_entry_separator && is_previous_entry_separator)
- found = false;
+ const bool is_entry_separator = (dynamic_cast<LLMenuItemSeparatorGL *>(menu_item) != NULL);
+ found = !(is_entry_separator && is_previous_entry_separator);
is_previous_entry_separator = is_entry_separator;
}
@@ -490,6 +587,7 @@ void hide_context_entries(LLMenuGL& menu,
{
menu_item->setVisible(FALSE);
}
+
menu_item->setEnabled(FALSE);
}
else
@@ -498,17 +596,14 @@ void hide_context_entries(LLMenuGL& menu,
// A bit of a hack so we can remember that some UI element explicitly set this to be visible
// so that some other UI element from multi-select doesn't later set this invisible.
menu_item->pushVisible(TRUE);
- if (append)
- {
- menu_item->setEnabled(TRUE);
- }
- for (itor2 = disabled_entries.begin(); itor2 != disabled_entries.end(); ++itor2)
+
+ bool enabled = (menu_item->getEnabled() == TRUE);
+ for (itor2 = disabled_entries.begin(); enabled && (itor2 != disabled_entries.end()); ++itor2)
{
- if (*itor2 == name)
- {
- menu_item->setEnabled(FALSE);
- }
+ enabled &= (*itor2 != name);
}
+
+ menu_item->setEnabled(enabled);
}
}
}
@@ -536,10 +631,14 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id,
{
items.push_back(std::string("Find Links"));
}
- items.push_back(std::string("Rename"));
- if (!isItemRenameable() || (flags & FIRST_SELECTED_ITEM) == 0)
+
+ if (!isInboxFolder())
{
- disabled_items.push_back(std::string("Rename"));
+ items.push_back(std::string("Rename"));
+ if (!isItemRenameable() || (flags & FIRST_SELECTED_ITEM) == 0)
+ {
+ disabled_items.push_back(std::string("Rename"));
+ }
}
if (show_asset_id)
@@ -567,11 +666,28 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id,
{
disabled_items.push_back(std::string("Copy"));
}
+
+ items.push_back(std::string("Cut"));
+ if (!isItemMovable() || !isItemRemovable())
+ {
+ disabled_items.push_back(std::string("Cut"));
+ }
+
+ if (canListOnMarketplace())
+ {
+ items.push_back(std::string("Marketplace Separator"));
+
+ items.push_back(std::string("Merchant Copy"));
+ if (!canListOnMarketplaceNow())
+ {
+ disabled_items.push_back(std::string("Merchant Copy"));
+ }
+ }
}
}
- // Don't allow items to be pasted directly into the COF.
- if (!isCOFFolder())
+ // Don't allow items to be pasted directly into the COF or the inbox/outbox
+ if (!isCOFFolder() && !isInboxFolder() && !isOutboxFolder())
{
items.push_back(std::string("Paste"));
}
@@ -608,6 +724,10 @@ void LLInvFVBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
if(isItemInTrash())
{
addTrashContextMenuOptions(items, disabled_items);
+ }
+ else if(isOutboxFolder())
+ {
+ addOutboxContextMenuOptions(flags, items, disabled_items);
}
else
{
@@ -684,6 +804,32 @@ void LLInvFVBridge::addOpenRightClickMenuOption(menuentry_vec_t &items)
items.push_back(std::string("Open"));
}
+void LLInvFVBridge::addOutboxContextMenuOptions(U32 flags,
+ menuentry_vec_t &items,
+ menuentry_vec_t &disabled_items)
+{
+ items.push_back(std::string("Rename"));
+ items.push_back(std::string("Delete"));
+
+ if ((flags & FIRST_SELECTED_ITEM) == 0)
+ {
+ disabled_items.push_back(std::string("Rename"));
+ }
+
+#if ENABLE_MERCHANT_SEND_TO_MARKETPLACE_CONTEXT_MENU
+ if (isOutboxFolderDirectParent())
+ {
+ items.push_back(std::string("Marketplace Separator"));
+ items.push_back(std::string("Marketplace Send"));
+
+ if ((flags & FIRST_SELECTED_ITEM) == 0)
+ {
+ disabled_items.push_back(std::string("Marketplace Send"));
+ }
+ }
+#endif // ENABLE_MERCHANT_SEND_TO_MARKETPLACE_CONTEXT_MENU
+}
+
// *TODO: remove this
BOOL LLInvFVBridge::startDrag(EDragAndDropType* type, LLUUID* id) const
{
@@ -726,7 +872,7 @@ LLInventoryObject* LLInvFVBridge::getInventoryObject() const
LLInventoryModel* LLInvFVBridge::getInventoryModel() const
{
- LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get());
+ LLInventoryPanel* panel = mInventoryPanel.get();
return panel ? panel->getModel() : NULL;
}
@@ -780,6 +926,53 @@ BOOL LLInvFVBridge::isCOFFolder() const
return LLAppearanceMgr::instance().getIsInCOF(mUUID);
}
+BOOL LLInvFVBridge::isInboxFolder() const
+{
+ const LLUUID inbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_INBOX, false, false);
+
+ if (inbox_id.isNull())
+ {
+ return FALSE;
+ }
+
+ return gInventory.isObjectDescendentOf(mUUID, inbox_id);
+}
+
+BOOL LLInvFVBridge::isOutboxFolder() const
+{
+ const LLUUID outbox_id = getOutboxFolder();
+
+ if (outbox_id.isNull())
+ {
+ return FALSE;
+ }
+
+ return gInventory.isObjectDescendentOf(mUUID, outbox_id);
+}
+
+BOOL LLInvFVBridge::isOutboxFolderDirectParent() const
+{
+ BOOL outbox_is_parent = FALSE;
+
+ const LLInventoryCategory *cat = gInventory.getCategory(mUUID);
+
+ if (cat)
+ {
+ const LLUUID outbox_id = getOutboxFolder();
+
+ outbox_is_parent = (outbox_id.notNull() && (outbox_id == cat->getParentUUID()));
+ }
+
+ return outbox_is_parent;
+}
+
+const LLUUID LLInvFVBridge::getOutboxFolder() const
+{
+ const LLUUID outbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false, false);
+
+ return outbox_id;
+}
+
BOOL LLInvFVBridge::isItemPermissive() const
{
return FALSE;
@@ -791,7 +984,7 @@ void LLInvFVBridge::changeItemParent(LLInventoryModel* model,
const LLUUID& new_parent_id,
BOOL restamp)
{
- change_item_parent(model, item, new_parent_id, restamp);
+ model->changeItemParent(item, new_parent_id, restamp);
}
// static
@@ -800,7 +993,7 @@ void LLInvFVBridge::changeCategoryParent(LLInventoryModel* model,
const LLUUID& new_parent_id,
BOOL restamp)
{
- change_category_parent(model, cat, new_parent_id, restamp);
+ model->changeCategoryParent(cat, new_parent_id, restamp);
}
LLInvFVBridge* LLInvFVBridge::createBridge(LLAssetType::EType asset_type,
@@ -916,9 +1109,22 @@ LLInvFVBridge* LLInvFVBridge::createBridge(LLAssetType::EType asset_type,
// Only should happen for broken links.
new_listener = new LLLinkItemBridge(inventory, root, uuid);
break;
+ case LLAssetType::AT_MESH:
+ if(!(inv_type == LLInventoryType::IT_MESH))
+ {
+ llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << LLInventoryType::lookupHumanReadable(inv_type) << " on uuid " << uuid << llendl;
+ }
+ new_listener = new LLMeshBridge(inventory, root, uuid);
+ break;
+
+ case LLAssetType::AT_IMAGE_TGA:
+ case LLAssetType::AT_IMAGE_JPEG:
+ //llwarns << LLAssetType::lookup(asset_type) << " asset type is unhandled for uuid " << uuid << llendl;
+ break;
+
default:
llinfos << "Unhandled asset type (llassetstorage.h): "
- << (S32)asset_type << llendl;
+ << (S32)asset_type << " (" << LLAssetType::lookup(asset_type) << ")" << llendl;
break;
}
@@ -946,27 +1152,138 @@ void LLInvFVBridge::purgeItem(LLInventoryModel *model, const LLUUID &uuid)
}
}
-BOOL LLInvFVBridge::canShare() const
+bool LLInvFVBridge::canShare() const
{
- if (!isAgentInventory()) return FALSE;
+ bool can_share = false;
- const LLInventoryModel* model = getInventoryModel();
- if (!model) return FALSE;
+ if (isAgentInventory())
+ {
+ const LLInventoryModel* model = getInventoryModel();
+ if (model)
+ {
+ const LLViewerInventoryItem *item = model->getItem(mUUID);
+ if (item)
+ {
+ if (LLInventoryCollectFunctor::itemTransferCommonlyAllowed(item))
+ {
+ can_share = LLGiveInventory::isInventoryGiveAcceptable(item);
+ }
+ }
+ else
+ {
+ // Categories can be given.
+ can_share = (model->getCategory(mUUID) != NULL);
+ }
+ }
+ }
- const LLViewerInventoryItem *item = model->getItem(mUUID);
+ return can_share;
+}
+
+bool LLInvFVBridge::canListOnMarketplace() const
+{
+#if ENABLE_MERCHANT_OUTBOX_CONTEXT_MENU
+
+ LLInventoryModel * model = getInventoryModel();
+
+ const LLViewerInventoryCategory * cat = model->getCategory(mUUID);
+ if (cat && LLFolderType::lookupIsProtectedType(cat->getPreferredType()))
+ {
+ return false;
+ }
+
+ if (!isAgentInventory())
+ {
+ return false;
+ }
+
+ if (getOutboxFolder().isNull())
+ {
+ return false;
+ }
+
+ if (isInboxFolder() || isOutboxFolder())
+ {
+ return false;
+ }
+
+ LLViewerInventoryItem * item = model->getItem(mUUID);
if (item)
{
- if (!LLInventoryCollectFunctor::itemTransferCommonlyAllowed(item))
- return FALSE;
- return (BOOL)LLGiveInventory::isInventoryGiveAcceptable(item);
+ if (!item->getPermissions().allowOperationBy(PERM_TRANSFER, gAgent.getID()))
+ {
+ return false;
+ }
+
+ if (LLAssetType::AT_CALLINGCARD == item->getType())
+ {
+ return false;
+ }
}
- // Categories can be given.
- if (model->getCategory(mUUID)) return TRUE;
+ return true;
- return FALSE;
+#else
+ return false;
+#endif
}
+bool LLInvFVBridge::canListOnMarketplaceNow() const
+{
+#if ENABLE_MERCHANT_OUTBOX_CONTEXT_MENU
+
+ bool can_list = true;
+
+ // Do not allow listing while import is in progress
+ if (LLMarketplaceInventoryImporter::instanceExists())
+ {
+ can_list = !LLMarketplaceInventoryImporter::instance().isImportInProgress();
+ }
+
+ const LLInventoryObject* obj = getInventoryObject();
+ can_list &= (obj != NULL);
+
+ if (can_list)
+ {
+ const LLUUID& object_id = obj->getLinkedUUID();
+ can_list = object_id.notNull();
+
+ if (can_list)
+ {
+ LLFolderViewFolder * object_folderp = mRoot->getFolderByID(object_id);
+ if (object_folderp)
+ {
+ can_list = !object_folderp->isLoading();
+ }
+ }
+
+ if (can_list)
+ {
+ // Get outbox id
+ const LLUUID & outbox_id = getInventoryModel()->findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false);
+ LLFolderViewItem * outbox_itemp = mRoot->getItemByID(outbox_id);
+
+ if (outbox_itemp)
+ {
+ MASK mask = 0x0;
+ BOOL drop = FALSE;
+ EDragAndDropType cargo_type = LLViewerAssetType::lookupDragAndDropType(obj->getActualType());
+ void * cargo_data = (void *) obj;
+ std::string tooltip_msg;
+
+ can_list = outbox_itemp->getListener()->dragOrDrop(mask, drop, cargo_type, cargo_data, tooltip_msg);
+ }
+ }
+ }
+
+ return can_list;
+
+#else
+ return false;
+#endif
+}
+
+
// +=================================================+
// | InventoryFVBridgeBuilder |
// +=================================================+
@@ -1032,7 +1349,13 @@ void LLItemBridge::performAction(LLInventoryModel* model, std::string action)
std::string buffer;
asset_id.toString(buffer);
- gViewerWindow->mWindow->copyTextToClipboard(utf8str_to_wstring(buffer));
+ gViewerWindow->getWindow()->copyTextToClipboard(utf8str_to_wstring(buffer));
+ return;
+ }
+ else if ("cut" == action)
+ {
+ cutToClipboard();
+ LLFolderView::removeCutItems();
return;
}
else if ("copy" == action)
@@ -1042,7 +1365,6 @@ void LLItemBridge::performAction(LLInventoryModel* model, std::string action)
}
else if ("paste" == action)
{
- // Single item only
LLInventoryItem* itemp = model->getItem(mUUID);
if (!itemp) return;
@@ -1064,6 +1386,16 @@ void LLItemBridge::performAction(LLInventoryModel* model, std::string action)
folder_view_itemp->getListener()->pasteLinkFromClipboard();
return;
}
+ else if (isMarketplaceCopyAction(action))
+ {
+ llinfos << "Copy item to marketplace action!" << llendl;
+
+ LLInventoryItem* itemp = model->getItem(mUUID);
+ if (!itemp) return;
+
+ const LLUUID outbox_id = getInventoryModel()->findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false, false);
+ copy_item_to_outbox(itemp, outbox_id, LLUUID::null, LLToolDragAndDrop::getOperationId());
+ }
}
void LLItemBridge::selectItem()
@@ -1071,7 +1403,8 @@ void LLItemBridge::selectItem()
LLViewerInventoryItem* item = static_cast<LLViewerInventoryItem*>(getItem());
if(item && !item->isFinished())
{
- item->fetchFromServer();
+ //item->fetchFromServer();
+ LLInventoryModelBackgroundFetch::instance().start(item->getUUID(), false);
}
}
@@ -1204,7 +1537,7 @@ std::string LLItemBridge::getLabelSuffix() const
{
// String table is loaded before login screen and inventory items are
// loaded after login, so LLTrans should be ready.
- static std::string NO_COPY =LLTrans::getString("no_copy");
+ static std::string NO_COPY = LLTrans::getString("no_copy");
static std::string NO_MOD = LLTrans::getString("no_modify");
static std::string NO_XFER = LLTrans::getString("no_transfer");
static std::string LINK = LLTrans::getString("link");
@@ -1213,16 +1546,17 @@ std::string LLItemBridge::getLabelSuffix() const
LLInventoryItem* item = getItem();
if(item)
{
- // it's a bit confusing to put nocopy/nomod/etc on calling cards.
+ // Any type can have the link suffix...
+ BOOL broken_link = LLAssetType::lookupIsLinkType(item->getType());
+ if (broken_link) return BROKEN_LINK;
+
+ BOOL link = item->getIsLinkType();
+ if (link) return LINK;
+
+ // ...but it's a bit confusing to put nocopy/nomod/etc suffixes on calling cards.
if(LLAssetType::AT_CALLINGCARD != item->getType()
&& item->getPermissions().getOwner() == gAgent.getID())
{
- BOOL broken_link = LLAssetType::lookupIsLinkType(item->getType());
- if (broken_link) return BROKEN_LINK;
-
- BOOL link = item->getIsLinkType();
- if (link) return LINK;
-
BOOL copy = item->getPermissions().allowCopyBy(gAgent.getID());
if (!copy)
{
@@ -1272,6 +1606,11 @@ BOOL LLItemBridge::isItemRenameable() const
return FALSE;
}
+ if (isInboxFolder())
+ {
+ return FALSE;
+ }
+
return (item->getPermissions().allowModifyBy(gAgent.getID()));
}
return FALSE;
@@ -1395,21 +1734,7 @@ BOOL LLItemBridge::isItemCopyable() const
return FALSE;
}
- // All items can be copied in god mode since you can
- // at least paste-as-link the item, though you
- // still may not be able paste the item.
- return TRUE;
- // return (item->getPermissions().allowCopyBy(gAgent.getID()));
- }
- return FALSE;
-}
-
-BOOL LLItemBridge::copyToClipboard() const
-{
- if(isItemCopyable())
- {
- LLInventoryClipboard::instance().add(mUUID);
- return TRUE;
+ return item->getPermissions().allowCopyBy(gAgent.getID()) || gSavedSettings.getBOOL("InventoryLinking");
}
return FALSE;
}
@@ -1435,16 +1760,6 @@ BOOL LLItemBridge::isItemPermissive() const
return FALSE;
}
-bool LLItemBridge::isAddAction(std::string action) const
-{
- return ("wear" == action || "attach" == action || "activate" == action);
-}
-
-bool LLItemBridge::isRemoveAction(std::string action) const
-{
- return ("take_off" == action || "detach" == action || "deactivate" == action);
-}
-
// +=================================================+
// | LLFolderBridge |
// +=================================================+
@@ -1457,16 +1772,20 @@ BOOL LLFolderBridge::isItemMovable() const
LLInventoryObject* obj = getInventoryObject();
if(obj)
{
- return (!LLFolderType::lookupIsProtectedType(((LLInventoryCategory*)obj)->getPreferredType()));
+ // If it's a protected type folder, we can't move it
+ if (LLFolderType::lookupIsProtectedType(((LLInventoryCategory*)obj)->getPreferredType()))
+ return FALSE;
+ return TRUE;
}
return FALSE;
}
void LLFolderBridge::selectItem()
{
+ // Have no fear: the first thing start() does is to test if everything for that folder has been fetched...
+ LLInventoryModelBackgroundFetch::instance().start(getUUID(), true);
}
-
// Iterate through a folder's children to determine if
// all the children are removable.
class LLIsItemRemovable : public LLFolderViewFunctor
@@ -1492,7 +1811,7 @@ BOOL LLFolderBridge::isItemRemovable() const
return FALSE;
}
- LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get());
+ LLInventoryPanel* panel = mInventoryPanel.get();
LLFolderViewFolder* folderp = dynamic_cast<LLFolderViewFolder*>(panel ? panel->getRootFolder()->getItemByID(mUUID) : NULL);
if (folderp)
{
@@ -1522,23 +1841,35 @@ BOOL LLFolderBridge::isUpToDate() const
BOOL LLFolderBridge::isItemCopyable() const
{
- if (gSavedSettings.getBOOL("InventoryLinking"))
- {
- // Can copy folders to paste-as-link, but not for straight paste.
- return TRUE;
- }
- return FALSE;
+ // Folders are copyable if items in them are, recursively, copyable.
+
+ // Get the content of the folder
+ LLInventoryModel::cat_array_t* cat_array;
+ LLInventoryModel::item_array_t* item_array;
+ gInventory.getDirectDescendentsOf(mUUID,cat_array,item_array);
+
+ // Check the items
+ LLInventoryModel::item_array_t item_array_copy = *item_array;
+ for (LLInventoryModel::item_array_t::iterator iter = item_array_copy.begin(); iter != item_array_copy.end(); iter++)
+ {
+ LLInventoryItem* item = *iter;
+ LLItemBridge item_br(mInventoryPanel.get(), mRoot, item->getUUID());
+ if (!item_br.isItemCopyable())
+ return FALSE;
}
-BOOL LLFolderBridge::copyToClipboard() const
+ // Check the folders
+ LLInventoryModel::cat_array_t cat_array_copy = *cat_array;
+ for (LLInventoryModel::cat_array_t::iterator iter = cat_array_copy.begin(); iter != cat_array_copy.end(); iter++)
{
- if(isItemCopyable())
- {
- LLInventoryClipboard::instance().add(mUUID);
+ LLViewerInventoryCategory* category = *iter;
+ LLFolderBridge cat_br(mInventoryPanel.get(), mRoot, category->getUUID());
+ if (!cat_br.isItemCopyable())
+ return FALSE;
+ }
+
return TRUE;
}
- return FALSE;
-}
BOOL LLFolderBridge::isClipboardPasteable() const
{
@@ -1555,7 +1886,7 @@ BOOL LLFolderBridge::isClipboardPasteable() const
}
LLDynamicArray<LLUUID> objects;
- LLInventoryClipboard::instance().retrieve(objects);
+ LLClipboard::instance().pasteFromClipboard(objects);
const LLViewerInventoryCategory *current_cat = getCategory();
// Search for the direct descendent of current Friends subfolder among all pasted items,
@@ -1593,7 +1924,7 @@ BOOL LLFolderBridge::isClipboardPasteableAsLink() const
const BOOL is_in_friend_folder = LLFriendCardsManager::instance().isCategoryInFriendFolder( current_cat );
const LLUUID &current_cat_id = current_cat->getUUID();
LLDynamicArray<LLUUID> objects;
- LLInventoryClipboard::instance().retrieve(objects);
+ LLClipboard::instance().pasteFromClipboard(objects);
S32 count = objects.count();
for(S32 i = 0; i < count; i++)
{
@@ -1626,8 +1957,88 @@ BOOL LLFolderBridge::isClipboardPasteableAsLink() const
}
+static BOOL can_move_to_outbox(LLInventoryItem* inv_item, std::string& tooltip_msg)
+{
+ // Collapse links directly to items/folders
+ LLViewerInventoryItem * viewer_inv_item = (LLViewerInventoryItem *) inv_item;
+ LLViewerInventoryItem * linked_item = viewer_inv_item->getLinkedItem();
+ if (linked_item != NULL)
+ {
+ inv_item = linked_item;
+ }
+
+ bool allow_transfer = inv_item->getPermissions().allowOperationBy(PERM_TRANSFER, gAgent.getID());
+ if (!allow_transfer)
+ {
+ tooltip_msg = LLTrans::getString("TooltipOutboxNoTransfer");
+ return false;
+ }
+
+#if BLOCK_WORN_ITEMS_IN_OUTBOX
+ bool worn = get_is_item_worn(inv_item->getUUID());
+ if (worn)
+ {
+ tooltip_msg = LLTrans::getString("TooltipOutboxWorn");
+ return false;
+ }
+#endif
+
+ bool calling_card = (LLAssetType::AT_CALLINGCARD == inv_item->getType());
+ if (calling_card)
+ {
+ tooltip_msg = LLTrans::getString("TooltipOutboxCallingCard");
+ return false;
+ }
+
+ return true;
+}
+
+
+int get_folder_levels(LLInventoryCategory* inv_cat)
+{
+ LLInventoryModel::cat_array_t* cats;
+ LLInventoryModel::item_array_t* items;
+ gInventory.getDirectDescendentsOf(inv_cat->getUUID(), cats, items);
+
+ int max_child_levels = 0;
+
+ for (S32 i=0; i < cats->count(); ++i)
+ {
+ LLInventoryCategory* category = cats->get(i);
+ max_child_levels = llmax(max_child_levels, get_folder_levels(category));
+ }
+
+ return 1 + max_child_levels;
+}
+
+int get_folder_path_length(const LLUUID& ancestor_id, const LLUUID& descendant_id)
+{
+ int depth = 0;
+
+ if (ancestor_id == descendant_id) return depth;
+
+ const LLInventoryCategory* category = gInventory.getCategory(descendant_id);
+
+ while(category)
+ {
+ LLUUID parent_id = category->getParentUUID();
+
+ if (parent_id.isNull()) break;
+
+ depth++;
+
+ if (parent_id == ancestor_id) return depth;
+
+ category = gInventory.getCategory(parent_id);
+ }
+
+ llwarns << "get_folder_path_length() couldn't trace a path from the descendant to the ancestor" << llendl;
+ return -1;
+}
+
BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
- BOOL drop)
+ BOOL drop,
+ std::string& tooltip_msg)
{
LLInventoryModel* model = getInventoryModel();
@@ -1637,22 +2048,31 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
if (!isAgentAvatarValid()) return FALSE;
if (!isAgentInventory()) return FALSE; // cannot drag categories into library
+ LLInventoryPanel* destination_panel = mInventoryPanel.get();
+ if (!destination_panel) return false;
- // check to make sure source is agent inventory, and is represented there.
- LLToolDragAndDrop::ESource source = LLToolDragAndDrop::getInstance()->getSource();
- const BOOL is_agent_inventory = (model->getCategory(inv_cat->getUUID()) != NULL)
- && (LLToolDragAndDrop::SOURCE_AGENT == source);
+ LLInventoryFilter* filter = destination_panel->getFilter();
+ if (!filter) return false;
+ const LLUUID &cat_id = inv_cat->getUUID();
const LLUUID &current_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT, false);
+ const LLUUID &outbox_id = model->findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false);
+
const BOOL move_is_into_current_outfit = (mUUID == current_outfit_id);
+ const BOOL move_is_into_outbox = model->isObjectDescendentOf(mUUID, outbox_id);
+ const BOOL move_is_from_outbox = model->isObjectDescendentOf(cat_id, outbox_id);
+
+ // check to make sure source is agent inventory, and is represented there.
+ LLToolDragAndDrop::ESource source = LLToolDragAndDrop::getInstance()->getSource();
+ const BOOL is_agent_inventory = (model->getCategory(cat_id) != NULL)
+ && (LLToolDragAndDrop::SOURCE_AGENT == source);
BOOL accept = FALSE;
if (is_agent_inventory)
{
- const LLUUID &cat_id = inv_cat->getUUID();
const LLUUID &trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH, false);
const LLUUID &landmarks_id = model->findCategoryUUIDForType(LLFolderType::FT_LANDMARK, false);
-
+
const BOOL move_is_into_trash = (mUUID == trash_id) || model->isObjectDescendentOf(mUUID, trash_id);
const BOOL move_is_into_outfit = getCategory() && (getCategory()->getPreferredType() == LLFolderType::FT_OUTFIT);
const BOOL move_is_into_landmarks = (mUUID == landmarks_id) || model->isObjectDescendentOf(mUUID, landmarks_id);
@@ -1662,26 +2082,50 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
//
BOOL is_movable = TRUE;
- if (LLFolderType::lookupIsProtectedType(inv_cat->getPreferredType()))
+
+ if (is_movable && (mUUID == cat_id))
+ {
is_movable = FALSE;
- if (move_is_into_outfit)
+ tooltip_msg = LLTrans::getString("TooltipDragOntoSelf");
+ }
+ if (is_movable && (model->isObjectDescendentOf(mUUID, cat_id)))
+ {
+ is_movable = FALSE;
+ tooltip_msg = LLTrans::getString("TooltipDragOntoOwnChild");
+ }
+ if (is_movable && LLFolderType::lookupIsProtectedType(inv_cat->getPreferredType()))
+ {
+ is_movable = FALSE;
+ // tooltip?
+ }
+ if (is_movable && move_is_into_outfit)
+ {
is_movable = FALSE;
- if (mUUID == gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE))
+ // tooltip?
+ }
+ if (is_movable && (mUUID == model->findCategoryUUIDForType(LLFolderType::FT_FAVORITE)))
+ {
is_movable = FALSE;
+ // tooltip?
+ }
+
LLInventoryModel::cat_array_t descendent_categories;
LLInventoryModel::item_array_t descendent_items;
- gInventory.collectDescendents(cat_id, descendent_categories, descendent_items, FALSE);
- for (S32 i=0; i < descendent_categories.count(); ++i)
+ if (is_movable)
{
- LLInventoryCategory* category = descendent_categories[i];
- if(LLFolderType::lookupIsProtectedType(category->getPreferredType()))
+ model->collectDescendents(cat_id, descendent_categories, descendent_items, FALSE);
+ for (S32 i=0; i < descendent_categories.count(); ++i)
{
- // Can't move "special folders" (e.g. Textures Folder).
- is_movable = FALSE;
- break;
+ LLInventoryCategory* category = descendent_categories[i];
+ if(LLFolderType::lookupIsProtectedType(category->getPreferredType()))
+ {
+ // Can't move "special folders" (e.g. Textures Folder).
+ is_movable = FALSE;
+ break;
+ }
}
}
- if (move_is_into_trash)
+ if (is_movable && move_is_into_trash)
{
for (S32 i=0; i < descendent_items.count(); ++i)
{
@@ -1693,7 +2137,7 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
}
}
}
- if (move_is_into_landmarks)
+ if (is_movable && move_is_into_landmarks)
{
for (S32 i=0; i < descendent_items.count(); ++i)
{
@@ -1708,14 +2152,133 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
}
}
}
+ if (is_movable && move_is_into_outbox)
+ {
+ const int nested_folder_levels = get_folder_path_length(outbox_id, mUUID) + get_folder_levels(inv_cat);
+
+ if (nested_folder_levels > gSavedSettings.getU32("InventoryOutboxMaxFolderDepth"))
+ {
+ tooltip_msg = LLTrans::getString("TooltipOutboxFolderLevels");
+ is_movable = FALSE;
+ }
+ else
+ {
+ int dragged_folder_count = descendent_categories.count();
+ int existing_item_count = 0;
+ int existing_folder_count = 0;
+
+ const LLViewerInventoryCategory * master_folder = model->getFirstDescendantOf(outbox_id, mUUID);
+
+ if (master_folder != NULL)
+ {
+ if (model->isObjectDescendentOf(cat_id, master_folder->getUUID()))
+ {
+ // Don't use count because we're already inside the same category anyway
+ dragged_folder_count = 0;
+ }
+ else
+ {
+ existing_folder_count = 1; // Include the master folder in the count!
+
+ // If we're in the drop operation as opposed to the drag without drop, we are doing a
+ // single category at a time so don't block based on the total amount of cargo data items
+ if (drop)
+ {
+ dragged_folder_count += 1;
+ }
+ else
+ {
+ // NOTE: The cargo id's count is a total of categories AND items but we err on the side of
+ // prevention rather than letting too many folders into the hierarchy of the outbox,
+ // when we're dragging the item to a new parent
+ dragged_folder_count += LLToolDragAndDrop::instance().getCargoCount();
+ }
+ }
+
+ // Tally the total number of categories and items inside the master folder
+
+ LLInventoryModel::cat_array_t existing_categories;
+ LLInventoryModel::item_array_t existing_items;
+
+ model->collectDescendents(master_folder->getUUID(), existing_categories, existing_items, FALSE);
+
+ existing_folder_count += existing_categories.count();
+ existing_item_count += existing_items.count();
+ }
+ else
+ {
+ // Assume a single category is being dragged to the outbox since we evaluate one at a time
+ // when not putting them under a parent item.
+ dragged_folder_count += 1;
+ }
+
+ const int nested_folder_count = existing_folder_count + dragged_folder_count;
+ const int nested_item_count = existing_item_count + descendent_items.count();
+
+ if (nested_folder_count > gSavedSettings.getU32("InventoryOutboxMaxFolderCount"))
+ {
+ tooltip_msg = LLTrans::getString("TooltipOutboxTooManyFolders");
+ is_movable = FALSE;
+ }
+ else if (nested_item_count > gSavedSettings.getU32("InventoryOutboxMaxItemCount"))
+ {
+ tooltip_msg = LLTrans::getString("TooltipOutboxTooManyObjects");
+ is_movable = FALSE;
+ }
+
+ if (is_movable == TRUE)
+ {
+ for (S32 i=0; i < descendent_items.count(); ++i)
+ {
+ LLInventoryItem* item = descendent_items[i];
+ if (!can_move_to_outbox(item, tooltip_msg))
+ {
+ is_movable = FALSE;
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ if (is_movable)
+ {
+ LLInventoryPanel* active_panel = LLInventoryPanel::getActiveInventoryPanel(FALSE);
+ is_movable = active_panel != NULL;
+ // For a folder to pass the filter all its descendants are required to pass.
+ // We make this exception to allow reordering folders within an inventory panel,
+ // which has a filter applied, like Recent tab for example.
+ // There may be folders which are displayed because some of their descendants pass
+ // the filter, but other don't, and thus remain hidden. Without this check,
+ // such folders would not be allowed to be moved within a panel.
+ if (destination_panel == active_panel)
+ {
+ is_movable = true;
+ }
+ else
+ {
+ LLFolderView* active_folder_view = NULL;
+
+ if (is_movable)
+ {
+ active_folder_view = active_panel->getRootFolder();
+ is_movable = active_folder_view != NULL;
+ }
+
+ if (is_movable)
+ {
+ // Check whether the folder being dragged from active inventory panel
+ // passes the filter of the destination panel.
+ is_movable = check_category(model, cat_id, active_folder_view, filter);
+ }
+ }
+ }
//
//--------------------------------------------------------------------------------
- accept = is_movable
- && (mUUID != cat_id) // Can't move a folder into itself
- && (mUUID != inv_cat->getParentUUID()) // Avoid moves that would change nothing
- && !(model->isObjectDescendentOf(mUUID, cat_id)); // Avoid circularity
+ accept = is_movable;
+
if (accept && drop)
{
// Look for any gestures and deactivate them
@@ -1747,7 +2310,7 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
// Recursively create links in target outfit.
LLInventoryModel::cat_array_t cats;
LLInventoryModel::item_array_t items;
- gInventory.collectDescendents(inv_cat->getUUID(), cats, items, LLInventoryModel::EXCLUDE_TRASH);
+ model->collectDescendents(cat_id, cats, items, LLInventoryModel::EXCLUDE_TRASH);
LLAppearanceMgr::instance().linkAll(mUUID,items,NULL);
}
}
@@ -1765,7 +2328,7 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
const std::string empty_description = "";
link_inventory_item(
gAgent.getID(),
- inv_cat->getUUID(),
+ cat_id,
mUUID,
inv_cat->getName(),
empty_description,
@@ -1775,8 +2338,16 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
#endif
}
}
+ else if (move_is_into_outbox && !move_is_from_outbox)
+ {
+ copy_folder_to_outbox(inv_cat, mUUID, cat_id, LLToolDragAndDrop::getOperationId());
+ }
else
{
+ if (model->isObjectDescendentOf(cat_id, model->findCategoryUUIDForType(LLFolderType::FT_INBOX, false, false)))
+ {
+ set_dad_inbox_object(cat_id);
+ }
// Reparent the folder and restamp children if it's moving
// into trash.
@@ -1790,15 +2361,28 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
}
else if (LLToolDragAndDrop::SOURCE_WORLD == source)
{
- // content category has same ID as object itself
- LLUUID object_id = inv_cat->getUUID();
- LLUUID category_id = mUUID;
- accept = move_inv_category_world_to_agent(object_id, category_id, drop);
+ if (move_is_into_outbox)
+ {
+ tooltip_msg = LLTrans::getString("TooltipOutboxNotInInventory");
+ accept = FALSE;
+ }
+ else
+ {
+ accept = move_inv_category_world_to_agent(cat_id, mUUID, drop, NULL, NULL, filter);
+ }
}
else if (LLToolDragAndDrop::SOURCE_LIBRARY == source)
{
- // Accept folders that contain complete outfits.
- accept = move_is_into_current_outfit && LLAppearanceMgr::instance().getCanMakeFolderIntoOutfit(inv_cat->getUUID());
+ if (move_is_into_outbox)
+ {
+ tooltip_msg = LLTrans::getString("TooltipOutboxNotInInventory");
+ accept = FALSE;
+ }
+ else
+ {
+ // Accept folders that contain complete outfits.
+ accept = move_is_into_current_outfit && LLAppearanceMgr::instance().getCanMakeFolderIntoOutfit(cat_id);
+ }
if (accept && drop)
{
@@ -1829,7 +2413,8 @@ BOOL move_inv_category_world_to_agent(const LLUUID& object_id,
const LLUUID& category_id,
BOOL drop,
void (*callback)(S32, void*),
- void* user_data)
+ void* user_data,
+ LLInventoryFilter* filter)
{
// Make sure the object exists. If we allowed dragging from
// anonymous objects, it would be possible to bypass
@@ -1853,7 +2438,7 @@ BOOL move_inv_category_world_to_agent(const LLUUID& object_id,
return FALSE;
}
- BOOL accept = TRUE;
+ BOOL accept = FALSE;
BOOL is_move = FALSE;
// coming from a task. Need to figure out if the person can
@@ -1862,9 +2447,16 @@ BOOL move_inv_category_world_to_agent(const LLUUID& object_id,
LLInventoryObject::object_list_t::iterator end = inventory_objects.end();
for ( ; it != end; ++it)
{
+ LLInventoryItem* item = dynamic_cast<LLInventoryItem*>(it->get());
+ if (!item)
+ {
+ llwarns << "Invalid inventory item for drop" << llendl;
+ continue;
+ }
+
// coming from a task. Need to figure out if the person can
// move/copy this item.
- LLPermissions perm(((LLInventoryItem*)((LLInventoryObject*)(*it)))->getPermissions());
+ LLPermissions perm(item->getPermissions());
if((perm.allowCopyBy(gAgent.getID(), gAgent.getGroupID())
&& perm.allowTransferTo(gAgent.getID())))
// || gAgent.isGodlike())
@@ -1879,9 +2471,14 @@ BOOL move_inv_category_world_to_agent(const LLUUID& object_id,
is_move = TRUE;
accept = TRUE;
}
- else
+
+ if (filter && accept)
+ {
+ accept = filter->check(item);
+ }
+
+ if (!accept)
{
- accept = FALSE;
break;
}
}
@@ -1917,122 +2514,114 @@ BOOL move_inv_category_world_to_agent(const LLUUID& object_id,
return accept;
}
-//Used by LLFolderBridge as callback for directory recursion.
-class LLRightClickInventoryFetchObserver : public LLInventoryFetchItemsObserver
+void LLRightClickInventoryFetchDescendentsObserver::execute(bool clear_observer)
{
-public:
- LLRightClickInventoryFetchObserver(const uuid_vec_t& ids) :
- LLInventoryFetchItemsObserver(ids),
- mCopyItems(false)
- { };
- LLRightClickInventoryFetchObserver(const uuid_vec_t& ids,
- const LLUUID& cat_id,
- bool copy_items) :
- LLInventoryFetchItemsObserver(ids),
- mCatID(cat_id),
- mCopyItems(copy_items)
- { };
- virtual void done()
- {
- // we've downloaded all the items, so repaint the dialog
- LLFolderBridge::staticFolderOptionsMenu();
-
- gInventory.removeObserver(this);
- delete this;
- }
-
-
-protected:
- LLUUID mCatID;
- bool mCopyItems;
-
-};
-
-//Used by LLFolderBridge as callback for directory recursion.
-class LLRightClickInventoryFetchDescendentsObserver : public LLInventoryFetchDescendentsObserver
-{
-public:
- LLRightClickInventoryFetchDescendentsObserver(const uuid_vec_t& ids,
- bool copy_items) :
- LLInventoryFetchDescendentsObserver(ids),
- mCopyItems(copy_items)
- {}
- ~LLRightClickInventoryFetchDescendentsObserver() {}
- virtual void done();
-protected:
- bool mCopyItems;
-};
-
-void LLRightClickInventoryFetchDescendentsObserver::done()
-{
- // Avoid passing a NULL-ref as mCompleteFolders.front() down to
- // gInventory.collectDescendents()
+ // Bail out immediately if no descendents
if( mComplete.empty() )
{
llwarns << "LLRightClickInventoryFetchDescendentsObserver::done with empty mCompleteFolders" << llendl;
+ if (clear_observer)
+ {
dec_busy_count();
gInventory.removeObserver(this);
delete this;
+ }
return;
}
- // What we do here is get the complete information on the items in
- // the library, and set up an observer that will wait for that to
- // happen.
- LLInventoryModel::cat_array_t cat_array;
- LLInventoryModel::item_array_t item_array;
- gInventory.collectDescendents(mComplete.front(),
- cat_array,
- item_array,
- LLInventoryModel::EXCLUDE_TRASH);
- S32 count = item_array.count();
-#if 0 // HACK/TODO: Why?
- // This early causes a giant menu to get produced, and doesn't seem to be needed.
- if(!count)
- {
- llwarns << "Nothing fetched in category " << mCompleteFolders.front()
- << llendl;
+ // Copy the list of complete fetched folders while "this" is still valid
+ uuid_vec_t completed_folder = mComplete;
+
+ // Clean up, and remove this as an observer now since recursive calls
+ // could notify observers and throw us into an infinite loop.
+ if (clear_observer)
+ {
dec_busy_count();
gInventory.removeObserver(this);
delete this;
- return;
}
-#endif
- uuid_vec_t ids;
- for(S32 i = 0; i < count; ++i)
+ for (uuid_vec_t::iterator current_folder = completed_folder.begin(); current_folder != completed_folder.end(); ++current_folder)
{
- ids.push_back(item_array.get(i)->getUUID());
- }
+ // Get the information on the fetched folder items and subfolders and fetch those
+ LLInventoryModel::cat_array_t* cat_array;
+ LLInventoryModel::item_array_t* item_array;
+ gInventory.getDirectDescendentsOf(*current_folder, cat_array, item_array);
- LLRightClickInventoryFetchObserver* outfit = new LLRightClickInventoryFetchObserver(ids, mComplete.front(), mCopyItems);
+ S32 item_count = item_array->count();
+ S32 cat_count = cat_array->count();
+
+ // Move to next if current folder empty
+ if ((item_count == 0) && (cat_count == 0))
+ {
+ continue;
+ }
- // clean up, and remove this as an observer since the call to the
- // outfit could notify observers and throw us into an infinite
- // loop.
- dec_busy_count();
- gInventory.removeObserver(this);
- delete this;
+ uuid_vec_t ids;
+ LLRightClickInventoryFetchObserver* outfit = NULL;
+ LLRightClickInventoryFetchDescendentsObserver* categories = NULL;
- // increment busy count and either tell the inventory to check &
- // call done, or add this object to the inventory for observation.
- inc_busy_count();
+ // Fetch the items
+ if (item_count)
+ {
+ for (S32 i = 0; i < item_count; ++i)
+ {
+ ids.push_back(item_array->get(i)->getUUID());
+ }
+ outfit = new LLRightClickInventoryFetchObserver(ids);
+ }
+ // Fetch the subfolders
+ if (cat_count)
+ {
+ for (S32 i = 0; i < cat_count; ++i)
+ {
+ ids.push_back(cat_array->get(i)->getUUID());
+ }
+ categories = new LLRightClickInventoryFetchDescendentsObserver(ids);
+ }
- // do the fetch
+ // Perform the item fetch
+ if (outfit)
+ {
outfit->startFetch();
- outfit->done(); //Not interested in waiting and this will be right 99% of the time.
+ outfit->execute(); // Not interested in waiting and this will be right 99% of the time.
+ delete outfit;
//Uncomment the following code for laggy Inventory UI.
-/* if(outfit->isFinished())
+ /*
+ if (outfit->isFinished())
{
// everything is already here - call done.
- outfit->done();
+ outfit->execute();
+ delete outfit;
}
else
{
- // it's all on it's way - add an observer, and the inventory
+ // it's all on its way - add an observer, and the inventory
// will call done for us when everything is here.
+ inc_busy_count();
gInventory.addObserver(outfit);
- }*/
+ }
+ */
+ }
+ // Perform the subfolders fetch : this is where we truly recurse down the folder hierarchy
+ if (categories)
+ {
+ categories->startFetch();
+ if (categories->isFinished())
+ {
+ // everything is already here - call done.
+ categories->execute();
+ delete categories;
+ }
+ else
+ {
+ // it's all on its way - add an observer, and the inventory
+ // will call done for us when everything is here.
+ inc_busy_count();
+ gInventory.addObserver(categories);
+ }
+ }
+ }
}
@@ -2045,15 +2634,15 @@ void LLRightClickInventoryFetchDescendentsObserver::done()
class LLInventoryCopyAndWearObserver : public LLInventoryObserver
{
public:
- LLInventoryCopyAndWearObserver(const LLUUID& cat_id, int count) :
- mCatID(cat_id), mContentsCount(count), mFolderAdded(FALSE) {}
+ LLInventoryCopyAndWearObserver(const LLUUID& cat_id, int count, bool folder_added=false) :
+ mCatID(cat_id), mContentsCount(count), mFolderAdded(folder_added) {}
virtual ~LLInventoryCopyAndWearObserver() {}
virtual void changed(U32 mask);
protected:
LLUUID mCatID;
int mContentsCount;
- BOOL mFolderAdded;
+ bool mFolderAdded;
};
@@ -2081,7 +2670,6 @@ void LLInventoryCopyAndWearObserver::changed(U32 mask)
if (mFolderAdded)
{
LLViewerInventoryCategory* category = gInventory.getCategory(mCatID);
-
if (NULL == category)
{
llwarns << "gInventory.getCategory(" << mCatID
@@ -2152,6 +2740,12 @@ void LLFolderBridge::performAction(LLInventoryModel* model, std::string action)
modifyOutfit(TRUE);
return;
}
+ else if ("cut" == action)
+ {
+ cutToClipboard();
+ LLFolderView::removeCutItems();
+ return;
+ }
else if ("copy" == action)
{
copyToClipboard();
@@ -2183,6 +2777,27 @@ void LLFolderBridge::performAction(LLInventoryModel* model, std::string action)
removeSystemFolder();
}
#endif
+ else if (isMarketplaceCopyAction(action))
+ {
+ llinfos << "Copy folder to marketplace action!" << llendl;
+
+ LLInventoryCategory * cat = gInventory.getCategory(mUUID);
+ if (!cat) return;
+
+ const LLUUID outbox_id = getInventoryModel()->findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false, false);
+ copy_folder_to_outbox(cat, outbox_id, cat->getUUID(), LLToolDragAndDrop::getOperationId());
+ }
+#if ENABLE_MERCHANT_SEND_TO_MARKETPLACE_CONTEXT_MENU
+ else if (isMarketplaceSendAction(action))
+ {
+ llinfos << "Send to marketplace action!" << llendl;
+
+ LLInventoryCategory * cat = gInventory.getCategory(mUUID);
+ if (!cat) return;
+
+ send_to_marketplace(cat);
+ }
+#endif // ENABLE_MERCHANT_SEND_TO_MARKETPLACE_CONTEXT_MENU
}
void LLFolderBridge::openItem()
@@ -2265,6 +2880,9 @@ LLUIImagePtr LLFolderBridge::getIcon() const
LLUIImagePtr LLFolderBridge::getIcon(LLFolderType::EType preferred_type)
{
return LLUI::getUIImage(LLViewerFolderType::lookupIconName(preferred_type, FALSE));
+ /*case LLAssetType::AT_MESH:
+ control = "inv_folder_mesh.tga";
+ break;*/
}
LLUIImagePtr LLFolderBridge::getOpenIcon() const
@@ -2330,7 +2948,7 @@ bool LLFolderBridge::removeItemResponse(const LLSD& notification, const LLSD& re
{
// move it to the trash
LLPreview::hide(mUUID);
- remove_category(getInventoryModel(), mUUID);
+ getInventoryModel()->removeCategory(mUUID);
return TRUE;
}
return FALSE;
@@ -2341,22 +2959,89 @@ void LLFolderBridge::pasteFromClipboard()
LLInventoryModel* model = getInventoryModel();
if(model && isClipboardPasteable())
{
- const LLUUID parent_id(mUUID);
+ const LLUUID &current_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT, false);
+ const LLUUID &outbox_id = model->findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false);
+
+ const BOOL move_is_into_current_outfit = (mUUID == current_outfit_id);
+ const BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT);
+ const BOOL move_is_into_outbox = model->isObjectDescendentOf(mUUID, outbox_id);
LLDynamicArray<LLUUID> objects;
- LLInventoryClipboard::instance().retrieve(objects);
+ LLClipboard::instance().pasteFromClipboard(objects);
+
+ if (move_is_into_outbox)
+ {
+ LLFolderViewItem * outbox_itemp = mRoot->getItemByID(mUUID);
+
+ if (outbox_itemp)
+ {
+ LLToolDragAndDrop::instance().setCargoCount(objects.size());
+
+ BOOL can_list = TRUE;
+
+ for (LLDynamicArray<LLUUID>::const_iterator iter = objects.begin();
+ (iter != objects.end()) && (can_list == TRUE);
+ ++iter)
+ {
+ const LLUUID& item_id = (*iter);
+ LLInventoryItem *item = model->getItem(item_id);
+
+ if (item)
+ {
+ MASK mask = 0x0;
+ BOOL drop = FALSE;
+ EDragAndDropType cargo_type = LLViewerAssetType::lookupDragAndDropType(item->getActualType());
+ void * cargo_data = (void *) item;
+ std::string tooltip_msg;
+
+ can_list = outbox_itemp->getListener()->dragOrDrop(mask, drop, cargo_type, cargo_data, tooltip_msg);
+ }
+ }
+
+ LLToolDragAndDrop::instance().resetCargoCount();
+
+ if (can_list == FALSE)
+ {
+ // Notify user of failure somehow -- play error sound? modal dialog?
+ return;
+ }
+ }
+ }
+
+ const LLUUID parent_id(mUUID);
+
for (LLDynamicArray<LLUUID>::const_iterator iter = objects.begin();
iter != objects.end();
++iter)
{
const LLUUID& item_id = (*iter);
+
LLInventoryItem *item = model->getItem(item_id);
- if (item)
+ LLInventoryObject *obj = model->getObject(item_id);
+ if (obj)
{
- if(LLInventoryClipboard::instance().isCutMode())
+ if (move_is_into_current_outfit || move_is_into_outfit)
+ {
+ if (can_move_to_outfit(item, move_is_into_current_outfit))
+ {
+ dropToOutfit(item, move_is_into_current_outfit);
+ }
+ }
+ else if (LLClipboard::instance().isCutMode())
+ {
+ // Do a move to "paste" a "cut"
+ // move_inventory_item() is not enough, as we have to update inventory locally too
+ if (LLAssetType::AT_CATEGORY == obj->getType())
+ {
+ LLViewerInventoryCategory* vicat = (LLViewerInventoryCategory *) model->getCategory(item_id);
+ llassert(vicat);
+ if (vicat)
+ {
+ changeCategoryParent(model, vicat, parent_id, FALSE);
+ }
+ }
+ else
{
- // move_inventory_item() is not enough,
- //we have to update inventory locally too
LLViewerInventoryItem* viitem = dynamic_cast<LLViewerInventoryItem*>(item);
llassert(viitem);
if (viitem)
@@ -2364,6 +3049,19 @@ void LLFolderBridge::pasteFromClipboard()
changeItemParent(model, viitem, parent_id, FALSE);
}
}
+ }
+ else
+ {
+ // Do a "copy" to "paste" a regular copy clipboard
+ if (LLAssetType::AT_CATEGORY == obj->getType())
+ {
+ LLViewerInventoryCategory* vicat = (LLViewerInventoryCategory *) model->getCategory(item_id);
+ llassert(vicat);
+ if (vicat)
+ {
+ copy_inventory_category(model, vicat, parent_id);
+ }
+ }
else
{
copy_inventory_item(
@@ -2377,23 +3075,47 @@ void LLFolderBridge::pasteFromClipboard()
}
}
}
+ // Change mode to paste for next paste
+ LLClipboard::instance().setCutMode(false);
+ }
}
void LLFolderBridge::pasteLinkFromClipboard()
{
- const LLInventoryModel* model = getInventoryModel();
+ LLInventoryModel* model = getInventoryModel();
if(model)
{
+ const LLUUID &current_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT, false);
+ const LLUUID &outbox_id = model->findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false);
+
+ const BOOL move_is_into_current_outfit = (mUUID == current_outfit_id);
+ const BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT);
+ const BOOL move_is_into_outbox = model->isObjectDescendentOf(mUUID, outbox_id);
+
+ if (move_is_into_outbox)
+ {
+ // Notify user of failure somehow -- play error sound? modal dialog?
+ return;
+ }
+
const LLUUID parent_id(mUUID);
LLDynamicArray<LLUUID> objects;
- LLInventoryClipboard::instance().retrieve(objects);
+ LLClipboard::instance().pasteFromClipboard(objects);
for (LLDynamicArray<LLUUID>::const_iterator iter = objects.begin();
iter != objects.end();
++iter)
{
const LLUUID &object_id = (*iter);
- if (LLInventoryCategory *cat = model->getCategory(object_id))
+ if (move_is_into_current_outfit || move_is_into_outfit)
+ {
+ LLInventoryItem *item = model->getItem(object_id);
+ if (item && can_move_to_outfit(item, move_is_into_current_outfit))
+ {
+ dropToOutfit(item, move_is_into_current_outfit);
+ }
+ }
+ else if (LLInventoryCategory *cat = model->getCategory(object_id))
{
const std::string empty_description = "";
link_inventory_item(
@@ -2417,104 +3139,18 @@ void LLFolderBridge::pasteLinkFromClipboard()
LLPointer<LLInventoryCallback>(NULL));
}
}
+ // Change mode to paste for next paste
+ LLClipboard::instance().setCutMode(false);
}
}
void LLFolderBridge::staticFolderOptionsMenu()
{
LLFolderBridge* selfp = sSelf.get();
- if (selfp)
- {
- selfp->folderOptionsMenu();
- }
-}
-void LLFolderBridge::folderOptionsMenu()
-{
- menuentry_vec_t disabled_items;
-
- LLInventoryModel* model = getInventoryModel();
- if(!model) return;
-
- const LLInventoryCategory* category = model->getCategory(mUUID);
- if(!category) return;
-
- const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
- if (trash_id == mUUID) return;
- if (isItemInTrash()) return;
- if (!isAgentInventory()) return;
-
- LLFolderType::EType type = category->getPreferredType();
- const bool is_system_folder = LLFolderType::lookupIsProtectedType(type);
- // BAP change once we're no longer treating regular categories as ensembles.
- const bool is_ensemble = (type == LLFolderType::FT_NONE ||
- LLFolderType::lookupIsEnsembleType(type));
-
- // Only enable calling-card related options for non-system folders.
- if (!is_system_folder)
- {
- LLIsType is_callingcard(LLAssetType::AT_CALLINGCARD);
- if (mCallingCards || checkFolderForContentsOfType(model, is_callingcard))
- {
- mItems.push_back(std::string("Calling Card Separator"));
- mItems.push_back(std::string("Conference Chat Folder"));
- mItems.push_back(std::string("IM All Contacts In Folder"));
- }
- }
-
-#ifndef LL_RELEASE_FOR_DOWNLOAD
- if (LLFolderType::lookupIsProtectedType(type))
- {
- mItems.push_back(std::string("Delete System Folder"));
- }
-#endif
-
- // wearables related functionality for folders.
- //is_wearable
- LLFindWearables is_wearable;
- LLIsType is_object( LLAssetType::AT_OBJECT );
- LLIsType is_gesture( LLAssetType::AT_GESTURE );
-
- if (mWearables ||
- checkFolderForContentsOfType(model, is_wearable) ||
- checkFolderForContentsOfType(model, is_object) ||
- checkFolderForContentsOfType(model, is_gesture) )
- {
- mItems.push_back(std::string("Folder Wearables Separator"));
-
- // Only enable add/replace outfit for non-system folders.
- if (!is_system_folder)
- {
- // Adding an outfit onto another (versus replacing) doesn't make sense.
- if (type != LLFolderType::FT_OUTFIT)
- {
- mItems.push_back(std::string("Add To Outfit"));
- }
- mItems.push_back(std::string("Replace Outfit"));
- }
- if (is_ensemble)
- {
- mItems.push_back(std::string("Wear As Ensemble"));
- }
- mItems.push_back(std::string("Remove From Outfit"));
- if (!LLAppearanceMgr::getCanRemoveFromCOF(mUUID))
- {
- disabled_items.push_back(std::string("Remove From Outfit"));
- }
- if (!LLAppearanceMgr::instance().getCanReplaceCOF(mUUID))
- {
- disabled_items.push_back(std::string("Replace Outfit"));
- }
- mItems.push_back(std::string("Outfit Separator"));
- }
- LLMenuGL* menup = dynamic_cast<LLMenuGL*>(mMenu.get());
- if (menup)
+ if (selfp && selfp->mRoot)
{
- hide_context_entries(*menup, mItems, disabled_items, TRUE);
-
- // Reposition the menu, in case we're adding items to an existing menu.
- menup->needsArrange();
- menup->arrangeAndClear();
+ selfp->mRoot->updateMenu();
}
}
@@ -2530,17 +3166,11 @@ BOOL LLFolderBridge::checkFolderForContentsOfType(LLInventoryModel* model, LLInv
return ((item_array.count() > 0) ? TRUE : FALSE );
}
-// Flags unused
-void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
+void LLFolderBridge::buildContextMenuBaseOptions(U32 flags)
{
- mItems.clear();
- mDisabledItems.clear();
-
- lldebugs << "LLFolderBridge::buildContextMenu()" << llendl;
-
-// menuentry_vec_t disabled_items;
LLInventoryModel* model = getInventoryModel();
- if(!model) return;
+ llassert(model != NULL);
+
const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
const LLUUID lost_and_found_id = model->findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND);
@@ -2557,10 +3187,6 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
mDisabledItems.push_back(std::string("New Body Parts"));
}
- // clear out old menu and folder pointers
- mMenu.markDead();
- sSelf.markDead();
-
if(trash_id == mUUID)
{
// This is the trash.
@@ -2572,22 +3198,31 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
mItems.clear(); // clear any items that used to exist
addTrashContextMenuOptions(mItems, mDisabledItems);
}
+ else if(isOutboxFolder())
+ {
+ addOutboxContextMenuOptions(flags, mItems, mDisabledItems);
+ }
else if(isAgentInventory()) // do not allow creating in library
{
- LLViewerInventoryCategory *cat = getCategory();
+ LLViewerInventoryCategory *cat = getCategory();
// BAP removed protected check to re-enable standard ops in untyped folders.
// Not sure what the right thing is to do here.
if (!isCOFFolder() && cat && (cat->getPreferredType() != LLFolderType::FT_OUTFIT))
{
- // Do not allow to create 2-level subfolder in the Calling Card/Friends folder. EXT-694.
- if (!LLFriendCardsManager::instance().isCategoryInFriendFolder(cat))
- mItems.push_back(std::string("New Folder"));
- mItems.push_back(std::string("New Script"));
- mItems.push_back(std::string("New Note"));
- mItems.push_back(std::string("New Gesture"));
- mItems.push_back(std::string("New Clothes"));
- mItems.push_back(std::string("New Body Parts"));
+ if (!isInboxFolder() && !isOutboxFolder()) // don't allow creation in inbox or outbox
+ {
+ // Do not allow to create 2-level subfolder in the Calling Card/Friends folder. EXT-694.
+ if (!LLFriendCardsManager::instance().isCategoryInFriendFolder(cat))
+ {
+ mItems.push_back(std::string("New Folder"));
+ }
+ mItems.push_back(std::string("New Script"));
+ mItems.push_back(std::string("New Note"));
+ mItems.push_back(std::string("New Gesture"));
+ mItems.push_back(std::string("New Clothes"));
+ mItems.push_back(std::string("New Body Parts"));
+ }
#if SUPPORT_ENSEMBLES
// Changing folder types is an unfinished unsupported feature
// and can lead to unexpected behavior if enabled.
@@ -2644,39 +3279,149 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
mDisabledItems.push_back(std::string("Delete System Folder"));
}
- mItems.push_back(std::string("Share"));
- if (!canShare())
+ if (!isOutboxFolder())
{
- mDisabledItems.push_back(std::string("Share"));
+ mItems.push_back(std::string("Share"));
+ if (!canShare())
+ {
+ mDisabledItems.push_back(std::string("Share"));
+ }
}
+}
- hide_context_entries(menu, mItems, mDisabledItems);
+void LLFolderBridge::buildContextMenuFolderOptions(U32 flags)
+{
+ // Build folder specific options back up
+ LLInventoryModel* model = getInventoryModel();
+ if(!model) return;
- // Add menu items that are dependent on the contents of the folder.
- uuid_vec_t folders;
- LLViewerInventoryCategory* category = (LLViewerInventoryCategory*)model->getCategory(mUUID);
- if (category)
+ const LLInventoryCategory* category = model->getCategory(mUUID);
+ if(!category) return;
+
+ const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
+ if (trash_id == mUUID) return;
+ if (isItemInTrash()) return;
+ if (!isAgentInventory()) return;
+ if (isOutboxFolder()) return;
+
+ LLFolderType::EType type = category->getPreferredType();
+ const bool is_system_folder = LLFolderType::lookupIsProtectedType(type);
+ // BAP change once we're no longer treating regular categories as ensembles.
+ const bool is_ensemble = (type == LLFolderType::FT_NONE ||
+ LLFolderType::lookupIsEnsembleType(type));
+
+ // Only enable calling-card related options for non-system folders.
+ if (!is_system_folder)
{
- folders.push_back(category->getUUID());
+ LLIsType is_callingcard(LLAssetType::AT_CALLINGCARD);
+ if (mCallingCards || checkFolderForContentsOfType(model, is_callingcard))
+ {
+ mItems.push_back(std::string("Calling Card Separator"));
+ mItems.push_back(std::string("Conference Chat Folder"));
+ mItems.push_back(std::string("IM All Contacts In Folder"));
+ }
}
- mMenu = menu.getHandle();
- sSelf = getHandle();
- LLRightClickInventoryFetchDescendentsObserver* fetch = new LLRightClickInventoryFetchDescendentsObserver(folders, FALSE);
- fetch->startFetch();
- inc_busy_count();
- if(fetch->isFinished())
+ if (!isItemRemovable())
{
- // everything is already here - call done.
- fetch->done();
+ mDisabledItems.push_back(std::string("Delete"));
}
- else
+
+#ifndef LL_RELEASE_FOR_DOWNLOAD
+ if (LLFolderType::lookupIsProtectedType(type))
+ {
+ mItems.push_back(std::string("Delete System Folder"));
+ }
+#endif
+
+ // wearables related functionality for folders.
+ //is_wearable
+ LLFindWearables is_wearable;
+ LLIsType is_object( LLAssetType::AT_OBJECT );
+ LLIsType is_gesture( LLAssetType::AT_GESTURE );
+
+ if (mWearables ||
+ checkFolderForContentsOfType(model, is_wearable) ||
+ checkFolderForContentsOfType(model, is_object) ||
+ checkFolderForContentsOfType(model, is_gesture) )
{
- // it's all on its way - add an observer, and the inventory will call done for us when everything is here.
- gInventory.addObserver(fetch);
+ mItems.push_back(std::string("Folder Wearables Separator"));
+
+ // Only enable add/replace outfit for non-system folders.
+ if (!is_system_folder)
+ {
+ // Adding an outfit onto another (versus replacing) doesn't make sense.
+ if (type != LLFolderType::FT_OUTFIT)
+ {
+ mItems.push_back(std::string("Add To Outfit"));
+ }
+
+ mItems.push_back(std::string("Replace Outfit"));
+ }
+ if (is_ensemble)
+ {
+ mItems.push_back(std::string("Wear As Ensemble"));
+ }
+ mItems.push_back(std::string("Remove From Outfit"));
+ if (!LLAppearanceMgr::getCanRemoveFromCOF(mUUID))
+ {
+ mDisabledItems.push_back(std::string("Remove From Outfit"));
+ }
+ if (!LLAppearanceMgr::instance().getCanReplaceCOF(mUUID))
+ {
+ mDisabledItems.push_back(std::string("Replace Outfit"));
+ }
+ mItems.push_back(std::string("Outfit Separator"));
}
}
+// Flags unused
+void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
+{
+ sSelf.markDead();
+
+ mItems.clear();
+ mDisabledItems.clear();
+
+ lldebugs << "LLFolderBridge::buildContextMenu()" << llendl;
+
+ LLInventoryModel* model = getInventoryModel();
+ if(!model) return;
+
+ buildContextMenuBaseOptions(flags);
+
+ // Add menu items that are dependent on the contents of the folder.
+ LLViewerInventoryCategory* category = (LLViewerInventoryCategory *) model->getCategory(mUUID);
+ if (category)
+ {
+ uuid_vec_t folders;
+ folders.push_back(category->getUUID());
+
+ sSelf = getHandle();
+ LLRightClickInventoryFetchDescendentsObserver* fetch = new LLRightClickInventoryFetchDescendentsObserver(folders);
+ fetch->startFetch();
+ if (fetch->isFinished())
+ {
+ // Do not call execute() or done() here as if the folder is here, there's likely no point drilling down
+ // This saves lots of time as buildContextMenu() is called a lot
+ delete fetch;
+ buildContextMenuFolderOptions(flags);
+ }
+ else
+ {
+ // it's all on its way - add an observer, and the inventory will call done for us when everything is here.
+ inc_busy_count();
+ gInventory.addObserver(fetch);
+ }
+ }
+
+ hide_context_entries(menu, mItems, mDisabledItems);
+
+ // Reposition the menu, in case we're adding items to an existing menu.
+ menu.needsArrange();
+ menu.arrangeAndClear();
+}
+
BOOL LLFolderBridge::hasChildren() const
{
LLInventoryModel* model = getInventoryModel();
@@ -2688,7 +3433,8 @@ BOOL LLFolderBridge::hasChildren() const
BOOL LLFolderBridge::dragOrDrop(MASK mask, BOOL drop,
EDragAndDropType cargo_type,
- void* cargo_data)
+ void* cargo_data,
+ std::string& tooltip_msg)
{
LLInventoryItem* inv_item = (LLInventoryItem*)cargo_data;
@@ -2701,13 +3447,14 @@ BOOL LLFolderBridge::dragOrDrop(MASK mask, BOOL drop,
case DAD_CALLINGCARD:
case DAD_LANDMARK:
case DAD_SCRIPT:
+ case DAD_CLOTHING:
case DAD_OBJECT:
case DAD_NOTECARD:
- case DAD_CLOTHING:
case DAD_BODYPART:
case DAD_ANIMATION:
case DAD_GESTURE:
- accept = dragItemIntoFolder(inv_item, drop);
+ case DAD_MESH:
+ accept = dragItemIntoFolder(inv_item, drop, tooltip_msg);
break;
case DAD_LINK:
// DAD_LINK type might mean one of two asset types: AT_LINK or AT_LINK_FOLDER.
@@ -2718,12 +3465,12 @@ BOOL LLFolderBridge::dragOrDrop(MASK mask, BOOL drop,
LLInventoryCategory* linked_category = gInventory.getCategory(inv_item->getLinkedUUID());
if (linked_category)
{
- accept = dragCategoryIntoFolder((LLInventoryCategory*)linked_category, drop);
+ accept = dragCategoryIntoFolder((LLInventoryCategory*)linked_category, drop, tooltip_msg);
}
}
else
{
- accept = dragItemIntoFolder(inv_item, drop);
+ accept = dragItemIntoFolder(inv_item, drop, tooltip_msg);
}
break;
case DAD_CATEGORY:
@@ -2733,10 +3480,14 @@ BOOL LLFolderBridge::dragOrDrop(MASK mask, BOOL drop,
}
else
{
- accept = dragCategoryIntoFolder((LLInventoryCategory*)cargo_data, drop);
+ accept = dragCategoryIntoFolder((LLInventoryCategory*)cargo_data, drop, tooltip_msg);
}
break;
+ case DAD_ROOT_CATEGORY:
+ case DAD_NONE:
+ break;
default:
+ llwarns << "Unhandled cargo type for drag&drop " << cargo_type << llendl;
break;
}
return accept;
@@ -2765,7 +3516,7 @@ void LLFolderBridge::createNewCategory(void* user_data)
{
LLFolderBridge* bridge = (LLFolderBridge*)user_data;
if(!bridge) return;
- LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(bridge->mInventoryPanel.get());
+ LLInventoryPanel* panel = bridge->mInventoryPanel.get();
if (!panel) return;
LLInventoryModel* model = panel->getModel();
if(!model) return;
@@ -2872,13 +3623,13 @@ bool move_task_inventory_callback(const LLSD& notification, const LLSD& response
if(option == 0 && object)
{
- if (cat_and_wear && cat_and_wear->mWear)
+ if (cat_and_wear && cat_and_wear->mWear) // && !cat_and_wear->mFolderResponded)
{
LLInventoryObject::object_list_t inventory_objects;
object->getInventoryContents(inventory_objects);
int contents_count = inventory_objects.size()-1; //subtract one for containing folder
-
- LLInventoryCopyAndWearObserver* inventoryObserver = new LLInventoryCopyAndWearObserver(cat_and_wear->mCatID, contents_count);
+ LLInventoryCopyAndWearObserver* inventoryObserver = new LLInventoryCopyAndWearObserver(cat_and_wear->mCatID, contents_count, cat_and_wear->mFolderResponded);
+
gInventory.addObserver(inventoryObserver);
}
@@ -2945,7 +3696,7 @@ void LLFolderBridge::dropToFavorites(LLInventoryItem* inv_item)
// use callback to rearrange favorite landmarks after adding
// to have new one placed before target (on which it was dropped). See EXT-4312.
LLPointer<AddFavoriteLandmarkCallback> cb = new AddFavoriteLandmarkCallback();
- LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get());
+ LLInventoryPanel* panel = mInventoryPanel.get();
LLFolderViewItem* drag_over_item = panel ? panel->getRootFolder()->getDraggingOverItem() : NULL;
if (drag_over_item && drag_over_item->getListener())
{
@@ -2986,22 +3737,32 @@ void LLFolderBridge::dropToOutfit(LLInventoryItem* inv_item, BOOL move_is_into_c
// into the folder, as well as performing the actual drop, depending
// if drop == TRUE.
BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
- BOOL drop)
+ BOOL drop,
+ std::string& tooltip_msg)
{
LLInventoryModel* model = getInventoryModel();
- if(!model || !inv_item) return FALSE;
- if(!isAgentInventory()) return FALSE; // cannot drag into library
+ if (!model || !inv_item) return FALSE;
+ if (!isAgentInventory()) return FALSE; // cannot drag into library
if (!isAgentAvatarValid()) return FALSE;
+ LLInventoryPanel* destination_panel = mInventoryPanel.get();
+ if (!destination_panel) return false;
+
+ LLInventoryFilter* filter = destination_panel->getFilter();
+ if (!filter) return false;
+
const LLUUID &current_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT, false);
const LLUUID &favorites_id = model->findCategoryUUIDForType(LLFolderType::FT_FAVORITE, false);
const LLUUID &landmarks_id = model->findCategoryUUIDForType(LLFolderType::FT_LANDMARK, false);
+ const LLUUID &outbox_id = model->findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false);
const BOOL move_is_into_current_outfit = (mUUID == current_outfit_id);
const BOOL move_is_into_favorites = (mUUID == favorites_id);
const BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT);
const BOOL move_is_into_landmarks = (mUUID == landmarks_id) || model->isObjectDescendentOf(mUUID, landmarks_id);
+ const BOOL move_is_into_outbox = model->isObjectDescendentOf(mUUID, outbox_id);
+ const BOOL move_is_from_outbox = model->isObjectDescendentOf(inv_item->getUUID(), outbox_id);
LLToolDragAndDrop::ESource source = LLToolDragAndDrop::getInstance()->getSource();
BOOL accept = FALSE;
@@ -3056,10 +3817,14 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
accept = TRUE;
if (!is_movable)
+ {
accept = FALSE;
- if ((mUUID == inv_item->getParentUUID()) && !move_is_into_favorites)
+ }
+ else if ((mUUID == inv_item->getParentUUID()) && !move_is_into_favorites)
+ {
accept = FALSE;
- if (move_is_into_current_outfit || move_is_into_outfit)
+ }
+ else if (move_is_into_current_outfit || move_is_into_outfit)
{
accept = can_move_to_outfit(inv_item, move_is_into_current_outfit);
}
@@ -3067,8 +3832,50 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
{
accept = can_move_to_landmarks(inv_item);
}
+ else if (move_is_into_outbox)
+ {
+ accept = can_move_to_outbox(inv_item, tooltip_msg);
+
+ if (accept)
+ {
+ const LLViewerInventoryCategory * master_folder = model->getFirstDescendantOf(outbox_id, mUUID);
+
+ int existing_item_count = LLToolDragAndDrop::instance().getCargoCount();
+
+ if (master_folder != NULL)
+ {
+ LLInventoryModel::cat_array_t existing_categories;
+ LLInventoryModel::item_array_t existing_items;
+
+ gInventory.collectDescendents(master_folder->getUUID(), existing_categories, existing_items, FALSE);
+
+ existing_item_count += existing_items.count();
+ }
+
+ if (existing_item_count > gSavedSettings.getU32("InventoryOutboxMaxItemCount"))
+ {
+ tooltip_msg = LLTrans::getString("TooltipOutboxTooManyObjects");
+ accept = FALSE;
+ }
+ }
+ }
+
+ LLInventoryPanel* active_panel = LLInventoryPanel::getActiveInventoryPanel(FALSE);
+
+ // Check whether the item being dragged from active inventory panel
+ // passes the filter of the destination panel.
+ if (accept && active_panel)
+ {
+ LLFolderView* active_folder_view = active_panel->getRootFolder();
+ if (!active_folder_view) return false;
+
+ LLFolderViewItem* fv_item = active_folder_view->getItemByID(inv_item->getUUID());
+ if (!fv_item) return false;
+
+ accept = filter->check(fv_item);
+ }
- if(accept && drop)
+ if (accept && drop)
{
if (inv_item->getType() == LLAssetType::AT_GESTURE
&& LLGestureMgr::instance().isGestureActive(inv_item->getUUID()) && move_is_into_trash)
@@ -3077,15 +3884,10 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
}
// If an item is being dragged between windows, unselect everything in the active window
// so that we don't follow the selection to its new location (which is very annoying).
- LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel(FALSE);
- if (active_panel)
- {
- LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get());
- if (active_panel && (panel != active_panel))
+ if (active_panel && (destination_panel != active_panel))
{
active_panel->unSelectAll();
}
- }
//--------------------------------------------------------------------------------
// Destination folder logic
@@ -3095,8 +3897,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
// (only reorder the item in Favorites folder)
if ((mUUID == inv_item->getParentUUID()) && move_is_into_favorites)
{
- LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get());
- LLFolderViewItem* itemp = panel ? panel->getRootFolder()->getDraggingOverItem() : NULL;
+ LLFolderViewItem* itemp = destination_panel->getRootFolder()->getDraggingOverItem();
if (itemp)
{
LLUUID srcItemId = inv_item->getUUID();
@@ -3117,10 +3918,27 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
{
dropToOutfit(inv_item, move_is_into_current_outfit);
}
+ else if (move_is_into_outbox)
+ {
+ if (move_is_from_outbox)
+ {
+ move_item_within_outbox(inv_item, mUUID, LLToolDragAndDrop::getOperationId());
+ }
+ else
+ {
+ copy_item_to_outbox(inv_item, mUUID, LLUUID::null, LLToolDragAndDrop::getOperationId());
+ }
+ }
// NORMAL or TRASH folder
// (move the item, restamp if into trash)
else
{
+ // set up observer to select item once drag and drop from inbox is complete
+ if (gInventory.isObjectDescendentOf(inv_item->getUUID(), gInventory.findCategoryUUIDForType(LLFolderType::FT_INBOX, false, false)))
+ {
+ set_dad_inbox_object(inv_item->getUUID());
+ }
+
LLInvFVBridge::changeItemParent(
model,
(LLViewerInventoryItem*)inv_item,
@@ -3130,7 +3948,6 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
//
//--------------------------------------------------------------------------------
-
}
}
else if (LLToolDragAndDrop::SOURCE_WORLD == source)
@@ -3139,7 +3956,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
// anonymous objects, it would be possible to bypass
// permissions.
object = gObjectList.findObject(inv_item->getParentUUID());
- if(!object)
+ if (!object)
{
llinfos << "Object not found for drop." << llendl;
return FALSE;
@@ -3149,10 +3966,9 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
// move/copy this item.
LLPermissions perm(inv_item->getPermissions());
BOOL is_move = FALSE;
- if((perm.allowCopyBy(gAgent.getID(), gAgent.getGroupID())
+ if ((perm.allowCopyBy(gAgent.getID(), gAgent.getGroupID())
&& perm.allowTransferTo(gAgent.getID())))
// || gAgent.isGodlike())
-
{
accept = TRUE;
}
@@ -3168,7 +3984,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
// Don't allow placing an original item into Current Outfit or an outfit folder
// because they must contain only links to wearable items.
// *TODO: Probably we should create a link to an item if it was dragged to outfit or COF.
- if(move_is_into_current_outfit || move_is_into_outfit)
+ if (move_is_into_current_outfit || move_is_into_outfit)
{
accept = FALSE;
}
@@ -3179,8 +3995,20 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
{
accept = FALSE;
}
+ else if (move_is_into_outbox)
+ {
+ tooltip_msg = LLTrans::getString("TooltipOutboxNotInInventory");
+ accept = FALSE;
+ }
+
+ // Check whether the item being dragged from in world
+ // passes the filter of the destination panel.
+ if (accept)
+ {
+ accept = filter->check(inv_item);
+ }
- if(drop && accept)
+ if (accept && drop)
{
LLMoveInv* move_inv = new LLMoveInv;
move_inv->mObjectID = inv_item->getParentUUID();
@@ -3202,15 +4030,34 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
LLNotifications::instance().forceResponse(params, 0);
}
}
-
}
else if(LLToolDragAndDrop::SOURCE_NOTECARD == source)
{
- accept = TRUE;
- if(drop)
+ if (move_is_into_outbox)
{
- copy_inventory_from_notecard(LLToolDragAndDrop::getInstance()->getObjectID(),
- LLToolDragAndDrop::getInstance()->getSourceID(), inv_item);
+ tooltip_msg = LLTrans::getString("TooltipOutboxNotInInventory");
+ accept = FALSE;
+ }
+ else
+ {
+ // Don't allow placing an original item from a notecard to Current Outfit or an outfit folder
+ // because they must contain only links to wearable items.
+ accept = !(move_is_into_current_outfit || move_is_into_outfit);
+ }
+
+ // Check whether the item being dragged from notecard
+ // passes the filter of the destination panel.
+ if (accept)
+ {
+ accept = filter->check(inv_item);
+ }
+
+ if (accept && drop)
+ {
+ copy_inventory_from_notecard(mUUID, // Drop to the chosen destination folder
+ LLToolDragAndDrop::getInstance()->getObjectID(),
+ LLToolDragAndDrop::getInstance()->getSourceID(),
+ inv_item);
}
}
else if(LLToolDragAndDrop::SOURCE_LIBRARY == source)
@@ -3220,7 +4067,12 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
{
accept = TRUE;
- if (move_is_into_current_outfit || move_is_into_outfit)
+ if (move_is_into_outbox)
+ {
+ tooltip_msg = LLTrans::getString("TooltipOutboxNotInInventory");
+ accept = FALSE;
+ }
+ else if (move_is_into_current_outfit || move_is_into_outfit)
{
accept = can_move_to_outfit(inv_item, move_is_into_current_outfit);
}
@@ -3231,6 +4083,21 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
accept = can_move_to_landmarks(inv_item);
}
+ LLInventoryPanel* active_panel = LLInventoryPanel::getActiveInventoryPanel(FALSE);
+
+ // Check whether the item being dragged from the library
+ // passes the filter of the destination panel.
+ if (accept && active_panel)
+ {
+ LLFolderView* active_folder_view = active_panel->getRootFolder();
+ if (!active_folder_view) return false;
+
+ LLFolderViewItem* fv_item = active_folder_view->getItemByID(inv_item->getUUID());
+ if (!fv_item) return false;
+
+ accept = filter->check(fv_item);
+ }
+
if (accept && drop)
{
// FAVORITES folder
@@ -3265,6 +4132,69 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
return accept;
}
+// static
+bool check_category(LLInventoryModel* model,
+ const LLUUID& cat_id,
+ LLFolderView* active_folder_view,
+ LLInventoryFilter* filter)
+{
+ if (!model || !active_folder_view || !filter)
+ return false;
+
+ if (!filter->checkFolder(cat_id))
+ {
+ return false;
+ }
+
+ LLInventoryModel::cat_array_t descendent_categories;
+ LLInventoryModel::item_array_t descendent_items;
+ model->collectDescendents(cat_id, descendent_categories, descendent_items, TRUE);
+
+ S32 num_descendent_categories = descendent_categories.count();
+ S32 num_descendent_items = descendent_items.count();
+
+ if (num_descendent_categories + num_descendent_items == 0)
+ {
+ // Empty folder should be checked as any other folder view item.
+ // If we are filtering by date the folder should not pass because
+ // it doesn't have its own creation date. See LLInvFVBridge::getCreationDate().
+ return check_item(cat_id, active_folder_view, filter);
+ }
+
+ for (S32 i = 0; i < num_descendent_categories; ++i)
+ {
+ LLInventoryCategory* category = descendent_categories[i];
+ if(!check_category(model, category->getUUID(), active_folder_view, filter))
+ {
+ return false;
+ }
+ }
+
+ for (S32 i = 0; i < num_descendent_items; ++i)
+ {
+ LLViewerInventoryItem* item = descendent_items[i];
+ if(!check_item(item->getUUID(), active_folder_view, filter))
+ {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+// static
+bool check_item(const LLUUID& item_id,
+ LLFolderView* active_folder_view,
+ LLInventoryFilter* filter)
+{
+ if (!active_folder_view || !filter) return false;
+
+ LLFolderViewItem* fv_item = active_folder_view->getItemByID(item_id);
+ if (!fv_item) return false;
+
+ return filter->check(fv_item);
+}
+
// +=================================================+
// | LLTextureBridge |
// +=================================================+
@@ -3308,6 +4238,10 @@ void LLTextureBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
if(isItemInTrash())
{
addTrashContextMenuOptions(items, disabled_items);
+ }
+ else if(isOutboxFolder())
+ {
+ addOutboxContextMenuOptions(flags, items, disabled_items);
}
else
{
@@ -3381,26 +4315,33 @@ void LLSoundBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
menuentry_vec_t items;
menuentry_vec_t disabled_items;
- if(isItemInTrash())
+ if (isOutboxFolder())
{
- addTrashContextMenuOptions(items, disabled_items);
+ addOutboxContextMenuOptions(flags, items, disabled_items);
}
else
{
- items.push_back(std::string("Share"));
- if (!canShare())
+ if (isItemInTrash())
{
- disabled_items.push_back(std::string("Share"));
+ addTrashContextMenuOptions(items, disabled_items);
+ }
+ else
+ {
+ items.push_back(std::string("Share"));
+ if (!canShare())
+ {
+ disabled_items.push_back(std::string("Share"));
+ }
+ items.push_back(std::string("Sound Open"));
+ items.push_back(std::string("Properties"));
+
+ getClipboardEntries(true, items, disabled_items, flags);
}
- items.push_back(std::string("Sound Open"));
- items.push_back(std::string("Properties"));
- getClipboardEntries(true, items, disabled_items, flags);
+ items.push_back(std::string("Sound Separator"));
+ items.push_back(std::string("Sound Play"));
}
- items.push_back(std::string("Sound Separator"));
- items.push_back(std::string("Sound Play"));
-
hide_context_entries(menu, items, disabled_items);
}
@@ -3432,26 +4373,33 @@ void LLLandmarkBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
menuentry_vec_t disabled_items;
lldebugs << "LLLandmarkBridge::buildContextMenu()" << llendl;
- if(isItemInTrash())
+ if(isOutboxFolder())
{
- addTrashContextMenuOptions(items, disabled_items);
+ addOutboxContextMenuOptions(flags, items, disabled_items);
}
else
{
- items.push_back(std::string("Share"));
- if (!canShare())
+ if(isItemInTrash())
{
- disabled_items.push_back(std::string("Share"));
+ addTrashContextMenuOptions(items, disabled_items);
+ }
+ else
+ {
+ items.push_back(std::string("Share"));
+ if (!canShare())
+ {
+ disabled_items.push_back(std::string("Share"));
+ }
+ items.push_back(std::string("Landmark Open"));
+ items.push_back(std::string("Properties"));
+
+ getClipboardEntries(true, items, disabled_items, flags);
}
- items.push_back(std::string("Landmark Open"));
- items.push_back(std::string("Properties"));
- getClipboardEntries(true, items, disabled_items, flags);
+ items.push_back(std::string("Landmark Separator"));
+ items.push_back(std::string("About Landmark"));
}
- items.push_back(std::string("Landmark Separator"));
- items.push_back(std::string("About Landmark"));
-
// Disable "About Landmark" menu item for
// multiple landmarks selected. Only one landmark
// info panel can be shown at a time.
@@ -3497,7 +4445,7 @@ void LLLandmarkBridge::performAction(LLInventoryModel* model, std::string action
key["type"] = "landmark";
key["id"] = item->getUUID();
- LLSideTray::getInstance()->showPanel("panel_places", key);
+ LLFloaterSidePanelContainer::showPanel("places", key);
}
}
else
@@ -3569,7 +4517,7 @@ LLCallingCardBridge::~LLCallingCardBridge()
void LLCallingCardBridge::refreshFolderViewItem()
{
- LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get());
+ LLInventoryPanel* panel = mInventoryPanel.get();
LLFolderViewItem* itemp = panel ? panel->getRootFolder()->getItemByID(mUUID) : NULL;
if (itemp)
{
@@ -3664,6 +4612,10 @@ void LLCallingCardBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
if(isItemInTrash())
{
addTrashContextMenuOptions(items, disabled_items);
+ }
+ else if(isOutboxFolder())
+ {
+ items.push_back(std::string("Delete"));
}
else
{
@@ -3706,7 +4658,8 @@ void LLCallingCardBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
BOOL LLCallingCardBridge::dragOrDrop(MASK mask, BOOL drop,
EDragAndDropType cargo_type,
- void* cargo_data)
+ void* cargo_data,
+ std::string& tooltip_msg)
{
LLViewerInventoryItem* item = getItem();
BOOL rv = FALSE;
@@ -3725,6 +4678,7 @@ BOOL LLCallingCardBridge::dragOrDrop(MASK mask, BOOL drop,
case DAD_BODYPART:
case DAD_ANIMATION:
case DAD_GESTURE:
+ case DAD_MESH:
{
LLInventoryItem* inv_item = (LLInventoryItem*)cargo_data;
const LLPermissions& perm = inv_item->getPermissions();
@@ -3920,6 +4874,10 @@ void LLGestureBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
{
addTrashContextMenuOptions(items, disabled_items);
}
+ else if(isOutboxFolder())
+ {
+ items.push_back(std::string("Delete"));
+ }
else
{
items.push_back(std::string("Share"));
@@ -3970,29 +4928,35 @@ void LLAnimationBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
menuentry_vec_t disabled_items;
lldebugs << "LLAnimationBridge::buildContextMenu()" << llendl;
- if(isItemInTrash())
+ if(isOutboxFolder())
{
- addTrashContextMenuOptions(items, disabled_items);
+ items.push_back(std::string("Delete"));
}
else
{
- items.push_back(std::string("Share"));
- if (!canShare())
+ if(isItemInTrash())
{
- disabled_items.push_back(std::string("Share"));
+ addTrashContextMenuOptions(items, disabled_items);
+ }
+ else
+ {
+ items.push_back(std::string("Share"));
+ if (!canShare())
+ {
+ disabled_items.push_back(std::string("Share"));
+ }
+ items.push_back(std::string("Animation Open"));
+ items.push_back(std::string("Properties"));
+
+ getClipboardEntries(true, items, disabled_items, flags);
}
- items.push_back(std::string("Animation Open"));
- items.push_back(std::string("Properties"));
- getClipboardEntries(true, items, disabled_items, flags);
+ items.push_back(std::string("Animation Separator"));
+ items.push_back(std::string("Animation Play"));
+ items.push_back(std::string("Animation Audition"));
}
- items.push_back(std::string("Animation Separator"));
- items.push_back(std::string("Animation Play"));
- items.push_back(std::string("Animation Audition"));
-
hide_context_entries(menu, items, disabled_items);
-
}
// virtual
@@ -4002,14 +4966,14 @@ void LLAnimationBridge::performAction(LLInventoryModel* model, std::string actio
{
if (getItem())
{
- LLPreviewAnim::e_activation_type activate = LLPreviewAnim::NONE;
- if ("playworld" == action) activate = LLPreviewAnim::PLAY;
- if ("playlocal" == action) activate = LLPreviewAnim::AUDITION;
+ LLSD::String activate = "NONE";
+ if ("playworld" == action) activate = "Inworld";
+ if ("playlocal" == action) activate = "Locally";
LLPreviewAnim* preview = LLFloaterReg::showTypedInstance<LLPreviewAnim>("preview_anim", LLSD(mUUID));
if (preview)
{
- preview->activate(activate);
+ preview->play(activate);
}
}
}
@@ -4246,6 +5210,10 @@ void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
if(isItemInTrash())
{
addTrashContextMenuOptions(items, disabled_items);
+ }
+ else if(isOutboxFolder())
+ {
+ items.push_back(std::string("Delete"));
}
else
{
@@ -4405,7 +5373,7 @@ void remove_inventory_category_from_avatar( LLInventoryCategory* category )
if (gAgentCamera.cameraCustomizeAvatar())
{
// switching to outfit editor should automagically save any currently edited wearable
- LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD().with("type", "edit_outfit"));
+ LLFloaterSidePanelContainer::showPanel("appearance", LLSD().with("type", "edit_outfit"));
}
remove_inventory_category_from_avatar_step2(TRUE, category->getUUID() );
@@ -4579,6 +5547,10 @@ void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
{
addTrashContextMenuOptions(items, disabled_items);
}
+ else if(isOutboxFolder())
+ {
+ items.push_back(std::string("Delete"));
+ }
else
{ // FWIW, it looks like SUPPRESS_OPEN_ITEM is not set anywhere
BOOL can_open = ((flags & SUPPRESS_OPEN_ITEM) != SUPPRESS_OPEN_ITEM);
@@ -4647,10 +5619,18 @@ void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
else
{
items.push_back(std::string("Wearable And Object Wear"));
- items.push_back(std::string("Wearable Add"));
disabled_items.push_back(std::string("Take Off"));
disabled_items.push_back(std::string("Wearable Edit"));
}
+
+ if (LLWearableType::getAllowMultiwear(mWearableType))
+ {
+ items.push_back(std::string("Wearable Add"));
+ if (gAgentWearables.getWearableCount(mWearableType) >= LLAgentWearables::MAX_CLOTHING_PER_TYPE)
+ {
+ disabled_items.push_back(std::string("Wearable Add"));
+ }
+ }
break;
default:
break;
@@ -4844,31 +5824,22 @@ void LLWearableBridge::onRemoveFromAvatarArrived(LLWearable* wearable,
// static
void LLWearableBridge::removeAllClothesFromAvatar()
{
- // Remove COF links.
- for (S32 itype = LLWearableType::WT_SHAPE; itype < LLWearableType::WT_COUNT; ++itype)
- {
- if (itype == LLWearableType::WT_SHAPE || itype == LLWearableType::WT_SKIN || itype == LLWearableType::WT_HAIR || itype == LLWearableType::WT_EYES)
- continue;
+ // Fetch worn clothes (i.e. the ones in COF).
+ LLInventoryModel::item_array_t clothing_items;
+ LLInventoryModel::cat_array_t dummy;
+ LLIsType is_clothing(LLAssetType::AT_CLOTHING);
+ gInventory.collectDescendentsIf(LLAppearanceMgr::instance().getCOF(),
+ dummy,
+ clothing_items,
+ LLInventoryModel::EXCLUDE_TRASH,
+ is_clothing,
+ false);
- for (S32 index = gAgentWearables.getWearableCount(itype)-1; index >= 0 ; --index)
- {
- LLViewerInventoryItem *item = dynamic_cast<LLViewerInventoryItem*>(
- gAgentWearables.getWearableInventoryItem((LLWearableType::EType)itype, index));
- if (!item)
- continue;
- const LLUUID &item_id = item->getUUID();
- const LLWearable *wearable = gAgentWearables.getWearableFromItemID(item_id);
- if (!wearable)
- continue;
-
- // Find and remove this item from the COF.
- LLAppearanceMgr::instance().removeCOFItemLinks(item_id,false);
- }
+ // Take them off by removing from COF.
+ for (LLInventoryModel::item_array_t::const_iterator it = clothing_items.begin(); it != clothing_items.end(); ++it)
+ {
+ LLAppearanceMgr::instance().removeItemFromAvatar((*it)->getUUID());
}
- gInventory.notifyObservers();
-
- // Remove wearables from gAgentWearables
- LLAgentWearables::userRemoveAllClothes();
}
// static
@@ -4893,6 +5864,7 @@ void LLWearableBridge::removeFromAvatar()
}
}
+
// +=================================================+
// | LLLinkItemBridge |
// +=================================================+
@@ -4923,6 +5895,66 @@ void LLLinkItemBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
}
// +=================================================+
+// | LLMeshBridge |
+// +=================================================+
+
+LLUIImagePtr LLMeshBridge::getIcon() const
+{
+ return LLInventoryIcon::getIcon(LLAssetType::AT_MESH, LLInventoryType::IT_MESH, 0, FALSE);
+}
+
+void LLMeshBridge::openItem()
+{
+ LLViewerInventoryItem* item = getItem();
+
+ if (item)
+ {
+ // open mesh
+ }
+}
+
+void LLMeshBridge::previewItem()
+{
+ LLViewerInventoryItem* item = getItem();
+ if(item)
+ {
+ // preview mesh
+ }
+}
+
+
+void LLMeshBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
+{
+ lldebugs << "LLMeshBridge::buildContextMenu()" << llendl;
+ std::vector<std::string> items;
+ std::vector<std::string> disabled_items;
+
+ if(isItemInTrash())
+ {
+ items.push_back(std::string("Purge Item"));
+ if (!isItemRemovable())
+ {
+ disabled_items.push_back(std::string("Purge Item"));
+ }
+
+ items.push_back(std::string("Restore Item"));
+ }
+ else if(isOutboxFolder())
+ {
+ addOutboxContextMenuOptions(flags, items, disabled_items);
+ }
+ else
+ {
+ items.push_back(std::string("Properties"));
+
+ getClipboardEntries(true, items, disabled_items, flags);
+ }
+
+ hide_context_entries(menu, items, disabled_items);
+}
+
+
+// +=================================================+
// | LLLinkBridge |
// +=================================================+
// For broken folder links.
@@ -5228,6 +6260,7 @@ public:
{
wearOnAvatar();
}
+
virtual ~LLWearableBridgeAction(){}
protected:
LLWearableBridgeAction(const LLUUID& id,LLInventoryModel* model) : LLInvFVBridgeAction(id,model) {}
@@ -5320,11 +6353,6 @@ void LLRecentItemsFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
menuentry_vec_t disabled_items, items = getMenuItems();
- items.erase(std::remove(items.begin(), items.end(), std::string("New Body Parts")), items.end());
- items.erase(std::remove(items.begin(), items.end(), std::string("New Clothes")), items.end());
- items.erase(std::remove(items.begin(), items.end(), std::string("New Note")), items.end());
- items.erase(std::remove(items.begin(), items.end(), std::string("New Gesture")), items.end());
- items.erase(std::remove(items.begin(), items.end(), std::string("New Script")), items.end());
items.erase(std::remove(items.begin(), items.end(), std::string("New Folder")), items.end());
hide_context_entries(menu, items, disabled_items);
diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h
index 5ac328dcef..dc9e88d54d 100644
--- a/indra/newview/llinventorybridge.h
+++ b/indra/newview/llinventorybridge.h
@@ -35,12 +35,14 @@
#include "llviewercontrol.h"
#include "llwearable.h"
+class LLInventoryFilter;
class LLInventoryPanel;
class LLInventoryModel;
class LLMenuGL;
class LLCallingCardObserver;
class LLViewerJointAttachment;
+
typedef std::vector<std::string> menuentry_vec_t;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -51,7 +53,7 @@ typedef std::vector<std::string> menuentry_vec_t;
//
// You'll want to call LLInvItemFVELister::createBridge() to actually create
// an instance of this class. This helps encapsulate the
-// funcationality a bit. (except for folders, you can create those
+// functionality a bit. (except for folders, you can create those
// manually...)
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class LLInvFVBridge : public LLFolderViewEventListener
@@ -68,7 +70,9 @@ public:
U32 flags = 0x00);
virtual ~LLInvFVBridge() {}
- BOOL canShare() const;
+ bool canShare() const;
+ bool canListOnMarketplace() const;
+ bool canListOnMarketplaceNow() const;
//--------------------------------------------------------------------
// LLInvFVBridge functionality
@@ -102,8 +106,8 @@ public:
virtual void removeBatch(LLDynamicArray<LLFolderViewEventListener*>& batch);
virtual void move(LLFolderViewEventListener* new_parent_bridge) {}
virtual BOOL isItemCopyable() const { return FALSE; }
- virtual BOOL copyToClipboard() const { return FALSE; }
- virtual void cutToClipboard();
+ virtual BOOL copyToClipboard() const;
+ virtual BOOL cutToClipboard() const;
virtual BOOL isClipboardPasteable() const;
virtual BOOL isClipboardPasteableAsLink() const;
virtual void pasteFromClipboard() {}
@@ -114,7 +118,8 @@ public:
virtual BOOL startDrag(EDragAndDropType* type, LLUUID* id) const;
virtual BOOL dragOrDrop(MASK mask, BOOL drop,
EDragAndDropType cargo_type,
- void* cargo_data) { return FALSE; }
+ void* cargo_data,
+ std::string& tooltip_msg) { return FALSE; }
virtual LLInventoryType::EType getInventoryType() const { return mInvType; }
virtual LLWearableType::EType getWearableType() const { return LLWearableType::WT_NONE; }
@@ -127,6 +132,9 @@ protected:
virtual void addDeleteContextMenuOptions(menuentry_vec_t &items,
menuentry_vec_t &disabled_items);
virtual void addOpenRightClickMenuOption(menuentry_vec_t &items);
+ virtual void addOutboxContextMenuOptions(U32 flags,
+ menuentry_vec_t &items,
+ menuentry_vec_t &disabled_items);
protected:
LLInvFVBridge(LLInventoryPanel* inventory, LLFolderView* root, const LLUUID& uuid);
@@ -138,6 +146,11 @@ protected:
BOOL isAgentInventory() const; // false if lost or in the inventory library
BOOL isCOFFolder() const; // true if COF or descendent of
+ BOOL isInboxFolder() const; // true if COF or descendent of marketplace inbox
+ BOOL isOutboxFolder() const; // true if COF or descendent of marketplace outbox
+ BOOL isOutboxFolderDirectParent() const;
+ const LLUUID getOutboxFolder() const;
+
virtual BOOL isItemPermissive() const;
static void changeItemParent(LLInventoryModel* model,
LLViewerInventoryItem* item,
@@ -149,7 +162,7 @@ protected:
BOOL restamp);
void removeBatchNoCheck(LLDynamicArray<LLFolderViewEventListener*>& batch);
protected:
- LLHandle<LLPanel> mInventoryPanel;
+ LLHandle<LLInventoryPanel> mInventoryPanel;
LLFolderView* mRoot;
const LLUUID mUUID; // item id
LLInventoryType::EType mInvType;
@@ -199,15 +212,13 @@ public:
virtual BOOL renameItem(const std::string& new_name);
virtual BOOL removeItem();
virtual BOOL isItemCopyable() const;
- virtual BOOL copyToClipboard() const;
virtual BOOL hasChildren() const { return FALSE; }
virtual BOOL isUpToDate() const { return TRUE; }
/*virtual*/ void clearDisplayName() { mDisplayName.clear(); }
LLViewerInventoryItem* getItem() const;
- bool isAddAction(std::string action) const;
- bool isRemoveAction(std::string action) const;
+
protected:
BOOL confirmRemoveItem(const LLSD& notification, const LLSD& response);
virtual BOOL isItemPermissive() const;
@@ -226,8 +237,9 @@ public:
mCallingCards(FALSE),
mWearables(FALSE)
{}
- BOOL dragItemIntoFolder(LLInventoryItem* inv_item, BOOL drop);
- BOOL dragCategoryIntoFolder(LLInventoryCategory* inv_category, BOOL drop);
+
+ BOOL dragItemIntoFolder(LLInventoryItem* inv_item, BOOL drop, std::string& tooltip_msg);
+ BOOL dragCategoryIntoFolder(LLInventoryCategory* inv_category, BOOL drop, std::string& tooltip_msg);
virtual void performAction(LLInventoryModel* model, std::string action);
virtual void openItem();
@@ -253,7 +265,8 @@ public:
virtual BOOL hasChildren() const;
virtual BOOL dragOrDrop(MASK mask, BOOL drop,
EDragAndDropType cargo_type,
- void* cargo_data);
+ void* cargo_data,
+ std::string& tooltip_msg);
virtual BOOL isItemRemovable() const;
virtual BOOL isItemMovable() const ;
@@ -261,7 +274,6 @@ public:
virtual BOOL isItemCopyable() const;
virtual BOOL isClipboardPasteable() const;
virtual BOOL isClipboardPasteableAsLink() const;
- virtual BOOL copyToClipboard() const;
static void createWearable(LLFolderBridge* bridge, LLWearableType::EType type);
@@ -269,6 +281,9 @@ public:
LLHandle<LLFolderBridge> getHandle() { mHandle.bind(this); return mHandle; }
protected:
+ void buildContextMenuBaseOptions(U32 flags);
+ void buildContextMenuFolderOptions(U32 flags);
+
//--------------------------------------------------------------------
// Menu callbacks
//--------------------------------------------------------------------
@@ -304,12 +319,10 @@ protected:
public:
static LLHandle<LLFolderBridge> sSelf;
static void staticFolderOptionsMenu();
- void folderOptionsMenu();
private:
BOOL mCallingCards;
BOOL mWearables;
- LLHandle<LLView> mMenu;
menuentry_vec_t mItems;
menuentry_vec_t mDisabledItems;
LLRootHandle<LLFolderBridge> mHandle;
@@ -376,7 +389,8 @@ public:
virtual void buildContextMenu(LLMenuGL& menu, U32 flags);
virtual BOOL dragOrDrop(MASK mask, BOOL drop,
EDragAndDropType cargo_type,
- void* cargo_data);
+ void* cargo_data,
+ std::string& tooltip_msg);
void refreshFolderViewItem();
protected:
LLCallingCardObserver* mObserver;
@@ -523,6 +537,24 @@ protected:
static std::string sPrefix;
};
+
+class LLMeshBridge : public LLItemBridge
+{
+ friend class LLInvFVBridge;
+public:
+ virtual LLUIImagePtr getIcon() const;
+ virtual void openItem();
+ virtual void previewItem();
+ virtual void buildContextMenu(LLMenuGL& menu, U32 flags);
+
+protected:
+ LLMeshBridge(LLInventoryPanel* inventory,
+ LLFolderView* root,
+ const LLUUID& uuid) :
+ LLItemBridge(inventory, root, uuid) {}
+};
+
+
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLInvFVBridgeAction
//
@@ -553,6 +585,18 @@ protected:
LLInventoryModel* mModel;
};
+class LLMeshBridgeAction: public LLInvFVBridgeAction
+{
+ friend class LLInvFVBridgeAction;
+public:
+ virtual void doIt() ;
+ virtual ~LLMeshBridgeAction(){}
+protected:
+ LLMeshBridgeAction(const LLUUID& id,LLInventoryModel* model):LLInvFVBridgeAction(id,model){}
+
+};
+
+
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Recent Inventory Panel related classes
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -560,6 +604,7 @@ protected:
// Overridden version of the Inventory-Folder-View-Bridge for Folders
class LLRecentItemsFolderBridge : public LLFolderBridge
{
+ friend class LLInvFVBridgeAction;
public:
// Creates context menu for Folders related to Recent Inventory Panel.
// Uses base logic and than removes from visible items "New..." menu items.
@@ -599,7 +644,8 @@ BOOL move_inv_category_world_to_agent(const LLUUID& object_id,
const LLUUID& category_id,
BOOL drop,
void (*callback)(S32, void*) = NULL,
- void* user_data = NULL);
+ void* user_data = NULL,
+ LLInventoryFilter* filter = NULL);
// Utility function to hide all entries except those in the list
// Can be called multiple times on the same menu (e.g. if multiple items
@@ -607,7 +653,6 @@ BOOL move_inv_category_world_to_agent(const LLUUID& object_id,
// are set as enabled.
void hide_context_entries(LLMenuGL& menu,
const menuentry_vec_t &entries_to_show,
- const menuentry_vec_t &disabled_entries,
- BOOL append = FALSE);
+ const menuentry_vec_t &disabled_entries);
#endif // LL_LLINVENTORYBRIDGE_H
diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp
index ef4774a06d..4d0af94f9f 100644
--- a/indra/newview/llinventoryfilter.cpp
+++ b/indra/newview/llinventoryfilter.cpp
@@ -36,10 +36,14 @@
#include "llviewercontrol.h"
#include "llfolderview.h"
#include "llinventorybridge.h"
+#include "llviewerfoldertype.h"
// linden library includes
+#include "llclipboard.h"
#include "lltrans.h"
+LLFastTimer::DeclareTimer FT_FILTER_CLIPBOARD("Filter Clipboard");
+
LLInventoryFilter::FilterOps::FilterOps() :
mFilterObjectTypes(0xffffffffffffffffULL),
mFilterCategoryTypes(0xffffffffffffffffULL),
@@ -87,11 +91,15 @@ LLInventoryFilter::~LLInventoryFilter()
BOOL LLInventoryFilter::check(const LLFolderViewItem* item)
{
- // If it's a folder and we're showing all folders, return TRUE automatically.
+ // Clipboard cut items are *always* filtered so we need this value upfront
+ const LLFolderViewEventListener* listener = item->getListener();
+ const BOOL passed_clipboard = (listener ? checkAgainstClipboard(listener->getUUID()) : TRUE);
+
+ // If it's a folder and we're showing all folders, return automatically.
const BOOL is_folder = (dynamic_cast<const LLFolderViewFolder*>(item) != NULL);
if (is_folder && (mFilterOps.mShowFolderState == LLInventoryFilter::SHOW_ALL_FOLDERS))
{
- return TRUE;
+ return passed_clipboard;
}
mSubStringMatchOffset = mFilterSubString.size() ? item->getSearchableLabel().find(mFilterSubString) : std::string::npos;
@@ -102,11 +110,75 @@ BOOL LLInventoryFilter::check(const LLFolderViewItem* item)
const BOOL passed = (passed_filtertype &&
passed_permissions &&
passed_filterlink &&
+ passed_clipboard &&
+ (mFilterSubString.size() == 0 || mSubStringMatchOffset != std::string::npos));
+
+ return passed;
+}
+
+bool LLInventoryFilter::check(const LLInventoryItem* item)
+{
+ mSubStringMatchOffset = mFilterSubString.size() ? item->getName().find(mFilterSubString) : std::string::npos;
+
+ const bool passed_filtertype = checkAgainstFilterType(item);
+ const bool passed_permissions = checkAgainstPermissions(item);
+ const BOOL passed_clipboard = checkAgainstClipboard(item->getUUID());
+ const bool passed = (passed_filtertype &&
+ passed_permissions &&
+ passed_clipboard &&
(mFilterSubString.size() == 0 || mSubStringMatchOffset != std::string::npos));
return passed;
}
+bool LLInventoryFilter::checkFolder(const LLFolderViewFolder* folder) const
+{
+ if (!folder)
+ {
+ llwarns << "The filter can not be checked on an invalid folder." << llendl;
+ llassert(false); // crash in development builds
+ return false;
+ }
+
+ const LLFolderViewEventListener* listener = folder->getListener();
+ if (!listener)
+ {
+ llwarns << "Folder view event listener not found." << llendl;
+ llassert(false); // crash in development builds
+ return false;
+ }
+
+ const LLUUID folder_id = listener->getUUID();
+
+ return checkFolder(folder_id);
+}
+
+bool LLInventoryFilter::checkFolder(const LLUUID& folder_id) const
+{
+ // Always check against the clipboard
+ const BOOL passed_clipboard = checkAgainstClipboard(folder_id);
+
+ // we're showing all folders, overriding filter
+ if (mFilterOps.mShowFolderState == LLInventoryFilter::SHOW_ALL_FOLDERS)
+ {
+ return passed_clipboard;
+ }
+
+ if (mFilterOps.mFilterTypes & FILTERTYPE_CATEGORY)
+ {
+ // Can only filter categories for items in your inventory
+ // (e.g. versus in-world object contents).
+ const LLViewerInventoryCategory *cat = gInventory.getCategory(folder_id);
+ if (!cat)
+ return false;
+ LLFolderType::EType cat_type = cat->getPreferredType();
+ if (cat_type != LLFolderType::FT_NONE && (1LL << cat_type & mFilterOps.mFilterCategoryTypes) == U64(0))
+ return false;
+ }
+
+ return passed_clipboard;
+}
+
BOOL LLInventoryFilter::checkAgainstFilterType(const LLFolderViewItem* item) const
{
const LLFolderViewEventListener* listener = item->getListener();
@@ -137,30 +209,6 @@ BOOL LLInventoryFilter::checkAgainstFilterType(const LLFolderViewItem* item) con
}
}
-
- ////////////////////////////////////////////////////////////////////////////////
- // FILTERTYPE_CATEGORY
- // Pass if this item is a category of the filter type, or
- // if its parent is a category of the filter type.
- if (filterTypes & FILTERTYPE_CATEGORY)
- {
- // Can only filter categories for items in your inventory
- // (e.g. versus in-world object contents).
- if (!object) return FALSE;
-
- LLUUID cat_id = object_id;
- if (listener->getInventoryType() != LLInventoryType::IT_CATEGORY)
- {
- cat_id = object->getParentUUID();
- }
- const LLViewerInventoryCategory *cat = gInventory.getCategory(cat_id);
- if (!cat)
- return FALSE;
- if ((1LL << cat->getPreferredType() & mFilterOps.mFilterCategoryTypes) == U64(0))
- return FALSE;
- }
-
-
////////////////////////////////////////////////////////////////////////////////
// FILTERTYPE_UUID
// Pass if this item is the target UUID or if it links to the target UUID
@@ -172,7 +220,6 @@ BOOL LLInventoryFilter::checkAgainstFilterType(const LLFolderViewItem* item) con
return FALSE;
}
-
////////////////////////////////////////////////////////////////////////////////
// FILTERTYPE_DATE
// Pass if this item is within the date range.
@@ -205,9 +252,101 @@ BOOL LLInventoryFilter::checkAgainstFilterType(const LLFolderViewItem* item) con
}
}
+ ////////////////////////////////////////////////////////////////////////////////
+ // FILTERTYPE_EMPTYFOLDERS
+ // Pass if this item is a folder and is not a system folder that should be hidden
+ if (filterTypes & FILTERTYPE_EMPTYFOLDERS)
+ {
+ if (object_type == LLInventoryType::IT_CATEGORY)
+ {
+ bool is_hidden_if_empty = LLViewerFolderType::lookupIsHiddenIfEmpty(listener->getPreferredType());
+ if (is_hidden_if_empty)
+ {
+ // Force the fetching of those folders so they are hidden iff they really are empty...
+ gInventory.fetchDescendentsOf(object_id);
+ return FALSE;
+ }
+ }
+ }
+
return TRUE;
}
+bool LLInventoryFilter::checkAgainstFilterType(const LLInventoryItem* item) const
+{
+ LLInventoryType::EType object_type = item->getInventoryType();
+ const LLUUID object_id = item->getUUID();
+
+ const U32 filterTypes = mFilterOps.mFilterTypes;
+
+ ////////////////////////////////////////////////////////////////////////////////
+ // FILTERTYPE_OBJECT
+ // Pass if this item's type is of the correct filter type
+ if (filterTypes & FILTERTYPE_OBJECT)
+ {
+ // If it has no type, pass it, unless it's a link.
+ if (object_type == LLInventoryType::IT_NONE)
+ {
+ if (item && item->getIsLinkType())
+ {
+ return false;
+ }
+ }
+ else if ((1LL << object_type & mFilterOps.mFilterObjectTypes) == U64(0))
+ {
+ return false;
+ }
+ }
+
+ ////////////////////////////////////////////////////////////////////////////////
+ // FILTERTYPE_UUID
+ // Pass if this item is the target UUID or if it links to the target UUID
+ if (filterTypes & FILTERTYPE_UUID)
+ {
+ if (!item) return false;
+
+ if (item->getLinkedUUID() != mFilterOps.mFilterUUID)
+ return false;
+ }
+
+ ////////////////////////////////////////////////////////////////////////////////
+ // FILTERTYPE_DATE
+ // Pass if this item is within the date range.
+ if (filterTypes & FILTERTYPE_DATE)
+ {
+ // We don't get the updated item creation date for the task inventory or
+ // a notecard embedded item. See LLTaskInvFVBridge::getCreationDate().
+ return false;
+ }
+
+ return true;
+}
+
+// Items and folders that are on the clipboard or, recursively, in a folder which
+// is on the clipboard must be filtered out if the clipboard is in the "cut" mode.
+bool LLInventoryFilter::checkAgainstClipboard(const LLUUID& object_id) const
+{
+ if (LLClipboard::instance().isCutMode())
+ {
+ LLFastTimer ft(FT_FILTER_CLIPBOARD);
+ LLUUID current_id = object_id;
+ LLInventoryObject *current_object = gInventory.getObject(object_id);
+ while (current_id.notNull() && current_object)
+ {
+ if (LLClipboard::instance().isOnClipboard(current_id))
+ {
+ return false;
+ }
+ current_id = current_object->getParentUUID();
+ if (current_id.notNull())
+ {
+ current_object = gInventory.getObject(current_id);
+ }
+ }
+ }
+ return true;
+}
+
BOOL LLInventoryFilter::checkAgainstPermissions(const LLFolderViewItem* item) const
{
const LLFolderViewEventListener* listener = item->getListener();
@@ -225,6 +364,17 @@ BOOL LLInventoryFilter::checkAgainstPermissions(const LLFolderViewItem* item) co
return (perm & mFilterOps.mPermissions) == mFilterOps.mPermissions;
}
+bool LLInventoryFilter::checkAgainstPermissions(const LLInventoryItem* item) const
+{
+ if (!item) return false;
+
+ LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
+ PermissionMask perm = new_item->getPermissionMask();
+ new_item = NULL;
+
+ return (perm & mFilterOps.mPermissions) == mFilterOps.mPermissions;
+}
+
BOOL LLInventoryFilter::checkAgainstFilterLinks(const LLFolderViewItem* item) const
{
const LLFolderViewEventListener* listener = item->getListener();
@@ -252,19 +402,28 @@ std::string::size_type LLInventoryFilter::getStringMatchOffset() const
return mSubStringMatchOffset;
}
+BOOL LLInventoryFilter::isDefault() const
+{
+ return !isNotDefault();
+}
+
// has user modified default filter params?
BOOL LLInventoryFilter::isNotDefault() const
{
- return mFilterOps.mFilterObjectTypes != mDefaultFilterOps.mFilterObjectTypes
- || mFilterOps.mFilterCategoryTypes != mDefaultFilterOps.mFilterCategoryTypes
- || mFilterOps.mFilterWearableTypes != mDefaultFilterOps.mFilterWearableTypes
- || mFilterOps.mFilterTypes != FILTERTYPE_OBJECT
- || mFilterOps.mFilterLinks != FILTERLINK_INCLUDE_LINKS
- || mFilterSubString.size()
- || mFilterOps.mPermissions != mDefaultFilterOps.mPermissions
- || mFilterOps.mMinDate != mDefaultFilterOps.mMinDate
- || mFilterOps.mMaxDate != mDefaultFilterOps.mMaxDate
- || mFilterOps.mHoursAgo != mDefaultFilterOps.mHoursAgo;
+ BOOL not_default = FALSE;
+
+ not_default |= (mFilterOps.mFilterObjectTypes != mDefaultFilterOps.mFilterObjectTypes);
+ not_default |= (mFilterOps.mFilterCategoryTypes != mDefaultFilterOps.mFilterCategoryTypes);
+ not_default |= (mFilterOps.mFilterWearableTypes != mDefaultFilterOps.mFilterWearableTypes);
+ not_default |= (mFilterOps.mFilterTypes != mDefaultFilterOps.mFilterTypes);
+ not_default |= (mFilterOps.mFilterLinks != mDefaultFilterOps.mFilterLinks);
+ not_default |= (mFilterSubString.size());
+ not_default |= (mFilterOps.mPermissions != mDefaultFilterOps.mPermissions);
+ not_default |= (mFilterOps.mMinDate != mDefaultFilterOps.mMinDate);
+ not_default |= (mFilterOps.mMaxDate != mDefaultFilterOps.mMaxDate);
+ not_default |= (mFilterOps.mHoursAgo != mDefaultFilterOps.mHoursAgo);
+
+ return not_default;
}
BOOL LLInventoryFilter::isActive() const
@@ -293,15 +452,15 @@ BOOL LLInventoryFilter::isModifiedAndClear()
return ret;
}
-void LLInventoryFilter::setFilterObjectTypes(U64 types)
+void LLInventoryFilter::updateFilterTypes(U64 types, U64& current_types)
{
- if (mFilterOps.mFilterObjectTypes != types)
+ if (current_types != types)
{
// keep current items only if no type bits getting turned off
- BOOL fewer_bits_set = (mFilterOps.mFilterObjectTypes & ~types);
- BOOL more_bits_set = (~mFilterOps.mFilterObjectTypes & types);
+ bool fewer_bits_set = (current_types & ~types) != 0;
+ bool more_bits_set = (~current_types & types) != 0;
- mFilterOps.mFilterObjectTypes = types;
+ current_types = types;
if (more_bits_set && fewer_bits_set)
{
// neither less or more restrive, both simultaneously
@@ -318,65 +477,31 @@ void LLInventoryFilter::setFilterObjectTypes(U64 types)
setModified(FILTER_MORE_RESTRICTIVE);
}
}
+}
+
+void LLInventoryFilter::setFilterObjectTypes(U64 types)
+{
+ updateFilterTypes(types, mFilterOps.mFilterObjectTypes);
mFilterOps.mFilterTypes |= FILTERTYPE_OBJECT;
}
void LLInventoryFilter::setFilterCategoryTypes(U64 types)
{
- if (mFilterOps.mFilterCategoryTypes != types)
- {
- // keep current items only if no type bits getting turned off
- BOOL fewer_bits_set = (mFilterOps.mFilterCategoryTypes & ~types);
- BOOL more_bits_set = (~mFilterOps.mFilterCategoryTypes & types);
-
- mFilterOps.mFilterCategoryTypes = types;
- if (more_bits_set && fewer_bits_set)
- {
- // neither less or more restrive, both simultaneously
- // so we need to filter from scratch
- setModified(FILTER_RESTART);
- }
- else if (more_bits_set)
- {
- // target is only one of all requested types so more type bits == less restrictive
- setModified(FILTER_LESS_RESTRICTIVE);
- }
- else if (fewer_bits_set)
- {
- setModified(FILTER_MORE_RESTRICTIVE);
- }
- }
- mFilterOps.mFilterTypes |= FILTERTYPE_OBJECT;
+ updateFilterTypes(types, mFilterOps.mFilterCategoryTypes);
+ mFilterOps.mFilterTypes |= FILTERTYPE_CATEGORY;
}
void LLInventoryFilter::setFilterWearableTypes(U64 types)
{
- if (mFilterOps.mFilterWearableTypes != types)
- {
- // keep current items only if no type bits getting turned off
- BOOL fewer_bits_set = (mFilterOps.mFilterWearableTypes & ~types);
- BOOL more_bits_set = (~mFilterOps.mFilterWearableTypes & types);
-
- mFilterOps.mFilterWearableTypes = types;
- if (more_bits_set && fewer_bits_set)
- {
- // neither less or more restrive, both simultaneously
- // so we need to filter from scratch
- setModified(FILTER_RESTART);
- }
- else if (more_bits_set)
- {
- // target is only one of all requested types so more type bits == less restrictive
- setModified(FILTER_LESS_RESTRICTIVE);
- }
- else if (fewer_bits_set)
- {
- setModified(FILTER_MORE_RESTRICTIVE);
- }
- }
+ updateFilterTypes(types, mFilterOps.mFilterWearableTypes);
mFilterOps.mFilterTypes |= FILTERTYPE_WEARABLE;
}
+void LLInventoryFilter::setFilterEmptySystemFolders()
+{
+ mFilterOps.mFilterTypes |= FILTERTYPE_EMPTYFOLDERS;
+}
+
void LLInventoryFilter::setFilterUUID(const LLUUID& object_id)
{
if (mFilterOps.mFilterUUID == LLUUID::null)
@@ -393,18 +518,22 @@ void LLInventoryFilter::setFilterUUID(const LLUUID& object_id)
void LLInventoryFilter::setFilterSubString(const std::string& string)
{
- if (mFilterSubString != string)
+ std::string filter_sub_string_new = string;
+ mFilterSubStringOrig = string;
+ LLStringUtil::trimHead(filter_sub_string_new);
+ LLStringUtil::toUpper(filter_sub_string_new);
+
+ if (mFilterSubString != filter_sub_string_new)
{
// hitting BACKSPACE, for example
- const BOOL less_restrictive = mFilterSubString.size() >= string.size() && !mFilterSubString.substr(0, string.size()).compare(string);
+ const BOOL less_restrictive = mFilterSubString.size() >= filter_sub_string_new.size()
+ && !mFilterSubString.substr(0, filter_sub_string_new.size()).compare(filter_sub_string_new);
// appending new characters
- const BOOL more_restrictive = mFilterSubString.size() < string.size() && !string.substr(0, mFilterSubString.size()).compare(mFilterSubString);
+ const BOOL more_restrictive = mFilterSubString.size() < filter_sub_string_new.size()
+ && !filter_sub_string_new.substr(0, mFilterSubString.size()).compare(mFilterSubString);
- mFilterSubStringOrig = string;
- LLStringUtil::trimHead(mFilterSubStringOrig);
- mFilterSubString = mFilterSubStringOrig;
- LLStringUtil::toUpper(mFilterSubString);
+ mFilterSubString = filter_sub_string_new;
if (less_restrictive)
{
setModified(FILTER_LESS_RESTRICTIVE);
@@ -471,7 +600,15 @@ void LLInventoryFilter::setDateRange(time_t min_date, time_t max_date)
mFilterOps.mMaxDate = llmax(mFilterOps.mMinDate, max_date);
setModified();
}
- mFilterOps.mFilterTypes |= FILTERTYPE_DATE;
+
+ if (areDateLimitsSet())
+ {
+ mFilterOps.mFilterTypes |= FILTERTYPE_DATE;
+ }
+ else
+ {
+ mFilterOps.mFilterTypes &= ~FILTERTYPE_DATE;
+ }
}
void LLInventoryFilter::setDateRangeLastLogoff(BOOL sl)
@@ -483,10 +620,18 @@ void LLInventoryFilter::setDateRangeLastLogoff(BOOL sl)
}
if (!sl && isSinceLogoff())
{
- setDateRange(0, time_max());
+ setDateRange(time_min(), time_max());
setModified();
}
- mFilterOps.mFilterTypes |= FILTERTYPE_DATE;
+
+ if (areDateLimitsSet())
+ {
+ mFilterOps.mFilterTypes |= FILTERTYPE_DATE;
+ }
+ else
+ {
+ mFilterOps.mFilterTypes &= ~FILTERTYPE_DATE;
+ }
}
BOOL LLInventoryFilter::isSinceLogoff() const
@@ -506,9 +651,15 @@ void LLInventoryFilter::setHoursAgo(U32 hours)
{
if (mFilterOps.mHoursAgo != hours)
{
+ bool are_date_limits_valid = mFilterOps.mMinDate == time_min() && mFilterOps.mMaxDate == time_max();
+
+ bool is_increasing = hours > mFilterOps.mHoursAgo;
+ bool is_increasing_from_zero = is_increasing && !mFilterOps.mHoursAgo;
+
// *NOTE: need to cache last filter time, in case filter goes stale
- BOOL less_restrictive = (mFilterOps.mMinDate == time_min() && mFilterOps.mMaxDate == time_max() && hours > mFilterOps.mHoursAgo);
- BOOL more_restrictive = (mFilterOps.mMinDate == time_min() && mFilterOps.mMaxDate == time_max() && hours <= mFilterOps.mHoursAgo);
+ BOOL less_restrictive = (are_date_limits_valid && ((is_increasing && mFilterOps.mHoursAgo)) || !hours);
+ BOOL more_restrictive = (are_date_limits_valid && (!is_increasing && hours) || is_increasing_from_zero);
+
mFilterOps.mHoursAgo = hours;
mFilterOps.mMinDate = time_min();
mFilterOps.mMaxDate = time_max();
@@ -525,7 +676,15 @@ void LLInventoryFilter::setHoursAgo(U32 hours)
setModified(FILTER_RESTART);
}
}
- mFilterOps.mFilterTypes |= FILTERTYPE_DATE;
+
+ if (areDateLimitsSet())
+ {
+ mFilterOps.mFilterTypes |= FILTERTYPE_DATE;
+ }
+ else
+ {
+ mFilterOps.mFilterTypes &= ~FILTERTYPE_DATE;
+ }
}
void LLInventoryFilter::setFilterLinks(U64 filter_links)
@@ -805,7 +964,7 @@ const std::string& LLInventoryFilter::getFilterText()
filtered_by_all_types = FALSE;
}
- if (!LLInventoryModelBackgroundFetch::instance().backgroundFetchActive()
+ if (!LLInventoryModelBackgroundFetch::instance().folderFetchActive()
&& filtered_by_type
&& !filtered_by_all_types)
{
@@ -849,7 +1008,7 @@ void LLInventoryFilter::fromLLSD(LLSD& data)
{
if(data.has("filter_types"))
{
- setFilterObjectTypes((U32)data["filter_types"].asInteger());
+ setFilterObjectTypes((U64)data["filter_types"].asInteger());
}
if(data.has("min_date") && data.has("max_date"))
@@ -888,11 +1047,16 @@ void LLInventoryFilter::fromLLSD(LLSD& data)
}
}
-U32 LLInventoryFilter::getFilterObjectTypes() const
+U64 LLInventoryFilter::getFilterObjectTypes() const
{
return mFilterOps.mFilterObjectTypes;
}
+U64 LLInventoryFilter::getFilterCategoryTypes() const
+{
+ return mFilterOps.mFilterCategoryTypes;
+}
+
BOOL LLInventoryFilter::hasFilterString() const
{
return mFilterSubString.size() > 0;
@@ -970,3 +1134,10 @@ const std::string& LLInventoryFilter::getEmptyLookupMessage() const
return mEmptyLookupMessage;
}
+
+bool LLInventoryFilter::areDateLimitsSet()
+{
+ return mFilterOps.mMinDate != time_min()
+ || mFilterOps.mMaxDate != time_max()
+ || mFilterOps.mHoursAgo != 0;
+}
diff --git a/indra/newview/llinventoryfilter.h b/indra/newview/llinventoryfilter.h
index f488b2ed1b..9e600c036f 100644
--- a/indra/newview/llinventoryfilter.h
+++ b/indra/newview/llinventoryfilter.h
@@ -31,6 +31,8 @@
#include "llpermissionsflags.h"
class LLFolderViewItem;
+class LLFolderViewFolder;
+class LLInventoryItem;
class LLInventoryFilter
{
@@ -56,7 +58,8 @@ public:
FILTERTYPE_CATEGORY = 0x1 << 1, // search by folder type
FILTERTYPE_UUID = 0x1 << 2, // find the object with UUID and any links to it
FILTERTYPE_DATE = 0x1 << 3, // search by date range
- FILTERTYPE_WEARABLE = 0x1 << 4 // search by wearable type
+ FILTERTYPE_WEARABLE = 0x1 << 4, // search by wearable type
+ FILTERTYPE_EMPTYFOLDERS = 0x1 << 5 // pass if folder is not a system folder to be hidden if empty
};
enum EFilterLink
@@ -66,10 +69,13 @@ public:
FILTERLINK_ONLY_LINKS // only show links
};
- // REFACTOR: Change this to an enum.
- static const U32 SO_DATE = 1;
- static const U32 SO_FOLDERS_BY_NAME = 2;
- static const U32 SO_SYSTEM_FOLDERS_TO_TOP = 4;
+ enum ESortOrderType
+ {
+ SO_NAME = 0, // Sort inventory by name
+ SO_DATE = 0x1, // Sort inventory by date
+ SO_FOLDERS_BY_NAME = 0x1 << 1, // Force folder sort by name
+ SO_SYSTEM_FOLDERS_TO_TOP = 0x1 << 2 // Force system folders to be on top
+ };
LLInventoryFilter(const std::string& name);
virtual ~LLInventoryFilter();
@@ -78,11 +84,14 @@ public:
// + Parameters
// +-------------------------------------------------------------------+
void setFilterObjectTypes(U64 types);
- U32 getFilterObjectTypes() const;
+ U64 getFilterObjectTypes() const;
+ U64 getFilterCategoryTypes() const;
BOOL isFilterObjectTypesWith(LLInventoryType::EType t) const;
void setFilterCategoryTypes(U64 types);
void setFilterUUID(const LLUUID &object_id);
void setFilterWearableTypes(U64 types);
+ void setFilterEmptySystemFolders();
+ void updateFilterTypes(U64 types, U64& current_types);
void setFilterSubString(const std::string& string);
const std::string& getFilterSubString(BOOL trim = FALSE) const;
@@ -107,9 +116,15 @@ public:
// + Execution And Results
// +-------------------------------------------------------------------+
BOOL check(const LLFolderViewItem* item);
+ bool check(const LLInventoryItem* item);
+ bool checkFolder(const LLFolderViewFolder* folder) const;
+ bool checkFolder(const LLUUID& folder_id) const;
BOOL checkAgainstFilterType(const LLFolderViewItem* item) const;
+ bool checkAgainstFilterType(const LLInventoryItem* item) const;
BOOL checkAgainstPermissions(const LLFolderViewItem* item) const;
+ bool checkAgainstPermissions(const LLInventoryItem* item) const;
BOOL checkAgainstFilterLinks(const LLFolderViewItem* item) const;
+ bool checkAgainstClipboard(const LLUUID& object_id) const;
std::string::size_type getStringMatchOffset() const;
@@ -148,6 +163,7 @@ public:
// +-------------------------------------------------------------------+
// + Default
// +-------------------------------------------------------------------+
+ BOOL isDefault() const;
BOOL isNotDefault() const;
void markDefault();
void resetDefault();
@@ -166,6 +182,8 @@ public:
void fromLLSD(LLSD& data);
private:
+ bool areDateLimitsSet();
+
struct FilterOps
{
FilterOps();
diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp
index ef20869114..ab5b082915 100644
--- a/indra/newview/llinventoryfunctions.cpp
+++ b/indra/newview/llinventoryfunctions.cpp
@@ -47,17 +47,19 @@
#include "llappviewer.h"
//#include "llfirstuse.h"
#include "llfloaterinventory.h"
+#include "llfloatersidepanelcontainer.h"
#include "llfocusmgr.h"
#include "llfolderview.h"
#include "llgesturemgr.h"
#include "lliconctrl.h"
#include "llimview.h"
#include "llinventorybridge.h"
-#include "llinventoryclipboard.h"
#include "llinventorymodel.h"
#include "llinventorypanel.h"
#include "lllineeditor.h"
+#include "llmarketplacenotifications.h"
#include "llmenugl.h"
+#include "llnotificationsutil.h"
#include "llpanelmaininventory.h"
#include "llpreviewanim.h"
#include "llpreviewgesture.h"
@@ -69,7 +71,6 @@
#include "llscrollbar.h"
#include "llscrollcontainer.h"
#include "llselectmgr.h"
-#include "llsidetray.h"
#include "llsidepanelinventory.h"
#include "lltabcontainer.h"
#include "lltooldraganddrop.h"
@@ -81,6 +82,8 @@
#include "llvoavatarself.h"
#include "llwearablelist.h"
+#include <boost/foreach.hpp>
+
BOOL LLInventoryState::sWearNewClothing = FALSE;
LLUUID LLInventoryState::sWearNewClothingTransactionID;
@@ -105,109 +108,119 @@ void append_path(const LLUUID& id, std::string& path)
path.append(temp);
}
-void change_item_parent(LLInventoryModel* model,
- LLViewerInventoryItem* item,
- const LLUUID& new_parent_id,
- BOOL restamp)
-{
- if (item->getParentUUID() != new_parent_id)
- {
- LLInventoryModel::update_list_t update;
- LLInventoryModel::LLCategoryUpdate old_folder(item->getParentUUID(),-1);
- update.push_back(old_folder);
- LLInventoryModel::LLCategoryUpdate new_folder(new_parent_id, 1);
- update.push_back(new_folder);
- gInventory.accountForUpdate(update);
-
- LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
- new_item->setParent(new_parent_id);
- new_item->updateParentOnServer(restamp);
- model->updateItem(new_item);
- model->notifyObservers();
- }
-}
-
-void change_category_parent(LLInventoryModel* model,
- LLViewerInventoryCategory* cat,
- const LLUUID& new_parent_id,
- BOOL restamp)
+void rename_category(LLInventoryModel* model, const LLUUID& cat_id, const std::string& new_name)
{
- if (!model || !cat)
- {
- return;
- }
+ LLViewerInventoryCategory* cat;
- // Can't move a folder into a child of itself.
- if (model->isObjectDescendentOf(new_parent_id, cat->getUUID()))
+ if (!model ||
+ !get_is_category_renameable(model, cat_id) ||
+ (cat = model->getCategory(cat_id)) == NULL ||
+ cat->getName() == new_name)
{
return;
}
- LLInventoryModel::update_list_t update;
- LLInventoryModel::LLCategoryUpdate old_folder(cat->getParentUUID(), -1);
- update.push_back(old_folder);
- LLInventoryModel::LLCategoryUpdate new_folder(new_parent_id, 1);
- update.push_back(new_folder);
- model->accountForUpdate(update);
-
LLPointer<LLViewerInventoryCategory> new_cat = new LLViewerInventoryCategory(cat);
- new_cat->setParent(new_parent_id);
- new_cat->updateParentOnServer(restamp);
+ new_cat->rename(new_name);
+ new_cat->updateServer(FALSE);
model->updateCategory(new_cat);
+
model->notifyObservers();
}
-void remove_category(LLInventoryModel* model, const LLUUID& cat_id)
+void copy_inventory_category(LLInventoryModel* model,
+ LLViewerInventoryCategory* cat,
+ const LLUUID& parent_id,
+ const LLUUID& root_copy_id)
{
- if (!model || !get_is_category_removable(model, cat_id))
- {
- return;
- }
+ // Create the initial folder
+ LLUUID new_cat_uuid = gInventory.createNewCategory(parent_id, LLFolderType::FT_NONE, cat->getName());
+ model->notifyObservers();
+
+ // We need to exclude the initial root of the copy to avoid recursively copying the copy, etc...
+ LLUUID root_id = (root_copy_id.isNull() ? new_cat_uuid : root_copy_id);
- // Look for any gestures and deactivate them
- LLInventoryModel::cat_array_t descendent_categories;
- LLInventoryModel::item_array_t descendent_items;
- gInventory.collectDescendents(cat_id, descendent_categories, descendent_items, FALSE);
+ // Get the content of the folder
+ LLInventoryModel::cat_array_t* cat_array;
+ LLInventoryModel::item_array_t* item_array;
+ gInventory.getDirectDescendentsOf(cat->getUUID(),cat_array,item_array);
- for (LLInventoryModel::item_array_t::const_iterator iter = descendent_items.begin();
- iter != descendent_items.end();
- ++iter)
+ // Copy all the items
+ LLInventoryModel::item_array_t item_array_copy = *item_array;
+ for (LLInventoryModel::item_array_t::iterator iter = item_array_copy.begin(); iter != item_array_copy.end(); iter++)
{
- const LLViewerInventoryItem* item = (*iter);
- const LLUUID& item_id = item->getUUID();
- if (item->getType() == LLAssetType::AT_GESTURE
- && LLGestureMgr::instance().isGestureActive(item_id))
+ LLInventoryItem* item = *iter;
+ copy_inventory_item(
+ gAgent.getID(),
+ item->getPermissions().getOwner(),
+ item->getUUID(),
+ new_cat_uuid,
+ std::string(),
+ LLPointer<LLInventoryCallback>(NULL));
+ }
+
+ // Copy all the folders
+ LLInventoryModel::cat_array_t cat_array_copy = *cat_array;
+ for (LLInventoryModel::cat_array_t::iterator iter = cat_array_copy.begin(); iter != cat_array_copy.end(); iter++)
+ {
+ LLViewerInventoryCategory* category = *iter;
+ if (category->getUUID() != root_id)
{
- LLGestureMgr::instance().deactivateGesture(item_id);
+ copy_inventory_category(model, category, new_cat_uuid, root_id);
}
}
+}
- LLViewerInventoryCategory* cat = gInventory.getCategory(cat_id);
- if (cat)
+class LLInventoryCollectAllItems : public LLInventoryCollectFunctor
+{
+public:
+ virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item)
{
- const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
- change_category_parent(model, cat, trash_id, TRUE);
+ return true;
}
-}
+};
-void rename_category(LLInventoryModel* model, const LLUUID& cat_id, const std::string& new_name)
+BOOL get_is_parent_to_worn_item(const LLUUID& id)
{
- LLViewerInventoryCategory* cat;
-
- if (!model ||
- !get_is_category_renameable(model, cat_id) ||
- (cat = model->getCategory(cat_id)) == NULL ||
- cat->getName() == new_name)
+ const LLViewerInventoryCategory* cat = gInventory.getCategory(id);
+ if (!cat)
{
- return;
+ return FALSE;
}
- LLPointer<LLViewerInventoryCategory> new_cat = new LLViewerInventoryCategory(cat);
- new_cat->rename(new_name);
- new_cat->updateServer(FALSE);
- model->updateCategory(new_cat);
+ LLInventoryModel::cat_array_t cats;
+ LLInventoryModel::item_array_t items;
+ LLInventoryCollectAllItems collect_all;
+ gInventory.collectDescendentsIf(LLAppearanceMgr::instance().getCOF(), cats, items, LLInventoryModel::EXCLUDE_TRASH, collect_all);
- model->notifyObservers();
+ for (LLInventoryModel::item_array_t::const_iterator it = items.begin(); it != items.end(); ++it)
+ {
+ const LLViewerInventoryItem * const item = *it;
+
+ llassert(item->getIsLinkType());
+
+ LLUUID linked_id = item->getLinkedUUID();
+ const LLViewerInventoryItem * const linked_item = gInventory.getItem(linked_id);
+
+ if (linked_item)
+ {
+ LLUUID parent_id = linked_item->getParentUUID();
+
+ while (!parent_id.isNull())
+ {
+ LLInventoryCategory * parent_cat = gInventory.getCategory(parent_id);
+
+ if (cat == parent_cat)
+ {
+ return TRUE;
+ }
+
+ parent_id = parent_cat->getParentUUID();
+ }
+ }
+ }
+
+ return FALSE;
}
BOOL get_is_item_worn(const LLUUID& id)
@@ -406,22 +419,28 @@ BOOL get_is_category_renameable(const LLInventoryModel* model, const LLUUID& id)
void show_task_item_profile(const LLUUID& item_uuid, const LLUUID& object_id)
{
- LLSideTray::getInstance()->showPanel("sidepanel_inventory", LLSD().with("id", item_uuid).with("object", object_id));
+ LLFloaterSidePanelContainer::showPanel("inventory", LLSD().with("id", item_uuid).with("object", object_id));
}
void show_item_profile(const LLUUID& item_uuid)
{
LLUUID linked_uuid = gInventory.getLinkedItemID(item_uuid);
- LLSideTray::getInstance()->showPanel("sidepanel_inventory", LLSD().with("id", linked_uuid));
+ LLFloaterSidePanelContainer::showPanel("inventory", LLSD().with("id", linked_uuid));
}
void show_item_original(const LLUUID& item_uuid)
{
+ LLFloater* floater_inventory = LLFloaterReg::getInstance("inventory");
+ if (!floater_inventory)
+ {
+ llwarns << "Could not find My Inventory floater" << llendl;
+ return;
+ }
+
//sidetray inventory panel
- LLSidepanelInventory *sidepanel_inventory =
- dynamic_cast<LLSidepanelInventory *>(LLSideTray::getInstance()->getPanel("sidepanel_inventory"));
+ LLSidepanelInventory *sidepanel_inventory = LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory");
- bool reset_inventory_filter = !LLSideTray::getInstance()->isPanelActive("sidepanel_inventory");
+ bool reset_inventory_filter = !floater_inventory->isInVisibleChain();
LLInventoryPanel* active_panel = LLInventoryPanel::getActiveInventoryPanel();
if (!active_panel)
@@ -471,6 +490,177 @@ void show_item_original(const LLUUID& item_uuid)
}
}
+
+void open_outbox()
+{
+ LLFloaterReg::showInstance("outbox");
+}
+
+LLUUID create_folder_in_outbox_for_item(LLInventoryItem* item, const LLUUID& destFolderId, S32 operation_id)
+{
+ llassert(item);
+ llassert(destFolderId.notNull());
+
+ LLUUID created_folder_id = gInventory.createNewCategory(destFolderId, LLFolderType::FT_NONE, item->getName());
+ gInventory.notifyObservers();
+
+ LLNotificationsUtil::add("OutboxFolderCreated");
+
+ return created_folder_id;
+}
+
+void move_to_outbox_cb_action(const LLSD& payload)
+{
+ LLViewerInventoryItem * viitem = gInventory.getItem(payload["item_id"].asUUID());
+ LLUUID dest_folder_id = payload["dest_folder_id"].asUUID();
+
+ if (viitem)
+ {
+ // when moving item directly into outbox create folder with that name
+ if (dest_folder_id == gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false))
+ {
+ S32 operation_id = payload["operation_id"].asInteger();
+ dest_folder_id = create_folder_in_outbox_for_item(viitem, dest_folder_id, operation_id);
+ }
+
+ LLUUID parent = viitem->getParentUUID();
+
+ gInventory.changeItemParent(
+ viitem,
+ dest_folder_id,
+ false);
+
+ LLUUID top_level_folder = payload["top_level_folder"].asUUID();
+
+ if (top_level_folder != LLUUID::null)
+ {
+ LLViewerInventoryCategory* category;
+
+ while (parent.notNull())
+ {
+ LLInventoryModel::cat_array_t* cat_array;
+ LLInventoryModel::item_array_t* item_array;
+ gInventory.getDirectDescendentsOf(parent,cat_array,item_array);
+
+ LLUUID next_parent;
+
+ category = gInventory.getCategory(parent);
+
+ if (!category) break;
+
+ next_parent = category->getParentUUID();
+
+ if (cat_array->empty() && item_array->empty())
+ {
+ gInventory.removeCategory(parent);
+ }
+
+ if (parent == top_level_folder)
+ {
+ break;
+ }
+
+ parent = next_parent;
+ }
+ }
+
+ open_outbox();
+ }
+}
+
+void copy_item_to_outbox(LLInventoryItem* inv_item, LLUUID dest_folder, const LLUUID& top_level_folder, S32 operation_id)
+{
+ // Collapse links directly to items/folders
+ LLViewerInventoryItem * viewer_inv_item = (LLViewerInventoryItem *) inv_item;
+ LLViewerInventoryCategory * linked_category = viewer_inv_item->getLinkedCategory();
+ if (linked_category != NULL)
+ {
+ copy_folder_to_outbox(linked_category, dest_folder, top_level_folder, operation_id);
+ }
+ else
+ {
+ LLViewerInventoryItem * linked_item = viewer_inv_item->getLinkedItem();
+ if (linked_item != NULL)
+ {
+ inv_item = (LLInventoryItem *) linked_item;
+ }
+
+ // Check for copy permissions
+ if (inv_item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID(), gAgent.getGroupID()))
+ {
+ // when moving item directly into outbox create folder with that name
+ if (dest_folder == gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false))
+ {
+ dest_folder = create_folder_in_outbox_for_item(inv_item, dest_folder, operation_id);
+ }
+
+ copy_inventory_item(gAgent.getID(),
+ inv_item->getPermissions().getOwner(),
+ inv_item->getUUID(),
+ dest_folder,
+ inv_item->getName(),
+ LLPointer<LLInventoryCallback>(NULL));
+
+ open_outbox();
+ }
+ else
+ {
+ LLSD payload;
+ payload["item_id"] = inv_item->getUUID();
+ payload["dest_folder_id"] = dest_folder;
+ payload["top_level_folder"] = top_level_folder;
+ payload["operation_id"] = operation_id;
+
+ LLMarketplaceInventoryNotifications::addNoCopyNotification(payload, move_to_outbox_cb_action);
+ }
+ }
+}
+
+void move_item_within_outbox(LLInventoryItem* inv_item, LLUUID dest_folder, S32 operation_id)
+{
+ // when moving item directly into outbox create folder with that name
+ if (dest_folder == gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false))
+ {
+ dest_folder = create_folder_in_outbox_for_item(inv_item, dest_folder, operation_id);
+ }
+
+ LLViewerInventoryItem * viewer_inv_item = (LLViewerInventoryItem *) inv_item;
+
+ gInventory.changeItemParent(
+ viewer_inv_item,
+ dest_folder,
+ false);
+}
+
+void copy_folder_to_outbox(LLInventoryCategory* inv_cat, const LLUUID& dest_folder, const LLUUID& top_level_folder, S32 operation_id)
+{
+ LLUUID new_folder_id = gInventory.createNewCategory(dest_folder, LLFolderType::FT_NONE, inv_cat->getName());
+ gInventory.notifyObservers();
+
+ LLInventoryModel::cat_array_t* cat_array;
+ LLInventoryModel::item_array_t* item_array;
+ gInventory.getDirectDescendentsOf(inv_cat->getUUID(),cat_array,item_array);
+
+ // copy the vector because otherwise the iterator won't be happy if we delete from it
+ LLInventoryModel::item_array_t item_array_copy = *item_array;
+
+ for (LLInventoryModel::item_array_t::iterator iter = item_array_copy.begin(); iter != item_array_copy.end(); iter++)
+ {
+ LLInventoryItem* item = *iter;
+ copy_item_to_outbox(item, new_folder_id, top_level_folder, operation_id);
+ }
+
+ LLInventoryModel::cat_array_t cat_array_copy = *cat_array;
+
+ for (LLInventoryModel::cat_array_t::iterator iter = cat_array_copy.begin(); iter != cat_array_copy.end(); iter++)
+ {
+ LLViewerInventoryCategory* category = *iter;
+ copy_folder_to_outbox(category, new_folder_id, top_level_folder, operation_id);
+ }
+
+ open_outbox();
+}
+
///----------------------------------------------------------------------------
/// LLInventoryCollectFunctor implementations
///----------------------------------------------------------------------------
@@ -483,9 +673,6 @@ bool LLInventoryCollectFunctor::itemTransferCommonlyAllowed(const LLInventoryIte
switch(item->getType())
{
- case LLAssetType::AT_CALLINGCARD:
- return false;
- break;
case LLAssetType::AT_OBJECT:
case LLAssetType::AT_BODYPART:
case LLAssetType::AT_CLOTHING:
@@ -686,6 +873,12 @@ bool LLFindWearablesEx::operator()(LLInventoryCategory* cat, LLInventoryItem* it
return false;
}
+ // Skip broken links.
+ if (vitem->getIsBrokenLink())
+ {
+ return false;
+ }
+
return (bool) get_is_item_worn(item->getUUID()) == mIsWorn;
}
@@ -755,20 +948,24 @@ void LLSaveFolderState::setApply(BOOL apply)
void LLSaveFolderState::doFolder(LLFolderViewFolder* folder)
{
LLMemType mt(LLMemType::MTYPE_INVENTORY_DO_FOLDER);
+ LLInvFVBridge* bridge = (LLInvFVBridge*)folder->getListener();
+ if(!bridge) return;
+
if(mApply)
{
// we're applying the open state
- LLInvFVBridge* bridge = (LLInvFVBridge*)folder->getListener();
- if(!bridge) return;
LLUUID id(bridge->getUUID());
if(mOpenFolders.find(id) != mOpenFolders.end())
{
- folder->setOpen(TRUE);
+ if (!folder->isOpen())
+ {
+ folder->setOpen(TRUE);
+ }
}
else
{
// keep selected filter in its current state, this is less jarring to user
- if (!folder->isSelected())
+ if (!folder->isSelected() && folder->isOpen())
{
folder->setOpen(FALSE);
}
@@ -779,8 +976,6 @@ void LLSaveFolderState::doFolder(LLFolderViewFolder* folder)
// we're recording state at this point
if(folder->isOpen())
{
- LLInvFVBridge* bridge = (LLInvFVBridge*)folder->getListener();
- if(!bridge) return;
mOpenFolders.insert(bridge->getUUID());
}
}
@@ -816,7 +1011,6 @@ void LLSelectFirstFilteredItem::doItem(LLFolderViewItem *item)
{
item->getParentFolder()->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP);
}
- item->getRoot()->scrollToShowSelection();
mItemSelected = TRUE;
}
}
@@ -830,7 +1024,6 @@ void LLSelectFirstFilteredItem::doFolder(LLFolderViewFolder* folder)
{
folder->getParentFolder()->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP);
}
- folder->getRoot()->scrollToShowSelection();
mItemSelected = TRUE;
}
}
@@ -850,3 +1043,4 @@ void LLOpenFoldersWithSelection::doFolder(LLFolderViewFolder* folder)
folder->getParentFolder()->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP);
}
}
+
diff --git a/indra/newview/llinventoryfunctions.h b/indra/newview/llinventoryfunctions.h
index cfe1747fd4..5cf9c528b0 100644
--- a/indra/newview/llinventoryfunctions.h
+++ b/indra/newview/llinventoryfunctions.h
@@ -28,15 +28,18 @@
#ifndef LL_LLINVENTORYFUNCTIONS_H
#define LL_LLINVENTORYFUNCTIONS_H
-#include "llinventorytype.h"
-#include "llfolderview.h"
-#include "llfolderviewitem.h"
+#include "llinventorymodel.h"
+#include "llinventory.h"
+#include "llwearabletype.h"
/********************************************************************************
** **
** MISCELLANEOUS GLOBAL FUNCTIONS
**/
+// Is this a parent folder to a worn item
+BOOL get_is_parent_to_worn_item(const LLUUID& id);
+
// Is this item or its baseitem is worn, attached, etc...
BOOL get_is_item_worn(const LLUUID& id);
@@ -54,23 +57,18 @@ void show_task_item_profile(const LLUUID& item_uuid, const LLUUID& object_id);
void show_item_original(const LLUUID& item_uuid);
-void change_item_parent(LLInventoryModel* model,
- LLViewerInventoryItem* item,
- const LLUUID& new_parent_id,
- BOOL restamp);
-
-void change_category_parent(LLInventoryModel* model,
- LLViewerInventoryCategory* cat,
- const LLUUID& new_parent_id,
- BOOL restamp);
-
-void remove_category(LLInventoryModel* model, const LLUUID& cat_id);
-
void rename_category(LLInventoryModel* model, const LLUUID& cat_id, const std::string& new_name);
+void copy_inventory_category(LLInventoryModel* model, LLViewerInventoryCategory* cat, const LLUUID& parent_id, const LLUUID& root_copy_id = LLUUID::null);
+
// Generates a string containing the path to the item specified by item_id.
void append_path(const LLUUID& id, std::string& path);
+void copy_item_to_outbox(LLInventoryItem* inv_item, LLUUID dest_folder, const LLUUID& top_level_folder, S32 operation_id);
+void move_item_within_outbox(LLInventoryItem* inv_item, LLUUID dest_folder, S32 operation_id);
+
+void copy_folder_to_outbox(LLInventoryCategory* inv_cat, const LLUUID& dest_folder, const LLUUID& top_level_folder, S32 operation_id);
+
/** Miscellaneous global functions
** **
*******************************************************************************/
@@ -417,6 +415,24 @@ public:
/** Inventory Collector Functions
** **
*******************************************************************************/
+class LLFolderViewItem;
+class LLFolderViewFolder;
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLFolderViewFunctor
+//
+// Simple abstract base class for applying a functor to folders and
+// items in a folder view hierarchy. This is suboptimal for algorithms
+// that only work folders or only work on items, but I'll worry about
+// that later when it's determined to be too slow.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+class LLFolderViewFunctor
+{
+public:
+ virtual ~LLFolderViewFunctor() {}
+ virtual void doFolder(LLFolderViewFolder* folder) = 0;
+ virtual void doItem(LLFolderViewItem* item) = 0;
+};
class LLInventoryState
{
diff --git a/indra/newview/llinventoryicon.cpp b/indra/newview/llinventoryicon.cpp
index 3f4f33e88d..34734d57c5 100644
--- a/indra/newview/llinventoryicon.cpp
+++ b/indra/newview/llinventoryicon.cpp
@@ -82,8 +82,11 @@ LLIconDictionary::LLIconDictionary()
addEntry(LLInventoryIcon::ICONNAME_ANIMATION, new IconEntry("Inv_Animation"));
addEntry(LLInventoryIcon::ICONNAME_GESTURE, new IconEntry("Inv_Gesture"));
+ addEntry(LLInventoryIcon::ICONNAME_CLOTHING_PHYSICS, new IconEntry("Inv_Physics"));
+
addEntry(LLInventoryIcon::ICONNAME_LINKITEM, new IconEntry("Inv_LinkItem"));
addEntry(LLInventoryIcon::ICONNAME_LINKFOLDER, new IconEntry("Inv_LinkFolder"));
+ addEntry(LLInventoryIcon::ICONNAME_MESH, new IconEntry("Inv_Mesh"));
addEntry(LLInventoryIcon::ICONNAME_INVALID, new IconEntry("Inv_Invalid"));
@@ -157,6 +160,8 @@ const std::string& LLInventoryIcon::getIconName(LLAssetType::EType asset_type,
case LLAssetType::AT_OBJECT:
idx = ICONNAME_OBJECT;
break;
+ case LLAssetType::AT_MESH:
+ idx = ICONNAME_MESH;
default:
break;
}
diff --git a/indra/newview/llinventoryicon.h b/indra/newview/llinventoryicon.h
index 9a2cc08095..c7e2998a20 100644
--- a/indra/newview/llinventoryicon.h
+++ b/indra/newview/llinventoryicon.h
@@ -66,12 +66,15 @@ public:
ICONNAME_CLOTHING_SKIRT,
ICONNAME_CLOTHING_ALPHA,
ICONNAME_CLOTHING_TATTOO,
-
+
ICONNAME_ANIMATION,
ICONNAME_GESTURE,
+
+ ICONNAME_CLOTHING_PHYSICS,
ICONNAME_LINKITEM,
ICONNAME_LINKFOLDER,
+ ICONNAME_MESH,
ICONNAME_INVALID,
ICONNAME_COUNT,
diff --git a/indra/newview/llinventoryitemslist.h b/indra/newview/llinventoryitemslist.h
index 86e11dff17..b183a2052d 100644
--- a/indra/newview/llinventoryitemslist.h
+++ b/indra/newview/llinventoryitemslist.h
@@ -38,7 +38,6 @@ class LLViewerInventoryItem;
class LLInventoryItemsList : public LLFlatListViewEx
{
- LOG_CLASS(LLInventoryItemsList);
public:
struct Params : public LLInitParam::Block<Params, LLFlatListViewEx::Params>
{
diff --git a/indra/newview/llinventorylistitem.cpp b/indra/newview/llinventorylistitem.cpp
index 225d0288a9..3e0849a795 100644
--- a/indra/newview/llinventorylistitem.cpp
+++ b/indra/newview/llinventorylistitem.cpp
@@ -97,7 +97,8 @@ void LLPanelInventoryListItemBase::draw()
LLRect separator_rect = getLocalRect();
separator_rect.mTop = separator_rect.mBottom;
separator_rect.mBottom -= mSeparatorImage->getHeight();
- mSeparatorImage->draw(separator_rect);
+ F32 alpha = getCurrentTransparency();
+ mSeparatorImage->draw(separator_rect, UI_VERTEX_COLOR % alpha);
}
LLPanel::draw();
diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index 53835f0166..85ecb133d0 100644
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -30,6 +30,7 @@
#include "llagent.h"
#include "llagentwearables.h"
#include "llappearancemgr.h"
+#include "llclipboard.h"
#include "llinventorypanel.h"
#include "llinventorybridge.h"
#include "llinventoryfunctions.h"
@@ -46,6 +47,8 @@
#include "llviewerregion.h"
#include "llcallbacklist.h"
#include "llvoavatarself.h"
+#include "llgesturemgr.h"
+#include <typeinfo>
//#define DIFF_INVENTORY_FILES
#ifdef DIFF_INVENTORY_FILES
@@ -217,6 +220,38 @@ const LLViewerInventoryCategory *LLInventoryModel::getFirstNondefaultParent(cons
return NULL;
}
+//
+// Search up the parent chain until we get to the specified parent, then return the first child category under it
+//
+const LLViewerInventoryCategory* LLInventoryModel::getFirstDescendantOf(const LLUUID& master_parent_id, const LLUUID& obj_id) const
+{
+ if (master_parent_id == obj_id)
+ {
+ return NULL;
+ }
+
+ const LLViewerInventoryCategory* current_cat = getCategory(obj_id);
+
+ if (current_cat == NULL)
+ {
+ current_cat = getCategory(getObject(obj_id)->getParentUUID());
+ }
+
+ while (current_cat != NULL)
+ {
+ const LLUUID& current_parent_id = current_cat->getParentUUID();
+
+ if (current_parent_id == master_parent_id)
+ {
+ return current_cat;
+ }
+
+ current_cat = getCategory(current_parent_id);
+ }
+
+ return NULL;
+}
+
// Get the object by id. Returns NULL if not found.
LLInventoryObject* LLInventoryModel::getObject(const LLUUID& id) const
{
@@ -377,14 +412,67 @@ const LLUUID LLInventoryModel::findCategoryUUIDForType(LLFolderType::EType prefe
return rv;
}
+class LLCreateInventoryCategoryResponder : public LLHTTPClient::Responder
+{
+public:
+ LLCreateInventoryCategoryResponder(LLInventoryModel* model,
+ void (*callback)(const LLSD&, void*),
+ void* user_data) :
+ mModel(model),
+ mCallback(callback),
+ mData(user_data)
+ {
+ }
+
+ virtual void error(U32 status, const std::string& reason)
+ {
+ LL_WARNS("InvAPI") << "CreateInventoryCategory failed. status = " << status << ", reasion = \"" << reason << "\"" << LL_ENDL;
+ }
+
+ virtual void result(const LLSD& content)
+ {
+ //Server has created folder.
+
+ LLUUID category_id = content["folder_id"].asUUID();
+
+
+ // Add the category to the internal representation
+ LLPointer<LLViewerInventoryCategory> cat =
+ new LLViewerInventoryCategory( category_id,
+ content["parent_id"].asUUID(),
+ (LLFolderType::EType)content["type"].asInteger(),
+ content["name"].asString(),
+ gAgent.getID() );
+ cat->setVersion(LLViewerInventoryCategory::VERSION_INITIAL);
+ cat->setDescendentCount(0);
+ LLInventoryModel::LLCategoryUpdate update(cat->getParentUUID(), 1);
+ mModel->accountForUpdate(update);
+ mModel->updateCategory(cat);
+
+ if (mCallback && mData)
+ {
+ mCallback(content, mData);
+ }
+
+ }
+
+private:
+ void (*mCallback)(const LLSD&, void*);
+ void* mData;
+ LLInventoryModel* mModel;
+};
+
// Convenience function to create a new category. You could call
// updateCategory() with a newly generated UUID category, but this
// version will take care of details like what the name should be
// based on preferred type. Returns the UUID of the new category.
LLUUID LLInventoryModel::createNewCategory(const LLUUID& parent_id,
LLFolderType::EType preferred_type,
- const std::string& pname)
+ const std::string& pname,
+ void (*callback)(const LLSD&, void*), //Default to NULL
+ void* user_data) //Default to NULL
{
+
LLUUID id;
if(!isInventoryUsable())
{
@@ -408,6 +496,35 @@ LLUUID LLInventoryModel::createNewCategory(const LLUUID& parent_id,
{
name.assign(LLViewerFolderType::lookupNewCategoryName(preferred_type));
}
+
+ if ( callback && user_data ) //callback required for acked message.
+ {
+ LLViewerRegion* viewer_region = gAgent.getRegion();
+ std::string url;
+ if ( viewer_region )
+ url = viewer_region->getCapability("CreateInventoryCategory");
+
+ if (!url.empty())
+ {
+ //Let's use the new capability.
+
+ LLSD request, body;
+ body["folder_id"] = id;
+ body["parent_id"] = parent_id;
+ body["type"] = (LLSD::Integer) preferred_type;
+ body["name"] = name;
+
+ request["message"] = "CreateInventoryCategory";
+ request["payload"] = body;
+
+ // viewer_region->getCapAPI().post(request);
+ LLHTTPClient::post(
+ url,
+ body,
+ new LLCreateInventoryCategoryResponder(this, callback, user_data) );
+ return LLUUID::null;
+ }
+ }
// Add the category to the internal representation
LLPointer<LLViewerInventoryCategory> cat =
@@ -631,6 +748,14 @@ U32 LLInventoryModel::updateItem(const LLViewerInventoryItem* item)
return mask;
}
+ // We're hiding mesh types
+#if 0
+ if (item->getType() == LLAssetType::AT_MESH)
+ {
+ return mask;
+ }
+#endif
+
LLViewerInventoryItem* old_item = getItem(item->getUUID());
LLPointer<LLViewerInventoryItem> new_item;
if(old_item)
@@ -895,6 +1020,66 @@ void LLInventoryModel::moveObject(const LLUUID& object_id, const LLUUID& cat_id)
}
}
+// Migrated from llinventoryfunctions
+void LLInventoryModel::changeItemParent(LLViewerInventoryItem* item,
+ const LLUUID& new_parent_id,
+ BOOL restamp)
+{
+ if (item->getParentUUID() == new_parent_id)
+ {
+ LL_DEBUGS("Inventory") << "'" << item->getName() << "' (" << item->getUUID()
+ << ") is already in folder " << new_parent_id << LL_ENDL;
+ }
+ else
+ {
+ LL_INFOS("Inventory") << "Moving '" << item->getName() << "' (" << item->getUUID()
+ << ") from " << item->getParentUUID() << " to folder "
+ << new_parent_id << LL_ENDL;
+ LLInventoryModel::update_list_t update;
+ LLInventoryModel::LLCategoryUpdate old_folder(item->getParentUUID(),-1);
+ update.push_back(old_folder);
+ LLInventoryModel::LLCategoryUpdate new_folder(new_parent_id, 1);
+ update.push_back(new_folder);
+ accountForUpdate(update);
+
+ LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
+ new_item->setParent(new_parent_id);
+ new_item->updateParentOnServer(restamp);
+ updateItem(new_item);
+ notifyObservers();
+ }
+}
+
+// Migrated from llinventoryfunctions
+void LLInventoryModel::changeCategoryParent(LLViewerInventoryCategory* cat,
+ const LLUUID& new_parent_id,
+ BOOL restamp)
+{
+ if (!cat)
+ {
+ return;
+ }
+
+ // Can't move a folder into a child of itself.
+ if (isObjectDescendentOf(new_parent_id, cat->getUUID()))
+ {
+ return;
+ }
+
+ LLInventoryModel::update_list_t update;
+ LLInventoryModel::LLCategoryUpdate old_folder(cat->getParentUUID(), -1);
+ update.push_back(old_folder);
+ LLInventoryModel::LLCategoryUpdate new_folder(new_parent_id, 1);
+ update.push_back(new_folder);
+ accountForUpdate(update);
+
+ LLPointer<LLViewerInventoryCategory> new_cat = new LLViewerInventoryCategory(cat);
+ new_cat->setParent(new_parent_id);
+ new_cat->updateParentOnServer(restamp);
+ updateCategory(new_cat);
+ notifyObservers();
+}
+
// Delete a particular inventory object by ID.
void LLInventoryModel::deleteObject(const LLUUID& id)
{
@@ -988,50 +1173,82 @@ void LLInventoryModel::purgeDescendentsOf(const LLUUID& id)
return;
}
LLPointer<LLViewerInventoryCategory> cat = getCategory(id);
- if(cat.notNull())
- {
- // do the cache accounting
- llinfos << "LLInventoryModel::purgeDescendentsOf " << cat->getName()
- << llendl;
- S32 descendents = cat->getDescendentCount();
- if(descendents > 0)
- {
- LLCategoryUpdate up(id, -descendents);
- accountForUpdate(up);
+ if (cat.notNull())
+ {
+ if (LLClipboard::instance().hasContents() && LLClipboard::instance().isCutMode())
+ {
+ // Something on the clipboard is in "cut mode" and needs to be preserved
+ llinfos << "LLInventoryModel::purgeDescendentsOf " << cat->getName()
+ << " iterate and purge non hidden items" << llendl;
+ cat_array_t* categories;
+ item_array_t* items;
+ // Get the list of direct descendants in tha categoy passed as argument
+ getDirectDescendentsOf(id, categories, items);
+ std::vector<LLUUID> list_uuids;
+ // Make a unique list with all the UUIDs of the direct descendants (items and categories are not treated differently)
+ // Note: we need to do that shallow copy as purging things will invalidate the categories or items lists
+ for (cat_array_t::const_iterator it = categories->begin(); it != categories->end(); ++it)
+ {
+ list_uuids.push_back((*it)->getUUID());
+ }
+ for (item_array_t::const_iterator it = items->begin(); it != items->end(); ++it)
+ {
+ list_uuids.push_back((*it)->getUUID());
+ }
+ // Iterate through the list and only purge the UUIDs that are not on the clipboard
+ for (std::vector<LLUUID>::const_iterator it = list_uuids.begin(); it != list_uuids.end(); ++it)
+ {
+ if (!LLClipboard::instance().isOnClipboard(*it))
+ {
+ purgeObject(*it);
+ }
+ }
}
+ else
+ {
+ // Fast purge
+ // do the cache accounting
+ llinfos << "LLInventoryModel::purgeDescendentsOf " << cat->getName()
+ << llendl;
+ S32 descendents = cat->getDescendentCount();
+ if(descendents > 0)
+ {
+ LLCategoryUpdate up(id, -descendents);
+ accountForUpdate(up);
+ }
- // we know that descendent count is 0, aide since the
- // accounting may actually not do an update, we should force
- // it here.
- cat->setDescendentCount(0);
+ // we know that descendent count is 0, however since the
+ // accounting may actually not do an update, we should force
+ // it here.
+ cat->setDescendentCount(0);
+
+ // send it upstream
+ LLMessageSystem* msg = gMessageSystem;
+ msg->newMessage("PurgeInventoryDescendents");
+ msg->nextBlock("AgentData");
+ msg->addUUID("AgentID", gAgent.getID());
+ msg->addUUID("SessionID", gAgent.getSessionID());
+ msg->nextBlock("InventoryData");
+ msg->addUUID("FolderID", id);
+ gAgent.sendReliableMessage();
- // send it upstream
- LLMessageSystem* msg = gMessageSystem;
- msg->newMessage("PurgeInventoryDescendents");
- msg->nextBlock("AgentData");
- msg->addUUID("AgentID", gAgent.getID());
- msg->addUUID("SessionID", gAgent.getSessionID());
- msg->nextBlock("InventoryData");
- msg->addUUID("FolderID", id);
- gAgent.sendReliableMessage();
-
- // unceremoniously remove anything we have locally stored.
- cat_array_t categories;
- item_array_t items;
- collectDescendents(id,
- categories,
- items,
- INCLUDE_TRASH);
- S32 count = items.count();
- S32 i;
- for(i = 0; i < count; ++i)
- {
- deleteObject(items.get(i)->getUUID());
- }
- count = categories.count();
- for(i = 0; i < count; ++i)
- {
- deleteObject(categories.get(i)->getUUID());
+ // unceremoniously remove anything we have locally stored.
+ cat_array_t categories;
+ item_array_t items;
+ collectDescendents(id,
+ categories,
+ items,
+ INCLUDE_TRASH);
+ S32 count = items.count();
+ for(S32 i = 0; i < count; ++i)
+ {
+ deleteObject(items.get(i)->getUUID());
+ }
+ count = categories.count();
+ for(S32 i = 0; i < count; ++i)
+ {
+ deleteObject(categories.get(i)->getUUID());
+ }
}
}
}
@@ -1059,12 +1276,11 @@ void LLInventoryModel::idleNotifyObservers()
{
return;
}
- notifyObservers("");
+ notifyObservers();
}
// Call this method when it's time to update everyone on a new state.
-// The optional argument 'service_name' is used by Agent Inventory Service [DEV-20328]
-void LLInventoryModel::notifyObservers(const std::string service_name)
+void LLInventoryModel::notifyObservers()
{
if (mIsNotifyObservers)
{
@@ -1080,16 +1296,7 @@ void LLInventoryModel::notifyObservers(const std::string service_name)
iter != mObservers.end(); )
{
LLInventoryObserver* observer = *iter;
-
- if (service_name.empty())
- {
- observer->changed(mModifyMask);
- }
- else
- {
- observer->mMessageName = service_name;
- observer->changed(mModifyMask);
- }
+ observer->changed(mModifyMask);
// safe way to increment since changed may delete entries! (@!##%@!@&*!)
iter = mObservers.upper_bound(observer);
@@ -1187,7 +1394,7 @@ void LLInventoryModel::fetchInventoryResponder::result(const LLSD& content)
{
changes |= gInventory.updateItem(*it);
}
- gInventory.notifyObservers("fetchinventory");
+ gInventory.notifyObservers();
gViewerWindow->getWindow()->decBusyCount();
}
@@ -1196,7 +1403,7 @@ void LLInventoryModel::fetchInventoryResponder::error(U32 status, const std::str
{
llinfos << "fetchInventory::error "
<< status << ": " << reason << llendl;
- gInventory.notifyObservers("fetchinventory");
+ gInventory.notifyObservers();
}
bool LLInventoryModel::fetchDescendentsOf(const LLUUID& folder_id) const
@@ -1272,6 +1479,12 @@ void LLInventoryModel::addCategory(LLViewerInventoryCategory* category)
//llinfos << "LLInventoryModel::addCategory()" << llendl;
if(category)
{
+ // We aren't displaying the Meshes folder
+ if (category->mPreferredType == LLFolderType::FT_MESH)
+ {
+ return;
+ }
+
// try to localize default names first. See EXT-8319, EXT-7051.
category->localizeName();
@@ -2163,6 +2376,9 @@ void LLInventoryModel::registerCallbacks(LLMessageSystem* msg)
msg->setHandlerFuncFast(_PREHASH_RemoveInventoryFolder,
processRemoveInventoryFolder,
NULL);
+ msg->setHandlerFuncFast(_PREHASH_RemoveInventoryObjects,
+ processRemoveInventoryObjects,
+ NULL);
//msg->setHandlerFuncFast(_PREHASH_ExchangeCallingCard,
// processExchangeCallingcard,
// NULL);
@@ -2279,26 +2495,21 @@ bool LLInventoryModel::messageUpdateCore(LLMessageSystem* msg, bool account)
}
// static
-void LLInventoryModel::processRemoveInventoryItem(LLMessageSystem* msg, void**)
+void LLInventoryModel::removeInventoryItem(LLUUID agent_id, LLMessageSystem* msg, const char* msg_label)
{
- lldebugs << "LLInventoryModel::processRemoveInventoryItem()" << llendl;
- LLUUID agent_id, item_id;
- msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id);
- if(agent_id != gAgent.getID())
- {
- llwarns << "Got a RemoveInventoryItem for the wrong agent."
- << llendl;
- return;
- }
- S32 count = msg->getNumberOfBlocksFast(_PREHASH_InventoryData);
+ LLUUID item_id;
+ S32 count = msg->getNumberOfBlocksFast(msg_label);
+ lldebugs << "Message has " << count << " item blocks" << llendl;
uuid_vec_t item_ids;
update_map_t update;
for(S32 i = 0; i < count; ++i)
{
- msg->getUUIDFast(_PREHASH_InventoryData, _PREHASH_ItemID, item_id, i);
+ msg->getUUIDFast(msg_label, _PREHASH_ItemID, item_id, i);
+ lldebugs << "Checking for item-to-be-removed " << item_id << llendl;
LLViewerInventoryItem* itemp = gInventory.getItem(item_id);
if(itemp)
{
+ lldebugs << "Item will be removed " << item_id << llendl;
// we only bother with the delete and account if we found
// the item - this is usually a back-up for permissions,
// so frequently the item will already be gone.
@@ -2309,8 +2520,24 @@ void LLInventoryModel::processRemoveInventoryItem(LLMessageSystem* msg, void**)
gInventory.accountForUpdate(update);
for(uuid_vec_t::iterator it = item_ids.begin(); it != item_ids.end(); ++it)
{
+ lldebugs << "Calling deleteObject " << *it << llendl;
gInventory.deleteObject(*it);
}
+}
+
+// static
+void LLInventoryModel::processRemoveInventoryItem(LLMessageSystem* msg, void**)
+{
+ lldebugs << "LLInventoryModel::processRemoveInventoryItem()" << llendl;
+ LLUUID agent_id, item_id;
+ msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id);
+ if(agent_id != gAgent.getID())
+ {
+ llwarns << "Got a RemoveInventoryItem for the wrong agent."
+ << llendl;
+ return;
+ }
+ LLInventoryModel::removeInventoryItem(agent_id, msg, _PREHASH_InventoryData);
gInventory.notifyObservers();
}
@@ -2375,18 +2602,10 @@ void LLInventoryModel::processUpdateInventoryFolder(LLMessageSystem* msg,
}
// static
-void LLInventoryModel::processRemoveInventoryFolder(LLMessageSystem* msg,
- void**)
+void LLInventoryModel::removeInventoryFolder(LLUUID agent_id,
+ LLMessageSystem* msg)
{
- lldebugs << "LLInventoryModel::processRemoveInventoryFolder()" << llendl;
- LLUUID agent_id, folder_id;
- msg->getUUIDFast(_PREHASH_FolderData, _PREHASH_AgentID, agent_id);
- if(agent_id != gAgent.getID())
- {
- llwarns << "Got a RemoveInventoryFolder for the wrong agent."
- << llendl;
- return;
- }
+ LLUUID folder_id;
uuid_vec_t folder_ids;
update_map_t update;
S32 count = msg->getNumberOfBlocksFast(_PREHASH_FolderData);
@@ -2405,6 +2624,42 @@ void LLInventoryModel::processRemoveInventoryFolder(LLMessageSystem* msg,
{
gInventory.deleteObject(*it);
}
+}
+
+// static
+void LLInventoryModel::processRemoveInventoryFolder(LLMessageSystem* msg,
+ void**)
+{
+ lldebugs << "LLInventoryModel::processRemoveInventoryFolder()" << llendl;
+ LLUUID agent_id, session_id;
+ msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id);
+ msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_SessionID, session_id);
+ if(agent_id != gAgent.getID())
+ {
+ llwarns << "Got a RemoveInventoryFolder for the wrong agent."
+ << llendl;
+ return;
+ }
+ LLInventoryModel::removeInventoryFolder( agent_id, msg );
+ gInventory.notifyObservers();
+}
+
+// static
+void LLInventoryModel::processRemoveInventoryObjects(LLMessageSystem* msg,
+ void**)
+{
+ lldebugs << "LLInventoryModel::processRemoveInventoryObjects()" << llendl;
+ LLUUID agent_id, session_id;
+ msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id);
+ msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_SessionID, session_id);
+ if(agent_id != gAgent.getID())
+ {
+ llwarns << "Got a RemoveInventoryObjects for the wrong agent."
+ << llendl;
+ return;
+ }
+ LLInventoryModel::removeInventoryFolder( agent_id, msg );
+ LLInventoryModel::removeInventoryItem( agent_id, msg, _PREHASH_ItemData );
gInventory.notifyObservers();
}
@@ -2481,9 +2736,9 @@ void LLInventoryModel::processBulkUpdateInventory(LLMessageSystem* msg, void**)
{
LLPointer<LLViewerInventoryCategory> tfolder = new LLViewerInventoryCategory(gAgent.getID());
tfolder->unpackMessage(msg, _PREHASH_FolderData, i);
- //llinfos << "unpaked folder '" << tfolder->getName() << "' ("
- // << tfolder->getUUID() << ") in " << tfolder->getParentUUID()
- // << llendl;
+ llinfos << "unpacked folder '" << tfolder->getName() << "' ("
+ << tfolder->getUUID() << ") in " << tfolder->getParentUUID()
+ << llendl;
if(tfolder->getUUID().notNull())
{
folders.push_back(tfolder);
@@ -2523,11 +2778,11 @@ void LLInventoryModel::processBulkUpdateInventory(LLMessageSystem* msg, void**)
{
LLPointer<LLViewerInventoryItem> titem = new LLViewerInventoryItem;
titem->unpackMessage(msg, _PREHASH_ItemData, i);
- //llinfos << "unpaked item '" << titem->getName() << "' in "
- // << titem->getParentUUID() << llendl;
+ llinfos << "unpaked item '" << titem->getName() << "' in "
+ << titem->getParentUUID() << llendl;
U32 callback_id;
msg->getU32Fast(_PREHASH_ItemData, _PREHASH_CallbackID, callback_id);
- if(titem->getUUID().notNull())
+ if(titem->getUUID().notNull() ) // && callback_id.notNull() )
{
items.push_back(titem);
cblist.push_back(InventoryCallbackInfo(callback_id, titem->getUUID()));
@@ -2584,7 +2839,7 @@ void LLInventoryModel::processBulkUpdateInventory(LLMessageSystem* msg, void**)
LLInventoryState::sWearNewClothing = FALSE;
}
- if (tid == LLInventoryState::sWearNewClothingTransactionID)
+ if (tid.notNull() && tid == LLInventoryState::sWearNewClothingTransactionID)
{
count = wearable_ids.size();
for (i = 0; i < count; ++i)
@@ -2771,21 +3026,77 @@ void LLInventoryModel::emptyFolderType(const std::string notification, LLFolderT
void LLInventoryModel::removeItem(const LLUUID& item_id)
{
LLViewerInventoryItem* item = getItem(item_id);
- const LLUUID new_parent = findCategoryUUIDForType(LLFolderType::FT_TRASH);
- if (item && item->getParentUUID() != new_parent)
+ if (! item)
{
- LLInventoryModel::update_list_t update;
- LLInventoryModel::LLCategoryUpdate old_folder(item->getParentUUID(),-1);
- update.push_back(old_folder);
- LLInventoryModel::LLCategoryUpdate new_folder(new_parent, 1);
- update.push_back(new_folder);
- accountForUpdate(update);
+ LL_WARNS("Inventory") << "couldn't find inventory item " << item_id << LL_ENDL;
+ }
+ else
+ {
+ const LLUUID new_parent = findCategoryUUIDForType(LLFolderType::FT_TRASH);
+ if (new_parent.notNull())
+ {
+ LL_INFOS("Inventory") << "Moving to Trash (" << new_parent << "):" << LL_ENDL;
+ changeItemParent(item, new_parent, TRUE);
+ }
+ }
+}
- LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
- new_item->setParent(new_parent);
- new_item->updateParentOnServer(TRUE);
- updateItem(new_item);
- notifyObservers();
+void LLInventoryModel::removeCategory(const LLUUID& category_id)
+{
+ if (! get_is_category_removable(this, category_id))
+ {
+ return;
+ }
+
+ // Look for any gestures and deactivate them
+ LLInventoryModel::cat_array_t descendent_categories;
+ LLInventoryModel::item_array_t descendent_items;
+ collectDescendents(category_id, descendent_categories, descendent_items, FALSE);
+
+ for (LLInventoryModel::item_array_t::const_iterator iter = descendent_items.begin();
+ iter != descendent_items.end();
+ ++iter)
+ {
+ const LLViewerInventoryItem* item = (*iter);
+ const LLUUID& item_id = item->getUUID();
+ if (item->getType() == LLAssetType::AT_GESTURE
+ && LLGestureMgr::instance().isGestureActive(item_id))
+ {
+ LLGestureMgr::instance().deactivateGesture(item_id);
+ }
+ }
+
+ LLViewerInventoryCategory* cat = getCategory(category_id);
+ if (cat)
+ {
+ const LLUUID trash_id = findCategoryUUIDForType(LLFolderType::FT_TRASH);
+ if (trash_id.notNull())
+ {
+ changeCategoryParent(cat, trash_id, TRUE);
+ }
+ }
+}
+
+void LLInventoryModel::removeObject(const LLUUID& object_id)
+{
+ LLInventoryObject* obj = getObject(object_id);
+ if (dynamic_cast<LLViewerInventoryItem*>(obj))
+ {
+ removeItem(object_id);
+ }
+ else if (dynamic_cast<LLViewerInventoryCategory*>(obj))
+ {
+ removeCategory(object_id);
+ }
+ else if (obj)
+ {
+ LL_WARNS("Inventory") << "object ID " << object_id
+ << " is an object of unrecognized class "
+ << typeid(*obj).name() << LL_ENDL;
+ }
+ else
+ {
+ LL_WARNS("Inventory") << "object ID " << object_id << " not found" << LL_ENDL;
}
}
@@ -2832,40 +3143,62 @@ BOOL LLInventoryModel::getIsFirstTimeInViewer2()
return sFirstTimeInViewer2;
}
-static LLInventoryModel::item_array_t::iterator find_item_iter_by_uuid(LLInventoryModel::item_array_t& items, const LLUUID& id)
+LLInventoryModel::item_array_t::iterator LLInventoryModel::findItemIterByUUID(LLInventoryModel::item_array_t& items, const LLUUID& id)
{
- LLInventoryModel::item_array_t::iterator result = items.end();
+ LLInventoryModel::item_array_t::iterator curr_item = items.begin();
- for (LLInventoryModel::item_array_t::iterator i = items.begin(); i != items.end(); ++i)
+ while (curr_item != items.end())
{
- if ((*i)->getUUID() == id)
+ if ((*curr_item)->getUUID() == id)
{
- result = i;
break;
}
+ ++curr_item;
}
- return result;
+ return curr_item;
}
// static
// * @param[in, out] items - vector with items to be updated. It should be sorted in a right way
// * before calling this method.
// * @param src_item_id - LLUUID of inventory item to be moved in new position
-// * @param dest_item_id - LLUUID of inventory item before which source item should be placed.
-void LLInventoryModel::updateItemsOrder(LLInventoryModel::item_array_t& items, const LLUUID& src_item_id, const LLUUID& dest_item_id)
+// * @param dest_item_id - LLUUID of inventory item before (or after) which source item should
+// * be placed.
+// * @param insert_before - bool indicating if src_item_id should be placed before or after
+// * dest_item_id. Default is true.
+void LLInventoryModel::updateItemsOrder(LLInventoryModel::item_array_t& items, const LLUUID& src_item_id, const LLUUID& dest_item_id, bool insert_before)
{
- LLInventoryModel::item_array_t::iterator it_src = find_item_iter_by_uuid(items, src_item_id);
- LLInventoryModel::item_array_t::iterator it_dest = find_item_iter_by_uuid(items, dest_item_id);
+ LLInventoryModel::item_array_t::iterator it_src = findItemIterByUUID(items, src_item_id);
+ LLInventoryModel::item_array_t::iterator it_dest = findItemIterByUUID(items, dest_item_id);
- if (it_src == items.end() || it_dest == items.end()) return;
+ // If one of the passed UUID is not in the item list, bail out
+ if ((it_src == items.end()) || (it_dest == items.end()))
+ return;
+ // Erase the source element from the list, keep a copy before erasing.
LLViewerInventoryItem* src_item = *it_src;
items.erase(it_src);
- // target iterator can not be valid because the container was changed, so update it.
- it_dest = find_item_iter_by_uuid(items, dest_item_id);
- items.insert(it_dest, src_item);
+ // Note: Target iterator is not valid anymore because the container was changed, so update it.
+ it_dest = findItemIterByUUID(items, dest_item_id);
+
+ // Go to the next element if one wishes to insert after the dest element
+ if (!insert_before)
+ {
+ ++it_dest;
+ }
+
+ // Reinsert the source item in the right place
+ if (it_dest != items.end())
+ {
+ items.insert(it_dest, src_item);
+ }
+ else
+ {
+ // Append to the list if it_dest reached the end
+ items.push_back(src_item);
+ }
}
//* @param[in] items vector of items in order to be saved.
diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h
index f6728fd575..8382e875b4 100644
--- a/indra/newview/llinventorymodel.h
+++ b/indra/newview/llinventorymodel.h
@@ -64,6 +64,7 @@ class LLInventoryCollectFunctor;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class LLInventoryModel
{
+ LOG_CLASS(LLInventoryModel);
public:
friend class LLInventoryModelFetchDescendentsResponder;
@@ -238,6 +239,9 @@ public:
// Get whatever special folder this object is a child of, if any.
const LLViewerInventoryCategory *getFirstNondefaultParent(const LLUUID& obj_id) const;
+
+ // Get first descendant of the child object under the specified parent
+ const LLViewerInventoryCategory *getFirstDescendantOf(const LLUUID& master_parent_id, const LLUUID& obj_id) const;
// Get the object by id. Returns NULL if not found.
// NOTE: Use the pointer returned for read operations - do
@@ -302,6 +306,16 @@ public:
// observer notification, or server update is performed.
void moveObject(const LLUUID& object_id, const LLUUID& cat_id);
+ // Migrated from llinventoryfunctions
+ void changeItemParent(LLViewerInventoryItem* item,
+ const LLUUID& new_parent_id,
+ BOOL restamp);
+
+ // Migrated from llinventoryfunctions
+ void changeCategoryParent(LLViewerInventoryCategory* cat,
+ const LLUUID& new_parent_id,
+ BOOL restamp);
+
//--------------------------------------------------------------------
// Delete
//--------------------------------------------------------------------
@@ -311,8 +325,13 @@ public:
// consistent internal state. No cache accounting, observer
// notification, or server update is performed.
void deleteObject(const LLUUID& id);
+ /// move Item item_id to Trash
void removeItem(const LLUUID& item_id);
-
+ /// move Category category_id to Trash
+ void removeCategory(const LLUUID& category_id);
+ /// removeItem() or removeCategory(), whichever is appropriate
+ void removeObject(const LLUUID& object_id);
+
// Delete a particular inventory object by ID, and delete it from
// the server. Also updates linked items.
void purgeObject(const LLUUID& id);
@@ -332,11 +351,16 @@ protected:
//--------------------------------------------------------------------
public:
// Changes items order by insertion of the item identified by src_item_id
- // before the item identified by dest_item_id. Both items must exist in items array.
- // Sorting is stored after method is finished. Only src_item_id is moved before dest_item_id.
+ // before (or after) the item identified by dest_item_id. Both items must exist in items array.
+ // Sorting is stored after method is finished. Only src_item_id is moved before (or after) dest_item_id.
+ // The parameter "insert_before" controls on which side of dest_item_id src_item_id gets rensinserted.
static void updateItemsOrder(LLInventoryModel::item_array_t& items,
const LLUUID& src_item_id,
- const LLUUID& dest_item_id);
+ const LLUUID& dest_item_id,
+ bool insert_before = true);
+ // Gets an iterator on an item vector knowing only the item UUID.
+ // Returns end() of the vector if not found.
+ static LLInventoryModel::item_array_t::iterator findItemIterByUUID(LLInventoryModel::item_array_t& items, const LLUUID& id);
// Saves current order of the passed items using inventory item sort field.
// Resets 'items' sort fields and saves them on server.
@@ -355,7 +379,9 @@ public:
// name based on type, pass in a NULL to the 'name' parameter.
LLUUID createNewCategory(const LLUUID& parent_id,
LLFolderType::EType preferred_type,
- const std::string& name);
+ const std::string& name,
+ void (*callback)(const LLSD&, void*) = NULL,
+ void* user_data = NULL );
protected:
// Internal methods that add inventory and make sure that all of
// the internal data structures are consistent. These methods
@@ -406,7 +432,7 @@ public:
// Return (yes/no/maybe) child status of category children.
EHasChildren categoryHasChildren(const LLUUID& cat_id) const;
- // Returns true iff category version is known and theoretical
+ // Returns true if category version is known and theoretical
// descendents == actual descendents.
bool isCategoryComplete(const LLUUID& cat_id) const;
@@ -425,9 +451,8 @@ public:
// has been indicated.
void idleNotifyObservers();
- // Call to explicitly update everyone on a new state. The optional argument
- // 'service_name' is used by Agent Inventory Service [DEV-20328]
- void notifyObservers(const std::string service_name="");
+ // Call to explicitly update everyone on a new state.
+ void notifyObservers();
// Allows outsiders to tell the inventory if something has
// been changed 'under the hood', but outside the control of the
@@ -493,9 +518,12 @@ protected:
//--------------------------------------------------------------------
public:
static void processUpdateCreateInventoryItem(LLMessageSystem* msg, void**);
+ static void removeInventoryItem(LLUUID agent_id, LLMessageSystem* msg, const char* msg_label);
static void processRemoveInventoryItem(LLMessageSystem* msg, void**);
static void processUpdateInventoryFolder(LLMessageSystem* msg, void**);
+ static void removeInventoryFolder(LLUUID agent_id, LLMessageSystem* msg);
static void processRemoveInventoryFolder(LLMessageSystem* msg, void**);
+ static void processRemoveInventoryObjects(LLMessageSystem* msg, void**);
static void processSaveAssetIntoInventory(LLMessageSystem* msg, void**);
static void processBulkUpdateInventory(LLMessageSystem* msg, void**);
static void processInventoryDescendents(LLMessageSystem* msg, void**);
diff --git a/indra/newview/llinventorymodelbackgroundfetch.cpp b/indra/newview/llinventorymodelbackgroundfetch.cpp
index eab8f187a7..f4d0110b0f 100644
--- a/indra/newview/llinventorymodelbackgroundfetch.cpp
+++ b/indra/newview/llinventorymodelbackgroundfetch.cpp
@@ -31,7 +31,9 @@
#include "llappviewer.h"
#include "llcallbacklist.h"
#include "llinventorypanel.h"
+#include "llinventorymodel.h"
#include "llviewercontrol.h"
+#include "llviewerinventory.h"
#include "llviewermessage.h"
#include "llviewerregion.h"
#include "llviewerwindow.h"
@@ -41,6 +43,7 @@ const S32 MAX_FETCH_RETRIES = 10;
LLInventoryModelBackgroundFetch::LLInventoryModelBackgroundFetch() :
mBackgroundFetchActive(FALSE),
+ mFolderFetchActive(false),
mAllFoldersFetched(FALSE),
mRecursiveInventoryFetchStarted(FALSE),
mRecursiveLibraryFetchStarted(FALSE),
@@ -48,7 +51,7 @@ LLInventoryModelBackgroundFetch::LLInventoryModelBackgroundFetch() :
mMinTimeBetweenFetches(0.3f),
mMaxTimeBetweenFetches(10.f),
mTimelyFetchPending(FALSE),
- mBulkFetchCount(0)
+ mFetchCount(0)
{
}
@@ -58,7 +61,7 @@ LLInventoryModelBackgroundFetch::~LLInventoryModelBackgroundFetch()
bool LLInventoryModelBackgroundFetch::isBulkFetchProcessingComplete() const
{
- return mFetchQueue.empty() && mBulkFetchCount<=0;
+ return mFetchQueue.empty() && mFetchCount<=0;
}
bool LLInventoryModelBackgroundFetch::libraryFetchStarted() const
@@ -96,19 +99,21 @@ bool LLInventoryModelBackgroundFetch::isEverythingFetched() const
return mAllFoldersFetched;
}
-BOOL LLInventoryModelBackgroundFetch::backgroundFetchActive() const
+BOOL LLInventoryModelBackgroundFetch::folderFetchActive() const
{
- return mBackgroundFetchActive;
+ return mFolderFetchActive;
}
-void LLInventoryModelBackgroundFetch::start(const LLUUID& cat_id, BOOL recursive)
+void LLInventoryModelBackgroundFetch::start(const LLUUID& id, BOOL recursive)
{
- if (!mAllFoldersFetched)
- {
- LL_DEBUGS("InventoryFetch") << "Start fetching category: " << cat_id << ", recursive: " << recursive << LL_ENDL;
+ LLViewerInventoryCategory* cat = gInventory.getCategory(id);
+ if (cat || (id.isNull() && !isEverythingFetched()))
+ { // it's a folder, do a bulk fetch
+ LL_DEBUGS("InventoryFetch") << "Start fetching category: " << id << ", recursive: " << recursive << LL_ENDL;
mBackgroundFetchActive = TRUE;
- if (cat_id.isNull())
+ mFolderFetchActive = true;
+ if (id.isNull())
{
if (!mRecursiveInventoryFetchStarted)
{
@@ -126,41 +131,41 @@ void LLInventoryModelBackgroundFetch::start(const LLUUID& cat_id, BOOL recursive
else
{
// Specific folder requests go to front of queue.
- if (mFetchQueue.empty() || mFetchQueue.front().mCatUUID != cat_id)
+ if (mFetchQueue.empty() || mFetchQueue.front().mUUID != id)
{
- mFetchQueue.push_front(FetchQueueInfo(cat_id, recursive));
+ mFetchQueue.push_front(FetchQueueInfo(id, recursive));
gIdleCallbacks.addFunction(&LLInventoryModelBackgroundFetch::backgroundFetchCB, NULL);
}
- if (cat_id == gInventory.getLibraryRootFolderID())
+ if (id == gInventory.getLibraryRootFolderID())
{
mRecursiveLibraryFetchStarted |= recursive;
}
- if (cat_id == gInventory.getRootFolderID())
+ if (id == gInventory.getRootFolderID())
{
mRecursiveInventoryFetchStarted |= recursive;
}
}
}
+ else if (LLViewerInventoryItem* itemp = gInventory.getItem(id))
+ {
+ if (!itemp->mIsComplete && (mFetchQueue.empty() || mFetchQueue.front().mUUID != id))
+ {
+ mBackgroundFetchActive = TRUE;
+
+ mFetchQueue.push_front(FetchQueueInfo(id, false, false));
+ gIdleCallbacks.addFunction(&LLInventoryModelBackgroundFetch::backgroundFetchCB, NULL);
+ }
+ }
}
void LLInventoryModelBackgroundFetch::findLostItems()
{
mBackgroundFetchActive = TRUE;
+ mFolderFetchActive = true;
mFetchQueue.push_back(FetchQueueInfo(LLUUID::null, TRUE));
gIdleCallbacks.addFunction(&LLInventoryModelBackgroundFetch::backgroundFetchCB, NULL);
}
-void LLInventoryModelBackgroundFetch::stopBackgroundFetch()
-{
- if (mBackgroundFetchActive)
- {
- mBackgroundFetchActive = FALSE;
- gIdleCallbacks.deleteFunction(&LLInventoryModelBackgroundFetch::backgroundFetchCB, NULL);
- mBulkFetchCount=0;
- mMinTimeBetweenFetches=0.0f;
- }
-}
-
void LLInventoryModelBackgroundFetch::setAllFoldersFetched()
{
if (mRecursiveInventoryFetchStarted &&
@@ -168,7 +173,7 @@ void LLInventoryModelBackgroundFetch::setAllFoldersFetched()
{
mAllFoldersFetched = TRUE;
}
- stopBackgroundFetch();
+ mFolderFetchActive = false;
}
void LLInventoryModelBackgroundFetch::backgroundFetchCB(void *)
@@ -181,10 +186,9 @@ void LLInventoryModelBackgroundFetch::backgroundFetch()
if (mBackgroundFetchActive && gAgent.getRegion())
{
// If we'll be using the capability, we'll be sending batches and the background thing isn't as important.
- std::string url = gAgent.getRegion()->getCapability("WebFetchInventoryDescendents");
- if (!url.empty())
+ if (gSavedSettings.getBOOL("UseHTTPInventory"))
{
- bulkFetch(url);
+ bulkFetch();
return;
}
@@ -199,6 +203,9 @@ void LLInventoryModelBackgroundFetch::backgroundFetch()
llinfos << "Inventory fetch completed" << llendl;
setAllFoldersFetched();
+ mBackgroundFetchActive = false;
+ mFolderFetchActive = false;
+
return;
}
@@ -209,7 +216,7 @@ void LLInventoryModelBackgroundFetch::backgroundFetch()
// Double timeouts on failure.
mMinTimeBetweenFetches = llmin(mMinTimeBetweenFetches * 2.f, 10.f);
mMaxTimeBetweenFetches = llmin(mMaxTimeBetweenFetches * 2.f, 120.f);
- llinfos << "Inventory fetch times grown to (" << mMinTimeBetweenFetches << ", " << mMaxTimeBetweenFetches << ")" << llendl;
+ lldebugs << "Inventory fetch times grown to (" << mMinTimeBetweenFetches << ", " << mMaxTimeBetweenFetches << ")" << llendl;
// fetch is no longer considered "timely" although we will wait for full time-out.
mTimelyFetchPending = FALSE;
}
@@ -228,80 +235,114 @@ void LLInventoryModelBackgroundFetch::backgroundFetch()
}
const FetchQueueInfo info = mFetchQueue.front();
- LLViewerInventoryCategory* cat = gInventory.getCategory(info.mCatUUID);
- // Category has been deleted, remove from queue.
- if (!cat)
+ if (info.mIsCategory)
{
- mFetchQueue.pop_front();
- continue;
- }
+
+ LLViewerInventoryCategory* cat = gInventory.getCategory(info.mUUID);
+
+ // Category has been deleted, remove from queue.
+ if (!cat)
+ {
+ mFetchQueue.pop_front();
+ continue;
+ }
- if (mFetchTimer.getElapsedTimeF32() > mMinTimeBetweenFetches &&
- LLViewerInventoryCategory::VERSION_UNKNOWN == cat->getVersion())
- {
- // Category exists but has no children yet, fetch the descendants
- // for now, just request every time and rely on retry timer to throttle.
- if (cat->fetch())
+ if (mFetchTimer.getElapsedTimeF32() > mMinTimeBetweenFetches &&
+ LLViewerInventoryCategory::VERSION_UNKNOWN == cat->getVersion())
{
- mFetchTimer.reset();
- mTimelyFetchPending = TRUE;
+ // Category exists but has no children yet, fetch the descendants
+ // for now, just request every time and rely on retry timer to throttle.
+ if (cat->fetch())
+ {
+ mFetchTimer.reset();
+ mTimelyFetchPending = TRUE;
+ }
+ else
+ {
+ // The catagory also tracks if it has expired and here it says it hasn't
+ // yet. Get out of here because nothing is going to happen until we
+ // update the timers.
+ break;
+ }
}
- else
+ // Do I have all my children?
+ else if (gInventory.isCategoryComplete(info.mUUID))
{
- // The catagory also tracks if it has expired and here it says it hasn't
- // yet. Get out of here because nothing is going to happen until we
- // update the timers.
+ // Finished with this category, remove from queue.
+ mFetchQueue.pop_front();
+
+ // Add all children to queue.
+ LLInventoryModel::cat_array_t* categories;
+ LLInventoryModel::item_array_t* items;
+ gInventory.getDirectDescendentsOf(cat->getUUID(), categories, items);
+ for (LLInventoryModel::cat_array_t::const_iterator it = categories->begin();
+ it != categories->end();
+ ++it)
+ {
+ mFetchQueue.push_back(FetchQueueInfo((*it)->getUUID(),info.mRecursive));
+ }
+
+ // We received a response in less than the fast time.
+ if (mTimelyFetchPending && mFetchTimer.getElapsedTimeF32() < fast_fetch_time)
+ {
+ // Shrink timeouts based on success.
+ mMinTimeBetweenFetches = llmax(mMinTimeBetweenFetches * 0.8f, 0.3f);
+ mMaxTimeBetweenFetches = llmax(mMaxTimeBetweenFetches * 0.8f, 10.f);
+ lldebugs << "Inventory fetch times shrunk to (" << mMinTimeBetweenFetches << ", " << mMaxTimeBetweenFetches << ")" << llendl;
+ }
+
+ mTimelyFetchPending = FALSE;
+ continue;
+ }
+ else if (mFetchTimer.getElapsedTimeF32() > mMaxTimeBetweenFetches)
+ {
+ // Received first packet, but our num descendants does not match db's num descendants
+ // so try again later.
+ mFetchQueue.pop_front();
+
+ if (mNumFetchRetries++ < MAX_FETCH_RETRIES)
+ {
+ // push on back of queue
+ mFetchQueue.push_back(info);
+ }
+ mTimelyFetchPending = FALSE;
+ mFetchTimer.reset();
break;
}
+
+ // Not enough time has elapsed to do a new fetch
+ break;
}
- // Do I have all my children?
- else if (gInventory.isCategoryComplete(info.mCatUUID))
+ else
{
- // Finished with this category, remove from queue.
- mFetchQueue.pop_front();
+ LLViewerInventoryItem* itemp = gInventory.getItem(info.mUUID);
- // Add all children to queue.
- LLInventoryModel::cat_array_t* categories;
- LLInventoryModel::item_array_t* items;
- gInventory.getDirectDescendentsOf(cat->getUUID(), categories, items);
- for (LLInventoryModel::cat_array_t::const_iterator it = categories->begin();
- it != categories->end();
- ++it)
+ mFetchQueue.pop_front();
+ if (!itemp)
{
- mFetchQueue.push_back(FetchQueueInfo((*it)->getUUID(),info.mRecursive));
+ continue;
}
- // We received a response in less than the fast time.
- if (mTimelyFetchPending && mFetchTimer.getElapsedTimeF32() < fast_fetch_time)
+ if (mFetchTimer.getElapsedTimeF32() > mMinTimeBetweenFetches)
{
- // Shrink timeouts based on success.
- mMinTimeBetweenFetches = llmax(mMinTimeBetweenFetches * 0.8f, 0.3f);
- mMaxTimeBetweenFetches = llmax(mMaxTimeBetweenFetches * 0.8f, 10.f);
- //llinfos << "Inventory fetch times shrunk to (" << mMinTimeBetweenFetches << ", " << mMaxTimeBetweenFetches << ")" << llendl;
+ itemp->fetchFromServer();
+ mFetchTimer.reset();
+ mTimelyFetchPending = TRUE;
}
-
- mTimelyFetchPending = FALSE;
- continue;
- }
- else if (mFetchTimer.getElapsedTimeF32() > mMaxTimeBetweenFetches)
- {
- // Received first packet, but our num descendants does not match db's num descendants
- // so try again later.
- mFetchQueue.pop_front();
-
- if (mNumFetchRetries++ < MAX_FETCH_RETRIES)
+ else if (itemp->mIsComplete)
+ {
+ mTimelyFetchPending = FALSE;
+ }
+ else if (mFetchTimer.getElapsedTimeF32() > mMaxTimeBetweenFetches)
{
- // push on back of queue
mFetchQueue.push_back(info);
+ mFetchTimer.reset();
+ mTimelyFetchPending = FALSE;
}
- mTimelyFetchPending = FALSE;
- mFetchTimer.reset();
+ // Not enough time has elapsed to do a new fetch
break;
}
-
- // Not enough time has elapsed to do a new fetch
- break;
}
//
@@ -311,15 +352,35 @@ void LLInventoryModelBackgroundFetch::backgroundFetch()
}
}
-void LLInventoryModelBackgroundFetch::incrBulkFetch(S16 fetching)
+void LLInventoryModelBackgroundFetch::incrFetchCount(S16 fetching)
{
- mBulkFetchCount += fetching;
- if (mBulkFetchCount < 0)
+ mFetchCount += fetching;
+ if (mFetchCount < 0)
{
- mBulkFetchCount = 0;
+ mFetchCount = 0;
}
}
+class LLInventoryModelFetchItemResponder : public LLInventoryModel::fetchInventoryResponder
+{
+public:
+ LLInventoryModelFetchItemResponder(const LLSD& request_sd) : LLInventoryModel::fetchInventoryResponder(request_sd) {};
+ void result(const LLSD& content);
+ void error(U32 status, const std::string& reason);
+};
+
+void LLInventoryModelFetchItemResponder::result( const LLSD& content )
+{
+ LLInventoryModel::fetchInventoryResponder::result(content);
+ LLInventoryModelBackgroundFetch::instance().incrFetchCount(-1);
+}
+
+void LLInventoryModelFetchItemResponder::error( U32 status, const std::string& reason )
+{
+ LLInventoryModel::fetchInventoryResponder::error(status, reason);
+ LLInventoryModelBackgroundFetch::instance().incrFetchCount(-1);
+}
+
class LLInventoryModelFetchDescendentsResponder: public LLHTTPClient::Responder
{
@@ -388,7 +449,7 @@ void LLInventoryModelFetchDescendentsResponder::result(const LLSD& content)
titem->setParent(lost_uuid);
titem->updateParentOnServer(FALSE);
gInventory.updateItem(titem);
- gInventory.notifyObservers("fetchDescendents");
+ gInventory.notifyObservers();
}
}
@@ -456,7 +517,7 @@ void LLInventoryModelFetchDescendentsResponder::result(const LLSD& content)
}
}
- fetcher->incrBulkFetch(-1);
+ fetcher->incrFetchCount(-1);
if (fetcher->isBulkFetchProcessingComplete())
{
@@ -464,7 +525,7 @@ void LLInventoryModelFetchDescendentsResponder::result(const LLSD& content)
fetcher->setAllFoldersFetched();
}
- gInventory.notifyObservers("fetchDescendents");
+ gInventory.notifyObservers();
}
// If we get back an error (not found, etc...), handle it here.
@@ -475,7 +536,7 @@ void LLInventoryModelFetchDescendentsResponder::error(U32 status, const std::str
llinfos << "LLInventoryModelFetchDescendentsResponder::error "
<< status << ": " << reason << llendl;
- fetcher->incrBulkFetch(-1);
+ fetcher->incrFetchCount(-1);
if (status==499) // timed out
{
@@ -496,7 +557,7 @@ void LLInventoryModelFetchDescendentsResponder::error(U32 status, const std::str
fetcher->setAllFoldersFetched();
}
}
- gInventory.notifyObservers("fetchDescendents");
+ gInventory.notifyObservers();
}
BOOL LLInventoryModelFetchDescendentsResponder::getIsRecursive(const LLUUID& cat_id) const
@@ -506,12 +567,13 @@ BOOL LLInventoryModelFetchDescendentsResponder::getIsRecursive(const LLUUID& cat
// Bundle up a bunch of requests to send all at once.
// static
-void LLInventoryModelBackgroundFetch::bulkFetch(std::string url)
+void LLInventoryModelBackgroundFetch::bulkFetch()
{
//Background fetch is called from gIdleCallbacks in a loop until background fetch is stopped.
//If there are items in mFetchQueue, we want to check the time since the last bulkFetch was
//sent. If it exceeds our retry time, go ahead and fire off another batch.
- //Stopbackgroundfetch will be run from the Responder instead of here.
+ LLViewerRegion* region = gAgent.getRegion();
+ if (!region) return;
S16 max_concurrent_fetches=8;
F32 new_min_time = 0.5f; //HACK! Clean this up when old code goes away entirely.
@@ -521,12 +583,13 @@ void LLInventoryModelBackgroundFetch::bulkFetch(std::string url)
}
if (gDisconnected ||
- (mBulkFetchCount > max_concurrent_fetches) ||
+ (mFetchCount > max_concurrent_fetches) ||
(mFetchTimer.getElapsedTimeF32() < mMinTimeBetweenFetches))
{
return; // just bail if we are disconnected
}
+ U32 item_count=0;
U32 folder_count=0;
U32 max_batch_size=5;
@@ -534,83 +597,159 @@ void LLInventoryModelBackgroundFetch::bulkFetch(std::string url)
uuid_vec_t recursive_cats;
- LLSD body;
- LLSD body_lib;
+ LLSD folder_request_body;
+ LLSD folder_request_body_lib;
+ LLSD item_request_body;
+ LLSD item_request_body_lib;
- while (!(mFetchQueue.empty()) && (folder_count < max_batch_size))
+ while (!mFetchQueue.empty()
+ && (item_count + folder_count) < max_batch_size)
{
const FetchQueueInfo& fetch_info = mFetchQueue.front();
- const LLUUID &cat_id = fetch_info.mCatUUID;
- if (cat_id.isNull()) //DEV-17797
- {
- LLSD folder_sd;
- folder_sd["folder_id"] = LLUUID::null.asString();
- folder_sd["owner_id"] = gAgent.getID();
- folder_sd["sort_order"] = (LLSD::Integer)sort_order;
- folder_sd["fetch_folders"] = (LLSD::Boolean)FALSE;
- folder_sd["fetch_items"] = (LLSD::Boolean)TRUE;
- body["folders"].append(folder_sd);
- folder_count++;
- }
- else
- {
- const LLViewerInventoryCategory* cat = gInventory.getCategory(cat_id);
+ if (fetch_info.mIsCategory)
+ {
+ const LLUUID &cat_id = fetch_info.mUUID;
+ if (cat_id.isNull()) //DEV-17797
+ {
+ LLSD folder_sd;
+ folder_sd["folder_id"] = LLUUID::null.asString();
+ folder_sd["owner_id"] = gAgent.getID();
+ folder_sd["sort_order"] = (LLSD::Integer)sort_order;
+ folder_sd["fetch_folders"] = (LLSD::Boolean)FALSE;
+ folder_sd["fetch_items"] = (LLSD::Boolean)TRUE;
+ folder_request_body["folders"].append(folder_sd);
+ folder_count++;
+ }
+ else
+ {
+ const LLViewerInventoryCategory* cat = gInventory.getCategory(cat_id);
- if (cat)
- {
- if (LLViewerInventoryCategory::VERSION_UNKNOWN == cat->getVersion())
- {
- LLSD folder_sd;
- folder_sd["folder_id"] = cat->getUUID();
- folder_sd["owner_id"] = cat->getOwnerID();
- folder_sd["sort_order"] = (LLSD::Integer)sort_order;
- folder_sd["fetch_folders"] = TRUE; //(LLSD::Boolean)sFullFetchStarted;
- folder_sd["fetch_items"] = (LLSD::Boolean)TRUE;
-
- if (ALEXANDRIA_LINDEN_ID == cat->getOwnerID())
- body_lib["folders"].append(folder_sd);
- else
- body["folders"].append(folder_sd);
- folder_count++;
- }
- // May already have this folder, but append child folders to list.
- if (fetch_info.mRecursive)
- {
- LLInventoryModel::cat_array_t* categories;
- LLInventoryModel::item_array_t* items;
- gInventory.getDirectDescendentsOf(cat->getUUID(), categories, items);
- for (LLInventoryModel::cat_array_t::const_iterator it = categories->begin();
- it != categories->end();
- ++it)
+ if (cat)
+ {
+ if (LLViewerInventoryCategory::VERSION_UNKNOWN == cat->getVersion())
{
- mFetchQueue.push_back(FetchQueueInfo((*it)->getUUID(), fetch_info.mRecursive));
- }
- }
- }
- }
- if (fetch_info.mRecursive)
- recursive_cats.push_back(cat_id);
+ LLSD folder_sd;
+ folder_sd["folder_id"] = cat->getUUID();
+ folder_sd["owner_id"] = cat->getOwnerID();
+ folder_sd["sort_order"] = (LLSD::Integer)sort_order;
+ folder_sd["fetch_folders"] = TRUE; //(LLSD::Boolean)sFullFetchStarted;
+ folder_sd["fetch_items"] = (LLSD::Boolean)TRUE;
+
+ if (ALEXANDRIA_LINDEN_ID == cat->getOwnerID())
+ folder_request_body_lib["folders"].append(folder_sd);
+ else
+ folder_request_body["folders"].append(folder_sd);
+ folder_count++;
+ }
+ // May already have this folder, but append child folders to list.
+ if (fetch_info.mRecursive)
+ {
+ LLInventoryModel::cat_array_t* categories;
+ LLInventoryModel::item_array_t* items;
+ gInventory.getDirectDescendentsOf(cat->getUUID(), categories, items);
+ for (LLInventoryModel::cat_array_t::const_iterator it = categories->begin();
+ it != categories->end();
+ ++it)
+ {
+ mFetchQueue.push_back(FetchQueueInfo((*it)->getUUID(), fetch_info.mRecursive));
+ }
+ }
+ }
+ }
+ if (fetch_info.mRecursive)
+ recursive_cats.push_back(cat_id);
+ }
+ else
+ {
+ LLViewerInventoryItem* itemp = gInventory.getItem(fetch_info.mUUID);
+ if (itemp)
+ {
+ LLSD item_sd;
+ item_sd["owner_id"] = itemp->getPermissions().getOwner();
+ item_sd["item_id"] = itemp->getUUID();
+ if (itemp->getPermissions().getOwner() == gAgent.getID())
+ {
+ item_request_body.append(item_sd);
+ }
+ else
+ {
+ item_request_body_lib.append(item_sd);
+ }
+ //itemp->fetchFromServer();
+ item_count++;
+ }
+ }
mFetchQueue.pop_front();
}
- if (folder_count > 0)
+ if (item_count + folder_count > 0)
{
- mBulkFetchCount++;
- if (body["folders"].size())
+ if (folder_count)
{
- LLInventoryModelFetchDescendentsResponder *fetcher = new LLInventoryModelFetchDescendentsResponder(body, recursive_cats);
- LLHTTPClient::post(url, body, fetcher, 300.0);
+ std::string url = region->getCapability("FetchInventoryDescendents2");
+ mFetchCount++;
+ if (folder_request_body["folders"].size())
+ {
+ LLInventoryModelFetchDescendentsResponder *fetcher = new LLInventoryModelFetchDescendentsResponder(folder_request_body, recursive_cats);
+ LLHTTPClient::post(url, folder_request_body, fetcher, 300.0);
+ }
+ if (folder_request_body_lib["folders"].size())
+ {
+ std::string url_lib = gAgent.getRegion()->getCapability("FetchLibDescendents2");
+
+ LLInventoryModelFetchDescendentsResponder *fetcher = new LLInventoryModelFetchDescendentsResponder(folder_request_body_lib, recursive_cats);
+ LLHTTPClient::post(url_lib, folder_request_body_lib, fetcher, 300.0);
+ }
}
- if (body_lib["folders"].size())
+ if (item_count)
{
- std::string url_lib = gAgent.getRegion()->getCapability("FetchLibDescendents");
-
- LLInventoryModelFetchDescendentsResponder *fetcher = new LLInventoryModelFetchDescendentsResponder(body_lib, recursive_cats);
- LLHTTPClient::post(url_lib, body_lib, fetcher, 300.0);
+ std::string url;
+
+ if (item_request_body.size())
+ {
+ mFetchCount++;
+ url = region->getCapability("FetchInventory2");
+ if (!url.empty())
+ {
+ LLSD body;
+ body["agent_id"] = gAgent.getID();
+ body["items"] = item_request_body;
+
+ LLHTTPClient::post(url, body, new LLInventoryModelFetchItemResponder(body));
+ }
+ //else
+ //{
+ // LLMessageSystem* msg = gMessageSystem;
+ // msg->newMessage("FetchInventory");
+ // msg->nextBlock("AgentData");
+ // msg->addUUID("AgentID", gAgent.getID());
+ // msg->addUUID("SessionID", gAgent.getSessionID());
+ // msg->nextBlock("InventoryData");
+ // msg->addUUID("OwnerID", mPermissions.getOwner());
+ // msg->addUUID("ItemID", mUUID);
+ // gAgent.sendReliableMessage();
+ //}
+ }
+
+ if (item_request_body_lib.size())
+ {
+ mFetchCount++;
+
+ url = region->getCapability("FetchLib2");
+ if (!url.empty())
+ {
+ LLSD body;
+ body["agent_id"] = gAgent.getID();
+ body["items"] = item_request_body_lib;
+
+ LLHTTPClient::post(url, body, new LLInventoryModelFetchItemResponder(body));
+ }
+ }
}
mFetchTimer.reset();
}
+
else if (isBulkFetchProcessingComplete())
{
setAllFoldersFetched();
@@ -622,7 +761,7 @@ bool LLInventoryModelBackgroundFetch::fetchQueueContainsNoDescendentsOf(const LL
for (fetch_queue_t::const_iterator it = mFetchQueue.begin();
it != mFetchQueue.end(); ++it)
{
- const LLUUID& fetch_id = (*it).mCatUUID;
+ const LLUUID& fetch_id = (*it).mUUID;
if (gInventory.isObjectDescendentOf(fetch_id, cat_id))
return false;
}
diff --git a/indra/newview/llinventorymodelbackgroundfetch.h b/indra/newview/llinventorymodelbackgroundfetch.h
index c35c785ceb..9dfedddd6d 100644
--- a/indra/newview/llinventorymodelbackgroundfetch.h
+++ b/indra/newview/llinventorymodelbackgroundfetch.h
@@ -48,7 +48,7 @@ public:
// This gets triggered when performing a filter-search.
void start(const LLUUID& cat_id = LLUUID::null, BOOL recursive = TRUE);
- BOOL backgroundFetchActive() const;
+ BOOL folderFetchActive() const;
bool isEverythingFetched() const; // completing the fetch once per session should be sufficient
bool libraryFetchStarted() const;
@@ -60,14 +60,13 @@ public:
bool inventoryFetchInProgress() const;
void findLostItems();
+ void incrFetchCount(S16 fetching);
protected:
- void incrBulkFetch(S16 fetching);
bool isBulkFetchProcessingComplete() const;
- void bulkFetch(std::string url);
+ void bulkFetch();
void backgroundFetch();
static void backgroundFetchCB(void*); // background fetch idle function
- void stopBackgroundFetch(); // stop fetch process
void setAllFoldersFetched();
bool fetchQueueContainsNoDescendentsOf(const LLUUID& cat_id) const;
@@ -77,7 +76,8 @@ private:
BOOL mAllFoldersFetched;
BOOL mBackgroundFetchActive;
- S16 mBulkFetchCount;
+ bool mFolderFetchActive;
+ S16 mFetchCount;
BOOL mTimelyFetchPending;
S32 mNumFetchRetries;
@@ -87,11 +87,11 @@ private:
struct FetchQueueInfo
{
- FetchQueueInfo(const LLUUID& id, BOOL recursive) :
- mCatUUID(id), mRecursive(recursive)
- {
- }
- LLUUID mCatUUID;
+ FetchQueueInfo(const LLUUID& id, BOOL recursive, bool is_category = true) :
+ mUUID(id), mRecursive(recursive), mIsCategory(is_category)
+ {}
+ LLUUID mUUID;
+ bool mIsCategory;
BOOL mRecursive;
};
typedef std::deque<FetchQueueInfo> fetch_queue_t;
diff --git a/indra/newview/llinventoryobserver.cpp b/indra/newview/llinventoryobserver.cpp
index 91ff8c7867..9db175ec2e 100644
--- a/indra/newview/llinventoryobserver.cpp
+++ b/indra/newview/llinventoryobserver.cpp
@@ -202,9 +202,10 @@ void LLInventoryFetchItemsObserver::changed(U32 mask)
void fetch_items_from_llsd(const LLSD& items_llsd)
{
if (!items_llsd.size() || gDisconnected) return;
+
LLSD body;
- body[0]["cap_name"] = "FetchInventory";
- body[1]["cap_name"] = "FetchLib";
+ body[0]["cap_name"] = "FetchInventory2";
+ body[1]["cap_name"] = "FetchLib2";
for (S32 i=0; i<items_llsd.size();i++)
{
if (items_llsd[i]["owner_id"].asString() == gAgent.getID().asString())
@@ -212,7 +213,7 @@ void fetch_items_from_llsd(const LLSD& items_llsd)
body[0]["items"].append(items_llsd[i]);
continue;
}
- if (items_llsd[i]["owner_id"].asString() == ALEXANDRIA_LINDEN_ID.asString())
+ else if (items_llsd[i]["owner_id"].asString() == ALEXANDRIA_LINDEN_ID.asString())
{
body[1]["items"].append(items_llsd[i]);
continue;
@@ -221,19 +222,23 @@ void fetch_items_from_llsd(const LLSD& items_llsd)
for (S32 i=0; i<body.size(); i++)
{
- if(!gAgent.getRegion())
+ if (!gAgent.getRegion())
{
- llwarns<<"Agent's region is null"<<llendl;
+ llwarns << "Agent's region is null" << llendl;
break;
}
- if (0 >= body[i].size()) continue;
- std::string url = gAgent.getRegion()->getCapability(body[i]["cap_name"].asString());
+ if (0 == body[i]["items"].size()) {
+ lldebugs << "Skipping body with no items to fetch" << llendl;
+ continue;
+ }
+
+ std::string url = gAgent.getRegion()->getCapability(body[i]["cap_name"].asString());
if (!url.empty())
{
body[i]["agent_id"] = gAgent.getID();
LLHTTPClient::post(url, body[i], new LLInventoryModel::fetchInventoryResponder(body[i]));
- break;
+ continue;
}
LLMessageSystem* msg = gMessageSystem;
@@ -303,7 +308,7 @@ void LLInventoryFetchItemsObserver::startFetch()
// It's incomplete, so put it on the incomplete container, and
// pack this on the message.
mIncomplete.push_back(*it);
-
+
// Prepare the data to fetch
LLSD item_entry;
item_entry["owner_id"] = owner_id;
@@ -572,16 +577,7 @@ void LLInventoryAddedObserver::changed(U32 mask)
// the network, figure out which item was updated.
LLMessageSystem* msg = gMessageSystem;
- std::string msg_name;
- if (mMessageName.empty())
- {
- msg_name = msg->getMessageName();
- }
- else
- {
- msg_name = mMessageName;
- }
-
+ std::string msg_name = msg->getMessageName();
if (msg_name.empty())
{
return;
@@ -610,6 +606,34 @@ void LLInventoryAddedObserver::changed(U32 mask)
}
}
+void LLInventoryCategoryAddedObserver::changed(U32 mask)
+{
+ if (!(mask & LLInventoryObserver::ADD))
+ {
+ return;
+ }
+
+ const LLInventoryModel::changed_items_t& changed_ids = gInventory.getChangedIDs();
+
+ for (LLInventoryModel::changed_items_t::const_iterator cit = changed_ids.begin(); cit != changed_ids.end(); ++cit)
+ {
+ LLViewerInventoryCategory* cat = gInventory.getCategory(*cit);
+
+ if (cat)
+ {
+ mAddedCategories.push_back(cat);
+ }
+ }
+
+ if (!mAddedCategories.empty())
+ {
+ done();
+
+ mAddedCategories.clear();
+ }
+}
+
+
LLInventoryTransactionObserver::LLInventoryTransactionObserver(const LLTransactionID& transaction_id) :
mTransactionID(transaction_id)
{
diff --git a/indra/newview/llinventoryobserver.h b/indra/newview/llinventoryobserver.h
index f2a2049a51..aa1eae84d7 100644
--- a/indra/newview/llinventoryobserver.h
+++ b/indra/newview/llinventoryobserver.h
@@ -63,7 +63,6 @@ public:
LLInventoryObserver();
virtual ~LLInventoryObserver();
virtual void changed(U32 mask) = 0;
- std::string mMessageName; // used by Agent Inventory Service only. [DEV-20328]
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -220,6 +219,28 @@ protected:
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLInventoryCategoryAddedObserver
+//
+// Base class for doing something when a new category is created in the
+// inventory.
+// It does not watch for a certain UUID, rather it acts when anything is added
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+class LLInventoryCategoryAddedObserver : public LLInventoryObserver
+{
+public:
+
+ typedef std::vector<LLViewerInventoryCategory*> cat_vec_t;
+
+ LLInventoryCategoryAddedObserver() : mAddedCategories() {}
+ /*virtual*/ void changed(U32 mask);
+
+protected:
+ virtual void done() = 0;
+
+ cat_vec_t mAddedCategories;
+};
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLInventoryTransactionObserver
//
// Base class for doing something when an inventory transaction completes.
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index 0870b5b8dd..71dd963f28 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -33,16 +33,17 @@
#include "llagentwearables.h"
#include "llappearancemgr.h"
#include "llavataractions.h"
+#include "llclipboard.h"
#include "llfloaterinventory.h"
#include "llfloaterreg.h"
+#include "llfloatersidepanelcontainer.h"
+#include "llfolderview.h"
#include "llimfloater.h"
#include "llimview.h"
#include "llinventorybridge.h"
#include "llinventoryfunctions.h"
#include "llinventorymodelbackgroundfetch.h"
#include "llsidepanelinventory.h"
-#include "llsidetray.h"
-#include "llscrollcontainer.h"
#include "llviewerattachmenu.h"
#include "llviewerfoldertype.h"
#include "llvoavatarself.h"
@@ -60,6 +61,7 @@ static const LLInventoryFVBridgeBuilder INVENTORY_BRIDGE_BUILDER;
//
// Bridge to support knowing when the inventory has changed.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
class LLInventoryPanelObserver : public LLInventoryObserver
{
public:
@@ -73,18 +75,67 @@ protected:
LLInventoryPanel* mIP;
};
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLInvPanelComplObserver
+//
+// Calls specified callback when all specified items become complete.
+//
+// Usage:
+// observer = new LLInvPanelComplObserver(boost::bind(onComplete));
+// inventory->addObserver(observer);
+// observer->reset(); // (optional)
+// observer->watchItem(incomplete_item1_id);
+// observer->watchItem(incomplete_item2_id);
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+class LLInvPanelComplObserver : public LLInventoryCompletionObserver
+{
+public:
+ typedef boost::function<void()> callback_t;
+
+ LLInvPanelComplObserver(callback_t cb)
+ : mCallback(cb)
+ {
+ }
+
+ void reset();
+
+private:
+ /*virtual*/ void done();
+
+ /// Called when all the items are complete.
+ callback_t mCallback;
+};
+
+void LLInvPanelComplObserver::reset()
+{
+ mIncomplete.clear();
+ mComplete.clear();
+}
+
+void LLInvPanelComplObserver::done()
+{
+ mCallback();
+}
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLInventoryPanel
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p) :
LLPanel(p),
mInventoryObserver(NULL),
+ mCompletionObserver(NULL),
mFolderRoot(NULL),
mScroller(NULL),
mSortOrderSetting(p.sort_order_setting),
mInventory(p.inventory),
+ mAcceptsDragAndDrop(p.accepts_drag_and_drop),
mAllowMultiSelect(p.allow_multi_select),
mShowItemLinkOverlays(p.show_item_link_overlays),
+ mShowEmptyMessage(p.show_empty_message),
+ mShowLoadStatus(p.show_load_status),
mViewsInitialized(false),
- mStartFolderString(p.start_folder),
- mBuildDefaultHierarchy(true),
mInvFVBridgeBuilder(NULL)
{
mInvFVBridgeBuilder = &INVENTORY_BRIDGE_BUILDER;
@@ -97,11 +148,45 @@ LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p) :
mCommitCallbackRegistrar.add("Inventory.AttachObject", boost::bind(&LLInventoryPanel::attachObject, this, _2));
mCommitCallbackRegistrar.add("Inventory.BeginIMSession", boost::bind(&LLInventoryPanel::beginIMSession, this));
mCommitCallbackRegistrar.add("Inventory.Share", boost::bind(&LLAvatarActions::shareWithAvatars));
+
+}
+
+void LLInventoryPanel::buildFolderView(const LLInventoryPanel::Params& params)
+{
+ // Determine the root folder in case specified, and
+ // build the views starting with that folder.
+
+ std::string start_folder_name(params.start_folder());
- if (mStartFolderString != "")
+ const LLFolderType::EType preferred_type = LLViewerFolderType::lookupTypeFromNewCategoryName(start_folder_name);
+
+ LLUUID root_id;
+
+ if ("LIBRARY" == params.start_folder())
{
- mBuildDefaultHierarchy = false;
+ root_id = gInventory.getLibraryRootFolderID();
}
+ else
+ {
+ root_id = (preferred_type != LLFolderType::FT_NONE)
+ ? gInventory.findCategoryUUIDForType(preferred_type, false, false)
+ : LLUUID::null;
+ }
+
+ if ((root_id == LLUUID::null) && !start_folder_name.empty())
+ {
+ llwarns << "No category found that matches start_folder: " << start_folder_name << llendl;
+ root_id = LLUUID::generateNewID();
+ }
+
+ LLInvFVBridge* new_listener = mInvFVBridgeBuilder->createBridge(LLAssetType::AT_CATEGORY,
+ LLAssetType::AT_CATEGORY,
+ LLInventoryType::IT_CATEGORY,
+ this,
+ NULL,
+ root_id);
+
+ mFolderRoot = createFolderView(new_listener, params.use_label_suffix());
}
void LLInventoryPanel::initFromParams(const LLInventoryPanel::Params& params)
@@ -110,22 +195,7 @@ void LLInventoryPanel::initFromParams(const LLInventoryPanel::Params& params)
mCommitCallbackRegistrar.pushScope(); // registered as a widget; need to push callback scope ourselves
- // Create root folder
- {
- LLRect folder_rect(0,
- 0,
- getRect().getWidth(),
- 0);
- LLFolderView::Params p;
- p.name = getName();
- p.title = getLabel();
- p.rect = folder_rect;
- p.parent_panel = this;
- p.tool_tip = p.name;
- p.use_label_suffix = params.use_label_suffix;
- mFolderRoot = LLUICtrlFactory::create<LLFolderView>(p);
- mFolderRoot->setAllowMultiSelect(mAllowMultiSelect);
- }
+ buildFolderView(params);
mCommitCallbackRegistrar.popScope();
@@ -135,16 +205,13 @@ void LLInventoryPanel::initFromParams(const LLInventoryPanel::Params& params)
{
LLRect scroller_view_rect = getRect();
scroller_view_rect.translate(-scroller_view_rect.mLeft, -scroller_view_rect.mBottom);
- LLScrollContainer::Params p;
- p.name("Inventory Scroller");
- p.rect(scroller_view_rect);
- p.follows.flags(FOLLOWS_ALL);
- p.reserve_scroll_corner(true);
- p.tab_stop(true);
- mScroller = LLUICtrlFactory::create<LLScrollContainer>(p);
+ LLScrollContainer::Params scroller_params(params.scroll());
+ scroller_params.rect(scroller_view_rect);
+ mScroller = LLUICtrlFactory::create<LLFolderViewScrollContainer>(scroller_params);
addChild(mScroller);
mScroller->addChild(mFolderRoot);
mFolderRoot->setScrollContainer(mScroller);
+ mFolderRoot->setFollowsAll();
mFolderRoot->addChild(mFolderRoot->mStatusTextBox);
}
@@ -152,9 +219,12 @@ void LLInventoryPanel::initFromParams(const LLInventoryPanel::Params& params)
mInventoryObserver = new LLInventoryPanelObserver(this);
mInventory->addObserver(mInventoryObserver);
+ mCompletionObserver = new LLInvPanelComplObserver(boost::bind(&LLInventoryPanel::onItemsCompletion, this));
+ mInventory->addObserver(mCompletionObserver);
+
// Build view of inventory if we need default full hierarchy and inventory ready,
// otherwise wait for idle callback.
- if (mBuildDefaultHierarchy && mInventory->isInventoryUsable() && !mViewsInitialized)
+ if (mInventory->isInventoryUsable() && !mViewsInitialized)
{
initializeViews();
}
@@ -168,8 +238,20 @@ void LLInventoryPanel::initFromParams(const LLInventoryPanel::Params& params)
{
setSortOrder(gSavedSettings.getU32(DEFAULT_SORT_ORDER));
}
- mFolderRoot->setSortOrder(getFilter()->getSortOrder());
+ // hide inbox
+ getFilter()->setFilterCategoryTypes(getFilter()->getFilterCategoryTypes() & ~(1ULL << LLFolderType::FT_INBOX));
+ getFilter()->setFilterCategoryTypes(getFilter()->getFilterCategoryTypes() & ~(1ULL << LLFolderType::FT_OUTBOX));
+
+ // set the filter for the empty folder if the debug setting is on
+ if (gSavedSettings.getBOOL("DebugHideEmptySystemFolders"))
+ {
+ getFilter()->setFilterEmptySystemFolders();
+ }
+
+ // keep track of the clipboard state so that we avoid filtering too much
+ mClipboardState = LLClipboard::instance().getGeneration();
+
// Initialize base class params.
LLPanel::initFromParams(params);
}
@@ -189,7 +271,10 @@ LLInventoryPanel::~LLInventoryPanel()
// LLView destructor will take care of the sub-views.
mInventory->removeObserver(mInventoryObserver);
+ mInventory->removeObserver(mCompletionObserver);
delete mInventoryObserver;
+ delete mCompletionObserver;
+
mScroller = NULL;
}
@@ -197,6 +282,14 @@ void LLInventoryPanel::draw()
{
// Select the desired item (in case it wasn't loaded when the selection was requested)
mFolderRoot->updateSelection();
+
+ // Nudge the filter if the clipboard state changed
+ if (mClipboardState != LLClipboard::instance().getGeneration())
+ {
+ mClipboardState = LLClipboard::instance().getGeneration();
+ getFilter()->setModified(LLClipboard::instance().isCutMode() ? LLInventoryFilter::FILTER_MORE_RESTRICTIVE : LLInventoryFilter::FILTER_LESS_RESTRICTIVE);
+ }
+
LLPanel::draw();
}
@@ -209,6 +302,15 @@ LLInventoryFilter* LLInventoryPanel::getFilter()
return NULL;
}
+const LLInventoryFilter* LLInventoryPanel::getFilter() const
+{
+ if (mFolderRoot)
+ {
+ return mFolderRoot->getFilter();
+ }
+ return NULL;
+}
+
void LLInventoryPanel::setFilterTypes(U64 types, LLInventoryFilter::EFilterType filter_type)
{
if (filter_type == LLInventoryFilter::FILTERTYPE_OBJECT)
@@ -217,6 +319,17 @@ void LLInventoryPanel::setFilterTypes(U64 types, LLInventoryFilter::EFilterType
getFilter()->setFilterCategoryTypes(types);
}
+U32 LLInventoryPanel::getFilterObjectTypes() const
+{
+ return mFolderRoot->getFilterObjectTypes();
+}
+
+U32 LLInventoryPanel::getFilterPermMask() const
+{
+ return mFolderRoot->getFilterPermissions();
+}
+
+
void LLInventoryPanel::setFilterPermMask(PermissionMask filter_perm_mask)
{
getFilter()->setFilterPermissions(filter_perm_mask);
@@ -232,6 +345,12 @@ void LLInventoryPanel::setFilterSubString(const std::string& string)
getFilter()->setFilterSubString(string);
}
+const std::string LLInventoryPanel::getFilterSubString()
+{
+ return mFolderRoot->getFilterSubString();
+}
+
+
void LLInventoryPanel::setSortOrder(U32 order)
{
getFilter()->setSortOrder(order);
@@ -243,6 +362,16 @@ void LLInventoryPanel::setSortOrder(U32 order)
}
}
+U32 LLInventoryPanel::getSortOrder() const
+{
+ return mFolderRoot->getSortOrder();
+}
+
+void LLInventoryPanel::requestSort()
+{
+ mFolderRoot->requestSort();
+}
+
void LLInventoryPanel::setSinceLogoff(BOOL sl)
{
getFilter()->setDateRangeLastLogoff(sl);
@@ -324,7 +453,8 @@ void LLInventoryPanel::modelChanged(U32 mask)
{
view_item->destroyView();
}
- buildNewViews(item_id);
+ view_item = buildNewViews(item_id);
+ view_folder = dynamic_cast<LLFolderViewFolder *>(view_item);
}
//////////////////////////////
@@ -377,11 +507,10 @@ void LLInventoryPanel::modelChanged(U32 mask)
//////////////////////////////
// STRUCTURE Operation
// This item already exists in both memory and UI. It was probably reparented.
- if (model_item && view_item)
+ else if (model_item && view_item)
{
- // Don't process the item if it's hanging from the root, since its
- // model_item's parent will be NULL.
- if (view_item->getRoot() != view_item->getParent())
+ // Don't process the item if it is the root
+ if (view_item->getRoot() != view_item)
{
LLFolderViewFolder* new_parent = (LLFolderViewFolder*)mFolderRoot->getItemByID(model_item->getParentUUID());
// Item has been moved.
@@ -406,7 +535,7 @@ void LLInventoryPanel::modelChanged(U32 mask)
//////////////////////////////
// REMOVE Operation
// This item has been removed from memory, but its associated UI element still exists.
- if (!model_item && view_item)
+ else if (!model_item && view_item)
{
// Remove the item's UI.
view_item->destroyView();
@@ -415,6 +544,12 @@ void LLInventoryPanel::modelChanged(U32 mask)
}
}
+LLFolderView* LLInventoryPanel::getRootFolder()
+{
+ return mFolderRoot;
+}
+
+
// static
void LLInventoryPanel::onIdle(void *userdata)
{
@@ -433,23 +568,16 @@ void LLInventoryPanel::onIdle(void *userdata)
}
}
+const LLUUID& LLInventoryPanel::getRootFolderID() const
+{
+ return mFolderRoot->getListener()->getUUID();
+}
+
void LLInventoryPanel::initializeViews()
{
if (!gInventory.isInventoryUsable()) return;
- // Determine the root folder in case specified, and
- // build the views starting with that folder.
- const LLFolderType::EType preferred_type = LLViewerFolderType::lookupTypeFromNewCategoryName(mStartFolderString);
-
- if ("LIBRARY" == mStartFolderString)
- {
- mStartFolderID = gInventory.getLibraryRootFolderID();
- }
- else
- {
- mStartFolderID = (preferred_type != LLFolderType::FT_NONE ? gInventory.findCategoryUUIDForType(preferred_type) : LLUUID::null);
- }
- rebuildViewsFor(mStartFolderID);
+ rebuildViewsFor(getRootFolderID());
mViewsInitialized = true;
@@ -474,132 +602,159 @@ void LLInventoryPanel::initializeViews()
}
}
-void LLInventoryPanel::rebuildViewsFor(const LLUUID& id)
+LLFolderViewItem* LLInventoryPanel::rebuildViewsFor(const LLUUID& id)
{
// Destroy the old view for this ID so we can rebuild it.
LLFolderViewItem* old_view = mFolderRoot->getItemByID(id);
- if (old_view && id.notNull())
+ if (old_view)
{
old_view->destroyView();
}
- buildNewViews(id);
+ return buildNewViews(id);
}
-void LLInventoryPanel::buildNewViews(const LLUUID& id)
+LLFolderView * LLInventoryPanel::createFolderView(LLInvFVBridge * bridge, bool useLabelSuffix)
{
- LLMemType mt(LLMemType::MTYPE_INVENTORY_BUILD_NEW_VIEWS);
- LLFolderViewItem* itemp = NULL;
- LLInventoryObject* objectp = gInventory.getObject(id);
- if (objectp)
+ LLRect folder_rect(0,
+ 0,
+ getRect().getWidth(),
+ 0);
+
+ LLFolderView::Params p;
+
+ p.name = getName();
+ p.title = getLabel();
+ p.rect = folder_rect;
+ p.parent_panel = this;
+ p.tool_tip = p.name;
+ p.listener = bridge;
+ p.use_label_suffix = useLabelSuffix;
+ p.allow_multiselect = mAllowMultiSelect;
+ p.show_empty_message = mShowEmptyMessage;
+ p.show_load_status = mShowLoadStatus;
+
+ return LLUICtrlFactory::create<LLFolderView>(p);
+}
+
+LLFolderViewFolder * LLInventoryPanel::createFolderViewFolder(LLInvFVBridge * bridge)
+{
+ LLFolderViewFolder::Params params;
+
+ params.name = bridge->getDisplayName();
+ params.icon = bridge->getIcon();
+ params.icon_open = bridge->getOpenIcon();
+
+ if (mShowItemLinkOverlays) // if false, then links show up just like normal items
{
- const LLUUID &parent_id = objectp->getParentUUID();
- LLFolderViewFolder* parent_folder = (LLFolderViewFolder*)mFolderRoot->getItemByID(parent_id);
- if (id == mStartFolderID)
- {
- parent_folder = mFolderRoot;
- }
- else if ((mStartFolderID != LLUUID::null) && (!gInventory.isObjectDescendentOf(id, mStartFolderID)))
- {
- // This item exists outside the inventory's hierarchy, so don't add it.
- return;
- }
-
- if (objectp->getType() <= LLAssetType::AT_NONE ||
- objectp->getType() >= LLAssetType::AT_COUNT)
- {
- llwarns << "LLInventoryPanel::buildNewViews called with invalid objectp->mType : "
- << ((S32) objectp->getType()) << " name " << objectp->getName() << " UUID " << objectp->getUUID()
- << llendl;
- return;
- }
-
- if ((objectp->getType() == LLAssetType::AT_CATEGORY) &&
- (objectp->getActualType() != LLAssetType::AT_LINK_FOLDER))
- {
- LLInvFVBridge* new_listener = mInvFVBridgeBuilder->createBridge(objectp->getType(),
- objectp->getType(),
- LLInventoryType::IT_CATEGORY,
- this,
- mFolderRoot,
- objectp->getUUID());
- if (new_listener)
- {
- LLFolderViewFolder::Params params;
- params.name = new_listener->getDisplayName();
- params.icon = new_listener->getIcon();
- params.icon_open = new_listener->getOpenIcon();
- if (mShowItemLinkOverlays) // if false, then links show up just like normal items
- {
- params.icon_overlay = LLUI::getUIImage("Inv_Link");
- }
- params.root = mFolderRoot;
- params.listener = new_listener;
- params.tool_tip = params.name;
- LLFolderViewFolder* folderp = LLUICtrlFactory::create<LLFolderViewFolder>(params);
- folderp->setItemSortOrder(mFolderRoot->getSortOrder());
- itemp = folderp;
-
- // Hide the root folder, so we can show the contents of a folder flat
- // but still have the parent folder present for listener-related operations.
- if (id == mStartFolderID)
- {
- folderp->setHidden(TRUE);
- }
- const LLViewerInventoryCategory *cat = dynamic_cast<LLViewerInventoryCategory *>(objectp);
- if (cat && getIsHiddenFolderType(cat->getPreferredType()))
- {
- folderp->setHidden(TRUE);
- }
- }
- }
- else
- {
- // Build new view for item.
- LLInventoryItem* item = (LLInventoryItem*)objectp;
- LLInvFVBridge* new_listener = mInvFVBridgeBuilder->createBridge(item->getType(),
- item->getActualType(),
- item->getInventoryType(),
- this,
- mFolderRoot,
- item->getUUID(),
- item->getFlags());
-
- if (new_listener)
- {
- LLFolderViewItem::Params params;
- params.name = new_listener->getDisplayName();
- params.icon = new_listener->getIcon();
- params.icon_open = new_listener->getOpenIcon();
- if (mShowItemLinkOverlays) // if false, then links show up just like normal items
- {
- params.icon_overlay = LLUI::getUIImage("Inv_Link");
- }
- params.creation_date = new_listener->getCreationDate();
- params.root = mFolderRoot;
- params.listener = new_listener;
- params.rect = LLRect (0, 0, 0, 0);
- params.tool_tip = params.name;
- itemp = LLUICtrlFactory::create<LLFolderViewItem> (params);
- }
- }
+ params.icon_overlay = LLUI::getUIImage("Inv_Link");
+ }
+
+ params.root = mFolderRoot;
+ params.listener = bridge;
+ params.tool_tip = params.name;
- if (itemp)
- {
- itemp->addToFolder(parent_folder, mFolderRoot);
+ return LLUICtrlFactory::create<LLFolderViewFolder>(params);
+}
- // Don't add children of hidden folders unless this is the panel's root folder.
- if (itemp->getHidden() && (id != mStartFolderID))
- {
- return;
- }
+LLFolderViewItem * LLInventoryPanel::createFolderViewItem(LLInvFVBridge * bridge)
+{
+ LLFolderViewItem::Params params;
+
+ params.name = bridge->getDisplayName();
+ params.icon = bridge->getIcon();
+ params.icon_open = bridge->getOpenIcon();
+
+ if (mShowItemLinkOverlays) // if false, then links show up just like normal items
+ {
+ params.icon_overlay = LLUI::getUIImage("Inv_Link");
+ }
+
+ params.creation_date = bridge->getCreationDate();
+ params.root = mFolderRoot;
+ params.listener = bridge;
+ params.rect = LLRect (0, 0, 0, 0);
+ params.tool_tip = params.name;
+
+ return LLUICtrlFactory::create<LLFolderViewItem>(params);
+}
+
+LLFolderViewItem* LLInventoryPanel::buildNewViews(const LLUUID& id)
+{
+ LLInventoryObject const* objectp = gInventory.getObject(id);
+ LLUUID root_id = mFolderRoot->getListener()->getUUID();
+ LLFolderViewFolder* parent_folder = NULL;
+ LLFolderViewItem* itemp = NULL;
+
+ if (id == root_id)
+ {
+ parent_folder = mFolderRoot;
+ }
+ else if (objectp)
+ {
+ const LLUUID &parent_id = objectp->getParentUUID();
+ parent_folder = (LLFolderViewFolder*)mFolderRoot->getItemByID(parent_id);
+
+ if (parent_folder)
+ {
+ if (objectp->getType() <= LLAssetType::AT_NONE ||
+ objectp->getType() >= LLAssetType::AT_COUNT)
+ {
+ llwarns << "LLInventoryPanel::buildNewViews called with invalid objectp->mType : "
+ << ((S32) objectp->getType()) << " name " << objectp->getName() << " UUID " << objectp->getUUID()
+ << llendl;
+ return NULL;
+ }
+
+ if ((objectp->getType() == LLAssetType::AT_CATEGORY) &&
+ (objectp->getActualType() != LLAssetType::AT_LINK_FOLDER))
+ {
+ LLInvFVBridge* new_listener = mInvFVBridgeBuilder->createBridge(objectp->getType(),
+ objectp->getType(),
+ LLInventoryType::IT_CATEGORY,
+ this,
+ mFolderRoot,
+ objectp->getUUID());
+ if (new_listener)
+ {
+ LLFolderViewFolder* folderp = createFolderViewFolder(new_listener);
+ if (folderp)
+ {
+ folderp->setItemSortOrder(mFolderRoot->getSortOrder());
+ }
+ itemp = folderp;
+ }
+ }
+ else
+ {
+ // Build new view for item.
+ LLInventoryItem* item = (LLInventoryItem*)objectp;
+ LLInvFVBridge* new_listener = mInvFVBridgeBuilder->createBridge(item->getType(),
+ item->getActualType(),
+ item->getInventoryType(),
+ this,
+ mFolderRoot,
+ item->getUUID(),
+ item->getFlags());
+
+ if (new_listener)
+ {
+ itemp = createFolderViewItem(new_listener);
+ }
+ }
+
+ if (itemp)
+ {
+ itemp->addToFolder(parent_folder, mFolderRoot);
+ }
}
}
// If this is a folder, add the children of the folder and recursively add any
// child folders.
- if ((id == mStartFolderID) ||
- (objectp && objectp->getType() == LLAssetType::AT_CATEGORY))
+ if (id.isNull()
+ || (objectp
+ && objectp->getType() == LLAssetType::AT_CATEGORY))
{
LLViewerInventoryCategory::cat_array_t* categories;
LLViewerInventoryItem::item_array_t* items;
@@ -616,7 +771,7 @@ void LLInventoryPanel::buildNewViews(const LLUUID& id)
}
}
- if(items)
+ if(items && parent_folder)
{
for (LLViewerInventoryItem::item_array_t::const_iterator item_iter = items->begin();
item_iter != items->end();
@@ -628,32 +783,32 @@ void LLInventoryPanel::buildNewViews(const LLUUID& id)
}
mInventory->unlockDirectDescendentArrays(id);
}
+
+ return itemp;
}
// bit of a hack to make sure the inventory is open.
void LLInventoryPanel::openStartFolderOrMyInventory()
{
- if (mStartFolderString != "")
- {
- mFolderRoot->openFolder(mStartFolderString);
- }
- else
+ // Find My Inventory folder and open it up by name
+ for (LLView *child = mFolderRoot->getFirstChild(); child; child = mFolderRoot->findNextSibling(child))
{
- // Find My Inventory folder and open it up by name
- for (LLView *child = mFolderRoot->getFirstChild(); child; child = mFolderRoot->findNextSibling(child))
+ LLFolderViewFolder *fchild = dynamic_cast<LLFolderViewFolder*>(child);
+ if (fchild
+ && fchild->getListener()
+ && fchild->getListener()->getUUID() == gInventory.getRootFolderID())
{
- LLFolderViewFolder *fchild = dynamic_cast<LLFolderViewFolder*>(child);
- if (fchild && fchild->getListener() &&
- (fchild->getListener()->getUUID() == gInventory.getRootFolderID()))
- {
- const std::string& child_name = child->getName();
- mFolderRoot->openFolder(child_name);
- break;
- }
+ fchild->setOpen(TRUE);
+ break;
}
}
}
+void LLInventoryPanel::onItemsCompletion()
+{
+ if (mFolderRoot) mFolderRoot->updateMenu();
+}
+
void LLInventoryPanel::openSelected()
{
LLFolderViewItem* folder_item = mFolderRoot->getCurSelectedItem();
@@ -663,13 +818,19 @@ void LLInventoryPanel::openSelected()
bridge->openItem();
}
+void LLInventoryPanel::unSelectAll()
+{
+ mFolderRoot->setSelection(NULL, FALSE, FALSE);
+}
+
+
BOOL LLInventoryPanel::handleHover(S32 x, S32 y, MASK mask)
{
BOOL handled = LLView::handleHover(x, y, mask);
if(handled)
{
ECursorType cursor = getWindow()->getCursor();
- if (LLInventoryModelBackgroundFetch::instance().backgroundFetchActive() && cursor == UI_CURSOR_ARROW)
+ if (LLInventoryModelBackgroundFetch::instance().folderFetchActive() && cursor == UI_CURSOR_ARROW)
{
// replace arrow cursor with arrow and hourglass cursor
getWindow()->setCursor(UI_CURSOR_WORKING);
@@ -688,19 +849,24 @@ BOOL LLInventoryPanel::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
EAcceptance* accept,
std::string& tooltip_msg)
{
- BOOL handled = LLPanel::handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg);
+ BOOL handled = FALSE;
- // If folder view is empty the (x, y) point won't be in its rect
- // so the handler must be called explicitly.
- // but only if was not handled before. See EXT-6746.
- if (!handled && !mFolderRoot->hasVisibleChildren())
+ if (mAcceptsDragAndDrop)
{
- handled = mFolderRoot->handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg);
- }
+ handled = LLPanel::handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg);
- if (handled)
- {
- mFolderRoot->setDragAndDropThisFrame();
+ // If folder view is empty the (x, y) point won't be in its rect
+ // so the handler must be called explicitly.
+ // but only if was not handled before. See EXT-6746.
+ if (!handled && !mFolderRoot->hasVisibleChildren())
+ {
+ handled = mFolderRoot->handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg);
+ }
+
+ if (handled)
+ {
+ mFolderRoot->setDragAndDropThisFrame();
+ }
}
return handled;
@@ -725,6 +891,18 @@ void LLInventoryPanel::onFocusReceived()
LLPanel::onFocusReceived();
}
+bool LLInventoryPanel::addBadge(LLBadge * badge)
+{
+ bool badge_added = false;
+
+ if (acceptsBadge())
+ {
+ badge_added = badge->addToView(mFolderRoot);
+ }
+
+ return badge_added;
+}
+
void LLInventoryPanel::openAllFolders()
{
mFolderRoot->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_DOWN);
@@ -742,7 +920,7 @@ void LLInventoryPanel::setSelection(const LLUUID& obj_id, BOOL take_keyboard_foc
mFolderRoot->setSelectionByID(obj_id, take_keyboard_focus);
}
-void LLInventoryPanel::setSelectCallback(const LLFolderView::signal_t::slot_type& cb)
+void LLInventoryPanel::setSelectCallback(const boost::function<void (const std::deque<LLFolderViewItem*>& items, BOOL user_action)>& cb)
{
if (mFolderRoot)
{
@@ -757,6 +935,19 @@ void LLInventoryPanel::clearSelection()
void LLInventoryPanel::onSelectionChange(const std::deque<LLFolderViewItem*>& items, BOOL user_action)
{
+ // Schedule updating the folder view context menu when all selected items become complete (STORM-373).
+ mCompletionObserver->reset();
+ for (std::deque<LLFolderViewItem*>::const_iterator it = items.begin(); it != items.end(); ++it)
+ {
+ LLUUID id = (*it)->getListener()->getUUID();
+ LLViewerInventoryItem* inv_item = mInventory->getItem(id);
+
+ if (inv_item && !inv_item->isFinished())
+ {
+ mCompletionObserver->watchItem(id);
+ }
+ }
+
LLFolderView* fv = getRootFolder();
if (fv->needsAutoRename()) // auto-selecting a new user-created asset and preparing to rename
{
@@ -910,10 +1101,9 @@ void LLInventoryPanel::dumpSelectionInformation(void* user_data)
BOOL is_inventorysp_active()
{
- if (!LLSideTray::getInstance()->isPanelActive("sidepanel_inventory")) return FALSE;
- LLSidepanelInventory *inventorySP = dynamic_cast<LLSidepanelInventory *>(LLSideTray::getInstance()->getPanel("sidepanel_inventory"));
- if (!inventorySP) return FALSE;
- return inventorySP->isMainInventoryPanelActive();
+ LLSidepanelInventory *sidepanel_inventory = LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory");
+ if (!sidepanel_inventory || !sidepanel_inventory->isInVisibleChain()) return FALSE;
+ return sidepanel_inventory->isMainInventoryPanelActive();
}
// static
@@ -921,76 +1111,115 @@ LLInventoryPanel* LLInventoryPanel::getActiveInventoryPanel(BOOL auto_open)
{
S32 z_min = S32_MAX;
LLInventoryPanel* res = NULL;
- // A. If the inventory side panel is open, use that preferably.
- if (is_inventorysp_active())
- {
- LLSidepanelInventory *inventorySP = dynamic_cast<LLSidepanelInventory *>(LLSideTray::getInstance()->getPanel("sidepanel_inventory"));
- if (inventorySP)
- {
- return inventorySP->getActivePanel();
- }
- }
- // or if it is in floater undocked from sidetray get it and remember z order of floater to later compare it
- // with other inventory floaters order.
- else if (!LLSideTray::getInstance()->isTabAttached("sidebar_inventory"))
+ LLFloater* active_inv_floaterp = NULL;
+
+ LLFloater* floater_inventory = LLFloaterReg::getInstance("inventory");
+ if (!floater_inventory)
{
- LLSidepanelInventory *inventorySP =
- dynamic_cast<LLSidepanelInventory *>(LLSideTray::getInstance()->getPanel("sidepanel_inventory"));
- LLFloater* inv_floater = LLFloaterReg::findInstance("side_bar_tab", LLSD("sidebar_inventory"));
- if (inventorySP && inv_floater)
- {
- res = inventorySP->getActivePanel();
- z_min = gFloaterView->getZOrder(inv_floater);
- }
- else
- {
- llwarns << "Inventory tab is detached from sidetray, but either panel or floater were not found!" << llendl;
- }
+ llwarns << "Could not find My Inventory floater" << llendl;
+ return FALSE;
}
-
- // B. Iterate through the inventory floaters and return whichever is on top.
+
+ LLSidepanelInventory *inventory_panel = LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory");
+
+ // Iterate through the inventory floaters and return whichever is on top.
LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("inventory");
for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end(); ++iter)
{
- LLFloaterInventory* iv = dynamic_cast<LLFloaterInventory*>(*iter);
- if (iv && iv->getVisible())
+ LLFloaterSidePanelContainer* inventory_floater = dynamic_cast<LLFloaterSidePanelContainer*>(*iter);
+ inventory_panel = inventory_floater->findChild<LLSidepanelInventory>("main_panel");
+
+ if (inventory_floater && inventory_panel && inventory_floater->getVisible())
{
- S32 z_order = gFloaterView->getZOrder(iv);
+ S32 z_order = gFloaterView->getZOrder(inventory_floater);
if (z_order < z_min)
{
- res = iv->getPanel();
+ res = inventory_panel->getActivePanel();
z_min = z_order;
+ active_inv_floaterp = inventory_floater;
}
}
}
- if (res) return res;
-
- // C. If no panels are open and we don't want to force open a panel, then just abort out.
- if (!auto_open) return NULL;
-
- // D. Open the inventory side panel and use that.
- LLSD key;
- LLSidepanelInventory *sidepanel_inventory =
- dynamic_cast<LLSidepanelInventory *>(LLSideTray::getInstance()->showPanel("sidepanel_inventory", key));
- if (sidepanel_inventory)
+
+ if (res)
+ {
+ // Make sure the floater is not minimized (STORM-438).
+ if (active_inv_floaterp && active_inv_floaterp->isMinimized())
+ {
+ active_inv_floaterp->setMinimized(FALSE);
+ }
+ }
+ else if (auto_open)
{
- return sidepanel_inventory->getActivePanel();
+ floater_inventory->openFloater();
+
+ res = inventory_panel->getActivePanel();
}
- return NULL;
+ return res;
}
-void LLInventoryPanel::addHideFolderType(LLFolderType::EType folder_type)
+//static
+void LLInventoryPanel::openInventoryPanelAndSetSelection(BOOL auto_open, const LLUUID& obj_id)
{
- if (!getIsHiddenFolderType(folder_type))
+ LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel(auto_open);
+
+ if (active_panel)
{
- mHiddenFolderTypes.push_back(folder_type);
+ LL_DEBUGS("Messaging") << "Highlighting" << obj_id << LL_ENDL;
+
+ LLViewerInventoryItem * item = gInventory.getItem(obj_id);
+ LLViewerInventoryCategory * cat = gInventory.getCategory(obj_id);
+
+ bool in_inbox = false;
+
+ LLViewerInventoryCategory * parent_cat = NULL;
+
+ if (item)
+ {
+ parent_cat = gInventory.getCategory(item->getParentUUID());
+ }
+ else if (cat)
+ {
+ parent_cat = gInventory.getCategory(cat->getParentUUID());
+ }
+
+ if (parent_cat)
+ {
+ in_inbox = (LLFolderType::FT_INBOX == parent_cat->getPreferredType());
+ }
+
+ if (in_inbox)
+ {
+ LLSidepanelInventory * sidepanel_inventory = LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory");
+ LLInventoryPanel * inventory_panel = NULL;
+
+ if (in_inbox)
+ {
+ sidepanel_inventory->openInbox();
+ inventory_panel = sidepanel_inventory->getInboxPanel();
+ }
+
+ if (inventory_panel)
+ {
+ inventory_panel->setSelection(obj_id, TAKE_FOCUS_YES);
+ }
+ }
+ else
+ {
+ active_panel->setSelection(obj_id, TAKE_FOCUS_YES);
+ }
}
}
+void LLInventoryPanel::addHideFolderType(LLFolderType::EType folder_type)
+{
+ getFilter()->setFilterCategoryTypes(getFilter()->getFilterCategoryTypes() & ~(1ULL << folder_type));
+}
+
BOOL LLInventoryPanel::getIsHiddenFolderType(LLFolderType::EType folder_type) const
{
- return (std::find(mHiddenFolderTypes.begin(), mHiddenFolderTypes.end(), folder_type) != mHiddenFolderTypes.end());
+ return !(getFilter()->getFilterCategoryTypes() & (1ULL << folder_type));
}
@@ -1007,6 +1236,13 @@ public:
struct Params : public LLInitParam::Block<Params, LLInventoryPanel::Params>
{};
+ void initFromParams(const Params& p)
+ {
+ LLInventoryPanel::initFromParams(p);
+ // turn on inbox for recent items
+ getFilter()->setFilterCategoryTypes(getFilter()->getFilterCategoryTypes() | (1ULL << LLFolderType::FT_INBOX));
+ }
+
protected:
LLInventoryRecentItemsPanel (const Params&);
friend class LLUICtrlFactory;
diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h
index 6545fc0d5e..6db59afb9b 100644
--- a/indra/newview/llinventorypanel.h
+++ b/indra/newview/llinventorypanel.h
@@ -33,11 +33,13 @@
#include "llfloater.h"
#include "llinventory.h"
#include "llinventoryfilter.h"
-#include "llfolderview.h"
#include "llinventorymodel.h"
+#include "llscrollcontainer.h"
#include "lluictrlfactory.h"
#include <set>
+class LLFolderView;
+class LLFolderViewFolder;
class LLFolderViewItem;
class LLInventoryFilter;
class LLInventoryModel;
@@ -46,12 +48,12 @@ class LLInventoryFVBridgeBuilder;
class LLMenuBarGL;
class LLCheckBoxCtrl;
class LLSpinCtrl;
-class LLScrollContainer;
class LLTextBox;
class LLIconCtrl;
class LLSaveFolderState;
class LLFilterEditor;
class LLTabContainer;
+class LLInvPanelComplObserver;
class LLInventoryPanel : public LLPanel
{
@@ -82,6 +84,10 @@ public:
Optional<Filter> filter;
Optional<std::string> start_folder;
Optional<bool> use_label_suffix;
+ Optional<bool> show_empty_message;
+ Optional<bool> show_load_status;
+ Optional<LLScrollContainer::Params> scroll;
+ Optional<bool> accepts_drag_and_drop;
Params()
: sort_order_setting("sort_order_setting"),
@@ -90,7 +96,11 @@ public:
show_item_link_overlays("show_item_link_overlays", false),
filter("filter"),
start_folder("start_folder"),
- use_label_suffix("use_label_suffix", true)
+ use_label_suffix("use_label_suffix", true),
+ show_empty_message("show_empty_message", true),
+ show_load_status("show_load_status"),
+ scroll("scroll"),
+ accepts_drag_and_drop("accepts_drag_and_drop")
{}
};
@@ -119,19 +129,23 @@ public:
/*virtual*/ void onFocusLost();
/*virtual*/ void onFocusReceived();
+ // LLBadgeHolder methods
+ bool addBadge(LLBadge * badge);
+
// Call this method to set the selection.
void openAllFolders();
void setSelection(const LLUUID& obj_id, BOOL take_keyboard_focus);
- void setSelectCallback(const LLFolderView::signal_t::slot_type& cb);
+ void setSelectCallback(const boost::function<void (const std::deque<LLFolderViewItem*>& items, BOOL user_action)>& cb);
void clearSelection();
LLInventoryFilter* getFilter();
+ const LLInventoryFilter* getFilter() const;
void setFilterTypes(U64 filter, LLInventoryFilter::EFilterType = LLInventoryFilter::FILTERTYPE_OBJECT);
- U32 getFilterObjectTypes() const { return mFolderRoot->getFilterObjectTypes(); }
+ U32 getFilterObjectTypes() const;
void setFilterPermMask(PermissionMask filter_perm_mask);
- U32 getFilterPermMask() const { return mFolderRoot->getFilterPermissions(); }
+ U32 getFilterPermMask() const;
void setFilterWearableTypes(U64 filter);
void setFilterSubString(const std::string& string);
- const std::string getFilterSubString() { return mFolderRoot->getFilterSubString(); }
+ const std::string getFilterSubString();
void setSinceLogoff(BOOL sl);
void setHoursAgo(U32 hours);
BOOL getSinceLogoff();
@@ -139,14 +153,15 @@ public:
void setShowFolderState(LLInventoryFilter::EFolderShow show);
LLInventoryFilter::EFolderShow getShowFolderState();
- void setAllowMultiSelect(BOOL allow) { mFolderRoot->setAllowMultiSelect(allow); }
// This method is called when something has changed about the inventory.
void modelChanged(U32 mask);
- LLFolderView* getRootFolder() { return mFolderRoot; }
+ LLFolderView* getRootFolder();
LLScrollContainer* getScrollableContainer() { return mScroller; }
void onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action);
+ LLHandle<LLInventoryPanel> getInventoryPanelHandle() const { return getDerivedHandle<LLInventoryPanel>(); }
+
// Callbacks
void doToSelected(const LLSD& userdata);
void doCreate(const LLSD& userdata);
@@ -157,21 +172,28 @@ public:
static void dumpSelectionInformation(void* user_data);
void openSelected();
- void unSelectAll() { mFolderRoot->setSelection(NULL, FALSE, FALSE); }
+ void unSelectAll();
static void onIdle(void* user_data);
// Find whichever inventory panel is active / on top.
// "Auto_open" determines if we open an inventory panel if none are open.
static LLInventoryPanel *getActiveInventoryPanel(BOOL auto_open = TRUE);
+
+ static void openInventoryPanelAndSetSelection(BOOL auto_open, const LLUUID& obj_id);
protected:
void openStartFolderOrMyInventory(); // open the first level of inventory
+ void onItemsCompletion(); // called when selected items are complete
LLInventoryModel* mInventory;
LLInventoryObserver* mInventoryObserver;
+ LLInvPanelComplObserver* mCompletionObserver;
+ BOOL mAcceptsDragAndDrop;
BOOL mAllowMultiSelect;
BOOL mShowItemLinkOverlays; // Shows link graphic over inventory item icons
+ BOOL mShowEmptyMessage;
+ BOOL mShowLoadStatus;
LLFolderView* mFolderRoot;
LLScrollContainer* mScroller;
@@ -195,38 +217,39 @@ public:
static const std::string INHERIT_SORT_ORDER;
void setSortOrder(U32 order);
- U32 getSortOrder() const { return mFolderRoot->getSortOrder(); }
+ U32 getSortOrder() const;
+ void requestSort();
+
private:
std::string mSortOrderSetting;
+ int mClipboardState;
//--------------------------------------------------------------------
// Hidden folders
//--------------------------------------------------------------------
public:
void addHideFolderType(LLFolderType::EType folder_type);
-protected:
- BOOL getIsHiddenFolderType(LLFolderType::EType folder_type) const;
-private:
- std::vector<LLFolderType::EType> mHiddenFolderTypes;
- //--------------------------------------------------------------------
- // Initialization routines for building up the UI ("views")
- //--------------------------------------------------------------------
public:
BOOL getIsViewsInitialized() const { return mViewsInitialized; }
- const LLUUID& getStartFolderID() const { return mStartFolderID; }
- const std::string& getStartFolderString() { return mStartFolderString; }
+ const LLUUID& getRootFolderID() const;
protected:
// Builds the UI. Call this once the inventory is usable.
void initializeViews();
- void rebuildViewsFor(const LLUUID& id); // Given the id and the parent, build all of the folder views.
- virtual void buildNewViews(const LLUUID& id);
+ LLFolderViewItem* rebuildViewsFor(const LLUUID& id); // Given the id and the parent, build all of the folder views.
+
+ virtual void buildFolderView(const LLInventoryPanel::Params& params);
+ LLFolderViewItem* buildNewViews(const LLUUID& id);
+ BOOL getIsHiddenFolderType(LLFolderType::EType folder_type) const;
+
+ virtual LLFolderView* createFolderView(LLInvFVBridge * bridge, bool useLabelSuffix);
+ virtual LLFolderViewFolder* createFolderViewFolder(LLInvFVBridge * bridge);
+ virtual LLFolderViewItem* createFolderViewItem(LLInvFVBridge * bridge);
private:
BOOL mBuildDefaultHierarchy; // default inventory hierarchy should be created in postBuild()
BOOL mViewsInitialized; // Views have been generated
// UUID of category from which hierarchy should be built. Set with the
// "start_folder" xml property. Default is LLUUID::null that means total Inventory hierarchy.
- std::string mStartFolderString;
LLUUID mStartFolderID;
};
diff --git a/indra/newview/lljoystickbutton.h b/indra/newview/lljoystickbutton.h
index 93e2e7128b..8d76aa9531 100644
--- a/indra/newview/lljoystickbutton.h
+++ b/indra/newview/lljoystickbutton.h
@@ -57,7 +57,7 @@ public:
Params()
: quadrant("quadrant", JQ_ORIGIN)
{
- label = "";
+ changeDefault(label, "");
}
};
LLJoystick(const Params&);
@@ -137,7 +137,7 @@ public:
{
Params()
{
- held_down_delay.seconds(0.0);
+ changeDefault(held_down_delay.seconds, 0.0);
}
};
diff --git a/indra/newview/lllandmarkactions.cpp b/indra/newview/lllandmarkactions.cpp
index f2aec20611..6625a194fb 100644
--- a/indra/newview/lllandmarkactions.cpp
+++ b/indra/newview/lllandmarkactions.cpp
@@ -413,7 +413,7 @@ void LLLandmarkActions::copySLURLtoClipboard(const LLUUID& landmarkInventoryItem
void copy_slurl_to_clipboard_callback(const std::string& slurl)
{
- gViewerWindow->mWindow->copyTextToClipboard(utf8str_to_wstring(slurl));
+ gViewerWindow->getWindow()->copyTextToClipboard(utf8str_to_wstring(slurl));
LLSD args;
args["SLURL"] = slurl;
LLNotificationsUtil::add("CopySLURL", args);
diff --git a/indra/newview/lllistcontextmenu.cpp b/indra/newview/lllistcontextmenu.cpp
index ea744072d2..6421ab42bf 100644
--- a/indra/newview/lllistcontextmenu.cpp
+++ b/indra/newview/lllistcontextmenu.cpp
@@ -36,7 +36,6 @@
#include "llviewermenu.h" // for LLViewerMenuHolderGL
LLListContextMenu::LLListContextMenu()
-: mMenu(NULL)
{
}
@@ -51,23 +50,22 @@ LLListContextMenu::~LLListContextMenu()
// of mMenu has already been deleted except of using LLHandle. EXT-4762.
if (!mMenuHandle.isDead())
{
- mMenu->die();
- mMenu = NULL;
+ mMenuHandle.get()->die();
}
}
void LLListContextMenu::show(LLView* spawning_view, const uuid_vec_t& uuids, S32 x, S32 y)
{
- if (mMenu)
+ LLContextMenu* menup = mMenuHandle.get();
+ if (menup)
{
//preventing parent (menu holder) from deleting already "dead" context menus on exit
- LLView* parent = mMenu->getParent();
+ LLView* parent = menup->getParent();
if (parent)
{
- parent->removeChild(mMenu);
+ parent->removeChild(menup);
}
- delete mMenu;
- mMenu = NULL;
+ delete menup;
mUUIDs.clear();
}
@@ -79,23 +77,23 @@ void LLListContextMenu::show(LLView* spawning_view, const uuid_vec_t& uuids, S32
mUUIDs.resize(uuids.size());
std::copy(uuids.begin(), uuids.end(), mUUIDs.begin());
- mMenu = createMenu();
- if (!mMenu)
+ menup = createMenu();
+ if (!menup)
{
llwarns << "Context menu creation failed" << llendl;
return;
}
- mMenuHandle = mMenu->getHandle();
- mMenu->show(x, y);
- LLMenuGL::showPopup(spawning_view, mMenu, x, y);
+ mMenuHandle = menup->getHandle();
+ menup->show(x, y);
+ LLMenuGL::showPopup(spawning_view, menup, x, y);
}
void LLListContextMenu::hide()
{
- if(mMenu)
+ if(mMenuHandle.get())
{
- mMenu->hide();
+ mMenuHandle.get()->hide();
}
}
diff --git a/indra/newview/lllistcontextmenu.h b/indra/newview/lllistcontextmenu.h
index 5dedc30b0c..fabd68ee20 100644
--- a/indra/newview/lllistcontextmenu.h
+++ b/indra/newview/lllistcontextmenu.h
@@ -71,8 +71,7 @@ protected:
static void handleMultiple(functor_t functor, const uuid_vec_t& ids);
uuid_vec_t mUUIDs;
- LLContextMenu* mMenu;
- LLHandle<LLView> mMenuHandle;
+ LLHandle<LLContextMenu> mMenuHandle;
};
#endif // LL_LLLISTCONTEXTMENU_H
diff --git a/indra/newview/lllocalbitmaps.cpp b/indra/newview/lllocalbitmaps.cpp
new file mode 100644
index 0000000000..459e52c4f4
--- /dev/null
+++ b/indra/newview/lllocalbitmaps.cpp
@@ -0,0 +1,942 @@
+/**
+ * @file lllocalbitmaps.cpp
+ * @author Vaalith Jinn
+ * @brief Local Bitmaps source
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+/* precompiled headers */
+#include "llviewerprecompiledheaders.h"
+
+/* own header */
+#include "lllocalbitmaps.h"
+
+/* boost: will not compile unless equivalent is undef'd, beware. */
+#ifdef equivalent
+#undef equivalent
+#endif
+#include <boost/filesystem.hpp>
+
+/* image compression headers. */
+#include "llimagebmp.h"
+#include "llimagetga.h"
+#include "llimagejpeg.h"
+#include "llimagepng.h"
+
+/* time headers */
+#include <time.h>
+#include <ctime>
+
+/* misc headers */
+#include "llscrolllistctrl.h"
+#include "llfilepicker.h"
+#include "llviewertexturelist.h"
+#include "llviewerobjectlist.h"
+#include "llviewerobject.h"
+#include "llface.h"
+#include "llvoavatarself.h"
+#include "llwearable.h"
+#include "llagentwearables.h"
+#include "lltexlayerparams.h"
+#include "llvovolume.h"
+#include "llnotificationsutil.h"
+
+/*=======================================*/
+/* Formal declarations, constants, etc. */
+/*=======================================*/
+std::list<LLLocalBitmap*> LLLocalBitmapMgr::sBitmapList;
+LLLocalBitmapTimer LLLocalBitmapMgr::sTimer;
+bool LLLocalBitmapMgr::sNeedsRebake;
+
+static const F32 LL_LOCAL_TIMER_HEARTBEAT = 3.0;
+static const BOOL LL_LOCAL_USE_MIPMAPS = true;
+static const S32 LL_LOCAL_DISCARD_LEVEL = 0;
+static const U32 LL_LOCAL_TEXLAYER_FOR_IDX = 0;
+static const bool LL_LOCAL_SLAM_FOR_DEBUG = true;
+static const bool LL_LOCAL_REPLACE_ON_DEL = true;
+static const S32 LL_LOCAL_UPDATE_RETRIES = 5;
+
+/*=======================================*/
+/* LLLocalBitmap: unit class */
+/*=======================================*/
+LLLocalBitmap::LLLocalBitmap(std::string filename)
+ : mFilename(filename)
+ , mShortName(gDirUtilp->getBaseFileName(filename, true))
+ , mValid(false)
+ , mLastModified()
+ , mLinkStatus(LS_ON)
+ , mUpdateRetries(LL_LOCAL_UPDATE_RETRIES)
+{
+ mTrackingID.generate();
+
+ /* extension */
+ std::string temp_exten = gDirUtilp->getExtension(mFilename);
+
+ if (temp_exten == "bmp")
+ {
+ mExtension = ET_IMG_BMP;
+ }
+ else if (temp_exten == "tga")
+ {
+ mExtension = ET_IMG_TGA;
+ }
+ else if (temp_exten == "jpg" || temp_exten == "jpeg")
+ {
+ mExtension = ET_IMG_JPG;
+ }
+ else if (temp_exten == "png")
+ {
+ mExtension = ET_IMG_PNG;
+ }
+ else
+ {
+ llwarns << "File of no valid extension given, local bitmap creation aborted." << "\n"
+ << "Filename: " << mFilename << llendl;
+ return; // no valid extension.
+ }
+
+ /* next phase of unit creation is nearly the same as an update cycle.
+ we're running updateSelf as a special case with the optional UT_FIRSTUSE
+ which omits the parts associated with removing the outdated texture */
+ mValid = updateSelf(UT_FIRSTUSE);
+}
+
+LLLocalBitmap::~LLLocalBitmap()
+{
+ // replace IDs with defaults, if set to do so.
+ if(LL_LOCAL_REPLACE_ON_DEL && mValid) // fix for STORM-1837
+ {
+ replaceIDs(mWorldID, IMG_DEFAULT);
+ LLLocalBitmapMgr::doRebake();
+ }
+
+ // delete self from gimagelist
+ LLViewerFetchedTexture* image = gTextureList.findImage(mWorldID);
+ gTextureList.deleteImage(image);
+
+ if (image)
+ {
+ image->unref();
+ }
+}
+
+/* accessors */
+std::string LLLocalBitmap::getFilename()
+{
+ return mFilename;
+}
+
+std::string LLLocalBitmap::getShortName()
+{
+ return mShortName;
+}
+
+LLUUID LLLocalBitmap::getTrackingID()
+{
+ return mTrackingID;
+}
+
+LLUUID LLLocalBitmap::getWorldID()
+{
+ return mWorldID;
+}
+
+bool LLLocalBitmap::getValid()
+{
+ return mValid;
+}
+
+/* update functions */
+bool LLLocalBitmap::updateSelf(EUpdateType optional_firstupdate)
+{
+ bool updated = false;
+
+ if (mLinkStatus == LS_ON)
+ {
+ // verifying that the file exists
+ if (gDirUtilp->fileExists(mFilename))
+ {
+ // verifying that the file has indeed been modified
+ const std::time_t temp_time = boost::filesystem::last_write_time(boost::filesystem::path(mFilename));
+ LLSD new_last_modified = asctime(localtime(&temp_time));
+
+ if (mLastModified.asString() != new_last_modified.asString())
+ {
+ /* loading the image file and decoding it, here is a critical point which,
+ if fails, invalidates the whole update (or unit creation) process. */
+ LLPointer<LLImageRaw> raw_image = new LLImageRaw();
+ if (decodeBitmap(raw_image))
+ {
+ // decode is successful, we can safely proceed.
+ LLUUID old_id = LLUUID::null;
+ if (!(optional_firstupdate == UT_FIRSTUSE) && !mWorldID.isNull())
+ {
+ old_id = mWorldID;
+ }
+ mWorldID.generate();
+ mLastModified = new_last_modified;
+
+ LLPointer<LLViewerFetchedTexture> texture = new LLViewerFetchedTexture
+ ("file://"+mFilename, mWorldID, LL_LOCAL_USE_MIPMAPS);
+
+ texture->createGLTexture(LL_LOCAL_DISCARD_LEVEL, raw_image);
+ texture->setCachedRawImage(LL_LOCAL_DISCARD_LEVEL, raw_image);
+ texture->ref();
+
+ gTextureList.addImage(texture);
+
+ if (!optional_firstupdate == UT_FIRSTUSE)
+ {
+ // seek out everything old_id uses and replace it with mWorldID
+ replaceIDs(old_id, mWorldID);
+
+ // remove old_id from gimagelist
+ LLViewerFetchedTexture* image = gTextureList.findImage(old_id);
+ gTextureList.deleteImage(image);
+ image->unref();
+ }
+
+ mUpdateRetries = LL_LOCAL_UPDATE_RETRIES;
+ updated = true;
+ }
+
+ // if decoding failed, we get here and it will attempt to decode it in the next cycles
+ // until mUpdateRetries runs out. this is done because some software lock the bitmap while writing to it
+ else
+ {
+ if (mUpdateRetries)
+ {
+ mUpdateRetries--;
+ }
+ else
+ {
+ llwarns << "During the update process the following file was found" << "\n"
+ << "but could not be opened or decoded for " << LL_LOCAL_UPDATE_RETRIES << " attempts." << "\n"
+ << "Filename: " << mFilename << "\n"
+ << "Disabling further update attempts for this file." << llendl;
+
+ LLSD notif_args;
+ notif_args["FNAME"] = mFilename;
+ notif_args["NRETRIES"] = LL_LOCAL_UPDATE_RETRIES;
+ LLNotificationsUtil::add("LocalBitmapsUpdateFailedFinal", notif_args);
+
+ mLinkStatus = LS_BROKEN;
+ }
+ }
+ }
+
+ } // end if file exists
+
+ else
+ {
+ llwarns << "During the update process, the following file was not found." << "\n"
+ << "Filename: " << mFilename << "\n"
+ << "Disabling further update attempts for this file." << llendl;
+
+ LLSD notif_args;
+ notif_args["FNAME"] = mFilename;
+ LLNotificationsUtil::add("LocalBitmapsUpdateFileNotFound", notif_args);
+
+ mLinkStatus = LS_BROKEN;
+ }
+ }
+
+ return updated;
+}
+
+bool LLLocalBitmap::decodeBitmap(LLPointer<LLImageRaw> rawimg)
+{
+ bool decode_successful = false;
+
+ switch (mExtension)
+ {
+ case ET_IMG_BMP:
+ {
+ LLPointer<LLImageBMP> bmp_image = new LLImageBMP;
+ if (bmp_image->load(mFilename) && bmp_image->decode(rawimg, 0.0f))
+ {
+ rawimg->biasedScaleToPowerOfTwo(LLViewerFetchedTexture::MAX_IMAGE_SIZE_DEFAULT);
+ decode_successful = true;
+ }
+ break;
+ }
+
+ case ET_IMG_TGA:
+ {
+ LLPointer<LLImageTGA> tga_image = new LLImageTGA;
+ if ((tga_image->load(mFilename) && tga_image->decode(rawimg))
+ && ((tga_image->getComponents() == 3) || (tga_image->getComponents() == 4)))
+ {
+ rawimg->biasedScaleToPowerOfTwo(LLViewerFetchedTexture::MAX_IMAGE_SIZE_DEFAULT);
+ decode_successful = true;
+ }
+ break;
+ }
+
+ case ET_IMG_JPG:
+ {
+ LLPointer<LLImageJPEG> jpeg_image = new LLImageJPEG;
+ if (jpeg_image->load(mFilename) && jpeg_image->decode(rawimg, 0.0f))
+ {
+ rawimg->biasedScaleToPowerOfTwo(LLViewerFetchedTexture::MAX_IMAGE_SIZE_DEFAULT);
+ decode_successful = true;
+ }
+ break;
+ }
+
+ case ET_IMG_PNG:
+ {
+ LLPointer<LLImagePNG> png_image = new LLImagePNG;
+ if (png_image->load(mFilename) && png_image->decode(rawimg, 0.0f))
+ {
+ rawimg->biasedScaleToPowerOfTwo(LLViewerFetchedTexture::MAX_IMAGE_SIZE_DEFAULT);
+ decode_successful = true;
+ }
+ break;
+ }
+
+ default:
+ {
+ // separating this into -several- llwarns calls because in the extremely unlikely case that this happens
+ // accessing mFilename and any other object properties might very well crash the viewer.
+ // getting here should be impossible, or there's been a pretty serious bug.
+
+ llwarns << "During a decode attempt, the following local bitmap had no properly assigned extension." << llendl;
+ llwarns << "Filename: " << mFilename << llendl;
+ llwarns << "Disabling further update attempts for this file." << llendl;
+ mLinkStatus = LS_BROKEN;
+ }
+ }
+
+ return decode_successful;
+}
+
+void LLLocalBitmap::replaceIDs(LLUUID old_id, LLUUID new_id)
+{
+ // checking for misuse.
+ if (old_id == new_id)
+ {
+ llinfos << "An attempt was made to replace a texture with itself. (matching UUIDs)" << "\n"
+ << "Texture UUID: " << old_id.asString() << llendl;
+ return;
+ }
+
+ updateUserPrims(old_id, new_id);
+ updateUserSculpts(old_id, new_id); // isn't there supposed to be an IMG_DEFAULT_SCULPT or something?
+
+ // default safeguard image for layers
+ if( new_id == IMG_DEFAULT )
+ {
+ new_id = IMG_DEFAULT_AVATAR;
+ }
+
+ /* It doesn't actually update all of those, it merely checks if any of them
+ contain the referenced ID and if so, updates. */
+ updateUserLayers(old_id, new_id, LLWearableType::WT_ALPHA);
+ updateUserLayers(old_id, new_id, LLWearableType::WT_EYES);
+ updateUserLayers(old_id, new_id, LLWearableType::WT_GLOVES);
+ updateUserLayers(old_id, new_id, LLWearableType::WT_JACKET);
+ updateUserLayers(old_id, new_id, LLWearableType::WT_PANTS);
+ updateUserLayers(old_id, new_id, LLWearableType::WT_SHIRT);
+ updateUserLayers(old_id, new_id, LLWearableType::WT_SHOES);
+ updateUserLayers(old_id, new_id, LLWearableType::WT_SKIN);
+ updateUserLayers(old_id, new_id, LLWearableType::WT_SKIRT);
+ updateUserLayers(old_id, new_id, LLWearableType::WT_SOCKS);
+ updateUserLayers(old_id, new_id, LLWearableType::WT_TATTOO);
+ updateUserLayers(old_id, new_id, LLWearableType::WT_UNDERPANTS);
+ updateUserLayers(old_id, new_id, LLWearableType::WT_UNDERSHIRT);
+}
+
+// this function sorts the faces from a getFaceList[getNumFaces] into a list of objects
+// in order to prevent multiple sendTEUpdate calls per object during updateUserPrims
+std::vector<LLViewerObject*> LLLocalBitmap::prepUpdateObjects(LLUUID old_id)
+{
+ std::vector<LLViewerObject*> obj_list;
+ LLViewerFetchedTexture* old_texture = gTextureList.findImage(old_id);
+
+ for(U32 face_iterator = 0; face_iterator < old_texture->getNumFaces(); face_iterator++)
+ {
+ // getting an object from a face
+ LLFace* face_to_object = (*old_texture->getFaceList())[face_iterator];
+
+ if(face_to_object)
+ {
+ LLViewerObject* affected_object = face_to_object->getViewerObject();
+
+ if(affected_object)
+ {
+
+ // we have an object, we'll take it's UUID and compare it to
+ // whatever we already have in the returnable object list.
+ // if there is a match - we do not add (to prevent duplicates)
+ LLUUID mainlist_obj_id = affected_object->getID();
+ bool add_object = true;
+
+ // begin looking for duplicates
+ std::vector<LLViewerObject*>::iterator objlist_iter = obj_list.begin();
+ for(; (objlist_iter != obj_list.end()) && add_object; objlist_iter++)
+ {
+ LLViewerObject* obj = *objlist_iter;
+ if (obj->getID() == mainlist_obj_id)
+ {
+ add_object = false; // duplicate found.
+ }
+ }
+ // end looking for duplicates
+
+ if(add_object)
+ {
+ obj_list.push_back(affected_object);
+ }
+
+ }
+
+ }
+
+ } // end of face-iterating for()
+
+ return obj_list;
+}
+
+void LLLocalBitmap::updateUserPrims(LLUUID old_id, LLUUID new_id)
+{
+ std::vector<LLViewerObject*> objectlist = prepUpdateObjects(old_id);
+
+ for(std::vector<LLViewerObject*>::iterator object_iterator = objectlist.begin();
+ object_iterator != objectlist.end(); object_iterator++)
+ {
+ LLViewerObject* object = *object_iterator;
+
+ if(object)
+ {
+ bool update_obj = false;
+ S32 num_faces = object->getNumFaces();
+
+ for (U8 face_iter = 0; face_iter < num_faces; face_iter++)
+ {
+ if (object->mDrawable)
+ {
+ LLFace* face = object->mDrawable->getFace(face_iter);
+ if (face && face->getTexture() && face->getTexture()->getID() == old_id)
+ {
+ object->setTEImage(face_iter, LLViewerTextureManager::getFetchedTexture
+ (new_id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE));
+
+ update_obj = true;
+ }
+ }
+ }
+
+ if (update_obj)
+ {
+ object->sendTEUpdate();
+ }
+ }
+ }
+
+}
+
+void LLLocalBitmap::updateUserSculpts(LLUUID old_id, LLUUID new_id)
+{
+ LLViewerFetchedTexture* old_texture = gTextureList.findImage(old_id);
+ for(U32 volume_iter = 0; volume_iter < old_texture->getNumVolumes(); volume_iter++)
+ {
+ LLVOVolume* volume_to_object = (*old_texture->getVolumeList())[volume_iter];
+ LLViewerObject* object = (LLViewerObject*)volume_to_object;
+
+ if(object)
+ {
+ if (object->isSculpted() && object->getVolume() &&
+ object->getVolume()->getParams().getSculptID() == old_id)
+ {
+ LLSculptParams* old_params = (LLSculptParams*)object->getParameterEntry(LLNetworkData::PARAMS_SCULPT);
+ LLSculptParams new_params(*old_params);
+ new_params.setSculptTexture(new_id);
+ object->setParameterEntry(LLNetworkData::PARAMS_SCULPT, new_params, TRUE);
+ }
+ }
+ }
+}
+
+void LLLocalBitmap::updateUserLayers(LLUUID old_id, LLUUID new_id, LLWearableType::EType type)
+{
+ U32 count = gAgentWearables.getWearableCount(type);
+ for(U32 wearable_iter = 0; wearable_iter < count; wearable_iter++)
+ {
+ LLWearable* wearable = gAgentWearables.getWearable(type, wearable_iter);
+ if (wearable)
+ {
+ std::vector<LLLocalTextureObject*> texture_list = wearable->getLocalTextureListSeq();
+ for(std::vector<LLLocalTextureObject*>::iterator texture_iter = texture_list.begin();
+ texture_iter != texture_list.end(); texture_iter++)
+ {
+ LLLocalTextureObject* lto = *texture_iter;
+
+ if (lto && lto->getID() == old_id)
+ {
+ U32 local_texlayer_index = 0; /* can't keep that as static const, gives errors, so i'm leaving this var here */
+ LLVOAvatarDefines::EBakedTextureIndex baked_texind =
+ lto->getTexLayer(local_texlayer_index)->getTexLayerSet()->getBakedTexIndex();
+
+ LLVOAvatarDefines::ETextureIndex reg_texind = getTexIndex(type, baked_texind);
+ if (reg_texind != LLVOAvatarDefines::TEX_NUM_INDICES)
+ {
+ U32 index = gAgentWearables.getWearableIndex(wearable);
+ gAgentAvatarp->setLocalTexture(reg_texind, gTextureList.getImage(new_id), FALSE, index);
+ gAgentAvatarp->wearableUpdated(type, FALSE);
+
+ /* telling the manager to rebake once update cycle is fully done */
+ LLLocalBitmapMgr::setNeedsRebake();
+ }
+
+ }
+ }
+ }
+ }
+}
+
+LLVOAvatarDefines::ETextureIndex LLLocalBitmap::getTexIndex(
+ LLWearableType::EType type, LLVOAvatarDefines::EBakedTextureIndex baked_texind)
+{
+ LLVOAvatarDefines::ETextureIndex result = LLVOAvatarDefines::TEX_NUM_INDICES; // using as a default/fail return.
+
+ switch(type)
+ {
+ case LLWearableType::WT_ALPHA:
+ {
+ switch(baked_texind)
+ {
+ case LLVOAvatarDefines::BAKED_EYES:
+ {
+ result = LLVOAvatarDefines::TEX_EYES_ALPHA;
+ break;
+ }
+
+ case LLVOAvatarDefines::BAKED_HAIR:
+ {
+ result = LLVOAvatarDefines::TEX_HAIR_ALPHA;
+ break;
+ }
+
+ case LLVOAvatarDefines::BAKED_HEAD:
+ {
+ result = LLVOAvatarDefines::TEX_HEAD_ALPHA;
+ break;
+ }
+
+ case LLVOAvatarDefines::BAKED_LOWER:
+ {
+ result = LLVOAvatarDefines::TEX_LOWER_ALPHA;
+ break;
+ }
+ case LLVOAvatarDefines::BAKED_UPPER:
+ {
+ result = LLVOAvatarDefines::TEX_UPPER_ALPHA;
+ break;
+ }
+
+ default:
+ {
+ break;
+ }
+
+ }
+ break;
+
+ }
+
+ case LLWearableType::WT_EYES:
+ {
+ if (baked_texind == LLVOAvatarDefines::BAKED_EYES)
+ {
+ result = LLVOAvatarDefines::TEX_EYES_IRIS;
+ }
+
+ break;
+ }
+
+ case LLWearableType::WT_GLOVES:
+ {
+ if (baked_texind == LLVOAvatarDefines::BAKED_UPPER)
+ {
+ result = LLVOAvatarDefines::TEX_UPPER_GLOVES;
+ }
+
+ break;
+ }
+
+ case LLWearableType::WT_JACKET:
+ {
+ if (baked_texind == LLVOAvatarDefines::BAKED_LOWER)
+ {
+ result = LLVOAvatarDefines::TEX_LOWER_JACKET;
+ }
+ else if (baked_texind == LLVOAvatarDefines::BAKED_UPPER)
+ {
+ result = LLVOAvatarDefines::TEX_UPPER_JACKET;
+ }
+
+ break;
+ }
+
+ case LLWearableType::WT_PANTS:
+ {
+ if (baked_texind == LLVOAvatarDefines::BAKED_LOWER)
+ {
+ result = LLVOAvatarDefines::TEX_LOWER_PANTS;
+ }
+
+ break;
+ }
+
+ case LLWearableType::WT_SHIRT:
+ {
+ if (baked_texind == LLVOAvatarDefines::BAKED_UPPER)
+ {
+ result = LLVOAvatarDefines::TEX_UPPER_SHIRT;
+ }
+
+ break;
+ }
+
+ case LLWearableType::WT_SHOES:
+ {
+ if (baked_texind == LLVOAvatarDefines::BAKED_LOWER)
+ {
+ result = LLVOAvatarDefines::TEX_LOWER_SHOES;
+ }
+
+ break;
+ }
+
+ case LLWearableType::WT_SKIN:
+ {
+ switch(baked_texind)
+ {
+ case LLVOAvatarDefines::BAKED_HEAD:
+ {
+ result = LLVOAvatarDefines::TEX_HEAD_BODYPAINT;
+ break;
+ }
+
+ case LLVOAvatarDefines::BAKED_LOWER:
+ {
+ result = LLVOAvatarDefines::TEX_LOWER_BODYPAINT;
+ break;
+ }
+ case LLVOAvatarDefines::BAKED_UPPER:
+ {
+ result = LLVOAvatarDefines::TEX_UPPER_BODYPAINT;
+ break;
+ }
+
+ default:
+ {
+ break;
+ }
+
+ }
+ break;
+ }
+
+ case LLWearableType::WT_SKIRT:
+ {
+ if (baked_texind == LLVOAvatarDefines::BAKED_SKIRT)
+ {
+ result = LLVOAvatarDefines::TEX_SKIRT;
+ }
+
+ break;
+ }
+
+ case LLWearableType::WT_SOCKS:
+ {
+ if (baked_texind == LLVOAvatarDefines::BAKED_LOWER)
+ {
+ result = LLVOAvatarDefines::TEX_LOWER_SOCKS;
+ }
+
+ break;
+ }
+
+ case LLWearableType::WT_TATTOO:
+ {
+ switch(baked_texind)
+ {
+ case LLVOAvatarDefines::BAKED_HEAD:
+ {
+ result = LLVOAvatarDefines::TEX_HEAD_TATTOO;
+ break;
+ }
+
+ case LLVOAvatarDefines::BAKED_LOWER:
+ {
+ result = LLVOAvatarDefines::TEX_LOWER_TATTOO;
+ break;
+ }
+ case LLVOAvatarDefines::BAKED_UPPER:
+ {
+ result = LLVOAvatarDefines::TEX_UPPER_TATTOO;
+ break;
+ }
+
+ default:
+ {
+ break;
+ }
+
+ }
+ break;
+ }
+
+ case LLWearableType::WT_UNDERPANTS:
+ {
+ if (baked_texind == LLVOAvatarDefines::BAKED_LOWER)
+ {
+ result = LLVOAvatarDefines::TEX_LOWER_UNDERPANTS;
+ }
+
+ break;
+ }
+
+ case LLWearableType::WT_UNDERSHIRT:
+ {
+ if (baked_texind == LLVOAvatarDefines::BAKED_UPPER)
+ {
+ result = LLVOAvatarDefines::TEX_UPPER_UNDERSHIRT;
+ }
+
+ break;
+ }
+
+ default:
+ {
+ llwarns << "Unknown wearable type: " << (int)type << "\n"
+ << "Baked Texture Index: " << (int)baked_texind << "\n"
+ << "Filename: " << mFilename << "\n"
+ << "TrackingID: " << mTrackingID << "\n"
+ << "InworldID: " << mWorldID << llendl;
+ }
+
+ }
+ return result;
+}
+
+/*=======================================*/
+/* LLLocalBitmapTimer: timer class */
+/*=======================================*/
+LLLocalBitmapTimer::LLLocalBitmapTimer() : LLEventTimer(LL_LOCAL_TIMER_HEARTBEAT)
+{
+}
+
+LLLocalBitmapTimer::~LLLocalBitmapTimer()
+{
+}
+
+void LLLocalBitmapTimer::startTimer()
+{
+ mEventTimer.start();
+}
+
+void LLLocalBitmapTimer::stopTimer()
+{
+ mEventTimer.stop();
+}
+
+bool LLLocalBitmapTimer::isRunning()
+{
+ return mEventTimer.getStarted();
+}
+
+BOOL LLLocalBitmapTimer::tick()
+{
+ LLLocalBitmapMgr::doUpdates();
+ return FALSE;
+}
+
+/*=======================================*/
+/* LLLocalBitmapMgr: manager class */
+/*=======================================*/
+LLLocalBitmapMgr::LLLocalBitmapMgr()
+{
+ // The class is all made of static members, should i even bother instantiating?
+}
+
+LLLocalBitmapMgr::~LLLocalBitmapMgr()
+{
+}
+
+bool LLLocalBitmapMgr::addUnit()
+{
+ bool add_successful = false;
+
+ LLFilePicker& picker = LLFilePicker::instance();
+ if (picker.getMultipleOpenFiles(LLFilePicker::FFLOAD_IMAGE))
+ {
+ sTimer.stopTimer();
+
+ std::string filename = picker.getFirstFile();
+ while(!filename.empty())
+ {
+ LLLocalBitmap* unit = new LLLocalBitmap(filename);
+
+ if (unit->getValid())
+ {
+ sBitmapList.push_back(unit);
+ add_successful = true;
+ }
+ else
+ {
+ llwarns << "Attempted to add invalid or unreadable image file, attempt cancelled.\n"
+ << "Filename: " << filename << llendl;
+
+ LLSD notif_args;
+ notif_args["FNAME"] = filename;
+ LLNotificationsUtil::add("LocalBitmapsVerifyFail", notif_args);
+
+ delete unit;
+ unit = NULL;
+ }
+
+ filename = picker.getNextFile();
+ }
+
+ sTimer.startTimer();
+ }
+
+ return add_successful;
+}
+
+void LLLocalBitmapMgr::delUnit(LLUUID tracking_id)
+{
+ if (!sBitmapList.empty())
+ {
+ std::vector<LLLocalBitmap*> to_delete;
+ for (local_list_iter iter = sBitmapList.begin(); iter != sBitmapList.end(); iter++)
+ { /* finding which ones we want deleted and making a separate list */
+ LLLocalBitmap* unit = *iter;
+ if (unit->getTrackingID() == tracking_id)
+ {
+ to_delete.push_back(unit);
+ }
+ }
+
+ for(std::vector<LLLocalBitmap*>::iterator del_iter = to_delete.begin();
+ del_iter != to_delete.end(); del_iter++)
+ { /* iterating over a temporary list, hence preserving the iterator validity while deleting. */
+ LLLocalBitmap* unit = *del_iter;
+ sBitmapList.remove(unit);
+ delete unit;
+ unit = NULL;
+ }
+ }
+}
+
+LLUUID LLLocalBitmapMgr::getWorldID(LLUUID tracking_id)
+{
+ LLUUID world_id = LLUUID::null;
+
+ for (local_list_iter iter = sBitmapList.begin(); iter != sBitmapList.end(); iter++)
+ {
+ LLLocalBitmap* unit = *iter;
+ if (unit->getTrackingID() == tracking_id)
+ {
+ world_id = unit->getWorldID();
+ }
+ }
+
+ return world_id;
+}
+
+std::string LLLocalBitmapMgr::getFilename(LLUUID tracking_id)
+{
+ std::string filename = "";
+
+ for (local_list_iter iter = sBitmapList.begin(); iter != sBitmapList.end(); iter++)
+ {
+ LLLocalBitmap* unit = *iter;
+ if (unit->getTrackingID() == tracking_id)
+ {
+ filename = unit->getFilename();
+ }
+ }
+
+ return filename;
+}
+
+void LLLocalBitmapMgr::feedScrollList(LLScrollListCtrl* ctrl)
+{
+ if (ctrl)
+ {
+ ctrl->clearRows();
+
+ if (!sBitmapList.empty())
+ {
+ for (local_list_iter iter = sBitmapList.begin();
+ iter != sBitmapList.end(); iter++)
+ {
+ LLSD element;
+ element["columns"][0]["column"] = "unit_name";
+ element["columns"][0]["type"] = "text";
+ element["columns"][0]["value"] = (*iter)->getShortName();
+
+ element["columns"][1]["column"] = "unit_id_HIDDEN";
+ element["columns"][1]["type"] = "text";
+ element["columns"][1]["value"] = (*iter)->getTrackingID();
+
+ ctrl->addElement(element);
+ }
+ }
+ }
+
+}
+
+void LLLocalBitmapMgr::doUpdates()
+{
+ // preventing theoretical overlap in cases with huge number of loaded images.
+ sTimer.stopTimer();
+ sNeedsRebake = false;
+
+ for (local_list_iter iter = sBitmapList.begin(); iter != sBitmapList.end(); iter++)
+ {
+ (*iter)->updateSelf();
+ }
+
+ doRebake();
+ sTimer.startTimer();
+}
+
+void LLLocalBitmapMgr::setNeedsRebake()
+{
+ sNeedsRebake = true;
+}
+
+void LLLocalBitmapMgr::doRebake()
+{ /* separated that from doUpdates to insure a rebake can be called separately during deletion */
+ if (sNeedsRebake)
+ {
+ gAgentAvatarp->forceBakeAllTextures(LL_LOCAL_SLAM_FOR_DEBUG);
+ sNeedsRebake = false;
+ }
+}
+
diff --git a/indra/newview/lllocalbitmaps.h b/indra/newview/lllocalbitmaps.h
new file mode 100644
index 0000000000..7a23c7ef6e
--- /dev/null
+++ b/indra/newview/lllocalbitmaps.h
@@ -0,0 +1,136 @@
+/**
+ * @file lllocalbitmaps.h
+ * @author Vaalith Jinn
+ * @brief Local Bitmaps header
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LOCALBITMAPS_H
+#define LL_LOCALBITMAPS_H
+
+#include "lleventtimer.h"
+#include "llwearabletype.h"
+#include "llvoavatardefines.h"
+
+class LLScrollListCtrl;
+
+class LLLocalBitmap
+{
+ public: /* main */
+ LLLocalBitmap(std::string filename);
+ ~LLLocalBitmap();
+
+ public: /* accessors */
+ std::string getFilename();
+ std::string getShortName();
+ LLUUID getTrackingID();
+ LLUUID getWorldID();
+ bool getValid();
+
+ public: /* self update public section */
+ enum EUpdateType
+ {
+ UT_FIRSTUSE,
+ UT_REGUPDATE
+ };
+
+ bool updateSelf(EUpdateType = UT_REGUPDATE);
+
+ private: /* self update private section */
+ bool decodeBitmap(LLPointer<LLImageRaw> raw);
+ void replaceIDs(LLUUID old_id, LLUUID new_id);
+ std::vector<LLViewerObject*> prepUpdateObjects(LLUUID old_id);
+ void updateUserPrims(LLUUID old_id, LLUUID new_id);
+ void updateUserSculpts(LLUUID old_id, LLUUID new_id);
+ void updateUserLayers(LLUUID old_id, LLUUID new_id, LLWearableType::EType type);
+ LLVOAvatarDefines::ETextureIndex getTexIndex(LLWearableType::EType type, LLVOAvatarDefines::EBakedTextureIndex baked_texind);
+
+ private: /* private enums */
+ enum ELinkStatus
+ {
+ LS_ON,
+ LS_BROKEN,
+ };
+
+ enum EExtension
+ {
+ ET_IMG_BMP,
+ ET_IMG_TGA,
+ ET_IMG_JPG,
+ ET_IMG_PNG
+ };
+
+ private: /* members */
+ std::string mFilename;
+ std::string mShortName;
+ LLUUID mTrackingID;
+ LLUUID mWorldID;
+ bool mValid;
+ LLSD mLastModified;
+ EExtension mExtension;
+ ELinkStatus mLinkStatus;
+ S32 mUpdateRetries;
+
+};
+
+class LLLocalBitmapTimer : public LLEventTimer
+{
+ public:
+ LLLocalBitmapTimer();
+ ~LLLocalBitmapTimer();
+
+ public:
+ void startTimer();
+ void stopTimer();
+ bool isRunning();
+ BOOL tick();
+
+};
+
+class LLLocalBitmapMgr
+{
+ public:
+ LLLocalBitmapMgr();
+ ~LLLocalBitmapMgr();
+
+ public:
+ static bool addUnit();
+ static void delUnit(LLUUID tracking_id);
+
+ static LLUUID getWorldID(LLUUID tracking_id);
+ static std::string getFilename(LLUUID tracking_id);
+
+ static void feedScrollList(LLScrollListCtrl* ctrl);
+ static void doUpdates();
+ static void setNeedsRebake();
+ static void doRebake();
+
+ private:
+ static std::list<LLLocalBitmap*> sBitmapList;
+ static LLLocalBitmapTimer sTimer;
+ static bool sNeedsRebake;
+ typedef std::list<LLLocalBitmap*>::iterator local_list_iter;
+};
+
+#endif
+
diff --git a/indra/newview/lllocationhistory.h b/indra/newview/lllocationhistory.h
index 188fbf1f9b..9fef42c5df 100644
--- a/indra/newview/lllocationhistory.h
+++ b/indra/newview/lllocationhistory.h
@@ -33,6 +33,7 @@
#include <string>
#include <map>
#include <boost/function.hpp>
+#include <boost/signals2.hpp>
class LLSD;
/**
diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp
index 1527f8f4c9..025181ead5 100644
--- a/indra/newview/lllocationinputctrl.cpp
+++ b/indra/newview/lllocationinputctrl.cpp
@@ -44,11 +44,11 @@
// newview includes
#include "llagent.h"
+#include "llfloatersidepanelcontainer.h"
#include "llinventoryobserver.h"
#include "lllandmarkactions.h"
#include "lllandmarklist.h"
#include "llteleporthistory.h"
-#include "llsidetray.h"
#include "llslurl.h"
#include "llstatusbar.h" // getHealth()
#include "lltrans.h"
@@ -190,6 +190,7 @@ LLLocationInputCtrl::Params::Params()
scripts_icon("scripts_icon"),
damage_icon("damage_icon"),
damage_text("damage_text"),
+ see_avatars_icon("see_avatars_icon"),
maturity_help_topic("maturity_help_topic")
{
}
@@ -211,7 +212,6 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p)
{
// Lets replace default LLLineEditor with LLLocationLineEditor
// to make needed escaping while copying and cutting url
- this->removeChild(mTextEntry);
delete mTextEntry;
// Can't access old mTextEntry fields as they are protected, so lets build new params
@@ -343,6 +343,13 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p)
mDamageText = LLUICtrlFactory::create<LLTextBox>(damage_text);
addChild(mDamageText);
+ LLIconCtrl::Params see_avatars_icon = p.see_avatars_icon;
+ see_avatars_icon.tool_tip = LLTrans::getString("LocationCtrlSeeAVsTooltip");
+ see_avatars_icon.mouse_opaque = true;
+ mParcelIcon[SEE_AVATARS_ICON] = LLUICtrlFactory::create<LLIconCtrl>(see_avatars_icon);
+ mParcelIcon[SEE_AVATARS_ICON]->setMouseDownCallback(boost::bind(&LLLocationInputCtrl::onParcelIconClick, this, SEE_AVATARS_ICON));
+ addChild(mParcelIcon[SEE_AVATARS_ICON]);
+
// Register callbacks and load the location field context menu (NB: the order matters).
LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("Navbar.Action", boost::bind(&LLLocationInputCtrl::onLocationContextMenuItemClicked, this, _2));
LLUICtrl::EnableCallbackRegistry::currentRegistrar().add("Navbar.EnableMenuItem", boost::bind(&LLLocationInputCtrl::onLocationContextMenuItemEnabled, this, _2));
@@ -547,6 +554,10 @@ void LLLocationInputCtrl::onFocusLost()
{
LLUICtrl::onFocusLost();
refreshLocation();
+
+ // Setting cursor to 0 to show the left edge of the text. See STORM-370.
+ mTextEntry->setCursor(0);
+
if(mTextEntry->hasSelection()){
mTextEntry->deselect();
}
@@ -589,7 +600,7 @@ void LLLocationInputCtrl::reshape(S32 width, S32 height, BOOL called_from_parent
void LLLocationInputCtrl::onInfoButtonClicked()
{
- LLSideTray::getInstance()->showPanel("panel_places", LLSD().with("type", "agent"));
+ LLFloaterSidePanelContainer::showPanel("places", LLSD().with("type", "agent"));
}
void LLLocationInputCtrl::onForSaleButtonClicked()
@@ -607,11 +618,11 @@ void LLLocationInputCtrl::onAddLandmarkButtonClicked()
key["type"] = "landmark";
key["id"] = landmark->getUUID();
- LLSideTray::getInstance()->showPanel("panel_places", key);
+ LLFloaterSidePanelContainer::showPanel("places", key);
}
else
{
- LLSideTray::getInstance()->showPanel("panel_places", LLSD().with("type", "create_landmark"));
+ LLFloaterSidePanelContainer::showPanel("places", LLSD().with("type", "create_landmark"));
}
}
@@ -807,6 +818,7 @@ void LLLocationInputCtrl::refreshParcelIcons()
bool allow_build = vpm->allowAgentBuild(current_parcel); // true when anyone is allowed to build. See EXT-4610.
bool allow_scripts = vpm->allowAgentScripts(agent_region, current_parcel);
bool allow_damage = vpm->allowAgentDamage(agent_region, current_parcel);
+ bool see_avs = current_parcel->getSeeAVs();
// Most icons are "block this ability"
mParcelIcon[VOICE_ICON]->setVisible( !allow_voice );
@@ -816,6 +828,7 @@ void LLLocationInputCtrl::refreshParcelIcons()
mParcelIcon[SCRIPTS_ICON]->setVisible( !allow_scripts );
mParcelIcon[DAMAGE_ICON]->setVisible( allow_damage );
mDamageText->setVisible(allow_damage);
+ mParcelIcon[SEE_AVATARS_ICON]->setVisible( !see_avs );
// Padding goes to left of both landmark star and for sale btn
x -= mAddLandmarkHPad;
@@ -1074,12 +1087,12 @@ void LLLocationInputCtrl::onLocationContextMenuItemClicked(const LLSD& userdata)
if(!landmark)
{
- LLSideTray::getInstance()->showPanel("panel_places", LLSD().with("type", "create_landmark"));
+ LLFloaterSidePanelContainer::showPanel("places", LLSD().with("type", "create_landmark"));
}
else
{
- LLSideTray::getInstance()->showPanel("panel_places",
- LLSD().with("type", "landmark").with("id",landmark->getUUID()));
+ LLFloaterSidePanelContainer::showPanel("places", LLSD().with("type", "landmark").with("id",landmark->getUUID()));
+
}
}
else if (item == "cut")
@@ -1172,6 +1185,9 @@ void LLLocationInputCtrl::onParcelIconClick(EParcelIcon icon)
case DAMAGE_ICON:
LLNotificationsUtil::add("NotSafe");
break;
+ case SEE_AVATARS_ICON:
+ LLNotificationsUtil::add("SeeAvatars");
+ break;
case ICON_COUNT:
break;
// no default to get compiler warning when a new icon gets added
diff --git a/indra/newview/lllocationinputctrl.h b/indra/newview/lllocationinputctrl.h
index 6368bf5cf2..ed47ba73e3 100644
--- a/indra/newview/lllocationinputctrl.h
+++ b/indra/newview/lllocationinputctrl.h
@@ -77,7 +77,8 @@ public:
push_icon,
build_icon,
scripts_icon,
- damage_icon;
+ damage_icon,
+ see_avatars_icon;
Optional<LLTextBox::Params> damage_text;
Params();
};
@@ -109,12 +110,13 @@ private:
enum EParcelIcon
{
VOICE_ICON = 0,
- FLY_ICON,
- PUSH_ICON,
- BUILD_ICON,
- SCRIPTS_ICON,
- DAMAGE_ICON,
- ICON_COUNT
+ FLY_ICON, // 1
+ PUSH_ICON, // 2
+ BUILD_ICON, // 3
+ SCRIPTS_ICON, // 4
+ DAMAGE_ICON, // 5
+ SEE_AVATARS_ICON, // 6
+ ICON_COUNT // 7 total
};
friend class LLUICtrlFactory;
diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp
index 0121bbb1ed..ebb5912ace 100644
--- a/indra/newview/lllogchat.cpp
+++ b/indra/newview/lllogchat.cpp
@@ -32,6 +32,7 @@
#include "lltrans.h"
#include "llviewercontrol.h"
+#include "lldiriterator.h"
#include "llinstantmessage.h"
#include "llsingleton.h" // for LLSingleton
@@ -41,6 +42,7 @@
#include <boost/regex/v4/match_results.hpp>
#if LL_MSVC
+#pragma warning(push)
// disable warning about boost::lexical_cast unreachable code
// when it fails to parse the string
#pragma warning (disable:4702)
@@ -89,15 +91,15 @@ const static boost::regex TIMESTAMP_AND_STUFF("^(\\[\\d{4}/\\d{1,2}/\\d{1,2}\\s+
*/
const static boost::regex NAME_AND_TEXT("([^:]+[:]{1})?(\\s*)(.*)");
-/**
- * These are recognizers for matching the names of ad-hoc conferences when generating the log file name
- * On invited side, an ad-hoc is named like "<first name> <last name> Conference 2010/11/19 03:43 f0f4"
- * On initiating side, an ad-hoc is named like Ad-hoc Conference hash<hash>"
- * If the naming system for ad-hoc conferences are change in LLIMModel::LLIMSession::buildHistoryFileName()
- * then these definition need to be adjusted as well.
- */
-const static boost::regex INBOUND_CONFERENCE("^[a-zA-Z]{1,31} [a-zA-Z]{1,31} Conference [0-9]{4}/[0-9]{2}/[0-9]{2} [0-9]{2}:[0-9]{2} [0-9a-f]{4}");
-const static boost::regex OUTBOUND_CONFERENCE("^Ad-hoc Conference hash[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}");
+/**
+ * These are recognizers for matching the names of ad-hoc conferences when generating the log file name
+ * On invited side, an ad-hoc is named like "<first name> <last name> Conference 2010/11/19 03:43 f0f4"
+ * On initiating side, an ad-hoc is named like Ad-hoc Conference hash<hash>"
+ * If the naming system for ad-hoc conferences are change in LLIMModel::LLIMSession::buildHistoryFileName()
+ * then these definition need to be adjusted as well.
+ */
+const static boost::regex INBOUND_CONFERENCE("^[a-zA-Z]{1,31} [a-zA-Z]{1,31} Conference [0-9]{4}/[0-9]{2}/[0-9]{2} [0-9]{2}:[0-9]{2} [0-9a-f]{4}");
+const static boost::regex OUTBOUND_CONFERENCE("^Ad-hoc Conference hash[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}");
//is used to parse complex object names like "Xstreet SL Terminal v2.2.5 st"
const static std::string NAME_TEXT_DIVIDER(": ");
@@ -228,7 +230,7 @@ std::string LLLogChat::makeLogFileName(std::string filename)
std::string LLLogChat::cleanFileName(std::string filename)
{
- std::string invalidChars = "\"\'\\/?*:.<>|";
+ std::string invalidChars = "\"\'\\/?*:.<>|[]{}~"; // Cannot match glob or illegal filename chars
std::string::size_type position = filename.find_first_of(invalidChars);
while (position != filename.npos)
{
@@ -601,7 +603,8 @@ std::string LLLogChat::oldLogFileName(std::string filename)
//LL_INFOS("") << "Checking:" << directory << " for " << pattern << LL_ENDL;/* uncomment if you want to verify step, delete on commit */
std::vector<std::string> allfiles;
- while (gDirUtilp->getNextFileInDir(directory, pattern, scanResult))
+ LLDirIterator iter(directory, pattern);
+ while (iter.next(scanResult))
{
//LL_INFOS("") << "Found :" << scanResult << LL_ENDL;
allfiles.push_back(scanResult);
diff --git a/indra/newview/llloginhandler.cpp b/indra/newview/llloginhandler.cpp
index 48be251611..9b4f146332 100644
--- a/indra/newview/llloginhandler.cpp
+++ b/indra/newview/llloginhandler.cpp
@@ -30,13 +30,13 @@
// viewer includes
#include "llsecapi.h"
-#include "lllogininstance.h" // to check if logged in yet
-#include "llpanellogin.h" // save_password_to_disk()
+#include "lllogininstance.h" // to check if logged in yet
+#include "llpanellogin.h"
#include "llstartup.h" // getStartupState()
#include "llslurl.h"
#include "llviewercontrol.h" // gSavedSettings
#include "llviewernetwork.h" // EGridInfo
-#include "llviewerwindow.h" // getWindow()
+#include "llviewerwindow.h" // getWindow()
// library includes
#include "llmd5.h"
diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp
index 83a8134580..419641d23c 100644
--- a/indra/newview/lllogininstance.cpp
+++ b/indra/newview/lllogininstance.cpp
@@ -49,34 +49,443 @@
#include "llnotifications.h"
#include "llwindow.h"
#include "llviewerwindow.h"
+#include "llprogressview.h"
#if LL_LINUX || LL_SOLARIS
#include "lltrans.h"
#endif
#include "llsecapi.h"
#include "llstartup.h"
#include "llmachineid.h"
+#include "llupdaterservice.h"
+#include "llevents.h"
+#include "llnotificationsutil.h"
+#include "llappviewer.h"
+
+#include <boost/scoped_ptr.hpp>
+#include <sstream>
+
+class LLLoginInstance::Disposable {
+public:
+ virtual ~Disposable() {}
+};
+
+namespace {
+ class MandatoryUpdateMachine:
+ public LLLoginInstance::Disposable
+ {
+ public:
+ MandatoryUpdateMachine(LLLoginInstance & loginInstance, LLUpdaterService & updaterService);
+
+ void start(void);
+
+ private:
+ class State;
+ class CheckingForUpdate;
+ class Error;
+ class ReadyToInstall;
+ class StartingUpdaterService;
+ class WaitingForDownload;
+
+ LLLoginInstance & mLoginInstance;
+ boost::scoped_ptr<State> mState;
+ LLUpdaterService & mUpdaterService;
+
+ void setCurrentState(State * newState);
+ };
+
+
+ class MandatoryUpdateMachine::State {
+ public:
+ virtual ~State() {}
+ virtual void enter(void) {}
+ virtual void exit(void) {}
+ };
+
+
+ class MandatoryUpdateMachine::CheckingForUpdate:
+ public MandatoryUpdateMachine::State
+ {
+ public:
+ CheckingForUpdate(MandatoryUpdateMachine & machine);
+
+ virtual void enter(void);
+ virtual void exit(void);
+
+ private:
+ LLTempBoundListener mConnection;
+ MandatoryUpdateMachine & mMachine;
+ LLProgressView * mProgressView;
+
+ bool onEvent(LLSD const & event);
+ };
+
+
+ class MandatoryUpdateMachine::Error:
+ public MandatoryUpdateMachine::State
+ {
+ public:
+ Error(MandatoryUpdateMachine & machine);
+
+ virtual void enter(void);
+ virtual void exit(void);
+ void onButtonClicked(const LLSD &, const LLSD &);
+
+ private:
+ MandatoryUpdateMachine & mMachine;
+ };
+
+
+ class MandatoryUpdateMachine::ReadyToInstall:
+ public MandatoryUpdateMachine::State
+ {
+ public:
+ ReadyToInstall(MandatoryUpdateMachine & machine);
+
+ virtual void enter(void);
+ virtual void exit(void);
+
+ private:
+ MandatoryUpdateMachine & mMachine;
+ };
+
+
+ class MandatoryUpdateMachine::StartingUpdaterService:
+ public MandatoryUpdateMachine::State
+ {
+ public:
+ StartingUpdaterService(MandatoryUpdateMachine & machine);
+
+ virtual void enter(void);
+ virtual void exit(void);
+ void onButtonClicked(const LLSD & uiform, const LLSD & result);
+ private:
+ MandatoryUpdateMachine & mMachine;
+ };
+
+
+ class MandatoryUpdateMachine::WaitingForDownload:
+ public MandatoryUpdateMachine::State
+ {
+ public:
+ WaitingForDownload(MandatoryUpdateMachine & machine);
+
+ virtual void enter(void);
+ virtual void exit(void);
+
+ private:
+ LLTempBoundListener mConnection;
+ MandatoryUpdateMachine & mMachine;
+ LLProgressView * mProgressView;
+
+ bool onEvent(LLSD const & event);
+ };
+}
static const char * const TOS_REPLY_PUMP = "lllogininstance_tos_callback";
static const char * const TOS_LISTENER_NAME = "lllogininstance_tos";
std::string construct_start_string();
+
+
+// MandatoryUpdateMachine
+//-----------------------------------------------------------------------------
+
+
+MandatoryUpdateMachine::MandatoryUpdateMachine(LLLoginInstance & loginInstance, LLUpdaterService & updaterService):
+ mLoginInstance(loginInstance),
+ mUpdaterService(updaterService)
+{
+ ; // No op.
+}
+
+
+void MandatoryUpdateMachine::start(void)
+{
+ llinfos << "starting manditory update machine" << llendl;
+
+ if(mUpdaterService.isChecking()) {
+ switch(mUpdaterService.getState()) {
+ case LLUpdaterService::UP_TO_DATE:
+ mUpdaterService.stopChecking();
+ mUpdaterService.startChecking();
+ // Fall through.
+ case LLUpdaterService::INITIAL:
+ case LLUpdaterService::CHECKING_FOR_UPDATE:
+ setCurrentState(new CheckingForUpdate(*this));
+ break;
+ case LLUpdaterService::TEMPORARY_ERROR:
+ setCurrentState(new Error(*this));
+ break;
+ case LLUpdaterService::DOWNLOADING:
+ setCurrentState(new WaitingForDownload(*this));
+ break;
+ case LLUpdaterService::TERMINAL:
+ if(LLUpdaterService::updateReadyToInstall()) {
+ setCurrentState(new ReadyToInstall(*this));
+ } else {
+ setCurrentState(new Error(*this));
+ }
+ break;
+ case LLUpdaterService::FAILURE:
+ setCurrentState(new Error(*this));
+ break;
+ default:
+ llassert(!"unpossible case");
+ break;
+ }
+ } else {
+ setCurrentState(new StartingUpdaterService(*this));
+ }
+}
+
+
+void MandatoryUpdateMachine::setCurrentState(State * newStatePointer)
+{
+ {
+ boost::scoped_ptr<State> newState(newStatePointer);
+ if(mState != 0) mState->exit();
+ mState.swap(newState);
+
+ // Old state will be deleted on exit from this block before the new state
+ // is entered.
+ }
+ if(mState != 0) mState->enter();
+}
+
+
+
+// MandatoryUpdateMachine::CheckingForUpdate
+//-----------------------------------------------------------------------------
+
+
+MandatoryUpdateMachine::CheckingForUpdate::CheckingForUpdate(MandatoryUpdateMachine & machine):
+ mMachine(machine)
+{
+ ; // No op.
+}
+
+
+void MandatoryUpdateMachine::CheckingForUpdate::enter(void)
+{
+ llinfos << "entering checking for update" << llendl;
+
+ mProgressView = gViewerWindow->getProgressView();
+ mProgressView->setMessage("Looking for update...");
+ mProgressView->setText("There is a required update for your Second Life installation.");
+ mProgressView->setPercent(0);
+ mProgressView->setVisible(true);
+ mConnection = LLEventPumps::instance().obtain(LLUpdaterService::pumpName()).
+ listen("MandatoryUpdateMachine::CheckingForUpdate", boost::bind(&MandatoryUpdateMachine::CheckingForUpdate::onEvent, this, _1));
+}
+
+
+void MandatoryUpdateMachine::CheckingForUpdate::exit(void)
+{
+}
+
+
+bool MandatoryUpdateMachine::CheckingForUpdate::onEvent(LLSD const & event)
+{
+ if(event["type"].asInteger() == LLUpdaterService::STATE_CHANGE) {
+ switch(event["state"].asInteger()) {
+ case LLUpdaterService::DOWNLOADING:
+ mMachine.setCurrentState(new WaitingForDownload(mMachine));
+ break;
+ case LLUpdaterService::TEMPORARY_ERROR:
+ case LLUpdaterService::UP_TO_DATE:
+ case LLUpdaterService::TERMINAL:
+ case LLUpdaterService::FAILURE:
+ mProgressView->setVisible(false);
+ mMachine.setCurrentState(new Error(mMachine));
+ break;
+ case LLUpdaterService::INSTALLING:
+ llassert(!"can't possibly be installing");
+ break;
+ default:
+ break;
+ }
+ } else {
+ ; // Ignore.
+ }
+
+ return false;
+}
+
+
+
+// MandatoryUpdateMachine::Error
+//-----------------------------------------------------------------------------
+
+
+MandatoryUpdateMachine::Error::Error(MandatoryUpdateMachine & machine):
+ mMachine(machine)
+{
+ ; // No op.
+}
+
+
+void MandatoryUpdateMachine::Error::enter(void)
+{
+ llinfos << "entering error" << llendl;
+ LLNotificationsUtil::add("FailedRequiredUpdateInstall", LLSD(), LLSD(), boost::bind(&MandatoryUpdateMachine::Error::onButtonClicked, this, _1, _2));
+}
+
+
+void MandatoryUpdateMachine::Error::exit(void)
+{
+ LLAppViewer::instance()->forceQuit();
+}
+
+
+void MandatoryUpdateMachine::Error::onButtonClicked(const LLSD &, const LLSD &)
+{
+ mMachine.setCurrentState(0);
+}
+
+
+
+// MandatoryUpdateMachine::ReadyToInstall
+//-----------------------------------------------------------------------------
+
+
+MandatoryUpdateMachine::ReadyToInstall::ReadyToInstall(MandatoryUpdateMachine & machine):
+ mMachine(machine)
+{
+ ; // No op.
+}
+
+
+void MandatoryUpdateMachine::ReadyToInstall::enter(void)
+{
+ llinfos << "entering ready to install" << llendl;
+ // Open update ready dialog.
+}
+
+
+void MandatoryUpdateMachine::ReadyToInstall::exit(void)
+{
+ // Restart viewer.
+}
+
+
+
+// MandatoryUpdateMachine::StartingUpdaterService
+//-----------------------------------------------------------------------------
+
+
+MandatoryUpdateMachine::StartingUpdaterService::StartingUpdaterService(MandatoryUpdateMachine & machine):
+ mMachine(machine)
+{
+ ; // No op.
+}
+
+
+void MandatoryUpdateMachine::StartingUpdaterService::enter(void)
+{
+ llinfos << "entering start update service" << llendl;
+ LLNotificationsUtil::add("UpdaterServiceNotRunning", LLSD(), LLSD(), boost::bind(&MandatoryUpdateMachine::StartingUpdaterService::onButtonClicked, this, _1, _2));
+}
+
+
+void MandatoryUpdateMachine::StartingUpdaterService::exit(void)
+{
+ ; // No op.
+}
+
+
+void MandatoryUpdateMachine::StartingUpdaterService::onButtonClicked(const LLSD & uiform, const LLSD & result)
+{
+ if(result["OK_okcancelbuttons"].asBoolean()) {
+ mMachine.mUpdaterService.startChecking(false);
+ mMachine.setCurrentState(new CheckingForUpdate(mMachine));
+ } else {
+ LLAppViewer::instance()->forceQuit();
+ }
+}
+
+
+
+// MandatoryUpdateMachine::WaitingForDownload
+//-----------------------------------------------------------------------------
+
+
+MandatoryUpdateMachine::WaitingForDownload::WaitingForDownload(MandatoryUpdateMachine & machine):
+ mMachine(machine),
+ mProgressView(0)
+{
+ ; // No op.
+}
+
+
+void MandatoryUpdateMachine::WaitingForDownload::enter(void)
+{
+ llinfos << "entering waiting for download" << llendl;
+ mProgressView = gViewerWindow->getProgressView();
+ mProgressView->setMessage("Downloading update...");
+ std::ostringstream stream;
+ stream << "There is a required update for your Second Life installation." << std::endl <<
+ "Version " << mMachine.mUpdaterService.updatedVersion();
+ mProgressView->setText(stream.str());
+ mProgressView->setPercent(0);
+ mProgressView->setVisible(true);
+ mConnection = LLEventPumps::instance().obtain(LLUpdaterService::pumpName()).
+ listen("MandatoryUpdateMachine::CheckingForUpdate", boost::bind(&MandatoryUpdateMachine::WaitingForDownload::onEvent, this, _1));
+}
+
+
+void MandatoryUpdateMachine::WaitingForDownload::exit(void)
+{
+ mProgressView->setVisible(false);
+}
+
+
+bool MandatoryUpdateMachine::WaitingForDownload::onEvent(LLSD const & event)
+{
+ switch(event["type"].asInteger()) {
+ case LLUpdaterService::DOWNLOAD_COMPLETE:
+ mMachine.setCurrentState(new ReadyToInstall(mMachine));
+ break;
+ case LLUpdaterService::DOWNLOAD_ERROR:
+ mMachine.setCurrentState(new Error(mMachine));
+ break;
+ case LLUpdaterService::PROGRESS: {
+ double downloadSize = event["download_size"].asReal();
+ double bytesDownloaded = event["bytes_downloaded"].asReal();
+ mProgressView->setPercent(100. * bytesDownloaded / downloadSize);
+ break;
+ }
+ default:
+ break;
+ }
+
+ return false;
+}
+
+
+
+// LLLoginInstance
+//-----------------------------------------------------------------------------
+
+
LLLoginInstance::LLLoginInstance() :
mLoginModule(new LLLogin()),
mNotifications(NULL),
mLoginState("offline"),
- mUserInteraction(true),
mSkipOptionalUpdate(false),
mAttemptComplete(false),
mTransferRate(0.0f),
- mDispatcher("LLLoginInstance", "change")
+ mDispatcher("LLLoginInstance", "change"),
+ mUpdaterService(0)
{
mLoginModule->getEventPump().listen("lllogininstance",
boost::bind(&LLLoginInstance::handleLoginEvent, this, _1));
- mDispatcher.add("fail.login", boost::bind(&LLLoginInstance::handleLoginFailure, this, _1));
- mDispatcher.add("connect", boost::bind(&LLLoginInstance::handleLoginSuccess, this, _1));
- mDispatcher.add("disconnect", boost::bind(&LLLoginInstance::handleDisconnect, this, _1));
- mDispatcher.add("indeterminate", boost::bind(&LLLoginInstance::handleIndeterminate, this, _1));
+ // This internal use of LLEventDispatcher doesn't really need
+ // per-function descriptions.
+ mDispatcher.add("fail.login", "", boost::bind(&LLLoginInstance::handleLoginFailure, this, _1));
+ mDispatcher.add("connect", "", boost::bind(&LLLoginInstance::handleLoginSuccess, this, _1));
+ mDispatcher.add("disconnect", "", boost::bind(&LLLoginInstance::handleDisconnect, this, _1));
+ mDispatcher.add("indeterminate", "", boost::bind(&LLLoginInstance::handleIndeterminate, this, _1));
}
LLLoginInstance::~LLLoginInstance()
@@ -149,6 +558,11 @@ void LLLoginInstance::constructAuthParams(LLPointer<LLCredential> user_credentia
requested_options.append("buddy-list");
requested_options.append("newuser-config");
requested_options.append("ui-config");
+
+ //send this info to login.cgi for stats gathering
+ //since viewerstats isn't reliable enough
+ requested_options.append("advanced-mode");
+
#endif
requested_options.append("max-agent-groups");
requested_options.append("map-server-url");
@@ -183,9 +597,11 @@ void LLLoginInstance::constructAuthParams(LLPointer<LLCredential> user_credentia
request_params["read_critical"] = false; // handleTOSResponse
request_params["last_exec_event"] = mLastExecEvent;
request_params["mac"] = hashed_unique_id_string;
- request_params["version"] = LLVersionInfo::getVersionAndChannel(); // Includes channel name
+ request_params["version"] = LLVersionInfo::getChannelAndVersion(); // Includes channel name
request_params["channel"] = LLVersionInfo::getChannel();
request_params["id0"] = mSerialNumber;
+ request_params["host_id"] = gSavedSettings.getString("HostID");
+ request_params["extended_errors"] = true; // request message_id and message_args
mRequestData.clear();
mRequestData["method"] = "login_to_simulator";
@@ -217,11 +633,7 @@ bool LLLoginInstance::handleLoginEvent(const LLSD& event)
// Call the method registered in constructor, if any, for more specific
// handling
- LLEventDispatcher::Callable method(mDispatcher.get(event["change"]));
- if (! method.empty())
- {
- method(event);
- }
+ mDispatcher.try_call(event);
return false;
}
@@ -232,64 +644,57 @@ void LLLoginInstance::handleLoginFailure(const LLSD& event)
LLSD response = event["data"];
std::string reason_response = response["reason"].asString();
std::string message_response = response["message"].asString();
- if(mUserInteraction)
+ // For the cases of critical message or TOS agreement,
+ // start the TOS dialog. The dialog response will be handled
+ // by the LLLoginInstance::handleTOSResponse() callback.
+ // The callback intiates the login attempt next step, either
+ // to reconnect or to end the attempt in failure.
+ if(reason_response == "tos")
{
- // For the cases of critical message or TOS agreement,
- // start the TOS dialog. The dialog response will be handled
- // by the LLLoginInstance::handleTOSResponse() callback.
- // The callback intiates the login attempt next step, either
- // to reconnect or to end the attempt in failure.
- if(reason_response == "tos")
- {
- LLSD data(LLSD::emptyMap());
- data["message"] = message_response;
- data["reply_pump"] = TOS_REPLY_PUMP;
- gViewerWindow->setShowProgress(FALSE);
- LLFloaterReg::showInstance("message_tos", data);
- LLEventPumps::instance().obtain(TOS_REPLY_PUMP)
- .listen(TOS_LISTENER_NAME,
- boost::bind(&LLLoginInstance::handleTOSResponse,
- this, _1, "agree_to_tos"));
- }
- else if(reason_response == "critical")
- {
- LLSD data(LLSD::emptyMap());
- data["message"] = message_response;
- data["reply_pump"] = TOS_REPLY_PUMP;
- if(response.has("error_code"))
- {
- data["error_code"] = response["error_code"];
- }
- if(response.has("certificate"))
- {
- data["certificate"] = response["certificate"];
- }
-
- gViewerWindow->setShowProgress(FALSE);
- LLFloaterReg::showInstance("message_critical", data);
- LLEventPumps::instance().obtain(TOS_REPLY_PUMP)
- .listen(TOS_LISTENER_NAME,
- boost::bind(&LLLoginInstance::handleTOSResponse,
- this, _1, "read_critical"));
- }
- else if(reason_response == "update" || gSavedSettings.getBOOL("ForceMandatoryUpdate"))
+ LLSD data(LLSD::emptyMap());
+ data["message"] = message_response;
+ data["reply_pump"] = TOS_REPLY_PUMP;
+ gViewerWindow->setShowProgress(FALSE);
+ LLFloaterReg::showInstance("message_tos", data);
+ LLEventPumps::instance().obtain(TOS_REPLY_PUMP)
+ .listen(TOS_LISTENER_NAME,
+ boost::bind(&LLLoginInstance::handleTOSResponse,
+ this, _1, "agree_to_tos"));
+ }
+ else if(reason_response == "critical")
+ {
+ LLSD data(LLSD::emptyMap());
+ data["message"] = message_response;
+ data["reply_pump"] = TOS_REPLY_PUMP;
+ if(response.has("error_code"))
{
- gSavedSettings.setBOOL("ForceMandatoryUpdate", FALSE);
- updateApp(true, message_response);
+ data["error_code"] = response["error_code"];
}
- else if(reason_response == "optional")
+ if(response.has("certificate"))
{
- updateApp(false, message_response);
+ data["certificate"] = response["certificate"];
}
- else
- {
- attemptComplete();
- }
+
+ gViewerWindow->setShowProgress(FALSE);
+ LLFloaterReg::showInstance("message_critical", data);
+ LLEventPumps::instance().obtain(TOS_REPLY_PUMP)
+ .listen(TOS_LISTENER_NAME,
+ boost::bind(&LLLoginInstance::handleTOSResponse,
+ this, _1, "read_critical"));
}
- else // no user interaction
+ else if(reason_response == "update" || gSavedSettings.getBOOL("ForceMandatoryUpdate"))
{
- attemptComplete();
+ gSavedSettings.setBOOL("ForceMandatoryUpdate", FALSE);
+ updateApp(true, message_response);
+ }
+ else if(reason_response == "optional")
+ {
+ updateApp(false, message_response);
}
+ else
+ {
+ attemptComplete();
+ }
}
void LLLoginInstance::handleLoginSuccess(const LLSD& event)
@@ -353,6 +758,15 @@ bool LLLoginInstance::handleTOSResponse(bool accepted, const std::string& key)
void LLLoginInstance::updateApp(bool mandatory, const std::string& auth_msg)
{
+ if(mandatory)
+ {
+ gViewerWindow->setShowProgress(false);
+ MandatoryUpdateMachine * machine = new MandatoryUpdateMachine(*this, *mUpdaterService);
+ mUpdateStateMachine.reset(machine);
+ machine->start();
+ return;
+ }
+
// store off config state, as we might quit soon
gSavedSettings.saveToFile(gSavedSettings.getString("ClientSettingsFile"), TRUE);
LLUIColorTable::instance().saveUserSettings();
diff --git a/indra/newview/lllogininstance.h b/indra/newview/lllogininstance.h
index 159e05046c..8b53431219 100644
--- a/indra/newview/lllogininstance.h
+++ b/indra/newview/lllogininstance.h
@@ -34,12 +34,15 @@
class LLLogin;
class LLEventStream;
class LLNotificationsInterface;
+class LLUpdaterService;
// This class hosts the login module and is used to
// negotiate user authentication attempts.
class LLLoginInstance : public LLSingleton<LLLoginInstance>
{
public:
+ class Disposable;
+
LLLoginInstance();
~LLLoginInstance();
@@ -58,12 +61,6 @@ public:
// Only valid when authSuccess == true.
const F64 getLastTransferRateBPS() { return mTransferRate; }
- // Set whether this class will drive user interaction.
- // If not, login failures like 'need tos agreement' will
- // end the login attempt.
- void setUserInteraction(bool state) { mUserInteraction = state; }
- bool getUserInteraction() { return mUserInteraction; }
-
// Whether to tell login to skip optional update request.
// False by default.
void setSkipOptionalUpdate(bool state) { mSkipOptionalUpdate = state; }
@@ -75,6 +72,7 @@ public:
typedef boost::function<void()> UpdaterLauncherCallback;
void setUpdaterLauncher(const UpdaterLauncherCallback& ulc) { mUpdaterLauncher = ulc; }
+ void setUpdaterService(LLUpdaterService * updaterService) { mUpdaterService = updaterService; }
private:
void constructAuthParams(LLPointer<LLCredential> user_credentials);
void updateApp(bool mandatory, const std::string& message);
@@ -96,7 +94,6 @@ private:
std::string mLoginState;
LLSD mRequestData;
LLSD mResponseData;
- bool mUserInteraction;
bool mSkipOptionalUpdate;
bool mAttemptComplete;
F64 mTransferRate;
@@ -104,6 +101,8 @@ private:
int mLastExecEvent;
UpdaterLauncherCallback mUpdaterLauncher;
LLEventDispatcher mDispatcher;
+ LLUpdaterService * mUpdaterService;
+ boost::scoped_ptr<Disposable> mUpdateStateMachine;
};
#endif
diff --git a/indra/newview/llmanip.cpp b/indra/newview/llmanip.cpp
index 85e0043651..6e0f360cbc 100644
--- a/indra/newview/llmanip.cpp
+++ b/indra/newview/llmanip.cpp
@@ -372,14 +372,14 @@ void LLManip::renderGuidelines(BOOL draw_x, BOOL draw_y, BOOL draw_z)
//LLVector3 center_agent = LLSelectMgr::getInstance()->getBBoxOfSelection().getCenterAgent();
LLVector3 center_agent = getPivotPoint();
- glPushMatrix();
+ gGL.pushMatrix();
{
- glTranslatef(center_agent.mV[VX], center_agent.mV[VY], center_agent.mV[VZ]);
+ gGL.translatef(center_agent.mV[VX], center_agent.mV[VY], center_agent.mV[VZ]);
F32 angle_radians, x, y, z;
grid_rot.getAngleAxis(&angle_radians, &x, &y, &z);
- glRotatef(angle_radians * RAD_TO_DEG, x, y, z);
+ gGL.rotatef(angle_radians * RAD_TO_DEG, x, y, z);
F32 region_size = LLWorld::getInstance()->getRegionWidthInMeters();
@@ -416,7 +416,7 @@ void LLManip::renderGuidelines(BOOL draw_x, BOOL draw_y, BOOL draw_z)
}
LLUI::setLineWidth(1.0f);
}
- glPopMatrix();
+ gGL.popMatrix();
}
void LLManip::renderXYZ(const LLVector3 &vec)
@@ -466,11 +466,11 @@ void LLManip::renderXYZ(const LLVector3 &vec)
feedback_string = llformat("X: %.3f", vec.mV[VX]);
hud_render_text(utf8str_to_wstring(feedback_string), camera_pos, *font, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, -102.f, (F32)vertical_offset, LLColor4(1.f, 0.5f, 0.5f, 1.f), FALSE);
- glColor3f(0.5f, 1.f, 0.5f);
+ gGL.diffuseColor3f(0.5f, 1.f, 0.5f);
feedback_string = llformat("Y: %.3f", vec.mV[VY]);
hud_render_text(utf8str_to_wstring(feedback_string), camera_pos, *font, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, -27.f, (F32)vertical_offset, LLColor4(0.5f, 1.f, 0.5f, 1.f), FALSE);
- glColor3f(0.5f, 0.5f, 1.f);
+ gGL.diffuseColor3f(0.5f, 0.5f, 1.f);
feedback_string = llformat("Z: %.3f", vec.mV[VZ]);
hud_render_text(utf8str_to_wstring(feedback_string), camera_pos, *font, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, 48.f, (F32)vertical_offset, LLColor4(0.5f, 0.5f, 1.f, 1.f), FALSE);
}
@@ -481,8 +481,8 @@ void LLManip::renderTickText(const LLVector3& pos, const std::string& text, cons
const LLFontGL* big_fontp = LLFontGL::getFontSansSerif();
BOOL hud_selection = mObjectSelection->getSelectType() == SELECT_TYPE_HUD;
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.pushMatrix();
LLVector3 render_pos = pos;
if (hud_selection)
{
@@ -490,7 +490,7 @@ void LLManip::renderTickText(const LLVector3& pos, const std::string& text, cons
F32 inv_zoom_amt = 1.f / zoom_amt;
// scale text back up to counter-act zoom level
render_pos = pos * zoom_amt;
- glScalef(inv_zoom_amt, inv_zoom_amt, inv_zoom_amt);
+ gGL.scalef(inv_zoom_amt, inv_zoom_amt, inv_zoom_amt);
}
// render shadow first
@@ -501,7 +501,7 @@ void LLManip::renderTickText(const LLVector3& pos, const std::string& text, cons
gViewerWindow->setup3DViewport();
hud_render_utf8text(text, render_pos, *big_fontp, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, -0.5f * big_fontp->getWidthF32(text), 3.f, color, mObjectSelection->getSelectType() == SELECT_TYPE_HUD);
- glPopMatrix();
+ gGL.popMatrix();
}
void LLManip::renderTickValue(const LLVector3& pos, F32 value, const std::string& suffix, const LLColor4 &color)
@@ -539,8 +539,8 @@ void LLManip::renderTickValue(const LLVector3& pos, F32 value, const std::string
}
BOOL hud_selection = mObjectSelection->getSelectType() == SELECT_TYPE_HUD;
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.pushMatrix();
LLVector3 render_pos = pos;
if (hud_selection)
{
@@ -548,7 +548,7 @@ void LLManip::renderTickValue(const LLVector3& pos, F32 value, const std::string
F32 inv_zoom_amt = 1.f / zoom_amt;
// scale text back up to counter-act zoom level
render_pos = pos * zoom_amt;
- glScalef(inv_zoom_amt, inv_zoom_amt, inv_zoom_amt);
+ gGL.scalef(inv_zoom_amt, inv_zoom_amt, inv_zoom_amt);
}
LLColor4 shadow_color = LLColor4::black;
@@ -573,7 +573,7 @@ void LLManip::renderTickValue(const LLVector3& pos, F32 value, const std::string
gViewerWindow->setup3DViewport();
hud_render_utf8text(val_string, render_pos, *big_fontp, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, -0.5f * big_fontp->getWidthF32(val_string), 3.f, color, hud_selection);
}
- glPopMatrix();
+ gGL.popMatrix();
}
LLColor4 LLManip::setupSnapGuideRenderPass(S32 pass)
diff --git a/indra/newview/llmaniprotate.cpp b/indra/newview/llmaniprotate.cpp
index 43a16f8ed8..a8da94f75e 100644
--- a/indra/newview/llmaniprotate.cpp
+++ b/indra/newview/llmaniprotate.cpp
@@ -53,6 +53,7 @@
#include "llviewercamera.h"
#include "llviewerobject.h"
#include "llviewerobject.h"
+#include "llviewershadermgr.h"
#include "llviewerwindow.h"
#include "llworld.h"
#include "pipeline.h"
@@ -113,7 +114,7 @@ void LLManipRotate::handleSelect()
void LLManipRotate::render()
{
LLGLSUIDefault gls_ui;
- gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+ gGL.getTexUnit(0)->bind(LLViewerFetchedTexture::sWhiteImagep);
LLGLDepthTest gls_depth(GL_TRUE);
LLGLEnable gl_blend(GL_BLEND);
LLGLEnable gls_alpha_test(GL_ALPHA_TEST);
@@ -130,12 +131,12 @@ void LLManipRotate::render()
return;
}
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.pushMatrix();
if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD)
{
F32 zoom = gAgentCamera.mHUDCurZoom;
- glScalef(zoom, zoom, zoom);
+ gGL.scalef(zoom, zoom, zoom);
}
@@ -145,8 +146,9 @@ void LLManipRotate::render()
LLColor4 highlight_inside( 0.7f, 0.7f, 0.f, 0.5f );
F32 width_meters = WIDTH_PIXELS * mRadiusMeters / RADIUS_PIXELS;
- glPushMatrix();
+ gGL.pushMatrix();
{
+
// are we in the middle of a constrained drag?
if (mManipPart >= LL_ROT_X && mManipPart <= LL_ROT_Z)
{
@@ -154,13 +156,18 @@ void LLManipRotate::render()
}
else
{
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gDebugProgram.bind();
+ }
+
LLGLEnable cull_face(GL_CULL_FACE);
LLGLDepthTest gls_depth(GL_FALSE);
- glPushMatrix();
+ gGL.pushMatrix();
{
// Draw "sphere" (intersection of sphere with tangent cone that has apex at camera)
- glTranslatef( mCenterToProfilePlane.mV[VX], mCenterToProfilePlane.mV[VY], mCenterToProfilePlane.mV[VZ] );
- glTranslatef( center.mV[VX], center.mV[VY], center.mV[VZ] );
+ gGL.translatef( mCenterToProfilePlane.mV[VX], mCenterToProfilePlane.mV[VY], mCenterToProfilePlane.mV[VZ] );
+ gGL.translatef( center.mV[VX], center.mV[VY], center.mV[VZ] );
// Inverse change of basis vectors
LLVector3 forward = mCenterToCamNorm;
@@ -177,35 +184,41 @@ void LLManipRotate::render()
LLMatrix4 mat;
mat.initRows(a, b, c, LLVector4(0.f, 0.f, 0.f, 1.f));
- glMultMatrixf( &mat.mMatrix[0][0] );
+ gGL.multMatrix( &mat.mMatrix[0][0] );
- glRotatef( -90, 0.f, 1.f, 0.f);
+ gGL.rotatef( -90, 0.f, 1.f, 0.f);
LLColor4 color;
if (mManipPart == LL_ROT_ROLL || mHighlightedPart == LL_ROT_ROLL)
{
color.setVec(0.8f, 0.8f, 0.8f, 0.8f);
- glScalef(mManipulatorScales.mV[VW], mManipulatorScales.mV[VW], mManipulatorScales.mV[VW]);
+ gGL.scalef(mManipulatorScales.mV[VW], mManipulatorScales.mV[VW], mManipulatorScales.mV[VW]);
}
else
{
color.setVec( 0.7f, 0.7f, 0.7f, 0.6f );
}
+ gGL.diffuseColor4fv(color.mV);
gl_washer_2d(mRadiusMeters + width_meters, mRadiusMeters, CIRCLE_STEPS, color, color);
if (mManipPart == LL_NO_PART)
{
gGL.color4f( 0.7f, 0.7f, 0.7f, 0.3f );
+ gGL.diffuseColor4f(0.7f, 0.7f, 0.7f, 0.3f);
gl_circle_2d( 0, 0, mRadiusMeters, CIRCLE_STEPS, TRUE );
}
- GLdouble plane_eqn[] = { 0, 0, 1, 0 };
- glClipPlane( GL_CLIP_PLANE0, plane_eqn );
+ gGL.flush();
}
- glPopMatrix();
- }
+ gGL.popMatrix();
- glTranslatef( center.mV[VX], center.mV[VY], center.mV[VZ] );
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gUIProgram.bind();
+ }
+ }
+
+ gGL.translatef( center.mV[VX], center.mV[VY], center.mV[VZ] );
LLQuaternion rot;
F32 angle_radians, x, y, z;
@@ -217,41 +230,46 @@ void LLManipRotate::render()
LLSelectMgr::getInstance()->getGrid(grid_origin, grid_rotation, grid_scale);
grid_rotation.getAngleAxis(&angle_radians, &x, &y, &z);
- glRotatef(angle_radians * RAD_TO_DEG, x, y, z);
+ gGL.rotatef(angle_radians * RAD_TO_DEG, x, y, z);
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gDebugProgram.bind();
+ }
+
if (mManipPart == LL_ROT_Z)
{
mManipulatorScales = lerp(mManipulatorScales, LLVector4(1.f, 1.f, SELECTED_MANIPULATOR_SCALE, 1.f), LLCriticalDamp::getInterpolant(MANIPULATOR_SCALE_HALF_LIFE));
- glPushMatrix();
+ gGL.pushMatrix();
{
// selected part
- glScalef(mManipulatorScales.mV[VZ], mManipulatorScales.mV[VZ], mManipulatorScales.mV[VZ]);
+ gGL.scalef(mManipulatorScales.mV[VZ], mManipulatorScales.mV[VZ], mManipulatorScales.mV[VZ]);
renderActiveRing( mRadiusMeters, width_meters, LLColor4( 0.f, 0.f, 1.f, 1.f) , LLColor4( 0.f, 0.f, 1.f, 0.3f ));
}
- glPopMatrix();
+ gGL.popMatrix();
}
else if (mManipPart == LL_ROT_Y)
{
mManipulatorScales = lerp(mManipulatorScales, LLVector4(1.f, SELECTED_MANIPULATOR_SCALE, 1.f, 1.f), LLCriticalDamp::getInterpolant(MANIPULATOR_SCALE_HALF_LIFE));
- glPushMatrix();
+ gGL.pushMatrix();
{
- glRotatef( 90.f, 1.f, 0.f, 0.f );
- glScalef(mManipulatorScales.mV[VY], mManipulatorScales.mV[VY], mManipulatorScales.mV[VY]);
+ gGL.rotatef( 90.f, 1.f, 0.f, 0.f );
+ gGL.scalef(mManipulatorScales.mV[VY], mManipulatorScales.mV[VY], mManipulatorScales.mV[VY]);
renderActiveRing( mRadiusMeters, width_meters, LLColor4( 0.f, 1.f, 0.f, 1.f), LLColor4( 0.f, 1.f, 0.f, 0.3f));
}
- glPopMatrix();
+ gGL.popMatrix();
}
else if (mManipPart == LL_ROT_X)
{
mManipulatorScales = lerp(mManipulatorScales, LLVector4(SELECTED_MANIPULATOR_SCALE, 1.f, 1.f, 1.f), LLCriticalDamp::getInterpolant(MANIPULATOR_SCALE_HALF_LIFE));
- glPushMatrix();
+ gGL.pushMatrix();
{
- glRotatef( 90.f, 0.f, 1.f, 0.f );
- glScalef(mManipulatorScales.mV[VX], mManipulatorScales.mV[VX], mManipulatorScales.mV[VX]);
+ gGL.rotatef( 90.f, 0.f, 1.f, 0.f );
+ gGL.scalef(mManipulatorScales.mV[VX], mManipulatorScales.mV[VX], mManipulatorScales.mV[VX]);
renderActiveRing( mRadiusMeters, width_meters, LLColor4( 1.f, 0.f, 0.f, 1.f), LLColor4( 1.f, 0.f, 0.f, 0.3f));
}
- glPopMatrix();
+ gGL.popMatrix();
}
else if (mManipPart == LL_ROT_ROLL)
{
@@ -271,12 +289,13 @@ void LLManipRotate::render()
// First pass: centers. Second pass: sides.
for( S32 i=0; i<2; i++ )
{
- glPushMatrix();
+
+ gGL.pushMatrix();
{
if (mHighlightedPart == LL_ROT_Z)
{
mManipulatorScales = lerp(mManipulatorScales, LLVector4(1.f, 1.f, SELECTED_MANIPULATOR_SCALE, 1.f), LLCriticalDamp::getInterpolant(MANIPULATOR_SCALE_HALF_LIFE));
- glScalef(mManipulatorScales.mV[VZ], mManipulatorScales.mV[VZ], mManipulatorScales.mV[VZ]);
+ gGL.scalef(mManipulatorScales.mV[VZ], mManipulatorScales.mV[VZ], mManipulatorScales.mV[VZ]);
// hovering over part
gl_ring( mRadiusMeters, width_meters, LLColor4( 0.f, 0.f, 1.f, 1.f ), LLColor4( 0.f, 0.f, 1.f, 0.5f ), CIRCLE_STEPS, i);
}
@@ -286,15 +305,15 @@ void LLManipRotate::render()
gl_ring( mRadiusMeters, width_meters, LLColor4( 0.f, 0.f, 0.8f, 0.8f ), LLColor4( 0.f, 0.f, 0.8f, 0.4f ), CIRCLE_STEPS, i);
}
}
- glPopMatrix();
-
- glPushMatrix();
+ gGL.popMatrix();
+
+ gGL.pushMatrix();
{
- glRotatef( 90.f, 1.f, 0.f, 0.f );
+ gGL.rotatef( 90.f, 1.f, 0.f, 0.f );
if (mHighlightedPart == LL_ROT_Y)
{
mManipulatorScales = lerp(mManipulatorScales, LLVector4(1.f, SELECTED_MANIPULATOR_SCALE, 1.f, 1.f), LLCriticalDamp::getInterpolant(MANIPULATOR_SCALE_HALF_LIFE));
- glScalef(mManipulatorScales.mV[VY], mManipulatorScales.mV[VY], mManipulatorScales.mV[VY]);
+ gGL.scalef(mManipulatorScales.mV[VY], mManipulatorScales.mV[VY], mManipulatorScales.mV[VY]);
// hovering over part
gl_ring( mRadiusMeters, width_meters, LLColor4( 0.f, 1.f, 0.f, 1.f ), LLColor4( 0.f, 1.f, 0.f, 0.5f ), CIRCLE_STEPS, i);
}
@@ -304,15 +323,15 @@ void LLManipRotate::render()
gl_ring( mRadiusMeters, width_meters, LLColor4( 0.f, 0.8f, 0.f, 0.8f ), LLColor4( 0.f, 0.8f, 0.f, 0.4f ), CIRCLE_STEPS, i);
}
}
- glPopMatrix();
+ gGL.popMatrix();
- glPushMatrix();
+ gGL.pushMatrix();
{
- glRotatef( 90.f, 0.f, 1.f, 0.f );
+ gGL.rotatef( 90.f, 0.f, 1.f, 0.f );
if (mHighlightedPart == LL_ROT_X)
{
mManipulatorScales = lerp(mManipulatorScales, LLVector4(SELECTED_MANIPULATOR_SCALE, 1.f, 1.f, 1.f), LLCriticalDamp::getInterpolant(MANIPULATOR_SCALE_HALF_LIFE));
- glScalef(mManipulatorScales.mV[VX], mManipulatorScales.mV[VX], mManipulatorScales.mV[VX]);
+ gGL.scalef(mManipulatorScales.mV[VX], mManipulatorScales.mV[VX], mManipulatorScales.mV[VX]);
// hovering over part
gl_ring( mRadiusMeters, width_meters, LLColor4( 1.f, 0.f, 0.f, 1.f ), LLColor4( 1.f, 0.f, 0.f, 0.5f ), CIRCLE_STEPS, i);
@@ -323,17 +342,26 @@ void LLManipRotate::render()
gl_ring( mRadiusMeters, width_meters, LLColor4( 0.8f, 0.f, 0.f, 0.8f ), LLColor4( 0.8f, 0.f, 0.f, 0.4f ), CIRCLE_STEPS, i);
}
}
- glPopMatrix();
+ gGL.popMatrix();
if (mHighlightedPart == LL_ROT_ROLL)
{
mManipulatorScales = lerp(mManipulatorScales, LLVector4(1.f, 1.f, 1.f, SELECTED_MANIPULATOR_SCALE), LLCriticalDamp::getInterpolant(MANIPULATOR_SCALE_HALF_LIFE));
}
+
}
+
}
+
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gUIProgram.bind();
+ }
+
}
- glPopMatrix();
- glPopMatrix();
+ gGL.popMatrix();
+ gGL.popMatrix();
+
LLVector3 euler_angles;
LLQuaternion object_rot = first_object->getRotationEdit();
@@ -796,14 +824,14 @@ void LLManipRotate::renderSnapGuides()
for (S32 pass = 0; pass < 3; pass++)
{
// render snap guide ring
- glPushMatrix();
+ gGL.pushMatrix();
LLQuaternion snap_guide_rot;
F32 angle_radians, x, y, z;
snap_guide_rot.shortestArc(LLVector3::z_axis, getConstraintAxis());
snap_guide_rot.getAngleAxis(&angle_radians, &x, &y, &z);
- glTranslatef(center.mV[VX], center.mV[VY], center.mV[VZ]);
- glRotatef(angle_radians * RAD_TO_DEG, x, y, z);
+ gGL.translatef(center.mV[VX], center.mV[VY], center.mV[VZ]);
+ gGL.rotatef(angle_radians * RAD_TO_DEG, x, y, z);
LLColor4 line_color = setupSnapGuideRenderPass(pass);
@@ -826,7 +854,7 @@ void LLManipRotate::renderSnapGuides()
{
gl_circle_2d(0.f, 0.f, mRadiusMeters * SNAP_GUIDE_INNER_RADIUS, CIRCLE_STEPS, FALSE);
}
- glPopMatrix();
+ gGL.popMatrix();
for (S32 i = 0; i < 64; i++)
{
@@ -901,32 +929,32 @@ void LLManipRotate::renderSnapGuides()
{
if (i == 0)
{
- renderTickText(text_point, mObjectSelection->isAttachment() ? LLTrans::getString("Forward") : LLTrans::getString("East"), LLColor4::white);
+ renderTickText(text_point, mObjectSelection->isAttachment() ? LLTrans::getString("Direction_Forward") : LLTrans::getString("Direction_East"), LLColor4::white);
}
else if (i == 16)
{
if (constraint_axis.mV[VZ] > 0.f)
{
- renderTickText(text_point, mObjectSelection->isAttachment() ? LLTrans::getString("Left") : LLTrans::getString("North"), LLColor4::white);
+ renderTickText(text_point, mObjectSelection->isAttachment() ? LLTrans::getString("Direction_Left") : LLTrans::getString("Direction_North"), LLColor4::white);
}
else
{
- renderTickText(text_point, mObjectSelection->isAttachment() ? LLTrans::getString("Right") : LLTrans::getString("South"), LLColor4::white);
+ renderTickText(text_point, mObjectSelection->isAttachment() ? LLTrans::getString("Direction_Right") : LLTrans::getString("Direction_South"), LLColor4::white);
}
}
else if (i == 32)
{
- renderTickText(text_point, mObjectSelection->isAttachment() ? LLTrans::getString("Back") : LLTrans::getString("West"), LLColor4::white);
+ renderTickText(text_point, mObjectSelection->isAttachment() ? LLTrans::getString("Direction_Back") : LLTrans::getString("Direction_West"), LLColor4::white);
}
else
{
if (constraint_axis.mV[VZ] > 0.f)
{
- renderTickText(text_point, mObjectSelection->isAttachment() ? LLTrans::getString("Right") : LLTrans::getString("South"), LLColor4::white);
+ renderTickText(text_point, mObjectSelection->isAttachment() ? LLTrans::getString("Direction_Right") : LLTrans::getString("Direction_South"), LLColor4::white);
}
else
{
- renderTickText(text_point, mObjectSelection->isAttachment() ? LLTrans::getString("Left") : LLTrans::getString("North"), LLColor4::white);
+ renderTickText(text_point, mObjectSelection->isAttachment() ? LLTrans::getString("Direction_Left") : LLTrans::getString("Direction_North"), LLColor4::white);
}
}
}
@@ -934,32 +962,32 @@ void LLManipRotate::renderSnapGuides()
{
if (i == 0)
{
- renderTickText(text_point, mObjectSelection->isAttachment() ? LLTrans::getString("Left") : LLTrans::getString("North"), LLColor4::white);
+ renderTickText(text_point, mObjectSelection->isAttachment() ? LLTrans::getString("Direction_Left") : LLTrans::getString("Direction_North"), LLColor4::white);
}
else if (i == 16)
{
if (constraint_axis.mV[VX] > 0.f)
{
- renderTickText(text_point, LLTrans::getString("Up"), LLColor4::white);
+ renderTickText(text_point, LLTrans::getString("Direction_Up"), LLColor4::white);
}
else
{
- renderTickText(text_point, LLTrans::getString("Down"), LLColor4::white);
+ renderTickText(text_point, LLTrans::getString("Direction_Down"), LLColor4::white);
}
}
else if (i == 32)
{
- renderTickText(text_point, mObjectSelection->isAttachment() ? LLTrans::getString("Right") : LLTrans::getString("South"), LLColor4::white);
+ renderTickText(text_point, mObjectSelection->isAttachment() ? LLTrans::getString("Direction_Right") : LLTrans::getString("Direction_South"), LLColor4::white);
}
else
{
if (constraint_axis.mV[VX] > 0.f)
{
- renderTickText(text_point, LLTrans::getString("Down"), LLColor4::white);
+ renderTickText(text_point, LLTrans::getString("Direction_Down"), LLColor4::white);
}
else
{
- renderTickText(text_point, LLTrans::getString("Up"), LLColor4::white);
+ renderTickText(text_point, LLTrans::getString("Direction_Up"), LLColor4::white);
}
}
}
@@ -967,32 +995,32 @@ void LLManipRotate::renderSnapGuides()
{
if (i == 0)
{
- renderTickText(text_point, LLTrans::getString("Up"), LLColor4::white);
+ renderTickText(text_point, LLTrans::getString("Direction_Up"), LLColor4::white);
}
else if (i == 16)
{
if (constraint_axis.mV[VY] > 0.f)
{
- renderTickText(text_point, mObjectSelection->isAttachment() ? LLTrans::getString("Forward") : LLTrans::getString("East"), LLColor4::white);
+ renderTickText(text_point, mObjectSelection->isAttachment() ? LLTrans::getString("Direction_Forward") : LLTrans::getString("Direction_East"), LLColor4::white);
}
else
{
- renderTickText(text_point, mObjectSelection->isAttachment() ? LLTrans::getString("Back") : LLTrans::getString("West"), LLColor4::white);
+ renderTickText(text_point, mObjectSelection->isAttachment() ? LLTrans::getString("Direction_Back") : LLTrans::getString("Direction_West"), LLColor4::white);
}
}
else if (i == 32)
{
- renderTickText(text_point, LLTrans::getString("Down"), LLColor4::white);
+ renderTickText(text_point, LLTrans::getString("Direction_Down"), LLColor4::white);
}
else
{
if (constraint_axis.mV[VY] > 0.f)
{
- renderTickText(text_point, mObjectSelection->isAttachment() ? LLTrans::getString("Back") : LLTrans::getString("West"), LLColor4::white);
+ renderTickText(text_point, mObjectSelection->isAttachment() ? LLTrans::getString("Direction_Back") : LLTrans::getString("Direction_West"), LLColor4::white);
}
else
{
- renderTickText(text_point, mObjectSelection->isAttachment() ? LLTrans::getString("Forward") : LLTrans::getString("East"), LLColor4::white);
+ renderTickText(text_point, mObjectSelection->isAttachment() ? LLTrans::getString("Direction_Forward") : LLTrans::getString("Direction_East"), LLColor4::white);
}
}
}
@@ -1127,7 +1155,7 @@ BOOL LLManipRotate::updateVisiblity()
if (gSavedSettings.getBOOL("LimitSelectDistance"))
{
F32 max_select_distance = gSavedSettings.getF32("MaxSelectDistance");
- if (dist_vec(gAgent.getPositionAgent(), center) > max_select_distance)
+ if (dist_vec_squared(gAgent.getPositionAgent(), center) > (max_select_distance * max_select_distance))
{
visible = FALSE;
}
diff --git a/indra/newview/llmanipscale.cpp b/indra/newview/llmanipscale.cpp
index 060677f9f3..f6df4cdfbf 100644
--- a/indra/newview/llmanipscale.cpp
+++ b/indra/newview/llmanipscale.cpp
@@ -52,11 +52,13 @@
#include "llui.h"
#include "llviewercamera.h"
#include "llviewerobject.h"
+#include "llviewerregion.h"
#include "llviewerwindow.h"
#include "llhudrender.h"
#include "llworld.h"
#include "v2math.h"
#include "llvoavatar.h"
+#include "llmeshrepository.h"
const F32 MAX_MANIP_SELECT_DISTANCE_SQUARED = 11.f * 11.f;
@@ -85,6 +87,20 @@ const LLManip::EManipPart MANIPULATOR_IDS[NUM_MANIPULATORS] =
};
+F32 get_default_max_prim_scale(bool is_flora)
+{
+ // a bit of a hack, but if it's foilage, we don't want to use the
+ // new larger scale which would result in giant trees and grass
+ if (gMeshRepo.meshRezEnabled() &&
+ !is_flora)
+ {
+ return DEFAULT_MAX_PRIM_SCALE;
+ }
+ else
+ {
+ return DEFAULT_MAX_PRIM_SCALE_NO_MESH;
+ }
+}
// static
void LLManipScale::setUniform(BOOL b)
@@ -201,12 +217,12 @@ void LLManipScale::render()
if( canAffectSelection() )
{
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.pushMatrix();
if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD)
{
F32 zoom = gAgentCamera.mHUDCurZoom;
- glScalef(zoom, zoom, zoom);
+ gGL.scalef(zoom, zoom, zoom);
}
////////////////////////////////////////////////////////////////////////
@@ -217,8 +233,6 @@ void LLManipScale::render()
LLVector3 center_agent = gAgent.getPosAgentFromGlobal(LLSelectMgr::getInstance()->getSelectionCenterGlobal());
- F32 range;
- F32 range_from_agent;
if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD)
{
mBoxHandleSize = BOX_HANDLE_BASE_SIZE * BOX_HANDLE_BASE_FACTOR / (F32) LLViewerCamera::getInstance()->getViewHeightInPixels();
@@ -226,25 +240,25 @@ void LLManipScale::render()
}
else
{
- range = dist_vec(gAgentCamera.getCameraPositionAgent(), center_agent);
- range_from_agent = dist_vec(gAgent.getPositionAgent(), center_agent);
+ F32 range_squared = dist_vec_squared(gAgentCamera.getCameraPositionAgent(), center_agent);
+ F32 range_from_agent_squared = dist_vec_squared(gAgent.getPositionAgent(), center_agent);
// Don't draw manip if object too far away
if (gSavedSettings.getBOOL("LimitSelectDistance"))
{
F32 max_select_distance = gSavedSettings.getF32("MaxSelectDistance");
- if (range_from_agent > max_select_distance)
+ if (range_from_agent_squared > max_select_distance * max_select_distance)
{
return;
}
}
- if (range > 0.001f)
+ if (range_squared > 0.001f * 0.001f)
{
// range != zero
F32 fraction_of_fov = BOX_HANDLE_BASE_SIZE / (F32) LLViewerCamera::getInstance()->getViewHeightInPixels();
F32 apparent_angle = fraction_of_fov * LLViewerCamera::getInstance()->getView(); // radians
- mBoxHandleSize = range * tan(apparent_angle) * BOX_HANDLE_BASE_FACTOR;
+ mBoxHandleSize = (F32) sqrtf(range_squared) * tan(apparent_angle) * BOX_HANDLE_BASE_FACTOR;
}
else
{
@@ -260,14 +274,14 @@ void LLManipScale::render()
LLVector3 pos_agent = bbox.getPositionAgent();
LLQuaternion rot = bbox.getRotation();
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.pushMatrix();
{
- glTranslatef(pos_agent.mV[VX], pos_agent.mV[VY], pos_agent.mV[VZ]);
+ gGL.translatef(pos_agent.mV[VX], pos_agent.mV[VY], pos_agent.mV[VZ]);
F32 angle_radians, x, y, z;
rot.getAngleAxis(&angle_radians, &x, &y, &z);
- glRotatef(angle_radians * RAD_TO_DEG, x, y, z);
+ gGL.rotatef(angle_radians * RAD_TO_DEG, x, y, z);
{
@@ -289,13 +303,13 @@ void LLManipScale::render()
glPolygonOffset( 0.f, 0.f);
}
}
- glPopMatrix();
+ gGL.popMatrix();
if (mManipPart != LL_NO_PART)
{
renderSnapGuides(bbox);
}
- glPopMatrix();
+ gGL.popMatrix();
renderXYZ(bbox.getExtentLocal());
}
@@ -705,17 +719,17 @@ void LLManipScale::renderEdges( const LLBBox& bbox )
LLVector3 direction = edgeToUnitVector( part );
LLVector3 center_to_edge = unitVectorToLocalBBoxExtent( direction, bbox );
- glPushMatrix();
+ gGL.pushMatrix();
{
- glTranslatef( center_to_edge.mV[0], center_to_edge.mV[1], center_to_edge.mV[2] );
+ gGL.translatef( center_to_edge.mV[0], center_to_edge.mV[1], center_to_edge.mV[2] );
conditionalHighlight( part );
- glScalef(
+ gGL.scalef(
direction.mV[0] ? edge_width : extent.mV[VX],
direction.mV[1] ? edge_width : extent.mV[VY],
direction.mV[2] ? edge_width : extent.mV[VZ] );
gBox.render();
}
- glPopMatrix();
+ gGL.popMatrix();
}
}
@@ -752,13 +766,13 @@ void LLManipScale::renderBoxHandle( F32 x, F32 y, F32 z )
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
LLGLDepthTest gls_depth(GL_FALSE);
- glPushMatrix();
+ gGL.pushMatrix();
{
- glTranslatef( x, y, z );
- glScalef( mScaledBoxHandleSize, mScaledBoxHandleSize, mScaledBoxHandleSize );
+ gGL.translatef( x, y, z );
+ gGL.scalef( mScaledBoxHandleSize, mScaledBoxHandleSize, mScaledBoxHandleSize );
gBox.render();
}
- glPopMatrix();
+ gGL.popMatrix();
}
@@ -774,16 +788,16 @@ void LLManipScale::renderAxisHandle( const LLVector3& start, const LLVector3& en
LLVector3 delta = end - offset_start;
LLVector3 pos = offset_start + 0.5f * delta;
- glPushMatrix();
+ gGL.pushMatrix();
{
- glTranslatef( pos.mV[VX], pos.mV[VY], pos.mV[VZ] );
- glScalef(
+ gGL.translatef( pos.mV[VX], pos.mV[VY], pos.mV[VZ] );
+ gGL.scalef(
mBoxHandleSize + llabs(delta.mV[VX]),
mBoxHandleSize + llabs(delta.mV[VY]),
mBoxHandleSize + llabs(delta.mV[VZ]));
gBox.render();
}
- glPopMatrix();
+ gGL.popMatrix();
}
else
{
@@ -950,8 +964,8 @@ void LLManipScale::dragCorner( S32 x, S32 y )
mInSnapRegime = FALSE;
}
- F32 max_scale_factor = DEFAULT_MAX_PRIM_SCALE / MIN_PRIM_SCALE;
- F32 min_scale_factor = MIN_PRIM_SCALE / DEFAULT_MAX_PRIM_SCALE;
+ F32 max_scale_factor = get_default_max_prim_scale() / MIN_PRIM_SCALE;
+ F32 min_scale_factor = MIN_PRIM_SCALE / get_default_max_prim_scale();
// find max and min scale factors that will make biggest object hit max absolute scale and smallest object hit min absolute scale
for (LLObjectSelection::iterator iter = mObjectSelection->begin();
@@ -963,7 +977,7 @@ void LLManipScale::dragCorner( S32 x, S32 y )
{
const LLVector3& scale = selectNode->mSavedScale;
- F32 cur_max_scale_factor = llmin( DEFAULT_MAX_PRIM_SCALE / scale.mV[VX], DEFAULT_MAX_PRIM_SCALE / scale.mV[VY], DEFAULT_MAX_PRIM_SCALE / scale.mV[VZ] );
+ F32 cur_max_scale_factor = llmin( get_default_max_prim_scale(LLPickInfo::isFlora(cur)) / scale.mV[VX], get_default_max_prim_scale(LLPickInfo::isFlora(cur)) / scale.mV[VY], get_default_max_prim_scale(LLPickInfo::isFlora(cur)) / scale.mV[VZ] );
max_scale_factor = llmin( max_scale_factor, cur_max_scale_factor );
F32 cur_min_scale_factor = llmax( MIN_PRIM_SCALE / scale.mV[VX], MIN_PRIM_SCALE / scale.mV[VY], MIN_PRIM_SCALE / scale.mV[VZ] );
@@ -1260,7 +1274,7 @@ void LLManipScale::stretchFace( const LLVector3& drag_start_agent, const LLVecto
F32 denom = axis * dir_local;
F32 desired_delta_size = is_approx_zero(denom) ? 0.f : (delta_local_mag / denom); // in meters
- F32 desired_scale = llclamp(selectNode->mSavedScale.mV[axis_index] + desired_delta_size, MIN_PRIM_SCALE, DEFAULT_MAX_PRIM_SCALE);
+ F32 desired_scale = llclamp(selectNode->mSavedScale.mV[axis_index] + desired_delta_size, MIN_PRIM_SCALE, get_default_max_prim_scale(LLPickInfo::isFlora(cur)));
// propagate scale constraint back to position offset
desired_delta_size = desired_scale - selectNode->mSavedScale.mV[axis_index]; // propagate constraint back to position
@@ -1960,7 +1974,7 @@ F32 LLManipScale::partToMaxScale( S32 part, const LLBBox &bbox ) const
max_extent = bbox_extents.mV[i];
}
}
- max_scale_factor = bbox_extents.magVec() * DEFAULT_MAX_PRIM_SCALE / max_extent;
+ max_scale_factor = bbox_extents.magVec() * get_default_max_prim_scale() / max_extent;
if (getUniform())
{
@@ -1975,7 +1989,7 @@ F32 LLManipScale::partToMinScale( S32 part, const LLBBox &bbox ) const
{
LLVector3 bbox_extents = unitVectorToLocalBBoxExtent( partToUnitVector( part ), bbox );
bbox_extents.abs();
- F32 min_extent = DEFAULT_MAX_PRIM_SCALE;
+ F32 min_extent = get_default_max_prim_scale();
for (U32 i = VX; i <= VZ; i++)
{
if (bbox_extents.mV[i] > 0.f && bbox_extents.mV[i] < min_extent)
diff --git a/indra/newview/llmanipscale.h b/indra/newview/llmanipscale.h
index 5559f557c0..5cb8898fd0 100644
--- a/indra/newview/llmanipscale.h
+++ b/indra/newview/llmanipscale.h
@@ -39,6 +39,9 @@
#include "llviewerobject.h"
#include "llbbox.h"
+
+F32 get_default_max_prim_scale(bool is_flora = false);
+
class LLToolComposite;
class LLColor4;
diff --git a/indra/newview/llmaniptranslate.cpp b/indra/newview/llmaniptranslate.cpp
index f871df0c36..3a88fbd96d 100644
--- a/indra/newview/llmaniptranslate.cpp
+++ b/indra/newview/llmaniptranslate.cpp
@@ -1066,12 +1066,12 @@ BOOL LLManipTranslate::handleMouseUp(S32 x, S32 y, MASK mask)
void LLManipTranslate::render()
{
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.pushMatrix();
if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD)
{
F32 zoom = gAgentCamera.mHUDCurZoom;
- glScalef(zoom, zoom, zoom);
+ gGL.scalef(zoom, zoom, zoom);
}
{
LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE);
@@ -1515,11 +1515,12 @@ void LLManipTranslate::renderSnapGuides()
F32 x,y,z,angle_radians;
grid_rotation.getAngleAxis(&angle_radians, &x, &y, &z);
gGL.translatef(selection_center.mV[VX], selection_center.mV[VY], selection_center.mV[VZ]);
- glRotatef(angle_radians * RAD_TO_DEG, x, y, z);
+ gGL.rotatef(angle_radians * RAD_TO_DEG, x, y, z);
F32 sz = mGridSizeMeters;
F32 tiles = sz;
- glMatrixMode(GL_TEXTURE);
+
+ gGL.matrixMode(LLRender::MM_TEXTURE);
gGL.pushMatrix();
usc = 1.0f/usc;
vsc = 1.0f/vsc;
@@ -1533,7 +1534,7 @@ void LLManipTranslate::renderSnapGuides()
vsc *= 0.5f;
}
- glScalef(usc, vsc, 1.0f);
+ gGL.scalef(usc, vsc, 1.0f);
gGL.translatef(u, v, 0);
float a = line_alpha;
@@ -1566,7 +1567,7 @@ void LLManipTranslate::renderSnapGuides()
renderGrid(u,v,tiles,1,1,1,a);
gGL.popMatrix();
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.popMatrix();
}
@@ -1665,7 +1666,7 @@ void LLManipTranslate::highlightIntersection(LLVector3 normal,
glStencilFunc(GL_ALWAYS, 0, stencil_mask);
gGL.setColorMask(false, false);
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- glColor4f(1,1,1,1);
+ gGL.diffuseColor4f(1,1,1,1);
//setup clip plane
normal = normal * grid_rotation;
@@ -1723,7 +1724,7 @@ void LLManipTranslate::highlightIntersection(LLVector3 normal,
F32 x,y,z,angle_radians;
grid_rotation.getAngleAxis(&angle_radians, &x, &y, &z);
gGL.translatef(selection_center.mV[VX], selection_center.mV[VY], selection_center.mV[VZ]);
- glRotatef(angle_radians * RAD_TO_DEG, x, y, z);
+ gGL.rotatef(angle_radians * RAD_TO_DEG, x, y, z);
F32 sz = mGridSizeMeters;
F32 tiles = sz;
@@ -1852,7 +1853,7 @@ void LLManipTranslate::renderTranslationHandles()
mGridSizeMeters = gSavedSettings.getF32("GridDrawSize");
mConeSize = mArrowLengthMeters / 4.f;
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.pushMatrix();
{
gGL.translatef(selection_center.mV[VX], selection_center.mV[VY], selection_center.mV[VZ]);
@@ -1860,7 +1861,7 @@ void LLManipTranslate::renderTranslationHandles()
F32 angle_radians, x, y, z;
grid_rotation.getAngleAxis(&angle_radians, &x, &y, &z);
- glRotatef(angle_radians * RAD_TO_DEG, x, y, z);
+ gGL.rotatef(angle_radians * RAD_TO_DEG, x, y, z);
LLQuaternion invRotation = grid_rotation;
invRotation.conjQuat();
@@ -1908,9 +1909,9 @@ void LLManipTranslate::renderTranslationHandles()
{
// render YZ plane manipulator
gGL.pushMatrix();
- glScalef(mPlaneManipPositions.mV[VX], mPlaneManipPositions.mV[VY], mPlaneManipPositions.mV[VZ]);
+ gGL.scalef(mPlaneManipPositions.mV[VX], mPlaneManipPositions.mV[VY], mPlaneManipPositions.mV[VZ]);
gGL.translatef(0.f, mPlaneManipOffsetMeters, mPlaneManipOffsetMeters);
- glScalef(mPlaneScales.mV[VX], mPlaneScales.mV[VX], mPlaneScales.mV[VX]);
+ gGL.scalef(mPlaneScales.mV[VX], mPlaneScales.mV[VX], mPlaneScales.mV[VX]);
if (mHighlightedPart == LL_YZ_PLANE)
{
color1.setVec(0.f, 1.f, 0.f, 1.f);
@@ -1962,9 +1963,9 @@ void LLManipTranslate::renderTranslationHandles()
{
// render XZ plane manipulator
gGL.pushMatrix();
- glScalef(mPlaneManipPositions.mV[VX], mPlaneManipPositions.mV[VY], mPlaneManipPositions.mV[VZ]);
+ gGL.scalef(mPlaneManipPositions.mV[VX], mPlaneManipPositions.mV[VY], mPlaneManipPositions.mV[VZ]);
gGL.translatef(mPlaneManipOffsetMeters, 0.f, mPlaneManipOffsetMeters);
- glScalef(mPlaneScales.mV[VY], mPlaneScales.mV[VY], mPlaneScales.mV[VY]);
+ gGL.scalef(mPlaneScales.mV[VY], mPlaneScales.mV[VY], mPlaneScales.mV[VY]);
if (mHighlightedPart == LL_XZ_PLANE)
{
color1.setVec(0.f, 0.f, 1.f, 1.f);
@@ -2018,7 +2019,7 @@ void LLManipTranslate::renderTranslationHandles()
{
// render XY plane manipulator
gGL.pushMatrix();
- glScalef(mPlaneManipPositions.mV[VX], mPlaneManipPositions.mV[VY], mPlaneManipPositions.mV[VZ]);
+ gGL.scalef(mPlaneManipPositions.mV[VX], mPlaneManipPositions.mV[VY], mPlaneManipPositions.mV[VZ]);
/* Y
^
@@ -2043,7 +2044,7 @@ void LLManipTranslate::renderTranslationHandles()
v2 = LLVector3(mPlaneManipOffsetMeters * ( PLANE_TICK_SIZE * 0.25f), mPlaneManipOffsetMeters * ( PLANE_TICK_SIZE * 0.25f), 0.f);
v3 = LLVector3(mPlaneManipOffsetMeters * (-PLANE_TICK_SIZE * 0.75f), mPlaneManipOffsetMeters * ( PLANE_TICK_SIZE * 0.25f), 0.f);
#endif
- glScalef(mPlaneScales.mV[VZ], mPlaneScales.mV[VZ], mPlaneScales.mV[VZ]);
+ gGL.scalef(mPlaneScales.mV[VZ], mPlaneScales.mV[VZ], mPlaneScales.mV[VZ]);
if (mHighlightedPart == LL_XY_PLANE)
{
color1.setVec(1.f, 0.f, 0.f, 1.f);
@@ -2215,7 +2216,7 @@ void LLManipTranslate::renderArrow(S32 which_arrow, S32 selected_arrow, F32 box_
}
gGL.translatef(vec.mV[0], vec.mV[1], vec.mV[2]);
- glScalef(handle_size, handle_size, handle_size);
+ gGL.scalef(handle_size, handle_size, handle_size);
F32 rot = 0.0f;
LLVector3 axis;
@@ -2239,11 +2240,11 @@ void LLManipTranslate::renderArrow(S32 which_arrow, S32 selected_arrow, F32 box_
break;
}
- glColor4fv(color.mV);
- glRotatef(rot, axis.mV[0], axis.mV[1], axis.mV[2]);
- glScalef(mArrowScales.mV[index], mArrowScales.mV[index], mArrowScales.mV[index] * 1.5f);
+ gGL.diffuseColor4fv(color.mV);
+ gGL.rotatef(rot, axis.mV[0], axis.mV[1], axis.mV[2]);
+ gGL.scalef(mArrowScales.mV[index], mArrowScales.mV[index], mArrowScales.mV[index] * 1.5f);
- gCone.render(CONE_LOD_HIGHEST);
+ gCone.render();
gGL.popMatrix();
}
diff --git a/indra/newview/llmarketplacefunctions.cpp b/indra/newview/llmarketplacefunctions.cpp
new file mode 100644
index 0000000000..93dd82957f
--- /dev/null
+++ b/indra/newview/llmarketplacefunctions.cpp
@@ -0,0 +1,478 @@
+/**
+ * @file llmarketplacefunctions.cpp
+ * @brief Implementation of assorted functions related to the marketplace
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llmarketplacefunctions.h"
+
+#include "llagent.h"
+#include "llhttpclient.h"
+#include "lltimer.h"
+#include "lltrans.h"
+#include "llviewercontrol.h"
+#include "llviewermedia.h"
+#include "llviewernetwork.h"
+
+
+//
+// Helpers
+//
+
+static std::string getMarketplaceDomain()
+{
+ std::string domain = "secondlife.com";
+
+ if (!LLGridManager::getInstance()->isInProductionGrid())
+ {
+ const std::string& grid_label = LLGridManager::getInstance()->getGridLabel();
+ const std::string& grid_label_lower = utf8str_tolower(grid_label);
+
+ if (grid_label_lower == "damballah")
+ {
+ domain = "secondlife-staging.com";
+ }
+ else
+ {
+ domain = llformat("%s.lindenlab.com", grid_label_lower.c_str());
+ }
+ }
+
+ return domain;
+}
+
+static std::string getMarketplaceURL(const std::string& urlStringName)
+{
+ LLStringUtil::format_map_t domain_arg;
+ domain_arg["[MARKETPLACE_DOMAIN_NAME]"] = getMarketplaceDomain();
+
+ std::string marketplace_url = LLTrans::getString(urlStringName, domain_arg);
+
+ return marketplace_url;
+}
+
+LLSD getMarketplaceStringSubstitutions()
+{
+ std::string marketplace_url = getMarketplaceURL("MarketplaceURL");
+ std::string marketplace_url_create = getMarketplaceURL("MarketplaceURL_CreateStore");
+ std::string marketplace_url_dashboard = getMarketplaceURL("MarketplaceURL_Dashboard");
+ std::string marketplace_url_imports = getMarketplaceURL("MarketplaceURL_Imports");
+ std::string marketplace_url_info = getMarketplaceURL("MarketplaceURL_LearnMore");
+
+ LLSD marketplace_sub_map;
+
+ marketplace_sub_map["[MARKETPLACE_URL]"] = marketplace_url;
+ marketplace_sub_map["[MARKETPLACE_CREATE_STORE_URL]"] = marketplace_url_create;
+ marketplace_sub_map["[MARKETPLACE_LEARN_MORE_URL]"] = marketplace_url_info;
+ marketplace_sub_map["[MARKETPLACE_DASHBOARD_URL]"] = marketplace_url_dashboard;
+ marketplace_sub_map["[MARKETPLACE_IMPORTS_URL]"] = marketplace_url_imports;
+
+ return marketplace_sub_map;
+}
+
+namespace LLMarketplaceImport
+{
+ // Basic interface for this namespace
+
+ bool hasSessionCookie();
+ bool inProgress();
+ bool resultPending();
+ U32 getResultStatus();
+ const LLSD& getResults();
+
+ bool establishMarketplaceSessionCookie();
+ bool pollStatus();
+ bool triggerImport();
+
+ // Internal state variables
+
+ static std::string sMarketplaceCookie = "";
+ static LLSD sImportId = LLSD::emptyMap();
+ static bool sImportInProgress = false;
+ static bool sImportPostPending = false;
+ static bool sImportGetPending = false;
+ static U32 sImportResultStatus = 0;
+ static LLSD sImportResults = LLSD::emptyMap();
+
+ static LLTimer slmGetTimer;
+ static LLTimer slmPostTimer;
+
+ // Responders
+
+ class LLImportPostResponder : public LLHTTPClient::Responder
+ {
+ public:
+ LLImportPostResponder() : LLCurl::Responder() {}
+
+ void completed(U32 status, const std::string& reason, const LLSD& content)
+ {
+ slmPostTimer.stop();
+
+ if (gSavedSettings.getBOOL("InventoryOutboxLogging"))
+ {
+ llinfos << " SLM POST status: " << status << llendl;
+ llinfos << " SLM POST reason: " << reason << llendl;
+ llinfos << " SLM POST content: " << content.asString() << llendl;
+
+ llinfos << " SLM POST timer: " << slmPostTimer.getElapsedTimeF32() << llendl;
+ }
+
+ if ((status == MarketplaceErrorCodes::IMPORT_REDIRECT) ||
+ (status == MarketplaceErrorCodes::IMPORT_AUTHENTICATION_ERROR) ||
+ (status == MarketplaceErrorCodes::IMPORT_JOB_TIMEOUT))
+ {
+ if (gSavedSettings.getBOOL("InventoryOutboxLogging"))
+ {
+ llinfos << " SLM POST clearing marketplace cookie due to authentication failure or timeout" << llendl;
+ }
+
+ sMarketplaceCookie.clear();
+ }
+
+ sImportInProgress = (status == MarketplaceErrorCodes::IMPORT_DONE);
+ sImportPostPending = false;
+ sImportResultStatus = status;
+ sImportId = content;
+ }
+ };
+
+ class LLImportGetResponder : public LLHTTPClient::Responder
+ {
+ public:
+ LLImportGetResponder() : LLCurl::Responder() {}
+
+ void completedHeader(U32 status, const std::string& reason, const LLSD& content)
+ {
+ const std::string& set_cookie_string = content["set-cookie"].asString();
+
+ if (!set_cookie_string.empty())
+ {
+ sMarketplaceCookie = set_cookie_string;
+ }
+ }
+
+ void completed(U32 status, const std::string& reason, const LLSD& content)
+ {
+ slmGetTimer.stop();
+
+ if (gSavedSettings.getBOOL("InventoryOutboxLogging"))
+ {
+ llinfos << " SLM GET status: " << status << llendl;
+ llinfos << " SLM GET reason: " << reason << llendl;
+ llinfos << " SLM GET content: " << content.asString() << llendl;
+
+ llinfos << " SLM GET timer: " << slmGetTimer.getElapsedTimeF32() << llendl;
+ }
+
+ if ((status == MarketplaceErrorCodes::IMPORT_AUTHENTICATION_ERROR) ||
+ (status == MarketplaceErrorCodes::IMPORT_JOB_TIMEOUT))
+ {
+ if (gSavedSettings.getBOOL("InventoryOutboxLogging"))
+ {
+ llinfos << " SLM GET clearing marketplace cookie due to authentication failure or timeout" << llendl;
+ }
+
+ sMarketplaceCookie.clear();
+ }
+
+ sImportInProgress = (status == MarketplaceErrorCodes::IMPORT_PROCESSING);
+ sImportGetPending = false;
+ sImportResultStatus = status;
+ sImportResults = content;
+ }
+ };
+
+ // Basic API
+
+ bool hasSessionCookie()
+ {
+ return !sMarketplaceCookie.empty();
+ }
+
+ bool inProgress()
+ {
+ return sImportInProgress;
+ }
+
+ bool resultPending()
+ {
+ return (sImportPostPending || sImportGetPending);
+ }
+
+ U32 getResultStatus()
+ {
+ return sImportResultStatus;
+ }
+
+ const LLSD& getResults()
+ {
+ return sImportResults;
+ }
+
+ static std::string getInventoryImportURL()
+ {
+ std::string url = getMarketplaceURL("MarketplaceURL");
+
+ url += "api/1/";
+ url += gAgent.getID().getString();
+ url += "/inventory/import/";
+
+ return url;
+ }
+
+ bool establishMarketplaceSessionCookie()
+ {
+ if (hasSessionCookie())
+ {
+ return false;
+ }
+
+ sImportInProgress = true;
+ sImportGetPending = true;
+
+ std::string url = getInventoryImportURL();
+
+ if (gSavedSettings.getBOOL("InventoryOutboxLogging"))
+ {
+ llinfos << " SLM GET: " << url << llendl;
+ }
+
+ slmGetTimer.start();
+ LLHTTPClient::get(url, new LLImportGetResponder(), LLViewerMedia::getHeaders());
+
+ return true;
+ }
+
+ bool pollStatus()
+ {
+ if (!hasSessionCookie())
+ {
+ return false;
+ }
+
+ sImportGetPending = true;
+
+ std::string url = getInventoryImportURL();
+
+ url += sImportId.asString();
+
+ // Make the headers for the post
+ LLSD headers = LLSD::emptyMap();
+ headers["Accept"] = "*/*";
+ headers["Cookie"] = sMarketplaceCookie;
+ headers["Content-Type"] = "application/llsd+xml";
+ headers["User-Agent"] = LLViewerMedia::getCurrentUserAgent();
+
+ if (gSavedSettings.getBOOL("InventoryOutboxLogging"))
+ {
+ llinfos << " SLM GET: " << url << llendl;
+ }
+
+ slmGetTimer.start();
+ LLHTTPClient::get(url, new LLImportGetResponder(), headers);
+
+ return true;
+ }
+
+ bool triggerImport()
+ {
+ if (!hasSessionCookie())
+ {
+ return false;
+ }
+
+ sImportId = LLSD::emptyMap();
+ sImportInProgress = true;
+ sImportPostPending = true;
+ sImportResultStatus = MarketplaceErrorCodes::IMPORT_PROCESSING;
+ sImportResults = LLSD::emptyMap();
+
+ std::string url = getInventoryImportURL();
+
+ // Make the headers for the post
+ LLSD headers = LLSD::emptyMap();
+ headers["Accept"] = "*/*";
+ headers["Connection"] = "Keep-Alive";
+ headers["Cookie"] = sMarketplaceCookie;
+ headers["Content-Type"] = "application/xml";
+ headers["User-Agent"] = LLViewerMedia::getCurrentUserAgent();
+
+ if (gSavedSettings.getBOOL("InventoryOutboxLogging"))
+ {
+ llinfos << " SLM POST: " << url << llendl;
+ }
+
+ slmPostTimer.start();
+ LLHTTPClient::post(url, LLSD(), new LLImportPostResponder(), headers);
+
+ return true;
+ }
+}
+
+
+//
+// Interface class
+//
+
+
+//static
+void LLMarketplaceInventoryImporter::update()
+{
+ if (instanceExists())
+ {
+ LLMarketplaceInventoryImporter::instance().updateImport();
+ }
+}
+
+LLMarketplaceInventoryImporter::LLMarketplaceInventoryImporter()
+ : mAutoTriggerImport(false)
+ , mImportInProgress(false)
+ , mInitialized(false)
+ , mErrorInitSignal(NULL)
+ , mStatusChangedSignal(NULL)
+ , mStatusReportSignal(NULL)
+{
+}
+
+boost::signals2::connection LLMarketplaceInventoryImporter::setInitializationErrorCallback(const status_report_signal_t::slot_type& cb)
+{
+ if (mErrorInitSignal == NULL)
+ {
+ mErrorInitSignal = new status_report_signal_t();
+ }
+
+ return mErrorInitSignal->connect(cb);
+}
+
+boost::signals2::connection LLMarketplaceInventoryImporter::setStatusChangedCallback(const status_changed_signal_t::slot_type& cb)
+{
+ if (mStatusChangedSignal == NULL)
+ {
+ mStatusChangedSignal = new status_changed_signal_t();
+ }
+
+ return mStatusChangedSignal->connect(cb);
+}
+
+boost::signals2::connection LLMarketplaceInventoryImporter::setStatusReportCallback(const status_report_signal_t::slot_type& cb)
+{
+ if (mStatusReportSignal == NULL)
+ {
+ mStatusReportSignal = new status_report_signal_t();
+ }
+
+ return mStatusReportSignal->connect(cb);
+}
+
+void LLMarketplaceInventoryImporter::initialize()
+{
+ llassert(!mInitialized);
+
+ if (!LLMarketplaceImport::hasSessionCookie())
+ {
+ LLMarketplaceImport::establishMarketplaceSessionCookie();
+ }
+}
+
+void LLMarketplaceInventoryImporter::reinitializeAndTriggerImport()
+{
+ mInitialized = false;
+
+ initialize();
+
+ mAutoTriggerImport = true;
+}
+
+bool LLMarketplaceInventoryImporter::triggerImport()
+{
+ const bool import_triggered = LLMarketplaceImport::triggerImport();
+
+ if (!import_triggered)
+ {
+ reinitializeAndTriggerImport();
+ }
+
+ return import_triggered;
+}
+
+void LLMarketplaceInventoryImporter::updateImport()
+{
+ const bool in_progress = LLMarketplaceImport::inProgress();
+
+ if (in_progress && !LLMarketplaceImport::resultPending())
+ {
+ const bool polling_status = LLMarketplaceImport::pollStatus();
+
+ if (!polling_status)
+ {
+ reinitializeAndTriggerImport();
+ }
+ }
+
+ if (mImportInProgress != in_progress)
+ {
+ mImportInProgress = in_progress;
+
+ // If we are no longer in progress
+ if (!mImportInProgress)
+ {
+ if (mInitialized)
+ {
+ // Report results
+ if (mStatusReportSignal)
+ {
+ (*mStatusReportSignal)(LLMarketplaceImport::getResultStatus(), LLMarketplaceImport::getResults());
+ }
+ }
+ else
+ {
+ // Look for results success
+ mInitialized = LLMarketplaceImport::hasSessionCookie();
+
+ if (mInitialized)
+ {
+ // Follow up with auto trigger of import
+ if (mAutoTriggerImport)
+ {
+ mAutoTriggerImport = false;
+
+ mImportInProgress = triggerImport();
+ }
+ }
+ else if (mErrorInitSignal)
+ {
+ (*mErrorInitSignal)(LLMarketplaceImport::getResultStatus(), LLMarketplaceImport::getResults());
+ }
+ }
+ }
+
+ // Make sure we trigger the status change with the final state (in case of auto trigger after initialize)
+ if (mStatusChangedSignal)
+ {
+ (*mStatusChangedSignal)(mImportInProgress);
+ }
+ }
+}
+
diff --git a/indra/newview/llmarketplacefunctions.h b/indra/newview/llmarketplacefunctions.h
new file mode 100644
index 0000000000..4b8f7a1ac7
--- /dev/null
+++ b/indra/newview/llmarketplacefunctions.h
@@ -0,0 +1,94 @@
+/**
+ * @file llmarketplacefunctions.h
+ * @brief Miscellaneous marketplace-related functions and classes
+ * class definition
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLMARKETPLACEFUNCTIONS_H
+#define LL_LLMARKETPLACEFUNCTIONS_H
+
+
+#include <llsd.h>
+#include <boost/function.hpp>
+#include <boost/signals2.hpp>
+
+#include "llsingleton.h"
+#include "llstring.h"
+
+
+LLSD getMarketplaceStringSubstitutions();
+
+
+namespace MarketplaceErrorCodes
+{
+ enum eCode
+ {
+ IMPORT_DONE = 200,
+ IMPORT_PROCESSING = 202,
+ IMPORT_REDIRECT = 302,
+ IMPORT_AUTHENTICATION_ERROR = 401,
+ IMPORT_DONE_WITH_ERRORS = 409,
+ IMPORT_JOB_FAILED = 410,
+ IMPORT_JOB_TIMEOUT = 499,
+ };
+}
+
+
+class LLMarketplaceInventoryImporter
+ : public LLSingleton<LLMarketplaceInventoryImporter>
+{
+public:
+ static void update();
+
+ LLMarketplaceInventoryImporter();
+
+ typedef boost::signals2::signal<void (bool)> status_changed_signal_t;
+ typedef boost::signals2::signal<void (U32, const LLSD&)> status_report_signal_t;
+
+ boost::signals2::connection setInitializationErrorCallback(const status_report_signal_t::slot_type& cb);
+ boost::signals2::connection setStatusChangedCallback(const status_changed_signal_t::slot_type& cb);
+ boost::signals2::connection setStatusReportCallback(const status_report_signal_t::slot_type& cb);
+
+ void initialize();
+ bool triggerImport();
+ bool isImportInProgress() const { return mImportInProgress; }
+
+protected:
+ void reinitializeAndTriggerImport();
+ void updateImport();
+
+private:
+ bool mAutoTriggerImport;
+ bool mImportInProgress;
+ bool mInitialized;
+
+ status_report_signal_t * mErrorInitSignal;
+ status_changed_signal_t * mStatusChangedSignal;
+ status_report_signal_t * mStatusReportSignal;
+};
+
+
+
+#endif // LL_LLMARKETPLACEFUNCTIONS_H
+
diff --git a/indra/newview/llmarketplacenotifications.cpp b/indra/newview/llmarketplacenotifications.cpp
new file mode 100644
index 0000000000..0886f9a990
--- /dev/null
+++ b/indra/newview/llmarketplacenotifications.cpp
@@ -0,0 +1,90 @@
+/**
+ * @file llmarketplacenotifications.cpp
+ * @brief Handler for notifications related to marketplace file I/O
+ * class definition
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+// Precompiled header
+#include "llviewerprecompiledheaders.h"
+
+#include "llmarketplacenotifications.h"
+#include "llnotificationsutil.h"
+
+#include "llerror.h"
+
+#include <boost/foreach.hpp>
+#include <boost/signals2.hpp>
+
+
+namespace LLMarketplaceInventoryNotifications
+{
+ typedef boost::signals2::signal<void (const LLSD& param)> no_copy_payload_cb_signal_t;
+
+ static no_copy_payload_cb_signal_t* no_copy_cb_action = NULL;
+ static bool no_copy_notify_active = false;
+ static std::list<LLSD> no_copy_payloads;
+
+ void notifyNoCopyCallback(const LLSD& notification, const LLSD& response)
+ {
+ const S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+
+ if (option == 0)
+ {
+ llassert(!no_copy_payloads.empty());
+ llassert(no_copy_cb_action != NULL);
+
+ BOOST_FOREACH(const LLSD& payload, no_copy_payloads)
+ {
+ (*no_copy_cb_action)(payload);
+ }
+ }
+
+ delete no_copy_cb_action;
+ no_copy_cb_action = NULL;
+
+ no_copy_notify_active = false;
+ no_copy_payloads.clear();
+ }
+
+ void update()
+ {
+ if (!no_copy_notify_active && !no_copy_payloads.empty())
+ {
+ no_copy_notify_active = true;
+
+ LLNotificationsUtil::add("ConfirmNoCopyToOutbox", LLSD(), LLSD(), boost::bind(&notifyNoCopyCallback, _1, _2));
+ }
+ }
+
+ void addNoCopyNotification(const LLSD& payload, const NoCopyCallbackFunction& cb)
+ {
+ if (no_copy_cb_action == NULL)
+ {
+ no_copy_cb_action = new no_copy_payload_cb_signal_t;
+ no_copy_cb_action->connect(boost::bind(cb, _1));
+ }
+
+ no_copy_payloads.push_back(payload);
+ }
+}
diff --git a/indra/newview/llmarketplacenotifications.h b/indra/newview/llmarketplacenotifications.h
new file mode 100644
index 0000000000..83a4e163c7
--- /dev/null
+++ b/indra/newview/llmarketplacenotifications.h
@@ -0,0 +1,57 @@
+/**
+ * @file llmarketplacenotifications.h
+ * @brief Handler for notifications related to marketplace file I/O
+ * class definition
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLMARKETPLACENOTIFICATIONS_H
+#define LL_LLMARKETPLACENOTIFICATIONS_H
+
+
+#include <llsd.h>
+#include <boost/function.hpp>
+
+
+//
+// This is a set of helper functions to handle a unique notification with multiple
+// payloads, helpful when dragging and dropping items to the merchant outbox that
+// trigger notifications that can potentially interfere with the current drag and
+// drop operation.
+//
+// Notification payloads are cached locally when initiated, the notification itself
+// is triggered on the following frame during the call to "update" and then the
+// response is triggered once per payload.
+//
+
+namespace LLMarketplaceInventoryNotifications
+{
+ void update();
+
+ typedef boost::function<void (const LLSD&)> NoCopyCallbackFunction;
+
+ void addNoCopyNotification(const LLSD& payload, const NoCopyCallbackFunction& cb);
+};
+
+
+#endif // LL_LLMARKETPLACENOTIFICATIONS_H
diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp
index e84c9152b1..7650fe9229 100644
--- a/indra/newview/llmediactrl.cpp
+++ b/indra/newview/llmediactrl.cpp
@@ -25,7 +25,7 @@
*/
#include "llviewerprecompiledheaders.h"
-
+#include "lltooltip.h"
#include "llmediactrl.h"
@@ -38,12 +38,14 @@
#include "llviewermedia.h"
#include "llviewertexture.h"
#include "llviewerwindow.h"
+#include "lldebugmessagebox.h"
#include "llweb.h"
#include "llrender.h"
#include "llpluginclassmedia.h"
#include "llslurl.h"
#include "lluictrlfactory.h" // LLDefaultChildRegistry
#include "llkeyboard.h"
+#include "llviewermenu.h"
// linden library includes
#include "llfocusmgr.h"
@@ -54,6 +56,9 @@
#include "llbutton.h"
#include "llcheckboxctrl.h"
#include "llnotifications.h"
+#include "lllineeditor.h"
+#include "llfloaterwebcontent.h"
+#include "llwindowshade.h"
extern BOOL gRestoreGL;
@@ -62,17 +67,16 @@ static LLDefaultChildRegistry::Register<LLMediaCtrl> r("web_browser");
LLMediaCtrl::Params::Params()
: start_url("start_url"),
border_visible("border_visible", true),
- ignore_ui_scale("ignore_ui_scale", true),
- hide_loading("hide_loading", false),
decouple_texture_size("decouple_texture_size", false),
texture_width("texture_width", 1024),
texture_height("texture_height", 1024),
caret_color("caret_color"),
initial_mime_type("initial_mime_type"),
+ error_page_url("error_page_url"),
media_id("media_id"),
- trusted_content("trusted_content", false)
+ trusted_content("trusted_content", false),
+ focus_on_click("focus_on_click", true)
{
- tab_stop(false);
}
LLMediaCtrl::LLMediaCtrl( const Params& p) :
@@ -83,50 +87,45 @@ LLMediaCtrl::LLMediaCtrl( const Params& p) :
mFrequentUpdates( true ),
mForceUpdate( false ),
mHomePageUrl( "" ),
- mIgnoreUIScale( true ),
mAlwaysRefresh( false ),
mMediaSource( 0 ),
- mTakeFocusOnClick( true ),
+ mTakeFocusOnClick( p.focus_on_click ),
mCurrentNavUrl( "" ),
mStretchToFill( true ),
mMaintainAspectRatio ( true ),
- mHideLoading (false),
- mHidingInitialLoad (false),
mDecoupleTextureSize ( false ),
mTextureWidth ( 1024 ),
mTextureHeight ( 1024 ),
mClearCache(false),
mHomePageMimeType(p.initial_mime_type),
- mTrusted(p.trusted_content)
+ mErrorPageURL(p.error_page_url),
+ mTrusted(p.trusted_content),
+ mWindowShade(NULL),
+ mHoverTextChanged(false),
+ mContextMenu(NULL)
{
{
LLColor4 color = p.caret_color().get();
setCaretColor( (unsigned int)color.mV[0], (unsigned int)color.mV[1], (unsigned int)color.mV[2] );
}
- setIgnoreUIScale(p.ignore_ui_scale);
-
setHomePageUrl(p.start_url, p.initial_mime_type);
setBorderVisible(p.border_visible);
- mHideLoading = p.hide_loading;
-
setDecoupleTextureSize(p.decouple_texture_size);
setTextureSize(p.texture_width, p.texture_height);
if(!getDecoupleTextureSize())
{
- S32 screen_width = mIgnoreUIScale ?
- llround((F32)getRect().getWidth() * LLUI::sGLScaleFactor.mV[VX]) : getRect().getWidth();
- S32 screen_height = mIgnoreUIScale ?
- llround((F32)getRect().getHeight() * LLUI::sGLScaleFactor.mV[VY]) : getRect().getHeight();
+ S32 screen_width = llround((F32)getRect().getWidth() * LLUI::sGLScaleFactor.mV[VX]);
+ S32 screen_height = llround((F32)getRect().getHeight() * LLUI::sGLScaleFactor.mV[VY]);
setTextureSize(screen_width, screen_height);
}
- mMediaTextureID.generate();
+ mMediaTextureID = getKey();
// We don't need to create the media source up front anymore unless we have a non-empty home URL to navigate to.
if(!mHomePageUrl.empty())
@@ -134,17 +133,19 @@ LLMediaCtrl::LLMediaCtrl( const Params& p) :
navigateHome();
}
- // FIXME: How do we create a bevel now?
-// LLRect border_rect( 0, getRect().getHeight() + 2, getRect().getWidth() + 2, 0 );
-// mBorder = new LLViewBorder( std::string("web control border"), border_rect, LLViewBorder::BEVEL_IN );
-// addChild( mBorder );
+ LLWindowShade::Params params;
+ params.name = "notification_shade";
+ params.rect = getLocalRect();
+ params.follows.flags = FOLLOWS_ALL;
+ params.modal = true;
+
+ mWindowShade = LLUICtrlFactory::create<LLWindowShade>(params);
+
+ addChild(mWindowShade);
}
-////////////////////////////////////////////////////////////////////////////////
-// note: this is now a singleton and destruction happens via initClass() now
LLMediaCtrl::~LLMediaCtrl()
{
-
if (mMediaSource)
{
mMediaSource->remObserver( this );
@@ -181,6 +182,13 @@ BOOL LLMediaCtrl::handleHover( S32 x, S32 y, MASK mask )
mMediaSource->mouseMove(x, y, mask);
gViewerWindow->setCursor(mMediaSource->getLastSetCursor());
}
+
+ // TODO: Is this the right way to handle hover text changes driven by the plugin?
+ if(mHoverTextChanged)
+ {
+ mHoverTextChanged = false;
+ handleToolTip(x, y, mask);
+ }
return TRUE;
}
@@ -197,6 +205,35 @@ BOOL LLMediaCtrl::handleScrollWheel( S32 x, S32 y, S32 clicks )
}
////////////////////////////////////////////////////////////////////////////////
+// virtual
+BOOL LLMediaCtrl::handleToolTip(S32 x, S32 y, MASK mask)
+{
+ std::string hover_text;
+
+ if (mMediaSource && mMediaSource->hasMedia())
+ hover_text = mMediaSource->getMediaPlugin()->getHoverText();
+
+ if(hover_text.empty())
+ {
+ return FALSE;
+ }
+ else
+ {
+ S32 screen_x, screen_y;
+
+ localPointToScreen(x, y, &screen_x, &screen_y);
+ LLRect sticky_rect_screen;
+ sticky_rect_screen.setCenterAndSize(screen_x, screen_y, 20, 20);
+
+ LLToolTipMgr::instance().show(LLToolTip::Params()
+ .message(hover_text)
+ .sticky_rect(sticky_rect_screen));
+ }
+
+ return TRUE;
+}
+
+////////////////////////////////////////////////////////////////////////////////
//
BOOL LLMediaCtrl::handleMouseUp( S32 x, S32 y, MASK mask )
{
@@ -206,14 +243,6 @@ BOOL LLMediaCtrl::handleMouseUp( S32 x, S32 y, MASK mask )
if (mMediaSource)
{
mMediaSource->mouseUp(x, y, mask);
-
- // *HACK: LLMediaImplLLMozLib automatically takes focus on mouseup,
- // in addition to the onFocusReceived() call below. Undo this. JC
- if (!mTakeFocusOnClick)
- {
- mMediaSource->focus(false);
- gViewerWindow->focusClient();
- }
}
gFocusMgr.setMouseCapture( NULL );
@@ -271,10 +300,12 @@ BOOL LLMediaCtrl::handleRightMouseUp( S32 x, S32 y, MASK mask )
BOOL LLMediaCtrl::handleRightMouseDown( S32 x, S32 y, MASK mask )
{
if (LLPanel::handleRightMouseDown(x, y, mask)) return TRUE;
- convertInputCoords(x, y);
+
+ S32 media_x = x, media_y = y;
+ convertInputCoords(media_x, media_y);
if (mMediaSource)
- mMediaSource->mouseDown(x, y, mask, 1);
+ mMediaSource->mouseDown(media_x, media_y, mask, 1);
gFocusMgr.setMouseCapture( this );
@@ -283,6 +314,17 @@ BOOL LLMediaCtrl::handleRightMouseDown( S32 x, S32 y, MASK mask )
setFocus( TRUE );
}
+ if (mContextMenu)
+ {
+ // hide/show debugging options
+ bool media_plugin_debugging_enabled = gSavedSettings.getBOOL("MediaPluginDebugging");
+ mContextMenu->setItemVisible("open_webinspector", media_plugin_debugging_enabled );
+ mContextMenu->setItemVisible("debug_separator", media_plugin_debugging_enabled );
+
+ mContextMenu->show(x, y);
+ LLMenuGL::showPopup(this, mContextMenu, x, y);
+ }
+
return TRUE;
}
@@ -345,100 +387,35 @@ void LLMediaCtrl::onFocusLost()
//
BOOL LLMediaCtrl::postBuild ()
{
- LLLayoutStack::Params layout_p;
- layout_p.name = "notification_stack";
- layout_p.rect = LLRect(0,getLocalRect().mTop,getLocalRect().mRight, 30);
- layout_p.follows.flags = FOLLOWS_ALL;
- layout_p.mouse_opaque = false;
- layout_p.orientation = "vertical";
-
- LLLayoutStack* stackp = LLUICtrlFactory::create<LLLayoutStack>(layout_p);
- addChild(stackp);
-
- LLLayoutPanel::Params panel_p;
- panel_p.rect = LLRect(0, 30, 800, 0);
- panel_p.min_height = 30;
- panel_p.name = "notification_area";
- panel_p.visible = false;
- panel_p.user_resize = false;
- panel_p.background_visible = true;
- panel_p.bg_alpha_image.name = "Yellow_Gradient";
- panel_p.auto_resize = false;
- LLLayoutPanel* notification_panel = LLUICtrlFactory::create<LLLayoutPanel>(panel_p);
- stackp->addChild(notification_panel);
-
- panel_p = LLUICtrlFactory::getDefaultParams<LLLayoutPanel>();
- panel_p.auto_resize = true;
- panel_p.mouse_opaque = false;
- LLLayoutPanel* dummy_panel = LLUICtrlFactory::create<LLLayoutPanel>(panel_p);
- stackp->addChild(dummy_panel);
-
- layout_p = LLUICtrlFactory::getDefaultParams<LLLayoutStack>();
- layout_p.rect = LLRect(0, 30, 800, 0);
- layout_p.follows.flags = FOLLOWS_ALL;
- layout_p.orientation = "horizontal";
- stackp = LLUICtrlFactory::create<LLLayoutStack>(layout_p);
- notification_panel->addChild(stackp);
-
- panel_p = LLUICtrlFactory::getDefaultParams<LLLayoutPanel>();
- panel_p.rect.height = 30;
- LLLayoutPanel* panel = LLUICtrlFactory::create<LLLayoutPanel>(panel_p);
- stackp->addChild(panel);
-
- LLIconCtrl::Params icon_p;
- icon_p.name = "notification_icon";
- icon_p.rect = LLRect(5, 23, 21, 8);
- panel->addChild(LLUICtrlFactory::create<LLIconCtrl>(icon_p));
-
- LLTextBox::Params text_p;
- text_p.rect = LLRect(31, 20, 430, 0);
- text_p.text_color = LLColor4::black;
- text_p.font = LLFontGL::getFontSansSerif();
- text_p.font.style = "BOLD";
- text_p.name = "notification_text";
- text_p.use_ellipses = true;
- panel->addChild(LLUICtrlFactory::create<LLTextBox>(text_p));
-
- panel_p = LLUICtrlFactory::getDefaultParams<LLLayoutPanel>();
- panel_p.auto_resize = false;
- panel_p.user_resize = false;
- panel_p.name="form_elements";
- panel_p.rect = LLRect(0, 30, 130, 0);
- LLLayoutPanel* form_elements_panel = LLUICtrlFactory::create<LLLayoutPanel>(panel_p);
- stackp->addChild(form_elements_panel);
-
- panel_p = LLUICtrlFactory::getDefaultParams<LLLayoutPanel>();
- panel_p.auto_resize = false;
- panel_p.user_resize = false;
- panel_p.rect = LLRect(0, 30, 25, 0);
- LLLayoutPanel* close_panel = LLUICtrlFactory::create<LLLayoutPanel>(panel_p);
- stackp->addChild(close_panel);
-
- LLButton::Params button_p;
- button_p.name = "close_notification";
- button_p.rect = LLRect(5, 23, 21, 7);
- button_p.image_color=LLUIColorTable::instance().getColor("DkGray_66");
- button_p.image_unselected.name="Icon_Close_Foreground";
- button_p.image_selected.name="Icon_Close_Press";
- button_p.click_callback.function = boost::bind(&LLMediaCtrl::onCloseNotification, this);
-
- close_panel->addChild(LLUICtrlFactory::create<LLButton>(button_p));
+ LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registar;
+ registar.add("Open.WebInspector", boost::bind(&LLMediaCtrl::onOpenWebInspector, this));
+ mContextMenu = LLUICtrlFactory::getInstance()->createFromFile<LLContextMenu>(
+ "menu_media_ctrl.xml", LLMenuGL::sMenuContainer, LLViewerMenuHolderGL::child_registry_t::instance());
setVisibleCallback(boost::bind(&LLMediaCtrl::onVisibilityChange, this, _2));
+
return TRUE;
}
+void LLMediaCtrl::onOpenWebInspector()
+{
+ if (mMediaSource && mMediaSource->hasMedia())
+ mMediaSource->getMediaPlugin()->showWebInspector( true );
+}
+
////////////////////////////////////////////////////////////////////////////////
//
BOOL LLMediaCtrl::handleKeyHere( KEY key, MASK mask )
{
- if (LLPanel::handleKeyHere(key, mask)) return TRUE;
BOOL result = FALSE;
if (mMediaSource)
{
result = mMediaSource->handleKeyHere(key, mask);
}
+
+ if ( ! result )
+ result = LLPanel::handleKeyHere(key, mask);
return result;
}
@@ -458,7 +435,6 @@ void LLMediaCtrl::handleVisibilityChange ( BOOL new_visibility )
//
BOOL LLMediaCtrl::handleUnicodeCharHere(llwchar uni_char)
{
- if (LLPanel::handleUnicodeCharHere(uni_char)) return TRUE;
BOOL result = FALSE;
if (mMediaSource)
@@ -466,6 +442,9 @@ BOOL LLMediaCtrl::handleUnicodeCharHere(llwchar uni_char)
result = mMediaSource->handleUnicodeCharHere(uni_char);
}
+ if ( ! result )
+ result = LLPanel::handleUnicodeCharHere(uni_char);
+
return result;
}
@@ -490,8 +469,8 @@ void LLMediaCtrl::reshape( S32 width, S32 height, BOOL called_from_parent )
{
if(!getDecoupleTextureSize())
{
- S32 screen_width = mIgnoreUIScale ? llround((F32)width * LLUI::sGLScaleFactor.mV[VX]) : width;
- S32 screen_height = mIgnoreUIScale ? llround((F32)height * LLUI::sGLScaleFactor.mV[VY]) : height;
+ S32 screen_width = llround((F32)width * LLUI::sGLScaleFactor.mV[VX]);
+ S32 screen_height = llround((F32)height * LLUI::sGLScaleFactor.mV[VY]);
// when floater is minimized, these sizes are negative
if ( screen_height > 0 && screen_width > 0 )
@@ -545,22 +524,6 @@ bool LLMediaCtrl::canNavigateForward()
////////////////////////////////////////////////////////////////////////////////
//
-void LLMediaCtrl::set404RedirectUrl( std::string redirect_url )
-{
- if(mMediaSource && mMediaSource->hasMedia())
- mMediaSource->getMediaPlugin()->set_status_redirect( 404, redirect_url );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLMediaCtrl::clr404RedirectUrl()
-{
- if(mMediaSource && mMediaSource->hasMedia())
- mMediaSource->getMediaPlugin()->set_status_redirect(404, "");
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
void LLMediaCtrl::clearCache()
{
if(mMediaSource)
@@ -668,6 +631,16 @@ void LLMediaCtrl::setTarget(const std::string& target)
}
}
+void LLMediaCtrl::setErrorPageURL(const std::string& url)
+{
+ mErrorPageURL = url;
+}
+
+const std::string& LLMediaCtrl::getErrorPageURL()
+{
+ return mErrorPageURL;
+}
+
////////////////////////////////////////////////////////////////////////////////
//
bool LLMediaCtrl::setCaretColor(unsigned int red, unsigned int green, unsigned int blue)
@@ -714,16 +687,13 @@ bool LLMediaCtrl::ensureMediaSourceExists()
mMediaSource->addObserver( this );
mMediaSource->setBackgroundColor( getBackgroundColor() );
mMediaSource->setTrustedBrowser(mTrusted);
+ mMediaSource->setPageZoomFactor( LLUI::sGLScaleFactor.mV[ VX ] );
+
if(mClearCache)
{
mMediaSource->clearCache();
mClearCache = false;
}
-
- if(mHideLoading)
- {
- mHidingInitialLoad = true;
- }
}
else
{
@@ -753,6 +723,8 @@ LLPluginClassMedia* LLMediaCtrl::getMediaPlugin()
//
void LLMediaCtrl::draw()
{
+ F32 alpha = getDrawContext().mAlpha;
+
if ( gRestoreGL == 1 )
{
LLRect r = getRect();
@@ -791,36 +763,19 @@ void LLMediaCtrl::draw()
}
}
- if(mHidingInitialLoad)
- {
- // If we're hiding loading, don't draw at all.
- draw_media = false;
- }
-
bool background_visible = isBackgroundVisible();
bool background_opaque = isBackgroundOpaque();
if(draw_media)
{
- // alpha off for this
- LLGLSUIDefault gls_ui;
- LLGLDisable gls_alphaTest( GL_ALPHA_TEST );
-
gGL.pushUIMatrix();
{
- if (mIgnoreUIScale)
- {
- gGL.loadUIIdentity();
- // font system stores true screen origin, need to scale this by UI scale factor
- // to get render origin for this view (with unit scale)
- gGL.translateUI(floorf(LLFontGL::sCurOrigin.mX * LLUI::sGLScaleFactor.mV[VX]),
- floorf(LLFontGL::sCurOrigin.mY * LLUI::sGLScaleFactor.mV[VY]),
- LLFontGL::sCurOrigin.mZ);
- }
+ mMediaSource->setPageZoomFactor( LLUI::sGLScaleFactor.mV[ VX ] );
// scale texture to fit the space using texture coords
gGL.getTexUnit(0)->bind(media_texture);
- gGL.color4fv( LLColor4::white.mV );
+ LLColor4 media_color = LLColor4::white % alpha;
+ gGL.color4fv( media_color.mV );
F32 max_u = ( F32 )media_plugin->getWidth() / ( F32 )media_plugin->getTextureWidth();
F32 max_v = ( F32 )media_plugin->getHeight() / ( F32 )media_plugin->getTextureHeight();
@@ -863,16 +818,7 @@ void LLMediaCtrl::draw()
x_offset = (r.getWidth() - width) / 2;
y_offset = (r.getHeight() - height) / 2;
- if(mIgnoreUIScale)
- {
- x_offset = llround((F32)x_offset * LLUI::sGLScaleFactor.mV[VX]);
- y_offset = llround((F32)y_offset * LLUI::sGLScaleFactor.mV[VY]);
- width = llround((F32)width * LLUI::sGLScaleFactor.mV[VX]);
- height = llround((F32)height * LLUI::sGLScaleFactor.mV[VY]);
- }
-
// draw the browser
- gGL.setSceneBlendType(LLRender::BT_REPLACE);
gGL.begin( LLRender::QUADS );
if (! media_plugin->getTextureCoordsOpenGL())
{
@@ -905,7 +851,6 @@ void LLMediaCtrl::draw()
gGL.vertex2i( x_offset + width, y_offset );
}
gGL.end();
- gGL.setSceneBlendType(LLRender::BT_ALPHA);
}
gGL.popUIMatrix();
@@ -921,11 +866,6 @@ void LLMediaCtrl::draw()
if ( mBorder && mBorder->getVisible() )
mBorder->setKeyboardFocusHighlight( gFocusMgr.childHasKeyboardFocus( this ) );
- if (mCurNotification && !mCurNotification->isActive())
- {
- hideNotification();
- }
-
LLPanel::draw();
// Restore the previous values
@@ -944,14 +884,14 @@ void LLMediaCtrl::convertInputCoords(S32& x, S32& y)
coords_opengl = mMediaSource->getMediaPlugin()->getTextureCoordsOpenGL();
}
- x = mIgnoreUIScale ? llround((F32)x * LLUI::sGLScaleFactor.mV[VX]) : x;
+ x = llround((F32)x * LLUI::sGLScaleFactor.mV[VX]);
if ( ! coords_opengl )
{
- y = mIgnoreUIScale ? llround((F32)(y) * LLUI::sGLScaleFactor.mV[VY]) : y;
+ y = llround((F32)(y) * LLUI::sGLScaleFactor.mV[VY]);
}
else
{
- y = mIgnoreUIScale ? llround((F32)(getRect().getHeight() - y) * LLUI::sGLScaleFactor.mV[VY]) : getRect().getHeight() - y;
+ y = llround((F32)(getRect().getHeight() - y) * LLUI::sGLScaleFactor.mV[VY]);
};
}
@@ -1023,6 +963,16 @@ void LLMediaCtrl::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event)
};
break;
+ case MEDIA_EVENT_NAVIGATE_ERROR_PAGE:
+ {
+ LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_NAVIGATE_ERROR_PAGE" << LL_ENDL;
+ if ( mErrorPageURL.length() > 0 )
+ {
+ navigateTo(mErrorPageURL, "text/html");
+ };
+ };
+ break;
+
case MEDIA_EVENT_CLICK_LINK_HREF:
{
LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_CLICK_LINK_HREF, target is \"" << self->getClickTarget() << "\", uri is " << self->getClickURL() << LL_ENDL;
@@ -1033,7 +983,7 @@ void LLMediaCtrl::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event)
LLNotification::Params notify_params;
notify_params.name = "PopupAttempt";
- notify_params.payload = LLSD().with("target", target).with("url", url).with("uuid", uuid).with("media_id", getKey());
+ notify_params.payload = LLSD().with("target", target).with("url", url).with("uuid", uuid).with("media_id", mMediaTextureID);
notify_params.functor.function = boost::bind(&LLMediaCtrl::onPopup, this, _1, _2);
if (mTrusted)
@@ -1088,6 +1038,37 @@ void LLMediaCtrl::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event)
LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_GEOMETRY_CHANGE, uuid is " << self->getClickUUID() << LL_ENDL;
}
break;
+
+ case MEDIA_EVENT_AUTH_REQUEST:
+ {
+ LLNotification::Params auth_request_params;
+ auth_request_params.name = "AuthRequest";
+
+ // pass in host name and realm for site (may be zero length but will always exist)
+ LLSD args;
+ LLURL raw_url( self->getAuthURL().c_str() );
+ args["HOST_NAME"] = raw_url.getAuthority();
+ args["REALM"] = self->getAuthRealm();
+ auth_request_params.substitutions = args;
+
+ auth_request_params.payload = LLSD().with("media_id", mMediaTextureID);
+ auth_request_params.functor.function = boost::bind(&LLViewerMedia::onAuthSubmit, _1, _2);
+ LLNotifications::instance().add(auth_request_params);
+ };
+ break;
+
+ case MEDIA_EVENT_LINK_HOVERED:
+ {
+ LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_LINK_HOVERED, hover text is: " << self->getHoverText() << LL_ENDL;
+ mHoverTextChanged = true;
+ };
+ break;
+
+ case MEDIA_EVENT_DEBUG_MESSAGE:
+ {
+ LL_INFOS("media") << self->getDebugMessageText() << LL_ENDL;
+ };
+ break;
};
// chain all events to any potential observers of this object.
@@ -1112,102 +1093,47 @@ void LLMediaCtrl::onPopup(const LLSD& notification, const LLSD& response)
// Make sure the opening instance knows its window open request was denied, so it can clean things up.
LLViewerMedia::proxyWindowClosed(notification["payload"]["uuid"]);
}
-
}
-void LLMediaCtrl::onCloseNotification()
+void LLMediaCtrl::showNotification(LLNotificationPtr notify)
{
- LLNotifications::instance().cancel(mCurNotification);
-}
+ LLWindowShade* shade = getChild<LLWindowShade>("notification_shade");
-void LLMediaCtrl::onClickIgnore(LLUICtrl* ctrl)
-{
- bool check = ctrl->getValue().asBoolean();
- if (mCurNotification && mCurNotification->getForm()->getIgnoreType() == LLNotificationForm::IGNORE_SHOW_AGAIN)
+ if (notify->getIcon() == "Popup_Caution")
{
- // question was "show again" so invert value to get "ignore"
- check = !check;
+ shade->setBackgroundImage(LLUI::getUIImage("Yellow_Gradient"));
+ shade->setTextColor(LLColor4::black);
+ shade->setCanClose(true);
}
- mCurNotification->setIgnored(check);
-}
-
-void LLMediaCtrl::onClickNotificationButton(const std::string& name)
-{
- if (!mCurNotification) return;
-
- LLSD response = mCurNotification->getResponseTemplate();
- response[name] = true;
-
- mCurNotification->respond(response);
-}
-
-void LLMediaCtrl::showNotification(LLNotificationPtr notify)
-{
- mCurNotification = notify;
-
- // add popup here
- LLSD payload = notify->getPayload();
-
- LLNotificationFormPtr formp = notify->getForm();
- LLLayoutPanel& panel = getChildRef<LLLayoutPanel>("notification_area");
- panel.setVisible(true);
- panel.getChild<LLUICtrl>("notification_icon")->setValue(notify->getIcon());
- panel.getChild<LLUICtrl>("notification_text")->setValue(notify->getMessage());
- panel.getChild<LLUICtrl>("notification_text")->setToolTip(notify->getMessage());
- LLNotificationForm::EIgnoreType ignore_type = formp->getIgnoreType();
- LLLayoutPanel& form_elements = panel.getChildRef<LLLayoutPanel>("form_elements");
- form_elements.deleteAllChildren();
-
- const S32 FORM_PADDING_HORIZONTAL = 10;
- const S32 FORM_PADDING_VERTICAL = 3;
- S32 cur_x = FORM_PADDING_HORIZONTAL;
-
- if (ignore_type != LLNotificationForm::IGNORE_NO)
+ else if (notify->getName() == "AuthRequest")
{
- LLCheckBoxCtrl::Params checkbox_p;
- checkbox_p.name = "ignore_check";
- checkbox_p.rect = LLRect(cur_x, form_elements.getRect().getHeight() - FORM_PADDING_VERTICAL, cur_x, FORM_PADDING_VERTICAL);
- checkbox_p.label = formp->getIgnoreMessage();
- checkbox_p.label_text.text_color = LLColor4::black;
- checkbox_p.commit_callback.function = boost::bind(&LLMediaCtrl::onClickIgnore, this, _1);
- checkbox_p.initial_value = formp->getIgnored();
-
- LLCheckBoxCtrl* check = LLUICtrlFactory::create<LLCheckBoxCtrl>(checkbox_p);
- check->setRect(check->getBoundingRect());
- form_elements.addChild(check);
- cur_x = check->getRect().mRight + FORM_PADDING_HORIZONTAL;
+ shade->setBackgroundImage(LLUI::getUIImage("Yellow_Gradient"));
+ shade->setTextColor(LLColor4::black);
+ shade->setCanClose(false);
}
-
- for (S32 i = 0; i < formp->getNumElements(); i++)
+ else
{
- LLSD form_element = formp->getElement(i);
- if (form_element["type"].asString() == "button")
- {
- LLButton::Params button_p;
- button_p.name = form_element["name"];
- button_p.label = form_element["text"];
- button_p.rect = LLRect(cur_x, form_elements.getRect().getHeight() - FORM_PADDING_VERTICAL, cur_x, FORM_PADDING_VERTICAL);
- button_p.click_callback.function = boost::bind(&LLMediaCtrl::onClickNotificationButton, this, form_element["name"].asString());
- button_p.auto_resize = true;
-
- LLButton* button = LLUICtrlFactory::create<LLButton>(button_p);
- button->autoResize();
- form_elements.addChild(button);
-
- cur_x = button->getRect().mRight + FORM_PADDING_HORIZONTAL;
- }
+ //HACK: make this a property of the notification itself, "cancellable"
+ shade->setCanClose(false);
+ shade->setTextColor(LLUIColorTable::instance().getColor("LabelTextColor"));
}
-
- form_elements.reshape(cur_x, form_elements.getRect().getHeight());
-
- //LLWeb::loadURL(payload["url"], payload["target"]);
+ mWindowShade->show(notify);
}
void LLMediaCtrl::hideNotification()
{
- LLLayoutPanel& panel = getChildRef<LLLayoutPanel>("notification_area");
- panel.setVisible(FALSE);
+ if (mWindowShade)
+ {
+ mWindowShade->hide();
+ }
+}
- mCurNotification.reset();
+void LLMediaCtrl::setTrustedContent(bool trusted)
+{
+ mTrusted = trusted;
+ if (mMediaSource)
+ {
+ mMediaSource->setTrustedBrowser(trusted);
+ }
}
diff --git a/indra/newview/llmediactrl.h b/indra/newview/llmediactrl.h
index 65dfbbff78..7f2a5e1642 100644
--- a/indra/newview/llmediactrl.h
+++ b/indra/newview/llmediactrl.h
@@ -34,6 +34,7 @@
class LLViewBorder;
class LLUICtrlFactory;
+class LLContextMenu;
////////////////////////////////////////////////////////////////////////////////
//
@@ -50,10 +51,10 @@ public:
Optional<std::string> start_url;
Optional<bool> border_visible,
- ignore_ui_scale,
hide_loading,
decouple_texture_size,
- trusted_content;
+ trusted_content,
+ focus_on_click;
Optional<S32> texture_width,
texture_height;
@@ -62,6 +63,7 @@ public:
Optional<std::string> initial_mime_type;
Optional<std::string> media_id;
+ Optional<std::string> error_page_url;
Params();
};
@@ -89,6 +91,7 @@ public:
virtual BOOL handleRightMouseUp(S32 x, S32 y, MASK mask);
virtual BOOL handleDoubleClick( S32 x, S32 y, MASK mask );
virtual BOOL handleScrollWheel( S32 x, S32 y, S32 clicks );
+ virtual BOOL handleToolTip(S32 x, S32 y, MASK mask);
// navigation
void navigateTo( std::string url_in, std::string mime_type = "");
@@ -111,10 +114,9 @@ public:
void setTarget(const std::string& target);
- // set/clear URL to visit when a 404 page is reached
- void set404RedirectUrl( std::string redirect_url );
- void clr404RedirectUrl();
-
+ void setErrorPageURL(const std::string& url);
+ const std::string& getErrorPageURL();
+
// Clear the browser cache when the instance gets loaded
void clearCache();
@@ -122,9 +124,6 @@ public:
bool getFrequentUpdates() { return mFrequentUpdates; };
void setFrequentUpdates( bool frequentUpdatesIn ) { mFrequentUpdates = frequentUpdatesIn; };
- void setIgnoreUIScale(bool ignore) { mIgnoreUIScale = ignore; }
- bool getIgnoreUIScale() { return mIgnoreUIScale; }
-
void setAlwaysRefresh(bool refresh) { mAlwaysRefresh = refresh; }
bool getAlwaysRefresh() { return mAlwaysRefresh; }
@@ -146,6 +145,8 @@ public:
void showNotification(boost::shared_ptr<class LLNotification> notify);
void hideNotification();
+ void setTrustedContent(bool trusted);
+
// over-rides
virtual BOOL handleKeyHere( KEY key, MASK mask);
virtual void handleVisibilityChange ( BOOL new_visibility );
@@ -161,39 +162,45 @@ public:
// Incoming media event dispatcher
virtual void handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event);
+ // right click debugging item
+ void onOpenWebInspector();
+
+ LLUUID getTextureID() {return mMediaTextureID;}
+
protected:
void convertInputCoords(S32& x, S32& y);
private:
void onVisibilityChange ( const LLSD& new_visibility );
void onPopup(const LLSD& notification, const LLSD& response);
- void onCloseNotification();
- void onClickNotificationButton(const std::string& name);
- void onClickIgnore(LLUICtrl* ctrl);
const S32 mTextureDepthBytes;
LLUUID mMediaTextureID;
LLViewBorder* mBorder;
- bool mFrequentUpdates;
- bool mForceUpdate;
- const bool mTrusted;
- std::string mHomePageUrl;
- std::string mHomePageMimeType;
- std::string mCurrentNavUrl;
- std::string mTarget;
- bool mIgnoreUIScale;
- bool mAlwaysRefresh;
+ bool mFrequentUpdates,
+ mForceUpdate,
+ mTrusted,
+ mAlwaysRefresh,
+ mTakeFocusOnClick,
+ mStretchToFill,
+ mMaintainAspectRatio,
+ mHideLoading,
+ mHidingInitialLoad,
+ mClearCache,
+ mHoverTextChanged,
+ mDecoupleTextureSize;
+
+ std::string mHomePageUrl,
+ mHomePageMimeType,
+ mCurrentNavUrl,
+ mErrorPageURL,
+ mTarget;
viewer_media_t mMediaSource;
- bool mTakeFocusOnClick;
- bool mStretchToFill;
- bool mMaintainAspectRatio;
- bool mHideLoading;
- bool mHidingInitialLoad;
- bool mDecoupleTextureSize;
- S32 mTextureWidth;
- S32 mTextureHeight;
- bool mClearCache;
- boost::shared_ptr<class LLNotification> mCurNotification;
+ S32 mTextureWidth,
+ mTextureHeight;
+
+ class LLWindowShade* mWindowShade;
+ LLContextMenu* mContextMenu;
};
#endif // LL_LLMediaCtrl_H
diff --git a/indra/newview/llmemoryview.cpp b/indra/newview/llmemoryview.cpp
index 9a244e2562..c0a323d6cb 100644
--- a/indra/newview/llmemoryview.cpp
+++ b/indra/newview/llmemoryview.cpp
@@ -37,9 +37,11 @@
#include <sstream>
#include <boost/algorithm/string/split.hpp>
+#include "llmemory.h"
LLMemoryView::LLMemoryView(const LLMemoryView::Params& p)
: LLView(p),
+ mPaused(FALSE),
//mDelay(120),
mAlloc(NULL)
{
@@ -59,6 +61,7 @@ BOOL LLMemoryView::handleMouseDown(S32 x, S32 y, MASK mask)
}
else
{
+ mPaused = !mPaused;
}
return TRUE;
}
@@ -148,13 +151,14 @@ void LLMemoryView::draw()
// cut off lines on bottom
U32 max_lines = U32((height - 2 * line_height) / line_height);
- std::vector<LLWString>::const_iterator end = mLines.end();
+ y_pos = height - MARGIN_AMT - line_height;
+ y_off = 0.f;
+
+#if !MEM_TRACK_MEM
+ std::vector<LLWString>::const_iterator end = mLines.end();
if(mLines.size() > max_lines) {
end = mLines.begin() + max_lines;
}
-
- y_pos = height - MARGIN_AMT - line_height;
- y_off = 0.f;
for (std::vector<LLWString>::const_iterator i = mLines.begin(); i != end; ++i)
{
font->render(*i, 0, MARGIN_AMT, y_pos - y_off,
@@ -169,13 +173,54 @@ void LLMemoryView::draw()
y_off += line_height;
}
+#else
+ LLMemTracker::getInstance()->preDraw(mPaused) ;
+
+ {
+ F32 x_pos = MARGIN_AMT ;
+ U32 lines = 0 ;
+ const char* str = LLMemTracker::getInstance()->getNextLine() ;
+ while(str != NULL)
+ {
+ lines++ ;
+ font->renderUTF8(str, 0, x_pos, y_pos - y_off,
+ LLColor4::white,
+ LLFontGL::LEFT,
+ LLFontGL::BASELINE,
+ LLFontGL::NORMAL,
+ LLFontGL::DROP_SHADOW,
+ S32_MAX,
+ target_width,
+ NULL, FALSE);
+
+ str = LLMemTracker::getInstance()->getNextLine() ;
+ y_off += line_height;
+
+ if(lines >= max_lines)
+ {
+ lines = 0 ;
+ x_pos += 512.f ;
+ if(x_pos + 512.f > target_width)
+ {
+ break ;
+ }
+
+ y_pos = height - MARGIN_AMT - line_height;
+ y_off = 0.f;
+ }
+ }
+ }
+
+ LLMemTracker::getInstance()->postDraw() ;
+#endif
+
#if MEM_TRACK_TYPE
S32 left, top, right, bottom;
S32 x, y;
S32 margin = 10;
- S32 texth = (S32)LLFontGL::getFontMonospace()->getLineHeight();
+ S32 texth = LLFontGL::getFontMonospace()->getLineHeight();
S32 xleft = margin;
S32 ytop = height - margin;
diff --git a/indra/newview/llmemoryview.h b/indra/newview/llmemoryview.h
index 24ea058279..dc4849a9c4 100644
--- a/indra/newview/llmemoryview.h
+++ b/indra/newview/llmemoryview.h
@@ -38,8 +38,8 @@ public:
{
Params()
{
- mouse_opaque = true;
- visible = false;
+ changeDefault(mouse_opaque, true);
+ changeDefault(visible, false);
}
};
LLMemoryView(const LLMemoryView::Params&);
@@ -55,6 +55,7 @@ public:
private:
std::vector<LLWString> mLines;
LLAllocator* mAlloc;
+ BOOL mPaused ;
};
diff --git a/indra/newview/llmenucommands.cpp b/indra/newview/llmenucommands.cpp
deleted file mode 100644
index 4b7f9432e3..0000000000
--- a/indra/newview/llmenucommands.cpp
+++ /dev/null
@@ -1,94 +0,0 @@
-/**
- * @file llmenucommands.cpp
- * @brief Implementations of menu commands.
- *
- * $LicenseInfo:firstyear=2003&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llmenucommands.h"
-
-#include "imageids.h"
-#include "llfloaterreg.h"
-#include "llfontgl.h"
-#include "llrect.h"
-#include "llerror.h"
-#include "llstring.h"
-#include "message.h"
-
-#include "llagentcamera.h"
-#include "llcallingcard.h"
-#include "llviewercontrol.h"
-//#include "llfirstuse.h"
-#include "llfloaterworldmap.h"
-#include "lllineeditor.h"
-#include "llstatusbar.h"
-#include "llimview.h"
-#include "lltextbox.h"
-#include "llui.h"
-#include "llviewergesture.h" // for triggering gestures
-#include "llviewermessage.h"
-#include "llviewerparceloverlay.h"
-#include "llviewerregion.h"
-#include "llviewerstats.h"
-#include "lluictrlfactory.h"
-#include "llviewerwindow.h"
-#include "llworld.h"
-#include "llworldmap.h"
-#include "llfocusmgr.h"
-#include "llnearbychatbar.h"
-
-void handle_mouselook(void*)
-{
- gAgentCamera.changeCameraToMouselook();
-}
-
-
-void handle_chat(void*)
-{
- // give focus to chatbar if it's open but not focused
- if (gSavedSettings.getBOOL("ChatVisible") &&
- gFocusMgr.childHasKeyboardFocus(LLNearbyChatBar::getInstance()->getChatBox()))
- {
- LLNearbyChatBar::stopChat();
- }
- else
- {
- LLNearbyChatBar::startChat(NULL);
- }
-}
-
-void handle_slash_key(void*)
-{
- // LLBottomTray::startChat("/");
- //
- // Don't do this, it results in a double-slash in the input field.
- // Another "/" will be automatically typed for us, because the WM_KEYDOWN event
- // that generated the menu accelerator call (and hence puts focus in
- // the chat edtior) will be followed by a "/" WM_CHAR character message,
- // which will type the slash. Yes, it's weird. It only matters for
- // menu accelerators that put input focus into a field. And Mac works
- // the same way. JC
-
- LLNearbyChatBar::startChat(NULL);
-}
diff --git a/indra/newview/llmenucommands.h b/indra/newview/llmenucommands.h
deleted file mode 100644
index fa845c6f02..0000000000
--- a/indra/newview/llmenucommands.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/**
- * @file llmenucommands.h
- * @brief Implementations of menu commands.
- *
- * $LicenseInfo:firstyear=2003&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLMENUCOMMANDS_H
-#define LL_LLMENUCOMMANDS_H
-
-class LLUUID;
-
-void handle_mouselook(void*);
-void handle_chat(void*);
-void handle_return_key(void*);
-void handle_slash_key(void*);
-
-#endif
diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp
new file mode 100755
index 0000000000..f461c7e46f
--- /dev/null
+++ b/indra/newview/llmeshrepository.cpp
@@ -0,0 +1,3537 @@
+/**
+ * @file llmeshrepository.cpp
+ * @brief Mesh repository implementation.
+ *
+ * $LicenseInfo:firstyear=2005&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "apr_pools.h"
+#include "apr_dso.h"
+#include "llhttpstatuscodes.h"
+#include "llmeshrepository.h"
+
+#include "llagent.h"
+#include "llappviewer.h"
+#include "llbufferstream.h"
+#include "llcallbacklist.h"
+#include "llcurl.h"
+#include "lldatapacker.h"
+#include "llfloatermodelpreview.h"
+#include "llfloaterperms.h"
+#include "lleconomy.h"
+#include "llimagej2c.h"
+#include "llhost.h"
+#include "llnotificationsutil.h"
+#include "llsd.h"
+#include "llsdutil_math.h"
+#include "llsdserialize.h"
+#include "llthread.h"
+#include "llvfile.h"
+#include "llviewercontrol.h"
+#include "llviewerinventory.h"
+#include "llviewermenufile.h"
+#include "llviewerobjectlist.h"
+#include "llviewerregion.h"
+#include "llviewertexturelist.h"
+#include "llvolume.h"
+#include "llvolumemgr.h"
+#include "llvovolume.h"
+#include "llworld.h"
+#include "material_codes.h"
+#include "pipeline.h"
+#include "llinventorymodel.h"
+#include "llfoldertype.h"
+#include "llviewerparcelmgr.h"
+#include "lluploadfloaterobservers.h"
+
+#include "boost/lexical_cast.hpp"
+
+#ifndef LL_WINDOWS
+#include "netdb.h"
+#endif
+
+#include <queue>
+
+LLMeshRepository gMeshRepo;
+
+const U32 MAX_MESH_REQUESTS_PER_SECOND = 100;
+
+// Maximum mesh version to support. Three least significant digits are reserved for the minor version,
+// with major version changes indicating a format change that is not backwards compatible and should not
+// be parsed by viewers that don't specifically support that version. For example, if the integer "1" is
+// present, the version is 0.001. A viewer that can parse version 0.001 can also parse versions up to 0.999,
+// but not 1.0 (integer 1000).
+// See wiki at https://wiki.secondlife.com/wiki/Mesh/Mesh_Asset_Format
+const S32 MAX_MESH_VERSION = 999;
+
+U32 LLMeshRepository::sBytesReceived = 0;
+U32 LLMeshRepository::sHTTPRequestCount = 0;
+U32 LLMeshRepository::sHTTPRetryCount = 0;
+U32 LLMeshRepository::sLODProcessing = 0;
+U32 LLMeshRepository::sLODPending = 0;
+
+U32 LLMeshRepository::sCacheBytesRead = 0;
+U32 LLMeshRepository::sCacheBytesWritten = 0;
+U32 LLMeshRepository::sPeakKbps = 0;
+
+
+const U32 MAX_TEXTURE_UPLOAD_RETRIES = 5;
+
+static S32 dump_num = 0;
+std::string make_dump_name(std::string prefix, S32 num)
+{
+ return prefix + boost::lexical_cast<std::string>(num) + std::string(".xml");
+
+}
+void dump_llsd_to_file(const LLSD& content, std::string filename);
+LLSD llsd_from_file(std::string filename);
+
+std::string header_lod[] =
+{
+ "lowest_lod",
+ "low_lod",
+ "medium_lod",
+ "high_lod"
+};
+
+
+//get the number of bytes resident in memory for given volume
+U32 get_volume_memory_size(const LLVolume* volume)
+{
+ U32 indices = 0;
+ U32 vertices = 0;
+
+ for (U32 i = 0; i < volume->getNumVolumeFaces(); ++i)
+ {
+ const LLVolumeFace& face = volume->getVolumeFace(i);
+ indices += face.mNumIndices;
+ vertices += face.mNumVertices;
+ }
+
+
+ return indices*2+vertices*11+sizeof(LLVolume)+sizeof(LLVolumeFace)*volume->getNumVolumeFaces();
+}
+
+void get_vertex_buffer_from_mesh(LLCDMeshData& mesh, LLModel::PhysicsMesh& res, F32 scale = 1.f)
+{
+ res.mPositions.clear();
+ res.mNormals.clear();
+
+ const F32* v = mesh.mVertexBase;
+
+ if (mesh.mIndexType == LLCDMeshData::INT_16)
+ {
+ U16* idx = (U16*) mesh.mIndexBase;
+ for (S32 j = 0; j < mesh.mNumTriangles; ++j)
+ {
+ F32* mp0 = (F32*) ((U8*)v+idx[0]*mesh.mVertexStrideBytes);
+ F32* mp1 = (F32*) ((U8*)v+idx[1]*mesh.mVertexStrideBytes);
+ F32* mp2 = (F32*) ((U8*)v+idx[2]*mesh.mVertexStrideBytes);
+
+ idx = (U16*) (((U8*)idx)+mesh.mIndexStrideBytes);
+
+ LLVector3 v0(mp0);
+ LLVector3 v1(mp1);
+ LLVector3 v2(mp2);
+
+ LLVector3 n = (v1-v0)%(v2-v0);
+ n.normalize();
+
+ res.mPositions.push_back(v0*scale);
+ res.mPositions.push_back(v1*scale);
+ res.mPositions.push_back(v2*scale);
+
+ res.mNormals.push_back(n);
+ res.mNormals.push_back(n);
+ res.mNormals.push_back(n);
+ }
+ }
+ else
+ {
+ U32* idx = (U32*) mesh.mIndexBase;
+ for (S32 j = 0; j < mesh.mNumTriangles; ++j)
+ {
+ F32* mp0 = (F32*) ((U8*)v+idx[0]*mesh.mVertexStrideBytes);
+ F32* mp1 = (F32*) ((U8*)v+idx[1]*mesh.mVertexStrideBytes);
+ F32* mp2 = (F32*) ((U8*)v+idx[2]*mesh.mVertexStrideBytes);
+
+ idx = (U32*) (((U8*)idx)+mesh.mIndexStrideBytes);
+
+ LLVector3 v0(mp0);
+ LLVector3 v1(mp1);
+ LLVector3 v2(mp2);
+
+ LLVector3 n = (v1-v0)%(v2-v0);
+ n.normalize();
+
+ res.mPositions.push_back(v0*scale);
+ res.mPositions.push_back(v1*scale);
+ res.mPositions.push_back(v2*scale);
+
+ res.mNormals.push_back(n);
+ res.mNormals.push_back(n);
+ res.mNormals.push_back(n);
+ }
+ }
+}
+
+S32 LLMeshRepoThread::sActiveHeaderRequests = 0;
+S32 LLMeshRepoThread::sActiveLODRequests = 0;
+U32 LLMeshRepoThread::sMaxConcurrentRequests = 1;
+
+class LLMeshHeaderResponder : public LLCurl::Responder
+{
+public:
+ LLVolumeParams mMeshParams;
+
+ LLMeshHeaderResponder(const LLVolumeParams& mesh_params)
+ : mMeshParams(mesh_params)
+ {
+ LLMeshRepoThread::sActiveHeaderRequests++;
+ }
+
+ ~LLMeshHeaderResponder()
+ {
+ LLMeshRepoThread::sActiveHeaderRequests--;
+ }
+
+ virtual void completedRaw(U32 status, const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer);
+
+};
+
+class LLMeshLODResponder : public LLCurl::Responder
+{
+public:
+ LLVolumeParams mMeshParams;
+ S32 mLOD;
+ U32 mRequestedBytes;
+ U32 mOffset;
+
+ LLMeshLODResponder(const LLVolumeParams& mesh_params, S32 lod, U32 offset, U32 requested_bytes)
+ : mMeshParams(mesh_params), mLOD(lod), mOffset(offset), mRequestedBytes(requested_bytes)
+ {
+ LLMeshRepoThread::sActiveLODRequests++;
+ }
+
+ ~LLMeshLODResponder()
+ {
+ LLMeshRepoThread::sActiveLODRequests--;
+ }
+
+ virtual void completedRaw(U32 status, const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer);
+
+};
+
+class LLMeshSkinInfoResponder : public LLCurl::Responder
+{
+public:
+ LLUUID mMeshID;
+ U32 mRequestedBytes;
+ U32 mOffset;
+
+ LLMeshSkinInfoResponder(const LLUUID& id, U32 offset, U32 size)
+ : mMeshID(id), mRequestedBytes(size), mOffset(offset)
+ {
+ }
+
+ virtual void completedRaw(U32 status, const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer);
+
+};
+
+class LLMeshDecompositionResponder : public LLCurl::Responder
+{
+public:
+ LLUUID mMeshID;
+ U32 mRequestedBytes;
+ U32 mOffset;
+
+ LLMeshDecompositionResponder(const LLUUID& id, U32 offset, U32 size)
+ : mMeshID(id), mRequestedBytes(size), mOffset(offset)
+ {
+ }
+
+ virtual void completedRaw(U32 status, const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer);
+
+};
+
+class LLMeshPhysicsShapeResponder : public LLCurl::Responder
+{
+public:
+ LLUUID mMeshID;
+ U32 mRequestedBytes;
+ U32 mOffset;
+
+ LLMeshPhysicsShapeResponder(const LLUUID& id, U32 offset, U32 size)
+ : mMeshID(id), mRequestedBytes(size), mOffset(offset)
+ {
+ }
+
+ virtual void completedRaw(U32 status, const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer);
+
+};
+
+void log_upload_error(S32 status, const LLSD& content, std::string stage, std::string model_name)
+{
+ // Add notification popup.
+ LLSD args;
+ std::string message = content["error"]["message"];
+ std::string identifier = content["error"]["identifier"];
+ args["MESSAGE"] = message;
+ args["IDENTIFIER"] = identifier;
+ args["LABEL"] = model_name;
+ gMeshRepo.uploadError(args);
+
+ // Log details.
+ llwarns << "stage: " << stage << " http status: " << status << llendl;
+ if (content.has("error"))
+ {
+ const LLSD& err = content["error"];
+ llwarns << "err: " << err << llendl;
+ llwarns << "mesh upload failed, stage '" << stage
+ << "' error '" << err["error"].asString()
+ << "', message '" << err["message"].asString()
+ << "', id '" << err["identifier"].asString()
+ << "'" << llendl;
+ if (err.has("errors"))
+ {
+ S32 error_num = 0;
+ const LLSD& err_list = err["errors"];
+ for (LLSD::array_const_iterator it = err_list.beginArray();
+ it != err_list.endArray();
+ ++it)
+ {
+ const LLSD& err_entry = *it;
+ llwarns << "error[" << error_num << "]:" << llendl;
+ for (LLSD::map_const_iterator map_it = err_entry.beginMap();
+ map_it != err_entry.endMap();
+ ++map_it)
+ {
+ llwarns << "\t" << map_it->first << ": "
+ << map_it->second << llendl;
+ }
+ error_num++;
+ }
+ }
+ }
+ else
+ {
+ llwarns << "bad mesh, no error information available" << llendl;
+ }
+}
+
+class LLWholeModelFeeResponder: public LLCurl::Responder
+{
+ LLMeshUploadThread* mThread;
+ LLSD mModelData;
+ LLHandle<LLWholeModelFeeObserver> mObserverHandle;
+public:
+ LLWholeModelFeeResponder(LLMeshUploadThread* thread, LLSD& model_data, LLHandle<LLWholeModelFeeObserver> observer_handle):
+ mThread(thread),
+ mModelData(model_data),
+ mObserverHandle(observer_handle)
+ {
+ }
+ virtual void completed(U32 status,
+ const std::string& reason,
+ const LLSD& content)
+ {
+ LLSD cc = content;
+ if (gSavedSettings.getS32("MeshUploadFakeErrors")&1)
+ {
+ cc = llsd_from_file("fake_upload_error.xml");
+ }
+
+ mThread->mPendingUploads--;
+ dump_llsd_to_file(cc,make_dump_name("whole_model_fee_response_",dump_num));
+
+ LLWholeModelFeeObserver* observer = mObserverHandle.get();
+
+ if (isGoodStatus(status) &&
+ cc["state"].asString() == "upload")
+ {
+ mThread->mWholeModelUploadURL = cc["uploader"].asString();
+
+ if (observer)
+ {
+ cc["data"]["upload_price"] = cc["upload_price"];
+ observer->onModelPhysicsFeeReceived(cc["data"], mThread->mWholeModelUploadURL);
+ }
+ }
+ else
+ {
+ llwarns << "fee request failed" << llendl;
+ log_upload_error(status,cc,"fee",mModelData["name"]);
+ mThread->mWholeModelUploadURL = "";
+
+ if (observer)
+ {
+ observer->setModelPhysicsFeeErrorStatus(status, reason);
+ }
+ }
+ }
+
+};
+
+class LLWholeModelUploadResponder: public LLCurl::Responder
+{
+ LLMeshUploadThread* mThread;
+ LLSD mModelData;
+ LLHandle<LLWholeModelUploadObserver> mObserverHandle;
+
+public:
+ LLWholeModelUploadResponder(LLMeshUploadThread* thread, LLSD& model_data, LLHandle<LLWholeModelUploadObserver> observer_handle):
+ mThread(thread),
+ mModelData(model_data),
+ mObserverHandle(observer_handle)
+ {
+ }
+ virtual void completed(U32 status,
+ const std::string& reason,
+ const LLSD& content)
+ {
+ LLSD cc = content;
+ if (gSavedSettings.getS32("MeshUploadFakeErrors")&2)
+ {
+ cc = llsd_from_file("fake_upload_error.xml");
+ }
+
+ mThread->mPendingUploads--;
+ dump_llsd_to_file(cc,make_dump_name("whole_model_upload_response_",dump_num));
+
+ LLWholeModelUploadObserver* observer = mObserverHandle.get();
+
+ // requested "mesh" asset type isn't actually the type
+ // of the resultant object, fix it up here.
+ if (isGoodStatus(status) &&
+ cc["state"].asString() == "complete")
+ {
+ mModelData["asset_type"] = "object";
+ gMeshRepo.updateInventory(LLMeshRepository::inventory_data(mModelData,cc));
+
+ if (observer)
+ {
+ doOnIdleOneTime(boost::bind(&LLWholeModelUploadObserver::onModelUploadSuccess, observer));
+ }
+ }
+ else
+ {
+ llwarns << "upload failed" << llendl;
+ std::string model_name = mModelData["name"].asString();
+ log_upload_error(status,cc,"upload",model_name);
+
+ if (observer)
+ {
+ doOnIdleOneTime(boost::bind(&LLWholeModelUploadObserver::onModelUploadFailure, observer));
+ }
+ }
+ }
+};
+
+LLMeshRepoThread::LLMeshRepoThread()
+: LLThread("mesh repo")
+{
+ mWaiting = false;
+ mMutex = new LLMutex(NULL);
+ mHeaderMutex = new LLMutex(NULL);
+ mSignal = new LLCondition(NULL);
+}
+
+LLMeshRepoThread::~LLMeshRepoThread()
+{
+ delete mMutex;
+ mMutex = NULL;
+ delete mHeaderMutex;
+ mHeaderMutex = NULL;
+ delete mSignal;
+ mSignal = NULL;
+}
+
+void LLMeshRepoThread::run()
+{
+ mCurlRequest = new LLCurlRequest();
+ LLCDResult res = LLConvexDecomposition::initThread();
+ if (res != LLCD_OK)
+ {
+ llwarns << "convex decomposition unable to be loaded" << llendl;
+ }
+
+ while (!LLApp::isQuitting())
+ {
+ mWaiting = true;
+ mSignal->wait();
+ mWaiting = false;
+
+ if (!LLApp::isQuitting())
+ {
+ static U32 count = 0;
+
+ static F32 last_hundred = gFrameTimeSeconds;
+
+ if (gFrameTimeSeconds - last_hundred > 1.f)
+ { //a second has gone by, clear count
+ last_hundred = gFrameTimeSeconds;
+ count = 0;
+ }
+
+ // NOTE: throttling intentionally favors LOD requests over header requests
+
+ while (!mLODReqQ.empty() && count < MAX_MESH_REQUESTS_PER_SECOND && sActiveLODRequests < sMaxConcurrentRequests)
+ {
+ if (mMutex)
+ {
+ mMutex->lock();
+ LODRequest req = mLODReqQ.front();
+ mLODReqQ.pop();
+ LLMeshRepository::sLODProcessing--;
+ mMutex->unlock();
+ if (!fetchMeshLOD(req.mMeshParams, req.mLOD, count))//failed, resubmit
+ {
+ mMutex->lock();
+ mLODReqQ.push(req) ;
+ mMutex->unlock();
+ }
+ }
+ }
+
+ while (!mHeaderReqQ.empty() && count < MAX_MESH_REQUESTS_PER_SECOND && sActiveHeaderRequests < sMaxConcurrentRequests)
+ {
+ if (mMutex)
+ {
+ mMutex->lock();
+ HeaderRequest req = mHeaderReqQ.front();
+ mHeaderReqQ.pop();
+ mMutex->unlock();
+ if (!fetchMeshHeader(req.mMeshParams, count))//failed, resubmit
+ {
+ mMutex->lock();
+ mHeaderReqQ.push(req) ;
+ mMutex->unlock();
+ }
+ }
+ }
+
+ { //mSkinRequests is protected by mSignal
+ std::set<LLUUID> incomplete;
+ for (std::set<LLUUID>::iterator iter = mSkinRequests.begin(); iter != mSkinRequests.end(); ++iter)
+ {
+ LLUUID mesh_id = *iter;
+ if (!fetchMeshSkinInfo(mesh_id))
+ {
+ incomplete.insert(mesh_id);
+ }
+ }
+ mSkinRequests = incomplete;
+ }
+
+ { //mDecompositionRequests is protected by mSignal
+ std::set<LLUUID> incomplete;
+ for (std::set<LLUUID>::iterator iter = mDecompositionRequests.begin(); iter != mDecompositionRequests.end(); ++iter)
+ {
+ LLUUID mesh_id = *iter;
+ if (!fetchMeshDecomposition(mesh_id))
+ {
+ incomplete.insert(mesh_id);
+ }
+ }
+ mDecompositionRequests = incomplete;
+ }
+
+ { //mPhysicsShapeRequests is protected by mSignal
+ std::set<LLUUID> incomplete;
+ for (std::set<LLUUID>::iterator iter = mPhysicsShapeRequests.begin(); iter != mPhysicsShapeRequests.end(); ++iter)
+ {
+ LLUUID mesh_id = *iter;
+ if (!fetchMeshPhysicsShape(mesh_id))
+ {
+ incomplete.insert(mesh_id);
+ }
+ }
+ mPhysicsShapeRequests = incomplete;
+ }
+
+ mCurlRequest->process();
+ }
+ }
+
+ if (mSignal->isLocked())
+ { //make sure to let go of the mutex associated with the given signal before shutting down
+ mSignal->unlock();
+ }
+
+ res = LLConvexDecomposition::quitThread();
+ if (res != LLCD_OK)
+ {
+ llwarns << "convex decomposition unable to be quit" << llendl;
+ }
+
+ delete mCurlRequest;
+ mCurlRequest = NULL;
+}
+
+void LLMeshRepoThread::loadMeshSkinInfo(const LLUUID& mesh_id)
+{ //protected by mSignal, no locking needed here
+ mSkinRequests.insert(mesh_id);
+}
+
+void LLMeshRepoThread::loadMeshDecomposition(const LLUUID& mesh_id)
+{ //protected by mSignal, no locking needed here
+ mDecompositionRequests.insert(mesh_id);
+}
+
+void LLMeshRepoThread::loadMeshPhysicsShape(const LLUUID& mesh_id)
+{ //protected by mSignal, no locking needed here
+ mPhysicsShapeRequests.insert(mesh_id);
+}
+
+
+void LLMeshRepoThread::loadMeshLOD(const LLVolumeParams& mesh_params, S32 lod)
+{ //protected by mSignal, no locking needed here
+
+ mesh_header_map::iterator iter = mMeshHeader.find(mesh_params.getSculptID());
+ if (iter != mMeshHeader.end())
+ { //if we have the header, request LOD byte range
+ LODRequest req(mesh_params, lod);
+ {
+ LLMutexLock lock(mMutex);
+ mLODReqQ.push(req);
+ LLMeshRepository::sLODProcessing++;
+ }
+ }
+ else
+ {
+ HeaderRequest req(mesh_params);
+
+ pending_lod_map::iterator pending = mPendingLOD.find(mesh_params);
+
+ if (pending != mPendingLOD.end())
+ { //append this lod request to existing header request
+ pending->second.push_back(lod);
+ llassert(pending->second.size() <= LLModel::NUM_LODS)
+ }
+ else
+ { //if no header request is pending, fetch header
+ LLMutexLock lock(mMutex);
+ mHeaderReqQ.push(req);
+ mPendingLOD[mesh_params].push_back(lod);
+ }
+ }
+}
+
+//static
+std::string LLMeshRepoThread::constructUrl(LLUUID mesh_id)
+{
+ std::string http_url;
+
+ if (gAgent.getRegion())
+ {
+ http_url = gMeshRepo.mGetMeshCapability;
+ }
+
+ if (!http_url.empty())
+ {
+ http_url += "/?mesh_id=";
+ http_url += mesh_id.asString().c_str();
+ }
+ else
+ {
+ llwarns << "Current region does not have GetMesh capability! Cannot load " << mesh_id << ".mesh" << llendl;
+ }
+
+ return http_url;
+}
+
+bool LLMeshRepoThread::fetchMeshSkinInfo(const LLUUID& mesh_id)
+{ //protected by mMutex
+
+ if (!mHeaderMutex)
+ {
+ return false;
+ }
+
+ mHeaderMutex->lock();
+
+ if (mMeshHeader.find(mesh_id) == mMeshHeader.end())
+ { //we have no header info for this mesh, do nothing
+ mHeaderMutex->unlock();
+ return false;
+ }
+
+ bool ret = true ;
+ U32 header_size = mMeshHeaderSize[mesh_id];
+
+ if (header_size > 0)
+ {
+ S32 version = mMeshHeader[mesh_id]["version"].asInteger();
+ S32 offset = header_size + mMeshHeader[mesh_id]["skin"]["offset"].asInteger();
+ S32 size = mMeshHeader[mesh_id]["skin"]["size"].asInteger();
+
+ mHeaderMutex->unlock();
+
+ if (version <= MAX_MESH_VERSION && offset >= 0 && size > 0)
+ {
+ //check VFS for mesh skin info
+ LLVFile file(gVFS, mesh_id, LLAssetType::AT_MESH);
+ if (file.getSize() >= offset+size)
+ {
+ LLMeshRepository::sCacheBytesRead += size;
+ file.seek(offset);
+ U8* buffer = new U8[size];
+ file.read(buffer, size);
+
+ //make sure buffer isn't all 0's by checking the first 1KB (reserved block but not written)
+ bool zero = true;
+ for (S32 i = 0; i < llmin(size, 1024) && zero; ++i)
+ {
+ zero = buffer[i] > 0 ? false : true;
+ }
+
+ if (!zero)
+ { //attempt to parse
+ if (skinInfoReceived(mesh_id, buffer, size))
+ {
+ delete[] buffer;
+ return true;
+ }
+ }
+
+ delete[] buffer;
+ }
+
+ //reading from VFS failed for whatever reason, fetch from sim
+ std::vector<std::string> headers;
+ headers.push_back("Accept: application/octet-stream");
+
+ std::string http_url = constructUrl(mesh_id);
+ if (!http_url.empty())
+ {
+ ret = mCurlRequest->getByteRange(http_url, headers, offset, size,
+ new LLMeshSkinInfoResponder(mesh_id, offset, size));
+ if(ret)
+ {
+ LLMeshRepository::sHTTPRequestCount++;
+ }
+ }
+ }
+ }
+ else
+ {
+ mHeaderMutex->unlock();
+ }
+
+ //early out was not hit, effectively fetched
+ return ret;
+}
+
+bool LLMeshRepoThread::fetchMeshDecomposition(const LLUUID& mesh_id)
+{ //protected by mMutex
+ if (!mHeaderMutex)
+ {
+ return false;
+ }
+
+ mHeaderMutex->lock();
+
+ if (mMeshHeader.find(mesh_id) == mMeshHeader.end())
+ { //we have no header info for this mesh, do nothing
+ mHeaderMutex->unlock();
+ return false;
+ }
+
+ U32 header_size = mMeshHeaderSize[mesh_id];
+ bool ret = true ;
+
+ if (header_size > 0)
+ {
+ S32 version = mMeshHeader[mesh_id]["version"].asInteger();
+ S32 offset = header_size + mMeshHeader[mesh_id]["physics_convex"]["offset"].asInteger();
+ S32 size = mMeshHeader[mesh_id]["physics_convex"]["size"].asInteger();
+
+ mHeaderMutex->unlock();
+
+ if (version <= MAX_MESH_VERSION && offset >= 0 && size > 0)
+ {
+ //check VFS for mesh skin info
+ LLVFile file(gVFS, mesh_id, LLAssetType::AT_MESH);
+ if (file.getSize() >= offset+size)
+ {
+ LLMeshRepository::sCacheBytesRead += size;
+
+ file.seek(offset);
+ U8* buffer = new U8[size];
+ file.read(buffer, size);
+
+ //make sure buffer isn't all 0's by checking the first 1KB (reserved block but not written)
+ bool zero = true;
+ for (S32 i = 0; i < llmin(size, 1024) && zero; ++i)
+ {
+ zero = buffer[i] > 0 ? false : true;
+ }
+
+ if (!zero)
+ { //attempt to parse
+ if (decompositionReceived(mesh_id, buffer, size))
+ {
+ delete[] buffer;
+ return true;
+ }
+ }
+
+ delete[] buffer;
+ }
+
+ //reading from VFS failed for whatever reason, fetch from sim
+ std::vector<std::string> headers;
+ headers.push_back("Accept: application/octet-stream");
+
+ std::string http_url = constructUrl(mesh_id);
+ if (!http_url.empty())
+ {
+ ret = mCurlRequest->getByteRange(http_url, headers, offset, size,
+ new LLMeshDecompositionResponder(mesh_id, offset, size));
+ if(ret)
+ {
+ LLMeshRepository::sHTTPRequestCount++;
+ }
+ }
+ }
+ }
+ else
+ {
+ mHeaderMutex->unlock();
+ }
+
+ //early out was not hit, effectively fetched
+ return ret;
+}
+
+bool LLMeshRepoThread::fetchMeshPhysicsShape(const LLUUID& mesh_id)
+{ //protected by mMutex
+ if (!mHeaderMutex)
+ {
+ return false;
+ }
+
+ mHeaderMutex->lock();
+
+ if (mMeshHeader.find(mesh_id) == mMeshHeader.end())
+ { //we have no header info for this mesh, do nothing
+ mHeaderMutex->unlock();
+ return false;
+ }
+
+ U32 header_size = mMeshHeaderSize[mesh_id];
+ bool ret = true ;
+
+ if (header_size > 0)
+ {
+ S32 version = mMeshHeader[mesh_id]["version"].asInteger();
+ S32 offset = header_size + mMeshHeader[mesh_id]["physics_mesh"]["offset"].asInteger();
+ S32 size = mMeshHeader[mesh_id]["physics_mesh"]["size"].asInteger();
+
+ mHeaderMutex->unlock();
+
+ if (version <= MAX_MESH_VERSION && offset >= 0 && size > 0)
+ {
+ //check VFS for mesh physics shape info
+ LLVFile file(gVFS, mesh_id, LLAssetType::AT_MESH);
+ if (file.getSize() >= offset+size)
+ {
+ LLMeshRepository::sCacheBytesRead += size;
+ file.seek(offset);
+ U8* buffer = new U8[size];
+ file.read(buffer, size);
+
+ //make sure buffer isn't all 0's by checking the first 1KB (reserved block but not written)
+ bool zero = true;
+ for (S32 i = 0; i < llmin(size, 1024) && zero; ++i)
+ {
+ zero = buffer[i] > 0 ? false : true;
+ }
+
+ if (!zero)
+ { //attempt to parse
+ if (physicsShapeReceived(mesh_id, buffer, size))
+ {
+ delete[] buffer;
+ return true;
+ }
+ }
+
+ delete[] buffer;
+ }
+
+ //reading from VFS failed for whatever reason, fetch from sim
+ std::vector<std::string> headers;
+ headers.push_back("Accept: application/octet-stream");
+
+ std::string http_url = constructUrl(mesh_id);
+ if (!http_url.empty())
+ {
+ ret = mCurlRequest->getByteRange(http_url, headers, offset, size,
+ new LLMeshPhysicsShapeResponder(mesh_id, offset, size));
+
+ if(ret)
+ {
+ LLMeshRepository::sHTTPRequestCount++;
+ }
+ }
+ }
+ else
+ { //no physics shape whatsoever, report back NULL
+ physicsShapeReceived(mesh_id, NULL, 0);
+ }
+ }
+ else
+ {
+ mHeaderMutex->unlock();
+ }
+
+ //early out was not hit, effectively fetched
+ return ret;
+}
+
+//return false if failed to get header
+bool LLMeshRepoThread::fetchMeshHeader(const LLVolumeParams& mesh_params, U32& count)
+{
+ {
+ //look for mesh in asset in vfs
+ LLVFile file(gVFS, mesh_params.getSculptID(), LLAssetType::AT_MESH);
+
+ S32 size = file.getSize();
+
+ if (size > 0)
+ { //NOTE -- if the header size is ever more than 4KB, this will break
+ U8 buffer[4096];
+ S32 bytes = llmin(size, 4096);
+ LLMeshRepository::sCacheBytesRead += bytes;
+ file.read(buffer, bytes);
+ if (headerReceived(mesh_params, buffer, bytes))
+ { //did not do an HTTP request, return false
+ return true;
+ }
+ }
+ }
+
+ //either cache entry doesn't exist or is corrupt, request header from simulator
+ bool retval = true ;
+ std::vector<std::string> headers;
+ headers.push_back("Accept: application/octet-stream");
+
+ std::string http_url = constructUrl(mesh_params.getSculptID());
+ if (!http_url.empty())
+ {
+ //grab first 4KB if we're going to bother with a fetch. Cache will prevent future fetches if a full mesh fits
+ //within the first 4KB
+ //NOTE -- this will break of headers ever exceed 4KB
+ retval = mCurlRequest->getByteRange(http_url, headers, 0, 4096, new LLMeshHeaderResponder(mesh_params));
+ if(retval)
+ {
+ LLMeshRepository::sHTTPRequestCount++;
+ }
+ count++;
+ }
+
+ return retval;
+}
+
+//return false if failed to get mesh lod.
+bool LLMeshRepoThread::fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod, U32& count)
+{ //protected by mMutex
+ if (!mHeaderMutex)
+ {
+ return false;
+ }
+
+ mHeaderMutex->lock();
+
+ bool retval = true;
+
+ LLUUID mesh_id = mesh_params.getSculptID();
+
+ U32 header_size = mMeshHeaderSize[mesh_id];
+
+ if (header_size > 0)
+ {
+ S32 version = mMeshHeader[mesh_id]["version"].asInteger();
+ S32 offset = header_size + mMeshHeader[mesh_id][header_lod[lod]]["offset"].asInteger();
+ S32 size = mMeshHeader[mesh_id][header_lod[lod]]["size"].asInteger();
+ mHeaderMutex->unlock();
+
+ if (version <= MAX_MESH_VERSION && offset >= 0 && size > 0)
+ {
+
+ //check VFS for mesh asset
+ LLVFile file(gVFS, mesh_id, LLAssetType::AT_MESH);
+ if (file.getSize() >= offset+size)
+ {
+ LLMeshRepository::sCacheBytesRead += size;
+ file.seek(offset);
+ U8* buffer = new U8[size];
+ file.read(buffer, size);
+
+ //make sure buffer isn't all 0's by checking the first 1KB (reserved block but not written)
+ bool zero = true;
+ for (S32 i = 0; i < llmin(size, 1024) && zero; ++i)
+ {
+ zero = buffer[i] > 0 ? false : true;
+ }
+
+ if (!zero)
+ { //attempt to parse
+ if (lodReceived(mesh_params, lod, buffer, size))
+ {
+ delete[] buffer;
+ return true;
+ }
+ }
+
+ delete[] buffer;
+ }
+
+ //reading from VFS failed for whatever reason, fetch from sim
+ std::vector<std::string> headers;
+ headers.push_back("Accept: application/octet-stream");
+
+ std::string http_url = constructUrl(mesh_id);
+ if (!http_url.empty())
+ {
+ retval = mCurlRequest->getByteRange(constructUrl(mesh_id), headers, offset, size,
+ new LLMeshLODResponder(mesh_params, lod, offset, size));
+
+ if(retval)
+ {
+ LLMeshRepository::sHTTPRequestCount++;
+ }
+ count++;
+ }
+ else
+ {
+ mUnavailableQ.push(LODRequest(mesh_params, lod));
+ }
+ }
+ else
+ {
+ mUnavailableQ.push(LODRequest(mesh_params, lod));
+ }
+ }
+ else
+ {
+ mHeaderMutex->unlock();
+ }
+
+ return retval;
+}
+
+bool LLMeshRepoThread::headerReceived(const LLVolumeParams& mesh_params, U8* data, S32 data_size)
+{
+ LLSD header;
+
+ U32 header_size = 0;
+ if (data_size > 0)
+ {
+ std::string res_str((char*) data, data_size);
+
+ std::string deprecated_header("<? LLSD/Binary ?>");
+
+ if (res_str.substr(0, deprecated_header.size()) == deprecated_header)
+ {
+ res_str = res_str.substr(deprecated_header.size()+1, data_size);
+ header_size = deprecated_header.size()+1;
+ }
+ data_size = res_str.size();
+
+ std::istringstream stream(res_str);
+
+ if (!LLSDSerialize::fromBinary(header, stream, data_size))
+ {
+ llwarns << "Mesh header parse error. Not a valid mesh asset!" << llendl;
+ return false;
+ }
+
+ header_size += stream.tellg();
+ }
+ else
+ {
+ llinfos
+ << "Marking header as non-existent, will not retry." << llendl;
+ header["404"] = 1;
+ }
+
+ {
+ LLUUID mesh_id = mesh_params.getSculptID();
+
+ {
+ LLMutexLock lock(mHeaderMutex);
+ mMeshHeaderSize[mesh_id] = header_size;
+ mMeshHeader[mesh_id] = header;
+ }
+
+ //check for pending requests
+ pending_lod_map::iterator iter = mPendingLOD.find(mesh_params);
+ if (iter != mPendingLOD.end())
+ {
+ LLMutexLock lock(mMutex);
+ for (U32 i = 0; i < iter->second.size(); ++i)
+ {
+ LODRequest req(mesh_params, iter->second[i]);
+ mLODReqQ.push(req);
+ LLMeshRepository::sLODProcessing++;
+ }
+ }
+ mPendingLOD.erase(iter);
+ }
+
+ return true;
+}
+
+bool LLMeshRepoThread::lodReceived(const LLVolumeParams& mesh_params, S32 lod, U8* data, S32 data_size)
+{
+ LLPointer<LLVolume> volume = new LLVolume(mesh_params, LLVolumeLODGroup::getVolumeScaleFromDetail(lod));
+ std::string mesh_string((char*) data, data_size);
+ std::istringstream stream(mesh_string);
+
+ if (volume->unpackVolumeFaces(stream, data_size))
+ {
+ if (volume->getNumFaces() > 0)
+ {
+ LoadedMesh mesh(volume, mesh_params, lod);
+ {
+ LLMutexLock lock(mMutex);
+ mLoadedQ.push(mesh);
+ }
+ return true;
+ }
+ }
+
+ return false;
+}
+
+bool LLMeshRepoThread::skinInfoReceived(const LLUUID& mesh_id, U8* data, S32 data_size)
+{
+ LLSD skin;
+
+ if (data_size > 0)
+ {
+ std::string res_str((char*) data, data_size);
+
+ std::istringstream stream(res_str);
+
+ if (!unzip_llsd(skin, stream, data_size))
+ {
+ llwarns << "Mesh skin info parse error. Not a valid mesh asset!" << llendl;
+ return false;
+ }
+ }
+
+ {
+ LLMeshSkinInfo info(skin);
+ info.mMeshID = mesh_id;
+
+ //llinfos<<"info pelvis offset"<<info.mPelvisOffset<<llendl;
+ mSkinInfoQ.push(info);
+ }
+
+ return true;
+}
+
+bool LLMeshRepoThread::decompositionReceived(const LLUUID& mesh_id, U8* data, S32 data_size)
+{
+ LLSD decomp;
+
+ if (data_size > 0)
+ {
+ std::string res_str((char*) data, data_size);
+
+ std::istringstream stream(res_str);
+
+ if (!unzip_llsd(decomp, stream, data_size))
+ {
+ llwarns << "Mesh decomposition parse error. Not a valid mesh asset!" << llendl;
+ return false;
+ }
+ }
+
+ {
+ LLModel::Decomposition* d = new LLModel::Decomposition(decomp);
+ d->mMeshID = mesh_id;
+ mDecompositionQ.push(d);
+ }
+
+ return true;
+}
+
+bool LLMeshRepoThread::physicsShapeReceived(const LLUUID& mesh_id, U8* data, S32 data_size)
+{
+ LLSD physics_shape;
+
+ LLModel::Decomposition* d = new LLModel::Decomposition();
+ d->mMeshID = mesh_id;
+
+ if (data == NULL)
+ { //no data, no physics shape exists
+ d->mPhysicsShapeMesh.clear();
+ }
+ else
+ {
+ LLVolumeParams volume_params;
+ volume_params.setType(LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE);
+ volume_params.setSculptID(mesh_id, LL_SCULPT_TYPE_MESH);
+ LLPointer<LLVolume> volume = new LLVolume(volume_params,0);
+ std::string mesh_string((char*) data, data_size);
+ std::istringstream stream(mesh_string);
+
+ if (volume->unpackVolumeFaces(stream, data_size))
+ {
+ //load volume faces into decomposition buffer
+ S32 vertex_count = 0;
+ S32 index_count = 0;
+
+ for (S32 i = 0; i < volume->getNumVolumeFaces(); ++i)
+ {
+ const LLVolumeFace& face = volume->getVolumeFace(i);
+ vertex_count += face.mNumVertices;
+ index_count += face.mNumIndices;
+ }
+
+ d->mPhysicsShapeMesh.clear();
+
+ std::vector<LLVector3>& pos = d->mPhysicsShapeMesh.mPositions;
+ std::vector<LLVector3>& norm = d->mPhysicsShapeMesh.mNormals;
+
+ for (S32 i = 0; i < volume->getNumVolumeFaces(); ++i)
+ {
+ const LLVolumeFace& face = volume->getVolumeFace(i);
+
+ for (S32 i = 0; i < face.mNumIndices; ++i)
+ {
+ U16 idx = face.mIndices[i];
+
+ pos.push_back(LLVector3(face.mPositions[idx].getF32ptr()));
+ norm.push_back(LLVector3(face.mNormals[idx].getF32ptr()));
+ }
+ }
+ }
+ }
+
+ mDecompositionQ.push(d);
+ return true;
+}
+
+LLMeshUploadThread::LLMeshUploadThread(LLMeshUploadThread::instance_list& data, LLVector3& scale, bool upload_textures,
+ bool upload_skin, bool upload_joints, std::string upload_url, bool do_upload,
+ LLHandle<LLWholeModelFeeObserver> fee_observer, LLHandle<LLWholeModelUploadObserver> upload_observer)
+: LLThread("mesh upload"),
+ mDiscarded(FALSE),
+ mDoUpload(do_upload),
+ mWholeModelUploadURL(upload_url),
+ mFeeObserverHandle(fee_observer),
+ mUploadObserverHandle(upload_observer)
+{
+ mInstanceList = data;
+ mUploadTextures = upload_textures;
+ mUploadSkin = upload_skin;
+ mUploadJoints = upload_joints;
+ mMutex = new LLMutex(NULL);
+ mCurlRequest = NULL;
+ mPendingUploads = 0;
+ mFinished = false;
+ mOrigin = gAgent.getPositionAgent();
+ mHost = gAgent.getRegionHost();
+
+ mWholeModelFeeCapability = gAgent.getRegion()->getCapability("NewFileAgentInventory");
+
+ mOrigin += gAgent.getAtAxis() * scale.magVec();
+
+ mMeshUploadTimeOut = gSavedSettings.getS32("MeshUploadTimeOut") ;
+}
+
+LLMeshUploadThread::~LLMeshUploadThread()
+{
+
+}
+
+LLMeshUploadThread::DecompRequest::DecompRequest(LLModel* mdl, LLModel* base_model, LLMeshUploadThread* thread)
+{
+ mStage = "single_hull";
+ mModel = mdl;
+ mDecompID = &mdl->mDecompID;
+ mBaseModel = base_model;
+ mThread = thread;
+
+ //copy out positions and indices
+ assignData(mdl) ;
+
+ mThread->mFinalDecomp = this;
+ mThread->mPhysicsComplete = false;
+}
+
+void LLMeshUploadThread::DecompRequest::completed()
+{
+ if (mThread->mFinalDecomp == this)
+ {
+ mThread->mPhysicsComplete = true;
+ }
+
+ llassert(mHull.size() == 1);
+
+ mThread->mHullMap[mBaseModel] = mHull[0];
+}
+
+//called in the main thread.
+void LLMeshUploadThread::preStart()
+{
+ //build map of LLModel refs to instances for callbacks
+ for (instance_list::iterator iter = mInstanceList.begin(); iter != mInstanceList.end(); ++iter)
+ {
+ mInstance[iter->mModel].push_back(*iter);
+ }
+}
+
+void LLMeshUploadThread::discard()
+{
+ LLMutexLock lock(mMutex) ;
+ mDiscarded = TRUE ;
+}
+
+BOOL LLMeshUploadThread::isDiscarded()
+{
+ LLMutexLock lock(mMutex) ;
+ return mDiscarded ;
+}
+
+void LLMeshUploadThread::run()
+{
+ if (mDoUpload)
+ {
+ doWholeModelUpload();
+ }
+ else
+ {
+ requestWholeModelFee();
+ }
+}
+
+void dump_llsd_to_file(const LLSD& content, std::string filename)
+{
+ if (gSavedSettings.getBOOL("MeshUploadLogXML"))
+ {
+ std::ofstream of(filename.c_str());
+ LLSDSerialize::toPrettyXML(content,of);
+ }
+}
+
+LLSD llsd_from_file(std::string filename)
+{
+ std::ifstream ifs(filename.c_str());
+ LLSD result;
+ LLSDSerialize::fromXML(result,ifs);
+ return result;
+}
+
+void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures)
+{
+ LLSD result;
+
+ LLSD res;
+ result["folder_id"] = gInventory.findCategoryUUIDForType(LLFolderType::FT_OBJECT);
+ result["texture_folder_id"] = gInventory.findCategoryUUIDForType(LLFolderType::FT_TEXTURE);
+ result["asset_type"] = "mesh";
+ result["inventory_type"] = "object";
+ result["description"] = "(No Description)";
+ result["next_owner_mask"] = LLSD::Integer(LLFloaterPerms::getNextOwnerPerms());
+ result["group_mask"] = LLSD::Integer(LLFloaterPerms::getGroupPerms());
+ result["everyone_mask"] = LLSD::Integer(LLFloaterPerms::getEveryonePerms());
+
+ res["mesh_list"] = LLSD::emptyArray();
+ res["texture_list"] = LLSD::emptyArray();
+ res["instance_list"] = LLSD::emptyArray();
+ S32 mesh_num = 0;
+ S32 texture_num = 0;
+
+ std::set<LLViewerTexture* > textures;
+ std::map<LLViewerTexture*,S32> texture_index;
+
+ std::map<LLModel*,S32> mesh_index;
+ std::string model_name;
+ std::string model_metric;
+
+ S32 instance_num = 0;
+
+ for (instance_map::iterator iter = mInstance.begin(); iter != mInstance.end(); ++iter)
+ {
+ LLMeshUploadData data;
+ data.mBaseModel = iter->first;
+ LLModelInstance& first_instance = *(iter->second.begin());
+ for (S32 i = 0; i < 5; i++)
+ {
+ data.mModel[i] = first_instance.mLOD[i];
+ }
+
+ if (mesh_index.find(data.mBaseModel) == mesh_index.end())
+ {
+ // Have not seen this model before - create a new mesh_list entry for it.
+ if (model_name.empty())
+ {
+ model_name = data.mBaseModel->getName();
+ }
+
+ if (model_metric.empty())
+ {
+ model_metric = data.mBaseModel->getMetric();
+ }
+
+ std::stringstream ostr;
+
+ LLModel::Decomposition& decomp =
+ data.mModel[LLModel::LOD_PHYSICS].notNull() ?
+ data.mModel[LLModel::LOD_PHYSICS]->mPhysics :
+ data.mBaseModel->mPhysics;
+
+ decomp.mBaseHull = mHullMap[data.mBaseModel];
+
+ LLSD mesh_header = LLModel::writeModel(
+ ostr,
+ data.mModel[LLModel::LOD_PHYSICS],
+ data.mModel[LLModel::LOD_HIGH],
+ data.mModel[LLModel::LOD_MEDIUM],
+ data.mModel[LLModel::LOD_LOW],
+ data.mModel[LLModel::LOD_IMPOSTOR],
+ decomp,
+ mUploadSkin,
+ mUploadJoints);
+
+ data.mAssetData = ostr.str();
+ std::string str = ostr.str();
+
+ res["mesh_list"][mesh_num] = LLSD::Binary(str.begin(),str.end());
+ mesh_index[data.mBaseModel] = mesh_num;
+ mesh_num++;
+ }
+
+ // For all instances that use this model
+ for (instance_list::iterator instance_iter = iter->second.begin();
+ instance_iter != iter->second.end();
+ ++instance_iter)
+ {
+
+ LLModelInstance& instance = *instance_iter;
+
+ LLSD instance_entry;
+
+ for (S32 i = 0; i < 5; i++)
+ {
+ data.mModel[i] = instance.mLOD[i];
+ }
+
+ LLVector3 pos, scale;
+ LLQuaternion rot;
+ LLMatrix4 transformation = instance.mTransform;
+ decomposeMeshMatrix(transformation,pos,rot,scale);
+ instance_entry["position"] = ll_sd_from_vector3(pos);
+ instance_entry["rotation"] = ll_sd_from_quaternion(rot);
+ instance_entry["scale"] = ll_sd_from_vector3(scale);
+
+ instance_entry["material"] = LL_MCODE_WOOD;
+ instance_entry["physics_shape_type"] = (U8)(LLViewerObject::PHYSICS_SHAPE_CONVEX_HULL);
+ instance_entry["mesh"] = mesh_index[data.mBaseModel];
+
+ instance_entry["face_list"] = LLSD::emptyArray();
+
+ S32 end = llmin((S32)data.mBaseModel->mMaterialList.size(), data.mBaseModel->getNumVolumeFaces()) ;
+ for (S32 face_num = 0; face_num < end; face_num++)
+ {
+ LLImportMaterial& material = instance.mMaterial[data.mBaseModel->mMaterialList[face_num]];
+ LLSD face_entry = LLSD::emptyMap();
+ LLViewerFetchedTexture *texture = material.mDiffuseMap.get();
+
+ if ((texture != NULL) &&
+ (textures.find(texture) == textures.end()))
+ {
+ textures.insert(texture);
+ }
+
+ std::stringstream texture_str;
+ if (texture != NULL && include_textures && mUploadTextures)
+ {
+ if(texture->hasSavedRawImage())
+ {
+ LLPointer<LLImageJ2C> upload_file =
+ LLViewerTextureList::convertToUploadFile(texture->getSavedRawImage());
+ texture_str.write((const char*) upload_file->getData(), upload_file->getDataSize());
+ }
+ }
+
+ if (texture != NULL &&
+ mUploadTextures &&
+ texture_index.find(texture) == texture_index.end())
+ {
+ texture_index[texture] = texture_num;
+ std::string str = texture_str.str();
+ res["texture_list"][texture_num] = LLSD::Binary(str.begin(),str.end());
+ texture_num++;
+ }
+
+ // Subset of TextureEntry fields.
+ if (texture != NULL && mUploadTextures)
+ {
+ face_entry["image"] = texture_index[texture];
+ face_entry["scales"] = 1.0;
+ face_entry["scalet"] = 1.0;
+ face_entry["offsets"] = 0.0;
+ face_entry["offsett"] = 0.0;
+ face_entry["imagerot"] = 0.0;
+ }
+ face_entry["diffuse_color"] = ll_sd_from_color4(material.mDiffuseColor);
+ face_entry["fullbright"] = material.mFullbright;
+ instance_entry["face_list"][face_num] = face_entry;
+ }
+
+ res["instance_list"][instance_num] = instance_entry;
+ instance_num++;
+ }
+ }
+
+ if (model_name.empty()) model_name = "mesh model";
+ result["name"] = model_name;
+ if (model_metric.empty()) model_metric = "MUT_Unspecified";
+ res["metric"] = model_metric;
+ result["asset_resources"] = res;
+ dump_llsd_to_file(result,make_dump_name("whole_model_",dump_num));
+
+ dest = result;
+}
+
+void LLMeshUploadThread::generateHulls()
+{
+ bool has_valid_requests = false ;
+
+ for (instance_map::iterator iter = mInstance.begin(); iter != mInstance.end(); ++iter)
+ {
+ LLMeshUploadData data;
+ data.mBaseModel = iter->first;
+
+ LLModelInstance& instance = *(iter->second.begin());
+
+ for (S32 i = 0; i < 5; i++)
+ {
+ data.mModel[i] = instance.mLOD[i];
+ }
+
+ //queue up models for hull generation
+ LLModel* physics = NULL;
+
+ if (data.mModel[LLModel::LOD_PHYSICS].notNull())
+ {
+ physics = data.mModel[LLModel::LOD_PHYSICS];
+ }
+ else if (data.mModel[LLModel::LOD_LOW].notNull())
+ {
+ physics = data.mModel[LLModel::LOD_LOW];
+ }
+ else if (data.mModel[LLModel::LOD_MEDIUM].notNull())
+ {
+ physics = data.mModel[LLModel::LOD_MEDIUM];
+ }
+ else
+ {
+ physics = data.mModel[LLModel::LOD_HIGH];
+ }
+
+ llassert(physics != NULL);
+
+ DecompRequest* request = new DecompRequest(physics, data.mBaseModel, this);
+ if(request->isValid())
+ {
+ gMeshRepo.mDecompThread->submitRequest(request);
+ has_valid_requests = true ;
+ }
+ }
+
+ if(has_valid_requests)
+ {
+ while (!mPhysicsComplete)
+ {
+ apr_sleep(100);
+ }
+ }
+}
+
+void LLMeshUploadThread::doWholeModelUpload()
+{
+ mCurlRequest = new LLCurlRequest();
+
+ if (mWholeModelUploadURL.empty())
+ {
+ llinfos << "unable to upload, fee request failed" << llendl;
+ }
+ else
+ {
+ generateHulls();
+
+ LLSD full_model_data;
+ wholeModelToLLSD(full_model_data, true);
+ LLSD body = full_model_data["asset_resources"];
+ dump_llsd_to_file(body,make_dump_name("whole_model_body_",dump_num));
+ LLCurlRequest::headers_t headers;
+
+ {
+ LLCurl::ResponderPtr responder = new LLWholeModelUploadResponder(this, full_model_data, mUploadObserverHandle) ;
+
+ while(!mCurlRequest->post(mWholeModelUploadURL, headers, body, responder, mMeshUploadTimeOut))
+ {
+ //sleep for 10ms to prevent eating a whole core
+ apr_sleep(10000);
+ }
+ }
+
+ do
+ {
+ mCurlRequest->process();
+ //sleep for 10ms to prevent eating a whole core
+ apr_sleep(10000);
+ } while (mCurlRequest->getQueued() > 0);
+ }
+
+ delete mCurlRequest;
+ mCurlRequest = NULL;
+
+ // Currently a no-op.
+ mFinished = true;
+}
+
+void LLMeshUploadThread::requestWholeModelFee()
+{
+ dump_num++;
+
+ mCurlRequest = new LLCurlRequest();
+
+ generateHulls();
+
+ LLSD model_data;
+ wholeModelToLLSD(model_data,false);
+ dump_llsd_to_file(model_data,make_dump_name("whole_model_fee_request_",dump_num));
+
+ mPendingUploads++;
+ LLCurlRequest::headers_t headers;
+
+ {
+ LLCurl::ResponderPtr responder = new LLWholeModelFeeResponder(this,model_data, mFeeObserverHandle) ;
+ while(!mCurlRequest->post(mWholeModelFeeCapability, headers, model_data, responder, mMeshUploadTimeOut))
+ {
+ //sleep for 10ms to prevent eating a whole core
+ apr_sleep(10000);
+ }
+ }
+
+ do
+ {
+ mCurlRequest->process();
+ //sleep for 10ms to prevent eating a whole core
+ apr_sleep(10000);
+ } while (mCurlRequest->getQueued() > 0);
+
+ delete mCurlRequest;
+ mCurlRequest = NULL;
+
+ // Currently a no-op.
+ mFinished = true;
+}
+
+void LLMeshRepoThread::notifyLoadedMeshes()
+{
+ if (!mMutex)
+ {
+ return;
+ }
+
+ while (!mLoadedQ.empty())
+ {
+ mMutex->lock();
+ LoadedMesh mesh = mLoadedQ.front();
+ mLoadedQ.pop();
+ mMutex->unlock();
+
+ if (mesh.mVolume && mesh.mVolume->getNumVolumeFaces() > 0)
+ {
+ gMeshRepo.notifyMeshLoaded(mesh.mMeshParams, mesh.mVolume);
+ }
+ else
+ {
+ gMeshRepo.notifyMeshUnavailable(mesh.mMeshParams,
+ LLVolumeLODGroup::getVolumeDetailFromScale(mesh.mVolume->getDetail()));
+ }
+ }
+
+ while (!mUnavailableQ.empty())
+ {
+ mMutex->lock();
+ LODRequest req = mUnavailableQ.front();
+ mUnavailableQ.pop();
+ mMutex->unlock();
+
+ gMeshRepo.notifyMeshUnavailable(req.mMeshParams, req.mLOD);
+ }
+
+ while (!mSkinInfoQ.empty())
+ {
+ gMeshRepo.notifySkinInfoReceived(mSkinInfoQ.front());
+ mSkinInfoQ.pop();
+ }
+
+ while (!mDecompositionQ.empty())
+ {
+ gMeshRepo.notifyDecompositionReceived(mDecompositionQ.front());
+ mDecompositionQ.pop();
+ }
+}
+
+S32 LLMeshRepoThread::getActualMeshLOD(const LLVolumeParams& mesh_params, S32 lod)
+{ //only ever called from main thread
+ LLMutexLock lock(mHeaderMutex);
+ mesh_header_map::iterator iter = mMeshHeader.find(mesh_params.getSculptID());
+
+ if (iter != mMeshHeader.end())
+ {
+ LLSD& header = iter->second;
+
+ return LLMeshRepository::getActualMeshLOD(header, lod);
+ }
+
+ return lod;
+}
+
+//static
+S32 LLMeshRepository::getActualMeshLOD(LLSD& header, S32 lod)
+{
+ lod = llclamp(lod, 0, 3);
+
+ S32 version = header["version"];
+
+ if (header.has("404") || version > MAX_MESH_VERSION)
+ {
+ return -1;
+ }
+
+ if (header[header_lod[lod]]["size"].asInteger() > 0)
+ {
+ return lod;
+ }
+
+ //search down to find the next available lower lod
+ for (S32 i = lod-1; i >= 0; --i)
+ {
+ if (header[header_lod[i]]["size"].asInteger() > 0)
+ {
+ return i;
+ }
+ }
+
+ //search up to find then ext available higher lod
+ for (S32 i = lod+1; i < 4; ++i)
+ {
+ if (header[header_lod[i]]["size"].asInteger() > 0)
+ {
+ return i;
+ }
+ }
+
+ //header exists and no good lod found, treat as 404
+ header["404"] = 1;
+ return -1;
+}
+
+void LLMeshRepository::cacheOutgoingMesh(LLMeshUploadData& data, LLSD& header)
+{
+ mThread->mMeshHeader[data.mUUID] = header;
+
+ // we cache the mesh for default parameters
+ LLVolumeParams volume_params;
+ volume_params.setType(LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE);
+ volume_params.setSculptID(data.mUUID, LL_SCULPT_TYPE_MESH);
+
+ for (U32 i = 0; i < 4; i++)
+ {
+ if (data.mModel[i].notNull())
+ {
+ LLPointer<LLVolume> volume = new LLVolume(volume_params, LLVolumeLODGroup::getVolumeScaleFromDetail(i));
+ volume->copyVolumeFaces(data.mModel[i]);
+ volume->setMeshAssetLoaded(TRUE);
+ }
+ }
+
+}
+
+void LLMeshLODResponder::completedRaw(U32 status, const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer)
+{
+
+ S32 data_size = buffer->countAfter(channels.in(), NULL);
+
+ if (status < 200 || status > 400)
+ {
+ llwarns << status << ": " << reason << llendl;
+ }
+
+ if (data_size < mRequestedBytes)
+ {
+ if (status == 499 || status == 503)
+ { //timeout or service unavailable, try again
+ LLMeshRepository::sHTTPRetryCount++;
+ gMeshRepo.mThread->loadMeshLOD(mMeshParams, mLOD);
+ }
+ else
+ {
+ llwarns << "Unhandled status " << status << llendl;
+ }
+ return;
+ }
+
+ LLMeshRepository::sBytesReceived += mRequestedBytes;
+
+ U8* data = NULL;
+
+ if (data_size > 0)
+ {
+ data = new U8[data_size];
+ buffer->readAfter(channels.in(), NULL, data, data_size);
+ }
+
+ if (gMeshRepo.mThread->lodReceived(mMeshParams, mLOD, data, data_size))
+ {
+ //good fetch from sim, write to VFS for caching
+ LLVFile file(gVFS, mMeshParams.getSculptID(), LLAssetType::AT_MESH, LLVFile::WRITE);
+
+ S32 offset = mOffset;
+ S32 size = mRequestedBytes;
+
+ if (file.getSize() >= offset+size)
+ {
+ file.seek(offset);
+ file.write(data, size);
+ LLMeshRepository::sCacheBytesWritten += size;
+ }
+ }
+
+ delete [] data;
+}
+
+void LLMeshSkinInfoResponder::completedRaw(U32 status, const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer)
+{
+ S32 data_size = buffer->countAfter(channels.in(), NULL);
+
+ if (status < 200 || status > 400)
+ {
+ llwarns << status << ": " << reason << llendl;
+ }
+
+ if (data_size < mRequestedBytes)
+ {
+ if (status == 499 || status == 503)
+ { //timeout or service unavailable, try again
+ LLMeshRepository::sHTTPRetryCount++;
+ gMeshRepo.mThread->loadMeshSkinInfo(mMeshID);
+ }
+ else
+ {
+ llwarns << "Unhandled status " << status << llendl;
+ }
+ return;
+ }
+
+ LLMeshRepository::sBytesReceived += mRequestedBytes;
+
+ U8* data = NULL;
+
+ if (data_size > 0)
+ {
+ data = new U8[data_size];
+ buffer->readAfter(channels.in(), NULL, data, data_size);
+ }
+
+ if (gMeshRepo.mThread->skinInfoReceived(mMeshID, data, data_size))
+ {
+ //good fetch from sim, write to VFS for caching
+ LLVFile file(gVFS, mMeshID, LLAssetType::AT_MESH, LLVFile::WRITE);
+
+ S32 offset = mOffset;
+ S32 size = mRequestedBytes;
+
+ if (file.getSize() >= offset+size)
+ {
+ LLMeshRepository::sCacheBytesWritten += size;
+ file.seek(offset);
+ file.write(data, size);
+ }
+ }
+
+ delete [] data;
+}
+
+void LLMeshDecompositionResponder::completedRaw(U32 status, const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer)
+{
+ S32 data_size = buffer->countAfter(channels.in(), NULL);
+
+ if (status < 200 || status > 400)
+ {
+ llwarns << status << ": " << reason << llendl;
+ }
+
+ if (data_size < mRequestedBytes)
+ {
+ if (status == 499 || status == 503)
+ { //timeout or service unavailable, try again
+ LLMeshRepository::sHTTPRetryCount++;
+ gMeshRepo.mThread->loadMeshDecomposition(mMeshID);
+ }
+ else
+ {
+ llwarns << "Unhandled status " << status << llendl;
+ }
+ return;
+ }
+
+ LLMeshRepository::sBytesReceived += mRequestedBytes;
+
+ U8* data = NULL;
+
+ if (data_size > 0)
+ {
+ data = new U8[data_size];
+ buffer->readAfter(channels.in(), NULL, data, data_size);
+ }
+
+ if (gMeshRepo.mThread->decompositionReceived(mMeshID, data, data_size))
+ {
+ //good fetch from sim, write to VFS for caching
+ LLVFile file(gVFS, mMeshID, LLAssetType::AT_MESH, LLVFile::WRITE);
+
+ S32 offset = mOffset;
+ S32 size = mRequestedBytes;
+
+ if (file.getSize() >= offset+size)
+ {
+ LLMeshRepository::sCacheBytesWritten += size;
+ file.seek(offset);
+ file.write(data, size);
+ }
+ }
+
+ delete [] data;
+}
+
+void LLMeshPhysicsShapeResponder::completedRaw(U32 status, const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer)
+{
+ S32 data_size = buffer->countAfter(channels.in(), NULL);
+
+ if (status < 200 || status > 400)
+ {
+ llwarns << status << ": " << reason << llendl;
+ }
+
+ if (data_size < mRequestedBytes)
+ {
+ if (status == 499 || status == 503)
+ { //timeout or service unavailable, try again
+ LLMeshRepository::sHTTPRetryCount++;
+ gMeshRepo.mThread->loadMeshPhysicsShape(mMeshID);
+ }
+ else
+ {
+ llwarns << "Unhandled status " << status << llendl;
+ }
+ return;
+ }
+
+ LLMeshRepository::sBytesReceived += mRequestedBytes;
+
+ U8* data = NULL;
+
+ if (data_size > 0)
+ {
+ data = new U8[data_size];
+ buffer->readAfter(channels.in(), NULL, data, data_size);
+ }
+
+ if (gMeshRepo.mThread->physicsShapeReceived(mMeshID, data, data_size))
+ {
+ //good fetch from sim, write to VFS for caching
+ LLVFile file(gVFS, mMeshID, LLAssetType::AT_MESH, LLVFile::WRITE);
+
+ S32 offset = mOffset;
+ S32 size = mRequestedBytes;
+
+ if (file.getSize() >= offset+size)
+ {
+ LLMeshRepository::sCacheBytesWritten += size;
+ file.seek(offset);
+ file.write(data, size);
+ }
+ }
+
+ delete [] data;
+}
+
+void LLMeshHeaderResponder::completedRaw(U32 status, const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer)
+{
+ if (status < 200 || status > 400)
+ {
+ //llwarns
+ // << "Header responder failed with status: "
+ // << status << ": " << reason << llendl;
+
+ // 503 (service unavailable) or 499 (timeout)
+ // can be due to server load and can be retried
+
+ // TODO*: Add maximum retry logic, exponential backoff
+ // and (somewhat more optional than the others) retries
+ // again after some set period of time
+ if (status == 503 || status == 499)
+ { //retry
+ LLMeshRepository::sHTTPRetryCount++;
+ LLMeshRepoThread::HeaderRequest req(mMeshParams);
+ LLMutexLock lock(gMeshRepo.mThread->mMutex);
+ gMeshRepo.mThread->mHeaderReqQ.push(req);
+
+ return;
+ }
+ }
+
+ S32 data_size = buffer->countAfter(channels.in(), NULL);
+
+ U8* data = NULL;
+
+ if (data_size > 0)
+ {
+ data = new U8[data_size];
+ buffer->readAfter(channels.in(), NULL, data, data_size);
+ }
+
+ LLMeshRepository::sBytesReceived += llmin(data_size, 4096);
+
+ if (!gMeshRepo.mThread->headerReceived(mMeshParams, data, data_size))
+ {
+ llwarns
+ << "Unable to parse mesh header: "
+ << status << ": " << reason << llendl;
+ }
+ else if (data && data_size > 0)
+ {
+ //header was successfully retrieved from sim, cache in vfs
+ LLUUID mesh_id = mMeshParams.getSculptID();
+ LLSD header = gMeshRepo.mThread->mMeshHeader[mesh_id];
+
+ S32 version = header["version"].asInteger();
+
+ if (version <= MAX_MESH_VERSION)
+ {
+ std::stringstream str;
+
+ S32 lod_bytes = 0;
+
+ for (U32 i = 0; i < LLModel::LOD_PHYSICS; ++i)
+ { //figure out how many bytes we'll need to reserve in the file
+ std::string lod_name = header_lod[i];
+ lod_bytes = llmax(lod_bytes, header[lod_name]["offset"].asInteger()+header[lod_name]["size"].asInteger());
+ }
+
+ //just in case skin info or decomposition is at the end of the file (which it shouldn't be)
+ lod_bytes = llmax(lod_bytes, header["skin"]["offset"].asInteger() + header["skin"]["size"].asInteger());
+ lod_bytes = llmax(lod_bytes, header["physics_convex"]["offset"].asInteger() + header["physics_convex"]["size"].asInteger());
+
+ S32 header_bytes = (S32) gMeshRepo.mThread->mMeshHeaderSize[mesh_id];
+ S32 bytes = lod_bytes + header_bytes;
+
+
+ //it's possible for the remote asset to have more data than is needed for the local cache
+ //only allocate as much space in the VFS as is needed for the local cache
+ data_size = llmin(data_size, bytes);
+
+ LLVFile file(gVFS, mesh_id, LLAssetType::AT_MESH, LLVFile::WRITE);
+ if (file.getMaxSize() >= bytes || file.setMaxSize(bytes))
+ {
+ LLMeshRepository::sCacheBytesWritten += data_size;
+
+ file.write((const U8*) data, data_size);
+
+ //zero out the rest of the file
+ U8 block[4096];
+ memset(block, 0, 4096);
+
+ while (bytes-file.tell() > 4096)
+ {
+ file.write(block, 4096);
+ }
+
+ S32 remaining = bytes-file.tell();
+
+ if (remaining > 0)
+ {
+ file.write(block, remaining);
+ }
+ }
+ }
+ }
+
+ delete [] data;
+}
+
+
+LLMeshRepository::LLMeshRepository()
+: mMeshMutex(NULL),
+ mMeshThreadCount(0),
+ mThread(NULL)
+{
+
+}
+
+void LLMeshRepository::init()
+{
+ mMeshMutex = new LLMutex(NULL);
+
+ LLConvexDecomposition::getInstance()->initSystem();
+
+ mDecompThread = new LLPhysicsDecomp();
+ mDecompThread->start();
+
+ while (!mDecompThread->mInited)
+ { //wait for physics decomp thread to init
+ apr_sleep(100);
+ }
+
+
+
+ mThread = new LLMeshRepoThread();
+ mThread->start();
+}
+
+void LLMeshRepository::shutdown()
+{
+ llinfos << "Shutting down mesh repository." << llendl;
+
+ for (U32 i = 0; i < mUploads.size(); ++i)
+ {
+ llinfos << "Discard the pending mesh uploads " << llendl;
+ mUploads[i]->discard() ; //discard the uploading requests.
+ }
+
+ mThread->mSignal->signal();
+
+ while (!mThread->isStopped())
+ {
+ apr_sleep(10);
+ }
+ delete mThread;
+ mThread = NULL;
+
+ for (U32 i = 0; i < mUploads.size(); ++i)
+ {
+ llinfos << "Waiting for pending mesh upload " << i << "/" << mUploads.size() << llendl;
+ while (!mUploads[i]->isStopped())
+ {
+ apr_sleep(10);
+ }
+ delete mUploads[i];
+ }
+
+ mUploads.clear();
+
+ delete mMeshMutex;
+ mMeshMutex = NULL;
+
+ llinfos << "Shutting down decomposition system." << llendl;
+
+ if (mDecompThread)
+ {
+ mDecompThread->shutdown();
+ delete mDecompThread;
+ mDecompThread = NULL;
+ }
+
+ LLConvexDecomposition::quitSystem();
+}
+
+//called in the main thread.
+S32 LLMeshRepository::update()
+{
+ if(mUploadWaitList.empty())
+ {
+ return 0 ;
+ }
+
+ S32 size = mUploadWaitList.size() ;
+ for (S32 i = 0; i < size; ++i)
+ {
+ mUploads.push_back(mUploadWaitList[i]);
+ mUploadWaitList[i]->preStart() ;
+ mUploadWaitList[i]->start() ;
+ }
+ mUploadWaitList.clear() ;
+
+ return size ;
+}
+
+S32 LLMeshRepository::loadMesh(LLVOVolume* vobj, const LLVolumeParams& mesh_params, S32 detail, S32 last_lod)
+{
+ if (detail < 0 || detail > 4)
+ {
+ return detail;
+ }
+
+ {
+ LLMutexLock lock(mMeshMutex);
+ //add volume to list of loading meshes
+ mesh_load_map::iterator iter = mLoadingMeshes[detail].find(mesh_params);
+ if (iter != mLoadingMeshes[detail].end())
+ { //request pending for this mesh, append volume id to list
+ iter->second.insert(vobj->getID());
+ }
+ else
+ {
+ //first request for this mesh
+ mLoadingMeshes[detail][mesh_params].insert(vobj->getID());
+ mPendingRequests.push_back(LLMeshRepoThread::LODRequest(mesh_params, detail));
+ LLMeshRepository::sLODPending++;
+ }
+ }
+
+ //do a quick search to see if we can't display something while we wait for this mesh to load
+ LLVolume* volume = vobj->getVolume();
+
+ if (volume)
+ {
+ LLVolumeParams params = volume->getParams();
+
+ LLVolumeLODGroup* group = LLPrimitive::getVolumeManager()->getGroup(params);
+
+ if (group)
+ {
+ //first, see if last_lod is available (don't transition down to avoid funny popping a la SH-641)
+ if (last_lod >= 0)
+ {
+ LLVolume* lod = group->refLOD(last_lod);
+ if (lod && lod->isMeshAssetLoaded() && lod->getNumVolumeFaces() > 0)
+ {
+ group->derefLOD(lod);
+ return last_lod;
+ }
+ group->derefLOD(lod);
+ }
+
+ //next, see what the next lowest LOD available might be
+ for (S32 i = detail-1; i >= 0; --i)
+ {
+ LLVolume* lod = group->refLOD(i);
+ if (lod && lod->isMeshAssetLoaded() && lod->getNumVolumeFaces() > 0)
+ {
+ group->derefLOD(lod);
+ return i;
+ }
+
+ group->derefLOD(lod);
+ }
+
+ //no lower LOD is a available, is a higher lod available?
+ for (S32 i = detail+1; i < 4; ++i)
+ {
+ LLVolume* lod = group->refLOD(i);
+ if (lod && lod->isMeshAssetLoaded() && lod->getNumVolumeFaces() > 0)
+ {
+ group->derefLOD(lod);
+ return i;
+ }
+
+ group->derefLOD(lod);
+ }
+ }
+ }
+
+ return detail;
+}
+
+void LLMeshRepository::notifyLoadedMeshes()
+{ //called from main thread
+
+ LLMeshRepoThread::sMaxConcurrentRequests = gSavedSettings.getU32("MeshMaxConcurrentRequests");
+
+ //clean up completed upload threads
+ for (std::vector<LLMeshUploadThread*>::iterator iter = mUploads.begin(); iter != mUploads.end(); )
+ {
+ LLMeshUploadThread* thread = *iter;
+
+ if (thread->isStopped() && thread->finished())
+ {
+ iter = mUploads.erase(iter);
+ delete thread;
+ }
+ else
+ {
+ ++iter;
+ }
+ }
+
+ //update inventory
+ if (!mInventoryQ.empty())
+ {
+ LLMutexLock lock(mMeshMutex);
+ while (!mInventoryQ.empty())
+ {
+ inventory_data& data = mInventoryQ.front();
+
+ LLAssetType::EType asset_type = LLAssetType::lookup(data.mPostData["asset_type"].asString());
+ LLInventoryType::EType inventory_type = LLInventoryType::lookup(data.mPostData["inventory_type"].asString());
+
+ // Handle addition of texture, if any.
+ if ( data.mResponse.has("new_texture_folder_id") )
+ {
+ const LLUUID& folder_id = data.mResponse["new_texture_folder_id"].asUUID();
+
+ if ( folder_id.notNull() )
+ {
+ LLUUID parent_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TEXTURE);
+
+ std::string name;
+ // Check if the server built a different name for the texture folder
+ if ( data.mResponse.has("new_texture_folder_name") )
+ {
+ name = data.mResponse["new_texture_folder_name"].asString();
+ }
+ else
+ {
+ name = data.mPostData["name"].asString();
+ }
+
+ // Add the category to the internal representation
+ LLPointer<LLViewerInventoryCategory> cat =
+ new LLViewerInventoryCategory(folder_id, parent_id,
+ LLFolderType::FT_NONE, name, gAgent.getID());
+ cat->setVersion(LLViewerInventoryCategory::VERSION_UNKNOWN);
+
+ LLInventoryModel::LLCategoryUpdate update(cat->getParentUUID(), 1);
+ gInventory.accountForUpdate(update);
+ gInventory.updateCategory(cat);
+ }
+ }
+
+ on_new_single_inventory_upload_complete(
+ asset_type,
+ inventory_type,
+ data.mPostData["asset_type"].asString(),
+ data.mPostData["folder_id"].asUUID(),
+ data.mPostData["name"],
+ data.mPostData["description"],
+ data.mResponse,
+ data.mResponse["upload_price"]);
+ //}
+
+ mInventoryQ.pop();
+ }
+ }
+
+ //call completed callbacks on finished decompositions
+ mDecompThread->notifyCompleted();
+
+ if (!mThread->mWaiting)
+ { //curl thread is churning, wait for it to go idle
+ return;
+ }
+
+ static std::string region_name("never name a region this");
+
+ if (gAgent.getRegion())
+ { //update capability url
+ if (gAgent.getRegion()->getName() != region_name && gAgent.getRegion()->capabilitiesReceived())
+ {
+ region_name = gAgent.getRegion()->getName();
+ mGetMeshCapability = gAgent.getRegion()->getCapability("GetMesh");
+ }
+ }
+
+ {
+ LLMutexLock lock1(mMeshMutex);
+ LLMutexLock lock2(mThread->mMutex);
+
+ //popup queued error messages from background threads
+ while (!mUploadErrorQ.empty())
+ {
+ LLNotificationsUtil::add("MeshUploadError", mUploadErrorQ.front());
+ mUploadErrorQ.pop();
+ }
+
+ S32 push_count = LLMeshRepoThread::sMaxConcurrentRequests-(LLMeshRepoThread::sActiveHeaderRequests+LLMeshRepoThread::sActiveLODRequests);
+
+ if (push_count > 0)
+ {
+ //calculate "score" for pending requests
+
+ //create score map
+ std::map<LLUUID, F32> score_map;
+
+ for (U32 i = 0; i < 4; ++i)
+ {
+ for (mesh_load_map::iterator iter = mLoadingMeshes[i].begin(); iter != mLoadingMeshes[i].end(); ++iter)
+ {
+ F32 max_score = 0.f;
+ for (std::set<LLUUID>::iterator obj_iter = iter->second.begin(); obj_iter != iter->second.end(); ++obj_iter)
+ {
+ LLViewerObject* object = gObjectList.findObject(*obj_iter);
+
+ if (object)
+ {
+ LLDrawable* drawable = object->mDrawable;
+ if (drawable)
+ {
+ F32 cur_score = drawable->getRadius()/llmax(drawable->mDistanceWRTCamera, 1.f);
+ max_score = llmax(max_score, cur_score);
+ }
+ }
+ }
+
+ score_map[iter->first.getSculptID()] = max_score;
+ }
+ }
+
+ //set "score" for pending requests
+ for (std::vector<LLMeshRepoThread::LODRequest>::iterator iter = mPendingRequests.begin(); iter != mPendingRequests.end(); ++iter)
+ {
+ iter->mScore = score_map[iter->mMeshParams.getSculptID()];
+ }
+
+ //sort by "score"
+ std::sort(mPendingRequests.begin(), mPendingRequests.end(), LLMeshRepoThread::CompareScoreGreater());
+
+ while (!mPendingRequests.empty() && push_count > 0)
+ {
+ LLMeshRepoThread::LODRequest& request = mPendingRequests.front();
+ mThread->loadMeshLOD(request.mMeshParams, request.mLOD);
+ mPendingRequests.erase(mPendingRequests.begin());
+ LLMeshRepository::sLODPending--;
+ push_count--;
+ }
+ }
+
+ //send skin info requests
+ while (!mPendingSkinRequests.empty())
+ {
+ mThread->loadMeshSkinInfo(mPendingSkinRequests.front());
+ mPendingSkinRequests.pop();
+ }
+
+ //send decomposition requests
+ while (!mPendingDecompositionRequests.empty())
+ {
+ mThread->loadMeshDecomposition(mPendingDecompositionRequests.front());
+ mPendingDecompositionRequests.pop();
+ }
+
+ //send physics shapes decomposition requests
+ while (!mPendingPhysicsShapeRequests.empty())
+ {
+ mThread->loadMeshPhysicsShape(mPendingPhysicsShapeRequests.front());
+ mPendingPhysicsShapeRequests.pop();
+ }
+
+ mThread->notifyLoadedMeshes();
+ }
+
+ mThread->mSignal->signal();
+}
+
+void LLMeshRepository::notifySkinInfoReceived(LLMeshSkinInfo& info)
+{
+ mSkinMap[info.mMeshID] = info;
+
+ skin_load_map::iterator iter = mLoadingSkins.find(info.mMeshID);
+ if (iter != mLoadingSkins.end())
+ {
+ for (std::set<LLUUID>::iterator obj_id = iter->second.begin(); obj_id != iter->second.end(); ++obj_id)
+ {
+ LLVOVolume* vobj = (LLVOVolume*) gObjectList.findObject(*obj_id);
+ if (vobj)
+ {
+ vobj->notifyMeshLoaded();
+ }
+ }
+ }
+
+ mLoadingSkins.erase(info.mMeshID);
+}
+
+void LLMeshRepository::notifyDecompositionReceived(LLModel::Decomposition* decomp)
+{
+ decomposition_map::iterator iter = mDecompositionMap.find(decomp->mMeshID);
+ if (iter == mDecompositionMap.end())
+ { //just insert decomp into map
+ mDecompositionMap[decomp->mMeshID] = decomp;
+ }
+ else
+ { //merge decomp with existing entry
+ iter->second->merge(decomp);
+ delete decomp;
+ }
+
+ mLoadingDecompositions.erase(decomp->mMeshID);
+}
+
+void LLMeshRepository::notifyMeshLoaded(const LLVolumeParams& mesh_params, LLVolume* volume)
+{ //called from main thread
+ S32 detail = LLVolumeLODGroup::getVolumeDetailFromScale(volume->getDetail());
+
+ //get list of objects waiting to be notified this mesh is loaded
+ mesh_load_map::iterator obj_iter = mLoadingMeshes[detail].find(mesh_params);
+
+ if (volume && obj_iter != mLoadingMeshes[detail].end())
+ {
+ //make sure target volume is still valid
+ if (volume->getNumVolumeFaces() <= 0)
+ {
+ llwarns << "Mesh loading returned empty volume." << llendl;
+ }
+
+ { //update system volume
+ LLVolume* sys_volume = LLPrimitive::getVolumeManager()->refVolume(mesh_params, detail);
+ if (sys_volume)
+ {
+ sys_volume->copyVolumeFaces(volume);
+ sys_volume->setMeshAssetLoaded(TRUE);
+ LLPrimitive::getVolumeManager()->unrefVolume(sys_volume);
+ }
+ else
+ {
+ llwarns << "Couldn't find system volume for given mesh." << llendl;
+ }
+ }
+
+ //notify waiting LLVOVolume instances that their requested mesh is available
+ for (std::set<LLUUID>::iterator vobj_iter = obj_iter->second.begin(); vobj_iter != obj_iter->second.end(); ++vobj_iter)
+ {
+ LLVOVolume* vobj = (LLVOVolume*) gObjectList.findObject(*vobj_iter);
+ if (vobj)
+ {
+ vobj->notifyMeshLoaded();
+ }
+ }
+
+ mLoadingMeshes[detail].erase(mesh_params);
+ }
+}
+
+void LLMeshRepository::notifyMeshUnavailable(const LLVolumeParams& mesh_params, S32 lod)
+{ //called from main thread
+ //get list of objects waiting to be notified this mesh is loaded
+ mesh_load_map::iterator obj_iter = mLoadingMeshes[lod].find(mesh_params);
+
+ F32 detail = LLVolumeLODGroup::getVolumeScaleFromDetail(lod);
+
+ if (obj_iter != mLoadingMeshes[lod].end())
+ {
+ for (std::set<LLUUID>::iterator vobj_iter = obj_iter->second.begin(); vobj_iter != obj_iter->second.end(); ++vobj_iter)
+ {
+ LLVOVolume* vobj = (LLVOVolume*) gObjectList.findObject(*vobj_iter);
+ if (vobj)
+ {
+ LLVolume* obj_volume = vobj->getVolume();
+
+ if (obj_volume &&
+ obj_volume->getDetail() == detail &&
+ obj_volume->getParams() == mesh_params)
+ { //should force volume to find most appropriate LOD
+ vobj->setVolume(obj_volume->getParams(), lod);
+ }
+ }
+ }
+
+ mLoadingMeshes[lod].erase(mesh_params);
+ }
+}
+
+S32 LLMeshRepository::getActualMeshLOD(const LLVolumeParams& mesh_params, S32 lod)
+{
+ return mThread->getActualMeshLOD(mesh_params, lod);
+}
+
+const LLMeshSkinInfo* LLMeshRepository::getSkinInfo(const LLUUID& mesh_id, const LLVOVolume* requesting_obj)
+{
+ if (mesh_id.notNull())
+ {
+ skin_map::iterator iter = mSkinMap.find(mesh_id);
+ if (iter != mSkinMap.end())
+ {
+ return &(iter->second);
+ }
+
+ //no skin info known about given mesh, try to fetch it
+ {
+ LLMutexLock lock(mMeshMutex);
+ //add volume to list of loading meshes
+ skin_load_map::iterator iter = mLoadingSkins.find(mesh_id);
+ if (iter == mLoadingSkins.end())
+ { //no request pending for this skin info
+ mPendingSkinRequests.push(mesh_id);
+ }
+ mLoadingSkins[mesh_id].insert(requesting_obj->getID());
+ }
+ }
+
+ return NULL;
+}
+
+void LLMeshRepository::fetchPhysicsShape(const LLUUID& mesh_id)
+{
+ if (mesh_id.notNull())
+ {
+ LLModel::Decomposition* decomp = NULL;
+ decomposition_map::iterator iter = mDecompositionMap.find(mesh_id);
+ if (iter != mDecompositionMap.end())
+ {
+ decomp = iter->second;
+ }
+
+ //decomposition block hasn't been fetched yet
+ if (!decomp || decomp->mPhysicsShapeMesh.empty())
+ {
+ LLMutexLock lock(mMeshMutex);
+ //add volume to list of loading meshes
+ std::set<LLUUID>::iterator iter = mLoadingPhysicsShapes.find(mesh_id);
+ if (iter == mLoadingPhysicsShapes.end())
+ { //no request pending for this skin info
+ mLoadingPhysicsShapes.insert(mesh_id);
+ mPendingPhysicsShapeRequests.push(mesh_id);
+ }
+ }
+ }
+
+}
+
+LLModel::Decomposition* LLMeshRepository::getDecomposition(const LLUUID& mesh_id)
+{
+ LLModel::Decomposition* ret = NULL;
+
+ if (mesh_id.notNull())
+ {
+ decomposition_map::iterator iter = mDecompositionMap.find(mesh_id);
+ if (iter != mDecompositionMap.end())
+ {
+ ret = iter->second;
+ }
+
+ //decomposition block hasn't been fetched yet
+ if (!ret || ret->mBaseHullMesh.empty())
+ {
+ LLMutexLock lock(mMeshMutex);
+ //add volume to list of loading meshes
+ std::set<LLUUID>::iterator iter = mLoadingDecompositions.find(mesh_id);
+ if (iter == mLoadingDecompositions.end())
+ { //no request pending for this skin info
+ mLoadingDecompositions.insert(mesh_id);
+ mPendingDecompositionRequests.push(mesh_id);
+ }
+ }
+ }
+
+ return ret;
+}
+
+void LLMeshRepository::buildHull(const LLVolumeParams& params, S32 detail)
+{
+ LLVolume* volume = LLPrimitive::sVolumeManager->refVolume(params, detail);
+
+ if (!volume->mHullPoints)
+ {
+ //all default params
+ //execute first stage
+ //set simplify mode to retain
+ //set retain percentage to zero
+ //run second stage
+ }
+
+ LLPrimitive::sVolumeManager->unrefVolume(volume);
+}
+
+bool LLMeshRepository::hasPhysicsShape(const LLUUID& mesh_id)
+{
+ LLSD mesh = mThread->getMeshHeader(mesh_id);
+ if (mesh.has("physics_mesh") && mesh["physics_mesh"].has("size") && (mesh["physics_mesh"]["size"].asInteger() > 0))
+ {
+ return true;
+ }
+
+ LLModel::Decomposition* decomp = getDecomposition(mesh_id);
+ if (decomp && !decomp->mHull.empty())
+ {
+ return true;
+ }
+
+ return false;
+}
+
+LLSD& LLMeshRepository::getMeshHeader(const LLUUID& mesh_id)
+{
+ return mThread->getMeshHeader(mesh_id);
+}
+
+LLSD& LLMeshRepoThread::getMeshHeader(const LLUUID& mesh_id)
+{
+ static LLSD dummy_ret;
+ if (mesh_id.notNull())
+ {
+ LLMutexLock lock(mHeaderMutex);
+ mesh_header_map::iterator iter = mMeshHeader.find(mesh_id);
+ if (iter != mMeshHeader.end())
+ {
+ return iter->second;
+ }
+ }
+
+ return dummy_ret;
+}
+
+
+void LLMeshRepository::uploadModel(std::vector<LLModelInstance>& data, LLVector3& scale, bool upload_textures,
+ bool upload_skin, bool upload_joints, std::string upload_url, bool do_upload,
+ LLHandle<LLWholeModelFeeObserver> fee_observer, LLHandle<LLWholeModelUploadObserver> upload_observer)
+{
+ LLMeshUploadThread* thread = new LLMeshUploadThread(data, scale, upload_textures, upload_skin, upload_joints, upload_url,
+ do_upload, fee_observer, upload_observer);
+ mUploadWaitList.push_back(thread);
+}
+
+S32 LLMeshRepository::getMeshSize(const LLUUID& mesh_id, S32 lod)
+{
+ if (mThread)
+ {
+ LLMeshRepoThread::mesh_header_map::iterator iter = mThread->mMeshHeader.find(mesh_id);
+ if (iter != mThread->mMeshHeader.end())
+ {
+ LLSD& header = iter->second;
+
+ if (header.has("404"))
+ {
+ return -1;
+ }
+
+ S32 size = header[header_lod[lod]]["size"].asInteger();
+ return size;
+ }
+
+ }
+
+ return -1;
+
+}
+
+void LLMeshUploadThread::decomposeMeshMatrix(LLMatrix4& transformation,
+ LLVector3& result_pos,
+ LLQuaternion& result_rot,
+ LLVector3& result_scale)
+{
+ // check for reflection
+ BOOL reflected = (transformation.determinant() < 0);
+
+ // compute position
+ LLVector3 position = LLVector3(0, 0, 0) * transformation;
+
+ // compute scale
+ LLVector3 x_transformed = LLVector3(1, 0, 0) * transformation - position;
+ LLVector3 y_transformed = LLVector3(0, 1, 0) * transformation - position;
+ LLVector3 z_transformed = LLVector3(0, 0, 1) * transformation - position;
+ F32 x_length = x_transformed.normalize();
+ F32 y_length = y_transformed.normalize();
+ F32 z_length = z_transformed.normalize();
+ LLVector3 scale = LLVector3(x_length, y_length, z_length);
+
+ // adjust for "reflected" geometry
+ LLVector3 x_transformed_reflected = x_transformed;
+ if (reflected)
+ {
+ x_transformed_reflected *= -1.0;
+ }
+
+ // compute rotation
+ LLMatrix3 rotation_matrix;
+ rotation_matrix.setRows(x_transformed_reflected, y_transformed, z_transformed);
+ LLQuaternion quat_rotation = rotation_matrix.quaternion();
+ quat_rotation.normalize(); // the rotation_matrix might not have been orthoginal. make it so here.
+ LLVector3 euler_rotation;
+ quat_rotation.getEulerAngles(&euler_rotation.mV[VX], &euler_rotation.mV[VY], &euler_rotation.mV[VZ]);
+
+ result_pos = position + mOrigin;
+ result_scale = scale;
+ result_rot = quat_rotation;
+}
+
+bool LLImportMaterial::operator<(const LLImportMaterial &rhs) const
+{
+ if (mDiffuseMap != rhs.mDiffuseMap)
+ {
+ return mDiffuseMap < rhs.mDiffuseMap;
+ }
+
+ if (mDiffuseMapFilename != rhs.mDiffuseMapFilename)
+ {
+ return mDiffuseMapFilename < rhs.mDiffuseMapFilename;
+ }
+
+ if (mDiffuseMapLabel != rhs.mDiffuseMapLabel)
+ {
+ return mDiffuseMapLabel < rhs.mDiffuseMapLabel;
+ }
+
+ if (mDiffuseColor != rhs.mDiffuseColor)
+ {
+ return mDiffuseColor < rhs.mDiffuseColor;
+ }
+
+ if (mBinding != rhs.mBinding)
+ {
+ return mBinding < rhs.mBinding;
+ }
+
+ return mFullbright < rhs.mFullbright;
+}
+
+
+void LLMeshRepository::updateInventory(inventory_data data)
+{
+ LLMutexLock lock(mMeshMutex);
+ dump_llsd_to_file(data.mPostData,make_dump_name("update_inventory_post_data_",dump_num));
+ dump_llsd_to_file(data.mResponse,make_dump_name("update_inventory_response_",dump_num));
+ mInventoryQ.push(data);
+}
+
+void LLMeshRepository::uploadError(LLSD& args)
+{
+ LLMutexLock lock(mMeshMutex);
+ mUploadErrorQ.push(args);
+}
+
+//static
+F32 LLMeshRepository::getStreamingCost(LLSD& header, F32 radius, S32* bytes, S32* bytes_visible, S32 lod, F32 *unscaled_value)
+{
+ F32 max_distance = 512.f;
+
+ F32 dlowest = llmin(radius/0.03f, max_distance);
+ F32 dlow = llmin(radius/0.06f, max_distance);
+ F32 dmid = llmin(radius/0.24f, max_distance);
+
+ F32 METADATA_DISCOUNT = (F32) gSavedSettings.getU32("MeshMetaDataDiscount"); //discount 128 bytes to cover the cost of LLSD tags and compression domain overhead
+ F32 MINIMUM_SIZE = (F32) gSavedSettings.getU32("MeshMinimumByteSize"); //make sure nothing is "free"
+
+ F32 bytes_per_triangle = (F32) gSavedSettings.getU32("MeshBytesPerTriangle");
+
+ S32 bytes_lowest = header["lowest_lod"]["size"].asInteger();
+ S32 bytes_low = header["low_lod"]["size"].asInteger();
+ S32 bytes_mid = header["medium_lod"]["size"].asInteger();
+ S32 bytes_high = header["high_lod"]["size"].asInteger();
+
+ if (bytes_high == 0)
+ {
+ return 0.f;
+ }
+
+ if (bytes_mid == 0)
+ {
+ bytes_mid = bytes_high;
+ }
+
+ if (bytes_low == 0)
+ {
+ bytes_low = bytes_mid;
+ }
+
+ if (bytes_lowest == 0)
+ {
+ bytes_lowest = bytes_low;
+ }
+
+ F32 triangles_lowest = llmax((F32) bytes_lowest-METADATA_DISCOUNT, MINIMUM_SIZE)/bytes_per_triangle;
+ F32 triangles_low = llmax((F32) bytes_low-METADATA_DISCOUNT, MINIMUM_SIZE)/bytes_per_triangle;
+ F32 triangles_mid = llmax((F32) bytes_mid-METADATA_DISCOUNT, MINIMUM_SIZE)/bytes_per_triangle;
+ F32 triangles_high = llmax((F32) bytes_high-METADATA_DISCOUNT, MINIMUM_SIZE)/bytes_per_triangle;
+
+ if (bytes)
+ {
+ *bytes = 0;
+ *bytes += header["lowest_lod"]["size"].asInteger();
+ *bytes += header["low_lod"]["size"].asInteger();
+ *bytes += header["medium_lod"]["size"].asInteger();
+ *bytes += header["high_lod"]["size"].asInteger();
+ }
+
+ if (bytes_visible)
+ {
+ lod = LLMeshRepository::getActualMeshLOD(header, lod);
+ if (lod >= 0 && lod <= 3)
+ {
+ *bytes_visible = header[header_lod[lod]]["size"].asInteger();
+ }
+ }
+
+ F32 max_area = 102932.f; //area of circle that encompasses region
+ F32 min_area = 1.f;
+
+ F32 high_area = llmin(F_PI*dmid*dmid, max_area);
+ F32 mid_area = llmin(F_PI*dlow*dlow, max_area);
+ F32 low_area = llmin(F_PI*dlowest*dlowest, max_area);
+ F32 lowest_area = max_area;
+
+ lowest_area -= low_area;
+ low_area -= mid_area;
+ mid_area -= high_area;
+
+ high_area = llclamp(high_area, min_area, max_area);
+ mid_area = llclamp(mid_area, min_area, max_area);
+ low_area = llclamp(low_area, min_area, max_area);
+ lowest_area = llclamp(lowest_area, min_area, max_area);
+
+ F32 total_area = high_area + mid_area + low_area + lowest_area;
+ high_area /= total_area;
+ mid_area /= total_area;
+ low_area /= total_area;
+ lowest_area /= total_area;
+
+ F32 weighted_avg = triangles_high*high_area +
+ triangles_mid*mid_area +
+ triangles_low*low_area +
+ triangles_lowest*lowest_area;
+
+ if (unscaled_value)
+ {
+ *unscaled_value = weighted_avg;
+ }
+
+ return weighted_avg/gSavedSettings.getU32("MeshTriangleBudget")*15000.f;
+}
+
+
+LLPhysicsDecomp::LLPhysicsDecomp()
+: LLThread("Physics Decomp")
+{
+ mInited = false;
+ mQuitting = false;
+ mDone = false;
+
+ mSignal = new LLCondition(NULL);
+ mMutex = new LLMutex(NULL);
+}
+
+LLPhysicsDecomp::~LLPhysicsDecomp()
+{
+ shutdown();
+
+ delete mSignal;
+ mSignal = NULL;
+ delete mMutex;
+ mMutex = NULL;
+}
+
+void LLPhysicsDecomp::shutdown()
+{
+ if (mSignal)
+ {
+ mQuitting = true;
+ mSignal->signal();
+
+ while (!isStopped())
+ {
+ apr_sleep(10);
+ }
+ }
+}
+
+void LLPhysicsDecomp::submitRequest(LLPhysicsDecomp::Request* request)
+{
+ LLMutexLock lock(mMutex);
+ mRequestQ.push(request);
+ mSignal->signal();
+}
+
+//static
+S32 LLPhysicsDecomp::llcdCallback(const char* status, S32 p1, S32 p2)
+{
+ if (gMeshRepo.mDecompThread && gMeshRepo.mDecompThread->mCurRequest.notNull())
+ {
+ return gMeshRepo.mDecompThread->mCurRequest->statusCallback(status, p1, p2);
+ }
+
+ return 1;
+}
+
+void LLPhysicsDecomp::setMeshData(LLCDMeshData& mesh, bool vertex_based)
+{
+ mesh.mVertexBase = mCurRequest->mPositions[0].mV;
+ mesh.mVertexStrideBytes = 12;
+ mesh.mNumVertices = mCurRequest->mPositions.size();
+
+ if(!vertex_based)
+ {
+ mesh.mIndexType = LLCDMeshData::INT_16;
+ mesh.mIndexBase = &(mCurRequest->mIndices[0]);
+ mesh.mIndexStrideBytes = 6;
+
+ mesh.mNumTriangles = mCurRequest->mIndices.size()/3;
+ }
+
+ if ((vertex_based || mesh.mNumTriangles > 0) && mesh.mNumVertices > 2)
+ {
+ LLCDResult ret = LLCD_OK;
+ if (LLConvexDecomposition::getInstance() != NULL)
+ {
+ ret = LLConvexDecomposition::getInstance()->setMeshData(&mesh, vertex_based);
+ }
+
+ if (ret)
+ {
+ llerrs << "Convex Decomposition thread valid but could not set mesh data" << llendl;
+ }
+ }
+}
+
+void LLPhysicsDecomp::doDecomposition()
+{
+ LLCDMeshData mesh;
+ S32 stage = mStageID[mCurRequest->mStage];
+
+ if (LLConvexDecomposition::getInstance() == NULL)
+ {
+ // stub library. do nothing.
+ return;
+ }
+
+ //load data intoLLCD
+ if (stage == 0)
+ {
+ setMeshData(mesh, false);
+ }
+
+ //build parameter map
+ std::map<std::string, const LLCDParam*> param_map;
+
+ static const LLCDParam* params = NULL;
+ static S32 param_count = 0;
+ if (!params)
+ {
+ param_count = LLConvexDecomposition::getInstance()->getParameters(&params);
+ }
+
+ for (S32 i = 0; i < param_count; ++i)
+ {
+ param_map[params[i].mName] = params+i;
+ }
+
+ //set parameter values
+ for (decomp_params::iterator iter = mCurRequest->mParams.begin(); iter != mCurRequest->mParams.end(); ++iter)
+ {
+ const std::string& name = iter->first;
+ const LLSD& value = iter->second;
+
+ const LLCDParam* param = param_map[name];
+
+ if (param == NULL)
+ { //couldn't find valid parameter
+ continue;
+ }
+
+ U32 ret = LLCD_OK;
+
+ if (param->mType == LLCDParam::LLCD_FLOAT)
+ {
+ ret = LLConvexDecomposition::getInstance()->setParam(param->mName, (F32) value.asReal());
+ }
+ else if (param->mType == LLCDParam::LLCD_INTEGER ||
+ param->mType == LLCDParam::LLCD_ENUM)
+ {
+ ret = LLConvexDecomposition::getInstance()->setParam(param->mName, value.asInteger());
+ }
+ else if (param->mType == LLCDParam::LLCD_BOOLEAN)
+ {
+ ret = LLConvexDecomposition::getInstance()->setParam(param->mName, value.asBoolean());
+ }
+ }
+
+ mCurRequest->setStatusMessage("Executing.");
+
+ LLCDResult ret = LLCD_OK;
+
+ if (LLConvexDecomposition::getInstance() != NULL)
+ {
+ ret = LLConvexDecomposition::getInstance()->executeStage(stage);
+ }
+
+ if (ret)
+ {
+ llwarns << "Convex Decomposition thread valid but could not execute stage " << stage << llendl;
+ LLMutexLock lock(mMutex);
+
+ mCurRequest->mHull.clear();
+ mCurRequest->mHullMesh.clear();
+
+ mCurRequest->setStatusMessage("FAIL");
+
+ completeCurrent();
+ }
+ else
+ {
+ mCurRequest->setStatusMessage("Reading results");
+
+ S32 num_hulls =0;
+ if (LLConvexDecomposition::getInstance() != NULL)
+ {
+ num_hulls = LLConvexDecomposition::getInstance()->getNumHullsFromStage(stage);
+ }
+
+ {
+ LLMutexLock lock(mMutex);
+ mCurRequest->mHull.clear();
+ mCurRequest->mHull.resize(num_hulls);
+
+ mCurRequest->mHullMesh.clear();
+ mCurRequest->mHullMesh.resize(num_hulls);
+ }
+
+ for (S32 i = 0; i < num_hulls; ++i)
+ {
+ std::vector<LLVector3> p;
+ LLCDHull hull;
+ // if LLConvexDecomposition is a stub, num_hulls should have been set to 0 above, and we should not reach this code
+ LLConvexDecomposition::getInstance()->getHullFromStage(stage, i, &hull);
+
+ const F32* v = hull.mVertexBase;
+
+ for (S32 j = 0; j < hull.mNumVertices; ++j)
+ {
+ LLVector3 vert(v[0], v[1], v[2]);
+ p.push_back(vert);
+ v = (F32*) (((U8*) v) + hull.mVertexStrideBytes);
+ }
+
+ LLCDMeshData mesh;
+ // if LLConvexDecomposition is a stub, num_hulls should have been set to 0 above, and we should not reach this code
+ LLConvexDecomposition::getInstance()->getMeshFromStage(stage, i, &mesh);
+
+ get_vertex_buffer_from_mesh(mesh, mCurRequest->mHullMesh[i]);
+
+ {
+ LLMutexLock lock(mMutex);
+ mCurRequest->mHull[i] = p;
+ }
+ }
+
+ {
+ LLMutexLock lock(mMutex);
+ mCurRequest->setStatusMessage("FAIL");
+ completeCurrent();
+ }
+ }
+}
+
+void LLPhysicsDecomp::completeCurrent()
+{
+ LLMutexLock lock(mMutex);
+ mCompletedQ.push(mCurRequest);
+ mCurRequest = NULL;
+}
+
+void LLPhysicsDecomp::notifyCompleted()
+{
+ if (!mCompletedQ.empty())
+ {
+ LLMutexLock lock(mMutex);
+ while (!mCompletedQ.empty())
+ {
+ Request* req = mCompletedQ.front();
+ req->completed();
+ mCompletedQ.pop();
+ }
+ }
+}
+
+
+void make_box(LLPhysicsDecomp::Request * request)
+{
+ LLVector3 min,max;
+ min = request->mPositions[0];
+ max = min;
+
+ for (U32 i = 0; i < request->mPositions.size(); ++i)
+ {
+ update_min_max(min, max, request->mPositions[i]);
+ }
+
+ request->mHull.clear();
+
+ LLModel::hull box;
+ box.push_back(LLVector3(min[0],min[1],min[2]));
+ box.push_back(LLVector3(max[0],min[1],min[2]));
+ box.push_back(LLVector3(min[0],max[1],min[2]));
+ box.push_back(LLVector3(max[0],max[1],min[2]));
+ box.push_back(LLVector3(min[0],min[1],max[2]));
+ box.push_back(LLVector3(max[0],min[1],max[2]));
+ box.push_back(LLVector3(min[0],max[1],max[2]));
+ box.push_back(LLVector3(max[0],max[1],max[2]));
+
+ request->mHull.push_back(box);
+}
+
+
+void LLPhysicsDecomp::doDecompositionSingleHull()
+{
+ LLConvexDecomposition* decomp = LLConvexDecomposition::getInstance();
+
+ if (decomp == NULL)
+ {
+ //stub. do nothing.
+ return;
+ }
+
+ LLCDMeshData mesh;
+
+ setMeshData(mesh, true);
+
+ LLCDResult ret = decomp->buildSingleHull() ;
+ if(ret)
+ {
+ llwarns << "Could not execute decomposition stage when attempting to create single hull." << llendl;
+ make_box(mCurRequest);
+ }
+ else
+ {
+ {
+ LLMutexLock lock(mMutex);
+ mCurRequest->mHull.clear();
+ mCurRequest->mHull.resize(1);
+ mCurRequest->mHullMesh.clear();
+ }
+
+ std::vector<LLVector3> p;
+ LLCDHull hull;
+
+ // if LLConvexDecomposition is a stub, num_hulls should have been set to 0 above, and we should not reach this code
+ decomp->getSingleHull(&hull);
+
+ const F32* v = hull.mVertexBase;
+
+ for (S32 j = 0; j < hull.mNumVertices; ++j)
+ {
+ LLVector3 vert(v[0], v[1], v[2]);
+ p.push_back(vert);
+ v = (F32*) (((U8*) v) + hull.mVertexStrideBytes);
+ }
+
+ {
+ LLMutexLock lock(mMutex);
+ mCurRequest->mHull[0] = p;
+ }
+ }
+
+ {
+ completeCurrent();
+
+ }
+}
+
+
+void LLPhysicsDecomp::run()
+{
+ LLConvexDecomposition* decomp = LLConvexDecomposition::getInstance();
+ if (decomp == NULL)
+ {
+ // stub library. Set init to true so the main thread
+ // doesn't wait for this to finish.
+ mInited = true;
+ return;
+ }
+
+ decomp->initThread();
+ mInited = true;
+
+ static const LLCDStageData* stages = NULL;
+ static S32 num_stages = 0;
+
+ if (!stages)
+ {
+ num_stages = decomp->getStages(&stages);
+ }
+
+ for (S32 i = 0; i < num_stages; i++)
+ {
+ mStageID[stages[i].mName] = i;
+ }
+
+ while (!mQuitting)
+ {
+ mSignal->wait();
+ while (!mQuitting && !mRequestQ.empty())
+ {
+ {
+ LLMutexLock lock(mMutex);
+ mCurRequest = mRequestQ.front();
+ mRequestQ.pop();
+ }
+
+ S32& id = *(mCurRequest->mDecompID);
+ if (id == -1)
+ {
+ decomp->genDecomposition(id);
+ }
+ decomp->bindDecomposition(id);
+
+ if (mCurRequest->mStage == "single_hull")
+ {
+ doDecompositionSingleHull();
+ }
+ else
+ {
+ doDecomposition();
+ }
+ }
+ }
+
+ decomp->quitThread();
+
+ if (mSignal->isLocked())
+ { //let go of mSignal's associated mutex
+ mSignal->unlock();
+ }
+
+ mDone = true;
+}
+
+void LLPhysicsDecomp::Request::assignData(LLModel* mdl)
+{
+ if (!mdl)
+ {
+ return ;
+ }
+
+ U16 index_offset = 0;
+ U16 tri[3] ;
+
+ mPositions.clear();
+ mIndices.clear();
+ mBBox[1] = LLVector3(F32_MIN, F32_MIN, F32_MIN) ;
+ mBBox[0] = LLVector3(F32_MAX, F32_MAX, F32_MAX) ;
+
+ //queue up vertex positions and indices
+ for (S32 i = 0; i < mdl->getNumVolumeFaces(); ++i)
+ {
+ const LLVolumeFace& face = mdl->getVolumeFace(i);
+ if (mPositions.size() + face.mNumVertices > 65535)
+ {
+ continue;
+ }
+
+ for (U32 j = 0; j < face.mNumVertices; ++j)
+ {
+ mPositions.push_back(LLVector3(face.mPositions[j].getF32ptr()));
+ for(U32 k = 0 ; k < 3 ; k++)
+ {
+ mBBox[0].mV[k] = llmin(mBBox[0].mV[k], mPositions[j].mV[k]) ;
+ mBBox[1].mV[k] = llmax(mBBox[1].mV[k], mPositions[j].mV[k]) ;
+ }
+ }
+
+ updateTriangleAreaThreshold() ;
+
+ for (U32 j = 0; j+2 < face.mNumIndices; j += 3)
+ {
+ tri[0] = face.mIndices[j] + index_offset ;
+ tri[1] = face.mIndices[j + 1] + index_offset ;
+ tri[2] = face.mIndices[j + 2] + index_offset ;
+
+ if(isValidTriangle(tri[0], tri[1], tri[2]))
+ {
+ mIndices.push_back(tri[0]);
+ mIndices.push_back(tri[1]);
+ mIndices.push_back(tri[2]);
+ }
+ }
+
+ index_offset += face.mNumVertices;
+ }
+
+ return ;
+}
+
+void LLPhysicsDecomp::Request::updateTriangleAreaThreshold()
+{
+ F32 range = mBBox[1].mV[0] - mBBox[0].mV[0] ;
+ range = llmin(range, mBBox[1].mV[1] - mBBox[0].mV[1]) ;
+ range = llmin(range, mBBox[1].mV[2] - mBBox[0].mV[2]) ;
+
+ mTriangleAreaThreshold = llmin(0.0002f, range * 0.000002f) ;
+}
+
+//check if the triangle area is large enough to qualify for a valid triangle
+bool LLPhysicsDecomp::Request::isValidTriangle(U16 idx1, U16 idx2, U16 idx3)
+{
+ LLVector3 a = mPositions[idx2] - mPositions[idx1] ;
+ LLVector3 b = mPositions[idx3] - mPositions[idx1] ;
+ F32 c = a * b ;
+
+ return ((a*a) * (b*b) - c * c) > mTriangleAreaThreshold ;
+}
+
+void LLPhysicsDecomp::Request::setStatusMessage(const std::string& msg)
+{
+ mStatusMessage = msg;
+}
+
+LLModelInstance::LLModelInstance(LLSD& data)
+{
+ mLocalMeshID = data["mesh_id"].asInteger();
+ mLabel = data["label"].asString();
+ mTransform.setValue(data["transform"]);
+
+ for (U32 i = 0; i < data["material"].size(); ++i)
+ {
+ LLImportMaterial mat(data["material"][i]);
+ mMaterial[mat.mBinding] = mat;
+ }
+}
+
+
+LLSD LLModelInstance::asLLSD()
+{
+ LLSD ret;
+
+ ret["mesh_id"] = mModel->mLocalID;
+ ret["label"] = mLabel;
+ ret["transform"] = mTransform.getValue();
+
+ U32 i = 0;
+ for (std::map<std::string, LLImportMaterial>::iterator iter = mMaterial.begin(); iter != mMaterial.end(); ++iter)
+ {
+ ret["material"][i++] = iter->second.asLLSD();
+ }
+
+ return ret;
+}
+
+LLImportMaterial::LLImportMaterial(LLSD& data)
+{
+ mDiffuseMapFilename = data["diffuse"]["filename"].asString();
+ mDiffuseMapLabel = data["diffuse"]["label"].asString();
+ mDiffuseColor.setValue(data["diffuse"]["color"]);
+ mFullbright = data["fullbright"].asBoolean();
+ mBinding = data["binding"].asString();
+}
+
+
+LLSD LLImportMaterial::asLLSD()
+{
+ LLSD ret;
+
+ ret["diffuse"]["filename"] = mDiffuseMapFilename;
+ ret["diffuse"]["label"] = mDiffuseMapLabel;
+ ret["diffuse"]["color"] = mDiffuseColor.getValue();
+ ret["fullbright"] = mFullbright;
+ ret["binding"] = mBinding;
+
+ return ret;
+}
+
+void LLMeshRepository::buildPhysicsMesh(LLModel::Decomposition& decomp)
+{
+ decomp.mMesh.resize(decomp.mHull.size());
+
+ for (U32 i = 0; i < decomp.mHull.size(); ++i)
+ {
+ LLCDHull hull;
+ hull.mNumVertices = decomp.mHull[i].size();
+ hull.mVertexBase = decomp.mHull[i][0].mV;
+ hull.mVertexStrideBytes = 12;
+
+ LLCDMeshData mesh;
+ LLCDResult res = LLCD_OK;
+ if (LLConvexDecomposition::getInstance() != NULL)
+ {
+ res = LLConvexDecomposition::getInstance()->getMeshFromHull(&hull, &mesh);
+ }
+ if (res == LLCD_OK)
+ {
+ get_vertex_buffer_from_mesh(mesh, decomp.mMesh[i]);
+ }
+ }
+
+ if (!decomp.mBaseHull.empty() && decomp.mBaseHullMesh.empty())
+ { //get mesh for base hull
+ LLCDHull hull;
+ hull.mNumVertices = decomp.mBaseHull.size();
+ hull.mVertexBase = decomp.mBaseHull[0].mV;
+ hull.mVertexStrideBytes = 12;
+
+ LLCDMeshData mesh;
+ LLCDResult res = LLCD_OK;
+ if (LLConvexDecomposition::getInstance() != NULL)
+ {
+ res = LLConvexDecomposition::getInstance()->getMeshFromHull(&hull, &mesh);
+ }
+ if (res == LLCD_OK)
+ {
+ get_vertex_buffer_from_mesh(mesh, decomp.mBaseHullMesh);
+ }
+ }
+}
+
+
+bool LLMeshRepository::meshUploadEnabled()
+{
+ LLViewerRegion *region = gAgent.getRegion();
+ if(gSavedSettings.getBOOL("MeshEnabled") &&
+ region)
+ {
+ return region->meshUploadEnabled();
+ }
+ return false;
+}
+
+bool LLMeshRepository::meshRezEnabled()
+{
+ LLViewerRegion *region = gAgent.getRegion();
+ if(gSavedSettings.getBOOL("MeshEnabled") &&
+ region)
+ {
+ return region->meshRezEnabled();
+ }
+ return false;
+}
diff --git a/indra/newview/llmeshrepository.h b/indra/newview/llmeshrepository.h
new file mode 100644
index 0000000000..da81bb057b
--- /dev/null
+++ b/indra/newview/llmeshrepository.h
@@ -0,0 +1,557 @@
+/**
+ * @file llmeshrepository.h
+ * @brief Client-side repository of mesh assets.
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_MESH_REPOSITORY_H
+#define LL_MESH_REPOSITORY_H
+
+#include "llassettype.h"
+#include "llmodel.h"
+#include "lluuid.h"
+#include "llviewertexture.h"
+#include "llvolume.h"
+
+#define LLCONVEXDECOMPINTER_STATIC 1
+
+#include "llconvexdecomposition.h"
+#include "lluploadfloaterobservers.h"
+
+class LLVOVolume;
+class LLMeshResponder;
+class LLCurlRequest;
+class LLMutex;
+class LLCondition;
+class LLVFS;
+class LLMeshRepository;
+
+class LLMeshUploadData
+{
+public:
+ LLPointer<LLModel> mBaseModel;
+ LLPointer<LLModel> mModel[5];
+ LLUUID mUUID;
+ U32 mRetries;
+ std::string mRSVP;
+ std::string mAssetData;
+ LLSD mPostData;
+
+ LLMeshUploadData()
+ {
+ mRetries = 0;
+ }
+};
+
+class LLTextureUploadData
+{
+public:
+ LLViewerFetchedTexture* mTexture;
+ LLUUID mUUID;
+ std::string mRSVP;
+ std::string mLabel;
+ U32 mRetries;
+ std::string mAssetData;
+ LLSD mPostData;
+
+ LLTextureUploadData()
+ {
+ mRetries = 0;
+ }
+
+ LLTextureUploadData(LLViewerFetchedTexture* texture, std::string& label)
+ : mTexture(texture), mLabel(label)
+ {
+ mRetries = 0;
+ }
+};
+
+class LLImportMaterial
+{
+public:
+ LLPointer<LLViewerFetchedTexture> mDiffuseMap;
+ std::string mDiffuseMapFilename;
+ std::string mDiffuseMapLabel;
+ std::string mBinding;
+ LLColor4 mDiffuseColor;
+ bool mFullbright;
+
+ bool operator<(const LLImportMaterial &params) const;
+
+ LLImportMaterial()
+ : mFullbright(false)
+ {
+ mDiffuseColor.set(1,1,1,1);
+ }
+
+ LLImportMaterial(LLSD& data);
+
+ LLSD asLLSD();
+};
+
+class LLModelInstance
+{
+public:
+ LLPointer<LLModel> mModel;
+ LLPointer<LLModel> mLOD[5];
+
+ std::string mLabel;
+
+ LLUUID mMeshID;
+ S32 mLocalMeshID;
+
+ LLMatrix4 mTransform;
+ std::map<std::string, LLImportMaterial> mMaterial;
+
+ LLModelInstance(LLModel* model, const std::string& label, LLMatrix4& transform, std::map<std::string, LLImportMaterial>& materials)
+ : mModel(model), mLabel(label), mTransform(transform), mMaterial(materials)
+ {
+ mLocalMeshID = -1;
+ }
+
+ LLModelInstance(LLSD& data);
+
+ LLSD asLLSD();
+};
+
+class LLPhysicsDecomp : public LLThread
+{
+public:
+
+ typedef std::map<std::string, LLSD> decomp_params;
+
+ class Request : public LLRefCount
+ {
+ public:
+ //input params
+ S32* mDecompID;
+ std::string mStage;
+ std::vector<LLVector3> mPositions;
+ std::vector<U16> mIndices;
+ decomp_params mParams;
+
+ //output state
+ std::string mStatusMessage;
+ std::vector<LLModel::PhysicsMesh> mHullMesh;
+ LLModel::convex_hull_decomposition mHull;
+
+ //status message callback, called from decomposition thread
+ virtual S32 statusCallback(const char* status, S32 p1, S32 p2) = 0;
+
+ //completed callback, called from the main thread
+ virtual void completed() = 0;
+
+ virtual void setStatusMessage(const std::string& msg);
+
+ bool isValid() const {return mPositions.size() > 2 && mIndices.size() > 2 ;}
+
+ protected:
+ //internal use
+ LLVector3 mBBox[2] ;
+ F32 mTriangleAreaThreshold ;
+
+ void assignData(LLModel* mdl) ;
+ void updateTriangleAreaThreshold() ;
+ bool isValidTriangle(U16 idx1, U16 idx2, U16 idx3) ;
+ };
+
+ LLCondition* mSignal;
+ LLMutex* mMutex;
+
+ bool mInited;
+ bool mQuitting;
+ bool mDone;
+
+ LLPhysicsDecomp();
+ ~LLPhysicsDecomp();
+
+ void shutdown();
+
+ void submitRequest(Request* request);
+ static S32 llcdCallback(const char*, S32, S32);
+ void cancel();
+
+ void setMeshData(LLCDMeshData& mesh, bool vertex_based);
+ void doDecomposition();
+ void doDecompositionSingleHull();
+
+ virtual void run();
+
+ void completeCurrent();
+ void notifyCompleted();
+
+ std::map<std::string, S32> mStageID;
+
+ typedef std::queue<LLPointer<Request> > request_queue;
+ request_queue mRequestQ;
+
+ LLPointer<Request> mCurRequest;
+
+ std::queue<LLPointer<Request> > mCompletedQ;
+
+};
+
+class LLMeshRepoThread : public LLThread
+{
+public:
+
+ static S32 sActiveHeaderRequests;
+ static S32 sActiveLODRequests;
+ static U32 sMaxConcurrentRequests;
+
+ LLCurlRequest* mCurlRequest;
+ LLMutex* mMutex;
+ LLMutex* mHeaderMutex;
+ LLCondition* mSignal;
+
+ bool mWaiting;
+
+ //map of known mesh headers
+ typedef std::map<LLUUID, LLSD> mesh_header_map;
+ mesh_header_map mMeshHeader;
+
+ std::map<LLUUID, U32> mMeshHeaderSize;
+
+ class HeaderRequest
+ {
+ public:
+ const LLVolumeParams mMeshParams;
+
+ HeaderRequest(const LLVolumeParams& mesh_params)
+ : mMeshParams(mesh_params)
+ {
+ }
+
+ bool operator<(const HeaderRequest& rhs) const
+ {
+ return mMeshParams < rhs.mMeshParams;
+ }
+ };
+
+ class LODRequest
+ {
+ public:
+ LLVolumeParams mMeshParams;
+ S32 mLOD;
+ F32 mScore;
+
+ LODRequest(const LLVolumeParams& mesh_params, S32 lod)
+ : mMeshParams(mesh_params), mLOD(lod), mScore(0.f)
+ {
+ }
+ };
+
+ struct CompareScoreGreater
+ {
+ bool operator()(const LODRequest& lhs, const LODRequest& rhs)
+ {
+ return lhs.mScore > rhs.mScore; // greatest = first
+ }
+ };
+
+
+ class LoadedMesh
+ {
+ public:
+ LLPointer<LLVolume> mVolume;
+ LLVolumeParams mMeshParams;
+ S32 mLOD;
+
+ LoadedMesh(LLVolume* volume, const LLVolumeParams& mesh_params, S32 lod)
+ : mVolume(volume), mMeshParams(mesh_params), mLOD(lod)
+ {
+ }
+
+ };
+
+ //set of requested skin info
+ std::set<LLUUID> mSkinRequests;
+
+ //queue of completed skin info requests
+ std::queue<LLMeshSkinInfo> mSkinInfoQ;
+
+ //set of requested decompositions
+ std::set<LLUUID> mDecompositionRequests;
+
+ //set of requested physics shapes
+ std::set<LLUUID> mPhysicsShapeRequests;
+
+ //queue of completed Decomposition info requests
+ std::queue<LLModel::Decomposition*> mDecompositionQ;
+
+ //queue of requested headers
+ std::queue<HeaderRequest> mHeaderReqQ;
+
+ //queue of requested LODs
+ std::queue<LODRequest> mLODReqQ;
+
+ //queue of unavailable LODs (either asset doesn't exist or asset doesn't have desired LOD)
+ std::queue<LODRequest> mUnavailableQ;
+
+ //queue of successfully loaded meshes
+ std::queue<LoadedMesh> mLoadedQ;
+
+ //map of pending header requests and currently desired LODs
+ typedef std::map<LLVolumeParams, std::vector<S32> > pending_lod_map;
+ pending_lod_map mPendingLOD;
+
+ static std::string constructUrl(LLUUID mesh_id);
+
+ LLMeshRepoThread();
+ ~LLMeshRepoThread();
+
+ virtual void run();
+
+ void loadMeshLOD(const LLVolumeParams& mesh_params, S32 lod);
+ bool fetchMeshHeader(const LLVolumeParams& mesh_params, U32& count);
+ bool fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod, U32& count);
+ bool headerReceived(const LLVolumeParams& mesh_params, U8* data, S32 data_size);
+ bool lodReceived(const LLVolumeParams& mesh_params, S32 lod, U8* data, S32 data_size);
+ bool skinInfoReceived(const LLUUID& mesh_id, U8* data, S32 data_size);
+ bool decompositionReceived(const LLUUID& mesh_id, U8* data, S32 data_size);
+ bool physicsShapeReceived(const LLUUID& mesh_id, U8* data, S32 data_size);
+ LLSD& getMeshHeader(const LLUUID& mesh_id);
+
+ void notifyLoadedMeshes();
+ S32 getActualMeshLOD(const LLVolumeParams& mesh_params, S32 lod);
+
+ void loadMeshSkinInfo(const LLUUID& mesh_id);
+ void loadMeshDecomposition(const LLUUID& mesh_id);
+ void loadMeshPhysicsShape(const LLUUID& mesh_id);
+
+ //send request for skin info, returns true if header info exists
+ // (should hold onto mesh_id and try again later if header info does not exist)
+ bool fetchMeshSkinInfo(const LLUUID& mesh_id);
+
+ //send request for decomposition, returns true if header info exists
+ // (should hold onto mesh_id and try again later if header info does not exist)
+ bool fetchMeshDecomposition(const LLUUID& mesh_id);
+
+ //send request for PhysicsShape, returns true if header info exists
+ // (should hold onto mesh_id and try again later if header info does not exist)
+ bool fetchMeshPhysicsShape(const LLUUID& mesh_id);
+
+
+};
+
+class LLMeshUploadThread : public LLThread
+{
+private:
+ S32 mMeshUploadTimeOut ; //maximum time in seconds to execute an uploading request.
+
+public:
+ class DecompRequest : public LLPhysicsDecomp::Request
+ {
+ public:
+ LLPointer<LLModel> mModel;
+ LLPointer<LLModel> mBaseModel;
+
+ LLMeshUploadThread* mThread;
+
+ DecompRequest(LLModel* mdl, LLModel* base_model, LLMeshUploadThread* thread);
+
+ S32 statusCallback(const char* status, S32 p1, S32 p2) { return 1; }
+ void completed();
+ };
+
+ LLPointer<DecompRequest> mFinalDecomp;
+ bool mPhysicsComplete;
+
+ typedef std::map<LLPointer<LLModel>, std::vector<LLVector3> > hull_map;
+ hull_map mHullMap;
+
+ typedef std::vector<LLModelInstance> instance_list;
+ instance_list mInstanceList;
+
+ typedef std::map<LLPointer<LLModel>, instance_list> instance_map;
+ instance_map mInstance;
+
+ LLMutex* mMutex;
+ LLCurlRequest* mCurlRequest;
+ S32 mPendingUploads;
+ LLVector3 mOrigin;
+ bool mFinished;
+ bool mUploadTextures;
+ bool mUploadSkin;
+ bool mUploadJoints;
+ BOOL mDiscarded ;
+
+ LLHost mHost;
+ std::string mWholeModelFeeCapability;
+ std::string mWholeModelUploadURL;
+
+ LLMeshUploadThread(instance_list& data, LLVector3& scale, bool upload_textures,
+ bool upload_skin, bool upload_joints, std::string upload_url, bool do_upload = true,
+ LLHandle<LLWholeModelFeeObserver> fee_observer= (LLHandle<LLWholeModelFeeObserver>()), LLHandle<LLWholeModelUploadObserver> upload_observer = (LLHandle<LLWholeModelUploadObserver>()));
+ ~LLMeshUploadThread();
+
+ bool finished() { return mFinished; }
+ virtual void run();
+ void preStart();
+ void discard() ;
+ BOOL isDiscarded();
+
+ void generateHulls();
+
+ void doWholeModelUpload();
+ void requestWholeModelFee();
+
+ void wholeModelToLLSD(LLSD& dest, bool include_textures);
+
+ void decomposeMeshMatrix(LLMatrix4& transformation,
+ LLVector3& result_pos,
+ LLQuaternion& result_rot,
+ LLVector3& result_scale);
+
+ void setFeeObserverHandle(LLHandle<LLWholeModelFeeObserver> observer_handle) { mFeeObserverHandle = observer_handle; }
+ void setUploadObserverHandle(LLHandle<LLWholeModelUploadObserver> observer_handle) { mUploadObserverHandle = observer_handle; }
+
+private:
+ LLHandle<LLWholeModelFeeObserver> mFeeObserverHandle;
+ LLHandle<LLWholeModelUploadObserver> mUploadObserverHandle;
+
+ bool mDoUpload; // if FALSE only model data will be requested, otherwise the model will be uploaded
+};
+
+class LLMeshRepository
+{
+public:
+
+ //metrics
+ static U32 sBytesReceived;
+ static U32 sHTTPRequestCount;
+ static U32 sHTTPRetryCount;
+ static U32 sLODPending;
+ static U32 sLODProcessing;
+ static U32 sCacheBytesRead;
+ static U32 sCacheBytesWritten;
+ static U32 sPeakKbps;
+
+ static F32 getStreamingCost(LLSD& header, F32 radius, S32* bytes = NULL, S32* visible_bytes = NULL, S32 detail = -1, F32 *unscaled_value = NULL);
+
+ LLMeshRepository();
+
+ void init();
+ void shutdown();
+ S32 update() ;
+
+ //mesh management functions
+ S32 loadMesh(LLVOVolume* volume, const LLVolumeParams& mesh_params, S32 detail = 0, S32 last_lod = -1);
+
+ void notifyLoadedMeshes();
+ void notifyMeshLoaded(const LLVolumeParams& mesh_params, LLVolume* volume);
+ void notifyMeshUnavailable(const LLVolumeParams& mesh_params, S32 lod);
+ void notifySkinInfoReceived(LLMeshSkinInfo& info);
+ void notifyDecompositionReceived(LLModel::Decomposition* info);
+
+ S32 getActualMeshLOD(const LLVolumeParams& mesh_params, S32 lod);
+ static S32 getActualMeshLOD(LLSD& header, S32 lod);
+ const LLMeshSkinInfo* getSkinInfo(const LLUUID& mesh_id, const LLVOVolume* requesting_obj);
+ LLModel::Decomposition* getDecomposition(const LLUUID& mesh_id);
+ void fetchPhysicsShape(const LLUUID& mesh_id);
+ bool hasPhysicsShape(const LLUUID& mesh_id);
+
+ void buildHull(const LLVolumeParams& params, S32 detail);
+ void buildPhysicsMesh(LLModel::Decomposition& decomp);
+
+ bool meshUploadEnabled();
+ bool meshRezEnabled();
+
+
+ LLSD& getMeshHeader(const LLUUID& mesh_id);
+
+ void uploadModel(std::vector<LLModelInstance>& data, LLVector3& scale, bool upload_textures,
+ bool upload_skin, bool upload_joints, std::string upload_url, bool do_upload = true,
+ LLHandle<LLWholeModelFeeObserver> fee_observer= (LLHandle<LLWholeModelFeeObserver>()), LLHandle<LLWholeModelUploadObserver> upload_observer = (LLHandle<LLWholeModelUploadObserver>()));
+
+ S32 getMeshSize(const LLUUID& mesh_id, S32 lod);
+
+ typedef std::map<LLVolumeParams, std::set<LLUUID> > mesh_load_map;
+ mesh_load_map mLoadingMeshes[4];
+
+ typedef std::map<LLUUID, LLMeshSkinInfo> skin_map;
+ skin_map mSkinMap;
+
+ typedef std::map<LLUUID, LLModel::Decomposition*> decomposition_map;
+ decomposition_map mDecompositionMap;
+
+ LLMutex* mMeshMutex;
+
+ std::vector<LLMeshRepoThread::LODRequest> mPendingRequests;
+
+ //list of mesh ids awaiting skin info
+ typedef std::map<LLUUID, std::set<LLUUID> > skin_load_map;
+ skin_load_map mLoadingSkins;
+
+ //list of mesh ids that need to send skin info fetch requests
+ std::queue<LLUUID> mPendingSkinRequests;
+
+ //list of mesh ids awaiting decompositions
+ std::set<LLUUID> mLoadingDecompositions;
+
+ //list of mesh ids that need to send decomposition fetch requests
+ std::queue<LLUUID> mPendingDecompositionRequests;
+
+ //list of mesh ids awaiting physics shapes
+ std::set<LLUUID> mLoadingPhysicsShapes;
+
+ //list of mesh ids that need to send physics shape fetch requests
+ std::queue<LLUUID> mPendingPhysicsShapeRequests;
+
+ U32 mMeshThreadCount;
+
+ void cacheOutgoingMesh(LLMeshUploadData& data, LLSD& header);
+
+ LLMeshRepoThread* mThread;
+ std::vector<LLMeshUploadThread*> mUploads;
+ std::vector<LLMeshUploadThread*> mUploadWaitList;
+
+ LLPhysicsDecomp* mDecompThread;
+
+ class inventory_data
+ {
+ public:
+ LLSD mPostData;
+ LLSD mResponse;
+
+ inventory_data(const LLSD& data, const LLSD& content)
+ : mPostData(data), mResponse(content)
+ {
+ }
+ };
+
+ std::queue<inventory_data> mInventoryQ;
+
+ std::queue<LLSD> mUploadErrorQ;
+
+ void uploadError(LLSD& args);
+ void updateInventory(inventory_data data);
+
+ std::string mGetMeshCapability;
+
+};
+
+extern LLMeshRepository gMeshRepo;
+
+#endif
+
diff --git a/indra/newview/llmorphview.h b/indra/newview/llmorphview.h
index 1d8ee8e944..318d49bba5 100644
--- a/indra/newview/llmorphview.h
+++ b/indra/newview/llmorphview.h
@@ -40,8 +40,8 @@ public:
{
Params()
{
- mouse_opaque(false);
- follows.flags(FOLLOWS_ALL);
+ changeDefault(mouse_opaque, false);
+ changeDefault(follows.flags, FOLLOWS_ALL);
}
};
LLMorphView(const LLMorphView::Params&);
diff --git a/indra/newview/llmoveview.cpp b/indra/newview/llmoveview.cpp
index d38bb5aa4a..c3d8b91d67 100644
--- a/indra/newview/llmoveview.cpp
+++ b/indra/newview/llmoveview.cpp
@@ -37,7 +37,6 @@
#include "llagent.h"
#include "llagentcamera.h"
#include "llvoavatarself.h" // to check gAgentAvatarp->isSitting()
-#include "llbottomtray.h"
#include "llbutton.h"
#include "llfirstuse.h"
#include "llfloaterreg.h"
@@ -46,7 +45,8 @@
#include "lluictrlfactory.h"
#include "llviewerwindow.h"
#include "llviewercontrol.h"
-#include "llselectmgr.h"
+#include "llselectmgr.h"
+#include "lltoolbarview.h"
#include "llviewerparcelmgr.h"
#include "llviewerregion.h"
#include "lltooltip.h"
@@ -59,15 +59,13 @@ const F32 MOVE_BUTTON_DELAY = 0.0f;
const F32 YAW_NUDGE_RATE = 0.05f; // fraction of normal speed
const F32 NUDGE_TIME = 0.25f; // in seconds
-const std::string BOTTOM_TRAY_BUTTON_NAME = "movement_btn";
-
//
// Member functions
//
// protected
LLFloaterMove::LLFloaterMove(const LLSD& key)
-: LLTransientDockableFloater(NULL, true, key),
+: LLFloater(key),
mForwardButton(NULL),
mBackwardButton(NULL),
mTurnLeftButton(NULL),
@@ -92,10 +90,7 @@ LLFloaterMove::~LLFloaterMove()
// virtual
BOOL LLFloaterMove::postBuild()
{
- setIsChrome(TRUE);
- setTitleVisible(TRUE); // restore title visibility after chrome applying
-
- LLDockableFloater::postBuild();
+ updateTransparency(TT_ACTIVE); // force using active floater transparency (STORM-730)
// Code that implements floater buttons toggling when user moves via keyboard is located in LLAgent::propagate()
@@ -154,10 +149,10 @@ BOOL LLFloaterMove::postBuild()
// virtual
void LLFloaterMove::setVisible(BOOL visible)
{
- // Do nothing with Stand/Stop Flying panel in excessive calls of this method (from LLTransientFloaterMgr?).
+ // Do nothing with Stand/Stop Flying panel in excessive calls of this method.
if (getVisible() == visible)
{
- LLTransientDockableFloater::setVisible(visible);
+ LLFloater::setVisible(visible);
return;
}
@@ -176,7 +171,7 @@ void LLFloaterMove::setVisible(BOOL visible)
LLPanelStandStopFlying::getInstance()->reparent(NULL);
}
- LLTransientDockableFloater::setVisible(visible);
+ LLFloater::setVisible(visible);
}
// static
@@ -440,27 +435,6 @@ void LLFloaterMove::setModeTitle(const EMovementMode mode)
setTitle(title);
}
-/**
- * Updates position of the floater to be center aligned with Move button.
- */
-void LLFloaterMove::updatePosition()
-{
- LLBottomTray* tray = LLBottomTray::getInstance();
- if (!tray) return;
-
- LLButton* movement_btn = tray->getChild<LLButton>(BOTTOM_TRAY_BUTTON_NAME);
-
- //align centers of a button and a floater
- S32 x = movement_btn->calcScreenRect().getCenterX() - getRect().getWidth()/2;
-
- S32 y = 0;
- if (!mModeActionsPanel->getVisible())
- {
- y = mModeActionsPanel->getRect().getHeight();
- }
- setOrigin(x, y);
-}
-
//static
void LLFloaterMove::sUpdateFlyingStatus()
{
@@ -495,8 +469,6 @@ void LLFloaterMove::enableInstance(BOOL bEnable)
void LLFloaterMove::onOpen(const LLSD& key)
{
- LLButton *anchor_panel = LLBottomTray::getInstance()->getChild<LLButton>("movement_btn");
-
if (gAgent.getFlying())
{
setFlyingMode(TRUE);
@@ -509,19 +481,9 @@ void LLFloaterMove::onOpen(const LLSD& key)
showModeButtons(FALSE);
}
- setDockControl(new LLDockControl(
- anchor_panel, this,
- getDockTongue(), LLDockControl::TOP));
-
sUpdateFlyingStatus();
}
-//virtual
-void LLFloaterMove::setDocked(bool docked, bool pop_on_undock/* = true*/)
-{
- LLTransientDockableFloater::setDocked(docked, pop_on_undock);
-}
-
void LLFloaterMove::setModeButtonToggleState(const EMovementMode mode)
{
llassert_always(mModeControlButtonMap.end() != mModeControlButtonMap.find(mode));
@@ -732,15 +694,30 @@ void LLPanelStandStopFlying::onStopFlyingButtonClick()
*/
void LLPanelStandStopFlying::updatePosition()
{
- LLBottomTray* tray = LLBottomTray::getInstance();
- if (!tray || mAttached) return;
+ if (mAttached) return;
- LLButton* movement_btn = tray->getChild<LLButton>(BOTTOM_TRAY_BUTTON_NAME);
+ S32 y_pos = 0;
+ S32 bottom_tb_center = 0;
+ if (LLToolBar* toolbar_bottom = gToolBarView->getChild<LLToolBar>("toolbar_bottom"))
+ {
+ y_pos = toolbar_bottom->getRect().getHeight();
+ bottom_tb_center = toolbar_bottom->getRect().getCenterX();
+ }
- // Align centers of the button and the panel.
- S32 x = movement_btn->calcScreenRect().getCenterX() - getRect().getWidth()/2;
- setOrigin(x, 0);
-}
+ S32 left_tb_width = 0;
+ if (LLToolBar* toolbar_left = gToolBarView->getChild<LLToolBar>("toolbar_left"))
+ {
+ left_tb_width = toolbar_left->getRect().getWidth();
+ }
+ if(LLPanel* panel_ssf_container = getRootView()->getChild<LLPanel>("stand_stop_flying_container"))
+ {
+ panel_ssf_container->setOrigin(0, y_pos);
+ }
+
+ S32 x_pos = bottom_tb_center-getRect().getWidth()/2 - left_tb_width;
+
+ setOrigin( x_pos, 0);
+}
// EOF
diff --git a/indra/newview/llmoveview.h b/indra/newview/llmoveview.h
index 1b87864651..744dd866d4 100644
--- a/indra/newview/llmoveview.h
+++ b/indra/newview/llmoveview.h
@@ -28,7 +28,7 @@
#define LL_LLMOVEVIEW_H
// Library includes
-#include "lltransientdockablefloater.h"
+#include "llfloater.h"
class LLButton;
class LLJoystickAgentTurn;
@@ -38,7 +38,7 @@ class LLJoystickAgentSlide;
// Classes
//
class LLFloaterMove
-: public LLTransientDockableFloater
+: public LLFloater
{
LOG_CLASS(LLFloaterMove);
friend class LLFloaterReg;
@@ -58,7 +58,6 @@ public:
static void setSittingMode(BOOL bSitting);
static void enableInstance(BOOL bEnable);
/*virtual*/ void onOpen(const LLSD& key);
- /*virtual*/ void setDocked(bool docked, bool pop_on_undock = true);
static void sUpdateFlyingStatus();
@@ -87,7 +86,6 @@ private:
void initModeButtonMap();
void setModeButtonToggleState(const EMovementMode mode);
void updateButtonsWithMovementMode(const EMovementMode newMode);
- void updatePosition();
void showModeButtons(BOOL bShow);
public:
diff --git a/indra/newview/llmutelist.cpp b/indra/newview/llmutelist.cpp
index af8fdb17cf..a7059eb519 100644
--- a/indra/newview/llmutelist.cpp
+++ b/indra/newview/llmutelist.cpp
@@ -373,17 +373,19 @@ BOOL LLMuteList::remove(const LLMute& mute, U32 flags)
// Must be after erase.
setLoaded(); // why is this here? -MG
}
-
- // Clean up any legacy mutes
- string_set_t::iterator legacy_it = mLegacyMutes.find(mute.mName);
- if (legacy_it != mLegacyMutes.end())
+ else
{
- // Database representation of legacy mute is UUID null.
- LLMute mute(LLUUID::null, *legacy_it, LLMute::BY_NAME);
- updateRemove(mute);
- mLegacyMutes.erase(legacy_it);
- // Must be after erase.
- setLoaded(); // why is this here? -MG
+ // Clean up any legacy mutes
+ string_set_t::iterator legacy_it = mLegacyMutes.find(mute.mName);
+ if (legacy_it != mLegacyMutes.end())
+ {
+ // Database representation of legacy mute is UUID null.
+ LLMute mute(LLUUID::null, *legacy_it, LLMute::BY_NAME);
+ updateRemove(mute);
+ mLegacyMutes.erase(legacy_it);
+ // Must be after erase.
+ setLoaded(); // why is this here? -MG
+ }
}
return found;
@@ -607,7 +609,8 @@ BOOL LLMuteList::isMuted(const LLUUID& id, const std::string& name, U32 flags) c
}
// empty names can't be legacy-muted
- if (name.empty()) return FALSE;
+ bool avatar = mute_object && mute_object->isAvatar();
+ if (name.empty() || avatar) return FALSE;
// Look in legacy pile
string_set_t::const_iterator legacy_it = mLegacyMutes.find(name);
diff --git a/indra/newview/llmutelist.h b/indra/newview/llmutelist.h
index 04e1570081..7a70370fe3 100644
--- a/indra/newview/llmutelist.h
+++ b/indra/newview/llmutelist.h
@@ -29,6 +29,7 @@
#include "llstring.h"
#include "lluuid.h"
+#include "llextendedstatus.h"
class LLViewerObject;
class LLMessageSystem;
diff --git a/indra/newview/llnamelistctrl.cpp b/indra/newview/llnamelistctrl.cpp
index 38100aa6c5..4e28d1f526 100644
--- a/indra/newview/llnamelistctrl.cpp
+++ b/indra/newview/llnamelistctrl.cpp
@@ -57,7 +57,6 @@ LLNameListCtrl::Params::Params()
allow_calling_card_drop("allow_calling_card_drop", false),
short_names("short_names", false)
{
- name = "name_list";
}
LLNameListCtrl::LLNameListCtrl(const LLNameListCtrl::Params& p)
@@ -143,6 +142,30 @@ void LLNameListCtrl::mouseOverHighlightNthItem( S32 target_index )
S32 cur_index = getHighlightedItemInx();
if (cur_index != target_index)
{
+ bool is_mouse_over_name_cell = false;
+
+ S32 mouse_x, mouse_y;
+ LLUI::getMousePositionLocal(this, &mouse_x, &mouse_y);
+
+ S32 column_index = getColumnIndexFromOffset(mouse_x);
+ LLScrollListItem* hit_item = hitItem(mouse_x, mouse_y);
+ if (hit_item && column_index == mNameColumnIndex)
+ {
+ // Get the name cell which is currently under the mouse pointer.
+ LLScrollListCell* hit_cell = hit_item->getColumn(column_index);
+ if (hit_cell)
+ {
+ is_mouse_over_name_cell = getCellRect(cur_index, column_index).pointInRect(mouse_x, mouse_y);
+ }
+ }
+
+ // If the tool tip is visible and the mouse is over the currently highlighted item's name cell,
+ // we should not reset the highlighted item index i.e. set mHighlightedItem = -1
+ // and should not increase the width of the text inside the cell because it may
+ // overlap the tool tip icon.
+ if (LLToolTipMgr::getInstance()->toolTipVisible() && is_mouse_over_name_cell)
+ return;
+
if(0 <= cur_index && cur_index < (S32)getItemList().size())
{
LLScrollListItem* item = getItemList()[cur_index];
diff --git a/indra/newview/llnamelistctrl.h b/indra/newview/llnamelistctrl.h
index 6805630ef1..ca9956dc53 100644
--- a/indra/newview/llnamelistctrl.h
+++ b/indra/newview/llnamelistctrl.h
@@ -1,25 +1,25 @@
-/**
+/**
* @file llnamelistctrl.h
* @brief A list of names, automatically refreshing from the name cache.
*
* $LicenseInfo:firstyear=2003&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2010, Linden Research, Inc.
- *
+ *
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
- *
+ *
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
+ *
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
@@ -58,10 +58,10 @@ public:
NameItem()
: name("name"),
target("target", INDIVIDUAL)
- {}
+ {}
};
- struct NameColumn : public LLInitParam::Choice<NameColumn>
+ struct NameColumn : public LLInitParam::ChoiceBlock<NameColumn>
{
Alternative<S32> column_index;
Alternative<std::string> column_name;
@@ -83,7 +83,7 @@ protected:
LLNameListCtrl(const Params&);
friend class LLUICtrlFactory;
public:
- // Add a user to the list by name. It will be added, the name
+ // Add a user to the list by name. It will be added, the name
// requested from the cache, and updated as necessary.
void addNameItem(const LLUUID& agent_id, EAddPosition pos = ADD_BOTTOM,
BOOL enabled = TRUE, const std::string& suffix = LLStringUtil::null);
@@ -92,7 +92,7 @@ public:
/*virtual*/ LLScrollListItem* addElement(const LLSD& element, EAddPosition pos = ADD_BOTTOM, void* userdata = NULL);
LLScrollListItem* addNameItemRow(const NameItem& value, EAddPosition pos = ADD_BOTTOM, const std::string& suffix = LLStringUtil::null);
- // Add a user to the list by name. It will be added, the name
+ // Add a user to the list by name. It will be added, the name
// requested from the cache, and updated as necessary.
void addGroupNameItem(const LLUUID& group_id, EAddPosition pos = ADD_BOTTOM,
BOOL enabled = TRUE);
@@ -126,7 +126,7 @@ private:
/**
* LLNameListCtrl item
- *
+ *
* We don't use LLScrollListItem to be able to override getUUID(), which is needed
* because the name list item value is not simply an UUID but a map (uuid, is_group).
*/
diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp
index 58849393b4..2a08cb1845 100644
--- a/indra/newview/llnavigationbar.cpp
+++ b/indra/newview/llnavigationbar.cpp
@@ -45,7 +45,6 @@
#include "llpaneltopinfobar.h"
#include "llteleporthistory.h"
#include "llsearchcombobox.h"
-#include "llsidetray.h"
#include "llslurl.h"
#include "llurlregistry.h"
#include "llurldispatcher.h"
@@ -55,8 +54,8 @@
#include "llworldmapmessage.h"
#include "llappviewer.h"
#include "llviewercontrol.h"
-#include "llfloatermediabrowser.h"
#include "llweb.h"
+#include "llhints.h"
#include "llinventorymodel.h"
#include "lllandmarkactions.h"
@@ -268,7 +267,6 @@ LLNavigationBar::LLNavigationBar()
mBtnForward(NULL),
mBtnHome(NULL),
mCmbLocation(NULL),
- mSearchComboBox(NULL),
mPurgeTPHistoryItems(false),
mSaveToLocationHistory(false)
{
@@ -276,9 +274,6 @@ LLNavigationBar::LLNavigationBar()
// set a listener function for LoginComplete event
LLAppViewer::instance()->setOnLoginCompletedCallback(boost::bind(&LLNavigationBar::handleLoginComplete, this));
-
- // Necessary for focus movement among child controls
- setFocusRoot(TRUE);
}
LLNavigationBar::~LLNavigationBar()
@@ -293,10 +288,7 @@ BOOL LLNavigationBar::postBuild()
mBtnForward = getChild<LLPullButton>("forward_btn");
mBtnHome = getChild<LLButton>("home_btn");
- mCmbLocation= getChild<LLLocationInputCtrl>("location_combo");
- mSearchComboBox = getChild<LLSearchComboBox>("search_combo_box");
-
- fillSearchComboBox();
+ mCmbLocation= getChild<LLLocationInputCtrl>("location_combo");
mBtnBack->setEnabled(FALSE);
mBtnBack->setClickedCallback(boost::bind(&LLNavigationBar::onBackButtonClicked, this));
@@ -311,8 +303,6 @@ BOOL LLNavigationBar::postBuild()
mBtnHome->setClickedCallback(boost::bind(&LLNavigationBar::onHomeButtonClicked, this));
mCmbLocation->setCommitCallback(boost::bind(&LLNavigationBar::onLocationSelection, this));
-
- mSearchComboBox->setCommitCallback(boost::bind(&LLNavigationBar::onSearchCommit, this));
mTeleportFinishConnection = LLViewerParcelMgr::getInstance()->
setTeleportFinishedCallback(boost::bind(&LLNavigationBar::onTeleportFinished, this, _1));
@@ -327,6 +317,8 @@ BOOL LLNavigationBar::postBuild()
LLTeleportHistory::getInstance()->setHistoryChangedCallback(
boost::bind(&LLNavigationBar::onTeleportHistoryChanged, this));
+ LLHints::registerHintTarget("nav_bar", getHandle());
+
return TRUE;
}
@@ -344,26 +336,6 @@ void LLNavigationBar::setVisible(BOOL visible)
}
}
-
-void LLNavigationBar::fillSearchComboBox()
-{
- if(!mSearchComboBox)
- {
- return;
- }
-
- LLSearchHistory::getInstance()->load();
-
- LLSearchHistory::search_history_list_t search_list =
- LLSearchHistory::getInstance()->getSearchHistoryList();
- LLSearchHistory::search_history_list_t::const_iterator it = search_list.begin();
- for( ; search_list.end() != it; ++it)
- {
- LLSearchHistory::LLSearchHistoryItem item = *it;
- mSearchComboBox->add(item.search_query);
- }
-}
-
void LLNavigationBar::draw()
{
if(mPurgeTPHistoryItems)
@@ -416,16 +388,6 @@ void LLNavigationBar::onHomeButtonClicked()
gAgent.teleportHome();
}
-void LLNavigationBar::onSearchCommit()
-{
- std::string search_query = mSearchComboBox->getSimple();
- if(!search_query.empty())
- {
- LLSearchHistory::getInstance()->addEntry(search_query);
- }
- invokeSearch(search_query);
-}
-
void LLNavigationBar::onTeleportHistoryMenuItemClicked(const LLSD& userdata)
{
int idx = userdata.asInteger();
@@ -639,18 +601,19 @@ void LLNavigationBar::onRegionNameResponse(
U64 region_handle, const std::string& url, const LLUUID& snapshot_id, bool teleport)
{
// Invalid location?
- if (!region_handle)
+ if (region_handle)
+ {
+ // Teleport to the location.
+ LLVector3d region_pos = from_region_handle(region_handle);
+ LLVector3d global_pos = region_pos + (LLVector3d) local_coords;
+
+ llinfos << "Teleporting to: " << LLSLURL(region_name, global_pos).getSLURLString() << llendl;
+ gAgent.teleportViaLocation(global_pos);
+ }
+ else if (gSavedSettings.getBOOL("SearchFromAddressBar"))
{
invokeSearch(typed_location);
- return;
}
-
- // Teleport to the location.
- LLVector3d region_pos = from_region_handle(region_handle);
- LLVector3d global_pos = region_pos + (LLVector3d) local_coords;
-
- llinfos << "Teleporting to: " << LLSLURL(region_name, global_pos).getSLURLString() << llendl;
- gAgent.teleportViaLocation(global_pos);
}
void LLNavigationBar::showTeleportHistoryMenu(LLUICtrl* btn_ctrl)
@@ -715,7 +678,7 @@ void LLNavigationBar::handleLoginComplete()
void LLNavigationBar::invokeSearch(std::string search_text)
{
- LLFloaterReg::showInstance("search", LLSD().with("category", "all").with("id", LLSD(search_text)));
+ LLFloaterReg::showInstance("search", LLSD().with("category", "all").with("query", LLSD(search_text)));
}
void LLNavigationBar::clearHistoryCache()
@@ -735,151 +698,3 @@ int LLNavigationBar::getDefFavBarHeight()
{
return mDefaultFpRect.getHeight();
}
-
-void LLNavigationBar::showNavigationPanel(BOOL visible)
-{
- bool fpVisible = gSavedSettings.getBOOL("ShowNavbarFavoritesPanel");
-
- LLFavoritesBarCtrl* fb = getChild<LLFavoritesBarCtrl>("favorite");
- LLPanel* navPanel = getChild<LLPanel>("navigation_panel");
-
- LLRect nbRect(getRect());
- LLRect fbRect(fb->getRect());
-
- navPanel->setVisible(visible);
-
- if (visible)
- {
- if (fpVisible)
- {
- // Navigation Panel must be shown. Favorites Panel is visible.
-
- nbRect.setLeftTopAndSize(nbRect.mLeft, nbRect.mTop, nbRect.getWidth(), mDefaultNbRect.getHeight());
- fbRect.setLeftTopAndSize(fbRect.mLeft, mDefaultFpRect.mTop, fbRect.getWidth(), fbRect.getHeight());
-
- // this is duplicated in 'else' section because it should be called BEFORE fb->reshape
- reshape(nbRect.getWidth(), nbRect.getHeight());
- setRect(nbRect);
- // propagate size to parent container
- getParent()->reshape(nbRect.getWidth(), nbRect.getHeight());
-
- fb->reshape(fbRect.getWidth(), fbRect.getHeight());
- fb->setRect(fbRect);
- }
- else
- {
- // Navigation Panel must be shown. Favorites Panel is hidden.
-
- S32 height = mDefaultNbRect.getHeight() - mDefaultFpRect.getHeight() - FAVBAR_TOP_PADDING;
- nbRect.setLeftTopAndSize(nbRect.mLeft, nbRect.mTop, nbRect.getWidth(), height);
-
- reshape(nbRect.getWidth(), nbRect.getHeight());
- setRect(nbRect);
- getParent()->reshape(nbRect.getWidth(), nbRect.getHeight());
- }
- }
- else
- {
- if (fpVisible)
- {
- // Navigation Panel must be hidden. Favorites Panel is visible.
-
- S32 fpHeight = mDefaultFpRect.getHeight() + FAVBAR_TOP_PADDING;
- S32 fpTop = fpHeight - (mDefaultFpRect.getHeight() / 2) + 1;
-
- nbRect.setLeftTopAndSize(nbRect.mLeft, nbRect.mTop, nbRect.getWidth(), fpHeight);
- fbRect.setLeftTopAndSize(fbRect.mLeft, fpTop, fbRect.getWidth(), mDefaultFpRect.getHeight());
-
- // this is duplicated in 'else' section because it should be called BEFORE fb->reshape
- reshape(nbRect.getWidth(), nbRect.getHeight());
- setRect(nbRect);
- getParent()->reshape(nbRect.getWidth(), nbRect.getHeight());
-
- fb->reshape(fbRect.getWidth(), fbRect.getHeight());
- fb->setRect(fbRect);
- }
- else
- {
- // Navigation Panel must be hidden. Favorites Panel is hidden.
-
- nbRect.setLeftTopAndSize(nbRect.mLeft, nbRect.mTop, nbRect.getWidth(), 0);
-
- reshape(nbRect.getWidth(), nbRect.getHeight());
- setRect(nbRect);
- getParent()->reshape(nbRect.getWidth(), nbRect.getHeight());
- }
- }
-
- getChildView("bg_icon")->setVisible( visible && fpVisible);
- getChildView("bg_icon_no_fav_bevel")->setVisible( visible && !fpVisible);
- getChildView("bg_icon_no_nav_bevel")->setVisible( !visible && fpVisible);
-}
-
-void LLNavigationBar::showFavoritesPanel(BOOL visible)
-{
- bool npVisible = gSavedSettings.getBOOL("ShowNavbarNavigationPanel");
-
- LLFavoritesBarCtrl* fb = getChild<LLFavoritesBarCtrl>("favorite");
-
- LLRect nbRect(getRect());
- LLRect fbRect(fb->getRect());
-
- if (visible)
- {
- if (npVisible)
- {
- // Favorites Panel must be shown. Navigation Panel is visible.
-
- S32 fbHeight = fbRect.getHeight();
- S32 newHeight = nbRect.getHeight() + fbHeight + FAVBAR_TOP_PADDING;
-
- nbRect.setLeftTopAndSize(nbRect.mLeft, nbRect.mTop, nbRect.getWidth(), newHeight);
- fbRect.setLeftTopAndSize(mDefaultFpRect.mLeft, mDefaultFpRect.mTop, fbRect.getWidth(), fbRect.getHeight());
- }
- else
- {
- // Favorites Panel must be shown. Navigation Panel is hidden.
-
- S32 fpHeight = mDefaultFpRect.getHeight() + FAVBAR_TOP_PADDING;
- S32 fpTop = fpHeight - (mDefaultFpRect.getHeight() / 2) + 1;
-
- nbRect.setLeftTopAndSize(nbRect.mLeft, nbRect.mTop, nbRect.getWidth(), fpHeight);
- fbRect.setLeftTopAndSize(fbRect.mLeft, fpTop, fbRect.getWidth(), mDefaultFpRect.getHeight());
- }
-
- reshape(nbRect.getWidth(), nbRect.getHeight());
- setRect(nbRect);
- getParent()->reshape(nbRect.getWidth(), nbRect.getHeight());
-
- fb->reshape(fbRect.getWidth(), fbRect.getHeight());
- fb->setRect(fbRect);
- }
- else
- {
- if (npVisible)
- {
- // Favorites Panel must be hidden. Navigation Panel is visible.
-
- S32 fbHeight = fbRect.getHeight();
- S32 newHeight = nbRect.getHeight() - fbHeight - FAVBAR_TOP_PADDING;
-
- nbRect.setLeftTopAndSize(nbRect.mLeft, nbRect.mTop, nbRect.getWidth(), newHeight);
- }
- else
- {
- // Favorites Panel must be hidden. Navigation Panel is hidden.
-
- nbRect.setLeftTopAndSize(nbRect.mLeft, nbRect.mTop, nbRect.getWidth(), 0);
- }
-
- reshape(nbRect.getWidth(), nbRect.getHeight());
- setRect(nbRect);
- getParent()->reshape(nbRect.getWidth(), nbRect.getHeight());
- }
-
- getChildView("bg_icon")->setVisible( npVisible && visible);
- getChildView("bg_icon_no_fav_bevel")->setVisible( npVisible && !visible);
- getChildView("bg_icon_no_nav_bevel")->setVisible( !npVisible && visible);
-
- fb->setVisible(visible);
-}
diff --git a/indra/newview/llnavigationbar.h b/indra/newview/llnavigationbar.h
index 3c9f8a762d..e4ce9e3998 100644
--- a/indra/newview/llnavigationbar.h
+++ b/indra/newview/llnavigationbar.h
@@ -98,9 +98,6 @@ public:
void handleLoginComplete();
void clearHistoryCache();
- void showNavigationPanel(BOOL visible);
- void showFavoritesPanel(BOOL visible);
-
int getDefNavBarHeight();
int getDefFavBarHeight();
@@ -121,7 +118,6 @@ private:
void onHomeButtonClicked();
void onLocationSelection();
void onLocationPrearrange(const LLSD& data);
- void onSearchCommit();
void onTeleportFinished(const LLVector3d& global_agent_pos);
void onTeleportFailed();
void onRegionNameResponse(
@@ -131,8 +127,6 @@ private:
U64 region_handle, const std::string& url,
const LLUUID& snapshot_id, bool teleport);
- void fillSearchComboBox();
-
static void destroyClass()
{
if (LLNavigationBar::instanceExists())
@@ -145,7 +139,6 @@ private:
LLPullButton* mBtnBack;
LLPullButton* mBtnForward;
LLButton* mBtnHome;
- LLSearchComboBox* mSearchComboBox;
LLLocationInputCtrl* mCmbLocation;
LLRect mDefaultNbRect;
LLRect mDefaultFpRect;
diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp
index 180695e40b..a7303ad035 100644
--- a/indra/newview/llnearbychat.cpp
+++ b/indra/newview/llnearbychat.cpp
@@ -32,8 +32,9 @@
#include "llrootview.h"
//#include "llchatitemscontainerctrl.h"
#include "lliconctrl.h"
-#include "llsidetray.h"
+#include "llfloatersidepanelcontainer.h"
#include "llfocusmgr.h"
+#include "lllogchat.h"
#include "llresizebar.h"
#include "llresizehandle.h"
#include "llmenugl.h"
@@ -50,21 +51,18 @@
#include "lldraghandle.h"
-#include "llbottomtray.h"
#include "llnearbychatbar.h"
#include "llfloaterreg.h"
#include "lltrans.h"
static const S32 RESIZE_BAR_THICKNESS = 3;
-LLNearbyChat::LLNearbyChat(const LLSD& key)
- : LLDockableFloater(NULL, false, false, key)
- ,mChatHistory(NULL)
-{
-
-}
-LLNearbyChat::~LLNearbyChat()
+static LLRegisterPanelClassWrapper<LLNearbyChat> t_panel_nearby_chat("panel_nearby_chat");
+
+LLNearbyChat::LLNearbyChat(const LLNearbyChat::Params& p)
+: LLPanel(p),
+ mChatHistory(NULL)
{
}
@@ -86,54 +84,12 @@ BOOL LLNearbyChat::postBuild()
mChatHistory = getChild<LLChatHistory>("chat_history");
- if(!LLDockableFloater::postBuild())
+ if(!LLPanel::postBuild())
return false;
-
- if (getDockControl() == NULL)
- {
- setDockControl(new LLDockControl(
- LLBottomTray::getInstance()->getNearbyChatBar(), this,
- getDockTongue(), LLDockControl::TOP, boost::bind(&LLNearbyChat::getAllowedRect, this, _1)));
- }
-
- //fix for EXT-4621
- //chrome="true" prevents floater from stilling capture
- setIsChrome(true);
- //chrome="true" hides floater caption
- if (mDragHandle)
- mDragHandle->setTitleVisible(TRUE);
-
+
return true;
}
-
-void LLNearbyChat::applySavedVariables()
-{
- if (mRectControl.size() > 1)
- {
- const LLRect& rect = LLFloater::getControlGroup()->getRect(mRectControl);
- if(!rect.isEmpty() && rect.isValid())
- {
- reshape(rect.getWidth(), rect.getHeight());
- setRect(rect);
- }
- }
-
-
- if(!LLFloater::getControlGroup()->controlExists(mDocStateControl))
- {
- setDocked(true);
- }
- else
- {
- if (mDocStateControl.size() > 1)
- {
- bool dockState = LLFloater::getControlGroup()->getBOOL(mDocStateControl);
- setDocked(dockState);
- }
- }
-}
-
std::string appendTime()
{
time_t utc_time;
@@ -203,7 +159,7 @@ void LLNearbyChat::onNearbySpeakers()
{
LLSD param;
param["people_panel_tab_name"] = "nearby_panel";
- LLSideTray::getInstance()->showPanel("panel_people",param);
+ LLFloaterSidePanelContainer::showPanel("people", "panel_people", param);
}
@@ -218,30 +174,26 @@ bool LLNearbyChat::onNearbyChatCheckContextMenuItem(const LLSD& userdata)
return false;
}
-void LLNearbyChat::setVisible(BOOL visible)
+void LLNearbyChat::removeScreenChat()
{
- if(visible)
+ LLNotificationsUI::LLScreenChannelBase* chat_channel = LLNotificationsUI::LLChannelManager::getInstance()->findChannelByID(LLUUID(gSavedSettings.getString("NearByChatChannelUUID")));
+ if(chat_channel)
{
- LLNotificationsUI::LLScreenChannelBase* chat_channel = LLNotificationsUI::LLChannelManager::getInstance()->findChannelByID(LLUUID(gSavedSettings.getString("NearByChatChannelUUID")));
- if(chat_channel)
- {
- chat_channel->removeToastsFromChannel();
- }
+ chat_channel->removeToastsFromChannel();
}
-
- LLDockableFloater::setVisible(visible);
}
-void LLNearbyChat::onOpen(const LLSD& key )
+void LLNearbyChat::setVisible(BOOL visible)
{
- LLDockableFloater::onOpen(key);
-}
+ if(visible)
+ {
+ removeScreenChat();
+ }
-void LLNearbyChat::setRect (const LLRect &rect)
-{
- LLDockableFloater::setRect(rect);
+ LLPanel::setVisible(visible);
}
+
void LLNearbyChat::getAllowedRect(LLRect& rect)
{
rect = gViewerWindow->getWorldViewRectScaled();
@@ -250,16 +202,21 @@ void LLNearbyChat::getAllowedRect(LLRect& rect)
void LLNearbyChat::updateChatHistoryStyle()
{
mChatHistory->clear();
+
+ LLSD do_not_log;
+ do_not_log["do_not_log"] = true;
for(std::vector<LLChat>::iterator it = mMessageArchive.begin();it!=mMessageArchive.end();++it)
{
- addMessage(*it,false);
+ // Update the messages without re-writing them to a log file.
+ addMessage(*it,false, do_not_log);
}
}
//static
void LLNearbyChat::processChatHistoryStyleUpdate(const LLSD& newvalue)
{
- LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD());
+ LLFloater* chat_bar = LLFloaterReg::getInstance("chat_bar");
+ LLNearbyChat* nearby_chat = chat_bar->findChild<LLNearbyChat>("nearby_chat");
if(nearby_chat)
nearby_chat->updateChatHistoryStyle();
}
@@ -335,7 +292,8 @@ void LLNearbyChat::loadHistory()
//static
LLNearbyChat* LLNearbyChat::getInstance()
{
- return LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD());
+ LLFloater* chat_bar = LLFloaterReg::getInstance("chat_bar");
+ return chat_bar->findChild<LLNearbyChat>("nearby_chat");
}
////////////////////////////////////////////////////////////////////////////////
@@ -363,5 +321,18 @@ BOOL LLNearbyChat::handleMouseDown(S32 x, S32 y, MASK mask)
if(mChatHistory)
mChatHistory->setFocus(TRUE);
- return LLDockableFloater::handleMouseDown(x, y, mask);
+ return LLPanel::handleMouseDown(x, y, mask);
+}
+
+void LLNearbyChat::draw()
+{
+ // *HACK: Update transparency type depending on whether our children have focus.
+ // This is needed because this floater is chrome and thus cannot accept focus, so
+ // the transparency type setting code from LLFloater::setFocus() isn't reached.
+ if (getTransparencyType() != TT_DEFAULT)
+ {
+ setTransparencyType(hasFocus() ? TT_ACTIVE : TT_INACTIVE);
+ }
+
+ LLPanel::draw();
}
diff --git a/indra/newview/llnearbychat.h b/indra/newview/llnearbychat.h
index 1e62910385..7c5975cbc5 100644
--- a/indra/newview/llnearbychat.h
+++ b/indra/newview/llnearbychat.h
@@ -1,4 +1,4 @@
-/**
+ /**
* @file llnearbychat.h
* @brief nearby chat history scrolling panel implementation
*
@@ -27,18 +27,17 @@
#ifndef LL_LLNEARBYCHAT_H_
#define LL_LLNEARBYCHAT_H_
-#include "lldockablefloater.h"
#include "llscrollbar.h"
#include "llviewerchat.h"
+#include "llfloater.h"
class LLResizeBar;
class LLChatHistory;
-class LLNearbyChat: public LLDockableFloater
+class LLNearbyChat: public LLPanel
{
public:
- LLNearbyChat(const LLSD& key);
- ~LLNearbyChat();
+ LLNearbyChat(const Params& p = LLPanel::getDefaultParams());
BOOL postBuild ();
@@ -48,17 +47,14 @@ public:
bool onNearbyChatCheckContextMenuItem(const LLSD& userdata);
virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask);
+ virtual void draw();
// focus overrides
/*virtual*/ void onFocusLost();
/*virtual*/ void onFocusReceived();
- /*virtual*/ void onOpen (const LLSD& key);
-
/*virtual*/ void setVisible(BOOL visible);
-
- virtual void setRect (const LLRect &rect);
-
+
virtual void updateChatHistoryStyle();
static void processChatHistoryStyleUpdate(const LLSD& newvalue);
@@ -66,14 +62,14 @@ public:
void loadHistory();
static LLNearbyChat* getInstance();
+ void removeScreenChat();
private:
- virtual void applySavedVariables();
void getAllowedRect (LLRect& rect);
void onNearbySpeakers ();
-
+
private:
LLHandle<LLView> mPopupMenuHandle;
diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp
index 932ad75f29..b4224e30e6 100644
--- a/indra/newview/llnearbychatbar.cpp
+++ b/indra/newview/llnearbychatbar.cpp
@@ -34,7 +34,6 @@
#include "llfirstuse.h"
#include "llnearbychatbar.h"
-#include "llbottomtray.h"
#include "llagent.h"
#include "llgesturemgr.h"
#include "llmultigesture.h"
@@ -47,14 +46,21 @@
#include "llwindow.h"
#include "llviewerwindow.h"
#include "llrootview.h"
+#include "llviewerchat.h"
+#include "llnearbychat.h"
+#include "lltranslate.h"
+
+#include "llresizehandle.h"
S32 LLNearbyChatBar::sLastSpecialChatChannel = 0;
+const S32 EXPANDED_HEIGHT = 300;
+const S32 COLLAPSED_HEIGHT = 60;
+const S32 EXPANDED_MIN_HEIGHT = 150;
+
// legacy callback glue
void send_chat_from_viewer(const std::string& utf8_out_text, EChatType type, S32 channel);
-static LLDefaultChildRegistry::Register<LLGestureComboList> r("gesture_combo_list");
-
struct LLChatTypeTrigger {
std::string name;
EChatType type;
@@ -65,378 +71,114 @@ static LLChatTypeTrigger sChatTypeTriggers[] = {
{ "/shout" , CHAT_TYPE_SHOUT}
};
-//ext-7367
-//Problem: gesture list control (actually LLScrollListCtrl) didn't actually process mouse wheel message.
-// introduce new gesture list subclass to "eat" mouse wheel messages (and probably some other messages)
-class LLGestureScrollListCtrl: public LLScrollListCtrl
-{
-protected:
- friend class LLUICtrlFactory;
- LLGestureScrollListCtrl(const LLScrollListCtrl::Params& params)
- :LLScrollListCtrl(params)
- {
- }
-public:
- BOOL handleScrollWheel(S32 x, S32 y, S32 clicks)
- {
- LLScrollListCtrl::handleScrollWheel( x, y, clicks );
- return TRUE;
- }
- //See EXT-6598
- //Mouse hover over separator will result in not processing tooltip message
- //So eat this message
- BOOL handleToolTip(S32 x, S32 y, MASK mask)
- {
- LLScrollListCtrl::handleToolTip( x, y, mask );
- return TRUE;
- }
-};
-
-LLGestureComboList::Params::Params()
-: combo_button("combo_button"),
- combo_list("combo_list")
+LLNearbyChatBar::LLNearbyChatBar(const LLSD& key)
+: LLFloater(key),
+ mChatBox(NULL),
+ mNearbyChat(NULL),
+ mOutputMonitor(NULL),
+ mSpeakerMgr(NULL),
+ mExpandedHeight(COLLAPSED_HEIGHT + EXPANDED_HEIGHT)
{
+ mSpeakerMgr = LLLocalSpeakerMgr::getInstance();
}
-LLGestureComboList::LLGestureComboList(const LLGestureComboList::Params& p)
-: LLUICtrl(p)
- , mLabel(p.label)
- , mViewAllItemIndex(0)
- , mGetMoreItemIndex(0)
-{
- LLBottomtrayButton::Params button_params = p.combo_button;
- button_params.follows.flags(FOLLOWS_LEFT|FOLLOWS_BOTTOM|FOLLOWS_RIGHT);
-
- mButton = LLUICtrlFactory::create<LLBottomtrayButton>(button_params);
- mButton->reshape(getRect().getWidth(),getRect().getHeight());
- mButton->setCommitCallback(boost::bind(&LLGestureComboList::onButtonCommit, this));
-
- addChild(mButton);
-
- LLGestureScrollListCtrl::Params params(p.combo_list);
-
- params.name("GestureComboList");
- params.commit_callback.function(boost::bind(&LLGestureComboList::onItemSelected, this, _2));
- params.visible(false);
- params.commit_on_keyboard_movement(false);
-
- mList = LLUICtrlFactory::create<LLGestureScrollListCtrl>(params);
- addChild(mList);
-
- //****************************Gesture Part********************************/
-
- setCommitCallback(boost::bind(&LLGestureComboList::onCommitGesture, this));
-
- // now register us as observer since we have a place to put the results
- LLGestureMgr::instance().addObserver(this);
-
- // refresh list from current active gestures
- refreshGestures();
-
- setFocusLostCallback(boost::bind(&LLGestureComboList::hideList, this));
-}
-
-BOOL LLGestureComboList::handleKeyHere(KEY key, MASK mask)
+//virtual
+BOOL LLNearbyChatBar::postBuild()
{
- BOOL handled = FALSE;
-
- if (key == KEY_ESCAPE && mask == MASK_NONE )
- {
- hideList();
- handled = TRUE;
- }
- else
- {
- handled = mList->handleKeyHere(key, mask);
- }
-
- return handled;
-}
+ mChatBox = getChild<LLLineEditor>("chat_box");
-void LLGestureComboList::showList()
-{
- LLRect rect = mList->getRect();
- LLRect button_rect = mButton->getRect();
-
- // Calculating amount of space between the navigation bar and gestures combo
- LLNavigationBar* nb = LLNavigationBar::getInstance();
+ mChatBox->setCommitCallback(boost::bind(&LLNearbyChatBar::onChatBoxCommit, this));
+ mChatBox->setKeystrokeCallback(&onChatBoxKeystroke, this);
+ mChatBox->setFocusLostCallback(boost::bind(&onChatBoxFocusLost, _1, this));
+ mChatBox->setFocusReceivedCallback(boost::bind(&LLNearbyChatBar::onChatBoxFocusReceived, this));
- S32 x, nb_bottom;
- nb->localPointToOtherView(0, 0, &x, &nb_bottom, this);
+ mChatBox->setIgnoreArrowKeys( FALSE );
+ mChatBox->setCommitOnFocusLost( FALSE );
+ mChatBox->setRevertOnEsc( FALSE );
+ mChatBox->setIgnoreTab(TRUE);
+ mChatBox->setPassDelete(TRUE);
+ mChatBox->setReplaceNewlinesWithSpaces(FALSE);
+ mChatBox->setEnableLineHistory(TRUE);
+ mChatBox->setFont(LLViewerChat::getChatFont());
- S32 max_height = nb_bottom - button_rect.mTop;
- mList->calcColumnWidths();
- rect.setOriginAndSize(button_rect.mLeft, button_rect.mTop, llmax(mList->getMaxContentWidth(),mButton->getRect().getWidth()), max_height);
+ mNearbyChat = getChildView("nearby_chat");
- mList->setRect(rect);
- mList->fitContents( llmax(mList->getMaxContentWidth(),mButton->getRect().getWidth()), max_height);
+ LLUICtrl* show_btn = getChild<LLUICtrl>("show_nearby_chat");
+ show_btn->setCommitCallback(boost::bind(&LLNearbyChatBar::onToggleNearbyChatPanel, this));
- gFocusMgr.setKeyboardFocus(this);
+ mOutputMonitor = getChild<LLOutputMonitorCtrl>("chat_zone_indicator");
+ mOutputMonitor->setVisible(FALSE);
- // Show the list and push the button down
- mButton->setToggleState(TRUE);
- mList->setVisible(TRUE);
- LLUI::addPopup(mList);
-}
+ gSavedSettings.declareBOOL("nearbychat_history_visibility", mNearbyChat->getVisible(), "Visibility state of nearby chat history", TRUE);
-void LLGestureComboList::onButtonCommit()
-{
- if (!mList->getVisible())
- {
- // highlight the last selected item from the original selection before potentially selecting a new item
- // as visual cue to original value of combo box
- LLScrollListItem* last_selected_item = mList->getLastSelectedItem();
- if (last_selected_item)
- {
- mList->mouseOverHighlightNthItem(mList->getItemIndex(last_selected_item));
- }
+ mNearbyChat->setVisible(gSavedSettings.getBOOL("nearbychat_history_visibility"));
- if (mList->getItemCount() != 0)
- {
- showList();
- }
- }
- else
- {
- hideList();
- }
-}
+ // Register for font change notifications
+ LLViewerChat::setFontChangedCallback(boost::bind(&LLNearbyChatBar::onChatFontChange, this, _1));
-void LLGestureComboList::hideList()
-{
- if (mList->getVisible())
- {
- mButton->setToggleState(FALSE);
- mList->setVisible(FALSE);
- mList->mouseOverHighlightNthItem(-1);
- LLUI::removePopup(mList);
- gFocusMgr.setKeyboardFocus(NULL);
- }
-}
+ enableResizeCtrls(true, true, false);
-S32 LLGestureComboList::getCurrentIndex() const
-{
- LLScrollListItem* item = mList->getFirstSelected();
- if( item )
- {
- return mList->getItemIndex( item );
- }
- return -1;
+ return TRUE;
}
-void LLGestureComboList::onItemSelected(const LLSD& data)
+// virtual
+void LLNearbyChatBar::onOpen(const LLSD& key)
{
- const std::string name = mList->getSelectedItemLabel();
-
- S32 cur_id = getCurrentIndex();
- mLastSelectedIndex = cur_id;
- if (cur_id != mList->getItemCount()-1 && cur_id != -1)
- {
- mButton->setLabel(name);
- }
-
- // hiding the list reasserts the old value stored in the text editor/dropdown button
- hideList();
-
- // commit does the reverse, asserting the value in the list
- onCommit();
+ showTranslationCheckbox(LLTranslate::isTranslationConfigured());
}
-void LLGestureComboList::sortByName(bool ascending)
+bool LLNearbyChatBar::applyRectControl()
{
- mList->sortOnce(0, ascending);
-}
+ bool rect_controlled = LLFloater::applyRectControl();
-LLSD LLGestureComboList::getValue() const
-{
- LLScrollListItem* item = mList->getFirstSelected();
- if( item )
+ if (!mNearbyChat->getVisible())
{
- return item->getValue();
+ reshape(getRect().getWidth(), getMinHeight());
+ enableResizeCtrls(true, true, false);
}
else
{
- return LLSD();
+ enableResizeCtrls(true);
+ setResizeLimits(getMinWidth(), EXPANDED_MIN_HEIGHT);
}
-}
-
-void LLGestureComboList::refreshGestures()
-{
- //store current selection so we can maintain it
- LLSD cur_gesture = getValue();
- mList->selectFirstItem();
- mList->clearRows();
- mGestures.clear();
-
- LLGestureMgr::item_map_t::const_iterator it;
- const LLGestureMgr::item_map_t& active_gestures = LLGestureMgr::instance().getActiveGestures();
- LLSD::Integer idx(0);
- for (it = active_gestures.begin(); it != active_gestures.end(); ++it)
- {
- LLMultiGesture* gesture = (*it).second;
- if (gesture)
- {
- mList->addSimpleElement(gesture->mName, ADD_BOTTOM, LLSD(idx));
- mGestures.push_back(gesture);
- idx++;
- }
- }
-
- sortByName();
-
- // store indices for Get More and View All items (idx is the index followed by the last added Gesture)
- mGetMoreItemIndex = idx;
- mViewAllItemIndex = idx + 1;
-
- // add Get More and View All items at the bottom
- mList->addSimpleElement(LLTrans::getString("GetMoreGestures"), ADD_BOTTOM, LLSD(mGetMoreItemIndex));
- mList->addSimpleElement(LLTrans::getString("ViewAllGestures"), ADD_BOTTOM, LLSD(mViewAllItemIndex));
-
- // Insert label after sorting, at top, with separator below it
- mList->addSeparator(ADD_TOP);
- mList->addSimpleElement(mLabel, ADD_TOP);
-
- if (cur_gesture.isDefined())
- {
- mList->selectByValue(cur_gesture);
-
- }
- else
- {
- mList->selectFirstItem();
- }
-
- LLCtrlListInterface* gestures = getListInterface();
- LLMultiGesture* gesture = NULL;
-
- if (gestures)
- {
- S32 sel_index = gestures->getFirstSelectedIndex();
- if (sel_index != 0)
- {
- S32 index = gestures->getSelectedValue().asInteger();
- if (index<0 || index >= (S32)mGestures.size())
- {
- llwarns << "out of range gesture access" << llendl;
- }
- else
- {
- gesture = mGestures.at(index);
- }
- }
- }
-
- if(gesture && LLGestureMgr::instance().isGesturePlaying(gesture))
- {
- return;
- }
-
- mButton->setLabel(mLabel);
+ return rect_controlled;
}
-void LLGestureComboList::onCommitGesture()
+void LLNearbyChatBar::onChatFontChange(LLFontGL* fontp)
{
- LLCtrlListInterface* gestures = getListInterface();
- if (gestures)
+ // Update things with the new font whohoo
+ if (mChatBox)
{
- S32 sel_index = gestures->getFirstSelectedIndex();
- if (sel_index == 0)
- {
- return;
- }
-
- S32 index = gestures->getSelectedValue().asInteger();
-
- if (mViewAllItemIndex == index)
- {
- // The same behavior as Ctrl+G. EXT-823
- LLFloaterReg::toggleInstance("gestures");
- gestures->selectFirstItem();
- return;
- }
-
- if (mGetMoreItemIndex == index)
- {
- LLWeb::loadURLExternal(gSavedSettings.getString("GesturesMarketplaceURL"));
- return;
- }
-
- if (index<0 || index >= (S32)mGestures.size())
- {
- llwarns << "out of range gesture index" << llendl;
- }
- else
- {
- LLMultiGesture* gesture = mGestures.at(index);
- if(gesture)
- {
- LLGestureMgr::instance().playGesture(gesture);
- if(!gesture->mReplaceText.empty())
- {
- LLNearbyChatBar::sendChatFromViewer(gesture->mReplaceText, CHAT_TYPE_NORMAL, FALSE);
- }
- }
- }
+ mChatBox->setFont(fontp);
}
}
-LLGestureComboList::~LLGestureComboList()
-{
- LLGestureMgr::instance().removeObserver(this);
-}
-
-LLCtrlListInterface* LLGestureComboList::getListInterface()
-{
- return mList;
-}
-
-LLNearbyChatBar::LLNearbyChatBar()
-: mChatBox(NULL)
+//static
+LLNearbyChatBar* LLNearbyChatBar::getInstance()
{
- mSpeakerMgr = LLLocalSpeakerMgr::getInstance();
+ return LLFloaterReg::getTypedInstance<LLNearbyChatBar>("chat_bar");
}
-//virtual
-BOOL LLNearbyChatBar::postBuild()
+void LLNearbyChatBar::showHistory()
{
- mChatBox = getChild<LLLineEditor>("chat_box");
+ openFloater();
- mChatBox->setCommitCallback(boost::bind(&LLNearbyChatBar::onChatBoxCommit, this));
- mChatBox->setKeystrokeCallback(&onChatBoxKeystroke, this);
- mChatBox->setFocusLostCallback(boost::bind(&onChatBoxFocusLost, _1, this));
- mChatBox->setFocusReceivedCallback(boost::bind(&LLNearbyChatBar::onChatBoxFocusReceived, this));
-
- mChatBox->setIgnoreArrowKeys( FALSE );
- mChatBox->setCommitOnFocusLost( FALSE );
- mChatBox->setRevertOnEsc( FALSE );
- mChatBox->setIgnoreTab(TRUE);
- mChatBox->setPassDelete(TRUE);
- mChatBox->setReplaceNewlinesWithSpaces(FALSE);
- mChatBox->setEnableLineHistory(TRUE);
-
- mOutputMonitor = getChild<LLOutputMonitorCtrl>("chat_zone_indicator");
- mOutputMonitor->setVisible(FALSE);
-
- return TRUE;
-}
-
-//static
-LLNearbyChatBar* LLNearbyChatBar::getInstance()
-{
- return LLBottomTray::getInstance() ? LLBottomTray::getInstance()->getNearbyChatBar() : NULL;
+ if (!getChildView("nearby_chat")->getVisible())
+ {
+ onToggleNearbyChatPanel();
+ }
}
-//static
-bool LLNearbyChatBar::instanceExists()
+void LLNearbyChatBar::showTranslationCheckbox(BOOL show)
{
- return LLBottomTray::instanceExists() && LLBottomTray::getInstance()->getNearbyChatBar() != NULL;
+ getChild<LLUICtrl>("translate_chat_checkbox_lp")->setVisible(show);
}
void LLNearbyChatBar::draw()
{
displaySpeakingIndicator();
- LLPanel::draw();
+ LLFloater::draw();
}
std::string LLNearbyChatBar::getCurrentChat()
@@ -650,6 +392,46 @@ void LLNearbyChatBar::sendChat( EChatType type )
}
}
+
+void LLNearbyChatBar::onToggleNearbyChatPanel()
+{
+ LLView* nearby_chat = getChildView("nearby_chat");
+
+ if (nearby_chat->getVisible())
+ {
+ if (!isMinimized())
+ {
+ mExpandedHeight = getRect().getHeight();
+ }
+ setResizeLimits(getMinWidth(), COLLAPSED_HEIGHT);
+ nearby_chat->setVisible(FALSE);
+ reshape(getRect().getWidth(), COLLAPSED_HEIGHT);
+ enableResizeCtrls(true, true, false);
+ storeRectControl();
+ }
+ else
+ {
+ nearby_chat->setVisible(TRUE);
+ setResizeLimits(getMinWidth(), EXPANDED_MIN_HEIGHT);
+ reshape(getRect().getWidth(), mExpandedHeight);
+ enableResizeCtrls(true);
+ storeRectControl();
+ }
+
+ gSavedSettings.setBOOL("nearbychat_history_visibility", mNearbyChat->getVisible());
+}
+
+void LLNearbyChatBar::setMinimized(BOOL b)
+{
+ LLNearbyChat* nearby_chat = getChild<LLNearbyChat>("nearby_chat");
+ // when unminimizing with nearby chat visible, go ahead and kill off screen chats
+ if (!b && nearby_chat->getVisible())
+ {
+ nearby_chat->removeScreenChat();
+ }
+ LLFloater::setMinimized(b);
+}
+
void LLNearbyChatBar::onChatBoxCommit()
{
if (mChatBox->getText().length() > 0)
@@ -747,17 +529,13 @@ void LLNearbyChatBar::sendChatFromViewer(const LLWString &wtext, EChatType type,
// static
void LLNearbyChatBar::startChat(const char* line)
{
- LLBottomTray *bt = LLBottomTray::getInstance();
-
- if (!bt)
- return;
-
- LLNearbyChatBar* cb = bt->getNearbyChatBar();
+ LLNearbyChatBar* cb = LLNearbyChatBar::getInstance();
if (!cb )
return;
- bt->setVisible(TRUE);
+ cb->setVisible(TRUE);
+ cb->setFocus(TRUE);
cb->mChatBox->setFocus(TRUE);
if (line)
@@ -773,12 +551,7 @@ void LLNearbyChatBar::startChat(const char* line)
// static
void LLNearbyChatBar::stopChat()
{
- LLBottomTray *bt = LLBottomTray::getInstance();
-
- if (!bt)
- return;
-
- LLNearbyChatBar* cb = bt->getNearbyChatBar();
+ LLNearbyChatBar* cb = LLNearbyChatBar::getInstance();
if (!cb)
return;
@@ -856,11 +629,11 @@ void send_chat_from_viewer(const std::string& utf8_out_text, EChatType type, S32
LLViewerStats::getInstance()->incStat(LLViewerStats::ST_CHAT_COUNT);
}
-class LLChatHandler : public LLCommandHandler
+class LLChatCommandHandler : public LLCommandHandler
{
public:
// not allowed from outside the app
- LLChatHandler() : LLCommandHandler("chat", UNTRUSTED_BLOCK) { }
+ LLChatCommandHandler() : LLCommandHandler("chat", UNTRUSTED_BLOCK) { }
// Your code here
bool handle(const LLSD& tokens, const LLSD& query_map,
@@ -876,7 +649,7 @@ public:
{
S32 channel = tokens[0].asInteger();
// VWR-19499 Restrict function to chat channels greater than 0.
- if ((channel > 0) && (channel < 2147483647))
+ if ((channel > 0) && (channel < CHAT_CHANNEL_DEBUG))
{
retval = true;
// Send unescaped message, see EXT-6353.
@@ -894,6 +667,6 @@ public:
};
// Creating the object registers with the dispatcher.
-LLChatHandler gChatHandler;
+LLChatCommandHandler gChatHandler;
diff --git a/indra/newview/llnearbychatbar.h b/indra/newview/llnearbychatbar.h
index cc905736fd..8547cf0bce 100644
--- a/indra/newview/llnearbychatbar.h
+++ b/indra/newview/llnearbychatbar.h
@@ -27,79 +27,26 @@
#ifndef LL_LLNEARBYCHATBAR_H
#define LL_LLNEARBYCHATBAR_H
-#include "llpanel.h"
+#include "llfloater.h"
#include "llcombobox.h"
#include "llgesturemgr.h"
#include "llchat.h"
#include "llvoiceclient.h"
#include "lloutputmonitorctrl.h"
#include "llspeakers.h"
-#include "llbottomtray.h"
-
-class LLGestureComboList
- : public LLGestureManagerObserver
- , public LLUICtrl
-{
-public:
- struct Params : public LLInitParam::Block<Params, LLUICtrl::Params>
- {
- Optional<LLBottomtrayButton::Params> combo_button;
- Optional<LLScrollListCtrl::Params> combo_list;
-
- Params();
- };
-
-protected:
-
- friend class LLUICtrlFactory;
- LLGestureComboList(const Params&);
- std::vector<LLMultiGesture*> mGestures;
- std::string mLabel;
- LLSD::Integer mViewAllItemIndex;
- LLSD::Integer mGetMoreItemIndex;
-
-public:
-
- ~LLGestureComboList();
-
- LLCtrlListInterface* getListInterface();
- virtual void showList();
- virtual void hideList();
- virtual BOOL handleKeyHere(KEY key, MASK mask);
-
- S32 getCurrentIndex() const;
- void onItemSelected(const LLSD& data);
- void sortByName(bool ascending = true);
- void refreshGestures();
- void onCommitGesture();
- void onButtonCommit();
- virtual LLSD getValue() const;
-
- // LLGestureManagerObserver trigger
- virtual void changed() { refreshGestures(); }
-
-private:
-
- LLButton* mButton;
- LLScrollListCtrl* mList;
- S32 mLastSelectedIndex;
-};
-
-class LLNearbyChatBar
-: public LLPanel
+class LLNearbyChatBar : public LLFloater
{
public:
// constructor for inline chat-bars (e.g. hosted in chat history window)
- LLNearbyChatBar();
+ LLNearbyChatBar(const LLSD& key);
~LLNearbyChatBar() {}
virtual BOOL postBuild();
+ /*virtual*/ void onOpen(const LLSD& key);
static LLNearbyChatBar* getInstance();
- static bool instanceExists();
-
LLLineEditor* getChatBox() { return mChatBox; }
virtual void draw();
@@ -113,6 +60,10 @@ public:
static void sendChatFromViewer(const std::string &utf8text, EChatType type, BOOL animate);
static void sendChatFromViewer(const LLWString &wtext, EChatType type, BOOL animate);
+ void showHistory();
+ void showTranslationCheckbox(BOOL show);
+ /*virtual*/void setMinimized(BOOL b);
+
protected:
static BOOL matchChatTypeTrigger(const std::string& in_str, std::string* out_str);
static void onChatBoxKeystroke(LLLineEditor* caller, void* userdata);
@@ -121,6 +72,11 @@ protected:
void sendChat( EChatType type );
void onChatBoxCommit();
+ void onChatFontChange(LLFontGL* fontp);
+
+ /* virtual */ bool applyRectControl();
+
+ void onToggleNearbyChatPanel();
static LLWString stripChannelNumber(const LLWString &mesg, S32* channel);
EChatType processChatTypeTriggers(EChatType type, std::string &str);
@@ -130,9 +86,12 @@ protected:
// Which non-zero channel did we last chat on?
static S32 sLastSpecialChatChannel;
- LLLineEditor* mChatBox;
- LLOutputMonitorCtrl* mOutputMonitor;
- LLLocalSpeakerMgr* mSpeakerMgr;
+ LLLineEditor* mChatBox;
+ LLView* mNearbyChat;
+ LLOutputMonitorCtrl* mOutputMonitor;
+ LLLocalSpeakerMgr* mSpeakerMgr;
+
+ S32 mExpandedHeight;
};
#endif
diff --git a/indra/newview/llnearbychatbarlistener.cpp b/indra/newview/llnearbychatbarlistener.cpp
new file mode 100644
index 0000000000..a63e1fb76e
--- /dev/null
+++ b/indra/newview/llnearbychatbarlistener.cpp
@@ -0,0 +1,100 @@
+/**
+ * @file llnearbychatbarlistener.cpp
+ * @author Dave Simmons
+ * @date 2011-03-15
+ * @brief Implementation for LLNearbyChatBarListener.
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llnearbychatbarlistener.h"
+#include "llnearbychatbar.h"
+
+#include "llagent.h"
+#include "llchat.h"
+
+
+
+LLNearbyChatBarListener::LLNearbyChatBarListener(LLNearbyChatBar & chatbar)
+ : LLEventAPI("LLChatBar",
+ "LLChatBar listener to (e.g.) sendChat, etc."),
+ mChatbar(chatbar)
+{
+ add("sendChat",
+ "Send chat to the simulator:\n"
+ "[\"message\"] chat message text [required]\n"
+ "[\"channel\"] chat channel number [default = 0]\n"
+ "[\"type\"] chat type \"whisper\", \"normal\", \"shout\" [default = \"normal\"]",
+ &LLNearbyChatBarListener::sendChat);
+}
+
+
+// "sendChat" command
+void LLNearbyChatBarListener::sendChat(LLSD const & chat_data) const
+{
+ // Extract the data
+ std::string chat_text = chat_data["message"].asString();
+
+ S32 channel = 0;
+ if (chat_data.has("channel"))
+ {
+ channel = chat_data["channel"].asInteger();
+ if (channel < 0 || channel >= CHAT_CHANNEL_DEBUG)
+ { // Use 0 up to (but not including) CHAT_CHANNEL_DEBUG
+ channel = 0;
+ }
+ }
+
+ EChatType type_o_chat = CHAT_TYPE_NORMAL;
+ if (chat_data.has("type"))
+ {
+ std::string type_string = chat_data["type"].asString();
+ if (type_string == "whisper")
+ {
+ type_o_chat = CHAT_TYPE_WHISPER;
+ }
+ else if (type_string == "shout")
+ {
+ type_o_chat = CHAT_TYPE_SHOUT;
+ }
+ }
+
+ // Have to prepend /42 style channel numbers
+ std::string chat_to_send;
+ if (channel == 0)
+ {
+ chat_to_send = chat_text;
+ }
+ else
+ {
+ chat_to_send += "/";
+ chat_to_send += chat_data["channel"].asString();
+ chat_to_send += " ";
+ chat_to_send += chat_text;
+ }
+
+ // Send it as if it was typed in
+ mChatbar.sendChatFromViewer(chat_to_send, type_o_chat, (BOOL)(channel == 0));
+}
+
diff --git a/indra/newview/llnearbychatbarlistener.h b/indra/newview/llnearbychatbarlistener.h
new file mode 100644
index 0000000000..9af9bc1f7b
--- /dev/null
+++ b/indra/newview/llnearbychatbarlistener.h
@@ -0,0 +1,50 @@
+/**
+ * @file llnearbychatbarlistener.h
+ * @author Dave Simmons
+ * @date 2011-03-15
+ * @brief Class definition for LLNearbyChatBarListener.
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+
+#ifndef LL_LLNEARBYCHATBARLISTENER_H
+#define LL_LLNEARBYCHATBARLISTENER_H
+
+#include "lleventapi.h"
+
+class LLSD;
+class LLNearbyChatBar;
+
+class LLNearbyChatBarListener : public LLEventAPI
+{
+public:
+ LLNearbyChatBarListener(LLNearbyChatBar & chatbar);
+
+private:
+ void sendChat(LLSD const & chat_data) const;
+
+ LLNearbyChatBar & mChatbar;
+};
+
+#endif // LL_LLNEARBYCHATBARLISTENER_H
+
diff --git a/indra/newview/llnearbychathandler.cpp b/indra/newview/llnearbychathandler.cpp
index d2ad78f140..600fd395fb 100644
--- a/indra/newview/llnearbychathandler.cpp
+++ b/indra/newview/llnearbychathandler.cpp
@@ -29,7 +29,6 @@
#include "llagentdata.h" // for gAgentID
#include "llnearbychathandler.h"
-#include "llbottomtray.h"
#include "llchatitemscontainerctrl.h"
#include "llfirstuse.h"
#include "llfloaterscriptdebug.h"
@@ -41,6 +40,9 @@
#include "llfloaterreg.h"//for LLFloaterReg::getTypedInstance
#include "llviewerwindow.h"//for screen channel position
+#include "llnearbychatbar.h"
+#include "llrootview.h"
+#include "lllayoutstack.h"
//add LLNearbyChatHandler to LLNotificationsUI namespace
using namespace LLNotificationsUI;
@@ -61,7 +63,8 @@ public:
typedef std::vector<LLHandle<LLToast> > toast_vec_t;
typedef std::list<LLHandle<LLToast> > toast_list_t;
- LLNearbyChatScreenChannel(const LLUUID& id):LLScreenChannelBase(id)
+ LLNearbyChatScreenChannel(const Params& p)
+ : LLScreenChannelBase(p)
{
mStopProcessing = false;
@@ -80,7 +83,6 @@ public:
void addNotification (LLSD& notification);
void arrangeToasts ();
- void showToastsBottom ();
typedef boost::function<LLToastPanelBase* (void )> create_toast_panel_callback_t;
void setCreatePanelCallback(create_toast_panel_callback_t value) { m_create_toast_panel_callback_t = value;}
@@ -88,8 +90,6 @@ public:
void onToastDestroyed (LLToast* toast, bool app_quitting);
void onToastFade (LLToast* toast);
- void reshape (S32 width, S32 height, BOOL called_from_parent);
-
void redrawToasts()
{
arrangeToasts();
@@ -121,7 +121,7 @@ protected:
if (!toast) return;
LL_DEBUGS("NearbyChat") << "Pooling toast" << llendl;
toast->setVisible(FALSE);
- toast->stopFading();
+ toast->stopTimer();
toast->setIsHidden(true);
// Nearby chat toasts that are hidden, not destroyed. They are collected to the toast pool, so that
@@ -149,6 +149,7 @@ protected:
toast_list_t m_toast_pool;
bool mStopProcessing;
+ bool mChannelRect;
};
//-----------------------------------------------------------------------------------------------
@@ -268,6 +269,9 @@ bool LLNearbyChatScreenChannel::createPoolToast()
toast->setOnFadeCallback(boost::bind(&LLNearbyChatScreenChannel::onToastFade, this, _1));
+ // If the toast gets somehow prematurely destroyed, deactivate it to prevent crash (STORM-1352).
+ toast->setOnToastDestroyedCallback(boost::bind(&LLNearbyChatScreenChannel::onToastDestroyed, this, _1, false));
+
LL_DEBUGS("NearbyChat") << "Creating and pooling toast" << llendl;
m_toast_pool.push_back(toast->getHandle());
return true;
@@ -296,7 +300,7 @@ void LLNearbyChatScreenChannel::addNotification(LLSD& notification)
{
panel->addMessage(notification);
toast->reshapeToPanel();
- toast->startFading();
+ toast->startTimer();
arrangeToasts();
return;
@@ -341,48 +345,50 @@ void LLNearbyChatScreenChannel::addNotification(LLSD& notification)
panel->init(notification);
toast->reshapeToPanel();
- toast->startFading();
+ toast->startTimer();
m_active_toasts.push_back(toast->getHandle());
arrangeToasts();
}
-void LLNearbyChatScreenChannel::arrangeToasts()
+static bool sort_toasts_predicate(LLHandle<LLToast> first, LLHandle<LLToast> second)
{
- if(!isHovering())
- {
- showToastsBottom();
- }
-
- if (m_active_toasts.empty())
- {
- LLHints::registerHintTarget("incoming_chat", LLHandle<LLView>());
- }
- else
- {
- LLToast* toast = m_active_toasts.front().get();
- if (toast)
- {
- LLHints::registerHintTarget("incoming_chat", m_active_toasts.front().get()->LLView::getHandle());
- }
- }
-}
+ if (!first.get() || !second.get()) return false; // STORM-1352
-int sort_toasts_predicate(LLHandle<LLToast> first, LLHandle<LLToast> second)
-{
F32 v1 = first.get()->getTimeLeftToLive();
F32 v2 = second.get()->getTimeLeftToLive();
return v1 > v2;
}
-void LLNearbyChatScreenChannel::showToastsBottom()
+void LLNearbyChatScreenChannel::arrangeToasts()
{
- if(mStopProcessing)
+ if(mStopProcessing || isHovering())
return;
+ if (mFloaterSnapRegion == NULL)
+ {
+ mFloaterSnapRegion = gViewerWindow->getRootView()->getChildView("floater_snap_region");
+ }
+
+ if (!getParent())
+ {
+ // connect to floater snap region just to get resize events, we don't care about being a proper widget
+ mFloaterSnapRegion->addChild(this);
+ setFollows(FOLLOWS_ALL);
+ }
+
LLRect toast_rect;
- S32 bottom = getRect().mBottom;
+ updateRect();
+
+ LLRect channel_rect;
+ mFloaterSnapRegion->localRectToOtherView(mFloaterSnapRegion->getLocalRect(), &channel_rect, gFloaterView);
+ channel_rect.mLeft += 10;
+ channel_rect.mRight = channel_rect.mLeft + 300;
+
+ S32 channel_bottom = channel_rect.mBottom;
+
+ S32 bottom = channel_bottom + 80;
S32 margin = gSavedSettings.getS32("ToastGap");
//sort active toasts
@@ -393,11 +399,15 @@ void LLNearbyChatScreenChannel::showToastsBottom()
for(toast_vec_t::iterator it = m_active_toasts.begin(); it != m_active_toasts.end(); ++it)
{
LLToast* toast = it->get();
- if (!toast) continue;
+ if (!toast)
+ {
+ llwarns << "NULL found in the active chat toasts list!" << llendl;
+ continue;
+ }
S32 toast_top = bottom + toast->getRect().getHeight() + margin;
- if(toast_top > gFloaterView->getRect().getHeight())
+ if(toast_top > channel_rect.getHeight())
{
while(it!=m_active_toasts.end())
{
@@ -408,7 +418,7 @@ void LLNearbyChatScreenChannel::showToastsBottom()
}
toast_rect = toast->getRect();
- toast_rect.setLeftTopAndSize(getRect().mLeft , bottom + toast_rect.getHeight(), toast_rect.getWidth() ,toast_rect.getHeight());
+ toast_rect.setLeftTopAndSize(channel_rect.mLeft , bottom + toast_rect.getHeight(), toast_rect.getWidth() ,toast_rect.getHeight());
toast->setRect(toast_rect);
bottom += toast_rect.getHeight() - toast->getTopPad() + margin;
@@ -426,30 +436,31 @@ void LLNearbyChatScreenChannel::showToastsBottom()
}
}
- }
-
-void LLNearbyChatScreenChannel::reshape (S32 width, S32 height, BOOL called_from_parent)
-{
- LLScreenChannelBase::reshape(width, height, called_from_parent);
- arrangeToasts();
}
+
//-----------------------------------------------------------------------------------------------
//LLNearbyChatHandler
//-----------------------------------------------------------------------------------------------
+boost::scoped_ptr<LLEventPump> LLNearbyChatHandler::sChatWatcher(new LLEventStream("LLChat"));
+
LLNearbyChatHandler::LLNearbyChatHandler(e_notification_type type, const LLSD& id)
{
mType = type;
// Getting a Channel for our notifications
- LLNearbyChatScreenChannel* channel = new LLNearbyChatScreenChannel(LLUUID(gSavedSettings.getString("NearByChatChannelUUID")));
+ LLNearbyChatScreenChannel::Params p;
+ p.id = LLUUID(gSavedSettings.getString("NearByChatChannelUUID"));
+ LLNearbyChatScreenChannel* channel = new LLNearbyChatScreenChannel(p);
LLNearbyChatScreenChannel::create_toast_panel_callback_t callback = createToastPanel;
channel->setCreatePanelCallback(callback);
- mChannel = LLChannelManager::getInstance()->addChannel(channel);
+ LLChannelManager::getInstance()->addChannel(channel);
+
+ mChannel = channel->getHandle();
}
LLNearbyChatHandler::~LLNearbyChatHandler()
@@ -459,15 +470,14 @@ LLNearbyChatHandler::~LLNearbyChatHandler()
void LLNearbyChatHandler::initChannel()
{
- LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD());
- LLView* chat_box = LLBottomTray::getInstance()->getChildView("chat_box");
- S32 channel_right_bound = nearby_chat->getRect().mRight;
- mChannel->init(chat_box->getRect().mLeft, channel_right_bound);
+ //LLRect snap_rect = gFloaterView->getSnapRect();
+ //mChannel->init(snap_rect.mLeft, snap_rect.mLeft + 200);
}
-void LLNearbyChatHandler::processChat(const LLChat& chat_msg, const LLSD &args)
+void LLNearbyChatHandler::processChat(const LLChat& chat_msg,
+ const LLSD &args)
{
if(chat_msg.mMuted == TRUE)
return;
@@ -475,13 +485,29 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg, const LLSD &args)
if(chat_msg.mText.empty())
return;//don't process empty messages
- LLChat& tmp_chat = const_cast<LLChat&>(chat_msg);
-
- LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD());
+ LLFloater* chat_bar = LLFloaterReg::getInstance("chat_bar");
+
+ LLNearbyChat* nearby_chat = chat_bar->findChild<LLNearbyChat>("nearby_chat");
+
+ // Build notification data
+ LLSD notification;
+ notification["message"] = chat_msg.mText;
+ notification["from"] = chat_msg.mFromName;
+ notification["from_id"] = chat_msg.mFromID;
+ notification["time"] = chat_msg.mTime;
+ notification["source"] = (S32)chat_msg.mSourceType;
+ notification["chat_type"] = (S32)chat_msg.mChatType;
+ notification["chat_style"] = (S32)chat_msg.mChatStyle;
+ // Pass sender info so that it can be rendered properly (STORM-1021).
+ notification["sender_slurl"] = LLViewerChat::getSenderSLURL(chat_msg, args);
+
+ if (chat_msg.mChatType == CHAT_TYPE_DIRECT &&
+ chat_msg.mText.length() > 0 &&
+ chat_msg.mText[0] == '@')
{
- //sometimes its usefull to have no name at all...
- //if(tmp_chat.mFromName.empty() && tmp_chat.mFromID!= LLUUID::null)
- // tmp_chat.mFromName = tmp_chat.mFromID.asString();
+ // Send event on to LLEventStream and exit
+ sChatWatcher->post(notification);
+ return;
}
// don't show toast and add message to chat history on receive debug message
@@ -514,22 +540,32 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg, const LLSD &args)
}
nearby_chat->addMessage(chat_msg, true, args);
- if( nearby_chat->getVisible()
- || ( chat_msg.mSourceType == CHAT_SOURCE_AGENT
- && gSavedSettings.getBOOL("UseChatBubbles") ) )
- return;//no need in toast if chat is visible or if bubble chat is enabled
- // Handle irc styled messages for toast panel
- if (tmp_chat.mChatStyle == CHAT_STYLE_IRC)
+ if(chat_msg.mSourceType == CHAT_SOURCE_AGENT
+ && chat_msg.mFromID.notNull()
+ && chat_msg.mFromID != gAgentID)
{
- if(!tmp_chat.mFromName.empty())
- tmp_chat.mText = tmp_chat.mFromName + tmp_chat.mText.substr(3);
- else
- tmp_chat.mText = tmp_chat.mText.substr(3);
+ LLFirstUse::otherAvatarChatFirst();
+
+ // Add sender to the recent people list.
+ LLRecentPeople::instance().add(chat_msg.mFromID);
+
}
+ // Send event on to LLEventStream
+ sChatWatcher->post(notification);
+
+
+ if( !chat_bar->isMinimized()
+ && nearby_chat->isInVisibleChain()
+ || ( chat_msg.mSourceType == CHAT_SOURCE_AGENT
+ && gSavedSettings.getBOOL("UseChatBubbles") )
+ || mChannel.isDead()
+ || !mChannel.get()->getShowToasts() ) // to prevent toasts in Busy mode
+ return;//no need in toast if chat is visible or if bubble chat is enabled
+
// arrange a channel on a screen
- if(!mChannel->getVisible())
+ if(!mChannel.get()->getVisible())
{
initChannel();
}
@@ -546,24 +582,29 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg, const LLSD &args)
}
*/
- LLUUID id;
- id.generate();
-
- LLNearbyChatScreenChannel* channel = dynamic_cast<LLNearbyChatScreenChannel*>(mChannel);
-
+ LLNearbyChatScreenChannel* channel = dynamic_cast<LLNearbyChatScreenChannel*>(mChannel.get());
if(channel)
{
- LLSD notification;
+ // Handle IRC styled messages.
+ std::string toast_msg;
+ if (chat_msg.mChatStyle == CHAT_STYLE_IRC)
+ {
+ if (!chat_msg.mFromName.empty())
+ {
+ toast_msg += chat_msg.mFromName;
+ }
+ toast_msg += chat_msg.mText.substr(3);
+ }
+ else
+ {
+ toast_msg = chat_msg.mText;
+ }
+
+ // Add a nearby chat toast.
+ LLUUID id;
+ id.generate();
notification["id"] = id;
- notification["message"] = chat_msg.mText;
- notification["from"] = chat_msg.mFromName;
- notification["from_id"] = chat_msg.mFromID;
- notification["time"] = chat_msg.mTime;
- notification["source"] = (S32)chat_msg.mSourceType;
- notification["chat_type"] = (S32)chat_msg.mChatType;
- notification["chat_style"] = (S32)chat_msg.mChatStyle;
-
std::string r_color_name = "White";
F32 r_color_alpha = 1.0f;
LLViewerChat::getChatColor( chat_msg, r_color_name, r_color_alpha);
@@ -571,15 +612,9 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg, const LLSD &args)
notification["text_color"] = r_color_name;
notification["color_alpha"] = r_color_alpha;
notification["font_size"] = (S32)LLViewerChat::getChatFontSize() ;
+ notification["message"] = toast_msg;
channel->addNotification(notification);
}
-
- if(chat_msg.mSourceType == CHAT_SOURCE_AGENT
- && chat_msg.mFromID.notNull()
- && chat_msg.mFromID != gAgentID)
- {
- LLFirstUse::otherAvatarChatFirst();
- }
}
void LLNearbyChatHandler::onDeleteToast(LLToast* toast)
diff --git a/indra/newview/llnearbychathandler.h b/indra/newview/llnearbychathandler.h
index ec1f29cdfc..b0e4f62d51 100644
--- a/indra/newview/llnearbychathandler.h
+++ b/indra/newview/llnearbychathandler.h
@@ -29,6 +29,8 @@
#include "llnotificationhandler.h"
+class LLEventPump;
+
//add LLNearbyChatHandler to LLNotificationsUI namespace
namespace LLNotificationsUI{
@@ -44,6 +46,8 @@ public:
protected:
virtual void onDeleteToast(LLToast* toast);
virtual void initChannel();
+
+ static boost::scoped_ptr<LLEventPump> sChatWatcher;
};
}
diff --git a/indra/newview/llnetmap.cpp b/indra/newview/llnetmap.cpp
index f084002385..1bda7640bd 100644
--- a/indra/newview/llnetmap.cpp
+++ b/indra/newview/llnetmap.cpp
@@ -47,6 +47,7 @@
#include "llagentcamera.h"
#include "llappviewer.h" // for gDisconnected
#include "llcallingcard.h" // LLAvatarTracker
+#include "llfloaterworldmap.h"
#include "lltracker.h"
#include "llsurface.h"
#include "llviewercamera.h"
@@ -73,6 +74,8 @@ const F32 DOT_SCALE = 0.75f;
const F32 MIN_PICK_SCALE = 2.f;
const S32 MOUSE_DRAG_SLOP = 2; // How far the mouse needs to move before we think it's a drag
+const F64 COARSEUPDATE_MAX_Z = 1020.0f;
+
LLNetMap::LLNetMap (const Params & p)
: LLUICtrl (p),
mBackgroundColor (p.bg_color()),
@@ -91,13 +94,27 @@ LLNetMap::LLNetMap (const Params & p)
mObjectImagep(),
mClosestAgentToCursor(),
mClosestAgentAtLastRightClick(),
- mToolTipMsg()
+ mToolTipMsg(),
+ mPopupMenu(NULL)
{
mDotRadius = llmax(DOT_SCALE * mPixelsPerMeter, MIN_DOT_RADIUS);
+ setScale(gSavedSettings.getF32("MiniMapScale"));
}
LLNetMap::~LLNetMap()
{
+ gSavedSettings.setF32("MiniMapScale", mScale);
+}
+
+BOOL LLNetMap::postBuild()
+{
+ LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
+
+ registrar.add("Minimap.Zoom", boost::bind(&LLNetMap::handleZoom, this, _2));
+ registrar.add("Minimap.Tracker", boost::bind(&LLNetMap::handleStopTracking, this, _2));
+
+ mPopupMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_mini_map.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
+ return TRUE;
}
void LLNetMap::setScale( F32 scale )
@@ -157,10 +174,10 @@ void LLNetMap::draw()
LLVector3 offset = gGL.getUITranslation();
LLVector3 scale = gGL.getUIScale();
- glLoadIdentity();
+ gGL.loadIdentity();
gGL.loadUIIdentity();
- glScalef(scale.mV[0], scale.mV[1], scale.mV[2]);
+ gGL.scalef(scale.mV[0], scale.mV[1], scale.mV[2]);
gGL.translatef(offset.mV[0], offset.mV[1], offset.mV[2]);
{
@@ -168,7 +185,7 @@ void LLNetMap::draw()
{
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
// Draw background rectangle
LLColor4 background_color = mBackgroundColor.get();
@@ -189,7 +206,7 @@ void LLNetMap::draw()
{
// rotate subsequent draws to agent rotation
rotation = atan2( LLViewerCamera::getInstance()->getAtAxis().mV[VX], LLViewerCamera::getInstance()->getAtAxis().mV[VY] );
- glRotatef( rotation * RAD_TO_DEG, 0.f, 0.f, 1.f);
+ gGL.rotatef( rotation * RAD_TO_DEG, 0.f, 0.f, 1.f);
}
// figure out where agent is
@@ -285,7 +302,8 @@ void LLNetMap::draw()
}
LLVector3 map_center_agent = gAgent.getPosAgentFromGlobal(mObjectImageCenterGlobal);
- map_center_agent -= gAgentCamera.getCameraPositionAgent();
+ LLVector3 camera_position = gAgentCamera.getCameraPositionAgent();
+ map_center_agent -= camera_position;
map_center_agent.mV[VX] *= mScale/region_width;
map_center_agent.mV[VY] *= mScale/region_width;
@@ -306,70 +324,77 @@ void LLNetMap::draw()
gGL.popMatrix();
- LLVector3d pos_global;
- LLVector3 pos_map;
-
// Mouse pointer in local coordinates
S32 local_mouse_x;
S32 local_mouse_y;
//localMouse(&local_mouse_x, &local_mouse_y);
LLUI::getMousePositionLocal(this, &local_mouse_x, &local_mouse_y);
mClosestAgentToCursor.setNull();
- F32 closest_dist = F32_MAX;
- F32 min_pick_dist = mDotRadius * MIN_PICK_SCALE;
+ F32 closest_dist_squared = F32_MAX; // value will be overridden in the loop
+ F32 min_pick_dist_squared = (mDotRadius * MIN_PICK_SCALE) * (mDotRadius * MIN_PICK_SCALE);
+
+ LLVector3 pos_map;
+ uuid_vec_t avatar_ids;
+ std::vector<LLVector3d> positions;
+ bool unknown_relative_z;
+
+ LLWorld::getInstance()->getAvatars(&avatar_ids, &positions, gAgentCamera.getCameraPositionGlobal());
// Draw avatars
- for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin();
- iter != LLWorld::getInstance()->getRegionList().end(); ++iter)
+ for (U32 i = 0; i < avatar_ids.size(); i++)
{
- LLViewerRegion* regionp = *iter;
- const LLVector3d& origin_global = regionp->getOriginGlobal();
-
- S32 count = regionp->mMapAvatars.count();
- S32 i;
- LLVector3 pos_local;
- U32 compact_local;
- U8 bits;
- // TODO: it'd be very cool to draw these in sorted order from lowest Z to highest.
- // just be careful to sort the avatar IDs along with the positions. -MG
- for (i = 0; i < count; i++)
- {
- compact_local = regionp->mMapAvatars.get(i);
-
- bits = compact_local & 0xFF;
- pos_local.mV[VZ] = F32(bits) * 4.f;
- compact_local >>= 8;
+ pos_map = globalPosToView(positions[i]);
+ LLUUID uuid = avatar_ids[i];
- bits = compact_local & 0xFF;
- pos_local.mV[VY] = (F32)bits;
- compact_local >>= 8;
+ bool show_as_friend = (LLAvatarTracker::instance().getBuddyInfo(uuid) != NULL);
- bits = compact_local & 0xFF;
- pos_local.mV[VX] = (F32)bits;
+ LLColor4 color = show_as_friend ? map_avatar_friend_color : map_avatar_color;
- pos_global.setVec( pos_local );
- pos_global += origin_global;
+ unknown_relative_z = positions[i].mdV[VZ] == COARSEUPDATE_MAX_Z &&
+ camera_position.mV[VZ] >= COARSEUPDATE_MAX_Z;
- pos_map = globalPosToView(pos_global);
+ LLWorldMapView::drawAvatar(
+ pos_map.mV[VX], pos_map.mV[VY],
+ color,
+ pos_map.mV[VZ], mDotRadius,
+ unknown_relative_z);
- BOOL show_as_friend = FALSE;
- if( i < regionp->mMapAvatarIDs.count())
+ if(uuid.notNull())
+ {
+ bool selected = false;
+ uuid_vec_t::iterator sel_iter = gmSelected.begin();
+ for (; sel_iter != gmSelected.end(); sel_iter++)
{
- show_as_friend = (LLAvatarTracker::instance().getBuddyInfo(regionp->mMapAvatarIDs.get(i)) != NULL);
+ if(*sel_iter == uuid)
+ {
+ selected = true;
+ break;
+ }
}
- LLWorldMapView::drawAvatar(
- pos_map.mV[VX], pos_map.mV[VY],
- show_as_friend ? map_avatar_friend_color : map_avatar_color,
- pos_map.mV[VZ], mDotRadius);
-
- F32 dist_to_cursor = dist_vec(LLVector2(pos_map.mV[VX], pos_map.mV[VY]),
- LLVector2(local_mouse_x,local_mouse_y));
- if(dist_to_cursor < min_pick_dist && dist_to_cursor < closest_dist)
+ if(selected)
{
- closest_dist = dist_to_cursor;
- mClosestAgentToCursor = regionp->mMapAvatarIDs.get(i);
+ if( (pos_map.mV[VX] < 0) ||
+ (pos_map.mV[VY] < 0) ||
+ (pos_map.mV[VX] >= getRect().getWidth()) ||
+ (pos_map.mV[VY] >= getRect().getHeight()) )
+ {
+ S32 x = llround( pos_map.mV[VX] );
+ S32 y = llround( pos_map.mV[VY] );
+ LLWorldMapView::drawTrackingCircle( getRect(), x, y, color, 1, 10);
+ } else
+ {
+ LLWorldMapView::drawTrackingDot(pos_map.mV[VX],pos_map.mV[VY],color,0.f);
+ }
}
}
+
+ F32 dist_to_cursor_squared = dist_vec_squared(LLVector2(pos_map.mV[VX], pos_map.mV[VY]),
+ LLVector2(local_mouse_x,local_mouse_y));
+ if(dist_to_cursor_squared < min_pick_dist_squared && dist_to_cursor_squared < closest_dist_squared)
+ {
+ closest_dist_squared = dist_to_cursor_squared;
+ mClosestAgentToCursor = uuid;
+ }
}
// Draw dot for autopilot target
@@ -392,7 +417,7 @@ void LLNetMap::draw()
}
// Draw dot for self avatar position
- pos_global = gAgent.getPositionGlobal();
+ LLVector3d pos_global = gAgent.getPositionGlobal();
pos_map = globalPosToView(pos_global);
S32 dot_width = llround(mDotRadius * 2.f);
LLUIImagePtr you = LLWorldMapView::sAvatarYouLargeImage;
@@ -403,9 +428,9 @@ void LLNetMap::draw()
dot_width,
dot_width);
- F32 dist_to_cursor = dist_vec(LLVector2(pos_map.mV[VX], pos_map.mV[VY]),
+ F32 dist_to_cursor_squared = dist_vec_squared(LLVector2(pos_map.mV[VX], pos_map.mV[VY]),
LLVector2(local_mouse_x,local_mouse_y));
- if(dist_to_cursor < min_pick_dist && dist_to_cursor < closest_dist)
+ if(dist_to_cursor_squared < min_pick_dist_squared && dist_to_cursor_squared < closest_dist_squared)
{
mClosestAgentToCursor = gAgent.getID();
}
@@ -444,7 +469,7 @@ void LLNetMap::draw()
// If we don't rotate the map, we have to rotate the frustum.
gGL.pushMatrix();
gGL.translatef( ctr_x, ctr_y, 0 );
- glRotatef( atan2( LLViewerCamera::getInstance()->getAtAxis().mV[VX], LLViewerCamera::getInstance()->getAtAxis().mV[VY] ) * RAD_TO_DEG, 0.f, 0.f, -1.f);
+ gGL.rotatef( atan2( LLViewerCamera::getInstance()->getAtAxis().mV[VX], LLViewerCamera::getInstance()->getAtAxis().mV[VY] ) * RAD_TO_DEG, 0.f, 0.f, -1.f);
gGL.begin( LLRender::TRIANGLES );
gGL.vertex2f( 0, 0 );
gGL.vertex2f( -half_width_pixels, far_clip_pixels );
@@ -466,9 +491,11 @@ void LLNetMap::reshape(S32 width, S32 height, BOOL called_from_parent)
createObjectImage();
}
-LLVector3 LLNetMap::globalPosToView( const LLVector3d& global_pos )
+LLVector3 LLNetMap::globalPosToView(const LLVector3d& global_pos)
{
- LLVector3d relative_pos_global = global_pos - gAgentCamera.getCameraPositionGlobal();
+ LLVector3d camera_position = gAgentCamera.getCameraPositionGlobal();
+
+ LLVector3d relative_pos_global = global_pos - camera_position;
LLVector3 pos_local;
pos_local.setVec(relative_pos_global); // convert to floats from doubles
@@ -493,7 +520,7 @@ LLVector3 LLNetMap::globalPosToView( const LLVector3d& global_pos )
void LLNetMap::drawTracking(const LLVector3d& pos_global, const LLColor4& color,
BOOL draw_arrow )
{
- LLVector3 pos_local = globalPosToView( pos_global );
+ LLVector3 pos_local = globalPosToView(pos_global);
if( (pos_local.mV[VX] < 0) ||
(pos_local.mV[VY] < 0) ||
(pos_local.mV[VX] >= getRect().getWidth()) ||
@@ -598,7 +625,6 @@ BOOL LLNetMap::handleToolTip( S32 x, S32 y, MASK mask )
args["[REGION]"] = region_name;
std::string msg = mToolTipMsg;
LLStringUtil::format(msg, args);
-
LLToolTipMgr::instance().show(LLToolTip::Params()
.message(msg)
.sticky_rect(sticky_rect));
@@ -791,6 +817,9 @@ BOOL LLNetMap::handleMouseDown( S32 x, S32 y, MASK mask )
BOOL LLNetMap::handleMouseUp( S32 x, S32 y, MASK mask )
{
+ if(abs(mMouseDown.mX-x)<3 && abs(mMouseDown.mY-y)<3)
+ handleClick(x,y,mask);
+
if (hasMouseCapture())
{
if (mPanning)
@@ -819,6 +848,60 @@ BOOL LLNetMap::handleMouseUp( S32 x, S32 y, MASK mask )
return FALSE;
}
+BOOL LLNetMap::handleRightMouseDown(S32 x, S32 y, MASK mask)
+{
+ if (mPopupMenu)
+ {
+ mPopupMenu->buildDrawLabels();
+ mPopupMenu->updateParent(LLMenuGL::sMenuContainer);
+ mPopupMenu->setItemEnabled("Stop Tracking", LLTracker::isTracking(0));
+ LLMenuGL::showPopup(this, mPopupMenu, x, y);
+ }
+ return TRUE;
+}
+
+BOOL LLNetMap::handleClick(S32 x, S32 y, MASK mask)
+{
+ // TODO: allow clicking an avatar on minimap to select avatar in the nearby avatar list
+ // if(mClosestAgentToCursor.notNull())
+ // mNearbyList->selectUser(mClosestAgentToCursor);
+ // Needs a registered observer i guess to accomplish this without using
+ // globals to tell the mNearbyList in llpeoplepanel to select the user
+ return TRUE;
+}
+
+BOOL LLNetMap::handleDoubleClick(S32 x, S32 y, MASK mask)
+{
+ LLVector3d pos_global = viewPosToGlobal(x, y);
+
+ bool double_click_teleport = gSavedSettings.getBOOL("DoubleClickTeleport");
+ bool double_click_show_world_map = gSavedSettings.getBOOL("DoubleClickShowWorldMap");
+
+ if (double_click_teleport || double_click_show_world_map)
+ {
+ // If we're not tracking a beacon already, double-click will set one
+ if (!LLTracker::isTracking(NULL))
+ {
+ LLFloaterWorldMap* world_map = LLFloaterWorldMap::getInstance();
+ if (world_map)
+ {
+ world_map->trackLocation(pos_global);
+ }
+ }
+ }
+
+ if (double_click_teleport)
+ {
+ // If DoubleClickTeleport is on, double clicking the minimap will teleport there
+ gAgent.teleportViaLocationLookAt(pos_global);
+ }
+ else if (double_click_show_world_map)
+ {
+ LLFloaterReg::showInstance("world_map");
+ }
+ return TRUE;
+}
+
// static
bool LLNetMap::outsideSlop( S32 x, S32 y, S32 start_x, S32 start_y, S32 slop )
{
@@ -869,3 +952,38 @@ BOOL LLNetMap::handleHover( S32 x, S32 y, MASK mask )
return TRUE;
}
+
+void LLNetMap::handleZoom(const LLSD& userdata)
+{
+ std::string level = userdata.asString();
+
+ F32 scale = 0.0f;
+ if (level == std::string("default"))
+ {
+ LLControlVariable *pvar = gSavedSettings.getControl("MiniMapScale");
+ if(pvar)
+ {
+ pvar->resetToDefault();
+ scale = gSavedSettings.getF32("MiniMapScale");
+ }
+ }
+ else if (level == std::string("close"))
+ scale = LLNetMap::MAP_SCALE_MAX;
+ else if (level == std::string("medium"))
+ scale = LLNetMap::MAP_SCALE_MID;
+ else if (level == std::string("far"))
+ scale = LLNetMap::MAP_SCALE_MIN;
+ if (scale != 0.0f)
+ {
+ setScale(scale);
+ }
+}
+
+void LLNetMap::handleStopTracking (const LLSD& userdata)
+{
+ if (mPopupMenu)
+ {
+ mPopupMenu->setItemEnabled ("Stop Tracking", false);
+ LLTracker::stopTracking ((void*)LLTracker::isTracking(NULL));
+ }
+}
diff --git a/indra/newview/llnetmap.h b/indra/newview/llnetmap.h
index e053b1c177..1f7e7d68c6 100644
--- a/indra/newview/llnetmap.h
+++ b/indra/newview/llnetmap.h
@@ -33,12 +33,13 @@
#include "v3dmath.h"
#include "v4color.h"
#include "llpointer.h"
+#include "llcoord.h"
class LLColor4U;
-class LLCoordGL;
class LLImageRaw;
class LLViewerTexture;
class LLFloaterMap;
+class LLMenuGL;
class LLNetMap : public LLUICtrl
{
@@ -72,7 +73,12 @@ public:
/*virtual*/ BOOL handleHover( S32 x, S32 y, MASK mask );
/*virtual*/ BOOL handleToolTip( S32 x, S32 y, MASK mask);
/*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
-
+
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ BOOL handleRightMouseDown( S32 x, S32 y, MASK mask );
+ /*virtual*/ BOOL handleClick(S32 x, S32 y, MASK mask);
+ /*virtual*/ BOOL handleDoubleClick( S32 x, S32 y, MASK mask );
+
void setScale( F32 scale );
void setToolTipMsg(const std::string& msg) { mToolTipMsg = msg; }
void renderScaledPointGlobal( const LLVector3d& pos, const LLColor4U &color, F32 radius );
@@ -120,6 +126,16 @@ private:
LLUUID mClosestAgentAtLastRightClick;
std::string mToolTipMsg;
+
+public:
+ void setSelected(uuid_vec_t uuids) { gmSelected=uuids; };
+
+private:
+ void handleZoom(const LLSD& userdata);
+ void handleStopTracking (const LLSD& userdata);
+
+ LLMenuGL* mPopupMenu;
+ uuid_vec_t gmSelected;
};
diff --git a/indra/newview/llnotificationalerthandler.cpp b/indra/newview/llnotificationalerthandler.cpp
index 9d824dcd59..89fe7bb3c2 100644
--- a/indra/newview/llnotificationalerthandler.cpp
+++ b/indra/newview/llnotificationalerthandler.cpp
@@ -44,15 +44,15 @@ LLAlertHandler::LLAlertHandler(e_notification_type type, const LLSD& id) : mIsMo
{
mType = type;
- LLChannelManager::Params p;
+ LLScreenChannelBase::Params p;
p.id = LLUUID(gSavedSettings.getString("AlertChannelUUID"));
p.display_toasts_always = true;
p.toast_align = NA_CENTRE;
p.channel_align = CA_CENTRE;
// Getting a Channel for our notifications
- mChannel = LLChannelManager::getInstance()->getChannel(p);
- mChannel->setCanStoreToasts(false);
+ mChannel = LLChannelManager::getInstance()->getChannel(p)->getHandle();
+ mChannel.get()->setCanStoreToasts(false);
}
//--------------------------------------------------------------------------
@@ -64,13 +64,13 @@ LLAlertHandler::~LLAlertHandler()
void LLAlertHandler::initChannel()
{
S32 channel_right_bound = gViewerWindow->getWorldViewRectScaled().getWidth() / 2;
- mChannel->init(channel_right_bound, channel_right_bound);
+ mChannel.get()->init(channel_right_bound, channel_right_bound);
}
//--------------------------------------------------------------------------
bool LLAlertHandler::processNotification(const LLSD& notify)
{
- if(!mChannel)
+ if(mChannel.isDead())
{
return false;
}
@@ -81,7 +81,7 @@ bool LLAlertHandler::processNotification(const LLSD& notify)
return false;
// arrange a channel on a screen
- if(!mChannel->getVisible())
+ if(!mChannel.get()->getVisible())
{
initChannel();
}
@@ -114,22 +114,22 @@ bool LLAlertHandler::processNotification(const LLSD& notify)
// Show alert in middle of progress view (during teleport) (EXT-1093)
LLProgressView* progress = gViewerWindow->getProgressView();
LLRect rc = progress && progress->getVisible() ? progress->getRect() : gViewerWindow->getWorldViewRectScaled();
- mChannel->updatePositionAndSize(rc, rc);
+ mChannel.get()->updatePositionAndSize(rc);
- LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel);
+ LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel.get());
if(channel)
channel->addToast(p);
}
else if (notify["sigtype"].asString() == "change")
{
LLToastAlertPanel* alert_dialog = new LLToastAlertPanel(notification, mIsModal);
- LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel);
+ LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel.get());
if(channel)
channel->modifyToastByNotificationID(notification->getID(), (LLToastPanel*)alert_dialog);
}
else
{
- LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel);
+ LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel.get());
if(channel)
channel->killToastByNotificationID(notification->getID());
}
diff --git a/indra/newview/llnotificationgrouphandler.cpp b/indra/newview/llnotificationgrouphandler.cpp
index 9b7fdaef82..ad51389241 100644
--- a/indra/newview/llnotificationgrouphandler.cpp
+++ b/indra/newview/llnotificationgrouphandler.cpp
@@ -42,10 +42,12 @@ LLGroupHandler::LLGroupHandler(e_notification_type type, const LLSD& id)
mType = type;
// Getting a Channel for our notifications
- mChannel = LLChannelManager::getInstance()->createNotificationChannel();
- LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel);
+ LLScreenChannel* channel = LLChannelManager::getInstance()->createNotificationChannel();
if(channel)
+ {
channel->setOnRejectToastCallback(boost::bind(&LLGroupHandler::onRejectToast, this, _1));
+ mChannel = channel->getHandle();
+ }
}
//--------------------------------------------------------------------------
@@ -58,13 +60,13 @@ void LLGroupHandler::initChannel()
{
S32 channel_right_bound = gViewerWindow->getWorldViewRectScaled().mRight - gSavedSettings.getS32("NotificationChannelRightMargin");
S32 channel_width = gSavedSettings.getS32("NotifyBoxWidth");
- mChannel->init(channel_right_bound - channel_width, channel_right_bound);
+ mChannel.get()->init(channel_right_bound - channel_width, channel_right_bound);
}
//--------------------------------------------------------------------------
bool LLGroupHandler::processNotification(const LLSD& notify)
{
- if(!mChannel)
+ if(mChannel.isDead())
{
return false;
}
@@ -75,7 +77,7 @@ bool LLGroupHandler::processNotification(const LLSD& notify)
return false;
// arrange a channel on a screen
- if(!mChannel->getVisible())
+ if(!mChannel.get()->getVisible())
{
initChannel();
}
@@ -91,7 +93,7 @@ bool LLGroupHandler::processNotification(const LLSD& notify)
p.panel = notify_box;
p.on_delete_toast = boost::bind(&LLGroupHandler::onDeleteToast, this, _1);
- LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel);
+ LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel.get());
if(channel)
channel->addToast(p);
@@ -102,7 +104,7 @@ bool LLGroupHandler::processNotification(const LLSD& notify)
}
else if (notify["sigtype"].asString() == "delete")
{
- mChannel->killToastByNotificationID(notification->getID());
+ mChannel.get()->killToastByNotificationID(notification->getID());
}
return false;
}
diff --git a/indra/newview/llnotificationhandler.h b/indra/newview/llnotificationhandler.h
index 28a69f2373..3569ad6447 100644
--- a/indra/newview/llnotificationhandler.h
+++ b/indra/newview/llnotificationhandler.h
@@ -103,8 +103,8 @@ protected:
// at the moment, when a handlers creates a channel.
virtual void initChannel()=0;
- LLScreenChannelBase* mChannel;
- e_notification_type mType;
+ LLHandle<LLScreenChannelBase> mChannel;
+ e_notification_type mType;
};
@@ -283,9 +283,17 @@ class LLBrowserNotification : public LLSingleton<LLBrowserNotification>
{
public:
virtual bool processNotification(const LLSD& notify);
+};
+/**
+ * Handler for outbox notifications
+ */
+class LLOutboxNotification : public LLSingleton<LLOutboxNotification>
+{
+public:
+ virtual bool processNotification(const LLSD& notify);
};
-
+
class LLHandlerUtil
{
public:
diff --git a/indra/newview/llnotificationhandlerutil.cpp b/indra/newview/llnotificationhandlerutil.cpp
index 70d588db52..7c6287967a 100644
--- a/indra/newview/llnotificationhandlerutil.cpp
+++ b/indra/newview/llnotificationhandlerutil.cpp
@@ -27,13 +27,17 @@
#include "llviewerprecompiledheaders.h" // must be first include
-#include "llnotificationhandler.h"
+#include "llavatarnamecache.h"
+
+#include "llfloaterreg.h"
#include "llnotifications.h"
-#include "llimview.h"
+#include "llurlaction.h"
+
#include "llagent.h"
-#include "llfloaterreg.h"
-#include "llnearbychat.h"
#include "llimfloater.h"
+#include "llimview.h"
+#include "llnearbychat.h"
+#include "llnotificationhandler.h"
using namespace LLNotificationsUI;
@@ -60,7 +64,7 @@ LLSysHandler::LLSysHandler()
void LLSysHandler::removeExclusiveNotifications(const LLNotificationPtr& notif)
{
- LLScreenChannel* channel = dynamic_cast<LLScreenChannel *>(mChannel);
+ LLScreenChannel* channel = dynamic_cast<LLScreenChannel *>(mChannel.get());
if (channel == NULL)
{
return;
@@ -275,7 +279,11 @@ void LLHandlerUtil::logToIM(const EInstantMessage& session_type,
{
from = SYSTEM_FROM;
}
- LLIMModel::instance().logToFile(session_name, from, from_id, message);
+
+ // Build a new format username or firstname_lastname for legacy names
+ // to use it for a history log filename.
+ std::string user_name = LLCacheName::buildUsername(session_name);
+ LLIMModel::instance().logToFile(user_name, from, from_id, message);
}
else
{
@@ -377,7 +385,7 @@ void LLHandlerUtil::logGroupNoticeToIMGroup(
// static
void LLHandlerUtil::logToNearbyChat(const LLNotificationPtr& notification, EChatSourceType type)
{
- LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD());
+ LLNearbyChat* nearby_chat = LLNearbyChat::getInstance();
if(nearby_chat)
{
LLChat chat_msg(notification->getMessage());
diff --git a/indra/newview/llnotificationmanager.cpp b/indra/newview/llnotificationmanager.cpp
index 6988227128..f792f53ac5 100644
--- a/indra/newview/llnotificationmanager.cpp
+++ b/indra/newview/llnotificationmanager.cpp
@@ -35,6 +35,7 @@
#include "llnotifications.h"
#include <boost/bind.hpp>
+#include <boost/foreach.hpp>
using namespace LLNotificationsUI;
@@ -48,6 +49,10 @@ LLNotificationManager::LLNotificationManager()
//--------------------------------------------------------------------------
LLNotificationManager::~LLNotificationManager()
{
+ BOOST_FOREACH(listener_pair_t& pair, mChannelListeners)
+ {
+ pair.second.disconnect();
+ }
}
//--------------------------------------------------------------------------
@@ -62,16 +67,18 @@ void LLNotificationManager::init()
LLNotificationChannel::buildChannel("Offer", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "offer"));
LLNotificationChannel::buildChannel("Hints", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "hint"));
LLNotificationChannel::buildChannel("Browser", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "browser"));
+ LLNotificationChannel::buildChannel("Outbox", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "outbox"));
- LLNotifications::instance().getChannel("Notifications")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1));
- LLNotifications::instance().getChannel("NotificationTips")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1));
- LLNotifications::instance().getChannel("Group Notifications")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1));
- LLNotifications::instance().getChannel("Alerts")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1));
- LLNotifications::instance().getChannel("AlertModal")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1));
- LLNotifications::instance().getChannel("IM Notifications")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1));
- LLNotifications::instance().getChannel("Offer")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1));
- LLNotifications::instance().getChannel("Hints")->connectChanged(boost::bind(&LLHintHandler::processNotification, LLHintHandler::getInstance(), _1));
- LLNotifications::instance().getChannel("Browser")->connectChanged(boost::bind(&LLBrowserNotification::processNotification, LLBrowserNotification::getInstance(), _1));
+ mChannelListeners["Notifications"] = LLNotifications::instance().getChannel("Notifications")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1));
+ mChannelListeners["NotificationTips"] = LLNotifications::instance().getChannel("NotificationTips")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1));
+ mChannelListeners["Group Notifications"] = LLNotifications::instance().getChannel("Group Notifications")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1));
+ mChannelListeners["Alerts"] = LLNotifications::instance().getChannel("Alerts")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1));
+ mChannelListeners["AlertModal"] = LLNotifications::instance().getChannel("AlertModal")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1));
+ mChannelListeners["IM Notifications"] = LLNotifications::instance().getChannel("IM Notifications")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1));
+ mChannelListeners["Offer"] = LLNotifications::instance().getChannel("Offer")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1));
+ mChannelListeners["Hints"] = LLNotifications::instance().getChannel("Hints")->connectChanged(boost::bind(&LLHintHandler::processNotification, LLHintHandler::getInstance(), _1));
+ mChannelListeners["Browser"] = LLNotifications::instance().getChannel("Browser")->connectChanged(boost::bind(&LLBrowserNotification::processNotification, LLBrowserNotification::getInstance(), _1));
+ mChannelListeners["Outbox"] = LLNotifications::instance().getChannel("Outbox")->connectChanged(boost::bind(&LLOutboxNotification::processNotification, LLOutboxNotification::getInstance(), _1));
mNotifyHandlers["notify"] = boost::shared_ptr<LLEventHandler>(new LLScriptHandler(NT_NOTIFY, LLSD()));
mNotifyHandlers["notifytip"] = boost::shared_ptr<LLEventHandler>(new LLTipHandler(NT_NOTIFY, LLSD()));
@@ -90,6 +97,9 @@ bool LLNotificationManager::onNotification(const LLSD& notify)
{
LLSysHandler* handle = NULL;
+ if (LLNotifications::destroyed())
+ return false;
+
LLNotificationPtr notification = LLNotifications::instance().find(notify["id"].asUUID());
if (!notification)
diff --git a/indra/newview/llnotificationmanager.h b/indra/newview/llnotificationmanager.h
index 72fa394621..27b6ba1c71 100644
--- a/indra/newview/llnotificationmanager.h
+++ b/indra/newview/llnotificationmanager.h
@@ -28,6 +28,8 @@
#ifndef LL_LLNOTIFICATIONMANAGER_H
#define LL_LLNOTIFICATIONMANAGER_H
+#include "llevents.h"
+
#include "lluictrl.h"
#include "llnotificationhandler.h"
@@ -47,6 +49,7 @@ class LLToast;
class LLNotificationManager : public LLSingleton<LLNotificationManager>
{
typedef std::pair<std::string, LLEventHandler*> eventhandlers;
+ typedef std::pair<const std::string, LLBoundListener> listener_pair_t;
public:
LLNotificationManager();
virtual ~LLNotificationManager();
@@ -69,7 +72,9 @@ public:
private:
//TODO (*)
std::map<std::string, boost::shared_ptr<LLEventHandler> > mNotifyHandlers;
- std::map<std::string, LLChatHandler*> mChatHandlers;
+ // cruft std::map<std::string, LLChatHandler*> mChatHandlers;
+
+ std::map<std::string, LLBoundListener> mChannelListeners;
};
}
diff --git a/indra/newview/llnotificationofferhandler.cpp b/indra/newview/llnotificationofferhandler.cpp
index 68fd65be0f..1552ed3346 100644
--- a/indra/newview/llnotificationofferhandler.cpp
+++ b/indra/newview/llnotificationofferhandler.cpp
@@ -45,12 +45,13 @@ LLOfferHandler::LLOfferHandler(e_notification_type type, const LLSD& id)
mType = type;
// Getting a Channel for our notifications
- mChannel = LLChannelManager::getInstance()->createNotificationChannel();
- mChannel->setControlHovering(true);
-
- LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel);
+ LLScreenChannel* channel = LLChannelManager::getInstance()->createNotificationChannel();
if(channel)
+ {
+ channel->setControlHovering(true);
channel->setOnRejectToastCallback(boost::bind(&LLOfferHandler::onRejectToast, this, _1));
+ mChannel = channel->getHandle();
+ }
}
//--------------------------------------------------------------------------
@@ -63,13 +64,13 @@ void LLOfferHandler::initChannel()
{
S32 channel_right_bound = gViewerWindow->getWorldViewRectScaled().mRight - gSavedSettings.getS32("NotificationChannelRightMargin");
S32 channel_width = gSavedSettings.getS32("NotifyBoxWidth");
- mChannel->init(channel_right_bound - channel_width, channel_right_bound);
+ mChannel.get()->init(channel_right_bound - channel_width, channel_right_bound);
}
//--------------------------------------------------------------------------
bool LLOfferHandler::processNotification(const LLSD& notify)
{
- if(!mChannel)
+ if(mChannel.isDead())
{
return false;
}
@@ -80,7 +81,7 @@ bool LLOfferHandler::processNotification(const LLSD& notify)
return false;
// arrange a channel on a screen
- if(!mChannel->getVisible())
+ if(!mChannel.get()->getVisible())
{
initChannel();
}
@@ -134,7 +135,7 @@ bool LLOfferHandler::processNotification(const LLSD& notify)
// we not save offer notifications to the syswell floater that should be added to the IM floater
p.can_be_stored = !add_notid_to_im;
- LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel);
+ LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel.get());
if(channel)
channel->addToast(p);
@@ -175,7 +176,7 @@ bool LLOfferHandler::processNotification(const LLSD& notify)
{
LLHandlerUtil::decIMMesageCounter(notification);
}
- mChannel->killToastByNotificationID(notification->getID());
+ mChannel.get()->killToastByNotificationID(notification->getID());
}
}
diff --git a/indra/newview/llnotificationscripthandler.cpp b/indra/newview/llnotificationscripthandler.cpp
index 45590c3cdb..995915206b 100644
--- a/indra/newview/llnotificationscripthandler.cpp
+++ b/indra/newview/llnotificationscripthandler.cpp
@@ -47,13 +47,13 @@ LLScriptHandler::LLScriptHandler(e_notification_type type, const LLSD& id)
mType = type;
// Getting a Channel for our notifications
- mChannel = LLChannelManager::getInstance()->createNotificationChannel();
- mChannel->setControlHovering(true);
-
- LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel);
+ LLScreenChannel* channel = LLChannelManager::getInstance()->createNotificationChannel();
if(channel)
+ {
+ channel->setControlHovering(true);
channel->setOnRejectToastCallback(boost::bind(&LLScriptHandler::onRejectToast, this, _1));
-
+ mChannel = channel->getHandle();
+ }
}
//--------------------------------------------------------------------------
@@ -66,13 +66,13 @@ void LLScriptHandler::initChannel()
{
S32 channel_right_bound = gViewerWindow->getWorldViewRectScaled().mRight - gSavedSettings.getS32("NotificationChannelRightMargin");
S32 channel_width = gSavedSettings.getS32("NotifyBoxWidth");
- mChannel->init(channel_right_bound - channel_width, channel_right_bound);
+ mChannel.get()->init(channel_right_bound - channel_width, channel_right_bound);
}
//--------------------------------------------------------------------------
bool LLScriptHandler::processNotification(const LLSD& notify)
{
- if(!mChannel)
+ if(mChannel.isDead())
{
return false;
}
@@ -83,12 +83,12 @@ bool LLScriptHandler::processNotification(const LLSD& notify)
return false;
// arrange a channel on a screen
- if(!mChannel->getVisible())
+ if(!mChannel.get()->getVisible())
{
initChannel();
}
- if(notify["sigtype"].asString() == "add" || notify["sigtype"].asString() == "change")
+ if(notify["sigtype"].asString() == "add")
{
if (LLHandlerUtil::canLogToIM(notification))
{
@@ -109,7 +109,7 @@ bool LLScriptHandler::processNotification(const LLSD& notify)
p.panel = notify_box;
p.on_delete_toast = boost::bind(&LLScriptHandler::onDeleteToast, this, _1);
- LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel);
+ LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel.get());
if(channel)
{
channel->addToast(p);
@@ -127,7 +127,7 @@ bool LLScriptHandler::processNotification(const LLSD& notify)
}
else
{
- mChannel->killToastByNotificationID(notification->getID());
+ mChannel.get()->killToastByNotificationID(notification->getID());
}
}
return false;
diff --git a/indra/newview/llnotificationtiphandler.cpp b/indra/newview/llnotificationtiphandler.cpp
index 02b217fc94..e397cfa046 100644
--- a/indra/newview/llnotificationtiphandler.cpp
+++ b/indra/newview/llnotificationtiphandler.cpp
@@ -29,6 +29,7 @@
#include "llfloaterreg.h"
#include "llnearbychat.h"
+#include "llnearbychatbar.h"
#include "llnotificationhandler.h"
#include "llnotifications.h"
#include "lltoastnotifypanel.h"
@@ -45,11 +46,12 @@ LLTipHandler::LLTipHandler(e_notification_type type, const LLSD& id)
mType = type;
// Getting a Channel for our notifications
- mChannel = LLChannelManager::getInstance()->createNotificationChannel();
-
- LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel);
+ LLScreenChannel* channel = LLChannelManager::getInstance()->createNotificationChannel();
if(channel)
+ {
channel->setOnRejectToastCallback(boost::bind(&LLTipHandler::onRejectToast, this, _1));
+ mChannel = channel->getHandle();
+ }
}
//--------------------------------------------------------------------------
@@ -62,13 +64,13 @@ void LLTipHandler::initChannel()
{
S32 channel_right_bound = gViewerWindow->getWorldViewRectScaled().mRight - gSavedSettings.getS32("NotificationChannelRightMargin");
S32 channel_width = gSavedSettings.getS32("NotifyBoxWidth");
- mChannel->init(channel_right_bound - channel_width, channel_right_bound);
+ mChannel.get()->init(channel_right_bound - channel_width, channel_right_bound);
}
//--------------------------------------------------------------------------
bool LLTipHandler::processNotification(const LLSD& notify)
{
- if(!mChannel)
+ if(mChannel.isDead())
{
return false;
}
@@ -79,7 +81,7 @@ bool LLTipHandler::processNotification(const LLSD& notify)
return false;
// arrange a channel on a screen
- if(!mChannel->getVisible())
+ if(!mChannel.get()->getVisible())
{
initChannel();
}
@@ -92,9 +94,9 @@ bool LLTipHandler::processNotification(const LLSD& notify)
LLHandlerUtil::logToNearbyChat(notification, CHAT_SOURCE_SYSTEM);
// don't show toast if Nearby Chat is opened
- LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<
- LLNearbyChat>("nearby_chat", LLSD());
- if (nearby_chat->getVisible())
+ LLNearbyChat* nearby_chat = LLNearbyChat::getInstance();
+ LLNearbyChatBar* nearby_chat_bar = LLNearbyChatBar::getInstance();
+ if (!nearby_chat_bar->isMinimized() && nearby_chat_bar->getVisible() && nearby_chat->getVisible())
{
return false;
}
@@ -136,13 +138,13 @@ bool LLTipHandler::processNotification(const LLSD& notify)
removeExclusiveNotifications(notification);
- LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel);
+ LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel.get());
if(channel)
channel->addToast(p);
}
else if (notify["sigtype"].asString() == "delete")
{
- mChannel->killToastByNotificationID(notification->getID());
+ mChannel.get()->killToastByNotificationID(notification->getID());
}
return false;
}
diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp
index 6435126fc0..ef5ef2ddc8 100644
--- a/indra/newview/lloutfitslist.cpp
+++ b/indra/newview/lloutfitslist.cpp
@@ -35,13 +35,13 @@
#include "llaccordionctrltab.h"
#include "llagentwearables.h"
#include "llappearancemgr.h"
+#include "llfloatersidepanelcontainer.h"
#include "llinventoryfunctions.h"
#include "llinventorymodel.h"
#include "lllistcontextmenu.h"
#include "llmenubutton.h"
#include "llnotificationsutil.h"
#include "lloutfitobserver.h"
-#include "llsidetray.h"
#include "lltoggleablemenu.h"
#include "lltransutil.h"
#include "llviewermenu.h"
@@ -327,7 +327,7 @@ protected:
static void editOutfit()
{
- LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD().with("type", "edit_outfit"));
+ LLFloaterSidePanelContainer::showPanel("appearance", LLSD().with("type", "edit_outfit"));
}
static void renameOutfit(const LLUUID& outfit_cat_id)
@@ -364,8 +364,8 @@ LLOutfitsList::~LLOutfitsList()
if (gInventory.containsObserver(mCategoriesObserver))
{
gInventory.removeObserver(mCategoriesObserver);
- delete mCategoriesObserver;
}
+ delete mCategoriesObserver;
}
BOOL LLOutfitsList::postBuild()
@@ -640,7 +640,7 @@ void LLOutfitsList::onOutfitsRemovalConfirmation(const LLSD& notification, const
if (mSelectedOutfitUUID.notNull())
{
- remove_category(&gInventory, mSelectedOutfitUUID);
+ gInventory.removeCategory(mSelectedOutfitUUID);
}
}
diff --git a/indra/newview/lloutputmonitorctrl.h b/indra/newview/lloutputmonitorctrl.h
index 026803584d..2d23753d46 100644
--- a/indra/newview/lloutputmonitorctrl.h
+++ b/indra/newview/lloutputmonitorctrl.h
@@ -31,6 +31,7 @@
#include "llview.h"
#include "llmutelist.h"
#include "llspeakingindicatormanager.h"
+#include "lluiimage.h"
class LLTextBox;
class LLUICtrlFactory;
diff --git a/indra/newview/lloverlaybar.cpp b/indra/newview/lloverlaybar.cpp
deleted file mode 100644
index c2bbec0470..0000000000
--- a/indra/newview/lloverlaybar.cpp
+++ /dev/null
@@ -1,378 +0,0 @@
-/**
- * @file lloverlaybar.cpp
- * @brief LLOverlayBar class implementation
- *
- * $LicenseInfo:firstyear=2002&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-// Temporary buttons that appear at the bottom of the screen when you
-// are in a mode.
-
-#include "llviewerprecompiledheaders.h"
-
-#include "lloverlaybar.h"
-
-#include "llaudioengine.h"
-#include "llrender.h"
-#include "llagent.h"
-#include "llbutton.h"
-#include "llfocusmgr.h"
-#include "llimview.h"
-#include "llmediaremotectrl.h"
-#include "llparcel.h"
-#include "lltextbox.h"
-#include "llui.h"
-#include "llviewercontrol.h"
-#include "llviewertexturelist.h"
-#include "llviewerjoystick.h"
-#include "llviewermedia.h"
-#include "llviewermenu.h" // handle_reset_view()
-#include "llviewermedia.h"
-#include "llviewerparcelmedia.h"
-#include "llviewerparcelmgr.h"
-#include "lluictrlfactory.h"
-#include "llviewerwindow.h"
-#include "llvoiceclient.h"
-#include "llvoavatarself.h"
-#include "llvoiceremotectrl.h"
-#include "llmediactrl.h"
-#include "llselectmgr.h"
-
-//
-// Globals
-//
-
-LLOverlayBar *gOverlayBar = NULL;
-
-extern S32 MENU_BAR_HEIGHT;
-
-//
-// Functions
-//
-
-
-
-void* LLOverlayBar::createMediaRemote(void* userdata)
-{
- LLOverlayBar *self = (LLOverlayBar*)userdata;
- self->mMediaRemote = new LLMediaRemoteCtrl ();
- return self->mMediaRemote;
-}
-
-void* LLOverlayBar::createVoiceRemote(void* userdata)
-{
- LLOverlayBar *self = (LLOverlayBar*)userdata;
- self->mVoiceRemote = new LLVoiceRemoteCtrl();
- return self->mVoiceRemote;
-}
-
-LLOverlayBar::LLOverlayBar()
- : LLPanel(),
- mMediaRemote(NULL),
- mVoiceRemote(NULL),
- mMusicState(STOPPED)
-{
- setMouseOpaque(FALSE);
- setIsChrome(TRUE);
-
- mBuilt = false;
-
- mFactoryMap["media_remote"] = LLCallbackMap(LLOverlayBar::createMediaRemote, this);
- mFactoryMap["voice_remote"] = LLCallbackMap(LLOverlayBar::createVoiceRemote, this);
-
- LLUICtrlFactory::getInstance()->buildPanel(this, "panel_overlaybar.xml");
-}
-
-BOOL LLOverlayBar::postBuild()
-{
- childSetAction("Set Not Busy",onClickSetNotBusy,this);
- childSetAction("Mouselook",onClickMouselook,this);
- childSetAction("Stand Up",onClickStandUp,this);
- childSetAction("Flycam",onClickFlycam,this);
- childSetVisible("chat_bar", gSavedSettings.getBOOL("ChatVisible"));
-
- mVoiceRemote->expandOrCollapse();
- mMediaRemote->expandOrCollapse();
-
- setFocusRoot(TRUE);
- mBuilt = true;
-
- layoutButtons();
- return TRUE;
-}
-
-LLOverlayBar::~LLOverlayBar()
-{
- // LLView destructor cleans up children
-}
-
-// virtual
-void LLOverlayBar::reshape(S32 width, S32 height, BOOL called_from_parent)
-{
- LLView::reshape(width, height, called_from_parent);
-
- if (mBuilt)
- {
- layoutButtons();
- }
-}
-
-void LLOverlayBar::layoutButtons()
-{
- LLView* state_buttons_panel = getChildView("state_buttons");
-
- if (state_buttons_panel->getVisible())
- {
- LLViewQuery query;
- LLWidgetTypeFilter<LLButton> widget_filter;
- query.addPreFilter(LLEnabledFilter::getInstance());
- query.addPreFilter(&widget_filter);
-
- child_list_t button_list = query(state_buttons_panel);
-
- const S32 MAX_BAR_WIDTH = 600;
- S32 bar_width = llclamp(state_buttons_panel->getRect().getWidth(), 0, MAX_BAR_WIDTH);
-
- // calculate button widths
- const S32 MAX_BUTTON_WIDTH = 150;
- const S32 STATUS_BAR_PAD = 10;
- S32 segment_width = llclamp(lltrunc((F32)(bar_width) / (F32)button_list.size()), 0, MAX_BUTTON_WIDTH);
- S32 btn_width = segment_width - STATUS_BAR_PAD;
-
- // Evenly space all buttons, starting from left
- S32 left = 0;
- S32 bottom = 1;
-
- for (child_list_reverse_iter_t child_iter = button_list.rbegin();
- child_iter != button_list.rend(); ++child_iter)
- {
- LLView *view = *child_iter;
- LLRect r = view->getRect();
- r.setOriginAndSize(left, bottom, btn_width, r.getHeight());
- view->setRect(r);
- left += segment_width;
- }
- }
-}
-
-// Per-frame updates of visibility
-void LLOverlayBar::refresh()
-{
- BOOL buttons_changed = FALSE;
-
- BOOL im_received = gIMMgr->getIMReceived();
- LLButton* button = getChild<LLButton>("IM Received");
- if (button && button->getVisible() != im_received)
- {
- button->setVisible(im_received);
- sendChildToFront(button);
- moveChildToBackOfTabGroup(button);
- buttons_changed = TRUE;
- }
-
- BOOL busy = gAgent.getBusy();
- button = getChild<LLButton>("Set Not Busy");
- if (button && button->getVisible() != busy)
- {
- button->setVisible(busy);
- sendChildToFront(button);
- moveChildToBackOfTabGroup(button);
- buttons_changed = TRUE;
- }
-
- BOOL flycam = LLViewerJoystick::getInstance()->getOverrideCamera();
- button = getChild<LLButton>("Flycam");
- if (button && button->getVisible() != flycam)
- {
- button->setVisible(flycam);
- sendChildToFront(button);
- moveChildToBackOfTabGroup(button);
- buttons_changed = TRUE;
- }
-
- BOOL mouselook_grabbed;
- mouselook_grabbed = gAgent.isControlGrabbed(CONTROL_ML_LBUTTON_DOWN_INDEX)
- || gAgent.isControlGrabbed(CONTROL_ML_LBUTTON_UP_INDEX);
- button = getChild<LLButton>("Mouselook");
-
- if (button && button->getVisible() != mouselook_grabbed)
- {
- button->setVisible(mouselook_grabbed);
- sendChildToFront(button);
- moveChildToBackOfTabGroup(button);
- buttons_changed = TRUE;
- }
-
- BOOL sitting = FALSE;
- if (gAgent.getAvatarObject())
- {
- sitting = gAgent.getAvatarObject()->isSitting();
- }
- button = getChild<LLButton>("Stand Up");
-
- if (button && button->getVisible() != sitting)
- {
- button->setVisible(sitting);
- sendChildToFront(button);
- moveChildToBackOfTabGroup(button);
- buttons_changed = TRUE;
- }
-
-
- moveChildToBackOfTabGroup(mMediaRemote);
- moveChildToBackOfTabGroup(mVoiceRemote);
-
- // turn off the whole bar in mouselook
- if (gAgent.cameraMouselook())
- {
- childSetVisible("media_remote_container", FALSE);
- childSetVisible("voice_remote_container", FALSE);
- childSetVisible("state_buttons", FALSE);
- }
- else
- {
- // update "remotes"
- childSetVisible("media_remote_container", TRUE);
- childSetVisible("voice_remote_container", LLVoiceClient::getInstance()->voiceEnabled());
- childSetVisible("state_buttons", TRUE);
- }
-
- // always let user toggle into and out of chatbar
- childSetVisible("chat_bar", gSavedSettings.getBOOL("ChatVisible"));
-
- if (buttons_changed)
- {
- layoutButtons();
- }
-}
-
-//-----------------------------------------------------------------------
-// Static functions
-//-----------------------------------------------------------------------
-
-// static
-void LLOverlayBar::onClickSetNotBusy(void*)
-{
- gAgent.clearBusy();
-}
-
-
-// static
-void LLOverlayBar::onClickFlycam(void*)
-{
- LLViewerJoystick::getInstance()->toggleFlycam();
-}
-
-// static
-void LLOverlayBar::onClickResetView(void* data)
-{
- handle_reset_view();
-}
-
-//static
-void LLOverlayBar::onClickMouselook(void*)
-{
- gAgent.changeCameraToMouselook();
-}
-
-//static
-void LLOverlayBar::onClickStandUp(void*)
-{
- LLSelectMgr::getInstance()->deselectAllForStandingUp();
- gAgent.setControlFlags(AGENT_CONTROL_STAND_UP);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// static media helpers
-// *TODO: Move this into an audio manager abstraction
-//static
-void LLOverlayBar::mediaStop(void*)
-{
- if (!gOverlayBar)
- {
- // return;
- }
- LLViewerParcelMedia::stop();
-}
-//static
-void LLOverlayBar::toggleMediaPlay(void*)
-{
- if (!gOverlayBar)
- {
- // return;
- }
-
-
- if (LLViewerParcelMedia::getStatus() == LLViewerMediaImpl::MEDIA_PAUSED)
- {
- LLViewerParcelMedia::start();
- }
- else if(LLViewerParcelMedia::getStatus() == LLViewerMediaImpl::MEDIA_PLAYING)
- {
- LLViewerParcelMedia::pause();
- }
- else
- {
- LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
- if (parcel)
- {
- LLViewerParcelMedia::play(parcel);
- }
- }
-}
-
-//static
-void LLOverlayBar::toggleMusicPlay(void*)
-{
- if (gAudiop->isInternetStreamPlaying() != 1)
- {
- if (gAudiop)
- {
- LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
- if ( parcel )
- {
- // this doesn't work properly when crossing parcel boundaries - even when the
- // stream is stopped, it doesn't return the right thing - commenting out for now.
- // if ( gAudiop->isInternetStreamPlaying() == 0 )
- {
- gAudiop->startInternetStream(parcel->getMusicURL());
- }
- }
- }
- }
- //else
- //{
- // gOverlayBar->mMusicState = PAUSED; // desired state
- // if (gAudiop)
- // {
- // gAudiop->pauseInternetStream(1);
- // }
- //}
- else
- {
- if (gAudiop)
- {
- gAudiop->stopInternetStream();
- }
- }
-}
-
diff --git a/indra/newview/lloverlaybar.h b/indra/newview/lloverlaybar.h
deleted file mode 100644
index b36f5ebb73..0000000000
--- a/indra/newview/lloverlaybar.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/**
- * @file lloverlaybar.h
- * @brief LLOverlayBar class definition
- *
- * $LicenseInfo:firstyear=2002&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLOVERLAYBAR_H
-#define LL_LLOVERLAYBAR_H
-
-#include "llpanel.h"
-
-// "Constants" loaded from settings.xml at start time
-extern S32 STATUS_BAR_HEIGHT;
-
-class LLButton;
-class LLLineEditor;
-class LLMediaRemoteCtrl;
-class LLMessageSystem;
-class LLTextBox;
-class LLTextEditor;
-class LLUICtrl;
-class LLUUID;
-class LLFrameTimer;
-class LLStatGraph;
-class LLSlider;
-class LLVoiceRemoteCtrl;
-
-class LLOverlayBar
-: public LLPanel
-{
-public:
- LLOverlayBar();
- ~LLOverlayBar();
-
- /*virtual*/ void refresh();
- /*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
- /*virtual*/ BOOL postBuild();
-
- void layoutButtons();
-
- // helpers for returning desired state
- BOOL musicPlaying() { return mMusicState == PLAYING; }
-
- static void onClickSetNotBusy(void* data);
- static void onClickMouselook(void* data);
- static void onClickStandUp(void* data);
- static void onClickResetView(void* data);
- static void onClickFlycam(void* data);
-
- //static media helper functions
- static void toggleMediaPlay(void*);
- static void toggleMusicPlay(void*);
- static void musicPause(void*);
- static void musicStop(void*);
- static void mediaStop(void*);
-
- static void toggleAudioVolumeFloater(void*);
-
-protected:
- static void* createMediaRemote(void* userdata);
- static void* createVoiceRemote(void* userdata);
-
- void enableMediaButtons();
-
-protected:
- LLMediaRemoteCtrl* mMediaRemote;
- LLVoiceRemoteCtrl* mVoiceRemote;
- bool mBuilt; // dialog constructed yet?
- enum { STOPPED=0, PLAYING=1, PAUSED=2 };
- S32 mMusicState;
-};
-
-extern LLOverlayBar* gOverlayBar;
-
-#endif
diff --git a/indra/newview/llpanelappearancetab.cpp b/indra/newview/llpanelappearancetab.cpp
index 9910a3a2ac..8fa8867c69 100644
--- a/indra/newview/llpanelappearancetab.cpp
+++ b/indra/newview/llpanelappearancetab.cpp
@@ -31,6 +31,7 @@
#include "llinventoryfunctions.h"
#include "llinventorymodel.h"
+#include "llviewerinventory.h"
//virtual
bool LLPanelAppearanceTab::canTakeOffSelected()
diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp
index 57180f63b5..679b1bdcda 100644
--- a/indra/newview/llpanelavatar.cpp
+++ b/indra/newview/llpanelavatar.cpp
@@ -34,7 +34,9 @@
#include "llcombobox.h"
#include "lldateutil.h" // ageFromDate()
#include "llimview.h"
+#include "llmenubutton.h"
#include "llnotificationsutil.h"
+#include "llslurl.h"
#include "lltexteditor.h"
#include "lltexturectrl.h"
#include "lltoggleablemenu.h"
@@ -64,8 +66,8 @@ public:
Params()
: agent_id("agent_id")
{
- mouse_opaque(false);
- follows.flags(FOLLOWS_ALL);
+ changeDefault(mouse_opaque, false);
+ changeDefault(follows.flags, FOLLOWS_ALL);
}
};
@@ -118,268 +120,6 @@ BOOL LLDropTarget::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
static LLDefaultChildRegistry::Register<LLDropTarget> r("drop_target");
-static LLRegisterPanelClassWrapper<LLPanelAvatarProfile> t_panel_profile("panel_profile");
-static LLRegisterPanelClassWrapper<LLPanelMyProfile> t_panel_my_profile("panel_my_profile");
-static LLRegisterPanelClassWrapper<LLPanelAvatarNotes> t_panel_notes("panel_notes");
-
-//-----------------------------------------------------------------------------
-// LLPanelAvatarNotes()
-//-----------------------------------------------------------------------------
-LLPanelAvatarNotes::LLPanelAvatarNotes()
-: LLPanelProfileTab()
-{
-
-}
-
-void LLPanelAvatarNotes::updateData()
-{
- LLAvatarPropertiesProcessor::getInstance()->
- sendAvatarNotesRequest(getAvatarId());
-}
-
-BOOL LLPanelAvatarNotes::postBuild()
-{
- childSetCommitCallback("status_check", boost::bind(&LLPanelAvatarNotes::onCommitRights, this), NULL);
- childSetCommitCallback("map_check", boost::bind(&LLPanelAvatarNotes::onCommitRights, this), NULL);
- childSetCommitCallback("objects_check", boost::bind(&LLPanelAvatarNotes::onCommitRights, this), NULL);
-
- childSetCommitCallback("add_friend", boost::bind(&LLPanelAvatarNotes::onAddFriendButtonClick, this),NULL);
- childSetCommitCallback("im", boost::bind(&LLPanelAvatarNotes::onIMButtonClick, this), NULL);
- childSetCommitCallback("call", boost::bind(&LLPanelAvatarNotes::onCallButtonClick, this), NULL);
- childSetCommitCallback("teleport", boost::bind(&LLPanelAvatarNotes::onTeleportButtonClick, this), NULL);
- childSetCommitCallback("share", boost::bind(&LLPanelAvatarNotes::onShareButtonClick, this), NULL);
- childSetCommitCallback("show_on_map_btn", (boost::bind(
- &LLPanelAvatarNotes::onMapButtonClick, this)), NULL);
-
- LLTextEditor* te = getChild<LLTextEditor>("notes_edit");
- te->setCommitCallback(boost::bind(&LLPanelAvatarNotes::onCommitNotes,this));
- te->setCommitOnFocusLost(TRUE);
-
- resetControls();
- resetData();
-
- LLVoiceClient::getInstance()->addObserver((LLVoiceClientStatusObserver*)this);
-
- return TRUE;
-}
-
-void LLPanelAvatarNotes::onOpen(const LLSD& key)
-{
- LLPanelProfileTab::onOpen(key);
-
- fillRightsData();
-
- //Disable "Add Friend" button for friends.
- getChildView("add_friend")->setEnabled(!LLAvatarActions::isFriend(getAvatarId()));
-}
-
-void LLPanelAvatarNotes::fillRightsData()
-{
- getChild<LLUICtrl>("status_check")->setValue(FALSE);
- getChild<LLUICtrl>("map_check")->setValue(FALSE);
- getChild<LLUICtrl>("objects_check")->setValue(FALSE);
-
- const LLRelationship* relation = LLAvatarTracker::instance().getBuddyInfo(getAvatarId());
- // If true - we are viewing friend's profile, enable check boxes and set values.
- if(relation)
- {
- S32 rights = relation->getRightsGrantedTo();
-
- getChild<LLUICtrl>("status_check")->setValue(LLRelationship::GRANT_ONLINE_STATUS & rights ? TRUE : FALSE);
- getChild<LLUICtrl>("map_check")->setValue(LLRelationship::GRANT_MAP_LOCATION & rights ? TRUE : FALSE);
- getChild<LLUICtrl>("objects_check")->setValue(LLRelationship::GRANT_MODIFY_OBJECTS & rights ? TRUE : FALSE);
-
- }
-
- enableCheckboxes(NULL != relation);
-}
-
-void LLPanelAvatarNotes::onCommitNotes()
-{
- std::string notes = getChild<LLUICtrl>("notes_edit")->getValue().asString();
- LLAvatarPropertiesProcessor::getInstance()-> sendNotes(getAvatarId(),notes);
-}
-
-void LLPanelAvatarNotes::rightsConfirmationCallback(const LLSD& notification,
- const LLSD& response, S32 rights)
-{
- S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
- if (option == 0)
- {
- LLAvatarPropertiesProcessor::getInstance()->sendFriendRights(
- getAvatarId(), rights);
- }
- else
- {
- getChild<LLUICtrl>("objects_check")->setValue(
- getChild<LLUICtrl>("objects_check")->getValue().asBoolean() ? FALSE : TRUE);
- }
-}
-
-void LLPanelAvatarNotes::confirmModifyRights(bool grant, S32 rights)
-{
- LLSD args;
- args["NAME"] = LLSLURL("agent", getAvatarId(), "displayname").getSLURLString();
-
- if (grant)
- {
- LLNotificationsUtil::add("GrantModifyRights", args, LLSD(),
- boost::bind(&LLPanelAvatarNotes::rightsConfirmationCallback, this,
- _1, _2, rights));
- }
- else
- {
- LLNotificationsUtil::add("RevokeModifyRights", args, LLSD(),
- boost::bind(&LLPanelAvatarNotes::rightsConfirmationCallback, this,
- _1, _2, rights));
- }
-}
-
-void LLPanelAvatarNotes::onCommitRights()
-{
- const LLRelationship* buddy_relationship =
- LLAvatarTracker::instance().getBuddyInfo(getAvatarId());
-
- if (NULL == buddy_relationship)
- {
- // Lets have a warning log message instead of having a crash. EXT-4947.
- llwarns << "Trying to modify rights for non-friend avatar. Skipped." << llendl;
- return;
- }
-
-
- S32 rights = 0;
-
- if(getChild<LLUICtrl>("status_check")->getValue().asBoolean())
- rights |= LLRelationship::GRANT_ONLINE_STATUS;
- if(getChild<LLUICtrl>("map_check")->getValue().asBoolean())
- rights |= LLRelationship::GRANT_MAP_LOCATION;
- if(getChild<LLUICtrl>("objects_check")->getValue().asBoolean())
- rights |= LLRelationship::GRANT_MODIFY_OBJECTS;
-
- bool allow_modify_objects = getChild<LLUICtrl>("objects_check")->getValue().asBoolean();
-
- // if modify objects checkbox clicked
- if (buddy_relationship->isRightGrantedTo(
- LLRelationship::GRANT_MODIFY_OBJECTS) != allow_modify_objects)
- {
- confirmModifyRights(allow_modify_objects, rights);
- }
- // only one checkbox can trigger commit, so store the rest of rights
- else
- {
- LLAvatarPropertiesProcessor::getInstance()->sendFriendRights(
- getAvatarId(), rights);
- }
-}
-
-void LLPanelAvatarNotes::processProperties(void* data, EAvatarProcessorType type)
-{
- if(APT_NOTES == type)
- {
- LLAvatarNotes* avatar_notes = static_cast<LLAvatarNotes*>(data);
- if(avatar_notes && getAvatarId() == avatar_notes->target_id)
- {
- getChild<LLUICtrl>("notes_edit")->setValue(avatar_notes->notes);
- getChildView("notes edit")->setEnabled(true);
-
- LLAvatarPropertiesProcessor::getInstance()->removeObserver(getAvatarId(),this);
- }
- }
-}
-
-void LLPanelAvatarNotes::resetData()
-{
- getChild<LLUICtrl>("notes_edit")->setValue(LLStringUtil::null);
- // Default value is TRUE
- getChild<LLUICtrl>("status_check")->setValue(TRUE);
-}
-
-void LLPanelAvatarNotes::resetControls()
-{
- //Disable "Add Friend" button for friends.
- getChildView("add_friend")->setEnabled(TRUE);
-
- enableCheckboxes(false);
-}
-
-void LLPanelAvatarNotes::onAddFriendButtonClick()
-{
- LLAvatarActions::requestFriendshipDialog(getAvatarId());
-}
-
-void LLPanelAvatarNotes::onIMButtonClick()
-{
- LLAvatarActions::startIM(getAvatarId());
-}
-
-void LLPanelAvatarNotes::onTeleportButtonClick()
-{
- LLAvatarActions::offerTeleport(getAvatarId());
-}
-
-void LLPanelAvatarNotes::onCallButtonClick()
-{
- LLAvatarActions::startCall(getAvatarId());
-}
-
-void LLPanelAvatarNotes::onShareButtonClick()
-{
- //*TODO not implemented.
-}
-
-void LLPanelAvatarNotes::enableCheckboxes(bool enable)
-{
- getChildView("status_check")->setEnabled(enable);
- getChildView("map_check")->setEnabled(enable);
- getChildView("objects_check")->setEnabled(enable);
-}
-
-LLPanelAvatarNotes::~LLPanelAvatarNotes()
-{
- if(getAvatarId().notNull())
- {
- LLAvatarTracker::instance().removeParticularFriendObserver(getAvatarId(), this);
- if(LLVoiceClient::instanceExists())
- {
- LLVoiceClient::getInstance()->removeObserver((LLVoiceClientStatusObserver*)this);
- }
- }
-}
-
-// virtual, called by LLAvatarTracker
-void LLPanelAvatarNotes::changed(U32 mask)
-{
- getChildView("teleport")->setEnabled(LLAvatarTracker::instance().isBuddyOnline(getAvatarId()));
-
- // update rights to avoid have checkboxes enabled when friendship is terminated. EXT-4947.
- fillRightsData();
-}
-
-// virtual
-void LLPanelAvatarNotes::onChange(EStatusType status, const std::string &channelURI, bool proximal)
-{
- if(status == STATUS_JOINING || status == STATUS_LEFT_CHANNEL)
- {
- return;
- }
-
- getChildView("call")->setEnabled(LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking());
-}
-
-void LLPanelAvatarNotes::setAvatarId(const LLUUID& id)
-{
- if(id.notNull())
- {
- if(getAvatarId().notNull())
- {
- LLAvatarTracker::instance().removeParticularFriendObserver(getAvatarId(), this);
- }
- LLPanelProfileTab::setAvatarId(id);
- LLAvatarTracker::instance().addParticularFriendObserver(getAvatarId(), this);
- }
-}
-
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
@@ -458,406 +198,3 @@ void LLPanelProfileTab::updateButtons()
|| gAgent.isGodlike();
getChildView("show_on_map_btn")->setEnabled(enable_map_btn);
}
-
-//////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////
-
-bool enable_god()
-{
- return gAgent.isGodlike();
-}
-
-LLPanelAvatarProfile::LLPanelAvatarProfile()
-: LLPanelProfileTab()
-{
-}
-
-BOOL LLPanelAvatarProfile::postBuild()
-{
- childSetCommitCallback("add_friend",(boost::bind(&LLPanelAvatarProfile::onAddFriendButtonClick,this)),NULL);
- childSetCommitCallback("im",(boost::bind(&LLPanelAvatarProfile::onIMButtonClick,this)),NULL);
- childSetCommitCallback("call",(boost::bind(&LLPanelAvatarProfile::onCallButtonClick,this)),NULL);
- childSetCommitCallback("teleport",(boost::bind(&LLPanelAvatarProfile::onTeleportButtonClick,this)),NULL);
- childSetCommitCallback("overflow_btn", boost::bind(&LLPanelAvatarProfile::onOverflowButtonClicked, this), NULL);
- childSetCommitCallback("share",(boost::bind(&LLPanelAvatarProfile::onShareButtonClick,this)),NULL);
- childSetCommitCallback("show_on_map_btn", (boost::bind(
- &LLPanelAvatarProfile::onMapButtonClick, this)), NULL);
-
- LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
- registrar.add("Profile.ShowOnMap", boost::bind(&LLPanelAvatarProfile::onMapButtonClick, this));
- registrar.add("Profile.Pay", boost::bind(&LLPanelAvatarProfile::pay, this));
- registrar.add("Profile.Share", boost::bind(&LLPanelAvatarProfile::share, this));
- registrar.add("Profile.BlockUnblock", boost::bind(&LLPanelAvatarProfile::toggleBlock, this));
- registrar.add("Profile.Kick", boost::bind(&LLPanelAvatarProfile::kick, this));
- registrar.add("Profile.Freeze", boost::bind(&LLPanelAvatarProfile::freeze, this));
- registrar.add("Profile.Unfreeze", boost::bind(&LLPanelAvatarProfile::unfreeze, this));
- registrar.add("Profile.CSR", boost::bind(&LLPanelAvatarProfile::csr, this));
-
- LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable;
- enable.add("Profile.EnableShowOnMap", boost::bind(&LLPanelAvatarProfile::enableShowOnMap, this));
- enable.add("Profile.EnableGod", boost::bind(&enable_god));
- enable.add("Profile.EnableBlock", boost::bind(&LLPanelAvatarProfile::enableBlock, this));
- enable.add("Profile.EnableUnblock", boost::bind(&LLPanelAvatarProfile::enableUnblock, this));
-
- mProfileMenu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_profile_overflow.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
-
- LLVoiceClient::getInstance()->addObserver((LLVoiceClientStatusObserver*)this);
-
- resetControls();
- resetData();
-
- return TRUE;
-}
-
-void LLPanelAvatarProfile::onOpen(const LLSD& key)
-{
- LLPanelProfileTab::onOpen(key);
-
- mGroups.clear();
-
- //Disable "Add Friend" button for friends.
- getChildView("add_friend")->setEnabled(!LLAvatarActions::isFriend(getAvatarId()));
-}
-
-void LLPanelAvatarProfile::updateData()
-{
- if (getAvatarId().notNull())
- {
- LLAvatarPropertiesProcessor::getInstance()->
- sendAvatarPropertiesRequest(getAvatarId());
- LLAvatarPropertiesProcessor::getInstance()->
- sendAvatarGroupsRequest(getAvatarId());
- }
-}
-
-void LLPanelAvatarProfile::resetControls()
-{
- getChildView("status_panel")->setVisible( true);
- getChildView("profile_buttons_panel")->setVisible( true);
- getChildView("title_groups_text")->setVisible( true);
- getChildView("sl_groups")->setVisible( true);
- getChildView("add_friend")->setEnabled(true);
-
- getChildView("status_me_panel")->setVisible( false);
- getChildView("profile_me_buttons_panel")->setVisible( false);
- getChildView("account_actions_panel")->setVisible( false);
-}
-
-void LLPanelAvatarProfile::resetData()
-{
- mGroups.clear();
- getChild<LLUICtrl>("2nd_life_pic")->setValue(LLUUID::null);
- getChild<LLUICtrl>("real_world_pic")->setValue(LLUUID::null);
- getChild<LLUICtrl>("online_status")->setValue(LLStringUtil::null);
- getChild<LLUICtrl>("status_message")->setValue(LLStringUtil::null);
- getChild<LLUICtrl>("sl_description_edit")->setValue(LLStringUtil::null);
- getChild<LLUICtrl>("fl_description_edit")->setValue(LLStringUtil::null);
- getChild<LLUICtrl>("sl_groups")->setValue(LLStringUtil::null);
- getChild<LLUICtrl>("homepage_edit")->setValue(LLStringUtil::null);
- getChild<LLUICtrl>("register_date")->setValue(LLStringUtil::null);
- getChild<LLUICtrl>("acc_status_text")->setValue(LLStringUtil::null);
- getChild<LLUICtrl>("partner_text")->setValue(LLStringUtil::null);
-}
-
-void LLPanelAvatarProfile::processProperties(void* data, EAvatarProcessorType type)
-{
- if(APT_PROPERTIES == type)
- {
- const LLAvatarData* avatar_data = static_cast<const LLAvatarData*>(data);
- if(avatar_data && getAvatarId() == avatar_data->avatar_id)
- {
- processProfileProperties(avatar_data);
- }
- }
- else if(APT_GROUPS == type)
- {
- LLAvatarGroups* avatar_groups = static_cast<LLAvatarGroups*>(data);
- if(avatar_groups && getAvatarId() == avatar_groups->avatar_id)
- {
- processGroupProperties(avatar_groups);
- }
- }
-}
-
-void LLPanelAvatarProfile::processProfileProperties(const LLAvatarData* avatar_data)
-{
- fillCommonData(avatar_data);
-
- fillPartnerData(avatar_data);
-
- fillAccountStatus(avatar_data);
-}
-
-void LLPanelAvatarProfile::processGroupProperties(const LLAvatarGroups* avatar_groups)
-{
- // *NOTE dzaporozhan
- // Group properties may arrive in two callbacks, we need to save them across
- // different calls. We can't do that in textbox as textbox may change the text.
-
- LLAvatarGroups::group_list_t::const_iterator it = avatar_groups->group_list.begin();
- const LLAvatarGroups::group_list_t::const_iterator it_end = avatar_groups->group_list.end();
-
- for(; it_end != it; ++it)
- {
- LLAvatarGroups::LLGroupData group_data = *it;
- mGroups[group_data.group_name] = group_data.group_id;
- }
-
- // Creating string, containing group list
- std::string groups = "";
- for (group_map_t::iterator it = mGroups.begin(); it != mGroups.end(); ++it)
- {
- if (it != mGroups.begin())
- groups += ", ";
-
- std::string group_name = LLURI::escape(it->first);
- std::string group_url= it->second.notNull()
- ? "[secondlife:///app/group/" + it->second.asString() + "/about " + group_name + "]"
- : getString("no_group_text");
-
- groups += group_url;
- }
-
- getChild<LLUICtrl>("sl_groups")->setValue(groups);
-}
-
-void LLPanelAvatarProfile::fillCommonData(const LLAvatarData* avatar_data)
-{
- //remove avatar id from cache to get fresh info
- LLAvatarIconIDCache::getInstance()->remove(avatar_data->avatar_id);
-
- LLStringUtil::format_map_t args;
- {
- std::string birth_date = LLTrans::getString("AvatarBirthDateFormat");
- LLStringUtil::format(birth_date, LLSD().with("datetime", (S32) avatar_data->born_on.secondsSinceEpoch()));
- args["[REG_DATE]"] = birth_date;
- }
- args["[AGE]"] = LLDateUtil::ageFromDate( avatar_data->born_on, LLDate::now());
- std::string register_date = getString("RegisterDateFormat", args);
- getChild<LLUICtrl>("register_date")->setValue(register_date );
- getChild<LLUICtrl>("sl_description_edit")->setValue(avatar_data->about_text);
- getChild<LLUICtrl>("fl_description_edit")->setValue(avatar_data->fl_about_text);
- getChild<LLUICtrl>("2nd_life_pic")->setValue(avatar_data->image_id);
- getChild<LLUICtrl>("real_world_pic")->setValue(avatar_data->fl_image_id);
- getChild<LLUICtrl>("homepage_edit")->setValue(avatar_data->profile_url);
-
- // Hide home page textbox if no page was set to fix "homepage URL appears clickable without URL - EXT-4734"
- getChildView("homepage_edit")->setVisible( !avatar_data->profile_url.empty());
-}
-
-void LLPanelAvatarProfile::fillPartnerData(const LLAvatarData* avatar_data)
-{
- LLTextBox* partner_text = getChild<LLTextBox>("partner_text");
- if (avatar_data->partner_id.notNull())
- {
- partner_text->setText(LLSLURL("agent", avatar_data->partner_id, "inspect").getSLURLString());
- }
- else
- {
- partner_text->setText(getString("no_partner_text"));
- }
-}
-
-void LLPanelAvatarProfile::fillAccountStatus(const LLAvatarData* avatar_data)
-{
- LLStringUtil::format_map_t args;
- args["[ACCTTYPE]"] = LLAvatarPropertiesProcessor::accountType(avatar_data);
- args["[PAYMENTINFO]"] = LLAvatarPropertiesProcessor::paymentInfo(avatar_data);
- // *NOTE: AVATAR_AGEVERIFIED not currently getting set in
- // dataserver/lldataavatar.cpp for privacy considerations
- args["[AGEVERIFICATION]"] = "";
- std::string caption_text = getString("CaptionTextAcctInfo", args);
- getChild<LLUICtrl>("acc_status_text")->setValue(caption_text);
-}
-
-void LLPanelAvatarProfile::pay()
-{
- LLAvatarActions::pay(getAvatarId());
-}
-
-void LLPanelAvatarProfile::share()
-{
- LLAvatarActions::share(getAvatarId());
-}
-
-void LLPanelAvatarProfile::toggleBlock()
-{
- LLAvatarActions::toggleBlock(getAvatarId());
-}
-
-bool LLPanelAvatarProfile::enableShowOnMap()
-{
- bool is_buddy_online = LLAvatarTracker::instance().isBuddyOnline(getAvatarId());
-
- bool enable_map_btn = (is_buddy_online && is_agent_mappable(getAvatarId()))
- || gAgent.isGodlike();
- return enable_map_btn;
-}
-
-bool LLPanelAvatarProfile::enableBlock()
-{
- return LLAvatarActions::canBlock(getAvatarId()) && !LLAvatarActions::isBlocked(getAvatarId());
-}
-
-bool LLPanelAvatarProfile::enableUnblock()
-{
- return LLAvatarActions::isBlocked(getAvatarId());
-}
-
-void LLPanelAvatarProfile::kick()
-{
- LLAvatarActions::kick(getAvatarId());
-}
-
-void LLPanelAvatarProfile::freeze()
-{
- LLAvatarActions::freeze(getAvatarId());
-}
-
-void LLPanelAvatarProfile::unfreeze()
-{
- LLAvatarActions::unfreeze(getAvatarId());
-}
-
-void LLPanelAvatarProfile::csr()
-{
- std::string name;
- gCacheName->getFullName(getAvatarId(), name);
- LLAvatarActions::csr(getAvatarId(), name);
-}
-
-void LLPanelAvatarProfile::onAddFriendButtonClick()
-{
- LLAvatarActions::requestFriendshipDialog(getAvatarId());
-}
-
-void LLPanelAvatarProfile::onIMButtonClick()
-{
- LLAvatarActions::startIM(getAvatarId());
-}
-
-void LLPanelAvatarProfile::onTeleportButtonClick()
-{
- LLAvatarActions::offerTeleport(getAvatarId());
-}
-
-void LLPanelAvatarProfile::onCallButtonClick()
-{
- LLAvatarActions::startCall(getAvatarId());
-}
-
-void LLPanelAvatarProfile::onShareButtonClick()
-{
- //*TODO not implemented
-}
-
-void LLPanelAvatarProfile::onOverflowButtonClicked()
-{
- if (!mProfileMenu->toggleVisibility())
- return;
-
- LLView* btn = getChild<LLView>("overflow_btn");
-
- if (mProfileMenu->getButtonRect().isEmpty())
- {
- mProfileMenu->setButtonRect(btn);
- }
- mProfileMenu->updateParent(LLMenuGL::sMenuContainer);
-
- LLRect rect = btn->getRect();
- LLMenuGL::showPopup(this, mProfileMenu, rect.mRight, rect.mTop);
-}
-
-LLPanelAvatarProfile::~LLPanelAvatarProfile()
-{
- if(getAvatarId().notNull())
- {
- LLAvatarTracker::instance().removeParticularFriendObserver(getAvatarId(), this);
- if(LLVoiceClient::instanceExists())
- {
- LLVoiceClient::getInstance()->removeObserver((LLVoiceClientStatusObserver*)this);
- }
- }
-}
-
-// virtual, called by LLAvatarTracker
-void LLPanelAvatarProfile::changed(U32 mask)
-{
- getChildView("teleport")->setEnabled(LLAvatarTracker::instance().isBuddyOnline(getAvatarId()));
-}
-
-// virtual
-void LLPanelAvatarProfile::onChange(EStatusType status, const std::string &channelURI, bool proximal)
-{
- if(status == STATUS_JOINING || status == STATUS_LEFT_CHANNEL)
- {
- return;
- }
-
- getChildView("call")->setEnabled(LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking());
-}
-
-void LLPanelAvatarProfile::setAvatarId(const LLUUID& id)
-{
- if(id.notNull())
- {
- if(getAvatarId().notNull())
- {
- LLAvatarTracker::instance().removeParticularFriendObserver(getAvatarId(), this);
- }
- LLPanelProfileTab::setAvatarId(id);
- LLAvatarTracker::instance().addParticularFriendObserver(getAvatarId(), this);
- }
-}
-
-//////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////
-
-LLPanelMyProfile::LLPanelMyProfile()
-: LLPanelAvatarProfile()
-{
-}
-
-BOOL LLPanelMyProfile::postBuild()
-{
- LLPanelAvatarProfile::postBuild();
-
- childSetCommitCallback("status_me_message_text", boost::bind(&LLPanelMyProfile::onStatusMessageChanged, this), NULL);
-
- resetControls();
- resetData();
-
- return TRUE;
-}
-
-void LLPanelMyProfile::onOpen(const LLSD& key)
-{
- LLPanelProfileTab::onOpen(key);
-}
-
-void LLPanelMyProfile::processProfileProperties(const LLAvatarData* avatar_data)
-{
- fillCommonData(avatar_data);
-
- fillPartnerData(avatar_data);
-
- fillAccountStatus(avatar_data);
-}
-
-void LLPanelMyProfile::resetControls()
-{
- getChildView("status_panel")->setVisible( false);
- getChildView("profile_buttons_panel")->setVisible( false);
- getChildView("title_groups_text")->setVisible( false);
- getChildView("sl_groups")->setVisible( false);
- getChildView("status_me_panel")->setVisible( true);
- getChildView("profile_me_buttons_panel")->setVisible( true);
-}
-
-
-void LLPanelMyProfile::onStatusMessageChanged()
-{
- updateData();
-}
diff --git a/indra/newview/llpanelavatar.h b/indra/newview/llpanelavatar.h
index 11c7716322..e33a850cfa 100644
--- a/indra/newview/llpanelavatar.h
+++ b/indra/newview/llpanelavatar.h
@@ -31,19 +31,13 @@
#include "llavatarpropertiesprocessor.h"
#include "llcallingcard.h"
#include "llvoiceclient.h"
+#include "llavatarnamecache.h"
class LLComboBox;
class LLLineEditor;
-class LLToggleableMenu;
-
-enum EOnlineStatus
-{
- ONLINE_STATUS_NO = 0,
- ONLINE_STATUS_YES = 1
-};
/**
-* Base class for any Profile View or My Profile Panel.
+* Base class for any Profile View.
*/
class LLPanelProfileTab
: public LLPanel
@@ -111,189 +105,4 @@ private:
LLUUID mAvatarId;
};
-/**
-* Panel for displaying Avatar's first and second life related info.
-*/
-class LLPanelAvatarProfile
- : public LLPanelProfileTab
- , public LLFriendObserver
- , public LLVoiceClientStatusObserver
-{
-public:
- LLPanelAvatarProfile();
- /*virtual*/ ~LLPanelAvatarProfile();
-
- /*virtual*/ void onOpen(const LLSD& key);
-
- /**
- * LLFriendObserver trigger
- */
- virtual void changed(U32 mask);
-
- // Implements LLVoiceClientStatusObserver::onChange() to enable the call
- // button when voice is available
- /*virtual*/ void onChange(EStatusType status, const std::string &channelURI, bool proximal);
-
- /*virtual*/ void setAvatarId(const LLUUID& id);
-
- /**
- * Processes data received from server.
- */
- /*virtual*/ void processProperties(void* data, EAvatarProcessorType type);
-
- /*virtual*/ BOOL postBuild();
-
- /*virtual*/ void updateData();
-
- /*virtual*/ void resetControls();
-
- /*virtual*/ void resetData();
-
-protected:
-
- /**
- * Process profile related data received from server.
- */
- virtual void processProfileProperties(const LLAvatarData* avatar_data);
-
- /**
- * Processes group related data received from server.
- */
- virtual void processGroupProperties(const LLAvatarGroups* avatar_groups);
-
- /**
- * Fills common for Avatar profile and My Profile fields.
- */
- virtual void fillCommonData(const LLAvatarData* avatar_data);
-
- /**
- * Fills partner data.
- */
- virtual void fillPartnerData(const LLAvatarData* avatar_data);
-
- /**
- * Fills account status.
- */
- virtual void fillAccountStatus(const LLAvatarData* avatar_data);
-
- /**
- * Opens "Pay Resident" dialog.
- */
- void pay();
-
- /**
- * opens inventory and IM for sharing items
- */
- void share();
-
- /**
- * Add/remove resident to/from your block list.
- */
- void toggleBlock();
-
- void kick();
- void freeze();
- void unfreeze();
- void csr();
-
- bool enableShowOnMap();
- bool enableBlock();
- bool enableUnblock();
- bool enableGod();
-
-
- void onAddFriendButtonClick();
- void onIMButtonClick();
- void onCallButtonClick();
- void onTeleportButtonClick();
- void onShareButtonClick();
- void onOverflowButtonClicked();
-
-private:
-
- typedef std::map< std::string,LLUUID> group_map_t;
- group_map_t mGroups;
-
- LLToggleableMenu* mProfileMenu;
-};
-
-/**
- * Panel for displaying own first and second life related info.
- */
-class LLPanelMyProfile
- : public LLPanelAvatarProfile
-{
-public:
- LLPanelMyProfile();
-
- /*virtual*/ BOOL postBuild();
-
-protected:
-
- /*virtual*/ void onOpen(const LLSD& key);
-
- /*virtual*/ void processProfileProperties(const LLAvatarData* avatar_data);
-
- /*virtual*/ void resetControls();
-
-protected:
- void onStatusMessageChanged();
-};
-
-/**
- * Panel for displaying Avatar's notes and modifying friend's rights.
- */
-class LLPanelAvatarNotes
- : public LLPanelProfileTab
- , public LLFriendObserver
- , public LLVoiceClientStatusObserver
-{
-public:
- LLPanelAvatarNotes();
- /*virtual*/ ~LLPanelAvatarNotes();
-
- virtual void setAvatarId(const LLUUID& id);
-
- /**
- * LLFriendObserver trigger
- */
- virtual void changed(U32 mask);
-
- // Implements LLVoiceClientStatusObserver::onChange() to enable the call
- // button when voice is available
- /*virtual*/ void onChange(EStatusType status, const std::string &channelURI, bool proximal);
-
- /*virtual*/ void onOpen(const LLSD& key);
-
- /*virtual*/ BOOL postBuild();
-
- /*virtual*/ void processProperties(void* data, EAvatarProcessorType type);
-
- /*virtual*/ void updateData();
-
-protected:
-
- /*virtual*/ void resetControls();
-
- /*virtual*/ void resetData();
-
- /**
- * Fills rights data for friends.
- */
- void fillRightsData();
-
- void rightsConfirmationCallback(const LLSD& notification,
- const LLSD& response, S32 rights);
- void confirmModifyRights(bool grant, S32 rights);
- void onCommitRights();
- void onCommitNotes();
-
- void onAddFriendButtonClick();
- void onIMButtonClick();
- void onCallButtonClick();
- void onTeleportButtonClick();
- void onShareButtonClick();
- void enableCheckboxes(bool enable);
-};
-
#endif // LL_LLPANELAVATAR_H
diff --git a/indra/newview/llpanelblockedlist.cpp b/indra/newview/llpanelblockedlist.cpp
index 81e199d85b..5c85ec438c 100644
--- a/indra/newview/llpanelblockedlist.cpp
+++ b/indra/newview/llpanelblockedlist.cpp
@@ -37,7 +37,7 @@
// project include
#include "llfloateravatarpicker.h"
-#include "llsidetray.h"
+#include "llfloatersidepanelcontainer.h"
#include "llsidetraypanelcontainer.h"
static LLRegisterPanelClassWrapper<LLPanelBlockedList> t_panel_blocked_list("panel_block_list_sidetray");
@@ -99,7 +99,7 @@ void LLPanelBlockedList::selectBlocked(const LLUUID& mute_id)
void LLPanelBlockedList::showPanelAndSelect(const LLUUID& idToSelect)
{
- LLSideTray::getInstance()->showPanel("panel_block_list_sidetray", LLSD().with(BLOCKED_PARAM_NAME, idToSelect));
+ LLFloaterSidePanelContainer::showPanel("people", "panel_block_list_sidetray", LLSD().with(BLOCKED_PARAM_NAME, idToSelect));
}
diff --git a/indra/newview/llpanelcontents.cpp b/indra/newview/llpanelcontents.cpp
index bf3bf38863..a64b4ec94d 100644
--- a/indra/newview/llpanelcontents.cpp
+++ b/indra/newview/llpanelcontents.cpp
@@ -172,7 +172,7 @@ void LLPanelContents::onClickNewScript(void *userdata)
LLUUID::null,
LLAssetType::AT_LSL_TEXT,
LLInventoryType::IT_LSL,
- LLTrans::getString("PanelContentsNewScript"),
+ "New Script",
desc,
LLSaleInfo::DEFAULT,
LLInventoryItemFlags::II_FLAGS_NONE,
diff --git a/indra/newview/llpaneleditwearable.cpp b/indra/newview/llpaneleditwearable.cpp
index 90ed8b9e58..03404e816b 100644
--- a/indra/newview/llpaneleditwearable.cpp
+++ b/indra/newview/llpaneleditwearable.cpp
@@ -51,7 +51,7 @@
#include "llcolorswatch.h"
#include "lltexturectrl.h"
#include "lltextureentry.h"
-#include "llviewercontrol.h" // gSavedSettings
+#include "llviewercontrol.h" // gSavedSettings
#include "llviewertexturelist.h"
#include "llagentcamera.h"
#include "llmorphview.h"
@@ -65,36 +65,43 @@ static LLRegisterPanelClassWrapper<LLPanelEditWearable> t_edit_wearable("panel_e
// subparts of the UI for focus, camera position, etc.
enum ESubpart {
- SUBPART_SHAPE_HEAD = 1, // avoid 0
- SUBPART_SHAPE_EYES,
- SUBPART_SHAPE_EARS,
- SUBPART_SHAPE_NOSE,
- SUBPART_SHAPE_MOUTH,
- SUBPART_SHAPE_CHIN,
- SUBPART_SHAPE_TORSO,
- SUBPART_SHAPE_LEGS,
- SUBPART_SHAPE_WHOLE,
- SUBPART_SHAPE_DETAIL,
- SUBPART_SKIN_COLOR,
- SUBPART_SKIN_FACEDETAIL,
- SUBPART_SKIN_MAKEUP,
- SUBPART_SKIN_BODYDETAIL,
- SUBPART_HAIR_COLOR,
- SUBPART_HAIR_STYLE,
- SUBPART_HAIR_EYEBROWS,
- SUBPART_HAIR_FACIAL,
- SUBPART_EYES,
- SUBPART_SHIRT,
- SUBPART_PANTS,
- SUBPART_SHOES,
- SUBPART_SOCKS,
- SUBPART_JACKET,
- SUBPART_GLOVES,
- SUBPART_UNDERSHIRT,
- SUBPART_UNDERPANTS,
- SUBPART_SKIRT,
- SUBPART_ALPHA,
- SUBPART_TATTOO
+ SUBPART_SHAPE_HEAD = 1, // avoid 0
+ SUBPART_SHAPE_EYES,
+ SUBPART_SHAPE_EARS,
+ SUBPART_SHAPE_NOSE,
+ SUBPART_SHAPE_MOUTH,
+ SUBPART_SHAPE_CHIN,
+ SUBPART_SHAPE_TORSO,
+ SUBPART_SHAPE_LEGS,
+ SUBPART_SHAPE_WHOLE,
+ SUBPART_SHAPE_DETAIL,
+ SUBPART_SKIN_COLOR,
+ SUBPART_SKIN_FACEDETAIL,
+ SUBPART_SKIN_MAKEUP,
+ SUBPART_SKIN_BODYDETAIL,
+ SUBPART_HAIR_COLOR,
+ SUBPART_HAIR_STYLE,
+ SUBPART_HAIR_EYEBROWS,
+ SUBPART_HAIR_FACIAL,
+ SUBPART_EYES,
+ SUBPART_SHIRT,
+ SUBPART_PANTS,
+ SUBPART_SHOES,
+ SUBPART_SOCKS,
+ SUBPART_JACKET,
+ SUBPART_GLOVES,
+ SUBPART_UNDERSHIRT,
+ SUBPART_UNDERPANTS,
+ SUBPART_SKIRT,
+ SUBPART_ALPHA,
+ SUBPART_TATTOO,
+ SUBPART_PHYSICS_BREASTS_UPDOWN,
+ SUBPART_PHYSICS_BREASTS_INOUT,
+ SUBPART_PHYSICS_BREASTS_LEFTRIGHT,
+ SUBPART_PHYSICS_BELLY_UPDOWN,
+ SUBPART_PHYSICS_BUTT_UPDOWN,
+ SUBPART_PHYSICS_BUTT_LEFTRIGHT,
+ SUBPART_PHYSICS_ADVANCED,
};
using namespace LLVOAvatarDefines;
@@ -105,102 +112,102 @@ typedef std::vector<ESubpart> subpart_vec_t;
class LLEditWearableDictionary : public LLSingleton<LLEditWearableDictionary>
{
- //--------------------------------------------------------------------
- // Constructors and Destructors
- //--------------------------------------------------------------------
+ //--------------------------------------------------------------------
+ // Constructors and Destructors
+ //--------------------------------------------------------------------
public:
- LLEditWearableDictionary();
- virtual ~LLEditWearableDictionary();
-
- //--------------------------------------------------------------------
- // Wearable Types
- //--------------------------------------------------------------------
+ LLEditWearableDictionary();
+ virtual ~LLEditWearableDictionary();
+
+ //--------------------------------------------------------------------
+ // Wearable Types
+ //--------------------------------------------------------------------
public:
- struct WearableEntry : public LLDictionaryEntry
- {
- WearableEntry(LLWearableType::EType type,
- const std::string &title,
- const std::string &desc_title,
- U8 num_color_swatches, // number of 'color_swatches'
- U8 num_texture_pickers, // number of 'texture_pickers'
- U8 num_subparts, ... ); // number of subparts followed by a list of ETextureIndex and ESubparts
-
-
- const LLWearableType::EType mWearableType;
- const std::string mTitle;
- const std::string mDescTitle;
- subpart_vec_t mSubparts;
- texture_vec_t mColorSwatchCtrls;
- texture_vec_t mTextureCtrls;
- };
-
- struct Wearables : public LLDictionary<LLWearableType::EType, WearableEntry>
- {
- Wearables();
- } mWearables;
-
- const WearableEntry* getWearable(LLWearableType::EType type) const { return mWearables.lookup(type); }
-
- //--------------------------------------------------------------------
- // Subparts
- //--------------------------------------------------------------------
+ struct WearableEntry : public LLDictionaryEntry
+ {
+ WearableEntry(LLWearableType::EType type,
+ const std::string &title,
+ const std::string &desc_title,
+ U8 num_color_swatches, // number of 'color_swatches'
+ U8 num_texture_pickers, // number of 'texture_pickers'
+ U8 num_subparts, ... ); // number of subparts followed by a list of ETextureIndex and ESubparts
+
+
+ const LLWearableType::EType mWearableType;
+ const std::string mTitle;
+ const std::string mDescTitle;
+ subpart_vec_t mSubparts;
+ texture_vec_t mColorSwatchCtrls;
+ texture_vec_t mTextureCtrls;
+ };
+
+ struct Wearables : public LLDictionary<LLWearableType::EType, WearableEntry>
+ {
+ Wearables();
+ } mWearables;
+
+ const WearableEntry* getWearable(LLWearableType::EType type) const { return mWearables.lookup(type); }
+
+ //--------------------------------------------------------------------
+ // Subparts
+ //--------------------------------------------------------------------
public:
- struct SubpartEntry : public LLDictionaryEntry
- {
- SubpartEntry(ESubpart part,
- const std::string &joint,
- const std::string &edit_group,
- const std::string &param_list,
- const std::string &accordion_tab,
- const LLVector3d &target_offset,
- const LLVector3d &camera_offset,
- const ESex &sex);
-
- ESubpart mSubpart;
- std::string mTargetJoint;
- std::string mEditGroup;
- std::string mParamList;
- std::string mAccordionTab;
- LLVector3d mTargetOffset;
- LLVector3d mCameraOffset;
- ESex mSex;
- };
-
- struct Subparts : public LLDictionary<ESubpart, SubpartEntry>
- {
- Subparts();
- } mSubparts;
-
- const SubpartEntry* getSubpart(ESubpart subpart) const { return mSubparts.lookup(subpart); }
-
- //--------------------------------------------------------------------
- // Picker Control Entries
- //--------------------------------------------------------------------
+ struct SubpartEntry : public LLDictionaryEntry
+ {
+ SubpartEntry(ESubpart part,
+ const std::string &joint,
+ const std::string &edit_group,
+ const std::string &param_list,
+ const std::string &accordion_tab,
+ const LLVector3d &target_offset,
+ const LLVector3d &camera_offset,
+ const ESex &sex);
+
+ ESubpart mSubpart;
+ std::string mTargetJoint;
+ std::string mEditGroup;
+ std::string mParamList;
+ std::string mAccordionTab;
+ LLVector3d mTargetOffset;
+ LLVector3d mCameraOffset;
+ ESex mSex;
+ };
+
+ struct Subparts : public LLDictionary<ESubpart, SubpartEntry>
+ {
+ Subparts();
+ } mSubparts;
+
+ const SubpartEntry* getSubpart(ESubpart subpart) const { return mSubparts.lookup(subpart); }
+
+ //--------------------------------------------------------------------
+ // Picker Control Entries
+ //--------------------------------------------------------------------
public:
- struct PickerControlEntry : public LLDictionaryEntry
- {
- PickerControlEntry(ETextureIndex tex_index,
- const std::string name,
- const LLUUID default_image_id = LLUUID::null,
- const bool allow_no_texture = false);
- ETextureIndex mTextureIndex;
- const std::string mControlName;
- const LLUUID mDefaultImageId;
- const bool mAllowNoTexture;
- };
-
- struct ColorSwatchCtrls : public LLDictionary<ETextureIndex, PickerControlEntry>
- {
- ColorSwatchCtrls();
- } mColorSwatchCtrls;
-
- struct TextureCtrls : public LLDictionary<ETextureIndex, PickerControlEntry>
- {
- TextureCtrls();
- } mTextureCtrls;
-
- const PickerControlEntry* getTexturePicker(ETextureIndex index) const { return mTextureCtrls.lookup(index); }
- const PickerControlEntry* getColorSwatch(ETextureIndex index) const { return mColorSwatchCtrls.lookup(index); }
+ struct PickerControlEntry : public LLDictionaryEntry
+ {
+ PickerControlEntry(ETextureIndex tex_index,
+ const std::string name,
+ const LLUUID default_image_id = LLUUID::null,
+ const bool allow_no_texture = false);
+ ETextureIndex mTextureIndex;
+ const std::string mControlName;
+ const LLUUID mDefaultImageId;
+ const bool mAllowNoTexture;
+ };
+
+ struct ColorSwatchCtrls : public LLDictionary<ETextureIndex, PickerControlEntry>
+ {
+ ColorSwatchCtrls();
+ } mColorSwatchCtrls;
+
+ struct TextureCtrls : public LLDictionary<ETextureIndex, PickerControlEntry>
+ {
+ TextureCtrls();
+ } mTextureCtrls;
+
+ const PickerControlEntry* getTexturePicker(ETextureIndex index) const { return mTextureCtrls.lookup(index); }
+ const PickerControlEntry* getColorSwatch(ETextureIndex index) const { return mColorSwatchCtrls.lookup(index); }
};
LLEditWearableDictionary::LLEditWearableDictionary()
@@ -215,166 +222,174 @@ LLEditWearableDictionary::~LLEditWearableDictionary()
LLEditWearableDictionary::Wearables::Wearables()
{
- // note the subpart that is listed first is treated as "default", regardless of what order is in enum.
- // Please match the order presented in XUI. -Nyx
- // this will affect what camera angle is shown when first editing a wearable
- addEntry(LLWearableType::WT_SHAPE, new WearableEntry(LLWearableType::WT_SHAPE,"edit_shape_title","shape_desc_text",0,0,9, SUBPART_SHAPE_WHOLE, SUBPART_SHAPE_HEAD, SUBPART_SHAPE_EYES, SUBPART_SHAPE_EARS, SUBPART_SHAPE_NOSE, SUBPART_SHAPE_MOUTH, SUBPART_SHAPE_CHIN, SUBPART_SHAPE_TORSO, SUBPART_SHAPE_LEGS ));
- addEntry(LLWearableType::WT_SKIN, new WearableEntry(LLWearableType::WT_SKIN,"edit_skin_title","skin_desc_text",0,3,4, TEX_HEAD_BODYPAINT, TEX_UPPER_BODYPAINT, TEX_LOWER_BODYPAINT, SUBPART_SKIN_COLOR, SUBPART_SKIN_FACEDETAIL, SUBPART_SKIN_MAKEUP, SUBPART_SKIN_BODYDETAIL));
- addEntry(LLWearableType::WT_HAIR, new WearableEntry(LLWearableType::WT_HAIR,"edit_hair_title","hair_desc_text",0,1,4, TEX_HAIR, SUBPART_HAIR_COLOR, SUBPART_HAIR_STYLE, SUBPART_HAIR_EYEBROWS, SUBPART_HAIR_FACIAL));
- addEntry(LLWearableType::WT_EYES, new WearableEntry(LLWearableType::WT_EYES,"edit_eyes_title","eyes_desc_text",0,1,1, TEX_EYES_IRIS, SUBPART_EYES));
- addEntry(LLWearableType::WT_SHIRT, new WearableEntry(LLWearableType::WT_SHIRT,"edit_shirt_title","shirt_desc_text",1,1,1, TEX_UPPER_SHIRT, TEX_UPPER_SHIRT, SUBPART_SHIRT));
- addEntry(LLWearableType::WT_PANTS, new WearableEntry(LLWearableType::WT_PANTS,"edit_pants_title","pants_desc_text",1,1,1, TEX_LOWER_PANTS, TEX_LOWER_PANTS, SUBPART_PANTS));
- addEntry(LLWearableType::WT_SHOES, new WearableEntry(LLWearableType::WT_SHOES,"edit_shoes_title","shoes_desc_text",1,1,1, TEX_LOWER_SHOES, TEX_LOWER_SHOES, SUBPART_SHOES));
- addEntry(LLWearableType::WT_SOCKS, new WearableEntry(LLWearableType::WT_SOCKS,"edit_socks_title","socks_desc_text",1,1,1, TEX_LOWER_SOCKS, TEX_LOWER_SOCKS, SUBPART_SOCKS));
- addEntry(LLWearableType::WT_JACKET, new WearableEntry(LLWearableType::WT_JACKET,"edit_jacket_title","jacket_desc_text",1,2,1, TEX_UPPER_JACKET, TEX_UPPER_JACKET, TEX_LOWER_JACKET, SUBPART_JACKET));
- addEntry(LLWearableType::WT_GLOVES, new WearableEntry(LLWearableType::WT_GLOVES,"edit_gloves_title","gloves_desc_text",1,1,1, TEX_UPPER_GLOVES, TEX_UPPER_GLOVES, SUBPART_GLOVES));
- addEntry(LLWearableType::WT_UNDERSHIRT, new WearableEntry(LLWearableType::WT_UNDERSHIRT,"edit_undershirt_title","undershirt_desc_text",1,1,1, TEX_UPPER_UNDERSHIRT, TEX_UPPER_UNDERSHIRT, SUBPART_UNDERSHIRT));
- addEntry(LLWearableType::WT_UNDERPANTS, new WearableEntry(LLWearableType::WT_UNDERPANTS,"edit_underpants_title","underpants_desc_text",1,1,1, TEX_LOWER_UNDERPANTS, TEX_LOWER_UNDERPANTS, SUBPART_UNDERPANTS));
- addEntry(LLWearableType::WT_SKIRT, new WearableEntry(LLWearableType::WT_SKIRT,"edit_skirt_title","skirt_desc_text",1,1,1, TEX_SKIRT, TEX_SKIRT, SUBPART_SKIRT));
- addEntry(LLWearableType::WT_ALPHA, new WearableEntry(LLWearableType::WT_ALPHA,"edit_alpha_title","alpha_desc_text",0,5,1, TEX_LOWER_ALPHA, TEX_UPPER_ALPHA, TEX_HEAD_ALPHA, TEX_EYES_ALPHA, TEX_HAIR_ALPHA, SUBPART_ALPHA));
- addEntry(LLWearableType::WT_TATTOO, new WearableEntry(LLWearableType::WT_TATTOO,"edit_tattoo_title","tattoo_desc_text",1,3,1, TEX_HEAD_TATTOO, TEX_LOWER_TATTOO, TEX_UPPER_TATTOO, TEX_HEAD_TATTOO, SUBPART_TATTOO));
+ // note the subpart that is listed first is treated as "default", regardless of what order is in enum.
+ // Please match the order presented in XUI. -Nyx
+ // this will affect what camera angle is shown when first editing a wearable
+ addEntry(LLWearableType::WT_SHAPE, new WearableEntry(LLWearableType::WT_SHAPE,"edit_shape_title","shape_desc_text",0,0,9, SUBPART_SHAPE_WHOLE, SUBPART_SHAPE_HEAD, SUBPART_SHAPE_EYES, SUBPART_SHAPE_EARS, SUBPART_SHAPE_NOSE, SUBPART_SHAPE_MOUTH, SUBPART_SHAPE_CHIN, SUBPART_SHAPE_TORSO, SUBPART_SHAPE_LEGS));
+ addEntry(LLWearableType::WT_SKIN, new WearableEntry(LLWearableType::WT_SKIN,"edit_skin_title","skin_desc_text",0,3,4, TEX_HEAD_BODYPAINT, TEX_UPPER_BODYPAINT, TEX_LOWER_BODYPAINT, SUBPART_SKIN_COLOR, SUBPART_SKIN_FACEDETAIL, SUBPART_SKIN_MAKEUP, SUBPART_SKIN_BODYDETAIL));
+ addEntry(LLWearableType::WT_HAIR, new WearableEntry(LLWearableType::WT_HAIR,"edit_hair_title","hair_desc_text",0,1,4, TEX_HAIR, SUBPART_HAIR_COLOR, SUBPART_HAIR_STYLE, SUBPART_HAIR_EYEBROWS, SUBPART_HAIR_FACIAL));
+ addEntry(LLWearableType::WT_EYES, new WearableEntry(LLWearableType::WT_EYES,"edit_eyes_title","eyes_desc_text",0,1,1, TEX_EYES_IRIS, SUBPART_EYES));
+ addEntry(LLWearableType::WT_SHIRT, new WearableEntry(LLWearableType::WT_SHIRT,"edit_shirt_title","shirt_desc_text",1,1,1, TEX_UPPER_SHIRT, TEX_UPPER_SHIRT, SUBPART_SHIRT));
+ addEntry(LLWearableType::WT_PANTS, new WearableEntry(LLWearableType::WT_PANTS,"edit_pants_title","pants_desc_text",1,1,1, TEX_LOWER_PANTS, TEX_LOWER_PANTS, SUBPART_PANTS));
+ addEntry(LLWearableType::WT_SHOES, new WearableEntry(LLWearableType::WT_SHOES,"edit_shoes_title","shoes_desc_text",1,1,1, TEX_LOWER_SHOES, TEX_LOWER_SHOES, SUBPART_SHOES));
+ addEntry(LLWearableType::WT_SOCKS, new WearableEntry(LLWearableType::WT_SOCKS,"edit_socks_title","socks_desc_text",1,1,1, TEX_LOWER_SOCKS, TEX_LOWER_SOCKS, SUBPART_SOCKS));
+ addEntry(LLWearableType::WT_JACKET, new WearableEntry(LLWearableType::WT_JACKET,"edit_jacket_title","jacket_desc_text",1,2,1, TEX_UPPER_JACKET, TEX_UPPER_JACKET, TEX_LOWER_JACKET, SUBPART_JACKET));
+ addEntry(LLWearableType::WT_GLOVES, new WearableEntry(LLWearableType::WT_GLOVES,"edit_gloves_title","gloves_desc_text",1,1,1, TEX_UPPER_GLOVES, TEX_UPPER_GLOVES, SUBPART_GLOVES));
+ addEntry(LLWearableType::WT_UNDERSHIRT, new WearableEntry(LLWearableType::WT_UNDERSHIRT,"edit_undershirt_title","undershirt_desc_text",1,1,1, TEX_UPPER_UNDERSHIRT, TEX_UPPER_UNDERSHIRT, SUBPART_UNDERSHIRT));
+ addEntry(LLWearableType::WT_UNDERPANTS, new WearableEntry(LLWearableType::WT_UNDERPANTS,"edit_underpants_title","underpants_desc_text",1,1,1, TEX_LOWER_UNDERPANTS, TEX_LOWER_UNDERPANTS, SUBPART_UNDERPANTS));
+ addEntry(LLWearableType::WT_SKIRT, new WearableEntry(LLWearableType::WT_SKIRT,"edit_skirt_title","skirt_desc_text",1,1,1, TEX_SKIRT, TEX_SKIRT, SUBPART_SKIRT));
+ addEntry(LLWearableType::WT_ALPHA, new WearableEntry(LLWearableType::WT_ALPHA,"edit_alpha_title","alpha_desc_text",0,5,1, TEX_LOWER_ALPHA, TEX_UPPER_ALPHA, TEX_HEAD_ALPHA, TEX_EYES_ALPHA, TEX_HAIR_ALPHA, SUBPART_ALPHA));
+ addEntry(LLWearableType::WT_TATTOO, new WearableEntry(LLWearableType::WT_TATTOO,"edit_tattoo_title","tattoo_desc_text",1,3,1, TEX_HEAD_TATTOO, TEX_LOWER_TATTOO, TEX_UPPER_TATTOO, TEX_HEAD_TATTOO, SUBPART_TATTOO));
+ addEntry(LLWearableType::WT_PHYSICS, new WearableEntry(LLWearableType::WT_PHYSICS,"edit_physics_title","physics_desc_text",0,0,7, SUBPART_PHYSICS_BREASTS_UPDOWN, SUBPART_PHYSICS_BREASTS_INOUT, SUBPART_PHYSICS_BREASTS_LEFTRIGHT, SUBPART_PHYSICS_BELLY_UPDOWN, SUBPART_PHYSICS_BUTT_UPDOWN, SUBPART_PHYSICS_BUTT_LEFTRIGHT, SUBPART_PHYSICS_ADVANCED));
}
LLEditWearableDictionary::WearableEntry::WearableEntry(LLWearableType::EType type,
- const std::string &title,
- const std::string &desc_title,
- U8 num_color_swatches,
- U8 num_texture_pickers,
- U8 num_subparts, ... ) :
- LLDictionaryEntry(title),
- mWearableType(type),
- mTitle(title),
- mDescTitle(desc_title)
-{
- va_list argp;
- va_start(argp, num_subparts);
-
- for (U8 i = 0; i < num_color_swatches; ++i)
- {
- ETextureIndex index = (ETextureIndex)va_arg(argp,int);
- mColorSwatchCtrls.push_back(index);
- }
-
- for (U8 i = 0; i < num_texture_pickers; ++i)
- {
- ETextureIndex index = (ETextureIndex)va_arg(argp,int);
- mTextureCtrls.push_back(index);
- }
-
- for (U8 i = 0; i < num_subparts; ++i)
- {
- ESubpart part = (ESubpart)va_arg(argp,int);
- mSubparts.push_back(part);
- }
+ const std::string &title,
+ const std::string &desc_title,
+ U8 num_color_swatches,
+ U8 num_texture_pickers,
+ U8 num_subparts, ... ) :
+ LLDictionaryEntry(title),
+ mWearableType(type),
+ mTitle(title),
+ mDescTitle(desc_title)
+{
+ va_list argp;
+ va_start(argp, num_subparts);
+
+ for (U8 i = 0; i < num_color_swatches; ++i)
+ {
+ ETextureIndex index = (ETextureIndex)va_arg(argp,int);
+ mColorSwatchCtrls.push_back(index);
+ }
+
+ for (U8 i = 0; i < num_texture_pickers; ++i)
+ {
+ ETextureIndex index = (ETextureIndex)va_arg(argp,int);
+ mTextureCtrls.push_back(index);
+ }
+
+ for (U8 i = 0; i < num_subparts; ++i)
+ {
+ ESubpart part = (ESubpart)va_arg(argp,int);
+ mSubparts.push_back(part);
+ }
}
LLEditWearableDictionary::Subparts::Subparts()
{
- addEntry(SUBPART_SHAPE_WHOLE, new SubpartEntry(SUBPART_SHAPE_WHOLE, "mPelvis", "shape_body","shape_body_param_list", "shape_body_tab", LLVector3d(0.f, 0.f, 0.1f), LLVector3d(-2.5f, 0.5f, 0.8f),SEX_BOTH));
- addEntry(SUBPART_SHAPE_HEAD, new SubpartEntry(SUBPART_SHAPE_HEAD, "mHead", "shape_head", "shape_head_param_list", "shape_head_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH));
- addEntry(SUBPART_SHAPE_EYES, new SubpartEntry(SUBPART_SHAPE_EYES, "mHead", "shape_eyes", "shape_eyes_param_list", "shape_eyes_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH));
- addEntry(SUBPART_SHAPE_EARS, new SubpartEntry(SUBPART_SHAPE_EARS, "mHead", "shape_ears", "shape_ears_param_list", "shape_ears_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH));
- addEntry(SUBPART_SHAPE_NOSE, new SubpartEntry(SUBPART_SHAPE_NOSE, "mHead", "shape_nose", "shape_nose_param_list", "shape_nose_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH));
- addEntry(SUBPART_SHAPE_MOUTH, new SubpartEntry(SUBPART_SHAPE_MOUTH, "mHead", "shape_mouth", "shape_mouth_param_list", "shape_mouth_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH));
- addEntry(SUBPART_SHAPE_CHIN, new SubpartEntry(SUBPART_SHAPE_CHIN, "mHead", "shape_chin", "shape_chin_param_list", "shape_chin_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH));
- addEntry(SUBPART_SHAPE_TORSO, new SubpartEntry(SUBPART_SHAPE_TORSO, "mTorso", "shape_torso", "shape_torso_param_list", "shape_torso_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(-1.f, 0.15f, 0.3f),SEX_BOTH));
- addEntry(SUBPART_SHAPE_LEGS, new SubpartEntry(SUBPART_SHAPE_LEGS, "mPelvis", "shape_legs", "shape_legs_param_list", "shape_legs_tab", LLVector3d(0.f, 0.f, -0.5f), LLVector3d(-1.6f, 0.15f, -0.5f),SEX_BOTH));
-
- addEntry(SUBPART_SKIN_COLOR, new SubpartEntry(SUBPART_SKIN_COLOR, "mHead", "skin_color", "skin_color_param_list", "skin_color_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH));
- addEntry(SUBPART_SKIN_FACEDETAIL, new SubpartEntry(SUBPART_SKIN_FACEDETAIL, "mHead", "skin_facedetail", "skin_face_param_list", "skin_face_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH));
- addEntry(SUBPART_SKIN_MAKEUP, new SubpartEntry(SUBPART_SKIN_MAKEUP, "mHead", "skin_makeup", "skin_makeup_param_list", "skin_makeup_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH));
- addEntry(SUBPART_SKIN_BODYDETAIL, new SubpartEntry(SUBPART_SKIN_BODYDETAIL, "mPelvis", "skin_bodydetail", "skin_body_param_list", "skin_body_tab", LLVector3d(0.f, 0.f, -0.2f), LLVector3d(-2.5f, 0.5f, 0.5f),SEX_BOTH));
-
- addEntry(SUBPART_HAIR_COLOR, new SubpartEntry(SUBPART_HAIR_COLOR, "mHead", "hair_color", "hair_color_param_list", "hair_color_tab", LLVector3d(0.f, 0.f, 0.10f), LLVector3d(-0.4f, 0.05f, 0.10f),SEX_BOTH));
- addEntry(SUBPART_HAIR_STYLE, new SubpartEntry(SUBPART_HAIR_STYLE, "mHead", "hair_style", "hair_style_param_list", "hair_style_tab", LLVector3d(0.f, 0.f, 0.10f), LLVector3d(-0.4f, 0.05f, 0.10f),SEX_BOTH));
- addEntry(SUBPART_HAIR_EYEBROWS, new SubpartEntry(SUBPART_HAIR_EYEBROWS, "mHead", "hair_eyebrows", "hair_eyebrows_param_list", "hair_eyebrows_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH));
- addEntry(SUBPART_HAIR_FACIAL, new SubpartEntry(SUBPART_HAIR_FACIAL, "mHead", "hair_facial", "hair_facial_param_list", "hair_facial_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_MALE));
-
- addEntry(SUBPART_EYES, new SubpartEntry(SUBPART_EYES, "mHead", "eyes", "eyes_main_param_list", "eyes_main_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH));
-
- addEntry(SUBPART_SHIRT, new SubpartEntry(SUBPART_SHIRT, "mTorso", "shirt", "shirt_main_param_list", "shirt_main_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(-1.f, 0.15f, 0.3f),SEX_BOTH));
- addEntry(SUBPART_PANTS, new SubpartEntry(SUBPART_PANTS, "mPelvis", "pants", "pants_main_param_list", "pants_main_tab", LLVector3d(0.f, 0.f, -0.5f), LLVector3d(-1.6f, 0.15f, -0.5f),SEX_BOTH));
- addEntry(SUBPART_SHOES, new SubpartEntry(SUBPART_SHOES, "mPelvis", "shoes", "shoes_main_param_list", "shoes_main_tab", LLVector3d(0.f, 0.f, -0.5f), LLVector3d(-1.6f, 0.15f, -0.5f),SEX_BOTH));
- addEntry(SUBPART_SOCKS, new SubpartEntry(SUBPART_SOCKS, "mPelvis", "socks", "socks_main_param_list", "socks_main_tab", LLVector3d(0.f, 0.f, -0.5f), LLVector3d(-1.6f, 0.15f, -0.5f),SEX_BOTH));
- addEntry(SUBPART_JACKET, new SubpartEntry(SUBPART_JACKET, "mTorso", "jacket", "jacket_main_param_list", "jacket_main_tab", LLVector3d(0.f, 0.f, 0.f), LLVector3d(-2.f, 0.1f, 0.3f),SEX_BOTH));
- addEntry(SUBPART_SKIRT, new SubpartEntry(SUBPART_SKIRT, "mPelvis", "skirt", "skirt_main_param_list", "skirt_main_tab", LLVector3d(0.f, 0.f, -0.5f), LLVector3d(-1.6f, 0.15f, -0.5f),SEX_BOTH));
- addEntry(SUBPART_GLOVES, new SubpartEntry(SUBPART_GLOVES, "mTorso", "gloves", "gloves_main_param_list", "gloves_main_tab", LLVector3d(0.f, 0.f, 0.f), LLVector3d(-1.f, 0.15f, 0.f),SEX_BOTH));
- addEntry(SUBPART_UNDERSHIRT, new SubpartEntry(SUBPART_UNDERSHIRT, "mTorso", "undershirt", "undershirt_main_param_list", "undershirt_main_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(-1.f, 0.15f, 0.3f),SEX_BOTH));
- addEntry(SUBPART_UNDERPANTS, new SubpartEntry(SUBPART_UNDERPANTS, "mPelvis", "underpants", "underpants_main_param_list", "underpants_main_tab", LLVector3d(0.f, 0.f, -0.5f), LLVector3d(-1.6f, 0.15f, -0.5f),SEX_BOTH));
- addEntry(SUBPART_ALPHA, new SubpartEntry(SUBPART_ALPHA, "mPelvis", "alpha", "alpha_main_param_list", "alpha_main_tab", LLVector3d(0.f, 0.f, 0.1f), LLVector3d(-2.5f, 0.5f, 0.8f),SEX_BOTH));
- addEntry(SUBPART_TATTOO, new SubpartEntry(SUBPART_TATTOO, "mPelvis", "tattoo", "tattoo_main_param_list", "tattoo_main_tab", LLVector3d(0.f, 0.f, 0.1f), LLVector3d(-2.5f, 0.5f, 0.8f),SEX_BOTH));
+ addEntry(SUBPART_SHAPE_WHOLE, new SubpartEntry(SUBPART_SHAPE_WHOLE, "mPelvis", "shape_body","shape_body_param_list", "shape_body_tab", LLVector3d(0.f, 0.f, 0.1f), LLVector3d(-2.5f, 0.5f, 0.8f),SEX_BOTH));
+ addEntry(SUBPART_SHAPE_HEAD, new SubpartEntry(SUBPART_SHAPE_HEAD, "mHead", "shape_head", "shape_head_param_list", "shape_head_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH));
+ addEntry(SUBPART_SHAPE_EYES, new SubpartEntry(SUBPART_SHAPE_EYES, "mHead", "shape_eyes", "shape_eyes_param_list", "shape_eyes_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH));
+ addEntry(SUBPART_SHAPE_EARS, new SubpartEntry(SUBPART_SHAPE_EARS, "mHead", "shape_ears", "shape_ears_param_list", "shape_ears_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH));
+ addEntry(SUBPART_SHAPE_NOSE, new SubpartEntry(SUBPART_SHAPE_NOSE, "mHead", "shape_nose", "shape_nose_param_list", "shape_nose_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH));
+ addEntry(SUBPART_SHAPE_MOUTH, new SubpartEntry(SUBPART_SHAPE_MOUTH, "mHead", "shape_mouth", "shape_mouth_param_list", "shape_mouth_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH));
+ addEntry(SUBPART_SHAPE_CHIN, new SubpartEntry(SUBPART_SHAPE_CHIN, "mHead", "shape_chin", "shape_chin_param_list", "shape_chin_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH));
+ addEntry(SUBPART_SHAPE_TORSO, new SubpartEntry(SUBPART_SHAPE_TORSO, "mTorso", "shape_torso", "shape_torso_param_list", "shape_torso_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(-1.f, 0.15f, 0.3f),SEX_BOTH));
+ addEntry(SUBPART_SHAPE_LEGS, new SubpartEntry(SUBPART_SHAPE_LEGS, "mPelvis", "shape_legs", "shape_legs_param_list", "shape_legs_tab", LLVector3d(0.f, 0.f, -0.5f), LLVector3d(-1.6f, 0.15f, -0.5f),SEX_BOTH));
+
+ addEntry(SUBPART_SKIN_COLOR, new SubpartEntry(SUBPART_SKIN_COLOR, "mHead", "skin_color", "skin_color_param_list", "skin_color_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH));
+ addEntry(SUBPART_SKIN_FACEDETAIL, new SubpartEntry(SUBPART_SKIN_FACEDETAIL, "mHead", "skin_facedetail", "skin_face_param_list", "skin_face_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH));
+ addEntry(SUBPART_SKIN_MAKEUP, new SubpartEntry(SUBPART_SKIN_MAKEUP, "mHead", "skin_makeup", "skin_makeup_param_list", "skin_makeup_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH));
+ addEntry(SUBPART_SKIN_BODYDETAIL, new SubpartEntry(SUBPART_SKIN_BODYDETAIL, "mPelvis", "skin_bodydetail", "skin_body_param_list", "skin_body_tab", LLVector3d(0.f, 0.f, -0.2f), LLVector3d(-2.5f, 0.5f, 0.5f),SEX_BOTH));
+
+ addEntry(SUBPART_HAIR_COLOR, new SubpartEntry(SUBPART_HAIR_COLOR, "mHead", "hair_color", "hair_color_param_list", "hair_color_tab", LLVector3d(0.f, 0.f, 0.10f), LLVector3d(-0.4f, 0.05f, 0.10f),SEX_BOTH));
+ addEntry(SUBPART_HAIR_STYLE, new SubpartEntry(SUBPART_HAIR_STYLE, "mHead", "hair_style", "hair_style_param_list", "hair_style_tab", LLVector3d(0.f, 0.f, 0.10f), LLVector3d(-0.4f, 0.05f, 0.10f),SEX_BOTH));
+ addEntry(SUBPART_HAIR_EYEBROWS, new SubpartEntry(SUBPART_HAIR_EYEBROWS, "mHead", "hair_eyebrows", "hair_eyebrows_param_list", "hair_eyebrows_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH));
+ addEntry(SUBPART_HAIR_FACIAL, new SubpartEntry(SUBPART_HAIR_FACIAL, "mHead", "hair_facial", "hair_facial_param_list", "hair_facial_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_MALE));
+
+ addEntry(SUBPART_EYES, new SubpartEntry(SUBPART_EYES, "mHead", "eyes", "eyes_main_param_list", "eyes_main_tab", LLVector3d(0.f, 0.f, 0.05f), LLVector3d(-0.5f, 0.05f, 0.07f),SEX_BOTH));
+
+ addEntry(SUBPART_SHIRT, new SubpartEntry(SUBPART_SHIRT, "mTorso", "shirt", "shirt_main_param_list", "shirt_main_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(-1.f, 0.15f, 0.3f),SEX_BOTH));
+ addEntry(SUBPART_PANTS, new SubpartEntry(SUBPART_PANTS, "mPelvis", "pants", "pants_main_param_list", "pants_main_tab", LLVector3d(0.f, 0.f, -0.5f), LLVector3d(-1.6f, 0.15f, -0.5f),SEX_BOTH));
+ addEntry(SUBPART_SHOES, new SubpartEntry(SUBPART_SHOES, "mPelvis", "shoes", "shoes_main_param_list", "shoes_main_tab", LLVector3d(0.f, 0.f, -0.5f), LLVector3d(-1.6f, 0.15f, -0.5f),SEX_BOTH));
+ addEntry(SUBPART_SOCKS, new SubpartEntry(SUBPART_SOCKS, "mPelvis", "socks", "socks_main_param_list", "socks_main_tab", LLVector3d(0.f, 0.f, -0.5f), LLVector3d(-1.6f, 0.15f, -0.5f),SEX_BOTH));
+ addEntry(SUBPART_JACKET, new SubpartEntry(SUBPART_JACKET, "mTorso", "jacket", "jacket_main_param_list", "jacket_main_tab", LLVector3d(0.f, 0.f, 0.f), LLVector3d(-2.f, 0.1f, 0.3f),SEX_BOTH));
+ addEntry(SUBPART_SKIRT, new SubpartEntry(SUBPART_SKIRT, "mPelvis", "skirt", "skirt_main_param_list", "skirt_main_tab", LLVector3d(0.f, 0.f, -0.5f), LLVector3d(-1.6f, 0.15f, -0.5f),SEX_BOTH));
+ addEntry(SUBPART_GLOVES, new SubpartEntry(SUBPART_GLOVES, "mTorso", "gloves", "gloves_main_param_list", "gloves_main_tab", LLVector3d(0.f, 0.f, 0.f), LLVector3d(-1.f, 0.15f, 0.f),SEX_BOTH));
+ addEntry(SUBPART_UNDERSHIRT, new SubpartEntry(SUBPART_UNDERSHIRT, "mTorso", "undershirt", "undershirt_main_param_list", "undershirt_main_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(-1.f, 0.15f, 0.3f),SEX_BOTH));
+ addEntry(SUBPART_UNDERPANTS, new SubpartEntry(SUBPART_UNDERPANTS, "mPelvis", "underpants", "underpants_main_param_list", "underpants_main_tab", LLVector3d(0.f, 0.f, -0.5f), LLVector3d(-1.6f, 0.15f, -0.5f),SEX_BOTH));
+ addEntry(SUBPART_ALPHA, new SubpartEntry(SUBPART_ALPHA, "mPelvis", "alpha", "alpha_main_param_list", "alpha_main_tab", LLVector3d(0.f, 0.f, 0.1f), LLVector3d(-2.5f, 0.5f, 0.8f),SEX_BOTH));
+ addEntry(SUBPART_TATTOO, new SubpartEntry(SUBPART_TATTOO, "mPelvis", "tattoo", "tattoo_main_param_list", "tattoo_main_tab", LLVector3d(0.f, 0.f, 0.1f), LLVector3d(-2.5f, 0.5f, 0.8f),SEX_BOTH));
+ addEntry(SUBPART_PHYSICS_BREASTS_UPDOWN, new SubpartEntry(SUBPART_PHYSICS_BREASTS_UPDOWN, "mTorso", "physics_breasts_updown", "physics_breasts_updown_param_list", "physics_breasts_updown_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_FEMALE));
+ addEntry(SUBPART_PHYSICS_BREASTS_INOUT, new SubpartEntry(SUBPART_PHYSICS_BREASTS_INOUT, "mTorso", "physics_breasts_inout", "physics_breasts_inout_param_list", "physics_breasts_inout_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_FEMALE));
+ addEntry(SUBPART_PHYSICS_BREASTS_LEFTRIGHT, new SubpartEntry(SUBPART_PHYSICS_BREASTS_LEFTRIGHT, "mTorso", "physics_breasts_leftright", "physics_breasts_leftright_param_list", "physics_breasts_leftright_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_FEMALE));
+ addEntry(SUBPART_PHYSICS_BELLY_UPDOWN, new SubpartEntry(SUBPART_PHYSICS_BELLY_UPDOWN, "mTorso", "physics_belly_updown", "physics_belly_updown_param_list", "physics_belly_updown_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_BOTH));
+ addEntry(SUBPART_PHYSICS_BUTT_UPDOWN, new SubpartEntry(SUBPART_PHYSICS_BUTT_UPDOWN, "mTorso", "physics_butt_updown", "physics_butt_updown_param_list", "physics_butt_updown_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_BOTH));
+ addEntry(SUBPART_PHYSICS_BUTT_LEFTRIGHT, new SubpartEntry(SUBPART_PHYSICS_BUTT_LEFTRIGHT, "mTorso", "physics_butt_leftright", "physics_butt_leftright_param_list", "physics_butt_leftright_tab", LLVector3d(0.f, 0.f, 0.f), LLVector3d(0.f, 0.f, 0.f),SEX_BOTH));
+ addEntry(SUBPART_PHYSICS_ADVANCED, new SubpartEntry(SUBPART_PHYSICS_ADVANCED, "mTorso", "physics_advanced", "physics_advanced_param_list", "physics_advanced_tab", LLVector3d(0.f, 0.f, 0.f), LLVector3d(0.f, 0.f, 0.f),SEX_BOTH));
}
LLEditWearableDictionary::SubpartEntry::SubpartEntry(ESubpart part,
- const std::string &joint,
- const std::string &edit_group,
- const std::string &param_list,
- const std::string &accordion_tab,
- const LLVector3d &target_offset,
- const LLVector3d &camera_offset,
- const ESex &sex) :
- LLDictionaryEntry(edit_group),
- mSubpart(part),
- mTargetJoint(joint),
- mEditGroup(edit_group),
- mParamList(param_list),
- mAccordionTab(accordion_tab),
- mTargetOffset(target_offset),
- mCameraOffset(camera_offset),
- mSex(sex)
+ const std::string &joint,
+ const std::string &edit_group,
+ const std::string &param_list,
+ const std::string &accordion_tab,
+ const LLVector3d &target_offset,
+ const LLVector3d &camera_offset,
+ const ESex &sex) :
+ LLDictionaryEntry(edit_group),
+ mSubpart(part),
+ mTargetJoint(joint),
+ mEditGroup(edit_group),
+ mParamList(param_list),
+ mAccordionTab(accordion_tab),
+ mTargetOffset(target_offset),
+ mCameraOffset(camera_offset),
+ mSex(sex)
{
}
LLEditWearableDictionary::ColorSwatchCtrls::ColorSwatchCtrls()
{
- addEntry ( TEX_UPPER_SHIRT, new PickerControlEntry (TEX_UPPER_SHIRT, "Color/Tint" ));
- addEntry ( TEX_LOWER_PANTS, new PickerControlEntry (TEX_LOWER_PANTS, "Color/Tint" ));
- addEntry ( TEX_LOWER_SHOES, new PickerControlEntry (TEX_LOWER_SHOES, "Color/Tint" ));
- addEntry ( TEX_LOWER_SOCKS, new PickerControlEntry (TEX_LOWER_SOCKS, "Color/Tint" ));
- addEntry ( TEX_UPPER_JACKET, new PickerControlEntry (TEX_UPPER_JACKET, "Color/Tint" ));
- addEntry ( TEX_SKIRT, new PickerControlEntry (TEX_SKIRT, "Color/Tint" ));
- addEntry ( TEX_UPPER_GLOVES, new PickerControlEntry (TEX_UPPER_GLOVES, "Color/Tint" ));
- addEntry ( TEX_UPPER_UNDERSHIRT, new PickerControlEntry (TEX_UPPER_UNDERSHIRT, "Color/Tint" ));
- addEntry ( TEX_LOWER_UNDERPANTS, new PickerControlEntry (TEX_LOWER_UNDERPANTS, "Color/Tint" ));
- addEntry ( TEX_HEAD_TATTOO, new PickerControlEntry(TEX_HEAD_TATTOO, "Color/Tint" ));
+ addEntry ( TEX_UPPER_SHIRT, new PickerControlEntry (TEX_UPPER_SHIRT, "Color/Tint" ));
+ addEntry ( TEX_LOWER_PANTS, new PickerControlEntry (TEX_LOWER_PANTS, "Color/Tint" ));
+ addEntry ( TEX_LOWER_SHOES, new PickerControlEntry (TEX_LOWER_SHOES, "Color/Tint" ));
+ addEntry ( TEX_LOWER_SOCKS, new PickerControlEntry (TEX_LOWER_SOCKS, "Color/Tint" ));
+ addEntry ( TEX_UPPER_JACKET, new PickerControlEntry (TEX_UPPER_JACKET, "Color/Tint" ));
+ addEntry ( TEX_SKIRT, new PickerControlEntry (TEX_SKIRT, "Color/Tint" ));
+ addEntry ( TEX_UPPER_GLOVES, new PickerControlEntry (TEX_UPPER_GLOVES, "Color/Tint" ));
+ addEntry ( TEX_UPPER_UNDERSHIRT, new PickerControlEntry (TEX_UPPER_UNDERSHIRT, "Color/Tint" ));
+ addEntry ( TEX_LOWER_UNDERPANTS, new PickerControlEntry (TEX_LOWER_UNDERPANTS, "Color/Tint" ));
+ addEntry ( TEX_HEAD_TATTOO, new PickerControlEntry(TEX_HEAD_TATTOO, "Color/Tint" ));
}
LLEditWearableDictionary::TextureCtrls::TextureCtrls()
{
- addEntry ( TEX_HEAD_BODYPAINT, new PickerControlEntry (TEX_HEAD_BODYPAINT, "Head Tattoos", LLUUID::null, TRUE ));
- addEntry ( TEX_UPPER_BODYPAINT, new PickerControlEntry (TEX_UPPER_BODYPAINT, "Upper Tattoos", LLUUID::null, TRUE ));
- addEntry ( TEX_LOWER_BODYPAINT, new PickerControlEntry (TEX_LOWER_BODYPAINT, "Lower Tattoos", LLUUID::null, TRUE ));
- addEntry ( TEX_HAIR, new PickerControlEntry (TEX_HAIR, "Texture", LLUUID( gSavedSettings.getString( "UIImgDefaultHairUUID" ) ), FALSE ));
- addEntry ( TEX_EYES_IRIS, new PickerControlEntry (TEX_EYES_IRIS, "Iris", LLUUID( gSavedSettings.getString( "UIImgDefaultEyesUUID" ) ), FALSE ));
- addEntry ( TEX_UPPER_SHIRT, new PickerControlEntry (TEX_UPPER_SHIRT, "Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultShirtUUID" ) ), FALSE ));
- addEntry ( TEX_LOWER_PANTS, new PickerControlEntry (TEX_LOWER_PANTS, "Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultPantsUUID" ) ), FALSE ));
- addEntry ( TEX_LOWER_SHOES, new PickerControlEntry (TEX_LOWER_SHOES, "Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultShoesUUID" ) ), FALSE ));
- addEntry ( TEX_LOWER_SOCKS, new PickerControlEntry (TEX_LOWER_SOCKS, "Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultSocksUUID" ) ), FALSE ));
- addEntry ( TEX_UPPER_JACKET, new PickerControlEntry (TEX_UPPER_JACKET, "Upper Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultJacketUUID" ) ), FALSE ));
- addEntry ( TEX_LOWER_JACKET, new PickerControlEntry (TEX_LOWER_JACKET, "Lower Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultJacketUUID" ) ), FALSE ));
- addEntry ( TEX_SKIRT, new PickerControlEntry (TEX_SKIRT, "Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultSkirtUUID" ) ), FALSE ));
- addEntry ( TEX_UPPER_GLOVES, new PickerControlEntry (TEX_UPPER_GLOVES, "Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultGlovesUUID" ) ), FALSE ));
- addEntry ( TEX_UPPER_UNDERSHIRT, new PickerControlEntry (TEX_UPPER_UNDERSHIRT, "Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultUnderwearUUID" ) ), FALSE ));
- addEntry ( TEX_LOWER_UNDERPANTS, new PickerControlEntry (TEX_LOWER_UNDERPANTS, "Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultUnderwearUUID" ) ), FALSE ));
- addEntry ( TEX_LOWER_ALPHA, new PickerControlEntry (TEX_LOWER_ALPHA, "Lower Alpha", LLUUID( gSavedSettings.getString( "UIImgDefaultAlphaUUID" ) ), TRUE ));
- addEntry ( TEX_UPPER_ALPHA, new PickerControlEntry (TEX_UPPER_ALPHA, "Upper Alpha", LLUUID( gSavedSettings.getString( "UIImgDefaultAlphaUUID" ) ), TRUE ));
- addEntry ( TEX_HEAD_ALPHA, new PickerControlEntry (TEX_HEAD_ALPHA, "Head Alpha", LLUUID( gSavedSettings.getString( "UIImgDefaultAlphaUUID" ) ), TRUE ));
- addEntry ( TEX_EYES_ALPHA, new PickerControlEntry (TEX_EYES_ALPHA, "Eye Alpha", LLUUID( gSavedSettings.getString( "UIImgDefaultAlphaUUID" ) ), TRUE ));
- addEntry ( TEX_HAIR_ALPHA, new PickerControlEntry (TEX_HAIR_ALPHA, "Hair Alpha", LLUUID( gSavedSettings.getString( "UIImgDefaultAlphaUUID" ) ), TRUE ));
- addEntry ( TEX_LOWER_TATTOO, new PickerControlEntry (TEX_LOWER_TATTOO, "Lower Tattoo", LLUUID::null, TRUE ));
- addEntry ( TEX_UPPER_TATTOO, new PickerControlEntry (TEX_UPPER_TATTOO, "Upper Tattoo", LLUUID::null, TRUE ));
- addEntry ( TEX_HEAD_TATTOO, new PickerControlEntry (TEX_HEAD_TATTOO, "Head Tattoo", LLUUID::null, TRUE ));
+ addEntry ( TEX_HEAD_BODYPAINT, new PickerControlEntry (TEX_HEAD_BODYPAINT, "Head", LLUUID::null, TRUE ));
+ addEntry ( TEX_UPPER_BODYPAINT, new PickerControlEntry (TEX_UPPER_BODYPAINT, "Upper Body", LLUUID::null, TRUE ));
+ addEntry ( TEX_LOWER_BODYPAINT, new PickerControlEntry (TEX_LOWER_BODYPAINT, "Lower Body", LLUUID::null, TRUE ));
+ addEntry ( TEX_HAIR, new PickerControlEntry (TEX_HAIR, "Texture", LLUUID( gSavedSettings.getString( "UIImgDefaultHairUUID" ) ), FALSE ));
+ addEntry ( TEX_EYES_IRIS, new PickerControlEntry (TEX_EYES_IRIS, "Iris", LLUUID( gSavedSettings.getString( "UIImgDefaultEyesUUID" ) ), FALSE ));
+ addEntry ( TEX_UPPER_SHIRT, new PickerControlEntry (TEX_UPPER_SHIRT, "Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultShirtUUID" ) ), FALSE ));
+ addEntry ( TEX_LOWER_PANTS, new PickerControlEntry (TEX_LOWER_PANTS, "Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultPantsUUID" ) ), FALSE ));
+ addEntry ( TEX_LOWER_SHOES, new PickerControlEntry (TEX_LOWER_SHOES, "Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultShoesUUID" ) ), FALSE ));
+ addEntry ( TEX_LOWER_SOCKS, new PickerControlEntry (TEX_LOWER_SOCKS, "Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultSocksUUID" ) ), FALSE ));
+ addEntry ( TEX_UPPER_JACKET, new PickerControlEntry (TEX_UPPER_JACKET, "Upper Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultJacketUUID" ) ), FALSE ));
+ addEntry ( TEX_LOWER_JACKET, new PickerControlEntry (TEX_LOWER_JACKET, "Lower Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultJacketUUID" ) ), FALSE ));
+ addEntry ( TEX_SKIRT, new PickerControlEntry (TEX_SKIRT, "Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultSkirtUUID" ) ), FALSE ));
+ addEntry ( TEX_UPPER_GLOVES, new PickerControlEntry (TEX_UPPER_GLOVES, "Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultGlovesUUID" ) ), FALSE ));
+ addEntry ( TEX_UPPER_UNDERSHIRT, new PickerControlEntry (TEX_UPPER_UNDERSHIRT, "Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultUnderwearUUID" ) ), FALSE ));
+ addEntry ( TEX_LOWER_UNDERPANTS, new PickerControlEntry (TEX_LOWER_UNDERPANTS, "Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultUnderwearUUID" ) ), FALSE ));
+ addEntry ( TEX_LOWER_ALPHA, new PickerControlEntry (TEX_LOWER_ALPHA, "Lower Alpha", LLUUID( gSavedSettings.getString( "UIImgDefaultAlphaUUID" ) ), TRUE ));
+ addEntry ( TEX_UPPER_ALPHA, new PickerControlEntry (TEX_UPPER_ALPHA, "Upper Alpha", LLUUID( gSavedSettings.getString( "UIImgDefaultAlphaUUID" ) ), TRUE ));
+ addEntry ( TEX_HEAD_ALPHA, new PickerControlEntry (TEX_HEAD_ALPHA, "Head Alpha", LLUUID( gSavedSettings.getString( "UIImgDefaultAlphaUUID" ) ), TRUE ));
+ addEntry ( TEX_EYES_ALPHA, new PickerControlEntry (TEX_EYES_ALPHA, "Eye Alpha", LLUUID( gSavedSettings.getString( "UIImgDefaultAlphaUUID" ) ), TRUE ));
+ addEntry ( TEX_HAIR_ALPHA, new PickerControlEntry (TEX_HAIR_ALPHA, "Hair Alpha", LLUUID( gSavedSettings.getString( "UIImgDefaultAlphaUUID" ) ), TRUE ));
+ addEntry ( TEX_LOWER_TATTOO, new PickerControlEntry (TEX_LOWER_TATTOO, "Lower Tattoo", LLUUID::null, TRUE ));
+ addEntry ( TEX_UPPER_TATTOO, new PickerControlEntry (TEX_UPPER_TATTOO, "Upper Tattoo", LLUUID::null, TRUE ));
+ addEntry ( TEX_HEAD_TATTOO, new PickerControlEntry (TEX_HEAD_TATTOO, "Head Tattoo", LLUUID::null, TRUE ));
}
LLEditWearableDictionary::PickerControlEntry::PickerControlEntry(ETextureIndex tex_index,
- const std::string name,
- const LLUUID default_image_id,
- const bool allow_no_texture) :
- LLDictionaryEntry(name),
- mTextureIndex(tex_index),
- mControlName(name),
- mDefaultImageId(default_image_id),
- mAllowNoTexture(allow_no_texture)
+ const std::string name,
+ const LLUUID default_image_id,
+ const bool allow_no_texture) :
+ LLDictionaryEntry(name),
+ mTextureIndex(tex_index),
+ mControlName(name),
+ mDefaultImageId(default_image_id),
+ mAllowNoTexture(allow_no_texture)
{
}
@@ -384,13 +399,13 @@ LLEditWearableDictionary::PickerControlEntry::PickerControlEntry(ETextureIndex t
class LLLabledBackButton : public LLButton
{
public:
- struct Params : public LLInitParam::Block<Params, LLButton::Params>
- {
- Params() {}
- };
+ struct Params : public LLInitParam::Block<Params, LLButton::Params>
+ {
+ Params() {}
+ };
protected:
- friend class LLUICtrlFactory;
- LLLabledBackButton(const Params&);
+ friend class LLUICtrlFactory;
+ LLLabledBackButton(const Params&);
};
static LLDefaultChildRegistry::Register<LLLabledBackButton> labeled_back_btn("labeled_back_button");
@@ -398,9 +413,9 @@ static LLDefaultChildRegistry::Register<LLLabledBackButton> labeled_back_btn("la
LLLabledBackButton::LLLabledBackButton(const Params& params)
: LLButton(params)
{
- // override hack in LLButton's constructor to use paddings have been set in xml
- setLeftHPad(params.pad_left);
- setRightHPad(params.pad_right);
+ // override hack in LLButton's constructor to use paddings have been set in xml
+ setLeftHPad(params.pad_left);
+ setRightHPad(params.pad_right);
}
// Helper functions.
@@ -421,13 +436,13 @@ typedef boost::function<void(LLPanel* panel, const LLEditWearableDictionary::Pic
typedef struct PickerControlEntryNamePredicate
{
- PickerControlEntryNamePredicate(const std::string name) : mName (name) {};
- bool operator()(const LLEditWearableDictionary::PickerControlEntry* entry) const
- {
- return (entry && entry->mName == mName);
- }
+ PickerControlEntryNamePredicate(const std::string name) : mName (name) {};
+ bool operator()(const LLEditWearableDictionary::PickerControlEntry* entry) const
+ {
+ return (entry && entry->mName == mName);
+ }
private:
- const std::string mName;
+ const std::string mName;
} PickerControlEntryNamePredicate;
// A full specialization of get_pickers_indexes for LLColorSwatchCtrl
@@ -435,12 +450,12 @@ template <>
const texture_vec_t&
get_pickers_indexes<LLColorSwatchCtrl> (const LLEditWearableDictionary::WearableEntry *wearable_entry)
{
- if (!wearable_entry)
- {
- llwarns << "could not get LLColorSwatchCtrl indexes for null wearable entry." << llendl;
- return null_texture_vec;
- }
- return wearable_entry->mColorSwatchCtrls;
+ if (!wearable_entry)
+ {
+ llwarns << "could not get LLColorSwatchCtrl indexes for null wearable entry." << llendl;
+ return null_texture_vec;
+ }
+ return wearable_entry->mColorSwatchCtrls;
}
// A full specialization of get_pickers_indexes for LLTextureCtrl
@@ -448,12 +463,12 @@ template <>
const texture_vec_t&
get_pickers_indexes<LLTextureCtrl> (const LLEditWearableDictionary::WearableEntry *wearable_entry)
{
- if (!wearable_entry)
- {
- llwarns << "could not get LLTextureCtrl indexes for null wearable entry." << llendl;
- return null_texture_vec;
- }
- return wearable_entry->mTextureCtrls;
+ if (!wearable_entry)
+ {
+ llwarns << "could not get LLTextureCtrl indexes for null wearable entry." << llendl;
+ return null_texture_vec;
+ }
+ return wearable_entry->mTextureCtrls;
}
// A full specialization of get_picker_entry for LLColorSwatchCtrl
@@ -461,7 +476,7 @@ template <>
const LLEditWearableDictionary::PickerControlEntry*
get_picker_entry<LLColorSwatchCtrl> (const ETextureIndex index)
{
- return LLEditWearableDictionary::getInstance()->getColorSwatch(index);
+ return LLEditWearableDictionary::getInstance()->getColorSwatch(index);
}
// A full specialization of get_picker_entry for LLTextureCtrl
@@ -469,161 +484,162 @@ template <>
const LLEditWearableDictionary::PickerControlEntry*
get_picker_entry<LLTextureCtrl> (const ETextureIndex index)
{
- return LLEditWearableDictionary::getInstance()->getTexturePicker(index);
+ return LLEditWearableDictionary::getInstance()->getTexturePicker(index);
}
template <typename CtrlType, class Predicate>
const LLEditWearableDictionary::PickerControlEntry*
find_picker_ctrl_entry_if(LLWearableType::EType type, const Predicate pred)
{
- const LLEditWearableDictionary::WearableEntry *wearable_entry
- = LLEditWearableDictionary::getInstance()->getWearable(type);
- if (!wearable_entry)
- {
- llwarns << "could not get wearable dictionary entry for wearable of type: " << type << llendl;
- return NULL;
- }
- const texture_vec_t& indexes = get_pickers_indexes<CtrlType>(wearable_entry);
- for (texture_vec_t::const_iterator
- iter = indexes.begin(),
- iter_end = indexes.end();
- iter != iter_end; ++iter)
- {
- const ETextureIndex te = *iter;
- const LLEditWearableDictionary::PickerControlEntry* entry
- = get_picker_entry<CtrlType>(te);
- if (!entry)
- {
- llwarns << "could not get picker dictionary entry (" << te << ") for wearable of type: " << type << llendl;
- continue;
- }
- if (pred(entry))
- {
- return entry;
- }
- }
- return NULL;
+ const LLEditWearableDictionary::WearableEntry *wearable_entry
+ = LLEditWearableDictionary::getInstance()->getWearable(type);
+ if (!wearable_entry)
+ {
+ llwarns << "could not get wearable dictionary entry for wearable of type: " << type << llendl;
+ return NULL;
+ }
+ const texture_vec_t& indexes = get_pickers_indexes<CtrlType>(wearable_entry);
+ for (texture_vec_t::const_iterator
+ iter = indexes.begin(),
+ iter_end = indexes.end();
+ iter != iter_end; ++iter)
+ {
+ const ETextureIndex te = *iter;
+ const LLEditWearableDictionary::PickerControlEntry* entry
+ = get_picker_entry<CtrlType>(te);
+ if (!entry)
+ {
+ llwarns << "could not get picker dictionary entry (" << te << ") for wearable of type: " << type << llendl;
+ continue;
+ }
+ if (pred(entry))
+ {
+ return entry;
+ }
+ }
+ return NULL;
}
template <typename CtrlType>
void
for_each_picker_ctrl_entry(LLPanel* panel, LLWearableType::EType type, function_t fun)
{
- if (!panel)
- {
- llwarns << "the panel wasn't passed for wearable of type: " << type << llendl;
- return;
- }
- const LLEditWearableDictionary::WearableEntry *wearable_entry
- = LLEditWearableDictionary::getInstance()->getWearable(type);
- if (!wearable_entry)
- {
- llwarns << "could not get wearable dictionary entry for wearable of type: " << type << llendl;
- return;
- }
- const texture_vec_t& indexes = get_pickers_indexes<CtrlType>(wearable_entry);
- for (texture_vec_t::const_iterator
- iter = indexes.begin(),
- iter_end = indexes.end();
- iter != iter_end; ++iter)
- {
- const ETextureIndex te = *iter;
- const LLEditWearableDictionary::PickerControlEntry* entry
- = get_picker_entry<CtrlType>(te);
- if (!entry)
- {
- llwarns << "could not get picker dictionary entry (" << te << ") for wearable of type: " << type << llendl;
- continue;
- }
- fun (panel, entry);
- }
+ if (!panel)
+ {
+ llwarns << "the panel wasn't passed for wearable of type: " << type << llendl;
+ return;
+ }
+ const LLEditWearableDictionary::WearableEntry *wearable_entry
+ = LLEditWearableDictionary::getInstance()->getWearable(type);
+ if (!wearable_entry)
+ {
+ llwarns << "could not get wearable dictionary entry for wearable of type: " << type << llendl;
+ return;
+ }
+ const texture_vec_t& indexes = get_pickers_indexes<CtrlType>(wearable_entry);
+ for (texture_vec_t::const_iterator
+ iter = indexes.begin(),
+ iter_end = indexes.end();
+ iter != iter_end; ++iter)
+ {
+ const ETextureIndex te = *iter;
+ const LLEditWearableDictionary::PickerControlEntry* entry
+ = get_picker_entry<CtrlType>(te);
+ if (!entry)
+ {
+ llwarns << "could not get picker dictionary entry (" << te << ") for wearable of type: " << type << llendl;
+ continue;
+ }
+ fun (panel, entry);
+ }
}
// The helper functions for pickers management
static void init_color_swatch_ctrl(LLPanelEditWearable* self, LLPanel* panel, const LLEditWearableDictionary::PickerControlEntry* entry)
{
- LLColorSwatchCtrl* color_swatch_ctrl = panel->getChild<LLColorSwatchCtrl>(entry->mControlName);
- if (color_swatch_ctrl)
- {
- // Can't get the color from the wearable here, since the wearable may not be set when this is called.
- color_swatch_ctrl->setOriginal(LLColor4::white);
- }
+ LLColorSwatchCtrl* color_swatch_ctrl = panel->getChild<LLColorSwatchCtrl>(entry->mControlName);
+ if (color_swatch_ctrl)
+ {
+ // Can't get the color from the wearable here, since the wearable may not be set when this is called.
+ color_swatch_ctrl->setOriginal(LLColor4::white);
+ }
}
static void init_texture_ctrl(LLPanelEditWearable* self, LLPanel* panel, const LLEditWearableDictionary::PickerControlEntry* entry)
{
- LLTextureCtrl* texture_ctrl = panel->getChild<LLTextureCtrl>(entry->mControlName);
- if (texture_ctrl)
- {
- texture_ctrl->setDefaultImageAssetID(entry->mDefaultImageId);
- texture_ctrl->setAllowNoTexture(entry->mAllowNoTexture);
- // Don't allow (no copy) or (notransfer) textures to be selected.
- texture_ctrl->setImmediateFilterPermMask(PERM_NONE);
- texture_ctrl->setNonImmediateFilterPermMask(PERM_NONE);
- }
+ LLTextureCtrl* texture_ctrl = panel->getChild<LLTextureCtrl>(entry->mControlName);
+ if (texture_ctrl)
+ {
+ texture_ctrl->setDefaultImageAssetID(entry->mDefaultImageId);
+ texture_ctrl->setAllowNoTexture(entry->mAllowNoTexture);
+ // Don't allow (no copy) or (notransfer) textures to be selected.
+ texture_ctrl->setImmediateFilterPermMask(PERM_NONE);
+ texture_ctrl->setNonImmediateFilterPermMask(PERM_NONE);
+ }
}
static void update_color_swatch_ctrl(LLPanelEditWearable* self, LLPanel* panel, const LLEditWearableDictionary::PickerControlEntry* entry)
{
- LLColorSwatchCtrl* color_swatch_ctrl = panel->getChild<LLColorSwatchCtrl>(entry->mControlName);
- if (color_swatch_ctrl)
- {
- color_swatch_ctrl->set(self->getWearable()->getClothesColor(entry->mTextureIndex));
- }
+ LLColorSwatchCtrl* color_swatch_ctrl = panel->getChild<LLColorSwatchCtrl>(entry->mControlName);
+ if (color_swatch_ctrl)
+ {
+ color_swatch_ctrl->set(self->getWearable()->getClothesColor(entry->mTextureIndex));
+ color_swatch_ctrl->closeFloaterColorPicker();
+ }
}
static void update_texture_ctrl(LLPanelEditWearable* self, LLPanel* panel, const LLEditWearableDictionary::PickerControlEntry* entry)
{
- LLTextureCtrl* texture_ctrl = panel->getChild<LLTextureCtrl>(entry->mControlName);
- if (texture_ctrl)
- {
- LLUUID new_id;
- LLLocalTextureObject *lto = self->getWearable()->getLocalTextureObject(entry->mTextureIndex);
- if( lto && (lto->getID() != IMG_DEFAULT_AVATAR) )
- {
- new_id = lto->getID();
- }
- else
- {
- new_id = LLUUID::null;
- }
- LLUUID old_id = texture_ctrl->getImageAssetID();
- if (old_id != new_id)
- {
- // texture has changed, close the floater to avoid DEV-22461
- texture_ctrl->closeDependentFloater();
- }
- texture_ctrl->setImageAssetID(new_id);
- }
+ LLTextureCtrl* texture_ctrl = panel->getChild<LLTextureCtrl>(entry->mControlName);
+ if (texture_ctrl)
+ {
+ LLUUID new_id;
+ LLLocalTextureObject *lto = self->getWearable()->getLocalTextureObject(entry->mTextureIndex);
+ if( lto && (lto->getID() != IMG_DEFAULT_AVATAR) )
+ {
+ new_id = lto->getID();
+ }
+ else
+ {
+ new_id = LLUUID::null;
+ }
+ LLUUID old_id = texture_ctrl->getImageAssetID();
+ if (old_id != new_id)
+ {
+ // texture has changed, close the floater to avoid DEV-22461
+ texture_ctrl->closeDependentFloater();
+ }
+ texture_ctrl->setImageAssetID(new_id);
+ }
}
static void set_enabled_color_swatch_ctrl(bool enabled, LLPanel* panel, const LLEditWearableDictionary::PickerControlEntry* entry)
{
- LLColorSwatchCtrl* color_swatch_ctrl = panel->getChild<LLColorSwatchCtrl>(entry->mControlName);
- if (color_swatch_ctrl)
- {
- color_swatch_ctrl->setEnabled(enabled);
- }
+ LLColorSwatchCtrl* color_swatch_ctrl = panel->getChild<LLColorSwatchCtrl>(entry->mControlName);
+ if (color_swatch_ctrl)
+ {
+ color_swatch_ctrl->setEnabled(enabled);
+ }
}
static void set_enabled_texture_ctrl(bool enabled, LLPanel* panel, const LLEditWearableDictionary::PickerControlEntry* entry)
{
- LLTextureCtrl* texture_ctrl = panel->getChild<LLTextureCtrl>(entry->mControlName);
- if (texture_ctrl)
- {
- texture_ctrl->setEnabled(enabled);
- }
+ LLTextureCtrl* texture_ctrl = panel->getChild<LLTextureCtrl>(entry->mControlName);
+ if (texture_ctrl)
+ {
+ texture_ctrl->setEnabled(enabled);
+ }
}
// LLPanelEditWearable
LLPanelEditWearable::LLPanelEditWearable()
- : LLPanel()
- , mWearablePtr(NULL)
- , mWearableItem(NULL)
+ : LLPanel()
+ , mWearablePtr(NULL)
+ , mWearableItem(NULL)
{
- mCommitCallbackRegistrar.add("ColorSwatch.Commit", boost::bind(&LLPanelEditWearable::onColorSwatchCommit, this, _1));
- mCommitCallbackRegistrar.add("TexturePicker.Commit", boost::bind(&LLPanelEditWearable::onTexturePickerCommit, this, _1));
+ mCommitCallbackRegistrar.add("ColorSwatch.Commit", boost::bind(&LLPanelEditWearable::onColorSwatchCommit, this, _1));
+ mCommitCallbackRegistrar.add("TexturePicker.Commit", boost::bind(&LLPanelEditWearable::onTexturePickerCommit, this, _1));
}
//virtual
@@ -634,917 +650,952 @@ LLPanelEditWearable::~LLPanelEditWearable()
bool LLPanelEditWearable::changeHeightUnits(const LLSD& new_value)
{
- updateMetricLayout( new_value.asBoolean() );
- updateTypeSpecificControls(LLWearableType::WT_SHAPE);
- return true;
+ updateMetricLayout( new_value.asBoolean() );
+ updateTypeSpecificControls(LLWearableType::WT_SHAPE);
+ return true;
}
void LLPanelEditWearable::updateMetricLayout(BOOL new_value)
{
- LLUIString current_metric, replacment_metric;
- current_metric = new_value ? mMeters : mFeet;
- replacment_metric = new_value ? mFeet : mMeters;
- mHeigthValue.setArg( "[METRIC1]", current_metric.getString() );
- mReplacementMetricUrl.setArg( "[URL_METRIC2]", std::string("[secondlife:///app/metricsystem ") + replacment_metric.getString() + std::string("]"));
+ LLUIString current_metric, replacment_metric;
+ current_metric = new_value ? mMeters : mFeet;
+ replacment_metric = new_value ? mFeet : mMeters;
+ mHeigthValue.setArg( "[METRIC1]", current_metric.getString() );
+ mReplacementMetricUrl.setArg( "[URL_METRIC2]", std::string("[secondlife:///app/metricsystem ") + replacment_metric.getString() + std::string("]"));
}
void LLPanelEditWearable::updateAvatarHeightLabel()
{
- mTxtAvatarHeight->setText(LLStringUtil::null);
- LLStyle::Params param;
- param.color = mAvatarHeigthLabelColor;
- mTxtAvatarHeight->appendText(mHeigth, false, param);
- param.color = mAvatarHeigthValueLabelColor;
- mTxtAvatarHeight->appendText(mHeigthValue, false, param);
- param.color = mAvatarHeigthLabelColor; // using mAvatarHeigthLabelColor for '/' separator
- mTxtAvatarHeight->appendText(" / ", false, param);
- mTxtAvatarHeight->appendText(this->mReplacementMetricUrl, false, param);
+ mTxtAvatarHeight->setText(LLStringUtil::null);
+ LLStyle::Params param;
+ param.color = mAvatarHeigthLabelColor;
+ mTxtAvatarHeight->appendText(mHeigth, false, param);
+ param.color = mAvatarHeigthValueLabelColor;
+ mTxtAvatarHeight->appendText(mHeigthValue, false, param);
+ param.color = mAvatarHeigthLabelColor; // using mAvatarHeigthLabelColor for '/' separator
+ mTxtAvatarHeight->appendText(" / ", false, param);
+ mTxtAvatarHeight->appendText(this->mReplacementMetricUrl, false, param);
}
void LLPanelEditWearable::onWearablePanelVisibilityChange(const LLSD &in_visible_chain, LLAccordionCtrl* accordion_ctrl)
{
- if (in_visible_chain.asBoolean() && accordion_ctrl != NULL)
- {
- accordion_ctrl->expandDefaultTab();
- }
+ if (in_visible_chain.asBoolean() && accordion_ctrl != NULL)
+ {
+ accordion_ctrl->expandDefaultTab();
+ }
}
void LLPanelEditWearable::setWearablePanelVisibilityChangeCallback(LLPanel* bodypart_panel)
{
- if (bodypart_panel != NULL)
- {
- LLAccordionCtrl* accordion_ctrl = bodypart_panel->getChild<LLAccordionCtrl>("wearable_accordion");
-
- if (accordion_ctrl != NULL)
- {
- bodypart_panel->setVisibleCallback(
- boost::bind(&LLPanelEditWearable::onWearablePanelVisibilityChange, this, _2, accordion_ctrl));
- }
- else
- {
- llwarns << "accordion_ctrl is NULL" << llendl;
- }
- }
- else
- {
- llwarns << "bodypart_panel is NULL" << llendl;
- }
+ if (bodypart_panel != NULL)
+ {
+ LLAccordionCtrl* accordion_ctrl = bodypart_panel->getChild<LLAccordionCtrl>("wearable_accordion");
+
+ if (accordion_ctrl != NULL)
+ {
+ bodypart_panel->setVisibleCallback(
+ boost::bind(&LLPanelEditWearable::onWearablePanelVisibilityChange, this, _2, accordion_ctrl));
+ }
+ else
+ {
+ llwarns << "accordion_ctrl is NULL" << llendl;
+ }
+ }
+ else
+ {
+ llwarns << "bodypart_panel is NULL" << llendl;
+ }
}
// virtual
BOOL LLPanelEditWearable::postBuild()
{
- // buttons
- mBtnRevert = getChild<LLButton>("revert_button");
- mBtnRevert->setClickedCallback(boost::bind(&LLPanelEditWearable::onRevertButtonClicked, this));
-
- mBtnBack = getChild<LLButton>("back_btn");
- mBackBtnLabel = mBtnBack->getLabelUnselected();
- mBtnBack->setLabel(LLStringUtil::null);
- // handled at appearance panel level?
- //mBtnBack->setClickedCallback(boost::bind(&LLPanelEditWearable::onBackButtonClicked, this));
-
- mNameEditor = getChild<LLLineEditor>("description");
-
- mPanelTitle = getChild<LLTextBox>("edit_wearable_title");
- mDescTitle = getChild<LLTextBox>("description_text");
-
- getChild<LLRadioGroup>("sex_radio")->setCommitCallback(boost::bind(&LLPanelEditWearable::onCommitSexChange, this));
- getChild<LLButton>("save_as_button")->setCommitCallback(boost::bind(&LLPanelEditWearable::onSaveAsButtonClicked, this));
-
- // The following panels will be shown/hidden based on what wearable we're editing
- // body parts
- mPanelShape = getChild<LLPanel>("edit_shape_panel");
- mPanelSkin = getChild<LLPanel>("edit_skin_panel");
- mPanelEyes = getChild<LLPanel>("edit_eyes_panel");
- mPanelHair = getChild<LLPanel>("edit_hair_panel");
-
- // Setting the visibility callback is applied only to the bodyparts panel
- // because currently they are the only ones whose 'wearable_accordion' has
- // multiple accordion tabs (see EXT-8164 for details).
- setWearablePanelVisibilityChangeCallback(mPanelShape);
- setWearablePanelVisibilityChangeCallback(mPanelSkin);
- setWearablePanelVisibilityChangeCallback(mPanelEyes);
- setWearablePanelVisibilityChangeCallback(mPanelHair);
-
- //clothes
- mPanelShirt = getChild<LLPanel>("edit_shirt_panel");
- mPanelPants = getChild<LLPanel>("edit_pants_panel");
- mPanelShoes = getChild<LLPanel>("edit_shoes_panel");
- mPanelSocks = getChild<LLPanel>("edit_socks_panel");
- mPanelJacket = getChild<LLPanel>("edit_jacket_panel");
- mPanelGloves = getChild<LLPanel>("edit_gloves_panel");
- mPanelUndershirt = getChild<LLPanel>("edit_undershirt_panel");
- mPanelUnderpants = getChild<LLPanel>("edit_underpants_panel");
- mPanelSkirt = getChild<LLPanel>("edit_skirt_panel");
- mPanelAlpha = getChild<LLPanel>("edit_alpha_panel");
- mPanelTattoo = getChild<LLPanel>("edit_tattoo_panel");
-
- mTxtAvatarHeight = mPanelShape->getChild<LLTextBox>("avatar_height");
-
- mWearablePtr = NULL;
-
- configureAlphaCheckbox(LLVOAvatarDefines::TEX_LOWER_ALPHA, "lower alpha texture invisible");
- configureAlphaCheckbox(LLVOAvatarDefines::TEX_UPPER_ALPHA, "upper alpha texture invisible");
- configureAlphaCheckbox(LLVOAvatarDefines::TEX_HEAD_ALPHA, "head alpha texture invisible");
- configureAlphaCheckbox(LLVOAvatarDefines::TEX_EYES_ALPHA, "eye alpha texture invisible");
- configureAlphaCheckbox(LLVOAvatarDefines::TEX_HAIR_ALPHA, "hair alpha texture invisible");
-
- // configure tab expanded callbacks
- for (U32 type_index = 0; type_index < (U32)LLWearableType::WT_COUNT; ++type_index)
- {
- LLWearableType::EType type = (LLWearableType::EType) type_index;
- const LLEditWearableDictionary::WearableEntry *wearable_entry = LLEditWearableDictionary::getInstance()->getWearable(type);
- if (!wearable_entry)
- {
- llwarns << "could not get wearable dictionary entry for wearable of type: " << type << llendl;
- continue;
- }
- U8 num_subparts = wearable_entry->mSubparts.size();
-
- for (U8 index = 0; index < num_subparts; ++index)
- {
- // dive into data structures to get the panel we need
- ESubpart subpart_e = wearable_entry->mSubparts[index];
- const LLEditWearableDictionary::SubpartEntry *subpart_entry = LLEditWearableDictionary::getInstance()->getSubpart(subpart_e);
-
- if (!subpart_entry)
- {
- llwarns << "could not get wearable subpart dictionary entry for subpart: " << subpart_e << llendl;
- continue;
- }
-
- const std::string accordion_tab = subpart_entry->mAccordionTab;
-
- LLAccordionCtrlTab *tab = getChild<LLAccordionCtrlTab>(accordion_tab);
-
- if (!tab)
- {
- llwarns << "could not get llaccordionctrltab from UI with name: " << accordion_tab << llendl;
- continue;
- }
-
- // initialize callback to ensure camera view changes appropriately.
- tab->setDropDownStateChangedCallback(boost::bind(&LLPanelEditWearable::onTabExpandedCollapsed,this,_2,index));
- }
-
- // initialize texture and color picker controls
- for_each_picker_ctrl_entry <LLColorSwatchCtrl> (getPanel(type), type, boost::bind(init_color_swatch_ctrl, this, _1, _2));
- for_each_picker_ctrl_entry <LLTextureCtrl> (getPanel(type), type, boost::bind(init_texture_ctrl, this, _1, _2));
- }
-
- // init all strings
- mMeters = mPanelShape->getString("meters");
- mFeet = mPanelShape->getString("feet");
- mHeigth = mPanelShape->getString("height") + " ";
- mHeigthValue = "[HEIGHT] [METRIC1]";
- mReplacementMetricUrl = "[URL_METRIC2]";
-
- std::string color = mPanelShape->getString("heigth_label_color");
- mAvatarHeigthLabelColor = LLUIColorTable::instance().getColor(color, LLColor4::green);
- color = mPanelShape->getString("heigth_value_label_color");
- mAvatarHeigthValueLabelColor = LLUIColorTable::instance().getColor(color, LLColor4::green);
- gSavedSettings.getControl("HeightUnits")->getSignal()->connect(boost::bind(&LLPanelEditWearable::changeHeightUnits, this, _2));
- updateMetricLayout(gSavedSettings.getBOOL("HeightUnits"));
-
- return TRUE;
+ // buttons
+ mBtnRevert = getChild<LLButton>("revert_button");
+ mBtnRevert->setClickedCallback(boost::bind(&LLPanelEditWearable::onRevertButtonClicked, this));
+
+ mBtnBack = getChild<LLButton>("back_btn");
+ mBackBtnLabel = mBtnBack->getLabelUnselected();
+ mBtnBack->setLabel(LLStringUtil::null);
+ // handled at appearance panel level?
+ //mBtnBack->setClickedCallback(boost::bind(&LLPanelEditWearable::onBackButtonClicked, this));
+
+ mNameEditor = getChild<LLLineEditor>("description");
+
+ mPanelTitle = getChild<LLTextBox>("edit_wearable_title");
+ mDescTitle = getChild<LLTextBox>("description_text");
+
+ getChild<LLRadioGroup>("sex_radio")->setCommitCallback(boost::bind(&LLPanelEditWearable::onCommitSexChange, this));
+ getChild<LLButton>("save_as_button")->setCommitCallback(boost::bind(&LLPanelEditWearable::onSaveAsButtonClicked, this));
+
+ // The following panels will be shown/hidden based on what wearable we're editing
+ // body parts
+ mPanelShape = getChild<LLPanel>("edit_shape_panel");
+ mPanelSkin = getChild<LLPanel>("edit_skin_panel");
+ mPanelEyes = getChild<LLPanel>("edit_eyes_panel");
+ mPanelHair = getChild<LLPanel>("edit_hair_panel");
+
+ // Setting the visibility callback is applied only to the bodyparts panel
+ // because currently they are the only ones whose 'wearable_accordion' has
+ // multiple accordion tabs (see EXT-8164 for details).
+ setWearablePanelVisibilityChangeCallback(mPanelShape);
+ setWearablePanelVisibilityChangeCallback(mPanelSkin);
+ setWearablePanelVisibilityChangeCallback(mPanelEyes);
+ setWearablePanelVisibilityChangeCallback(mPanelHair);
+
+ //clothes
+ mPanelShirt = getChild<LLPanel>("edit_shirt_panel");
+ mPanelPants = getChild<LLPanel>("edit_pants_panel");
+ mPanelShoes = getChild<LLPanel>("edit_shoes_panel");
+ mPanelSocks = getChild<LLPanel>("edit_socks_panel");
+ mPanelJacket = getChild<LLPanel>("edit_jacket_panel");
+ mPanelGloves = getChild<LLPanel>("edit_gloves_panel");
+ mPanelUndershirt = getChild<LLPanel>("edit_undershirt_panel");
+ mPanelUnderpants = getChild<LLPanel>("edit_underpants_panel");
+ mPanelSkirt = getChild<LLPanel>("edit_skirt_panel");
+ mPanelAlpha = getChild<LLPanel>("edit_alpha_panel");
+ mPanelTattoo = getChild<LLPanel>("edit_tattoo_panel");
+ mPanelPhysics = getChild<LLPanel>("edit_physics_panel");
+
+ mTxtAvatarHeight = mPanelShape->getChild<LLTextBox>("avatar_height");
+
+ mWearablePtr = NULL;
+
+ configureAlphaCheckbox(LLVOAvatarDefines::TEX_LOWER_ALPHA, "lower alpha texture invisible");
+ configureAlphaCheckbox(LLVOAvatarDefines::TEX_UPPER_ALPHA, "upper alpha texture invisible");
+ configureAlphaCheckbox(LLVOAvatarDefines::TEX_HEAD_ALPHA, "head alpha texture invisible");
+ configureAlphaCheckbox(LLVOAvatarDefines::TEX_EYES_ALPHA, "eye alpha texture invisible");
+ configureAlphaCheckbox(LLVOAvatarDefines::TEX_HAIR_ALPHA, "hair alpha texture invisible");
+
+ // configure tab expanded callbacks
+ for (U32 type_index = 0; type_index < (U32)LLWearableType::WT_COUNT; ++type_index)
+ {
+ LLWearableType::EType type = (LLWearableType::EType) type_index;
+ const LLEditWearableDictionary::WearableEntry *wearable_entry = LLEditWearableDictionary::getInstance()->getWearable(type);
+ if (!wearable_entry)
+ {
+ llwarns << "could not get wearable dictionary entry for wearable of type: " << type << llendl;
+ continue;
+ }
+ U8 num_subparts = wearable_entry->mSubparts.size();
+
+ for (U8 index = 0; index < num_subparts; ++index)
+ {
+ // dive into data structures to get the panel we need
+ ESubpart subpart_e = wearable_entry->mSubparts[index];
+ const LLEditWearableDictionary::SubpartEntry *subpart_entry = LLEditWearableDictionary::getInstance()->getSubpart(subpart_e);
+
+ if (!subpart_entry)
+ {
+ llwarns << "could not get wearable subpart dictionary entry for subpart: " << subpart_e << llendl;
+ continue;
+ }
+
+ const std::string accordion_tab = subpart_entry->mAccordionTab;
+
+ LLAccordionCtrlTab *tab = getChild<LLAccordionCtrlTab>(accordion_tab);
+
+ if (!tab)
+ {
+ llwarns << "could not get llaccordionctrltab from UI with name: " << accordion_tab << llendl;
+ continue;
+ }
+
+ // initialize callback to ensure camera view changes appropriately.
+ tab->setDropDownStateChangedCallback(boost::bind(&LLPanelEditWearable::onTabExpandedCollapsed,this,_2,index));
+ }
+
+ // initialize texture and color picker controls
+ for_each_picker_ctrl_entry <LLColorSwatchCtrl> (getPanel(type), type, boost::bind(init_color_swatch_ctrl, this, _1, _2));
+ for_each_picker_ctrl_entry <LLTextureCtrl> (getPanel(type), type, boost::bind(init_texture_ctrl, this, _1, _2));
+ }
+
+ // init all strings
+ mMeters = mPanelShape->getString("meters");
+ mFeet = mPanelShape->getString("feet");
+ mHeigth = mPanelShape->getString("height") + " ";
+ mHeigthValue = "[HEIGHT] [METRIC1]";
+ mReplacementMetricUrl = "[URL_METRIC2]";
+
+ std::string color = mPanelShape->getString("heigth_label_color");
+ mAvatarHeigthLabelColor = LLUIColorTable::instance().getColor(color, LLColor4::green);
+ color = mPanelShape->getString("heigth_value_label_color");
+ mAvatarHeigthValueLabelColor = LLUIColorTable::instance().getColor(color, LLColor4::green);
+ gSavedSettings.getControl("HeightUnits")->getSignal()->connect(boost::bind(&LLPanelEditWearable::changeHeightUnits, this, _2));
+ updateMetricLayout(gSavedSettings.getBOOL("HeightUnits"));
+
+ return TRUE;
}
// virtual
// LLUICtrl
BOOL LLPanelEditWearable::isDirty() const
{
- BOOL isDirty = FALSE;
- if (mWearablePtr)
- {
- if (mWearablePtr->isDirty() ||
- mWearableItem->getName().compare(mNameEditor->getText()) != 0)
- {
- isDirty = TRUE;
- }
- }
- return isDirty;
+ BOOL isDirty = FALSE;
+ if (mWearablePtr)
+ {
+ if (mWearablePtr->isDirty() ||
+ mWearableItem->getName().compare(mNameEditor->getText()) != 0)
+ {
+ isDirty = TRUE;
+ }
+ }
+ return isDirty;
}
//virtual
void LLPanelEditWearable::draw()
{
- updateVerbs();
- if (getWearable() && getWearable()->getType() == LLWearableType::WT_SHAPE)
- {
- //updating avatar height
- updateTypeSpecificControls(LLWearableType::WT_SHAPE);
- }
+ updateVerbs();
+ if (getWearable() && getWearable()->getType() == LLWearableType::WT_SHAPE)
+ {
+ //updating avatar height
+ updateTypeSpecificControls(LLWearableType::WT_SHAPE);
+ }
- LLPanel::draw();
+ LLPanel::draw();
}
void LLPanelEditWearable::setVisible(BOOL visible)
{
- if (!visible)
- {
- showWearable(mWearablePtr, FALSE);
- }
- LLPanel::setVisible(visible);
+ if (!visible)
+ {
+ showWearable(mWearablePtr, FALSE);
+ }
+ LLPanel::setVisible(visible);
}
-void LLPanelEditWearable::setWearable(LLWearable *wearable)
+void LLPanelEditWearable::setWearable(LLWearable *wearable, BOOL disable_camera_switch)
{
- showWearable(mWearablePtr, FALSE);
- mWearablePtr = wearable;
- showWearable(mWearablePtr, TRUE);
+ showWearable(mWearablePtr, FALSE, disable_camera_switch);
+ mWearablePtr = wearable;
+ showWearable(mWearablePtr, TRUE, disable_camera_switch);
}
//static
void LLPanelEditWearable::onRevertButtonClicked(void* userdata)
{
- LLPanelEditWearable *panel = (LLPanelEditWearable*) userdata;
- panel->revertChanges();
+ LLPanelEditWearable *panel = (LLPanelEditWearable*) userdata;
+ panel->revertChanges();
}
void LLPanelEditWearable::onSaveAsButtonClicked()
{
- LLSD args;
- args["DESC"] = mNameEditor->getText();
+ LLSD args;
+ args["DESC"] = mNameEditor->getText();
- LLNotificationsUtil::add("SaveWearableAs", args, LLSD(), boost::bind(&LLPanelEditWearable::saveAsCallback, this, _1, _2));
+ LLNotificationsUtil::add("SaveWearableAs", args, LLSD(), boost::bind(&LLPanelEditWearable::saveAsCallback, this, _1, _2));
}
void LLPanelEditWearable::saveAsCallback(const LLSD& notification, const LLSD& response)
{
- S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
- if (0 == option)
- {
- std::string wearable_name = response["message"].asString();
- LLStringUtil::trim(wearable_name);
- if( !wearable_name.empty() )
- {
- mNameEditor->setText(wearable_name);
- saveChanges(true);
- }
- }
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ if (0 == option)
+ {
+ std::string wearable_name = response["message"].asString();
+ LLStringUtil::trim(wearable_name);
+ if( !wearable_name.empty() )
+ {
+ mNameEditor->setText(wearable_name);
+ saveChanges(true);
+ }
+ }
}
void LLPanelEditWearable::onCommitSexChange()
{
- if (!isAgentAvatarValid()) return;
+ if (!isAgentAvatarValid()) return;
- LLWearableType::EType type = mWearablePtr->getType();
- U32 index = gAgentWearables.getWearableIndex(mWearablePtr);
+ LLWearableType::EType type = mWearablePtr->getType();
+ U32 index = gAgentWearables.getWearableIndex(mWearablePtr);
- if( !gAgentWearables.isWearableModifiable(type, index))
- {
- return;
- }
+ if( !gAgentWearables.isWearableModifiable(type, index))
+ {
+ return;
+ }
- LLViewerVisualParam* param = static_cast<LLViewerVisualParam*>(gAgentAvatarp->getVisualParam( "male" ));
- if( !param )
- {
- return;
- }
+ LLViewerVisualParam* param = static_cast<LLViewerVisualParam*>(gAgentAvatarp->getVisualParam( "male" ));
+ if( !param )
+ {
+ return;
+ }
- bool is_new_sex_male = (gSavedSettings.getU32("AvatarSex") ? SEX_MALE : SEX_FEMALE) == SEX_MALE;
- LLWearable* wearable = gAgentWearables.getWearable(type, index);
- if (wearable)
- {
- wearable->setVisualParamWeight(param->getID(), is_new_sex_male, FALSE);
- }
- param->setWeight( is_new_sex_male, FALSE );
+ bool is_new_sex_male = (gSavedSettings.getU32("AvatarSex") ? SEX_MALE : SEX_FEMALE) == SEX_MALE;
+ LLWearable* wearable = gAgentWearables.getWearable(type, index);
+ if (wearable)
+ {
+ wearable->setVisualParamWeight(param->getID(), is_new_sex_male, FALSE);
+ }
+ param->setWeight( is_new_sex_male, FALSE );
- gAgentAvatarp->updateSexDependentLayerSets( FALSE );
+ gAgentAvatarp->updateSexDependentLayerSets( FALSE );
- gAgentAvatarp->updateVisualParams();
+ gAgentAvatarp->updateVisualParams();
- updateScrollingPanelUI();
+ updateScrollingPanelUI();
}
void LLPanelEditWearable::onTexturePickerCommit(const LLUICtrl* ctrl)
{
- const LLTextureCtrl* texture_ctrl = dynamic_cast<const LLTextureCtrl*>(ctrl);
- if (!texture_ctrl)
- {
- llwarns << "got commit signal from not LLTextureCtrl." << llendl;
- return;
- }
-
- if (getWearable())
- {
- LLWearableType::EType type = getWearable()->getType();
- const PickerControlEntryNamePredicate name_pred(texture_ctrl->getName());
- const LLEditWearableDictionary::PickerControlEntry* entry
- = find_picker_ctrl_entry_if<LLTextureCtrl, PickerControlEntryNamePredicate>(type, name_pred);
- if (entry)
- {
- // Set the new version
- LLViewerFetchedTexture* image = LLViewerTextureManager::getFetchedTexture(texture_ctrl->getImageAssetID());
- if( image->getID() == IMG_DEFAULT )
- {
- image = LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT_AVATAR);
- }
- if (getWearable())
- {
- U32 index = gAgentWearables.getWearableIndex(getWearable());
- gAgentAvatarp->setLocalTexture(entry->mTextureIndex, image, FALSE, index);
- LLVisualParamHint::requestHintUpdates();
- gAgentAvatarp->wearableUpdated(type, FALSE);
- }
- }
- else
- {
- llwarns << "could not get texture picker dictionary entry for wearable of type: " << type << llendl;
- }
- }
+ const LLTextureCtrl* texture_ctrl = dynamic_cast<const LLTextureCtrl*>(ctrl);
+ if (!texture_ctrl)
+ {
+ llwarns << "got commit signal from not LLTextureCtrl." << llendl;
+ return;
+ }
+
+ if (getWearable())
+ {
+ LLWearableType::EType type = getWearable()->getType();
+ const PickerControlEntryNamePredicate name_pred(texture_ctrl->getName());
+ const LLEditWearableDictionary::PickerControlEntry* entry
+ = find_picker_ctrl_entry_if<LLTextureCtrl, PickerControlEntryNamePredicate>(type, name_pred);
+ if (entry)
+ {
+ // Set the new version
+ LLViewerFetchedTexture* image = LLViewerTextureManager::getFetchedTexture(texture_ctrl->getImageAssetID());
+ if( image->getID() == IMG_DEFAULT )
+ {
+ image = LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT_AVATAR);
+ }
+ if (getWearable())
+ {
+ U32 index = gAgentWearables.getWearableIndex(getWearable());
+ gAgentAvatarp->setLocalTexture(entry->mTextureIndex, image, FALSE, index);
+ LLVisualParamHint::requestHintUpdates();
+ gAgentAvatarp->wearableUpdated(type, FALSE);
+ }
+ }
+ else
+ {
+ llwarns << "could not get texture picker dictionary entry for wearable of type: " << type << llendl;
+ }
+ }
}
void LLPanelEditWearable::onColorSwatchCommit(const LLUICtrl* ctrl)
{
- if (getWearable())
- {
- LLWearableType::EType type = getWearable()->getType();
- const PickerControlEntryNamePredicate name_pred(ctrl->getName());
- const LLEditWearableDictionary::PickerControlEntry* entry
- = find_picker_ctrl_entry_if<LLColorSwatchCtrl, PickerControlEntryNamePredicate>(type, name_pred);
- if (entry)
- {
- const LLColor4& old_color = getWearable()->getClothesColor(entry->mTextureIndex);
- const LLColor4& new_color = LLColor4(ctrl->getValue());
- if( old_color != new_color )
- {
- getWearable()->setClothesColor(entry->mTextureIndex, new_color, TRUE);
- LLVisualParamHint::requestHintUpdates();
- gAgentAvatarp->wearableUpdated(getWearable()->getType(), FALSE);
- }
- }
- else
- {
- llwarns << "could not get color swatch dictionary entry for wearable of type: " << type << llendl;
- }
- }
+ if (getWearable())
+ {
+ LLWearableType::EType type = getWearable()->getType();
+ const PickerControlEntryNamePredicate name_pred(ctrl->getName());
+ const LLEditWearableDictionary::PickerControlEntry* entry
+ = find_picker_ctrl_entry_if<LLColorSwatchCtrl, PickerControlEntryNamePredicate>(type, name_pred);
+ if (entry)
+ {
+ const LLColor4& old_color = getWearable()->getClothesColor(entry->mTextureIndex);
+ const LLColor4& new_color = LLColor4(ctrl->getValue());
+ if( old_color != new_color )
+ {
+ getWearable()->setClothesColor(entry->mTextureIndex, new_color, TRUE);
+ LLVisualParamHint::requestHintUpdates();
+ gAgentAvatarp->wearableUpdated(getWearable()->getType(), FALSE);
+ }
+ }
+ else
+ {
+ llwarns << "could not get color swatch dictionary entry for wearable of type: " << type << llendl;
+ }
+ }
}
void LLPanelEditWearable::updatePanelPickerControls(LLWearableType::EType type)
{
- LLPanel* panel = getPanel(type);
- if (!panel)
- return;
-
- bool is_modifiable = false;
- bool is_copyable = false;
-
- if(mWearableItem)
- {
- const LLPermissions& perm = mWearableItem->getPermissions();
- is_modifiable = perm.allowModifyBy(gAgent.getID(), gAgent.getGroupID());
- is_copyable = perm.allowCopyBy(gAgent.getID(), gAgent.getGroupID());
- }
-
- if (is_modifiable)
- {
- // Update picker controls
- for_each_picker_ctrl_entry <LLColorSwatchCtrl> (panel, type, boost::bind(update_color_swatch_ctrl, this, _1, _2));
- for_each_picker_ctrl_entry <LLTextureCtrl> (panel, type, boost::bind(update_texture_ctrl, this, _1, _2));
- }
- else
- {
- // Disable controls
- for_each_picker_ctrl_entry <LLColorSwatchCtrl> (panel, type, boost::bind(set_enabled_color_swatch_ctrl, false, _1, _2));
- for_each_picker_ctrl_entry <LLTextureCtrl> (panel, type, boost::bind(set_enabled_texture_ctrl, false, _1, _2));
- }
+ LLPanel* panel = getPanel(type);
+ if (!panel)
+ return;
+
+ bool is_modifiable = false;
+ bool is_copyable = false;
+
+ if(mWearableItem)
+ {
+ const LLPermissions& perm = mWearableItem->getPermissions();
+ is_modifiable = perm.allowModifyBy(gAgent.getID(), gAgent.getGroupID());
+ is_copyable = perm.allowCopyBy(gAgent.getID(), gAgent.getGroupID());
+ }
+
+ if (is_modifiable)
+ {
+ // Update picker controls
+ for_each_picker_ctrl_entry <LLColorSwatchCtrl> (panel, type, boost::bind(update_color_swatch_ctrl, this, _1, _2));
+ for_each_picker_ctrl_entry <LLTextureCtrl> (panel, type, boost::bind(update_texture_ctrl, this, _1, _2));
+ }
+ else
+ {
+ // Disable controls
+ for_each_picker_ctrl_entry <LLColorSwatchCtrl> (panel, type, boost::bind(set_enabled_color_swatch_ctrl, false, _1, _2));
+ for_each_picker_ctrl_entry <LLTextureCtrl> (panel, type, boost::bind(set_enabled_texture_ctrl, false, _1, _2));
+ }
}
void LLPanelEditWearable::saveChanges(bool force_save_as)
{
- if (!mWearablePtr || !isDirty())
- {
- // do nothing if no unsaved changes
- return;
- }
-
- U32 index = gAgentWearables.getWearableIndex(mWearablePtr);
-
- std::string new_name = mNameEditor->getText();
- if (force_save_as)
- {
- // the name of the wearable has changed, re-save wearable with new name
- LLAppearanceMgr::instance().removeCOFItemLinks(mWearablePtr->getItemID(),false);
- gAgentWearables.saveWearableAs(mWearablePtr->getType(), index, new_name, FALSE);
- mNameEditor->setText(mWearableItem->getName());
- }
- else
- {
- gAgentWearables.saveWearable(mWearablePtr->getType(), index, TRUE, new_name);
- }
+ if (!mWearablePtr || !isDirty())
+ {
+ // do nothing if no unsaved changes
+ return;
+ }
+
+ U32 index = gAgentWearables.getWearableIndex(mWearablePtr);
+
+ std::string new_name = mNameEditor->getText();
+ if (force_save_as)
+ {
+ // the name of the wearable has changed, re-save wearable with new name
+ LLAppearanceMgr::instance().removeCOFItemLinks(mWearablePtr->getItemID(),false);
+ gAgentWearables.saveWearableAs(mWearablePtr->getType(), index, new_name, FALSE);
+ mNameEditor->setText(mWearableItem->getName());
+ }
+ else
+ {
+ gAgentWearables.saveWearable(mWearablePtr->getType(), index, TRUE, new_name);
+ }
}
void LLPanelEditWearable::revertChanges()
{
- if (!mWearablePtr || !isDirty())
- {
- // no unsaved changes to revert
- return;
- }
-
- mWearablePtr->revertValues();
- mNameEditor->setText(mWearableItem->getName());
- updatePanelPickerControls(mWearablePtr->getType());
- updateTypeSpecificControls(mWearablePtr->getType());
- gAgentAvatarp->wearableUpdated(mWearablePtr->getType(), FALSE);
+ if (!mWearablePtr || !isDirty())
+ {
+ // no unsaved changes to revert
+ return;
+ }
+
+ mWearablePtr->revertValues();
+ mNameEditor->setText(mWearableItem->getName());
+ updatePanelPickerControls(mWearablePtr->getType());
+ updateTypeSpecificControls(mWearablePtr->getType());
+ gAgentAvatarp->wearableUpdated(mWearablePtr->getType(), FALSE);
}
-void LLPanelEditWearable::showWearable(LLWearable* wearable, BOOL show)
-{
- if (!wearable)
- {
- return;
- }
-
- mWearableItem = gInventory.getItem(mWearablePtr->getItemID());
- llassert(mWearableItem);
-
- LLWearableType::EType type = wearable->getType();
- LLPanel *targetPanel = NULL;
- std::string title;
- std::string description_title;
-
- const LLEditWearableDictionary::WearableEntry *wearable_entry = LLEditWearableDictionary::getInstance()->getWearable(type);
- if (!wearable_entry)
- {
- llwarns << "called LLPanelEditWearable::showWearable with an invalid wearable type! (" << type << ")" << llendl;
- return;
- }
-
- targetPanel = getPanel(type);
- title = getString(wearable_entry->mTitle);
- description_title = getString(wearable_entry->mDescTitle);
-
- // Update picker controls state
- for_each_picker_ctrl_entry <LLColorSwatchCtrl> (targetPanel, type, boost::bind(set_enabled_color_swatch_ctrl, show, _1, _2));
- for_each_picker_ctrl_entry <LLTextureCtrl> (targetPanel, type, boost::bind(set_enabled_texture_ctrl, show, _1, _2));
-
- targetPanel->setVisible(show);
- toggleTypeSpecificControls(type);
-
- if (show)
- {
- mPanelTitle->setText(title);
- mPanelTitle->setToolTip(title);
- mDescTitle->setText(description_title);
-
- // set name
- mNameEditor->setText(mWearableItem->getName());
-
- updatePanelPickerControls(type);
- updateTypeSpecificControls(type);
-
- // clear and rebuild visual param list
- U8 num_subparts = wearable_entry->mSubparts.size();
-
- for (U8 index = 0; index < num_subparts; ++index)
- {
- // dive into data structures to get the panel we need
- ESubpart subpart_e = wearable_entry->mSubparts[index];
- const LLEditWearableDictionary::SubpartEntry *subpart_entry = LLEditWearableDictionary::getInstance()->getSubpart(subpart_e);
-
- if (!subpart_entry)
- {
- llwarns << "could not get wearable subpart dictionary entry for subpart: " << subpart_e << llendl;
- continue;
- }
-
- const std::string scrolling_panel = subpart_entry->mParamList;
- const std::string accordion_tab = subpart_entry->mAccordionTab;
-
- LLScrollingPanelList *panel_list = getChild<LLScrollingPanelList>(scrolling_panel);
- LLAccordionCtrlTab *tab = getChild<LLAccordionCtrlTab>(accordion_tab);
-
- if (!panel_list)
- {
- llwarns << "could not get scrolling panel list: " << scrolling_panel << llendl;
- continue;
- }
-
- if (!tab)
+void LLPanelEditWearable::showWearable(LLWearable* wearable, BOOL show, BOOL disable_camera_switch)
+{
+ if (!wearable)
+ {
+ return;
+ }
+
+ mWearableItem = gInventory.getItem(mWearablePtr->getItemID());
+ llassert(mWearableItem);
+
+ LLWearableType::EType type = wearable->getType();
+ LLPanel *targetPanel = NULL;
+ std::string title;
+ std::string description_title;
+
+ const LLEditWearableDictionary::WearableEntry *wearable_entry = LLEditWearableDictionary::getInstance()->getWearable(type);
+ if (!wearable_entry)
+ {
+ llwarns << "called LLPanelEditWearable::showWearable with an invalid wearable type! (" << type << ")" << llendl;
+ return;
+ }
+
+ targetPanel = getPanel(type);
+ title = getString(wearable_entry->mTitle);
+ description_title = getString(wearable_entry->mDescTitle);
+
+ // Update picker controls state
+ for_each_picker_ctrl_entry <LLColorSwatchCtrl> (targetPanel, type, boost::bind(set_enabled_color_swatch_ctrl, show, _1, _2));
+ for_each_picker_ctrl_entry <LLTextureCtrl> (targetPanel, type, boost::bind(set_enabled_texture_ctrl, show, _1, _2));
+
+ targetPanel->setVisible(show);
+ toggleTypeSpecificControls(type);
+
+ if (show)
+ {
+ mPanelTitle->setText(title);
+ mPanelTitle->setToolTip(title);
+ mDescTitle->setText(description_title);
+
+ // set name
+ mNameEditor->setText(mWearableItem->getName());
+
+ updatePanelPickerControls(type);
+ updateTypeSpecificControls(type);
+
+ // clear and rebuild visual param list
+ U8 num_subparts = wearable_entry->mSubparts.size();
+
+ for (U8 index = 0; index < num_subparts; ++index)
+ {
+ // dive into data structures to get the panel we need
+ ESubpart subpart_e = wearable_entry->mSubparts[index];
+ const LLEditWearableDictionary::SubpartEntry *subpart_entry = LLEditWearableDictionary::getInstance()->getSubpart(subpart_e);
+
+ if (!subpart_entry)
+ {
+ llwarns << "could not get wearable subpart dictionary entry for subpart: " << subpart_e << llendl;
+ continue;
+ }
+
+ const std::string scrolling_panel = subpart_entry->mParamList;
+ const std::string accordion_tab = subpart_entry->mAccordionTab;
+
+ LLScrollingPanelList *panel_list = getChild<LLScrollingPanelList>(scrolling_panel);
+ LLAccordionCtrlTab *tab = getChild<LLAccordionCtrlTab>(accordion_tab);
+
+ if (!panel_list)
+ {
+ llwarns << "could not get scrolling panel list: " << scrolling_panel << llendl;
+ continue;
+ }
+
+ if (!tab)
+ {
+ llwarns << "could not get llaccordionctrltab from UI with name: " << accordion_tab << llendl;
+ continue;
+ }
+
+ // Don't show female subparts if you're not female, etc.
+ if (!(gAgentAvatarp->getSex() & subpart_entry->mSex))
{
- llwarns << "could not get llaccordionctrltab from UI with name: " << accordion_tab << llendl;
+ tab->setVisible(FALSE);
continue;
}
-
- // what edit group do we want to extract params for?
- const std::string edit_group = subpart_entry->mEditGroup;
-
- // storage for ordered list of visual params
- value_map_t sorted_params;
- getSortedParams(sorted_params, edit_group);
-
- LLJoint* jointp = gAgentAvatarp->getJoint( subpart_entry->mTargetJoint );
- if (!jointp)
+ else
{
- jointp = gAgentAvatarp->getJoint("mHead");
+ tab->setVisible(TRUE);
}
-
- buildParamList(panel_list, sorted_params, tab, jointp);
-
- updateScrollingPanelUI();
- }
- showDefaultSubpart();
-
- updateVerbs();
- }
+
+ // what edit group do we want to extract params for?
+ const std::string edit_group = subpart_entry->mEditGroup;
+
+ // storage for ordered list of visual params
+ value_map_t sorted_params;
+ getSortedParams(sorted_params, edit_group);
+
+ LLJoint* jointp = gAgentAvatarp->getJoint( subpart_entry->mTargetJoint );
+ if (!jointp)
+ {
+ jointp = gAgentAvatarp->getJoint("mHead");
+ }
+
+ buildParamList(panel_list, sorted_params, tab, jointp);
+
+ updateScrollingPanelUI();
+ }
+ if (!disable_camera_switch)
+ {
+ showDefaultSubpart();
+ }
+
+ updateVerbs();
+ }
}
void LLPanelEditWearable::showDefaultSubpart()
{
- changeCamera(0);
+ changeCamera(3);
}
void LLPanelEditWearable::onTabExpandedCollapsed(const LLSD& param, U8 index)
{
- bool expanded = param.asBoolean();
+ bool expanded = param.asBoolean();
- if (!mWearablePtr || !gAgentCamera.cameraCustomizeAvatar())
- {
- // we don't have a valid wearable we're editing, or we've left the wearable editor
- return;
- }
+ if (!mWearablePtr || !gAgentCamera.cameraCustomizeAvatar())
+ {
+ // we don't have a valid wearable we're editing, or we've left the wearable editor
+ return;
+ }
- if (expanded)
- {
- changeCamera(index);
- }
+ if (expanded)
+ {
+ changeCamera(index);
+ }
}
void LLPanelEditWearable::changeCamera(U8 subpart)
{
- const LLEditWearableDictionary::WearableEntry *wearable_entry = LLEditWearableDictionary::getInstance()->getWearable(mWearablePtr->getType());
- if (!wearable_entry)
- {
- llinfos << "could not get wearable dictionary entry for wearable type: " << mWearablePtr->getType() << llendl;
- return;
- }
-
- if (subpart >= wearable_entry->mSubparts.size())
- {
- llinfos << "accordion tab expanded for invalid subpart. Wearable type: " << mWearablePtr->getType() << " subpart num: " << subpart << llendl;
- return;
- }
-
- ESubpart subpart_e = wearable_entry->mSubparts[subpart];
- const LLEditWearableDictionary::SubpartEntry *subpart_entry = LLEditWearableDictionary::getInstance()->getSubpart(subpart_e);
-
- if (!subpart_entry)
+ // Don't change the camera if this type doesn't have a camera switch.
+ // Useful for wearables like physics that don't have an associated physical body part.
+ if (LLWearableType::getDisableCameraSwitch(mWearablePtr->getType()))
{
- llwarns << "could not get wearable subpart dictionary entry for subpart: " << subpart_e << llendl;
return;
}
-
- // Update the camera
- gMorphView->setCameraTargetJoint( gAgentAvatarp->getJoint( subpart_entry->mTargetJoint ) );
- gMorphView->setCameraTargetOffset( subpart_entry->mTargetOffset );
- gMorphView->setCameraOffset( subpart_entry->mCameraOffset );
- if (gSavedSettings.getBOOL("AppearanceCameraMovement"))
- {
- gMorphView->updateCamera();
- }
+ const LLEditWearableDictionary::WearableEntry *wearable_entry = LLEditWearableDictionary::getInstance()->getWearable(mWearablePtr->getType());
+ if (!wearable_entry)
+ {
+ llinfos << "could not get wearable dictionary entry for wearable type: " << mWearablePtr->getType() << llendl;
+ return;
+ }
+
+ if (subpart >= wearable_entry->mSubparts.size())
+ {
+ llinfos << "accordion tab expanded for invalid subpart. Wearable type: " << mWearablePtr->getType() << " subpart num: " << subpart << llendl;
+ return;
+ }
+
+ ESubpart subpart_e = wearable_entry->mSubparts[subpart];
+ const LLEditWearableDictionary::SubpartEntry *subpart_entry = LLEditWearableDictionary::getInstance()->getSubpart(subpart_e);
+
+ if (!subpart_entry)
+ {
+ llwarns << "could not get wearable subpart dictionary entry for subpart: " << subpart_e << llendl;
+ return;
+ }
+
+ // Update the camera
+ gMorphView->setCameraTargetJoint( gAgentAvatarp->getJoint( subpart_entry->mTargetJoint ) );
+ gMorphView->setCameraTargetOffset( subpart_entry->mTargetOffset );
+ gMorphView->setCameraOffset( subpart_entry->mCameraOffset );
+ if (gSavedSettings.getBOOL("AppearanceCameraMovement"))
+ {
+ gMorphView->updateCamera();
+ }
}
void LLPanelEditWearable::updateScrollingPanelList()
{
- updateScrollingPanelUI();
+ updateScrollingPanelUI();
}
void LLPanelEditWearable::toggleTypeSpecificControls(LLWearableType::EType type)
{
- // Toggle controls specific to shape editing panel.
- {
- bool is_shape = (type == LLWearableType::WT_SHAPE);
- getChildView("sex_radio")->setVisible( is_shape);
- getChildView("female_icon")->setVisible( is_shape);
- getChildView("male_icon")->setVisible( is_shape);
- }
+ // Toggle controls specific to shape editing panel.
+ {
+ bool is_shape = (type == LLWearableType::WT_SHAPE);
+ getChildView("sex_radio")->setVisible( is_shape);
+ getChildView("female_icon")->setVisible( is_shape);
+ getChildView("male_icon")->setVisible( is_shape);
+ }
}
void LLPanelEditWearable::updateTypeSpecificControls(LLWearableType::EType type)
{
- const F32 ONE_METER = 1.0;
- const F32 ONE_FOOT = 0.3048 * ONE_METER; // in meters
- // Update controls specific to shape editing panel.
- if (type == LLWearableType::WT_SHAPE)
- {
- // Update avatar height
- F32 new_size = gAgentAvatarp->mBodySize.mV[VZ];
- if (gSavedSettings.getBOOL("HeightUnits") == FALSE)
- {
- // convert meters to feet
- new_size = new_size / ONE_FOOT;
- }
-
- std::string avatar_height_str = llformat("%.2f", new_size);
- mHeigthValue.setArg("[HEIGHT]", avatar_height_str);
- updateAvatarHeightLabel();
- }
-
- if (LLWearableType::WT_ALPHA == type)
- {
- updateAlphaCheckboxes();
-
- initPreviousAlphaTextures();
- }
+ const F32 ONE_METER = 1.0;
+ const F32 ONE_FOOT = 0.3048 * ONE_METER; // in meters
+ // Update controls specific to shape editing panel.
+ if (type == LLWearableType::WT_SHAPE)
+ {
+ // Update avatar height
+ F32 new_size = gAgentAvatarp->mBodySize.mV[VZ];
+ if (gSavedSettings.getBOOL("HeightUnits") == FALSE)
+ {
+ // convert meters to feet
+ new_size = new_size / ONE_FOOT;
+ }
+
+ std::string avatar_height_str = llformat("%.2f", new_size);
+ mHeigthValue.setArg("[HEIGHT]", avatar_height_str);
+ updateAvatarHeightLabel();
+ }
+
+ if (LLWearableType::WT_ALPHA == type)
+ {
+ updateAlphaCheckboxes();
+
+ initPreviousAlphaTextures();
+ }
}
void LLPanelEditWearable::updateScrollingPanelUI()
{
- // do nothing if we don't have a valid wearable we're editing
- if (mWearablePtr == NULL)
- {
- return;
- }
-
- LLWearableType::EType type = mWearablePtr->getType();
- LLPanel *panel = getPanel(type);
-
- if(panel && (mWearablePtr->getItemID().notNull()))
- {
- const LLEditWearableDictionary::WearableEntry *wearable_entry = LLEditWearableDictionary::getInstance()->getWearable(type);
- llassert(wearable_entry);
- if (!wearable_entry) return;
- U8 num_subparts = wearable_entry->mSubparts.size();
-
- LLScrollingPanelParam::sUpdateDelayFrames = 0;
- for (U8 index = 0; index < num_subparts; ++index)
- {
- // dive into data structures to get the panel we need
- ESubpart subpart_e = wearable_entry->mSubparts[index];
- const LLEditWearableDictionary::SubpartEntry *subpart_entry = LLEditWearableDictionary::getInstance()->getSubpart(subpart_e);
-
- const std::string scrolling_panel = subpart_entry->mParamList;
-
- LLScrollingPanelList *panel_list = getChild<LLScrollingPanelList>(scrolling_panel);
-
- if (!panel_list)
- {
- llwarns << "could not get scrolling panel list: " << scrolling_panel << llendl;
- continue;
- }
-
- panel_list->updatePanels(TRUE);
- }
- }
+ // do nothing if we don't have a valid wearable we're editing
+ if (mWearablePtr == NULL)
+ {
+ return;
+ }
+
+ LLWearableType::EType type = mWearablePtr->getType();
+ LLPanel *panel = getPanel(type);
+
+ if(panel && (mWearablePtr->getItemID().notNull()))
+ {
+ const LLEditWearableDictionary::WearableEntry *wearable_entry = LLEditWearableDictionary::getInstance()->getWearable(type);
+ llassert(wearable_entry);
+ if (!wearable_entry) return;
+ U8 num_subparts = wearable_entry->mSubparts.size();
+
+ LLScrollingPanelParam::sUpdateDelayFrames = 0;
+ for (U8 index = 0; index < num_subparts; ++index)
+ {
+ // dive into data structures to get the panel we need
+ ESubpart subpart_e = wearable_entry->mSubparts[index];
+ const LLEditWearableDictionary::SubpartEntry *subpart_entry = LLEditWearableDictionary::getInstance()->getSubpart(subpart_e);
+
+ const std::string scrolling_panel = subpart_entry->mParamList;
+
+ LLScrollingPanelList *panel_list = getChild<LLScrollingPanelList>(scrolling_panel);
+
+ if (!panel_list)
+ {
+ llwarns << "could not get scrolling panel list: " << scrolling_panel << llendl;
+ continue;
+ }
+
+ panel_list->updatePanels(TRUE);
+ }
+ }
}
LLPanel* LLPanelEditWearable::getPanel(LLWearableType::EType type)
{
- switch (type)
- {
- case LLWearableType::WT_SHAPE:
- return mPanelShape;
- break;
-
- case LLWearableType::WT_SKIN:
- return mPanelSkin;
- break;
-
- case LLWearableType::WT_HAIR:
- return mPanelHair;
- break;
-
- case LLWearableType::WT_EYES:
- return mPanelEyes;
- break;
-
- case LLWearableType::WT_SHIRT:
- return mPanelShirt;
- break;
-
- case LLWearableType::WT_PANTS:
- return mPanelPants;
- break;
-
- case LLWearableType::WT_SHOES:
- return mPanelShoes;
- break;
-
- case LLWearableType::WT_SOCKS:
- return mPanelSocks;
- break;
-
- case LLWearableType::WT_JACKET:
- return mPanelJacket;
- break;
-
- case LLWearableType::WT_GLOVES:
- return mPanelGloves;
- break;
-
- case LLWearableType::WT_UNDERSHIRT:
- return mPanelUndershirt;
- break;
-
- case LLWearableType::WT_UNDERPANTS:
- return mPanelUnderpants;
- break;
-
- case LLWearableType::WT_SKIRT:
- return mPanelSkirt;
- break;
-
- case LLWearableType::WT_ALPHA:
- return mPanelAlpha;
- break;
-
- case LLWearableType::WT_TATTOO:
- return mPanelTattoo;
- break;
- default:
- break;
- }
- return NULL;
+ switch (type)
+ {
+ case LLWearableType::WT_SHAPE:
+ return mPanelShape;
+ break;
+
+ case LLWearableType::WT_SKIN:
+ return mPanelSkin;
+ break;
+
+ case LLWearableType::WT_HAIR:
+ return mPanelHair;
+ break;
+
+ case LLWearableType::WT_EYES:
+ return mPanelEyes;
+ break;
+
+ case LLWearableType::WT_SHIRT:
+ return mPanelShirt;
+ break;
+
+ case LLWearableType::WT_PANTS:
+ return mPanelPants;
+ break;
+
+ case LLWearableType::WT_SHOES:
+ return mPanelShoes;
+ break;
+
+ case LLWearableType::WT_SOCKS:
+ return mPanelSocks;
+ break;
+
+ case LLWearableType::WT_JACKET:
+ return mPanelJacket;
+ break;
+
+ case LLWearableType::WT_GLOVES:
+ return mPanelGloves;
+ break;
+
+ case LLWearableType::WT_UNDERSHIRT:
+ return mPanelUndershirt;
+ break;
+
+ case LLWearableType::WT_UNDERPANTS:
+ return mPanelUnderpants;
+ break;
+
+ case LLWearableType::WT_SKIRT:
+ return mPanelSkirt;
+ break;
+
+ case LLWearableType::WT_ALPHA:
+ return mPanelAlpha;
+ break;
+
+ case LLWearableType::WT_TATTOO:
+ return mPanelTattoo;
+ break;
+
+ case LLWearableType::WT_PHYSICS:
+ return mPanelPhysics;
+ break;
+
+ default:
+ break;
+ }
+ return NULL;
}
void LLPanelEditWearable::getSortedParams(value_map_t &sorted_params, const std::string &edit_group)
{
- LLWearable::visual_param_vec_t param_list;
- ESex avatar_sex = gAgentAvatarp->getSex();
-
- mWearablePtr->getVisualParams(param_list);
-
- for (LLWearable::visual_param_vec_t::iterator iter = param_list.begin();
- iter != param_list.end();
- ++iter)
- {
- LLViewerVisualParam *param = (LLViewerVisualParam*) *iter;
-
- if (param->getID() == -1
- || !param->isTweakable()
- || param->getEditGroup() != edit_group
- || !(param->getSex() & avatar_sex))
- {
- continue;
- }
-
- value_map_t::value_type vt(-param->getDisplayOrder(), param);
- llassert( sorted_params.find(-param->getDisplayOrder()) == sorted_params.end() ); //check for duplicates
- sorted_params.insert(vt);
- }
+ LLWearable::visual_param_vec_t param_list;
+ ESex avatar_sex = gAgentAvatarp->getSex();
+
+ mWearablePtr->getVisualParams(param_list);
+
+ for (LLWearable::visual_param_vec_t::iterator iter = param_list.begin();
+ iter != param_list.end();
+ ++iter)
+ {
+ LLViewerVisualParam *param = (LLViewerVisualParam*) *iter;
+
+ if (param->getID() == -1
+ || !param->isTweakable()
+ || param->getEditGroup() != edit_group
+ || !(param->getSex() & avatar_sex))
+ {
+ continue;
+ }
+
+ value_map_t::value_type vt(-param->getDisplayOrder(), param);
+ llassert( sorted_params.find(-param->getDisplayOrder()) == sorted_params.end() ); //check for duplicates
+ sorted_params.insert(vt);
+ }
}
void LLPanelEditWearable::buildParamList(LLScrollingPanelList *panel_list, value_map_t &sorted_params, LLAccordionCtrlTab *tab, LLJoint* jointp)
{
- // sorted_params is sorted according to magnitude of effect from
- // least to greatest. Adding to the front of the child list
- // reverses that order.
- if( panel_list )
- {
- panel_list->clearPanels();
- value_map_t::iterator end = sorted_params.end();
- S32 height = 0;
- for(value_map_t::iterator it = sorted_params.begin(); it != end; ++it)
- {
- LLPanel::Params p;
- p.name("LLScrollingPanelParam");
- LLScrollingPanelParam* panel_param = new LLScrollingPanelParam( p, NULL, (*it).second, TRUE, this->getWearable(), jointp);
- height = panel_list->addPanel( panel_param );
- }
- }
+ // sorted_params is sorted according to magnitude of effect from
+ // least to greatest. Adding to the front of the child list
+ // reverses that order.
+ if( panel_list )
+ {
+ panel_list->clearPanels();
+ value_map_t::iterator end = sorted_params.end();
+ S32 height = 0;
+ for(value_map_t::iterator it = sorted_params.begin(); it != end; ++it)
+ {
+ LLPanel::Params p;
+ p.name("LLScrollingPanelParam");
+ LLWearable *wearable = this->getWearable();
+ LLScrollingPanelParamBase *panel_param = NULL;
+ if (wearable && wearable->getType() == LLWearableType::WT_PHYSICS) // Hack to show a different panel for physics. Should generalize this later.
+ {
+ panel_param = new LLScrollingPanelParamBase( p, NULL, (*it).second, TRUE, this->getWearable(), jointp);
+ }
+ else
+ {
+ panel_param = new LLScrollingPanelParam( p, NULL, (*it).second, TRUE, this->getWearable(), jointp);
+ }
+ height = panel_list->addPanel( panel_param );
+ }
+ }
}
void LLPanelEditWearable::updateVerbs()
{
- bool can_copy = false;
+ bool can_copy = false;
- if(mWearableItem)
- {
- can_copy = mWearableItem->getPermissions().allowCopyBy(gAgentID);
- }
+ if(mWearableItem)
+ {
+ can_copy = mWearableItem->getPermissions().allowCopyBy(gAgentID);
+ }
- BOOL is_dirty = isDirty();
+ BOOL is_dirty = isDirty();
- mBtnRevert->setEnabled(is_dirty);
- getChildView("save_as_button")->setEnabled(is_dirty && can_copy);
+ mBtnRevert->setEnabled(is_dirty);
+ getChildView("save_as_button")->setEnabled(is_dirty && can_copy);
- if(isAgentAvatarValid())
- {
- // Update viewer's radio buttons (of RadioGroup with control_name="AvatarSex") of Avatar's gender
- // with value from "AvatarSex" setting
- gSavedSettings.setU32("AvatarSex", (gAgentAvatarp->getSex() == SEX_MALE) );
- }
+ if(isAgentAvatarValid())
+ {
+ // Update viewer's radio buttons (of RadioGroup with control_name="AvatarSex") of Avatar's gender
+ // with value from "AvatarSex" setting
+ gSavedSettings.setU32("AvatarSex", (gAgentAvatarp->getSex() == SEX_MALE) );
+ }
- // update back button and title according to dirty state.
- static BOOL was_dirty = FALSE;
- if (was_dirty != is_dirty) // to avoid redundant changes because this method is called from draw
- {
- static S32 label_width = mBtnBack->getFont()->getWidth(mBackBtnLabel);
- const std::string& label = is_dirty ? mBackBtnLabel : LLStringUtil::null;
- const S32 delta_width = is_dirty ? label_width : -label_width;
+ // update back button and title according to dirty state.
+ static BOOL was_dirty = FALSE;
+ if (was_dirty != is_dirty) // to avoid redundant changes because this method is called from draw
+ {
+ static S32 label_width = mBtnBack->getFont()->getWidth(mBackBtnLabel);
+ const std::string& label = is_dirty ? mBackBtnLabel : LLStringUtil::null;
+ const S32 delta_width = is_dirty ? label_width : -label_width;
- mBtnBack->setLabel(label);
+ mBtnBack->setLabel(label);
- // update rect according to label width
- LLRect rect = mBtnBack->getRect();
- rect.mRight += delta_width;
- mBtnBack->setShape(rect);
+ // update rect according to label width
+ LLRect rect = mBtnBack->getRect();
+ rect.mRight += delta_width;
+ mBtnBack->setShape(rect);
- // update title rect according to back button width
- rect = mPanelTitle->getRect();
- rect.mLeft += delta_width;
- mPanelTitle->setShape(rect);
+ // update title rect according to back button width
+ rect = mPanelTitle->getRect();
+ rect.mLeft += delta_width;
+ mPanelTitle->setShape(rect);
- was_dirty = is_dirty;
- }
+ was_dirty = is_dirty;
+ }
}
void LLPanelEditWearable::configureAlphaCheckbox(LLVOAvatarDefines::ETextureIndex te, const std::string& name)
{
- LLCheckBoxCtrl* checkbox = mPanelAlpha->getChild<LLCheckBoxCtrl>(name);
- checkbox->setCommitCallback(boost::bind(&LLPanelEditWearable::onInvisibilityCommit, this, checkbox, te));
+ LLCheckBoxCtrl* checkbox = mPanelAlpha->getChild<LLCheckBoxCtrl>(name);
+ checkbox->setCommitCallback(boost::bind(&LLPanelEditWearable::onInvisibilityCommit, this, checkbox, te));
- mAlphaCheckbox2Index[name] = te;
+ mAlphaCheckbox2Index[name] = te;
}
void LLPanelEditWearable::onInvisibilityCommit(LLCheckBoxCtrl* checkbox_ctrl, LLVOAvatarDefines::ETextureIndex te)
{
- if (!checkbox_ctrl) return;
- if (!getWearable()) return;
-
- llinfos << "onInvisibilityCommit, self " << this << " checkbox_ctrl " << checkbox_ctrl << llendl;
-
- bool new_invis_state = checkbox_ctrl->get();
- if (new_invis_state)
- {
- LLLocalTextureObject *lto = getWearable()->getLocalTextureObject(te);
- mPreviousAlphaTexture[te] = lto->getID();
-
- LLViewerFetchedTexture* image = LLViewerTextureManager::getFetchedTexture( IMG_INVISIBLE );
- U32 index = gAgentWearables.getWearableIndex(getWearable());
- gAgentAvatarp->setLocalTexture(te, image, FALSE, index);
- gAgentAvatarp->wearableUpdated(getWearable()->getType(), FALSE);
- }
- else
- {
- // Try to restore previous texture, if any.
- LLUUID prev_id = mPreviousAlphaTexture[te];
- if (prev_id.isNull() || (prev_id == IMG_INVISIBLE))
- {
- prev_id = LLUUID( gSavedSettings.getString( "UIImgDefaultAlphaUUID" ) );
- }
- if (prev_id.isNull()) return;
-
- LLViewerFetchedTexture* image = LLViewerTextureManager::getFetchedTexture(prev_id);
- if (!image) return;
-
- U32 index = gAgentWearables.getWearableIndex(getWearable());
- gAgentAvatarp->setLocalTexture(te, image, FALSE, index);
- gAgentAvatarp->wearableUpdated(getWearable()->getType(), FALSE);
- }
-
- updatePanelPickerControls(getWearable()->getType());
+ if (!checkbox_ctrl) return;
+ if (!getWearable()) return;
+
+ llinfos << "onInvisibilityCommit, self " << this << " checkbox_ctrl " << checkbox_ctrl << llendl;
+
+ bool new_invis_state = checkbox_ctrl->get();
+ if (new_invis_state)
+ {
+ LLLocalTextureObject *lto = getWearable()->getLocalTextureObject(te);
+ mPreviousAlphaTexture[te] = lto->getID();
+
+ LLViewerFetchedTexture* image = LLViewerTextureManager::getFetchedTexture( IMG_INVISIBLE );
+ U32 index = gAgentWearables.getWearableIndex(getWearable());
+ gAgentAvatarp->setLocalTexture(te, image, FALSE, index);
+ gAgentAvatarp->wearableUpdated(getWearable()->getType(), FALSE);
+ }
+ else
+ {
+ // Try to restore previous texture, if any.
+ LLUUID prev_id = mPreviousAlphaTexture[te];
+ if (prev_id.isNull() || (prev_id == IMG_INVISIBLE))
+ {
+ prev_id = LLUUID( gSavedSettings.getString( "UIImgDefaultAlphaUUID" ) );
+ }
+ if (prev_id.isNull()) return;
+
+ LLViewerFetchedTexture* image = LLViewerTextureManager::getFetchedTexture(prev_id);
+ if (!image) return;
+
+ U32 index = gAgentWearables.getWearableIndex(getWearable());
+ gAgentAvatarp->setLocalTexture(te, image, FALSE, index);
+ gAgentAvatarp->wearableUpdated(getWearable()->getType(), FALSE);
+ }
+
+ updatePanelPickerControls(getWearable()->getType());
}
void LLPanelEditWearable::updateAlphaCheckboxes()
{
- for(string_texture_index_map_t::iterator iter = mAlphaCheckbox2Index.begin();
- iter != mAlphaCheckbox2Index.end(); ++iter )
- {
- LLVOAvatarDefines::ETextureIndex te = (LLVOAvatarDefines::ETextureIndex)iter->second;
- LLCheckBoxCtrl* ctrl = mPanelAlpha->getChild<LLCheckBoxCtrl>(iter->first);
- if (ctrl)
- {
- ctrl->set(!gAgentAvatarp->isTextureVisible(te, mWearablePtr));
- }
- }
+ for(string_texture_index_map_t::iterator iter = mAlphaCheckbox2Index.begin();
+ iter != mAlphaCheckbox2Index.end(); ++iter )
+ {
+ LLVOAvatarDefines::ETextureIndex te = (LLVOAvatarDefines::ETextureIndex)iter->second;
+ LLCheckBoxCtrl* ctrl = mPanelAlpha->getChild<LLCheckBoxCtrl>(iter->first);
+ if (ctrl)
+ {
+ ctrl->set(!gAgentAvatarp->isTextureVisible(te, mWearablePtr));
+ }
+ }
}
void LLPanelEditWearable::initPreviousAlphaTextures()
{
- initPreviousAlphaTextureEntry(TEX_LOWER_ALPHA);
- initPreviousAlphaTextureEntry(TEX_UPPER_ALPHA);
- initPreviousAlphaTextureEntry(TEX_HEAD_ALPHA);
- initPreviousAlphaTextureEntry(TEX_EYES_ALPHA);
- initPreviousAlphaTextureEntry(TEX_LOWER_ALPHA);
+ initPreviousAlphaTextureEntry(TEX_LOWER_ALPHA);
+ initPreviousAlphaTextureEntry(TEX_UPPER_ALPHA);
+ initPreviousAlphaTextureEntry(TEX_HEAD_ALPHA);
+ initPreviousAlphaTextureEntry(TEX_EYES_ALPHA);
+ initPreviousAlphaTextureEntry(TEX_LOWER_ALPHA);
}
void LLPanelEditWearable::initPreviousAlphaTextureEntry(LLVOAvatarDefines::ETextureIndex te)
{
- LLLocalTextureObject *lto = getWearable()->getLocalTextureObject(te);
- if (lto)
- {
- mPreviousAlphaTexture[te] = lto->getID();
- }
+ LLLocalTextureObject *lto = getWearable()->getLocalTextureObject(te);
+ if (lto)
+ {
+ mPreviousAlphaTexture[te] = lto->getID();
+ }
}
// handle secondlife:///app/metricsystem
class LLMetricSystemHandler : public LLCommandHandler
{
public:
- LLMetricSystemHandler() : LLCommandHandler("metricsystem", UNTRUSTED_THROTTLE) { }
-
- bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web)
- {
- // change height units TRUE for meters and FALSE for feet
- BOOL new_value = (gSavedSettings.getBOOL("HeightUnits") == FALSE) ? TRUE : FALSE;
- gSavedSettings.setBOOL("HeightUnits", new_value);
- return true;
- }
+ LLMetricSystemHandler() : LLCommandHandler("metricsystem", UNTRUSTED_THROTTLE) { }
+
+ bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web)
+ {
+ // change height units TRUE for meters and FALSE for feet
+ BOOL new_value = (gSavedSettings.getBOOL("HeightUnits") == FALSE) ? TRUE : FALSE;
+ gSavedSettings.setBOOL("HeightUnits", new_value);
+ return true;
+ }
};
LLMetricSystemHandler gMetricSystemHandler;
diff --git a/indra/newview/llpaneleditwearable.h b/indra/newview/llpaneleditwearable.h
index 43513d8ab3..692a7ce90f 100644
--- a/indra/newview/llpaneleditwearable.h
+++ b/indra/newview/llpaneleditwearable.h
@@ -55,8 +55,11 @@ public:
/*virtual*/ BOOL isDirty() const; // LLUICtrl
/*virtual*/ void draw();
+ // changes camera angle to default for selected subpart
+ void changeCamera(U8 subpart);
+
LLWearable* getWearable() { return mWearablePtr; }
- void setWearable(LLWearable *wearable);
+ void setWearable(LLWearable *wearable, BOOL disable_camera_switch = FALSE);
void saveChanges(bool force_save_as = false);
void revertChanges();
@@ -77,7 +80,7 @@ public:
private:
typedef std::map<F32, LLViewerVisualParam*> value_map_t;
- void showWearable(LLWearable* wearable, BOOL show);
+ void showWearable(LLWearable* wearable, BOOL show, BOOL disable_camera_switch = FALSE);
void updateScrollingPanelUI();
LLPanel* getPanel(LLWearableType::EType type);
void getSortedParams(value_map_t &sorted_params, const std::string &edit_group);
@@ -91,9 +94,6 @@ private:
void toggleTypeSpecificControls(LLWearableType::EType type);
void updateTypeSpecificControls(LLWearableType::EType type);
- // changes camera angle to default for selected subpart
- void changeCamera(U8 subpart);
-
//alpha mask checkboxes
void configureAlphaCheckbox(LLVOAvatarDefines::ETextureIndex te, const std::string& name);
void onInvisibilityCommit(LLCheckBoxCtrl* checkbox_ctrl, LLVOAvatarDefines::ETextureIndex te);
@@ -163,6 +163,7 @@ private:
LLPanel *mPanelSkirt;
LLPanel *mPanelAlpha;
LLPanel *mPanelTattoo;
+ LLPanel *mPanelPhysics;
typedef std::map<std::string, LLVOAvatarDefines::ETextureIndex> string_texture_index_map_t;
string_texture_index_map_t mAlphaCheckbox2Index;
diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp
index bce496cbad..7301b305b2 100644
--- a/indra/newview/llpanelface.cpp
+++ b/indra/newview/llpanelface.cpp
@@ -30,6 +30,7 @@
#include "llpanelface.h"
// library includes
+#include "llcalc.h"
#include "llerror.h"
#include "llfocusmgr.h"
#include "llrect.h"
@@ -376,6 +377,11 @@ struct LLPanelFaceSetAlignedTEFunctor : public LLSelectedTEFunctor
return true;
}
+ if (facep->getViewerObject()->getVolume()->getNumVolumeFaces() <= te)
+ {
+ return true;
+ }
+
bool set_aligned = true;
if (facep == mCenterFace)
{
@@ -418,6 +424,12 @@ struct LLPanelFaceGetIsAlignedTEFunctor : public LLSelectedTEFunctor
{
return false;
}
+
+ if (facep->getViewerObject()->getVolume()->getNumVolumeFaces() <= te)
+ { //volume face does not exist, can't be aligned
+ return false;
+ }
+
if (facep == mCenterFace)
{
return true;
@@ -863,8 +875,15 @@ void LLPanelFace::getState()
{
getChild<LLUICtrl>("TexScaleU")->setValue(2.0f * getChild<LLUICtrl>("TexScaleU")->getValue().asReal() );
getChild<LLUICtrl>("TexScaleV")->setValue(2.0f * getChild<LLUICtrl>("TexScaleV")->getValue().asReal() );
- }
+ // EXP-1507 (change label based on the mapping mode)
+ getChild<LLUICtrl>("rpt")->setValue(getString("string repeats per meter"));
+ }
+ else
+ if (selected_texgen == 0) // FIXME: should not be magic numbers
+ {
+ getChild<LLUICtrl>("rpt")->setValue(getString("string repeats per face"));
+ }
}
{
@@ -915,6 +934,16 @@ void LLPanelFace::getState()
getChildView("button apply")->setEnabled(enabled);
}
}
+
+ // Set variable values for numeric expressions
+ LLCalc* calcp = LLCalc::getInstance();
+ calcp->setVar(LLCalc::TEX_U_SCALE, childGetValue("TexScaleU").asReal());
+ calcp->setVar(LLCalc::TEX_V_SCALE, childGetValue("TexScaleV").asReal());
+ calcp->setVar(LLCalc::TEX_U_OFFSET, childGetValue("TexOffsetU").asReal());
+ calcp->setVar(LLCalc::TEX_V_OFFSET, childGetValue("TexOffsetV").asReal());
+ calcp->setVar(LLCalc::TEX_ROTATION, childGetValue("TexRot").asReal());
+ calcp->setVar(LLCalc::TEX_TRANSPARENCY, childGetValue("ColorTrans").asReal());
+ calcp->setVar(LLCalc::TEX_GLOW, childGetValue("glow").asReal());
}
else
{
@@ -950,6 +979,16 @@ void LLPanelFace::getState()
//getChildView("has media")->setEnabled(FALSE);
//getChildView("media info set")->setEnabled(FALSE);
+
+ // Set variable values for numeric expressions
+ LLCalc* calcp = LLCalc::getInstance();
+ calcp->clearVar(LLCalc::TEX_U_SCALE);
+ calcp->clearVar(LLCalc::TEX_V_SCALE);
+ calcp->clearVar(LLCalc::TEX_U_OFFSET);
+ calcp->clearVar(LLCalc::TEX_V_OFFSET);
+ calcp->clearVar(LLCalc::TEX_ROTATION);
+ calcp->clearVar(LLCalc::TEX_TRANSPARENCY);
+ calcp->clearVar(LLCalc::TEX_GLOW);
}
}
diff --git a/indra/newview/llpanelgroup.cpp b/indra/newview/llpanelgroup.cpp
index 76b85d5bec..ae217958f0 100644
--- a/indra/newview/llpanelgroup.cpp
+++ b/indra/newview/llpanelgroup.cpp
@@ -29,6 +29,7 @@
// Library includes
#include "llbutton.h"
+#include "llfloatersidepanelcontainer.h"
#include "lltabcontainer.h"
#include "lltextbox.h"
#include "lluictrlfactory.h"
@@ -49,7 +50,6 @@
#include "llpanelgroupnotices.h"
#include "llpanelgroupgeneral.h"
-#include "llsidetray.h"
#include "llaccordionctrltab.h"
#include "llaccordionctrl.h"
@@ -597,7 +597,7 @@ void LLPanelGroup::showNotice(const std::string& subject,
//static
void LLPanelGroup::refreshCreatedGroup(const LLUUID& group_id)
{
- LLPanelGroup* panel = LLSideTray::getInstance()->getPanel<LLPanelGroup>("panel_group_info_sidetray");
+ LLPanelGroup* panel = LLFloaterSidePanelContainer::getPanel<LLPanelGroup>("people", "panel_group_info_sidetray");
if(!panel)
return;
panel->setGroupID(group_id);
@@ -612,7 +612,7 @@ void LLPanelGroup::showNotice(const std::string& subject,
const std::string& inventory_name,
LLOfferInfo* inventory_offer)
{
- LLPanelGroup* panel = LLSideTray::getInstance()->getPanel<LLPanelGroup>("panel_group_info_sidetray");
+ LLPanelGroup* panel = LLFloaterSidePanelContainer::getPanel<LLPanelGroup>("people", "panel_group_info_sidetray");
if(!panel)
return;
diff --git a/indra/newview/llpanelgroupgeneral.cpp b/indra/newview/llpanelgroupgeneral.cpp
index ec340dc258..bc594b5517 100644
--- a/indra/newview/llpanelgroupgeneral.cpp
+++ b/indra/newview/llpanelgroupgeneral.cpp
@@ -44,6 +44,7 @@
#include "llnotificationsutil.h"
#include "llscrolllistitem.h"
#include "llspinctrl.h"
+#include "llslurl.h"
#include "lltextbox.h"
#include "lltexteditor.h"
#include "lltexturectrl.h"
@@ -578,6 +579,11 @@ void LLPanelGroupGeneral::update(LLGroupChange gc)
}
+ // After role member data was changed in Roles->Members
+ // need to update role titles. See STORM-918.
+ if (gc == GC_ROLE_MEMBER_DATA)
+ LLGroupMgr::getInstance()->sendGroupTitlesRequest(mGroupID);
+
// If this was just a titles update, we are done.
if (gc == GC_TITLES) return;
diff --git a/indra/newview/llpanelgroupinvite.cpp b/indra/newview/llpanelgroupinvite.cpp
index ca48e8561b..7a15d93181 100644
--- a/indra/newview/llpanelgroupinvite.cpp
+++ b/indra/newview/llpanelgroupinvite.cpp
@@ -289,12 +289,12 @@ void LLPanelGroupInvite::impl::callbackClickAdd(void* userdata)
//Soon the avatar picker will be embedded into this panel
//instead of being it's own separate floater. But that is next week.
//This will do for now. -jwolk May 10, 2006
- LLFloater* parentp;
-
- parentp = gFloaterView->getParentFloater(panelp);
- parentp->addDependentFloater(LLFloaterAvatarPicker::show(boost::bind(impl::callbackAddUsers, _1,
- panelp->mImplementation),
- TRUE));
+ LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(
+ boost::bind(impl::callbackAddUsers, _1, panelp->mImplementation), TRUE);
+ if (picker)
+ {
+ gFloaterView->getParentFloater(panelp)->addDependentFloater(picker);
+ }
}
}
diff --git a/indra/newview/llpanelgrouplandmoney.cpp b/indra/newview/llpanelgrouplandmoney.cpp
index 8d8d9bc1c4..363443646d 100644
--- a/indra/newview/llpanelgrouplandmoney.cpp
+++ b/indra/newview/llpanelgrouplandmoney.cpp
@@ -35,6 +35,7 @@
#include "llqueryflags.h"
#include "llagent.h"
+#include "lldateutil.h"
#include "lliconctrl.h"
#include "llfloaterreg.h"
#include "lllineeditor.h"
@@ -1056,6 +1057,14 @@ void LLGroupMoneyDetailsTabEventHandler::processReply(LLMessageSystem* msg,
msg->getS32Fast(_PREHASH_MoneyData, _PREHASH_CurrentInterval, current_interval );
msg->getStringFast(_PREHASH_MoneyData, _PREHASH_StartDate, start_date);
+ std::string time_str = LLTrans::getString("GroupMoneyDate");
+ LLSD substitution;
+
+ // We don't do time zone corrections of the calculated number of seconds
+ // because we don't have a full time stamp, only a date.
+ substitution["datetime"] = LLDateUtil::secondsSinceEpochFromString("%Y-%m-%d", start_date);
+ LLStringUtil::format (time_str, substitution);
+
if ( interval_days != mImplementationp->mIntervalLength ||
current_interval != mImplementationp->mCurrentInterval )
{
@@ -1064,7 +1073,7 @@ void LLGroupMoneyDetailsTabEventHandler::processReply(LLMessageSystem* msg,
return;
}
- std::string text = start_date;
+ std::string text = time_str;
text.append("\n\n");
S32 total_amount = 0;
@@ -1203,7 +1212,15 @@ void LLGroupMoneySalesTabEventHandler::processReply(LLMessageSystem* msg,
// Start with the date.
if (text == mImplementationp->mLoadingText)
{
- text = start_date + "\n\n";
+ std::string time_str = LLTrans::getString("GroupMoneyDate");
+ LLSD substitution;
+
+ // We don't do time zone corrections of the calculated number of seconds
+ // because we don't have a full time stamp, only a date.
+ substitution["datetime"] = LLDateUtil::secondsSinceEpochFromString("%Y-%m-%d", start_date);
+ LLStringUtil::format (time_str, substitution);
+
+ text = time_str + "\n\n";
}
S32 transactions = msg->getNumberOfBlocksFast(_PREHASH_HistoryData);
@@ -1408,14 +1425,29 @@ void LLGroupMoneyPlanningTabEventHandler::processReply(LLMessageSystem* msg,
}
text.append(LLTrans::getString("SummaryForTheWeek"));
- text.append(start_date);
+
+ std::string date_format_str = LLTrans::getString("GroupPlanningDate");
+ std::string time_str = date_format_str;
+ LLSD substitution;
+ // We don't do time zone corrections of the calculated number of seconds
+ // because we don't have a full time stamp, only a date.
+ substitution["datetime"] = LLDateUtil::secondsSinceEpochFromString("%Y-%m-%d", start_date);
+ LLStringUtil::format (time_str, substitution);
+
+ text.append(time_str);
+ text.append(". ");
if (current_interval == 0)
{
text.append(LLTrans::getString("NextStipendDay"));
- text.append(next_stipend_date);
- text.append("\n\n");
- text.append(llformat("%-24sL$%6d\n", LLTrans::getString("GroupMoneyBalance").c_str(), balance ));
+
+ time_str = date_format_str;
+ substitution["datetime"] = LLDateUtil::secondsSinceEpochFromString("%Y-%m-%d", next_stipend_date);
+ LLStringUtil::format (time_str, substitution);
+
+ text.append(time_str);
+ text.append(".\n\n");
+ text.append(llformat("%-23sL$%6d\n", LLTrans::getString("GroupMoneyBalance").c_str(), balance ));
text.append(1, '\n');
}
diff --git a/indra/newview/llpanelgroupnotices.cpp b/indra/newview/llpanelgroupnotices.cpp
index cdf6e51bf8..31c0e3d01a 100644
--- a/indra/newview/llpanelgroupnotices.cpp
+++ b/indra/newview/llpanelgroupnotices.cpp
@@ -82,8 +82,8 @@ public:
: panel("panel"),
group_id("group_id")
{
- mouse_opaque(false);
- follows.flags(FOLLOWS_ALL);
+ changeDefault(mouse_opaque, false);
+ changeDefault(follows.flags, FOLLOWS_ALL);
}
};
LLGroupDropTarget(const Params&);
@@ -154,6 +154,7 @@ BOOL LLGroupDropTarget::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
case DAD_ANIMATION:
case DAD_GESTURE:
case DAD_CALLINGCARD:
+ case DAD_MESH:
{
LLViewerInventoryItem* inv_item = (LLViewerInventoryItem*)cargo_data;
if(gInventory.getItem(inv_item->getUUID())
diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp
index d1362d7922..f825ee3215 100644
--- a/indra/newview/llpanelgrouproles.cpp
+++ b/indra/newview/llpanelgrouproles.cpp
@@ -42,6 +42,7 @@
#include "llscrolllistctrl.h"
#include "llscrolllistitem.h"
#include "llscrolllistcell.h"
+#include "llslurl.h"
#include "lltabcontainer.h"
#include "lltextbox.h"
#include "lltexteditor.h"
@@ -748,7 +749,10 @@ LLPanelGroupMembersSubTab::LLPanelGroupMembersSubTab()
LLPanelGroupMembersSubTab::~LLPanelGroupMembersSubTab()
{
- gSavedSettings.setString("GroupMembersSortOrder", mMembersList->getSortColumnName());
+ if (mMembersList)
+ {
+ gSavedSettings.setString("GroupMembersSortOrder", mMembersList->getSortColumnName());
+ }
}
BOOL LLPanelGroupMembersSubTab::postBuildSubTab(LLView* root)
@@ -1843,7 +1847,8 @@ bool LLPanelGroupRolesSubTab::apply(std::string& mesg)
{
lldebugs << "LLPanelGroupRolesSubTab::apply()" << llendl;
- saveRoleChanges();
+ saveRoleChanges(true);
+
LLGroupMgr::getInstance()->sendGroupRoleChanges(mGroupID);
notifyObservers();
@@ -2022,7 +2027,7 @@ void LLPanelGroupRolesSubTab::handleRoleSelect()
return;
}
- saveRoleChanges();
+ saveRoleChanges(false);
// Check if there is anything selected.
LLScrollListItem* item = mRolesList->getFirstSelected();
@@ -2385,7 +2390,7 @@ void LLPanelGroupRolesSubTab::handleDeleteRole()
notifyObservers();
}
-void LLPanelGroupRolesSubTab::saveRoleChanges()
+void LLPanelGroupRolesSubTab::saveRoleChanges(bool select_saved_role)
{
LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID);
@@ -2400,13 +2405,23 @@ void LLPanelGroupRolesSubTab::saveRoleChanges()
rd.mRoleDescription = mRoleDescription->getText();
rd.mRoleTitle = mRoleTitle->getText();
+ S32 role_members_count = 0;
+ if (mSelectedRole.isNull())
+ {
+ role_members_count = gdatap->mMemberCount;
+ }
+ else if(LLGroupRoleData* grd = get_ptr_in_map(gdatap->mRoles, mSelectedRole))
+ {
+ role_members_count = grd->getTotalMembersInRole();
+ }
+
gdatap->setRoleData(mSelectedRole,rd);
mRolesList->deleteSingleItem(mRolesList->getItemIndex(mSelectedRole));
- LLSD row = createRoleItem(mSelectedRole,rd.mRoleName,rd.mRoleTitle,0);
+ LLSD row = createRoleItem(mSelectedRole,rd.mRoleName,rd.mRoleTitle,role_members_count);
LLScrollListItem* item = mRolesList->addElement(row, ADD_BOTTOM, this);
- item->setSelected(TRUE);
+ item->setSelected(select_saved_role);
mHasRoleChange = FALSE;
}
diff --git a/indra/newview/llpanelgrouproles.h b/indra/newview/llpanelgrouproles.h
index 270259c16f..a55e264150 100644
--- a/indra/newview/llpanelgrouproles.h
+++ b/indra/newview/llpanelgrouproles.h
@@ -257,7 +257,7 @@ public:
static void onDeleteRole(void*);
void handleDeleteRole();
- void saveRoleChanges();
+ void saveRoleChanges(bool select_saved_role);
virtual void setGroupID(const LLUUID& id);
protected:
diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp
index 0cc5dcda82..eda0749cdb 100644
--- a/indra/newview/llpanelimcontrolpanel.cpp
+++ b/indra/newview/llpanelimcontrolpanel.cpp
@@ -40,7 +40,6 @@
#include "llparticipantlist.h"
#include "llimview.h"
#include "llvoicechannel.h"
-#include "llsidetray.h"
#include "llspeakers.h"
#include "lltrans.h"
@@ -71,7 +70,7 @@ void LLPanelChatControlPanel::onChange(EStatusType status, const std::string &ch
void LLPanelChatControlPanel::onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state)
{
- updateButtons(new_state >= LLVoiceChannel::STATE_CALL_STARTED);
+ updateButtons(new_state);
}
void LLPanelChatControlPanel::updateCallButton()
@@ -96,11 +95,15 @@ void LLPanelChatControlPanel::updateCallButton()
getChildView("call_btn")->setEnabled(enable_connect);
}
-void LLPanelChatControlPanel::updateButtons(bool is_call_started)
+void LLPanelChatControlPanel::updateButtons(LLVoiceChannel::EState state)
{
+ bool is_call_started = state >= LLVoiceChannel::STATE_CALL_STARTED;
getChildView("end_call_btn_panel")->setVisible( is_call_started);
- getChildView("voice_ctrls_btn_panel")->setVisible( is_call_started);
+ getChildView("voice_ctrls_btn_panel")->setVisible( is_call_started && findChild<LLView>("voice_ctrls_btn_panel"));
getChildView("call_btn_panel")->setVisible( ! is_call_started);
+
+ getChildView("volume_ctrl_panel")->setVisible(state == LLVoiceChannel::STATE_CONNECTED);
+
updateCallButton();
}
@@ -135,7 +138,7 @@ void LLPanelChatControlPanel::setSessionId(const LLUUID& session_id)
mVoiceChannelStateChangeConnection = voice_channel->setStateChangedCallback(boost::bind(&LLPanelChatControlPanel::onVoiceChannelStateChanged, this, _1, _2));
//call (either p2p, group or ad-hoc) can be already in started state
- updateButtons(voice_channel->getState() >= LLVoiceChannel::STATE_CALL_STARTED);
+ updateButtons(voice_channel->getState());
}
}
@@ -156,6 +159,13 @@ BOOL LLPanelIMControlPanel::postBuild()
childSetAction("share_btn", boost::bind(&LLPanelIMControlPanel::onShareButtonClicked, this));
childSetAction("teleport_btn", boost::bind(&LLPanelIMControlPanel::onTeleportButtonClicked, this));
childSetAction("pay_btn", boost::bind(&LLPanelIMControlPanel::onPayButtonClicked, this));
+
+ childSetAction("mute_btn", boost::bind(&LLPanelIMControlPanel::onClickMuteVolume, this));
+ childSetAction("block_btn", boost::bind(&LLPanelIMControlPanel::onClickBlock, this));
+ childSetAction("unblock_btn", boost::bind(&LLPanelIMControlPanel::onClickUnblock, this));
+
+ getChild<LLUICtrl>("volume_slider")->setCommitCallback(boost::bind(&LLPanelIMControlPanel::onVolumeChange, this, _2));
+
getChildView("add_friend_btn")->setEnabled(!LLAvatarActions::isFriend(getChild<LLAvatarIconCtrl>("avatar_icon")->getAvatarId()));
setFocusReceivedCallback(boost::bind(&LLPanelIMControlPanel::onFocusReceived, this));
@@ -163,6 +173,79 @@ BOOL LLPanelIMControlPanel::postBuild()
return LLPanelChatControlPanel::postBuild();
}
+void LLPanelIMControlPanel::draw()
+{
+ bool is_muted = LLMuteList::getInstance()->isMuted(mAvatarID);
+
+ getChild<LLUICtrl>("block_btn_panel")->setVisible(!is_muted);
+ getChild<LLUICtrl>("unblock_btn_panel")->setVisible(is_muted);
+
+ if (getChildView("volume_ctrl_panel")->getVisible())
+ {
+
+ bool is_muted_voice = LLMuteList::getInstance()->isMuted(mAvatarID, LLMute::flagVoiceChat);
+
+ LLUICtrl* mute_btn = getChild<LLUICtrl>("mute_btn");
+ mute_btn->setValue( is_muted_voice );
+
+ LLUICtrl* volume_slider = getChild<LLUICtrl>("volume_slider");
+ volume_slider->setEnabled( !is_muted_voice );
+
+ F32 volume;
+
+ if (is_muted_voice)
+ {
+ // it's clearer to display their volume as zero
+ volume = 0.f;
+ }
+ else
+ {
+ // actual volume
+ volume = LLVoiceClient::getInstance()->getUserVolume(mAvatarID);
+ }
+ volume_slider->setValue( (F64)volume );
+ }
+
+ LLPanelChatControlPanel::draw();
+}
+
+void LLPanelIMControlPanel::onClickMuteVolume()
+{
+ // By convention, we only display and toggle voice mutes, not all mutes
+ LLMuteList* mute_list = LLMuteList::getInstance();
+ bool is_muted = mute_list->isMuted(mAvatarID, LLMute::flagVoiceChat);
+
+ LLMute mute(mAvatarID, getChild<LLTextBox>("avatar_name")->getText(), LLMute::AGENT);
+ if (!is_muted)
+ {
+ mute_list->add(mute, LLMute::flagVoiceChat);
+ }
+ else
+ {
+ mute_list->remove(mute, LLMute::flagVoiceChat);
+ }
+}
+
+void LLPanelIMControlPanel::onClickBlock()
+{
+ LLMute mute(mAvatarID, getChild<LLTextBox>("avatar_name")->getText(), LLMute::AGENT);
+
+ LLMuteList::getInstance()->add(mute);
+}
+
+void LLPanelIMControlPanel::onClickUnblock()
+{
+ LLMute mute(mAvatarID, getChild<LLTextBox>("avatar_name")->getText(), LLMute::AGENT);
+
+ LLMuteList::getInstance()->remove(mute);
+}
+
+void LLPanelIMControlPanel::onVolumeChange(const LLSD& data)
+{
+ F32 volume = (F32)data.asReal();
+ LLVoiceClient::getInstance()->setUserVolume(mAvatarID, volume);
+}
+
void LLPanelIMControlPanel::onTeleportButtonClicked()
{
LLAvatarActions::offerTeleport(mAvatarID);
@@ -262,6 +345,9 @@ void LLPanelIMControlPanel::onNameCache(const LLUUID& id, const std::string& ful
std::string avatar_name = full_name;
getChild<LLTextBox>("avatar_name")->setValue(avatar_name);
getChild<LLTextBox>("avatar_name")->setToolTip(avatar_name);
+
+ bool is_linden = LLStringUtil::endsWith(full_name, " Linden");
+ getChild<LLUICtrl>("mute_btn")->setEnabled( !is_linden);
}
}
@@ -288,7 +374,7 @@ void LLPanelGroupControlPanel::draw()
{
// Need to resort the participant list if it's in sort by recent speaker order.
if (mParticipantList)
- mParticipantList->updateRecentSpeakersOrder();
+ mParticipantList->update();
LLPanelChatControlPanel::draw();
}
diff --git a/indra/newview/llpanelimcontrolpanel.h b/indra/newview/llpanelimcontrolpanel.h
index 3bbe24ecb9..bba847b5d4 100644
--- a/indra/newview/llpanelimcontrolpanel.h
+++ b/indra/newview/llpanelimcontrolpanel.h
@@ -54,7 +54,7 @@ public:
virtual void onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state);
- void updateButtons(bool is_call_started);
+ void updateButtons(LLVoiceChannel::EState state);
// Enables/disables call button depending on voice availability
void updateCallButton();
@@ -94,6 +94,12 @@ private:
void onPayButtonClicked();
void onFocusReceived();
+ void onClickMuteVolume();
+ void onClickBlock();
+ void onClickUnblock();
+ /*virtual*/ void draw();
+ void onVolumeChange(const LLSD& data);
+
LLUUID mAvatarID;
};
diff --git a/indra/newview/llpanellandaudio.cpp b/indra/newview/llpanellandaudio.cpp
index 5a943bc61d..e7bdc51b4a 100644
--- a/indra/newview/llpanellandaudio.cpp
+++ b/indra/newview/llpanellandaudio.cpp
@@ -91,8 +91,11 @@ BOOL LLPanelLandAudio::postBuild()
mMusicURLEdit = getChild<LLLineEditor>("music_url");
childSetCommitCallback("music_url", onCommitAny, this);
- mMusicUrlCheck = getChild<LLCheckBoxCtrl>("hide_music_url");
- childSetCommitCallback("hide_music_url", onCommitAny, this);
+ mCheckAVSoundAny = getChild<LLCheckBoxCtrl>("all av sound check");
+ childSetCommitCallback("all av sound check", onCommitAny, this);
+
+ mCheckAVSoundGroup = getChild<LLCheckBoxCtrl>("group av sound check");
+ childSetCommitCallback("group av sound check", onCommitAny, this);
return TRUE;
}
@@ -117,9 +120,6 @@ void LLPanelLandAudio::refresh()
mCheckSoundLocal->set( parcel->getSoundLocal() );
mCheckSoundLocal->setEnabled( can_change_media );
- mMusicUrlCheck->set( parcel->getObscureMusic() );
- mMusicUrlCheck->setEnabled( can_change_media );
-
bool allow_voice = parcel->getParcelFlagAllowVoice();
LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion();
@@ -148,15 +148,15 @@ void LLPanelLandAudio::refresh()
mCheckParcelEnableVoice->set(allow_voice);
mCheckParcelVoiceLocal->set(!parcel->getParcelFlagUseEstateVoiceChannel());
- // don't display urls if you're not able to change it
- // much requested change in forums so people can't 'steal' urls
- // NOTE: bug#2009 means this is still vunerable - however, bug
- // should be closed since this bug opens up major security issues elsewhere.
- bool obscure_music = ! can_change_media && parcel->getObscureMusic();
-
- mMusicURLEdit->setDrawAsterixes(obscure_music);
mMusicURLEdit->setText(parcel->getMusicURL());
mMusicURLEdit->setEnabled( can_change_media );
+
+ BOOL can_change_av_sounds = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_OPTIONS) && parcel->getHaveNewParcelLimitData();
+ mCheckAVSoundAny->set(parcel->getAllowAnyAVSounds());
+ mCheckAVSoundAny->setEnabled(can_change_av_sounds);
+
+ mCheckAVSoundGroup->set(parcel->getAllowGroupAVSounds() || parcel->getAllowAnyAVSounds()); // On if "Everyone" is on
+ mCheckAVSoundGroup->setEnabled(can_change_av_sounds && !parcel->getAllowAnyAVSounds()); // Enabled if "Everyone" is off
}
}
// static
@@ -173,11 +173,17 @@ void LLPanelLandAudio::onCommitAny(LLUICtrl*, void *userdata)
// Extract data from UI
BOOL sound_local = self->mCheckSoundLocal->get();
std::string music_url = self->mMusicURLEdit->getText();
- U8 obscure_music = self->mMusicUrlCheck->get();
BOOL voice_enabled = self->mCheckParcelEnableVoice->get();
BOOL voice_estate_chan = !self->mCheckParcelVoiceLocal->get();
+ BOOL any_av_sound = self->mCheckAVSoundAny->get();
+ BOOL group_av_sound = TRUE; // If set to "Everyone" then group is checked as well
+ if (!any_av_sound)
+ { // If "Everyone" is off, use the value from the checkbox
+ group_av_sound = self->mCheckAVSoundGroup->get();
+ }
+
// Remove leading/trailing whitespace (common when copying/pasting)
LLStringUtil::trim(music_url);
@@ -186,7 +192,8 @@ void LLPanelLandAudio::onCommitAny(LLUICtrl*, void *userdata)
parcel->setParcelFlag(PF_USE_ESTATE_VOICE_CHAN, voice_estate_chan);
parcel->setParcelFlag(PF_SOUND_LOCAL, sound_local);
parcel->setMusicURL(music_url);
- parcel->setObscureMusic(obscure_music);
+ parcel->setAllowAnyAVSounds(any_av_sound);
+ parcel->setAllowGroupAVSounds(group_av_sound);
// Send current parcel data upstream to server
LLViewerParcelMgr::getInstance()->sendParcelPropertiesUpdate( parcel );
diff --git a/indra/newview/llpanellandaudio.h b/indra/newview/llpanellandaudio.h
index 4b0953bdc1..32a45100f4 100644
--- a/indra/newview/llpanellandaudio.h
+++ b/indra/newview/llpanellandaudio.h
@@ -52,6 +52,8 @@ private:
LLCheckBoxCtrl* mCheckParcelVoiceLocal;
LLLineEditor* mMusicURLEdit;
LLCheckBoxCtrl* mMusicUrlCheck;
+ LLCheckBoxCtrl* mCheckAVSoundAny;
+ LLCheckBoxCtrl* mCheckAVSoundGroup;
LLSafeHandle<LLParcelSelection>& mParcel;
};
diff --git a/indra/newview/llpanellandmarkinfo.cpp b/indra/newview/llpanellandmarkinfo.cpp
index 87acd83b23..c57746ec00 100644
--- a/indra/newview/llpanellandmarkinfo.cpp
+++ b/indra/newview/llpanellandmarkinfo.cpp
@@ -180,6 +180,9 @@ void LLPanelLandmarkInfo::setInfoType(EInfoType type)
populateFoldersList();
+ // Prevent the floater from losing focus (if the sidepanel is undocked).
+ setFocus(TRUE);
+
LLPanelPlaceInfo::setInfoType(type);
}
@@ -330,6 +333,9 @@ void LLPanelLandmarkInfo::toggleLandmarkEditMode(BOOL enabled)
// when it was enabled/disabled we set the text once again.
mNotesEditor->setText(mNotesEditor->getText());
}
+
+ // Prevent the floater from losing focus (if the sidepanel is undocked).
+ setFocus(TRUE);
}
const std::string& LLPanelLandmarkInfo::getLandmarkTitle() const
diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp
index e8c8273a9d..68a3b6d1cd 100644
--- a/indra/newview/llpanellandmarks.cpp
+++ b/indra/newview/llpanellandmarks.cpp
@@ -42,15 +42,16 @@
#include "llagentui.h"
#include "llcallbacklist.h"
#include "lldndbutton.h"
+#include "llfloatersidepanelcontainer.h"
#include "llfloaterworldmap.h"
#include "llfolderviewitem.h"
#include "llinventorymodelbackgroundfetch.h"
#include "llinventorypanel.h"
+#include "llinventoryfunctions.h"
#include "lllandmarkactions.h"
#include "llmenubutton.h"
#include "llplacesinventorybridge.h"
#include "llplacesinventorypanel.h"
-#include "llsidetray.h"
#include "lltoggleablemenu.h"
#include "llviewermenu.h"
#include "llviewerregion.h"
@@ -71,6 +72,7 @@ static void collapse_all_folders(LLFolderView* root_folder);
static void expand_all_folders(LLFolderView* root_folder);
static bool has_expanded_folders(LLFolderView* root_folder);
static bool has_collapsed_folders(LLFolderView* root_folder);
+static void toggle_restore_menu(LLMenuGL* menu, BOOL visible, BOOL enabled);
/**
* Functor counting expanded and collapsed folders in folder view tree to know
@@ -298,7 +300,7 @@ void LLLandmarksPanel::onTeleport()
}
LLFolderViewEventListener* listenerp = current_item->getListener();
- if (listenerp->getInventoryType() == LLInventoryType::IT_LANDMARK)
+ if (listenerp && listenerp->getInventoryType() == LLInventoryType::IT_LANDMARK)
{
listenerp->openItem();
}
@@ -365,7 +367,7 @@ void LLLandmarksPanel::onSelectorButtonClicked()
key["type"] = "landmark";
key["id"] = listenerp->getUUID();
- LLSideTray::getInstance()->showPanel("panel_places", key);
+ LLFloaterSidePanelContainer::showPanel("places", key);
}
}
@@ -528,7 +530,7 @@ void LLLandmarksPanel::setParcelID(const LLUUID& parcel_id)
// virtual
void LLLandmarksPanel::setErrorStatus(U32 status, const std::string& reason)
{
- llerrs<< "Can't handle remote parcel request."<< " Http Status: "<< status << ". Reason : "<< reason<<llendl;
+ llwarns << "Can't handle remote parcel request."<< " Http Status: "<< status << ". Reason : "<< reason<<llendl;
}
@@ -644,7 +646,7 @@ void LLLandmarksPanel::onAccordionExpandedCollapsed(const LLSD& param, LLPlacesI
// Start background fetch, mostly for My Inventory and Library
if (expanded)
{
- const LLUUID &cat_id = inventory_list->getStartFolderID();
+ const LLUUID &cat_id = inventory_list->getRootFolderID();
// Just because the category itself has been fetched, doesn't mean its child folders have.
/*
if (!gInventory.isCategoryComplete(cat_id))
@@ -708,6 +710,9 @@ void LLLandmarksPanel::initListCommandsHandlers()
mGearFolderMenu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_places_gear_folder.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
mMenuAdd = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_place_add_button.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
+ mGearLandmarkMenu->setVisibilityChangeCallback(boost::bind(&LLLandmarksPanel::onMenuVisibilityChange, this, _1, _2));
+ mGearFolderMenu->setVisibilityChangeCallback(boost::bind(&LLLandmarksPanel::onMenuVisibilityChange, this, _1, _2));
+
mListCommands->childSetAction(ADD_BUTTON_NAME, boost::bind(&LLLandmarksPanel::showActionMenu, this, mMenuAdd, ADD_BUTTON_NAME));
}
@@ -781,7 +786,7 @@ void LLLandmarksPanel::onAddAction(const LLSD& userdata) const
}
else
{
- LLSideTray::getInstance()->showPanel("panel_places", LLSD().with("type", "create_landmark"));
+ LLFloaterSidePanelContainer::showPanel("places", LLSD().with("type", "create_landmark"));
}
}
else if ("category" == command_name)
@@ -1079,6 +1084,60 @@ void LLLandmarksPanel::onCustomAction(const LLSD& userdata)
{
doActionOnCurSelectedLandmark(boost::bind(&LLLandmarksPanel::doCreatePick, this, _1));
}
+ else if ("restore" == command_name && mCurrentSelectedList)
+ {
+ mCurrentSelectedList->doToSelected(userdata);
+ }
+}
+
+void LLLandmarksPanel::onMenuVisibilityChange(LLUICtrl* ctrl, const LLSD& param)
+{
+ bool new_visibility = param["visibility"].asBoolean();
+
+ // We don't have to update items visibility if the menu is hiding.
+ if (!new_visibility) return;
+
+ BOOL are_any_items_in_trash = FALSE;
+ BOOL are_all_items_in_trash = TRUE;
+
+ LLFolderView* root_folder_view = mCurrentSelectedList ? mCurrentSelectedList->getRootFolder() : NULL;
+ if(root_folder_view)
+ {
+ const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
+
+ std::set<LLUUID> selected_uuids = root_folder_view->getSelectionList();
+
+ // Iterate through selected items to find out if any of these items are in Trash
+ // or all the items are in Trash category.
+ for (std::set<LLUUID>::const_iterator iter = selected_uuids.begin(); iter != selected_uuids.end(); ++iter)
+ {
+ LLFolderViewItem* item = root_folder_view->getItemByID(*iter);
+
+ // If no item is found it might be a folder id.
+ if (!item)
+ {
+ item = root_folder_view->getFolderByID(*iter);
+ }
+ if (!item) continue;
+
+ LLFolderViewEventListener* listenerp = item->getListener();
+ if(!listenerp) continue;
+
+ // Trash category itself should not be included because it can't be
+ // actually restored from trash.
+ are_all_items_in_trash &= listenerp->isItemInTrash() && *iter != trash_id;
+
+ // If there are any selected items in Trash including the Trash category itself
+ // we show "Restore Item" in context menu and hide other irrelevant items.
+ are_any_items_in_trash |= listenerp->isItemInTrash();
+ }
+ }
+
+ // Display "Restore Item" menu entry if at least one of the selected items
+ // is in Trash or the Trash category itself is among selected items.
+ // Hide other menu entries in this case.
+ // Enable this menu entry only if all selected items are in the Trash category.
+ toggle_restore_menu((LLMenuGL*)ctrl, are_any_items_in_trash, are_all_items_in_trash);
}
/*
@@ -1090,7 +1149,7 @@ Rules:
- cut/rename/delete in any other accordions
- paste - only in Favorites, Landmarks accordions
3. For Folders we can: perform any action in Landmarks accordion, except Received folder
- 4. We can not paste folders from Clipboard (processed by LLFolderView::canPaste())
+ 4. We can paste folders from Clipboard (processed by LLFolderView::canPaste())
5. Check LLFolderView/Inventory Bridges rules
*/
bool LLLandmarksPanel::canItemBeModified(const std::string& command_name, LLFolderViewItem* item) const
@@ -1147,8 +1206,7 @@ bool LLLandmarksPanel::canItemBeModified(const std::string& command_name, LLFold
if ("cut" == command_name)
{
- // "Cut" disabled for folders. See EXT-8697.
- can_be_modified = root_folder->canCut() && listenerp->getInventoryType() != LLInventoryType::IT_CATEGORY;
+ can_be_modified = root_folder->canCut();
}
else if ("rename" == command_name)
{
@@ -1250,7 +1308,13 @@ void LLLandmarksPanel::doProcessParcelInfo(LLLandmark* landmark,
landmark->getGlobalPos(landmark_global_pos);
// let's toggle pick panel into panel places
- LLPanel* panel_places = LLSideTray::getInstance()->getPanel("panel_places");//-> sidebar_places
+ LLPanel* panel_places = NULL;
+ LLFloaterSidePanelContainer* floaterp = LLFloaterReg::getTypedInstance<LLFloaterSidePanelContainer>("places");
+ if (floaterp)
+ {
+ panel_places = floaterp->findChild<LLPanel>("main_panel");
+ }
+
if (!panel_places)
{
llassert(NULL != panel_places);
@@ -1334,10 +1398,6 @@ static void filter_list(LLPlacesInventoryPanel* inventory_list, const std::strin
inventory_list->restoreFolderState();
}
- // Open the immediate children of the root folder, since those
- // are invisible in the UI and thus must always be open.
- inventory_list->getRootFolder()->openTopLevelFolders();
-
if (inventory_list->getFilterSubString().empty() && string.empty())
{
// current filter and new filter empty, do nothing
@@ -1356,7 +1416,7 @@ static void filter_list(LLPlacesInventoryPanel* inventory_list, const std::strin
static bool category_has_descendents(LLPlacesInventoryPanel* inventory_list)
{
- LLViewerInventoryCategory* category = gInventory.getCategory(inventory_list->getStartFolderID());
+ LLViewerInventoryCategory* category = gInventory.getCategory(inventory_list->getRootFolderID());
if (category)
{
return category->getDescendentCount() > 0;
@@ -1414,4 +1474,31 @@ static bool has_collapsed_folders(LLFolderView* root_folder)
return true;
}
+
+// Displays "Restore Item" context menu entry while hiding
+// all other entries or vice versa.
+// Sets "Restore Item" enabled state.
+void toggle_restore_menu(LLMenuGL *menu, BOOL visible, BOOL enabled)
+{
+ if (!menu) return;
+
+ const LLView::child_list_t *list = menu->getChildList();
+ for (LLView::child_list_t::const_iterator itor = list->begin();
+ itor != list->end();
+ ++itor)
+ {
+ LLView *menu_item = (*itor);
+ std::string name = menu_item->getName();
+
+ if ("restore_item" == name)
+ {
+ menu_item->setVisible(visible);
+ menu_item->setEnabled(enabled);
+ }
+ else
+ {
+ menu_item->setVisible(!visible);
+ }
+ }
+}
// EOF
diff --git a/indra/newview/llpanellandmarks.h b/indra/newview/llpanellandmarks.h
index 8dcbca0440..b2f4e92473 100644
--- a/indra/newview/llpanellandmarks.h
+++ b/indra/newview/llpanellandmarks.h
@@ -129,6 +129,14 @@ private:
void onCustomAction(const LLSD& command_name);
/**
+ * Updates context menu depending on the selected items location.
+ *
+ * For items in Trash category the menu includes the "Restore Item"
+ * context menu entry.
+ */
+ void onMenuVisibilityChange(LLUICtrl* ctrl, const LLSD& param);
+
+ /**
* Determines if an item can be modified via context/gear menu.
*
* It validates Places Landmarks rules first. And then LLFolderView permissions.
diff --git a/indra/newview/llpanellandmedia.cpp b/indra/newview/llpanellandmedia.cpp
index f17defda55..b3adfac8a2 100644
--- a/indra/newview/llpanellandmedia.cpp
+++ b/indra/newview/llpanellandmedia.cpp
@@ -68,8 +68,7 @@ LLPanelLandMedia::LLPanelLandMedia(LLParcelSelectionHandle& parcel)
mMediaSizeCtrlLabel(NULL),
mMediaTextureCtrl(NULL),
mMediaAutoScaleCheck(NULL),
- mMediaLoopCheck(NULL),
- mMediaUrlCheck(NULL)
+ mMediaLoopCheck(NULL)
{
}
@@ -94,9 +93,6 @@ BOOL LLPanelLandMedia::postBuild()
mMediaLoopCheck = getChild<LLCheckBoxCtrl>("media_loop");
childSetCommitCallback("media_loop", onCommitAny, this );
- mMediaUrlCheck = getChild<LLCheckBoxCtrl>("hide_media_url");
- childSetCommitCallback("hide_media_url", onCommitAny, this );
-
mMediaURLEdit = getChild<LLLineEditor>("media_url");
childSetCommitCallback("media_url", onCommitAny, this );
@@ -153,25 +149,6 @@ void LLPanelLandMedia::refresh()
mMediaTypeCombo->setEnabled( can_change_media );
getChild<LLUICtrl>("mime_type")->setValue(mime_type);
- mMediaUrlCheck->set( parcel->getObscureMedia() );
- mMediaUrlCheck->setEnabled( can_change_media );
-
- // don't display urls if you're not able to change it
- // much requested change in forums so people can't 'steal' urls
- // NOTE: bug#2009 means this is still vunerable - however, bug
- // should be closed since this bug opens up major security issues elsewhere.
- bool obscure_media = ! can_change_media && parcel->getObscureMedia();
-
- // Special code to disable asterixes for html type
- if(mime_type == "text/html")
- {
- obscure_media = false;
- mMediaUrlCheck->set( 0 );
- mMediaUrlCheck->setEnabled( false );
- }
-
- mMediaURLEdit->setDrawAsterixes( obscure_media );
-
mMediaAutoScaleCheck->set( parcel->getMediaAutoScale () );
mMediaAutoScaleCheck->setEnabled ( can_change_media );
@@ -301,7 +278,6 @@ void LLPanelLandMedia::onCommitAny(LLUICtrl*, void *userdata)
std::string mime_type = self->getChild<LLUICtrl>("mime_type")->getValue().asString();
U8 media_auto_scale = self->mMediaAutoScaleCheck->get();
U8 media_loop = self->mMediaLoopCheck->get();
- U8 obscure_media = self->mMediaUrlCheck->get();
S32 media_width = (S32)self->mMediaWidthCtrl->get();
S32 media_height = (S32)self->mMediaHeightCtrl->get();
LLUUID media_id = self->mMediaTextureCtrl->getImageAssetID();
@@ -321,7 +297,6 @@ void LLPanelLandMedia::onCommitAny(LLUICtrl*, void *userdata)
parcel->setMediaID(media_id);
parcel->setMediaAutoScale ( media_auto_scale );
parcel->setMediaLoop ( media_loop );
- parcel->setObscureMedia( obscure_media );
// Send current parcel data upstream to server
LLViewerParcelMgr::getInstance()->sendParcelPropertiesUpdate( parcel );
diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp
index cf567fb208..76aadcd913 100644
--- a/indra/newview/llpanellogin.cpp
+++ b/indra/newview/llpanellogin.cpp
@@ -35,6 +35,7 @@
#include "llsecondlifeurls.h"
#include "v4color.h"
+#include "llappviewer.h"
#include "llbutton.h"
#include "llcheckboxctrl.h"
#include "llcommandhandler.h" // for secondlife:///app/login/
@@ -73,7 +74,6 @@
#endif // LL_WINDOWS
#include "llsdserialize.h"
-#define USE_VIEWER_AUTH 0
const S32 BLACK_BORDER_HEIGHT = 160;
const S32 MAX_PASSWORD = 16;
@@ -81,6 +81,9 @@ const S32 MAX_PASSWORD = 16;
LLPanelLogin *LLPanelLogin::sInstance = NULL;
BOOL LLPanelLogin::sCapslockDidNotification = FALSE;
+// Helper for converting a user name into the canonical "Firstname Lastname" form.
+// For new accounts without a last name "Resident" is added as a last name.
+static std::string canonicalize_username(const std::string& name);
class LLLoginRefreshHandler : public LLCommandHandler
{
@@ -97,58 +100,6 @@ public:
}
};
-LLLoginRefreshHandler gLoginRefreshHandler;
-
-
-// helper class that trys to download a URL from a web site and calls a method
-// on parent class indicating if the web server is working or not
-class LLIamHereLogin : public LLHTTPClient::Responder
-{
- private:
- LLIamHereLogin( LLPanelLogin* parent ) :
- mParent( parent )
- {}
-
- LLPanelLogin* mParent;
-
- public:
- static boost::intrusive_ptr< LLIamHereLogin > build( LLPanelLogin* parent )
- {
- return boost::intrusive_ptr< LLIamHereLogin >( new LLIamHereLogin( parent ) );
- };
-
- virtual void setParent( LLPanelLogin* parentIn )
- {
- mParent = parentIn;
- };
-
- // We don't actually expect LLSD back, so need to override completedRaw
- virtual void completedRaw(U32 status, const std::string& reason,
- const LLChannelDescriptors& channels,
- const LLIOPipe::buffer_ptr_t& buffer)
- {
- completed(status, reason, LLSD()); // will call result() or error()
- }
-
- virtual void result( const LLSD& content )
- {
- if ( mParent )
- mParent->setSiteIsAlive( true );
- };
-
- virtual void error( U32 status, const std::string& reason )
- {
- if ( mParent )
- mParent->setSiteIsAlive( false );
- };
-};
-
-// this is global and not a class member to keep crud out of the header file
-namespace {
- boost::intrusive_ptr< LLIamHereLogin > gResponsePtr = 0;
-};
-
-
//---------------------------------------------------------------------------
// Public methods
//---------------------------------------------------------------------------
@@ -160,11 +111,8 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
mLogoImage(),
mCallback(callback),
mCallbackData(cb_data),
- mHtmlAvailable( TRUE ),
mListener(new LLPanelLoginListener(this))
{
- setFocusRoot(TRUE);
-
setBackgroundVisible(FALSE);
setBackgroundOpaque(TRUE);
@@ -181,39 +129,24 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
mPasswordModified = FALSE;
LLPanelLogin::sInstance = this;
- // add to front so we are the bottom-most child
- gViewerWindow->getRootView()->addChildInBack(this);
+ LLView* login_holder = gViewerWindow->getLoginPanelHolder();
+ if (login_holder)
+ {
+ login_holder->addChild(this);
+ }
// Logo
mLogoImage = LLUI::getUIImage("startup_logo");
buildFromFile( "panel_login.xml");
-#if USE_VIEWER_AUTH
- //leave room for the login menu bar
- setRect(LLRect(0, rect.getHeight()-18, rect.getWidth(), 0));
-#endif
- // Legacy login web page is hidden under the menu bar.
- // Adjust reg-in-client web browser widget to not be hidden.
- if (gSavedSettings.getBOOL("RegInClient"))
- {
- reshape(rect.getWidth(), rect.getHeight() - MENU_BAR_HEIGHT);
- }
- else
- {
- reshape(rect.getWidth(), rect.getHeight());
- }
+ reshape(rect.getWidth(), rect.getHeight());
-#if !USE_VIEWER_AUTH
getChild<LLLineEditor>("password_edit")->setKeystrokeCallback(onPassKey, this);
// change z sort of clickable text to be behind buttons
- //sendChildToBack(getChildView("channel_text"));
sendChildToBack(getChildView("forgot_password_text"));
- LLLineEditor* edit = getChild<LLLineEditor>("password_edit");
- if (edit) edit->setDrawAsterixes(TRUE);
-
if(LLStartUp::getStartSLURL().getType() != LLSLURL::LOCATION)
{
LLSLURL slurl(gSavedSettings.getString("LoginLocation"));
@@ -247,98 +180,109 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
LLTextBox* need_help_text = getChild<LLTextBox>("login_help");
need_help_text->setClickedCallback(onClickHelp, NULL);
-#endif
// get the web browser control
LLMediaCtrl* web_browser = getChild<LLMediaCtrl>("login_html");
web_browser->addObserver(this);
- // Clear the browser's cache to avoid any potential for the cache messing up the login screen.
- web_browser->clearCache();
-
reshapeBrowser();
- // kick off a request to grab the url manually
- gResponsePtr = LLIamHereLogin::build( this );
+ loadLoginPage();
+
+ // Show last logged in user favorites in "Start at" combo.
+ addUsersWithFavoritesToUsername();
+ getChild<LLComboBox>("username_combo")->setTextChangedCallback(boost::bind(&LLPanelLogin::addFavoritesToStartLocation, this));
- LLHTTPClient::head( LLGridManager::getInstance()->getLoginPage(), gResponsePtr );
-
updateLocationCombo(false);
}
-// force the size to be correct (XML doesn't seem to be sufficient to do this)
-// (with some padding so the other login screen doesn't show through)
-void LLPanelLogin::reshapeBrowser()
+void LLPanelLogin::addUsersWithFavoritesToUsername()
{
- LLMediaCtrl* web_browser = getChild<LLMediaCtrl>("login_html");
- LLRect rect = gViewerWindow->getWindowRectScaled();
- LLRect html_rect;
-#if USE_VIEWER_AUTH
- html_rect.setCenterAndSize(
- rect.getCenterX() - 2, rect.getCenterY(),
- rect.getWidth() + 6, rect.getHeight());
-#else
- html_rect.setCenterAndSize(
- rect.getCenterX() - 2, rect.getCenterY() + 40,
- rect.getWidth() + 6, rect.getHeight() - 78 );
-#endif
- web_browser->setRect( html_rect );
- web_browser->reshape( html_rect.getWidth(), html_rect.getHeight(), TRUE );
- reshape( rect.getWidth(), rect.getHeight(), 1 );
+ LLComboBox* combo = getChild<LLComboBox>("username_combo");
+ if (!combo) return;
+ std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "stored_favorites.xml");
+ LLSD fav_llsd;
+ llifstream file;
+ file.open(filename);
+ if (!file.is_open()) return;
+ LLSDSerialize::fromXML(fav_llsd, file);
+ for (LLSD::map_const_iterator iter = fav_llsd.beginMap();
+ iter != fav_llsd.endMap(); ++iter)
+ {
+ combo->add(iter->first);
+ }
}
-void LLPanelLogin::setSiteIsAlive( bool alive )
+void LLPanelLogin::addFavoritesToStartLocation()
{
- LLMediaCtrl* web_browser = getChild<LLMediaCtrl>("login_html");
- // if the contents of the site was retrieved
- if ( alive )
+ // Clear the combo.
+ LLComboBox* combo = getChild<LLComboBox>("start_location_combo");
+ if (!combo) return;
+ int num_items = combo->getItemCount();
+ for (int i = num_items - 1; i > 2; i--)
{
- if ( web_browser )
- {
- loadLoginPage();
-
- // mark as available
- mHtmlAvailable = TRUE;
- }
+ combo->remove(i);
}
- else
- // the site is not available (missing page, server down, other badness)
+
+ // Load favorites into the combo.
+ std::string user_defined_name = getChild<LLComboBox>("username_combo")->getSimple();
+ std::string canonical_user_name = canonicalize_username(user_defined_name);
+ std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "stored_favorites.xml");
+ LLSD fav_llsd;
+ llifstream file;
+ file.open(filename);
+ if (!file.is_open()) return;
+ LLSDSerialize::fromXML(fav_llsd, file);
+ for (LLSD::map_const_iterator iter = fav_llsd.beginMap();
+ iter != fav_llsd.endMap(); ++iter)
{
-#if !USE_VIEWER_AUTH
- if ( web_browser )
+ // The account name in stored_favorites.xml has Resident last name even if user has
+ // a single word account name, so it can be compared case-insensitive with the
+ // user defined "firstname lastname".
+ S32 res = LLStringUtil::compareInsensitive(canonical_user_name, iter->first);
+ if (res != 0)
{
- // hide browser control (revealing default one)
- web_browser->setVisible( FALSE );
-
- // mark as unavailable
- mHtmlAvailable = FALSE;
+ lldebugs << "Skipping favorites for " << iter->first << llendl;
+ continue;
}
-#else
-
- if ( web_browser )
- {
- web_browser->navigateToLocalPage( "loading-error" , "index.html" );
- // mark as available
- mHtmlAvailable = TRUE;
+ combo->addSeparator();
+ lldebugs << "Loading favorites for " << iter->first << llendl;
+ LLSD user_llsd = iter->second;
+ for (LLSD::array_const_iterator iter1 = user_llsd.beginArray();
+ iter1 != user_llsd.endArray(); ++iter1)
+ {
+ std::string label = (*iter1)["name"].asString();
+ std::string value = (*iter1)["slurl"].asString();
+ if(label != "" && value != "")
+ {
+ combo->add(label, value);
+ }
}
-#endif
+ break;
}
}
+// force the size to be correct (XML doesn't seem to be sufficient to do this)
+// (with some padding so the other login screen doesn't show through)
+void LLPanelLogin::reshapeBrowser()
+{
+ LLMediaCtrl* web_browser = getChild<LLMediaCtrl>("login_html");
+ LLRect rect = gViewerWindow->getWindowRectScaled();
+ LLRect html_rect;
+ html_rect.setCenterAndSize(
+ rect.getCenterX() - 2, rect.getCenterY() + 40,
+ rect.getWidth() + 6, rect.getHeight() - 78 );
+ web_browser->setRect( html_rect );
+ web_browser->reshape( html_rect.getWidth(), html_rect.getHeight(), TRUE );
+ reshape( rect.getWidth(), rect.getHeight(), 1 );
+}
LLPanelLogin::~LLPanelLogin()
{
LLPanelLogin::sInstance = NULL;
- // tell the responder we're not here anymore
- if ( gResponsePtr )
- gResponsePtr->setParent( 0 );
-
- //// We know we're done with the image, so be rid of it.
- //gTextureList.deleteImage( mLogoImage );
-
// Controls having keyboard focus by default
// must reset it on destroy. (EXT-2748)
gFocusMgr.setDefaultKeyboardFocus(NULL);
@@ -347,41 +291,30 @@ LLPanelLogin::~LLPanelLogin()
// virtual
void LLPanelLogin::draw()
{
- glPushMatrix();
+ gGL.pushMatrix();
{
F32 image_aspect = 1.333333f;
F32 view_aspect = (F32)getRect().getWidth() / (F32)getRect().getHeight();
// stretch image to maintain aspect ratio
if (image_aspect > view_aspect)
{
- glTranslatef(-0.5f * (image_aspect / view_aspect - 1.f) * getRect().getWidth(), 0.f, 0.f);
- glScalef(image_aspect / view_aspect, 1.f, 1.f);
+ gGL.translatef(-0.5f * (image_aspect / view_aspect - 1.f) * getRect().getWidth(), 0.f, 0.f);
+ gGL.scalef(image_aspect / view_aspect, 1.f, 1.f);
}
S32 width = getRect().getWidth();
S32 height = getRect().getHeight();
- if ( mHtmlAvailable )
- {
-#if !USE_VIEWER_AUTH
- if (getChild<LLView>("login_widgets")->getVisible())
- {
- // draw a background box in black
- gl_rect_2d( 0, height - 264, width, 264, LLColor4::black );
- // draw the bottom part of the background image
- // just the blue background to the native client UI
- mLogoImage->draw(0, -264, width + 8, mLogoImage->getHeight());
- }
-#endif
- }
- else
+ if (getChild<LLView>("login_widgets")->getVisible())
{
- // the HTML login page is not available so default to the original screen
- S32 offscreen_part = height / 3;
- mLogoImage->draw(0, -offscreen_part, width, height+offscreen_part);
+ // draw a background box in black
+ gl_rect_2d( 0, height - 264, width, 264, LLColor4::black );
+ // draw the bottom part of the background image
+ // just the blue background to the native client UI
+ mLogoImage->draw(0, -264, width + 8, mLogoImage->getHeight());
};
}
- glPopMatrix();
+ gGL.popMatrix();
LLPanel::draw();
}
@@ -418,22 +351,17 @@ void LLPanelLogin::setFocus(BOOL b)
// static
void LLPanelLogin::giveFocus()
{
-#if USE_VIEWER_AUTH
- if (sInstance)
- {
- sInstance->setFocus(TRUE);
- }
-#else
if( sInstance )
{
// Grab focus and move cursor to first blank input field
- std::string username = sInstance->getChild<LLUICtrl>("username_edit")->getValue().asString();
+ std::string username = sInstance->getChild<LLUICtrl>("username_combo")->getValue().asString();
std::string pass = sInstance->getChild<LLUICtrl>("password_edit")->getValue().asString();
BOOL have_username = !username.empty();
BOOL have_pass = !pass.empty();
LLLineEditor* edit = NULL;
+ LLComboBox* combo = NULL;
if (have_username && !have_pass)
{
// User saved his name but not his password. Move
@@ -443,7 +371,7 @@ void LLPanelLogin::giveFocus()
else
{
// User doesn't have a name, so start there.
- edit = sInstance->getChild<LLLineEditor>("username_edit");
+ combo = sInstance->getChild<LLComboBox>("username_combo");
}
if (edit)
@@ -451,21 +379,26 @@ void LLPanelLogin::giveFocus()
edit->setFocus(TRUE);
edit->selectAll();
}
+ else if (combo)
+ {
+ combo->setFocus(TRUE);
+ }
}
-#endif
}
// static
void LLPanelLogin::showLoginWidgets()
{
+ // *NOTE: Mani - This may or may not be obselete code.
+ // It seems to be part of the defunct? reg-in-client project.
sInstance->getChildView("login_widgets")->setVisible( true);
LLMediaCtrl* web_browser = sInstance->getChild<LLMediaCtrl>("login_html");
sInstance->reshapeBrowser();
// *TODO: Append all the usual login parameters, like first_login=Y etc.
- std::string splash_screen_url = sInstance->getString("real_url");
+ std::string splash_screen_url = LLGridManager::getInstance()->getLoginPage();
web_browser->navigateTo( splash_screen_url, "text/html" );
- LLUICtrl* username_edit = sInstance->getChild<LLUICtrl>("username_edit");
- username_edit->setFocus(TRUE);
+ LLUICtrl* username_combo = sInstance->getChild<LLUICtrl>("username_combo");
+ username_combo->setFocus(TRUE);
}
// static
@@ -509,16 +442,17 @@ void LLPanelLogin::setFields(LLPointer<LLCredential> credential,
login_id += " ";
login_id += lastname;
}
- sInstance->getChild<LLUICtrl>("username_edit")->setValue(login_id);
+ sInstance->getChild<LLComboBox>("username_combo")->setLabel(login_id);
}
else if((std::string)identifier["type"] == "account")
{
- sInstance->getChild<LLUICtrl>("username_edit")->setValue((std::string)identifier["account_name"]);
+ sInstance->getChild<LLComboBox>("username_combo")->setLabel((std::string)identifier["account_name"]);
}
else
{
- sInstance->getChild<LLUICtrl>("username_edit")->setValue(std::string());
+ sInstance->getChild<LLComboBox>("username_combo")->setLabel(std::string());
}
+ sInstance->addFavoritesToStartLocation();
// if the password exists in the credential, set the password field with
// a filler to get some stars
LLSD authenticator = credential->getAuthenticator();
@@ -566,7 +500,7 @@ void LLPanelLogin::getFields(LLPointer<LLCredential>& credential,
authenticator = credential->getAuthenticator();
}
- std::string username = sInstance->getChild<LLUICtrl>("username_edit")->getValue().asString();
+ std::string username = sInstance->getChild<LLUICtrl>("username_combo")->getValue().asString();
LLStringUtil::trim(username);
std::string password = sInstance->getChild<LLUICtrl>("password_edit")->getValue().asString();
@@ -658,15 +592,15 @@ BOOL LLPanelLogin::areCredentialFieldsDirty()
}
else
{
- std::string username = sInstance->getChild<LLUICtrl>("username_edit")->getValue().asString();
+ std::string username = sInstance->getChild<LLUICtrl>("username_combo")->getValue().asString();
LLStringUtil::trim(username);
std::string password = sInstance->getChild<LLUICtrl>("password_edit")->getValue().asString();
- LLLineEditor* ctrl = sInstance->getChild<LLLineEditor>("username_edit");
- if(ctrl && ctrl->isDirty())
+ LLComboBox* combo = sInstance->getChild<LLComboBox>("username_combo");
+ if(combo && combo->isDirty())
{
return true;
}
- ctrl = sInstance->getChild<LLLineEditor>("password_edit");
+ LLLineEditor* ctrl = sInstance->getChild<LLLineEditor>("password_edit");
if(ctrl && ctrl->isDirty())
{
return true;
@@ -761,7 +695,7 @@ void LLPanelLogin::closePanel()
{
if (sInstance)
{
- gViewerWindow->getRootView()->removeChild( LLPanelLogin::sInstance );
+ LLPanelLogin::sInstance->getParent()->removeChild( LLPanelLogin::sInstance );
delete sInstance;
sInstance = NULL;
@@ -830,86 +764,16 @@ void LLPanelLogin::loadLoginPage()
char* curl_grid = curl_escape(LLGridManager::getInstance()->getGridLabel().c_str(), 0);
oStr << "&grid=" << curl_grid;
curl_free(curl_grid);
- gViewerWindow->setMenuBackgroundColor(false, !LLGridManager::getInstance()->isInProductionGrid());
- gLoginMenuBarView->setBackgroundColor(gMenuBarView->getBackgroundColor());
-
-
-#if USE_VIEWER_AUTH
- LLURLSimString::sInstance.parse();
-
- std::string location;
- std::string region;
- std::string password;
- if (LLURLSimString::parse())
- {
- std::ostringstream oRegionStr;
- location = "specify";
- oRegionStr << LLURLSimString::sInstance.mSimName << "/" << LLURLSimString::sInstance.mX << "/"
- << LLURLSimString::sInstance.mY << "/"
- << LLURLSimString::sInstance.mZ;
- region = oRegionStr.str();
- }
- else
- {
- location = gSavedSettings.getString("LoginLocation");
- }
+ // add OS info
+ char * os_info = curl_escape(LLAppViewer::instance()->getOSInfo().getOSStringSimple().c_str(), 0);
+ oStr << "&os=" << os_info;
+ curl_free(os_info);
- std::string username;
-
- if(gSavedSettings.getLLSD("UserLoginInfo").size() == 3)
- {
- LLSD cmd_line_login = gSavedSettings.getLLSD("UserLoginInfo");
- username = cmd_line_login[0].asString() + " " + cmd_line_login[1];
- password = cmd_line_login[2].asString();
- }
-
-
- char* curl_region = curl_escape(region.c_str(), 0);
-
- oStr <<"username=" << username <<
- "&location=" << location << "&region=" << curl_region;
-
- curl_free(curl_region);
-
- if (!password.empty())
- {
- oStr << "&password=" << password;
- }
- else if (!(password = load_password_from_disk()).empty())
- {
- oStr << "&password=$1$" << password;
- }
- if (gAutoLogin)
- {
- oStr << "&auto_login=TRUE";
- }
- if (gSavedSettings.getBOOL("ShowStartLocation"))
- {
- oStr << "&show_start_location=TRUE";
- }
- if (gSavedSettings.getBOOL("RememberPassword"))
- {
- oStr << "&remember_password=TRUE";
- }
-#ifndef LL_RELEASE_FOR_DOWNLOAD
- oStr << "&show_grid=TRUE";
-#else
- if (gSavedSettings.getBOOL("ForceShowGrid"))
- oStr << "&show_grid=TRUE";
-#endif
-#endif
+ gViewerWindow->setMenuBackgroundColor(false, !LLGridManager::getInstance()->isInProductionGrid());
LLMediaCtrl* web_browser = sInstance->getChild<LLMediaCtrl>("login_html");
-
- // navigate to the "real" page
- if (gSavedSettings.getBOOL("RegInClient"))
- {
- web_browser->setFocus(TRUE);
- login_page = sInstance->getString("reg_in_client_url");
- web_browser->navigateTo(login_page, "text/html");
- }
- else
+ if (web_browser->getCurrentNavUrl() != oStr.str())
{
web_browser->navigateTo( oStr.str(), "text/html" );
}
@@ -943,10 +807,6 @@ void LLPanelLogin::onClickConnect(void *)
{
if (sInstance && sInstance->mCallback)
{
- // tell the responder we're not here anymore
- if ( gResponsePtr )
- gResponsePtr->setParent( 0 );
-
// JC - Make sure the fields all get committed.
sInstance->setFocus(FALSE);
@@ -973,7 +833,7 @@ void LLPanelLogin::onClickConnect(void *)
return;
}
updateStartSLURL();
- std::string username = sInstance->getChild<LLUICtrl>("username_edit")->getValue().asString();
+ std::string username = sInstance->getChild<LLUICtrl>("username_combo")->getValue().asString();
if(username.empty())
@@ -1014,24 +874,6 @@ void LLPanelLogin::onClickConnect(void *)
}
}
-/*
-// static
-bool LLPanelLogin::newAccountAlertCallback(const LLSD& notification, const LLSD& response)
-{
- S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
- if (0 == option)
- {
- llinfos << "Going to account creation URL" << llendl;
- LLWeb::loadURLExternal( LLNotifications::instance().getGlobalString("CREATE_ACCOUNT_URL"));
- }
- else
- {
- sInstance->setFocus(TRUE);
- }
- return false;
-}
-*/
-
// static
void LLPanelLogin::onClickNewAccount(void*)
{
@@ -1186,3 +1028,28 @@ void LLPanelLogin::updateLoginPanelLinks()
sInstance->getChildView("create_new_account_text")->setVisible( system_grid);
sInstance->getChildView("forgot_password_text")->setVisible( system_grid);
}
+
+std::string canonicalize_username(const std::string& name)
+{
+ std::string cname = name;
+ LLStringUtil::trim(cname);
+
+ // determine if the username is a first/last form or not.
+ size_t separator_index = cname.find_first_of(" ._");
+ std::string first = cname.substr(0, separator_index);
+ std::string last;
+ if (separator_index != cname.npos)
+ {
+ last = cname.substr(separator_index+1, cname.npos);
+ LLStringUtil::trim(last);
+ }
+ else
+ {
+ // ...on Linden grids, single username users as considered to have
+ // last name "Resident"
+ last = "Resident";
+ }
+
+ // Username in traditional "firstname lastname" form.
+ return first + ' ' + last;
+}
diff --git a/indra/newview/llpanellogin.h b/indra/newview/llpanellogin.h
index 83e76a308b..a439c4ff6b 100644
--- a/indra/newview/llpanellogin.h
+++ b/indra/newview/llpanellogin.h
@@ -85,9 +85,10 @@ public:
private:
friend class LLPanelLoginListener;
void reshapeBrowser();
+ void addFavoritesToStartLocation();
+ void addUsersWithFavoritesToUsername();
static void onClickConnect(void*);
static void onClickNewAccount(void*);
-// static bool newAccountAlertCallback(const LLSD& notification, const LLSD& response);
static void onClickVersion(void*);
static void onClickForgotPassword(void*);
static void onClickHelp(void*);
@@ -96,7 +97,6 @@ private:
static void onServerComboLostFocus(LLFocusableElement*);
static void updateServerCombo();
static void updateStartSLURL();
-
static void updateLoginPanelLinks();
private:
@@ -110,10 +110,6 @@ private:
static LLPanelLogin* sInstance;
static BOOL sCapslockDidNotification;
- BOOL mHtmlAvailable;
};
-std::string load_password_from_disk(void);
-void save_password_to_disk(const char* hashed_password);
-
#endif
diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp
index 17433a557b..c11597f532 100644
--- a/indra/newview/llpanelmaininventory.cpp
+++ b/indra/newview/llpanelmaininventory.cpp
@@ -1,6 +1,6 @@
/**
- * @file llsidepanelmaininventory.cpp
- * @brief Implementation of llsidepanelmaininventory.
+ * @file llpanelmaininventory.cpp
+ * @brief Implementation of llpanelmaininventory.
*
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
* Second Life Viewer Source Code
@@ -28,6 +28,7 @@
#include "llpanelmaininventory.h"
#include "llagent.h"
+#include "llagentcamera.h"
#include "llavataractions.h"
#include "lldndbutton.h"
#include "lleconomy.h"
@@ -38,6 +39,7 @@
#include "llinventorymodelbackgroundfetch.h"
#include "llinventorypanel.h"
#include "llfiltereditor.h"
+#include "llfloatersidepanelcontainer.h"
#include "llfloaterreg.h"
#include "llmenubutton.h"
#include "lloutfitobserver.h"
@@ -51,7 +53,6 @@
#include "llviewermenu.h"
#include "llviewertexturelist.h"
#include "llsidepanelinventory.h"
-#include "llsidetray.h"
const std::string FILTERS_FILENAME("filters.xml");
@@ -81,7 +82,6 @@ public:
BOOL getCheckSinceLogoff();
static void onTimeAgo(LLUICtrl*, void *);
- static void onCheckSinceLogoff(LLUICtrl*, void *);
static void onCloseBtn(void* user_data);
static void selectAllTypes(void* user_data);
static void selectNoTypes(void* user_data);
@@ -96,8 +96,8 @@ private:
/// LLPanelMainInventory
///----------------------------------------------------------------------------
-LLPanelMainInventory::LLPanelMainInventory()
- : LLPanel(),
+LLPanelMainInventory::LLPanelMainInventory(const LLPanel::Params& p)
+ : LLPanel(p),
mActivePanel(NULL),
mSavedFolderState(NULL),
mFilterText(""),
@@ -112,24 +112,12 @@ LLPanelMainInventory::LLPanelMainInventory()
mCommitCallbackRegistrar.add("Inventory.EmptyTrash", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyTrash", LLFolderType::FT_TRASH));
mCommitCallbackRegistrar.add("Inventory.EmptyLostAndFound", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyLostAndFound", LLFolderType::FT_LOST_AND_FOUND));
mCommitCallbackRegistrar.add("Inventory.DoCreate", boost::bind(&LLPanelMainInventory::doCreate, this, _2));
- mCommitCallbackRegistrar.add("Inventory.NewWindow", boost::bind(&LLPanelMainInventory::newWindow, this));
+ //mCommitCallbackRegistrar.add("Inventory.NewWindow", boost::bind(&LLPanelMainInventory::newWindow, this));
mCommitCallbackRegistrar.add("Inventory.ShowFilters", boost::bind(&LLPanelMainInventory::toggleFindOptions, this));
mCommitCallbackRegistrar.add("Inventory.ResetFilters", boost::bind(&LLPanelMainInventory::resetFilters, this));
mCommitCallbackRegistrar.add("Inventory.SetSortBy", boost::bind(&LLPanelMainInventory::setSortBy, this, _2));
mCommitCallbackRegistrar.add("Inventory.Share", boost::bind(&LLAvatarActions::shareWithAvatars));
- // Controls
- // *TODO: Just use persistant settings for each of these
- U32 sort_order = gSavedSettings.getU32(LLInventoryPanel::DEFAULT_SORT_ORDER);
- BOOL sort_by_name = ! ( sort_order & LLInventoryFilter::SO_DATE );
- BOOL sort_folders_by_name = ( sort_order & LLInventoryFilter::SO_FOLDERS_BY_NAME );
- BOOL sort_system_folders_to_top = ( sort_order & LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP );
-
- gSavedSettings.declareBOOL("Inventory.SortByName", sort_by_name, "Declared in code", FALSE);
- gSavedSettings.declareBOOL("Inventory.SortByDate", !sort_by_name, "Declared in code", FALSE);
- gSavedSettings.declareBOOL("Inventory.FoldersAlwaysByName", sort_folders_by_name, "Declared in code", FALSE);
- gSavedSettings.declareBOOL("Inventory.SystemFoldersToTop", sort_system_folders_to_top, "Declared in code", FALSE);
-
mSavedFolderState = new LLSaveFolderState();
mSavedFolderState->setApply(FALSE);
}
@@ -152,6 +140,7 @@ BOOL LLPanelMainInventory::postBuild()
mActivePanel->getFilter()->markDefault();
mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState);
mActivePanel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, mActivePanel, _1, _2));
+ mResortActivePanel = true;
}
LLInventoryPanel* recent_items_panel = getChild<LLInventoryPanel>("Recent Items");
if (recent_items_panel)
@@ -205,6 +194,9 @@ BOOL LLPanelMainInventory::postBuild()
mMenuAdd->getChild<LLMenuItemGL>("Upload Animation")->setLabelArg("[COST]", upload_cost);
mMenuAdd->getChild<LLMenuItemGL>("Bulk Upload")->setLabelArg("[COST]", upload_cost);
+ // Trigger callback for focus received so we can deselect items in inbox/outbox
+ LLFocusableElement::setFocusReceivedCallback(boost::bind(&LLPanelMainInventory::onFocusReceived, this));
+
return TRUE;
}
@@ -303,7 +295,13 @@ void LLPanelMainInventory::closeAllFolders()
void LLPanelMainInventory::newWindow()
{
- LLFloaterInventory::showAgentInventory();
+ static S32 instance_num = 0;
+ instance_num = (instance_num + 1) % S32_MAX;
+
+ if (!gAgentCamera.cameraMouselook())
+ {
+ LLFloaterReg::showTypedInstance<LLFloaterSidePanelContainer>("inventory", LLSD(instance_num));
+ }
}
void LLPanelMainInventory::doCreate(const LLSD& userdata)
@@ -325,67 +323,41 @@ void LLPanelMainInventory::resetFilters()
void LLPanelMainInventory::setSortBy(const LLSD& userdata)
{
- std::string sort_field = userdata.asString();
- if (sort_field == "name")
+ U32 sort_order_mask = getActivePanel()->getSortOrder();
+ std::string sort_type = userdata.asString();
+ if (sort_type == "name")
{
- U32 order = getActivePanel()->getSortOrder();
- order &= ~LLInventoryFilter::SO_DATE;
-
- getActivePanel()->setSortOrder( order );
-
- gSavedSettings.setU32("InventorySortOrder", order);
-
- gSavedSettings.setBOOL("Inventory.SortByName", TRUE );
- gSavedSettings.setBOOL("Inventory.SortByDate", FALSE );
+ sort_order_mask &= ~LLInventoryFilter::SO_DATE;
}
- else if (sort_field == "date")
+ else if (sort_type == "date")
{
- U32 order = getActivePanel()->getSortOrder();
- order |= LLInventoryFilter::SO_DATE;
-
- getActivePanel()->setSortOrder( order );
-
- gSavedSettings.setU32("InventorySortOrder", order);
-
- gSavedSettings.setBOOL("Inventory.SortByName", FALSE );
- gSavedSettings.setBOOL("Inventory.SortByDate", TRUE );
+ sort_order_mask |= LLInventoryFilter::SO_DATE;
}
- else if (sort_field == "foldersalwaysbyname")
+ else if (sort_type == "foldersalwaysbyname")
{
- U32 order = getActivePanel()->getSortOrder();
- if ( order & LLInventoryFilter::SO_FOLDERS_BY_NAME )
+ if ( sort_order_mask & LLInventoryFilter::SO_FOLDERS_BY_NAME )
{
- order &= ~LLInventoryFilter::SO_FOLDERS_BY_NAME;
-
- gSavedSettings.setBOOL("Inventory.FoldersAlwaysByName", FALSE );
+ sort_order_mask &= ~LLInventoryFilter::SO_FOLDERS_BY_NAME;
}
else
{
- order |= LLInventoryFilter::SO_FOLDERS_BY_NAME;
-
- gSavedSettings.setBOOL("Inventory.FoldersAlwaysByName", TRUE );
+ sort_order_mask |= LLInventoryFilter::SO_FOLDERS_BY_NAME;
}
- getActivePanel()->setSortOrder( order );
}
- else if (sort_field == "systemfolderstotop")
+ else if (sort_type == "systemfolderstotop")
{
- U32 order = getActivePanel()->getSortOrder();
- if ( order & LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP )
+ if ( sort_order_mask & LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP )
{
- order &= ~LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP;
-
- gSavedSettings.setBOOL("Inventory.SystemFoldersToTop", FALSE );
+ sort_order_mask &= ~LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP;
}
else
{
- order |= LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP;
-
- gSavedSettings.setBOOL("Inventory.SystemFoldersToTop", TRUE );
+ sort_order_mask |= LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP;
}
- getActivePanel()->setSortOrder( order );
-
- gSavedSettings.setU32("InventorySortOrder", order);
}
+
+ getActivePanel()->setSortOrder(sort_order_mask);
+ gSavedSettings.setU32("InventorySortOrder", sort_order_mask);
}
// static
@@ -403,7 +375,7 @@ void LLPanelMainInventory::onClearSearch()
if (mActivePanel)
{
mActivePanel->setFilterSubString(LLStringUtil::null);
- mActivePanel->setFilterTypes(0xffffffff);
+ mActivePanel->setFilterTypes(0xffffffffffffffffULL);
mActivePanel->setFilterLinks(LLInventoryFilter::FILTERLINK_INCLUDE_LINKS);
}
@@ -506,9 +478,6 @@ void LLPanelMainInventory::onFilterSelected()
return;
}
- BOOL recent_active = ("Recent Items" == mActivePanel->getName());
- getChildView("add_btn_panel")->setVisible( !recent_active);
-
setFilterSubString(mFilterSubString);
LLInventoryFilter* filter = mActivePanel->getFilter();
LLFloaterInventoryFinder *finder = getFinder();
@@ -570,6 +539,17 @@ void LLPanelMainInventory::draw()
{
mFilterEditor->setText(mFilterSubString);
}
+ if (mActivePanel && mResortActivePanel)
+ {
+ // EXP-756: Force resorting of the list the first time we draw the list:
+ // In the case of date sorting, we don't have enough information at initialization time
+ // to correctly sort the folders. Later manual resort doesn't do anything as the order value is
+ // set correctly. The workaround is to reset the order to alphabetical (or anything) then to the correct order.
+ U32 order = mActivePanel->getSortOrder();
+ mActivePanel->setSortOrder(LLInventoryFilter::SO_NAME);
+ mActivePanel->setSortOrder(order);
+ mResortActivePanel = false;
+ }
LLPanel::draw();
updateItemcountText();
}
@@ -587,7 +567,7 @@ void LLPanelMainInventory::updateItemcountText()
std::string text = "";
- if (LLInventoryModelBackgroundFetch::instance().backgroundFetchActive())
+ if (LLInventoryModelBackgroundFetch::instance().folderFetchActive())
{
text = getString("ItemcountFetching", string_args);
}
@@ -599,9 +579,23 @@ void LLPanelMainInventory::updateItemcountText()
{
text = getString("ItemcountUnknown");
}
+
+ // *TODO: Cache the LLUICtrl* for the ItemcountText control
getChild<LLUICtrl>("ItemcountText")->setValue(text);
}
+void LLPanelMainInventory::onFocusReceived()
+{
+ LLSidepanelInventory *sidepanel_inventory = LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory");
+ if (!sidepanel_inventory)
+ {
+ llwarns << "Could not find Inventory Panel in My Inventory floater" << llendl;
+ return;
+ }
+
+ sidepanel_inventory->clearSelections(false, true);
+}
+
void LLPanelMainInventory::setFilterTextFromFilter()
{
mFilterText = mActivePanel->getFilter()->getFilterText();
@@ -660,20 +654,6 @@ LLFloaterInventoryFinder::LLFloaterInventoryFinder(LLPanelMainInventory* invento
updateElementsFromFilter();
}
-
-void LLFloaterInventoryFinder::onCheckSinceLogoff(LLUICtrl *ctrl, void *user_data)
-{
- LLFloaterInventoryFinder *self = (LLFloaterInventoryFinder *)user_data;
- if (!self) return;
-
- bool since_logoff= self->getChild<LLUICtrl>("check_since_logoff")->getValue();
-
- if (!since_logoff &&
- !( self->mSpinSinceDays->get() || self->mSpinSinceHours->get() ) )
- {
- self->mSpinSinceHours->set(1.0f);
- }
-}
BOOL LLFloaterInventoryFinder::postBuild()
{
const LLRect& viewrect = mPanelMainInventory->getRect();
@@ -688,9 +668,6 @@ BOOL LLFloaterInventoryFinder::postBuild()
mSpinSinceDays = getChild<LLSpinCtrl>("spin_days_ago");
childSetCommitCallback("spin_days_ago", onTimeAgo, this);
- // mCheckSinceLogoff = getChild<LLSpinCtrl>("check_since_logoff");
- childSetCommitCallback("check_since_logoff", onCheckSinceLogoff, this);
-
childSetAction("Close", onCloseBtn, this);
updateElementsFromFilter();
@@ -701,12 +678,10 @@ void LLFloaterInventoryFinder::onTimeAgo(LLUICtrl *ctrl, void *user_data)
LLFloaterInventoryFinder *self = (LLFloaterInventoryFinder *)user_data;
if (!self) return;
- bool since_logoff=true;
if ( self->mSpinSinceDays->get() || self->mSpinSinceHours->get() )
{
- since_logoff = false;
+ self->getChild<LLUICtrl>("check_since_logoff")->setValue(false);
}
- self->getChild<LLUICtrl>("check_since_logoff")->setValue(since_logoff);
}
void LLFloaterInventoryFinder::changeFilter(LLInventoryFilter* filter)
@@ -735,6 +710,7 @@ void LLFloaterInventoryFinder::updateElementsFromFilter()
getChild<LLUICtrl>("check_clothing")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_WEARABLE));
getChild<LLUICtrl>("check_gesture")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_GESTURE));
getChild<LLUICtrl>("check_landmark")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_LANDMARK));
+ getChild<LLUICtrl>("check_mesh")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_MESH));
getChild<LLUICtrl>("check_notecard")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_NOTECARD));
getChild<LLUICtrl>("check_object")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_OBJECT));
getChild<LLUICtrl>("check_script")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_LSL));
@@ -750,7 +726,7 @@ void LLFloaterInventoryFinder::updateElementsFromFilter()
void LLFloaterInventoryFinder::draw()
{
LLMemType mt(LLMemType::MTYPE_INVENTORY_DRAW);
- U32 filter = 0xffffffff;
+ U64 filter = 0xffffffffffffffffULL;
BOOL filtered_by_all_types = TRUE;
if (!getChild<LLUICtrl>("check_animation")->getValue())
@@ -786,6 +762,12 @@ void LLFloaterInventoryFinder::draw()
filtered_by_all_types = FALSE;
}
+ if (!getChild<LLUICtrl>("check_mesh")->getValue())
+ {
+ filter &= ~(0x1 << LLInventoryType::IT_MESH);
+ filtered_by_all_types = FALSE;
+ }
+
if (!getChild<LLUICtrl>("check_notecard")->getValue())
{
filter &= ~(0x1 << LLInventoryType::IT_NOTECARD);
@@ -882,6 +864,7 @@ void LLFloaterInventoryFinder::selectAllTypes(void* user_data)
self->getChild<LLUICtrl>("check_clothing")->setValue(TRUE);
self->getChild<LLUICtrl>("check_gesture")->setValue(TRUE);
self->getChild<LLUICtrl>("check_landmark")->setValue(TRUE);
+ self->getChild<LLUICtrl>("check_mesh")->setValue(TRUE);
self->getChild<LLUICtrl>("check_notecard")->setValue(TRUE);
self->getChild<LLUICtrl>("check_object")->setValue(TRUE);
self->getChild<LLUICtrl>("check_script")->setValue(TRUE);
@@ -901,6 +884,7 @@ void LLFloaterInventoryFinder::selectNoTypes(void* user_data)
self->getChild<LLUICtrl>("check_clothing")->setValue(FALSE);
self->getChild<LLUICtrl>("check_gesture")->setValue(FALSE);
self->getChild<LLUICtrl>("check_landmark")->setValue(FALSE);
+ self->getChild<LLUICtrl>("check_mesh")->setValue(FALSE);
self->getChild<LLUICtrl>("check_notecard")->setValue(FALSE);
self->getChild<LLUICtrl>("check_object")->setValue(FALSE);
self->getChild<LLUICtrl>("check_script")->setValue(FALSE);
@@ -944,6 +928,11 @@ void LLPanelMainInventory::updateListCommands()
void LLPanelMainInventory::onAddButtonClick()
{
+// Gray out the "New Folder" option when the Recent tab is active as new folders will not be displayed
+// unless "Always show folders" is checked in the filter options.
+ bool recent_active = ("Recent Items" == mActivePanel->getName());
+ mMenuAdd->getChild<LLMenuItemGL>("New Folder")->setEnabled(!recent_active);
+
setUploadCostIfNeeded();
showActionMenu(mMenuAdd,"add_btn");
@@ -1011,6 +1000,11 @@ void LLPanelMainInventory::onCustomAction(const LLSD& userdata)
const LLSD arg = "date";
setSortBy(arg);
}
+ if (command_name == "sort_folders_by_name")
+ {
+ const LLSD arg = "foldersalwaysbyname";
+ setSortBy(arg);
+ }
if (command_name == "sort_system_folders_to_top")
{
const LLSD arg = "systemfolderstotop";
@@ -1182,7 +1176,7 @@ BOOL LLPanelMainInventory::isActionEnabled(const LLSD& userdata)
if (command_name == "share")
{
- LLSidepanelInventory* parent = dynamic_cast<LLSidepanelInventory*>(LLSideTray::getInstance()->getPanel("sidepanel_inventory"));
+ LLSidepanelInventory* parent = LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory");
return parent ? parent->canShare() : FALSE;
}
@@ -1191,24 +1185,26 @@ BOOL LLPanelMainInventory::isActionEnabled(const LLSD& userdata)
BOOL LLPanelMainInventory::isActionChecked(const LLSD& userdata)
{
+ U32 sort_order_mask = getActivePanel()->getSortOrder();
const std::string command_name = userdata.asString();
-
if (command_name == "sort_by_name")
{
- U32 order = getActivePanel()->getSortOrder();
- return ~order & LLInventoryFilter::SO_DATE;
+ return ~sort_order_mask & LLInventoryFilter::SO_DATE;
}
if (command_name == "sort_by_recent")
{
- U32 order = getActivePanel()->getSortOrder();
- return order & LLInventoryFilter::SO_DATE;
+ return sort_order_mask & LLInventoryFilter::SO_DATE;
+ }
+
+ if (command_name == "sort_folders_by_name")
+ {
+ return sort_order_mask & LLInventoryFilter::SO_FOLDERS_BY_NAME;
}
if (command_name == "sort_system_folders_to_top")
{
- U32 order = getActivePanel()->getSortOrder();
- return order & LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP;
+ return sort_order_mask & LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP;
}
return FALSE;
diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h
index c2b78ff9ea..899931aa89 100644
--- a/indra/newview/llpanelmaininventory.h
+++ b/indra/newview/llpanelmaininventory.h
@@ -57,7 +57,7 @@ class LLPanelMainInventory : public LLPanel, LLInventoryObserver
public:
friend class LLFloaterInventoryFinder;
- LLPanelMainInventory();
+ LLPanelMainInventory(const LLPanel::Params& p = getDefaultParams());
~LLPanelMainInventory();
BOOL postBuild();
@@ -114,6 +114,8 @@ protected:
bool isSaveTextureEnabled(const LLSD& userdata);
void updateItemcountText();
+ void onFocusReceived();
+
private:
LLFloaterInventoryFinder* getFinder();
@@ -121,6 +123,7 @@ private:
LLTabContainer* mFilterTabs;
LLHandle<LLFloater> mFinderHandle;
LLInventoryPanel* mActivePanel;
+ bool mResortActivePanel;
LLSaveFolderState* mSavedFolderState;
std::string mFilterText;
std::string mFilterSubString;
diff --git a/indra/newview/llpanelmarketplaceinbox.cpp b/indra/newview/llpanelmarketplaceinbox.cpp
new file mode 100644
index 0000000000..66c9c323cb
--- /dev/null
+++ b/indra/newview/llpanelmarketplaceinbox.cpp
@@ -0,0 +1,255 @@
+/**
+ * @file llpanelmarketplaceinbox.cpp
+ * @brief Panel for marketplace inbox
+ *
+* $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llpanelmarketplaceinbox.h"
+#include "llpanelmarketplaceinboxinventory.h"
+
+#include "llappviewer.h"
+#include "llbutton.h"
+#include "llinventorypanel.h"
+#include "llfloatersidepanelcontainer.h"
+#include "llfolderview.h"
+#include "llsidepanelinventory.h"
+#include "llviewercontrol.h"
+
+
+static LLRegisterPanelClassWrapper<LLPanelMarketplaceInbox> t_panel_marketplace_inbox("panel_marketplace_inbox");
+
+const LLPanelMarketplaceInbox::Params& LLPanelMarketplaceInbox::getDefaultParams()
+{
+ return LLUICtrlFactory::getDefaultParams<LLPanelMarketplaceInbox>();
+}
+
+// protected
+LLPanelMarketplaceInbox::LLPanelMarketplaceInbox(const Params& p)
+ : LLPanel(p)
+ , mFreshCountCtrl(NULL)
+ , mInboxButton(NULL)
+ , mInventoryPanel(NULL)
+{
+}
+
+LLPanelMarketplaceInbox::~LLPanelMarketplaceInbox()
+{
+}
+
+// virtual
+BOOL LLPanelMarketplaceInbox::postBuild()
+{
+ LLFocusableElement::setFocusReceivedCallback(boost::bind(&LLPanelMarketplaceInbox::onFocusReceived, this));
+
+ mFreshCountCtrl = getChild<LLUICtrl>("inbox_fresh_new_count");
+ mInboxButton = getChild<LLButton>("inbox_btn");
+
+ return TRUE;
+}
+
+void LLPanelMarketplaceInbox::onSelectionChange()
+{
+ LLSidepanelInventory* sidepanel_inventory = LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory");
+
+ sidepanel_inventory->updateVerbs();
+}
+
+
+LLInventoryPanel * LLPanelMarketplaceInbox::setupInventoryPanel()
+{
+ LLView * inbox_inventory_placeholder = getChild<LLView>("inbox_inventory_placeholder");
+ LLView * inbox_inventory_parent = inbox_inventory_placeholder->getParent();
+
+ mInventoryPanel =
+ LLUICtrlFactory::createFromFile<LLInventoryPanel>("panel_inbox_inventory.xml",
+ inbox_inventory_parent,
+ LLInventoryPanel::child_registry_t::instance());
+
+ llassert(mInventoryPanel);
+
+ // Reshape the inventory to the proper size
+ LLRect inventory_placeholder_rect = inbox_inventory_placeholder->getRect();
+ mInventoryPanel->setShape(inventory_placeholder_rect);
+
+ // Set the sort order newest to oldest
+ mInventoryPanel->setSortOrder(LLInventoryFilter::SO_DATE);
+ mInventoryPanel->getFilter()->markDefault();
+
+ // Set selection callback for proper update of inventory status buttons
+ mInventoryPanel->setSelectCallback(boost::bind(&LLPanelMarketplaceInbox::onSelectionChange, this));
+
+ // Set up the note to display when the inbox is empty
+ mInventoryPanel->getFilter()->setEmptyLookupMessage("InventoryInboxNoItems");
+
+ // Hide the placeholder text
+ inbox_inventory_placeholder->setVisible(FALSE);
+
+ return mInventoryPanel;
+}
+
+void LLPanelMarketplaceInbox::onFocusReceived()
+{
+ LLSidepanelInventory *sidepanel_inventory = LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory");
+ if (sidepanel_inventory)
+ {
+ sidepanel_inventory->clearSelections(true, false);
+ }
+
+ gSavedPerAccountSettings.setU32("LastInventoryInboxActivity", time_corrected());
+}
+
+BOOL LLPanelMarketplaceInbox::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, EDragAndDropType cargo_type, void *cargo_data, EAcceptance *accept, std::string& tooltip_msg)
+{
+ *accept = ACCEPT_NO;
+ return TRUE;
+}
+
+U32 LLPanelMarketplaceInbox::getFreshItemCount() const
+{
+#if SUPPORTING_FRESH_ITEM_COUNT
+
+ //
+ // NOTE: When turning this on, be sure to test the no inbox/outbox case because this code probably
+ // will return "2" for the Inventory and LIBRARY top-levels when that happens.
+ //
+
+ U32 fresh_item_count = 0;
+
+ if (mInventoryPanel)
+ {
+ const LLFolderViewFolder * inbox_folder = mInventoryPanel->getRootFolder();
+
+ if (inbox_folder)
+ {
+ LLFolderViewFolder::folders_t::const_iterator folders_it = inbox_folder->getFoldersBegin();
+ LLFolderViewFolder::folders_t::const_iterator folders_end = inbox_folder->getFoldersEnd();
+
+ for (; folders_it != folders_end; ++folders_it)
+ {
+ const LLFolderViewFolder * folder_view = *folders_it;
+ const LLInboxFolderViewFolder * inbox_folder_view = dynamic_cast<const LLInboxFolderViewFolder*>(folder_view);
+
+ if (inbox_folder_view && inbox_folder_view->isFresh())
+ {
+ fresh_item_count++;
+ }
+ }
+
+ LLFolderViewFolder::items_t::const_iterator items_it = inbox_folder->getItemsBegin();
+ LLFolderViewFolder::items_t::const_iterator items_end = inbox_folder->getItemsEnd();
+
+ for (; items_it != items_end; ++items_it)
+ {
+ const LLFolderViewItem * item_view = *items_it;
+ const LLInboxFolderViewItem * inbox_item_view = dynamic_cast<const LLInboxFolderViewItem*>(item_view);
+
+ if (inbox_item_view && inbox_item_view->isFresh())
+ {
+ fresh_item_count++;
+ }
+ }
+ }
+ }
+
+ return fresh_item_count;
+#else
+ return getTotalItemCount();
+#endif
+}
+
+U32 LLPanelMarketplaceInbox::getTotalItemCount() const
+{
+ U32 item_count = 0;
+
+ if (mInventoryPanel)
+ {
+ const LLFolderViewFolder * inbox_folder = mInventoryPanel->getRootFolder();
+
+ if (inbox_folder)
+ {
+ item_count += inbox_folder->getFoldersCount();
+ item_count += inbox_folder->getItemsCount();
+ }
+ }
+
+ return item_count;
+}
+
+std::string LLPanelMarketplaceInbox::getBadgeString() const
+{
+ std::string item_count_str("");
+
+ LLPanel *inventory_panel = LLFloaterSidePanelContainer::getPanel("inventory");
+
+ // If the inbox is visible, and the side panel is collapsed or expanded and not the inventory panel
+ if (getParent()->getVisible() && inventory_panel && !inventory_panel->isInVisibleChain())
+ {
+ U32 item_count = getFreshItemCount();
+
+ if (item_count)
+ {
+ item_count_str = llformat("%d", item_count);
+ }
+ }
+
+ return item_count_str;
+}
+
+void LLPanelMarketplaceInbox::draw()
+{
+ U32 item_count = getTotalItemCount();
+
+ llassert(mFreshCountCtrl != NULL);
+
+ if (item_count > 0)
+ {
+ std::string item_count_str = llformat("%d", item_count);
+
+ LLStringUtil::format_map_t args;
+ args["[NUM]"] = item_count_str;
+ mInboxButton->setLabel(getString("InboxLabelWithArg", args));
+
+#if SUPPORTING_FRESH_ITEM_COUNT
+ // set green text to fresh item count
+ U32 fresh_item_count = getFreshItemCount();
+ mFreshCountCtrl->setVisible((fresh_item_count > 0));
+
+ if (fresh_item_count > 0)
+ {
+ mFreshCountCtrl->setTextArg("[NUM]", llformat("%d", fresh_item_count));
+ }
+#else
+ mFreshCountCtrl->setVisible(FALSE);
+#endif
+ }
+ else
+ {
+ mInboxButton->setLabel(getString("InboxLabelNoArg"));
+
+ mFreshCountCtrl->setVisible(FALSE);
+ }
+
+ LLPanel::draw();
+}
diff --git a/indra/newview/llpanelmarketplaceinbox.h b/indra/newview/llpanelmarketplaceinbox.h
new file mode 100644
index 0000000000..9eb74581a2
--- /dev/null
+++ b/indra/newview/llpanelmarketplaceinbox.h
@@ -0,0 +1,77 @@
+/**
+ * @file llpanelmarketplaceinbox.h
+ * @brief Panel for marketplace inbox
+ *
+* $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLPANELMARKETPLACEINBOX_H
+#define LL_LLPANELMARKETPLACEINBOX_H
+
+#include "llpanel.h"
+
+class LLButton;
+class LLInventoryPanel;
+class LLUICtrl;
+
+class LLPanelMarketplaceInbox : public LLPanel
+{
+public:
+
+ struct Params : public LLInitParam::Block<Params, LLPanel::Params>
+ {};
+
+ LOG_CLASS(LLPanelMarketplaceInbox);
+
+ // RN: for some reason you can't just use LLUICtrlFactory::getDefaultParams as a default argument in VC8
+ static const LLPanelMarketplaceInbox::Params& getDefaultParams();
+
+ LLPanelMarketplaceInbox(const Params& p = getDefaultParams());
+ ~LLPanelMarketplaceInbox();
+
+ /*virtual*/ BOOL postBuild();
+
+ /*virtual*/ BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, EDragAndDropType cargo_type, void *cargo_data, EAcceptance *accept, std::string& tooltip_msg);
+
+ /*virtual*/ void draw();
+
+ LLInventoryPanel * setupInventoryPanel();
+
+ U32 getFreshItemCount() const;
+ U32 getTotalItemCount() const;
+
+ std::string getBadgeString() const;
+
+private:
+
+ void onSelectionChange();
+
+ void onFocusReceived();
+
+private:
+ LLUICtrl * mFreshCountCtrl;
+ LLButton * mInboxButton;
+ LLInventoryPanel * mInventoryPanel;
+};
+
+
+#endif //LL_LLPANELMARKETPLACEINBOX_H
diff --git a/indra/newview/llpanelmarketplaceinboxinventory.cpp b/indra/newview/llpanelmarketplaceinboxinventory.cpp
new file mode 100644
index 0000000000..678e4f2843
--- /dev/null
+++ b/indra/newview/llpanelmarketplaceinboxinventory.cpp
@@ -0,0 +1,329 @@
+/**
+ * @file llpanelmarketplaceinboxinventory.cpp
+ * @brief LLInboxInventoryPanel class definition
+ *
+ * $LicenseInfo:firstyear=2009&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llpanelmarketplaceinboxinventory.h"
+
+#include "llfolderview.h"
+#include "llfoldervieweventlistener.h"
+#include "llinventorybridge.h"
+#include "llinventoryfunctions.h"
+#include "llpanellandmarks.h"
+#include "llplacesinventorybridge.h"
+#include "llviewerfoldertype.h"
+
+
+#define DEBUGGING_FRESHNESS 0
+
+//
+// statics
+//
+
+static LLDefaultChildRegistry::Register<LLInboxInventoryPanel> r1("inbox_inventory_panel");
+static LLDefaultChildRegistry::Register<LLInboxFolderViewFolder> r2("inbox_folder_view_folder");
+static LLDefaultChildRegistry::Register<LLInboxFolderViewItem> r3("inbox_folder_view_item");
+
+
+//
+// LLInboxInventoryPanel Implementation
+//
+
+LLInboxInventoryPanel::LLInboxInventoryPanel(const LLInboxInventoryPanel::Params& p)
+ : LLInventoryPanel(p)
+{
+}
+
+LLInboxInventoryPanel::~LLInboxInventoryPanel()
+{
+}
+
+// virtual
+void LLInboxInventoryPanel::buildFolderView(const LLInventoryPanel::Params& params)
+{
+ // Determine the root folder in case specified, and
+ // build the views starting with that folder.
+
+ LLUUID root_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_INBOX, false, false);
+
+ // leslie -- temporary HACK to work around sim not creating inbox with proper system folder type
+ if (root_id.isNull())
+ {
+ std::string start_folder_name(params.start_folder());
+
+ LLInventoryModel::cat_array_t* cats;
+ LLInventoryModel::item_array_t* items;
+
+ gInventory.getDirectDescendentsOf(gInventory.getRootFolderID(), cats, items);
+
+ if (cats)
+ {
+ for (LLInventoryModel::cat_array_t::const_iterator cat_it = cats->begin(); cat_it != cats->end(); ++cat_it)
+ {
+ LLInventoryCategory* cat = *cat_it;
+
+ if (cat->getName() == start_folder_name)
+ {
+ root_id = cat->getUUID();
+ break;
+ }
+ }
+ }
+
+ if (root_id == LLUUID::null)
+ {
+ llwarns << "No category found that matches inbox inventory panel start_folder: " << start_folder_name << llendl;
+ }
+ }
+ // leslie -- end temporary HACK
+
+ if (root_id == LLUUID::null)
+ {
+ llwarns << "Inbox inventory panel has no root folder!" << llendl;
+ root_id = LLUUID::generateNewID();
+ }
+
+ LLInvFVBridge* new_listener = mInvFVBridgeBuilder->createBridge(LLAssetType::AT_CATEGORY,
+ LLAssetType::AT_CATEGORY,
+ LLInventoryType::IT_CATEGORY,
+ this,
+ NULL,
+ root_id);
+
+ mFolderRoot = createFolderView(new_listener, params.use_label_suffix());
+}
+
+LLFolderViewFolder * LLInboxInventoryPanel::createFolderViewFolder(LLInvFVBridge * bridge)
+{
+ LLInboxFolderViewFolder::Params params;
+
+ params.name = bridge->getDisplayName();
+ params.icon = bridge->getIcon();
+ params.icon_open = bridge->getOpenIcon();
+
+ if (mShowItemLinkOverlays) // if false, then links show up just like normal items
+ {
+ params.icon_overlay = LLUI::getUIImage("Inv_Link");
+ }
+
+ params.root = mFolderRoot;
+ params.listener = bridge;
+ params.tool_tip = params.name;
+
+ return LLUICtrlFactory::create<LLInboxFolderViewFolder>(params);
+}
+
+LLFolderViewItem * LLInboxInventoryPanel::createFolderViewItem(LLInvFVBridge * bridge)
+{
+ LLInboxFolderViewItem::Params params;
+
+ params.name = bridge->getDisplayName();
+ params.icon = bridge->getIcon();
+ params.icon_open = bridge->getOpenIcon();
+
+ if (mShowItemLinkOverlays) // if false, then links show up just like normal items
+ {
+ params.icon_overlay = LLUI::getUIImage("Inv_Link");
+ }
+
+ params.creation_date = bridge->getCreationDate();
+ params.root = mFolderRoot;
+ params.listener = bridge;
+ params.rect = LLRect (0, 0, 0, 0);
+ params.tool_tip = params.name;
+
+ return LLUICtrlFactory::create<LLInboxFolderViewItem>(params);
+}
+
+//
+// LLInboxFolderViewFolder Implementation
+//
+
+LLInboxFolderViewFolder::LLInboxFolderViewFolder(const Params& p)
+ : LLFolderViewFolder(p)
+ , LLBadgeOwner(getHandle())
+ , mFresh(false)
+{
+#if SUPPORTING_FRESH_ITEM_COUNT
+ initBadgeParams(p.new_badge());
+#endif
+}
+
+// virtual
+void LLInboxFolderViewFolder::draw()
+{
+#if SUPPORTING_FRESH_ITEM_COUNT
+ if (!badgeHasParent())
+ {
+ addBadgeToParentPanel();
+ }
+
+ setBadgeVisibility(mFresh);
+#endif
+
+ LLFolderViewFolder::draw();
+}
+
+void LLInboxFolderViewFolder::selectItem()
+{
+ deFreshify();
+
+ LLFolderViewFolder::selectItem();
+}
+
+void LLInboxFolderViewFolder::toggleOpen()
+{
+ deFreshify();
+
+ LLFolderViewFolder::toggleOpen();
+}
+
+void LLInboxFolderViewFolder::computeFreshness()
+{
+ const U32 last_expansion_utc = gSavedPerAccountSettings.getU32("LastInventoryInboxActivity");
+
+ if (last_expansion_utc > 0)
+ {
+ mFresh = (mCreationDate > last_expansion_utc);
+
+#if DEBUGGING_FRESHNESS
+ if (mFresh)
+ {
+ llinfos << "Item is fresh! -- creation " << mCreationDate << ", saved_freshness_date " << last_expansion_utc << llendl;
+ }
+#endif
+ }
+ else
+ {
+ mFresh = true;
+ }
+}
+
+void LLInboxFolderViewFolder::deFreshify()
+{
+ mFresh = false;
+
+ gSavedPerAccountSettings.setU32("LastInventoryInboxActivity", time_corrected());
+}
+
+void LLInboxFolderViewFolder::setCreationDate(time_t creation_date_utc)
+{
+ mCreationDate = creation_date_utc;
+
+ if (mParentFolder == mRoot)
+ {
+ computeFreshness();
+ }
+}
+
+//
+// LLInboxFolderViewItem Implementation
+//
+
+LLInboxFolderViewItem::LLInboxFolderViewItem(const Params& p)
+ : LLFolderViewItem(p)
+ , LLBadgeOwner(getHandle())
+ , mFresh(false)
+{
+#if SUPPORTING_FRESH_ITEM_COUNT
+ initBadgeParams(p.new_badge());
+#endif
+}
+
+BOOL LLInboxFolderViewItem::addToFolder(LLFolderViewFolder* folder, LLFolderView* root)
+{
+ BOOL retval = LLFolderViewItem::addToFolder(folder, root);
+
+#if SUPPORTING_FRESH_ITEM_COUNT
+ // Compute freshness if our parent is the root folder for the inbox
+ if (mParentFolder == mRoot)
+ {
+ computeFreshness();
+ }
+#endif
+
+ return retval;
+}
+
+BOOL LLInboxFolderViewItem::handleDoubleClick(S32 x, S32 y, MASK mask)
+{
+ deFreshify();
+
+ return LLFolderViewItem::handleDoubleClick(x, y, mask);
+}
+
+// virtual
+void LLInboxFolderViewItem::draw()
+{
+#if SUPPORTING_FRESH_ITEM_COUNT
+ if (!badgeHasParent())
+ {
+ addBadgeToParentPanel();
+ }
+
+ setBadgeVisibility(mFresh);
+#endif
+
+ LLFolderViewItem::draw();
+}
+
+void LLInboxFolderViewItem::selectItem()
+{
+ deFreshify();
+
+ LLFolderViewItem::selectItem();
+}
+
+void LLInboxFolderViewItem::computeFreshness()
+{
+ const U32 last_expansion_utc = gSavedPerAccountSettings.getU32("LastInventoryInboxActivity");
+
+ if (last_expansion_utc > 0)
+ {
+ mFresh = (mCreationDate > last_expansion_utc);
+
+#if DEBUGGING_FRESHNESS
+ if (mFresh)
+ {
+ llinfos << "Item is fresh! -- creation " << mCreationDate << ", saved_freshness_date " << last_expansion_utc << llendl;
+ }
+#endif
+ }
+ else
+ {
+ mFresh = true;
+ }
+}
+
+void LLInboxFolderViewItem::deFreshify()
+{
+ mFresh = false;
+
+ gSavedPerAccountSettings.setU32("LastInventoryInboxActivity", time_corrected());
+}
+
+
+// eof
diff --git a/indra/newview/llpanelmarketplaceinboxinventory.h b/indra/newview/llpanelmarketplaceinboxinventory.h
new file mode 100644
index 0000000000..d6b827ee3e
--- /dev/null
+++ b/indra/newview/llpanelmarketplaceinboxinventory.h
@@ -0,0 +1,121 @@
+/**
+ * @file llpanelmarketplaceinboxinventory.h
+ * @brief LLInboxInventoryPanel class declaration
+ *
+ * $LicenseInfo:firstyear=2009&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_INBOXINVENTORYPANEL_H
+#define LL_INBOXINVENTORYPANEL_H
+
+
+#include "llbadgeowner.h"
+#include "llinventorypanel.h"
+#include "llfolderviewitem.h"
+
+
+#define SUPPORTING_FRESH_ITEM_COUNT 1
+
+
+
+class LLInboxInventoryPanel : public LLInventoryPanel
+{
+public:
+ struct Params : public LLInitParam::Block<Params, LLInventoryPanel::Params>
+ {};
+
+ LLInboxInventoryPanel(const Params& p);
+ ~LLInboxInventoryPanel();
+
+ // virtual
+ void buildFolderView(const LLInventoryPanel::Params& params);
+
+ // virtual
+ LLFolderViewFolder * createFolderViewFolder(LLInvFVBridge * bridge);
+ LLFolderViewItem * createFolderViewItem(LLInvFVBridge * bridge);
+};
+
+
+class LLInboxFolderViewFolder : public LLFolderViewFolder, public LLBadgeOwner
+{
+public:
+ struct Params : public LLInitParam::Block<Params, LLFolderViewFolder::Params>
+ {
+ Optional<LLBadge::Params> new_badge;
+
+ Params()
+ : new_badge("new_badge")
+ {
+ }
+ };
+
+ LLInboxFolderViewFolder(const Params& p);
+
+ void draw();
+
+ void selectItem();
+ void toggleOpen();
+
+ void computeFreshness();
+ void deFreshify();
+
+ bool isFresh() const { return mFresh; }
+
+protected:
+ void setCreationDate(time_t creation_date_utc);
+
+ bool mFresh;
+};
+
+
+class LLInboxFolderViewItem : public LLFolderViewItem, public LLBadgeOwner
+{
+public:
+ struct Params : public LLInitParam::Block<Params, LLFolderViewItem::Params>
+ {
+ Optional<LLBadge::Params> new_badge;
+
+ Params()
+ : new_badge("new_badge")
+ {
+ }
+ };
+
+ LLInboxFolderViewItem(const Params& p);
+
+ BOOL addToFolder(LLFolderViewFolder* folder, LLFolderView* root);
+ BOOL handleDoubleClick(S32 x, S32 y, MASK mask);
+
+ void draw();
+
+ void selectItem();
+
+ void computeFreshness();
+ void deFreshify();
+
+ bool isFresh() const { return mFresh; }
+
+protected:
+ bool mFresh;
+};
+
+#endif //LL_INBOXINVENTORYPANEL_H
diff --git a/indra/newview/llpanelmarketplaceoutboxinventory.cpp b/indra/newview/llpanelmarketplaceoutboxinventory.cpp
new file mode 100644
index 0000000000..ff62cb23db
--- /dev/null
+++ b/indra/newview/llpanelmarketplaceoutboxinventory.cpp
@@ -0,0 +1,156 @@
+/**
+ * @file llpanelmarketplaceoutboxinventory.cpp
+ * @brief LLOutboxInventoryPanel class definition
+ *
+ * $LicenseInfo:firstyear=2009&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llpanelmarketplaceoutboxinventory.h"
+
+#include "llfolderview.h"
+#include "llfoldervieweventlistener.h"
+#include "llinventorybridge.h"
+#include "llinventoryfunctions.h"
+#include "llpanellandmarks.h"
+#include "llplacesinventorybridge.h"
+#include "lltrans.h"
+#include "llviewerfoldertype.h"
+
+
+//
+// statics
+//
+
+static LLDefaultChildRegistry::Register<LLOutboxInventoryPanel> r1("outbox_inventory_panel");
+static LLDefaultChildRegistry::Register<LLOutboxFolderViewFolder> r2("outbox_folder_view_folder");
+
+
+//
+// LLOutboxInventoryPanel Implementation
+//
+
+LLOutboxInventoryPanel::LLOutboxInventoryPanel(const LLOutboxInventoryPanel::Params& p)
+ : LLInventoryPanel(p)
+{
+}
+
+LLOutboxInventoryPanel::~LLOutboxInventoryPanel()
+{
+}
+
+// virtual
+void LLOutboxInventoryPanel::buildFolderView(const LLInventoryPanel::Params& params)
+{
+ // Determine the root folder in case specified, and
+ // build the views starting with that folder.
+
+ LLUUID root_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false, false);
+
+ if (root_id == LLUUID::null)
+ {
+ llwarns << "Outbox inventory panel has no root folder!" << llendl;
+ root_id = LLUUID::generateNewID();
+ }
+
+ LLInvFVBridge* new_listener = mInvFVBridgeBuilder->createBridge(LLAssetType::AT_CATEGORY,
+ LLAssetType::AT_CATEGORY,
+ LLInventoryType::IT_CATEGORY,
+ this,
+ NULL,
+ root_id);
+
+ mFolderRoot = createFolderView(new_listener, params.use_label_suffix());
+}
+
+LLFolderViewFolder * LLOutboxInventoryPanel::createFolderViewFolder(LLInvFVBridge * bridge)
+{
+ LLOutboxFolderViewFolder::Params params;
+
+ params.name = bridge->getDisplayName();
+ params.icon = bridge->getIcon();
+ params.icon_open = bridge->getOpenIcon();
+
+ if (mShowItemLinkOverlays) // if false, then links show up just like normal items
+ {
+ params.icon_overlay = LLUI::getUIImage("Inv_Link");
+ }
+
+ params.root = mFolderRoot;
+ params.listener = bridge;
+ params.tool_tip = params.name;
+
+ return LLUICtrlFactory::create<LLOutboxFolderViewFolder>(params);
+}
+
+LLFolderViewItem * LLOutboxInventoryPanel::createFolderViewItem(LLInvFVBridge * bridge)
+{
+ LLFolderViewItem::Params params;
+
+ params.name = bridge->getDisplayName();
+ params.icon = bridge->getIcon();
+ params.icon_open = bridge->getOpenIcon();
+
+ if (mShowItemLinkOverlays) // if false, then links show up just like normal items
+ {
+ params.icon_overlay = LLUI::getUIImage("Inv_Link");
+ }
+
+ params.creation_date = bridge->getCreationDate();
+ params.root = mFolderRoot;
+ params.listener = bridge;
+ params.rect = LLRect (0, 0, 0, 0);
+ params.tool_tip = params.name;
+
+ return LLUICtrlFactory::create<LLOutboxFolderViewItem>(params);
+}
+
+//
+// LLOutboxFolderViewFolder Implementation
+//
+
+LLOutboxFolderViewFolder::LLOutboxFolderViewFolder(const Params& p)
+ : LLFolderViewFolder(p)
+{
+}
+
+//
+// LLOutboxFolderViewItem Implementation
+//
+
+LLOutboxFolderViewItem::LLOutboxFolderViewItem(const Params& p)
+ : LLFolderViewItem(p)
+{
+}
+
+BOOL LLOutboxFolderViewItem::handleDoubleClick(S32 x, S32 y, MASK mask)
+{
+ return TRUE;
+}
+
+void LLOutboxFolderViewItem::openItem()
+{
+ // Intentionally do nothing to block attaching items from the outbox
+}
+
+// eof
diff --git a/indra/newview/llpanelmarketplaceoutboxinventory.h b/indra/newview/llpanelmarketplaceoutboxinventory.h
new file mode 100644
index 0000000000..a6c522b7c2
--- /dev/null
+++ b/indra/newview/llpanelmarketplaceoutboxinventory.h
@@ -0,0 +1,78 @@
+/**
+ * @file llpanelmarketplaceoutboxinventory.h
+ * @brief LLOutboxInventoryPanel class declaration
+ *
+ * $LicenseInfo:firstyear=2009&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_OUTBOXINVENTORYPANEL_H
+#define LL_OUTBOXINVENTORYPANEL_H
+
+
+#include "llinventorypanel.h"
+#include "llfolderviewitem.h"
+
+
+class LLOutboxInventoryPanel : public LLInventoryPanel
+{
+public:
+ struct Params : public LLInitParam::Block<Params, LLInventoryPanel::Params>
+ {
+ Params() {}
+ };
+
+ LLOutboxInventoryPanel(const Params& p);
+ ~LLOutboxInventoryPanel();
+
+ // virtual
+ void buildFolderView(const LLInventoryPanel::Params& params);
+
+ // virtual
+ LLFolderViewFolder * createFolderViewFolder(LLInvFVBridge * bridge);
+ LLFolderViewItem * createFolderViewItem(LLInvFVBridge * bridge);
+};
+
+
+class LLOutboxFolderViewFolder : public LLFolderViewFolder
+{
+public:
+ struct Params : public LLInitParam::Block<Params, LLFolderViewFolder::Params>
+ {
+ Params() {}
+ };
+
+ LLOutboxFolderViewFolder(const Params& p);
+};
+
+
+class LLOutboxFolderViewItem : public LLFolderViewItem
+{
+public:
+ LLOutboxFolderViewItem(const Params& p);
+
+ // virtual
+ BOOL handleDoubleClick(S32 x, S32 y, MASK mask);
+ void openItem();
+};
+
+
+#endif //LL_OUTBOXINVENTORYPANEL_H
diff --git a/indra/newview/llpanelme.cpp b/indra/newview/llpanelme.cpp
index 5ea94e0611..a9af56f750 100644
--- a/indra/newview/llpanelme.cpp
+++ b/indra/newview/llpanelme.cpp
@@ -37,7 +37,6 @@
#include "llfirstuse.h"
#include "llfloaterreg.h"
#include "llhints.h"
-#include "llsidetray.h"
#include "llviewercontrol.h"
#include "llviewerdisplayname.h"
@@ -49,16 +48,10 @@
#include "lltabcontainer.h"
#include "lltexturectrl.h"
-#define PICKER_SECOND_LIFE "2nd_life_pic"
-#define PICKER_FIRST_LIFE "real_world_pic"
-#define PANEL_PROFILE "panel_profile"
-
-static LLRegisterPanelClassWrapper<LLPanelMyProfileEdit> t_panel_me_profile_edit("edit_profile_panel");
static LLRegisterPanelClassWrapper<LLPanelMe> t_panel_me_profile("panel_me");
LLPanelMe::LLPanelMe(void)
: LLPanelProfile()
- , mEditPanel(NULL)
{
setAvatarId(gAgent.getID());
}
@@ -67,360 +60,10 @@ BOOL LLPanelMe::postBuild()
{
LLPanelProfile::postBuild();
- getTabContainer()[PANEL_PROFILE]->childSetAction("edit_profile_btn", boost::bind(&LLPanelMe::onEditProfileClicked, this), this);
-
return TRUE;
}
void LLPanelMe::onOpen(const LLSD& key)
{
LLPanelProfile::onOpen(key);
-
- // Force Edit My Profile if this is the first time when user is opening Me Panel (EXT-5068)
- bool opened = gSavedSettings.getBOOL("MePanelOpened");
- // In some cases Side Tray my call onOpen() twice, check getCollapsed() to be sure this
- // is the last time onOpen() is called
- if( !opened && !LLSideTray::getInstance()->getCollapsed() )
- {
- buildEditPanel();
- openPanel(mEditPanel, getAvatarId());
-
- gSavedSettings.setBOOL("MePanelOpened", true);
- }
-}
-
-bool LLPanelMe::notifyChildren(const LLSD& info)
-{
- if (info.has("task-panel-action") && info["task-panel-action"].asString() == "handle-tri-state")
- {
- // Implement task panel tri-state behavior.
- //
- // When the button of an active open task panel is clicked, side tray
- // calls notifyChildren() on the panel, passing task-panel-action=>handle-tri-state as an argument.
- // The task panel is supposed to handle this by reverting to the default view,
- // i.e. closing any dependent panels like "pick info" or "profile edit".
-
- bool on_default_view = true;
-
- const LLRect& task_panel_rect = getRect();
- for (LLView* child = getFirstChild(); child; child = findNextSibling(child))
- {
- LLPanel* panel = dynamic_cast<LLPanel*>(child);
- if (!panel)
- continue;
-
- // *HACK: implement panel stack instead (e.g. me->pick_info->pick_edit).
- if (panel->getRect().getWidth() == task_panel_rect.getWidth() &&
- panel->getRect().getHeight() == task_panel_rect.getHeight() &&
- panel->getVisible())
- {
- panel->setVisible(FALSE);
- on_default_view = false;
- }
- }
-
- if (on_default_view)
- LLSideTray::getInstance()->collapseSideBar();
-
- return true; // this notification is only supposed to be handled by task panels
- }
-
- return LLPanel::notifyChildren(info);
-}
-
-void LLPanelMe::buildEditPanel()
-{
- if (NULL == mEditPanel)
- {
- mEditPanel = new LLPanelMyProfileEdit();
- mEditPanel->childSetAction("save_btn", boost::bind(&LLPanelMe::onSaveChangesClicked, this), this);
- mEditPanel->childSetAction("cancel_btn", boost::bind(&LLPanelMe::onCancelClicked, this), this);
- }
-}
-
-
-void LLPanelMe::onEditProfileClicked()
-{
- buildEditPanel();
- togglePanel(mEditPanel, getAvatarId()); // open
-}
-
-void LLPanelMe::onSaveChangesClicked()
-{
- LLAvatarData data = LLAvatarData();
- data.avatar_id = gAgent.getID();
- data.image_id = mEditPanel->getChild<LLTextureCtrl>(PICKER_SECOND_LIFE)->getImageAssetID();
- data.fl_image_id = mEditPanel->getChild<LLTextureCtrl>(PICKER_FIRST_LIFE)->getImageAssetID();
- data.about_text = mEditPanel->getChild<LLUICtrl>("sl_description_edit")->getValue().asString();
- data.fl_about_text = mEditPanel->getChild<LLUICtrl>("fl_description_edit")->getValue().asString();
- data.profile_url = mEditPanel->getChild<LLUICtrl>("homepage_edit")->getValue().asString();
- data.allow_publish = mEditPanel->getChild<LLUICtrl>("show_in_search_checkbox")->getValue();
-
- LLAvatarPropertiesProcessor::getInstance()->sendAvatarPropertiesUpdate(&data);
- togglePanel(mEditPanel); // close
- onOpen(getAvatarId());
-}
-
-void LLPanelMe::onCancelClicked()
-{
- togglePanel(mEditPanel); // close
-}
-
-//////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////
-
-LLPanelMyProfileEdit::LLPanelMyProfileEdit()
- : LLPanelMyProfile()
-{
- buildFromFile( "panel_edit_profile.xml");
-
- setAvatarId(gAgent.getID());
-
- LLAvatarNameCache::addUseDisplayNamesCallback(boost::bind(&LLPanelMyProfileEdit::onAvatarNameChanged, this));
-}
-
-void LLPanelMyProfileEdit::onOpen(const LLSD& key)
-{
- resetData();
-
- // Disable editing until data is loaded, or edited fields will be overwritten when data
- // is loaded.
- enableEditing(false);
-
- // force new avatar name fetch so we have latest update time
- LLAvatarNameCache::fetch(gAgent.getID());
- LLPanelMyProfile::onOpen(getAvatarId());
-
- LLAvatarName av_name;
- if (LLAvatarNameCache::useDisplayNames())
- {
- if (LLAvatarNameCache::get(gAgent.getID(), &av_name) && av_name.mIsDisplayNameDefault)
- {
- LLFirstUse::setDisplayName();
- }
- else
- {
- LLFirstUse::setDisplayName(false);
- }
- }
-
- if (LLAvatarNameCache::useDisplayNames())
- {
- getChild<LLUICtrl>("user_label")->setVisible( true );
- getChild<LLUICtrl>("user_slid")->setVisible( true );
- getChild<LLUICtrl>("display_name_label")->setVisible( true );
- getChild<LLUICtrl>("set_name")->setVisible( true );
- getChild<LLUICtrl>("set_name")->setEnabled( true );
- getChild<LLUICtrl>("solo_user_name")->setVisible( false );
- getChild<LLUICtrl>("solo_username_label")->setVisible( false );
- }
- else
- {
- getChild<LLUICtrl>("user_label")->setVisible( false );
- getChild<LLUICtrl>("user_slid")->setVisible( false );
- getChild<LLUICtrl>("display_name_label")->setVisible( false );
- getChild<LLUICtrl>("set_name")->setVisible( false );
- getChild<LLUICtrl>("set_name")->setEnabled( false );
- getChild<LLUICtrl>("solo_user_name")->setVisible( true );
- getChild<LLUICtrl>("solo_username_label")->setVisible( true );
- }
-}
-
-void LLPanelMyProfileEdit::onClose(const LLSD& key)
-{
- if (LLAvatarNameCache::useDisplayNames())
- {
- LLFirstUse::setDisplayName(false);
- }
-}
-
-void LLPanelMyProfileEdit::processProperties(void* data, EAvatarProcessorType type)
-{
- if(APT_PROPERTIES == type)
- {
- const LLAvatarData* avatar_data = static_cast<const LLAvatarData*>(data);
- if(avatar_data && getAvatarId() == avatar_data->avatar_id)
- {
- // *TODO dzaporozhan
- // Workaround for ticket EXT-1099, waiting for fix for ticket EXT-1128
- enableEditing(true);
- processProfileProperties(avatar_data);
- LLAvatarPropertiesProcessor::getInstance()->removeObserver(getAvatarId(),this);
- }
- }
-}
-
-void LLPanelMyProfileEdit::processProfileProperties(const LLAvatarData* avatar_data)
-{
- fillCommonData(avatar_data);
-
- // 'Home page' was hidden in LLPanelAvatarProfile::fillCommonData() to fix EXT-4734
- // Show 'Home page' in Edit My Profile (EXT-4873)
- getChildView("homepage_edit")->setVisible( true);
-
- fillPartnerData(avatar_data);
-
- fillAccountStatus(avatar_data);
-
- getChild<LLUICtrl>("show_in_search_checkbox")->setValue((BOOL)(avatar_data->flags & AVATAR_ALLOW_PUBLISH));
-
- LLAvatarNameCache::get(avatar_data->avatar_id,
- boost::bind(&LLPanelMyProfileEdit::onNameCache, this, _1, _2));
-}
-
-void LLPanelMyProfileEdit::onNameCache(const LLUUID& agent_id, const LLAvatarName& av_name)
-{
- getChild<LLUICtrl>("user_name")->setValue( av_name.mDisplayName );
- getChild<LLUICtrl>("user_slid")->setValue( av_name.mUsername );
- getChild<LLUICtrl>("user_name_small")->setValue( av_name.mDisplayName );
- getChild<LLUICtrl>("solo_user_name")->setValue( av_name.mDisplayName );
-
-
- if (LLAvatarNameCache::useDisplayNames())
- {
- getChild<LLUICtrl>("user_label")->setVisible( true );
- getChild<LLUICtrl>("user_slid")->setVisible( true );
- getChild<LLUICtrl>("display_name_label")->setVisible( true );
- getChild<LLUICtrl>("set_name")->setVisible( true );
- getChild<LLUICtrl>("set_name")->setEnabled( true );
-
- getChild<LLUICtrl>("solo_user_name")->setVisible( false );
- getChild<LLUICtrl>("solo_username_label")->setVisible( false );
-
- // show smaller display name if too long to display in regular size
- if (getChild<LLTextBox>("user_name")->getTextPixelWidth() > getChild<LLTextBox>("user_name")->getRect().getWidth())
- {
- getChild<LLUICtrl>("user_name_small")->setVisible( true );
- getChild<LLUICtrl>("user_name")->setVisible( false );
- }
- else
- {
- getChild<LLUICtrl>("user_name_small")->setVisible( false );
- getChild<LLUICtrl>("user_name")->setVisible( true );
- }
- }
- else
- {
- getChild<LLUICtrl>("user_label")->setVisible( false );
- getChild<LLUICtrl>("user_slid")->setVisible( false );
- getChild<LLUICtrl>("display_name_label")->setVisible( false );
- getChild<LLUICtrl>("set_name")->setVisible( false );
- getChild<LLUICtrl>("set_name")->setEnabled( false );
-
- getChild<LLUICtrl>("solo_user_name")->setVisible( true );
- getChild<LLUICtrl>("user_name_small")->setVisible( false );
- getChild<LLUICtrl>("user_name")->setVisible( false );
- getChild<LLUICtrl>("solo_username_label")->setVisible( true );
- }
-}
-
-
-void LLPanelMyProfileEdit::onAvatarNameChanged()
-{
- LLAvatarNameCache::get(getAvatarId(),
- boost::bind(&LLPanelMyProfileEdit::onNameCache, this, _1, _2));
-}
-
-BOOL LLPanelMyProfileEdit::postBuild()
-{
- initTexturePickerMouseEvents();
-
- getChild<LLUICtrl>("partner_edit_link")->setTextArg("[URL]", getString("partner_edit_link_url"));
- getChild<LLUICtrl>("my_account_link")->setTextArg("[URL]", getString("my_account_link_url"));
-
- getChild<LLUICtrl>("set_name")->setCommitCallback(
- boost::bind(&LLPanelMyProfileEdit::onClickSetName, this));
-
- LLHints::registerHintTarget("set_display_name", getChild<LLUICtrl>("set_name")->getHandle());
- LLViewerDisplayName::addNameChangedCallback(boost::bind(&LLPanelMyProfileEdit::onAvatarNameChanged, this));
- return LLPanelAvatarProfile::postBuild();
-}
-/**
- * Inits map with texture picker and appropriate edit icon.
- * Sets callbacks of Mouse Enter and Mouse Leave signals of Texture Pickers
- */
-void LLPanelMyProfileEdit::initTexturePickerMouseEvents()
-{
- LLTextureCtrl* text_pic = getChild<LLTextureCtrl>(PICKER_SECOND_LIFE);
- LLIconCtrl* text_icon = getChild<LLIconCtrl>("2nd_life_edit_icon");
- mTextureEditIconMap[text_pic->getName()] = text_icon;
- text_pic->setMouseEnterCallback(boost::bind(&LLPanelMyProfileEdit::onTexturePickerMouseEnter, this, _1));
- text_pic->setMouseLeaveCallback(boost::bind(&LLPanelMyProfileEdit::onTexturePickerMouseLeave, this, _1));
- text_icon->setVisible(FALSE);
-
- text_pic = getChild<LLTextureCtrl>(PICKER_FIRST_LIFE);
- text_icon = getChild<LLIconCtrl>("real_world_edit_icon");
- mTextureEditIconMap[text_pic->getName()] = text_icon;
- text_pic->setMouseEnterCallback(boost::bind(&LLPanelMyProfileEdit::onTexturePickerMouseEnter, this, _1));
- text_pic->setMouseLeaveCallback(boost::bind(&LLPanelMyProfileEdit::onTexturePickerMouseLeave, this, _1));
- text_icon->setVisible(FALSE);
-}
-
-void LLPanelMyProfileEdit::resetData()
-{
- LLPanelMyProfile::resetData();
-
- //childSetTextArg("name_text", "[FIRST]", LLStringUtil::null);
- //childSetTextArg("name_text", "[LAST]", LLStringUtil::null);
- getChild<LLUICtrl>("user_name")->setValue( LLSD() );
- getChild<LLUICtrl>("user_slid")->setValue( LLSD() );
- getChild<LLUICtrl>("solo_user_name")->setValue( LLSD() );
- getChild<LLUICtrl>("user_name_small")->setValue( LLSD() );
-}
-
-void LLPanelMyProfileEdit::onTexturePickerMouseEnter(LLUICtrl* ctrl)
-{
- mTextureEditIconMap[ctrl->getName()]->setVisible(TRUE);
-}
-void LLPanelMyProfileEdit::onTexturePickerMouseLeave(LLUICtrl* ctrl)
-{
- mTextureEditIconMap[ctrl->getName()]->setVisible(FALSE);
-}
-
-void LLPanelMyProfileEdit::onClickSetName()
-{
- LLAvatarNameCache::get(getAvatarId(),
- boost::bind(&LLPanelMyProfileEdit::onAvatarNameCache,
- this, _1, _2));
-
- LLFirstUse::setDisplayName(false);
-}
-
-void LLPanelMyProfileEdit::onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name)
-{
- if (av_name.mDisplayName.empty())
- {
- // something is wrong, tell user to try again later
- LLNotificationsUtil::add("SetDisplayNameFailedGeneric");
- return;
- }
-
- llinfos << "name-change now " << LLDate::now() << " next_update "
- << LLDate(av_name.mNextUpdate) << llendl;
- F64 now_secs = LLDate::now().secondsSinceEpoch();
-
- if (now_secs < av_name.mNextUpdate)
- {
- // if the update time is more than a year in the future, it means updates have been blocked
- // show a more general message
- const int YEAR = 60*60*24*365;
- if (now_secs + YEAR < av_name.mNextUpdate)
- {
- LLNotificationsUtil::add("SetDisplayNameBlocked");
- return;
- }
- }
-
- LLFloaterReg::showInstance("display_name");
-}
-
-void LLPanelMyProfileEdit::enableEditing(bool enable)
-{
- getChildView("2nd_life_pic")->setEnabled(enable);
- getChildView("real_world_pic")->setEnabled(enable);
- getChildView("sl_description_edit")->setEnabled(enable);
- getChildView("fl_description_edit")->setEnabled(enable);
- getChildView("homepage_edit")->setEnabled(enable);
- getChildView("show_in_search_checkbox")->setEnabled(enable);
}
diff --git a/indra/newview/llpanelme.h b/indra/newview/llpanelme.h
index d5b2fee869..60e9d4317d 100644
--- a/indra/newview/llpanelme.h
+++ b/indra/newview/llpanelme.h
@@ -30,15 +30,9 @@
#include "llpanel.h"
#include "llpanelprofile.h"
-class LLAvatarName;
-class LLPanelMyProfileEdit;
-class LLPanelProfile;
-class LLIconCtrl;
-
/**
-* Panel for displaying Agent's profile, it consists of two sub panels - Profile
-* and Picks.
-* LLPanelMe allows user to edit his profile and picks.
+* Panel for displaying Agent's Picks and Classifieds panel.
+* LLPanelMe allows user to edit his picks and classifieds.
*/
class LLPanelMe : public LLPanelProfile
{
@@ -49,65 +43,8 @@ public:
LLPanelMe();
/*virtual*/ void onOpen(const LLSD& key);
- /*virtual*/ bool notifyChildren(const LLSD& info);
/*virtual*/ BOOL postBuild();
-
-private:
-
- void buildEditPanel();
-
- void onEditProfileClicked();
- void onSaveChangesClicked();
- void onCancelClicked();
-
- LLPanelMyProfileEdit * mEditPanel;
-
-};
-
-class LLPanelMyProfileEdit : public LLPanelMyProfile
-{
- LOG_CLASS(LLPanelMyProfileEdit);
-
-public:
-
- LLPanelMyProfileEdit();
-
- /*virtual*/void processProperties(void* data, EAvatarProcessorType type);
-
- /*virtual*/BOOL postBuild();
-
- /*virtual*/ void onOpen(const LLSD& key);
- /*virtual*/ void onClose(const LLSD& key);
-
- void onAvatarNameChanged();
-
-protected:
-
- /*virtual*/void resetData();
-
- void processProfileProperties(const LLAvatarData* avatar_data);
- void onNameCache(const LLUUID& agent_id, const LLAvatarName& av_name);
-
-private:
- void initTexturePickerMouseEvents();
- void onTexturePickerMouseEnter(LLUICtrl* ctrl);
- void onTexturePickerMouseLeave(LLUICtrl* ctrl);
- void onClickSetName();
- void onAvatarNameCache(const LLUUID& id, const LLAvatarName& av_name);
-
- /**
- * Enabled/disables controls to prevent overwriting edited data upon receiving
- * current data from server.
- */
- void enableEditing(bool enable);
-
-
-
-private:
- // map TexturePicker name => Edit Icon pointer should be visible while hovering Texture Picker
- typedef std::map<std::string, LLIconCtrl*> texture_edit_icon_map_t;
- texture_edit_icon_map_t mTextureEditIconMap;
};
#endif // LL_LLPANELMEPROFILE_H
diff --git a/indra/newview/llpanelnearbymedia.cpp b/indra/newview/llpanelnearbymedia.cpp
index fcc67d6840..c01adc3c35 100644
--- a/indra/newview/llpanelnearbymedia.cpp
+++ b/indra/newview/llpanelnearbymedia.cpp
@@ -52,6 +52,7 @@
#include "llvovolume.h"
#include "llstatusbar.h"
#include "llsdutil.h"
+#include "llvieweraudio.h"
#include "llfloaterreg.h"
#include "llfloaterpreference.h" // for the gear icon
@@ -356,7 +357,7 @@ void LLPanelNearByMedia::updateListItem(LLScrollListItem* item, LLViewerMediaImp
debug_str += llformat("%g/", (float)impl->getInterest());
// proximity distance is actually distance squared -- display it as straight distance.
- debug_str += llformat("%g/", fsqrtf(impl->getProximityDistance()));
+ debug_str += llformat("%g/", (F32) sqrt(impl->getProximityDistance()));
// s += llformat("%g/", (float)impl->getCPUUsage());
// s += llformat("%g/", (float)impl->getApproximateTextureInterest());
@@ -564,16 +565,14 @@ void LLPanelNearByMedia::refreshParcelItems()
if (NULL != mParcelMediaItem)
{
std::string name, url, tooltip;
- if (!LLViewerParcelMgr::getInstance()->getAgentParcel()->getObscureMedia())
+ getNameAndUrlHelper(LLViewerParcelMedia::getParcelMedia(), name, url, "");
+ if (name.empty() || name == url)
{
- getNameAndUrlHelper(LLViewerParcelMedia::getParcelMedia(), name, url, "");
- if (name.empty() || name == url)
- {
- tooltip = url;
- }
- else {
- tooltip = name + " : " + url;
- }
+ tooltip = url;
+ }
+ else
+ {
+ tooltip = name + " : " + url;
}
LLViewerMediaImpl *impl = LLViewerParcelMedia::getParcelMedia();
updateListItem(mParcelMediaItem,
@@ -611,10 +610,8 @@ void LLPanelNearByMedia::refreshParcelItems()
bool is_playing = LLViewerMedia::isParcelAudioPlaying();
std::string url;
- if (!LLViewerParcelMgr::getInstance()->getAgentParcel()->getObscureMusic())
- {
- url = LLViewerMedia::getParcelAudioURL();
- }
+ url = LLViewerMedia::getParcelAudioURL();
+
updateListItem(mParcelAudioItem,
mParcelAudioName,
url,
@@ -811,14 +808,26 @@ bool LLPanelNearByMedia::setDisabled(const LLUUID &row_id, bool disabled)
{
if (row_id == PARCEL_AUDIO_LIST_ITEM_UUID)
{
- if (disabled) onClickParcelAudioStop();
- else onClickParcelAudioStart();
+ if (disabled)
+ {
+ onClickParcelAudioStop();
+ }
+ else
+ {
+ onClickParcelAudioPlay();
+ }
return true;
}
else if (row_id == PARCEL_MEDIA_LIST_ITEM_UUID)
{
- if (disabled) onClickDisableParcelMedia();
- else onClickEnableParcelMedia();
+ if (disabled)
+ {
+ onClickDisableParcelMedia();
+ }
+ else
+ {
+ onClickEnableParcelMedia();
+ }
return true;
}
else {
@@ -861,24 +870,11 @@ void LLPanelNearByMedia::onClickParcelMediaPause()
LLViewerParcelMedia::pause();
}
-void LLPanelNearByMedia::onClickParcelAudioStart()
-{
- // User *explicitly* started the internet stream, so keep the stream
- // playing and updated as they cross to other parcels etc.
- mParcelAudioAutoStart = true;
-
- if (!gAudiop)
- return;
-
- gAudiop->startInternetStream(LLViewerMedia::getParcelAudioURL());
-}
-
void LLPanelNearByMedia::onClickParcelAudioPlay()
{
// User *explicitly* started the internet stream, so keep the stream
// playing and updated as they cross to other parcels etc.
mParcelAudioAutoStart = true;
-
if (!gAudiop)
return;
@@ -887,8 +883,9 @@ void LLPanelNearByMedia::onClickParcelAudioPlay()
// 'false' means unpause
gAudiop->pauseInternetStream(false);
}
- else {
- gAudiop->startInternetStream(LLViewerMedia::getParcelAudioURL());
+ else
+ {
+ LLViewerAudio::getInstance()->startInternetStreamWithAutoFade(LLViewerMedia::getParcelAudioURL());
}
}
@@ -898,11 +895,10 @@ void LLPanelNearByMedia::onClickParcelAudioStop()
// re-start audio when i.e. they move to another parcel, until
// they explicitly start it again.
mParcelAudioAutoStart = false;
-
if (!gAudiop)
return;
- gAudiop->stopInternetStream();
+ LLViewerAudio::getInstance()->stopInternetStreamWithAutoFade();
}
void LLPanelNearByMedia::onClickParcelAudioPause()
@@ -958,7 +954,7 @@ void LLPanelNearByMedia::onAdvancedButtonClick()
void LLPanelNearByMedia::onMoreLess()
{
- bool is_more = getChild<LLUICtrl>("more_btn")->getVisible();
+ bool is_more = getChild<LLButton>("more_btn")->getToggleState();
mNearbyMediaPanel->setVisible(is_more);
// enable resizing when expanded
@@ -969,8 +965,7 @@ void LLPanelNearByMedia::onMoreLess()
setShape(new_rect);
- getChild<LLUICtrl>("more_btn")->setVisible(!is_more);
- getChild<LLUICtrl>("less_btn")->setVisible(is_more);
+ getChild<LLUICtrl>("more_btn")->setVisible(true);
}
void LLPanelNearByMedia::updateControls()
diff --git a/indra/newview/llpanelnearbymedia.h b/indra/newview/llpanelnearbymedia.h
index be4d313743..c3634de9b4 100644
--- a/indra/newview/llpanelnearbymedia.h
+++ b/indra/newview/llpanelnearbymedia.h
@@ -115,7 +115,6 @@ private:
void onClickParcelMediaPause();
void onClickParcelAudioPlay();
void onClickParcelAudioStop();
- void onClickParcelAudioStart();
void onClickParcelAudioPause();
void onCheckAutoPlay();
void onAdvancedButtonClick();
diff --git a/indra/newview/llpanelobject.cpp b/indra/newview/llpanelobject.cpp
index a0c320ba19..1f77e7a602 100644
--- a/indra/newview/llpanelobject.cpp
+++ b/indra/newview/llpanelobject.cpp
@@ -33,16 +33,15 @@
#include "lleconomy.h"
#include "llerror.h"
#include "llfontgl.h"
-#include "llmaterialtable.h"
#include "llpermissionsflags.h"
#include "llstring.h"
#include "llvolume.h"
-#include "material_codes.h"
#include "m3math.h"
// project includes
#include "llagent.h"
#include "llbutton.h"
+#include "llcalc.h"
#include "llcheckboxctrl.h"
#include "llcolorswatch.h"
#include "llcombobox.h"
@@ -57,7 +56,6 @@
#include "lltool.h"
#include "lltoolcomp.h"
#include "lltoolmgr.h"
-#include "lltrans.h"
#include "llui.h"
#include "llviewerobject.h"
#include "llviewerregion.h"
@@ -101,17 +99,6 @@ BOOL LLPanelObject::postBuild()
{
setMouseOpaque(FALSE);
- std::map<std::string, std::string> material_name_map;
- material_name_map["Stone"]= LLTrans::getString("Stone");
- material_name_map["Metal"]= LLTrans::getString("Metal");
- material_name_map["Glass"]= LLTrans::getString("Glass");
- material_name_map["Wood"]= LLTrans::getString("Wood");
- material_name_map["Flesh"]= LLTrans::getString("Flesh");
- material_name_map["Plastic"]= LLTrans::getString("Plastic");
- material_name_map["Rubber"]= LLTrans::getString("Rubber");
- material_name_map["Light"]= LLTrans::getString("Light");
-
- LLMaterialTable::basic.initTableTransNames(material_name_map);
//--------------------------------------------------------
// Top
//--------------------------------------------------------
@@ -131,7 +118,8 @@ BOOL LLPanelObject::postBuild()
// Phantom checkbox
mCheckPhantom = getChild<LLCheckBoxCtrl>("Phantom Checkbox Ctrl");
childSetCommitCallback("Phantom Checkbox Ctrl",onCommitPhantom,this);
-
+
+
// Position
mLabelPosition = getChild<LLTextBox>("label position");
mCtrlPosX = getChild<LLSpinCtrl>("Pos X");
@@ -165,22 +153,6 @@ BOOL LLPanelObject::postBuild()
//--------------------------------------------------------
- // material type popup
- mComboMaterial = getChild<LLComboBox>("material");
- childSetCommitCallback("material",onCommitMaterial,this);
- mComboMaterial->removeall();
-
- for (LLMaterialTable::info_list_t::iterator iter = LLMaterialTable::basic.mMaterialInfoList.begin();
- iter != LLMaterialTable::basic.mMaterialInfoList.end(); ++iter)
- {
- LLMaterialInfo* minfop = *iter;
- if (minfop->mMCode != LL_MCODE_LIGHT)
- {
- mComboMaterial->add(minfop->mName);
- }
- }
- mComboMaterialItemCount = mComboMaterial->getItemCount();
-
// Base Type
mComboBaseType = getChild<LLComboBox>("comboBaseType");
childSetCommitCallback("comboBaseType",onCommitParametric,this);
@@ -308,7 +280,6 @@ BOOL LLPanelObject::postBuild()
LLPanelObject::LLPanelObject()
: LLPanel(),
- mComboMaterialItemCount(0),
mIsPhysical(FALSE),
mIsTemporary(FALSE),
mIsPhantom(FALSE),
@@ -348,6 +319,8 @@ void LLPanelObject::getState( )
}
}
+ LLCalc* calcp = LLCalc::getInstance();
+
LLVOVolume *volobjp = NULL;
if ( objectp && (objectp->getPCode() == LL_PCODE_VOLUME))
{
@@ -364,6 +337,7 @@ void LLPanelObject::getState( )
// Disable all text input fields
clearCtrls();
+ calcp->clearAllVariables();
return;
}
@@ -390,12 +364,18 @@ void LLPanelObject::getState( )
mCtrlPosX->set( vec.mV[VX] );
mCtrlPosY->set( vec.mV[VY] );
mCtrlPosZ->set( vec.mV[VZ] );
+ calcp->setVar(LLCalc::X_POS, vec.mV[VX]);
+ calcp->setVar(LLCalc::Y_POS, vec.mV[VY]);
+ calcp->setVar(LLCalc::Z_POS, vec.mV[VZ]);
}
else
{
mCtrlPosX->clear();
mCtrlPosY->clear();
mCtrlPosZ->clear();
+ calcp->clearVar(LLCalc::X_POS);
+ calcp->clearVar(LLCalc::Y_POS);
+ calcp->clearVar(LLCalc::Z_POS);
}
@@ -410,12 +390,18 @@ void LLPanelObject::getState( )
mCtrlScaleX->set( vec.mV[VX] );
mCtrlScaleY->set( vec.mV[VY] );
mCtrlScaleZ->set( vec.mV[VZ] );
+ calcp->setVar(LLCalc::X_SCALE, vec.mV[VX]);
+ calcp->setVar(LLCalc::Y_SCALE, vec.mV[VY]);
+ calcp->setVar(LLCalc::Z_SCALE, vec.mV[VZ]);
}
else
{
mCtrlScaleX->clear();
mCtrlScaleY->clear();
mCtrlScaleZ->clear();
+ calcp->setVar(LLCalc::X_SCALE, 0.f);
+ calcp->setVar(LLCalc::Y_SCALE, 0.f);
+ calcp->setVar(LLCalc::Z_SCALE, 0.f);
}
mLabelSize->setEnabled( enable_scale );
@@ -435,12 +421,18 @@ void LLPanelObject::getState( )
mCtrlRotX->set( mCurEulerDegrees.mV[VX] );
mCtrlRotY->set( mCurEulerDegrees.mV[VY] );
mCtrlRotZ->set( mCurEulerDegrees.mV[VZ] );
+ calcp->setVar(LLCalc::X_ROT, mCurEulerDegrees.mV[VX]);
+ calcp->setVar(LLCalc::Y_ROT, mCurEulerDegrees.mV[VY]);
+ calcp->setVar(LLCalc::Z_ROT, mCurEulerDegrees.mV[VZ]);
}
else
{
mCtrlRotX->clear();
mCtrlRotY->clear();
mCtrlRotZ->clear();
+ calcp->clearVar(LLCalc::X_ROT);
+ calcp->clearVar(LLCalc::Y_ROT);
+ calcp->clearVar(LLCalc::Z_ROT);
}
mLabelRotation->setEnabled( enable_rotate );
@@ -519,49 +511,13 @@ void LLPanelObject::getState( )
mCheckPhantom->set( mIsPhantom );
mCheckPhantom->setEnabled( roots_selected>0 && editable && !is_flexible );
+
#if 0 // 1.9.2
mCastShadows = root_objectp->flagCastShadows();
mCheckCastShadows->set( mCastShadows );
mCheckCastShadows->setEnabled( roots_selected==1 && editable );
#endif
- // Update material part
- // slightly inefficient - materials are unique per object, not per TE
- U8 material_code = 0;
- struct f : public LLSelectedTEGetFunctor<U8>
- {
- U8 get(LLViewerObject* object, S32 te)
- {
- return object->getMaterial();
- }
- } func;
- bool material_same = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func, material_code );
- std::string LEGACY_FULLBRIGHT_DESC = LLTrans::getString("Fullbright");
- if (editable && single_volume && material_same)
- {
- mComboMaterial->setEnabled( TRUE );
- if (material_code == LL_MCODE_LIGHT)
- {
- if (mComboMaterial->getItemCount() == mComboMaterialItemCount)
- {
- mComboMaterial->add(LEGACY_FULLBRIGHT_DESC);
- }
- mComboMaterial->setSimple(LEGACY_FULLBRIGHT_DESC);
- }
- else
- {
- if (mComboMaterial->getItemCount() != mComboMaterialItemCount)
- {
- mComboMaterial->remove(LEGACY_FULLBRIGHT_DESC);
- }
-
- mComboMaterial->setSimple(std::string(LLMaterialTable::basic.getName(material_code)));
- }
- }
- else
- {
- mComboMaterial->setEnabled( FALSE );
- }
//----------------------------------------------------------------------------
S32 selected_item = MI_BOX;
@@ -569,6 +525,7 @@ void LLPanelObject::getState( )
BOOL enabled = FALSE;
BOOL hole_enabled = FALSE;
F32 scale_x=1.f, scale_y=1.f;
+ BOOL isMesh = FALSE;
if( !objectp || !objectp->getVolume() || !editable || !single_volume)
{
@@ -599,10 +556,9 @@ void LLPanelObject::getState( )
// Only allowed to change these parameters for objects
// that you have permissions on AND are not attachments.
enabled = root_objectp->permModify();
-
- const LLVolumeParams &volume_params = objectp->getVolume()->getParams();
-
+
// Volume type
+ const LLVolumeParams &volume_params = objectp->getVolume()->getParams();
U8 path = volume_params.getPathParams().getCurveType();
U8 profile_and_hole = volume_params.getProfileParams().getCurveType();
U8 profile = profile_and_hole & LL_PCODE_PROFILE_MASK;
@@ -691,9 +647,9 @@ void LLPanelObject::getState( )
F32 end_t = volume_params.getEndT();
// Hollowness
- F32 hollow = volume_params.getHollow();
- mSpinHollow->set( 100.f * hollow );
-
+ F32 hollow = 100.f * volume_params.getHollow();
+ mSpinHollow->set( hollow );
+ calcp->setVar(LLCalc::HOLLOW, hollow);
// All hollow objects allow a shape to be selected.
if (hollow > 0.f)
{
@@ -745,6 +701,10 @@ void LLPanelObject::getState( )
mSpinCutEnd ->set( cut_end );
mCtrlPathBegin ->set( adv_cut_begin );
mCtrlPathEnd ->set( adv_cut_end );
+ calcp->setVar(LLCalc::CUT_BEGIN, cut_begin);
+ calcp->setVar(LLCalc::CUT_END, cut_end);
+ calcp->setVar(LLCalc::PATH_BEGIN, adv_cut_begin);
+ calcp->setVar(LLCalc::PATH_END, adv_cut_end);
// Twist
F32 twist = volume_params.getTwist();
@@ -763,18 +723,24 @@ void LLPanelObject::getState( )
mSpinTwist ->set( twist );
mSpinTwistBegin ->set( twist_begin );
+ calcp->setVar(LLCalc::TWIST_END, twist);
+ calcp->setVar(LLCalc::TWIST_BEGIN, twist_begin);
// Shear
F32 shear_x = volume_params.getShearX();
F32 shear_y = volume_params.getShearY();
mSpinShearX->set( shear_x );
mSpinShearY->set( shear_y );
+ calcp->setVar(LLCalc::X_SHEAR, shear_x);
+ calcp->setVar(LLCalc::Y_SHEAR, shear_y);
// Taper
F32 taper_x = volume_params.getTaperX();
F32 taper_y = volume_params.getTaperY();
mSpinTaperX->set( taper_x );
mSpinTaperY->set( taper_y );
+ calcp->setVar(LLCalc::X_TAPER, taper_x);
+ calcp->setVar(LLCalc::Y_TAPER, taper_y);
// Radius offset.
F32 radius_offset = volume_params.getRadiusOffset();
@@ -804,10 +770,12 @@ void LLPanelObject::getState( )
}
}
mSpinRadiusOffset->set( radius_offset);
+ calcp->setVar(LLCalc::RADIUS_OFFSET, radius_offset);
// Revolutions
F32 revolutions = volume_params.getRevolutions();
mSpinRevolutions->set( revolutions );
+ calcp->setVar(LLCalc::REVOLUTIONS, revolutions);
// Skew
F32 skew = volume_params.getSkew();
@@ -832,8 +800,9 @@ void LLPanelObject::getState( )
}
}
mSpinSkew->set( skew );
+ calcp->setVar(LLCalc::SKEW, skew);
}
-
+
// Compute control visibility, label names, and twist range.
// Start with defaults.
BOOL cut_visible = TRUE;
@@ -935,6 +904,8 @@ void LLPanelObject::getState( )
case MI_RING:
mSpinScaleX->set( scale_x );
mSpinScaleY->set( scale_y );
+ calcp->setVar(LLCalc::X_HOLE, scale_x);
+ calcp->setVar(LLCalc::Y_HOLE, scale_y);
mSpinScaleX->setMinValue(OBJECT_MIN_HOLE_SIZE);
mSpinScaleX->setMaxValue(OBJECT_MAX_HOLE_SIZE_X);
mSpinScaleY->setMinValue(OBJECT_MIN_HOLE_SIZE);
@@ -949,6 +920,14 @@ void LLPanelObject::getState( )
mSpinScaleX->setMaxValue(1.f);
mSpinScaleY->setMinValue(-1.f);
mSpinScaleY->setMaxValue(1.f);
+
+ // Torus' Hole Size is Box/Cyl/Prism's Taper
+ calcp->setVar(LLCalc::X_TAPER, 1.f - scale_x);
+ calcp->setVar(LLCalc::Y_TAPER, 1.f - scale_y);
+
+ // Box/Cyl/Prism have no hole size
+ calcp->setVar(LLCalc::X_HOLE, 0.f);
+ calcp->setVar(LLCalc::Y_HOLE, 0.f);
}
break;
}
@@ -1093,15 +1072,14 @@ void LLPanelObject::getState( )
mCtrlSculptTexture->setVisible(sculpt_texture_visible);
mLabelSculptType->setVisible(sculpt_texture_visible);
mCtrlSculptType->setVisible(sculpt_texture_visible);
- mCtrlSculptMirror->setVisible(sculpt_texture_visible);
- mCtrlSculptInvert->setVisible(sculpt_texture_visible);
// sculpt texture
-
if (selected_item == MI_SCULPT)
{
- LLUUID id;
+
+
+ LLUUID id;
LLSculptParams *sculpt_params = (LLSculptParams *)objectp->getParameterEntry(LLNetworkData::PARAMS_SCULPT);
@@ -1113,32 +1091,44 @@ void LLPanelObject::getState( )
mSculptTypeRevert = sculpt_params->getSculptType();
}
+ U8 sculpt_type = sculpt_params->getSculptType();
+ U8 sculpt_stitching = sculpt_type & LL_SCULPT_TYPE_MASK;
+ BOOL sculpt_invert = sculpt_type & LL_SCULPT_FLAG_INVERT;
+ BOOL sculpt_mirror = sculpt_type & LL_SCULPT_FLAG_MIRROR;
+ isMesh = (sculpt_stitching == LL_SCULPT_TYPE_MESH);
+
LLTextureCtrl* mTextureCtrl = getChild<LLTextureCtrl>("sculpt texture control");
if(mTextureCtrl)
{
mTextureCtrl->setTentative(FALSE);
- mTextureCtrl->setEnabled(editable);
+ mTextureCtrl->setEnabled(editable && !isMesh);
if (editable)
mTextureCtrl->setImageAssetID(sculpt_params->getSculptTexture());
else
mTextureCtrl->setImageAssetID(LLUUID::null);
}
- U8 sculpt_type = sculpt_params->getSculptType();
- U8 sculpt_stitching = sculpt_type & LL_SCULPT_TYPE_MASK;
- BOOL sculpt_invert = sculpt_type & LL_SCULPT_FLAG_INVERT;
- BOOL sculpt_mirror = sculpt_type & LL_SCULPT_FLAG_MIRROR;
+ mComboBaseType->setEnabled(!isMesh);
if (mCtrlSculptType)
{
- mCtrlSculptType->setCurrentByIndex(sculpt_stitching);
- mCtrlSculptType->setEnabled(editable);
+ if (sculpt_stitching == LL_SCULPT_TYPE_NONE)
+ {
+ // since 'None' is no longer an option in the combo box
+ // use 'Plane' as an equivalent sculpt type
+ mCtrlSculptType->setSelectedByValue(LLSD(LL_SCULPT_TYPE_PLANE), true);
+ }
+ else
+ {
+ mCtrlSculptType->setSelectedByValue(LLSD(sculpt_stitching), true);
+ }
+ mCtrlSculptType->setEnabled(editable && !isMesh);
}
if (mCtrlSculptMirror)
{
mCtrlSculptMirror->set(sculpt_mirror);
- mCtrlSculptMirror->setEnabled(editable);
+ mCtrlSculptMirror->setEnabled(editable && !isMesh);
}
if (mCtrlSculptInvert)
@@ -1151,14 +1141,17 @@ void LLPanelObject::getState( )
{
mLabelSculptType->setEnabled(TRUE);
}
+
}
}
else
{
- mSculptTextureRevert = LLUUID::null;
+ mSculptTextureRevert = LLUUID::null;
}
-
+ mCtrlSculptMirror->setVisible(sculpt_texture_visible && !isMesh);
+ mCtrlSculptInvert->setVisible(sculpt_texture_visible && !isMesh);
+
//----------------------------------------------------------------------------
mObject = objectp;
@@ -1238,25 +1231,6 @@ void LLPanelObject::sendCastShadows()
}
// static
-void LLPanelObject::onCommitMaterial( LLUICtrl* ctrl, void* userdata )
-{
- //LLPanelObject* self = (LLPanelObject*) userdata;
- LLComboBox* box = (LLComboBox*) ctrl;
-
- if (box)
- {
- // apply the currently selected material to the object
- const std::string& material_name = box->getSimple();
- std::string LEGACY_FULLBRIGHT_DESC = LLTrans::getString("Fullbright");
- if (material_name != LEGACY_FULLBRIGHT_DESC)
- {
- U8 material_code = LLMaterialTable::basic.getMCode(material_name);
- LLSelectMgr::getInstance()->selectionSetMaterial(material_code);
- }
- }
-}
-
-// static
void LLPanelObject::onCommitParametric( LLUICtrl* ctrl, void* userdata )
{
LLPanelObject* self = (LLPanelObject*) userdata;
@@ -1784,8 +1758,19 @@ void LLPanelObject::sendSculpt()
U8 sculpt_type = 0;
if (mCtrlSculptType)
- sculpt_type |= mCtrlSculptType->getCurrentIndex();
+ sculpt_type |= mCtrlSculptType->getValue().asInteger();
+ bool enabled = sculpt_type != LL_SCULPT_TYPE_MESH;
+
+ if (mCtrlSculptMirror)
+ {
+ mCtrlSculptMirror->setEnabled(enabled ? TRUE : FALSE);
+ }
+ if (mCtrlSculptInvert)
+ {
+ mCtrlSculptInvert->setEnabled(enabled ? TRUE : FALSE);
+ }
+
if ((mCtrlSculptMirror) && (mCtrlSculptMirror->get()))
sculpt_type |= LL_SCULPT_FLAG_MIRROR;
@@ -1808,6 +1793,12 @@ void LLPanelObject::refresh()
{
mRootObject = NULL;
}
+
+ F32 max_scale = get_default_max_prim_scale(LLPickInfo::isFlora(mObject));
+
+ getChild<LLSpinCtrl>("Scale X")->setMaxValue(max_scale);
+ getChild<LLSpinCtrl>("Scale Y")->setMaxValue(max_scale);
+ getChild<LLSpinCtrl>("Scale Z")->setMaxValue(max_scale);
}
@@ -1894,11 +1885,11 @@ void LLPanelObject::clearCtrls()
mCheckTemporary ->setEnabled( FALSE );
mCheckPhantom ->set(FALSE);
mCheckPhantom ->setEnabled( FALSE );
+
#if 0 // 1.9.2
mCheckCastShadows->set(FALSE);
mCheckCastShadows->setEnabled( FALSE );
#endif
- mComboMaterial ->setEnabled( FALSE );
// Disable text labels
mLabelPosition ->setEnabled( FALSE );
mLabelSize ->setEnabled( FALSE );
diff --git a/indra/newview/llpanelobject.h b/indra/newview/llpanelobject.h
index e07bf007ec..475dfdaedb 100644
--- a/indra/newview/llpanelobject.h
+++ b/indra/newview/llpanelobject.h
@@ -62,14 +62,13 @@ public:
static void onCommitPosition( LLUICtrl* ctrl, void* userdata);
static void onCommitScale( LLUICtrl* ctrl, void* userdata);
static void onCommitRotation( LLUICtrl* ctrl, void* userdata);
- static void onCommitPhysics( LLUICtrl* ctrl, void* userdata);
static void onCommitTemporary( LLUICtrl* ctrl, void* userdata);
static void onCommitPhantom( LLUICtrl* ctrl, void* userdata);
static void onCommitCastShadows( LLUICtrl* ctrl, void* userdata);
+ static void onCommitPhysics( LLUICtrl* ctrl, void* userdata);
static void onCommitParametric(LLUICtrl* ctrl, void* userdata);
- static void onCommitMaterial( LLUICtrl* ctrl, void* userdata);
void onCommitSculpt(const LLSD& data);
void onCancelSculpt(const LLSD& data);
@@ -87,16 +86,13 @@ protected:
void sendIsPhysical();
void sendIsTemporary();
void sendIsPhantom();
+
void sendCastShadows();
void sendSculpt();
void getVolumeParams(LLVolumeParams& volume_params);
protected:
- S32 mComboMaterialItemCount;
-
- LLComboBox* mComboMaterial;
-
// Per-object options
LLComboBox* mComboBaseType;
diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp
index 211b9cf4b1..1ca24f3031 100644
--- a/indra/newview/llpanelobjectinventory.cpp
+++ b/indra/newview/llpanelobjectinventory.cpp
@@ -44,6 +44,7 @@
#include "llcallbacklist.h"
#include "llbuycurrencyhtml.h"
#include "llfloaterreg.h"
+#include "llfolderview.h"
#include "llinventorybridge.h"
#include "llinventorydefines.h"
#include "llinventoryfilter.h"
@@ -56,10 +57,11 @@
#include "llpreviewtexture.h"
#include "llscrollcontainer.h"
#include "llselectmgr.h"
-#include "llsidetray.h"
#include "llstatusbar.h"
+#include "lltooldraganddrop.h"
#include "lltrans.h"
#include "llviewerassettype.h"
+#include "llviewerinventory.h"
#include "llviewerregion.h"
#include "llviewerobjectlist.h"
#include "llviewermessage.h"
@@ -80,6 +82,7 @@ protected:
LLAssetType::EType mAssetType;
LLInventoryType::EType mInventoryType;
+ LLInventoryObject* findInvObject() const;
LLInventoryItem* findItem() const;
public:
@@ -121,7 +124,7 @@ public:
virtual void move(LLFolderViewEventListener* parent_listener);
virtual BOOL isItemCopyable() const;
virtual BOOL copyToClipboard() const;
- virtual void cutToClipboard();
+ virtual BOOL cutToClipboard() const;
virtual BOOL isClipboardPasteable() const;
virtual void pasteFromClipboard();
virtual void pasteLinkFromClipboard();
@@ -136,7 +139,8 @@ public:
virtual BOOL startDrag(EDragAndDropType* type, LLUUID* id) const;
virtual BOOL dragOrDrop(MASK mask, BOOL drop,
EDragAndDropType cargo_type,
- void* cargo_data);
+ void* cargo_data,
+ std::string& tooltip_msg);
};
LLTaskInvFVBridge::LLTaskInvFVBridge(
@@ -159,16 +163,22 @@ LLTaskInvFVBridge::LLTaskInvFVBridge(
}
}
-LLInventoryItem* LLTaskInvFVBridge::findItem() const
+LLInventoryObject* LLTaskInvFVBridge::findInvObject() const
{
LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID());
- if(object)
+ if (object)
{
- return dynamic_cast<LLInventoryItem*>(object->getInventoryObject(mUUID));
+ return object->getInventoryObject(mUUID);
}
return NULL;
}
+
+LLInventoryItem* LLTaskInvFVBridge::findItem() const
+{
+ return dynamic_cast<LLInventoryItem*>(findInvObject());
+}
+
void LLTaskInvFVBridge::showProperties()
{
show_task_item_profile(mUUID, mPanel->getTaskUUID());
@@ -292,21 +302,15 @@ const std::string& LLTaskInvFVBridge::getDisplayName() const
if(item)
{
- if(item->getParentUUID().isNull())
- {
- if(item->getName() == "Contents")
- {
- mDisplayName.assign(LLTrans::getString("ViewerObjectContents"));
- }
- else
- {
- mDisplayName.assign(item->getName());
- }
- }
- else
+ mDisplayName.assign(item->getName());
+
+ // Localize "New Script", "New Script 1", "New Script 2", etc.
+ if (item->getType() == LLAssetType::AT_LSL_TEXT &&
+ LLStringUtil::startsWith(item->getName(), "New Script"))
{
- mDisplayName.assign(item->getName());
+ LLStringUtil::replaceString(mDisplayName, "New Script", LLTrans::getString("PanelContentsNewScript"));
}
+
const LLPermissions& perm(item->getPermissions());
BOOL copy = gAgent.allowOperation(PERM_COPY, perm, GP_OBJECT_MANIPULATE);
BOOL mod = gAgent.allowOperation(PERM_MODIFY, perm, GP_OBJECT_MANIPULATE);
@@ -520,8 +524,9 @@ BOOL LLTaskInvFVBridge::copyToClipboard() const
return FALSE;
}
-void LLTaskInvFVBridge::cutToClipboard()
+BOOL LLTaskInvFVBridge::cutToClipboard() const
{
+ return FALSE;
}
BOOL LLTaskInvFVBridge::isClipboardPasteable() const
@@ -577,7 +582,8 @@ BOOL LLTaskInvFVBridge::startDrag(EDragAndDropType* type, LLUUID* id) const
BOOL LLTaskInvFVBridge::dragOrDrop(MASK mask, BOOL drop,
EDragAndDropType cargo_type,
- void* cargo_data)
+ void* cargo_data,
+ std::string& tooltip_msg)
{
//llinfos << "LLTaskInvFVBridge::dragOrDrop()" << llendl;
return FALSE;
@@ -697,7 +703,7 @@ public:
const std::string& name);
virtual LLUIImagePtr getIcon() const;
- virtual const std::string& getDisplayName() const { return getName(); }
+ virtual const std::string& getDisplayName() const;
virtual BOOL isItemRenameable() const;
// virtual BOOL isItemCopyable() const { return FALSE; }
virtual BOOL renameItem(const std::string& new_name);
@@ -707,7 +713,8 @@ public:
virtual BOOL startDrag(EDragAndDropType* type, LLUUID* id) const;
virtual BOOL dragOrDrop(MASK mask, BOOL drop,
EDragAndDropType cargo_type,
- void* cargo_data);
+ void* cargo_data,
+ std::string& tooltip_msg);
virtual BOOL canOpenItem() const { return TRUE; }
virtual void openItem();
};
@@ -725,6 +732,27 @@ LLUIImagePtr LLTaskCategoryBridge::getIcon() const
return LLUI::getUIImage("Inv_FolderClosed");
}
+// virtual
+const std::string& LLTaskCategoryBridge::getDisplayName() const
+{
+ LLInventoryObject* cat = findInvObject();
+
+ if (cat)
+ {
+ // Localize "Contents" folder.
+ if (cat->getParentUUID().isNull() && cat->getName() == "Contents")
+ {
+ mDisplayName.assign(LLTrans::getString("ViewerObjectContents"));
+ }
+ else
+ {
+ mDisplayName.assign(cat->getName());
+ }
+ }
+
+ return mDisplayName;
+}
+
BOOL LLTaskCategoryBridge::isItemRenameable() const
{
return FALSE;
@@ -761,27 +789,17 @@ void LLTaskCategoryBridge::openItem()
BOOL LLTaskCategoryBridge::startDrag(EDragAndDropType* type, LLUUID* id) const
{
//llinfos << "LLTaskInvFVBridge::startDrag()" << llendl;
- if(mPanel)
+ if(mPanel && mUUID.notNull())
{
LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID());
if(object)
{
- const LLInventoryItem *inv = dynamic_cast<LLInventoryItem*>(object->getInventoryObject(mUUID));
- if (inv)
+ const LLInventoryObject* cat = object->getInventoryObject(mUUID);
+ if ( (cat) && (move_inv_category_world_to_agent(mUUID, LLUUID::null, FALSE)) )
{
- const LLPermissions& perm = inv->getPermissions();
- bool can_copy = gAgent.allowOperation(PERM_COPY, perm,
- GP_OBJECT_MANIPULATE);
- if((can_copy && perm.allowTransferTo(gAgent.getID()))
- || object->permYouOwner())
-// || gAgent.isGodlike())
-
- {
- *type = LLViewerAssetType::lookupDragAndDropType(inv->getType());
-
- *id = inv->getUUID();
- return TRUE;
- }
+ *type = LLViewerAssetType::lookupDragAndDropType(cat->getType());
+ *id = mUUID;
+ return TRUE;
}
}
}
@@ -790,7 +808,8 @@ BOOL LLTaskCategoryBridge::startDrag(EDragAndDropType* type, LLUUID* id) const
BOOL LLTaskCategoryBridge::dragOrDrop(MASK mask, BOOL drop,
EDragAndDropType cargo_type,
- void* cargo_data)
+ void* cargo_data,
+ std::string& tooltip_msg)
{
//llinfos << "LLTaskCategoryBridge::dragOrDrop()" << llendl;
BOOL accept = FALSE;
@@ -812,6 +831,7 @@ BOOL LLTaskCategoryBridge::dragOrDrop(MASK mask, BOOL drop,
case DAD_ANIMATION:
case DAD_GESTURE:
case DAD_CALLINGCARD:
+ case DAD_MESH:
accept = LLToolDragAndDrop::isInventoryDropAcceptable(object, (LLViewerInventoryItem*)cargo_data);
if(accept && drop)
{
@@ -1237,6 +1257,116 @@ LLUIImagePtr LLTaskWearableBridge::getIcon() const
return LLInventoryIcon::getIcon(mAssetType, mInventoryType, mFlags, FALSE );
}
+///----------------------------------------------------------------------------
+/// Class LLTaskMeshBridge
+///----------------------------------------------------------------------------
+
+class LLTaskMeshBridge : public LLTaskInvFVBridge
+{
+public:
+ LLTaskMeshBridge(
+ LLPanelObjectInventory* panel,
+ const LLUUID& uuid,
+ const std::string& name);
+
+ virtual LLUIImagePtr getIcon() const;
+ virtual void openItem();
+ virtual void performAction(LLInventoryModel* model, std::string action);
+ virtual void buildContextMenu(LLMenuGL& menu, U32 flags);
+};
+
+LLTaskMeshBridge::LLTaskMeshBridge(
+ LLPanelObjectInventory* panel,
+ const LLUUID& uuid,
+ const std::string& name) :
+ LLTaskInvFVBridge(panel, uuid, name)
+{
+}
+
+LLUIImagePtr LLTaskMeshBridge::getIcon() const
+{
+ return LLInventoryIcon::getIcon(LLAssetType::AT_MESH, LLInventoryType::IT_MESH, 0, FALSE);
+}
+
+void LLTaskMeshBridge::openItem()
+{
+ // open mesh
+}
+
+
+// virtual
+void LLTaskMeshBridge::performAction(LLInventoryModel* model, std::string action)
+{
+ if (action == "mesh action")
+ {
+ LLInventoryItem* item = findItem();
+ if(item)
+ {
+ // do action
+ }
+ }
+ LLTaskInvFVBridge::performAction(model, action);
+}
+
+void LLTaskMeshBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
+{
+ LLInventoryItem* item = findItem();
+ if(!item) return;
+ std::vector<std::string> items;
+ std::vector<std::string> disabled_items;
+
+ if(item->getPermissions().getOwner() != gAgent.getID()
+ && item->getSaleInfo().isForSale())
+ {
+ items.push_back(std::string("Task Buy"));
+
+ std::string label= LLTrans::getString("Buy");
+ // Check the price of the item.
+ S32 price = getPrice();
+ if (-1 == price)
+ {
+ llwarns << "label_buy_task_bridged_item: Invalid price" << llendl;
+ }
+ else
+ {
+ std::ostringstream info;
+ info << LLTrans::getString("BuyforL$") << price;
+ label.assign(info.str());
+ }
+
+ const LLView::child_list_t *list = menu.getChildList();
+ LLView::child_list_t::const_iterator itor;
+ for (itor = list->begin(); itor != list->end(); ++itor)
+ {
+ std::string name = (*itor)->getName();
+ LLMenuItemCallGL* menu_itemp = dynamic_cast<LLMenuItemCallGL*>(*itor);
+ if (name == "Task Buy" && menu_itemp)
+ {
+ menu_itemp->setLabel(label);
+ }
+ }
+ }
+ else
+ {
+ items.push_back(std::string("Task Open"));
+ if (!isItemCopyable())
+ {
+ disabled_items.push_back(std::string("Task Open"));
+ }
+ }
+ items.push_back(std::string("Task Properties"));
+ if(isItemRenameable())
+ {
+ items.push_back(std::string("Task Rename"));
+ }
+ if(isItemRemovable())
+ {
+ items.push_back(std::string("Task Remove"));
+ }
+
+
+ hide_context_entries(menu, items, disabled_items);
+}
///----------------------------------------------------------------------------
/// LLTaskInvFVBridge impl
@@ -1248,74 +1378,81 @@ LLTaskInvFVBridge* LLTaskInvFVBridge::createObjectBridge(LLPanelObjectInventory*
LLTaskInvFVBridge* new_bridge = NULL;
const LLInventoryItem* item = dynamic_cast<LLInventoryItem*>(object);
const U32 itemflags = ( NULL == item ? 0 : item->getFlags() );
- LLAssetType::EType type = object->getType();
+ LLAssetType::EType type = object ? object->getType() : LLAssetType::AT_CATEGORY;
+ LLUUID object_id = object ? object->getUUID() : LLUUID::null;
+ std::string object_name = object ? object->getName() : std::string();
switch(type)
{
case LLAssetType::AT_TEXTURE:
new_bridge = new LLTaskTextureBridge(panel,
- object->getUUID(),
- object->getName());
+ object_id,
+ object_name);
break;
case LLAssetType::AT_SOUND:
new_bridge = new LLTaskSoundBridge(panel,
- object->getUUID(),
- object->getName());
+ object_id,
+ object_name);
break;
case LLAssetType::AT_LANDMARK:
new_bridge = new LLTaskLandmarkBridge(panel,
- object->getUUID(),
- object->getName());
+ object_id,
+ object_name);
break;
case LLAssetType::AT_CALLINGCARD:
new_bridge = new LLTaskCallingCardBridge(panel,
- object->getUUID(),
- object->getName());
+ object_id,
+ object_name);
break;
case LLAssetType::AT_SCRIPT:
// OLD SCRIPTS DEPRECATED - JC
llwarns << "Old script" << llendl;
//new_bridge = new LLTaskOldScriptBridge(panel,
- // object->getUUID(),
- // object->getName());
+ // object_id,
+ // object_name);
break;
case LLAssetType::AT_OBJECT:
new_bridge = new LLTaskObjectBridge(panel,
- object->getUUID(),
- object->getName(),
+ object_id,
+ object_name,
itemflags);
break;
case LLAssetType::AT_NOTECARD:
new_bridge = new LLTaskNotecardBridge(panel,
- object->getUUID(),
- object->getName());
+ object_id,
+ object_name);
break;
case LLAssetType::AT_ANIMATION:
new_bridge = new LLTaskAnimationBridge(panel,
- object->getUUID(),
- object->getName());
+ object_id,
+ object_name);
break;
case LLAssetType::AT_GESTURE:
new_bridge = new LLTaskGestureBridge(panel,
- object->getUUID(),
- object->getName());
+ object_id,
+ object_name);
break;
case LLAssetType::AT_CLOTHING:
case LLAssetType::AT_BODYPART:
new_bridge = new LLTaskWearableBridge(panel,
- object->getUUID(),
- object->getName(),
+ object_id,
+ object_name,
itemflags);
break;
case LLAssetType::AT_CATEGORY:
new_bridge = new LLTaskCategoryBridge(panel,
- object->getUUID(),
- object->getName());
+ object_id,
+ object_name);
break;
case LLAssetType::AT_LSL_TEXT:
new_bridge = new LLTaskLSLBridge(panel,
- object->getUUID(),
- object->getName());
+ object_id,
+ object_name);
+ break;
+ case LLAssetType::AT_MESH:
+ new_bridge = new LLTaskMeshBridge(panel,
+ object_id,
+ object_name);
break;
default:
llinfos << "Unhandled inventory type (llassetstorage.h): "
@@ -1415,6 +1552,7 @@ void LLPanelObjectInventory::reset()
p.task_id = getTaskUUID();
p.parent_panel = this;
p.tool_tip= LLTrans::getString("PanelContentsTooltip");
+ p.listener = LLTaskInvFVBridge::createObjectBridge(this, NULL);
mFolders = LLUICtrlFactory::create<LLFolderView>(p);
// this ensures that we never say "searching..." or "no items found"
mFolders->getFilter()->setShowFolderState(LLInventoryFilter::SHOW_ALL_FOLDERS);
@@ -1431,7 +1569,7 @@ void LLPanelObjectInventory::reset()
scroll_p.rect(scroller_rect);
scroll_p.tab_stop(true);
scroll_p.follows.flags(FOLLOWS_ALL);
- mScroller = LLUICtrlFactory::create<LLScrollContainer>(scroll_p);
+ mScroller = LLUICtrlFactory::create<LLFolderViewScrollContainer>(scroll_p);
addChild(mScroller);
mScroller->addChild(mFolders);
diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp
index ce9b1c66d7..35e2e96bab 100644
--- a/indra/newview/llpaneloutfitedit.cpp
+++ b/indra/newview/llpaneloutfitedit.cpp
@@ -36,7 +36,7 @@
#include "lloutfitobserver.h"
#include "llcofwearables.h"
#include "llfilteredwearablelist.h"
-#include "llfolderviewitem.h"
+#include "llfolderview.h"
#include "llinventory.h"
#include "llinventoryitemslist.h"
#include "llviewercontrol.h"
@@ -186,14 +186,8 @@ private:
// Populate the menu with items like "New Skin", "New Pants", etc.
static void populateCreateWearableSubmenus(LLMenuGL* menu)
{
- LLView* menu_clothes = gMenuHolder->findChildView("COF.Gear.New_Clothes", FALSE);
- LLView* menu_bp = gMenuHolder->findChildView("COF.Geear.New_Body_Parts", FALSE);
-
- if (!menu_clothes || !menu_bp)
- {
- llassert(menu_clothes && menu_bp);
- return;
- }
+ LLView* menu_clothes = gMenuHolder->getChildView("COF.Gear.New_Clothes", FALSE);
+ LLView* menu_bp = gMenuHolder->getChildView("COF.Geear.New_Body_Parts", FALSE);
for (U8 i = LLWearableType::WT_SHAPE; i != (U8) LLWearableType::WT_COUNT; ++i)
{
@@ -472,6 +466,7 @@ BOOL LLPanelOutfitEdit::postBuild()
mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("skirt"), new LLFindActualWearablesOfType(LLWearableType::WT_SKIRT)));
mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("alpha"), new LLFindActualWearablesOfType(LLWearableType::WT_ALPHA)));
mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("tattoo"), new LLFindActualWearablesOfType(LLWearableType::WT_TATTOO)));
+ mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("physics"), new LLFindActualWearablesOfType(LLWearableType::WT_PHYSICS)));
mCurrentOutfitName = getChild<LLTextBox>("curr_outfit_name");
mStatus = getChild<LLTextBox>("status");
@@ -1329,19 +1324,19 @@ void LLPanelOutfitEdit::getCurrentItemUUID(LLUUID& selected_id)
void LLPanelOutfitEdit::getSelectedItemsUUID(uuid_vec_t& uuid_list)
{
+ void (uuid_vec_t::* tmp)(LLUUID const &) = &uuid_vec_t::push_back;
if (mInventoryItemsPanel->getVisible())
{
std::set<LLUUID> item_set = mInventoryItemsPanel->getRootFolder()->getSelectionList();
- std::for_each(item_set.begin(), item_set.end(), boost::bind( &uuid_vec_t::push_back, &uuid_list, _1));
+ std::for_each(item_set.begin(), item_set.end(), boost::bind( tmp, &uuid_list, _1));
}
else if (mWearablesListViewPanel->getVisible())
{
std::vector<LLSD> item_set;
mWearableItemsList->getSelectedValues(item_set);
- std::for_each(item_set.begin(), item_set.end(), boost::bind( &uuid_vec_t::push_back, &uuid_list, boost::bind(&LLSD::asUUID, _1 )));
-
+ std::for_each(item_set.begin(), item_set.end(), boost::bind( tmp, &uuid_list, boost::bind(&LLSD::asUUID, _1 )));
}
// return selected_id;
diff --git a/indra/newview/llpaneloutfitedit.h b/indra/newview/llpaneloutfitedit.h
index fd366e9cbc..5d4b8d4644 100644
--- a/indra/newview/llpaneloutfitedit.h
+++ b/indra/newview/llpaneloutfitedit.h
@@ -97,6 +97,7 @@ public:
LVIT_SKIRT,
LVIT_ALPHA,
LVIT_TATTOO,
+ LVIT_PHYSICS,
NUM_LIST_VIEW_ITEM_TYPES
} EListViewItemType;
diff --git a/indra/newview/llpaneloutfitsinventory.cpp b/indra/newview/llpaneloutfitsinventory.cpp
index a90f864ae2..f90236f6f2 100644
--- a/indra/newview/llpaneloutfitsinventory.cpp
+++ b/indra/newview/llpaneloutfitsinventory.cpp
@@ -31,6 +31,7 @@
#include "llnotificationsutil.h"
#include "lltabcontainer.h"
+#include "llfloatersidepanelcontainer.h"
#include "llinventoryfunctions.h"
#include "llinventorymodelbackgroundfetch.h"
#include "llagentwearables.h"
@@ -40,7 +41,6 @@
#include "llpanelwearing.h"
#include "llsaveoutfitcombobtn.h"
#include "llsidepanelappearance.h"
-#include "llsidetray.h"
#include "llviewerfoldertype.h"
static const std::string OUTFITS_TAB_NAME = "outfitslist_tab";
@@ -222,7 +222,7 @@ void LLPanelOutfitsInventory::onSave()
//static
LLPanelOutfitsInventory* LLPanelOutfitsInventory::findInstance()
{
- return dynamic_cast<LLPanelOutfitsInventory*>(LLSideTray::getInstance()->getPanel("panel_outfits_inventory"));
+ return dynamic_cast<LLPanelOutfitsInventory*>(LLFloaterSidePanelContainer::getPanel("appearance", "panel_outfits_inventory"));
}
//////////////////////////////////////////////////////////////////////////////////
@@ -319,8 +319,7 @@ void LLPanelOutfitsInventory::onWearablesLoading()
// static
LLSidepanelAppearance* LLPanelOutfitsInventory::getAppearanceSP()
{
- static LLSidepanelAppearance* panel_appearance =
- dynamic_cast<LLSidepanelAppearance*>
- (LLSideTray::getInstance()->getPanel("sidepanel_appearance"));
+ LLSidepanelAppearance* panel_appearance =
+ dynamic_cast<LLSidepanelAppearance*>(LLFloaterSidePanelContainer::getPanel("appearance"));
return panel_appearance;
}
diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index 71c812efe2..f1380e7a36 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -29,6 +29,7 @@
// libs
#include "llavatarname.h"
#include "llfloaterreg.h"
+#include "llfloatersidepanelcontainer.h"
#include "llmenubutton.h"
#include "llmenugl.h"
#include "llnotificationsutil.h"
@@ -54,8 +55,8 @@
#include "llgroupactions.h"
#include "llgrouplist.h"
#include "llinventoryobserver.h"
+#include "llnetmap.h"
#include "llpanelpeoplemenus.h"
-#include "llsidetray.h"
#include "llsidetraypanelcontainer.h"
#include "llrecentpeople.h"
#include "llviewercontrol.h" // for gSavedSettings
@@ -157,9 +158,8 @@ protected:
const LLVector3d& me_pos = gAgent.getPositionGlobal();
const LLVector3d& item1_pos = mAvatarsPositions.find(item1->getAvatarId())->second;
const LLVector3d& item2_pos = mAvatarsPositions.find(item2->getAvatarId())->second;
- F32 dist1 = dist_vec(item1_pos, me_pos);
- F32 dist2 = dist_vec(item2_pos, me_pos);
- return dist1 < dist2;
+
+ return dist_vec_squared(item1_pos, me_pos) < dist_vec_squared(item2_pos, me_pos);
}
private:
id_to_pos_map_t mAvatarsPositions;
@@ -231,7 +231,7 @@ public:
virtual void setActive(bool) {}
protected:
- void updateList()
+ void update()
{
mCallback();
}
@@ -239,6 +239,30 @@ protected:
callback_t mCallback;
};
+/**
+ * Update buttons on changes in our friend relations (STORM-557).
+ */
+class LLButtonsUpdater : public LLPanelPeople::Updater, public LLFriendObserver
+{
+public:
+ LLButtonsUpdater(callback_t cb)
+ : LLPanelPeople::Updater(cb)
+ {
+ LLAvatarTracker::instance().addObserver(this);
+ }
+
+ ~LLButtonsUpdater()
+ {
+ LLAvatarTracker::instance().removeObserver(this);
+ }
+
+ /*virtual*/ void changed(U32 mask)
+ {
+ (void) mask;
+ update();
+ }
+};
+
class LLAvatarListUpdater : public LLPanelPeople::Updater, public LLEventTimer
{
public:
@@ -306,7 +330,7 @@ public:
if (mMask & (LLFriendObserver::ADD | LLFriendObserver::REMOVE | LLFriendObserver::ONLINE))
{
- updateList();
+ update();
}
// Stop updates.
@@ -359,6 +383,16 @@ private:
{
lldebugs << "Inventory changed: " << mask << llendl;
+ static bool synchronize_friends_folders = true;
+ if (synchronize_friends_folders)
+ {
+ // Checks whether "Friends" and "Friends/All" folders exist in "Calling Cards" folder,
+ // fetches their contents if needed and synchronizes it with buddies list.
+ // If the folders are not found they are created.
+ LLFriendCardsManager::instance().syncFriendCardsFolders();
+ synchronize_friends_folders = false;
+ }
+
// *NOTE: deleting of InventoryItem is performed via moving to Trash.
// That means LLInventoryObserver::STRUCTURE is present in MASK instead of LLInventoryObserver::REMOVE
if ((CALLINGCARD_ADDED & mask) == CALLINGCARD_ADDED)
@@ -421,7 +455,7 @@ public:
if (val)
{
// update immediately and start regular updates
- updateList();
+ update();
mEventTimer.start();
}
else
@@ -433,7 +467,7 @@ public:
/*virtual*/ BOOL tick()
{
- updateList();
+ update();
return FALSE;
}
private:
@@ -450,7 +484,7 @@ public:
LLRecentListUpdater(callback_t cb)
: LLAvatarListUpdater(cb, 0)
{
- LLRecentPeople::instance().setChangedCallback(boost::bind(&LLRecentListUpdater::updateList, this));
+ LLRecentPeople::instance().setChangedCallback(boost::bind(&LLRecentListUpdater::update, this));
}
};
@@ -470,16 +504,19 @@ LLPanelPeople::LLPanelPeople()
mNearbyGearButton(NULL),
mFriendsGearButton(NULL),
mGroupsGearButton(NULL),
- mRecentGearButton(NULL)
+ mRecentGearButton(NULL),
+ mMiniMap(NULL)
{
mFriendListUpdater = new LLFriendListUpdater(boost::bind(&LLPanelPeople::updateFriendList, this));
mNearbyListUpdater = new LLNearbyListUpdater(boost::bind(&LLPanelPeople::updateNearbyList, this));
mRecentListUpdater = new LLRecentListUpdater(boost::bind(&LLPanelPeople::updateRecentList, this));
+ mButtonsUpdater = new LLButtonsUpdater(boost::bind(&LLPanelPeople::updateButtons, this));
mCommitCallbackRegistrar.add("People.addFriend", boost::bind(&LLPanelPeople::onAddFriendButtonClicked, this));
}
LLPanelPeople::~LLPanelPeople()
{
+ delete mButtonsUpdater;
delete mNearbyListUpdater;
delete mFriendListUpdater;
delete mRecentListUpdater;
@@ -489,11 +526,11 @@ LLPanelPeople::~LLPanelPeople()
LLVoiceClient::getInstance()->removeObserver(this);
}
- LLView::deleteViewByHandle(mGroupPlusMenuHandle);
- LLView::deleteViewByHandle(mNearbyViewSortMenuHandle);
- LLView::deleteViewByHandle(mFriendsViewSortMenuHandle);
- LLView::deleteViewByHandle(mGroupsViewSortMenuHandle);
- LLView::deleteViewByHandle(mRecentViewSortMenuHandle);
+ if (mGroupPlusMenuHandle.get()) mGroupPlusMenuHandle.get()->die();
+ if (mNearbyViewSortMenuHandle.get()) mNearbyViewSortMenuHandle.get()->die();
+ if (mNearbyViewSortMenuHandle.get()) mNearbyViewSortMenuHandle.get()->die();
+ if (mGroupsViewSortMenuHandle.get()) mGroupsViewSortMenuHandle.get()->die();
+ if (mRecentViewSortMenuHandle.get()) mRecentViewSortMenuHandle.get()->die();
}
@@ -541,6 +578,9 @@ BOOL LLPanelPeople::postBuild()
mNearbyList->setNoItemsMsg(getString("no_one_near"));
mNearbyList->setNoFilteredItemsMsg(getString("no_one_filtered_near"));
mNearbyList->setShowIcons("NearbyListShowIcons");
+ mMiniMap = (LLNetMap*)getChildView("Net Map",true);
+ mMiniMap->setToolTipMsg(gSavedSettings.getBOOL("DoubleClickTeleport") ?
+ getString("AltMiniMapToolTipMsg") : getString("MiniMapToolTipMsg"));
mRecentList = getChild<LLPanel>(RECENT_TAB_NAME)->getChild<LLAvatarList>("avatar_list");
mRecentList->setNoItemsCommentText(getString("no_recent_people"));
@@ -719,18 +759,23 @@ void LLPanelPeople::updateFriendList()
all_friendsp.clear();
online_friendsp.clear();
- LLFriendCardsManager::folderid_buddies_map_t listMap;
+ uuid_vec_t buddies_uuids;
+ LLAvatarTracker::buddy_map_t::const_iterator buddies_iter;
- // *NOTE: For now collectFriendsLists returns data only for Friends/All folder. EXT-694.
- LLFriendCardsManager::instance().collectFriendsLists(listMap);
- if (listMap.size() > 0)
+ // Fill the avatar list with friends UUIDs
+ for (buddies_iter = all_buddies.begin(); buddies_iter != all_buddies.end(); ++buddies_iter)
{
- lldebugs << "Friends Cards were found, count: " << listMap.begin()->second.size() << llendl;
- all_friendsp = listMap.begin()->second;
+ buddies_uuids.push_back(buddies_iter->first);
+ }
+
+ if (buddies_uuids.size() > 0)
+ {
+ lldebugs << "Friends added to the list: " << buddies_uuids.size() << llendl;
+ all_friendsp = buddies_uuids;
}
else
{
- lldebugs << "Friends Cards were not found" << llendl;
+ lldebugs << "No friends found" << llendl;
}
LLAvatarTracker::buddy_map_t::const_iterator buddy_it = all_buddies.begin();
@@ -1062,6 +1107,12 @@ void LLPanelPeople::onAvatarListDoubleClicked(LLUICtrl* ctrl)
void LLPanelPeople::onAvatarListCommitted(LLAvatarList* list)
{
+ if (getActiveTabName() == NEARBY_TAB_NAME)
+ {
+ uuid_vec_t selected_uuids;
+ getCurrentItemIDs(selected_uuids);
+ mMiniMap->setSelected(selected_uuids);
+ } else
// Make sure only one of the friends lists (online/all) has selection.
if (getActiveTabName() == FRIENDS_TAB_NAME)
{
@@ -1111,8 +1162,13 @@ void LLPanelPeople::onAddFriendWizButtonClicked()
{
// Show add friend wizard.
LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(boost::bind(&LLPanelPeople::onAvatarPicked, _1, _2), FALSE, TRUE);
+ if (!picker)
+ {
+ return;
+ }
+
// Need to disable 'ok' button when friend occurs in selection
- if (picker) picker->setOkBtnEnableCb(boost::bind(&LLPanelPeople::isItemsFreeOfFriends, this, _1));
+ picker->setOkBtnEnableCb(boost::bind(&LLPanelPeople::isItemsFreeOfFriends, this, _1));
LLFloater* root_floater = gFloaterView->getParentFloater(this);
if (root_floater)
{
@@ -1232,6 +1288,10 @@ void LLPanelPeople::onFriendsViewSortMenuItemClicked(const LLSD& userdata)
mAllFriendList->showPermissions(show_permissions);
mOnlineFriendList->showPermissions(show_permissions);
}
+ else if (chosen_item == "panel_block_list_sidetray")
+ {
+ LLFloaterSidePanelContainer::showPanel("people", "panel_block_list_sidetray", LLSD());
+ }
}
void LLPanelPeople::onGroupsViewSortMenuItemClicked(const LLSD& userdata)
@@ -1264,6 +1324,10 @@ void LLPanelPeople::onNearbyViewSortMenuItemClicked(const LLSD& userdata)
{
setSortOrder(mNearbyList, E_SORT_BY_DISTANCE);
}
+ else if (chosen_item == "panel_block_list_sidetray")
+ {
+ LLFloaterSidePanelContainer::showPanel("people", "panel_block_list_sidetray", LLSD());
+ }
}
bool LLPanelPeople::onNearbyViewSortMenuItemCheck(const LLSD& userdata)
@@ -1297,6 +1361,10 @@ void LLPanelPeople::onRecentViewSortMenuItemClicked(const LLSD& userdata)
{
mRecentList->toggleIcons();
}
+ else if (chosen_item == "panel_block_list_sidetray")
+ {
+ LLFloaterSidePanelContainer::showPanel("people", "panel_block_list_sidetray", LLSD());
+ }
}
bool LLPanelPeople::onFriendsViewSortMenuItemCheck(const LLSD& userdata)
@@ -1367,9 +1435,6 @@ void LLPanelPeople::onMoreButtonClicked()
void LLPanelPeople::onOpen(const LLSD& key)
{
std::string tab_name = key["people_panel_tab_name"];
- mFilterEditor -> clear();
- onFilterEdit("");
-
if (!tab_name.empty())
mTabContainer->selectTabByName(tab_name);
}
@@ -1391,7 +1456,7 @@ bool LLPanelPeople::notifyChildren(const LLSD& info)
container->onOpen(LLSD().with(LLSideTrayPanelContainer::PARAM_SUB_PANEL_NAME, getName()));
}
else
- LLSideTray::getInstance()->collapseSideBar();
+ LLFloaterReg::hideInstance("people");
return true; // this notification is only supposed to be handled by task panels
}
diff --git a/indra/newview/llpanelpeople.h b/indra/newview/llpanelpeople.h
index 4412aed062..46c58cd139 100644
--- a/indra/newview/llpanelpeople.h
+++ b/indra/newview/llpanelpeople.h
@@ -142,6 +142,7 @@ private:
LLAvatarList* mNearbyList;
LLAvatarList* mRecentList;
LLGroupList* mGroupList;
+ LLNetMap* mMiniMap;
LLHandle<LLView> mGroupPlusMenuHandle;
LLHandle<LLView> mNearbyViewSortMenuHandle;
@@ -152,6 +153,7 @@ private:
Updater* mFriendListUpdater;
Updater* mNearbyListUpdater;
Updater* mRecentListUpdater;
+ Updater* mButtonsUpdater;
LLMenuButton* mNearbyGearButton;
LLMenuButton* mFriendsGearButton;
diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp
index ccef563544..cfbc8f1a94 100644..100755
--- a/indra/newview/llpanelpicks.cpp
+++ b/indra/newview/llpanelpicks.cpp
@@ -35,6 +35,7 @@
#include "lldispatcher.h"
#include "llflatlistview.h"
#include "llfloaterreg.h"
+#include "llfloatersidepanelcontainer.h"
#include "llfloaterworldmap.h"
#include "llnotificationsutil.h"
#include "lltexturectrl.h"
@@ -48,11 +49,11 @@
#include "llaccordionctrl.h"
#include "llaccordionctrltab.h"
#include "llavatarpropertiesprocessor.h"
+#include "llfloatersidepanelcontainer.h"
#include "llpanelavatar.h"
#include "llpanelprofile.h"
#include "llpanelpick.h"
#include "llpanelclassified.h"
-#include "llsidetray.h"
static const std::string XML_BTN_NEW = "new_btn";
static const std::string XML_BTN_DELETE = "trash_btn";
@@ -70,6 +71,120 @@ static const std::string CLASSIFIED_NAME("classified_name");
static LLRegisterPanelClassWrapper<LLPanelPicks> t_panel_picks("panel_picks");
+
+class LLPickHandler : public LLCommandHandler,
+ public LLAvatarPropertiesObserver
+{
+public:
+
+ std::set<LLUUID> mPickIds;
+
+ // requires trusted browser to trigger
+ LLPickHandler() : LLCommandHandler("pick", UNTRUSTED_THROTTLE) { }
+
+ bool handle(const LLSD& params, const LLSD& query_map,
+ LLMediaCtrl* web)
+ {
+ if (!LLUI::sSettingGroups["config"]->getBOOL("EnablePicks"))
+ {
+ LLNotificationsUtil::add("NoPicks", LLSD(), LLSD(), std::string("SwitchToStandardSkinAndQuit"));
+ return true;
+ }
+
+ // handle app/classified/create urls first
+ if (params.size() == 1 && params[0].asString() == "create")
+ {
+ createPick();
+ return true;
+ }
+
+ // then handle the general app/pick/{UUID}/{CMD} urls
+ if (params.size() < 2)
+ {
+ return false;
+ }
+
+ // get the ID for the pick_id
+ LLUUID pick_id;
+ if (!pick_id.set(params[0], FALSE))
+ {
+ return false;
+ }
+
+ // edit the pick in the side tray.
+ // need to ask the server for more info first though...
+ const std::string verb = params[1].asString();
+ if (verb == "edit")
+ {
+ mPickIds.insert(pick_id);
+ LLAvatarPropertiesProcessor::getInstance()->addObserver(LLUUID(), this);
+ LLAvatarPropertiesProcessor::getInstance()->sendPickInfoRequest(gAgent.getID(),pick_id);
+ return true;
+ }
+ else
+ {
+ llwarns << "unknown verb " << verb << llendl;
+ return false;
+ }
+ }
+
+ void createPick()
+ {
+ // open the new pick panel on the Picks floater
+ LLFloater* picks_floater = LLFloaterReg::showInstance("picks");
+
+ LLPanelPicks* picks = picks_floater->findChild<LLPanelPicks>("panel_picks");
+ if (picks)
+ {
+ picks->createNewPick();
+ }
+ }
+
+ void editPick(LLPickData* pick_info)
+ {
+ LLSD params;
+ params["open_tab_name"] = "panel_picks";
+ params["show_tab_panel"] = "edit_pick";
+ params["pick_id"] = pick_info->pick_id;
+ params["avatar_id"] = pick_info->creator_id;
+ params["snapshot_id"] = pick_info->snapshot_id;
+ params["pick_name"] = pick_info->name;
+ params["pick_desc"] = pick_info->desc;
+ LLFloaterSidePanelContainer::showPanel("picks", params);
+ }
+
+ /*virtual*/ void processProperties(void* data, EAvatarProcessorType type)
+ {
+ if (APT_PICK_INFO != type)
+ {
+ return;
+ }
+
+ // is this the pick that we asked for?
+ LLPickData* pick_info = static_cast<LLPickData*>(data);
+ if (!pick_info || mPickIds.find(pick_info->pick_id) == mPickIds.end())
+ {
+ return;
+ }
+
+ // open the edit side tray for this pick
+ if (pick_info->creator_id == gAgent.getID())
+ {
+ editPick(pick_info);
+ }
+ else
+ {
+ llwarns << "Can't edit a pick you did not create" << llendl;
+ }
+
+ // remove our observer now that we're done
+ mPickIds.erase(pick_info->pick_id);
+ LLAvatarPropertiesProcessor::getInstance()->removeObserver(LLUUID(), this);
+ }
+};
+
+LLPickHandler gPickHandler;
+
class LLClassifiedHandler :
public LLCommandHandler,
public LLAvatarPropertiesObserver
@@ -80,8 +195,16 @@ public:
std::set<LLUUID> mClassifiedIds;
+ std::string mRequestVerb;
+
bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web)
{
+ if (!LLUI::sSettingGroups["config"]->getBOOL("EnableClassifieds"))
+ {
+ LLNotificationsUtil::add("NoClassifieds", LLSD(), LLSD(), std::string("SwitchToStandardSkinAndQuit"));
+ return true;
+ }
+
// handle app/classified/create urls first
if (params.size() == 1 && params[0].asString() == "create")
{
@@ -107,6 +230,15 @@ public:
const std::string verb = params[1].asString();
if (verb == "about")
{
+ mRequestVerb = verb;
+ mClassifiedIds.insert(classified_id);
+ LLAvatarPropertiesProcessor::getInstance()->addObserver(LLUUID(), this);
+ LLAvatarPropertiesProcessor::getInstance()->sendClassifiedInfoRequest(classified_id);
+ return true;
+ }
+ else if (verb == "edit")
+ {
+ mRequestVerb = verb;
mClassifiedIds.insert(classified_id);
LLAvatarPropertiesProcessor::getInstance()->addObserver(LLUUID(), this);
LLAvatarPropertiesProcessor::getInstance()->sendClassifiedInfoRequest(classified_id);
@@ -118,28 +250,51 @@ public:
void createClassified()
{
- // open the new classified panel on the Me > Picks sidetray
- LLSD params;
- params["id"] = gAgent.getID();
- params["open_tab_name"] = "panel_picks";
- params["show_tab_panel"] = "create_classified";
- LLSideTray::getInstance()->showPanel("panel_me", params);
+ // open the new classified panel on the Picks floater
+ LLFloater* picks_floater = LLFloaterReg::showInstance("picks");
+
+ LLPanelPicks* picks = picks_floater->findChild<LLPanelPicks>("panel_picks");
+ if (picks)
+ {
+ picks->createNewClassified();
+ }
}
void openClassified(LLAvatarClassifiedInfo* c_info)
{
- // open the classified info panel on the Me > Picks sidetray
- LLSD params;
- params["id"] = c_info->creator_id;
- params["open_tab_name"] = "panel_picks";
- params["show_tab_panel"] = "classified_details";
- params["classified_id"] = c_info->classified_id;
- params["classified_creator_id"] = c_info->creator_id;
- params["classified_snapshot_id"] = c_info->snapshot_id;
- params["classified_name"] = c_info->name;
- params["classified_desc"] = c_info->description;
- params["from_search"] = true;
- LLSideTray::getInstance()->showPanel("panel_profile_view", params);
+ if (mRequestVerb == "about")
+ {
+ // open the classified info panel on the Me > Picks sidetray
+ LLSD params;
+ params["id"] = c_info->creator_id;
+ params["open_tab_name"] = "panel_picks";
+ params["show_tab_panel"] = "classified_details";
+ params["classified_id"] = c_info->classified_id;
+ params["classified_creator_id"] = c_info->creator_id;
+ params["classified_snapshot_id"] = c_info->snapshot_id;
+ params["classified_name"] = c_info->name;
+ params["classified_desc"] = c_info->description;
+ params["from_search"] = true;
+ LLFloaterSidePanelContainer::showPanel("picks", params);
+ }
+ else if (mRequestVerb == "edit")
+ {
+ if (c_info->creator_id == gAgent.getID())
+ {
+ llwarns << "edit in progress" << llendl;
+ // open the new classified panel on the Me > Picks sidetray
+ LLSD params;
+ params["id"] = gAgent.getID();
+ params["open_tab_name"] = "panel_picks";
+ params["show_tab_panel"] = "edit_classified";
+ params["classified_id"] = c_info->classified_id;
+ LLFloaterSidePanelContainer::showPanel("my_profile", params);
+ }
+ else
+ {
+ llwarns << "Can't edit a classified you did not create" << llendl;
+ }
+ }
}
/*virtual*/ void processProperties(void* data, EAvatarProcessorType type)
@@ -212,7 +367,8 @@ void LLPanelPicks::updateData()
mNoPicks = false;
mNoClassifieds = false;
- getChild<LLUICtrl>("picks_panel_text")->setValue(LLTrans::getString("PicksClassifiedsLoadingText"));
+ mNoItemsLabel->setValue(LLTrans::getString("PicksClassifiedsLoadingText"));
+ mNoItemsLabel->setVisible(TRUE);
mPicksList->clear();
LLAvatarPropertiesProcessor::getInstance()->sendAvatarPicksRequest(getAvatarId());
@@ -298,7 +454,10 @@ void LLPanelPicks::processProperties(void* data, EAvatarProcessorType type)
pick_value.insert(CLASSIFIED_ID, c_data.classified_id);
pick_value.insert(CLASSIFIED_NAME, c_data.name);
- mClassifiedsList->addItem(c_item, pick_value);
+ if (!findClassifiedById(c_data.classified_id))
+ {
+ mClassifiedsList->addItem(c_item, pick_value);
+ }
c_item->setDoubleClickCallback(boost::bind(&LLPanelPicks::onDoubleClickClassifiedItem, this, _1));
c_item->setRightMouseUpCallback(boost::bind(&LLPanelPicks::onRightMouseUpItem, this, _1, _2, _3, _4));
@@ -314,15 +473,17 @@ void LLPanelPicks::processProperties(void* data, EAvatarProcessorType type)
mNoClassifieds = !mClassifiedsList->size();
}
- if (mNoPicks && mNoClassifieds)
+ bool no_data = mNoPicks && mNoClassifieds;
+ mNoItemsLabel->setVisible(no_data);
+ if (no_data)
{
if(getAvatarId() == gAgentID)
{
- getChild<LLUICtrl>("picks_panel_text")->setValue(LLTrans::getString("NoPicksClassifiedsText"));
+ mNoItemsLabel->setValue(LLTrans::getString("NoPicksClassifiedsText"));
}
else
{
- getChild<LLUICtrl>("picks_panel_text")->setValue(LLTrans::getString("NoAvatarPicksClassifiedsText"));
+ mNoItemsLabel->setValue(LLTrans::getString("NoAvatarPicksClassifiedsText"));
}
}
}
@@ -359,6 +520,8 @@ BOOL LLPanelPicks::postBuild()
mPicksList->setNoItemsCommentText(getString("no_picks"));
mClassifiedsList->setNoItemsCommentText(getString("no_classifieds"));
+ mNoItemsLabel = getChild<LLUICtrl>("picks_panel_text");
+
childSetAction(XML_BTN_NEW, boost::bind(&LLPanelPicks::onClickPlusBtn, this));
childSetAction(XML_BTN_DELETE, boost::bind(&LLPanelPicks::onClickDelete, this));
childSetAction(XML_BTN_TELEPORT, boost::bind(&LLPanelPicks::onClickTeleport, this));
@@ -771,6 +934,13 @@ void LLPanelPicks::openClassifiedInfo(const LLSD &params)
getProfilePanel()->openPanel(mPanelClassifiedInfo, params);
}
+void LLPanelPicks::openClassifiedEdit(const LLSD& params)
+{
+ LLUUID classified_id = params["classified_id"].asUUID();;
+ llinfos << "opening classified " << classified_id << " for edit" << llendl;
+ editClassified(classified_id);
+}
+
void LLPanelPicks::showAccordion(const std::string& name, bool show)
{
LLAccordionCtrlTab* tab = getChild<LLAccordionCtrlTab>(name);
@@ -781,7 +951,7 @@ void LLPanelPicks::showAccordion(const std::string& name, bool show)
void LLPanelPicks::onPanelPickClose(LLPanel* panel)
{
- panel->setVisible(FALSE);
+ getProfilePanel()->closePanel(panel);
}
void LLPanelPicks::onPanelPickSave(LLPanel* panel)
@@ -878,13 +1048,10 @@ void LLPanelPicks::createPickInfoPanel()
void LLPanelPicks::createClassifiedInfoPanel()
{
- if(!mPanelClassifiedInfo)
- {
- mPanelClassifiedInfo = LLPanelClassifiedInfo::create();
- mPanelClassifiedInfo->setExitCallback(boost::bind(&LLPanelPicks::onPanelClassifiedClose, this, mPanelClassifiedInfo));
- mPanelClassifiedInfo->setEditClassifiedCallback(boost::bind(&LLPanelPicks::onPanelClassifiedEdit, this));
- mPanelClassifiedInfo->setVisible(FALSE);
- }
+ mPanelClassifiedInfo = LLPanelClassifiedInfo::create();
+ mPanelClassifiedInfo->setExitCallback(boost::bind(&LLPanelPicks::onPanelClassifiedClose, this, mPanelClassifiedInfo));
+ mPanelClassifiedInfo->setEditClassifiedCallback(boost::bind(&LLPanelPicks::onPanelClassifiedEdit, this));
+ mPanelClassifiedInfo->setVisible(FALSE);
}
void LLPanelPicks::createClassifiedEditPanel(LLPanelClassifiedEdit** panel)
@@ -902,14 +1069,11 @@ void LLPanelPicks::createClassifiedEditPanel(LLPanelClassifiedEdit** panel)
void LLPanelPicks::createPickEditPanel()
{
- if(!mPanelPickEdit)
- {
- mPanelPickEdit = LLPanelPickEdit::create();
- mPanelPickEdit->setExitCallback(boost::bind(&LLPanelPicks::onPanelPickClose, this, mPanelPickEdit));
- mPanelPickEdit->setSaveCallback(boost::bind(&LLPanelPicks::onPanelPickSave, this, mPanelPickEdit));
- mPanelPickEdit->setCancelCallback(boost::bind(&LLPanelPicks::onPanelPickClose, this, mPanelPickEdit));
- mPanelPickEdit->setVisible(FALSE);
- }
+ mPanelPickEdit = LLPanelPickEdit::create();
+ mPanelPickEdit->setExitCallback(boost::bind(&LLPanelPicks::onPanelPickClose, this, mPanelPickEdit));
+ mPanelPickEdit->setSaveCallback(boost::bind(&LLPanelPicks::onPanelPickSave, this, mPanelPickEdit));
+ mPanelPickEdit->setCancelCallback(boost::bind(&LLPanelPicks::onPanelPickClose, this, mPanelPickEdit));
+ mPanelPickEdit->setVisible(FALSE);
}
// void LLPanelPicks::openPickEditPanel(LLPickItem* pick)
@@ -940,6 +1104,12 @@ void LLPanelPicks::createPickEditPanel()
// getProfilePanel()->openPanel(mPanelPickInfo, params);
// }
+void LLPanelPicks::openPickEdit(const LLSD& params)
+{
+ createPickEditPanel();
+ getProfilePanel()->openPanel(mPanelPickEdit, params);
+}
+
void LLPanelPicks::onPanelPickEdit()
{
LLSD selected_value = mPicksList->getSelectedValue();
@@ -973,6 +1143,35 @@ void LLPanelPicks::onPanelClassifiedEdit()
{
return;
}
+ editClassified(c_item->getClassifiedId());
+}
+
+LLClassifiedItem *LLPanelPicks::findClassifiedById(const LLUUID& classified_id)
+{
+ // HACK - find item by classified id. Should be a better way.
+ std::vector<LLPanel*> items;
+ mClassifiedsList->getItems(items);
+ LLClassifiedItem* c_item = NULL;
+ for(std::vector<LLPanel*>::iterator it = items.begin(); it != items.end(); ++it)
+ {
+ LLClassifiedItem *test_item = dynamic_cast<LLClassifiedItem*>(*it);
+ if (test_item && test_item->getClassifiedId() == classified_id)
+ {
+ c_item = test_item;
+ break;
+ }
+ }
+ return c_item;
+}
+
+void LLPanelPicks::editClassified(const LLUUID& classified_id)
+{
+ LLClassifiedItem* c_item = findClassifiedById(classified_id);
+ if (!c_item)
+ {
+ llwarns << "item not found for classified_id " << classified_id << llendl;
+ return;
+ }
LLSD params;
params["classified_id"] = c_item->getClassifiedId();
diff --git a/indra/newview/llpanelpicks.h b/indra/newview/llpanelpicks.h
index 526ba48dcb..3bb7413ac3 100644..100755
--- a/indra/newview/llpanelpicks.h
+++ b/indra/newview/llpanelpicks.h
@@ -76,11 +76,15 @@ public:
// returns the selected pick item
LLPickItem* getSelectedPickItem();
LLClassifiedItem* getSelectedClassifiedItem();
+ LLClassifiedItem* findClassifiedById(const LLUUID& classified_id);
//*NOTE top down approch when panel toggling is done only by
// parent panels failed to work (picks related code was in my profile panel)
void setProfilePanel(LLPanelProfile* profile_panel);
+ void createNewPick();
+ void createNewClassified();
+
protected:
/*virtual*/void updateButtons();
@@ -106,18 +110,18 @@ private:
void onPanelPickSave(LLPanel* panel);
void onPanelClassifiedSave(LLPanelClassifiedEdit* panel);
void onPanelClassifiedClose(LLPanelClassifiedInfo* panel);
+ void openPickEdit(const LLSD& params);
void onPanelPickEdit();
void onPanelClassifiedEdit();
+ void editClassified(const LLUUID& classified_id);
void onClickMenuEdit();
bool onEnableMenuItem(const LLSD& user_data);
- void createNewPick();
- void createNewClassified();
-
void openPickInfo();
void openClassifiedInfo();
void openClassifiedInfo(const LLSD& params);
+ void openClassifiedEdit(const LLSD& params);
friend class LLPanelProfile;
void showAccordion(const std::string& name, bool show);
@@ -149,6 +153,7 @@ private:
LLPanelClassifiedInfo* mPanelClassifiedInfo;
LLPanelPickEdit* mPanelPickEdit;
LLToggleableMenu* mPlusMenu;
+ LLUICtrl* mNoItemsLabel;
// <classified_id, edit_panel>
typedef std::map<LLUUID, LLPanelClassifiedEdit*> panel_classified_edit_map_t;
diff --git a/indra/newview/llpanelplaceprofile.cpp b/indra/newview/llpanelplaceprofile.cpp
index 68ecb0165c..ce8057eead 100644
--- a/indra/newview/llpanelplaceprofile.cpp
+++ b/indra/newview/llpanelplaceprofile.cpp
@@ -32,6 +32,7 @@
#include "llparcel.h"
#include "message.h"
+#include "llexpandabletextbox.h"
#include "lliconctrl.h"
#include "lllineeditor.h"
#include "lltextbox.h"
@@ -70,6 +71,8 @@ static std::string icon_scripts;
static std::string icon_scripts_no;
static std::string icon_damage;
static std::string icon_damage_no;
+static std::string icon_see_avs_on;
+static std::string icon_see_avs_off;
LLPanelPlaceProfile::LLPanelPlaceProfile()
: LLPanelPlaceInfo(),
@@ -114,6 +117,8 @@ BOOL LLPanelPlaceProfile::postBuild()
mScriptsText = getChild<LLTextBox>("scripts_value");
mDamageIcon = getChild<LLIconCtrl>("damage_icon");
mDamageText = getChild<LLTextBox>("damage_value");
+ mSeeAVsIcon = getChild<LLIconCtrl>("see_avatars_icon");
+ mSeeAVsText = getChild<LLTextBox>("see_avatars_value");
mRegionNameText = getChild<LLTextBox>("region_name");
mRegionTypeText = getChild<LLTextBox>("region_type");
@@ -153,6 +158,8 @@ BOOL LLPanelPlaceProfile::postBuild()
icon_scripts_no = getString("icon_ScriptsNo");
icon_damage = getString("icon_Damage");
icon_damage_no = getString("icon_DamageNo");
+ icon_see_avs_on = getString("icon_SeeAVs_On");
+ icon_see_avs_off = getString("icon_SeeAVs_Off");
return TRUE;
}
@@ -182,6 +189,8 @@ void LLPanelPlaceProfile::resetLocation()
mScriptsText->setText(loading);
mDamageIcon->setValue(loading);
mDamageText->setText(loading);
+ mSeeAVsIcon->setValue(loading);
+ mSeeAVsText->setText(loading);
mRegionNameText->setValue(loading);
mRegionTypeText->setValue(loading);
@@ -219,6 +228,34 @@ void LLPanelPlaceProfile::setInfoType(EInfoType type)
getChild<LLAccordionCtrl>("advanced_info_accordion")->setVisible(is_info_type_agent);
+ // If we came from search we want larger description area, approx. 10 lines (see STORM-1311).
+ // Don't use the maximum available space because that leads to nasty artifacts
+ // in text editor and expandable text box.
+ {
+ const S32 SEARCH_DESC_HEIGHT = 150;
+
+ // Remember original geometry (once).
+ static const S32 sOrigDescVPad = getChildView("parcel_title")->getRect().mBottom - mDescEditor->getRect().mTop;
+ static const S32 sOrigDescHeight = mDescEditor->getRect().getHeight();
+ static const S32 sOrigMRIconVPad = mDescEditor->getRect().mBottom - mMaturityRatingIcon->getRect().mTop;
+ static const S32 sOrigMRTextVPad = mDescEditor->getRect().mBottom - mMaturityRatingText->getRect().mTop;
+
+ // Resize the description.
+ const S32 desc_height = is_info_type_agent ? sOrigDescHeight : SEARCH_DESC_HEIGHT;
+ const S32 desc_top = getChildView("parcel_title")->getRect().mBottom - sOrigDescVPad;
+ LLRect desc_rect = mDescEditor->getRect();
+ desc_rect.setOriginAndSize(desc_rect.mLeft, desc_top - desc_height, desc_rect.getWidth(), desc_height);
+ mDescEditor->reshape(desc_rect.getWidth(), desc_rect.getHeight());
+ mDescEditor->setRect(desc_rect);
+ mDescEditor->updateTextShape();
+
+ // Move the maturity rating icon/text accordingly.
+ const S32 mr_icon_bottom = mDescEditor->getRect().mBottom - sOrigMRIconVPad - mMaturityRatingIcon->getRect().getHeight();
+ const S32 mr_text_bottom = mDescEditor->getRect().mBottom - sOrigMRTextVPad - mMaturityRatingText->getRect().getHeight();
+ mMaturityRatingIcon->setOrigin(mMaturityRatingIcon->getRect().mLeft, mr_icon_bottom);
+ mMaturityRatingText->setOrigin(mMaturityRatingText->getRect().mLeft, mr_text_bottom);
+ }
+
switch(type)
{
case AGENT:
@@ -414,8 +451,19 @@ void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel,
mDamageText->setText(off);
}
+ if (parcel->getSeeAVs())
+ {
+ mSeeAVsIcon->setValue(icon_see_avs_on);
+ mSeeAVsText->setText(on);
+ }
+ else
+ {
+ mSeeAVsIcon->setValue(icon_see_avs_off);
+ mSeeAVsText->setText(off);
+ }
+
mRegionNameText->setText(region->getName());
- mRegionTypeText->setText(region->getSimProductName());
+ mRegionTypeText->setText(region->getLocalizedSimProductName());
// Determine parcel owner
if (parcel->isPublic())
diff --git a/indra/newview/llpanelplaceprofile.h b/indra/newview/llpanelplaceprofile.h
index f28b3b3832..a33fc12ce4 100644
--- a/indra/newview/llpanelplaceprofile.h
+++ b/indra/newview/llpanelplaceprofile.h
@@ -91,6 +91,8 @@ private:
LLTextBox* mScriptsText;
LLIconCtrl* mDamageIcon;
LLTextBox* mDamageText;
+ LLIconCtrl* mSeeAVsIcon;
+ LLTextBox* mSeeAVsText;
LLTextBox* mRegionNameText;
LLTextBox* mRegionTypeText;
diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp
index f0e60386b6..6d321d4716 100644
--- a/indra/newview/llpanelplaces.cpp
+++ b/indra/newview/llpanelplaces.cpp
@@ -39,6 +39,8 @@
#include "llfiltereditor.h"
#include "llfirstuse.h"
#include "llfloaterreg.h"
+#include "llfloatersidepanelcontainer.h"
+#include "llmenubutton.h"
#include "llnotificationsutil.h"
#include "lltabcontainer.h"
#include "lltexteditor.h"
@@ -63,7 +65,6 @@
#include "llpanelplaceprofile.h"
#include "llpanelteleporthistory.h"
#include "llremoteparcelrequest.h"
-#include "llsidetray.h"
#include "llteleporthistorystorage.h"
#include "lltoggleablemenu.h"
#include "llviewerinventory.h"
@@ -81,6 +82,7 @@ static const std::string CREATE_LANDMARK_INFO_TYPE = "create_landmark";
static const std::string LANDMARK_INFO_TYPE = "landmark";
static const std::string REMOTE_PLACE_INFO_TYPE = "remote_place";
static const std::string TELEPORT_HISTORY_INFO_TYPE = "teleport_history";
+static const std::string LANDMARK_TAB_INFO_TYPE = "open_landmark_tab";
// Support for secondlife:///app/parcel/{UUID}/about SLapps
class LLParcelHandler : public LLCommandHandler
@@ -90,11 +92,18 @@ public:
LLParcelHandler() : LLCommandHandler("parcel", UNTRUSTED_THROTTLE) { }
bool handle(const LLSD& params, const LLSD& query_map,
LLMediaCtrl* web)
- {
+ {
if (params.size() < 2)
{
return false;
}
+
+ if (!LLUI::sSettingGroups["config"]->getBOOL("EnablePlaceProfile"))
+ {
+ LLNotificationsUtil::add("NoPlaceInfo", LLSD(), LLSD(), std::string("SwitchToStandardSkinAndQuit"));
+ return true;
+ }
+
LLUUID parcel_id;
if (!parcel_id.set(params[0], FALSE))
{
@@ -107,7 +116,7 @@ public:
LLSD key;
key["type"] = "remote_place";
key["id"] = parcel_id;
- LLSideTray::getInstance()->showPanel("panel_places", key);
+ LLFloaterSidePanelContainer::showPanel("places", key);
return true;
}
}
@@ -143,18 +152,16 @@ class LLPlacesInventoryObserver : public LLInventoryAddedObserver
{
public:
LLPlacesInventoryObserver(LLPanelPlaces* places_panel) :
- mPlaces(places_panel),
- mTabsCreated(false)
+ mPlaces(places_panel)
{}
/*virtual*/ void changed(U32 mask)
{
LLInventoryAddedObserver::changed(mask);
- if (!mTabsCreated && mPlaces)
+ if (mPlaces && !mPlaces->tabsCreated())
{
mPlaces->createTabs();
- mTabsCreated = true;
}
}
@@ -167,7 +174,6 @@ protected:
private:
LLPanelPlaces* mPlaces;
- bool mTabsCreated;
};
class LLPlacesRemoteParcelInfoObserver : public LLRemoteParcelInfoObserver
@@ -236,7 +242,8 @@ LLPanelPlaces::LLPanelPlaces()
mPlaceMenu(NULL),
mLandmarkMenu(NULL),
mPosGlobal(),
- isLandmarkEditModeOn(false)
+ isLandmarkEditModeOn(false),
+ mTabsCreated(false)
{
mParcelObserver = new LLPlacesParcelObserver(this);
mInventoryObserver = new LLPlacesInventoryObserver(this);
@@ -244,7 +251,7 @@ LLPanelPlaces::LLPanelPlaces()
gInventory.addObserver(mInventoryObserver);
- LLViewerParcelMgr::getInstance()->addAgentParcelChangedCallback(
+ mAgentParcelChangedConnection = LLViewerParcelMgr::getInstance()->addAgentParcelChangedCallback(
boost::bind(&LLPanelPlaces::updateVerbs, this));
//buildFromFile( "panel_places.xml"); // Called from LLRegisterPanelClass::defaultPanelClassBuilder()
@@ -260,6 +267,11 @@ LLPanelPlaces::~LLPanelPlaces()
delete mInventoryObserver;
delete mParcelObserver;
delete mRemoteParcelObserver;
+
+ if (mAgentParcelChangedConnection.connected())
+ {
+ mAgentParcelChangedConnection.disconnect();
+ }
}
BOOL LLPanelPlaces::postBuild()
@@ -282,8 +294,8 @@ BOOL LLPanelPlaces::postBuild()
mCloseBtn = getChild<LLButton>("close_btn");
mCloseBtn->setClickedCallback(boost::bind(&LLPanelPlaces::onBackButtonClicked, this));
- mOverflowBtn = getChild<LLButton>("overflow_btn");
- mOverflowBtn->setClickedCallback(boost::bind(&LLPanelPlaces::onOverflowButtonClicked, this));
+ mOverflowBtn = getChild<LLMenuButton>("overflow_btn");
+ mOverflowBtn->setMouseDownCallback(boost::bind(&LLPanelPlaces::onOverflowButtonClicked, this));
mPlaceInfoBtn = getChild<LLButton>("profile_btn");
mPlaceInfoBtn->setClickedCallback(boost::bind(&LLPanelPlaces::onProfileButtonClicked, this));
@@ -330,8 +342,7 @@ BOOL LLPanelPlaces::postBuild()
mPlaceProfileBackBtn = mPlaceProfile->getChild<LLButton>("back_btn");
mPlaceProfileBackBtn->setClickedCallback(boost::bind(&LLPanelPlaces::onBackButtonClicked, this));
- mLandmarkInfoBackBtn = mLandmarkInfo->getChild<LLButton>("back_btn");
- mLandmarkInfoBackBtn->setClickedCallback(boost::bind(&LLPanelPlaces::onBackButtonClicked, this));
+ mLandmarkInfo->getChild<LLButton>("back_btn")->setClickedCallback(boost::bind(&LLPanelPlaces::onBackButtonClicked, this));
LLLineEditor* title_editor = mLandmarkInfo->getChild<LLLineEditor>("title_editor");
title_editor->setKeystrokeCallback(boost::bind(&LLPanelPlaces::onEditButtonClicked, this), NULL);
@@ -342,100 +353,117 @@ BOOL LLPanelPlaces::postBuild()
LLComboBox* folder_combo = mLandmarkInfo->getChild<LLComboBox>("folder_combo");
folder_combo->setCommitCallback(boost::bind(&LLPanelPlaces::onEditButtonClicked, this));
+ createTabs();
+ updateVerbs();
+
return TRUE;
}
void LLPanelPlaces::onOpen(const LLSD& key)
{
- LLFirstUse::notUsingDestinationGuide(false);
-
if (!mPlaceProfile || !mLandmarkInfo)
return;
if (key.size() != 0)
{
- mFilterEditor->clear();
- onFilterEdit("", false);
-
- mPlaceInfoType = key["type"].asString();
- mPosGlobal.setZero();
- mItem = NULL;
- isLandmarkEditModeOn = false;
- togglePlaceInfoPanel(TRUE);
-
- if (mPlaceInfoType == AGENT_INFO_TYPE)
+ std::string key_type = key["type"].asString();
+ if (key_type == LANDMARK_TAB_INFO_TYPE)
{
- mPlaceProfile->setInfoType(LLPanelPlaceInfo::AGENT);
+ // Small hack: We need to toggle twice. The first toggle moves from the Landmark
+ // or Teleport History info panel to the Landmark or Teleport History list panel.
+ // For this first toggle, the mPlaceInfoType should be the one previously used so
+ // that the state can be corretly set.
+ // The second toggle forces the list to be set to Landmark.
+ // This avoids extracting and duplicating all the state logic from togglePlaceInfoPanel()
+ // here or some specific private method
+ togglePlaceInfoPanel(FALSE);
+ mPlaceInfoType = key_type;
+ togglePlaceInfoPanel(FALSE);
+ // Update the active tab
+ onTabSelected();
+ // Update the buttons at the bottom of the panel
+ updateVerbs();
}
- else if (mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE)
+ else
{
- mLandmarkInfo->setInfoType(LLPanelPlaceInfo::CREATE_LANDMARK);
+ mFilterEditor->clear();
+ onFilterEdit("", false);
- if (key.has("x") && key.has("y") && key.has("z"))
+ mPlaceInfoType = key_type;
+ mPosGlobal.setZero();
+ mItem = NULL;
+ isLandmarkEditModeOn = false;
+ togglePlaceInfoPanel(TRUE);
+
+ if (mPlaceInfoType == AGENT_INFO_TYPE)
{
- mPosGlobal = LLVector3d(key["x"].asReal(),
- key["y"].asReal(),
- key["z"].asReal());
+ mPlaceProfile->setInfoType(LLPanelPlaceInfo::AGENT);
}
- else
+ else if (mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE)
{
- mPosGlobal = gAgent.getPositionGlobal();
+ mLandmarkInfo->setInfoType(LLPanelPlaceInfo::CREATE_LANDMARK);
+
+ if (key.has("x") && key.has("y") && key.has("z"))
+ {
+ mPosGlobal = LLVector3d(key["x"].asReal(),
+ key["y"].asReal(),
+ key["z"].asReal());
+ }
+ else
+ {
+ mPosGlobal = gAgent.getPositionGlobal();
+ }
+
+ mLandmarkInfo->displayParcelInfo(LLUUID(), mPosGlobal);
+
+ mSaveBtn->setEnabled(FALSE);
}
-
- mLandmarkInfo->displayParcelInfo(LLUUID(), mPosGlobal);
-
- // Disabling "Save", "Close" and "Back" buttons to prevent closing "Create Landmark"
- // panel before created landmark is loaded.
- // These buttons will be enabled when created landmark is added to inventory.
- mSaveBtn->setEnabled(FALSE);
- mCloseBtn->setEnabled(FALSE);
- mLandmarkInfoBackBtn->setEnabled(FALSE);
- }
- else if (mPlaceInfoType == LANDMARK_INFO_TYPE)
- {
- mLandmarkInfo->setInfoType(LLPanelPlaceInfo::LANDMARK);
-
- LLInventoryItem* item = gInventory.getItem(key["id"].asUUID());
- if (!item)
- return;
-
- setItem(item);
- }
- else if (mPlaceInfoType == REMOTE_PLACE_INFO_TYPE)
- {
- if (key.has("id"))
+ else if (mPlaceInfoType == LANDMARK_INFO_TYPE)
{
- LLUUID parcel_id = key["id"].asUUID();
- mPlaceProfile->setParcelID(parcel_id);
+ mLandmarkInfo->setInfoType(LLPanelPlaceInfo::LANDMARK);
- // query the server to get the global 3D position of this
- // parcel - we need this for teleport/mapping functions.
- mRemoteParcelObserver->setParcelID(parcel_id);
+ LLInventoryItem* item = gInventory.getItem(key["id"].asUUID());
+ if (!item)
+ return;
+
+ setItem(item);
}
- else
+ else if (mPlaceInfoType == REMOTE_PLACE_INFO_TYPE)
{
- mPosGlobal = LLVector3d(key["x"].asReal(),
- key["y"].asReal(),
- key["z"].asReal());
- mPlaceProfile->displayParcelInfo(LLUUID(), mPosGlobal);
+ if (key.has("id"))
+ {
+ LLUUID parcel_id = key["id"].asUUID();
+ mPlaceProfile->setParcelID(parcel_id);
+
+ // query the server to get the global 3D position of this
+ // parcel - we need this for teleport/mapping functions.
+ mRemoteParcelObserver->setParcelID(parcel_id);
+ }
+ else
+ {
+ mPosGlobal = LLVector3d(key["x"].asReal(),
+ key["y"].asReal(),
+ key["z"].asReal());
+ mPlaceProfile->displayParcelInfo(LLUUID(), mPosGlobal);
+ }
+
+ mPlaceProfile->setInfoType(LLPanelPlaceInfo::PLACE);
}
+ else if (mPlaceInfoType == TELEPORT_HISTORY_INFO_TYPE)
+ {
+ S32 index = key["id"].asInteger();
- mPlaceProfile->setInfoType(LLPanelPlaceInfo::PLACE);
- }
- else if (mPlaceInfoType == TELEPORT_HISTORY_INFO_TYPE)
- {
- S32 index = key["id"].asInteger();
+ const LLTeleportHistoryStorage::slurl_list_t& hist_items =
+ LLTeleportHistoryStorage::getInstance()->getItems();
- const LLTeleportHistoryStorage::slurl_list_t& hist_items =
- LLTeleportHistoryStorage::getInstance()->getItems();
+ mPosGlobal = hist_items[index].mGlobalPos;
- mPosGlobal = hist_items[index].mGlobalPos;
+ mPlaceProfile->setInfoType(LLPanelPlaceInfo::TELEPORT_HISTORY);
+ mPlaceProfile->displayParcelInfo(LLUUID(), mPosGlobal);
+ }
- mPlaceProfile->setInfoType(LLPanelPlaceInfo::TELEPORT_HISTORY);
- mPlaceProfile->displayParcelInfo(LLUUID(), mPosGlobal);
+ updateVerbs();
}
-
- updateVerbs();
}
LLViewerParcelMgr* parcel_mgr = LLViewerParcelMgr::getInstance();
@@ -497,8 +525,6 @@ void LLPanelPlaces::setItem(LLInventoryItem* item)
mEditBtn->setEnabled(is_landmark_editable);
mSaveBtn->setEnabled(is_landmark_editable);
- mCloseBtn->setEnabled(TRUE);
- mLandmarkInfoBackBtn->setEnabled(TRUE);
if (is_landmark_editable)
{
@@ -586,6 +612,13 @@ void LLPanelPlaces::onTeleportButtonClicked()
{
if (mPlaceInfoType == LANDMARK_INFO_TYPE)
{
+ if (mItem.isNull())
+ {
+ llwarns << "NULL landmark item" << llendl;
+ llassert(mItem.notNull());
+ return;
+ }
+
LLSD payload;
payload["asset_id"] = mItem->getAssetUUID();
LLSD args;
@@ -762,6 +795,11 @@ void LLPanelPlaces::onOverflowButtonClicked()
// there is no landmark already pointing to that parcel in agent's inventory.
menu->getChild<LLMenuItemCallGL>("landmark")->setEnabled(is_agent_place_info_visible &&
!LLLandmarkActions::landmarkAlreadyExists());
+ // STORM-411
+ // Creating landmarks for remote locations is impossible.
+ // So hide menu item "Make a Landmark" in "Teleport History Profile" panel.
+ menu->setItemVisible("landmark", mPlaceInfoType != TELEPORT_HISTORY_INFO_TYPE);
+ menu->arrangeAndClear();
}
else if (mPlaceInfoType == LANDMARK_INFO_TYPE && mLandmarkMenu != NULL)
{
@@ -783,16 +821,7 @@ void LLPanelPlaces::onOverflowButtonClicked()
return;
}
- if (!menu->toggleVisibility())
- return;
-
- if (menu->getButtonRect().isEmpty())
- {
- menu->setButtonRect(mOverflowBtn);
- }
- menu->updateParent(LLMenuGL::sMenuContainer);
- LLRect rect = mOverflowBtn->getRect();
- LLMenuGL::showPopup(this, menu, rect.mRight, rect.mTop);
+ mOverflowBtn->setMenu(menu, LLMenuButton::MP_TOP_RIGHT);
}
void LLPanelPlaces::onProfileButtonClicked()
@@ -935,7 +964,8 @@ void LLPanelPlaces::togglePlaceInfoPanel(BOOL visible)
}
}
else if (mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE ||
- mPlaceInfoType == LANDMARK_INFO_TYPE)
+ mPlaceInfoType == LANDMARK_INFO_TYPE ||
+ mPlaceInfoType == LANDMARK_TAB_INFO_TYPE)
{
mLandmarkInfo->setVisible(visible);
@@ -953,13 +983,15 @@ void LLPanelPlaces::togglePlaceInfoPanel(BOOL visible)
{
LLLandmarksPanel* landmarks_panel =
dynamic_cast<LLLandmarksPanel*>(mTabContainer->getPanelByName("Landmarks"));
- if (landmarks_panel && mItem.notNull())
+ if (landmarks_panel)
{
// If a landmark info is being closed we open the landmarks tab
// and set this landmark selected.
mTabContainer->selectTabPanel(landmarks_panel);
-
- landmarks_panel->setItemSelected(mItem->getUUID(), TRUE);
+ if (mItem.notNull())
+ {
+ landmarks_panel->setItemSelected(mItem->getUUID(), TRUE);
+ }
}
}
}
@@ -1024,7 +1056,7 @@ void LLPanelPlaces::changedParcelSelection()
void LLPanelPlaces::createTabs()
{
- if (!(gInventory.isInventoryUsable() && LLTeleportHistory::getInstance()))
+ if (!(gInventory.isInventoryUsable() && LLTeleportHistory::getInstance() && !mTabsCreated))
return;
LLLandmarksPanel* landmarks_panel = new LLLandmarksPanel();
@@ -1058,6 +1090,8 @@ void LLPanelPlaces::createTabs()
// Filter applied to show all items.
if (mActivePanel)
mActivePanel->onSearchEdit(mActivePanel->getFilterSubString());
+
+ mTabsCreated = true;
}
void LLPanelPlaces::changedGlobalPos(const LLVector3d &global_pos)
@@ -1137,13 +1171,6 @@ void LLPanelPlaces::updateVerbs()
{
mTeleportBtn->setEnabled(have_3d_pos);
}
-
- // Do not enable landmark info Back button when we are waiting
- // for newly created landmark to load.
- if (!is_create_landmark_visible)
- {
- mLandmarkInfoBackBtn->setEnabled(TRUE);
- }
}
else
{
@@ -1161,7 +1188,8 @@ LLPanelPlaceInfo* LLPanelPlaces::getCurrentInfoPanel()
return mPlaceProfile;
}
else if (mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE ||
- mPlaceInfoType == LANDMARK_INFO_TYPE)
+ mPlaceInfoType == LANDMARK_INFO_TYPE ||
+ mPlaceInfoType == LANDMARK_TAB_INFO_TYPE)
{
return mLandmarkInfo;
}
diff --git a/indra/newview/llpanelplaces.h b/indra/newview/llpanelplaces.h
index c3b2ab806f..85bdc2c4e1 100644
--- a/indra/newview/llpanelplaces.h
+++ b/indra/newview/llpanelplaces.h
@@ -47,6 +47,7 @@ class LLPlacesParcelObserver;
class LLRemoteParcelInfoObserver;
class LLTabContainer;
class LLToggleableMenu;
+class LLMenuButton;
typedef std::pair<LLUUID, std::string> folder_pair_t;
@@ -76,6 +77,8 @@ public:
std::string getPlaceInfoType() { return mPlaceInfoType; }
+ bool tabsCreated() { return mTabsCreated;}
+
/*virtual*/ S32 notifyParent(const LLSD& info);
private:
@@ -116,14 +119,13 @@ private:
LLToggleableMenu* mLandmarkMenu;
LLButton* mPlaceProfileBackBtn;
- LLButton* mLandmarkInfoBackBtn;
LLButton* mTeleportBtn;
LLButton* mShowOnMapBtn;
LLButton* mEditBtn;
LLButton* mSaveBtn;
LLButton* mCancelBtn;
LLButton* mCloseBtn;
- LLButton* mOverflowBtn;
+ LLMenuButton* mOverflowBtn;
LLButton* mPlaceInfoBtn;
LLPlacesInventoryObserver* mInventoryObserver;
@@ -146,7 +148,12 @@ private:
bool isLandmarkEditModeOn;
+ // Holds info whether "My Landmarks" and "Teleport History" tabs have been created.
+ bool mTabsCreated;
+
LLSafeHandle<LLParcelSelection> mParcel;
+
+ boost::signals2::connection mAgentParcelChangedConnection;
};
#endif //LL_LLPANELPLACES_H
diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp
index b04971f980..76d38f067d 100644
--- a/indra/newview/llpanelprimmediacontrols.cpp
+++ b/indra/newview/llpanelprimmediacontrols.cpp
@@ -59,7 +59,9 @@
#include "llvovolume.h"
#include "llweb.h"
#include "llwindow.h"
+#include "llwindowshade.h"
#include "llfloatertools.h" // to enable hide if build tools are up
+#include "llvector4a.h"
// Functions pulled from pipeline.cpp
glh::matrix4f glh_get_current_modelview();
@@ -90,7 +92,9 @@ LLPanelPrimMediaControls::LLPanelPrimMediaControls() :
mTargetObjectNormal(LLVector3::zero),
mZoomObjectID(LLUUID::null),
mZoomObjectFace(0),
- mVolumeSliderVisible(0)
+ mVolumeSliderVisible(0),
+ mWindowShade(NULL),
+ mHideImmediately(false)
{
mCommitCallbackRegistrar.add("MediaCtrl.Close", boost::bind(&LLPanelPrimMediaControls::onClickClose, this));
mCommitCallbackRegistrar.add("MediaCtrl.Back", boost::bind(&LLPanelPrimMediaControls::onClickBack, this));
@@ -205,6 +209,11 @@ BOOL LLPanelPrimMediaControls::postBuild()
mMediaAddress->setFocusReceivedCallback(boost::bind(&LLPanelPrimMediaControls::onInputURL, _1, this ));
+ gAgent.setMouselookModeInCallback(boost::bind(&LLPanelPrimMediaControls::onMouselookModeIn, this));
+
+ LLWindowShade::Params window_shade_params;
+ window_shade_params.name = "window_shade";
+
mCurrentZoom = ZOOM_NONE;
// clicks on buttons do not remove keyboard focus from media
setIsChrome(TRUE);
@@ -519,7 +528,7 @@ void LLPanelPrimMediaControls::updateShape()
if(LLPluginClassMediaOwner::MEDIA_LOADING == media_plugin->getStatus())
{
mMediaProgressPanel->setVisible(true);
- mMediaProgressBar->setPercent(media_plugin->getProgressPercent());
+ mMediaProgressBar->setValue(media_plugin->getProgressPercent());
}
else
{
@@ -569,7 +578,9 @@ void LLPanelPrimMediaControls::updateShape()
{
const LLVolumeFace& vf = volume->getVolumeFace(mTargetObjectFace);
- const LLVector3* ext = vf.mExtents;
+ LLVector3 ext[2];
+ ext[0].set(vf.mExtents[0].getF32ptr());
+ ext[1].set(vf.mExtents[1].getF32ptr());
LLVector3 center = (ext[0]+ext[1])*0.5f;
LLVector3 size = (ext[1]-ext[0])*0.5f;
@@ -620,12 +631,12 @@ void LLPanelPrimMediaControls::updateShape()
// convert screenspace bbox to pixels (in screen coords)
LLRect window_rect = gViewerWindow->getWorldViewRectScaled();
LLCoordGL screen_min;
- screen_min.mX = llround((F32)window_rect.getWidth() * (min.mV[VX] + 1.f) * 0.5f);
- screen_min.mY = llround((F32)window_rect.getHeight() * (min.mV[VY] + 1.f) * 0.5f);
+ screen_min.mX = llround((F32)window_rect.mLeft + (F32)window_rect.getWidth() * (min.mV[VX] + 1.f) * 0.5f);
+ screen_min.mY = llround((F32)window_rect.mBottom + (F32)window_rect.getHeight() * (min.mV[VY] + 1.f) * 0.5f);
LLCoordGL screen_max;
- screen_max.mX = llround((F32)window_rect.getWidth() * (max.mV[VX] + 1.f) * 0.5f);
- screen_max.mY = llround((F32)window_rect.getHeight() * (max.mV[VY] + 1.f) * 0.5f);
+ screen_max.mX = llround((F32)window_rect.mLeft + (F32)window_rect.getWidth() * (max.mV[VX] + 1.f) * 0.5f);
+ screen_max.mY = llround((F32)window_rect.mBottom + (F32)window_rect.getHeight() * (max.mV[VY] + 1.f) * 0.5f);
// grow panel so that screenspace bounding box fits inside "media_region" element of panel
LLRect media_panel_rect;
@@ -698,27 +709,41 @@ void LLPanelPrimMediaControls::updateShape()
/*virtual*/
void LLPanelPrimMediaControls::draw()
{
+ LLViewerMediaImpl* impl = getTargetMediaImpl();
+ if (impl)
+ {
+ LLNotificationPtr notification = impl->getCurrentNotification();
+ if (notification != mActiveNotification)
+ {
+ mActiveNotification = notification;
+ if (notification)
+ {
+ showNotification(notification);
+ }
+ else
+ {
+ hideNotification();
+ }
+ }
+ }
+
F32 alpha = getDrawContext().mAlpha;
- if(mFadeTimer.getStarted())
+ if(mHideImmediately)
+ {
+ //hide this panel
+ clearFaceOnFade();
+
+ mHideImmediately = false;
+ }
+ else if(mFadeTimer.getStarted())
{
F32 time = mFadeTimer.getElapsedTimeF32();
alpha *= llmax(lerp(1.0, 0.0, time / mControlFadeTime), 0.0f);
if(time >= mControlFadeTime)
{
- if(mClearFaceOnFade)
- {
- // Hiding this object makes scroll events go missing after it fades out
- // (see DEV-41755 for a full description of the train wreck).
- // Only hide the controls when we're untargeting.
- setVisible(FALSE);
-
- mClearFaceOnFade = false;
- mVolumeSliderVisible = 0;
- mTargetImplID = LLUUID::null;
- mTargetObjectID = LLUUID::null;
- mTargetObjectFace = 0;
- }
+ //hide this panel
+ clearFaceOnFade();
}
}
@@ -793,7 +818,7 @@ bool LLPanelPrimMediaControls::isMouseOver()
LLCoordGL cursor_pos_gl;
S32 x, y;
getWindow()->getCursorPosition(&cursor_pos_window);
- getWindow()->convertCoords(cursor_pos_window, &cursor_pos_gl);
+ cursor_pos_gl = cursor_pos_window.convert();
if(mMediaControlsStack->getVisible())
{
@@ -1295,3 +1320,61 @@ bool LLPanelPrimMediaControls::shouldVolumeSliderBeVisible()
{
return mVolumeSliderVisible > 0;
}
+
+
+void LLPanelPrimMediaControls::clearFaceOnFade()
+{
+ if(mClearFaceOnFade)
+ {
+ // Hiding this object makes scroll events go missing after it fades out
+ // (see DEV-41755 for a full description of the train wreck).
+ // Only hide the controls when we're untargeting.
+ setVisible(FALSE);
+
+ mClearFaceOnFade = false;
+ mVolumeSliderVisible = 0;
+ mTargetImplID = LLUUID::null;
+ mTargetObjectID = LLUUID::null;
+ mTargetObjectFace = 0;
+ }
+}
+
+void LLPanelPrimMediaControls::onMouselookModeIn()
+{
+ LLViewerMediaFocus::getInstance()->clearHover();
+ mHideImmediately = true;
+}
+
+void LLPanelPrimMediaControls::showNotification(LLNotificationPtr notify)
+{
+ delete mWindowShade;
+ LLWindowShade::Params params;
+ params.rect = mMediaRegion->getLocalRect();
+ params.follows.flags = FOLLOWS_ALL;
+
+ //HACK: don't hardcode this
+ if (notify->getIcon() == "Popup_Caution")
+ {
+ params.bg_image.name = "Yellow_Gradient";
+ params.text_color = LLColor4::black;
+ }
+ else
+ {
+ //HACK: make this a property of the notification itself, "cancellable"
+ params.can_close = false;
+ params.text_color.control = "LabelTextColor";
+ }
+
+ mWindowShade = LLUICtrlFactory::create<LLWindowShade>(params);
+
+ mMediaRegion->addChild(mWindowShade);
+ mWindowShade->show(notify);
+}
+
+void LLPanelPrimMediaControls::hideNotification()
+{
+ if (mWindowShade)
+ {
+ mWindowShade->hide();
+ }
+}
diff --git a/indra/newview/llpanelprimmediacontrols.h b/indra/newview/llpanelprimmediacontrols.h
index 3ec24f0e24..eeb433e306 100644
--- a/indra/newview/llpanelprimmediacontrols.h
+++ b/indra/newview/llpanelprimmediacontrols.h
@@ -29,14 +29,16 @@
#include "llpanel.h"
#include "llviewermedia.h"
+#include "llnotificationptr.h"
+#include "llcoord.h"
class LLButton;
-class LLCoordWindow;
class LLIconCtrl;
class LLLayoutStack;
class LLProgressBar;
class LLSliderCtrl;
class LLViewerMediaImpl;
+class LLWindowShade;
class LLPanelPrimMediaControls : public LLPanel
{
@@ -54,6 +56,10 @@ public:
void updateShape();
bool isMouseOver();
+ void showNotification(LLNotificationPtr notify);
+ void hideNotification();
+
+
enum EZoomLevel
{
ZOOM_NONE = 0,
@@ -131,7 +137,11 @@ private:
LLPluginClassMedia* getTargetMediaPlugin();
private:
-
+
+ void clearFaceOnFade();
+
+ void onMouselookModeIn();
+
LLView *mMediaRegion;
LLUICtrl *mBackCtrl;
LLUICtrl *mFwdCtrl;
@@ -162,6 +172,7 @@ private:
LLUICtrl *mRightBookend;
LLUIImage* mBackgroundImage;
LLUIImage* mVolumeSliderBackgroundImage;
+ LLWindowShade* mWindowShade;
F32 mSkipStep;
S32 mMinWidth;
S32 mMinHeight;
@@ -179,6 +190,7 @@ private:
bool mPauseFadeout;
bool mUpdateSlider;
bool mClearFaceOnFade;
+ bool mHideImmediately;
LLMatrix4 mLastCameraMat;
EZoomLevel mCurrentZoom;
@@ -204,6 +216,8 @@ private:
S32 mZoomObjectFace;
S32 mVolumeSliderVisible;
+
+ LLNotificationPtr mActiveNotification;
};
#endif // LL_PANELPRIMMEDIACONTROLS_H
diff --git a/indra/newview/llpanelprofile.cpp b/indra/newview/llpanelprofile.cpp
index 4e63563979..e2e7006773 100644..100755
--- a/indra/newview/llpanelprofile.cpp
+++ b/indra/newview/llpanelprofile.cpp
@@ -31,11 +31,52 @@
#include "llavataractions.h"
#include "llfloaterreg.h"
#include "llcommandhandler.h"
+#include "llnotificationsutil.h"
#include "llpanelpicks.h"
#include "lltabcontainer.h"
+#include "llviewercontrol.h"
+#include "llviewernetwork.h"
static const std::string PANEL_PICKS = "panel_picks";
-static const std::string PANEL_PROFILE = "panel_profile";
+
+std::string getProfileURL(const std::string& agent_name)
+{
+ std::string url;
+
+ if (LLGridManager::getInstance()->isInProductionGrid())
+ {
+ url = gSavedSettings.getString("WebProfileURL");
+ }
+ else
+ {
+ url = gSavedSettings.getString("WebProfileNonProductionURL");
+ }
+ LLSD subs;
+ subs["AGENT_NAME"] = agent_name;
+ url = LLWeb::expandURLSubstitutions(url,subs);
+ LLStringUtil::toLower(url);
+ return url;
+}
+
+class LLProfileHandler : public LLCommandHandler
+{
+public:
+ // requires trusted browser to trigger
+ LLProfileHandler() : LLCommandHandler("profile", UNTRUSTED_THROTTLE) { }
+
+ bool handle(const LLSD& params, const LLSD& query_map,
+ LLMediaCtrl* web)
+ {
+ if (params.size() < 1) return false;
+ std::string agent_name = params[0];
+ llinfos << "Profile, agent_name " << agent_name << llendl;
+ std::string url = getProfileURL(agent_name);
+ LLWeb::loadURLInternal(url);
+
+ return true;
+ }
+};
+LLProfileHandler gProfileHandler;
class LLAgentHandler : public LLCommandHandler
{
@@ -74,6 +115,12 @@ public:
if (verb == "pay")
{
+ if (!LLUI::sSettingGroups["config"]->getBOOL("EnableAvatarPay"))
+ {
+ LLNotificationsUtil::add("NoAvatarPay", LLSD(), LLSD(), std::string("SwitchToStandardSkinAndQuit"));
+ return true;
+ }
+
LLAvatarActions::pay(avatar_id);
return true;
}
@@ -114,42 +161,149 @@ public:
LLAgentHandler gAgentHandler;
+//-- LLPanelProfile::ChildStack begins ----------------------------------------
+LLPanelProfile::ChildStack::ChildStack()
+: mParent(NULL)
+{
+}
+
+LLPanelProfile::ChildStack::~ChildStack()
+{
+ while (mStack.size() != 0)
+ {
+ view_list_t& top = mStack.back();
+ for (view_list_t::const_iterator it = top.begin(); it != top.end(); ++it)
+ {
+ LLView* viewp = *it;
+ if (viewp)
+ {
+ viewp->die();
+ }
+ }
+ mStack.pop_back();
+ }
+}
+
+void LLPanelProfile::ChildStack::setParent(LLPanel* parent)
+{
+ llassert_always(parent != NULL);
+ mParent = parent;
+}
+
+/// Save current parent's child views and remove them from the child list.
+bool LLPanelProfile::ChildStack::push()
+{
+ view_list_t vlist = *mParent->getChildList();
+
+ for (view_list_t::const_iterator it = vlist.begin(); it != vlist.end(); ++it)
+ {
+ LLView* viewp = *it;
+ mParent->removeChild(viewp);
+ }
+
+ mStack.push_back(vlist);
+ dump();
+ return true;
+}
+
+/// Restore saved children (adding them back to the child list).
+bool LLPanelProfile::ChildStack::pop()
+{
+ if (mStack.size() == 0)
+ {
+ llwarns << "Empty stack" << llendl;
+ llassert(mStack.size() == 0);
+ return false;
+ }
+
+ view_list_t& top = mStack.back();
+ for (view_list_t::const_iterator it = top.begin(); it != top.end(); ++it)
+ {
+ LLView* viewp = *it;
+ mParent->addChild(viewp);
+ }
+
+ mStack.pop_back();
+ dump();
+ return true;
+}
+
+/// Temporarily add all saved children back.
+void LLPanelProfile::ChildStack::preParentReshape()
+{
+ mSavedStack = mStack;
+ while(mStack.size() > 0)
+ {
+ pop();
+ }
+}
+
+/// Add the temporarily saved children back.
+void LLPanelProfile::ChildStack::postParentReshape()
+{
+ mStack = mSavedStack;
+ mSavedStack = stack_t();
+
+ for (stack_t::const_iterator stack_it = mStack.begin(); stack_it != mStack.end(); ++stack_it)
+ {
+ const view_list_t& vlist = (*stack_it);
+ for (view_list_t::const_iterator list_it = vlist.begin(); list_it != vlist.end(); ++list_it)
+ {
+ LLView* viewp = *list_it;
+ lldebugs << "removing " << viewp->getName() << llendl;
+ mParent->removeChild(viewp);
+ }
+ }
+}
+
+void LLPanelProfile::ChildStack::dump()
+{
+ unsigned lvl = 0;
+ lldebugs << "child stack dump:" << llendl;
+ for (stack_t::const_iterator stack_it = mStack.begin(); stack_it != mStack.end(); ++stack_it, ++lvl)
+ {
+ std::ostringstream dbg_line;
+ dbg_line << "lvl #" << lvl << ":";
+ const view_list_t& vlist = (*stack_it);
+ for (view_list_t::const_iterator list_it = vlist.begin(); list_it != vlist.end(); ++list_it)
+ {
+ dbg_line << " " << (*list_it)->getName();
+ }
+ lldebugs << dbg_line.str() << llendl;
+ }
+}
+
+//-- LLPanelProfile::ChildStack ends ------------------------------------------
+
LLPanelProfile::LLPanelProfile()
: LLPanel()
- , mTabCtrl(NULL)
, mAvatarId(LLUUID::null)
{
+ mChildStack.setParent(this);
}
BOOL LLPanelProfile::postBuild()
{
- mTabCtrl = getChild<LLTabContainer>("tabs");
-
- getTabCtrl()->setCommitCallback(boost::bind(&LLPanelProfile::onTabSelected, this, _2));
-
LLPanelPicks* panel_picks = findChild<LLPanelPicks>(PANEL_PICKS);
panel_picks->setProfilePanel(this);
getTabContainer()[PANEL_PICKS] = panel_picks;
- getTabContainer()[PANEL_PROFILE] = findChild<LLPanelAvatarProfile>(PANEL_PROFILE);
return TRUE;
}
-void LLPanelProfile::onOpen(const LLSD& key)
+// virtual
+void LLPanelProfile::reshape(S32 width, S32 height, BOOL called_from_parent)
{
- // open the desired panel
- if (key.has("open_tab_name"))
- {
- getTabContainer()[PANEL_PICKS]->onClosePanel();
+ // Temporarily add saved children back and reshape them.
+ mChildStack.preParentReshape();
+ LLPanel::reshape(width, height, called_from_parent);
+ mChildStack.postParentReshape();
+}
- // onOpen from selected panel will be called from onTabSelected callback
- getTabCtrl()->selectTabByName(key["open_tab_name"]);
- }
- else
- {
- getTabCtrl()->getCurrentPanel()->onOpen(getAvatarId());
- }
+void LLPanelProfile::onOpen(const LLSD& key)
+{
+ getTabContainer()[PANEL_PICKS]->onOpen(getAvatarId());
// support commands to open further pieces of UI
if (key.has("show_tab_panel"))
@@ -174,24 +328,36 @@ void LLPanelProfile::onOpen(const LLSD& key)
picks->openClassifiedInfo(params);
}
}
- }
-}
-
-//*TODO redo panel toggling
-void LLPanelProfile::togglePanel(LLPanel* panel, const LLSD& key)
-{
- // TRUE - we need to open/expand "panel"
- bool expand = getChildList()->front() != panel; // mTabCtrl->getVisible();
-
- if (expand)
- {
- openPanel(panel, key);
- }
- else
- {
- closePanel(panel);
-
- getTabCtrl()->getCurrentPanel()->onOpen(getAvatarId());
+ else if (panel == "edit_classified")
+ {
+ LLPanelPicks* picks = dynamic_cast<LLPanelPicks *>(getTabContainer()[PANEL_PICKS]);
+ if (picks)
+ {
+ LLSD params = key;
+ params.erase("show_tab_panel");
+ params.erase("open_tab_name");
+ picks->openClassifiedEdit(params);
+ }
+ }
+ else if (panel == "create_pick")
+ {
+ LLPanelPicks* picks = dynamic_cast<LLPanelPicks *>(getTabContainer()[PANEL_PICKS]);
+ if (picks)
+ {
+ picks->createNewPick();
+ }
+ }
+ else if (panel == "edit_pick")
+ {
+ LLPanelPicks* picks = dynamic_cast<LLPanelPicks *>(getTabContainer()[PANEL_PICKS]);
+ if (picks)
+ {
+ LLSD params = key;
+ params.erase("show_tab_panel");
+ params.erase("open_tab_name");
+ picks->openPickEdit(params);
+ }
+ }
}
}
@@ -204,19 +370,12 @@ void LLPanelProfile::onTabSelected(const LLSD& param)
}
}
-void LLPanelProfile::setAllChildrenVisible(BOOL visible)
-{
- const child_list_t* child_list = getChildList();
- child_list_const_iter_t child_it = child_list->begin();
- for (; child_it != child_list->end(); ++child_it)
- {
- LLView* viewp = *child_it;
- viewp->setVisible(visible);
- }
-}
-
void LLPanelProfile::openPanel(LLPanel* panel, const LLSD& params)
{
+ // Hide currently visible panel (STORM-690).
+ mChildStack.push();
+
+ // Add the panel or bring it to front.
if (panel->getParent() != this)
{
addChild(panel);
@@ -227,7 +386,7 @@ void LLPanelProfile::openPanel(LLPanel* panel, const LLSD& params)
}
panel->setVisible(TRUE);
-
+ panel->setFocus(TRUE); // prevent losing focus by the floater
panel->onOpen(params);
LLRect new_rect = getRect();
@@ -243,6 +402,20 @@ void LLPanelProfile::closePanel(LLPanel* panel)
if (panel->getParent() == this)
{
removeChild(panel);
+
+ // Make the underlying panel visible.
+ mChildStack.pop();
+
+ // Prevent losing focus by the floater
+ const child_list_t* child_list = getChildList();
+ if (child_list->size() > 0)
+ {
+ child_list->front()->setFocus(TRUE);
+ }
+ else
+ {
+ llwarns << "No underlying panel to focus." << llendl;
+ }
}
}
diff --git a/indra/newview/llpanelprofile.h b/indra/newview/llpanelprofile.h
index d2bcee8076..d97f60ed22 100644..100755
--- a/indra/newview/llpanelprofile.h
+++ b/indra/newview/llpanelprofile.h
@@ -32,6 +32,8 @@
class LLTabContainer;
+std::string getProfileURL(const std::string& agent_name);
+
/**
* Base class for Profile View and My Profile.
*/
@@ -41,11 +43,9 @@ class LLPanelProfile : public LLPanel
public:
/*virtual*/ BOOL postBuild();
-
+ /*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
/*virtual*/ void onOpen(const LLSD& key);
- virtual void togglePanel(LLPanel*, const LLSD& key = LLSD());
-
virtual void openPanel(LLPanel* panel, const LLSD& params);
virtual void closePanel(LLPanel* panel);
@@ -58,10 +58,6 @@ protected:
virtual void onTabSelected(const LLSD& param);
- virtual void setAllChildrenVisible(BOOL visible);
-
- LLTabContainer* getTabCtrl() { return mTabCtrl; }
-
const LLUUID& getAvatarId() { return mAvatarId; }
void setAvatarId(const LLUUID& avatar_id) { mAvatarId = avatar_id; }
@@ -72,8 +68,34 @@ protected:
private:
- LLTabContainer* mTabCtrl;
+ //-- ChildStack begins ----------------------------------------------------
+ class ChildStack
+ {
+ LOG_CLASS(LLPanelProfile::ChildStack);
+ public:
+ ChildStack();
+ ~ChildStack();
+ void setParent(LLPanel* parent);
+
+ bool push();
+ bool pop();
+ void preParentReshape();
+ void postParentReshape();
+
+ private:
+ void dump();
+
+ typedef LLView::child_list_t view_list_t;
+ typedef std::list<view_list_t> stack_t;
+
+ stack_t mStack;
+ stack_t mSavedStack;
+ LLPanel* mParent;
+ };
+ //-- ChildStack ends ------------------------------------------------------
+
profile_tabs_t mTabContainer;
+ ChildStack mChildStack;
LLUUID mAvatarId;
};
diff --git a/indra/newview/llpanelprofileview.cpp b/indra/newview/llpanelprofileview.cpp
deleted file mode 100644
index 7635aedf58..0000000000
--- a/indra/newview/llpanelprofileview.cpp
+++ /dev/null
@@ -1,247 +0,0 @@
-/**
-* @file llpanelprofileview.cpp
-* @brief Side tray "Profile View" panel
-*
-* $LicenseInfo:firstyear=2009&license=viewerlgpl$
-* Second Life Viewer Source Code
-* Copyright (C) 2010, Linden Research, Inc.
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU Lesser General Public
-* License as published by the Free Software Foundation;
-* version 2.1 of the License only.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-* Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public
-* License along with this library; if not, write to the Free Software
-* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-*
-* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
-* $/LicenseInfo$
-*/
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llpanelprofileview.h"
-
-#include "llavatarconstants.h"
-#include "llavatarnamecache.h" // IDEVO
-#include "llclipboard.h"
-#include "lluserrelations.h"
-
-#include "llavatarpropertiesprocessor.h"
-#include "llcallingcard.h"
-#include "llpanelavatar.h"
-#include "llpanelpicks.h"
-#include "llpanelprofile.h"
-#include "llsidetraypanelcontainer.h"
-
-static LLRegisterPanelClassWrapper<LLPanelProfileView> t_panel_target_profile("panel_profile_view");
-
-static std::string PANEL_NOTES = "panel_notes";
-static const std::string PANEL_PROFILE = "panel_profile";
-static const std::string PANEL_PICKS = "panel_picks";
-
-
-class AvatarStatusObserver : public LLAvatarPropertiesObserver
-{
-public:
- AvatarStatusObserver(LLPanelProfileView* profile_view)
- {
- mProfileView = profile_view;
- }
-
- void processProperties(void* data, EAvatarProcessorType type)
- {
- if(APT_PROPERTIES != type) return;
- const LLAvatarData* avatar_data = static_cast<const LLAvatarData*>(data);
- if(avatar_data && mProfileView->getAvatarId() == avatar_data->avatar_id)
- {
- mProfileView->processOnlineStatus(avatar_data->flags & AVATAR_ONLINE);
- LLAvatarPropertiesProcessor::instance().removeObserver(mProfileView->getAvatarId(), this);
- }
- }
-
- void subscribe()
- {
- LLAvatarPropertiesProcessor::instance().addObserver(mProfileView->getAvatarId(), this);
- }
-
-private:
- LLPanelProfileView* mProfileView;
-};
-
-LLPanelProfileView::LLPanelProfileView()
-: LLPanelProfile()
-, mStatusText(NULL)
-, mAvatarStatusObserver(NULL)
-{
- mAvatarStatusObserver = new AvatarStatusObserver(this);
-}
-
-LLPanelProfileView::~LLPanelProfileView(void)
-{
- delete mAvatarStatusObserver;
-}
-
-/*virtual*/
-void LLPanelProfileView::onOpen(const LLSD& key)
-{
- LLUUID id;
- if(key.has("id"))
- {
- id = key["id"];
- }
-
- if(id.notNull() && getAvatarId() != id)
- {
- setAvatarId(id);
-
- // clear name fields, which might have old data
- getChild<LLUICtrl>("user_name")->setValue( LLSD() );
- getChild<LLUICtrl>("user_slid")->setValue( LLSD() );
- }
-
- // Update the avatar name.
- LLAvatarNameCache::get(getAvatarId(),
- boost::bind(&LLPanelProfileView::onAvatarNameCache, this, _1, _2));
-
- updateOnlineStatus();
-
-
- LLPanelProfile::onOpen(key);
-}
-
-BOOL LLPanelProfileView::postBuild()
-{
- LLPanelProfile::postBuild();
-
- getTabContainer()[PANEL_NOTES] = findChild<LLPanelAvatarNotes>(PANEL_NOTES);
-
- //*TODO remove this, according to style guide we don't use status combobox
- getTabContainer()[PANEL_PROFILE]->getChildView("online_me_status_text")->setVisible( FALSE);
- getTabContainer()[PANEL_PROFILE]->getChildView("status_combo")->setVisible( FALSE);
-
- mStatusText = getChild<LLTextBox>("status");
- mStatusText->setVisible(false);
-
- childSetCommitCallback("back",boost::bind(&LLPanelProfileView::onBackBtnClick,this),NULL);
- childSetCommitCallback("copy_to_clipboard",boost::bind(&LLPanelProfileView::onCopyToClipboard,this),NULL);
-
- return TRUE;
-}
-
-
-//private
-
-void LLPanelProfileView::onBackBtnClick()
-{
- // Set dummy value to make picks panel dirty,
- // This will make Picks reload on next open.
- getTabContainer()[PANEL_PICKS]->setValue(LLSD());
-
- LLSideTrayPanelContainer* parent = dynamic_cast<LLSideTrayPanelContainer*>(getParent());
- if(parent)
- {
- parent->openPreviousPanel();
- }
-}
-
-void LLPanelProfileView::onCopyToClipboard()
-{
- std::string name = getChild<LLUICtrl>("user_name")->getValue().asString() + " (" + getChild<LLUICtrl>("user_slid")->getValue().asString() + ")";
- gClipboard.copyFromString(utf8str_to_wstring(name));
-}
-
-bool LLPanelProfileView::isGrantedToSeeOnlineStatus()
-{
- const LLRelationship* relationship = LLAvatarTracker::instance().getBuddyInfo(getAvatarId());
- if (NULL == relationship)
- return false;
-
- // *NOTE: GRANT_ONLINE_STATUS is always set to false while changing any other status.
- // When avatar disallow me to see her online status processOfflineNotification Message is received by the viewer
- // see comments for ChangeUserRights template message. EXT-453.
- // If GRANT_ONLINE_STATUS flag is changed it will be applied when viewer restarts. EXT-3880
- return relationship->isRightGrantedFrom(LLRelationship::GRANT_ONLINE_STATUS);
-}
-
-// method was disabled according to EXT-2022. Re-enabled & improved according to EXT-3880
-void LLPanelProfileView::updateOnlineStatus()
-{
- // set text box visible to show online status for non-friends who has not set in Preferences
- // "Only Friends & Groups can see when I am online"
- mStatusText->setVisible(TRUE);
-
- const LLRelationship* relationship = LLAvatarTracker::instance().getBuddyInfo(getAvatarId());
- if (NULL == relationship)
- {
- // this is non-friend avatar. Status will be updated from LLAvatarPropertiesProcessor.
- // in LLPanelProfileView::processOnlineStatus()
-
- // subscribe observer to get online status. Request will be sent by LLPanelAvatarProfile itself.
- // do not subscribe for friend avatar because online status can be wrong overridden
- // via LLAvatarData::flags if Preferences: "Only Friends & Groups can see when I am online" is set.
- mAvatarStatusObserver->subscribe();
- return;
- }
- // For friend let check if he allowed me to see his status
-
- // status should only show if viewer has permission to view online/offline. EXT-453, EXT-3880
- mStatusText->setVisible(isGrantedToSeeOnlineStatus());
-
- bool online = relationship->isOnline();
- processOnlineStatus(online);
-}
-
-void LLPanelProfileView::processOnlineStatus(bool online)
-{
- std::string status = getString(online ? "status_online" : "status_offline");
-
- mStatusText->setValue(status);
-}
-
-void LLPanelProfileView::onAvatarNameCache(const LLUUID& agent_id,
- const LLAvatarName& av_name)
-{
- getChild<LLUICtrl>("user_name")->setValue( av_name.mDisplayName );
- getChild<LLUICtrl>("user_name_small")->setValue( av_name.mDisplayName );
- getChild<LLUICtrl>("user_slid")->setValue( av_name.mUsername );
-
- // show smaller display name if too long to display in regular size
- if (getChild<LLTextBox>("user_name")->getTextPixelWidth() > getChild<LLTextBox>("user_name")->getRect().getWidth())
- {
- getChild<LLUICtrl>("user_name_small")->setVisible( true );
- getChild<LLUICtrl>("user_name")->setVisible( false );
- }
- else
- {
- getChild<LLUICtrl>("user_name_small")->setVisible( false );
- getChild<LLUICtrl>("user_name")->setVisible( true );
- }
-
- if (LLAvatarNameCache::useDisplayNames())
- {
- getChild<LLUICtrl>("user_label")->setVisible( true );
- getChild<LLUICtrl>("user_slid")->setVisible( true );
- getChild<LLUICtrl>("display_name_label")->setVisible( true );
- getChild<LLUICtrl>("copy_to_clipboard")->setVisible( true );
- getChild<LLUICtrl>("copy_to_clipboard")->setEnabled( true );
- getChild<LLUICtrl>("solo_username_label")->setVisible( false );
- }
- else
- {
- getChild<LLUICtrl>("user_label")->setVisible( false );
- getChild<LLUICtrl>("user_slid")->setVisible( false );
- getChild<LLUICtrl>("display_name_label")->setVisible( false );
- getChild<LLUICtrl>("copy_to_clipboard")->setVisible( false );
- getChild<LLUICtrl>("copy_to_clipboard")->setEnabled( false );
- getChild<LLUICtrl>("solo_username_label")->setVisible( true );
- }
-}
-
-// EOF
diff --git a/indra/newview/llpanelprofileview.h b/indra/newview/llpanelprofileview.h
deleted file mode 100644
index c6d921fdc4..0000000000
--- a/indra/newview/llpanelprofileview.h
+++ /dev/null
@@ -1,108 +0,0 @@
-/**
-* @file llpanelprofileview.h
-* @brief Side tray "Profile View" panel
-*
-* $LicenseInfo:firstyear=2009&license=viewerlgpl$
-* Second Life Viewer Source Code
-* Copyright (C) 2010, Linden Research, Inc.
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU Lesser General Public
-* License as published by the Free Software Foundation;
-* version 2.1 of the License only.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-* Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public
-* License along with this library; if not, write to the Free Software
-* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-*
-* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
-* $/LicenseInfo$
-*/
-
-#ifndef LL_LLPANELPROFILEVIEW_H
-#define LL_LLPANELPROFILEVIEW_H
-
-#include "llpanel.h"
-#include "llpanelprofile.h"
-#include "llavatarpropertiesprocessor.h"
-#include "llagent.h"
-#include "lltooldraganddrop.h"
-
-class LLAvatarName;
-class LLPanelProfile;
-class LLPanelProfileTab;
-class LLTextBox;
-class AvatarStatusObserver;
-
-/**
-* Panel for displaying Avatar's profile. It consists of three sub panels - Profile,
-* Picks and Notes.
-*/
-class LLPanelProfileView : public LLPanelProfile
-{
- LOG_CLASS(LLPanelProfileView);
- friend class LLUICtrlFactory;
- friend class AvatarStatusObserver;
-
-public:
-
- LLPanelProfileView();
-
- /*virtual*/ ~LLPanelProfileView();
-
- /*virtual*/ void onOpen(const LLSD& key);
-
- /*virtual*/ BOOL postBuild();
-
- BOOL handleDragAndDrop(S32 x, S32 y, MASK mask,
- BOOL drop, EDragAndDropType cargo_type,
- void *cargo_data, EAcceptance *accept,
- std::string& tooltip_msg)
- {
- LLToolDragAndDrop::handleGiveDragAndDrop(getAvatarId(), gAgent.getSessionID(), drop,
- cargo_type, cargo_data, accept);
-
- return TRUE;
- }
-
-
-protected:
-
- void onBackBtnClick();
- void onCopyToClipboard();
- bool isGrantedToSeeOnlineStatus();
-
- /**
- * Displays avatar's online status if possible.
- *
- * Requirements from EXT-3880:
- * For friends:
- * - Online when online and privacy settings allow to show
- * - Offline when offline and privacy settings allow to show
- * - Else: nothing
- * For other avatars:
- * - Online when online and was not set in Preferences/"Only Friends & Groups can see when I am online"
- * - Else: Offline
- */
- void updateOnlineStatus();
- void processOnlineStatus(bool online);
-
-private:
- // LLCacheName will call this function when avatar name is loaded from server.
- // This is required to display names that have not been cached yet.
-// void onNameCache(
-// const LLUUID& id,
-// const std::string& full_name,
-// bool is_group);
- void onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name);
-
- LLTextBox* mStatusText;
- AvatarStatusObserver* mAvatarStatusObserver;
-};
-
-#endif //LL_LLPANELPROFILEVIEW_H
diff --git a/indra/newview/llpanelsnapshot.cpp b/indra/newview/llpanelsnapshot.cpp
new file mode 100644
index 0000000000..2f29e758c6
--- /dev/null
+++ b/indra/newview/llpanelsnapshot.cpp
@@ -0,0 +1,201 @@
+/**
+ * @file llpanelsnapshot.cpp
+ * @brief Snapshot panel base class
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llpanelsnapshot.h"
+
+// libs
+#include "llcombobox.h"
+#include "llsliderctrl.h"
+#include "llspinctrl.h"
+#include "lltrans.h"
+
+// newview
+#include "llsidetraypanelcontainer.h"
+#include "llviewercontrol.h" // gSavedSettings
+
+// virtual
+BOOL LLPanelSnapshot::postBuild()
+{
+ getChild<LLUICtrl>(getImageSizeComboName())->setCommitCallback(boost::bind(&LLPanelSnapshot::onResolutionComboCommit, this, _1));
+ getChild<LLUICtrl>(getWidthSpinnerName())->setCommitCallback(boost::bind(&LLPanelSnapshot::onCustomResolutionCommit, this));
+ getChild<LLUICtrl>(getHeightSpinnerName())->setCommitCallback(boost::bind(&LLPanelSnapshot::onCustomResolutionCommit, this));
+ getChild<LLUICtrl>(getAspectRatioCBName())->setCommitCallback(boost::bind(&LLPanelSnapshot::onKeepAspectRatioCommit, this, _1));
+
+ updateControls(LLSD());
+ return TRUE;
+}
+
+// virtual
+void LLPanelSnapshot::onOpen(const LLSD& key)
+{
+ S32 old_format = gSavedSettings.getS32("SnapshotFormat");
+ S32 new_format = (S32) getImageFormat();
+
+ gSavedSettings.setS32("SnapshotFormat", new_format);
+ setCtrlsEnabled(true);
+
+ // Switching panels will likely change image format.
+ // Not updating preview right away may lead to errors,
+ // e.g. attempt to send a large BMP image by email.
+ if (old_format != new_format)
+ {
+ LLFloaterSnapshot::getInstance()->notify(LLSD().with("image-format-change", true));
+ }
+
+ updateCustomResControls();
+}
+
+LLFloaterSnapshot::ESnapshotFormat LLPanelSnapshot::getImageFormat() const
+{
+ return LLFloaterSnapshot::SNAPSHOT_FORMAT_JPEG;
+}
+
+void LLPanelSnapshot::enableControls(BOOL enable)
+{
+ setCtrlsEnabled(enable);
+ if (enable)
+ {
+ // Make sure only relevant controls are enabled/shown.
+ updateCustomResControls();
+ }
+}
+
+LLSpinCtrl* LLPanelSnapshot::getWidthSpinner()
+{
+ return getChild<LLSpinCtrl>(getWidthSpinnerName());
+}
+
+LLSpinCtrl* LLPanelSnapshot::getHeightSpinner()
+{
+ return getChild<LLSpinCtrl>(getHeightSpinnerName());
+}
+
+S32 LLPanelSnapshot::getTypedPreviewWidth() const
+{
+ return getChild<LLUICtrl>(getWidthSpinnerName())->getValue().asInteger();
+}
+
+S32 LLPanelSnapshot::getTypedPreviewHeight() const
+{
+ return getChild<LLUICtrl>(getHeightSpinnerName())->getValue().asInteger();
+}
+
+void LLPanelSnapshot::enableAspectRatioCheckbox(BOOL enable)
+{
+ getChild<LLUICtrl>(getAspectRatioCBName())->setEnabled(enable);
+}
+
+LLSideTrayPanelContainer* LLPanelSnapshot::getParentContainer()
+{
+ LLSideTrayPanelContainer* parent = dynamic_cast<LLSideTrayPanelContainer*>(getParent());
+ if (!parent)
+ {
+ llwarns << "Cannot find panel container" << llendl;
+ return NULL;
+ }
+
+ return parent;
+}
+
+// virtual
+void LLPanelSnapshot::updateCustomResControls()
+{
+ // Only show width/height spinners and the aspect ratio checkbox
+ // when a custom resolution is chosen.
+ LLComboBox* combo = getChild<LLComboBox>(getImageSizeComboName());
+ const bool show = combo->getFirstSelectedIndex() == (combo->getItemCount() - 1);
+ getChild<LLUICtrl>(getImageSizePanelName())->setVisible(show);
+}
+
+void LLPanelSnapshot::updateImageQualityLevel()
+{
+ LLSliderCtrl* quality_slider = getChild<LLSliderCtrl>("image_quality_slider");
+ S32 quality_val = llfloor((F32) quality_slider->getValue().asReal());
+
+ std::string quality_lvl;
+
+ if (quality_val < 20)
+ {
+ quality_lvl = LLTrans::getString("snapshot_quality_very_low");
+ }
+ else if (quality_val < 40)
+ {
+ quality_lvl = LLTrans::getString("snapshot_quality_low");
+ }
+ else if (quality_val < 60)
+ {
+ quality_lvl = LLTrans::getString("snapshot_quality_medium");
+ }
+ else if (quality_val < 80)
+ {
+ quality_lvl = LLTrans::getString("snapshot_quality_high");
+ }
+ else
+ {
+ quality_lvl = LLTrans::getString("snapshot_quality_very_high");
+ }
+
+ getChild<LLTextBox>("image_quality_level")->setTextArg("[QLVL]", quality_lvl);
+}
+
+void LLPanelSnapshot::goBack()
+{
+ LLSideTrayPanelContainer* parent = getParentContainer();
+ if (parent)
+ {
+ parent->openPreviousPanel();
+ parent->getCurrentPanel()->onOpen(LLSD());
+ }
+}
+
+void LLPanelSnapshot::cancel()
+{
+ goBack();
+ LLFloaterSnapshot::getInstance()->notify(LLSD().with("set-ready", true));
+}
+
+void LLPanelSnapshot::onCustomResolutionCommit()
+{
+ LLSD info;
+ info["w"] = getChild<LLUICtrl>(getWidthSpinnerName())->getValue().asInteger();
+ info["h"] = getChild<LLUICtrl>(getHeightSpinnerName())->getValue().asInteger();
+ LLFloaterSnapshot::getInstance()->notify(LLSD().with("custom-res-change", info));
+}
+
+void LLPanelSnapshot::onResolutionComboCommit(LLUICtrl* ctrl)
+{
+ updateCustomResControls();
+
+ LLSD info;
+ info["combo-res-change"]["control-name"] = ctrl->getName();
+ LLFloaterSnapshot::getInstance()->notify(info);
+}
+
+void LLPanelSnapshot::onKeepAspectRatioCommit(LLUICtrl* ctrl)
+{
+ LLFloaterSnapshot::getInstance()->notify(LLSD().with("keep-aspect-change", ctrl->getValue().asBoolean()));
+}
diff --git a/indra/newview/llpanelsnapshot.h b/indra/newview/llpanelsnapshot.h
new file mode 100644
index 0000000000..f3274cf594
--- /dev/null
+++ b/indra/newview/llpanelsnapshot.h
@@ -0,0 +1,71 @@
+/**
+ * @file llpanelsnapshot.h
+ * @brief Snapshot panel base class
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLPANELSNAPSHOT_H
+#define LL_LLPANELSNAPSHOT_H
+
+#include "llfloatersnapshot.h"
+
+class LLSideTrayPanelContainer;
+
+/**
+ * Snapshot panel base class.
+ */
+class LLPanelSnapshot: public LLPanel
+{
+public:
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void onOpen(const LLSD& key);
+
+ virtual std::string getWidthSpinnerName() const = 0;
+ virtual std::string getHeightSpinnerName() const = 0;
+ virtual std::string getAspectRatioCBName() const = 0;
+ virtual std::string getImageSizeComboName() const = 0;
+ virtual std::string getImageSizePanelName() const = 0;
+
+ virtual S32 getTypedPreviewWidth() const;
+ virtual S32 getTypedPreviewHeight() const;
+ virtual LLSpinCtrl* getWidthSpinner();
+ virtual LLSpinCtrl* getHeightSpinner();
+ virtual void enableAspectRatioCheckbox(BOOL enable);
+ virtual LLFloaterSnapshot::ESnapshotFormat getImageFormat() const;
+ virtual void updateControls(const LLSD& info) = 0; ///< Update controls from saved settings
+ void enableControls(BOOL enable);
+
+protected:
+ LLSideTrayPanelContainer* getParentContainer();
+ virtual void updateCustomResControls();
+ void updateImageQualityLevel();
+ void goBack(); ///< Switch to the default (Snapshot Options) panel
+ void cancel();
+
+ // common UI callbacks
+ void onCustomResolutionCommit();
+ void onResolutionComboCommit(LLUICtrl* ctrl);
+ void onKeepAspectRatioCommit(LLUICtrl* ctrl);
+};
+
+#endif // LL_LLPANELSNAPSHOT_H
diff --git a/indra/newview/llpanelsnapshotinventory.cpp b/indra/newview/llpanelsnapshotinventory.cpp
new file mode 100644
index 0000000000..381c11348d
--- /dev/null
+++ b/indra/newview/llpanelsnapshotinventory.cpp
@@ -0,0 +1,109 @@
+/**
+ * @file llpanelsnapshotinventory.cpp
+ * @brief The panel provides UI for saving snapshot as an inventory texture.
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llcombobox.h"
+#include "lleconomy.h"
+#include "llsidetraypanelcontainer.h"
+#include "llspinctrl.h"
+
+#include "llfloatersnapshot.h" // FIXME: replace with a snapshot storage model
+#include "llpanelsnapshot.h"
+#include "llviewercontrol.h" // gSavedSettings
+
+/**
+ * The panel provides UI for saving snapshot as an inventory texture.
+ */
+class LLPanelSnapshotInventory
+: public LLPanelSnapshot
+{
+ LOG_CLASS(LLPanelSnapshotInventory);
+
+public:
+ LLPanelSnapshotInventory();
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void onOpen(const LLSD& key);
+
+private:
+ /*virtual*/ void updateCustomResControls(); ///< Show/hide custom resolution controls (spinners and checkbox)
+ /*virtual*/ std::string getWidthSpinnerName() const { return "inventory_snapshot_width"; }
+ /*virtual*/ std::string getHeightSpinnerName() const { return "inventory_snapshot_height"; }
+ /*virtual*/ std::string getAspectRatioCBName() const { return "inventory_keep_aspect_check"; }
+ /*virtual*/ std::string getImageSizeComboName() const { return "texture_size_combo"; }
+ /*virtual*/ std::string getImageSizePanelName() const { return LLStringUtil::null; }
+ /*virtual*/ void updateControls(const LLSD& info);
+
+ void onSend();
+};
+
+static LLRegisterPanelClassWrapper<LLPanelSnapshotInventory> panel_class("llpanelsnapshotinventory");
+
+LLPanelSnapshotInventory::LLPanelSnapshotInventory()
+{
+ mCommitCallbackRegistrar.add("Inventory.Save", boost::bind(&LLPanelSnapshotInventory::onSend, this));
+ mCommitCallbackRegistrar.add("Inventory.Cancel", boost::bind(&LLPanelSnapshotInventory::cancel, this));
+}
+
+// virtual
+BOOL LLPanelSnapshotInventory::postBuild()
+{
+ getChild<LLSpinCtrl>(getWidthSpinnerName())->setAllowEdit(FALSE);
+ getChild<LLSpinCtrl>(getHeightSpinnerName())->setAllowEdit(FALSE);
+ getChild<LLUICtrl>(getAspectRatioCBName())->setVisible(FALSE); // we don't keep aspect ratio for inventory textures
+ return LLPanelSnapshot::postBuild();
+}
+
+// virtual
+void LLPanelSnapshotInventory::onOpen(const LLSD& key)
+{
+ getChild<LLUICtrl>("hint_lbl")->setTextArg("[UPLOAD_COST]", llformat("%d", LLGlobalEconomy::Singleton::getInstance()->getPriceUpload()));
+ LLPanelSnapshot::onOpen(key);
+}
+
+// virtual
+void LLPanelSnapshotInventory::updateCustomResControls()
+{
+ LLComboBox* combo = getChild<LLComboBox>(getImageSizeComboName());
+ S32 selected_idx = combo->getFirstSelectedIndex();
+ const bool show = selected_idx == (combo->getItemCount() - 1); // Custom selected
+
+ getChild<LLUICtrl>(getWidthSpinnerName())->setVisible(show);
+ getChild<LLUICtrl>(getHeightSpinnerName())->setVisible(show);
+}
+
+// virtual
+void LLPanelSnapshotInventory::updateControls(const LLSD& info)
+{
+ const bool have_snapshot = info.has("have-snapshot") ? info["have-snapshot"].asBoolean() : true;
+ getChild<LLUICtrl>("save_btn")->setEnabled(have_snapshot);
+}
+
+void LLPanelSnapshotInventory::onSend()
+{
+ LLFloaterSnapshot::saveTexture();
+ LLFloaterSnapshot::postSave();
+}
diff --git a/indra/newview/llpanelsnapshotlocal.cpp b/indra/newview/llpanelsnapshotlocal.cpp
new file mode 100644
index 0000000000..d153ff598d
--- /dev/null
+++ b/indra/newview/llpanelsnapshotlocal.cpp
@@ -0,0 +1,168 @@
+/**
+ * @file llpanelsnapshotlocal.cpp
+ * @brief The panel provides UI for saving snapshot to a local folder.
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llcombobox.h"
+#include "llsidetraypanelcontainer.h"
+#include "llsliderctrl.h"
+#include "llspinctrl.h"
+
+#include "llfloatersnapshot.h" // FIXME: replace with a snapshot storage model
+#include "llpanelsnapshot.h"
+#include "llviewercontrol.h" // gSavedSettings
+#include "llviewerwindow.h"
+
+/**
+ * The panel provides UI for saving snapshot to a local folder.
+ */
+class LLPanelSnapshotLocal
+: public LLPanelSnapshot
+{
+ LOG_CLASS(LLPanelSnapshotLocal);
+
+public:
+ LLPanelSnapshotLocal();
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void onOpen(const LLSD& key);
+
+private:
+ /*virtual*/ std::string getWidthSpinnerName() const { return "local_snapshot_width"; }
+ /*virtual*/ std::string getHeightSpinnerName() const { return "local_snapshot_height"; }
+ /*virtual*/ std::string getAspectRatioCBName() const { return "local_keep_aspect_check"; }
+ /*virtual*/ std::string getImageSizeComboName() const { return "local_size_combo"; }
+ /*virtual*/ std::string getImageSizePanelName() const { return "local_image_size_lp"; }
+ /*virtual*/ LLFloaterSnapshot::ESnapshotFormat getImageFormat() const;
+ /*virtual*/ void updateControls(const LLSD& info);
+
+ void onFormatComboCommit(LLUICtrl* ctrl);
+ void onQualitySliderCommit(LLUICtrl* ctrl);
+ void onSaveFlyoutCommit(LLUICtrl* ctrl);
+};
+
+static LLRegisterPanelClassWrapper<LLPanelSnapshotLocal> panel_class("llpanelsnapshotlocal");
+
+LLPanelSnapshotLocal::LLPanelSnapshotLocal()
+{
+ mCommitCallbackRegistrar.add("Local.Cancel", boost::bind(&LLPanelSnapshotLocal::cancel, this));
+}
+
+// virtual
+BOOL LLPanelSnapshotLocal::postBuild()
+{
+ getChild<LLUICtrl>("image_quality_slider")->setCommitCallback(boost::bind(&LLPanelSnapshotLocal::onQualitySliderCommit, this, _1));
+ getChild<LLUICtrl>("local_format_combo")->setCommitCallback(boost::bind(&LLPanelSnapshotLocal::onFormatComboCommit, this, _1));
+ getChild<LLUICtrl>("save_btn")->setCommitCallback(boost::bind(&LLPanelSnapshotLocal::onSaveFlyoutCommit, this, _1));
+
+ return LLPanelSnapshot::postBuild();
+}
+
+// virtual
+void LLPanelSnapshotLocal::onOpen(const LLSD& key)
+{
+ LLPanelSnapshot::onOpen(key);
+}
+
+// virtual
+LLFloaterSnapshot::ESnapshotFormat LLPanelSnapshotLocal::getImageFormat() const
+{
+ LLFloaterSnapshot::ESnapshotFormat fmt = LLFloaterSnapshot::SNAPSHOT_FORMAT_PNG;
+
+ LLComboBox* local_format_combo = getChild<LLComboBox>("local_format_combo");
+ const std::string id = local_format_combo->getValue().asString();
+ if (id == "PNG")
+ {
+ fmt = LLFloaterSnapshot::SNAPSHOT_FORMAT_PNG;
+ }
+ else if (id == "JPEG")
+ {
+ fmt = LLFloaterSnapshot::SNAPSHOT_FORMAT_JPEG;
+ }
+ else if (id == "BMP")
+ {
+ fmt = LLFloaterSnapshot::SNAPSHOT_FORMAT_BMP;
+ }
+
+ return fmt;
+}
+
+// virtual
+void LLPanelSnapshotLocal::updateControls(const LLSD& info)
+{
+ LLFloaterSnapshot::ESnapshotFormat fmt =
+ (LLFloaterSnapshot::ESnapshotFormat) gSavedSettings.getS32("SnapshotFormat");
+ getChild<LLComboBox>("local_format_combo")->selectNthItem((S32) fmt);
+
+ const bool show_quality_ctrls = (fmt == LLFloaterSnapshot::SNAPSHOT_FORMAT_JPEG);
+ getChild<LLUICtrl>("image_quality_slider")->setVisible(show_quality_ctrls);
+ getChild<LLUICtrl>("image_quality_level")->setVisible(show_quality_ctrls);
+
+ getChild<LLUICtrl>("image_quality_slider")->setValue(gSavedSettings.getS32("SnapshotQuality"));
+ updateImageQualityLevel();
+
+ const bool have_snapshot = info.has("have-snapshot") ? info["have-snapshot"].asBoolean() : true;
+ getChild<LLUICtrl>("save_btn")->setEnabled(have_snapshot);
+}
+
+void LLPanelSnapshotLocal::onFormatComboCommit(LLUICtrl* ctrl)
+{
+ // will call updateControls()
+ LLFloaterSnapshot::getInstance()->notify(LLSD().with("image-format-change", true));
+}
+
+void LLPanelSnapshotLocal::onQualitySliderCommit(LLUICtrl* ctrl)
+{
+ updateImageQualityLevel();
+
+ LLSliderCtrl* slider = (LLSliderCtrl*)ctrl;
+ S32 quality_val = llfloor((F32)slider->getValue().asReal());
+ LLSD info;
+ info["image-quality-change"] = quality_val;
+ LLFloaterSnapshot::getInstance()->notify(info);
+}
+
+void LLPanelSnapshotLocal::onSaveFlyoutCommit(LLUICtrl* ctrl)
+{
+ if (ctrl->getValue().asString() == "save as")
+ {
+ gViewerWindow->resetSnapshotLoc();
+ }
+
+ LLFloaterSnapshot* floater = LLFloaterSnapshot::getInstance();
+
+ floater->notify(LLSD().with("set-working", true));
+ BOOL saved = LLFloaterSnapshot::saveLocal();
+ if (saved)
+ {
+ LLFloaterSnapshot::postSave();
+ goBack();
+ floater->notify(LLSD().with("set-finished", LLSD().with("ok", true).with("msg", "local")));
+ }
+ else
+ {
+ cancel();
+ }
+}
diff --git a/indra/newview/llpanelsnapshotoptions.cpp b/indra/newview/llpanelsnapshotoptions.cpp
new file mode 100644
index 0000000000..554fabe5b3
--- /dev/null
+++ b/indra/newview/llpanelsnapshotoptions.cpp
@@ -0,0 +1,120 @@
+/**
+ * @file llpanelsnapshotoptions.cpp
+ * @brief Snapshot posting options panel.
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "lleconomy.h"
+#include "llpanel.h"
+#include "llsidetraypanelcontainer.h"
+
+#include "llfloatersnapshot.h" // FIXME: create a snapshot model
+
+/**
+ * Provides several ways to save a snapshot.
+ */
+class LLPanelSnapshotOptions
+: public LLPanel
+, public LLEconomyObserver
+{
+ LOG_CLASS(LLPanelSnapshotOptions);
+
+public:
+ LLPanelSnapshotOptions();
+ ~LLPanelSnapshotOptions();
+ /*virtual*/ void onOpen(const LLSD& key);
+ /*virtual*/ void onEconomyDataChange() { updateUploadCost(); }
+
+private:
+ void updateUploadCost();
+ void openPanel(const std::string& panel_name);
+ void onSaveToProfile();
+ void onSaveToEmail();
+ void onSaveToInventory();
+ void onSaveToComputer();
+};
+
+static LLRegisterPanelClassWrapper<LLPanelSnapshotOptions> panel_class("llpanelsnapshotoptions");
+
+LLPanelSnapshotOptions::LLPanelSnapshotOptions()
+{
+ mCommitCallbackRegistrar.add("Snapshot.SaveToProfile", boost::bind(&LLPanelSnapshotOptions::onSaveToProfile, this));
+ mCommitCallbackRegistrar.add("Snapshot.SaveToEmail", boost::bind(&LLPanelSnapshotOptions::onSaveToEmail, this));
+ mCommitCallbackRegistrar.add("Snapshot.SaveToInventory", boost::bind(&LLPanelSnapshotOptions::onSaveToInventory, this));
+ mCommitCallbackRegistrar.add("Snapshot.SaveToComputer", boost::bind(&LLPanelSnapshotOptions::onSaveToComputer, this));
+
+ LLGlobalEconomy::Singleton::getInstance()->addObserver(this);
+}
+
+LLPanelSnapshotOptions::~LLPanelSnapshotOptions()
+{
+ LLGlobalEconomy::Singleton::getInstance()->removeObserver(this);
+}
+
+// virtual
+void LLPanelSnapshotOptions::onOpen(const LLSD& key)
+{
+ updateUploadCost();
+}
+
+void LLPanelSnapshotOptions::updateUploadCost()
+{
+ S32 upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload();
+ getChild<LLUICtrl>("save_to_inventory_btn")->setLabelArg("[AMOUNT]", llformat("%d", upload_cost));
+}
+
+void LLPanelSnapshotOptions::openPanel(const std::string& panel_name)
+{
+ LLSideTrayPanelContainer* parent = dynamic_cast<LLSideTrayPanelContainer*>(getParent());
+ if (!parent)
+ {
+ llwarns << "Cannot find panel container" << llendl;
+ return;
+ }
+
+ parent->openPanel(panel_name);
+ parent->getCurrentPanel()->onOpen(LLSD());
+ LLFloaterSnapshot::postPanelSwitch();
+}
+
+void LLPanelSnapshotOptions::onSaveToProfile()
+{
+ openPanel("panel_snapshot_profile");
+}
+
+void LLPanelSnapshotOptions::onSaveToEmail()
+{
+ openPanel("panel_snapshot_postcard");
+}
+
+void LLPanelSnapshotOptions::onSaveToInventory()
+{
+ openPanel("panel_snapshot_inventory");
+}
+
+void LLPanelSnapshotOptions::onSaveToComputer()
+{
+ openPanel("panel_snapshot_local");
+}
diff --git a/indra/newview/llpanelsnapshotpostcard.cpp b/indra/newview/llpanelsnapshotpostcard.cpp
new file mode 100644
index 0000000000..f2bb8f530b
--- /dev/null
+++ b/indra/newview/llpanelsnapshotpostcard.cpp
@@ -0,0 +1,270 @@
+/**
+ * @file llpanelsnapshotpostcard.cpp
+ * @brief Postcard sending panel.
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llcombobox.h"
+#include "llnotificationsutil.h"
+#include "llsidetraypanelcontainer.h"
+#include "llsliderctrl.h"
+#include "llspinctrl.h"
+#include "lltexteditor.h"
+
+#include "llagent.h"
+#include "llagentui.h"
+#include "llfloatersnapshot.h" // FIXME: replace with a snapshot storage model
+#include "llpanelsnapshot.h"
+#include "llpostcard.h"
+#include "llviewercontrol.h" // gSavedSettings
+#include "llviewerwindow.h"
+
+#include <boost/regex.hpp>
+
+/**
+ * Sends postcard via email.
+ */
+class LLPanelSnapshotPostcard
+: public LLPanelSnapshot
+{
+ LOG_CLASS(LLPanelSnapshotPostcard);
+
+public:
+ LLPanelSnapshotPostcard();
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void onOpen(const LLSD& key);
+ /*virtual*/ S32 notify(const LLSD& info);
+
+private:
+ /*virtual*/ std::string getWidthSpinnerName() const { return "postcard_snapshot_width"; }
+ /*virtual*/ std::string getHeightSpinnerName() const { return "postcard_snapshot_height"; }
+ /*virtual*/ std::string getAspectRatioCBName() const { return "postcard_keep_aspect_check"; }
+ /*virtual*/ std::string getImageSizeComboName() const { return "postcard_size_combo"; }
+ /*virtual*/ std::string getImageSizePanelName() const { return "postcard_image_size_lp"; }
+ /*virtual*/ LLFloaterSnapshot::ESnapshotFormat getImageFormat() const { return LLFloaterSnapshot::SNAPSHOT_FORMAT_JPEG; }
+ /*virtual*/ void updateControls(const LLSD& info);
+
+ bool missingSubjMsgAlertCallback(const LLSD& notification, const LLSD& response);
+ void sendPostcard();
+
+ void onMsgFormFocusRecieved();
+ void onFormatComboCommit(LLUICtrl* ctrl);
+ void onQualitySliderCommit(LLUICtrl* ctrl);
+ void onTabButtonPress(S32 btn_idx);
+ void onSend();
+
+ bool mHasFirstMsgFocus;
+ std::string mAgentEmail;
+};
+
+static LLRegisterPanelClassWrapper<LLPanelSnapshotPostcard> panel_class("llpanelsnapshotpostcard");
+
+LLPanelSnapshotPostcard::LLPanelSnapshotPostcard()
+: mHasFirstMsgFocus(false)
+{
+ mCommitCallbackRegistrar.add("Postcard.Send", boost::bind(&LLPanelSnapshotPostcard::onSend, this));
+ mCommitCallbackRegistrar.add("Postcard.Cancel", boost::bind(&LLPanelSnapshotPostcard::cancel, this));
+ mCommitCallbackRegistrar.add("Postcard.Message", boost::bind(&LLPanelSnapshotPostcard::onTabButtonPress, this, 0));
+ mCommitCallbackRegistrar.add("Postcard.Settings", boost::bind(&LLPanelSnapshotPostcard::onTabButtonPress, this, 1));
+
+}
+
+// virtual
+BOOL LLPanelSnapshotPostcard::postBuild()
+{
+ // pick up the user's up-to-date email address
+ gAgent.sendAgentUserInfoRequest();
+
+ std::string name_string;
+ LLAgentUI::buildFullname(name_string);
+ getChild<LLUICtrl>("name_form")->setValue(LLSD(name_string));
+
+ // For the first time a user focuses to .the msg box, all text will be selected.
+ getChild<LLUICtrl>("msg_form")->setFocusChangedCallback(boost::bind(&LLPanelSnapshotPostcard::onMsgFormFocusRecieved, this));
+
+ getChild<LLUICtrl>("to_form")->setFocus(TRUE);
+
+ getChild<LLUICtrl>("image_quality_slider")->setCommitCallback(boost::bind(&LLPanelSnapshotPostcard::onQualitySliderCommit, this, _1));
+
+ getChild<LLButton>("message_btn")->setToggleState(TRUE);
+
+ return LLPanelSnapshot::postBuild();
+}
+
+// virtual
+void LLPanelSnapshotPostcard::onOpen(const LLSD& key)
+{
+ LLPanelSnapshot::onOpen(key);
+}
+
+// virtual
+S32 LLPanelSnapshotPostcard::notify(const LLSD& info)
+{
+ if (!info.has("agent-email"))
+ {
+ llassert(info.has("agent-email"));
+ return 0;
+ }
+
+ if (mAgentEmail.empty())
+ {
+ mAgentEmail = info["agent-email"].asString();
+ }
+
+ return 1;
+}
+
+// virtual
+void LLPanelSnapshotPostcard::updateControls(const LLSD& info)
+{
+ getChild<LLUICtrl>("image_quality_slider")->setValue(gSavedSettings.getS32("SnapshotQuality"));
+ updateImageQualityLevel();
+
+ const bool have_snapshot = info.has("have-snapshot") ? info["have-snapshot"].asBoolean() : true;
+ getChild<LLUICtrl>("send_btn")->setEnabled(have_snapshot);
+}
+
+bool LLPanelSnapshotPostcard::missingSubjMsgAlertCallback(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ if(0 == option)
+ {
+ // User clicked OK
+ if((getChild<LLUICtrl>("subject_form")->getValue().asString()).empty())
+ {
+ // Stuff the subject back into the form.
+ getChild<LLUICtrl>("subject_form")->setValue(getString("default_subject"));
+ }
+
+ if (!mHasFirstMsgFocus)
+ {
+ // The user never switched focus to the message window.
+ // Using the default string.
+ getChild<LLUICtrl>("msg_form")->setValue(getString("default_message"));
+ }
+
+ sendPostcard();
+ }
+ return false;
+}
+
+
+void LLPanelSnapshotPostcard::sendPostcard()
+{
+ std::string to(getChild<LLUICtrl>("to_form")->getValue().asString());
+ std::string subject(getChild<LLUICtrl>("subject_form")->getValue().asString());
+
+ LLSD postcard = LLSD::emptyMap();
+ postcard["pos-global"] = LLFloaterSnapshot::getPosTakenGlobal().getValue();
+ postcard["to"] = to;
+ postcard["from"] = mAgentEmail;
+ postcard["name"] = getChild<LLUICtrl>("name_form")->getValue().asString();
+ postcard["subject"] = subject;
+ postcard["msg"] = getChild<LLUICtrl>("msg_form")->getValue().asString();
+ LLPostCard::send(LLFloaterSnapshot::getImageData(), postcard);
+
+ // Give user feedback of the event.
+ gViewerWindow->playSnapshotAnimAndSound();
+
+ LLFloaterSnapshot::postSave();
+}
+
+void LLPanelSnapshotPostcard::onMsgFormFocusRecieved()
+{
+ LLTextEditor* msg_form = getChild<LLTextEditor>("msg_form");
+ if (msg_form->hasFocus() && !mHasFirstMsgFocus)
+ {
+ mHasFirstMsgFocus = true;
+ msg_form->setText(LLStringUtil::null);
+ }
+}
+
+void LLPanelSnapshotPostcard::onFormatComboCommit(LLUICtrl* ctrl)
+{
+ // will call updateControls()
+ LLFloaterSnapshot::getInstance()->notify(LLSD().with("image-format-change", true));
+}
+
+void LLPanelSnapshotPostcard::onQualitySliderCommit(LLUICtrl* ctrl)
+{
+ updateImageQualityLevel();
+
+ LLSliderCtrl* slider = (LLSliderCtrl*)ctrl;
+ S32 quality_val = llfloor((F32)slider->getValue().asReal());
+ LLSD info;
+ info["image-quality-change"] = quality_val;
+ LLFloaterSnapshot::getInstance()->notify(info); // updates the "SnapshotQuality" setting
+}
+
+void LLPanelSnapshotPostcard::onTabButtonPress(S32 btn_idx)
+{
+ LLButton* buttons[2] = {
+ getChild<LLButton>("message_btn"),
+ getChild<LLButton>("settings_btn"),
+ };
+
+ // Switch between Message and Settings tabs.
+ LLButton* clicked_btn = buttons[btn_idx];
+ LLButton* other_btn = buttons[!btn_idx];
+ LLSideTrayPanelContainer* container =
+ getChild<LLSideTrayPanelContainer>("postcard_panel_container");
+
+ container->selectTab(clicked_btn->getToggleState() ? btn_idx : !btn_idx);
+ //clicked_btn->setEnabled(FALSE);
+ other_btn->toggleState();
+ //other_btn->setEnabled(TRUE);
+
+ lldebugs << "Button #" << btn_idx << " (" << clicked_btn->getName() << ") clicked" << llendl;
+}
+
+void LLPanelSnapshotPostcard::onSend()
+{
+ // Validate input.
+ std::string to(getChild<LLUICtrl>("to_form")->getValue().asString());
+
+ boost::regex email_format("[A-Za-z0-9.%+-_]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}(,[ \t]*[A-Za-z0-9.%+-_]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,})*");
+
+ if (to.empty() || !boost::regex_match(to, email_format))
+ {
+ LLNotificationsUtil::add("PromptRecipientEmail");
+ return;
+ }
+
+ if (mAgentEmail.empty() || !boost::regex_match(mAgentEmail, email_format))
+ {
+ LLNotificationsUtil::add("PromptSelfEmail");
+ return;
+ }
+
+ std::string subject(getChild<LLUICtrl>("subject_form")->getValue().asString());
+ if(subject.empty() || !mHasFirstMsgFocus)
+ {
+ LLNotificationsUtil::add("PromptMissingSubjMsg", LLSD(), LLSD(), boost::bind(&LLPanelSnapshotPostcard::missingSubjMsgAlertCallback, this, _1, _2));
+ return;
+ }
+
+ // Send postcard.
+ sendPostcard();
+}
diff --git a/indra/newview/llpanelsnapshotprofile.cpp b/indra/newview/llpanelsnapshotprofile.cpp
new file mode 100644
index 0000000000..a706318369
--- /dev/null
+++ b/indra/newview/llpanelsnapshotprofile.cpp
@@ -0,0 +1,101 @@
+/**
+ * @file llpanelsnapshotprofile.cpp
+ * @brief Posts a snapshot to My Profile feed.
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+// libs
+#include "llcombobox.h"
+#include "llfloaterreg.h"
+#include "llpanel.h"
+#include "llspinctrl.h"
+
+// newview
+#include "llfloatersnapshot.h"
+#include "llpanelsnapshot.h"
+#include "llsidetraypanelcontainer.h"
+#include "llwebprofile.h"
+
+/**
+ * Posts a snapshot to My Profile feed.
+ */
+class LLPanelSnapshotProfile
+: public LLPanelSnapshot
+{
+ LOG_CLASS(LLPanelSnapshotProfile);
+
+public:
+ LLPanelSnapshotProfile();
+
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void onOpen(const LLSD& key);
+
+private:
+ /*virtual*/ std::string getWidthSpinnerName() const { return "profile_snapshot_width"; }
+ /*virtual*/ std::string getHeightSpinnerName() const { return "profile_snapshot_height"; }
+ /*virtual*/ std::string getAspectRatioCBName() const { return "profile_keep_aspect_check"; }
+ /*virtual*/ std::string getImageSizeComboName() const { return "profile_size_combo"; }
+ /*virtual*/ std::string getImageSizePanelName() const { return "profile_image_size_lp"; }
+ /*virtual*/ LLFloaterSnapshot::ESnapshotFormat getImageFormat() const { return LLFloaterSnapshot::SNAPSHOT_FORMAT_PNG; }
+ /*virtual*/ void updateControls(const LLSD& info);
+
+ void onSend();
+};
+
+static LLRegisterPanelClassWrapper<LLPanelSnapshotProfile> panel_class("llpanelsnapshotprofile");
+
+LLPanelSnapshotProfile::LLPanelSnapshotProfile()
+{
+ mCommitCallbackRegistrar.add("PostToProfile.Send", boost::bind(&LLPanelSnapshotProfile::onSend, this));
+ mCommitCallbackRegistrar.add("PostToProfile.Cancel", boost::bind(&LLPanelSnapshotProfile::cancel, this));
+}
+
+// virtual
+BOOL LLPanelSnapshotProfile::postBuild()
+{
+ return LLPanelSnapshot::postBuild();
+}
+
+// virtual
+void LLPanelSnapshotProfile::onOpen(const LLSD& key)
+{
+ LLPanelSnapshot::onOpen(key);
+}
+
+// virtual
+void LLPanelSnapshotProfile::updateControls(const LLSD& info)
+{
+ const bool have_snapshot = info.has("have-snapshot") ? info["have-snapshot"].asBoolean() : true;
+ getChild<LLUICtrl>("post_btn")->setEnabled(have_snapshot);
+}
+
+void LLPanelSnapshotProfile::onSend()
+{
+ std::string caption = getChild<LLUICtrl>("caption")->getValue().asString();
+ bool add_location = getChild<LLUICtrl>("add_location_cb")->getValue().asBoolean();
+
+ LLWebProfile::uploadImage(LLFloaterSnapshot::getImageData(), caption, add_location);
+ LLFloaterSnapshot::postSave();
+}
diff --git a/indra/newview/llpanelteleporthistory.cpp b/indra/newview/llpanelteleporthistory.cpp
index 9b35e78134..c63d89fc98 100644
--- a/indra/newview/llpanelteleporthistory.cpp
+++ b/indra/newview/llpanelteleporthistory.cpp
@@ -31,7 +31,6 @@
#include "llfloaterworldmap.h"
#include "llpanelteleporthistory.h"
-#include "llsidetray.h"
#include "llworldmap.h"
#include "llteleporthistorystorage.h"
#include "lltextutil.h"
@@ -39,6 +38,7 @@
#include "llaccordionctrl.h"
#include "llaccordionctrltab.h"
#include "llflatlistview.h"
+#include "llfloatersidepanelcontainer.h"
#include "llnotificationsutil.h"
#include "lltextbox.h"
#include "lltoggleablemenu.h"
@@ -221,7 +221,7 @@ void LLTeleportHistoryFlatItem::showPlaceInfoPanel(S32 index)
params["id"] = index;
params["type"] = "teleport_history";
- LLSideTray::getInstance()->showPanel("panel_places", params);
+ LLFloaterSidePanelContainer::showPanel("places", params);
}
void LLTeleportHistoryFlatItem::onProfileBtnClick()
@@ -358,7 +358,7 @@ void LLTeleportHistoryPanel::ContextMenu::onInfo()
//static
void LLTeleportHistoryPanel::ContextMenu::gotSLURLCallback(const std::string& slurl)
{
- gClipboard.copyFromString(utf8str_to_wstring(slurl));
+ LLClipboard::instance().copyToClipboard(utf8str_to_wstring(slurl),0,slurl.size());
}
void LLTeleportHistoryPanel::ContextMenu::onCopyToClipboard()
@@ -388,7 +388,8 @@ LLTeleportHistoryPanel::LLTeleportHistoryPanel()
LLTeleportHistoryPanel::~LLTeleportHistoryPanel()
{
LLTeleportHistoryFlatItemStorage::instance().purge();
- LLView::deleteViewByHandle(mGearMenuHandle);
+ if (mGearMenuHandle.get()) mGearMenuHandle.get()->die();
+ mTeleportHistoryChangedConnection.disconnect();
}
BOOL LLTeleportHistoryPanel::postBuild()
@@ -396,7 +397,7 @@ BOOL LLTeleportHistoryPanel::postBuild()
mTeleportHistory = LLTeleportHistoryStorage::getInstance();
if (mTeleportHistory)
{
- mTeleportHistory->setHistoryChangedCallback(boost::bind(&LLTeleportHistoryPanel::onTeleportHistoryChange, this, _1));
+ mTeleportHistoryChangedConnection = mTeleportHistory->setHistoryChangedCallback(boost::bind(&LLTeleportHistoryPanel::onTeleportHistoryChange, this, _1));
}
mHistoryAccordion = getChild<LLAccordionCtrl>("history_accordion");
@@ -679,29 +680,32 @@ void LLTeleportHistoryPanel::refresh()
// tab_boundary_date would be earliest possible date for this tab
S32 tab_idx = 0;
getNextTab(date, tab_idx, tab_boundary_date);
-
- LLAccordionCtrlTab* tab = mItemContainers.get(mItemContainers.size() - 1 - tab_idx);
- tab->setVisible(true);
-
- // Expand all accordion tabs when filtering
- if(!sFilterSubString.empty())
+ tab_idx = mItemContainers.size() - 1 - tab_idx;
+ if (tab_idx >= 0)
{
- //store accordion tab state when filter is not empty
- tab->notifyChildren(LLSD().with("action","store_state"));
-
- tab->setDisplayChildren(true);
- }
- // Restore each tab's expand state when not filtering
- else
- {
- bool collapsed = isAccordionCollapsedByUser(tab);
- tab->setDisplayChildren(!collapsed);
+ LLAccordionCtrlTab* tab = mItemContainers.get(tab_idx);
+ tab->setVisible(true);
+
+ // Expand all accordion tabs when filtering
+ if(!sFilterSubString.empty())
+ {
+ //store accordion tab state when filter is not empty
+ tab->notifyChildren(LLSD().with("action","store_state"));
- //restore accordion state after all those accodrion tabmanipulations
- tab->notifyChildren(LLSD().with("action","restore_state"));
- }
+ tab->setDisplayChildren(true);
+ }
+ // Restore each tab's expand state when not filtering
+ else
+ {
+ bool collapsed = isAccordionCollapsedByUser(tab);
+ tab->setDisplayChildren(!collapsed);
+
+ //restore accordion state after all those accodrion tabmanipulations
+ tab->notifyChildren(LLSD().with("action","restore_state"));
+ }
- curr_flat_view = getFlatListViewFromTab(tab);
+ curr_flat_view = getFlatListViewFromTab(tab);
+ }
}
if (curr_flat_view)
@@ -760,7 +764,12 @@ void LLTeleportHistoryPanel::onTeleportHistoryChange(S32 removed_index)
void LLTeleportHistoryPanel::replaceItem(S32 removed_index)
{
// Flat list for 'Today' (mItemContainers keeps accordion tabs in reverse order)
- LLFlatListView* fv = getFlatListViewFromTab(mItemContainers[mItemContainers.size() - 1]);
+ LLFlatListView* fv = NULL;
+
+ if (mItemContainers.size() > 0)
+ {
+ fv = getFlatListViewFromTab(mItemContainers[mItemContainers.size() - 1]);
+ }
// Empty flat list for 'Today' means that other flat lists are empty as well,
// so all items from teleport history should be added.
@@ -828,19 +837,27 @@ void LLTeleportHistoryPanel::showTeleportHistory()
// Starting to add items from last one, in reverse order,
// since TeleportHistory keeps most recent item at the end
+ if (!mTeleportHistory)
+ {
+ mTeleportHistory = LLTeleportHistoryStorage::getInstance();
+ }
+
mCurrentItem = mTeleportHistory->getItems().size() - 1;
for (S32 n = mItemContainers.size() - 1; n >= 0; --n)
{
LLAccordionCtrlTab* tab = mItemContainers.get(n);
- tab->setVisible(false);
-
- LLFlatListView* fv = getFlatListViewFromTab(tab);
- if (fv)
+ if (tab)
{
- // Detached panels are managed by LLTeleportHistoryFlatItemStorage
- std::vector<LLPanel*> detached_items;
- fv->detachItems(detached_items);
+ tab->setVisible(false);
+
+ LLFlatListView* fv = getFlatListViewFromTab(tab);
+ if (fv)
+ {
+ // Detached panels are managed by LLTeleportHistoryFlatItemStorage
+ std::vector<LLPanel*> detached_items;
+ fv->detachItems(detached_items);
+ }
}
}
}
diff --git a/indra/newview/llpanelteleporthistory.h b/indra/newview/llpanelteleporthistory.h
index 3d29454d15..47b607a2f4 100644
--- a/indra/newview/llpanelteleporthistory.h
+++ b/indra/newview/llpanelteleporthistory.h
@@ -119,6 +119,8 @@ private:
LLContextMenu* mAccordionTabMenu;
LLHandle<LLView> mGearMenuHandle;
LLMenuButton* mMenuGearButton;
+
+ boost::signals2::connection mTeleportHistoryChangedConnection;
};
diff --git a/indra/newview/llpaneltopinfobar.cpp b/indra/newview/llpaneltopinfobar.cpp
index a9ca7314ce..280cc11179 100644
--- a/indra/newview/llpaneltopinfobar.cpp
+++ b/indra/newview/llpaneltopinfobar.cpp
@@ -31,13 +31,14 @@
#include "llagent.h"
#include "llagentui.h"
#include "llclipboard.h"
+#include "llfloatersidepanelcontainer.h"
#include "lllandmarkactions.h"
#include "lllocationinputctrl.h"
#include "llnotificationsutil.h"
#include "llparcel.h"
-#include "llsidetray.h"
#include "llslurl.h"
#include "llstatusbar.h"
+#include "lltrans.h"
#include "llviewercontrol.h"
#include "llviewerinventory.h"
#include "llviewermenu.h"
@@ -101,6 +102,15 @@ void LLPanelTopInfoBar::initParcelIcons()
mParcelIcon[BUILD_ICON] = getChild<LLIconCtrl>("build_icon");
mParcelIcon[SCRIPTS_ICON] = getChild<LLIconCtrl>("scripts_icon");
mParcelIcon[DAMAGE_ICON] = getChild<LLIconCtrl>("damage_icon");
+ mParcelIcon[SEE_AVATARS_ICON] = getChild<LLIconCtrl>("see_avatars_icon");
+
+ mParcelIcon[VOICE_ICON]->setToolTip(LLTrans::getString("LocationCtrlVoiceTooltip"));
+ mParcelIcon[FLY_ICON]->setToolTip(LLTrans::getString("LocationCtrlFlyTooltip"));
+ mParcelIcon[PUSH_ICON]->setToolTip(LLTrans::getString("LocationCtrlPushTooltip"));
+ mParcelIcon[BUILD_ICON]->setToolTip(LLTrans::getString("LocationCtrlBuildTooltip"));
+ mParcelIcon[SCRIPTS_ICON]->setToolTip(LLTrans::getString("LocationCtrlScriptsTooltip"));
+ mParcelIcon[DAMAGE_ICON]->setToolTip(LLTrans::getString("LocationCtrlDamageTooltip"));
+ mParcelIcon[SEE_AVATARS_ICON]->setToolTip(LLTrans::getString("LocationCtrlSeeAVsTooltip"));
mParcelIcon[VOICE_ICON]->setMouseDownCallback(boost::bind(&LLPanelTopInfoBar::onParcelIconClick, this, VOICE_ICON));
mParcelIcon[FLY_ICON]->setMouseDownCallback(boost::bind(&LLPanelTopInfoBar::onParcelIconClick, this, FLY_ICON));
@@ -108,6 +118,7 @@ void LLPanelTopInfoBar::initParcelIcons()
mParcelIcon[BUILD_ICON]->setMouseDownCallback(boost::bind(&LLPanelTopInfoBar::onParcelIconClick, this, BUILD_ICON));
mParcelIcon[SCRIPTS_ICON]->setMouseDownCallback(boost::bind(&LLPanelTopInfoBar::onParcelIconClick, this, SCRIPTS_ICON));
mParcelIcon[DAMAGE_ICON]->setMouseDownCallback(boost::bind(&LLPanelTopInfoBar::onParcelIconClick, this, DAMAGE_ICON));
+ mParcelIcon[SEE_AVATARS_ICON]->setMouseDownCallback(boost::bind(&LLPanelTopInfoBar::onParcelIconClick, this, SEE_AVATARS_ICON));
mDamageText->setText(LLStringExplicit("100%"));
}
@@ -129,6 +140,7 @@ BOOL LLPanelTopInfoBar::postBuild()
{
mInfoBtn = getChild<LLButton>("place_info_btn");
mInfoBtn->setClickedCallback(boost::bind(&LLPanelTopInfoBar::onInfoButtonClicked, this));
+ mInfoBtn->setToolTip(LLTrans::getString("LocationCtrlInfoBtnTooltip"));
mParcelInfoText = getChild<LLTextBox>("parcel_info_text");
mDamageText = getChild<LLTextBox>("damage_text");
@@ -191,6 +203,11 @@ void LLPanelTopInfoBar::onVisibilityChange(const LLSD& show)
gFloaterView->setMinimizePositionVerticalOffset(minimize_pos_offset);
}
+boost::signals2::connection LLPanelTopInfoBar::setResizeCallback( const resize_signal_t::slot_type& cb )
+{
+ return mResizeSignal.connect(cb);
+}
+
void LLPanelTopInfoBar::draw()
{
updateParcelInfoText();
@@ -212,6 +229,7 @@ void LLPanelTopInfoBar::buildLocationString(std::string& loc_str, bool show_coor
void LLPanelTopInfoBar::setParcelInfoText(const std::string& new_text)
{
+ LLRect old_rect = getRect();
const LLFontGL* font = mParcelInfoText->getDefaultFont();
S32 new_text_width = font->getWidth(new_text);
@@ -223,6 +241,11 @@ void LLPanelTopInfoBar::setParcelInfoText(const std::string& new_text)
mParcelInfoText->reshape(rect.getWidth(), rect.getHeight(), TRUE);
mParcelInfoText->setRect(rect);
layoutParcelIcons();
+
+ if (old_rect != getRect())
+ {
+ mResizeSignal();
+ }
}
void LLPanelTopInfoBar::update()
@@ -286,6 +309,7 @@ void LLPanelTopInfoBar::updateParcelIcons()
bool allow_build = vpm->allowAgentBuild(current_parcel); // true when anyone is allowed to build. See EXT-4610.
bool allow_scripts = vpm->allowAgentScripts(agent_region, current_parcel);
bool allow_damage = vpm->allowAgentDamage(agent_region, current_parcel);
+ bool see_avs = current_parcel->getSeeAVs();
// Most icons are "block this ability"
mParcelIcon[VOICE_ICON]->setVisible( !allow_voice );
@@ -295,6 +319,7 @@ void LLPanelTopInfoBar::updateParcelIcons()
mParcelIcon[SCRIPTS_ICON]->setVisible( !allow_scripts );
mParcelIcon[DAMAGE_ICON]->setVisible( allow_damage );
mDamageText->setVisible(allow_damage);
+ mParcelIcon[SEE_AVATARS_ICON]->setVisible( !see_avs );
layoutParcelIcons();
}
@@ -328,6 +353,8 @@ void LLPanelTopInfoBar::updateHealth()
void LLPanelTopInfoBar::layoutParcelIcons()
{
+ LLRect old_rect = getRect();
+
// TODO: remove hard-coded values and read them as xml parameters
static const int FIRST_ICON_HPAD = 32;
static const int LAST_ICON_HPAD = 11;
@@ -344,6 +371,11 @@ void LLPanelTopInfoBar::layoutParcelIcons()
LLRect rect = getRect();
rect.set(rect.mLeft, rect.mTop, left + LAST_ICON_HPAD, rect.mBottom);
setRect(rect);
+
+ if (old_rect != getRect())
+ {
+ mResizeSignal();
+ }
}
S32 LLPanelTopInfoBar::layoutWidget(LLUICtrl* ctrl, S32 left)
@@ -400,6 +432,9 @@ void LLPanelTopInfoBar::onParcelIconClick(EParcelIcon icon)
case DAMAGE_ICON:
LLNotificationsUtil::add("NotSafe");
break;
+ case SEE_AVATARS_ICON:
+ LLNotificationsUtil::add("SeeAvatars");
+ break;
case ICON_COUNT:
break;
// no default to get compiler warning when a new icon gets added
@@ -419,12 +454,11 @@ void LLPanelTopInfoBar::onContextMenuItemClicked(const LLSD::String& item)
if(landmark == NULL)
{
- LLSideTray::getInstance()->showPanel("panel_places", LLSD().with("type", "create_landmark"));
+ LLFloaterSidePanelContainer::showPanel("places", LLSD().with("type", "create_landmark"));
}
else
{
- LLSideTray::getInstance()->showPanel("panel_places",
- LLSD().with("type", "landmark").with("id",landmark->getUUID()));
+ LLFloaterSidePanelContainer::showPanel("places", LLSD().with("type", "landmark").with("id",landmark->getUUID()));
}
}
else if (item == "copy")
@@ -433,11 +467,11 @@ void LLPanelTopInfoBar::onContextMenuItemClicked(const LLSD::String& item)
LLAgentUI::buildSLURL(slurl, false);
LLUIString location_str(slurl.getSLURLString());
- gClipboard.copyFromString(location_str);
+ LLClipboard::instance().copyToClipboard(location_str,0,location_str.length());
}
}
void LLPanelTopInfoBar::onInfoButtonClicked()
{
- LLSideTray::getInstance()->showPanel("panel_places", LLSD().with("type", "agent"));
+ LLFloaterSidePanelContainer::showPanel("places", LLSD().with("type", "agent"));
}
diff --git a/indra/newview/llpaneltopinfobar.h b/indra/newview/llpaneltopinfobar.h
index db922ef424..d58d95be90 100644
--- a/indra/newview/llpaneltopinfobar.h
+++ b/indra/newview/llpaneltopinfobar.h
@@ -41,6 +41,8 @@ class LLPanelTopInfoBar : public LLPanel, public LLSingleton<LLPanelTopInfoBar>,
friend class LLDestroyClass<LLPanelTopInfoBar>;
public:
+ typedef boost::signals2::signal<void ()> resize_signal_t;
+
LLPanelTopInfoBar();
~LLPanelTopInfoBar();
@@ -57,6 +59,8 @@ public:
*/
void onVisibilityChange(const LLSD& show);
+ boost::signals2::connection setResizeCallback( const resize_signal_t::slot_type& cb );
+
private:
class LLParcelChangeObserver;
@@ -65,12 +69,13 @@ private:
enum EParcelIcon
{
VOICE_ICON = 0,
- FLY_ICON,
- PUSH_ICON,
- BUILD_ICON,
- SCRIPTS_ICON,
- DAMAGE_ICON,
- ICON_COUNT
+ FLY_ICON, // 1
+ PUSH_ICON, // 2
+ BUILD_ICON, // 3
+ SCRIPTS_ICON, // 4
+ DAMAGE_ICON, // 5
+ SEE_AVATARS_ICON, // 6
+ ICON_COUNT // 7 total
};
/**
@@ -147,7 +152,7 @@ private:
void setParcelInfoText(const std::string& new_text);
/**
- * Implementation of LLDestroyClass<LLSideTray>
+ * Implementation of LLDestroyClass<T>
*/
static void destroyClass()
{
@@ -166,6 +171,8 @@ private:
boost::signals2::connection mParcelPropsCtrlConnection;
boost::signals2::connection mShowCoordsCtrlConnection;
boost::signals2::connection mParcelMgrConnection;
+
+ resize_signal_t mResizeSignal;
};
#endif /* LLPANELTOPINFOBAR_H_ */
diff --git a/indra/newview/llpanelvoicedevicesettings.cpp b/indra/newview/llpanelvoicedevicesettings.cpp
index aef870d352..6be2ea6481 100644
--- a/indra/newview/llpanelvoicedevicesettings.cpp
+++ b/indra/newview/llpanelvoicedevicesettings.cpp
@@ -41,6 +41,7 @@
static LLRegisterPanelClassWrapper<LLPanelVoiceDeviceSettings> t_panel_group_general("panel_voice_device_settings");
+static const std::string DEFAULT_DEVICE("Default");
LLPanelVoiceDeviceSettings::LLPanelVoiceDeviceSettings()
@@ -51,6 +52,7 @@ LLPanelVoiceDeviceSettings::LLPanelVoiceDeviceSettings()
mInputDevice = gSavedSettings.getString("VoiceInputAudioDevice");
mOutputDevice = gSavedSettings.getString("VoiceOutputAudioDevice");
mDevicesUpdated = FALSE;
+ mUseTuningMode = true;
// grab "live" mic volume level
mMicVolume = gSavedSettings.getF32("AudioLevelMic");
@@ -67,10 +69,17 @@ BOOL LLPanelVoiceDeviceSettings::postBuild()
// set mic volume tuning slider based on last mic volume setting
volume_slider->setValue(mMicVolume);
- getChild<LLComboBox>("voice_input_device")->setCommitCallback(
+ mCtrlInputDevices = getChild<LLComboBox>("voice_input_device");
+ mCtrlOutputDevices = getChild<LLComboBox>("voice_output_device");
+
+ mCtrlInputDevices->setCommitCallback(
boost::bind(&LLPanelVoiceDeviceSettings::onCommitInputDevice, this));
- getChild<LLComboBox>("voice_output_device")->setCommitCallback(
+ mCtrlOutputDevices->setCommitCallback(
boost::bind(&LLPanelVoiceDeviceSettings::onCommitOutputDevice, this));
+
+ mLocalizedDeviceNames[DEFAULT_DEVICE] = getString("default_text");
+ mLocalizedDeviceNames["No Device"] = getString("name_no_device");
+ mLocalizedDeviceNames["Default System Device"] = getString("name_default_system_device");
return TRUE;
}
@@ -96,7 +105,7 @@ void LLPanelVoiceDeviceSettings::draw()
// let user know that volume indicator is not yet available
bool is_in_tuning_mode = LLVoiceClient::getInstance()->inTuningMode();
- getChildView("wait_text")->setVisible( !is_in_tuning_mode);
+ getChildView("wait_text")->setVisible( !is_in_tuning_mode && mUseTuningMode);
LLPanel::draw();
@@ -137,14 +146,14 @@ void LLPanelVoiceDeviceSettings::apply()
std::string s;
if(mCtrlInputDevices)
{
- s = mCtrlInputDevices->getSimple();
+ s = mCtrlInputDevices->getValue().asString();
gSavedSettings.setString("VoiceInputAudioDevice", s);
mInputDevice = s;
}
if(mCtrlOutputDevices)
{
- s = mCtrlOutputDevices->getSimple();
+ s = mCtrlOutputDevices->getValue().asString();
gSavedSettings.setString("VoiceOutputAudioDevice", s);
mOutputDevice = s;
}
@@ -165,10 +174,10 @@ void LLPanelVoiceDeviceSettings::cancel()
gSavedSettings.setString("VoiceOutputAudioDevice", mOutputDevice);
if(mCtrlInputDevices)
- mCtrlInputDevices->setSimple(mInputDevice);
+ mCtrlInputDevices->setValue(mInputDevice);
if(mCtrlOutputDevices)
- mCtrlOutputDevices->setSimple(mOutputDevice);
+ mCtrlOutputDevices->setValue(mOutputDevice);
gSavedSettings.setF32("AudioLevelMic", mMicVolume);
LLSlider* volume_slider = getChild<LLSlider>("mic_volume_slider");
@@ -187,25 +196,37 @@ void LLPanelVoiceDeviceSettings::refresh()
LLVoiceClient::getInstance()->tuningSetMicVolume(current_volume);
// Fill in popup menus
- mCtrlInputDevices = getChild<LLComboBox>("voice_input_device");
- mCtrlOutputDevices = getChild<LLComboBox>("voice_output_device");
+ bool device_settings_available = LLVoiceClient::getInstance()->deviceSettingsAvailable();
+
+ if (mCtrlInputDevices)
+ {
+ mCtrlInputDevices->setEnabled(device_settings_available);
+ }
- if(!LLVoiceClient::getInstance()->deviceSettingsAvailable())
+ if (mCtrlOutputDevices)
+ {
+ mCtrlOutputDevices->setEnabled(device_settings_available);
+ }
+
+ getChild<LLSlider>("mic_volume_slider")->setEnabled(device_settings_available);
+
+ if(!device_settings_available)
{
// The combo boxes are disabled, since we can't get the device settings from the daemon just now.
// Put the currently set default (ONLY) in the box, and select it.
if(mCtrlInputDevices)
{
mCtrlInputDevices->removeall();
- mCtrlInputDevices->add( mInputDevice, ADD_BOTTOM );
- mCtrlInputDevices->setSimple(mInputDevice);
+ mCtrlInputDevices->add(getLocalizedDeviceName(mInputDevice), mInputDevice, ADD_BOTTOM);
+ mCtrlInputDevices->setValue(mInputDevice);
}
if(mCtrlOutputDevices)
{
mCtrlOutputDevices->removeall();
- mCtrlOutputDevices->add( mOutputDevice, ADD_BOTTOM );
- mCtrlOutputDevices->setSimple(mOutputDevice);
+ mCtrlOutputDevices->add(getLocalizedDeviceName(mOutputDevice), mOutputDevice, ADD_BOTTOM);
+ mCtrlOutputDevices->setValue(mOutputDevice);
}
+ mDevicesUpdated = FALSE;
}
else if (!mDevicesUpdated)
{
@@ -214,67 +235,41 @@ void LLPanelVoiceDeviceSettings::refresh()
if(mCtrlInputDevices)
{
mCtrlInputDevices->removeall();
- mCtrlInputDevices->add( getString("default_text"), ADD_BOTTOM );
+ mCtrlInputDevices->add(getLocalizedDeviceName(DEFAULT_DEVICE), DEFAULT_DEVICE, ADD_BOTTOM);
for(iter=LLVoiceClient::getInstance()->getCaptureDevices().begin();
iter != LLVoiceClient::getInstance()->getCaptureDevices().end();
iter++)
{
- // Lets try to localize some system device names. EXT-8375
- std::string device_name = *iter;
- LLStringUtil::toLower(device_name); //compare in low case
- if ("default system device" == device_name)
- {
- device_name = getString(device_name);
- }
- else if ("no device" == device_name)
- {
- device_name = getString(device_name);
- }
- else
- {
- // restore original value
- device_name = *iter;
- }
- mCtrlInputDevices->add(device_name, ADD_BOTTOM );
+ mCtrlInputDevices->add(getLocalizedDeviceName(*iter), *iter, ADD_BOTTOM);
}
- if(!mCtrlInputDevices->setSimple(mInputDevice))
+ // Fix invalid input audio device preference.
+ if (!mCtrlInputDevices->setSelectedByValue(mInputDevice, TRUE))
{
- mCtrlInputDevices->setSimple(getString("default_text"));
+ mCtrlInputDevices->setValue(DEFAULT_DEVICE);
+ gSavedSettings.setString("VoiceInputAudioDevice", DEFAULT_DEVICE);
+ mInputDevice = DEFAULT_DEVICE;
}
}
if(mCtrlOutputDevices)
{
mCtrlOutputDevices->removeall();
- mCtrlOutputDevices->add( getString("default_text"), ADD_BOTTOM );
+ mCtrlOutputDevices->add(getLocalizedDeviceName(DEFAULT_DEVICE), DEFAULT_DEVICE, ADD_BOTTOM);
for(iter= LLVoiceClient::getInstance()->getRenderDevices().begin();
iter != LLVoiceClient::getInstance()->getRenderDevices().end(); iter++)
{
- // Lets try to localize some system device names. EXT-8375
- std::string device_name = *iter;
- LLStringUtil::toLower(device_name); //compare in low case
- if ("default system device" == device_name)
- {
- device_name = getString(device_name);
- }
- else if ("no device" == device_name)
- {
- device_name = getString(device_name);
- }
- else
- {
- // restore original value
- device_name = *iter;
- }
- mCtrlOutputDevices->add(device_name, ADD_BOTTOM );
+ mCtrlOutputDevices->add(getLocalizedDeviceName(*iter), *iter, ADD_BOTTOM);
}
- if(!mCtrlOutputDevices->setSimple(mOutputDevice))
+ // Fix invalid output audio device preference.
+ if (!mCtrlOutputDevices->setSelectedByValue(mOutputDevice, TRUE))
{
- mCtrlOutputDevices->setSimple(getString("default_text"));
+ mCtrlOutputDevices->setValue(DEFAULT_DEVICE);
+ gSavedSettings.setString("VoiceOutputAudioDevice", DEFAULT_DEVICE);
+ mOutputDevice = DEFAULT_DEVICE;
}
}
mDevicesUpdated = TRUE;
@@ -292,14 +287,27 @@ void LLPanelVoiceDeviceSettings::initialize()
LLVoiceClient::getInstance()->refreshDeviceLists();
// put voice client in "tuning" mode
- LLVoiceClient::getInstance()->tuningStart();
- LLVoiceChannel::suspend();
+ if (mUseTuningMode)
+ {
+ LLVoiceClient::getInstance()->tuningStart();
+ LLVoiceChannel::suspend();
+ }
}
void LLPanelVoiceDeviceSettings::cleanup()
{
- LLVoiceClient::getInstance()->tuningStop();
- LLVoiceChannel::resume();
+ if (mUseTuningMode)
+ {
+ LLVoiceClient::getInstance()->tuningStop();
+ LLVoiceChannel::resume();
+ }
+}
+
+// returns English name if no translation found
+std::string LLPanelVoiceDeviceSettings::getLocalizedDeviceName(const std::string& en_dev_name)
+{
+ std::map<std::string, std::string>::const_iterator it = mLocalizedDeviceNames.find(en_dev_name);
+ return it != mLocalizedDeviceNames.end() ? it->second : en_dev_name;
}
void LLPanelVoiceDeviceSettings::onCommitInputDevice()
@@ -307,7 +315,7 @@ void LLPanelVoiceDeviceSettings::onCommitInputDevice()
if(LLVoiceClient::getInstance())
{
LLVoiceClient::getInstance()->setCaptureDevice(
- getChild<LLComboBox>("voice_input_device")->getValue().asString());
+ mCtrlInputDevices->getValue().asString());
}
}
@@ -316,6 +324,6 @@ void LLPanelVoiceDeviceSettings::onCommitOutputDevice()
if(LLVoiceClient::getInstance())
{
LLVoiceClient::getInstance()->setRenderDevice(
- getChild<LLComboBox>("voice_input_device")->getValue().asString());
+ mCtrlInputDevices->getValue().asString());
}
}
diff --git a/indra/newview/llpanelvoicedevicesettings.h b/indra/newview/llpanelvoicedevicesettings.h
index 636b8b9948..ba3bcad0dc 100644
--- a/indra/newview/llpanelvoicedevicesettings.h
+++ b/indra/newview/llpanelvoicedevicesettings.h
@@ -45,8 +45,12 @@ public:
void cleanup();
/*virtual*/ void handleVisibilityChange ( BOOL new_visibility );
+
+ void setUseTuningMode(bool use) { mUseTuningMode = use; };
protected:
+ std::string getLocalizedDeviceName(const std::string& en_dev_name);
+
void onCommitInputDevice();
void onCommitOutputDevice();
@@ -56,6 +60,8 @@ protected:
class LLComboBox *mCtrlInputDevices;
class LLComboBox *mCtrlOutputDevices;
BOOL mDevicesUpdated;
+ bool mUseTuningMode;
+ std::map<std::string, std::string> mLocalizedDeviceNames;
};
#endif // LL_LLPANELVOICEDEVICESETTINGS_H
diff --git a/indra/newview/llpanelvoiceeffect.cpp b/indra/newview/llpanelvoiceeffect.cpp
index 4bbfec8ab7..5fec6d967d 100644
--- a/indra/newview/llpanelvoiceeffect.cpp
+++ b/indra/newview/llpanelvoiceeffect.cpp
@@ -123,7 +123,6 @@ void LLPanelVoiceEffect::update(bool list_updated)
if (mVoiceEffectCombo)
{
LLVoiceEffectInterface* effect_interface = LLVoiceClient::instance().getVoiceEffectInterface();
- llassert(effect_interface);
if (!effect_interface) return;
if (list_updated)
{
diff --git a/indra/newview/llpanelvolume.cpp b/indra/newview/llpanelvolume.cpp
index 065c4d0b92..12eea7844d 100644
--- a/indra/newview/llpanelvolume.cpp
+++ b/indra/newview/llpanelvolume.cpp
@@ -59,6 +59,7 @@
#include "lltool.h"
#include "lltoolcomp.h"
#include "lltoolmgr.h"
+#include "lltrans.h"
#include "llui.h"
#include "llviewerobject.h"
#include "llviewerregion.h"
@@ -71,6 +72,11 @@
#include "lldrawpool.h"
#include "lluictrlfactory.h"
+// For mesh physics
+#include "llagent.h"
+#include "llviewercontrol.h"
+#include "llmeshrepository.h"
+
// "Features" Tab
BOOL LLPanelVolume::postBuild()
@@ -129,6 +135,57 @@ BOOL LLPanelVolume::postBuild()
getChild<LLUICtrl>("Light Ambiance")->setValidateBeforeCommit( precommitValidate);
}
+ // PHYSICS Parameters
+ {
+ // PhysicsShapeType combobox
+ mComboPhysicsShapeType = getChild<LLComboBox>("Physics Shape Type Combo Ctrl");
+ mComboPhysicsShapeType->setCommitCallback(boost::bind(&LLPanelVolume::sendPhysicsShapeType, this, _1, mComboPhysicsShapeType));
+
+ // PhysicsGravity
+ mSpinPhysicsGravity = getChild<LLSpinCtrl>("Physics Gravity");
+ mSpinPhysicsGravity->setCommitCallback(boost::bind(&LLPanelVolume::sendPhysicsGravity, this, _1, mSpinPhysicsGravity));
+
+ // PhysicsFriction
+ mSpinPhysicsFriction = getChild<LLSpinCtrl>("Physics Friction");
+ mSpinPhysicsFriction->setCommitCallback(boost::bind(&LLPanelVolume::sendPhysicsFriction, this, _1, mSpinPhysicsFriction));
+
+ // PhysicsDensity
+ mSpinPhysicsDensity = getChild<LLSpinCtrl>("Physics Density");
+ mSpinPhysicsDensity->setCommitCallback(boost::bind(&LLPanelVolume::sendPhysicsDensity, this, _1, mSpinPhysicsDensity));
+
+ // PhysicsRestitution
+ mSpinPhysicsRestitution = getChild<LLSpinCtrl>("Physics Restitution");
+ mSpinPhysicsRestitution->setCommitCallback(boost::bind(&LLPanelVolume::sendPhysicsRestitution, this, _1, mSpinPhysicsRestitution));
+ }
+
+ std::map<std::string, std::string> material_name_map;
+ material_name_map["Stone"]= LLTrans::getString("Stone");
+ material_name_map["Metal"]= LLTrans::getString("Metal");
+ material_name_map["Glass"]= LLTrans::getString("Glass");
+ material_name_map["Wood"]= LLTrans::getString("Wood");
+ material_name_map["Flesh"]= LLTrans::getString("Flesh");
+ material_name_map["Plastic"]= LLTrans::getString("Plastic");
+ material_name_map["Rubber"]= LLTrans::getString("Rubber");
+ material_name_map["Light"]= LLTrans::getString("Light");
+
+ LLMaterialTable::basic.initTableTransNames(material_name_map);
+
+ // material type popup
+ mComboMaterial = getChild<LLComboBox>("material");
+ childSetCommitCallback("material",onCommitMaterial,this);
+ mComboMaterial->removeall();
+
+ for (LLMaterialTable::info_list_t::iterator iter = LLMaterialTable::basic.mMaterialInfoList.begin();
+ iter != LLMaterialTable::basic.mMaterialInfoList.end(); ++iter)
+ {
+ LLMaterialInfo* minfop = *iter;
+ if (minfop->mMCode != LL_MCODE_LIGHT)
+ {
+ mComboMaterial->add(minfop->mName);
+ }
+ }
+ mComboMaterialItemCount = mComboMaterial->getItemCount();
+
// Start with everyone disabled
clearCtrls();
@@ -136,7 +193,8 @@ BOOL LLPanelVolume::postBuild()
}
LLPanelVolume::LLPanelVolume()
- : LLPanel()
+ : LLPanel(),
+ mComboMaterialItemCount(0)
{
setMouseOpaque(FALSE);
@@ -293,7 +351,7 @@ void LLPanelVolume::getState( )
getChild<LLUICtrl>("Flexible1D Checkbox Ctrl")->setValue(is_flexible);
if (is_flexible || (volobjp && volobjp->canBeFlexible()))
{
- getChildView("Flexible1D Checkbox Ctrl")->setEnabled(editable && single_volume && volobjp);
+ getChildView("Flexible1D Checkbox Ctrl")->setEnabled(editable && single_volume && volobjp && !volobjp->isMesh());
}
else
{
@@ -351,6 +409,94 @@ void LLPanelVolume::getState( )
getChildView("FlexForceZ")->setEnabled(false);
}
+ // Material properties
+
+ // Update material part
+ // slightly inefficient - materials are unique per object, not per TE
+ U8 material_code = 0;
+ struct f : public LLSelectedTEGetFunctor<U8>
+ {
+ U8 get(LLViewerObject* object, S32 te)
+ {
+ return object->getMaterial();
+ }
+ } func;
+ bool material_same = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func, material_code );
+ std::string LEGACY_FULLBRIGHT_DESC = LLTrans::getString("Fullbright");
+ if (editable && single_volume && material_same)
+ {
+ mComboMaterial->setEnabled( TRUE );
+ if (material_code == LL_MCODE_LIGHT)
+ {
+ if (mComboMaterial->getItemCount() == mComboMaterialItemCount)
+ {
+ mComboMaterial->add(LEGACY_FULLBRIGHT_DESC);
+ }
+ mComboMaterial->setSimple(LEGACY_FULLBRIGHT_DESC);
+ }
+ else
+ {
+ if (mComboMaterial->getItemCount() != mComboMaterialItemCount)
+ {
+ mComboMaterial->remove(LEGACY_FULLBRIGHT_DESC);
+ }
+
+ mComboMaterial->setSimple(std::string(LLMaterialTable::basic.getName(material_code)));
+ }
+ }
+ else
+ {
+ mComboMaterial->setEnabled( FALSE );
+ }
+
+ // Physics properties
+
+ mSpinPhysicsGravity->set(objectp->getPhysicsGravity());
+ mSpinPhysicsGravity->setEnabled(editable);
+
+ mSpinPhysicsFriction->set(objectp->getPhysicsFriction());
+ mSpinPhysicsFriction->setEnabled(editable);
+
+ mSpinPhysicsDensity->set(objectp->getPhysicsDensity());
+ mSpinPhysicsDensity->setEnabled(editable);
+
+ mSpinPhysicsRestitution->set(objectp->getPhysicsRestitution());
+ mSpinPhysicsRestitution->setEnabled(editable);
+
+ // update the physics shape combo to include allowed physics shapes
+ mComboPhysicsShapeType->removeall();
+ mComboPhysicsShapeType->add(getString("None"), LLSD(1));
+
+ BOOL isMesh = FALSE;
+ LLSculptParams *sculpt_params = (LLSculptParams *)objectp->getParameterEntry(LLNetworkData::PARAMS_SCULPT);
+ if (sculpt_params)
+ {
+ U8 sculpt_type = sculpt_params->getSculptType();
+ U8 sculpt_stitching = sculpt_type & LL_SCULPT_TYPE_MASK;
+ isMesh = (sculpt_stitching == LL_SCULPT_TYPE_MESH);
+ }
+
+ if(isMesh && objectp)
+ {
+ const LLVolumeParams &volume_params = objectp->getVolume()->getParams();
+ LLUUID mesh_id = volume_params.getSculptID();
+ if(gMeshRepo.hasPhysicsShape(mesh_id))
+ {
+ // if a mesh contains an uploaded or decomposed physics mesh,
+ // allow 'Prim'
+ mComboPhysicsShapeType->add(getString("Prim"), LLSD(0));
+ }
+ }
+ else
+ {
+ // simple prims always allow physics shape prim
+ mComboPhysicsShapeType->add(getString("Prim"), LLSD(0));
+ }
+
+ mComboPhysicsShapeType->add(getString("Convex Hull"), LLSD(2));
+ mComboPhysicsShapeType->setValue(LLSD(objectp->getPhysicsShapeType()));
+ mComboPhysicsShapeType->setEnabled(editable);
+
mObject = objectp;
mRootObject = root_objectp;
}
@@ -384,6 +530,24 @@ void LLPanelVolume::refresh()
getChildView("Light Ambiance")->setVisible( visible);
getChildView("light texture control")->setVisible( visible);
+ bool enable_mesh = false;
+
+ LLSD sim_features;
+ LLViewerRegion *region = gAgent.getRegion();
+ if(region)
+ {
+ LLSD sim_features;
+ region->getSimulatorFeatures(sim_features);
+ enable_mesh = sim_features.has("PhysicsShapeTypes");
+ }
+ getChildView("label physicsshapetype")->setVisible(enable_mesh);
+ getChildView("Physics Shape Type Combo Ctrl")->setVisible(enable_mesh);
+ getChildView("Physics Gravity")->setVisible(enable_mesh);
+ getChildView("Physics Friction")->setVisible(enable_mesh);
+ getChildView("Physics Density")->setVisible(enable_mesh);
+ getChildView("Physics Restitution")->setVisible(enable_mesh);
+
+ /* TODO: add/remove individual physics shape types as per the PhysicsShapeTypes simulator features */
}
@@ -430,6 +594,13 @@ void LLPanelVolume::clearCtrls()
getChildView("FlexForceX")->setEnabled(false);
getChildView("FlexForceY")->setEnabled(false);
getChildView("FlexForceZ")->setEnabled(false);
+
+ mSpinPhysicsGravity->setEnabled(FALSE);
+ mSpinPhysicsFriction->setEnabled(FALSE);
+ mSpinPhysicsDensity->setEnabled(FALSE);
+ mSpinPhysicsRestitution->setEnabled(FALSE);
+
+ mComboMaterial->setEnabled( FALSE );
}
//
@@ -482,6 +653,48 @@ void LLPanelVolume::sendIsFlexible()
llinfos << "update flexible sent" << llendl;
}
+void LLPanelVolume::sendPhysicsShapeType(LLUICtrl* ctrl, void* userdata)
+{
+ U8 type = ctrl->getValue().asInteger();
+ LLSelectMgr::getInstance()->selectionSetPhysicsType(type);
+
+ refreshCost();
+}
+
+void LLPanelVolume::sendPhysicsGravity(LLUICtrl* ctrl, void* userdata)
+{
+ F32 val = ctrl->getValue().asReal();
+ LLSelectMgr::getInstance()->selectionSetGravity(val);
+}
+
+void LLPanelVolume::sendPhysicsFriction(LLUICtrl* ctrl, void* userdata)
+{
+ F32 val = ctrl->getValue().asReal();
+ LLSelectMgr::getInstance()->selectionSetFriction(val);
+}
+
+void LLPanelVolume::sendPhysicsRestitution(LLUICtrl* ctrl, void* userdata)
+{
+ F32 val = ctrl->getValue().asReal();
+ LLSelectMgr::getInstance()->selectionSetRestitution(val);
+}
+
+void LLPanelVolume::sendPhysicsDensity(LLUICtrl* ctrl, void* userdata)
+{
+ F32 val = ctrl->getValue().asReal();
+ LLSelectMgr::getInstance()->selectionSetDensity(val);
+}
+
+void LLPanelVolume::refreshCost()
+{
+ LLViewerObject* obj = LLSelectMgr::getInstance()->getSelection()->getFirstObject();
+
+ if (obj)
+ {
+ obj->getObjectCost();
+ }
+}
+
void LLPanelVolume::onLightCancelColor(const LLSD& data)
{
LLColorSwatchCtrl* LightColorSwatch = getChild<LLColorSwatchCtrl>("colorswatch");
@@ -540,6 +753,25 @@ void LLPanelVolume::onLightSelectTexture(const LLSD& data)
}
// static
+void LLPanelVolume::onCommitMaterial( LLUICtrl* ctrl, void* userdata )
+{
+ //LLPanelObject* self = (LLPanelObject*) userdata;
+ LLComboBox* box = (LLComboBox*) ctrl;
+
+ if (box)
+ {
+ // apply the currently selected material to the object
+ const std::string& material_name = box->getSimple();
+ std::string LEGACY_FULLBRIGHT_DESC = LLTrans::getString("Fullbright");
+ if (material_name != LEGACY_FULLBRIGHT_DESC)
+ {
+ U8 material_code = LLMaterialTable::basic.getMCode(material_name);
+ LLSelectMgr::getInstance()->selectionSetMaterial(material_code);
+ }
+ }
+}
+
+// static
void LLPanelVolume::onCommitLight( LLUICtrl* ctrl, void* userdata )
{
LLPanelVolume* self = (LLPanelVolume*) userdata;
diff --git a/indra/newview/llpanelvolume.h b/indra/newview/llpanelvolume.h
index 90a2abda25..0ef47db0d9 100644
--- a/indra/newview/llpanelvolume.h
+++ b/indra/newview/llpanelvolume.h
@@ -63,6 +63,8 @@ public:
static void onCommitLight( LLUICtrl* ctrl, void* userdata);
static void onCommitIsFlexible( LLUICtrl* ctrl, void* userdata);
static void onCommitFlexible( LLUICtrl* ctrl, void* userdata);
+ static void onCommitPhysicsParam( LLUICtrl* ctrl, void* userdata);
+ static void onCommitMaterial( LLUICtrl* ctrl, void* userdata);
void onLightCancelColor(const LLSD& data);
void onLightSelectColor(const LLSD& data);
@@ -73,8 +75,15 @@ public:
protected:
void getState();
+ void refreshCost();
protected:
+ void sendPhysicsShapeType(LLUICtrl* ctrl, void* userdata);
+ void sendPhysicsGravity(LLUICtrl* ctrl, void* userdata);
+ void sendPhysicsFriction(LLUICtrl* ctrl, void* userdata);
+ void sendPhysicsRestitution(LLUICtrl* ctrl, void* userdata);
+ void sendPhysicsDensity(LLUICtrl* ctrl, void* userdata);
+
/*
LLTextBox* mLabelSelectSingleMessage;
// Light
@@ -95,10 +104,20 @@ protected:
LLSpinCtrl* mSpinForce[3];
*/
+ S32 mComboMaterialItemCount;
+ LLComboBox* mComboMaterial;
+
+
LLColor4 mLightSavedColor;
LLUUID mLightSavedTexture;
LLPointer<LLViewerObject> mObject;
LLPointer<LLViewerObject> mRootObject;
+
+ LLComboBox* mComboPhysicsShapeType;
+ LLSpinCtrl* mSpinPhysicsGravity;
+ LLSpinCtrl* mSpinPhysicsFriction;
+ LLSpinCtrl* mSpinPhysicsDensity;
+ LLSpinCtrl* mSpinPhysicsRestitution;
};
#endif
diff --git a/indra/newview/llpanelwearing.cpp b/indra/newview/llpanelwearing.cpp
index 911a9e5dda..3b9934d4be 100644
--- a/indra/newview/llpanelwearing.cpp
+++ b/indra/newview/llpanelwearing.cpp
@@ -31,18 +31,20 @@
#include "lltoggleablemenu.h"
#include "llappearancemgr.h"
+#include "llfloatersidepanelcontainer.h"
#include "llinventoryfunctions.h"
#include "llinventorymodel.h"
#include "llinventoryobserver.h"
#include "llmenubutton.h"
-#include "llsidetray.h"
#include "llviewermenu.h"
#include "llwearableitemslist.h"
+#include "llsdserialize.h"
+#include "llclipboard.h"
// Context menu and Gear menu helper.
static void edit_outfit()
{
- LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD().with("type", "edit_outfit"));
+ LLFloaterSidePanelContainer::showPanel("appearance", LLSD().with("type", "edit_outfit"));
}
//////////////////////////////////////////////////////////////////////////
@@ -58,6 +60,7 @@ public:
registrar.add("Gear.Edit", boost::bind(&edit_outfit));
registrar.add("Gear.TakeOff", boost::bind(&LLWearingGearMenu::onTakeOff, this));
+ registrar.add("Gear.Copy", boost::bind(&LLPanelWearing::copyToClipboard, mPanelWearing));
enable_registrar.add("Gear.OnEnable", boost::bind(&LLPanelWearing::isActionEnabled, mPanelWearing, _2));
@@ -174,8 +177,8 @@ LLPanelWearing::~LLPanelWearing()
if (gInventory.containsObserver(mCategoriesObserver))
{
gInventory.removeObserver(mCategoriesObserver);
- delete mCategoriesObserver;
}
+ delete mCategoriesObserver;
}
BOOL LLPanelWearing::postBuild()
@@ -280,4 +283,25 @@ void LLPanelWearing::getSelectedItemsUUIDs(uuid_vec_t& selected_uuids) const
mCOFItemsList->getSelectedUUIDs(selected_uuids);
}
+void LLPanelWearing::copyToClipboard()
+{
+ std::string text;
+ std::vector<LLSD> data;
+ mCOFItemsList->getValues(data);
+
+ for(std::vector<LLSD>::const_iterator iter = data.begin(); iter != data.end();)
+ {
+ LLSD uuid = (*iter);
+ LLViewerInventoryItem* item = gInventory.getItem(uuid);
+
+ iter++;
+ if (item != NULL)
+ {
+ // Append a newline to all but the last line
+ text += iter != data.end() ? item->getName() + "\n" : item->getName();
+ }
+ }
+
+ LLClipboard::instance().copyToClipboard(utf8str_to_wstring(text),0,text.size());
+}
// EOF
diff --git a/indra/newview/llpanelwearing.h b/indra/newview/llpanelwearing.h
index 157b2c4c5f..9a212b3cca 100644
--- a/indra/newview/llpanelwearing.h
+++ b/indra/newview/llpanelwearing.h
@@ -60,6 +60,8 @@ public:
/*virtual*/ void getSelectedItemsUUIDs(uuid_vec_t& selected_uuids) const;
+ /*virtual*/ void copyToClipboard();
+
boost::signals2::connection setSelectionChangeCallback(commit_callback_t cb);
bool hasItemSelected();
diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp
index 54053cf89f..975a6c67d8 100644
--- a/indra/newview/llparticipantlist.cpp
+++ b/indra/newview/llparticipantlist.cpp
@@ -390,7 +390,10 @@ void LLParticipantList::onAvatarListRefreshed(LLUICtrl* ctrl, const LLSD& param)
{
const LLPointer<LLSpeaker>& speakerp = *it;
- update_speaker_indicator(list, speakerp->mID, speakerp->mModeratorMutedVoice);
+ if (speakerp->mStatus == LLSpeaker::STATUS_TEXT_ONLY)
+ {
+ update_speaker_indicator(list, speakerp->mID, speakerp->mModeratorMutedVoice);
+ }
}
}
}
@@ -466,17 +469,24 @@ void LLParticipantList::setValidateSpeakerCallback(validate_speaker_callback_t c
mValidateSpeakerCallback = cb;
}
-void LLParticipantList::updateRecentSpeakersOrder()
+void LLParticipantList::update()
{
- if (E_SORT_BY_RECENT_SPEAKERS == getSortOrder())
+ mSpeakerMgr->update(true);
+
+ if (E_SORT_BY_RECENT_SPEAKERS == getSortOrder() && !isHovered())
{
- // Need to update speakers to sort list correctly
- mSpeakerMgr->update(true);
// Resort avatar list
sort();
}
}
+bool LLParticipantList::isHovered()
+{
+ S32 x, y;
+ LLUI::getMousePositionScreen(&x, &y);
+ return mAvatarList->calcScreenRect().pointInRect(x, y);
+}
+
bool LLParticipantList::onAddItemEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)
{
LLUUID uu_id = event->getValue().asUUID();
@@ -753,6 +763,7 @@ void LLParticipantList::LLParticipantListMenu::toggleMute(const LLSD& userdata,
LLPointer<LLSpeaker> speakerp = mParent.mSpeakerMgr->findSpeaker(speaker_id);
if (speakerp.isNull())
{
+ LL_WARNS("Speakers") << "Speaker " << speaker_id << " not found" << llendl;
return;
}
LLAvatarListItem* item = dynamic_cast<LLAvatarListItem*>(mParent.mAvatarList->getItemByValue(speaker_id));
@@ -798,11 +809,19 @@ void LLParticipantList::LLParticipantListMenu::toggleMuteVoice(const LLSD& userd
bool LLParticipantList::LLParticipantListMenu::isGroupModerator()
{
- // Agent is in Group Call
+ if (!mParent.mSpeakerMgr)
+ {
+ llwarns << "Speaker manager is missing" << llendl;
+ return false;
+ }
+
+ // Is session a group call/chat?
if(gAgent.isInGroup(mParent.mSpeakerMgr->getSessionID()))
{
- // Agent is Moderator
- return mParent.mSpeakerMgr->findSpeaker(gAgentID)->mIsModerator;
+ LLSpeaker* speaker = mParent.mSpeakerMgr->findSpeaker(gAgentID).get();
+
+ // Is agent a moderator?
+ return speaker && speaker->mIsModerator;
}
return false;
}
diff --git a/indra/newview/llparticipantlist.h b/indra/newview/llparticipantlist.h
index e0b3d42c25..53966c15fe 100644
--- a/indra/newview/llparticipantlist.h
+++ b/indra/newview/llparticipantlist.h
@@ -72,9 +72,9 @@ public:
const EParticipantSortOrder getSortOrder() const;
/**
- * Refreshes the participant list if it's in sort by recent speaker order.
+ * Refreshes the participant list.
*/
- void updateRecentSpeakersOrder();
+ void update();
/**
* Set a callback to be called before adding a speaker. Invalid speakers will not be added.
@@ -251,6 +251,8 @@ private:
*/
void adjustParticipant(const LLUUID& speaker_id);
+ bool isHovered();
+
LLSpeakerMgr* mSpeakerMgr;
LLAvatarList* mAvatarList;
diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp
new file mode 100644
index 0000000000..e124916c48
--- /dev/null
+++ b/indra/newview/llphysicsmotion.cpp
@@ -0,0 +1,732 @@
+/**
+ * @file llphysicsmotion.cpp
+ * @brief Implementation of LLPhysicsMotion class.
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+//-----------------------------------------------------------------------------
+// Header Files
+//-----------------------------------------------------------------------------
+#include "llviewerprecompiledheaders.h"
+#include "linden_common.h"
+
+#include "m3math.h"
+#include "v3dmath.h"
+
+#include "llphysicsmotion.h"
+#include "llagent.h"
+#include "llcharacter.h"
+#include "llviewercontrol.h"
+#include "llviewervisualparam.h"
+#include "llvoavatarself.h"
+
+typedef std::map<std::string, std::string> controller_map_t;
+typedef std::map<std::string, F32> default_controller_map_t;
+
+#define MIN_REQUIRED_PIXEL_AREA_AVATAR_PHYSICS_MOTION 0.f
+#define TIME_ITERATION_STEP 0.1f
+
+inline F64 llsgn(const F64 a)
+{
+ if (a >= 0)
+ return 1;
+ return -1;
+}
+
+/*
+ At a high level, this works by setting temporary parameters that are not stored
+ in the avatar's list of params, and are not conveyed to other users. We accomplish
+ this by creating some new temporary driven params inside avatar_lad that are then driven
+ by the actual params that the user sees and sets. For example, in the old system,
+ the user sets a param called breast bouyancy, which controls the Z value of the breasts.
+ In our new system, the user still sets the breast bouyancy, but that param is redefined
+ as a driver param so that affects a new temporary driven param that the bounce is applied
+ to.
+*/
+
+class LLPhysicsMotion
+{
+public:
+ /*
+ param_driver_name: The param that controls the params that are being affected by the physics.
+ joint_name: The joint that the body part is attached to. The joint is
+ used to determine the orientation (rotation) of the body part.
+
+ character: The avatar that this physics affects.
+
+ motion_direction_vec: The direction (in world coordinates) that determines the
+ motion. For example, (0,0,1) is up-down, and means that up-down motion is what
+ determines how this joint moves.
+
+ controllers: The various settings (e.g. spring force, mass) that determine how
+ the body part behaves.
+ */
+ LLPhysicsMotion(const std::string &param_driver_name,
+ const std::string &joint_name,
+ LLCharacter *character,
+ const LLVector3 &motion_direction_vec,
+ const controller_map_t &controllers) :
+ mParamDriverName(param_driver_name),
+ mJointName(joint_name),
+ mMotionDirectionVec(motion_direction_vec),
+ mParamDriver(NULL),
+ mParamControllers(controllers),
+ mCharacter(character),
+ mLastTime(0),
+ mPosition_local(0),
+ mVelocityJoint_local(0),
+ mPositionLastUpdate_local(0)
+ {
+ mJointState = new LLJointState;
+ }
+
+ BOOL initialize();
+
+ ~LLPhysicsMotion() {}
+
+ BOOL onUpdate(F32 time);
+
+ LLPointer<LLJointState> getJointState()
+ {
+ return mJointState;
+ }
+protected:
+ F32 getParamValue(const std::string& controller_key)
+ {
+ const controller_map_t::const_iterator& entry = mParamControllers.find(controller_key);
+ if (entry == mParamControllers.end())
+ {
+ return sDefaultController[controller_key];
+ }
+ const std::string& param_name = (*entry).second.c_str();
+ return mCharacter->getVisualParamWeight(param_name.c_str());
+ }
+ void setParamValue(LLViewerVisualParam *param,
+ const F32 new_value_local,
+ F32 behavior_maxeffect);
+
+ F32 toLocal(const LLVector3 &world);
+ F32 calculateVelocity_local();
+ F32 calculateAcceleration_local(F32 velocity_local);
+private:
+ const std::string mParamDriverName;
+ const std::string mParamControllerName;
+ const LLVector3 mMotionDirectionVec;
+ const std::string mJointName;
+
+ F32 mPosition_local;
+ F32 mVelocityJoint_local; // How fast the joint is moving
+ F32 mAccelerationJoint_local; // Acceleration on the joint
+
+ F32 mVelocity_local; // How fast the param is moving
+ F32 mPositionLastUpdate_local;
+ LLVector3 mPosition_world;
+
+ LLViewerVisualParam *mParamDriver;
+ const controller_map_t mParamControllers;
+
+ LLPointer<LLJointState> mJointState;
+ LLCharacter *mCharacter;
+
+ F32 mLastTime;
+
+ static default_controller_map_t sDefaultController;
+};
+
+default_controller_map_t initDefaultController()
+{
+ default_controller_map_t controller;
+ controller["Mass"] = 0.2f;
+ controller["Gravity"] = 0.0f;
+ controller["Damping"] = .05f;
+ controller["Drag"] = 0.15f;
+ controller["MaxEffect"] = 0.1f;
+ controller["Spring"] = 0.1f;
+ controller["Gain"] = 10.0f;
+ return controller;
+}
+
+default_controller_map_t LLPhysicsMotion::sDefaultController = initDefaultController();
+
+BOOL LLPhysicsMotion::initialize()
+{
+ if (!mJointState->setJoint(mCharacter->getJoint(mJointName.c_str())))
+ return FALSE;
+ mJointState->setUsage(LLJointState::ROT);
+
+ mParamDriver = (LLViewerVisualParam*)mCharacter->getVisualParam(mParamDriverName.c_str());
+ if (mParamDriver == NULL)
+ {
+ llinfos << "Failure reading in [ " << mParamDriverName << " ]" << llendl;
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+LLPhysicsMotionController::LLPhysicsMotionController(const LLUUID &id) :
+ LLMotion(id),
+ mCharacter(NULL)
+{
+ mName = "breast_motion";
+}
+
+LLPhysicsMotionController::~LLPhysicsMotionController()
+{
+ for (motion_vec_t::iterator iter = mMotions.begin();
+ iter != mMotions.end();
+ ++iter)
+ {
+ delete (*iter);
+ }
+}
+
+BOOL LLPhysicsMotionController::onActivate()
+{
+ return TRUE;
+}
+
+void LLPhysicsMotionController::onDeactivate()
+{
+}
+
+LLMotion::LLMotionInitStatus LLPhysicsMotionController::onInitialize(LLCharacter *character)
+{
+ mCharacter = character;
+
+ mMotions.clear();
+
+ // Breast Cleavage
+ {
+ controller_map_t controller;
+ controller["Mass"] = "Breast_Physics_Mass";
+ controller["Gravity"] = "Breast_Physics_Gravity";
+ controller["Drag"] = "Breast_Physics_Drag";
+ controller["Damping"] = "Breast_Physics_InOut_Damping";
+ controller["MaxEffect"] = "Breast_Physics_InOut_Max_Effect";
+ controller["Spring"] = "Breast_Physics_InOut_Spring";
+ controller["Gain"] = "Breast_Physics_InOut_Gain";
+ LLPhysicsMotion *motion = new LLPhysicsMotion("Breast_Physics_InOut_Controller",
+ "mChest",
+ character,
+ LLVector3(-1,0,0),
+ controller);
+ if (!motion->initialize())
+ {
+ llassert_always(FALSE);
+ return STATUS_FAILURE;
+ }
+ addMotion(motion);
+ }
+
+ // Breast Bounce
+ {
+ controller_map_t controller;
+ controller["Mass"] = "Breast_Physics_Mass";
+ controller["Gravity"] = "Breast_Physics_Gravity";
+ controller["Drag"] = "Breast_Physics_Drag";
+ controller["Damping"] = "Breast_Physics_UpDown_Damping";
+ controller["MaxEffect"] = "Breast_Physics_UpDown_Max_Effect";
+ controller["Spring"] = "Breast_Physics_UpDown_Spring";
+ controller["Gain"] = "Breast_Physics_UpDown_Gain";
+ LLPhysicsMotion *motion = new LLPhysicsMotion("Breast_Physics_UpDown_Controller",
+ "mChest",
+ character,
+ LLVector3(0,0,1),
+ controller);
+ if (!motion->initialize())
+ {
+ llassert_always(FALSE);
+ return STATUS_FAILURE;
+ }
+ addMotion(motion);
+ }
+
+ // Breast Sway
+ {
+ controller_map_t controller;
+ controller["Mass"] = "Breast_Physics_Mass";
+ controller["Gravity"] = "Breast_Physics_Gravity";
+ controller["Drag"] = "Breast_Physics_Drag";
+ controller["Damping"] = "Breast_Physics_LeftRight_Damping";
+ controller["MaxEffect"] = "Breast_Physics_LeftRight_Max_Effect";
+ controller["Spring"] = "Breast_Physics_LeftRight_Spring";
+ controller["Gain"] = "Breast_Physics_LeftRight_Gain";
+ LLPhysicsMotion *motion = new LLPhysicsMotion("Breast_Physics_LeftRight_Controller",
+ "mChest",
+ character,
+ LLVector3(0,-1,0),
+ controller);
+ if (!motion->initialize())
+ {
+ llassert_always(FALSE);
+ return STATUS_FAILURE;
+ }
+ addMotion(motion);
+ }
+ // Butt Bounce
+ {
+ controller_map_t controller;
+ controller["Mass"] = "Butt_Physics_Mass";
+ controller["Gravity"] = "Butt_Physics_Gravity";
+ controller["Drag"] = "Butt_Physics_Drag";
+ controller["Damping"] = "Butt_Physics_UpDown_Damping";
+ controller["MaxEffect"] = "Butt_Physics_UpDown_Max_Effect";
+ controller["Spring"] = "Butt_Physics_UpDown_Spring";
+ controller["Gain"] = "Butt_Physics_UpDown_Gain";
+ LLPhysicsMotion *motion = new LLPhysicsMotion("Butt_Physics_UpDown_Controller",
+ "mPelvis",
+ character,
+ LLVector3(0,0,-1),
+ controller);
+ if (!motion->initialize())
+ {
+ llassert_always(FALSE);
+ return STATUS_FAILURE;
+ }
+ addMotion(motion);
+ }
+
+ // Butt LeftRight
+ {
+ controller_map_t controller;
+ controller["Mass"] = "Butt_Physics_Mass";
+ controller["Gravity"] = "Butt_Physics_Gravity";
+ controller["Drag"] = "Butt_Physics_Drag";
+ controller["Damping"] = "Butt_Physics_LeftRight_Damping";
+ controller["MaxEffect"] = "Butt_Physics_LeftRight_Max_Effect";
+ controller["Spring"] = "Butt_Physics_LeftRight_Spring";
+ controller["Gain"] = "Butt_Physics_LeftRight_Gain";
+ LLPhysicsMotion *motion = new LLPhysicsMotion("Butt_Physics_LeftRight_Controller",
+ "mPelvis",
+ character,
+ LLVector3(0,-1,0),
+ controller);
+ if (!motion->initialize())
+ {
+ llassert_always(FALSE);
+ return STATUS_FAILURE;
+ }
+ addMotion(motion);
+ }
+
+ // Belly Bounce
+ {
+ controller_map_t controller;
+ controller["Mass"] = "Belly_Physics_Mass";
+ controller["Gravity"] = "Belly_Physics_Gravity";
+ controller["Drag"] = "Belly_Physics_Drag";
+ controller["Damping"] = "Belly_Physics_UpDown_Damping";
+ controller["MaxEffect"] = "Belly_Physics_UpDown_Max_Effect";
+ controller["Spring"] = "Belly_Physics_UpDown_Spring";
+ controller["Gain"] = "Belly_Physics_UpDown_Gain";
+ LLPhysicsMotion *motion = new LLPhysicsMotion("Belly_Physics_UpDown_Controller",
+ "mPelvis",
+ character,
+ LLVector3(0,0,-1),
+ controller);
+ if (!motion->initialize())
+ {
+ llassert_always(FALSE);
+ return STATUS_FAILURE;
+ }
+ addMotion(motion);
+ }
+
+ return STATUS_SUCCESS;
+}
+
+void LLPhysicsMotionController::addMotion(LLPhysicsMotion *motion)
+{
+ addJointState(motion->getJointState());
+ mMotions.push_back(motion);
+}
+
+F32 LLPhysicsMotionController::getMinPixelArea()
+{
+ return MIN_REQUIRED_PIXEL_AREA_AVATAR_PHYSICS_MOTION;
+}
+
+// Local space means "parameter space".
+F32 LLPhysicsMotion::toLocal(const LLVector3 &world)
+{
+ LLJoint *joint = mJointState->getJoint();
+ const LLQuaternion rotation_world = joint->getWorldRotation();
+
+ LLVector3 dir_world = mMotionDirectionVec * rotation_world;
+ dir_world.normalize();
+ return world * dir_world;
+}
+
+F32 LLPhysicsMotion::calculateVelocity_local()
+{
+ const F32 world_to_model_scale = 100.0f;
+ LLJoint *joint = mJointState->getJoint();
+ const LLVector3 position_world = joint->getWorldPosition();
+ const LLQuaternion rotation_world = joint->getWorldRotation();
+ const LLVector3 last_position_world = mPosition_world;
+ const LLVector3 positionchange_world = (position_world-last_position_world) * world_to_model_scale;
+ const LLVector3 velocity_world = positionchange_world;
+ const F32 velocity_local = toLocal(velocity_world);
+ return velocity_local;
+}
+
+F32 LLPhysicsMotion::calculateAcceleration_local(const F32 velocity_local)
+{
+// const F32 smoothing = getParamValue("Smoothing");
+ static const F32 smoothing = 3.0f; // Removed smoothing param since it's probably not necessary
+ const F32 acceleration_local = velocity_local - mVelocityJoint_local;
+
+ const F32 smoothed_acceleration_local =
+ acceleration_local * 1.0/smoothing +
+ mAccelerationJoint_local * (smoothing-1.0)/smoothing;
+
+ return smoothed_acceleration_local;
+}
+
+BOOL LLPhysicsMotionController::onUpdate(F32 time, U8* joint_mask)
+{
+ // Skip if disabled globally.
+ if (!gSavedSettings.getBOOL("AvatarPhysics"))
+ {
+ return TRUE;
+ }
+
+ BOOL update_visuals = FALSE;
+ for (motion_vec_t::iterator iter = mMotions.begin();
+ iter != mMotions.end();
+ ++iter)
+ {
+ LLPhysicsMotion *motion = (*iter);
+ update_visuals |= motion->onUpdate(time);
+ }
+
+ if (update_visuals)
+ mCharacter->updateVisualParams();
+
+ return TRUE;
+}
+
+
+// Return TRUE if character has to update visual params.
+BOOL LLPhysicsMotion::onUpdate(F32 time)
+{
+ // static FILE *mFileWrite = fopen("c:\\temp\\avatar_data.txt","w");
+
+ if (!mParamDriver)
+ return FALSE;
+
+ if (!mLastTime)
+ {
+ mLastTime = time;
+ return FALSE;
+ }
+
+ ////////////////////////////////////////////////////////////////////////////////
+ // Get all parameters and settings
+ //
+
+ const F32 time_delta = time - mLastTime;
+
+ // Don't update too frequently, to avoid precision errors from small time slices.
+ if (time_delta <= .01)
+ {
+ return FALSE;
+ }
+
+ // If less than 1FPS, we don't want to be spending time updating physics at all.
+ if (time_delta > 1.0)
+ {
+ mLastTime = time;
+ return FALSE;
+ }
+
+ // Higher LOD is better. This controls the granularity
+ // and frequency of updates for the motions.
+ const F32 lod_factor = LLVOAvatar::sPhysicsLODFactor;
+ if (lod_factor == 0)
+ {
+ return TRUE;
+ }
+
+ LLJoint *joint = mJointState->getJoint();
+
+ const F32 behavior_mass = getParamValue("Mass");
+ const F32 behavior_gravity = getParamValue("Gravity");
+ const F32 behavior_spring = getParamValue("Spring");
+ const F32 behavior_gain = getParamValue("Gain");
+ const F32 behavior_damping = getParamValue("Damping");
+ const F32 behavior_drag = getParamValue("Drag");
+ const BOOL physics_test = FALSE; // Enable this to simulate bouncing on all parts.
+
+ F32 behavior_maxeffect = getParamValue("MaxEffect");
+ if (physics_test)
+ behavior_maxeffect = 1.0f;
+
+ // Normalize the param position to be from [0,1].
+ // We have to use normalized values because there may be more than one driven param,
+ // and each of these driven params may have its own range.
+ // This means we'll do all our calculations in normalized [0,1] local coordinates.
+ const F32 position_user_local = (mParamDriver->getWeight() - mParamDriver->getMinWeight()) / (mParamDriver->getMaxWeight() - mParamDriver->getMinWeight());
+
+ //
+ // End parameters and settings
+ ////////////////////////////////////////////////////////////////////////////////
+
+
+ ////////////////////////////////////////////////////////////////////////////////
+ // Calculate velocity and acceleration in parameter space.
+ //
+
+ //const F32 velocity_joint_local = calculateVelocity_local(time_iteration_step);
+ const F32 velocity_joint_local = calculateVelocity_local();
+ const F32 acceleration_joint_local = calculateAcceleration_local(velocity_joint_local);
+
+ //
+ // End velocity and acceleration
+ ////////////////////////////////////////////////////////////////////////////////
+
+ BOOL update_visuals = FALSE;
+
+ // Break up the physics into a bunch of iterations so that differing framerates will show
+ // roughly the same behavior.
+ for (F32 time_iteration = 0; time_iteration <= time_delta; time_iteration += TIME_ITERATION_STEP)
+ {
+ F32 time_iteration_step = TIME_ITERATION_STEP;
+ if (time_iteration + TIME_ITERATION_STEP > time_delta)
+ {
+ time_iteration_step = time_delta-time_iteration;
+ }
+
+ // mPositon_local should be in normalized 0,1 range already. Just making sure...
+ const F32 position_current_local = llclamp(mPosition_local,
+ 0.0f,
+ 1.0f);
+ // If the effect is turned off then don't process unless we need one more update
+ // to set the position to the default (i.e. user) position.
+ if ((behavior_maxeffect == 0) && (position_current_local == position_user_local))
+ {
+ return update_visuals;
+ }
+
+ ////////////////////////////////////////////////////////////////////////////////
+ // Calculate the total force
+ //
+
+ // Spring force is a restoring force towards the original user-set breast position.
+ // F = kx
+ const F32 spring_length = position_current_local - position_user_local;
+ const F32 force_spring = -spring_length * behavior_spring;
+
+ // Acceleration is the force that comes from the change in velocity of the torso.
+ // F = ma
+ const F32 force_accel = behavior_gain * (acceleration_joint_local * behavior_mass);
+
+ // Gravity always points downward in world space.
+ // F = mg
+ const LLVector3 gravity_world(0,0,1);
+ const F32 force_gravity = (toLocal(gravity_world) * behavior_gravity * behavior_mass);
+
+ // Damping is a restoring force that opposes the current velocity.
+ // F = -kv
+ const F32 force_damping = -behavior_damping * mVelocity_local;
+
+ // Drag is a force imparted by velocity (intuitively it is similar to wind resistance)
+ // F = .5kv^2
+ const F32 force_drag = .5*behavior_drag*velocity_joint_local*velocity_joint_local*llsgn(velocity_joint_local);
+
+ const F32 force_net = (force_accel +
+ force_gravity +
+ force_spring +
+ force_damping +
+ force_drag);
+
+ //
+ // End total force
+ ////////////////////////////////////////////////////////////////////////////////
+
+
+ ////////////////////////////////////////////////////////////////////////////////
+ // Calculate new params
+ //
+
+ // Calculate the new acceleration based on the net force.
+ // a = F/m
+ const F32 acceleration_new_local = force_net / behavior_mass;
+ static const F32 max_velocity = 100.0f; // magic number, used to be customizable.
+ F32 velocity_new_local = mVelocity_local + acceleration_new_local*time_iteration_step;
+ velocity_new_local = llclamp(velocity_new_local,
+ -max_velocity, max_velocity);
+
+ // Temporary debugging setting to cause all avatars to move, for profiling purposes.
+ if (physics_test)
+ {
+ velocity_new_local = sin(time*4.0);
+ }
+ // Calculate the new parameters, or remain unchanged if max speed is 0.
+ F32 position_new_local = position_current_local + velocity_new_local*time_iteration_step;
+ if (behavior_maxeffect == 0)
+ position_new_local = position_user_local;
+
+ // Zero out the velocity if the param is being pushed beyond its limits.
+ if ((position_new_local < 0 && velocity_new_local < 0) ||
+ (position_new_local > 1 && velocity_new_local > 0))
+ {
+ velocity_new_local = 0;
+ }
+
+ // Check for NaN values. A NaN value is detected if the variables doesn't equal itself.
+ // If NaN, then reset everything.
+ if ((mPosition_local != mPosition_local) ||
+ (mVelocity_local != mVelocity_local) ||
+ (position_new_local != position_new_local))
+ {
+ position_new_local = 0;
+ mVelocity_local = 0;
+ mVelocityJoint_local = 0;
+ mAccelerationJoint_local = 0;
+ mPosition_local = 0;
+ mPosition_world = LLVector3(0,0,0);
+ }
+
+ const F32 position_new_local_clamped = llclamp(position_new_local,
+ 0.0f,
+ 1.0f);
+
+ LLDriverParam *driver_param = dynamic_cast<LLDriverParam *>(mParamDriver);
+ llassert_always(driver_param);
+ if (driver_param)
+ {
+ // If this is one of our "hidden" driver params, then make sure it's
+ // the default value.
+ if ((driver_param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE) &&
+ (driver_param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE_NO_TRANSMIT))
+ {
+ mCharacter->setVisualParamWeight(driver_param,
+ 0,
+ FALSE);
+ }
+ for (LLDriverParam::entry_list_t::iterator iter = driver_param->mDriven.begin();
+ iter != driver_param->mDriven.end();
+ ++iter)
+ {
+ LLDrivenEntry &entry = (*iter);
+ LLViewerVisualParam *driven_param = entry.mParam;
+ setParamValue(driven_param,position_new_local_clamped, behavior_maxeffect);
+ }
+ }
+
+ //
+ // End calculate new params
+ ////////////////////////////////////////////////////////////////////////////////
+
+ ////////////////////////////////////////////////////////////////////////////////
+ // Conditionally update the visual params
+ //
+
+ // Updating the visual params (i.e. what the user sees) is fairly expensive.
+ // So only update if the params have changed enough, and also take into account
+ // the graphics LOD settings.
+
+ // For non-self, if the avatar is small enough visually, then don't update.
+ const F32 area_for_max_settings = 0.0;
+ const F32 area_for_min_settings = 1400.0;
+ const F32 area_for_this_setting = area_for_max_settings + (area_for_min_settings-area_for_max_settings)*(1.0-lod_factor);
+ const F32 pixel_area = sqrtf(mCharacter->getPixelArea());
+
+ const BOOL is_self = (dynamic_cast<LLVOAvatarSelf *>(mCharacter) != NULL);
+ if ((pixel_area > area_for_this_setting) || is_self)
+ {
+ const F32 position_diff_local = llabs(mPositionLastUpdate_local-position_new_local_clamped);
+ const F32 min_delta = (1.0001f-lod_factor)*0.4f;
+ if (llabs(position_diff_local) > min_delta)
+ {
+ update_visuals = TRUE;
+ mPositionLastUpdate_local = position_new_local;
+ }
+ }
+
+ //
+ // End update visual params
+ ////////////////////////////////////////////////////////////////////////////////
+
+ mVelocity_local = velocity_new_local;
+ mAccelerationJoint_local = acceleration_joint_local;
+ mPosition_local = position_new_local;
+ }
+ mLastTime = time;
+ mPosition_world = joint->getWorldPosition();
+ mVelocityJoint_local = velocity_joint_local;
+
+
+ /*
+ // Write out debugging info into a spreadsheet.
+ if (mFileWrite != NULL && is_self)
+ {
+ fprintf(mFileWrite,"%f\t%f\t%f \t\t%f \t\t%f\t%f\t%f\t \t\t%f\t%f\t%f\t%f\t%f \t\t%f\t%f\t%f\n",
+ position_new_local,
+ velocity_new_local,
+ acceleration_new_local,
+
+ time_delta,
+
+ mPosition_world[0],
+ mPosition_world[1],
+ mPosition_world[2],
+
+ force_net,
+ force_spring,
+ force_accel,
+ force_damping,
+ force_drag,
+
+ spring_length,
+ velocity_joint_local,
+ acceleration_joint_local
+ );
+ }
+ */
+
+ return update_visuals;
+}
+
+// Range of new_value_local is assumed to be [0 , 1] normalized.
+void LLPhysicsMotion::setParamValue(LLViewerVisualParam *param,
+ F32 new_value_normalized,
+ F32 behavior_maxeffect)
+{
+ const F32 value_min_local = param->getMinWeight();
+ const F32 value_max_local = param->getMaxWeight();
+ const F32 min_val = 0.5f-behavior_maxeffect/2.0;
+ const F32 max_val = 0.5f+behavior_maxeffect/2.0;
+
+ // Scale from [0,1] to [min_val,max_val]
+ const F32 new_value_rescaled = min_val + (max_val-min_val) * new_value_normalized;
+
+ // Scale from [0,1] to [value_min_local,value_max_local]
+ const F32 new_value_local = value_min_local + (value_max_local-value_min_local) * new_value_rescaled;
+
+ mCharacter->setVisualParamWeight(param,
+ new_value_local,
+ FALSE);
+}
diff --git a/indra/newview/llphysicsmotion.h b/indra/newview/llphysicsmotion.h
new file mode 100644
index 0000000000..b246fa99bb
--- /dev/null
+++ b/indra/newview/llphysicsmotion.h
@@ -0,0 +1,118 @@
+/**
+ * @file llphysicsmotion.h
+ * @brief Implementation of LLPhysicsMotion class.
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLPHYSICSMOTIONCONTROLLER_H
+#define LL_LLPHYSICSMOTIONCONTROLLER_H
+
+//-----------------------------------------------------------------------------
+// Header files
+//-----------------------------------------------------------------------------
+#include "llmotion.h"
+#include "llframetimer.h"
+
+#define PHYSICS_MOTION_FADEIN_TIME 1.0f
+#define PHYSICS_MOTION_FADEOUT_TIME 1.0f
+
+class LLPhysicsMotion;
+
+//-----------------------------------------------------------------------------
+// class LLPhysicsMotion
+//-----------------------------------------------------------------------------
+class LLPhysicsMotionController :
+ public LLMotion
+{
+public:
+ // Constructor
+ LLPhysicsMotionController(const LLUUID &id);
+
+ // Destructor
+ virtual ~LLPhysicsMotionController();
+
+public:
+ //-------------------------------------------------------------------------
+ // functions to support MotionController and MotionRegistry
+ //-------------------------------------------------------------------------
+
+ // static constructor
+ // all subclasses must implement such a function and register it
+ static LLMotion *create(const LLUUID &id) { return new LLPhysicsMotionController(id); }
+
+public:
+ //-------------------------------------------------------------------------
+ // animation callbacks to be implemented by subclasses
+ //-------------------------------------------------------------------------
+
+ // motions must specify whether or not they loop
+ virtual BOOL getLoop() { return TRUE; }
+
+ // motions must report their total duration
+ virtual F32 getDuration() { return 0.0; }
+
+ // motions must report their "ease in" duration
+ virtual F32 getEaseInDuration() { return PHYSICS_MOTION_FADEIN_TIME; }
+
+ // motions must report their "ease out" duration.
+ virtual F32 getEaseOutDuration() { return PHYSICS_MOTION_FADEOUT_TIME; }
+
+ // called to determine when a motion should be activated/deactivated based on avatar pixel coverage
+ virtual F32 getMinPixelArea();
+
+ // motions must report their priority
+ virtual LLJoint::JointPriority getPriority() { return LLJoint::MEDIUM_PRIORITY; }
+
+ virtual LLMotionBlendType getBlendType() { return ADDITIVE_BLEND; }
+
+ // run-time (post constructor) initialization,
+ // called after parameters have been set
+ // must return true to indicate success and be available for activation
+ virtual LLMotionInitStatus onInitialize(LLCharacter *character);
+
+ // called when a motion is activated
+ // must return TRUE to indicate success, or else
+ // it will be deactivated
+ virtual BOOL onActivate();
+
+ // called per time step
+ // must return TRUE while it is active, and
+ // must return FALSE when the motion is completed.
+ virtual BOOL onUpdate(F32 time, U8* joint_mask);
+
+ // called when a motion is deactivated
+ virtual void onDeactivate();
+
+ LLCharacter* getCharacter() { return mCharacter; }
+
+protected:
+ void addMotion(LLPhysicsMotion *motion);
+private:
+ LLCharacter* mCharacter;
+
+ typedef std::vector<LLPhysicsMotion *> motion_vec_t;
+ motion_vec_t mMotions;
+};
+
+#endif // LL_LLPHYSICSMOTION_H
+
diff --git a/indra/newview/llphysicsshapebuilderutil.cpp b/indra/newview/llphysicsshapebuilderutil.cpp
new file mode 100644
index 0000000000..5bfe5c9941
--- /dev/null
+++ b/indra/newview/llphysicsshapebuilderutil.cpp
@@ -0,0 +1,210 @@
+/**
+ * @file llphysicsshapebuilder.cpp
+ * @brief Generic system to convert LL(Physics)VolumeParams to physics shapes
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llphysicsshapebuilderutil.h"
+
+/* static */
+void LLPhysicsShapeBuilderUtil::determinePhysicsShape( const LLPhysicsVolumeParams& volume_params, const LLVector3& scale, PhysicsShapeSpecification& specOut )
+{
+ const LLProfileParams& profile_params = volume_params.getProfileParams();
+ const LLPathParams& path_params = volume_params.getPathParams();
+
+ specOut.mScale = scale;
+
+ const F32 avgScale = ( scale[VX] + scale[VY] + scale[VZ] )/3.0f;
+
+ // count the scale elements that are small
+ S32 min_size_counts = 0;
+ for (S32 i = 0; i < 3; ++i)
+ {
+ if (scale[i] < SHAPE_BUILDER_CONVEXIFICATION_SIZE)
+ {
+ ++min_size_counts;
+ }
+ }
+
+ const bool profile_complete = ( profile_params.getBegin() <= SHAPE_BUILDER_IMPLICIT_THRESHOLD_PATH_CUT/avgScale ) &&
+ ( profile_params.getEnd() >= (1.0f - SHAPE_BUILDER_IMPLICIT_THRESHOLD_PATH_CUT/avgScale) );
+
+ const bool path_complete = ( path_params.getBegin() <= SHAPE_BUILDER_IMPLICIT_THRESHOLD_PATH_CUT/avgScale ) &&
+ ( path_params.getEnd() >= (1.0f - SHAPE_BUILDER_IMPLICIT_THRESHOLD_PATH_CUT/avgScale) );
+
+ const bool simple_params = ( volume_params.getHollow() <= SHAPE_BUILDER_IMPLICIT_THRESHOLD_HOLLOW/avgScale )
+ && ( fabs(path_params.getShearX()) <= SHAPE_BUILDER_IMPLICIT_THRESHOLD_SHEAR/avgScale )
+ && ( fabs(path_params.getShearY()) <= SHAPE_BUILDER_IMPLICIT_THRESHOLD_SHEAR/avgScale )
+ && ( !volume_params.isMeshSculpt() && !volume_params.isSculpt() );
+
+ if (simple_params && profile_complete)
+ {
+ // Try to create an implicit shape or convexified
+ bool no_taper = ( fabs(path_params.getScaleX() - 1.0f) <= SHAPE_BUILDER_IMPLICIT_THRESHOLD_TAPER/avgScale )
+ && ( fabs(path_params.getScaleY() - 1.0f) <= SHAPE_BUILDER_IMPLICIT_THRESHOLD_TAPER/avgScale );
+
+ bool no_twist = ( fabs(path_params.getTwistBegin()) <= SHAPE_BUILDER_IMPLICIT_THRESHOLD_TWIST/avgScale )
+ && ( fabs(path_params.getTwistEnd()) <= SHAPE_BUILDER_IMPLICIT_THRESHOLD_TWIST/avgScale);
+
+ // Box
+ if(
+ ( profile_params.getCurveType() == LL_PCODE_PROFILE_SQUARE )
+ && ( path_params.getCurveType() == LL_PCODE_PATH_LINE )
+ && no_taper
+ && no_twist
+ )
+ {
+ specOut.mType = PhysicsShapeSpecification::BOX;
+ if ( path_complete )
+ {
+ return;
+ }
+ else
+ {
+ // Side lengths
+ specOut.mScale[VX] = llmax( scale[VX], SHAPE_BUILDER_MIN_GEOMETRY_SIZE );
+ specOut.mScale[VY] = llmax( scale[VY], SHAPE_BUILDER_MIN_GEOMETRY_SIZE );
+ specOut.mScale[VZ] = llmax( scale[VZ] * (path_params.getEnd() - path_params.getBegin()), SHAPE_BUILDER_MIN_GEOMETRY_SIZE );
+
+ specOut.mCenter.set( 0.f, 0.f, 0.5f * scale[VZ] * ( path_params.getEnd() + path_params.getBegin() - 1.0f ) );
+ return;
+ }
+ }
+
+ // Sphere
+ if( path_complete
+ && ( profile_params.getCurveType() == LL_PCODE_PROFILE_CIRCLE_HALF )
+ && ( path_params.getCurveType() == LL_PCODE_PATH_CIRCLE )
+ && ( fabs(volume_params.getTaper()) <= SHAPE_BUILDER_IMPLICIT_THRESHOLD_TAPER/avgScale )
+ && no_twist
+ )
+ {
+ if ( ( scale[VX] == scale[VZ] )
+ && ( scale[VY] == scale[VZ] ) )
+ {
+ // perfect sphere
+ specOut.mType = PhysicsShapeSpecification::SPHERE;
+ specOut.mScale = scale;
+ return;
+ }
+ else if (min_size_counts > 1)
+ {
+ // small or narrow sphere -- we can boxify
+ for (S32 i=0; i<3; ++i)
+ {
+ if (specOut.mScale[i] < SHAPE_BUILDER_CONVEXIFICATION_SIZE)
+ {
+ // reduce each small dimension size to split the approximation errors
+ specOut.mScale[i] *= 0.75f;
+ }
+ }
+ specOut.mType = PhysicsShapeSpecification::BOX;
+ return;
+ }
+ }
+
+ // Cylinder
+ if( (scale[VX] == scale[VY])
+ && ( profile_params.getCurveType() == LL_PCODE_PROFILE_CIRCLE )
+ && ( path_params.getCurveType() == LL_PCODE_PATH_LINE )
+ && ( volume_params.getBeginS() <= SHAPE_BUILDER_IMPLICIT_THRESHOLD_PATH_CUT/avgScale )
+ && ( volume_params.getEndS() >= (1.0f - SHAPE_BUILDER_IMPLICIT_THRESHOLD_PATH_CUT/avgScale) )
+ && no_taper
+ )
+ {
+ if (min_size_counts > 1)
+ {
+ // small or narrow sphere -- we can boxify
+ for (S32 i=0; i<3; ++i)
+ {
+ if (specOut.mScale[i] < SHAPE_BUILDER_CONVEXIFICATION_SIZE)
+ {
+ // reduce each small dimension size to split the approximation errors
+ specOut.mScale[i] *= 0.75f;
+ }
+ }
+
+ specOut.mType = PhysicsShapeSpecification::BOX;
+ }
+ else
+ {
+ specOut.mType = PhysicsShapeSpecification::CYLINDER;
+ F32 length = (volume_params.getPathParams().getEnd() - volume_params.getPathParams().getBegin()) * scale[VZ];
+
+ specOut.mScale[VY] = specOut.mScale[VX];
+ specOut.mScale[VZ] = length;
+ // The minus one below fixes the fact that begin and end range from 0 to 1 not -1 to 1.
+ specOut.mCenter.set( 0.f, 0.f, 0.5f * (volume_params.getPathParams().getBegin() + volume_params.getPathParams().getEnd() - 1.f) * scale[VZ] );
+ }
+
+ return;
+ }
+ }
+
+ if ( (min_size_counts == 3 )
+ // Possible dead code here--who wants to take it out?
+ || (path_complete
+ && profile_complete
+ && ( path_params.getCurveType() == LL_PCODE_PATH_LINE )
+ && (min_size_counts > 1 ) )
+ )
+ {
+ // it isn't simple but
+ // we might be able to convexify this shape if the path and profile are complete
+ // or the path is linear and both path and profile are complete --> we can boxify it
+ specOut.mType = PhysicsShapeSpecification::BOX;
+ specOut.mScale = scale;
+ return;
+ }
+
+ // Special case for big, very thin objects - bump the small dimensions up to the COLLISION_TOLERANCE
+ if (min_size_counts == 1 // One dimension is small
+ && avgScale > 3.f) // ... but others are fairly large
+ {
+ for (S32 i = 0; i < 3; ++i)
+ {
+ specOut.mScale[i] = llmax( specOut.mScale[i], COLLISION_TOLERANCE );
+ }
+ }
+
+ if ( volume_params.shouldForceConvex() )
+ {
+ specOut.mType = PhysicsShapeSpecification::USER_CONVEX;
+ }
+ // Make a simpler convex shape if we can.
+ else if (volume_params.isConvex() // is convex
+ || min_size_counts > 1 ) // two or more small dimensions
+ {
+ specOut.mType = PhysicsShapeSpecification::PRIM_CONVEX;
+ }
+ else if ( volume_params.isSculpt() ) // Is a sculpt of any kind (mesh or legacy)
+ {
+ specOut.mType = volume_params.isMeshSculpt() ? PhysicsShapeSpecification::USER_MESH : PhysicsShapeSpecification::SCULPT;
+ }
+ else // Resort to mesh
+ {
+ specOut.mType = PhysicsShapeSpecification::PRIM_MESH;
+ }
+}
diff --git a/indra/newview/llphysicsshapebuilderutil.h b/indra/newview/llphysicsshapebuilderutil.h
new file mode 100644
index 0000000000..7dedfb05e2
--- /dev/null
+++ b/indra/newview/llphysicsshapebuilderutil.h
@@ -0,0 +1,138 @@
+/**
+ * @file llphysicsshapebuilder.h
+ * @brief Generic system to convert LL(Physics)VolumeParams to physics shapes
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_PHYSICS_SHAPE_BUILDER_H
+#define LL_PHYSICS_SHAPE_BUILDER_H
+
+#include "indra_constants.h"
+#include "llvolume.h"
+
+#define USE_SHAPE_QUANTIZATION 0
+
+#define SHAPE_BUILDER_DEFAULT_VOLUME_DETAIL 1
+
+#define SHAPE_BUILDER_IMPLICIT_THRESHOLD_HOLLOW 0.10f
+#define SHAPE_BUILDER_IMPLICIT_THRESHOLD_HOLLOW_SPHERES 0.90f
+#define SHAPE_BUILDER_IMPLICIT_THRESHOLD_PATH_CUT 0.05f
+#define SHAPE_BUILDER_IMPLICIT_THRESHOLD_TAPER 0.05f
+#define SHAPE_BUILDER_IMPLICIT_THRESHOLD_TWIST 0.09f
+#define SHAPE_BUILDER_IMPLICIT_THRESHOLD_SHEAR 0.05f
+
+const F32 SHAPE_BUILDER_ENTRY_SNAP_SCALE_BIN_SIZE = 0.15f;
+const F32 SHAPE_BUILDER_ENTRY_SNAP_PARAMETER_BIN_SIZE = 0.010f;
+const F32 SHAPE_BUILDER_CONVEXIFICATION_SIZE = 2.f * COLLISION_TOLERANCE;
+const F32 SHAPE_BUILDER_MIN_GEOMETRY_SIZE = 0.5f * COLLISION_TOLERANCE;
+
+class LLPhysicsVolumeParams : public LLVolumeParams
+{
+public:
+
+ LLPhysicsVolumeParams( const LLVolumeParams& params, bool forceConvex ) :
+ LLVolumeParams( params ),
+ mForceConvex(forceConvex) {}
+
+ bool operator==(const LLPhysicsVolumeParams &params) const
+ {
+ return ( LLVolumeParams::operator==(params) && (mForceConvex == params.mForceConvex) );
+ }
+
+ bool operator!=(const LLPhysicsVolumeParams &params) const
+ {
+ return !operator==(params);
+ }
+
+ bool operator<(const LLPhysicsVolumeParams &params) const
+ {
+ if ( LLVolumeParams::operator!=(params) )
+ {
+ return LLVolumeParams::operator<(params);
+ }
+ return (params.mForceConvex == false) && (mForceConvex == true);
+ }
+
+ bool shouldForceConvex() const { return mForceConvex; }
+
+private:
+ bool mForceConvex;
+};
+
+
+class LLPhysicsShapeBuilderUtil
+{
+public:
+
+ class PhysicsShapeSpecification
+ {
+ public:
+ enum ShapeType
+ {
+ // Primitive types
+ BOX,
+ SPHERE,
+ CYLINDER,
+
+ USER_CONVEX, // User specified they wanted the convex hull of the volume
+
+ PRIM_CONVEX, // Either a volume that is inherently convex but not a primitive type, or a shape
+ // with dimensions such that will convexify it anyway.
+
+ SCULPT, // Special case for traditional sculpts--they are the convex hull of a single particular set of volume params
+
+ USER_MESH, // A user mesh. May or may not contain a convex decomposition.
+
+ PRIM_MESH, // A non-convex volume which we have to represent accurately
+
+ INVALID
+ };
+
+ PhysicsShapeSpecification() :
+ mType( INVALID ),
+ mScale( 0.f, 0.f, 0.f ),
+ mCenter( 0.f, 0.f, 0.f ) {}
+
+ bool isConvex() { return (mType != USER_MESH && mType != PRIM_MESH && mType != INVALID); }
+ bool isMesh() { return (mType == USER_MESH) || (mType == PRIM_MESH); }
+
+ ShapeType getType() { return mType; }
+ const LLVector3& getScale() { return mScale; }
+ const LLVector3& getCenter() { return mCenter; }
+
+ private:
+ friend class LLPhysicsShapeBuilderUtil;
+
+ ShapeType mType;
+
+ // Dimensions of an AABB around the shape
+ LLVector3 mScale;
+
+ // Offset of shape from origin of primitive's reference frame
+ LLVector3 mCenter;
+ };
+
+ static void determinePhysicsShape( const LLPhysicsVolumeParams& volume_params, const LLVector3& scale, PhysicsShapeSpecification& specOut );
+};
+
+#endif //LL_PHYSICS_SHAPE_BUILDER_H
diff --git a/indra/newview/llplacesinventorybridge.cpp b/indra/newview/llplacesinventorybridge.cpp
index 225ac6e224..fe4cc0f55f 100644
--- a/indra/newview/llplacesinventorybridge.cpp
+++ b/indra/newview/llplacesinventorybridge.cpp
@@ -89,7 +89,7 @@ void LLPlacesFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
std::vector<std::string> items;
std::vector<std::string> disabled_items;
- LLInventoryPanel* inv_panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get());
+ LLInventoryPanel* inv_panel = mInventoryPanel.get();
bool is_open = false;
if (inv_panel)
{
@@ -137,7 +137,7 @@ void LLPlacesFolderBridge::performAction(LLInventoryModel* model, std::string ac
LLFolderViewFolder* LLPlacesFolderBridge::getFolder()
{
LLFolderViewFolder* folder = NULL;
- LLInventoryPanel* inv_panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get());
+ LLInventoryPanel* inv_panel = mInventoryPanel.get();
if (inv_panel)
{
folder = dynamic_cast<LLFolderViewFolder*>(inv_panel->getRootFolder()->getItemByID(mUUID));
diff --git a/indra/newview/llplacesinventorypanel.cpp b/indra/newview/llplacesinventorypanel.cpp
index 29e262199e..f7823f4fe8 100644
--- a/indra/newview/llplacesinventorypanel.cpp
+++ b/indra/newview/llplacesinventorypanel.cpp
@@ -35,6 +35,7 @@
#include "llinventoryfunctions.h"
#include "llpanellandmarks.h"
#include "llplacesinventorybridge.h"
+#include "llviewerfoldertype.h"
static LLDefaultChildRegistry::Register<LLPlacesInventoryPanel> r("places_inventory_panel");
@@ -56,72 +57,44 @@ LLPlacesInventoryPanel::~LLPlacesInventoryPanel()
delete mSavedFolderState;
}
-BOOL LLPlacesInventoryPanel::postBuild()
+void LLPlacesInventoryPanel::buildFolderView(const LLInventoryPanel::Params& params)
{
- LLInventoryPanel::postBuild();
+ // Determine the root folder in case specified, and
+ // build the views starting with that folder.
+ const LLFolderType::EType preferred_type = LLViewerFolderType::lookupTypeFromNewCategoryName(params.start_folder);
- // clear Contents();
- {
- mFolderRoot->destroyView();
- mFolderRoot->getParent()->removeChild(mFolderRoot);
- mFolderRoot->die();
-
- if( mScroller )
- {
- removeChild( mScroller );
- mScroller->die();
- mScroller = NULL;
- }
- mFolderRoot = NULL;
- }
-
-
- mCommitCallbackRegistrar.pushScope(); // registered as a widget; need to push callback scope ourselves
+ LLUUID root_id;
- // create root folder
+ if ("LIBRARY" == params.start_folder())
{
- LLRect folder_rect(0,
- 0,
- getRect().getWidth(),
- 0);
- LLPlacesFolderView::Params p;
- p.name = getName();
- p.title = getLabel();
- p.rect = folder_rect;
- p.parent_panel = this;
- mFolderRoot = (LLFolderView*)LLUICtrlFactory::create<LLPlacesFolderView>(p);
- mFolderRoot->setAllowMultiSelect(mAllowMultiSelect);
+ root_id = gInventory.getLibraryRootFolderID();
}
-
- mCommitCallbackRegistrar.popScope();
-
- mFolderRoot->setCallbackRegistrar(&mCommitCallbackRegistrar);
-
- // scroller
+ else
{
- LLRect scroller_view_rect = getRect();
- scroller_view_rect.translate(-scroller_view_rect.mLeft, -scroller_view_rect.mBottom);
- LLScrollContainer::Params p;
- p.name("Inventory Scroller");
- p.rect(scroller_view_rect);
- p.follows.flags(FOLLOWS_ALL);
- p.reserve_scroll_corner(true);
- p.tab_stop(true);
- mScroller = LLUICtrlFactory::create<LLScrollContainer>(p);
+ root_id = (preferred_type != LLFolderType::FT_NONE ? gInventory.findCategoryUUIDForType(preferred_type) : LLUUID::null);
}
- addChild(mScroller);
- mScroller->addChild(mFolderRoot);
-
- mFolderRoot->setScrollContainer(mScroller);
- mFolderRoot->addChild(mFolderRoot->mStatusTextBox);
-
- // cut subitems
- mFolderRoot->setUseEllipses(true);
-
- return TRUE;
+ LLRect folder_rect(0,
+ 0,
+ getRect().getWidth(),
+ 0);
+ LLPlacesFolderView::Params p;
+ p.name = getName();
+ p.title = getLabel();
+ p.rect = folder_rect;
+ p.listener = mInvFVBridgeBuilder->createBridge(LLAssetType::AT_CATEGORY,
+ LLAssetType::AT_CATEGORY,
+ LLInventoryType::IT_CATEGORY,
+ this,
+ NULL,
+ root_id);
+ p.parent_panel = this;
+ p.allow_multiselect = mAllowMultiSelect;
+ p.use_ellipses = true; // truncate inventory item text so remove horizontal scroller
+ mFolderRoot = (LLFolderView*)LLUICtrlFactory::create<LLPlacesFolderView>(p);
}
+
// save current folder open state
void LLPlacesInventoryPanel::saveFolderState()
{
diff --git a/indra/newview/llplacesinventorypanel.h b/indra/newview/llplacesinventorypanel.h
index 6641871a0b..f647e7f970 100644
--- a/indra/newview/llplacesinventorypanel.h
+++ b/indra/newview/llplacesinventorypanel.h
@@ -46,7 +46,7 @@ public:
LLPlacesInventoryPanel(const Params& p);
~LLPlacesInventoryPanel();
- /*virtual*/ BOOL postBuild();
+ /*virtual*/ void buildFolderView(const LLInventoryPanel::Params& params);
void saveFolderState();
void restoreFolderState();
diff --git a/indra/newview/llpolymesh.cpp b/indra/newview/llpolymesh.cpp
index 363b0b8e9d..450f9b2be7 100644
--- a/indra/newview/llpolymesh.cpp
+++ b/indra/newview/llpolymesh.cpp
@@ -29,7 +29,8 @@
//-----------------------------------------------------------------------------
#include "llviewerprecompiledheaders.h"
-#include "llpolymesh.h"
+#include "llfasttimer.h"
+#include "llmemory.h"
#include "llviewercontrol.h"
#include "llxmltree.h"
@@ -39,12 +40,21 @@
#include "llvolume.h"
#include "llendianswizzle.h"
-#include "llfasttimer.h"
+#include "llpolymesh.h"
#define HEADER_ASCII "Linden Mesh 1.0"
#define HEADER_BINARY "Linden Binary Mesh 1.0"
-extern LLControlGroup gSavedSettings; // read only
+extern LLControlGroup gSavedSettings; // read only
+
+LLPolyMorphData *clone_morph_param_duplicate(const LLPolyMorphData *src_data,
+ const std::string &name);
+LLPolyMorphData *clone_morph_param_direction(const LLPolyMorphData *src_data,
+ const LLVector3 &direction,
+ const std::string &name);
+LLPolyMorphData *clone_morph_param_cleavage(const LLPolyMorphData *src_data,
+ F32 scale,
+ const std::string &name);
//-----------------------------------------------------------------------------
// Global table of loaded LLPolyMeshes
@@ -56,28 +66,28 @@ LLPolyMesh::LLPolyMeshSharedDataTable LLPolyMesh::sGlobalSharedMeshList;
//-----------------------------------------------------------------------------
LLPolyMeshSharedData::LLPolyMeshSharedData()
{
- mNumVertices = 0;
- mBaseCoords = NULL;
- mBaseNormals = NULL;
- mBaseBinormals = NULL;
- mTexCoords = NULL;
- mDetailTexCoords = NULL;
- mWeights = NULL;
- mHasWeights = FALSE;
- mHasDetailTexCoords = FALSE;
+ mNumVertices = 0;
+ mBaseCoords = NULL;
+ mBaseNormals = NULL;
+ mBaseBinormals = NULL;
+ mTexCoords = NULL;
+ mDetailTexCoords = NULL;
+ mWeights = NULL;
+ mHasWeights = FALSE;
+ mHasDetailTexCoords = FALSE;
- mNumFaces = 0;
- mFaces = NULL;
+ mNumFaces = 0;
+ mFaces = NULL;
- mNumJointNames = 0;
- mJointNames = NULL;
+ mNumJointNames = 0;
+ mJointNames = NULL;
- mTriangleIndices = NULL;
- mNumTriangleIndices = 0;
+ mTriangleIndices = NULL;
+ mNumTriangleIndices = 0;
- mReferenceData = NULL;
+ mReferenceData = NULL;
- mLastIndexOffset = -1;
+ mLastIndexOffset = -1;
}
//-----------------------------------------------------------------------------
@@ -85,9 +95,9 @@ LLPolyMeshSharedData::LLPolyMeshSharedData()
//-----------------------------------------------------------------------------
LLPolyMeshSharedData::~LLPolyMeshSharedData()
{
- freeMeshData();
- for_each(mMorphData.begin(), mMorphData.end(), DeletePointer());
- mMorphData.clear();
+ freeMeshData();
+ for_each(mMorphData.begin(), mMorphData.end(), DeletePointer());
+ mMorphData.clear();
}
//-----------------------------------------------------------------------------
@@ -95,19 +105,19 @@ LLPolyMeshSharedData::~LLPolyMeshSharedData()
//-----------------------------------------------------------------------------
void LLPolyMeshSharedData::setupLOD(LLPolyMeshSharedData* reference_data)
{
- mReferenceData = reference_data;
-
- if (reference_data)
- {
- mBaseCoords = reference_data->mBaseCoords;
- mBaseNormals = reference_data->mBaseNormals;
- mBaseBinormals = reference_data->mBaseBinormals;
- mTexCoords = reference_data->mTexCoords;
- mDetailTexCoords = reference_data->mDetailTexCoords;
- mWeights = reference_data->mWeights;
- mHasWeights = reference_data->mHasWeights;
- mHasDetailTexCoords = reference_data->mHasDetailTexCoords;
- }
+ mReferenceData = reference_data;
+
+ if (reference_data)
+ {
+ mBaseCoords = reference_data->mBaseCoords;
+ mBaseNormals = reference_data->mBaseNormals;
+ mBaseBinormals = reference_data->mBaseBinormals;
+ mTexCoords = reference_data->mTexCoords;
+ mDetailTexCoords = reference_data->mDetailTexCoords;
+ mWeights = reference_data->mWeights;
+ mHasWeights = reference_data->mHasWeights;
+ mHasDetailTexCoords = reference_data->mHasDetailTexCoords;
+ }
}
//-----------------------------------------------------------------------------
@@ -115,41 +125,41 @@ void LLPolyMeshSharedData::setupLOD(LLPolyMeshSharedData* reference_data)
//-----------------------------------------------------------------------------
void LLPolyMeshSharedData::freeMeshData()
{
- if (!mReferenceData)
- {
- mNumVertices = 0;
+ if (!mReferenceData)
+ {
+ mNumVertices = 0;
- delete [] mBaseCoords;
- mBaseCoords = NULL;
+ delete [] mBaseCoords;
+ mBaseCoords = NULL;
- delete [] mBaseNormals;
- mBaseNormals = NULL;
+ delete [] mBaseNormals;
+ mBaseNormals = NULL;
- delete [] mBaseBinormals;
- mBaseBinormals = NULL;
+ delete [] mBaseBinormals;
+ mBaseBinormals = NULL;
- delete [] mTexCoords;
- mTexCoords = NULL;
+ delete [] mTexCoords;
+ mTexCoords = NULL;
- delete [] mDetailTexCoords;
- mDetailTexCoords = NULL;
+ delete [] mDetailTexCoords;
+ mDetailTexCoords = NULL;
- delete [] mWeights;
- mWeights = NULL;
- }
+ delete [] mWeights;
+ mWeights = NULL;
+ }
- mNumFaces = 0;
- delete [] mFaces;
- mFaces = NULL;
+ mNumFaces = 0;
+ delete [] mFaces;
+ mFaces = NULL;
- mNumJointNames = 0;
- delete [] mJointNames;
- mJointNames = NULL;
+ mNumJointNames = 0;
+ delete [] mJointNames;
+ mJointNames = NULL;
- delete [] mTriangleIndices;
- mTriangleIndices = NULL;
+ delete [] mTriangleIndices;
+ mTriangleIndices = NULL;
-// mVertFaceMap.deleteAllData();
+// mVertFaceMap.deleteAllData();
}
// compate_int is used by the qsort function to sort the index array
@@ -160,26 +170,26 @@ int compare_int(const void *a, const void *b);
//-----------------------------------------------------------------------------
void LLPolyMeshSharedData::genIndices(S32 index_offset)
{
- if (index_offset == mLastIndexOffset)
- {
- return;
- }
-
- delete []mTriangleIndices;
- mTriangleIndices = new U32[mNumTriangleIndices];
-
- S32 cur_index = 0;
- for (S32 i = 0; i < mNumFaces; i++)
- {
- mTriangleIndices[cur_index] = mFaces[i][0] + index_offset;
- cur_index++;
- mTriangleIndices[cur_index] = mFaces[i][1] + index_offset;
- cur_index++;
- mTriangleIndices[cur_index] = mFaces[i][2] + index_offset;
- cur_index++;
- }
-
- mLastIndexOffset = index_offset;
+ if (index_offset == mLastIndexOffset)
+ {
+ return;
+ }
+
+ delete []mTriangleIndices;
+ mTriangleIndices = new U32[mNumTriangleIndices];
+
+ S32 cur_index = 0;
+ for (S32 i = 0; i < mNumFaces; i++)
+ {
+ mTriangleIndices[cur_index] = mFaces[i][0] + index_offset;
+ cur_index++;
+ mTriangleIndices[cur_index] = mFaces[i][1] + index_offset;
+ cur_index++;
+ mTriangleIndices[cur_index] = mFaces[i][2] + index_offset;
+ cur_index++;
+ }
+
+ mLastIndexOffset = index_offset;
}
//--------------------------------------------------------------------
@@ -187,30 +197,30 @@ void LLPolyMeshSharedData::genIndices(S32 index_offset)
//--------------------------------------------------------------------
U32 LLPolyMeshSharedData::getNumKB()
{
- U32 num_kb = sizeof(LLPolyMesh);
-
- if (!isLOD())
- {
- num_kb += mNumVertices *
- ( sizeof(LLVector3) + // coords
- sizeof(LLVector3) + // normals
- sizeof(LLVector2) ); // texCoords
- }
-
- if (mHasDetailTexCoords && !isLOD())
- {
- num_kb += mNumVertices * sizeof(LLVector2); // detailTexCoords
- }
-
- if (mHasWeights && !isLOD())
- {
- num_kb += mNumVertices * sizeof(float); // weights
- }
-
- num_kb += mNumFaces * sizeof(LLPolyFace); // faces
-
- num_kb /= 1024;
- return num_kb;
+ U32 num_kb = sizeof(LLPolyMesh);
+
+ if (!isLOD())
+ {
+ num_kb += mNumVertices *
+ ( sizeof(LLVector3) + // coords
+ sizeof(LLVector3) + // normals
+ sizeof(LLVector2) ); // texCoords
+ }
+
+ if (mHasDetailTexCoords && !isLOD())
+ {
+ num_kb += mNumVertices * sizeof(LLVector2); // detailTexCoords
+ }
+
+ if (mHasWeights && !isLOD())
+ {
+ num_kb += mNumVertices * sizeof(float); // weights
+ }
+
+ num_kb += mNumFaces * sizeof(LLPolyFace); // faces
+
+ num_kb /= 1024;
+ return num_kb;
}
//-----------------------------------------------------------------------------
@@ -218,19 +228,19 @@ U32 LLPolyMeshSharedData::getNumKB()
//-----------------------------------------------------------------------------
BOOL LLPolyMeshSharedData::allocateVertexData( U32 numVertices )
{
- U32 i;
- mBaseCoords = new LLVector3[ numVertices ];
- mBaseNormals = new LLVector3[ numVertices ];
- mBaseBinormals = new LLVector3[ numVertices ];
- mTexCoords = new LLVector2[ numVertices ];
- mDetailTexCoords = new LLVector2[ numVertices ];
- mWeights = new F32[ numVertices ];
- for (i = 0; i < numVertices; i++)
- {
- mWeights[i] = 0.f;
- }
- mNumVertices = numVertices;
- return TRUE;
+ U32 i;
+ mBaseCoords = new LLVector3[ numVertices ];
+ mBaseNormals = new LLVector3[ numVertices ];
+ mBaseBinormals = new LLVector3[ numVertices ];
+ mTexCoords = new LLVector2[ numVertices ];
+ mDetailTexCoords = new LLVector2[ numVertices ];
+ mWeights = new F32[ numVertices ];
+ for (i = 0; i < numVertices; i++)
+ {
+ mWeights[i] = 0.f;
+ }
+ mNumVertices = numVertices;
+ return TRUE;
}
//-----------------------------------------------------------------------------
@@ -238,10 +248,10 @@ BOOL LLPolyMeshSharedData::allocateVertexData( U32 numVertices )
//-----------------------------------------------------------------------------
BOOL LLPolyMeshSharedData::allocateFaceData( U32 numFaces )
{
- mFaces = new LLPolyFace[ numFaces ];
- mNumFaces = numFaces;
- mNumTriangleIndices = mNumFaces * 3;
- return TRUE;
+ mFaces = new LLPolyFace[ numFaces ];
+ mNumFaces = numFaces;
+ mNumTriangleIndices = mNumFaces * 3;
+ return TRUE;
}
//-----------------------------------------------------------------------------
@@ -249,9 +259,9 @@ BOOL LLPolyMeshSharedData::allocateFaceData( U32 numFaces )
//-----------------------------------------------------------------------------
BOOL LLPolyMeshSharedData::allocateJointNames( U32 numJointNames )
{
- mJointNames = new std::string[ numJointNames ];
- mNumJointNames = numJointNames;
- return TRUE;
+ mJointNames = new std::string[ numJointNames ];
+ mNumJointNames = numJointNames;
+ return TRUE;
}
//--------------------------------------------------------------------
@@ -259,393 +269,445 @@ BOOL LLPolyMeshSharedData::allocateJointNames( U32 numJointNames )
//--------------------------------------------------------------------
BOOL LLPolyMeshSharedData::loadMesh( const std::string& fileName )
{
- //-------------------------------------------------------------------------
- // Open the file
- //-------------------------------------------------------------------------
- if(fileName.empty())
- {
- llerrs << "Filename is Empty!" << llendl;
- return FALSE;
- }
- LLFILE* fp = LLFile::fopen(fileName, "rb"); /*Flawfinder: ignore*/
- if (!fp)
- {
- llerrs << "can't open: " << fileName << llendl;
- return FALSE;
- }
-
- //-------------------------------------------------------------------------
- // Read a chunk
- //-------------------------------------------------------------------------
- char header[128]; /*Flawfinder: ignore*/
- if (fread(header, sizeof(char), 128, fp) != 128)
- {
- llwarns << "Short read" << llendl;
- }
-
- //-------------------------------------------------------------------------
- // Check for proper binary header
- //-------------------------------------------------------------------------
- BOOL status = FALSE;
- if ( strncmp(header, HEADER_BINARY, strlen(HEADER_BINARY)) == 0 ) /*Flawfinder: ignore*/
- {
- lldebugs << "Loading " << fileName << llendl;
-
- //----------------------------------------------------------------
- // File Header (seek past it)
- //----------------------------------------------------------------
- fseek(fp, 24, SEEK_SET);
-
- //----------------------------------------------------------------
- // HasWeights
- //----------------------------------------------------------------
- U8 hasWeights;
- size_t numRead = fread(&hasWeights, sizeof(U8), 1, fp);
- if (numRead != 1)
- {
- llerrs << "can't read HasWeights flag from " << fileName << llendl;
- return FALSE;
- }
- if (!isLOD())
- {
- mHasWeights = (hasWeights==0) ? FALSE : TRUE;
- }
-
- //----------------------------------------------------------------
- // HasDetailTexCoords
- //----------------------------------------------------------------
- U8 hasDetailTexCoords;
- numRead = fread(&hasDetailTexCoords, sizeof(U8), 1, fp);
- if (numRead != 1)
- {
- llerrs << "can't read HasDetailTexCoords flag from " << fileName << llendl;
- return FALSE;
- }
-
- //----------------------------------------------------------------
- // Position
- //----------------------------------------------------------------
- LLVector3 position;
- numRead = fread(position.mV, sizeof(float), 3, fp);
- llendianswizzle(position.mV, sizeof(float), 3);
- if (numRead != 3)
- {
- llerrs << "can't read Position from " << fileName << llendl;
- return FALSE;
- }
- setPosition( position );
-
- //----------------------------------------------------------------
- // Rotation
- //----------------------------------------------------------------
- LLVector3 rotationAngles;
- numRead = fread(rotationAngles.mV, sizeof(float), 3, fp);
- llendianswizzle(rotationAngles.mV, sizeof(float), 3);
- if (numRead != 3)
- {
- llerrs << "can't read RotationAngles from " << fileName << llendl;
- return FALSE;
- }
-
- U8 rotationOrder;
- numRead = fread(&rotationOrder, sizeof(U8), 1, fp);
-
- if (numRead != 1)
- {
- llerrs << "can't read RotationOrder from " << fileName << llendl;
- return FALSE;
- }
-
- rotationOrder = 0;
-
- setRotation( mayaQ( rotationAngles.mV[0],
- rotationAngles.mV[1],
- rotationAngles.mV[2],
- (LLQuaternion::Order)rotationOrder ) );
-
- //----------------------------------------------------------------
- // Scale
- //----------------------------------------------------------------
- LLVector3 scale;
- numRead = fread(scale.mV, sizeof(float), 3, fp);
- llendianswizzle(scale.mV, sizeof(float), 3);
- if (numRead != 3)
- {
- llerrs << "can't read Scale from " << fileName << llendl;
- return FALSE;
- }
- setScale( scale );
-
- //-------------------------------------------------------------------------
- // Release any existing mesh geometry
- //-------------------------------------------------------------------------
- freeMeshData();
-
- U16 numVertices = 0;
-
- //----------------------------------------------------------------
- // NumVertices
- //----------------------------------------------------------------
- if (!isLOD())
- {
- numRead = fread(&numVertices, sizeof(U16), 1, fp);
- llendianswizzle(&numVertices, sizeof(U16), 1);
- if (numRead != 1)
- {
- llerrs << "can't read NumVertices from " << fileName << llendl;
- return FALSE;
- }
-
- allocateVertexData( numVertices );
-
- //----------------------------------------------------------------
- // Coords
- //----------------------------------------------------------------
- numRead = fread(mBaseCoords, 3*sizeof(float), numVertices, fp);
- llendianswizzle(mBaseCoords, sizeof(float), 3*numVertices);
- if (numRead != numVertices)
- {
- llerrs << "can't read Coordinates from " << fileName << llendl;
- return FALSE;
- }
-
- //----------------------------------------------------------------
- // Normals
- //----------------------------------------------------------------
- numRead = fread(mBaseNormals, 3*sizeof(float), numVertices, fp);
- llendianswizzle(mBaseNormals, sizeof(float), 3*numVertices);
- if (numRead != numVertices)
- {
- llerrs << " can't read Normals from " << fileName << llendl;
- return FALSE;
- }
-
- //----------------------------------------------------------------
- // Binormals
- //----------------------------------------------------------------
- numRead = fread(mBaseBinormals, 3*sizeof(float), numVertices, fp);
- llendianswizzle(mBaseBinormals, sizeof(float), 3*numVertices);
- if (numRead != numVertices)
- {
- llerrs << " can't read Binormals from " << fileName << llendl;
- return FALSE;
- }
-
-
- //----------------------------------------------------------------
- // TexCoords
- //----------------------------------------------------------------
- numRead = fread(mTexCoords, 2*sizeof(float), numVertices, fp);
- llendianswizzle(mTexCoords, sizeof(float), 2*numVertices);
- if (numRead != numVertices)
- {
- llerrs << "can't read TexCoords from " << fileName << llendl;
- return FALSE;
- }
-
- //----------------------------------------------------------------
- // DetailTexCoords
- //----------------------------------------------------------------
- if (mHasDetailTexCoords)
- {
- numRead = fread(mDetailTexCoords, 2*sizeof(float), numVertices, fp);
- llendianswizzle(mDetailTexCoords, sizeof(float), 2*numVertices);
- if (numRead != numVertices)
- {
- llerrs << "can't read DetailTexCoords from " << fileName << llendl;
- return FALSE;
- }
- }
-
- //----------------------------------------------------------------
- // Weights
- //----------------------------------------------------------------
- if (mHasWeights)
- {
- numRead = fread(mWeights, sizeof(float), numVertices, fp);
- llendianswizzle(mWeights, sizeof(float), numVertices);
- if (numRead != numVertices)
- {
- llerrs << "can't read Weights from " << fileName << llendl;
- return FALSE;
- }
- }
- }
-
- //----------------------------------------------------------------
- // NumFaces
- //----------------------------------------------------------------
- U16 numFaces;
- numRead = fread(&numFaces, sizeof(U16), 1, fp);
- llendianswizzle(&numFaces, sizeof(U16), 1);
- if (numRead != 1)
- {
- llerrs << "can't read NumFaces from " << fileName << llendl;
- return FALSE;
- }
- allocateFaceData( numFaces );
-
-
- //----------------------------------------------------------------
- // Faces
- //----------------------------------------------------------------
- U32 i;
- U32 numTris = 0;
- for (i = 0; i < numFaces; i++)
- {
- S16 face[3];
- numRead = fread(face, sizeof(U16), 3, fp);
- llendianswizzle(face, sizeof(U16), 3);
- if (numRead != 3)
- {
- llerrs << "can't read Face[" << i << "] from " << fileName << llendl;
- return FALSE;
- }
- if (mReferenceData)
- {
- llassert(face[0] < mReferenceData->mNumVertices);
- llassert(face[1] < mReferenceData->mNumVertices);
- llassert(face[2] < mReferenceData->mNumVertices);
- }
-
- if (isLOD())
- {
- // store largest index in case of LODs
- for (S32 j = 0; j < 3; j++)
- {
- if (face[j] > mNumVertices - 1)
- {
- mNumVertices = face[j] + 1;
- }
- }
- }
- mFaces[i][0] = face[0];
- mFaces[i][1] = face[1];
- mFaces[i][2] = face[2];
-
-// S32 j;
-// for(j = 0; j < 3; j++)
-// {
-// LLDynamicArray<S32> *face_list = mVertFaceMap.getIfThere(face[j]);
-// if (!face_list)
-// {
-// face_list = new LLDynamicArray<S32>;
-// mVertFaceMap.addData(face[j], face_list);
-// }
-// face_list->put(i);
-// }
-
- numTris++;
- }
-
- lldebugs << "verts: " << numVertices
- << ", faces: " << numFaces
- << ", tris: " << numTris
- << llendl;
-
- //----------------------------------------------------------------
- // NumSkinJoints
- //----------------------------------------------------------------
- if (!isLOD())
- {
- U16 numSkinJoints = 0;
- if ( mHasWeights )
- {
- numRead = fread(&numSkinJoints, sizeof(U16), 1, fp);
- llendianswizzle(&numSkinJoints, sizeof(U16), 1);
- if (numRead != 1)
- {
- llerrs << "can't read NumSkinJoints from " << fileName << llendl;
- return FALSE;
- }
- allocateJointNames( numSkinJoints );
- }
-
- //----------------------------------------------------------------
- // SkinJoints
- //----------------------------------------------------------------
- for (i=0; i < numSkinJoints; i++)
- {
- char jointName[64+1];
- numRead = fread(jointName, sizeof(jointName)-1, 1, fp);
- jointName[sizeof(jointName)-1] = '\0'; // ensure nul-termination
- if (numRead != 1)
- {
- llerrs << "can't read Skin[" << i << "].Name from " << fileName << llendl;
- return FALSE;
- }
-
- std::string *jn = &mJointNames[i];
- *jn = jointName;
- }
-
- //-------------------------------------------------------------------------
- // look for morph section
- //-------------------------------------------------------------------------
- char morphName[64+1];
- morphName[sizeof(morphName)-1] = '\0'; // ensure nul-termination
- while(fread(&morphName, sizeof(char), 64, fp) == 64)
- {
- if (!strcmp(morphName, "End Morphs"))
- {
- // we reached the end of the morphs
- break;
- }
- LLPolyMorphData* morph_data = new LLPolyMorphData(std::string(morphName));
-
- BOOL result = morph_data->loadBinary(fp, this);
-
- if (!result)
- {
- delete morph_data;
- continue;
- }
-
- mMorphData.insert(morph_data);
- }
-
- S32 numRemaps;
- if (fread(&numRemaps, sizeof(S32), 1, fp) == 1)
- {
- llendianswizzle(&numRemaps, sizeof(S32), 1);
- for (S32 i = 0; i < numRemaps; i++)
- {
- S32 remapSrc;
- S32 remapDst;
- if (fread(&remapSrc, sizeof(S32), 1, fp) != 1)
- {
- llerrs << "can't read source vertex in vertex remap data" << llendl;
- break;
- }
- if (fread(&remapDst, sizeof(S32), 1, fp) != 1)
- {
- llerrs << "can't read destination vertex in vertex remap data" << llendl;
- break;
- }
- llendianswizzle(&remapSrc, sizeof(S32), 1);
- llendianswizzle(&remapDst, sizeof(S32), 1);
-
- mSharedVerts[remapSrc] = remapDst;
- }
- }
- }
-
- status = TRUE;
- }
- else
- {
- llerrs << "invalid mesh file header: " << fileName << llendl;
- status = FALSE;
- }
-
- if (0 == mNumJointNames)
- {
- allocateJointNames(1);
- }
-
- fclose( fp );
-
- return status;
+ //-------------------------------------------------------------------------
+ // Open the file
+ //-------------------------------------------------------------------------
+ if(fileName.empty())
+ {
+ llerrs << "Filename is Empty!" << llendl;
+ return FALSE;
+ }
+ LLFILE* fp = LLFile::fopen(fileName, "rb"); /*Flawfinder: ignore*/
+ if (!fp)
+ {
+ llerrs << "can't open: " << fileName << llendl;
+ return FALSE;
+ }
+
+ //-------------------------------------------------------------------------
+ // Read a chunk
+ //-------------------------------------------------------------------------
+ char header[128]; /*Flawfinder: ignore*/
+ if (fread(header, sizeof(char), 128, fp) != 128)
+ {
+ llwarns << "Short read" << llendl;
+ }
+
+ //-------------------------------------------------------------------------
+ // Check for proper binary header
+ //-------------------------------------------------------------------------
+ BOOL status = FALSE;
+ if ( strncmp(header, HEADER_BINARY, strlen(HEADER_BINARY)) == 0 ) /*Flawfinder: ignore*/
+ {
+ lldebugs << "Loading " << fileName << llendl;
+
+ //----------------------------------------------------------------
+ // File Header (seek past it)
+ //----------------------------------------------------------------
+ fseek(fp, 24, SEEK_SET);
+
+ //----------------------------------------------------------------
+ // HasWeights
+ //----------------------------------------------------------------
+ U8 hasWeights;
+ size_t numRead = fread(&hasWeights, sizeof(U8), 1, fp);
+ if (numRead != 1)
+ {
+ llerrs << "can't read HasWeights flag from " << fileName << llendl;
+ return FALSE;
+ }
+ if (!isLOD())
+ {
+ mHasWeights = (hasWeights==0) ? FALSE : TRUE;
+ }
+
+ //----------------------------------------------------------------
+ // HasDetailTexCoords
+ //----------------------------------------------------------------
+ U8 hasDetailTexCoords;
+ numRead = fread(&hasDetailTexCoords, sizeof(U8), 1, fp);
+ if (numRead != 1)
+ {
+ llerrs << "can't read HasDetailTexCoords flag from " << fileName << llendl;
+ return FALSE;
+ }
+
+ //----------------------------------------------------------------
+ // Position
+ //----------------------------------------------------------------
+ LLVector3 position;
+ numRead = fread(position.mV, sizeof(float), 3, fp);
+ llendianswizzle(position.mV, sizeof(float), 3);
+ if (numRead != 3)
+ {
+ llerrs << "can't read Position from " << fileName << llendl;
+ return FALSE;
+ }
+ setPosition( position );
+
+ //----------------------------------------------------------------
+ // Rotation
+ //----------------------------------------------------------------
+ LLVector3 rotationAngles;
+ numRead = fread(rotationAngles.mV, sizeof(float), 3, fp);
+ llendianswizzle(rotationAngles.mV, sizeof(float), 3);
+ if (numRead != 3)
+ {
+ llerrs << "can't read RotationAngles from " << fileName << llendl;
+ return FALSE;
+ }
+
+ U8 rotationOrder;
+ numRead = fread(&rotationOrder, sizeof(U8), 1, fp);
+
+ if (numRead != 1)
+ {
+ llerrs << "can't read RotationOrder from " << fileName << llendl;
+ return FALSE;
+ }
+
+ rotationOrder = 0;
+
+ setRotation( mayaQ( rotationAngles.mV[0],
+ rotationAngles.mV[1],
+ rotationAngles.mV[2],
+ (LLQuaternion::Order)rotationOrder ) );
+
+ //----------------------------------------------------------------
+ // Scale
+ //----------------------------------------------------------------
+ LLVector3 scale;
+ numRead = fread(scale.mV, sizeof(float), 3, fp);
+ llendianswizzle(scale.mV, sizeof(float), 3);
+ if (numRead != 3)
+ {
+ llerrs << "can't read Scale from " << fileName << llendl;
+ return FALSE;
+ }
+ setScale( scale );
+
+ //-------------------------------------------------------------------------
+ // Release any existing mesh geometry
+ //-------------------------------------------------------------------------
+ freeMeshData();
+
+ U16 numVertices = 0;
+
+ //----------------------------------------------------------------
+ // NumVertices
+ //----------------------------------------------------------------
+ if (!isLOD())
+ {
+ numRead = fread(&numVertices, sizeof(U16), 1, fp);
+ llendianswizzle(&numVertices, sizeof(U16), 1);
+ if (numRead != 1)
+ {
+ llerrs << "can't read NumVertices from " << fileName << llendl;
+ return FALSE;
+ }
+
+ allocateVertexData( numVertices );
+
+ //----------------------------------------------------------------
+ // Coords
+ //----------------------------------------------------------------
+ numRead = fread(mBaseCoords, 3*sizeof(float), numVertices, fp);
+ llendianswizzle(mBaseCoords, sizeof(float), 3*numVertices);
+ if (numRead != numVertices)
+ {
+ llerrs << "can't read Coordinates from " << fileName << llendl;
+ return FALSE;
+ }
+
+ //----------------------------------------------------------------
+ // Normals
+ //----------------------------------------------------------------
+ numRead = fread(mBaseNormals, 3*sizeof(float), numVertices, fp);
+ llendianswizzle(mBaseNormals, sizeof(float), 3*numVertices);
+ if (numRead != numVertices)
+ {
+ llerrs << " can't read Normals from " << fileName << llendl;
+ return FALSE;
+ }
+
+ //----------------------------------------------------------------
+ // Binormals
+ //----------------------------------------------------------------
+ numRead = fread(mBaseBinormals, 3*sizeof(float), numVertices, fp);
+ llendianswizzle(mBaseBinormals, sizeof(float), 3*numVertices);
+ if (numRead != numVertices)
+ {
+ llerrs << " can't read Binormals from " << fileName << llendl;
+ return FALSE;
+ }
+
+
+ //----------------------------------------------------------------
+ // TexCoords
+ //----------------------------------------------------------------
+ numRead = fread(mTexCoords, 2*sizeof(float), numVertices, fp);
+ llendianswizzle(mTexCoords, sizeof(float), 2*numVertices);
+ if (numRead != numVertices)
+ {
+ llerrs << "can't read TexCoords from " << fileName << llendl;
+ return FALSE;
+ }
+
+ //----------------------------------------------------------------
+ // DetailTexCoords
+ //----------------------------------------------------------------
+ if (mHasDetailTexCoords)
+ {
+ numRead = fread(mDetailTexCoords, 2*sizeof(float), numVertices, fp);
+ llendianswizzle(mDetailTexCoords, sizeof(float), 2*numVertices);
+ if (numRead != numVertices)
+ {
+ llerrs << "can't read DetailTexCoords from " << fileName << llendl;
+ return FALSE;
+ }
+ }
+
+ //----------------------------------------------------------------
+ // Weights
+ //----------------------------------------------------------------
+ if (mHasWeights)
+ {
+ numRead = fread(mWeights, sizeof(float), numVertices, fp);
+ llendianswizzle(mWeights, sizeof(float), numVertices);
+ if (numRead != numVertices)
+ {
+ llerrs << "can't read Weights from " << fileName << llendl;
+ return FALSE;
+ }
+ }
+ }
+
+ //----------------------------------------------------------------
+ // NumFaces
+ //----------------------------------------------------------------
+ U16 numFaces;
+ numRead = fread(&numFaces, sizeof(U16), 1, fp);
+ llendianswizzle(&numFaces, sizeof(U16), 1);
+ if (numRead != 1)
+ {
+ llerrs << "can't read NumFaces from " << fileName << llendl;
+ return FALSE;
+ }
+ allocateFaceData( numFaces );
+
+
+ //----------------------------------------------------------------
+ // Faces
+ //----------------------------------------------------------------
+ U32 i;
+ U32 numTris = 0;
+ for (i = 0; i < numFaces; i++)
+ {
+ S16 face[3];
+ numRead = fread(face, sizeof(U16), 3, fp);
+ llendianswizzle(face, sizeof(U16), 3);
+ if (numRead != 3)
+ {
+ llerrs << "can't read Face[" << i << "] from " << fileName << llendl;
+ return FALSE;
+ }
+ if (mReferenceData)
+ {
+ llassert(face[0] < mReferenceData->mNumVertices);
+ llassert(face[1] < mReferenceData->mNumVertices);
+ llassert(face[2] < mReferenceData->mNumVertices);
+ }
+
+ if (isLOD())
+ {
+ // store largest index in case of LODs
+ for (S32 j = 0; j < 3; j++)
+ {
+ if (face[j] > mNumVertices - 1)
+ {
+ mNumVertices = face[j] + 1;
+ }
+ }
+ }
+ mFaces[i][0] = face[0];
+ mFaces[i][1] = face[1];
+ mFaces[i][2] = face[2];
+
+// S32 j;
+// for(j = 0; j < 3; j++)
+// {
+// LLDynamicArray<S32> *face_list = mVertFaceMap.getIfThere(face[j]);
+// if (!face_list)
+// {
+// face_list = new LLDynamicArray<S32>;
+// mVertFaceMap.addData(face[j], face_list);
+// }
+// face_list->put(i);
+// }
+
+ numTris++;
+ }
+
+ lldebugs << "verts: " << numVertices
+ << ", faces: " << numFaces
+ << ", tris: " << numTris
+ << llendl;
+
+ //----------------------------------------------------------------
+ // NumSkinJoints
+ //----------------------------------------------------------------
+ if (!isLOD())
+ {
+ U16 numSkinJoints = 0;
+ if ( mHasWeights )
+ {
+ numRead = fread(&numSkinJoints, sizeof(U16), 1, fp);
+ llendianswizzle(&numSkinJoints, sizeof(U16), 1);
+ if (numRead != 1)
+ {
+ llerrs << "can't read NumSkinJoints from " << fileName << llendl;
+ return FALSE;
+ }
+ allocateJointNames( numSkinJoints );
+ }
+
+ //----------------------------------------------------------------
+ // SkinJoints
+ //----------------------------------------------------------------
+ for (i=0; i < numSkinJoints; i++)
+ {
+ char jointName[64+1];
+ numRead = fread(jointName, sizeof(jointName)-1, 1, fp);
+ jointName[sizeof(jointName)-1] = '\0'; // ensure nul-termination
+ if (numRead != 1)
+ {
+ llerrs << "can't read Skin[" << i << "].Name from " << fileName << llendl;
+ return FALSE;
+ }
+
+ std::string *jn = &mJointNames[i];
+ *jn = jointName;
+ }
+
+ //-------------------------------------------------------------------------
+ // look for morph section
+ //-------------------------------------------------------------------------
+ char morphName[64+1];
+ morphName[sizeof(morphName)-1] = '\0'; // ensure nul-termination
+ while(fread(&morphName, sizeof(char), 64, fp) == 64)
+ {
+ if (!strcmp(morphName, "End Morphs"))
+ {
+ // we reached the end of the morphs
+ break;
+ }
+ LLPolyMorphData* morph_data = new LLPolyMorphData(std::string(morphName));
+
+ BOOL result = morph_data->loadBinary(fp, this);
+
+ if (!result)
+ {
+ delete morph_data;
+ continue;
+ }
+
+ mMorphData.insert(morph_data);
+
+ if (!strcmp(morphName, "Breast_Female_Cleavage"))
+ {
+ mMorphData.insert(clone_morph_param_cleavage(morph_data,
+ .75f,
+ "Breast_Physics_LeftRight_Driven"));
+ }
+
+ if (!strcmp(morphName, "Breast_Female_Cleavage"))
+ {
+ mMorphData.insert(clone_morph_param_duplicate(morph_data,
+ "Breast_Physics_InOut_Driven"));
+ }
+ if (!strcmp(morphName, "Breast_Gravity"))
+ {
+ mMorphData.insert(clone_morph_param_duplicate(morph_data,
+ "Breast_Physics_UpDown_Driven"));
+ }
+
+ if (!strcmp(morphName, "Big_Belly_Torso"))
+ {
+ mMorphData.insert(clone_morph_param_direction(morph_data,
+ LLVector3(0,0,0.05f),
+ "Belly_Physics_Torso_UpDown_Driven"));
+ }
+
+ if (!strcmp(morphName, "Big_Belly_Legs"))
+ {
+ mMorphData.insert(clone_morph_param_direction(morph_data,
+ LLVector3(0,0,0.05f),
+ "Belly_Physics_Legs_UpDown_Driven"));
+ }
+
+ if (!strcmp(morphName, "skirt_belly"))
+ {
+ mMorphData.insert(clone_morph_param_direction(morph_data,
+ LLVector3(0,0,0.05f),
+ "Belly_Physics_Skirt_UpDown_Driven"));
+ }
+
+ if (!strcmp(morphName, "Small_Butt"))
+ {
+ mMorphData.insert(clone_morph_param_direction(morph_data,
+ LLVector3(0,0,0.05f),
+ "Butt_Physics_UpDown_Driven"));
+ }
+ if (!strcmp(morphName, "Small_Butt"))
+ {
+ mMorphData.insert(clone_morph_param_direction(morph_data,
+ LLVector3(0,0.03f,0),
+ "Butt_Physics_LeftRight_Driven"));
+ }
+ }
+
+ S32 numRemaps;
+ if (fread(&numRemaps, sizeof(S32), 1, fp) == 1)
+ {
+ llendianswizzle(&numRemaps, sizeof(S32), 1);
+ for (S32 i = 0; i < numRemaps; i++)
+ {
+ S32 remapSrc;
+ S32 remapDst;
+ if (fread(&remapSrc, sizeof(S32), 1, fp) != 1)
+ {
+ llerrs << "can't read source vertex in vertex remap data" << llendl;
+ break;
+ }
+ if (fread(&remapDst, sizeof(S32), 1, fp) != 1)
+ {
+ llerrs << "can't read destination vertex in vertex remap data" << llendl;
+ break;
+ }
+ llendianswizzle(&remapSrc, sizeof(S32), 1);
+ llendianswizzle(&remapDst, sizeof(S32), 1);
+
+ mSharedVerts[remapSrc] = remapDst;
+ }
+ }
+ }
+
+ status = TRUE;
+ }
+ else
+ {
+ llerrs << "invalid mesh file header: " << fileName << llendl;
+ status = FALSE;
+ }
+
+ if (0 == mNumJointNames)
+ {
+ allocateJointNames(1);
+ }
+
+ fclose( fp );
+
+ return status;
}
//-----------------------------------------------------------------------------
@@ -653,11 +715,11 @@ BOOL LLPolyMeshSharedData::loadMesh( const std::string& fileName )
//-----------------------------------------------------------------------------
const S32 *LLPolyMeshSharedData::getSharedVert(S32 vert)
{
- if (mSharedVerts.count(vert) > 0)
- {
- return &mSharedVerts[vert];
- }
- return NULL;
+ if (mSharedVerts.count(vert) > 0)
+ {
+ return &mSharedVerts[vert];
+ }
+ return NULL;
}
//-----------------------------------------------------------------------------
@@ -665,17 +727,17 @@ const S32 *LLPolyMeshSharedData::getSharedVert(S32 vert)
//-----------------------------------------------------------------------------
const LLVector2 &LLPolyMeshSharedData::getUVs(U32 index)
{
- // TODO: convert all index variables to S32
- llassert((S32)index < mNumVertices);
+ // TODO: convert all index variables to S32
+ llassert((S32)index < mNumVertices);
- return mTexCoords[index];
+ return mTexCoords[index];
}
//-----------------------------------------------------------------------------
// LLPolyMesh()
//-----------------------------------------------------------------------------
LLPolyMesh::LLPolyMesh(LLPolyMeshSharedData *shared_data, LLPolyMesh *reference_mesh)
-{
+{
LLMemType mt(LLMemType::MTYPE_AVATAR_MESH);
llassert(shared_data);
@@ -703,29 +765,23 @@ LLPolyMesh::LLPolyMesh(LLPolyMeshSharedData *shared_data, LLPolyMesh *reference_
}
else
{
-#if 1 // Allocate memory without initializing every vector
+ // Allocate memory without initializing every vector
// NOTE: This makes asusmptions about the size of LLVector[234]
int nverts = mSharedData->mNumVertices;
- int nfloats = nverts * (3*5 + 2 + 4);
- mVertexData = new F32[nfloats];
+ int nfloats = nverts * (2*4 + 3*3 + 2 + 4);
+ //use 16 byte aligned vertex data to make LLPolyMesh SSE friendly
+ mVertexData = (F32*) ll_aligned_malloc_16(nfloats*4);
int offset = 0;
- mCoords = (LLVector3*)(mVertexData + offset); offset += 3*nverts;
- mNormals = (LLVector3*)(mVertexData + offset); offset += 3*nverts;
- mScaledNormals = (LLVector3*)(mVertexData + offset); offset += 3*nverts;
- mBinormals = (LLVector3*)(mVertexData + offset); offset += 3*nverts;
- mScaledBinormals = (LLVector3*)(mVertexData + offset); offset += 3*nverts;
- mTexCoords = (LLVector2*)(mVertexData + offset); offset += 2*nverts;
- mClothingWeights = (LLVector4*)(mVertexData + offset); offset += 4*nverts;
-#else
- mCoords = new LLVector3[mSharedData->mNumVertices];
- mNormals = new LLVector3[mSharedData->mNumVertices];
- mScaledNormals = new LLVector3[mSharedData->mNumVertices];
- mBinormals = new LLVector3[mSharedData->mNumVertices];
- mScaledBinormals = new LLVector3[mSharedData->mNumVertices];
- mTexCoords = new LLVector2[mSharedData->mNumVertices];
- mClothingWeights = new LLVector4[mSharedData->mNumVertices];
- memset(mClothingWeights, 0, sizeof(LLVector4) * mSharedData->mNumVertices);
-#endif
+ mCoords = (LLVector4*)(mVertexData + offset); offset += 4*nverts;
+ mNormals = (LLVector4*)(mVertexData + offset); offset += 4*nverts;
+ mClothingWeights = (LLVector4*)(mVertexData + offset); offset += 4*nverts;
+ mTexCoords = (LLVector2*)(mVertexData + offset); offset += 2*nverts;
+
+ // these members don't need to be 16-byte aligned, but the first one might be
+ // read during an aligned memcpy of mTexCoords
+ mScaledNormals = (LLVector3*)(mVertexData + offset); offset += 3*nverts;
+ mBinormals = (LLVector3*)(mVertexData + offset); offset += 3*nverts;
+ mScaledBinormals = (LLVector3*)(mVertexData + offset); offset += 3*nverts;
initializeForMorph();
}
}
@@ -736,23 +792,15 @@ LLPolyMesh::LLPolyMesh(LLPolyMeshSharedData *shared_data, LLPolyMesh *reference_
//-----------------------------------------------------------------------------
LLPolyMesh::~LLPolyMesh()
{
- S32 i;
- for (i = 0; i < mJointRenderData.count(); i++)
- {
- delete mJointRenderData[i];
- mJointRenderData[i] = NULL;
- }
-#if 0 // These are now allocated as one big uninitialized chunk
- delete [] mCoords;
- delete [] mNormals;
- delete [] mScaledNormals;
- delete [] mBinormals;
- delete [] mScaledBinormals;
- delete [] mClothingWeights;
- delete [] mTexCoords;
-#else
- delete [] mVertexData;
-#endif
+ S32 i;
+ for (i = 0; i < mJointRenderData.count(); i++)
+ {
+ delete mJointRenderData[i];
+ mJointRenderData[i] = NULL;
+ }
+
+ ll_aligned_free_16(mVertexData);
+
}
@@ -761,40 +809,40 @@ LLPolyMesh::~LLPolyMesh()
//-----------------------------------------------------------------------------
LLPolyMesh *LLPolyMesh::getMesh(const std::string &name, LLPolyMesh* reference_mesh)
{
- //-------------------------------------------------------------------------
- // search for an existing mesh by this name
- //-------------------------------------------------------------------------
- LLPolyMeshSharedData* meshSharedData = get_if_there(sGlobalSharedMeshList, name, (LLPolyMeshSharedData*)NULL);
- if (meshSharedData)
- {
-// llinfos << "Polymesh " << name << " found in global mesh table." << llendl;
- LLPolyMesh *poly_mesh = new LLPolyMesh(meshSharedData, reference_mesh);
- return poly_mesh;
- }
-
- //-------------------------------------------------------------------------
- // if not found, create a new one, add it to the list
- //-------------------------------------------------------------------------
- std::string full_path;
- full_path = gDirUtilp->getExpandedFilename(LL_PATH_CHARACTER,name);
-
- LLPolyMeshSharedData *mesh_data = new LLPolyMeshSharedData();
- if (reference_mesh)
- {
- mesh_data->setupLOD(reference_mesh->getSharedData());
- }
- if ( ! mesh_data->loadMesh( full_path ) )
- {
- delete mesh_data;
- return NULL;
- }
-
- LLPolyMesh *poly_mesh = new LLPolyMesh(mesh_data, reference_mesh);
-
-// llinfos << "Polymesh " << name << " added to global mesh table." << llendl;
- sGlobalSharedMeshList[name] = poly_mesh->mSharedData;
-
- return poly_mesh;
+ //-------------------------------------------------------------------------
+ // search for an existing mesh by this name
+ //-------------------------------------------------------------------------
+ LLPolyMeshSharedData* meshSharedData = get_if_there(sGlobalSharedMeshList, name, (LLPolyMeshSharedData*)NULL);
+ if (meshSharedData)
+ {
+// llinfos << "Polymesh " << name << " found in global mesh table." << llendl;
+ LLPolyMesh *poly_mesh = new LLPolyMesh(meshSharedData, reference_mesh);
+ return poly_mesh;
+ }
+
+ //-------------------------------------------------------------------------
+ // if not found, create a new one, add it to the list
+ //-------------------------------------------------------------------------
+ std::string full_path;
+ full_path = gDirUtilp->getExpandedFilename(LL_PATH_CHARACTER,name);
+
+ LLPolyMeshSharedData *mesh_data = new LLPolyMeshSharedData();
+ if (reference_mesh)
+ {
+ mesh_data->setupLOD(reference_mesh->getSharedData());
+ }
+ if ( ! mesh_data->loadMesh( full_path ) )
+ {
+ delete mesh_data;
+ return NULL;
+ }
+
+ LLPolyMesh *poly_mesh = new LLPolyMesh(mesh_data, reference_mesh);
+
+// llinfos << "Polymesh " << name << " added to global mesh table." << llendl;
+ sGlobalSharedMeshList[name] = poly_mesh->mSharedData;
+
+ return poly_mesh;
}
//-----------------------------------------------------------------------------
@@ -802,14 +850,14 @@ LLPolyMesh *LLPolyMesh::getMesh(const std::string &name, LLPolyMesh* reference_m
//-----------------------------------------------------------------------------
void LLPolyMesh::freeAllMeshes()
{
- // delete each item in the global lists
- for_each(sGlobalSharedMeshList.begin(), sGlobalSharedMeshList.end(), DeletePairedPointer());
- sGlobalSharedMeshList.clear();
+ // delete each item in the global lists
+ for_each(sGlobalSharedMeshList.begin(), sGlobalSharedMeshList.end(), DeletePairedPointer());
+ sGlobalSharedMeshList.clear();
}
LLPolyMeshSharedData *LLPolyMesh::getSharedData() const
{
- return mSharedData;
+ return mSharedData;
}
@@ -818,57 +866,57 @@ LLPolyMeshSharedData *LLPolyMesh::getSharedData() const
//--------------------------------------------------------------------
void LLPolyMesh::dumpDiagInfo()
{
- // keep track of totals
- U32 total_verts = 0;
- U32 total_faces = 0;
- U32 total_kb = 0;
-
- std::string buf;
-
- llinfos << "-----------------------------------------------------" << llendl;
- llinfos << " Global PolyMesh Table (DEBUG only)" << llendl;
- llinfos << " Verts Faces Mem(KB) Name" << llendl;
- llinfos << "-----------------------------------------------------" << llendl;
-
- // print each loaded mesh, and it's memory usage
- for(LLPolyMeshSharedDataTable::iterator iter = sGlobalSharedMeshList.begin();
- iter != sGlobalSharedMeshList.end(); ++iter)
- {
- const std::string& mesh_name = iter->first;
- LLPolyMeshSharedData* mesh = iter->second;
-
- S32 num_verts = mesh->mNumVertices;
- S32 num_faces = mesh->mNumFaces;
- U32 num_kb = mesh->getNumKB();
-
- buf = llformat("%8d %8d %8d %s", num_verts, num_faces, num_kb, mesh_name.c_str());
- llinfos << buf << llendl;
-
- total_verts += num_verts;
- total_faces += num_faces;
- total_kb += num_kb;
- }
-
- llinfos << "-----------------------------------------------------" << llendl;
- buf = llformat("%8d %8d %8d TOTAL", total_verts, total_faces, total_kb );
- llinfos << buf << llendl;
- llinfos << "-----------------------------------------------------" << llendl;
+ // keep track of totals
+ U32 total_verts = 0;
+ U32 total_faces = 0;
+ U32 total_kb = 0;
+
+ std::string buf;
+
+ llinfos << "-----------------------------------------------------" << llendl;
+ llinfos << " Global PolyMesh Table (DEBUG only)" << llendl;
+ llinfos << " Verts Faces Mem(KB) Name" << llendl;
+ llinfos << "-----------------------------------------------------" << llendl;
+
+ // print each loaded mesh, and it's memory usage
+ for(LLPolyMeshSharedDataTable::iterator iter = sGlobalSharedMeshList.begin();
+ iter != sGlobalSharedMeshList.end(); ++iter)
+ {
+ const std::string& mesh_name = iter->first;
+ LLPolyMeshSharedData* mesh = iter->second;
+
+ S32 num_verts = mesh->mNumVertices;
+ S32 num_faces = mesh->mNumFaces;
+ U32 num_kb = mesh->getNumKB();
+
+ buf = llformat("%8d %8d %8d %s", num_verts, num_faces, num_kb, mesh_name.c_str());
+ llinfos << buf << llendl;
+
+ total_verts += num_verts;
+ total_faces += num_faces;
+ total_kb += num_kb;
+ }
+
+ llinfos << "-----------------------------------------------------" << llendl;
+ buf = llformat("%8d %8d %8d TOTAL", total_verts, total_faces, total_kb );
+ llinfos << buf << llendl;
+ llinfos << "-----------------------------------------------------" << llendl;
}
//-----------------------------------------------------------------------------
// getWritableCoords()
//-----------------------------------------------------------------------------
-LLVector3 *LLPolyMesh::getWritableCoords()
+LLVector4 *LLPolyMesh::getWritableCoords()
{
- return mCoords;
+ return mCoords;
}
//-----------------------------------------------------------------------------
// getWritableNormals()
//-----------------------------------------------------------------------------
-LLVector3 *LLPolyMesh::getWritableNormals()
+LLVector4 *LLPolyMesh::getWritableNormals()
{
- return mNormals;
+ return mNormals;
}
//-----------------------------------------------------------------------------
@@ -876,24 +924,24 @@ LLVector3 *LLPolyMesh::getWritableNormals()
//-----------------------------------------------------------------------------
LLVector3 *LLPolyMesh::getWritableBinormals()
{
- return mBinormals;
+ return mBinormals;
}
//-----------------------------------------------------------------------------
// getWritableClothingWeights()
//-----------------------------------------------------------------------------
-LLVector4 *LLPolyMesh::getWritableClothingWeights()
+LLVector4 *LLPolyMesh::getWritableClothingWeights()
{
- return mClothingWeights;
+ return mClothingWeights;
}
//-----------------------------------------------------------------------------
// getWritableTexCoords()
//-----------------------------------------------------------------------------
-LLVector2 *LLPolyMesh::getWritableTexCoords()
+LLVector2 *LLPolyMesh::getWritableTexCoords()
{
- return mTexCoords;
+ return mTexCoords;
}
//-----------------------------------------------------------------------------
@@ -901,7 +949,7 @@ LLVector2 *LLPolyMesh::getWritableTexCoords()
//-----------------------------------------------------------------------------
LLVector3 *LLPolyMesh::getScaledNormals()
{
- return mScaledNormals;
+ return mScaledNormals;
}
//-----------------------------------------------------------------------------
@@ -909,7 +957,7 @@ LLVector3 *LLPolyMesh::getScaledNormals()
//-----------------------------------------------------------------------------
LLVector3 *LLPolyMesh::getScaledBinormals()
{
- return mScaledBinormals;
+ return mScaledBinormals;
}
@@ -918,11 +966,12 @@ LLVector3 *LLPolyMesh::getScaledBinormals()
//-----------------------------------------------------------------------------
void LLPolyMesh::initializeForMorph()
{
- if (!mSharedData)
- return;
+ for (U32 i = 0; i < mSharedData->mNumVertices; ++i)
+ {
+ mCoords[i] = LLVector4(mSharedData->mBaseCoords[i]);
+ mNormals[i] = LLVector4(mSharedData->mBaseNormals[i]);
+ }
- memcpy(mCoords, mSharedData->mBaseCoords, sizeof(LLVector3) * mSharedData->mNumVertices); /*Flawfinder: ignore*/
- memcpy(mNormals, mSharedData->mBaseNormals, sizeof(LLVector3) * mSharedData->mNumVertices); /*Flawfinder: ignore*/
memcpy(mScaledNormals, mSharedData->mBaseNormals, sizeof(LLVector3) * mSharedData->mNumVertices); /*Flawfinder: ignore*/
memcpy(mBinormals, mSharedData->mBaseBinormals, sizeof(LLVector3) * mSharedData->mNumVertices); /*Flawfinder: ignore*/
memcpy(mScaledBinormals, mSharedData->mBaseBinormals, sizeof(LLVector3) * mSharedData->mNumVertices); /*Flawfinder: ignore*/
@@ -933,51 +982,51 @@ void LLPolyMesh::initializeForMorph()
//-----------------------------------------------------------------------------
// getMorphData()
//-----------------------------------------------------------------------------
-LLPolyMorphData* LLPolyMesh::getMorphData(const std::string& morph_name)
+LLPolyMorphData* LLPolyMesh::getMorphData(const std::string& morph_name)
{
- if (!mSharedData)
- return NULL;
- for (LLPolyMeshSharedData::morphdata_list_t::iterator iter = mSharedData->mMorphData.begin();
- iter != mSharedData->mMorphData.end(); ++iter)
- {
- LLPolyMorphData *morph_data = *iter;
- if (morph_data->getName() == morph_name)
- {
- return morph_data;
- }
- }
- return NULL;
+ if (!mSharedData)
+ return NULL;
+ for (LLPolyMeshSharedData::morphdata_list_t::iterator iter = mSharedData->mMorphData.begin();
+ iter != mSharedData->mMorphData.end(); ++iter)
+ {
+ LLPolyMorphData *morph_data = *iter;
+ if (morph_data->getName() == morph_name)
+ {
+ return morph_data;
+ }
+ }
+ return NULL;
}
//-----------------------------------------------------------------------------
// removeMorphData()
//-----------------------------------------------------------------------------
// // erasing but not deleting seems bad, but fortunately we don't actually use this...
-// void LLPolyMesh::removeMorphData(LLPolyMorphData *morph_target)
+// void LLPolyMesh::removeMorphData(LLPolyMorphData *morph_target)
// {
-// if (!mSharedData)
-// return;
-// mSharedData->mMorphData.erase(morph_target);
+// if (!mSharedData)
+// return;
+// mSharedData->mMorphData.erase(morph_target);
// }
//-----------------------------------------------------------------------------
// deleteAllMorphData()
//-----------------------------------------------------------------------------
-// void LLPolyMesh::deleteAllMorphData()
+// void LLPolyMesh::deleteAllMorphData()
// {
-// if (!mSharedData)
-// return;
+// if (!mSharedData)
+// return;
-// for_each(mSharedData->mMorphData.begin(), mSharedData->mMorphData.end(), DeletePointer());
-// mSharedData->mMorphData.clear();
+// for_each(mSharedData->mMorphData.begin(), mSharedData->mMorphData.end(), DeletePointer());
+// mSharedData->mMorphData.clear();
// }
//-----------------------------------------------------------------------------
// getWritableWeights()
//-----------------------------------------------------------------------------
-F32* LLPolyMesh::getWritableWeights() const
+F32* LLPolyMesh::getWritableWeights() const
{
- return mSharedData->mWeights;
+ return mSharedData->mWeights;
}
//-----------------------------------------------------------------------------
@@ -989,58 +1038,58 @@ LLPolySkeletalDistortionInfo::LLPolySkeletalDistortionInfo()
BOOL LLPolySkeletalDistortionInfo::parseXml(LLXmlTreeNode* node)
{
- llassert( node->hasName( "param" ) && node->getChildByName( "param_skeleton" ) );
-
- if (!LLViewerVisualParamInfo::parseXml(node))
- return FALSE;
-
- LLXmlTreeNode* skeletalParam = node->getChildByName("param_skeleton");
-
- if (NULL == skeletalParam)
- {
- llwarns << "Failed to getChildByName(\"param_skeleton\")"
- << llendl;
- return FALSE;
- }
-
- for( LLXmlTreeNode* bone = skeletalParam->getFirstChild(); bone; bone = skeletalParam->getNextChild() )
- {
- if (bone->hasName("bone"))
- {
- std::string name;
- LLVector3 scale;
- LLVector3 pos;
- BOOL haspos = FALSE;
-
- static LLStdStringHandle name_string = LLXmlTree::addAttributeString("name");
- if (!bone->getFastAttributeString(name_string, name))
- {
- llwarns << "No bone name specified for skeletal param." << llendl;
- continue;
- }
-
- static LLStdStringHandle scale_string = LLXmlTree::addAttributeString("scale");
- if (!bone->getFastAttributeVector3(scale_string, scale))
- {
- llwarns << "No scale specified for bone " << name << "." << llendl;
- continue;
- }
-
- // optional offset deformation (translation)
- static LLStdStringHandle offset_string = LLXmlTree::addAttributeString("offset");
- if (bone->getFastAttributeVector3(offset_string, pos))
- {
- haspos = TRUE;
- }
- mBoneInfoList.push_back(LLPolySkeletalBoneInfo(name, scale, pos, haspos));
- }
- else
- {
- llwarns << "Unrecognized element " << bone->getName() << " in skeletal distortion" << llendl;
- continue;
- }
- }
- return TRUE;
+ llassert( node->hasName( "param" ) && node->getChildByName( "param_skeleton" ) );
+
+ if (!LLViewerVisualParamInfo::parseXml(node))
+ return FALSE;
+
+ LLXmlTreeNode* skeletalParam = node->getChildByName("param_skeleton");
+
+ if (NULL == skeletalParam)
+ {
+ llwarns << "Failed to getChildByName(\"param_skeleton\")"
+ << llendl;
+ return FALSE;
+ }
+
+ for( LLXmlTreeNode* bone = skeletalParam->getFirstChild(); bone; bone = skeletalParam->getNextChild() )
+ {
+ if (bone->hasName("bone"))
+ {
+ std::string name;
+ LLVector3 scale;
+ LLVector3 pos;
+ BOOL haspos = FALSE;
+
+ static LLStdStringHandle name_string = LLXmlTree::addAttributeString("name");
+ if (!bone->getFastAttributeString(name_string, name))
+ {
+ llwarns << "No bone name specified for skeletal param." << llendl;
+ continue;
+ }
+
+ static LLStdStringHandle scale_string = LLXmlTree::addAttributeString("scale");
+ if (!bone->getFastAttributeVector3(scale_string, scale))
+ {
+ llwarns << "No scale specified for bone " << name << "." << llendl;
+ continue;
+ }
+
+ // optional offset deformation (translation)
+ static LLStdStringHandle offset_string = LLXmlTree::addAttributeString("offset");
+ if (bone->getFastAttributeVector3(offset_string, pos))
+ {
+ haspos = TRUE;
+ }
+ mBoneInfoList.push_back(LLPolySkeletalBoneInfo(name, scale, pos, haspos));
+ }
+ else
+ {
+ llwarns << "Unrecognized element " << bone->getName() << " in skeletal distortion" << llendl;
+ continue;
+ }
+ }
+ return TRUE;
}
//-----------------------------------------------------------------------------
@@ -1048,8 +1097,8 @@ BOOL LLPolySkeletalDistortionInfo::parseXml(LLXmlTreeNode* node)
//-----------------------------------------------------------------------------
LLPolySkeletalDistortion::LLPolySkeletalDistortion(LLVOAvatar *avatarp)
{
- mAvatar = avatarp;
- mDefaultVec.setVec(0.001f, 0.001f, 0.001f);
+ mAvatar = avatarp;
+ mDefaultVec.setVec(0.001f, 0.001f, 0.001f);
}
//-----------------------------------------------------------------------------
@@ -1061,62 +1110,62 @@ LLPolySkeletalDistortion::~LLPolySkeletalDistortion()
BOOL LLPolySkeletalDistortion::setInfo(LLPolySkeletalDistortionInfo *info)
{
- llassert(mInfo == NULL);
- if (info->mID < 0)
- return FALSE;
- mInfo = info;
- mID = info->mID;
- setWeight(getDefaultWeight(), FALSE );
-
- LLPolySkeletalDistortionInfo::bone_info_list_t::iterator iter;
- for (iter = getInfo()->mBoneInfoList.begin(); iter != getInfo()->mBoneInfoList.end(); iter++)
- {
- LLPolySkeletalBoneInfo *bone_info = &(*iter);
- LLJoint* joint = mAvatar->getJoint(bone_info->mBoneName);
- if (!joint)
- {
- llwarns << "Joint " << bone_info->mBoneName << " not found." << llendl;
- continue;
- }
-
- if (mJointScales.find(joint) != mJointScales.end())
- {
- llwarns << "Scale deformation already supplied for joint " << joint->getName() << "." << llendl;
- }
-
- // store it
- mJointScales[joint] = bone_info->mScaleDeformation;
-
- // apply to children that need to inherit it
- for (LLJoint::child_list_t::iterator iter = joint->mChildren.begin();
- iter != joint->mChildren.end(); ++iter)
- {
- LLViewerJoint* child_joint = (LLViewerJoint*)(*iter);
- if (child_joint->inheritScale())
- {
- LLVector3 childDeformation = LLVector3(child_joint->getScale());
- childDeformation.scaleVec(bone_info->mScaleDeformation);
- mJointScales[child_joint] = childDeformation;
- }
- }
-
- if (bone_info->mHasPositionDeformation)
- {
- if (mJointOffsets.find(joint) != mJointOffsets.end())
- {
- llwarns << "Offset deformation already supplied for joint " << joint->getName() << "." << llendl;
- }
- mJointOffsets[joint] = bone_info->mPositionDeformation;
- }
- }
- return TRUE;
+ llassert(mInfo == NULL);
+ if (info->mID < 0)
+ return FALSE;
+ mInfo = info;
+ mID = info->mID;
+ setWeight(getDefaultWeight(), FALSE );
+
+ LLPolySkeletalDistortionInfo::bone_info_list_t::iterator iter;
+ for (iter = getInfo()->mBoneInfoList.begin(); iter != getInfo()->mBoneInfoList.end(); iter++)
+ {
+ LLPolySkeletalBoneInfo *bone_info = &(*iter);
+ LLJoint* joint = mAvatar->getJoint(bone_info->mBoneName);
+ if (!joint)
+ {
+ llwarns << "Joint " << bone_info->mBoneName << " not found." << llendl;
+ continue;
+ }
+
+ if (mJointScales.find(joint) != mJointScales.end())
+ {
+ llwarns << "Scale deformation already supplied for joint " << joint->getName() << "." << llendl;
+ }
+
+ // store it
+ mJointScales[joint] = bone_info->mScaleDeformation;
+
+ // apply to children that need to inherit it
+ for (LLJoint::child_list_t::iterator iter = joint->mChildren.begin();
+ iter != joint->mChildren.end(); ++iter)
+ {
+ LLViewerJoint* child_joint = (LLViewerJoint*)(*iter);
+ if (child_joint->inheritScale())
+ {
+ LLVector3 childDeformation = LLVector3(child_joint->getScale());
+ childDeformation.scaleVec(bone_info->mScaleDeformation);
+ mJointScales[child_joint] = childDeformation;
+ }
+ }
+
+ if (bone_info->mHasPositionDeformation)
+ {
+ if (mJointOffsets.find(joint) != mJointOffsets.end())
+ {
+ llwarns << "Offset deformation already supplied for joint " << joint->getName() << "." << llendl;
+ }
+ mJointOffsets[joint] = bone_info->mPositionDeformation;
+ }
+ }
+ return TRUE;
}
/*virtual*/ LLViewerVisualParam* LLPolySkeletalDistortion::cloneParam(LLWearable* wearable) const
{
- LLPolySkeletalDistortion *new_param = new LLPolySkeletalDistortion(mAvatar);
- *new_param = *this;
- return new_param;
+ LLPolySkeletalDistortion *new_param = new LLPolySkeletalDistortion(mAvatar);
+ *new_param = *this;
+ return new_param;
}
//-----------------------------------------------------------------------------
@@ -1124,38 +1173,89 @@ BOOL LLPolySkeletalDistortion::setInfo(LLPolySkeletalDistortionInfo *info)
//-----------------------------------------------------------------------------
void LLPolySkeletalDistortion::apply( ESex avatar_sex )
{
- F32 effective_weight = ( getSex() & avatar_sex ) ? mCurWeight : getDefaultWeight();
+ F32 effective_weight = ( getSex() & avatar_sex ) ? mCurWeight : getDefaultWeight();
+
+ LLJoint* joint;
+ joint_vec_map_t::iterator iter;
+
+ for (iter = mJointScales.begin();
+ iter != mJointScales.end();
+ iter++)
+ {
+ joint = iter->first;
+ LLVector3 newScale = joint->getScale();
+ LLVector3 scaleDelta = iter->second;
+ newScale = newScale + (effective_weight * scaleDelta) - (mLastWeight * scaleDelta);
+ joint->setScale(newScale);
+ }
+
+ for (iter = mJointOffsets.begin();
+ iter != mJointOffsets.end();
+ iter++)
+ {
+ joint = iter->first;
+ LLVector3 newPosition = joint->getPosition();
+ LLVector3 positionDelta = iter->second;
+ newPosition = newPosition + (effective_weight * positionDelta) - (mLastWeight * positionDelta);
+ joint->setPosition(newPosition);
+ }
+
+ if (mLastWeight != mCurWeight && !mIsAnimating)
+ {
+ mAvatar->setSkeletonSerialNum(mAvatar->getSkeletonSerialNum() + 1);
+ }
+ mLastWeight = mCurWeight;
+}
- LLJoint* joint;
- joint_vec_map_t::iterator iter;
- for (iter = mJointScales.begin();
- iter != mJointScales.end();
- iter++)
- {
- joint = iter->first;
- LLVector3 newScale = joint->getScale();
- LLVector3 scaleDelta = iter->second;
- newScale = newScale + (effective_weight * scaleDelta) - (mLastWeight * scaleDelta);
- joint->setScale(newScale);
- }
+LLPolyMorphData *clone_morph_param_duplicate(const LLPolyMorphData *src_data,
+ const std::string &name)
+{
+ LLPolyMorphData* cloned_morph_data = new LLPolyMorphData(*src_data);
+ cloned_morph_data->mName = name;
+ for (U32 v=0; v < cloned_morph_data->mNumIndices; v++)
+ {
+ cloned_morph_data->mCoords[v] = src_data->mCoords[v];
+ cloned_morph_data->mNormals[v] = src_data->mNormals[v];
+ cloned_morph_data->mBinormals[v] = src_data->mBinormals[v];
+ }
+ return cloned_morph_data;
+}
- for (iter = mJointOffsets.begin();
- iter != mJointOffsets.end();
- iter++)
- {
- joint = iter->first;
- LLVector3 newPosition = joint->getPosition();
- LLVector3 positionDelta = iter->second;
- newPosition = newPosition + (effective_weight * positionDelta) - (mLastWeight * positionDelta);
- joint->setPosition(newPosition);
- }
+LLPolyMorphData *clone_morph_param_direction(const LLPolyMorphData *src_data,
+ const LLVector3 &direction,
+ const std::string &name)
+{
+ LLPolyMorphData* cloned_morph_data = new LLPolyMorphData(*src_data);
+ cloned_morph_data->mName = name;
+ for (U32 v=0; v < cloned_morph_data->mNumIndices; v++)
+ {
+ cloned_morph_data->mCoords[v] = direction;
+ cloned_morph_data->mNormals[v] = LLVector3(0,0,0);
+ cloned_morph_data->mBinormals[v] = LLVector3(0,0,0);
+ }
+ return cloned_morph_data;
+}
- if (mLastWeight != mCurWeight && !mIsAnimating)
- {
- mAvatar->setSkeletonSerialNum(mAvatar->getSkeletonSerialNum() + 1);
- }
- mLastWeight = mCurWeight;
+LLPolyMorphData *clone_morph_param_cleavage(const LLPolyMorphData *src_data,
+ F32 scale,
+ const std::string &name)
+{
+ LLPolyMorphData* cloned_morph_data = new LLPolyMorphData(*src_data);
+ cloned_morph_data->mName = name;
+ for (U32 v=0; v < cloned_morph_data->mNumIndices; v++)
+ {
+ cloned_morph_data->mCoords[v] = src_data->mCoords[v]*scale;
+ cloned_morph_data->mNormals[v] = src_data->mNormals[v]*scale;
+ cloned_morph_data->mBinormals[v] = src_data->mBinormals[v]*scale;
+ if (cloned_morph_data->mCoords[v][1] < 0)
+ {
+ cloned_morph_data->mCoords[v][1] *= -1;
+ cloned_morph_data->mNormals[v][1] *= -1;
+ cloned_morph_data->mBinormals[v][1] *= -1;
+ }
+ }
+ return cloned_morph_data;
}
// End
diff --git a/indra/newview/llpolymesh.h b/indra/newview/llpolymesh.h
index 894cd307c4..ba2bf85570 100644
--- a/indra/newview/llpolymesh.h
+++ b/indra/newview/llpolymesh.h
@@ -217,15 +217,15 @@ public:
}
// Get coords
- const LLVector3 *getCoords() const{
+ const LLVector4 *getCoords() const{
return mCoords;
}
// non const version
- LLVector3 *getWritableCoords();
+ LLVector4 *getWritableCoords();
// Get normals
- const LLVector3 *getNormals() const{
+ const LLVector4 *getNormals() const{
return mNormals;
}
@@ -247,7 +247,7 @@ public:
}
// intermediate morphed normals and output normals
- LLVector3 *getWritableNormals();
+ LLVector4 *getWritableNormals();
LLVector3 *getScaledNormals();
LLVector3 *getWritableBinormals();
@@ -341,11 +341,11 @@ protected:
// Single array of floats for allocation / deletion
F32 *mVertexData;
// deformed vertices (resulting from application of morph targets)
- LLVector3 *mCoords;
+ LLVector4 *mCoords;
// deformed normals (resulting from application of morph targets)
LLVector3 *mScaledNormals;
// output normals (after normalization)
- LLVector3 *mNormals;
+ LLVector4 *mNormals;
// deformed binormals (resulting from application of morph targets)
LLVector3 *mScaledBinormals;
// output binormals (after normalization)
diff --git a/indra/newview/llpolymorph.cpp b/indra/newview/llpolymorph.cpp
index 0ffe1c635f..cefd7df3fe 100644
--- a/indra/newview/llpolymorph.cpp
+++ b/indra/newview/llpolymorph.cpp
@@ -59,6 +59,37 @@ LLPolyMorphData::LLPolyMorphData(const std::string& morph_name)
mMesh = NULL;
}
+LLPolyMorphData::LLPolyMorphData(const LLPolyMorphData &rhs) :
+ mName(rhs.mName),
+ mNumIndices(rhs.mNumIndices),
+ mTotalDistortion(rhs.mTotalDistortion),
+ mAvgDistortion(rhs.mAvgDistortion),
+ mMaxDistortion(rhs.mMaxDistortion),
+ mVertexIndices(NULL),
+ mCoords(NULL),
+ mNormals(NULL),
+ mBinormals(NULL),
+ mTexCoords(NULL)
+{
+ const S32 numVertices = mNumIndices;
+
+ mCoords = new LLVector3[numVertices];
+ mNormals = new LLVector3[numVertices];
+ mBinormals = new LLVector3[numVertices];
+ mTexCoords = new LLVector2[numVertices];
+ mVertexIndices = new U32[numVertices];
+
+ for (S32 v=0; v < numVertices; v++)
+ {
+ mCoords[v] = rhs.mCoords[v];
+ mNormals[v] = rhs.mNormals[v];
+ mBinormals[v] = rhs.mBinormals[v];
+ mTexCoords[v] = rhs.mTexCoords[v];
+ mVertexIndices[v] = rhs.mVertexIndices[v];
+ }
+}
+
+
//-----------------------------------------------------------------------------
// ~LLPolyMorphData()
//-----------------------------------------------------------------------------
@@ -287,10 +318,22 @@ BOOL LLPolyMorphTarget::setInfo(LLPolyMorphTargetInfo* info)
}
}
- mMorphData = mMesh->getMorphData(getInfo()->mMorphName);
+ std::string morph_param_name = getInfo()->mMorphName;
+
+ mMorphData = mMesh->getMorphData(morph_param_name);
+ if (!mMorphData)
+ {
+ const std::string driven_tag = "_Driven";
+ U32 pos = morph_param_name.find(driven_tag);
+ if (pos > 0)
+ {
+ morph_param_name = morph_param_name.substr(0,pos);
+ mMorphData = mMesh->getMorphData(morph_param_name);
+ }
+ }
if (!mMorphData)
{
- llwarns << "No morph target named " << getInfo()->mMorphName << " found in mesh." << llendl;
+ llwarns << "No morph target named " << morph_param_name << " found in mesh." << llendl;
return FALSE; // Continue, ignoring this tag
}
return TRUE;
@@ -447,6 +490,16 @@ void LLPolyMorphTarget::apply( ESex avatar_sex )
mLastSex = avatar_sex;
+ // Check for NaN condition (NaN is detected if a variable doesn't equal itself.
+ if (mCurWeight != mCurWeight)
+ {
+ mCurWeight = 0.0;
+ }
+ if (mLastWeight != mLastWeight)
+ {
+ mLastWeight = mCurWeight+.001;
+ }
+
// perform differential update of morph
F32 delta_weight = ( getSex() & avatar_sex ) ? (mCurWeight - mLastWeight) : (getDefaultWeight() - mLastWeight);
// store last weight
@@ -455,10 +508,10 @@ void LLPolyMorphTarget::apply( ESex avatar_sex )
if (delta_weight != 0.f)
{
llassert(!mMesh->isLOD());
- LLVector3 *coords = mMesh->getWritableCoords();
+ LLVector4 *coords = mMesh->getWritableCoords();
LLVector3 *scaled_normals = mMesh->getScaledNormals();
- LLVector3 *normals = mMesh->getWritableNormals();
+ LLVector4 *normals = mMesh->getWritableNormals();
LLVector3 *scaled_binormals = mMesh->getScaledBinormals();
LLVector3 *binormals = mMesh->getWritableBinormals();
@@ -478,7 +531,8 @@ void LLPolyMorphTarget::apply( ESex avatar_sex )
maskWeight = maskWeightArray[vert_index_morph];
}
- coords[vert_index_mesh] += mMorphData->mCoords[vert_index_morph] * delta_weight * maskWeight;
+ coords[vert_index_mesh] += LLVector4(mMorphData->mCoords[vert_index_morph] * delta_weight * maskWeight);
+
if (getInfo()->mIsClothingMorph && clothing_weights)
{
LLVector3 clothing_offset = mMorphData->mCoords[vert_index_morph] * delta_weight * maskWeight;
@@ -493,7 +547,7 @@ void LLPolyMorphTarget::apply( ESex avatar_sex )
scaled_normals[vert_index_mesh] += mMorphData->mNormals[vert_index_morph] * delta_weight * maskWeight * NORMAL_SOFTEN_FACTOR;
LLVector3 normalized_normal = scaled_normals[vert_index_mesh];
normalized_normal.normVec();
- normals[vert_index_mesh] = normalized_normal;
+ normals[vert_index_mesh] = LLVector4(normalized_normal);
// calculate new binormals
scaled_binormals[vert_index_mesh] += mMorphData->mBinormals[vert_index_morph] * delta_weight * maskWeight * NORMAL_SOFTEN_FACTOR;
@@ -542,7 +596,7 @@ void LLPolyMorphTarget::applyMask(U8 *maskTextureData, S32 width, S32 height, S3
if (maskWeights)
{
- LLVector3 *coords = mMesh->getWritableCoords();
+ LLVector4 *coords = mMesh->getWritableCoords();
LLVector3 *scaled_normals = mMesh->getScaledNormals();
LLVector3 *scaled_binormals = mMesh->getScaledBinormals();
LLVector2 *tex_coords = mMesh->getWritableTexCoords();
@@ -553,7 +607,7 @@ void LLPolyMorphTarget::applyMask(U8 *maskTextureData, S32 width, S32 height, S3
S32 out_vert = mMorphData->mVertexIndices[vert];
// remove effect of existing masked morph
- coords[out_vert] -= mMorphData->mCoords[vert] * lastMaskWeight;
+ coords[out_vert] -= LLVector4(mMorphData->mCoords[vert]) * lastMaskWeight;
scaled_normals[out_vert] -= mMorphData->mNormals[vert] * lastMaskWeight * NORMAL_SOFTEN_FACTOR;
scaled_binormals[out_vert] -= mMorphData->mBinormals[vert] * lastMaskWeight * NORMAL_SOFTEN_FACTOR;
tex_coords[out_vert] -= mMorphData->mTexCoords[vert] * lastMaskWeight;
diff --git a/indra/newview/llpolymorph.h b/indra/newview/llpolymorph.h
index bc111882b7..8a024f2e9e 100644
--- a/indra/newview/llpolymorph.h
+++ b/indra/newview/llpolymorph.h
@@ -46,6 +46,7 @@ class LLPolyMorphData
public:
LLPolyMorphData(const std::string& morph_name);
~LLPolyMorphData();
+ LLPolyMorphData(const LLPolyMorphData &rhs);
BOOL loadBinary(LLFILE* fp, LLPolyMeshSharedData *mesh);
const std::string& getName() { return mName; }
diff --git a/indra/newview/llpopupview.cpp b/indra/newview/llpopupview.cpp
index 499b6a8f5f..08829c1184 100644
--- a/indra/newview/llpopupview.cpp
+++ b/indra/newview/llpopupview.cpp
@@ -40,7 +40,8 @@ bool view_visible(LLView* viewp)
}
-LLPopupView::LLPopupView()
+LLPopupView::LLPopupView(const LLPopupView::Params& p)
+: LLPanel(p)
{
// register ourself as handler of UI popups
LLUI::setPopupFuncs(boost::bind(&LLPopupView::addPopup, this, _1), boost::bind(&LLPopupView::removePopup, this, _1), boost::bind(&LLPopupView::clearPopups, this));
@@ -82,7 +83,7 @@ void LLPopupView::draw()
LLUI::pushMatrix();
{
- LLUI::translate( (F32) screen_x, (F32) screen_y, 0.f);
+ LLUI::translate( (F32) screen_x, (F32) screen_y);
popup->draw();
}
LLUI::popMatrix();
@@ -137,64 +138,102 @@ BOOL LLPopupView::handleMouseEvent(boost::function<BOOL(LLView*, S32, S32)> func
BOOL LLPopupView::handleMouseDown(S32 x, S32 y, MASK mask)
{
- if (!handleMouseEvent(boost::bind(&LLMouseHandler::handleMouseDown, _1, _2, _3, mask), view_visible_and_enabled, x, y, true))
+ BOOL handled = handleMouseEvent(boost::bind(&LLMouseHandler::handleMouseDown, _1, _2, _3, mask), view_visible_and_enabled, x, y, true);
+ if (!handled)
{
- return FALSE;
+ handled = LLPanel::handleMouseDown(x, y, mask);
}
- return TRUE;
+ return handled;
}
BOOL LLPopupView::handleMouseUp(S32 x, S32 y, MASK mask)
{
- return handleMouseEvent(boost::bind(&LLMouseHandler::handleMouseUp, _1, _2, _3, mask), view_visible_and_enabled, x, y, false);
+ BOOL handled = handleMouseEvent(boost::bind(&LLMouseHandler::handleMouseUp, _1, _2, _3, mask), view_visible_and_enabled, x, y, false);
+ if (!handled)
+ {
+ handled = LLPanel::handleMouseUp(x, y, mask);
+ }
+ return handled;
}
BOOL LLPopupView::handleMiddleMouseDown(S32 x, S32 y, MASK mask)
{
- if (!handleMouseEvent(boost::bind(&LLMouseHandler::handleMiddleMouseDown, _1, _2, _3, mask), view_visible_and_enabled, x, y, true))
+ BOOL handled = handleMouseEvent(boost::bind(&LLMouseHandler::handleMiddleMouseDown, _1, _2, _3, mask), view_visible_and_enabled, x, y, true);
+ if (!handled)
{
- return FALSE;
+ handled = LLPanel::handleMiddleMouseDown(x, y, mask);
}
- return TRUE;
+ return handled;
}
BOOL LLPopupView::handleMiddleMouseUp(S32 x, S32 y, MASK mask)
{
- return handleMouseEvent(boost::bind(&LLMouseHandler::handleMiddleMouseUp, _1, _2, _3, mask), view_visible_and_enabled, x, y, false);
+ BOOL handled = handleMouseEvent(boost::bind(&LLMouseHandler::handleMiddleMouseUp, _1, _2, _3, mask), view_visible_and_enabled, x, y, false);
+ if (!handled)
+ {
+ handled = LLPanel::handleMiddleMouseUp(x, y, mask);
+ }
+ return handled;
}
BOOL LLPopupView::handleRightMouseDown(S32 x, S32 y, MASK mask)
{
- if (!handleMouseEvent(boost::bind(&LLMouseHandler::handleRightMouseDown, _1, _2, _3, mask), view_visible_and_enabled, x, y, true))
+ BOOL handled = handleMouseEvent(boost::bind(&LLMouseHandler::handleRightMouseDown, _1, _2, _3, mask), view_visible_and_enabled, x, y, true);
+ if (!handled)
{
- return FALSE;
+ handled = LLPanel::handleRightMouseDown(x, y, mask);
}
- return TRUE;
+ return handled;
}
BOOL LLPopupView::handleRightMouseUp(S32 x, S32 y, MASK mask)
{
- return handleMouseEvent(boost::bind(&LLMouseHandler::handleRightMouseUp, _1, _2, _3, mask), view_visible_and_enabled, x, y, false);
+ BOOL handled = handleMouseEvent(boost::bind(&LLMouseHandler::handleRightMouseUp, _1, _2, _3, mask), view_visible_and_enabled, x, y, false);
+ if (!handled)
+ {
+ handled = LLPanel::handleRightMouseUp(x, y, mask);
+ }
+ return handled;
}
BOOL LLPopupView::handleDoubleClick(S32 x, S32 y, MASK mask)
{
- return handleMouseEvent(boost::bind(&LLMouseHandler::handleDoubleClick, _1, _2, _3, mask), view_visible_and_enabled, x, y, false);
+ BOOL handled = handleMouseEvent(boost::bind(&LLMouseHandler::handleDoubleClick, _1, _2, _3, mask), view_visible_and_enabled, x, y, false);
+ if (!handled)
+ {
+ handled = LLPanel::handleDoubleClick(x, y, mask);
+ }
+ return handled;
}
BOOL LLPopupView::handleHover(S32 x, S32 y, MASK mask)
{
- return handleMouseEvent(boost::bind(&LLMouseHandler::handleHover, _1, _2, _3, mask), view_visible_and_enabled, x, y, false);
+ BOOL handled = handleMouseEvent(boost::bind(&LLMouseHandler::handleHover, _1, _2, _3, mask), view_visible_and_enabled, x, y, false);
+ if (!handled)
+ {
+ handled = LLPanel::handleHover(x, y, mask);
+ }
+ return handled;
}
BOOL LLPopupView::handleScrollWheel(S32 x, S32 y, S32 clicks)
{
- return handleMouseEvent(boost::bind(&LLMouseHandler::handleScrollWheel, _1, _2, _3, clicks), view_visible_and_enabled, x, y, false);
+ BOOL handled = handleMouseEvent(boost::bind(&LLMouseHandler::handleScrollWheel, _1, _2, _3, clicks), view_visible_and_enabled, x, y, false);
+ if (!handled)
+ {
+ handled = LLPanel::handleScrollWheel(x, y, clicks);
+ }
+ return handled;
}
BOOL LLPopupView::handleToolTip(S32 x, S32 y, MASK mask)
{
- return handleMouseEvent(boost::bind(&LLMouseHandler::handleToolTip, _1, _2, _3, mask), view_visible, x, y, false);
+ BOOL handled = handleMouseEvent(boost::bind(&LLMouseHandler::handleToolTip, _1, _2, _3, mask), view_visible, x, y, false);
+ if (!handled)
+ {
+ handled = LLPanel::handleToolTip(x, y, mask);
+ }
+ return handled;
}
void LLPopupView::addPopup(LLView* popup)
diff --git a/indra/newview/llpopupview.h b/indra/newview/llpopupview.h
index fec4afd79c..b378f61984 100644
--- a/indra/newview/llpopupview.h
+++ b/indra/newview/llpopupview.h
@@ -32,7 +32,7 @@
class LLPopupView : public LLPanel
{
public:
- LLPopupView();
+ LLPopupView(const Params& p = LLPanel::Params());
~LLPopupView();
/*virtual*/ void draw();
diff --git a/indra/newview/llpostcard.cpp b/indra/newview/llpostcard.cpp
new file mode 100644
index 0000000000..4f2d6da7e5
--- /dev/null
+++ b/indra/newview/llpostcard.cpp
@@ -0,0 +1,155 @@
+/**
+ * @file llpostcard.cpp
+ * @brief Sending postcards.
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llpostcard.h"
+
+#include "llvfile.h"
+#include "llvfs.h"
+#include "llviewerregion.h"
+
+#include "message.h"
+
+#include "llagent.h"
+#include "llassetuploadresponders.h"
+
+///////////////////////////////////////////////////////////////////////////////
+// misc
+
+static void postcard_upload_callback(const LLUUID& asset_id, void *user_data, S32 result, LLExtStat ext_status)
+{
+ LLSD* postcard_data = (LLSD*)user_data;
+
+ if (result)
+ {
+ // TODO: display the error messages in UI
+ llwarns << "Failed to send postcard: " << LLAssetStorage::getErrorString(result) << llendl;
+ LLPostCard::reportPostResult(false);
+ }
+ else
+ {
+ // only create the postcard once the upload succeeds
+
+ // request the postcard
+ const LLSD& data = *postcard_data;
+ LLMessageSystem* msg = gMessageSystem;
+ msg->newMessage("SendPostcard");
+ msg->nextBlock("AgentData");
+ msg->addUUID("AgentID", gAgent.getID());
+ msg->addUUID("SessionID", gAgent.getSessionID());
+ msg->addUUID("AssetID", data["asset-id"].asUUID());
+ msg->addVector3d("PosGlobal", LLVector3d(data["pos-global"]));
+ msg->addString("To", data["to"]);
+ msg->addString("From", data["from"]);
+ msg->addString("Name", data["name"]);
+ msg->addString("Subject", data["subject"]);
+ msg->addString("Msg", data["msg"]);
+ msg->addBOOL("AllowPublish", FALSE);
+ msg->addBOOL("MaturePublish", FALSE);
+ gAgent.sendReliableMessage();
+
+ LLPostCard::reportPostResult(true);
+ }
+
+ delete postcard_data;
+}
+
+
+///////////////////////////////////////////////////////////////////////////////
+// LLPostcardSendResponder
+
+class LLPostcardSendResponder : public LLAssetUploadResponder
+{
+ LOG_CLASS(LLPostcardSendResponder);
+
+public:
+ LLPostcardSendResponder(const LLSD &post_data,
+ const LLUUID& vfile_id,
+ LLAssetType::EType asset_type):
+ LLAssetUploadResponder(post_data, vfile_id, asset_type)
+ {
+ }
+
+ /*virtual*/ void uploadComplete(const LLSD& content)
+ {
+ llinfos << "Postcard sent" << llendl;
+ LL_DEBUGS("Snapshots") << "content: " << content << llendl;
+ LLPostCard::reportPostResult(true);
+ }
+
+ /*virtual*/ void uploadFailure(const LLSD& content)
+ {
+ llwarns << "Sending postcard failed: " << content << llendl;
+ LLPostCard::reportPostResult(false);
+ }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// LLPostCard
+
+LLPostCard::result_callback_t LLPostCard::mResultCallback;
+
+// static
+void LLPostCard::send(LLPointer<LLImageFormatted> image, const LLSD& postcard_data)
+{
+ LLTransactionID transaction_id;
+ LLAssetID asset_id;
+
+ transaction_id.generate();
+ asset_id = transaction_id.makeAssetID(gAgent.getSecureSessionID());
+ LLVFile::writeFile(image->getData(), image->getDataSize(), gVFS, asset_id, LLAssetType::AT_IMAGE_JPEG);
+
+ // upload the image
+ std::string url = gAgent.getRegion()->getCapability("SendPostcard");
+ if (!url.empty())
+ {
+ llinfos << "Sending postcard via capability" << llendl;
+ // the capability already encodes: agent ID, region ID
+ LL_DEBUGS("Snapshots") << "url: " << url << llendl;
+ LL_DEBUGS("Snapshots") << "body: " << postcard_data << llendl;
+ LL_DEBUGS("Snapshots") << "data size: " << image->getDataSize() << llendl;
+ LLHTTPClient::post(url, postcard_data,
+ new LLPostcardSendResponder(postcard_data, asset_id, LLAssetType::AT_IMAGE_JPEG));
+ }
+ else
+ {
+ llinfos << "Sending postcard" << llendl;
+ LLSD* data = new LLSD(postcard_data);
+ (*data)["asset-id"] = asset_id;
+ gAssetStorage->storeAssetData(transaction_id, LLAssetType::AT_IMAGE_JPEG,
+ &postcard_upload_callback, (void *)data, FALSE);
+ }
+}
+
+// static
+void LLPostCard::reportPostResult(bool ok)
+{
+ if (mResultCallback)
+ {
+ mResultCallback(ok);
+ }
+}
diff --git a/indra/newview/llpostcard.h b/indra/newview/llpostcard.h
new file mode 100644
index 0000000000..0eb118b906
--- /dev/null
+++ b/indra/newview/llpostcard.h
@@ -0,0 +1,48 @@
+/**
+ * @file llpostcard.h
+ * @brief Sending postcards.
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLPOSTCARD_H
+#define LL_LLPOSTCARD_H
+
+#include "llimage.h"
+#include "lluuid.h"
+
+class LLPostCard
+{
+ LOG_CLASS(LLPostCard);
+
+public:
+ typedef boost::function<void(bool ok)> result_callback_t;
+
+ static void send(LLPointer<LLImageFormatted> image, const LLSD& postcard_data);
+ static void setPostResultCallback(result_callback_t cb) { mResultCallback = cb; }
+ static void reportPostResult(bool ok);
+
+private:
+ static result_callback_t mResultCallback;
+};
+
+#endif // LL_LLPOSTCARD_H
diff --git a/indra/newview/llpreview.cpp b/indra/newview/llpreview.cpp
index 69542764d2..18626e3273 100644
--- a/indra/newview/llpreview.cpp
+++ b/indra/newview/llpreview.cpp
@@ -363,8 +363,10 @@ void LLPreview::onBtnCopyToInv(void* userdata)
// Copy to inventory
if (self->mNotecardInventoryID.notNull())
{
- copy_inventory_from_notecard(self->mNotecardObjectID,
- self->mNotecardInventoryID, item);
+ copy_inventory_from_notecard(LLUUID::null,
+ self->mNotecardObjectID,
+ self->mNotecardInventoryID,
+ item);
}
else
{
@@ -444,22 +446,20 @@ void LLPreview::handleReshape(const LLRect& new_rect, bool by_user)
LLMultiPreview::LLMultiPreview()
: LLMultiFloater(LLSD())
{
- // *TODO: There should be a .xml file for this
- const LLRect& nextrect = LLFloaterReg::getFloaterRect("preview"); // place where the next preview should show up
- if (nextrect.getWidth() > 0)
- {
- setRect(nextrect);
- }
- else
+ // start with a rect in the top-left corner ; will get resized
+ LLRect rect;
+ rect.setLeftTopAndSize(0, gViewerWindow->getWindowHeightScaled(), 200, 400);
+ setRect(rect);
+
+ LLFloater* last_floater = LLFloaterReg::getLastFloaterInGroup("preview");
+ if (last_floater)
{
- // start with a rect in the top-left corner ; will get resized
- LLRect rect;
- rect.setLeftTopAndSize(0, gViewerWindow->getWindowHeightScaled(), 200, 200);
- setRect(rect);
+ stackWith(*last_floater);
}
setTitle(LLTrans::getString("MultiPreviewTitle"));
buildTabContainer();
setCanResize(TRUE);
+ mAutoResize = FALSE;
}
void LLMultiPreview::onOpen(const LLSD& key)
diff --git a/indra/newview/llpreview.h b/indra/newview/llpreview.h
index 896e17c3c3..759430c3a5 100644
--- a/indra/newview/llpreview.h
+++ b/indra/newview/llpreview.h
@@ -32,6 +32,7 @@
#include "llpointer.h"
#include "lluuid.h"
#include "llinventoryobserver.h"
+#include "llextendedstatus.h"
#include <map>
class LLInventoryItem;
diff --git a/indra/newview/llpreviewanim.cpp b/indra/newview/llpreviewanim.cpp
index 8e8b530e13..35ac0537a3 100644
--- a/indra/newview/llpreviewanim.cpp
+++ b/indra/newview/llpreviewanim.cpp
@@ -43,19 +43,7 @@ extern LLAgent gAgent;
LLPreviewAnim::LLPreviewAnim(const LLSD& key)
: LLPreview( key )
{
-}
-
-// static
-void LLPreviewAnim::endAnimCallback( void *userdata )
-{
- LLHandle<LLFloater>* handlep = ((LLHandle<LLFloater>*)userdata);
- LLFloater* self = handlep->get();
- delete handlep; // done with the handle
- if (self)
- {
- self->getChild<LLUICtrl>("Anim play btn")->setValue(FALSE);
- self->getChild<LLUICtrl>("Anim audition btn")->setValue(FALSE);
- }
+ mCommitCallbackRegistrar.add("PreviewAnim.Play", boost::bind(&LLPreviewAnim::play, this, _2));
}
// virtual
@@ -68,106 +56,115 @@ BOOL LLPreviewAnim::postBuild()
getChild<LLUICtrl>("desc")->setValue(item->getDescription());
}
- childSetAction("Anim play btn",playAnim, this);
- childSetAction("Anim audition btn",auditionAnim, this);
-
childSetCommitCallback("desc", LLPreview::onText, this);
getChild<LLLineEditor>("desc")->setPrevalidate(&LLTextValidate::validateASCIIPrintableNoPipe);
-
+
return LLPreview::postBuild();
}
-void LLPreviewAnim::activate(e_activation_type type)
+// static
+// llinventorybridge also calls into here
+void LLPreviewAnim::play(const LLSD& param)
{
- switch ( type )
+ const LLInventoryItem *item = getItem();
+
+ if(item)
{
- case PLAY:
+ LLUUID itemID=item->getAssetUUID();
+
+ std::string btn_name = param.asString();
+ LLButton* btn_inuse;
+ LLButton* btn_other;
+
+ if ("Inworld" == btn_name)
{
- playAnim( (void *) this );
- break;
+ btn_inuse = getChild<LLButton>("Inworld");
+ btn_other = getChild<LLButton>("Locally");
}
- case AUDITION:
+ else if ("Locally" == btn_name)
{
- auditionAnim( (void *) this );
- break;
+ btn_inuse = getChild<LLButton>("Locally");
+ btn_other = getChild<LLButton>("Inworld");
}
- default:
+ else
{
- //do nothing
+ return;
}
- }
-}
-
-// static
-void LLPreviewAnim::playAnim( void *userdata )
-{
- LLPreviewAnim* self = (LLPreviewAnim*) userdata;
- const LLInventoryItem *item = self->getItem();
- if(item)
- {
- LLUUID itemID=item->getAssetUUID();
+ if (btn_inuse)
+ {
+ btn_inuse->toggleState();
+ }
- LLButton* btn = self->getChild<LLButton>("Anim play btn");
- if (btn)
+ if (btn_other)
{
- btn->toggleState();
+ btn_other->setEnabled(false);
}
- if (self->getChild<LLUICtrl>("Anim play btn")->getValue().asBoolean() )
+ if (getChild<LLUICtrl>(btn_name)->getValue().asBoolean() )
{
- self->mPauseRequest = NULL;
- gAgent.sendAnimationRequest(itemID, ANIM_REQUEST_START);
+ if("Inworld" == btn_name)
+ {
+ gAgent.sendAnimationRequest(itemID, ANIM_REQUEST_START);
+ }
+ else
+ {
+ gAgentAvatarp->startMotion(item->getAssetUUID());
+ }
+
LLMotion* motion = gAgentAvatarp->findMotion(itemID);
if (motion)
{
- motion->setDeactivateCallback(&endAnimCallback, (void *)(new LLHandle<LLFloater>(self->getHandle())));
+ mItemID = itemID;
+ mDidStart = false;
}
}
else
{
gAgentAvatarp->stopMotion(itemID);
gAgent.sendAnimationRequest(itemID, ANIM_REQUEST_STOP);
+
+ if (btn_other)
+ {
+ btn_other->setEnabled(true);
+ }
}
}
}
-// static
-void LLPreviewAnim::auditionAnim( void *userdata )
+// virtual
+void LLPreviewAnim::draw()
{
- LLPreviewAnim* self = (LLPreviewAnim*) userdata;
- const LLInventoryItem *item = self->getItem();
-
- if(item)
+ LLPreview::draw();
+ if (!this->mItemID.isNull())
{
- LLUUID itemID=item->getAssetUUID();
-
- LLButton* btn = self->getChild<LLButton>("Anim audition btn");
- if (btn)
- {
- btn->toggleState();
- }
-
- if (self->getChild<LLUICtrl>("Anim audition btn")->getValue().asBoolean() )
+ LLMotion* motion = gAgentAvatarp->findMotion(this->mItemID);
+ if (motion)
{
- self->mPauseRequest = NULL;
- gAgentAvatarp->startMotion(item->getAssetUUID());
- LLMotion* motion = gAgentAvatarp->findMotion(itemID);
-
- if (motion)
+ if (motion->isStopped() && this->mDidStart)
{
- motion->setDeactivateCallback(&endAnimCallback, (void *)(new LLHandle<LLFloater>(self->getHandle())));
+ cleanup();
+ }
+ if(gAgentAvatarp->isMotionActive(this->mItemID) && !this->mDidStart)
+ {
+ this->mDidStart = true;
}
- }
- else
- {
- gAgentAvatarp->stopMotion(itemID);
- gAgent.sendAnimationRequest(itemID, ANIM_REQUEST_STOP);
}
}
}
// virtual
+void LLPreviewAnim::cleanup()
+{
+ this->mItemID = LLUUID::null;
+ this->mDidStart = false;
+ getChild<LLUICtrl>("Inworld")->setValue(FALSE);
+ getChild<LLUICtrl>("Locally")->setValue(FALSE);
+ getChild<LLUICtrl>("Inworld")->setEnabled(true);
+ getChild<LLUICtrl>("Locally")->setEnabled(true);
+}
+
+// virtual
void LLPreviewAnim::onClose(bool app_quitting)
{
const LLInventoryItem *item = getItem();
@@ -176,12 +173,5 @@ void LLPreviewAnim::onClose(bool app_quitting)
{
gAgentAvatarp->stopMotion(item->getAssetUUID());
gAgent.sendAnimationRequest(item->getAssetUUID(), ANIM_REQUEST_STOP);
- LLMotion* motion = gAgentAvatarp->findMotion(item->getAssetUUID());
-
- if (motion)
- {
- // *TODO: minor memory leak here, user data is never deleted (Use real callbacks)
- motion->setDeactivateCallback(NULL, (void *)NULL);
- }
}
}
diff --git a/indra/newview/llpreviewanim.h b/indra/newview/llpreviewanim.h
index 32e07ee33a..8eaed6ca1f 100644
--- a/indra/newview/llpreviewanim.h
+++ b/indra/newview/llpreviewanim.h
@@ -33,24 +33,18 @@
class LLPreviewAnim : public LLPreview
{
public:
- enum e_activation_type { NONE = 0, PLAY = 1, AUDITION = 2 };
- LLPreviewAnim(const LLSD& key);
- static void playAnim( void* userdata );
- static void auditionAnim( void* userdata );
- static void endAnimCallback( void *userdata );
+ LLPreviewAnim(const LLSD& key);
/*virtual*/ BOOL postBuild();
/*virtual*/ void onClose(bool app_quitting);
- void activate(e_activation_type type);
+ void draw();
+ void cleanup();
+ void play(const LLSD& param);
protected:
- LLAnimPauseRequest mPauseRequest;
- LLUUID mItemID;
- std::string mTitle;
- LLUUID mObjectID;
- LLButton* mPlayBtn;
- LLButton* mAuditionBtn;
+ LLUUID mItemID;
+ bool mDidStart;
};
-#endif // LL_LLPREVIEWSOUND_H
+#endif // LL_LLPREVIEWANIM_H
diff --git a/indra/newview/llpreviewgesture.cpp b/indra/newview/llpreviewgesture.cpp
index 16284d1a7e..f47928b131 100644
--- a/indra/newview/llpreviewgesture.cpp
+++ b/indra/newview/llpreviewgesture.cpp
@@ -34,6 +34,7 @@
#include "llassetuploadresponders.h"
#include "llcheckboxctrl.h"
#include "llcombobox.h"
+#include "lldatapacker.h"
#include "lldelayedgestureerror.h"
#include "llfloaterreg.h"
#include "llgesturemgr.h"
@@ -41,6 +42,7 @@
#include "llinventoryfunctions.h"
#include "llinventorymodel.h"
#include "llinventorymodelbackgroundfetch.h"
+#include "llkeyboard.h"
#include "llmultigesture.h"
#include "llnotificationsutil.h"
#include "llradiogroup.h"
@@ -1597,7 +1599,7 @@ std::string LLPreviewGesture::getLabel(std::vector<std::string> labels)
if(v_labels[0]=="Chat")
{
- result=LLTrans::getString("Chat");
+ result=LLTrans::getString("Chat Message");
}
else if(v_labels[0]=="Sound")
{
diff --git a/indra/newview/llpreviewnotecard.cpp b/indra/newview/llpreviewnotecard.cpp
index 9f3ee6ac5d..3a9360fd23 100644
--- a/indra/newview/llpreviewnotecard.cpp
+++ b/indra/newview/llpreviewnotecard.cpp
@@ -29,7 +29,6 @@
#include "llpreviewnotecard.h"
#include "llinventory.h"
-#include "llinventoryfunctions.h" // for change_item_parent()
#include "llagent.h"
#include "llassetuploadresponders.h"
@@ -401,15 +400,14 @@ struct LLSaveNotecardInfo
bool LLPreviewNotecard::saveIfNeeded(LLInventoryItem* copyitem)
{
- if(!gAssetStorage)
+ LLViewerTextEditor* editor = getChild<LLViewerTextEditor>("Notecard Editor");
+
+ if(!editor)
{
- llwarns << "Not connected to an asset storage system." << llendl;
+ llwarns << "Cannot get handle to the notecard editor." << llendl;
return false;
}
-
- LLViewerTextEditor* editor = getChild<LLViewerTextEditor>("Notecard Editor");
-
if(!editor->isPristine())
{
// We need to update the asset information
@@ -436,8 +434,15 @@ bool LLPreviewNotecard::saveIfNeeded(LLInventoryItem* copyitem)
// save it out to database
if (item)
{
- std::string agent_url = gAgent.getRegion()->getCapability("UpdateNotecardAgentInventory");
- std::string task_url = gAgent.getRegion()->getCapability("UpdateNotecardTaskInventory");
+ const LLViewerRegion* region = gAgent.getRegion();
+ if (!region)
+ {
+ llwarns << "Not connected to a region, cannot save notecard." << llendl;
+ return false;
+ }
+ std::string agent_url = region->getCapability("UpdateNotecardAgentInventory");
+ std::string task_url = region->getCapability("UpdateNotecardTaskInventory");
+
if (mObjectUUID.isNull() && !agent_url.empty())
{
// Saving into agent inventory
@@ -472,6 +477,11 @@ bool LLPreviewNotecard::saveIfNeeded(LLInventoryItem* copyitem)
(void*)info,
FALSE);
}
+ else // !gAssetStorage
+ {
+ llwarns << "Not connected to an asset storage system." << llendl;
+ return false;
+ }
}
}
return true;
@@ -483,7 +493,7 @@ void LLPreviewNotecard::deleteNotecard()
if (item != NULL)
{
const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
- change_item_parent(&gInventory, item, trash_id, FALSE);
+ gInventory.changeItemParent(item, trash_id, FALSE);
}
closeFloater();
diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp
index 330e809c53..88727bf59b 100644
--- a/indra/newview/llpreviewscript.cpp
+++ b/indra/newview/llpreviewscript.cpp
@@ -35,6 +35,7 @@
#include "llcombobox.h"
#include "lldir.h"
#include "llexternaleditor.h"
+#include "llfilepicker.h"
#include "llfloaterreg.h"
#include "llinventorydefines.h"
#include "llinventorymodel.h"
@@ -123,7 +124,9 @@ static bool have_script_upload_cap(LLUUID& object_id)
class LLLiveLSLFile : public LLLiveFile
{
public:
- LLLiveLSLFile(std::string file_path, LLLiveLSLEditor* parent);
+ typedef boost::function<bool (const std::string& filename)> change_callback_t;
+
+ LLLiveLSLFile(std::string file_path, change_callback_t change_cb);
~LLLiveLSLFile();
void ignoreNextUpdate() { mIgnoreNextUpdate = true; }
@@ -131,15 +134,16 @@ public:
protected:
/*virtual*/ bool loadFile();
- LLLiveLSLEditor* mParent;
+ change_callback_t mOnChangeCallback;
bool mIgnoreNextUpdate;
};
-LLLiveLSLFile::LLLiveLSLFile(std::string file_path, LLLiveLSLEditor* parent)
-: mParent(parent)
+LLLiveLSLFile::LLLiveLSLFile(std::string file_path, change_callback_t change_cb)
+: mOnChangeCallback(change_cb)
, mIgnoreNextUpdate(false)
, LLLiveFile(file_path, 1.0)
{
+ llassert(mOnChangeCallback);
}
LLLiveLSLFile::~LLLiveLSLFile()
@@ -155,14 +159,7 @@ bool LLLiveLSLFile::loadFile()
return true;
}
- if (!mParent->loadScriptText(filename()))
- {
- return false;
- }
-
- // Disable sync to avoid recursive load->save->load calls.
- mParent->saveIfNeeded(false);
- return true;
+ return mOnChangeCallback(filename());
}
/// ---------------------------------------------------------------------------
@@ -327,11 +324,11 @@ struct LLSECKeywordCompare
};
LLScriptEdCore::LLScriptEdCore(
+ LLScriptEdContainer* container,
const std::string& sample,
const LLHandle<LLFloater>& floater_handle,
void (*load_callback)(void*),
void (*save_callback)(void*, BOOL),
- void (*edit_callback)(void*),
void (*search_replace_callback) (void* userdata),
void* userdata,
S32 bottom_pad)
@@ -341,19 +338,21 @@ LLScriptEdCore::LLScriptEdCore(
mEditor( NULL ),
mLoadCallback( load_callback ),
mSaveCallback( save_callback ),
- mEditCallback( edit_callback ),
mSearchReplaceCallback( search_replace_callback ),
mUserdata( userdata ),
mForceClose( FALSE ),
mLastHelpToken(NULL),
mLiveHelpHistorySize(0),
mEnableSave(FALSE),
+ mLiveFile(NULL),
+ mContainer(container),
mHasScriptData(FALSE)
{
setFollowsAll();
setBorderVisible(FALSE);
setXMLFilename("panel_script_ed.xml");
+ llassert_always(mContainer != NULL);
}
LLScriptEdCore::~LLScriptEdCore()
@@ -367,6 +366,8 @@ LLScriptEdCore::~LLScriptEdCore()
script_search->closeFloater();
delete script_search;
}
+
+ delete mLiveFile;
}
BOOL LLScriptEdCore::postBuild()
@@ -381,7 +382,7 @@ BOOL LLScriptEdCore::postBuild()
childSetCommitCallback("lsl errors", &LLScriptEdCore::onErrorList, this);
childSetAction("Save_btn", boost::bind(&LLScriptEdCore::doSave,this,FALSE));
- childSetAction("Edit_btn", boost::bind(&LLScriptEdCore::onEditButtonClick, this));
+ childSetAction("Edit_btn", boost::bind(&LLScriptEdCore::openInExternalEditor, this));
initMenu();
@@ -503,6 +504,14 @@ void LLScriptEdCore::initMenu()
menuItem = getChild<LLMenuItemCallGL>("Keyword Help...");
menuItem->setClickCallback(boost::bind(&LLScriptEdCore::onBtnDynamicHelp, this));
+
+ menuItem = getChild<LLMenuItemCallGL>("LoadFromFile");
+ menuItem->setClickCallback(boost::bind(&LLScriptEdCore::onBtnLoadFromFile, this));
+ menuItem->setEnableCallback(boost::bind(&LLScriptEdCore::enableLoadFromFileMenu, this));
+
+ menuItem = getChild<LLMenuItemCallGL>("SaveToFile");
+ menuItem->setClickCallback(boost::bind(&LLScriptEdCore::onBtnSaveToFile, this));
+ menuItem->setEnableCallback(boost::bind(&LLScriptEdCore::enableSaveToFileMenu, this));
}
void LLScriptEdCore::setScriptText(const std::string& text, BOOL is_valid)
@@ -514,6 +523,79 @@ void LLScriptEdCore::setScriptText(const std::string& text, BOOL is_valid)
}
}
+bool LLScriptEdCore::loadScriptText(const std::string& filename)
+{
+ if (filename.empty())
+ {
+ llwarns << "Empty file name" << llendl;
+ return false;
+ }
+
+ LLFILE* file = LLFile::fopen(filename, "rb"); /*Flawfinder: ignore*/
+ if (!file)
+ {
+ llwarns << "Error opening " << filename << llendl;
+ return false;
+ }
+
+ // read in the whole file
+ fseek(file, 0L, SEEK_END);
+ size_t file_length = (size_t) ftell(file);
+ fseek(file, 0L, SEEK_SET);
+ char* buffer = new char[file_length+1];
+ size_t nread = fread(buffer, 1, file_length, file);
+ if (nread < file_length)
+ {
+ llwarns << "Short read" << llendl;
+ }
+ buffer[nread] = '\0';
+ fclose(file);
+
+ mEditor->setText(LLStringExplicit(buffer));
+ delete[] buffer;
+
+ return true;
+}
+
+bool LLScriptEdCore::writeToFile(const std::string& filename)
+{
+ LLFILE* fp = LLFile::fopen(filename, "wb");
+ if (!fp)
+ {
+ llwarns << "Unable to write to " << filename << llendl;
+
+ LLSD row;
+ row["columns"][0]["value"] = "Error writing to local file. Is your hard drive full?";
+ row["columns"][0]["font"] = "SANSSERIF_SMALL";
+ mErrorList->addElement(row);
+ return false;
+ }
+
+ std::string utf8text = mEditor->getText();
+
+ // Special case for a completely empty script - stuff in one space so it can store properly. See SL-46889
+ if (utf8text.size() == 0)
+ {
+ utf8text = " ";
+ }
+
+ fputs(utf8text.c_str(), fp);
+ fclose(fp);
+ return true;
+}
+
+void LLScriptEdCore::sync()
+{
+ // Sync with external editor.
+ std::string tmp_file = mContainer->getTmpFileName();
+ llstat s;
+ if (LLFile::stat(tmp_file, &s) == 0) // file exists
+ {
+ if (mLiveFile) mLiveFile->ignoreNextUpdate();
+ writeToFile(tmp_file);
+ }
+}
+
bool LLScriptEdCore::hasChanged()
{
if (!mEditor) return false;
@@ -690,6 +772,12 @@ BOOL LLScriptEdCore::canClose()
}
}
+void LLScriptEdCore::setEnableEditing(bool enable)
+{
+ mEditor->setEnabled(enable);
+ getChildView("Edit_btn")->setEnabled(enable);
+}
+
bool LLScriptEdCore::handleSaveChangesDialog(const LLSD& notification, const LLSD& response )
{
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
@@ -862,11 +950,46 @@ void LLScriptEdCore::doSave( BOOL close_after_save )
}
}
-void LLScriptEdCore::onEditButtonClick()
+void LLScriptEdCore::openInExternalEditor()
{
- if (mEditCallback)
+ delete mLiveFile; // deletes file
+
+ // Save the script to a temporary file.
+ std::string filename = mContainer->getTmpFileName();
+ writeToFile(filename);
+
+ // Start watching file changes.
+ mLiveFile = new LLLiveLSLFile(filename, boost::bind(&LLScriptEdContainer::onExternalChange, mContainer, _1));
+ mLiveFile->addToEventTimer();
+
+ // Open it in external editor.
{
- mEditCallback(mUserdata);
+ LLExternalEditor ed;
+ LLExternalEditor::EErrorCode status;
+ std::string msg;
+
+ status = ed.setCommand("LL_SCRIPT_EDITOR");
+ if (status != LLExternalEditor::EC_SUCCESS)
+ {
+ if (status == LLExternalEditor::EC_NOT_SPECIFIED) // Use custom message for this error.
+ {
+ msg = getString("external_editor_not_set");
+ }
+ else
+ {
+ msg = LLExternalEditor::getErrorMessage(status);
+ }
+
+ LLNotificationsUtil::add("GenericAlert", LLSD().with("MESSAGE", msg));
+ return;
+ }
+
+ status = ed.run(filename);
+ if (status != LLExternalEditor::EC_SUCCESS)
+ {
+ msg = LLExternalEditor::getErrorMessage(status);
+ LLNotificationsUtil::add("GenericAlert", LLSD().with("MESSAGE", msg));
+ }
}
}
@@ -982,6 +1105,125 @@ BOOL LLScriptEdCore::handleKeyHere(KEY key, MASK mask)
return FALSE;
}
+void LLScriptEdCore::onBtnLoadFromFile( void* data )
+{
+ LLScriptEdCore* self = (LLScriptEdCore*) data;
+
+ // TODO Maybe add a dialogue warning here if the current file has unsaved changes.
+ LLFilePicker& file_picker = LLFilePicker::instance();
+ if( !file_picker.getOpenFile( LLFilePicker::FFLOAD_SCRIPT ) )
+ {
+ //File picking cancelled by user, so nothing to do.
+ return;
+ }
+
+ std::string filename = file_picker.getFirstFile();
+
+ std::ifstream fin(filename.c_str());
+
+ std::string line;
+ std::string text;
+ std::string linetotal;
+ while (!fin.eof())
+ {
+ getline(fin,line);
+ text += line;
+ if (!fin.eof())
+ {
+ text += "\n";
+ }
+ }
+ fin.close();
+
+ // Only replace the script if there is something to replace with.
+ if (text.length() > 0)
+ {
+ self->mEditor->selectAll();
+ LLWString script(utf8str_to_wstring(text));
+ self->mEditor->insertText(script);
+ }
+}
+
+void LLScriptEdCore::onBtnSaveToFile( void* userdata )
+{
+
+ LLViewerStats::getInstance()->incStat( LLViewerStats::ST_LSL_SAVE_COUNT );
+
+ LLScriptEdCore* self = (LLScriptEdCore*) userdata;
+
+ if( self->mSaveCallback )
+ {
+ LLFilePicker& file_picker = LLFilePicker::instance();
+ if( file_picker.getSaveFile( LLFilePicker::FFSAVE_SCRIPT ) )
+ {
+ std::string filename = file_picker.getFirstFile();
+ std::string scriptText=self->mEditor->getText();
+ std::ofstream fout(filename.c_str());
+ fout<<(scriptText);
+ fout.close();
+ self->mSaveCallback( self->mUserdata, FALSE );
+ }
+ }
+}
+
+bool LLScriptEdCore::canLoadOrSaveToFile( void* userdata )
+{
+ LLScriptEdCore* self = (LLScriptEdCore*) userdata;
+ return self->mEditor->canLoadOrSaveToFile();
+}
+
+// static
+bool LLScriptEdCore::enableSaveToFileMenu(void* userdata)
+{
+ LLScriptEdCore* self = (LLScriptEdCore*)userdata;
+ if (!self || !self->mEditor) return FALSE;
+ return self->mEditor->canLoadOrSaveToFile();
+}
+
+// static
+bool LLScriptEdCore::enableLoadFromFileMenu(void* userdata)
+{
+ LLScriptEdCore* self = (LLScriptEdCore*)userdata;
+ return (self && self->mEditor) ? self->mEditor->canLoadOrSaveToFile() : FALSE;
+}
+
+/// ---------------------------------------------------------------------------
+/// LLScriptEdContainer
+/// ---------------------------------------------------------------------------
+
+LLScriptEdContainer::LLScriptEdContainer(const LLSD& key)
+: LLPreview(key)
+, mScriptEd(NULL)
+{
+}
+
+std::string LLScriptEdContainer::getTmpFileName()
+{
+ // Take script inventory item id (within the object inventory)
+ // to consideration so that it's possible to edit multiple scripts
+ // in the same object inventory simultaneously (STORM-781).
+ std::string script_id = mObjectUUID.asString() + "_" + mItemUUID.asString();
+
+ // Use MD5 sum to make the file name shorter and not exceed maximum path length.
+ char script_id_hash_str[33]; /* Flawfinder: ignore */
+ LLMD5 script_id_hash((const U8 *)script_id.c_str());
+ script_id_hash.hex_digest(script_id_hash_str);
+
+ return std::string(LLFile::tmpdir()) + "sl_script_" + script_id_hash_str + ".lsl";
+}
+
+bool LLScriptEdContainer::onExternalChange(const std::string& filename)
+{
+ if (!mScriptEd->loadScriptText(filename))
+ {
+ return false;
+ }
+
+ // Disable sync to avoid recursive load->save->load calls.
+ saveIfNeeded(false);
+ return true;
+}
+
/// ---------------------------------------------------------------------------
/// LLPreviewLSL
/// ---------------------------------------------------------------------------
@@ -1005,11 +1247,11 @@ void* LLPreviewLSL::createScriptEdPanel(void* userdata)
LLPreviewLSL *self = (LLPreviewLSL*)userdata;
self->mScriptEd = new LLScriptEdCore(
+ self,
HELLO_LSL,
self->getHandle(),
LLPreviewLSL::onLoad,
LLPreviewLSL::onSave,
- NULL, // no edit callback
LLPreviewLSL::onSearchReplace,
self,
0);
@@ -1019,7 +1261,7 @@ void* LLPreviewLSL::createScriptEdPanel(void* userdata)
LLPreviewLSL::LLPreviewLSL(const LLSD& key )
- : LLPreview( key ),
+: LLScriptEdContainer(key),
mPendingUploads(0)
{
mFactoryMap["script panel"] = LLCallbackMap(LLPreviewLSL::createScriptEdPanel, this);
@@ -1110,7 +1352,6 @@ void LLPreviewLSL::loadAsset()
{
mScriptEd->setScriptText(mScriptEd->getString("can_not_view"), FALSE);
mScriptEd->mEditor->makePristine();
- mScriptEd->mEditor->setEnabled(FALSE);
mScriptEd->mFunctions->setEnabled(FALSE);
mAssetStatus = PREVIEW_ASSET_LOADED;
}
@@ -1120,6 +1361,7 @@ void LLPreviewLSL::loadAsset()
else
{
mScriptEd->setScriptText(std::string(HELLO_LSL), TRUE);
+ mScriptEd->setEnableEditing(TRUE);
mAssetStatus = PREVIEW_ASSET_LOADED;
}
}
@@ -1166,7 +1408,7 @@ void LLPreviewLSL::onSave(void* userdata, BOOL close_after_save)
// Save needs to compile the text in the buffer. If the compile
// succeeds, then save both assets out to the database. If the compile
// fails, go ahead and save the text anyway.
-void LLPreviewLSL::saveIfNeeded()
+void LLPreviewLSL::saveIfNeeded(bool sync /*= true*/)
{
// llinfos << "LLPreviewLSL::saveIfNeeded()" << llendl;
if(!mScriptEd->hasChanged())
@@ -1185,23 +1427,13 @@ void LLPreviewLSL::saveIfNeeded()
std::string filepath = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,asset_id.asString());
std::string filename = filepath + ".lsl";
- LLFILE* fp = LLFile::fopen(filename, "wb");
- if(!fp)
- {
- llwarns << "Unable to write to " << filename << llendl;
+ mScriptEd->writeToFile(filename);
- LLSD row;
- row["columns"][0]["value"] = "Error writing to local file. Is your hard drive full?";
- row["columns"][0]["font"] = "SANSSERIF_SMALL";
- mScriptEd->mErrorList->addElement(row);
- return;
+ if (sync)
+ {
+ mScriptEd->sync();
}
- std::string utf8text = mScriptEd->mEditor->getText();
- fputs(utf8text.c_str(), fp);
- fclose(fp);
- fp = NULL;
-
const LLInventoryItem *inv_item = getItem();
// save it out to asset server
std::string url = gAgent.getRegion()->getCapability("UpdateScriptAgent");
@@ -1433,7 +1665,7 @@ void LLPreviewLSL::onLoadComplete( LLVFS *vfs, const LLUUID& asset_uuid, LLAsset
{
is_modifiable = TRUE;
}
- preview->mScriptEd->mEditor->setEnabled(is_modifiable);
+ preview->mScriptEd->setEnableEditing(is_modifiable);
preview->mAssetStatus = PREVIEW_ASSET_LOADED;
}
else
@@ -1474,11 +1706,11 @@ void* LLLiveLSLEditor::createScriptEdPanel(void* userdata)
LLLiveLSLEditor *self = (LLLiveLSLEditor*)userdata;
self->mScriptEd = new LLScriptEdCore(
+ self,
HELLO_LSL,
self->getHandle(),
&LLLiveLSLEditor::onLoad,
&LLLiveLSLEditor::onSave,
- &LLLiveLSLEditor::onEdit,
&LLLiveLSLEditor::onSearchReplace,
self,
0);
@@ -1488,14 +1720,12 @@ void* LLLiveLSLEditor::createScriptEdPanel(void* userdata)
LLLiveLSLEditor::LLLiveLSLEditor(const LLSD& key) :
- LLPreview(key),
- mScriptEd(NULL),
+ LLScriptEdContainer(key),
mAskedForRunningInfo(FALSE),
mHaveRunningInfo(FALSE),
mCloseAfterSave(FALSE),
mPendingUploads(0),
mIsModifiable(FALSE),
- mLiveFile(NULL),
mIsNew(false)
{
mFactoryMap["script ed panel"] = LLCallbackMap(LLLiveLSLEditor::createScriptEdPanel, this);
@@ -1519,11 +1749,6 @@ BOOL LLLiveLSLEditor::postBuild()
return LLPreview::postBuild();
}
-LLLiveLSLEditor::~LLLiveLSLEditor()
-{
- delete mLiveFile;
-}
-
// virtual
void LLLiveLSLEditor::callbackLSLCompileSucceeded(const LLUUID& task_id,
const LLUUID& item_id,
@@ -1580,7 +1805,6 @@ void LLLiveLSLEditor::loadAsset()
mItem = new LLViewerInventoryItem(item);
mScriptEd->setScriptText(getString("not_allowed"), FALSE);
mScriptEd->mEditor->makePristine();
- mScriptEd->mEditor->setEnabled(FALSE);
mScriptEd->enableSave(FALSE);
mAssetStatus = PREVIEW_ASSET_LOADED;
}
@@ -1618,10 +1842,6 @@ void LLLiveLSLEditor::loadAsset()
mIsModifiable = item && gAgent.allowOperation(PERM_MODIFY,
item->getPermissions(),
GP_OBJECT_MANIPULATE);
- if(!mIsModifiable)
- {
- mScriptEd->mEditor->setEnabled(FALSE);
- }
// This is commented out, because we don't completely
// handle script exports yet.
@@ -1677,6 +1897,7 @@ void LLLiveLSLEditor::onLoadComplete(LLVFS *vfs, const LLUUID& asset_id,
if( LL_ERR_NOERR == status )
{
instance->loadScriptText(vfs, asset_id, type);
+ instance->mScriptEd->setEnableEditing(TRUE);
instance->mAssetStatus = PREVIEW_ASSET_LOADED;
}
else
@@ -1703,40 +1924,6 @@ void LLLiveLSLEditor::onLoadComplete(LLVFS *vfs, const LLUUID& asset_id,
delete xored_id;
}
- bool LLLiveLSLEditor::loadScriptText(const std::string& filename)
- {
- if (filename.empty())
- {
- llwarns << "Empty file name" << llendl;
- return false;
- }
-
- LLFILE* file = LLFile::fopen(filename, "rb"); /*Flawfinder: ignore*/
- if (!file)
- {
- llwarns << "Error opening " << filename << llendl;
- return false;
- }
-
- // read in the whole file
- fseek(file, 0L, SEEK_END);
- size_t file_length = (size_t) ftell(file);
- fseek(file, 0L, SEEK_SET);
- char* buffer = new char[file_length+1];
- size_t nread = fread(buffer, 1, file_length, file);
- if (nread < file_length)
- {
- llwarns << "Short read" << llendl;
- }
- buffer[nread] = '\0';
- fclose(file);
- mScriptEd->mEditor->setText(LLStringExplicit(buffer));
- //mScriptEd->mEditor->makePristine();
- delete[] buffer;
-
- return true;
- }
-
void LLLiveLSLEditor::loadScriptText(LLVFS *vfs, const LLUUID &uuid, LLAssetType::EType type)
{
LLVFile file(vfs, uuid, type);
@@ -1890,7 +2077,8 @@ LLLiveLSLSaveData::LLLiveLSLSaveData(const LLUUID& id,
mItem = new LLViewerInventoryItem(item);
}
-void LLLiveLSLEditor::saveIfNeeded(bool sync)
+// virtual
+void LLLiveLSLEditor::saveIfNeeded(bool sync /*= true*/)
{
LLViewerObject* object = gObjectList.findObject(mObjectUUID);
if(!object)
@@ -1941,18 +2129,11 @@ void LLLiveLSLEditor::saveIfNeeded(bool sync)
mItem->setAssetUUID(asset_id);
mItem->setTransactionID(tid);
- writeToFile(filename);
+ mScriptEd->writeToFile(filename);
if (sync)
{
- // Sync with external ed2itor.
- std::string tmp_file = getTmpFileName();
- llstat s;
- if (LLFile::stat(tmp_file, &s) == 0) // file exists
- {
- if (mLiveFile) mLiveFile->ignoreNextUpdate();
- writeToFile(tmp_file);
- }
+ mScriptEd->sync();
}
// save it out to asset server
@@ -1970,73 +2151,6 @@ void LLLiveLSLEditor::saveIfNeeded(bool sync)
}
}
-void LLLiveLSLEditor::openExternalEditor()
-{
- LLViewerObject* object = gObjectList.findObject(mObjectUUID);
- if(!object)
- {
- LLNotificationsUtil::add("SaveScriptFailObjectNotFound");
- return;
- }
-
- delete mLiveFile; // deletes file
-
- // Save the script to a temporary file.
- std::string filename = getTmpFileName();
- writeToFile(filename);
-
- // Start watching file changes.
- mLiveFile = new LLLiveLSLFile(filename, this);
- mLiveFile->addToEventTimer();
-
- // Open it in external editor.
- {
- LLExternalEditor ed;
-
- if (!ed.setCommand("LL_SCRIPT_EDITOR"))
- {
- std::string msg = "Select an editor by setting the environment variable LL_SCRIPT_EDITOR "
- "or the ExternalEditor setting"; // *TODO: localize
- LLNotificationsUtil::add("GenericAlert", LLSD().with("MESSAGE", msg));
- return;
- }
-
- ed.run(filename);
- }
-}
-
-bool LLLiveLSLEditor::writeToFile(const std::string& filename)
-{
- LLFILE* fp = LLFile::fopen(filename, "wb");
- if (!fp)
- {
- llwarns << "Unable to write to " << filename << llendl;
-
- LLSD row;
- row["columns"][0]["value"] = "Error writing to local file. Is your hard drive full?";
- row["columns"][0]["font"] = "SANSSERIF_SMALL";
- mScriptEd->mErrorList->addElement(row);
- return false;
- }
-
- std::string utf8text = mScriptEd->mEditor->getText();
-
- // Special case for a completely empty script - stuff in one space so it can store properly. See SL-46889
- if (utf8text.size() == 0)
- {
- utf8text = " ";
- }
-
- fputs(utf8text.c_str(), fp);
- fclose(fp);
- return true;
-}
-
-std::string LLLiveLSLEditor::getTmpFileName()
-{
- return std::string(LLFile::tmpdir()) + "sl_script_" + mObjectUUID.asString() + ".lsl";
-}
-
void LLLiveLSLEditor::uploadAssetViaCaps(const std::string& url,
const std::string& filename,
const LLUUID& task_id,
@@ -2261,13 +2375,6 @@ void LLLiveLSLEditor::onSave(void* userdata, BOOL close_after_save)
// static
-void LLLiveLSLEditor::onEdit(void* userdata)
-{
- LLLiveLSLEditor* self = (LLLiveLSLEditor*)userdata;
- self->openExternalEditor();
-}
-
-// static
void LLLiveLSLEditor::processScriptRunningReply(LLMessageSystem* msg, void**)
{
LLUUID item_id;
diff --git a/indra/newview/llpreviewscript.h b/indra/newview/llpreviewscript.h
index d35c6b8528..7563cecd9d 100644
--- a/indra/newview/llpreviewscript.h
+++ b/indra/newview/llpreviewscript.h
@@ -48,6 +48,7 @@ class LLFloaterScriptSearch;
class LLKeywordToken;
class LLVFS;
class LLViewerInventoryItem;
+class LLScriptEdContainer;
// Inner, implementation class. LLPreviewScript and LLLiveLSLEditor each own one of these.
class LLScriptEdCore : public LLPanel
@@ -56,17 +57,20 @@ class LLScriptEdCore : public LLPanel
friend class LLPreviewLSL;
friend class LLLiveLSLEditor;
friend class LLFloaterScriptSearch;
+ friend class LLScriptEdContainer;
-public:
+protected:
+ // Supposed to be invoked only by the container.
LLScriptEdCore(
+ LLScriptEdContainer* container,
const std::string& sample,
const LLHandle<LLFloater>& floater_handle,
void (*load_callback)(void* userdata),
void (*save_callback)(void* userdata, BOOL close_after_save),
- void (*edit_callback)(void*),
void (*search_replace_callback)(void* userdata),
void* userdata,
S32 bottom_pad = 0); // pad below bottom row of buttons
+public:
~LLScriptEdCore();
void initMenu();
@@ -74,15 +78,20 @@ public:
virtual void draw();
/*virtual*/ BOOL postBuild();
BOOL canClose();
+ void setEnableEditing(bool enable);
+ bool canLoadOrSaveToFile( void* userdata );
void setScriptText(const std::string& text, BOOL is_valid);
+ bool loadScriptText(const std::string& filename);
+ bool writeToFile(const std::string& filename);
+ void sync();
void doSave( BOOL close_after_save );
bool handleSaveChangesDialog(const LLSD& notification, const LLSD& response);
bool handleReloadFromServerDialog(const LLSD& notification, const LLSD& response);
- void onEditButtonClick();
+ void openInExternalEditor();
static void onCheckLock(LLUICtrl*, void*);
static void onHelpComboCommit(LLUICtrl* ctrl, void* userdata);
@@ -90,6 +99,11 @@ public:
static void onClickForward(void* userdata);
static void onBtnInsertSample(void*);
static void onBtnInsertFunction(LLUICtrl*, void*);
+ static void onBtnLoadFromFile(void*);
+ static void onBtnSaveToFile(void*);
+
+ static bool enableSaveToFileMenu(void* userdata);
+ static bool enableLoadFromFileMenu(void* userdata);
virtual bool hasAccelerators() const { return true; }
@@ -118,7 +132,6 @@ private:
LLTextEditor* mEditor;
void (*mLoadCallback)(void* userdata);
void (*mSaveCallback)(void* userdata, BOOL close_after_save);
- void (*mEditCallback)(void* userdata);
void (*mSearchReplaceCallback) (void* userdata);
void* mUserdata;
LLComboBox *mFunctions;
@@ -132,11 +145,28 @@ private:
S32 mLiveHelpHistorySize;
BOOL mEnableSave;
BOOL mHasScriptData;
+ LLLiveLSLFile* mLiveFile;
+
+ LLScriptEdContainer* mContainer; // parent view
};
+class LLScriptEdContainer : public LLPreview
+{
+ friend class LLScriptEdCore;
+
+public:
+ LLScriptEdContainer(const LLSD& key);
+
+protected:
+ std::string getTmpFileName();
+ bool onExternalChange(const std::string& filename);
+ virtual void saveIfNeeded(bool sync = true) = 0;
+
+ LLScriptEdCore* mScriptEd;
+};
// Used to view and edit a LSL from your inventory.
-class LLPreviewLSL : public LLPreview
+class LLPreviewLSL : public LLScriptEdContainer
{
public:
LLPreviewLSL(const LLSD& key );
@@ -150,7 +180,7 @@ protected:
void closeIfNeeded();
virtual void loadAsset();
- void saveIfNeeded();
+ /*virtual*/ void saveIfNeeded(bool sync = true);
void uploadAssetViaCaps(const std::string& url,
const std::string& filename,
const LLUUID& item_id);
@@ -174,7 +204,6 @@ protected:
protected:
- LLScriptEdCore* mScriptEd;
// Can safely close only after both text and bytecode are uploaded
S32 mPendingUploads;
@@ -182,12 +211,11 @@ protected:
// Used to view and edit an LSL that is attached to an object.
-class LLLiveLSLEditor : public LLPreview
+class LLLiveLSLEditor : public LLScriptEdContainer
{
friend class LLLiveLSLFile;
public:
LLLiveLSLEditor(const LLSD& key);
- ~LLLiveLSLEditor();
static void processScriptRunningReply(LLMessageSystem* msg, void**);
@@ -208,10 +236,7 @@ private:
virtual void loadAsset();
void loadAsset(BOOL is_new);
- void saveIfNeeded(bool sync = true);
- void openExternalEditor();
- std::string getTmpFileName();
- bool writeToFile(const std::string& filename);
+ /*virtual*/ void saveIfNeeded(bool sync = true);
void uploadAssetViaCaps(const std::string& url,
const std::string& filename,
const LLUUID& task_id,
@@ -227,7 +252,6 @@ private:
static void onSearchReplace(void* userdata);
static void onLoad(void* userdata);
static void onSave(void* userdata, BOOL close_after_save);
- static void onEdit(void* userdata);
static void onLoadComplete(LLVFS *vfs, const LLUUID& asset_uuid,
LLAssetType::EType type,
@@ -237,7 +261,6 @@ private:
static void onRunningCheckboxClicked(LLUICtrl*, void* userdata);
static void onReset(void* userdata);
- bool loadScriptText(const std::string& filename);
void loadScriptText(LLVFS *vfs, const LLUUID &uuid, LLAssetType::EType type);
static void onErrorList(LLUICtrl*, void* user_data);
@@ -248,7 +271,6 @@ private:
private:
bool mIsNew;
- LLScriptEdCore* mScriptEd;
//LLUUID mTransmitID;
LLCheckBoxCtrl* mRunningCheckbox;
BOOL mAskedForRunningInfo;
@@ -263,7 +285,6 @@ private:
LLCheckBoxCtrl* mMonoCheckbox;
BOOL mIsModifiable;
- LLLiveLSLFile* mLiveFile;
};
#endif // LL_LLPREVIEWSCRIPT_H
diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp
index fd6b326ef1..3ff5a05d81 100644
--- a/indra/newview/llpreviewtexture.cpp
+++ b/indra/newview/llpreviewtexture.cpp
@@ -143,10 +143,7 @@ void LLPreviewTexture::onSaveAsBtn(void* data)
void LLPreviewTexture::draw()
{
- if (mUpdateDimensions)
- {
- updateDimensions();
- }
+ updateDimensions();
LLPreview::draw();
@@ -172,7 +169,7 @@ void LLPreviewTexture::draw()
saveAs();
}
// Draw the texture
- glColor3f( 1.f, 1.f, 1.f );
+ gGL.diffuseColor3f( 1.f, 1.f, 1.f );
gl_draw_scaled_image(interior.mLeft,
interior.mBottom,
interior.getWidth(),
@@ -273,6 +270,8 @@ void LLPreviewTexture::saveAs()
mSaveFileName = file_picker.getFirstFile();
mLoadingFullImage = TRUE;
getWindow()->incBusyCount();
+
+ mImage->forceToSaveRawImage(0) ;//re-fetch the raw image if the old one is removed.
mImage->setLoadedCallback( LLPreviewTexture::onFileLoadedForSave,
0, TRUE, FALSE, new LLUUID( mItemUUID ), &mCallbackTextureList );
}
@@ -318,7 +317,7 @@ void LLPreviewTexture::reshape(S32 width, S32 height, BOOL called_from_parent)
}
}
- mClientRect.setLeftTopAndSize(client_rect.getCenterX() - (client_width / 2), client_rect.getCenterY() + (client_height / 2), client_width, client_height);
+ mClientRect.setLeftTopAndSize(client_rect.getCenterX() - (client_width / 2), client_rect.getCenterY() + (client_height / 2), client_width, client_height);
}
@@ -394,96 +393,32 @@ void LLPreviewTexture::onFileLoadedForSave(BOOL success,
void LLPreviewTexture::updateDimensions()
{
if (!mImage)
+ {
return;
-
- if(mImage->getFullWidth() == 0 || mImage->getFullHeight() == 0)
+ }
+ if ((mImage->getFullWidth() * mImage->getFullHeight()) == 0)
{
return;
}
-
- mUpdateDimensions = FALSE;
-
- getChild<LLUICtrl>("dimensions")->setTextArg("[WIDTH]", llformat("%d", mImage->getFullWidth()));
+ // Update the width/height display every time
+ getChild<LLUICtrl>("dimensions")->setTextArg("[WIDTH]", llformat("%d", mImage->getFullWidth()));
getChild<LLUICtrl>("dimensions")->setTextArg("[HEIGHT]", llformat("%d", mImage->getFullHeight()));
-
- LLRect dim_rect(getChildView("dimensions")->getRect());
-
- S32 horiz_pad = 2 * (LLPANEL_BORDER_WIDTH + PREVIEW_PAD) + PREVIEW_RESIZE_HANDLE_SIZE;
-
- // add space for dimensions and aspect ratio
- S32 info_height = dim_rect.mTop + CLIENT_RECT_VPAD;
-
- S32 screen_width = gFloaterView->getSnapRect().getWidth();
- S32 screen_height = gFloaterView->getSnapRect().getHeight();
-
- S32 max_image_width = screen_width - 2*horiz_pad;
- S32 max_image_height = screen_height - (PREVIEW_HEADER_SIZE + CLIENT_RECT_VPAD)
- - (PREVIEW_BORDER + CLIENT_RECT_VPAD + info_height);
-
- S32 client_width = llmin(max_image_width,mImage->getFullWidth());
- S32 client_height = llmin(max_image_height,mImage->getFullHeight());
-
- if (mAspectRatio > 0.f)
- {
- if(mAspectRatio > 1.f)
- {
- client_height = llceil((F32)client_width / mAspectRatio);
- if(client_height > max_image_height)
- {
- client_height = max_image_height;
- client_width = llceil((F32)client_height * mAspectRatio);
- }
- }
- else//mAspectRatio < 1.f
- {
- client_width = llceil((F32)client_height * mAspectRatio);
- if(client_width > max_image_width)
- {
- client_width = max_image_width;
- client_height = llceil((F32)client_width / mAspectRatio);
- }
- }
- }
- else
+ // Reshape the floater only when required
+ if (mUpdateDimensions)
{
-
- if(client_height > max_image_height)
- {
- F32 ratio = (F32)max_image_height/client_height;
- client_height = max_image_height;
- client_width = llceil((F32)client_height * ratio);
- }
+ mUpdateDimensions = FALSE;
- if(client_width > max_image_width)
- {
- F32 ratio = (F32)max_image_width/client_width;
- client_width = max_image_width;
- client_height = llceil((F32)client_width * ratio);
- }
- }
-
- //now back to whole floater
- S32 floater_width = llmax(getMinWidth(),client_width + 2*horiz_pad);
- S32 floater_height = llmax(getMinHeight(),client_height + (PREVIEW_HEADER_SIZE + CLIENT_RECT_VPAD)
- + (PREVIEW_BORDER + CLIENT_RECT_VPAD + info_height));
+ //reshape floater
+ reshape(getRect().getWidth(), getRect().getHeight());
- //reshape floater
- reshape( floater_width, floater_height );
- gFloaterView->adjustToFitScreen(this, FALSE);
+ gFloaterView->adjustToFitScreen(this, FALSE);
- //setup image rect...
- LLRect client_rect(horiz_pad, getRect().getHeight(), getRect().getWidth() - horiz_pad, 0);
- client_rect.mTop -= (PREVIEW_HEADER_SIZE + CLIENT_RECT_VPAD);
- client_rect.mBottom += PREVIEW_BORDER + CLIENT_RECT_VPAD + info_height ;
-
- mClientRect.setLeftTopAndSize(client_rect.getCenterX() - (client_width / 2), client_rect.getCenterY() + (client_height / 2), client_width, client_height);
-
- // Hide the aspect ratio label if the window is too narrow
- // Assumes the label should be to the right of the dimensions
- LLRect aspect_label_rect(getChildView("aspect_ratio")->getRect());
- getChildView("aspect_ratio")->setVisible( dim_rect.mRight < aspect_label_rect.mLeft);
+ LLRect dim_rect(getChildView("dimensions")->getRect());
+ LLRect aspect_label_rect(getChildView("aspect_ratio")->getRect());
+ getChildView("aspect_ratio")->setVisible( dim_rect.mRight < aspect_label_rect.mLeft);
+ }
}
diff --git a/indra/newview/llprogressview.cpp b/indra/newview/llprogressview.cpp
index e9504cbba0..5d7a5b1c59 100644
--- a/indra/newview/llprogressview.cpp
+++ b/indra/newview/llprogressview.cpp
@@ -50,28 +50,26 @@
#include "llappviewer.h"
#include "llweb.h"
#include "lluictrlfactory.h"
+#include "llpanellogin.h"
LLProgressView* LLProgressView::sInstance = NULL;
S32 gStartImageWidth = 1;
S32 gStartImageHeight = 1;
-const F32 FADE_IN_TIME = 1.f;
-
-const std::string ANIMATION_FILENAME = "Login Sequence ";
-const std::string ANIMATION_SUFFIX = ".jpg";
-const F32 TOTAL_LOGIN_TIME = 10.f; // seconds, wild guess at time from GL context to actual world view
-S32 gLastStartAnimationFrame = 0; // human-style indexing, first image = 1
-const S32 ANIMATION_FRAMES = 1; //13;
+const F32 FADE_TO_WORLD_TIME = 1.0f;
static LLRegisterPanelClassWrapper<LLProgressView> r("progress_view");
-
// XUI: Translate
LLProgressView::LLProgressView()
: LLPanel(),
mPercentDone( 0.f ),
+ mMediaCtrl( NULL ),
mMouseDownInActiveArea( false ),
- mUpdateEvents("LLProgressView")
+ mUpdateEvents("LLProgressView"),
+ mFadeToWorldTimer(),
+ mFadeFromLoginTimer(),
+ mStartupComplete(false)
{
mUpdateEvents.listen("self", boost::bind(&LLProgressView::handleUpdate, this, _1));
}
@@ -80,9 +78,17 @@ BOOL LLProgressView::postBuild()
{
mProgressBar = getChild<LLProgressBar>("login_progress_bar");
+ // media control that is used to play intro video
+ mMediaCtrl = getChild<LLMediaCtrl>("login_media_panel");
+ mMediaCtrl->setVisible( false ); // hidden initially
+ mMediaCtrl->addObserver( this ); // watch events
+
+ LLViewerMedia::setOnlyAudibleMediaTextureID(mMediaCtrl->getTextureID());
+
mCancelBtn = getChild<LLButton>("cancel_btn");
mCancelBtn->setClickedCallback( LLProgressView::onCancelButtonClicked, NULL );
- mFadeTimer.stop();
+ mFadeToWorldTimer.stop();
+ mFadeFromLoginTimer.stop();
getChild<LLTextBox>("title_text")->setText(LLStringExplicit(LLAppViewer::instance()->getSecondLifeTitle()));
@@ -125,35 +131,68 @@ BOOL LLProgressView::handleKeyHere(KEY key, MASK mask)
return TRUE;
}
+void LLProgressView::revealIntroPanel()
+{
+ // if user hasn't yet seen intro video
+ std::string intro_url = gSavedSettings.getString("PostFirstLoginIntroURL");
+ if ( intro_url.length() > 0 &&
+ gSavedSettings.getBOOL("BrowserJavascriptEnabled") &&
+ gSavedSettings.getBOOL("PostFirstLoginIntroViewed" ) == FALSE )
+ {
+ // hide the progress bar
+ getChild<LLView>("stack1")->setVisible(false);
+
+ // navigate to intro URL and reveal widget
+ mMediaCtrl->navigateTo( intro_url );
+ mMediaCtrl->setVisible( TRUE );
+
+
+ // flag as having seen the new user post login intro
+ gSavedSettings.setBOOL("PostFirstLoginIntroViewed", TRUE );
+
+ mMediaCtrl->setFocus(TRUE);
+ }
+
+ mFadeFromLoginTimer.start();
+}
+
+void LLProgressView::setStartupComplete()
+{
+ mStartupComplete = true;
+
+ // if we are not showing a video, fade into world
+ if (!mMediaCtrl->getVisible())
+ {
+ mFadeFromLoginTimer.stop();
+ mFadeToWorldTimer.start();
+ }
+}
+
void LLProgressView::setVisible(BOOL visible)
{
// hiding progress view
if (getVisible() && !visible)
{
- mFadeTimer.start();
+ LLPanel::setVisible(FALSE);
}
// showing progress view
- else if (!getVisible() && visible)
+ else if (visible && (!getVisible() || mFadeToWorldTimer.getStarted()))
{
setFocus(TRUE);
- mFadeTimer.stop();
- mProgressTimer.start();
+ mFadeToWorldTimer.stop();
LLPanel::setVisible(TRUE);
- }
+ }
}
-void LLProgressView::draw()
+void LLProgressView::drawStartTexture(F32 alpha)
{
- static LLTimer timer;
-
- // Paint bitmap if we've got one
- glPushMatrix();
+ gGL.pushMatrix();
if (gStartTexture)
{
LLGLSUIDefault gls_ui;
gGL.getTexUnit(0)->bind(gStartTexture.get());
- gGL.color4f(1.f, 1.f, 1.f, mFadeTimer.getStarted() ? clamp_rescale(mFadeTimer.getElapsedTimeF32(), 0.f, FADE_IN_TIME, 1.f, 0.f) : 1.f);
+ gGL.color4f(1.f, 1.f, 1.f, alpha);
F32 image_aspect = (F32)gStartImageWidth / (F32)gStartImageHeight;
S32 width = getRect().getWidth();
S32 height = getRect().getHeight();
@@ -161,13 +200,13 @@ void LLProgressView::draw()
// stretch image to maintain aspect ratio
if (image_aspect > view_aspect)
{
- glTranslatef(-0.5f * (image_aspect / view_aspect - 1.f) * width, 0.f, 0.f);
- glScalef(image_aspect / view_aspect, 1.f, 1.f);
+ gGL.translatef(-0.5f * (image_aspect / view_aspect - 1.f) * width, 0.f, 0.f);
+ gGL.scalef(image_aspect / view_aspect, 1.f, 1.f);
}
else
{
- glTranslatef(0.f, -0.5f * (view_aspect / image_aspect - 1.f) * height, 0.f);
- glScalef(1.f, view_aspect / image_aspect, 1.f);
+ gGL.translatef(0.f, -0.5f * (view_aspect / image_aspect - 1.f) * height, 0.f);
+ gGL.scalef(1.f, view_aspect / image_aspect, 1.f);
}
gl_rect_2d_simple_tex( getRect().getWidth(), getRect().getHeight() );
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
@@ -178,24 +217,76 @@ void LLProgressView::draw()
gGL.color4f(0.f, 0.f, 0.f, 1.f);
gl_rect_2d(getRect());
}
- glPopMatrix();
+ gGL.popMatrix();
+}
+
- // Handle fade-in animation
- if (mFadeTimer.getStarted())
+void LLProgressView::draw()
+{
+ static LLTimer timer;
+
+ if (mFadeFromLoginTimer.getStarted())
{
+ F32 alpha = clamp_rescale(mFadeFromLoginTimer.getElapsedTimeF32(), 0.f, FADE_TO_WORLD_TIME, 0.f, 1.f);
+ LLViewDrawContext context(alpha);
+
+ if (!mMediaCtrl->getVisible())
+ {
+ drawStartTexture(alpha);
+ }
+
LLPanel::draw();
- if (mFadeTimer.getElapsedTimeF32() > FADE_IN_TIME)
+
+ if (mFadeFromLoginTimer.getElapsedTimeF32() > FADE_TO_WORLD_TIME )
{
+ mFadeFromLoginTimer.stop();
+ LLPanelLogin::closePanel();
+ }
+
+ return;
+ }
+
+ // handle fade out to world view when we're asked to
+ if (mFadeToWorldTimer.getStarted())
+ {
+ // draw fading panel
+ F32 alpha = clamp_rescale(mFadeToWorldTimer.getElapsedTimeF32(), 0.f, FADE_TO_WORLD_TIME, 1.f, 0.f);
+ LLViewDrawContext context(alpha);
+
+ drawStartTexture(alpha);
+ LLPanel::draw();
+
+ // faded out completely - remove panel and reveal world
+ if (mFadeToWorldTimer.getElapsedTimeF32() > FADE_TO_WORLD_TIME )
+ {
+ mFadeToWorldTimer.stop();
+
+ LLViewerMedia::setOnlyAudibleMediaTextureID(LLUUID::null);
+
// Fade is complete, release focus
gFocusMgr.releaseFocusIfNeeded( this );
+
+ // turn off panel that hosts intro so we see the world
LLPanel::setVisible(FALSE);
- mFadeTimer.stop();
+
+ // stop observing events since we no longer care
+ mMediaCtrl->remObserver( this );
+
+ // hide the intro
+ mMediaCtrl->setVisible( false );
+
+ // navigate away from intro page to something innocuous since 'unload' is broken right now
+ //mMediaCtrl->navigateTo( "about:blank" );
+
+ // FIXME: this causes a crash that i haven't been able to fix
+ mMediaCtrl->unloadMediaSource();
gStartTexture = NULL;
}
return;
}
+ drawStartTexture(1.0f);
// draw children
LLPanel::draw();
}
@@ -207,7 +298,7 @@ void LLProgressView::setText(const std::string& text)
void LLProgressView::setPercent(const F32 percent)
{
- mProgressBar->setPercent(percent);
+ mProgressBar->setValue(percent);
}
void LLProgressView::setMessage(const std::string& msg)
@@ -307,3 +398,29 @@ bool LLProgressView::onAlertModal(const LLSD& notify)
}
return false;
}
+
+void LLProgressView::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event)
+{
+ // the intro web content calls javascript::window.close() when it's done
+ if( event == MEDIA_EVENT_CLOSE_REQUEST )
+ {
+ if (mStartupComplete)
+ {
+ //make sure other timer has stopped
+ mFadeFromLoginTimer.stop();
+ mFadeToWorldTimer.start();
+ }
+ else
+ {
+ // hide the media ctrl and wait for startup to be completed before fading to world
+ mMediaCtrl->setVisible(false);
+ if (mMediaCtrl->getMediaPlugin())
+ {
+ mMediaCtrl->getMediaPlugin()->stop();
+ }
+
+ // show the progress bar
+ getChild<LLView>("stack1")->setVisible(true);
+ }
+ }
+}
diff --git a/indra/newview/llprogressview.h b/indra/newview/llprogressview.h
index be1744f08a..fac00ad04d 100644
--- a/indra/newview/llprogressview.h
+++ b/indra/newview/llprogressview.h
@@ -28,6 +28,7 @@
#define LL_LLPROGRESSVIEW_H
#include "llpanel.h"
+#include "llmediactrl.h"
#include "llframetimer.h"
#include "llevents.h"
@@ -35,7 +36,10 @@ class LLImageRaw;
class LLButton;
class LLProgressBar;
-class LLProgressView : public LLPanel
+class LLProgressView :
+ public LLPanel,
+ public LLViewerMediaObserver
+
{
public:
LLProgressView();
@@ -44,32 +48,47 @@ public:
BOOL postBuild();
/*virtual*/ void draw();
+ void drawStartTexture(F32 alpha);
/*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask);
/*virtual*/ BOOL handleKeyHere(KEY key, MASK mask);
/*virtual*/ void setVisible(BOOL visible);
+ // inherited from LLViewerMediaObserver
+ /*virtual*/ void handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event);
+
void setText(const std::string& text);
void setPercent(const F32 percent);
// Set it to NULL when you want to eliminate the message.
void setMessage(const std::string& msg);
+ // turns on (under certain circumstances) the into video after login
+ void revealIntroPanel();
+
+ void setStartupComplete();
+
void setCancelButtonVisible(BOOL b, const std::string& label);
static void onCancelButtonClicked( void* );
static void onClickMessage(void*);
bool onAlertModal(const LLSD& sd);
+ // note - this is not just hiding the intro panel - it also hides the parent panel
+ // and is used when the intro is finished and we want to show the world
+ void removeIntroPanel();
+
protected:
LLProgressBar* mProgressBar;
+ LLMediaCtrl* mMediaCtrl;
F32 mPercentDone;
std::string mMessage;
LLButton* mCancelBtn;
- LLFrameTimer mFadeTimer;
- LLFrameTimer mProgressTimer;
+ LLFrameTimer mFadeToWorldTimer;
+ LLFrameTimer mFadeFromLoginTimer;
LLRect mOutlineRect;
bool mMouseDownInActiveArea;
+ bool mStartupComplete;
// The LLEventStream mUpdateEvents depends upon this class being a singleton
// to avoid pump name conflicts.
diff --git a/indra/newview/llrecentpeople.cpp b/indra/newview/llrecentpeople.cpp
index 959fd51bbf..7689cd1a52 100644
--- a/indra/newview/llrecentpeople.cpp
+++ b/indra/newview/llrecentpeople.cpp
@@ -33,7 +33,7 @@
using namespace LLOldEvents;
-bool LLRecentPeople::add(const LLUUID& id)
+bool LLRecentPeople::add(const LLUUID& id, const LLSD& userdata)
{
if (id == gAgent.getID())
return false;
@@ -42,10 +42,16 @@ bool LLRecentPeople::add(const LLUUID& id)
if (is_not_group_id)
{
- LLDate date_added = LLDate::now();
+ // For each avaline call the id of caller is different even if
+ // the phone number is the same.
+ // To avoid duplication of avaline list items in the recent list
+ // of panel People, deleting id's with similar phone number.
+ const LLUUID& caller_id = getIDByPhoneNumber(userdata);
+ if (caller_id.notNull())
+ mPeople.erase(caller_id);
- //[] instead of insert to replace existing id->date with new date value
- mPeople[id] = date_added;
+ //[] instead of insert to replace existing id->llsd["date"] with new date value
+ mPeople[id] = userdata;
mChangedSignal();
}
@@ -64,15 +70,55 @@ void LLRecentPeople::get(uuid_vec_t& result) const
result.push_back((*pos).first);
}
-const LLDate& LLRecentPeople::getDate(const LLUUID& id) const
+const LLDate LLRecentPeople::getDate(const LLUUID& id) const
{
recent_people_t::const_iterator it = mPeople.find(id);
- if (it!= mPeople.end()) return (*it).second;
+ if (it!= mPeople.end()) return it->second["date"].asDate();
static LLDate no_date = LLDate();
return no_date;
}
+const LLSD& LLRecentPeople::getData(const LLUUID& id) const
+{
+ recent_people_t::const_iterator it = mPeople.find(id);
+
+ if (it != mPeople.end())
+ return it->second;
+
+ static LLSD no_data = LLSD();
+ return no_data;
+}
+
+bool LLRecentPeople::isAvalineCaller(const LLUUID& id) const
+{
+ recent_people_t::const_iterator it = mPeople.find(id);
+
+ if (it != mPeople.end())
+ {
+ const LLSD& user = it->second;
+ return user["avaline_call"].asBoolean();
+ }
+
+ return false;
+}
+
+const LLUUID& LLRecentPeople::getIDByPhoneNumber(const LLSD& userdata)
+{
+ if (!userdata["avaline_call"].asBoolean())
+ return LLUUID::null;
+
+ for (recent_people_t::const_iterator it = mPeople.begin(); it != mPeople.end(); ++it)
+ {
+ const LLSD& user_info = it->second;
+
+ if (user_info["call_number"].asString() == userdata["call_number"].asString())
+ return it->first;
+ }
+
+ return LLUUID::null;
+}
+
// virtual
bool LLRecentPeople::handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
{
diff --git a/indra/newview/llrecentpeople.h b/indra/newview/llrecentpeople.h
index 852a92ff80..d0d6376867 100644
--- a/indra/newview/llrecentpeople.h
+++ b/indra/newview/llrecentpeople.h
@@ -58,9 +58,15 @@ public:
* Add specified avatar to the list if it's not there already.
*
* @param id avatar to add.
+ *
+ * @param userdata additional information about last interaction party.
+ * For example when last interaction party is not an avatar
+ * but an avaline caller, additional info (such as phone
+ * number, session id and etc.) should be added.
+ *
* @return false if the avatar is in the list already, true otherwise
*/
- bool add(const LLUUID& id);
+ bool add(const LLUUID& id, const LLSD& userdata = LLSD().with("date", LLDate::now()));
/**
* @param id avatar to search.
@@ -75,7 +81,25 @@ public:
*/
void get(uuid_vec_t& result) const;
- const LLDate& getDate(const LLUUID& id) const;
+ /**
+ * Returns last interaction time with specified participant
+ *
+ */
+ const LLDate getDate(const LLUUID& id) const;
+
+ /**
+ * Returns data about specified participant
+ *
+ * @param id identifier of specific participant
+ */
+ const LLSD& getData(const LLUUID& id) const;
+
+ /**
+ * Checks whether specific participant is an avaline caller
+ *
+ * @param id identifier of specific participant
+ */
+ bool isAvalineCaller(const LLUUID& id) const;
/**
* Set callback to be called when the list changed.
@@ -92,7 +116,10 @@ public:
/*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
private:
- typedef std::map<LLUUID, LLDate> recent_people_t;
+
+ const LLUUID& getIDByPhoneNumber(const LLSD& userdata);
+
+ typedef std::map<LLUUID, LLSD> recent_people_t;
recent_people_t mPeople;
signal_t mChangedSignal;
};
diff --git a/indra/newview/llregioninfomodel.cpp b/indra/newview/llregioninfomodel.cpp
new file mode 100644
index 0000000000..698c4f9bb9
--- /dev/null
+++ b/indra/newview/llregioninfomodel.cpp
@@ -0,0 +1,217 @@
+/**
+ * @file llregioninfomodel.cpp
+ * @brief Region info model
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llregioninfomodel.h"
+
+// libs
+#include "message.h"
+#include "llregionflags.h"
+
+// viewer
+#include "llagent.h"
+#include "llviewerregion.h"
+
+void LLRegionInfoModel::reset()
+{
+ mSimAccess = 0;
+ mAgentLimit = 0;
+
+ mRegionFlags = 0;
+ mEstateID = 0;
+ mParentEstateID = 0;
+
+ mPricePerMeter = 0;
+ mRedirectGridX = 0;
+ mRedirectGridY = 0;
+
+ mBillableFactor = 0.0f;
+ mObjectBonusFactor = 0.0f;
+ mWaterHeight = 0.0f;
+ mTerrainRaiseLimit = 0.0f;
+ mTerrainLowerLimit = 0.0f;
+ mSunHour = 0.0f;
+
+ mUseEstateSun = false;
+
+ mSimType.clear();
+ mSimName.clear();
+}
+
+LLRegionInfoModel::LLRegionInfoModel()
+{
+ reset();
+}
+
+boost::signals2::connection LLRegionInfoModel::setUpdateCallback(const update_signal_t::slot_type& cb)
+{
+ return mUpdateSignal.connect(cb);
+}
+
+void LLRegionInfoModel::sendRegionTerrain(const LLUUID& invoice) const
+{
+ std::string buffer;
+ std::vector<std::string> strings;
+
+ // ==========================================
+ // Assemble and send setregionterrain message
+ // "setregionterrain"
+ // strings[0] = float water height
+ // strings[1] = float terrain raise
+ // strings[2] = float terrain lower
+ // strings[3] = 'Y' use estate time
+ // strings[4] = 'Y' fixed sun
+ // strings[5] = float sun_hour
+ // strings[6] = from estate, 'Y' use global time
+ // strings[7] = from estate, 'Y' fixed sun
+ // strings[8] = from estate, float sun_hour
+
+ // *NOTE: this resets estate sun info.
+ BOOL estate_global_time = true;
+ BOOL estate_fixed_sun = false;
+ F32 estate_sun_hour = 0.f;
+
+ buffer = llformat("%f", mWaterHeight);
+ strings.push_back(buffer);
+ buffer = llformat("%f", mTerrainRaiseLimit);
+ strings.push_back(buffer);
+ buffer = llformat("%f", mTerrainLowerLimit);
+ strings.push_back(buffer);
+ buffer = llformat("%s", (mUseEstateSun ? "Y" : "N"));
+ strings.push_back(buffer);
+ buffer = llformat("%s", (getUseFixedSun() ? "Y" : "N"));
+ strings.push_back(buffer);
+ buffer = llformat("%f", mSunHour);
+ strings.push_back(buffer);
+ buffer = llformat("%s", (estate_global_time ? "Y" : "N") );
+ strings.push_back(buffer);
+ buffer = llformat("%s", (estate_fixed_sun ? "Y" : "N") );
+ strings.push_back(buffer);
+ buffer = llformat("%f", estate_sun_hour);
+ strings.push_back(buffer);
+
+ sendEstateOwnerMessage(gMessageSystem, "setregionterrain", invoice, strings);
+}
+
+bool LLRegionInfoModel::getUseFixedSun() const
+{
+ return mRegionFlags & REGION_FLAGS_SUN_FIXED;
+}
+
+void LLRegionInfoModel::setUseFixedSun(bool fixed)
+{
+ if (fixed)
+ {
+ mRegionFlags |= REGION_FLAGS_SUN_FIXED;
+ }
+ else
+ {
+ mRegionFlags &= ~REGION_FLAGS_SUN_FIXED;
+ }
+}
+
+void LLRegionInfoModel::update(LLMessageSystem* msg)
+{
+ reset();
+
+ msg->getStringFast(_PREHASH_RegionInfo, _PREHASH_SimName, mSimName);
+ msg->getU32Fast(_PREHASH_RegionInfo, _PREHASH_EstateID, mEstateID);
+ msg->getU32Fast(_PREHASH_RegionInfo, _PREHASH_ParentEstateID, mParentEstateID);
+ msg->getU32Fast(_PREHASH_RegionInfo, _PREHASH_RegionFlags, mRegionFlags);
+ msg->getU8Fast(_PREHASH_RegionInfo, _PREHASH_SimAccess, mSimAccess);
+ msg->getU8Fast(_PREHASH_RegionInfo, _PREHASH_MaxAgents, mAgentLimit);
+ msg->getF32Fast(_PREHASH_RegionInfo, _PREHASH_ObjectBonusFactor, mObjectBonusFactor);
+ msg->getF32Fast(_PREHASH_RegionInfo, _PREHASH_BillableFactor, mBillableFactor);
+ msg->getF32Fast(_PREHASH_RegionInfo, _PREHASH_WaterHeight, mWaterHeight);
+ msg->getF32Fast(_PREHASH_RegionInfo, _PREHASH_TerrainRaiseLimit, mTerrainRaiseLimit);
+ msg->getF32Fast(_PREHASH_RegionInfo, _PREHASH_TerrainLowerLimit, mTerrainLowerLimit);
+ msg->getS32Fast(_PREHASH_RegionInfo, _PREHASH_PricePerMeter, mPricePerMeter);
+ msg->getS32Fast(_PREHASH_RegionInfo, _PREHASH_RedirectGridX, mRedirectGridX);
+ msg->getS32Fast(_PREHASH_RegionInfo, _PREHASH_RedirectGridY, mRedirectGridY);
+
+ msg->getBOOL(_PREHASH_RegionInfo, _PREHASH_UseEstateSun, mUseEstateSun);
+
+ // actually the "last set" sun hour, not the current sun hour. JC
+ msg->getF32(_PREHASH_RegionInfo, _PREHASH_SunHour, mSunHour);
+ LL_DEBUGS("Windlight Sync") << "Got region sun hour: " << mSunHour << LL_ENDL;
+
+ // the only reasonable way to decide if we actually have any data is to
+ // check to see if any of these fields have nonzero sizes
+ if (msg->getSize(_PREHASH_RegionInfo2, _PREHASH_ProductSKU) > 0 ||
+ msg->getSize(_PREHASH_RegionInfo2, "ProductName") > 0)
+ {
+ msg->getString(_PREHASH_RegionInfo2, "ProductName", mSimType);
+ }
+
+ // Let interested parties know that region info has been updated.
+ mUpdateSignal();
+}
+
+// static
+void LLRegionInfoModel::sendEstateOwnerMessage(
+ LLMessageSystem* msg,
+ const std::string& request,
+ const LLUUID& invoice,
+ const std::vector<std::string>& strings)
+{
+ LLViewerRegion* cur_region = gAgent.getRegion();
+
+ if (!cur_region)
+ {
+ llwarns << "Agent region not set" << llendl;
+ return;
+ }
+
+ llinfos << "Sending estate request '" << request << "'" << llendl;
+ msg->newMessage("EstateOwnerMessage");
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ msg->addUUIDFast(_PREHASH_TransactionID, LLUUID::null); //not used
+ msg->nextBlock("MethodData");
+ msg->addString("Method", request);
+ msg->addUUID("Invoice", invoice);
+
+ if (strings.empty())
+ {
+ msg->nextBlock("ParamList");
+ msg->addString("Parameter", NULL);
+ }
+ else
+ {
+ std::vector<std::string>::const_iterator it = strings.begin();
+ std::vector<std::string>::const_iterator end = strings.end();
+ for (unsigned i = 0; it != end; ++it, ++i)
+ {
+ lldebugs << "- [" << i << "] " << (*it) << llendl;
+ msg->nextBlock("ParamList");
+ msg->addString("Parameter", *it);
+ }
+ }
+
+ msg->sendReliable(cur_region->getHost());
+}
diff --git a/indra/newview/llregioninfomodel.h b/indra/newview/llregioninfomodel.h
new file mode 100644
index 0000000000..89efd82767
--- /dev/null
+++ b/indra/newview/llregioninfomodel.h
@@ -0,0 +1,99 @@
+/**
+ * @file llregioninfomodel.h
+ * @brief Region info model
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLREGIONINFOMODEL_H
+#define LL_LLREGIONINFOMODEL_H
+
+class LLMessageSystem;
+
+#include "llsingleton.h"
+
+/**
+ * Contains region info, notifies interested parties of its changes.
+ */
+class LLRegionInfoModel : public LLSingleton<LLRegionInfoModel>
+{
+ LOG_CLASS(LLRegionInfoModel);
+
+public:
+ typedef boost::signals2::signal<void()> update_signal_t;
+ boost::signals2::connection setUpdateCallback(const update_signal_t::slot_type& cb);
+
+ void sendRegionTerrain(const LLUUID& invoice) const; /// upload region terrain data
+
+ bool getUseFixedSun() const;
+
+ void setUseFixedSun(bool fixed);
+
+ // *TODO: Add getters and make the data private.
+ U8 mSimAccess;
+ U8 mAgentLimit;
+
+ U32 mRegionFlags;
+ U32 mEstateID;
+ U32 mParentEstateID;
+
+ S32 mPricePerMeter;
+ S32 mRedirectGridX;
+ S32 mRedirectGridY;
+
+ F32 mBillableFactor;
+ F32 mObjectBonusFactor;
+ F32 mWaterHeight;
+ F32 mTerrainRaiseLimit;
+ F32 mTerrainLowerLimit;
+ F32 mSunHour; // 6..30
+
+ BOOL mUseEstateSun;
+
+ std::string mSimName;
+ std::string mSimType;
+
+protected:
+ friend class LLSingleton<LLRegionInfoModel>;
+ friend class LLViewerRegion;
+
+ LLRegionInfoModel();
+
+ /**
+ * Refresh model with data from the incoming server message.
+ */
+ void update(LLMessageSystem* msg);
+
+private:
+ void reset();
+
+ // *FIXME: Duplicated code from LLPanelRegionInfo
+ static void sendEstateOwnerMessage(
+ LLMessageSystem* msg,
+ const std::string& request,
+ const LLUUID& invoice,
+ const std::vector<std::string>& strings);
+
+ update_signal_t mUpdateSignal;
+};
+
+#endif // LL_LLREGIONINFOMODEL_H
diff --git a/indra/newview/llremoteparcelrequest.cpp b/indra/newview/llremoteparcelrequest.cpp
index 10d4452ed2..3862dac340 100644
--- a/indra/newview/llremoteparcelrequest.cpp
+++ b/indra/newview/llremoteparcelrequest.cpp
@@ -33,6 +33,7 @@
#include "llpanel.h"
#include "llhttpclient.h"
#include "llsdserialize.h"
+#include "llurlentry.h"
#include "llviewerregion.h"
#include "llview.h"
@@ -78,10 +79,11 @@ void LLRemoteParcelRequestResponder::error(U32 status, const std::string& reason
void LLRemoteParcelInfoProcessor::addObserver(const LLUUID& parcel_id, LLRemoteParcelInfoObserver* observer)
{
observer_multimap_t::iterator it;
+ observer_multimap_t::iterator start = mObservers.lower_bound(parcel_id);
observer_multimap_t::iterator end = mObservers.upper_bound(parcel_id);
// Check if the observer is already in observers list for this UUID
- for(it = mObservers.find(parcel_id); it != end; ++it)
+ for(it = start; it != end; ++it)
{
if (it->second.get() == observer)
{
@@ -100,9 +102,10 @@ void LLRemoteParcelInfoProcessor::removeObserver(const LLUUID& parcel_id, LLRemo
}
observer_multimap_t::iterator it;
+ observer_multimap_t::iterator start = mObservers.lower_bound(parcel_id);
observer_multimap_t::iterator end = mObservers.upper_bound(parcel_id);
- for(it = mObservers.find(parcel_id); it != end; ++it)
+ for(it = start; it != end; ++it)
{
if (it->second.get() == observer)
{
@@ -138,21 +141,25 @@ void LLRemoteParcelInfoProcessor::processParcelInfoReply(LLMessageSystem* msg, v
typedef std::vector<observer_multimap_t::iterator> deadlist_t;
deadlist_t dead_iters;
- observer_multimap_t::iterator oi;
+ observer_multimap_t::iterator oi = observers.lower_bound(parcel_data.parcel_id);
observer_multimap_t::iterator end = observers.upper_bound(parcel_data.parcel_id);
- for (oi = observers.find(parcel_data.parcel_id); oi != end; ++oi)
+ while (oi != end)
{
- LLRemoteParcelInfoObserver * observer = oi->second.get();
+ // increment the loop iterator now since it may become invalid below
+ observer_multimap_t::iterator cur_oi = oi++;
+
+ LLRemoteParcelInfoObserver * observer = cur_oi->second.get();
if(observer)
{
+ // may invalidate cur_oi if the observer removes itself
observer->processParcelInfo(parcel_data);
}
else
{
// the handle points to an expired observer, so don't keep it
// around anymore
- dead_iters.push_back(oi);
+ dead_iters.push_back(cur_oi);
}
}
@@ -162,6 +169,18 @@ void LLRemoteParcelInfoProcessor::processParcelInfoReply(LLMessageSystem* msg, v
{
observers.erase(*i);
}
+
+ LLUrlEntryParcel::LLParcelData url_data;
+ url_data.parcel_id = parcel_data.parcel_id;
+ url_data.name = parcel_data.name;
+ url_data.sim_name = parcel_data.sim_name;
+ url_data.global_x = parcel_data.global_x;
+ url_data.global_y = parcel_data.global_y;
+ url_data.global_z = parcel_data.global_z;
+
+ // Pass the parcel data to LLUrlEntryParcel to render
+ // human readable parcel name.
+ LLUrlEntryParcel::processParcelInfo(url_data);
}
void LLRemoteParcelInfoProcessor::sendParcelInfoRequest(const LLUUID& parcel_id)
diff --git a/indra/newview/llrootview.h b/indra/newview/llrootview.h
index 4b1ba15a0b..5223a314f3 100644
--- a/indra/newview/llrootview.h
+++ b/indra/newview/llrootview.h
@@ -42,27 +42,5 @@ public:
LLRootView(const Params& p)
: LLView(p)
{}
-
- // added to provide possibility to handle mouse click event inside all application
- // window without creating any floater
- typedef boost::signals2::signal<void(S32 x, S32 y, MASK mask)>
- mouse_signal_t;
-
- private:
- mouse_signal_t mMouseDownSignal;
-
- public:
- /*virtual*/
- BOOL handleMouseDown(S32 x, S32 y, MASK mask)
- {
- mMouseDownSignal(x, y, mask);
- return LLView::handleMouseDown(x, y, mask);
- }
-
- boost::signals2::connection addMouseDownCallback(
- const mouse_signal_t::slot_type& cb)
- {
- return mMouseDownSignal.connect(cb);
- }
};
#endif //LL_LLROOTVIEW_H
diff --git a/indra/newview/llsceneview.cpp b/indra/newview/llsceneview.cpp
new file mode 100644
index 0000000000..09e799e4f7
--- /dev/null
+++ b/indra/newview/llsceneview.cpp
@@ -0,0 +1,438 @@
+/**
+ * @file llsceneview.cpp
+ * @brief LLSceneView class implementation
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llsceneview.h"
+#include "llviewerwindow.h"
+#include "pipeline.h"
+#include "llviewerobjectlist.h"
+#include "llviewerregion.h"
+#include "llagent.h"
+#include "llvolumemgr.h"
+
+LLSceneView* gSceneView = NULL;
+
+//borrow this helper function from llfasttimerview.cpp
+template <class VEC_TYPE>
+void removeOutliers(std::vector<VEC_TYPE>& data, F32 k);
+
+
+LLSceneView::LLSceneView(const LLRect& rect)
+ : LLFloater(LLSD())
+{
+ setRect(rect);
+ setVisible(FALSE);
+
+ setCanMinimize(false);
+ setCanClose(true);
+}
+
+void LLSceneView::onClickCloseBtn()
+{
+ setVisible(false);
+}
+
+
+void LLSceneView::draw()
+{
+ S32 margin = 10;
+ S32 height = (S32) (gViewerWindow->getWindowRectScaled().getHeight()*0.75f);
+ S32 width = (S32) (gViewerWindow->getWindowRectScaled().getWidth() * 0.75f);
+
+ LLRect new_rect;
+ new_rect.setLeftTopAndSize(getRect().mLeft, getRect().mTop, width, height);
+ setRect(new_rect);
+
+ // Draw the window background
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+ gl_rect_2d(0, getRect().getHeight(), getRect().getWidth(), 0, LLColor4(0.f, 0.f, 0.f, 0.25f));
+
+
+ //aggregate some statistics
+
+ //object sizes
+ std::vector<F32> size[2];
+
+ //triangle counts
+ std::vector<S32> triangles[2];
+ std::vector<S32> visible_triangles[2];
+ S32 total_visible_triangles[] = {0, 0};
+ S32 total_triangles[] = {0, 0};
+
+ S32 total_visible_bytes[] = {0, 0};
+ S32 total_bytes[] = {0, 0};
+
+ //streaming cost
+ std::vector<F32> streaming_cost[2];
+ F32 total_streaming[] = { 0.f, 0.f };
+
+ //physics cost
+ std::vector<F32> physics_cost[2];
+ F32 total_physics[] = { 0.f, 0.f };
+
+
+ U32 object_count = 0;
+
+ LLViewerRegion* region = gAgent.getRegion();
+ if (region)
+ {
+ for (U32 i = 0; i < gObjectList.getNumObjects(); ++i)
+ {
+ LLViewerObject* object = gObjectList.getObject(i);
+
+ if (object &&
+ object->getVolume()&&
+ object->getRegion() == region)
+ {
+ U32 idx = object->isAttachment() ? 1 : 0;
+
+ LLVolume* volume = object->getVolume();
+ object_count++;
+
+ F32 radius = object->getScale().magVec();
+ size[idx].push_back(radius);
+
+ S32 visible = volume->getNumTriangles();
+ S32 high_triangles = object->getHighLODTriangleCount();
+
+ total_visible_triangles[idx] += visible;
+ total_triangles[idx] += high_triangles;
+
+ visible_triangles[idx].push_back(visible);
+ triangles[idx].push_back(high_triangles);
+
+ S32 bytes = 0;
+ S32 visible_bytes = 0;
+
+ F32 streaming = object->getStreamingCost(&bytes, &visible_bytes);
+ total_streaming[idx] += streaming;
+ streaming_cost[idx].push_back(streaming);
+
+ F32 physics = object->getPhysicsCost();
+ total_physics[idx] += physics;
+ physics_cost[idx].push_back(physics);
+
+ total_bytes[idx] += bytes;
+ total_visible_bytes[idx] += visible_bytes;
+ }
+ }
+ }
+
+ const char* category[] =
+ {
+ "Region",
+ "Attachment"
+ };
+
+ S32 graph_pos[4];
+
+ for (U32 i = 0; i < 4; ++i)
+ {
+ graph_pos[i] = new_rect.getHeight()/4*(i+1);
+ }
+
+ for (U32 idx = 0; idx < 2; idx++)
+ {
+ if (!size[idx].empty())
+ { //display graph of object sizes
+ std::sort(size[idx].begin(), size[idx].end());
+
+ ll_remove_outliers(size[idx], 1.f);
+
+ LLRect size_rect;
+
+ if (idx == 0)
+ {
+ size_rect = LLRect(margin, graph_pos[0]-margin, new_rect.getWidth()/2-margin, margin*2);
+ }
+ else
+ {
+ size_rect = LLRect(margin+new_rect.getWidth()/2, graph_pos[0]-margin, new_rect.getWidth()-margin, margin*2);
+ }
+
+ gl_rect_2d(size_rect, LLColor4::white, false);
+
+ F32 size_domain[] = { 128.f, 0.f };
+
+ //get domain of sizes
+ for (U32 i = 0; i < size[idx].size(); ++i)
+ {
+ size_domain[0] = llmin(size_domain[0], size[idx][i]);
+ size_domain[1] = llmax(size_domain[1], size[idx][i]);
+ }
+
+ F32 size_range = size_domain[1]-size_domain[0];
+
+ U32 count = size[idx].size();
+
+ F32 total = 0.f;
+
+ gGL.begin(LLRender::LINE_STRIP);
+
+ for (U32 i = 0; i < count; ++i)
+ {
+ F32 rad = size[idx][i];
+ total += rad;
+ F32 y = (rad-size_domain[0])/size_range*size_rect.getHeight()+size_rect.mBottom;
+ F32 x = (F32) i / count * size_rect.getWidth() + size_rect.mLeft;
+
+ gGL.vertex2f(x,y);
+
+ if (i%4096 == 0)
+ {
+ gGL.end();
+ gGL.flush();
+ gGL.begin(LLRender::LINE_STRIP);
+ }
+ }
+
+ gGL.end();
+ gGL.flush();
+
+ std::string label = llformat("%s Object Sizes (m) -- [%.1f, %.1f] Mean: %.1f Median: %.1f -- %d samples",
+ category[idx], size_domain[0], size_domain[1], total/count, size[idx][count/2], count);
+
+ LLFontGL::getFontMonospace()->renderUTF8(label,
+ 0 , size_rect.mLeft, size_rect.mTop+margin, LLColor4::white, LLFontGL::LEFT, LLFontGL::TOP);
+
+ }
+ }
+
+ for (U32 idx = 0; idx < 2; ++idx)
+ {
+ if (!triangles[idx].empty())
+ { //plot graph of visible/total triangles
+ std::sort(triangles[idx].begin(), triangles[idx].end());
+
+ ll_remove_outliers(triangles[idx], 1.f);
+
+ LLRect tri_rect;
+ if (idx == 0)
+ {
+ tri_rect = LLRect(margin, graph_pos[1]-margin, new_rect.getWidth()/2-margin, graph_pos[0]+margin);
+ }
+ else
+ {
+ tri_rect = LLRect(new_rect.getWidth()/2+margin, graph_pos[1]-margin, new_rect.getWidth()-margin, graph_pos[0]+margin);
+ }
+
+ gl_rect_2d(tri_rect, LLColor4::white, false);
+
+ S32 tri_domain[] = { 65536, 0 };
+
+ //get domain of triangle counts
+ for (U32 i = 0; i < triangles[idx].size(); ++i)
+ {
+ tri_domain[0] = llmin(tri_domain[0], triangles[idx][i]);
+ tri_domain[1] = llmax(tri_domain[1], triangles[idx][i]);
+ }
+
+ U32 triangle_range = tri_domain[1]-tri_domain[0];
+
+ U32 count = triangles[idx].size();
+
+ U32 total = 0;
+
+ gGL.begin(LLRender::LINE_STRIP);
+ //plot triangles
+ for (U32 i = 0; i < count; ++i)
+ {
+ U32 tri_count = triangles[idx][i];
+ total += tri_count;
+ F32 y = (F32) (tri_count-tri_domain[0])/triangle_range*tri_rect.getHeight()+tri_rect.mBottom;
+ F32 x = (F32) i / count * tri_rect.getWidth() + tri_rect.mLeft;
+
+ gGL.vertex2f(x,y);
+
+ if (i%4096 == 0)
+ {
+ gGL.end();
+ gGL.flush();
+ gGL.begin(LLRender::LINE_STRIP);
+ }
+ }
+
+ gGL.end();
+ gGL.flush();
+
+ U32 total_visible = 0;
+ count = visible_triangles[idx].size();
+
+ for (U32 i = 0; i < count; ++i)
+ {
+ U32 tri_count = visible_triangles[idx][i];
+ total_visible += tri_count;
+ }
+
+ std::string label = llformat("%s Object Triangle Counts (Ktris) -- Visible: %.2f/%.2f (%.2f KB Visible)",
+ category[idx], total_visible_triangles[idx]/1024.f, total_triangles[idx]/1024.f, total_visible_bytes[idx]/1024.f);
+
+ LLFontGL::getFontMonospace()->renderUTF8(label,
+ 0 , tri_rect.mLeft, tri_rect.mTop+margin, LLColor4::white, LLFontGL::LEFT, LLFontGL::TOP);
+
+ }
+ }
+
+ for (U32 idx = 0; idx < 2; ++idx)
+ {
+ if (!streaming_cost[idx].empty())
+ { //plot graph of streaming cost
+ std::sort(streaming_cost[idx].begin(), streaming_cost[idx].end());
+
+ ll_remove_outliers(streaming_cost[idx], 1.f);
+
+ LLRect tri_rect;
+ if (idx == 0)
+ {
+ tri_rect = LLRect(margin, graph_pos[2]-margin, new_rect.getWidth()/2-margin, graph_pos[1]+margin);
+ }
+ else
+ {
+ tri_rect = LLRect(new_rect.getWidth()/2+margin, graph_pos[2]-margin, new_rect.getWidth()-margin, graph_pos[1]+margin);
+ }
+
+ gl_rect_2d(tri_rect, LLColor4::white, false);
+
+ F32 streaming_domain[] = { 65536, 0 };
+
+ //get domain of triangle counts
+ for (U32 i = 0; i < streaming_cost[idx].size(); ++i)
+ {
+ streaming_domain[0] = llmin(streaming_domain[0], streaming_cost[idx][i]);
+ streaming_domain[1] = llmax(streaming_domain[1], streaming_cost[idx][i]);
+ }
+
+ F32 cost_range = streaming_domain[1]-streaming_domain[0];
+
+ U32 count = streaming_cost[idx].size();
+
+ F32 total = 0;
+
+ gGL.begin(LLRender::LINE_STRIP);
+ //plot triangles
+ for (U32 i = 0; i < count; ++i)
+ {
+ F32 sc = streaming_cost[idx][i];
+ total += sc;
+ F32 y = (F32) (sc-streaming_domain[0])/cost_range*tri_rect.getHeight()+tri_rect.mBottom;
+ F32 x = (F32) i / count * tri_rect.getWidth() + tri_rect.mLeft;
+
+ gGL.vertex2f(x,y);
+
+ if (i%4096 == 0)
+ {
+ gGL.end();
+ gGL.flush();
+ gGL.begin(LLRender::LINE_STRIP);
+ }
+ }
+
+ gGL.end();
+ gGL.flush();
+
+ std::string label = llformat("%s Object Streaming Cost -- [%.2f, %.2f] Mean: %.2f Total: %.2f",
+ category[idx], streaming_domain[0], streaming_domain[1], total/count, total_streaming[idx]);
+
+ LLFontGL::getFontMonospace()->renderUTF8(label,
+ 0 , tri_rect.mLeft, tri_rect.mTop+margin, LLColor4::white, LLFontGL::LEFT, LLFontGL::TOP);
+
+ }
+ }
+
+ for (U32 idx = 0; idx < 2; ++idx)
+ {
+ if (!physics_cost[idx].empty())
+ { //plot graph of physics cost
+ std::sort(physics_cost[idx].begin(), physics_cost[idx].end());
+
+ ll_remove_outliers(physics_cost[idx], 1.f);
+
+ LLRect tri_rect;
+ if (idx == 0)
+ {
+ tri_rect = LLRect(margin, graph_pos[3]-margin, new_rect.getWidth()/2-margin, graph_pos[2]+margin);
+ }
+ else
+ {
+ tri_rect = LLRect(new_rect.getWidth()/2+margin, graph_pos[3]-margin, new_rect.getWidth()-margin, graph_pos[2]+margin);
+ }
+
+ gl_rect_2d(tri_rect, LLColor4::white, false);
+
+ F32 physics_domain[] = { 65536, 0 };
+
+ //get domain of triangle counts
+ for (U32 i = 0; i < physics_cost[idx].size(); ++i)
+ {
+ physics_domain[0] = llmin(physics_domain[0], physics_cost[idx][i]);
+ physics_domain[1] = llmax(physics_domain[1], physics_cost[idx][i]);
+ }
+
+ F32 cost_range = physics_domain[1]-physics_domain[0];
+
+ U32 count = physics_cost[idx].size();
+
+ F32 total = 0;
+
+ gGL.begin(LLRender::LINE_STRIP);
+ //plot triangles
+ for (U32 i = 0; i < count; ++i)
+ {
+ F32 pc = physics_cost[idx][i];
+ total += pc;
+ F32 y = (F32) (pc-physics_domain[0])/cost_range*tri_rect.getHeight()+tri_rect.mBottom;
+ F32 x = (F32) i / count * tri_rect.getWidth() + tri_rect.mLeft;
+
+ gGL.vertex2f(x,y);
+
+ if (i%4096 == 0)
+ {
+ gGL.end();
+ gGL.flush();
+ gGL.begin(LLRender::LINE_STRIP);
+ }
+ }
+
+ gGL.end();
+ gGL.flush();
+
+ std::string label = llformat("%s Object Physics Cost -- [%.2f, %.2f] Mean: %.2f Total: %.2f",
+ category[idx], physics_domain[0], physics_domain[1], total/count, total_physics[idx]);
+
+ LLFontGL::getFontMonospace()->renderUTF8(label,
+ 0 , tri_rect.mLeft, tri_rect.mTop+margin, LLColor4::white, LLFontGL::LEFT, LLFontGL::TOP);
+
+ }
+ }
+
+
+
+
+ LLView::draw();
+}
+
+
diff --git a/indra/newview/llsceneview.h b/indra/newview/llsceneview.h
new file mode 100644
index 0000000000..2a3a14bbee
--- /dev/null
+++ b/indra/newview/llsceneview.h
@@ -0,0 +1,48 @@
+/**
+ * @file llsceneview.h
+ * @brief LLSceneView class header file
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLSCENEVIEW_H
+#define LL_LLSCENEVIEW_H
+
+#include "llfloater.h"
+
+
+class LLSceneView : public LLFloater
+{
+public:
+ LLSceneView(const LLRect& rect);
+
+ virtual void draw();
+
+protected:
+ virtual void onClickCloseBtn();
+
+
+};
+
+extern LLSceneView* gSceneView;
+
+#endif // LL_LLSCENEVIEW_H
diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp
index 61f4897ed0..d340b304ca 100644
--- a/indra/newview/llscreenchannel.cpp
+++ b/indra/newview/llscreenchannel.cpp
@@ -41,7 +41,7 @@
#include "llsyswellwindow.h"
#include "llimfloater.h"
#include "llscriptfloater.h"
-#include "llsidetray.h"
+#include "llrootview.h"
#include <algorithm>
@@ -49,76 +49,101 @@ using namespace LLNotificationsUI;
bool LLScreenChannel::mWasStartUpToastShown = false;
+LLFastTimer::DeclareTimer FTM_GET_CHANNEL_RECT("Calculate Notification Channel Region");
+LLRect LLScreenChannelBase::getChannelRect()
+{
+ LLFastTimer _(FTM_GET_CHANNEL_RECT);
+
+ if (mFloaterSnapRegion == NULL)
+ {
+ mFloaterSnapRegion = gViewerWindow->getRootView()->getChildView("floater_snap_region");
+ }
+
+ if (mChicletRegion == NULL)
+ {
+ mChicletRegion = gViewerWindow->getRootView()->getChildView("chiclet_container");
+ }
+
+ LLRect channel_rect;
+ LLRect chiclet_rect;
+
+ mFloaterSnapRegion->localRectToScreen(mFloaterSnapRegion->getLocalRect(), &channel_rect);
+ mChicletRegion->localRectToScreen(mChicletRegion->getLocalRect(), &chiclet_rect);
+
+ channel_rect.mTop = chiclet_rect.mBottom;
+ return channel_rect;
+}
+
+
//--------------------------------------------------------------------------
//////////////////////
// LLScreenChannelBase
//////////////////////
-LLScreenChannelBase::LLScreenChannelBase(const LLUUID& id) :
- mToastAlignment(NA_BOTTOM)
- ,mCanStoreToasts(true)
- ,mHiddenToastsNum(0)
- ,mHoveredToast(NULL)
- ,mControlHovering(false)
- ,mShowToasts(true)
-{
- mID = id;
- mWorldViewRectConnection = gViewerWindow->setOnWorldViewRectUpdated(boost::bind(&LLScreenChannelBase::updatePositionAndSize, this, _1, _2));
+LLScreenChannelBase::LLScreenChannelBase(const Params& p)
+: LLUICtrl(p),
+ mToastAlignment(p.toast_align),
+ mCanStoreToasts(true),
+ mHiddenToastsNum(0),
+ mHoveredToast(NULL),
+ mControlHovering(false),
+ mShowToasts(true),
+ mID(p.id),
+ mDisplayToastsAlways(p.display_toasts_always),
+ mChannelAlignment(p.channel_align),
+ mFloaterSnapRegion(NULL),
+ mChicletRegion(NULL)
+{
+ mID = p.id;
setMouseOpaque( false );
setVisible(FALSE);
}
-LLScreenChannelBase::~LLScreenChannelBase()
-{
- mWorldViewRectConnection.disconnect();
-}
-bool LLScreenChannelBase::isHovering()
+BOOL LLScreenChannelBase::postBuild()
{
- if (!mHoveredToast)
+ if (mFloaterSnapRegion == NULL)
{
- return false;
+ mFloaterSnapRegion = gViewerWindow->getRootView()->getChildView("floater_snap_region");
}
-
- return mHoveredToast->isHovered();
+
+ if (mChicletRegion == NULL)
+ {
+ mChicletRegion = gViewerWindow->getRootView()->getChildView("chiclet_container");
+ }
+
+ return TRUE;
}
-bool LLScreenChannelBase::resetPositionAndSize(const LLSD& newvalue)
+void LLScreenChannelBase::reshape(S32 width, S32 height, BOOL called_from_parent)
{
- LLRect rc = gViewerWindow->getWorldViewRectScaled();
- updatePositionAndSize(rc, rc);
- return true;
+ redrawToasts();
}
-void LLScreenChannelBase::updatePositionAndSize(LLRect old_world_rect, LLRect new_world_rect)
+bool LLScreenChannelBase::isHovering()
{
- /*
- take sidetray into account - screenchannel should not overlap sidetray
- */
- S32 world_rect_padding = 0;
- if (gSavedSettings.getBOOL("SidebarCameraMovement") == FALSE
- && LLSideTray::instanceCreated ())
+ if (!mHoveredToast)
{
- LLSideTray* side_bar = LLSideTray::getInstance();
-
- if (side_bar->getVisible() && !side_bar->getCollapsed())
- world_rect_padding += side_bar->getRect().getWidth();
+ return false;
}
+ return mHoveredToast->isHovered();
+}
- S32 top_delta = old_world_rect.mTop - new_world_rect.mTop;
+void LLScreenChannelBase::updatePositionAndSize(LLRect rect)
+{
LLRect this_rect = getRect();
- this_rect.mTop -= top_delta;
+ this_rect.mTop = rect.mTop;
switch(mChannelAlignment)
{
case CA_LEFT :
break;
case CA_CENTRE :
- this_rect.setCenterAndSize( (new_world_rect.getWidth() - world_rect_padding) / 2, new_world_rect.getHeight() / 2, this_rect.getWidth(), this_rect.getHeight());
+ this_rect.setCenterAndSize( (rect.getWidth()) / 2, rect.getHeight() / 2, this_rect.getWidth(), this_rect.getHeight());
break;
case CA_RIGHT :
- this_rect.setLeftTopAndSize(new_world_rect.mRight - world_rect_padding - this_rect.getWidth(),
+ this_rect.setLeftTopAndSize(rect.mRight - this_rect.getWidth(),
this_rect.mTop,
this_rect.getWidth(),
this_rect.getHeight());
@@ -130,16 +155,19 @@ void LLScreenChannelBase::updatePositionAndSize(LLRect old_world_rect, LLRect ne
void LLScreenChannelBase::init(S32 channel_left, S32 channel_right)
{
- if(LLSideTray::instanceCreated())
- {
- LLSideTray* side_bar = LLSideTray::getInstance();
- side_bar->getCollapseSignal().connect(boost::bind(&LLScreenChannelBase::resetPositionAndSize, this, _2));
- }
+ // top and bottom set by updateRect()
+ setRect(LLRect(channel_left, 0, channel_right, 0));
+ updateRect();
+ setVisible(TRUE);
+}
- S32 channel_top = gViewerWindow->getWorldViewRectScaled().getHeight();
- S32 channel_bottom = gViewerWindow->getWorldViewRectScaled().mBottom + gSavedSettings.getS32("ChannelBottomPanelMargin");
+void LLScreenChannelBase::updateRect()
+{
+ S32 channel_top = getChannelRect().mTop;
+ S32 channel_bottom = getChannelRect().mBottom + gSavedSettings.getS32("ChannelBottomPanelMargin");
+ S32 channel_left = getRect().mLeft;
+ S32 channel_right = getRect().mRight;
setRect(LLRect(channel_left, channel_top, channel_right, channel_bottom));
- setVisible(TRUE);
}
//--------------------------------------------------------------------------
@@ -147,18 +175,18 @@ void LLScreenChannelBase::init(S32 channel_left, S32 channel_right)
// LLScreenChannel
//////////////////////
//--------------------------------------------------------------------------
-LLScreenChannel::LLScreenChannel(LLUUID& id):
-LLScreenChannelBase(id)
-,mStartUpToastPanel(NULL)
-{
+LLScreenChannel::LLScreenChannel(const Params& p)
+: LLScreenChannelBase(p),
+ mStartUpToastPanel(NULL)
+{
}
//--------------------------------------------------------------------------
void LLScreenChannel::init(S32 channel_left, S32 channel_right)
{
LLScreenChannelBase::init(channel_left, channel_right);
- LLRect world_rect = gViewerWindow->getWorldViewRectScaled();
- updatePositionAndSize(world_rect, world_rect);
+ LLRect channel_rect = getChannelRect();
+ updatePositionAndSize(channel_rect);
}
//--------------------------------------------------------------------------
@@ -167,17 +195,18 @@ LLScreenChannel::~LLScreenChannel()
}
-std::list<LLToast*> LLScreenChannel::findToasts(const Matcher& matcher)
+std::list<const LLToast*> LLScreenChannel::findToasts(const Matcher& matcher)
{
- std::list<LLToast*> res;
+ std::list<const LLToast*> res;
// collect stored toasts
for (std::vector<ToastElem>::iterator it = mStoredToastList.begin(); it
!= mStoredToastList.end(); it++)
{
- if (matcher.matches(it->toast->getNotification()))
+ const LLToast* toast = it->getToast();
+ if (toast && matcher.matches(toast->getNotification()))
{
- res.push_back(it->toast);
+ res.push_back(toast);
}
}
@@ -185,9 +214,10 @@ std::list<LLToast*> LLScreenChannel::findToasts(const Matcher& matcher)
for (std::vector<ToastElem>::iterator it = mToastList.begin(); it
!= mToastList.end(); it++)
{
- if (matcher.matches(it->toast->getNotification()))
+ const LLToast* toast = it->getToast();
+ if (toast && matcher.matches(toast->getNotification()))
{
- res.push_back(it->toast);
+ res.push_back(toast);
}
}
@@ -195,22 +225,8 @@ std::list<LLToast*> LLScreenChannel::findToasts(const Matcher& matcher)
}
//--------------------------------------------------------------------------
-void LLScreenChannel::updatePositionAndSize(LLRect old_world_rect, LLRect new_world_rect)
+void LLScreenChannel::updatePositionAndSize(LLRect new_world_rect)
{
- /*
- take sidetray into account - screenchannel should not overlap sidetray
- */
- S32 world_rect_padding = 0;
- if (gSavedSettings.getBOOL("SidebarCameraMovement") == FALSE
- && LLSideTray::instanceCreated ())
- {
- LLSideTray* side_bar = LLSideTray::getInstance();
-
- if (side_bar->getVisible() && !side_bar->getCollapsed())
- world_rect_padding += side_bar->getRect().getWidth();
- }
-
-
LLRect this_rect = getRect();
switch(mChannelAlignment)
@@ -219,11 +235,11 @@ void LLScreenChannel::updatePositionAndSize(LLRect old_world_rect, LLRect new_wo
this_rect.mTop = (S32) (new_world_rect.getHeight() * getHeightRatio());
break;
case CA_CENTRE :
- LLScreenChannelBase::updatePositionAndSize(old_world_rect, new_world_rect);
+ LLScreenChannelBase::updatePositionAndSize(new_world_rect);
return;
case CA_RIGHT :
this_rect.mTop = (S32) (new_world_rect.getHeight() * getHeightRatio());
- this_rect.setLeftTopAndSize(new_world_rect.mRight - world_rect_padding - this_rect.getWidth(),
+ this_rect.setLeftTopAndSize(new_world_rect.mRight - this_rect.getWidth(),
this_rect.mTop,
this_rect.getWidth(),
this_rect.getHeight());
@@ -246,15 +262,16 @@ void LLScreenChannel::addToast(const LLToast::Params& p)
return;
}
- ToastElem new_toast_elem(p);
+ LLToast* toast = new LLToast(p);
+ ToastElem new_toast_elem(toast->getHandle());
- new_toast_elem.toast->setOnFadeCallback(boost::bind(&LLScreenChannel::onToastFade, this, _1));
- new_toast_elem.toast->setOnToastDestroyedCallback(boost::bind(&LLScreenChannel::onToastDestroyed, this, _1));
+ toast->setOnFadeCallback(boost::bind(&LLScreenChannel::onToastFade, this, _1));
+ toast->setOnToastDestroyedCallback(boost::bind(&LLScreenChannel::onToastDestroyed, this, _1));
if(mControlHovering)
{
- new_toast_elem.toast->setOnToastHoverCallback(boost::bind(&LLScreenChannel::onToastHover, this, _1, _2));
- new_toast_elem.toast->setMouseEnterCallback(boost::bind(&LLScreenChannel::stopFadingToast, this, new_toast_elem.toast));
- new_toast_elem.toast->setMouseLeaveCallback(boost::bind(&LLScreenChannel::startFadingToast, this, new_toast_elem.toast));
+ toast->setOnToastHoverCallback(boost::bind(&LLScreenChannel::onToastHover, this, _1, _2));
+ toast->setMouseEnterCallback(boost::bind(&LLScreenChannel::stopToastTimer, this, toast));
+ toast->setMouseLeaveCallback(boost::bind(&LLScreenChannel::startToastTimer, this, toast));
}
if(show_toast)
@@ -326,13 +343,13 @@ void LLScreenChannel::onToastFade(LLToast* toast)
//--------------------------------------------------------------------------
void LLScreenChannel::deleteToast(LLToast* toast)
{
- if (toast->isDead())
+ if (!toast || toast->isDead())
{
return;
}
// send signal to observers about destroying of a toast
- toast->mOnDeleteToastSignal(toast);
+ toast->closeToast();
// update channel's Hovering state
// turning hovering off manually because onMouseLeave won't happen if a toast was closed using a keyboard
@@ -340,9 +357,6 @@ void LLScreenChannel::deleteToast(LLToast* toast)
{
mHoveredToast = NULL;
}
-
- // close the toast
- toast->closeFloater();
}
//--------------------------------------------------------------------------
@@ -350,12 +364,16 @@ void LLScreenChannel::deleteToast(LLToast* toast)
void LLScreenChannel::storeToast(ToastElem& toast_elem)
{
// do not store clones
- std::vector<ToastElem>::iterator it = find(mStoredToastList.begin(), mStoredToastList.end(), toast_elem.id);
+ std::vector<ToastElem>::iterator it = find(mStoredToastList.begin(), mStoredToastList.end(), toast_elem.getID());
if( it != mStoredToastList.end() )
return;
- mStoredToastList.push_back(toast_elem);
- mOnStoreToast(toast_elem.toast->getPanel(), toast_elem.id);
+ const LLToast* toast = toast_elem.getToast();
+ if (toast)
+ {
+ mStoredToastList.push_back(toast_elem);
+ mOnStoreToast(toast->getPanel(), toast->getNotificationID());
+ }
}
//--------------------------------------------------------------------------
@@ -368,9 +386,13 @@ void LLScreenChannel::loadStoredToastsToChannel()
for(it = mStoredToastList.begin(); it != mStoredToastList.end(); ++it)
{
- (*it).toast->setIsHidden(false);
- (*it).toast->startFading();
- mToastList.push_back((*it));
+ LLToast* toast = it->getToast();
+ if (toast)
+ {
+ toast->setIsHidden(false);
+ toast->startTimer();
+ mToastList.push_back(*it);
+ }
}
mStoredToastList.clear();
@@ -385,17 +407,19 @@ void LLScreenChannel::loadStoredToastByNotificationIDToChannel(LLUUID id)
if( it == mStoredToastList.end() )
return;
- LLToast* toast = (*it).toast;
-
- if(toast->getVisible())
+ LLToast* toast = it->getToast();
+ if (toast)
{
- // toast is already in channel
- return;
- }
+ if(toast->getVisible())
+ {
+ // toast is already in channel
+ return;
+ }
- toast->setIsHidden(false);
- toast->startFading();
- mToastList.push_back((*it));
+ toast->setIsHidden(false);
+ toast->startTimer();
+ mToastList.push_back(*it);
+ }
redrawToasts();
}
@@ -409,9 +433,19 @@ void LLScreenChannel::removeStoredToastByNotificationID(LLUUID id)
if( it == mStoredToastList.end() )
return;
- LLToast* toast = (*it).toast;
- mStoredToastList.erase(it);
- mRejectToastSignal(toast->getNotificationID());
+ const LLToast* toast = it->getToast();
+ if (toast)
+ {
+ mRejectToastSignal(toast->getNotificationID());
+ }
+
+ // Call find() once more, because the mStoredToastList could have been changed
+ // in mRejectToastSignal callback and the iterator could have become invalid.
+ it = find(mStoredToastList.begin(), mStoredToastList.end(), id);
+ if (it != mStoredToastList.end())
+ {
+ mStoredToastList.erase(it);
+ }
}
//--------------------------------------------------------------------------
@@ -422,21 +456,22 @@ void LLScreenChannel::killToastByNotificationID(LLUUID id)
if( it != mToastList.end())
{
- LLToast* toast = (*it).toast;
+ LLToast* toast = it->getToast();
// if it is a notification toast and notification is UnResponded - then respond on it
// else - simply destroy a toast
//
// NOTE: if a notification is unresponded this function will be called twice for the same toast.
// At first, the notification will be discarded, at second (it will be caused by discarding),
// the toast will be destroyed.
- if(toast->isNotificationValid())
+ if(toast && toast->isNotificationValid())
{
mRejectToastSignal(toast->getNotificationID());
}
else
{
- mToastList.erase(it);
+
deleteToast(toast);
+ mToastList.erase(it);
redrawToasts();
}
return;
@@ -445,20 +480,31 @@ void LLScreenChannel::killToastByNotificationID(LLUUID id)
// searching among stored toasts
it = find(mStoredToastList.begin(), mStoredToastList.end(), id);
- if( it != mStoredToastList.end() )
+ if (it != mStoredToastList.end())
+ {
+ LLToast* toast = it->getToast();
+ if (toast)
+ {
+ // send signal to a listener to let him perform some action on toast rejecting
+ mRejectToastSignal(toast->getNotificationID());
+ deleteToast(toast);
+ }
+ }
+
+ // Call find() once more, because the mStoredToastList could have been changed
+ // in mRejectToastSignal callback and the iterator could have become invalid.
+ it = find(mStoredToastList.begin(), mStoredToastList.end(), id);
+ if (it != mStoredToastList.end())
{
- LLToast* toast = (*it).toast;
mStoredToastList.erase(it);
- // send signal to a listener to let him perform some action on toast rejecting
- mRejectToastSignal(toast->getNotificationID());
- deleteToast(toast);
}
+
}
void LLScreenChannel::killMatchedToasts(const Matcher& matcher)
{
- std::list<LLToast*> to_delete = findToasts(matcher);
- for (std::list<LLToast*>::iterator it = to_delete.begin(); it
+ std::list<const LLToast*> to_delete = findToasts(matcher);
+ for (std::list<const LLToast*>::iterator it = to_delete.begin(); it
!= to_delete.end(); it++)
{
killToastByNotificationID((*it)-> getNotificationID());
@@ -472,12 +518,15 @@ void LLScreenChannel::modifyToastByNotificationID(LLUUID id, LLPanel* panel)
if( it != mToastList.end() && panel)
{
- LLToast* toast = (*it).toast;
- LLPanel* old_panel = toast->getPanel();
- toast->removeChild(old_panel);
- delete old_panel;
- toast->insertPanel(panel);
- toast->startFading();
+ LLToast* toast = it->getToast();
+ if (toast)
+ {
+ LLPanel* old_panel = toast->getPanel();
+ toast->removeChild(old_panel);
+ delete old_panel;
+ toast->insertPanel(panel);
+ toast->startTimer();
+ }
redrawToasts();
}
}
@@ -485,7 +534,14 @@ void LLScreenChannel::modifyToastByNotificationID(LLUUID id, LLPanel* panel)
//--------------------------------------------------------------------------
void LLScreenChannel::redrawToasts()
{
- if(mToastList.size() == 0 || isHovering())
+ if (!getParent())
+ {
+ // connect to floater snap region just to get resize events, we don't care about being a proper widget
+ mFloaterSnapRegion->addChild(this);
+ setFollows(FOLLOWS_ALL);
+ }
+
+ if(mToastList.size() == 0)
return;
switch(mToastAlignment)
@@ -511,22 +567,37 @@ void LLScreenChannel::showToastsBottom()
S32 toast_margin = 0;
std::vector<ToastElem>::reverse_iterator it;
+ updateRect();
+
LLDockableFloater* floater = dynamic_cast<LLDockableFloater*>(LLDockableFloater::getInstanceHandle().get());
for(it = mToastList.rbegin(); it != mToastList.rend(); ++it)
{
if(it != mToastList.rbegin())
{
- LLToast* toast = (*(it-1)).toast;
+ LLToast* toast = (it-1)->getToast();
+ if (!toast)
+ {
+ llwarns << "Attempt to display a deleted toast." << llendl;
+ return;
+ }
+
bottom = toast->getRect().mTop - toast->getTopPad();
toast_margin = gSavedSettings.getS32("ToastGap");
}
- toast_rect = (*it).toast->getRect();
+ LLToast* toast = it->getToast();
+ if(!toast)
+ {
+ llwarns << "Attempt to display a deleted toast." << llendl;
+ return;
+ }
+
+ toast_rect = toast->getRect();
toast_rect.setOriginAndSize(getRect().mRight - toast_rect.getWidth(),
bottom + toast_margin, toast_rect.getWidth(),
toast_rect.getHeight());
- (*it).toast->setRect(toast_rect);
+ toast->setRect(toast_rect);
if(floater && floater->overlapsScreenChannel())
{
@@ -538,24 +609,24 @@ void LLScreenChannel::showToastsBottom()
{
shift += floater->getDockControl()->getTongueHeight();
}
- (*it).toast->translate(0, shift);
+ toast->translate(0, shift);
}
- LLRect world_rect = gViewerWindow->getWorldViewRectScaled();
+ LLRect channel_rect = getChannelRect();
// don't show toasts if there is not enough space
- if(toast_rect.mTop > world_rect.mTop)
+ if(toast_rect.mTop > channel_rect.mTop)
{
break;
}
}
- bool stop_showing_toasts = (*it).toast->getRect().mTop > getRect().mTop;
+ bool stop_showing_toasts = toast->getRect().mTop > getRect().mTop;
if(!stop_showing_toasts)
{
if( it != mToastList.rend()-1)
{
- S32 toast_top = (*it).toast->getRect().mTop + gSavedSettings.getS32("ToastGap");
+ S32 toast_top = toast->getRect().mTop + gSavedSettings.getS32("ToastGap");
stop_showing_toasts = toast_top > getRect().mTop;
}
}
@@ -569,61 +640,191 @@ void LLScreenChannel::showToastsBottom()
if(stop_showing_toasts)
break;
- if( !(*it).toast->getVisible() )
+ if( !toast->getVisible() )
{
// HACK
// EXT-2653: it is necessary to prevent overlapping for secondary showed toasts
- (*it).toast->setVisible(TRUE);
+ toast->setVisible(TRUE);
}
- if(!(*it).toast->hasFocus())
+ if(!toast->hasFocus())
{
// Fixing Z-order of toasts (EXT-4862)
// Next toast will be positioned under this one.
- gFloaterView->sendChildToBack((*it).toast);
+ gFloaterView->sendChildToBack(toast);
}
}
+ // Dismiss toasts we don't have space for (STORM-391).
if(it != mToastList.rend())
{
mHiddenToastsNum = 0;
for(; it != mToastList.rend(); it++)
{
- (*it).toast->stopFading();
- (*it).toast->setVisible(FALSE);
- mHiddenToastsNum++;
+ LLToast* toast = it->getToast();
+ if (toast)
+ {
+ toast->hide();
+ }
}
}
- else
- {
- closeOverflowToastPanel();
- }
}
//--------------------------------------------------------------------------
void LLScreenChannel::showToastsCentre()
{
- LLRect toast_rect;
- S32 bottom = (getRect().mTop - getRect().mBottom)/2 + mToastList[0].toast->getRect().getHeight()/2;
+ LLToast* toast = mToastList[0].getToast();
+ if (!toast)
+ {
+ llwarns << "Attempt to display a deleted toast." << llendl;
+ return;
+ }
+
+ LLRect toast_rect;
+ S32 bottom = (getRect().mTop - getRect().mBottom)/2 + toast->getRect().getHeight()/2;
std::vector<ToastElem>::reverse_iterator it;
for(it = mToastList.rbegin(); it != mToastList.rend(); ++it)
{
- toast_rect = (*it).toast->getRect();
+ LLToast* toast = it->getToast();
+ if (!toast)
+ {
+ llwarns << "Attempt to display a deleted toast." << llendl;
+ return;
+ }
+
+ toast_rect = toast->getRect();
toast_rect.setLeftTopAndSize(getRect().mLeft - toast_rect.getWidth() / 2, bottom + toast_rect.getHeight() / 2 + gSavedSettings.getS32("ToastGap"), toast_rect.getWidth() ,toast_rect.getHeight());
- (*it).toast->setRect(toast_rect);
+ toast->setRect(toast_rect);
- (*it).toast->setVisible(TRUE);
+ toast->setVisible(TRUE);
}
}
//--------------------------------------------------------------------------
void LLScreenChannel::showToastsTop()
{
+ LLRect channel_rect = getChannelRect();
+
+ LLRect toast_rect;
+ S32 top = channel_rect.mTop;
+ S32 toast_margin = 0;
+ std::vector<ToastElem>::reverse_iterator it;
+
+ updateRect();
+
+ LLDockableFloater* floater = dynamic_cast<LLDockableFloater*>(LLDockableFloater::getInstanceHandle().get());
+
+ for(it = mToastList.rbegin(); it != mToastList.rend(); ++it)
+ {
+ if(it != mToastList.rbegin())
+ {
+ LLToast* toast = (it-1)->getToast();
+ if (!toast)
+ {
+ llwarns << "Attempt to display a deleted toast." << llendl;
+ return;
+ }
+
+ top = toast->getRect().mBottom - toast->getTopPad();
+ toast_margin = gSavedSettings.getS32("ToastGap");
+ }
+
+ LLToast* toast = it->getToast();
+ if (!toast)
+ {
+ llwarns << "Attempt to display a deleted toast." << llendl;
+ return;
+ }
+
+ toast_rect = toast->getRect();
+ toast_rect.setLeftTopAndSize(channel_rect.mRight - toast_rect.getWidth(),
+ top, toast_rect.getWidth(),
+ toast_rect.getHeight());
+ toast->setRect(toast_rect);
+
+ if(floater && floater->overlapsScreenChannel())
+ {
+ if(it == mToastList.rbegin())
+ {
+ // move first toast above docked floater
+ S32 shift = -floater->getRect().getHeight();
+ if(floater->getDockControl())
+ {
+ shift -= floater->getDockControl()->getTongueHeight();
+ }
+ toast->translate(0, shift);
+ }
+
+ LLRect channel_rect = getChannelRect();
+ // don't show toasts if there is not enough space
+ if(toast_rect.mBottom < channel_rect.mBottom)
+ {
+ break;
+ }
+ }
+
+ bool stop_showing_toasts = toast->getRect().mBottom < channel_rect.mBottom;
+
+ if(!stop_showing_toasts)
+ {
+ if( it != mToastList.rend()-1)
+ {
+ S32 toast_bottom = toast->getRect().mBottom - gSavedSettings.getS32("ToastGap");
+ stop_showing_toasts = toast_bottom < channel_rect.mBottom;
+ }
+ }
+
+ // at least one toast should be visible
+ if(it == mToastList.rbegin())
+ {
+ stop_showing_toasts = false;
+ }
+
+ if(stop_showing_toasts)
+ break;
+
+ if (!toast->getVisible())
+ {
+ // HACK
+ // EXT-2653: it is necessary to prevent overlapping for secondary showed toasts
+ toast->setVisible(TRUE);
+ }
+ if (!toast->hasFocus())
+ {
+ // Fixing Z-order of toasts (EXT-4862)
+ // Next toast will be positioned under this one.
+ gFloaterView->sendChildToBack(toast);
+ }
+ }
+
+ // Dismiss toasts we don't have space for (STORM-391).
+ std::vector<LLToast*> toasts_to_hide;
+ if(it != mToastList.rend())
+ {
+ mHiddenToastsNum = 0;
+ for(; it != mToastList.rend(); it++)
+ {
+ LLToast* toast = it->getToast();
+ if (toast)
+ {
+ toasts_to_hide.push_back(toast);
+ }
+ }
+ }
+
+ for (std::vector<LLToast*>::iterator it = toasts_to_hide.begin(), end_it = toasts_to_hide.end();
+ it != end_it;
+ ++it)
+ {
+ (*it)->hide();
+ }
}
//--------------------------------------------------------------------------
void LLScreenChannel::createStartUpToast(S32 notif_num, F32 timer)
{
+ LLScreenChannelBase::updateRect();
+
LLRect toast_rect;
LLToast::Params p;
p.lifetime_secs = timer;
@@ -646,13 +847,10 @@ void LLScreenChannel::createStartUpToast(S32 notif_num, F32 timer)
text_box->setValue(text);
text_box->setVisible(TRUE);
- S32 old_height = text_box->getRect().getHeight();
text_box->reshapeToFitText();
text_box->setOrigin(text_box->getRect().mLeft, (wrapper_panel->getRect().getHeight() - text_box->getRect().getHeight())/2);
- S32 new_height = text_box->getRect().getHeight();
- S32 height_delta = new_height - old_height;
- toast_rect.setLeftTopAndSize(0, toast_rect.getHeight() + height_delta +gSavedSettings.getS32("ToastGap"), getRect().getWidth(), toast_rect.getHeight());
+ toast_rect.setLeftTopAndSize(0, getRect().getHeight() - gSavedSettings.getS32("ToastGap"), getRect().getWidth(), toast_rect.getHeight());
mStartUpToastPanel->setRect(toast_rect);
addChild(mStartUpToastPanel);
@@ -697,15 +895,15 @@ void LLScreenChannel::closeStartUpToast()
}
}
-void LLNotificationsUI::LLScreenChannel::stopFadingToast(LLToast* toast)
+void LLNotificationsUI::LLScreenChannel::stopToastTimer(LLToast* toast)
{
if (!toast || toast != mHoveredToast) return;
// Pause fade timer of the hovered toast.
- toast->stopFading();
+ toast->stopTimer();
}
-void LLNotificationsUI::LLScreenChannel::startFadingToast(LLToast* toast)
+void LLNotificationsUI::LLScreenChannel::startToastTimer(LLToast* toast)
{
if (!toast || toast == mHoveredToast)
{
@@ -713,15 +911,24 @@ void LLNotificationsUI::LLScreenChannel::startFadingToast(LLToast* toast)
}
// Reset its fade timer.
- toast->startFading();
+ toast->startTimer();
}
//--------------------------------------------------------------------------
void LLScreenChannel::hideToastsFromScreen()
{
- closeOverflowToastPanel();
for(std::vector<ToastElem>::iterator it = mToastList.begin(); it != mToastList.end(); it++)
- (*it).toast->setVisible(FALSE);
+ {
+ LLToast* toast = it->getToast();
+ if (toast)
+ {
+ toast->setVisible(FALSE);
+ }
+ else
+ {
+ llwarns << "Attempt to hide a deleted toast." << llendl;
+ }
+ }
}
//--------------------------------------------------------------------------
@@ -730,8 +937,15 @@ void LLScreenChannel::hideToast(const LLUUID& notification_id)
std::vector<ToastElem>::iterator it = find(mToastList.begin(), mToastList.end(), notification_id);
if(mToastList.end() != it)
{
- ToastElem te = *it;
- te.toast->hide();
+ LLToast* toast = it->getToast();
+ if (toast)
+ {
+ toast->hide();
+ }
+ else
+ {
+ llwarns << "Attempt to hide a deleted toast." << llendl;
+ }
}
}
@@ -739,24 +953,25 @@ void LLScreenChannel::closeHiddenToasts(const Matcher& matcher)
{
// since we can't guarantee that close toast operation doesn't change mToastList
// we collect matched toasts that should be closed into separate list
- std::list<ToastElem> toasts;
+ std::list<LLToast*> toasts;
for (std::vector<ToastElem>::iterator it = mToastList.begin(); it
!= mToastList.end(); it++)
{
- LLToast * toast = it->toast;
+ LLToast* toast = it->getToast();
// add to list valid toast that match to provided matcher criteria
if (toast != NULL && !toast->isDead() && toast->getNotification() != NULL
&& !toast->getVisible() && matcher.matches(toast->getNotification()))
{
- toasts.push_back(*it);
+ toasts.push_back(toast);
}
}
// close collected toasts
- for (std::list<ToastElem>::iterator it = toasts.begin(); it
+ for (std::list<LLToast*>::iterator it = toasts.begin(); it
!= toasts.end(); it++)
{
- it->toast->closeFloater();
+ LLToast* toast = *it;
+ toast->closeFloater();
}
}
@@ -766,7 +981,7 @@ void LLScreenChannel::removeToastsFromChannel()
hideToastsFromScreen();
for(std::vector<ToastElem>::iterator it = mToastList.begin(); it != mToastList.end(); it++)
{
- deleteToast((*it).toast);
+ deleteToast(it->getToast());
}
mToastList.clear();
}
@@ -780,9 +995,10 @@ void LLScreenChannel::removeAndStoreAllStorableToasts()
hideToastsFromScreen();
for(std::vector<ToastElem>::iterator it = mToastList.begin(); it != mToastList.end();)
{
- if((*it).toast->getCanBeStored())
+ LLToast* toast = it->getToast();
+ if(toast && toast->getCanBeStored())
{
- storeToast(*(it));
+ storeToast(*it);
it = mToastList.erase(it);
}
else
@@ -802,9 +1018,10 @@ void LLScreenChannel::removeToastsBySessionID(LLUUID id)
hideToastsFromScreen();
for(std::vector<ToastElem>::iterator it = mToastList.begin(); it != mToastList.end();)
{
- if((*it).toast->getSessionID() == id)
+ LLToast* toast = it->getToast();
+ if(toast && toast->getSessionID() == id)
{
- deleteToast((*it).toast);
+ deleteToast(toast);
it = mToastList.erase(it);
}
else
@@ -835,8 +1052,7 @@ void LLScreenChannel::onToastHover(LLToast* toast, bool mouse_enter)
}
}
- if(!isHovering())
- redrawToasts();
+ redrawToasts();
}
//--------------------------------------------------------------------------
@@ -850,13 +1066,7 @@ void LLScreenChannel::updateShowToastsState()
return;
}
- S32 channel_bottom = gViewerWindow->getWorldViewRectScaled().mBottom + gSavedSettings.getS32("ChannelBottomPanelMargin");;
- LLRect this_rect = getRect();
-
- if(channel_bottom != this_rect.mBottom)
- {
- setRect(LLRect(this_rect.mLeft, this_rect.mTop, this_rect.mRight, channel_bottom));
- }
+ updateRect();
}
//--------------------------------------------------------------------------
@@ -869,5 +1079,5 @@ LLToast* LLScreenChannel::getToastByNotificationID(LLUUID id)
if (it == mStoredToastList.end())
return NULL;
- return it->toast;
+ return it->getToast();
}
diff --git a/indra/newview/llscreenchannel.h b/indra/newview/llscreenchannel.h
index a1fdd6e32c..56a9cf8b4b 100644
--- a/indra/newview/llscreenchannel.h
+++ b/indra/newview/llscreenchannel.h
@@ -53,22 +53,34 @@ class LLScreenChannelBase : public LLUICtrl
{
friend class LLChannelManager;
public:
- LLScreenChannelBase(const LLUUID& id);
- ~LLScreenChannelBase();
+ struct Params : public LLInitParam::Block<Params, LLUICtrl::Params>
+ {
+ Mandatory<LLUUID> id;
+ Optional<bool> display_toasts_always;
+ Optional<EToastAlignment> toast_align;
+ Optional<EChannelAlignment> channel_align;
+
+ Params()
+ : id("id", LLUUID("")),
+ display_toasts_always("display_toasts_always", false),
+ toast_align("toast_align", NA_BOTTOM),
+ channel_align("channel_align", CA_LEFT)
+ {}
+ };
+
+ LLScreenChannelBase(const Params&);
+
+ BOOL postBuild();
+
+ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
// Channel's outfit-functions
// update channel's size and position in the World View
- virtual void updatePositionAndSize(LLRect old_world_rect, LLRect new_world_rect);
+ virtual void updatePositionAndSize(LLRect rect);
- bool resetPositionAndSize(const LLSD& newvalue);
// initialization of channel's shape and position
virtual void init(S32 channel_left, S32 channel_right);
-
- virtual void setToastAlignment(EToastAlignment align) {mToastAlignment = align;}
-
- virtual void setChannelAlignment(EChannelAlignment align) {mChannelAlignment = align;}
-
// kill or modify a toast by its ID
virtual void killToastByNotificationID(LLUUID id) {};
virtual void modifyToastNotificationByID(LLUUID id, LLSD data) {};
@@ -81,9 +93,6 @@ public:
// show all toasts in a channel
virtual void redrawToasts() {};
- virtual void closeOverflowToastPanel() {};
- virtual void hideOverflowToastPanel() {};
-
// Channel's behavior-functions
// set whether a channel will control hovering inside itself or not
@@ -94,7 +103,6 @@ public:
void setCanStoreToasts(bool store) { mCanStoreToasts = store; }
- void setDisplayToastsAlways(bool display_toasts) { mDisplayToastsAlways = display_toasts; }
bool getDisplayToastsAlways() { return mDisplayToastsAlways; }
// get number of hidden notifications from a channel
@@ -109,11 +117,15 @@ public:
// get ID of a channel
LLUUID getChannelID() { return mID; }
+ LLHandle<LLScreenChannelBase> getHandle() { return getDerivedHandle<LLScreenChannelBase>(); }
protected:
+ void updateRect();
+ LLRect getChannelRect();
+
// Channel's flags
bool mControlHovering;
- LLToast* mHoveredToast;
+ LLToast* mHoveredToast;
bool mCanStoreToasts;
bool mDisplayToastsAlways;
// controls whether a channel shows toasts or not
@@ -126,9 +138,9 @@ protected:
// channel's ID
LLUUID mID;
-
- // store a connection to prevent futher crash that is caused by sending a signal to a destroyed channel
- boost::signals2::connection mWorldViewRectConnection;
+
+ LLView* mFloaterSnapRegion;
+ LLView* mChicletRegion;
};
@@ -139,7 +151,7 @@ class LLScreenChannel : public LLScreenChannelBase
{
friend class LLChannelManager;
public:
- LLScreenChannel(LLUUID& id);
+ LLScreenChannel(const Params&);
virtual ~LLScreenChannel();
class Matcher
@@ -150,11 +162,11 @@ public:
virtual bool matches(const LLNotificationPtr) const = 0;
};
- std::list<LLToast*> findToasts(const Matcher& matcher);
+ std::list<const LLToast*> findToasts(const Matcher& matcher);
// Channel's outfit-functions
// update channel's size and position in the World View
- void updatePositionAndSize(LLRect old_world_rect, LLRect new_world_rect);
+ void updatePositionAndSize(LLRect new_rect);
// initialization of channel's shape and position
void init(S32 channel_left, S32 channel_right);
@@ -194,10 +206,10 @@ public:
/** Stop fading given toast */
- virtual void stopFadingToast(LLToast* toast);
+ virtual void stopToastTimer(LLToast* toast);
/** Start fading given toast */
- virtual void startFadingToast(LLToast* toast);
+ virtual void startToastTimer(LLToast* toast);
// get StartUp Toast's state
static bool getStartUpToastShown() { return mWasStartUpToastShown; }
@@ -225,31 +237,39 @@ public:
reject_tost_signal_t mRejectToastSignal; boost::signals2::connection setOnRejectToastCallback(reject_tost_callback_t cb) { return mRejectToastSignal.connect(cb); }
private:
- struct ToastElem
+ class ToastElem
{
- LLUUID id;
- LLToast* toast;
+ public:
+ ToastElem(const LLHandle<LLToast>& toast) : mToast(toast)
+ {
+ }
- ToastElem(LLToast::Params p) : id(p.notif_id)
+ ToastElem(const ToastElem& toast_elem) : mToast(toast_elem.mToast)
{
- toast = new LLToast(p);
}
- ToastElem(const ToastElem& toast_elem)
+ LLToast* getToast() const
{
- id = toast_elem.id;
- toast = toast_elem.toast;
+ return mToast.get();
+ }
+
+ LLUUID getID() const
+ {
+ return mToast.isDead() ? LLUUID() : mToast.get()->getNotificationID();
}
bool operator == (const LLUUID &id_op) const
{
- return (id == id_op);
+ return (getID() == id_op);
}
bool operator == (LLPanel* panel_op) const
{
- return (toast == panel_op);
+ return (mToast.get() == panel_op);
}
+
+ private:
+ LLHandle<LLToast> mToast;
};
// Channel's handlers
diff --git a/indra/newview/llscriptfloater.cpp b/indra/newview/llscriptfloater.cpp
index 170e23e4c5..6f98be1cb8 100644
--- a/indra/newview/llscriptfloater.cpp
+++ b/indra/newview/llscriptfloater.cpp
@@ -28,9 +28,9 @@
#include "llscriptfloater.h"
#include "llagentcamera.h"
-#include "llbottomtray.h"
#include "llchannelmanager.h"
#include "llchiclet.h"
+#include "llchicletbar.h"
#include "llfloaterreg.h"
#include "lllslconstants.h"
#include "llnotifications.h"
@@ -95,7 +95,7 @@ bool LLScriptFloater::toggle(const LLUUID& notification_id)
show(notification_id);
}
- LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(notification_id, true);
+ LLChicletBar::getInstance()->getChicletPanel()->setChicletToggleState(notification_id, true);
return true;
}
@@ -131,11 +131,6 @@ void LLScriptFloater::setNotificationId(const LLUUID& id)
mObjectId = notification_id_to_object_id(id);
}
-void LLScriptFloater::getAllowedRect(LLRect& rect)
-{
- rect = gViewerWindow->getWorldViewRectScaled();
-}
-
void LLScriptFloater::createForm(const LLUUID& notification_id)
{
// delete old form
@@ -211,7 +206,7 @@ void LLScriptFloater::setVisible(BOOL visible)
if(!visible)
{
- LLIMChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(getNotificationId());
+ LLIMChiclet* chiclet = LLChicletBar::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(getNotificationId());
if(chiclet)
{
chiclet->setToggleState(false);
@@ -224,7 +219,7 @@ void LLScriptFloater::onMouseDown()
if(getNotificationId().notNull())
{
// Remove new message icon
- LLIMChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(getNotificationId());
+ LLIMChiclet* chiclet = LLChicletBar::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(getNotificationId());
if (chiclet == NULL)
{
llerror("Dock chiclet for LLScriptFloater doesn't exist", 0);
@@ -267,7 +262,7 @@ void LLScriptFloater::onFocusLost()
{
if(getNotificationId().notNull())
{
- LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(getNotificationId(), false);
+ LLChicletBar::getInstance()->getChicletPanel()->setChicletToggleState(getNotificationId(), false);
}
}
@@ -276,7 +271,7 @@ void LLScriptFloater::onFocusReceived()
// first focus will be received before setObjectId() call - don't toggle chiclet
if(getNotificationId().notNull())
{
- LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(getNotificationId(), true);
+ LLChicletBar::getInstance()->getChicletPanel()->setChicletToggleState(getNotificationId(), true);
}
}
@@ -284,7 +279,7 @@ void LLScriptFloater::dockToChiclet(bool dock)
{
if (getDockControl() == NULL)
{
- LLChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLChiclet>(getNotificationId());
+ LLChiclet* chiclet = LLChicletBar::getInstance()->getChicletPanel()->findChiclet<LLChiclet>(getNotificationId());
if (chiclet == NULL)
{
llwarns << "Dock chiclet for LLScriptFloater doesn't exist" << llendl;
@@ -292,7 +287,7 @@ void LLScriptFloater::dockToChiclet(bool dock)
}
else
{
- LLBottomTray::getInstance()->getChicletPanel()->scrollToChiclet(chiclet);
+ LLChicletBar::getInstance()->getChicletPanel()->scrollToChiclet(chiclet);
}
// Stop saving position while we dock floater
@@ -300,7 +295,7 @@ void LLScriptFloater::dockToChiclet(bool dock)
setSavePosition(false);
setDockControl(new LLDockControl(chiclet, this, getDockTongue(),
- LLDockControl::TOP, boost::bind(&LLScriptFloater::getAllowedRect, this, _1)));
+ LLDockControl::BOTTOM));
setDocked(dock);
@@ -352,7 +347,7 @@ void LLScriptFloaterManager::onAddNotification(const LLUUID& notification_id)
script_notification_map_t::const_iterator it = findUsingObjectId(object_id);
if(it != mNotifications.end())
{
- LLIMChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(it->first);
+ LLIMChiclet* chiclet = LLChicletBar::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(it->first);
if(chiclet)
{
// Pass the new_message icon state further.
@@ -375,11 +370,11 @@ void LLScriptFloaterManager::onAddNotification(const LLUUID& notification_id)
// Create inventory offer chiclet for offer type notifications
if( OBJ_GIVE_INVENTORY == obj_type )
{
- LLBottomTray::instance().getChicletPanel()->createChiclet<LLInvOfferChiclet>(notification_id);
+ LLChicletBar::instance().getChicletPanel()->createChiclet<LLInvOfferChiclet>(notification_id);
}
else
{
- LLBottomTray::getInstance()->getChicletPanel()->createChiclet<LLScriptChiclet>(notification_id);
+ LLChicletBar::getInstance()->getChicletPanel()->createChiclet<LLScriptChiclet>(notification_id);
}
LLIMWellWindow::getInstance()->addObjectRow(notification_id, set_new_message);
@@ -413,9 +408,16 @@ void LLScriptFloaterManager::onRemoveNotification(const LLUUID& notification_id)
}
// remove related chiclet
- LLBottomTray::getInstance()->getChicletPanel()->removeChiclet(notification_id);
+ if (LLChicletBar::instanceExists())
+ {
+ LLChicletBar::getInstance()->getChicletPanel()->removeChiclet(notification_id);
+ }
- LLIMWellWindow::getInstance()->removeObjectRow(notification_id);
+ LLIMWellWindow* im_well_window = LLIMWellWindow::findInstance();
+ if (im_well_window)
+ {
+ im_well_window->removeObjectRow(notification_id);
+ }
mNotifications.erase(notification_id);
diff --git a/indra/newview/llscriptfloater.h b/indra/newview/llscriptfloater.h
index dc52baa115..70451194b3 100644
--- a/indra/newview/llscriptfloater.h
+++ b/indra/newview/llscriptfloater.h
@@ -30,7 +30,7 @@
#include "lltransientdockablefloater.h"
#include "llnotificationptr.h"
-class LLToastNotifyPanel;
+class LLToastPanel;
/**
* Handles script notifications ("ScriptDialog" and "ScriptDialogGroup")
@@ -185,8 +185,6 @@ protected:
*/
void createForm(const LLUUID& object_id);
- /*virtual*/ void getAllowedRect(LLRect& rect);
-
/**
* Hide all notification toasts.
*/
@@ -206,7 +204,7 @@ protected:
private:
bool isScriptTextbox(LLNotificationPtr notification);
- LLToastNotifyPanel* mScriptForm;
+ LLToastPanel* mScriptForm;
LLUUID mNotificationId;
LLUUID mObjectId;
bool mSaveFloaterPosition;
diff --git a/indra/newview/llscrollingpanelparam.cpp b/indra/newview/llscrollingpanelparam.cpp
index 05b273cd29..05b82ba967 100644
--- a/indra/newview/llscrollingpanelparam.cpp
+++ b/indra/newview/llscrollingpanelparam.cpp
@@ -50,14 +50,9 @@ const S32 LLScrollingPanelParam::PARAM_HINT_HEIGHT = 128;
S32 LLScrollingPanelParam::sUpdateDelayFrames = 0;
LLScrollingPanelParam::LLScrollingPanelParam( const LLPanel::Params& panel_params,
- LLViewerJointMesh* mesh, LLViewerVisualParam* param, BOOL allow_modify, LLWearable* wearable, LLJoint* jointp )
- : LLScrollingPanel( panel_params ),
- mParam(param),
- mAllowModify(allow_modify),
- mWearable(wearable)
+ LLViewerJointMesh* mesh, LLViewerVisualParam* param, BOOL allow_modify, LLWearable* wearable, LLJoint* jointp, BOOL use_hints )
+ : LLScrollingPanelParamBase( panel_params, mesh, param, allow_modify, wearable, jointp, use_hints)
{
- buildFromFile( "panel_scrolling_param.xml");
-
// *HACK To avoid hard coding texture position, lets use border's position for texture.
LLViewBorder* left_border = getChild<LLViewBorder>("left_border");
@@ -73,12 +68,6 @@ LLScrollingPanelParam::LLScrollingPanelParam( const LLPanel::Params& panel_param
mHintMin->setAllowsUpdates( FALSE );
mHintMax->setAllowsUpdates( FALSE );
- getChild<LLUICtrl>("param slider")->setValue(weightToPercent(param->getWeight()));
-
- std::string display_name = LLTrans::getString(param->getDisplayName());
- getChild<LLUICtrl>("param slider")->setLabelArg("[DESC]", display_name);
- getChildView("param slider")->setEnabled(mAllowModify);
- childSetCommitCallback("param slider", LLScrollingPanelParam::onSliderMoved, this);
std::string min_name = LLTrans::getString(param->getMinDisplayName());
std::string max_name = LLTrans::getString(param->getMaxDisplayName());
@@ -112,20 +101,15 @@ LLScrollingPanelParam::~LLScrollingPanelParam()
}
void LLScrollingPanelParam::updatePanel(BOOL allow_modify)
{
- LLViewerVisualParam* param = mHintMin->getVisualParam();
-
if (!mWearable)
{
// not editing a wearable just now, no update necessary
return;
}
- F32 current_weight = mWearable->getVisualParamWeight( param->getID() );
- getChild<LLUICtrl>("param slider")->setValue(weightToPercent( current_weight ) );
+ LLScrollingPanelParamBase::updatePanel(allow_modify);
+
mHintMin->requestUpdate( sUpdateDelayFrames++ );
mHintMax->requestUpdate( sUpdateDelayFrames++ );
-
- mAllowModify = allow_modify;
- getChildView("param slider")->setEnabled(mAllowModify);
getChildView("less")->setEnabled(mAllowModify);
getChildView("more")->setEnabled(mAllowModify);
}
@@ -135,13 +119,17 @@ void LLScrollingPanelParam::setVisible( BOOL visible )
if( getVisible() != visible )
{
LLPanel::setVisible( visible );
- mHintMin->setAllowsUpdates( visible );
- mHintMax->setAllowsUpdates( visible );
+ if (mHintMin)
+ mHintMin->setAllowsUpdates( visible );
+ if (mHintMax)
+ mHintMax->setAllowsUpdates( visible );
if( visible )
{
- mHintMin->setUpdateDelayFrames( sUpdateDelayFrames++ );
- mHintMax->setUpdateDelayFrames( sUpdateDelayFrames++ );
+ if (mHintMin)
+ mHintMin->setUpdateDelayFrames( sUpdateDelayFrames++ );
+ if (mHintMax)
+ mHintMax->setUpdateDelayFrames( sUpdateDelayFrames++ );
}
}
}
@@ -164,13 +152,17 @@ void LLScrollingPanelParam::draw()
getChildView("min param text")->setVisible( FALSE );
getChildView("max param text")->setVisible( FALSE );
LLPanel::draw();
+
+ // If we're in a focused floater, don't apply the floater's alpha to visual param hint,
+ // making its behavior similar to texture controls'.
+ F32 alpha = getTransparencyType() == TT_ACTIVE ? 1.0f : getCurrentTransparency();
// Draw the hints over the "less" and "more" buttons.
gGL.pushUIMatrix();
{
const LLRect& r = mHintMin->getRect();
gGL.translateUI((F32)r.mLeft, (F32)r.mBottom, 0.f);
- mHintMin->draw();
+ mHintMin->draw(alpha);
}
gGL.popUIMatrix();
@@ -178,7 +170,7 @@ void LLScrollingPanelParam::draw()
{
const LLRect& r = mHintMax->getRect();
gGL.translateUI((F32)r.mLeft, (F32)r.mBottom, 0.f);
- mHintMax->draw();
+ mHintMax->draw(alpha);
}
gGL.popUIMatrix();
@@ -192,23 +184,6 @@ void LLScrollingPanelParam::draw()
}
// static
-void LLScrollingPanelParam::onSliderMoved(LLUICtrl* ctrl, void* userdata)
-{
- LLSliderCtrl* slider = (LLSliderCtrl*) ctrl;
- LLScrollingPanelParam* self = (LLScrollingPanelParam*) userdata;
- LLViewerVisualParam* param = self->mParam;
-
- F32 current_weight = self->mWearable->getVisualParamWeight( param->getID() );
- F32 new_weight = self->percentToWeight( (F32)slider->getValue().asReal() );
- if (current_weight != new_weight )
- {
- self->mWearable->setVisualParamWeight( param->getID(), new_weight, FALSE );
- self->mWearable->writeToAvatar();
- gAgentAvatarp->updateVisualParams();
- }
-}
-
-// static
void LLScrollingPanelParam::onSliderMouseDown(LLUICtrl* ctrl, void* userdata)
{
}
@@ -217,7 +192,6 @@ void LLScrollingPanelParam::onSliderMouseDown(LLUICtrl* ctrl, void* userdata)
void LLScrollingPanelParam::onSliderMouseUp(LLUICtrl* ctrl, void* userdata)
{
LLScrollingPanelParam* self = (LLScrollingPanelParam*) userdata;
-
LLVisualParamHint::requestHintUpdates( self->mHintMin, self->mHintMax );
}
diff --git a/indra/newview/llscrollingpanelparam.h b/indra/newview/llscrollingpanelparam.h
index 1cbc64f45a..c7a47d5c7a 100644
--- a/indra/newview/llscrollingpanelparam.h
+++ b/indra/newview/llscrollingpanelparam.h
@@ -28,8 +28,7 @@
#ifndef LL_SCROLLINGPANELPARAM_H
#define LL_SCROLLINGPANELPARAM_H
-#include "llpanel.h"
-#include "llscrollingpanellist.h"
+#include "llscrollingpanelparambase.h"
class LLViewerJointMesh;
class LLViewerVisualParam;
@@ -38,11 +37,11 @@ class LLVisualParamHint;
class LLViewerVisualParam;
class LLJoint;
-class LLScrollingPanelParam : public LLScrollingPanel
+class LLScrollingPanelParam : public LLScrollingPanelParamBase
{
public:
LLScrollingPanelParam( const LLPanel::Params& panel_params,
- LLViewerJointMesh* mesh, LLViewerVisualParam* param, BOOL allow_modify, LLWearable* wearable, LLJoint* jointp );
+ LLViewerJointMesh* mesh, LLViewerVisualParam* param, BOOL allow_modify, LLWearable* wearable, LLJoint* jointp, BOOL use_hints = TRUE );
virtual ~LLScrollingPanelParam();
virtual void draw();
@@ -50,7 +49,6 @@ public:
virtual void updatePanel(BOOL allow_modify);
static void onSliderMouseDown(LLUICtrl* ctrl, void* userdata);
- static void onSliderMoved(LLUICtrl* ctrl, void* userdata);
static void onSliderMouseUp(LLUICtrl* ctrl, void* userdata);
static void onHintMinMouseDown(void* userdata);
@@ -74,7 +72,6 @@ public:
const static S32 PARAM_HINT_HEIGHT;
public:
- LLViewerVisualParam* mParam;
LLPointer<LLVisualParamHint> mHintMin;
LLPointer<LLVisualParamHint> mHintMax;
static S32 sUpdateDelayFrames;
@@ -82,9 +79,7 @@ public:
protected:
LLTimer mMouseDownTimer; // timer for how long mouse has been held down on a hint.
F32 mLastHeldTime;
-
BOOL mAllowModify;
- LLWearable *mWearable;
};
#endif
diff --git a/indra/newview/llscrollingpanelparambase.cpp b/indra/newview/llscrollingpanelparambase.cpp
new file mode 100644
index 0000000000..62e3039d2f
--- /dev/null
+++ b/indra/newview/llscrollingpanelparambase.cpp
@@ -0,0 +1,112 @@
+/**
+ * @file llscrollingpanelparam.cpp
+ * @brief UI panel for a list of visual param panels
+ *
+ * $LicenseInfo:firstyear=2009&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llscrollingpanelparambase.h"
+#include "llviewerjointmesh.h"
+#include "llviewervisualparam.h"
+#include "llwearable.h"
+#include "llviewervisualparam.h"
+#include "lltoolmorph.h"
+#include "lltrans.h"
+#include "llbutton.h"
+#include "llsliderctrl.h"
+#include "llagent.h"
+#include "llviewborder.h"
+#include "llvoavatarself.h"
+
+LLScrollingPanelParamBase::LLScrollingPanelParamBase( const LLPanel::Params& panel_params,
+ LLViewerJointMesh* mesh, LLViewerVisualParam* param, BOOL allow_modify, LLWearable* wearable, LLJoint* jointp, BOOL use_hints)
+ : LLScrollingPanel( panel_params ),
+ mParam(param),
+ mAllowModify(allow_modify),
+ mWearable(wearable)
+{
+ if (use_hints)
+ buildFromFile( "panel_scrolling_param.xml");
+ else
+ buildFromFile( "panel_scrolling_param_base.xml");
+
+ getChild<LLUICtrl>("param slider")->setValue(weightToPercent(param->getWeight()));
+
+ std::string display_name = LLTrans::getString(param->getDisplayName());
+ getChild<LLUICtrl>("param slider")->setLabelArg("[DESC]", display_name);
+ getChildView("param slider")->setEnabled(mAllowModify);
+ childSetCommitCallback("param slider", LLScrollingPanelParamBase::onSliderMoved, this);
+
+ setVisible(FALSE);
+ setBorderVisible( FALSE );
+}
+
+LLScrollingPanelParamBase::~LLScrollingPanelParamBase()
+{
+}
+
+void LLScrollingPanelParamBase::updatePanel(BOOL allow_modify)
+{
+ LLViewerVisualParam* param = mParam;
+
+ if (!mWearable)
+ {
+ // not editing a wearable just now, no update necessary
+ return;
+ }
+
+ F32 current_weight = mWearable->getVisualParamWeight( param->getID() );
+ getChild<LLUICtrl>("param slider")->setValue(weightToPercent( current_weight ) );
+ mAllowModify = allow_modify;
+ getChildView("param slider")->setEnabled(mAllowModify);
+}
+
+// static
+void LLScrollingPanelParamBase::onSliderMoved(LLUICtrl* ctrl, void* userdata)
+{
+ LLSliderCtrl* slider = (LLSliderCtrl*) ctrl;
+ LLScrollingPanelParamBase* self = (LLScrollingPanelParamBase*) userdata;
+ LLViewerVisualParam* param = self->mParam;
+
+ F32 current_weight = self->mWearable->getVisualParamWeight( param->getID() );
+ F32 new_weight = self->percentToWeight( (F32)slider->getValue().asReal() );
+ if (current_weight != new_weight )
+ {
+ self->mWearable->setVisualParamWeight( param->getID(), new_weight, FALSE );
+ self->mWearable->writeToAvatar();
+ gAgentAvatarp->updateVisualParams();
+ }
+}
+
+F32 LLScrollingPanelParamBase::weightToPercent( F32 weight )
+{
+ LLViewerVisualParam* param = mParam;
+ return (weight - param->getMinWeight()) / (param->getMaxWeight() - param->getMinWeight()) * 100.f;
+}
+
+F32 LLScrollingPanelParamBase::percentToWeight( F32 percent )
+{
+ LLViewerVisualParam* param = mParam;
+ return percent / 100.f * (param->getMaxWeight() - param->getMinWeight()) + param->getMinWeight();
+}
diff --git a/indra/newview/llscrollingpanelparambase.h b/indra/newview/llscrollingpanelparambase.h
new file mode 100644
index 0000000000..9538826251
--- /dev/null
+++ b/indra/newview/llscrollingpanelparambase.h
@@ -0,0 +1,62 @@
+/**
+ * @file llscrollingpanelparam.h
+ * @brief the scrolling panel containing a list of visual param
+ * panels
+ *
+ * $LicenseInfo:firstyear=2009&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_SCROLLINGPANELPARAMBASE_H
+#define LL_SCROLLINGPANELPARAMBASE_H
+
+#include "llpanel.h"
+#include "llscrollingpanellist.h"
+
+class LLViewerJointMesh;
+class LLViewerVisualParam;
+class LLWearable;
+class LLVisualParamHint;
+class LLViewerVisualParam;
+class LLJoint;
+
+class LLScrollingPanelParamBase : public LLScrollingPanel
+{
+public:
+ LLScrollingPanelParamBase( const LLPanel::Params& panel_params,
+ LLViewerJointMesh* mesh, LLViewerVisualParam* param, BOOL allow_modify, LLWearable* wearable, LLJoint* jointp, BOOL use_hints = FALSE );
+ virtual ~LLScrollingPanelParamBase();
+
+ virtual void updatePanel(BOOL allow_modify);
+
+ static void onSliderMoved(LLUICtrl* ctrl, void* userdata);
+
+ F32 weightToPercent( F32 weight );
+ F32 percentToWeight( F32 percent );
+
+public:
+ LLViewerVisualParam* mParam;
+protected:
+ BOOL mAllowModify;
+ LLWearable *mWearable;
+};
+
+#endif
diff --git a/indra/newview/llsearchcombobox.cpp b/indra/newview/llsearchcombobox.cpp
index db531b5695..2824c70582 100644
--- a/indra/newview/llsearchcombobox.cpp
+++ b/indra/newview/llsearchcombobox.cpp
@@ -52,10 +52,9 @@ protected:
};
LLSearchComboBox::Params::Params()
-: search_button("search_button")
-, dropdown_button_visible("dropdown_button_visible", false)
-{
-}
+: search_button("search_button"),
+ dropdown_button_visible("dropdown_button_visible", false)
+{}
LLSearchComboBox::LLSearchComboBox(const Params&p)
: LLComboBox(p)
@@ -131,6 +130,9 @@ void LLSearchComboBox::focusTextEntry()
if (mTextEntry)
{
gFocusMgr.setKeyboardFocus(mTextEntry);
+
+ // Let the editor handle editing hotkeys (STORM-431).
+ LLEditMenuHandler::gEditMenuHandler = mTextEntry;
}
}
diff --git a/indra/newview/llsecapi.h b/indra/newview/llsecapi.h
index b65cf37e7f..db57848320 100644
--- a/indra/newview/llsecapi.h
+++ b/indra/newview/llsecapi.h
@@ -132,7 +132,7 @@ protected:
// LLCertificates are considered unmodifiable
// Certificates are pulled out of stores, or created via
// factory calls
-class LLCertificate : public LLRefCount
+class LLCertificate : public LLThreadSafeRefCount
{
LOG_CLASS(LLCertificate);
public:
@@ -160,7 +160,7 @@ public:
// base class for a list of certificates.
-class LLCertificateVector : public LLRefCount
+class LLCertificateVector : public LLThreadSafeRefCount
{
public:
@@ -170,7 +170,7 @@ public:
// base iterator implementation class, providing
// the functionality needed for the iterator class.
- class iterator_impl : public LLRefCount
+ class iterator_impl : public LLThreadSafeRefCount
{
public:
iterator_impl() {};
@@ -286,10 +286,10 @@ bool operator!=(const LLCertificateVector::iterator& _lhs, const LLCertificateVe
#define CRED_AUTHENTICATOR_TYPE_HASH "hash"
//
// LLCredential - interface for credentials providing the following functionality:
-// * persistance of credential information based on grid (for saving username/password)
-// * serialization to an OGP identifier/authenticator pair
+// * Persistence of credential information based on grid (for saving username/password)
+// * Serialization to an OGP identifier/authenticator pair
//
-class LLCredential : public LLRefCount
+class LLCredential : public LLThreadSafeRefCount
{
public:
@@ -424,7 +424,7 @@ protected:
// LLSecAPIHandler Class
// Interface handler class for the various security storage handlers.
-class LLSecAPIHandler : public LLRefCount
+class LLSecAPIHandler : public LLThreadSafeRefCount
{
public:
diff --git a/indra/newview/llsechandler_basic.cpp b/indra/newview/llsechandler_basic.cpp
index 90e8ff0aae..30400a4c6a 100644
--- a/indra/newview/llsechandler_basic.cpp
+++ b/indra/newview/llsechandler_basic.cpp
@@ -1005,6 +1005,8 @@ void LLBasicCertificateStore::validate(int validation_policy,
LLPointer<LLCertificateChain> cert_chain,
const LLSD& validation_params)
{
+ // If --no-verify-ssl-cert was passed on the command line, stop right now.
+ if (gSavedSettings.getBOOL("NoVerifySSLCert")) return;
if(cert_chain->size() < 1)
{
@@ -1209,12 +1211,12 @@ void LLSecAPIBasicHandler::init()
// with the product
std::string ca_file_path = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "CA.pem");
llinfos << "app path " << ca_file_path << llendl;
- LLBasicCertificateStore app_ca_store = LLBasicCertificateStore(ca_file_path);
+ LLPointer<LLBasicCertificateStore> app_ca_store = new LLBasicCertificateStore(ca_file_path);
// push the applicate CA files into the store, therefore adding any new CA certs that
// updated
- for(LLCertificateVector::iterator i = app_ca_store.begin();
- i != app_ca_store.end();
+ for(LLCertificateVector::iterator i = app_ca_store->begin();
+ i != app_ca_store->end();
i++)
{
mStore->add(*i);
@@ -1358,7 +1360,11 @@ void LLSecAPIBasicHandler::_writeProtectedData()
// (even though this file isn't really secure. Perhaps in the future
// it may be, however.
LLFile::remove(tmp_filename);
- throw LLProtectedDataException("Error writing Protected Data Store");
+
+ // EXP-1825 crash in LLSecAPIBasicHandler::_writeProtectedData()
+ // Decided throwing an exception here was overkill until we figure out why this happens
+ //throw LLProtectedDataException("Error writing Protected Data Store");
+ llinfos << "LLProtectedDataException(Error writing Protected Data Store)" << llendl;
}
// move the temporary file to the specified file location.
@@ -1367,7 +1373,11 @@ void LLSecAPIBasicHandler::_writeProtectedData()
(LLFile::rename(tmp_filename, mProtectedDataFilename)))
{
LLFile::remove(tmp_filename);
- throw LLProtectedDataException("Could not overwrite protected data store");
+
+ // EXP-1825 crash in LLSecAPIBasicHandler::_writeProtectedData()
+ // Decided throwing an exception here was overkill until we figure out why this happens
+ //throw LLProtectedDataException("Could not overwrite protected data store");
+ llinfos << "LLProtectedDataException(Could not overwrite protected data store)" << llendl;
}
}
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index da891d1c51..6111255a66 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -64,7 +64,9 @@
#include "llhudmanager.h"
#include "llinventorymodel.h"
#include "llmenugl.h"
+#include "llmeshrepository.h"
#include "llmutelist.h"
+#include "llnotificationsutil.h"
#include "llsidepaneltaskinfo.h"
#include "llslurl.h"
#include "llstatusbar.h"
@@ -87,6 +89,7 @@
#include "llvoavatarself.h"
#include "llvovolume.h"
#include "pipeline.h"
+#include "llviewershadermgr.h"
#include "llglheaders.h"
@@ -175,7 +178,6 @@ LLObjectSelection *get_null_object_selection()
// Build time optimization, generate this function once here
template class LLSelectMgr* LLSingleton<class LLSelectMgr>::getInstance();
-
//-----------------------------------------------------------------------------
// LLSelectMgr()
//-----------------------------------------------------------------------------
@@ -516,17 +518,15 @@ BOOL LLSelectMgr::removeObjectFromSelections(const LLUUID &id)
{
BOOL object_found = FALSE;
LLTool *tool = NULL;
- if (!gNoRender)
- {
- tool = LLToolMgr::getInstance()->getCurrentTool();
- // It's possible that the tool is editing an object that is not selected
- LLViewerObject* tool_editing_object = tool->getEditingObject();
- if( tool_editing_object && tool_editing_object->mID == id)
- {
- tool->stopEditing();
- object_found = TRUE;
- }
+ tool = LLToolMgr::getInstance()->getCurrentTool();
+
+ // It's possible that the tool is editing an object that is not selected
+ LLViewerObject* tool_editing_object = tool->getEditingObject();
+ if( tool_editing_object && tool_editing_object->mID == id)
+ {
+ tool->stopEditing();
+ object_found = TRUE;
}
// Iterate through selected objects list and kill the object
@@ -562,6 +562,103 @@ BOOL LLSelectMgr::removeObjectFromSelections(const LLUUID &id)
return object_found;
}
+bool LLSelectMgr::linkObjects()
+{
+ if (!LLSelectMgr::getInstance()->selectGetAllRootsValid())
+ {
+ LLNotificationsUtil::add("UnableToLinkWhileDownloading");
+ return true;
+ }
+
+ S32 object_count = LLSelectMgr::getInstance()->getSelection()->getObjectCount();
+ if (object_count > MAX_CHILDREN_PER_TASK + 1)
+ {
+ LLSD args;
+ args["COUNT"] = llformat("%d", object_count);
+ int max = MAX_CHILDREN_PER_TASK+1;
+ args["MAX"] = llformat("%d", max);
+ LLNotificationsUtil::add("UnableToLinkObjects", args);
+ return true;
+ }
+
+ if (LLSelectMgr::getInstance()->getSelection()->getRootObjectCount() < 2)
+ {
+ LLNotificationsUtil::add("CannotLinkIncompleteSet");
+ return true;
+ }
+
+ if (!LLSelectMgr::getInstance()->selectGetRootsModify())
+ {
+ LLNotificationsUtil::add("CannotLinkModify");
+ return true;
+ }
+
+ LLUUID owner_id;
+ std::string owner_name;
+ if (!LLSelectMgr::getInstance()->selectGetOwner(owner_id, owner_name))
+ {
+ // we don't actually care if you're the owner, but novices are
+ // the most likely to be stumped by this one, so offer the
+ // easiest and most likely solution.
+ LLNotificationsUtil::add("CannotLinkDifferentOwners");
+ return true;
+ }
+
+ LLSelectMgr::getInstance()->sendLink();
+
+ return true;
+}
+
+bool LLSelectMgr::unlinkObjects()
+{
+ LLSelectMgr::getInstance()->sendDelink();
+ return true;
+}
+
+// in order to link, all objects must have the same owner, and the
+// agent must have the ability to modify all of the objects. However,
+// we're not answering that question with this method. The question
+// we're answering is: does the user have a reasonable expectation
+// that a link operation should work? If so, return true, false
+// otherwise. this allows the handle_link method to more finely check
+// the selection and give an error message when the uer has a
+// reasonable expectation for the link to work, but it will fail.
+bool LLSelectMgr::enableLinkObjects()
+{
+ bool new_value = false;
+ // check if there are at least 2 objects selected, and that the
+ // user can modify at least one of the selected objects.
+
+ // in component mode, can't link
+ if (!gSavedSettings.getBOOL("EditLinkedParts"))
+ {
+ if(LLSelectMgr::getInstance()->selectGetAllRootsValid() && LLSelectMgr::getInstance()->getSelection()->getRootObjectCount() >= 2)
+ {
+ struct f : public LLSelectedObjectFunctor
+ {
+ virtual bool apply(LLViewerObject* object)
+ {
+ return object->permModify();
+ }
+ } func;
+ const bool firstonly = true;
+ new_value = LLSelectMgr::getInstance()->getSelection()->applyToRootObjects(&func, firstonly);
+ }
+ }
+ return new_value;
+}
+
+bool LLSelectMgr::enableUnlinkObjects()
+{
+ LLViewerObject* first_editable_object = LLSelectMgr::getInstance()->getSelection()->getFirstEditableObject();
+
+ bool new_value = LLSelectMgr::getInstance()->selectGetAllRootsValid() &&
+ first_editable_object &&
+ !first_editable_object->isAttachment();
+
+ return new_value;
+}
+
void LLSelectMgr::deselectObjectAndFamily(LLViewerObject* object, BOOL send_to_sim, BOOL include_entire_object)
{
// bail if nothing selected or if object wasn't selected in the first place
@@ -1095,8 +1192,8 @@ void LLSelectMgr::getGrid(LLVector3& origin, LLQuaternion &rotation, LLVector3 &
mGridRotation = first_grid_object->getRenderRotation();
LLVector3 first_grid_obj_pos = first_grid_object->getRenderPosition();
- LLVector3 min_extents(F32_MAX, F32_MAX, F32_MAX);
- LLVector3 max_extents(-F32_MAX, -F32_MAX, -F32_MAX);
+ LLVector4a min_extents(F32_MAX);
+ LLVector4a max_extents(-F32_MAX);
BOOL grid_changed = FALSE;
for (LLObjectSelection::iterator iter = mGridObjects.begin();
iter != mGridObjects.end(); ++iter)
@@ -1105,7 +1202,7 @@ void LLSelectMgr::getGrid(LLVector3& origin, LLQuaternion &rotation, LLVector3 &
LLDrawable* drawable = object->mDrawable;
if (drawable)
{
- const LLVector3* ext = drawable->getSpatialExtents();
+ const LLVector4a* ext = drawable->getSpatialExtents();
update_min_max(min_extents, max_extents, ext[0]);
update_min_max(min_extents, max_extents, ext[1]);
grid_changed = TRUE;
@@ -1113,13 +1210,19 @@ void LLSelectMgr::getGrid(LLVector3& origin, LLQuaternion &rotation, LLVector3 &
}
if (grid_changed)
{
- mGridOrigin = lerp(min_extents, max_extents, 0.5f);
+ LLVector4a center, size;
+ center.setAdd(min_extents, max_extents);
+ center.mul(0.5f);
+ size.setSub(max_extents, min_extents);
+ size.mul(0.5f);
+
+ mGridOrigin.set(center.getF32ptr());
LLDrawable* drawable = first_grid_object->mDrawable;
if (drawable && drawable->isActive())
{
mGridOrigin = mGridOrigin * first_grid_object->getRenderMatrix();
}
- mGridScale = (max_extents - min_extents) * 0.5f;
+ mGridScale.set(size.getF32ptr());
}
}
else // GRID_MODE_WORLD or just plain default
@@ -1883,6 +1986,103 @@ BOOL LLSelectMgr::selectionGetGlow(F32 *glow)
return identical;
}
+
+void LLSelectMgr::selectionSetPhysicsType(U8 type)
+{
+ struct f : public LLSelectedObjectFunctor
+ {
+ U8 mType;
+ f(const U8& t) : mType(t) {}
+ virtual bool apply(LLViewerObject* object)
+ {
+ if (object->permModify())
+ {
+ object->setPhysicsShapeType(mType);
+ object->updateFlags(TRUE);
+ }
+ return true;
+ }
+ } sendfunc(type);
+ getSelection()->applyToObjects(&sendfunc);
+}
+
+void LLSelectMgr::selectionSetFriction(F32 friction)
+{
+ struct f : public LLSelectedObjectFunctor
+ {
+ F32 mFriction;
+ f(const F32& friction) : mFriction(friction) {}
+ virtual bool apply(LLViewerObject* object)
+ {
+ if (object->permModify())
+ {
+ object->setPhysicsFriction(mFriction);
+ object->updateFlags(TRUE);
+ }
+ return true;
+ }
+ } sendfunc(friction);
+ getSelection()->applyToObjects(&sendfunc);
+}
+
+void LLSelectMgr::selectionSetGravity(F32 gravity )
+{
+ struct f : public LLSelectedObjectFunctor
+ {
+ F32 mGravity;
+ f(const F32& gravity) : mGravity(gravity) {}
+ virtual bool apply(LLViewerObject* object)
+ {
+ if (object->permModify())
+ {
+ object->setPhysicsGravity(mGravity);
+ object->updateFlags(TRUE);
+ }
+ return true;
+ }
+ } sendfunc(gravity);
+ getSelection()->applyToObjects(&sendfunc);
+}
+
+void LLSelectMgr::selectionSetDensity(F32 density )
+{
+ struct f : public LLSelectedObjectFunctor
+ {
+ F32 mDensity;
+ f(const F32& density ) : mDensity(density) {}
+ virtual bool apply(LLViewerObject* object)
+ {
+ if (object->permModify())
+ {
+ object->setPhysicsDensity(mDensity);
+ object->updateFlags(TRUE);
+ }
+ return true;
+ }
+ } sendfunc(density);
+ getSelection()->applyToObjects(&sendfunc);
+}
+
+void LLSelectMgr::selectionSetRestitution(F32 restitution)
+{
+ struct f : public LLSelectedObjectFunctor
+ {
+ F32 mRestitution;
+ f(const F32& restitution ) : mRestitution(restitution) {}
+ virtual bool apply(LLViewerObject* object)
+ {
+ if (object->permModify())
+ {
+ object->setPhysicsRestitution(mRestitution);
+ object->updateFlags(TRUE);
+ }
+ return true;
+ }
+ } sendfunc(restitution);
+ getSelection()->applyToObjects(&sendfunc);
+}
+
+
//-----------------------------------------------------------------------------
// selectionSetMaterial()
//-----------------------------------------------------------------------------
@@ -3532,7 +3732,7 @@ void LLSelectMgr::deselectAllIfTooFar()
{
if (mDebugSelectMgr)
{
- llinfos << "Selection manager: auto-deselecting, select_dist = " << fsqrtf(select_dist_sq) << llendl;
+ llinfos << "Selection manager: auto-deselecting, select_dist = " << (F32) sqrt(select_dist_sq) << llendl;
llinfos << "agent pos global = " << gAgent.getPositionGlobal() << llendl;
llinfos << "selection pos global = " << selectionCenter << llendl;
}
@@ -3701,6 +3901,26 @@ void LLSelectMgr::sendDelink()
return;
}
+ struct f : public LLSelectedObjectFunctor
+ { //on delink, any modifyable object should
+ f() {}
+
+ virtual bool apply(LLViewerObject* object)
+ {
+ if (object->permModify())
+ {
+ if (object->getPhysicsShapeType() == LLViewerObject::PHYSICS_SHAPE_NONE)
+ {
+ object->setPhysicsShapeType(LLViewerObject::PHYSICS_SHAPE_CONVEX_HULL);
+ object->updateFlags();
+ }
+ }
+ return true;
+ }
+ } sendfunc;
+ getSelection()->applyToObjects(&sendfunc);
+
+
// Delink needs to send individuals so you can unlink a single object from
// a linked set.
sendListToRegions(
@@ -3930,7 +4150,6 @@ void LLSelectMgr::selectionUpdateCastShadows(BOOL cast_shadows)
getSelection()->applyToObjects(&func);
}
-
//----------------------------------------------------------------------
// Helpful packing functions for sendObjectMessage()
//----------------------------------------------------------------------
@@ -4619,8 +4838,7 @@ void LLSelectMgr::processForceObjectSelect(LLMessageSystem* msg, void**)
LLSelectMgr::getInstance()->highlightObjectAndFamily(objects);
}
-
-extern LLGLdouble gGLModelView[16];
+extern F32 gGLModelView[16];
void LLSelectMgr::updateSilhouettes()
{
@@ -4906,7 +5124,6 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud)
gGL.getTexUnit(0)->bind(mSilhouetteImagep);
LLGLSPipelineSelection gls_select;
- gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.f);
LLGLEnable blend(GL_BLEND);
LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE);
@@ -4917,20 +5134,20 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud)
F32 cur_zoom = gAgentCamera.mHUDCurZoom;
// set up transform to encompass bounding box of HUD
- glMatrixMode(GL_PROJECTION);
+ gGL.matrixMode(LLRender::MM_PROJECTION);
gGL.pushMatrix();
- glLoadIdentity();
+ gGL.loadIdentity();
F32 depth = llmax(1.f, hud_bbox.getExtentLocal().mV[VX] * 1.1f);
- glOrtho(-0.5f * LLViewerCamera::getInstance()->getAspect(), 0.5f * LLViewerCamera::getInstance()->getAspect(), -0.5f, 0.5f, 0.f, depth);
+ gGL.ortho(-0.5f * LLViewerCamera::getInstance()->getAspect(), 0.5f * LLViewerCamera::getInstance()->getAspect(), -0.5f, 0.5f, 0.f, depth);
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.pushMatrix();
gGL.pushUIMatrix();
gGL.loadUIIdentity();
- glLoadIdentity();
- glLoadMatrixf(OGL_TO_CFR_ROTATION); // Load Cory's favorite reference frame
- glTranslatef(-hud_bbox.getCenterLocal().mV[VX] + (depth *0.5f), 0.f, 0.f);
- glScalef(cur_zoom, cur_zoom, cur_zoom);
+ gGL.loadIdentity();
+ gGL.loadMatrix(OGL_TO_CFR_ROTATION); // Load Cory's favorite reference frame
+ gGL.translatef(-hud_bbox.getCenterLocal().mV[VX] + (depth *0.5f), 0.f, 0.f);
+ gGL.scalef(cur_zoom, cur_zoom, cur_zoom);
}
if (mSelectedObjects->getNumNodes())
{
@@ -5023,17 +5240,16 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud)
if (isAgentAvatarValid() && for_hud)
{
- glMatrixMode(GL_PROJECTION);
+ gGL.matrixMode(LLRender::MM_PROJECTION);
gGL.popMatrix();
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.popMatrix();
gGL.popUIMatrix();
stop_glerror();
}
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
}
void LLSelectMgr::generateSilhouette(LLSelectNode* nodep, const LLVector3& view_point)
@@ -5103,7 +5319,6 @@ LLSelectNode::LLSelectNode(const LLSelectNode& nodep)
mSilhouetteVertices = nodep.mSilhouetteVertices;
mSilhouetteNormals = nodep.mSilhouetteNormals;
- mSilhouetteSegments = nodep.mSilhouetteSegments;
mSilhouetteExists = nodep.mSilhouetteExists;
mObject = nodep.mObject;
@@ -5337,6 +5552,130 @@ BOOL LLSelectNode::allowOperationOnNode(PermissionBit op, U64 group_proxy_power)
return (mPermissions->allowOperationBy(op, proxy_agent_id, group_id));
}
+
+//helper function for pushing relevant vertices from drawable to GL
+void pushWireframe(LLDrawable* drawable)
+{
+ LLVOVolume* vobj = drawable->getVOVolume();
+ if (vobj)
+ {
+ LLVertexBuffer::unbind();
+ gGL.pushMatrix();
+ gGL.multMatrix((F32*) vobj->getRelativeXform().mMatrix);
+
+ LLVolume* volume = NULL;
+
+ if (drawable->isState(LLDrawable::RIGGED))
+ {
+ vobj->updateRiggedVolume();
+ volume = vobj->getRiggedVolume();
+ }
+ else
+ {
+ volume = vobj->getVolume();
+ }
+
+ if (volume)
+ {
+ for (S32 i = 0; i < volume->getNumVolumeFaces(); ++i)
+ {
+ const LLVolumeFace& face = volume->getVolumeFace(i);
+ LLVertexBuffer::drawElements(LLRender::TRIANGLES, face.mPositions, face.mTexCoords, face.mNumIndices, face.mIndices);
+ }
+ }
+
+ gGL.popMatrix();
+ }
+
+}
+
+void LLSelectNode::renderOneWireframe(const LLColor4& color)
+{
+ LLViewerObject* objectp = getObject();
+ if (!objectp)
+ {
+ return;
+ }
+
+ LLDrawable* drawable = objectp->mDrawable;
+ if(!drawable)
+ {
+ return;
+ }
+
+ LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr;
+
+ if (shader)
+ {
+ gHighlightProgram.bind();
+ }
+
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.pushMatrix();
+
+ BOOL is_hud_object = objectp->isHUDAttachment();
+
+ if (drawable->isActive())
+ {
+ gGL.loadMatrix(gGLModelView);
+ gGL.multMatrix((F32*) objectp->getRenderMatrix().mMatrix);
+ }
+ else if (!is_hud_object)
+ {
+ gGL.loadIdentity();
+ gGL.multMatrix(gGLModelView);
+ LLVector3 trans = objectp->getRegion()->getOriginAgent();
+ gGL.translatef(trans.mV[0], trans.mV[1], trans.mV[2]);
+ }
+
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+
+ if (LLSelectMgr::sRenderHiddenSelections) // && gFloaterTools && gFloaterTools->getVisible())
+ {
+ gGL.blendFunc(LLRender::BF_SOURCE_COLOR, LLRender::BF_ONE);
+ LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE, GL_GEQUAL);
+ if (shader)
+ {
+ gGL.diffuseColor4f(color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE], 0.4f);
+ pushWireframe(drawable);
+ }
+ else
+ {
+ LLGLEnable fog(GL_FOG);
+ glFogi(GL_FOG_MODE, GL_LINEAR);
+ float d = (LLViewerCamera::getInstance()->getPointOfInterest()-LLViewerCamera::getInstance()->getOrigin()).magVec();
+ LLColor4 fogCol = color * (F32)llclamp((LLSelectMgr::getInstance()->getSelectionCenterGlobal()-gAgentCamera.getCameraPositionGlobal()).magVec()/(LLSelectMgr::getInstance()->getBBoxOfSelection().getExtentLocal().magVec()*4), 0.0, 1.0);
+ glFogf(GL_FOG_START, d);
+ glFogf(GL_FOG_END, d*(1 + (LLViewerCamera::getInstance()->getView() / LLViewerCamera::getInstance()->getDefaultFOV())));
+ glFogfv(GL_FOG_COLOR, fogCol.mV);
+
+ gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
+ {
+ gGL.diffuseColor4f(color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE], 0.4f);
+ pushWireframe(drawable);
+ }
+ }
+ }
+
+ gGL.flush();
+ gGL.setSceneBlendType(LLRender::BT_ALPHA);
+
+ gGL.diffuseColor4f(color.mV[VRED]*2, color.mV[VGREEN]*2, color.mV[VBLUE]*2, LLSelectMgr::sHighlightAlpha*2);
+
+ LLGLEnable offset(GL_POLYGON_OFFSET_LINE);
+ glPolygonOffset(3.f, 3.f);
+ glLineWidth(3.f);
+ pushWireframe(drawable);
+ glLineWidth(1.f);
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ gGL.popMatrix();
+
+ if (shader)
+ {
+ shader->bind();
+ }
+}
+
//-----------------------------------------------------------------------------
// renderOneSilhouette()
//-----------------------------------------------------------------------------
@@ -5354,6 +5693,13 @@ void LLSelectNode::renderOneSilhouette(const LLColor4 &color)
return;
}
+ LLVOVolume* vobj = drawable->getVOVolume();
+ if (vobj && vobj->isMesh())
+ {
+ renderOneWireframe(color);
+ return;
+ }
+
if (!mSilhouetteExists)
{
return;
@@ -5366,21 +5712,29 @@ void LLSelectNode::renderOneSilhouette(const LLColor4 &color)
return;
}
- glMatrixMode(GL_MODELVIEW);
+
+ LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr;
+
+ if (shader)
+ { //switch to "solid color" program for SH-2690 -- works around driver bug causing bad triangles when rendering silhouettes
+ gSolidColorProgram.bind();
+ }
+
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.pushMatrix();
gGL.pushUIMatrix();
gGL.loadUIIdentity();
if (!is_hud_object)
{
- glLoadIdentity();
- glMultMatrixd(gGLModelView);
+ gGL.loadIdentity();
+ gGL.multMatrix(gGLModelView);
}
if (drawable->isActive())
{
- glMultMatrixf((F32*) objectp->getRenderMatrix().mMatrix);
+ gGL.multMatrix((F32*) objectp->getRenderMatrix().mMatrix);
}
LLVolume *volume = objectp->getVolume();
@@ -5418,17 +5772,15 @@ void LLSelectNode::renderOneSilhouette(const LLColor4 &color)
gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
gGL.begin(LLRender::LINES);
{
- S32 i = 0;
- for (S32 seg_num = 0; seg_num < (S32)mSilhouetteSegments.size(); seg_num++)
+ for(S32 i = 0; i < mSilhouetteVertices.size(); i += 2)
{
- for(; i < mSilhouetteSegments[seg_num]; i++)
- {
- u_coord += u_divisor * LLSelectMgr::sHighlightUScale;
-
- gGL.color4f(color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE], 0.4f);
- gGL.texCoord2f( u_coord, v_coord );
- gGL.vertex3fv( mSilhouetteVertices[i].mV );
- }
+ u_coord += u_divisor * LLSelectMgr::sHighlightUScale;
+ gGL.color4f(color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE], 0.4f);
+ gGL.texCoord2f( u_coord, v_coord );
+ gGL.vertex3fv( mSilhouetteVertices[i].mV);
+ u_coord += u_divisor * LLSelectMgr::sHighlightUScale;
+ gGL.texCoord2f( u_coord, v_coord );
+ gGL.vertex3fv(mSilhouetteVertices[i+1].mV);
}
}
gGL.end();
@@ -5439,51 +5791,50 @@ void LLSelectNode::renderOneSilhouette(const LLColor4 &color)
gGL.setSceneBlendType(LLRender::BT_ALPHA);
gGL.begin(LLRender::TRIANGLES);
{
- S32 i = 0;
- for (S32 seg_num = 0; seg_num < (S32)mSilhouetteSegments.size(); seg_num++)
+ for(S32 i = 0; i < mSilhouetteVertices.size(); i+=2)
{
- S32 first_i = i;
- LLVector3 v;
- LLVector2 t;
+ if (!mSilhouetteNormals[i].isFinite() ||
+ !mSilhouetteNormals[i+1].isFinite())
+ { //skip skewed segments
+ continue;
+ }
- for(; i < mSilhouetteSegments[seg_num]; i++)
- {
+ LLVector3 v[4];
+ LLVector2 tc[4];
+ v[0] = mSilhouetteVertices[i] + (mSilhouetteNormals[i] * silhouette_thickness);
+ tc[0].set(u_coord, v_coord + LLSelectMgr::sHighlightVScale);
- if (i == first_i) {
- LLVector3 vert = (mSilhouetteNormals[i]) * silhouette_thickness;
- vert += mSilhouetteVertices[i];
+ v[1] = mSilhouetteVertices[i];
+ tc[1].set(u_coord, v_coord);
- gGL.color4f(color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE], 0.0f); //LLSelectMgr::sHighlightAlpha);
- gGL.texCoord2f( u_coord, v_coord + LLSelectMgr::sHighlightVScale );
- gGL.vertex3fv( vert.mV );
-
- u_coord += u_divisor * LLSelectMgr::sHighlightUScale;
+ u_coord += u_divisor * LLSelectMgr::sHighlightUScale;
- gGL.color4f(color.mV[VRED]*2, color.mV[VGREEN]*2, color.mV[VBLUE]*2, LLSelectMgr::sHighlightAlpha*2);
- gGL.texCoord2f( u_coord, v_coord );
- gGL.vertex3fv( mSilhouetteVertices[i].mV );
+ v[2] = mSilhouetteVertices[i+1] + (mSilhouetteNormals[i+1] * silhouette_thickness);
+ tc[2].set(u_coord, v_coord + LLSelectMgr::sHighlightVScale);
+
+ v[3] = mSilhouetteVertices[i+1];
+ tc[3].set(u_coord,v_coord);
- v = mSilhouetteVertices[i];
- t = LLVector2(u_coord, v_coord);
- }
- else {
- LLVector3 vert = (mSilhouetteNormals[i]) * silhouette_thickness;
- vert += mSilhouetteVertices[i];
-
- gGL.color4f(color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE], 0.0f); //LLSelectMgr::sHighlightAlpha);
- gGL.texCoord2f( u_coord, v_coord + LLSelectMgr::sHighlightVScale );
- gGL.vertex3fv( vert.mV );
- gGL.vertex3fv( vert.mV );
-
- gGL.texCoord2fv(t.mV);
- u_coord += u_divisor * LLSelectMgr::sHighlightUScale;
- gGL.color4f(color.mV[VRED]*2, color.mV[VGREEN]*2, color.mV[VBLUE]*2, LLSelectMgr::sHighlightAlpha*2);
- gGL.vertex3fv(v.mV);
- gGL.texCoord2f( u_coord, v_coord );
- gGL.vertex3fv( mSilhouetteVertices[i].mV );
+ gGL.color4f(color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE], 0.0f); //LLSelectMgr::sHighlightAlpha);
+ gGL.texCoord2fv(tc[0].mV);
+ gGL.vertex3fv( v[0].mV );
+
+ gGL.color4f(color.mV[VRED]*2, color.mV[VGREEN]*2, color.mV[VBLUE]*2, LLSelectMgr::sHighlightAlpha*2);
+ gGL.texCoord2fv( tc[1].mV );
+ gGL.vertex3fv( v[1].mV );
- }
- }
+ gGL.color4f(color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE], 0.0f); //LLSelectMgr::sHighlightAlpha);
+ gGL.texCoord2fv( tc[2].mV );
+ gGL.vertex3fv( v[2].mV );
+
+ gGL.vertex3fv( v[2].mV );
+
+ gGL.color4f(color.mV[VRED]*2, color.mV[VGREEN]*2, color.mV[VBLUE]*2, LLSelectMgr::sHighlightAlpha*2);
+ gGL.texCoord2fv( tc[1].mV );
+ gGL.vertex3fv( v[1].mV );
+
+ gGL.texCoord2fv( tc[3].mV );
+ gGL.vertex3fv( v[3].mV );
}
}
gGL.end();
@@ -5491,6 +5842,11 @@ void LLSelectNode::renderOneSilhouette(const LLColor4 &color)
}
gGL.popMatrix();
gGL.popUIMatrix();
+
+ if (shader)
+ {
+ shader->bind();
+ }
}
//
@@ -6051,9 +6407,221 @@ S32 LLObjectSelection::getObjectCount()
{
cleanupNodes();
S32 count = mList.size();
+
+ return count;
+}
+
+F32 LLObjectSelection::getSelectedObjectCost()
+{
+ cleanupNodes();
+ F32 cost = 0.f;
+
+ for (list_t::iterator iter = mList.begin(); iter != mList.end(); ++iter)
+ {
+ LLSelectNode* node = *iter;
+ LLViewerObject* object = node->getObject();
+
+ if (object)
+ {
+ cost += object->getObjectCost();
+ }
+ }
+
+ return cost;
+}
+
+F32 LLObjectSelection::getSelectedLinksetCost()
+{
+ cleanupNodes();
+ F32 cost = 0.f;
+
+ std::set<LLViewerObject*> me_roots;
+
+ for (list_t::iterator iter = mList.begin(); iter != mList.end(); ++iter)
+ {
+ LLSelectNode* node = *iter;
+ LLViewerObject* object = node->getObject();
+
+ if (object)
+ {
+ LLViewerObject* root = static_cast<LLViewerObject*>(object->getRoot());
+ if (root)
+ {
+ if (me_roots.find(root) == me_roots.end())
+ {
+ me_roots.insert(root);
+ cost += root->getLinksetCost();
+ }
+ }
+ }
+ }
+
+ return cost;
+}
+
+F32 LLObjectSelection::getSelectedPhysicsCost()
+{
+ cleanupNodes();
+ F32 cost = 0.f;
+
+ for (list_t::iterator iter = mList.begin(); iter != mList.end(); ++iter)
+ {
+ LLSelectNode* node = *iter;
+ LLViewerObject* object = node->getObject();
+
+ if (object)
+ {
+ cost += object->getPhysicsCost();
+ }
+ }
+
+ return cost;
+}
+
+F32 LLObjectSelection::getSelectedLinksetPhysicsCost()
+{
+ cleanupNodes();
+ F32 cost = 0.f;
+
+ std::set<LLViewerObject*> me_roots;
+
+ for (list_t::iterator iter = mList.begin(); iter != mList.end(); ++iter)
+ {
+ LLSelectNode* node = *iter;
+ LLViewerObject* object = node->getObject();
+
+ if (object)
+ {
+ LLViewerObject* root = static_cast<LLViewerObject*>(object->getRoot());
+ if (root)
+ {
+ if (me_roots.find(root) == me_roots.end())
+ {
+ me_roots.insert(root);
+ cost += root->getLinksetPhysicsCost();
+ }
+ }
+ }
+ }
+
+ return cost;
+}
+
+F32 LLObjectSelection::getSelectedObjectStreamingCost(S32* total_bytes, S32* visible_bytes)
+{
+ F32 cost = 0.f;
+ for (list_t::iterator iter = mList.begin(); iter != mList.end(); ++iter)
+ {
+ LLSelectNode* node = *iter;
+ LLViewerObject* object = node->getObject();
+
+ if (object)
+ {
+ S32 bytes = 0;
+ S32 visible = 0;
+ cost += object->getStreamingCost(&bytes, &visible);
+
+ if (total_bytes)
+ {
+ *total_bytes += bytes;
+ }
+
+ if (visible_bytes)
+ {
+ *visible_bytes += visible;
+ }
+ }
+ }
+
+ return cost;
+}
+
+U32 LLObjectSelection::getSelectedObjectTriangleCount(S32* vcount)
+{
+ U32 count = 0;
+ for (list_t::iterator iter = mList.begin(); iter != mList.end(); ++iter)
+ {
+ LLSelectNode* node = *iter;
+ LLViewerObject* object = node->getObject();
+
+ if (object)
+ {
+ count += object->getTriangleCount(vcount);
+ }
+ }
+
return count;
}
+S32 LLObjectSelection::getSelectedObjectRenderCost()
+{
+ S32 cost = 0;
+ LLVOVolume::texture_cost_t textures;
+ typedef std::set<LLUUID> uuid_list_t;
+ uuid_list_t computed_objects;
+
+ typedef std::list<LLPointer<LLViewerObject> > child_list_t;
+ typedef const child_list_t const_child_list_t;
+
+ // add render cost of complete linksets first, to get accurate texture counts
+ for (list_t::iterator iter = mList.begin(); iter != mList.end(); ++iter)
+ {
+ LLSelectNode* node = *iter;
+
+ LLVOVolume* object = (LLVOVolume*)node->getObject();
+
+ if (object && object->isRootEdit())
+ {
+ cost += object->getRenderCost(textures);
+ computed_objects.insert(object->getID());
+
+ const_child_list_t children = object->getChildren();
+ for (const_child_list_t::const_iterator child_iter = children.begin();
+ child_iter != children.end();
+ ++child_iter)
+ {
+ LLViewerObject* child_obj = *child_iter;
+ LLVOVolume *child = dynamic_cast<LLVOVolume*>( child_obj );
+ if (child)
+ {
+ cost += child->getRenderCost(textures);
+ computed_objects.insert(child->getID());
+ }
+ }
+
+ for (LLVOVolume::texture_cost_t::iterator iter = textures.begin(); iter != textures.end(); ++iter)
+ {
+ // add the cost of each individual texture in the linkset
+ cost += iter->second;
+ }
+
+ textures.clear();
+ }
+ }
+
+ // add any partial linkset objects, texture cost may be slightly misleading
+ for (list_t::iterator iter = mList.begin(); iter != mList.end(); ++iter)
+ {
+ LLSelectNode* node = *iter;
+ LLVOVolume* object = (LLVOVolume*)node->getObject();
+
+ if (object && computed_objects.find(object->getID()) == computed_objects.end() )
+ {
+ cost += object->getRenderCost(textures);
+ computed_objects.insert(object->getID());
+ }
+
+ for (LLVOVolume::texture_cost_t::iterator iter = textures.begin(); iter != textures.end(); ++iter)
+ {
+ // add the cost of each individual texture in the linkset
+ cost += iter->second;
+ }
+
+ textures.clear();
+ }
+
+ return cost;
+}
//-----------------------------------------------------------------------------
// getTECount()
@@ -6472,26 +7040,27 @@ bool LLSelectMgr::selectionMove(const LLVector3& displ,
if (update_position)
{
// calculate the distance of the object closest to the camera origin
- F32 min_dist = 1e+30f;
+ F32 min_dist_squared = F32_MAX; // value will be overridden in the loop
+
LLVector3 obj_pos;
for (LLObjectSelection::root_iterator it = getSelection()->root_begin();
it != getSelection()->root_end(); ++it)
{
obj_pos = (*it)->getObject()->getPositionEdit();
- F32 obj_dist = dist_vec(obj_pos, LLViewerCamera::getInstance()->getOrigin());
- if (obj_dist < min_dist)
+ F32 obj_dist_squared = dist_vec_squared(obj_pos, LLViewerCamera::getInstance()->getOrigin());
+ if (obj_dist_squared < min_dist_squared)
{
- min_dist = obj_dist;
+ min_dist_squared = obj_dist_squared;
}
}
- // factor the distance inside the displacement vector. This will get us
+ // factor the distance into the displacement vector. This will get us
// equally visible movements for both close and far away selections.
- min_dist = sqrt(min_dist) / 2;
- displ_global.setVec(displ.mV[0]*min_dist,
- displ.mV[1]*min_dist,
- displ.mV[2]*min_dist);
+ F32 min_dist = sqrt((F32) sqrtf(min_dist_squared)) / 2;
+ displ_global.setVec(displ.mV[0] * min_dist,
+ displ.mV[1] * min_dist,
+ displ.mV[2] * min_dist);
// equates to: Displ_global = Displ * M_cam_axes_in_global_frame
displ_global = LLViewerCamera::getInstance()->rotateToAbsolute(displ_global);
diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h
index 7478ed5f9a..87ada5ac6b 100644
--- a/indra/newview/llselectmgr.h
+++ b/indra/newview/llselectmgr.h
@@ -134,6 +134,7 @@ public:
BOOL isTESelected(S32 te_index);
S32 getLastSelectedTE();
S32 getTESelectMask() { return mTESelectMask; }
+ void renderOneWireframe(const LLColor4& color);
void renderOneSilhouette(const LLColor4 &color);
void setTransient(BOOL transient) { mTransient = transient; }
BOOL isTransient() { return mTransient; }
@@ -181,7 +182,6 @@ public:
std::vector<LLVector3> mTextureScaleRatios;
std::vector<LLVector3> mSilhouetteVertices; // array of vertices to render silhouette of object
std::vector<LLVector3> mSilhouetteNormals; // array of normals to render silhouette of object
- std::vector<S32> mSilhouetteSegments; // array of normals to render silhouette of object
BOOL mSilhouetteExists; // need to generate silhouette?
protected:
@@ -235,7 +235,7 @@ public:
{
bool operator()(LLSelectNode* node);
};
- typedef boost::filter_iterator<is_root, list_t::iterator > valid_root_iterator;
+ typedef boost::filter_iterator<is_valid_root, list_t::iterator > valid_root_iterator;
valid_root_iterator valid_root_begin() { return valid_root_iterator(mList.begin(), mList.end()); }
valid_root_iterator valid_root_end() { return valid_root_iterator(mList.end(), mList.end()); }
@@ -279,6 +279,15 @@ public:
// count members
S32 getObjectCount();
+ F32 getSelectedObjectCost();
+ F32 getSelectedLinksetCost();
+ F32 getSelectedPhysicsCost();
+ F32 getSelectedLinksetPhysicsCost();
+ S32 getSelectedObjectRenderCost();
+
+ F32 getSelectedObjectStreamingCost(S32* total_bytes = NULL, S32* visible_bytes = NULL);
+ U32 getSelectedObjectTriangleCount(S32* vcount = NULL);
+
S32 getTECount();
S32 getRootObjectCount();
@@ -440,6 +449,17 @@ public:
BOOL removeObjectFromSelections(const LLUUID &id);
////////////////////////////////////////////////////////////////
+ // Selection editing
+ ////////////////////////////////////////////////////////////////
+ bool linkObjects();
+
+ bool unlinkObjects();
+
+ bool enableLinkObjects();
+
+ bool enableUnlinkObjects();
+
+ ////////////////////////////////////////////////////////////////
// Selection accessors
////////////////////////////////////////////////////////////////
LLObjectSelectionHandle getSelection() { return mSelectedObjects; }
@@ -489,6 +509,11 @@ public:
bool selectionGetIncludeInSearch(bool* include_in_search_out); // true if all selected objects have same
BOOL selectionGetGlow(F32 *glow);
+ void selectionSetPhysicsType(U8 type);
+ void selectionSetGravity(F32 gravity);
+ void selectionSetFriction(F32 friction);
+ void selectionSetDensity(F32 density);
+ void selectionSetRestitution(F32 restitution);
void selectionSetMaterial(U8 material);
void selectionSetImage(const LLUUID& imageid); // could be item or asset id
void selectionSetColor(const LLColor4 &color);
diff --git a/indra/newview/llshareavatarhandler.cpp b/indra/newview/llshareavatarhandler.cpp
new file mode 100644
index 0000000000..6b4f1d3dc6
--- /dev/null
+++ b/indra/newview/llshareavatarhandler.cpp
@@ -0,0 +1,67 @@
+/**
+ * @file llshareavatarhandler.cpp
+ * @brief slapp to handle sharing with an avatar
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llcommandhandler.h"
+#include "llavataractions.h"
+#include "llnotificationsutil.h"
+#include "llui.h"
+
+class LLShareWithAvatarHandler : public LLCommandHandler
+{
+public:
+ // requires trusted browser to trigger
+ LLShareWithAvatarHandler() : LLCommandHandler("sharewithavatar", UNTRUSTED_THROTTLE)
+ {
+ }
+
+ bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web)
+ {
+ if (!LLUI::sSettingGroups["config"]->getBOOL("EnableAvatarShare"))
+ {
+ LLNotificationsUtil::add("NoAvatarShare", LLSD(), LLSD(), std::string("SwitchToStandardSkinAndQuit"));
+ return true;
+ }
+
+ //Make sure we have some parameters
+ if (params.size() == 0)
+ {
+ return false;
+ }
+
+ //Get the ID
+ LLUUID id;
+ if (!id.set( params[0], FALSE ))
+ {
+ return false;
+ }
+
+ //instigate share with this avatar
+ LLAvatarActions::share( id );
+ return true;
+ }
+};
+LLShareWithAvatarHandler gShareWithAvatar;
diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp
index b316171604..853656905c 100644
--- a/indra/newview/llsidepanelappearance.cpp
+++ b/indra/newview/llsidepanelappearance.cpp
@@ -32,6 +32,8 @@
#include "llagentcamera.h"
#include "llagentwearables.h"
#include "llappearancemgr.h"
+#include "llfloatersidepanelcontainer.h"
+#include "llfolderview.h"
#include "llinventorypanel.h"
#include "llfiltereditor.h"
#include "llfloaterreg.h"
@@ -40,7 +42,6 @@
#include "lloutfitobserver.h"
#include "llpaneleditwearable.h"
#include "llpaneloutfitsinventory.h"
-#include "llsidetray.h"
#include "lltextbox.h"
#include "lluictrlfactory.h"
#include "llviewercontrol.h"
@@ -162,7 +163,6 @@ void LLSidepanelAppearance::onOpen(const LLSD& key)
else
{
// Switch to the requested panel.
- // *TODO: replace this crap with LLSideTrayPanelContainer
std::string type = key["type"].asString();
if (type == "my_outfits")
{
@@ -185,7 +185,7 @@ void LLSidepanelAppearance::onVisibilityChange(const LLSD &new_visibility)
{
LLSD visibility;
visibility["visible"] = new_visibility.asBoolean();
- visibility["reset_accordion"] = true;
+ visibility["reset_accordion"] = false;
updateToVisibility(visibility);
}
@@ -193,18 +193,28 @@ void LLSidepanelAppearance::updateToVisibility(const LLSD &new_visibility)
{
if (new_visibility["visible"].asBoolean())
{
- bool is_outfit_edit_visible = mOutfitEdit && mOutfitEdit->getVisible();
- bool is_wearable_edit_visible = mEditWearable && mEditWearable->getVisible();
+ const BOOL is_outfit_edit_visible = mOutfitEdit && mOutfitEdit->getVisible();
+ const BOOL is_wearable_edit_visible = mEditWearable && mEditWearable->getVisible();
if (is_outfit_edit_visible || is_wearable_edit_visible)
{
- if (!gAgentCamera.cameraCustomizeAvatar() && gSavedSettings.getBOOL("AppearanceCameraMovement"))
+ const LLWearable *wearable_ptr = mEditWearable->getWearable();
+ if (!wearable_ptr)
+ {
+ llwarns << "Visibility change to invalid wearable" << llendl;
+ return;
+ }
+ // Disable camera switch is currently just for WT_PHYSICS type since we don't want to freeze the avatar
+ // when editing its physics.
+ const BOOL disable_camera_motion = LLWearableType::getDisableCameraSwitch(wearable_ptr->getType());
+ if (!gAgentCamera.cameraCustomizeAvatar() &&
+ !disable_camera_motion &&
+ gSavedSettings.getBOOL("AppearanceCameraMovement"))
{
gAgentCamera.changeCameraToCustomizeAvatar();
}
if (is_wearable_edit_visible)
{
- LLWearable *wearable_ptr = mEditWearable->getWearable();
if (gAgentWearables.getWearableIndex(wearable_ptr) == LLAgentWearables::MAX_CLOTHING_PER_TYPE)
{
// we're no longer wearing the wearable we were last editing, switch back to outfit editor
@@ -289,7 +299,7 @@ void LLSidepanelAppearance::showOutfitsInventoryPanel()
{
toggleWearableEditPanel(FALSE);
toggleOutfitEditPanel(FALSE);
- togglMyOutfitsPanel(TRUE);
+ toggleMyOutfitsPanel(TRUE);
}
void LLSidepanelAppearance::showOutfitEditPanel()
@@ -305,19 +315,28 @@ void LLSidepanelAppearance::showOutfitEditPanel()
mOutfitEdit->resetAccordionState();
}
- togglMyOutfitsPanel(FALSE);
+ // If we're exiting the edit wearable view, and the camera was not focused on the avatar
+ // (e.g. such as if we were editing a physics param), then skip the outfits edit mode since
+ // otherwise this would trigger the camera focus mode.
+ if (mEditWearable != NULL && mEditWearable->getVisible() && !gAgentCamera.cameraCustomizeAvatar())
+ {
+ showOutfitsInventoryPanel();
+ return;
+ }
+
+ toggleMyOutfitsPanel(FALSE);
toggleWearableEditPanel(FALSE, NULL, TRUE); // don't switch out of edit appearance mode
toggleOutfitEditPanel(TRUE);
}
-void LLSidepanelAppearance::showWearableEditPanel(LLWearable *wearable /* = NULL*/)
+void LLSidepanelAppearance::showWearableEditPanel(LLWearable *wearable /* = NULL*/, BOOL disable_camera_switch)
{
- togglMyOutfitsPanel(FALSE);
+ toggleMyOutfitsPanel(FALSE);
toggleOutfitEditPanel(FALSE, TRUE); // don't switch out of edit appearance mode
- toggleWearableEditPanel(TRUE, wearable);
+ toggleWearableEditPanel(TRUE, wearable, disable_camera_switch);
}
-void LLSidepanelAppearance::togglMyOutfitsPanel(BOOL visible)
+void LLSidepanelAppearance::toggleMyOutfitsPanel(BOOL visible)
{
if (!mPanelOutfitsInventory || mPanelOutfitsInventory->getVisible() == visible)
{
@@ -390,7 +409,7 @@ void LLSidepanelAppearance::toggleWearableEditPanel(BOOL visible, LLWearable *we
{
gAgentCamera.changeCameraToCustomizeAvatar();
}
- mEditWearable->setWearable(wearable);
+ mEditWearable->setWearable(wearable, disable_camera_switch);
mEditWearable->onOpen(LLSD()); // currently no-op, just for consistency
}
else
@@ -434,14 +453,14 @@ void LLSidepanelAppearance::refreshCurrentOutfitName(const std::string& name)
}
//static
-void LLSidepanelAppearance::editWearable(LLWearable *wearable, LLView *data)
+void LLSidepanelAppearance::editWearable(LLWearable *wearable, LLView *data, BOOL disable_camera_switch)
{
- LLSideTray::getInstance()->showPanel("sidepanel_appearance");
+ LLFloaterSidePanelContainer::showPanel("appearance", LLSD());
LLSidepanelAppearance *panel = dynamic_cast<LLSidepanelAppearance*>(data);
if (panel)
{
- panel->showWearableEditPanel(wearable);
+ panel->showWearableEditPanel(wearable, disable_camera_switch);
}
}
diff --git a/indra/newview/llsidepanelappearance.h b/indra/newview/llsidepanelappearance.h
index 2a83dfbc9d..6dd3520266 100644
--- a/indra/newview/llsidepanelappearance.h
+++ b/indra/newview/llsidepanelappearance.h
@@ -51,7 +51,7 @@ public:
void refreshCurrentOutfitName(const std::string& name = "");
- static void editWearable(LLWearable *wearable, LLView *data);
+ static void editWearable(LLWearable *wearable, LLView *data, BOOL disable_camera_switch = FALSE);
void fetchInventory();
void inventoryFetched();
@@ -59,7 +59,7 @@ public:
void showOutfitsInventoryPanel();
void showOutfitEditPanel();
- void showWearableEditPanel(LLWearable *wearable = NULL);
+ void showWearableEditPanel(LLWearable *wearable = NULL, BOOL disable_camera_switch = FALSE);
void setWearablesLoading(bool val);
void showDefaultSubpart();
void updateScrollingPanelList();
@@ -72,7 +72,7 @@ private:
void onOpenOutfitButtonClicked();
void onEditAppearanceButtonClicked();
- void togglMyOutfitsPanel(BOOL visible);
+ void toggleMyOutfitsPanel(BOOL visible);
void toggleOutfitEditPanel(BOOL visible, BOOL disable_camera_switch = FALSE);
void toggleWearableEditPanel(BOOL visible, LLWearable* wearable = NULL, BOOL disable_camera_switch = FALSE);
diff --git a/indra/newview/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp
index 31ea542743..4f9ab318a5 100644
--- a/indra/newview/llsidepanelinventory.cpp
+++ b/indra/newview/llsidepanelinventory.cpp
@@ -29,33 +29,131 @@
#include "llagent.h"
#include "llappearancemgr.h"
+#include "llappviewer.h"
#include "llavataractions.h"
#include "llbutton.h"
+#include "lldate.h"
#include "llfirstuse.h"
+#include "llfloatersidepanelcontainer.h"
+#include "llfoldertype.h"
+#include "llhttpclient.h"
#include "llinventorybridge.h"
#include "llinventoryfunctions.h"
+#include "llinventorymodel.h"
+#include "llinventorymodelbackgroundfetch.h"
+#include "llinventoryobserver.h"
#include "llinventorypanel.h"
+#include "lllayoutstack.h"
#include "lloutfitobserver.h"
#include "llpanelmaininventory.h"
+#include "llpanelmarketplaceinbox.h"
+#include "llselectmgr.h"
#include "llsidepaneliteminfo.h"
#include "llsidepaneltaskinfo.h"
+#include "llstring.h"
#include "lltabcontainer.h"
-#include "llselectmgr.h"
+#include "lltextbox.h"
+#include "lltrans.h"
+#include "llviewermedia.h"
+#include "llviewernetwork.h"
#include "llweb.h"
static LLRegisterPanelClassWrapper<LLSidepanelInventory> t_inventory("sidepanel_inventory");
-LLSidepanelInventory::LLSidepanelInventory()
- : LLPanel(),
- mItemPanel(NULL),
- mPanelMainInventory(NULL)
+//
+// Constants
+//
+
+// No longer want the inbox panel to auto-expand since it creates issues with the "new" tag time stamp
+#define AUTO_EXPAND_INBOX 0
+
+static const char * const INBOX_BUTTON_NAME = "inbox_btn";
+static const char * const INBOX_LAYOUT_PANEL_NAME = "inbox_layout_panel";
+static const char * const MAIN_INVENTORY_LAYOUT_PANEL_NAME = "main_inventory_layout_panel";
+
+static const char * const INVENTORY_LAYOUT_STACK_NAME = "inventory_layout_stack";
+
+static const char * const MARKETPLACE_INBOX_PANEL = "marketplace_inbox";
+
+//
+// Helpers
+//
+class LLInboxAddedObserver : public LLInventoryCategoryAddedObserver
{
+public:
+ LLInboxAddedObserver(LLSidepanelInventory * sidepanelInventory)
+ : LLInventoryCategoryAddedObserver()
+ , mSidepanelInventory(sidepanelInventory)
+ {
+ }
+
+ void done()
+ {
+ for (cat_vec_t::iterator it = mAddedCategories.begin(); it != mAddedCategories.end(); ++it)
+ {
+ LLViewerInventoryCategory* added_category = *it;
+
+ LLFolderType::EType added_category_type = added_category->getPreferredType();
+
+ switch (added_category_type)
+ {
+ case LLFolderType::FT_INBOX:
+ mSidepanelInventory->enableInbox(true);
+ mSidepanelInventory->observeInboxModifications(added_category->getUUID());
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+private:
+ LLSidepanelInventory * mSidepanelInventory;
+};
+//
+// Implementation
+//
+
+LLSidepanelInventory::LLSidepanelInventory()
+ : LLPanel()
+ , mItemPanel(NULL)
+ , mInventoryPanelInbox(NULL)
+ , mPanelMainInventory(NULL)
+ , mInboxEnabled(false)
+ , mCategoriesObserver(NULL)
+ , mInboxAddedObserver(NULL)
+{
//buildFromFile( "panel_inventory.xml"); // Called from LLRegisterPanelClass::defaultPanelClassBuilder()
}
LLSidepanelInventory::~LLSidepanelInventory()
{
+ LLLayoutPanel* inbox_layout_panel = getChild<LLLayoutPanel>(INBOX_LAYOUT_PANEL_NAME);
+
+ // Save the InventoryMainPanelHeight in settings per account
+ gSavedPerAccountSettings.setS32("InventoryInboxHeight", inbox_layout_panel->getTargetDim());
+
+ if (mCategoriesObserver && gInventory.containsObserver(mCategoriesObserver))
+ {
+ gInventory.removeObserver(mCategoriesObserver);
+ }
+ delete mCategoriesObserver;
+
+ if (mInboxAddedObserver && gInventory.containsObserver(mInboxAddedObserver))
+ {
+ gInventory.removeObserver(mInboxAddedObserver);
+ }
+ delete mInboxAddedObserver;
+}
+
+void handleInventoryDisplayInboxChanged()
+{
+ LLSidepanelInventory* sidepanel_inventory = LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory");
+ if (sidepanel_inventory)
+ {
+ sidepanel_inventory->enableInbox(gSavedSettings.getBOOL("InventoryDisplayInbox"));
+ }
}
BOOL LLSidepanelInventory::postBuild()
@@ -85,7 +183,7 @@ BOOL LLSidepanelInventory::postBuild()
mOverflowBtn = mInventoryPanel->getChild<LLButton>("overflow_btn");
mOverflowBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onOverflowButtonClicked, this));
- mPanelMainInventory = mInventoryPanel->findChild<LLPanelMainInventory>("panel_main_inventory");
+ mPanelMainInventory = mInventoryPanel->getChild<LLPanelMainInventory>("panel_main_inventory");
mPanelMainInventory->setSelectCallback(boost::bind(&LLSidepanelInventory::onSelectionChange, this, _1, _2));
LLTabContainer* tabs = mPanelMainInventory->getChild<LLTabContainer>("inventory filter tabs");
tabs->setCommitCallback(boost::bind(&LLSidepanelInventory::updateVerbs, this));
@@ -103,7 +201,7 @@ BOOL LLSidepanelInventory::postBuild()
// UI elements from item panel
{
- mItemPanel = findChild<LLSidepanelItemInfo>("sidepanel__item_panel");
+ mItemPanel = getChild<LLSidepanelItemInfo>("sidepanel__item_panel");
LLButton* back_btn = mItemPanel->getChild<LLButton>("back_btn");
back_btn->setClickedCallback(boost::bind(&LLSidepanelInventory::onBackButtonClicked, this));
@@ -119,13 +217,202 @@ BOOL LLSidepanelInventory::postBuild()
}
}
+ // Received items inbox setup
+ {
+ LLLayoutStack* inv_stack = getChild<LLLayoutStack>(INVENTORY_LAYOUT_STACK_NAME);
+
+ // Set up button states and callbacks
+ LLButton * inbox_button = getChild<LLButton>(INBOX_BUTTON_NAME);
+
+ inbox_button->setCommitCallback(boost::bind(&LLSidepanelInventory::onToggleInboxBtn, this));
+
+ // Get the previous inbox state from "InventoryInboxToggleState" setting.
+ bool is_inbox_collapsed = !inbox_button->getToggleState();
+
+ // Restore the collapsed inbox panel state
+ LLLayoutPanel* inbox_panel = getChild<LLLayoutPanel>(INBOX_LAYOUT_PANEL_NAME);
+ inv_stack->collapsePanel(inbox_panel, is_inbox_collapsed);
+ if (!is_inbox_collapsed)
+ {
+ inbox_panel->setTargetDim(gSavedPerAccountSettings.getS32("InventoryInboxHeight"));
+ }
+
+ // Set the inbox visible based on debug settings (final setting comes from http request below)
+ enableInbox(gSavedSettings.getBOOL("InventoryDisplayInbox"));
+
+ // Trigger callback for after login so we can setup to track inbox changes after initial inventory load
+ LLAppViewer::instance()->setOnLoginCompletedCallback(boost::bind(&LLSidepanelInventory::updateInbox, this));
+ }
+
+ gSavedSettings.getControl("InventoryDisplayInbox")->getCommitSignal()->connect(boost::bind(&handleInventoryDisplayInboxChanged));
+
+ // Update the verbs buttons state.
+ updateVerbs();
+
return TRUE;
}
+void LLSidepanelInventory::updateInbox()
+{
+ //
+ // Track inbox folder changes
+ //
+
+ const bool do_not_create_folder = false;
+ const bool do_not_find_in_library = false;
+
+ const LLUUID inbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_INBOX, do_not_create_folder, do_not_find_in_library);
+
+ // Set up observer to listen for creation of inbox if at least one of them doesn't exist
+ if (inbox_id.isNull())
+ {
+ observeInboxCreation();
+ }
+ // Set up observer for inbox changes, if we have an inbox already
+ else
+ {
+ // Enable the display of the inbox if it exists
+ enableInbox(true);
+
+ observeInboxModifications(inbox_id);
+ }
+}
+
+void LLSidepanelInventory::observeInboxCreation()
+{
+ //
+ // Set up observer to track inbox folder creation
+ //
+
+ if (mInboxAddedObserver == NULL)
+ {
+ mInboxAddedObserver = new LLInboxAddedObserver(this);
+
+ gInventory.addObserver(mInboxAddedObserver);
+ }
+}
+
+void LLSidepanelInventory::observeInboxModifications(const LLUUID& inboxID)
+{
+ //
+ // Silently do nothing if we already have an inbox inventory panel set up
+ // (this can happen multiple times on the initial session that creates the inbox)
+ //
+
+ if (mInventoryPanelInbox != NULL)
+ {
+ return;
+ }
+
+ //
+ // Track inbox folder changes
+ //
+
+ if (inboxID.isNull())
+ {
+ llwarns << "Attempting to track modifications to non-existent inbox" << llendl;
+ return;
+ }
+
+ if (mCategoriesObserver == NULL)
+ {
+ mCategoriesObserver = new LLInventoryCategoriesObserver();
+ gInventory.addObserver(mCategoriesObserver);
+ }
+
+ mCategoriesObserver->addCategory(inboxID, boost::bind(&LLSidepanelInventory::onInboxChanged, this, inboxID));
+
+ //
+ // Trigger a load for the entire contents of the Inbox
+ //
+
+ LLInventoryModelBackgroundFetch::instance().start(inboxID);
+
+ //
+ // Set up the inbox inventory view
+ //
+
+ LLPanelMarketplaceInbox * inbox = getChild<LLPanelMarketplaceInbox>(MARKETPLACE_INBOX_PANEL);
+ mInventoryPanelInbox = inbox->setupInventoryPanel();
+}
+
+void LLSidepanelInventory::enableInbox(bool enabled)
+{
+ mInboxEnabled = enabled;
+
+ LLLayoutPanel * inbox_layout_panel = getChild<LLLayoutPanel>(INBOX_LAYOUT_PANEL_NAME);
+ inbox_layout_panel->setVisible(enabled);
+}
+
+void LLSidepanelInventory::openInbox()
+{
+ if (mInboxEnabled)
+ {
+ getChild<LLButton>(INBOX_BUTTON_NAME)->setToggleState(true);
+ onToggleInboxBtn();
+ }
+}
+
+void LLSidepanelInventory::onInboxChanged(const LLUUID& inbox_id)
+{
+ // Trigger a load of the entire inbox so we always know the contents and their creation dates for sorting
+ LLInventoryModelBackgroundFetch::instance().start(inbox_id);
+
+#if AUTO_EXPAND_INBOX
+ // Expand the inbox since we have fresh items
+ if (mInboxEnabled)
+ {
+ getChild<LLButton>(INBOX_BUTTON_NAME)->setToggleState(true);
+ onToggleInboxBtn();
+ }
+#endif
+}
+
+void LLSidepanelInventory::onToggleInboxBtn()
+{
+ LLButton* inboxButton = getChild<LLButton>(INBOX_BUTTON_NAME);
+ LLLayoutPanel* inboxPanel = getChild<LLLayoutPanel>(INBOX_LAYOUT_PANEL_NAME);
+ LLLayoutStack* inv_stack = getChild<LLLayoutStack>(INVENTORY_LAYOUT_STACK_NAME);
+
+ const bool inbox_expanded = inboxButton->getToggleState();
+
+ // Expand/collapse the indicated panel
+ inv_stack->collapsePanel(inboxPanel, !inbox_expanded);
+
+ if (inbox_expanded)
+ {
+ inboxPanel->setTargetDim(gSavedPerAccountSettings.getS32("InventoryInboxHeight"));
+ if (inboxPanel->isInVisibleChain())
+ {
+ gSavedPerAccountSettings.setU32("LastInventoryInboxActivity", time_corrected());
+ }
+ }
+ else
+ {
+ gSavedPerAccountSettings.setS32("InventoryInboxHeight", inboxPanel->getTargetDim());
+ }
+
+}
+
void LLSidepanelInventory::onOpen(const LLSD& key)
{
LLFirstUse::newInventory(false);
+#if AUTO_EXPAND_INBOX
+ // Expand the inbox if we have fresh items
+ LLPanelMarketplaceInbox * inbox = findChild<LLPanelMarketplaceInbox>(MARKETPLACE_INBOX_PANEL);
+ if (inbox && (inbox->getFreshItemCount() > 0))
+ {
+ getChild<LLButton>(INBOX_BUTTON_NAME)->setToggleState(true);
+ onToggleInboxBtn();
+ }
+#else
+ if (mInboxEnabled && getChild<LLButton>(INBOX_BUTTON_NAME)->getToggleState())
+ {
+ gSavedPerAccountSettings.setU32("LastInventoryInboxActivity", time_corrected());
+ }
+#endif
+
if(key.size() == 0)
return;
@@ -171,26 +458,27 @@ void LLSidepanelInventory::onShopButtonClicked()
void LLSidepanelInventory::performActionOnSelection(const std::string &action)
{
- LLPanelMainInventory *panel_main_inventory = mInventoryPanel->findChild<LLPanelMainInventory>("panel_main_inventory");
- LLFolderViewItem* current_item = panel_main_inventory->getActivePanel()->getRootFolder()->getCurSelectedItem();
+ LLFolderViewItem* current_item = mPanelMainInventory->getActivePanel()->getRootFolder()->getCurSelectedItem();
if (!current_item)
{
- return;
+ if (mInventoryPanelInbox)
+ {
+ current_item = mInventoryPanelInbox->getRootFolder()->getCurSelectedItem();
+ }
+
+ if (!current_item)
+ {
+ return;
+ }
}
- current_item->getListener()->performAction(panel_main_inventory->getActivePanel()->getModel(), action);
+
+ current_item->getListener()->performAction(mPanelMainInventory->getActivePanel()->getModel(), action);
}
void LLSidepanelInventory::onWearButtonClicked()
{
- LLPanelMainInventory *panel_main_inventory = mInventoryPanel->findChild<LLPanelMainInventory>("panel_main_inventory");
- if (!panel_main_inventory)
- {
- llassert(panel_main_inventory != NULL);
- return;
- }
-
// Get selected items set.
- const std::set<LLUUID> selected_uuids_set = panel_main_inventory->getActivePanel()->getRootFolder()->getSelectionList();
+ const std::set<LLUUID> selected_uuids_set = LLAvatarActions::getInventorySelectedUUIDs();
if (selected_uuids_set.empty()) return; // nothing selected
// Convert the set to a vector.
@@ -326,34 +614,28 @@ void LLSidepanelInventory::updateVerbs()
bool LLSidepanelInventory::canShare()
{
- LLPanelMainInventory* panel_main_inventory =
- mInventoryPanel->findChild<LLPanelMainInventory>("panel_main_inventory");
+ LLInventoryPanel* inbox = mInventoryPanelInbox;
- if (!panel_main_inventory)
+ // Avoid flicker in the Recent tab while inventory is being loaded.
+ if ( (!inbox || inbox->getRootFolder()->getSelectionList().empty())
+ && (mPanelMainInventory && !mPanelMainInventory->getActivePanel()->getRootFolder()->hasVisibleChildren()) )
{
- llwarns << "Failed to get the main inventory panel" << llendl;
return false;
}
- LLInventoryPanel* active_panel = panel_main_inventory->getActivePanel();
- // Avoid flicker in the Recent tab while inventory is being loaded.
- if (!active_panel->getRootFolder()->hasVisibleChildren()) return false;
-
- return LLAvatarActions::canShareSelectedItems(active_panel);
+ return ( (mPanelMainInventory ? LLAvatarActions::canShareSelectedItems(mPanelMainInventory->getActivePanel()) : false)
+ || (inbox ? LLAvatarActions::canShareSelectedItems(inbox) : false) );
}
+
bool LLSidepanelInventory::canWearSelected()
{
- LLPanelMainInventory* panel_main_inventory =
- mInventoryPanel->findChild<LLPanelMainInventory>("panel_main_inventory");
- if (!panel_main_inventory)
- {
- llassert(panel_main_inventory != NULL);
+ std::set<LLUUID> selected_uuids = LLAvatarActions::getInventorySelectedUUIDs();
+
+ if (selected_uuids.empty())
return false;
- }
- std::set<LLUUID> selected_uuids = panel_main_inventory->getActivePanel()->getRootFolder()->getSelectionList();
for (std::set<LLUUID>::const_iterator it = selected_uuids.begin();
it != selected_uuids.end();
++it)
@@ -366,11 +648,19 @@ bool LLSidepanelInventory::canWearSelected()
LLInventoryItem *LLSidepanelInventory::getSelectedItem()
{
- LLPanelMainInventory *panel_main_inventory = mInventoryPanel->findChild<LLPanelMainInventory>("panel_main_inventory");
- LLFolderViewItem* current_item = panel_main_inventory->getActivePanel()->getRootFolder()->getCurSelectedItem();
+ LLFolderViewItem* current_item = mPanelMainInventory->getActivePanel()->getRootFolder()->getCurSelectedItem();
+
if (!current_item)
{
- return NULL;
+ if (mInventoryPanelInbox)
+ {
+ current_item = mInventoryPanelInbox->getRootFolder()->getCurSelectedItem();
+ }
+
+ if (!current_item)
+ {
+ return NULL;
+ }
}
const LLUUID &item_id = current_item->getListener()->getUUID();
LLInventoryItem *item = gInventory.getItem(item_id);
@@ -379,9 +669,19 @@ LLInventoryItem *LLSidepanelInventory::getSelectedItem()
U32 LLSidepanelInventory::getSelectedCount()
{
- LLPanelMainInventory *panel_main_inventory = mInventoryPanel->findChild<LLPanelMainInventory>("panel_main_inventory");
- std::set<LLUUID> selection_list = panel_main_inventory->getActivePanel()->getRootFolder()->getSelectionList();
- return selection_list.size();
+ int count = 0;
+
+ std::set<LLUUID> selection_list = mPanelMainInventory->getActivePanel()->getRootFolder()->getSelectionList();
+ count += selection_list.size();
+
+ if ((count == 0) && mInboxEnabled && (mInventoryPanelInbox != NULL))
+ {
+ selection_list = mInventoryPanelInbox->getRootFolder()->getSelectionList();
+
+ count += selection_list.size();
+ }
+
+ return count;
}
LLInventoryPanel *LLSidepanelInventory::getActivePanel()
@@ -401,3 +701,35 @@ BOOL LLSidepanelInventory::isMainInventoryPanelActive() const
{
return mInventoryPanel->getVisible();
}
+
+void LLSidepanelInventory::clearSelections(bool clearMain, bool clearInbox)
+{
+ if (clearMain)
+ {
+ LLInventoryPanel * inv_panel = getActivePanel();
+
+ if (inv_panel)
+ {
+ inv_panel->clearSelection();
+ }
+ }
+
+ if (clearInbox && mInboxEnabled && (mInventoryPanelInbox != NULL))
+ {
+ mInventoryPanelInbox->clearSelection();
+ }
+
+ updateVerbs();
+}
+
+std::set<LLUUID> LLSidepanelInventory::getInboxSelectionList()
+{
+ std::set<LLUUID> inventory_selected_uuids;
+
+ if (mInboxEnabled && (mInventoryPanelInbox != NULL))
+ {
+ inventory_selected_uuids = mInventoryPanelInbox->getRootFolder()->getSelectionList();
+ }
+
+ return inventory_selected_uuids;
+}
diff --git a/indra/newview/llsidepanelinventory.h b/indra/newview/llsidepanelinventory.h
index 32c98bc034..a33607f50d 100644
--- a/indra/newview/llsidepanelinventory.h
+++ b/indra/newview/llsidepanelinventory.h
@@ -29,9 +29,13 @@
#include "llpanel.h"
+class LLButton;
class LLFolderViewItem;
+class LLInboxAddedObserver;
+class LLInventoryCategoriesObserver;
class LLInventoryItem;
class LLInventoryPanel;
+class LLLayoutPanel;
class LLPanelMainInventory;
class LLSidepanelItemInfo;
class LLSidepanelTaskInfo;
@@ -42,13 +46,25 @@ public:
LLSidepanelInventory();
virtual ~LLSidepanelInventory();
+private:
+ void updateInbox();
+
+public:
+ void observeInboxCreation();
+ void observeInboxModifications(const LLUUID& inboxID);
+
/*virtual*/ BOOL postBuild();
/*virtual*/ void onOpen(const LLSD& key);
LLInventoryPanel* getActivePanel(); // Returns an active inventory panel, if any.
+ LLInventoryPanel* getInboxPanel() const { return mInventoryPanelInbox; }
+
LLPanelMainInventory* getMainInventoryPanel() const { return mPanelMainInventory; }
BOOL isMainInventoryPanelActive() const;
+ void clearSelections(bool clearMain, bool clearInbox);
+ std::set<LLUUID> getInboxSelectionList();
+
void showItemInfoPanel();
void showTaskInfoPanel();
void showInventoryPanel();
@@ -56,6 +72,16 @@ public:
// checks can share selected item(s)
bool canShare();
+ void onToggleInboxBtn();
+
+ void enableInbox(bool enabled);
+
+ void openInbox();
+
+ bool isInboxEnabled() const { return mInboxEnabled; }
+
+ void updateVerbs();
+
protected:
// Tracks highlighted (selected) item in inventory panel.
LLInventoryItem *getSelectedItem();
@@ -63,15 +89,17 @@ protected:
void onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action);
// "wear", "teleport", etc.
void performActionOnSelection(const std::string &action);
- void updateVerbs();
bool canWearSelected(); // check whether selected items can be worn
+ void onInboxChanged(const LLUUID& inbox_id);
+
//
// UI Elements
//
private:
LLPanel* mInventoryPanel; // Main inventory view
+ LLInventoryPanel* mInventoryPanelInbox;
LLSidepanelItemInfo* mItemPanel; // Individual item view
LLSidepanelTaskInfo* mTaskPanel; // Individual in-world object view
LLPanelMainInventory* mPanelMainInventory;
@@ -85,6 +113,7 @@ protected:
void onTeleportButtonClicked();
void onOverflowButtonClicked();
void onBackButtonClicked();
+
private:
LLButton* mInfoBtn;
LLButton* mShareBtn;
@@ -94,6 +123,10 @@ private:
LLButton* mOverflowBtn;
LLButton* mShopBtn;
+ bool mInboxEnabled;
+
+ LLInventoryCategoriesObserver* mCategoriesObserver;
+ LLInboxAddedObserver* mInboxAddedObserver;
};
#endif //LL_LLSIDEPANELINVENTORY_H
diff --git a/indra/newview/llsidepanelinventorysubpanel.cpp b/indra/newview/llsidepanelinventorysubpanel.cpp
index 37b10b592f..2918bb388a 100644
--- a/indra/newview/llsidepanelinventorysubpanel.cpp
+++ b/indra/newview/llsidepanelinventorysubpanel.cpp
@@ -46,8 +46,8 @@
///----------------------------------------------------------------------------
// Default constructor
-LLSidepanelInventorySubpanel::LLSidepanelInventorySubpanel()
- : LLPanel(),
+LLSidepanelInventorySubpanel::LLSidepanelInventorySubpanel(const LLPanel::Params& p)
+ : LLPanel(p),
mIsDirty(TRUE),
mIsEditing(FALSE),
mCancelBtn(NULL),
diff --git a/indra/newview/llsidepanelinventorysubpanel.h b/indra/newview/llsidepanelinventorysubpanel.h
index b2de7d3b0b..b5cf3aaf17 100644
--- a/indra/newview/llsidepanelinventorysubpanel.h
+++ b/indra/newview/llsidepanelinventorysubpanel.h
@@ -40,7 +40,7 @@ class LLInventoryItem;
class LLSidepanelInventorySubpanel : public LLPanel
{
public:
- LLSidepanelInventorySubpanel();
+ LLSidepanelInventorySubpanel(const LLPanel::Params& p = getDefaultParams());
virtual ~LLSidepanelInventorySubpanel();
/*virtual*/ void setVisible(BOOL visible);
diff --git a/indra/newview/llsidepaneliteminfo.cpp b/indra/newview/llsidepaneliteminfo.cpp
index be797ea937..1ce05da849 100644
--- a/indra/newview/llsidepaneliteminfo.cpp
+++ b/indra/newview/llsidepaneliteminfo.cpp
@@ -39,6 +39,7 @@
#include "llinventoryobserver.h"
#include "lllineeditor.h"
#include "llradiogroup.h"
+#include "llslurl.h"
#include "llviewercontrol.h"
#include "llviewerinventory.h"
#include "llviewerobjectlist.h"
@@ -71,12 +72,12 @@ void LLItemPropertiesObserver::changed(U32 mask)
const std::set<LLUUID>& mChangedItemIDs = gInventory.getChangedIDs();
std::set<LLUUID>::const_iterator it;
- const LLUUID& object_id = mFloater->getObjectID();
+ const LLUUID& item_id = mFloater->getItemID();
for (it = mChangedItemIDs.begin(); it != mChangedItemIDs.end(); it++)
{
// set dirty for 'item profile panel' only if changed item is the item for which 'item profile panel' is shown (STORM-288)
- if (*it == object_id)
+ if (*it == item_id)
{
// if there's a change we're interested in.
if((mask & (LLInventoryObserver::LABEL | LLInventoryObserver::INTERNAL | LLInventoryObserver::REMOVE)) != 0)
@@ -129,9 +130,10 @@ void LLObjectInventoryObserver::inventoryChanged(LLViewerObject* object,
static LLRegisterPanelClassWrapper<LLSidepanelItemInfo> t_item_info("sidepanel_item_info");
// Default constructor
-LLSidepanelItemInfo::LLSidepanelItemInfo()
- : mItemID(LLUUID::null)
- , mObjectInventoryObserver(NULL)
+LLSidepanelItemInfo::LLSidepanelItemInfo(const LLPanel::Params& p)
+ : LLSidepanelInventorySubpanel(p)
+ , mItemID(LLUUID::null)
+ , mObjectInventoryObserver(NULL)
{
mPropertiesObserver = new LLItemPropertiesObserver(this);
}
@@ -196,6 +198,11 @@ const LLUUID& LLSidepanelItemInfo::getObjectID() const
return mObjectID;
}
+const LLUUID& LLSidepanelItemInfo::getItemID() const
+{
+ return mItemID;
+}
+
void LLSidepanelItemInfo::reset()
{
LLSidepanelInventorySubpanel::reset();
diff --git a/indra/newview/llsidepaneliteminfo.h b/indra/newview/llsidepaneliteminfo.h
index 6416e2cfe4..12aaca923e 100644
--- a/indra/newview/llsidepaneliteminfo.h
+++ b/indra/newview/llsidepaneliteminfo.h
@@ -44,7 +44,7 @@ class LLPermissions;
class LLSidepanelItemInfo : public LLSidepanelInventorySubpanel
{
public:
- LLSidepanelItemInfo();
+ LLSidepanelItemInfo(const LLPanel::Params& p = getDefaultParams());
virtual ~LLSidepanelItemInfo();
/*virtual*/ BOOL postBuild();
@@ -55,6 +55,7 @@ public:
void setEditMode(BOOL edit);
const LLUUID& getObjectID() const;
+ const LLUUID& getItemID() const;
protected:
/*virtual*/ void refresh();
diff --git a/indra/newview/llsidepaneltaskinfo.cpp b/indra/newview/llsidepaneltaskinfo.cpp
index 47d904dfcc..24cb559fd0 100644
--- a/indra/newview/llsidepaneltaskinfo.cpp
+++ b/indra/newview/llsidepaneltaskinfo.cpp
@@ -117,6 +117,42 @@ BOOL LLSidepanelTaskInfo::postBuild()
childSetCommitCallback("checkbox next owner can transfer", &LLSidepanelTaskInfo::onCommitNextOwnerTransfer,this);
childSetCommitCallback("clickaction", &LLSidepanelTaskInfo::onCommitClickAction,this);
childSetCommitCallback("search_check", &LLSidepanelTaskInfo::onCommitIncludeInSearch,this);
+
+ mDAPermModify = getChild<LLUICtrl>("perm_modify");
+ mDACreator = getChildView("Creator:");
+ mDACreatorName = getChild<LLUICtrl>("Creator Name");
+ mDAOwner = getChildView("Owner:");
+ mDAOwnerName = getChild<LLUICtrl>("Owner Name");
+ mDAGroup = getChildView("Group:");
+ mDAGroupName = getChild<LLUICtrl>("Group Name");
+ mDAButtonSetGroup = getChildView("button set group");
+ mDAObjectName = getChild<LLUICtrl>("Object Name");
+ mDAName = getChildView("Name:");
+ mDADescription = getChildView("Description:");
+ mDAObjectDescription = getChild<LLUICtrl>("Object Description");
+ mDAPermissions = getChildView("Permissions:");
+ mDACheckboxShareWithGroup = getChild<LLUICtrl>("checkbox share with group");
+ mDAButtonDeed = getChildView("button deed");
+ mDACheckboxAllowEveryoneMove = getChild<LLUICtrl>("checkbox allow everyone move");
+ mDACheckboxAllowEveryoneCopy = getChild<LLUICtrl>("checkbox allow everyone copy");
+ mDANextOwnerCan = getChildView("Next owner can:");
+ mDACheckboxNextOwnerCanModify = getChild<LLUICtrl>("checkbox next owner can modify");
+ mDACheckboxNextOwnerCanCopy = getChild<LLUICtrl>("checkbox next owner can copy");
+ mDACheckboxNextOwnerCanTransfer = getChild<LLUICtrl>("checkbox next owner can transfer");
+ mDACheckboxForSale = getChild<LLUICtrl>("checkbox for sale");
+ mDASearchCheck = getChild<LLUICtrl>("search_check");
+ mDAComboSaleType = getChild<LLComboBox>("sale type");
+ mDACost = getChild<LLUICtrl>("Cost");
+ mDAEditCost = getChild<LLUICtrl>("Edit Cost");
+ mDALabelClickAction = getChildView("label click action");
+ mDAComboClickAction = getChild<LLComboBox>("clickaction");
+ mDAB = getChildView("B:");
+ mDAO = getChildView("O:");
+ mDAG = getChildView("G:");
+ mDAE = getChildView("E:");
+ mDAN = getChildView("N:");
+ mDAF = getChildView("F:");
+
return TRUE;
}
@@ -138,81 +174,80 @@ BOOL LLSidepanelTaskInfo::postBuild()
void LLSidepanelTaskInfo::disableAll()
{
- getChildView("perm_modify")->setEnabled(FALSE);
- getChild<LLUICtrl>("perm_modify")->setValue(LLStringUtil::null);
-
- getChildView("Creator:")->setEnabled(FALSE);
- getChild<LLUICtrl>("Creator Name")->setValue(LLStringUtil::null);
- getChildView("Creator Name")->setEnabled(FALSE);
-
- getChildView("Owner:")->setEnabled(FALSE);
- getChild<LLUICtrl>("Owner Name")->setValue(LLStringUtil::null);
- getChildView("Owner Name")->setEnabled(FALSE);
-
- getChildView("Group:")->setEnabled(FALSE);
- getChild<LLUICtrl>("Group Name")->setValue(LLStringUtil::null);
- getChildView("Group Name")->setEnabled(FALSE);
- getChildView("button set group")->setEnabled(FALSE);
-
- getChild<LLUICtrl>("Object Name")->setValue(LLStringUtil::null);
- getChildView("Object Name")->setEnabled(FALSE);
- getChildView("Name:")->setEnabled(FALSE);
- getChild<LLUICtrl>("Group Name")->setValue(LLStringUtil::null);
- getChildView("Group Name")->setEnabled(FALSE);
- getChildView("Description:")->setEnabled(FALSE);
- getChild<LLUICtrl>("Object Description")->setValue(LLStringUtil::null);
- getChildView("Object Description")->setEnabled(FALSE);
-
- getChildView("Permissions:")->setEnabled(FALSE);
+ mDAPermModify->setEnabled(FALSE);
+ mDAPermModify->setValue(LLStringUtil::null);
+
+ mDACreator->setEnabled(FALSE);
+ mDACreatorName->setValue(LLStringUtil::null);
+ mDACreatorName->setEnabled(FALSE);
+
+ mDAOwner->setEnabled(FALSE);
+ mDAOwnerName->setValue(LLStringUtil::null);
+ mDAOwnerName->setEnabled(FALSE);
+
+ mDAGroup->setEnabled(FALSE);
+ mDAGroupName->setValue(LLStringUtil::null);
+ mDAGroupName->setEnabled(FALSE);
+ mDAButtonSetGroup->setEnabled(FALSE);
+
+ mDAObjectName->setValue(LLStringUtil::null);
+ mDAObjectName->setEnabled(FALSE);
+ mDAName->setEnabled(FALSE);
+ mDAGroupName->setValue(LLStringUtil::null);
+ mDAGroupName->setEnabled(FALSE);
+ mDADescription->setEnabled(FALSE);
+ mDAObjectDescription->setValue(LLStringUtil::null);
+ mDAObjectDescription->setEnabled(FALSE);
+
+ mDAPermissions->setEnabled(FALSE);
- getChild<LLUICtrl>("checkbox share with group")->setValue(FALSE);
- getChildView("checkbox share with group")->setEnabled(FALSE);
- getChildView("button deed")->setEnabled(FALSE);
+ mDACheckboxShareWithGroup->setValue(FALSE);
+ mDACheckboxShareWithGroup->setEnabled(FALSE);
+ mDAButtonDeed->setEnabled(FALSE);
- getChild<LLUICtrl>("checkbox allow everyone move")->setValue(FALSE);
- getChildView("checkbox allow everyone move")->setEnabled(FALSE);
- getChild<LLUICtrl>("checkbox allow everyone copy")->setValue(FALSE);
- getChildView("checkbox allow everyone copy")->setEnabled(FALSE);
+ mDACheckboxAllowEveryoneMove->setValue(FALSE);
+ mDACheckboxAllowEveryoneMove->setEnabled(FALSE);
+ mDACheckboxAllowEveryoneCopy->setValue(FALSE);
+ mDACheckboxAllowEveryoneCopy->setEnabled(FALSE);
//Next owner can:
- getChildView("Next owner can:")->setEnabled(FALSE);
- getChild<LLUICtrl>("checkbox next owner can modify")->setValue(FALSE);
- getChildView("checkbox next owner can modify")->setEnabled(FALSE);
- getChild<LLUICtrl>("checkbox next owner can copy")->setValue(FALSE);
- getChildView("checkbox next owner can copy")->setEnabled(FALSE);
- getChild<LLUICtrl>("checkbox next owner can transfer")->setValue(FALSE);
- getChildView("checkbox next owner can transfer")->setEnabled(FALSE);
+ mDANextOwnerCan->setEnabled(FALSE);
+ mDACheckboxNextOwnerCanModify->setValue(FALSE);
+ mDACheckboxNextOwnerCanModify->setEnabled(FALSE);
+ mDACheckboxNextOwnerCanCopy->setValue(FALSE);
+ mDACheckboxNextOwnerCanCopy->setEnabled(FALSE);
+ mDACheckboxNextOwnerCanTransfer->setValue(FALSE);
+ mDACheckboxNextOwnerCanTransfer->setEnabled(FALSE);
//checkbox for sale
- getChild<LLUICtrl>("checkbox for sale")->setValue(FALSE);
- getChildView("checkbox for sale")->setEnabled(FALSE);
+ mDACheckboxForSale->setValue(FALSE);
+ mDACheckboxForSale->setEnabled(FALSE);
//checkbox include in search
- getChild<LLUICtrl>("search_check")->setValue(FALSE);
- getChildView("search_check")->setEnabled(FALSE);
+ mDASearchCheck->setValue(FALSE);
+ mDASearchCheck->setEnabled(FALSE);
- LLComboBox* combo_sale_type = getChild<LLComboBox>("sale type");
- combo_sale_type->setValue(LLSaleInfo::FS_COPY);
- combo_sale_type->setEnabled(FALSE);
+ mDAComboSaleType->setValue(LLSaleInfo::FS_COPY);
+ mDAComboSaleType->setEnabled(FALSE);
- getChildView("Cost")->setEnabled(FALSE);
- getChild<LLUICtrl>("Cost")->setValue(getString("Cost Default"));
- getChild<LLUICtrl>("Edit Cost")->setValue(LLStringUtil::null);
- getChildView("Edit Cost")->setEnabled(FALSE);
+ mDACost->setEnabled(FALSE);
+ mDACost->setValue(getString("Cost Default"));
+ mDAEditCost->setValue(LLStringUtil::null);
+ mDAEditCost->setEnabled(FALSE);
- getChildView("label click action")->setEnabled(FALSE);
- LLComboBox* combo_click_action = getChild<LLComboBox>("clickaction");
- if (combo_click_action)
+ mDALabelClickAction->setEnabled(FALSE);
+ if (mDAComboClickAction)
{
- combo_click_action->setEnabled(FALSE);
- combo_click_action->clear();
+ mDAComboClickAction->setEnabled(FALSE);
+ mDAComboClickAction->clear();
}
- getChildView("B:")->setVisible( FALSE);
- getChildView("O:")->setVisible( FALSE);
- getChildView("G:")->setVisible( FALSE);
- getChildView("E:")->setVisible( FALSE);
- getChildView("N:")->setVisible( FALSE);
- getChildView("F:")->setVisible( FALSE);
+
+ mDAB->setVisible(FALSE);
+ mDAO->setVisible(FALSE);
+ mDAG->setVisible(FALSE);
+ mDAE->setVisible(FALSE);
+ mDAN->setVisible(FALSE);
+ mDAF->setVisible(FALSE);
mOpenBtn->setEnabled(FALSE);
mPayBtn->setEnabled(FALSE);
@@ -1120,17 +1155,17 @@ void LLSidepanelTaskInfo::updateVerbs()
*/
LLSafeHandle<LLObjectSelection> object_selection = LLSelectMgr::getInstance()->getSelection();
- const BOOL multi_select = (object_selection->getNumNodes() > 1);
+ const BOOL any_selected = (object_selection->getNumNodes() > 0);
- mOpenBtn->setVisible(!multi_select);
- mPayBtn->setVisible(!multi_select);
- mBuyBtn->setVisible(!multi_select);
- mDetailsBtn->setVisible(multi_select);
- mDetailsBtn->setEnabled(multi_select);
+ mOpenBtn->setVisible(true);
+ mPayBtn->setVisible(true);
+ mBuyBtn->setVisible(true);
+ mDetailsBtn->setVisible(true);
mOpenBtn->setEnabled(enable_object_open());
mPayBtn->setEnabled(enable_pay_object());
mBuyBtn->setEnabled(enable_buy_object());
+ mDetailsBtn->setEnabled(any_selected);
}
void LLSidepanelTaskInfo::onOpenButtonClicked()
diff --git a/indra/newview/llsidepaneltaskinfo.h b/indra/newview/llsidepaneltaskinfo.h
index 384bc479d6..be0fee2127 100644
--- a/indra/newview/llsidepaneltaskinfo.h
+++ b/indra/newview/llsidepaneltaskinfo.h
@@ -37,8 +37,9 @@
// Panel for permissions of an object.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-class LLNameBox;
class LLCheckBoxCtrl;
+class LLComboBox;
+class LLNameBox;
class LLViewerObject;
class LLSidepanelTaskInfo : public LLSidepanelInventorySubpanel
@@ -118,6 +119,43 @@ private:
LLPointer<LLViewerObject> mObject;
LLObjectSelectionHandle mObjectSelection;
static LLSidepanelTaskInfo* sActivePanel;
+
+private:
+ // Pointers cached here to speed up the "disableAll" function which gets called on idle
+ LLUICtrl* mDAPermModify;
+ LLView* mDACreator;
+ LLUICtrl* mDACreatorName;
+ LLView* mDAOwner;
+ LLUICtrl* mDAOwnerName;
+ LLView* mDAGroup;
+ LLUICtrl* mDAGroupName;
+ LLView* mDAButtonSetGroup;
+ LLUICtrl* mDAObjectName;
+ LLView* mDAName;
+ LLView* mDADescription;
+ LLUICtrl* mDAObjectDescription;
+ LLView* mDAPermissions;
+ LLUICtrl* mDACheckboxShareWithGroup;
+ LLView* mDAButtonDeed;
+ LLUICtrl* mDACheckboxAllowEveryoneMove;
+ LLUICtrl* mDACheckboxAllowEveryoneCopy;
+ LLView* mDANextOwnerCan;
+ LLUICtrl* mDACheckboxNextOwnerCanModify;
+ LLUICtrl* mDACheckboxNextOwnerCanCopy;
+ LLUICtrl* mDACheckboxNextOwnerCanTransfer;
+ LLUICtrl* mDACheckboxForSale;
+ LLUICtrl* mDASearchCheck;
+ LLComboBox* mDAComboSaleType;
+ LLUICtrl* mDACost;
+ LLUICtrl* mDAEditCost;
+ LLView* mDALabelClickAction;
+ LLComboBox* mDAComboClickAction;
+ LLView* mDAB;
+ LLView* mDAO;
+ LLView* mDAG;
+ LLView* mDAE;
+ LLView* mDAN;
+ LLView* mDAF;
};
diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp
deleted file mode 100644
index 2905e369f1..0000000000
--- a/indra/newview/llsidetray.cpp
+++ /dev/null
@@ -1,1270 +0,0 @@
-/**
- * @file llsidetray.cpp
- * @brief SideBar implementation
- *
- * $LicenseInfo:firstyear=2009&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include "lltextbox.h"
-
-#include "llagentcamera.h"
-#include "llappviewer.h"
-#include "llbottomtray.h"
-#include "llfloaterreg.h"
-#include "llfirstuse.h"
-#include "llhints.h"
-#include "llsidetray.h"
-#include "llviewerwindow.h"
-#include "llaccordionctrl.h"
-#include "llfocusmgr.h"
-#include "llrootview.h"
-#include "llnavigationbar.h"
-
-#include "llaccordionctrltab.h"
-
-#include "llfloater.h" //for gFloaterView
-#include "lliconctrl.h"//for OpenClose tab icon
-#include "llsidetraypanelcontainer.h"
-#include "llscreenchannel.h"
-#include "llchannelmanager.h"
-#include "llwindow.h"//for SetCursor
-#include "lltransientfloatermgr.h"
-
-#include "llsidepanelappearance.h"
-
-//#include "llscrollcontainer.h"
-
-using namespace std;
-using namespace LLNotificationsUI;
-
-static LLRootViewRegistry::Register<LLSideTray> t1("side_tray");
-static LLDefaultChildRegistry::Register<LLSideTrayTab> t2("sidetray_tab");
-
-static const S32 BOTTOM_BAR_PAD = 5;
-
-static const std::string COLLAPSED_NAME = "<<";
-static const std::string EXPANDED_NAME = ">>";
-
-static const std::string TAB_PANEL_CAPTION_NAME = "sidetray_tab_panel";
-static const std::string TAB_PANEL_CAPTION_TITLE_BOX = "sidetray_tab_title";
-
-LLSideTray* LLSideTray::sInstance = 0;
-
-// static
-LLSideTray* LLSideTray::getInstance()
-{
- if (!sInstance)
- {
- sInstance = LLUICtrlFactory::createFromFile<LLSideTray>("panel_side_tray.xml",NULL, LLRootView::child_registry_t::instance());
- sInstance->setXMLFilename("panel_side_tray.xml");
- }
-
- return sInstance;
-}
-
-// static
-bool LLSideTray::instanceCreated ()
-{
- return sInstance!=0;
-}
-
-//////////////////////////////////////////////////////////////////////////////
-// LLSideTrayTab
-// Represents a single tab in the side tray, only used by LLSideTray
-//////////////////////////////////////////////////////////////////////////////
-
-class LLSideTrayTab: public LLPanel
-{
- friend class LLUICtrlFactory;
- friend class LLSideTray;
-public:
-
- struct Params
- : public LLInitParam::Block<Params, LLPanel::Params>
- {
- // image name
- Optional<std::string> image;
- Optional<std::string> image_selected;
- Optional<std::string> tab_title;
- Optional<std::string> description;
- Params()
- : image("image"),
- image_selected("image_selected"),
- tab_title("tab_title","no title"),
- description("description","no description")
- {};
- };
-protected:
- LLSideTrayTab(const Params& params);
-
- void dock();
- void undock(LLFloater* floater_tab);
-
- LLSideTray* getSideTray();
-
-public:
- virtual ~LLSideTrayTab();
-
- /*virtual*/ BOOL postBuild ();
- /*virtual*/ bool addChild (LLView* view, S32 tab_group);
-
-
- void reshape (S32 width, S32 height, BOOL called_from_parent = TRUE);
-
- static LLSideTrayTab* createInstance ();
-
- const std::string& getDescription () const { return mDescription;}
- const std::string& getTabTitle() const { return mTabTitle;}
-
- void onOpen (const LLSD& key);
-
- void toggleTabDocked();
-
- LLPanel *getPanel();
-private:
- std::string mTabTitle;
- std::string mImage;
- std::string mImageSelected;
- std::string mDescription;
-
- LLView* mMainPanel;
-};
-
-LLSideTrayTab::LLSideTrayTab(const Params& p)
-: LLPanel(),
- mTabTitle(p.tab_title),
- mImage(p.image),
- mImageSelected(p.image_selected),
- mDescription(p.description),
- mMainPanel(NULL)
-{
- // Necessary for focus movement among child controls
- setFocusRoot(TRUE);
-}
-
-LLSideTrayTab::~LLSideTrayTab()
-{
-}
-
-bool LLSideTrayTab::addChild(LLView* view, S32 tab_group)
-{
- if(mMainPanel == 0 && TAB_PANEL_CAPTION_NAME != view->getName())//skip our caption panel
- mMainPanel = view;
- return LLPanel::addChild(view,tab_group);
- //return res;
-}
-
-
-
-//virtual
-BOOL LLSideTrayTab::postBuild()
-{
- LLPanel* title_panel = LLUICtrlFactory::getInstance()->createFromFile<LLPanel>("panel_side_tray_tab_caption.xml",this, child_registry_t::instance());
- string name = title_panel->getName();
- LLPanel::addChild(title_panel);
-
- title_panel->getChild<LLTextBox>(TAB_PANEL_CAPTION_TITLE_BOX)->setValue(mTabTitle);
-
- getChild<LLButton>("undock")->setCommitCallback(boost::bind(&LLSideTrayTab::toggleTabDocked, this));
- getChild<LLButton>("dock")->setCommitCallback(boost::bind(&LLSideTrayTab::toggleTabDocked, this));
-
- return true;
-}
-
-static const S32 splitter_margin = 1;
-
-void LLSideTrayTab::reshape (S32 width, S32 height, BOOL called_from_parent )
-{
- LLPanel::reshape(width, height, called_from_parent);
- LLView* title_panel = findChildView(TAB_PANEL_CAPTION_NAME, true);
- if (!title_panel)
- {
- // not fully constructed yet
- return;
- }
-
- S32 title_height = title_panel->getRect().getHeight();
- title_panel->setOrigin( 0, height - title_height );
- title_panel->reshape(width,title_height);
-
- LLRect sRect;
- sRect.setLeftTopAndSize( splitter_margin, height - title_height - splitter_margin,
- width - 2*splitter_margin, height - title_height - 2*splitter_margin);
- mMainPanel->setShape(sRect);
-}
-
-void LLSideTrayTab::onOpen (const LLSD& key)
-{
- LLPanel *panel = getPanel();
- if(panel)
- panel->onOpen(key);
-}
-
-// Attempts to get the existing side tray instance.
-// Needed to avoid recursive calls of LLSideTray::getInstance().
-LLSideTray* LLSideTrayTab::getSideTray()
-{
- // First, check if the side tray is our parent (i.e. we're attached).
- LLSideTray* side_tray = dynamic_cast<LLSideTray*>(getParent());
- if (!side_tray)
- {
- // Detached? Ok, check if the instance exists at all/
- if (LLSideTray::instanceCreated())
- {
- side_tray = LLSideTray::getInstance();
- }
- else
- {
- llerrs << "No safe way to get the side tray instance" << llendl;
- }
- }
-
- return side_tray;
-}
-
-void LLSideTrayTab::toggleTabDocked()
-{
- std::string tab_name = getName();
-
- LLFloater* floater_tab = LLFloaterReg::getInstance("side_bar_tab", tab_name);
- if (!floater_tab) return;
-
- bool docking = LLFloater::isShown(floater_tab);
-
- // Hide the "Tear Off" button when a tab gets undocked
- // and show "Dock" button instead.
- getChild<LLButton>("undock")->setVisible(docking);
- getChild<LLButton>("dock")->setVisible(!docking);
-
- if (docking)
- {
- dock();
- }
- else
- {
- undock(floater_tab);
- }
-
- // Open/close the floater *after* we reparent the tab panel,
- // so that it doesn't receive redundant visibility change notifications.
- LLFloaterReg::toggleInstance("side_bar_tab", tab_name);
-}
-
-void LLSideTrayTab::dock()
-{
- LLSideTray* side_tray = getSideTray();
- if (!side_tray) return;
-
- if (!side_tray->addTab(this))
- {
- llwarns << "Failed to add tab " << getName() << " to side tray" << llendl;
- return;
- }
-
- setRect(side_tray->getLocalRect());
- reshape(getRect().getWidth(), getRect().getHeight());
-
- // Select the re-docked tab.
- side_tray->selectTabByName(getName());
-
- if (side_tray->getCollapsed())
- {
- side_tray->expandSideBar(false);
- }
-}
-
-static void on_minimize(LLSidepanelAppearance* panel, LLSD minimized)
-{
- if (!panel) return;
- bool visible = !minimized.asBoolean();
- LLSD visibility;
- visibility["visible"] = visible;
- // Do not reset accordion state on minimize (STORM-375)
- visibility["reset_accordion"] = false;
- panel->updateToVisibility(visibility);
-}
-
-void LLSideTrayTab::undock(LLFloater* floater_tab)
-{
- LLSideTray* side_tray = getSideTray();
- if (!side_tray) return;
-
- // Remember whether the tab have been active before detaching
- // because removeTab() will change active tab.
- bool was_active = side_tray->getActiveTab() == this;
-
- // Remove the tab from Side Tray's tabs list.
- // We have to do it despite removing the tab from Side Tray's child view tree
- // by addChild(). Otherwise the tab could be accessed by the pointer in LLSideTray::mTabs.
- if (!side_tray->removeTab(this))
- {
- llwarns << "Failed to remove tab " << getName() << " from side tray" << llendl;
- return;
- }
-
- // If we're undocking while side tray is collapsed we need to explicitly show the panel.
- if (!getVisible())
- {
- setVisible(true);
- }
-
- floater_tab->addChild(this);
- floater_tab->setTitle(mTabTitle);
- floater_tab->setName(getName());
-
- // Resize handles get obscured by added panel so move them to front.
- floater_tab->moveResizeHandlesToFront();
-
- // Reshape the floater if needed.
- LLRect floater_rect;
- if (floater_tab->hasSavedRect())
- {
- // We've got saved rect for the floater, hence no need to reshape it.
- floater_rect = floater_tab->getLocalRect();
- }
- else
- {
- // Detaching for the first time. Reshape the floater.
- floater_rect = side_tray->getLocalRect();
-
- // Reduce detached floater height by small BOTTOM_BAR_PAD not to make it flush with the bottom bar.
- floater_rect.mBottom += LLBottomTray::getInstance()->getRect().getHeight() + BOTTOM_BAR_PAD;
- floater_rect.makeValid();
- floater_tab->reshape(floater_rect.getWidth(), floater_rect.getHeight());
- }
-
- // Reshape the panel.
- {
- LLRect panel_rect = floater_tab->getLocalRect();
- panel_rect.mTop -= floater_tab->getHeaderHeight();
- panel_rect.makeValid();
- setRect(panel_rect);
- reshape(panel_rect.getWidth(), panel_rect.getHeight());
- }
-
- // Set FOLLOWS_ALL flag for the tab to follow floater dimensions upon resizing.
- setFollowsAll();
-
- // Camera view may need to be changed for appearance panel(STORM-301) on minimize of floater,
- // so setting callback here.
- if (getName() == "sidebar_appearance")
- {
- LLSidepanelAppearance* panel_appearance = dynamic_cast<LLSidepanelAppearance*>(getPanel());
- if(panel_appearance)
- {
- floater_tab->setMinimizeCallback(boost::bind(&on_minimize, panel_appearance, _2));
- }
- }
-
- if (!side_tray->getCollapsed())
- {
- side_tray->collapseSideBar();
- }
-
- if (!was_active)
- {
- // When a tab other then current active tab is detached from Side Tray
- // onOpen() should be called as tab visibility is changed.
- onOpen(LLSD());
- }
-}
-
-LLPanel* LLSideTrayTab::getPanel()
-{
- LLPanel* panel = dynamic_cast<LLPanel*>(mMainPanel);
- return panel;
-}
-
-LLSideTrayTab* LLSideTrayTab::createInstance ()
-{
- LLSideTrayTab::Params tab_params;
- tab_params.tab_title("openclose");
-
- LLSideTrayTab* tab = LLUICtrlFactory::create<LLSideTrayTab>(tab_params);
- return tab;
-}
-
-//////////////////////////////////////////////////////////////////////////////
-// LLSideTrayButton
-// Side Tray tab button with "tear off" handling.
-//////////////////////////////////////////////////////////////////////////////
-
-class LLSideTrayButton : public LLButton
-{
-public:
- /*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask)
- {
- // Route future Mouse messages here preemptively. (Release on mouse up.)
- // No handler needed for focus lost since this class has no state that depends on it.
- gFocusMgr.setMouseCapture(this);
-
- localPointToScreen(x, y, &mDragLastScreenX, &mDragLastScreenY);
-
- // Note: don't pass on to children
- return TRUE;
- }
-
- /*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask)
- {
- // We only handle the click if the click both started and ended within us
- if( !hasMouseCapture() ) return FALSE;
-
- S32 screen_x;
- S32 screen_y;
- localPointToScreen(x, y, &screen_x, &screen_y);
-
- S32 delta_x = screen_x - mDragLastScreenX;
- S32 delta_y = screen_y - mDragLastScreenY;
-
- LLSideTray* side_tray = LLSideTray::getInstance();
-
- // Check if the tab we are dragging is docked.
- if (!side_tray->isTabAttached(getName())) return FALSE;
-
- // Same value is hardcoded in LLDragHandle::handleHover().
- const S32 undock_threshold = 12;
-
- // Detach a tab if it has been pulled further than undock_threshold.
- if (delta_x <= -undock_threshold || delta_x >= undock_threshold ||
- delta_y <= -undock_threshold || delta_y >= undock_threshold)
- {
- LLSideTrayTab* tab = side_tray->getTab(getName());
- if (!tab) return FALSE;
-
- tab->toggleTabDocked();
-
- LLFloater* floater_tab = LLFloaterReg::getInstance("side_bar_tab", tab->getName());
- if (!floater_tab) return FALSE;
-
- LLRect original_rect = floater_tab->getRect();
- S32 header_snap_y = floater_tab->getHeaderHeight() / 2;
- S32 snap_x = screen_x - original_rect.mLeft - original_rect.getWidth() / 2;
- S32 snap_y = screen_y - original_rect.mTop + header_snap_y;
-
- // Move the floater to appear "under" the mouse pointer.
- floater_tab->setRect(original_rect.translate(snap_x, snap_y));
-
- // Snap the mouse pointer to the center of the floater header
- // and call 'mouse down' event handler to begin dragging.
- floater_tab->handleMouseDown(original_rect.getWidth() / 2,
- original_rect.getHeight() - header_snap_y,
- mask);
-
- return TRUE;
- }
-
- return FALSE;
- }
-
-protected:
- LLSideTrayButton(const LLButton::Params& p)
- : LLButton(p)
- , mDragLastScreenX(0)
- , mDragLastScreenY(0)
- {}
-
- friend class LLUICtrlFactory;
-
-private:
- S32 mDragLastScreenX;
- S32 mDragLastScreenY;
-};
-
-//////////////////////////////////////////////////////////////////////////////
-// LLSideTray
-//////////////////////////////////////////////////////////////////////////////
-
-LLSideTray::Params::Params()
-: collapsed("collapsed",false),
- tab_btn_image_normal("tab_btn_image",LLUI::getUIImage("sidebar_tab_left.tga")),
- tab_btn_image_selected("tab_btn_image_selected",LLUI::getUIImage("button_enabled_selected_32x128.tga")),
- default_button_width("tab_btn_width",32),
- default_button_height("tab_btn_height",32),
- default_button_margin("tab_btn_margin",0)
-{}
-
-//virtual
-LLSideTray::LLSideTray(const Params& params)
- : LLPanel(params)
- ,mActiveTab(0)
- ,mCollapsed(false)
- ,mCollapseButton(0)
-{
- mCollapsed=params.collapsed;
-
- LLUICtrl::CommitCallbackRegistry::Registrar& commit = LLUICtrl::CommitCallbackRegistry::currentRegistrar();
-
- // register handler function to process data from the xml.
- // panel_name should be specified via "parameter" attribute.
- commit.add("SideTray.ShowPanel", boost::bind(&LLSideTray::showPanel, this, _2, LLUUID::null));
- LLTransientFloaterMgr::getInstance()->addControlView(this);
- LLView* side_bar_tabs = gViewerWindow->getRootView()->getChildView("side_bar_tabs");
- if (side_bar_tabs != NULL)
- {
- LLTransientFloaterMgr::getInstance()->addControlView(side_bar_tabs);
- }
-
- LLPanel::Params p;
- p.name = "buttons_panel";
- p.mouse_opaque = false;
- mButtonsPanel = LLUICtrlFactory::create<LLPanel>(p);
-}
-
-
-BOOL LLSideTray::postBuild()
-{
- createButtons();
-
- arrange();
- selectTabByName("sidebar_home");
-
- if(mCollapsed)
- collapseSideBar();
-
- setMouseOpaque(false);
-
- LLAppViewer::instance()->setOnLoginCompletedCallback(boost::bind(&LLSideTray::handleLoginComplete, this));
-
- // Remember original tabs order, so that we can restore it if user detaches and then re-attaches a tab.
- for (child_vector_const_iter_t it = mTabs.begin(); it != mTabs.end(); ++it)
- {
- std::string tab_name = (*it)->getName();
- mOriginalTabOrder.push_back(tab_name);
- }
-
- //EXT-8045
- //connect all already created channels to reflect sidetray collapse/expand
- std::vector<LLChannelManager::ChannelElem>& channels = LLChannelManager::getInstance()->getChannelList();
- for(std::vector<LLChannelManager::ChannelElem>::iterator it = channels.begin();it!=channels.end();++it)
- {
- if ((*it).channel)
- {
- getCollapseSignal().connect(boost::bind(&LLScreenChannelBase::resetPositionAndSize, (*it).channel, _2));
- }
- }
-
- return true;
-}
-
-void LLSideTray::handleLoginComplete()
-{
- //reset tab to "home" tab if it was changesd during login process
- selectTabByName("sidebar_home");
-
- detachTabs();
-}
-
-LLSideTrayTab* LLSideTray::getTab(const std::string& name)
-{
- return findChild<LLSideTrayTab>(name,false);
-}
-
-bool LLSideTray::isTabAttached(const std::string& name)
-{
- LLSideTrayTab* tab = getTab(name);
- if (!tab) return false;
-
- return std::find(mTabs.begin(), mTabs.end(), tab) != mTabs.end();
-}
-
-bool LLSideTray::hasTabs()
-{
- // The open/close tab doesn't count.
- return mTabs.size() > 1;
-}
-
-void LLSideTray::toggleTabButton(LLSideTrayTab* tab)
-{
- if(tab == NULL)
- return;
- std::string name = tab->getName();
- std::map<std::string,LLButton*>::iterator it = mTabButtons.find(name);
- if(it != mTabButtons.end())
- {
- LLButton* btn = it->second;
- bool new_state = !btn->getToggleState();
- btn->setToggleState(new_state);
- // Only highlight the tab if side tray is expanded (STORM-157).
- btn->setImageOverlay( new_state && !getCollapsed() ? tab->mImageSelected : tab->mImage );
- }
-}
-
-LLPanel* LLSideTray::openChildPanel(LLSideTrayTab* tab, const std::string& panel_name, const LLSD& params)
-{
- LLView* view = tab->findChildView(panel_name, true);
- if (!view) return NULL;
-
- std::string tab_name = tab->getName();
-
- // Select tab and expand Side Tray only when a tab is attached.
- if (isTabAttached(tab_name))
- {
- selectTabByName(tab_name);
- if (mCollapsed)
- expandSideBar();
- }
- else
- {
- LLFloater* floater_tab = LLFloaterReg::getInstance("side_bar_tab", tab_name);
- if (!floater_tab) return NULL;
-
- // Restore the floater if it was minimized.
- if (floater_tab->isMinimized())
- {
- floater_tab->setMinimized(FALSE);
- }
-
- // Send the floater to the front.
- floater_tab->setFrontmost();
- }
-
- LLSideTrayPanelContainer* container = dynamic_cast<LLSideTrayPanelContainer*>(view->getParent());
- if (container)
- {
- LLSD new_params = params;
- new_params[LLSideTrayPanelContainer::PARAM_SUB_PANEL_NAME] = panel_name;
- container->onOpen(new_params);
-
- return container->getCurrentPanel();
- }
-
- LLPanel* panel = dynamic_cast<LLPanel*>(view);
- if (panel)
- {
- panel->onOpen(params);
- }
-
- return panel;
-}
-
-bool LLSideTray::selectTabByIndex(size_t index)
-{
- if(index>=mTabs.size())
- return false;
-
- LLSideTrayTab* sidebar_tab = mTabs[index];
- return selectTabByName(sidebar_tab->getName());
-}
-
-bool LLSideTray::selectTabByName(const std::string& name, bool keep_prev_visible)
-{
- LLSideTrayTab* tab_to_keep_visible = NULL;
- LLSideTrayTab* new_tab = getTab(name);
- if (!new_tab) return false;
-
- // Bail out if already selected.
- if (new_tab == mActiveTab)
- return false;
-
- //deselect old tab
- if (mActiveTab)
- {
- // Keep previously active tab visible if requested.
- if (keep_prev_visible) tab_to_keep_visible = mActiveTab;
- toggleTabButton(mActiveTab);
- }
-
- //select new tab
- mActiveTab = new_tab;
-
- if (mActiveTab)
- {
- toggleTabButton(mActiveTab);
- LLSD key;//empty
- mActiveTab->onOpen(key);
- }
-
- //arrange();
-
- //hide all tabs - show active tab
- child_vector_const_iter_t child_it;
- for ( child_it = mTabs.begin(); child_it != mTabs.end(); ++child_it)
- {
- LLSideTrayTab* sidebar_tab = *child_it;
-
- bool vis = sidebar_tab == mActiveTab;
-
- // Force keeping the tab visible if requested.
- vis |= sidebar_tab == tab_to_keep_visible;
-
- // When the last tab gets detached, for a short moment the "Toggle Sidebar" pseudo-tab
- // is shown. So, to avoid the flicker we make sure it never gets visible.
- vis &= (*child_it)->getName() != "sidebar_openclose";
-
- sidebar_tab->setVisible(vis);
- }
- return true;
-}
-
-LLButton* LLSideTray::createButton (const std::string& name,const std::string& image,const std::string& tooltip,
- LLUICtrl::commit_callback_t callback)
-{
- static LLSideTray::Params sidetray_params(LLUICtrlFactory::getDefaultParams<LLSideTray>());
-
- LLButton::Params bparams;
-
- LLRect rect;
- rect.setOriginAndSize(0, 0, sidetray_params.default_button_width, sidetray_params.default_button_height);
-
- bparams.name(name);
- bparams.follows.flags (FOLLOWS_LEFT | FOLLOWS_TOP);
- bparams.rect (rect);
- bparams.tab_stop(false);
- bparams.image_unselected(sidetray_params.tab_btn_image_normal);
- bparams.image_selected(sidetray_params.tab_btn_image_selected);
- bparams.image_disabled(sidetray_params.tab_btn_image_normal);
- bparams.image_disabled_selected(sidetray_params.tab_btn_image_selected);
-
- LLButton* button;
- if (name == "sidebar_openclose")
- {
- // "Open/Close" button shouldn't allow "tear off"
- // hence it is created as LLButton instance.
- button = LLUICtrlFactory::create<LLButton>(bparams);
- }
- else
- {
- button = LLUICtrlFactory::create<LLSideTrayButton>(bparams);
- }
-
- button->setClickedCallback(callback);
-
- button->setToolTip(tooltip);
-
- if(image.length())
- {
- button->setImageOverlay(image);
- }
-
- mButtonsPanel->addChildInBack(button);
-
- return button;
-}
-
-bool LLSideTray::addChild(LLView* view, S32 tab_group)
-{
- LLSideTrayTab* tab_panel = dynamic_cast<LLSideTrayTab*>(view);
-
- if (tab_panel)
- {
- mTabs.push_back(tab_panel);
- }
-
- return LLUICtrl::addChild(view, tab_group);
-}
-
-bool LLSideTray::removeTab(LLSideTrayTab* tab)
-{
- if (!tab) return false;
- std::string tab_name = tab->getName();
-
- // Look up the tab in the list of known tabs.
- child_vector_iter_t tab_it = std::find(mTabs.begin(), mTabs.end(), tab);
- if (tab_it == mTabs.end())
- {
- llwarns << "Cannot find tab named " << tab_name << llendl;
- return false;
- }
-
- // Find the button corresponding to the tab.
- button_map_t::iterator btn_it = mTabButtons.find(tab_name);
- if (btn_it == mTabButtons.end())
- {
- llwarns << "Cannot find button for tab named " << tab_name << llendl;
- return false;
- }
- LLButton* btn = btn_it->second;
-
- // Deselect the tab.
- if (mActiveTab == tab)
- {
- // Select the next tab (or first one, if we're removing the last tab),
- // skipping the fake open/close tab (STORM-155).
- child_vector_iter_t next_tab_it = tab_it;
- do
- {
- next_tab_it = (next_tab_it < (mTabs.end() - 1)) ? next_tab_it + 1 : mTabs.begin();
- }
- while ((*next_tab_it)->getName() == "sidebar_openclose");
-
- selectTabByName((*next_tab_it)->getName(), true); // Don't hide the tab being removed.
- }
-
- // Remove the tab.
- removeChild(tab);
- mTabs.erase(tab_it);
-
- // Add the tab to detached tabs list.
- mDetachedTabs.push_back(tab);
-
- // Remove the button from the buttons panel so that it isn't drawn anymore.
- mButtonsPanel->removeChild(btn);
-
- // Re-arrange remaining tabs.
- arrange();
-
- return true;
-}
-
-bool LLSideTray::addTab(LLSideTrayTab* tab)
-{
- if (tab == NULL) return false;
-
- std::string tab_name = tab->getName();
-
- // Make sure the tab isn't already in the list.
- if (std::find(mTabs.begin(), mTabs.end(), tab) != mTabs.end())
- {
- llwarns << "Attempt to re-add existing tab " << tab_name << llendl;
- return false;
- }
-
- // Look up the corresponding button.
- button_map_t::const_iterator btn_it = mTabButtons.find(tab_name);
- if (btn_it == mTabButtons.end())
- {
- llwarns << "Tab " << tab_name << " has no associated button" << llendl;
- return false;
- }
- LLButton* btn = btn_it->second;
-
- // Insert the tab at its original position.
- LLUICtrl::addChild(tab);
- {
- tab_order_vector_const_iter_t new_tab_orig_pos =
- std::find(mOriginalTabOrder.begin(), mOriginalTabOrder.end(), tab_name);
- llassert(new_tab_orig_pos != mOriginalTabOrder.end());
- child_vector_iter_t insert_pos = mTabs.end();
-
- for (child_vector_iter_t tab_it = mTabs.begin(); tab_it != mTabs.end(); ++tab_it)
- {
- tab_order_vector_const_iter_t cur_tab_orig_pos =
- std::find(mOriginalTabOrder.begin(), mOriginalTabOrder.end(), (*tab_it)->getName());
- llassert(cur_tab_orig_pos != mOriginalTabOrder.end());
-
- if (new_tab_orig_pos < cur_tab_orig_pos)
- {
- insert_pos = tab_it;
- break;
- }
- }
-
- mTabs.insert(insert_pos, tab);
- }
-
- // Add the button to the buttons panel so that it's drawn again.
- mButtonsPanel->addChildInBack(btn);
-
- // Arrange tabs after inserting a new one.
- arrange();
-
- // Remove the tab from the list of detached tabs.
- child_vector_iter_t tab_it = std::find(mDetachedTabs.begin(), mDetachedTabs.end(), tab);
- if (tab_it != mDetachedTabs.end())
- {
- mDetachedTabs.erase(tab_it);
- }
-
- return true;
-}
-
-void LLSideTray::createButtons ()
-{
- //create buttons for tabs
- child_vector_const_iter_t child_it = mTabs.begin();
- for ( ; child_it != mTabs.end(); ++child_it)
- {
- LLSideTrayTab* sidebar_tab = *child_it;
-
- std::string name = sidebar_tab->getName();
-
- // The "OpenClose" button will open/close the whole panel
- if (name == "sidebar_openclose")
- {
- mCollapseButton = createButton(name,sidebar_tab->mImage,sidebar_tab->getTabTitle(),
- boost::bind(&LLSideTray::onToggleCollapse, this));
- LLHints::registerHintTarget("side_panel_btn", mCollapseButton->getHandle());
- }
- else
- {
- LLButton* button = createButton(name,sidebar_tab->mImage,sidebar_tab->getTabTitle(),
- boost::bind(&LLSideTray::onTabButtonClick, this, name));
- mTabButtons[name] = button;
- }
- }
- LLHints::registerHintTarget("inventory_btn", mTabButtons["sidebar_inventory"]->getHandle());
- LLHints::registerHintTarget("dest_guide_btn", mTabButtons["sidebar_places"]->getHandle());
-}
-
-void LLSideTray::processTriState ()
-{
- if(mCollapsed)
- expandSideBar();
- else
- {
-#if 0 // *TODO: EXT-2092
-
- // Tell the active task panel to switch to its default view
- // or collapse side tray if already on the default view.
- LLSD info;
- info["task-panel-action"] = "handle-tri-state";
- mActiveTab->notifyChildren(info);
-#else
- collapseSideBar();
-#endif
- }
-}
-
-void LLSideTray::onTabButtonClick(string name)
-{
- LLSideTrayTab* tab = getTab(name);
- if (!tab) return;
-
- if(tab == mActiveTab)
- {
- processTriState ();
- return;
- }
- selectTabByName (name);
- if(mCollapsed)
- expandSideBar();
-}
-
-void LLSideTray::onToggleCollapse()
-{
- LLFirstUse::notUsingSidePanel(false);
- if(mCollapsed)
- {
- expandSideBar();
- //selectTabByName("sidebar_openclose");
- }
- else
- collapseSideBar();
-}
-
-
-void LLSideTray::reflectCollapseChange()
-{
- updateSidetrayVisibility();
-
- if(mCollapsed)
- {
- gFloaterView->setSnapOffsetRight(0);
- setFocus(FALSE);
- }
- else
- {
- gFloaterView->setSnapOffsetRight(getRect().getWidth());
- setFocus(TRUE);
- }
-
- gFloaterView->refresh();
-
- LLSD new_value = mCollapsed;
- mCollapseSignal(this,new_value);
-}
-
-void LLSideTray::arrange()
-{
- static LLSideTray::Params sidetray_params(LLUICtrlFactory::getDefaultParams<LLSideTray>());
-
- updateSidetrayVisibility();
-
- LLRect ctrl_rect;
- ctrl_rect.setLeftTopAndSize(0,
- mButtonsPanel->getRect().getHeight() - sidetray_params.default_button_width,
- sidetray_params.default_button_width,
- sidetray_params.default_button_height);
-
- mCollapseButton->setRect(ctrl_rect);
-
- //arrange tab buttons
- //arrange tab buttons
- child_vector_const_iter_t child_it;
- int offset = (sidetray_params.default_button_height+sidetray_params.default_button_margin)*2;
- for ( child_it = mTabs.begin(); child_it != mTabs.end(); ++child_it)
- {
- LLSideTrayTab* sidebar_tab = *child_it;
-
- ctrl_rect.setLeftTopAndSize(0,
- mButtonsPanel->getRect().getHeight()-offset,
- sidetray_params.default_button_width,
- sidetray_params.default_button_height);
-
- if(mTabButtons.find(sidebar_tab->getName()) == mTabButtons.end())
- continue;
-
- LLButton* btn = mTabButtons[sidebar_tab->getName()];
-
- btn->setRect(ctrl_rect);
- offset+=sidetray_params.default_button_height;
- offset+=sidetray_params.default_button_margin;
-
- btn->setVisible(ctrl_rect.mBottom > 0);
- }
-
- //arrange tabs
- for ( child_vector_t::iterator child_it = mTabs.begin(); child_it != mTabs.end(); ++child_it)
- {
- LLSideTrayTab* sidebar_tab = *child_it;
- sidebar_tab->setShape(getLocalRect());
- }
-
- // The tab buttons should be shown only if there is at least one non-detached tab.
- // Also hide them in mouse-look mode.
- mButtonsPanel->setVisible(hasTabs() && !gAgentCamera.cameraMouselook());
-}
-
-// Detach those tabs that were detached when the viewer exited last time.
-void LLSideTray::detachTabs()
-{
- // copy mTabs because LLSideTray::toggleTabDocked() modifies it.
- child_vector_t tabs = mTabs;
-
- for (child_vector_const_iter_t it = tabs.begin(); it != tabs.end(); ++it)
- {
- LLSideTrayTab* tab = *it;
-
- std::string floater_ctrl_name = LLFloater::getControlName("side_bar_tab", LLSD(tab->getName()));
- std::string vis_ctrl_name = LLFloaterReg::getVisibilityControlName(floater_ctrl_name);
- if (!LLFloater::getControlGroup()->controlExists(vis_ctrl_name)) continue;
-
- bool is_visible = LLFloater::getControlGroup()->getBOOL(vis_ctrl_name);
- if (!is_visible) continue;
-
- llassert(isTabAttached(tab->getName()));
- tab->toggleTabDocked();
- }
-}
-
-void LLSideTray::collapseSideBar()
-{
- mCollapsed = true;
- // Reset all overlay images, because there is no "selected" tab when the
- // whole side tray is hidden.
- child_vector_const_iter_t it = mTabs.begin();
- for ( ; it != mTabs.end(); ++it )
- {
- LLSideTrayTab* tab = *it;
- std::string name = tab->getName();
- std::map<std::string,LLButton*>::const_iterator btn_it =
- mTabButtons.find(name);
- if (btn_it != mTabButtons.end())
- {
- LLButton* btn = btn_it->second;
- btn->setImageOverlay( tab->mImage );
- }
- }
-
- // OpenClose tab doesn't put its button in mTabButtons
- LLSideTrayTab* openclose_tab = getTab("sidebar_openclose");
- if (openclose_tab)
- {
- mCollapseButton->setImageOverlay( openclose_tab->mImage );
- }
- //mActiveTab->setVisible(FALSE);
- reflectCollapseChange();
- setFocus( FALSE );
-}
-
-void LLSideTray::expandSideBar(bool open_active)
-{
- mCollapsed = false;
- LLSideTrayTab* openclose_tab = getTab("sidebar_openclose");
- if (openclose_tab)
- {
- mCollapseButton->setImageOverlay( openclose_tab->mImageSelected );
- }
-
- if (open_active)
- {
- mActiveTab->onOpen(LLSD());
- }
-
- reflectCollapseChange();
-
-
- std::string name = mActiveTab->getName();
- std::map<std::string,LLButton*>::const_iterator btn_it =
- mTabButtons.find(name);
- if (btn_it != mTabButtons.end())
- {
- LLButton* btn = btn_it->second;
- btn->setImageOverlay( mActiveTab->mImageSelected );
- }
-}
-
-void LLSideTray::highlightFocused()
-{
- /* uncomment in case something change
- if(!mActiveTab)
- return;
- BOOL dependent_has_focus = gFocusMgr.childHasKeyboardFocus(this);
- setBackgroundOpaque( dependent_has_focus );
- mActiveTab->setBackgroundOpaque( dependent_has_focus );
- */
-}
-
-//virtual
-BOOL LLSideTray::handleMouseDown (S32 x, S32 y, MASK mask)
-{
- BOOL ret = LLPanel::handleMouseDown(x,y,mask);
- if(ret)
- setFocus(true);
- return ret;
-}
-
-void LLSideTray::reshape(S32 width, S32 height, BOOL called_from_parent)
-{
- LLPanel::reshape(width, height, called_from_parent);
- if(!mActiveTab)
- return;
-
- arrange();
-}
-
-/**
- * Activate tab with "panel_name" panel
- * if no such tab - return false, otherwise true.
- * TODO* In some cases a pointer to a panel of
- * a specific class may be needed so this method
- * would need to use templates.
- */
-LLPanel* LLSideTray::showPanel (const std::string& panel_name, const LLSD& params)
-{
- // Look up the tab in the list of detached tabs.
- child_vector_const_iter_t child_it;
- for ( child_it = mDetachedTabs.begin(); child_it != mDetachedTabs.end(); ++child_it)
- {
- LLPanel* panel = openChildPanel(*child_it, panel_name, params);
- if (panel) return panel;
- }
-
- // Look up the tab in the list of attached tabs.
- for ( child_it = mTabs.begin(); child_it != mTabs.end(); ++child_it)
- {
- LLPanel* panel = openChildPanel(*child_it, panel_name, params);
- if (panel) return panel;
- }
- return NULL;
-}
-
-void LLSideTray::togglePanel(LLPanel* &sub_panel, const std::string& panel_name, const LLSD& params)
-{
- if(!sub_panel)
- return;
-
- // If a panel is visible and attached to Side Tray (has LLSideTray among its ancestors)
- // it should be toggled off by collapsing Side Tray.
- if (sub_panel->isInVisibleChain() && sub_panel->hasAncestor(this))
- {
- LLSideTray::getInstance()->collapseSideBar();
- }
- else
- {
- LLSideTray::getInstance()->showPanel(panel_name, params);
- }
-}
-
-// This is just LLView::findChildView specialized to restrict the search to LLPanels.
-// Optimization for EXT-4068 to avoid searching down to the individual item level
-// when inventories are large.
-LLPanel *findChildPanel(LLPanel *panel, const std::string& name, bool recurse)
-{
- for (LLView::child_list_const_iter_t child_it = panel->beginChild();
- child_it != panel->endChild(); ++child_it)
- {
- LLPanel *child_panel = dynamic_cast<LLPanel*>(*child_it);
- if (!child_panel)
- continue;
- if (child_panel->getName() == name)
- return child_panel;
- }
- if (recurse)
- {
- for (LLView::child_list_const_iter_t child_it = panel->beginChild();
- child_it != panel->endChild(); ++child_it)
- {
- LLPanel *child_panel = dynamic_cast<LLPanel*>(*child_it);
- if (!child_panel)
- continue;
- LLPanel *found_panel = findChildPanel(child_panel,name,recurse);
- if (found_panel)
- {
- return found_panel;
- }
- }
- }
- return NULL;
-}
-
-LLPanel* LLSideTray::getPanel(const std::string& panel_name)
-{
- // Look up the panel in the list of detached tabs.
- for ( child_vector_const_iter_t child_it = mDetachedTabs.begin(); child_it != mDetachedTabs.end(); ++child_it)
- {
- LLPanel *panel = findChildPanel(*child_it,panel_name,true);
- if(panel)
- {
- return panel;
- }
- }
-
- // Look up the panel in the list of attached tabs.
- for ( child_vector_const_iter_t child_it = mTabs.begin(); child_it != mTabs.end(); ++child_it)
- {
- LLPanel *panel = findChildPanel(*child_it,panel_name,true);
- if(panel)
- {
- return panel;
- }
- }
- return NULL;
-}
-
-LLPanel* LLSideTray::getActivePanel()
-{
- if (mActiveTab && !mCollapsed)
- {
- return mActiveTab->getPanel();
- }
- return NULL;
-}
-
-bool LLSideTray::isPanelActive(const std::string& panel_name)
-{
- LLPanel *panel = getActivePanel();
- if (!panel) return false;
- return (panel->getName() == panel_name);
-}
-
-void LLSideTray::updateSidetrayVisibility()
-{
- // set visibility of parent container based on collapsed state
- if (getParent())
- {
- getParent()->setVisible(!mCollapsed && !gAgentCamera.cameraMouselook());
- }
-}
-
diff --git a/indra/newview/llsidetray.h b/indra/newview/llsidetray.h
deleted file mode 100644
index 3c572dde95..0000000000
--- a/indra/newview/llsidetray.h
+++ /dev/null
@@ -1,228 +0,0 @@
-/**
- * @file LLSideTray.h
- * @brief SideBar header file
- *
- * $LicenseInfo:firstyear=2004&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLSIDETRAY_H_
-#define LL_LLSIDETRAY_H_
-
-#include "llpanel.h"
-#include "string"
-
-class LLAccordionCtrl;
-class LLSideTrayTab;
-
-// added inheritance from LLDestroyClass<LLSideTray> to enable Side Tray perform necessary actions
-// while disconnecting viewer in LLAppViewer::disconnectViewer().
-// LLDestroyClassList::instance().fireCallbacks() calls destroyClass method. See EXT-245.
-class LLSideTray : public LLPanel, private LLDestroyClass<LLSideTray>
-{
- friend class LLUICtrlFactory;
- friend class LLDestroyClass<LLSideTray>;
- friend class LLSideTrayTab;
- friend class LLSideTrayButton;
-public:
-
- LOG_CLASS(LLSideTray);
-
- struct Params
- : public LLInitParam::Block<Params, LLPanel::Params>
- {
- // initial state
- Optional<bool> collapsed;
- Optional<LLUIImage*> tab_btn_image_normal,
- tab_btn_image_selected;
-
- Optional<S32> default_button_width,
- default_button_height,
- default_button_margin;
-
- Params();
- };
-
- static LLSideTray* getInstance ();
- static bool instanceCreated ();
-protected:
- LLSideTray(const Params& params);
- typedef std::vector<LLSideTrayTab*> child_vector_t;
- typedef child_vector_t::iterator child_vector_iter_t;
- typedef child_vector_t::const_iterator child_vector_const_iter_t;
- typedef child_vector_t::reverse_iterator child_vector_reverse_iter_t;
- typedef child_vector_t::const_reverse_iterator child_vector_const_reverse_iter_t;
- typedef std::vector<std::string> tab_order_vector_t;
- typedef tab_order_vector_t::const_iterator tab_order_vector_const_iter_t;
-
-public:
-
- // interface functions
-
- /**
- * Select tab with specific name and set it active
- *
- * @param name Tab to switch to.
- * @param keep_prev_visible Whether to keep the previously selected tab visible.
- */
- bool selectTabByName (const std::string& name, bool keep_prev_visible = false);
-
- /**
- * Select tab with specific index and set it active
- */
- bool selectTabByIndex(size_t index);
-
- /**
- * Activate tab with "panel_name" panel
- * if no such tab - return NULL, otherwise a pointer to the panel
- * Pass params as array, or they may be overwritten(example - params["name"]="nearby")
- */
- LLPanel* showPanel (const std::string& panel_name, const LLSD& params = LLSD());
-
- /**
- * Toggling Side Tray tab which contains "sub_panel" child of "panel_name" panel.
- * If "sub_panel" is not visible Side Tray is opened to display it,
- * otherwise Side Tray is collapsed.
- * params are passed to "panel_name" panel onOpen().
- */
- void togglePanel (LLPanel* &sub_panel, const std::string& panel_name, const LLSD& params = LLSD());
-
- /*
- * get the panel (don't show it or do anything else with it)
- */
- LLPanel* getPanel (const std::string& panel_name);
- LLPanel* getActivePanel ();
- bool isPanelActive (const std::string& panel_name);
-
- /*
- * get the panel of given type T (don't show it or do anything else with it)
- */
- template <typename T>
- T* getPanel(const std::string& panel_name)
- {
- T* panel = dynamic_cast<T*>(getPanel(panel_name));
- if (!panel)
- {
- llwarns << "Child named \"" << panel_name << "\" of type " << typeid(T*).name() << " not found" << llendl;
- return NULL;
- }
- return panel;
- }
-
- /*
- * collapse SideBar, hiding visible tab and moving tab buttons
- * to the right corner of the screen
- */
- void collapseSideBar ();
-
- /*
- * expand SideBar
- *
- * @param open_active Whether to call onOpen() for the active tab.
- */
- void expandSideBar(bool open_active = true);
-
-
- /**
- *hightlight if focused. manly copypaste from highlightFocusedFloater
- */
- void highlightFocused();
-
- void setVisible(BOOL visible)
- {
- if (getParent()) getParent()->setVisible(visible);
- }
-
- LLPanel* getButtonsPanel() { return mButtonsPanel; }
-
- bool getCollapsed() { return mCollapsed; }
-
-public:
- virtual ~LLSideTray(){};
-
- virtual BOOL postBuild();
-
- BOOL handleMouseDown (S32 x, S32 y, MASK mask);
-
- void reshape (S32 width, S32 height, BOOL called_from_parent = TRUE);
-
-
- void updateSidetrayVisibility();
-
- commit_signal_t& getCollapseSignal() { return mCollapseSignal; }
-
- void handleLoginComplete();
-
- bool isTabAttached (const std::string& name);
-
-protected:
- bool addChild (LLView* view, S32 tab_group);
- bool removeTab (LLSideTrayTab* tab); // Used to detach tabs temporarily
- bool addTab (LLSideTrayTab* tab); // Used to re-attach tabs
- bool hasTabs ();
-
- const LLSideTrayTab* getActiveTab() const { return mActiveTab; }
- LLSideTrayTab* getTab(const std::string& name);
-
- void createButtons ();
-
- LLButton* createButton (const std::string& name,const std::string& image,const std::string& tooltip,
- LLUICtrl::commit_callback_t callback);
- void arrange ();
- void detachTabs ();
- void reflectCollapseChange();
- void processTriState ();
-
- void toggleTabButton (LLSideTrayTab* tab);
-
- LLPanel* openChildPanel (LLSideTrayTab* tab, const std::string& panel_name, const LLSD& params);
-
- void onTabButtonClick(std::string name);
- void onToggleCollapse();
-
-private:
- // Implementation of LLDestroyClass<LLSideTray>
- static void destroyClass()
- {
- // Disable SideTray to avoid crashes. EXT-245
- if (LLSideTray::instanceCreated())
- LLSideTray::getInstance()->setEnabled(FALSE);
- }
-
-private:
- LLPanel* mButtonsPanel;
- typedef std::map<std::string,LLButton*> button_map_t;
- button_map_t mTabButtons;
- child_vector_t mTabs;
- child_vector_t mDetachedTabs;
- tab_order_vector_t mOriginalTabOrder;
- LLSideTrayTab* mActiveTab;
-
- commit_signal_t mCollapseSignal;
-
- LLButton* mCollapseButton;
- bool mCollapsed;
-
- static LLSideTray* sInstance;
-};
-
-#endif
-
diff --git a/indra/newview/llsidetraypanelcontainer.cpp b/indra/newview/llsidetraypanelcontainer.cpp
index 214f595772..e340333c2c 100644
--- a/indra/newview/llsidetraypanelcontainer.cpp
+++ b/indra/newview/llsidetraypanelcontainer.cpp
@@ -32,10 +32,10 @@ static LLDefaultChildRegistry::Register<LLSideTrayPanelContainer> r2("panel_cont
std::string LLSideTrayPanelContainer::PARAM_SUB_PANEL_NAME = "sub_panel_name";
LLSideTrayPanelContainer::Params::Params()
- : default_panel_name("default_panel_name")
+: default_panel_name("default_panel_name")
{
// Always hide tabs.
- hide_tabs(true);
+ changeDefault(hide_tabs, true);
}
LLSideTrayPanelContainer::LLSideTrayPanelContainer(const Params& p)
@@ -62,6 +62,13 @@ void LLSideTrayPanelContainer::onOpen(const LLSD& key)
getCurrentPanel()->onOpen(key);
}
+void LLSideTrayPanelContainer::openPanel(const std::string& panel_name, const LLSD& key)
+{
+ LLSD combined_key = key;
+ combined_key[PARAM_SUB_PANEL_NAME] = panel_name;
+ onOpen(combined_key);
+}
+
void LLSideTrayPanelContainer::openPreviousPanel()
{
if(!mDefaultPanelName.empty())
diff --git a/indra/newview/llsidetraypanelcontainer.h b/indra/newview/llsidetraypanelcontainer.h
index 14269b002b..93a85ed374 100644
--- a/indra/newview/llsidetraypanelcontainer.h
+++ b/indra/newview/llsidetraypanelcontainer.h
@@ -57,6 +57,11 @@ public:
/*virtual*/ void onOpen(const LLSD& key);
/**
+ * Opens given subpanel.
+ */
+ void openPanel(const std::string& panel_name, const LLSD& key = LLSD::emptyMap());
+
+ /**
* Opens previous panel from panel navigation history.
*/
void openPreviousPanel();
diff --git a/indra/newview/llsimplestat.h b/indra/newview/llsimplestat.h
new file mode 100644
index 0000000000..9d7780c4f9
--- /dev/null
+++ b/indra/newview/llsimplestat.h
@@ -0,0 +1,152 @@
+/**
+ * @file llsimplestat.h
+ * @brief Runtime statistics accumulation.
+ *
+ * $LicenseInfo:firstyear=2010&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_SIMPLESTAT_H
+#define LL_SIMPLESTAT_H
+
+// History
+//
+// The original source for this code is the server repositories'
+// llcommon/llstat.h file. This particular code was added after the
+// viewer/server code schism but before the effort to convert common
+// code to libraries was complete. Rather than add to merge issues,
+// the needed code was cut'n'pasted into this new header as it isn't
+// too awful a burden. Post-modularization, we can look at removing
+// this redundancy.
+
+
+/**
+ * @class LLSimpleStatCounter
+ * @brief Just counts events.
+ *
+ * Really not needed but have a pattern in mind in the future.
+ * Interface limits what can be done at that's just fine.
+ *
+ * *TODO: Update/transfer unit tests
+ * Unit tests: indra/test/llcommon_llstat_tut.cpp
+ */
+class LLSimpleStatCounter
+{
+public:
+ inline LLSimpleStatCounter() { reset(); }
+ // Default destructor and assignment operator are valid
+
+ inline void reset() { mCount = 0; }
+
+ inline void merge(const LLSimpleStatCounter & src)
+ { mCount += src.mCount; }
+
+ inline U32 operator++() { return ++mCount; }
+
+ inline U32 getCount() const { return mCount; }
+
+protected:
+ U32 mCount;
+};
+
+
+/**
+ * @class LLSimpleStatMMM
+ * @brief Templated collector of min, max and mean data for stats.
+ *
+ * Fed a stream of data samples, keeps a running account of the
+ * min, max and mean seen since construction or the last reset()
+ * call. A freshly-constructed or reset instance returns counts
+ * and values of zero.
+ *
+ * Overflows and underflows (integer, inf or -inf) and NaN's
+ * are the caller's problem. As is loss of precision when
+ * the running sum's exponent (when parameterized by a floating
+ * point of some type) differs from a given data sample's.
+ *
+ * Unit tests: indra/test/llcommon_llstat_tut.cpp
+ */
+template <typename VALUE_T = F32>
+class LLSimpleStatMMM
+{
+public:
+ typedef VALUE_T Value;
+
+public:
+ LLSimpleStatMMM() { reset(); }
+ // Default destructor and assignment operator are valid
+
+ /**
+ * Resets the object returning all counts and derived
+ * values back to zero.
+ */
+ void reset()
+ {
+ mCount = 0;
+ mMin = Value(0);
+ mMax = Value(0);
+ mTotal = Value(0);
+ }
+
+ void record(Value v)
+ {
+ if (mCount)
+ {
+ mMin = llmin(mMin, v);
+ mMax = llmax(mMax, v);
+ }
+ else
+ {
+ mMin = v;
+ mMax = v;
+ }
+ mTotal += v;
+ ++mCount;
+ }
+
+ void merge(const LLSimpleStatMMM<VALUE_T> & src)
+ {
+ if (! mCount)
+ {
+ *this = src;
+ }
+ else if (src.mCount)
+ {
+ mMin = llmin(mMin, src.mMin);
+ mMax = llmax(mMax, src.mMax);
+ mCount += src.mCount;
+ mTotal += src.mTotal;
+ }
+ }
+
+ inline U32 getCount() const { return mCount; }
+ inline Value getMin() const { return mMin; }
+ inline Value getMax() const { return mMax; }
+ inline Value getMean() const { return mCount ? mTotal / mCount : mTotal; }
+
+protected:
+ U32 mCount;
+ Value mMin;
+ Value mMax;
+ Value mTotal;
+};
+
+#endif // LL_SIMPLESTAT_H
diff --git a/indra/newview/llslurl.cpp b/indra/newview/llslurl.cpp
index 4cf1df1655..a853726dea 100644
--- a/indra/newview/llslurl.cpp
+++ b/indra/newview/llslurl.cpp
@@ -273,11 +273,11 @@ LLSLURL::LLSLURL(const std::string& slurl)
mRegion = LLURI::unescape(path_array[0].asString());
path_array.erase(0);
- // parse the x, y, z
- if(path_array.size() >= 3)
+ // parse the x, y, and optionally z
+ if(path_array.size() >= 2)
{
- mPosition = LLVector3(path_array);
+ mPosition = LLVector3(path_array); // this construction handles LLSD without all components (values default to 0.f)
if((F32(mPosition[VX]) < 0.f) ||
(mPosition[VX] > REGION_WIDTH_METERS) ||
(F32(mPosition[VY]) < 0.f) ||
diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp
index 960e72ee42..5d196a465f 100644
--- a/indra/newview/llspatialpartition.cpp
+++ b/indra/newview/llspatialpartition.cpp
@@ -28,20 +28,31 @@
#include "llspatialpartition.h"
+#include "llappviewer.h"
+#include "lltexturecache.h"
+#include "lltexturefetch.h"
+#include "llimageworker.h"
#include "llviewerwindow.h"
#include "llviewerobjectlist.h"
#include "llvovolume.h"
#include "llvolume.h"
+#include "llvolumeoctree.h"
#include "llviewercamera.h"
#include "llface.h"
+#include "llfloatertools.h"
#include "llviewercontrol.h"
#include "llviewerregion.h"
#include "llcamera.h"
#include "pipeline.h"
+#include "llmeshrepository.h"
#include "llrender.h"
#include "lloctree.h"
+#include "llphysicsshapebuilderutil.h"
#include "llvoavatar.h"
+#include "llvolumemgr.h"
#include "lltextureatlas.h"
+#include "llglslshader.h"
+#include "llviewershadermgr.h"
static LLFastTimer::DeclareTimer FTM_FRUSTUM_CULL("Frustum Culling");
static LLFastTimer::DeclareTimer FTM_CULL_REBOUND("Cull Rebound");
@@ -60,6 +71,13 @@ const F32 SG_OCCLUSION_FUDGE = 0.25f;
static U32 sZombieGroups = 0;
U32 LLSpatialGroup::sNodeCount = 0;
+
+#define LL_TRACK_PENDING_OCCLUSION_QUERIES 0
+
+std::set<GLuint> LLSpatialGroup::sPendingQueries;
+
+U32 gOctreeMaxCapacity;
+
BOOL LLSpatialGroup::sNoDelete = FALSE;
static F32 sLastMaxTexPriority = 1.f;
@@ -77,6 +95,9 @@ protected:
virtual void releaseName(GLuint name)
{
+#if LL_TRACK_PENDING_OCCLUSION_QUERIES
+ LLSpatialGroup::sPendingQueries.erase(name);
+#endif
glDeleteQueriesARB(1, &name);
}
};
@@ -95,23 +116,6 @@ void sg_assert(BOOL expr)
#endif
}
-#if LL_DEBUG
-void validate_drawable(LLDrawable* drawablep)
-{
- F64 rad = drawablep->getBinRadius();
- const LLVector3* ext = drawablep->getSpatialExtents();
-
- if (rad < 0 || rad > 4096 ||
- (ext[1]-ext[0]).magVec() > 4096)
- {
- llwarns << "Invalid drawable found in octree." << llendl;
- }
-}
-#else
-#define validate_drawable(x)
-#endif
-
-
S32 AABBSphereIntersect(const LLVector3& min, const LLVector3& max, const LLVector3 &origin, const F32 &rad)
{
return AABBSphereIntersectR2(min, max, origin, rad*rad);
@@ -151,6 +155,55 @@ S32 AABBSphereIntersectR2(const LLVector3& min, const LLVector3& max, const LLVe
}
+S32 AABBSphereIntersect(const LLVector4a& min, const LLVector4a& max, const LLVector3 &origin, const F32 &rad)
+{
+ return AABBSphereIntersectR2(min, max, origin, rad*rad);
+}
+
+S32 AABBSphereIntersectR2(const LLVector4a& min, const LLVector4a& max, const LLVector3 &origin, const F32 &r)
+{
+ F32 d = 0.f;
+ F32 t;
+
+ LLVector4a origina;
+ origina.load3(origin.mV);
+
+ LLVector4a v;
+ v.setSub(min, origina);
+
+ if (v.dot3(v) < r)
+ {
+ v.setSub(max, origina);
+ if (v.dot3(v) < r)
+ {
+ return 2;
+ }
+ }
+
+
+ for (U32 i = 0; i < 3; i++)
+ {
+ if (origin.mV[i] < min[i])
+ {
+ t = min[i] - origin.mV[i];
+ d += t*t;
+ }
+ else if (origin.mV[i] > max[i])
+ {
+ t = origin.mV[i] - max[i];
+ d += t*t;
+ }
+
+ if (d > r)
+ {
+ return 0;
+ }
+ }
+
+ return 1;
+}
+
+
typedef enum
{
b000 = 0x00,
@@ -166,78 +219,115 @@ typedef enum
//contact Runitai Linden for a copy of the SL object used to write this table
//basically, you give the table a bitmask of the look-at vector to a node and it
//gives you a triangle fan index array
-static U8 sOcclusionIndices[] =
+static U16 sOcclusionIndices[] =
{
- // 000
+ //000
b111, b110, b010, b011, b001, b101, b100, b110,
- //001
- b110, b000, b010, b011, b111, b101, b100, b000,
+ //001
+ b011, b010, b000, b001, b101, b111, b110, b010,
//010
b101, b100, b110, b111, b011, b001, b000, b100,
//011
- b100, b010, b110, b111, b101, b001, b000, b010,
- //100
- b011, b010, b000, b001, b101, b111, b110, b010,
+ b001, b000, b100, b101, b111, b011, b010, b000,
+ //100
+ b110, b000, b010, b011, b111, b101, b100, b000,
//101
b010, b100, b000, b001, b011, b111, b110, b100,
//110
- b001, b000, b100, b101, b111, b011, b010, b000,
+ b100, b010, b110, b111, b101, b001, b000, b010,
//111
b000, b110, b100, b101, b001, b011, b010, b110,
};
-U8* get_box_fan_indices(LLCamera* camera, const LLVector3& center)
+U32 get_box_fan_indices(LLCamera* camera, const LLVector4a& center)
{
- LLVector3 d = center - camera->getOrigin();
+ LLVector4a origin;
+ origin.load3(camera->getOrigin().mV);
- U8 cypher = 0;
- if (d.mV[0] > 0)
- {
- cypher |= b100;
- }
- if (d.mV[1] > 0)
- {
- cypher |= b010;
- }
- if (d.mV[2] > 0)
- {
- cypher |= b001;
- }
+ S32 cypher = center.greaterThan(origin).getGatheredBits() & 0x7;
+
+ return cypher*8;
+}
+
+U8* get_box_fan_indices_ptr(LLCamera* camera, const LLVector4a& center)
+{
+ LLVector4a origin;
+ origin.load3(camera->getOrigin().mV);
- return sOcclusionIndices+cypher*8;
+ S32 cypher = center.greaterThan(origin).getGatheredBits() & 0x7;
+
+ return (U8*) (sOcclusionIndices+cypher*8);
}
-
+
+
+static LLFastTimer::DeclareTimer FTM_BUILD_OCCLUSION("Build Occlusion");
+
void LLSpatialGroup::buildOcclusion()
{
- if (!mOcclusionVerts)
+ //if (mOcclusionVerts.isNull())
{
- mOcclusionVerts = new F32[8*3];
+ mOcclusionVerts = new LLVertexBuffer(LLVertexBuffer::MAP_VERTEX,
+ LLVertexBuffer::sUseStreamDraw ? mBufferUsage : 0); //if GL has a hard time with VBOs, don't use them for occlusion culling.
+ mOcclusionVerts->allocateBuffer(8, 64, true);
+
+ LLStrider<U16> idx;
+ mOcclusionVerts->getIndexStrider(idx);
+ for (U32 i = 0; i < 64; i++)
+ {
+ *idx++ = sOcclusionIndices[i];
+ }
}
- LLVector3 r = mBounds[1] + LLVector3(SG_OCCLUSION_FUDGE, SG_OCCLUSION_FUDGE, SG_OCCLUSION_FUDGE);
+ LLVector4a fudge;
+ fudge.splat(SG_OCCLUSION_FUDGE);
- for (U32 k = 0; k < 3; k++)
+ LLVector4a r;
+ r.setAdd(mBounds[1], fudge);
+
+ LLStrider<LLVector3> pos;
+
{
- r.mV[k] = llmin(mBounds[1].mV[k]+0.25f, r.mV[k]);
+ LLFastTimer t(FTM_BUILD_OCCLUSION);
+ mOcclusionVerts->getVertexStrider(pos);
}
- F32* v = mOcclusionVerts;
- F32* c = mBounds[0].mV;
- F32* s = r.mV;
+ {
+ LLVector4a* v = (LLVector4a*) pos.get();
+
+ const LLVector4a& c = mBounds[0];
+ const LLVector4a& s = r;
+
+ static const LLVector4a octant[] =
+ {
+ LLVector4a(-1.f, -1.f, -1.f),
+ LLVector4a(-1.f, -1.f, 1.f),
+ LLVector4a(-1.f, 1.f, -1.f),
+ LLVector4a(-1.f, 1.f, 1.f),
+
+ LLVector4a(1.f, -1.f, -1.f),
+ LLVector4a(1.f, -1.f, 1.f),
+ LLVector4a(1.f, 1.f, -1.f),
+ LLVector4a(1.f, 1.f, 1.f),
+ };
+
+ //vertex positions are encoded so the 3 bits of their vertex index
+ //correspond to their axis facing, with bit position 3,2,1 matching
+ //axis facing x,y,z, bit set meaning positive facing, bit clear
+ //meaning negative facing
+
+ for (S32 i = 0; i < 8; ++i)
+ {
+ LLVector4a p;
+ p.setMul(s, octant[i]);
+ p.add(c);
+ v[i] = p;
+ }
+ }
- //vertex positions are encoded so the 3 bits of their vertex index
- //correspond to their axis facing, with bit position 3,2,1 matching
- //axis facing x,y,z, bit set meaning positive facing, bit clear
- //meaning negative facing
- v[0] = c[0]-s[0]; v[1] = c[1]-s[1]; v[2] = c[2]-s[2]; // 0 - 0000
- v[3] = c[0]-s[0]; v[4] = c[1]-s[1]; v[5] = c[2]+s[2]; // 1 - 0001
- v[6] = c[0]-s[0]; v[7] = c[1]+s[1]; v[8] = c[2]-s[2]; // 2 - 0010
- v[9] = c[0]-s[0]; v[10] = c[1]+s[1]; v[11] = c[2]+s[2]; // 3 - 0011
-
- v[12] = c[0]+s[0]; v[13] = c[1]-s[1]; v[14] = c[2]-s[2]; // 4 - 0100
- v[15] = c[0]+s[0]; v[16] = c[1]-s[1]; v[17] = c[2]+s[2]; // 5 - 0101
- v[18] = c[0]+s[0]; v[19] = c[1]+s[1]; v[20] = c[2]-s[2]; // 6 - 0110
- v[21] = c[0]+s[0]; v[22] = c[1]+s[1]; v[23] = c[2]+s[2]; // 7 - 0111
+ {
+ mOcclusionVerts->flush();
+ LLVertexBuffer::unbind();
+ }
clearState(LLSpatialGroup::OCCLUSION_DIRTY);
}
@@ -281,6 +371,11 @@ LLSpatialGroup::~LLSpatialGroup()
llerrs << "Illegal deletion of LLSpatialGroup!" << llendl;
}*/
+ if (gDebugGL)
+ {
+ gPipeline.checkReferences(this);
+ }
+
if (isState(DEAD))
{
sZombieGroups--;
@@ -288,12 +383,17 @@ LLSpatialGroup::~LLSpatialGroup()
sNodeCount--;
- if (gGLManager.mHasOcclusionQuery && mOcclusionQuery[LLViewerCamera::sCurCameraID])
+ if (gGLManager.mHasOcclusionQuery)
{
- sQueryPool.release(mOcclusionQuery[LLViewerCamera::sCurCameraID]);
+ for (U32 i = 0; i < LLViewerCamera::NUM_CAMERAS; ++i)
+ {
+ if (mOcclusionQuery[i])
+ {
+ sQueryPool.release(mOcclusionQuery[i]);
+ }
+ }
}
- delete [] mOcclusionVerts;
mOcclusionVerts = NULL;
LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
@@ -428,6 +528,11 @@ void LLSpatialGroup::clearDrawMap()
mDrawMap.clear();
}
+BOOL LLSpatialGroup::isHUDGroup()
+{
+ return mSpatialPartition && mSpatialPartition->isHUDPartition() ;
+}
+
BOOL LLSpatialGroup::isRecentlyVisible() const
{
return (LLDrawable::getCurrentFrame() - mVisible[LLViewerCamera::sCurCameraID]) < LLDrawable::getMinVisFrameRange() ;
@@ -435,7 +540,7 @@ BOOL LLSpatialGroup::isRecentlyVisible() const
BOOL LLSpatialGroup::isVisible() const
{
- return mVisible[LLViewerCamera::sCurCameraID] == LLDrawable::getCurrentFrame() ? TRUE : FALSE;
+ return mVisible[LLViewerCamera::sCurCameraID] >= LLDrawable::getCurrentFrame() ? TRUE : FALSE;
}
void LLSpatialGroup::setVisible()
@@ -450,8 +555,10 @@ void LLSpatialGroup::validate()
sg_assert(!isState(DIRTY));
sg_assert(!isDead());
- LLVector3 myMin = mBounds[0] - mBounds[1];
- LLVector3 myMax = mBounds[0] + mBounds[1];
+ LLVector4a myMin;
+ myMin.setSub(mBounds[0], mBounds[1]);
+ LLVector4a myMax;
+ myMax.setAdd(mBounds[0], mBounds[1]);
validateDrawMap();
@@ -483,16 +590,18 @@ void LLSpatialGroup::validate()
group->validate();
//ensure all children are enclosed in this node
- LLVector3 center = group->mBounds[0];
- LLVector3 size = group->mBounds[1];
+ LLVector4a center = group->mBounds[0];
+ LLVector4a size = group->mBounds[1];
- LLVector3 min = center - size;
- LLVector3 max = center + size;
+ LLVector4a min;
+ min.setSub(center, size);
+ LLVector4a max;
+ max.setAdd(center, size);
for (U32 j = 0; j < 3; j++)
{
- sg_assert(min.mV[j] >= myMin.mV[j]-0.02f);
- sg_assert(max.mV[j] <= myMax.mV[j]+0.02f);
+ sg_assert(min[j] >= myMin[j]-0.02f);
+ sg_assert(max[j] <= myMax[j]+0.02f);
}
}
@@ -502,52 +611,8 @@ void LLSpatialGroup::validate()
void LLSpatialGroup::checkStates()
{
#if LL_OCTREE_PARANOIA_CHECK
- LLOctreeStateCheck checker;
- checker.traverse(mOctreeNode);
-#endif
-}
-
-void validate_draw_info(LLDrawInfo& params)
-{
-#if LL_OCTREE_PARANOIA_CHECK
- if (params.mVertexBuffer.isNull())
- {
- llerrs << "Draw batch has no vertex buffer." << llendl;
- }
-
- //bad range
- if (params.mStart >= params.mEnd)
- {
- llerrs << "Draw batch has invalid range." << llendl;
- }
-
- if (params.mEnd >= (U32) params.mVertexBuffer->getNumVerts())
- {
- llerrs << "Draw batch has buffer overrun error." << llendl;
- }
-
- if (params.mOffset + params.mCount > (U32) params.mVertexBuffer->getNumIndices())
- {
- llerrs << "Draw batch has index buffer ovverrun error." << llendl;
- }
-
- //bad indices
- U16* indicesp = (U16*) params.mVertexBuffer->getIndicesPointer();
- if (indicesp)
- {
- for (U32 i = params.mOffset; i < params.mOffset+params.mCount; i++)
- {
- if (indicesp[i] < (U16)params.mStart)
- {
- llerrs << "Draw batch has vertex buffer index out of range error (index too low)." << llendl;
- }
-
- if (indicesp[i] > (U16)params.mEnd)
- {
- llerrs << "Draw batch has vertex buffer index out of range error (index too high)." << llendl;
- }
- }
- }
+ //LLOctreeStateCheck checker;
+ //checker.traverse(mOctreeNode);
#endif
}
@@ -560,8 +625,8 @@ void LLSpatialGroup::validateDrawMap()
for (drawmap_elem_t::iterator j = draw_vec.begin(); j != draw_vec.end(); ++j)
{
LLDrawInfo& params = **j;
-
- validate_draw_info(params);
+
+ params.validate();
}
}
#endif
@@ -572,19 +637,17 @@ BOOL LLSpatialGroup::updateInGroup(LLDrawable *drawablep, BOOL immediate)
LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
drawablep->updateSpatialExtents();
- validate_drawable(drawablep);
OctreeNode* parent = mOctreeNode->getOctParent();
if (mOctreeNode->isInside(drawablep->getPositionGroup()) &&
(mOctreeNode->contains(drawablep) ||
- (drawablep->getBinRadius() > mOctreeNode->getSize().mdV[0] &&
- parent && parent->getElementCount() >= LL_OCTREE_MAX_CAPACITY)))
+ (drawablep->getBinRadius() > mOctreeNode->getSize()[0] &&
+ parent && parent->getElementCount() >= gOctreeMaxCapacity)))
{
unbound();
setState(OBJECT_DIRTY);
//setState(GEOM_DIRTY);
- validate_drawable(drawablep);
return TRUE;
}
@@ -602,7 +665,6 @@ BOOL LLSpatialGroup::addObject(LLDrawable *drawablep, BOOL add_all, BOOL from_oc
else
{
drawablep->setSpatialGroup(this);
- validate_drawable(drawablep);
setState(OBJECT_DIRTY | GEOM_DIRTY);
setOcclusionState(LLSpatialGroup::DISCARD_QUERY, LLSpatialGroup::STATE_MODE_ALL_CAMERAS);
gPipeline.markRebuild(this, TRUE);
@@ -640,17 +702,8 @@ static LLFastTimer::DeclareTimer FTM_REBUILD_VBO("VBO Rebuilt");
void LLSpatialPartition::rebuildGeom(LLSpatialGroup* group)
{
- /*if (!gPipeline.hasRenderType(mDrawableType))
- {
- return;
- }*/
-
if (group->isDead() || !group->isState(LLSpatialGroup::GEOM_DIRTY))
{
- /*if (!group->isState(LLSpatialGroup::GEOM_DIRTY) && mRenderByGroup)
- {
- llerrs << "WTF?" << llendl;
- }*/
return;
}
@@ -673,7 +726,9 @@ void LLSpatialPartition::rebuildGeom(LLSpatialGroup* group)
if (vertex_count > 0 && index_count > 0)
{ //create vertex buffer containing volume geometry for this node
group->mBuilt = 1.f;
- if (group->mVertexBuffer.isNull() || (group->mBufferUsage != group->mVertexBuffer->getUsage() && LLVertexBuffer::sEnableVBOs))
+ if (group->mVertexBuffer.isNull() ||
+ !group->mVertexBuffer->isWriteable() ||
+ (group->mBufferUsage != group->mVertexBuffer->getUsage() && LLVertexBuffer::sEnableVBOs))
{
group->mVertexBuffer = createVertexBuffer(mVertexDataMask, group->mBufferUsage);
group->mVertexBuffer->allocateBuffer(vertex_count, index_count, true);
@@ -703,7 +758,7 @@ void LLSpatialPartition::rebuildMesh(LLSpatialGroup* group)
}
-BOOL LLSpatialGroup::boundObjects(BOOL empty, LLVector3& minOut, LLVector3& maxOut)
+BOOL LLSpatialGroup::boundObjects(BOOL empty, LLVector4a& minOut, LLVector4a& maxOut)
{
const OctreeNode* node = mOctreeNode;
@@ -716,8 +771,8 @@ BOOL LLSpatialGroup::boundObjects(BOOL empty, LLVector3& minOut, LLVector3& maxO
return FALSE;
}
- LLVector3& newMin = mObjectExtents[0];
- LLVector3& newMax = mObjectExtents[1];
+ LLVector4a& newMin = mObjectExtents[0];
+ LLVector4a& newMax = mObjectExtents[1];
if (isState(OBJECT_DIRTY))
{ //calculate new bounding box
@@ -726,10 +781,10 @@ BOOL LLSpatialGroup::boundObjects(BOOL empty, LLVector3& minOut, LLVector3& maxO
//initialize bounding box to first element
OctreeNode::const_element_iter i = node->getData().begin();
LLDrawable* drawablep = *i;
- const LLVector3* minMax = drawablep->getSpatialExtents();
+ const LLVector4a* minMax = drawablep->getSpatialExtents();
- newMin.setVec(minMax[0]);
- newMax.setVec(minMax[1]);
+ newMin = minMax[0];
+ newMax = minMax[1];
for (++i; i != node->getData().end(); ++i)
{
@@ -753,8 +808,10 @@ BOOL LLSpatialGroup::boundObjects(BOOL empty, LLVector3& minOut, LLVector3& maxO
}*/
}
- mObjectBounds[0] = (newMin + newMax) * 0.5f;
- mObjectBounds[1] = (newMax - newMin) * 0.5f;
+ mObjectBounds[0].setAdd(newMin, newMax);
+ mObjectBounds[0].mul(0.5f);
+ mObjectBounds[1].setSub(newMax, newMin);
+ mObjectBounds[1].mul(0.5f);
}
if (empty)
@@ -764,17 +821,8 @@ BOOL LLSpatialGroup::boundObjects(BOOL empty, LLVector3& minOut, LLVector3& maxO
}
else
{
- for (U32 i = 0; i < 3; i++)
- {
- if (newMin.mV[i] < minOut.mV[i])
- {
- minOut.mV[i] = newMin.mV[i];
- }
- if (newMax.mV[i] > maxOut.mV[i])
- {
- maxOut.mV[i] = newMax.mV[i];
- }
- }
+ minOut.setMin(minOut, newMin);
+ maxOut.setMax(maxOut, newMax);
}
return TRUE;
@@ -865,18 +913,19 @@ BOOL LLSpatialGroup::removeObject(LLDrawable *drawablep, BOOL from_octree)
return TRUE;
}
-void LLSpatialGroup::shift(const LLVector3 &offset)
+void LLSpatialGroup::shift(const LLVector4a &offset)
{
LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
- LLVector3d offsetd(offset);
- mOctreeNode->setCenter(mOctreeNode->getCenter()+offsetd);
+ LLVector4a t = mOctreeNode->getCenter();
+ t.add(offset);
+ mOctreeNode->setCenter(t);
mOctreeNode->updateMinMax();
- mBounds[0] += offset;
- mExtents[0] += offset;
- mExtents[1] += offset;
- mObjectBounds[0] += offset;
- mObjectExtents[0] += offset;
- mObjectExtents[1] += offset;
+ mBounds[0].add(offset);
+ mExtents[0].add(offset);
+ mExtents[1].add(offset);
+ mObjectBounds[0].add(offset);
+ mObjectExtents[0].add(offset);
+ mObjectExtents[1].add(offset);
//if (!mSpatialPartition->mRenderByGroup)
{
@@ -884,15 +933,9 @@ void LLSpatialGroup::shift(const LLVector3 &offset)
gPipeline.markRebuild(this, TRUE);
}
- if (mOcclusionVerts)
+ if (mOcclusionVerts.notNull())
{
- for (U32 i = 0; i < 8; i++)
- {
- F32* v = mOcclusionVerts+i*3;
- v[0] += offset.mV[0];
- v[1] += offset.mV[1];
- v[2] += offset.mV[2];
- }
+ setState(OCCLUSION_DIRTY);
}
}
@@ -924,21 +967,15 @@ void LLSpatialGroup::setState(U32 state)
{
mState |= state;
- if (state > LLSpatialGroup::STATE_MASK)
- {
- llerrs << "WTF?" << llendl;
- }
+ llassert(state <= LLSpatialGroup::STATE_MASK);
}
void LLSpatialGroup::setState(U32 state, S32 mode)
{
LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
- if (state > LLSpatialGroup::STATE_MASK)
- {
- llerrs << "WTF?" << llendl;
- }
-
+ llassert(state <= LLSpatialGroup::STATE_MASK);
+
if (mode > STATE_MODE_SINGLE)
{
if (mode == STATE_MODE_DIFF)
@@ -984,20 +1021,14 @@ public:
void LLSpatialGroup::clearState(U32 state)
{
- if (state > LLSpatialGroup::STATE_MASK)
- {
- llerrs << "WTF?" << llendl;
- }
+ llassert(state <= LLSpatialGroup::STATE_MASK);
mState &= ~state;
}
void LLSpatialGroup::clearState(U32 state, S32 mode)
{
- if (state > LLSpatialGroup::STATE_MASK)
- {
- llerrs << "WTF?" << llendl;
- }
+ llassert(state <= LLSpatialGroup::STATE_MASK);
LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
@@ -1022,10 +1053,7 @@ void LLSpatialGroup::clearState(U32 state, S32 mode)
BOOL LLSpatialGroup::isState(U32 state) const
{
- if (state > LLSpatialGroup::STATE_MASK)
- {
- llerrs << "WTF?" << llendl;
- }
+ llassert(state <= LLSpatialGroup::STATE_MASK);
return mState & state ? TRUE : FALSE;
}
@@ -1079,12 +1107,23 @@ void LLSpatialGroup::setOcclusionState(U32 state, S32 mode)
for (U32 i = 0; i < LLViewerCamera::NUM_CAMERAS; i++)
{
mOcclusionState[i] |= state;
+
+ if ((state & DISCARD_QUERY) && mOcclusionQuery[i])
+ {
+ sQueryPool.release(mOcclusionQuery[i]);
+ mOcclusionQuery[i] = 0;
+ }
}
}
}
else
{
mOcclusionState[LLViewerCamera::sCurCameraID] |= state;
+ if ((state & DISCARD_QUERY) && mOcclusionQuery[LLViewerCamera::sCurCameraID])
+ {
+ sQueryPool.release(mOcclusionQuery[LLViewerCamera::sCurCameraID]);
+ mOcclusionQuery[LLViewerCamera::sCurCameraID] = 0;
+ }
}
}
@@ -1148,17 +1187,17 @@ void LLSpatialGroup::clearOcclusionState(U32 state, S32 mode)
LLSpatialGroup::LLSpatialGroup(OctreeNode* node, LLSpatialPartition* part) :
mState(0),
+ mGeometryBytes(0),
+ mSurfaceArea(0.f),
mBuilt(0.f),
mOctreeNode(node),
mSpatialPartition(part),
mVertexBuffer(NULL),
- mBufferUsage(GL_STATIC_DRAW_ARB),
+ mBufferUsage(part->mBufferUsage),
mDistance(0.f),
mDepth(0.f),
mLastUpdateDistance(-1.f),
mLastUpdateTime(gFrameTimeSeconds),
- mViewAngle(0.f),
- mLastUpdateViewAngle(-1.f),
mAtlasList(4),
mCurUpdatingTime(0),
mCurUpdatingSlotp(NULL),
@@ -1167,13 +1206,18 @@ LLSpatialGroup::LLSpatialGroup(OctreeNode* node, LLSpatialPartition* part) :
sNodeCount++;
LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
+ mViewAngle.splat(0.f);
+ mLastUpdateViewAngle.splat(-1.f);
+ mExtents[0] = mExtents[1] = mObjectBounds[0] = mObjectBounds[0] = mObjectBounds[1] =
+ mObjectExtents[0] = mObjectExtents[1] = mViewAngle;
+
sg_assert(mOctreeNode->getListenerCount() == 0);
mOctreeNode->addListener(this);
setState(SG_INITIAL_STATE_MASK);
gPipeline.markRebuild(this, TRUE);
- mBounds[0] = LLVector3(node->getCenter());
- mBounds[1] = LLVector3(node->getSize());
+ mBounds[0] = node->getCenter();
+ mBounds[1] = node->getSize();
part->mLODSeed = (part->mLODSeed+1)%part->mLODPeriod;
mLODHash = part->mLODSeed;
@@ -1185,6 +1229,7 @@ LLSpatialGroup::LLSpatialGroup(OctreeNode* node, LLSpatialPartition* part) :
for (U32 i = 0; i < LLViewerCamera::NUM_CAMERAS; i++)
{
mOcclusionQuery[i] = 0;
+ mOcclusionIssued[i] = 0;
mOcclusionState[i] = parent ? SG_STATE_INHERIT_MASK & parent->mOcclusionState[i] : 0;
mVisible[i] = 0;
}
@@ -1199,7 +1244,8 @@ void LLSpatialGroup::updateDistance(LLCamera &camera)
{
if (LLViewerCamera::sCurCameraID != LLViewerCamera::CAMERA_WORLD)
{
- llerrs << "WTF?" << llendl;
+ llwarns << "Attempted to update distance for camera other than world camera!" << llendl;
+ return;
}
#if !LL_RELEASE_FOR_DOWNLOAD
@@ -1210,8 +1256,8 @@ void LLSpatialGroup::updateDistance(LLCamera &camera)
#endif
if (!getData().empty())
{
- mRadius = mSpatialPartition->mRenderByGroup ? mObjectBounds[1].magVec() :
- (F32) mOctreeNode->getSize().magVec();
+ mRadius = mSpatialPartition->mRenderByGroup ? mObjectBounds[1].getLength3().getF32() :
+ (F32) mOctreeNode->getSize().getLength3().getF32();
mDistance = mSpatialPartition->calcDistance(this, camera);
mPixelArea = mSpatialPartition->calcPixelArea(this, camera);
}
@@ -1219,24 +1265,31 @@ void LLSpatialGroup::updateDistance(LLCamera &camera)
F32 LLSpatialPartition::calcDistance(LLSpatialGroup* group, LLCamera& camera)
{
- LLVector3 eye = group->mObjectBounds[0] - camera.getOrigin();
+ LLVector4a eye;
+ LLVector4a origin;
+ origin.load3(camera.getOrigin().mV);
+
+ eye.setSub(group->mObjectBounds[0], origin);
F32 dist = 0.f;
if (group->mDrawMap.find(LLRenderPass::PASS_ALPHA) != group->mDrawMap.end())
{
- LLVector3 v = eye;
- dist = eye.normVec();
+ LLVector4a v = eye;
+
+ dist = eye.getLength3().getF32();
+ eye.normalize3fast();
if (!group->isState(LLSpatialGroup::ALPHA_DIRTY))
{
if (!group->mSpatialPartition->isBridge())
{
- LLVector3 view_angle = LLVector3(eye * LLVector3(1,0,0),
- eye * LLVector3(0,1,0),
- eye * LLVector3(0,0,1));
+ LLVector4a view_angle = eye;
+
+ LLVector4a diff;
+ diff.setSub(view_angle, group->mLastUpdateViewAngle);
- if ((view_angle-group->mLastUpdateViewAngle).magVec() > 0.64f)
+ if (diff.getLength3().getF32() > 0.64f)
{
group->mViewAngle = view_angle;
group->mLastUpdateViewAngle = view_angle;
@@ -1253,17 +1306,20 @@ F32 LLSpatialPartition::calcDistance(LLSpatialGroup* group, LLCamera& camera)
LLVector3 at = camera.getAtAxis();
- //front of bounding box
- for (U32 i = 0; i < 3; i++)
- {
- v.mV[i] -= group->mObjectBounds[1].mV[i]*0.25f * at.mV[i];
- }
+ LLVector4a ata;
+ ata.load3(at.mV);
- group->mDepth = v * at;
+ LLVector4a t = ata;
+ //front of bounding box
+ t.mul(0.25f);
+ t.mul(group->mObjectBounds[1]);
+ v.sub(t);
+
+ group->mDepth = v.dot3(ata).getF32();
}
else
{
- dist = eye.magVec();
+ dist = eye.getLength3().getF32();
}
if (dist < 16.f)
@@ -1289,7 +1345,8 @@ F32 LLSpatialGroup::getUpdateUrgency() const
}
else
{
- return (gFrameTimeSeconds - mLastUpdateTime+4.f)/mDistance;
+ F32 time = gFrameTimeSeconds-mLastUpdateTime+4.f;
+ return time + (mObjectBounds[1].dot3(mObjectBounds[1]).getF32()+1.f)/mDistance;
}
}
@@ -1300,8 +1357,8 @@ BOOL LLSpatialGroup::needsUpdate()
BOOL LLSpatialGroup::changeLOD()
{
- if (isState(ALPHA_DIRTY))
- { ///an alpha sort is going to happen, update distance and LOD
+ if (isState(ALPHA_DIRTY | OBJECT_DIRTY))
+ { ///a rebuild is going to happen, update distance and LoD
return TRUE;
}
@@ -1314,7 +1371,7 @@ BOOL LLSpatialGroup::changeLOD()
return TRUE;
}
- if (mDistance > mRadius)
+ if (mDistance > mRadius*2.f)
{
return FALSE;
}
@@ -1357,6 +1414,17 @@ void LLSpatialGroup::handleDestruction(const TreeNode* node)
}
}
+ //clean up avatar attachment stats
+ LLSpatialBridge* bridge = mSpatialPartition->asBridge();
+ if (bridge)
+ {
+ if (bridge->mAvatar.notNull())
+ {
+ bridge->mAvatar->mAttachmentGeometryBytes -= mGeometryBytes;
+ bridge->mAvatar->mAttachmentSurfaceArea -= mSurfaceArea;
+ }
+ }
+
clearDrawMap();
mVertexBuffer = NULL;
mBufferMap.clear();
@@ -1416,7 +1484,6 @@ void LLSpatialGroup::destroyGL()
}
}
- delete [] mOcclusionVerts;
mOcclusionVerts = NULL;
for (LLSpatialGroup::element_iter i = getData().begin(); i != getData().end(); ++i)
@@ -1425,8 +1492,7 @@ void LLSpatialGroup::destroyGL()
for (S32 j = 0; j < drawable->getNumFaces(); j++)
{
LLFace* facep = drawable->getFace(j);
- facep->mVertexBuffer = NULL;
- facep->mLastVertexBuffer = NULL;
+ facep->clearVertexBuffer();
}
}
}
@@ -1459,8 +1525,8 @@ BOOL LLSpatialGroup::rebound()
}
else
{
- LLVector3& newMin = mExtents[0];
- LLVector3& newMax = mExtents[1];
+ LLVector4a& newMin = mExtents[0];
+ LLVector4a& newMax = mExtents[1];
LLSpatialGroup* group = (LLSpatialGroup*) mOctreeNode->getChild(0)->getListener(0);
group->clearState(SKIP_FRUSTUM_CHECK);
group->rebound();
@@ -1474,26 +1540,19 @@ BOOL LLSpatialGroup::rebound()
group = (LLSpatialGroup*) mOctreeNode->getChild(i)->getListener(0);
group->clearState(SKIP_FRUSTUM_CHECK);
group->rebound();
- const LLVector3& max = group->mExtents[1];
- const LLVector3& min = group->mExtents[0];
+ const LLVector4a& max = group->mExtents[1];
+ const LLVector4a& min = group->mExtents[0];
- for (U32 j = 0; j < 3; j++)
- {
- if (max.mV[j] > newMax.mV[j])
- {
- newMax.mV[j] = max.mV[j];
- }
- if (min.mV[j] < newMin.mV[j])
- {
- newMin.mV[j] = min.mV[j];
- }
- }
+ newMax.setMax(newMax, max);
+ newMin.setMin(newMin, min);
}
boundObjects(FALSE, newMin, newMax);
- mBounds[0] = (newMin + newMax)*0.5f;
- mBounds[1] = (newMax - newMin)*0.5f;
+ mBounds[0].setAdd(newMin, newMax);
+ mBounds[0].mul(0.5f);
+ mBounds[1].setSub(newMax, newMin);
+ mBounds[1].mul(0.5f);
}
setState(OCCLUSION_DIRTY);
@@ -1504,6 +1563,8 @@ BOOL LLSpatialGroup::rebound()
}
static LLFastTimer::DeclareTimer FTM_OCCLUSION_READBACK("Readback Occlusion");
+static LLFastTimer::DeclareTimer FTM_OCCLUSION_WAIT("Wait");
+
void LLSpatialGroup::checkOcclusion()
{
if (LLPipeline::sUseOcclusion > 1)
@@ -1516,31 +1577,69 @@ void LLSpatialGroup::checkOcclusion()
}
else if (isOcclusionState(QUERY_PENDING))
{ //otherwise, if a query is pending, read it back
- GLuint res = 1;
- if (!isOcclusionState(DISCARD_QUERY) && mOcclusionQuery[LLViewerCamera::sCurCameraID])
- {
- glGetQueryObjectuivARB(mOcclusionQuery[LLViewerCamera::sCurCameraID], GL_QUERY_RESULT_ARB, &res);
- }
- if (isOcclusionState(DISCARD_QUERY))
+ GLuint available = 0;
+ if (mOcclusionQuery[LLViewerCamera::sCurCameraID])
{
- res = 2;
- }
+ glGetQueryObjectuivARB(mOcclusionQuery[LLViewerCamera::sCurCameraID], GL_QUERY_RESULT_AVAILABLE_ARB, &available);
- if (res > 0)
- {
- assert_states_valid(this);
- clearOcclusionState(LLSpatialGroup::OCCLUDED, LLSpatialGroup::STATE_MODE_DIFF);
- assert_states_valid(this);
+ if (mOcclusionIssued[LLViewerCamera::sCurCameraID] < gFrameCount)
+ { //query was issued last frame, wait until it's available
+ S32 max_loop = 1024;
+ LLFastTimer t(FTM_OCCLUSION_WAIT);
+ while (!available && max_loop-- > 0)
+ {
+ F32 max_time = llmin(gFrameIntervalSeconds*10.f, 1.f);
+ //do some usefu work while we wait
+ LLAppViewer::getTextureCache()->update(max_time); // unpauses the texture cache thread
+ LLAppViewer::getImageDecodeThread()->update(max_time); // unpauses the image thread
+ LLAppViewer::getTextureFetch()->update(max_time); // unpauses the texture fetch thread
+
+ glGetQueryObjectuivARB(mOcclusionQuery[LLViewerCamera::sCurCameraID], GL_QUERY_RESULT_AVAILABLE_ARB, &available);
+ }
+ }
}
else
{
- assert_states_valid(this);
- setOcclusionState(LLSpatialGroup::OCCLUDED, LLSpatialGroup::STATE_MODE_DIFF);
- assert_states_valid(this);
+ available = 1;
}
- clearOcclusionState(QUERY_PENDING | DISCARD_QUERY);
+ if (available)
+ { //result is available, read it back, otherwise wait until next frame
+ GLuint res = 1;
+ if (!isOcclusionState(DISCARD_QUERY) && mOcclusionQuery[LLViewerCamera::sCurCameraID])
+ {
+ glGetQueryObjectuivARB(mOcclusionQuery[LLViewerCamera::sCurCameraID], GL_QUERY_RESULT_ARB, &res);
+#if LL_TRACK_PENDING_OCCLUSION_QUERIES
+ sPendingQueries.erase(mOcclusionQuery[LLViewerCamera::sCurCameraID]);
+#endif
+ }
+ else if (mOcclusionQuery[LLViewerCamera::sCurCameraID])
+ { //delete the query to avoid holding onto hundreds of pending queries
+ sQueryPool.release(mOcclusionQuery[LLViewerCamera::sCurCameraID]);
+ mOcclusionQuery[LLViewerCamera::sCurCameraID] = 0;
+ }
+
+ if (isOcclusionState(DISCARD_QUERY))
+ {
+ res = 2;
+ }
+
+ if (res > 0)
+ {
+ assert_states_valid(this);
+ clearOcclusionState(LLSpatialGroup::OCCLUDED, LLSpatialGroup::STATE_MODE_DIFF);
+ assert_states_valid(this);
+ }
+ else
+ {
+ assert_states_valid(this);
+ setOcclusionState(LLSpatialGroup::OCCLUDED, LLSpatialGroup::STATE_MODE_DIFF);
+ assert_states_valid(this);
+ }
+
+ clearOcclusionState(QUERY_PENDING | DISCARD_QUERY);
+ }
}
else if (mSpatialPartition->isOcclusionEnabled() && isOcclusionState(LLSpatialGroup::OCCLUDED))
{ //check occlusion has been issued for occluded node that has not had a query issued
@@ -1551,14 +1650,27 @@ void LLSpatialGroup::checkOcclusion()
}
}
+static LLFastTimer::DeclareTimer FTM_PUSH_OCCLUSION_VERTS("Push Occlusion");
+static LLFastTimer::DeclareTimer FTM_SET_OCCLUSION_STATE("Occlusion State");
+static LLFastTimer::DeclareTimer FTM_OCCLUSION_EARLY_FAIL("Occlusion Early Fail");
+static LLFastTimer::DeclareTimer FTM_OCCLUSION_ALLOCATE("Allocate");
+static LLFastTimer::DeclareTimer FTM_OCCLUSION_BUILD("Build");
+static LLFastTimer::DeclareTimer FTM_OCCLUSION_BEGIN_QUERY("Begin Query");
+static LLFastTimer::DeclareTimer FTM_OCCLUSION_END_QUERY("End Query");
+static LLFastTimer::DeclareTimer FTM_OCCLUSION_SET_BUFFER("Set Buffer");
+static LLFastTimer::DeclareTimer FTM_OCCLUSION_DRAW_WATER("Draw Water");
+static LLFastTimer::DeclareTimer FTM_OCCLUSION_DRAW("Draw");
+
+
+
void LLSpatialGroup::doOcclusion(LLCamera* camera)
{
if (mSpatialPartition->isOcclusionEnabled() && LLPipeline::sUseOcclusion > 1)
{
// Don't cull hole/edge water, unless we have the GL_ARB_depth_clamp extension
- if ((mSpatialPartition->mDrawableType == LLDrawPool::POOL_VOIDWATER && !gGLManager.mHasDepthClamp) ||
- earlyFail(camera, this))
+ if (earlyFail(camera, this))
{
+ LLFastTimer t(FTM_OCCLUSION_EARLY_FAIL);
setOcclusionState(LLSpatialGroup::DISCARD_QUERY);
assert_states_valid(this);
clearOcclusionState(LLSpatialGroup::OCCLUDED, LLSpatialGroup::STATE_MODE_DIFF);
@@ -1566,54 +1678,101 @@ void LLSpatialGroup::doOcclusion(LLCamera* camera)
}
else
{
+ if (!isOcclusionState(QUERY_PENDING) || isOcclusionState(DISCARD_QUERY))
{
- LLFastTimer t(FTM_RENDER_OCCLUSION);
+ { //no query pending, or previous query to be discarded
+ LLFastTimer t(FTM_RENDER_OCCLUSION);
- if (!mOcclusionQuery[LLViewerCamera::sCurCameraID])
- {
- mOcclusionQuery[LLViewerCamera::sCurCameraID] = sQueryPool.allocate();
- }
+ if (!mOcclusionQuery[LLViewerCamera::sCurCameraID])
+ {
+ LLFastTimer t(FTM_OCCLUSION_ALLOCATE);
+ mOcclusionQuery[LLViewerCamera::sCurCameraID] = sQueryPool.allocate();
+ }
- if (!mOcclusionVerts || isState(LLSpatialGroup::OCCLUSION_DIRTY))
- {
- buildOcclusion();
- }
-
- // Depth clamp all water to avoid it being culled as a result of being
- // behind the far clip plane, and in the case of edge water to avoid
- // it being culled while still visible.
- bool const use_depth_clamp = gGLManager.mHasDepthClamp &&
- (mSpatialPartition->mDrawableType == LLDrawPool::POOL_WATER ||
- mSpatialPartition->mDrawableType == LLDrawPool::POOL_VOIDWATER);
- if (use_depth_clamp)
- {
- glEnable(GL_DEPTH_CLAMP);
- }
-
- glBeginQueryARB(GL_SAMPLES_PASSED_ARB, mOcclusionQuery[LLViewerCamera::sCurCameraID]);
- glVertexPointer(3, GL_FLOAT, 0, mOcclusionVerts);
- if (camera->getOrigin().isExactlyZero())
- { //origin is invalid, draw entire box
- glDrawRangeElements(GL_TRIANGLE_FAN, 0, 7, 8,
- GL_UNSIGNED_BYTE, sOcclusionIndices);
- glDrawRangeElements(GL_TRIANGLE_FAN, 0, 7, 8,
- GL_UNSIGNED_BYTE, sOcclusionIndices+b111*8);
- }
- else
- {
- glDrawRangeElements(GL_TRIANGLE_FAN, 0, 7, 8,
- GL_UNSIGNED_BYTE, get_box_fan_indices(camera, mBounds[0]));
+ if (mOcclusionVerts.isNull() || isState(LLSpatialGroup::OCCLUSION_DIRTY))
+ {
+ LLFastTimer t(FTM_OCCLUSION_BUILD);
+ buildOcclusion();
+ }
+
+ // Depth clamp all water to avoid it being culled as a result of being
+ // behind the far clip plane, and in the case of edge water to avoid
+ // it being culled while still visible.
+ bool const use_depth_clamp = gGLManager.mHasDepthClamp &&
+ (mSpatialPartition->mDrawableType == LLDrawPool::POOL_WATER ||
+ mSpatialPartition->mDrawableType == LLDrawPool::POOL_VOIDWATER);
+
+ LLGLEnable clamp(use_depth_clamp ? GL_DEPTH_CLAMP : 0);
+
+#if !LL_DARWIN
+ U32 mode = gGLManager.mHasOcclusionQuery2 ? GL_ANY_SAMPLES_PASSED : GL_SAMPLES_PASSED_ARB;
+#else
+ U32 mode = GL_SAMPLES_PASSED_ARB;
+#endif
+
+#if LL_TRACK_PENDING_OCCLUSION_QUERIES
+ sPendingQueries.insert(mOcclusionQuery[LLViewerCamera::sCurCameraID]);
+#endif
+
+ {
+ LLFastTimer t(FTM_PUSH_OCCLUSION_VERTS);
+
+ //store which frame this query was issued on
+ mOcclusionIssued[LLViewerCamera::sCurCameraID] = gFrameCount;
+
+ {
+ LLFastTimer t(FTM_OCCLUSION_BEGIN_QUERY);
+ glBeginQueryARB(mode, mOcclusionQuery[LLViewerCamera::sCurCameraID]);
+ }
+
+ {
+ LLFastTimer t(FTM_OCCLUSION_SET_BUFFER);
+ mOcclusionVerts->setBuffer(LLVertexBuffer::MAP_VERTEX);
+ }
+
+ if (!use_depth_clamp && mSpatialPartition->mDrawableType == LLDrawPool::POOL_VOIDWATER)
+ {
+ LLFastTimer t(FTM_OCCLUSION_DRAW_WATER);
+
+ LLGLSquashToFarClip squash(glh_get_current_projection(), 1);
+ if (camera->getOrigin().isExactlyZero())
+ { //origin is invalid, draw entire box
+ mOcclusionVerts->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, 0);
+ mOcclusionVerts->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, b111*8);
+ }
+ else
+ {
+ mOcclusionVerts->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, get_box_fan_indices(camera, mBounds[0]));
+ }
+ }
+ else
+ {
+ LLFastTimer t(FTM_OCCLUSION_DRAW);
+ if (camera->getOrigin().isExactlyZero())
+ { //origin is invalid, draw entire box
+ mOcclusionVerts->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, 0);
+ mOcclusionVerts->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, b111*8);
+ }
+ else
+ {
+ mOcclusionVerts->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, get_box_fan_indices(camera, mBounds[0]));
+ }
+ }
+
+
+ {
+ LLFastTimer t(FTM_OCCLUSION_END_QUERY);
+ glEndQueryARB(mode);
+ }
+ }
}
- glEndQueryARB(GL_SAMPLES_PASSED_ARB);
-
- if (use_depth_clamp)
+
{
- glDisable(GL_DEPTH_CLAMP);
+ LLFastTimer t(FTM_SET_OCCLUSION_STATE);
+ setOcclusionState(LLSpatialGroup::QUERY_PENDING);
+ clearOcclusionState(LLSpatialGroup::DISCARD_QUERY);
}
}
-
- setOcclusionState(LLSpatialGroup::QUERY_PENDING);
- clearOcclusionState(LLSpatialGroup::DISCARD_QUERY);
}
}
}
@@ -1621,7 +1780,7 @@ void LLSpatialGroup::doOcclusion(LLCamera* camera)
//==============================================
LLSpatialPartition::LLSpatialPartition(U32 data_mask, BOOL render_by_group, U32 buffer_usage)
-: mRenderByGroup(render_by_group)
+: mRenderByGroup(render_by_group), mBridge(NULL)
{
LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
mOcclusionEnabled = TRUE;
@@ -1635,10 +1794,11 @@ LLSpatialPartition::LLSpatialPartition(U32 data_mask, BOOL render_by_group, U32
mSlopRatio = 0.25f;
mInfiniteFarClip = FALSE;
- LLGLNamePool::registerPool(&sQueryPool);
+ LLVector4a center, size;
+ center.splat(0.f);
+ size.splat(1.f);
- mOctree = new LLSpatialGroup::OctreeRoot(LLVector3d(0,0,0),
- LLVector3d(1,1,1),
+ mOctree = new LLSpatialGroup::OctreeRoot(center,size,
NULL);
new LLSpatialGroup(mOctree, this);
}
@@ -1658,7 +1818,6 @@ LLSpatialGroup *LLSpatialPartition::put(LLDrawable *drawablep, BOOL was_visible)
LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
drawablep->updateSpatialExtents();
- validate_drawable(drawablep);
//keep drawable from being garbage collected
LLPointer<LLDrawable> ptr = drawablep;
@@ -1742,16 +1901,16 @@ void LLSpatialPartition::move(LLDrawable *drawablep, LLSpatialGroup *curp, BOOL
class LLSpatialShift : public LLSpatialGroup::OctreeTraveler
{
public:
- LLSpatialShift(LLVector3 offset) : mOffset(offset) { }
+ const LLVector4a& mOffset;
+
+ LLSpatialShift(const LLVector4a& offset) : mOffset(offset) { }
virtual void visit(const LLSpatialGroup::OctreeNode* branch)
{
((LLSpatialGroup*) branch->getListener(0))->shift(mOffset);
}
-
- LLVector3 mOffset;
};
-void LLSpatialPartition::shift(const LLVector3 &offset)
+void LLSpatialPartition::shift(const LLVector4a &offset)
{ //shift octree node bounding boxes by offset
LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
LLSpatialShift shifter(offset);
@@ -1913,7 +2072,7 @@ public:
class LLOctreeCullVisExtents: public LLOctreeCullShadow
{
public:
- LLOctreeCullVisExtents(LLCamera* camera, LLVector3& min, LLVector3& max)
+ LLOctreeCullVisExtents(LLCamera* camera, LLVector4a& min, LLVector4a& max)
: LLOctreeCullShadow(camera), mMin(min), mMax(max), mEmpty(TRUE) { }
virtual bool earlyFail(LLSpatialGroup* group)
@@ -1957,11 +2116,8 @@ public:
virtual void processGroup(LLSpatialGroup* group)
{
- if (group->isState(LLSpatialGroup::DIRTY) || group->getData().empty())
- {
- llerrs << "WTF?" << llendl;
- }
-
+ llassert(!group->isState(LLSpatialGroup::DIRTY) && !group->getData().empty())
+
if (mRes < 2)
{
if (mCamera->AABBInFrustum(group->mObjectBounds[0], group->mObjectBounds[1]) > 0)
@@ -1980,8 +2136,8 @@ public:
}
BOOL mEmpty;
- LLVector3& mMin;
- LLVector3& mMax;
+ LLVector4a& mMin;
+ LLVector4a& mMax;
};
class LLOctreeCullDetectVisible: public LLOctreeCullShadow
@@ -2050,6 +2206,8 @@ public:
void drawBox(const LLVector3& c, const LLVector3& r)
{
+ LLVertexBuffer::unbind();
+
gGL.begin(LLRender::TRIANGLE_STRIP);
//left front
gGL.vertex3fv((c+r.scaledVec(LLVector3(-1,1,-1))).mV);
@@ -2085,6 +2243,11 @@ void drawBox(const LLVector3& c, const LLVector3& r)
gGL.end();
}
+void drawBox(const LLVector4a& c, const LLVector4a& r)
+{
+ drawBox(reinterpret_cast<const LLVector3&>(c), reinterpret_cast<const LLVector3&>(r));
+}
+
void drawBoxOutline(const LLVector3& pos, const LLVector3& size)
{
LLVector3 v1 = size.scaledVec(LLVector3( 1, 1,1));
@@ -2131,6 +2294,11 @@ void drawBoxOutline(const LLVector3& pos, const LLVector3& size)
gGL.end();
}
+void drawBoxOutline(const LLVector4a& pos, const LLVector4a& size)
+{
+ drawBoxOutline(reinterpret_cast<const LLVector3&>(pos), reinterpret_cast<const LLVector3&>(size));
+}
+
class LLOctreeDirty : public LLOctreeTraveler<LLDrawable>
{
public:
@@ -2174,14 +2342,21 @@ BOOL LLSpatialPartition::isOcclusionEnabled()
BOOL LLSpatialPartition::getVisibleExtents(LLCamera& camera, LLVector3& visMin, LLVector3& visMax)
{
+ LLVector4a visMina, visMaxa;
+ visMina.load3(visMin.mV);
+ visMaxa.load3(visMax.mV);
+
{
LLFastTimer ftm(FTM_CULL_REBOUND);
LLSpatialGroup* group = (LLSpatialGroup*) mOctree->getListener(0);
group->rebound();
}
- LLOctreeCullVisExtents vis(&camera, visMin, visMax);
+ LLOctreeCullVisExtents vis(&camera, visMina, visMaxa);
vis.traverse(mOctree);
+
+ visMin.set(visMina.getF32ptr());
+ visMax.set(visMaxa.getF32ptr());
return vis.mEmpty;
}
@@ -2244,25 +2419,36 @@ BOOL earlyFail(LLCamera* camera, LLSpatialGroup* group)
}
const F32 vel = SG_OCCLUSION_FUDGE*2.f;
- LLVector3 c = group->mBounds[0];
- LLVector3 r = group->mBounds[1] + LLVector3(vel,vel,vel);
-
+ LLVector4a fudge;
+ fudge.splat(vel);
+
+ const LLVector4a& c = group->mBounds[0];
+ LLVector4a r;
+ r.setAdd(group->mBounds[1], fudge);
+
/*if (r.magVecSquared() > 1024.0*1024.0)
{
return TRUE;
}*/
- LLVector3 e = camera->getOrigin();
+ LLVector4a e;
+ e.load3(camera->getOrigin().mV);
- LLVector3 min = c - r;
- LLVector3 max = c + r;
+ LLVector4a min;
+ min.setSub(c,r);
+ LLVector4a max;
+ max.setAdd(c,r);
- for (U32 j = 0; j < 3; j++)
+ S32 lt = e.lessThan(min).getGatheredBits() & 0x7;
+ if (lt)
{
- if (e.mV[j] < min.mV[j] || e.mV[j] > max.mV[j])
- {
- return FALSE;
- }
+ return FALSE;
+ }
+
+ S32 gt = e.greaterThan(max).getGatheredBits() & 0x7;
+ if (gt)
+ {
+ return FALSE;
}
return TRUE;
@@ -2293,9 +2479,11 @@ void pushVerts(LLSpatialGroup* group, U32 mask)
void pushVerts(LLFace* face, U32 mask)
{
- LLVertexBuffer* buffer = face->mVertexBuffer;
+ llassert(face->verify());
- if (buffer)
+ LLVertexBuffer* buffer = face->getVertexBuffer();
+
+ if (buffer && (face->getGeomCount() >= 3))
{
buffer->setBuffer(mask);
U16 start = face->getGeomStart();
@@ -2304,7 +2492,24 @@ void pushVerts(LLFace* face, U32 mask)
U16 offset = face->getIndicesStart();
buffer->drawRange(LLRender::TRIANGLES, start, end, count, offset);
}
+}
+
+void pushVerts(LLDrawable* drawable, U32 mask)
+{
+ for (S32 i = 0; i < drawable->getNumFaces(); ++i)
+ {
+ pushVerts(drawable->getFace(i), mask);
+ }
+}
+void pushVerts(LLVolume* volume)
+{
+ LLVertexBuffer::unbind();
+ for (S32 i = 0; i < volume->getNumVolumeFaces(); ++i)
+ {
+ const LLVolumeFace& face = volume->getVolumeFace(i);
+ LLVertexBuffer::drawElements(LLRender::TRIANGLES, face.mPositions, NULL, face.mNumIndices, face.mIndices);
+ }
}
void pushBufferVerts(LLVertexBuffer* buffer, U32 mask)
@@ -2312,7 +2517,7 @@ void pushBufferVerts(LLVertexBuffer* buffer, U32 mask)
if (buffer)
{
buffer->setBuffer(mask);
- buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getRequestedVerts()-1, buffer->getRequestedIndices(), 0);
+ buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts()-1, buffer->getNumIndices(), 0);
}
}
@@ -2369,7 +2574,7 @@ void pushVertsColorCoded(LLSpatialGroup* group, U32 mask)
{
params = *j;
LLRenderPass::applyModelMatrix(*params);
- glColor4f(colors[col].mV[0], colors[col].mV[1], colors[col].mV[2], 0.5f);
+ gGL.diffuseColor4f(colors[col].mV[0], colors[col].mV[1], colors[col].mV[2], 0.5f);
params->mVertexBuffer->setBuffer(mask);
params->mVertexBuffer->drawRange(params->mParticle ? LLRender::POINTS : LLRender::TRIANGLES,
params->mStart, params->mEnd, params->mCount, params->mOffset);
@@ -2382,7 +2587,6 @@ void renderOctree(LLSpatialGroup* group)
{
//render solid object bounding box, color
//coded by buffer usage and activity
- LLGLDepthTest depth(GL_TRUE, GL_FALSE);
gGL.setSceneBlendType(LLRender::BT_ADD_WITH_ALPHA);
LLVector4 col;
if (group->mBuilt > 0.f)
@@ -2403,7 +2607,7 @@ void renderOctree(LLSpatialGroup* group)
LLGLDepthTest gl_depth(FALSE, FALSE);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
- gGL.color4f(1,0,0,group->mBuilt);
+ gGL.diffuseColor4f(1,0,0,group->mBuilt);
gGL.flush();
glLineWidth(5.f);
drawBoxOutline(group->mObjectBounds[0], group->mObjectBounds[1]);
@@ -2415,43 +2619,43 @@ void renderOctree(LLSpatialGroup* group)
LLDrawable* drawable = *i;
if (!group->mSpatialPartition->isBridge())
{
- glPushMatrix();
+ gGL.pushMatrix();
LLVector3 trans = drawable->getRegion()->getOriginAgent();
- glTranslatef(trans.mV[0], trans.mV[1], trans.mV[2]);
+ gGL.translatef(trans.mV[0], trans.mV[1], trans.mV[2]);
}
for (S32 j = 0; j < drawable->getNumFaces(); j++)
{
LLFace* face = drawable->getFace(j);
- if (face->mVertexBuffer.notNull())
+ if (face->getVertexBuffer())
{
if (gFrameTimeSeconds - face->mLastUpdateTime < 0.5f)
{
- glColor4f(0, 1, 0, group->mBuilt);
+ gGL.diffuseColor4f(0, 1, 0, group->mBuilt);
}
else if (gFrameTimeSeconds - face->mLastMoveTime < 0.5f)
{
- glColor4f(1, 0, 0, group->mBuilt);
+ gGL.diffuseColor4f(1, 0, 0, group->mBuilt);
}
else
{
continue;
}
- face->mVertexBuffer->setBuffer(LLVertexBuffer::MAP_VERTEX);
+ face->getVertexBuffer()->setBuffer(LLVertexBuffer::MAP_VERTEX);
//drawBox((face->mExtents[0] + face->mExtents[1])*0.5f,
// (face->mExtents[1]-face->mExtents[0])*0.5f);
- face->mVertexBuffer->draw(LLRender::TRIANGLES, face->getIndicesCount(), face->getIndicesStart());
+ face->getVertexBuffer()->draw(LLRender::TRIANGLES, face->getIndicesCount(), face->getIndicesStart());
}
}
if (!group->mSpatialPartition->isBridge())
{
- glPopMatrix();
+ gGL.popMatrix();
}
}
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
- gGL.color4f(1,1,1,1);
+ gGL.diffuseColor4f(1,1,1,1);
}
}
else
@@ -2467,48 +2671,52 @@ void renderOctree(LLSpatialGroup* group)
}
}
- gGL.color4fv(col.mV);
- drawBox(group->mObjectBounds[0], group->mObjectBounds[1]*1.01f+LLVector3(0.001f, 0.001f, 0.001f));
+ gGL.diffuseColor4fv(col.mV);
+ LLVector4a fudge;
+ fudge.splat(0.001f);
+ LLVector4a size = group->mObjectBounds[1];
+ size.mul(1.01f);
+ size.add(fudge);
+
+ //{
+ // LLGLDepthTest depth(GL_TRUE, GL_FALSE);
+ // drawBox(group->mObjectBounds[0], fudge);
+ //}
gGL.setSceneBlendType(LLRender::BT_ALPHA);
- if (group->mBuilt <= 0.f)
+ //if (group->mBuilt <= 0.f)
{
//draw opaque outline
- gGL.color4f(col.mV[0], col.mV[1], col.mV[2], 1.f);
- drawBoxOutline(group->mObjectBounds[0], group->mObjectBounds[1]);
+ //gGL.diffuseColor4f(col.mV[0], col.mV[1], col.mV[2], 1.f);
+ //drawBoxOutline(group->mObjectBounds[0], group->mObjectBounds[1]);
- if (group->mOctreeNode->isLeaf())
- {
- gGL.color4f(1,1,1,1);
- }
- else
- {
- gGL.color4f(0,1,1,1);
- }
-
+ gGL.diffuseColor4f(0,1,1,1);
drawBoxOutline(group->mBounds[0],group->mBounds[1]);
-
-
+
//draw bounding box for draw info
- if (group->mSpatialPartition->mRenderByGroup)
+ /*if (group->mSpatialPartition->mRenderByGroup)
{
- gGL.color4f(1.0f, 0.75f, 0.25f, 0.6f);
+ gGL.diffuseColor4f(1.0f, 0.75f, 0.25f, 0.6f);
for (LLSpatialGroup::draw_map_t::iterator i = group->mDrawMap.begin(); i != group->mDrawMap.end(); ++i)
{
for (LLSpatialGroup::drawmap_elem_t::iterator j = i->second.begin(); j != i->second.end(); ++j)
{
LLDrawInfo* draw_info = *j;
- LLVector3 center = (draw_info->mExtents[1] + draw_info->mExtents[0])*0.5f;
- LLVector3 size = (draw_info->mExtents[1] - draw_info->mExtents[0])*0.5f;
+ LLVector4a center;
+ center.setAdd(draw_info->mExtents[1], draw_info->mExtents[0]);
+ center.mul(0.5f);
+ LLVector4a size;
+ size.setSub(draw_info->mExtents[1], draw_info->mExtents[0]);
+ size.mul(0.5f);
drawBoxOutline(center, size);
}
}
- }
+ }*/
}
// LLSpatialGroup::OctreeNode* node = group->mOctreeNode;
-// gGL.color4f(0,1,0,1);
+// gGL.diffuseColor4f(0,1,0,1);
// drawBoxOutline(LLVector3(node->getCenter()), LLVector3(node->getSize()));
}
@@ -2521,11 +2729,12 @@ void renderVisibility(LLSpatialGroup* group, LLCamera* camera)
BOOL render_objects = (!LLPipeline::sUseOcclusion || !group->isOcclusionState(LLSpatialGroup::OCCLUDED)) && group->isVisible() &&
!group->getData().empty();
+
if (render_objects)
{
LLGLDepthTest depth_under(GL_TRUE, GL_FALSE, GL_GREATER);
- glColor4f(0, 0.5f, 0, 0.5f);
- gGL.color4f(0, 0.5f, 0, 0.5f);
+ gGL.diffuseColor4f(0, 0.5f, 0, 0.5f);
+ gGL.diffuseColor4f(0, 0.5f, 0, 0.5f);
pushBufferVerts(group, LLVertexBuffer::MAP_VERTEX);
}
@@ -2534,8 +2743,8 @@ void renderVisibility(LLSpatialGroup* group, LLCamera* camera)
if (render_objects)
{
- glColor4f(0.f, 0.5f, 0.f,1.f);
- gGL.color4f(0.f, 0.5f, 0.f, 1.f);
+ gGL.diffuseColor4f(0.f, 0.5f, 0.f,1.f);
+ gGL.diffuseColor4f(0.f, 0.5f, 0.f, 1.f);
pushBufferVerts(group, LLVertexBuffer::MAP_VERTEX);
}
@@ -2543,29 +2752,29 @@ void renderVisibility(LLSpatialGroup* group, LLCamera* camera)
if (render_objects)
{
- glColor4f(0.f, 0.75f, 0.f,0.5f);
- gGL.color4f(0.f, 0.75f, 0.f, 0.5f);
+ gGL.diffuseColor4f(0.f, 0.75f, 0.f,0.5f);
+ gGL.diffuseColor4f(0.f, 0.75f, 0.f, 0.5f);
pushBufferVerts(group, LLVertexBuffer::MAP_VERTEX);
}
- else if (camera && group->mOcclusionVerts)
+ /*else if (camera && group->mOcclusionVerts.notNull())
{
LLVertexBuffer::unbind();
- glVertexPointer(3, GL_FLOAT, 0, group->mOcclusionVerts);
-
- glColor4f(1.0f, 0.f, 0.f, 0.5f);
- glDrawRangeElements(GL_TRIANGLE_FAN, 0, 7, 8, GL_UNSIGNED_BYTE, get_box_fan_indices(camera, group->mBounds[0]));
+ group->mOcclusionVerts->setBuffer(LLVertexBuffer::MAP_VERTEX);
+
+ gGL.diffuseColor4f(1.0f, 0.f, 0.f, 0.5f);
+ group->mOcclusionVerts->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, get_box_fan_indices(camera, group->mBounds[0]));
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
- glColor4f(1.0f, 1.f, 1.f, 1.0f);
- glDrawRangeElements(GL_TRIANGLE_FAN, 0, 7, 8, GL_UNSIGNED_BYTE, get_box_fan_indices(camera, group->mBounds[0]));
+ gGL.diffuseColor4f(1.0f, 1.f, 1.f, 1.0f);
+ group->mOcclusionVerts->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, get_box_fan_indices(camera, group->mBounds[0]));
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
- }
+ }*/
}
}
void renderCrossHairs(LLVector3 position, F32 size, LLColor4 color)
{
- gGL.color4fv(color.mV);
+ gGL.diffuseColor4fv(color.mV);
gGL.begin(LLRender::LINES);
{
gGL.vertex3fv((position - LLVector3(size, 0.f, 0.f)).mV);
@@ -2578,6 +2787,158 @@ void renderCrossHairs(LLVector3 position, F32 size, LLColor4 color)
gGL.end();
}
+void renderUpdateType(LLDrawable* drawablep)
+{
+ LLViewerObject* vobj = drawablep->getVObj();
+ if (!vobj || OUT_UNKNOWN == vobj->getLastUpdateType())
+ {
+ return;
+ }
+ LLGLEnable blend(GL_BLEND);
+ switch (vobj->getLastUpdateType())
+ {
+ case OUT_FULL:
+ gGL.diffuseColor4f(0,1,0,0.5f);
+ break;
+ case OUT_TERSE_IMPROVED:
+ gGL.diffuseColor4f(0,1,1,0.5f);
+ break;
+ case OUT_FULL_COMPRESSED:
+ if (vobj->getLastUpdateCached())
+ {
+ gGL.diffuseColor4f(1,0,0,0.5f);
+ }
+ else
+ {
+ gGL.diffuseColor4f(1,1,0,0.5f);
+ }
+ break;
+ case OUT_FULL_CACHED:
+ gGL.diffuseColor4f(0,0,1,0.5f);
+ break;
+ default:
+ llwarns << "Unknown update_type " << vobj->getLastUpdateType() << llendl;
+ break;
+ };
+ S32 num_faces = drawablep->getNumFaces();
+ if (num_faces)
+ {
+ for (S32 i = 0; i < num_faces; ++i)
+ {
+ pushVerts(drawablep->getFace(i), LLVertexBuffer::MAP_VERTEX);
+ }
+ }
+}
+
+void renderComplexityDisplay(LLDrawable* drawablep)
+{
+ LLViewerObject* vobj = drawablep->getVObj();
+ if (!vobj)
+ {
+ return;
+ }
+
+ LLVOVolume *voVol = dynamic_cast<LLVOVolume*>(vobj);
+
+ if (!voVol)
+ {
+ return;
+ }
+
+ if (!voVol->isRoot())
+ {
+ return;
+ }
+
+ LLVOVolume::texture_cost_t textures;
+ F32 cost = (F32) voVol->getRenderCost(textures);
+
+ // add any child volumes
+ LLViewerObject::const_child_list_t children = voVol->getChildren();
+ for (LLViewerObject::const_child_list_t::const_iterator iter = children.begin(); iter != children.end(); ++iter)
+ {
+ const LLViewerObject *child = *iter;
+ const LLVOVolume *child_volume = dynamic_cast<const LLVOVolume*>(child);
+ if (child_volume)
+ {
+ cost += child_volume->getRenderCost(textures);
+ }
+ }
+
+ // add texture cost
+ for (LLVOVolume::texture_cost_t::iterator iter = textures.begin(); iter != textures.end(); ++iter)
+ {
+ // add the cost of each individual texture in the linkset
+ cost += iter->second;
+ }
+
+ F32 cost_max = (F32) LLVOVolume::getRenderComplexityMax();
+
+
+
+ // allow user to set a static color scale
+ if (gSavedSettings.getS32("RenderComplexityStaticMax") > 0)
+ {
+ cost_max = gSavedSettings.getS32("RenderComplexityStaticMax");
+ }
+
+ F32 cost_ratio = cost / cost_max;
+
+ // cap cost ratio at 1.0f in case cost_max is at a low threshold
+ cost_ratio = cost_ratio > 1.0f ? 1.0f : cost_ratio;
+
+ LLGLEnable blend(GL_BLEND);
+
+ LLColor4 color;
+ const LLColor4 color_min = gSavedSettings.getColor4("RenderComplexityColorMin");
+ const LLColor4 color_mid = gSavedSettings.getColor4("RenderComplexityColorMid");
+ const LLColor4 color_max = gSavedSettings.getColor4("RenderComplexityColorMax");
+
+ if (cost_ratio < 0.5f)
+ {
+ color = color_min * (1 - cost_ratio * 2) + color_mid * (cost_ratio * 2);
+ }
+ else
+ {
+ color = color_mid * (1 - (cost_ratio - 0.5) * 2) + color_max * ((cost_ratio - 0.5) * 2);
+ }
+
+ LLSD color_val = color.getValue();
+
+ // don't highlight objects below the threshold
+ if (cost > gSavedSettings.getS32("RenderComplexityThreshold"))
+ {
+ glColor4f(color[0],color[1],color[2],0.5f);
+
+
+ S32 num_faces = drawablep->getNumFaces();
+ if (num_faces)
+ {
+ for (S32 i = 0; i < num_faces; ++i)
+ {
+ pushVerts(drawablep->getFace(i), LLVertexBuffer::MAP_VERTEX);
+ }
+ }
+ LLViewerObject::const_child_list_t children = voVol->getChildren();
+ for (LLViewerObject::const_child_list_t::const_iterator iter = children.begin(); iter != children.end(); ++iter)
+ {
+ const LLViewerObject *child = *iter;
+ if (child)
+ {
+ num_faces = child->getNumFaces();
+ if (num_faces)
+ {
+ for (S32 i = 0; i < num_faces; ++i)
+ {
+ pushVerts(child->mDrawable->getFace(i), LLVertexBuffer::MAP_VERTEX);
+ }
+ }
+ }
+ }
+ }
+
+ voVol->setDebugText(llformat("%4.0f", cost));
+}
void renderBoundingBox(LLDrawable* drawable, BOOL set_color = TRUE)
{
@@ -2585,17 +2946,17 @@ void renderBoundingBox(LLDrawable* drawable, BOOL set_color = TRUE)
{
if (drawable->isSpatialBridge())
{
- gGL.color4f(1,0.5f,0,1);
+ gGL.diffuseColor4f(1,0.5f,0,1);
}
else if (drawable->getVOVolume())
{
if (drawable->isRoot())
{
- gGL.color4f(1,1,0,1);
+ gGL.diffuseColor4f(1,1,0,1);
}
else
{
- gGL.color4f(0,1,0,1);
+ gGL.diffuseColor4f(0,1,0,1);
}
}
else if (drawable->getVObj())
@@ -2603,35 +2964,35 @@ void renderBoundingBox(LLDrawable* drawable, BOOL set_color = TRUE)
switch (drawable->getVObj()->getPCode())
{
case LLViewerObject::LL_VO_SURFACE_PATCH:
- gGL.color4f(0,1,1,1);
+ gGL.diffuseColor4f(0,1,1,1);
break;
case LLViewerObject::LL_VO_CLOUDS:
- gGL.color4f(0.5f,0.5f,0.5f,1.0f);
+ // no longer used
break;
case LLViewerObject::LL_VO_PART_GROUP:
case LLViewerObject::LL_VO_HUD_PART_GROUP:
- gGL.color4f(0,0,1,1);
+ gGL.diffuseColor4f(0,0,1,1);
break;
case LLViewerObject::LL_VO_VOID_WATER:
case LLViewerObject::LL_VO_WATER:
- gGL.color4f(0,0.5f,1,1);
+ gGL.diffuseColor4f(0,0.5f,1,1);
break;
case LL_PCODE_LEGACY_TREE:
- gGL.color4f(0,0.5f,0,1);
+ gGL.diffuseColor4f(0,0.5f,0,1);
break;
default:
- gGL.color4f(1,0,1,1);
+ gGL.diffuseColor4f(1,0,1,1);
break;
}
}
else
{
- gGL.color4f(1,0,0,1);
+ gGL.diffuseColor4f(1,0,0,1);
}
}
- const LLVector3* ext;
- LLVector3 pos, size;
+ const LLVector4a* ext;
+ LLVector4a pos, size;
//render face bounding boxes
for (S32 i = 0; i < drawable->getNumFaces(); i++)
@@ -2640,20 +3001,21 @@ void renderBoundingBox(LLDrawable* drawable, BOOL set_color = TRUE)
ext = facep->mExtents;
- if (ext[0].isExactlyZero() && ext[1].isExactlyZero())
- {
- continue;
- }
- pos = (ext[0] + ext[1]) * 0.5f;
- size = (ext[1] - ext[0]) * 0.5f;
+ pos.setAdd(ext[0], ext[1]);
+ pos.mul(0.5f);
+ size.setSub(ext[1], ext[0]);
+ size.mul(0.5f);
+
drawBoxOutline(pos,size);
}
//render drawable bounding box
ext = drawable->getSpatialExtents();
- pos = (ext[0] + ext[1]) * 0.5f;
- size = (ext[1] - ext[0]) * 0.5f;
+ pos.setAdd(ext[0], ext[1]);
+ pos.mul(0.5f);
+ size.setSub(ext[1], ext[0]);
+ size.mul(0.5f);
LLViewerObject* vobj = drawable->getVObj();
if (vobj && vobj->onActiveList())
@@ -2670,7 +3032,489 @@ void renderBoundingBox(LLDrawable* drawable, BOOL set_color = TRUE)
{
drawBoxOutline(pos,size);
}
-
+}
+
+void renderNormals(LLDrawable* drawablep)
+{
+ LLVertexBuffer::unbind();
+
+ LLVOVolume* vol = drawablep->getVOVolume();
+ if (vol)
+ {
+ LLVolume* volume = vol->getVolume();
+ gGL.pushMatrix();
+ gGL.multMatrix((F32*) vol->getRelativeXform().mMatrix);
+
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+
+ LLVector4a scale(gSavedSettings.getF32("RenderDebugNormalScale"));
+
+ for (S32 i = 0; i < volume->getNumVolumeFaces(); ++i)
+ {
+ const LLVolumeFace& face = volume->getVolumeFace(i);
+
+ for (S32 j = 0; j < face.mNumVertices; ++j)
+ {
+ gGL.begin(LLRender::LINES);
+ LLVector4a n,p;
+
+ n.setMul(face.mNormals[j], scale);
+ p.setAdd(face.mPositions[j], n);
+
+ gGL.diffuseColor4f(1,1,1,1);
+ gGL.vertex3fv(face.mPositions[j].getF32ptr());
+ gGL.vertex3fv(p.getF32ptr());
+
+ if (face.mBinormals)
+ {
+ n.setMul(face.mBinormals[j], scale);
+ p.setAdd(face.mPositions[j], n);
+
+ gGL.diffuseColor4f(0,1,1,1);
+ gGL.vertex3fv(face.mPositions[j].getF32ptr());
+ gGL.vertex3fv(p.getF32ptr());
+ }
+ gGL.end();
+ }
+ }
+
+ gGL.popMatrix();
+ }
+}
+
+S32 get_physics_detail(const LLVolumeParams& volume_params, const LLVector3& scale)
+{
+ const S32 DEFAULT_DETAIL = 1;
+ const F32 LARGE_THRESHOLD = 5.f;
+ const F32 MEGA_THRESHOLD = 25.f;
+
+ S32 detail = DEFAULT_DETAIL;
+ F32 avg_scale = (scale[0]+scale[1]+scale[2])/3.f;
+
+ if (avg_scale > LARGE_THRESHOLD)
+ {
+ detail += 1;
+ if (avg_scale > MEGA_THRESHOLD)
+ {
+ detail += 1;
+ }
+ }
+
+ return detail;
+}
+
+void renderMeshBaseHull(LLVOVolume* volume, U32 data_mask, LLColor4& color, LLColor4& line_color)
+{
+ LLUUID mesh_id = volume->getVolume()->getParams().getSculptID();
+ LLModel::Decomposition* decomp = gMeshRepo.getDecomposition(mesh_id);
+
+ const LLVector3 center(0,0,0);
+ const LLVector3 size(0.25f,0.25f,0.25f);
+
+ if (decomp)
+ {
+ if (!decomp->mBaseHullMesh.empty())
+ {
+ gGL.diffuseColor4fv(color.mV);
+ LLVertexBuffer::drawArrays(LLRender::TRIANGLES, decomp->mBaseHullMesh.mPositions, decomp->mBaseHullMesh.mNormals);
+ }
+ else
+ {
+ gMeshRepo.buildPhysicsMesh(*decomp);
+ gGL.diffuseColor4f(0,1,1,1);
+ drawBoxOutline(center, size);
+ }
+
+ }
+ else
+ {
+ gGL.diffuseColor3f(1,0,1);
+ drawBoxOutline(center, size);
+ }
+}
+
+void render_hull(LLModel::PhysicsMesh& mesh, const LLColor4& color, const LLColor4& line_color)
+{
+ gGL.diffuseColor4fv(color.mV);
+ LLVertexBuffer::drawArrays(LLRender::TRIANGLES, mesh.mPositions, mesh.mNormals);
+ LLGLEnable offset(GL_POLYGON_OFFSET_LINE);
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ glPolygonOffset(3.f, 3.f);
+ glLineWidth(3.f);
+ gGL.diffuseColor4fv(line_color.mV);
+ LLVertexBuffer::drawArrays(LLRender::TRIANGLES, mesh.mPositions, mesh.mNormals);
+ glLineWidth(1.f);
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+}
+
+void renderPhysicsShape(LLDrawable* drawable, LLVOVolume* volume)
+{
+ U8 physics_type = volume->getPhysicsShapeType();
+
+ if (physics_type == LLViewerObject::PHYSICS_SHAPE_NONE || volume->isFlexible())
+ {
+ return;
+ }
+
+ //not allowed to return at this point without rendering *something*
+
+ F32 threshold = gSavedSettings.getF32("ObjectCostHighThreshold");
+ F32 cost = volume->getObjectCost();
+
+ LLColor4 low = gSavedSettings.getColor4("ObjectCostLowColor");
+ LLColor4 mid = gSavedSettings.getColor4("ObjectCostMidColor");
+ LLColor4 high = gSavedSettings.getColor4("ObjectCostHighColor");
+
+ F32 normalizedCost = 1.f - exp( -(cost / threshold) );
+
+ LLColor4 color;
+ if ( normalizedCost <= 0.5f )
+ {
+ color = lerp( low, mid, 2.f * normalizedCost );
+ }
+ else
+ {
+ color = lerp( mid, high, 2.f * ( normalizedCost - 0.5f ) );
+ }
+
+ LLColor4 line_color = color*0.5f;
+
+ U32 data_mask = LLVertexBuffer::MAP_VERTEX;
+
+ LLVolumeParams volume_params = volume->getVolume()->getParams();
+
+ LLPhysicsVolumeParams physics_params(volume_params,
+ physics_type == LLViewerObject::PHYSICS_SHAPE_CONVEX_HULL);
+
+ LLPhysicsShapeBuilderUtil::PhysicsShapeSpecification physics_spec;
+ LLPhysicsShapeBuilderUtil::determinePhysicsShape(physics_params, volume->getScale(), physics_spec);
+
+ U32 type = physics_spec.getType();
+
+ LLVector3 center(0,0,0);
+ LLVector3 size(0.25f,0.25f,0.25f);
+
+ gGL.pushMatrix();
+ gGL.multMatrix((F32*) volume->getRelativeXform().mMatrix);
+
+ if (type == LLPhysicsShapeBuilderUtil::PhysicsShapeSpecification::USER_MESH)
+ {
+ LLUUID mesh_id = volume->getVolume()->getParams().getSculptID();
+ LLModel::Decomposition* decomp = gMeshRepo.getDecomposition(mesh_id);
+
+ if (decomp)
+ { //render a physics based mesh
+
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+
+ if (!decomp->mHull.empty())
+ { //decomposition exists, use that
+
+ if (decomp->mMesh.empty())
+ {
+ gMeshRepo.buildPhysicsMesh(*decomp);
+ }
+
+ for (U32 i = 0; i < decomp->mMesh.size(); ++i)
+ {
+ render_hull(decomp->mMesh[i], color, line_color);
+ }
+ }
+ else if (!decomp->mPhysicsShapeMesh.empty())
+ {
+ //decomp has physics mesh, render that mesh
+ gGL.diffuseColor4fv(color.mV);
+ LLVertexBuffer::drawArrays(LLRender::TRIANGLES, decomp->mPhysicsShapeMesh.mPositions, decomp->mPhysicsShapeMesh.mNormals);
+
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ gGL.diffuseColor4fv(line_color.mV);
+ LLVertexBuffer::drawArrays(LLRender::TRIANGLES, decomp->mPhysicsShapeMesh.mPositions, decomp->mPhysicsShapeMesh.mNormals);
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ }
+ else
+ { //no mesh or decomposition, render base hull
+ renderMeshBaseHull(volume, data_mask, color, line_color);
+
+ if (decomp->mPhysicsShapeMesh.empty())
+ {
+ //attempt to fetch physics shape mesh if available
+ gMeshRepo.fetchPhysicsShape(mesh_id);
+ }
+ }
+ }
+ else
+ {
+ gGL.diffuseColor3f(1,1,0);
+ drawBoxOutline(center, size);
+ }
+ }
+ else if (type == LLPhysicsShapeBuilderUtil::PhysicsShapeSpecification::USER_CONVEX ||
+ type == LLPhysicsShapeBuilderUtil::PhysicsShapeSpecification::PRIM_CONVEX)
+ {
+ if (volume->isMesh())
+ {
+ renderMeshBaseHull(volume, data_mask, color, line_color);
+ }
+ else
+ {
+ LLVolumeParams volume_params = volume->getVolume()->getParams();
+ S32 detail = get_physics_detail(volume_params, volume->getScale());
+ LLVolume* phys_volume = LLPrimitive::sVolumeManager->refVolume(volume_params, detail);
+
+ if (!phys_volume->mHullPoints)
+ { //build convex hull
+ std::vector<LLVector3> pos;
+ std::vector<U16> index;
+
+ S32 index_offset = 0;
+
+ for (S32 i = 0; i < phys_volume->getNumVolumeFaces(); ++i)
+ {
+ const LLVolumeFace& face = phys_volume->getVolumeFace(i);
+ if (index_offset + face.mNumVertices > 65535)
+ {
+ continue;
+ }
+
+ for (S32 j = 0; j < face.mNumVertices; ++j)
+ {
+ pos.push_back(LLVector3(face.mPositions[j].getF32ptr()));
+ }
+
+ for (S32 j = 0; j < face.mNumIndices; ++j)
+ {
+ index.push_back(face.mIndices[j]+index_offset);
+ }
+
+ index_offset += face.mNumVertices;
+ }
+
+ if (!pos.empty() && !index.empty())
+ {
+ LLCDMeshData mesh;
+ mesh.mIndexBase = &index[0];
+ mesh.mVertexBase = pos[0].mV;
+ mesh.mNumVertices = pos.size();
+ mesh.mVertexStrideBytes = 12;
+ mesh.mIndexStrideBytes = 6;
+ mesh.mIndexType = LLCDMeshData::INT_16;
+
+ mesh.mNumTriangles = index.size()/3;
+
+ LLCDMeshData res;
+
+ LLConvexDecomposition::getInstance()->generateSingleHullMeshFromMesh( &mesh, &res );
+
+ //copy res into phys_volume
+ phys_volume->mHullPoints = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*res.mNumVertices);
+ phys_volume->mNumHullPoints = res.mNumVertices;
+
+ S32 idx_size = (res.mNumTriangles*3*2+0xF) & ~0xF;
+ phys_volume->mHullIndices = (U16*) ll_aligned_malloc_16(idx_size);
+ phys_volume->mNumHullIndices = res.mNumTriangles*3;
+
+ const F32* v = res.mVertexBase;
+
+ for (S32 i = 0; i < res.mNumVertices; ++i)
+ {
+ F32* p = (F32*) ((U8*)v+i*res.mVertexStrideBytes);
+ phys_volume->mHullPoints[i].load3(p);
+ }
+
+ if (res.mIndexType == LLCDMeshData::INT_16)
+ {
+ for (S32 i = 0; i < res.mNumTriangles; ++i)
+ {
+ U16* idx = (U16*) (((U8*)res.mIndexBase)+i*res.mIndexStrideBytes);
+
+ phys_volume->mHullIndices[i*3+0] = idx[0];
+ phys_volume->mHullIndices[i*3+1] = idx[1];
+ phys_volume->mHullIndices[i*3+2] = idx[2];
+ }
+ }
+ else
+ {
+ for (S32 i = 0; i < res.mNumTriangles; ++i)
+ {
+ U32* idx = (U32*) (((U8*)res.mIndexBase)+i*res.mIndexStrideBytes);
+
+ phys_volume->mHullIndices[i*3+0] = (U16) idx[0];
+ phys_volume->mHullIndices[i*3+1] = (U16) idx[1];
+ phys_volume->mHullIndices[i*3+2] = (U16) idx[2];
+ }
+ }
+ }
+ }
+
+ if (phys_volume->mHullPoints)
+ {
+ //render hull
+
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+
+ gGL.diffuseColor4fv(line_color.mV);
+ LLVertexBuffer::unbind();
+
+ llassert(!LLGLSLShader::sNoFixedFunction || LLGLSLShader::sCurBoundShader != 0);
+
+ LLVertexBuffer::drawElements(LLRender::TRIANGLES, phys_volume->mHullPoints, NULL, phys_volume->mNumHullIndices, phys_volume->mHullIndices);
+
+ gGL.diffuseColor4fv(color.mV);
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ LLVertexBuffer::drawElements(LLRender::TRIANGLES, phys_volume->mHullPoints, NULL, phys_volume->mNumHullIndices, phys_volume->mHullIndices);
+
+ }
+ else
+ {
+ gGL.diffuseColor4f(1,0,1,1);
+ drawBoxOutline(center, size);
+ }
+
+ LLPrimitive::sVolumeManager->unrefVolume(phys_volume);
+ }
+ }
+ else if (type == LLPhysicsShapeBuilderUtil::PhysicsShapeSpecification::BOX)
+ {
+ LLVector3 center = physics_spec.getCenter();
+ LLVector3 scale = physics_spec.getScale();
+ LLVector3 vscale = volume->getScale()*2.f;
+ scale.set(scale[0]/vscale[0], scale[1]/vscale[1], scale[2]/vscale[2]);
+
+ gGL.diffuseColor4fv(color.mV);
+ drawBox(center, scale);
+ }
+ else if (type == LLPhysicsShapeBuilderUtil::PhysicsShapeSpecification::SPHERE)
+ {
+ /*LLVolumeParams volume_params;
+ volume_params.setType( LL_PCODE_PROFILE_CIRCLE_HALF, LL_PCODE_PATH_CIRCLE );
+ volume_params.setBeginAndEndS( 0.f, 1.f );
+ volume_params.setBeginAndEndT( 0.f, 1.f );
+ volume_params.setRatio ( 1, 1 );
+ volume_params.setShear ( 0, 0 );
+ LLVolume* sphere = LLPrimitive::sVolumeManager->refVolume(volume_params, 3);
+
+ gGL.diffuseColor4fv(color.mV);
+ pushVerts(sphere);
+ LLPrimitive::sVolumeManager->unrefVolume(sphere);*/
+ }
+ else if (type == LLPhysicsShapeBuilderUtil::PhysicsShapeSpecification::CYLINDER)
+ {
+ LLVolumeParams volume_params;
+ volume_params.setType( LL_PCODE_PROFILE_CIRCLE, LL_PCODE_PATH_LINE );
+ volume_params.setBeginAndEndS( 0.f, 1.f );
+ volume_params.setBeginAndEndT( 0.f, 1.f );
+ volume_params.setRatio ( 1, 1 );
+ volume_params.setShear ( 0, 0 );
+ LLVolume* cylinder = LLPrimitive::sVolumeManager->refVolume(volume_params, 3);
+
+ gGL.diffuseColor4fv(color.mV);
+ pushVerts(cylinder);
+ LLPrimitive::sVolumeManager->unrefVolume(cylinder);
+ }
+ else if (type == LLPhysicsShapeBuilderUtil::PhysicsShapeSpecification::PRIM_MESH)
+ {
+ LLVolumeParams volume_params = volume->getVolume()->getParams();
+ S32 detail = get_physics_detail(volume_params, volume->getScale());
+
+ LLVolume* phys_volume = LLPrimitive::sVolumeManager->refVolume(volume_params, detail);
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+
+ gGL.diffuseColor4fv(line_color.mV);
+ pushVerts(phys_volume);
+
+ gGL.diffuseColor4fv(color.mV);
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ pushVerts(phys_volume);
+ LLPrimitive::sVolumeManager->unrefVolume(phys_volume);
+ }
+ else if (type == LLPhysicsShapeBuilderUtil::PhysicsShapeSpecification::PRIM_CONVEX)
+ {
+ LLVolumeParams volume_params = volume->getVolume()->getParams();
+ S32 detail = get_physics_detail(volume_params, volume->getScale());
+
+ LLVolume* phys_volume = LLPrimitive::sVolumeManager->refVolume(volume_params, detail);
+
+ if (phys_volume->mHullPoints && phys_volume->mHullIndices)
+ {
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ llassert(!LLGLSLShader::sNoFixedFunction || LLGLSLShader::sCurBoundShader != 0);
+ LLVertexBuffer::unbind();
+ glVertexPointer(3, GL_FLOAT, 16, phys_volume->mHullPoints);
+ gGL.diffuseColor4fv(line_color.mV);
+ gGL.syncMatrices();
+ glDrawElements(GL_TRIANGLES, phys_volume->mNumHullIndices, GL_UNSIGNED_SHORT, phys_volume->mHullIndices);
+
+ gGL.diffuseColor4fv(color.mV);
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ glDrawElements(GL_TRIANGLES, phys_volume->mNumHullIndices, GL_UNSIGNED_SHORT, phys_volume->mHullIndices);
+ }
+ else
+ {
+ gGL.diffuseColor3f(1,0,1);
+ drawBoxOutline(center, size);
+ gMeshRepo.buildHull(volume_params, detail);
+ }
+ LLPrimitive::sVolumeManager->unrefVolume(phys_volume);
+ }
+ else if (type == LLPhysicsShapeBuilderUtil::PhysicsShapeSpecification::SCULPT)
+ {
+ //TODO: implement sculpted prim physics display
+ }
+ else
+ {
+ llerrs << "Unhandled type" << llendl;
+ }
+
+ gGL.popMatrix();
+}
+
+void renderPhysicsShapes(LLSpatialGroup* group)
+{
+ for (LLSpatialGroup::OctreeNode::const_element_iter i = group->getData().begin(); i != group->getData().end(); ++i)
+ {
+ LLDrawable* drawable = *i;
+ LLVOVolume* volume = drawable->getVOVolume();
+ if (volume && !volume->isAttachment() && volume->getPhysicsShapeType() != LLViewerObject::PHYSICS_SHAPE_NONE )
+ {
+ if (!group->mSpatialPartition->isBridge())
+ {
+ gGL.pushMatrix();
+ LLVector3 trans = drawable->getRegion()->getOriginAgent();
+ gGL.translatef(trans.mV[0], trans.mV[1], trans.mV[2]);
+ renderPhysicsShape(drawable, volume);
+ gGL.popMatrix();
+ }
+ else
+ {
+ renderPhysicsShape(drawable, volume);
+ }
+ }
+ else
+ {
+ LLViewerObject* object = drawable->getVObj();
+ if (object && object->getPCode() == LLViewerObject::LL_VO_SURFACE_PATCH)
+ {
+ //push face vertices for terrain
+ for (S32 i = 0; i < drawable->getNumFaces(); ++i)
+ {
+ LLFace* face = drawable->getFace(i);
+ LLVertexBuffer* buff = face->getVertexBuffer();
+ if (buff)
+ {
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+
+ buff->setBuffer(LLVertexBuffer::MAP_VERTEX);
+ gGL.diffuseColor3f(0.2f, 0.5f, 0.3f);
+ buff->draw(LLRender::TRIANGLES, buff->getNumIndices(), 0);
+
+ gGL.diffuseColor3f(0.2f, 1.f, 0.3f);
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ buff->draw(LLRender::TRIANGLES, buff->getNumIndices(), 0);
+ }
+ }
+ }
+ }
+ }
}
void renderTexturePriority(LLDrawable* drawable)
@@ -2702,15 +3546,20 @@ void renderTexturePriority(LLDrawable* drawable)
F32 t = vsize/sLastMaxTexPriority;
LLVector4 col = lerp(cold, hot, t);
- gGL.color4fv(col.mV);
+ gGL.diffuseColor4fv(col.mV);
}
//else
//{
- // gGL.color4f(1,0,1,1);
+ // gGL.diffuseColor4f(1,0,1,1);
//}
- LLVector3 center = (facep->mExtents[1]+facep->mExtents[0])*0.5f;
- LLVector3 size = (facep->mExtents[1]-facep->mExtents[0])*0.5f + LLVector3(0.01f, 0.01f, 0.01f);
+ LLVector4a center;
+ center.setAdd(facep->mExtents[1],facep->mExtents[0]);
+ center.mul(0.5f);
+ LLVector4a size;
+ size.setSub(facep->mExtents[1],facep->mExtents[0]);
+ size.mul(0.5f);
+ size.add(LLVector4a(0.01f));
drawBox(center, size);
/*S32 boost = imagep->getBoostLevel();
@@ -2720,7 +3569,7 @@ void renderTexturePriority(LLDrawable* drawable)
LLVector4 col = lerp(boost_cold, boost_hot, t);
LLGLEnable blend_on(GL_BLEND);
gGL.blendFunc(GL_SRC_ALPHA, GL_ONE);
- gGL.color4fv(col.mV);
+ gGL.diffuseColor4fv(col.mV);
drawBox(center, size);
gGL.blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}*/
@@ -2733,8 +3582,7 @@ void renderPoints(LLDrawable* drawablep)
if (drawablep->getNumFaces())
{
gGL.begin(LLRender::POINTS);
- gGL.color3f(1,1,1);
- LLVector3 center(drawablep->getPositionGroup());
+ gGL.diffuseColor3f(1,1,1);
for (S32 i = 0; i < drawablep->getNumFaces(); i++)
{
gGL.vertex3fv(drawablep->getFace(i)->mCenterLocal.mV);
@@ -2751,13 +3599,15 @@ void renderTextureAnim(LLDrawInfo* params)
}
LLGLEnable blend(GL_BLEND);
- glColor4f(1,1,0,0.5f);
+ gGL.diffuseColor4f(1,1,0,0.5f);
pushVerts(params, LLVertexBuffer::MAP_VERTEX);
}
void renderBatchSize(LLDrawInfo* params)
{
- glColor3ubv((GLubyte*) &(params->mDebugColor));
+ LLGLEnable offset(GL_POLYGON_OFFSET_FILL);
+ glPolygonOffset(-1.f, 1.f);
+ gGL.diffuseColor4ubv((GLubyte*) &(params->mDebugColor));
pushVerts(params, LLVertexBuffer::MAP_VERTEX);
}
@@ -2766,27 +3616,31 @@ void renderShadowFrusta(LLDrawInfo* params)
LLGLEnable blend(GL_BLEND);
gGL.setSceneBlendType(LLRender::BT_ADD);
- LLVector3 center = (params->mExtents[1]+params->mExtents[0])*0.5f;
- LLVector3 size = (params->mExtents[1]-params->mExtents[0])*0.5f;
+ LLVector4a center;
+ center.setAdd(params->mExtents[1], params->mExtents[0]);
+ center.mul(0.5f);
+ LLVector4a size;
+ size.setSub(params->mExtents[1],params->mExtents[0]);
+ size.mul(0.5f);
if (gPipeline.mShadowCamera[4].AABBInFrustum(center, size))
{
- glColor3f(1,0,0);
+ gGL.diffuseColor3f(1,0,0);
pushVerts(params, LLVertexBuffer::MAP_VERTEX);
}
if (gPipeline.mShadowCamera[5].AABBInFrustum(center, size))
{
- glColor3f(0,1,0);
+ gGL.diffuseColor3f(0,1,0);
pushVerts(params, LLVertexBuffer::MAP_VERTEX);
}
if (gPipeline.mShadowCamera[6].AABBInFrustum(center, size))
{
- glColor3f(0,0,1);
+ gGL.diffuseColor3f(0,0,1);
pushVerts(params, LLVertexBuffer::MAP_VERTEX);
}
if (gPipeline.mShadowCamera[7].AABBInFrustum(center, size))
{
- glColor3f(1,0,1);
+ gGL.diffuseColor3f(1,0,1);
pushVerts(params, LLVertexBuffer::MAP_VERTEX);
}
@@ -2804,85 +3658,237 @@ void renderLights(LLDrawable* drawablep)
if (drawablep->getNumFaces())
{
LLGLEnable blend(GL_BLEND);
- glColor4f(0,1,1,0.5f);
+ gGL.diffuseColor4f(0,1,1,0.5f);
for (S32 i = 0; i < drawablep->getNumFaces(); i++)
{
pushVerts(drawablep->getFace(i), LLVertexBuffer::MAP_VERTEX);
}
- const LLVector3* ext = drawablep->getSpatialExtents();
+ const LLVector4a* ext = drawablep->getSpatialExtents();
- LLVector3 pos = (ext[0] + ext[1]) * 0.5f;
- LLVector3 size = (ext[1] - ext[0]) * 0.5f;
+ LLVector4a pos;
+ pos.setAdd(ext[0], ext[1]);
+ pos.mul(0.5f);
+ LLVector4a size;
+ size.setSub(ext[1], ext[0]);
+ size.mul(0.5f);
{
LLGLDepthTest depth(GL_FALSE, GL_TRUE);
- gGL.color4f(1,1,1,1);
+ gGL.diffuseColor4f(1,1,1,1);
drawBoxOutline(pos, size);
}
- gGL.color4f(1,1,0,1);
+ gGL.diffuseColor4f(1,1,0,1);
F32 rad = drawablep->getVOVolume()->getLightRadius();
- drawBoxOutline(pos, LLVector3(rad,rad,rad));
+ drawBoxOutline(pos, LLVector4a(rad));
}
}
-
-void renderRaycast(LLDrawable* drawablep)
+class LLRenderOctreeRaycast : public LLOctreeTriangleRayIntersect
{
- if (drawablep->getVObj() != gDebugRaycastObject)
+public:
+
+
+ LLRenderOctreeRaycast(const LLVector4a& start, const LLVector4a& dir, F32* closest_t)
+ : LLOctreeTriangleRayIntersect(start, dir, NULL, closest_t, NULL, NULL, NULL, NULL)
{
- return;
+
}
-
- if (drawablep->getNumFaces())
+
+ void visit(const LLOctreeNode<LLVolumeTriangle>* branch)
{
- LLGLEnable blend(GL_BLEND);
- gGL.color4f(0,1,1,0.5f);
+ LLVolumeOctreeListener* vl = (LLVolumeOctreeListener*) branch->getListener(0);
- if (drawablep->getVOVolume() && gDebugRaycastFaceHit != -1)
+ LLVector3 center, size;
+
+ if (branch->getData().empty())
{
- glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
- pushVerts(drawablep->getFace(gDebugRaycastFaceHit), LLVertexBuffer::MAP_VERTEX);
- glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ gGL.diffuseColor3f(1.f,0.2f,0.f);
+ center.set(branch->getCenter().getF32ptr());
+ size.set(branch->getSize().getF32ptr());
}
- else if (drawablep->isAvatar())
+ else
{
- LLGLDepthTest depth(GL_FALSE);
- LLVOAvatar* av = (LLVOAvatar*) drawablep->getVObj().get();
- av->renderCollisionVolumes();
- }
-
- // draw intersection point
- glPushMatrix();
- glLoadMatrixd(gGLModelView);
- LLVector3 translate = gDebugRaycastIntersection;
- glTranslatef(translate.mV[0], translate.mV[1], translate.mV[2]);
- LLCoordFrame orient;
- orient.lookDir(gDebugRaycastNormal, gDebugRaycastBinormal);
- LLMatrix4 rotation;
- orient.getRotMatrixToParent(rotation);
- glMultMatrixf((float*)rotation.mMatrix);
+ gGL.diffuseColor3f(0.75f, 1.f, 0.f);
+ center.set(vl->mBounds[0].getF32ptr());
+ size.set(vl->mBounds[1].getF32ptr());
+ }
+
+ drawBoxOutline(center, size);
- gGL.color4f(1,0,0,0.5f);
- drawBox(LLVector3(0, 0, 0), LLVector3(0.1f, 0.022f, 0.022f));
- gGL.color4f(0,1,0,0.5f);
- drawBox(LLVector3(0, 0, 0), LLVector3(0.021f, 0.1f, 0.021f));
- gGL.color4f(0,0,1,0.5f);
- drawBox(LLVector3(0, 0, 0), LLVector3(0.02f, 0.02f, 0.1f));
- glPopMatrix();
+ for (U32 i = 0; i < 2; i++)
+ {
+ LLGLDepthTest depth(GL_TRUE, GL_FALSE, i == 1 ? GL_LEQUAL : GL_GREATER);
+
+ if (i == 1)
+ {
+ gGL.diffuseColor4f(0,1,1,0.5f);
+ }
+ else
+ {
+ gGL.diffuseColor4f(0,0.5f,0.5f, 0.25f);
+ drawBoxOutline(center, size);
+ }
+
+ if (i == 1)
+ {
+ gGL.flush();
+ glLineWidth(3.f);
+ }
+
+ gGL.begin(LLRender::TRIANGLES);
+ for (LLOctreeNode<LLVolumeTriangle>::const_element_iter iter = branch->getData().begin();
+ iter != branch->getData().end();
+ ++iter)
+ {
+ const LLVolumeTriangle* tri = *iter;
+
+ gGL.vertex3fv(tri->mV[0]->getF32ptr());
+ gGL.vertex3fv(tri->mV[1]->getF32ptr());
+ gGL.vertex3fv(tri->mV[2]->getF32ptr());
+ }
+ gGL.end();
+
+ if (i == 1)
+ {
+ gGL.flush();
+ glLineWidth(1.f);
+ }
+ }
+ }
+};
+
+void renderRaycast(LLDrawable* drawablep)
+{
+ if (drawablep->getNumFaces())
+ {
+ LLGLEnable blend(GL_BLEND);
+ gGL.diffuseColor4f(0,1,1,0.5f);
+
+ if (drawablep->getVOVolume())
+ {
+ //glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ //pushVerts(drawablep->getFace(gDebugRaycastFaceHit), LLVertexBuffer::MAP_VERTEX);
+ //glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+
+ LLVOVolume* vobj = drawablep->getVOVolume();
+ LLVolume* volume = vobj->getVolume();
+
+ bool transform = true;
+ if (drawablep->isState(LLDrawable::RIGGED))
+ {
+ volume = vobj->getRiggedVolume();
+ transform = false;
+ }
+
+ if (volume)
+ {
+ LLVector3 trans = drawablep->getRegion()->getOriginAgent();
+
+ for (S32 i = 0; i < volume->getNumVolumeFaces(); ++i)
+ {
+ const LLVolumeFace& face = volume->getVolumeFace(i);
+
+ gGL.pushMatrix();
+ gGL.translatef(trans.mV[0], trans.mV[1], trans.mV[2]);
+ gGL.multMatrix((F32*) vobj->getRelativeXform().mMatrix);
+
+ LLVector3 start, end;
+ if (transform)
+ {
+ start = vobj->agentPositionToVolume(gDebugRaycastStart);
+ end = vobj->agentPositionToVolume(gDebugRaycastEnd);
+ }
+ else
+ {
+ start = gDebugRaycastStart;
+ end = gDebugRaycastEnd;
+ }
- // draw bounding box of prim
- const LLVector3* ext = drawablep->getSpatialExtents();
+ LLVector4a starta, enda;
+ starta.load3(start.mV);
+ enda.load3(end.mV);
+ LLVector4a dir;
+ dir.setSub(enda, starta);
+
+ gGL.flush();
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+
+ {
+ //render face positions
+ LLVertexBuffer::unbind();
+ gGL.diffuseColor4f(0,1,1,0.5f);
+ glVertexPointer(3, GL_FLOAT, sizeof(LLVector4a), face.mPositions);
+ gGL.syncMatrices();
+ glDrawElements(GL_TRIANGLES, face.mNumIndices, GL_UNSIGNED_SHORT, face.mIndices);
+ }
+
+ if (!volume->isUnique())
+ {
+ F32 t = 1.f;
- LLVector3 pos = (ext[0] + ext[1]) * 0.5f;
- LLVector3 size = (ext[1] - ext[0]) * 0.5f;
+ if (!face.mOctree)
+ {
+ ((LLVolumeFace*) &face)->createOctree();
+ }
- LLGLDepthTest depth(GL_FALSE, GL_TRUE);
- gGL.color4f(0,0.5f,0.5f,1);
- drawBoxOutline(pos, size);
+ LLRenderOctreeRaycast render(starta, dir, &t);
+
+ render.traverse(face.mOctree);
+ }
+ gGL.popMatrix();
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ }
+ }
+ }
+ else if (drawablep->isAvatar())
+ {
+ if (drawablep->getVObj() == gDebugRaycastObject)
+ {
+ LLGLDepthTest depth(GL_FALSE);
+ LLVOAvatar* av = (LLVOAvatar*) drawablep->getVObj().get();
+ av->renderCollisionVolumes();
+ }
+ }
+
+ if (drawablep->getVObj() == gDebugRaycastObject)
+ {
+ // draw intersection point
+ gGL.pushMatrix();
+ gGL.loadMatrix(gGLModelView);
+ LLVector3 translate = gDebugRaycastIntersection;
+ gGL.translatef(translate.mV[0], translate.mV[1], translate.mV[2]);
+ LLCoordFrame orient;
+ orient.lookDir(gDebugRaycastNormal, gDebugRaycastBinormal);
+ LLMatrix4 rotation;
+ orient.getRotMatrixToParent(rotation);
+ gGL.multMatrix((float*)rotation.mMatrix);
+
+ gGL.diffuseColor4f(1,0,0,0.5f);
+ drawBox(LLVector3(0, 0, 0), LLVector3(0.1f, 0.022f, 0.022f));
+ gGL.diffuseColor4f(0,1,0,0.5f);
+ drawBox(LLVector3(0, 0, 0), LLVector3(0.021f, 0.1f, 0.021f));
+ gGL.diffuseColor4f(0,0,1,0.5f);
+ drawBox(LLVector3(0, 0, 0), LLVector3(0.02f, 0.02f, 0.1f));
+ gGL.popMatrix();
+
+ // draw bounding box of prim
+ const LLVector4a* ext = drawablep->getSpatialExtents();
+
+ LLVector4a pos;
+ pos.setAdd(ext[0], ext[1]);
+ pos.mul(0.5f);
+ LLVector4a size;
+ size.setSub(ext[1], ext[0]);
+ size.mul(0.5f);
+
+ LLGLDepthTest depth(GL_FALSE, GL_TRUE);
+ gGL.diffuseColor4f(0,0.5f,0.5f,1);
+ drawBoxOutline(pos, size);
+ }
}
}
@@ -2904,7 +3910,6 @@ void renderAgentTarget(LLVOAvatar* avatar)
}
}
-
class LLOctreeRenderNonOccluded : public LLOctreeTraveler<LLDrawable>
{
public:
@@ -2943,14 +3948,14 @@ public:
group->rebuildMesh();
gGL.flush();
- glPushMatrix();
+ gGL.pushMatrix();
gGLLastMatrix = NULL;
- glLoadMatrixd(gGLModelView);
+ gGL.loadMatrix(gGLModelView);
renderVisibility(group, mCamera);
stop_glerror();
gGLLastMatrix = NULL;
- glPopMatrix();
- gGL.color4f(1,1,1,1);
+ gGL.popMatrix();
+ gGL.diffuseColor4f(1,1,1,1);
}
}
}
@@ -2964,8 +3969,8 @@ public:
return;
}
- LLVector3 nodeCenter = group->mBounds[0];
- LLVector3 octCenter = LLVector3(group->mOctreeNode->getCenter());
+ LLVector4a nodeCenter = group->mBounds[0];
+ LLVector4a octCenter = group->mOctreeNode->getCenter();
group->rebuildGeom();
group->rebuildMesh();
@@ -2974,7 +3979,7 @@ public:
{
if (!group->getData().empty())
{
- gGL.color3f(0,0,1);
+ gGL.diffuseColor3f(0,0,1);
drawBoxOutline(group->mObjectBounds[0],
group->mObjectBounds[1]);
}
@@ -2983,19 +3988,30 @@ public:
for (LLSpatialGroup::OctreeNode::const_element_iter i = branch->getData().begin(); i != branch->getData().end(); ++i)
{
LLDrawable* drawable = *i;
-
+
if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_BBOXES))
{
renderBoundingBox(drawable);
}
+
+ if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_NORMALS))
+ {
+ renderNormals(drawable);
+ }
if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_BUILD_QUEUE))
{
if (drawable->isState(LLDrawable::IN_REBUILD_Q2))
{
- gGL.color4f(0.6f, 0.6f, 0.1f, 1.f);
- const LLVector3* ext = drawable->getSpatialExtents();
- drawBoxOutline((ext[0]+ext[1])*0.5f, (ext[1]-ext[0])*0.5f);
+ gGL.diffuseColor4f(0.6f, 0.6f, 0.1f, 1.f);
+ const LLVector4a* ext = drawable->getSpatialExtents();
+ LLVector4a center;
+ center.setAdd(ext[0], ext[1]);
+ center.mul(0.5f);
+ LLVector4a size;
+ size.setSub(ext[1], ext[0]);
+ size.mul(0.5f);
+ drawBoxOutline(center, size);
}
}
@@ -3018,6 +4034,14 @@ public:
{
renderRaycast(drawable);
}
+ if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_UPDATE_TYPE))
+ {
+ renderUpdateType(drawable);
+ }
+ if(gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_RENDER_COMPLEXITY))
+ {
+ renderComplexityDisplay(drawable);
+ }
LLVOAvatar* avatar = dynamic_cast<LLVOAvatar*>(drawable->getVObj().get());
@@ -3031,6 +4055,28 @@ public:
renderAgentTarget(avatar);
}
+ if (gDebugGL)
+ {
+ for (U32 i = 0; i < drawable->getNumFaces(); ++i)
+ {
+ LLFace* facep = drawable->getFace(i);
+ U8 index = facep->getTextureIndex();
+ if (facep->mDrawInfo)
+ {
+ if (index < 255)
+ {
+ if (facep->mDrawInfo->mTextureList.size() <= index)
+ {
+ llerrs << "Face texture index out of bounds." << llendl;
+ }
+ else if (facep->mDrawInfo->mTextureList[index] != facep->getTexture())
+ {
+ llerrs << "Face texture index incorrect." << llendl;
+ }
+ }
+ }
+ }
+ }
}
for (LLSpatialGroup::draw_map_t::iterator i = group->mDrawMap.begin(); i != group->mDrawMap.end(); ++i)
@@ -3056,6 +4102,41 @@ public:
}
};
+
+class LLOctreeRenderPhysicsShapes : public LLOctreeTraveler<LLDrawable>
+{
+public:
+ LLCamera* mCamera;
+ LLOctreeRenderPhysicsShapes(LLCamera* camera): mCamera(camera) {}
+
+ virtual void traverse(const LLSpatialGroup::OctreeNode* node)
+ {
+ LLSpatialGroup* group = (LLSpatialGroup*) node->getListener(0);
+
+ if (!mCamera || mCamera->AABBInFrustumNoFarClip(group->mBounds[0], group->mBounds[1]))
+ {
+ node->accept(this);
+ stop_glerror();
+
+ for (U32 i = 0; i < node->getChildCount(); i++)
+ {
+ traverse(node->getChild(i));
+ stop_glerror();
+ }
+
+ group->rebuildGeom();
+ group->rebuildMesh();
+
+ renderPhysicsShapes(group);
+ }
+ }
+
+ virtual void visit(const LLSpatialGroup::OctreeNode* branch)
+ {
+
+ }
+};
+
class LLOctreePushBBoxVerts : public LLOctreeTraveler<LLDrawable>
{
public:
@@ -3174,25 +4255,52 @@ public:
};
+void LLSpatialPartition::renderPhysicsShapes()
+{
+ LLSpatialBridge* bridge = asBridge();
+ LLCamera* camera = LLViewerCamera::getInstance();
+
+ if (bridge)
+ {
+ camera = NULL;
+ }
+
+ gGL.flush();
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+ glLineWidth(3.f);
+ LLOctreeRenderPhysicsShapes render_physics(camera);
+ render_physics.traverse(mOctree);
+ gGL.flush();
+ glLineWidth(1.f);
+}
+
void LLSpatialPartition::renderDebug()
{
if (!gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_OCTREE |
LLPipeline::RENDER_DEBUG_OCCLUSION |
LLPipeline::RENDER_DEBUG_LIGHTS |
LLPipeline::RENDER_DEBUG_BATCH_SIZE |
+ LLPipeline::RENDER_DEBUG_UPDATE_TYPE |
LLPipeline::RENDER_DEBUG_BBOXES |
+ LLPipeline::RENDER_DEBUG_NORMALS |
LLPipeline::RENDER_DEBUG_POINTS |
LLPipeline::RENDER_DEBUG_TEXTURE_PRIORITY |
LLPipeline::RENDER_DEBUG_TEXTURE_ANIM |
LLPipeline::RENDER_DEBUG_RAYCAST |
LLPipeline::RENDER_DEBUG_AVATAR_VOLUME |
LLPipeline::RENDER_DEBUG_AGENT_TARGET |
- LLPipeline::RENDER_DEBUG_BUILD_QUEUE |
- LLPipeline::RENDER_DEBUG_SHADOW_FRUSTA))
+ //LLPipeline::RENDER_DEBUG_BUILD_QUEUE |
+ LLPipeline::RENDER_DEBUG_SHADOW_FRUSTA |
+ LLPipeline::RENDER_DEBUG_RENDER_COMPLEXITY))
{
return;
}
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gDebugProgram.bind();
+ }
+
if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_TEXTURE_PRIORITY))
{
//sLastMaxTexPriority = lerp(sLastMaxTexPriority, sCurMaxTexPriority, gFrameIntervalSeconds);
@@ -3221,14 +4329,27 @@ void LLSpatialPartition::renderDebug()
LLOctreeRenderNonOccluded render_debug(camera);
render_debug.traverse(mOctree);
+
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gDebugProgram.unbind();
+ }
}
void LLSpatialGroup::drawObjectBox(LLColor4 col)
{
- gGL.color4fv(col.mV);
- drawBox(mObjectBounds[0], mObjectBounds[1]*1.01f+LLVector3(0.001f, 0.001f, 0.001f));
+ gGL.diffuseColor4fv(col.mV);
+ LLVector4a size;
+ size = mObjectBounds[1];
+ size.mul(1.01f);
+ size.add(LLVector4a(0.001f));
+ drawBox(mObjectBounds[0], size);
}
+bool LLSpatialPartition::isHUDPartition()
+{
+ return mPartitionType == LLViewerRegion::PARTITION_HUD ;
+}
BOOL LLSpatialPartition::isVisible(const LLVector3& v)
{
@@ -3286,8 +4407,8 @@ public:
LLSpatialGroup* group = (LLSpatialGroup*) child->getListener(0);
- LLVector3 size;
- LLVector3 center;
+ LLVector4a size;
+ LLVector4a center;
size = group->mBounds[1];
center = group->mBounds[0];
@@ -3304,7 +4425,11 @@ public:
local_end = mEnd * local_matrix;
}
- if (LLLineSegmentBoxIntersect(local_start, local_end, center, size))
+ LLVector4a start, end;
+ start.load3(local_start.mV);
+ end.load3(local_end.mV);
+
+ if (LLLineSegmentBoxIntersect(start, end, center, size))
{
check(child);
}
@@ -3318,7 +4443,7 @@ public:
LLVector3 local_start = mStart;
LLVector3 local_end = mEnd;
- if (!gPipeline.hasRenderType(drawable->getRenderType()) || !drawable->isVisible())
+ if (!drawable || !gPipeline.hasRenderType(drawable->getRenderType()) || !drawable->isVisible())
{
return false;
}
@@ -3339,7 +4464,29 @@ public:
if (vobj)
{
LLVector3 intersection;
- if (vobj->lineSegmentIntersect(mStart, mEnd, -1, mPickTransparent, mFaceHit, &intersection, mTexCoord, mNormal, mBinormal))
+ bool skip_check = false;
+ if (vobj->isAvatar())
+ {
+ LLVOAvatar* avatar = (LLVOAvatar*) vobj;
+ if (avatar->isSelf() && LLFloater::isVisible(gFloaterTools))
+ {
+ LLViewerObject* hit = avatar->lineSegmentIntersectRiggedAttachments(mStart, mEnd, -1, mPickTransparent, mFaceHit, &intersection, mTexCoord, mNormal, mBinormal);
+ if (hit)
+ {
+ mEnd = intersection;
+ if (mIntersection)
+ {
+ *mIntersection = intersection;
+ }
+
+ mHit = hit->mDrawable;
+ skip_check = true;
+ }
+
+ }
+ }
+
+ if (!skip_check && vobj->lineSegmentIntersect(mStart, mEnd, -1, mPickTransparent, mFaceHit, &intersection, mTexCoord, mNormal, mBinormal))
{
mEnd = intersection; // shorten ray so we only find CLOSER hits
if (mIntersection)
@@ -3394,18 +4541,9 @@ LLDrawInfo::LLDrawInfo(U16 start, U16 end, U32 count, U32 offset,
mDistance(0.f),
mDrawMode(LLRender::TRIANGLES)
{
+ mVertexBuffer->validateRange(mStart, mEnd, mCount, mOffset);
+
mDebugColor = (rand() << 16) + rand();
- if (mStart >= mVertexBuffer->getRequestedVerts() ||
- mEnd >= mVertexBuffer->getRequestedVerts())
- {
- llerrs << "Invalid draw info vertex range." << llendl;
- }
-
- if (mOffset >= (U32) mVertexBuffer->getRequestedIndices() ||
- mOffset + mCount > (U32) mVertexBuffer->getRequestedIndices())
- {
- llerrs << "Invalid draw info index range." << llendl;
- }
}
LLDrawInfo::~LLDrawInfo()
@@ -3419,6 +4557,16 @@ LLDrawInfo::~LLDrawInfo()
{
mFace->setDrawInfo(NULL);
}
+
+ if (gDebugGL)
+ {
+ gPipeline.checkReferences(this);
+ }
+}
+
+void LLDrawInfo::validate()
+{
+ mVertexBuffer->validateRange(mStart, mEnd, mCount, mOffset);
}
LLVertexBuffer* LLGeometryManager::createVertexBuffer(U32 type_mask, U32 usage)
diff --git a/indra/newview/llspatialpartition.h b/indra/newview/llspatialpartition.h
index 2b9cf6c630..6c14ecf452 100644
--- a/indra/newview/llspatialpartition.h
+++ b/indra/newview/llspatialpartition.h
@@ -39,7 +39,7 @@
#include "lldrawpool.h"
#include "llface.h"
#include "llviewercamera.h"
-
+#include "llvector4a.h"
#include <queue>
#define SG_STATE_INHERIT_MASK (OCCLUDED)
@@ -51,11 +51,16 @@ class LLSpatialGroup;
class LLTextureAtlas;
class LLTextureAtlasSlot;
+S32 AABBSphereIntersect(const LLVector4a& min, const LLVector4a& max, const LLVector3 &origin, const F32 &rad);
+S32 AABBSphereIntersectR2(const LLVector4a& min, const LLVector4a& max, const LLVector3 &origin, const F32 &radius_squared);
+
S32 AABBSphereIntersect(const LLVector3& min, const LLVector3& max, const LLVector3 &origin, const F32 &rad);
S32 AABBSphereIntersectR2(const LLVector3& min, const LLVector3& max, const LLVector3 &origin, const F32 &radius_squared);
+void pushVerts(LLFace* face, U32 mask);
// get index buffer for binary encoded axis vertex buffer given a box at center being viewed by given camera
-U8* get_box_fan_indices(LLCamera* camera, const LLVector3& center);
+U32 get_box_fan_indices(LLCamera* camera, const LLVector4a& center);
+U8* get_box_fan_indices_ptr(LLCamera* camera, const LLVector4a& center);
class LLDrawInfo : public LLRefCount
{
@@ -63,14 +68,31 @@ protected:
~LLDrawInfo();
public:
+
+ LLDrawInfo(const LLDrawInfo& rhs)
+ {
+ *this = rhs;
+ }
+
+ const LLDrawInfo& operator=(const LLDrawInfo& rhs)
+ {
+ llerrs << "Illegal operation!" << llendl;
+ return *this;
+ }
+
LLDrawInfo(U16 start, U16 end, U32 count, U32 offset,
LLViewerTexture* image, LLVertexBuffer* buffer,
BOOL fullbright = FALSE, U8 bump = 0, BOOL particle = FALSE, F32 part_size = 0);
+ void validate();
+
+ LLVector4a mExtents[2];
+
LLPointer<LLVertexBuffer> mVertexBuffer;
LLPointer<LLViewerTexture> mTexture;
- LLColor4U mGlowColor;
+ std::vector<LLPointer<LLViewerTexture> > mTextureList;
+
S32 mDebugColor;
const LLMatrix4* mTextureMatrix;
const LLMatrix4* mModelMatrix;
@@ -86,7 +108,6 @@ public:
LLSpatialGroup* mGroup;
LLFace* mFace; //associated face
F32 mDistance;
- LLVector3 mExtents[2];
U32 mDrawMode;
struct CompareTexture
@@ -128,6 +149,17 @@ public:
};
+ struct CompareMatrixTexturePtr
+ {
+ bool operator()(const LLPointer<LLDrawInfo>& lhs, const LLPointer<LLDrawInfo>& rhs)
+ {
+ return lhs.get() != rhs.get()
+ && (lhs.isNull() || (rhs.notNull() && (lhs->mModelMatrix > rhs->mModelMatrix ||
+ (lhs->mModelMatrix == rhs->mModelMatrix && lhs->mTexture.get() > rhs->mTexture.get()))));
+ }
+
+ };
+
struct CompareBump
{
bool operator()(const LLPointer<LLDrawInfo>& lhs, const LLPointer<LLDrawInfo>& rhs)
@@ -149,11 +181,25 @@ public:
};
};
+LL_ALIGN_PREFIX(64)
class LLSpatialGroup : public LLOctreeListener<LLDrawable>
{
friend class LLSpatialPartition;
friend class LLOctreeStateCheck;
public:
+
+ LLSpatialGroup(const LLSpatialGroup& rhs)
+ {
+ *this = rhs;
+ }
+
+ const LLSpatialGroup& operator=(const LLSpatialGroup& rhs)
+ {
+ llerrs << "Illegal operation!" << llendl;
+ return *this;
+ }
+
+ static std::set<GLuint> sPendingQueries; //pending occlusion queries
static U32 sNodeCount;
static BOOL sNoDelete; //deletion of spatial groups and draw info not allowed if TRUE
@@ -162,7 +208,7 @@ public:
typedef std::vector<LLPointer<LLDrawInfo> > drawmap_elem_t;
typedef std::map<U32, drawmap_elem_t > draw_map_t;
typedef std::vector<LLPointer<LLVertexBuffer> > buffer_list_t;
- typedef std::map<LLPointer<LLViewerTexture>, buffer_list_t> buffer_texture_map_t;
+ typedef std::map<LLFace*, buffer_list_t> buffer_texture_map_t;
typedef std::map<U32, buffer_texture_map_t> buffer_map_t;
typedef LLOctreeListener<LLDrawable> BaseType;
@@ -235,6 +281,7 @@ public:
LLSpatialGroup(OctreeNode* node, LLSpatialPartition* part);
+ BOOL isHUDGroup() ;
BOOL isDead() { return isState(DEAD); }
BOOL isState(U32 state) const;
BOOL isOcclusionState(U32 state) const { return mOcclusionState[LLViewerCamera::sCurCameraID] & state ? TRUE : FALSE; }
@@ -262,8 +309,8 @@ public:
BOOL isVisible() const;
BOOL isRecentlyVisible() const;
void setVisible();
- void shift(const LLVector3 &offset);
- BOOL boundObjects(BOOL empty, LLVector3& newMin, LLVector3& newMax);
+ void shift(const LLVector4a &offset);
+ BOOL boundObjects(BOOL empty, LLVector4a& newMin, LLVector4a& newMax);
void unbound();
BOOL rebound();
void buildOcclusion(); //rebuild mOcclusionVerts
@@ -311,6 +358,27 @@ public:
void addAtlas(LLTextureAtlas* atlasp, S8 recursive_level = 3) ;
void removeAtlas(LLTextureAtlas* atlasp, BOOL remove_group = TRUE, S8 recursive_level = 3) ;
void clearAtlasList() ;
+
+public:
+
+ typedef enum
+ {
+ BOUNDS = 0,
+ EXTENTS = 2,
+ OBJECT_BOUNDS = 4,
+ OBJECT_EXTENTS = 6,
+ VIEW_ANGLE = 8,
+ LAST_VIEW_ANGLE = 9,
+ V4_COUNT = 10
+ } eV4Index;
+
+ LLVector4a mBounds[2]; // bounding box (center, size) of this node and all its children (tight fit to objects)
+ LLVector4a mExtents[2]; // extents (min, max) of this node and all its children
+ LLVector4a mObjectExtents[2]; // extents (min, max) of objects in this node
+ LLVector4a mObjectBounds[2]; // bounding box (center, size) of objects in this node
+ LLVector4a mViewAngle;
+ LLVector4a mLastUpdateViewAngle;
+
private:
U32 mCurUpdatingTime ;
//do not make the below two to use LLPointer
@@ -328,24 +396,24 @@ protected:
U32 mState;
U32 mOcclusionState[LLViewerCamera::NUM_CAMERAS];
+ U32 mOcclusionIssued[LLViewerCamera::NUM_CAMERAS];
+
S32 mLODHash;
static S32 sLODSeed;
public:
bridge_list_t mBridgeList;
- buffer_map_t mBufferMap; //used by volume buffers to store unique buffers per texture
+ buffer_map_t mBufferMap; //used by volume buffers to attempt to reuse vertex buffers
+
+ U32 mGeometryBytes; //used by volumes to track how many bytes of geometry data are in this node
+ F32 mSurfaceArea; //used by volumes to track estimated surface area of geometry in this node
F32 mBuilt;
OctreeNode* mOctreeNode;
LLSpatialPartition* mSpatialPartition;
- LLVector3 mBounds[2]; // bounding box (center, size) of this node and all its children (tight fit to objects)
- LLVector3 mExtents[2]; // extents (min, max) of this node and all its children
- LLVector3 mObjectExtents[2]; // extents (min, max) of objects in this node
- LLVector3 mObjectBounds[2]; // bounding box (center, size) of objects in this node
-
LLPointer<LLVertexBuffer> mVertexBuffer;
- F32* mOcclusionVerts;
+ LLPointer<LLVertexBuffer> mOcclusionVerts;
GLuint mOcclusionQuery[LLViewerCamera::NUM_CAMERAS];
U32 mBufferUsage;
@@ -356,13 +424,10 @@ public:
F32 mDepth;
F32 mLastUpdateDistance;
F32 mLastUpdateTime;
-
- LLVector3 mViewAngle;
- LLVector3 mLastUpdateViewAngle;
F32 mPixelArea;
F32 mRadius;
-};
+} LL_ALIGN_POSTFIX(64);
class LLGeometryManager
{
@@ -398,7 +463,7 @@ public:
// If the drawable moves, move it here.
virtual void move(LLDrawable *drawablep, LLSpatialGroup *curp, BOOL immediate = FALSE);
- virtual void shift(const LLVector3 &offset);
+ virtual void shift(const LLVector4a &offset);
virtual F32 calcDistance(LLSpatialGroup* group, LLCamera& camera);
virtual F32 calcPixelArea(LLSpatialGroup* group, LLCamera& camera);
@@ -410,10 +475,12 @@ public:
S32 cull(LLCamera &camera, std::vector<LLDrawable *>* results = NULL, BOOL for_select = FALSE); // Cull on arbitrary frustum
BOOL isVisible(const LLVector3& v);
+ bool isHUDPartition() ;
- virtual LLSpatialBridge* asBridge() { return NULL; }
- virtual BOOL isBridge() { return asBridge() != NULL; }
+ LLSpatialBridge* asBridge() { return mBridge; }
+ BOOL isBridge() { return asBridge() != NULL; }
+ void renderPhysicsShapes();
void renderDebug();
void renderIntersectingBBoxes(LLCamera* camera);
void restoreGL();
@@ -423,6 +490,9 @@ public:
public:
LLSpatialGroup::OctreeNode* mOctree;
+ LLSpatialBridge* mBridge; // NULL for non-LLSpatialBridge instances, otherwise, mBridge == this
+ // use a pointer instead of making "isBridge" and "asBridge" virtual so it's safe
+ // to call asBridge() from the destructor
BOOL mOcclusionEnabled; // if TRUE, occlusion culling is performed
BOOL mInfiniteFarClip; // if TRUE, frustum culling ignores far clip plane
U32 mBufferUsage;
@@ -447,8 +517,9 @@ public:
LLSpatialBridge(LLDrawable* root, BOOL render_by_group, U32 data_mask);
- virtual BOOL isSpatialBridge() const { return TRUE; }
+ void destroyTree();
+ virtual BOOL isSpatialBridge() const { return TRUE; }
virtual void updateSpatialExtents();
virtual void updateBinRadius();
virtual void setVisible(LLCamera& camera_in, std::vector<LLDrawable*>* results = NULL, BOOL for_select = FALSE);
@@ -456,14 +527,15 @@ public:
virtual void makeActive();
virtual void move(LLDrawable *drawablep, LLSpatialGroup *curp, BOOL immediate = FALSE);
virtual BOOL updateMove();
- virtual void shiftPos(const LLVector3& vec);
+ virtual void shiftPos(const LLVector4a& vec);
virtual void cleanupReferences();
virtual LLSpatialPartition* asPartition() { return this; }
- virtual LLSpatialBridge* asBridge() { return this; }
-
+
virtual LLCamera transformCamera(LLCamera& camera);
LLDrawable* mDrawable;
+ LLPointer<LLVOAvatar> mAvatar;
+
};
class LLCullResult
@@ -484,6 +556,7 @@ public:
sg_list_t::iterator beginAlphaGroups();
sg_list_t::iterator endAlphaGroups();
+ bool hasOcclusionGroups() { return mOcclusionGroupsSize > 0; }
sg_list_t::iterator beginOcclusionGroups();
sg_list_t::iterator endOcclusionGroups();
@@ -602,22 +675,22 @@ public:
LLGrassPartition();
};
-//spatial partition for clouds (implemented in LLVOClouds.cpp)
-class LLCloudPartition : public LLParticlePartition
-{
-public:
- LLCloudPartition();
-};
-
//class for wrangling geometry out of volumes (implemented in LLVOVolume.cpp)
class LLVolumeGeometryManager: public LLGeometryManager
{
public:
+ typedef enum
+ {
+ NONE = 0,
+ BATCH_SORT,
+ DISTANCE_SORT
+ } eSortType;
+
virtual ~LLVolumeGeometryManager() { }
virtual void rebuildGeom(LLSpatialGroup* group);
virtual void rebuildMesh(LLSpatialGroup* group);
virtual void getGeometry(LLSpatialGroup* group);
- void genDrawInfo(LLSpatialGroup* group, U32 mask, std::vector<LLFace*>& faces, BOOL distance_sort = FALSE);
+ void genDrawInfo(LLSpatialGroup* group, U32 mask, std::vector<LLFace*>& faces, BOOL distance_sort = FALSE, BOOL batch_textures = FALSE);
void registerFace(LLSpatialGroup* group, LLFace* facep, U32 type);
};
@@ -647,7 +720,7 @@ class LLHUDBridge : public LLVolumeBridge
{
public:
LLHUDBridge(LLDrawable* drawablep);
- virtual void shiftPos(const LLVector3& vec);
+ virtual void shiftPos(const LLVector4a& vec);
virtual F32 calcPixelArea(LLSpatialGroup* group, LLCamera& camera);
};
@@ -664,11 +737,9 @@ class LLHUDPartition : public LLBridgePartition
{
public:
LLHUDPartition();
- virtual void shift(const LLVector3 &offset);
+ virtual void shift(const LLVector4a &offset);
};
-void validate_draw_info(LLDrawInfo& params);
-
extern const F32 SG_BOX_SIDE;
extern const F32 SG_BOX_OFFSET;
extern const F32 SG_BOX_RAD;
diff --git a/indra/newview/llspeakbutton.cpp b/indra/newview/llspeakbutton.cpp
deleted file mode 100644
index c76ecae4a2..0000000000
--- a/indra/newview/llspeakbutton.cpp
+++ /dev/null
@@ -1,185 +0,0 @@
-/**
-* @file llspeakbutton.cpp
-* @brief LLSpeakButton class implementation
-*
-* $LicenseInfo:firstyear=2002&license=viewerlgpl$
-* Second Life Viewer Source Code
-* Copyright (C) 2010, Linden Research, Inc.
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU Lesser General Public
-* License as published by the Free Software Foundation;
-* version 2.1 of the License only.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-* Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public
-* License along with this library; if not, write to the Free Software
-* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-*
-* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
-* $/LicenseInfo$
-*/
-
-#include "llviewerprecompiledheaders.h" // must be first include
-
-#include "llbutton.h"
-#include "llfloaterreg.h"
-
-#include "llagent.h"
-#include "llbottomtray.h"
-#include "llcallfloater.h"
-#include "lloutputmonitorctrl.h"
-#include "lltransientfloatermgr.h"
-
-#include "llspeakbutton.h"
-
-#include "llbottomtray.h"
-
-static LLDefaultChildRegistry::Register<LLSpeakButton> t1("talk_button");
-
-//////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////
-
-LLSpeakButton::Params::Params()
- : speak_button("speak_button")
- , show_button("show_button")
- , monitor("monitor")
-{
- // See widgets/talk_button.xml
-}
-
-void LLSpeakButton::draw()
-{
- // LLVoiceClient::getInstance() is the authoritative global source of info regarding our open-mic state, we merely reflect that state.
- bool openmic = LLVoiceClient::getInstance()->getUserPTTState();
- bool voiceenabled = LLVoiceClient::getInstance()->voiceEnabled();
- mSpeakBtn->setToggleState(openmic && voiceenabled);
- mOutputMonitor->setIsMuted(!voiceenabled);
- LLUICtrl::draw();
-}
-void LLSpeakButton::setSpeakBtnEnabled(bool enabled)
-{
- LLButton* speak_btn = getChild<LLButton>("speak_btn");
- speak_btn->setEnabled(enabled);
-}
-void LLSpeakButton::setFlyoutBtnEnabled(bool enabled)
-{
- LLButton* show_btn = getChild<LLBottomtrayButton>("speak_flyout_btn");
- show_btn->setEnabled(enabled);
-}
-
-LLSpeakButton::LLSpeakButton(const Params& p)
-: LLUICtrl(p)
-, mOutputMonitor(NULL)
-, mSpeakBtn(NULL)
-, mShowBtn(NULL)
-{
- LLRect rect = p.rect();
- LLRect speak_rect(0, rect.getHeight(), rect.getWidth(), 0);
- LLRect show_rect = p.show_button.rect();
- show_rect.set(0, rect.getHeight(), show_rect.getWidth(), 0);
-
- speak_rect.mRight -= show_rect.getWidth();
- show_rect.mLeft = speak_rect.getWidth();
- show_rect.mRight = rect.getWidth();
-
- LLButton::Params speak_params = p.speak_button;
- speak_params.rect(speak_rect);
- mSpeakBtn = LLUICtrlFactory::create<LLButton>(speak_params);
- addChild(mSpeakBtn);
- LLTransientFloaterMgr::getInstance()->addControlView(mSpeakBtn);
-
- mSpeakBtn->setMouseDownCallback(boost::bind(&LLSpeakButton::onMouseDown_SpeakBtn, this));
- mSpeakBtn->setMouseUpCallback(boost::bind(&LLSpeakButton::onMouseUp_SpeakBtn, this));
- mSpeakBtn->setToggleState(FALSE);
-
- LLBottomtrayButton::Params show_params = p.show_button;
- show_params.rect(show_rect);
- mShowBtn = LLUICtrlFactory::create<LLBottomtrayButton>(show_params);
- addChild(mShowBtn);
- LLTransientFloaterMgr::getInstance()->addControlView(mShowBtn);
-
-// mShowBtn->setClickedCallback(boost::bind(&LLSpeakButton::onClick_ShowBtn, this));
-// mShowBtn->setToggleState(FALSE);
-
- static const S32 MONITOR_RIGHT_PAD = 2;
-
- LLRect monitor_rect = p.monitor.rect();
- S32 monitor_height = monitor_rect.getHeight();
- monitor_rect.mLeft = speak_rect.getWidth() - monitor_rect.getWidth() - MONITOR_RIGHT_PAD;
- monitor_rect.mRight = speak_rect.getWidth() - MONITOR_RIGHT_PAD;
- monitor_rect.mBottom = (rect.getHeight() / 2) - (monitor_height / 2);
- monitor_rect.mTop = monitor_rect.mBottom + monitor_height;
-
- LLOutputMonitorCtrl::Params monitor_params = p.monitor;
- monitor_params.draw_border(false);
- monitor_params.rect(monitor_rect);
- monitor_params.auto_update(true);
- monitor_params.speaker_id(gAgentID);
- mOutputMonitor = LLUICtrlFactory::create<LLOutputMonitorCtrl>(monitor_params);
- mSpeakBtn->addChild(mOutputMonitor);
-
- // never show "muted" because you can't mute yourself
- mOutputMonitor->setIsMuted(false);
- mOutputMonitor->setIsAgentControl(true);
-
- //*TODO find a better place to do that
- LLVoiceChannel::setCurrentVoiceChannelChangedCallback(boost::bind(&LLCallFloater::sOnCurrentChannelChanged, _1), true);
-}
-
-LLSpeakButton::~LLSpeakButton()
-{
- if(LLTransientFloaterMgr::instanceExists())
- {
- LLTransientFloaterMgr::getInstance()->removeControlView(mSpeakBtn);
- LLTransientFloaterMgr::getInstance()->removeControlView(mShowBtn);
- }
-}
-
-void LLSpeakButton::setSpeakToolTip(const std::string& msg)
-{
- mSpeakBtn->setToolTip(msg);
-}
-
-void LLSpeakButton::setShowToolTip(const std::string& msg)
-{
- mShowBtn->setToolTip(msg);
-}
-
-void LLSpeakButton::setLabelVisible(bool visible)
-{
- static std::string label_selected = mSpeakBtn->getLabelSelected();
- static std::string label_unselected = mSpeakBtn->getLabelUnselected();
-
- if (visible)
- {
- mSpeakBtn->setLabelSelected(label_selected);
- mSpeakBtn->setLabelUnselected(label_unselected);
- }
- else
- {
- static LLStringExplicit empty_string("");
- mSpeakBtn->setLabelSelected(empty_string);
- mSpeakBtn->setLabelUnselected(empty_string);
- }
-}
-
-//////////////////////////////////////////////////////////////////////////
-/// PROTECTED SECTION
-//////////////////////////////////////////////////////////////////////////
-void LLSpeakButton::onMouseDown_SpeakBtn()
-{
- bool down = true;
- LLVoiceClient::getInstance()->inputUserControlState(down); // this method knows/care about whether this translates into a toggle-to-talk or down-to-talk
-}
-void LLSpeakButton::onMouseUp_SpeakBtn()
-{
- bool down = false;
- LLVoiceClient::getInstance()->inputUserControlState(down);
-}
-
diff --git a/indra/newview/llspeakbutton.h b/indra/newview/llspeakbutton.h
deleted file mode 100644
index 2fdf80c1f2..0000000000
--- a/indra/newview/llspeakbutton.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/**
-* @file llspeakbutton.h
-* @brief LLSpeakButton class header file
-*
-* $LicenseInfo:firstyear=2002&license=viewerlgpl$
-* Second Life Viewer Source Code
-* Copyright (C) 2010, Linden Research, Inc.
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU Lesser General Public
-* License as published by the Free Software Foundation;
-* version 2.1 of the License only.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-* Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public
-* License along with this library; if not, write to the Free Software
-* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-*
-* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
-* $/LicenseInfo$
-*/
-
-#ifndef LL_LLSPEAKBUTTON_H
-#define LL_LLSPEAKBUTTON_H
-
-#include "llinitparam.h"
-#include "lluictrl.h"
-
-class LLCallFloater;
-class LLButton;
-class LLOutputMonitorCtrl;
-class LLBottomtrayButton;
-
-/*
- * Button displaying voice chat status. Displays voice chat options when
- * clicked.
-*/
-class LLSpeakButton : public LLUICtrl
-{
-public:
-
- struct Params : public LLInitParam::Block<Params, LLUICtrl::Params>
- {
- Optional<LLButton::Params> speak_button;
- Optional<LLBottomtrayButton::Params> show_button;
- Optional<LLOutputMonitorCtrl::Params> monitor;
-
- Params();
- };
-
- /*virtual*/ ~LLSpeakButton();
- /*virtual*/ void draw();
-
- // methods for enabling/disabling right and left parts of speak button separately(EXT-4648)
- void setSpeakBtnEnabled(bool enabled);
- void setFlyoutBtnEnabled(bool enabled);
-
- // *HACK: Need to put tooltips in a translatable location,
- // the panel that contains this button.
- void setSpeakToolTip(const std::string& msg);
- void setShowToolTip(const std::string& msg);
-
- /**
- * Sets visibility of speak button's label according to passed parameter.
- *
- * It removes label/selected label if "visible" is false and restores otherwise.
- *
- * @param visible if true - show label and selected label.
- *
- * @see mSpeakBtn
- * @see LLBottomTray::processShrinkButtons()
- */
- void setLabelVisible(bool visible);
-
-protected:
- friend class LLUICtrlFactory;
- LLSpeakButton(const Params& p);
-
- void onMouseDown_SpeakBtn();
- void onMouseUp_SpeakBtn();
-
-private:
- LLButton* mSpeakBtn;
- LLBottomtrayButton* mShowBtn;
- LLHandle<LLFloater> mPrivateCallPanel;
- LLOutputMonitorCtrl* mOutputMonitor;
-};
-
-#endif // LL_LLSPEAKBUTTON_H
diff --git a/indra/newview/llspeakers.cpp b/indra/newview/llspeakers.cpp
index 40aea05839..07d2f1ad6f 100644
--- a/indra/newview/llspeakers.cpp
+++ b/indra/newview/llspeakers.cpp
@@ -272,6 +272,7 @@ LLPointer<LLSpeaker> LLSpeakerMgr::setSpeaker(const LLUUID& id, const std::strin
speakerp->mStatus = status;
mSpeakers.insert(std::make_pair(speakerp->mID, speakerp));
mSpeakersSorted.push_back(speakerp);
+ LL_DEBUGS("Speakers") << "Added speaker " << id << llendl;
fireEvent(new LLSpeakerListChangeEvent(this, speakerp->mID), "add");
}
else
@@ -290,6 +291,10 @@ LLPointer<LLSpeaker> LLSpeakerMgr::setSpeaker(const LLUUID& id, const std::strin
speakerp->lookupName();
}
}
+ else
+ {
+ LL_WARNS("Speakers") << "Speaker " << id << " not found" << llendl;
+ }
}
mSpeakerDelayRemover->unsetActionTimer(speakerp->mID);
@@ -354,6 +359,7 @@ void LLSpeakerMgr::update(BOOL resort_ok)
if (moderator_muted_voice != speakerp->mModeratorMutedVoice)
{
speakerp->mModeratorMutedVoice = moderator_muted_voice;
+ LL_DEBUGS("Speakers") << (speakerp->mModeratorMutedVoice? "Muted" : "Umuted") << " speaker " << speaker_id<< llendl;
speakerp->fireEvent(new LLSpeakerVoiceModerationEvent(speakerp));
}
@@ -484,6 +490,7 @@ bool LLSpeakerMgr::removeSpeaker(const LLUUID& speaker_id)
}
}
+ LL_DEBUGS("Speakers") << "Removed speaker " << speaker_id << llendl;
fireEvent(new LLSpeakerListChangeEvent(this, speaker_id), "remove");
update(TRUE);
@@ -595,7 +602,10 @@ void LLIMSpeakerMgr::setSpeakers(const LLSD& speakers)
speaker_it->second["mutes"]["text"];
// Fire event only if moderator changed
if ( is_moderator != speakerp->mIsModerator )
+ {
+ LL_DEBUGS("Speakers") << "Speaker " << agent_id << (is_moderator ? "is now" : "no longer is") << " a moderator" << llendl;
fireEvent(new LLSpeakerUpdateModeratorEvent(speakerp), "update_moderator");
+ }
}
}
}
@@ -665,7 +675,10 @@ void LLIMSpeakerMgr::updateSpeakers(const LLSD& update)
speakerp->mIsModerator = agent_info["is_moderator"];
// Fire event only if moderator changed
if ( is_moderator != speakerp->mIsModerator )
+ {
+ LL_DEBUGS("Speakers") << "Speaker " << agent_id << (is_moderator ? "is now" : "no longer is") << " a moderator" << llendl;
fireEvent(new LLSpeakerUpdateModeratorEvent(speakerp), "update_moderator");
+ }
}
if (agent_info.has("mutes"))
@@ -857,6 +870,7 @@ void LLActiveSpeakerMgr::updateSpeakerList()
// always populate from active voice channel
if (LLVoiceChannel::getCurrentVoiceChannel() != mVoiceChannel) //MA: seems this is always false
{
+ LL_DEBUGS("Speakers") << "Removed all speakers" << llendl;
fireEvent(new LLSpeakerListChangeEvent(this, LLUUID::null), "clear");
mSpeakers.clear();
mSpeakersSorted.clear();
@@ -920,7 +934,7 @@ void LLLocalSpeakerMgr::updateSpeakerList()
if (speakerp->mStatus == LLSpeaker::STATUS_TEXT_ONLY)
{
LLVOAvatar* avatarp = (LLVOAvatar*)gObjectList.findObject(speaker_id);
- if (!avatarp || dist_vec(avatarp->getPositionAgent(), gAgent.getPositionAgent()) > CHAT_NORMAL_RADIUS)
+ if (!avatarp || dist_vec_squared(avatarp->getPositionAgent(), gAgent.getPositionAgent()) > CHAT_NORMAL_RADIUS_SQUARED)
{
setSpeakerNotInChannel(speakerp);
}
diff --git a/indra/newview/llspeakers.h b/indra/newview/llspeakers.h
index 35f2ee7056..b9358cf37c 100644
--- a/indra/newview/llspeakers.h
+++ b/indra/newview/llspeakers.h
@@ -208,6 +208,8 @@ private:
class LLSpeakerMgr : public LLOldEvents::LLObservable
{
+ LOG_CLASS(LLSpeakerMgr);
+
public:
LLSpeakerMgr(LLVoiceChannel* channelp);
virtual ~LLSpeakerMgr();
@@ -271,6 +273,8 @@ protected:
class LLIMSpeakerMgr : public LLSpeakerMgr
{
+ LOG_CLASS(LLIMSpeakerMgr);
+
public:
LLIMSpeakerMgr(LLVoiceChannel* channel);
@@ -320,6 +324,8 @@ protected:
class LLActiveSpeakerMgr : public LLSpeakerMgr, public LLSingleton<LLActiveSpeakerMgr>
{
+ LOG_CLASS(LLActiveSpeakerMgr);
+
public:
LLActiveSpeakerMgr();
protected:
@@ -328,6 +334,7 @@ protected:
class LLLocalSpeakerMgr : public LLSpeakerMgr, public LLSingleton<LLLocalSpeakerMgr>
{
+ LOG_CLASS(LLLocalSpeakerMgr);
public:
LLLocalSpeakerMgr();
~LLLocalSpeakerMgr ();
diff --git a/indra/newview/llsprite.cpp b/indra/newview/llsprite.cpp
index a69592b61c..c3eb70f850 100644
--- a/indra/newview/llsprite.cpp
+++ b/indra/newview/llsprite.cpp
@@ -186,14 +186,15 @@ void LLSprite::updateFace(LLFace &face)
U16 index_offset;
// Setup face
- if (face.mVertexBuffer.isNull())
+ if (!face.getVertexBuffer())
{
- face.mVertexBuffer = new LLVertexBuffer(LLVertexBuffer::MAP_VERTEX |
+ LLVertexBuffer* buff = new LLVertexBuffer(LLVertexBuffer::MAP_VERTEX |
LLVertexBuffer::MAP_TEXCOORD0,
GL_STREAM_DRAW_ARB);
- face.mVertexBuffer->allocateBuffer(4, 12, TRUE);
+ buff->allocateBuffer(4, 12, TRUE);
face.setGeomIndex(0);
face.setIndicesIndex(0);
+ face.setVertexBuffer(buff);
}
index_offset = face.getGeometry(verticesp,normalsp,tex_coordsp, indicesp);
@@ -242,7 +243,7 @@ void LLSprite::updateFace(LLFace &face)
*indicesp++ = 3 + index_offset;
}
- face.mVertexBuffer->setBuffer(0);
+ face.getVertexBuffer()->flush();
face.mCenterAgent = mPosition;
}
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 80cf7e3cd0..0ac8c1fe39 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -76,6 +76,7 @@
#include "lluserrelations.h"
#include "llversioninfo.h"
#include "llviewercontrol.h"
+#include "llviewerhelp.h"
#include "llvfs.h"
#include "llxorcipher.h" // saved password, MAC address
#include "llwindow.h"
@@ -125,11 +126,11 @@
#include "llpanelgroupnotices.h"
#include "llpreview.h"
#include "llpreviewscript.h"
+#include "llproxy.h"
#include "llproductinforequest.h"
#include "llsecondlifeurls.h"
#include "llselectmgr.h"
#include "llsky.h"
-#include "llsidetray.h"
#include "llstatview.h"
#include "llstatusbar.h" // sendMoneyBalanceRequest(), owns L$ balance
#include "llsurface.h"
@@ -139,6 +140,7 @@
#include "lltrans.h"
#include "llui.h"
#include "llurldispatcher.h"
+#include "llurlentry.h"
#include "llslurl.h"
#include "llurlhistory.h"
#include "llurlwhitelist.h"
@@ -162,7 +164,6 @@
#include "llviewerwindow.h"
#include "llvoavatar.h"
#include "llvoavatarself.h"
-#include "llvoclouds.h"
#include "llweb.h"
#include "llworld.h"
#include "llworldmapmessage.h"
@@ -189,6 +190,7 @@
#include "lllogin.h"
#include "llevents.h"
#include "llstartuplistener.h"
+#include "lltoolbarview.h"
#if LL_WINDOWS
#include "lldxhardware.h"
@@ -233,6 +235,8 @@ static LLHost gFirstSim;
static std::string gFirstSimSeedCap;
static LLVector3 gAgentStartLookAt(1.0f, 0.f, 0.f);
static std::string gAgentStartLocation = "safe";
+static bool mLoginStatePastUI = false;
+
boost::scoped_ptr<LLEventPump> LLStartUp::sStateWatcher(new LLEventStream("StartupState"));
boost::scoped_ptr<LLStartupListener> LLStartUp::sListener(new LLStartupListener());
@@ -351,11 +355,8 @@ bool idle_startup()
LLStringUtil::setLocale (LLTrans::getString(system));
- if (!gNoRender)
- {
- //note: Removing this line will cause incorrect button size in the login screen. -- bao.
- gTextureList.updateImages(0.01f) ;
- }
+ //note: Removing this line will cause incorrect button size in the login screen. -- bao.
+ gTextureList.updateImages(0.01f) ;
if ( STATE_FIRST == LLStartUp::getStartupState() )
{
@@ -366,7 +367,9 @@ bool idle_startup()
//
// Initialize stuff that doesn't need data from simulators
//
-
+ std::string lastGPU = gSavedSettings.getString("LastGPUString");
+ std::string thisGPU = LLFeatureManager::getInstance()->getGPUString();
+
if (LLFeatureManager::getInstance()->isSafe())
{
LLNotificationsUtil::add("DisplaySetToSafe");
@@ -374,20 +377,30 @@ bool idle_startup()
else if ((gSavedSettings.getS32("LastFeatureVersion") < LLFeatureManager::getInstance()->getVersion()) &&
(gSavedSettings.getS32("LastFeatureVersion") != 0))
{
- LLNotificationsUtil::add("DisplaySetToRecommended");
+ LLNotificationsUtil::add("DisplaySetToRecommendedFeatureChange");
}
- else if ((gSavedSettings.getS32("LastGPUClass") != LLFeatureManager::getInstance()->getGPUClass()) &&
- (gSavedSettings.getS32("LastGPUClass") != -1))
+ else if ( ! lastGPU.empty() && (lastGPU != thisGPU))
{
- LLNotificationsUtil::add("DisplaySetToRecommended");
+ LLSD subs;
+ subs["LAST_GPU"] = lastGPU;
+ subs["THIS_GPU"] = thisGPU;
+ LLNotificationsUtil::add("DisplaySetToRecommendedGPUChange", subs);
}
else if (!gViewerWindow->getInitAlert().empty())
{
LLNotificationsUtil::add(gViewerWindow->getInitAlert());
}
+ //-------------------------------------------------
+ // Init the SOCKS 5 proxy if the user has configured
+ // one. We need to do this early in case the user
+ // is using SOCKS for HTTP so we get the login
+ // screen and HTTP tables via SOCKS.
+ //-------------------------------------------------
+ LLStartUp::startLLProxy();
+
gSavedSettings.setS32("LastFeatureVersion", LLFeatureManager::getInstance()->getVersion());
- gSavedSettings.setS32("LastGPUClass", LLFeatureManager::getInstance()->getGPUClass());
+ gSavedSettings.setString("LastGPUString", thisGPU);
// load dynamic GPU/feature tables from website (S3)
LLFeatureManager::getInstance()->fetchHTTPTables();
@@ -421,7 +434,7 @@ bool idle_startup()
//
// Load autopilot and stats stuff
- gAgentPilot.load(gSavedSettings.getString("StatsPilotFile"));
+ gAgentPilot.load();
//gErrorStream.setTime(gSavedSettings.getBOOL("LogTimestamps"));
@@ -591,7 +604,7 @@ bool idle_startup()
}
LL_INFOS("AppInit") << "Message System Initialized." << LL_ENDL;
-
+
//-------------------------------------------------
// Init audio, which may be needed for prefs dialog
// or audio cues in connection UI.
@@ -670,6 +683,7 @@ bool idle_startup()
{
gUserCredential = gLoginHandler.initializeLoginInfo();
}
+ // Previous initializeLoginInfo may have generated user credentials. Re-check them.
if (gUserCredential.isNull())
{
show_connect_box = TRUE;
@@ -706,40 +720,60 @@ bool idle_startup()
if (STATE_LOGIN_SHOW == LLStartUp::getStartupState())
{
LL_DEBUGS("AppInit") << "Initializing Window" << LL_ENDL;
-
+
+ // if we've gone backwards in the login state machine, to this state where we show the UI
+ // AND the debug setting to exit in this case is true, then go ahead and bail quickly
+ if ( mLoginStatePastUI && gSavedSettings.getBOOL("QuitOnLoginActivated") )
+ {
+ // no requirement for notification here - just exit
+ LLAppViewer::instance()->earlyExitNoNotify();
+ }
+
gViewerWindow->getWindow()->setCursor(UI_CURSOR_ARROW);
timeout_count = 0;
+ // Login screen needs menus for preferences, but we can enter
+ // this startup phase more than once.
+ if (gLoginMenuBarView == NULL)
+ {
+ display_startup();
+ initialize_edit_menu();
+ display_startup();
+ init_menus();
+ display_startup();
+ }
+
if (show_connect_box)
{
// Load all the name information out of the login view
// NOTE: Hits "Attempted getFields with no login view shown" warning, since we don't
// show the login view until login_show() is called below.
if (gUserCredential.isNull())
- {
+ {
+ display_startup();
gUserCredential = gLoginHandler.initializeLoginInfo();
+ display_startup();
}
- if (gNoRender)
+ if (gHeadlessClient)
{
- LL_ERRS("AppInit") << "Need to autologin or use command line with norender!" << LL_ENDL;
+ LL_WARNS("AppInit") << "Waiting at connection box in headless client. Did you mean to add autologin params?" << LL_ENDL;
}
// Make sure the process dialog doesn't hide things
+ display_startup();
gViewerWindow->setShowProgress(FALSE);
-
- initialize_edit_menu();
-
+ display_startup();
// Show the login dialog
login_show();
+ display_startup();
// connect dialog is already shown, so fill in the names
if (gUserCredential.notNull())
{
LLPanelLogin::setFields( gUserCredential, gRememberPassword);
}
+ display_startup();
LLPanelLogin::giveFocus();
- gSavedSettings.setBOOL("FirstRunThisInstall", FALSE);
-
LLStartUp::setStartupState( STATE_LOGIN_WAIT ); // Wait for user input
}
else
@@ -748,26 +782,19 @@ bool idle_startup()
LLStartUp::setStartupState( STATE_LOGIN_CLEANUP );
}
- // *NOTE: This is where LLViewerParcelMgr::getInstance() used to get allocated before becoming LLViewerParcelMgr::getInstance().
-
- // *NOTE: This is where gHUDManager used to bet allocated before becoming LLHUDManager::getInstance().
-
- // *NOTE: This is where gMuteList used to get allocated before becoming LLMuteList::getInstance().
-
- // Login screen needs menus for preferences, but we can enter
- // this startup phase more than once.
- if (gLoginMenuBarView == NULL)
- {
- init_menus();
- }
-
+ display_startup();
gViewerWindow->setNormalControlsVisible( FALSE );
+ display_startup();
gLoginMenuBarView->setVisible( TRUE );
+ display_startup();
gLoginMenuBarView->setEnabled( TRUE );
+ display_startup();
+ show_debug_menus();
+ display_startup();
// Hide the splash screen
LLSplashScreen::hide();
-
+ display_startup();
// Push our window frontmost
gViewerWindow->getWindow()->show();
display_startup();
@@ -776,7 +803,9 @@ bool idle_startup()
// first made visible.
#ifdef _WIN32
MSG msg;
- while( PeekMessage( &msg, /*All hWnds owned by this thread */ NULL, WM_KEYFIRST, WM_KEYLAST, PM_REMOVE ) );
+ while( PeekMessage( &msg, /*All hWnds owned by this thread */ NULL, WM_KEYFIRST, WM_KEYLAST, PM_REMOVE ) )
+ { }
+ display_startup();
#endif
timeout.reset();
return FALSE;
@@ -784,9 +813,14 @@ bool idle_startup()
if (STATE_LOGIN_WAIT == LLStartUp::getStartupState())
{
+ // when we get to this state, we've already been past the login UI
+ // (possiblely automatically) - flag this so we can test in the
+ // STATE_LOGIN_SHOW state if we've gone backwards
+ mLoginStatePastUI = true;
+
// Don't do anything. Wait for the login view to call the login_callback,
// which will push us to the next state.
-
+ display_startup();
// Sleep so we don't spin the CPU
ms_sleep(1);
return FALSE;
@@ -794,7 +828,21 @@ bool idle_startup()
if (STATE_LOGIN_CLEANUP == LLStartUp::getStartupState())
{
- //reset the values that could have come in from a slurl
+ // Post login screen, we should see if any settings have changed that may
+ // require us to either start/stop or change the socks proxy. As various communications
+ // past this point may require the proxy to be up.
+ if (!LLStartUp::startLLProxy())
+ {
+ // Proxy start up failed, we should now bail the state machine
+ // startLLProxy() will have reported an error to the user
+ // already, so we just go back to the login screen. The user
+ // could then change the preferences to fix the issue.
+
+ LLStartUp::setStartupState(STATE_LOGIN_SHOW);
+ return FALSE;
+ }
+
+ // reset the values that could have come in from a slurl
// DEV-42215: Make sure they're not empty -- gUserCredential
// might already have been set from gSavedSettings, and it's too bad
// to overwrite valid values with empty strings.
@@ -810,6 +858,11 @@ bool idle_startup()
gKeyboard->resetKeys();
}
+ // when we get to this state, we've already been past the login UI
+ // (possiblely automatically) - flag this so we can test in the
+ // STATE_LOGIN_SHOW state if we've gone backwards
+ mLoginStatePastUI = true;
+
// save the credentials
std::string userid = "unknown";
if(gUserCredential.notNull())
@@ -827,7 +880,6 @@ bool idle_startup()
LLFile::mkdir(gDirUtilp->getLindenUserDir());
// Set PerAccountSettingsFile to the default value.
- std::string per_account_settings_file = LLAppViewer::instance()->getSettingsFilename("Default", "PerAccount");
gSavedSettings.setString("PerAccountSettingsFile",
gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT,
LLAppViewer::instance()->getSettingsFilename("Default", "PerAccount")));
@@ -879,7 +931,7 @@ bool idle_startup()
if (show_connect_box)
{
LLSLURL slurl;
- LLPanelLogin::closePanel();
+ //LLPanelLogin::closePanel();
}
@@ -920,15 +972,14 @@ bool idle_startup()
gViewerWindow->getWindow()->setCursor(UI_CURSOR_WAIT);
- if (!gNoRender)
- {
- init_start_screen(agent_location_id);
- }
+ init_start_screen(agent_location_id);
// Display the startup progress bar.
gViewerWindow->setShowProgress(TRUE);
gViewerWindow->setProgressCancelButtonVisible(TRUE, LLTrans::getString("Quit"));
+ gViewerWindow->revealIntroPanel();
+
// Poke the VFS, which could potentially block for a while if
// Windows XP is acting up
set_startup_status(0.07f, LLTrans::getString("LoginVerifyingCache"), LLStringUtil::null);
@@ -954,13 +1005,7 @@ bool idle_startup()
// Setting initial values...
LLLoginInstance* login = LLLoginInstance::getInstance();
login->setNotificationsInterface(LLNotifications::getInstance());
- if(gNoRender)
- {
- // HACK, skip optional updates if you're running drones
- login->setSkipOptionalUpdate(true);
- }
- login->setUserInteraction(show_connect_box);
login->setSerialNumber(LLAppViewer::instance()->getSerialNumber());
login->setLastExecEvent(gLastExecEvent);
login->setUpdaterLauncher(boost::bind(&LLAppViewer::launchUpdater, LLAppViewer::instance()));
@@ -986,6 +1031,7 @@ bool idle_startup()
if(STATE_LOGIN_PROCESS_RESPONSE == LLStartUp::getStartupState())
{
+ // Generic failure message
std::ostringstream emsg;
emsg << LLTrans::getString("LoginFailed") << "\n";
if(LLLoginInstance::getInstance()->authFailure())
@@ -994,25 +1040,33 @@ bool idle_startup()
<< LLLoginInstance::getInstance()->getResponse() << LL_ENDL;
LLSD response = LLLoginInstance::getInstance()->getResponse();
// Still have error conditions that may need some
- // sort of handling.
+ // sort of handling - dig up specific message
std::string reason_response = response["reason"];
std::string message_response = response["message"];
-
- if(!message_response.empty())
+ std::string message_id = response["message_id"];
+ std::string message; // actual string to show the user
+
+ if(!message_id.empty() && LLTrans::findString(message, message_id, response["message_args"]))
{
- // XUI: fix translation for strings returned during login
- // We need a generic table for translations
- std::string big_reason = LLAgent::sTeleportErrorMessages[ message_response ];
- if ( big_reason.size() == 0 )
- {
- emsg << message_response;
- }
- else
- {
- emsg << big_reason;
- }
+ // message will be filled in with the template and arguments
+ }
+ else if(!message_response.empty())
+ {
+ // *HACK: "no_inventory_host" sent as the message itself.
+ // Remove this clause when server is sending message_id as well.
+ message = LLAgent::sTeleportErrorMessages[ message_response ];
+ }
+
+ if (message.empty())
+ {
+ // Fallback to server-supplied string; necessary since server
+ // may add strings that this viewer is not yet aware of
+ message = message_response;
}
+ emsg << message;
+
+
if(reason_response == "key")
{
// Couldn't login because user/password is wrong
@@ -1133,39 +1187,51 @@ bool idle_startup()
// Finish agent initialization. (Requires gSavedSettings, builds camera)
gAgent.init();
+ display_startup();
gAgentCamera.init();
+ display_startup();
set_underclothes_menu_options();
+ display_startup();
// Since we connected, save off the settings so the user doesn't have to
// type the name/password again if we crash.
gSavedSettings.saveToFile(gSavedSettings.getString("ClientSettingsFile"), TRUE);
LLUIColorTable::instance().saveUserSettings();
+ display_startup();
+
//
// Initialize classes w/graphics stuff.
//
gTextureList.doPrefetchImages();
+ display_startup();
+
LLSurface::initClasses();
+ display_startup();
+
LLFace::initClass();
+ display_startup();
LLDrawable::initClass();
+ display_startup();
// init the shader managers
LLPostProcess::initClass();
- LLWLParamManager::initClass();
- LLWaterParamManager::initClass();
+ display_startup();
LLViewerObject::initVOClasses();
+ display_startup();
// Initialize all our tools. Must be done after saved settings loaded.
// NOTE: This also is where gToolMgr used to be instantiated before being turned into a singleton.
LLToolMgr::getInstance()->initTools();
+ display_startup();
// Pre-load floaters, like the world map, that are slow to spawn
// due to XML complexity.
gViewerWindow->initWorldUI();
-
+
display_startup();
// This is where we used to initialize gWorldp. Original comment said:
@@ -1173,24 +1239,26 @@ bool idle_startup()
// User might have overridden far clip
LLWorld::getInstance()->setLandFarClip(gAgentCamera.mDrawDistance);
-
+ display_startup();
// Before we create the first region, we need to set the agent's mOriginGlobal
// This is necessary because creating objects before this is set will result in a
// bad mPositionAgent cache.
gAgent.initOriginGlobal(from_region_handle(gFirstSimHandle));
+ display_startup();
LLWorld::getInstance()->addRegion(gFirstSimHandle, gFirstSim);
+ display_startup();
LLViewerRegion *regionp = LLWorld::getInstance()->getRegionFromHandle(gFirstSimHandle);
LL_INFOS("AppInit") << "Adding initial simulator " << regionp->getOriginGlobal() << LL_ENDL;
regionp->setSeedCapability(gFirstSimSeedCap);
LL_DEBUGS("AppInit") << "Waiting for seed grant ...." << LL_ENDL;
-
+ display_startup();
// Set agent's initial region to be the one we just created.
gAgent.setRegion(regionp);
-
+ display_startup();
// Set agent's initial position, which will be read by LLVOAvatar when the avatar
// object is created. I think this must be done after setting the region. JC
gAgent.setPositionAgent(agent_start_position_region);
@@ -1210,6 +1278,7 @@ bool idle_startup()
{
LLStartUp::multimediaInit();
LLStartUp::setStartupState( STATE_FONT_INIT );
+ display_startup();
return FALSE;
}
@@ -1218,6 +1287,7 @@ bool idle_startup()
{
LLStartUp::fontInit();
LLStartUp::setStartupState( STATE_SEED_GRANTED_WAIT );
+ display_startup();
return FALSE;
}
@@ -1226,6 +1296,26 @@ bool idle_startup()
//---------------------------------------------------------------------
if(STATE_SEED_GRANTED_WAIT == LLStartUp::getStartupState())
{
+ LLViewerRegion *regionp = LLWorld::getInstance()->getRegionFromHandle(gFirstSimHandle);
+ if (regionp->capabilitiesReceived())
+ {
+ LLStartUp::setStartupState( STATE_SEED_CAP_GRANTED );
+ }
+ else
+ {
+ U32 num_retries = regionp->getNumSeedCapRetries();
+ if (num_retries > 0)
+ {
+ LLStringUtil::format_map_t args;
+ args["[NUMBER]"] = llformat("%d", num_retries + 1);
+ set_startup_status(0.4f, LLTrans::getString("LoginRetrySeedCapGrant", args), gAgent.mMOTD);
+ }
+ else
+ {
+ set_startup_status(0.4f, LLTrans::getString("LoginRequestSeedCapGrant"), gAgent.mMOTD);
+ }
+ }
+ display_startup();
return FALSE;
}
@@ -1236,7 +1326,9 @@ bool idle_startup()
//---------------------------------------------------------------------
if (STATE_SEED_CAP_GRANTED == LLStartUp::getStartupState())
{
+ display_startup();
update_texture_fetch();
+ display_startup();
if ( gViewerWindow != NULL)
{ // This isn't the first logon attempt, so show the UI
@@ -1244,15 +1336,15 @@ bool idle_startup()
}
gLoginMenuBarView->setVisible( FALSE );
gLoginMenuBarView->setEnabled( FALSE );
+ display_startup();
- if (!gNoRender)
- {
- // direct logging to the debug console's line buffer
- LLError::logToFixedBuffer(gDebugView->mDebugConsolep);
-
- // set initial visibility of debug console
- gDebugView->mDebugConsolep->setVisible(gSavedSettings.getBOOL("ShowDebugConsole"));
- }
+ // direct logging to the debug console's line buffer
+ LLError::logToFixedBuffer(gDebugView->mDebugConsolep);
+ display_startup();
+
+ // set initial visibility of debug console
+ gDebugView->mDebugConsolep->setVisible(gSavedSettings.getBOOL("ShowDebugConsole"));
+ display_startup();
//
// Set message handlers
@@ -1261,36 +1353,44 @@ bool idle_startup()
// register callbacks for messages. . . do this after initial handshake to make sure that we don't catch any unwanted
register_viewer_callbacks(gMessageSystem);
+ display_startup();
// Debugging info parameters
gMessageSystem->setMaxMessageTime( 0.5f ); // Spam if decoding all msgs takes more than 500 ms
+ display_startup();
#ifndef LL_RELEASE_FOR_DOWNLOAD
gMessageSystem->setTimeDecodes( TRUE ); // Time the decode of each msg
gMessageSystem->setTimeDecodesSpamThreshold( 0.05f ); // Spam if a single msg takes over 50ms to decode
#endif
+ display_startup();
gXferManager->registerCallbacks(gMessageSystem);
+ display_startup();
LLStartUp::initNameCache();
+ display_startup();
// update the voice settings *after* gCacheName initialization
// so that we can construct voice UI that relies on the name cache
LLVoiceClient::getInstance()->updateSettings();
+ display_startup();
//gCacheName is required for nearby chat history loading
//so I just moved nearby history loading a few states further
- if (!gNoRender && gSavedPerAccountSettings.getBOOL("LogShowHistory"))
+ if (gSavedPerAccountSettings.getBOOL("LogShowHistory"))
{
LLNearbyChat* nearby_chat = LLNearbyChat::getInstance();
if (nearby_chat) nearby_chat->loadHistory();
}
+ display_startup();
// *Note: this is where gWorldMap used to be initialized.
// register null callbacks for audio until the audio system is initialized
gMessageSystem->setHandlerFuncFast(_PREHASH_SoundTrigger, null_message_callback, NULL);
gMessageSystem->setHandlerFuncFast(_PREHASH_AttachedSound, null_message_callback, NULL);
+ display_startup();
//reset statistics
LLViewerStats::getInstance()->resetStats();
@@ -1320,6 +1420,7 @@ bool idle_startup()
LLViewerCamera::getInstance()->setAspect(gViewerWindow->getWorldViewAspectRatio());
// Initialize FOV
LLViewerCamera::getInstance()->setDefaultFOV(gSavedSettings.getF32("CameraAngle"));
+ display_startup();
// Move agent to starting location. The position handed to us by
// the space server is in global coordinates, but the agent frame
@@ -1330,20 +1431,20 @@ bool idle_startup()
gAgent.resetAxes(gAgentStartLookAt);
gAgentCamera.stopCameraAnimation();
gAgentCamera.resetCamera();
+ display_startup();
// Initialize global class data needed for surfaces (i.e. textures)
- if (!gNoRender)
- {
- LL_DEBUGS("AppInit") << "Initializing sky..." << LL_ENDL;
- // Initialize all of the viewer object classes for the first time (doing things like texture fetches.
- LLGLState::checkStates();
- LLGLState::checkTextureChannels();
+ LL_DEBUGS("AppInit") << "Initializing sky..." << LL_ENDL;
+ // Initialize all of the viewer object classes for the first time (doing things like texture fetches.
+ LLGLState::checkStates();
+ LLGLState::checkTextureChannels();
- gSky.init(initial_sun_direction);
+ gSky.init(initial_sun_direction);
- LLGLState::checkStates();
- LLGLState::checkTextureChannels();
- }
+ LLGLState::checkStates();
+ LLGLState::checkTextureChannels();
+
+ display_startup();
LL_DEBUGS("AppInit") << "Decoding images..." << LL_ENDL;
// For all images pre-loaded into viewer cache, decode them.
@@ -1358,6 +1459,8 @@ bool idle_startup()
}
LLStartUp::setStartupState( STATE_WORLD_WAIT );
+ display_startup();
+
// JC - Do this as late as possible to increase likelihood Purify
// will run.
LLMessageSystem* msg = gMessageSystem;
@@ -1385,6 +1488,7 @@ bool idle_startup()
NULL);
timeout.reset();
+ display_startup();
return FALSE;
}
@@ -1403,8 +1507,10 @@ bool idle_startup()
LLMessageSystem* msg = gMessageSystem;
while (msg->checkAllMessages(gFrameCount, gServicePump))
{
+ display_startup();
}
msg->processAcks();
+ display_startup();
return FALSE;
}
@@ -1415,6 +1521,7 @@ bool idle_startup()
{
LL_DEBUGS("AppInit") << "Connecting to region..." << LL_ENDL;
set_startup_status(0.60f, LLTrans::getString("LoginConnectingToRegion"), gAgent.mMOTD);
+ display_startup();
// register with the message system so it knows we're
// expecting this message
LLMessageSystem* msg = gMessageSystem;
@@ -1430,6 +1537,7 @@ bool idle_startup()
msg->newMessageFast(_PREHASH_EconomyDataRequest);
gAgent.sendReliableMessage();
}
+ display_startup();
// Create login effect
// But not on first login, because you can't see your avatar then
@@ -1444,6 +1552,7 @@ bool idle_startup()
LLStartUp::setStartupState( STATE_AGENT_WAIT ); // Go to STATE_AGENT_WAIT
timeout.reset();
+ display_startup();
return FALSE;
}
@@ -1468,14 +1577,17 @@ bool idle_startup()
LL_DEBUGS("AppInit") << "Awaiting AvatarInitComplete, got "
<< msg->getMessageName() << LL_ENDL;
}
+ display_startup();
}
msg->processAcks();
+ display_startup();
+
if (gAgentMovementCompleted)
{
LLStartUp::setStartupState( STATE_INVENTORY_SEND );
}
-
+ display_startup();
return FALSE;
}
@@ -1484,9 +1596,10 @@ bool idle_startup()
//---------------------------------------------------------------------
if (STATE_INVENTORY_SEND == LLStartUp::getStartupState())
{
+ display_startup();
// Inform simulator of our language preference
LLAgentLanguage::update();
-
+ display_startup();
// unpack thin inventory
LLSD response = LLLoginInstance::getInstance()->getResponse();
//bool dump_buffer = false;
@@ -1501,6 +1614,7 @@ bool idle_startup()
gInventory.setLibraryRootFolderID(id.asUUID());
}
}
+ display_startup();
LLSD inv_lib_owner = response["inventory-lib-owner"];
if(inv_lib_owner.isDefined())
@@ -1512,6 +1626,7 @@ bool idle_startup()
gInventory.setLibraryOwnerID( LLUUID(id.asUUID()));
}
}
+ display_startup();
LLSD inv_skel_lib = response["inventory-skel-lib"];
if(inv_skel_lib.isDefined() && gInventory.getLibraryOwnerID().notNull())
@@ -1521,6 +1636,7 @@ bool idle_startup()
LL_WARNS("AppInit") << "Problem loading inventory-skel-lib" << LL_ENDL;
}
}
+ display_startup();
LLSD inv_skeleton = response["inventory-skeleton"];
if(inv_skeleton.isDefined())
@@ -1530,6 +1646,13 @@ bool idle_startup()
LL_WARNS("AppInit") << "Problem loading inventory-skel-targets" << LL_ENDL;
}
}
+ display_startup();
+
+ LLSD inv_basic = response["inventory-basic"];
+ if(inv_basic.isDefined())
+ {
+ llinfos << "Basic inventory root folder id is " << inv_basic["folder_id"] << llendl;
+ }
LLSD buddy_list = response["buddy-list"];
if(buddy_list.isDefined())
@@ -1561,6 +1684,7 @@ bool idle_startup()
list[agent_id] = new LLRelationship(given_rights, has_rights, false);
}
LLAvatarTracker::instance().addBuddyList(list);
+ display_startup();
}
bool show_hud = false;
@@ -1588,6 +1712,8 @@ bool idle_startup()
//}
}
}
+ display_startup();
+
// Either we want to show tutorial because this is the first login
// to a Linden Help Island or the user quit with the tutorial
// visible. JC
@@ -1595,22 +1721,26 @@ bool idle_startup()
{
LLFloaterReg::showInstance("hud", LLSD(), FALSE);
}
+ display_startup();
LLSD event_notifications = response["event_notifications"];
if(event_notifications.isDefined())
{
gEventNotifier.load(event_notifications);
}
+ display_startup();
LLSD classified_categories = response["classified_categories"];
if(classified_categories.isDefined())
{
LLClassifiedInfo::loadCategories(classified_categories);
}
+ display_startup();
// This method MUST be called before gInventory.findCategoryUUIDForType because of
// gInventory.mIsAgentInvUsable is set to true in the gInventory.buildParentChildMap.
gInventory.buildParentChildMap();
+ display_startup();
//all categories loaded. lets create "My Favorites" category
gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE,true);
@@ -1624,24 +1754,26 @@ bool idle_startup()
LLAvatarTracker::instance().registerCallbacks(msg);
llinfos << " Landmark" << llendl;
LLLandmark::registerCallbacks(msg);
+ display_startup();
// request mute list
llinfos << "Requesting Mute List" << llendl;
LLMuteList::getInstance()->requestFromServer(gAgent.getID());
-
+ display_startup();
// Get L$ and ownership credit information
llinfos << "Requesting Money Balance" << llendl;
LLStatusBar::sendMoneyBalanceRequest();
-
+ display_startup();
// request all group information
llinfos << "Requesting Agent Data" << llendl;
gAgent.sendAgentDataUpdateRequest();
-
+ display_startup();
// Create the inventory views
llinfos << "Creating Inventory Views" << llendl;
LLFloaterReg::getInstance("inventory");
-
+ display_startup();
LLStartUp::setStartupState( STATE_MISC );
+ display_startup();
return FALSE;
}
@@ -1680,19 +1812,33 @@ bool idle_startup()
gViewerThrottle.setMaxBandwidth(FAST_RATE_BPS / 1024.f);
}
+ if (gSavedSettings.getBOOL("ShowHelpOnFirstLogin"))
+ {
+ gSavedSettings.setBOOL("HelpFloaterOpen", TRUE);
+ }
+
// Set the show start location to true, now that the user has logged
// on with this install.
gSavedSettings.setBOOL("ShowStartLocation", TRUE);
-
- LLSideTray::getInstance()->showPanel("panel_home", LLSD());
+ }
+
+ display_startup();
+ if (gSavedSettings.getBOOL("HelpFloaterOpen"))
+ {
+ // show default topic
+ LLViewerHelp::instance().showTopic("");
}
+ display_startup();
+
// We're successfully logged in.
gSavedSettings.setBOOL("FirstLoginThisInstall", FALSE);
LLFloaterReg::showInitialVisibleInstances();
+ display_startup();
+
// based on the comments, we've successfully logged in so we can delete the 'forced'
// URL that the updater set in settings.ini (in a mostly paranoid fashion)
std::string nextLoginLocation = gSavedSettings.getString( "NextLoginLocation" );
@@ -1706,48 +1852,48 @@ bool idle_startup()
LLUIColorTable::instance().saveUserSettings();
};
- if (!gNoRender)
- {
- // JC: Initializing audio requests many sounds for download.
- init_audio();
+ display_startup();
+ // JC: Initializing audio requests many sounds for download.
+ init_audio();
+ display_startup();
- // JC: Initialize "active" gestures. This may also trigger
- // many gesture downloads, if this is the user's first
- // time on this machine or -purge has been run.
- LLSD gesture_options
- = LLLoginInstance::getInstance()->getResponse("gestures");
- if (gesture_options.isDefined())
+ // JC: Initialize "active" gestures. This may also trigger
+ // many gesture downloads, if this is the user's first
+ // time on this machine or -purge has been run.
+ LLSD gesture_options
+ = LLLoginInstance::getInstance()->getResponse("gestures");
+ if (gesture_options.isDefined())
+ {
+ LL_DEBUGS("AppInit") << "Gesture Manager loading " << gesture_options.size()
+ << LL_ENDL;
+ uuid_vec_t item_ids;
+ for(LLSD::array_const_iterator resp_it = gesture_options.beginArray(),
+ end = gesture_options.endArray(); resp_it != end; ++resp_it)
{
- LL_DEBUGS("AppInit") << "Gesture Manager loading " << gesture_options.size()
- << LL_ENDL;
- uuid_vec_t item_ids;
- for(LLSD::array_const_iterator resp_it = gesture_options.beginArray(),
- end = gesture_options.endArray(); resp_it != end; ++resp_it)
- {
- // If the id is not specifed in the LLSD,
- // the LLSD operator[]() will return a null LLUUID.
- LLUUID item_id = (*resp_it)["item_id"];
- LLUUID asset_id = (*resp_it)["asset_id"];
+ // If the id is not specifed in the LLSD,
+ // the LLSD operator[]() will return a null LLUUID.
+ LLUUID item_id = (*resp_it)["item_id"];
+ LLUUID asset_id = (*resp_it)["asset_id"];
- if (item_id.notNull() && asset_id.notNull())
- {
- // Could schedule and delay these for later.
- const BOOL no_inform_server = FALSE;
- const BOOL no_deactivate_similar = FALSE;
- LLGestureMgr::instance().activateGestureWithAsset(item_id, asset_id,
- no_inform_server,
- no_deactivate_similar);
- // We need to fetch the inventory items for these gestures
- // so we have the names to populate the UI.
- item_ids.push_back(item_id);
- }
+ if (item_id.notNull() && asset_id.notNull())
+ {
+ // Could schedule and delay these for later.
+ const BOOL no_inform_server = FALSE;
+ const BOOL no_deactivate_similar = FALSE;
+ LLGestureMgr::instance().activateGestureWithAsset(item_id, asset_id,
+ no_inform_server,
+ no_deactivate_similar);
+ // We need to fetch the inventory items for these gestures
+ // so we have the names to populate the UI.
+ item_ids.push_back(item_id);
}
- // no need to add gesture to inventory observer, it's already made in constructor
- LLGestureMgr::instance().setFetchIDs(item_ids);
- LLGestureMgr::instance().startFetch();
}
+ // no need to add gesture to inventory observer, it's already made in constructor
+ LLGestureMgr::instance().setFetchIDs(item_ids);
+ LLGestureMgr::instance().startFetch();
}
gDisplaySwapBuffers = TRUE;
+ display_startup();
LLMessageSystem* msg = gMessageSystem;
msg->setHandlerFuncFast(_PREHASH_SoundTrigger, process_sound_trigger);
@@ -1766,13 +1912,6 @@ bool idle_startup()
// JC - 7/20/2002
gViewerWindow->sendShapeToSim();
-
- // Ignore stipend information for now. Money history is on the web site.
- // if needed, show the L$ history window
- //if (stipend_since_login && !gNoRender)
- //{
- //}
-
// The reason we show the alert is because we want to
// reduce confusion for when you log in and your provided
// location is not your expected location. So, if this is
@@ -1829,8 +1968,10 @@ bool idle_startup()
}
}
+ display_startup();
//DEV-17797. get null folder. Any items found here moved to Lost and Found
LLInventoryModelBackgroundFetch::instance().findLostItems();
+ display_startup();
LLStartUp::setStartupState( STATE_PRECACHE );
timeout.reset();
@@ -1839,6 +1980,7 @@ bool idle_startup()
if (STATE_PRECACHE == LLStartUp::getStartupState())
{
+ display_startup();
F32 timeout_frac = timeout.getElapsedTimeF32()/PRECACHING_DELAY;
// We now have an inventory skeleton, so if this is a user's first
@@ -1855,6 +1997,8 @@ bool idle_startup()
LLStartUp::loadInitialOutfit( sInitialOutfit, sInitialOutfitGender );
}
+ display_startup();
+
// wait precache-delay and for agent's avatar or a lot longer.
if(((timeout_frac > 1.f) && isAgentAvatarValid())
|| (timeout_frac > 3.f))
@@ -1868,11 +2012,6 @@ bool idle_startup()
LLTrans::getString("LoginPrecaching"),
gAgent.mMOTD);
display_startup();
- if (!LLViewerShaderMgr::sInitialized)
- {
- LLViewerShaderMgr::sInitialized = TRUE;
- LLViewerShaderMgr::instance()->setShaders();
- }
}
return TRUE;
@@ -1885,7 +2024,7 @@ bool idle_startup()
const F32 wearables_time = wearables_timer.getElapsedTimeF32();
const F32 MAX_WEARABLES_TIME = 10.f;
- if (!gAgent.isGenderChosen())
+ if (!gAgent.isGenderChosen() && isAgentAvatarValid())
{
// No point in waiting for clothing, we don't even
// know what gender we are. Pop a dialog to ask and
@@ -1901,6 +2040,8 @@ bool idle_startup()
return TRUE;
}
+ display_startup();
+
if (wearables_time > MAX_WEARABLES_TIME)
{
LLNotificationsUtil::add("ClothingLoading");
@@ -1932,16 +2073,20 @@ bool idle_startup()
}
}
+ display_startup();
update_texture_fetch();
+ display_startup();
set_startup_status(0.9f + 0.1f * wearables_time / MAX_WEARABLES_TIME,
LLTrans::getString("LoginDownloadingClothing").c_str(),
gAgent.mMOTD.c_str());
+ display_startup();
return TRUE;
}
if (STATE_CLEANUP == LLStartUp::getStartupState())
{
set_startup_status(1.0, "", "");
+ display_startup();
// Let the map know about the inventory.
LLFloaterWorldMap* floater_world_map = LLFloaterWorldMap::getInstance();
@@ -1954,8 +2099,10 @@ bool idle_startup()
gViewerWindow->getWindow()->resetBusyCount();
gViewerWindow->getWindow()->setCursor(UI_CURSOR_ARROW);
LL_DEBUGS("AppInit") << "Done releasing bitmap" << LL_ENDL;
- gViewerWindow->setShowProgress(FALSE);
+ //gViewerWindow->revealIntroPanel();
+ gViewerWindow->setStartupComplete();
gViewerWindow->setProgressCancelButtonVisible(FALSE);
+ display_startup();
// We're not away from keyboard, even though login might have taken
// a while. JC
@@ -1969,9 +2116,8 @@ bool idle_startup()
}
// Start automatic replay if the flag is set.
- if (gSavedSettings.getBOOL("StatsAutoRun") || LLAgentPilot::sReplaySession)
+ if (gSavedSettings.getBOOL("StatsAutoRun") || gAgentPilot.getReplaySession())
{
- LLUUID id;
LL_DEBUGS("AppInit") << "Starting automatic playback" << LL_ENDL;
gAgentPilot.startPlayback();
}
@@ -1979,7 +2125,7 @@ bool idle_startup()
show_debug_menus(); // Debug menu visiblity and First Use trigger
// If we've got a startup URL, dispatch it
- LLStartUp::dispatchURL();
+ //LLStartUp::dispatchURL();
// Retrieve information about the land data
// (just accessing this the first time will fetch it,
@@ -1992,6 +2138,7 @@ bool idle_startup()
// LLUserAuth::getInstance()->reset();
LLStartUp::setStartupState( STATE_STARTED );
+ display_startup();
// Unmute audio if desired and setup volumes.
// Unmute audio if desired and setup volumes.
@@ -2016,6 +2163,7 @@ bool idle_startup()
LLAgentPicksInfo::getInstance()->requestNumberOfPicks();
LLIMFloater::initIMFloater();
+ display_startup();
return TRUE;
}
@@ -2037,7 +2185,12 @@ void login_show()
#else
BOOL bUseDebugLogin = TRUE;
#endif
-
+ // Hide the toolbars: may happen to come back here if login fails after login agent but before login in region
+ if (gToolBarView)
+ {
+ gToolBarView->setVisible(FALSE);
+ }
+
LLPanelLogin::show( gViewerWindow->getWindowRectScaled(),
bUseDebugLogin || gSavedSettings.getBOOL("SecondLifeEnterprise"),
login_callback, NULL );
@@ -2336,13 +2489,6 @@ void asset_callback_nothing(LLVFS*, const LLUUID&, LLAssetType::EType, void*, S3
// nothing
}
-// *HACK: Must match name in Library or agent inventory
-const std::string ROOT_GESTURES_FOLDER = "Gestures";
-const std::string COMMON_GESTURES_FOLDER = "Common Gestures";
-const std::string MALE_GESTURES_FOLDER = "Male Gestures";
-const std::string FEMALE_GESTURES_FOLDER = "Female Gestures";
-const std::string SPEECH_GESTURES_FOLDER = "Speech Gestures";
-const std::string OTHER_GESTURES_FOLDER = "Other Gestures";
const S32 OPT_CLOSED_WINDOW = -1;
const S32 OPT_MALE = 0;
const S32 OPT_FEMALE = 1;
@@ -2371,84 +2517,36 @@ bool callback_choose_gender(const LLSD& notification, const LLSD& response)
return false;
}
-void LLStartUp::copyLibraryGestures(const std::string& same_gender_gestures)
-{
- llinfos << "Copying library gestures" << llendl;
-
- // Copy gestures
- LLUUID lib_gesture_cat_id =
- gInventory.findCategoryUUIDForType(LLFolderType::FT_GESTURE,false,true);
- if (lib_gesture_cat_id.isNull())
- {
- llwarns << "Unable to copy gestures, source category not found" << llendl;
- }
- LLUUID dst_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_GESTURE);
-
- std::vector<std::string> gesture_folders_to_copy;
- gesture_folders_to_copy.push_back(MALE_GESTURES_FOLDER);
- gesture_folders_to_copy.push_back(FEMALE_GESTURES_FOLDER);
- gesture_folders_to_copy.push_back(COMMON_GESTURES_FOLDER);
- gesture_folders_to_copy.push_back(SPEECH_GESTURES_FOLDER);
- gesture_folders_to_copy.push_back(OTHER_GESTURES_FOLDER);
-
- for(std::vector<std::string>::iterator it = gesture_folders_to_copy.begin();
- it != gesture_folders_to_copy.end();
- ++it)
- {
- std::string& folder_name = *it;
-
- LLPointer<LLInventoryCallback> cb(NULL);
-
- if (folder_name == same_gender_gestures ||
- folder_name == COMMON_GESTURES_FOLDER ||
- folder_name == OTHER_GESTURES_FOLDER)
- {
- cb = new ActivateGestureCallback;
- }
-
-
- LLUUID cat_id = findDescendentCategoryIDByName(lib_gesture_cat_id,folder_name);
- if (cat_id.isNull())
- {
- llwarns << "failed to find gesture folder for " << folder_name << llendl;
- }
- else
- {
- llinfos << "initiating fetch and copy for " << folder_name << " cat_id " << cat_id << llendl;
- LLAppearanceMgr* app_mgr = LLAppearanceMgr::getInstance();
- callAfterCategoryFetch(cat_id,
- boost::bind(&LLAppearanceMgr::shallowCopyCategory,
- app_mgr,
- cat_id,
- dst_id,
- cb));
- }
- }
-}
-
void LLStartUp::loadInitialOutfit( const std::string& outfit_folder_name,
const std::string& gender_name )
{
- llinfos << "starting" << llendl;
+ lldebugs << "starting" << llendl;
// Not going through the processAgentInitialWearables path, so need to set this here.
LLAppearanceMgr::instance().setAttachmentInvLinkEnable(true);
// Initiate creation of COF, since we're also bypassing that.
gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
- S32 gender = 0;
- std::string same_gender_gestures;
+ ESex gender;
if (gender_name == "male")
{
- gender = OPT_MALE;
- same_gender_gestures = MALE_GESTURES_FOLDER;
+ lldebugs << "male" << llendl;
+ gender = SEX_MALE;
}
else
{
- gender = OPT_FEMALE;
- same_gender_gestures = FEMALE_GESTURES_FOLDER;
+ lldebugs << "female" << llendl;
+ gender = SEX_FEMALE;
}
+ if (!isAgentAvatarValid())
+ {
+ llwarns << "Trying to load an initial outfit for an invalid agent avatar" << llendl;
+ return;
+ }
+
+ gAgentAvatarp->setSex(gender);
+
// try to find the outfit - if not there, create some default
// wearables.
LLUUID cat_id = findDescendentCategoryIDByName(
@@ -2456,7 +2554,8 @@ void LLStartUp::loadInitialOutfit( const std::string& outfit_folder_name,
outfit_folder_name);
if (cat_id.isNull())
{
- gAgentWearables.createStandardWearables(gender);
+ lldebugs << "standard wearables" << llendl;
+ gAgentWearables.createStandardWearables();
}
else
{
@@ -2466,26 +2565,28 @@ void LLStartUp::loadInitialOutfit( const std::string& outfit_folder_name,
bool do_append = false;
LLViewerInventoryCategory *cat = gInventory.getCategory(cat_id);
LLAppearanceMgr::instance().wearInventoryCategory(cat, do_copy, do_append);
+ lldebugs << "initial outfit category id: " << cat_id << llendl;
}
- // Copy gestures
- copyLibraryGestures(same_gender_gestures);
-
// This is really misnamed -- it means we have started loading
// an outfit/shape that will give the avatar a gender eventually. JC
gAgent.setGenderChosen(TRUE);
-
}
//static
void LLStartUp::saveInitialOutfit()
{
- if (sInitialOutfit.empty()) return;
+ if (sInitialOutfit.empty()) {
+ lldebugs << "sInitialOutfit is empty" << llendl;
+ return;
+ }
if (sWearablesLoadedCon.connected())
{
+ lldebugs << "sWearablesLoadedCon is connected, disconnecting" << llendl;
sWearablesLoadedCon.disconnect();
}
+ lldebugs << "calling makeNewOutfitLinks( \"" << sInitialOutfit << "\" )" << llendl;
LLAppearanceMgr::getInstance()->makeNewOutfitLinks(sInitialOutfit,false);
}
@@ -2528,22 +2629,32 @@ void init_start_screen(S32 location_id)
else if(!start_image_bmp->load(temp_str) )
{
LL_WARNS("AppInit") << "Bitmap load failed" << LL_ENDL;
- return;
+ gStartTexture = NULL;
}
+ else
+ {
+ gStartImageWidth = start_image_bmp->getWidth();
+ gStartImageHeight = start_image_bmp->getHeight();
- gStartImageWidth = start_image_bmp->getWidth();
- gStartImageHeight = start_image_bmp->getHeight();
+ LLPointer<LLImageRaw> raw = new LLImageRaw;
+ if (!start_image_bmp->decode(raw, 0.0f))
+ {
+ LL_WARNS("AppInit") << "Bitmap decode failed" << LL_ENDL;
+ gStartTexture = NULL;
+ }
+ else
+ {
+ raw->expandToPowerOfTwo();
+ gStartTexture = LLViewerTextureManager::getLocalTexture(raw.get(), FALSE) ;
+ }
+ }
- LLPointer<LLImageRaw> raw = new LLImageRaw;
- if (!start_image_bmp->decode(raw, 0.0f))
+ if(gStartTexture.isNull())
{
- LL_WARNS("AppInit") << "Bitmap decode failed" << LL_ENDL;
- gStartTexture = NULL;
- return;
+ gStartTexture = LLViewerTexture::sBlackImagep ;
+ gStartImageWidth = gStartTexture->getWidth() ;
+ gStartImageHeight = gStartTexture->getHeight() ;
}
-
- raw->expandToPowerOfTwo();
- gStartTexture = LLViewerTextureManager::getLocalTexture(raw.get(), FALSE) ;
}
@@ -2682,12 +2793,12 @@ void LLStartUp::cleanupNameCache()
bool LLStartUp::dispatchURL()
{
// ok, if we've gotten this far and have a startup URL
- if (!getStartSLURL().isValid())
+ if (!getStartSLURL().isValid())
{
return false;
}
- if(getStartSLURL().getType() != LLSLURL::APP)
- {
+ if(getStartSLURL().getType() != LLSLURL::APP)
+ {
// If we started with a location, but we're already
// at that location, don't pop dialogs open.
@@ -2701,7 +2812,7 @@ bool LLStartUp::dispatchURL()
|| (dx*dx > SLOP*SLOP)
|| (dy*dy > SLOP*SLOP) )
{
- LLURLDispatcher::dispatch(getStartSLURL().getSLURLString(),
+ LLURLDispatcher::dispatch(getStartSLURL().getSLURLString(), "clicked",
NULL, false);
}
return true;
@@ -2730,6 +2841,171 @@ void LLStartUp::setStartSLURL(const LLSLURL& slurl)
}
}
+/**
+ * Read all proxy configuration settings and set up both the HTTP proxy and
+ * SOCKS proxy as needed.
+ *
+ * Any errors that are encountered will result in showing the user a notification.
+ * When an error is encountered,
+ *
+ * @return Returns true if setup was successful, false if an error was encountered.
+ */
+bool LLStartUp::startLLProxy()
+{
+ bool proxy_ok = true;
+ std::string httpProxyType = gSavedSettings.getString("HttpProxyType");
+
+ // Set up SOCKS proxy (if needed)
+ if (gSavedSettings.getBOOL("Socks5ProxyEnabled"))
+ {
+ // Determine and update LLProxy with the saved authentication system
+ std::string auth_type = gSavedSettings.getString("Socks5AuthType");
+
+ if (auth_type.compare("UserPass") == 0)
+ {
+ LLPointer<LLCredential> socks_cred = gSecAPIHandler->loadCredential("SOCKS5");
+ std::string socks_user = socks_cred->getIdentifier()["username"].asString();
+ std::string socks_password = socks_cred->getAuthenticator()["creds"].asString();
+
+ bool ok = LLProxy::getInstance()->setAuthPassword(socks_user, socks_password);
+
+ if (!ok)
+ {
+ LLNotificationsUtil::add("SOCKS_BAD_CREDS");
+ proxy_ok = false;
+ }
+ }
+ else if (auth_type.compare("None") == 0)
+ {
+ LLProxy::getInstance()->setAuthNone();
+ }
+ else
+ {
+ LL_WARNS("Proxy") << "Invalid SOCKS 5 authentication type."<< LL_ENDL;
+
+ // Unknown or missing setting.
+ gSavedSettings.setString("Socks5AuthType", "None");
+
+ // Clear the SOCKS credentials.
+ LLPointer<LLCredential> socks_cred = new LLCredential("SOCKS5");
+ gSecAPIHandler->deleteCredential(socks_cred);
+
+ LLProxy::getInstance()->setAuthNone();
+ }
+
+ if (proxy_ok)
+ {
+ // Start the proxy and check for errors
+ // If status != SOCKS_OK, stopSOCKSProxy() will already have been called when startSOCKSProxy() returns.
+ LLHost socks_host;
+ socks_host.setHostByName(gSavedSettings.getString("Socks5ProxyHost"));
+ socks_host.setPort(gSavedSettings.getU32("Socks5ProxyPort"));
+ int status = LLProxy::getInstance()->startSOCKSProxy(socks_host);
+
+ if (status != SOCKS_OK)
+ {
+ LLSD subs;
+ subs["HOST"] = gSavedSettings.getString("Socks5ProxyHost");
+ subs["PORT"] = (S32)gSavedSettings.getU32("Socks5ProxyPort");
+
+ std::string error_string;
+
+ switch(status)
+ {
+ case SOCKS_CONNECT_ERROR: // TCP Fail
+ error_string = "SOCKS_CONNECT_ERROR";
+ break;
+
+ case SOCKS_NOT_PERMITTED: // SOCKS 5 server rule set refused connection
+ error_string = "SOCKS_NOT_PERMITTED";
+ break;
+
+ case SOCKS_NOT_ACCEPTABLE: // Selected authentication is not acceptable to server
+ error_string = "SOCKS_NOT_ACCEPTABLE";
+ break;
+
+ case SOCKS_AUTH_FAIL: // Authentication failed
+ error_string = "SOCKS_AUTH_FAIL";
+ break;
+
+ case SOCKS_UDP_FWD_NOT_GRANTED: // UDP forward request failed
+ error_string = "SOCKS_UDP_FWD_NOT_GRANTED";
+ break;
+
+ case SOCKS_HOST_CONNECT_FAILED: // Failed to open a TCP channel to the socks server
+ error_string = "SOCKS_HOST_CONNECT_FAILED";
+ break;
+
+ case SOCKS_INVALID_HOST: // Improperly formatted host address or port.
+ error_string = "SOCKS_INVALID_HOST";
+ break;
+
+ default:
+ error_string = "SOCKS_UNKNOWN_STATUS"; // Something strange happened,
+ LL_WARNS("Proxy") << "Unknown return from LLProxy::startProxy(): " << status << LL_ENDL;
+ break;
+ }
+
+ LLNotificationsUtil::add(error_string, subs);
+ proxy_ok = false;
+ }
+ }
+ }
+ else
+ {
+ LLProxy::getInstance()->stopSOCKSProxy(); // ensure no UDP proxy is running and it's all cleaned up
+ }
+
+ if (proxy_ok)
+ {
+ // Determine the HTTP proxy type (if any)
+ if ((httpProxyType.compare("Web") == 0) && gSavedSettings.getBOOL("BrowserProxyEnabled"))
+ {
+ LLHost http_host;
+ http_host.setHostByName(gSavedSettings.getString("BrowserProxyAddress"));
+ http_host.setPort(gSavedSettings.getS32("BrowserProxyPort"));
+ if (!LLProxy::getInstance()->enableHTTPProxy(http_host, LLPROXY_HTTP))
+ {
+ LLSD subs;
+ subs["HOST"] = http_host.getIPString();
+ subs["PORT"] = (S32)http_host.getPort();
+ LLNotificationsUtil::add("PROXY_INVALID_HTTP_HOST", subs);
+ proxy_ok = false;
+ }
+ }
+ else if ((httpProxyType.compare("Socks") == 0) && gSavedSettings.getBOOL("Socks5ProxyEnabled"))
+ {
+ LLHost socks_host;
+ socks_host.setHostByName(gSavedSettings.getString("Socks5ProxyHost"));
+ socks_host.setPort(gSavedSettings.getU32("Socks5ProxyPort"));
+ if (!LLProxy::getInstance()->enableHTTPProxy(socks_host, LLPROXY_SOCKS))
+ {
+ LLSD subs;
+ subs["HOST"] = socks_host.getIPString();
+ subs["PORT"] = (S32)socks_host.getPort();
+ LLNotificationsUtil::add("PROXY_INVALID_SOCKS_HOST", subs);
+ proxy_ok = false;
+ }
+ }
+ else if (httpProxyType.compare("None") == 0)
+ {
+ LLProxy::getInstance()->disableHTTPProxy();
+ }
+ else
+ {
+ LL_WARNS("Proxy") << "Invalid other HTTP proxy configuration."<< LL_ENDL;
+
+ // Set the missing or wrong configuration back to something valid.
+ gSavedSettings.setString("HttpProxyType", "None");
+ LLProxy::getInstance()->disableHTTPProxy();
+
+ // Leave proxy_ok alone, since this isn't necessarily fatal.
+ }
+ }
+
+ return proxy_ok;
+}
+
bool login_alert_done(const LLSD& notification, const LLSD& response)
{
LLPanelLogin::giveFocus();
@@ -2862,9 +3138,17 @@ bool process_login_success_response()
if(!text.empty()) gAgentID.set(text);
gDebugInfo["AgentID"] = text;
+ // Agent id needed for parcel info request in LLUrlEntryParcel
+ // to resolve parcel name.
+ LLUrlEntryParcel::setAgentID(gAgentID);
+
text = response["session_id"].asString();
if(!text.empty()) gAgentSessionID.set(text);
gDebugInfo["SessionID"] = text;
+
+ // Session id needed for parcel info request in LLUrlEntryParcel
+ // to resolve parcel name.
+ LLUrlEntryParcel::setSessionID(gAgentSessionID);
text = response["secure_session_id"].asString();
if(!text.empty()) gAgent.mSecureSessionID.set(text);
@@ -3072,10 +3356,24 @@ bool process_login_success_response()
}
// Request the map server url
+ // Non-agni grids have a different default location.
+ if (!LLGridManager::getInstance()->isInProductionGrid())
+ {
+ gSavedSettings.setString("MapServerURL", "http://test.map.secondlife.com.s3.amazonaws.com/");
+ }
std::string map_server_url = response["map-server-url"];
if(!map_server_url.empty())
{
- gSavedSettings.setString("MapServerURL", map_server_url);
+ // We got an answer from the grid -> use that for map for the current session
+ gSavedSettings.setString("CurrentMapServerURL", map_server_url);
+ LL_INFOS("LLStartup") << "map-server-url : we got an answer from the grid : " << map_server_url << LL_ENDL;
+ }
+ else
+ {
+ // No answer from the grid -> use the default setting for current session
+ map_server_url = gSavedSettings.getString("MapServerURL");
+ gSavedSettings.setString("CurrentMapServerURL", map_server_url);
+ LL_INFOS("LLStartup") << "map-server-url : no map-server-url answer, we use the default setting for the map : " << map_server_url << LL_ENDL;
}
// Default male and female avatars allowing the user to choose their avatar on first login.
@@ -3092,8 +3390,6 @@ bool process_login_success_response()
}
// Initial outfit for the user.
- // QUESTION: Why can't we simply simply set the users outfit directly
- // from a web page into the user info on the server? - Roxie
LLSD initial_outfit = response["initial-outfit"][0];
if(initial_outfit.size())
{
@@ -3130,11 +3426,6 @@ bool process_login_success_response()
gMoonTextureID = id;
}
- id = global_textures["cloud_texture_id"];
- if(id.notNull())
- {
- gCloudTextureID = id;
- }
}
// Set the location of the snapshot sharing config endpoint
@@ -3181,7 +3472,7 @@ bool process_login_success_response()
void transition_back_to_login_panel(const std::string& emsg)
{
- if (gNoRender)
+ if (gHeadlessClient && gSavedSettings.getBOOL("AutoLogin"))
{
LL_WARNS("AppInit") << "Failed to login!" << LL_ENDL;
LL_WARNS("AppInit") << emsg << LL_ENDL;
diff --git a/indra/newview/llstartup.h b/indra/newview/llstartup.h
index b3d9ef1dcc..0a18ef1b2d 100644
--- a/indra/newview/llstartup.h
+++ b/indra/newview/llstartup.h
@@ -90,8 +90,6 @@ public:
static void initNameCache();
- static void copyLibraryGestures(const std::string& same_gender_gestures);
-
static void cleanupNameCache();
// outfit_folder_name can be a folder anywhere in your inventory,
@@ -113,6 +111,8 @@ public:
static void setStartSLURL(const LLSLURL& slurl);
static LLSLURL& getStartSLURL() { return sStartSLURL; }
+ static bool startLLProxy(); // Initialize the SOCKS 5 proxy
+
private:
static LLSLURL sStartSLURL;
diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp
index e9fc25404a..89240c982f 100644
--- a/indra/newview/llstatusbar.cpp
+++ b/indra/newview/llstatusbar.cpp
@@ -114,7 +114,9 @@ LLStatusBar::LLStatusBar(const LLRect& rect)
mTextTime(NULL),
mSGBandwidth(NULL),
mSGPacketLoss(NULL),
+ mBtnStats(NULL),
mBtnVolume(NULL),
+ mBoxBalance(NULL),
mBalance(0),
mHealth(100),
mSquareMetersCredit(0),
@@ -168,6 +170,13 @@ BOOL LLStatusBar::postBuild()
getChild<LLUICtrl>("buyL")->setCommitCallback(
boost::bind(&LLStatusBar::onClickBuyCurrency, this));
+ getChild<LLUICtrl>("goShop")->setCommitCallback(boost::bind(&LLWeb::loadURLExternal, gSavedSettings.getString("MarketplaceURL")));
+
+ mBoxBalance = getChild<LLTextBox>("balance");
+ mBoxBalance->setClickedCallback( &LLStatusBar::onClickBalance, this );
+
+ mBtnStats = getChildView("stat_btn");
+
mBtnVolume = getChild<LLButton>( "volume_btn" );
mBtnVolume->setClickedCallback( onClickVolume, this );
mBtnVolume->setMouseEnterCallback(boost::bind(&LLStatusBar::onMouseEnterVolume, this));
@@ -282,7 +291,7 @@ void LLStatusBar::refresh()
mSGBandwidth->setVisible(net_stats_visible);
mSGPacketLoss->setVisible(net_stats_visible);
- getChildView("stat_btn")->setEnabled(net_stats_visible);
+ mBtnStats->setEnabled(net_stats_visible);
// update the master volume button state
bool mute_audio = LLAppViewer::instance()->getMasterSystemAudioMute();
@@ -304,6 +313,7 @@ void LLStatusBar::setVisibleForMouselook(bool visible)
{
mTextTime->setVisible(visible);
getChild<LLUICtrl>("balance_bg")->setVisible(visible);
+ mBoxBalance->setVisible(visible);
mBtnVolume->setVisible(visible);
mMediaToggle->setVisible(visible);
mSGBandwidth->setVisible(visible);
@@ -330,20 +340,20 @@ void LLStatusBar::setBalance(S32 balance)
std::string money_str = LLResMgr::getInstance()->getMonetaryString( balance );
- LLTextBox* balance_box = getChild<LLTextBox>("balance");
LLStringUtil::format_map_t string_args;
string_args["[AMT]"] = llformat("%s", money_str.c_str());
std::string label_str = getString("buycurrencylabel", string_args);
- balance_box->setValue(label_str);
+ mBoxBalance->setValue(label_str);
// Resize the L$ balance background to be wide enough for your balance plus the buy button
{
const S32 HPAD = 24;
- LLRect balance_rect = balance_box->getTextBoundingRect();
+ LLRect balance_rect = mBoxBalance->getTextBoundingRect();
LLRect buy_rect = getChildView("buyL")->getRect();
+ LLRect shop_rect = getChildView("goShop")->getRect();
LLView* balance_bg_view = getChildView("balance_bg");
LLRect balance_bg_rect = balance_bg_view->getRect();
- balance_bg_rect.mLeft = balance_bg_rect.mRight - (buy_rect.getWidth() + balance_rect.getWidth() + HPAD);
+ balance_bg_rect.mLeft = balance_bg_rect.mRight - (buy_rect.getWidth() + shop_rect.getWidth() + balance_rect.getWidth() + HPAD);
balance_bg_view->setShape(balance_bg_rect);
}
@@ -506,6 +516,14 @@ static void onClickVolume(void* data)
}
//static
+void LLStatusBar::onClickBalance(void* )
+{
+ // Force a balance request message:
+ LLStatusBar::sendMoneyBalanceRequest();
+ // The refresh of the display (call to setBalance()) will be done by process_money_balance_reply()
+}
+
+//static
void LLStatusBar::onClickMediaToggle(void* data)
{
LLStatusBar *status_bar = (LLStatusBar*)data;
diff --git a/indra/newview/llstatusbar.h b/indra/newview/llstatusbar.h
index 2388aeb0c8..9d28e6c2bc 100644
--- a/indra/newview/llstatusbar.h
+++ b/indra/newview/llstatusbar.h
@@ -94,6 +94,7 @@ private:
void onClickScreen(S32 x, S32 y);
static void onClickMediaToggle(void* data);
+ static void onClickBalance(void* data);
private:
LLTextBox *mTextTime;
@@ -101,9 +102,11 @@ private:
LLStatGraph *mSGBandwidth;
LLStatGraph *mSGPacketLoss;
+ LLView *mBtnStats;
LLButton *mBtnVolume;
+ LLTextBox *mBoxBalance;
LLButton *mMediaToggle;
- LLView* mScriptOut;
+ LLView *mScriptOut;
LLFrameTimer mClockUpdateTimer;
S32 mBalance;
diff --git a/indra/newview/llsurface.cpp b/indra/newview/llsurface.cpp
index 6fc8153b77..66df7dae3e 100644
--- a/indra/newview/llsurface.cpp
+++ b/indra/newview/llsurface.cpp
@@ -334,17 +334,23 @@ void LLSurface::setOriginGlobal(const LLVector3d &origin_global)
}
}
+void LLSurface::getNeighboringRegions( std::vector<LLViewerRegion*>& uniqueRegions )
+{
+ S32 i;
+ for (i = 0; i < 8; i++)
+ {
+ if ( mNeighbors[i] != NULL )
+ {
+ uniqueRegions.push_back( mNeighbors[i]->getRegion() );
+ }
+ }
+}
void LLSurface::connectNeighbor(LLSurface *neighborp, U32 direction)
{
S32 i;
LLSurfacePatch *patchp, *neighbor_patchp;
- if (gNoRender)
- {
- return;
- }
-
mNeighbors[direction] = neighborp;
neighborp->mNeighbors[gDirOpposite[direction]] = this;
diff --git a/indra/newview/llsurface.h b/indra/newview/llsurface.h
index 673ee83fe3..a4ef4fe2de 100644
--- a/indra/newview/llsurface.h
+++ b/indra/newview/llsurface.h
@@ -140,6 +140,9 @@ public:
friend class LLSurfacePatch;
friend std::ostream& operator<<(std::ostream &s, const LLSurface &S);
+
+ void getNeighboringRegions( std::vector<LLViewerRegion*>& uniqueRegions );
+
public:
// Number of grid points on one side of a region, including +1 buffer for
// north and east edge.
diff --git a/indra/newview/llsurfacepatch.cpp b/indra/newview/llsurfacepatch.cpp
index 1d57e27616..5077c2c7e1 100644
--- a/indra/newview/llsurfacepatch.cpp
+++ b/indra/newview/llsurfacepatch.cpp
@@ -854,8 +854,10 @@ void LLSurfacePatch::updateVisibility()
F32 stride_per_distance = DEFAULT_DELTA_ANGLE / mSurfacep->getMetersPerGrid();
U32 grids_per_patch_edge = mSurfacep->getGridsPerPatchEdge();
- LLVector3 center = mCenterRegion + mSurfacep->getOriginAgent();
- LLVector3 radius = LLVector3(mRadius, mRadius, mRadius);
+ LLVector4a center;
+ center.load3( (mCenterRegion + mSurfacep->getOriginAgent()).mV);
+ LLVector4a radius;
+ radius.splat(mRadius);
// sphere in frustum on global coordinates
if (LLViewerCamera::getInstance()->AABBInFrustumNoFarClip(center, radius))
diff --git a/indra/newview/llsyswellwindow.cpp b/indra/newview/llsyswellwindow.cpp
index e7b5c13860..0cb6c85012 100644
--- a/indra/newview/llsyswellwindow.cpp
+++ b/indra/newview/llsyswellwindow.cpp
@@ -35,16 +35,17 @@
#include "llfloaterreg.h"
#include "llnotifications.h"
-#include "llbottomtray.h"
#include "llscriptfloater.h"
#include "llviewercontrol.h"
#include "llviewerwindow.h"
#include "llchiclet.h"
+#include "llchicletbar.h"
#include "lltoastpanel.h"
#include "llnotificationmanager.h"
#include "llnotificationsutil.h"
#include "llspeakers.h"
+#include "lltoolbarview.h"
//---------------------------------------------------------------------------------
LLSysWellWindow::LLSysWellWindow(const LLSD& key) : LLTransientDockableFloater(NULL, true, key),
@@ -140,15 +141,6 @@ void LLSysWellWindow::initChannel()
}
//---------------------------------------------------------------------------------
-void LLSysWellWindow::getAllowedRect(LLRect& rect)
-{
- rect = gViewerWindow->getWorldViewRectScaled();
-}
-
-//---------------------------------------------------------------------------------
-
-
-//---------------------------------------------------------------------------------
void LLSysWellWindow::setVisible(BOOL visible)
{
if (visible)
@@ -156,8 +148,8 @@ void LLSysWellWindow::setVisible(BOOL visible)
if (NULL == getDockControl() && getDockTongue().notNull())
{
setDockControl(new LLDockControl(
- LLBottomTray::getInstance()->getChild<LLView>(getAnchorViewName()), this,
- getDockTongue(), LLDockControl::TOP, boost::bind(&LLSysWellWindow::getAllowedRect, this, _1)));
+ LLChicletBar::getInstance()->getChild<LLView>(getAnchorViewName()), this,
+ getDockTongue(), LLDockControl::BOTTOM));
}
}
@@ -167,6 +159,7 @@ void LLSysWellWindow::setVisible(BOOL visible)
LLTransientDockableFloater::setVisible(visible);
// update notification channel state
+ initChannel(); // make sure the channel still exists
if(mChannel)
{
mChannel->updateShowToastsState();
@@ -211,10 +204,9 @@ void LLSysWellWindow::reshapeWindow()
{
new_window_height = MAX_WINDOW_HEIGHT;
}
- S32 newY = curRect.mTop + new_window_height - curRect.getHeight();
- S32 newWidth = curRect.getWidth() < MIN_WINDOW_WIDTH ? MIN_WINDOW_WIDTH
- : curRect.getWidth();
- curRect.setLeftTopAndSize(curRect.mLeft, newY, newWidth, new_window_height);
+ S32 newWidth = curRect.getWidth() < MIN_WINDOW_WIDTH ? MIN_WINDOW_WIDTH : curRect.getWidth();
+
+ curRect.setLeftTopAndSize(curRect.mLeft, curRect.mTop, newWidth, new_window_height);
reshape(curRect.getWidth(), curRect.getHeight(), TRUE);
setRect(curRect);
}
@@ -310,7 +302,7 @@ void LLIMWellWindow::RowPanel::onChicletSizeChanged(LLChiclet* ctrl, const LLSD&
S32 new_text_left = mChiclet->getRect().mRight + CHICLET_HPAD;
LLRect text_rect = text->getRect();
text_rect.mLeft = new_text_left;
- text->setRect(text_rect);
+ text->setShape(text_rect);
}
//---------------------------------------------------------------------------------
@@ -607,6 +599,13 @@ LLIMWellWindow* LLIMWellWindow::getInstance(const LLSD& key /*= LLSD()*/)
return LLFloaterReg::getTypedInstance<LLIMWellWindow>("im_well_window", key);
}
+
+// static
+LLIMWellWindow* LLIMWellWindow::findInstance(const LLSD& key /*= LLSD()*/)
+{
+ return LLFloaterReg::findTypedInstance<LLIMWellWindow>("im_well_window", key);
+}
+
BOOL LLIMWellWindow::postBuild()
{
BOOL rv = LLSysWellWindow::postBuild();
@@ -760,7 +759,10 @@ void LLIMWellWindow::removeObjectRow(const LLUUID& notification_id)
{
if (mMessageList->removeItemByValue(notification_id))
{
- mSysWellChiclet->updateWidget(isWindowEmpty());
+ if (mSysWellChiclet)
+ {
+ mSysWellChiclet->updateWidget(isWindowEmpty());
+ }
}
else
{
diff --git a/indra/newview/llsyswellwindow.h b/indra/newview/llsyswellwindow.h
index 9f8ab01810..272e9cfcb1 100644
--- a/indra/newview/llsyswellwindow.h
+++ b/indra/newview/llsyswellwindow.h
@@ -76,11 +76,6 @@ public:
static const S32 MIN_WINDOW_WIDTH = 318;
protected:
-
- // gets a rect that bounds possible positions for the SysWellWindow on a screen (EXT-1111)
- void getAllowedRect(LLRect& rect);
-
-
// init Window's channel
virtual void initChannel();
@@ -158,6 +153,7 @@ public:
~LLIMWellWindow();
static LLIMWellWindow* getInstance(const LLSD& key = LLSD());
+ static LLIMWellWindow* findInstance(const LLSD& key = LLSD());
static void initClass() { getInstance(); }
/*virtual*/ BOOL postBuild();
diff --git a/indra/newview/llteleporthistory.cpp b/indra/newview/llteleporthistory.cpp
index 0d8b45db1f..50a088b799 100644
--- a/indra/newview/llteleporthistory.cpp
+++ b/indra/newview/llteleporthistory.cpp
@@ -56,7 +56,8 @@ const std::string& LLTeleportHistoryItem::getTitle() const
LLTeleportHistory::LLTeleportHistory():
mCurrentItem(-1),
mRequestedItem(-1),
- mGotInitialUpdate(false)
+ mGotInitialUpdate(false),
+ mTeleportHistoryStorage(NULL)
{
mTeleportFinishedConn = LLViewerParcelMgr::getInstance()->
setTeleportFinishedCallback(boost::bind(&LLTeleportHistory::updateCurrentLocation, this, _1));
@@ -115,6 +116,10 @@ void LLTeleportHistory::handleLoginComplete()
void LLTeleportHistory::updateCurrentLocation(const LLVector3d& new_pos)
{
+ if (!mTeleportHistoryStorage)
+ {
+ mTeleportHistoryStorage = LLTeleportHistoryStorage::getInstance();
+ }
if (mRequestedItem != -1) // teleport within the history in progress?
{
mCurrentItem = mRequestedItem;
@@ -152,7 +157,7 @@ void LLTeleportHistory::updateCurrentLocation(const LLVector3d& new_pos)
if (mCurrentItem < 0 || mCurrentItem >= (int) mItems.size()) // sanity check
{
llwarns << "Invalid current item. (this should not happen)" << llendl;
- llassert(!"Invalid current teleport histiry item");
+ llassert(!"Invalid current teleport history item");
return;
}
LLVector3 new_pos_local = gAgent.getPosAgentFromGlobal(new_pos);
diff --git a/indra/newview/llteleporthistory.h b/indra/newview/llteleporthistory.h
index e45dc28f9b..e9c29c39bf 100644
--- a/indra/newview/llteleporthistory.h
+++ b/indra/newview/llteleporthistory.h
@@ -33,6 +33,7 @@
#include <string>
#include <boost/function.hpp>
#include <boost/signals2.hpp>
+#include "llteleporthistorystorage.h"
/**
@@ -210,6 +211,8 @@ private:
*/
bool mGotInitialUpdate;
+ LLTeleportHistoryStorage* mTeleportHistoryStorage;
+
/**
* Signal emitted when the history gets changed.
*
diff --git a/indra/newview/llteleporthistorystorage.cpp b/indra/newview/llteleporthistorystorage.cpp
index 0ba455e7d5..af5a047da4 100644
--- a/indra/newview/llteleporthistorystorage.cpp
+++ b/indra/newview/llteleporthistorystorage.cpp
@@ -66,6 +66,7 @@ struct LLSortItemsByDate
LLTeleportHistoryStorage::LLTeleportHistoryStorage() :
mFilename("teleport_history.txt")
{
+ mItems.clear();
LLTeleportHistory *th = LLTeleportHistory::getInstance();
if (th)
th->setHistoryChangedCallback(boost::bind(&LLTeleportHistoryStorage::onTeleportHistoryChange, this));
diff --git a/indra/newview/llteleporthistorystorage.h b/indra/newview/llteleporthistorystorage.h
index 6cae0a3454..cf4c85a991 100644
--- a/indra/newview/llteleporthistorystorage.h
+++ b/indra/newview/llteleporthistorystorage.h
@@ -93,9 +93,6 @@ public:
void removeItem(S32 idx);
void save();
- void load();
-
- void dump() const;
/**
* Set a callback to be called upon history changes.
@@ -113,6 +110,9 @@ public:
private:
+ void load();
+ void dump() const;
+
void onTeleportHistoryChange();
bool compareByTitleAndGlobalPos(const LLTeleportHistoryPersistentItem& a, const LLTeleportHistoryPersistentItem& b);
diff --git a/indra/newview/lltexlayer.cpp b/indra/newview/lltexlayer.cpp
index 500c2a7b86..6f6d5dbf12 100644
--- a/indra/newview/lltexlayer.cpp
+++ b/indra/newview/lltexlayer.cpp
@@ -45,12 +45,16 @@
#include "llagentwearables.h"
#include "llwearable.h"
#include "llviewercontrol.h"
+#include "llviewershadermgr.h"
#include "llviewervisualparam.h"
//#include "../tools/imdebug/imdebug.h"
using namespace LLVOAvatarDefines;
+static const S32 BAKE_UPLOAD_ATTEMPTS = 7;
+static const F32 BAKE_UPLOAD_RETRY_DELAY = 2.f; // actual delay grows by power of 2 each attempt
+
class LLTexLayerInfo
{
friend class LLTexLayer;
@@ -93,11 +97,13 @@ private:
//-----------------------------------------------------------------------------
LLBakedUploadData::LLBakedUploadData(const LLVOAvatarSelf* avatar,
LLTexLayerSet* layerset,
- const LLUUID& id) :
+ const LLUUID& id,
+ bool highest_res) :
mAvatar(avatar),
mTexLayerSet(layerset),
mID(id),
- mStartTime(LLFrameTimer::getTotalTime()) // Record starting time
+ mStartTime(LLFrameTimer::getTotalTime()), // Record starting time
+ mIsHighestRes(highest_res)
{
}
@@ -116,6 +122,7 @@ LLTexLayerSetBuffer::LLTexLayerSetBuffer(LLTexLayerSet* const owner,
mUploadPending(FALSE), // Not used for any logic here, just to sync sending of updates
mNeedsUpload(FALSE),
mNumLowresUploads(0),
+ mUploadFailCount(0),
mNeedsUpdate(TRUE),
mNumLowresUpdates(0),
mTexLayerSet(owner)
@@ -204,26 +211,27 @@ void LLTexLayerSetBuffer::cancelUpload()
mNeedsUpload = FALSE;
mUploadPending = FALSE;
mNeedsUploadTimer.pause();
+ mUploadRetryTimer.reset();
}
void LLTexLayerSetBuffer::pushProjection() const
{
- glMatrixMode(GL_PROJECTION);
+ gGL.matrixMode(LLRender::MM_PROJECTION);
gGL.pushMatrix();
- glLoadIdentity();
- glOrtho(0.0f, mFullWidth, 0.0f, mFullHeight, -1.0f, 1.0f);
+ gGL.loadIdentity();
+ gGL.ortho(0.0f, mFullWidth, 0.0f, mFullHeight, -1.0f, 1.0f);
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.pushMatrix();
- glLoadIdentity();
+ gGL.loadIdentity();
}
void LLTexLayerSetBuffer::popProjection() const
{
- glMatrixMode(GL_PROJECTION);
+ gGL.matrixMode(LLRender::MM_PROJECTION);
gGL.popMatrix();
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.popMatrix();
}
@@ -286,6 +294,16 @@ BOOL LLTexLayerSetBuffer::render()
const BOOL update_now = mNeedsUpdate && isReadyToUpdate();
BOOL success = TRUE;
+
+ bool use_shaders = LLGLSLShader::sNoFixedFunction;
+
+ if (use_shaders)
+ {
+ gAlphaMaskProgram.bind();
+ gAlphaMaskProgram.setMinimumAlpha(0.004f);
+ }
+
+ LLVertexBuffer::unbind();
// Composite the color data
LLGLSUIDefault gls_ui;
@@ -321,6 +339,13 @@ BOOL LLTexLayerSetBuffer::render()
doUpdate();
}
+ if (use_shaders)
+ {
+ gAlphaMaskProgram.unbind();
+ }
+
+ LLVertexBuffer::unbind();
+
// reset GL state
gGL.setColorMask(true, true);
gGL.setSceneBlendType(LLRender::BT_ALPHA);
@@ -356,25 +381,38 @@ BOOL LLTexLayerSetBuffer::isReadyToUpload() const
if (!gAgentQueryManager.hasNoPendingQueries()) return FALSE; // Can't upload if there are pending queries.
if (isAgentAvatarValid() && !gAgentAvatarp->isUsingBakedTextures()) return FALSE; // Don't upload if avatar is using composites.
- // If we requested an upload and have the final LOD ready, then upload.
- if (mTexLayerSet->isLocalTextureDataFinal()) return TRUE;
-
- // Upload if we've hit a timeout. Upload is a pretty expensive process so we need to make sure
- // we aren't doing uploads too frequently.
- const U32 texture_timeout = gSavedSettings.getU32("AvatarBakedTextureUploadTimeout");
- if (texture_timeout != 0)
+ BOOL ready = FALSE;
+ if (mTexLayerSet->isLocalTextureDataFinal())
{
- // The timeout period increases exponentially between every lowres upload in order to prevent
- // spamming the server with frequent uploads.
- const U32 texture_timeout_threshold = texture_timeout*(1 << mNumLowresUploads);
+ // If we requested an upload and have the final LOD ready, upload (or wait a while if this is a retry)
+ if (mUploadFailCount == 0)
+ {
+ ready = TRUE;
+ }
+ else
+ {
+ ready = mUploadRetryTimer.getElapsedTimeF32() >= BAKE_UPLOAD_RETRY_DELAY * (1 << (mUploadFailCount - 1));
+ }
+ }
+ else
+ {
+ // Upload if we've hit a timeout. Upload is a pretty expensive process so we need to make sure
+ // we aren't doing uploads too frequently.
+ const U32 texture_timeout = gSavedSettings.getU32("AvatarBakedTextureUploadTimeout");
+ if (texture_timeout != 0)
+ {
+ // The timeout period increases exponentially between every lowres upload in order to prevent
+ // spamming the server with frequent uploads.
+ const U32 texture_timeout_threshold = texture_timeout*(1 << mNumLowresUploads);
- // If we hit our timeout and have textures available at even lower resolution, then upload.
- const BOOL is_upload_textures_timeout = mNeedsUploadTimer.getElapsedTimeF32() >= texture_timeout_threshold;
- const BOOL has_lower_lod = mTexLayerSet->isLocalTextureDataAvailable();
- if (has_lower_lod && is_upload_textures_timeout) return TRUE;
+ // If we hit our timeout and have textures available at even lower resolution, then upload.
+ const BOOL is_upload_textures_timeout = mNeedsUploadTimer.getElapsedTimeF32() >= texture_timeout_threshold;
+ const BOOL has_lower_lod = mTexLayerSet->isLocalTextureDataAvailable();
+ ready = has_lower_lod && is_upload_textures_timeout;
+ }
}
- return FALSE;
+ return ready;
}
BOOL LLTexLayerSetBuffer::isReadyToUpdate() const
@@ -482,17 +520,20 @@ void LLTexLayerSetBuffer::doUpload()
if (valid)
{
+ const bool highest_lod = mTexLayerSet->isLocalTextureDataFinal();
// Baked_upload_data is owned by the responder and deleted after the request completes.
LLBakedUploadData* baked_upload_data = new LLBakedUploadData(gAgentAvatarp,
this->mTexLayerSet,
- asset_id);
+ asset_id,
+ highest_lod);
// upload ID is used to avoid overlaps, e.g. when the user rapidly makes two changes outside of Face Edit.
mUploadID = asset_id;
// Upload the image
const std::string url = gAgent.getRegion()->getCapability("UploadBakedTexture");
if(!url.empty()
- && !LLPipeline::sForceOldBakedUpload) // toggle debug setting UploadBakedTexOld to change between the new caps method and old method
+ && !LLPipeline::sForceOldBakedUpload // toggle debug setting UploadBakedTexOld to change between the new caps method and old method
+ && (mUploadFailCount < (BAKE_UPLOAD_ATTEMPTS - 1))) // Try last ditch attempt via asset store if cap upload is failing.
{
LLSD body = LLSD::emptyMap();
// The responder will call LLTexLayerSetBuffer::onTextureUploadComplete()
@@ -511,7 +552,6 @@ void LLTexLayerSetBuffer::doUpload()
llinfos << "Baked texture upload via Asset Store." << llendl;
}
- const BOOL highest_lod = mTexLayerSet->isLocalTextureDataFinal();
if (highest_lod)
{
// Sending the final LOD for the baked texture. All done, pause
@@ -603,14 +643,15 @@ void LLTexLayerSetBuffer::onTextureUploadComplete(const LLUUID& uuid,
{
LLBakedUploadData* baked_upload_data = (LLBakedUploadData*)userdata;
- if ((result == 0) &&
- isAgentAvatarValid() &&
+ if (isAgentAvatarValid() &&
!gAgentAvatarp->isDead() &&
(baked_upload_data->mAvatar == gAgentAvatarp) && // Sanity check: only the user's avatar should be uploading textures.
(baked_upload_data->mTexLayerSet->hasComposite()))
{
LLTexLayerSetBuffer* layerset_buffer = baked_upload_data->mTexLayerSet->getComposite();
-
+ S32 failures = layerset_buffer->mUploadFailCount;
+ layerset_buffer->mUploadFailCount = 0;
+
if (layerset_buffer->mUploadID.isNull())
{
// The upload got canceled, we should be in the
@@ -626,20 +667,28 @@ void LLTexLayerSetBuffer::onTextureUploadComplete(const LLUUID& uuid,
{
// This is the upload we're currently waiting for.
layerset_buffer->mUploadID.setNull();
+ const std::string name(baked_upload_data->mTexLayerSet->getBodyRegionName());
+ const std::string resolution = baked_upload_data->mIsHighestRes ? " full res " : " low res ";
if (result >= 0)
{
- layerset_buffer->mUploadPending = FALSE;
+ layerset_buffer->mUploadPending = FALSE; // Allows sending of AgentSetAppearance later
LLVOAvatarDefines::ETextureIndex baked_te = gAgentAvatarp->getBakedTE(layerset_buffer->mTexLayerSet);
// Update baked texture info with the new UUID
U64 now = LLFrameTimer::getTotalTime(); // Record starting time
- llinfos << "Baked texture upload took " << (S32)((now - baked_upload_data->mStartTime) / 1000) << " ms" << llendl;
+ llinfos << "Baked" << resolution << "texture upload for " << name << " took " << (S32)((now - baked_upload_data->mStartTime) / 1000) << " ms" << llendl;
gAgentAvatarp->setNewBakedTexture(baked_te, uuid);
}
else
{
- // Avatar appearance is changing, ignore the upload results
- llinfos << "Baked upload failed. Reason: " << result << llendl;
- // *FIX: retry upload after n seconds, asset server could be busy
+ ++failures;
+ S32 max_attempts = baked_upload_data->mIsHighestRes ? BAKE_UPLOAD_ATTEMPTS : 1; // only retry final bakes
+ llwarns << "Baked" << resolution << "texture upload for " << name << " failed (attempt " << failures << "/" << max_attempts << ")" << llendl;
+ if (failures < max_attempts)
+ {
+ layerset_buffer->mUploadFailCount = failures;
+ layerset_buffer->mUploadRetryTimer.start();
+ layerset_buffer->requestUpload();
+ }
}
}
else
@@ -886,6 +935,8 @@ BOOL LLTexLayerSet::render( S32 x, S32 y, S32 width, S32 height )
}
}
+ bool use_shaders = LLGLSLShader::sNoFixedFunction;
+
LLGLSUIDefault gls_ui;
LLGLDepthTest gls_depth(GL_FALSE, GL_FALSE);
gGL.setColorMask(true, true);
@@ -894,12 +945,20 @@ BOOL LLTexLayerSet::render( S32 x, S32 y, S32 width, S32 height )
{
gGL.flush();
LLGLDisable no_alpha(GL_ALPHA_TEST);
+ if (use_shaders)
+ {
+ gAlphaMaskProgram.setMinimumAlpha(0.0f);
+ }
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
gGL.color4f( 0.f, 0.f, 0.f, 1.f );
gl_rect_2d_simple( width, height );
gGL.flush();
+ if (use_shaders)
+ {
+ gAlphaMaskProgram.setMinimumAlpha(0.004f);
+ }
}
if (mIsVisible)
@@ -926,6 +985,11 @@ BOOL LLTexLayerSet::render( S32 x, S32 y, S32 width, S32 height )
gGL.setSceneBlendType(LLRender::BT_REPLACE);
LLGLDisable no_alpha(GL_ALPHA_TEST);
+ if (use_shaders)
+ {
+ gAlphaMaskProgram.setMinimumAlpha(0.f);
+ }
+
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
gGL.color4f( 0.f, 0.f, 0.f, 0.f );
@@ -933,7 +997,10 @@ BOOL LLTexLayerSet::render( S32 x, S32 y, S32 width, S32 height )
gGL.setSceneBlendType(LLRender::BT_ALPHA);
gGL.flush();
-
+ if (use_shaders)
+ {
+ gAlphaMaskProgram.setMinimumAlpha(0.004f);
+ }
}
return success;
@@ -1040,13 +1107,14 @@ void LLTexLayerSet::renderAlphaMaskTextures(S32 x, S32 y, S32 width, S32 height,
{
const LLTexLayerSetInfo *info = getInfo();
+ bool use_shaders = LLGLSLShader::sNoFixedFunction;
+
gGL.setColorMask(false, true);
gGL.setSceneBlendType(LLRender::BT_REPLACE);
// (Optionally) replace alpha with a single component image from a tga file.
if (!info->mStaticAlphaFileName.empty())
{
- LLGLSNoAlphaTest gls_no_alpha_test;
gGL.flush();
{
LLViewerTexture* tex = LLTexLayerStaticImageList::getInstance()->getTexture(info->mStaticAlphaFileName, TRUE);
@@ -1065,12 +1133,20 @@ void LLTexLayerSet::renderAlphaMaskTextures(S32 x, S32 y, S32 width, S32 height,
// Set the alpha channel to one (clean up after previous blending)
gGL.flush();
LLGLDisable no_alpha(GL_ALPHA_TEST);
+ if (use_shaders)
+ {
+ gAlphaMaskProgram.setMinimumAlpha(0.f);
+ }
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
gGL.color4f( 0.f, 0.f, 0.f, 1.f );
gl_rect_2d_simple( width, height );
gGL.flush();
+ if (use_shaders)
+ {
+ gAlphaMaskProgram.setMinimumAlpha(0.004f);
+ }
}
// (Optional) Mask out part of the baked texture with alpha masks
@@ -1555,6 +1631,8 @@ BOOL LLTexLayer::render(S32 x, S32 y, S32 width, S32 height)
LLGLEnable color_mat(GL_COLOR_MATERIAL);
gPipeline.disableLights();
+ bool use_shaders = LLGLSLShader::sNoFixedFunction;
+
LLColor4 net_color;
BOOL color_specified = findNetColor(&net_color);
@@ -1635,8 +1713,13 @@ BOOL LLTexLayer::render(S32 x, S32 y, S32 width, S32 height)
{
if( tex )
{
- LLGLDisable alpha_test(getInfo()->mWriteAllChannels ? GL_ALPHA_TEST : 0);
-
+ bool no_alpha_test = getInfo()->mWriteAllChannels;
+ LLGLDisable alpha_test(no_alpha_test ? GL_ALPHA_TEST : 0);
+ if (use_shaders && no_alpha_test)
+ {
+ gAlphaMaskProgram.setMinimumAlpha(0.f);
+ }
+
LLTexUnit::eTextureAddressMode old_mode = tex->getAddressMode();
gGL.getTexUnit(0)->bind(tex, TRUE);
@@ -1646,6 +1729,11 @@ BOOL LLTexLayer::render(S32 x, S32 y, S32 width, S32 height)
gGL.getTexUnit(0)->setTextureAddressMode(old_mode);
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+ if (use_shaders && no_alpha_test)
+ {
+ gAlphaMaskProgram.setMinimumAlpha(0.004f);
+ }
+
}
}
// else
@@ -1678,9 +1766,17 @@ BOOL LLTexLayer::render(S32 x, S32 y, S32 width, S32 height)
color_specified )
{
LLGLDisable no_alpha(GL_ALPHA_TEST);
+ if (use_shaders)
+ {
+ gAlphaMaskProgram.setMinimumAlpha(0.f);
+ }
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
gGL.color4fv( net_color.mV );
gl_rect_2d_simple( width, height );
+ if (use_shaders)
+ {
+ gAlphaMaskProgram.setMinimumAlpha(0.004f);
+ }
}
if( alpha_mask_specified || getInfo()->mWriteAllChannels )
@@ -1768,15 +1864,25 @@ BOOL LLTexLayer::blendAlphaTexture(S32 x, S32 y, S32 width, S32 height)
gGL.flush();
+ bool use_shaders = LLGLSLShader::sNoFixedFunction;
+
if( !getInfo()->mStaticImageFileName.empty() )
{
LLViewerTexture* tex = LLTexLayerStaticImageList::getInstance()->getTexture( getInfo()->mStaticImageFileName, getInfo()->mStaticImageIsMask );
if( tex )
{
LLGLSNoAlphaTest gls_no_alpha_test;
+ if (use_shaders)
+ {
+ gAlphaMaskProgram.setMinimumAlpha(0.f);
+ }
gGL.getTexUnit(0)->bind(tex, TRUE);
gl_rect_2d_simple_tex( width, height );
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+ if (use_shaders)
+ {
+ gAlphaMaskProgram.setMinimumAlpha(0.004f);
+ }
}
else
{
@@ -1791,10 +1897,18 @@ BOOL LLTexLayer::blendAlphaTexture(S32 x, S32 y, S32 width, S32 height)
if (tex)
{
LLGLSNoAlphaTest gls_no_alpha_test;
+ if (use_shaders)
+ {
+ gAlphaMaskProgram.setMinimumAlpha(0.f);
+ }
gGL.getTexUnit(0)->bind(tex);
gl_rect_2d_simple_tex( width, height );
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
success = TRUE;
+ if (use_shaders)
+ {
+ gAlphaMaskProgram.setMinimumAlpha(0.004f);
+ }
}
}
}
@@ -1813,6 +1927,13 @@ BOOL LLTexLayer::renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLC
llassert( !mParamAlphaList.empty() );
+ bool use_shaders = LLGLSLShader::sNoFixedFunction;
+
+ if (use_shaders)
+ {
+ gAlphaMaskProgram.setMinimumAlpha(0.f);
+ }
+
gGL.setColorMask(false, true);
LLTexLayerParamAlpha* first_param = *mParamAlphaList.begin();
@@ -1850,7 +1971,6 @@ BOOL LLTexLayer::renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLC
if( tex && (tex->getComponents() == 4) )
{
LLGLSNoAlphaTest gls_no_alpha_test;
-
LLTexUnit::eTextureAddressMode old_mode = tex->getAddressMode();
gGL.getTexUnit(0)->bind(tex, TRUE);
@@ -1889,6 +2009,10 @@ BOOL LLTexLayer::renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLC
gl_rect_2d_simple( width, height );
}
+ if (use_shaders)
+ {
+ gAlphaMaskProgram.setMinimumAlpha(0.004f);
+ }
LLGLSUIDefault gls_ui;
diff --git a/indra/newview/lltexlayer.h b/indra/newview/lltexlayer.h
index 2d710d2dce..4f43547dae 100644
--- a/indra/newview/lltexlayer.h
+++ b/indra/newview/lltexlayer.h
@@ -261,6 +261,8 @@ private:
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class LLTexLayerSetBuffer : public LLViewerDynamicTexture
{
+ LOG_CLASS(LLTexLayerSetBuffer);
+
public:
LLTexLayerSetBuffer(LLTexLayerSet* const owner, S32 width, S32 height);
virtual ~LLTexLayerSetBuffer();
@@ -312,6 +314,8 @@ private:
BOOL mUploadPending; // Whether we have received back the new baked textures
LLUUID mUploadID; // The current upload process (null if none).
LLFrameTimer mNeedsUploadTimer; // Tracks time since upload was requested and performed.
+ S32 mUploadFailCount; // Number of consecutive upload failures
+ LLFrameTimer mUploadRetryTimer; // Tracks time since last upload failure.
//--------------------------------------------------------------------
// Updates
@@ -363,12 +367,14 @@ struct LLBakedUploadData
{
LLBakedUploadData(const LLVOAvatarSelf* avatar,
LLTexLayerSet* layerset,
- const LLUUID& id);
+ const LLUUID& id,
+ bool highest_res);
~LLBakedUploadData() {}
const LLUUID mID;
const LLVOAvatarSelf* mAvatar; // note: backlink only; don't LLPointer
LLTexLayerSet* mTexLayerSet;
const U64 mStartTime; // for measuring baked texture upload time
+ const bool mIsHighestRes; // whether this is a "final" bake, or intermediate low res
};
#endif // LL_LLTEXLAYER_H
diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp
index 6a213309a0..8632890bbb 100644
--- a/indra/newview/lltexturecache.cpp
+++ b/indra/newview/lltexturecache.cpp
@@ -36,6 +36,7 @@
// Included to allow LLTextureCache::purgeTextures() to pause watchdog timeout
#include "llappviewer.h"
+#include "llmemory.h"
// Cache organization:
// cache/texture.entries
@@ -113,7 +114,7 @@ public:
~LLTextureCacheWorker()
{
llassert_always(!haveWork());
- delete[] mReadData;
+ FREE_MEM(LLImageBase::getPrivatePool(), mReadData);
}
// override this interface
@@ -215,7 +216,7 @@ bool LLTextureCacheLocalFileWorker::doRead()
mDataSize = 0;
return true;
}
- mReadData = new U8[mDataSize];
+ mReadData = (U8*)ALLOCATE_MEM(LLImageBase::getPrivatePool(), mDataSize);
mBytesRead = -1;
mBytesToRead = mDataSize;
setPriority(LLWorkerThread::PRIORITY_LOW | mPriority);
@@ -233,7 +234,7 @@ bool LLTextureCacheLocalFileWorker::doRead()
// << " Bytes: " << mDataSize << " Offset: " << mOffset
// << " / " << mDataSize << llendl;
mDataSize = 0; // failed
- delete[] mReadData;
+ FREE_MEM(LLImageBase::getPrivatePool(), mReadData);
mReadData = NULL;
}
return true;
@@ -248,7 +249,7 @@ bool LLTextureCacheLocalFileWorker::doRead()
{
mDataSize = local_size;
}
- mReadData = new U8[mDataSize];
+ mReadData = (U8*)ALLOCATE_MEM(LLImageBase::getPrivatePool(), mDataSize);
S32 bytes_read = LLAPRFile::readEx(mFileName, mReadData, mOffset, mDataSize, mCache->getLocalAPRFilePool());
@@ -258,7 +259,7 @@ bool LLTextureCacheLocalFileWorker::doRead()
// << " Bytes: " << mDataSize << " Offset: " << mOffset
// << " / " << mDataSize << llendl;
mDataSize = 0;
- delete[] mReadData;
+ FREE_MEM(LLImageBase::getPrivatePool(), mReadData);
mReadData = NULL;
}
else
@@ -326,6 +327,7 @@ bool LLTextureCacheRemoteWorker::doRead()
// First state / stage : find out if the file is local
if (mState == INIT)
{
+#if 0
std::string filename = mCache->getLocalFileName(mID);
// Is it a JPEG2000 file?
{
@@ -360,6 +362,11 @@ bool LLTextureCacheRemoteWorker::doRead()
}
// Determine the next stage: if we found a file, then LOCAL else CACHE
mState = (local_size > 0 ? LOCAL : CACHE);
+
+ llassert_always(mState == CACHE) ;
+#else
+ mState = CACHE;
+#endif
}
// Second state / stage : if the file is local, load it and leave
@@ -371,7 +378,7 @@ bool LLTextureCacheRemoteWorker::doRead()
mDataSize = local_size;
}
// Allocate read buffer
- mReadData = new U8[mDataSize];
+ mReadData = (U8*)ALLOCATE_MEM(LLImageBase::getPrivatePool(), mDataSize);
S32 bytes_read = LLAPRFile::readEx(local_filename,
mReadData, mOffset, mDataSize, mCache->getLocalAPRFilePool());
if (bytes_read != mDataSize)
@@ -380,7 +387,7 @@ bool LLTextureCacheRemoteWorker::doRead()
<< " Bytes: " << mDataSize << " Offset: " << mOffset
<< " / " << mDataSize << llendl;
mDataSize = 0;
- delete[] mReadData;
+ FREE_MEM(LLImageBase::getPrivatePool(), mReadData);
mReadData = NULL;
}
else
@@ -423,7 +430,7 @@ bool LLTextureCacheRemoteWorker::doRead()
S32 size = TEXTURE_CACHE_ENTRY_SIZE - mOffset;
size = llmin(size, mDataSize);
// Allocate the read buffer
- mReadData = new U8[size];
+ mReadData = (U8*)ALLOCATE_MEM(LLImageBase::getPrivatePool(), size);
S32 bytes_read = LLAPRFile::readEx(mCache->mHeaderDataFileName,
mReadData, offset, size, mCache->getLocalAPRFilePool());
if (bytes_read != size)
@@ -431,7 +438,7 @@ bool LLTextureCacheRemoteWorker::doRead()
llwarns << "LLTextureCacheWorker: " << mID
<< " incorrect number of bytes read from header: " << bytes_read
<< " / " << size << llendl;
- delete[] mReadData;
+ FREE_MEM(LLImageBase::getPrivatePool(), mReadData);
mReadData = NULL;
mDataSize = -1; // failed
done = true;
@@ -461,7 +468,7 @@ bool LLTextureCacheRemoteWorker::doRead()
S32 data_offset, file_size, file_offset;
// Reserve the whole data buffer first
- U8* data = new U8[mDataSize];
+ U8* data = (U8*)ALLOCATE_MEM(LLImageBase::getPrivatePool(), mDataSize);
// Set the data file pointers taking the read offset into account. 2 cases:
if (mOffset < TEXTURE_CACHE_ENTRY_SIZE)
@@ -474,7 +481,7 @@ bool LLTextureCacheRemoteWorker::doRead()
// Copy the raw data we've been holding from the header cache into the new sized buffer
llassert_always(mReadData);
memcpy(data, mReadData, data_offset);
- delete[] mReadData;
+ FREE_MEM(LLImageBase::getPrivatePool(), mReadData);
mReadData = NULL;
}
else
@@ -500,7 +507,7 @@ bool LLTextureCacheRemoteWorker::doRead()
llwarns << "LLTextureCacheWorker: " << mID
<< " incorrect number of bytes read from body: " << bytes_read
<< " / " << file_size << llendl;
- delete[] mReadData;
+ FREE_MEM(LLImageBase::getPrivatePool(), mReadData);
mReadData = NULL;
mDataSize = -1; // failed
done = true;
@@ -592,11 +599,11 @@ bool LLTextureCacheRemoteWorker::doWrite()
{
// We need to write a full record in the header cache so, if the amount of data is smaller
// than a record, we need to transfer the data to a buffer padded with 0 and write that
- U8* padBuffer = new U8[TEXTURE_CACHE_ENTRY_SIZE];
+ U8* padBuffer = (U8*)ALLOCATE_MEM(LLImageBase::getPrivatePool(), TEXTURE_CACHE_ENTRY_SIZE);
memset(padBuffer, 0, TEXTURE_CACHE_ENTRY_SIZE); // Init with zeros
memcpy(padBuffer, mWriteData, mDataSize); // Copy the write buffer
bytes_written = LLAPRFile::writeEx(mCache->mHeaderDataFileName, padBuffer, offset, size, mCache->getLocalAPRFilePool());
- delete [] padBuffer;
+ FREE_MEM(LLImageBase::getPrivatePool(), padBuffer);
}
else
{
@@ -692,7 +699,7 @@ void LLTextureCacheWorker::finishWork(S32 param, bool completed)
}
else
{
- delete[] mReadData;
+ FREE_MEM(LLImageBase::getPrivatePool(), mReadData);
mReadData = NULL;
}
}
@@ -753,7 +760,7 @@ LLTextureCache::~LLTextureCache()
//////////////////////////////////////////////////////////////////////////////
//virtual
-S32 LLTextureCache::update(U32 max_time_ms)
+S32 LLTextureCache::update(F32 max_time_ms)
{
static LLFrameTimer timer ;
static const F32 MAX_TIME_INTERVAL = 300.f ; //seconds.
@@ -943,7 +950,7 @@ S64 LLTextureCache::initCache(ELLPath location, S64 max_size, BOOL texture_cache
max_size -= sCacheMaxTexturesSize;
LL_INFOS("TextureCache") << "Headers: " << sCacheMaxEntries
- << " Textures size: " << sCacheMaxTexturesSize/(1024*1024) << " MB" << LL_ENDL;
+ << " Textures size: " << sCacheMaxTexturesSize / (1024 * 1024) << " MB" << LL_ENDL;
setDirNames(location);
@@ -1413,22 +1420,21 @@ void LLTextureCache::readHeaderCache()
}
}
}
- if (num_entries > sCacheMaxEntries)
+ if (num_entries - empty_entries > sCacheMaxEntries)
{
// Special case: cache size was reduced, need to remove entries
// Note: After we prune entries, we will call this again and create the LRU
- U32 entries_to_purge = (num_entries-empty_entries) - sCacheMaxEntries;
+ U32 entries_to_purge = (num_entries - empty_entries) - sCacheMaxEntries;
llinfos << "Texture Cache Entries: " << num_entries << " Max: " << sCacheMaxEntries << " Empty: " << empty_entries << " Purging: " << entries_to_purge << llendl;
- if (entries_to_purge > 0)
+ // We can exit the following loop with the given condition, since if we'd reach the end of the lru set we'd have:
+ // purge_list.size() = lru.size() = num_entries - empty_entries = entries_to_purge + sCacheMaxEntries >= entries_to_purge
+ // So, it's certain that iter will never reach lru.end() first.
+ std::set<lru_data_t>::iterator iter = lru.begin();
+ while (purge_list.size() < entries_to_purge)
{
- for (std::set<lru_data_t>::iterator iter = lru.begin(); iter != lru.end(); ++iter)
- {
- purge_list.insert(iter->second);
- if (purge_list.size() >= entries_to_purge)
- break;
- }
+ purge_list.insert(iter->second);
+ ++iter;
}
- llassert_always(purge_list.size() >= entries_to_purge);
}
else
{
@@ -1508,12 +1514,12 @@ void LLTextureCache::purgeAllTextures(bool purge_directories)
{
const char* subdirs = "0123456789abcdef";
std::string delem = gDirUtilp->getDirDelimiter();
- std::string mask = delem + "*";
+ std::string mask = "*";
for (S32 i=0; i<16; i++)
{
std::string dirname = mTexturesDirName + delem + subdirs[i];
llinfos << "Deleting files in directory: " << dirname << llendl;
- gDirUtilp->deleteFilesInDir(dirname,mask);
+ gDirUtilp->deleteFilesInDir(dirname, mask);
if (purge_directories)
{
LLFile::rmdir(dirname);
@@ -1592,7 +1598,7 @@ void LLTextureCache::purgeTextures(bool validate)
if (validate)
{
validate_idx = gSavedSettings.getU32("CacheValidateCounter");
- U32 next_idx = (++validate_idx) % 256;
+ U32 next_idx = (validate_idx + 1) % 256;
gSavedSettings.setU32("CacheValidateCounter", next_idx);
LL_DEBUGS("TextureCache") << "TEXTURE CACHE: Validating: " << validate_idx << LL_ENDL;
}
@@ -1635,8 +1641,8 @@ void LLTextureCache::purgeTextures(bool validate)
{
purge_count++;
LL_DEBUGS("TextureCache") << "PURGING: " << filename << LL_ENDL;
- removeEntry(idx, entries[idx], filename) ;
cache_size -= entries[idx].mBodySize;
+ removeEntry(idx, entries[idx], filename) ;
}
}
@@ -1650,7 +1656,7 @@ void LLTextureCache::purgeTextures(bool validate)
LL_INFOS("TextureCache") << "TEXTURE CACHE:"
<< " PURGED: " << purge_count
<< " ENTRIES: " << num_entries
- << " CACHE SIZE: " << mTexturesSizeTotal / 1024*1024 << " MB"
+ << " CACHE SIZE: " << mTexturesSizeTotal / (1024 * 1024) << " MB"
<< llendl;
}
@@ -1858,18 +1864,34 @@ void LLTextureCache::removeCachedTexture(const LLUUID& id)
//called after mHeaderMutex is locked.
void LLTextureCache::removeEntry(S32 idx, Entry& entry, std::string& filename)
{
+ bool file_maybe_exists = true; // Always attempt to remove when idx is invalid.
+
if(idx >= 0) //valid entry
{
+ if (entry.mBodySize == 0) // Always attempt to remove when mBodySize > 0.
+ {
+ if (LLAPRFile::isExist(filename, getLocalAPRFilePool())) // Sanity check. Shouldn't exist when body size is 0.
+ {
+ LL_WARNS("TextureCache") << "Entry has body size of zero but file " << filename << " exists. Deleting this file, too." << LL_ENDL;
+ }
+ else
+ {
+ file_maybe_exists = false;
+ }
+ }
+ mTexturesSizeTotal -= entry.mBodySize;
+
entry.mImageSize = -1;
entry.mBodySize = 0;
mHeaderIDMap.erase(entry.mID);
- mTexturesSizeMap.erase(entry.mID);
-
- mTexturesSizeTotal -= entry.mBodySize;
+ mTexturesSizeMap.erase(entry.mID);
mFreeList.insert(idx);
}
- LLAPRFile::remove(filename, getLocalAPRFilePool());
+ if (file_maybe_exists)
+ {
+ LLAPRFile::remove(filename, getLocalAPRFilePool());
+ }
}
bool LLTextureCache::removeFromCache(const LLUUID& id)
diff --git a/indra/newview/lltexturecache.h b/indra/newview/lltexturecache.h
index 64e3a2658c..dd0cc9b4bd 100644
--- a/indra/newview/lltexturecache.h
+++ b/indra/newview/lltexturecache.h
@@ -101,7 +101,7 @@ public:
LLTextureCache(bool threaded);
~LLTextureCache();
- /*virtual*/ S32 update(U32 max_time_ms);
+ /*virtual*/ S32 update(F32 max_time_ms);
void purgeCache(ELLPath location);
void setReadOnly(BOOL read_only) ;
diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp
index 328298bda4..ed9faa0706 100644
--- a/indra/newview/lltexturectrl.cpp
+++ b/indra/newview/lltexturectrl.cpp
@@ -67,6 +67,9 @@
#include "lluictrlfactory.h"
#include "lltrans.h"
+#include "llradiogroup.h"
+#include "llfloaterreg.h"
+#include "lllocalbitmaps.h"
static const S32 HPAD = 4;
static const S32 VPAD = 4;
@@ -78,6 +81,8 @@ static const F32 CONTEXT_CONE_IN_ALPHA = 0.0f;
static const F32 CONTEXT_CONE_OUT_ALPHA = 1.f;
static const F32 CONTEXT_FADE_TIME = 0.08f;
+static const S32 LOCAL_TRACKING_ID_COLUMN = 1;
+
//static const char CURRENT_IMAGE_NAME[] = "Current Texture";
//static const char WHITE_IMAGE_NAME[] = "Blank Texture";
//static const char NO_IMAGE_NAME[] = "None";
@@ -142,6 +147,12 @@ public:
static void onApplyImmediateCheck(LLUICtrl* ctrl, void* userdata);
void onTextureSelect( const LLTextureEntry& te );
+ static void onModeSelect(LLUICtrl* ctrl, void *userdata);
+ static void onBtnAdd(void* userdata);
+ static void onBtnRemove(void* userdata);
+ static void onBtnUpload(void* userdata);
+ static void onLocalScrollCommit(LLUICtrl* ctrl, void* userdata);
+
protected:
LLPointer<LLViewerTexture> mTexturep;
LLTextureCtrl* mOwner;
@@ -169,8 +180,10 @@ protected:
BOOL mNoCopyTextureSelected;
F32 mContextConeOpacity;
LLSaveFolderState mSavedFolderState;
-
BOOL mSelectedItemPinned;
+
+ LLRadioGroup* mModeSelector;
+ LLScrollListCtrl* mLocalScrollCtrl;
};
LLFloaterTexturePicker::LLFloaterTexturePicker(
@@ -289,7 +302,9 @@ BOOL LLFloaterTexturePicker::handleDragAndDrop(
{
BOOL handled = FALSE;
- if (cargo_type == DAD_TEXTURE)
+ bool is_mesh = cargo_type == DAD_MESH;
+
+ if ((cargo_type == DAD_TEXTURE) || is_mesh)
{
LLInventoryItem *item = (LLInventoryItem *)cargo_data;
@@ -418,7 +433,6 @@ BOOL LLFloaterTexturePicker::postBuild()
mInventoryPanel->setFilterPermMask(mImmediateFilterPermMask);
mInventoryPanel->setSelectCallback(boost::bind(&LLFloaterTexturePicker::onSelectionChange, this, _1, _2));
mInventoryPanel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
- mInventoryPanel->setAllowMultiSelect(FALSE);
// Disable auto selecting first filtered item because it takes away
// selection from the item set by LLTextureCtrl owning this floater.
@@ -436,6 +450,17 @@ BOOL LLFloaterTexturePicker::postBuild()
mInventoryPanel->setSelection(findItemID(mImageAssetID, FALSE), TAKE_FOCUS_NO);
}
+ mModeSelector = getChild<LLRadioGroup>("mode_selection");
+ mModeSelector->setCommitCallback(onModeSelect, this);
+ mModeSelector->setSelectedIndex(0, 0);
+
+ childSetAction("l_add_btn", LLFloaterTexturePicker::onBtnAdd, this);
+ childSetAction("l_rem_btn", LLFloaterTexturePicker::onBtnRemove, this);
+ childSetAction("l_upl_btn", LLFloaterTexturePicker::onBtnUpload, this);
+
+ mLocalScrollCtrl = getChild<LLScrollListCtrl>("l_name_list");
+ mLocalScrollCtrl->setCommitCallback(onLocalScrollCommit, this);
+ LLLocalBitmapMgr::feedScrollList(mLocalScrollCtrl);
mNoCopyTextureSelected = FALSE;
@@ -463,7 +488,6 @@ BOOL LLFloaterTexturePicker::postBuild()
// virtual
void LLFloaterTexturePicker::draw()
{
- S32 floater_header_size = getHeaderHeight();
if (mOwner)
{
// draw cone of context pointing back to texture swatch
@@ -553,10 +577,7 @@ void LLFloaterTexturePicker::draw()
}
// Border
- LLRect border( BORDER_PAD,
- getRect().getHeight() - floater_header_size - BORDER_PAD,
- ((getMinWidth() / 2) - TEXTURE_INVENTORY_PADDING - HPAD) - BORDER_PAD,
- BORDER_PAD + FOOTER_HEIGHT + (getRect().getHeight() - getMinHeight()));
+ LLRect border = getChildView("preview_widget")->getRect();
gl_rect_2d( border, LLColor4::black, FALSE );
@@ -564,25 +585,27 @@ void LLFloaterTexturePicker::draw()
LLRect interior = border;
interior.stretch( -1 );
+ // If the floater is focused, don't apply its alpha to the texture (STORM-677).
+ const F32 alpha = getTransparencyType() == TT_ACTIVE ? 1.0f : getCurrentTransparency();
if( mTexturep )
{
if( mTexturep->getComponents() == 4 )
{
- gl_rect_2d_checkerboard( interior );
+ gl_rect_2d_checkerboard( interior, alpha );
}
- gl_draw_scaled_image( interior.mLeft, interior.mBottom, interior.getWidth(), interior.getHeight(), mTexturep );
+ gl_draw_scaled_image( interior.mLeft, interior.mBottom, interior.getWidth(), interior.getHeight(), mTexturep, UI_VERTEX_COLOR % alpha );
// Pump the priority
mTexturep->addTextureStats( (F32)(interior.getWidth() * interior.getHeight()) );
}
else if (!mFallbackImage.isNull())
{
- mFallbackImage->draw(interior);
+ mFallbackImage->draw(interior, UI_VERTEX_COLOR % alpha);
}
else
{
- gl_rect_2d( interior, LLColor4::grey, TRUE );
+ gl_rect_2d( interior, LLColor4::grey % alpha, TRUE );
// Draw X
gl_draw_x(interior, LLColor4::black );
@@ -745,7 +768,15 @@ void LLFloaterTexturePicker::onBtnSelect(void* userdata)
LLFloaterTexturePicker* self = (LLFloaterTexturePicker*) userdata;
if (self->mOwner)
{
- self->mOwner->onFloaterCommit(LLTextureCtrl::TEXTURE_SELECT);
+ LLUUID local_id = LLUUID::null;
+
+ if (self->mLocalScrollCtrl->getVisible() && !self->mLocalScrollCtrl->getAllSelected().empty())
+ {
+ LLUUID temp_id = self->mLocalScrollCtrl->getFirstSelected()->getColumn(LOCAL_TRACKING_ID_COLUMN)->getValue().asUUID();
+ local_id = LLLocalBitmapMgr::getWorldID(temp_id);
+ }
+
+ self->mOwner->onFloaterCommit(LLTextureCtrl::TEXTURE_SELECT, local_id);
}
self->closeFloater();
}
@@ -789,6 +820,112 @@ void LLFloaterTexturePicker::onSelectionChange(const std::deque<LLFolderViewItem
}
// static
+void LLFloaterTexturePicker::onModeSelect(LLUICtrl* ctrl, void *userdata)
+{
+ LLFloaterTexturePicker* self = (LLFloaterTexturePicker*) userdata;
+ bool mode = (self->mModeSelector->getSelectedIndex() == 0);
+
+ self->getChild<LLButton>("Default")->setVisible(mode);
+ self->getChild<LLButton>("Blank")->setVisible(mode);
+ self->getChild<LLButton>("None")->setVisible(mode);
+ self->getChild<LLButton>("Pipette")->setVisible(mode);
+ self->getChild<LLFilterEditor>("inventory search editor")->setVisible(mode);
+ self->getChild<LLInventoryPanel>("inventory panel")->setVisible(mode);
+
+ /*self->getChild<LLCheckBox>("show_folders_check")->setVisible(mode);
+ no idea under which conditions the above is even shown, needs testing. */
+
+ self->getChild<LLButton>("l_add_btn")->setVisible(!mode);
+ self->getChild<LLButton>("l_rem_btn")->setVisible(!mode);
+ self->getChild<LLButton>("l_upl_btn")->setVisible(!mode);
+ self->getChild<LLScrollListCtrl>("l_name_list")->setVisible(!mode);
+}
+
+// static
+void LLFloaterTexturePicker::onBtnAdd(void* userdata)
+{
+ if (LLLocalBitmapMgr::addUnit() == true)
+ {
+ LLFloaterTexturePicker* self = (LLFloaterTexturePicker*) userdata;
+ LLLocalBitmapMgr::feedScrollList(self->mLocalScrollCtrl);
+ }
+}
+
+// static
+void LLFloaterTexturePicker::onBtnRemove(void* userdata)
+{
+ LLFloaterTexturePicker* self = (LLFloaterTexturePicker*) userdata;
+ std::vector<LLScrollListItem*> selected_items = self->mLocalScrollCtrl->getAllSelected();
+
+ if (!selected_items.empty())
+ {
+ for(std::vector<LLScrollListItem*>::iterator iter = selected_items.begin();
+ iter != selected_items.end(); iter++)
+ {
+ LLScrollListItem* list_item = *iter;
+ if (list_item)
+ {
+ LLUUID tracking_id = list_item->getColumn(LOCAL_TRACKING_ID_COLUMN)->getValue().asUUID();
+ LLLocalBitmapMgr::delUnit(tracking_id);
+ }
+ }
+
+ self->getChild<LLButton>("l_rem_btn")->setEnabled(false);
+ self->getChild<LLButton>("l_upl_btn")->setEnabled(false);
+ LLLocalBitmapMgr::feedScrollList(self->mLocalScrollCtrl);
+ }
+
+}
+
+// static
+void LLFloaterTexturePicker::onBtnUpload(void* userdata)
+{
+ LLFloaterTexturePicker* self = (LLFloaterTexturePicker*) userdata;
+ std::vector<LLScrollListItem*> selected_items = self->mLocalScrollCtrl->getAllSelected();
+
+ if (selected_items.empty())
+ {
+ return;
+ }
+
+ /* currently only allows uploading one by one, picks the first item from the selection list. (not the vector!)
+ in the future, it might be a good idea to check the vector size and if more than one units is selected - opt for multi-image upload. */
+
+ LLUUID tracking_id = (LLUUID)self->mLocalScrollCtrl->getSelectedItemLabel(LOCAL_TRACKING_ID_COLUMN);
+ std::string filename = LLLocalBitmapMgr::getFilename(tracking_id);
+
+ if (!filename.empty())
+ {
+ LLFloaterReg::showInstance("upload_image", LLSD(filename));
+ }
+
+}
+
+//static
+void LLFloaterTexturePicker::onLocalScrollCommit(LLUICtrl* ctrl, void* userdata)
+{
+ LLFloaterTexturePicker* self = (LLFloaterTexturePicker*) userdata;
+ std::vector<LLScrollListItem*> selected_items = self->mLocalScrollCtrl->getAllSelected();
+ bool has_selection = !selected_items.empty();
+
+ self->getChild<LLButton>("l_rem_btn")->setEnabled(has_selection);
+ self->getChild<LLButton>("l_upl_btn")->setEnabled(has_selection && (selected_items.size() < 2));
+ /* since multiple-localbitmap upload is not implemented, upl button gets disabled if more than one is selected. */
+
+ if (has_selection)
+ {
+ LLUUID tracking_id = (LLUUID)self->mLocalScrollCtrl->getSelectedItemLabel(LOCAL_TRACKING_ID_COLUMN);
+ LLUUID inworld_id = LLLocalBitmapMgr::getWorldID(tracking_id);
+ self->mOwner->setImageAssetID(inworld_id);
+
+ if (self->childGetValue("apply_immediate_check").asBoolean())
+ {
+ self->mOwner->onFloaterCommit(LLTextureCtrl::TEXTURE_CHANGE, inworld_id);
+ }
+ }
+}
+
+// static
void LLFloaterTexturePicker::onShowFolders(LLUICtrl* ctrl, void *user_data)
{
LLCheckBoxCtrl* check_box = (LLCheckBoxCtrl*)ctrl;
@@ -919,13 +1056,20 @@ LLTextureCtrl::LLTextureCtrl(const LLTextureCtrl::Params& p)
S32 image_top = getRect().getHeight();
S32 image_bottom = BTN_HEIGHT_SMALL;
S32 image_middle = (image_top + image_bottom) / 2;
- S32 line_height = llround(LLFontGL::getFontSansSerifSmall()->getLineHeight());
+ S32 line_height = LLFontGL::getFontSansSerifSmall()->getLineHeight();
LLTextBox::Params tentative_label_p(p.multiselect_text);
tentative_label_p.name("Multiple");
tentative_label_p.rect(LLRect (0, image_middle + line_height / 2, getRect().getWidth(), image_middle - line_height / 2 ));
tentative_label_p.follows.flags(FOLLOWS_ALL);
mTentativeLabel = LLUICtrlFactory::create<LLTextBox> (tentative_label_p);
+
+ // It is no longer possible to associate a style with a textbox, so it has to be done in this fashion
+ LLStyle::Params style_params;
+ style_params.color = LLColor4::white;
+
+ mTentativeLabel->setText(LLTrans::getString("multiple_textures"), style_params);
+ mTentativeLabel->setHAlign(LLFontGL::HCENTER);
addChild( mTentativeLabel );
LLRect border_rect = getLocalRect();
@@ -1089,7 +1233,7 @@ public:
BOOL LLTextureCtrl::handleHover(S32 x, S32 y, MASK mask)
{
- getWindow()->setCursor(UI_CURSOR_HAND);
+ getWindow()->setCursor(mBorder->parentPointInView(x,y) ? UI_CURSOR_HAND : UI_CURSOR_ARROW);
return TRUE;
}
@@ -1098,7 +1242,7 @@ BOOL LLTextureCtrl::handleMouseDown(S32 x, S32 y, MASK mask)
{
BOOL handled = LLUICtrl::handleMouseDown( x, y , mask );
- if( !handled )
+ if (!handled && mBorder->parentPointInView(x, y))
{
showPicker(FALSE);
//grab textures first...
@@ -1123,7 +1267,7 @@ void LLTextureCtrl::onFloaterClose()
mFloaterHandle.markDead();
}
-void LLTextureCtrl::onFloaterCommit(ETexturePickOp op)
+void LLTextureCtrl::onFloaterCommit(ETexturePickOp op, LLUUID id)
{
LLFloaterTexturePicker* floaterp = (LLFloaterTexturePicker*)mFloaterHandle.get();
@@ -1136,14 +1280,24 @@ void LLTextureCtrl::onFloaterCommit(ETexturePickOp op)
// (i.e. op == TEXTURE_SELECT) or texture changes via DnD.
else if (mCommitOnSelection || op == TEXTURE_SELECT)
mViewModel->setDirty(); // *TODO: shouldn't we be using setValue() here?
-
- if( floaterp->isDirty() )
+
+ if(floaterp->isDirty() || id.notNull()) // mModelView->setDirty does not work.
{
setTentative( FALSE );
- mImageItemID = floaterp->findItemID(floaterp->getAssetID(), FALSE);
- lldebugs << "mImageItemID: " << mImageItemID << llendl;
- mImageAssetID = floaterp->getAssetID();
- lldebugs << "mImageAssetID: " << mImageAssetID << llendl;
+
+ if (id.notNull())
+ {
+ mImageItemID = id;
+ mImageAssetID = id;
+ }
+ else
+ {
+ mImageItemID = floaterp->findItemID(floaterp->getAssetID(), FALSE);
+ lldebugs << "mImageItemID: " << mImageItemID << llendl;
+ mImageAssetID = floaterp->getAssetID();
+ lldebugs << "mImageAssetID: " << mImageAssetID << llendl;
+ }
+
if (op == TEXTURE_SELECT && mOnSelectCallback)
{
mOnSelectCallback( this, LLSD() );
@@ -1204,7 +1358,11 @@ BOOL LLTextureCtrl::handleDragAndDrop(S32 x, S32 y, MASK mask,
// returns true, then the cast was valid, and we can perform
// the third test without problems.
LLInventoryItem* item = (LLInventoryItem*)cargo_data;
- if (getEnabled() && (cargo_type == DAD_TEXTURE) && allowDrop(item))
+ bool is_mesh = cargo_type == DAD_MESH;
+
+ if (getEnabled() &&
+ ((cargo_type == DAD_TEXTURE) || is_mesh) &&
+ allowDrop(item))
{
if (drop)
{
@@ -1263,23 +1421,25 @@ void LLTextureCtrl::draw()
LLRect interior = border;
interior.stretch( -1 );
+ // If we're in a focused floater, don't apply the floater's alpha to the texture (STORM-677).
+ const F32 alpha = getTransparencyType() == TT_ACTIVE ? 1.0f : getCurrentTransparency();
if( mTexturep )
{
if( mTexturep->getComponents() == 4 )
{
- gl_rect_2d_checkerboard( interior );
+ gl_rect_2d_checkerboard( interior, alpha );
}
- gl_draw_scaled_image( interior.mLeft, interior.mBottom, interior.getWidth(), interior.getHeight(), mTexturep);
+ gl_draw_scaled_image( interior.mLeft, interior.mBottom, interior.getWidth(), interior.getHeight(), mTexturep, UI_VERTEX_COLOR % alpha);
mTexturep->addTextureStats( (F32)(interior.getWidth() * interior.getHeight()) );
}
else if (!mFallbackImage.isNull())
{
- mFallbackImage->draw(interior);
+ mFallbackImage->draw(interior, UI_VERTEX_COLOR % alpha);
}
else
{
- gl_rect_2d( interior, LLColor4::grey, TRUE );
+ gl_rect_2d( interior, LLColor4::grey % alpha, TRUE );
// Draw X
gl_draw_x( interior, LLColor4::black );
diff --git a/indra/newview/lltexturectrl.h b/indra/newview/lltexturectrl.h
index fdfbee400e..3abe84dcc3 100644
--- a/indra/newview/lltexturectrl.h
+++ b/indra/newview/lltexturectrl.h
@@ -92,11 +92,7 @@ public:
multiselect_text("multiselect_text"),
caption_text("caption_text"),
border("border")
- {
- name = "texture picker";
- mouse_opaque(true);
- follows.flags(FOLLOWS_LEFT | FOLLOWS_TOP);
- }
+ {}
};
protected:
LLTextureCtrl(const Params&);
@@ -161,7 +157,7 @@ public:
void closeDependentFloater();
void onFloaterClose();
- void onFloaterCommit(ETexturePickOp op);
+ void onFloaterCommit(ETexturePickOp op, LLUUID id = LLUUID::null);
// This call is returned when a drag is detected. Your callback
// should return TRUE if the drag is acceptable.
diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp
index 13fd51f473..f18aa8b4e6 100644
--- a/indra/newview/lltexturefetch.cpp
+++ b/indra/newview/lltexturefetch.cpp
@@ -27,6 +27,7 @@
#include "llviewerprecompiledheaders.h"
#include <iostream>
+#include <map>
#include "llstl.h"
@@ -49,6 +50,7 @@
#include "llviewertexture.h"
#include "llviewerregion.h"
#include "llviewerstats.h"
+#include "llviewerassetstats.h"
#include "llworld.h"
//////////////////////////////////////////////////////////////////////////////
@@ -143,7 +145,7 @@ public:
/*virtual*/ bool deleteOK(); // called from update() (WORK THREAD)
~LLTextureFetchWorker();
- void relese() { --mActiveCount; }
+ // void relese() { --mActiveCount; }
S32 callbackHttpGet(const LLChannelDescriptors& channels,
const LLIOPipe::buffer_ptr_t& buffer,
@@ -161,9 +163,11 @@ public:
mGetReason = reason;
}
- void setCanUseHTTP(bool can_use_http) {mCanUseHTTP = can_use_http;}
- bool getCanUseHTTP()const {return mCanUseHTTP ;}
+ void setCanUseHTTP(bool can_use_http) { mCanUseHTTP = can_use_http; }
+ bool getCanUseHTTP() const { return mCanUseHTTP; }
+ LLTextureFetch & getFetcher() { return *mFetcher; }
+
protected:
LLTextureFetchWorker(LLTextureFetch* fetcher, const std::string& url, const LLUUID& id, const LLHost& host,
F32 priority, S32 discard, S32 size);
@@ -277,6 +281,8 @@ private:
S32 mLastPacket;
U16 mTotalPackets;
U8 mImageCodec;
+
+ LLViewerAssetStats::duration_t mMetricsStartTime;
};
//////////////////////////////////////////////////////////////////////////////
@@ -344,6 +350,18 @@ public:
}
mFetcher->removeFromHTTPQueue(mID, data_size);
+
+ if (worker->mMetricsStartTime)
+ {
+ LLViewerAssetStatsFF::record_response_thread1(LLViewerAssetType::AT_TEXTURE,
+ true,
+ LLImageBase::TYPE_AVATAR_BAKE == worker->mType,
+ LLViewerAssetStatsFF::get_timestamp() - worker->mMetricsStartTime);
+ worker->mMetricsStartTime = 0;
+ }
+ LLViewerAssetStatsFF::record_dequeue_thread1(LLViewerAssetType::AT_TEXTURE,
+ true,
+ LLImageBase::TYPE_AVATAR_BAKE == worker->mType);
}
else
{
@@ -368,6 +386,229 @@ private:
//////////////////////////////////////////////////////////////////////////////
+// Cross-thread messaging for asset metrics.
+
+/**
+ * @brief Base class for cross-thread requests made of the fetcher
+ *
+ * I believe the intent of the LLQueuedThread class was to
+ * have these operations derived from LLQueuedThread::QueuedRequest
+ * but the texture fetcher has elected to manage the queue
+ * in its own manner. So these are free-standing objects which are
+ * managed in simple FIFO order on the mCommands queue of the
+ * LLTextureFetch object.
+ *
+ * What each represents is a simple command sent from an
+ * outside thread into the TextureFetch thread to be processed
+ * in order and in a timely fashion (though not an absolute
+ * higher priority than other operations of the thread).
+ * Each operation derives a new class from the base customizing
+ * members, constructors and the doWork() method to effect
+ * the command.
+ *
+ * The flow is one-directional. There are two global instances
+ * of the LLViewerAssetStats collector, one for the main program's
+ * thread pointed to by gViewerAssetStatsMain and one for the
+ * TextureFetch thread pointed to by gViewerAssetStatsThread1.
+ * Common operations has each thread recording metrics events
+ * into the respective collector unconcerned with locking and
+ * the state of any other thread. But when the agent moves into
+ * a different region or the metrics timer expires and a report
+ * needs to be sent back to the grid, messaging across threads
+ * is required to distribute data and perform global actions.
+ * In pseudo-UML, it looks like:
+ *
+ * Main Thread1
+ * . .
+ * . .
+ * +-----+ .
+ * | AM | .
+ * +--+--+ .
+ * +-------+ | .
+ * | Main | +--+--+ .
+ * | | | SRE |---. .
+ * | Stats | +-----+ \ .
+ * | | | \ (uuid) +-----+
+ * | Coll. | +--+--+ `-------->| SR |
+ * +-------+ | MSC | +--+--+
+ * | ^ +-----+ |
+ * | | (uuid) / . +-----+ (uuid)
+ * | `--------' . | MSC |---------.
+ * | . +-----+ |
+ * | +-----+ . v
+ * | | TE | . +-------+
+ * | +--+--+ . | Thd1 |
+ * | | . | |
+ * | +-----+ . | Stats |
+ * `--------->| RSC | . | |
+ * +--+--+ . | Coll. |
+ * | . +-------+
+ * +--+--+ . |
+ * | SME |---. . |
+ * +-----+ \ . |
+ * . \ (clone) +-----+ |
+ * . `-------->| SM | |
+ * . +--+--+ |
+ * . | |
+ * . +-----+ |
+ * . | RSC |<--------'
+ * . +-----+
+ * . |
+ * . +-----+
+ * . | CP |--> HTTP POST
+ * . +-----+
+ * . .
+ * . .
+ *
+ *
+ * Key:
+ *
+ * SRE - Set Region Enqueued. Enqueue a 'Set Region' command in
+ * the other thread providing the new UUID of the region.
+ * TFReqSetRegion carries the data.
+ * SR - Set Region. New region UUID is sent to the thread-local
+ * collector.
+ * SME - Send Metrics Enqueued. Enqueue a 'Send Metrics' command
+ * including an ownership transfer of a cloned LLViewerAssetStats.
+ * TFReqSendMetrics carries the data.
+ * SM - Send Metrics. Global metrics reporting operation. Takes
+ * the cloned stats from the command, merges it with the
+ * thread's local stats, converts to LLSD and sends it on
+ * to the grid.
+ * AM - Agent Moved. Agent has completed some sort of move to a
+ * new region.
+ * TE - Timer Expired. Metrics timer has expired (on the order
+ * of 10 minutes).
+ * CP - CURL Post
+ * MSC - Modify Stats Collector. State change in the thread-local
+ * collector. Typically a region change which affects the
+ * global pointers used to find the 'current stats'.
+ * RSC - Read Stats Collector. Extract collector data cloning it
+ * (i.e. deep copy) when necessary.
+ *
+ */
+class LLTextureFetch::TFRequest // : public LLQueuedThread::QueuedRequest
+{
+public:
+ // Default ctors and assignment operator are correct.
+
+ virtual ~TFRequest()
+ {}
+
+ // Patterned after QueuedRequest's method but expected behavior
+ // is different. Always expected to complete on the first call
+ // and work dispatcher will assume the same and delete the
+ // request after invocation.
+ virtual bool doWork(LLTextureFetch * fetcher) = 0;
+};
+
+namespace
+{
+
+/**
+ * @brief Implements a 'Set Region' cross-thread command.
+ *
+ * When an agent moves to a new region, subsequent metrics need
+ * to be binned into a new or existing stats collection in 1:1
+ * relationship with the region. We communicate this region
+ * change across the threads involved in the communication with
+ * this message.
+ *
+ * Corresponds to LLTextureFetch::commandSetRegion()
+ */
+class TFReqSetRegion : public LLTextureFetch::TFRequest
+{
+public:
+ TFReqSetRegion(U64 region_handle)
+ : LLTextureFetch::TFRequest(),
+ mRegionHandle(region_handle)
+ {}
+ TFReqSetRegion & operator=(const TFReqSetRegion &); // Not defined
+
+ virtual ~TFReqSetRegion()
+ {}
+
+ virtual bool doWork(LLTextureFetch * fetcher);
+
+public:
+ const U64 mRegionHandle;
+};
+
+
+/**
+ * @brief Implements a 'Send Metrics' cross-thread command.
+ *
+ * This is the big operation. The main thread gathers metrics
+ * for a period of minutes into LLViewerAssetStats and other
+ * objects then makes a snapshot of the data by cloning the
+ * collector. This command transfers the clone, along with a few
+ * additional arguments (UUIDs), handing ownership to the
+ * TextureFetch thread. It then merges its own data into the
+ * cloned copy, converts to LLSD and kicks off an HTTP POST of
+ * the resulting data to the currently active metrics collector.
+ *
+ * Corresponds to LLTextureFetch::commandSendMetrics()
+ */
+class TFReqSendMetrics : public LLTextureFetch::TFRequest
+{
+public:
+ /**
+ * Construct the 'Send Metrics' command to have the TextureFetch
+ * thread add and log metrics data.
+ *
+ * @param caps_url URL of a "ViewerMetrics" Caps target
+ * to receive the data. Does not have to
+ * be associated with a particular region.
+ *
+ * @param session_id UUID of the agent's session.
+ *
+ * @param agent_id UUID of the agent. (Being pure here...)
+ *
+ * @param main_stats Pointer to a clone of the main thread's
+ * LLViewerAssetStats data. Thread1 takes
+ * ownership of the copy and disposes of it
+ * when done.
+ */
+ TFReqSendMetrics(const std::string & caps_url,
+ const LLUUID & session_id,
+ const LLUUID & agent_id,
+ LLViewerAssetStats * main_stats)
+ : LLTextureFetch::TFRequest(),
+ mCapsURL(caps_url),
+ mSessionID(session_id),
+ mAgentID(agent_id),
+ mMainStats(main_stats)
+ {}
+ TFReqSendMetrics & operator=(const TFReqSendMetrics &); // Not defined
+
+ virtual ~TFReqSendMetrics();
+
+ virtual bool doWork(LLTextureFetch * fetcher);
+
+public:
+ const std::string mCapsURL;
+ const LLUUID mSessionID;
+ const LLUUID mAgentID;
+ LLViewerAssetStats * mMainStats;
+};
+
+/*
+ * Examines the merged viewer metrics report and if found to be too long,
+ * will attempt to truncate it in some reasonable fashion.
+ *
+ * @param max_regions Limit of regions allowed in report.
+ *
+ * @param metrics Full, merged viewer metrics report.
+ *
+ * @returns If data was truncated, returns true.
+ */
+bool truncate_viewer_metrics(int max_regions, LLSD & metrics);
+
+} // end of anonymous namespace
+
+
+//////////////////////////////////////////////////////////////////////////////
+
//static
const char* LLTextureFetchWorker::sStateDescs[] = {
"INVALID",
@@ -385,6 +626,9 @@ const char* LLTextureFetchWorker::sStateDescs[] = {
"DONE",
};
+// static
+volatile bool LLTextureFetch::svMetricsDataBreak(true); // Start with a data break
+
// called from MAIN THREAD
LLTextureFetchWorker::LLTextureFetchWorker(LLTextureFetch* fetcher,
@@ -434,7 +678,8 @@ LLTextureFetchWorker::LLTextureFetchWorker(LLTextureFetch* fetcher,
mFirstPacket(0),
mLastPacket(-1),
mTotalPackets(0),
- mImageCodec(IMG_CODEC_INVALID)
+ mImageCodec(IMG_CODEC_INVALID),
+ mMetricsStartTime(0)
{
mCanUseNET = mUrl.empty() ;
@@ -572,7 +817,7 @@ void LLTextureFetchWorker::setImagePriority(F32 priority)
void LLTextureFetchWorker::resetFormattedData()
{
- delete[] mBuffer;
+ FREE_MEM(LLImageBase::getPrivatePool(), mBuffer);
mBuffer = NULL;
mBufferSize = 0;
if (mFormattedImage.notNull())
@@ -602,6 +847,7 @@ bool LLTextureFetchWorker::doWork(S32 param)
return true; // abort
}
}
+
if(mImagePriority < F_ALMOST_ZERO)
{
if (mState == INIT || mState == LOAD_FROM_NETWORK || mState == LOAD_FROM_SIMULATOR)
@@ -642,7 +888,7 @@ bool LLTextureFetchWorker::doWork(S32 param)
mSentRequest = UNSENT;
mDecoded = FALSE;
mWritten = FALSE;
- delete[] mBuffer;
+ FREE_MEM(LLImageBase::getPrivatePool(), mBuffer);
mBuffer = NULL;
mBufferSize = 0;
mHaveAllData = FALSE;
@@ -811,7 +1057,15 @@ bool LLTextureFetchWorker::doWork(S32 param)
mRequestedDiscard = mDesiredDiscard;
mSentRequest = QUEUED;
mFetcher->addToNetworkQueue(this);
+ if (! mMetricsStartTime)
+ {
+ mMetricsStartTime = LLViewerAssetStatsFF::get_timestamp();
+ }
+ LLViewerAssetStatsFF::record_enqueue_thread1(LLViewerAssetType::AT_TEXTURE,
+ false,
+ LLImageBase::TYPE_AVATAR_BAKE == mType);
setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority);
+
return false;
}
else
@@ -820,6 +1074,12 @@ bool LLTextureFetchWorker::doWork(S32 param)
//llassert_always(mFetcher->mNetworkQueue.find(mID) != mFetcher->mNetworkQueue.end());
// Make certain this is in the network queue
//mFetcher->addToNetworkQueue(this);
+ //if (! mMetricsStartTime)
+ //{
+ // mMetricsStartTime = LLViewerAssetStatsFF::get_timestamp();
+ //}
+ //LLViewerAssetStatsFF::record_enqueue_thread1(LLViewerAssetType::AT_TEXTURE, false,
+ // LLImageBase::TYPE_AVATAR_BAKE == mType);
//setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority);
return false;
}
@@ -843,11 +1103,30 @@ bool LLTextureFetchWorker::doWork(S32 param)
}
setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority);
mState = DECODE_IMAGE;
- mWriteToCacheState = SHOULD_WRITE ;
+ mWriteToCacheState = SHOULD_WRITE;
+
+ if (mMetricsStartTime)
+ {
+ LLViewerAssetStatsFF::record_response_thread1(LLViewerAssetType::AT_TEXTURE,
+ false,
+ LLImageBase::TYPE_AVATAR_BAKE == mType,
+ LLViewerAssetStatsFF::get_timestamp() - mMetricsStartTime);
+ mMetricsStartTime = 0;
+ }
+ LLViewerAssetStatsFF::record_dequeue_thread1(LLViewerAssetType::AT_TEXTURE,
+ false,
+ LLImageBase::TYPE_AVATAR_BAKE == mType);
}
else
{
mFetcher->addToNetworkQueue(this); // failsafe
+ if (! mMetricsStartTime)
+ {
+ mMetricsStartTime = LLViewerAssetStatsFF::get_timestamp();
+ }
+ LLViewerAssetStatsFF::record_enqueue_thread1(LLViewerAssetType::AT_TEXTURE,
+ false,
+ LLImageBase::TYPE_AVATAR_BAKE == mType);
setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority);
}
return false;
@@ -862,7 +1141,7 @@ bool LLTextureFetchWorker::doWork(S32 param)
//1, not openning too many file descriptors at the same time;
//2, control the traffic of http so udp gets bandwidth.
//
- static const S32 MAX_NUM_OF_HTTP_REQUESTS_IN_QUEUE = 32 ;
+ static const S32 MAX_NUM_OF_HTTP_REQUESTS_IN_QUEUE = 8 ;
if(mFetcher->getNumHTTPRequests() > MAX_NUM_OF_HTTP_REQUESTS_IN_QUEUE)
{
return false ; //wait.
@@ -909,6 +1188,14 @@ bool LLTextureFetchWorker::doWork(S32 param)
mState = WAIT_HTTP_REQ;
mFetcher->addToHTTPQueue(mID);
+ if (! mMetricsStartTime)
+ {
+ mMetricsStartTime = LLViewerAssetStatsFF::get_timestamp();
+ }
+ LLViewerAssetStatsFF::record_enqueue_thread1(LLViewerAssetType::AT_TEXTURE,
+ true,
+ LLImageBase::TYPE_AVATAR_BAKE == mType);
+
// Will call callbackHttpGet when curl request completes
std::vector<std::string> headers;
headers.push_back("Accept: image/x-j2c");
@@ -997,7 +1284,7 @@ bool LLTextureFetchWorker::doWork(S32 param)
llassert_always(mBufferSize == cur_size + mRequestedSize);
if(!mBufferSize)//no data received.
{
- delete[] mBuffer;
+ FREE_MEM(LLImageBase::getPrivatePool(), mBuffer);
mBuffer = NULL;
//abort.
@@ -1025,7 +1312,7 @@ bool LLTextureFetchWorker::doWork(S32 param)
mFileSize = mBufferSize + 1 ; //flag the file is not fully loaded.
}
- U8* buffer = new U8[mBufferSize];
+ U8* buffer = (U8*)ALLOCATE_MEM(LLImageBase::getPrivatePool(), mBufferSize);
if (cur_size > 0)
{
memcpy(buffer, mFormattedImage->getData(), cur_size);
@@ -1034,7 +1321,7 @@ bool LLTextureFetchWorker::doWork(S32 param)
// NOTE: setData releases current data and owns new data (buffer)
mFormattedImage->setData(buffer, mBufferSize);
// delete temp data
- delete[] mBuffer; // Note: not 'buffer' (assigned in setData())
+ FREE_MEM(LLImageBase::getPrivatePool(), mBuffer); // Note: not 'buffer' (assigned in setData())
mBuffer = NULL;
mBufferSize = 0;
mLoadedDiscard = mRequestedDiscard;
@@ -1331,7 +1618,7 @@ bool LLTextureFetchWorker::processSimulatorPackets()
if (buffer_size > cur_size)
{
/// We have new data
- U8* buffer = new U8[buffer_size];
+ U8* buffer = (U8*)ALLOCATE_MEM(LLImageBase::getPrivatePool(), buffer_size);
S32 offset = 0;
if (cur_size > 0 && mFirstPacket > 0)
{
@@ -1383,7 +1670,7 @@ S32 LLTextureFetchWorker::callbackHttpGet(const LLChannelDescriptors& channels,
if (data_size > 0)
{
// *TODO: set the formatted image data here directly to avoid the copy
- mBuffer = new U8[data_size];
+ mBuffer = (U8*)ALLOCATE_MEM(LLImageBase::getPrivatePool(), data_size);
buffer->readAfter(channels.in(), NULL, mBuffer, data_size);
mBufferSize += data_size;
if (data_size < mRequestedSize && mRequestedDiscard == 0)
@@ -1523,8 +1810,8 @@ bool LLTextureFetchWorker::writeToCacheComplete()
//////////////////////////////////////////////////////////////////////////////
// public
-LLTextureFetch::LLTextureFetch(LLTextureCache* cache, LLImageDecodeThread* imagedecodethread, bool threaded)
- : LLWorkerThread("TextureFetch", threaded),
+LLTextureFetch::LLTextureFetch(LLTextureCache* cache, LLImageDecodeThread* imagedecodethread, bool threaded, bool qa_mode)
+ : LLWorkerThread("TextureFetch", threaded, true),
mDebugCount(0),
mDebugPause(FALSE),
mPacketCount(0),
@@ -1535,8 +1822,11 @@ LLTextureFetch::LLTextureFetch(LLTextureCache* cache, LLImageDecodeThread* image
mImageDecodeThread(imagedecodethread),
mTextureBandwidth(0),
mHTTPTextureBits(0),
- mCurlGetRequest(NULL)
+ mTotalHTTPRequests(0),
+ mCurlGetRequest(NULL),
+ mQAMode(qa_mode)
{
+ mCurlPOSTRequestCount = 0;
mMaxBandwidth = gSavedSettings.getF32("ThrottleBandwidthKBPS");
mTextureInfo.setUpLogging(gSavedSettings.getBOOL("LogTextureDownloadsToViewerLog"), gSavedSettings.getBOOL("LogTextureDownloadsToSimulator"), gSavedSettings.getU32("TextureLoggingThreshold"));
}
@@ -1545,6 +1835,13 @@ LLTextureFetch::~LLTextureFetch()
{
clearDeleteList() ;
+ while (! mCommands.empty())
+ {
+ TFRequest * req(mCommands.front());
+ mCommands.erase(mCommands.begin());
+ delete req;
+ }
+
// ~LLQueuedThread() called here
}
@@ -1677,6 +1974,7 @@ void LLTextureFetch::addToHTTPQueue(const LLUUID& id)
{
LLMutexLock lock(&mNetworkQueueMutex);
mHTTPTextureQueue.insert(id);
+ mTotalHTTPRequests++;
}
void LLTextureFetch::removeFromHTTPQueue(const LLUUID& id, S32 received_size)
@@ -1739,6 +2037,15 @@ S32 LLTextureFetch::getNumHTTPRequests()
return size ;
}
+U32 LLTextureFetch::getTotalNumHTTPRequests()
+{
+ mNetworkQueueMutex.lock() ;
+ U32 size = mTotalHTTPRequests ;
+ mNetworkQueueMutex.unlock() ;
+
+ return size ;
+}
+
// call lockQueue() first!
LLTextureFetchWorker* LLTextureFetch::getWorkerAfterLock(const LLUUID& id)
{
@@ -1825,11 +2132,79 @@ bool LLTextureFetch::updateRequestPriority(const LLUUID& id, F32 priority)
return res;
}
+// Replicates and expands upon the base class's
+// getPending() implementation. getPending() and
+// runCondition() replicate one another's logic to
+// an extent and are sometimes used for the same
+// function (deciding whether or not to sleep/pause
+// a thread). So the implementations need to stay
+// in step, at least until this can be refactored and
+// the redundancy eliminated.
+//
+// May be called from any thread
+
+//virtual
+S32 LLTextureFetch::getPending()
+{
+ S32 res;
+ lockData();
+ {
+ LLMutexLock lock(&mQueueMutex);
+
+ res = mRequestQueue.size();
+ res += mCurlPOSTRequestCount;
+ res += mCommands.size();
+ }
+ unlockData();
+ return res;
+}
+
+// virtual
+bool LLTextureFetch::runCondition()
+{
+ // Caller is holding the lock on LLThread's condition variable.
+
+ // LLQueuedThread, unlike its base class LLThread, makes this a
+ // private method which is unfortunate. I want to use it directly
+ // but I'm going to have to re-implement the logic here (or change
+ // declarations, which I don't want to do right now).
+ //
+ // Changes here may need to be reflected in getPending().
+
+ bool have_no_commands(false);
+ {
+ LLMutexLock lock(&mQueueMutex);
+
+ have_no_commands = mCommands.empty();
+ }
+
+ bool have_no_curl_requests(0 == mCurlPOSTRequestCount);
+
+ return ! (have_no_commands
+ && have_no_curl_requests
+ && (mRequestQueue.empty() && mIdleThread)); // From base class
+}
+
//////////////////////////////////////////////////////////////////////////////
+// MAIN THREAD (unthreaded envs), WORKER THREAD (threaded envs)
+void LLTextureFetch::commonUpdate()
+{
+ // Run a cross-thread command, if any.
+ cmdDoWork();
+
+ // Update Curl on same thread as mCurlGetRequest was constructed
+ S32 processed = mCurlGetRequest->process();
+ if (processed > 0)
+ {
+ lldebugs << "processed: " << processed << " messages." << llendl;
+ }
+}
+
+
// MAIN THREAD
//virtual
-S32 LLTextureFetch::update(U32 max_time_ms)
+S32 LLTextureFetch::update(F32 max_time_ms)
{
static LLCachedControl<F32> band_width(gSavedSettings,"ThrottleBandwidthKBPS");
@@ -1852,12 +2227,7 @@ S32 LLTextureFetch::update(U32 max_time_ms)
if (!mThreaded)
{
- // Update Curl on same thread as mCurlGetRequest was constructed
- S32 processed = mCurlGetRequest->process();
- if (processed > 0)
- {
- lldebugs << "processed: " << processed << " messages." << llendl;
- }
+ commonUpdate();
}
return res;
@@ -1912,12 +2282,7 @@ void LLTextureFetch::threadedUpdate()
}
process_timer.reset();
- // Update Curl on same thread as mCurlGetRequest was constructed
- S32 processed = mCurlGetRequest->process();
- if (processed > 0)
- {
- lldebugs << "processed: " << processed << " messages." << llendl;
- }
+ commonUpdate();
#if 0
const F32 INFO_TIME = 1.0f;
@@ -2367,3 +2732,280 @@ void LLTextureFetch::dump()
}
}
+//////////////////////////////////////////////////////////////////////////////
+
+// cross-thread command methods
+
+void LLTextureFetch::commandSetRegion(U64 region_handle)
+{
+ TFReqSetRegion * req = new TFReqSetRegion(region_handle);
+
+ cmdEnqueue(req);
+}
+
+void LLTextureFetch::commandSendMetrics(const std::string & caps_url,
+ const LLUUID & session_id,
+ const LLUUID & agent_id,
+ LLViewerAssetStats * main_stats)
+{
+ TFReqSendMetrics * req = new TFReqSendMetrics(caps_url, session_id, agent_id, main_stats);
+
+ cmdEnqueue(req);
+}
+
+void LLTextureFetch::commandDataBreak()
+{
+ // The pedantically correct way to implement this is to create a command
+ // request object in the above fashion and enqueue it. However, this is
+ // simple data of an advisorial not operational nature and this case
+ // of shared-write access is tolerable.
+
+ LLTextureFetch::svMetricsDataBreak = true;
+}
+
+void LLTextureFetch::cmdEnqueue(TFRequest * req)
+{
+ lockQueue();
+ mCommands.push_back(req);
+ unlockQueue();
+
+ unpause();
+}
+
+LLTextureFetch::TFRequest * LLTextureFetch::cmdDequeue()
+{
+ TFRequest * ret = 0;
+
+ lockQueue();
+ if (! mCommands.empty())
+ {
+ ret = mCommands.front();
+ mCommands.erase(mCommands.begin());
+ }
+ unlockQueue();
+
+ return ret;
+}
+
+void LLTextureFetch::cmdDoWork()
+{
+ if (mDebugPause)
+ {
+ return; // debug: don't do any work
+ }
+
+ TFRequest * req = cmdDequeue();
+ if (req)
+ {
+ // One request per pass should really be enough for this.
+ req->doWork(this);
+ delete req;
+ }
+}
+
+
+//////////////////////////////////////////////////////////////////////////////
+
+// Private (anonymous) class methods implementing the command scheme.
+
+namespace
+{
+
+/**
+ * Implements the 'Set Region' command.
+ *
+ * Thread: Thread1 (TextureFetch)
+ */
+bool
+TFReqSetRegion::doWork(LLTextureFetch *)
+{
+ LLViewerAssetStatsFF::set_region_thread1(mRegionHandle);
+
+ return true;
+}
+
+
+TFReqSendMetrics::~TFReqSendMetrics()
+{
+ delete mMainStats;
+ mMainStats = 0;
+}
+
+
+/**
+ * Implements the 'Send Metrics' command. Takes over
+ * ownership of the passed LLViewerAssetStats pointer.
+ *
+ * Thread: Thread1 (TextureFetch)
+ */
+bool
+TFReqSendMetrics::doWork(LLTextureFetch * fetcher)
+{
+ /*
+ * HTTP POST responder. Doesn't do much but tries to
+ * detect simple breaks in recording the metrics stream.
+ *
+ * The 'volatile' modifiers don't indicate signals,
+ * mmap'd memory or threads, really. They indicate that
+ * the referenced data is part of a pseudo-closure for
+ * this responder rather than being required for correct
+ * operation.
+ *
+ * We don't try very hard with the POST request. We give
+ * it one shot and that's more-or-less it. With a proper
+ * refactoring of the LLQueuedThread usage, these POSTs
+ * could be put in a request object and made more reliable.
+ */
+ class lcl_responder : public LLCurl::Responder
+ {
+ public:
+ lcl_responder(LLTextureFetch * fetcher,
+ S32 expected_sequence,
+ volatile const S32 & live_sequence,
+ volatile bool & reporting_break,
+ volatile bool & reporting_started)
+ : LLCurl::Responder(),
+ mFetcher(fetcher),
+ mExpectedSequence(expected_sequence),
+ mLiveSequence(live_sequence),
+ mReportingBreak(reporting_break),
+ mReportingStarted(reporting_started)
+ {
+ mFetcher->incrCurlPOSTCount();
+ }
+
+ ~lcl_responder()
+ {
+ mFetcher->decrCurlPOSTCount();
+ }
+
+ // virtual
+ void error(U32 status_num, const std::string & reason)
+ {
+ if (mLiveSequence == mExpectedSequence)
+ {
+ mReportingBreak = true;
+ }
+ LL_WARNS("Texture") << "Break in metrics stream due to POST failure to metrics collection service. Reason: "
+ << reason << LL_ENDL;
+ }
+
+ // virtual
+ void result(const LLSD & content)
+ {
+ if (mLiveSequence == mExpectedSequence)
+ {
+ mReportingBreak = false;
+ mReportingStarted = true;
+ }
+ }
+
+ private:
+ LLTextureFetch * mFetcher;
+ S32 mExpectedSequence;
+ volatile const S32 & mLiveSequence;
+ volatile bool & mReportingBreak;
+ volatile bool & mReportingStarted;
+
+ }; // class lcl_responder
+
+ if (! gViewerAssetStatsThread1)
+ return true;
+
+ static volatile bool reporting_started(false);
+ static volatile S32 report_sequence(0);
+
+ // We've taken over ownership of the stats copy at this
+ // point. Get a working reference to it for merging here
+ // but leave it in 'this'. Destructor will rid us of it.
+ LLViewerAssetStats & main_stats = *mMainStats;
+
+ // Merge existing stats into those from main, convert to LLSD
+ main_stats.merge(*gViewerAssetStatsThread1);
+ LLSD merged_llsd = main_stats.asLLSD(true);
+
+ // Add some additional meta fields to the content
+ merged_llsd["session_id"] = mSessionID;
+ merged_llsd["agent_id"] = mAgentID;
+ merged_llsd["message"] = "ViewerAssetMetrics"; // Identifies the type of metrics
+ merged_llsd["sequence"] = report_sequence; // Sequence number
+ merged_llsd["initial"] = ! reporting_started; // Initial data from viewer
+ merged_llsd["break"] = LLTextureFetch::svMetricsDataBreak; // Break in data prior to this report
+
+ // Update sequence number
+ if (S32_MAX == ++report_sequence)
+ report_sequence = 0;
+
+ // Limit the size of the stats report if necessary.
+ merged_llsd["truncated"] = truncate_viewer_metrics(10, merged_llsd);
+
+ if (! mCapsURL.empty())
+ {
+ LLCurlRequest::headers_t headers;
+ fetcher->getCurlRequest().post(mCapsURL,
+ headers,
+ merged_llsd,
+ new lcl_responder(fetcher,
+ report_sequence,
+ report_sequence,
+ LLTextureFetch::svMetricsDataBreak,
+ reporting_started));
+ }
+ else
+ {
+ LLTextureFetch::svMetricsDataBreak = true;
+ }
+
+ // In QA mode, Metrics submode, log the result for ease of testing
+ if (fetcher->isQAMode())
+ {
+ LL_INFOS("Textures") << merged_llsd << LL_ENDL;
+ }
+
+ gViewerAssetStatsThread1->reset();
+
+ return true;
+}
+
+
+bool
+truncate_viewer_metrics(int max_regions, LLSD & metrics)
+{
+ static const LLSD::String reg_tag("regions");
+ static const LLSD::String duration_tag("duration");
+
+ LLSD & reg_map(metrics[reg_tag]);
+ if (reg_map.size() <= max_regions)
+ {
+ return false;
+ }
+
+ // Build map of region hashes ordered by duration
+ typedef std::multimap<LLSD::Real, int> reg_ordered_list_t;
+ reg_ordered_list_t regions_by_duration;
+
+ int ind(0);
+ LLSD::array_const_iterator it_end(reg_map.endArray());
+ for (LLSD::array_const_iterator it(reg_map.beginArray()); it_end != it; ++it, ++ind)
+ {
+ LLSD::Real duration = (*it)[duration_tag].asReal();
+ regions_by_duration.insert(reg_ordered_list_t::value_type(duration, ind));
+ }
+
+ // Build a replacement regions array with the longest-persistence regions
+ LLSD new_region(LLSD::emptyArray());
+ reg_ordered_list_t::const_reverse_iterator it2_end(regions_by_duration.rend());
+ reg_ordered_list_t::const_reverse_iterator it2(regions_by_duration.rbegin());
+ for (int i(0); i < max_regions && it2_end != it2; ++i, ++it2)
+ {
+ new_region.append(reg_map[it2->second]);
+ }
+ reg_map = new_region;
+
+ return true;
+}
+
+} // end of anonymous namespace
+
+
+
diff --git a/indra/newview/lltexturefetch.h b/indra/newview/lltexturefetch.h
index 796109df06..35df7d816f 100644
--- a/indra/newview/lltexturefetch.h
+++ b/indra/newview/lltexturefetch.h
@@ -33,6 +33,7 @@
#include "llworkerthread.h"
#include "llcurl.h"
#include "lltextureinfo.h"
+#include "llapr.h"
class LLViewerTexture;
class LLTextureFetchWorker;
@@ -40,6 +41,7 @@ class HTTPGetResponder;
class LLTextureCache;
class LLImageDecodeThread;
class LLHost;
+class LLViewerAssetStats;
// Interface class
class LLTextureFetch : public LLWorkerThread
@@ -48,10 +50,12 @@ class LLTextureFetch : public LLWorkerThread
friend class HTTPGetResponder;
public:
- LLTextureFetch(LLTextureCache* cache, LLImageDecodeThread* imagedecodethread, bool threaded);
+ LLTextureFetch(LLTextureCache* cache, LLImageDecodeThread* imagedecodethread, bool threaded, bool qa_mode);
~LLTextureFetch();
- /*virtual*/ S32 update(U32 max_time_ms);
+ class TFRequest;
+
+ /*virtual*/ S32 update(F32 max_time_ms);
void shutDownTextureCacheThread() ; //called in the main thread after the TextureCacheThread shuts down.
void shutDownImageDecodeThread() ; //called in the main thread after the ImageDecodeThread shuts down.
@@ -75,30 +79,80 @@ public:
void dump();
S32 getNumRequests() ;
S32 getNumHTTPRequests() ;
+ U32 getTotalNumHTTPRequests() ;
// Public for access by callbacks
+ S32 getPending();
void lockQueue() { mQueueMutex.lock(); }
void unlockQueue() { mQueueMutex.unlock(); }
LLTextureFetchWorker* getWorker(const LLUUID& id);
LLTextureFetchWorker* getWorkerAfterLock(const LLUUID& id);
LLTextureInfo* getTextureInfo() { return &mTextureInfo; }
-
+
+ // Commands available to other threads to control metrics gathering operations.
+ void commandSetRegion(U64 region_handle);
+ void commandSendMetrics(const std::string & caps_url,
+ const LLUUID & session_id,
+ const LLUUID & agent_id,
+ LLViewerAssetStats * main_stats);
+ void commandDataBreak();
+
+ LLCurlRequest & getCurlRequest() { return *mCurlGetRequest; }
+
+ bool isQAMode() const { return mQAMode; }
+
+ // Curl POST counter maintenance
+ inline void incrCurlPOSTCount() { mCurlPOSTRequestCount++; }
+ inline void decrCurlPOSTCount() { mCurlPOSTRequestCount--; }
+
protected:
void addToNetworkQueue(LLTextureFetchWorker* worker);
void removeFromNetworkQueue(LLTextureFetchWorker* worker, bool cancel);
void addToHTTPQueue(const LLUUID& id);
void removeFromHTTPQueue(const LLUUID& id, S32 received_size = 0);
void removeRequest(LLTextureFetchWorker* worker, bool cancel);
- // Called from worker thread (during doWork)
- void processCurlRequests();
+
+ // Overrides from the LLThread tree
+ bool runCondition();
private:
void sendRequestListToSimulators();
/*virtual*/ void startThread(void);
/*virtual*/ void endThread(void);
/*virtual*/ void threadedUpdate(void);
-
+ void commonUpdate();
+
+ // Metrics command helpers
+ /**
+ * Enqueues a command request at the end of the command queue
+ * and wakes up the thread as needed.
+ *
+ * Takes ownership of the TFRequest object.
+ *
+ * Method locks the command queue.
+ */
+ void cmdEnqueue(TFRequest *);
+
+ /**
+ * Returns the first TFRequest object in the command queue or
+ * NULL if none is present.
+ *
+ * Caller acquires ownership of the object and must dispose of it.
+ *
+ * Method locks the command queue.
+ */
+ TFRequest * cmdDequeue();
+
+ /**
+ * Processes the first command in the queue disposing of the
+ * request on completion. Successive calls are needed to perform
+ * additional commands.
+ *
+ * Method locks the command queue.
+ */
+ void cmdDoWork();
+
public:
LLUUID mDebugID;
S32 mDebugCount;
@@ -107,7 +161,7 @@ public:
S32 mBadPacketCount;
private:
- LLMutex mQueueMutex; //to protect mRequestMap only
+ LLMutex mQueueMutex; //to protect mRequestMap and mCommands only
LLMutex mNetworkQueueMutex; //to protect mNetworkQueue, mHTTPTextureQueue and mCancelQueue.
LLTextureCache* mTextureCache;
@@ -129,6 +183,32 @@ private:
LLTextureInfo mTextureInfo;
U32 mHTTPTextureBits;
+
+ //debug use
+ U32 mTotalHTTPRequests ;
+
+ // Out-of-band cross-thread command queue. This command queue
+ // is logically tied to LLQueuedThread's list of
+ // QueuedRequest instances and so must be covered by the
+ // same locks.
+ typedef std::vector<TFRequest *> command_queue_t;
+ command_queue_t mCommands;
+
+ // If true, modifies some behaviors that help with QA tasks.
+ const bool mQAMode;
+
+ // Count of POST requests outstanding. We maintain the count
+ // indirectly in the CURL request responder's ctor and dtor and
+ // use it when determining whether or not to sleep the thread. Can't
+ // use the LLCurl module's request counter as it isn't thread compatible.
+ // *NOTE: Don't mix Atomic and static, apr_initialize must be called first.
+ LLAtomic32<S32> mCurlPOSTRequestCount;
+
+public:
+ // A probabilistically-correct indicator that the current
+ // attempt to log metrics follows a break in the metrics stream
+ // reporting due to either startup or a problem POSTing data.
+ static volatile bool svMetricsDataBreak;
};
#endif // LL_LLTEXTUREFETCH_H
diff --git a/indra/newview/lltexturestats.cpp b/indra/newview/lltexturestats.cpp
index dd35d5cf83..f820ae65df 100644
--- a/indra/newview/lltexturestats.cpp
+++ b/indra/newview/lltexturestats.cpp
@@ -37,7 +37,7 @@ void send_texture_stats_to_sim(const LLSD &texture_stats)
{
LLSD texture_stats_report;
// Only send stats if the agent is connected to a region.
- if (!gAgent.getRegion() || gNoRender)
+ if (!gAgent.getRegion())
{
return;
}
diff --git a/indra/newview/lltextureview.cpp b/indra/newview/lltextureview.cpp
index b9a15fd1f4..5b41a05f2a 100644
--- a/indra/newview/lltextureview.cpp
+++ b/indra/newview/lltextureview.cpp
@@ -94,7 +94,7 @@ public:
Params()
: texture_view("texture_view")
{
- mouse_opaque(false);
+ changeDefault(mouse_opaque, false);
}
};
LLTextureBar(const Params& p)
@@ -386,8 +386,8 @@ public:
Params()
: texture_view("texture_view")
{
- S32 line_height = (S32)(LLFontGL::getFontMonospace()->getLineHeight() + .5f);
- rect(LLRect(0,0,100,line_height * 4));
+ S32 line_height = LLFontGL::getFontMonospace()->getLineHeight();
+ changeDefault(rect, LLRect(0,0,100,line_height * 4));
}
};
@@ -411,7 +411,7 @@ void LLAvatarTexBar::draw()
LLVOAvatarSelf* avatarp = gAgentAvatarp;
if (!avatarp) return;
- const S32 line_height = (S32)(LLFontGL::getFontMonospace()->getLineHeight() + .5f);
+ const S32 line_height = LLFontGL::getFontMonospace()->getLineHeight();
const S32 v_offset = 0;
const S32 l_offset = 3;
@@ -485,8 +485,8 @@ public:
Params()
: texture_view("texture_view")
{
- S32 line_height = (S32)(LLFontGL::getFontMonospace()->getLineHeight() + .5f);
- rect(LLRect(0,0,100,line_height * 4));
+ S32 line_height = LLFontGL::getFontMonospace()->getLineHeight();
+ changeDefault(rect, LLRect(0,0,100,line_height * 4));
}
};
@@ -512,10 +512,11 @@ void LLGLTexMemBar::draw()
F32 discard_bias = LLViewerTexture::sDesiredDiscardBias;
F32 cache_usage = (F32)BYTES_TO_MEGA_BYTES(LLAppViewer::getTextureCache()->getUsage()) ;
F32 cache_max_usage = (F32)BYTES_TO_MEGA_BYTES(LLAppViewer::getTextureCache()->getMaxUsage()) ;
- S32 line_height = (S32)(LLFontGL::getFontMonospace()->getLineHeight() + .5f);
+ S32 line_height = LLFontGL::getFontMonospace()->getLineHeight();
S32 v_offset = (S32)((texture_bar_height + 2.2f) * mTextureView->mNumTextureBars + 2.0f);
F32 total_texture_downloaded = (F32)gTotalTextureBytes / (1024 * 1024);
F32 total_object_downloaded = (F32)gTotalObjectBytes / (1024 * 1024);
+ U32 total_http_requests = LLAppViewer::getTextureFetch()->getTotalNumHTTPRequests() ;
//----------------------------------------------------------------------------
LLGLSUIDefault gls_ui;
LLColor4 text_color(1.f, 1.f, 1.f, 0.75f);
@@ -526,13 +527,14 @@ void LLGLTexMemBar::draw()
LLFontGL::getFontMonospace()->renderUTF8(text, 0, 0, v_offset + line_height*6,
text_color, LLFontGL::LEFT, LLFontGL::TOP);
- text = llformat("GL Tot: %d/%d MB Bound: %d/%d MB Raw Tot: %d MB Bias: %.2f Cache: %.1f/%.1f MB Net Tot Tex: %.1f MB Tot Obj: %.1f MB",
+ text = llformat("GL Tot: %d/%d MB Bound: %d/%d MB FBO: %d MB Raw Tot: %d MB Bias: %.2f Cache: %.1f/%.1f MB Net Tot Tex: %.1f MB Tot Obj: %.1f MB Tot Htp: %d",
total_mem,
max_total_mem,
bound_mem,
max_bound_mem,
+ LLRenderTarget::sBytesAllocated/(1024*1024),
LLImageRaw::sGlobalRawMemory >> 20, discard_bias,
- cache_usage, cache_max_usage, total_texture_downloaded, total_object_downloaded);
+ cache_usage, cache_max_usage, total_texture_downloaded, total_object_downloaded, total_http_requests);
//, cache_entries, cache_max_entries
LLFontGL::getFontMonospace()->renderUTF8(text, 0, 0, v_offset + line_height*3,
@@ -570,7 +572,7 @@ void LLGLTexMemBar::draw()
color = (total_mem < llfloor(max_total_mem * texmem_lower_bound_scale)) ? LLColor4::green :
(total_mem < max_total_mem) ? LLColor4::yellow : LLColor4::red;
color[VALPHA] = .75f;
- glColor4fv(color.mV);
+ gGL.diffuseColor4fv(color.mV);
gl_rect_2d(left, top, right, bottom); // red/yellow/green
@@ -593,7 +595,7 @@ void LLGLTexMemBar::draw()
color = (bound_mem < llfloor(max_bound_mem * texmem_lower_bound_scale)) ? LLColor4::green :
(bound_mem < max_bound_mem) ? LLColor4::yellow : LLColor4::red;
color[VALPHA] = .75f;
- glColor4fv(color.mV);
+ gGL.diffuseColor4fv(color.mV);
gl_rect_2d(left, top, right, bottom);
#else
@@ -1095,7 +1097,7 @@ void LLTextureSizeView::drawTextureSizeGraph()
{
if(mTextureSizeBar.size() == 0)
{
- S32 line_height = (S32)(LLFontGL::getFontMonospace()->getLineHeight() + .5f);
+ S32 line_height = LLFontGL::getFontMonospace()->getLineHeight();
mTextureSizeBar.resize(LLImageGL::sTextureLoadedCounter.size()) ;
mTextureSizeBarRect.set(700, line_height * 2 + 400, 700 + mTextureSizeBar.size() * mTextureSizeBarWidth, line_height * 2) ;
@@ -1138,7 +1140,7 @@ F32 LLTextureSizeView::drawTextureSizeDistributionGraph()
}
}
- S32 line_height = (S32)(LLFontGL::getFontMonospace()->getLineHeight() + .5f);
+ S32 line_height = LLFontGL::getFontMonospace()->getLineHeight();
S32 left = mTextureSizeBarRect.mLeft ;
S32 bottom = mTextureSizeBarRect.mBottom ;
S32 right = mTextureSizeBarRect.mRight ;
@@ -1220,7 +1222,7 @@ void LLTextureSizeView::drawTextureCategoryGraph()
{
if(mTextureSizeBar.size() == 0)
{
- S32 line_height = (S32)(LLFontGL::getFontMonospace()->getLineHeight() + .5f);
+ S32 line_height = LLFontGL::getFontMonospace()->getLineHeight();
mTextureSizeBar.resize(LLViewerTexture::getTotalNumOfCategories()) ;
mTextureSizeBarRect.set(700, line_height * 2 + 400, 700 + mTextureSizeBar.size() * mTextureSizeBarWidth, line_height * 2) ;
@@ -1265,7 +1267,7 @@ F32 LLTextureSizeView::drawTextureCategoryDistributionGraph()
}
}
- S32 line_height = (S32)(LLFontGL::getFontMonospace()->getLineHeight() + .5f);
+ S32 line_height = LLFontGL::getFontMonospace()->getLineHeight();
S32 left = mTextureSizeBarRect.mLeft ;
S32 bottom = mTextureSizeBarRect.mBottom ;
S32 right = mTextureSizeBarRect.mRight ;
diff --git a/indra/newview/lltoast.cpp b/indra/newview/lltoast.cpp
index 8176b8c1f9..0eec7f0afd 100644
--- a/indra/newview/lltoast.cpp
+++ b/indra/newview/lltoast.cpp
@@ -99,7 +99,6 @@ LLToast::Params::Params()
LLToast::LLToast(const LLToast::Params& p)
: LLModalDialog(LLSD(), p.is_modal),
- mPanel(p.panel),
mToastLifetime(p.lifetime_secs),
mToastFadingTime(p.fading_time_secs),
mNotificationID(p.notif_id),
@@ -108,12 +107,14 @@ LLToast::LLToast(const LLToast::Params& p)
mCanBeStored(p.can_be_stored),
mHideBtnEnabled(p.enable_hide_btn),
mHideBtn(NULL),
+ mPanel(NULL),
mNotification(p.notification),
mIsHidden(false),
mHideBtnPressed(false),
mIsTip(p.is_tip),
mWrapperPanel(NULL),
- mIsTransparent(false)
+ mIsFading(false),
+ mIsHovered(false)
{
mTimer.reset(new LLToastLifeTimer(this, p.lifetime_secs));
@@ -122,29 +123,26 @@ LLToast::LLToast(const LLToast::Params& p)
setCanDrag(FALSE);
mWrapperPanel = getChild<LLPanel>("wrapper_panel");
- mWrapperPanel->setMouseEnterCallback(boost::bind(&LLToast::onToastMouseEnter, this));
- mWrapperPanel->setMouseLeaveCallback(boost::bind(&LLToast::onToastMouseLeave, this));
- if(mPanel)
+ setBackgroundOpaque(TRUE); // *TODO: obsolete
+ updateTransparency();
+
+ if(p.panel())
{
- insertPanel(mPanel);
+ insertPanel(p.panel);
}
if(mHideBtnEnabled)
{
mHideBtn = getChild<LLButton>("hide_btn");
mHideBtn->setClickedCallback(boost::bind(&LLToast::hide,this));
- mHideBtn->setMouseEnterCallback(boost::bind(&LLToast::onToastMouseEnter, this));
- mHideBtn->setMouseLeaveCallback(boost::bind(&LLToast::onToastMouseLeave, this));
}
// init callbacks if present
if(!p.on_delete_toast().empty())
+ {
mOnDeleteToastSignal.connect(p.on_delete_toast());
-
- // *TODO: This signal doesn't seem to be used at all.
- if(!p.on_mouse_enter().empty())
- mOnMouseEnterSignal.connect(p.on_mouse_enter());
+ }
}
void LLToast::reshape(S32 width, S32 height, BOOL called_from_parent)
@@ -182,11 +180,14 @@ LLToast::~LLToast()
//--------------------------------------------------------------------------
void LLToast::hide()
{
- setVisible(FALSE);
- setTransparentState(false);
- mTimer->stop();
- mIsHidden = true;
- mOnFadeSignal(this);
+ if (!mIsHidden)
+ {
+ setVisible(FALSE);
+ setFading(false);
+ mTimer->stop();
+ mIsHidden = true;
+ mOnFadeSignal(this);
+ }
}
void LLToast::onFocusLost()
@@ -194,7 +195,7 @@ void LLToast::onFocusLost()
if(mWrapperPanel && !isBackgroundVisible())
{
// Lets make wrapper panel behave like a floater
- setBackgroundOpaque(FALSE);
+ updateTransparency();
}
}
@@ -203,7 +204,7 @@ void LLToast::onFocusReceived()
if(mWrapperPanel && !isBackgroundVisible())
{
// Lets make wrapper panel behave like a floater
- setBackgroundOpaque(TRUE);
+ updateTransparency();
}
}
@@ -217,6 +218,13 @@ void LLToast::setFadingTime(S32 seconds)
mToastFadingTime = seconds;
}
+void LLToast::closeToast()
+{
+ mOnDeleteToastSignal(this);
+
+ closeFloater();
+}
+
S32 LLToast::getTopPad()
{
if(mWrapperPanel)
@@ -240,7 +248,9 @@ void LLToast::setCanFade(bool can_fade)
{
mCanFade = can_fade;
if(!mCanFade)
+ {
mTimer->stop();
+ }
}
//--------------------------------------------------------------------------
@@ -248,22 +258,24 @@ void LLToast::expire()
{
if (mCanFade)
{
- if (mIsTransparent)
+ if (mIsFading)
{
+ // Fade timer expired. Time to hide.
hide();
}
else
{
- setTransparentState(true);
+ // "Life" time has ended. Time to fade.
+ setFading(true);
mTimer->restart();
}
}
}
-void LLToast::setTransparentState(bool transparent)
+void LLToast::setFading(bool transparent)
{
- setBackgroundOpaque(!transparent);
- mIsTransparent = transparent;
+ mIsFading = transparent;
+ updateTransparency();
if (transparent)
{
@@ -279,7 +291,7 @@ F32 LLToast::getTimeLeftToLive()
{
F32 time_to_live = mTimer->getRemainingTimeF32();
- if (!mIsTransparent)
+ if (!mIsFading)
{
time_to_live += mToastFadingTime;
}
@@ -294,9 +306,7 @@ void LLToast::reshapeToPanel()
if(!panel)
return;
- LLRect panel_rect = panel->getRect();
-
- panel_rect.setLeftTopAndSize(0, panel_rect.getHeight(), panel_rect.getWidth(), panel_rect.getHeight());
+ LLRect panel_rect = panel->getLocalRect();
panel->setShape(panel_rect);
LLRect toast_rect = getRect();
@@ -308,6 +318,7 @@ void LLToast::reshapeToPanel()
void LLToast::insertPanel(LLPanel* panel)
{
+ mPanel = panel;
mWrapperPanel->addChild(panel);
reshapeToPanel();
}
@@ -351,7 +362,6 @@ void LLToast::setVisible(BOOL show)
if(show)
{
- setBackgroundOpaque(TRUE);
if(!mTimer->getStarted() && mCanFade)
{
mTimer->start();
@@ -377,8 +387,11 @@ void LLToast::setVisible(BOOL show)
}
}
-void LLToast::onToastMouseEnter()
+void LLToast::updateHoveredState()
{
+ S32 x, y;
+ LLUI::getMousePositionScreen(&x, &y);
+
LLRect panel_rc = mWrapperPanel->calcScreenRect();
LLRect button_rc;
if(mHideBtn)
@@ -386,55 +399,83 @@ void LLToast::onToastMouseEnter()
button_rc = mHideBtn->calcScreenRect();
}
- S32 x, y;
- LLUI::getMousePositionScreen(&x, &y);
-
- if(panel_rc.pointInRect(x, y) || button_rc.pointInRect(x, y))
+ if (!panel_rc.pointInRect(x, y) && !button_rc.pointInRect(x, y))
{
- mOnToastHoverSignal(this, MOUSE_ENTER);
-
- setBackgroundOpaque(TRUE);
+ // mouse is not over this toast
+ mIsHovered = false;
+ }
+ else
+ {
+ bool is_overlapped_by_other_floater = false;
- //toasts fading is management by Screen Channel
+ const child_list_t* child_list = gFloaterView->getChildList();
- sendChildToFront(mHideBtn);
- if(mHideBtn && mHideBtn->getEnabled())
+ // find this toast in gFloaterView child list to check whether any floater
+ // with higher Z-order is visible under the mouse pointer overlapping this toast
+ child_list_const_reverse_iter_t r_iter = std::find(child_list->rbegin(), child_list->rend(), this);
+ if (r_iter != child_list->rend())
{
- mHideBtn->setVisible(TRUE);
+ // skip this toast and proceed to views above in Z-order
+ for (++r_iter; r_iter != child_list->rend(); ++r_iter)
+ {
+ LLView* view = *r_iter;
+ is_overlapped_by_other_floater = view->isInVisibleChain() && view->calcScreenRect().pointInRect(x, y);
+ if (is_overlapped_by_other_floater)
+ {
+ break;
+ }
+ }
}
- mOnMouseEnterSignal(this);
- mToastMouseEnterSignal(this, getValue());
- }
-}
-void LLToast::onToastMouseLeave()
-{
- LLRect panel_rc = mWrapperPanel->calcScreenRect();
- LLRect button_rc;
- if(mHideBtn)
- {
- button_rc = mHideBtn->calcScreenRect();
+ mIsHovered = !is_overlapped_by_other_floater;
}
- S32 x, y;
- LLUI::getMousePositionScreen(&x, &y);
-
- if( !panel_rc.pointInRect(x, y) && !button_rc.pointInRect(x, y))
- {
- mOnToastHoverSignal(this, MOUSE_LEAVE);
-
- //toasts fading is management by Screen Channel
-
- if(mHideBtn && mHideBtn->getEnabled())
+ LLToastLifeTimer* timer = getTimer();
+
+ if (timer)
+ {
+ // Started timer means the mouse had left the toast previously.
+ // If toast is hovered in the current frame we should handle
+ // a mouse enter event.
+ if(timer->getStarted() && mIsHovered)
+ {
+ mOnToastHoverSignal(this, MOUSE_ENTER);
+
+ updateTransparency();
+
+ //toasts fading is management by Screen Channel
+
+ sendChildToFront(mHideBtn);
+ if(mHideBtn && mHideBtn->getEnabled())
+ {
+ mHideBtn->setVisible(TRUE);
+ }
+
+ mToastMouseEnterSignal(this, getValue());
+ }
+ // Stopped timer means the mouse had entered the toast previously.
+ // If the toast is not hovered in the current frame we should handle
+ // a mouse leave event.
+ else if(!timer->getStarted() && !mIsHovered)
{
- if( mHideBtnPressed )
+ mOnToastHoverSignal(this, MOUSE_LEAVE);
+
+ updateTransparency();
+
+ //toasts fading is management by Screen Channel
+
+ if(mHideBtn && mHideBtn->getEnabled())
{
- mHideBtnPressed = false;
- return;
+ if( mHideBtnPressed )
+ {
+ mHideBtnPressed = false;
+ return;
+ }
+ mHideBtn->setVisible(FALSE);
}
- mHideBtn->setVisible(FALSE);
+
+ mToastMouseLeaveSignal(this, getValue());
}
- mToastMouseLeaveSignal(this, getValue());
}
}
@@ -450,29 +491,47 @@ void LLToast::setBackgroundOpaque(BOOL b)
}
}
-void LLNotificationsUI::LLToast::stopFading()
+void LLToast::updateTransparency()
{
- if(mCanFade)
+ ETypeTransparency transparency_type;
+
+ if (mCanFade)
{
- setTransparentState(false);
- mTimer->stop();
+ // Notification toasts (including IM/chat toasts) change their transparency on hover.
+ if (isHovered())
+ {
+ transparency_type = TT_ACTIVE;
+ }
+ else
+ {
+ transparency_type = mIsFading ? TT_FADING : TT_INACTIVE;
+ }
}
+ else
+ {
+ // Transparency of alert toasts depends on focus.
+ transparency_type = hasFocus() ? TT_ACTIVE : TT_INACTIVE;
+ }
+
+ LLFloater::updateTransparency(transparency_type);
}
-void LLNotificationsUI::LLToast::startFading()
+void LLNotificationsUI::LLToast::stopTimer()
{
if(mCanFade)
{
- setTransparentState(false);
- mTimer->start();
+ setFading(false);
+ mTimer->stop();
}
}
-bool LLToast::isHovered()
+void LLNotificationsUI::LLToast::startTimer()
{
- S32 x, y;
- LLUI::getMousePositionScreen(&x, &y);
- return mWrapperPanel->calcScreenRect().pointInRect(x, y);
+ if(mCanFade)
+ {
+ setFading(false);
+ mTimer->start();
+ }
}
//--------------------------------------------------------------------------
@@ -509,3 +568,14 @@ S32 LLToast::notifyParent(const LLSD& info)
return LLModalDialog::notifyParent(info);
}
+
+//static
+void LLToast::updateClass()
+{
+ for (LLInstanceTracker<LLToast>::instance_iter iter = LLInstanceTracker<LLToast>::beginInstances(); iter != LLInstanceTracker<LLToast>::endInstances(); )
+ {
+ LLToast& toast = *iter++;
+
+ toast.updateHoveredState();
+ }
+}
diff --git a/indra/newview/lltoast.h b/indra/newview/lltoast.h
index fb534561c9..e1d99b1bcb 100644
--- a/indra/newview/lltoast.h
+++ b/indra/newview/lltoast.h
@@ -27,7 +27,7 @@
#ifndef LL_LLTOAST_H
#define LL_LLTOAST_H
-
+#include "llinstancetracker.h"
#include "llpanel.h"
#include "llmodaldialog.h"
#include "lleventtimer.h"
@@ -69,12 +69,13 @@ private :
* Represents toast pop-up.
* This is a parent view for all toast panels.
*/
-class LLToast : public LLModalDialog
+class LLToast : public LLModalDialog, public LLInstanceTracker<LLToast>
{
friend class LLToastLifeTimer;
public:
typedef boost::function<void (LLToast* toast)> toast_callback_t;
typedef boost::signals2::signal<void (LLToast* toast)> toast_signal_t;
+ typedef boost::signals2::signal<void (LLToast* toast, bool mouse_enter)> toast_hover_check_signal_t;
struct Params : public LLInitParam::Block<Params>
{
@@ -90,8 +91,7 @@ public:
fading_time_secs; // Number of seconds while a toast is transparent
- Optional<toast_callback_t> on_delete_toast,
- on_mouse_enter;
+ Optional<toast_callback_t> on_delete_toast;
Optional<bool> can_fade,
can_be_stored,
enable_hide_btn,
@@ -103,6 +103,8 @@ public:
Params();
};
+
+ static void updateClass();
LLToast(const LLToast::Params& p);
virtual ~LLToast();
@@ -115,13 +117,13 @@ public:
//Fading
- /** Stop fading timer */
- virtual void stopFading();
+ /** Stop lifetime/fading timer */
+ virtual void stopTimer();
- /** Start fading timer */
- virtual void startFading();
+ /** Start lifetime/fading timer */
+ virtual void startTimer();
- bool isHovered();
+ bool isHovered() { return mIsHovered; }
// Operating with toasts
// insert a panel to a toast
@@ -130,7 +132,7 @@ public:
void reshapeToPanel();
// get toast's panel
- LLPanel* getPanel() { return mPanel; }
+ LLPanel* getPanel() const { return mPanel; }
// enable/disable Toast's Hide button
void setHideButtonEnabled(bool enabled);
//
@@ -154,6 +156,8 @@ public:
void setFadingTime(S32 seconds);
+ void closeToast();
+
/**
* Returns padding between floater top and wrapper_panel top.
* This padding should be taken into account when positioning or reshaping toasts
@@ -166,9 +170,9 @@ public:
// get information whether the notification corresponding to the toast is valid or not
bool isNotificationValid();
// get toast's Notification ID
- const LLUUID getNotificationID() { return mNotificationID;}
+ const LLUUID getNotificationID() const { return mNotificationID;}
// get toast's Session ID
- const LLUUID getSessionID() { return mSessionID;}
+ const LLUUID getSessionID() const { return mSessionID;}
//
void setCanFade(bool can_fade);
//
@@ -178,43 +182,35 @@ public:
// set whether this toast considered as hidden or not
void setIsHidden( bool is_toast_hidden ) { mIsHidden = is_toast_hidden; }
- const LLNotificationPtr& getNotification() { return mNotification;}
+ const LLNotificationPtr& getNotification() const { return mNotification;}
// Registers signals/callbacks for events
- toast_signal_t mOnFadeSignal;
- toast_signal_t mOnMouseEnterSignal;
- toast_signal_t mOnDeleteToastSignal;
- toast_signal_t mOnToastDestroyedSignal;
- boost::signals2::connection setOnFadeCallback(toast_callback_t cb) { return mOnFadeSignal.connect(cb); }
- boost::signals2::connection setOnToastDestroyedCallback(toast_callback_t cb) { return mOnToastDestroyedSignal.connect(cb); }
-
- typedef boost::function<void (LLToast* toast, bool mouse_enter)> toast_hover_check_callback_t;
- typedef boost::signals2::signal<void (LLToast* toast, bool mouse_enter)> toast_hover_check_signal_t;
- toast_hover_check_signal_t mOnToastHoverSignal;
- boost::signals2::connection setOnToastHoverCallback(toast_hover_check_callback_t cb) { return mOnToastHoverSignal.connect(cb); }
+ boost::signals2::connection setOnFadeCallback(const toast_signal_t::slot_type& cb) { return mOnFadeSignal.connect(cb); }
+ boost::signals2::connection setOnToastDestroyedCallback(const toast_signal_t::slot_type& cb) { return mOnToastDestroyedSignal.connect(cb); }
+ boost::signals2::connection setOnToastHoverCallback(const toast_hover_check_signal_t::slot_type& cb) { return mOnToastHoverSignal.connect(cb); }
boost::signals2::connection setMouseEnterCallback( const commit_signal_t::slot_type& cb ) { return mToastMouseEnterSignal.connect(cb); };
boost::signals2::connection setMouseLeaveCallback( const commit_signal_t::slot_type& cb ) { return mToastMouseLeaveSignal.connect(cb); };
virtual S32 notifyParent(const LLSD& info);
- LLHandle<LLToast> getHandle() { mHandle.bind(this); return mHandle; }
+ LLHandle<LLToast> getHandle() const { return getDerivedHandle<LLToast>(); }
-private:
-
- void onToastMouseEnter();
+protected:
+ void updateTransparency();
- void onToastMouseLeave();
+private:
+ void updateHoveredState();
void expire();
- void setTransparentState(bool transparent);
+ void setFading(bool fading);
LLUUID mNotificationID;
LLUUID mSessionID;
LLNotificationPtr mNotification;
- LLRootHandle<LLToast> mHandle;
+ //LLRootHandle<LLToast> mHandle;
LLPanel* mWrapperPanel;
@@ -223,7 +219,7 @@ private:
F32 mToastLifetime; // in seconds
F32 mToastFadingTime; // in seconds
-
+
LLPanel* mPanel;
LLButton* mHideBtn;
@@ -234,7 +230,13 @@ private:
bool mHideBtnPressed;
bool mIsHidden; // this flag is TRUE when a toast has faded or was hidden with (x) button (EXT-1849)
bool mIsTip;
- bool mIsTransparent;
+ bool mIsFading;
+ bool mIsHovered;
+
+ toast_signal_t mOnFadeSignal;
+ toast_signal_t mOnDeleteToastSignal;
+ toast_signal_t mOnToastDestroyedSignal;
+ toast_hover_check_signal_t mOnToastHoverSignal;
commit_signal_t mToastMouseEnterSignal;
commit_signal_t mToastMouseLeaveSignal;
diff --git a/indra/newview/lltoastalertpanel.cpp b/indra/newview/lltoastalertpanel.cpp
index 8b2f066d41..8fef2ed6d1 100644
--- a/indra/newview/lltoastalertpanel.cpp
+++ b/indra/newview/lltoastalertpanel.cpp
@@ -69,8 +69,22 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal
mLabel(notification->getName()),
mLineEditor(NULL)
{
+ // EXP-1822
+ // save currently focused view, so that return focus to it
+ // on destroying this toast.
+ LLView* current_selection = dynamic_cast<LLView*>(gFocusMgr.getKeyboardFocus());
+ while(current_selection)
+ {
+ if (current_selection->isFocusRoot())
+ {
+ mPreviouslyFocusedView = current_selection->getHandle();
+ break;
+ }
+ current_selection = current_selection->getParent();
+ }
+
const LLFontGL* font = LLFontGL::getFontSansSerif();
- const S32 LINE_HEIGHT = llfloor(font->getLineHeight() + 0.99f);
+ const S32 LINE_HEIGHT = font->getLineHeight();
const S32 EDITOR_HEIGHT = 20;
LLNotificationFormPtr form = mNotification->getForm();
@@ -220,7 +234,6 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal
}
static LLUIColor alert_caution_text_color = LLUIColorTable::instance().getColor("AlertCautionTextColor");
- static LLUIColor alert_text_color = LLUIColorTable::instance().getColor("AlertTextColor");
if (mCaution)
{
LLIconCtrl* icon = LLUICtrlFactory::getInstance()->createFromFile<LLIconCtrl>("alert_icon.xml", this, LLPanel::child_registry_t::instance());
@@ -233,10 +246,6 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal
msg_x += 32 + HPAD;
msg_box->setColor( alert_caution_text_color );
}
- else
- {
- msg_box->setColor( alert_text_color );
- }
LLRect rect;
rect.setLeftTopAndSize( msg_x, msg_y, text_rect.getWidth(), text_rect.getHeight() );
@@ -370,7 +379,7 @@ bool LLToastAlertPanel::setCheckBox( const std::string& check_title, const std::
}
const LLFontGL* font = mCheck->getFont();
- const S32 LINE_HEIGHT = llfloor(font->getLineHeight() + 0.99f);
+ const S32 LINE_HEIGHT = font->getLineHeight();
// Extend dialog for "check next time"
S32 max_msg_width = LLToastPanel::getRect().getWidth() - 2 * HPAD;
@@ -413,6 +422,13 @@ LLToastAlertPanel::~LLToastAlertPanel()
{
LLTransientFloaterMgr::instance().removeControlView(
LLTransientFloaterMgr::GLOBAL, this);
+
+ // EXP-1822
+ // return focus to the previously focused view if the viewer is not exiting
+ if (mPreviouslyFocusedView.get() && !LLApp::isExiting())
+ {
+ mPreviouslyFocusedView.get()->setFocus(TRUE);
+ }
}
BOOL LLToastAlertPanel::hasTitleBar() const
diff --git a/indra/newview/lltoastalertpanel.h b/indra/newview/lltoastalertpanel.h
index 7b157f19bb..d1be5e018e 100644
--- a/indra/newview/lltoastalertpanel.h
+++ b/indra/newview/lltoastalertpanel.h
@@ -113,6 +113,7 @@ private:
LLFrameTimer mDefaultBtnTimer;
// For Dialogs that take a line as text as input:
LLLineEditor* mLineEditor;
+ LLHandle<LLView> mPreviouslyFocusedView;
};
diff --git a/indra/newview/lltoastgroupnotifypanel.cpp b/indra/newview/lltoastgroupnotifypanel.cpp
index 563c27c4d7..75178a6ef8 100644
--- a/indra/newview/lltoastgroupnotifypanel.cpp
+++ b/indra/newview/lltoastgroupnotifypanel.cpp
@@ -77,6 +77,7 @@ LLToastGroupNotifyPanel::LLToastGroupNotifyPanel(LLNotificationPtr& notification
from << from_name << "/" << groupData.mName;
LLTextBox* pTitleText = getChild<LLTextBox>("title");
pTitleText->setValue(from.str());
+ pTitleText->setToolTip(from.str());
//message subject
const std::string& subject = payload["subject"].asString();
diff --git a/indra/newview/lltoastnotifypanel.cpp b/indra/newview/lltoastnotifypanel.cpp
index 3f7dc24ade..a8060649ba 100644
--- a/indra/newview/lltoastnotifypanel.cpp
+++ b/indra/newview/lltoastnotifypanel.cpp
@@ -91,8 +91,6 @@ mCloseNotificationOnDestroy(true)
sFont = LLFontGL::getFontSansSerif();
sFontSmall = LLFontGL::getFontSansSerifSmall();
}
- // clicking on a button does not steal current focus
- setIsChrome(TRUE);
// initialize
setFocusRoot(!mIsTip);
// get a form for the notification
@@ -245,8 +243,8 @@ LLButton* LLToastNotifyPanel::createButton(const LLSD& form_element, BOOL is_opt
mBtnCallbackData.push_back(userdata);
LLButton::Params p;
- bool is_ignore_btn = form_element["index"].asInteger() == -1;
- const LLFontGL* font = is_ignore_btn ? sFontSmall: sFont; // for ignore button in script dialog
+ bool make_small_btn = form_element["index"].asInteger() == -1 || form_element["index"].asInteger() == -2;
+ const LLFontGL* font = make_small_btn ? sFontSmall: sFont; // for block and ignore buttons in script dialog
p.name(form_element["name"].asString());
p.label(form_element["text"].asString());
p.font(font);
@@ -266,7 +264,7 @@ LLButton* LLToastNotifyPanel::createButton(const LLSD& form_element, BOOL is_opt
p.rect.width = 1;
p.auto_resize = true;
}
- else if (mIsScriptDialog && is_ignore_btn)
+ else if (mIsScriptDialog && make_small_btn)
{
// this is ignore button, make it smaller
p.rect.height = BTN_HEIGHT_SMALL;
@@ -307,8 +305,14 @@ void LLToastNotifyPanel::updateButtonsLayout(const std::vector<index_button_pair
S32 bottom_offset = mIsScriptDialog ? (BTN_HEIGHT + IGNORE_BTN_TOP_DELTA + BOTTOM_PAD) : BOTTOM_PAD;
S32 max_width = mControlPanel->getRect().getWidth();
LLButton* ignore_btn = NULL;
+ LLButton* mute_btn = NULL;
for (std::vector<index_button_pair_t>::const_iterator it = buttons.begin(); it != buttons.end(); it++)
{
+ if (-2 == it->first)
+ {
+ mute_btn = it->second;
+ continue;
+ }
if (it->first == -1)
{
ignore_btn = it->second;
@@ -328,6 +332,8 @@ void LLToastNotifyPanel::updateButtonsLayout(const std::vector<index_button_pair
left = btn_rect.mLeft + btn_rect.getWidth() + h_pad;
mControlPanel->addChild(btn, -1);
}
+
+ U32 ignore_btn_width = 0;
if (mIsScriptDialog && ignore_btn != NULL)
{
LLRect ignore_btn_rect(ignore_btn->getRect());
@@ -340,8 +346,25 @@ void LLToastNotifyPanel::updateButtonsLayout(const std::vector<index_button_pair
ignore_btn_rect.setOriginAndSize(ignore_btn_left, BOTTOM_PAD,// always move ignore button at the bottom
ignore_btn_rect.getWidth(), ignore_btn_rect.getHeight());
ignore_btn->setRect(ignore_btn_rect);
+ ignore_btn_width = ignore_btn_rect.getWidth();
mControlPanel->addChild(ignore_btn, -1);
}
+
+ if (mIsScriptDialog && mute_btn != NULL)
+ {
+ LLRect mute_btn_rect(mute_btn->getRect());
+ S32 buttons_per_row = max_width / BUTTON_WIDTH; //assume that h_pad far less than BUTTON_WIDTH
+ // Place mute (Block) button to the left of the ignore button.
+ S32 mute_btn_left = buttons_per_row * BUTTON_WIDTH + (buttons_per_row - 1) * h_pad - mute_btn_rect.getWidth() - ignore_btn_width - (h_pad / 2);
+ if (mute_btn_left + mute_btn_rect.getWidth() > max_width) // make sure that the mute button is in panel
+ {
+ mute_btn_left = max_width - mute_btn_rect.getWidth() - 2 * HPAD;
+ }
+ mute_btn_rect.setOriginAndSize(mute_btn_left, BOTTOM_PAD,// always move mute button at the bottom
+ mute_btn_rect.getWidth(), mute_btn_rect.getHeight());
+ mute_btn->setRect(mute_btn_rect);
+ mControlPanel->addChild(mute_btn);
+ }
}
void LLToastNotifyPanel::adjustPanelForScriptNotice(S32 button_panel_width, S32 button_panel_height)
@@ -563,7 +586,17 @@ void LLIMToastNotifyPanel::reshape(S32 width, S32 height, BOOL called_from_paren
height = rc.getHeight();
width = rc.getWidth();
+ bool is_width_changed = width != getRect().getWidth();
+
LLToastPanel::reshape(width, height, called_from_parent);
+
+ // Notification height required to display the text message depends on
+ // the width of the text box thus if panel width is changed the text box
+ // width is also changed then reshape() is called to adjust proper height.
+ if (is_width_changed)
+ {
+ reshape(width, height, called_from_parent);
+ }
}
// EOF
diff --git a/indra/newview/lltoastpanel.cpp b/indra/newview/lltoastpanel.cpp
index fc69157a40..d2a4ce8745 100644
--- a/indra/newview/lltoastpanel.cpp
+++ b/indra/newview/lltoastpanel.cpp
@@ -68,7 +68,7 @@ void LLToastPanel::snapToMessageHeight(LLTextBase* message, S32 maxLineCount)
if (message->getVisible())
{
S32 heightDelta = 0;
- S32 maxTextHeight = (S32)(message->getDefaultFont()->getLineHeight() * maxLineCount);
+ S32 maxTextHeight = message->getDefaultFont()->getLineHeight() * maxLineCount;
LLRect messageRect = message->getRect();
S32 oldTextHeight = messageRect.getHeight();
diff --git a/indra/newview/lltoastscripttextbox.cpp b/indra/newview/lltoastscripttextbox.cpp
index c013f521cc..2529ec865a 100644
--- a/indra/newview/lltoastscripttextbox.cpp
+++ b/indra/newview/lltoastscripttextbox.cpp
@@ -46,11 +46,16 @@
const S32 LLToastScriptTextbox::DEFAULT_MESSAGE_MAX_LINE_COUNT= 7;
-LLToastScriptTextbox::LLToastScriptTextbox(LLNotificationPtr& notification)
-: LLToastNotifyPanel(notification)
+LLToastScriptTextbox::LLToastScriptTextbox(const LLNotificationPtr& notification)
+: LLToastPanel(notification)
{
buildFromFile( "panel_notify_textbox.xml");
+ LLTextEditor* text_editorp = getChild<LLTextEditor>("text_editor_box");
+ text_editorp->setValue(notification->getMessage());
+
+ getChild<LLButton>("ignore_btn")->setClickedCallback(boost::bind(&LLToastScriptTextbox::onClickIgnore, this));
+
const LLSD& payload = notification->getPayload();
//message body
@@ -107,3 +112,10 @@ void LLToastScriptTextbox::onClickSubmit()
llwarns << response << llendl;
}
}
+
+void LLToastScriptTextbox::onClickIgnore()
+{
+ LLSD response = mNotification->getResponseTemplate();
+ mNotification->respond(response);
+ close();
+}
diff --git a/indra/newview/lltoastscripttextbox.h b/indra/newview/lltoastscripttextbox.h
index ae3b545e0a..8e69d8834d 100644
--- a/indra/newview/lltoastscripttextbox.h
+++ b/indra/newview/lltoastscripttextbox.h
@@ -30,13 +30,11 @@
#include "lltoastnotifypanel.h"
#include "llnotificationptr.h"
-class LLButton;
-
/**
* Toast panel for scripted llTextbox notifications.
*/
class LLToastScriptTextbox
-: public LLToastNotifyPanel
+: public LLToastPanel
{
public:
void close();
@@ -46,12 +44,15 @@ public:
// Non-transient messages. You can specify non-default button
// layouts (like one for script dialogs) by passing various
// numbers in for "layout".
- LLToastScriptTextbox(LLNotificationPtr& notification);
+ LLToastScriptTextbox(const LLNotificationPtr& notification);
/*virtual*/ ~LLToastScriptTextbox();
-protected:
- void onClickSubmit();
+
private:
+
+ void onClickSubmit();
+ void onClickIgnore();
+
static const S32 DEFAULT_MESSAGE_MAX_LINE_COUNT;
};
diff --git a/indra/newview/lltool.cpp b/indra/newview/lltool.cpp
index 282d4e19c6..2d8ce95347 100644
--- a/indra/newview/lltool.cpp
+++ b/indra/newview/lltool.cpp
@@ -33,6 +33,7 @@
#include "llview.h"
#include "llviewerwindow.h"
+#include "llviewercontrol.h"
#include "lltoolcomp.h"
#include "lltoolfocus.h"
#include "llfocusmgr.h"
@@ -190,9 +191,12 @@ LLTool* LLTool::getOverrideTool(MASK mask)
{
return NULL;
}
- if (mask & MASK_ALT)
+ if (gSavedSettings.getBOOL("EnableAltZoom"))
{
- return LLToolCamera::getInstance();
+ if (mask & MASK_ALT)
+ {
+ return LLToolCamera::getInstance();
+ }
}
return NULL;
}
diff --git a/indra/newview/lltool.h b/indra/newview/lltool.h
index d3edabb486..ecc435d844 100644
--- a/indra/newview/lltool.h
+++ b/indra/newview/lltool.h
@@ -68,7 +68,7 @@ public:
virtual void localPointToScreen(S32 local_x, S32 local_y, S32* screen_x, S32* screen_y) const
{ *screen_x = local_x; *screen_y = local_y; }
- virtual std::string getName() const { return mName; }
+ virtual const std::string& getName() const { return mName; }
// New virtual functions
virtual LLViewerObject* getEditingObject() { return NULL; }
diff --git a/indra/newview/lltoolbar.cpp b/indra/newview/lltoolbar.cpp
deleted file mode 100644
index c4f599561d..0000000000
--- a/indra/newview/lltoolbar.cpp
+++ /dev/null
@@ -1,365 +0,0 @@
-/**
- * @file lltoolbar.cpp
- * @author James Cook, Richard Nelson
- * @brief Large friendly buttons at bottom of screen.
- *
- * $LicenseInfo:firstyear=2002&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include "lltoolbar.h"
-
-#include "imageids.h"
-#include "llfloaterreg.h"
-#include "llfontgl.h"
-#include "llflyoutbutton.h"
-#include "llrect.h"
-#include "llparcel.h"
-
-#include "llagent.h"
-#include "llagentwearables.h"
-#include "llbutton.h"
-#include "llfocusmgr.h"
-#include "llviewercontrol.h"
-#include "llmenucommands.h"
-#include "llimview.h"
-#include "lluiconstants.h"
-#include "llvoavatarself.h"
-#include "lltooldraganddrop.h"
-#include "llfloaterinventory.h"
-#include "llfloaterchatterbox.h"
-#include "llfloatersnapshot.h"
-#include "llinventorypanel.h"
-#include "lltoolmgr.h"
-#include "llui.h"
-#include "llviewermenu.h"
-//#include "llfirstuse.h"
-#include "llpanelblockedlist.h"
-#include "llscrolllistctrl.h"
-#include "llscrolllistitem.h"
-#include "llscrolllistcell.h"
-#include "llviewerparcelmgr.h"
-#include "lluictrlfactory.h"
-#include "llviewerwindow.h"
-#include "lltoolgrab.h"
-#include "llcombobox.h"
-#include "lllayoutstack.h"
-
-#if LL_DARWIN
-
- #include "llresizehandle.h"
-
-#endif // LL_DARWIN
-
-//
-// Globals
-//
-
-LLToolBar *gToolBar = NULL;
-
-//
-// Statics
-//
-F32 LLToolBar::sInventoryAutoOpenTime = 1.f;
-
-//
-// Functions
-//
-
-LLToolBar::LLToolBar()
- : LLPanel(),
-
- mInventoryAutoOpen(FALSE),
- mNumUnreadIMs(0)
-#if LL_DARWIN
- , mResizeHandle(NULL)
-#endif // LL_DARWIN
-{
- setIsChrome(TRUE);
- setFocusRoot(TRUE);
-
- mCommitCallbackRegistrar.add("HandleCommunicate", &LLToolBar::onClickCommunicate);
-}
-
-
-BOOL LLToolBar::postBuild()
-{
- for (child_list_const_iter_t child_iter = getChildList()->begin();
- child_iter != getChildList()->end(); ++child_iter)
- {
- LLView *view = *child_iter;
- LLButton* buttonp = dynamic_cast<LLButton*>(view);
- if(buttonp)
- {
- buttonp->setSoundFlags(LLView::SILENT);
- }
- }
-
-#if LL_DARWIN
- if(mResizeHandle == NULL)
- {
- LLRect rect(0, 0, RESIZE_HANDLE_WIDTH, RESIZE_HANDLE_HEIGHT);
- LLResizeHandle::Params p;
- p.name("");
- p.rect(rect);
- p.min_width(RESIZE_HANDLE_WIDTH);
- p.min_height(RESIZE_HANDLE_HEIGHT);
- p.enabled(false);
- mResizeHandle = LLUICtrlFactory::create<LLResizeHandle>(p);
- addChildInBack(mResizeHandle);
- LLLayoutStack* toolbar_stack = getChild<LLLayoutStack>("toolbar_stack");
- toolbar_stack->reshape(toolbar_stack->getRect().getWidth() - RESIZE_HANDLE_WIDTH, toolbar_stack->getRect().getHeight());
- }
-#endif // LL_DARWIN
-
- layoutButtons();
-
- return TRUE;
-}
-
-LLToolBar::~LLToolBar()
-{
- // LLView destructor cleans up children
-}
-
-
-BOOL LLToolBar::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
- EDragAndDropType cargo_type,
- void* cargo_data,
- EAcceptance* accept,
- std::string& tooltip_msg)
-{
- LLButton* inventory_btn = getChild<LLButton>("inventory_btn");
- if (!inventory_btn) return FALSE;
-
- LLRect button_screen_rect;
- inventory_btn->localRectToScreen(inventory_btn->getRect(),&button_screen_rect);
-
- const LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel();
- if(active_panel)
- {
- mInventoryAutoOpen = FALSE;
- }
- else if (button_screen_rect.pointInRect(x, y))
- {
- if (mInventoryAutoOpen)
- {
- if (!active_panel &&
- mInventoryAutoOpenTimer.getElapsedTimeF32() > sInventoryAutoOpenTime)
- {
- LLFloaterInventory::showAgentInventory();
- }
- }
- else
- {
- mInventoryAutoOpen = TRUE;
- mInventoryAutoOpenTimer.reset();
- }
- }
-
- return LLPanel::handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg);
-}
-
-// static
-void LLToolBar::toggle(void*)
-{
- BOOL show = gSavedSettings.getBOOL("ShowToolBar");
- gSavedSettings.setBOOL("ShowToolBar", !show);
- gToolBar->setVisible(!show);
-}
-
-
-// static
-BOOL LLToolBar::visible(void*)
-{
- return gToolBar->getVisible();
-}
-
-
-void LLToolBar::layoutButtons()
-{
-#if LL_DARWIN
- const S32 FUDGE_WIDTH_OF_SCREEN = 4;
- S32 width = gViewerWindow->getWindowWidthScaled() + FUDGE_WIDTH_OF_SCREEN;
- S32 pad = 2;
-
- // this function may be called before postBuild(), in which case mResizeHandle won't have been set up yet.
- if(mResizeHandle != NULL)
- {
- // Only when running in windowed mode on the Mac, leave room for a resize widget on the right edge of the bar.
- width -= RESIZE_HANDLE_WIDTH;
-
- LLRect r;
- r.mLeft = width - pad;
- r.mBottom = 0;
- r.mRight = r.mLeft + RESIZE_HANDLE_WIDTH;
- r.mTop = r.mBottom + RESIZE_HANDLE_HEIGHT;
- mResizeHandle->setRect(r);
- mResizeHandle->setVisible(TRUE);
- }
-#endif // LL_DARWIN
-}
-
-
-// virtual
-void LLToolBar::reshape(S32 width, S32 height, BOOL called_from_parent)
-{
- LLPanel::reshape(width, height, called_from_parent);
-
- layoutButtons();
-}
-
-
-// Per-frame updates of visibility
-void LLToolBar::refresh()
-{
- BOOL show = gSavedSettings.getBOOL("ShowToolBar");
- BOOL mouselook = gAgent.cameraMouselook();
- setVisible(show && !mouselook);
-
- if (isInVisibleChain())
- {
- updateCommunicateList();
- }
-}
-
-void LLToolBar::updateCommunicateList()
-{
- LLFlyoutButton* communicate_button = getChild<LLFlyoutButton>("communicate_btn");
- LLSD selected = communicate_button->getValue();
-
- communicate_button->removeall();
-
- //LLFloater* frontmost_floater = LLFloaterChatterBox::getInstance()->getActiveFloater();
- LLScrollListItem* itemp = NULL;
-
- LLSD contact_sd;
- contact_sd["value"] = "contacts";
- /*contact_sd["columns"][0]["value"] = LLFloaterMyFriends::getInstance()->getShortTitle();
- if (LLFloaterMyFriends::getInstance() == frontmost_floater)
- {
- contact_sd["columns"][0]["font"]["name"] = "SANSSERIF_SMALL";
- contact_sd["columns"][0]["font"]["style"] = "BOLD";
- // make sure current tab is selected in list
- if (selected.isUndefined())
- {
- selected = "contacts";
- }
- }*/
- itemp = communicate_button->addElement(contact_sd, ADD_TOP);
-
- communicate_button->addSeparator(ADD_TOP);
- communicate_button->add(getString("Redock Windows"), LLSD("redock"), ADD_TOP);
- communicate_button->addSeparator(ADD_TOP);
- communicate_button->add(getString("Blocked List"), LLSD("mute list"), ADD_TOP);
-
- std::set<LLHandle<LLFloater> >::const_iterator floater_handle_it;
-
- /*if (gIMMgr->getIMFloaterHandles().size() > 0)
- {
- communicate_button->addSeparator(ADD_TOP);
- }
-
- for(floater_handle_it = gIMMgr->getIMFloaterHandles().begin(); floater_handle_it != gIMMgr->getIMFloaterHandles().end(); ++floater_handle_it)
- {
- LLFloaterIMPanel* im_floaterp = (LLFloaterIMPanel*)floater_handle_it->get();
- if (im_floaterp)
- {
- std::string floater_title = im_floaterp->getNumUnreadMessages() > 0 ? "*" : "";
- floater_title.append(im_floaterp->getShortTitle());
- LLSD im_sd;
- im_sd["value"] = im_floaterp->getSessionID();
- im_sd["columns"][0]["value"] = floater_title;
- if (im_floaterp == frontmost_floater)
- {
- im_sd["columns"][0]["font"]["name"] = "SANSSERIF_SMALL";
- im_sd["columns"][0]["font"]["style"] = "BOLD";
- if (selected.isUndefined())
- {
- selected = im_floaterp->getSessionID();
- }
- }
- itemp = communicate_button->addElement(im_sd, ADD_TOP);
- }
- }*/
-
- communicate_button->setValue(selected);
-}
-
-
-// static
-void LLToolBar::onClickCommunicate(LLUICtrl* ctrl, const LLSD& user_data)
-{
- LLFlyoutButton* communicate_button = dynamic_cast<LLFlyoutButton*>(ctrl);
- llassert_always(communicate_button);
-
- LLSD selected_option = communicate_button->getValue();
-
- if (selected_option.asString() == "contacts")
- {
- LLFloaterReg::showInstance("contacts", "friends");
- }
- else if (selected_option.asString() == "local chat")
- {
- LLFloaterReg::showInstance("communicate", "local");
- }
- else if (selected_option.asString() == "redock")
- {
- /*LLFloaterChatterBox* chatterbox_instance = LLFloaterChatterBox::getInstance();
- if(chatterbox_instance)
- {
- chatterbox_instance->addFloater(LLFloaterMyFriends::getInstance(), FALSE);
-
- LLUUID session_to_show;
-
- std::set<LLHandle<LLFloater> >::const_iterator floater_handle_it;
- for(floater_handle_it = gIMMgr->getIMFloaterHandles().begin(); floater_handle_it != gIMMgr->getIMFloaterHandles().end(); ++floater_handle_it)
- {
- LLFloater* im_floaterp = floater_handle_it->get();
- if (im_floaterp)
- {
- if (im_floaterp->isFrontmost())
- {
- session_to_show = ((LLFloaterIMPanel*)im_floaterp)->getSessionID();
- }
- chatterbox_instance->addFloater(im_floaterp, FALSE);
- }
- }
- LLFloaterReg::showInstance("communicate", session_to_show);
- }*/
- }
- else if (selected_option.asString() == "mute list")
- {
- LLPanelBlockedList::showPanelAndSelect(LLUUID::null);
- }
- else if (selected_option.isUndefined()) // user just clicked the communicate button, treat as toggle
- {
- /*LLFloaterReg::toggleInstance("communicate");*/
- }
- else // otherwise selection_option is undifined or a specific IM session id
- {
- /*LLFloaterReg::showInstance("communicate", selected_option);*/
- }
-}
-
-
diff --git a/indra/newview/lltoolbar.h b/indra/newview/lltoolbar.h
deleted file mode 100644
index 217b3c0ac8..0000000000
--- a/indra/newview/lltoolbar.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/**
- * @file lltoolbar.h
- * @brief Large friendly buttons at bottom of screen.
- *
- * $LicenseInfo:firstyear=2002&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLTOOLBAR_H
-#define LL_LLTOOLBAR_H
-
-#include "llpanel.h"
-
-#include "llframetimer.h"
-
-class LLResizeHandle;
-
-class LLToolBar
-: public LLPanel
-{
-public:
- LLToolBar();
- ~LLToolBar();
-
- /*virtual*/ BOOL postBuild();
-
- /*virtual*/ BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
- EDragAndDropType cargo_type,
- void* cargo_data,
- EAcceptance* accept,
- std::string& tooltip_msg);
-
- /*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
-
- static void toggle(void*);
- static BOOL visible(void*);
-
- // Move buttons to appropriate locations based on rect.
- void layoutButtons();
-
- // Per-frame refresh call
- void refresh();
-
- // callbacks
- static void onClickCommunicate(LLUICtrl*, const LLSD&);
-
- static F32 sInventoryAutoOpenTime;
-
-private:
- void updateCommunicateList();
-
-
-private:
- BOOL mInventoryAutoOpen;
- LLFrameTimer mInventoryAutoOpenTimer;
- S32 mNumUnreadIMs;
-#if LL_DARWIN
- LLResizeHandle *mResizeHandle;
-#endif // LL_DARWIN
-};
-
-extern LLToolBar *gToolBar;
-
-#endif
diff --git a/indra/newview/lltoolbarview.cpp b/indra/newview/lltoolbarview.cpp
new file mode 100644
index 0000000000..81ad96f39e
--- /dev/null
+++ b/indra/newview/lltoolbarview.cpp
@@ -0,0 +1,709 @@
+/**
+ * @file lltoolbarview.cpp
+ * @author Merov Linden
+ * @brief User customizable toolbar class
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "lltoolbarview.h"
+
+#include "llappviewer.h"
+#include "llbutton.h"
+#include "llclipboard.h"
+#include "lldir.h"
+#include "lldockablefloater.h"
+#include "lldockcontrol.h"
+#include "llimview.h"
+#include "lltransientfloatermgr.h"
+#include "lltoolbar.h"
+#include "lltooldraganddrop.h"
+#include "llxmlnode.h"
+
+#include "llagent.h" // HACK for destinations guide on startup
+#include "llfloaterreg.h" // HACK for destinations guide on startup
+#include "llviewercontrol.h" // HACK for destinations guide on startup
+
+#include <boost/foreach.hpp>
+
+LLToolBarView* gToolBarView = NULL;
+
+static LLDefaultChildRegistry::Register<LLToolBarView> r("toolbar_view");
+
+void handleLoginToolbarSetup();
+
+bool isToolDragged()
+{
+ return (LLToolDragAndDrop::getInstance()->getSource() == LLToolDragAndDrop::SOURCE_VIEWER);
+}
+
+LLToolBarView::Toolbar::Toolbar()
+: button_display_mode("button_display_mode"),
+ commands("command")
+{}
+
+LLToolBarView::ToolbarSet::ToolbarSet()
+: left_toolbar("left_toolbar"),
+ right_toolbar("right_toolbar"),
+ bottom_toolbar("bottom_toolbar")
+{}
+
+
+LLToolBarView::LLToolBarView(const LLToolBarView::Params& p)
+: LLUICtrl(p),
+ mDragStarted(false),
+ mShowToolbars(true),
+ mDragToolbarButton(NULL),
+ mDragItem(NULL),
+ mToolbarsLoaded(false)
+{
+ for (S32 i = 0; i < TOOLBAR_COUNT; i++)
+ {
+ mToolbars[i] = NULL;
+ }
+}
+
+void LLToolBarView::initFromParams(const LLToolBarView::Params& p)
+{
+ // Initialize the base object
+ LLUICtrl::initFromParams(p);
+}
+
+LLToolBarView::~LLToolBarView()
+{
+ saveToolbars();
+}
+
+BOOL LLToolBarView::postBuild()
+{
+ mToolbars[TOOLBAR_LEFT] = getChild<LLToolBar>("toolbar_left");
+ mToolbars[TOOLBAR_RIGHT] = getChild<LLToolBar>("toolbar_right");
+ mToolbars[TOOLBAR_BOTTOM] = getChild<LLToolBar>("toolbar_bottom");
+
+ for (int i = TOOLBAR_FIRST; i <= TOOLBAR_LAST; i++)
+ {
+ mToolbars[i]->setStartDragCallback(boost::bind(LLToolBarView::startDragTool,_1,_2,_3));
+ mToolbars[i]->setHandleDragCallback(boost::bind(LLToolBarView::handleDragTool,_1,_2,_3,_4));
+ mToolbars[i]->setHandleDropCallback(boost::bind(LLToolBarView::handleDropTool,_1,_2,_3,_4));
+ mToolbars[i]->setButtonAddCallback(boost::bind(LLToolBarView::onToolBarButtonAdded,_1));
+ mToolbars[i]->setButtonRemoveCallback(boost::bind(LLToolBarView::onToolBarButtonRemoved,_1));
+ }
+
+ LLAppViewer::instance()->setOnLoginCompletedCallback(boost::bind(&handleLoginToolbarSetup));
+
+ return TRUE;
+}
+
+S32 LLToolBarView::hasCommand(const LLCommandId& commandId) const
+{
+ S32 command_location = TOOLBAR_NONE;
+
+ for (S32 loc = TOOLBAR_FIRST; loc <= TOOLBAR_LAST; loc++)
+ {
+ if (mToolbars[loc]->hasCommand(commandId))
+ {
+ command_location = loc;
+ break;
+ }
+ }
+
+ return command_location;
+}
+
+S32 LLToolBarView::addCommand(const LLCommandId& commandId, EToolBarLocation toolbar, int rank)
+{
+ int old_rank;
+ removeCommand(commandId, old_rank);
+
+ S32 command_location = mToolbars[toolbar]->addCommand(commandId, rank);
+
+ return command_location;
+}
+
+S32 LLToolBarView::removeCommand(const LLCommandId& commandId, int& rank)
+{
+ S32 command_location = hasCommand(commandId);
+ rank = LLToolBar::RANK_NONE;
+
+ if (command_location != TOOLBAR_NONE)
+ {
+ rank = mToolbars[command_location]->removeCommand(commandId);
+ }
+
+ return command_location;
+}
+
+S32 LLToolBarView::enableCommand(const LLCommandId& commandId, bool enabled)
+{
+ S32 command_location = hasCommand(commandId);
+
+ if (command_location != TOOLBAR_NONE)
+ {
+ mToolbars[command_location]->enableCommand(commandId, enabled);
+ }
+
+ return command_location;
+}
+
+S32 LLToolBarView::stopCommandInProgress(const LLCommandId& commandId)
+{
+ S32 command_location = hasCommand(commandId);
+
+ if (command_location != TOOLBAR_NONE)
+ {
+ mToolbars[command_location]->stopCommandInProgress(commandId);
+ }
+
+ return command_location;
+}
+
+S32 LLToolBarView::flashCommand(const LLCommandId& commandId, bool flash)
+{
+ S32 command_location = hasCommand(commandId);
+
+ if (command_location != TOOLBAR_NONE)
+ {
+ mToolbars[command_location]->flashCommand(commandId, flash);
+ }
+
+ return command_location;
+}
+
+bool LLToolBarView::addCommandInternal(const LLCommandId& command, LLToolBar* toolbar)
+{
+ LLCommandManager& mgr = LLCommandManager::instance();
+ if (mgr.getCommand(command))
+ {
+ toolbar->addCommand(command);
+ }
+ else
+ {
+ llwarns << "Toolbars creation : the command with id " << command.uuid().asString() << " cannot be found in the command manager" << llendl;
+ return false;
+ }
+ return true;
+}
+
+bool LLToolBarView::loadToolbars(bool force_default)
+{
+ LLToolBarView::ToolbarSet toolbar_set;
+ bool err = false;
+
+ // Load the toolbars.xml file
+ std::string toolbar_file = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "toolbars.xml");
+ if (force_default)
+ {
+ toolbar_file = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "toolbars.xml");
+ }
+ else if (!gDirUtilp->fileExists(toolbar_file))
+ {
+ llwarns << "User toolbars def not found -> use default" << llendl;
+ toolbar_file = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "toolbars.xml");
+ }
+
+ LLXMLNodePtr root;
+ if(!LLXMLNode::parseFile(toolbar_file, root, NULL))
+ {
+ llwarns << "Unable to load toolbars from file: " << toolbar_file << llendl;
+ err = true;
+ }
+
+ if (!err && !root->hasName("toolbars"))
+ {
+ llwarns << toolbar_file << " is not a valid toolbars definition file" << llendl;
+ err = true;
+ }
+
+ // Parse the toolbar settings
+ LLXUIParser parser;
+ if (!err)
+ {
+ parser.readXUI(root, toolbar_set, toolbar_file);
+ }
+ if (!err && !toolbar_set.validateBlock())
+ {
+ llwarns << "Unable to validate toolbars from file: " << toolbar_file << llendl;
+ err = true;
+ }
+
+ if (err)
+ {
+ if (force_default)
+ {
+ llerrs << "Unable to load toolbars from default file : " << toolbar_file << llendl;
+ return false;
+ }
+ // Try to load the default toolbars
+ return loadToolbars(true);
+ }
+
+ // Clear the toolbars now before adding the loaded commands and settings
+ for (S32 i = TOOLBAR_FIRST; i <= TOOLBAR_LAST; i++)
+ {
+ if (mToolbars[i])
+ {
+ mToolbars[i]->clearCommandsList();
+ }
+ }
+
+ // Add commands to each toolbar
+ if (toolbar_set.left_toolbar.isProvided() && mToolbars[TOOLBAR_LEFT])
+ {
+ if (toolbar_set.left_toolbar.button_display_mode.isProvided())
+ {
+ LLToolBarEnums::ButtonType button_type = toolbar_set.left_toolbar.button_display_mode;
+ mToolbars[TOOLBAR_LEFT]->setButtonType(button_type);
+ }
+ BOOST_FOREACH(const LLCommandId::Params& command_params, toolbar_set.left_toolbar.commands)
+ {
+ if (addCommandInternal(LLCommandId(command_params), mToolbars[TOOLBAR_LEFT]))
+ {
+ llwarns << "Error adding command '" << command_params.name() << "' to left toolbar." << llendl;
+ }
+ }
+ }
+ if (toolbar_set.right_toolbar.isProvided() && mToolbars[TOOLBAR_RIGHT])
+ {
+ if (toolbar_set.right_toolbar.button_display_mode.isProvided())
+ {
+ LLToolBarEnums::ButtonType button_type = toolbar_set.right_toolbar.button_display_mode;
+ mToolbars[TOOLBAR_RIGHT]->setButtonType(button_type);
+ }
+ BOOST_FOREACH(const LLCommandId::Params& command_params, toolbar_set.right_toolbar.commands)
+ {
+ if (addCommandInternal(LLCommandId(command_params), mToolbars[TOOLBAR_RIGHT]))
+ {
+ llwarns << "Error adding command '" << command_params.name() << "' to right toolbar." << llendl;
+ }
+ }
+ }
+ if (toolbar_set.bottom_toolbar.isProvided() && mToolbars[TOOLBAR_BOTTOM])
+ {
+ if (toolbar_set.bottom_toolbar.button_display_mode.isProvided())
+ {
+ LLToolBarEnums::ButtonType button_type = toolbar_set.bottom_toolbar.button_display_mode;
+ mToolbars[TOOLBAR_BOTTOM]->setButtonType(button_type);
+ }
+ BOOST_FOREACH(const LLCommandId::Params& command_params, toolbar_set.bottom_toolbar.commands)
+ {
+ if (addCommandInternal(LLCommandId(command_params), mToolbars[TOOLBAR_BOTTOM]))
+ {
+ llwarns << "Error adding command '" << command_params.name() << "' to bottom toolbar." << llendl;
+ }
+ }
+ }
+ mToolbarsLoaded = true;
+ return true;
+}
+
+bool LLToolBarView::clearToolbars()
+{
+ for (S32 i = TOOLBAR_FIRST; i <= TOOLBAR_LAST; i++)
+ {
+ if (mToolbars[i])
+ {
+ mToolbars[i]->clearCommandsList();
+ }
+ }
+
+ return true;
+}
+
+//static
+bool LLToolBarView::loadDefaultToolbars()
+{
+ bool retval = false;
+
+ if (gToolBarView)
+ {
+ retval = gToolBarView->loadToolbars(true);
+ if (retval)
+ {
+ gToolBarView->saveToolbars();
+ }
+ }
+
+ return retval;
+}
+
+//static
+bool LLToolBarView::clearAllToolbars()
+{
+ bool retval = false;
+
+ if (gToolBarView)
+ {
+ retval = gToolBarView->clearToolbars();
+ if (retval)
+ {
+ gToolBarView->saveToolbars();
+ }
+ }
+
+ return retval;
+}
+
+void LLToolBarView::saveToolbars() const
+{
+ if (!mToolbarsLoaded)
+ return;
+
+ // Build the parameter tree from the toolbar data
+ LLToolBarView::ToolbarSet toolbar_set;
+ if (mToolbars[TOOLBAR_LEFT])
+ {
+ toolbar_set.left_toolbar.button_display_mode = mToolbars[TOOLBAR_LEFT]->getButtonType();
+ addToToolset(mToolbars[TOOLBAR_LEFT]->getCommandsList(), toolbar_set.left_toolbar);
+ }
+ if (mToolbars[TOOLBAR_RIGHT])
+ {
+ toolbar_set.right_toolbar.button_display_mode = mToolbars[TOOLBAR_RIGHT]->getButtonType();
+ addToToolset(mToolbars[TOOLBAR_RIGHT]->getCommandsList(), toolbar_set.right_toolbar);
+ }
+ if (mToolbars[TOOLBAR_BOTTOM])
+ {
+ toolbar_set.bottom_toolbar.button_display_mode = mToolbars[TOOLBAR_BOTTOM]->getButtonType();
+ addToToolset(mToolbars[TOOLBAR_BOTTOM]->getCommandsList(), toolbar_set.bottom_toolbar);
+ }
+
+ // Serialize the parameter tree
+ LLXMLNodePtr output_node = new LLXMLNode("toolbars", false);
+ LLXUIParser parser;
+ parser.writeXUI(output_node, toolbar_set);
+
+ // Write the resulting XML to file
+ if(!output_node->isNull())
+ {
+ const std::string& filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "toolbars.xml");
+ LLFILE *fp = LLFile::fopen(filename, "w");
+ if (fp != NULL)
+ {
+ LLXMLNode::writeHeaderToFile(fp);
+ output_node->writeToFile(fp);
+ fclose(fp);
+ }
+ }
+}
+
+// Enumerate the commands in command_list and add them as Params to the toolbar
+void LLToolBarView::addToToolset(command_id_list_t& command_list, Toolbar& toolbar) const
+{
+ LLCommandManager& mgr = LLCommandManager::instance();
+
+ for (command_id_list_t::const_iterator it = command_list.begin();
+ it != command_list.end();
+ ++it)
+ {
+ LLCommand* command = mgr.getCommand(*it);
+ if (command)
+ {
+ LLCommandId::Params command_name_param;
+ command_name_param.name = command->name();
+ toolbar.commands.add(command_name_param);
+ }
+ }
+}
+
+void LLToolBarView::onToolBarButtonAdded(LLView* button)
+{
+ llassert(button);
+
+ if (button->getName() == "speak")
+ {
+ // Add the "Speak" button as a control view in LLTransientFloaterMgr
+ // to prevent hiding the transient IM floater upon pressing "Speak".
+ LLTransientFloaterMgr::getInstance()->addControlView(button);
+
+ // Redock incoming and/or outgoing call windows, if applicable
+
+ LLFloater* incoming_floater = LLFloaterReg::getLastFloaterInGroup("incoming_call");
+ LLFloater* outgoing_floater = LLFloaterReg::getLastFloaterInGroup("outgoing_call");
+
+ if (incoming_floater && incoming_floater->isShown())
+ {
+ LLCallDialog* incoming = dynamic_cast<LLCallDialog *>(incoming_floater);
+ llassert(incoming);
+
+ LLDockControl* dock_control = incoming->getDockControl();
+ if (dock_control->getDock() == NULL)
+ {
+ incoming->dockToToolbarButton("speak");
+ }
+ }
+
+ if (outgoing_floater && outgoing_floater->isShown())
+ {
+ LLCallDialog* outgoing = dynamic_cast<LLCallDialog *>(outgoing_floater);
+ llassert(outgoing);
+
+ LLDockControl* dock_control = outgoing->getDockControl();
+ if (dock_control->getDock() == NULL)
+ {
+ outgoing->dockToToolbarButton("speak");
+ }
+ }
+ }
+ else if (button->getName() == "voice")
+ {
+ // Add the "Voice controls" button as a control view in LLTransientFloaterMgr
+ // to prevent hiding the transient IM floater upon pressing "Voice controls".
+ LLTransientFloaterMgr::getInstance()->addControlView(button);
+ }
+}
+
+void LLToolBarView::onToolBarButtonRemoved(LLView* button)
+{
+ llassert(button);
+
+ if (button->getName() == "speak")
+ {
+ LLTransientFloaterMgr::getInstance()->removeControlView(button);
+
+ // Undock incoming and/or outgoing call windows
+
+ LLFloater* incoming_floater = LLFloaterReg::getLastFloaterInGroup("incoming_call");
+ LLFloater* outgoing_floater = LLFloaterReg::getLastFloaterInGroup("outgoing_call");
+
+ if (incoming_floater && incoming_floater->isShown())
+ {
+ LLDockableFloater* incoming = dynamic_cast<LLDockableFloater *>(incoming_floater);
+ llassert(incoming);
+
+ LLDockControl* dock_control = incoming->getDockControl();
+ dock_control->setDock(NULL);
+ }
+
+ if (outgoing_floater && outgoing_floater->isShown())
+ {
+ LLDockableFloater* outgoing = dynamic_cast<LLDockableFloater *>(outgoing_floater);
+ llassert(outgoing);
+
+ LLDockControl* dock_control = outgoing->getDockControl();
+ dock_control->setDock(NULL);
+ }
+ }
+ else if (button->getName() == "voice")
+ {
+ LLTransientFloaterMgr::getInstance()->removeControlView(button);
+ }
+}
+
+void LLToolBarView::draw()
+{
+ LLRect toolbar_rects[TOOLBAR_COUNT];
+
+ for (S32 i = TOOLBAR_FIRST; i <= TOOLBAR_LAST; i++)
+ {
+ if (mToolbars[i])
+ {
+ LLLayoutStack::ELayoutOrientation orientation = LLToolBarEnums::getOrientation(mToolbars[i]->getSideType());
+
+ if (orientation == LLLayoutStack::HORIZONTAL)
+ {
+ mToolbars[i]->getParent()->reshape(mToolbars[i]->getParent()->getRect().getWidth(), mToolbars[i]->getRect().getHeight());
+ }
+ else
+ {
+ mToolbars[i]->getParent()->reshape(mToolbars[i]->getRect().getWidth(), mToolbars[i]->getParent()->getRect().getHeight());
+ }
+
+ mToolbars[i]->localRectToOtherView(mToolbars[i]->getLocalRect(), &toolbar_rects[i], this);
+ }
+ }
+
+ for (S32 i = TOOLBAR_FIRST; i <= TOOLBAR_LAST; i++)
+ {
+ mToolbars[i]->getParent()->setVisible(mShowToolbars
+ && (mToolbars[i]->hasButtons()
+ || isToolDragged()));
+ }
+
+ // Draw drop zones if drop of a tool is active
+ if (isToolDragged())
+ {
+ LLColor4 drop_color = LLUIColorTable::instance().getColor( "ToolbarDropZoneColor" );
+
+ for (S32 i = TOOLBAR_FIRST; i <= TOOLBAR_LAST; i++)
+ {
+ gl_rect_2d(toolbar_rects[i], drop_color, TRUE);
+ }
+ }
+
+ LLUICtrl::draw();
+}
+
+
+// ----------------------------------------
+// Drag and Drop Handling
+// ----------------------------------------
+
+
+void LLToolBarView::startDragTool(S32 x, S32 y, LLToolBarButton* toolbarButton)
+{
+ resetDragTool(toolbarButton);
+
+ // Flag the tool dragging but don't start it yet
+ LLToolDragAndDrop::getInstance()->setDragStart( x, y );
+}
+
+BOOL LLToolBarView::handleDragTool( S32 x, S32 y, const LLUUID& uuid, LLAssetType::EType type)
+{
+ if (LLToolDragAndDrop::getInstance()->isOverThreshold( x, y ))
+ {
+ if (!gToolBarView->mDragStarted)
+ {
+ // Start the tool dragging:
+
+ // First, create the global drag and drop object
+ std::vector<EDragAndDropType> types;
+ uuid_vec_t cargo_ids;
+ types.push_back(DAD_WIDGET);
+ cargo_ids.push_back(uuid);
+ LLToolDragAndDrop::ESource src = LLToolDragAndDrop::SOURCE_VIEWER;
+ LLUUID srcID;
+ LLToolDragAndDrop::getInstance()->beginMultiDrag(types, cargo_ids, src, srcID);
+
+ // Second, stop the command if it is in progress and requires stopping!
+ LLCommandId command_id = LLCommandId(uuid);
+ gToolBarView->stopCommandInProgress(command_id);
+
+ gToolBarView->mDragStarted = true;
+ return TRUE;
+ }
+ else
+ {
+ MASK mask = 0;
+ return LLToolDragAndDrop::getInstance()->handleHover( x, y, mask );
+ }
+ }
+ return FALSE;
+}
+
+BOOL LLToolBarView::handleDropTool( void* cargo_data, S32 x, S32 y, LLToolBar* toolbar)
+{
+ BOOL handled = FALSE;
+ LLInventoryItem* inv_item = (LLInventoryItem*)cargo_data;
+
+ LLAssetType::EType type = inv_item->getType();
+ if (type == LLAssetType::AT_WIDGET)
+ {
+ handled = TRUE;
+ // Get the command from its uuid
+ LLCommandManager& mgr = LLCommandManager::instance();
+ LLCommandId command_id(inv_item->getUUID());
+ LLCommand* command = mgr.getCommand(command_id);
+ if (command)
+ {
+ // Suppress the command from the toolbars (including the one it's dropped in,
+ // this will handle move position).
+ S32 old_toolbar_loc = gToolBarView->hasCommand(command_id);
+ LLToolBar* old_toolbar = NULL;
+
+ if (old_toolbar_loc != TOOLBAR_NONE)
+ {
+ llassert(gToolBarView->mDragToolbarButton);
+ old_toolbar = gToolBarView->mDragToolbarButton->getParentByType<LLToolBar>();
+ if (old_toolbar->isReadOnly() && toolbar->isReadOnly())
+ {
+ // do nothing
+ }
+ else
+ {
+ int old_rank = LLToolBar::RANK_NONE;
+ gToolBarView->removeCommand(command_id, old_rank);
+ }
+ }
+
+ // Convert the (x,y) position in rank in toolbar
+ if (!toolbar->isReadOnly())
+ {
+ int new_rank = toolbar->getRankFromPosition(x,y);
+ toolbar->addCommand(command_id, new_rank);
+ }
+
+ // Save the new toolbars configuration
+ gToolBarView->saveToolbars();
+ }
+ else
+ {
+ llwarns << "Command couldn't be found in command manager" << llendl;
+ }
+ }
+
+ resetDragTool(NULL);
+ return handled;
+}
+
+void LLToolBarView::resetDragTool(LLToolBarButton* toolbarButton)
+{
+ // Clear the saved command, toolbar and rank
+ gToolBarView->mDragStarted = false;
+ gToolBarView->mDragToolbarButton = toolbarButton;
+}
+
+// Provide a handle on a free standing inventory item containing references to the tool.
+// This might be used by Drag and Drop to move around references to tool items.
+LLInventoryObject* LLToolBarView::getDragItem()
+{
+ if (mDragToolbarButton)
+ {
+ LLUUID item_uuid = mDragToolbarButton->getCommandId().uuid();
+ mDragItem = new LLInventoryObject (item_uuid, LLUUID::null, LLAssetType::AT_WIDGET, "");
+ }
+ return mDragItem;
+}
+
+void LLToolBarView::setToolBarsVisible(bool visible)
+{
+ mShowToolbars = visible;
+}
+
+bool LLToolBarView::isModified() const
+{
+ bool modified = false;
+
+ for (S32 i = TOOLBAR_FIRST; i <= TOOLBAR_LAST; i++)
+ {
+ modified |= mToolbars[i]->isModified();
+ }
+
+ return modified;
+}
+
+
+//
+// HACK to bring up destinations guide at startup
+//
+
+void handleLoginToolbarSetup()
+{
+ // Open the destinations guide by default on first login, per Rhett
+ if (gSavedPerAccountSettings.getBOOL("DisplayDestinationsOnInitialRun") || gAgent.isFirstLogin())
+ {
+ LLFloaterReg::showInstance("destinations");
+
+ gSavedPerAccountSettings.setBOOL("DisplayDestinationsOnInitialRun", FALSE);
+ }
+}
+
diff --git a/indra/newview/lltoolbarview.h b/indra/newview/lltoolbarview.h
new file mode 100644
index 0000000000..9c4194ebed
--- /dev/null
+++ b/indra/newview/lltoolbarview.h
@@ -0,0 +1,140 @@
+/**
+ * @file lltoolbarview.h
+ * @author Merov Linden
+ * @brief User customizable toolbar class
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLTOOLBARVIEW_H
+#define LL_LLTOOLBARVIEW_H
+
+#include "lluictrl.h"
+#include "lltoolbar.h"
+#include "llcommandmanager.h"
+#include "llinventory.h"
+
+class LLUICtrlFactory;
+
+// Parent of all LLToolBar
+
+class LLToolBarView : public LLUICtrl
+{
+public:
+ typedef enum
+ {
+ TOOLBAR_NONE = 0,
+ TOOLBAR_LEFT,
+ TOOLBAR_RIGHT,
+ TOOLBAR_BOTTOM,
+
+ TOOLBAR_COUNT,
+
+ TOOLBAR_FIRST = TOOLBAR_LEFT,
+ TOOLBAR_LAST = TOOLBAR_BOTTOM,
+ } EToolBarLocation;
+
+ // Xui structure of the toolbar panel
+ struct Params : public LLInitParam::Block<Params, LLUICtrl::Params> {};
+
+ // Note: valid children for LLToolBarView are stored in this registry
+ typedef LLDefaultChildRegistry child_registry_t;
+
+ // Xml structure of the toolbars.xml setting
+ // Those live in a toolbars.xml found in app_settings (for the default) and in
+ // the user folder for the user specific (saved) settings
+ struct Toolbar : public LLInitParam::Block<Toolbar>
+ {
+ Mandatory<LLToolBarEnums::ButtonType> button_display_mode;
+ Multiple<LLCommandId::Params> commands;
+
+ Toolbar();
+ };
+ struct ToolbarSet : public LLInitParam::Block<ToolbarSet>
+ {
+ Optional<Toolbar> left_toolbar,
+ right_toolbar,
+ bottom_toolbar;
+
+ ToolbarSet();
+ };
+
+ // Derived methods
+ virtual ~LLToolBarView();
+ virtual BOOL postBuild();
+ virtual void draw();
+
+ // Toolbar view interface with the rest of the world
+ // Checks if the commandId is being used somewhere in one of the toolbars, returns EToolBarLocation
+ S32 hasCommand(const LLCommandId& commandId) const;
+ S32 addCommand(const LLCommandId& commandId, EToolBarLocation toolbar, int rank = LLToolBar::RANK_NONE);
+ S32 removeCommand(const LLCommandId& commandId, int& rank); // Sets the rank the removed command was at, RANK_NONE if not found
+ S32 enableCommand(const LLCommandId& commandId, bool enabled);
+ S32 stopCommandInProgress(const LLCommandId& commandId);
+ S32 flashCommand(const LLCommandId& commandId, bool flash);
+
+ // Loads the toolbars from the existing user or default settings
+ bool loadToolbars(bool force_default = false); // return false if load fails
+
+ // Clears all buttons off the toolbars
+ bool clearToolbars();
+
+ void setToolBarsVisible(bool visible);
+
+ static bool loadDefaultToolbars();
+ static bool clearAllToolbars();
+
+ static void startDragTool(S32 x, S32 y, LLToolBarButton* toolbarButton);
+ static BOOL handleDragTool(S32 x, S32 y, const LLUUID& uuid, LLAssetType::EType type);
+ static BOOL handleDropTool(void* cargo_data, S32 x, S32 y, LLToolBar* toolbar);
+ static void resetDragTool(LLToolBarButton* toolbarButton);
+ LLInventoryObject* getDragItem();
+
+ bool isModified() const;
+
+protected:
+ friend class LLUICtrlFactory;
+ LLToolBarView(const Params&);
+
+ void initFromParams(const Params&);
+
+private:
+ void saveToolbars() const;
+ bool addCommandInternal(const LLCommandId& commandId, LLToolBar* toolbar);
+ void addToToolset(command_id_list_t& command_list, Toolbar& toolbar) const;
+
+ static void onToolBarButtonAdded(LLView* button);
+ static void onToolBarButtonRemoved(LLView* button);
+
+ // Pointers to the toolbars handled by the toolbar view
+ LLToolBar* mToolbars[TOOLBAR_COUNT];
+ bool mToolbarsLoaded;
+
+ bool mDragStarted;
+ LLToolBarButton* mDragToolbarButton;
+ LLInventoryObject* mDragItem;
+ bool mShowToolbars;
+};
+
+extern LLToolBarView* gToolBarView;
+
+#endif // LL_LLTOOLBARVIEW_H
diff --git a/indra/newview/lltoolbrush.cpp b/indra/newview/lltoolbrush.cpp
index 9782b90cf1..aba43a9715 100644
--- a/indra/newview/lltoolbrush.cpp
+++ b/indra/newview/lltoolbrush.cpp
@@ -507,12 +507,12 @@ void LLToolBrushLand::render()
void LLToolBrushLand::renderOverlay(LLSurface& land, const LLVector3& pos_region,
const LLVector3& pos_world)
{
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
LLGLDepthTest mDepthTest(GL_TRUE);
- glPushMatrix();
+ gGL.pushMatrix();
gGL.color4fv(OVERLAY_COLOR.mV);
- glTranslatef(0.0f, 0.0f, 1.0f);
+ gGL.translatef(0.0f, 0.0f, 1.0f);
S32 i = (S32) pos_region.mV[VX];
S32 j = (S32) pos_region.mV[VY];
@@ -566,7 +566,7 @@ void LLToolBrushLand::renderOverlay(LLSurface& land, const LLVector3& pos_region
}
gGL.end();
- glPopMatrix();
+ gGL.popMatrix();
}
void LLToolBrushLand::determineAffectedRegions(region_list_t& regions,
diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp
index 1c745906aa..4f4eef0f3d 100644
--- a/indra/newview/lltooldraganddrop.cpp
+++ b/indra/newview/lltooldraganddrop.cpp
@@ -35,7 +35,6 @@
#include "llagentwearables.h"
#include "llappearancemgr.h"
#include "lldictionary.h"
-//#include "llfirstuse.h"
#include "llfloaterreg.h"
#include "llfloatertools.h"
#include "llgesturemgr.h"
@@ -49,6 +48,7 @@
#include "llpreviewnotecard.h"
#include "llrootview.h"
#include "llselectmgr.h"
+#include "lltoolbarview.h"
#include "lltoolmgr.h"
#include "lltooltip.h"
#include "lltrans.h"
@@ -58,6 +58,7 @@
#include "llviewerwindow.h"
#include "llvoavatarself.h"
#include "llworld.h"
+#include "llclipboard.h"
// syntactic sugar
#define callMemberFunction(object,ptrToMember) ((object).*(ptrToMember))
@@ -282,6 +283,8 @@ void LLCategoryDropDescendentsObserver::done()
}
*/
+S32 LLToolDragAndDrop::sOperationId = 0;
+
LLToolDragAndDrop::DragAndDropEntry::DragAndDropEntry(dragOrDrop3dImpl f_none,
dragOrDrop3dImpl f_self,
dragOrDrop3dImpl f_avatar,
@@ -308,36 +311,38 @@ LLToolDragAndDrop::dragOrDrop3dImpl LLToolDragAndDrop::LLDragAndDropDictionary::
LLToolDragAndDrop::LLDragAndDropDictionary::LLDragAndDropDictionary()
{
- // DT_NONE DT_SELF DT_AVATAR DT_OBJECT DT_LAND
- // |--------------|---------------------------|---------------------------|-------------------------------|--------------|
+ // DT_NONE DT_SELF DT_AVATAR DT_OBJECT DT_LAND
+ // |-------------------------------|----------------------------------------------|-----------------------------------------------|---------------------------------------------------|--------------------------------|
addEntry(DAD_NONE, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL));
- addEntry(DAD_TEXTURE, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dTextureObject, &LLToolDragAndDrop::dad3dNULL));
- addEntry(DAD_SOUND, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
+ addEntry(DAD_TEXTURE, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dTextureObject, &LLToolDragAndDrop::dad3dNULL));
+ addEntry(DAD_SOUND, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
addEntry(DAD_CALLINGCARD, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
- addEntry(DAD_LANDMARK, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
- addEntry(DAD_SCRIPT, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dRezScript, &LLToolDragAndDrop::dad3dNULL));
- addEntry(DAD_CLOTHING, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dWearItem, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
- addEntry(DAD_OBJECT, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dRezAttachmentFromInv, &LLToolDragAndDrop::dad3dGiveInventoryObject, &LLToolDragAndDrop::dad3dRezObjectOnObject, &LLToolDragAndDrop::dad3dRezObjectOnLand));
- addEntry(DAD_NOTECARD, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
- addEntry(DAD_CATEGORY, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dWearCategory, &LLToolDragAndDrop::dad3dGiveInventoryCategory,&LLToolDragAndDrop::dad3dUpdateInventoryCategory, &LLToolDragAndDrop::dad3dNULL));
+ addEntry(DAD_LANDMARK, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
+ addEntry(DAD_SCRIPT, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dRezScript, &LLToolDragAndDrop::dad3dNULL));
+ addEntry(DAD_CLOTHING, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dWearItem, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
+ addEntry(DAD_OBJECT, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dRezAttachmentFromInv, &LLToolDragAndDrop::dad3dGiveInventoryObject, &LLToolDragAndDrop::dad3dRezObjectOnObject, &LLToolDragAndDrop::dad3dRezObjectOnLand));
+ addEntry(DAD_NOTECARD, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
+ addEntry(DAD_CATEGORY, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dWearCategory, &LLToolDragAndDrop::dad3dGiveInventoryCategory, &LLToolDragAndDrop::dad3dUpdateInventoryCategory, &LLToolDragAndDrop::dad3dNULL));
addEntry(DAD_ROOT_CATEGORY, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL));
- addEntry(DAD_BODYPART, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dWearItem, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
- addEntry(DAD_ANIMATION, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
- addEntry(DAD_GESTURE, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dActivateGesture, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
+ addEntry(DAD_BODYPART, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dWearItem, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
+ addEntry(DAD_ANIMATION, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
+ addEntry(DAD_GESTURE, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dActivateGesture, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
addEntry(DAD_LINK, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL));
+ addEntry(DAD_MESH, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dMeshObject, &LLToolDragAndDrop::dad3dNULL));
// TODO: animation on self could play it? edit it?
// TODO: gesture on self could play it? edit it?
};
LLToolDragAndDrop::LLToolDragAndDrop()
-: LLTool(std::string("draganddrop"), NULL),
- mDragStartX(0),
- mDragStartY(0),
- mSource(SOURCE_AGENT),
- mCursor(UI_CURSOR_NO),
- mLastAccept(ACCEPT_NO),
- mDrop(FALSE),
- mCurItemIndex(0)
+: LLTool(std::string("draganddrop"), NULL),
+ mCargoCount(0),
+ mDragStartX(0),
+ mDragStartY(0),
+ mSource(SOURCE_AGENT),
+ mCursor(UI_CURSOR_NO),
+ mLastAccept(ACCEPT_NO),
+ mDrop(FALSE),
+ mCurItemIndex(0)
{
}
@@ -397,7 +402,7 @@ void LLToolDragAndDrop::beginDrag(EDragAndDropType type,
{
folder_ids.push_back(cargo_id);
}
- gInventory.collectDescendentsIf (
+ gInventory.collectDescendentsIf(
cargo_id,
cats,
items,
@@ -468,7 +473,7 @@ void LLToolDragAndDrop::beginMultiDrag(
{
cat_ids.insert(cat->getUUID());
}
- gInventory.collectDescendentsIf (
+ gInventory.collectDescendentsIf(
cat->getUUID(),
cats,
items,
@@ -613,6 +618,7 @@ BOOL LLToolDragAndDrop::handleToolTip(S32 x, S32 y, MASK mask)
{
if (!mToolTipMsg.empty())
{
+ LLToolTipMgr::instance().unblockToolTips();
LLToolTipMgr::instance().show(LLToolTip::Params()
.message(mToolTipMsg)
.delay_time(gSavedSettings.getF32( "DragAndDropToolTipDelay" )));
@@ -624,6 +630,8 @@ BOOL LLToolDragAndDrop::handleToolTip(S32 x, S32 y, MASK mask)
void LLToolDragAndDrop::handleDeselect()
{
mToolTipMsg.clear();
+
+ LLToolTipMgr::instance().blockToolTips();
}
// protected
@@ -640,6 +648,12 @@ void LLToolDragAndDrop::dragOrDrop( S32 x, S32 y, MASK mask, BOOL drop,
mToolTipMsg.clear();
+ // Increment the operation id for every drop
+ if (drop)
+ {
+ sOperationId++;
+ }
+
if (top_view)
{
handled = TRUE;
@@ -765,6 +779,21 @@ void LLToolDragAndDrop::dragOrDrop( S32 x, S32 y, MASK mask, BOOL drop,
if (!handled)
{
+ // Disallow drag and drop to 3D from the outbox
+ const LLUUID outbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false, false);
+ if (outbox_id.notNull())
+ {
+ for (S32 item_index = 0; item_index < (S32)mCargoIDs.size(); item_index++)
+ {
+ if (gInventory.isObjectDescendentOf(mCargoIDs[item_index], outbox_id))
+ {
+ *acceptance = ACCEPT_NO;
+ mToolTipMsg = LLTrans::getString("TooltipOutboxDragToWorld");
+ return;
+ }
+ }
+ }
+
dragOrDrop3D( x, y, mask, drop, acceptance );
}
}
@@ -801,7 +830,7 @@ void LLToolDragAndDrop::pick(const LLPickInfo& pick_info)
LLViewerObject* hit_obj = pick_info.getObject();
LLSelectMgr::getInstance()->unhighlightAll();
-
+ bool highlight_object = false;
// Treat attachments as part of the avatar they are attached to.
if (hit_obj != NULL)
{
@@ -843,16 +872,7 @@ void LLToolDragAndDrop::pick(const LLPickInfo& pick_info)
{
target = DT_OBJECT;
hit_face = pick_info.mObjectFace;
- // if any item being dragged will be applied to the object under our cursor
- // highlight that object
- for (S32 i = 0; i < (S32)mCargoIDs.size(); i++)
- {
- if (mCargoTypes[i] != DAD_OBJECT || (pick_info.mKeyMask & MASK_CONTROL))
- {
- LLSelectMgr::getInstance()->highlightObjectAndFamily(hit_obj);
- break;
- }
- }
+ highlight_object = true;
}
}
else if (pick_info.mPickType == LLPickInfo::PICK_LAND)
@@ -872,7 +892,7 @@ void LLToolDragAndDrop::pick(const LLPickInfo& pick_info)
(U32)mLastAccept,
(U32)callMemberFunction(*this,
LLDragAndDropDictionary::instance().get(dad_type, target))
- (hit_obj, hit_face, pick_info.mKeyMask, FALSE));
+ (hit_obj, hit_face, pick_info.mKeyMask, FALSE));
}
if (mDrop && ((U32)mLastAccept >= ACCEPT_YES_COPY_SINGLE))
@@ -898,6 +918,19 @@ void LLToolDragAndDrop::pick(const LLPickInfo& pick_info)
}
}
+ if (highlight_object && mLastAccept > ACCEPT_NO_LOCKED)
+ {
+ // if any item being dragged will be applied to the object under our cursor
+ // highlight that object
+ for (S32 i = 0; i < (S32)mCargoIDs.size(); i++)
+ {
+ if (mCargoTypes[i] != DAD_OBJECT || (pick_info.mKeyMask & MASK_CONTROL))
+ {
+ LLSelectMgr::getInstance()->highlightObjectAndFamily(hit_obj);
+ break;
+ }
+ }
+ }
ECursorType cursor = acceptanceToCursor( mLastAccept );
gViewerWindow->getWindow()->setCursor( cursor );
@@ -1028,6 +1061,31 @@ void LLToolDragAndDrop::dropTextureAllFaces(LLViewerObject* hit_obj,
hit_obj->sendTEUpdate();
}
+void LLToolDragAndDrop::dropMesh(LLViewerObject* hit_obj,
+ LLInventoryItem* item,
+ LLToolDragAndDrop::ESource source,
+ const LLUUID& src_id)
+{
+ if (!item)
+ {
+ llwarns << "no inventory item." << llendl;
+ return;
+ }
+ LLUUID asset_id = item->getAssetUUID();
+ BOOL success = handleDropTextureProtections(hit_obj, item, source, src_id);
+ if(!success)
+ {
+ return;
+ }
+
+ LLSculptParams sculpt_params;
+ sculpt_params.setSculptTexture(asset_id);
+ sculpt_params.setSculptType(LL_SCULPT_TYPE_MESH);
+ hit_obj->setParameterEntry(LLNetworkData::PARAMS_SCULPT, sculpt_params, TRUE);
+
+ dialog_refresh_all();
+}
+
/*
void LLToolDragAndDrop::dropTextureOneFaceAvatar(LLVOAvatar* avatar, S32 hit_face, LLInventoryItem* item)
{
@@ -1124,9 +1182,9 @@ void LLToolDragAndDrop::dropScript(LLViewerObject* hit_obj,
}
void LLToolDragAndDrop::dropObject(LLViewerObject* raycast_target,
- BOOL bypass_sim_raycast,
- BOOL from_task_inventory,
- BOOL remove_from_inventory)
+ BOOL bypass_sim_raycast,
+ BOOL from_task_inventory,
+ BOOL remove_from_inventory)
{
LLViewerRegion* regionp = LLWorld::getInstance()->getRegionFromPosGlobal(mLastHitPos);
if (!regionp)
@@ -1362,7 +1420,7 @@ EAcceptance LLToolDragAndDrop::willObjectAcceptInventory(LLViewerObject* obj, LL
// help make sure that drops that are from an object to an object
// don't have to worry about order of evaluation. Think of this
// like check for self in assignment.
- if (obj->getID() == item->getParentUUID())
+ if(obj->getID() == item->getParentUUID())
{
return ACCEPT_NO;
}
@@ -1371,28 +1429,34 @@ EAcceptance LLToolDragAndDrop::willObjectAcceptInventory(LLViewerObject* obj, LL
// gAgent.getGroupID())
// && (obj->mPermModify || obj->mFlagAllowInventoryAdd));
BOOL worn = FALSE;
+ LLVOAvatarSelf* my_avatar = NULL;
switch(item->getType())
{
case LLAssetType::AT_OBJECT:
- if (isAgentAvatarValid() && gAgentAvatarp->isWearingAttachment(item->getUUID()))
+ my_avatar = gAgentAvatarp;
+ if(my_avatar && my_avatar->isWearingAttachment(item->getUUID()))
{
worn = TRUE;
}
break;
case LLAssetType::AT_BODYPART:
case LLAssetType::AT_CLOTHING:
- if (gAgentWearables.isWearingItem(item->getUUID()))
+ if(gAgentWearables.isWearingItem(item->getUUID()))
{
worn = TRUE;
}
break;
+ case LLAssetType::AT_CALLINGCARD:
+ // Calling Cards in object are disabled for now
+ // because of incomplete LSL support. See STORM-1117.
+ return ACCEPT_NO;
default:
break;
}
const LLPermissions& perm = item->getPermissions();
BOOL modify = (obj->permModify() || obj->flagAllowInventoryAdd());
BOOL transfer = FALSE;
- if ((obj->permYouOwner() && (perm.getOwner() == gAgent.getID()))
+ if((obj->permYouOwner() && (perm.getOwner() == gAgent.getID()))
|| perm.allowOperationBy(PERM_TRANSFER, gAgent.getID()))
{
transfer = TRUE;
@@ -1400,15 +1464,15 @@ EAcceptance LLToolDragAndDrop::willObjectAcceptInventory(LLViewerObject* obj, LL
BOOL volume = (LL_PCODE_VOLUME == obj->getPCode());
BOOL attached = obj->isAttachment();
BOOL unrestricted = ((perm.getMaskBase() & PERM_ITEM_UNRESTRICTED) == PERM_ITEM_UNRESTRICTED) ? TRUE : FALSE;
- if (attached && !unrestricted)
+ if(attached && !unrestricted)
{
return ACCEPT_NO_LOCKED;
}
- else if (modify && transfer && volume && !worn)
+ else if(modify && transfer && volume && !worn)
{
return ACCEPT_YES_MULTI;
}
- else if (!modify)
+ else if(!modify)
{
return ACCEPT_NO_LOCKED;
}
@@ -1503,14 +1567,15 @@ bool LLToolDragAndDrop::handleGiveDragAndDrop(LLUUID dest_agent, LLUUID session_
case DAD_ANIMATION:
case DAD_GESTURE:
case DAD_CALLINGCARD:
+ case DAD_MESH:
{
LLViewerInventoryItem* inv_item = (LLViewerInventoryItem*)cargo_data;
- if (gInventory.getItem(inv_item->getUUID())
+ if(gInventory.getItem(inv_item->getUUID())
&& LLGiveInventory::isInventoryGiveAcceptable(inv_item))
{
// *TODO: get multiple object transfers working
*accept = ACCEPT_YES_COPY_SINGLE;
- if (drop)
+ if(drop)
{
LLIMModel::LLIMSession * session = LLIMModel::instance().findIMSession(session_id);
@@ -1550,11 +1615,11 @@ bool LLToolDragAndDrop::handleGiveDragAndDrop(LLUUID dest_agent, LLUUID session_
case DAD_CATEGORY:
{
LLViewerInventoryCategory* inv_cat = (LLViewerInventoryCategory*)cargo_data;
- if (gInventory.getCategory(inv_cat->getUUID()))
+ if( gInventory.getCategory( inv_cat->getUUID() ) )
{
// *TODO: get multiple object transfers working
*accept = ACCEPT_YES_COPY_SINGLE;
- if (drop)
+ if(drop)
{
LLGiveInventory::doGiveInventoryCategory(dest_agent, inv_cat, session_id);
}
@@ -1595,7 +1660,7 @@ EAcceptance LLToolDragAndDrop::dad3dRezAttachmentFromInv(
{
lldebugs << "LLToolDragAndDrop::dad3dRezAttachmentFromInv()" << llendl;
// must be in the user's inventory
- if (mSource != SOURCE_AGENT && mSource != SOURCE_LIBRARY)
+ if(mSource != SOURCE_AGENT && mSource != SOURCE_LIBRARY)
{
return ACCEPT_NO;
}
@@ -1607,20 +1672,28 @@ EAcceptance LLToolDragAndDrop::dad3dRezAttachmentFromInv(
// must not be in the trash
const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
- if (gInventory.isObjectDescendentOf(item->getUUID(), trash_id))
+ if( gInventory.isObjectDescendentOf( item->getUUID(), trash_id ) )
{
return ACCEPT_NO;
}
// must not be already wearing it
- if (!isAgentAvatarValid() || gAgentAvatarp->isWearingAttachment(item->getUUID()))
+ LLVOAvatarSelf* avatar = gAgentAvatarp;
+ if( !avatar || avatar->isWearingAttachment(item->getUUID()) )
{
return ACCEPT_NO;
}
- if (drop)
+ const LLUUID &outbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false);
+ if(gInventory.isObjectDescendentOf(item->getUUID(), outbox_id))
{
- if (mSource == SOURCE_LIBRARY)
+ return ACCEPT_NO;
+ }
+
+
+ if( drop )
+ {
+ if(mSource == SOURCE_LIBRARY)
{
LLPointer<LLInventoryCallback> cb = new RezAttachmentCallback(0);
copy_inventory_item(
@@ -1654,7 +1727,8 @@ EAcceptance LLToolDragAndDrop::dad3dRezObjectOnLand(
locateInventory(item, cat);
if (!item || !item->isFinished()) return ACCEPT_NO;
- if (!isAgentAvatarValid() || gAgentAvatarp->isWearingAttachment(item->getUUID()))
+ LLVOAvatarSelf* my_avatar = gAgentAvatarp;
+ if( !my_avatar || my_avatar->isWearingAttachment( item->getUUID() ) )
{
return ACCEPT_NO;
}
@@ -1679,7 +1753,7 @@ EAcceptance LLToolDragAndDrop::dad3dRezObjectOnLand(
// check if the item can be copied. If not, send that to the sim
// which will remove the inventory item.
- if (!item->getPermissions().allowCopyBy(gAgent.getID()))
+ if(!item->getPermissions().allowCopyBy(gAgent.getID()))
{
accept = ACCEPT_YES_SINGLE;
remove_inventory = TRUE;
@@ -1687,13 +1761,13 @@ EAcceptance LLToolDragAndDrop::dad3dRezObjectOnLand(
// Check if it's in the trash.
const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
- if (gInventory.isObjectDescendentOf(item->getUUID(), trash_id))
+ if(gInventory.isObjectDescendentOf(item->getUUID(), trash_id))
{
accept = ACCEPT_YES_SINGLE;
remove_inventory = TRUE;
}
- if (drop)
+ if(drop)
{
dropObject(obj, TRUE, FALSE, remove_inventory);
}
@@ -1715,22 +1789,23 @@ EAcceptance LLToolDragAndDrop::dad3dRezObjectOnObject(
LLViewerInventoryCategory* cat;
locateInventory(item, cat);
if (!item || !item->isFinished()) return ACCEPT_NO;
- if (!isAgentAvatarValid() || gAgentAvatarp->isWearingAttachment(item->getUUID()))
+ LLVOAvatarSelf* my_avatar = gAgentAvatarp;
+ if( !my_avatar || my_avatar->isWearingAttachment( item->getUUID() ) )
{
return ACCEPT_NO;
}
- if ((mask & MASK_CONTROL))
+ if((mask & MASK_CONTROL))
{
// *HACK: In order to resolve SL-22177, we need to block drags
// from notecards and objects onto other objects.
- if (mSource == SOURCE_NOTECARD)
+ if(mSource == SOURCE_NOTECARD)
{
return ACCEPT_NO;
}
EAcceptance rv = willObjectAcceptInventory(obj, item);
- if (drop && (ACCEPT_YES_SINGLE <= rv))
+ if(drop && (ACCEPT_YES_SINGLE <= rv))
{
dropInventory(obj, item, mSource, mSourceID);
}
@@ -1756,7 +1831,7 @@ EAcceptance LLToolDragAndDrop::dad3dRezObjectOnObject(
// check if the item can be copied. If not, send that to the sim
// which will remove the inventory item.
- if (!item->getPermissions().allowCopyBy(gAgent.getID()))
+ if(!item->getPermissions().allowCopyBy(gAgent.getID()))
{
accept = ACCEPT_YES_SINGLE;
remove_inventory = TRUE;
@@ -1764,13 +1839,13 @@ EAcceptance LLToolDragAndDrop::dad3dRezObjectOnObject(
// Check if it's in the trash.
const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
- if (gInventory.isObjectDescendentOf(item->getUUID(), trash_id))
+ if(gInventory.isObjectDescendentOf(item->getUUID(), trash_id))
{
accept = ACCEPT_YES_SINGLE;
remove_inventory = TRUE;
}
- if (drop)
+ if(drop)
{
dropObject(obj, FALSE, FALSE, remove_inventory);
}
@@ -1785,7 +1860,7 @@ EAcceptance LLToolDragAndDrop::dad3dRezScript(
// *HACK: In order to resolve SL-22177, we need to block drags
// from notecards and objects onto other objects.
- if ((SOURCE_WORLD == mSource) || (SOURCE_NOTECARD == mSource))
+ if((SOURCE_WORLD == mSource) || (SOURCE_NOTECARD == mSource))
{
return ACCEPT_NO;
}
@@ -1795,7 +1870,7 @@ EAcceptance LLToolDragAndDrop::dad3dRezScript(
locateInventory(item, cat);
if (!item || !item->isFinished()) return ACCEPT_NO;
EAcceptance rv = willObjectAcceptInventory(obj, item);
- if (drop && (ACCEPT_YES_SINGLE <= rv))
+ if(drop && (ACCEPT_YES_SINGLE <= rv))
{
// rez in the script active by default, rez in inactive if the
// control key is being held down.
@@ -1816,14 +1891,14 @@ EAcceptance LLToolDragAndDrop::dad3dRezScript(
return rv;
}
-EAcceptance LLToolDragAndDrop::dad3dTextureObject(
- LLViewerObject* obj, S32 face, MASK mask, BOOL drop)
+EAcceptance LLToolDragAndDrop::dad3dApplyToObject(
+ LLViewerObject* obj, S32 face, MASK mask, BOOL drop, EDragAndDropType cargo_type)
{
- lldebugs << "LLToolDragAndDrop::dad3dTextureObject()" << llendl;
+ lldebugs << "LLToolDragAndDrop::dad3dApplyToObject()" << llendl;
// *HACK: In order to resolve SL-22177, we need to block drags
// from notecards and objects onto other objects.
- if ((SOURCE_WORLD == mSource) || (SOURCE_NOTECARD == mSource))
+ if((SOURCE_WORLD == mSource) || (SOURCE_NOTECARD == mSource))
{
return ACCEPT_NO;
}
@@ -1833,33 +1908,44 @@ EAcceptance LLToolDragAndDrop::dad3dTextureObject(
locateInventory(item, cat);
if (!item || !item->isFinished()) return ACCEPT_NO;
EAcceptance rv = willObjectAcceptInventory(obj, item);
- if ((mask & MASK_CONTROL))
+ if((mask & MASK_CONTROL))
{
- if ((ACCEPT_YES_SINGLE <= rv) && drop)
+ if((ACCEPT_YES_SINGLE <= rv) && drop)
{
dropInventory(obj, item, mSource, mSourceID);
}
return rv;
}
- if (!obj->permModify())
+ if(!obj->permModify())
{
return ACCEPT_NO_LOCKED;
}
//If texture !copyable don't texture or you'll never get it back.
- if (!item->getPermissions().allowCopyBy(gAgent.getID()))
+ if(!item->getPermissions().allowCopyBy(gAgent.getID()))
{
return ACCEPT_NO;
}
- if (drop && (ACCEPT_YES_SINGLE <= rv))
+ if(drop && (ACCEPT_YES_SINGLE <= rv))
{
- if ((mask & MASK_SHIFT))
+ if (cargo_type == DAD_TEXTURE)
{
- dropTextureAllFaces(obj, item, mSource, mSourceID);
+ if((mask & MASK_SHIFT))
+ {
+ dropTextureAllFaces(obj, item, mSource, mSourceID);
+ }
+ else
+ {
+ dropTextureOneFace(obj, face, item, mSource, mSourceID);
+ }
+ }
+ else if (cargo_type == DAD_MESH)
+ {
+ dropMesh(obj, item, mSource, mSourceID);
}
else
{
- dropTextureOneFace(obj, face, item, mSource, mSourceID);
+ llwarns << "unsupported asset type" << llendl;
}
// VEFFECT: SetTexture
@@ -1873,14 +1959,29 @@ EAcceptance LLToolDragAndDrop::dad3dTextureObject(
// enable multi-drop, although last texture will win
return ACCEPT_YES_MULTI;
}
+
+
+EAcceptance LLToolDragAndDrop::dad3dTextureObject(
+ LLViewerObject* obj, S32 face, MASK mask, BOOL drop)
+{
+ return dad3dApplyToObject(obj, face, mask, drop, DAD_TEXTURE);
+}
+
+EAcceptance LLToolDragAndDrop::dad3dMeshObject(
+ LLViewerObject* obj, S32 face, MASK mask, BOOL drop)
+{
+ return dad3dApplyToObject(obj, face, mask, drop, DAD_MESH);
+}
+
+
/*
EAcceptance LLToolDragAndDrop::dad3dTextureSelf(
LLViewerObject* obj, S32 face, MASK mask, BOOL drop)
{
lldebugs << "LLToolDragAndDrop::dad3dTextureAvatar()" << llendl;
- if (drop)
+ if(drop)
{
- if (!(mask & MASK_SHIFT))
+ if( !(mask & MASK_SHIFT) )
{
dropTextureOneFaceAvatar( (LLVOAvatar*)obj, face, (LLInventoryItem*)mCargoData);
}
@@ -1898,16 +1999,16 @@ EAcceptance LLToolDragAndDrop::dad3dWearItem(
locateInventory(item, cat);
if (!item || !item->isFinished()) return ACCEPT_NO;
- if (mSource == SOURCE_AGENT || mSource == SOURCE_LIBRARY)
+ if(mSource == SOURCE_AGENT || mSource == SOURCE_LIBRARY)
{
// it's in the agent inventory
const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
- if (gInventory.isObjectDescendentOf(item->getUUID(), trash_id))
+ if( gInventory.isObjectDescendentOf( item->getUUID(), trash_id ) )
{
return ACCEPT_NO;
}
- if (drop)
+ if( drop )
{
// TODO: investigate wearables may not be loaded at this point EXT-8231
@@ -1931,19 +2032,19 @@ EAcceptance LLToolDragAndDrop::dad3dActivateGesture(
locateInventory(item, cat);
if (!item || !item->isFinished()) return ACCEPT_NO;
- if (mSource == SOURCE_AGENT || mSource == SOURCE_LIBRARY)
+ if(mSource == SOURCE_AGENT || mSource == SOURCE_LIBRARY)
{
// it's in the agent inventory
const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
- if (gInventory.isObjectDescendentOf(item->getUUID(), trash_id))
+ if( gInventory.isObjectDescendentOf( item->getUUID(), trash_id ) )
{
return ACCEPT_NO;
}
- if (drop)
+ if( drop )
{
LLUUID item_id;
- if (mSource == SOURCE_LIBRARY)
+ if(mSource == SOURCE_LIBRARY)
{
// create item based on that one, and put it on if that
// was a success.
@@ -1978,31 +2079,37 @@ EAcceptance LLToolDragAndDrop::dad3dWearCategory(
LLViewerInventoryItem* item;
LLViewerInventoryCategory* category;
locateInventory(item, category);
- if (!category) return ACCEPT_NO;
+ if(!category) return ACCEPT_NO;
if (drop)
{
// TODO: investigate wearables may not be loaded at this point EXT-8231
}
- if (mSource == SOURCE_AGENT)
+ if(mSource == SOURCE_AGENT)
{
const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
- if (gInventory.isObjectDescendentOf(category->getUUID(), trash_id))
+ if( gInventory.isObjectDescendentOf( category->getUUID(), trash_id ) )
{
return ACCEPT_NO;
}
- if (drop)
+ const LLUUID &outbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false);
+ if(gInventory.isObjectDescendentOf(category->getUUID(), outbox_id))
{
- BOOL append = ( (mask & MASK_SHIFT) ? TRUE : FALSE );
+ return ACCEPT_NO;
+ }
+
+ if(drop)
+ {
+ BOOL append = ( (mask & MASK_SHIFT) ? TRUE : FALSE );
LLAppearanceMgr::instance().wearInventoryCategory(category, false, append);
}
return ACCEPT_YES_MULTI;
}
- else if (mSource == SOURCE_LIBRARY)
+ else if(mSource == SOURCE_LIBRARY)
{
- if (drop)
+ if(drop)
{
LLAppearanceMgr::instance().wearInventoryCategory(category, true, false);
}
@@ -2023,7 +2130,7 @@ EAcceptance LLToolDragAndDrop::dad3dUpdateInventory(
// *HACK: In order to resolve SL-22177, we need to block drags
// from notecards and objects onto other objects.
- if ((SOURCE_WORLD == mSource) || (SOURCE_NOTECARD == mSource))
+ if((SOURCE_WORLD == mSource) || (SOURCE_NOTECARD == mSource))
{
return ACCEPT_NO;
}
@@ -2043,7 +2150,7 @@ EAcceptance LLToolDragAndDrop::dad3dUpdateInventory(
}
EAcceptance rv = willObjectAcceptInventory(root_object, item);
- if (root_object && drop && (ACCEPT_YES_COPY_SINGLE <= rv))
+ if(root_object && drop && (ACCEPT_YES_COPY_SINGLE <= rv))
{
dropInventory(root_object, item, mSource, mSourceID);
}
@@ -2087,7 +2194,7 @@ EAcceptance LLToolDragAndDrop::dad3dUpdateInventoryCategory(
LLDroppableItem droppable(!obj->permYouOwner());
LLInventoryModel::cat_array_t cats;
LLInventoryModel::item_array_t items;
- gInventory.collectDescendentsIf (cat->getUUID(),
+ gInventory.collectDescendentsIf(cat->getUUID(),
cats,
items,
LLInventoryModel::EXCLUDE_TRASH,
@@ -2116,7 +2223,7 @@ EAcceptance LLToolDragAndDrop::dad3dUpdateInventoryCategory(
{
const LLViewerInventoryCategory *cat = (*cat_iter);
rv = gInventory.isCategoryComplete(cat->getUUID()) ? ACCEPT_YES_MULTI : ACCEPT_NO;
- if (rv < ACCEPT_YES_SINGLE)
+ if(rv < ACCEPT_YES_SINGLE)
{
lldebugs << "Category " << cat->getUUID() << "is not complete." << llendl;
break;
@@ -2184,26 +2291,27 @@ EAcceptance LLToolDragAndDrop::dad3dGiveInventoryObject(
lldebugs << "LLToolDragAndDrop::dad3dGiveInventoryObject()" << llendl;
// item has to be in agent inventory.
- if (mSource != SOURCE_AGENT) return ACCEPT_NO;
+ if(mSource != SOURCE_AGENT) return ACCEPT_NO;
// find the item now.
LLViewerInventoryItem* item;
LLViewerInventoryCategory* cat;
locateInventory(item, cat);
if (!item || !item->isFinished()) return ACCEPT_NO;
- if (!item->getPermissions().allowOperationBy(PERM_TRANSFER, gAgent.getID()))
+ if(!item->getPermissions().allowOperationBy(PERM_TRANSFER, gAgent.getID()))
{
// cannot give away no-transfer objects
return ACCEPT_NO;
}
- if (isAgentAvatarValid() && gAgentAvatarp->isWearingAttachment(item->getUUID()))
+ LLVOAvatarSelf* avatar = gAgentAvatarp;
+ if(avatar && avatar->isWearingAttachment( item->getUUID() ) )
{
// You can't give objects that are attached to you
return ACCEPT_NO;
}
- if (obj && isAgentAvatarValid())
+ if( obj && avatar )
{
- if (drop)
+ if(drop)
{
LLGiveInventory::doGiveInventoryItem(obj->getID(), item );
}
@@ -2220,7 +2328,7 @@ EAcceptance LLToolDragAndDrop::dad3dGiveInventory(
{
lldebugs << "LLToolDragAndDrop::dad3dGiveInventory()" << llendl;
// item has to be in agent inventory.
- if (mSource != SOURCE_AGENT) return ACCEPT_NO;
+ if(mSource != SOURCE_AGENT) return ACCEPT_NO;
LLViewerInventoryItem* item;
LLViewerInventoryCategory* cat;
locateInventory(item, cat);
@@ -2242,12 +2350,12 @@ EAcceptance LLToolDragAndDrop::dad3dGiveInventoryCategory(
LLViewerObject* obj, S32 face, MASK mask, BOOL drop)
{
lldebugs << "LLToolDragAndDrop::dad3dGiveInventoryCategory()" << llendl;
- if (drop && obj)
+ if(drop && obj)
{
LLViewerInventoryItem* item;
LLViewerInventoryCategory* cat;
locateInventory(item, cat);
- if (!cat) return ACCEPT_NO;
+ if(!cat) return ACCEPT_NO;
LLGiveInventory::doGiveInventoryCategory(obj->getID(), cat);
}
// *TODO: deal with all the issues surrounding multi-object
@@ -2265,12 +2373,12 @@ EAcceptance LLToolDragAndDrop::dad3dRezFromObjectOnLand(
locateInventory(item, cat);
if (!item || !item->isFinished()) return ACCEPT_NO;
- if (!gAgent.allowOperation(PERM_COPY, item->getPermissions())
+ if(!gAgent.allowOperation(PERM_COPY, item->getPermissions())
|| !item->getPermissions().allowTransferTo(LLUUID::null))
{
return ACCEPT_NO_LOCKED;
}
- if (drop)
+ if(drop)
{
dropObject(obj, TRUE, TRUE, FALSE);
}
@@ -2285,7 +2393,7 @@ EAcceptance LLToolDragAndDrop::dad3dRezFromObjectOnObject(
LLViewerInventoryCategory* cat;
locateInventory(item, cat);
if (!item || !item->isFinished()) return ACCEPT_NO;
- if ((mask & MASK_CONTROL))
+ if((mask & MASK_CONTROL))
{
// *HACK: In order to resolve SL-22177, we need to block drags
// from notecards and objects onto other objects.
@@ -2293,19 +2401,19 @@ EAcceptance LLToolDragAndDrop::dad3dRezFromObjectOnObject(
// *HACK: uncomment this when appropriate
//EAcceptance rv = willObjectAcceptInventory(obj, item);
- //if (drop && (ACCEPT_YES_SINGLE <= rv))
+ //if(drop && (ACCEPT_YES_SINGLE <= rv))
//{
// dropInventory(obj, item, mSource, mSourceID);
//}
//return rv;
}
- if (!item->getPermissions().allowCopyBy(gAgent.getID(),
+ if(!item->getPermissions().allowCopyBy(gAgent.getID(),
gAgent.getGroupID())
|| !item->getPermissions().allowTransferTo(LLUUID::null))
{
return ACCEPT_NO_LOCKED;
}
- if (drop)
+ if(drop)
{
dropObject(obj, FALSE, TRUE, FALSE);
}
@@ -2321,23 +2429,23 @@ EAcceptance LLToolDragAndDrop::dad3dCategoryOnLand(
LLInventoryItem* item;
LLInventoryCategory* cat;
locateInventory(item, cat);
- if (!cat) return ACCEPT_NO;
+ if(!cat) return ACCEPT_NO;
EAcceptance rv = ACCEPT_NO;
// find all the items in the category
LLViewerInventoryCategory::cat_array_t cats;
LLViewerInventoryItem::item_array_t items;
LLDropCopyableItems droppable;
- gInventory.collectDescendentsIf (cat->getUUID(),
+ gInventory.collectDescendentsIf(cat->getUUID(),
cats,
items,
LLInventoryModel::EXCLUDE_TRASH,
droppable);
- if (items.count() > 0)
+ if(items.count() > 0)
{
rv = ACCEPT_YES_SINGLE;
}
- if ((rv >= ACCEPT_YES_COPY_SINGLE) && drop)
+ if((rv >= ACCEPT_YES_COPY_SINGLE) && drop)
{
createContainer(items, cat->getName());
return ACCEPT_NO;
@@ -2360,19 +2468,19 @@ EAcceptance LLToolDragAndDrop::dad3dAssetOnLand(
LLViewerInventoryItem::item_array_t items;
LLViewerInventoryItem::item_array_t copyable_items;
locateMultipleInventory(items, cats);
- if (!items.count()) return ACCEPT_NO;
+ if(!items.count()) return ACCEPT_NO;
EAcceptance rv = ACCEPT_NO;
for (S32 i = 0; i < items.count(); i++)
{
LLInventoryItem* item = items[i];
- if (item->getPermissions().allowCopyBy(gAgent.getID()))
+ if(item->getPermissions().allowCopyBy(gAgent.getID()))
{
copyable_items.put(item);
rv = ACCEPT_YES_SINGLE;
}
}
- if ((rv >= ACCEPT_YES_COPY_SINGLE) && drop)
+ if((rv >= ACCEPT_YES_COPY_SINGLE) && drop)
{
createContainer(copyable_items, NULL);
}
@@ -2387,20 +2495,20 @@ LLInventoryObject* LLToolDragAndDrop::locateInventory(
{
item = NULL;
cat = NULL;
- if (mCargoIDs.empty()) return NULL;
- if ((mSource == SOURCE_AGENT) || (mSource == SOURCE_LIBRARY))
+ if(mCargoIDs.empty()) return NULL;
+ if((mSource == SOURCE_AGENT) || (mSource == SOURCE_LIBRARY))
{
// The object should be in user inventory.
item = (LLViewerInventoryItem*)gInventory.getItem(mCargoIDs[mCurItemIndex]);
cat = (LLViewerInventoryCategory*)gInventory.getCategory(mCargoIDs[mCurItemIndex]);
}
- else if (mSource == SOURCE_WORLD)
+ else if(mSource == SOURCE_WORLD)
{
// This object is in some task inventory somewhere.
LLViewerObject* obj = gObjectList.findObject(mSourceID);
- if (obj)
+ if(obj)
{
- if ((mCargoTypes[mCurItemIndex] == DAD_CATEGORY)
+ if((mCargoTypes[mCurItemIndex] == DAD_CATEGORY)
|| (mCargoTypes[mCurItemIndex] == DAD_ROOT_CATEGORY))
{
cat = (LLViewerInventoryCategory*)obj->getInventoryObject(mCargoIDs[mCurItemIndex]);
@@ -2411,16 +2519,20 @@ LLInventoryObject* LLToolDragAndDrop::locateInventory(
}
}
}
- else if (mSource == SOURCE_NOTECARD)
+ else if(mSource == SOURCE_NOTECARD)
{
LLPreviewNotecard* preview = LLFloaterReg::findTypedInstance<LLPreviewNotecard>("preview_notecard", mSourceID);
- if (preview)
+ if(preview)
{
item = (LLViewerInventoryItem*)preview->getDragItem();
}
}
- if (item) return item;
- if (cat) return cat;
+ else if(mSource == SOURCE_VIEWER)
+ {
+ item = (LLViewerInventoryItem*)gToolBarView->getDragItem();
+ }
+ if(item) return item;
+ if(cat) return cat;
return NULL;
}
@@ -2428,8 +2540,8 @@ LLInventoryObject* LLToolDragAndDrop::locateInventory(
LLInventoryObject* LLToolDragAndDrop::locateMultipleInventory(LLViewerInventoryCategory::cat_array_t& cats,
LLViewerInventoryItem::item_array_t& items)
{
- if (mCargoIDs.count() == 0) return NULL;
- if ((mSource == SOURCE_AGENT) || (mSource == SOURCE_LIBRARY))
+ if(mCargoIDs.count() == 0) return NULL;
+ if((mSource == SOURCE_AGENT) || (mSource == SOURCE_LIBRARY))
{
// The object should be in user inventory.
for (S32 i = 0; i < mCargoIDs.count(); i++)
@@ -2446,13 +2558,13 @@ LLInventoryObject* LLToolDragAndDrop::locateMultipleInventory(LLViewerInventoryC
}
}
}
- else if (mSource == SOURCE_WORLD)
+ else if(mSource == SOURCE_WORLD)
{
// This object is in some task inventory somewhere.
LLViewerObject* obj = gObjectList.findObject(mSourceID);
- if (obj)
+ if(obj)
{
- if ((mCargoType == DAD_CATEGORY)
+ if((mCargoType == DAD_CATEGORY)
|| (mCargoType == DAD_ROOT_CATEGORY))
{
// The object should be in user inventory.
@@ -2478,17 +2590,17 @@ LLInventoryObject* LLToolDragAndDrop::locateMultipleInventory(LLViewerInventoryC
}
}
}
- else if (mSource == SOURCE_NOTECARD)
+ else if(mSource == SOURCE_NOTECARD)
{
LLPreviewNotecard* card;
card = (LLPreviewNotecard*)LLPreview::find(mSourceID);
- if (card)
+ if(card)
{
items.put((LLInventoryItem*)card->getDragItem());
}
}
- if (items.count()) return items[0];
- if (cats.count()) return cats[0];
+ if(items.count()) return items[0];
+ if(cats.count()) return cats[0];
return NULL;
}
*/
diff --git a/indra/newview/lltooldraganddrop.h b/indra/newview/lltooldraganddrop.h
index a13b775699..245c2a23e6 100644
--- a/indra/newview/lltooldraganddrop.h
+++ b/indra/newview/lltooldraganddrop.h
@@ -66,7 +66,8 @@ public:
SOURCE_AGENT,
SOURCE_WORLD,
SOURCE_NOTECARD,
- SOURCE_LIBRARY
+ SOURCE_LIBRARY,
+ SOURCE_VIEWER
};
void beginDrag(EDragAndDropType type,
@@ -86,6 +87,12 @@ public:
boost::signals2::connection setEndDragCallback( const enddrag_signal_t::slot_type& cb ) { return mEndDragSignal.connect(cb); }
+ void setCargoCount(U32 count) { mCargoCount = count; }
+ void resetCargoCount() { mCargoCount = 0; }
+ U32 getCargoCount() const { return (mCargoCount > 0) ? mCargoCount : mCargoIDs.size(); }
+
+ static S32 getOperationId() { return sOperationId; }
+
protected:
enum EDropTarget
{
@@ -114,6 +121,8 @@ protected:
protected:
+ U32 mCargoCount;
+
S32 mDragStartX;
S32 mDragStartY;
@@ -124,6 +133,8 @@ protected:
LLUUID mSourceID;
LLUUID mObjectID;
+ static S32 sOperationId;
+
LLVector3d mLastCameraPos;
LLVector3d mLastHitPos;
@@ -148,6 +159,8 @@ protected:
MASK mask, BOOL drop);
EAcceptance dad3dTextureObject(LLViewerObject* obj, S32 face,
MASK mask, BOOL drop);
+ EAcceptance dad3dMeshObject(LLViewerObject* obj, S32 face,
+ MASK mask, BOOL drop);
// EAcceptance dad3dTextureSelf(LLViewerObject* obj, S32 face,
// MASK mask, BOOL drop);
EAcceptance dad3dWearItem(LLViewerObject* obj, S32 face,
@@ -179,6 +192,11 @@ protected:
EAcceptance dad3dActivateGesture(LLViewerObject *obj, S32 face,
MASK mask, BOOL drop);
+ // helper called by methods above to handle "application" of an item
+ // to an object (texture applied to face, mesh applied to shape, etc.)
+ EAcceptance dad3dApplyToObject(LLViewerObject* obj, S32 face, MASK mask, BOOL drop, EDragAndDropType cargo_type);
+
+
// set the LLToolDragAndDrop's cursor based on the given acceptance
ECursorType acceptanceToCursor( EAcceptance acceptance );
@@ -229,6 +247,11 @@ public:
LLInventoryItem* item,
ESource source,
const LLUUID& src_id);
+ static void dropMesh(LLViewerObject* hit_obj,
+ LLInventoryItem* item,
+ ESource source,
+ const LLUUID& src_id);
+
//static void dropTextureOneFaceAvatar(LLVOAvatar* avatar,S32 hit_face,
// LLInventoryItem* item)
diff --git a/indra/newview/lltoolgrab.cpp b/indra/newview/lltoolgrab.cpp
index b6c0f662e5..319e2508e0 100644
--- a/indra/newview/lltoolgrab.cpp
+++ b/indra/newview/lltoolgrab.cpp
@@ -54,7 +54,6 @@
#include "llviewerobject.h"
#include "llviewerobjectlist.h"
#include "llviewerregion.h"
-#include "llviewerwindow.h"
#include "llvoavatarself.h"
#include "llworld.h"
@@ -387,22 +386,7 @@ void LLToolGrab::startGrab()
mDragStartPointGlobal = grab_start_global;
mDragStartFromCamera = grab_start_global - gAgentCamera.getCameraPositionGlobal();
- LLMessageSystem *msg = gMessageSystem;
- msg->newMessageFast(_PREHASH_ObjectGrab);
- msg->nextBlockFast(_PREHASH_AgentData);
- msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
- msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
- msg->nextBlockFast(_PREHASH_ObjectData);
- msg->addU32Fast(_PREHASH_LocalID, objectp->mLocalID);
- msg->addVector3Fast(_PREHASH_GrabOffset, grab_offset );
- msg->nextBlock("SurfaceInfo");
- msg->addVector3("UVCoord", LLVector3(mGrabPick.mUVCoords));
- msg->addVector3("STCoord", LLVector3(mGrabPick.mSTCoords));
- msg->addS32Fast(_PREHASH_FaceIndex, mGrabPick.mObjectFace);
- msg->addVector3("Position", mGrabPick.mIntersection);
- msg->addVector3("Normal", mGrabPick.mNormal);
- msg->addVector3("Binormal", mGrabPick.mBinormal);
- msg->sendMessage( objectp->getRegion()->getHost());
+ send_ObjectGrab_message(objectp, mGrabPick, grab_offset);
mGrabOffsetFromCenterInitial = grab_offset;
mGrabHiddenOffsetFromCamera = mDragStartFromCamera;
@@ -1036,28 +1020,12 @@ void LLToolGrab::stopGrab()
}
// Next, send messages to simulator
- LLMessageSystem *msg = gMessageSystem;
switch(mMode)
{
case GRAB_ACTIVE_CENTER:
case GRAB_NONPHYSICAL:
case GRAB_LOCKED:
- msg->newMessageFast(_PREHASH_ObjectDeGrab);
- msg->nextBlockFast(_PREHASH_AgentData);
- msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
- msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
- msg->nextBlockFast(_PREHASH_ObjectData);
- msg->addU32Fast(_PREHASH_LocalID, objectp->mLocalID);
- msg->nextBlock("SurfaceInfo");
- msg->addVector3("UVCoord", LLVector3(pick.mUVCoords));
- msg->addVector3("STCoord", LLVector3(pick.mSTCoords));
- msg->addS32Fast(_PREHASH_FaceIndex, pick.mObjectFace);
- msg->addVector3("Position", pick.mIntersection);
- msg->addVector3("Normal", pick.mNormal);
- msg->addVector3("Binormal", pick.mBinormal);
-
- msg->sendMessage(objectp->getRegion()->getHost());
-
+ send_ObjectDeGrab_message(objectp, pick);
mVerticalDragging = FALSE;
break;
@@ -1109,3 +1077,66 @@ LLVector3d LLToolGrab::getGrabPointGlobal()
return gAgent.getPositionGlobal();
}
}
+
+
+void send_ObjectGrab_message(LLViewerObject* object, const LLPickInfo & pick, const LLVector3 &grab_offset)
+{
+ if (!object) return;
+
+ LLMessageSystem *msg = gMessageSystem;
+
+ msg->newMessageFast(_PREHASH_ObjectGrab);
+ msg->nextBlockFast( _PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ msg->nextBlockFast( _PREHASH_ObjectData);
+ msg->addU32Fast( _PREHASH_LocalID, object->mLocalID);
+ msg->addVector3Fast(_PREHASH_GrabOffset, grab_offset);
+ msg->nextBlock("SurfaceInfo");
+ msg->addVector3("UVCoord", LLVector3(pick.mUVCoords));
+ msg->addVector3("STCoord", LLVector3(pick.mSTCoords));
+ msg->addS32Fast(_PREHASH_FaceIndex, pick.mObjectFace);
+ msg->addVector3("Position", pick.mIntersection);
+ msg->addVector3("Normal", pick.mNormal);
+ msg->addVector3("Binormal", pick.mBinormal);
+ msg->sendMessage( object->getRegion()->getHost());
+
+ /* Diagnostic code
+ llinfos << "mUVCoords: " << pick.mUVCoords
+ << ", mSTCoords: " << pick.mSTCoords
+ << ", mObjectFace: " << pick.mObjectFace
+ << ", mIntersection: " << pick.mIntersection
+ << ", mNormal: " << pick.mNormal
+ << ", mBinormal: " << pick.mBinormal
+ << llendl;
+
+ llinfos << "Avatar pos: " << gAgent.getPositionAgent() << llendl;
+ llinfos << "Object pos: " << object->getPosition() << llendl;
+ */
+}
+
+
+void send_ObjectDeGrab_message(LLViewerObject* object, const LLPickInfo & pick)
+{
+ if (!object) return;
+
+ LLMessageSystem *msg = gMessageSystem;
+
+ msg->newMessageFast(_PREHASH_ObjectDeGrab);
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ msg->nextBlockFast(_PREHASH_ObjectData);
+ msg->addU32Fast(_PREHASH_LocalID, object->mLocalID);
+ msg->nextBlock("SurfaceInfo");
+ msg->addVector3("UVCoord", LLVector3(pick.mUVCoords));
+ msg->addVector3("STCoord", LLVector3(pick.mSTCoords));
+ msg->addS32Fast(_PREHASH_FaceIndex, pick.mObjectFace);
+ msg->addVector3("Position", pick.mIntersection);
+ msg->addVector3("Normal", pick.mNormal);
+ msg->addVector3("Binormal", pick.mBinormal);
+ msg->sendMessage(object->getRegion()->getHost());
+}
+
+
+
diff --git a/indra/newview/lltoolgrab.h b/indra/newview/lltoolgrab.h
index 61e3fcb8b2..06a3b662c8 100644
--- a/indra/newview/lltoolgrab.h
+++ b/indra/newview/lltoolgrab.h
@@ -39,6 +39,13 @@ class LLTextBox;
class LLViewerObject;
class LLPickInfo;
+
+// Message utilities
+void send_ObjectGrab_message(LLViewerObject* object, const LLPickInfo & pick, const LLVector3 &grab_offset);
+void send_ObjectDeGrab_message(LLViewerObject* object, const LLPickInfo & pick);
+
+
+
class LLToolGrab : public LLTool, public LLSingleton<LLToolGrab>
{
public:
diff --git a/indra/newview/lltoolgun.cpp b/indra/newview/lltoolgun.cpp
index 68af3d73d2..857d105361 100644
--- a/indra/newview/lltoolgun.cpp
+++ b/indra/newview/lltoolgun.cpp
@@ -56,7 +56,7 @@ void LLToolGun::handleSelect()
{
gViewerWindow->hideCursor();
gViewerWindow->moveCursorToCenter();
- gViewerWindow->mWindow->setMouseClipping(TRUE);
+ gViewerWindow->getWindow()->setMouseClipping(TRUE);
mIsSelected = TRUE;
}
@@ -64,7 +64,7 @@ void LLToolGun::handleDeselect()
{
gViewerWindow->moveCursorToCenter();
gViewerWindow->showCursor();
- gViewerWindow->mWindow->setMouseClipping(FALSE);
+ gViewerWindow->getWindow()->setMouseClipping(FALSE);
mIsSelected = FALSE;
}
diff --git a/indra/newview/lltoolmgr.cpp b/indra/newview/lltoolmgr.cpp
index 51c0e2eeed..ac01316462 100644
--- a/indra/newview/lltoolmgr.cpp
+++ b/indra/newview/lltoolmgr.cpp
@@ -81,7 +81,7 @@ LLToolMgr::LLToolMgr()
// Not a panel, register these callbacks globally.
LLUICtrl::EnableCallbackRegistry::currentRegistrar().add("Build.Active", boost::bind(&LLToolMgr::inEdit, this));
LLUICtrl::EnableCallbackRegistry::currentRegistrar().add("Build.Enabled", boost::bind(&LLToolMgr::canEdit, this));
- LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("Build.Toggle", boost::bind(&LLToolMgr::toggleBuildMode, this));
+ LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("Build.Toggle", boost::bind(&LLToolMgr::toggleBuildMode, this, _2));
gToolNull = new LLTool(LLStringUtil::null); // Does nothing
setCurrentTool(gToolNull);
@@ -245,26 +245,19 @@ bool LLToolMgr::canEdit()
return LLViewerParcelMgr::getInstance()->allowAgentBuild();
}
-void LLToolMgr::toggleBuildMode()
+void LLToolMgr::toggleBuildMode(const LLSD& sdname)
{
- if (inBuildMode())
+ const std::string& param = sdname.asString();
+
+ if (param == "build" && !canEdit())
{
- if (gSavedSettings.getBOOL("EditCameraMovement"))
- {
- // just reset the view, will pull us out of edit mode
- handle_reset_view();
- }
- else
- {
- // manually disable edit mode, but do not affect the camera
- gAgentCamera.resetView(false);
- LLFloaterReg::hideInstance("build");
- gViewerWindow->showCursor();
- }
- // avoid spurious avatar movements pulling out of edit mode
- LLViewerJoystick::getInstance()->setNeedsReset();
+ return;
}
- else
+
+ LLFloaterReg::toggleInstanceOrBringToFront("build");
+
+ bool build_visible = LLFloaterReg::instanceVisible("build");
+ if (build_visible)
{
ECameraMode camMode = gAgentCamera.getCameraMode();
if (CAMERA_MODE_MOUSELOOK == camMode || CAMERA_MODE_CUSTOMIZE_AVATAR == camMode)
@@ -291,7 +284,7 @@ void LLToolMgr::toggleBuildMode()
}
}
-
+
setCurrentToolset(gBasicToolset);
getCurrentToolset()->selectTool( LLToolCompCreate::getInstance() );
@@ -304,6 +297,24 @@ void LLToolMgr::toggleBuildMode()
LLViewerJoystick::getInstance()->setNeedsReset();
}
+ else
+ {
+ if (gSavedSettings.getBOOL("EditCameraMovement"))
+ {
+ // just reset the view, will pull us out of edit mode
+ handle_reset_view();
+ }
+ else
+ {
+ // manually disable edit mode, but do not affect the camera
+ gAgentCamera.resetView(false);
+ LLFloaterReg::hideInstance("build");
+ gViewerWindow->showCursor();
+ }
+ // avoid spurious avatar movements pulling out of edit mode
+ LLViewerJoystick::getInstance()->setNeedsReset();
+ }
+
}
bool LLToolMgr::inBuildMode()
diff --git a/indra/newview/lltoolmgr.h b/indra/newview/lltoolmgr.h
index d489c4c829..12649cfba2 100644
--- a/indra/newview/lltoolmgr.h
+++ b/indra/newview/lltoolmgr.h
@@ -54,7 +54,7 @@ public:
bool inEdit();
bool canEdit();
- void toggleBuildMode();
+ void toggleBuildMode(const LLSD& sdname);
/* Determines if we are in Build mode or not. */
bool inBuildMode();
diff --git a/indra/newview/lltoolmorph.cpp b/indra/newview/lltoolmorph.cpp
index ca80a1db79..718201e381 100644
--- a/indra/newview/lltoolmorph.cpp
+++ b/indra/newview/lltoolmorph.cpp
@@ -169,23 +169,28 @@ BOOL LLVisualParamHint::render()
gGL.pushUIMatrix();
gGL.loadUIIdentity();
- glMatrixMode(GL_PROJECTION);
+ gGL.matrixMode(LLRender::MM_PROJECTION);
gGL.pushMatrix();
- glLoadIdentity();
- glOrtho(0.0f, mFullWidth, 0.0f, mFullHeight, -1.0f, 1.0f);
+ gGL.loadIdentity();
+ gGL.ortho(0.0f, mFullWidth, 0.0f, mFullHeight, -1.0f, 1.0f);
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.pushMatrix();
- glLoadIdentity();
+ gGL.loadIdentity();
+
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gUIProgram.bind();
+ }
LLGLSUIDefault gls_ui;
//LLGLState::verify(TRUE);
mBackgroundp->draw(0, 0, mFullWidth, mFullHeight);
- glMatrixMode(GL_PROJECTION);
+ gGL.matrixMode(LLRender::MM_PROJECTION);
gGL.popMatrix();
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.popMatrix();
mNeedsUpdate = FALSE;
@@ -244,13 +249,13 @@ BOOL LLVisualParamHint::render()
//-----------------------------------------------------------------------------
// draw()
//-----------------------------------------------------------------------------
-void LLVisualParamHint::draw()
+void LLVisualParamHint::draw(F32 alpha)
{
if (!mIsVisible) return;
gGL.getTexUnit(0)->bind(this);
- gGL.color4f(1.f, 1.f, 1.f, 1.f);
+ gGL.color4f(1.f, 1.f, 1.f, alpha);
LLGLSUIDefault gls_ui;
gGL.begin(LLRender::QUADS);
diff --git a/indra/newview/lltoolmorph.h b/indra/newview/lltoolmorph.h
index 59201233ae..a6889be151 100644
--- a/indra/newview/lltoolmorph.h
+++ b/indra/newview/lltoolmorph.h
@@ -68,7 +68,7 @@ public:
BOOL render();
void requestUpdate( S32 delay_frames ) {mNeedsUpdate = TRUE; mDelayFrames = delay_frames; }
void setUpdateDelayFrames( S32 delay_frames ) { mDelayFrames = delay_frames; }
- void draw();
+ void draw(F32 alpha);
LLViewerVisualParam* getVisualParam() { return mVisualParam; }
F32 getVisualParamWeight() { return mVisualParamWeight; }
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index d992d808c7..b0d9bd5d70 100644
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -35,9 +35,8 @@
#include "llagent.h"
#include "llagentcamera.h"
#include "llavatarnamecache.h"
-#include "llviewercontrol.h"
#include "llfocusmgr.h"
-//#include "llfirstuse.h"
+#include "llfirstuse.h"
#include "llfloaterland.h"
#include "llfloaterreg.h"
#include "llfloaterscriptdebug.h"
@@ -57,6 +56,7 @@
#include "lltrans.h"
#include "llviewercamera.h"
#include "llviewerparcelmedia.h"
+#include "llviewercontrol.h"
#include "llviewermenu.h"
#include "llviewerobjectlist.h"
#include "llviewerobject.h"
@@ -76,14 +76,18 @@ static void handle_click_action_play();
static void handle_click_action_open_media(LLPointer<LLViewerObject> objectp);
static ECursorType cursor_from_parcel_media(U8 click_action);
-
LLToolPie::LLToolPie()
: LLTool(std::string("Pie")),
- mGrabMouseButtonDown( FALSE ),
- mMouseOutsideSlop( FALSE ),
- mClickAction(0)
-{ }
-
+ mMouseButtonDown( false ),
+ mMouseOutsideSlop( false ),
+ mMouseSteerX(-1),
+ mMouseSteerY(-1),
+ mBlockClickToWalk(false),
+ mClickAction(0),
+ mClickActionBuyEnabled( gSavedSettings.getBOOL("ClickActionBuyEnabled") ),
+ mClickActionPayEnabled( gSavedSettings.getBOOL("ClickActionPayEnabled") )
+{
+}
BOOL LLToolPie::handleAnyMouseClick(S32 x, S32 y, MASK mask, EClickType clicktype, BOOL down)
{
@@ -97,12 +101,17 @@ BOOL LLToolPie::handleAnyMouseClick(S32 x, S32 y, MASK mask, EClickType clicktyp
BOOL LLToolPie::handleMouseDown(S32 x, S32 y, MASK mask)
{
+ mMouseOutsideSlop = FALSE;
+ mMouseDownX = x;
+ mMouseDownY = y;
+
//left mouse down always picks transparent
mPick = gViewerWindow->pickImmediate(x, y, TRUE);
mPick.mKeyMask = mask;
- mGrabMouseButtonDown = TRUE;
+
+ mMouseButtonDown = true;
- pickLeftMouseDownCallback();
+ handleLeftClickPick();
return TRUE;
}
@@ -117,7 +126,7 @@ BOOL LLToolPie::handleRightMouseDown(S32 x, S32 y, MASK mask)
// claim not handled so UI focus stays same
- pickRightMouseDownCallback();
+ handleRightClickPick();
return FALSE;
}
@@ -134,7 +143,7 @@ BOOL LLToolPie::handleScrollWheel(S32 x, S32 y, S32 clicks)
}
// True if you selected an object.
-BOOL LLToolPie::pickLeftMouseDownCallback()
+BOOL LLToolPie::handleLeftClickPick()
{
S32 x = mPick.mMousePt.mX;
S32 y = mPick.mMousePt.mY;
@@ -211,12 +220,28 @@ BOOL LLToolPie::pickLeftMouseDownCallback()
} // else nothing (fall through to touch)
}
case CLICK_ACTION_PAY:
- if ((object && object->flagTakesMoney())
- || (parent && parent->flagTakesMoney()))
+ if ( mClickActionPayEnabled )
{
- // pay event goes to object actually clicked on
- mClickActionObject = object;
- mLeftClickSelection = LLToolSelect::handleObjectSelection(mPick, FALSE, TRUE);
+ if ((object && object->flagTakesMoney())
+ || (parent && parent->flagTakesMoney()))
+ {
+ // pay event goes to object actually clicked on
+ mClickActionObject = object;
+ mLeftClickSelection = LLToolSelect::handleObjectSelection(mPick, FALSE, TRUE);
+ if (LLSelectMgr::getInstance()->selectGetAllValid())
+ {
+ // call this right away, since we have all the info we need to continue the action
+ selectionPropertiesReceived();
+ }
+ return TRUE;
+ }
+ }
+ break;
+ case CLICK_ACTION_BUY:
+ if ( mClickActionBuyEnabled )
+ {
+ mClickActionObject = parent;
+ mLeftClickSelection = LLToolSelect::handleObjectSelection(mPick, FALSE, TRUE, TRUE);
if (LLSelectMgr::getInstance()->selectGetAllValid())
{
// call this right away, since we have all the info we need to continue the action
@@ -225,15 +250,6 @@ BOOL LLToolPie::pickLeftMouseDownCallback()
return TRUE;
}
break;
- case CLICK_ACTION_BUY:
- mClickActionObject = parent;
- mLeftClickSelection = LLToolSelect::handleObjectSelection(mPick, FALSE, TRUE, TRUE);
- if (LLSelectMgr::getInstance()->selectGetAllValid())
- {
- // call this right away, since we have all the info we need to continue the action
- selectionPropertiesReceived();
- }
- return TRUE;
case CLICK_ACTION_OPEN:
if (parent && parent->allowOpen())
{
@@ -283,7 +299,12 @@ BOOL LLToolPie::pickLeftMouseDownCallback()
}
// put focus back "in world"
- gFocusMgr.setKeyboardFocus(NULL);
+ if (gFocusMgr.getKeyboardFocus())
+ {
+ // don't click to walk on attempt to give focus to world
+ mBlockClickToWalk = true;
+ gFocusMgr.setKeyboardFocus(NULL);
+ }
BOOL touchable = (object && object->flagHandleTouch())
|| (parent && parent->flagHandleTouch());
@@ -295,6 +316,7 @@ BOOL LLToolPie::pickLeftMouseDownCallback()
)
{
gGrabTransientTool = this;
+ mMouseButtonDown = false;
LLToolMgr::getInstance()->getCurrentToolset()->selectTool( LLToolGrab::getInstance() );
return LLToolGrab::getInstance()->handleObjectHit( mPick );
}
@@ -310,9 +332,9 @@ BOOL LLToolPie::pickLeftMouseDownCallback()
if (!gSavedSettings.getBOOL("LeftClickShowMenu"))
{
// mouse already released
- if (!mGrabMouseButtonDown)
+ if (!mMouseButtonDown)
{
- return TRUE;
+ return true;
}
while( object && object->isAttachment() && !object->flagHandleTouch())
@@ -324,9 +346,10 @@ BOOL LLToolPie::pickLeftMouseDownCallback()
}
object = (LLViewerObject*)object->getParent();
}
- if (object && object == gAgentAvatarp)
+ if (object && object == gAgentAvatarp && !gSavedSettings.getBOOL("ClickToWalk"))
{
// we left clicked on avatar, switch to focus mode
+ mMouseButtonDown = false;
LLToolMgr::getInstance()->setTransientTool(LLToolCamera::getInstance());
gViewerWindow->hideCursor();
LLToolCamera::getInstance()->setMouseCapture(TRUE);
@@ -393,7 +416,7 @@ U8 final_click_action(LLViewerObject* obj)
return click_action;
}
-ECursorType cursor_from_object(LLViewerObject* object)
+ECursorType LLToolPie::cursorFromObject(LLViewerObject* object)
{
LLViewerObject* parent = NULL;
if (object)
@@ -413,7 +436,10 @@ ECursorType cursor_from_object(LLViewerObject* object)
}
break;
case CLICK_ACTION_BUY:
- cursor = UI_CURSOR_TOOLBUY;
+ if ( mClickActionBuyEnabled )
+ {
+ cursor = UI_CURSOR_TOOLBUY;
+ }
break;
case CLICK_ACTION_OPEN:
// Open always opens the parent.
@@ -423,10 +449,13 @@ ECursorType cursor_from_object(LLViewerObject* object)
}
break;
case CLICK_ACTION_PAY:
- if ((object && object->flagTakesMoney())
- || (parent && parent->flagTakesMoney()))
+ if ( mClickActionPayEnabled )
{
- cursor = UI_CURSOR_TOOLBUY;
+ if ((object && object->flagTakesMoney())
+ || (parent && parent->flagTakesMoney()))
+ {
+ cursor = UI_CURSOR_TOOLBUY;
+ }
}
break;
case CLICK_ACTION_ZOOM:
@@ -449,6 +478,18 @@ void LLToolPie::resetSelection()
mClickAction = 0;
}
+void LLToolPie::walkToClickedLocation()
+{
+ if(mAutoPilotDestination) { mAutoPilotDestination->markDead(); }
+ mAutoPilotDestination = (LLHUDEffectBlob *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BLOB, FALSE);
+ mAutoPilotDestination->setPositionGlobal(mPick.mPosGlobal);
+ mAutoPilotDestination->setPixelSize(5);
+ mAutoPilotDestination->setColor(LLColor4U(170, 210, 190));
+ mAutoPilotDestination->setDuration(3.f);
+
+ handle_go_to();
+}
+
// When we get object properties after left-clicking on an object
// with left-click = buy, if it's the same object, do the buy.
@@ -474,10 +515,16 @@ void LLToolPie::selectionPropertiesReceived()
switch (click_action)
{
case CLICK_ACTION_BUY:
- handle_buy();
+ if ( LLToolPie::getInstance()->mClickActionBuyEnabled )
+ {
+ handle_buy();
+ }
break;
case CLICK_ACTION_PAY:
- handle_give_money_dialog();
+ if ( LLToolPie::getInstance()->mClickActionPayEnabled )
+ {
+ handle_give_money_dialog();
+ }
break;
case CLICK_ACTION_OPEN:
LLFloaterReg::showInstance("openobject");
@@ -493,20 +540,16 @@ void LLToolPie::selectionPropertiesReceived()
BOOL LLToolPie::handleHover(S32 x, S32 y, MASK mask)
{
mHoverPick = gViewerWindow->pickImmediate(x, y, FALSE);
- // perform a separate pick that detects transparent objects since they respond to 1-click actions
- LLPickInfo click_action_pick = gViewerWindow->pickImmediate(x, y, TRUE);
-
- // Show screen-space highlight glow effect
- bool show_highlight = false;
LLViewerObject *parent = NULL;
LLViewerObject *object = mHoverPick.getObject();
-
if (object)
{
parent = object->getRootEdit();
}
- LLViewerObject* click_action_object = click_action_pick.getObject();
+ // Show screen-space highlight glow effect
+ bool show_highlight = false;
+
if (handleMediaHover(mHoverPick))
{
// *NOTE: If you think the hover glow conflicts with the media outline, you
@@ -515,39 +558,70 @@ BOOL LLToolPie::handleHover(S32 x, S32 y, MASK mask)
// cursor set by media object
lldebugst(LLERR_USER_INPUT) << "hover handled by LLToolPie (inactive)" << llendl;
}
- else if (click_action_object && useClickAction(mask, click_action_object, click_action_object->getRootEdit()))
+ else if (!mMouseOutsideSlop
+ && mMouseButtonDown
+ && gSavedSettings.getBOOL("ClickToWalk"))
{
- show_highlight = true;
- ECursorType cursor = cursor_from_object(click_action_object);
- gViewerWindow->setCursor(cursor);
- lldebugst(LLERR_USER_INPUT) << "hover handled by LLToolPie (inactive)" << llendl;
+ S32 delta_x = x - mMouseDownX;
+ S32 delta_y = y - mMouseDownY;
+ S32 threshold = gSavedSettings.getS32("DragAndDropDistanceThreshold");
+ if (delta_x * delta_x + delta_y * delta_y > threshold * threshold)
+ {
+ startCameraSteering();
+ steerCameraWithMouse(x, y);
+ gViewerWindow->setCursor(UI_CURSOR_TOOLGRAB);
+ }
+ else
+ {
+ gViewerWindow->setCursor(UI_CURSOR_ARROW);
+ }
}
-
- else if ((object && !object->isAvatar() && object->usePhysics())
- || (parent && !parent->isAvatar() && parent->usePhysics()))
+ else if (inCameraSteerMode())
{
- show_highlight = true;
+ steerCameraWithMouse(x, y);
gViewerWindow->setCursor(UI_CURSOR_TOOLGRAB);
- lldebugst(LLERR_USER_INPUT) << "hover handled by LLToolPie (inactive)" << llendl;
- }
- else if ( (object && object->flagHandleTouch())
- || (parent && parent->flagHandleTouch()))
- {
- show_highlight = true;
- gViewerWindow->setCursor(UI_CURSOR_HAND);
- lldebugst(LLERR_USER_INPUT) << "hover handled by LLToolPie (inactive)" << llendl;
}
else
{
- gViewerWindow->setCursor(UI_CURSOR_ARROW);
- lldebugst(LLERR_USER_INPUT) << "hover handled by LLToolPie (inactive)" << llendl;
+ // perform a separate pick that detects transparent objects since they respond to 1-click actions
+ LLPickInfo click_action_pick = gViewerWindow->pickImmediate(x, y, TRUE);
+
+ LLViewerObject* click_action_object = click_action_pick.getObject();
- if(!object)
+ if (click_action_object && useClickAction(mask, click_action_object, click_action_object->getRootEdit()))
+ {
+ show_highlight = true;
+ ECursorType cursor = cursorFromObject(click_action_object);
+ gViewerWindow->setCursor(cursor);
+ lldebugst(LLERR_USER_INPUT) << "hover handled by LLToolPie (inactive)" << llendl;
+ }
+
+ else if ((object && !object->isAvatar() && object->usePhysics())
+ || (parent && !parent->isAvatar() && parent->usePhysics()))
{
- LLViewerMediaFocus::getInstance()->clearHover();
+ show_highlight = true;
+ gViewerWindow->setCursor(UI_CURSOR_TOOLGRAB);
+ lldebugst(LLERR_USER_INPUT) << "hover handled by LLToolPie (inactive)" << llendl;
+ }
+ else if ( (object && object->flagHandleTouch())
+ || (parent && parent->flagHandleTouch()))
+ {
+ show_highlight = true;
+ gViewerWindow->setCursor(UI_CURSOR_HAND);
+ lldebugst(LLERR_USER_INPUT) << "hover handled by LLToolPie (inactive)" << llendl;
+ }
+ else
+ {
+ gViewerWindow->setCursor(UI_CURSOR_ARROW);
+ lldebugst(LLERR_USER_INPUT) << "hover handled by LLToolPie (inactive)" << llendl;
}
}
+ if(!object)
+ {
+ LLViewerMediaFocus::getInstance()->clearHover();
+ }
+
static LLCachedControl<bool> enable_highlight(
gSavedSettings, "RenderHoverGlowEnable", false);
LLDrawable* drawable = NULL;
@@ -563,40 +637,69 @@ BOOL LLToolPie::handleHover(S32 x, S32 y, MASK mask)
BOOL LLToolPie::handleMouseUp(S32 x, S32 y, MASK mask)
{
LLViewerObject* obj = mPick.getObject();
-
- handleMediaMouseUp();
-
U8 click_action = final_click_action(obj);
- if (click_action != CLICK_ACTION_NONE)
+
+ // let media have first pass at click
+ if (handleMediaMouseUp() || LLViewerMediaFocus::getInstance()->getFocus())
+ {
+ mBlockClickToWalk = true;
+ }
+ stopCameraSteering();
+ mMouseButtonDown = false;
+
+ if (click_action == CLICK_ACTION_NONE // not doing 1-click action
+ && gSavedSettings.getBOOL("ClickToWalk") // click to walk enabled
+ && !gAgent.getFlying() // don't auto-navigate while flying until that works
+ && gAgentAvatarp
+ && !gAgentAvatarp->isSitting()
+ && !mBlockClickToWalk // another behavior hasn't cancelled click to walk
+ && !mPick.mPosGlobal.isExactlyZero() // valid coordinates for pick
+ && (mPick.mPickType == LLPickInfo::PICK_LAND // we clicked on land
+ || mPick.mObjectID.notNull())) // or on an object
{
- switch(click_action)
+ // handle special cases of steering picks
+ LLViewerObject* avatar_object = mPick.getObject();
+
+ // get pointer to avatar
+ while (avatar_object && !avatar_object->isAvatar())
{
- case CLICK_ACTION_BUY:
- case CLICK_ACTION_PAY:
- case CLICK_ACTION_OPEN:
- case CLICK_ACTION_ZOOM:
- case CLICK_ACTION_PLAY:
- case CLICK_ACTION_OPEN_MEDIA:
- // Because these actions open UI dialogs, we won't change
- // the cursor again until the next hover and GL pick over
- // the world. Keep the cursor an arrow, assuming that
- // after the user moves off the UI, they won't be on the
- // same object anymore.
- gViewerWindow->setCursor(UI_CURSOR_ARROW);
- // Make sure the hover-picked object is ignored.
- //gToolTipView->resetLastHoverObject();
- break;
- default:
- break;
+ avatar_object = (LLViewerObject*)avatar_object->getParent();
+ }
+
+ if (avatar_object && ((LLVOAvatar*)avatar_object)->isSelf())
+ {
+ const F64 SELF_CLICK_WALK_DISTANCE = 3.0;
+ // pretend we picked some point a bit in front of avatar
+ mPick.mPosGlobal = gAgent.getPositionGlobal() + LLVector3d(LLViewerCamera::instance().getAtAxis()) * SELF_CLICK_WALK_DISTANCE;
}
+ gAgentCamera.setFocusOnAvatar(TRUE, TRUE);
+ walkToClickedLocation();
+ LLFirstUse::notMoving(false);
+
+ return TRUE;
+ }
+ gViewerWindow->setCursor(UI_CURSOR_ARROW);
+ if (hasMouseCapture())
+ {
+ setMouseCapture(FALSE);
}
- mGrabMouseButtonDown = FALSE;
LLToolMgr::getInstance()->clearTransientTool();
gAgentCamera.setLookAt(LOOKAT_TARGET_CONVERSATION, obj); // maybe look at object/person clicked on
+
+ mBlockClickToWalk = false;
return LLTool::handleMouseUp(x, y, mask);
}
+void LLToolPie::stopClickToWalk()
+{
+ mPick.mPosGlobal = gAgent.getPositionGlobal();
+ handle_go_to();
+ if(mAutoPilotDestination)
+ {
+ mAutoPilotDestination->markDead();
+ }
+}
BOOL LLToolPie::handleDoubleClick(S32 x, S32 y, MASK mask)
{
@@ -607,16 +710,10 @@ BOOL LLToolPie::handleDoubleClick(S32 x, S32 y, MASK mask)
if (gSavedSettings.getBOOL("DoubleClickAutoPilot"))
{
- if (mPick.mPickType == LLPickInfo::PICK_LAND
- && !mPick.mPosGlobal.isExactlyZero())
- {
- handle_go_to();
- return TRUE;
- }
- else if (mPick.mObjectID.notNull()
- && !mPick.mPosGlobal.isExactlyZero())
+ if ((mPick.mPickType == LLPickInfo::PICK_LAND && !mPick.mPosGlobal.isExactlyZero()) ||
+ (mPick.mObjectID.notNull() && !mPick.mPosGlobal.isExactlyZero()))
{
- handle_go_to();
+ walkToClickedLocation();
return TRUE;
}
}
@@ -913,7 +1010,7 @@ BOOL LLToolPie::handleTooltipObject( LLViewerObject* hover_object, std::string l
p.click_callback(boost::bind(showAvatarInspector, hover_object->getID()));
p.visible_time_near(6.f);
p.visible_time_far(3.f);
- p.delay_time(0.35f);
+ p.delay_time(gSavedSettings.getF32("AvatarInspectorTooltipDelay"));
p.wrap(false);
LLToolTipMgr::instance().show(p);
@@ -1031,7 +1128,7 @@ BOOL LLToolPie::handleTooltipObject( LLViewerObject* hover_object, std::string l
p.click_homepage_callback(boost::bind(VisitHomePage, mHoverPick));
p.visible_time_near(6.f);
p.visible_time_far(3.f);
- p.delay_time(0.35f);
+ p.delay_time(gSavedSettings.getF32("ObjectInspectorTooltipDelay"));
p.wrap(false);
LLToolTipMgr::instance().show(p);
@@ -1214,6 +1311,11 @@ void LLToolPie::VisitHomePage(const LLPickInfo& info)
}
}
+void LLToolPie::handleSelect()
+{
+ // tool is reselected when app gets focus, etc.
+ mBlockClickToWalk = true;
+}
void LLToolPie::handleDeselect()
{
@@ -1228,15 +1330,17 @@ void LLToolPie::handleDeselect()
LLTool* LLToolPie::getOverrideTool(MASK mask)
{
- if (mask == MASK_CONTROL)
- {
- return LLToolGrab::getInstance();
- }
- else if (mask == (MASK_CONTROL | MASK_SHIFT))
+ if (gSavedSettings.getBOOL("EnableGrab"))
{
- return LLToolGrab::getInstance();
+ if (mask == MASK_CONTROL)
+ {
+ return LLToolGrab::getInstance();
+ }
+ else if (mask == (MASK_CONTROL | MASK_SHIFT))
+ {
+ return LLToolGrab::getInstance();
+ }
}
-
return LLTool::getOverrideTool(mask);
}
@@ -1250,10 +1354,20 @@ void LLToolPie::stopEditing()
void LLToolPie::onMouseCaptureLost()
{
- mMouseOutsideSlop = FALSE;
+ stopCameraSteering();
+ mMouseButtonDown = false;
handleMediaMouseUp();
}
+void LLToolPie::stopCameraSteering()
+{
+ mMouseOutsideSlop = false;
+}
+
+bool LLToolPie::inCameraSteerMode()
+{
+ return mMouseButtonDown && mMouseOutsideSlop && gSavedSettings.getBOOL("ClickToWalk");
+}
// true if x,y outside small box around start_x,start_y
BOOL LLToolPie::outsideSlop(S32 x, S32 y, S32 start_x, S32 start_y)
@@ -1331,6 +1445,7 @@ bool LLToolPie::handleMediaClick(const LLPickInfo& pick)
{
// Make sure keyboard focus is set to the media focus object.
gFocusMgr.setKeyboardFocus(LLViewerMediaFocus::getInstance());
+ LLEditMenuHandler::gEditMenuHandler = LLViewerMediaFocus::instance().getFocusedMediaImpl();
media_impl->mouseDown(pick.mUVCoords, gKeyboard->currentMask(TRUE));
mMediaMouseCaptureID = mep->getMediaID();
@@ -1419,8 +1534,6 @@ bool LLToolPie::handleMediaMouseUp()
mMediaMouseCaptureID.setNull();
- setMouseCapture(FALSE);
-
result = true;
}
@@ -1483,7 +1596,7 @@ static ECursorType cursor_from_parcel_media(U8 click_action)
// True if we handled the event.
-BOOL LLToolPie::pickRightMouseDownCallback()
+BOOL LLToolPie::handleRightClickPick()
{
S32 x = mPick.mMousePt.mX;
S32 y = mPick.mMousePt.mY;
@@ -1605,10 +1718,173 @@ BOOL LLToolPie::pickRightMouseDownCallback()
void LLToolPie::showVisualContextMenuEffect()
{
- // VEFFECT: ShowPie
- LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_SPHERE, TRUE);
- effectp->setPositionGlobal(mPick.mPosGlobal);
- effectp->setColor(LLColor4U(gAgent.getEffectColor()));
- effectp->setDuration(0.25f);
+ // VEFFECT: ShowPie
+ LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_SPHERE, TRUE);
+ effectp->setPositionGlobal(mPick.mPosGlobal);
+ effectp->setColor(LLColor4U(gAgent.getEffectColor()));
+ effectp->setDuration(0.25f);
+}
+
+typedef enum e_near_far
+{
+ NEAR_INTERSECTION,
+ FAR_INTERSECTION
+} ENearFar;
+
+bool intersect_ray_with_sphere( const LLVector3& ray_pt, const LLVector3& ray_dir, const LLVector3& sphere_center, F32 sphere_radius, e_near_far near_far, LLVector3& intersection_pt)
+{
+ // do ray/sphere intersection by solving quadratic equation
+ LLVector3 sphere_to_ray_start_vec = ray_pt - sphere_center;
+ F32 B = 2.f * ray_dir * sphere_to_ray_start_vec;
+ F32 C = sphere_to_ray_start_vec.lengthSquared() - (sphere_radius * sphere_radius);
+
+ F32 discriminant = B*B - 4.f*C;
+ if (discriminant >= 0.f)
+ { // intersection detected, now find closest one
+ F32 t0 = (-B - sqrtf(discriminant)) / 2.f;
+
+ if (t0 > 0.f && near_far == NEAR_INTERSECTION)
+ {
+ intersection_pt = ray_pt + ray_dir * t0;
+ }
+ else
+ {
+ F32 t1 = (-B + sqrtf(discriminant)) / 2.f;
+ intersection_pt = ray_pt + ray_dir * t1;
+ }
+ return true;
+ }
+ else
+ { // no intersection
+ return false;
+ }
+}
+
+void LLToolPie::startCameraSteering()
+{
+ LLFirstUse::notMoving(false);
+ mMouseOutsideSlop = true;
+ mBlockClickToWalk = true;
+
+ if (gAgentCamera.getFocusOnAvatar())
+ {
+ mSteerPick = mPick;
+
+ // handle special cases of steering picks
+ LLViewerObject* avatar_object = mSteerPick.getObject();
+
+ // get pointer to avatar
+ while (avatar_object && !avatar_object->isAvatar())
+ {
+ avatar_object = (LLViewerObject*)avatar_object->getParent();
+ }
+
+ // if clicking on own avatar...
+ if (avatar_object && ((LLVOAvatar*)avatar_object)->isSelf())
+ {
+ // ...project pick point a few meters in front of avatar
+ mSteerPick.mPosGlobal = gAgent.getPositionGlobal() + LLVector3d(LLViewerCamera::instance().getAtAxis()) * 3.0;
+ }
+
+ if (!mSteerPick.isValid())
+ {
+ mSteerPick.mPosGlobal = gAgent.getPosGlobalFromAgent(
+ LLViewerCamera::instance().getOrigin() + gViewerWindow->mouseDirectionGlobal(mSteerPick.mMousePt.mX, mSteerPick.mMousePt.mY) * 100.f);
+ }
+
+ setMouseCapture(TRUE);
+
+ mMouseSteerX = mMouseDownX;
+ mMouseSteerY = mMouseDownY;
+ const LLVector3 camera_to_rotation_center = gAgent.getFrameAgent().getOrigin() - LLViewerCamera::instance().getOrigin();
+ const LLVector3 rotation_center_to_pick = gAgent.getPosAgentFromGlobal(mSteerPick.mPosGlobal) - gAgent.getFrameAgent().getOrigin();
+
+ mClockwise = camera_to_rotation_center * rotation_center_to_pick < 0.f;
+ if (mMouseSteerGrabPoint) { mMouseSteerGrabPoint->markDead(); }
+ mMouseSteerGrabPoint = (LLHUDEffectBlob *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BLOB, FALSE);
+ mMouseSteerGrabPoint->setPositionGlobal(mSteerPick.mPosGlobal);
+ mMouseSteerGrabPoint->setColor(LLColor4U(170, 210, 190));
+ mMouseSteerGrabPoint->setPixelSize(5);
+ mMouseSteerGrabPoint->setDuration(2.f);
+ }
+}
+
+void LLToolPie::steerCameraWithMouse(S32 x, S32 y)
+{
+ const LLViewerCamera& camera = LLViewerCamera::instance();
+ const LLCoordFrame& rotation_frame = gAgent.getFrameAgent();
+ const LLVector3 pick_pos = gAgent.getPosAgentFromGlobal(mSteerPick.mPosGlobal);
+ const LLVector3 pick_rotation_center = rotation_frame.getOrigin() + parallel_component(pick_pos - rotation_frame.getOrigin(), rotation_frame.getUpAxis());
+ const F32 MIN_ROTATION_RADIUS_FRACTION = 0.2f;
+ const F32 min_rotation_radius = MIN_ROTATION_RADIUS_FRACTION * dist_vec(pick_rotation_center, camera.getOrigin());;
+ const F32 pick_distance_from_rotation_center = llclamp(dist_vec(pick_pos, pick_rotation_center), min_rotation_radius, F32_MAX);
+ const LLVector3 camera_to_rotation_center = pick_rotation_center - camera.getOrigin();
+ const LLVector3 adjusted_camera_pos = LLViewerCamera::instance().getOrigin() + projected_vec(camera_to_rotation_center, rotation_frame.getUpAxis());
+ const F32 camera_distance_from_rotation_center = dist_vec(adjusted_camera_pos, pick_rotation_center);
+
+ LLVector3 mouse_ray = orthogonal_component(gViewerWindow->mouseDirectionGlobal(x, y), rotation_frame.getUpAxis());
+ mouse_ray.normalize();
+
+ LLVector3 old_mouse_ray = orthogonal_component(gViewerWindow->mouseDirectionGlobal(mMouseSteerX, mMouseSteerY), rotation_frame.getUpAxis());
+ old_mouse_ray.normalize();
+
+ F32 yaw_angle;
+ F32 old_yaw_angle;
+ LLVector3 mouse_on_sphere;
+ LLVector3 old_mouse_on_sphere;
+
+ if (intersect_ray_with_sphere(
+ adjusted_camera_pos,
+ mouse_ray,
+ pick_rotation_center,
+ pick_distance_from_rotation_center,
+ FAR_INTERSECTION,
+ mouse_on_sphere))
+ {
+ LLVector3 mouse_sphere_offset = mouse_on_sphere - pick_rotation_center;
+ yaw_angle = atan2f(mouse_sphere_offset * rotation_frame.getLeftAxis(), mouse_sphere_offset * rotation_frame.getAtAxis());
+ }
+ else
+ {
+ yaw_angle = F_PI_BY_TWO + asinf(pick_distance_from_rotation_center / camera_distance_from_rotation_center);
+ if (mouse_ray * rotation_frame.getLeftAxis() < 0.f)
+ {
+ yaw_angle *= -1.f;
+ }
+ }
+
+ if (intersect_ray_with_sphere(
+ adjusted_camera_pos,
+ old_mouse_ray,
+ pick_rotation_center,
+ pick_distance_from_rotation_center,
+ FAR_INTERSECTION,
+ old_mouse_on_sphere))
+ {
+ LLVector3 mouse_sphere_offset = old_mouse_on_sphere - pick_rotation_center;
+ old_yaw_angle = atan2f(mouse_sphere_offset * rotation_frame.getLeftAxis(), mouse_sphere_offset * rotation_frame.getAtAxis());
+ }
+ else
+ {
+ old_yaw_angle = F_PI_BY_TWO + asinf(pick_distance_from_rotation_center / camera_distance_from_rotation_center);
+
+ if (mouse_ray * rotation_frame.getLeftAxis() < 0.f)
+ {
+ old_yaw_angle *= -1.f;
+ }
+ }
+
+ const F32 delta_angle = yaw_angle - old_yaw_angle;
+
+ if (mClockwise)
+ {
+ gAgent.yaw(delta_angle);
+ }
+ else
+ {
+ gAgent.yaw(-delta_angle);
+ }
+ mMouseSteerX = x;
+ mMouseSteerY = y;
}
diff --git a/indra/newview/lltoolpie.h b/indra/newview/lltoolpie.h
index 65cb3e36a7..68fe8bc4a5 100644
--- a/indra/newview/lltoolpie.h
+++ b/indra/newview/lltoolpie.h
@@ -30,6 +30,7 @@
#include "lltool.h"
#include "lluuid.h"
#include "llviewerwindow.h" // for LLPickInfo
+#include "llhudeffectblob.h" // for LLPointer<LLHudEffectBlob>, apparently
class LLViewerObject;
class LLObjectSelection;
@@ -56,6 +57,7 @@ public:
virtual void stopEditing();
virtual void onMouseCaptureLost();
+ virtual void handleSelect();
virtual void handleDeselect();
virtual LLTool* getOverrideTool(MASK mask);
@@ -64,6 +66,9 @@ public:
LLViewerObject* getClickActionObject() { return mClickActionObject; }
LLObjectSelection* getLeftClickSelection() { return (LLObjectSelection*)mLeftClickSelection; }
void resetSelection();
+ void walkToClickedLocation();
+ void blockClickToWalk() { mBlockClickToWalk = true; }
+ void stopClickToWalk();
static void selectionPropertiesReceived();
@@ -75,11 +80,12 @@ public:
private:
BOOL outsideSlop (S32 x, S32 y, S32 start_x, S32 start_y);
- BOOL pickLeftMouseDownCallback();
- BOOL pickRightMouseDownCallback();
+ BOOL handleLeftClickPick();
+ BOOL handleRightClickPick();
BOOL useClickAction (MASK mask, LLViewerObject* object,LLViewerObject* parent);
void showVisualContextMenuEffect();
+ ECursorType cursorFromObject(LLViewerObject* object);
bool handleMediaClick(const LLPickInfo& info);
bool handleMediaHover(const LLPickInfo& info);
@@ -87,17 +93,31 @@ private:
BOOL handleTooltipLand(std::string line, std::string tooltip_msg);
BOOL handleTooltipObject( LLViewerObject* hover_object, std::string line, std::string tooltip_msg);
+ void steerCameraWithMouse(S32 x, S32 y);
+ void startCameraSteering();
+ void stopCameraSteering();
+ bool inCameraSteerMode();
+
private:
- BOOL mGrabMouseButtonDown;
- BOOL mMouseOutsideSlop; // for this drag, has mouse moved outside slop region
+ bool mMouseButtonDown;
+ bool mMouseOutsideSlop; // for this drag, has mouse moved outside slop region
+ S32 mMouseDownX;
+ S32 mMouseDownY;
+ S32 mMouseSteerX;
+ S32 mMouseSteerY;
+ LLPointer<LLHUDEffectBlob> mAutoPilotDestination;
+ LLPointer<LLHUDEffectBlob> mMouseSteerGrabPoint;
+ bool mClockwise;
+ bool mBlockClickToWalk;
LLUUID mMediaMouseCaptureID;
LLPickInfo mPick;
LLPickInfo mHoverPick;
+ LLPickInfo mSteerPick;
LLPointer<LLViewerObject> mClickActionObject;
U8 mClickAction;
LLSafeHandle<LLObjectSelection> mLeftClickSelection;
-
+ BOOL mClickActionBuyEnabled;
+ BOOL mClickActionPayEnabled;
};
-
#endif
diff --git a/indra/newview/lltracker.cpp b/indra/newview/lltracker.cpp
index c3dd17def9..bf1f8808a7 100644
--- a/indra/newview/lltracker.cpp
+++ b/indra/newview/lltracker.cpp
@@ -53,10 +53,12 @@
#include "llinventorymodel.h"
#include "llinventoryobserver.h"
#include "lllandmarklist.h"
+#include "llprogressview.h"
#include "llsky.h"
#include "llui.h"
#include "llviewercamera.h"
#include "llviewerinventory.h"
+#include "llviewerwindow.h"
#include "llworld.h"
#include "llworldmapview.h"
#include "llviewercontrol.h"
@@ -109,6 +111,10 @@ void LLTracker::stopTracking(void* userdata)
// static virtual
void LLTracker::drawHUDArrow()
{
+ if (!gSavedSettings.getBOOL("RenderTrackerBeacon")) return;
+
+ if (gViewerWindow->getProgressView()->getVisible()) return;
+
static LLUIColor map_track_color = LLUIColorTable::instance().getColor("MapTrackColor", LLColor4::white);
/* tracking autopilot destination has been disabled
@@ -155,7 +161,7 @@ void LLTracker::drawHUDArrow()
// static
void LLTracker::render3D()
{
- if (!gFloaterWorldMap)
+ if (!gFloaterWorldMap || !gSavedSettings.getBOOL("RenderTrackerBeacon"))
{
return;
}
@@ -503,9 +509,10 @@ void LLTracker::renderBeacon(LLVector3d pos_global,
LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE);
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
- glTranslatef(pos_agent.mV[0], pos_agent.mV[1], pos_agent.mV[2]);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.pushMatrix();
+ {
+ gGL.translatef(pos_agent.mV[0], pos_agent.mV[1], pos_agent.mV[2]);
draw_shockwave(1024.f, gRenderStartTime.getElapsedTimeF32(), 32, fogged_color);
@@ -557,9 +564,8 @@ void LLTracker::renderBeacon(LLVector3d pos_global,
gGL.end();
}
-
- //gCylinder.render(1000);
- glPopMatrix();
+ }
+ gGL.popMatrix();
std::string text;
text = llformat( "%.0f m", to_vec.magVec());
diff --git a/indra/newview/lltracker.h b/indra/newview/lltracker.h
index c0c154abe8..8e916af315 100644
--- a/indra/newview/lltracker.h
+++ b/indra/newview/lltracker.h
@@ -75,7 +75,7 @@ public:
// these are static so that they can be used a callbacks
static ETrackingStatus getTrackingStatus() { return instance()->mTrackingStatus; }
static ETrackingLocationType getTrackedLocationType() { return instance()->mTrackingLocationType; }
- static BOOL isTracking(void*) { return (BOOL) instance()->mTrackingStatus; }
+ static BOOL isTracking(void*) { return instance()->mTrackingStatus != TRACKING_NOTHING; }
static void stopTracking(void*);
static void clearFocus();
diff --git a/indra/newview/lltransientfloatermgr.cpp b/indra/newview/lltransientfloatermgr.cpp
index 6deab96b45..3d68c10489 100644
--- a/indra/newview/lltransientfloatermgr.cpp
+++ b/indra/newview/lltransientfloatermgr.cpp
@@ -38,13 +38,13 @@ LLTransientFloaterMgr::LLTransientFloaterMgr()
{
if(gViewerWindow)
{
- gViewerWindow->getRootView()->addMouseDownCallback(boost::bind(
- &LLTransientFloaterMgr::leftMouseClickCallback, this, _1, _2, _3));
+ gViewerWindow->getRootView()->getChild<LLUICtrl>("popup_holder")->setMouseDownCallback(boost::bind(
+ &LLTransientFloaterMgr::leftMouseClickCallback, this, _2, _3, _4));
}
- mGroupControls.insert(std::pair<ETransientGroup, std::set<LLView*> >(GLOBAL, std::set<LLView*>()));
- mGroupControls.insert(std::pair<ETransientGroup, std::set<LLView*> >(DOCKED, std::set<LLView*>()));
- mGroupControls.insert(std::pair<ETransientGroup, std::set<LLView*> >(IM, std::set<LLView*>()));
+ mGroupControls.insert(std::pair<ETransientGroup, controls_set_t >(GLOBAL, controls_set_t()));
+ mGroupControls.insert(std::pair<ETransientGroup, controls_set_t >(DOCKED, controls_set_t()));
+ mGroupControls.insert(std::pair<ETransientGroup, controls_set_t >(IM, controls_set_t()));
}
void LLTransientFloaterMgr::registerTransientFloater(LLTransientFloater* floater)
@@ -59,12 +59,16 @@ void LLTransientFloaterMgr::unregisterTransientFloater(LLTransientFloater* float
void LLTransientFloaterMgr::addControlView(ETransientGroup group, LLView* view)
{
- mGroupControls.find(group)->second.insert(view);
+ if (!view) return;
+
+ mGroupControls.find(group)->second.insert(view->getHandle());
}
void LLTransientFloaterMgr::removeControlView(ETransientGroup group, LLView* view)
{
- mGroupControls.find(group)->second.erase(view);
+ if (!view) return;
+
+ mGroupControls.find(group)->second.erase(view->getHandle());
}
void LLTransientFloaterMgr::addControlView(LLView* view)
@@ -89,7 +93,7 @@ void LLTransientFloaterMgr::hideTransientFloaters(S32 x, S32 y)
{
ETransientGroup group = floater->getGroup();
- bool hide = isControlClicked(mGroupControls.find(group)->second, x, y);
+ bool hide = isControlClicked(group, mGroupControls.find(group)->second, x, y);
if (hide)
{
floater->setTransientVisible(FALSE);
@@ -98,13 +102,25 @@ void LLTransientFloaterMgr::hideTransientFloaters(S32 x, S32 y)
}
}
-bool LLTransientFloaterMgr::isControlClicked(std::set<LLView*>& set, S32 x, S32 y)
+bool LLTransientFloaterMgr::isControlClicked(ETransientGroup group, controls_set_t& set, S32 x, S32 y)
{
+ std::list< LLHandle<LLView> > dead_handles;
+
bool res = true;
for (controls_set_t::iterator it = set.begin(); it
!= set.end(); it++)
{
- LLView* control_view = *it;
+ LLView* control_view = NULL;
+
+ LLHandle<LLView> handle = *it;
+ if (handle.isDead())
+ {
+ dead_handles.push_back(handle);
+ continue;
+ }
+
+ control_view = handle.get();
+
if (!control_view->getVisible())
{
continue;
@@ -118,6 +134,13 @@ bool LLTransientFloaterMgr::isControlClicked(std::set<LLView*>& set, S32 x, S32
break;
}
}
+
+ for (std::list< LLHandle<LLView> >::iterator it = dead_handles.begin(); it != dead_handles.end(); ++it)
+ {
+ LLHandle<LLView> handle = *it;
+ mGroupControls.find(group)->second.erase(handle);
+ }
+
return res;
}
@@ -130,8 +153,8 @@ void LLTransientFloaterMgr::leftMouseClickCallback(S32 x, S32 y,
return;
}
- bool hide = isControlClicked(mGroupControls.find(DOCKED)->second, x, y)
- && isControlClicked(mGroupControls.find(GLOBAL)->second, x, y);
+ bool hide = isControlClicked(DOCKED, mGroupControls.find(DOCKED)->second, x, y)
+ && isControlClicked(GLOBAL, mGroupControls.find(GLOBAL)->second, x, y);
if (hide)
{
hideTransientFloaters(x, y);
diff --git a/indra/newview/lltransientfloatermgr.h b/indra/newview/lltransientfloatermgr.h
index 2919244121..b4611c8c87 100644
--- a/indra/newview/lltransientfloatermgr.h
+++ b/indra/newview/lltransientfloatermgr.h
@@ -56,14 +56,15 @@ public:
void removeControlView(LLView* view);
private:
+ typedef std::set<LLHandle<LLView> > controls_set_t;
+ typedef std::map<ETransientGroup, controls_set_t > group_controls_t;
+
void hideTransientFloaters(S32 x, S32 y);
void leftMouseClickCallback(S32 x, S32 y, MASK mask);
- bool isControlClicked(std::set<LLView*>& set, S32 x, S32 y);
-private:
+ bool isControlClicked(ETransientGroup group, controls_set_t& set, S32 x, S32 y);
+
std::set<LLTransientFloater*> mTransSet;
- typedef std::set<LLView*> controls_set_t;
- typedef std::map<ETransientGroup, std::set<LLView*> > group_controls_t;
group_controls_t mGroupControls;
};
diff --git a/indra/newview/lltranslate.cpp b/indra/newview/lltranslate.cpp
index 8ccfdb071b..f3d8de1904 100644..100755
--- a/indra/newview/lltranslate.cpp
+++ b/indra/newview/lltranslate.cpp
@@ -2,113 +2,341 @@
* @file lltranslate.cpp
* @brief Functions for translating text via Google Translate.
*
-* $LicenseInfo:firstyear=2009&license=viewergpl$
-*
-* Copyright (c) 2009-2010, Linden Research, Inc.
-*
-* Second Life Viewer Source Code
-* The source code in this file ("Source Code") is provided by Linden Lab
-* to you under the terms of the GNU General Public License, version 2.0
-* ("GPL"), unless you have obtained a separate licensing agreement
-* ("Other License"), formally executed by you and Linden Lab. Terms of
-* the GPL can be found in doc/GPL-license.txt in this distribution, or
-* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
-*
-* There are special exceptions to the terms and conditions of the GPL as
-* it is applied to this Source Code. View the full text of the exception
-* in the file doc/FLOSS-exception.txt in this software distribution, or
-* online at
-* http://secondlifegrid.net/programs/open_source/licensing/flossexception
-*
-* By copying, modifying or distributing this software, you acknowledge
-* that you have read and understood your obligations described above,
-* and agree to abide by those obligations.
-*
-* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
-* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
-* COMPLETENESS OR PERFORMANCE.
-* $/LicenseInfo$
-*/
+ * $LicenseInfo:firstyear=2009&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
#include "llviewerprecompiledheaders.h"
#include "lltranslate.h"
+#include <curl/curl.h>
+
#include "llbufferstream.h"
+#include "lltrans.h"
#include "llui.h"
#include "llversioninfo.h"
#include "llviewercontrol.h"
-#include "jsoncpp/reader.h"
+#include "reader.h"
-// These two are concatenated with the language specifiers to form a complete Google Translate URL
-const char* LLTranslate::m_GoogleURL = "http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q=";
-const char* LLTranslate::m_GoogleLangSpec = "&langpair=";
-float LLTranslate::m_GoogleTimeout = 5;
+// virtual
+void LLGoogleTranslationHandler::getTranslateURL(
+ std::string &url,
+ const std::string &from_lang,
+ const std::string &to_lang,
+ const std::string &text) const
+{
+ url = std::string("https://www.googleapis.com/language/translate/v2?key=")
+ + getAPIKey() + "&q=" + LLURI::escape(text) + "&target=" + to_lang;
+ if (!from_lang.empty())
+ {
+ url += "&source=" + from_lang;
+ }
+}
-LLSD LLTranslate::m_Header;
-// These constants are for the GET header.
-const char* LLTranslate::m_AcceptHeader = "Accept";
-const char* LLTranslate::m_AcceptType = "text/plain";
-const char* LLTranslate::m_AgentHeader = "User-Agent";
+// virtual
+void LLGoogleTranslationHandler::getKeyVerificationURL(
+ std::string& url,
+ const std::string& key) const
+{
+ url = std::string("https://www.googleapis.com/language/translate/v2/languages?key=")
+ + key + "&target=en";
+}
-// These constants are in the JSON returned from Google
-const char* LLTranslate::m_GoogleData = "responseData";
-const char* LLTranslate::m_GoogleTranslation = "translatedText";
-const char* LLTranslate::m_GoogleLanguage = "detectedSourceLanguage";
+// virtual
+bool LLGoogleTranslationHandler::parseResponse(
+ int& status,
+ const std::string& body,
+ std::string& translation,
+ std::string& detected_lang,
+ std::string& err_msg) const
+{
+ Json::Value root;
+ Json::Reader reader;
-//static
-void LLTranslate::translateMessage(LLHTTPClient::ResponderPtr &result, const std::string &from_lang, const std::string &to_lang, const std::string &mesg)
+ if (!reader.parse(body, root))
+ {
+ err_msg = reader.getFormatedErrorMessages();
+ return false;
+ }
+
+ if (!root.isObject()) // empty response? should not happen
+ {
+ return false;
+ }
+
+ if (status != STATUS_OK)
+ {
+ // Request failed. Extract error message from the response.
+ parseErrorResponse(root, status, err_msg);
+ return false;
+ }
+
+ // Request succeeded, extract translation from the response.
+ return parseTranslation(root, translation, detected_lang);
+}
+
+// virtual
+bool LLGoogleTranslationHandler::isConfigured() const
{
- std::string url;
- getTranslateUrl(url, from_lang, to_lang, mesg);
+ return !getAPIKey().empty();
+}
+
+// static
+void LLGoogleTranslationHandler::parseErrorResponse(
+ const Json::Value& root,
+ int& status,
+ std::string& err_msg)
+{
+ const Json::Value& error = root.get("error", 0);
+ if (!error.isObject() || !error.isMember("message") || !error.isMember("code"))
+ {
+ return;
+ }
- std::string user_agent = llformat("%s %d.%d.%d (%d)",
- LLVersionInfo::getChannel().c_str(),
- LLVersionInfo::getMajor(),
- LLVersionInfo::getMinor(),
- LLVersionInfo::getPatch(),
- LLVersionInfo::getBuild());
+ err_msg = error["message"].asString();
+ status = error["code"].asInt();
+}
- if (!m_Header.size())
+// static
+bool LLGoogleTranslationHandler::parseTranslation(
+ const Json::Value& root,
+ std::string& translation,
+ std::string& detected_lang)
+{
+ // JsonCpp is prone to aborting the program on failed assertions,
+ // so be super-careful and verify the response format.
+ const Json::Value& data = root.get("data", 0);
+ if (!data.isObject() || !data.isMember("translations"))
{
- m_Header.insert(m_AcceptHeader, LLSD(m_AcceptType));
- m_Header.insert(m_AgentHeader, LLSD(user_agent));
+ return false;
}
- LLHTTPClient::get(url, result, m_Header, m_GoogleTimeout);
+ const Json::Value& translations = data["translations"];
+ if (!translations.isArray() || translations.size() == 0)
+ {
+ return false;
+ }
+
+ const Json::Value& first = translations[0U];
+ if (!first.isObject() || !first.isMember("translatedText"))
+ {
+ return false;
+ }
+
+ translation = first["translatedText"].asString();
+ detected_lang = first.get("detectedSourceLanguage", "").asString();
+ return true;
}
-//static
-void LLTranslate::getTranslateUrl(std::string &translate_url, const std::string &from_lang, const std::string &to_lang, const std::string &mesg)
+// static
+std::string LLGoogleTranslationHandler::getAPIKey()
{
- std::string escaped_mesg = curl_escape(mesg.c_str(), mesg.size());
+ return gSavedSettings.getString("GoogleTranslateAPIKey");
+}
- translate_url = m_GoogleURL
- + escaped_mesg + m_GoogleLangSpec
- + from_lang // 'from' language; empty string for auto
- + "%7C" // |
- + to_lang; // 'to' language
+// virtual
+void LLBingTranslationHandler::getTranslateURL(
+ std::string &url,
+ const std::string &from_lang,
+ const std::string &to_lang,
+ const std::string &text) const
+{
+ url = std::string("http://api.microsofttranslator.com/v2/Http.svc/Translate?appId=")
+ + getAPIKey() + "&text=" + LLURI::escape(text) + "&to=" + getAPILanguageCode(to_lang);
+ if (!from_lang.empty())
+ {
+ url += "&from=" + getAPILanguageCode(from_lang);
+ }
}
-//static
-bool LLTranslate::parseGoogleTranslate(const std::string& body, std::string &translation, std::string &detected_language)
+// virtual
+void LLBingTranslationHandler::getKeyVerificationURL(
+ std::string& url,
+ const std::string& key) const
{
- Json::Value root;
- Json::Reader reader;
-
- bool success = reader.parse(body, root);
- if (!success)
+ url = std::string("http://api.microsofttranslator.com/v2/Http.svc/GetLanguagesForTranslate?appId=")
+ + key;
+}
+
+// virtual
+bool LLBingTranslationHandler::parseResponse(
+ int& status,
+ const std::string& body,
+ std::string& translation,
+ std::string& detected_lang,
+ std::string& err_msg) const
+{
+ if (status != STATUS_OK)
{
- LL_WARNS("Translate") << "Non valid response from Google Translate API: '" << reader.getFormatedErrorMessages() << "'" << LL_ENDL;
+ static const std::string MSG_BEGIN_MARKER = "Message: ";
+ size_t begin = body.find(MSG_BEGIN_MARKER);
+ if (begin != std::string::npos)
+ {
+ begin += MSG_BEGIN_MARKER.size();
+ }
+ else
+ {
+ begin = 0;
+ err_msg.clear();
+ }
+ size_t end = body.find("</p>", begin);
+ err_msg = body.substr(begin, end-begin);
+ LLStringUtil::replaceString(err_msg, "&#xD;", ""); // strip CR
return false;
}
-
- translation = root[m_GoogleData].get(m_GoogleTranslation, "").asString();
- detected_language = root[m_GoogleData].get(m_GoogleLanguage, "").asString();
+
+ // Sample response: <string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">Hola</string>
+ size_t begin = body.find(">");
+ if (begin == std::string::npos || begin >= (body.size() - 1))
+ {
+ begin = 0;
+ }
+ else
+ {
+ ++begin;
+ }
+
+ size_t end = body.find("</string>", begin);
+
+ detected_lang = ""; // unsupported by this API
+ translation = body.substr(begin, end-begin);
+ LLStringUtil::replaceString(translation, "&#xD;", ""); // strip CR
return true;
}
+// virtual
+bool LLBingTranslationHandler::isConfigured() const
+{
+ return !getAPIKey().empty();
+}
+
+// static
+std::string LLBingTranslationHandler::getAPIKey()
+{
+ return gSavedSettings.getString("BingTranslateAPIKey");
+}
+
+// static
+std::string LLBingTranslationHandler::getAPILanguageCode(const std::string& lang)
+{
+ return lang == "zh" ? "zh-CHT" : lang; // treat Chinese as Traditional Chinese
+}
+
+LLTranslate::TranslationReceiver::TranslationReceiver(const std::string& from_lang, const std::string& to_lang)
+: mFromLang(from_lang)
+, mToLang(to_lang)
+, mHandler(LLTranslate::getPreferredHandler())
+{
+}
+
+// virtual
+void LLTranslate::TranslationReceiver::completedRaw(
+ U32 http_status,
+ const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer)
+{
+ LLBufferStream istr(channels, buffer.get());
+ std::stringstream strstrm;
+ strstrm << istr.rdbuf();
+
+ const std::string body = strstrm.str();
+ std::string translation, detected_lang, err_msg;
+ int status = http_status;
+ LL_DEBUGS("Translate") << "HTTP status: " << status << " " << reason << LL_ENDL;
+ LL_DEBUGS("Translate") << "Response body: " << body << LL_ENDL;
+ if (mHandler.parseResponse(status, body, translation, detected_lang, err_msg))
+ {
+ // Fix up the response
+ LLStringUtil::replaceString(translation, "&lt;", "<");
+ LLStringUtil::replaceString(translation, "&gt;",">");
+ LLStringUtil::replaceString(translation, "&quot;","\"");
+ LLStringUtil::replaceString(translation, "&#39;","'");
+ LLStringUtil::replaceString(translation, "&amp;","&");
+ LLStringUtil::replaceString(translation, "&apos;","'");
+
+ handleResponse(translation, detected_lang);
+ }
+ else
+ {
+ if (err_msg.empty())
+ {
+ err_msg = LLTrans::getString("TranslationResponseParseError");
+ }
+
+ llwarns << "Translation request failed: " << err_msg << llendl;
+ handleFailure(status, err_msg);
+ }
+}
+
+LLTranslate::KeyVerificationReceiver::KeyVerificationReceiver(EService service)
+: mService(service)
+{
+}
+
+LLTranslate::EService LLTranslate::KeyVerificationReceiver::getService() const
+{
+ return mService;
+}
+
+// virtual
+void LLTranslate::KeyVerificationReceiver::completedRaw(
+ U32 http_status,
+ const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer)
+{
+ bool ok = (http_status == 200);
+ setVerificationStatus(ok);
+}
+
+//static
+void LLTranslate::translateMessage(
+ TranslationReceiverPtr &receiver,
+ const std::string &from_lang,
+ const std::string &to_lang,
+ const std::string &mesg)
+{
+ std::string url;
+ receiver->mHandler.getTranslateURL(url, from_lang, to_lang, mesg);
+
+ LL_DEBUGS("Translate") << "Sending translation request: " << url << LL_ENDL;
+ sendRequest(url, receiver);
+}
+
+// static
+void LLTranslate::verifyKey(
+ KeyVerificationReceiverPtr& receiver,
+ const std::string& key)
+{
+ std::string url;
+ const LLTranslationAPIHandler& handler = getHandler(receiver->getService());
+ handler.getKeyVerificationURL(url, key);
+
+ LL_DEBUGS("Translate") << "Sending key verification request: " << url << LL_ENDL;
+ sendRequest(url, receiver);
+}
+
//static
std::string LLTranslate::getTranslateLanguage()
{
@@ -121,3 +349,58 @@ std::string LLTranslate::getTranslateLanguage()
return language;
}
+// static
+bool LLTranslate::isTranslationConfigured()
+{
+ return getPreferredHandler().isConfigured();
+}
+
+// static
+const LLTranslationAPIHandler& LLTranslate::getPreferredHandler()
+{
+ EService service = SERVICE_BING;
+
+ std::string service_str = gSavedSettings.getString("TranslationService");
+ if (service_str == "google")
+ {
+ service = SERVICE_GOOGLE;
+ }
+
+ return getHandler(service);
+}
+
+// static
+const LLTranslationAPIHandler& LLTranslate::getHandler(EService service)
+{
+ static LLGoogleTranslationHandler google;
+ static LLBingTranslationHandler bing;
+
+ if (service == SERVICE_GOOGLE)
+ {
+ return google;
+ }
+
+ return bing;
+}
+
+// static
+void LLTranslate::sendRequest(const std::string& url, LLHTTPClient::ResponderPtr responder)
+{
+ static const float REQUEST_TIMEOUT = 5;
+ static LLSD sHeader;
+
+ if (!sHeader.size())
+ {
+ std::string user_agent = llformat("%s %d.%d.%d (%d)",
+ LLVersionInfo::getChannel().c_str(),
+ LLVersionInfo::getMajor(),
+ LLVersionInfo::getMinor(),
+ LLVersionInfo::getPatch(),
+ LLVersionInfo::getBuild());
+
+ sHeader.insert("Accept", "text/plain");
+ sHeader.insert("User-Agent", user_agent);
+ }
+
+ LLHTTPClient::get(url, responder, sHeader, REQUEST_TIMEOUT);
+}
diff --git a/indra/newview/lltranslate.h b/indra/newview/lltranslate.h
index 0786dc0ca3..c58e1adb8c 100644..100755
--- a/indra/newview/lltranslate.h
+++ b/indra/newview/lltranslate.h
@@ -2,33 +2,27 @@
* @file lltranslate.h
* @brief Human language translation class and JSON response receiver.
*
-* $LicenseInfo:firstyear=2009&license=viewergpl$
-*
-* Copyright (c) 2009-2010, Linden Research, Inc.
-*
-* Second Life Viewer Source Code
-* The source code in this file ("Source Code") is provided by Linden Lab
-* to you under the terms of the GNU General Public License, version 2.0
-* ("GPL"), unless you have obtained a separate licensing agreement
-* ("Other License"), formally executed by you and Linden Lab. Terms of
-* the GPL can be found in doc/GPL-license.txt in this distribution, or
-* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
-*
-* There are special exceptions to the terms and conditions of the GPL as
-* it is applied to this Source Code. View the full text of the exception
-* in the file doc/FLOSS-exception.txt in this software distribution, or
-* online at
-* http://secondlifegrid.net/programs/open_source/licensing/flossexception
-*
-* By copying, modifying or distributing this software, you acknowledge
-* that you have read and understood your obligations described above,
-* and agree to abide by those obligations.
-*
-* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
-* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
-* COMPLETENESS OR PERFORMANCE.
-* $/LicenseInfo$
-*/
+ * $LicenseInfo:firstyear=2009&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
#ifndef LL_LLTRANSLATE_H
#define LL_LLTRANSLATE_H
@@ -36,89 +30,274 @@
#include "llhttpclient.h"
#include "llbufferstream.h"
+namespace Json
+{
+ class Value;
+}
+
+/**
+ * Handler of an HTTP machine translation service.
+ *
+ * Derived classes know the service URL
+ * and how to parse the translation result.
+ */
+class LLTranslationAPIHandler
+{
+public:
+ /**
+ * Get URL for translation of the given string.
+ *
+ * Sending HTTP GET request to the URL will initiate translation.
+ *
+ * @param[out] url Place holder for the result.
+ * @param from_lang Source language. Leave empty for auto-detection.
+ * @param to_lang Target language.
+ * @param text Text to translate.
+ */
+ virtual void getTranslateURL(
+ std::string &url,
+ const std::string &from_lang,
+ const std::string &to_lang,
+ const std::string &text) const = 0;
+
+ /**
+ * Get URL to verify the given API key.
+ *
+ * Sending request to the URL verifies the key.
+ * Positive HTTP response (code 200) means that the key is valid.
+ *
+ * @param[out] url Place holder for the URL.
+ * @param[in] key Key to verify.
+ */
+ virtual void getKeyVerificationURL(
+ std::string &url,
+ const std::string &key) const = 0;
+
+ /**
+ * Parse translation response.
+ *
+ * @param[in,out] status HTTP status. May be modified while parsing.
+ * @param body Response text.
+ * @param[out] translation Translated text.
+ * @param[out] detected_lang Detected source language. May be empty.
+ * @param[out] err_msg Error message (in case of error).
+ */
+ virtual bool parseResponse(
+ int& status,
+ const std::string& body,
+ std::string& translation,
+ std::string& detected_lang,
+ std::string& err_msg) const = 0;
+
+ /**
+ * @return if the handler is configured to function properly
+ */
+ virtual bool isConfigured() const = 0;
+
+ virtual ~LLTranslationAPIHandler() {}
+
+protected:
+ static const int STATUS_OK = 200;
+};
+
+/// Google Translate v2 API handler.
+class LLGoogleTranslationHandler : public LLTranslationAPIHandler
+{
+ LOG_CLASS(LLGoogleTranslationHandler);
+
+public:
+ /*virtual*/ void getTranslateURL(
+ std::string &url,
+ const std::string &from_lang,
+ const std::string &to_lang,
+ const std::string &text) const;
+ /*virtual*/ void getKeyVerificationURL(
+ std::string &url,
+ const std::string &key) const;
+ /*virtual*/ bool parseResponse(
+ int& status,
+ const std::string& body,
+ std::string& translation,
+ std::string& detected_lang,
+ std::string& err_msg) const;
+ /*virtual*/ bool isConfigured() const;
+
+private:
+ static void parseErrorResponse(
+ const Json::Value& root,
+ int& status,
+ std::string& err_msg);
+ static bool parseTranslation(
+ const Json::Value& root,
+ std::string& translation,
+ std::string& detected_lang);
+ static std::string getAPIKey();
+};
+
+/// Microsoft Translator v2 API handler.
+class LLBingTranslationHandler : public LLTranslationAPIHandler
+{
+ LOG_CLASS(LLBingTranslationHandler);
+
+public:
+ /*virtual*/ void getTranslateURL(
+ std::string &url,
+ const std::string &from_lang,
+ const std::string &to_lang,
+ const std::string &text) const;
+ /*virtual*/ void getKeyVerificationURL(
+ std::string &url,
+ const std::string &key) const;
+ /*virtual*/ bool parseResponse(
+ int& status,
+ const std::string& body,
+ std::string& translation,
+ std::string& detected_lang,
+ std::string& err_msg) const;
+ /*virtual*/ bool isConfigured() const;
+private:
+ static std::string getAPIKey();
+ static std::string getAPILanguageCode(const std::string& lang);
+};
+
+/**
+ * Entry point for machine translation services.
+ *
+ * Basically, to translate a string, we need to know the URL
+ * of a translation service, have a valid API for the service
+ * and be given the target language.
+ *
+ * Callers specify the string to translate and the target language,
+ * LLTranslate takes care of the rest.
+ *
+ * API keys for translation are taken from saved settings.
+ */
class LLTranslate
{
LOG_CLASS(LLTranslate);
+
public :
+
+ typedef enum e_service {
+ SERVICE_BING,
+ SERVICE_GOOGLE,
+ } EService;
+
+ /**
+ * Subclasses are supposed to handle translation results (e.g. show them in chat)
+ */
class TranslationReceiver: public LLHTTPClient::Responder
{
+ public:
+
+ /**
+ * Using mHandler, parse incoming response.
+ *
+ * Calls either handleResponse() or handleFailure()
+ * depending on the HTTP status code and parsing success.
+ *
+ * @see handleResponse()
+ * @see handleFailure()
+ * @see mHandler
+ */
+ /*virtual*/ void completedRaw(
+ U32 http_status,
+ const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer);
+
protected:
- TranslationReceiver(const std::string &from_lang, const std::string &to_lang)
- : m_fromLang(from_lang),
- m_toLang(to_lang)
- {
- }
+ friend class LLTranslate;
+
+ /// Remember source and target languages for subclasses to be able to filter inappropriate results.
+ TranslationReceiver(const std::string& from_lang, const std::string& to_lang);
- virtual void handleResponse(const std::string &translation, const std::string &recognized_lang) {};
- virtual void handleFailure() {};
+ /// Override point to handle successful translation.
+ virtual void handleResponse(const std::string &translation, const std::string &recognized_lang) = 0;
+ /// Override point to handle unsuccessful translation.
+ virtual void handleFailure(int status, const std::string& err_msg) = 0;
+
+ std::string mFromLang;
+ std::string mToLang;
+ const LLTranslationAPIHandler& mHandler;
+ };
+
+ /**
+ * Subclasses are supposed to handle API key verification result.
+ */
+ class KeyVerificationReceiver: public LLHTTPClient::Responder
+ {
public:
- ~TranslationReceiver()
- {
- }
-
- virtual void completedRaw( U32 status,
- const std::string& reason,
- const LLChannelDescriptors& channels,
- const LLIOPipe::buffer_ptr_t& buffer)
- {
- if (200 <= status && status < 300)
- {
- LLBufferStream istr(channels, buffer.get());
- std::stringstream strstrm;
- strstrm << istr.rdbuf();
-
- const std::string result = strstrm.str();
- std::string translation;
- std::string detected_language;
-
- if (!parseGoogleTranslate(result, translation, detected_language))
- {
- handleFailure();
- return;
- }
-
- // Fix up the response
- LLStringUtil::replaceString(translation, "&lt;", "<");
- LLStringUtil::replaceString(translation, "&gt;",">");
- LLStringUtil::replaceString(translation, "&quot;","\"");
- LLStringUtil::replaceString(translation, "&#39;","'");
- LLStringUtil::replaceString(translation, "&amp;","&");
- LLStringUtil::replaceString(translation, "&apos;","'");
-
- handleResponse(translation, detected_language);
- }
- else
- {
- LL_WARNS("Translate") << "HTTP request for Google Translate failed with status " << status << ", reason: " << reason << LL_ENDL;
- handleFailure();
- }
- }
+ EService getService() const;
protected:
- const std::string m_toLang;
- const std::string m_fromLang;
+ /**
+ * Save the translation service the key belongs to.
+ *
+ * Subclasses need to know it.
+ *
+ * @see getService()
+ */
+ KeyVerificationReceiver(EService service);
+
+ /**
+ * Parse verification response.
+ *
+ * Calls setVerificationStatus() with the verification status,
+ * which is true if HTTP status code is 200.
+ *
+ * @see setVerificationStatus()
+ */
+ /*virtual*/ void completedRaw(
+ U32 http_status,
+ const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer);
+
+ /**
+ * Override point for subclasses to handle key verification status.
+ */
+ virtual void setVerificationStatus(bool ok) = 0;
+
+ EService mService;
};
- static void translateMessage(LLHTTPClient::ResponderPtr &result, const std::string &from_lang, const std::string &to_lang, const std::string &mesg);
- static float m_GoogleTimeout;
+ typedef boost::intrusive_ptr<TranslationReceiver> TranslationReceiverPtr;
+ typedef boost::intrusive_ptr<KeyVerificationReceiver> KeyVerificationReceiverPtr;
+
+ /**
+ * Translate given text.
+ *
+ * @param receiver Object to pass translation result to.
+ * @param from_lang Source language. Leave empty for auto-detection.
+ * @param to_lang Target language.
+ * @param mesg Text to translate.
+ */
+ static void translateMessage(TranslationReceiverPtr &receiver, const std::string &from_lang, const std::string &to_lang, const std::string &mesg);
+
+ /**
+ * Verify given API key of a translation service.
+ *
+ * @param receiver Object to pass verification result to.
+ * @param key Key to verify.
+ */
+ static void verifyKey(KeyVerificationReceiverPtr& receiver, const std::string& key);
+
+ /**
+ * @return translation target language
+ */
static std::string getTranslateLanguage();
+ /**
+ * @return true if translation is configured properly.
+ */
+ static bool isTranslationConfigured();
+
private:
- static void getTranslateUrl(std::string &translate_url, const std::string &from_lang, const std::string &to_lang, const std::string &text);
- static bool parseGoogleTranslate(const std::string& body, std::string &translation, std::string &detected_language);
-
- static LLSD m_Header;
- static const char* m_GoogleURL;
- static const char* m_GoogleLangSpec;
- static const char* m_AcceptHeader;
- static const char* m_AcceptType;
- static const char* m_AgentHeader;
- static const char* m_UserAgent;
-
- static const char* m_GoogleData;
- static const char* m_GoogleTranslation;
- static const char* m_GoogleLanguage;
+ static const LLTranslationAPIHandler& getPreferredHandler();
+ static const LLTranslationAPIHandler& getHandler(EService service);
+ static void sendRequest(const std::string& url, LLHTTPClient::ResponderPtr responder);
};
#endif
diff --git a/indra/newview/lluilistener.cpp b/indra/newview/lluilistener.cpp
index 4d6eac4958..6b2cd71d40 100644
--- a/indra/newview/lluilistener.cpp
+++ b/indra/newview/lluilistener.cpp
@@ -34,9 +34,11 @@
// std headers
// external library headers
// other Linden headers
+#include "llui.h" // getRootView(), resolvePath()
#include "lluictrl.h"
#include "llerror.h"
+
LLUIListener::LLUIListener():
LLEventAPI("UI",
"LLUICtrl::CommitCallbackRegistry listener.\n"
@@ -47,6 +49,12 @@ LLUIListener::LLUIListener():
"as if from a user gesture on a menu -- or a button click.",
&LLUIListener::call,
LLSD().with("function", LLSD()));
+
+ add("getValue",
+ "For the UI control identified by the path in [\"path\"], return the control's\n"
+ "current value as [\"value\"] reply.",
+ &LLUIListener::getValue,
+ LLSDMap("path", LLSD())("reply", LLSD()));
}
void LLUIListener::call(const LLSD& event) const
@@ -71,3 +79,23 @@ void LLUIListener::call(const LLSD& event) const
(*func)(NULL, event["parameter"]);
}
}
+
+void LLUIListener::getValue(const LLSD&event) const
+{
+ LLSD reply = LLSD::emptyMap();
+
+ const LLView* root = LLUI::getRootView();
+ const LLView* view = LLUI::resolvePath(root, event["path"].asString());
+ const LLUICtrl* ctrl(dynamic_cast<const LLUICtrl*>(view));
+
+ if (ctrl)
+ {
+ reply["value"] = ctrl->getValue();
+ }
+ else
+ {
+ // *TODO: ??? return something indicating failure to resolve
+ }
+
+ sendReply(reply, event);
+}
diff --git a/indra/newview/lluilistener.h b/indra/newview/lluilistener.h
index e7847f01e8..08724024dc 100644
--- a/indra/newview/lluilistener.h
+++ b/indra/newview/lluilistener.h
@@ -41,6 +41,7 @@ public:
private:
void call(const LLSD& event) const;
+ void getValue(const LLSD&event) const;
};
#endif /* ! defined(LL_LLUILISTENER_H) */
diff --git a/indra/newview/lluploaddialog.cpp b/indra/newview/lluploaddialog.cpp
index df7c5be0d6..e59064c074 100644
--- a/indra/newview/lluploaddialog.cpp
+++ b/indra/newview/lluploaddialog.cpp
@@ -115,7 +115,7 @@ void LLUploadDialog::setMessage( const std::string& msg)
token = strtok( NULL, "\n" );
}
- S32 line_height = S32( font->getLineHeight() + 0.99f );
+ S32 line_height = font->getLineHeight();
S32 dialog_width = max_msg_width + 2 * HPAD;
S32 dialog_height = line_height * msg_lines.size() + 2 * VPAD;
diff --git a/indra/newview/lluploadfloaterobservers.cpp b/indra/newview/lluploadfloaterobservers.cpp
new file mode 100644
index 0000000000..5a6a17fbca
--- /dev/null
+++ b/indra/newview/lluploadfloaterobservers.cpp
@@ -0,0 +1,56 @@
+/**
+ * @file lluploadfloaterobservers.cpp
+ * @brief LLUploadModelPremissionsResponder definition
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "lluploadfloaterobservers.h"
+
+LLUploadModelPremissionsResponder::LLUploadModelPremissionsResponder(const LLHandle<LLUploadPermissionsObserver>& observer)
+:mObserverHandle(observer)
+{
+}
+
+void LLUploadModelPremissionsResponder::error(U32 status, const std::string& reason)
+{
+ llwarns << "LLUploadModelPremissionsResponder::error("<< status << ": " << reason << ")" << llendl;
+
+ LLUploadPermissionsObserver* observer = mObserverHandle.get();
+
+ if (observer)
+ {
+ observer->setPermissonsErrorStatus(status, reason);
+ }
+}
+
+void LLUploadModelPremissionsResponder::result(const LLSD& content)
+{
+ LLUploadPermissionsObserver* observer = mObserverHandle.get();
+
+ if (observer)
+ {
+ observer->onPermissionsReceived(content);
+ }
+}
diff --git a/indra/newview/lluploadfloaterobservers.h b/indra/newview/lluploadfloaterobservers.h
new file mode 100644
index 0000000000..79aad282d7
--- /dev/null
+++ b/indra/newview/lluploadfloaterobservers.h
@@ -0,0 +1,97 @@
+/**
+ * @file lluploadfloaterobservers.h
+ * @brief LLUploadModelPremissionsResponder declaration
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLUPLOADFLOATEROBSERVERS_H
+#define LL_LLUPLOADFLOATEROBSERVERS_H
+
+#include "llfloater.h"
+#include "llhttpclient.h"
+#include "llhandle.h"
+
+class LLUploadPermissionsObserver
+{
+public:
+
+ LLUploadPermissionsObserver(){mUploadPermObserverHandle.bind(this);}
+ virtual ~LLUploadPermissionsObserver() {}
+
+ virtual void onPermissionsReceived(const LLSD& result) = 0;
+ virtual void setPermissonsErrorStatus(U32 status, const std::string& reason) = 0;
+
+ LLHandle<LLUploadPermissionsObserver> getPermObserverHandle() const {return mUploadPermObserverHandle;}
+
+protected:
+ LLRootHandle<LLUploadPermissionsObserver> mUploadPermObserverHandle;
+};
+
+class LLWholeModelFeeObserver
+{
+public:
+ LLWholeModelFeeObserver() { mWholeModelFeeObserverHandle.bind(this); }
+ virtual ~LLWholeModelFeeObserver() {}
+
+ virtual void onModelPhysicsFeeReceived(const LLSD& result, std::string upload_url) = 0;
+ virtual void setModelPhysicsFeeErrorStatus(U32 status, const std::string& reason) = 0;
+
+ LLHandle<LLWholeModelFeeObserver> getWholeModelFeeObserverHandle() const { return mWholeModelFeeObserverHandle; }
+
+protected:
+ LLRootHandle<LLWholeModelFeeObserver> mWholeModelFeeObserverHandle;
+};
+
+
+class LLWholeModelUploadObserver
+{
+public:
+ LLWholeModelUploadObserver() { mWholeModelUploadObserverHandle.bind(this); }
+ virtual ~LLWholeModelUploadObserver() {}
+
+ virtual void onModelUploadSuccess() = 0;
+
+ virtual void onModelUploadFailure() = 0;
+
+ LLHandle<LLWholeModelUploadObserver> getWholeModelUploadObserverHandle() const { return mWholeModelUploadObserverHandle; }
+
+protected:
+ LLRootHandle<LLWholeModelUploadObserver> mWholeModelUploadObserverHandle;
+};
+
+
+class LLUploadModelPremissionsResponder : public LLHTTPClient::Responder
+{
+public:
+
+ LLUploadModelPremissionsResponder(const LLHandle<LLUploadPermissionsObserver>& observer);
+
+ void error(U32 status, const std::string& reason);
+
+ void result(const LLSD& content);
+
+private:
+ LLHandle<LLUploadPermissionsObserver> mObserverHandle;
+};
+
+#endif /* LL_LLUPLOADFLOATEROBSERVERS_H */
diff --git a/indra/newview/llurldispatcher.cpp b/indra/newview/llurldispatcher.cpp
index bd4d3c2b78..4240a38326 100644
--- a/indra/newview/llurldispatcher.cpp
+++ b/indra/newview/llurldispatcher.cpp
@@ -32,10 +32,10 @@
#include "llcommandhandler.h"
#include "llfloaterhelpbrowser.h"
#include "llfloaterreg.h"
+#include "llfloatersidepanelcontainer.h"
#include "llfloaterworldmap.h"
#include "llpanellogin.h"
#include "llregionhandle.h"
-#include "llsidetray.h"
#include "llslurl.h"
#include "llstartup.h" // gStartupState
#include "llweb.h"
@@ -53,6 +53,7 @@ class LLURLDispatcherImpl
{
public:
static bool dispatch(const LLSLURL& slurl,
+ const std::string& nav_type,
LLMediaCtrl* web,
bool trusted_browser);
// returns true if handled or explicitly blocked.
@@ -61,6 +62,7 @@ public:
private:
static bool dispatchCore(const LLSLURL& slurl,
+ const std::string& nav_type,
bool right_mouse,
LLMediaCtrl* web,
bool trusted_browser);
@@ -71,6 +73,7 @@ private:
// Returns true if handled.
static bool dispatchApp(const LLSLURL& slurl,
+ const std::string& nav_type,
bool right_mouse,
LLMediaCtrl* web,
bool trusted_browser);
@@ -78,7 +81,7 @@ private:
// by showing panel in Search floater.
// Returns true if handled or explicitly blocked.
- static bool dispatchRegion(const LLSLURL& slurl, bool right_mouse);
+ static bool dispatchRegion(const LLSLURL& slurl, const std::string& nav_type, bool right_mouse);
// handles secondlife://Ahern/123/45/67/
// Returns true if handled.
@@ -97,6 +100,7 @@ private:
// static
bool LLURLDispatcherImpl::dispatchCore(const LLSLURL& slurl,
+ const std::string& nav_type,
bool right_mouse,
LLMediaCtrl* web,
bool trusted_browser)
@@ -105,9 +109,9 @@ bool LLURLDispatcherImpl::dispatchCore(const LLSLURL& slurl,
switch(slurl.getType())
{
case LLSLURL::APP:
- return dispatchApp(slurl, right_mouse, web, trusted_browser);
+ return dispatchApp(slurl, nav_type, right_mouse, web, trusted_browser);
case LLSLURL::LOCATION:
- return dispatchRegion(slurl, right_mouse);
+ return dispatchRegion(slurl, nav_type, right_mouse);
default:
return false;
}
@@ -122,11 +126,12 @@ bool LLURLDispatcherImpl::dispatchCore(const LLSLURL& slurl,
// static
bool LLURLDispatcherImpl::dispatch(const LLSLURL& slurl,
+ const std::string& nav_type,
LLMediaCtrl* web,
bool trusted_browser)
{
const bool right_click = false;
- return dispatchCore(slurl, right_click, web, trusted_browser);
+ return dispatchCore(slurl, nav_type, right_click, web, trusted_browser);
}
// static
@@ -135,11 +140,12 @@ bool LLURLDispatcherImpl::dispatchRightClick(const LLSLURL& slurl)
const bool right_click = true;
LLMediaCtrl* web = NULL;
const bool trusted_browser = false;
- return dispatchCore(slurl, right_click, web, trusted_browser);
+ return dispatchCore(slurl, "clicked", right_click, web, trusted_browser);
}
// static
bool LLURLDispatcherImpl::dispatchApp(const LLSLURL& slurl,
+ const std::string& nav_type,
bool right_mouse,
LLMediaCtrl* web,
bool trusted_browser)
@@ -147,7 +153,7 @@ bool LLURLDispatcherImpl::dispatchApp(const LLSLURL& slurl,
llinfos << "cmd: " << slurl.getAppCmd() << " path: " << slurl.getAppPath() << " query: " << slurl.getAppQuery() << llendl;
const LLSD& query_map = LLURI::queryMap(slurl.getAppQuery());
bool handled = LLCommandDispatcher::dispatch(
- slurl.getAppCmd(), slurl.getAppPath(), query_map, web, trusted_browser);
+ slurl.getAppCmd(), slurl.getAppPath(), query_map, web, nav_type, trusted_browser);
// alert if we didn't handle this secondlife:///app/ SLURL
// (but still return true because it is a valid app SLURL)
@@ -159,11 +165,11 @@ bool LLURLDispatcherImpl::dispatchApp(const LLSLURL& slurl,
}
// static
-bool LLURLDispatcherImpl::dispatchRegion(const LLSLURL& slurl, bool right_mouse)
+bool LLURLDispatcherImpl::dispatchRegion(const LLSLURL& slurl, const std::string& nav_type, bool right_mouse)
{
- if(slurl.getType() != LLSLURL::LOCATION)
+ if(slurl.getType() != LLSLURL::LOCATION)
{
- return false;
+ return false;
}
// Before we're logged in, need to update the startup screen
// to tell the user where they are going.
@@ -180,7 +186,7 @@ bool LLURLDispatcherImpl::dispatchRegion(const LLSLURL& slurl, bool right_mouse)
LLWorldMapMessage::getInstance()->sendNamedRegionRequest(slurl.getRegion(),
LLURLDispatcherImpl::regionNameCallback,
slurl.getSLURLString(),
- false); // don't teleport
+ LLUI::sSettingGroups["config"]->getBOOL("SLURLTeleportDirectly")); // don't teleport
return true;
}
@@ -240,7 +246,7 @@ void LLURLDispatcherImpl::regionHandleCallback(U64 region_handle, const LLSLURL&
key["y"] = global_pos.mdV[VY];
key["z"] = global_pos.mdV[VZ];
- LLSideTray::getInstance()->showPanel("panel_places", key);
+ LLFloaterSidePanelContainer::showPanel("places", key);
}
}
@@ -287,10 +293,11 @@ LLTeleportHandler gTeleportHandler;
// static
bool LLURLDispatcher::dispatch(const std::string& slurl,
+ const std::string& nav_type,
LLMediaCtrl* web,
bool trusted_browser)
{
- return LLURLDispatcherImpl::dispatch(LLSLURL(slurl), web, trusted_browser);
+ return LLURLDispatcherImpl::dispatch(LLSLURL(slurl), nav_type, web, trusted_browser);
}
// static
@@ -310,7 +317,7 @@ bool LLURLDispatcher::dispatchFromTextEditor(const std::string& slurl)
// *TODO: Make this trust model more refined. JC
const bool trusted_browser = true;
LLMediaCtrl* web = NULL;
- return LLURLDispatcherImpl::dispatch(LLSLURL(slurl), web, trusted_browser);
+ return LLURLDispatcherImpl::dispatch(LLSLURL(slurl), "clicked", web, trusted_browser);
}
diff --git a/indra/newview/llurldispatcher.h b/indra/newview/llurldispatcher.h
index b07db4da3f..6309a97af5 100644
--- a/indra/newview/llurldispatcher.h
+++ b/indra/newview/llurldispatcher.h
@@ -33,6 +33,7 @@ class LLURLDispatcher
public:
static bool dispatch(const std::string& slurl,
+ const std::string& nav_type,
LLMediaCtrl* web,
bool trusted_browser);
// At startup time and on clicks in internal web browsers,
@@ -41,6 +42,8 @@ public:
// secondlife://RegionName/123/45/67/
// secondlife:///app/agent/3d6181b0-6a4b-97ef-18d8-722652995cf1/show
// sl://app/foo/bar
+ // @param nav_type
+ // type of navigation type (see LLQtWebKit::LLWebPage::acceptNavigationRequest)
// @param web
// Pointer to LLMediaCtrl sending URL, can be NULL
// @param trusted_browser
diff --git a/indra/newview/llurldispatcherlistener.cpp b/indra/newview/llurldispatcherlistener.cpp
index d0441d7bfa..c7b9afafef 100644
--- a/indra/newview/llurldispatcherlistener.cpp
+++ b/indra/newview/llurldispatcherlistener.cpp
@@ -61,7 +61,7 @@ void LLURLDispatcherListener::dispatch(const LLSD& params) const
// But for testing, allow a caller to specify untrusted.
trusted_browser = params["trusted"].asBoolean();
}
- LLURLDispatcher::dispatch(params["url"], NULL, trusted_browser);
+ LLURLDispatcher::dispatch(params["url"], "clicked", NULL, trusted_browser);
}
void LLURLDispatcherListener::dispatchRightClick(const LLSD& params) const
diff --git a/indra/newview/llurllineeditorctrl.cpp b/indra/newview/llurllineeditorctrl.cpp
index 56b5bbf942..cad5769042 100644
--- a/indra/newview/llurllineeditorctrl.cpp
+++ b/indra/newview/llurllineeditorctrl.cpp
@@ -89,5 +89,5 @@ void LLURLLineEditor::copyEscapedURLToClipboard()
else // human-readable location
text_to_copy = utf8str_to_wstring(unescaped_text);
- gClipboard.copyFromString( text_to_copy );
+ LLClipboard::instance().copyToClipboard(text_to_copy, 0, text_to_copy.size());
}
diff --git a/indra/newview/llversioninfo.cpp b/indra/newview/llversioninfo.cpp
index 53994c68f2..673d0c24cf 100644
--- a/indra/newview/llversioninfo.cpp
+++ b/indra/newview/llversioninfo.cpp
@@ -108,15 +108,15 @@ namespace
}
//static
-const std::string &LLVersionInfo::getVersionAndChannel()
+const std::string &LLVersionInfo::getChannelAndVersion()
{
if (sVersionChannel.empty())
{
// cache the version string
std::ostringstream stream;
- stream << LLVersionInfo::getVersion()
+ stream << LLVersionInfo::getChannel()
<< " "
- << LLVersionInfo::getChannel();
+ << LLVersionInfo::getVersion();
sVersionChannel = stream.str();
}
diff --git a/indra/newview/llversioninfo.h b/indra/newview/llversioninfo.h
index 36defbcd68..6f64544f3b 100644
--- a/indra/newview/llversioninfo.h
+++ b/indra/newview/llversioninfo.h
@@ -59,8 +59,8 @@ public:
static const std::string &getShortVersion();
/// return the viewer version and channel as a string
- /// like "2.0.0.200030 Second Life Release"
- static const std::string &getVersionAndChannel();
+ /// like "Second Life Release 2.0.0.200030"
+ static const std::string &getChannelAndVersion();
/// return the channel name, e.g. "Second Life"
static const std::string &getChannel();
diff --git a/indra/newview/llviewerassetstats.cpp b/indra/newview/llviewerassetstats.cpp
new file mode 100644
index 0000000000..e621cf647e
--- /dev/null
+++ b/indra/newview/llviewerassetstats.cpp
@@ -0,0 +1,612 @@
+/**
+ * @file llviewerassetstats.cpp
+ * @brief
+ *
+ * $LicenseInfo:firstyear=2010&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llviewerassetstats.h"
+#include "llregionhandle.h"
+
+#include "stdtypes.h"
+
+/*
+ * Classes and utility functions for per-thread and per-region
+ * asset and experiential metrics to be aggregated grid-wide.
+ *
+ * The basic metrics grouping is LLViewerAssetStats::PerRegionStats.
+ * This provides various counters and simple statistics for asset
+ * fetches binned into a few categories. One of these is maintained
+ * for each region encountered and the 'current' region is available
+ * as a simple reference. Each thread (presently two) interested
+ * in participating in these stats gets an instance of the
+ * LLViewerAssetStats class so that threads are completely
+ * independent.
+ *
+ * The idea of a current region is used for simplicity and speed
+ * of categorization. Each metrics event could have taken a
+ * region uuid argument resulting in a suitable lookup. Arguments
+ * against this design include:
+ *
+ * - Region uuid not trivially available to caller.
+ * - Cost (cpu, disruption in real work flow) too high.
+ * - Additional precision not really meaningful.
+ *
+ * By itself, the LLViewerAssetStats class is thread- and
+ * viewer-agnostic and can be used anywhere without assumptions
+ * of global pointers and other context. For the viewer,
+ * a set of free functions are provided in the namespace
+ * LLViewerAssetStatsFF which *do* implement viewer-native
+ * policies about per-thread globals and will do correct
+ * defensive tests of same.
+ *
+ * References
+ *
+ * Project:
+ * <TBD>
+ *
+ * Test Plan:
+ * <TBD>
+ *
+ * Jiras:
+ * <TBD>
+ *
+ * Unit Tests:
+ * indra/newview/tests/llviewerassetstats_test.cpp
+ *
+ */
+
+
+// ------------------------------------------------------
+// Global data definitions
+// ------------------------------------------------------
+LLViewerAssetStats * gViewerAssetStatsMain(0);
+LLViewerAssetStats * gViewerAssetStatsThread1(0);
+
+
+// ------------------------------------------------------
+// Local declarations
+// ------------------------------------------------------
+namespace
+{
+
+static LLViewerAssetStats::EViewerAssetCategories
+asset_type_to_category(const LLViewerAssetType::EType at, bool with_http, bool is_temp);
+
+}
+
+// ------------------------------------------------------
+// LLViewerAssetStats::PerRegionStats struct definition
+// ------------------------------------------------------
+void
+LLViewerAssetStats::PerRegionStats::reset()
+{
+ for (int i(0); i < LL_ARRAY_SIZE(mRequests); ++i)
+ {
+ mRequests[i].mEnqueued.reset();
+ mRequests[i].mDequeued.reset();
+ mRequests[i].mResponse.reset();
+ }
+ mFPS.reset();
+
+ mTotalTime = 0;
+ mStartTimestamp = LLViewerAssetStatsFF::get_timestamp();
+}
+
+
+void
+LLViewerAssetStats::PerRegionStats::merge(const LLViewerAssetStats::PerRegionStats & src)
+{
+ // mRegionHandle, mTotalTime, mStartTimestamp are left alone.
+
+ // mFPS
+ if (src.mFPS.getCount() && mFPS.getCount())
+ {
+ mFPS.merge(src.mFPS);
+ }
+
+ // Requests
+ for (int i = 0; i < LL_ARRAY_SIZE(mRequests); ++i)
+ {
+ mRequests[i].mEnqueued.merge(src.mRequests[i].mEnqueued);
+ mRequests[i].mDequeued.merge(src.mRequests[i].mDequeued);
+ mRequests[i].mResponse.merge(src.mRequests[i].mResponse);
+ }
+}
+
+
+void
+LLViewerAssetStats::PerRegionStats::accumulateTime(duration_t now)
+{
+ mTotalTime += (now - mStartTimestamp);
+ mStartTimestamp = now;
+}
+
+
+// ------------------------------------------------------
+// LLViewerAssetStats class definition
+// ------------------------------------------------------
+LLViewerAssetStats::LLViewerAssetStats()
+ : mRegionHandle(U64(0))
+{
+ reset();
+}
+
+
+LLViewerAssetStats::LLViewerAssetStats(const LLViewerAssetStats & src)
+ : mRegionHandle(src.mRegionHandle),
+ mResetTimestamp(src.mResetTimestamp)
+{
+ const PerRegionContainer::const_iterator it_end(src.mRegionStats.end());
+ for (PerRegionContainer::const_iterator it(src.mRegionStats.begin()); it_end != it; ++it)
+ {
+ mRegionStats[it->first] = new PerRegionStats(*it->second);
+ }
+ mCurRegionStats = mRegionStats[mRegionHandle];
+}
+
+
+void
+LLViewerAssetStats::reset()
+{
+ // Empty the map of all region stats
+ mRegionStats.clear();
+
+ // If we have a current stats, reset it, otherwise, as at construction,
+ // create a new one as we must always have a current stats block.
+ if (mCurRegionStats)
+ {
+ mCurRegionStats->reset();
+ }
+ else
+ {
+ mCurRegionStats = new PerRegionStats(mRegionHandle);
+ }
+
+ // And add reference to map
+ mRegionStats[mRegionHandle] = mCurRegionStats;
+
+ // Start timestamp consistent with per-region collector
+ mResetTimestamp = mCurRegionStats->mStartTimestamp;
+}
+
+
+void
+LLViewerAssetStats::setRegion(region_handle_t region_handle)
+{
+ if (region_handle == mRegionHandle)
+ {
+ // Already active, ignore.
+ return;
+ }
+
+ // Get duration for current set
+ const duration_t now = LLViewerAssetStatsFF::get_timestamp();
+ mCurRegionStats->accumulateTime(now);
+
+ // Prepare new set
+ PerRegionContainer::iterator new_stats = mRegionStats.find(region_handle);
+ if (mRegionStats.end() == new_stats)
+ {
+ // Haven't seen this region_id before, create a new block and make it current.
+ mCurRegionStats = new PerRegionStats(region_handle);
+ mRegionStats[region_handle] = mCurRegionStats;
+ }
+ else
+ {
+ mCurRegionStats = new_stats->second;
+ }
+ mCurRegionStats->mStartTimestamp = now;
+ mRegionHandle = region_handle;
+}
+
+
+void
+LLViewerAssetStats::recordGetEnqueued(LLViewerAssetType::EType at, bool with_http, bool is_temp)
+{
+ const EViewerAssetCategories eac(asset_type_to_category(at, with_http, is_temp));
+
+ ++(mCurRegionStats->mRequests[int(eac)].mEnqueued);
+}
+
+void
+LLViewerAssetStats::recordGetDequeued(LLViewerAssetType::EType at, bool with_http, bool is_temp)
+{
+ const EViewerAssetCategories eac(asset_type_to_category(at, with_http, is_temp));
+
+ ++(mCurRegionStats->mRequests[int(eac)].mDequeued);
+}
+
+void
+LLViewerAssetStats::recordGetServiced(LLViewerAssetType::EType at, bool with_http, bool is_temp, duration_t duration)
+{
+ const EViewerAssetCategories eac(asset_type_to_category(at, with_http, is_temp));
+
+ mCurRegionStats->mRequests[int(eac)].mResponse.record(duration);
+}
+
+void
+LLViewerAssetStats::recordFPS(F32 fps)
+{
+ mCurRegionStats->mFPS.record(fps);
+}
+
+LLSD
+LLViewerAssetStats::asLLSD(bool compact_output)
+{
+ // Top-level tags
+ static const LLSD::String tags[EVACCount] =
+ {
+ LLSD::String("get_texture_temp_http"),
+ LLSD::String("get_texture_temp_udp"),
+ LLSD::String("get_texture_non_temp_http"),
+ LLSD::String("get_texture_non_temp_udp"),
+ LLSD::String("get_wearable_udp"),
+ LLSD::String("get_sound_udp"),
+ LLSD::String("get_gesture_udp"),
+ LLSD::String("get_other")
+ };
+
+ // Stats Group Sub-tags.
+ static const LLSD::String enq_tag("enqueued");
+ static const LLSD::String deq_tag("dequeued");
+ static const LLSD::String rcnt_tag("resp_count");
+ static const LLSD::String rmin_tag("resp_min");
+ static const LLSD::String rmax_tag("resp_max");
+ static const LLSD::String rmean_tag("resp_mean");
+
+ // MMM Group Sub-tags.
+ static const LLSD::String cnt_tag("count");
+ static const LLSD::String min_tag("min");
+ static const LLSD::String max_tag("max");
+ static const LLSD::String mean_tag("mean");
+
+ const duration_t now = LLViewerAssetStatsFF::get_timestamp();
+ mCurRegionStats->accumulateTime(now);
+
+ LLSD regions = LLSD::emptyArray();
+ for (PerRegionContainer::iterator it = mRegionStats.begin();
+ mRegionStats.end() != it;
+ ++it)
+ {
+ if (0 == it->first)
+ {
+ // Never emit NULL UUID/handle in results.
+ continue;
+ }
+
+ PerRegionStats & stats = *it->second;
+
+ LLSD reg_stat = LLSD::emptyMap();
+
+ for (int i = 0; i < LL_ARRAY_SIZE(tags); ++i)
+ {
+ PerRegionStats::prs_group & group(stats.mRequests[i]);
+
+ if ((! compact_output) ||
+ group.mEnqueued.getCount() ||
+ group.mDequeued.getCount() ||
+ group.mResponse.getCount())
+ {
+ LLSD & slot = reg_stat[tags[i]];
+ slot = LLSD::emptyMap();
+ slot[enq_tag] = LLSD(S32(stats.mRequests[i].mEnqueued.getCount()));
+ slot[deq_tag] = LLSD(S32(stats.mRequests[i].mDequeued.getCount()));
+ slot[rcnt_tag] = LLSD(S32(stats.mRequests[i].mResponse.getCount()));
+ slot[rmin_tag] = LLSD(F64(stats.mRequests[i].mResponse.getMin() * 1.0e-6));
+ slot[rmax_tag] = LLSD(F64(stats.mRequests[i].mResponse.getMax() * 1.0e-6));
+ slot[rmean_tag] = LLSD(F64(stats.mRequests[i].mResponse.getMean() * 1.0e-6));
+ }
+ }
+
+ if ((! compact_output) || stats.mFPS.getCount())
+ {
+ LLSD & slot = reg_stat["fps"];
+ slot = LLSD::emptyMap();
+ slot[cnt_tag] = LLSD(S32(stats.mFPS.getCount()));
+ slot[min_tag] = LLSD(F64(stats.mFPS.getMin()));
+ slot[max_tag] = LLSD(F64(stats.mFPS.getMax()));
+ slot[mean_tag] = LLSD(F64(stats.mFPS.getMean()));
+ }
+
+ U32 grid_x(0), grid_y(0);
+ grid_from_region_handle(it->first, &grid_x, &grid_y);
+ reg_stat["grid_x"] = LLSD::Integer(grid_x);
+ reg_stat["grid_y"] = LLSD::Integer(grid_y);
+ reg_stat["duration"] = LLSD::Real(stats.mTotalTime * 1.0e-6);
+ regions.append(reg_stat);
+ }
+
+ LLSD ret = LLSD::emptyMap();
+ ret["regions"] = regions;
+ ret["duration"] = LLSD::Real((now - mResetTimestamp) * 1.0e-6);
+
+ return ret;
+}
+
+void
+LLViewerAssetStats::merge(const LLViewerAssetStats & src)
+{
+ // mRegionHandle, mCurRegionStats and mResetTimestamp are left untouched.
+ // Just merge the stats bodies
+
+ const PerRegionContainer::const_iterator it_end(src.mRegionStats.end());
+ for (PerRegionContainer::const_iterator it(src.mRegionStats.begin()); it_end != it; ++it)
+ {
+ PerRegionContainer::iterator dst(mRegionStats.find(it->first));
+ if (mRegionStats.end() == dst)
+ {
+ // Destination is missing data, just make a private copy
+ mRegionStats[it->first] = new PerRegionStats(*it->second);
+ }
+ else
+ {
+ dst->second->merge(*it->second);
+ }
+ }
+}
+
+
+// ------------------------------------------------------
+// Global free-function definitions (LLViewerAssetStatsFF namespace)
+// ------------------------------------------------------
+
+namespace LLViewerAssetStatsFF
+{
+
+//
+// Target thread is elaborated in the function name. This could
+// have been something 'templatey' like specializations iterated
+// over a set of constants but with so few, this is clearer I think.
+//
+// As for the threads themselves... rather than do fine-grained
+// locking as we gather statistics, this code creates a collector
+// for each thread, allocated and run independently. Logging
+// happens at relatively infrequent intervals and at that time
+// the data is sent to a single thread to be aggregated into
+// a single entity with locks, thread safety and other niceties.
+//
+// A particularly fussy implementation would distribute the
+// per-thread pointers across separate cache lines. But that should
+// be beyond current requirements.
+//
+
+// 'main' thread - initial program thread
+
+void
+set_region_main(LLViewerAssetStats::region_handle_t region_handle)
+{
+ if (! gViewerAssetStatsMain)
+ return;
+
+ gViewerAssetStatsMain->setRegion(region_handle);
+}
+
+void
+record_enqueue_main(LLViewerAssetType::EType at, bool with_http, bool is_temp)
+{
+ if (! gViewerAssetStatsMain)
+ return;
+
+ gViewerAssetStatsMain->recordGetEnqueued(at, with_http, is_temp);
+}
+
+void
+record_dequeue_main(LLViewerAssetType::EType at, bool with_http, bool is_temp)
+{
+ if (! gViewerAssetStatsMain)
+ return;
+
+ gViewerAssetStatsMain->recordGetDequeued(at, with_http, is_temp);
+}
+
+void
+record_response_main(LLViewerAssetType::EType at, bool with_http, bool is_temp, LLViewerAssetStats::duration_t duration)
+{
+ if (! gViewerAssetStatsMain)
+ return;
+
+ gViewerAssetStatsMain->recordGetServiced(at, with_http, is_temp, duration);
+}
+
+void
+record_fps_main(F32 fps)
+{
+ if (! gViewerAssetStatsMain)
+ return;
+
+ gViewerAssetStatsMain->recordFPS(fps);
+}
+
+
+// 'thread1' - should be for TextureFetch thread
+
+void
+set_region_thread1(LLViewerAssetStats::region_handle_t region_handle)
+{
+ if (! gViewerAssetStatsThread1)
+ return;
+
+ gViewerAssetStatsThread1->setRegion(region_handle);
+}
+
+void
+record_enqueue_thread1(LLViewerAssetType::EType at, bool with_http, bool is_temp)
+{
+ if (! gViewerAssetStatsThread1)
+ return;
+
+ gViewerAssetStatsThread1->recordGetEnqueued(at, with_http, is_temp);
+}
+
+void
+record_dequeue_thread1(LLViewerAssetType::EType at, bool with_http, bool is_temp)
+{
+ if (! gViewerAssetStatsThread1)
+ return;
+
+ gViewerAssetStatsThread1->recordGetDequeued(at, with_http, is_temp);
+}
+
+void
+record_response_thread1(LLViewerAssetType::EType at, bool with_http, bool is_temp, LLViewerAssetStats::duration_t duration)
+{
+ if (! gViewerAssetStatsThread1)
+ return;
+
+ gViewerAssetStatsThread1->recordGetServiced(at, with_http, is_temp, duration);
+}
+
+
+void
+init()
+{
+ if (! gViewerAssetStatsMain)
+ {
+ gViewerAssetStatsMain = new LLViewerAssetStats();
+ }
+ if (! gViewerAssetStatsThread1)
+ {
+ gViewerAssetStatsThread1 = new LLViewerAssetStats();
+ }
+}
+
+void
+cleanup()
+{
+ delete gViewerAssetStatsMain;
+ gViewerAssetStatsMain = 0;
+
+ delete gViewerAssetStatsThread1;
+ gViewerAssetStatsThread1 = 0;
+}
+
+
+} // namespace LLViewerAssetStatsFF
+
+
+// ------------------------------------------------------
+// Local function definitions
+// ------------------------------------------------------
+
+namespace
+{
+
+LLViewerAssetStats::EViewerAssetCategories
+asset_type_to_category(const LLViewerAssetType::EType at, bool with_http, bool is_temp)
+{
+ // For statistical purposes, we divide GETs into several
+ // populations of asset fetches:
+ // - textures which are de-prioritized in the asset system
+ // - wearables (clothing, bodyparts) which directly affect
+ // user experiences when they log in
+ // - sounds
+ // - gestures
+ // - everything else.
+ //
+ llassert_always(50 == LLViewerAssetType::AT_COUNT);
+
+ // Multiple asset definitions are floating around so this requires some
+ // maintenance and attention.
+ static const LLViewerAssetStats::EViewerAssetCategories asset_to_bin_map[LLViewerAssetType::AT_COUNT] =
+ {
+ LLViewerAssetStats::EVACTextureTempHTTPGet, // (0) AT_TEXTURE
+ LLViewerAssetStats::EVACSoundUDPGet, // AT_SOUND
+ LLViewerAssetStats::EVACOtherGet, // AT_CALLINGCARD
+ LLViewerAssetStats::EVACOtherGet, // AT_LANDMARK
+ LLViewerAssetStats::EVACOtherGet, // AT_SCRIPT
+ LLViewerAssetStats::EVACWearableUDPGet, // AT_CLOTHING
+ LLViewerAssetStats::EVACOtherGet, // AT_OBJECT
+ LLViewerAssetStats::EVACOtherGet, // AT_NOTECARD
+ LLViewerAssetStats::EVACOtherGet, // AT_CATEGORY
+ LLViewerAssetStats::EVACOtherGet, // AT_ROOT_CATEGORY
+ LLViewerAssetStats::EVACOtherGet, // (10) AT_LSL_TEXT
+ LLViewerAssetStats::EVACOtherGet, // AT_LSL_BYTECODE
+ LLViewerAssetStats::EVACOtherGet, // AT_TEXTURE_TGA
+ LLViewerAssetStats::EVACWearableUDPGet, // AT_BODYPART
+ LLViewerAssetStats::EVACOtherGet, // AT_TRASH
+ LLViewerAssetStats::EVACOtherGet, // AT_SNAPSHOT_CATEGORY
+ LLViewerAssetStats::EVACOtherGet, // AT_LOST_AND_FOUND
+ LLViewerAssetStats::EVACSoundUDPGet, // AT_SOUND_WAV
+ LLViewerAssetStats::EVACOtherGet, // AT_IMAGE_TGA
+ LLViewerAssetStats::EVACOtherGet, // AT_IMAGE_JPEG
+ LLViewerAssetStats::EVACGestureUDPGet, // (20) AT_ANIMATION
+ LLViewerAssetStats::EVACGestureUDPGet, // AT_GESTURE
+ LLViewerAssetStats::EVACOtherGet, // AT_SIMSTATE
+ LLViewerAssetStats::EVACOtherGet, // AT_FAVORITE
+ LLViewerAssetStats::EVACOtherGet, // AT_LINK
+ LLViewerAssetStats::EVACOtherGet, // AT_LINK_FOLDER
+ LLViewerAssetStats::EVACOtherGet, //
+ LLViewerAssetStats::EVACOtherGet, //
+ LLViewerAssetStats::EVACOtherGet, //
+ LLViewerAssetStats::EVACOtherGet, //
+ LLViewerAssetStats::EVACOtherGet, // (30)
+ LLViewerAssetStats::EVACOtherGet, //
+ LLViewerAssetStats::EVACOtherGet, //
+ LLViewerAssetStats::EVACOtherGet, //
+ LLViewerAssetStats::EVACOtherGet, //
+ LLViewerAssetStats::EVACOtherGet, //
+ LLViewerAssetStats::EVACOtherGet, //
+ LLViewerAssetStats::EVACOtherGet, //
+ LLViewerAssetStats::EVACOtherGet, //
+ LLViewerAssetStats::EVACOtherGet, //
+ LLViewerAssetStats::EVACOtherGet, // (40)
+ LLViewerAssetStats::EVACOtherGet, //
+ LLViewerAssetStats::EVACOtherGet, //
+ LLViewerAssetStats::EVACOtherGet, //
+ LLViewerAssetStats::EVACOtherGet, //
+ LLViewerAssetStats::EVACOtherGet, //
+ LLViewerAssetStats::EVACOtherGet, //
+ LLViewerAssetStats::EVACOtherGet, //
+ LLViewerAssetStats::EVACOtherGet, //
+ LLViewerAssetStats::EVACOtherGet, // AT_MESH
+ // (50)
+ };
+
+ if (at < 0 || at >= LLViewerAssetType::AT_COUNT)
+ {
+ return LLViewerAssetStats::EVACOtherGet;
+ }
+ LLViewerAssetStats::EViewerAssetCategories ret(asset_to_bin_map[at]);
+ if (LLViewerAssetStats::EVACTextureTempHTTPGet == ret)
+ {
+ // Indexed with [is_temp][with_http]
+ static const LLViewerAssetStats::EViewerAssetCategories texture_bin_map[2][2] =
+ {
+ {
+ LLViewerAssetStats::EVACTextureNonTempUDPGet,
+ LLViewerAssetStats::EVACTextureNonTempHTTPGet,
+ },
+ {
+ LLViewerAssetStats::EVACTextureTempUDPGet,
+ LLViewerAssetStats::EVACTextureTempHTTPGet,
+ }
+ };
+
+ ret = texture_bin_map[is_temp][with_http];
+ }
+ return ret;
+}
+
+} // anonymous namespace
diff --git a/indra/newview/llviewerassetstats.h b/indra/newview/llviewerassetstats.h
new file mode 100644
index 0000000000..73ec5974b2
--- /dev/null
+++ b/indra/newview/llviewerassetstats.h
@@ -0,0 +1,328 @@
+/**
+ * @file llviewerassetstats.h
+ * @brief Client-side collection of asset request statistics
+ *
+ * $LicenseInfo:firstyear=2010&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLVIEWERASSETSTATUS_H
+#define LL_LLVIEWERASSETSTATUS_H
+
+
+#include "linden_common.h"
+
+#include "llpointer.h"
+#include "llrefcount.h"
+#include "llviewerassettype.h"
+#include "llviewerassetstorage.h"
+#include "llsimplestat.h"
+#include "llsd.h"
+
+/**
+ * @class LLViewerAssetStats
+ * @brief Records performance aspects of asset access operations.
+ *
+ * This facility is derived from a very similar simulator-based
+ * one, LLSimAssetStats. It's function is to count asset access
+ * operations and characterize response times. Collected data
+ * are binned in several dimensions:
+ *
+ * - Asset types collapsed into a few aggregated categories
+ * - By simulator UUID
+ * - By transport mechanism (HTTP vs MessageSystem)
+ * - By persistence (temp vs non-temp)
+ *
+ * Statistics collected are fairly basic at this point:
+ *
+ * - Counts of enqueue and dequeue operations
+ * - Min/Max/Mean of asset transfer operations
+ *
+ * This collector differs from the simulator-based on in a
+ * number of ways:
+ *
+ * - The front-end/back-end distinction doesn't exist in viewer
+ * code
+ * - Multiple threads must be safely accomodated in the viewer
+ *
+ * Access to results is by conversion to an LLSD with some standardized
+ * key names. The intent of this structure is that it be emitted as
+ * standard syslog-based metrics formatting where it can be picked
+ * up by interested parties.
+ *
+ * For convenience, a set of free functions in namespace
+ * LLViewerAssetStatsFF is provided for conditional test-and-call
+ * operations.
+ */
+class LLViewerAssetStats
+{
+public:
+ enum EViewerAssetCategories
+ {
+ EVACTextureTempHTTPGet, //< Texture GETs - temp/baked, HTTP
+ EVACTextureTempUDPGet, //< Texture GETs - temp/baked, UDP
+ EVACTextureNonTempHTTPGet, //< Texture GETs - perm, HTTP
+ EVACTextureNonTempUDPGet, //< Texture GETs - perm, UDP
+ EVACWearableUDPGet, //< Wearable GETs
+ EVACSoundUDPGet, //< Sound GETs
+ EVACGestureUDPGet, //< Gesture GETs
+ EVACOtherGet, //< Other GETs
+
+ EVACCount // Must be last
+ };
+
+ /**
+ * Type for duration and other time values in the metrics. Selected
+ * for compatibility with the pre-existing timestamp on the texture
+ * fetcher class, LLTextureFetch.
+ */
+ typedef U64 duration_t;
+
+ /**
+ * Type for the region identifier used in stats. Currently uses
+ * the region handle's type (a U64) rather than the regions's LLUUID
+ * as the latter isn't available immediately.
+ */
+ typedef U64 region_handle_t;
+
+ /**
+ * @brief Collected data for a single region visited by the avatar.
+ *
+ * Fairly simple, for each asset bin enumerated above a count
+ * of enqueue and dequeue operations and simple stats on response
+ * times for completed requests.
+ */
+ class PerRegionStats : public LLRefCount
+ {
+ public:
+ PerRegionStats(const region_handle_t region_handle)
+ : LLRefCount(),
+ mRegionHandle(region_handle)
+ {
+ reset();
+ }
+
+ PerRegionStats(const PerRegionStats & src)
+ : LLRefCount(),
+ mRegionHandle(src.mRegionHandle),
+ mTotalTime(src.mTotalTime),
+ mStartTimestamp(src.mStartTimestamp),
+ mFPS(src.mFPS)
+ {
+ for (int i = 0; i < LL_ARRAY_SIZE(mRequests); ++i)
+ {
+ mRequests[i] = src.mRequests[i];
+ }
+ }
+
+ // Default assignment and destructor are correct.
+
+ void reset();
+
+ void merge(const PerRegionStats & src);
+
+ // Apply current running time to total and reset start point.
+ // Return current timestamp as a convenience.
+ void accumulateTime(duration_t now);
+
+ public:
+ region_handle_t mRegionHandle;
+ duration_t mTotalTime;
+ duration_t mStartTimestamp;
+ LLSimpleStatMMM<> mFPS;
+
+ struct prs_group
+ {
+ LLSimpleStatCounter mEnqueued;
+ LLSimpleStatCounter mDequeued;
+ LLSimpleStatMMM<duration_t> mResponse;
+ }
+ mRequests [EVACCount];
+ };
+
+public:
+ LLViewerAssetStats();
+ LLViewerAssetStats(const LLViewerAssetStats &);
+ // Default destructor is correct.
+ LLViewerAssetStats & operator=(const LLViewerAssetStats &); // Not defined
+
+ // Clear all metrics data. This leaves the currently-active region
+ // in place but with zero'd data for all metrics. All other regions
+ // are removed from the collection map.
+ void reset();
+
+ // Set hidden region argument and establish context for subsequent
+ // collection calls.
+ void setRegion(region_handle_t region_handle);
+
+ // Asset GET Requests
+ void recordGetEnqueued(LLViewerAssetType::EType at, bool with_http, bool is_temp);
+ void recordGetDequeued(LLViewerAssetType::EType at, bool with_http, bool is_temp);
+ void recordGetServiced(LLViewerAssetType::EType at, bool with_http, bool is_temp, duration_t duration);
+
+ // Frames-Per-Second Samples
+ void recordFPS(F32 fps);
+
+ // Merge a source instance into a destination instance. This is
+ // conceptually an 'operator+=()' method:
+ // - counts are added
+ // - minimums are min'd
+ // - maximums are max'd
+ // - other scalars are ignored ('this' wins)
+ //
+ void merge(const LLViewerAssetStats & src);
+
+ // Retrieve current metrics for all visited regions (NULL region UUID/handle excluded)
+ // Returned LLSD is structured as follows:
+ //
+ // &stats_group = {
+ // enqueued : int,
+ // dequeued : int,
+ // resp_count : int,
+ // resp_min : float,
+ // resp_max : float,
+ // resp_mean : float
+ // }
+ //
+ // &mmm_group = {
+ // count : int,
+ // min : float,
+ // max : float,
+ // mean : float
+ // }
+ //
+ // {
+ // duration: int
+ // regions: {
+ // $: { // Keys are strings of the region's handle in hex
+ // duration: : int,
+ // fps: : &mmm_group,
+ // get_texture_temp_http : &stats_group,
+ // get_texture_temp_udp : &stats_group,
+ // get_texture_non_temp_http : &stats_group,
+ // get_texture_non_temp_udp : &stats_group,
+ // get_wearable_udp : &stats_group,
+ // get_sound_udp : &stats_group,
+ // get_gesture_udp : &stats_group,
+ // get_other : &stats_group
+ // }
+ // }
+ // }
+ //
+ // @param compact_output If true, omits from conversion any mmm_block
+ // or stats_block that would contain all zero data.
+ // Useful for transmission when the receiver knows
+ // what is expected and will assume zero for missing
+ // blocks.
+ LLSD asLLSD(bool compact_output);
+
+protected:
+ typedef std::map<region_handle_t, LLPointer<PerRegionStats> > PerRegionContainer;
+
+ // Region of the currently-active region. Always valid but may
+ // be zero after construction or when explicitly set. Unchanged
+ // by a reset() call.
+ region_handle_t mRegionHandle;
+
+ // Pointer to metrics collection for currently-active region. Always
+ // valid and unchanged after reset() though contents will be changed.
+ // Always points to a collection contained in mRegionStats.
+ LLPointer<PerRegionStats> mCurRegionStats;
+
+ // Metrics data for all regions during one collection cycle
+ PerRegionContainer mRegionStats;
+
+ // Time of last reset
+ duration_t mResetTimestamp;
+};
+
+
+/**
+ * Global stats collectors one for each independent thread where
+ * assets and other statistics are gathered. The globals are
+ * expected to be created at startup time and then picked up by
+ * their respective threads afterwards. A set of free functions
+ * are provided to access methods behind the globals while both
+ * minimally disrupting visual flow and supplying a description
+ * of intent.
+ *
+ * Expected thread assignments:
+ *
+ * - Main: main() program execution thread
+ * - Thread1: TextureFetch worker thread
+ */
+extern LLViewerAssetStats * gViewerAssetStatsMain;
+
+extern LLViewerAssetStats * gViewerAssetStatsThread1;
+
+namespace LLViewerAssetStatsFF
+{
+/**
+ * @brief Allocation and deallocation of globals.
+ *
+ * init() should be called before threads are started that will access it though
+ * you'll likely get away with calling it afterwards. cleanup() should only be
+ * called after threads are shutdown to prevent races on the global pointers.
+ */
+void init();
+
+void cleanup();
+
+/**
+ * We have many timers, clocks etc. in the runtime. This is the
+ * canonical timestamp for these metrics which is compatible with
+ * the pre-existing timestamping in the texture fetcher.
+ */
+inline LLViewerAssetStats::duration_t get_timestamp()
+{
+ return LLTimer::getTotalTime();
+}
+
+/**
+ * Region context, event and duration loggers for the Main thread.
+ */
+void set_region_main(LLViewerAssetStats::region_handle_t region_handle);
+
+void record_enqueue_main(LLViewerAssetType::EType at, bool with_http, bool is_temp);
+
+void record_dequeue_main(LLViewerAssetType::EType at, bool with_http, bool is_temp);
+
+void record_response_main(LLViewerAssetType::EType at, bool with_http, bool is_temp,
+ LLViewerAssetStats::duration_t duration);
+
+void record_fps_main(F32 fps);
+
+
+/**
+ * Region context, event and duration loggers for Thread 1.
+ */
+void set_region_thread1(LLViewerAssetStats::region_handle_t region_handle);
+
+void record_enqueue_thread1(LLViewerAssetType::EType at, bool with_http, bool is_temp);
+
+void record_dequeue_thread1(LLViewerAssetType::EType at, bool with_http, bool is_temp);
+
+void record_response_thread1(LLViewerAssetType::EType at, bool with_http, bool is_temp,
+ LLViewerAssetStats::duration_t duration);
+
+} // namespace LLViewerAssetStatsFF
+
+#endif // LL_LLVIEWERASSETSTATUS_H
diff --git a/indra/newview/llviewerassetstorage.cpp b/indra/newview/llviewerassetstorage.cpp
index 2e7ef0fec3..d042f62830 100644
--- a/indra/newview/llviewerassetstorage.cpp
+++ b/indra/newview/llviewerassetstorage.cpp
@@ -33,6 +33,61 @@
#include "message.h"
#include "llagent.h"
+#include "lltransfersourceasset.h"
+#include "lltransfertargetvfile.h"
+#include "llviewerassetstats.h"
+
+///----------------------------------------------------------------------------
+/// LLViewerAssetRequest
+///----------------------------------------------------------------------------
+
+/**
+ * @brief Local class to encapsulate asset fetch requests with a timestamp.
+ *
+ * Derived from the common LLAssetRequest class, this is currently used
+ * only for fetch/get operations and its only function is to wrap remote
+ * asset fetch requests so that they can be timed.
+ */
+class LLViewerAssetRequest : public LLAssetRequest
+{
+public:
+ LLViewerAssetRequest(const LLUUID &uuid, const LLAssetType::EType type)
+ : LLAssetRequest(uuid, type),
+ mMetricsStartTime(0)
+ {
+ }
+
+ LLViewerAssetRequest & operator=(const LLViewerAssetRequest &); // Not defined
+ // Default assignment operator valid
+
+ // virtual
+ ~LLViewerAssetRequest()
+ {
+ recordMetrics();
+ }
+
+protected:
+ void recordMetrics()
+ {
+ if (mMetricsStartTime)
+ {
+ // Okay, it appears this request was used for useful things. Record
+ // the expected dequeue and duration of request processing.
+ LLViewerAssetStatsFF::record_dequeue_main(mType, false, false);
+ LLViewerAssetStatsFF::record_response_main(mType, false, false,
+ (LLViewerAssetStatsFF::get_timestamp()
+ - mMetricsStartTime));
+ mMetricsStartTime = 0;
+ }
+ }
+
+public:
+ LLViewerAssetStats::duration_t mMetricsStartTime;
+};
+
+///----------------------------------------------------------------------------
+/// LLViewerAssetStorage
+///----------------------------------------------------------------------------
LLViewerAssetStorage::LLViewerAssetStorage(LLMessageSystem *msg, LLXferManager *xfer,
LLVFS *vfs, LLVFS *static_vfs,
@@ -61,7 +116,7 @@ void LLViewerAssetStorage::storeAssetData(
F64 timeout)
{
LLAssetID asset_id = tid.makeAssetID(gAgent.getSecureSessionID());
- llinfos << "LLViewerAssetStorage::storeAssetData (legacy) " << tid << ":" << LLAssetType::lookup(asset_type)
+ LL_DEBUGS("AssetStorage") << "LLViewerAssetStorage::storeAssetData (legacy) " << tid << ":" << LLAssetType::lookup(asset_type)
<< " ASSET_ID: " << asset_id << llendl;
if (mUpstreamHost.isOk())
@@ -193,9 +248,9 @@ void LLViewerAssetStorage::storeAssetData(
}
LLAssetID asset_id = tid.makeAssetID(gAgent.getSecureSessionID());
- llinfos << "LLViewerAssetStorage::storeAssetData (legacy)" << asset_id << ":" << LLAssetType::lookup(asset_type) << llendl;
+ LL_DEBUGS("AssetStorage") << "LLViewerAssetStorage::storeAssetData (legacy)" << asset_id << ":" << LLAssetType::lookup(asset_type) << llendl;
- llinfos << "ASSET_ID: " << asset_id << llendl;
+ LL_DEBUGS("AssetStorage") << "ASSET_ID: " << asset_id << llendl;
S32 size = 0;
LLFILE* fp = LLFile::fopen(filename, "rb");
@@ -258,3 +313,77 @@ void LLViewerAssetStorage::storeAssetData(
}
}
}
+
+
+/**
+ * @brief Allocate and queue an asset fetch request for the viewer
+ *
+ * This is a nearly-verbatim copy of the base class's implementation
+ * with the following changes:
+ * - Use a locally-derived request class
+ * - Start timing for metrics when request is queued
+ *
+ * This is an unfortunate implementation choice but it's forced by
+ * current conditions. A refactoring that might clean up the layers
+ * of responsibility or introduce factories or more virtualization
+ * of methods would enable a more attractive solution.
+ *
+ * If LLAssetStorage::_queueDataRequest changes, this must change
+ * as well.
+ */
+
+// virtual
+void LLViewerAssetStorage::_queueDataRequest(
+ const LLUUID& uuid,
+ LLAssetType::EType atype,
+ LLGetAssetCallback callback,
+ void *user_data,
+ BOOL duplicate,
+ BOOL is_priority)
+{
+ if (mUpstreamHost.isOk())
+ {
+ // stash the callback info so we can find it after we get the response message
+ LLViewerAssetRequest *req = new LLViewerAssetRequest(uuid, atype);
+ req->mDownCallback = callback;
+ req->mUserData = user_data;
+ req->mIsPriority = is_priority;
+ if (!duplicate)
+ {
+ // Only collect metrics for non-duplicate requests. Others
+ // are piggy-backing and will artificially lower averages.
+ req->mMetricsStartTime = LLViewerAssetStatsFF::get_timestamp();
+ }
+
+ mPendingDownloads.push_back(req);
+
+ if (!duplicate)
+ {
+ // send request message to our upstream data provider
+ // Create a new asset transfer.
+ LLTransferSourceParamsAsset spa;
+ spa.setAsset(uuid, atype);
+
+ // Set our destination file, and the completion callback.
+ LLTransferTargetParamsVFile tpvf;
+ tpvf.setAsset(uuid, atype);
+ tpvf.setCallback(downloadCompleteCallback, req);
+
+ LL_DEBUGS("AssetStorage") << "Starting transfer for " << uuid << llendl;
+ LLTransferTargetChannel *ttcp = gTransferManager.getTargetChannel(mUpstreamHost, LLTCT_ASSET);
+ ttcp->requestTransfer(spa, tpvf, 100.f + (is_priority ? 1.f : 0.f));
+
+ LLViewerAssetStatsFF::record_enqueue_main(atype, false, false);
+ }
+ }
+ else
+ {
+ // uh-oh, we shouldn't have gotten here
+ llwarns << "Attempt to move asset data request upstream w/o valid upstream provider" << llendl;
+ if (callback)
+ {
+ callback(mVFS, uuid, atype, user_data, LL_ERR_CIRCUIT_GONE, LL_EXSTAT_NO_UPSTREAM);
+ }
+ }
+}
+
diff --git a/indra/newview/llviewerassetstorage.h b/indra/newview/llviewerassetstorage.h
index 6346b79f03..ca9b9943fa 100644
--- a/indra/newview/llviewerassetstorage.h
+++ b/indra/newview/llviewerassetstorage.h
@@ -63,6 +63,17 @@ public:
bool is_priority = false,
bool user_waiting=FALSE,
F64 timeout=LL_ASSET_STORAGE_TIMEOUT);
+
+protected:
+ using LLAssetStorage::_queueDataRequest;
+
+ // virtual
+ void _queueDataRequest(const LLUUID& uuid,
+ LLAssetType::EType type,
+ void (*callback) (LLVFS *vfs, const LLUUID&, LLAssetType::EType, void *, S32, LLExtStat),
+ void *user_data,
+ BOOL duplicate,
+ BOOL is_priority);
};
#endif
diff --git a/indra/newview/llviewerassettype.cpp b/indra/newview/llviewerassettype.cpp
index 9a52422641..a4b1c2155f 100644
--- a/indra/newview/llviewerassettype.cpp
+++ b/indra/newview/llviewerassettype.cpp
@@ -79,6 +79,10 @@ LLViewerAssetDictionary::LLViewerAssetDictionary()
addEntry(LLViewerAssetType::AT_LINK, new ViewerAssetEntry(DAD_LINK));
addEntry(LLViewerAssetType::AT_LINK_FOLDER, new ViewerAssetEntry(DAD_LINK));
+ addEntry(LLViewerAssetType::AT_MESH, new ViewerAssetEntry(DAD_MESH));
+
+ addEntry(LLViewerAssetType::AT_WIDGET, new ViewerAssetEntry(DAD_WIDGET));
+
addEntry(LLViewerAssetType::AT_NONE, new ViewerAssetEntry(DAD_NONE));
};
diff --git a/indra/newview/llvieweraudio.cpp b/indra/newview/llvieweraudio.cpp
index b19c738ed2..2447f5dea8 100644
--- a/indra/newview/llvieweraudio.cpp
+++ b/indra/newview/llvieweraudio.cpp
@@ -36,9 +36,227 @@
#include "llviewerwindow.h"
#include "llvoiceclient.h"
#include "llviewermedia.h"
+#include "llprogressview.h"
+#include "llcallbacklist.h"
+#include "llstartup.h"
+#include "llviewerparcelmgr.h"
+#include "llparcel.h"
/////////////////////////////////////////////////////////
+LLViewerAudio::LLViewerAudio() :
+ mDone(true),
+ mFadeState(FADE_IDLE),
+ mFadeTime(),
+ mIdleListnerActive(false),
+ mForcedTeleportFade(false)
+{
+ mTeleportFailedConnection = LLViewerParcelMgr::getInstance()->
+ setTeleportFailedCallback(boost::bind(&LLViewerAudio::onTeleportFailed, this));
+}
+
+LLViewerAudio::~LLViewerAudio()
+{
+ mTeleportFailedConnection.disconnect();
+}
+
+void LLViewerAudio::registerIdleListener()
+{
+ if(mIdleListnerActive==false)
+ {
+ mIdleListnerActive = true;
+ doOnIdleRepeating(boost::bind(boost::bind(&LLViewerAudio::onIdleUpdate, this)));
+ }
+
+}
+
+void LLViewerAudio::startInternetStreamWithAutoFade(std::string streamURI)
+{
+ // Old and new stream are identical
+ if (mNextStreamURI == streamURI)
+ {
+ return;
+ }
+
+ // Record the URI we are going to be switching to
+ mNextStreamURI = streamURI;
+
+ switch (mFadeState)
+ {
+ case FADE_IDLE:
+ // If a stream is playing fade it out first
+ if (!gAudiop->getInternetStreamURL().empty())
+ {
+ // The order of these tests is important, state FADE_OUT will be processed below
+ mFadeState = FADE_OUT;
+ }
+ // Otherwise the new stream can be faded in
+ else
+ {
+ mFadeState = FADE_IN;
+ gAudiop->startInternetStream(mNextStreamURI);
+ startFading();
+ registerIdleListener();
+ break;
+ }
+
+ case FADE_OUT:
+ startFading();
+ registerIdleListener();
+ break;
+
+ case FADE_IN:
+ registerIdleListener();
+ break;
+
+ default:
+ llwarns << "Unknown fading state: " << mFadeState << llendl;
+ break;
+ }
+}
+
+// A return of false from onIdleUpdate means it will be called again next idle update.
+// A return of true means we have finished with it and the callback will be deleted.
+bool LLViewerAudio::onIdleUpdate()
+{
+ bool fadeIsFinished = false;
+
+ // There is a delay in the login sequence between when the parcel information has
+ // arrived and the music stream is started and when the audio system is called to set
+ // initial volume levels. This code extends the fade time so you hear a full fade in.
+ if ((LLStartUp::getStartupState() < STATE_STARTED))
+ {
+ stream_fade_timer.reset();
+ stream_fade_timer.setTimerExpirySec(mFadeTime);
+ }
+
+ if (mDone)
+ {
+ // This should be a rare or never occurring state.
+ if (mFadeState == FADE_IDLE)
+ {
+ deregisterIdleListener();
+ fadeIsFinished = true; // Stop calling onIdleUpdate
+ }
+
+ // we have finished the current fade operation
+ if (mFadeState == FADE_OUT)
+ {
+ // Clear URI
+ gAudiop->startInternetStream(LLStringUtil::null);
+ gAudiop->stopInternetStream();
+
+ if (!mNextStreamURI.empty())
+ {
+ mFadeState = FADE_IN;
+ gAudiop->startInternetStream(mNextStreamURI);
+ startFading();
+ }
+ else
+ {
+ mFadeState = FADE_IDLE;
+ deregisterIdleListener();
+ fadeIsFinished = true; // Stop calling onIdleUpdate
+ }
+ }
+ else if (mFadeState == FADE_IN)
+ {
+ if (mNextStreamURI != gAudiop->getInternetStreamURL())
+ {
+ mFadeState = FADE_OUT;
+ startFading();
+ }
+ else
+ {
+ mFadeState = FADE_IDLE;
+ deregisterIdleListener();
+ fadeIsFinished = true; // Stop calling onIdleUpdate
+ }
+ }
+ }
+
+ return fadeIsFinished;
+}
+
+void LLViewerAudio::stopInternetStreamWithAutoFade()
+{
+ mFadeState = FADE_IDLE;
+ mNextStreamURI = LLStringUtil::null;
+ mDone = true;
+
+ gAudiop->startInternetStream(LLStringUtil::null);
+ gAudiop->stopInternetStream();
+}
+
+void LLViewerAudio::startFading()
+{
+ const F32 AUDIO_MUSIC_FADE_IN_TIME = 3.0f;
+ const F32 AUDIO_MUSIC_FADE_OUT_TIME = 2.0f;
+ // This minimum fade time prevents divide by zero and negative times
+ const F32 AUDIO_MUSIC_MINIMUM_FADE_TIME = 0.01f;
+
+ if(mDone)
+ {
+ // The fade state here should only be one of FADE_IN or FADE_OUT, but, in case it is not,
+ // rather than check for both states assume a fade in and check for the fade out case.
+ mFadeTime = AUDIO_MUSIC_FADE_IN_TIME;
+ if (LLViewerAudio::getInstance()->getFadeState() == LLViewerAudio::FADE_OUT)
+ {
+ mFadeTime = AUDIO_MUSIC_FADE_OUT_TIME;
+ }
+
+ // Prevent invalid fade time
+ mFadeTime = llmax(mFadeTime, AUDIO_MUSIC_MINIMUM_FADE_TIME);
+
+ stream_fade_timer.reset();
+ stream_fade_timer.setTimerExpirySec(mFadeTime);
+ mDone = false;
+ }
+}
+
+F32 LLViewerAudio::getFadeVolume()
+{
+ F32 fade_volume = 1.0f;
+
+ if (stream_fade_timer.hasExpired())
+ {
+ mDone = true;
+ // If we have been fading out set volume to 0 until the next fade state occurs to prevent
+ // an audio transient.
+ if (LLViewerAudio::getInstance()->getFadeState() == LLViewerAudio::FADE_OUT)
+ {
+ fade_volume = 0.0f;
+ }
+ }
+
+ if (!mDone)
+ {
+ // Calculate how far we are into the fade time
+ fade_volume = stream_fade_timer.getElapsedTimeF32() / mFadeTime;
+
+ if (LLViewerAudio::getInstance()->getFadeState() == LLViewerAudio::FADE_OUT)
+ {
+ // If we are not fading in then we are fading out, so invert the fade
+ // direction; start loud and move towards zero volume.
+ fade_volume = 1.0f - fade_volume;
+ }
+ }
+
+ return fade_volume;
+}
+
+void LLViewerAudio::onTeleportFailed()
+{
+ if (gAudiop)
+ {
+ LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
+ if (parcel)
+ {
+ mNextStreamURI = parcel->getMusicURL();
+ }
+ }
+}
+
void init_audio()
{
if (!gAudiop)
@@ -101,7 +319,16 @@ void audio_update_volume(bool force_update)
{
F32 master_volume = gSavedSettings.getF32("AudioLevelMaster");
BOOL mute_audio = gSavedSettings.getBOOL("MuteAudio");
- if (!gViewerWindow->getActive() && (gSavedSettings.getBOOL("MuteWhenMinimized")))
+
+ LLProgressView* progress = gViewerWindow->getProgressView();
+ BOOL progress_view_visible = FALSE;
+
+ if (progress)
+ {
+ progress_view_visible = progress->getVisible();
+ }
+
+ if (!gViewerWindow->getActive() && gSavedSettings.getBOOL("MuteWhenMinimized"))
{
mute_audio = TRUE;
}
@@ -114,7 +341,7 @@ void audio_update_volume(bool force_update)
gAudiop->setDopplerFactor(gSavedSettings.getF32("AudioLevelDoppler"));
gAudiop->setRolloffFactor(gSavedSettings.getF32("AudioLevelRolloff"));
- gAudiop->setMuted(mute_audio);
+ gAudiop->setMuted(mute_audio || progress_view_visible);
if (force_update)
{
@@ -132,12 +359,25 @@ void audio_update_volume(bool force_update)
// Streaming Music
if (gAudiop)
- {
+ {
+ if (progress_view_visible && !LLViewerAudio::getInstance()->getForcedTeleportFade())
+ {
+ LLViewerAudio::getInstance()->setForcedTeleportFade(true);
+ LLViewerAudio::getInstance()->startInternetStreamWithAutoFade(LLStringUtil::null);
+ LLViewerAudio::getInstance()->setNextStreamURI(LLStringUtil::null);
+ }
+
+ if (!progress_view_visible && LLViewerAudio::getInstance()->getForcedTeleportFade() == true)
+ {
+ LLViewerAudio::getInstance()->setForcedTeleportFade(false);
+ }
+
F32 music_volume = gSavedSettings.getF32("AudioLevelMusic");
BOOL music_muted = gSavedSettings.getBOOL("MuteMusic");
- music_volume = mute_volume * master_volume * music_volume;
- gAudiop->setInternetStreamGain ( music_muted ? 0.f : music_volume );
-
+ F32 fade_volume = LLViewerAudio::getInstance()->getFadeVolume();
+
+ music_volume = mute_volume * master_volume * music_volume * fade_volume;
+ gAudiop->setInternetStreamGain (music_muted ? 0.f : music_volume);
}
// Streaming Media
diff --git a/indra/newview/llvieweraudio.h b/indra/newview/llvieweraudio.h
index e5916285fb..a3da9fc6b8 100644
--- a/indra/newview/llvieweraudio.h
+++ b/indra/newview/llvieweraudio.h
@@ -27,6 +27,9 @@
#ifndef LL_VIEWERAUDIO_H
#define LL_VIEWERAUDIO_H
+#include "llframetimer.h"
+#include "llsingleton.h"
+
// comment out to turn off wind
#define kAUDIO_ENABLE_WIND
//#define kAUDIO_ENABLE_WATER 1 // comment out to turn off water
@@ -38,4 +41,48 @@ void audio_update_volume(bool force_update = true);
void audio_update_listener();
void audio_update_wind(bool force_update = true);
+class LLViewerAudio : public LLSingleton<LLViewerAudio>
+{
+public:
+
+ enum EFadeState
+ {
+ FADE_IDLE,
+ FADE_IN,
+ FADE_OUT,
+ };
+
+ LLViewerAudio();
+ virtual ~LLViewerAudio();
+
+ void startInternetStreamWithAutoFade(std::string streamURI);
+ void stopInternetStreamWithAutoFade();
+
+ bool onIdleUpdate();
+
+ EFadeState getFadeState() { return mFadeState; }
+ bool isDone() { return mDone; };
+ F32 getFadeVolume();
+ bool getForcedTeleportFade() { return mForcedTeleportFade; };
+ void setForcedTeleportFade(bool fade) { mForcedTeleportFade = fade;} ;
+ void setNextStreamURI(std::string stream) { mNextStreamURI = stream; } ;
+
+private:
+
+ bool mDone;
+ F32 mFadeTime;
+ std::string mNextStreamURI;
+ EFadeState mFadeState;
+ LLFrameTimer stream_fade_timer;
+ bool mIdleListnerActive;
+ bool mForcedTeleportFade;
+ boost::signals2::connection mTeleportFailedConnection;
+
+ void registerIdleListener();
+ void deregisterIdleListener() { mIdleListnerActive = false; };
+ void startFading();
+ void onTeleportFailed();
+
+};
+
#endif //LL_VIEWER_H
diff --git a/indra/newview/llviewercamera.cpp b/indra/newview/llviewercamera.cpp
index cbb1d25f78..a437a8b3b5 100644
--- a/indra/newview/llviewercamera.cpp
+++ b/indra/newview/llviewercamera.cpp
@@ -32,6 +32,7 @@
// Viewer includes
#include "llagent.h"
#include "llagentcamera.h"
+#include "llmatrix4a.h"
#include "llviewercontrol.h"
#include "llviewerobjectlist.h"
#include "llviewerregion.h"
@@ -217,8 +218,15 @@ void LLViewerCamera::calcProjection(const F32 far_distance) const
void LLViewerCamera::updateFrustumPlanes(LLCamera& camera, BOOL ortho, BOOL zflip, BOOL no_hacks)
{
GLint* viewport = (GLint*) gGLViewport;
- GLdouble* model = gGLModelView;
- GLdouble* proj = gGLProjection;
+ F64 model[16];
+ F64 proj[16];
+
+ for (U32 i = 0; i < 16; i++)
+ {
+ model[i] = (F64) gGLModelView[i];
+ proj[i] = (F64) gGLProjection[i];
+ }
+
GLdouble objX,objY,objZ;
LLVector3 frust[8];
@@ -324,8 +332,8 @@ void LLViewerCamera::setPerspective(BOOL for_selection,
aspect = getAspect();
// Load camera view matrix
- glMatrixMode( GL_PROJECTION );
- glLoadIdentity();
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.loadIdentity();
glh::matrix4f proj_mat;
@@ -384,14 +392,14 @@ void LLViewerCamera::setPerspective(BOOL for_selection,
proj_mat *= gl_perspective(fov_y,aspect,z_near,z_far);
- glLoadMatrixf(proj_mat.m);
+ gGL.loadMatrix(proj_mat.m);
for (U32 i = 0; i < 16; i++)
{
gGLProjection[i] = proj_mat.m[i];
}
- glMatrixMode( GL_MODELVIEW );
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
glh::matrix4f modelview((GLfloat*) OGL_TO_CFR_ROTATION);
@@ -401,7 +409,7 @@ void LLViewerCamera::setPerspective(BOOL for_selection,
modelview *= glh::matrix4f(ogl_matrix);
- glLoadMatrixf(modelview.m);
+ gGL.loadMatrix(modelview.m);
if (for_selection && (width > 1 || height > 1))
{
@@ -419,7 +427,6 @@ void LLViewerCamera::setPerspective(BOOL for_selection,
if (!for_selection && mZoomFactor == 1.f)
{
// Save GL matrices for access elsewhere in code, especially project_world_to_screen
- //glGetDoublev(GL_MODELVIEW_MATRIX, gGLModelView);
for (U32 i = 0; i < 16; i++)
{
gGLModelView[i] = modelview.m[i];
@@ -427,14 +434,6 @@ void LLViewerCamera::setPerspective(BOOL for_selection,
}
updateFrustumPlanes(*this);
-
- /*if (gSavedSettings.getBOOL("CameraOffset"))
- {
- glMatrixMode(GL_PROJECTION);
- glTranslatef(0,0,-50);
- glRotatef(20.0,1,0,0);
- glMatrixMode(GL_MODELVIEW);
- }*/
}
@@ -442,11 +441,20 @@ void LLViewerCamera::setPerspective(BOOL for_selection,
// screen coordinates to the agent's region.
void LLViewerCamera::projectScreenToPosAgent(const S32 screen_x, const S32 screen_y, LLVector3* pos_agent) const
{
-
GLdouble x, y, z;
+
+ F64 mdlv[16];
+ F64 proj[16];
+
+ for (U32 i = 0; i < 16; i++)
+ {
+ mdlv[i] = (F64) gGLModelView[i];
+ proj[i] = (F64) gGLProjection[i];
+ }
+
gluUnProject(
GLdouble(screen_x), GLdouble(screen_y), 0.0,
- gGLModelView, gGLProjection, (GLint*)gGLViewport,
+ mdlv, proj, (GLint*)gGLViewport,
&x,
&y,
&z );
@@ -483,8 +491,17 @@ BOOL LLViewerCamera::projectPosAgentToScreen(const LLVector3 &pos_agent, LLCoord
viewport[2] = world_view_rect.getWidth();
viewport[3] = world_view_rect.getHeight();
+ F64 mdlv[16];
+ F64 proj[16];
+
+ for (U32 i = 0; i < 16; i++)
+ {
+ mdlv[i] = (F64) gGLModelView[i];
+ proj[i] = (F64) gGLProjection[i];
+ }
+
if (GL_TRUE == gluProject(pos_agent.mV[VX], pos_agent.mV[VY], pos_agent.mV[VZ],
- gGLModelView, gGLProjection, (GLint*)viewport,
+ mdlv, proj, (GLint*)viewport,
&x, &y, &z))
{
// convert screen coordinates to virtual UI coordinates
@@ -586,9 +603,19 @@ BOOL LLViewerCamera::projectPosAgentToScreenEdge(const LLVector3 &pos_agent,
viewport[2] = world_view_rect.getWidth();
viewport[3] = world_view_rect.getHeight();
GLdouble x, y, z; // object's window coords, GL-style
+
+ F64 mdlv[16];
+ F64 proj[16];
+
+ for (U32 i = 0; i < 16; i++)
+ {
+ mdlv[i] = (F64) gGLModelView[i];
+ proj[i] = (F64) gGLProjection[i];
+ }
+
if (GL_TRUE == gluProject(pos_agent.mV[VX], pos_agent.mV[VY],
- pos_agent.mV[VZ], gGLModelView,
- gGLProjection, (GLint*)viewport,
+ pos_agent.mV[VZ], mdlv,
+ proj, (GLint*)viewport,
&x, &y, &z))
{
x /= gViewerWindow->getDisplayScale().mV[VX];
@@ -755,6 +782,10 @@ LLVector3 LLViewerCamera::roundToPixel(const LLVector3 &pos_agent)
BOOL LLViewerCamera::cameraUnderWater() const
{
+ if(!gAgent.getRegion())
+ {
+ return FALSE ;
+ }
return getOrigin().mV[VZ] < gAgent.getRegion()->getWaterHeight();
}
@@ -781,21 +812,29 @@ BOOL LLViewerCamera::areVertsVisible(LLViewerObject* volumep, BOOL all_verts)
LLMatrix4 render_mat(vo_volume->getRenderRotation(), LLVector4(vo_volume->getRenderPosition()));
+ LLMatrix4a render_mata;
+ render_mata.loadu(render_mat);
+ LLMatrix4a mata;
+ mata.loadu(mat);
+
num_faces = volume->getNumVolumeFaces();
for (i = 0; i < num_faces; i++)
{
const LLVolumeFace& face = volume->getVolumeFace(i);
- for (U32 v = 0; v < face.mVertices.size(); v++)
+ for (U32 v = 0; v < face.mNumVertices; v++)
{
- LLVector4 vec = LLVector4(face.mVertices[v].mPosition) * mat;
+ const LLVector4a& src_vec = face.mPositions[v];
+ LLVector4a vec;
+ mata.affineTransform(src_vec, vec);
if (drawablep->isActive())
{
- vec = vec * render_mat;
+ LLVector4a t = vec;
+ render_mata.affineTransform(t, vec);
}
- BOOL in_frustum = pointInFrustum(LLVector3(vec)) > 0;
+ BOOL in_frustum = pointInFrustum(LLVector3(vec.getF32ptr())) > 0;
if (( !in_frustum && all_verts) ||
(in_frustum && !all_verts))
diff --git a/indra/newview/llviewercamera.h b/indra/newview/llviewercamera.h
index cc3395115b..184033de42 100644
--- a/indra/newview/llviewercamera.h
+++ b/indra/newview/llviewercamera.h
@@ -32,8 +32,8 @@
#include "llstat.h"
#include "lltimer.h"
#include "m4math.h"
+#include "llcoord.h"
-class LLCoordGL;
class LLViewerObject;
// This rotation matrix moves the default OpenGL reference frame
diff --git a/indra/newview/llviewerchat.cpp b/indra/newview/llviewerchat.cpp
index 0af850a46b..93687dbd5f 100644
--- a/indra/newview/llviewerchat.cpp
+++ b/indra/newview/llviewerchat.cpp
@@ -29,11 +29,16 @@
// newview includes
#include "llagent.h" // gAgent
+#include "llslurl.h"
+#include "lluicolor.h"
#include "lluicolortable.h"
#include "llviewercontrol.h" // gSavedSettings
+#include "llviewerregion.h"
+#include "llworld.h"
#include "llinstantmessage.h" //SYSTEM_FROM
// LLViewerChat
+LLViewerChat::font_change_signal_t LLViewerChat::sChatFontChangedSignal;
//static
void LLViewerChat::getChatColor(const LLChat& chat, LLColor4& r_color)
@@ -75,6 +80,10 @@ void LLViewerChat::getChatColor(const LLChat& chat, LLColor4& r_color)
{
r_color = LLUIColorTable::instance().getColor("llOwnerSayChatColor");
}
+ else if ( chat.mChatType == CHAT_TYPE_DIRECT )
+ {
+ r_color = LLUIColorTable::instance().getColor("DirectChatColor");
+ }
else
{
r_color = LLUIColorTable::instance().getColor("ObjectChatColor");
@@ -87,8 +96,9 @@ void LLViewerChat::getChatColor(const LLChat& chat, LLColor4& r_color)
if (!chat.mPosAgent.isExactlyZero())
{
LLVector3 pos_agent = gAgent.getPositionAgent();
- F32 distance = dist_vec(pos_agent, chat.mPosAgent);
- if (distance > gAgent.getNearChatRadius())
+ F32 distance_squared = dist_vec_squared(pos_agent, chat.mPosAgent);
+ F32 dist_near_chat = gAgent.getNearChatRadius();
+ if (distance_squared > dist_near_chat * dist_near_chat)
{
// diminish far-off chat
r_color.mV[VALPHA] = 0.8f;
@@ -140,6 +150,10 @@ void LLViewerChat::getChatColor(const LLChat& chat, std::string& r_color_name, F
{
r_color_name = "llOwnerSayChatColor";
}
+ else if ( chat.mChatType == CHAT_TYPE_DIRECT )
+ {
+ r_color_name = "DirectChatColor";
+ }
else
{
r_color_name = "ObjectChatColor";
@@ -152,8 +166,9 @@ void LLViewerChat::getChatColor(const LLChat& chat, std::string& r_color_name, F
if (!chat.mPosAgent.isExactlyZero())
{
LLVector3 pos_agent = gAgent.getPositionAgent();
- F32 distance = dist_vec(pos_agent, chat.mPosAgent);
- if (distance > gAgent.getNearChatRadius())
+ F32 distance_squared = dist_vec_squared(pos_agent, chat.mPosAgent);
+ F32 dist_near_chat = gAgent.getNearChatRadius();
+ if (distance_squared > dist_near_chat * dist_near_chat)
{
// diminish far-off chat
r_color_alpha = 0.8f;
@@ -214,3 +229,56 @@ void LLViewerChat::formatChatMsg(const LLChat& chat, std::string& formated_msg)
}
+//static
+std::string LLViewerChat::getSenderSLURL(const LLChat& chat, const LLSD& args)
+{
+ switch (chat.mSourceType)
+ {
+ case CHAT_SOURCE_AGENT:
+ return LLSLURL("agent", chat.mFromID, "about").getSLURLString();
+
+ case CHAT_SOURCE_OBJECT:
+ return getObjectImSLURL(chat, args);
+
+ default:
+ llwarns << "Getting SLURL for an unsupported sender type: " << chat.mSourceType << llendl;
+ }
+
+ return LLStringUtil::null;
+}
+
+//static
+std::string LLViewerChat::getObjectImSLURL(const LLChat& chat, const LLSD& args)
+{
+ std::string url = LLSLURL("objectim", chat.mFromID, "").getSLURLString();
+ url += "?name=" + chat.mFromName;
+ url += "&owner=" + chat.mOwnerID.asString();
+
+ std::string slurl = args["slurl"].asString();
+ if (slurl.empty())
+ {
+ LLViewerRegion *region = LLWorld::getInstance()->getRegionFromPosAgent(chat.mPosAgent);
+ if(region)
+ {
+ LLSLURL region_slurl(region->getName(), chat.mPosAgent);
+ slurl = region_slurl.getLocationString();
+ }
+ }
+
+ url += "&slurl=" + LLURI::escape(slurl);
+
+ return url;
+}
+
+//static
+boost::signals2::connection LLViewerChat::setFontChangedCallback(const font_change_signal_t::slot_type& cb)
+{
+ return sChatFontChangedSignal.connect(cb);
+}
+
+//static
+void LLViewerChat::signalChatFontChanged()
+{
+ // Notify all observers that our font has changed
+ sChatFontChangedSignal(getChatFont());
+}
diff --git a/indra/newview/llviewerchat.h b/indra/newview/llviewerchat.h
index a9f9a98960..c05caf0a95 100644
--- a/indra/newview/llviewerchat.h
+++ b/indra/newview/llviewerchat.h
@@ -35,11 +35,21 @@
class LLViewerChat
{
public:
+ typedef boost::signals2::signal<void (LLFontGL*)> font_change_signal_t;
+
static void getChatColor(const LLChat& chat, LLColor4& r_color);
static void getChatColor(const LLChat& chat, std::string& r_color_name, F32& r_color_alpha);
static LLFontGL* getChatFont();
static S32 getChatFontSize();
static void formatChatMsg(const LLChat& chat, std::string& formated_msg);
+ static std::string getSenderSLURL(const LLChat& chat, const LLSD& args);
+
+ static boost::signals2::connection setFontChangedCallback(const font_change_signal_t::slot_type& cb);
+ static void signalChatFontChanged();
+
+private:
+ static std::string getObjectImSLURL(const LLChat& chat, const LLSD& args);
+ static font_change_signal_t sChatFontChangedSignal;
};
diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp
index 622d09c600..ab45aae5cc 100644
--- a/indra/newview/llviewercontrol.cpp
+++ b/indra/newview/llviewercontrol.cpp
@@ -57,6 +57,7 @@
#include "llworld.h"
#include "pipeline.h"
#include "llviewerjoystick.h"
+#include "llviewerobjectlist.h"
#include "llviewerparcelmgr.h"
#include "llparcel.h"
#include "llkeyboard.h"
@@ -117,17 +118,53 @@ static bool handleSetShaderChanged(const LLSD& newvalue)
gBumpImageList.destroyGL();
gBumpImageList.restoreGL();
- // Changing shader also changes the terrain detail to high, reflect that change here
- if (newvalue.asBoolean())
- {
- // shaders enabled, set terrain detail to high
- gSavedSettings.setS32("RenderTerrainDetail", 1);
- }
// else, leave terrain detail as is
LLViewerShaderMgr::instance()->setShaders();
return true;
}
+static bool handleRenderPerfTestChanged(const LLSD& newvalue)
+{
+ bool status = !newvalue.asBoolean();
+ if (!status)
+ {
+ gPipeline.clearRenderTypeMask(LLPipeline::RENDER_TYPE_WL_SKY,
+ LLPipeline::RENDER_TYPE_GROUND,
+ LLPipeline::RENDER_TYPE_TERRAIN,
+ LLPipeline::RENDER_TYPE_GRASS,
+ LLPipeline::RENDER_TYPE_TREE,
+ LLPipeline::RENDER_TYPE_WATER,
+ LLPipeline::RENDER_TYPE_PASS_GRASS,
+ LLPipeline::RENDER_TYPE_HUD,
+ LLPipeline::RENDER_TYPE_CLOUDS,
+ LLPipeline::RENDER_TYPE_HUD_PARTICLES,
+ LLPipeline::END_RENDER_TYPES);
+ gPipeline.setRenderDebugFeatureControl(LLPipeline::RENDER_DEBUG_FEATURE_UI, false);
+ }
+ else
+ {
+ gPipeline.setRenderTypeMask(LLPipeline::RENDER_TYPE_WL_SKY,
+ LLPipeline::RENDER_TYPE_GROUND,
+ LLPipeline::RENDER_TYPE_TERRAIN,
+ LLPipeline::RENDER_TYPE_GRASS,
+ LLPipeline::RENDER_TYPE_TREE,
+ LLPipeline::RENDER_TYPE_WATER,
+ LLPipeline::RENDER_TYPE_PASS_GRASS,
+ LLPipeline::RENDER_TYPE_HUD,
+ LLPipeline::RENDER_TYPE_CLOUDS,
+ LLPipeline::RENDER_TYPE_HUD_PARTICLES,
+ LLPipeline::END_RENDER_TYPES);
+ gPipeline.setRenderDebugFeatureControl(LLPipeline::RENDER_DEBUG_FEATURE_UI, true);
+ }
+
+ return true;
+}
+
+bool handleRenderAvatarComplexityLimitChanged(const LLSD& newvalue)
+{
+ return true;
+}
+
bool handleRenderTransparentWaterChanged(const LLSD& newvalue)
{
LLWorld::getInstance()->updateWaterObjects();
@@ -144,6 +181,16 @@ static bool handleReleaseGLBufferChanged(const LLSD& newvalue)
return true;
}
+static bool handleLUTBufferChanged(const LLSD& newvalue)
+{
+ if (gPipeline.isInit())
+ {
+ gPipeline.releaseLUTBuffers();
+ gPipeline.createLUTBuffers();
+ }
+ return true;
+}
+
static bool handleAnisotropicChanged(const LLSD& newvalue)
{
LLImageGL::sGlobalUseAnisotropic = newvalue.asBoolean();
@@ -164,6 +211,12 @@ static bool handleAvatarLODChanged(const LLSD& newvalue)
return true;
}
+static bool handleAvatarPhysicsLODChanged(const LLSD& newvalue)
+{
+ LLVOAvatar::sPhysicsLODFactor = (F32) newvalue.asReal();
+ return true;
+}
+
static bool handleAvatarMaxVisibleChanged(const LLSD& newvalue)
{
LLVOAvatar::sMaxVisible = (U32) newvalue.asInteger();
@@ -233,12 +286,6 @@ static bool handleVideoMemoryChanged(const LLSD& newvalue)
return true;
}
-static bool handleBandwidthChanged(const LLSD& newvalue)
-{
- gViewerThrottle.setMaxBandwidth((F32) newvalue.asReal());
- return true;
-}
-
static bool handleChatFontSizeChanged(const LLSD& newvalue)
{
if(gConsole)
@@ -300,29 +347,30 @@ static bool handleNumpadControlChanged(const LLSD& newvalue)
return true;
}
-static bool handleRenderUseVBOChanged(const LLSD& newvalue)
+static bool handleWLSkyDetailChanged(const LLSD&)
{
- if (gPipeline.isInit())
+ if (gSky.mVOWLSkyp.notNull())
{
- gPipeline.setUseVBO(newvalue.asBoolean());
+ gSky.mVOWLSkyp->updateGeometry(gSky.mVOWLSkyp->mDrawable);
}
return true;
}
-static bool handleWLSkyDetailChanged(const LLSD&)
+static bool handleResetVertexBuffersChanged(const LLSD&)
{
- if (gSky.mVOWLSkyp.notNull())
+ if (gPipeline.isInit())
{
- gSky.mVOWLSkyp->updateGeometry(gSky.mVOWLSkyp->mDrawable);
+ gPipeline.resetVertexBuffers();
}
return true;
}
-static bool handleResetVertexBuffersChanged(const LLSD&)
+static bool handleRepartition(const LLSD&)
{
if (gPipeline.isInit())
{
- gPipeline.resetVertexBuffers();
+ gOctreeMaxCapacity = gSavedSettings.getU32("OctreeMaxNodeCapacity");
+ gObjectList.repartitionObjects();
}
return true;
}
@@ -333,14 +381,23 @@ static bool handleRenderDynamicLODChanged(const LLSD& newvalue)
return true;
}
-static bool handleRenderUseFBOChanged(const LLSD& newvalue)
+static bool handleRenderLocalLightsChanged(const LLSD& newvalue)
+{
+ gPipeline.setLightingDetail(-1);
+ return true;
+}
+
+static bool handleRenderDeferredChanged(const LLSD& newvalue)
{
LLRenderTarget::sUseFBO = newvalue.asBoolean();
if (gPipeline.isInit())
{
+ LLPipeline::refreshCachedSettings();
+ gPipeline.updateRenderDeferred();
gPipeline.releaseGLBuffers();
gPipeline.createGLBuffers();
- if (LLPipeline::sRenderDeferred && LLRenderTarget::sUseFBO)
+ gPipeline.resetVertexBuffers();
+ if (LLPipeline::sRenderDeferred == (BOOL)LLRenderTarget::sUseFBO)
{
LLViewerShaderMgr::instance()->setShaders();
}
@@ -405,12 +462,6 @@ bool handleEffectColorChanged(const LLSD& newvalue)
return true;
}
-bool handleVectorizeChanged(const LLSD& newvalue)
-{
- LLViewerJointMesh::updateVectorize();
- return true;
-}
-
bool handleHighResSnapshotChanged(const LLSD& newvalue)
{
// High Res Snapshot active, must uncheck RenderUIInSnapshot
@@ -474,18 +525,12 @@ bool toggle_show_navigation_panel(const LLSD& newvalue)
{
bool value = newvalue.asBoolean();
- LLNavigationBar::getInstance()->showNavigationPanel(value);
+ LLNavigationBar::getInstance()->setVisible(value);
gSavedSettings.setBOOL("ShowMiniLocationPanel", !value);
return true;
}
-bool toggle_show_favorites_panel(const LLSD& newvalue)
-{
- LLNavigationBar::getInstance()->showFavoritesPanel(newvalue.asBoolean());
- return true;
-}
-
bool toggle_show_mini_location_panel(const LLSD& newvalue)
{
bool value = newvalue.asBoolean();
@@ -502,11 +547,12 @@ bool toggle_show_object_render_cost(const LLSD& newvalue)
return true;
}
-void toggle_updater_service_active(LLControlVariable* control, const LLSD& new_value)
+void toggle_updater_service_active(const LLSD& new_value)
{
- if(new_value.asBoolean())
+ if(new_value.asInteger())
{
- LLUpdaterService().startChecking();
+ LLUpdaterService update_service;
+ if(!update_service.isChecking()) update_service.startChecking();
}
else
{
@@ -521,50 +567,56 @@ void settings_setup_listeners()
gSavedSettings.getControl("FirstPersonAvatarVisible")->getSignal()->connect(boost::bind(&handleRenderAvatarMouselookChanged, _2));
gSavedSettings.getControl("RenderFarClip")->getSignal()->connect(boost::bind(&handleRenderFarClipChanged, _2));
gSavedSettings.getControl("RenderTerrainDetail")->getSignal()->connect(boost::bind(&handleTerrainDetailChanged, _2));
+ gSavedSettings.getControl("OctreeStaticObjectSizeFactor")->getSignal()->connect(boost::bind(&handleRepartition, _2));
+ gSavedSettings.getControl("OctreeDistanceFactor")->getSignal()->connect(boost::bind(&handleRepartition, _2));
+ gSavedSettings.getControl("OctreeMaxNodeCapacity")->getSignal()->connect(boost::bind(&handleRepartition, _2));
+ gSavedSettings.getControl("OctreeAlphaDistanceFactor")->getSignal()->connect(boost::bind(&handleRepartition, _2));
+ gSavedSettings.getControl("OctreeAttachmentSizeFactor")->getSignal()->connect(boost::bind(&handleRepartition, _2));
+ gSavedSettings.getControl("RenderMaxTextureIndex")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
gSavedSettings.getControl("RenderUseTriStrips")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2));
- gSavedSettings.getControl("RenderAnimateTrees")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2));
gSavedSettings.getControl("RenderAvatarVP")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
gSavedSettings.getControl("VertexShaderEnable")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
gSavedSettings.getControl("RenderUIBuffer")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2));
- gSavedSettings.getControl("RenderSpecularResX")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2));
- gSavedSettings.getControl("RenderSpecularResY")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2));
- gSavedSettings.getControl("RenderSpecularExponent")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2));
+ gSavedSettings.getControl("RenderDepthOfField")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2));
gSavedSettings.getControl("RenderFSAASamples")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2));
+ gSavedSettings.getControl("RenderSpecularResX")->getSignal()->connect(boost::bind(&handleLUTBufferChanged, _2));
+ gSavedSettings.getControl("RenderSpecularResY")->getSignal()->connect(boost::bind(&handleLUTBufferChanged, _2));
+ gSavedSettings.getControl("RenderSpecularExponent")->getSignal()->connect(boost::bind(&handleLUTBufferChanged, _2));
gSavedSettings.getControl("RenderAnisotropic")->getSignal()->connect(boost::bind(&handleAnisotropicChanged, _2));
gSavedSettings.getControl("RenderShadowResolutionScale")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2));
gSavedSettings.getControl("RenderGlow")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2));
gSavedSettings.getControl("RenderGlow")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
- gSavedSettings.getControl("EnableRippleWater")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
gSavedSettings.getControl("RenderGlowResolutionPow")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2));
gSavedSettings.getControl("RenderAvatarCloth")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
gSavedSettings.getControl("WindLightUseAtmosShaders")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
gSavedSettings.getControl("RenderGammaFull")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
gSavedSettings.getControl("RenderAvatarMaxVisible")->getSignal()->connect(boost::bind(&handleAvatarMaxVisibleChanged, _2));
+ gSavedSettings.getControl("RenderAvatarComplexityLimit")->getSignal()->connect(boost::bind(&handleRenderAvatarComplexityLimitChanged, _2));
gSavedSettings.getControl("RenderVolumeLODFactor")->getSignal()->connect(boost::bind(&handleVolumeLODChanged, _2));
gSavedSettings.getControl("RenderAvatarLODFactor")->getSignal()->connect(boost::bind(&handleAvatarLODChanged, _2));
+ gSavedSettings.getControl("RenderAvatarPhysicsLODFactor")->getSignal()->connect(boost::bind(&handleAvatarPhysicsLODChanged, _2));
gSavedSettings.getControl("RenderTerrainLODFactor")->getSignal()->connect(boost::bind(&handleTerrainLODChanged, _2));
gSavedSettings.getControl("RenderTreeLODFactor")->getSignal()->connect(boost::bind(&handleTreeLODChanged, _2));
gSavedSettings.getControl("RenderFlexTimeFactor")->getSignal()->connect(boost::bind(&handleFlexLODChanged, _2));
- gSavedSettings.getControl("ThrottleBandwidthKBPS")->getSignal()->connect(boost::bind(&handleBandwidthChanged, _2));
gSavedSettings.getControl("RenderGamma")->getSignal()->connect(boost::bind(&handleGammaChanged, _2));
gSavedSettings.getControl("RenderFogRatio")->getSignal()->connect(boost::bind(&handleFogRatioChanged, _2));
gSavedSettings.getControl("RenderMaxPartCount")->getSignal()->connect(boost::bind(&handleMaxPartCountChanged, _2));
gSavedSettings.getControl("RenderDynamicLOD")->getSignal()->connect(boost::bind(&handleRenderDynamicLODChanged, _2));
+ gSavedSettings.getControl("RenderLocalLights")->getSignal()->connect(boost::bind(&handleRenderLocalLightsChanged, _2));
gSavedSettings.getControl("RenderDebugTextureBind")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2));
gSavedSettings.getControl("RenderAutoMaskAlphaDeferred")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2));
gSavedSettings.getControl("RenderAutoMaskAlphaNonDeferred")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2));
gSavedSettings.getControl("RenderObjectBump")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2));
gSavedSettings.getControl("RenderMaxVBOSize")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2));
- gSavedSettings.getControl("RenderUseFBO")->getSignal()->connect(boost::bind(&handleRenderUseFBOChanged, _2));
gSavedSettings.getControl("RenderDeferredNoise")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2));
gSavedSettings.getControl("RenderUseImpostors")->getSignal()->connect(boost::bind(&handleRenderUseImpostorsChanged, _2));
gSavedSettings.getControl("RenderDebugGL")->getSignal()->connect(boost::bind(&handleRenderDebugGLChanged, _2));
gSavedSettings.getControl("RenderDebugPipeline")->getSignal()->connect(boost::bind(&handleRenderDebugPipelineChanged, _2));
gSavedSettings.getControl("RenderResolutionDivisor")->getSignal()->connect(boost::bind(&handleRenderResolutionDivisorChanged, _2));
- gSavedSettings.getControl("RenderDeferred")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
+ gSavedSettings.getControl("RenderDeferred")->getSignal()->connect(boost::bind(&handleRenderDeferredChanged, _2));
gSavedSettings.getControl("RenderShadowDetail")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
gSavedSettings.getControl("RenderDeferredSSAO")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
- gSavedSettings.getControl("RenderDeferredGI")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
+ gSavedSettings.getControl("RenderPerformanceTest")->getSignal()->connect(boost::bind(&handleRenderPerfTestChanged, _2));
gSavedSettings.getControl("TextureMemory")->getSignal()->connect(boost::bind(&handleVideoMemoryChanged, _2));
gSavedSettings.getControl("AuditTexture")->getSignal()->connect(boost::bind(&handleAuditTextureChanged, _2));
gSavedSettings.getControl("ChatFontSize")->getSignal()->connect(boost::bind(&handleChatFontSizeChanged, _2));
@@ -587,8 +639,11 @@ void settings_setup_listeners()
gSavedSettings.getControl("MuteVoice")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _2));
gSavedSettings.getControl("MuteAmbient")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _2));
gSavedSettings.getControl("MuteUI")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _2));
- gSavedSettings.getControl("RenderVBOEnable")->getSignal()->connect(boost::bind(&handleRenderUseVBOChanged, _2));
+ gSavedSettings.getControl("RenderVBOEnable")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2));
+ gSavedSettings.getControl("RenderUseVAO")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2));
+ gSavedSettings.getControl("RenderVBOMappingDisable")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2));
gSavedSettings.getControl("RenderUseStreamVBO")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2));
+ gSavedSettings.getControl("RenderPreferStreamDraw")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2));
gSavedSettings.getControl("WLSkyDetail")->getSignal()->connect(boost::bind(&handleWLSkyDetailChanged, _2));
gSavedSettings.getControl("NumpadControl")->getSignal()->connect(boost::bind(&handleNumpadControlChanged, _2));
gSavedSettings.getControl("JoystickAxis0")->getSignal()->connect(boost::bind(&handleJoystickChanged, _2));
@@ -640,10 +695,6 @@ void settings_setup_listeners()
gSavedSettings.getControl("UserLogFile")->getSignal()->connect(boost::bind(&handleLogFileChanged, _2));
gSavedSettings.getControl("RenderHideGroupTitle")->getSignal()->connect(boost::bind(handleHideGroupTitleChanged, _2));
gSavedSettings.getControl("HighResSnapshot")->getSignal()->connect(boost::bind(handleHighResSnapshotChanged, _2));
- gSavedSettings.getControl("VectorizePerfTest")->getSignal()->connect(boost::bind(&handleVectorizeChanged, _2));
- gSavedSettings.getControl("VectorizeEnable")->getSignal()->connect(boost::bind(&handleVectorizeChanged, _2));
- gSavedSettings.getControl("VectorizeProcessor")->getSignal()->connect(boost::bind(&handleVectorizeChanged, _2));
- gSavedSettings.getControl("VectorizeSkin")->getSignal()->connect(boost::bind(&handleVectorizeChanged, _2));
gSavedSettings.getControl("EnableVoiceChat")->getSignal()->connect(boost::bind(&handleVoiceClientPrefsChanged, _2));
gSavedSettings.getControl("PTTCurrentlyEnabled")->getSignal()->connect(boost::bind(&handleVoiceClientPrefsChanged, _2));
gSavedSettings.getControl("PushToTalkButton")->getSignal()->connect(boost::bind(&handleVoiceClientPrefsChanged, _2));
@@ -658,10 +709,9 @@ void settings_setup_listeners()
gSavedSettings.getControl("UseDebugMenus")->getSignal()->connect(boost::bind(&show_debug_menus));
gSavedSettings.getControl("AgentPause")->getSignal()->connect(boost::bind(&toggle_agent_pause, _2));
gSavedSettings.getControl("ShowNavbarNavigationPanel")->getSignal()->connect(boost::bind(&toggle_show_navigation_panel, _2));
- gSavedSettings.getControl("ShowNavbarFavoritesPanel")->getSignal()->connect(boost::bind(&toggle_show_favorites_panel, _2));
gSavedSettings.getControl("ShowMiniLocationPanel")->getSignal()->connect(boost::bind(&toggle_show_mini_location_panel, _2));
gSavedSettings.getControl("ShowObjectRenderingCost")->getSignal()->connect(boost::bind(&toggle_show_object_render_cost, _2));
- gSavedSettings.getControl("UpdaterServiceActive")->getSignal()->connect(&toggle_updater_service_active);
+ gSavedSettings.getControl("UpdaterServiceSetting")->getSignal()->connect(boost::bind(&toggle_updater_service_active, _2));
gSavedSettings.getControl("ForceShowGrid")->getSignal()->connect(boost::bind(&handleForceShowGrid, _2));
gSavedSettings.getControl("RenderTransparentWater")->getSignal()->connect(boost::bind(&handleRenderTransparentWaterChanged, _2));
}
diff --git a/indra/newview/llviewercontrollistener.cpp b/indra/newview/llviewercontrollistener.cpp
index 8bc25fa281..361b96221c 100644
--- a/indra/newview/llviewercontrollistener.cpp
+++ b/indra/newview/llviewercontrollistener.cpp
@@ -31,99 +31,196 @@
#include "llviewercontrollistener.h"
#include "llviewercontrol.h"
+#include "llcontrol.h"
+#include "llerror.h"
+#include "llsdutil.h"
+#include "stringize.h"
+#include <sstream>
-LLViewerControlListener gSavedSettingsListener;
+namespace {
+
+LLViewerControlListener sSavedSettingsListener;
+
+} // unnamed namespace
LLViewerControlListener::LLViewerControlListener()
: LLEventAPI("LLViewerControl",
- "LLViewerControl listener: set, toggle or set default for various controls",
- "group")
+ "LLViewerControl listener: set, toggle or set default for various controls")
{
- add("Global",
- "Set gSavedSettings control [\"key\"] to value [\"value\"]",
- boost::bind(&LLViewerControlListener::set, &gSavedSettings, _1));
- add("PerAccount",
- "Set gSavedPerAccountSettings control [\"key\"] to value [\"value\"]",
- boost::bind(&LLViewerControlListener::set, &gSavedPerAccountSettings, _1));
- add("Warning",
- "Set gWarningSettings control [\"key\"] to value [\"value\"]",
- boost::bind(&LLViewerControlListener::set, &gWarningSettings, _1));
- add("Crash",
- "Set gCrashSettings control [\"key\"] to value [\"value\"]",
- boost::bind(&LLViewerControlListener::set, &gCrashSettings, _1));
-
-#if 0
- add(/*"toggleControl",*/ "Global", boost::bind(&LLViewerControlListener::toggleControl, &gSavedSettings, _1));
- add(/*"toggleControl",*/ "PerAccount", boost::bind(&LLViewerControlListener::toggleControl, &gSavedPerAccountSettings, _1));
- add(/*"toggleControl",*/ "Warning", boost::bind(&LLViewerControlListener::toggleControl, &gWarningSettings, _1));
- add(/*"toggleControl",*/ "Crash", boost::bind(&LLViewerControlListener::toggleControl, &gCrashSettings, _1));
-
- add(/*"setDefault",*/ "Global", boost::bind(&LLViewerControlListener::setDefault, &gSavedSettings, _1));
- add(/*"setDefault",*/ "PerAccount", boost::bind(&LLViewerControlListener::setDefault, &gSavedPerAccountSettings, _1));
- add(/*"setDefault",*/ "Warning", boost::bind(&LLViewerControlListener::setDefault, &gWarningSettings, _1));
- add(/*"setDefault",*/ "Crash", boost::bind(&LLViewerControlListener::setDefault, &gCrashSettings, _1));
-#endif // 0
+ std::ostringstream groupnames;
+ groupnames << "[\"group\"] is one of ";
+ const char* delim = "";
+ for (LLControlGroup::key_iter cgki(LLControlGroup::beginKeys()),
+ cgkend(LLControlGroup::endKeys());
+ cgki != cgkend; ++cgki)
+ {
+ groupnames << delim << '"' << *cgki << '"';
+ delim = ", ";
+ }
+ groupnames << '\n';
+ std::string grouphelp(groupnames.str());
+ std::string replyhelp("If [\"reply\"] requested, send new [\"value\"] on specified LLEventPump\n");
+
+ add("set",
+ std::string("Set [\"group\"] control [\"key\"] to optional value [\"value\"]\n"
+ "If [\"value\"] omitted, set to control's defined default value\n") +
+ grouphelp + replyhelp,
+ &LLViewerControlListener::set,
+ LLSDMap("group", LLSD())("key", LLSD()));
+ add("toggle",
+ std::string("Toggle [\"group\"] control [\"key\"], if boolean\n") + grouphelp + replyhelp,
+ &LLViewerControlListener::toggle,
+ LLSDMap("group", LLSD())("key", LLSD()));
+ add("get",
+ std::string("Query [\"group\"] control [\"key\"], replying on LLEventPump [\"reply\"]\n") +
+ grouphelp,
+ &LLViewerControlListener::get,
+ LLSDMap("group", LLSD())("key", LLSD())("reply", LLSD()));
+ add("groups",
+ "Send on LLEventPump [\"reply\"] an array [\"groups\"] of valid group names",
+ &LLViewerControlListener::groups,
+ LLSDMap("reply", LLSD()));
+ add("vars",
+ std::string("For [\"group\"], send on LLEventPump [\"reply\"] an array [\"vars\"],\n"
+ "each of whose entries looks like:\n"
+ " [\"name\"], [\"type\"], [\"value\"], [\"comment\"]\n") + grouphelp,
+ &LLViewerControlListener::vars,
+ LLSDMap("group", LLSD())("reply", LLSD()));
}
-//static
-void LLViewerControlListener::set(LLControlGroup * controls, LLSD const & event_data)
+struct Info
{
- if(event_data.has("key"))
+ Info(const LLSD& request):
+ response(LLSD(), request),
+ groupname(request["group"]),
+ group(LLControlGroup::getInstance(groupname)),
+ key(request["key"]),
+ control(NULL)
{
- std::string key(event_data["key"]);
+ if (! group)
+ {
+ response.error(STRINGIZE("Unrecognized group '" << groupname << "'"));
+ return;
+ }
- if(controls->controlExists(key))
+ control = group->getControl(key);
+ if (! control)
{
- controls->setUntypedValue(key, event_data["value"]);
+ response.error(STRINGIZE("In group '" << groupname
+ << "', unrecognized control key '" << key << "'"));
}
- else
+ }
+
+ ~Info()
+ {
+ // If in fact the request passed to our constructor names a valid
+ // group and key, grab the final value of the indicated control and
+ // stuff it in our response. Since this outer destructor runs before
+ // the contained Response destructor, this data will go into the
+ // response we send.
+ if (control)
{
- llwarns << "requested unknown control: \"" << key << '\"' << llendl;
+ response["name"] = control->getName();
+ response["type"] = group->typeEnumToString(control->type());
+ response["value"] = control->get();
+ response["comment"] = control->getComment();
}
}
+
+ LLEventAPI::Response response;
+ std::string groupname;
+ LLControlGroup* group;
+ std::string key;
+ LLControlVariable* control;
+};
+
+//static
+void LLViewerControlListener::set(LLSD const & request)
+{
+ Info info(request);
+ if (! info.control)
+ return;
+
+ if (request.has("value"))
+ {
+ info.control->setValue(request["value"]);
+ }
+ else
+ {
+ info.control->resetToDefault();
+ }
}
//static
-void LLViewerControlListener::toggleControl(LLControlGroup * controls, LLSD const & event_data)
+void LLViewerControlListener::toggle(LLSD const & request)
{
- if(event_data.has("key"))
+ Info info(request);
+ if (! info.control)
+ return;
+
+ if (info.control->isType(TYPE_BOOLEAN))
+ {
+ info.control->set(! info.control->get().asBoolean());
+ }
+ else
{
- std::string key(event_data["key"]);
+ info.response.error(STRINGIZE("toggle of non-boolean '" << info.groupname
+ << "' control '" << info.key
+ << "', type is "
+ << info.group->typeEnumToString(info.control->type())));
+ }
+}
- if(controls->controlExists(key))
- {
- LLControlVariable * control = controls->getControl(key);
- if(control->isType(TYPE_BOOLEAN))
- {
- control->set(!control->get().asBoolean());
- }
- else
- {
- llwarns << "requested toggle of non-boolean control: \"" << key << "\", type is " << control->type() << llendl;
- }
- }
- else
- {
- llwarns << "requested unknown control: \"" << key << '\"' << llendl;
- }
+void LLViewerControlListener::get(LLSD const & request)
+{
+ // The Info constructor and destructor actually do all the work here.
+ Info info(request);
+}
+
+void LLViewerControlListener::groups(LLSD const & request)
+{
+ // No Info, we're not looking up either a group or a control name.
+ Response response(LLSD(), request);
+ for (LLControlGroup::key_iter cgki(LLControlGroup::beginKeys()),
+ cgkend(LLControlGroup::endKeys());
+ cgki != cgkend; ++cgki)
+ {
+ response["groups"].append(*cgki);
}
}
-//static
-void LLViewerControlListener::setDefault(LLControlGroup * controls, LLSD const & event_data)
+struct CollectVars: public LLControlGroup::ApplyFunctor
{
- if(event_data.has("key"))
+ CollectVars(LLControlGroup* g):
+ mGroup(g)
+ {}
+
+ virtual void apply(const std::string& name, LLControlVariable* control)
{
- std::string key(event_data["key"]);
+ vars.append(LLSDMap
+ ("name", name)
+ ("type", mGroup->typeEnumToString(control->type()))
+ ("value", control->get())
+ ("comment", control->getComment()));
+ }
- if(controls->controlExists(key))
- {
- LLControlVariable * control = controls->getControl(key);
- control->resetToDefault();
- }
- else
- {
- llwarns << "requested unknown control: \"" << key << '\"' << llendl;
- }
+ LLControlGroup* mGroup;
+ LLSD vars;
+};
+
+void LLViewerControlListener::vars(LLSD const & request)
+{
+ // This method doesn't use Info, because we're not looking up a specific
+ // control name.
+ Response response(LLSD(), request);
+ std::string groupname(request["group"]);
+ LLControlGroup* group(LLControlGroup::getInstance(groupname));
+ if (! group)
+ {
+ return response.error(STRINGIZE("Unrecognized group '" << groupname << "'"));
}
+
+ CollectVars collector(group);
+ group->applyToAll(&collector);
+ response["vars"] = collector.vars;
}
diff --git a/indra/newview/llviewercontrollistener.h b/indra/newview/llviewercontrollistener.h
index fd211b97af..2e72046924 100644
--- a/indra/newview/llviewercontrollistener.h
+++ b/indra/newview/llviewercontrollistener.h
@@ -40,11 +40,11 @@ public:
LLViewerControlListener();
private:
- static void set(LLControlGroup *controls, LLSD const & event_data);
- static void toggleControl(LLControlGroup *controls, LLSD const & event_data);
- static void setDefault(LLControlGroup *controls, LLSD const & event_data);
+ static void set(LLSD const & event_data);
+ static void toggle(LLSD const & event_data);
+ static void get(LLSD const & event_data);
+ static void groups(LLSD const & event_data);
+ static void vars(LLSD const & event_data);
};
-extern LLViewerControlListener gSavedSettingsListener;
-
#endif // LL_LLVIEWERCONTROLLISTENER_H
diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp
index ddb11829df..0adb187dd2 100644
--- a/indra/newview/llviewerdisplay.cpp
+++ b/indra/newview/llviewerdisplay.cpp
@@ -114,9 +114,8 @@ void render_disconnected_background();
void display_startup()
{
if ( !gViewerWindow->getActive()
- || !gViewerWindow->mWindow->getVisible()
- || gViewerWindow->mWindow->getMinimized()
- || gNoRender )
+ || !gViewerWindow->getWindow()->getVisible()
+ || gViewerWindow->getWindow()->getMinimized() )
{
return;
}
@@ -125,7 +124,8 @@ void display_startup()
// Update images?
//gImageList.updateImages(0.01f);
-
+ LLTexUnit::sWhiteTexture = LLViewerFetchedTexture::sWhiteImagep->getTexName();
+
LLGLSDefault gls_default;
// Required for HTML update in login screen
@@ -158,7 +158,7 @@ void display_startup()
LLGLState::checkStates();
LLGLState::checkTextureChannels();
- gViewerWindow->mWindow->swapBuffers();
+ gViewerWindow->getWindow()->swapBuffers();
glClear(GL_DEPTH_BUFFER_BIT);
}
@@ -179,8 +179,8 @@ void display_update_camera()
gViewerWindow->setup3DRender();
// update all the sky/atmospheric/water settings
- LLWLParamManager::instance()->update(LLViewerCamera::getInstance());
- LLWaterParamManager::instance()->update(LLViewerCamera::getInstance());
+ LLWLParamManager::getInstance()->update(LLViewerCamera::getInstance());
+ LLWaterParamManager::getInstance()->update(LLViewerCamera::getInstance());
// Update land visibility too
LLWorld::getInstance()->setLandFarClip(final_far);
@@ -203,6 +203,7 @@ void display_stats()
gMemoryAllocated = LLMemory::getCurrentRSS();
U32 memory = (U32)(gMemoryAllocated / (1024*1024));
llinfos << llformat("MEMORY: %d MB", memory) << llendl;
+ LLMemory::logMemoryInfo(TRUE) ;
gRecentMemoryTime.reset();
}
}
@@ -212,6 +213,10 @@ static LLFastTimer::DeclareTimer FTM_RENDER("Render", true);
static LLFastTimer::DeclareTimer FTM_UPDATE_SKY("Update Sky");
static LLFastTimer::DeclareTimer FTM_UPDATE_TEXTURES("Update Textures");
static LLFastTimer::DeclareTimer FTM_IMAGE_UPDATE("Update Images");
+static LLFastTimer::DeclareTimer FTM_IMAGE_UPDATE_CLASS("Class");
+static LLFastTimer::DeclareTimer FTM_IMAGE_UPDATE_BUMP("Bump");
+static LLFastTimer::DeclareTimer FTM_IMAGE_UPDATE_LIST("List");
+static LLFastTimer::DeclareTimer FTM_IMAGE_UPDATE_DELETE("Delete");
// Paint the display!
void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
@@ -223,7 +228,8 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
{ //skip render on frames where window has been resized
gGL.flush();
glClear(GL_COLOR_BUFFER_BIT);
- gViewerWindow->mWindow->swapBuffers();
+ gViewerWindow->getWindow()->swapBuffers();
+ LLPipeline::refreshCachedSettings();
gPipeline.resizeScreenTexture();
gResizeScreenTexture = FALSE;
gWindowResized = FALSE;
@@ -254,14 +260,17 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
gPipeline.disableLights();
+ //reset vertex buffers if needed
+ gPipeline.doResetVertexBuffers();
+
stop_glerror();
// Don't draw if the window is hidden or minimized.
// In fact, must explicitly check the minimized state before drawing.
// Attempting to draw into a minimized window causes a GL error. JC
if ( !gViewerWindow->getActive()
- || !gViewerWindow->mWindow->getVisible()
- || gViewerWindow->mWindow->getMinimized() )
+ || !gViewerWindow->getWindow()->getVisible()
+ || gViewerWindow->getWindow()->getMinimized() )
{
// Clean up memory the pools may have allocated
if (rebuild)
@@ -294,7 +303,8 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
// Logic for forcing window updates if we're in drone mode.
//
- if (gNoRender)
+ // *TODO: Investigate running display() during gHeadlessClient. See if this early exit is needed DK 2011-02-18
+ if (gHeadlessClient)
{
#if LL_WINDOWS
static F32 last_update_time = 0.f;
@@ -522,10 +532,9 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
// Note that these are not the same as GL defaults...
stop_glerror();
- F32 one[4] = {1.f, 1.f, 1.f, 1.f};
- glLightModelfv (GL_LIGHT_MODEL_AMBIENT,one);
+ gGL.setAmbientLightColor(LLColor4::white);
stop_glerror();
-
+
/////////////////////////////////////
//
// Render
@@ -582,6 +591,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
LLMemType mt_ug(LLMemType::MTYPE_DISPLAY_UPDATE_GEOM);
const F32 max_geom_update_time = 0.005f*10.f*gFrameIntervalSeconds; // 50 ms/second update time
gPipeline.createObjects(max_geom_update_time);
+ gPipeline.processPartitionQ();
gPipeline.updateGeom(max_geom_update_time);
stop_glerror();
}
@@ -610,22 +620,12 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
LLDrawable::incrementVisible();
LLSpatialGroup::sNoDelete = TRUE;
- LLPipeline::sUseOcclusion =
- (!gUseWireframe
- && LLFeatureManager::getInstance()->isFeatureAvailable("UseOcclusion")
- && gSavedSettings.getBOOL("UseOcclusion")
- && gGLManager.mHasOcclusionQuery) ? 2 : 0;
-
- if (LLPipeline::sUseOcclusion && LLPipeline::sRenderDeferred)
- { //force occlusion on for all render types if doing deferred render
- LLPipeline::sUseOcclusion = 3;
- }
+ LLTexUnit::sWhiteTexture = LLViewerFetchedTexture::sWhiteImagep->getTexName();
- LLPipeline::sAutoMaskAlphaDeferred = gSavedSettings.getBOOL("RenderAutoMaskAlphaDeferred");
- LLPipeline::sAutoMaskAlphaNonDeferred = gSavedSettings.getBOOL("RenderAutoMaskAlphaNonDeferred");
- LLPipeline::sUseFarClip = gSavedSettings.getBOOL("RenderUseFarClip");
- LLVOAvatar::sMaxVisible = (U32)gSavedSettings.getS32("RenderAvatarMaxVisible");
- LLPipeline::sDelayVBUpdate = gSavedSettings.getBOOL("RenderDelayVBUpdate");
+ /*if (LLPipeline::sUseOcclusion && LLPipeline::sRenderDeferred)
+ { //force occlusion on for all render types if doing deferred render (tighter shadow frustum)
+ LLPipeline::sUseOcclusion = 3;
+ }*/
S32 occlusion = LLPipeline::sUseOcclusion;
if (gDepthDirty)
@@ -647,18 +647,13 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
LLGLState::checkTextureChannels();
LLGLState::checkClientArrays();
- BOOL to_texture = !for_snapshot &&
- gPipeline.canUseVertexShaders() &&
+ BOOL to_texture = gPipeline.canUseVertexShaders() &&
LLPipeline::sRenderGlow;
LLAppViewer::instance()->pingMainloopTimeout("Display:Swap");
{
LLMemType mt_ds(LLMemType::MTYPE_DISPLAY_SWAP);
- {
- LLFastTimer ftm(FTM_CLIENT_COPY);
- LLVertexBuffer::clientCopy(0.016);
- }
if (gResizeScreenTexture)
{
@@ -691,14 +686,18 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
glh::matrix4f mod = glh_get_current_modelview();
glViewport(0,0,512,512);
LLVOAvatar::updateFreezeCounter() ;
- LLVOAvatar::updateImpostors();
+
+ if(!LLPipeline::sMemAllocationThrottled)
+ {
+ LLVOAvatar::updateImpostors();
+ }
glh_set_current_projection(proj);
glh_set_current_modelview(mod);
- glMatrixMode(GL_PROJECTION);
- glLoadMatrixf(proj.m);
- glMatrixMode(GL_MODELVIEW);
- glLoadMatrixf(mod.m);
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.loadMatrix(proj.m);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.loadMatrix(mod.m);
gViewerWindow->setup3DViewport();
LLGLState::checkStates();
@@ -709,14 +708,21 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
glClear(GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
}
- if (!for_snapshot)
+ LLGLState::checkStates();
+ LLGLState::checkClientArrays();
+
+ //if (!for_snapshot)
{
LLMemType mt_gw(LLMemType::MTYPE_DISPLAY_GEN_REFLECTION);
LLAppViewer::instance()->pingMainloopTimeout("Display:Imagery");
gPipeline.generateWaterReflection(*LLViewerCamera::getInstance());
gPipeline.generateHighlight(*LLViewerCamera::getInstance());
+ gPipeline.renderPhysicsDisplay();
}
+ LLGLState::checkStates();
+ LLGLState::checkClientArrays();
+
//////////////////////////////////////
//
// Update images, using the image stats generated during object update/culling
@@ -730,19 +736,36 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
LLMemType mt_iu(LLMemType::MTYPE_DISPLAY_IMAGE_UPDATE);
LLFastTimer t(FTM_IMAGE_UPDATE);
- LLViewerTexture::updateClass(LLViewerCamera::getInstance()->getVelocityStat()->getMean(),
- LLViewerCamera::getInstance()->getAngularVelocityStat()->getMean());
+ {
+ LLFastTimer t(FTM_IMAGE_UPDATE_CLASS);
+ LLViewerTexture::updateClass(LLViewerCamera::getInstance()->getVelocityStat()->getMean(),
+ LLViewerCamera::getInstance()->getAngularVelocityStat()->getMean());
+ }
- gBumpImageList.updateImages(); // must be called before gTextureList version so that it's textures are thrown out first.
+
+ {
+ LLFastTimer t(FTM_IMAGE_UPDATE_BUMP);
+ gBumpImageList.updateImages(); // must be called before gTextureList version so that it's textures are thrown out first.
+ }
- F32 max_image_decode_time = 0.050f*gFrameIntervalSeconds; // 50 ms/second decode time
- max_image_decode_time = llclamp(max_image_decode_time, 0.002f, 0.005f ); // min 2ms/frame, max 5ms/frame)
- gTextureList.updateImages(max_image_decode_time);
+ {
+ LLFastTimer t(FTM_IMAGE_UPDATE_LIST);
+ F32 max_image_decode_time = 0.050f*gFrameIntervalSeconds; // 50 ms/second decode time
+ max_image_decode_time = llclamp(max_image_decode_time, 0.002f, 0.005f ); // min 2ms/frame, max 5ms/frame)
+ gTextureList.updateImages(max_image_decode_time);
+ }
- //remove dead textures from GL
- LLImageGL::deleteDeadTextures();
- stop_glerror();
+ {
+ LLFastTimer t(FTM_IMAGE_UPDATE_DELETE);
+ //remove dead textures from GL
+ LLImageGL::deleteDeadTextures();
+ stop_glerror();
+ }
}
+
+ LLGLState::checkStates();
+ LLGLState::checkClientArrays();
+
///////////////////////////////////
//
// StateSort
@@ -755,7 +778,6 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
{
LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_WORLD;
LLMemType mt_ss(LLMemType::MTYPE_DISPLAY_STATE_SORT);
- gPipeline.sAllowRebuildPriorityGroup = TRUE ;
gPipeline.stateSort(*LLViewerCamera::getInstance(), result);
stop_glerror();
@@ -771,6 +793,9 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
}
}
+ LLGLState::checkStates();
+ LLGLState::checkClientArrays();
+
LLPipeline::sUseOcclusion = occlusion;
{
@@ -794,13 +819,13 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
//// assumes frontmost floater with focus is opaque
//if (frontmost_floaterp && gFocusMgr.childHasKeyboardFocus(frontmost_floaterp))
//{
- // glMatrixMode(GL_MODELVIEW);
- // glPushMatrix();
+ // gGL.matrixMode(LLRender::MM_MODELVIEW);
+ // gGL.pushMatrix();
// {
// gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
// glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_TRUE);
- // glLoadIdentity();
+ // gGL.loadIdentity();
// LLRect floater_rect = frontmost_floaterp->calcScreenRect();
// // deflate by one pixel so rounding errors don't occlude outside of floater extents
@@ -810,8 +835,8 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
// (F32)floater_rect.mRight / (F32)gViewerWindow->getWindowWidthScaled(),
// (F32)floater_rect.mBottom / (F32)gViewerWindow->getWindowHeightScaled());
// floater_3d_rect.translate(-0.5f, -0.5f);
- // glTranslatef(0.f, 0.f, -LLViewerCamera::getInstance()->getNear());
- // glScalef(LLViewerCamera::getInstance()->getNear() * LLViewerCamera::getInstance()->getAspect() / sinf(LLViewerCamera::getInstance()->getView()), LLViewerCamera::getInstance()->getNear() / sinf(LLViewerCamera::getInstance()->getView()), 1.f);
+ // gGL.translatef(0.f, 0.f, -LLViewerCamera::getInstance()->getNear());
+ // gGL.scalef(LLViewerCamera::getInstance()->getNear() * LLViewerCamera::getInstance()->getAspect() / sinf(LLViewerCamera::getInstance()->getView()), LLViewerCamera::getInstance()->getNear() / sinf(LLViewerCamera::getInstance()->getView()), 1.f);
// gGL.color4fv(LLColor4::white.mV);
// gGL.begin(LLVertexBuffer::QUADS);
// {
@@ -823,26 +848,34 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
// gGL.end();
// glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
// }
- // glPopMatrix();
+ // gGL.popMatrix();
//}
LLPipeline::sUnderWaterRender = LLViewerCamera::getInstance()->cameraUnderWater() ? TRUE : FALSE;
- LLPipeline::updateRenderDeferred();
+ LLGLState::checkStates();
+ LLGLState::checkClientArrays();
+
stop_glerror();
if (to_texture)
{
gGL.setColorMask(true, true);
+
if (LLPipeline::sRenderDeferred && !LLPipeline::sUnderWaterRender)
{
gPipeline.mDeferredScreen.bindTarget();
- glClearColor(0,0,0,0);
+ glClearColor(1,0,1,1);
gPipeline.mDeferredScreen.clear();
}
else
{
gPipeline.mScreen.bindTarget();
+ if (LLPipeline::sUnderWaterRender && !gPipeline.canUseWindLightShaders())
+ {
+ const LLColor4 &col = LLDrawPoolWater::sWaterFogColor;
+ glClearColor(col.mV[0], col.mV[1], col.mV[2], 0.f);
+ }
gPipeline.mScreen.clear();
}
@@ -878,6 +911,14 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
stop_glerror();
}
+ for (U32 i = 0; i < gGLManager.mNumTextureImageUnits; i++)
+ { //dummy cleanup of any currently bound textures
+ if (gGL.getTexUnit(i)->getCurrType() != LLTexUnit::TT_NONE)
+ {
+ gGL.getTexUnit(i)->unbind(gGL.getTexUnit(i)->getCurrType());
+ gGL.getTexUnit(i)->disable();
+ }
+ }
LLAppViewer::instance()->pingMainloopTimeout("Display:RenderFlush");
if (to_texture)
@@ -886,10 +927,26 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
if (LLPipeline::sRenderDeferred && !LLPipeline::sUnderWaterRender)
{
gPipeline.mDeferredScreen.flush();
+ if(LLRenderTarget::sUseFBO)
+ {
+ LLRenderTarget::copyContentsToFramebuffer(gPipeline.mDeferredScreen, 0, 0, gPipeline.mDeferredScreen.getWidth(),
+ gPipeline.mDeferredScreen.getHeight(), 0, 0,
+ gPipeline.mDeferredScreen.getWidth(),
+ gPipeline.mDeferredScreen.getHeight(),
+ GL_DEPTH_BUFFER_BIT, GL_NEAREST);
+ }
}
else
{
gPipeline.mScreen.flush();
+ if(LLRenderTarget::sUseFBO)
+ {
+ LLRenderTarget::copyContentsToFramebuffer(gPipeline.mScreen, 0, 0, gPipeline.mScreen.getWidth(),
+ gPipeline.mScreen.getHeight(), 0, 0,
+ gPipeline.mScreen.getWidth(),
+ gPipeline.mScreen.getHeight(),
+ GL_DEPTH_BUFFER_BIT, GL_NEAREST);
+ }
}
}
@@ -907,9 +964,11 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
render_ui();
}
- gPipeline.rebuildGroups();
-
+
LLSpatialGroup::sNoDelete = FALSE;
+ gPipeline.clearReferences();
+
+ gPipeline.rebuildGroups();
}
LLAppViewer::instance()->pingMainloopTimeout("Display:FrameStats");
@@ -930,10 +989,10 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
void render_hud_attachments()
{
LLMemType mt_ra(LLMemType::MTYPE_DISPLAY_RENDER_ATTACHMENTS);
- glMatrixMode(GL_PROJECTION);
- glPushMatrix();
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.pushMatrix();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.pushMatrix();
glh::matrix4f current_proj = glh_get_current_projection();
glh::matrix4f current_mod = glh_get_current_modelview();
@@ -978,8 +1037,7 @@ void render_hud_attachments()
S32 use_occlusion = LLPipeline::sUseOcclusion;
LLPipeline::sUseOcclusion = 0;
- LLPipeline::sDisableShaders = TRUE;
-
+
//cull, sort, and render hud objects
static LLCullResult result;
LLSpatialGroup::sNoDelete = TRUE;
@@ -1007,6 +1065,7 @@ void render_hud_attachments()
gPipeline.renderGeom(hud_cam);
LLSpatialGroup::sNoDelete = FALSE;
+ //gPipeline.clearReferences();
render_hud_elements();
@@ -1018,12 +1077,11 @@ void render_hud_attachments()
gPipeline.toggleRenderDebugFeature((void*) LLPipeline::RENDER_DEBUG_FEATURE_UI);
}
LLPipeline::sUseOcclusion = use_occlusion;
- LLPipeline::sDisableShaders = FALSE;
}
- glMatrixMode(GL_PROJECTION);
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW);
- glPopMatrix();
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.popMatrix();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.popMatrix();
glh_set_current_projection(current_proj);
glh_set_current_modelview(current_mod);
@@ -1043,8 +1101,7 @@ LLRect get_whole_screen_region()
S32 tile_height = llround((F32)gViewerWindow->getWorldViewHeightScaled() / zoom_factor);
int tile_y = sub_region / num_horizontal_tiles;
int tile_x = sub_region - (tile_y * num_horizontal_tiles);
- glh::matrix4f mat;
-
+
whole_screen.setLeftTopAndSize(tile_x * tile_width, gViewerWindow->getWorldViewHeightScaled() - (tile_y * tile_height), tile_width, tile_height);
}
return whole_screen;
@@ -1068,8 +1125,8 @@ bool get_hud_matrices(const LLRect& screen_region, glh::matrix4f &proj, glh::mat
F32 scale_y = (F32)gViewerWindow->getWorldViewHeightScaled() / (F32)screen_region.getHeight();
mat.set_scale(glh::vec3f(scale_x, scale_y, 1.f));
mat.set_translate(
- glh::vec3f(clamp_rescale((F32)screen_region.getCenterX(), 0.f, (F32)gViewerWindow->getWorldViewWidthScaled(), 0.5f * scale_x * aspect_ratio, -0.5f * scale_x * aspect_ratio),
- clamp_rescale((F32)screen_region.getCenterY(), 0.f, (F32)gViewerWindow->getWorldViewHeightScaled(), 0.5f * scale_y, -0.5f * scale_y),
+ glh::vec3f(clamp_rescale((F32)(screen_region.getCenterX() - screen_region.mLeft), 0.f, (F32)gViewerWindow->getWorldViewWidthScaled(), 0.5f * scale_x * aspect_ratio, -0.5f * scale_x * aspect_ratio),
+ clamp_rescale((F32)(screen_region.getCenterY() - screen_region.mBottom), 0.f, (F32)gViewerWindow->getWorldViewHeightScaled(), 0.5f * scale_y, -0.5f * scale_y),
0.f));
proj *= mat;
@@ -1107,12 +1164,12 @@ BOOL setup_hud_matrices(const LLRect& screen_region)
if (!result) return result;
// set up transform to keep HUD objects in front of camera
- glMatrixMode(GL_PROJECTION);
- glLoadMatrixf(proj.m);
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.loadMatrix(proj.m);
glh_set_current_projection(proj);
- glMatrixMode(GL_MODELVIEW);
- glLoadMatrixf(model.m);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.loadMatrix(model.m);
glh_set_current_modelview(model);
return TRUE;
}
@@ -1124,10 +1181,14 @@ void render_ui(F32 zoom_factor, int subfield)
LLMemType mt_ru(LLMemType::MTYPE_DISPLAY_RENDER_UI);
LLGLState::checkStates();
- glPushMatrix();
- glLoadMatrixd(gGLLastModelView);
glh::matrix4f saved_view = glh_get_current_modelview();
- glh_set_current_modelview(glh_copy_matrix(gGLLastModelView));
+
+ if (!gSnapshot)
+ {
+ gGL.pushMatrix();
+ gGL.loadMatrix(gGLLastModelView);
+ glh_set_current_modelview(glh_copy_matrix(gGLLastModelView));
+ }
{
BOOL to_texture = gPipeline.canUseVertexShaders() &&
@@ -1178,13 +1239,16 @@ void render_ui(F32 zoom_factor, int subfield)
LLVertexBuffer::unbind();
}
- glh_set_current_modelview(saved_view);
- glPopMatrix();
+ if (!gSnapshot)
+ {
+ glh_set_current_modelview(saved_view);
+ gGL.popMatrix();
+ }
if (gDisplaySwapBuffers)
{
LLFastTimer t(FTM_SWAP);
- gViewerWindow->mWindow->swapBuffers();
+ gViewerWindow->getWindow()->swapBuffers();
}
gDisplaySwapBuffers = TRUE;
}
@@ -1251,10 +1315,10 @@ void draw_axes()
gGL.vertex3f(0.0f, 0.0f, 40.0f);
gGL.end();
// Some coordinate axes
- glPushMatrix();
- glTranslatef( v.mV[VX], v.mV[VY], v.mV[VZ] );
+ gGL.pushMatrix();
+ gGL.translatef( v.mV[VX], v.mV[VY], v.mV[VZ] );
renderCoordinateAxes();
- glPopMatrix();
+ gGL.popMatrix();
}
void render_ui_3d()
@@ -1276,14 +1340,19 @@ void render_ui_3d()
// Debugging stuff goes before the UI.
+ stop_glerror();
+
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gUIProgram.bind();
+ }
+
// Coordinate axes
if (gSavedSettings.getBOOL("ShowAxes"))
{
draw_axes();
}
- stop_glerror();
-
gViewerWindow->renderSelections(FALSE, FALSE, TRUE); // Non HUD call in render_hud_elements
stop_glerror();
}
@@ -1316,21 +1385,21 @@ void render_ui_2d()
}
stop_glerror();
- gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
+ //gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
// render outline for HUD
if (isAgentAvatarValid() && gAgentCamera.mHUDCurZoom < 0.98f)
{
- glPushMatrix();
+ gGL.pushMatrix();
S32 half_width = (gViewerWindow->getWorldViewWidthScaled() / 2);
S32 half_height = (gViewerWindow->getWorldViewHeightScaled() / 2);
- glScalef(LLUI::sGLScaleFactor.mV[0], LLUI::sGLScaleFactor.mV[1], 1.f);
- glTranslatef((F32)half_width, (F32)half_height, 0.f);
+ gGL.scalef(LLUI::sGLScaleFactor.mV[0], LLUI::sGLScaleFactor.mV[1], 1.f);
+ gGL.translatef((F32)half_width, (F32)half_height, 0.f);
F32 zoom = gAgentCamera.mHUDCurZoom;
- glScalef(zoom,zoom,1.f);
+ gGL.scalef(zoom,zoom,1.f);
gGL.color4fv(LLColor4::white.mV);
gl_rect_2d(-half_width, half_height, half_width, -half_height, FALSE);
- glPopMatrix();
+ gGL.popMatrix();
stop_glerror();
}
@@ -1378,8 +1447,7 @@ void render_ui_2d()
gGL.setColorMask(true, false);
LLUI::sDirtyRect = t_rect;
-
- }
+ }
LLGLDisable cull(GL_CULL_FACE);
LLGLDisable blend(GL_BLEND);
@@ -1407,6 +1475,11 @@ void render_ui_2d()
void render_disconnected_background()
{
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gUIProgram.bind();
+ }
+
gGL.color4f(1,1,1,1);
if (!gDisconnectedImagep && gDisconnected)
{
@@ -1460,22 +1533,28 @@ void render_disconnected_background()
{
LLGLSUIDefault gls_ui;
gViewerWindow->setup2DRender();
- glPushMatrix();
+ gGL.pushMatrix();
{
// scale ui to reflect UIScaleFactor
// this can't be done in setup2DRender because it requires a
// pushMatrix/popMatrix pair
const LLVector2& display_scale = gViewerWindow->getDisplayScale();
- glScalef(display_scale.mV[VX], display_scale.mV[VY], 1.f);
+ gGL.scalef(display_scale.mV[VX], display_scale.mV[VY], 1.f);
gGL.getTexUnit(0)->bind(gDisconnectedImagep);
gGL.color4f(1.f, 1.f, 1.f, 1.f);
gl_rect_2d_simple_tex(width, height);
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
}
- glPopMatrix();
+ gGL.popMatrix();
}
gGL.flush();
+
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gUIProgram.unbind();
+ }
+
}
void display_cleanup()
diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp
index f573f25efe..17d8256de8 100644
--- a/indra/newview/llviewerfloaterreg.cpp
+++ b/indra/newview/llviewerfloaterreg.cpp
@@ -33,9 +33,10 @@
#include "llcompilequeue.h"
#include "llcallfloater.h"
+#include "llfasttimerview.h"
#include "llfloaterabout.h"
-#include "llfloateranimpreview.h"
#include "llfloaterauction.h"
+#include "llfloateravatar.h"
#include "llfloateravatarpicker.h"
#include "llfloateravatartextures.h"
#include "llfloaterbeacons.h"
@@ -47,19 +48,24 @@
#include "llfloaterbuyland.h"
#include "llfloaterbulkpermission.h"
#include "llfloaterbump.h"
+#include "llfloaterbvhpreview.h"
#include "llfloatercamera.h"
-#include "llfloaterdaycycle.h"
+#include "llfloaterdeleteenvpreset.h"
#include "llfloaterdisplayname.h"
+#include "llfloatereditdaycycle.h"
+#include "llfloatereditsky.h"
+#include "llfloatereditwater.h"
+#include "llfloaterenvironmentsettings.h"
#include "llfloaterevent.h"
-#include "llfloatersearch.h"
-#include "llfloaterenvsettings.h"
+#include "llfloaterdestinations.h"
#include "llfloaterfonttest.h"
#include "llfloatergesture.h"
#include "llfloatergodtools.h"
#include "llfloatergroups.h"
#include "llfloaterhardwaresettings.h"
#include "llfloaterhelpbrowser.h"
-#include "llfloatermediabrowser.h"
+#include "llfloaterwebcontent.h"
+#include "llfloaterwebprofile.h"
#include "llfloatermediasettings.h"
#include "llfloaterhud.h"
#include "llfloaterimagepreview.h"
@@ -74,10 +80,11 @@
#include "llfloatermemleak.h"
#include "llfloaternamedesc.h"
#include "llfloaternotificationsconsole.h"
+#include "llfloaterobjectweights.h"
#include "llfloateropenobject.h"
+#include "llfloateroutbox.h"
#include "llfloaterpay.h"
#include "llfloaterperms.h"
-#include "llfloaterpostcard.h"
#include "llfloaterpostprocess.h"
#include "llfloaterpreference.h"
#include "llfloaterproperties.h"
@@ -86,21 +93,23 @@
#include "llfloaterreporter.h"
#include "llfloaterscriptdebug.h"
#include "llfloaterscriptlimits.h"
+#include "llfloatersearch.h"
#include "llfloatersellland.h"
#include "llfloatersettingsdebug.h"
-#include "llfloatersidetraytab.h"
+#include "llfloatersidepanelcontainer.h"
#include "llfloatersnapshot.h"
+#include "llfloatersounddevices.h"
#include "llfloatertelehub.h"
#include "llfloatertestinspectors.h"
#include "llfloatertestlistview.h"
#include "llfloatertools.h"
#include "llfloatertos.h"
#include "llfloatertopobjects.h"
+#include "llfloatertoybox.h"
+#include "llfloatertranslationsettings.h"
#include "llfloateruipreview.h"
#include "llfloatervoiceeffect.h"
-#include "llfloaterwater.h"
#include "llfloaterwhitelistentry.h"
-#include "llfloaterwindlight.h"
#include "llfloaterwindowsize.h"
#include "llfloaterworldmap.h"
#include "llimfloatercontainer.h"
@@ -121,16 +130,46 @@
#include "llpreviewtexture.h"
#include "llsyswellwindow.h"
#include "llscriptfloater.h"
+#include "llfloatermodelpreview.h"
+#include "llcommandhandler.h"
+#include "llnearbychatbar.h"
+
// *NOTE: Please add files in alphabetical order to keep merges easy.
+// handle secondlife:///app/openfloater/{NAME} URLs
+class LLFloaterOpenHandler : public LLCommandHandler
+{
+public:
+ // requires trusted browser to trigger
+ LLFloaterOpenHandler() : LLCommandHandler("openfloater", UNTRUSTED_THROTTLE) { }
+
+ bool handle(const LLSD& params, const LLSD& query_map,
+ LLMediaCtrl* web)
+ {
+ if (params.size() != 1)
+ {
+ return false;
+ }
+
+ const std::string floater_name = LLURI::unescape(params[0].asString());
+ LLFloaterReg::showInstance(floater_name);
+
+ return true;
+ }
+};
+
+LLFloaterOpenHandler gFloaterOpenHandler;
void LLViewerFloaterReg::registerFloaters()
{
// *NOTE: Please keep these alphabetized for easier merges
LLFloaterAboutUtil::registerFloater();
+ LLFloaterReg::add("fast_timers", "floater_fast_timers.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFastTimerView>);
LLFloaterReg::add("about_land", "floater_about_land.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterLand>);
+ LLFloaterReg::add("appearance", "floater_my_appearance.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSidePanelContainer>);
LLFloaterReg::add("auction", "floater_auction.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAuction>);
+ LLFloaterReg::add("avatar", "floater_avatar.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAvatar>);
LLFloaterReg::add("avatar_picker", "floater_avatar_picker.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAvatarPicker>);
LLFloaterReg::add("avatar_textures", "floater_avatar_textures.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAvatarTextures>);
@@ -146,15 +185,18 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("bumps", "floater_bumps.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterBump>);
LLFloaterReg::add("camera", "floater_camera.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterCamera>);
- LLFloaterReg::add("nearby_chat", "floater_nearby_chat.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLNearbyChat>);
+ LLFloaterReg::add("chat_bar", "floater_chat_bar.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLNearbyChatBar>);
LLFloaterReg::add("compile_queue", "floater_script_queue.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterCompileQueue>);
- LLFloaterReg::add("env_day_cycle", "floater_day_cycle_options.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterDayCycle>);
+ LLFloaterReg::add("destinations", "floater_destinations.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterDestinations>);
+
LLFloaterReg::add("env_post_process", "floater_post_process.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPostProcess>);
- LLFloaterReg::add("env_settings", "floater_env_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterEnvSettings>);
- LLFloaterReg::add("env_water", "floater_water.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterWater>);
- LLFloaterReg::add("env_windlight", "floater_windlight_options.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterWindLight>);
+ LLFloaterReg::add("env_settings", "floater_environment_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterEnvironmentSettings>);
+ LLFloaterReg::add("env_delete_preset", "floater_delete_env_preset.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterDeleteEnvPreset>);
+ LLFloaterReg::add("env_edit_sky", "floater_edit_sky_preset.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterEditSky>);
+ LLFloaterReg::add("env_edit_water", "floater_edit_water_preset.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterEditWater>);
+ LLFloaterReg::add("env_edit_day_cycle", "floater_edit_day_cycle.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterEditDayCycle>);
LLFloaterReg::add("event", "floater_event.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterEvent>);
@@ -171,7 +213,7 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("im_container", "floater_im_container.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLIMFloaterContainer>);
LLFloaterReg::add("im_well_window", "floater_sys_well.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLIMWellWindow>);
LLFloaterReg::add("incoming_call", "floater_incoming_call.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLIncomingCallDialog>);
- LLFloaterReg::add("inventory", "floater_inventory.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterInventory>);
+ LLFloaterReg::add("inventory", "floater_my_inventory.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSidePanelContainer>);
LLFloaterReg::add("inspect", "floater_inspect.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterInspect>);
LLInspectAvatarUtil::registerFloater();
LLInspectGroupUtil::registerFloater();
@@ -184,7 +226,6 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("land_holdings", "floater_land_holdings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterLandHoldings>);
LLFloaterReg::add("mem_leaking", "floater_mem_leaking.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMemLeak>);
- LLFloaterReg::add("media_browser", "floater_media_browser.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMediaBrowser>);
LLFloaterReg::add("media_settings", "floater_media_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMediaSettings>);
LLFloaterReg::add("message_critical", "floater_critical.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterTOS>);
LLFloaterReg::add("message_tos", "floater_tos.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterTOS>);
@@ -195,14 +236,20 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("notifications_console", "floater_notifications_console.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterNotificationConsole>);
LLFloaterReg::add("notification_well_window", "floater_sys_well.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLNotificationWellWindow>);
+ LLFloaterReg::add("object_weights", "floater_object_weights.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterObjectWeights>);
LLFloaterReg::add("openobject", "floater_openobject.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterOpenObject>);
+ LLFloaterReg::add("outbox", "floater_merchant_outbox.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterOutbox>);
LLFloaterReg::add("outgoing_call", "floater_outgoing_call.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLOutgoingCallDialog>);
LLFloaterPayUtil::registerFloater();
- LLFloaterReg::add("postcard", "floater_postcard.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPostcard>);
+ LLFloaterReg::add("people", "floater_people.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSidePanelContainer>);
+ LLFloaterReg::add("places", "floater_places.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSidePanelContainer>);
LLFloaterReg::add("preferences", "floater_preferences.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPreference>);
+ LLFloaterReg::add("prefs_proxy", "floater_preferences_proxy.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPreferenceProxy>);
LLFloaterReg::add("prefs_hardware_settings", "floater_hardware_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterHardwareSettings>);
+ LLFloaterReg::add("prefs_translation", "floater_translation_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterTranslationSettings>);
LLFloaterReg::add("perm_prefs", "floater_perm_prefs.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPerms>);
+ LLFloaterReg::add("picks", "floater_picks.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSidePanelContainer>);
LLFloaterReg::add("pref_joystick", "floater_joystick.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterJoystick>);
LLFloaterReg::add("preview_anim", "floater_preview_animation.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLPreviewAnim>, "preview");
LLFloaterReg::add("preview_gesture", "floater_preview_gesture.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLPreviewGesture>, "preview");
@@ -215,16 +262,13 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("publish_classified", "floater_publish_classified.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLPublishClassifiedFloater>);
LLFloaterReg::add("telehubs", "floater_telehub.xml",&LLFloaterReg::build<LLFloaterTelehub>);
- LLFloaterReg::add("test_inspectors", "floater_test_inspectors.xml",
- &LLFloaterReg::build<LLFloaterTestInspectors>);
+ LLFloaterReg::add("test_inspectors", "floater_test_inspectors.xml", &LLFloaterReg::build<LLFloaterTestInspectors>);
//LLFloaterReg::add("test_list_view", "floater_test_list_view.xml",&LLFloaterReg::build<LLFloaterTestListView>);
- LLFloaterReg::add("test_textbox", "floater_test_textbox.xml",
- &LLFloaterReg::build<LLFloater>);
- LLFloaterReg::add("test_text_editor", "floater_test_text_editor.xml",
- &LLFloaterReg::build<LLFloater>);
- LLFloaterReg::add("test_widgets", "floater_test_widgets.xml",
- &LLFloaterReg::build<LLFloater>);
+ LLFloaterReg::add("test_textbox", "floater_test_textbox.xml", &LLFloaterReg::build<LLFloater>);
+ LLFloaterReg::add("test_text_editor", "floater_test_text_editor.xml", &LLFloaterReg::build<LLFloater>);
+ LLFloaterReg::add("test_widgets", "floater_test_widgets.xml", &LLFloaterReg::build<LLFloater>);
LLFloaterReg::add("top_objects", "floater_top_objects.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterTopObjects>);
+ LLFloaterReg::add("toybox", "floater_toybox.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterToybox>);
LLFloaterReg::add("reporter", "floater_report_abuse.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterReporter>);
LLFloaterReg::add("reset_queue", "floater_script_queue.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterResetQueue>);
@@ -237,23 +281,31 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("script_limits", "floater_script_limits.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterScriptLimits>);
LLFloaterReg::add("sell_land", "floater_sell_land.xml", &LLFloaterSellLand::buildFloater);
LLFloaterReg::add("settings_debug", "floater_settings_debug.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSettingsDebug>);
- LLFloaterReg::add("side_bar_tab", "floater_side_bar_tab.xml", &LLFloaterReg::build<LLFloaterSideTrayTab>);
+ LLFloaterReg::add("sound_devices", "floater_sound_devices.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSoundDevices>);
LLFloaterReg::add("stats", "floater_stats.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloater>);
LLFloaterReg::add("start_queue", "floater_script_queue.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterRunQueue>);
LLFloaterReg::add("stop_queue", "floater_script_queue.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterNotRunQueue>);
LLFloaterReg::add("snapshot", "floater_snapshot.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSnapshot>);
- LLFloaterReg::add("search", "floater_search.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSearch>);
+ LLFloaterReg::add("search", "floater_search.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSearch>);
+ LLFloaterReg::add("my_profile", "floater_my_web_profile.xml", (LLFloaterBuildFunc)&LLFloaterWebProfile::create);
+ LLFloaterReg::add("profile", "floater_web_profile.xml", (LLFloaterBuildFunc)&LLFloaterWebProfile::create);
+ LLFloaterReg::add("how_to", "floater_how_to.xml", (LLFloaterBuildFunc)&LLFloaterWebContent::create);
+
LLFloaterUIPreviewUtil::registerFloater();
- LLFloaterReg::add("upload_anim", "floater_animation_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAnimPreview>, "upload");
+ LLFloaterReg::add("upload_anim_bvh", "floater_animation_bvh_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterBvhPreview>, "upload");
+ LLFloaterReg::add("upload_anim_anim", "floater_animation_anim_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAnimPreview>, "upload");
LLFloaterReg::add("upload_image", "floater_image_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterImagePreview>, "upload");
+ LLFloaterReg::add("upload_model", "floater_model_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterModelPreview>, "upload");
+ LLFloaterReg::add("upload_script", "floater_script_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterScriptPreview>, "upload");
LLFloaterReg::add("upload_sound", "floater_sound_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSoundPreview>, "upload");
-
+
LLFloaterReg::add("voice_controls", "floater_voice_controls.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLCallFloater>);
LLFloaterReg::add("voice_effect", "floater_voice_effect.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterVoiceEffect>);
+ LLFloaterReg::add("web_content", "floater_web_content.xml", (LLFloaterBuildFunc)&LLFloaterWebContent::create);
LLFloaterReg::add("whitelist_entry", "floater_whitelist_entry.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterWhiteListEntry>);
- LLFloaterWindowSizeUtil::registerFloater();
+ LLFloaterReg::add("window_size", "floater_window_size.xml", &LLFloaterReg::build<LLFloaterWindowSize>);
LLFloaterReg::add("world_map", "floater_world_map.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterWorldMap>);
// *NOTE: Please keep these alphabetized for easier merges
diff --git a/indra/newview/llviewerfoldertype.cpp b/indra/newview/llviewerfoldertype.cpp
index de1c8d14a8..a179b61cff 100644
--- a/indra/newview/llviewerfoldertype.cpp
+++ b/indra/newview/llviewerfoldertype.cpp
@@ -40,6 +40,7 @@ struct ViewerFolderEntry : public LLDictionaryEntry
const std::string &icon_name_open, // name of the folder icon
const std::string &icon_name_closed,
BOOL is_quiet, // folder doesn't need a UI update when changed
+ bool hide_if_empty, // folder not shown if empty
const std::string &dictionary_name = empty_string // no reverse lookup needed on non-ensembles, so in most cases just leave this blank
)
:
@@ -47,7 +48,8 @@ struct ViewerFolderEntry : public LLDictionaryEntry
mNewCategoryName(new_category_name),
mIconNameOpen(icon_name_open),
mIconNameClosed(icon_name_closed),
- mIsQuiet(is_quiet)
+ mIsQuiet(is_quiet),
+ mHideIfEmpty(hide_if_empty)
{
mAllowedNames.clear();
}
@@ -66,7 +68,8 @@ struct ViewerFolderEntry : public LLDictionaryEntry
*/
mIconNameOpen("Inv_FolderOpen"), mIconNameClosed("Inv_FolderClosed"),
mNewCategoryName(new_category_name),
- mIsQuiet(FALSE)
+ mIsQuiet(FALSE),
+ mHideIfEmpty(false)
{
const std::string delims (",");
LLStringUtilBase<char>::getTokens(allowed_names, mAllowedNames, delims);
@@ -91,6 +94,7 @@ struct ViewerFolderEntry : public LLDictionaryEntry
typedef std::vector<std::string> name_vec_t;
name_vec_t mAllowedNames;
BOOL mIsQuiet;
+ bool mHideIfEmpty;
};
class LLViewerFolderDictionary : public LLSingleton<LLViewerFolderDictionary>,
@@ -104,38 +108,43 @@ protected:
LLViewerFolderDictionary::LLViewerFolderDictionary()
{
- // NEW CATEGORY NAME FOLDER OPEN FOLDER CLOSED QUIET?
- // |-------------------------|-----------------------|----------------------|-----------|
- addEntry(LLFolderType::FT_TEXTURE, new ViewerFolderEntry("Textures", "Inv_SysOpen", "Inv_SysClosed", FALSE));
- addEntry(LLFolderType::FT_SOUND, new ViewerFolderEntry("Sounds", "Inv_SysOpen", "Inv_SysClosed", FALSE));
- addEntry(LLFolderType::FT_CALLINGCARD, new ViewerFolderEntry("Calling Cards", "Inv_SysOpen", "Inv_SysClosed", FALSE));
- addEntry(LLFolderType::FT_LANDMARK, new ViewerFolderEntry("Landmarks", "Inv_SysOpen", "Inv_SysClosed", FALSE));
- addEntry(LLFolderType::FT_CLOTHING, new ViewerFolderEntry("Clothing", "Inv_SysOpen", "Inv_SysClosed", FALSE));
- addEntry(LLFolderType::FT_OBJECT, new ViewerFolderEntry("Objects", "Inv_SysOpen", "Inv_SysClosed", FALSE));
- addEntry(LLFolderType::FT_NOTECARD, new ViewerFolderEntry("Notecards", "Inv_SysOpen", "Inv_SysClosed", FALSE));
- addEntry(LLFolderType::FT_ROOT_INVENTORY, new ViewerFolderEntry("My Inventory", "Inv_SysOpen", "Inv_SysClosed", FALSE));
- addEntry(LLFolderType::FT_LSL_TEXT, new ViewerFolderEntry("Scripts", "Inv_SysOpen", "Inv_SysClosed", FALSE));
- addEntry(LLFolderType::FT_BODYPART, new ViewerFolderEntry("Body Parts", "Inv_SysOpen", "Inv_SysClosed", FALSE));
- addEntry(LLFolderType::FT_TRASH, new ViewerFolderEntry("Trash", "Inv_TrashOpen", "Inv_TrashClosed", TRUE));
- addEntry(LLFolderType::FT_SNAPSHOT_CATEGORY, new ViewerFolderEntry("Photo Album", "Inv_SysOpen", "Inv_SysClosed", FALSE));
- addEntry(LLFolderType::FT_LOST_AND_FOUND, new ViewerFolderEntry("Lost And Found", "Inv_LostOpen", "Inv_LostClosed", TRUE));
- addEntry(LLFolderType::FT_ANIMATION, new ViewerFolderEntry("Animations", "Inv_SysOpen", "Inv_SysClosed", FALSE));
- addEntry(LLFolderType::FT_GESTURE, new ViewerFolderEntry("Gestures", "Inv_SysOpen", "Inv_SysClosed", FALSE));
- addEntry(LLFolderType::FT_FAVORITE, new ViewerFolderEntry("Favorites", "Inv_SysOpen", "Inv_SysClosed", FALSE));
+ // NEW CATEGORY NAME FOLDER OPEN FOLDER CLOSED QUIET? HIDE IF EMPTY?
+ // |-------------------------|-----------------------|----------------------|-----------|--------------|
+ addEntry(LLFolderType::FT_TEXTURE, new ViewerFolderEntry("Textures", "Inv_SysOpen", "Inv_SysClosed", FALSE, true));
+ addEntry(LLFolderType::FT_SOUND, new ViewerFolderEntry("Sounds", "Inv_SysOpen", "Inv_SysClosed", FALSE, true));
+ addEntry(LLFolderType::FT_CALLINGCARD, new ViewerFolderEntry("Calling Cards", "Inv_SysOpen", "Inv_SysClosed", FALSE, true));
+ addEntry(LLFolderType::FT_LANDMARK, new ViewerFolderEntry("Landmarks", "Inv_SysOpen", "Inv_SysClosed", FALSE, true));
+ addEntry(LLFolderType::FT_CLOTHING, new ViewerFolderEntry("Clothing", "Inv_SysOpen", "Inv_SysClosed", FALSE, true));
+ addEntry(LLFolderType::FT_OBJECT, new ViewerFolderEntry("Objects", "Inv_SysOpen", "Inv_SysClosed", FALSE, true));
+ addEntry(LLFolderType::FT_NOTECARD, new ViewerFolderEntry("Notecards", "Inv_SysOpen", "Inv_SysClosed", FALSE, true));
+ addEntry(LLFolderType::FT_ROOT_INVENTORY, new ViewerFolderEntry("My Inventory", "Inv_SysOpen", "Inv_SysClosed", FALSE, false));
+ addEntry(LLFolderType::FT_LSL_TEXT, new ViewerFolderEntry("Scripts", "Inv_SysOpen", "Inv_SysClosed", FALSE, true));
+ addEntry(LLFolderType::FT_BODYPART, new ViewerFolderEntry("Body Parts", "Inv_SysOpen", "Inv_SysClosed", FALSE, true));
+ addEntry(LLFolderType::FT_TRASH, new ViewerFolderEntry("Trash", "Inv_TrashOpen", "Inv_TrashClosed", TRUE, false));
+ addEntry(LLFolderType::FT_SNAPSHOT_CATEGORY, new ViewerFolderEntry("Photo Album", "Inv_SysOpen", "Inv_SysClosed", FALSE, true));
+ addEntry(LLFolderType::FT_LOST_AND_FOUND, new ViewerFolderEntry("Lost And Found", "Inv_LostOpen", "Inv_LostClosed", TRUE, true));
+ addEntry(LLFolderType::FT_ANIMATION, new ViewerFolderEntry("Animations", "Inv_SysOpen", "Inv_SysClosed", FALSE, true));
+ addEntry(LLFolderType::FT_GESTURE, new ViewerFolderEntry("Gestures", "Inv_SysOpen", "Inv_SysClosed", FALSE, true));
+ addEntry(LLFolderType::FT_FAVORITE, new ViewerFolderEntry("Favorites", "Inv_SysOpen", "Inv_SysClosed", FALSE, true));
- addEntry(LLFolderType::FT_CURRENT_OUTFIT, new ViewerFolderEntry("Current Outfit", "Inv_SysOpen", "Inv_SysClosed", TRUE));
- addEntry(LLFolderType::FT_OUTFIT, new ViewerFolderEntry("New Outfit", "Inv_LookFolderOpen", "Inv_LookFolderClosed", TRUE));
- addEntry(LLFolderType::FT_MY_OUTFITS, new ViewerFolderEntry("My Outfits", "Inv_SysOpen", "Inv_SysClosed", TRUE));
- addEntry(LLFolderType::FT_INBOX, new ViewerFolderEntry("Inbox", "Inv_SysOpen", "Inv_SysClosed", FALSE));
+ addEntry(LLFolderType::FT_CURRENT_OUTFIT, new ViewerFolderEntry("Current Outfit", "Inv_SysOpen", "Inv_SysClosed", TRUE, false));
+ addEntry(LLFolderType::FT_OUTFIT, new ViewerFolderEntry("New Outfit", "Inv_LookFolderOpen", "Inv_LookFolderClosed", TRUE, true));
+ addEntry(LLFolderType::FT_MY_OUTFITS, new ViewerFolderEntry("My Outfits", "Inv_SysOpen", "Inv_SysClosed", TRUE, true));
+ addEntry(LLFolderType::FT_MESH, new ViewerFolderEntry("Meshes", "Inv_SysOpen", "Inv_SysClosed", FALSE, true));
+
+ addEntry(LLFolderType::FT_INBOX, new ViewerFolderEntry("Inbox", "Inv_SysOpen", "Inv_SysClosed", FALSE, true));
+ addEntry(LLFolderType::FT_OUTBOX, new ViewerFolderEntry("Outbox", "Inv_SysOpen", "Inv_SysClosed", FALSE, true));
+
+ addEntry(LLFolderType::FT_BASIC_ROOT, new ViewerFolderEntry("Basic Root", "Inv_SysOpen", "Inv_SysClosed", FALSE, true));
- addEntry(LLFolderType::FT_NONE, new ViewerFolderEntry("New Folder", "Inv_FolderOpen", "Inv_FolderClosed", FALSE, "default"));
+ addEntry(LLFolderType::FT_NONE, new ViewerFolderEntry("New Folder", "Inv_FolderOpen", "Inv_FolderClosed", FALSE, false, "default"));
#if SUPPORT_ENSEMBLES
initEnsemblesFromFile();
#else
for (U32 type = (U32)LLFolderType::FT_ENSEMBLE_START; type <= (U32)LLFolderType::FT_ENSEMBLE_END; ++type)
{
- addEntry((LLFolderType::EType)type, new ViewerFolderEntry("New Folder", "Inv_FolderOpen", "Inv_FolderClosed", FALSE));
+ addEntry((LLFolderType::EType)type, new ViewerFolderEntry("New Folder", "Inv_FolderOpen", "Inv_FolderClosed", FALSE, false));
}
#endif
}
@@ -254,6 +263,15 @@ BOOL LLViewerFolderType::lookupIsQuietType(LLFolderType::EType folder_type)
return FALSE;
}
+bool LLViewerFolderType::lookupIsHiddenIfEmpty(LLFolderType::EType folder_type)
+{
+ const ViewerFolderEntry *entry = LLViewerFolderDictionary::getInstance()->lookup(folder_type);
+ if (entry)
+ {
+ return entry->mHideIfEmpty;
+ }
+ return false;
+}
const std::string &LLViewerFolderType::lookupNewCategoryName(LLFolderType::EType folder_type)
{
diff --git a/indra/newview/llviewerfoldertype.h b/indra/newview/llviewerfoldertype.h
index f5938de619..13d5a8fbbd 100644
--- a/indra/newview/llviewerfoldertype.h
+++ b/indra/newview/llviewerfoldertype.h
@@ -40,6 +40,7 @@ public:
static const std::string& lookupIconName(EType folder_type, BOOL is_open = FALSE); // folder icon name
static BOOL lookupIsQuietType(EType folder_type); // folder doesn't require UI update when changes have occured
+ static bool lookupIsHiddenIfEmpty(EType folder_type); // folder is not displayed if empty
static const std::string& lookupNewCategoryName(EType folder_type); // default name when creating new category
static LLFolderType::EType lookupTypeFromNewCategoryName(const std::string& name); // default name when creating new category
diff --git a/indra/newview/llviewerhelp.cpp b/indra/newview/llviewerhelp.cpp
index 9fe8c142b9..a8a918f259 100644
--- a/indra/newview/llviewerhelp.cpp
+++ b/indra/newview/llviewerhelp.cpp
@@ -69,15 +69,12 @@ LLHelpHandler gHelpHandler;
//////////////////////////////
// implement LLHelp interface
-void LLViewerHelp::showTopic(const std::string &topic)
+std::string LLViewerHelp::getURL(const std::string &topic)
{
// allow overriding the help server with a local help file
if( gSavedSettings.getBOOL("HelpUseLocal") )
{
- showHelp();
- LLFloaterHelpBrowser* helpbrowser = dynamic_cast<LLFloaterHelpBrowser*>(LLFloaterReg::getInstance("help_browser"));
- helpbrowser->navigateToLocalPage( "help-offline" , "index.html" );
- return;
+ return "__local";
}
// if the help topic is empty, use the default topic
@@ -99,10 +96,12 @@ void LLViewerHelp::showTopic(const std::string &topic)
}
}
- // work out the URL for this topic and display it
- showHelp();
- std::string helpURL = LLViewerHelpUtil::buildHelpURL( help_topic );
- setRawURL( helpURL );
+ return LLViewerHelpUtil::buildHelpURL( help_topic );
+}
+
+void LLViewerHelp::showTopic(const std::string& topic)
+{
+ LLFloaterReg::showInstance("help_browser", topic);
}
std::string LLViewerHelp::defaultTopic()
@@ -145,34 +144,3 @@ std::string LLViewerHelp::getTopicFromFocus()
return defaultTopic();
}
-// static
-void LLViewerHelp::showHelp()
-{
- LLFloaterHelpBrowser* helpbrowser = dynamic_cast<LLFloaterHelpBrowser*>(LLFloaterReg::getInstance("help_browser"));
- if (helpbrowser)
- {
- BOOL visible = TRUE;
- BOOL take_focus = TRUE;
- helpbrowser->setVisible(visible);
- helpbrowser->setFrontmost(take_focus);
- }
- else
- {
- llwarns << "Eep, help_browser floater not found" << llendl;
- }
-}
-
-// static
-void LLViewerHelp::setRawURL(std::string url)
-{
- LLFloaterHelpBrowser* helpbrowser = dynamic_cast<LLFloaterHelpBrowser*>(LLFloaterReg::getInstance("help_browser"));
- if (helpbrowser)
- {
- helpbrowser->openMedia(url);
- }
- else
- {
- llwarns << "Eep, help_browser floater not found" << llendl;
- }
-}
-
diff --git a/indra/newview/llviewerhelp.h b/indra/newview/llviewerhelp.h
index 7612986227..a983012e2e 100644
--- a/indra/newview/llviewerhelp.h
+++ b/indra/newview/llviewerhelp.h
@@ -45,6 +45,8 @@ class LLViewerHelp : public LLHelp, public LLSingleton<LLViewerHelp>
/// display the specified help topic in the help viewer
/*virtual*/ void showTopic(const std::string &topic);
+ std::string getURL(const std::string& topic);
+
// return topic derived from viewer UI focus, else default topic
std::string getTopicFromFocus();
@@ -56,10 +58,6 @@ class LLViewerHelp : public LLHelp, public LLSingleton<LLViewerHelp>
// return topic to use for the top-level help, invoked by F1
/*virtual*/ std::string f1HelpTopic();
-
- private:
- static void showHelp(); // make sure help UI is visible & raised
- static void setRawURL(std::string url); // send URL to help UI
};
#endif // header guard
diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp
index 7dbaa4cf92..45ca23cdfe 100644
--- a/indra/newview/llviewerinventory.cpp
+++ b/indra/newview/llviewerinventory.cpp
@@ -34,7 +34,9 @@
#include "llagent.h"
#include "llagentcamera.h"
#include "llagentwearables.h"
+#include "llfloatersidepanelcontainer.h"
#include "llviewerfoldertype.h"
+#include "llfloatersidepanelcontainer.h"
#include "llfolderview.h"
#include "llviewercontrol.h"
#include "llconsole.h"
@@ -43,11 +45,11 @@
#include "llinventorymodel.h"
#include "llinventorymodelbackgroundfetch.h"
#include "llgesturemgr.h"
-#include "llsidetray.h"
#include "llinventorybridge.h"
#include "llinventorypanel.h"
#include "llfloaterinventory.h"
+#include "lllandmarkactions.h"
#include "llviewerassettype.h"
#include "llviewerregion.h"
@@ -59,6 +61,9 @@
#include "llcommandhandler.h"
#include "llviewermessage.h"
#include "llsidepanelappearance.h"
+#include "llavatarnamecache.h"
+#include "llavataractions.h"
+#include "lllogininstance.h"
///----------------------------------------------------------------------------
/// Helper class to store special inventory item names and their localized values.
@@ -85,6 +90,7 @@ public:
mInventoryItemsDict["New Skirt"] = LLTrans::getString("New Skirt");
mInventoryItemsDict["New Alpha"] = LLTrans::getString("New Alpha");
mInventoryItemsDict["New Tattoo"] = LLTrans::getString("New Tattoo");
+ mInventoryItemsDict["New Physics"] = LLTrans::getString("New Physics");
mInventoryItemsDict["Invalid Wearable"] = LLTrans::getString("Invalid Wearable");
mInventoryItemsDict["New Gesture"] = LLTrans::getString("New Gesture");
@@ -134,7 +140,35 @@ public:
mInventoryItemsDict["Female - Shrug"] = LLTrans::getString("Female - Shrug");
mInventoryItemsDict["Female - Stick tougue out"]= LLTrans::getString("Female - Stick tougue out");
mInventoryItemsDict["Female - Wow"] = LLTrans::getString("Female - Wow");
-
+
+ //common
+ mInventoryItemsDict["/bow"] = LLTrans::getString("/bow");
+ mInventoryItemsDict["/clap"] = LLTrans::getString("/clap");
+ mInventoryItemsDict["/count"] = LLTrans::getString("/count");
+ mInventoryItemsDict["/extinguish"] = LLTrans::getString("/extinguish");
+ mInventoryItemsDict["/kmb"] = LLTrans::getString("/kmb");
+ mInventoryItemsDict["/muscle"] = LLTrans::getString("/muscle");
+ mInventoryItemsDict["/no"] = LLTrans::getString("/no");
+ mInventoryItemsDict["/no!"] = LLTrans::getString("/no!");
+ mInventoryItemsDict["/paper"] = LLTrans::getString("/paper");
+ mInventoryItemsDict["/pointme"] = LLTrans::getString("/pointme");
+ mInventoryItemsDict["/pointyou"] = LLTrans::getString("/pointyou");
+ mInventoryItemsDict["/rock"] = LLTrans::getString("/rock");
+ mInventoryItemsDict["/scissor"] = LLTrans::getString("/scissor");
+ mInventoryItemsDict["/smoke"] = LLTrans::getString("/smoke");
+ mInventoryItemsDict["/stretch"] = LLTrans::getString("/stretch");
+ mInventoryItemsDict["/whistle"] = LLTrans::getString("/whistle");
+ mInventoryItemsDict["/yes"] = LLTrans::getString("/yes");
+ mInventoryItemsDict["/yes!"] = LLTrans::getString("/yes!");
+ mInventoryItemsDict["afk"] = LLTrans::getString("afk");
+ mInventoryItemsDict["dance1"] = LLTrans::getString("dance1");
+ mInventoryItemsDict["dance2"] = LLTrans::getString("dance2");
+ mInventoryItemsDict["dance3"] = LLTrans::getString("dance3");
+ mInventoryItemsDict["dance4"] = LLTrans::getString("dance4");
+ mInventoryItemsDict["dance5"] = LLTrans::getString("dance5");
+ mInventoryItemsDict["dance6"] = LLTrans::getString("dance6");
+ mInventoryItemsDict["dance7"] = LLTrans::getString("dance7");
+ mInventoryItemsDict["dance8"] = LLTrans::getString("dance8");
}
/**
@@ -178,10 +212,16 @@ public:
return false;
}
+ if (!LLUI::sSettingGroups["config"]->getBOOL("EnableInventory"))
+ {
+ LLNotificationsUtil::add("NoInventory", LLSD(), LLSD(), std::string("SwitchToStandardSkinAndQuit"));
+ return true;
+ }
+
// support secondlife:///app/inventory/show
if (params[0].asString() == "show")
{
- LLSideTray::getInstance()->showPanel("sidepanel_inventory", LLSD());
+ LLFloaterSidePanelContainer::showPanel("inventory", LLSD());
return true;
}
@@ -211,6 +251,7 @@ public:
};
LLInventoryHandler gInventoryHandler;
+
///----------------------------------------------------------------------------
/// Class LLViewerInventoryItem
///----------------------------------------------------------------------------
@@ -361,11 +402,11 @@ void LLViewerInventoryItem::fetchFromServer(void) const
{
if(gAgent.getID() != mPermissions.getOwner())
{
- url = region->getCapability("FetchLib");
+ url = region->getCapability("FetchLib2");
}
else
{
- url = region->getCapability("FetchInventory");
+ url = region->getCapability("FetchInventory2");
}
}
else
@@ -395,17 +436,15 @@ void LLViewerInventoryItem::fetchFromServer(void) const
gAgent.sendReliableMessage();
}
}
- else
- {
- // *FIX: this can be removed after a bit.
- llwarns << "request to fetch complete item" << llendl;
- }
}
// virtual
BOOL LLViewerInventoryItem::unpackMessage(LLSD item)
{
BOOL rv = LLInventoryItem::fromLLSD(item);
+
+ LLLocalizedInventoryItemsDictionary::getInstance()->localizeInventoryObjectName(mName);
+
mIsComplete = TRUE;
return rv;
}
@@ -643,7 +682,7 @@ bool LLViewerInventoryCategory::fetch()
std::string url;
if (gAgent.getRegion())
{
- url = gAgent.getRegion()->getCapability("WebFetchInventoryDescendents");
+ url = gAgent.getRegion()->getCapability("FetchInventoryDescendents2");
}
else
{
@@ -655,7 +694,7 @@ bool LLViewerInventoryCategory::fetch()
}
else
{ //Deprecated, but if we don't have a capability, use the old system.
- llinfos << "WebFetchInventoryDescendents capability not found. Using deprecated UDP message." << llendl;
+ llinfos << "FetchInventoryDescendents2 capability not found. Using deprecated UDP message." << llendl;
LLMessageSystem* msg = gMessageSystem;
msg->newMessage("FetchInventoryDescendents");
msg->nextBlock("AgentData");
@@ -933,7 +972,7 @@ void ModifiedCOFCallback::fire(const LLUUID& inv_item)
if( gAgentCamera.cameraCustomizeAvatar() )
{
// If we're in appearance editing mode, the current tab may need to be refreshed
- LLSidepanelAppearance *panel = dynamic_cast<LLSidepanelAppearance*>(LLSideTray::getInstance()->getPanel("sidepanel_appearance"));
+ LLSidepanelAppearance *panel = dynamic_cast<LLSidepanelAppearance*>(LLFloaterSidePanelContainer::getPanel("appearance"));
if (panel)
{
panel->showDefaultSubpart();
@@ -1165,7 +1204,23 @@ void move_inventory_item(
gAgent.sendReliableMessage();
}
-void copy_inventory_from_notecard(const LLUUID& object_id, const LLUUID& notecard_inv_id, const LLInventoryItem *src, U32 callback_id)
+const LLUUID get_folder_by_itemtype(const LLInventoryItem *src)
+{
+ LLUUID retval = LLUUID::null;
+
+ if (src)
+ {
+ retval = gInventory.findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(src->getType()));
+ }
+
+ return retval;
+}
+
+void copy_inventory_from_notecard(const LLUUID& destination_id,
+ const LLUUID& object_id,
+ const LLUUID& notecard_inv_id,
+ const LLInventoryItem *src,
+ U32 callback_id)
{
if (NULL == src)
{
@@ -1211,7 +1266,7 @@ void copy_inventory_from_notecard(const LLUUID& object_id, const LLUUID& notecar
body["notecard-id"] = notecard_inv_id;
body["object-id"] = object_id;
body["item-id"] = src->getUUID();
- body["folder-id"] = gInventory.findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(src->getType()));
+ body["folder-id"] = destination_id;
body["callback-id"] = (LLSD::Integer)callback_id;
request["message"] = "CopyInventoryFromNotecard";
@@ -1257,7 +1312,7 @@ void menu_create_inventory_item(LLFolderView* root, LLFolderBridge *bridge, cons
{
std::string type_name = userdata.asString();
- if (("category" == type_name) || ("current" == type_name) || ("outfit" == type_name) || ("my_otfts" == type_name))
+ if (("inbox" == type_name) || ("outbox" == type_name) || ("category" == type_name) || ("current" == type_name) || ("outfit" == type_name) || ("my_otfts" == type_name))
{
LLFolderType::EType preferred_type = LLFolderType::lookup(type_name);
@@ -1402,6 +1457,7 @@ const std::string& LLViewerInventoryItem::getName() const
class LLFavoritesOrderStorage : public LLSingleton<LLFavoritesOrderStorage>
, public LLDestroyClass<LLFavoritesOrderStorage>
{
+ LOG_CLASS(LLFavoritesOrderStorage);
public:
/**
* Sets sort index for specified with LLUUID favorite landmark
@@ -1414,6 +1470,8 @@ public:
S32 getSortIndex(const LLUUID& inv_item_id);
void removeSortIndex(const LLUUID& inv_item_id);
+ void getSLURL(const LLUUID& asset_id);
+
/**
* Implementation of LLDestroyClass. Calls cleanup() instance method.
*
@@ -1440,9 +1498,20 @@ private:
void load();
void save();
+ void saveFavoritesSLURLs();
+
+ // Remove record of current user's favorites from file on disk.
+ void removeFavoritesRecordOfUser();
+
+ void onLandmarkLoaded(const LLUUID& asset_id, LLLandmark* landmark);
+ void storeFavoriteSLURL(const LLUUID& asset_id, std::string& slurl);
+
typedef std::map<LLUUID, S32> sort_index_map_t;
sort_index_map_t mSortIndexes;
+ typedef std::map<LLUUID, std::string> slurls_map_t;
+ slurls_map_t mSLURLs;
+
bool mIsDirty;
struct IsNotInFavorites
@@ -1497,10 +1566,31 @@ void LLFavoritesOrderStorage::removeSortIndex(const LLUUID& inv_item_id)
mIsDirty = true;
}
+void LLFavoritesOrderStorage::getSLURL(const LLUUID& asset_id)
+{
+ slurls_map_t::iterator slurl_iter = mSLURLs.find(asset_id);
+ if (slurl_iter != mSLURLs.end()) return; // SLURL for current landmark is already cached
+
+ LLLandmark* lm = gLandmarkList.getAsset(asset_id,
+ boost::bind(&LLFavoritesOrderStorage::onLandmarkLoaded, this, asset_id, _1));
+ if (lm)
+ {
+ onLandmarkLoaded(asset_id, lm);
+ }
+}
+
// static
void LLFavoritesOrderStorage::destroyClass()
{
LLFavoritesOrderStorage::instance().cleanup();
+ if (gSavedPerAccountSettings.getBOOL("ShowFavoritesOnLogin"))
+ {
+ LLFavoritesOrderStorage::instance().saveFavoritesSLURLs();
+ }
+ else
+ {
+ LLFavoritesOrderStorage::instance().removeFavoritesRecordOfUser();
+ }
}
void LLFavoritesOrderStorage::load()
@@ -1523,6 +1613,114 @@ void LLFavoritesOrderStorage::load()
}
}
+void LLFavoritesOrderStorage::saveFavoritesSLURLs()
+{
+ // Do not change the file if we are not logged in yet.
+ if (!LLLoginInstance::getInstance()->authSuccess())
+ {
+ llwarns << "Cannot save favorites: not logged in" << llendl;
+ return;
+ }
+
+ std::string user_dir = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "");
+ if (user_dir.empty())
+ {
+ llwarns << "Cannot save favorites: empty user dir name" << llendl;
+ return;
+ }
+
+ std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "stored_favorites.xml");
+ llifstream in_file;
+ in_file.open(filename);
+ LLSD fav_llsd;
+ if (in_file.is_open())
+ {
+ LLSDSerialize::fromXML(fav_llsd, in_file);
+ }
+
+ const LLUUID fav_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE);
+ LLInventoryModel::cat_array_t cats;
+ LLInventoryModel::item_array_t items;
+ gInventory.collectDescendents(fav_id, cats, items, LLInventoryModel::EXCLUDE_TRASH);
+
+ LLSD user_llsd;
+ for (LLInventoryModel::item_array_t::iterator it = items.begin(); it != items.end(); it++)
+ {
+ LLSD value;
+ value["name"] = (*it)->getName();
+ value["asset_id"] = (*it)->getAssetUUID();
+
+ slurls_map_t::iterator slurl_iter = mSLURLs.find(value["asset_id"]);
+ if (slurl_iter != mSLURLs.end())
+ {
+ lldebugs << "Saving favorite: idx=" << (*it)->getSortField() << ", SLURL=" << slurl_iter->second << ", value=" << value << llendl;
+ value["slurl"] = slurl_iter->second;
+ user_llsd[(*it)->getSortField()] = value;
+ }
+ else
+ {
+ llwarns << "Not saving favorite " << value["name"] << ": no matching SLURL" << llendl;
+ }
+ }
+
+ LLAvatarName av_name;
+ LLAvatarNameCache::get( gAgentID, &av_name );
+ lldebugs << "Saved favorites for " << av_name.getLegacyName() << llendl;
+ fav_llsd[av_name.getLegacyName()] = user_llsd;
+
+ llofstream file;
+ file.open(filename);
+ LLSDSerialize::toPrettyXML(fav_llsd, file);
+}
+
+void LLFavoritesOrderStorage::removeFavoritesRecordOfUser()
+{
+ std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "stored_favorites.xml");
+ LLSD fav_llsd;
+ llifstream file;
+ file.open(filename);
+ if (!file.is_open()) return;
+ LLSDSerialize::fromXML(fav_llsd, file);
+
+ LLAvatarName av_name;
+ LLAvatarNameCache::get( gAgentID, &av_name );
+ lldebugs << "Removed favorites for " << av_name.getLegacyName() << llendl;
+ if (fav_llsd.has(av_name.getLegacyName()))
+ {
+ fav_llsd.erase(av_name.getLegacyName());
+ }
+
+ llofstream out_file;
+ out_file.open(filename);
+ LLSDSerialize::toPrettyXML(fav_llsd, out_file);
+
+}
+
+void LLFavoritesOrderStorage::onLandmarkLoaded(const LLUUID& asset_id, LLLandmark* landmark)
+{
+ if (!landmark) return;
+
+ LLVector3d pos_global;
+ if (!landmark->getGlobalPos(pos_global))
+ {
+ // If global position was unknown on first getGlobalPos() call
+ // it should be set for the subsequent calls.
+ landmark->getGlobalPos(pos_global);
+ }
+
+ if (!pos_global.isExactlyZero())
+ {
+ LLLandmarkActions::getSLURLfromPosGlobal(pos_global,
+ boost::bind(&LLFavoritesOrderStorage::storeFavoriteSLURL, this, asset_id, _1));
+ }
+}
+
+void LLFavoritesOrderStorage::storeFavoriteSLURL(const LLUUID& asset_id, std::string& slurl)
+{
+ lldebugs << "Saving landmark SLURL: " << slurl << llendl;
+ mSLURLs[asset_id] = slurl;
+}
+
void LLFavoritesOrderStorage::save()
{
// nothing to save if clean
@@ -1579,6 +1777,12 @@ S32 LLViewerInventoryItem::getSortField() const
void LLViewerInventoryItem::setSortField(S32 sortField)
{
LLFavoritesOrderStorage::instance().setSortIndex(mUUID, sortField);
+ getSLURL();
+}
+
+void LLViewerInventoryItem::getSLURL()
+{
+ LLFavoritesOrderStorage::instance().getSLURL(mAssetUUID);
}
const LLPermissions& LLViewerInventoryItem::getPermissions() const
diff --git a/indra/newview/llviewerinventory.h b/indra/newview/llviewerinventory.h
index 1af06a1be8..7822ef4da6 100644
--- a/indra/newview/llviewerinventory.h
+++ b/indra/newview/llviewerinventory.h
@@ -62,6 +62,7 @@ public:
virtual const std::string& getName() const;
virtual S32 getSortField() const;
virtual void setSortField(S32 sortField);
+ virtual void getSLURL(); //Caches SLURL for landmark. //*TODO: Find a better way to do it and remove this method from here.
virtual const LLPermissions& getPermissions() const;
virtual const bool getIsFullPerm() const; // 'fullperm' in the popular sense: modify-ok & copy-ok & transfer-ok, no special god rules applied
virtual const LLUUID& getCreatorUUID() const;
@@ -362,7 +363,10 @@ void move_inventory_item(
const std::string& new_name,
LLPointer<LLInventoryCallback> cb);
-void copy_inventory_from_notecard(const LLUUID& object_id,
+const LLUUID get_folder_by_itemtype(const LLInventoryItem *src);
+
+void copy_inventory_from_notecard(const LLUUID& destination_id,
+ const LLUUID& object_id,
const LLUUID& notecard_inv_id,
const LLInventoryItem *src,
U32 callback_id = 0);
diff --git a/indra/newview/llviewerjoint.cpp b/indra/newview/llviewerjoint.cpp
index baf85d6884..a907f102f8 100644
--- a/indra/newview/llviewerjoint.cpp
+++ b/indra/newview/llviewerjoint.cpp
@@ -126,7 +126,7 @@ void LLViewerJoint::setValid( BOOL valid, BOOL recursive )
// //----------------------------------------------------------------
// // push matrix stack
// //----------------------------------------------------------------
-// glPushMatrix();
+// gGL.pushMatrix();
// //----------------------------------------------------------------
// // render the bone to my parent
@@ -140,8 +140,8 @@ void LLViewerJoint::setValid( BOOL valid, BOOL recursive )
// // offset to joint position and
// // rotate to our orientation
// //----------------------------------------------------------------
-// glLoadIdentity();
-// glMultMatrixf( &getWorldMatrix().mMatrix[0][0] );
+// gGL.loadIdentity();
+// gGL.multMatrix( &getWorldMatrix().mMatrix[0][0] );
// //----------------------------------------------------------------
// // render joint axes
@@ -233,7 +233,7 @@ void LLViewerJoint::setValid( BOOL valid, BOOL recursive )
// //----------------------------------------------------------------
// // pop matrix stack
// //----------------------------------------------------------------
-// glPopMatrix();
+// gGL.popMatrix();
// }
@@ -346,7 +346,7 @@ U32 LLViewerJoint::render( F32 pixelArea, BOOL first_pass, BOOL is_dummy )
// F32 boneSize = 0.02f;
// // rotate to point to child (bone direction)
-// glPushMatrix();
+// gGL.pushMatrix();
// LLVector3 boneX = getPosition();
// F32 length = boneX.normVec();
@@ -362,7 +362,7 @@ U32 LLViewerJoint::render( F32 pixelArea, BOOL first_pass, BOOL is_dummy )
// rotateMat.setFwdRow( boneX );
// rotateMat.setLeftRow( boneY );
// rotateMat.setUpRow( boneZ );
-// glMultMatrixf( &rotateMat.mMatrix[0][0] );
+// gGL.multMatrix( &rotateMat.mMatrix[0][0] );
// // render the bone
// gGL.color3f( 0.5f, 0.5f, 0.0f );
@@ -388,7 +388,7 @@ U32 LLViewerJoint::render( F32 pixelArea, BOOL first_pass, BOOL is_dummy )
// gGL.end();
// // restore matrix
-// glPopMatrix();
+// gGL.popMatrix();
// }
//--------------------------------------------------------------------
@@ -541,9 +541,9 @@ void LLViewerJointCollisionVolume::renderCollision()
updateWorldMatrix();
gGL.pushMatrix();
- glMultMatrixf( &mXform.getWorldMatrix().mMatrix[0][0] );
+ gGL.multMatrix( &mXform.getWorldMatrix().mMatrix[0][0] );
- gGL.color3f( 0.f, 0.f, 1.f );
+ gGL.diffuseColor3f( 0.f, 0.f, 1.f );
gGL.begin(LLRender::LINES);
diff --git a/indra/newview/llviewerjointmesh.cpp b/indra/newview/llviewerjointmesh.cpp
index e59e685f53..e052e37393 100644
--- a/indra/newview/llviewerjointmesh.cpp
+++ b/indra/newview/llviewerjointmesh.cpp
@@ -55,6 +55,7 @@
#include "v4math.h"
#include "m3math.h"
#include "m4math.h"
+#include "llmatrix4a.h"
#if !LL_DARWIN && !LL_LINUX && !LL_SOLARIS
extern PFNGLWEIGHTPOINTERARBPROC glWeightPointerARB;
@@ -62,7 +63,6 @@ extern PFNGLWEIGHTFVARBPROC glWeightfvARB;
extern PFNGLVERTEXBLENDARBPROC glVertexBlendARB;
#endif
-static LLPointer<LLVertexBuffer> sRenderBuffer = NULL;
static const U32 sRenderMask = LLVertexBuffer::MAP_VERTEX |
LLVertexBuffer::MAP_NORMAL |
LLVertexBuffer::MAP_TEXCOORD0;
@@ -375,6 +375,7 @@ const S32 NUM_AXES = 3;
// pivot parent 0-n -- child = n+1
static LLMatrix4 gJointMatUnaligned[32];
+static LLMatrix4a gJointMatAligned[32];
static LLMatrix3 gJointRotUnaligned[32];
static LLVector4 gJointPivot[32];
@@ -457,9 +458,20 @@ void LLViewerJointMesh::uploadJointMatrices()
}
}
stop_glerror();
- glUniform4fvARB(gAvatarMatrixParam, 45, mat);
+ if (LLGLSLShader::sCurBoundShaderPtr)
+ {
+ LLGLSLShader::sCurBoundShaderPtr->uniform4fv(LLViewerShaderMgr::AVATAR_MATRIX, 45, mat);
+ }
stop_glerror();
}
+ else
+ {
+ //load gJointMatUnaligned into gJointMatAligned
+ for (joint_num = 0; joint_num < reference_mesh->mJointRenderData.count(); ++joint_num)
+ {
+ gJointMatAligned[joint_num].loadu(gJointMatUnaligned[joint_num]);
+ }
+ }
}
//--------------------------------------------------------------------
@@ -501,27 +513,30 @@ int compare_int(const void *a, const void *b)
U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy)
{
if (!mValid || !mMesh || !mFace || !mVisible ||
- mFace->mVertexBuffer.isNull() ||
- mMesh->getNumFaces() == 0)
+ !mFace->getVertexBuffer() ||
+ mMesh->getNumFaces() == 0 ||
+ (LLGLSLShader::sNoFixedFunction && LLGLSLShader::sCurBoundShaderPtr == NULL))
{
return 0;
}
U32 triangle_count = 0;
+ S32 diffuse_channel = LLDrawPoolAvatar::sDiffuseChannel;
+
stop_glerror();
//----------------------------------------------------------------
// setup current color
//----------------------------------------------------------------
if (is_dummy)
- glColor4fv(LLVOAvatar::getDummyColor().mV);
+ gGL.diffuseColor4fv(LLVOAvatar::getDummyColor().mV);
else
- glColor4fv(mColor.mV);
+ gGL.diffuseColor4fv(mColor.mV);
stop_glerror();
- LLGLSSpecular specular(LLColor4(1.f,1.f,1.f,1.f), mShiny && !(mFace->getPool()->getVertexShaderLevel() > 0));
+ LLGLSSpecular specular(LLColor4(1.f,1.f,1.f,1.f), (mFace->getPool()->getVertexShaderLevel() > 0 || LLGLSLShader::sNoFixedFunction) ? 0.f : mShiny);
//----------------------------------------------------------------
// setup current texture
@@ -531,33 +546,27 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy)
LLTexUnit::eTextureAddressMode old_mode = LLTexUnit::TAM_WRAP;
if (mTestImageName)
{
- gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, mTestImageName);
+ gGL.getTexUnit(diffuse_channel)->bindManual(LLTexUnit::TT_TEXTURE, mTestImageName);
if (mIsTransparent)
{
- glColor4f(1.f, 1.f, 1.f, 1.f);
+ gGL.diffuseColor4f(1.f, 1.f, 1.f, 1.f);
}
else
{
- glColor4f(0.7f, 0.6f, 0.3f, 1.f);
- gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_LERP_TEX_ALPHA, LLTexUnit::TBS_TEX_COLOR, LLTexUnit::TBS_PREV_COLOR);
+ gGL.diffuseColor4f(0.7f, 0.6f, 0.3f, 1.f);
+ gGL.getTexUnit(diffuse_channel)->setTextureColorBlend(LLTexUnit::TBO_LERP_TEX_ALPHA, LLTexUnit::TBS_TEX_COLOR, LLTexUnit::TBS_PREV_COLOR);
}
}
else if( !is_dummy && mLayerSet )
{
if( mLayerSet->hasComposite() )
{
- gGL.getTexUnit(0)->bind(mLayerSet->getComposite());
+ gGL.getTexUnit(diffuse_channel)->bind(mLayerSet->getComposite());
}
else
{
- // This warning will always trigger if you've hacked the avatar to show as incomplete.
- // Ignore the warning if that's the case.
- if (!gSavedSettings.getBOOL("RenderUnloadedAvatar"))
- {
- //llwarns << "Layerset without composite" << llendl;
- }
- gGL.getTexUnit(0)->bind(LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT));
+ gGL.getTexUnit(diffuse_channel)->bind(LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT));
}
}
else
@@ -567,22 +576,25 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy)
{
old_mode = mTexture->getAddressMode();
}
- gGL.getTexUnit(0)->bind(mTexture.get());
- gGL.getTexUnit(0)->bind(mTexture);
- gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
+ gGL.getTexUnit(diffuse_channel)->bind(mTexture.get());
+ gGL.getTexUnit(diffuse_channel)->bind(mTexture);
+ gGL.getTexUnit(diffuse_channel)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
}
else
{
- gGL.getTexUnit(0)->bind(LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT));
+ gGL.getTexUnit(diffuse_channel)->bind(LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT));
}
- mFace->mVertexBuffer->setBuffer(sRenderMask);
+
+ U32 mask = sRenderMask;
U32 start = mMesh->mFaceVertexOffset;
U32 end = start + mMesh->mFaceVertexCount - 1;
U32 count = mMesh->mFaceIndexCount;
U32 offset = mMesh->mFaceIndexOffset;
+ LLVertexBuffer* buff = mFace->getVertexBuffer();
+
if (mMesh->hasWeights())
{
if ((mFace->getPool()->getVertexShaderLevel() > 0))
@@ -591,17 +603,24 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy)
{
uploadJointMatrices();
}
+ mask = mask | LLVertexBuffer::MAP_WEIGHT;
+ if (mFace->getPool()->getVertexShaderLevel() > 1)
+ {
+ mask = mask | LLVertexBuffer::MAP_CLOTHWEIGHT;
+ }
}
- mFace->mVertexBuffer->drawRange(LLRender::TRIANGLES, start, end, count, offset);
+ buff->setBuffer(mask);
+ buff->drawRange(LLRender::TRIANGLES, start, end, count, offset);
}
else
{
- glPushMatrix();
+ gGL.pushMatrix();
LLMatrix4 jointToWorld = getWorldMatrix();
- glMultMatrixf((GLfloat*)jointToWorld.mMatrix);
- mFace->mVertexBuffer->drawRange(LLRender::TRIANGLES, start, end, count, offset);
- glPopMatrix();
+ gGL.multMatrix((GLfloat*)jointToWorld.mMatrix);
+ buff->setBuffer(mask);
+ buff->drawRange(LLRender::TRIANGLES, start, end, count, offset);
+ gGL.popMatrix();
}
gPipeline.addTrianglesDrawn(count);
@@ -609,13 +628,13 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy)
if (mTestImageName)
{
- gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
+ gGL.getTexUnit(diffuse_channel)->setTextureBlendType(LLTexUnit::TB_MULT);
}
if (mTexture.notNull() && !is_dummy)
{
- gGL.getTexUnit(0)->bind(mTexture);
- gGL.getTexUnit(0)->setTextureAddressMode(old_mode);
+ gGL.getTexUnit(diffuse_channel)->bind(mTexture);
+ gGL.getTexUnit(diffuse_channel)->setTextureAddressMode(old_mode);
}
return triangle_count;
@@ -626,6 +645,9 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy)
//-----------------------------------------------------------------------------
void LLViewerJointMesh::updateFaceSizes(U32 &num_vertices, U32& num_indices, F32 pixel_area)
{
+ //bump num_vertices to next multiple of 4
+ num_vertices = (num_vertices + 0x3) & ~0x3;
+
// Do a pre-alloc pass to determine sizes of data.
if (mMesh && mValid)
{
@@ -648,13 +670,25 @@ static LLFastTimer::DeclareTimer FTM_AVATAR_FACE("Avatar Face");
void LLViewerJointMesh::updateFaceData(LLFace *face, F32 pixel_area, BOOL damp_wind, bool terse_update)
{
+ //IF THIS FUNCTION BREAKS, SEE LLPOLYMESH CONSTRUCTOR AND CHECK ALIGNMENT OF INPUT ARRAYS
+
mFace = face;
- if (mFace->mVertexBuffer.isNull())
+ if (!mFace->getVertexBuffer())
{
return;
}
+ LLDrawPool *poolp = mFace->getPool();
+ BOOL hardware_skinning = (poolp && poolp->getVertexShaderLevel() > 0) ? TRUE : FALSE;
+
+ if (!hardware_skinning && terse_update)
+ { //no need to do terse updates if we're doing software vertex skinning
+ // since mMesh is being copied into mVertexBuffer every frame
+ return;
+ }
+
+
LLFastTimer t(FTM_AVATAR_FACE);
LLStrider<LLVector3> verticesp;
@@ -667,111 +701,59 @@ void LLViewerJointMesh::updateFaceData(LLFace *face, F32 pixel_area, BOOL damp_w
// Copy data into the faces from the polymesh data.
if (mMesh && mValid)
{
- if (mMesh->getNumVertices())
+ const U32 num_verts = mMesh->getNumVertices();
+
+ if (num_verts)
{
- stop_glerror();
+ face->getVertexBuffer()->getIndexStrider(indicesp);
face->getGeometryAvatar(verticesp, normalsp, tex_coordsp, vertex_weightsp, clothing_weightsp);
- stop_glerror();
- face->mVertexBuffer->getIndexStrider(indicesp);
- stop_glerror();
-
+
verticesp += mMesh->mFaceVertexOffset;
- tex_coordsp += mMesh->mFaceVertexOffset;
normalsp += mMesh->mFaceVertexOffset;
- vertex_weightsp += mMesh->mFaceVertexOffset;
- clothing_weightsp += mMesh->mFaceVertexOffset;
+
+ F32* v = (F32*) verticesp.get();
+ F32* n = (F32*) normalsp.get();
+
+ U32 words = num_verts*4;
+
+ LLVector4a::memcpyNonAliased16(v, (F32*) mMesh->getCoords(), words*sizeof(F32));
+ LLVector4a::memcpyNonAliased16(n, (F32*) mMesh->getNormals(), words*sizeof(F32));
+
+
+ if (!terse_update)
+ {
+ vertex_weightsp += mMesh->mFaceVertexOffset;
+ clothing_weightsp += mMesh->mFaceVertexOffset;
+ tex_coordsp += mMesh->mFaceVertexOffset;
+
+ F32* tc = (F32*) tex_coordsp.get();
+ F32* vw = (F32*) vertex_weightsp.get();
+ F32* cw = (F32*) clothing_weightsp.get();
- const U32* __restrict coords = (U32*) mMesh->getCoords();
- const U32* __restrict tex_coords = (U32*) mMesh->getTexCoords();
- const U32* __restrict normals = (U32*) mMesh->getNormals();
- const U32* __restrict weights = (U32*) mMesh->getWeights();
- const U32* __restrict cloth_weights = (U32*) mMesh->getClothingWeights();
+ LLVector4a::memcpyNonAliased16(tc, (F32*) mMesh->getTexCoords(), num_verts*2*sizeof(F32));
+ LLVector4a::memcpyNonAliased16(vw, (F32*) mMesh->getWeights(), num_verts*sizeof(F32));
+ LLVector4a::memcpyNonAliased16(cw, (F32*) mMesh->getClothingWeights(), num_verts*4*sizeof(F32));
+ }
- const U32 num_verts = mMesh->getNumVertices();
+ const U32 idx_count = mMesh->getNumFaces()*3;
- U32 i = 0;
+ indicesp += mMesh->mFaceIndexOffset;
- const U32 skip = verticesp.getSkip()/sizeof(U32);
+ U16* __restrict idx = indicesp.get();
+ S32* __restrict src_idx = (S32*) mMesh->getFaces();
- U32* __restrict v = (U32*) verticesp.get();
- U32* __restrict n = (U32*) normalsp.get();
-
- if (terse_update)
+ const S32 offset = (S32) mMesh->mFaceVertexOffset;
+
+ for (S32 i = 0; i < idx_count; ++i)
{
- for (S32 i = num_verts; i > 0; --i)
- {
- //morph target application only, only update positions and normals
- v[0] = coords[0];
- v[1] = coords[1];
- v[2] = coords[2];
- coords += 3;
- v += skip;
- }
-
- for (S32 i = num_verts; i > 0; --i)
- {
- n[0] = normals[0];
- n[1] = normals[1];
- n[2] = normals[2];
- normals += 3;
- n += skip;
- }
- }
- else
- {
-
- U32* __restrict tc = (U32*) tex_coordsp.get();
- U32* __restrict vw = (U32*) vertex_weightsp.get();
- U32* __restrict cw = (U32*) clothing_weightsp.get();
-
- do
- {
- v[0] = *(coords++);
- v[1] = *(coords++);
- v[2] = *(coords++);
- v += skip;
-
- tc[0] = *(tex_coords++);
- tc[1] = *(tex_coords++);
- tc += skip;
-
- n[0] = *(normals++);
- n[1] = *(normals++);
- n[2] = *(normals++);
- n += skip;
-
- vw[0] = *(weights++);
- vw += skip;
-
- cw[0] = *(cloth_weights++);
- cw[1] = *(cloth_weights++);
- cw[2] = *(cloth_weights++);
- cw[3] = *(cloth_weights++);
- cw += skip;
- }
- while (++i < num_verts);
-
- const U32 idx_count = mMesh->getNumFaces()*3;
-
- indicesp += mMesh->mFaceIndexOffset;
-
- U16* __restrict idx = indicesp.get();
- S32* __restrict src_idx = (S32*) mMesh->getFaces();
-
- i = 0;
-
- const S32 offset = (S32) mMesh->mFaceVertexOffset;
-
- do
- {
- *(idx++) = *(src_idx++)+offset;
- }
- while (++i < idx_count);
+ *(idx++) = *(src_idx++)+offset;
}
}
}
}
+
+
//-----------------------------------------------------------------------------
// updateLOD()
//-----------------------------------------------------------------------------
@@ -783,155 +765,58 @@ BOOL LLViewerJointMesh::updateLOD(F32 pixel_area, BOOL activate)
}
// static
-void LLViewerJointMesh::updateGeometryOriginal(LLFace *mFace, LLPolyMesh *mMesh)
+void LLViewerJointMesh::updateGeometry(LLFace *mFace, LLPolyMesh *mMesh)
{
LLStrider<LLVector3> o_vertices;
LLStrider<LLVector3> o_normals;
//get vertex and normal striders
- LLVertexBuffer *buffer = mFace->mVertexBuffer;
+ LLVertexBuffer* buffer = mFace->getVertexBuffer();
buffer->getVertexStrider(o_vertices, 0);
buffer->getNormalStrider(o_normals, 0);
- F32 last_weight = F32_MAX;
- LLMatrix4 gBlendMat;
- LLMatrix3 gBlendRotMat;
+ F32* __restrict vert = o_vertices[0].mV;
+ F32* __restrict norm = o_normals[0].mV;
- const F32* weights = mMesh->getWeights();
- const LLVector3* coords = mMesh->getCoords();
- const LLVector3* normals = mMesh->getNormals();
- for (U32 index = 0; index < mMesh->getNumVertices(); index++)
- {
- U32 bidx = index + mMesh->mFaceVertexOffset;
-
- // blend by first matrix
- F32 w = weights[index];
-
- // Maybe we don't have to change gBlendMat.
- // Profiles of a single-avatar scene on a Mac show this to be a very
- // common case. JC
- if (w == last_weight)
- {
- o_vertices[bidx] = coords[index] * gBlendMat;
- o_normals[bidx] = normals[index] * gBlendRotMat;
- continue;
- }
-
- last_weight = w;
+ const F32* __restrict weights = mMesh->getWeights();
+ const LLVector4a* __restrict coords = (LLVector4a*) mMesh->getCoords();
+ const LLVector4a* __restrict normals = (LLVector4a*) mMesh->getNormals();
- S32 joint = llfloor(w);
- w -= joint;
-
- // No lerp required in this case.
- if (w == 1.0f)
- {
- gBlendMat = gJointMatUnaligned[joint+1];
- o_vertices[bidx] = coords[index] * gBlendMat;
- gBlendRotMat = gJointRotUnaligned[joint+1];
- o_normals[bidx] = normals[index] * gBlendRotMat;
- continue;
- }
-
- // Try to keep all the accesses to the matrix data as close
- // together as possible. This function is a hot spot on the
- // Mac. JC
- LLMatrix4 &m0 = gJointMatUnaligned[joint+1];
- LLMatrix4 &m1 = gJointMatUnaligned[joint+0];
-
- gBlendMat.mMatrix[VX][VX] = lerp(m1.mMatrix[VX][VX], m0.mMatrix[VX][VX], w);
- gBlendMat.mMatrix[VX][VY] = lerp(m1.mMatrix[VX][VY], m0.mMatrix[VX][VY], w);
- gBlendMat.mMatrix[VX][VZ] = lerp(m1.mMatrix[VX][VZ], m0.mMatrix[VX][VZ], w);
-
- gBlendMat.mMatrix[VY][VX] = lerp(m1.mMatrix[VY][VX], m0.mMatrix[VY][VX], w);
- gBlendMat.mMatrix[VY][VY] = lerp(m1.mMatrix[VY][VY], m0.mMatrix[VY][VY], w);
- gBlendMat.mMatrix[VY][VZ] = lerp(m1.mMatrix[VY][VZ], m0.mMatrix[VY][VZ], w);
-
- gBlendMat.mMatrix[VZ][VX] = lerp(m1.mMatrix[VZ][VX], m0.mMatrix[VZ][VX], w);
- gBlendMat.mMatrix[VZ][VY] = lerp(m1.mMatrix[VZ][VY], m0.mMatrix[VZ][VY], w);
- gBlendMat.mMatrix[VZ][VZ] = lerp(m1.mMatrix[VZ][VZ], m0.mMatrix[VZ][VZ], w);
-
- gBlendMat.mMatrix[VW][VX] = lerp(m1.mMatrix[VW][VX], m0.mMatrix[VW][VX], w);
- gBlendMat.mMatrix[VW][VY] = lerp(m1.mMatrix[VW][VY], m0.mMatrix[VW][VY], w);
- gBlendMat.mMatrix[VW][VZ] = lerp(m1.mMatrix[VW][VZ], m0.mMatrix[VW][VZ], w);
-
- o_vertices[bidx] = coords[index] * gBlendMat;
-
- LLMatrix3 &n0 = gJointRotUnaligned[joint+1];
- LLMatrix3 &n1 = gJointRotUnaligned[joint+0];
-
- gBlendRotMat.mMatrix[VX][VX] = lerp(n1.mMatrix[VX][VX], n0.mMatrix[VX][VX], w);
- gBlendRotMat.mMatrix[VX][VY] = lerp(n1.mMatrix[VX][VY], n0.mMatrix[VX][VY], w);
- gBlendRotMat.mMatrix[VX][VZ] = lerp(n1.mMatrix[VX][VZ], n0.mMatrix[VX][VZ], w);
-
- gBlendRotMat.mMatrix[VY][VX] = lerp(n1.mMatrix[VY][VX], n0.mMatrix[VY][VX], w);
- gBlendRotMat.mMatrix[VY][VY] = lerp(n1.mMatrix[VY][VY], n0.mMatrix[VY][VY], w);
- gBlendRotMat.mMatrix[VY][VZ] = lerp(n1.mMatrix[VY][VZ], n0.mMatrix[VY][VZ], w);
-
- gBlendRotMat.mMatrix[VZ][VX] = lerp(n1.mMatrix[VZ][VX], n0.mMatrix[VZ][VX], w);
- gBlendRotMat.mMatrix[VZ][VY] = lerp(n1.mMatrix[VZ][VY], n0.mMatrix[VZ][VY], w);
- gBlendRotMat.mMatrix[VZ][VZ] = lerp(n1.mMatrix[VZ][VZ], n0.mMatrix[VZ][VZ], w);
-
- o_normals[bidx] = normals[index] * gBlendRotMat;
- }
+ U32 offset = mMesh->mFaceVertexOffset*4;
+ vert += offset;
+ norm += offset;
- buffer->setBuffer(0);
-}
+ for (U32 index = 0; index < mMesh->getNumVertices(); index++)
+ {
+ // equivalent to joint = floorf(weights[index]);
+ S32 joint = _mm_cvtt_ss2si(_mm_load_ss(weights+index));
+ F32 w = weights[index] - joint;
-const U32 UPDATE_GEOMETRY_CALL_MASK = 0x1FFF; // 8K samples before overflow
-const U32 UPDATE_GEOMETRY_CALL_OVERFLOW = ~UPDATE_GEOMETRY_CALL_MASK;
-static bool sUpdateGeometryCallPointer = false;
-static F64 sUpdateGeometryGlobalTime = 0.0 ;
-static F64 sUpdateGeometryElapsedTime = 0.0 ;
-static F64 sUpdateGeometryElapsedTimeOff = 0.0 ;
-static F64 sUpdateGeometryElapsedTimeOn = 0.0 ;
-static F64 sUpdateGeometryRunAvgOff[10];
-static F64 sUpdateGeometryRunAvgOn[10];
-static U32 sUpdateGeometryRunCount = 0 ;
-static U32 sUpdateGeometryCalls = 0 ;
-static U32 sUpdateGeometryLastProcessor = 0 ;
-static BOOL sVectorizePerfTest = FALSE;
-static U32 sVectorizeProcessor = 0;
-
-//static
-void (*LLViewerJointMesh::sUpdateGeometryFunc)(LLFace* face, LLPolyMesh* mesh);
-
-//static
-void LLViewerJointMesh::updateVectorize()
-{
- sVectorizePerfTest = gSavedSettings.getBOOL("VectorizePerfTest");
- sVectorizeProcessor = gSavedSettings.getU32("VectorizeProcessor");
- BOOL vectorizeEnable = gSavedSettings.getBOOL("VectorizeEnable");
- BOOL vectorizeSkin = gSavedSettings.getBOOL("VectorizeSkin");
+ LLMatrix4a gBlendMat;
- std::string vp;
- switch(sVectorizeProcessor)
- {
- case 2: vp = "SSE2"; break; // *TODO: replace the magic #s
- case 1: vp = "SSE"; break;
- default: vp = "COMPILER DEFAULT"; break;
- }
- LL_INFOS("AppInit") << "Vectorization : " << ( vectorizeEnable ? "ENABLED" : "DISABLED" ) << LL_ENDL ;
- LL_INFOS("AppInit") << "Vector Processor : " << vp << LL_ENDL ;
- LL_INFOS("AppInit") << "Vectorized Skinning : " << ( vectorizeSkin ? "ENABLED" : "DISABLED" ) << LL_ENDL ;
- if(vectorizeEnable && vectorizeSkin)
- {
- switch(sVectorizeProcessor)
+ if (w != 0.f)
{
- case 2:
- sUpdateGeometryFunc = &updateGeometrySSE2;
- break;
- case 1:
- sUpdateGeometryFunc = &updateGeometrySSE;
- break;
- default:
- sUpdateGeometryFunc = &updateGeometryVectorized;
- break;
+ // blend between matrices and apply
+ gBlendMat.setLerp(gJointMatAligned[joint+0],
+ gJointMatAligned[joint+1], w);
+
+ LLVector4a res;
+ gBlendMat.affineTransform(coords[index], res);
+ res.store4a(vert+index*4);
+ gBlendMat.rotate(normals[index], res);
+ res.store4a(norm+index*4);
+ }
+ else
+ { // No lerp required in this case.
+ LLVector4a res;
+ gJointMatAligned[joint].affineTransform(coords[index], res);
+ res.store4a(vert+index*4);
+ gJointMatAligned[joint].rotate(normals[index], res);
+ res.store4a(norm+index*4);
}
}
- else
- {
- sUpdateGeometryFunc = &updateGeometryOriginal;
- }
+
+ buffer->flush();
}
void LLViewerJointMesh::updateJointGeometry()
@@ -940,135 +825,14 @@ void LLViewerJointMesh::updateJointGeometry()
&& mMesh
&& mFace
&& mMesh->hasWeights()
- && mFace->mVertexBuffer.notNull()
+ && mFace->getVertexBuffer()
&& LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_AVATAR) == 0))
{
return;
}
- if (!sVectorizePerfTest)
- {
- // Once we've measured performance, just run the specified
- // code version.
- if(sUpdateGeometryFunc == updateGeometryOriginal)
- uploadJointMatrices();
- sUpdateGeometryFunc(mFace, mMesh);
- }
- else
- {
- // At startup, measure the amount of time in skinning and choose
- // the fastest one.
- LLTimer ug_timer ;
-
- if (sUpdateGeometryCallPointer)
- {
- if(sUpdateGeometryFunc == updateGeometryOriginal)
- uploadJointMatrices();
- // call accelerated version for this processor
- sUpdateGeometryFunc(mFace, mMesh);
- }
- else
- {
- uploadJointMatrices();
- updateGeometryOriginal(mFace, mMesh);
- }
-
- sUpdateGeometryElapsedTime += ug_timer.getElapsedTimeF64();
- ++sUpdateGeometryCalls;
- if(0 != (sUpdateGeometryCalls & UPDATE_GEOMETRY_CALL_OVERFLOW))
- {
- F64 time_since_app_start = ug_timer.getElapsedSeconds();
- if(sUpdateGeometryGlobalTime == 0.0
- || sUpdateGeometryLastProcessor != sVectorizeProcessor)
- {
- sUpdateGeometryGlobalTime = time_since_app_start;
- sUpdateGeometryElapsedTime = 0;
- sUpdateGeometryCalls = 0;
- sUpdateGeometryRunCount = 0;
- sUpdateGeometryLastProcessor = sVectorizeProcessor;
- sUpdateGeometryCallPointer = false;
- return;
- }
- F64 percent_time_in_function =
- ( sUpdateGeometryElapsedTime * 100.0 ) / ( time_since_app_start - sUpdateGeometryGlobalTime ) ;
- sUpdateGeometryGlobalTime = time_since_app_start;
- if (!sUpdateGeometryCallPointer)
- {
- // First set of run data is with vectorization off.
- sUpdateGeometryCallPointer = true;
- llinfos << "profile (avg of " << sUpdateGeometryCalls << " samples) = "
- << "vectorize off " << percent_time_in_function
- << "% of time with "
- << (sUpdateGeometryElapsedTime / (F64)sUpdateGeometryCalls)
- << " seconds per call "
- << llendl;
- sUpdateGeometryRunAvgOff[sUpdateGeometryRunCount] = percent_time_in_function;
- sUpdateGeometryElapsedTimeOff += sUpdateGeometryElapsedTime;
- sUpdateGeometryCalls = 0;
- }
- else
- {
- // Second set of run data is with vectorization on.
- sUpdateGeometryCallPointer = false;
- llinfos << "profile (avg of " << sUpdateGeometryCalls << " samples) = "
- << "VEC on " << percent_time_in_function
- << "% of time with "
- << (sUpdateGeometryElapsedTime / (F64)sUpdateGeometryCalls)
- << " seconds per call "
- << llendl;
- sUpdateGeometryRunAvgOn[sUpdateGeometryRunCount] = percent_time_in_function ;
- sUpdateGeometryElapsedTimeOn += sUpdateGeometryElapsedTime;
-
- sUpdateGeometryCalls = 0;
- sUpdateGeometryRunCount++;
- F64 a = 0.0, b = 0.0;
- for(U32 i = 0; i<sUpdateGeometryRunCount; i++)
- {
- a += sUpdateGeometryRunAvgOff[i];
- b += sUpdateGeometryRunAvgOn[i];
- }
- a /= sUpdateGeometryRunCount;
- b /= sUpdateGeometryRunCount;
- F64 perf_boost = ( sUpdateGeometryElapsedTimeOff - sUpdateGeometryElapsedTimeOn ) / sUpdateGeometryElapsedTimeOn;
- llinfos << "run averages (" << (F64)sUpdateGeometryRunCount
- << "/10) vectorize off " << a
- << "% : vectorize type " << sVectorizeProcessor
- << " " << b
- << "% : performance boost "
- << perf_boost * 100.0
- << "%"
- << llendl ;
- if(sUpdateGeometryRunCount == 10)
- {
- // In case user runs test again, force reset of data on
- // next run.
- sUpdateGeometryGlobalTime = 0.0;
-
- // We have data now on which version is faster. Switch to that
- // code and save the data for next run.
- gSavedSettings.setBOOL("VectorizePerfTest", FALSE);
-
- if (perf_boost > 0.0)
- {
- llinfos << "Vectorization improves avatar skinning performance, "
- << "keeping on for future runs."
- << llendl;
- gSavedSettings.setBOOL("VectorizeSkin", TRUE);
- }
- else
- {
- // SIMD decreases performance, fall back to original code
- llinfos << "Vectorization decreases avatar skinning performance, "
- << "switching back to original code."
- << llendl;
-
- gSavedSettings.setBOOL("VectorizeSkin", FALSE);
- }
- }
- }
- sUpdateGeometryElapsedTime = 0.0f;
- }
- }
+ uploadJointMatrices();
+ updateGeometry(mFace, mMesh);
}
void LLViewerJointMesh::dump()
diff --git a/indra/newview/llviewerjointmesh.h b/indra/newview/llviewerjointmesh.h
index cab1205d61..0191f0cae8 100644
--- a/indra/newview/llviewerjointmesh.h
+++ b/indra/newview/llviewerjointmesh.h
@@ -143,23 +143,10 @@ public:
/*virtual*/ BOOL isAnimatable() const { return FALSE; }
- static void updateVectorize(); // Update globals when settings variables change
-
private:
- // Avatar vertex skinning is a significant performance issue on computers
- // with avatar vertex programs turned off (for example, most Macs). We
- // therefore have custom versions that use SIMD instructions.
- //
- // These functions require compiler options for SSE2, SSE, or neither, and
- // hence are contained in separate individual .cpp files. JC
- static void updateGeometryOriginal(LLFace* face, LLPolyMesh* mesh);
- // generic vector code, used for Altivec
- static void updateGeometryVectorized(LLFace* face, LLPolyMesh* mesh);
- static void updateGeometrySSE(LLFace* face, LLPolyMesh* mesh);
- static void updateGeometrySSE2(LLFace* face, LLPolyMesh* mesh);
-
- // Use a fuction pointer to indicate which version we are running.
- static void (*sUpdateGeometryFunc)(LLFace* face, LLPolyMesh* mesh);
+
+ //copy mesh into given face's vertex buffer, applying current animation pose
+ static void updateGeometry(LLFace* face, LLPolyMesh* mesh);
private:
// Allocate skin data
diff --git a/indra/newview/llviewerjointmesh_sse.cpp b/indra/newview/llviewerjointmesh_sse.cpp
deleted file mode 100644
index 174b6eae29..0000000000
--- a/indra/newview/llviewerjointmesh_sse.cpp
+++ /dev/null
@@ -1,114 +0,0 @@
-/**
- * @file llviewerjointmesh_sse.cpp
- * @brief SSE vectorized joint skinning code, only used when video card does
- * not support avatar vertex programs.
- *
- * *NOTE: Disabled on Windows builds. See llv4math.h for details.
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-//-----------------------------------------------------------------------------
-// Header Files
-//-----------------------------------------------------------------------------
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llviewerjointmesh.h"
-
-// project includes
-#include "llface.h"
-#include "llpolymesh.h"
-
-// library includes
-#include "lldarray.h"
-#include "llv4math.h" // for LL_VECTORIZE
-#include "llv4matrix3.h"
-#include "llv4matrix4.h"
-#include "v3math.h"
-
-
-#if LL_VECTORIZE
-
-inline void matrix_translate(LLV4Matrix4& m, const LLMatrix4* w, const LLVector3& j)
-{
- m.mV[VX] = _mm_loadu_ps(w->mMatrix[VX]);
- m.mV[VY] = _mm_loadu_ps(w->mMatrix[VY]);
- m.mV[VZ] = _mm_loadu_ps(w->mMatrix[VZ]);
- m.mV[VW] = _mm_loadu_ps(w->mMatrix[VW]);
- m.mV[VW] = _mm_add_ps(m.mV[VW], _mm_mul_ps(_mm_set1_ps(j.mV[VX]), m.mV[VX])); // ( ax * vx ) + vw
- m.mV[VW] = _mm_add_ps(m.mV[VW], _mm_mul_ps(_mm_set1_ps(j.mV[VY]), m.mV[VY]));
- m.mV[VW] = _mm_add_ps(m.mV[VW], _mm_mul_ps(_mm_set1_ps(j.mV[VZ]), m.mV[VZ]));
-}
-
-// static
-void LLViewerJointMesh::updateGeometrySSE(LLFace *face, LLPolyMesh *mesh)
-{
- // This cannot be a file-level static because it will be initialized
- // before main() using SSE code, which will crash on non-SSE processors.
- static LLV4Matrix4 sJointMat[32];
- LLDynamicArray<LLJointRenderData*>& joint_data = mesh->getReferenceMesh()->mJointRenderData;
-
- //upload joint pivots/matrices
- for(S32 j = 0, jend = joint_data.count(); j < jend ; ++j )
- {
- matrix_translate(sJointMat[j], joint_data[j]->mWorldMatrix,
- joint_data[j]->mSkinJoint ?
- joint_data[j]->mSkinJoint->mRootToJointSkinOffset
- : joint_data[j+1]->mSkinJoint->mRootToParentJointSkinOffset);
- }
-
- F32 weight = F32_MAX;
- LLV4Matrix4 blend_mat;
-
- LLStrider<LLVector3> o_vertices;
- LLStrider<LLVector3> o_normals;
-
- LLVertexBuffer *buffer = face->mVertexBuffer;
- buffer->getVertexStrider(o_vertices, mesh->mFaceVertexOffset);
- buffer->getNormalStrider(o_normals, mesh->mFaceVertexOffset);
-
- const F32* weights = mesh->getWeights();
- const LLVector3* coords = mesh->getCoords();
- const LLVector3* normals = mesh->getNormals();
- for (U32 index = 0, index_end = mesh->getNumVertices(); index < index_end; ++index)
- {
- if( weight != weights[index])
- {
- S32 joint = llfloor(weight = weights[index]);
- blend_mat.lerp(sJointMat[joint], sJointMat[joint+1], weight - joint);
- }
- blend_mat.multiply(coords[index], o_vertices[index]);
- ((LLV4Matrix3)blend_mat).multiply(normals[index], o_normals[index]);
- }
-
- buffer->setBuffer(0);
-}
-
-#else
-
-void LLViewerJointMesh::updateGeometrySSE(LLFace *face, LLPolyMesh *mesh)
-{
- LLViewerJointMesh::updateGeometryVectorized(face, mesh);
-}
-
-#endif
diff --git a/indra/newview/llviewerjointmesh_sse2.cpp b/indra/newview/llviewerjointmesh_sse2.cpp
deleted file mode 100644
index a374ba2471..0000000000
--- a/indra/newview/llviewerjointmesh_sse2.cpp
+++ /dev/null
@@ -1,121 +0,0 @@
-/**
- * @file llviewerjointmesh_sse2.cpp
- * @brief SSE vectorized joint skinning code, only used when video card does
- * not support avatar vertex programs.
- *
- * *NOTE: Disabled on Windows builds. See llv4math.h for details.
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-// Visual Studio required settings for this file:
-// Precompiled Headers OFF
-// Code Generation: SSE2
-
-//-----------------------------------------------------------------------------
-// Header Files
-//-----------------------------------------------------------------------------
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llviewerjointmesh.h"
-
-// project includes
-#include "llface.h"
-#include "llpolymesh.h"
-
-// library includes
-#include "lldarray.h"
-#include "llstrider.h"
-#include "llv4math.h" // for LL_VECTORIZE
-#include "llv4matrix3.h"
-#include "llv4matrix4.h"
-#include "m4math.h"
-#include "v3math.h"
-
-
-#if LL_VECTORIZE
-
-
-inline void matrix_translate(LLV4Matrix4& m, const LLMatrix4* w, const LLVector3& j)
-{
- m.mV[VX] = _mm_loadu_ps(w->mMatrix[VX]);
- m.mV[VY] = _mm_loadu_ps(w->mMatrix[VY]);
- m.mV[VZ] = _mm_loadu_ps(w->mMatrix[VZ]);
- m.mV[VW] = _mm_loadu_ps(w->mMatrix[VW]);
- m.mV[VW] = _mm_add_ps(m.mV[VW], _mm_mul_ps(_mm_set1_ps(j.mV[VX]), m.mV[VX])); // ( ax * vx ) + vw
- m.mV[VW] = _mm_add_ps(m.mV[VW], _mm_mul_ps(_mm_set1_ps(j.mV[VY]), m.mV[VY]));
- m.mV[VW] = _mm_add_ps(m.mV[VW], _mm_mul_ps(_mm_set1_ps(j.mV[VZ]), m.mV[VZ]));
-}
-
-// static
-void LLViewerJointMesh::updateGeometrySSE2(LLFace *face, LLPolyMesh *mesh)
-{
- // This cannot be a file-level static because it will be initialized
- // before main() using SSE code, which will crash on non-SSE processors.
- static LLV4Matrix4 sJointMat[32];
- LLDynamicArray<LLJointRenderData*>& joint_data = mesh->getReferenceMesh()->mJointRenderData;
-
- //upload joint pivots/matrices
- for(S32 j = 0, jend = joint_data.count(); j < jend ; ++j )
- {
- matrix_translate(sJointMat[j], joint_data[j]->mWorldMatrix,
- joint_data[j]->mSkinJoint ?
- joint_data[j]->mSkinJoint->mRootToJointSkinOffset
- : joint_data[j+1]->mSkinJoint->mRootToParentJointSkinOffset);
- }
-
- F32 weight = F32_MAX;
- LLV4Matrix4 blend_mat;
-
- LLStrider<LLVector3> o_vertices;
- LLStrider<LLVector3> o_normals;
-
- LLVertexBuffer *buffer = face->mVertexBuffer;
- buffer->getVertexStrider(o_vertices, mesh->mFaceVertexOffset);
- buffer->getNormalStrider(o_normals, mesh->mFaceVertexOffset);
-
- const F32* weights = mesh->getWeights();
- const LLVector3* coords = mesh->getCoords();
- const LLVector3* normals = mesh->getNormals();
- for (U32 index = 0, index_end = mesh->getNumVertices(); index < index_end; ++index)
- {
- if( weight != weights[index])
- {
- S32 joint = llfloor(weight = weights[index]);
- blend_mat.lerp(sJointMat[joint], sJointMat[joint+1], weight - joint);
- }
- blend_mat.multiply(coords[index], o_vertices[index]);
- ((LLV4Matrix3)blend_mat).multiply(normals[index], o_normals[index]);
- }
-
- //setBuffer(0) called in LLVOAvatar::renderSkinned
-}
-
-#else
-
-void LLViewerJointMesh::updateGeometrySSE2(LLFace *face, LLPolyMesh *mesh)
-{
- LLViewerJointMesh::updateGeometryVectorized(face, mesh);
-}
-
-#endif
diff --git a/indra/newview/llviewerjointmesh_vec.cpp b/indra/newview/llviewerjointmesh_vec.cpp
deleted file mode 100644
index c9371030ad..0000000000
--- a/indra/newview/llviewerjointmesh_vec.cpp
+++ /dev/null
@@ -1,95 +0,0 @@
-/**
- * @file llviewerjointmesh_vec.cpp
- * @brief Compiler-generated vectorized joint skinning code, works well on
- * Altivec processors (PowerPC Mac)
- *
- * *NOTE: See llv4math.h for notes on SSE/Altivec vector code.
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-//-----------------------------------------------------------------------------
-// Header Files
-//-----------------------------------------------------------------------------
-#include "llviewerprecompiledheaders.h"
-
-#include "llviewerjointmesh.h"
-
-#include "llface.h"
-#include "llpolymesh.h"
-#include "llv4math.h"
-#include "llv4matrix3.h"
-#include "llv4matrix4.h"
-
-// Generic vectorized code, uses compiler defaults, works well for Altivec
-// on PowerPC.
-
-// static
-void LLViewerJointMesh::updateGeometryVectorized(LLFace *face, LLPolyMesh *mesh)
-{
- static LLV4Matrix4 sJointMat[32];
- LLDynamicArray<LLJointRenderData*>& joint_data = mesh->getReferenceMesh()->mJointRenderData;
- S32 j, joint_num, joint_end = joint_data.count();
- LLV4Vector3 pivot;
-
- //upload joint pivots/matrices
- for(j = joint_num = 0; joint_num < joint_end ; ++joint_num )
- {
- LLSkinJoint *sj;
- const LLMatrix4 * wm = joint_data[joint_num]->mWorldMatrix;
- if (NULL == (sj = joint_data[joint_num]->mSkinJoint))
- {
- sj = joint_data[++joint_num]->mSkinJoint;
- ((LLV4Matrix3)(sJointMat[j] = *wm)).multiply(sj->mRootToParentJointSkinOffset, pivot);
- sJointMat[j++].translate(pivot);
- wm = joint_data[joint_num]->mWorldMatrix;
- }
- ((LLV4Matrix3)(sJointMat[j] = *wm)).multiply(sj->mRootToJointSkinOffset, pivot);
- sJointMat[j++].translate(pivot);
- }
-
- F32 weight = F32_MAX;
- LLV4Matrix4 blend_mat;
-
- LLStrider<LLVector3> o_vertices;
- LLStrider<LLVector3> o_normals;
-
- LLVertexBuffer *buffer = face->mVertexBuffer;
- buffer->getVertexStrider(o_vertices, mesh->mFaceVertexOffset);
- buffer->getNormalStrider(o_normals, mesh->mFaceVertexOffset);
-
- const F32* weights = mesh->getWeights();
- const LLVector3* coords = mesh->getCoords();
- const LLVector3* normals = mesh->getNormals();
- for (U32 index = 0, index_end = mesh->getNumVertices(); index < index_end; ++index)
- {
- if( weight != weights[index])
- {
- S32 joint = llfloor(weight = weights[index]);
- blend_mat.lerp(sJointMat[joint], sJointMat[joint+1], weight - joint);
- }
- blend_mat.multiply(coords[index], o_vertices[index]);
- ((LLV4Matrix3)blend_mat).multiply(normals[index], o_normals[index]);
- }
-
- buffer->setBuffer(0);
-}
diff --git a/indra/newview/llviewerjoystick.cpp b/indra/newview/llviewerjoystick.cpp
index e1dd72dddc..f6e840adcd 100644
--- a/indra/newview/llviewerjoystick.cpp
+++ b/indra/newview/llviewerjoystick.cpp
@@ -51,9 +51,6 @@
#define RY_I 5
#define RZ_I 3
-// minimum time after setting away state before coming back
-const F32 MIN_AFK_TIME = 2.f;
-
F32 LLViewerJoystick::sLastDelta[] = {0,0,0,0,0,0,0};
F32 LLViewerJoystick::sDelta[] = {0,0,0,0,0,0,0};
@@ -551,7 +548,7 @@ void LLViewerJoystick::moveObjects(bool reset)
if (!is_zero)
{
// Clear AFK state if moved beyond the deadzone
- if (gAwayTimer.getElapsedTimeF32() > MIN_AFK_TIME)
+ if (gAwayTimer.getElapsedTimeF32() > LLAgent::MIN_AFK_TIME)
{
gAgent.clearAFK();
}
@@ -725,7 +722,7 @@ void LLViewerJoystick::moveAvatar(bool reset)
if (!is_zero)
{
// Clear AFK state if moved beyond the deadzone
- if (gAwayTimer.getElapsedTimeF32() > MIN_AFK_TIME)
+ if (gAwayTimer.getElapsedTimeF32() > LLAgent::MIN_AFK_TIME)
{
gAgent.clearAFK();
}
@@ -758,7 +755,7 @@ void LLViewerJoystick::moveAvatar(bool reset)
sDelta[RX_I] += (cur_delta[RX_I] - sDelta[RX_I]) * time * feather;
sDelta[RY_I] += (cur_delta[RY_I] - sDelta[RY_I]) * time * feather;
- handleRun(fsqrtf(sDelta[Z_I]*sDelta[Z_I] + sDelta[X_I]*sDelta[X_I]));
+ handleRun((F32) sqrt(sDelta[Z_I]*sDelta[Z_I] + sDelta[X_I]*sDelta[X_I]));
// Allow forward/backward movement some priority
if (dom_axis == Z_I)
@@ -941,7 +938,7 @@ void LLViewerJoystick::moveFlycam(bool reset)
}
// Clear AFK state if moved beyond the deadzone
- if (!is_zero && gAwayTimer.getElapsedTimeF32() > MIN_AFK_TIME)
+ if (!is_zero && gAwayTimer.getElapsedTimeF32() > LLAgent::MIN_AFK_TIME)
{
gAgent.clearAFK();
}
@@ -1001,7 +998,7 @@ bool LLViewerJoystick::toggleFlycam()
gAgentCamera.changeCameraToDefault();
}
- if (gAwayTimer.getElapsedTimeF32() > MIN_AFK_TIME)
+ if (gAwayTimer.getElapsedTimeF32() > LLAgent::MIN_AFK_TIME)
{
gAgent.clearAFK();
}
diff --git a/indra/newview/llviewerkeyboard.cpp b/indra/newview/llviewerkeyboard.cpp
index d7e15e7d6c..1aa9fd8a45 100644
--- a/indra/newview/llviewerkeyboard.cpp
+++ b/indra/newview/llviewerkeyboard.cpp
@@ -40,6 +40,7 @@
#include "llviewerwindow.h"
#include "llvoavatarself.h"
#include "llfloatercamera.h"
+#include "llinitparam.h"
//
// Constants
@@ -53,6 +54,11 @@ const S32 NUDGE_FRAMES = 2;
const F32 ORBIT_NUDGE_RATE = 0.05f; // fraction of normal speed
const F32 YAW_NUDGE_RATE = 0.05f; // fraction of normal speed
+struct LLKeyboardActionRegistry
+: public LLRegistrySingleton<std::string, boost::function<void (EKeystate keystate)>, LLKeyboardActionRegistry>
+{
+};
+
LLViewerKeyboard gViewerKeyboard;
void agent_jump( EKeystate s )
@@ -550,52 +556,50 @@ void start_gesture( EKeystate s )
}
}
-void bind_keyboard_functions()
-{
- gViewerKeyboard.bindNamedFunction("jump", agent_jump);
- gViewerKeyboard.bindNamedFunction("push_down", agent_push_down);
- gViewerKeyboard.bindNamedFunction("push_forward", agent_push_forward);
- gViewerKeyboard.bindNamedFunction("push_backward", agent_push_backward);
- gViewerKeyboard.bindNamedFunction("look_up", agent_look_up);
- gViewerKeyboard.bindNamedFunction("look_down", agent_look_down);
- gViewerKeyboard.bindNamedFunction("toggle_fly", agent_toggle_fly);
- gViewerKeyboard.bindNamedFunction("turn_left", agent_turn_left);
- gViewerKeyboard.bindNamedFunction("turn_right", agent_turn_right);
- gViewerKeyboard.bindNamedFunction("slide_left", agent_slide_left);
- gViewerKeyboard.bindNamedFunction("slide_right", agent_slide_right);
- gViewerKeyboard.bindNamedFunction("spin_around_ccw", camera_spin_around_ccw);
- gViewerKeyboard.bindNamedFunction("spin_around_cw", camera_spin_around_cw);
- gViewerKeyboard.bindNamedFunction("spin_around_ccw_sitting", camera_spin_around_ccw_sitting);
- gViewerKeyboard.bindNamedFunction("spin_around_cw_sitting", camera_spin_around_cw_sitting);
- gViewerKeyboard.bindNamedFunction("spin_over", camera_spin_over);
- gViewerKeyboard.bindNamedFunction("spin_under", camera_spin_under);
- gViewerKeyboard.bindNamedFunction("spin_over_sitting", camera_spin_over_sitting);
- gViewerKeyboard.bindNamedFunction("spin_under_sitting", camera_spin_under_sitting);
- gViewerKeyboard.bindNamedFunction("move_forward", camera_move_forward);
- gViewerKeyboard.bindNamedFunction("move_backward", camera_move_backward);
- gViewerKeyboard.bindNamedFunction("move_forward_sitting", camera_move_forward_sitting);
- gViewerKeyboard.bindNamedFunction("move_backward_sitting", camera_move_backward_sitting);
- gViewerKeyboard.bindNamedFunction("pan_up", camera_pan_up);
- gViewerKeyboard.bindNamedFunction("pan_down", camera_pan_down);
- gViewerKeyboard.bindNamedFunction("pan_left", camera_pan_left);
- gViewerKeyboard.bindNamedFunction("pan_right", camera_pan_right);
- gViewerKeyboard.bindNamedFunction("pan_in", camera_pan_in);
- gViewerKeyboard.bindNamedFunction("pan_out", camera_pan_out);
- gViewerKeyboard.bindNamedFunction("move_forward_fast", camera_move_forward_fast);
- gViewerKeyboard.bindNamedFunction("move_backward_fast", camera_move_backward_fast);
- gViewerKeyboard.bindNamedFunction("edit_avatar_spin_ccw", edit_avatar_spin_ccw);
- gViewerKeyboard.bindNamedFunction("edit_avatar_spin_cw", edit_avatar_spin_cw);
- gViewerKeyboard.bindNamedFunction("edit_avatar_spin_over", edit_avatar_spin_over);
- gViewerKeyboard.bindNamedFunction("edit_avatar_spin_under", edit_avatar_spin_under);
- gViewerKeyboard.bindNamedFunction("edit_avatar_move_forward", edit_avatar_move_forward);
- gViewerKeyboard.bindNamedFunction("edit_avatar_move_backward", edit_avatar_move_backward);
- gViewerKeyboard.bindNamedFunction("stop_moving", stop_moving);
- gViewerKeyboard.bindNamedFunction("start_chat", start_chat);
- gViewerKeyboard.bindNamedFunction("start_gesture", start_gesture);
-}
-
-LLViewerKeyboard::LLViewerKeyboard() :
- mNamedFunctionCount(0)
+#define REGISTER_KEYBOARD_ACTION(KEY, ACTION) LLREGISTER_STATIC(LLKeyboardActionRegistry, KEY, ACTION);
+REGISTER_KEYBOARD_ACTION("jump", agent_jump);
+REGISTER_KEYBOARD_ACTION("push_down", agent_push_down);
+REGISTER_KEYBOARD_ACTION("push_forward", agent_push_forward);
+REGISTER_KEYBOARD_ACTION("push_backward", agent_push_backward);
+REGISTER_KEYBOARD_ACTION("look_up", agent_look_up);
+REGISTER_KEYBOARD_ACTION("look_down", agent_look_down);
+REGISTER_KEYBOARD_ACTION("toggle_fly", agent_toggle_fly);
+REGISTER_KEYBOARD_ACTION("turn_left", agent_turn_left);
+REGISTER_KEYBOARD_ACTION("turn_right", agent_turn_right);
+REGISTER_KEYBOARD_ACTION("slide_left", agent_slide_left);
+REGISTER_KEYBOARD_ACTION("slide_right", agent_slide_right);
+REGISTER_KEYBOARD_ACTION("spin_around_ccw", camera_spin_around_ccw);
+REGISTER_KEYBOARD_ACTION("spin_around_cw", camera_spin_around_cw);
+REGISTER_KEYBOARD_ACTION("spin_around_ccw_sitting", camera_spin_around_ccw_sitting);
+REGISTER_KEYBOARD_ACTION("spin_around_cw_sitting", camera_spin_around_cw_sitting);
+REGISTER_KEYBOARD_ACTION("spin_over", camera_spin_over);
+REGISTER_KEYBOARD_ACTION("spin_under", camera_spin_under);
+REGISTER_KEYBOARD_ACTION("spin_over_sitting", camera_spin_over_sitting);
+REGISTER_KEYBOARD_ACTION("spin_under_sitting", camera_spin_under_sitting);
+REGISTER_KEYBOARD_ACTION("move_forward", camera_move_forward);
+REGISTER_KEYBOARD_ACTION("move_backward", camera_move_backward);
+REGISTER_KEYBOARD_ACTION("move_forward_sitting", camera_move_forward_sitting);
+REGISTER_KEYBOARD_ACTION("move_backward_sitting", camera_move_backward_sitting);
+REGISTER_KEYBOARD_ACTION("pan_up", camera_pan_up);
+REGISTER_KEYBOARD_ACTION("pan_down", camera_pan_down);
+REGISTER_KEYBOARD_ACTION("pan_left", camera_pan_left);
+REGISTER_KEYBOARD_ACTION("pan_right", camera_pan_right);
+REGISTER_KEYBOARD_ACTION("pan_in", camera_pan_in);
+REGISTER_KEYBOARD_ACTION("pan_out", camera_pan_out);
+REGISTER_KEYBOARD_ACTION("move_forward_fast", camera_move_forward_fast);
+REGISTER_KEYBOARD_ACTION("move_backward_fast", camera_move_backward_fast);
+REGISTER_KEYBOARD_ACTION("edit_avatar_spin_ccw", edit_avatar_spin_ccw);
+REGISTER_KEYBOARD_ACTION("edit_avatar_spin_cw", edit_avatar_spin_cw);
+REGISTER_KEYBOARD_ACTION("edit_avatar_spin_over", edit_avatar_spin_over);
+REGISTER_KEYBOARD_ACTION("edit_avatar_spin_under", edit_avatar_spin_under);
+REGISTER_KEYBOARD_ACTION("edit_avatar_move_forward", edit_avatar_move_forward);
+REGISTER_KEYBOARD_ACTION("edit_avatar_move_backward", edit_avatar_move_backward);
+REGISTER_KEYBOARD_ACTION("stop_moving", stop_moving);
+REGISTER_KEYBOARD_ACTION("start_chat", start_chat);
+REGISTER_KEYBOARD_ACTION("start_gesture", start_gesture);
+#undef REGISTER_KEYBOARD_ACTION
+
+LLViewerKeyboard::LLViewerKeyboard()
{
for (S32 i = 0; i < MODE_COUNT; i++)
{
@@ -613,16 +617,6 @@ LLViewerKeyboard::LLViewerKeyboard() :
}
}
-
-void LLViewerKeyboard::bindNamedFunction(const std::string& name, LLKeyFunc func)
-{
- S32 i = mNamedFunctionCount;
- mNamedFunctions[i].mName = name;
- mNamedFunctions[i].mFunction = func;
- mNamedFunctionCount++;
-}
-
-
BOOL LLViewerKeyboard::modeFromString(const std::string& string, S32 *mode)
{
if (string == "FIRST_PERSON")
@@ -695,8 +689,9 @@ BOOL LLViewerKeyboard::handleKey(KEY translated_key, MASK translated_mask, BOOL
BOOL LLViewerKeyboard::bindKey(const S32 mode, const KEY key, const MASK mask, const std::string& function_name)
{
- S32 i,index;
- void (*function)(EKeystate keystate) = NULL;
+ S32 index;
+ typedef boost::function<void(EKeystate)> function_t;
+ function_t function = NULL;
std::string name;
// Allow remapping of F2-F12
@@ -719,13 +714,11 @@ BOOL LLViewerKeyboard::bindKey(const S32 mode, const KEY key, const MASK mask, c
}
// Not remapped, look for a function
- for (i = 0; i < mNamedFunctionCount; i++)
+
+ function_t* result = LLKeyboardActionRegistry::getValue(function_name);
+ if (result)
{
- if (function_name == mNamedFunctions[i].mName)
- {
- function = mNamedFunctions[i].mFunction;
- name = mNamedFunctions[i].mName;
- }
+ function = *result;
}
if (!function)
@@ -755,7 +748,6 @@ BOOL LLViewerKeyboard::bindKey(const S32 mode, const KEY key, const MASK mask, c
mBindings[mode][index].mKey = key;
mBindings[mode][index].mMask = mask;
-// mBindings[mode][index].mName = name;
mBindings[mode][index].mFunction = function;
if (index == mBindingCount[mode])
@@ -764,6 +756,61 @@ BOOL LLViewerKeyboard::bindKey(const S32 mode, const KEY key, const MASK mask, c
return TRUE;
}
+LLViewerKeyboard::KeyBinding::KeyBinding()
+: key("key"),
+ mask("mask"),
+ command("command")
+{}
+
+LLViewerKeyboard::KeyMode::KeyMode(EKeyboardMode _mode)
+: bindings("binding"),
+ mode(_mode)
+{}
+
+LLViewerKeyboard::Keys::Keys()
+: first_person("first_person", KeyMode(MODE_FIRST_PERSON)),
+ third_person("third_person", KeyMode(MODE_THIRD_PERSON)),
+ edit("edit", KeyMode(MODE_EDIT)),
+ sitting("sitting", KeyMode(MODE_SITTING)),
+ edit_avatar("edit_avatar", KeyMode(MODE_EDIT_AVATAR))
+{}
+
+S32 LLViewerKeyboard::loadBindingsXML(const std::string& filename)
+{
+ S32 binding_count = 0;
+ Keys keys;
+ LLSimpleXUIParser parser;
+
+ if (parser.readXUI(filename, keys)
+ && keys.validateBlock())
+ {
+ binding_count += loadBindingMode(keys.first_person);
+ binding_count += loadBindingMode(keys.third_person);
+ binding_count += loadBindingMode(keys.edit);
+ binding_count += loadBindingMode(keys.sitting);
+ binding_count += loadBindingMode(keys.edit_avatar);
+ }
+ return binding_count;
+}
+
+S32 LLViewerKeyboard::loadBindingMode(const LLViewerKeyboard::KeyMode& keymode)
+{
+ S32 binding_count = 0;
+ for (LLInitParam::ParamIterator<KeyBinding>::const_iterator it = keymode.bindings.begin(),
+ end_it = keymode.bindings.end();
+ it != end_it;
+ ++it)
+ {
+ KEY key;
+ MASK mask;
+ LLKeyboard::keyFromString(it->key, &key);
+ LLKeyboard::maskFromString(it->mask, &mask);
+ bindKey(keymode.mode, key, mask, it->command);
+ binding_count++;
+ }
+
+ return binding_count;
+}
S32 LLViewerKeyboard::loadBindings(const std::string& filename)
{
@@ -912,18 +959,18 @@ void LLViewerKeyboard::scanKey(KEY key, BOOL key_down, BOOL key_up, BOOL key_lev
if (key_down && !repeat)
{
// ...key went down this frame, call function
- (*binding[i].mFunction)( KEYSTATE_DOWN );
+ binding[i].mFunction( KEYSTATE_DOWN );
}
else if (key_up)
{
// ...key went down this frame, call function
- (*binding[i].mFunction)( KEYSTATE_UP );
+ binding[i].mFunction( KEYSTATE_UP );
}
else if (key_level)
{
// ...key held down from previous frame
// Not windows, just call the function.
- (*binding[i].mFunction)( KEYSTATE_LEVEL );
+ binding[i].mFunction( KEYSTATE_LEVEL );
}//if
}//if
}//for
diff --git a/indra/newview/llviewerkeyboard.h b/indra/newview/llviewerkeyboard.h
index 2fa5d5dfa6..ca73212ed1 100644
--- a/indra/newview/llviewerkeyboard.h
+++ b/indra/newview/llviewerkeyboard.h
@@ -28,6 +28,7 @@
#define LL_LLVIEWERKEYBOARD_H
#include "llkeyboard.h" // For EKeystate
+#include "llinitparam.h"
const S32 MAX_NAMED_FUNCTIONS = 100;
const S32 MAX_KEY_BINDINGS = 128; // was 60
@@ -55,26 +56,51 @@ typedef enum e_keyboard_mode
void bind_keyboard_functions();
-
class LLViewerKeyboard
{
public:
+ struct KeyBinding : public LLInitParam::Block<KeyBinding>
+ {
+ Mandatory<std::string> key,
+ mask,
+ command;
+
+ KeyBinding();
+ };
+
+ struct KeyMode : public LLInitParam::Block<KeyMode>
+ {
+ Multiple<KeyBinding> bindings;
+ EKeyboardMode mode;
+ KeyMode(EKeyboardMode mode);
+ };
+
+ struct Keys : public LLInitParam::Block<Keys>
+ {
+ Optional<KeyMode> first_person,
+ third_person,
+ edit,
+ sitting,
+ edit_avatar;
+
+ Keys();
+ };
+
LLViewerKeyboard();
BOOL handleKey(KEY key, MASK mask, BOOL repeated);
- void bindNamedFunction(const std::string& name, LLKeyFunc func);
-
S32 loadBindings(const std::string& filename); // returns number bound, 0 on error
+ S32 loadBindingsXML(const std::string& filename); // returns number bound, 0 on error
EKeyboardMode getMode();
BOOL modeFromString(const std::string& string, S32 *mode); // False on failure
void scanKey(KEY key, BOOL key_down, BOOL key_up, BOOL key_level);
-protected:
+
+private:
+ S32 loadBindingMode(const LLViewerKeyboard::KeyMode& keymode);
BOOL bindKey(const S32 mode, const KEY key, const MASK mask, const std::string& function_name);
- S32 mNamedFunctionCount;
- LLNamedFunction mNamedFunctions[MAX_NAMED_FUNCTIONS];
// Hold all the ugly stuff torn out to make LLKeyboard non-viewer-specific here
S32 mBindingCount[MODE_COUNT];
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index fae4eb3c05..1eb4bedfaf 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -26,42 +26,52 @@
#include "llviewerprecompiledheaders.h"
+#include "llviewermedia.h"
+
#include "llagent.h"
#include "llagentcamera.h"
-#include "llviewermedia.h"
-#include "llviewermediafocus.h"
-#include "llmimetypes.h"
+#include "llappviewer.h"
+#include "llaudioengine.h" // for gAudiop
+#include "llcallbacklist.h"
+#include "lldir.h"
+#include "lldiriterator.h"
+#include "llevent.h" // LLSimpleListener
+#include "llfilepicker.h"
+#include "llfloaterwebcontent.h" // for handling window close requests and geometry change requests in media browser windows.
+#include "llfocusmgr.h"
+#include "llkeyboard.h"
+#include "lllogininstance.h"
+#include "llmarketplacefunctions.h"
#include "llmediaentry.h"
+#include "llmimetypes.h"
+#include "llmutelist.h"
+#include "llnotifications.h"
+#include "llnotificationsutil.h"
+#include "llpanelprofile.h"
+#include "llparcel.h"
+#include "llpluginclassmedia.h"
+#include "llplugincookiestore.h"
+#include "llurldispatcher.h"
+#include "lluuid.h"
#include "llversioninfo.h"
+#include "llviewermediafocus.h"
#include "llviewercontrol.h"
-#include "llviewertexture.h"
+#include "llviewernetwork.h"
#include "llviewerparcelmedia.h"
#include "llviewerparcelmgr.h"
+#include "llviewerregion.h"
+#include "llviewertexture.h"
#include "llviewertexturelist.h"
-#include "llvovolume.h"
-#include "llpluginclassmedia.h"
-#include "llplugincookiestore.h"
#include "llviewerwindow.h"
-#include "llfocusmgr.h"
-#include "llcallbacklist.h"
-#include "llparcel.h"
-#include "llaudioengine.h" // for gAudiop
-#include "llurldispatcher.h"
#include "llvoavatar.h"
#include "llvoavatarself.h"
-#include "llviewerregion.h"
+#include "llvovolume.h"
+#include "llwebprofile.h"
#include "llwebsharing.h" // For LLWebSharing::setOpenIDCookie(), *TODO: find a better way to do this!
-#include "llfilepicker.h"
-
-#include "llevent.h" // LLSimpleListener
-#include "llnotificationsutil.h"
-#include "lluuid.h"
-#include "llkeyboard.h"
-#include "llmutelist.h"
-//#include "llfirstuse.h"
#include "llwindow.h"
+#include "llvieweraudio.h"
-#include "llfloatermediabrowser.h" // for handling window close requests and geometry change requests in media browser windows.
+#include "llfloaterwebcontent.h" // for handling window close requests and geometry change requests in media browser windows.
#include <boost/bind.hpp> // for SkinFolder listener
#include <boost/signals2.hpp>
@@ -290,14 +300,58 @@ public:
};
+class LLViewerMediaWebProfileResponder : public LLHTTPClient::Responder
+{
+LOG_CLASS(LLViewerMediaWebProfileResponder);
+public:
+ LLViewerMediaWebProfileResponder(std::string host)
+ {
+ mHost = host;
+ }
+
+ ~LLViewerMediaWebProfileResponder()
+ {
+ }
+
+ /* virtual */ void completedHeader(U32 status, const std::string& reason, const LLSD& content)
+ {
+ LL_WARNS("MediaAuth") << "status = " << status << ", reason = " << reason << LL_ENDL;
+ LL_WARNS("MediaAuth") << content << LL_ENDL;
+
+ std::string cookie = content["set-cookie"].asString();
+
+ LLViewerMedia::getCookieStore()->setCookiesFromHost(cookie, mHost);
+
+ // Set cookie for snapshot publishing.
+ std::string auth_cookie = cookie.substr(0, cookie.find(";")); // strip path
+ LLWebProfile::setAuthCookie(auth_cookie);
+ }
+
+ void completedRaw(
+ U32 status,
+ const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer)
+ {
+ // This is just here to disable the default behavior (attempting to parse the response as llsd).
+ // We don't care about the content of the response, only the set-cookie header.
+ }
+
+ std::string mHost;
+};
+
+
LLPluginCookieStore *LLViewerMedia::sCookieStore = NULL;
LLURL LLViewerMedia::sOpenIDURL;
std::string LLViewerMedia::sOpenIDCookie;
+LLPluginClassMedia* LLViewerMedia::sSpareBrowserMediaSource = NULL;
static LLViewerMedia::impl_list sViewerMediaImplList;
static LLViewerMedia::impl_id_map sViewerMediaTextureIDMap;
static LLTimer sMediaCreateTimer;
static const F32 LLVIEWERMEDIA_CREATE_DELAY = 1.0f;
static F32 sGlobalVolume = 1.0f;
+static bool sForceUpdate = false;
+static LLUUID sOnlyAudibleTextureID = LLUUID::null;
static F64 sLowestLoadableImplInterest = 0.0f;
static bool sAnyMediaShowing = false;
static boost::signals2::connection sTeleportFinishConnection;
@@ -333,7 +387,6 @@ class LLViewerMediaMuteListObserver : public LLMuteListObserver
static LLViewerMediaMuteListObserver sViewerMediaMuteListObserver;
static bool sViewerMediaMuteListObserverInitialized = false;
-static bool sInWorldMediaDisabled = false;
//////////////////////////////////////////////////////////////////////////////////////////
@@ -560,7 +613,7 @@ bool LLViewerMedia::textureHasMedia(const LLUUID& texture_id)
// static
void LLViewerMedia::setVolume(F32 volume)
{
- if(volume != sGlobalVolume)
+ if(volume != sGlobalVolume || sForceUpdate)
{
sGlobalVolume = volume;
impl_list::iterator iter = sViewerMediaImplList.begin();
@@ -571,6 +624,8 @@ void LLViewerMedia::setVolume(F32 volume)
LLViewerMediaImpl* pimpl = *iter;
pimpl->updateVolume();
}
+
+ sForceUpdate = false;
}
}
@@ -598,20 +653,6 @@ void LLViewerMedia::muteListChanged()
//////////////////////////////////////////////////////////////////////////////////////////
// static
-void LLViewerMedia::setInWorldMediaDisabled(bool disabled)
-{
- sInWorldMediaDisabled = disabled;
-}
-
-//////////////////////////////////////////////////////////////////////////////////////////
-// static
-bool LLViewerMedia::getInWorldMediaDisabled()
-{
- return sInWorldMediaDisabled;
-}
-
-//////////////////////////////////////////////////////////////////////////////////////////
-// static
bool LLViewerMedia::isInterestingEnough(const LLVOVolume *object, const F64 &object_interest)
{
bool result = false;
@@ -732,6 +773,12 @@ static bool proximity_comparitor(const LLViewerMediaImpl* i1, const LLViewerMedi
}
static LLFastTimer::DeclareTimer FTM_MEDIA_UPDATE("Update Media");
+static LLFastTimer::DeclareTimer FTM_MEDIA_SPARE_IDLE("Spare Idle");
+static LLFastTimer::DeclareTimer FTM_MEDIA_UPDATE_INTEREST("Update/Interest");
+static LLFastTimer::DeclareTimer FTM_MEDIA_SORT("Sort");
+static LLFastTimer::DeclareTimer FTM_MEDIA_SORT2("Sort 2");
+static LLFastTimer::DeclareTimer FTM_MEDIA_MISC("Misc");
+
//////////////////////////////////////////////////////////////////////////////////////////
// static
@@ -742,6 +789,9 @@ void LLViewerMedia::updateMedia(void *dummy_arg)
// Enable/disable the plugin read thread
LLPluginProcessParent::setUseReadThread(gSavedSettings.getBOOL("PluginUseReadThread"));
+ // HACK: we always try to keep a spare running webkit plugin around to improve launch times.
+ createSpareBrowserMediaSource();
+
sAnyMediaShowing = false;
sUpdatedCookies = getCookieStore()->getChangedCookies();
if(!sUpdatedCookies.empty())
@@ -753,15 +803,28 @@ void LLViewerMedia::updateMedia(void *dummy_arg)
impl_list::iterator iter = sViewerMediaImplList.begin();
impl_list::iterator end = sViewerMediaImplList.end();
- for(; iter != end;)
{
- LLViewerMediaImpl* pimpl = *iter++;
- pimpl->update();
- pimpl->calculateInterest();
+ LLFastTimer t(FTM_MEDIA_UPDATE_INTEREST);
+ for(; iter != end;)
+ {
+ LLViewerMediaImpl* pimpl = *iter++;
+ pimpl->update();
+ pimpl->calculateInterest();
+ }
+ }
+
+ // Let the spare media source actually launch
+ if(sSpareBrowserMediaSource)
+ {
+ LLFastTimer t(FTM_MEDIA_SPARE_IDLE);
+ sSpareBrowserMediaSource->idle();
}
- // Sort the static instance list using our interest criteria
- sViewerMediaImplList.sort(priorityComparitor);
+ {
+ LLFastTimer t(FTM_MEDIA_SORT);
+ // Sort the static instance list using our interest criteria
+ sViewerMediaImplList.sort(priorityComparitor);
+ }
// Go through the list again and adjust according to priority.
iter = sViewerMediaImplList.begin();
@@ -789,147 +852,150 @@ void LLViewerMedia::updateMedia(void *dummy_arg)
// max_instances must be set high enough to allow the various instances used in the UI (for the help browser, search, etc.) to be loaded.
// If max_normal + max_low is less than max_instances, things will tend to get unloaded instead of being set to slideshow.
- for(; iter != end; iter++)
{
- LLViewerMediaImpl* pimpl = *iter;
+ LLFastTimer t(FTM_MEDIA_MISC);
+ for(; iter != end; iter++)
+ {
+ LLViewerMediaImpl* pimpl = *iter;
- LLPluginClassMedia::EPriority new_priority = LLPluginClassMedia::PRIORITY_NORMAL;
+ LLPluginClassMedia::EPriority new_priority = LLPluginClassMedia::PRIORITY_NORMAL;
- if(pimpl->isForcedUnloaded() || (impl_count_total >= (int)max_instances))
- {
- // Never load muted or failed impls.
- // Hard limit on the number of instances that will be loaded at one time
- new_priority = LLPluginClassMedia::PRIORITY_UNLOADED;
- }
- else if(!pimpl->getVisible())
- {
- new_priority = LLPluginClassMedia::PRIORITY_HIDDEN;
- }
- else if(pimpl->hasFocus())
- {
- new_priority = LLPluginClassMedia::PRIORITY_HIGH;
- impl_count_interest_normal++; // count this against the count of "normal" instances for priority purposes
- }
- else if(pimpl->getUsedInUI())
- {
- new_priority = LLPluginClassMedia::PRIORITY_NORMAL;
- impl_count_interest_normal++;
- }
- else if(pimpl->isParcelMedia())
- {
- new_priority = LLPluginClassMedia::PRIORITY_NORMAL;
- impl_count_interest_normal++;
- }
- else
- {
- // Look at interest and CPU usage for instances that aren't in any of the above states.
-
- // Heuristic -- if the media texture's approximate screen area is less than 1/4 of the native area of the texture,
- // turn it down to low instead of normal. This may downsample for plugins that support it.
- bool media_is_small = false;
- F64 approximate_interest = pimpl->getApproximateTextureInterest();
- if(approximate_interest == 0.0f)
+ if(pimpl->isForcedUnloaded() || (impl_count_total >= (int)max_instances))
{
- // this media has no current size, which probably means it's not loaded.
- media_is_small = true;
+ // Never load muted or failed impls.
+ // Hard limit on the number of instances that will be loaded at one time
+ new_priority = LLPluginClassMedia::PRIORITY_UNLOADED;
}
- else if(pimpl->getInterest() < (approximate_interest / 4))
+ else if(!pimpl->getVisible())
{
- media_is_small = true;
+ new_priority = LLPluginClassMedia::PRIORITY_HIDDEN;
}
-
- if(pimpl->getInterest() == 0.0f)
+ else if(pimpl->hasFocus())
{
- // This media is completely invisible, due to being outside the view frustrum or out of range.
- new_priority = LLPluginClassMedia::PRIORITY_HIDDEN;
+ new_priority = LLPluginClassMedia::PRIORITY_HIGH;
+ impl_count_interest_normal++; // count this against the count of "normal" instances for priority purposes
}
- else if(check_cpu_usage && (total_cpu > max_cpu))
+ else if(pimpl->getUsedInUI())
{
- // Higher priority plugins have already used up the CPU budget. Set remaining ones to slideshow priority.
- new_priority = LLPluginClassMedia::PRIORITY_SLIDESHOW;
+ new_priority = LLPluginClassMedia::PRIORITY_NORMAL;
+ impl_count_interest_normal++;
}
- else if((impl_count_interest_normal < (int)max_normal) && !media_is_small)
+ else if(pimpl->isParcelMedia())
{
- // Up to max_normal inworld get normal priority
new_priority = LLPluginClassMedia::PRIORITY_NORMAL;
impl_count_interest_normal++;
}
- else if (impl_count_interest_low + impl_count_interest_normal < (int)max_low + (int)max_normal)
+ else
{
- // The next max_low inworld get turned down
- new_priority = LLPluginClassMedia::PRIORITY_LOW;
- impl_count_interest_low++;
-
- // Set the low priority size for downsampling to approximately the size the texture is displayed at.
+ // Look at interest and CPU usage for instances that aren't in any of the above states.
+
+ // Heuristic -- if the media texture's approximate screen area is less than 1/4 of the native area of the texture,
+ // turn it down to low instead of normal. This may downsample for plugins that support it.
+ bool media_is_small = false;
+ F64 approximate_interest = pimpl->getApproximateTextureInterest();
+ if(approximate_interest == 0.0f)
+ {
+ // this media has no current size, which probably means it's not loaded.
+ media_is_small = true;
+ }
+ else if(pimpl->getInterest() < (approximate_interest / 4))
+ {
+ media_is_small = true;
+ }
+
+ if(pimpl->getInterest() == 0.0f)
+ {
+ // This media is completely invisible, due to being outside the view frustrum or out of range.
+ new_priority = LLPluginClassMedia::PRIORITY_HIDDEN;
+ }
+ else if(check_cpu_usage && (total_cpu > max_cpu))
+ {
+ // Higher priority plugins have already used up the CPU budget. Set remaining ones to slideshow priority.
+ new_priority = LLPluginClassMedia::PRIORITY_SLIDESHOW;
+ }
+ else if((impl_count_interest_normal < (int)max_normal) && !media_is_small)
+ {
+ // Up to max_normal inworld get normal priority
+ new_priority = LLPluginClassMedia::PRIORITY_NORMAL;
+ impl_count_interest_normal++;
+ }
+ else if (impl_count_interest_low + impl_count_interest_normal < (int)max_low + (int)max_normal)
{
- F32 approximate_interest_dimension = fsqrtf(pimpl->getInterest());
+ // The next max_low inworld get turned down
+ new_priority = LLPluginClassMedia::PRIORITY_LOW;
+ impl_count_interest_low++;
+
+ // Set the low priority size for downsampling to approximately the size the texture is displayed at.
+ {
+ F32 approximate_interest_dimension = (F32) sqrt(pimpl->getInterest());
- pimpl->setLowPrioritySizeLimit(llround(approximate_interest_dimension));
+ pimpl->setLowPrioritySizeLimit(llround(approximate_interest_dimension));
+ }
+ }
+ else
+ {
+ // Any additional impls (up to max_instances) get very infrequent time
+ new_priority = LLPluginClassMedia::PRIORITY_SLIDESHOW;
}
}
- else
- {
- // Any additional impls (up to max_instances) get very infrequent time
- new_priority = LLPluginClassMedia::PRIORITY_SLIDESHOW;
- }
- }
- if(!pimpl->getUsedInUI() && (new_priority != LLPluginClassMedia::PRIORITY_UNLOADED))
- {
- // This is a loadable inworld impl -- the last one in the list in this class defines the lowest loadable interest.
- lowest_interest_loadable = pimpl;
+ if(!pimpl->getUsedInUI() && (new_priority != LLPluginClassMedia::PRIORITY_UNLOADED))
+ {
+ // This is a loadable inworld impl -- the last one in the list in this class defines the lowest loadable interest.
+ lowest_interest_loadable = pimpl;
- impl_count_total++;
- }
+ impl_count_total++;
+ }
- // Overrides if the window is minimized or we lost focus (taking care
- // not to accidentally "raise" the priority either)
- if (!gViewerWindow->getActive() /* viewer window minimized? */
- && new_priority > LLPluginClassMedia::PRIORITY_HIDDEN)
- {
- new_priority = LLPluginClassMedia::PRIORITY_HIDDEN;
- }
- else if (!gFocusMgr.getAppHasFocus() /* viewer window lost focus? */
- && new_priority > LLPluginClassMedia::PRIORITY_LOW)
- {
- new_priority = LLPluginClassMedia::PRIORITY_LOW;
- }
+ // Overrides if the window is minimized or we lost focus (taking care
+ // not to accidentally "raise" the priority either)
+ if (!gViewerWindow->getActive() /* viewer window minimized? */
+ && new_priority > LLPluginClassMedia::PRIORITY_HIDDEN)
+ {
+ new_priority = LLPluginClassMedia::PRIORITY_HIDDEN;
+ }
+ else if (!gFocusMgr.getAppHasFocus() /* viewer window lost focus? */
+ && new_priority > LLPluginClassMedia::PRIORITY_LOW)
+ {
+ new_priority = LLPluginClassMedia::PRIORITY_LOW;
+ }
- if(!inworld_media_enabled)
- {
- // If inworld media is locked out, force all inworld media to stay unloaded.
- if(!pimpl->getUsedInUI())
+ if(!inworld_media_enabled)
{
- new_priority = LLPluginClassMedia::PRIORITY_UNLOADED;
+ // If inworld media is locked out, force all inworld media to stay unloaded.
+ if(!pimpl->getUsedInUI())
+ {
+ new_priority = LLPluginClassMedia::PRIORITY_UNLOADED;
+ }
}
- }
- // update the audio stream here as well
- if( !inworld_audio_enabled)
- {
- if(LLViewerMedia::isParcelAudioPlaying() && gAudiop && LLViewerMedia::hasParcelAudio())
+ // update the audio stream here as well
+ if( !inworld_audio_enabled)
{
- gAudiop->stopInternetStream();
+ if(LLViewerMedia::isParcelAudioPlaying() && gAudiop && LLViewerMedia::hasParcelAudio())
+ {
+ LLViewerAudio::getInstance()->stopInternetStreamWithAutoFade();
+ }
}
- }
- pimpl->setPriority(new_priority);
+ pimpl->setPriority(new_priority);
- if(pimpl->getUsedInUI())
- {
- // Any impls used in the UI should not be in the proximity list.
- pimpl->mProximity = -1;
- }
- else
- {
- proximity_order.push_back(pimpl);
- }
+ if(pimpl->getUsedInUI())
+ {
+ // Any impls used in the UI should not be in the proximity list.
+ pimpl->mProximity = -1;
+ }
+ else
+ {
+ proximity_order.push_back(pimpl);
+ }
- total_cpu += pimpl->getCPUUsage();
+ total_cpu += pimpl->getCPUUsage();
- if (!pimpl->getUsedInUI() && pimpl->hasMedia())
- {
- sAnyMediaShowing = true;
- }
+ if (!pimpl->getUsedInUI() && pimpl->hasMedia())
+ {
+ sAnyMediaShowing = true;
+ }
+ }
}
// Re-calculate this every time.
@@ -955,6 +1021,7 @@ void LLViewerMedia::updateMedia(void *dummy_arg)
}
else
{
+ LLFastTimer t(FTM_MEDIA_SORT2);
// Use a distance-based sort for proximity values.
std::stable_sort(proximity_order.begin(), proximity_order.end(), proximity_comparitor);
}
@@ -1010,13 +1077,24 @@ void LLViewerMedia::setAllMediaEnabled(bool val)
gAudiop &&
LLViewerMedia::hasParcelAudio())
{
- gAudiop->startInternetStream(LLViewerMedia::getParcelAudioURL());
+ if (LLAudioEngine::AUDIO_PAUSED == gAudiop->isInternetStreamPlaying())
+ {
+ // 'false' means unpause
+ gAudiop->pauseInternetStream(false);
+ }
+ else
+ {
+ LLViewerAudio::getInstance()->startInternetStreamWithAutoFade(LLViewerMedia::getParcelAudioURL());
+ }
}
}
else {
// This actually unloads the impl, as opposed to "stop"ping the media
LLViewerParcelMedia::stop();
- if (gAudiop) gAudiop->stopInternetStream();
+ if (gAudiop)
+ {
+ LLViewerAudio::getInstance()->stopInternetStreamWithAutoFade();
+ }
}
}
@@ -1034,6 +1112,26 @@ bool LLViewerMedia::isParcelAudioPlaying()
return (LLViewerMedia::hasParcelAudio() && gAudiop && LLAudioEngine::AUDIO_PLAYING == gAudiop->isInternetStreamPlaying());
}
+void LLViewerMedia::onAuthSubmit(const LLSD& notification, const LLSD& response)
+{
+ LLViewerMediaImpl *impl = LLViewerMedia::getMediaImplFromTextureID(notification["payload"]["media_id"]);
+ if(impl)
+ {
+ LLPluginClassMedia* media = impl->getMediaPlugin();
+ if(media)
+ {
+ if (response["ok"])
+ {
+ media->sendAuthResponse(true, response["username"], response["password"]);
+ }
+ else
+ {
+ media->sendAuthResponse(false, "", "");
+ }
+ }
+ }
+}
+
/////////////////////////////////////////////////////////////////////////////////////////
// static
void LLViewerMedia::clearAllCookies()
@@ -1083,7 +1181,8 @@ void LLViewerMedia::clearAllCookies()
}
// the hard part: iterate over all user directories and delete the cookie file from each one
- while(gDirUtilp->getNextFileInDir(base_dir, "*_*", filename))
+ LLDirIterator dir_iter(base_dir, "*_*");
+ while (dir_iter.next(filename))
{
target = base_dir;
target += filename;
@@ -1286,6 +1385,17 @@ void LLViewerMedia::removeCookie(const std::string &name, const std::string &dom
}
+LLSD LLViewerMedia::getHeaders()
+{
+ LLSD headers = LLSD::emptyMap();
+ headers["Accept"] = "*/*";
+ headers["Content-Type"] = "application/xml";
+ headers["Cookie"] = sOpenIDCookie;
+ headers["User-Agent"] = getCurrentUserAgent();
+
+ return headers;
+}
+
/////////////////////////////////////////////////////////////////////////////////////////
// static
void LLViewerMedia::setOpenIDCookie()
@@ -1319,6 +1429,21 @@ void LLViewerMedia::setOpenIDCookie()
// *HACK: Doing this here is nasty, find a better way.
LLWebSharing::instance().setOpenIDCookie(sOpenIDCookie);
+
+ // Do a web profile get so we can store the cookie
+ LLSD headers = LLSD::emptyMap();
+ headers["Accept"] = "*/*";
+ headers["Cookie"] = sOpenIDCookie;
+ headers["User-Agent"] = getCurrentUserAgent();
+
+ std::string profile_url = getProfileURL("");
+ LLURL raw_profile_url( profile_url.c_str() );
+
+ LL_DEBUGS("MediaAuth") << "Requesting " << profile_url << llendl;
+ LL_DEBUGS("MediaAuth") << "sOpenIDCookie = [" << sOpenIDCookie << "]" << llendl;
+ LLHTTPClient::get(profile_url,
+ new LLViewerMediaWebProfileResponder(raw_profile_url.getAuthority()),
+ headers);
}
}
@@ -1400,9 +1525,34 @@ void LLViewerMedia::proxyWindowClosed(const std::string &uuid)
}
}
+/////////////////////////////////////////////////////////////////////////////////////////
+// static
+void LLViewerMedia::createSpareBrowserMediaSource()
+{
+ // If we don't have a spare browser media source, create one.
+ // However, if PluginAttachDebuggerToPlugins is set then don't spawn a spare
+ // SLPlugin process in order to not be confused by an unrelated gdb terminal
+ // popping up at the moment we start a media plugin.
+ if (!sSpareBrowserMediaSource && !gSavedSettings.getBOOL("PluginAttachDebuggerToPlugins"))
+ {
+ // The null owner will keep the browser plugin from fully initializing
+ // (specifically, it keeps LLPluginClassMedia from negotiating a size change,
+ // which keeps MediaPluginWebkit::initBrowserWindow from doing anything until we have some necessary data, like the background color)
+ sSpareBrowserMediaSource = LLViewerMediaImpl::newSourceFromMediaType("text/html", NULL, 0, 0);
+ }
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+// static
+LLPluginClassMedia* LLViewerMedia::getSpareBrowserMediaSource()
+{
+ LLPluginClassMedia* result = sSpareBrowserMediaSource;
+ sSpareBrowserMediaSource = NULL;
+ return result;
+};
+
bool LLViewerMedia::hasInWorldMedia()
{
- if (sInWorldMediaDisabled) return false;
impl_list::iterator iter = sViewerMediaImplList.begin();
impl_list::iterator end = sViewerMediaImplList.end();
// This should be quick, because there should be very few non-in-world-media impls
@@ -1464,6 +1614,15 @@ void LLViewerMedia::onTeleportFinished()
gSavedSettings.setBOOL("MediaTentativeAutoPlay", true);
}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+// static
+void LLViewerMedia::setOnlyAudibleMediaTextureID(const LLUUID& texture_id)
+{
+ sOnlyAudibleTextureID = texture_id;
+ sForceUpdate = true;
+}
+
//////////////////////////////////////////////////////////////////////////////////////////
// LLViewerMediaImpl
//////////////////////////////////////////////////////////////////////////////////////////
@@ -1510,7 +1669,8 @@ LLViewerMediaImpl::LLViewerMediaImpl( const LLUUID& texture_id,
mNavigateSuspended(false),
mNavigateSuspendedDeferred(false),
mIsUpdated(false),
- mTrustedBrowser(false)
+ mTrustedBrowser(false),
+ mZoomFactor(1.0)
{
// Set up the mute list observer if it hasn't been set up already.
@@ -1601,6 +1761,7 @@ void LLViewerMediaImpl::createMediaSource()
LL_WARNS("Media") << "Failed to initialize media for mime type " << mMimeType << LL_ENDL;
}
}
+
}
//////////////////////////////////////////////////////////////////////////////////////////
@@ -1636,10 +1797,26 @@ void LLViewerMediaImpl::setMediaType(const std::string& media_type)
LLPluginClassMedia* LLViewerMediaImpl::newSourceFromMediaType(std::string media_type, LLPluginClassMediaOwner *owner /* may be NULL */, S32 default_width, S32 default_height, const std::string target)
{
std::string plugin_basename = LLMIMETypes::implType(media_type);
+ LLPluginClassMedia* media_source = NULL;
+
+ // HACK: we always try to keep a spare running webkit plugin around to improve launch times.
+ // If a spare was already created before PluginAttachDebuggerToPlugins was set, don't use it.
+ if(plugin_basename == "media_plugin_webkit" && !gSavedSettings.getBOOL("PluginAttachDebuggerToPlugins"))
+ {
+ media_source = LLViewerMedia::getSpareBrowserMediaSource();
+ if(media_source)
+ {
+ media_source->setOwner(owner);
+ media_source->setTarget(target);
+ media_source->setSize(default_width, default_height);
+
+ return media_source;
+ }
+ }
if(plugin_basename.empty())
{
- LL_WARNS("Media") << "Couldn't find plugin for media type " << media_type << LL_ENDL;
+ LL_WARNS_ONCE("Media") << "Couldn't find plugin for media type " << media_type << LL_ENDL;
}
else
{
@@ -1665,15 +1842,15 @@ LLPluginClassMedia* LLViewerMediaImpl::newSourceFromMediaType(std::string media_
llstat s;
if(LLFile::stat(launcher_name, &s))
{
- LL_WARNS("Media") << "Couldn't find launcher at " << launcher_name << LL_ENDL;
+ LL_WARNS_ONCE("Media") << "Couldn't find launcher at " << launcher_name << LL_ENDL;
}
else if(LLFile::stat(plugin_name, &s))
{
- LL_WARNS("Media") << "Couldn't find plugin at " << plugin_name << LL_ENDL;
+ LL_WARNS_ONCE("Media") << "Couldn't find plugin at " << plugin_name << LL_ENDL;
}
else
{
- LLPluginClassMedia* media_source = new LLPluginClassMedia(owner);
+ media_source = new LLPluginClassMedia(owner);
media_source->setSize(default_width, default_height);
media_source->setUserDataPath(user_data_path);
media_source->setLanguageCode(LLUI::getLanguage());
@@ -1689,10 +1866,14 @@ LLPluginClassMedia* LLViewerMediaImpl::newSourceFromMediaType(std::string media_
// collect 'javascript enabled' setting from prefs and send to embedded browser
bool javascript_enabled = gSavedSettings.getBOOL( "BrowserJavascriptEnabled" );
media_source->setJavascriptEnabled( javascript_enabled );
-
+
+ bool media_plugin_debugging_enabled = gSavedSettings.getBOOL("MediaPluginDebugging");
+ media_source->enableMediaPluginDebugging( media_plugin_debugging_enabled );
+
media_source->setTarget(target);
- if (media_source->init(launcher_name, plugin_name, gSavedSettings.getBOOL("PluginAttachDebuggerToPlugins")))
+ const std::string plugin_dir = gDirUtilp->getLLPluginDir();
+ if (media_source->init(launcher_name, plugin_dir, plugin_name, gSavedSettings.getBOOL("PluginAttachDebuggerToPlugins")))
{
return media_source;
}
@@ -1704,7 +1885,7 @@ LLPluginClassMedia* LLViewerMediaImpl::newSourceFromMediaType(std::string media_
}
}
- LL_WARNS("Plugin") << "plugin intialization failed for mime type: " << media_type << LL_ENDL;
+ LL_WARNS_ONCE("Plugin") << "plugin initialization failed for mime type: " << media_type << LL_ENDL;
LLSD args;
args["MIME_TYPE"] = media_type;
LLNotificationsUtil::add("NoPlugin", args);
@@ -1753,6 +1934,18 @@ bool LLViewerMediaImpl::initializePlugin(const std::string& media_type)
media_source->focus(mHasFocus);
media_source->setBackgroundColor(mBackgroundColor);
+ if(gSavedSettings.getBOOL("BrowserIgnoreSSLCertErrors"))
+ {
+ media_source->ignore_ssl_cert_errors(true);
+ }
+
+ // the correct way to deal with certs it to load ours from CA.pem and append them to the ones
+ // Qt/WebKit loads from your system location.
+ // Note: This needs the new CA.pem file with the Equifax Secure Certificate Authority
+ // cert at the bottom: (MIIDIDCCAomgAwIBAgIENd70zzANBg)
+ std::string ca_path = gDirUtilp->getExpandedFilename( LL_PATH_APP_SETTINGS, "CA.pem" );
+ media_source->addCertificateFilePath( ca_path );
+
media_source->proxy_setup(gSavedSettings.getBOOL("BrowserProxyEnabled"), gSavedSettings.getString("BrowserProxyAddress"), gSavedSettings.getS32("BrowserProxyPort"));
if(mClearCache)
@@ -1849,6 +2042,18 @@ void LLViewerMediaImpl::setSize(int width, int height)
}
//////////////////////////////////////////////////////////////////////////////////////////
+void LLViewerMediaImpl::showNotification(LLNotificationPtr notify)
+{
+ mNotification = notify;
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+void LLViewerMediaImpl::hideNotification()
+{
+ mNotification.reset();
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
void LLViewerMediaImpl::play()
{
// If the media source isn't there, try to initialize it and load an URL.
@@ -1985,7 +2190,14 @@ void LLViewerMediaImpl::updateVolume()
}
}
- mMediaSource->setVolume(volume);
+ if (sOnlyAudibleTextureID == LLUUID::null || sOnlyAudibleTextureID == mTextureId)
+ {
+ mMediaSource->setVolume(volume);
+ }
+ else
+ {
+ mMediaSource->setVolume(0.0f);
+ }
}
}
@@ -2044,6 +2256,17 @@ void LLViewerMediaImpl::clearCache()
}
}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+void LLViewerMediaImpl::setPageZoomFactor( double factor )
+{
+ if(mMediaSource && factor != mZoomFactor)
+ {
+ mZoomFactor = factor;
+ mMediaSource->set_page_zoom_factor( factor );
+ }
+}
+
//////////////////////////////////////////////////////////////////////////////////////////
void LLViewerMediaImpl::mouseDown(S32 x, S32 y, MASK mask, S32 button)
{
@@ -2190,7 +2413,79 @@ BOOL LLViewerMediaImpl::handleMouseUp(S32 x, S32 y, MASK mask)
}
//////////////////////////////////////////////////////////////////////////////////////////
-std::string LLViewerMediaImpl::getName() const
+void LLViewerMediaImpl::updateJavascriptObject()
+{
+ static LLFrameTimer timer ;
+
+ if ( mMediaSource )
+ {
+ // flag to expose this information to internal browser or not.
+ bool enable = gSavedSettings.getBOOL("BrowserEnableJSObject");
+
+ if(!enable)
+ {
+ return ; //no need to go further.
+ }
+
+ if(timer.getElapsedTimeF32() < 1.0f)
+ {
+ return ; //do not update more than once per second.
+ }
+ timer.reset() ;
+
+ mMediaSource->jsEnableObject( enable );
+
+ // these values are only menaingful after login so don't set them before
+ bool logged_in = LLLoginInstance::getInstance()->authSuccess();
+ if ( logged_in )
+ {
+ // current location within a region
+ LLVector3 agent_pos = gAgent.getPositionAgent();
+ double x = agent_pos.mV[ VX ];
+ double y = agent_pos.mV[ VY ];
+ double z = agent_pos.mV[ VZ ];
+ mMediaSource->jsAgentLocationEvent( x, y, z );
+
+ // current location within the grid
+ LLVector3d agent_pos_global = gAgent.getLastPositionGlobal();
+ double global_x = agent_pos_global.mdV[ VX ];
+ double global_y = agent_pos_global.mdV[ VY ];
+ double global_z = agent_pos_global.mdV[ VZ ];
+ mMediaSource->jsAgentGlobalLocationEvent( global_x, global_y, global_z );
+
+ // current agent orientation
+ double rotation = atan2( gAgent.getAtAxis().mV[VX], gAgent.getAtAxis().mV[VY] );
+ double angle = rotation * RAD_TO_DEG;
+ if ( angle < 0.0f ) angle = 360.0f + angle; // TODO: has to be a better way to get orientation!
+ mMediaSource->jsAgentOrientationEvent( angle );
+
+ // current region agent is in
+ std::string region_name("");
+ LLViewerRegion* region = gAgent.getRegion();
+ if ( region )
+ {
+ region_name = region->getName();
+ };
+ mMediaSource->jsAgentRegionEvent( region_name );
+ }
+
+ // language code the viewer is set to
+ mMediaSource->jsAgentLanguageEvent( LLUI::getLanguage() );
+
+ // maturity setting the agent has selected
+ if ( gAgent.prefersAdult() )
+ mMediaSource->jsAgentMaturityEvent( "GMA" ); // Adult means see adult, mature and general content
+ else
+ if ( gAgent.prefersMature() )
+ mMediaSource->jsAgentMaturityEvent( "GM" ); // Mature means see mature and general content
+ else
+ if ( gAgent.prefersPG() )
+ mMediaSource->jsAgentMaturityEvent( "G" ); // PG means only see General content
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+const std::string& LLViewerMediaImpl::getName() const
{
if (mMediaSource)
{
@@ -2392,23 +2687,7 @@ bool LLViewerMediaImpl::handleKeyHere(KEY key, MASK mask)
// Menu keys should be handled by the menu system and not passed to UI elements, but this is how LLTextEditor and LLLineEditor do it...
if( MASK_CONTROL & mask )
{
- if( 'C' == key )
- {
- mMediaSource->copy();
- result = true;
- }
- else
- if( 'V' == key )
- {
- mMediaSource->paste();
- result = true;
- }
- else
- if( 'X' == key )
- {
- mMediaSource->cut();
- result = true;
- }
+ result = true;
}
if(!result)
@@ -2468,8 +2747,14 @@ bool LLViewerMediaImpl::canNavigateBack()
}
//////////////////////////////////////////////////////////////////////////////////////////
+static LLFastTimer::DeclareTimer FTM_MEDIA_DO_UPDATE("Do Update");
+static LLFastTimer::DeclareTimer FTM_MEDIA_GET_DATA("Get Data");
+static LLFastTimer::DeclareTimer FTM_MEDIA_SET_SUBIMAGE("Set Subimage");
+
+
void LLViewerMediaImpl::update()
{
+ LLFastTimer t(FTM_MEDIA_DO_UPDATE);
if(mMediaSource == NULL)
{
if(mPriority == LLPluginClassMedia::PRIORITY_UNLOADED)
@@ -2503,6 +2788,9 @@ void LLViewerMediaImpl::update()
{
updateVolume();
+ // TODO: this is updated every frame - is this bad?
+ updateJavascriptObject();
+
// If we didn't just create the impl, it may need to get cookie updates.
if(!sUpdatedCookies.empty())
{
@@ -2566,20 +2854,27 @@ void LLViewerMediaImpl::update()
if(width > 0 && height > 0)
{
- U8* data = mMediaSource->getBitsData();
+ U8* data = NULL;
+ {
+ LLFastTimer t(FTM_MEDIA_GET_DATA);
+ data = mMediaSource->getBitsData();
+ }
// Offset the pixels pointer to match x_pos and y_pos
data += ( x_pos * mMediaSource->getTextureDepth() * mMediaSource->getBitsWidth() );
data += ( y_pos * mMediaSource->getTextureDepth() );
- placeholder_image->setSubImage(
- data,
- mMediaSource->getBitsWidth(),
- mMediaSource->getBitsHeight(),
- x_pos,
- y_pos,
- width,
- height);
+ {
+ LLFastTimer t(FTM_MEDIA_SET_SUBIMAGE);
+ placeholder_image->setSubImage(
+ data,
+ mMediaSource->getBitsWidth(),
+ mMediaSource->getBitsHeight(),
+ x_pos,
+ y_pos,
+ width,
+ height);
+ }
}
@@ -2796,15 +3091,6 @@ bool LLViewerMediaImpl::isForcedUnloaded() const
return true;
}
- if(sInWorldMediaDisabled)
- {
- // When inworld media is disabled, all instances that aren't marked as "used in UI" will not be loaded.
- if(!mUsedInUI)
- {
- return true;
- }
- }
-
// If this media's class is not supposed to be shown, unload
if (!shouldShowBasedOnClass())
{
@@ -2849,8 +3135,8 @@ void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginCla
{
LL_DEBUGS("Media") << "MEDIA_EVENT_CLICK_LINK_NOFOLLOW, uri is: " << plugin->getClickURL() << LL_ENDL;
std::string url = plugin->getClickURL();
- LLURLDispatcher::dispatch(url, NULL, mTrustedBrowser);
-
+ std::string nav_type = plugin->getClickNavType();
+ LLURLDispatcher::dispatch(url, nav_type, NULL, mTrustedBrowser);
}
break;
case MEDIA_EVENT_CLICK_LINK_HREF:
@@ -2913,6 +3199,7 @@ void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginCla
case LLViewerMediaObserver::MEDIA_EVENT_NAVIGATE_BEGIN:
{
LL_DEBUGS("Media") << "MEDIA_EVENT_NAVIGATE_BEGIN, uri is: " << plugin->getNavigateURI() << LL_ENDL;
+ hideNotification();
if(getNavState() == MEDIANAVSTATE_SERVER_SENT)
{
@@ -3003,7 +3290,26 @@ void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginCla
plugin->sendPickFileResponse(response);
}
break;
-
+
+
+ case LLViewerMediaObserver::MEDIA_EVENT_AUTH_REQUEST:
+ {
+ LLNotification::Params auth_request_params;
+ auth_request_params.name = "AuthRequest";
+
+ // pass in host name and realm for site (may be zero length but will always exist)
+ LLSD args;
+ LLURL raw_url( plugin->getAuthURL().c_str() );
+ args["HOST_NAME"] = raw_url.getAuthority();
+ args["REALM"] = plugin->getAuthRealm();
+ auth_request_params.substitutions = args;
+
+ auth_request_params.payload = LLSD().with("media_id", mTextureId);
+ auth_request_params.functor.function = boost::bind(&LLViewerMedia::onAuthSubmit, _1, _2);
+ LLNotifications::instance().add(auth_request_params);
+ };
+ break;
+
case LLViewerMediaObserver::MEDIA_EVENT_CLOSE_REQUEST:
{
std::string uuid = plugin->getClickUUID();
@@ -3018,7 +3324,7 @@ void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginCla
{
// This close request is directed at another instance
pass_through = false;
- LLFloaterMediaBrowser::closeRequest(uuid);
+ LLFloaterWebContent::closeRequest(uuid);
}
}
break;
@@ -3037,7 +3343,7 @@ void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginCla
{
// This request is directed at another instance
pass_through = false;
- LLFloaterMediaBrowser::geometryChanged(uuid, plugin->getGeometryX(), plugin->getGeometryY(), plugin->getGeometryWidth(), plugin->getGeometryHeight());
+ LLFloaterWebContent::geometryChanged(uuid, plugin->getGeometryX(), plugin->getGeometryY(), plugin->getGeometryWidth(), plugin->getGeometryHeight());
}
}
break;
@@ -3130,8 +3436,11 @@ BOOL LLViewerMediaImpl::isUpdated()
return mIsUpdated ;
}
+static LLFastTimer::DeclareTimer FTM_MEDIA_CALCULATE_INTEREST("Calculate Interest");
+
void LLViewerMediaImpl::calculateInterest()
{
+ LLFastTimer t(FTM_MEDIA_CALCULATE_INTEREST);
LLViewerMediaTexture* texture = LLViewerTextureManager::findMediaTexture( mTextureId );
if(texture != NULL)
@@ -3449,12 +3758,22 @@ bool LLViewerMediaImpl::shouldShowBasedOnClass() const
// If it is attached to an avatar and the pref is off, we shouldn't show it
if (attached_to_another_avatar)
- return gSavedSettings.getBOOL(LLViewerMedia::SHOW_MEDIA_ON_OTHERS_SETTING);
-
+ {
+ static LLCachedControl<bool> show_media_on_others(gSavedSettings, LLViewerMedia::SHOW_MEDIA_ON_OTHERS_SETTING);
+ return show_media_on_others;
+ }
if (inside_parcel)
- return gSavedSettings.getBOOL(LLViewerMedia::SHOW_MEDIA_WITHIN_PARCEL_SETTING);
+ {
+ static LLCachedControl<bool> show_media_within_parcel(gSavedSettings, LLViewerMedia::SHOW_MEDIA_WITHIN_PARCEL_SETTING);
+
+ return show_media_within_parcel;
+ }
else
- return gSavedSettings.getBOOL(LLViewerMedia::SHOW_MEDIA_OUTSIDE_PARCEL_SETTING);
+ {
+ static LLCachedControl<bool> show_media_outside_parcel(gSavedSettings, LLViewerMedia::SHOW_MEDIA_OUTSIDE_PARCEL_SETTING);
+
+ return show_media_outside_parcel;
+ }
}
//////////////////////////////////////////////////////////////////////////////////////////
@@ -3521,6 +3840,11 @@ bool LLViewerMediaImpl::isInAgentParcel() const
return result;
}
+LLNotificationPtr LLViewerMediaImpl::getCurrentNotification() const
+{
+ return mNotification;
+}
+
//////////////////////////////////////////////////////////////////////////////////////////
//
// static
diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h
index 4025a4484f..fff5b3fc08 100644
--- a/indra/newview/llviewermedia.h
+++ b/indra/newview/llviewermedia.h
@@ -37,6 +37,7 @@
#include "llpluginclassmedia.h"
#include "v4color.h"
+#include "llnotificationptr.h"
#include "llurl.h"
@@ -111,9 +112,6 @@ public:
static F32 getVolume();
static void muteListChanged();
- static void setInWorldMediaDisabled(bool disabled);
- static bool getInWorldMediaDisabled();
-
static bool isInterestingEnough(const LLVOVolume* object, const F64 &object_interest);
// Returns the priority-sorted list of all media impls.
@@ -130,6 +128,8 @@ public:
static bool isParcelMediaPlaying();
static bool isParcelAudioPlaying();
+ static void onAuthSubmit(const LLSD& notification, const LLSD& response);
+
// Clear all cookies for all plugins
static void clearAllCookies();
@@ -155,6 +155,13 @@ public:
static void proxyWindowOpened(const std::string &target, const std::string &uuid);
static void proxyWindowClosed(const std::string &uuid);
+ static void createSpareBrowserMediaSource();
+ static LLPluginClassMedia* getSpareBrowserMediaSource();
+
+ static void setOnlyAudibleMediaTextureID(const LLUUID& texture_id);
+
+ static LLSD getHeaders();
+
private:
static void setOpenIDCookie();
static void onTeleportFinished();
@@ -162,6 +169,7 @@ private:
static LLPluginCookieStore *sCookieStore;
static LLURL sOpenIDURL;
static std::string sOpenIDCookie;
+ static LLPluginClassMedia* sSpareBrowserMediaSource;
};
// Implementation functions not exported into header file
@@ -195,6 +203,9 @@ public:
LLPluginClassMedia* getMediaPlugin() { return mMediaSource; }
void setSize(int width, int height);
+ void showNotification(LLNotificationPtr notify);
+ void hideNotification();
+
void play();
void stop();
void pause();
@@ -236,6 +247,7 @@ public:
std::string getMediaEntryURL() { return mMediaEntryURL; }
void setHomeURL(const std::string& home_url, const std::string& mime_type = LLStringUtil::null) { mHomeURL = home_url; mHomeMimeType = mime_type;};
void clearCache();
+ void setPageZoomFactor( double factor );
std::string getMimeType() { return mMimeType; }
void scaleMouse(S32 *mouse_x, S32 *mouse_y);
void scaleTextureCoords(const LLVector2& texture_coords, S32 *x, S32 *y);
@@ -303,7 +315,7 @@ public:
/*virtual*/ BOOL handleToolTip(S32 x, S32 y, MASK mask) { return FALSE; };
/*virtual*/ BOOL handleMiddleMouseDown(S32 x, S32 y, MASK mask) { return FALSE; };
/*virtual*/ BOOL handleMiddleMouseUp(S32 x, S32 y, MASK mask) {return FALSE; };
- /*virtual*/ std::string getName() const;
+ /*virtual*/ const std::string& getName() const;
/*virtual*/ void screenPointToLocal(S32 screen_x, S32 screen_y, S32* local_x, S32* local_y) const {};
/*virtual*/ void localPointToScreen(S32 local_x, S32 local_y, S32* screen_x, S32* screen_y) const {};
@@ -329,7 +341,10 @@ public:
LLVOVolume *getSomeObject();
void setUpdated(BOOL updated) ;
BOOL isUpdated() ;
-
+
+ // updates the javascript object in the embedded browser with viewer values
+ void updateJavascriptObject();
+
// Updates the "interest" value in this object
void calculateInterest();
F64 getInterest() const { return mInterest; };
@@ -387,6 +402,9 @@ public:
// Is this media in the agent's parcel?
bool isInAgentParcel() const;
+ // get currently active notification associated with this media instance
+ LLNotificationPtr getCurrentNotification() const;
+
private:
bool isAutoPlayable() const;
bool shouldShowBasedOnClass() const;
@@ -396,6 +414,7 @@ private:
private:
// a single media url with some data and an impl.
LLPluginClassMedia* mMediaSource;
+ F64 mZoomFactor;
LLUUID mTextureId;
bool mMovieImageHasMips;
std::string mMediaURL; // The last media url set with NavigateTo
@@ -444,7 +463,8 @@ private:
bool mNavigateSuspendedDeferred;
bool mTrustedBrowser;
std::string mTarget;
-
+ LLNotificationPtr mNotification;
+
private:
BOOL mIsUpdated ;
std::list< LLVOVolume* > mObjectList ;
diff --git a/indra/newview/llviewermediafocus.cpp b/indra/newview/llviewermediafocus.cpp
index de52aa17d1..4543a1ba9a 100644
--- a/indra/newview/llviewermediafocus.cpp
+++ b/indra/newview/llviewermediafocus.cpp
@@ -113,6 +113,11 @@ void LLViewerMediaFocus::setFocusFace(LLPointer<LLViewerObject> objectp, S32 fac
media_impl->focus(true);
gFocusMgr.setKeyboardFocus(this);
+ LLViewerMediaImpl* impl = getFocusedMediaImpl();
+ if (impl)
+ {
+ LLEditMenuHandler::gEditMenuHandler = impl;
+ }
// We must do this before processing the media HUD zoom, or it may zoom to the wrong face.
update();
@@ -139,6 +144,13 @@ void LLViewerMediaFocus::setFocusFace(LLPointer<LLViewerObject> objectp, S32 fac
{
gFocusMgr.setKeyboardFocus(NULL);
}
+
+ LLViewerMediaImpl* impl = getFocusedMediaImpl();
+ if (LLEditMenuHandler::gEditMenuHandler == impl)
+ {
+ LLEditMenuHandler::gEditMenuHandler = NULL;
+ }
+
mFocusedImplID = LLUUID::null;
if (objectp.notNull())
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 03490034d8..3de0420468 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -25,11 +25,17 @@
*/
#include "llviewerprecompiledheaders.h"
+
+#ifdef INCLUDE_VLD
+#include "vld.h"
+#endif
+
#include "llviewermenu.h"
// linden library includes
#include "llavatarnamecache.h" // IDEVO
#include "llfloaterreg.h"
+#include "llfloatersidepanelcontainer.h"
#include "llcombobox.h"
#include "llinventorypanel.h"
#include "llnotifications.h"
@@ -37,15 +43,17 @@
// newview includes
#include "llagent.h"
+#include "llagentaccess.h"
#include "llagentcamera.h"
#include "llagentwearables.h"
#include "llagentpilot.h"
-#include "llbottomtray.h"
#include "llcompilequeue.h"
#include "llconsole.h"
+#include "lldaycyclemanager.h"
#include "lldebugview.h"
+#include "llenvmanager.h"
#include "llfilepicker.h"
-//#include "llfirstuse.h"
+#include "llfirstuse.h"
#include "llfloaterbuy.h"
#include "llfloaterbuycontents.h"
#include "llbuycurrencyhtml.h"
@@ -59,6 +67,7 @@
#include "llfloatersnapshot.h"
#include "llfloatertools.h"
#include "llfloaterworldmap.h"
+#include "llfloaterbuildoptions.h"
#include "llavataractions.h"
#include "lllandmarkactions.h"
#include "llgroupmgr.h"
@@ -72,12 +81,11 @@
#include "llinventoryfunctions.h"
#include "llpanellogin.h"
#include "llpanelblockedlist.h"
-#include "llmenucommands.h"
#include "llmoveview.h"
#include "llparcel.h"
#include "llrootview.h"
+#include "llsceneview.h"
#include "llselectmgr.h"
-#include "llsidetray.h"
#include "llstatusbar.h"
#include "lltextureview.h"
#include "lltoolcomp.h"
@@ -97,6 +105,7 @@
#include "llworldmap.h"
#include "pipeline.h"
#include "llviewerjoystick.h"
+#include "llwaterparammanager.h"
#include "llwlanimator.h"
#include "llwlparammanager.h"
#include "llfloatercamera.h"
@@ -104,10 +113,14 @@
#include "llappearancemgr.h"
#include "lltrans.h"
#include "lleconomy.h"
+#include "lltoolgrab.h"
+#include "llwindow.h"
#include "boost/unordered_map.hpp"
using namespace LLVOAvatarDefines;
+typedef LLPointer<LLViewerObject> LLViewerObjectPtr;
+
static boost::unordered_map<std::string, LLStringExplicit> sDefaultItemLabels;
BOOL enable_land_build(void*);
@@ -167,7 +180,6 @@ LLMenuItemCallGL* gBusyMenu = NULL;
// Local prototypes
// File Menu
-const char* upload_pick(void* data);
void handle_compress_image(void*);
@@ -191,6 +203,8 @@ BOOL is_selection_buy_not_take();
S32 selection_price();
BOOL enable_take();
void handle_take();
+void handle_object_show_inspector();
+void handle_avatar_show_inspector();
bool confirm_take(const LLSD& notification, const LLSD& response);
void handle_buy_object(LLSaleInfo sale_info);
@@ -205,7 +219,7 @@ void near_sit_down_point(BOOL success, void *);
void velocity_interpolate( void* );
-
+void handle_visual_leak_detector_toggle(void*);
void handle_rebake_textures(void*);
BOOL check_admin_override(void*);
void handle_admin_override_toggle(void*);
@@ -362,8 +376,6 @@ void set_underclothes_menu_options()
void init_menus()
{
- S32 top = gViewerWindow->getRootView()->getRect().getHeight();
-
// Initialize actions
initialize_menus();
@@ -435,11 +447,13 @@ void init_menus()
{
color = LLUIColorTable::instance().getColor( "MenuNonProductionBgColor" );
}
+
+ LLView* menu_bar_holder = gViewerWindow->getRootView()->getChildView("menu_bar_holder");
+
gMenuBarView = LLUICtrlFactory::getInstance()->createFromFile<LLMenuBarGL>("menu_viewer.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
- gMenuBarView->setRect(LLRect(0, top, 0, top - MENU_BAR_HEIGHT));
+ gMenuBarView->setRect(LLRect(0, menu_bar_holder->getRect().mTop, 0, menu_bar_holder->getRect().mTop - MENU_BAR_HEIGHT));
gMenuBarView->setBackgroundColor( color );
- LLView* menu_bar_holder = gViewerWindow->getRootView()->getChildView("menu_bar_holder");
menu_bar_holder->addChild(gMenuBarView);
gViewerWindow->setMenuBackgroundColor(false,
@@ -452,7 +466,7 @@ void init_menus()
gMenuHolder->childSetLabelArg("Upload Sound", "[COST]", upload_cost);
gMenuHolder->childSetLabelArg("Upload Animation", "[COST]", upload_cost);
gMenuHolder->childSetLabelArg("Bulk Upload", "[COST]", upload_cost);
-
+
gAFKMenu = gMenuBarView->getChild<LLMenuItemCallGL>("Set Away", TRUE);
gBusyMenu = gMenuBarView->getChild<LLMenuItemCallGL>("Set Busy", TRUE);
gAttachSubMenu = gMenuBarView->findChildMenuByName("Attach Object", TRUE);
@@ -512,8 +526,13 @@ class LLAdvancedToggleConsole : public view_listener_t
}
else if ("fast timers" == console_type)
{
- toggle_visibility( (void*)gDebugView->mFastTimerView );
+ LLFloaterReg::toggleInstance("fast_timers");
}
+ else if ("scene view" == console_type)
+ {
+ toggle_visibility( (void*)gSceneView);
+ }
+
#if MEM_TRACK_MEM
else if ("memory view" == console_type)
{
@@ -547,7 +566,11 @@ class LLAdvancedCheckConsole : public view_listener_t
}
else if ("fast timers" == console_type)
{
- new_value = get_visibility( (void*)gDebugView->mFastTimerView );
+ new_value = LLFloaterReg::instanceVisible("fast_timers");
+ }
+ else if ("scene view" == console_type)
+ {
+ new_value = get_visibility( (void*) gSceneView);
}
#if MEM_TRACK_MEM
else if ("memory view" == console_type)
@@ -555,7 +578,7 @@ class LLAdvancedCheckConsole : public view_listener_t
new_value = get_visibility( (void*)gDebugView->mMemoryView );
}
#endif
-
+
return new_value;
}
};
@@ -696,7 +719,7 @@ U32 render_type_from_string(std::string render_type)
{
return LLPipeline::RENDER_TYPE_AVATAR;
}
- else if ("surfacePath" == render_type)
+ else if ("surfacePatch" == render_type)
{
return LLPipeline::RENDER_TYPE_TERRAIN;
}
@@ -814,7 +837,8 @@ U32 feature_from_string(std::string feature)
};
-class LLAdvancedToggleFeature : public view_listener_t{
+class LLAdvancedToggleFeature : public view_listener_t
+{
bool handleEvent(const LLSD& userdata)
{
U32 feature = feature_from_string( userdata.asString() );
@@ -827,7 +851,8 @@ class LLAdvancedToggleFeature : public view_listener_t{
};
class LLAdvancedCheckFeature : public view_listener_t
-{bool handleEvent(const LLSD& userdata)
+{
+ bool handleEvent(const LLSD& userdata)
{
U32 feature = feature_from_string( userdata.asString() );
bool new_value = false;
@@ -855,6 +880,10 @@ U32 info_display_from_string(std::string info_display)
{
return LLPipeline::RENDER_DEBUG_BBOXES;
}
+ else if ("normals" == info_display)
+ {
+ return LLPipeline::RENDER_DEBUG_NORMALS;
+ }
else if ("points" == info_display)
{
return LLPipeline::RENDER_DEBUG_POINTS;
@@ -867,6 +896,10 @@ U32 info_display_from_string(std::string info_display)
{
return LLPipeline::RENDER_DEBUG_SHADOW_FRUSTA;
}
+ else if ("physics shapes" == info_display)
+ {
+ return LLPipeline::RENDER_DEBUG_PHYSICS_SHAPES;
+ }
else if ("occlusion" == info_display)
{
return LLPipeline::RENDER_DEBUG_OCCLUSION;
@@ -875,6 +908,10 @@ U32 info_display_from_string(std::string info_display)
{
return LLPipeline::RENDER_DEBUG_BATCH_SIZE;
}
+ else if ("update type" == info_display)
+ {
+ return LLPipeline::RENDER_DEBUG_UPDATE_TYPE;
+ }
else if ("texture anim" == info_display)
{
return LLPipeline::RENDER_DEBUG_TEXTURE_ANIM;
@@ -895,6 +932,14 @@ U32 info_display_from_string(std::string info_display)
{
return LLPipeline::RENDER_DEBUG_FACE_AREA;
}
+ else if ("lod info" == info_display)
+ {
+ return LLPipeline::RENDER_DEBUG_LOD_INFO;
+ }
+ else if ("build queue" == info_display)
+ {
+ return LLPipeline::RENDER_DEBUG_BUILD_QUEUE;
+ }
else if ("lights" == info_display)
{
return LLPipeline::RENDER_DEBUG_LIGHTS;
@@ -907,6 +952,10 @@ U32 info_display_from_string(std::string info_display)
{
return LLPipeline::RENDER_DEBUG_COMPOSITION;
}
+ else if ("attachment bytes" == info_display)
+ {
+ return LLPipeline::RENDER_DEBUG_ATTACHMENT_BYTES;
+ }
else if ("glow" == info_display)
{
return LLPipeline::RENDER_DEBUG_GLOW;
@@ -923,6 +972,14 @@ U32 info_display_from_string(std::string info_display)
{
return LLPipeline::RENDER_DEBUG_AGENT_TARGET;
}
+ else if ("sculpt" == info_display)
+ {
+ return LLPipeline::RENDER_DEBUG_SCULPTED;
+ }
+ else if ("wind vectors" == info_display)
+ {
+ return LLPipeline::RENDER_DEBUG_WIND_VECTORS;
+ }
else
{
return 0;
@@ -935,6 +992,8 @@ class LLAdvancedToggleInfoDisplay : public view_listener_t
{
U32 info_display = info_display_from_string( userdata.asString() );
+ LL_INFOS("ViewerMenu") << "toggle " << userdata.asString() << LL_ENDL;
+
if ( info_display != 0 )
{
LLPipeline::toggleRenderDebug( (void*)info_display );
@@ -952,6 +1011,8 @@ class LLAdvancedCheckInfoDisplay : public view_listener_t
U32 info_display = info_display_from_string( userdata.asString() );
bool new_value = false;
+ LL_INFOS("ViewerMenu") << "check " << userdata.asString() << LL_ENDL;
+
if ( info_display != 0 )
{
new_value = LLPipeline::toggleRenderDebugControl( (void*)info_display );
@@ -985,26 +1046,6 @@ class LLAdvancedCheckRandomizeFramerate : public view_listener_t
}
};
-void run_vectorize_perf_test(void *)
-{
- gSavedSettings.setBOOL("VectorizePerfTest", TRUE);
-}
-
-
-////////////////////////////////
-// RUN Vectorized Perform Test//
-////////////////////////////////
-
-
-class LLAdvancedVectorizePerfTest : public view_listener_t
-{
- bool handleEvent(const LLSD& userdata)
- {
- run_vectorize_perf_test(NULL);
- return true;
- }
-};
-
///////////////////////////
//// PERIODIC SLOW FRAME //
///////////////////////////
@@ -1855,19 +1896,20 @@ class LLAdvancedAgentPilot : public view_listener_t
std::string command = userdata.asString();
if ("start playback" == command)
{
- LLAgentPilot::startPlayback(NULL);
+ gAgentPilot.setNumRuns(-1);
+ gAgentPilot.startPlayback();
}
else if ("stop playback" == command)
{
- LLAgentPilot::stopPlayback(NULL);
+ gAgentPilot.stopPlayback();
}
else if ("start record" == command)
{
- LLAgentPilot::startRecord(NULL);
+ gAgentPilot.startRecord();
}
else if ("stop record" == command)
{
- LLAgentPilot::saveRecord(NULL);
+ gAgentPilot.stopRecord();
}
return true;
@@ -1885,7 +1927,7 @@ class LLAdvancedToggleAgentPilotLoop : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
- LLAgentPilot::sLoop = !(LLAgentPilot::sLoop);
+ gAgentPilot.setLoop(!gAgentPilot.getLoop());
return true;
}
};
@@ -1894,7 +1936,7 @@ class LLAdvancedCheckAgentPilotLoop : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
- bool new_value = LLAgentPilot::sLoop;
+ bool new_value = gAgentPilot.getLoop();
return new_value;
}
};
@@ -1981,6 +2023,15 @@ class LLAdvancedToggleViewAdminOptions : public view_listener_t
}
};
+class LLAdvancedToggleVisualLeakDetector : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ handle_visual_leak_detector_toggle(NULL);
+ return true;
+ }
+};
+
class LLAdvancedCheckViewAdminOptions : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
@@ -2022,7 +2073,7 @@ class LLAdvancedEnableRenderDeferred: public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
- bool new_value = gSavedSettings.getBOOL("RenderUseFBO") && LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_WINDLIGHT > 0) &&
+ bool new_value = gGLManager.mHasFramebufferObject && LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_WINDLIGHT) > 1 &&
LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_AVATAR) > 0;
return new_value;
}
@@ -2035,7 +2086,8 @@ class LLAdvancedEnableRenderDeferredOptions: public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
- bool new_value = gSavedSettings.getBOOL("RenderUseFBO") && gSavedSettings.getBOOL("RenderDeferred");
+ bool new_value = gGLManager.mHasFramebufferObject && LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_WINDLIGHT) > 1 &&
+ LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_AVATAR) > 0 && gSavedSettings.getBOOL("RenderDeferred");
return new_value;
}
};
@@ -2169,6 +2221,30 @@ class LLAdvancedEnableToggleHackedGodmode : public view_listener_t
//// Advanced menu
////-------------------------------------------------------------------
+
+//////////////////
+// DEVELOP MENU //
+//////////////////
+
+class LLDevelopCheckLoggingLevel : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ U32 level = userdata.asInteger();
+ return (static_cast<LLError::ELevel>(level) == LLError::getDefaultLevel());
+ }
+};
+
+class LLDevelopSetLoggingLevel : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ U32 level = userdata.asInteger();
+ LLError::setDefaultLevel(static_cast<LLError::ELevel>(level));
+ return true;
+ }
+};
+
//////////////////
// ADMIN MENU //
//////////////////
@@ -2337,50 +2413,23 @@ class LLObjectEnableReportAbuse : public view_listener_t
}
};
+
void handle_object_touch()
{
- LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject();
- if (!object) return;
-
- LLPickInfo pick = LLToolPie::getInstance()->getPick();
+ LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject();
+ if (!object) return;
- LLMessageSystem *msg = gMessageSystem;
+ LLPickInfo pick = LLToolPie::getInstance()->getPick();
- msg->newMessageFast(_PREHASH_ObjectGrab);
- msg->nextBlockFast( _PREHASH_AgentData);
- msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
- msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
- msg->nextBlockFast( _PREHASH_ObjectData);
- msg->addU32Fast( _PREHASH_LocalID, object->mLocalID);
- msg->addVector3Fast(_PREHASH_GrabOffset, LLVector3::zero );
- msg->nextBlock("SurfaceInfo");
- msg->addVector3("UVCoord", LLVector3(pick.mUVCoords));
- msg->addVector3("STCoord", LLVector3(pick.mSTCoords));
- msg->addS32Fast(_PREHASH_FaceIndex, pick.mObjectFace);
- msg->addVector3("Position", pick.mIntersection);
- msg->addVector3("Normal", pick.mNormal);
- msg->addVector3("Binormal", pick.mBinormal);
- msg->sendMessage( object->getRegion()->getHost());
-
- // *NOTE: Hope the packets arrive safely and in order or else
- // there will be some problems.
- // *TODO: Just fix this bad assumption.
- msg->newMessageFast(_PREHASH_ObjectDeGrab);
- msg->nextBlockFast(_PREHASH_AgentData);
- msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
- msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
- msg->nextBlockFast(_PREHASH_ObjectData);
- msg->addU32Fast(_PREHASH_LocalID, object->mLocalID);
- msg->nextBlock("SurfaceInfo");
- msg->addVector3("UVCoord", LLVector3(pick.mUVCoords));
- msg->addVector3("STCoord", LLVector3(pick.mSTCoords));
- msg->addS32Fast(_PREHASH_FaceIndex, pick.mObjectFace);
- msg->addVector3("Position", pick.mIntersection);
- msg->addVector3("Normal", pick.mNormal);
- msg->addVector3("Binormal", pick.mBinormal);
- msg->sendMessage(object->getRegion()->getHost());
+ // *NOTE: Hope the packets arrive safely and in order or else
+ // there will be some problems.
+ // *TODO: Just fix this bad assumption.
+ send_ObjectGrab_message(object, pick, LLVector3::zero);
+ send_ObjectDeGrab_message(object, pick);
}
+
+
static void init_default_item_label(const std::string& item_name)
{
boost::unordered_map<std::string, LLStringExplicit>::iterator it = sDefaultItemLabels.find(item_name);
@@ -2567,7 +2616,7 @@ void handle_object_inspect()
{
LLSD key;
key["task"] = "task";
- LLSideTray::getInstance()->showPanel("sidepanel_inventory", key);
+ LLFloaterSidePanelContainer::showPanel("inventory", key);
}
/*
@@ -2755,8 +2804,31 @@ bool enable_object_mute()
else
{
// Just a regular object
- return LLSelectMgr::getInstance()->getSelection()->
- contains( object, SELECT_ALL_TES );
+ return LLSelectMgr::getInstance()->getSelection()->contains( object, SELECT_ALL_TES ) &&
+ !LLMuteList::getInstance()->isMuted(object->getID());
+ }
+}
+
+bool enable_object_unmute()
+{
+ LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject();
+ if (!object) return false;
+
+ LLVOAvatar* avatar = find_avatar_from_object(object);
+ if (avatar)
+ {
+ // It's an avatar
+ LLNameValue *lastname = avatar->getNVPair("LastName");
+ bool is_linden =
+ lastname && !LLStringUtil::compareStrings(lastname->getString(), "Linden");
+ bool is_self = avatar->isSelf();
+ return !is_linden && !is_self;
+ }
+ else
+ {
+ // Just a regular object
+ return LLSelectMgr::getInstance()->getSelection()->contains( object, SELECT_ALL_TES ) &&
+ LLMuteList::getInstance()->isMuted(object->getID());;
}
}
@@ -2800,7 +2872,7 @@ class LLObjectMute : public view_listener_t
}
LLMute mute(id, name, type);
- if (LLMuteList::getInstance()->isMuted(mute.mID, mute.mName))
+ if (LLMuteList::getInstance()->isMuted(mute.mID))
{
LLMuteList::getInstance()->remove(mute);
}
@@ -3092,6 +3164,12 @@ void handle_avatar_eject(const LLSD& avatar_id)
}
}
+bool my_profile_visible()
+{
+ LLFloater* floaterp = LLAvatarActions::getProfileFloater(gAgentID);
+ return floaterp && floaterp->isInVisibleChain();
+}
+
bool enable_freeze_eject(const LLSD& avatar_id)
{
// Use avatar_id if available, otherwise default to right-click avatar
@@ -3326,15 +3404,6 @@ bool enable_sitdown_self()
return isAgentAvatarValid() && !gAgentAvatarp->isSitting() && !gAgent.getFlying();
}
-// Used from the login screen to aid in UI work on side tray
-void handle_show_side_tray()
-{
- LLSideTray* side_tray = LLSideTray::getInstance();
- LLView* root = gViewerWindow->getRootView();
- // automatically removes and re-adds if there already
- root->addChild(side_tray);
-}
-
// Toggle one of "People" panel tabs in side tray.
class LLTogglePanelPeopleTab : public view_listener_t
{
@@ -3345,21 +3414,11 @@ class LLTogglePanelPeopleTab : public view_listener_t
LLSD param;
param["people_panel_tab_name"] = panel_name;
- static LLPanel* friends_panel = NULL;
- static LLPanel* groups_panel = NULL;
- static LLPanel* nearby_panel = NULL;
-
- if (panel_name == "friends_panel")
+ if ( panel_name == "friends_panel"
+ || panel_name == "groups_panel"
+ || panel_name == "nearby_panel")
{
- return togglePeoplePanel(friends_panel, panel_name, param);
- }
- else if (panel_name == "groups_panel")
- {
- return togglePeoplePanel(groups_panel, panel_name, param);
- }
- else if (panel_name == "nearby_panel")
- {
- return togglePeoplePanel(nearby_panel, panel_name, param);
+ return togglePeoplePanel(panel_name, param);
}
else
{
@@ -3367,16 +3426,20 @@ class LLTogglePanelPeopleTab : public view_listener_t
}
}
- static bool togglePeoplePanel(LLPanel* &panel, const std::string& panel_name, const LLSD& param)
+ static bool togglePeoplePanel(const std::string& panel_name, const LLSD& param)
{
+ LLPanel *panel = LLFloaterSidePanelContainer::getPanel("people", panel_name);
if(!panel)
+ return false;
+
+ if (panel->isInVisibleChain())
{
- panel = LLSideTray::getInstance()->getPanel(panel_name);
- if(!panel)
- return false;
+ LLFloaterReg::hideInstance("people");
+ }
+ else
+ {
+ LLFloaterSidePanelContainer::showPanel("people", "panel_people", param) ;
}
-
- LLSideTray::getInstance()->togglePanel(panel, "panel_people", param);
return true;
}
@@ -3395,6 +3458,35 @@ void handle_admin_override_toggle(void*)
show_debug_menus();
}
+void handle_visual_leak_detector_toggle(void*)
+{
+ static bool vld_enabled = false;
+
+ if ( vld_enabled )
+ {
+#ifdef INCLUDE_VLD
+ // only works for debug builds (hard coded into vld.h)
+#ifdef _DEBUG
+ // start with Visual Leak Detector turned off
+ VLDDisable();
+#endif // _DEBUG
+#endif // INCLUDE_VLD
+ vld_enabled = false;
+ }
+ else
+ {
+#ifdef INCLUDE_VLD
+ // only works for debug builds (hard coded into vld.h)
+ #ifdef _DEBUG
+ // start with Visual Leak Detector turned off
+ VLDEnable();
+ #endif // _DEBUG
+#endif // INCLUDE_VLD
+
+ vld_enabled = true;
+ };
+}
+
void handle_god_mode(void*)
{
gAgent.requestEnterGodMode();
@@ -3585,6 +3677,15 @@ class LLEnableEditShape : public view_listener_t
}
};
+class LLEnableEditPhysics : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ //return gAgentWearables.isWearableModifiable(LLWearableType::WT_SHAPE, 0);
+ return TRUE;
+ }
+};
+
bool is_object_sittable()
{
LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject();
@@ -3682,7 +3783,7 @@ void handle_reset_view()
if (gAgentCamera.cameraCustomizeAvatar())
{
// switching to outfit selector should automagically save any currently edited wearable
- LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD().with("type", "my_outfits"));
+ LLFloaterSidePanelContainer::showPanel("appearance", LLSD().with("type", "my_outfits"));
}
gAgentCamera.switchCameraPreset(CAMERA_PRESET_REAR_VIEW);
@@ -3747,6 +3848,43 @@ class LLViewDefaultUISize : public view_listener_t
}
};
+class LLViewToggleUI : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ LLNotification::Params params("ConfirmHideUI");
+ params.functor.function(boost::bind(&LLViewToggleUI::confirm, this, _1, _2));
+ LLSD substitutions;
+#if LL_DARWIN
+ substitutions["SHORTCUT"] = "Cmd+Shift+U";
+#else
+ substitutions["SHORTCUT"] = "Ctrl+Shift+U";
+#endif
+ params.substitutions = substitutions;
+ if (gViewerWindow->getUIVisibility())
+ {
+ // hiding, so show notification
+ LLNotifications::instance().add(params);
+ }
+ else
+ {
+ LLNotifications::instance().forceResponse(params, 0);
+ }
+
+ return true;
+ }
+
+ void confirm(const LLSD& notification, const LLSD& response)
+ {
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+
+ if (option == 0) // OK
+ {
+ gViewerWindow->setUIVisibility(!gViewerWindow->getUIVisibility());
+ }
+ }
+};
+
class LLEditDuplicate : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
@@ -3937,23 +4075,21 @@ void handle_god_request_avatar_geometry(void *)
}
}
-
-void derez_objects(EDeRezDestination dest, const LLUUID& dest_id)
+static bool get_derezzable_objects(
+ EDeRezDestination dest,
+ std::string& error,
+ LLViewerRegion*& first_region,
+ LLDynamicArray<LLViewerObjectPtr>* derez_objectsp,
+ bool only_check = false)
{
- if(gAgentCamera.cameraMouselook())
- {
- gAgentCamera.changeCameraToDefault();
- }
- //gInventoryView->setPanelOpen(TRUE);
+ bool found = false;
- std::string error;
- LLDynamicArray<LLViewerObject*> derez_objects;
+ LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection();
// Check conditions that we can't deal with, building a list of
// everything that we'll actually be derezzing.
- LLViewerRegion* first_region = NULL;
- for (LLObjectSelection::valid_root_iterator iter = LLSelectMgr::getInstance()->getSelection()->valid_root_begin();
- iter != LLSelectMgr::getInstance()->getSelection()->valid_root_end(); iter++)
+ for (LLObjectSelection::valid_root_iterator iter = selection->valid_root_begin();
+ iter != selection->valid_root_end(); iter++)
{
LLSelectNode* node = *iter;
LLViewerObject* object = node->getObject();
@@ -4020,8 +4156,53 @@ void derez_objects(EDeRezDestination dest, const LLUUID& dest_id)
}
if(can_derez_current)
{
- derez_objects.put(object);
+ found = true;
+
+ if (only_check)
+ // one found, no need to traverse to the end
+ break;
+
+ if (derez_objectsp)
+ derez_objectsp->put(object);
+
+ }
+ }
+
+ return found;
+}
+
+static bool can_derez(EDeRezDestination dest)
+{
+ LLViewerRegion* first_region = NULL;
+ std::string error;
+ return get_derezzable_objects(dest, error, first_region, NULL, true);
+}
+
+static void derez_objects(
+ EDeRezDestination dest,
+ const LLUUID& dest_id,
+ LLViewerRegion*& first_region,
+ std::string& error,
+ LLDynamicArray<LLViewerObjectPtr>* objectsp)
+{
+ LLDynamicArray<LLViewerObjectPtr> derez_objects;
+
+ if (!objectsp) // if objects to derez not specified
+ {
+ // get them from selection
+ if (!get_derezzable_objects(dest, error, first_region, &derez_objects, false))
+ {
+ llwarns << "No objects to derez" << llendl;
+ return;
}
+
+ objectsp = &derez_objects;
+ }
+
+
+ if(gAgentCamera.cameraMouselook())
+ {
+ gAgentCamera.changeCameraToDefault();
}
// This constant is based on (1200 - HEADER_SIZE) / 4 bytes per
@@ -4031,13 +4212,13 @@ void derez_objects(EDeRezDestination dest, const LLUUID& dest_id)
// satisfy anybody.
const S32 MAX_ROOTS_PER_PACKET = 250;
const S32 MAX_PACKET_COUNT = 254;
- F32 packets = ceil((F32)derez_objects.count() / (F32)MAX_ROOTS_PER_PACKET);
+ F32 packets = ceil((F32)objectsp->count() / (F32)MAX_ROOTS_PER_PACKET);
if(packets > (F32)MAX_PACKET_COUNT)
{
error = "AcquireErrorTooManyObjects";
}
- if(error.empty() && derez_objects.count() > 0)
+ if(error.empty() && objectsp->count() > 0)
{
U8 d = (U8)dest;
LLUUID tid;
@@ -4062,11 +4243,11 @@ void derez_objects(EDeRezDestination dest, const LLUUID& dest_id)
msg->addU8Fast(_PREHASH_PacketCount, packet_count);
msg->addU8Fast(_PREHASH_PacketNumber, packet_number);
objects_in_packet = 0;
- while((object_index < derez_objects.count())
+ while((object_index < objectsp->count())
&& (objects_in_packet++ < MAX_ROOTS_PER_PACKET))
{
- LLViewerObject* object = derez_objects.get(object_index++);
+ LLViewerObject* object = objectsp->get(object_index++);
msg->nextBlockFast(_PREHASH_ObjectData);
msg->addU32Fast(_PREHASH_ObjectLocalID, object->getLocalID());
// VEFFECT: DerezObject
@@ -4091,6 +4272,13 @@ void derez_objects(EDeRezDestination dest, const LLUUID& dest_id)
}
}
+static void derez_objects(EDeRezDestination dest, const LLUUID& dest_id)
+{
+ LLViewerRegion* first_region = NULL;
+ std::string error;
+ derez_objects(dest, dest_id, first_region, error, NULL);
+}
+
void handle_take_copy()
{
if (LLSelectMgr::getInstance()->getSelection()->isEmpty()) return;
@@ -4102,12 +4290,19 @@ void handle_take_copy()
// You can return an object to its owner if it is on your land.
class LLObjectReturn : public view_listener_t
{
+public:
+ LLObjectReturn() : mFirstRegion(NULL) {}
+
+private:
bool handleEvent(const LLSD& userdata)
{
if (LLSelectMgr::getInstance()->getSelection()->isEmpty()) return true;
mObjectSelection = LLSelectMgr::getInstance()->getEditSelection();
+ // Save selected objects, so that we still know what to return after the confirmation dialog resets selection.
+ get_derezzable_objects(DRD_RETURN_TO_OWNER, mError, mFirstRegion, &mReturnableObjects);
+
LLNotificationsUtil::add("ReturnToOwner", LLSD(), LLSD(), boost::bind(&LLObjectReturn::onReturnToOwner, this, _1, _2));
return true;
}
@@ -4118,16 +4313,23 @@ class LLObjectReturn : public view_listener_t
if (0 == option)
{
// Ignore category ID for this derez destination.
- derez_objects(DRD_RETURN_TO_OWNER, LLUUID::null);
+ derez_objects(DRD_RETURN_TO_OWNER, LLUUID::null, mFirstRegion, mError, &mReturnableObjects);
}
+ mReturnableObjects.clear();
+ mError.clear();
+ mFirstRegion = NULL;
+
// drop reference to current selection
mObjectSelection = NULL;
return false;
}
-protected:
LLObjectSelectionHandle mObjectSelection;
+
+ LLDynamicArray<LLViewerObjectPtr> mReturnableObjects;
+ std::string mError;
+ LLViewerRegion* mFirstRegion;
};
@@ -4152,29 +4354,7 @@ class LLObjectEnableReturn : public view_listener_t
}
else
{
- LLViewerRegion* region = gAgent.getRegion();
- if (region)
- {
- // Estate owners and managers can always return objects.
- if (region->canManageEstate())
- {
- new_value = true;
- }
- else
- {
- struct f : public LLSelectedObjectFunctor
- {
- virtual bool apply(LLViewerObject* obj)
- {
- return (obj->isOverAgentOwnedLand() ||
- obj->isOverGroupOwnedLand() ||
- obj->permModify());
- }
- } func;
- const bool firstonly = true;
- new_value = LLSelectMgr::getInstance()->getSelection()->applyToRootObjects(&func, firstonly);
- }
- }
+ new_value = can_derez(DRD_RETURN_TO_OWNER);
}
#endif
return new_value;
@@ -4294,6 +4474,33 @@ void handle_take()
}
}
+void handle_object_show_inspector()
+{
+ LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection();
+ LLViewerObject* objectp = selection->getFirstRootObject(TRUE);
+ if (!objectp)
+ {
+ return;
+ }
+
+ LLSD params;
+ params["object_id"] = objectp->getID();
+ LLFloaterReg::showInstance("inspect_object", params);
+}
+
+void handle_avatar_show_inspector()
+{
+ LLVOAvatar* avatar = find_avatar_from_object( LLSelectMgr::getInstance()->getSelection()->getPrimaryObject() );
+ if(avatar)
+ {
+ LLSD params;
+ params["avatar_id"] = avatar->getID();
+ LLFloaterReg::showInstance("inspect_avatar", params);
+ }
+}
+
+
+
bool confirm_take(const LLSD& notification, const LLSD& response)
{
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
@@ -4395,6 +4602,13 @@ bool tools_visible_take_object()
return !is_selection_buy_not_take();
}
+bool enable_how_to_visible(const LLSD& param)
+{
+ LLFloaterWebContent::Params p;
+ p.target = "__help_how_to";
+ return LLFloaterReg::instanceVisible("how_to", p);
+}
+
class LLToolsEnableBuyOrTake : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
@@ -4719,110 +4933,6 @@ class LLToolsSelectNextPart : public view_listener_t
}
};
-// in order to link, all objects must have the same owner, and the
-// agent must have the ability to modify all of the objects. However,
-// we're not answering that question with this method. The question
-// we're answering is: does the user have a reasonable expectation
-// that a link operation should work? If so, return true, false
-// otherwise. this allows the handle_link method to more finely check
-// the selection and give an error message when the uer has a
-// reasonable expectation for the link to work, but it will fail.
-class LLToolsEnableLink : public view_listener_t
-{
- bool handleEvent(const LLSD& userdata)
- {
- bool new_value = false;
- // check if there are at least 2 objects selected, and that the
- // user can modify at least one of the selected objects.
-
- // in component mode, can't link
- if (!gSavedSettings.getBOOL("EditLinkedParts"))
- {
- if(LLSelectMgr::getInstance()->selectGetAllRootsValid() && LLSelectMgr::getInstance()->getSelection()->getRootObjectCount() >= 2)
- {
- struct f : public LLSelectedObjectFunctor
- {
- virtual bool apply(LLViewerObject* object)
- {
- return object->permModify();
- }
- } func;
- const bool firstonly = true;
- new_value = LLSelectMgr::getInstance()->getSelection()->applyToRootObjects(&func, firstonly);
- }
- }
- return new_value;
- }
-};
-
-class LLToolsLink : public view_listener_t
-{
- bool handleEvent(const LLSD& userdata)
- {
- if(!LLSelectMgr::getInstance()->selectGetAllRootsValid())
- {
- LLNotificationsUtil::add("UnableToLinkWhileDownloading");
- return true;
- }
-
- S32 object_count = LLSelectMgr::getInstance()->getSelection()->getObjectCount();
- if (object_count > MAX_CHILDREN_PER_TASK + 1)
- {
- LLSD args;
- args["COUNT"] = llformat("%d", object_count);
- int max = MAX_CHILDREN_PER_TASK+1;
- args["MAX"] = llformat("%d", max);
- LLNotificationsUtil::add("UnableToLinkObjects", args);
- return true;
- }
-
- if(LLSelectMgr::getInstance()->getSelection()->getRootObjectCount() < 2)
- {
- LLNotificationsUtil::add("CannotLinkIncompleteSet");
- return true;
- }
- if(!LLSelectMgr::getInstance()->selectGetRootsModify())
- {
- LLNotificationsUtil::add("CannotLinkModify");
- return true;
- }
- LLUUID owner_id;
- std::string owner_name;
- if(!LLSelectMgr::getInstance()->selectGetOwner(owner_id, owner_name))
- {
- // we don't actually care if you're the owner, but novices are
- // the most likely to be stumped by this one, so offer the
- // easiest and most likely solution.
- LLNotificationsUtil::add("CannotLinkDifferentOwners");
- return true;
- }
- LLSelectMgr::getInstance()->sendLink();
- return true;
- }
-};
-
-class LLToolsEnableUnlink : public view_listener_t
-{
- bool handleEvent(const LLSD& userdata)
- {
- LLViewerObject* first_editable_object = LLSelectMgr::getInstance()->getSelection()->getFirstEditableObject();
- bool new_value = LLSelectMgr::getInstance()->selectGetAllRootsValid() &&
- first_editable_object &&
- !first_editable_object->isAttachment();
- return new_value;
- }
-};
-
-class LLToolsUnlink : public view_listener_t
-{
- bool handleEvent(const LLSD& userdata)
- {
- LLSelectMgr::getInstance()->sendDelink();
- return true;
- }
-};
-
-
class LLToolsStopAllAnimations : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
@@ -5189,6 +5299,14 @@ void toggle_debug_menus(void*)
// }
//
+class LLCommunicateBlockList : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ LLFloaterSidePanelContainer::showPanel("people", "panel_block_list_sidetray", LLSD());
+ return true;
+ }
+};
class LLWorldSetHomeLocation : public view_listener_t
{
@@ -5284,7 +5402,7 @@ class LLWorldCreateLandmark : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
- LLSideTray::getInstance()->showPanel("panel_places", LLSD().with("type", "create_landmark"));
+ LLFloaterSidePanelContainer::showPanel("places", LLSD().with("type", "create_landmark"));
return true;
}
@@ -5294,7 +5412,7 @@ class LLWorldPlaceProfile : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
- LLSideTray::getInstance()->showPanel("panel_places", LLSD().with("type", "agent"));
+ LLFloaterSidePanelContainer::showPanel("places", LLSD().with("type", "agent"));
return true;
}
@@ -5390,6 +5508,34 @@ class LLAvatarAddFriend : public view_listener_t
}
};
+
+class LLAvatarToggleMyProfile : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ LLFloater* instance = LLAvatarActions::getProfileFloater(gAgent.getID());
+ if (LLFloater::isMinimized(instance))
+ {
+ instance->setMinimized(FALSE);
+ instance->setFocus(TRUE);
+ }
+ else if (!LLFloater::isShown(instance))
+ {
+ LLAvatarActions::showProfile(gAgent.getID());
+ }
+ else if (!instance->hasFocus() && !instance->getIsChrome())
+ {
+ instance->setFocus(TRUE);
+ }
+ else
+ {
+ instance->closeFloater();
+ }
+ return true;
+ }
+};
+
+
class LLAvatarAddContact : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
@@ -5535,17 +5681,22 @@ void handle_viewer_disable_message_log(void*)
void handle_customize_avatar()
{
- LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD().with("type", "my_outfits"));
+ LLFloaterSidePanelContainer::showPanel("appearance", LLSD().with("type", "my_outfits"));
}
void handle_edit_outfit()
{
- LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD().with("type", "edit_outfit"));
+ LLFloaterSidePanelContainer::showPanel("appearance", LLSD().with("type", "edit_outfit"));
}
void handle_edit_shape()
{
- LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD().with("type", "edit_shape"));
+ LLFloaterSidePanelContainer::showPanel("appearance", LLSD().with("type", "edit_shape"));
+}
+
+void handle_edit_physics()
+{
+ LLFloaterSidePanelContainer::showPanel("appearance", LLSD().with("type", "edit_physics"));
}
void handle_report_abuse()
@@ -5584,20 +5735,50 @@ class LLShowHelp : public view_listener_t
}
};
-class LLShowSidetrayPanel : public view_listener_t
+class LLToggleHelp : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
- std::string panel_name = userdata.asString();
- // Toggle the panel
- if (!LLSideTray::getInstance()->isPanelActive(panel_name))
+ LLFloater* help_browser = (LLFloaterReg::findInstance("help_browser"));
+ if (help_browser && help_browser->isInVisibleChain())
{
- // LLFloaterInventory::showAgentInventory();
- LLSideTray::getInstance()->showPanel(panel_name, LLSD());
+ help_browser->closeFloater();
}
else
{
- LLSideTray::getInstance()->collapseSideBar();
+ std::string help_topic = userdata.asString();
+ LLViewerHelp* vhelp = LLViewerHelp::getInstance();
+ vhelp->showTopic(help_topic);
+ }
+ return true;
+ }
+};
+
+class LLToggleSpeak : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ LLVoiceClient::getInstance()->toggleUserPTTState();
+ return true;
+ }
+};
+class LLShowSidetrayPanel : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ std::string floater_name = userdata.asString();
+
+ LLPanel* panel = LLFloaterSidePanelContainer::getPanel(floater_name);
+ if (panel)
+ {
+ if (panel->isInVisibleChain())
+ {
+ LLFloaterReg::getInstance(floater_name)->closeFloater();
+ }
+ else
+ {
+ LLFloaterReg::getInstance(floater_name)->openFloater();
+ }
}
return true;
}
@@ -5607,9 +5788,9 @@ class LLSidetrayPanelVisible : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
- std::string panel_name = userdata.asString();
+ std::string floater_name = userdata.asString();
// Toggle the panel
- if (LLSideTray::getInstance()->isPanelActive(panel_name))
+ if (LLFloaterReg::getInstance(floater_name)->isInVisibleChain())
{
return true;
}
@@ -5726,6 +5907,44 @@ class LLShowAgentProfile : public view_listener_t
}
};
+class LLToggleAgentProfile : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ LLUUID agent_id;
+ if (userdata.asString() == "agent")
+ {
+ agent_id = gAgent.getID();
+ }
+ else if (userdata.asString() == "hit object")
+ {
+ LLViewerObject* objectp = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject();
+ if (objectp)
+ {
+ agent_id = objectp->getID();
+ }
+ }
+ else
+ {
+ agent_id = userdata.asUUID();
+ }
+
+ LLVOAvatar* avatar = find_avatar_from_object(agent_id);
+ if (avatar)
+ {
+ if (!LLAvatarActions::profileVisible(avatar->getID()))
+ {
+ LLAvatarActions::showProfile(avatar->getID());
+ }
+ else
+ {
+ LLAvatarActions::hideProfile(avatar->getID());
+ }
+ }
+ return true;
+ }
+};
+
class LLLandEdit : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
@@ -6345,31 +6564,37 @@ class LLToolsSelectedScriptAction : public view_listener_t
std::string action = userdata.asString();
bool mono = false;
std::string msg, name;
+ std::string title;
if (action == "compile mono")
{
name = "compile_queue";
mono = true;
msg = "Recompile";
+ title = LLTrans::getString("CompileQueueTitle");
}
if (action == "compile lsl")
{
name = "compile_queue";
msg = "Recompile";
+ title = LLTrans::getString("CompileQueueTitle");
}
else if (action == "reset")
{
name = "reset_queue";
msg = "Reset";
+ title = LLTrans::getString("ResetQueueTitle");
}
else if (action == "start")
{
name = "start_queue";
- msg = "Running";
+ msg = "SetRunning";
+ title = LLTrans::getString("RunQueueTitle");
}
else if (action == "stop")
{
name = "stop_queue";
- msg = "RunningNot";
+ msg = "SetRunningNot";
+ title = LLTrans::getString("NotRunQueueTitle");
}
LLUUID id; id.generate();
@@ -6378,6 +6603,7 @@ class LLToolsSelectedScriptAction : public view_listener_t
{
queue->setMono(mono);
queue_actions(queue, msg);
+ queue->setTitle(title);
}
else
{
@@ -6757,6 +6983,22 @@ class LLToolsEnableSaveToObjectInventory : public view_listener_t
}
};
+class LLToggleHowTo : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ LLFloaterWebContent::Params p;
+ std::string url = gSavedSettings.getString("HowToHelpURL");
+ p.url = LLWeb::expandURLSubstitutions(url, LLSD());
+ p.show_chrome = false;
+ p.target = "__help_how_to";
+ p.show_page_title = false;
+ p.preferred_media_size = LLRect(0, 460, 335, 0);
+
+ LLFloaterReg::toggleInstanceOrBringToFront("how_to", p);
+ return true;
+ }
+};
class LLViewEnableMouselook : public view_listener_t
{
@@ -7097,10 +7339,6 @@ class LLToolsUseSelectionForGrid : public view_listener_t
} func;
LLSelectMgr::getInstance()->getSelection()->applyToRootObjects(&func);
LLSelectMgr::getInstance()->setGridMode(GRID_MODE_REF_OBJECT);
- if (gFloaterTools)
- {
- gFloaterTools->mComboGridMode->setCurrentByIndex((S32)GRID_MODE_REF_OBJECT);
- }
return true;
}
};
@@ -7124,7 +7362,13 @@ LLViewerMenuHolderGL::LLViewerMenuHolderGL(const LLViewerMenuHolderGL::Params& p
BOOL LLViewerMenuHolderGL::hideMenus()
{
- BOOL handled = LLMenuHolderGL::hideMenus();
+ BOOL handled = FALSE;
+
+ if (LLMenuHolderGL::hideMenus())
+ {
+ LLToolPie::instance().blockClickToWalk();
+ handled = TRUE;
+ }
// drop pie menu selection
mParcelSelection = NULL;
@@ -7165,6 +7409,12 @@ void handle_web_browser_test(const LLSD& param)
LLWeb::loadURLInternal(url);
}
+void handle_web_content_test(const LLSD& param)
+{
+ std::string url = param.asString();
+ LLWeb::loadURLInternal(url);
+}
+
void handle_buy_currency_test(void*)
{
std::string url =
@@ -7288,6 +7538,11 @@ class LLViewToggleBeacon : public view_listener_t
LLPipeline::toggleRenderPhysicalBeacons(NULL);
gSavedSettings.setBOOL( "physicalbeacon", LLPipeline::getRenderPhysicalBeacons(NULL) );
}
+ else if (beacon == "moapbeacon")
+ {
+ LLPipeline::toggleRenderMOAPBeacons(NULL);
+ gSavedSettings.setBOOL( "moapbeacon", LLPipeline::getRenderMOAPBeacons(NULL) );
+ }
else if (beacon == "soundsbeacon")
{
LLPipeline::toggleRenderSoundBeacons(NULL);
@@ -7347,6 +7602,11 @@ class LLViewCheckBeaconEnabled : public view_listener_t
new_value = gSavedSettings.getBOOL( "scriptsbeacon");
LLPipeline::setRenderScriptedBeacons(new_value);
}
+ else if (beacon == "moapbeacon")
+ {
+ new_value = gSavedSettings.getBOOL( "moapbeacon");
+ LLPipeline::setRenderMOAPBeacons(new_value);
+ }
else if (beacon == "physicalbeacon")
{
new_value = gSavedSettings.getBOOL( "physicalbeacon");
@@ -7498,112 +7758,136 @@ class LLWorldEnvSettings : public view_listener_t
bool handleEvent(const LLSD& userdata)
{
std::string tod = userdata.asString();
- LLVector3 sun_direction;
if (tod == "editor")
{
- // if not there or is hidden, show it
LLFloaterReg::toggleInstance("env_settings");
return true;
}
-
+
if (tod == "sunrise")
{
- // set the value, turn off animation
- LLWLParamManager::instance()->mAnimator.setDayTime(0.25);
- LLWLParamManager::instance()->mAnimator.mIsRunning = false;
- LLWLParamManager::instance()->mAnimator.mUseLindenTime = false;
-
- // then call update once
- LLWLParamManager::instance()->mAnimator.update(
- LLWLParamManager::instance()->mCurParams);
+ LLEnvManagerNew::instance().setUseSkyPreset("Sunrise");
}
else if (tod == "noon")
{
- // set the value, turn off animation
- LLWLParamManager::instance()->mAnimator.setDayTime(0.567);
- LLWLParamManager::instance()->mAnimator.mIsRunning = false;
- LLWLParamManager::instance()->mAnimator.mUseLindenTime = false;
-
- // then call update once
- LLWLParamManager::instance()->mAnimator.update(
- LLWLParamManager::instance()->mCurParams);
+ LLEnvManagerNew::instance().setUseSkyPreset("Midday");
}
else if (tod == "sunset")
{
- // set the value, turn off animation
- LLWLParamManager::instance()->mAnimator.setDayTime(0.75);
- LLWLParamManager::instance()->mAnimator.mIsRunning = false;
- LLWLParamManager::instance()->mAnimator.mUseLindenTime = false;
-
- // then call update once
- LLWLParamManager::instance()->mAnimator.update(
- LLWLParamManager::instance()->mCurParams);
+ LLEnvManagerNew::instance().setUseSkyPreset("Sunset");
}
else if (tod == "midnight")
{
- // set the value, turn off animation
- LLWLParamManager::instance()->mAnimator.setDayTime(0.0);
- LLWLParamManager::instance()->mAnimator.mIsRunning = false;
- LLWLParamManager::instance()->mAnimator.mUseLindenTime = false;
-
- // then call update once
- LLWLParamManager::instance()->mAnimator.update(
- LLWLParamManager::instance()->mCurParams);
+ LLEnvManagerNew::instance().setUseSkyPreset("Midnight");
}
else
{
- LLWLParamManager::instance()->mAnimator.mIsRunning = true;
- LLWLParamManager::instance()->mAnimator.mUseLindenTime = true;
+ LLEnvManagerNew &envmgr = LLEnvManagerNew::instance();
+ // reset all environmental settings to track the region defaults, make this reset 'sticky' like the other sun settings.
+ bool use_fixed_sky = false;
+ bool use_region_settings = true;
+ envmgr.setUserPrefs(envmgr.getWaterPresetName(),
+ envmgr.getSkyPresetName(),
+ envmgr.getDayCycleName(),
+ use_fixed_sky, use_region_settings);
}
- return true;
- }
-};
-/// Water Menu callbacks
-class LLWorldWaterSettings : public view_listener_t
-{
- bool handleEvent(const LLSD& userdata)
- {
- LLFloaterReg::toggleInstance("env_water");
return true;
}
};
-/// Post-Process callbacks
-class LLWorldPostProcess : public view_listener_t
+class LLWorldEnvPreset : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
- LLFloaterReg::showInstance("env_post_process");
- return true;
- }
-};
+ std::string item = userdata.asString();
+
+ if (item == "new_water")
+ {
+ LLFloaterReg::showInstance("env_edit_water", "new");
+ }
+ else if (item == "edit_water")
+ {
+ LLFloaterReg::showInstance("env_edit_water", "edit");
+ }
+ else if (item == "delete_water")
+ {
+ LLFloaterReg::showInstance("env_delete_preset", "water");
+ }
+ else if (item == "new_sky")
+ {
+ LLFloaterReg::showInstance("env_edit_sky", "new");
+ }
+ else if (item == "edit_sky")
+ {
+ LLFloaterReg::showInstance("env_edit_sky", "edit");
+ }
+ else if (item == "delete_sky")
+ {
+ LLFloaterReg::showInstance("env_delete_preset", "sky");
+ }
+ else if (item == "new_day_cycle")
+ {
+ LLFloaterReg::showInstance("env_edit_day_cycle", "new");
+ }
+ else if (item == "edit_day_cycle")
+ {
+ LLFloaterReg::showInstance("env_edit_day_cycle", "edit");
+ }
+ else if (item == "delete_day_cycle")
+ {
+ LLFloaterReg::showInstance("env_delete_preset", "day_cycle");
+ }
+ else
+ {
+ llwarns << "Unknown item selected" << llendl;
+ }
-/// Day Cycle callbacks
-class LLWorldDayCycle : public view_listener_t
-{
- bool handleEvent(const LLSD& userdata)
- {
- LLFloaterReg::showInstance("env_day_cycle");
return true;
}
};
-class LLWorldToggleMovementControls : public view_listener_t
+class LLWorldEnableEnvPreset : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
- LLBottomTray::getInstance()->toggleMovementControls();
- return true;
+ std::string item = userdata.asString();
+
+ if (item == "delete_water")
+ {
+ LLWaterParamManager::preset_name_list_t user_waters;
+ LLWaterParamManager::instance().getUserPresetNames(user_waters);
+ return !user_waters.empty();
+ }
+ else if (item == "delete_sky")
+ {
+ LLWLParamManager::preset_name_list_t user_skies;
+ LLWLParamManager::instance().getUserPresetNames(user_skies);
+ return !user_skies.empty();
+ }
+ else if (item == "delete_day_cycle")
+ {
+ LLDayCycleManager::preset_name_list_t user_days;
+ LLDayCycleManager::instance().getUserPresetNames(user_days);
+ return !user_days.empty();
+ }
+ else
+ {
+ llwarns << "Unknown item" << llendl;
+ }
+
+ return false;
}
};
-class LLWorldToggleCameraControls : public view_listener_t
+
+/// Post-Process callbacks
+class LLWorldPostProcess : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
- LLBottomTray::getInstance()->toggleCameraControls();
+ LLFloaterReg::showInstance("env_post_process");
return true;
}
};
@@ -7757,9 +8041,17 @@ void initialize_menus()
view_listener_t::addEnable(new LLUploadCostCalculator(), "Upload.CalculateCosts");
+
+ commit.add("Inventory.NewWindow", boost::bind(&LLFloaterInventory::showAgentInventory));
+
// Agent
commit.add("Agent.toggleFlying", boost::bind(&LLAgent::toggleFlying));
enable.add("Agent.enableFlying", boost::bind(&LLAgent::enableFlying));
+ commit.add("Agent.PressMicrophone", boost::bind(&LLAgent::pressMicrophone, _2));
+ commit.add("Agent.ReleaseMicrophone", boost::bind(&LLAgent::releaseMicrophone, _2));
+ commit.add("Agent.ToggleMicrophone", boost::bind(&LLAgent::toggleMicrophone, _2));
+ enable.add("Agent.IsMicrophoneOn", boost::bind(&LLAgent::isMicrophoneOn, _2));
+ enable.add("Agent.IsActionAllowed", boost::bind(&LLAgent::isActionAllowed, _2));
// File menu
init_menu_file();
@@ -7767,9 +8059,11 @@ void initialize_menus()
view_listener_t::addMenu(new LLEditEnableTakeOff(), "Edit.EnableTakeOff");
view_listener_t::addMenu(new LLEditEnableCustomizeAvatar(), "Edit.EnableCustomizeAvatar");
view_listener_t::addMenu(new LLEnableEditShape(), "Edit.EnableEditShape");
+ view_listener_t::addMenu(new LLEnableEditPhysics(), "Edit.EnableEditPhysics");
commit.add("CustomizeAvatar", boost::bind(&handle_customize_avatar));
commit.add("EditOutfit", boost::bind(&handle_edit_outfit));
commit.add("EditShape", boost::bind(&handle_edit_shape));
+ commit.add("EditPhysics", boost::bind(&handle_edit_physics));
// View menu
view_listener_t::addMenu(new LLViewMouselook(), "View.Mouselook");
@@ -7784,6 +8078,7 @@ void initialize_menus()
view_listener_t::addMenu(new LLZoomer(1/1.2f), "View.ZoomIn");
view_listener_t::addMenu(new LLZoomer(DEFAULT_FIELD_OF_VIEW, false), "View.ZoomDefault");
view_listener_t::addMenu(new LLViewDefaultUISize(), "View.DefaultUISize");
+ view_listener_t::addMenu(new LLViewToggleUI(), "View.ToggleUI");
view_listener_t::addMenu(new LLViewEnableMouselook(), "View.EnableMouselook");
view_listener_t::addMenu(new LLViewEnableJoystickFlycam(), "View.EnableJoystickFlycam");
@@ -7797,9 +8092,11 @@ void initialize_menus()
// Me > Movement
view_listener_t::addMenu(new LLAdvancedAgentFlyingInfo(), "Agent.getFlying");
+
+ // Communicate
+ view_listener_t::addMenu(new LLCommunicateBlockList(), "Communicate.BlockList");
// World menu
- commit.add("World.Chat", boost::bind(&handle_chat, (void*)NULL));
view_listener_t::addMenu(new LLWorldAlwaysRun(), "World.AlwaysRun");
view_listener_t::addMenu(new LLWorldCreateLandmark(), "World.CreateLandmark");
view_listener_t::addMenu(new LLWorldPlaceProfile(), "World.PlaceProfile");
@@ -7816,12 +8113,9 @@ void initialize_menus()
view_listener_t::addMenu(new LLWorldCheckAlwaysRun(), "World.CheckAlwaysRun");
view_listener_t::addMenu(new LLWorldEnvSettings(), "World.EnvSettings");
- view_listener_t::addMenu(new LLWorldWaterSettings(), "World.WaterSettings");
+ view_listener_t::addMenu(new LLWorldEnvPreset(), "World.EnvPreset");
+ view_listener_t::addMenu(new LLWorldEnableEnvPreset(), "World.EnableEnvPreset");
view_listener_t::addMenu(new LLWorldPostProcess(), "World.PostProcess");
- view_listener_t::addMenu(new LLWorldDayCycle(), "World.DayCycle");
-
- view_listener_t::addMenu(new LLWorldToggleMovementControls(), "World.Toggle.MovementControls");
- view_listener_t::addMenu(new LLWorldToggleCameraControls(), "World.Toggle.CameraControls");
// Tools menu
view_listener_t::addMenu(new LLToolsSelectTool(), "Tools.SelectTool");
@@ -7834,8 +8128,8 @@ void initialize_menus()
view_listener_t::addMenu(new LLToolsSnapObjectXY(), "Tools.SnapObjectXY");
view_listener_t::addMenu(new LLToolsUseSelectionForGrid(), "Tools.UseSelectionForGrid");
view_listener_t::addMenu(new LLToolsSelectNextPart(), "Tools.SelectNextPart");
- view_listener_t::addMenu(new LLToolsLink(), "Tools.Link");
- view_listener_t::addMenu(new LLToolsUnlink(), "Tools.Unlink");
+ commit.add("Tools.Link", boost::bind(&LLSelectMgr::linkObjects, LLSelectMgr::getInstance()));
+ commit.add("Tools.Unlink", boost::bind(&LLSelectMgr::unlinkObjects, LLSelectMgr::getInstance()));
view_listener_t::addMenu(new LLToolsStopAllAnimations(), "Tools.StopAllAnimations");
view_listener_t::addMenu(new LLToolsReleaseKeys(), "Tools.ReleaseKeys");
view_listener_t::addMenu(new LLToolsEnableReleaseKeys(), "Tools.EnableReleaseKeys");
@@ -7848,8 +8142,8 @@ void initialize_menus()
view_listener_t::addMenu(new LLToolsEnableToolNotPie(), "Tools.EnableToolNotPie");
view_listener_t::addMenu(new LLToolsEnableSelectNextPart(), "Tools.EnableSelectNextPart");
- view_listener_t::addMenu(new LLToolsEnableLink(), "Tools.EnableLink");
- view_listener_t::addMenu(new LLToolsEnableUnlink(), "Tools.EnableUnlink");
+ enable.add("Tools.EnableLink", boost::bind(&LLSelectMgr::enableLinkObjects, LLSelectMgr::getInstance()));
+ enable.add("Tools.EnableUnlink", boost::bind(&LLSelectMgr::enableUnlinkObjects, LLSelectMgr::getInstance()));
view_listener_t::addMenu(new LLToolsEnableBuyOrTake(), "Tools.EnableBuyOrTake");
enable.add("Tools.EnableTakeCopy", boost::bind(&enable_object_take_copy));
enable.add("Tools.VisibleBuyObject", boost::bind(&tools_visible_buy_object));
@@ -7859,6 +8153,8 @@ void initialize_menus()
// Help menu
// most items use the ShowFloater method
+ view_listener_t::addMenu(new LLToggleHowTo(), "Help.ToggleHowTo");
+ enable.add("Help.HowToVisible", boost::bind(&enable_how_to_visible, _2));
// Advanced menu
view_listener_t::addMenu(new LLAdvancedToggleConsole(), "Advanced.ToggleConsole");
@@ -7896,7 +8192,6 @@ void initialize_menus()
view_listener_t::addMenu(new LLAdvancedCheckRandomizeFramerate(), "Advanced.CheckRandomizeFramerate");
view_listener_t::addMenu(new LLAdvancedTogglePeriodicSlowFrame(), "Advanced.TogglePeriodicSlowFrame");
view_listener_t::addMenu(new LLAdvancedCheckPeriodicSlowFrame(), "Advanced.CheckPeriodicSlowFrame");
- view_listener_t::addMenu(new LLAdvancedVectorizePerfTest(), "Advanced.VectorizePerfTest");
view_listener_t::addMenu(new LLAdvancedToggleFrameTest(), "Advanced.ToggleFrameTest");
view_listener_t::addMenu(new LLAdvancedCheckFrameTest(), "Advanced.CheckFrameTest");
view_listener_t::addMenu(new LLAdvancedHandleAttachedLightParticles(), "Advanced.HandleAttachedLightParticles");
@@ -7915,7 +8210,8 @@ void initialize_menus()
view_listener_t::addMenu(new LLAdvancedDumpRegionObjectCache(), "Advanced.DumpRegionObjectCache");
// Advanced > UI
- commit.add("Advanced.WebBrowserTest", boost::bind(&handle_web_browser_test, _2));
+ commit.add("Advanced.WebBrowserTest", boost::bind(&handle_web_browser_test, _2)); // sigh! this one opens the MEDIA browser
+ commit.add("Advanced.WebContentTest", boost::bind(&handle_web_content_test, _2)); // this one opens the Web Content floater
view_listener_t::addMenu(new LLAdvancedBuyCurrencyTest(), "Advanced.BuyCurrencyTest");
view_listener_t::addMenu(new LLAdvancedDumpSelectMgr(), "Advanced.DumpSelectMgr");
view_listener_t::addMenu(new LLAdvancedDumpInventory(), "Advanced.DumpInventory");
@@ -7936,7 +8232,6 @@ void initialize_menus()
view_listener_t::addMenu(new LLAdvancedCheckDebugKeys(), "Advanced.CheckDebugKeys");
view_listener_t::addMenu(new LLAdvancedToggleDebugWindowProc(), "Advanced.ToggleDebugWindowProc");
view_listener_t::addMenu(new LLAdvancedCheckDebugWindowProc(), "Advanced.CheckDebugWindowProc");
- commit.add("Advanced.ShowSideTray", boost::bind(&handle_show_side_tray));
// Advanced > XUI
commit.add("Advanced.ReloadColorSettings", boost::bind(&LLUIColorTable::loadFromSettings, LLUIColorTable::getInstance()));
@@ -8003,9 +8298,14 @@ void initialize_menus()
view_listener_t::addMenu(new LLAdvancedEnableViewAdminOptions(), "Advanced.EnableViewAdminOptions");
view_listener_t::addMenu(new LLAdvancedToggleViewAdminOptions(), "Advanced.ToggleViewAdminOptions");
view_listener_t::addMenu(new LLAdvancedCheckViewAdminOptions(), "Advanced.CheckViewAdminOptions");
+ view_listener_t::addMenu(new LLAdvancedToggleVisualLeakDetector(), "Advanced.ToggleVisualLeakDetector");
+
view_listener_t::addMenu(new LLAdvancedRequestAdminStatus(), "Advanced.RequestAdminStatus");
view_listener_t::addMenu(new LLAdvancedLeaveAdminStatus(), "Advanced.LeaveAdminStatus");
+ // Develop >Set logging level
+ view_listener_t::addMenu(new LLDevelopCheckLoggingLevel(), "Develop.CheckLoggingLevel");
+ view_listener_t::addMenu(new LLDevelopSetLoggingLevel(), "Develop.SetLoggingLevel");
// Admin >Object
view_listener_t::addMenu(new LLAdminForceTakeCopy(), "Admin.ForceTakeCopy");
@@ -8046,10 +8346,15 @@ void initialize_menus()
view_listener_t::addMenu(new LLAvatarVisibleDebug(), "Avatar.VisibleDebug");
view_listener_t::addMenu(new LLAvatarInviteToGroup(), "Avatar.InviteToGroup");
commit.add("Avatar.Eject", boost::bind(&handle_avatar_eject, LLSD()));
+ commit.add("Avatar.ShowInspector", boost::bind(&handle_avatar_show_inspector));
view_listener_t::addMenu(new LLAvatarSendIM(), "Avatar.SendIM");
view_listener_t::addMenu(new LLAvatarCall(), "Avatar.Call");
enable.add("Avatar.EnableCall", boost::bind(&LLAvatarActions::canCall));
view_listener_t::addMenu(new LLAvatarReportAbuse(), "Avatar.ReportAbuse");
+ view_listener_t::addMenu(new LLAvatarToggleMyProfile(), "Avatar.ToggleMyProfile");
+ enable.add("Avatar.IsMyProfileOpen", boost::bind(&my_profile_visible));
+
+ commit.add("Avatar.OpenMarketplace", boost::bind(&LLWeb::loadURLExternal, gSavedSettings.getString("MarketplaceURL")));
view_listener_t::addMenu(new LLAvatarEnableAddFriend(), "Avatar.EnableAddFriend");
enable.add("Avatar.EnableFreezeEject", boost::bind(&enable_freeze_eject, _2));
@@ -8073,6 +8378,7 @@ void initialize_menus()
commit.add("Object.Inspect", boost::bind(&handle_object_inspect));
commit.add("Object.Open", boost::bind(&handle_object_open));
commit.add("Object.Take", boost::bind(&handle_take));
+ commit.add("Object.ShowInspector", boost::bind(&handle_object_show_inspector));
enable.add("Object.EnableOpen", boost::bind(&enable_object_open));
enable.add("Object.EnableTouch", boost::bind(&enable_object_touch, _1));
enable.add("Object.EnableDelete", boost::bind(&enable_object_delete));
@@ -8086,6 +8392,7 @@ void initialize_menus()
enable.add("Avatar.EnableMute", boost::bind(&enable_object_mute));
enable.add("Object.EnableMute", boost::bind(&enable_object_mute));
+ enable.add("Object.EnableUnmute", boost::bind(&enable_object_unmute));
enable.add("Object.EnableBuy", boost::bind(&enable_buy_object));
commit.add("Object.ZoomIn", boost::bind(&handle_look_at_selection, "zoom"));
@@ -8111,13 +8418,18 @@ void initialize_menus()
commit.add("ReportAbuse", boost::bind(&handle_report_abuse));
commit.add("BuyCurrency", boost::bind(&handle_buy_currency));
view_listener_t::addMenu(new LLShowHelp(), "ShowHelp");
+ view_listener_t::addMenu(new LLToggleHelp(), "ToggleHelp");
+ view_listener_t::addMenu(new LLToggleSpeak(), "ToggleSpeak");
view_listener_t::addMenu(new LLPromptShowURL(), "PromptShowURL");
view_listener_t::addMenu(new LLShowAgentProfile(), "ShowAgentProfile");
+ view_listener_t::addMenu(new LLToggleAgentProfile(), "ToggleAgentProfile");
view_listener_t::addMenu(new LLToggleControl(), "ToggleControl");
view_listener_t::addMenu(new LLCheckControl(), "CheckControl");
view_listener_t::addMenu(new LLGoToObject(), "GoToObject");
commit.add("PayObject", boost::bind(&handle_give_money_dialog));
+ commit.add("Inventory.NewWindow", boost::bind(&LLFloaterInventory::showAgentInventory));
+
enable.add("EnablePayObject", boost::bind(&enable_pay_object));
enable.add("EnablePayAvatar", boost::bind(&enable_pay_avatar));
enable.add("EnableEdit", boost::bind(&enable_object_edit));
@@ -8130,6 +8442,5 @@ void initialize_menus()
view_listener_t::addMenu(new LLSomethingSelectedNoHUD(), "SomethingSelectedNoHUD");
view_listener_t::addMenu(new LLEditableSelected(), "EditableSelected");
view_listener_t::addMenu(new LLEditableSelectedMono(), "EditableSelectedMono");
-
view_listener_t::addMenu(new LLToggleUIHints(), "ToggleUIHints");
}
diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp
index 048691696b..dc2ea4bd1f 100644
--- a/indra/newview/llviewermenufile.cpp
+++ b/indra/newview/llviewermenufile.cpp
@@ -34,6 +34,7 @@
#include "llfilepicker.h"
#include "llfloaterreg.h"
#include "llbuycurrencyhtml.h"
+#include "llfloatermodelpreview.h"
#include "llfloatersnapshot.h"
#include "llimage.h"
#include "llimagebmp.h"
@@ -52,13 +53,14 @@
#include "llvfs.h"
#include "llviewerinventory.h"
#include "llviewermenu.h" // gMenuHolder
+#include "llviewerparcelmgr.h"
#include "llviewerregion.h"
#include "llviewerstats.h"
#include "llviewerwindow.h"
#include "llappviewer.h"
#include "lluploaddialog.h"
#include "lltrans.h"
-
+#include "llfloaterbuycurrency.h"
// linden libraries
#include "llassetuploadresponders.h"
@@ -66,6 +68,7 @@
#include "llhttpclient.h"
#include "llnotificationsutil.h"
#include "llsdserialize.h"
+#include "llsdutil.h"
#include "llstring.h"
#include "lltransactiontypes.h"
#include "lluuid.h"
@@ -84,12 +87,103 @@ class LLFileEnableUpload : public view_listener_t
}
};
+class LLFileEnableUploadModel : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ return true;
+ }
+};
+
+class LLMeshEnabled : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ return gSavedSettings.getBOOL("MeshEnabled");
+ }
+};
+
+class LLMeshUploadVisible : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ return gMeshRepo.meshUploadEnabled();
+ }
+};
+
+LLMutex* LLFilePickerThread::sMutex = NULL;
+std::queue<LLFilePickerThread*> LLFilePickerThread::sDeadQ;
+
+void LLFilePickerThread::getFile()
+{
+#if LL_WINDOWS
+ start();
+#else
+ run();
+#endif
+}
+
+//virtual
+void LLFilePickerThread::run()
+{
+ LLFilePicker picker;
+#if LL_WINDOWS
+ if (picker.getOpenFile(mFilter, false))
+ {
+ mFile = picker.getFirstFile();
+ }
+#else
+ if (picker.getOpenFile(mFilter, true))
+ {
+ mFile = picker.getFirstFile();
+ }
+#endif
+
+ {
+ LLMutexLock lock(sMutex);
+ sDeadQ.push(this);
+ }
+
+}
+
+//static
+void LLFilePickerThread::initClass()
+{
+ sMutex = new LLMutex(NULL);
+}
+
+//static
+void LLFilePickerThread::cleanupClass()
+{
+ clearDead();
+
+ delete sMutex;
+ sMutex = NULL;
+}
+
+//static
+void LLFilePickerThread::clearDead()
+{
+ if (!sDeadQ.empty())
+ {
+ LLMutexLock lock(sMutex);
+ while (!sDeadQ.empty())
+ {
+ LLFilePickerThread* thread = sDeadQ.front();
+ thread->notify(thread->mFile);
+ delete thread;
+ sDeadQ.pop();
+ }
+ }
+}
+
+
//============================================================================
#if LL_WINDOWS
static std::string SOUND_EXTENSIONS = "wav";
static std::string IMAGE_EXTENSIONS = "tga bmp jpg jpeg png";
-static std::string ANIM_EXTENSIONS = "bvh";
+static std::string ANIM_EXTENSIONS = "bvh anim";
#ifdef _CORY_TESTING
static std::string GEOMETRY_EXTENSIONS = "slg";
#endif
@@ -97,6 +191,7 @@ static std::string XML_EXTENSIONS = "xml";
static std::string SLOBJECT_EXTENSIONS = "slobject";
#endif
static std::string ALL_FILE_EXTENSIONS = "*.*";
+static std::string MODEL_EXTENSIONS = "dae";
std::string build_extensions_string(LLFilePicker::ELoadFilter filter)
{
@@ -111,6 +206,8 @@ std::string build_extensions_string(LLFilePicker::ELoadFilter filter)
return ANIM_EXTENSIONS;
case LLFilePicker::FFLOAD_SLOBJECT:
return SLOBJECT_EXTENSIONS;
+ case LLFilePicker::FFLOAD_MODEL:
+ return MODEL_EXTENSIONS;
#ifdef _CORY_TESTING
case LLFilePicker::FFLOAD_GEOMETRY:
return GEOMETRY_EXTENSIONS;
@@ -254,6 +351,20 @@ class LLFileUploadImage : public view_listener_t
}
};
+class LLFileUploadModel : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ LLFloaterModelPreview* fmp = (LLFloaterModelPreview*) LLFloaterReg::getInstance("upload_model");
+ if (fmp)
+ {
+ fmp->loadModel(3);
+ }
+
+ return TRUE;
+ }
+};
+
class LLFileUploadSound : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
@@ -274,7 +385,14 @@ class LLFileUploadAnim : public view_listener_t
const std::string filename = upload_pick((void*)LLFilePicker::FFLOAD_ANIM);
if (!filename.empty())
{
- LLFloaterReg::showInstance("upload_anim", LLSD(filename));
+ if (filename.rfind(".anim") != std::string::npos)
+ {
+ LLFloaterReg::showInstance("upload_anim_anim", LLSD(filename));
+ }
+ else
+ {
+ LLFloaterReg::showInstance("upload_anim_bvh", LLSD(filename));
+ }
}
return true;
}
@@ -315,10 +433,21 @@ class LLFileUploadBulk : public view_listener_t
LLAssetStorage::LLStoreAssetCallback callback = NULL;
S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload();
void *userdata = NULL;
- upload_new_resource(filename, asset_name, asset_name, 0, LLFolderType::FT_NONE, LLInventoryType::IT_NONE,
- LLFloaterPerms::getNextOwnerPerms(), LLFloaterPerms::getGroupPerms(), LLFloaterPerms::getEveryonePerms(),
- display_name,
- callback, expected_upload_cost, userdata);
+
+ upload_new_resource(
+ filename,
+ asset_name,
+ asset_name,
+ 0,
+ LLFolderType::FT_NONE,
+ LLInventoryType::IT_NONE,
+ LLFloaterPerms::getNextOwnerPerms(),
+ LLFloaterPerms::getGroupPerms(),
+ LLFloaterPerms::getEveryonePerms(),
+ display_name,
+ callback,
+ expected_upload_cost,
+ userdata);
// *NOTE: Ew, we don't iterate over the file list here,
// we handle the next files in upload_done_callback()
@@ -404,23 +533,23 @@ class LLFileTakeSnapshotToDisk : public view_listener_t
gSavedSettings.getBOOL("RenderUIInSnapshot"),
FALSE))
{
+ gViewerWindow->playSnapshotAnimAndSound();
LLPointer<LLImageFormatted> formatted;
- switch(LLFloaterSnapshot::ESnapshotFormat(gSavedSettings.getS32("SnapshotFormat")))
+ LLFloaterSnapshot::ESnapshotFormat fmt = (LLFloaterSnapshot::ESnapshotFormat) gSavedSettings.getS32("SnapshotFormat");
+ switch (fmt)
{
- case LLFloaterSnapshot::SNAPSHOT_FORMAT_JPEG:
+ case LLFloaterSnapshot::SNAPSHOT_FORMAT_JPEG:
formatted = new LLImageJPEG(gSavedSettings.getS32("SnapshotQuality"));
break;
- case LLFloaterSnapshot::SNAPSHOT_FORMAT_PNG:
+ default:
+ llwarns << "Unknown local snapshot format: " << fmt << llendl;
+ case LLFloaterSnapshot::SNAPSHOT_FORMAT_PNG:
formatted = new LLImagePNG;
break;
- case LLFloaterSnapshot::SNAPSHOT_FORMAT_BMP:
+ case LLFloaterSnapshot::SNAPSHOT_FORMAT_BMP:
formatted = new LLImageBMP;
break;
- default:
- llwarns << "Unknown Local Snapshot format" << llendl;
- return true;
}
-
formatted->enableOverSize() ;
formatted->encode(raw, 0);
formatted->disableOverSize() ;
@@ -471,17 +600,20 @@ void handle_compress_image(void*)
}
}
-void upload_new_resource(const std::string& src_filename, std::string name,
- std::string desc, S32 compression_info,
- LLFolderType::EType destination_folder_type,
- LLInventoryType::EType inv_type,
- U32 next_owner_perms,
- U32 group_perms,
- U32 everyone_perms,
- const std::string& display_name,
- LLAssetStorage::LLStoreAssetCallback callback,
- S32 expected_upload_cost,
- void *userdata)
+LLUUID upload_new_resource(
+ const std::string& src_filename,
+ std::string name,
+ std::string desc,
+ S32 compression_info,
+ LLFolderType::EType destination_folder_type,
+ LLInventoryType::EType inv_type,
+ U32 next_owner_perms,
+ U32 group_perms,
+ U32 everyone_perms,
+ const std::string& display_name,
+ LLAssetStorage::LLStoreAssetCallback callback,
+ S32 expected_upload_cost,
+ void *userdata)
{
// Generate the temporary UUID.
std::string filename = gDirUtilp->getTempFilename();
@@ -491,6 +623,7 @@ void upload_new_resource(const std::string& src_filename, std::string name,
LLSD args;
std::string exten = gDirUtilp->getExtension(src_filename);
+ U32 codec = LLImageBase::getCodecFromExtension(exten);
LLAssetType::EType asset_type = LLAssetType::AT_NONE;
std::string error_message;
@@ -505,69 +638,23 @@ void upload_new_resource(const std::string& src_filename, std::string name,
"No file extension for the file: '%s'\nPlease make sure the file has a correct file extension",
short_name.c_str());
args["FILE"] = short_name;
- upload_error(error_message, "NofileExtension", filename, args);
- return;
+ upload_error(error_message, "NoFileExtension", filename, args);
+ return LLUUID();
}
- else if( exten == "bmp")
+ else if (codec != IMG_CODEC_INVALID)
{
+ // It's an image file, the upload procedure is the same for all
asset_type = LLAssetType::AT_TEXTURE;
- if (!LLViewerTextureList::createUploadFile(src_filename,
- filename,
- IMG_CODEC_BMP ))
+ if (!LLViewerTextureList::createUploadFile(src_filename, filename, codec ))
{
error_message = llformat( "Problem with file %s:\n\n%s\n",
- src_filename.c_str(), LLImage::getLastError().c_str());
+ src_filename.c_str(), LLImage::getLastError().c_str());
args["FILE"] = src_filename;
args["ERROR"] = LLImage::getLastError();
upload_error(error_message, "ProblemWithFile", filename, args);
- return;
+ return LLUUID();
}
}
- else if( exten == "tga")
- {
- asset_type = LLAssetType::AT_TEXTURE;
- if (!LLViewerTextureList::createUploadFile(src_filename,
- filename,
- IMG_CODEC_TGA ))
- {
- error_message = llformat("Problem with file %s:\n\n%s\n",
- src_filename.c_str(), LLImage::getLastError().c_str());
- args["FILE"] = src_filename;
- args["ERROR"] = LLImage::getLastError();
- upload_error(error_message, "ProblemWithFile", filename, args);
- return;
- }
- }
- else if( exten == "jpg" || exten == "jpeg")
- {
- asset_type = LLAssetType::AT_TEXTURE;
- if (!LLViewerTextureList::createUploadFile(src_filename,
- filename,
- IMG_CODEC_JPEG ))
- {
- error_message = llformat("Problem with file %s:\n\n%s\n",
- src_filename.c_str(), LLImage::getLastError().c_str());
- args["FILE"] = src_filename;
- args["ERROR"] = LLImage::getLastError();
- upload_error(error_message, "ProblemWithFile", filename, args);
- return;
- }
- }
- else if( exten == "png")
- {
- asset_type = LLAssetType::AT_TEXTURE;
- if (!LLViewerTextureList::createUploadFile(src_filename,
- filename,
- IMG_CODEC_PNG ))
- {
- error_message = llformat("Problem with file %s:\n\n%s\n",
- src_filename.c_str(), LLImage::getLastError().c_str());
- args["FILE"] = src_filename;
- args["ERROR"] = LLImage::getLastError();
- upload_error(error_message, "ProblemWithFile", filename, args);
- return;
- }
- }
else if(exten == "wav")
{
asset_type = LLAssetType::AT_SOUND; // tag it as audio
@@ -593,7 +680,7 @@ void upload_new_resource(const std::string& src_filename, std::string name,
upload_error(error_message, "UnknownVorbisEncodeFailure", filename, args);
break;
}
- return;
+ return LLUUID();
}
}
else if(exten == "tmp")
@@ -633,7 +720,7 @@ void upload_new_resource(const std::string& src_filename, std::string name,
error_message = llformat("corrupt resource file: %s", src_filename.c_str());
args["FILE"] = src_filename;
upload_error(error_message, "CorruptResourceFile", filename, args);
- return;
+ return LLUUID();
}
if (2 == tokens_read)
@@ -661,7 +748,7 @@ void upload_new_resource(const std::string& src_filename, std::string name,
error_message = llformat("unknown linden resource file version in file: %s", src_filename.c_str());
args["FILE"] = src_filename;
upload_error(error_message, "UnknownResourceFileVersion", filename, args);
- return;
+ return LLUUID();
}
}
else
@@ -703,7 +790,7 @@ void upload_new_resource(const std::string& src_filename, std::string name,
error_message = llformat( "Unable to create output file: %s", filename.c_str());
args["FILE"] = filename;
upload_error(error_message, "UnableToCreateOutputFile", filename, args);
- return;
+ return LLUUID();
}
fclose(in);
@@ -717,7 +804,12 @@ void upload_new_resource(const std::string& src_filename, std::string name,
{
error_message = llformat("We do not currently support bulk upload of animation files\n");
upload_error(error_message, "DoNotSupportBulkAnimationUpload", filename, args);
- return;
+ return LLUUID();
+ }
+ else if (exten == "anim")
+ {
+ asset_type = LLAssetType::AT_ANIMATION;
+ filename = src_filename;
}
else
{
@@ -763,9 +855,21 @@ void upload_new_resource(const std::string& src_filename, std::string name,
{
t_disp_name = src_filename;
}
- upload_new_resource(tid, asset_type, name, desc, compression_info, // tid
- destination_folder_type, inv_type, next_owner_perms, group_perms, everyone_perms,
- display_name, callback, expected_upload_cost, userdata);
+ upload_new_resource(
+ tid,
+ asset_type,
+ name,
+ desc,
+ compression_info, // tid
+ destination_folder_type,
+ inv_type,
+ next_owner_perms,
+ group_perms,
+ everyone_perms,
+ display_name,
+ callback,
+ expected_upload_cost,
+ userdata);
}
else
{
@@ -779,9 +883,15 @@ void upload_new_resource(const std::string& src_filename, std::string name,
}
LLFilePicker::instance().reset();
}
+
+ return uuid;
}
-void upload_done_callback(const LLUUID& uuid, void* user_data, S32 result, LLExtStat ext_status) // StoreAssetData callback (fixed)
+void upload_done_callback(
+ const LLUUID& uuid,
+ void* user_data,
+ S32 result,
+ LLExtStat ext_status) // StoreAssetData callback (fixed)
{
LLResourceData* data = (LLResourceData*)user_data;
S32 expected_upload_cost = data ? data->mExpectedUploadCost : 0;
@@ -865,11 +975,12 @@ void upload_done_callback(const LLUUID& uuid, void* user_data, S32 result, LLExt
args["REASON"] = std::string(LLAssetStorage::getErrorString(result));
LLNotificationsUtil::add("CannotUploadReason", args);
}
+
+ delete data;
+ data = NULL;
}
LLUploadDialog::modalUploadFinished();
- delete data;
- data = NULL;
// *NOTE: This is a pretty big hack. What this does is check the
// file picker if there are any more pending uploads. If so,
@@ -886,35 +997,102 @@ void upload_done_callback(const LLUUID& uuid, void* user_data, S32 result, LLExt
std::string display_name = LLStringUtil::null;
LLAssetStorage::LLStoreAssetCallback callback = NULL;
void *userdata = NULL;
- upload_new_resource(next_file, asset_name, asset_name, // file
- 0, LLFolderType::FT_NONE, LLInventoryType::IT_NONE,
- PERM_NONE, PERM_NONE, PERM_NONE,
- display_name,
- callback,
- expected_upload_cost, // assuming next in a group of uploads is of roughly the same type, i.e. same upload cost
- userdata);
+ upload_new_resource(
+ next_file,
+ asset_name,
+ asset_name, // file
+ 0,
+ LLFolderType::FT_NONE,
+ LLInventoryType::IT_NONE,
+ PERM_NONE,
+ PERM_NONE,
+ PERM_NONE,
+ display_name,
+ callback,
+ expected_upload_cost, // assuming next in a group of uploads is of roughly the same type, i.e. same upload cost
+ userdata);
}
}
-void upload_new_resource(const LLTransactionID &tid, LLAssetType::EType asset_type,
- std::string name,
- std::string desc, S32 compression_info,
- LLFolderType::EType destination_folder_type,
- LLInventoryType::EType inv_type,
- U32 next_owner_perms,
- U32 group_perms,
- U32 everyone_perms,
- const std::string& display_name,
- LLAssetStorage::LLStoreAssetCallback callback,
- S32 expected_upload_cost,
- void *userdata)
+static LLAssetID upload_new_resource_prep(
+ const LLTransactionID& tid,
+ LLAssetType::EType asset_type,
+ LLInventoryType::EType& inventory_type,
+ std::string& name,
+ const std::string& display_name,
+ std::string& description)
+{
+ LLAssetID uuid = generate_asset_id_for_new_upload(tid);
+
+ increase_new_upload_stats(asset_type);
+
+ assign_defaults_and_show_upload_message(
+ asset_type,
+ inventory_type,
+ name,
+ display_name,
+ description);
+
+ return uuid;
+}
+
+LLSD generate_new_resource_upload_capability_body(
+ LLAssetType::EType asset_type,
+ const std::string& name,
+ const std::string& desc,
+ LLFolderType::EType destination_folder_type,
+ LLInventoryType::EType inv_type,
+ U32 next_owner_perms,
+ U32 group_perms,
+ U32 everyone_perms)
+{
+ LLSD body;
+
+ body["folder_id"] = gInventory.findCategoryUUIDForType(
+ (destination_folder_type == LLFolderType::FT_NONE) ?
+ (LLFolderType::EType) asset_type :
+ destination_folder_type);
+
+ body["asset_type"] = LLAssetType::lookup(asset_type);
+ body["inventory_type"] = LLInventoryType::lookup(inv_type);
+ body["name"] = name;
+ body["description"] = desc;
+ body["next_owner_mask"] = LLSD::Integer(next_owner_perms);
+ body["group_mask"] = LLSD::Integer(group_perms);
+ body["everyone_mask"] = LLSD::Integer(everyone_perms);
+
+ return body;
+}
+
+void upload_new_resource(
+ const LLTransactionID &tid,
+ LLAssetType::EType asset_type,
+ std::string name,
+ std::string desc,
+ S32 compression_info,
+ LLFolderType::EType destination_folder_type,
+ LLInventoryType::EType inv_type,
+ U32 next_owner_perms,
+ U32 group_perms,
+ U32 everyone_perms,
+ const std::string& display_name,
+ LLAssetStorage::LLStoreAssetCallback callback,
+ S32 expected_upload_cost,
+ void *userdata)
{
if(gDisconnected)
{
return ;
}
-
- LLAssetID uuid = tid.makeAssetID(gAgent.getSecureSessionID());
+
+ LLAssetID uuid =
+ upload_new_resource_prep(
+ tid,
+ asset_type,
+ inv_type,
+ name,
+ display_name,
+ desc);
if( LLAssetType::AT_SOUND == asset_type )
{
@@ -959,26 +1137,32 @@ void upload_new_resource(const LLTransactionID &tid, LLAssetType::EType asset_ty
llinfos << "Expected Upload Cost: " << expected_upload_cost << llendl;
lldebugs << "Folder: " << gInventory.findCategoryUUIDForType((destination_folder_type == LLFolderType::FT_NONE) ? LLFolderType::assetTypeToFolderType(asset_type) : destination_folder_type) << llendl;
lldebugs << "Asset Type: " << LLAssetType::lookup(asset_type) << llendl;
- std::string url = gAgent.getRegion()->getCapability("NewFileAgentInventory");
- if (!url.empty())
+
+ std::string url = gAgent.getRegion()->getCapability(
+ "NewFileAgentInventory");
+
+ if ( !url.empty() )
{
llinfos << "New Agent Inventory via capability" << llendl;
- LLSD body;
- body["folder_id"] = gInventory.findCategoryUUIDForType((destination_folder_type == LLFolderType::FT_NONE) ? LLFolderType::assetTypeToFolderType(asset_type) : destination_folder_type);
- body["asset_type"] = LLAssetType::lookup(asset_type);
- body["inventory_type"] = LLInventoryType::lookup(inv_type);
- body["name"] = name;
- body["description"] = desc;
- body["next_owner_mask"] = LLSD::Integer(next_owner_perms);
- body["group_mask"] = LLSD::Integer(group_perms);
- body["everyone_mask"] = LLSD::Integer(everyone_perms);
- body["expected_upload_cost"] = LLSD::Integer(expected_upload_cost);
-
- //std::ostringstream llsdxml;
- //LLSDSerialize::toPrettyXML(body, llsdxml);
- //llinfos << "posting body to capability: " << llsdxml.str() << llendl;
- LLHTTPClient::post(url, body, new LLNewAgentInventoryResponder(body, uuid, asset_type));
+ LLSD body;
+ body = generate_new_resource_upload_capability_body(
+ asset_type,
+ name,
+ desc,
+ destination_folder_type,
+ inv_type,
+ next_owner_perms,
+ group_perms,
+ everyone_perms);
+
+ LLHTTPClient::post(
+ url,
+ body,
+ new LLNewAgentInventoryResponder(
+ body,
+ uuid,
+ asset_type));
}
else
{
@@ -992,10 +1176,10 @@ void upload_new_resource(const LLTransactionID &tid, LLAssetType::EType asset_ty
S32 balance = gStatusBar->getBalance();
if (balance < expected_upload_cost)
{
+ // insufficient funds, bail on this upload
LLStringUtil::format_map_t args;
args["NAME"] = name;
args["AMOUNT"] = llformat("%d", expected_upload_cost);
- // insufficient funds, bail on this upload
LLBuyCurrencyHTML::openCurrencyFloater( LLTrans::getString("UploadingCosts", args), expected_upload_cost );
return;
}
@@ -1019,18 +1203,85 @@ void upload_new_resource(const LLTransactionID &tid, LLAssetType::EType asset_ty
{
asset_callback = callback;
}
- gAssetStorage->storeAssetData(data->mAssetInfo.mTransactionID, data->mAssetInfo.mType,
- asset_callback,
- (void*)data,
- FALSE);
+ gAssetStorage->storeAssetData(
+ data->mAssetInfo.mTransactionID,
+ data->mAssetInfo.mType,
+ asset_callback,
+ (void*)data,
+ FALSE);
}
}
+LLAssetID generate_asset_id_for_new_upload(const LLTransactionID& tid)
+{
+ if ( gDisconnected )
+ {
+ LLAssetID rv;
+
+ rv.setNull();
+ return rv;
+ }
+
+ LLAssetID uuid = tid.makeAssetID(gAgent.getSecureSessionID());
+
+ return uuid;
+}
+
+void increase_new_upload_stats(LLAssetType::EType asset_type)
+{
+ if ( LLAssetType::AT_SOUND == asset_type )
+ {
+ LLViewerStats::getInstance()->incStat(
+ LLViewerStats::ST_UPLOAD_SOUND_COUNT );
+ }
+ else if ( LLAssetType::AT_TEXTURE == asset_type )
+ {
+ LLViewerStats::getInstance()->incStat(
+ LLViewerStats::ST_UPLOAD_TEXTURE_COUNT );
+ }
+ else if ( LLAssetType::AT_ANIMATION == asset_type )
+ {
+ LLViewerStats::getInstance()->incStat(
+ LLViewerStats::ST_UPLOAD_ANIM_COUNT );
+ }
+}
+
+void assign_defaults_and_show_upload_message(
+ LLAssetType::EType asset_type,
+ LLInventoryType::EType& inventory_type,
+ std::string& name,
+ const std::string& display_name,
+ std::string& description)
+{
+ if ( LLInventoryType::IT_NONE == inventory_type )
+ {
+ inventory_type = LLInventoryType::defaultForAssetType(asset_type);
+ }
+ LLStringUtil::stripNonprintable(name);
+ LLStringUtil::stripNonprintable(description);
+
+ if ( name.empty() )
+ {
+ name = "(No Name)";
+ }
+ if ( description.empty() )
+ {
+ description = "(No Description)";
+ }
+
+ // At this point, we're ready for the upload.
+ std::string upload_message = "Uploading...\n\n";
+ upload_message.append(display_name);
+ LLUploadDialog::modalUploadDialog(upload_message);
+}
+
+
void init_menu_file()
{
view_listener_t::addCommit(new LLFileUploadImage(), "File.UploadImage");
view_listener_t::addCommit(new LLFileUploadSound(), "File.UploadSound");
view_listener_t::addCommit(new LLFileUploadAnim(), "File.UploadAnim");
+ view_listener_t::addCommit(new LLFileUploadModel(), "File.UploadModel");
view_listener_t::addCommit(new LLFileUploadBulk(), "File.UploadBulk");
view_listener_t::addCommit(new LLFileCloseWindow(), "File.CloseWindow");
view_listener_t::addCommit(new LLFileCloseAllWindows(), "File.CloseAllWindows");
@@ -1040,6 +1291,9 @@ void init_menu_file()
view_listener_t::addCommit(new LLFileQuit(), "File.Quit");
view_listener_t::addEnable(new LLFileEnableUpload(), "File.EnableUpload");
-
+ view_listener_t::addEnable(new LLFileEnableUploadModel(), "File.EnableUploadModel");
+ view_listener_t::addMenu(new LLMeshEnabled(), "File.MeshEnabled");
+ view_listener_t::addMenu(new LLMeshUploadVisible(), "File.VisibleUploadModel");
+
// "File.SaveTexture" moved to llpanelmaininventory so that it can be properly handled.
}
diff --git a/indra/newview/llviewermenufile.h b/indra/newview/llviewermenufile.h
index 56b9e19049..3136358b83 100644
--- a/indra/newview/llviewermenufile.h
+++ b/indra/newview/llviewermenufile.h
@@ -30,39 +30,101 @@
#include "llfoldertype.h"
#include "llassetstorage.h"
#include "llinventorytype.h"
+#include "llfilepicker.h"
class LLTransactionID;
void init_menu_file();
-void upload_new_resource(const std::string& src_filename,
- std::string name,
- std::string desc,
- S32 compression_info,
- LLFolderType::EType destination_folder_type,
- LLInventoryType::EType inv_type,
- U32 next_owner_perms,
- U32 group_perms,
- U32 everyone_perms,
- const std::string& display_name,
- LLAssetStorage::LLStoreAssetCallback callback,
- S32 expected_upload_cost,
- void *userdata);
-
-void upload_new_resource(const LLTransactionID &tid,
- LLAssetType::EType type,
- std::string name,
- std::string desc,
- S32 compression_info,
- LLFolderType::EType destination_folder_type,
- LLInventoryType::EType inv_type,
- U32 next_owner_perms,
- U32 group_perms,
- U32 everyone_perms,
- const std::string& display_name,
- LLAssetStorage::LLStoreAssetCallback callback,
- S32 expected_upload_cost,
- void *userdata);
+LLUUID upload_new_resource(
+ const std::string& src_filename,
+ std::string name,
+ std::string desc,
+ S32 compression_info,
+ LLFolderType::EType destination_folder_type,
+ LLInventoryType::EType inv_type,
+ U32 next_owner_perms,
+ U32 group_perms,
+ U32 everyone_perms,
+ const std::string& display_name,
+ LLAssetStorage::LLStoreAssetCallback callback,
+ S32 expected_upload_cost,
+ void *userdata);
+
+void upload_new_resource(
+ const LLTransactionID &tid,
+ LLAssetType::EType type,
+ std::string name,
+ std::string desc,
+ S32 compression_info,
+ LLFolderType::EType destination_folder_type,
+ LLInventoryType::EType inv_type,
+ U32 next_owner_perms,
+ U32 group_perms,
+ U32 everyone_perms,
+ const std::string& display_name,
+ LLAssetStorage::LLStoreAssetCallback callback,
+ S32 expected_upload_cost,
+ void *userdata);
+
+
+LLAssetID generate_asset_id_for_new_upload(const LLTransactionID& tid);
+void increase_new_upload_stats(LLAssetType::EType asset_type);
+void assign_defaults_and_show_upload_message(
+ LLAssetType::EType asset_type,
+ LLInventoryType::EType& inventory_type,
+ std::string& name,
+ const std::string& display_name,
+ std::string& description);
+
+LLSD generate_new_resource_upload_capability_body(
+ LLAssetType::EType asset_type,
+ const std::string& name,
+ const std::string& desc,
+ LLFolderType::EType destination_folder_type,
+ LLInventoryType::EType inv_type,
+ U32 next_owner_perms,
+ U32 group_perms,
+ U32 everyone_perms);
+
+void on_new_single_inventory_upload_complete(
+ LLAssetType::EType asset_type,
+ LLInventoryType::EType inventory_type,
+ const std::string inventory_type_string,
+ const LLUUID& item_folder_id,
+ const std::string& item_name,
+ const std::string& item_description,
+ const LLSD& server_response,
+ S32 upload_price);
+
+class LLFilePickerThread : public LLThread
+{ //multi-threaded file picker (runs system specific file picker in background and calls "notify" from main thread)
+public:
+
+ static std::queue<LLFilePickerThread*> sDeadQ;
+ static LLMutex* sMutex;
+
+ static void initClass();
+ static void cleanupClass();
+ static void clearDead();
+
+ std::string mFile;
+
+ LLFilePicker::ELoadFilter mFilter;
+
+ LLFilePickerThread(LLFilePicker::ELoadFilter filter)
+ : LLThread("file picker"), mFilter(filter)
+ {
+
+ }
+
+ void getFile();
+
+ virtual void run();
+
+ virtual void notify(const std::string& filename) = 0;
+};
+
#endif
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 5cbd5ffa0b..854e2bea52 100644..100755
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -37,6 +37,7 @@
#include "lleconomy.h"
#include "lleventtimer.h"
#include "llfloaterreg.h"
+#include "llfolderview.h"
#include "llfollowcamparams.h"
#include "llinventorydefines.h"
#include "lllslconstants.h"
@@ -58,8 +59,9 @@
#include "llfloaterland.h"
#include "llfloaterregioninfo.h"
#include "llfloaterlandholdings.h"
-#include "llfloaterpostcard.h"
#include "llfloaterpreference.h"
+#include "llfloatersidepanelcontainer.h"
+#include "llfloatersnapshot.h"
#include "llhudeffecttrail.h"
#include "llhudmanager.h"
#include "llinventoryfunctions.h"
@@ -72,7 +74,6 @@
#include "llrecentpeople.h"
#include "llscriptfloater.h"
#include "llselectmgr.h"
-#include "llsidetray.h"
#include "llstartup.h"
#include "llsky.h"
#include "llslurl.h"
@@ -87,6 +88,7 @@
#include "lluri.h"
#include "llviewergenericmessage.h"
#include "llviewermenu.h"
+#include "llviewerinventory.h"
#include "llviewerjoystick.h"
#include "llviewerobjectlist.h"
#include "llviewerparcelmgr.h"
@@ -96,7 +98,6 @@
#include "llviewerwindow.h"
#include "llvlmanager.h"
#include "llvoavatarself.h"
-#include "llvotextbubble.h"
#include "llworld.h"
#include "pipeline.h"
#include "llfloaterworldmap.h"
@@ -122,6 +123,7 @@
//
const F32 BIRD_AUDIBLE_RADIUS = 32.0f;
const F32 SIT_DISTANCE_FROM_TARGET = 0.25f;
+const F32 CAMERA_POSITION_THRESHOLD_SQUARED = 0.001f * 0.001f;
static const F32 LOGOUT_REPLY_TIME = 3.f; // Wait this long after LogoutReply before quitting.
// Determine how quickly residents' scripts can issue question dialogs
@@ -133,6 +135,7 @@ extern BOOL gDebugClicks;
// function prototypes
bool check_offer_throttle(const std::string& from_name, bool check_only);
+bool check_asset_previewable(const LLAssetType::EType asset_type);
static void process_money_balance_reply_extended(LLMessageSystem* msg);
//inventory offer throttle globals
@@ -153,7 +156,8 @@ const std::string SCRIPT_QUESTIONS[SCRIPT_PERMISSION_EOF] =
"AddAndRemoveJoints",
"ChangePermissions",
"TrackYourCamera",
- "ControlYourCamera"
+ "ControlYourCamera",
+ "TeleportYourAgent"
};
const BOOL SCRIPT_QUESTION_IS_CAUTION[SCRIPT_PERMISSION_EOF] =
@@ -168,7 +172,8 @@ const BOOL SCRIPT_QUESTION_IS_CAUTION[SCRIPT_PERMISSION_EOF] =
FALSE, // AddAndRemoveJoints
FALSE, // ChangePermissions
FALSE, // TrackYourCamera,
- FALSE // ControlYourCamera
+ FALSE, // ControlYourCamera
+ FALSE // TeleportYourAgent
};
bool friendship_offer_callback(const LLSD& notification, const LLSD& response)
@@ -343,12 +348,11 @@ void process_layer_data(LLMessageSystem *mesgsys, void **user_data)
{
LLViewerRegion *regionp = LLWorld::getInstance()->getRegion(mesgsys->getSender());
- if (!regionp || gNoRender)
+ if(!regionp)
{
+ llwarns << "Invalid region for layer data." << llendl;
return;
}
-
-
S32 size;
S8 type;
@@ -695,7 +699,7 @@ bool join_group_response(const LLSD& notification, const LLSD& response)
return false;
}
-static void highlight_inventory_items_in_panel(const std::vector<LLUUID>& items, LLInventoryPanel *inventory_panel)
+static void highlight_inventory_objects_in_panel(const std::vector<LLUUID>& items, LLInventoryPanel *inventory_panel)
{
if (NULL == inventory_panel) return;
@@ -709,7 +713,7 @@ static void highlight_inventory_items_in_panel(const std::vector<LLUUID>& items,
continue;
}
- LLInventoryItem* item = gInventory.getItem(item_id);
+ LLInventoryObject* item = gInventory.getObject(item_id);
llassert(item);
if (!item) {
continue;
@@ -788,7 +792,6 @@ class LLViewerInventoryMoveFromWorldObserver : public LLInventoryAddItemByAssetO
public:
LLViewerInventoryMoveFromWorldObserver()
: LLInventoryAddItemByAssetObserver()
- , mActivePanel(NULL)
{
}
@@ -799,13 +802,16 @@ private:
/*virtual */void onAssetAdded(const LLUUID& asset_id)
{
// Store active Inventory panel.
- mActivePanel = LLInventoryPanel::getActiveInventoryPanel();
+ if (LLInventoryPanel::getActiveInventoryPanel())
+ {
+ mActivePanel = LLInventoryPanel::getActiveInventoryPanel()->getHandle();
+ }
// Store selected items (without destination folder)
mSelectedItems.clear();
- if (mActivePanel)
+ if (LLInventoryPanel::getActiveInventoryPanel())
{
- mSelectedItems = mActivePanel->getRootFolder()->getSelectionList();
+ mSelectedItems = LLInventoryPanel::getActiveInventoryPanel()->getRootFolder()->getSelectionList();
}
mSelectedItems.erase(mMoveIntoFolderID);
}
@@ -816,12 +822,14 @@ private:
*/
void done()
{
+ LLInventoryPanel* active_panel = dynamic_cast<LLInventoryPanel*>(mActivePanel.get());
+
// if selection is not changed since watch started lets hightlight new items.
- if (mActivePanel && !isSelectionChanged())
+ if (active_panel && !isSelectionChanged())
{
LL_DEBUGS("Inventory_Move") << "Selecting new items..." << LL_ENDL;
- mActivePanel->clearSelection();
- highlight_inventory_items_in_panel(mAddedItems, mActivePanel);
+ active_panel->clearSelection();
+ highlight_inventory_objects_in_panel(mAddedItems, active_panel);
}
}
@@ -829,16 +837,16 @@ private:
* Returns true if selected inventory items were changed since moved inventory items were started to watch.
*/
bool isSelectionChanged()
- {
- const LLInventoryPanel * const current_active_panel = LLInventoryPanel::getActiveInventoryPanel();
+ {
+ LLInventoryPanel* active_panel = dynamic_cast<LLInventoryPanel*>(mActivePanel.get());
- if (NULL == mActivePanel || current_active_panel != mActivePanel)
+ if (NULL == active_panel)
{
return true;
}
// get selected items (without destination folder)
- selected_items_t selected_items = mActivePanel->getRootFolder()->getSelectionList();
+ selected_items_t selected_items = active_panel->getRootFolder()->getSelectionList();
selected_items.erase(mMoveIntoFolderID);
// compare stored & current sets of selected items
@@ -852,7 +860,7 @@ private:
return different_items.size() > 0;
}
- LLInventoryPanel *mActivePanel;
+ LLHandle<LLPanel> mActivePanel;
typedef std::set<LLUUID> selected_items_t;
selected_items_t mSelectedItems;
@@ -881,6 +889,75 @@ void set_dad_inventory_item(LLInventoryItem* inv_item, const LLUUID& into_folder
gInventoryMoveObserver->watchAsset(inv_item->getAssetUUID());
}
+
+/**
+ * Class to observe moving of items and to select them in inventory.
+ *
+ * Used currently for dragging from inbox to regular inventory folders
+ */
+
+class LLViewerInventoryMoveObserver : public LLInventoryObserver
+{
+public:
+
+ LLViewerInventoryMoveObserver(const LLUUID& object_id)
+ : LLInventoryObserver()
+ , mObjectID(object_id)
+ {
+ if (LLInventoryPanel::getActiveInventoryPanel())
+ {
+ mActivePanel = LLInventoryPanel::getActiveInventoryPanel()->getHandle();
+ }
+ }
+
+ virtual ~LLViewerInventoryMoveObserver() {}
+ virtual void changed(U32 mask);
+
+private:
+ LLUUID mObjectID;
+ LLHandle<LLPanel> mActivePanel;
+
+};
+
+void LLViewerInventoryMoveObserver::changed(U32 mask)
+{
+ LLInventoryPanel* active_panel = dynamic_cast<LLInventoryPanel*>(mActivePanel.get());
+
+ if (NULL == active_panel)
+ {
+ gInventory.removeObserver(this);
+ return;
+ }
+
+ if((mask & (LLInventoryObserver::STRUCTURE)) != 0)
+ {
+ const std::set<LLUUID>& changed_items = gInventory.getChangedIDs();
+
+ std::set<LLUUID>::const_iterator id_it = changed_items.begin();
+ std::set<LLUUID>::const_iterator id_end = changed_items.end();
+ for (;id_it != id_end; ++id_it)
+ {
+ if ((*id_it) == mObjectID)
+ {
+ active_panel->clearSelection();
+ std::vector<LLUUID> items;
+ items.push_back(mObjectID);
+ highlight_inventory_objects_in_panel(items, active_panel);
+ active_panel->getRootFolder()->scrollToShowSelection();
+
+ gInventory.removeObserver(this);
+ break;
+ }
+ }
+ }
+}
+
+void set_dad_inbox_object(const LLUUID& object_id)
+{
+ LLViewerInventoryMoveObserver* move_observer = new LLViewerInventoryMoveObserver(object_id);
+ gInventory.addObserver(move_observer);
+}
+
//unlike the FetchObserver for AgentOffer, we only make one
//instance of the AddedObserver for TaskOffers
//and it never dies. We do this because we don't know the UUID of
@@ -937,7 +1014,6 @@ protected:
//one global instance to bind them
LLOpenTaskOffer* gNewInventoryObserver=NULL;
-
class LLNewInventoryHintObserver : public LLInventoryAddedObserver
{
protected:
@@ -947,6 +1023,8 @@ protected:
}
};
+LLNewInventoryHintObserver* gNewInventoryHintObserver=NULL;
+
void start_new_inventory_observer()
{
if (!gNewInventoryObserver) //task offer observer
@@ -963,54 +1041,39 @@ void start_new_inventory_observer()
gInventory.addObserver(gInventoryMoveObserver);
}
- gInventory.addObserver(new LLNewInventoryHintObserver());
+ if (!gNewInventoryHintObserver)
+ {
+ // Observer is deleted by gInventory
+ gNewInventoryHintObserver = new LLNewInventoryHintObserver();
+ gInventory.addObserver(gNewInventoryHintObserver);
+ }
}
class LLDiscardAgentOffer : public LLInventoryFetchItemsObserver
{
LOG_CLASS(LLDiscardAgentOffer);
+
public:
LLDiscardAgentOffer(const LLUUID& folder_id, const LLUUID& object_id) :
LLInventoryFetchItemsObserver(object_id),
mFolderID(folder_id),
mObjectID(object_id) {}
- virtual ~LLDiscardAgentOffer() {}
+
virtual void done()
{
LL_DEBUGS("Messaging") << "LLDiscardAgentOffer::done()" << LL_ENDL;
- const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
- bool notify = false;
- if(trash_id.notNull() && mObjectID.notNull())
- {
- LLInventoryModel::update_list_t update;
- LLInventoryModel::LLCategoryUpdate old_folder(mFolderID, -1);
- update.push_back(old_folder);
- LLInventoryModel::LLCategoryUpdate new_folder(trash_id, 1);
- update.push_back(new_folder);
- gInventory.accountForUpdate(update);
- gInventory.moveObject(mObjectID, trash_id);
- LLInventoryObject* obj = gInventory.getObject(mObjectID);
- if(obj)
- {
- // no need to restamp since this is already a freshly
- // stamped item.
- obj->updateParentOnServer(FALSE);
- notify = true;
- }
- }
- else
- {
- LL_WARNS("Messaging") << "DiscardAgentOffer unable to find: "
- << (trash_id.isNull() ? "trash " : "")
- << (mObjectID.isNull() ? "object" : "") << LL_ENDL;
- }
+
+ // We're invoked from LLInventoryModel::notifyObservers().
+ // If we now try to remove the inventory item, it will cause a nested
+ // notifyObservers() call, which won't work.
+ // So defer moving the item to trash until viewer gets idle (in a moment).
+ // Use removeObject() rather than removeItem() because at this level,
+ // the object could be either an item or a folder.
+ LLAppViewer::instance()->addOnIdleCallback(boost::bind(&LLInventoryModel::removeObject, &gInventory, mObjectID));
gInventory.removeObserver(this);
- if(notify)
- {
- gInventory.notifyObservers();
- }
delete this;
}
+
protected:
LLUUID mFolderID;
LLUUID mObjectID;
@@ -1089,7 +1152,18 @@ bool check_offer_throttle(const std::string& from_name, bool check_only)
}
}
}
-
+
+// Return "true" if we have a preview method for that asset type, "false" otherwise
+bool check_asset_previewable(const LLAssetType::EType asset_type)
+{
+ return (asset_type == LLAssetType::AT_NOTECARD) ||
+ (asset_type == LLAssetType::AT_LANDMARK) ||
+ (asset_type == LLAssetType::AT_TEXTURE) ||
+ (asset_type == LLAssetType::AT_ANIMATION) ||
+ (asset_type == LLAssetType::AT_SCRIPT) ||
+ (asset_type == LLAssetType::AT_SOUND);
+}
+
void open_inventory_offer(const uuid_vec_t& objects, const std::string& from_name)
{
for (uuid_vec_t::const_iterator obj_iter = objects.begin();
@@ -1113,7 +1187,7 @@ void open_inventory_offer(const uuid_vec_t& objects, const std::string& from_nam
// Either an inventory item or a category.
const LLInventoryItem* item = dynamic_cast<const LLInventoryItem*>(obj);
- if (item)
+ if (item && check_asset_previewable(asset_type))
{
////////////////////////////////////////////////////////////////////////////////
// Special handling for various types.
@@ -1134,9 +1208,7 @@ void open_inventory_offer(const uuid_vec_t& objects, const std::string& from_nam
LLInventoryCategory* parent_folder = gInventory.getCategory(item->getParentUUID());
if ("inventory_handler" == from_name)
{
- //we have to filter inventory_handler messages to avoid notification displaying
- LLSideTray::getInstance()->showPanel("panel_places",
- LLSD().with("type", "landmark").with("id", item->getUUID()));
+ LLFloaterSidePanelContainer::showPanel("places", LLSD().with("type", "landmark").with("id", item->getUUID()));
}
else if("group_offer" == from_name)
{
@@ -1145,7 +1217,7 @@ void open_inventory_offer(const uuid_vec_t& objects, const std::string& from_nam
LLSD args;
args["type"] = "landmark";
args["id"] = obj_id;
- LLSideTray::getInstance()->showPanel("panel_places", args);
+ LLFloaterSidePanelContainer::showPanel("places", args);
continue;
}
@@ -1190,6 +1262,7 @@ void open_inventory_offer(const uuid_vec_t& objects, const std::string& from_nam
LLFloaterReg::showInstance("preview_sound", LLSD(obj_id), take_focus);
break;
default:
+ LL_DEBUGS("Messaging") << "No preview method for previewable asset type : " << LLAssetType::lookupHumanReadable(asset_type) << LL_ENDL;
break;
}
}
@@ -1199,16 +1272,8 @@ void open_inventory_offer(const uuid_vec_t& objects, const std::string& from_nam
// Highlight item
const BOOL auto_open =
gSavedSettings.getBOOL("ShowInInventory") && // don't open if showininventory is false
- !(asset_type == LLAssetType::AT_CALLINGCARD) && // don't open if it's a calling card
!from_name.empty(); // don't open if it's not from anyone.
- LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel(auto_open);
- if(active_panel)
- {
- LL_DEBUGS("Messaging") << "Highlighting" << obj_id << LL_ENDL;
- LLFocusableElement* focus_ctrl = gFocusMgr.getKeyboardFocus();
- active_panel->setSelection(obj_id, TAKE_FOCUS_NO);
- gFocusMgr.setKeyboardFocus(focus_ctrl);
- }
+ LLInventoryPanel::openInventoryPanelAndSetSelection(auto_open, obj_id);
}
}
@@ -1242,29 +1307,12 @@ bool highlight_offered_object(const LLUUID& obj_id)
void inventory_offer_mute_callback(const LLUUID& blocked_id,
const std::string& full_name,
- bool is_group,
- boost::shared_ptr<LLNotificationResponderInterface> offer_ptr)
+ bool is_group)
{
- LLOfferInfo* offer = dynamic_cast<LLOfferInfo*>(offer_ptr.get());
-
- std::string from_name = full_name;
- LLMute::EType type;
- if (is_group)
- {
- type = LLMute::GROUP;
- }
- else if(offer && offer->mFromObject)
- {
- //we have to block object by name because blocked_id is an id of owner
- type = LLMute::BY_NAME;
- }
- else
- {
- type = LLMute::AGENT;
- }
+ // *NOTE: blocks owner if the offer came from an object
+ LLMute::EType mute_type = is_group ? LLMute::GROUP : LLMute::AGENT;
- // id should be null for BY_NAME mute, see LLMuteList::add for details
- LLMute mute(type == LLMute::BY_NAME ? LLUUID::null : blocked_id, from_name, type);
+ LLMute mute(blocked_id, full_name, mute_type);
if (LLMuteList::getInstance()->add(mute))
{
LLPanelBlockedList::showPanelAndSelect(blocked_id);
@@ -1278,6 +1326,7 @@ void inventory_offer_mute_callback(const LLUUID& blocked_id,
bool matches(const LLNotificationPtr notification) const
{
if(notification->getName() == "ObjectGiveItem"
+ || notification->getName() == "OwnObjectGiveItem"
|| notification->getName() == "UserGiveItem")
{
return (notification->getPayload()["from_id"].asUUID() == blocked_id);
@@ -1416,7 +1465,7 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&
LLChat chat;
std::string log_message;
S32 button = LLNotificationsUtil::getSelectedOption(notification, response);
-
+
LLInventoryObserver* opener = NULL;
LLViewerInventoryCategory* catp = NULL;
catp = (LLViewerInventoryCategory*)gInventory.getCategory(mObjectID);
@@ -1438,7 +1487,7 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&
llassert(notification_ptr != NULL);
if (notification_ptr != NULL)
{
- gCacheName->get(mFromID, mFromGroup, boost::bind(&inventory_offer_mute_callback,_1,_2,_3,notification_ptr->getResponderPtr()));
+ gCacheName->get(mFromID, mFromGroup, boost::bind(&inventory_offer_mute_callback, _1, _2, _3));
}
}
@@ -1448,7 +1497,7 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&
// TODO: when task inventory offers can also be handled the new way, migrate the code that sets these strings here:
from_string = chatHistory_string = mFromName;
- bool busy=FALSE;
+ bool busy = gAgent.getBusy();
switch(button)
{
@@ -1463,15 +1512,18 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&
// This is an offer from an agent. In this case, the back
// end has already copied the items into your inventory,
// so we can fetch it out of our inventory.
- LLOpenAgentOffer* open_agent_offer = new LLOpenAgentOffer(mObjectID, from_string);
- open_agent_offer->startFetch();
- if(catp || (itemp && itemp->isFinished()))
+ if (gSavedSettings.getBOOL("ShowOfferedInventory"))
{
- open_agent_offer->done();
- }
- else
- {
- opener = open_agent_offer;
+ LLOpenAgentOffer* open_agent_offer = new LLOpenAgentOffer(mObjectID, from_string);
+ open_agent_offer->startFetch();
+ if(catp || (itemp && itemp->isFinished()))
+ {
+ open_agent_offer->done();
+ }
+ else
+ {
+ opener = open_agent_offer;
+ }
}
}
break;
@@ -1500,13 +1552,10 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&
log_message = chatHistory_string + " " + LLTrans::getString("InvOfferGaveYou") + " " + mDesc + LLTrans::getString(".");
LLSD args;
args["MESSAGE"] = log_message;
- LLNotificationsUtil::add("SystemMessage", args);
+ LLNotificationsUtil::add("SystemMessageTip", args);
}
break;
- case IOR_BUSY:
- //Busy falls through to decline. Says to make busy message.
- busy=TRUE;
case IOR_MUTE:
// MUTE falls through to decline
case IOR_DECLINE:
@@ -1583,7 +1632,7 @@ bool LLOfferInfo::inventory_task_offer_callback(const LLSD& notification, const
llassert(notification_ptr != NULL);
if (notification_ptr != NULL)
{
- gCacheName->get(mFromID, mFromGroup, boost::bind(&inventory_offer_mute_callback,_1,_2,_3,notification_ptr->getResponderPtr()));
+ gCacheName->get(mFromID, mFromGroup, boost::bind(&inventory_offer_mute_callback, _1, _2, _3));
}
}
@@ -1652,7 +1701,7 @@ bool LLOfferInfo::inventory_task_offer_callback(const LLSD& notification, const
from_string = chatHistory_string = mFromName;
}
- bool busy=FALSE;
+ bool busy = gAgent.getBusy();
switch(button)
{
@@ -1674,7 +1723,7 @@ bool LLOfferInfo::inventory_task_offer_callback(const LLSD& notification, const
log_message = chatHistory_string + " " + LLTrans::getString("InvOfferGaveYou") + " " + mDesc + LLTrans::getString(".");
LLSD args;
args["MESSAGE"] = log_message;
- LLNotificationsUtil::add("SystemMessage", args);
+ LLNotificationsUtil::add("SystemMessageTip", args);
}
// we will want to open this item when it comes back.
@@ -1698,9 +1747,6 @@ bool LLOfferInfo::inventory_task_offer_callback(const LLSD& notification, const
} // end switch (mIM)
break;
- case IOR_BUSY:
- //Busy falls through to decline. Says to make busy message.
- busy=TRUE;
case IOR_MUTE:
// MUTE falls through to decline
case IOR_DECLINE:
@@ -1715,15 +1761,18 @@ bool LLOfferInfo::inventory_task_offer_callback(const LLSD& notification, const
msg->addBinaryDataFast(_PREHASH_BinaryBucket, EMPTY_BINARY_BUCKET, EMPTY_BINARY_BUCKET_SIZE);
// send the message
msg->sendReliable(mHost);
+
+ if (gSavedSettings.getBOOL("LogInventoryDecline"))
{
LLStringUtil::format_map_t log_message_args;
log_message_args["DESC"] = mDesc;
log_message_args["NAME"] = mFromName;
log_message = LLTrans::getString("InvOfferDecline", log_message_args);
+
+ LLSD args;
+ args["MESSAGE"] = log_message;
+ LLNotificationsUtil::add("SystemMessageTip", args);
}
- LLSD args;
- args["MESSAGE"] = log_message;
- LLNotificationsUtil::add("SystemMessage", args);
if (busy && (!mFromGroup && !mFromObject))
{
@@ -1761,22 +1810,18 @@ void LLOfferInfo::initRespondFunctionMap()
if(mRespondFunctions.empty())
{
mRespondFunctions["ObjectGiveItem"] = boost::bind(&LLOfferInfo::inventory_task_offer_callback, this, _1, _2);
+ mRespondFunctions["OwnObjectGiveItem"] = boost::bind(&LLOfferInfo::inventory_task_offer_callback, this, _1, _2);
mRespondFunctions["UserGiveItem"] = boost::bind(&LLOfferInfo::inventory_offer_callback, this, _1, _2);
}
}
void inventory_offer_handler(LLOfferInfo* info)
{
- //Until throttling is implmented, busy mode should reject inventory instead of silently
- //accepting it. SEE SL-39554
- if (gAgent.getBusy())
- {
- info->forceResponse(IOR_BUSY);
- return;
- }
-
- //If muted, don't even go through the messaging stuff. Just curtail the offer here.
- if (LLMuteList::getInstance()->isMuted(info->mFromID, info->mFromName))
+ // If muted, don't even go through the messaging stuff. Just curtail the offer here.
+ // Passing in a null UUID handles the case of where you have muted one of your own objects by_name.
+ // The solution for STORM-1297 seems to handle the cases where the object is owned by someone else.
+ if (LLMuteList::getInstance()->isMuted(info->mFromID, info->mFromName) ||
+ LLMuteList::getInstance()->isMuted(LLUUID::null, info->mFromName))
{
info->forceResponse(IOR_MUTE);
return;
@@ -1856,7 +1901,7 @@ void inventory_offer_handler(LLOfferInfo* info)
std::string verb = "select?name=" + LLURI::escape(msg);
args["ITEM_SLURL"] = LLSLURL("inventory", info->mObjectID, verb.c_str()).getSLURLString();
- LLNotification::Params p("ObjectGiveItem");
+ LLNotification::Params p;
// Object -> Agent Inventory Offer
if (info->mFromObject)
@@ -1866,7 +1911,10 @@ void inventory_offer_handler(LLOfferInfo* info)
// Note: sets inventory_task_offer_callback as the callback
p.substitutions(args).payload(payload).functor.responder(LLNotificationResponderPtr(info));
info->mPersist = true;
- p.name = "ObjectGiveItem";
+
+ // Offers from your own objects need a special notification template.
+ p.name = info->mFromID == gAgentID ? "OwnObjectGiveItem" : "ObjectGiveItem";
+
// Pop up inv offer chiclet and let the user accept (keep), or reject (and silently delete) the inventory.
LLPostponedNotification::add<LLPostponedOfferNotification>(p, info->mFromID, info->mFromGroup == TRUE);
}
@@ -2153,7 +2201,7 @@ void god_message_name_cb(const LLAvatarName& av_name, LLChat chat, std::string m
// Treat like a system message and put in chat history.
chat.mText = av_name.getCompleteName() + ": " + message;
- LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD());
+ LLNearbyChat* nearby_chat = LLNearbyChat::getInstance();
if(nearby_chat)
{
nearby_chat->addMessage(chat);
@@ -2163,10 +2211,6 @@ void god_message_name_cb(const LLAvatarName& av_name, LLChat chat, std::string m
void process_improved_im(LLMessageSystem *msg, void **user_data)
{
- if (gNoRender)
- {
- return;
- }
LLUUID from_id;
BOOL from_group;
LLUUID to_id;
@@ -2208,11 +2252,17 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
{
name = LLTrans::getString("Unnamed");
}
+
+ // Preserve the unaltered name for use in group notice mute checking.
+ std::string original_name = name;
+
// IDEVO convert new-style "Resident" names for display
name = clean_name_from_im(name, dialog);
BOOL is_busy = gAgent.getBusy();
- BOOL is_muted = LLMuteList::getInstance()->isMuted(from_id, name, LLMute::flagTextChat);
+ BOOL is_muted = LLMuteList::getInstance()->isMuted(from_id, name, LLMute::flagTextChat)
+ // object IMs contain sender object id in session_id (STORM-1209)
+ || dialog == IM_FROM_TASK && LLMuteList::getInstance()->isMuted(session_id);
BOOL is_linden = LLMuteList::getInstance()->isLinden(name);
BOOL is_owned_by_me = FALSE;
BOOL is_friend = (LLAvatarTracker::instance().getBuddyInfo(from_id) == NULL) ? false : true;
@@ -2327,8 +2377,15 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
LL_INFOS("Messaging") << "process_improved_im: session_id( " << session_id << " ), from_id( " << from_id << " )" << LL_ENDL;
bool mute_im = is_muted;
- if(accept_im_from_only_friend&&!is_friend)
+ if (accept_im_from_only_friend && !is_friend)
{
+ if (!gIMMgr->isNonFriendSessionNotified(session_id))
+ {
+ std::string message = LLTrans::getString("IM_unblock_only_groups_friends");
+ gIMMgr->addMessage(session_id, from_id, name, message);
+ gIMMgr->addNotifiedNonFriendSessionID(session_id);
+ }
+
mute_im = true;
}
if (!mute_im || is_linden)
@@ -2412,6 +2469,26 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
break;
}
+ // The group notice packet does not have an AgentID. Obtain one from the name cache.
+ // If last name is "Resident" strip it out so the cache name lookup works.
+ U32 index = original_name.find(" Resident");
+ if (index != std::string::npos)
+ {
+ original_name = original_name.substr(0, index);
+ }
+ std::string legacy_name = gCacheName->buildLegacyName(original_name);
+ LLUUID agent_id;
+ gCacheName->getUUID(legacy_name, agent_id);
+
+ if (agent_id.isNull())
+ {
+ LL_WARNS("Messaging") << "buildLegacyName returned null while processing " << original_name << LL_ENDL;
+ }
+ else if (LLMuteList::getInstance()->isMuted(agent_id))
+ {
+ break;
+ }
+
notice_bin_bucket = (struct notice_bucket_full_t*) &binary_bucket[0];
U8 has_inventory = notice_bin_bucket->header.has_inventory;
U8 asset_type = notice_bin_bucket->header.asset_type;
@@ -2547,8 +2624,9 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
bucketp = (struct offer_agent_bucket_t*) &binary_bucket[0];
info->mType = (LLAssetType::EType) bucketp->asset_type;
info->mObjectID = bucketp->object_id;
+ info->mFromObject = FALSE;
}
- else
+ else // IM_TASK_INVENTORY_OFFERED
{
if (sizeof(S8) != binary_bucket_size)
{
@@ -2558,6 +2636,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
}
info->mType = (LLAssetType::EType) binary_bucket[0];
info->mObjectID = LLUUID::null;
+ info->mFromObject = TRUE;
}
info->mIM = dialog;
@@ -2566,14 +2645,6 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
info->mTransactionID = session_id;
info->mFolderID = gInventory.findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(info->mType));
- if (dialog == IM_TASK_INVENTORY_OFFERED)
- {
- info->mFromObject = TRUE;
- }
- else
- {
- info->mFromObject = FALSE;
- }
info->mFromName = name;
info->mDesc = message;
info->mHost = msg->getSender();
@@ -2588,6 +2659,12 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
// Same as closing window
info->forceResponse(IOR_DECLINE);
}
+ else if (is_busy && dialog != IM_TASK_INVENTORY_OFFERED) // busy mode must not affect interaction with objects (STORM-565)
+ {
+ // Until throttling is implemented, busy mode should reject inventory instead of silently
+ // accepting it. SEE SL-39554
+ info->forceResponse(IOR_DECLINE);
+ }
else
{
inventory_offer_handler(info);
@@ -2600,6 +2677,9 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
args["NAME"] = LLSLURL("agent", from_id, "completename").getSLURLString();;
LLSD payload;
payload["from_id"] = from_id;
+ // Passing the "SESSION_NAME" to use it for IM notification logging
+ // in LLTipHandler::processNotification(). See STORM-941.
+ payload["SESSION_NAME"] = name;
LLNotificationsUtil::add("InventoryAccepted", args, payload);
break;
}
@@ -2714,13 +2794,21 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
// Note: lie to Nearby Chat, pretending that this is NOT an IM, because
// IMs from obejcts don't open IM sessions.
- LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD());
+ LLNearbyChat* nearby_chat = LLNearbyChat::getInstance();
if(SYSTEM_FROM != name && nearby_chat)
{
chat.mOwnerID = from_id;
LLSD args;
args["slurl"] = location;
args["type"] = LLNotificationsUI::NT_NEARBYCHAT;
+
+ // Look for IRC-style emotes here so object name formatting is correct
+ std::string prefix = message.substr(0, 4);
+ if (prefix == "/me " || prefix == "/me'")
+ {
+ chat.mChatStyle = CHAT_STYLE_IRC;
+ }
+
LLNotificationsUI::LLNotificationManager::instance().onChat(chat, args);
}
@@ -2790,8 +2878,8 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
else
{
LLVector3 pos, look_at;
- U64 region_handle;
- U8 region_access = SIM_ACCESS_MIN;
+ U64 region_handle(0);
+ U8 region_access(0);
std::string region_info = ll_safe_string((char*)binary_bucket, binary_bucket_size);
std::string region_access_str = LLStringUtil::null;
std::string region_access_icn = LLStringUtil::null;
@@ -3074,7 +3162,7 @@ protected:
{
// filter out non-interesting responeses
if ( !translation.empty()
- && (m_toLang != detected_language)
+ && (mToLang != detected_language)
&& (LLStringUtil::compareInsensitive(translation, m_origMesg) != 0) )
{
m_chat.mText += " (" + translation + ")";
@@ -3083,10 +3171,13 @@ protected:
LLNotificationsUI::LLNotificationManager::instance().onChat(m_chat, m_toastArgs);
}
- void handleFailure()
+ void handleFailure(int status, const std::string& err_msg)
{
- LLTranslate::TranslationReceiver::handleFailure();
- m_chat.mText += " (?)";
+ llwarns << "Translation failed for mesg " << m_origMesg << " toLang " << mToLang << " fromLang " << mFromLang << llendl;
+
+ std::string msg = LLTrans::getString("TranslationFailed", LLSD().with("[REASON]", err_msg));
+ LLStringUtil::replaceString(msg, "\n", " "); // we want one-line error messages
+ m_chat.mText += " (" + msg + ")";
LLNotificationsUI::LLNotificationManager::instance().onChat(m_chat, m_toastArgs);
}
@@ -3199,7 +3290,6 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
if (is_audible)
{
BOOL visible_in_chat_bubble = FALSE;
- std::string verb;
color.setVec(1.f,1.f,1.f,1.f);
msg->getStringFast(_PREHASH_ChatData, _PREHASH_Message, mesg);
@@ -3248,18 +3338,19 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
}
else
{
+ chat.mText = "";
switch(chat.mChatType)
{
case CHAT_TYPE_WHISPER:
- verb = LLTrans::getString("whisper") + " ";
+ chat.mText = LLTrans::getString("whisper") + " ";
break;
case CHAT_TYPE_DEBUG_MSG:
case CHAT_TYPE_OWNER:
case CHAT_TYPE_NORMAL:
- verb = "";
+ case CHAT_TYPE_DIRECT:
break;
case CHAT_TYPE_SHOUT:
- verb = LLTrans::getString("shout") + " ";
+ chat.mText = LLTrans::getString("shout") + " ";
break;
case CHAT_TYPE_START:
case CHAT_TYPE_STOP:
@@ -3267,13 +3358,9 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
break;
default:
LL_WARNS("Messaging") << "Unknown type " << chat.mChatType << " in chat!" << LL_ENDL;
- verb = "";
break;
}
-
- chat.mText = "";
- chat.mText += verb;
chat.mText += mesg;
}
@@ -3328,7 +3415,7 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
const std::string from_lang = ""; // leave empty to trigger autodetect
const std::string to_lang = LLTranslate::getTranslateLanguage();
- LLHTTPClient::ResponderPtr result = ChatTranslationReceiver::build(from_lang, to_lang, mesg, chat, args);
+ LLTranslate::TranslationReceiverPtr result = ChatTranslationReceiver::build(from_lang, to_lang, mesg, chat, args);
LLTranslate::translateMessage(result, from_lang, to_lang, mesg);
}
else
@@ -3347,6 +3434,8 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
// then this info is news to us.
void process_teleport_start(LLMessageSystem *msg, void**)
{
+ // on teleport, don't tell them about destination guide anymore
+ LLFirstUse::notUsingDestinationGuide(false);
U32 teleport_flags = 0x0;
msg->getU32("Info", "TeleportFlags", teleport_flags);
@@ -3597,6 +3686,9 @@ void process_teleport_finish(LLMessageSystem* msg, void**)
gCacheName->setUpstream(sim);
*/
+ // Make sure we're standing
+ gAgent.standUp();
+
// now, use the circuit info to tell simulator about us!
LL_INFOS("Messaging") << "process_teleport_finish() Enabling "
<< sim_host << " with code " << msg->mOurCircuitCode << LL_ENDL;
@@ -3751,8 +3843,19 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**)
}
else
{
- // This is likely just the initial logging in phase.
+ // This is initial log-in or a region crossing
gAgent.setTeleportState( LLAgent::TELEPORT_NONE );
+
+ if(LLStartUp::getStartupState() < STATE_STARTED)
+ { // This is initial log-in, not a region crossing:
+ // Set the camera looking ahead of the AV so send_agent_update() below
+ // will report the correct location to the server.
+ LLVector3 look_at_point = look_at;
+ look_at_point = agent_pos + look_at_point.rotVec(gAgent.getQuat());
+
+ static LLVector3 up_direction(0.0f, 0.0f, 1.0f);
+ LLViewerCamera::getInstance()->lookAt(agent_pos, look_at_point, up_direction);
+ }
}
if ( LLTracker::isTracking(NULL) )
@@ -3821,37 +3924,6 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**)
return;
}
- if (!gLastVersionChannel.empty())
- {
- // work out the URL for this server's Release Notes
- std::string url ="http://wiki.secondlife.com/wiki/Release_Notes/";
- std::string server_version = version_channel;
- std::vector<std::string> s_vect;
- boost::algorithm::split(s_vect, server_version, isspace);
- for(U32 i = 0; i < s_vect.size(); i++)
- {
- if (i != (s_vect.size() - 1))
- {
- if(i != (s_vect.size() - 2))
- {
- url += s_vect[i] + "_";
- }
- else
- {
- url += s_vect[i] + "/";
- }
- }
- else
- {
- url += s_vect[i].substr(0,4);
- }
- }
-
- LLSD args;
- args["URL"] = url;
- LLNotificationsUtil::add("ServerVersionChanged", args);
- }
-
gLastVersionChannel = version_channel;
}
@@ -3965,7 +4037,9 @@ void send_agent_update(BOOL force_send, BOOL send_reliable)
// LBUTTON and ML_LBUTTON so that using the camera (alt-key) doesn't
// trigger a control event.
U32 control_flags = gAgent.getControlFlags();
+
MASK key_mask = gKeyboard->currentMask(TRUE);
+
if (key_mask & MASK_ALT || key_mask & MASK_CONTROL)
{
control_flags &= ~( AGENT_CONTROL_LBUTTON_DOWN |
@@ -4234,15 +4308,8 @@ void process_kill_object(LLMessageSystem *mesgsys, void **user_data)
// Display green bubble on kill
if ( gShowObjectUpdates )
{
- LLViewerObject* newobject;
- newobject = gObjectList.createObjectViewer(LL_PCODE_LEGACY_TEXT_BUBBLE, objectp->getRegion());
-
- LLVOTextBubble* bubble = (LLVOTextBubble*) newobject;
-
- bubble->mColor.setVec(0.f, 1.f, 0.f, 1.f);
- bubble->setScale( 2.0f * bubble->getScale() );
- bubble->setPositionGlobal(objectp->getPositionGlobal());
- gPipeline.addObject(bubble);
+ LLColor4 color(0.f,1.f,0.f,1.f);
+ gPipeline.addDebugBlip(objectp->getPositionAgent(), color);
}
// Do the kill
@@ -4279,12 +4346,11 @@ void process_time_synch(LLMessageSystem *mesgsys, void **user_data)
LLWorld::getInstance()->setSpaceTimeUSec(space_time_usec);
- //LL_DEBUGS("Messaging") << "time_synch() - " << sun_direction << ", " << sun_ang_velocity
- // << ", " << phase << LL_ENDL;
+ LL_DEBUGS("Windlight Sync") << "Sun phase: " << phase << " rad = " << fmodf(phase / F_TWO_PI + 0.25, 1.f) * 24.f << " h" << LL_ENDL;
gSky.setSunPhase(phase);
gSky.setSunTargetDirection(sun_direction, sun_ang_velocity);
- if (!gNoRender && !(gSavedSettings.getBOOL("SkyOverrideSimSunPosition") || gSky.getOverrideSun()))
+ if ( !(gSavedSettings.getBOOL("SkyOverrideSimSunPosition") || gSky.getOverrideSun()) )
{
gSky.setSunDirection(sun_direction, sun_ang_velocity);
}
@@ -4339,6 +4405,12 @@ void process_sound_trigger(LLMessageSystem *msg, void **)
return;
}
+ // Don't play sounds from gestures if they are not enabled.
+ if (object_id == owner_id && !gSavedSettings.getBOOL("EnableGestureSounds"))
+ {
+ return;
+ }
+
gAudiop->triggerSound(sound_id, owner_id, gain, LLAudioEngine::AUDIO_TYPE_SFX, pos_global);
}
@@ -4758,7 +4830,7 @@ void process_avatar_sit_response(LLMessageSystem *mesgsys, void **user_data)
BOOL force_mouselook;
mesgsys->getBOOLFast(_PREHASH_SitTransform, _PREHASH_ForceMouselook, force_mouselook);
- if (isAgentAvatarValid() && dist_vec_squared(camera_eye, camera_at) > 0.0001f)
+ if (isAgentAvatarValid() && dist_vec_squared(camera_eye, camera_at) > CAMERA_POSITION_THRESHOLD_SQUARED)
{
gAgentCamera.setSitCamera(sitObjectID, camera_eye, camera_at);
}
@@ -5182,6 +5254,7 @@ static void process_money_balance_reply_extended(LLMessageSystem* msg)
BOOL is_dest_group = FALSE;
S32 amount = 0;
std::string item_description;
+ BOOL success = FALSE;
msg->getS32("TransactionInfo", "TransactionType", transaction_type);
msg->getUUID("TransactionInfo", "SourceID", source_id);
@@ -5190,6 +5263,7 @@ static void process_money_balance_reply_extended(LLMessageSystem* msg)
msg->getBOOL("TransactionInfo", "IsDestGroup", is_dest_group);
msg->getS32("TransactionInfo", "Amount", amount);
msg->getString("TransactionInfo", "ItemDescription", item_description);
+ msg->getBOOL("MoneyData", "TransactionSuccess", success);
LL_INFOS("Money") << "MoneyBalanceReply source " << source_id
<< " dest " << dest_id
<< " type " << transaction_type
@@ -5251,28 +5325,32 @@ static void process_money_balance_reply_extended(LLMessageSystem* msg)
{
if (dest_id.notNull())
{
- message = LLTrans::getString("you_paid_ldollars", args);
+ message = success ? LLTrans::getString("you_paid_ldollars", args) :
+ LLTrans::getString("you_paid_failure_ldollars", args);
}
else
{
// transaction fee to the system, eg, to create a group
- message = LLTrans::getString("you_paid_ldollars_no_name", args);
+ message = success ? LLTrans::getString("you_paid_ldollars_no_name", args) :
+ LLTrans::getString("you_paid_failure_ldollars_no_name", args);
}
}
else
{
if (dest_id.notNull())
{
- message = LLTrans::getString("you_paid_ldollars_no_reason", args);
+ message = success ? LLTrans::getString("you_paid_ldollars_no_reason", args) :
+ LLTrans::getString("you_paid_failure_ldollars_no_reason", args);
}
else
{
// no target, no reason, you just paid money
- message = LLTrans::getString("you_paid_ldollars_no_info", args);
+ message = success ? LLTrans::getString("you_paid_ldollars_no_info", args) :
+ LLTrans::getString("you_paid_failure_ldollars_no_info", args);
}
}
final_args["MESSAGE"] = message;
- notification = "PaymentSent";
+ notification = success ? "PaymentSent" : "PaymentFailure";
}
else {
// ...someone paid you
@@ -5378,6 +5456,12 @@ bool attempt_standard_notification(LLMessageSystem* msgsystem)
{
// notification was specified using the new mechanism, so we can just handle it here
std::string notificationID;
+ msgsystem->getStringFast(_PREHASH_AlertInfo, _PREHASH_Message, notificationID);
+ if (!LLNotifications::getInstance()->templateExists(notificationID))
+ {
+ return false;
+ }
+
std::string llsdRaw;
LLSD llsdBlock;
msgsystem->getStringFast(_PREHASH_AlertInfo, _PREHASH_Message, notificationID);
@@ -5534,10 +5618,19 @@ void process_alert_core(const std::string& message, BOOL modal)
}
else
{
- LLSD args;
- std::string new_msg =LLNotifications::instance().getGlobalString(message);
- args["MESSAGE"] = new_msg;
- LLNotificationsUtil::add("SystemMessageTip", args);
+ // Hack fix for EXP-623 (blame fix on RN :)) to avoid a sim deploy
+ const std::string AUTOPILOT_CANCELED_MSG("Autopilot canceled");
+ if (message.find(AUTOPILOT_CANCELED_MSG) == std::string::npos )
+ {
+ LLSD args;
+ std::string new_msg =LLNotifications::instance().getGlobalString(message);
+
+ std::string localized_msg;
+ bool is_message_localized = LLTrans::findString(localized_msg, new_msg);
+
+ args["MESSAGE"] = is_message_localized ? localized_msg : new_msg;
+ LLNotificationsUtil::add("SystemMessageTip", args);
+ }
}
}
@@ -5546,21 +5639,12 @@ time_t gLastDisplayedTime = 0;
void handle_show_mean_events(void *)
{
- if (gNoRender)
- {
- return;
- }
LLFloaterReg::showInstance("bumps");
//LLFloaterBump::showInstance();
}
void mean_name_callback(const LLUUID &id, const std::string& full_name, bool is_group)
{
- if (gNoRender)
- {
- return;
- }
-
static const U32 max_collision_list_size = 20;
if (gMeanCollisionList.size() > max_collision_list_size)
{
@@ -5756,6 +5840,16 @@ bool script_question_cb(const LLSD& notification, const LLSD& response)
S32 orig = notification["payload"]["questions"].asInteger();
S32 new_questions = orig;
+ if (response["Details"])
+ {
+ // respawn notification...
+ LLNotificationsUtil::add(notification["name"], notification["substitutions"], notification["payload"]);
+
+ // ...with description on top
+ LLNotificationsUtil::add("DebitPermissionDetails");
+ return false;
+ }
+
// check whether permissions were granted or denied
BOOL allowed = TRUE;
// the "yes/accept" button is the first button in the template, making it button 0
@@ -5813,14 +5907,6 @@ bool script_question_cb(const LLSD& notification, const LLSD& response)
gSavedSettings.getString("NotificationChannelUUID")), OfferMatcher(item_id));
}
- if (response["Details"])
- {
- // respawn notification...
- LLNotificationsUtil::add(notification["name"], notification["substitutions"], notification["payload"]);
-
- // ...with description on top
- LLNotificationsUtil::add("DebitPermissionDetails");
- }
return false;
}
static LLNotificationFunctorRegistration script_question_cb_reg_1("ScriptQuestion", script_question_cb);
@@ -6266,6 +6352,18 @@ void send_group_notice(const LLUUID& group_id,
bool handle_lure_callback(const LLSD& notification, const LLSD& response)
{
+ static const unsigned OFFER_RECIPIENT_LIMIT = 250;
+ if(notification["payload"]["ids"].size() > OFFER_RECIPIENT_LIMIT)
+ {
+ // More than OFFER_RECIPIENT_LIMIT targets will overload the message
+ // producing an llerror.
+ LLSD args;
+ args["OFFERS"] = notification["payload"]["ids"].size();
+ args["LIMIT"] = static_cast<int>(OFFER_RECIPIENT_LIMIT);
+ LLNotificationsUtil::add("TooManyTeleportOffers", args);
+ return false;
+ }
+
std::string text = response["message"].asString();
LLSLURL slurl;
LLAgentUI::buildSLURL(slurl);
@@ -6304,6 +6402,9 @@ bool handle_lure_callback(const LLSD& notification, const LLSD& response)
payload["from_id"] = target_id;
payload["SUPPRESS_TOAST"] = true;
LLNotificationsUtil::add("TeleportOfferSent", args, payload);
+
+ // Add the recepient to the recent people list.
+ LLRecentPeople::instance().add(target_id);
}
}
gAgent.sendReliableMessage();
@@ -6421,7 +6522,7 @@ void process_user_info_reply(LLMessageSystem* msg, void**)
msg->getString( "UserData", "DirectoryVisibility", dir_visibility);
LLFloaterPreference::updateUserInfo(dir_visibility, im_via_email, email);
- LLFloaterPostcard::updateUserInfo(email);
+ LLFloaterSnapshot::setAgentEmail(email);
}
@@ -6453,8 +6554,24 @@ bool callback_script_dialog(const LLSD& notification, const LLSD& response)
rtn_text = LLNotification::getSelectedOptionName(response);
}
- // Didn't click "Ignore"
- if (button_idx != -1)
+ // Button -2 = Mute
+ // Button -1 = Ignore - no processing needed for this button
+ // Buttons 0 and above = dialog choices
+
+ if (-2 == button_idx)
+ {
+ std::string object_name = notification["payload"]["object_name"].asString();
+ LLUUID object_id = notification["payload"]["object_id"].asUUID();
+ LLMute mute(object_id, object_name, LLMute::OBJECT);
+ if (LLMuteList::getInstance()->add(mute))
+ {
+ // This call opens the sidebar, displays the block list, and highlights the newly blocked
+ // object in the list so the user can see that their block click has taken effect.
+ LLPanelBlockedList::showPanelAndSelect(object_id);
+ }
+ }
+
+ if (0 <= button_idx)
{
LLMessageSystem* msg = gMessageSystem;
msg->newMessage("ScriptDialogReply");
@@ -6482,7 +6599,14 @@ void process_script_dialog(LLMessageSystem* msg, void**)
LLUUID object_id;
msg->getUUID("Data", "ObjectID", object_id);
- if (LLMuteList::getInstance()->isMuted(object_id))
+// For compability with OS grids first check for presence of extended packet before fetching data.
+ LLUUID owner_id;
+ if (gMessageSystem->getNumberOfBlocks("OwnerData") > 0)
+ {
+ msg->getUUID("OwnerData", "OwnerID", owner_id);
+ }
+
+ if (LLMuteList::getInstance()->isMuted(object_id) || LLMuteList::getInstance()->isMuted(owner_id))
{
return;
}
@@ -6490,12 +6614,12 @@ void process_script_dialog(LLMessageSystem* msg, void**)
std::string message;
std::string first_name;
std::string last_name;
- std::string title;
+ std::string object_name;
S32 chat_channel;
msg->getString("Data", "FirstName", first_name);
msg->getString("Data", "LastName", last_name);
- msg->getString("Data", "ObjectName", title);
+ msg->getString("Data", "ObjectName", object_name);
msg->getString("Data", "Message", message);
msg->getS32("Data", "ChatChannel", chat_channel);
@@ -6506,6 +6630,7 @@ void process_script_dialog(LLMessageSystem* msg, void**)
payload["sender"] = msg->getSender().getIPandPort();
payload["object_id"] = object_id;
payload["chat_channel"] = chat_channel;
+ payload["object_name"] = object_name;
// build up custom form
S32 button_count = msg->getNumberOfBlocks("Buttons");
@@ -6524,7 +6649,7 @@ void process_script_dialog(LLMessageSystem* msg, void**)
}
LLSD args;
- args["TITLE"] = title;
+ args["TITLE"] = object_name;
args["MESSAGE"] = message;
LLNotificationPtr notification;
if (!first_name.empty())
@@ -6686,6 +6811,8 @@ void process_initiate_download(LLMessageSystem* msg, void**)
void process_script_teleport_request(LLMessageSystem* msg, void**)
{
+ if (!gSavedSettings.getBOOL("ScriptsCanShowUI")) return;
+
std::string object_name;
std::string sim_name;
LLVector3 pos;
@@ -6722,15 +6849,17 @@ void process_covenant_reply(LLMessageSystem* msg, void**)
LLPanelEstateCovenant::updateEstateName(estate_name);
LLPanelLandCovenant::updateEstateName(estate_name);
+ LLPanelEstateInfo::updateEstateName(estate_name);
LLFloaterBuyLand::updateEstateName(estate_name);
std::string owner_name =
LLSLURL("agent", estate_owner_id, "inspect").getSLURLString();
LLPanelEstateCovenant::updateEstateOwnerName(owner_name);
LLPanelLandCovenant::updateEstateOwnerName(owner_name);
+ LLPanelEstateInfo::updateEstateOwnerName(owner_name);
LLFloaterBuyLand::updateEstateOwnerName(owner_name);
- LLPanelPlaceProfile* panel = LLSideTray::getInstance()->getPanel<LLPanelPlaceProfile>("panel_place_profile");
+ LLPanelPlaceProfile* panel = LLFloaterSidePanelContainer::getPanel<LLPanelPlaceProfile>("places", "panel_place_profile");
if (panel)
{
panel->updateEstateName(estate_name);
@@ -6864,7 +6993,7 @@ void onCovenantLoadComplete(LLVFS *vfs,
LLPanelLandCovenant::updateCovenantText(covenant_text);
LLFloaterBuyLand::updateCovenantText(covenant_text, asset_uuid);
- LLPanelPlaceProfile* panel = LLSideTray::getInstance()->getPanel<LLPanelPlaceProfile>("panel_place_profile");
+ LLPanelPlaceProfile* panel = LLFloaterSidePanelContainer::getPanel<LLPanelPlaceProfile>("places", "panel_place_profile");
if (panel)
{
panel->updateCovenantText(covenant_text);
diff --git a/indra/newview/llviewermessage.h b/indra/newview/llviewermessage.h
index 6ff893f543..46bfb2dad0 100644
--- a/indra/newview/llviewermessage.h
+++ b/indra/newview/llviewermessage.h
@@ -35,6 +35,7 @@
#include "message.h"
#include "stdenums.h"
#include "llnotifications.h"
+#include "llextendedstatus.h"
//
// Forward declarations
@@ -57,7 +58,6 @@ enum InventoryOfferResponse
IOR_ACCEPT,
IOR_DECLINE,
IOR_MUTE,
- IOR_BUSY,
IOR_SHOW
};
@@ -117,7 +117,6 @@ void process_alert_core(const std::string& message, BOOL modal);
typedef std::list<LLMeanCollisionData*> mean_collision_list_t;
extern mean_collision_list_t gMeanCollisionList;
-void handle_show_mean_events(void *);
void process_mean_collision_alert_message(LLMessageSystem* msg, void**);
void process_frozen_message(LLMessageSystem* msg, void**);
@@ -204,6 +203,8 @@ void open_inventory_offer(const uuid_vec_t& items, const std::string& from_name)
bool highlight_offered_object(const LLUUID& obj_id);
void set_dad_inventory_item(LLInventoryItem* inv_item, const LLUUID& into_folder_uuid);
+void set_dad_inbox_object(const LLUUID& object_id);
+
class LLOfferInfo : public LLNotificationResponderInterface
{
diff --git a/indra/newview/llviewernetwork.cpp b/indra/newview/llviewernetwork.cpp
index b91e407c6d..ef5c65eb87 100644
--- a/indra/newview/llviewernetwork.cpp
+++ b/indra/newview/llviewernetwork.cpp
@@ -31,10 +31,11 @@
#include "llviewercontrol.h"
#include "llsdserialize.h"
#include "llsecapi.h"
+#include "lltrans.h"
#include "llweb.h"
-const char* DEFAULT_LOGIN_PAGE = "http://secondlife.com/app/login/";
+const char* DEFAULT_LOGIN_PAGE = "http://viewer-login.agni.lindenlab.com/";
const char* SYSTEM_GRID_SLURL_BASE = "secondlife://%s/secondlife/";
const char* MAIN_GRID_SLURL_BASE = "http://maps.secondlife.com/secondlife/";
@@ -504,7 +505,8 @@ void LLGridManager::setGridChoice(const std::string& grid)
addGrid(grid_data);
}
mGrid = grid;
- gSavedSettings.setString("CurrentGrid", grid);
+ gSavedSettings.setString("CurrentGrid", grid);
+
updateIsInProductionGrid();
}
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index 1804fac1b3..cd300accb7 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -47,6 +47,7 @@
#include "llprimitive.h"
#include "llquantize.h"
#include "llregionhandle.h"
+#include "llsdserialize.h"
#include "lltree_common.h"
#include "llxfermanager.h"
#include "message.h"
@@ -62,6 +63,7 @@
#include "lldrawable.h"
#include "llface.h"
#include "llfloaterproperties.h"
+#include "llfloatertools.h"
#include "llfollowcam.h"
#include "llhudtext.h"
#include "llselectmgr.h"
@@ -79,7 +81,6 @@
#include "llviewerwindow.h" // For getSpinAxis
#include "llvoavatar.h"
#include "llvoavatarself.h"
-#include "llvoclouds.h"
#include "llvograss.h"
#include "llvoground.h"
#include "llvolume.h"
@@ -87,7 +88,6 @@
#include "llvopartgroup.h"
#include "llvosky.h"
#include "llvosurfacepatch.h"
-#include "llvotextbubble.h"
#include "llvotree.h"
#include "llvovolume.h"
#include "llvowater.h"
@@ -139,18 +139,23 @@ LLViewerObject *LLViewerObject::createObject(const LLUUID &id, const LLPCode pco
if (!gAgentAvatarp)
{
gAgentAvatarp = new LLVOAvatarSelf(id, pcode, regionp);
+ gAgentAvatarp->initInstance();
}
else
{
- gAgentAvatarp->updateRegion(regionp);
+ if (isAgentAvatarValid())
+ {
+ gAgentAvatarp->updateRegion(regionp);
+ }
}
res = gAgentAvatarp;
}
else
{
- res = new LLVOAvatar(id, pcode, regionp);
+ LLVOAvatar *avatar = new LLVOAvatar(id, pcode, regionp);
+ avatar->initInstance();
+ res = avatar;
}
- static_cast<LLVOAvatar*>(res)->initInstance();
break;
}
case LL_PCODE_LEGACY_GRASS:
@@ -165,10 +170,6 @@ LLViewerObject *LLViewerObject::createObject(const LLUUID &id, const LLPCode pco
// llwarns << "Creating new tree!" << llendl;
// res = new LLVOTree(id, pcode, regionp); break;
res = NULL; break;
- case LL_PCODE_LEGACY_TEXT_BUBBLE:
- res = new LLVOTextBubble(id, pcode, regionp); break;
- case LL_VO_CLOUDS:
- res = new LLVOClouds(id, pcode, regionp); break;
case LL_VO_SURFACE_PATCH:
res = new LLVOSurfacePatch(id, pcode, regionp); break;
case LL_VO_SKY:
@@ -202,6 +203,11 @@ LLViewerObject::LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRe
mGLName(0),
mbCanSelect(TRUE),
mFlags(0),
+ mPhysicsShapeType(0),
+ mPhysicsGravity(0),
+ mPhysicsFriction(0),
+ mPhysicsDensity(0),
+ mPhysicsRestitution(0),
mDrawable(),
mCreateSelected(FALSE),
mRenderMedia(FALSE),
@@ -210,7 +216,6 @@ LLViewerObject::LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRe
mLastInterpUpdateSecs(0.f),
mLastMessageUpdateSecs(0.f),
mLatestRecvPacketID(0),
- mCircuitPacketCount(0),
mData(NULL),
mAudioSourcep(NULL),
mAudioGain(1.f),
@@ -234,7 +239,15 @@ LLViewerObject::LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRe
mState(0),
mMedia(NULL),
mClickAction(0),
- mAttachmentItemID(LLUUID::null)
+ mObjectCost(0),
+ mLinksetCost(0),
+ mPhysicsCost(0),
+ mLinksetPhysicsCost(0.f),
+ mCostStale(true),
+ mPhysicsShapeUnknown(true),
+ mAttachmentItemID(LLUUID::null),
+ mLastUpdateType(OUT_UNKNOWN),
+ mLastUpdateCached(FALSE)
{
if (!is_global)
{
@@ -468,15 +481,9 @@ void LLViewerObject::initVOClasses()
// Initialized shared class stuff first.
LLVOAvatar::initClass();
LLVOTree::initClass();
- if (gNoRender)
- {
- // Don't init anything else in drone mode
- return;
- }
llinfos << "Viewer Object size: " << sizeof(LLViewerObject) << llendl;
LLVOGrass::initClass();
LLVOWater::initClass();
- LLVOSky::initClass();
LLVOVolume::initClass();
}
@@ -513,23 +520,130 @@ void LLViewerObject::setNameValueList(const std::string& name_value_list)
}
}
-
// This method returns true if the object is over land owned by the
// agent.
-BOOL LLViewerObject::isOverAgentOwnedLand() const
+bool LLViewerObject::isReturnable()
{
- return mRegionp
- && mRegionp->getParcelOverlay()
- && mRegionp->getParcelOverlay()->isOwnedSelf(getPositionRegion());
+ if (isAttachment())
+ {
+ return false;
+ }
+
+ std::vector<LLBBox> boxes;
+ boxes.push_back(LLBBox(getPositionRegion(), getRotationRegion(), getScale() * -0.5f, getScale() * 0.5f).getAxisAligned());
+ for (child_list_t::iterator iter = mChildList.begin();
+ iter != mChildList.end(); iter++)
+ {
+ LLViewerObject* child = *iter;
+ boxes.push_back( LLBBox(child->getPositionRegion(), child->getRotationRegion(), child->getScale() * -0.5f, child->getScale() * 0.5f).getAxisAligned());
+ }
+
+ bool result = (mRegionp && mRegionp->objectIsReturnable(getPositionRegion(), boxes)) ? 1 : 0;
+
+ if ( !result )
+ {
+ //Get list of neighboring regions relative to this vo's region
+ std::vector<LLViewerRegion*> uniqueRegions;
+ mRegionp->getNeighboringRegions( uniqueRegions );
+
+ //Build aabb's - for root and all children
+ std::vector<PotentialReturnableObject> returnables;
+ typedef std::vector<LLViewerRegion*>::iterator RegionIt;
+ RegionIt regionStart = uniqueRegions.begin();
+ RegionIt regionEnd = uniqueRegions.end();
+
+ for (; regionStart != regionEnd; ++regionStart )
+ {
+ LLViewerRegion* pTargetRegion = *regionStart;
+ //Add the root vo as there may be no children and we still want
+ //to test for any edge overlap
+ buildReturnablesForChildrenVO( returnables, this, pTargetRegion );
+ //Add it's children
+ for (child_list_t::iterator iter = mChildList.begin(); iter != mChildList.end(); iter++)
+ {
+ LLViewerObject* pChild = *iter;
+ buildReturnablesForChildrenVO( returnables, pChild, pTargetRegion );
+ }
+ }
+
+ //TBD#Eventually create a region -> box list map
+ typedef std::vector<PotentialReturnableObject>::iterator ReturnablesIt;
+ ReturnablesIt retCurrentIt = returnables.begin();
+ ReturnablesIt retEndIt = returnables.end();
+
+ for ( ; retCurrentIt !=retEndIt; ++retCurrentIt )
+ {
+ boxes.clear();
+ LLViewerRegion* pRegion = (*retCurrentIt).pRegion;
+ boxes.push_back( (*retCurrentIt).box );
+ bool retResult = pRegion
+ && pRegion->childrenObjectReturnable( boxes )
+ && pRegion->canManageEstate();
+ if ( retResult )
+ {
+ result = true;
+ break;
+ }
+ }
+ }
+ return result;
}
-// This method returns true if the object is over land owned by the
-// agent.
-BOOL LLViewerObject::isOverGroupOwnedLand() const
+void LLViewerObject::buildReturnablesForChildrenVO( std::vector<PotentialReturnableObject>& returnables, LLViewerObject* pChild, LLViewerRegion* pTargetRegion )
{
- return mRegionp
- && mRegionp->getParcelOverlay()
- && mRegionp->getParcelOverlay()->isOwnedGroup(getPositionRegion());
+ if ( !pChild )
+ {
+ llerrs<<"child viewerobject is NULL "<<llendl;
+ }
+
+ constructAndAddReturnable( returnables, pChild, pTargetRegion );
+
+ //We want to handle any children VO's as well
+ for (child_list_t::iterator iter = pChild->mChildList.begin(); iter != pChild->mChildList.end(); iter++)
+ {
+ LLViewerObject* pChildofChild = *iter;
+ buildReturnablesForChildrenVO( returnables, pChildofChild, pTargetRegion );
+ }
+}
+
+void LLViewerObject::constructAndAddReturnable( std::vector<PotentialReturnableObject>& returnables, LLViewerObject* pChild, LLViewerRegion* pTargetRegion )
+{
+
+ LLVector3 targetRegionPos;
+ targetRegionPos.setVec( pChild->getPositionGlobal() );
+
+ LLBBox childBBox = LLBBox( targetRegionPos, pChild->getRotationRegion(), pChild->getScale() * -0.5f,
+ pChild->getScale() * 0.5f).getAxisAligned();
+
+ LLVector3 edgeA = targetRegionPos + childBBox.getMinLocal();
+ LLVector3 edgeB = targetRegionPos + childBBox.getMaxLocal();
+
+ LLVector3d edgeAd, edgeBd;
+ edgeAd.setVec(edgeA);
+ edgeBd.setVec(edgeB);
+
+ //Only add the box when either of the extents are in a neighboring region
+ if ( pTargetRegion->pointInRegionGlobal( edgeAd ) || pTargetRegion->pointInRegionGlobal( edgeBd ) )
+ {
+ PotentialReturnableObject returnableObj;
+ returnableObj.box = childBBox;
+ returnableObj.pRegion = pTargetRegion;
+ returnables.push_back( returnableObj );
+ }
+}
+
+bool LLViewerObject::crossesParcelBounds()
+{
+ std::vector<LLBBox> boxes;
+ boxes.push_back(LLBBox(getPositionRegion(), getRotationRegion(), getScale() * -0.5f, getScale() * 0.5f).getAxisAligned());
+ for (child_list_t::iterator iter = mChildList.begin();
+ iter != mChildList.end(); iter++)
+ {
+ LLViewerObject* child = *iter;
+ boxes.push_back(LLBBox(child->getPositionRegion(), child->getRotationRegion(), child->getScale() * -0.5f, child->getScale() * 0.5f).getAxisAligned());
+ }
+
+ return mRegionp && mRegionp->objectsCrossParcel(boxes);
}
BOOL LLViewerObject::setParent(LLViewerObject* parent)
@@ -763,6 +877,13 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
LLMemType mt(LLMemType::MTYPE_OBJECT);
U32 retval = 0x0;
+ // If region is removed from the list it is also deleted.
+ if (!LLWorld::instance().isRegionListed(mRegionp))
+ {
+ llwarns << "Updating object in an invalid region" << llendl;
+ return retval;
+ }
+
// Coordinates of objects on simulators are region-local.
U64 region_handle;
mesgsys->getU64Fast(_PREHASH_RegionData, _PREHASH_RegionHandle, region_handle);
@@ -847,6 +968,13 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
#ifdef DEBUG_UPDATE_TYPE
llinfos << "Full:" << getID() << llendl;
#endif
+ //clear cost and linkset cost
+ mCostStale = true;
+ if (isSelected())
+ {
+ gFloaterTools->dirty();
+ }
+
LLUUID audio_uuid;
LLUUID owner_id; // only valid if audio_uuid or particle system is not null
F32 gain;
@@ -1412,6 +1540,13 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
#ifdef DEBUG_UPDATE_TYPE
llinfos << "CompFull:" << getID() << llendl;
#endif
+ mCostStale = true;
+
+ if (isSelected())
+ {
+ gFloaterTools->dirty();
+ }
+
dp->unpackU32(crc, "CRC");
mTotalCRC = crc;
dp->unpackU8(material, "Material");
@@ -1868,7 +2003,7 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
//
//
- // WTF? If we're going to skip this message, why are we
+ // If we're going to skip this message, why are we
// doing all the parenting, etc above?
U32 packet_id = mesgsys->getCurrentRecvPacketID();
if (packet_id < mLatestRecvPacketID &&
@@ -1879,7 +2014,6 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
}
mLatestRecvPacketID = packet_id;
- mCircuitPacketCount = 0;
// Set the change flags for scale
if (new_scale != getScale())
@@ -1948,23 +2082,16 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
if ( gShowObjectUpdates )
{
- if (!((mPrimitiveCode == LL_PCODE_LEGACY_AVATAR) && (((LLVOAvatar *) this)->isSelf()))
- && mRegionp)
+ LLColor4 color;
+ if (update_type == OUT_TERSE_IMPROVED)
{
- LLViewerObject* object = gObjectList.createObjectViewer(LL_PCODE_LEGACY_TEXT_BUBBLE, mRegionp);
- LLVOTextBubble* bubble = (LLVOTextBubble*) object;
-
- if (update_type == OUT_TERSE_IMPROVED)
- {
- bubble->mColor.setVec(0.f, 0.f, 1.f, 1.f);
- }
- else
- {
- bubble->mColor.setVec(1.f, 0.f, 0.f, 1.f);
- }
- object->setPositionGlobal(getPositionGlobal());
- gPipeline.addObject(object);
+ color.setVec(0.f, 0.f, 1.f, 1.f);
}
+ else
+ {
+ color.setVec(1.f, 0.f, 0.f, 1.f);
+ }
+ gPipeline.addDebugBlip(getPositionAgent(), color);
}
if ((0.0f == vel_mag_sq) &&
@@ -2148,12 +2275,6 @@ BOOL LLViewerObject::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
}
}
- if (gNoRender)
- {
- // Skip drawable stuff if not rendering.
- return TRUE;
- }
-
updateDrawable(FALSE);
return TRUE;
@@ -2202,7 +2323,8 @@ void LLViewerObject::interpolateLinearMotion(const F64 & time, const F32 & dt)
LLVector3 new_pos = (vel + (0.5f * (dt-PHYSICS_TIMESTEP)) * accel) * dt;
LLVector3 new_v = accel * dt;
- if (time_since_last_update > sPhaseOutUpdateInterpolationTime)
+ if (time_since_last_update > sPhaseOutUpdateInterpolationTime &&
+ sPhaseOutUpdateInterpolationTime > 0.0)
{ // Haven't seen a viewer update in a while, check to see if the ciruit is still active
if (mRegionp)
{ // The simulator will NOT send updates if the object continues normally on the path
@@ -2211,9 +2333,12 @@ void LLViewerObject::interpolateLinearMotion(const F64 & time, const F32 & dt)
LLCircuitData *cdp = gMessageSystem->mCircuitInfo.findCircuit( mRegionp->getHost() );
if (cdp)
{
+ // Find out how many seconds since last packet arrived on the circuit
+ F64 time_since_last_packet = LLMessageSystem::getMessageTimeSeconds() - cdp->getLastPacketInTime();
+
if (!cdp->isAlive() || // Circuit is dead or blocked
cdp->isBlocked() || // or doesn't seem to be getting any packets
- (mCircuitPacketCount > 0 && mCircuitPacketCount == cdp->getPacketsIn()))
+ (time_since_last_packet > sPhaseOutUpdateInterpolationTime))
{
// Start to reduce motion interpolation since we haven't seen a server update in a while
F64 time_since_last_interpolation = time - mLastInterpUpdateSecs;
@@ -2244,9 +2369,6 @@ void LLViewerObject::interpolateLinearMotion(const F64 & time, const F32 & dt)
new_pos = new_pos * ((F32) phase_out);
new_v = new_v * ((F32) phase_out);
}
-
- // Save current circuit packet count to see if it changes
- mCircuitPacketCount = cdp->getPacketsIn();
}
}
}
@@ -2653,7 +2775,7 @@ void LLViewerObject::processTaskInv(LLMessageSystem* msg, void** user_data)
LLPointer<LLInventoryObject> obj;
obj = new LLInventoryObject(object->mID, LLUUID::null,
LLAssetType::AT_CATEGORY,
- LLTrans::getString("ViewerObjectContents").c_str());
+ "Contents");
object->mInventory->push_front(obj);
object->doInventoryCallback();
delete ft;
@@ -2720,7 +2842,7 @@ void LLViewerObject::loadTaskInvFile(const std::string& filename)
{
LLPointer<LLInventoryObject> inv = new LLInventoryObject;
inv->importLegacyStream(ifs);
- inv->rename(LLTrans::getString("ViewerObjectContents").c_str());
+ inv->rename("Contents");
mInventory->push_front(inv);
}
else
@@ -3005,6 +3127,8 @@ void LLViewerObject::setScale(const LLVector3 &scale, BOOL damped)
{
if (!mOnMap)
{
+ llassert_always(LLWorld::getInstance()->getRegionFromHandle(getRegion()->getHandle()));
+
gObjectList.addToMap(this);
mOnMap = TRUE;
}
@@ -3020,21 +3144,126 @@ void LLViewerObject::setScale(const LLVector3 &scale, BOOL damped)
}
}
-void LLViewerObject::updateSpatialExtents(LLVector3& newMin, LLVector3 &newMax)
+void LLViewerObject::setObjectCost(F32 cost)
{
- LLVector3 center = getRenderPosition();
- LLVector3 size = getScale();
- newMin.setVec(center-size);
- newMax.setVec(center+size);
- mDrawable->setPositionGroup((newMin + newMax) * 0.5f);
+ mObjectCost = cost;
+ mCostStale = false;
+
+ if (isSelected())
+ {
+ gFloaterTools->dirty();
+ }
+}
+
+void LLViewerObject::setLinksetCost(F32 cost)
+{
+ mLinksetCost = cost;
+ mCostStale = false;
+
+ if (isSelected())
+ {
+ gFloaterTools->dirty();
+ }
+}
+
+void LLViewerObject::setPhysicsCost(F32 cost)
+{
+ mPhysicsCost = cost;
+ mCostStale = false;
+
+ if (isSelected())
+ {
+ gFloaterTools->dirty();
+ }
+}
+
+void LLViewerObject::setLinksetPhysicsCost(F32 cost)
+{
+ mLinksetPhysicsCost = cost;
+ mCostStale = false;
+
+ if (isSelected())
+ {
+ gFloaterTools->dirty();
+ }
+}
+
+
+F32 LLViewerObject::getObjectCost()
+{
+ if (mCostStale)
+ {
+ gObjectList.updateObjectCost(this);
+ }
+
+ return mObjectCost;
+}
+
+F32 LLViewerObject::getLinksetCost()
+{
+ if (mCostStale)
+ {
+ gObjectList.updateObjectCost(this);
+ }
+
+ return mLinksetCost;
+}
+
+F32 LLViewerObject::getPhysicsCost()
+{
+ if (mCostStale)
+ {
+ gObjectList.updateObjectCost(this);
+ }
+
+ return mPhysicsCost;
+}
+
+F32 LLViewerObject::getLinksetPhysicsCost()
+{
+ if (mCostStale)
+ {
+ gObjectList.updateObjectCost(this);
+ }
+
+ return mLinksetPhysicsCost;
+}
+
+F32 LLViewerObject::getStreamingCost(S32* bytes, S32* visible_bytes, F32* unscaled_value) const
+{
+ return 0.f;
+}
+
+U32 LLViewerObject::getTriangleCount(S32* vcount) const
+{
+ return 0;
+}
+
+U32 LLViewerObject::getHighLODTriangleCount()
+{
+ return 0;
+}
+
+void LLViewerObject::updateSpatialExtents(LLVector4a& newMin, LLVector4a &newMax)
+{
+ LLVector4a center;
+ center.load3(getRenderPosition().mV);
+ LLVector4a size;
+ size.load3(getScale().mV);
+ newMin.setSub(center, size);
+ newMax.setAdd(center, size);
+
+ mDrawable->setPositionGroup(center);
}
F32 LLViewerObject::getBinRadius()
{
if (mDrawable.notNull())
{
- const LLVector3* ext = mDrawable->getSpatialExtents();
- return (ext[1]-ext[0]).magVec();
+ const LLVector4a* ext = mDrawable->getSpatialExtents();
+ LLVector4a diff;
+ diff.setSub(ext[1], ext[0]);
+ return diff.getLength3().getF32();
}
return getScale().magVec();
@@ -3100,7 +3329,7 @@ void LLViewerObject::boostTexturePriority(BOOL boost_children /* = TRUE */)
getTEImage(i)->setBoostLevel(LLViewerTexture::BOOST_SELECTED);
}
- if (isSculpted())
+ if (isSculpted() && !isMesh())
{
LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT);
LLUUID sculpt_id = sculpt_params->getSculptTexture();
@@ -3256,7 +3485,8 @@ LLNameValue *LLViewerObject::getNVPair(const std::string& name) const
void LLViewerObject::updatePositionCaches() const
{
- if(mRegionp)
+ // If region is removed from the list it is also deleted.
+ if(mRegionp && LLWorld::instance().isRegionListed(mRegionp))
{
if (!isRoot())
{
@@ -3273,7 +3503,8 @@ void LLViewerObject::updatePositionCaches() const
const LLVector3d LLViewerObject::getPositionGlobal() const
{
- if(mRegionp)
+ // If region is removed from the list it is also deleted.
+ if(mRegionp && LLWorld::instance().isRegionListed(mRegionp))
{
LLVector3d position_global = mRegionp->getPosGlobalFromRegion(getPositionRegion());
@@ -3292,7 +3523,8 @@ const LLVector3d LLViewerObject::getPositionGlobal() const
const LLVector3 &LLViewerObject::getPositionAgent() const
{
- if (mRegionp)
+ // If region is removed from the list it is also deleted.
+ if(mRegionp && LLWorld::instance().isRegionListed(mRegionp))
{
if (mDrawable.notNull() && (!mDrawable->isRoot() && getParent()))
{
@@ -3340,6 +3572,15 @@ const LLVector3 LLViewerObject::getPositionEdit() const
const LLVector3 LLViewerObject::getRenderPosition() const
{
+ if (mDrawable.notNull() && mDrawable->isState(LLDrawable::RIGGED))
+ {
+ LLVOAvatar* avatar = getAvatar();
+ if (avatar)
+ {
+ return avatar->getPositionAgent();
+ }
+ }
+
if (mDrawable.isNull() || mDrawable->getGeneration() < 0)
{
return getPositionAgent();
@@ -3358,6 +3599,11 @@ const LLVector3 LLViewerObject::getPivotPositionAgent() const
const LLQuaternion LLViewerObject::getRenderRotation() const
{
LLQuaternion ret;
+ if (mDrawable.notNull() && mDrawable->isState(LLDrawable::RIGGED))
+ {
+ return ret;
+ }
+
if (mDrawable.isNull() || mDrawable->isStatic())
{
ret = getRotationEdit();
@@ -3532,8 +3778,8 @@ void LLViewerObject::setPositionParent(const LLVector3 &pos_parent, BOOL damped)
// Set position relative to parent, if no parent, relative to region
if (!isRoot())
{
- LLViewerObject::setPosition(pos_parent);
- updateDrawable(damped);
+ LLViewerObject::setPosition(pos_parent, damped);
+ //updateDrawable(damped);
}
else
{
@@ -3574,6 +3820,7 @@ void LLViewerObject::setPositionEdit(const LLVector3 &pos_edit, BOOL damped)
LLVector3 position_offset = getPosition() * getParent()->getRotation();
((LLViewerObject *)getParent())->setPositionEdit(pos_edit - position_offset);
+ updateDrawable(damped);
}
else if (isJointChild())
{
@@ -3582,15 +3829,14 @@ void LLViewerObject::setPositionEdit(const LLVector3 &pos_edit, BOOL damped)
LLQuaternion inv_parent_rot = parent->getRotation();
inv_parent_rot.transQuat();
LLVector3 pos_parent = (pos_edit - parent->getPositionRegion()) * inv_parent_rot;
- LLViewerObject::setPosition(pos_parent);
+ LLViewerObject::setPosition(pos_parent, damped);
}
else
{
- LLViewerObject::setPosition(pos_edit);
+ LLViewerObject::setPosition(pos_edit, damped);
mPositionRegion = pos_edit;
mPositionAgent = mRegionp->getPosAgentFromRegion(mPositionRegion);
- }
- updateDrawable(damped);
+ }
}
@@ -3626,12 +3872,21 @@ BOOL LLViewerObject::lineSegmentBoundingBox(const LLVector3& start, const LLVect
return FALSE;
}
- const LLVector3* ext = mDrawable->getSpatialExtents();
+ const LLVector4a* ext = mDrawable->getSpatialExtents();
- LLVector3 center = (ext[1]+ext[0])*0.5f;
- LLVector3 size = (ext[1]-ext[0])*0.5f;
+ //VECTORIZE THIS
+ LLVector4a center;
+ center.setAdd(ext[1], ext[0]);
+ center.mul(0.5f);
+ LLVector4a size;
+ size.setSub(ext[1], ext[0]);
+ size.mul(0.5f);
- return LLLineSegmentBoxIntersect(start, end, center, size);
+ LLVector4a starta, enda;
+ starta.load3(start.mV);
+ enda.load3(end.mV);
+
+ return LLLineSegmentBoxIntersect(starta, enda, center, size);
}
U8 LLViewerObject::getMediaType() const
@@ -4650,6 +4905,10 @@ void LLViewerObject::adjustAudioGain(const F32 gain)
bool LLViewerObject::unpackParameterEntry(U16 param_type, LLDataPacker *dp)
{
+ if (LLNetworkData::PARAMS_MESH == param_type)
+ {
+ param_type = LLNetworkData::PARAMS_SCULPT;
+ }
ExtraParameter* param = getExtraParameterEntryCreate(param_type);
if (param)
{
@@ -5100,7 +5359,6 @@ void LLViewerObject::setRegion(LLViewerRegion *regionp)
}
mLatestRecvPacketID = 0;
- mCircuitPacketCount = 0;
mRegionp = regionp;
for (child_list_t::iterator i = mChildList.begin(); i != mChildList.end(); ++i)
@@ -5134,7 +5392,7 @@ bool LLViewerObject::specialHoverCursor() const
|| (mClickAction != 0);
}
-void LLViewerObject::updateFlags()
+void LLViewerObject::updateFlags(BOOL physics_changed)
{
LLViewerRegion* regionp = getRegion();
if(!regionp) return;
@@ -5147,6 +5405,15 @@ void LLViewerObject::updateFlags()
gMessageSystem->addBOOL("IsTemporary", flagTemporaryOnRez() );
gMessageSystem->addBOOL("IsPhantom", flagPhantom() );
gMessageSystem->addBOOL("CastsShadows", flagCastShadows() );
+ if (physics_changed)
+ {
+ gMessageSystem->nextBlock("ExtraPhysics");
+ gMessageSystem->addU8("PhysicsShapeType", getPhysicsShapeType() );
+ gMessageSystem->addF32("Density", getPhysicsDensity() );
+ gMessageSystem->addF32("Friction", getPhysicsFriction() );
+ gMessageSystem->addF32("Restitution", getPhysicsRestitution() );
+ gMessageSystem->addF32("GravityMultiplier", getPhysicsGravity() );
+ }
gMessageSystem->sendReliable( regionp->getHost() );
}
@@ -5179,6 +5446,44 @@ BOOL LLViewerObject::setFlags(U32 flags, BOOL state)
return setit;
}
+void LLViewerObject::setPhysicsShapeType(U8 type)
+{
+ mPhysicsShapeUnknown = false;
+ mPhysicsShapeType = type;
+ mCostStale = true;
+}
+
+void LLViewerObject::setPhysicsGravity(F32 gravity)
+{
+ mPhysicsGravity = gravity;
+}
+
+void LLViewerObject::setPhysicsFriction(F32 friction)
+{
+ mPhysicsFriction = friction;
+}
+
+void LLViewerObject::setPhysicsDensity(F32 density)
+{
+ mPhysicsDensity = density;
+}
+
+void LLViewerObject::setPhysicsRestitution(F32 restitution)
+{
+ mPhysicsRestitution = restitution;
+}
+
+U8 LLViewerObject::getPhysicsShapeType() const
+{
+ if (mPhysicsShapeUnknown)
+ {
+ mPhysicsShapeUnknown = false;
+ gObjectList.updatePhysicsFlags(this);
+ }
+
+ return mPhysicsShapeType;
+}
+
void LLViewerObject::applyAngularVelocity(F32 dt)
{
//do target omega here
@@ -5228,11 +5533,12 @@ void LLViewerObject::dirtyMesh()
{
if (mDrawable)
{
- LLSpatialGroup* group = mDrawable->getSpatialGroup();
+ gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_ALL);
+ /*LLSpatialGroup* group = mDrawable->getSpatialGroup();
if (group)
{
group->dirtyMesh();
- }
+ }*/
}
}
@@ -5400,6 +5706,26 @@ void LLViewerObject::setAttachmentItemID(const LLUUID &id)
mAttachmentItemID = id;
}
+EObjectUpdateType LLViewerObject::getLastUpdateType() const
+{
+ return mLastUpdateType;
+}
+
+void LLViewerObject::setLastUpdateType(EObjectUpdateType last_update_type)
+{
+ mLastUpdateType = last_update_type;
+}
+
+BOOL LLViewerObject::getLastUpdateCached() const
+{
+ return mLastUpdateCached;
+}
+
+void LLViewerObject::setLastUpdateCached(BOOL last_update_cached)
+{
+ mLastUpdateCached = last_update_cached;
+}
+
const LLUUID &LLViewerObject::extractAttachmentItemID()
{
LLUUID item_id = LLUUID::null;
@@ -5415,3 +5741,76 @@ const LLUUID &LLViewerObject::extractAttachmentItemID()
setAttachmentItemID(item_id);
return getAttachmentItemID();
}
+
+//virtual
+LLVOAvatar* LLViewerObject::getAvatar() const
+{
+ if (isAttachment())
+ {
+ LLViewerObject* vobj = (LLViewerObject*) getParent();
+
+ while (vobj && !vobj->asAvatar())
+ {
+ vobj = (LLViewerObject*) vobj->getParent();
+ }
+
+ return (LLVOAvatar*) vobj;
+ }
+
+ return NULL;
+}
+
+
+class ObjectPhysicsProperties : public LLHTTPNode
+{
+public:
+ virtual void post(
+ ResponsePtr responder,
+ const LLSD& context,
+ const LLSD& input) const
+ {
+ LLSD object_data = input["body"]["ObjectData"];
+ S32 num_entries = object_data.size();
+
+ for ( S32 i = 0; i < num_entries; i++ )
+ {
+ LLSD& curr_object_data = object_data[i];
+ U32 local_id = curr_object_data["LocalID"].asInteger();
+
+ // Iterate through nodes at end, since it can be on both the regular AND hover list
+ struct f : public LLSelectedNodeFunctor
+ {
+ U32 mID;
+ f(const U32& id) : mID(id) {}
+ virtual bool apply(LLSelectNode* node)
+ {
+ return (node->getObject() && node->getObject()->mLocalID == mID );
+ }
+ } func(local_id);
+
+ LLSelectNode* node = LLSelectMgr::getInstance()->getSelection()->getFirstNode(&func);
+
+ if (node)
+ {
+ // The LLSD message builder doesn't know how to handle U8, so we need to send as S8 and cast
+ U8 type = (U8)curr_object_data["PhysicsShapeType"].asInteger();
+ F32 density = (F32)curr_object_data["Density"].asReal();
+ F32 friction = (F32)curr_object_data["Friction"].asReal();
+ F32 restitution = (F32)curr_object_data["Restitution"].asReal();
+ F32 gravity = (F32)curr_object_data["GravityMultiplier"].asReal();
+
+ node->getObject()->setPhysicsShapeType(type);
+ node->getObject()->setPhysicsGravity(gravity);
+ node->getObject()->setPhysicsFriction(friction);
+ node->getObject()->setPhysicsDensity(density);
+ node->getObject()->setPhysicsRestitution(restitution);
+ }
+ }
+
+ dialog_refresh_all();
+ };
+};
+
+LLHTTPRegistration<ObjectPhysicsProperties>
+ gHTTPRegistrationObjectPhysicsProperties("/message/ObjectPhysicsProperties");
+
diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h
index fe670f8827..c8152e1539 100644
--- a/indra/newview/llviewerobject.h
+++ b/indra/newview/llviewerobject.h
@@ -1,4 +1,4 @@
-/**
+/**
* @file llviewerobject.h
* @brief Description of LLViewerObject class, which is the base class for most objects in the viewer.
*
@@ -43,11 +43,12 @@
#include "v3dmath.h"
#include "v3math.h"
#include "llvertexbuffer.h"
+#include "llbbox.h"
+#include "llbbox.h"
class LLAgent; // TODO: Get rid of this.
class LLAudioSource;
class LLAudioSourceVO;
-class LLBBox;
class LLDataPacker;
class LLColor4;
class LLFrameTimer;
@@ -77,6 +78,7 @@ typedef enum e_object_update_type
OUT_TERSE_IMPROVED,
OUT_FULL_COMPRESSED,
OUT_FULL_CACHED,
+ OUT_UNKNOWN,
} EObjectUpdateType;
@@ -110,6 +112,12 @@ public:
LLColor4 mColor;
};
+struct PotentialReturnableObject
+{
+ LLBBox box;
+ LLViewerRegion* pRegion;
+};
+
//============================================================================
class LLViewerObject : public LLPrimitive, public LLRefCount, public LLGLUpdate
@@ -175,6 +183,7 @@ public:
void setOnActiveList(BOOL on_active) { mOnActiveList = on_active; }
virtual BOOL isAttachment() const { return FALSE; }
+ virtual LLVOAvatar* getAvatar() const; //get the avatar this object is attached to, or NULL if object is not an attachment
virtual BOOL isHUDAttachment() const { return FALSE; }
virtual void updateRadius() {};
virtual F32 getVObjRadius() const; // default implemenation is mDrawable->getRadius()
@@ -223,15 +232,20 @@ public:
virtual BOOL isFlexible() const { return FALSE; }
virtual BOOL isSculpted() const { return FALSE; }
+ virtual BOOL isMesh() const { return FALSE; }
virtual BOOL hasLightTexture() const { return FALSE; }
// This method returns true if the object is over land owned by
- // the agent.
- BOOL isOverAgentOwnedLand() const;
+ // the agent, one of its groups, or it encroaches and
+ // anti-encroachment is enabled
+ bool isReturnable();
- // True if over land owned by group of which the agent is
- // either officer or member.
- BOOL isOverGroupOwnedLand() const;
+ void buildReturnablesForChildrenVO( std::vector<PotentialReturnableObject>& returnables, LLViewerObject* pChild, LLViewerRegion* pTargetRegion );
+ void constructAndAddReturnable( std::vector<PotentialReturnableObject>& returnables, LLViewerObject* pChild, LLViewerRegion* pTargetRegion );
+
+ // This method returns true if the object crosses
+ // any parcel bounds in the region.
+ bool crossesParcelBounds();
/*
// This method will scan through this object, and then query the
@@ -326,6 +340,22 @@ public:
virtual void setScale(const LLVector3 &scale, BOOL damped = FALSE);
+ virtual F32 getStreamingCost(S32* bytes = NULL, S32* visible_bytes = NULL, F32* unscaled_value = NULL) const;
+ virtual U32 getTriangleCount(S32* vcount = NULL) const;
+ virtual U32 getHighLODTriangleCount();
+
+ void setObjectCost(F32 cost);
+ F32 getObjectCost();
+
+ void setLinksetCost(F32 cost);
+ F32 getLinksetCost();
+
+ void setPhysicsCost(F32 cost);
+ F32 getPhysicsCost();
+
+ void setLinksetPhysicsCost(F32 cost);
+ F32 getLinksetPhysicsCost();
+
void sendShapeUpdate();
U8 getState() { return mState; }
@@ -365,7 +395,7 @@ public:
void markForUpdate(BOOL priority);
void updateVolume(const LLVolumeParams& volume_params);
- virtual void updateSpatialExtents(LLVector3& min, LLVector3& max);
+ virtual void updateSpatialExtents(LLVector4a& min, LLVector4a& max);
virtual F32 getBinRadius();
LLBBox getBoundingBoxAgent() const;
@@ -378,7 +408,7 @@ public:
void clearDrawableState(U32 state, BOOL recursive = TRUE);
// Called when the drawable shifts
- virtual void onShift(const LLVector3 &shift_vector) { }
+ virtual void onShift(const LLVector4a &shift_vector) { }
//////////////////////////////////////
//
@@ -453,6 +483,12 @@ public:
inline BOOL flagCameraDecoupled() const { return ((mFlags & FLAGS_CAMERA_DECOUPLED) != 0); }
inline BOOL flagObjectMove() const { return ((mFlags & FLAGS_OBJECT_MOVE) != 0); }
+ U8 getPhysicsShapeType() const;
+ inline F32 getPhysicsGravity() const { return mPhysicsGravity; }
+ inline F32 getPhysicsFriction() const { return mPhysicsFriction; }
+ inline F32 getPhysicsDensity() const { return mPhysicsDensity; }
+ inline F32 getPhysicsRestitution() const { return mPhysicsRestitution; }
+
bool getIncludeInSearch() const;
void setIncludeInSearch(bool include_in_search);
@@ -466,8 +502,13 @@ public:
void setRegion(LLViewerRegion *regionp);
virtual void updateRegion(LLViewerRegion *regionp);
- void updateFlags();
+ void updateFlags(BOOL physics_changed = FALSE);
BOOL setFlags(U32 flag, BOOL state);
+ void setPhysicsShapeType(U8 type);
+ void setPhysicsGravity(F32 gravity);
+ void setPhysicsFriction(F32 friction);
+ void setPhysicsDensity(F32 density);
+ void setPhysicsRestitution(F32 restitution);
virtual void dump() const;
static U32 getNumZombieObjects() { return sNumZombieObjects; }
@@ -519,7 +560,7 @@ public:
//
typedef enum e_vo_types
{
- LL_VO_CLOUDS = LL_PCODE_APP | 0x20,
+ LL_VO_CLOUDS = LL_PCODE_APP | 0x20, // no longer used
LL_VO_SURFACE_PATCH = LL_PCODE_APP | 0x30,
LL_VO_WL_SKY = LL_PCODE_APP | 0x40,
LL_VO_SQUARE_TORUS = LL_PCODE_APP | 0x50,
@@ -532,6 +573,13 @@ public:
LL_VO_HUD_PART_GROUP = LL_PCODE_APP | 0xc0,
} EVOType;
+ typedef enum e_physics_shape_types
+ {
+ PHYSICS_SHAPE_PRIM = 0,
+ PHYSICS_SHAPE_NONE,
+ PHYSICS_SHAPE_CONVEX_HULL,
+ } EPhysicsShapeType;
+
LLUUID mID;
// unique within region, not unique across regions
@@ -550,6 +598,14 @@ public:
// Grabbed from UPDATE_FLAGS
U32 mFlags;
+ // Sent to sim in UPDATE_FLAGS, received in ObjectPhysicsProperties
+ U8 mPhysicsShapeType;
+ F32 mPhysicsGravity;
+ F32 mPhysicsFriction;
+ F32 mPhysicsDensity;
+ F32 mPhysicsRestitution;
+
+
// Pipeline classes
LLPointer<LLDrawable> mDrawable;
@@ -601,7 +657,9 @@ protected:
void unpackParticleSource(LLDataPacker &dp, const LLUUID& owner_id);
void deleteParticleSource();
void setParticleSource(const LLPartSysData& particle_parameters, const LLUUID& owner_id);
-
+
+public:
+
private:
void setNameValueList(const std::string& list); // clears nv pairs and then individually adds \n separated NV pairs from \0 terminated string
void deleteTEImages(); // correctly deletes list of images
@@ -615,7 +673,6 @@ protected:
F64 mLastInterpUpdateSecs; // Last update for purposes of interpolation
F64 mLastMessageUpdateSecs; // Last update from a message from the simulator
TPACKETID mLatestRecvPacketID; // Latest time stamp on message from simulator
- U32 mCircuitPacketCount; // Packet tracking for early detection of a stopped simulator circuit
// extra data sent from the sim...currently only used for tree species info
U8* mData;
@@ -659,6 +716,13 @@ protected:
U8 mState; // legacy
LLViewerObjectMedia* mMedia; // NULL if no media associated
U8 mClickAction;
+ F32 mObjectCost; //resource cost of this object or -1 if unknown
+ F32 mLinksetCost;
+ F32 mPhysicsCost;
+ F32 mLinksetPhysicsCost;
+
+ bool mCostStale;
+ mutable bool mPhysicsShapeUnknown;
static U32 sNumZombieObjects; // Objects which are dead, but not deleted
@@ -696,8 +760,15 @@ public:
const LLUUID &getAttachmentItemID() const;
void setAttachmentItemID(const LLUUID &id);
const LLUUID &extractAttachmentItemID(); // find&set the inventory item ID of the attached object
+ EObjectUpdateType getLastUpdateType() const;
+ void setLastUpdateType(EObjectUpdateType last_update_type);
+ BOOL getLastUpdateCached() const;
+ void setLastUpdateCached(BOOL last_update_cached);
+
private:
LLUUID mAttachmentItemID; // ItemID of the associated object is in user inventory.
+ EObjectUpdateType mLastUpdateType;
+ BOOL mLastUpdateCached;
};
///////////////////
@@ -740,7 +811,7 @@ public:
virtual F32 getPartSize(S32 idx);
virtual void getGeometry(S32 idx,
- LLStrider<LLVector3>& verticesp,
+ LLStrider<LLVector4a>& verticesp,
LLStrider<LLVector3>& normalsp,
LLStrider<LLVector2>& texcoordsp,
LLStrider<LLColor4U>& colorsp,
diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp
index f5a32438cf..6912faa9ec 100644
--- a/indra/newview/llviewerobjectlist.cpp
+++ b/indra/newview/llviewerobjectlist.cpp
@@ -54,8 +54,11 @@
#include "llviewercamera.h"
#include "llselectmgr.h"
#include "llresmgr.h"
+#include "llsdutil.h"
#include "llviewerregion.h"
#include "llviewerstats.h"
+#include "llviewerstatsrecorder.h"
+#include "llvovolume.h"
#include "llvoavatarself.h"
#include "lltoolmgr.h"
#include "lltoolpie.h"
@@ -159,19 +162,13 @@ U64 LLViewerObjectList::getIndex(const U32 local_id,
return (((U64)index) << 32) | (U64)local_id;
}
-BOOL LLViewerObjectList::removeFromLocalIDTable(const LLViewerObject &object)
+BOOL LLViewerObjectList::removeFromLocalIDTable(const LLViewerObject* objectp)
{
- if(object.getRegion())
+ if(objectp && objectp->getRegion())
{
- U32 local_id = object.mLocalID;
- LLHost region_host = object.getRegion()->getHost();
- if(!region_host.isOk())
- {
- return FALSE ;
- }
-
- U32 ip = region_host.getAddress();
- U32 port = region_host.getPort();
+ U32 local_id = objectp->mLocalID;
+ U32 ip = objectp->getRegion()->getHost().getAddress();
+ U32 port = objectp->getRegion()->getHost().getPort();
U64 ipport = (((U64)ip) << 32) | (U64)port;
U32 index = sIPAndPortToIndex[ipport];
@@ -186,7 +183,7 @@ BOOL LLViewerObjectList::removeFromLocalIDTable(const LLViewerObject &object)
}
// Found existing entry
- if (iter->second == object.getID())
+ if (iter->second == objectp->getID())
{ // Full UUIDs match, so remove the entry
sIndexAndLocalIDToUUID.erase(iter);
return TRUE;
@@ -302,8 +299,10 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
// have to transform to absolute coordinates.
num_objects = mesgsys->getNumberOfBlocksFast(_PREHASH_ObjectData);
+ // I don't think this case is ever hit. TODO* Test this.
if (!cached && !compressed && update_type != OUT_FULL)
{
+ //llinfos << "TEST: !cached && !compressed && update_type != OUT_FULL" << llendl;
gTerseObjectUpdates += num_objects;
S32 size;
if (mesgsys->getReceiveCompressedSize())
@@ -314,7 +313,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
{
size = mesgsys->getReceiveSize();
}
- // llinfos << "Received terse " << num_objects << " in " << size << " byte (" << size/num_objects << ")" << llendl;
+ //llinfos << "Received terse " << num_objects << " in " << size << " byte (" << size/num_objects << ")" << llendl;
}
else
{
@@ -345,9 +344,14 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
U8 compressed_dpbuffer[2048];
LLDataPackerBinaryBuffer compressed_dp(compressed_dpbuffer, 2048);
LLDataPacker *cached_dpp = NULL;
-
+
+#if LL_RECORD_VIEWER_STATS
+ LLViewerStatsRecorder::instance()->beginObjectUpdateEvents(regionp);
+#endif
+
for (i = 0; i < num_objects; i++)
{
+ // timer is unused?
LLTimer update_timer;
BOOL justCreated = FALSE;
@@ -359,9 +363,11 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
mesgsys->getU32Fast(_PREHASH_ObjectData, _PREHASH_CRC, crc, i);
// Lookup data packer and add this id to cache miss lists if necessary.
- cached_dpp = regionp->getDP(id, crc);
+ U8 cache_miss_type = LLViewerRegion::CACHE_MISS_TYPE_NONE;
+ cached_dpp = regionp->getDP(id, crc, cache_miss_type);
if (cached_dpp)
{
+ // Cache Hit.
cached_dpp->reset();
cached_dpp->unpackUUID(fullid, "ID");
cached_dpp->unpackU32(local_id, "LocalID");
@@ -369,6 +375,11 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
}
else
{
+ // Cache Miss.
+ #if LL_RECORD_VIEWER_STATS
+ LLViewerStatsRecorder::instance()->recordCacheMissEvent(id, update_type, cache_miss_type);
+ #endif
+
continue; // no data packer, skip this object
}
}
@@ -380,13 +391,15 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
compressed_dp.reset();
U32 flags = 0;
- if (update_type != OUT_TERSE_IMPROVED)
+ if (update_type != OUT_TERSE_IMPROVED) // OUT_FULL_COMPRESSED only?
{
mesgsys->getU32Fast(_PREHASH_ObjectData, _PREHASH_UpdateFlags, flags, i);
}
+ // I don't think we ever use this flag from the server. DK 2010/12/09
if (flags & FLAGS_ZLIB_COMPRESSED)
{
+ //llinfos << "TEST: flags & FLAGS_ZLIB_COMPRESSED" << llendl;
compressed_length = mesgsys->getSizeFast(_PREHASH_ObjectData, i, _PREHASH_Data);
mesgsys->getBinaryDataFast(_PREHASH_ObjectData, _PREHASH_Data, compbuffer, 0, i);
uncompressed_length = 2048;
@@ -402,7 +415,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
}
- if (update_type != OUT_TERSE_IMPROVED)
+ if (update_type != OUT_TERSE_IMPROVED) // OUT_FULL_COMPRESSED only?
{
compressed_dp.unpackUUID(fullid, "ID");
compressed_dp.unpackU32(local_id, "LocalID");
@@ -422,7 +435,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
}
}
}
- else if (update_type != OUT_FULL)
+ else if (update_type != OUT_FULL) // !compressed, !OUT_FULL ==> OUT_FULL_CACHED only?
{
mesgsys->getU32Fast(_PREHASH_ObjectData, _PREHASH_ID, local_id, i);
getUUIDFromLocal(fullid,
@@ -435,7 +448,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
mNumUnknownUpdates++;
}
}
- else
+ else // OUT_FULL only?
{
mesgsys->getUUIDFast(_PREHASH_ObjectData, _PREHASH_FullID, fullid, i);
mesgsys->getU32Fast(_PREHASH_ObjectData, _PREHASH_ID, local_id, i);
@@ -460,19 +473,19 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
// << ", regionp " << (U32) regionp << ", object region " << (U32) objectp->getRegion()
// << llendl;
//}
- removeFromLocalIDTable(*objectp);
+ removeFromLocalIDTable(objectp);
setUUIDAndLocal(fullid,
local_id,
gMessageSystem->getSenderIP(),
gMessageSystem->getSenderPort());
if (objectp->mLocalID != local_id)
- { // Update local ID in object with the one sent from the region
+ { // Update local ID in object with the one sent from the region
objectp->mLocalID = local_id;
}
if (objectp->getRegion() != regionp)
- { // Object changed region, so update it
+ { // Object changed region, so update it
objectp->updateRegion(regionp); // for LLVOAvatar
}
}
@@ -483,18 +496,24 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
{
if (update_type == OUT_TERSE_IMPROVED)
{
- // llinfos << "terse update for an unknown object:" << fullid << llendl;
+ // llinfos << "terse update for an unknown object (compressed):" << fullid << llendl;
+ #if LL_RECORD_VIEWER_STATS
+ LLViewerStatsRecorder::instance()->recordObjectUpdateFailure(local_id, update_type);
+ #endif
continue;
}
}
- else if (cached)
+ else if (cached) // Cache hit only?
{
}
else
{
if (update_type != OUT_FULL)
{
- // llinfos << "terse update for an unknown object:" << fullid << llendl;
+ //llinfos << "terse update for an unknown object:" << fullid << llendl;
+ #if LL_RECORD_VIEWER_STATS
+ LLViewerStatsRecorder::instance()->recordObjectUpdateFailure(local_id, update_type);
+ #endif
continue;
}
@@ -504,7 +523,10 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
if (mDeadObjects.find(fullid) != mDeadObjects.end())
{
mNumDeadObjectUpdates++;
- // llinfos << "update for a dead object:" << fullid << llendl;
+ //llinfos << "update for a dead object:" << fullid << llendl;
+ #if LL_RECORD_VIEWER_STATS
+ LLViewerStatsRecorder::instance()->recordObjectUpdateFailure(local_id, update_type);
+ #endif
continue;
}
#endif
@@ -512,6 +534,10 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
objectp = createObject(pcode, regionp, fullid, local_id, gMessageSystem->getSender());
if (!objectp)
{
+ llinfos << "createObject failure for object: " << fullid << llendl;
+ #if LL_RECORD_VIEWER_STATS
+ LLViewerStatsRecorder::instance()->recordObjectUpdateFailure(local_id, update_type);
+ #endif
continue;
}
justCreated = TRUE;
@@ -524,19 +550,26 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
llwarns << "Dead object " << objectp->mID << " in UUID map 1!" << llendl;
}
+ bool bCached = false;
if (compressed)
{
- if (update_type != OUT_TERSE_IMPROVED)
+ if (update_type != OUT_TERSE_IMPROVED) // OUT_FULL_COMPRESSED only?
{
objectp->mLocalID = local_id;
}
processUpdateCore(objectp, user_data, i, update_type, &compressed_dp, justCreated);
- if (update_type != OUT_TERSE_IMPROVED)
+ if (update_type != OUT_TERSE_IMPROVED) // OUT_FULL_COMPRESSED only?
{
+ bCached = true;
+ #if LL_RECORD_VIEWER_STATS
+ LLViewerRegion::eCacheUpdateResult result = objectp->mRegionp->cacheFullUpdate(objectp, compressed_dp);
+ LLViewerStatsRecorder::instance()->recordCacheFullUpdate(local_id, update_type, result, objectp);
+ #else
objectp->mRegionp->cacheFullUpdate(objectp, compressed_dp);
+ #endif
}
}
- else if (cached)
+ else if (cached) // Cache hit only?
{
objectp->mLocalID = local_id;
processUpdateCore(objectp, user_data, i, update_type, cached_dpp, justCreated);
@@ -549,8 +582,17 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
}
processUpdateCore(objectp, user_data, i, update_type, NULL, justCreated);
}
+ #if LL_RECORD_VIEWER_STATS
+ LLViewerStatsRecorder::instance()->recordObjectUpdateEvent(local_id, update_type, objectp);
+ #endif
+ objectp->setLastUpdateType(update_type);
+ objectp->setLastUpdateCached(bCached);
}
+#if LL_RECORD_VIEWER_STATS
+ LLViewerStatsRecorder::instance()->endObjectUpdateEvents();
+#endif
+
LLVOAvatar::cullAvatarsByPixelArea();
}
@@ -596,19 +638,16 @@ void LLViewerObjectList::updateApparentAngles(LLAgent &agent)
}
- if (!gNoRender)
+ // Slam priorities for textures that we care about (hovered, selected, and focused)
+ // Hovered
+ // Assumes only one level deep of parenting
+ LLSelectNode* nodep = LLSelectMgr::instance().getHoverNode();
+ if (nodep)
{
- // Slam priorities for textures that we care about (hovered, selected, and focused)
- // Hovered
- // Assumes only one level deep of parenting
- LLSelectNode* nodep = LLSelectMgr::instance().getHoverNode();
- if (nodep)
+ objectp = nodep->getObject();
+ if (objectp)
{
- objectp = nodep->getObject();
- if (objectp)
- {
- objectp->boostTexturePriority();
- }
+ objectp->boostTexturePriority();
}
}
@@ -655,6 +694,189 @@ void LLViewerObjectList::updateApparentAngles(LLAgent &agent)
LLVOAvatar::cullAvatarsByPixelArea();
}
+class LLObjectCostResponder : public LLCurl::Responder
+{
+public:
+ LLObjectCostResponder(const LLSD& object_ids)
+ : mObjectIDs(object_ids)
+ {
+ }
+
+ // Clear's the global object list's pending
+ // request list for all objects requested
+ void clear_object_list_pending_requests()
+ {
+ // TODO*: No more hard coding
+ for (
+ LLSD::array_iterator iter = mObjectIDs.beginArray();
+ iter != mObjectIDs.endArray();
+ ++iter)
+ {
+ gObjectList.onObjectCostFetchFailure(iter->asUUID());
+ }
+ }
+
+ void error(U32 statusNum, const std::string& reason)
+ {
+ llwarns
+ << "Transport error requesting object cost "
+ << "HTTP status: " << statusNum << ", reason: "
+ << reason << "." << llendl;
+
+ // TODO*: Error message to user
+ // For now just clear the request from the pending list
+ clear_object_list_pending_requests();
+ }
+
+ void result(const LLSD& content)
+ {
+ if ( !content.isMap() || content.has("error") )
+ {
+ // Improper response or the request had an error,
+ // show an error to the user?
+ llwarns
+ << "Application level error when fetching object "
+ << "cost. Message: " << content["error"]["message"].asString()
+ << ", identifier: " << content["error"]["identifier"].asString()
+ << llendl;
+
+ // TODO*: Adaptively adjust request size if the
+ // service says we've requested too many and retry
+
+ // TODO*: Error message if not retrying
+ clear_object_list_pending_requests();
+ return;
+ }
+
+ // Success, grab the resource cost and linked set costs
+ // for an object if one was returned
+ for (
+ LLSD::array_iterator iter = mObjectIDs.beginArray();
+ iter != mObjectIDs.endArray();
+ ++iter)
+ {
+ LLUUID object_id = iter->asUUID();
+
+ // Check to see if the request contains data for the object
+ if ( content.has(iter->asString()) )
+ {
+ F32 link_cost =
+ content[iter->asString()]["linked_set_resource_cost"].asReal();
+ F32 object_cost =
+ content[iter->asString()]["resource_cost"].asReal();
+
+ F32 physics_cost = content[iter->asString()]["physics_cost"].asReal();
+ F32 link_physics_cost = content[iter->asString()]["linked_set_physics_cost"].asReal();
+
+ gObjectList.updateObjectCost(object_id, object_cost, link_cost, physics_cost, link_physics_cost);
+ }
+ else
+ {
+ // TODO*: Give user feedback about the missing data?
+ gObjectList.onObjectCostFetchFailure(object_id);
+ }
+ }
+ }
+
+private:
+ LLSD mObjectIDs;
+};
+
+
+class LLPhysicsFlagsResponder : public LLCurl::Responder
+{
+public:
+ LLPhysicsFlagsResponder(const LLSD& object_ids)
+ : mObjectIDs(object_ids)
+ {
+ }
+
+ // Clear's the global object list's pending
+ // request list for all objects requested
+ void clear_object_list_pending_requests()
+ {
+ // TODO*: No more hard coding
+ for (
+ LLSD::array_iterator iter = mObjectIDs.beginArray();
+ iter != mObjectIDs.endArray();
+ ++iter)
+ {
+ gObjectList.onPhysicsFlagsFetchFailure(iter->asUUID());
+ }
+ }
+
+ void error(U32 statusNum, const std::string& reason)
+ {
+ llwarns
+ << "Transport error requesting object physics flags "
+ << "HTTP status: " << statusNum << ", reason: "
+ << reason << "." << llendl;
+
+ // TODO*: Error message to user
+ // For now just clear the request from the pending list
+ clear_object_list_pending_requests();
+ }
+
+ void result(const LLSD& content)
+ {
+ if ( !content.isMap() || content.has("error") )
+ {
+ // Improper response or the request had an error,
+ // show an error to the user?
+ llwarns
+ << "Application level error when fetching object "
+ << "physics flags. Message: " << content["error"]["message"].asString()
+ << ", identifier: " << content["error"]["identifier"].asString()
+ << llendl;
+
+ // TODO*: Adaptively adjust request size if the
+ // service says we've requested too many and retry
+
+ // TODO*: Error message if not retrying
+ clear_object_list_pending_requests();
+ return;
+ }
+
+ // Success, grab the resource cost and linked set costs
+ // for an object if one was returned
+ for (
+ LLSD::array_iterator iter = mObjectIDs.beginArray();
+ iter != mObjectIDs.endArray();
+ ++iter)
+ {
+ LLUUID object_id = iter->asUUID();
+
+ // Check to see if the request contains data for the object
+ if ( content.has(iter->asString()) )
+ {
+ const LLSD& data = content[iter->asString()];
+
+ S32 shape_type = data["PhysicsShapeType"].asInteger();
+
+ gObjectList.updatePhysicsShapeType(object_id, shape_type);
+
+ if (data.has("Density"))
+ {
+ F32 density = data["Density"].asReal();
+ F32 friction = data["Friction"].asReal();
+ F32 restitution = data["Restitution"].asReal();
+ F32 gravity_multiplier = data["GravityMultiplier"].asReal();
+
+ gObjectList.updatePhysicsProperties(object_id,
+ density, friction, restitution, gravity_multiplier);
+ }
+ }
+ else
+ {
+ // TODO*: Give user feedback about the missing data?
+ gObjectList.onPhysicsFlagsFetchFailure(object_id);
+ }
+ }
+ }
+
+private:
+ LLSD mObjectIDs;
+};
void LLViewerObjectList::update(LLAgent &agent, LLWorld &world)
{
@@ -681,12 +903,12 @@ void LLViewerObjectList::update(LLAgent &agent, LLWorld &world)
// update global timer
F32 last_time = gFrameTimeSeconds;
- U64 time = totalTime(); // this will become the new gFrameTime when the update is done
+ U64 time = totalTime(); // this will become the new gFrameTime when the update is done
// Time _can_ go backwards, for example if the user changes the system clock.
// It doesn't cause any fatal problems (just some oddness with stats), so we shouldn't assert here.
// llassert(time > gFrameTime);
F64 time_diff = U64_to_F64(time - gFrameTime)/(F64)SEC_TO_MICROSEC;
- gFrameTime = time;
+ gFrameTime = time;
F64 time_since_start = U64_to_F64(gFrameTime - gStartTime)/(F64)SEC_TO_MICROSEC;
gFrameTimeSeconds = (F32)time_since_start;
@@ -736,8 +958,7 @@ void LLViewerObjectList::update(LLAgent &agent, LLWorld &world)
iter != idle_list.end(); iter++)
{
objectp = *iter;
- if (objectp->getPCode() == LLViewerObject::LL_VO_CLOUDS ||
- objectp->isAvatar())
+ if (objectp->isAvatar())
{
objectp->idleUpdate(agent, world, frame_time);
}
@@ -767,9 +988,15 @@ void LLViewerObjectList::update(LLAgent &agent, LLWorld &world)
}
}
+ fetchObjectCosts();
+ fetchPhysicsFlags();
+
mNumSizeCulled = 0;
mNumVisCulled = 0;
+ // update max computed render cost
+ LLVOVolume::updateRenderComplexity();
+
// compute all sorts of time-based stats
// don't factor frames that were paused into the stats
if (! mWasPaused)
@@ -788,7 +1015,7 @@ void LLViewerObjectList::update(LLAgent &agent, LLWorld &world)
{
std::string id_str;
objectp->mID.toString(id_str);
- std::string tmpstr = std::string("Par: ") + id_str;
+ std::string tmpstr = std::string("Par: ") + id_str;
addDebugBeacon(objectp->getPositionAgent(),
tmpstr,
LLColor4(1.f,0.f,0.f,1.f),
@@ -808,12 +1035,12 @@ void LLViewerObjectList::update(LLAgent &agent, LLWorld &world)
std::string tmpstr;
if (objectp->getParent())
{
- tmpstr = std::string("ChP: ") + id_str;
+ tmpstr = std::string("ChP: ") + id_str;
text_color = LLColor4(0.f, 1.f, 0.f, 1.f);
}
else
{
- tmpstr = std::string("ChNoP: ") + id_str;
+ tmpstr = std::string("ChNoP: ") + id_str;
text_color = LLColor4(1.f, 0.f, 0.f, 1.f);
}
id = sIndexAndLocalIDToUUID[oi.mParentInfo];
@@ -832,6 +1059,123 @@ void LLViewerObjectList::update(LLAgent &agent, LLWorld &world)
LLViewerStats::getInstance()->mNumVisCulledStat.addValue(mNumVisCulled);
}
+void LLViewerObjectList::fetchObjectCosts()
+{
+ // issue http request for stale object physics costs
+ if (!mStaleObjectCost.empty())
+ {
+ LLViewerRegion* regionp = gAgent.getRegion();
+
+ if (regionp)
+ {
+ std::string url = regionp->getCapability("GetObjectCost");
+
+ if (!url.empty())
+ {
+ LLSD id_list;
+ U32 object_index = 0;
+
+ U32 count = 0;
+
+ for (
+ std::set<LLUUID>::iterator iter = mStaleObjectCost.begin();
+ iter != mStaleObjectCost.end();
+ )
+ {
+ // Check to see if a request for this object
+ // has already been made.
+ if ( mPendingObjectCost.find(*iter) ==
+ mPendingObjectCost.end() )
+ {
+ mPendingObjectCost.insert(*iter);
+ id_list[object_index++] = *iter;
+ }
+
+ mStaleObjectCost.erase(iter++);
+
+ if (count++ >= 450)
+ {
+ break;
+ }
+ }
+
+ if ( id_list.size() > 0 )
+ {
+ LLSD post_data = LLSD::emptyMap();
+
+ post_data["object_ids"] = id_list;
+ LLHTTPClient::post(
+ url,
+ post_data,
+ new LLObjectCostResponder(id_list));
+ }
+ }
+ else
+ {
+ mStaleObjectCost.clear();
+ mPendingObjectCost.clear();
+ }
+ }
+ }
+}
+
+void LLViewerObjectList::fetchPhysicsFlags()
+{
+ // issue http request for stale object physics flags
+ if (!mStalePhysicsFlags.empty())
+ {
+ LLViewerRegion* regionp = gAgent.getRegion();
+
+ if (regionp)
+ {
+ std::string url = regionp->getCapability("GetObjectPhysicsData");
+
+ if (!url.empty())
+ {
+ LLSD id_list;
+ U32 object_index = 0;
+
+ for (
+ std::set<LLUUID>::iterator iter = mStalePhysicsFlags.begin();
+ iter != mStalePhysicsFlags.end();
+ ++iter)
+ {
+ // Check to see if a request for this object
+ // has already been made.
+ if ( mPendingPhysicsFlags.find(*iter) ==
+ mPendingPhysicsFlags.end() )
+ {
+ mPendingPhysicsFlags.insert(*iter);
+ id_list[object_index++] = *iter;
+ }
+ }
+
+ // id_list should now contain all
+ // requests in mStalePhysicsFlags before, so clear
+ // it now
+ mStalePhysicsFlags.clear();
+
+ if ( id_list.size() > 0 )
+ {
+ LLSD post_data = LLSD::emptyMap();
+
+ post_data["object_ids"] = id_list;
+ LLHTTPClient::post(
+ url,
+ post_data,
+ new LLPhysicsFlagsResponder(id_list));
+ }
+ }
+ else
+ {
+ mStalePhysicsFlags.clear();
+ mPendingPhysicsFlags.clear();
+ }
+ }
+ }
+}
+
+
void LLViewerObjectList::clearDebugText()
{
for (vobj_list_t::iterator iter = mObjects.begin(); iter != mObjects.end(); ++iter)
@@ -844,13 +1188,14 @@ void LLViewerObjectList::clearDebugText()
void LLViewerObjectList::cleanupReferences(LLViewerObject *objectp)
{
LLMemType mt(LLMemType::MTYPE_OBJECT);
- if (mDeadObjects.count(objectp->mID))
+ if (mDeadObjects.find(objectp->mID) != mDeadObjects.end())
{
- llinfos << "Object " << objectp->mID << " already on dead list, ignoring cleanup!" << llendl;
- return;
+ llinfos << "Object " << objectp->mID << " already on dead list!" << llendl;
+ }
+ else
+ {
+ mDeadObjects.insert(objectp->mID);
}
-
- mDeadObjects.insert(std::pair<LLUUID, LLPointer<LLViewerObject> >(objectp->mID, objectp));
// Cleanup any references we have to this object
// Remove from object map so noone can look it up.
@@ -864,7 +1209,7 @@ void LLViewerObjectList::cleanupReferences(LLViewerObject *objectp)
// << objectp->getRegion()->getHost().getPort() << llendl;
//}
- removeFromLocalIDTable(*objectp);
+ removeFromLocalIDTable(objectp);
if (objectp->onActiveList())
{
@@ -885,8 +1230,12 @@ void LLViewerObjectList::cleanupReferences(LLViewerObject *objectp)
mNumDeadObjects++;
}
+static LLFastTimer::DeclareTimer FTM_REMOVE_DRAWABLE("Remove Drawable");
+
void LLViewerObjectList::removeDrawable(LLDrawable* drawablep)
{
+ LLFastTimer t(FTM_REMOVE_DRAWABLE);
+
if (!drawablep)
{
return;
@@ -909,7 +1258,8 @@ void LLViewerObjectList::removeDrawable(LLDrawable* drawablep)
BOOL LLViewerObjectList::killObject(LLViewerObject *objectp)
{
// Don't ever kill gAgentAvatarp, just force it to the agent's region
- if (objectp == gAgentAvatarp)
+ // unless region is NULL which is assumed to mean you are logging out.
+ if ((objectp == gAgentAvatarp) && gAgent.getRegion())
{
objectp->setRegion(gAgent.getRegion());
return FALSE;
@@ -932,6 +1282,7 @@ BOOL LLViewerObjectList::killObject(LLViewerObject *objectp)
return TRUE;
}
+
return FALSE;
}
@@ -998,18 +1349,29 @@ void LLViewerObjectList::cleanDeadObjects(BOOL use_timer)
S32 num_removed = 0;
LLViewerObject *objectp;
- for (vobj_list_t::iterator iter = mObjects.begin(); iter != mObjects.end(); )
+
+ vobj_list_t::reverse_iterator target = mObjects.rbegin();
+
+ vobj_list_t::iterator iter = mObjects.begin();
+ for ( ; iter != mObjects.end(); )
{
- // Scan for all of the dead objects and remove any "global" references to them.
+ // Scan for all of the dead objects and put them all on the end of the list with no ref count ops
objectp = *iter;
+ if (objectp == NULL)
+ { //we caught up to the dead tail
+ break;
+ }
+
if (objectp->isDead())
{
- iter = mObjects.erase(iter);
+ LLPointer<LLViewerObject>::swap(*iter, *target);
+ *target = NULL;
+ ++target;
num_removed++;
- if (num_removed == mNumDeadObjects)
+ if (num_removed == mNumDeadObjects || iter->isNull())
{
- // We've cleaned up all of the dead objects.
+ // We've cleaned up all of the dead objects or caught up to the dead tail
break;
}
}
@@ -1019,6 +1381,11 @@ void LLViewerObjectList::cleanDeadObjects(BOOL use_timer)
}
}
+ llassert(num_removed == mNumDeadObjects);
+
+ //erase as a block
+ mObjects.erase(mObjects.begin()+(mObjects.size()-mNumDeadObjects), mObjects.end());
+
// We've cleaned the global object list, now let's do some paranoia testing on objects
// before blowing away the dead list.
mDeadObjects.clear();
@@ -1051,7 +1418,73 @@ void LLViewerObjectList::updateActive(LLViewerObject *objectp)
}
}
+void LLViewerObjectList::updateObjectCost(LLViewerObject* object)
+{
+ if (!object->isRoot())
+ { //always fetch cost for the parent when fetching cost for children
+ mStaleObjectCost.insert(((LLViewerObject*)object->getParent())->getID());
+ }
+ mStaleObjectCost.insert(object->getID());
+}
+void LLViewerObjectList::updateObjectCost(const LLUUID& object_id, F32 object_cost, F32 link_cost, F32 physics_cost, F32 link_physics_cost)
+{
+ mPendingObjectCost.erase(object_id);
+
+ LLViewerObject* object = findObject(object_id);
+ if (object)
+ {
+ object->setObjectCost(object_cost);
+ object->setLinksetCost(link_cost);
+ object->setPhysicsCost(physics_cost);
+ object->setLinksetPhysicsCost(link_physics_cost);
+ }
+}
+
+void LLViewerObjectList::onObjectCostFetchFailure(const LLUUID& object_id)
+{
+ //llwarns << "Failed to fetch object cost for object: " << object_id << llendl;
+ mPendingObjectCost.erase(object_id);
+}
+
+void LLViewerObjectList::updatePhysicsFlags(const LLViewerObject* object)
+{
+ mStalePhysicsFlags.insert(object->getID());
+}
+
+void LLViewerObjectList::updatePhysicsShapeType(const LLUUID& object_id, S32 type)
+{
+ mPendingPhysicsFlags.erase(object_id);
+ LLViewerObject* object = findObject(object_id);
+ if (object)
+ {
+ object->setPhysicsShapeType(type);
+ }
+}
+
+void LLViewerObjectList::updatePhysicsProperties(const LLUUID& object_id,
+ F32 density,
+ F32 friction,
+ F32 restitution,
+ F32 gravity_multiplier)
+{
+ mPendingPhysicsFlags.erase(object_id);
+
+ LLViewerObject* object = findObject(object_id);
+ if (object)
+ {
+ object->setPhysicsDensity(density);
+ object->setPhysicsFriction(friction);
+ object->setPhysicsGravity(gravity_multiplier);
+ object->setPhysicsRestitution(restitution);
+ }
+}
+
+void LLViewerObjectList::onPhysicsFlagsFetchFailure(const LLUUID& object_id)
+{
+ //llwarns << "Failed to fetch physics flags for object: " << object_id << llendl;
+ mPendingPhysicsFlags.erase(object_id);
+}
void LLViewerObjectList::shiftObjects(const LLVector3 &offset)
{
@@ -1059,7 +1492,7 @@ void LLViewerObjectList::shiftObjects(const LLVector3 &offset)
// We need to update many object caches, I'll document this more as I dig through the code
// cleaning things out...
- if (gNoRender || 0 == offset.magVecSquared())
+ if (0 == offset.magVecSquared())
{
return;
}
@@ -1084,6 +1517,80 @@ void LLViewerObjectList::shiftObjects(const LLVector3 &offset)
LLWorld::getInstance()->shiftRegions(offset);
}
+void LLViewerObjectList::repartitionObjects()
+{
+ for (vobj_list_t::iterator iter = mObjects.begin(); iter != mObjects.end(); ++iter)
+ {
+ LLViewerObject* objectp = *iter;
+ if (!objectp->isDead())
+ {
+ LLDrawable* drawable = objectp->mDrawable;
+ if (drawable && !drawable->isDead())
+ {
+ drawable->updateBinRadius();
+ drawable->updateSpatialExtents();
+ drawable->movePartition();
+ }
+ }
+ }
+}
+
+//debug code
+bool LLViewerObjectList::hasMapObjectInRegion(LLViewerRegion* regionp)
+{
+ for (vobj_list_t::iterator iter = mMapObjects.begin(); iter != mMapObjects.end(); ++iter)
+ {
+ LLViewerObject* objectp = *iter;
+
+ if(objectp->isDead() || objectp->getRegion() == regionp)
+ {
+ return true ;
+ }
+ }
+
+ return false ;
+}
+
+//make sure the region is cleaned up.
+void LLViewerObjectList::clearAllMapObjectsInRegion(LLViewerRegion* regionp)
+{
+ std::set<LLViewerObject*> dead_object_list ;
+ std::set<LLViewerObject*> region_object_list ;
+ for (vobj_list_t::iterator iter = mMapObjects.begin(); iter != mMapObjects.end(); ++iter)
+ {
+ LLViewerObject* objectp = *iter;
+
+ if(objectp->isDead())
+ {
+ dead_object_list.insert(objectp) ;
+ }
+ else if(objectp->getRegion() == regionp)
+ {
+ region_object_list.insert(objectp) ;
+ }
+ }
+
+ if(dead_object_list.size() > 0)
+ {
+ llwarns << "There are " << dead_object_list.size() << " dead objects on the map!" << llendl ;
+
+ for(std::set<LLViewerObject*>::iterator iter = dead_object_list.begin(); iter != dead_object_list.end(); ++iter)
+ {
+ cleanupReferences(*iter) ;
+ }
+ }
+ if(region_object_list.size() > 0)
+ {
+ llwarns << "There are " << region_object_list.size() << " objects not removed from the deleted region!" << llendl ;
+
+ for(std::set<LLViewerObject*>::iterator iter = region_object_list.begin(); iter != region_object_list.end(); ++iter)
+ {
+ (*iter)->markDead() ;
+ }
+ }
+}
+
+
void LLViewerObjectList::renderObjectsForMap(LLNetMap &netmap)
{
LLColor4 above_water_color = LLUIColorTable::instance().getColor( "NetMapOtherOwnAboveWater" );
@@ -1102,6 +1609,12 @@ void LLViewerObjectList::renderObjectsForMap(LLNetMap &netmap)
for (vobj_list_t::iterator iter = mMapObjects.begin(); iter != mMapObjects.end(); ++iter)
{
LLViewerObject* objectp = *iter;
+
+ if(objectp->isDead())//some dead objects somehow not cleaned.
+ {
+ continue ;
+ }
+
if (!objectp->getRegion() || objectp->isOrphaned() || objectp->isAttachment())
{
continue;
@@ -1389,7 +1902,7 @@ LLViewerObject *LLViewerObjectList::replaceObject(const LLUUID &id, const LLPCod
LLViewerObject *old_instance = findObject(id);
if (old_instance)
{
- cleanupReferences(old_instance);
+ //cleanupReferences(old_instance);
old_instance->markDead();
return createObject(pcode, regionp, id, old_instance->getLocalID(), LLHost());
@@ -1465,11 +1978,6 @@ void LLViewerObjectList::orphanize(LLViewerObject *childp, U32 parent_id, U32 ip
void LLViewerObjectList::findOrphans(LLViewerObject* objectp, U32 ip, U32 port)
{
- if (gNoRender)
- {
- return;
- }
-
if (objectp->isDead())
{
llwarns << "Trying to find orphans for dead obj " << objectp->mID
@@ -1519,8 +2027,8 @@ void LLViewerObjectList::findOrphans(LLViewerObject* objectp, U32 ip, U32 port)
llinfos << "Agent: " << objectp->getPositionAgent() << llendl;
addDebugBeacon(objectp->getPositionAgent(),"");
#endif
- gPipeline.markMoved(objectp->mDrawable);
- objectp->setChanged(LLXform::MOVED | LLXform::SILHOUETTE);
+ gPipeline.markMoved(objectp->mDrawable);
+ objectp->setChanged(LLXform::MOVED | LLXform::SILHOUETTE);
// Flag the object as no longer orphaned
childp->mOrphaned = FALSE;
diff --git a/indra/newview/llviewerobjectlist.h b/indra/newview/llviewerobjectlist.h
index 605bac8e89..c5f2a2c1ee 100644
--- a/indra/newview/llviewerobjectlist.h
+++ b/indra/newview/llviewerobjectlist.h
@@ -85,8 +85,27 @@ public:
void updateApparentAngles(LLAgent &agent);
void update(LLAgent &agent, LLWorld &world);
+ void fetchObjectCosts();
+ void fetchPhysicsFlags();
+
+ void updateObjectCost(LLViewerObject* object);
+ void updateObjectCost(const LLUUID& object_id, F32 object_cost, F32 link_cost, F32 physics_cost, F32 link_physics_cost);
+ void onObjectCostFetchFailure(const LLUUID& object_id);
+
+ void updatePhysicsFlags(const LLViewerObject* object);
+ void onPhysicsFlagsFetchFailure(const LLUUID& object_id);
+ void updatePhysicsShapeType(const LLUUID& object_id, S32 type);
+ void updatePhysicsProperties(const LLUUID& object_id,
+ F32 density,
+ F32 friction,
+ F32 restitution,
+ F32 gravity_multiplier);
+
void shiftObjects(const LLVector3 &offset);
+ void repartitionObjects();
+ bool hasMapObjectInRegion(LLViewerRegion* regionp) ;
+ void clearAllMapObjectsInRegion(LLViewerRegion* regionp) ;
void renderObjectsForMap(LLNetMap &netmap);
void renderObjectBounds(const LLVector3 &center);
@@ -160,7 +179,7 @@ public:
const U32 ip,
const U32 port); // Requires knowledge of message system info!
- static BOOL removeFromLocalIDTable(const LLViewerObject &object);
+ static BOOL removeFromLocalIDTable(const LLViewerObject* objectp);
// Used ONLY by the orphaned object code.
static U64 getIndex(const U32 local_id, const U32 ip, const U32 port);
@@ -180,11 +199,18 @@ protected:
vobj_list_t mMapObjects;
- typedef std::map<LLUUID, LLPointer<LLViewerObject> > vo_map;
- vo_map mDeadObjects; // Need to keep multiple entries per UUID
+ std::set<LLUUID> mDeadObjects;
std::map<LLUUID, LLPointer<LLViewerObject> > mUUIDObjectMap;
+ //set of objects that need to update their cost
+ std::set<LLUUID> mStaleObjectCost;
+ std::set<LLUUID> mPendingObjectCost;
+
+ //set of objects that need to update their physics flags
+ std::set<LLUUID> mStalePhysicsFlags;
+ std::set<LLUUID> mPendingPhysicsFlags;
+
std::vector<LLDebugBeacon> mDebugBeacons;
S32 mCurLazyUpdateIndex;
diff --git a/indra/newview/llviewerparcelmedia.cpp b/indra/newview/llviewerparcelmedia.cpp
index 99e869dafc..90fbc41daa 100644
--- a/indra/newview/llviewerparcelmedia.cpp
+++ b/indra/newview/llviewerparcelmedia.cpp
@@ -485,6 +485,12 @@ void LLViewerParcelMedia::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent
{
switch(event)
{
+ case MEDIA_EVENT_DEBUG_MESSAGE:
+ {
+ // LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_DEBUG_MESSAGE " << LL_ENDL;
+ };
+ break;
+
case MEDIA_EVENT_CONTENT_UPDATED:
{
// LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_CONTENT_UPDATED " << LL_ENDL;
@@ -539,6 +545,12 @@ void LLViewerParcelMedia::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent
};
break;
+ case MEDIA_EVENT_NAVIGATE_ERROR_PAGE:
+ {
+ LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_NAVIGATE_ERROR_PAGE" << LL_ENDL;
+ };
+ break;
+
case MEDIA_EVENT_CLICK_LINK_HREF:
{
LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_CLICK_LINK_HREF, target is \"" << self->getClickTarget() << "\", uri is " << self->getClickURL() << LL_ENDL;
@@ -586,6 +598,18 @@ void LLViewerParcelMedia::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent
LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_GEOMETRY_CHANGE, uuid is " << self->getClickUUID() << LL_ENDL;
}
break;
+
+ case MEDIA_EVENT_AUTH_REQUEST:
+ {
+ LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_AUTH_REQUEST, url " << self->getAuthURL() << ", realm " << self->getAuthRealm() << LL_ENDL;
+ }
+ break;
+
+ case MEDIA_EVENT_LINK_HOVERED:
+ {
+ LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_LINK_HOVERED, hover text is: " << self->getHoverText() << LL_ENDL;
+ };
+ break;
};
}
diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp
index 11de377410..9db784101d 100644
--- a/indra/newview/llviewerparcelmgr.cpp
+++ b/indra/newview/llviewerparcelmgr.cpp
@@ -42,6 +42,7 @@
// Viewer includes
#include "llagent.h"
+#include "llagentaccess.h"
#include "llviewerwindow.h"
#include "llviewercontrol.h"
//#include "llfirstuse.h"
@@ -54,6 +55,7 @@
#include "llresmgr.h"
#include "llsdutil.h"
#include "llsdutil_math.h"
+#include "llslurl.h"
#include "llstatusbar.h"
#include "llui.h"
#include "llviewertexture.h"
@@ -65,6 +67,7 @@
#include "llworld.h"
#include "roles_constants.h"
#include "llweb.h"
+#include "llvieweraudio.h"
const F32 PARCEL_COLLISION_DRAW_SECS = 1.f;
@@ -111,7 +114,7 @@ LLViewerParcelMgr::LLViewerParcelMgr()
mRequestResult(0),
mWestSouth(),
mEastNorth(),
- mSelectedDwell(0.f),
+ mSelectedDwell(DWELL_NAN),
mAgentParcelSequenceID(-1),
mHoverRequestResult(0),
mHoverWestSouth(),
@@ -231,7 +234,7 @@ void LLViewerParcelMgr::getDisplayInfo(S32* area_out, S32* claim_out,
S32 price = 0;
S32 rent = 0;
BOOL for_sale = FALSE;
- F32 dwell = 0.f;
+ F32 dwell = DWELL_NAN;
if (mSelected)
{
@@ -577,7 +580,7 @@ void LLViewerParcelMgr::deselectLand()
mCurrentParcel->mBanList.clear();
//mCurrentParcel->mRenterList.reset();
- mSelectedDwell = 0.f;
+ mSelectedDwell = DWELL_NAN;
// invalidate parcel selection so that existing users of this selection can clean up
mCurrentParcelSelection->setParcel(NULL);
@@ -850,7 +853,7 @@ LLParcel* LLViewerParcelMgr::getCollisionParcel() const
void LLViewerParcelMgr::render()
{
- if (mSelected && mRenderSelection)
+ if (mSelected && mRenderSelection && gSavedSettings.getBOOL("RenderParcelSelection"))
{
// Rendering is done in agent-coordinates, so need to supply
// an appropriate offset to the render code.
@@ -1383,11 +1386,6 @@ void LLViewerParcelMgr::setHoverParcel(const LLVector3d& pos)
// static
void LLViewerParcelMgr::processParcelOverlay(LLMessageSystem *msg, void **user)
{
- if (gNoRender)
- {
- return;
- }
-
// Extract the packed overlay information
S32 packed_overlay_size = msg->getSizeFast(_PREHASH_ParcelData, _PREHASH_Data);
@@ -1460,6 +1458,8 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
S32 other_clean_time = 0;
+ LLViewerParcelMgr& parcel_mgr = LLViewerParcelMgr::instance();
+
msg->getS32Fast(_PREHASH_ParcelData, _PREHASH_RequestResult, request_result );
msg->getS32Fast(_PREHASH_ParcelData, _PREHASH_SequenceID, sequence_id );
@@ -1475,31 +1475,31 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
if (sequence_id == SELECTED_PARCEL_SEQ_ID)
{
// ...selected parcels report this sequence id
- LLViewerParcelMgr::getInstance()->mRequestResult = PARCEL_RESULT_SUCCESS;
- parcel = LLViewerParcelMgr::getInstance()->mCurrentParcel;
+ parcel_mgr.mRequestResult = PARCEL_RESULT_SUCCESS;
+ parcel = parcel_mgr.mCurrentParcel;
}
else if (sequence_id == HOVERED_PARCEL_SEQ_ID)
{
- LLViewerParcelMgr::getInstance()->mHoverRequestResult = PARCEL_RESULT_SUCCESS;
- parcel = LLViewerParcelMgr::getInstance()->mHoverParcel;
+ parcel_mgr.mHoverRequestResult = PARCEL_RESULT_SUCCESS;
+ parcel = parcel_mgr.mHoverParcel;
}
else if (sequence_id == COLLISION_NOT_IN_GROUP_PARCEL_SEQ_ID ||
sequence_id == COLLISION_NOT_ON_LIST_PARCEL_SEQ_ID ||
sequence_id == COLLISION_BANNED_PARCEL_SEQ_ID)
{
- LLViewerParcelMgr::getInstance()->mHoverRequestResult = PARCEL_RESULT_SUCCESS;
- parcel = LLViewerParcelMgr::getInstance()->mCollisionParcel;
+ parcel_mgr.mHoverRequestResult = PARCEL_RESULT_SUCCESS;
+ parcel = parcel_mgr.mCollisionParcel;
}
- else if (sequence_id == 0 || sequence_id > LLViewerParcelMgr::getInstance()->mAgentParcelSequenceID)
+ else if (sequence_id == 0 || sequence_id > parcel_mgr.mAgentParcelSequenceID)
{
// new agent parcel
- LLViewerParcelMgr::getInstance()->mAgentParcelSequenceID = sequence_id;
- parcel = LLViewerParcelMgr::getInstance()->mAgentParcel;
+ parcel_mgr.mAgentParcelSequenceID = sequence_id;
+ parcel = parcel_mgr.mAgentParcel;
}
else
{
llinfos << "out of order agent parcel sequence id " << sequence_id
- << " last good " << LLViewerParcelMgr::getInstance()->mAgentParcelSequenceID
+ << " last good " << parcel_mgr.mAgentParcelSequenceID
<< llendl;
return;
}
@@ -1570,15 +1570,15 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
parcel->setRegionDenyAgeUnverifiedOverride(region_deny_age_unverified_override);
parcel->unpackMessage(msg);
- if (parcel == LLViewerParcelMgr::getInstance()->mAgentParcel)
+ if (parcel == parcel_mgr.mAgentParcel)
{
- S32 bitmap_size = LLViewerParcelMgr::getInstance()->mParcelsPerEdge
- * LLViewerParcelMgr::getInstance()->mParcelsPerEdge
+ S32 bitmap_size = parcel_mgr.mParcelsPerEdge
+ * parcel_mgr.mParcelsPerEdge
/ 8;
U8* bitmap = new U8[ bitmap_size ];
msg->getBinaryDataFast(_PREHASH_ParcelData, _PREHASH_Bitmap, bitmap, bitmap_size);
- LLViewerParcelMgr::getInstance()->writeAgentParcelFromBitmap(bitmap);
+ parcel_mgr.writeAgentParcelFromBitmap(bitmap);
delete[] bitmap;
// Let interesting parties know about agent parcel change.
@@ -1598,11 +1598,11 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
if (sequence_id == SELECTED_PARCEL_SEQ_ID)
{
// Update selected counts
- LLViewerParcelMgr::getInstance()->mCurrentParcelSelection->mSelectedSelfCount = self_count;
- LLViewerParcelMgr::getInstance()->mCurrentParcelSelection->mSelectedOtherCount = other_count;
- LLViewerParcelMgr::getInstance()->mCurrentParcelSelection->mSelectedPublicCount = public_count;
+ parcel_mgr.mCurrentParcelSelection->mSelectedSelfCount = self_count;
+ parcel_mgr.mCurrentParcelSelection->mSelectedOtherCount = other_count;
+ parcel_mgr.mCurrentParcelSelection->mSelectedPublicCount = public_count;
- LLViewerParcelMgr::getInstance()->mCurrentParcelSelection->mSelectedMultipleOwners =
+ parcel_mgr.mCurrentParcelSelection->mSelectedMultipleOwners =
(request_result == PARCEL_RESULT_MULTIPLE);
// Select the whole parcel
@@ -1613,67 +1613,67 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
{
// don't muck with the westsouth and eastnorth.
// just highlight it
- LLVector3 west_south = region->getPosRegionFromGlobal(LLViewerParcelMgr::getInstance()->mWestSouth);
- LLVector3 east_north = region->getPosRegionFromGlobal(LLViewerParcelMgr::getInstance()->mEastNorth);
+ LLVector3 west_south = region->getPosRegionFromGlobal(parcel_mgr.mWestSouth);
+ LLVector3 east_north = region->getPosRegionFromGlobal(parcel_mgr.mEastNorth);
- LLViewerParcelMgr::getInstance()->resetSegments(LLViewerParcelMgr::getInstance()->mHighlightSegments);
- LLViewerParcelMgr::getInstance()->writeHighlightSegments(
+ parcel_mgr.resetSegments(parcel_mgr.mHighlightSegments);
+ parcel_mgr.writeHighlightSegments(
west_south.mV[VX],
west_south.mV[VY],
east_north.mV[VX],
east_north.mV[VY] );
- LLViewerParcelMgr::getInstance()->mCurrentParcelSelection->mWholeParcelSelected = FALSE;
+ parcel_mgr.mCurrentParcelSelection->mWholeParcelSelected = FALSE;
}
else if (0 == local_id)
{
// this is public land, just highlight the selection
- LLViewerParcelMgr::getInstance()->mWestSouth = region->getPosGlobalFromRegion( aabb_min );
- LLViewerParcelMgr::getInstance()->mEastNorth = region->getPosGlobalFromRegion( aabb_max );
+ parcel_mgr.mWestSouth = region->getPosGlobalFromRegion( aabb_min );
+ parcel_mgr.mEastNorth = region->getPosGlobalFromRegion( aabb_max );
- LLViewerParcelMgr::getInstance()->resetSegments(LLViewerParcelMgr::getInstance()->mHighlightSegments);
- LLViewerParcelMgr::getInstance()->writeHighlightSegments(
+ parcel_mgr.resetSegments(parcel_mgr.mHighlightSegments);
+ parcel_mgr.writeHighlightSegments(
aabb_min.mV[VX],
aabb_min.mV[VY],
aabb_max.mV[VX],
aabb_max.mV[VY] );
- LLViewerParcelMgr::getInstance()->mCurrentParcelSelection->mWholeParcelSelected = TRUE;
+ parcel_mgr.mCurrentParcelSelection->mWholeParcelSelected = TRUE;
}
else
{
- LLViewerParcelMgr::getInstance()->mWestSouth = region->getPosGlobalFromRegion( aabb_min );
- LLViewerParcelMgr::getInstance()->mEastNorth = region->getPosGlobalFromRegion( aabb_max );
+ parcel_mgr.mWestSouth = region->getPosGlobalFromRegion( aabb_min );
+ parcel_mgr.mEastNorth = region->getPosGlobalFromRegion( aabb_max );
// Owned land, highlight the boundaries
- S32 bitmap_size = LLViewerParcelMgr::getInstance()->mParcelsPerEdge
- * LLViewerParcelMgr::getInstance()->mParcelsPerEdge
+ S32 bitmap_size = parcel_mgr.mParcelsPerEdge
+ * parcel_mgr.mParcelsPerEdge
/ 8;
U8* bitmap = new U8[ bitmap_size ];
msg->getBinaryDataFast(_PREHASH_ParcelData, _PREHASH_Bitmap, bitmap, bitmap_size);
- LLViewerParcelMgr::getInstance()->resetSegments(LLViewerParcelMgr::getInstance()->mHighlightSegments);
- LLViewerParcelMgr::getInstance()->writeSegmentsFromBitmap( bitmap, LLViewerParcelMgr::getInstance()->mHighlightSegments );
+ parcel_mgr.resetSegments(parcel_mgr.mHighlightSegments);
+ parcel_mgr.writeSegmentsFromBitmap( bitmap, parcel_mgr.mHighlightSegments );
delete[] bitmap;
bitmap = NULL;
- LLViewerParcelMgr::getInstance()->mCurrentParcelSelection->mWholeParcelSelected = TRUE;
+ parcel_mgr.mCurrentParcelSelection->mWholeParcelSelected = TRUE;
}
// Request access list information for this land
- LLViewerParcelMgr::getInstance()->sendParcelAccessListRequest(AL_ACCESS | AL_BAN);
+ parcel_mgr.sendParcelAccessListRequest(AL_ACCESS | AL_BAN);
// Request the media url filter list for this land
- LLViewerParcelMgr::getInstance()->requestParcelMediaURLFilter();
+ parcel_mgr.requestParcelMediaURLFilter();
// Request dwell for this land, if it's not public land.
- LLViewerParcelMgr::getInstance()->mSelectedDwell = 0.f;
+ parcel_mgr.mSelectedDwell = DWELL_NAN;
if (0 != local_id)
{
- LLViewerParcelMgr::getInstance()->sendParcelDwellRequest();
+ parcel_mgr.sendParcelDwellRequest();
}
- LLViewerParcelMgr::getInstance()->mSelected = TRUE;
- LLViewerParcelMgr::getInstance()->notifyObservers();
+ parcel_mgr.mSelected = TRUE;
+ parcel_mgr.notifyObservers();
}
}
else if (sequence_id == COLLISION_NOT_IN_GROUP_PARCEL_SEQ_ID ||
@@ -1681,32 +1681,32 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
sequence_id == COLLISION_BANNED_PARCEL_SEQ_ID)
{
// We're about to collide with this parcel
- LLViewerParcelMgr::getInstance()->mRenderCollision = TRUE;
- LLViewerParcelMgr::getInstance()->mCollisionTimer.reset();
+ parcel_mgr.mRenderCollision = TRUE;
+ parcel_mgr.mCollisionTimer.reset();
// Differentiate this parcel if we are banned from it.
if (sequence_id == COLLISION_BANNED_PARCEL_SEQ_ID)
{
- LLViewerParcelMgr::getInstance()->mCollisionBanned = BA_BANNED;
+ parcel_mgr.mCollisionBanned = BA_BANNED;
}
else if (sequence_id == COLLISION_NOT_IN_GROUP_PARCEL_SEQ_ID)
{
- LLViewerParcelMgr::getInstance()->mCollisionBanned = BA_NOT_IN_GROUP;
+ parcel_mgr.mCollisionBanned = BA_NOT_IN_GROUP;
}
else
{
- LLViewerParcelMgr::getInstance()->mCollisionBanned = BA_NOT_ON_LIST;
+ parcel_mgr.mCollisionBanned = BA_NOT_ON_LIST;
}
- S32 bitmap_size = LLViewerParcelMgr::getInstance()->mParcelsPerEdge
- * LLViewerParcelMgr::getInstance()->mParcelsPerEdge
+ S32 bitmap_size = parcel_mgr.mParcelsPerEdge
+ * parcel_mgr.mParcelsPerEdge
/ 8;
U8* bitmap = new U8[ bitmap_size ];
msg->getBinaryDataFast(_PREHASH_ParcelData, _PREHASH_Bitmap, bitmap, bitmap_size);
- LLViewerParcelMgr::getInstance()->resetSegments(LLViewerParcelMgr::getInstance()->mCollisionSegments);
- LLViewerParcelMgr::getInstance()->writeSegmentsFromBitmap( bitmap, LLViewerParcelMgr::getInstance()->mCollisionSegments );
+ parcel_mgr.resetSegments(parcel_mgr.mCollisionSegments);
+ parcel_mgr.writeSegmentsFromBitmap( bitmap, parcel_mgr.mCollisionSegments );
delete[] bitmap;
bitmap = NULL;
@@ -1717,18 +1717,21 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
LLViewerRegion *region = LLWorld::getInstance()->getRegion( msg->getSender() );
if (region)
{
- LLViewerParcelMgr::getInstance()->mHoverWestSouth = region->getPosGlobalFromRegion( aabb_min );
- LLViewerParcelMgr::getInstance()->mHoverEastNorth = region->getPosGlobalFromRegion( aabb_max );
+ parcel_mgr.mHoverWestSouth = region->getPosGlobalFromRegion( aabb_min );
+ parcel_mgr.mHoverEastNorth = region->getPosGlobalFromRegion( aabb_max );
}
else
{
- LLViewerParcelMgr::getInstance()->mHoverWestSouth.clearVec();
- LLViewerParcelMgr::getInstance()->mHoverEastNorth.clearVec();
+ parcel_mgr.mHoverWestSouth.clearVec();
+ parcel_mgr.mHoverEastNorth.clearVec();
}
}
else
{
- // look for music.
+ // Check for video
+ LLViewerParcelMedia::update(parcel);
+
+ // Then check for music
if (gAudiop)
{
if (parcel)
@@ -1739,53 +1742,40 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
std::string music_url = music_url_raw;
LLStringUtil::trim(music_url);
- // On entering a new parcel, stop the last stream if the
- // new parcel has a different music url. (Empty URL counts
- // as different.)
- const std::string& stream_url = gAudiop->getInternetStreamURL();
-
- if (music_url.empty() || music_url != stream_url)
+ // If there is a new music URL and it's valid, play it.
+ if (music_url.size() > 12)
{
- // URL is different from one currently playing.
- gAudiop->stopInternetStream();
-
- // If there is a new music URL and it's valid, play it.
- if (music_url.size() > 12)
+ if (music_url.substr(0,7) == "http://")
{
- if (music_url.substr(0,7) == "http://")
- {
- optionally_start_music(music_url);
- }
- else
- {
- llinfos << "Stopping parcel music (invalid audio stream URL)" << llendl;
- // clears the URL
- gAudiop->startInternetStream(LLStringUtil::null);
- }
+ optionally_start_music(music_url);
}
- else if (!gAudiop->getInternetStreamURL().empty())
+ else
{
- llinfos << "Stopping parcel music (parcel stream URL is empty)" << llendl;
- gAudiop->startInternetStream(LLStringUtil::null);
+ llinfos << "Stopping parcel music (invalid audio stream URL)" << llendl;
+ // clears the URL
+ // null value causes fade out
+ LLViewerAudio::getInstance()->startInternetStreamWithAutoFade(LLStringUtil::null);
}
}
+ else if (!gAudiop->getInternetStreamURL().empty())
+ {
+ llinfos << "Stopping parcel music (parcel stream URL is empty)" << llendl;
+ // null value causes fade out
+ LLViewerAudio::getInstance()->startInternetStreamWithAutoFade(LLStringUtil::null);
+ }
}
else
{
// Public land has no music
- gAudiop->stopInternetStream();
+ LLViewerAudio::getInstance()->stopInternetStreamWithAutoFade();
}
}//if gAudiop
-
- // now check for video
- LLViewerParcelMedia::update( parcel );
};
}
void optionally_start_music(const std::string& music_url)
{
- if (gSavedSettings.getBOOL("AudioStreamingMusic") &&
- gSavedSettings.getBOOL("AudioStreamingMedia"))
+ if (gSavedSettings.getBOOL("AudioStreamingMusic"))
{
// only play music when you enter a new parcel if the UI control for this
// was not *explicitly* stopped by the user. (part of SL-4878)
@@ -1798,7 +1788,11 @@ void optionally_start_music(const std::string& music_url)
gSavedSettings.getBOOL("MediaTentativeAutoPlay")))
{
llinfos << "Starting parcel music " << music_url << llendl;
- gAudiop->startInternetStream(music_url);
+ LLViewerAudio::getInstance()->startInternetStreamWithAutoFade(music_url);
+ }
+ else
+ {
+ LLViewerAudio::getInstance()->startInternetStreamWithAutoFade(LLStringUtil::null);
}
}
}
@@ -2206,7 +2200,10 @@ bool LLViewerParcelMgr::canAgentBuyParcel(LLParcel* parcel, bool forGroup) const
= parcelOwner == (forGroup ? gAgent.getGroupID() : gAgent.getID());
bool isAuthorized
- = (authorizeBuyer.isNull() || (gAgent.getID() == authorizeBuyer));
+ = (authorizeBuyer.isNull()
+ || (gAgent.getID() == authorizeBuyer)
+ || (gAgent.hasPowerInGroup(authorizeBuyer,GP_LAND_DEED)
+ && gAgent.hasPowerInGroup(authorizeBuyer,GP_LAND_SET_SALE_INFO)));
return isForSale && !isOwner && isAuthorized && isEmpowered;
}
diff --git a/indra/newview/llviewerparcelmgr.h b/indra/newview/llviewerparcelmgr.h
index 68d8978ea8..cac8d8391c 100644
--- a/indra/newview/llviewerparcelmgr.h
+++ b/indra/newview/llviewerparcelmgr.h
@@ -43,6 +43,8 @@ class LLParcel;
class LLViewerTexture;
class LLViewerRegion;
+const F32 DWELL_NAN = -1.0f; // A dwell having this value will be displayed as Loading...
+
// Constants for sendLandOwner
//const U32 NO_NEIGHBOR_JOIN = 0x0;
//const U32 ALL_NEIGHBOR_JOIN = U32( NORTH_MASK
diff --git a/indra/newview/llviewerparceloverlay.cpp b/indra/newview/llviewerparceloverlay.cpp
index eee653b0c1..a0cf2fc803 100644
--- a/indra/newview/llviewerparceloverlay.cpp
+++ b/indra/newview/llviewerparceloverlay.cpp
@@ -145,6 +145,121 @@ BOOL LLViewerParcelOverlay::isOwnedOther(const LLVector3& pos) const
return (PARCEL_OWNED == overlay || PARCEL_FOR_SALE == overlay);
}
+bool LLViewerParcelOverlay::encroachesOwned(const std::vector<LLBBox>& boxes) const
+{
+ // boxes are expected to already be axis aligned
+ for (U32 i = 0; i < boxes.size(); ++i)
+ {
+ LLVector3 min = boxes[i].getMinAgent();
+ LLVector3 max = boxes[i].getMaxAgent();
+
+ S32 left = S32(llclamp((min.mV[VX] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1));
+ S32 right = S32(llclamp((max.mV[VX] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1));
+ S32 top = S32(llclamp((min.mV[VY] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1));
+ S32 bottom = S32(llclamp((max.mV[VY] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1));
+
+ for (S32 row = top; row <= bottom; row++)
+ {
+ for (S32 column = left; column <= right; column++)
+ {
+ U8 type = ownership(row, column);
+ if ((PARCEL_SELF == type)
+ || (PARCEL_GROUP == type))
+ {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+}
+bool LLViewerParcelOverlay::encroachesOnUnowned(const std::vector<LLBBox>& boxes) const
+{
+ // boxes are expected to already be axis aligned
+ for (U32 i = 0; i < boxes.size(); ++i)
+ {
+ LLVector3 min = boxes[i].getMinAgent();
+ LLVector3 max = boxes[i].getMaxAgent();
+
+ S32 left = S32(llclamp((min.mV[VX] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1));
+ S32 right = S32(llclamp((max.mV[VX] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1));
+ S32 top = S32(llclamp((min.mV[VY] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1));
+ S32 bottom = S32(llclamp((max.mV[VY] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1));
+
+ for (S32 row = top; row <= bottom; row++)
+ {
+ for (S32 column = left; column <= right; column++)
+ {
+ U8 type = ownership(row, column);
+ if ((PARCEL_SELF != type))
+ {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+}
+
+bool LLViewerParcelOverlay::encroachesOnNearbyParcel(const std::vector<LLBBox>& boxes) const
+{
+ // boxes are expected to already be axis aligned
+ for (U32 i = 0; i < boxes.size(); ++i)
+ {
+ LLVector3 min = boxes[i].getMinAgent();
+ LLVector3 max = boxes[i].getMaxAgent();
+
+ // If an object crosses region borders it crosses a parcel
+ if ( min.mV[VX] < 0
+ || min.mV[VY] < 0
+ || max.mV[VX] > REGION_WIDTH_METERS
+ || max.mV[VY] > REGION_WIDTH_METERS)
+ {
+ return true;
+ }
+
+ S32 left = S32(llclamp((min.mV[VX] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1));
+ S32 right = S32(llclamp((max.mV[VX] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1));
+ S32 bottom = S32(llclamp((min.mV[VY] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1));
+ S32 top = S32(llclamp((max.mV[VY] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1));
+
+ const S32 GRIDS_PER_EDGE = mParcelGridsPerEdge;
+
+ for (S32 row = bottom; row <= top; row++)
+ {
+ for (S32 col = left; col <= right; col++)
+ {
+ // This is not the rightmost column
+ if (col < GRIDS_PER_EDGE-1)
+ {
+ U8 east_overlay = mOwnership[row*GRIDS_PER_EDGE+col+1];
+ // If the column to the east of the current one marks
+ // the other parcel's west edge and the box extends
+ // to the west it crosses the parcel border.
+ if ((east_overlay & PARCEL_WEST_LINE) && col < right)
+ {
+ return true;
+ }
+ }
+
+ // This is not the topmost column
+ if (row < GRIDS_PER_EDGE-1)
+ {
+ U8 north_overlay = mOwnership[(row+1)*GRIDS_PER_EDGE+col];
+ // If the row to the north of the current one marks
+ // the other parcel's south edge and the box extends
+ // to the south it crosses the parcel border.
+ if ((north_overlay & PARCEL_SOUTH_LINE) && row < top)
+ {
+ return true;
+ }
+ }
+ }
+ }
+ }
+ return false;
+}
+
BOOL LLViewerParcelOverlay::isSoundLocal(const LLVector3& pos) const
{
S32 row = S32(pos.mV[VY] / PARCEL_GRID_STEP_METERS);
@@ -769,14 +884,14 @@ S32 LLViewerParcelOverlay::renderPropertyLines ()
// Always fudge a little vertically.
pull_toward_camera.mV[VZ] += 0.01f;
- glMatrixMode( GL_MODELVIEW );
- glPushMatrix();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.pushMatrix();
// Move to appropriate region coords
LLVector3 origin = mRegion->getOriginAgent();
- glTranslatef( origin.mV[VX], origin.mV[VY], origin.mV[VZ] );
+ gGL.translatef( origin.mV[VX], origin.mV[VY], origin.mV[VZ] );
- glTranslatef(pull_toward_camera.mV[VX], pull_toward_camera.mV[VY],
+ gGL.translatef(pull_toward_camera.mV[VX], pull_toward_camera.mV[VY],
pull_toward_camera.mV[VZ]);
// Include +1 because vertices are fenceposts.
@@ -804,7 +919,7 @@ S32 LLViewerParcelOverlay::renderPropertyLines ()
U8* colorp;
bool render_hidden = LLSelectMgr::sRenderHiddenSelections && LLFloaterReg::instanceVisible("build");
- const F32 PROPERTY_LINE_CLIP_DIST = 256.f;
+ const F32 PROPERTY_LINE_CLIP_DIST_SQUARED = 256.f * 256.f;
for (i = 0; i < mVertexCount; i += vertex_per_edge)
{
@@ -815,7 +930,7 @@ S32 LLViewerParcelOverlay::renderPropertyLines ()
vertex.mV[VY] = *(vertexp+1);
vertex.mV[VZ] = *(vertexp+2);
- if (dist_vec_squared2D(vertex, camera_region) > PROPERTY_LINE_CLIP_DIST*PROPERTY_LINE_CLIP_DIST)
+ if (dist_vec_squared2D(vertex, camera_region) > PROPERTY_LINE_CLIP_DIST_SQUARED)
{
continue;
}
@@ -875,7 +990,7 @@ S32 LLViewerParcelOverlay::renderPropertyLines ()
}
- glPopMatrix();
+ gGL.popMatrix();
return drawn;
}
diff --git a/indra/newview/llviewerparceloverlay.h b/indra/newview/llviewerparceloverlay.h
index 61be220312..7445d5bf1d 100644
--- a/indra/newview/llviewerparceloverlay.h
+++ b/indra/newview/llviewerparceloverlay.h
@@ -30,6 +30,7 @@
// The ownership data for land parcels.
// One of these structures per region.
+#include "llbbox.h"
#include "lldarray.h"
#include "llframetimer.h"
#include "lluuid.h"
@@ -54,6 +55,14 @@ public:
BOOL isOwnedSelf(const LLVector3& pos) const;
BOOL isOwnedGroup(const LLVector3& pos) const;
BOOL isOwnedOther(const LLVector3& pos) const;
+
+ // "encroaches" means the prim hangs over the parcel, but its center
+ // might be in another parcel. for now, we simply test axis aligned
+ // bounding boxes which isn't perfect, but is close
+ bool encroachesOwned(const std::vector<LLBBox>& boxes) const;
+ bool encroachesOnUnowned(const std::vector<LLBBox>& boxes) const;
+ bool encroachesOnNearbyParcel(const std::vector<LLBBox>& boxes) const;
+
BOOL isSoundLocal(const LLVector3& pos) const;
BOOL isBuildCameraAllowed(const LLVector3& pos) const;
diff --git a/indra/newview/llviewerpartsim.cpp b/indra/newview/llviewerpartsim.cpp
index 4fee85e45c..6b3e04348a 100644
--- a/indra/newview/llviewerpartsim.cpp
+++ b/indra/newview/llviewerpartsim.cpp
@@ -155,8 +155,8 @@ LLViewerPartGroup::LLViewerPartGroup(const LLVector3 &center_agent, const F32 bo
if (group != NULL)
{
- LLVector3 center(group->mOctreeNode->getCenter());
- LLVector3 size(group->mOctreeNode->getSize());
+ LLVector3 center(group->mOctreeNode->getCenter().getF32ptr());
+ LLVector3 size(group->mOctreeNode->getSize().getF32ptr());
size += LLVector3(0.01f, 0.01f, 0.01f);
mMinObjPos = center - size;
mMaxObjPos = center + size;
diff --git a/indra/newview/llviewerprecompiledheaders.h b/indra/newview/llviewerprecompiledheaders.h
index ab07adce5d..f738b84bb9 100644
--- a/indra/newview/llviewerprecompiledheaders.h
+++ b/indra/newview/llviewerprecompiledheaders.h
@@ -33,6 +33,8 @@
// in viewer.
// It is used to precompile headers for improved build speed.
+#include <boost/coroutine/coroutine.hpp>
+
#include "linden_common.h"
// Work around stupid Microsoft STL warning
@@ -99,8 +101,6 @@
#include "llcoord.h"
#include "llcoordframe.h"
#include "llcrc.h"
-#include "llinterp.h"
-#include "llperlin.h"
#include "llplane.h"
#include "llquantize.h"
#include "llrand.h"
@@ -109,7 +109,6 @@
#include "m3math.h"
#include "m4math.h"
#include "llquaternion.h"
-#include "raytrace.h"
#include "v2math.h"
#include "v3color.h"
#include "v3dmath.h"
@@ -117,7 +116,6 @@
#include "v4color.h"
#include "v4coloru.h"
#include "v4math.h"
-////#include "vmath.h"
#include "xform.h"
// Library includes from llvfs
@@ -126,7 +124,7 @@
// Library includes from llmessage project
#include "llcachename.h"
-// llxuixml
+// Library includes from llxuixml
#include "llinitparam.h"
#endif
diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index ca07e7c4cf..e3cb985ddb 100644
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -46,6 +46,7 @@
#include "llagentcamera.h"
#include "llcallingcard.h"
#include "llcaphttpsender.h"
+#include "llcapabilitylistener.h"
#include "llcommandhandler.h"
#include "lldir.h"
#include "lleventpoll.h"
@@ -53,28 +54,111 @@
#include "llfloaterreporter.h"
#include "llfloaterregioninfo.h"
#include "llhttpnode.h"
+#include "llregioninfomodel.h"
#include "llsdutil.h"
#include "llstartup.h"
#include "lltrans.h"
#include "llurldispatcher.h"
#include "llviewerobjectlist.h"
#include "llviewerparceloverlay.h"
+#include "llviewerstatsrecorder.h"
#include "llvlmanager.h"
#include "llvlcomposition.h"
#include "llvocache.h"
-#include "llvoclouds.h"
#include "llworld.h"
#include "llspatialpartition.h"
#include "stringize.h"
+#include "llviewercontrol.h"
+#include "llsdserialize.h"
#ifdef LL_WINDOWS
#pragma warning(disable:4355)
#endif
-extern BOOL gNoRender;
-
const F32 WATER_TEXTURE_SCALE = 8.f; // Number of times to repeat the water texture across a region
const S16 MAX_MAP_DIST = 10;
+// The server only keeps our pending agent info for 60 seconds.
+// We want to allow for seed cap retry, but its not useful after that 60 seconds.
+// Give it 3 chances, each at 18 seconds to give ourselves a few seconds to connect anyways if we give up.
+const S32 MAX_SEED_CAP_ATTEMPTS_BEFORE_LOGIN = 3;
+const F32 CAP_REQUEST_TIMEOUT = 18;
+// Even though we gave up on login, keep trying for caps after we are logged in:
+const S32 MAX_CAP_REQUEST_ATTEMPTS = 30;
+
+typedef std::map<std::string, std::string> CapabilityMap;
+
+class LLViewerRegionImpl {
+public:
+ LLViewerRegionImpl(LLViewerRegion * region, LLHost const & host)
+ : mHost(host),
+ mCompositionp(NULL),
+ mEventPoll(NULL),
+ mSeedCapMaxAttempts(MAX_CAP_REQUEST_ATTEMPTS),
+ mSeedCapMaxAttemptsBeforeLogin(MAX_SEED_CAP_ATTEMPTS_BEFORE_LOGIN),
+ mSeedCapAttempts(0),
+ mHttpResponderID(0),
+ // I'd prefer to set the LLCapabilityListener name to match the region
+ // name -- it's disappointing that's not available at construction time.
+ // We could instead store an LLCapabilityListener*, making
+ // setRegionNameAndZone() replace the instance. Would that pose
+ // consistency problems? Can we even request a capability before calling
+ // setRegionNameAndZone()?
+ // For testability -- the new Michael Feathers paradigm --
+ // LLCapabilityListener binds all the globals it expects to need at
+ // construction time.
+ mCapabilityListener(host.getString(), gMessageSystem, *region,
+ gAgent.getID(), gAgent.getSessionID())
+ {
+ }
+
+ void buildCapabilityNames(LLSD& capabilityNames);
+
+ // The surfaces and other layers
+ LLSurface* mLandp;
+
+ // Region geometry data
+ LLVector3d mOriginGlobal; // Location of southwest corner of region (meters)
+ LLVector3d mCenterGlobal; // Location of center in world space (meters)
+ LLHost mHost;
+
+ // The unique ID for this region.
+ LLUUID mRegionID;
+
+ // region/estate owner - usually null.
+ LLUUID mOwnerID;
+
+ // Network statistics for the region's circuit...
+ LLTimer mLastNetUpdate;
+
+ // Misc
+ LLVLComposition *mCompositionp; // Composition layer for the surface
+
+ LLVOCacheEntry::vocache_entry_map_t mCacheMap;
+ // time?
+ // LRU info?
+
+ // Cache ID is unique per-region, across renames, moving locations,
+ // etc.
+ LLUUID mCacheID;
+
+ CapabilityMap mCapabilities;
+
+ LLEventPoll* mEventPoll;
+
+ S32 mSeedCapMaxAttempts;
+ S32 mSeedCapMaxAttemptsBeforeLogin;
+ S32 mSeedCapAttempts;
+
+ S32 mHttpResponderID;
+
+ /// Post an event to this LLCapabilityListener to invoke a capability message on
+ /// this LLViewerRegion's server
+ /// (https://wiki.lindenlab.com/wiki/Viewer:Messaging/Messaging_Notes#Capabilities)
+ LLCapabilityListener mCapabilityListener;
+
+ //spatial partitions for objects in this region
+ std::vector<LLSpatialPartition*> mObjectPartition;
+};
// support for secondlife:///app/region/{REGION} SLapps
// N.B. this is defined to work exactly like the classic secondlife://{REGION}
@@ -109,7 +193,7 @@ public:
}
// Process the SLapp as if it was a secondlife://{PLACE} SLurl
- LLURLDispatcher::dispatch(url, web, true);
+ LLURLDispatcher::dispatch(url, "clicked", web, true);
return true;
}
};
@@ -119,54 +203,51 @@ class BaseCapabilitiesComplete : public LLHTTPClient::Responder
{
LOG_CLASS(BaseCapabilitiesComplete);
public:
- BaseCapabilitiesComplete(LLViewerRegion* region)
- : mRegion(region)
+ BaseCapabilitiesComplete(U64 region_handle, S32 id)
+ : mRegionHandle(region_handle), mID(id)
{ }
virtual ~BaseCapabilitiesComplete()
- {
- if(mRegion)
- {
- mRegion->setHttpResponderPtrNULL() ;
- }
- }
-
- void setRegion(LLViewerRegion* region)
- {
- mRegion = region ;
- }
+ { }
void error(U32 statusNum, const std::string& reason)
{
LL_WARNS2("AppInit", "Capabilities") << statusNum << ": " << reason << LL_ENDL;
-
- if (STATE_SEED_GRANTED_WAIT == LLStartUp::getStartupState())
+ LLViewerRegion *regionp = LLWorld::getInstance()->getRegionFromHandle(mRegionHandle);
+ if (regionp)
{
- LLStartUp::setStartupState( STATE_SEED_CAP_GRANTED );
+ regionp->failedSeedCapability();
}
}
void result(const LLSD& content)
{
- if(!mRegion || LLHTTPClient::ResponderPtr(this) != mRegion->getHttpResponderPtr()) //region is removed or responder is not created.
+ LLViewerRegion *regionp = LLWorld::getInstance()->getRegionFromHandle(mRegionHandle);
+ if(!regionp) //region was removed
+ {
+ LL_WARNS2("AppInit", "Capabilities") << "Received results for region that no longer exists!" << LL_ENDL;
+ return ;
+ }
+ if( mID != regionp->getHttpResponderID() ) // region is no longer referring to this responder
{
+ LL_WARNS2("AppInit", "Capabilities") << "Received results for a stale http responder!" << LL_ENDL;
return ;
}
LLSD::map_const_iterator iter;
for(iter = content.beginMap(); iter != content.endMap(); ++iter)
{
- mRegion->setCapability(iter->first, iter->second);
+ regionp->setCapability(iter->first, iter->second);
LL_DEBUGS2("AppInit", "Capabilities") << "got capability for "
<< iter->first << LL_ENDL;
/* HACK we're waiting for the ServerReleaseNotes */
- if (iter->first == "ServerReleaseNotes" && mRegion->getReleaseNotesRequested())
+ if (iter->first == "ServerReleaseNotes" && regionp->getReleaseNotesRequested())
{
- mRegion->showReleaseNotes();
+ regionp->showReleaseNotes();
}
}
- mRegion->setCapabilitiesReceived(true);
+ regionp->setCapabilitiesReceived(true);
if (STATE_SEED_GRANTED_WAIT == LLStartUp::getStartupState())
{
@@ -174,15 +255,15 @@ public:
}
}
- static boost::intrusive_ptr<BaseCapabilitiesComplete> build(
- LLViewerRegion* region)
+ static boost::intrusive_ptr<BaseCapabilitiesComplete> build( U64 region_handle, S32 id )
{
- return boost::intrusive_ptr<BaseCapabilitiesComplete>(
- new BaseCapabilitiesComplete(region));
+ return boost::intrusive_ptr<BaseCapabilitiesComplete>(
+ new BaseCapabilitiesComplete(region_handle, id) );
}
private:
- LLViewerRegion* mRegion;
+ U64 mRegionHandle;
+ S32 mID;
};
@@ -191,15 +272,12 @@ LLViewerRegion::LLViewerRegion(const U64 &handle,
const U32 grids_per_region_edge,
const U32 grids_per_patch_edge,
const F32 region_width_meters)
-: mCenterGlobal(),
+: mImpl(new LLViewerRegionImpl(this, host)),
mHandle(handle),
- mHost( host ),
mTimeDilation(1.0f),
mName(""),
mZoning(""),
- mOwnerID(),
mIsEstateManager(FALSE),
- mCompositionp(NULL),
mRegionFlags( REGION_FLAGS_DEFAULT ),
mSimAccess( SIM_ACCESS_MIN ),
mBillableFactor(1.0),
@@ -212,49 +290,30 @@ LLViewerRegion::LLViewerRegion(const U64 &handle,
mHttpUrl(""),
mCacheLoaded(FALSE),
mCacheDirty(FALSE),
- mCacheID(),
- mEventPoll(NULL),
mReleaseNotesRequested(FALSE),
- // I'd prefer to set the LLCapabilityListener name to match the region
- // name -- it's disappointing that's not available at construction time.
- // We could instead store an LLCapabilityListener*, making
- // setRegionNameAndZone() replace the instance. Would that pose
- // consistency problems? Can we even request a capability before calling
- // setRegionNameAndZone()?
- // For testability -- the new Michael Feathers paradigm --
- // LLCapabilityListener binds all the globals it expects to need at
- // construction time.
- mCapabilityListener(host.getString(), gMessageSystem, *this,
- gAgent.getID(), gAgent.getSessionID()),
mCapabilitiesReceived(false)
{
mWidth = region_width_meters;
- mOriginGlobal = from_region_handle(handle);
+ mImpl->mOriginGlobal = from_region_handle(handle);
updateRenderMatrix();
- mLandp = new LLSurface('l', NULL);
- if (!gNoRender)
- {
- // Create the composition layer for the surface
- mCompositionp = new LLVLComposition(mLandp, grids_per_region_edge, region_width_meters/grids_per_region_edge);
- mCompositionp->setSurface(mLandp);
+ mImpl->mLandp = new LLSurface('l', NULL);
- // Create the surfaces
- mLandp->setRegion(this);
- mLandp->create(grids_per_region_edge,
- grids_per_patch_edge,
- mOriginGlobal,
- mWidth);
- }
+ // Create the composition layer for the surface
+ mImpl->mCompositionp =
+ new LLVLComposition(mImpl->mLandp,
+ grids_per_region_edge,
+ region_width_meters / grids_per_region_edge);
+ mImpl->mCompositionp->setSurface(mImpl->mLandp);
- if (!gNoRender)
- {
- mParcelOverlay = new LLViewerParcelOverlay(this, region_width_meters);
- }
- else
- {
- mParcelOverlay = NULL;
- }
+ // Create the surfaces
+ mImpl->mLandp->setRegion(this);
+ mImpl->mLandp->create(grids_per_region_edge,
+ grids_per_patch_edge,
+ mImpl->mOriginGlobal,
+ mWidth);
+
+ mParcelOverlay = new LLViewerParcelOverlay(this, region_width_meters);
setOriginGlobal(from_region_handle(handle));
calculateCenterGlobal();
@@ -264,24 +323,23 @@ LLViewerRegion::LLViewerRegion(const U64 &handle,
//create object partitions
//MUST MATCH declaration of eObjectPartitions
- mObjectPartition.push_back(new LLHUDPartition()); //PARTITION_HUD
- mObjectPartition.push_back(new LLTerrainPartition()); //PARTITION_TERRAIN
- mObjectPartition.push_back(new LLVoidWaterPartition()); //PARTITION_VOIDWATER
- mObjectPartition.push_back(new LLWaterPartition()); //PARTITION_WATER
- mObjectPartition.push_back(new LLTreePartition()); //PARTITION_TREE
- mObjectPartition.push_back(new LLParticlePartition()); //PARTITION_PARTICLE
- mObjectPartition.push_back(new LLCloudPartition()); //PARTITION_CLOUD
- mObjectPartition.push_back(new LLGrassPartition()); //PARTITION_GRASS
- mObjectPartition.push_back(new LLVolumePartition()); //PARTITION_VOLUME
- mObjectPartition.push_back(new LLBridgePartition()); //PARTITION_BRIDGE
- mObjectPartition.push_back(new LLHUDParticlePartition());//PARTITION_HUD_PARTICLE
- mObjectPartition.push_back(NULL); //PARTITION_NONE
+ mImpl->mObjectPartition.push_back(new LLHUDPartition()); //PARTITION_HUD
+ mImpl->mObjectPartition.push_back(new LLTerrainPartition()); //PARTITION_TERRAIN
+ mImpl->mObjectPartition.push_back(new LLVoidWaterPartition()); //PARTITION_VOIDWATER
+ mImpl->mObjectPartition.push_back(new LLWaterPartition()); //PARTITION_WATER
+ mImpl->mObjectPartition.push_back(new LLTreePartition()); //PARTITION_TREE
+ mImpl->mObjectPartition.push_back(new LLParticlePartition()); //PARTITION_PARTICLE
+ mImpl->mObjectPartition.push_back(new LLGrassPartition()); //PARTITION_GRASS
+ mImpl->mObjectPartition.push_back(new LLVolumePartition()); //PARTITION_VOLUME
+ mImpl->mObjectPartition.push_back(new LLBridgePartition()); //PARTITION_BRIDGE
+ mImpl->mObjectPartition.push_back(new LLHUDParticlePartition());//PARTITION_HUD_PARTICLE
+ mImpl->mObjectPartition.push_back(NULL); //PARTITION_NONE
}
void LLViewerRegion::initStats()
{
- mLastNetUpdate.reset();
+ mImpl->mLastNetUpdate.reset();
mPacketsIn = 0;
mBitsIn = 0;
mLastBitsIn = 0;
@@ -296,29 +354,52 @@ void LLViewerRegion::initStats()
LLViewerRegion::~LLViewerRegion()
{
- if(mHttpResponderPtr)
- {
- (static_cast<BaseCapabilitiesComplete*>(mHttpResponderPtr.get()))->setRegion(NULL) ;
- }
-
gVLManager.cleanupData(this);
// Can't do this on destruction, because the neighbor pointers might be invalid.
// This should be reference counted...
disconnectAllNeighbors();
- mCloudLayer.destroy();
LLViewerPartSim::getInstance()->cleanupRegion(this);
gObjectList.killObjects(this);
- delete mCompositionp;
+ delete mImpl->mCompositionp;
delete mParcelOverlay;
- delete mLandp;
- delete mEventPoll;
- LLHTTPSender::clearSender(mHost);
+ delete mImpl->mLandp;
+ delete mImpl->mEventPoll;
+ LLHTTPSender::clearSender(mImpl->mHost);
saveObjectCache();
- std::for_each(mObjectPartition.begin(), mObjectPartition.end(), DeletePointer());
+ std::for_each(mImpl->mObjectPartition.begin(), mImpl->mObjectPartition.end(), DeletePointer());
+
+ delete mImpl;
+ mImpl = NULL;
+}
+
+LLEventPump& LLViewerRegion::getCapAPI() const
+{
+ return mImpl->mCapabilityListener.getCapAPI();
+}
+
+/*virtual*/
+const LLHost& LLViewerRegion::getHost() const
+{
+ return mImpl->mHost;
+}
+
+LLSurface & LLViewerRegion::getLand() const
+{
+ return *mImpl->mLandp;
+}
+
+const LLUUID& LLViewerRegion::getRegionID() const
+{
+ return mImpl->mRegionID;
+}
+
+void LLViewerRegion::setRegionID(const LLUUID& region_id)
+{
+ mImpl->mRegionID = region_id;
}
void LLViewerRegion::loadObjectCache()
@@ -333,7 +414,7 @@ void LLViewerRegion::loadObjectCache()
if(LLVOCache::hasInstance())
{
- LLVOCache::getInstance()->readFromCache(mHandle, mCacheID, mCacheMap) ;
+ LLVOCache::getInstance()->readFromCache(mHandle, mImpl->mCacheID, mImpl->mCacheMap) ;
}
}
@@ -345,32 +426,32 @@ void LLViewerRegion::saveObjectCache()
return;
}
- if (mCacheMap.empty())
+ if (mImpl->mCacheMap.empty())
{
return;
}
if(LLVOCache::hasInstance())
{
- LLVOCache::getInstance()->writeToCache(mHandle, mCacheID, mCacheMap, mCacheDirty) ;
+ LLVOCache::getInstance()->writeToCache(mHandle, mImpl->mCacheID, mImpl->mCacheMap, mCacheDirty) ;
mCacheDirty = FALSE;
}
- for(LLVOCacheEntry::vocache_entry_map_t::iterator iter = mCacheMap.begin(); iter != mCacheMap.end(); ++iter)
+ for(LLVOCacheEntry::vocache_entry_map_t::iterator iter = mImpl->mCacheMap.begin(); iter != mImpl->mCacheMap.end(); ++iter)
{
delete iter->second;
}
- mCacheMap.clear();
+ mImpl->mCacheMap.clear();
}
void LLViewerRegion::sendMessage()
{
- gMessageSystem->sendMessage(mHost);
+ gMessageSystem->sendMessage(mImpl->mHost);
}
void LLViewerRegion::sendReliableMessage()
{
- gMessageSystem->sendReliable(mHost);
+ gMessageSystem->sendReliable(mImpl->mHost);
}
void LLViewerRegion::setFlags(BOOL b, U32 flags)
@@ -387,12 +468,12 @@ void LLViewerRegion::setFlags(BOOL b, U32 flags)
void LLViewerRegion::setWaterHeight(F32 water_level)
{
- mLandp->setWaterHeight(water_level);
+ mImpl->mLandp->setWaterHeight(water_level);
}
F32 LLViewerRegion::getWaterHeight() const
{
- return mLandp->getWaterHeight();
+ return mImpl->mLandp->getWaterHeight();
}
BOOL LLViewerRegion::isVoiceEnabled() const
@@ -408,11 +489,10 @@ void LLViewerRegion::setRegionFlags(U32 flags)
void LLViewerRegion::setOriginGlobal(const LLVector3d &origin_global)
{
- mOriginGlobal = origin_global;
+ mImpl->mOriginGlobal = origin_global;
updateRenderMatrix();
- mLandp->setOriginGlobal(origin_global);
+ mImpl->mLandp->setOriginGlobal(origin_global);
mWind.setOriginGlobal(origin_global);
- mCloudLayer.setOriginGlobal(origin_global);
calculateCenterGlobal();
}
@@ -426,16 +506,34 @@ void LLViewerRegion::setTimeDilation(F32 time_dilation)
mTimeDilation = time_dilation;
}
+const LLVector3d & LLViewerRegion::getOriginGlobal() const
+{
+ return mImpl->mOriginGlobal;
+}
LLVector3 LLViewerRegion::getOriginAgent() const
{
- return gAgent.getPosAgentFromGlobal(mOriginGlobal);
+ return gAgent.getPosAgentFromGlobal(mImpl->mOriginGlobal);
}
+const LLVector3d & LLViewerRegion::getCenterGlobal() const
+{
+ return mImpl->mCenterGlobal;
+}
LLVector3 LLViewerRegion::getCenterAgent() const
{
- return gAgent.getPosAgentFromGlobal(mCenterGlobal);
+ return gAgent.getPosAgentFromGlobal(mImpl->mCenterGlobal);
+}
+
+void LLViewerRegion::setOwner(const LLUUID& owner_id)
+{
+ mImpl->mOwnerID = owner_id;
+}
+
+const LLUUID& LLViewerRegion::getOwner() const
+{
+ return mImpl->mOwnerID;
}
void LLViewerRegion::setRegionNameAndZone (const std::string& name_zone)
@@ -469,6 +567,11 @@ const std::string LLViewerRegion::getSimAccessString() const
return accessToString(mSimAccess);
}
+std::string LLViewerRegion::getLocalizedSimProductName() const
+{
+ std::string localized_spn;
+ return LLTrans::findString(localized_spn, mProductName) ? localized_spn : mProductName;
+}
// static
std::string LLViewerRegion::regionFlagsToString(U32 flags)
@@ -555,12 +658,18 @@ std::string LLViewerRegion::accessToShortString(U8 sim_access)
void LLViewerRegion::processRegionInfo(LLMessageSystem* msg, void**)
{
// send it to 'observers'
+ // *TODO: switch the floaters to using LLRegionInfoModel
+ llinfos << "Processing region info" << llendl;
+ LLRegionInfoModel::instance().update(msg);
LLFloaterGodTools::processRegionInfo(msg);
LLFloaterRegionInfo::processRegionInfo(msg);
LLFloaterReporter::processRegionInfo(msg);
}
-
+void LLViewerRegion::setCacheID(const LLUUID& id)
+{
+ mImpl->mCacheID = id;
+}
S32 LLViewerRegion::renderPropertyLines()
{
@@ -588,7 +697,7 @@ BOOL LLViewerRegion::idleUpdate(F32 max_update_time)
{
LLMemType mt_ivr(LLMemType::MTYPE_IDLE_UPDATE_VIEWER_REGION);
// did_update returns TRUE if we did at least one significant update
- BOOL did_update = mLandp->idleUpdate(max_update_time);
+ BOOL did_update = mImpl->mLandp->idleUpdate(max_update_time);
if (mParcelOverlay)
{
@@ -603,7 +712,7 @@ BOOL LLViewerRegion::idleUpdate(F32 max_update_time)
// As above, but forcibly do the update.
void LLViewerRegion::forceUpdate()
{
- mLandp->idleUpdate(0.f);
+ mImpl->mLandp->idleUpdate(0.f);
if (mParcelOverlay)
{
@@ -613,17 +722,19 @@ void LLViewerRegion::forceUpdate()
void LLViewerRegion::connectNeighbor(LLViewerRegion *neighborp, U32 direction)
{
- mLandp->connectNeighbor(neighborp->mLandp, direction);
- mCloudLayer.connectNeighbor(&(neighborp->mCloudLayer), direction);
+ mImpl->mLandp->connectNeighbor(neighborp->mImpl->mLandp, direction);
}
void LLViewerRegion::disconnectAllNeighbors()
{
- mLandp->disconnectAllNeighbors();
- mCloudLayer.disconnectAllNeighbors();
+ mImpl->mLandp->disconnectAllNeighbors();
}
+LLVLComposition * LLViewerRegion::getComposition() const
+{
+ return mImpl->mCompositionp;
+}
F32 LLViewerRegion::getCompositionXY(const S32 x, const S32 y) const
{
@@ -717,10 +828,10 @@ F32 LLViewerRegion::getCompositionXY(const S32 x, const S32 y) const
void LLViewerRegion::calculateCenterGlobal()
{
- mCenterGlobal = mOriginGlobal;
- mCenterGlobal.mdV[VX] += 0.5 * mWidth;
- mCenterGlobal.mdV[VY] += 0.5 * mWidth;
- mCenterGlobal.mdV[VZ] = 0.5*mLandp->getMinZ() + mLandp->getMaxZ();
+ mImpl->mCenterGlobal = mImpl->mOriginGlobal;
+ mImpl->mCenterGlobal.mdV[VX] += 0.5 * mWidth;
+ mImpl->mCenterGlobal.mdV[VY] += 0.5 * mWidth;
+ mImpl->mCenterGlobal.mdV[VZ] = 0.5 * mImpl->mLandp->getMinZ() + mImpl->mLandp->getMaxZ();
}
void LLViewerRegion::calculateCameraDistance()
@@ -731,7 +842,7 @@ void LLViewerRegion::calculateCameraDistance()
std::ostream& operator<<(std::ostream &s, const LLViewerRegion &region)
{
s << "{ ";
- s << region.mHost;
+ s << region.mImpl->mHost;
s << " mOriginGlobal = " << region.getOriginGlobal()<< "\n";
std::string name(region.getName()), zone(region.getZoning());
if (! name.empty())
@@ -751,9 +862,9 @@ std::ostream& operator<<(std::ostream &s, const LLViewerRegion &region)
void LLViewerRegion::updateNetStats()
{
- F32 dt = mLastNetUpdate.getElapsedTimeAndResetF32();
+ F32 dt = mImpl->mLastNetUpdate.getElapsedTimeAndResetF32();
- LLCircuitData *cdp = gMessageSystem->mCircuitInfo.findCircuit(mHost);
+ LLCircuitData *cdp = gMessageSystem->mCircuitInfo.findCircuit(mImpl->mHost);
if (!cdp)
{
mAlive = false;
@@ -782,10 +893,10 @@ void LLViewerRegion::updateNetStats()
U32 LLViewerRegion::getPacketsLost() const
{
- LLCircuitData *cdp = gMessageSystem->mCircuitInfo.findCircuit(mHost);
+ LLCircuitData *cdp = gMessageSystem->mCircuitInfo.findCircuit(mImpl->mHost);
if (!cdp)
{
- llinfos << "LLViewerRegion::getPacketsLost couldn't find circuit for " << mHost << llendl;
+ llinfos << "LLViewerRegion::getPacketsLost couldn't find circuit for " << mImpl->mHost << llendl;
return 0;
}
else
@@ -794,6 +905,11 @@ U32 LLViewerRegion::getPacketsLost() const
}
}
+S32 LLViewerRegion::getHttpResponderID() const
+{
+ return mImpl->mHttpResponderID;
+}
+
BOOL LLViewerRegion::pointInRegionGlobal(const LLVector3d &point_global) const
{
LLVector3 pos_region = getPosRegionFromGlobal(point_global);
@@ -820,7 +936,7 @@ BOOL LLViewerRegion::pointInRegionGlobal(const LLVector3d &point_global) const
LLVector3 LLViewerRegion::getPosRegionFromGlobal(const LLVector3d &point_global) const
{
LLVector3 pos_region;
- pos_region.setVec(point_global - mOriginGlobal);
+ pos_region.setVec(point_global - mImpl->mOriginGlobal);
return pos_region;
}
@@ -828,7 +944,7 @@ LLVector3d LLViewerRegion::getPosGlobalFromRegion(const LLVector3 &pos_region) c
{
LLVector3d pos_region_d;
pos_region_d.setVec(pos_region);
- return pos_region_d + mOriginGlobal;
+ return pos_region_d + mImpl->mOriginGlobal;
}
LLVector3 LLViewerRegion::getPosAgentFromRegion(const LLVector3 &pos_region) const
@@ -845,7 +961,7 @@ LLVector3 LLViewerRegion::getPosRegionFromAgent(const LLVector3 &pos_agent) cons
F32 LLViewerRegion::getLandHeightRegion(const LLVector3& region_pos)
{
- return mLandp->resolveHeightRegion( region_pos );
+ return mImpl->mLandp->resolveHeightRegion( region_pos );
}
bool LLViewerRegion::isAlive()
@@ -997,7 +1113,7 @@ void LLViewerRegion::updateCoarseLocations(LLMessageSystem* msg)
// treat the target specially for the map
if(i == target_index)
{
- LLVector3d global_pos(mOriginGlobal);
+ LLVector3d global_pos(mImpl->mOriginGlobal);
global_pos.mdV[VX] += (F64)(x_pos);
global_pos.mdV[VY] += (F64)(y_pos);
global_pos.mdV[VZ] += (F64)(z_pos) * 4.0;
@@ -1032,12 +1148,26 @@ void LLViewerRegion::getInfo(LLSD& info)
info["Region"]["Handle"]["y"] = (LLSD::Integer)y;
}
-void LLViewerRegion::cacheFullUpdate(LLViewerObject* objectp, LLDataPackerBinaryBuffer &dp)
+void LLViewerRegion::getSimulatorFeatures(LLSD& sim_features)
+{
+ sim_features = mSimulatorFeatures;
+}
+
+void LLViewerRegion::setSimulatorFeatures(const LLSD& sim_features)
+{
+ std::stringstream str;
+
+ LLSDSerialize::toPrettyXML(sim_features, str);
+ llinfos << str.str() << llendl;
+ mSimulatorFeatures = sim_features;
+}
+
+LLViewerRegion::eCacheUpdateResult LLViewerRegion::cacheFullUpdate(LLViewerObject* objectp, LLDataPackerBinaryBuffer &dp)
{
U32 local_id = objectp->getLocalID();
U32 crc = objectp->getCRC();
- LLVOCacheEntry* entry = get_if_there(mCacheMap, local_id, (LLVOCacheEntry*)NULL);
+ LLVOCacheEntry* entry = get_if_there(mImpl->mCacheMap, local_id, (LLVOCacheEntry*)NULL);
if (entry)
{
@@ -1046,39 +1176,41 @@ void LLViewerRegion::cacheFullUpdate(LLViewerObject* objectp, LLDataPackerBinary
{
// Record a hit
entry->recordDupe();
+ return CACHE_UPDATE_DUPE;
}
- else
- {
- // Update the cache entry
- mCacheMap.erase(local_id);
- delete entry;
- entry = new LLVOCacheEntry(local_id, crc, dp);
- mCacheMap[local_id] = entry;
- }
- }
- else
- {
- // we haven't seen this object before
- // Create new entry and add to map
- if (mCacheMap.size() > MAX_OBJECT_CACHE_ENTRIES)
- {
- mCacheMap.erase(mCacheMap.begin());
- }
+ // Update the cache entry
+ mImpl->mCacheMap.erase(local_id);
+ delete entry;
entry = new LLVOCacheEntry(local_id, crc, dp);
+ mImpl->mCacheMap[local_id] = entry;
+ return CACHE_UPDATE_CHANGED;
+ }
- mCacheMap[local_id] = entry;
+ // we haven't seen this object before
+
+ // Create new entry and add to map
+ eCacheUpdateResult result = CACHE_UPDATE_ADDED;
+ if (mImpl->mCacheMap.size() > MAX_OBJECT_CACHE_ENTRIES)
+ {
+ delete mImpl->mCacheMap.begin()->second ;
+ mImpl->mCacheMap.erase(mImpl->mCacheMap.begin());
+ result = CACHE_UPDATE_REPLACED;
+
}
- return ;
+ entry = new LLVOCacheEntry(local_id, crc, dp);
+
+ mImpl->mCacheMap[local_id] = entry;
+ return result;
}
// Get data packer for this object, if we have cached data
// AND the CRC matches. JC
-LLDataPacker *LLViewerRegion::getDP(U32 local_id, U32 crc)
+LLDataPacker *LLViewerRegion::getDP(U32 local_id, U32 crc, U8 &cache_miss_type)
{
- llassert(mCacheLoaded);
+ //llassert(mCacheLoaded); This assert failes often, changing to early-out -- davep, 2010/10/18
- LLVOCacheEntry* entry = get_if_there(mCacheMap, local_id, (LLVOCacheEntry*)NULL);
+ LLVOCacheEntry* entry = get_if_there(mImpl->mCacheMap, local_id, (LLVOCacheEntry*)NULL);
if (entry)
{
@@ -1087,19 +1219,23 @@ LLDataPacker *LLViewerRegion::getDP(U32 local_id, U32 crc)
{
// Record a hit
entry->recordHit();
+ cache_miss_type = CACHE_MISS_TYPE_NONE;
return entry->getDP(crc);
}
else
{
// llinfos << "CRC miss for " << local_id << llendl;
+ cache_miss_type = CACHE_MISS_TYPE_CRC;
mCacheMissCRC.put(local_id);
}
}
else
{
// llinfos << "Cache miss for " << local_id << llendl;
+ cache_miss_type = CACHE_MISS_TYPE_FULL;
mCacheMissFull.put(local_id);
}
+
return NULL;
}
@@ -1119,9 +1255,6 @@ void LLViewerRegion::requestCacheMisses()
S32 blocks = 0;
S32 i;
- const U8 CACHE_MISS_TYPE_FULL = 0;
- const U8 CACHE_MISS_TYPE_CRC = 1;
-
// Send full cache miss updates. For these, we KNOW we don't
// have a viewer object.
for (i = 0; i < full_count; i++)
@@ -1184,6 +1317,11 @@ void LLViewerRegion::requestCacheMisses()
mCacheDirty = TRUE ;
// llinfos << "KILLDEBUG Sent cache miss full " << full_count << " crc " << crc_count << llendl;
+ #if LL_RECORD_VIEWER_STATS
+ LLViewerStatsRecorder::instance()->beginObjectUpdateEvents(this);
+ LLViewerStatsRecorder::instance()->recordRequestCacheMissesEvent(full_count + crc_count);
+ LLViewerStatsRecorder::instance()->endObjectUpdateEvents();
+ #endif
}
void LLViewerRegion::dumpCache()
@@ -1200,7 +1338,7 @@ void LLViewerRegion::dumpCache()
}
LLVOCacheEntry *entry;
- for(LLVOCacheEntry::vocache_entry_map_t::iterator iter = mCacheMap.begin(); iter != mCacheMap.end(); ++iter)
+ for(LLVOCacheEntry::vocache_entry_map_t::iterator iter = mImpl->mCacheMap.begin(); iter != mImpl->mCacheMap.end(); ++iter)
{
entry = iter->second ;
@@ -1214,7 +1352,7 @@ void LLViewerRegion::dumpCache()
change_bin[changes]++;
}
- llinfos << "Count " << mCacheMap.size() << llendl;
+ llinfos << "Count " << mImpl->mCacheMap.size() << llendl;
for (i = 0; i < BINS; i++)
{
llinfos << "Hits " << i << " " << hit_bin[i] << llendl;
@@ -1349,41 +1487,39 @@ void LLViewerRegion::unpackRegionHandshake()
msg->sendReliable(host);
}
-void LLViewerRegion::setSeedCapability(const std::string& url)
+void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames)
{
- if (getCapability("Seed") == url)
- {
- // llwarns << "Ignoring duplicate seed capability" << llendl;
- return;
- }
-
- delete mEventPoll;
- mEventPoll = NULL;
-
- mCapabilities.clear();
- setCapability("Seed", url);
-
- LLSD capabilityNames = LLSD::emptyArray();
-
capabilityNames.append("AttachmentResources");
capabilityNames.append("AvatarPickerSearch");
capabilityNames.append("ChatSessionRequest");
capabilityNames.append("CopyInventoryFromNotecard");
+ capabilityNames.append("CreateInventoryCategory");
capabilityNames.append("DispatchRegionInfo");
capabilityNames.append("EstateChangeInfo");
capabilityNames.append("EventQueueGet");
- capabilityNames.append("FetchInventory");
+ capabilityNames.append("EnvironmentSettings");
capabilityNames.append("ObjectMedia");
capabilityNames.append("ObjectMediaNavigate");
- capabilityNames.append("FetchLib");
- capabilityNames.append("FetchLibDescendents");
+
+ if (gSavedSettings.getBOOL("UseHTTPInventory"))
+ {
+ capabilityNames.append("FetchLib2");
+ capabilityNames.append("FetchLibDescendents2");
+ capabilityNames.append("FetchInventory2");
+ capabilityNames.append("FetchInventoryDescendents2");
+ }
+
capabilityNames.append("GetDisplayNames");
capabilityNames.append("GetTexture");
+ capabilityNames.append("GetMesh");
+ capabilityNames.append("GetObjectCost");
+ capabilityNames.append("GetObjectPhysicsData");
capabilityNames.append("GroupProposalBallot");
capabilityNames.append("HomeLocation");
capabilityNames.append("LandResources");
capabilityNames.append("MapLayer");
capabilityNames.append("MapLayerGod");
+ capabilityNames.append("MeshUploadFlag");
capabilityNames.append("NewFileAgentInventory");
capabilityNames.append("ParcelPropertiesUpdate");
capabilityNames.append("ParcelMediaURLFilterList");
@@ -1393,14 +1529,16 @@ void LLViewerRegion::setSeedCapability(const std::string& url)
capabilityNames.append("ProvisionVoiceAccountRequest");
capabilityNames.append("RemoteParcelRequest");
capabilityNames.append("RequestTextureDownload");
+ capabilityNames.append("ResourceCostSelected");
capabilityNames.append("SearchStatRequest");
capabilityNames.append("SearchStatTracking");
capabilityNames.append("SendPostcard");
capabilityNames.append("SendUserReport");
capabilityNames.append("SendUserReportWithScreenshot");
capabilityNames.append("ServerReleaseNotes");
- capabilityNames.append("SetDisplayName");
capabilityNames.append("SimConsole");
+ capabilityNames.append("SimulatorFeatures");
+ capabilityNames.append("SetDisplayName");
capabilityNames.append("SimConsoleAsync");
capabilityNames.append("StartGroupProposal");
capabilityNames.append("TextureStats");
@@ -1414,33 +1552,147 @@ void LLViewerRegion::setSeedCapability(const std::string& url)
capabilityNames.append("UpdateNotecardTaskInventory");
capabilityNames.append("UpdateScriptTask");
capabilityNames.append("UploadBakedTexture");
+ capabilityNames.append("ViewerMetrics");
capabilityNames.append("ViewerStartAuction");
capabilityNames.append("ViewerStats");
- capabilityNames.append("WebFetchInventoryDescendents");
+
// Please add new capabilities alphabetically to reduce
// merge conflicts.
+}
+
+void LLViewerRegion::setSeedCapability(const std::string& url)
+{
+ if (getCapability("Seed") == url)
+ {
+ // llwarns << "Ignoring duplicate seed capability" << llendl;
+ return;
+ }
+
+ delete mImpl->mEventPoll;
+ mImpl->mEventPoll = NULL;
+
+ mImpl->mCapabilities.clear();
+ setCapability("Seed", url);
+
+ LLSD capabilityNames = LLSD::emptyArray();
+ mImpl->buildCapabilityNames(capabilityNames);
llinfos << "posting to seed " << url << llendl;
- mHttpResponderPtr = BaseCapabilitiesComplete::build(this) ;
- LLHTTPClient::post(url, capabilityNames, mHttpResponderPtr);
+ S32 id = ++mImpl->mHttpResponderID;
+ LLHTTPClient::post(url, capabilityNames,
+ BaseCapabilitiesComplete::build(getHandle(), id),
+ LLSD(), CAP_REQUEST_TIMEOUT);
+}
+
+S32 LLViewerRegion::getNumSeedCapRetries()
+{
+ return mImpl->mSeedCapAttempts;
}
+void LLViewerRegion::failedSeedCapability()
+{
+ // Should we retry asking for caps?
+ mImpl->mSeedCapAttempts++;
+ std::string url = getCapability("Seed");
+ if ( url.empty() )
+ {
+ LL_WARNS2("AppInit", "Capabilities") << "Failed to get seed capabilities, and can not determine url for retries!" << LL_ENDL;
+ return;
+ }
+ // After a few attempts, continue login. We will keep trying once in-world:
+ if ( mImpl->mSeedCapAttempts >= mImpl->mSeedCapMaxAttemptsBeforeLogin &&
+ STATE_SEED_GRANTED_WAIT == LLStartUp::getStartupState() )
+ {
+ LLStartUp::setStartupState( STATE_SEED_CAP_GRANTED );
+ }
+
+ if ( mImpl->mSeedCapAttempts < mImpl->mSeedCapMaxAttempts)
+ {
+ LLSD capabilityNames = LLSD::emptyArray();
+ mImpl->buildCapabilityNames(capabilityNames);
+
+ llinfos << "posting to seed " << url << " (retry "
+ << mImpl->mSeedCapAttempts << ")" << llendl;
+
+ S32 id = ++mImpl->mHttpResponderID;
+ LLHTTPClient::post(url, capabilityNames,
+ BaseCapabilitiesComplete::build(getHandle(), id),
+ LLSD(), CAP_REQUEST_TIMEOUT);
+ }
+ else
+ {
+ // *TODO: Give a user pop-up about this error?
+ LL_WARNS2("AppInit", "Capabilities") << "Failed to get seed capabilities from '" << url << "' after " << mImpl->mSeedCapAttempts << " attempts. Giving up!" << LL_ENDL;
+ }
+}
+
+class SimulatorFeaturesReceived : public LLHTTPClient::Responder
+{
+ LOG_CLASS(SimulatorFeaturesReceived);
+public:
+ SimulatorFeaturesReceived(const std::string& retry_url, U64 region_handle,
+ S32 attempt = 0, S32 max_attempts = MAX_CAP_REQUEST_ATTEMPTS)
+ : mRetryURL(retry_url), mRegionHandle(region_handle), mAttempt(attempt), mMaxAttempts(max_attempts)
+ { }
+
+
+ void error(U32 statusNum, const std::string& reason)
+ {
+ LL_WARNS2("AppInit", "SimulatorFeatures") << statusNum << ": " << reason << LL_ENDL;
+ retry();
+ }
+
+ void result(const LLSD& content)
+ {
+ LLViewerRegion *regionp = LLWorld::getInstance()->getRegionFromHandle(mRegionHandle);
+ if(!regionp) //region is removed or responder is not created.
+ {
+ LL_WARNS2("AppInit", "SimulatorFeatures") << "Received results for region that no longer exists!" << LL_ENDL;
+ return ;
+ }
+
+ regionp->setSimulatorFeatures(content);
+ }
+
+private:
+ void retry()
+ {
+ if (mAttempt < mMaxAttempts)
+ {
+ mAttempt++;
+ LL_WARNS2("AppInit", "SimulatorFeatures") << "Re-trying '" << mRetryURL << "'. Retry #" << mAttempt << LL_ENDL;
+ LLHTTPClient::get(mRetryURL, new SimulatorFeaturesReceived(*this), LLSD(), CAP_REQUEST_TIMEOUT);
+ }
+ }
+
+ std::string mRetryURL;
+ U64 mRegionHandle;
+ S32 mAttempt;
+ S32 mMaxAttempts;
+};
+
+
void LLViewerRegion::setCapability(const std::string& name, const std::string& url)
{
if(name == "EventQueueGet")
{
- delete mEventPoll;
- mEventPoll = NULL;
- mEventPoll = new LLEventPoll(url, getHost());
+ delete mImpl->mEventPoll;
+ mImpl->mEventPoll = NULL;
+ mImpl->mEventPoll = new LLEventPoll(url, getHost());
}
else if(name == "UntrustedSimulatorMessage")
{
- LLHTTPSender::setSender(mHost, new LLCapHTTPSender(url));
+ LLHTTPSender::setSender(mImpl->mHost, new LLCapHTTPSender(url));
+ }
+ else if (name == "SimulatorFeatures")
+ {
+ // kick off a request for simulator features
+ LLHTTPClient::get(url, new SimulatorFeaturesReceived(url, getHandle()), LLSD(), CAP_REQUEST_TIMEOUT);
}
else
{
- mCapabilities[name] = url;
+ mImpl->mCapabilities[name] = url;
if(name == "GetTexture")
{
mHttpUrl = url ;
@@ -1455,11 +1707,12 @@ bool LLViewerRegion::isSpecialCapabilityName(const std::string &name)
std::string LLViewerRegion::getCapability(const std::string& name) const
{
- CapabilityMap::const_iterator iter = mCapabilities.find(name);
- if(iter == mCapabilities.end())
+ CapabilityMap::const_iterator iter = mImpl->mCapabilities.find(name);
+ if(iter == mImpl->mCapabilities.end())
{
return "";
}
+
return iter->second;
}
@@ -1471,13 +1724,28 @@ bool LLViewerRegion::capabilitiesReceived() const
void LLViewerRegion::setCapabilitiesReceived(bool received)
{
mCapabilitiesReceived = received;
+
+ // Tell interested parties that we've received capabilities,
+ // so that they can safely use getCapability().
+ if (received)
+ {
+ mCapabilitiesReceivedSignal(getRegionID());
+
+ // This is a single-shot signal. Forget callbacks to save resources.
+ mCapabilitiesReceivedSignal.disconnect_all_slots();
+ }
+}
+
+boost::signals2::connection LLViewerRegion::setCapabilitiesReceivedCallback(const caps_received_signal_t::slot_type& cb)
+{
+ return mCapabilitiesReceivedSignal.connect(cb);
}
void LLViewerRegion::logActiveCapabilities() const
{
int count = 0;
CapabilityMap::const_iterator iter;
- for (iter = mCapabilities.begin(); iter != mCapabilities.end(); iter++, count++)
+ for (iter = mImpl->mCapabilities.begin(); iter != mImpl->mCapabilities.end(); ++iter, ++count)
{
if (!iter->second.empty())
{
@@ -1489,13 +1757,44 @@ void LLViewerRegion::logActiveCapabilities() const
LLSpatialPartition* LLViewerRegion::getSpatialPartition(U32 type)
{
- if (type < mObjectPartition.size())
+ if (type < mImpl->mObjectPartition.size())
{
- return mObjectPartition[type];
+ return mImpl->mObjectPartition[type];
}
return NULL;
}
+// the viewer can not yet distinquish between normal- and estate-owned objects
+// so we collapse these two bits and enable the UI if either are set
+const U32 ALLOW_RETURN_ENCROACHING_OBJECT = REGION_FLAGS_ALLOW_RETURN_ENCROACHING_OBJECT
+ | REGION_FLAGS_ALLOW_RETURN_ENCROACHING_ESTATE_OBJECT;
+
+bool LLViewerRegion::objectIsReturnable(const LLVector3& pos, const std::vector<LLBBox>& boxes) const
+{
+ return (mParcelOverlay != NULL)
+ && (mParcelOverlay->isOwnedSelf(pos)
+ || mParcelOverlay->isOwnedGroup(pos)
+ || ((mRegionFlags & ALLOW_RETURN_ENCROACHING_OBJECT)
+ && mParcelOverlay->encroachesOwned(boxes)) );
+}
+
+bool LLViewerRegion::childrenObjectReturnable( const std::vector<LLBBox>& boxes ) const
+{
+ bool result = false;
+ result = ( mParcelOverlay && mParcelOverlay->encroachesOnUnowned( boxes ) ) ? 1 : 0;
+ return result;
+}
+
+bool LLViewerRegion::objectsCrossParcel(const std::vector<LLBBox>& boxes) const
+{
+ return mParcelOverlay && mParcelOverlay->encroachesOnNearbyParcel(boxes);
+}
+
+void LLViewerRegion::getNeighboringRegions( std::vector<LLViewerRegion*>& uniqueRegions )
+{
+ mImpl->mLandp->getNeighboringRegions( uniqueRegions );
+}
+
void LLViewerRegion::showReleaseNotes()
{
std::string url = this->getCapability("ServerReleaseNotes");
@@ -1515,3 +1814,17 @@ std::string LLViewerRegion::getDescription() const
{
return stringize(*this);
}
+
+bool LLViewerRegion::meshUploadEnabled() const
+{
+ return (mSimulatorFeatures.has("MeshUploadEnabled") &&
+ mSimulatorFeatures["MeshUploadEnabled"].asBoolean());
+}
+
+bool LLViewerRegion::meshRezEnabled() const
+{
+ return (mSimulatorFeatures.has("MeshRezEnabled") &&
+ mSimulatorFeatures["MeshRezEnabled"].asBoolean());
+}
+
+
diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h
index 8b71998f60..c483c6ef52 100644
--- a/indra/newview/llviewerregion.h
+++ b/indra/newview/llviewerregion.h
@@ -30,27 +30,24 @@
// A ViewerRegion is a class that contains a bunch of objects and surfaces
// that are in to a particular region.
#include <string>
+#include <boost/signals2.hpp>
#include "lldarray.h"
#include "llwind.h"
-#include "llcloud.h"
#include "llstat.h"
#include "v3dmath.h"
-#include "llhost.h"
#include "llstring.h"
#include "llregionflags.h"
#include "lluuid.h"
-#include "lldatapacker.h"
-#include "llvocache.h"
#include "llweb.h"
#include "llcapabilityprovider.h"
-#include "llcapabilitylistener.h"
#include "m4math.h" // LLMatrix4
+#include "llhttpclient.h"
// Surface id's
#define LAND 1
#define WATER 2
-const U32 MAX_OBJECT_CACHE_ENTRIES = 10000;
+const U32 MAX_OBJECT_CACHE_ENTRIES = 50000;
class LLEventPoll;
@@ -64,6 +61,13 @@ class LLVOCache;
class LLVOCacheEntry;
class LLSpatialPartition;
class LLEventPump;
+class LLCapabilityListener;
+class LLDataPacker;
+class LLDataPackerBinaryBuffer;
+class LLHost;
+class LLBBox;
+
+class LLViewerRegionImpl;
class LLViewerRegion: public LLCapabilityProvider // implements this interface
{
@@ -77,7 +81,6 @@ public:
PARTITION_WATER,
PARTITION_TREE,
PARTITION_PARTICLE,
- PARTITION_CLOUD,
PARTITION_GRASS,
PARTITION_VOLUME,
PARTITION_BRIDGE,
@@ -86,6 +89,8 @@ public:
NUM_PARTITIONS
} eObjectPartitions;
+ typedef boost::signals2::signal<void(const LLUUID& region_id)> caps_received_signal_t;
+
LLViewerRegion(const U64 &handle,
const LLHost &host,
const U32 surface_grid_width,
@@ -158,19 +163,19 @@ public:
F32 getTimeDilation() const { return mTimeDilation; }
// Origin height is at zero.
- const LLVector3d &getOriginGlobal() const { return mOriginGlobal; }
+ const LLVector3d &getOriginGlobal() const;
LLVector3 getOriginAgent() const;
// Center is at the height of the water table.
- const LLVector3d &getCenterGlobal() const { return mCenterGlobal; }
+ const LLVector3d &getCenterGlobal() const;
LLVector3 getCenterAgent() const;
void setRegionNameAndZone(const std::string& name_and_zone);
const std::string& getName() const { return mName; }
const std::string& getZoning() const { return mZoning; }
- void setOwner(const LLUUID& owner_id) { mOwnerID = owner_id; }
- const LLUUID& getOwner() const { return mOwnerID; }
+ void setOwner(const LLUUID& owner_id);
+ const LLUUID& getOwner() const;
// Is the current agent on the estate manager list for this region?
void setIsEstateManager(BOOL b) { mIsEstateManager = b; }
@@ -187,7 +192,7 @@ public:
S32 getSimCPURatio() const { return mCPURatio; }
const std::string& getSimColoName() const { return mColoName; }
const std::string& getSimProductSKU() const { return mProductSKU; }
- const std::string& getSimProductName() const { return mProductName; }
+ std::string getLocalizedSimProductName() const;
// Returns "Sandbox", "Expensive", etc.
static std::string regionFlagsToString(U32 flags);
@@ -205,7 +210,7 @@ public:
// can process the message.
static void processRegionInfo(LLMessageSystem* msg, void**);
- void setCacheID(const LLUUID& id) { mCacheID = id; }
+ void setCacheID(const LLUUID& id);
F32 getWidth() const { return mWidth; }
@@ -221,11 +226,12 @@ public:
U32 getPacketsLost() const;
- void setHttpResponderPtrNULL() {mHttpResponderPtr = NULL ;}
- const LLHTTPClient::ResponderPtr getHttpResponderPtr() const {return mHttpResponderPtr ;}
+ S32 getHttpResponderID() const;
// Get/set named capability URLs for this region.
void setSeedCapability(const std::string& url);
+ void failedSeedCapability();
+ S32 getNumSeedCapRetries();
void setCapability(const std::string& name, const std::string& url);
// implements LLCapabilityProvider
virtual std::string getCapability(const std::string& name) const;
@@ -233,25 +239,24 @@ public:
// has region received its final (not seed) capability list?
bool capabilitiesReceived() const;
void setCapabilitiesReceived(bool received);
+ boost::signals2::connection setCapabilitiesReceivedCallback(const caps_received_signal_t::slot_type& cb);
static bool isSpecialCapabilityName(const std::string &name);
void logActiveCapabilities() const;
- /// Capability-request exception
- typedef LLCapabilityListener::ArgError ArgError;
/// Get LLEventPump on which we listen for capability requests
/// (https://wiki.lindenlab.com/wiki/Viewer:Messaging/Messaging_Notes#Capabilities)
- LLEventPump& getCapAPI() { return mCapabilityListener.getCapAPI(); }
+ LLEventPump& getCapAPI() const;
/// implements LLCapabilityProvider
- virtual LLHost getHost() const { return mHost; }
+ /*virtual*/ const LLHost& getHost() const;
const U64 &getHandle() const { return mHandle; }
- LLSurface &getLand() const { return *mLandp; }
+ LLSurface &getLand() const;
// set and get the region id
- const LLUUID& getRegionID() const { return mRegionID; }
- void setRegionID(const LLUUID& region_id) { mRegionID = region_id; }
+ const LLUUID& getRegionID() const;
+ void setRegionID(const LLUUID& region_id);
BOOL pointInRegionGlobal(const LLVector3d &point_global) const;
LLVector3 getPosRegionFromGlobal(const LLVector3d &point_global) const;
@@ -259,7 +264,7 @@ public:
LLVector3 getPosAgentFromRegion(const LLVector3 &region_pos) const;
LLVector3d getPosGlobalFromRegion(const LLVector3 &offset) const;
- LLVLComposition *getComposition() const { return mCompositionp; }
+ LLVLComposition *getComposition() const;
F32 getCompositionXY(const S32 x, const S32 y) const;
BOOL isOwnedSelf(const LLVector3& pos);
@@ -273,10 +278,31 @@ public:
F32 getLandHeightRegion(const LLVector3& region_pos);
void getInfo(LLSD& info);
+
+ bool meshRezEnabled() const;
+ bool meshUploadEnabled() const;
+
+ void getSimulatorFeatures(LLSD& info);
+ void setSimulatorFeatures(const LLSD& info);
+
+ typedef enum
+ {
+ CACHE_MISS_TYPE_FULL = 0,
+ CACHE_MISS_TYPE_CRC,
+ CACHE_MISS_TYPE_NONE
+ } eCacheMissType;
+
+ typedef enum
+ {
+ CACHE_UPDATE_DUPE = 0,
+ CACHE_UPDATE_CHANGED,
+ CACHE_UPDATE_ADDED,
+ CACHE_UPDATE_REPLACED
+ } eCacheUpdateResult;
// handle a full update message
- void cacheFullUpdate(LLViewerObject* objectp, LLDataPackerBinaryBuffer &dp);
- LLDataPacker *getDP(U32 local_id, U32 crc);
+ eCacheUpdateResult cacheFullUpdate(LLViewerObject* objectp, LLDataPackerBinaryBuffer &dp);
+ LLDataPacker *getDP(U32 local_id, U32 crc, U8 &cache_miss_type);
void requestCacheMisses();
void addCacheMissFull(const U32 local_id);
@@ -293,6 +319,13 @@ public:
std::string getHttpUrl() const { return mHttpUrl ;}
LLSpatialPartition* getSpatialPartition(U32 type);
+
+ bool objectIsReturnable(const LLVector3& pos, const std::vector<LLBBox>& boxes) const;
+ bool childrenObjectReturnable( const std::vector<LLBBox>& boxes ) const;
+ bool objectsCrossParcel(const std::vector<LLBBox>& boxes) const;
+
+ void getNeighboringRegions( std::vector<LLViewerRegion*>& uniqueRegions );
+
public:
struct CompareDistance
{
@@ -311,7 +344,6 @@ protected:
public:
LLWind mWind;
- LLCloudLayer mCloudLayer;
LLViewerParcelOverlay *mParcelOverlay;
LLStat mBitStat;
@@ -329,34 +361,19 @@ public:
LLDynamicArray<LLUUID> mMapAvatarIDs;
private:
- // The surfaces and other layers
- LLSurface* mLandp;
+ LLViewerRegionImpl * mImpl;
- // Region geometry data
- LLVector3d mOriginGlobal; // Location of southwest corner of region (meters)
- LLVector3d mCenterGlobal; // Location of center in world space (meters)
F32 mWidth; // Width of region on a side (meters)
-
U64 mHandle;
- LLHost mHost;
-
- // The unique ID for this region.
- LLUUID mRegionID;
-
F32 mTimeDilation; // time dilation of physics simulation on simulator
// simulator name
std::string mName;
std::string mZoning;
- // region/estate owner - usually null.
- LLUUID mOwnerID;
-
// Is this agent on the estate managers list for this region?
BOOL mIsEstateManager;
- // Network statistics for the region's circuit...
- LLTimer mLastNetUpdate;
U32 mPacketsIn;
U32 mBitsIn;
U32 mLastBitsIn;
@@ -368,9 +385,6 @@ private:
U32 mPingDelay;
F32 mDeltaTime; // Time since last measurement of lastPackets, Bits, etc
- // Misc
- LLVLComposition *mCompositionp; // Composition layer for the surface
-
U32 mRegionFlags; // includes damage flags
U8 mSimAccess;
F32 mBillableFactor;
@@ -380,47 +394,28 @@ private:
// Information for Homestead / CR-53
S32 mClassID;
S32 mCPURatio;
+
std::string mColoName;
std::string mProductSKU;
std::string mProductName;
std::string mHttpUrl ;
-
// Maps local ids to cache entries.
// Regions can have order 10,000 objects, so assume
// a structure of size 2^14 = 16,000
BOOL mCacheLoaded;
BOOL mCacheDirty;
- LLVOCacheEntry::vocache_entry_map_t mCacheMap;
+
LLDynamicArray<U32> mCacheMissFull;
LLDynamicArray<U32> mCacheMissCRC;
- // time?
- // LRU info?
-
- // Cache ID is unique per-region, across renames, moving locations,
- // etc.
- LLUUID mCacheID;
-
- typedef std::map<std::string, std::string> CapabilityMap;
- CapabilityMap mCapabilities;
-
- LLEventPoll* mEventPoll;
-
- /// Post an event to this LLCapabilityListener to invoke a capability message on
- /// this LLViewerRegion's server
- /// (https://wiki.lindenlab.com/wiki/Viewer:Messaging/Messaging_Notes#Capabilities)
- LLCapabilityListener mCapabilityListener;
-private:
bool mAlive; // can become false if circuit disconnects
bool mCapabilitiesReceived;
-
- //spatial partitions for objects in this region
- std::vector<LLSpatialPartition*> mObjectPartition;
-
- LLHTTPClient::ResponderPtr mHttpResponderPtr ;
+ caps_received_signal_t mCapabilitiesReceivedSignal;
BOOL mReleaseNotesRequested;
+
+ LLSD mSimulatorFeatures;
};
inline BOOL LLViewerRegion::getAllowDamage() const
diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp
index c1abead36e..10c61c01d5 100644
--- a/indra/newview/llviewershadermgr.cpp
+++ b/indra/newview/llviewershadermgr.cpp
@@ -32,6 +32,7 @@
#include "llfile.h"
#include "llviewerwindow.h"
+#include "llwindow.h"
#include "llviewercontrol.h"
#include "pipeline.h"
#include "llworld.h"
@@ -58,18 +59,72 @@ using std::make_pair;
using std::string;
BOOL LLViewerShaderMgr::sInitialized = FALSE;
+bool LLViewerShaderMgr::sSkipReload = false;
LLVector4 gShinyOrigin;
+//utility shaders
+LLGLSLShader gOcclusionProgram;
+LLGLSLShader gCustomAlphaProgram;
+LLGLSLShader gGlowCombineProgram;
+LLGLSLShader gSplatTextureRectProgram;
+LLGLSLShader gGlowCombineFXAAProgram;
+LLGLSLShader gTwoTextureAddProgram;
+LLGLSLShader gOneTextureNoColorProgram;
+LLGLSLShader gDebugProgram;
+LLGLSLShader gAlphaMaskProgram;
+
//object shaders
LLGLSLShader gObjectSimpleProgram;
+LLGLSLShader gObjectPreviewProgram;
LLGLSLShader gObjectSimpleWaterProgram;
+LLGLSLShader gObjectSimpleAlphaMaskProgram;
+LLGLSLShader gObjectSimpleWaterAlphaMaskProgram;
LLGLSLShader gObjectFullbrightProgram;
LLGLSLShader gObjectFullbrightWaterProgram;
-
+LLGLSLShader gObjectEmissiveProgram;
+LLGLSLShader gObjectEmissiveWaterProgram;
+LLGLSLShader gObjectFullbrightAlphaMaskProgram;
+LLGLSLShader gObjectFullbrightWaterAlphaMaskProgram;
LLGLSLShader gObjectFullbrightShinyProgram;
+LLGLSLShader gObjectFullbrightShinyWaterProgram;
LLGLSLShader gObjectShinyProgram;
LLGLSLShader gObjectShinyWaterProgram;
+LLGLSLShader gObjectBumpProgram;
+LLGLSLShader gTreeProgram;
+LLGLSLShader gTreeWaterProgram;
+LLGLSLShader gObjectFullbrightNoColorProgram;
+LLGLSLShader gObjectFullbrightNoColorWaterProgram;
+
+LLGLSLShader gObjectSimpleNonIndexedProgram;
+LLGLSLShader gObjectSimpleNonIndexedTexGenProgram;
+LLGLSLShader gObjectSimpleNonIndexedTexGenWaterProgram;
+LLGLSLShader gObjectSimpleNonIndexedWaterProgram;
+LLGLSLShader gObjectAlphaMaskNonIndexedProgram;
+LLGLSLShader gObjectAlphaMaskNonIndexedWaterProgram;
+LLGLSLShader gObjectAlphaMaskNoColorProgram;
+LLGLSLShader gObjectAlphaMaskNoColorWaterProgram;
+LLGLSLShader gObjectFullbrightNonIndexedProgram;
+LLGLSLShader gObjectFullbrightNonIndexedWaterProgram;
+LLGLSLShader gObjectEmissiveNonIndexedProgram;
+LLGLSLShader gObjectEmissiveNonIndexedWaterProgram;
+LLGLSLShader gObjectFullbrightShinyNonIndexedProgram;
+LLGLSLShader gObjectFullbrightShinyNonIndexedWaterProgram;
+LLGLSLShader gObjectShinyNonIndexedProgram;
+LLGLSLShader gObjectShinyNonIndexedWaterProgram;
+
+//object hardware skinning shaders
+LLGLSLShader gSkinnedObjectSimpleProgram;
+LLGLSLShader gSkinnedObjectFullbrightProgram;
+LLGLSLShader gSkinnedObjectEmissiveProgram;
+LLGLSLShader gSkinnedObjectFullbrightShinyProgram;
+LLGLSLShader gSkinnedObjectShinySimpleProgram;
+
+LLGLSLShader gSkinnedObjectSimpleWaterProgram;
+LLGLSLShader gSkinnedObjectFullbrightWaterProgram;
+LLGLSLShader gSkinnedObjectEmissiveWaterProgram;
+LLGLSLShader gSkinnedObjectFullbrightShinyWaterProgram;
+LLGLSLShader gSkinnedObjectShinySimpleWaterProgram;
//environment shaders
LLGLSLShader gTerrainProgram;
@@ -85,11 +140,13 @@ LLGLSLShader gAvatarProgram;
LLGLSLShader gAvatarWaterProgram;
LLGLSLShader gAvatarEyeballProgram;
LLGLSLShader gAvatarPickProgram;
+LLGLSLShader gImpostorProgram;
// WindLight shader handles
LLGLSLShader gWLSkyProgram;
LLGLSLShader gWLCloudProgram;
+
// Effects Shaders
LLGLSLShader gGlowProgram;
LLGLSLShader gGlowExtractProgram;
@@ -98,12 +155,19 @@ LLGLSLShader gPostNightVisionProgram;
// Deferred rendering shaders
LLGLSLShader gDeferredImpostorProgram;
-LLGLSLShader gDeferredEdgeProgram;
LLGLSLShader gDeferredWaterProgram;
LLGLSLShader gDeferredDiffuseProgram;
+LLGLSLShader gDeferredDiffuseAlphaMaskProgram;
+LLGLSLShader gDeferredNonIndexedDiffuseProgram;
+LLGLSLShader gDeferredNonIndexedDiffuseAlphaMaskProgram;
+LLGLSLShader gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram;
+LLGLSLShader gDeferredSkinnedDiffuseProgram;
+LLGLSLShader gDeferredSkinnedBumpProgram;
+LLGLSLShader gDeferredSkinnedAlphaProgram;
LLGLSLShader gDeferredBumpProgram;
LLGLSLShader gDeferredTerrainProgram;
LLGLSLShader gDeferredTreeProgram;
+LLGLSLShader gDeferredTreeShadowProgram;
LLGLSLShader gDeferredAvatarProgram;
LLGLSLShader gDeferredAvatarAlphaProgram;
LLGLSLShader gDeferredLightProgram;
@@ -114,55 +178,96 @@ LLGLSLShader gDeferredSunProgram;
LLGLSLShader gDeferredBlurLightProgram;
LLGLSLShader gDeferredSoftenProgram;
LLGLSLShader gDeferredShadowProgram;
+LLGLSLShader gDeferredShadowAlphaMaskProgram;
LLGLSLShader gDeferredAvatarShadowProgram;
+LLGLSLShader gDeferredAttachmentShadowProgram;
LLGLSLShader gDeferredAlphaProgram;
+LLGLSLShader gDeferredAvatarEyesProgram;
LLGLSLShader gDeferredFullbrightProgram;
-LLGLSLShader gDeferredGIProgram;
-LLGLSLShader gDeferredGIFinalProgram;
-LLGLSLShader gDeferredPostGIProgram;
+LLGLSLShader gDeferredEmissiveProgram;
LLGLSLShader gDeferredPostProgram;
-
-LLGLSLShader gLuminanceGatherProgram;
-
-
-//current avatar shader parameter pointer
-GLint gAvatarMatrixParam;
+LLGLSLShader gDeferredCoFProgram;
+LLGLSLShader gDeferredDoFCombineProgram;
+LLGLSLShader gFXAAProgram;
+LLGLSLShader gDeferredPostNoDoFProgram;
+LLGLSLShader gDeferredWLSkyProgram;
+LLGLSLShader gDeferredWLCloudProgram;
+LLGLSLShader gDeferredStarProgram;
+LLGLSLShader gNormalMapGenProgram;
LLViewerShaderMgr::LLViewerShaderMgr() :
mVertexShaderLevel(SHADER_COUNT, 0),
mMaxAvatarShaderLevel(0)
{
/// Make sure WL Sky is the first program
+ //ONLY shaders that need WL Param management should be added here
mShaderList.push_back(&gWLSkyProgram);
mShaderList.push_back(&gWLCloudProgram);
mShaderList.push_back(&gAvatarProgram);
mShaderList.push_back(&gObjectShinyProgram);
+ mShaderList.push_back(&gObjectShinyNonIndexedProgram);
mShaderList.push_back(&gWaterProgram);
mShaderList.push_back(&gAvatarEyeballProgram);
mShaderList.push_back(&gObjectSimpleProgram);
+ mShaderList.push_back(&gObjectPreviewProgram);
+ mShaderList.push_back(&gImpostorProgram);
+ mShaderList.push_back(&gObjectFullbrightNoColorProgram);
+ mShaderList.push_back(&gObjectFullbrightNoColorWaterProgram);
+ mShaderList.push_back(&gObjectSimpleAlphaMaskProgram);
+ mShaderList.push_back(&gObjectBumpProgram);
+ mShaderList.push_back(&gObjectEmissiveProgram);
+ mShaderList.push_back(&gObjectEmissiveWaterProgram);
mShaderList.push_back(&gObjectFullbrightProgram);
+ mShaderList.push_back(&gObjectFullbrightAlphaMaskProgram);
mShaderList.push_back(&gObjectFullbrightShinyProgram);
+ mShaderList.push_back(&gObjectFullbrightShinyWaterProgram);
+ mShaderList.push_back(&gObjectSimpleNonIndexedProgram);
+ mShaderList.push_back(&gObjectSimpleNonIndexedTexGenProgram);
+ mShaderList.push_back(&gObjectSimpleNonIndexedTexGenWaterProgram);
+ mShaderList.push_back(&gObjectSimpleNonIndexedWaterProgram);
+ mShaderList.push_back(&gObjectAlphaMaskNonIndexedProgram);
+ mShaderList.push_back(&gObjectAlphaMaskNonIndexedWaterProgram);
+ mShaderList.push_back(&gObjectAlphaMaskNoColorProgram);
+ mShaderList.push_back(&gObjectAlphaMaskNoColorWaterProgram);
+ mShaderList.push_back(&gTreeProgram);
+ mShaderList.push_back(&gTreeWaterProgram);
+ mShaderList.push_back(&gObjectFullbrightNonIndexedProgram);
+ mShaderList.push_back(&gObjectFullbrightNonIndexedWaterProgram);
+ mShaderList.push_back(&gObjectEmissiveNonIndexedProgram);
+ mShaderList.push_back(&gObjectEmissiveNonIndexedWaterProgram);
+ mShaderList.push_back(&gObjectFullbrightShinyNonIndexedProgram);
+ mShaderList.push_back(&gObjectFullbrightShinyNonIndexedWaterProgram);
+ mShaderList.push_back(&gSkinnedObjectSimpleProgram);
+ mShaderList.push_back(&gSkinnedObjectFullbrightProgram);
+ mShaderList.push_back(&gSkinnedObjectEmissiveProgram);
+ mShaderList.push_back(&gSkinnedObjectFullbrightShinyProgram);
+ mShaderList.push_back(&gSkinnedObjectShinySimpleProgram);
+ mShaderList.push_back(&gSkinnedObjectSimpleWaterProgram);
+ mShaderList.push_back(&gSkinnedObjectFullbrightWaterProgram);
+ mShaderList.push_back(&gSkinnedObjectEmissiveWaterProgram);
+ mShaderList.push_back(&gSkinnedObjectFullbrightShinyWaterProgram);
+ mShaderList.push_back(&gSkinnedObjectShinySimpleWaterProgram);
mShaderList.push_back(&gTerrainProgram);
mShaderList.push_back(&gTerrainWaterProgram);
mShaderList.push_back(&gObjectSimpleWaterProgram);
mShaderList.push_back(&gObjectFullbrightWaterProgram);
+ mShaderList.push_back(&gObjectSimpleWaterAlphaMaskProgram);
+ mShaderList.push_back(&gObjectFullbrightWaterAlphaMaskProgram);
mShaderList.push_back(&gAvatarWaterProgram);
mShaderList.push_back(&gObjectShinyWaterProgram);
+ mShaderList.push_back(&gObjectShinyNonIndexedWaterProgram);
mShaderList.push_back(&gUnderWaterProgram);
mShaderList.push_back(&gDeferredSunProgram);
- mShaderList.push_back(&gDeferredBlurLightProgram);
mShaderList.push_back(&gDeferredSoftenProgram);
- mShaderList.push_back(&gDeferredLightProgram);
- mShaderList.push_back(&gDeferredMultiLightProgram);
mShaderList.push_back(&gDeferredAlphaProgram);
+ mShaderList.push_back(&gDeferredSkinnedAlphaProgram);
mShaderList.push_back(&gDeferredFullbrightProgram);
- mShaderList.push_back(&gDeferredPostGIProgram);
- mShaderList.push_back(&gDeferredEdgeProgram);
- mShaderList.push_back(&gDeferredPostProgram);
- mShaderList.push_back(&gDeferredGIProgram);
- mShaderList.push_back(&gDeferredGIFinalProgram);
+ mShaderList.push_back(&gDeferredEmissiveProgram);
+ mShaderList.push_back(&gDeferredAvatarEyesProgram);
mShaderList.push_back(&gDeferredWaterProgram);
mShaderList.push_back(&gDeferredAvatarAlphaProgram);
+ mShaderList.push_back(&gDeferredWLSkyProgram);
+ mShaderList.push_back(&gDeferredWLCloudProgram);
}
LLViewerShaderMgr::~LLViewerShaderMgr()
@@ -186,79 +291,13 @@ void LLViewerShaderMgr::initAttribsAndUniforms(void)
{
if (mReservedAttribs.empty())
{
- mReservedAttribs.push_back("materialColor");
- mReservedAttribs.push_back("specularColor");
- mReservedAttribs.push_back("binormal");
-
- mAvatarAttribs.reserve(5);
- mAvatarAttribs.push_back("weight");
- mAvatarAttribs.push_back("clothing");
- mAvatarAttribs.push_back("gWindDir");
- mAvatarAttribs.push_back("gSinWaveParams");
- mAvatarAttribs.push_back("gGravity");
+ LLShaderMgr::initAttribsAndUniforms();
mAvatarUniforms.push_back("matrixPalette");
+ mAvatarUniforms.push_back("gWindDir");
+ mAvatarUniforms.push_back("gSinWaveParams");
+ mAvatarUniforms.push_back("gGravity");
- mReservedUniforms.reserve(24);
- mReservedUniforms.push_back("diffuseMap");
- mReservedUniforms.push_back("specularMap");
- mReservedUniforms.push_back("bumpMap");
- mReservedUniforms.push_back("environmentMap");
- mReservedUniforms.push_back("cloude_noise_texture");
- mReservedUniforms.push_back("fullbright");
- mReservedUniforms.push_back("lightnorm");
- mReservedUniforms.push_back("sunlight_color");
- mReservedUniforms.push_back("ambient");
- mReservedUniforms.push_back("blue_horizon");
- mReservedUniforms.push_back("blue_density");
- mReservedUniforms.push_back("haze_horizon");
- mReservedUniforms.push_back("haze_density");
- mReservedUniforms.push_back("cloud_shadow");
- mReservedUniforms.push_back("density_multiplier");
- mReservedUniforms.push_back("distance_multiplier");
- mReservedUniforms.push_back("max_y");
- mReservedUniforms.push_back("glow");
- mReservedUniforms.push_back("cloud_color");
- mReservedUniforms.push_back("cloud_pos_density1");
- mReservedUniforms.push_back("cloud_pos_density2");
- mReservedUniforms.push_back("cloud_scale");
- mReservedUniforms.push_back("gamma");
- mReservedUniforms.push_back("scene_light_strength");
-
- mReservedUniforms.push_back("depthMap");
- mReservedUniforms.push_back("shadowMap0");
- mReservedUniforms.push_back("shadowMap1");
- mReservedUniforms.push_back("shadowMap2");
- mReservedUniforms.push_back("shadowMap3");
- mReservedUniforms.push_back("shadowMap4");
- mReservedUniforms.push_back("shadowMap5");
-
- mReservedUniforms.push_back("normalMap");
- mReservedUniforms.push_back("positionMap");
- mReservedUniforms.push_back("diffuseRect");
- mReservedUniforms.push_back("specularRect");
- mReservedUniforms.push_back("noiseMap");
- mReservedUniforms.push_back("lightFunc");
- mReservedUniforms.push_back("lightMap");
- mReservedUniforms.push_back("luminanceMap");
- mReservedUniforms.push_back("giLightMap");
- mReservedUniforms.push_back("giMip");
- mReservedUniforms.push_back("edgeMap");
- mReservedUniforms.push_back("bloomMap");
- mReservedUniforms.push_back("sunLightMap");
- mReservedUniforms.push_back("localLightMap");
- mReservedUniforms.push_back("projectionMap");
- mReservedUniforms.push_back("diffuseGIMap");
- mReservedUniforms.push_back("specularGIMap");
- mReservedUniforms.push_back("normalGIMap");
- mReservedUniforms.push_back("minpGIMap");
- mReservedUniforms.push_back("maxpGIMap");
- mReservedUniforms.push_back("depthGIMap");
- mReservedUniforms.push_back("lastDiffuseGIMap");
- mReservedUniforms.push_back("lastNormalGIMap");
- mReservedUniforms.push_back("lastMinpGIMap");
- mReservedUniforms.push_back("lastMaxpGIMap");
-
mWLUniforms.push_back("camPosLocal");
mTerrainUniforms.reserve(5);
@@ -314,13 +353,35 @@ void LLViewerShaderMgr::setShaders()
//setShaders might be called redundantly by gSavedSettings, so return on reentrance
static bool reentrance = false;
- if (!gPipeline.mInitialized || !sInitialized || reentrance)
+ if (!gPipeline.mInitialized || !sInitialized || reentrance || sSkipReload)
{
return;
}
+ LLGLSLShader::sIndexedTextureChannels = llmax(llmin(gGLManager.mNumTextureImageUnits, (S32) gSavedSettings.getU32("RenderMaxTextureIndex")), 1);
+
+ //NEVER use more than 16 texture channels (work around for prevalent driver bug)
+ LLGLSLShader::sIndexedTextureChannels = llmin(LLGLSLShader::sIndexedTextureChannels, 16);
+
+ if (gGLManager.mGLSLVersionMajor < 1 ||
+ (gGLManager.mGLSLVersionMajor == 1 && gGLManager.mGLSLVersionMinor <= 20))
+ { //NEVER use indexed texture rendering when GLSL version is 1.20 or earlier
+ LLGLSLShader::sIndexedTextureChannels = 1;
+ }
+
reentrance = true;
+ if (LLRender::sGLCoreProfile)
+ {
+ if (!gSavedSettings.getBOOL("VertexShaderEnable"))
+ { //vertex shaders MUST be enabled to use core profile
+ gSavedSettings.setBOOL("VertexShaderEnable", TRUE);
+ }
+ }
+
+ //setup preprocessor definitions
+ LLShaderMgr::instance()->mDefinitions["NUM_TEX_UNITS"] = llformat("%d", gGLManager.mNumTextureImageUnits);
+
// Make sure the compiled shader map is cleared before we recompile shaders.
mShaderObjects.clear();
@@ -352,15 +413,23 @@ void LLViewerShaderMgr::setShaders()
// Shaders
LL_INFOS("ShaderLoading") << "\n~~~~~~~~~~~~~~~~~~\n Loading Shaders:\n~~~~~~~~~~~~~~~~~~" << LL_ENDL;
+ LL_INFOS("ShaderLoading") << llformat("Using GLSL %d.%d", gGLManager.mGLSLVersionMajor, gGLManager.mGLSLVersionMinor) << llendl;
+
for (S32 i = 0; i < SHADER_COUNT; i++)
{
mVertexShaderLevel[i] = 0;
}
mMaxAvatarShaderLevel = 0;
+ LLGLSLShader::sNoFixedFunction = false;
+ LLVertexBuffer::unbind();
if (LLFeatureManager::getInstance()->isFeatureAvailable("VertexShaderEnable")
+ && (gGLManager.mGLSLVersionMajor > 1 || gGLManager.mGLSLVersionMinor >= 10)
&& gSavedSettings.getBOOL("VertexShaderEnable"))
{
+ //using shaders, disable fixed function
+ LLGLSLShader::sNoFixedFunction = true;
+
S32 light_class = 2;
S32 env_class = 2;
S32 obj_class = 2;
@@ -370,32 +439,24 @@ void LLViewerShaderMgr::setShaders()
S32 deferred_class = 0;
if (LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred") &&
- gSavedSettings.getBOOL("RenderDeferred"))
+ gSavedSettings.getBOOL("RenderDeferred") &&
+ gSavedSettings.getBOOL("RenderAvatarVP") &&
+ gSavedSettings.getBOOL("WindLightUseAtmosShaders"))
{
if (gSavedSettings.getS32("RenderShadowDetail") > 0)
- {
- if (gSavedSettings.getBOOL("RenderDeferredGI"))
- { //shadows + gi
- deferred_class = 3;
- }
- else
- { //shadows
- deferred_class = 2;
- }
+ { //shadows
+ deferred_class = 2;
}
else
{ //no shadows
deferred_class = 1;
}
- //make sure framebuffer objects are enabled
- gSavedSettings.setBOOL("RenderUseFBO", TRUE);
-
//make sure hardware skinning is enabled
- gSavedSettings.setBOOL("RenderAvatarVP", TRUE);
+ //gSavedSettings.setBOOL("RenderAvatarVP", TRUE);
//make sure atmospheric shaders are enabled
- gSavedSettings.setBOOL("WindLightUseAtmosShaders", TRUE);
+ //gSavedSettings.setBOOL("WindLightUseAtmosShaders", TRUE);
}
@@ -407,11 +468,7 @@ void LLViewerShaderMgr::setShaders()
wl_class = 1;
}
- if(!gSavedSettings.getBOOL("EnableRippleWater"))
- {
- water_class = 0;
- }
-
+
// Trigger a full rebuild of the fallback skybox / cubemap if we've toggled windlight shaders
if (mVertexShaderLevel[SHADER_WINDLIGHT] != wl_class && gSky.mVOSkyp.notNull())
{
@@ -438,7 +495,6 @@ void LLViewerShaderMgr::setShaders()
// Load all shaders to set max levels
loadShadersEnvironment();
loadShadersWater();
- loadShadersObject();
loadShadersWindLight();
loadShadersEffects();
loadShadersInterface();
@@ -446,14 +502,9 @@ void LLViewerShaderMgr::setShaders()
// Load max avatar shaders to set the max level
mVertexShaderLevel[SHADER_AVATAR] = 3;
mMaxAvatarShaderLevel = 3;
- loadShadersAvatar();
-
-#if 0 && LL_DARWIN // force avatar shaders off for mac
- mVertexShaderLevel[SHADER_AVATAR] = 0;
- sMaxAvatarShaderLevel = 0;
-#else
- if (gSavedSettings.getBOOL("RenderAvatarVP"))
- {
+
+ if (gSavedSettings.getBOOL("RenderAvatarVP") && loadShadersObject())
+ { //hardware skinning is enabled and rigged attachment shaders loaded correctly
BOOL avatar_cloth = gSavedSettings.getBOOL("RenderAvatarCloth");
S32 avatar_class = 1;
@@ -484,20 +535,32 @@ void LLViewerShaderMgr::setShaders()
}
}
else
- {
+ { //hardware skinning not possible, neither is deferred rendering
mVertexShaderLevel[SHADER_AVATAR] = 0;
- gSavedSettings.setBOOL("RenderAvatarCloth", FALSE);
+ mVertexShaderLevel[SHADER_DEFERRED] = 0;
+
+ if (gSavedSettings.getBOOL("RenderAvatarVP"))
+ {
+ gSavedSettings.setBOOL("RenderDeferred", FALSE);
+ gSavedSettings.setBOOL("RenderAvatarCloth", FALSE);
+ gSavedSettings.setBOOL("RenderAvatarVP", FALSE);
+ }
+
loadShadersAvatar(); // unloads
+ loadShadersObject();
}
if (!loadShadersDeferred())
{
gSavedSettings.setBOOL("RenderDeferred", FALSE);
+ reentrance = false;
+ setShaders();
+ return;
}
-#endif
}
else
{
+ LLGLSLShader::sNoFixedFunction = false;
gPipeline.mVertexShadersEnabled = FALSE;
gPipeline.mVertexShadersLoaded = 0;
mVertexShaderLevel[SHADER_LIGHTING] = 0;
@@ -512,6 +575,7 @@ void LLViewerShaderMgr::setShaders()
}
else
{
+ LLGLSLShader::sNoFixedFunction = false;
gPipeline.mVertexShadersEnabled = FALSE;
gPipeline.mVertexShadersLoaded = 0;
mVertexShaderLevel[SHADER_LIGHTING] = 0;
@@ -535,14 +599,72 @@ void LLViewerShaderMgr::setShaders()
void LLViewerShaderMgr::unloadShaders()
{
+ gOcclusionProgram.unload();
+ gDebugProgram.unload();
+ gAlphaMaskProgram.unload();
+ gUIProgram.unload();
+ gCustomAlphaProgram.unload();
+ gGlowCombineProgram.unload();
+ gSplatTextureRectProgram.unload();
+ gGlowCombineFXAAProgram.unload();
+ gTwoTextureAddProgram.unload();
+ gOneTextureNoColorProgram.unload();
+ gSolidColorProgram.unload();
+
+ gObjectFullbrightNoColorProgram.unload();
+ gObjectFullbrightNoColorWaterProgram.unload();
gObjectSimpleProgram.unload();
+ gObjectPreviewProgram.unload();
+ gImpostorProgram.unload();
+ gObjectSimpleAlphaMaskProgram.unload();
+ gObjectBumpProgram.unload();
gObjectSimpleWaterProgram.unload();
+ gObjectSimpleWaterAlphaMaskProgram.unload();
gObjectFullbrightProgram.unload();
gObjectFullbrightWaterProgram.unload();
+ gObjectEmissiveProgram.unload();
+ gObjectEmissiveWaterProgram.unload();
+ gObjectFullbrightAlphaMaskProgram.unload();
+ gObjectFullbrightWaterAlphaMaskProgram.unload();
gObjectShinyProgram.unload();
gObjectFullbrightShinyProgram.unload();
+ gObjectFullbrightShinyWaterProgram.unload();
gObjectShinyWaterProgram.unload();
+
+ gObjectSimpleNonIndexedProgram.unload();
+ gObjectSimpleNonIndexedTexGenProgram.unload();
+ gObjectSimpleNonIndexedTexGenWaterProgram.unload();
+ gObjectSimpleNonIndexedWaterProgram.unload();
+ gObjectAlphaMaskNonIndexedProgram.unload();
+ gObjectAlphaMaskNonIndexedWaterProgram.unload();
+ gObjectAlphaMaskNoColorProgram.unload();
+ gObjectAlphaMaskNoColorWaterProgram.unload();
+ gObjectFullbrightNonIndexedProgram.unload();
+ gObjectFullbrightNonIndexedWaterProgram.unload();
+ gObjectEmissiveNonIndexedProgram.unload();
+ gObjectEmissiveNonIndexedWaterProgram.unload();
+ gTreeProgram.unload();
+ gTreeWaterProgram.unload();
+
+ gObjectShinyNonIndexedProgram.unload();
+ gObjectFullbrightShinyNonIndexedProgram.unload();
+ gObjectFullbrightShinyNonIndexedWaterProgram.unload();
+ gObjectShinyNonIndexedWaterProgram.unload();
+
+ gSkinnedObjectSimpleProgram.unload();
+ gSkinnedObjectFullbrightProgram.unload();
+ gSkinnedObjectEmissiveProgram.unload();
+ gSkinnedObjectFullbrightShinyProgram.unload();
+ gSkinnedObjectShinySimpleProgram.unload();
+
+ gSkinnedObjectSimpleWaterProgram.unload();
+ gSkinnedObjectFullbrightWaterProgram.unload();
+ gSkinnedObjectEmissiveWaterProgram.unload();
+ gSkinnedObjectFullbrightShinyWaterProgram.unload();
+ gSkinnedObjectShinySimpleWaterProgram.unload();
+
+
gWaterProgram.unload();
gUnderWaterProgram.unload();
gTerrainProgram.unload();
@@ -562,6 +684,13 @@ void LLViewerShaderMgr::unloadShaders()
gPostNightVisionProgram.unload();
gDeferredDiffuseProgram.unload();
+ gDeferredDiffuseAlphaMaskProgram.unload();
+ gDeferredNonIndexedDiffuseAlphaMaskProgram.unload();
+ gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram.unload();
+ gDeferredNonIndexedDiffuseProgram.unload();
+ gDeferredSkinnedDiffuseProgram.unload();
+ gDeferredSkinnedBumpProgram.unload();
+ gDeferredSkinnedAlphaProgram.unload();
mVertexShaderLevel[SHADER_LIGHTING] = 0;
mVertexShaderLevel[SHADER_OBJECT] = 0;
@@ -609,8 +738,8 @@ BOOL LLViewerShaderMgr::loadBasicShaders()
// (in order of shader function call depth for reference purposes, deepest level first)
vector< pair<string, S32> > shaders;
- shaders.reserve(10);
shaders.push_back( make_pair( "windlight/atmosphericsVarsV.glsl", mVertexShaderLevel[SHADER_WINDLIGHT] ) );
+ shaders.push_back( make_pair( "windlight/atmosphericsVarsWaterV.glsl", mVertexShaderLevel[SHADER_WINDLIGHT] ) );
shaders.push_back( make_pair( "windlight/atmosphericsHelpersV.glsl", mVertexShaderLevel[SHADER_WINDLIGHT] ) );
shaders.push_back( make_pair( "lighting/lightFuncV.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
shaders.push_back( make_pair( "lighting/sumLightsV.glsl", sum_lights_class ) );
@@ -620,6 +749,12 @@ BOOL LLViewerShaderMgr::loadBasicShaders()
shaders.push_back( make_pair( "lighting/lightSpecularV.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
shaders.push_back( make_pair( "windlight/atmosphericsV.glsl", mVertexShaderLevel[SHADER_WINDLIGHT] ) );
shaders.push_back( make_pair( "avatar/avatarSkinV.glsl", 1 ) );
+ shaders.push_back( make_pair( "avatar/objectSkinV.glsl", 1 ) );
+ if (gGLManager.mGLSLVersionMajor >= 2 || gGLManager.mGLSLVersionMinor >= 30)
+ {
+ shaders.push_back( make_pair( "objects/indexedTextureV.glsl", 1 ) );
+ }
+ shaders.push_back( make_pair( "objects/nonindexedTextureV.glsl", 1 ) );
// We no longer have to bind the shaders to global glhandles, they are automatically added to a map now.
for (U32 i = 0; i < shaders.size(); i++)
@@ -635,24 +770,49 @@ BOOL LLViewerShaderMgr::loadBasicShaders()
// (in order of shader function call depth for reference purposes, deepest level first)
shaders.clear();
- shaders.reserve(12);
- shaders.push_back( make_pair( "windlight/atmosphericsVarsF.glsl", mVertexShaderLevel[SHADER_WINDLIGHT] ) );
- shaders.push_back( make_pair( "windlight/gammaF.glsl", mVertexShaderLevel[SHADER_WINDLIGHT]) );
- shaders.push_back( make_pair( "windlight/atmosphericsF.glsl", mVertexShaderLevel[SHADER_WINDLIGHT] ) );
- shaders.push_back( make_pair( "windlight/transportF.glsl", mVertexShaderLevel[SHADER_WINDLIGHT] ) );
- shaders.push_back( make_pair( "environment/waterFogF.glsl", mVertexShaderLevel[SHADER_WATER] ) );
- shaders.push_back( make_pair( "lighting/lightF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
- shaders.push_back( make_pair( "lighting/lightFullbrightF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
- shaders.push_back( make_pair( "lighting/lightWaterF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
- shaders.push_back( make_pair( "lighting/lightFullbrightWaterF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
- shaders.push_back( make_pair( "lighting/lightShinyF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
- shaders.push_back( make_pair( "lighting/lightFullbrightShinyF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
- shaders.push_back( make_pair( "lighting/lightShinyWaterF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
+ S32 ch = 1;
+
+ if (gGLManager.mGLSLVersionMajor > 1 || gGLManager.mGLSLVersionMinor >= 30)
+ { //use indexed texture rendering for GLSL >= 1.30
+ ch = llmax(LLGLSLShader::sIndexedTextureChannels-1, 1);
+ }
+
+ std::vector<S32> index_channels;
+ index_channels.push_back(-1); shaders.push_back( make_pair( "windlight/atmosphericsVarsF.glsl", mVertexShaderLevel[SHADER_WINDLIGHT] ) );
+ index_channels.push_back(-1); shaders.push_back( make_pair( "windlight/atmosphericsVarsWaterF.glsl", mVertexShaderLevel[SHADER_WINDLIGHT] ) );
+ index_channels.push_back(-1); shaders.push_back( make_pair( "windlight/gammaF.glsl", mVertexShaderLevel[SHADER_WINDLIGHT]) );
+ index_channels.push_back(-1); shaders.push_back( make_pair( "windlight/atmosphericsF.glsl", mVertexShaderLevel[SHADER_WINDLIGHT] ) );
+ index_channels.push_back(-1); shaders.push_back( make_pair( "windlight/transportF.glsl", mVertexShaderLevel[SHADER_WINDLIGHT] ) );
+ index_channels.push_back(-1); shaders.push_back( make_pair( "environment/waterFogF.glsl", mVertexShaderLevel[SHADER_WATER] ) );
+ index_channels.push_back(-1); shaders.push_back( make_pair( "lighting/lightNonIndexedF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
+ index_channels.push_back(-1); shaders.push_back( make_pair( "lighting/lightAlphaMaskNonIndexedF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
+ index_channels.push_back(-1); shaders.push_back( make_pair( "lighting/lightFullbrightNonIndexedF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
+ index_channels.push_back(-1); shaders.push_back( make_pair( "lighting/lightFullbrightNonIndexedAlphaMaskF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
+ index_channels.push_back(-1); shaders.push_back( make_pair( "lighting/lightWaterNonIndexedF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
+ index_channels.push_back(-1); shaders.push_back( make_pair( "lighting/lightWaterAlphaMaskNonIndexedF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
+ index_channels.push_back(-1); shaders.push_back( make_pair( "lighting/lightFullbrightWaterNonIndexedF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
+ index_channels.push_back(-1); shaders.push_back( make_pair( "lighting/lightFullbrightWaterNonIndexedAlphaMaskF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
+ index_channels.push_back(-1); shaders.push_back( make_pair( "lighting/lightShinyNonIndexedF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
+ index_channels.push_back(-1); shaders.push_back( make_pair( "lighting/lightFullbrightShinyNonIndexedF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
+ index_channels.push_back(-1); shaders.push_back( make_pair( "lighting/lightShinyWaterNonIndexedF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
+ index_channels.push_back(-1); shaders.push_back( make_pair( "lighting/lightFullbrightShinyWaterNonIndexedF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
+ index_channels.push_back(ch); shaders.push_back( make_pair( "lighting/lightF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
+ index_channels.push_back(ch); shaders.push_back( make_pair( "lighting/lightAlphaMaskF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
+ index_channels.push_back(ch); shaders.push_back( make_pair( "lighting/lightFullbrightF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
+ index_channels.push_back(ch); shaders.push_back( make_pair( "lighting/lightFullbrightAlphaMaskF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
+ index_channels.push_back(ch); shaders.push_back( make_pair( "lighting/lightWaterF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
+ index_channels.push_back(ch); shaders.push_back( make_pair( "lighting/lightWaterAlphaMaskF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
+ index_channels.push_back(ch); shaders.push_back( make_pair( "lighting/lightFullbrightWaterF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
+ index_channels.push_back(ch); shaders.push_back( make_pair( "lighting/lightFullbrightWaterAlphaMaskF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
+ index_channels.push_back(ch); shaders.push_back( make_pair( "lighting/lightShinyF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
+ index_channels.push_back(ch); shaders.push_back( make_pair( "lighting/lightFullbrightShinyF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
+ index_channels.push_back(ch); shaders.push_back( make_pair( "lighting/lightShinyWaterF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
+ index_channels.push_back(ch); shaders.push_back( make_pair( "lighting/lightFullbrightShinyWaterF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) );
for (U32 i = 0; i < shaders.size(); i++)
{
// Note usage of GL_FRAGMENT_SHADER_ARB
- if (loadShaderFile(shaders[i].first, shaders[i].second, GL_FRAGMENT_SHADER_ARB) == 0)
+ if (loadShaderFile(shaders[i].first, shaders[i].second, GL_FRAGMENT_SHADER_ARB, index_channels[i]) == 0)
{
return FALSE;
}
@@ -677,6 +837,8 @@ BOOL LLViewerShaderMgr::loadShadersEnvironment()
gTerrainProgram.mFeatures.calculatesLighting = true;
gTerrainProgram.mFeatures.calculatesAtmospherics = true;
gTerrainProgram.mFeatures.hasAtmospherics = true;
+ gTerrainProgram.mFeatures.mIndexedTextureChannels = 0;
+ gTerrainProgram.mFeatures.disableTextureIndex = true;
gTerrainProgram.mFeatures.hasGamma = true;
gTerrainProgram.mShaderFiles.clear();
gTerrainProgram.mShaderFiles.push_back(make_pair("environment/terrainV.glsl", GL_VERTEX_SHADER_ARB));
@@ -745,6 +907,8 @@ BOOL LLViewerShaderMgr::loadShadersWater()
gTerrainWaterProgram.mFeatures.calculatesAtmospherics = true;
gTerrainWaterProgram.mFeatures.hasAtmospherics = true;
gTerrainWaterProgram.mFeatures.hasWaterFog = true;
+ gTerrainWaterProgram.mFeatures.mIndexedTextureChannels = 0;
+ gTerrainWaterProgram.mFeatures.disableTextureIndex = true;
gTerrainWaterProgram.mShaderFiles.clear();
gTerrainWaterProgram.mShaderFiles.push_back(make_pair("environment/terrainV.glsl", GL_VERTEX_SHADER_ARB));
gTerrainWaterProgram.mShaderFiles.push_back(make_pair("environment/terrainWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
@@ -820,51 +984,6 @@ BOOL LLViewerShaderMgr::loadShadersEffects()
}
}
-#if 0
- // disabling loading of postprocess shaders until we fix
- // ATI sampler2DRect compatibility.
-
- //load Color Filter Shader
- if (success)
- {
- vector<string> shaderUniforms;
- shaderUniforms.reserve(7);
- shaderUniforms.push_back("RenderTexture");
- shaderUniforms.push_back("gamma");
- shaderUniforms.push_back("brightness");
- shaderUniforms.push_back("contrast");
- shaderUniforms.push_back("contrastBase");
- shaderUniforms.push_back("saturation");
- shaderUniforms.push_back("lumWeights");
-
- gPostColorFilterProgram.mName = "Color Filter Shader (Post)";
- gPostColorFilterProgram.mShaderFiles.clear();
- gPostColorFilterProgram.mShaderFiles.push_back(make_pair("effects/colorFilterF.glsl", GL_FRAGMENT_SHADER_ARB));
- gPostColorFilterProgram.mShaderFiles.push_back(make_pair("effects/drawQuadV.glsl", GL_VERTEX_SHADER_ARB));
- gPostColorFilterProgram.mShaderLevel = mVertexShaderLevel[SHADER_EFFECT];
- success = gPostColorFilterProgram.createShader(NULL, &shaderUniforms);
- }
-
- //load Night Vision Shader
- if (success)
- {
- vector<string> shaderUniforms;
- shaderUniforms.reserve(5);
- shaderUniforms.push_back("RenderTexture");
- shaderUniforms.push_back("NoiseTexture");
- shaderUniforms.push_back("brightMult");
- shaderUniforms.push_back("noiseStrength");
- shaderUniforms.push_back("lumWeights");
-
- gPostNightVisionProgram.mName = "Night Vision Shader (Post)";
- gPostNightVisionProgram.mShaderFiles.clear();
- gPostNightVisionProgram.mShaderFiles.push_back(make_pair("effects/nightVisionF.glsl", GL_FRAGMENT_SHADER_ARB));
- gPostNightVisionProgram.mShaderFiles.push_back(make_pair("effects/drawQuadV.glsl", GL_VERTEX_SHADER_ARB));
- gPostNightVisionProgram.mShaderLevel = mVertexShaderLevel[SHADER_EFFECT];
- success = gPostNightVisionProgram.createShader(NULL, &shaderUniforms);
- }
- #endif
-
return success;
}
@@ -874,7 +993,15 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
if (mVertexShaderLevel[SHADER_DEFERRED] == 0)
{
gDeferredTreeProgram.unload();
+ gDeferredTreeShadowProgram.unload();
gDeferredDiffuseProgram.unload();
+ gDeferredDiffuseAlphaMaskProgram.unload();
+ gDeferredNonIndexedDiffuseAlphaMaskProgram.unload();
+ gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram.unload();
+ gDeferredNonIndexedDiffuseProgram.unload();
+ gDeferredSkinnedDiffuseProgram.unload();
+ gDeferredSkinnedBumpProgram.unload();
+ gDeferredSkinnedAlphaProgram.unload();
gDeferredBumpProgram.unload();
gDeferredImpostorProgram.unload();
gDeferredTerrainProgram.unload();
@@ -886,23 +1013,27 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
gDeferredBlurLightProgram.unload();
gDeferredSoftenProgram.unload();
gDeferredShadowProgram.unload();
+ gDeferredShadowAlphaMaskProgram.unload();
gDeferredAvatarShadowProgram.unload();
+ gDeferredAttachmentShadowProgram.unload();
gDeferredAvatarProgram.unload();
gDeferredAvatarAlphaProgram.unload();
gDeferredAlphaProgram.unload();
gDeferredFullbrightProgram.unload();
- gDeferredPostGIProgram.unload();
- gDeferredEdgeProgram.unload();
+ gDeferredEmissiveProgram.unload();
+ gDeferredAvatarEyesProgram.unload();
gDeferredPostProgram.unload();
- gLuminanceGatherProgram.unload();
- gDeferredGIProgram.unload();
- gDeferredGIFinalProgram.unload();
+ gDeferredCoFProgram.unload();
+ gDeferredDoFCombineProgram.unload();
+ gFXAAProgram.unload();
gDeferredWaterProgram.unload();
- return FALSE;
+ gDeferredWLSkyProgram.unload();
+ gDeferredWLCloudProgram.unload();
+ gDeferredStarProgram.unload();
+ gNormalMapGenProgram.unload();
+ return TRUE;
}
- mVertexShaderLevel[SHADER_AVATAR] = 1;
-
BOOL success = TRUE;
if (success)
@@ -910,13 +1041,102 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
gDeferredDiffuseProgram.mName = "Deferred Diffuse Shader";
gDeferredDiffuseProgram.mShaderFiles.clear();
gDeferredDiffuseProgram.mShaderFiles.push_back(make_pair("deferred/diffuseV.glsl", GL_VERTEX_SHADER_ARB));
- gDeferredDiffuseProgram.mShaderFiles.push_back(make_pair("deferred/diffuseF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredDiffuseProgram.mShaderFiles.push_back(make_pair("deferred/diffuseIndexedF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredDiffuseProgram.mFeatures.mIndexedTextureChannels = LLGLSLShader::sIndexedTextureChannels;
gDeferredDiffuseProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
success = gDeferredDiffuseProgram.createShader(NULL, NULL);
}
if (success)
{
+ gDeferredDiffuseAlphaMaskProgram.mName = "Deferred Diffuse Alpha Mask Shader";
+ gDeferredDiffuseAlphaMaskProgram.mShaderFiles.clear();
+ gDeferredDiffuseAlphaMaskProgram.mShaderFiles.push_back(make_pair("deferred/diffuseV.glsl", GL_VERTEX_SHADER_ARB));
+ gDeferredDiffuseAlphaMaskProgram.mShaderFiles.push_back(make_pair("deferred/diffuseAlphaMaskIndexedF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredDiffuseAlphaMaskProgram.mFeatures.mIndexedTextureChannels = LLGLSLShader::sIndexedTextureChannels;
+ gDeferredDiffuseAlphaMaskProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
+ success = gDeferredDiffuseAlphaMaskProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gDeferredNonIndexedDiffuseAlphaMaskProgram.mName = "Deferred Diffuse Non-Indexed Alpha Mask Shader";
+ gDeferredNonIndexedDiffuseAlphaMaskProgram.mShaderFiles.clear();
+ gDeferredNonIndexedDiffuseAlphaMaskProgram.mShaderFiles.push_back(make_pair("deferred/diffuseV.glsl", GL_VERTEX_SHADER_ARB));
+ gDeferredNonIndexedDiffuseAlphaMaskProgram.mShaderFiles.push_back(make_pair("deferred/diffuseAlphaMaskF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredNonIndexedDiffuseAlphaMaskProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
+ success = gDeferredNonIndexedDiffuseAlphaMaskProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram.mName = "Deferred Diffuse Non-Indexed Alpha Mask Shader";
+ gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram.mShaderFiles.clear();
+ gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram.mShaderFiles.push_back(make_pair("deferred/diffuseNoColorV.glsl", GL_VERTEX_SHADER_ARB));
+ gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram.mShaderFiles.push_back(make_pair("deferred/diffuseAlphaMaskNoColorF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
+ success = gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gDeferredNonIndexedDiffuseProgram.mName = "Non Indexed Deferred Diffuse Shader";
+ gDeferredNonIndexedDiffuseProgram.mShaderFiles.clear();
+ gDeferredNonIndexedDiffuseProgram.mShaderFiles.push_back(make_pair("deferred/diffuseV.glsl", GL_VERTEX_SHADER_ARB));
+ gDeferredNonIndexedDiffuseProgram.mShaderFiles.push_back(make_pair("deferred/diffuseF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredNonIndexedDiffuseProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
+ success = gDeferredNonIndexedDiffuseProgram.createShader(NULL, NULL);
+ }
+
+
+ if (success)
+ {
+ gDeferredSkinnedDiffuseProgram.mName = "Deferred Skinned Diffuse Shader";
+ gDeferredSkinnedDiffuseProgram.mFeatures.hasObjectSkinning = true;
+ gDeferredSkinnedDiffuseProgram.mShaderFiles.clear();
+ gDeferredSkinnedDiffuseProgram.mShaderFiles.push_back(make_pair("deferred/diffuseSkinnedV.glsl", GL_VERTEX_SHADER_ARB));
+ gDeferredSkinnedDiffuseProgram.mShaderFiles.push_back(make_pair("deferred/diffuseF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredSkinnedDiffuseProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
+ success = gDeferredSkinnedDiffuseProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gDeferredSkinnedBumpProgram.mName = "Deferred Skinned Bump Shader";
+ gDeferredSkinnedBumpProgram.mFeatures.hasObjectSkinning = true;
+ gDeferredSkinnedBumpProgram.mShaderFiles.clear();
+ gDeferredSkinnedBumpProgram.mShaderFiles.push_back(make_pair("deferred/bumpSkinnedV.glsl", GL_VERTEX_SHADER_ARB));
+ gDeferredSkinnedBumpProgram.mShaderFiles.push_back(make_pair("deferred/bumpF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredSkinnedBumpProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
+ success = gDeferredSkinnedBumpProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gDeferredSkinnedAlphaProgram.mName = "Deferred Skinned Alpha Shader";
+ gDeferredSkinnedAlphaProgram.mFeatures.atmosphericHelpers = true;
+ gDeferredSkinnedAlphaProgram.mFeatures.hasObjectSkinning = true;
+ gDeferredSkinnedAlphaProgram.mFeatures.calculatesAtmospherics = true;
+ gDeferredSkinnedAlphaProgram.mFeatures.hasGamma = true;
+ gDeferredSkinnedAlphaProgram.mFeatures.hasAtmospherics = true;
+ gDeferredSkinnedAlphaProgram.mFeatures.calculatesLighting = false;
+ gDeferredSkinnedAlphaProgram.mFeatures.hasLighting = false;
+ gDeferredSkinnedAlphaProgram.mFeatures.isAlphaLighting = true;
+ gDeferredSkinnedAlphaProgram.mFeatures.disableTextureIndex = true;
+ gDeferredSkinnedAlphaProgram.mShaderFiles.clear();
+ gDeferredSkinnedAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaSkinnedV.glsl", GL_VERTEX_SHADER_ARB));
+ gDeferredSkinnedAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaNonIndexedF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredSkinnedAlphaProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
+
+ success = gDeferredSkinnedAlphaProgram.createShader(NULL, NULL);
+
+ // Hack to include uniforms for lighting without linking in lighting file
+ gDeferredSkinnedAlphaProgram.mFeatures.calculatesLighting = true;
+ gDeferredSkinnedAlphaProgram.mFeatures.hasLighting = true;
+ }
+
+ if (success)
+ {
gDeferredBumpProgram.mName = "Deferred Bump Shader";
gDeferredBumpProgram.mShaderFiles.clear();
gDeferredBumpProgram.mShaderFiles.push_back(make_pair("deferred/bumpV.glsl", GL_VERTEX_SHADER_ARB));
@@ -937,6 +1157,16 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
if (success)
{
+ gDeferredTreeShadowProgram.mName = "Deferred Tree Shadow Shader";
+ gDeferredTreeShadowProgram.mShaderFiles.clear();
+ gDeferredTreeShadowProgram.mShaderFiles.push_back(make_pair("deferred/treeShadowV.glsl", GL_VERTEX_SHADER_ARB));
+ gDeferredTreeShadowProgram.mShaderFiles.push_back(make_pair("deferred/treeShadowF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredTreeShadowProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
+ success = gDeferredTreeShadowProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
gDeferredImpostorProgram.mName = "Deferred Impostor Shader";
gDeferredImpostorProgram.mShaderFiles.clear();
gDeferredImpostorProgram.mShaderFiles.push_back(make_pair("deferred/impostorV.glsl", GL_VERTEX_SHADER_ARB));
@@ -946,7 +1176,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
}
if (success)
- {
+ {
gDeferredLightProgram.mName = "Deferred Light Shader";
gDeferredLightProgram.mShaderFiles.clear();
gDeferredLightProgram.mShaderFiles.push_back(make_pair("deferred/pointLightV.glsl", GL_VERTEX_SHADER_ARB));
@@ -959,7 +1189,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
{
gDeferredMultiLightProgram.mName = "Deferred MultiLight Shader";
gDeferredMultiLightProgram.mShaderFiles.clear();
- gDeferredMultiLightProgram.mShaderFiles.push_back(make_pair("deferred/pointLightV.glsl", GL_VERTEX_SHADER_ARB));
+ gDeferredMultiLightProgram.mShaderFiles.push_back(make_pair("deferred/multiPointLightV.glsl", GL_VERTEX_SHADER_ARB));
gDeferredMultiLightProgram.mShaderFiles.push_back(make_pair("deferred/multiPointLightF.glsl", GL_FRAGMENT_SHADER_ARB));
gDeferredMultiLightProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
success = gDeferredMultiLightProgram.createShader(NULL, NULL);
@@ -988,6 +1218,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
if (success)
{
std::string fragment;
+ std::string vertex = "deferred/sunLightV.glsl";
if (gSavedSettings.getBOOL("RenderDeferredSSAO"))
{
@@ -996,11 +1227,15 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
else
{
fragment = "deferred/sunLightF.glsl";
+ if (mVertexShaderLevel[SHADER_DEFERRED] == 1)
+ { //no shadows, no SSAO, no frag coord
+ vertex = "deferred/sunLightNoFragCoordV.glsl";
+ }
}
gDeferredSunProgram.mName = "Deferred Sun Shader";
gDeferredSunProgram.mShaderFiles.clear();
- gDeferredSunProgram.mShaderFiles.push_back(make_pair("deferred/sunLightV.glsl", GL_VERTEX_SHADER_ARB));
+ gDeferredSunProgram.mShaderFiles.push_back(make_pair(vertex, GL_VERTEX_SHADER_ARB));
gDeferredSunProgram.mShaderFiles.push_back(make_pair(fragment, GL_FRAGMENT_SHADER_ARB));
gDeferredSunProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
success = gDeferredSunProgram.createShader(NULL, NULL);
@@ -1019,16 +1254,47 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
if (success)
{
gDeferredAlphaProgram.mName = "Deferred Alpha Shader";
- gDeferredAlphaProgram.mFeatures.calculatesLighting = true;
+ gDeferredAlphaProgram.mFeatures.atmosphericHelpers = true;
+ gDeferredAlphaProgram.mFeatures.calculatesLighting = false;
gDeferredAlphaProgram.mFeatures.calculatesAtmospherics = true;
gDeferredAlphaProgram.mFeatures.hasGamma = true;
gDeferredAlphaProgram.mFeatures.hasAtmospherics = true;
- gDeferredAlphaProgram.mFeatures.hasLighting = true;
+ gDeferredAlphaProgram.mFeatures.hasLighting = false;
+ gDeferredAlphaProgram.mFeatures.isAlphaLighting = true;
+ gDeferredAlphaProgram.mFeatures.disableTextureIndex = true; //hack to disable auto-setup of texture channels
+ if (mVertexShaderLevel[SHADER_DEFERRED] < 1)
+ {
+ gDeferredAlphaProgram.mFeatures.mIndexedTextureChannels = LLGLSLShader::sIndexedTextureChannels;
+ }
+ else
+ { //shave off some texture units for shadow maps
+ gDeferredAlphaProgram.mFeatures.mIndexedTextureChannels = llmax(LLGLSLShader::sIndexedTextureChannels - 6, 1);
+ }
+
gDeferredAlphaProgram.mShaderFiles.clear();
gDeferredAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaV.glsl", GL_VERTEX_SHADER_ARB));
gDeferredAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaF.glsl", GL_FRAGMENT_SHADER_ARB));
gDeferredAlphaProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
+
success = gDeferredAlphaProgram.createShader(NULL, NULL);
+
+ // Hack
+ gDeferredAlphaProgram.mFeatures.calculatesLighting = true;
+ gDeferredAlphaProgram.mFeatures.hasLighting = true;
+ }
+
+ if (success)
+ {
+ gDeferredAvatarEyesProgram.mName = "Deferred Avatar Eyes Shader";
+ gDeferredAvatarEyesProgram.mFeatures.calculatesAtmospherics = true;
+ gDeferredAvatarEyesProgram.mFeatures.hasGamma = true;
+ gDeferredAvatarEyesProgram.mFeatures.hasTransport = true;
+ gDeferredAvatarEyesProgram.mFeatures.disableTextureIndex = true;
+ gDeferredAvatarEyesProgram.mShaderFiles.clear();
+ gDeferredAvatarEyesProgram.mShaderFiles.push_back(make_pair("deferred/avatarEyesV.glsl", GL_VERTEX_SHADER_ARB));
+ gDeferredAvatarEyesProgram.mShaderFiles.push_back(make_pair("deferred/diffuseF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredAvatarEyesProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
+ success = gDeferredAvatarEyesProgram.createShader(NULL, NULL);
}
if (success)
@@ -1037,7 +1303,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
gDeferredFullbrightProgram.mFeatures.calculatesAtmospherics = true;
gDeferredFullbrightProgram.mFeatures.hasGamma = true;
gDeferredFullbrightProgram.mFeatures.hasTransport = true;
- gDeferredFullbrightProgram.mFeatures.isFullbright = true;
+ gDeferredFullbrightProgram.mFeatures.mIndexedTextureChannels = LLGLSLShader::sIndexedTextureChannels;
gDeferredFullbrightProgram.mShaderFiles.clear();
gDeferredFullbrightProgram.mShaderFiles.push_back(make_pair("deferred/fullbrightV.glsl", GL_VERTEX_SHADER_ARB));
gDeferredFullbrightProgram.mShaderFiles.push_back(make_pair("deferred/fullbrightF.glsl", GL_FRAGMENT_SHADER_ARB));
@@ -1047,6 +1313,20 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
if (success)
{
+ gDeferredEmissiveProgram.mName = "Deferred Emissive Shader";
+ gDeferredEmissiveProgram.mFeatures.calculatesAtmospherics = true;
+ gDeferredEmissiveProgram.mFeatures.hasGamma = true;
+ gDeferredEmissiveProgram.mFeatures.hasTransport = true;
+ gDeferredEmissiveProgram.mFeatures.mIndexedTextureChannels = LLGLSLShader::sIndexedTextureChannels;
+ gDeferredEmissiveProgram.mShaderFiles.clear();
+ gDeferredEmissiveProgram.mShaderFiles.push_back(make_pair("deferred/emissiveV.glsl", GL_VERTEX_SHADER_ARB));
+ gDeferredEmissiveProgram.mShaderFiles.push_back(make_pair("deferred/emissiveF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredEmissiveProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
+ success = gDeferredEmissiveProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
// load water shader
gDeferredWaterProgram.mName = "Deferred Water Shader";
gDeferredWaterProgram.mFeatures.calculatesAtmospherics = true;
@@ -1065,7 +1345,14 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
gDeferredSoftenProgram.mShaderFiles.clear();
gDeferredSoftenProgram.mShaderFiles.push_back(make_pair("deferred/softenLightV.glsl", GL_VERTEX_SHADER_ARB));
gDeferredSoftenProgram.mShaderFiles.push_back(make_pair("deferred/softenLightF.glsl", GL_FRAGMENT_SHADER_ARB));
+
gDeferredSoftenProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
+
+ if (gSavedSettings.getBOOL("RenderDeferredSSAO"))
+ { //if using SSAO, take screen space light map into account as if shadows are enabled
+ gDeferredSoftenProgram.mShaderLevel = llmax(gDeferredSoftenProgram.mShaderLevel, 2);
+ }
+
success = gDeferredSoftenProgram.createShader(NULL, NULL);
}
@@ -1081,13 +1368,35 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
if (success)
{
+ gDeferredShadowAlphaMaskProgram.mName = "Deferred Shadow Alpha Mask Shader";
+ gDeferredShadowAlphaMaskProgram.mFeatures.mIndexedTextureChannels = LLGLSLShader::sIndexedTextureChannels;
+ gDeferredShadowAlphaMaskProgram.mShaderFiles.clear();
+ gDeferredShadowAlphaMaskProgram.mShaderFiles.push_back(make_pair("deferred/shadowAlphaMaskV.glsl", GL_VERTEX_SHADER_ARB));
+ gDeferredShadowAlphaMaskProgram.mShaderFiles.push_back(make_pair("deferred/shadowAlphaMaskF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredShadowAlphaMaskProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
+ success = gDeferredShadowAlphaMaskProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
gDeferredAvatarShadowProgram.mName = "Deferred Avatar Shadow Shader";
gDeferredAvatarShadowProgram.mFeatures.hasSkinning = true;
gDeferredAvatarShadowProgram.mShaderFiles.clear();
gDeferredAvatarShadowProgram.mShaderFiles.push_back(make_pair("deferred/avatarShadowV.glsl", GL_VERTEX_SHADER_ARB));
gDeferredAvatarShadowProgram.mShaderFiles.push_back(make_pair("deferred/avatarShadowF.glsl", GL_FRAGMENT_SHADER_ARB));
gDeferredAvatarShadowProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
- success = gDeferredAvatarShadowProgram.createShader(&mAvatarAttribs, &mAvatarUniforms);
+ success = gDeferredAvatarShadowProgram.createShader(NULL, &mAvatarUniforms);
+ }
+
+ if (success)
+ {
+ gDeferredAttachmentShadowProgram.mName = "Deferred Attachment Shadow Shader";
+ gDeferredAttachmentShadowProgram.mFeatures.hasObjectSkinning = true;
+ gDeferredAttachmentShadowProgram.mShaderFiles.clear();
+ gDeferredAttachmentShadowProgram.mShaderFiles.push_back(make_pair("deferred/attachmentShadowV.glsl", GL_VERTEX_SHADER_ARB));
+ gDeferredAttachmentShadowProgram.mShaderFiles.push_back(make_pair("deferred/attachmentShadowF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredAttachmentShadowProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
+ success = gDeferredAttachmentShadowProgram.createShader(NULL, NULL);
}
if (success)
@@ -1108,89 +1417,125 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
gDeferredAvatarProgram.mShaderFiles.push_back(make_pair("deferred/avatarV.glsl", GL_VERTEX_SHADER_ARB));
gDeferredAvatarProgram.mShaderFiles.push_back(make_pair("deferred/avatarF.glsl", GL_FRAGMENT_SHADER_ARB));
gDeferredAvatarProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
- success = gDeferredAvatarProgram.createShader(&mAvatarAttribs, &mAvatarUniforms);
+ success = gDeferredAvatarProgram.createShader(NULL, &mAvatarUniforms);
}
if (success)
{
gDeferredAvatarAlphaProgram.mName = "Avatar Alpha Shader";
+ gDeferredAvatarAlphaProgram.mFeatures.atmosphericHelpers = true;
gDeferredAvatarAlphaProgram.mFeatures.hasSkinning = true;
- gDeferredAvatarAlphaProgram.mFeatures.calculatesLighting = true;
+ gDeferredAvatarAlphaProgram.mFeatures.calculatesLighting = false;
gDeferredAvatarAlphaProgram.mFeatures.calculatesAtmospherics = true;
gDeferredAvatarAlphaProgram.mFeatures.hasGamma = true;
gDeferredAvatarAlphaProgram.mFeatures.hasAtmospherics = true;
- gDeferredAvatarAlphaProgram.mFeatures.hasLighting = true;
+ gDeferredAvatarAlphaProgram.mFeatures.hasLighting = false;
+ gDeferredAvatarAlphaProgram.mFeatures.isAlphaLighting = true;
+ gDeferredAvatarAlphaProgram.mFeatures.disableTextureIndex = true;
gDeferredAvatarAlphaProgram.mShaderFiles.clear();
- gDeferredAvatarAlphaProgram.mShaderFiles.push_back(make_pair("deferred/avatarAlphaV.glsl", GL_VERTEX_SHADER_ARB));
- gDeferredAvatarAlphaProgram.mShaderFiles.push_back(make_pair("deferred/avatarAlphaF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredAvatarAlphaProgram.mShaderFiles.push_back(make_pair("deferred/avatarAlphaNoColorV.glsl", GL_VERTEX_SHADER_ARB));
+ gDeferredAvatarAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaNonIndexedNoColorF.glsl", GL_FRAGMENT_SHADER_ARB));
gDeferredAvatarAlphaProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
- success = gDeferredAvatarAlphaProgram.createShader(&mAvatarAttribs, &mAvatarUniforms);
+
+ success = gDeferredAvatarAlphaProgram.createShader(NULL, &mAvatarUniforms);
+
+ gDeferredAvatarAlphaProgram.mFeatures.calculatesLighting = true;
+ gDeferredAvatarAlphaProgram.mFeatures.hasLighting = true;
}
- if (mVertexShaderLevel[SHADER_DEFERRED] > 1)
+ if (success)
{
- if (success)
- {
- gDeferredEdgeProgram.mName = "Deferred Edge Shader";
- gDeferredEdgeProgram.mShaderFiles.clear();
- gDeferredEdgeProgram.mShaderFiles.push_back(make_pair("deferred/edgeV.glsl", GL_VERTEX_SHADER_ARB));
- gDeferredEdgeProgram.mShaderFiles.push_back(make_pair("deferred/edgeF.glsl", GL_FRAGMENT_SHADER_ARB));
- gDeferredEdgeProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
- success = gDeferredEdgeProgram.createShader(NULL, NULL);
- }
+ gFXAAProgram.mName = "FXAA Shader";
+ gFXAAProgram.mShaderFiles.clear();
+ gFXAAProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredV.glsl", GL_VERTEX_SHADER_ARB));
+ gFXAAProgram.mShaderFiles.push_back(make_pair("deferred/fxaaF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gFXAAProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
+ success = gFXAAProgram.createShader(NULL, NULL);
}
- if (mVertexShaderLevel[SHADER_DEFERRED] > 2)
+ if (success)
{
- if (success)
- {
- gDeferredPostProgram.mName = "Deferred Post Shader";
- gDeferredPostProgram.mShaderFiles.clear();
- gDeferredPostProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredV.glsl", GL_VERTEX_SHADER_ARB));
- gDeferredPostProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredF.glsl", GL_FRAGMENT_SHADER_ARB));
- gDeferredPostProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
- success = gDeferredPostProgram.createShader(NULL, NULL);
- }
+ gDeferredPostProgram.mName = "Deferred Post Shader";
+ gDeferredPostProgram.mShaderFiles.clear();
+ gDeferredPostProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredNoTCV.glsl", GL_VERTEX_SHADER_ARB));
+ gDeferredPostProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredPostProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
+ success = gDeferredPostProgram.createShader(NULL, NULL);
+ }
- if (success)
- {
- gDeferredPostGIProgram.mName = "Deferred Post GI Shader";
- gDeferredPostGIProgram.mShaderFiles.clear();
- gDeferredPostGIProgram.mShaderFiles.push_back(make_pair("deferred/postgiV.glsl", GL_VERTEX_SHADER_ARB));
- gDeferredPostGIProgram.mShaderFiles.push_back(make_pair("deferred/postgiF.glsl", GL_FRAGMENT_SHADER_ARB));
- gDeferredPostGIProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
- success = gDeferredPostGIProgram.createShader(NULL, NULL);
- }
+ if (success)
+ {
+ gDeferredCoFProgram.mName = "Deferred CoF Shader";
+ gDeferredCoFProgram.mShaderFiles.clear();
+ gDeferredCoFProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredNoTCV.glsl", GL_VERTEX_SHADER_ARB));
+ gDeferredCoFProgram.mShaderFiles.push_back(make_pair("deferred/cofF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredCoFProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
+ success = gDeferredCoFProgram.createShader(NULL, NULL);
+ }
- if (success)
- {
- gDeferredGIProgram.mName = "Deferred GI Shader";
- gDeferredGIProgram.mShaderFiles.clear();
- gDeferredGIProgram.mShaderFiles.push_back(make_pair("deferred/giV.glsl", GL_VERTEX_SHADER_ARB));
- gDeferredGIProgram.mShaderFiles.push_back(make_pair("deferred/giF.glsl", GL_FRAGMENT_SHADER_ARB));
- gDeferredGIProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
- success = gDeferredGIProgram.createShader(NULL, NULL);
- }
+ if (success)
+ {
+ gDeferredDoFCombineProgram.mName = "Deferred DoFCombine Shader";
+ gDeferredDoFCombineProgram.mShaderFiles.clear();
+ gDeferredDoFCombineProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredNoTCV.glsl", GL_VERTEX_SHADER_ARB));
+ gDeferredDoFCombineProgram.mShaderFiles.push_back(make_pair("deferred/dofCombineF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredDoFCombineProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
+ success = gDeferredDoFCombineProgram.createShader(NULL, NULL);
+ }
- if (success)
- {
- gDeferredGIFinalProgram.mName = "Deferred GI Final Shader";
- gDeferredGIFinalProgram.mShaderFiles.clear();
- gDeferredGIFinalProgram.mShaderFiles.push_back(make_pair("deferred/giFinalV.glsl", GL_VERTEX_SHADER_ARB));
- gDeferredGIFinalProgram.mShaderFiles.push_back(make_pair("deferred/giFinalF.glsl", GL_FRAGMENT_SHADER_ARB));
- gDeferredGIFinalProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
- success = gDeferredGIFinalProgram.createShader(NULL, NULL);
- }
+ if (success)
+ {
+ gDeferredPostNoDoFProgram.mName = "Deferred Post Shader";
+ gDeferredPostNoDoFProgram.mShaderFiles.clear();
+ gDeferredPostNoDoFProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredNoTCV.glsl", GL_VERTEX_SHADER_ARB));
+ gDeferredPostNoDoFProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredNoDoFF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredPostNoDoFProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
+ success = gDeferredPostNoDoFProgram.createShader(NULL, NULL);
+ }
- if (success)
- {
- gLuminanceGatherProgram.mName = "Luminance Gather Shader";
- gLuminanceGatherProgram.mShaderFiles.clear();
- gLuminanceGatherProgram.mShaderFiles.push_back(make_pair("deferred/luminanceV.glsl", GL_VERTEX_SHADER_ARB));
- gLuminanceGatherProgram.mShaderFiles.push_back(make_pair("deferred/luminanceF.glsl", GL_FRAGMENT_SHADER_ARB));
- gLuminanceGatherProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
- success = gLuminanceGatherProgram.createShader(NULL, NULL);
- }
+ if (success)
+ {
+ gDeferredWLSkyProgram.mName = "Deferred Windlight Sky Shader";
+ //gWLSkyProgram.mFeatures.hasGamma = true;
+ gDeferredWLSkyProgram.mShaderFiles.clear();
+ gDeferredWLSkyProgram.mShaderFiles.push_back(make_pair("deferred/skyV.glsl", GL_VERTEX_SHADER_ARB));
+ gDeferredWLSkyProgram.mShaderFiles.push_back(make_pair("deferred/skyF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredWLSkyProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
+ gDeferredWLSkyProgram.mShaderGroup = LLGLSLShader::SG_SKY;
+ success = gDeferredWLSkyProgram.createShader(NULL, &mWLUniforms);
+ }
+
+ if (success)
+ {
+ gDeferredWLCloudProgram.mName = "Deferred Windlight Cloud Program";
+ gDeferredWLCloudProgram.mShaderFiles.clear();
+ gDeferredWLCloudProgram.mShaderFiles.push_back(make_pair("deferred/cloudsV.glsl", GL_VERTEX_SHADER_ARB));
+ gDeferredWLCloudProgram.mShaderFiles.push_back(make_pair("deferred/cloudsF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredWLCloudProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
+ gDeferredWLCloudProgram.mShaderGroup = LLGLSLShader::SG_SKY;
+ success = gDeferredWLCloudProgram.createShader(NULL, &mWLUniforms);
+ }
+
+ if (success)
+ {
+ gDeferredStarProgram.mName = "Deferred Star Program";
+ gDeferredStarProgram.mShaderFiles.clear();
+ gDeferredStarProgram.mShaderFiles.push_back(make_pair("deferred/starsV.glsl", GL_VERTEX_SHADER_ARB));
+ gDeferredStarProgram.mShaderFiles.push_back(make_pair("deferred/starsF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredStarProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
+ gDeferredStarProgram.mShaderGroup = LLGLSLShader::SG_SKY;
+ success = gDeferredStarProgram.createShader(NULL, &mWLUniforms);
+ }
+
+ if (success)
+ {
+ gNormalMapGenProgram.mName = "Normal Map Generation Program";
+ gNormalMapGenProgram.mShaderFiles.clear();
+ gNormalMapGenProgram.mShaderFiles.push_back(make_pair("deferred/normgenV.glsl", GL_VERTEX_SHADER_ARB));
+ gNormalMapGenProgram.mShaderFiles.push_back(make_pair("deferred/normgenF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gNormalMapGenProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
+ gNormalMapGenProgram.mShaderGroup = LLGLSLShader::SG_SKY;
+ success = gNormalMapGenProgram.createShader(NULL, NULL);
}
return success;
@@ -1199,17 +1544,417 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
BOOL LLViewerShaderMgr::loadShadersObject()
{
BOOL success = TRUE;
-
+
if (mVertexShaderLevel[SHADER_OBJECT] == 0)
{
gObjectShinyProgram.unload();
gObjectFullbrightShinyProgram.unload();
+ gObjectFullbrightShinyWaterProgram.unload();
gObjectShinyWaterProgram.unload();
+ gObjectFullbrightNoColorProgram.unload();
+ gObjectFullbrightNoColorWaterProgram.unload();
gObjectSimpleProgram.unload();
+ gObjectPreviewProgram.unload();
+ gImpostorProgram.unload();
+ gObjectSimpleAlphaMaskProgram.unload();
+ gObjectBumpProgram.unload();
gObjectSimpleWaterProgram.unload();
+ gObjectSimpleWaterAlphaMaskProgram.unload();
+ gObjectEmissiveProgram.unload();
+ gObjectEmissiveWaterProgram.unload();
gObjectFullbrightProgram.unload();
+ gObjectFullbrightAlphaMaskProgram.unload();
gObjectFullbrightWaterProgram.unload();
- return FALSE;
+ gObjectFullbrightWaterAlphaMaskProgram.unload();
+ gObjectShinyNonIndexedProgram.unload();
+ gObjectFullbrightShinyNonIndexedProgram.unload();
+ gObjectFullbrightShinyNonIndexedWaterProgram.unload();
+ gObjectShinyNonIndexedWaterProgram.unload();
+ gObjectSimpleNonIndexedTexGenProgram.unload();
+ gObjectSimpleNonIndexedTexGenWaterProgram.unload();
+ gObjectSimpleNonIndexedWaterProgram.unload();
+ gObjectAlphaMaskNonIndexedProgram.unload();
+ gObjectAlphaMaskNonIndexedWaterProgram.unload();
+ gObjectAlphaMaskNoColorProgram.unload();
+ gObjectAlphaMaskNoColorWaterProgram.unload();
+ gObjectFullbrightNonIndexedProgram.unload();
+ gObjectFullbrightNonIndexedWaterProgram.unload();
+ gObjectEmissiveNonIndexedProgram.unload();
+ gObjectEmissiveNonIndexedWaterProgram.unload();
+ gSkinnedObjectSimpleProgram.unload();
+ gSkinnedObjectFullbrightProgram.unload();
+ gSkinnedObjectEmissiveProgram.unload();
+ gSkinnedObjectFullbrightShinyProgram.unload();
+ gSkinnedObjectShinySimpleProgram.unload();
+ gSkinnedObjectSimpleWaterProgram.unload();
+ gSkinnedObjectFullbrightWaterProgram.unload();
+ gSkinnedObjectEmissiveWaterProgram.unload();
+ gSkinnedObjectFullbrightShinyWaterProgram.unload();
+ gSkinnedObjectShinySimpleWaterProgram.unload();
+ gTreeProgram.unload();
+ gTreeWaterProgram.unload();
+
+ return TRUE;
+ }
+
+ if (success)
+ {
+ gObjectSimpleNonIndexedProgram.mName = "Non indexed Shader";
+ gObjectSimpleNonIndexedProgram.mFeatures.calculatesLighting = true;
+ gObjectSimpleNonIndexedProgram.mFeatures.calculatesAtmospherics = true;
+ gObjectSimpleNonIndexedProgram.mFeatures.hasGamma = true;
+ gObjectSimpleNonIndexedProgram.mFeatures.hasAtmospherics = true;
+ gObjectSimpleNonIndexedProgram.mFeatures.hasLighting = true;
+ gObjectSimpleNonIndexedProgram.mFeatures.disableTextureIndex = true;
+ gObjectSimpleNonIndexedProgram.mShaderFiles.clear();
+ gObjectSimpleNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/simpleV.glsl", GL_VERTEX_SHADER_ARB));
+ gObjectSimpleNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/simpleF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gObjectSimpleNonIndexedProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ success = gObjectSimpleNonIndexedProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gObjectSimpleNonIndexedTexGenProgram.mName = "Non indexed tex-gen Shader";
+ gObjectSimpleNonIndexedTexGenProgram.mFeatures.calculatesLighting = true;
+ gObjectSimpleNonIndexedTexGenProgram.mFeatures.calculatesAtmospherics = true;
+ gObjectSimpleNonIndexedTexGenProgram.mFeatures.hasGamma = true;
+ gObjectSimpleNonIndexedTexGenProgram.mFeatures.hasAtmospherics = true;
+ gObjectSimpleNonIndexedTexGenProgram.mFeatures.hasLighting = true;
+ gObjectSimpleNonIndexedTexGenProgram.mFeatures.disableTextureIndex = true;
+ gObjectSimpleNonIndexedTexGenProgram.mShaderFiles.clear();
+ gObjectSimpleNonIndexedTexGenProgram.mShaderFiles.push_back(make_pair("objects/simpleTexGenV.glsl", GL_VERTEX_SHADER_ARB));
+ gObjectSimpleNonIndexedTexGenProgram.mShaderFiles.push_back(make_pair("objects/simpleF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gObjectSimpleNonIndexedTexGenProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ success = gObjectSimpleNonIndexedTexGenProgram.createShader(NULL, NULL);
+ }
+
+
+ if (success)
+ {
+ gObjectSimpleNonIndexedWaterProgram.mName = "Non indexed Water Shader";
+ gObjectSimpleNonIndexedWaterProgram.mFeatures.calculatesLighting = true;
+ gObjectSimpleNonIndexedWaterProgram.mFeatures.calculatesAtmospherics = true;
+ gObjectSimpleNonIndexedWaterProgram.mFeatures.hasWaterFog = true;
+ gObjectSimpleNonIndexedWaterProgram.mFeatures.hasAtmospherics = true;
+ gObjectSimpleNonIndexedWaterProgram.mFeatures.hasLighting = true;
+ gObjectSimpleNonIndexedWaterProgram.mFeatures.disableTextureIndex = true;
+ gObjectSimpleNonIndexedWaterProgram.mShaderFiles.clear();
+ gObjectSimpleNonIndexedWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleV.glsl", GL_VERTEX_SHADER_ARB));
+ gObjectSimpleNonIndexedWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gObjectSimpleNonIndexedWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ gObjectSimpleNonIndexedWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
+ success = gObjectSimpleNonIndexedWaterProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gObjectSimpleNonIndexedTexGenWaterProgram.mName = "Non indexed tex-gen Water Shader";
+ gObjectSimpleNonIndexedTexGenWaterProgram.mFeatures.calculatesLighting = true;
+ gObjectSimpleNonIndexedTexGenWaterProgram.mFeatures.calculatesAtmospherics = true;
+ gObjectSimpleNonIndexedTexGenWaterProgram.mFeatures.hasWaterFog = true;
+ gObjectSimpleNonIndexedTexGenWaterProgram.mFeatures.hasAtmospherics = true;
+ gObjectSimpleNonIndexedTexGenWaterProgram.mFeatures.hasLighting = true;
+ gObjectSimpleNonIndexedTexGenWaterProgram.mFeatures.disableTextureIndex = true;
+ gObjectSimpleNonIndexedTexGenWaterProgram.mShaderFiles.clear();
+ gObjectSimpleNonIndexedTexGenWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleTexGenV.glsl", GL_VERTEX_SHADER_ARB));
+ gObjectSimpleNonIndexedTexGenWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gObjectSimpleNonIndexedTexGenWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ gObjectSimpleNonIndexedTexGenWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
+ success = gObjectSimpleNonIndexedTexGenWaterProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gObjectAlphaMaskNonIndexedProgram.mName = "Non indexed alpha mask Shader";
+ gObjectAlphaMaskNonIndexedProgram.mFeatures.calculatesLighting = true;
+ gObjectAlphaMaskNonIndexedProgram.mFeatures.calculatesAtmospherics = true;
+ gObjectAlphaMaskNonIndexedProgram.mFeatures.hasGamma = true;
+ gObjectAlphaMaskNonIndexedProgram.mFeatures.hasAtmospherics = true;
+ gObjectAlphaMaskNonIndexedProgram.mFeatures.hasLighting = true;
+ gObjectAlphaMaskNonIndexedProgram.mFeatures.disableTextureIndex = true;
+ gObjectAlphaMaskNonIndexedProgram.mFeatures.hasAlphaMask = true;
+ gObjectAlphaMaskNonIndexedProgram.mShaderFiles.clear();
+ gObjectAlphaMaskNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/simpleNonIndexedV.glsl", GL_VERTEX_SHADER_ARB));
+ gObjectAlphaMaskNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/simpleF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gObjectAlphaMaskNonIndexedProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ success = gObjectAlphaMaskNonIndexedProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gObjectAlphaMaskNonIndexedWaterProgram.mName = "Non indexed alpha mask Water Shader";
+ gObjectAlphaMaskNonIndexedWaterProgram.mFeatures.calculatesLighting = true;
+ gObjectAlphaMaskNonIndexedWaterProgram.mFeatures.calculatesAtmospherics = true;
+ gObjectAlphaMaskNonIndexedWaterProgram.mFeatures.hasWaterFog = true;
+ gObjectAlphaMaskNonIndexedWaterProgram.mFeatures.hasAtmospherics = true;
+ gObjectAlphaMaskNonIndexedWaterProgram.mFeatures.hasLighting = true;
+ gObjectAlphaMaskNonIndexedWaterProgram.mFeatures.disableTextureIndex = true;
+ gObjectAlphaMaskNonIndexedWaterProgram.mFeatures.hasAlphaMask = true;
+ gObjectAlphaMaskNonIndexedWaterProgram.mShaderFiles.clear();
+ gObjectAlphaMaskNonIndexedWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleNonIndexedV.glsl", GL_VERTEX_SHADER_ARB));
+ gObjectAlphaMaskNonIndexedWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gObjectAlphaMaskNonIndexedWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ gObjectAlphaMaskNonIndexedWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
+ success = gObjectAlphaMaskNonIndexedWaterProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gObjectAlphaMaskNoColorProgram.mName = "No color alpha mask Shader";
+ gObjectAlphaMaskNoColorProgram.mFeatures.calculatesLighting = true;
+ gObjectAlphaMaskNoColorProgram.mFeatures.calculatesAtmospherics = true;
+ gObjectAlphaMaskNoColorProgram.mFeatures.hasGamma = true;
+ gObjectAlphaMaskNoColorProgram.mFeatures.hasAtmospherics = true;
+ gObjectAlphaMaskNoColorProgram.mFeatures.hasLighting = true;
+ gObjectAlphaMaskNoColorProgram.mFeatures.disableTextureIndex = true;
+ gObjectAlphaMaskNoColorProgram.mFeatures.hasAlphaMask = true;
+ gObjectAlphaMaskNoColorProgram.mShaderFiles.clear();
+ gObjectAlphaMaskNoColorProgram.mShaderFiles.push_back(make_pair("objects/simpleNoColorV.glsl", GL_VERTEX_SHADER_ARB));
+ gObjectAlphaMaskNoColorProgram.mShaderFiles.push_back(make_pair("objects/simpleF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gObjectAlphaMaskNoColorProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ success = gObjectAlphaMaskNoColorProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gObjectAlphaMaskNoColorWaterProgram.mName = "No color alpha mask Water Shader";
+ gObjectAlphaMaskNoColorWaterProgram.mFeatures.calculatesLighting = true;
+ gObjectAlphaMaskNoColorWaterProgram.mFeatures.calculatesAtmospherics = true;
+ gObjectAlphaMaskNoColorWaterProgram.mFeatures.hasWaterFog = true;
+ gObjectAlphaMaskNoColorWaterProgram.mFeatures.hasAtmospherics = true;
+ gObjectAlphaMaskNoColorWaterProgram.mFeatures.hasLighting = true;
+ gObjectAlphaMaskNoColorWaterProgram.mFeatures.disableTextureIndex = true;
+ gObjectAlphaMaskNoColorWaterProgram.mFeatures.hasAlphaMask = true;
+ gObjectAlphaMaskNoColorWaterProgram.mShaderFiles.clear();
+ gObjectAlphaMaskNoColorWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleNoColorV.glsl", GL_VERTEX_SHADER_ARB));
+ gObjectAlphaMaskNoColorWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gObjectAlphaMaskNoColorWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ gObjectAlphaMaskNoColorWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
+ success = gObjectAlphaMaskNoColorWaterProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gTreeProgram.mName = "Tree Shader";
+ gTreeProgram.mFeatures.calculatesLighting = true;
+ gTreeProgram.mFeatures.calculatesAtmospherics = true;
+ gTreeProgram.mFeatures.hasGamma = true;
+ gTreeProgram.mFeatures.hasAtmospherics = true;
+ gTreeProgram.mFeatures.hasLighting = true;
+ gTreeProgram.mFeatures.disableTextureIndex = true;
+ gTreeProgram.mFeatures.hasAlphaMask = true;
+ gTreeProgram.mShaderFiles.clear();
+ gTreeProgram.mShaderFiles.push_back(make_pair("objects/treeV.glsl", GL_VERTEX_SHADER_ARB));
+ gTreeProgram.mShaderFiles.push_back(make_pair("objects/simpleF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gTreeProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ success = gTreeProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gTreeWaterProgram.mName = "Tree Water Shader";
+ gTreeWaterProgram.mFeatures.calculatesLighting = true;
+ gTreeWaterProgram.mFeatures.calculatesAtmospherics = true;
+ gTreeWaterProgram.mFeatures.hasWaterFog = true;
+ gTreeWaterProgram.mFeatures.hasAtmospherics = true;
+ gTreeWaterProgram.mFeatures.hasLighting = true;
+ gTreeWaterProgram.mFeatures.disableTextureIndex = true;
+ gTreeWaterProgram.mFeatures.hasAlphaMask = true;
+ gTreeWaterProgram.mShaderFiles.clear();
+ gTreeWaterProgram.mShaderFiles.push_back(make_pair("objects/treeV.glsl", GL_VERTEX_SHADER_ARB));
+ gTreeWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gTreeWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ gTreeWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
+ success = gTreeWaterProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gObjectFullbrightNonIndexedProgram.mName = "Non Indexed Fullbright Shader";
+ gObjectFullbrightNonIndexedProgram.mFeatures.calculatesAtmospherics = true;
+ gObjectFullbrightNonIndexedProgram.mFeatures.hasGamma = true;
+ gObjectFullbrightNonIndexedProgram.mFeatures.hasTransport = true;
+ gObjectFullbrightNonIndexedProgram.mFeatures.isFullbright = true;
+ gObjectFullbrightNonIndexedProgram.mFeatures.disableTextureIndex = true;
+ gObjectFullbrightNonIndexedProgram.mShaderFiles.clear();
+ gObjectFullbrightNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/fullbrightV.glsl", GL_VERTEX_SHADER_ARB));
+ gObjectFullbrightNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/fullbrightF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gObjectFullbrightNonIndexedProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ success = gObjectFullbrightNonIndexedProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gObjectFullbrightNonIndexedWaterProgram.mName = "Non Indexed Fullbright Water Shader";
+ gObjectFullbrightNonIndexedWaterProgram.mFeatures.calculatesAtmospherics = true;
+ gObjectFullbrightNonIndexedWaterProgram.mFeatures.isFullbright = true;
+ gObjectFullbrightNonIndexedWaterProgram.mFeatures.hasWaterFog = true;
+ gObjectFullbrightNonIndexedWaterProgram.mFeatures.hasTransport = true;
+ gObjectFullbrightNonIndexedWaterProgram.mFeatures.disableTextureIndex = true;
+ gObjectFullbrightNonIndexedWaterProgram.mShaderFiles.clear();
+ gObjectFullbrightNonIndexedWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightV.glsl", GL_VERTEX_SHADER_ARB));
+ gObjectFullbrightNonIndexedWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gObjectFullbrightNonIndexedWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ gObjectFullbrightNonIndexedWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
+ success = gObjectFullbrightNonIndexedWaterProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gObjectEmissiveNonIndexedProgram.mName = "Non Indexed Emissive Shader";
+ gObjectEmissiveNonIndexedProgram.mFeatures.calculatesAtmospherics = true;
+ gObjectEmissiveNonIndexedProgram.mFeatures.hasGamma = true;
+ gObjectEmissiveNonIndexedProgram.mFeatures.hasTransport = true;
+ gObjectEmissiveNonIndexedProgram.mFeatures.isFullbright = true;
+ gObjectEmissiveNonIndexedProgram.mFeatures.disableTextureIndex = true;
+ gObjectEmissiveNonIndexedProgram.mShaderFiles.clear();
+ gObjectEmissiveNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/emissiveV.glsl", GL_VERTEX_SHADER_ARB));
+ gObjectEmissiveNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/fullbrightF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gObjectEmissiveNonIndexedProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ success = gObjectEmissiveNonIndexedProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gObjectEmissiveNonIndexedWaterProgram.mName = "Non Indexed Emissive Water Shader";
+ gObjectEmissiveNonIndexedWaterProgram.mFeatures.calculatesAtmospherics = true;
+ gObjectEmissiveNonIndexedWaterProgram.mFeatures.isFullbright = true;
+ gObjectEmissiveNonIndexedWaterProgram.mFeatures.hasWaterFog = true;
+ gObjectEmissiveNonIndexedWaterProgram.mFeatures.hasTransport = true;
+ gObjectEmissiveNonIndexedWaterProgram.mFeatures.disableTextureIndex = true;
+ gObjectEmissiveNonIndexedWaterProgram.mShaderFiles.clear();
+ gObjectEmissiveNonIndexedWaterProgram.mShaderFiles.push_back(make_pair("objects/emissiveV.glsl", GL_VERTEX_SHADER_ARB));
+ gObjectEmissiveNonIndexedWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gObjectEmissiveNonIndexedWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ gObjectEmissiveNonIndexedWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
+ success = gObjectEmissiveNonIndexedWaterProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gObjectFullbrightNoColorProgram.mName = "Non Indexed no color Fullbright Shader";
+ gObjectFullbrightNoColorProgram.mFeatures.calculatesAtmospherics = true;
+ gObjectFullbrightNoColorProgram.mFeatures.hasGamma = true;
+ gObjectFullbrightNoColorProgram.mFeatures.hasTransport = true;
+ gObjectFullbrightNoColorProgram.mFeatures.isFullbright = true;
+ gObjectFullbrightNoColorProgram.mFeatures.disableTextureIndex = true;
+ gObjectFullbrightNoColorProgram.mShaderFiles.clear();
+ gObjectFullbrightNoColorProgram.mShaderFiles.push_back(make_pair("objects/fullbrightNoColorV.glsl", GL_VERTEX_SHADER_ARB));
+ gObjectFullbrightNoColorProgram.mShaderFiles.push_back(make_pair("objects/fullbrightF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gObjectFullbrightNoColorProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ success = gObjectFullbrightNoColorProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gObjectFullbrightNoColorWaterProgram.mName = "Non Indexed no color Fullbright Water Shader";
+ gObjectFullbrightNoColorWaterProgram.mFeatures.calculatesAtmospherics = true;
+ gObjectFullbrightNoColorWaterProgram.mFeatures.isFullbright = true;
+ gObjectFullbrightNoColorWaterProgram.mFeatures.hasWaterFog = true;
+ gObjectFullbrightNoColorWaterProgram.mFeatures.hasTransport = true;
+ gObjectFullbrightNoColorWaterProgram.mFeatures.disableTextureIndex = true;
+ gObjectFullbrightNoColorWaterProgram.mShaderFiles.clear();
+ gObjectFullbrightNoColorWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightNoColorV.glsl", GL_VERTEX_SHADER_ARB));
+ gObjectFullbrightNoColorWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gObjectFullbrightNoColorWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ gObjectFullbrightNoColorWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
+ success = gObjectFullbrightNoColorWaterProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gObjectShinyNonIndexedProgram.mName = "Non Indexed Shiny Shader";
+ gObjectShinyNonIndexedProgram.mFeatures.calculatesAtmospherics = true;
+ gObjectShinyNonIndexedProgram.mFeatures.calculatesLighting = true;
+ gObjectShinyNonIndexedProgram.mFeatures.hasGamma = true;
+ gObjectShinyNonIndexedProgram.mFeatures.hasAtmospherics = true;
+ gObjectShinyNonIndexedProgram.mFeatures.isShiny = true;
+ gObjectShinyNonIndexedProgram.mFeatures.disableTextureIndex = true;
+ gObjectShinyNonIndexedProgram.mShaderFiles.clear();
+ gObjectShinyNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/shinyV.glsl", GL_VERTEX_SHADER_ARB));
+ gObjectShinyNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/shinyF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gObjectShinyNonIndexedProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ success = gObjectShinyNonIndexedProgram.createShader(NULL, &mShinyUniforms);
+ }
+
+ if (success)
+ {
+ gObjectShinyNonIndexedWaterProgram.mName = "Non Indexed Shiny Water Shader";
+ gObjectShinyNonIndexedWaterProgram.mFeatures.calculatesAtmospherics = true;
+ gObjectShinyNonIndexedWaterProgram.mFeatures.calculatesLighting = true;
+ gObjectShinyNonIndexedWaterProgram.mFeatures.isShiny = true;
+ gObjectShinyNonIndexedWaterProgram.mFeatures.hasWaterFog = true;
+ gObjectShinyNonIndexedWaterProgram.mFeatures.hasAtmospherics = true;
+ gObjectShinyNonIndexedWaterProgram.mFeatures.disableTextureIndex = true;
+ gObjectShinyNonIndexedWaterProgram.mShaderFiles.clear();
+ gObjectShinyNonIndexedWaterProgram.mShaderFiles.push_back(make_pair("objects/shinyWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gObjectShinyNonIndexedWaterProgram.mShaderFiles.push_back(make_pair("objects/shinyV.glsl", GL_VERTEX_SHADER_ARB));
+ gObjectShinyNonIndexedWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ gObjectShinyNonIndexedWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
+ success = gObjectShinyNonIndexedWaterProgram.createShader(NULL, &mShinyUniforms);
+ }
+
+ if (success)
+ {
+ gObjectFullbrightShinyNonIndexedProgram.mName = "Non Indexed Fullbright Shiny Shader";
+ gObjectFullbrightShinyNonIndexedProgram.mFeatures.calculatesAtmospherics = true;
+ gObjectFullbrightShinyNonIndexedProgram.mFeatures.isFullbright = true;
+ gObjectFullbrightShinyNonIndexedProgram.mFeatures.isShiny = true;
+ gObjectFullbrightShinyNonIndexedProgram.mFeatures.hasGamma = true;
+ gObjectFullbrightShinyNonIndexedProgram.mFeatures.hasTransport = true;
+ gObjectFullbrightShinyNonIndexedProgram.mFeatures.disableTextureIndex = true;
+ gObjectFullbrightShinyNonIndexedProgram.mShaderFiles.clear();
+ gObjectFullbrightShinyNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinyV.glsl", GL_VERTEX_SHADER_ARB));
+ gObjectFullbrightShinyNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinyF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gObjectFullbrightShinyNonIndexedProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ success = gObjectFullbrightShinyNonIndexedProgram.createShader(NULL, &mShinyUniforms);
+ }
+
+ if (success)
+ {
+ gObjectFullbrightShinyNonIndexedWaterProgram.mName = "Non Indexed Fullbright Shiny Water Shader";
+ gObjectFullbrightShinyNonIndexedWaterProgram.mFeatures.calculatesAtmospherics = true;
+ gObjectFullbrightShinyNonIndexedWaterProgram.mFeatures.isFullbright = true;
+ gObjectFullbrightShinyNonIndexedWaterProgram.mFeatures.isShiny = true;
+ gObjectFullbrightShinyNonIndexedWaterProgram.mFeatures.hasGamma = true;
+ gObjectFullbrightShinyNonIndexedWaterProgram.mFeatures.hasTransport = true;
+ gObjectFullbrightShinyNonIndexedWaterProgram.mFeatures.hasWaterFog = true;
+ gObjectFullbrightShinyNonIndexedWaterProgram.mFeatures.disableTextureIndex = true;
+ gObjectFullbrightShinyNonIndexedWaterProgram.mShaderFiles.clear();
+ gObjectFullbrightShinyNonIndexedWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinyV.glsl", GL_VERTEX_SHADER_ARB));
+ gObjectFullbrightShinyNonIndexedWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinyWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gObjectFullbrightShinyNonIndexedWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ gObjectFullbrightShinyNonIndexedWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
+ success = gObjectFullbrightShinyNonIndexedWaterProgram.createShader(NULL, &mShinyUniforms);
+ }
+
+ if (success)
+ {
+ gImpostorProgram.mName = "Impostor Shader";
+ gImpostorProgram.mFeatures.disableTextureIndex = true;
+ gImpostorProgram.mShaderFiles.clear();
+ gImpostorProgram.mShaderFiles.push_back(make_pair("objects/impostorV.glsl", GL_VERTEX_SHADER_ARB));
+ gImpostorProgram.mShaderFiles.push_back(make_pair("objects/impostorF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gImpostorProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ success = gImpostorProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gObjectPreviewProgram.mName = "Simple Shader";
+ gObjectPreviewProgram.mFeatures.calculatesLighting = true;
+ gObjectPreviewProgram.mFeatures.calculatesAtmospherics = true;
+ gObjectPreviewProgram.mFeatures.hasGamma = true;
+ gObjectPreviewProgram.mFeatures.hasAtmospherics = true;
+ gObjectPreviewProgram.mFeatures.hasLighting = true;
+ gObjectPreviewProgram.mFeatures.mIndexedTextureChannels = 0;
+ gObjectPreviewProgram.mFeatures.disableTextureIndex = true;
+ gObjectPreviewProgram.mShaderFiles.clear();
+ gObjectPreviewProgram.mShaderFiles.push_back(make_pair("objects/previewV.glsl", GL_VERTEX_SHADER_ARB));
+ gObjectPreviewProgram.mShaderFiles.push_back(make_pair("objects/simpleF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gObjectPreviewProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ success = gObjectPreviewProgram.createShader(NULL, NULL);
}
if (success)
@@ -1220,13 +1965,14 @@ BOOL LLViewerShaderMgr::loadShadersObject()
gObjectSimpleProgram.mFeatures.hasGamma = true;
gObjectSimpleProgram.mFeatures.hasAtmospherics = true;
gObjectSimpleProgram.mFeatures.hasLighting = true;
+ gObjectSimpleProgram.mFeatures.mIndexedTextureChannels = 0;
gObjectSimpleProgram.mShaderFiles.clear();
gObjectSimpleProgram.mShaderFiles.push_back(make_pair("objects/simpleV.glsl", GL_VERTEX_SHADER_ARB));
gObjectSimpleProgram.mShaderFiles.push_back(make_pair("objects/simpleF.glsl", GL_FRAGMENT_SHADER_ARB));
gObjectSimpleProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
success = gObjectSimpleProgram.createShader(NULL, NULL);
}
-
+
if (success)
{
gObjectSimpleWaterProgram.mName = "Simple Water Shader";
@@ -1235,6 +1981,7 @@ BOOL LLViewerShaderMgr::loadShadersObject()
gObjectSimpleWaterProgram.mFeatures.hasWaterFog = true;
gObjectSimpleWaterProgram.mFeatures.hasAtmospherics = true;
gObjectSimpleWaterProgram.mFeatures.hasLighting = true;
+ gObjectSimpleWaterProgram.mFeatures.mIndexedTextureChannels = 0;
gObjectSimpleWaterProgram.mShaderFiles.clear();
gObjectSimpleWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleV.glsl", GL_VERTEX_SHADER_ARB));
gObjectSimpleWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
@@ -1245,11 +1992,72 @@ BOOL LLViewerShaderMgr::loadShadersObject()
if (success)
{
+ gObjectBumpProgram.mName = "Bump Shader";
+ /*gObjectBumpProgram.mFeatures.calculatesLighting = true;
+ gObjectBumpProgram.mFeatures.calculatesAtmospherics = true;
+ gObjectBumpProgram.mFeatures.hasGamma = true;
+ gObjectBumpProgram.mFeatures.hasAtmospherics = true;
+ gObjectBumpProgram.mFeatures.hasLighting = true;
+ gObjectBumpProgram.mFeatures.mIndexedTextureChannels = 0;*/
+ gObjectBumpProgram.mShaderFiles.clear();
+ gObjectBumpProgram.mShaderFiles.push_back(make_pair("objects/bumpV.glsl", GL_VERTEX_SHADER_ARB));
+ gObjectBumpProgram.mShaderFiles.push_back(make_pair("objects/bumpF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gObjectBumpProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ success = gObjectBumpProgram.createShader(NULL, NULL);
+
+ if (success)
+ { //lldrawpoolbump assumes "texture0" has channel 0 and "texture1" has channel 1
+ gObjectBumpProgram.bind();
+ gObjectBumpProgram.uniform1i("texture0", 0);
+ gObjectBumpProgram.uniform1i("texture1", 1);
+ gObjectBumpProgram.unbind();
+ }
+ }
+
+
+ if (success)
+ {
+ gObjectSimpleAlphaMaskProgram.mName = "Simple Alpha Mask Shader";
+ gObjectSimpleAlphaMaskProgram.mFeatures.calculatesLighting = true;
+ gObjectSimpleAlphaMaskProgram.mFeatures.calculatesAtmospherics = true;
+ gObjectSimpleAlphaMaskProgram.mFeatures.hasGamma = true;
+ gObjectSimpleAlphaMaskProgram.mFeatures.hasAtmospherics = true;
+ gObjectSimpleAlphaMaskProgram.mFeatures.hasLighting = true;
+ gObjectSimpleAlphaMaskProgram.mFeatures.hasAlphaMask = true;
+ gObjectSimpleAlphaMaskProgram.mFeatures.mIndexedTextureChannels = 0;
+ gObjectSimpleAlphaMaskProgram.mShaderFiles.clear();
+ gObjectSimpleAlphaMaskProgram.mShaderFiles.push_back(make_pair("objects/simpleV.glsl", GL_VERTEX_SHADER_ARB));
+ gObjectSimpleAlphaMaskProgram.mShaderFiles.push_back(make_pair("objects/simpleF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gObjectSimpleAlphaMaskProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ success = gObjectSimpleAlphaMaskProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gObjectSimpleWaterAlphaMaskProgram.mName = "Simple Water Alpha Mask Shader";
+ gObjectSimpleWaterAlphaMaskProgram.mFeatures.calculatesLighting = true;
+ gObjectSimpleWaterAlphaMaskProgram.mFeatures.calculatesAtmospherics = true;
+ gObjectSimpleWaterAlphaMaskProgram.mFeatures.hasWaterFog = true;
+ gObjectSimpleWaterAlphaMaskProgram.mFeatures.hasAtmospherics = true;
+ gObjectSimpleWaterAlphaMaskProgram.mFeatures.hasLighting = true;
+ gObjectSimpleWaterAlphaMaskProgram.mFeatures.hasAlphaMask = true;
+ gObjectSimpleWaterAlphaMaskProgram.mFeatures.mIndexedTextureChannels = 0;
+ gObjectSimpleWaterAlphaMaskProgram.mShaderFiles.clear();
+ gObjectSimpleWaterAlphaMaskProgram.mShaderFiles.push_back(make_pair("objects/simpleV.glsl", GL_VERTEX_SHADER_ARB));
+ gObjectSimpleWaterAlphaMaskProgram.mShaderFiles.push_back(make_pair("objects/simpleWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gObjectSimpleWaterAlphaMaskProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ gObjectSimpleWaterAlphaMaskProgram.mShaderGroup = LLGLSLShader::SG_WATER;
+ success = gObjectSimpleWaterAlphaMaskProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
gObjectFullbrightProgram.mName = "Fullbright Shader";
gObjectFullbrightProgram.mFeatures.calculatesAtmospherics = true;
gObjectFullbrightProgram.mFeatures.hasGamma = true;
gObjectFullbrightProgram.mFeatures.hasTransport = true;
gObjectFullbrightProgram.mFeatures.isFullbright = true;
+ gObjectFullbrightProgram.mFeatures.mIndexedTextureChannels = 0;
gObjectFullbrightProgram.mShaderFiles.clear();
gObjectFullbrightProgram.mShaderFiles.push_back(make_pair("objects/fullbrightV.glsl", GL_VERTEX_SHADER_ARB));
gObjectFullbrightProgram.mShaderFiles.push_back(make_pair("objects/fullbrightF.glsl", GL_FRAGMENT_SHADER_ARB));
@@ -1264,6 +2072,7 @@ BOOL LLViewerShaderMgr::loadShadersObject()
gObjectFullbrightWaterProgram.mFeatures.isFullbright = true;
gObjectFullbrightWaterProgram.mFeatures.hasWaterFog = true;
gObjectFullbrightWaterProgram.mFeatures.hasTransport = true;
+ gObjectFullbrightWaterProgram.mFeatures.mIndexedTextureChannels = 0;
gObjectFullbrightWaterProgram.mShaderFiles.clear();
gObjectFullbrightWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightV.glsl", GL_VERTEX_SHADER_ARB));
gObjectFullbrightWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
@@ -1274,12 +2083,77 @@ BOOL LLViewerShaderMgr::loadShadersObject()
if (success)
{
+ gObjectEmissiveProgram.mName = "Emissive Shader";
+ gObjectEmissiveProgram.mFeatures.calculatesAtmospherics = true;
+ gObjectEmissiveProgram.mFeatures.hasGamma = true;
+ gObjectEmissiveProgram.mFeatures.hasTransport = true;
+ gObjectEmissiveProgram.mFeatures.isFullbright = true;
+ gObjectEmissiveProgram.mFeatures.mIndexedTextureChannels = 0;
+ gObjectEmissiveProgram.mShaderFiles.clear();
+ gObjectEmissiveProgram.mShaderFiles.push_back(make_pair("objects/emissiveV.glsl", GL_VERTEX_SHADER_ARB));
+ gObjectEmissiveProgram.mShaderFiles.push_back(make_pair("objects/fullbrightF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gObjectEmissiveProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ success = gObjectEmissiveProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gObjectEmissiveWaterProgram.mName = "Emissive Water Shader";
+ gObjectEmissiveWaterProgram.mFeatures.calculatesAtmospherics = true;
+ gObjectEmissiveWaterProgram.mFeatures.isFullbright = true;
+ gObjectEmissiveWaterProgram.mFeatures.hasWaterFog = true;
+ gObjectEmissiveWaterProgram.mFeatures.hasTransport = true;
+ gObjectEmissiveWaterProgram.mFeatures.mIndexedTextureChannels = 0;
+ gObjectEmissiveWaterProgram.mShaderFiles.clear();
+ gObjectEmissiveWaterProgram.mShaderFiles.push_back(make_pair("objects/emissiveV.glsl", GL_VERTEX_SHADER_ARB));
+ gObjectEmissiveWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gObjectEmissiveWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ gObjectEmissiveWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
+ success = gObjectEmissiveWaterProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gObjectFullbrightAlphaMaskProgram.mName = "Fullbright Alpha Mask Shader";
+ gObjectFullbrightAlphaMaskProgram.mFeatures.calculatesAtmospherics = true;
+ gObjectFullbrightAlphaMaskProgram.mFeatures.hasGamma = true;
+ gObjectFullbrightAlphaMaskProgram.mFeatures.hasTransport = true;
+ gObjectFullbrightAlphaMaskProgram.mFeatures.isFullbright = true;
+ gObjectFullbrightAlphaMaskProgram.mFeatures.hasAlphaMask = true;
+ gObjectFullbrightAlphaMaskProgram.mFeatures.mIndexedTextureChannels = 0;
+ gObjectFullbrightAlphaMaskProgram.mShaderFiles.clear();
+ gObjectFullbrightAlphaMaskProgram.mShaderFiles.push_back(make_pair("objects/fullbrightV.glsl", GL_VERTEX_SHADER_ARB));
+ gObjectFullbrightAlphaMaskProgram.mShaderFiles.push_back(make_pair("objects/fullbrightF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gObjectFullbrightAlphaMaskProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ success = gObjectFullbrightAlphaMaskProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gObjectFullbrightWaterAlphaMaskProgram.mName = "Fullbright Water Shader";
+ gObjectFullbrightWaterAlphaMaskProgram.mFeatures.calculatesAtmospherics = true;
+ gObjectFullbrightWaterAlphaMaskProgram.mFeatures.isFullbright = true;
+ gObjectFullbrightWaterAlphaMaskProgram.mFeatures.hasWaterFog = true;
+ gObjectFullbrightWaterAlphaMaskProgram.mFeatures.hasTransport = true;
+ gObjectFullbrightWaterAlphaMaskProgram.mFeatures.hasAlphaMask = true;
+ gObjectFullbrightWaterAlphaMaskProgram.mFeatures.mIndexedTextureChannels = 0;
+ gObjectFullbrightWaterAlphaMaskProgram.mShaderFiles.clear();
+ gObjectFullbrightWaterAlphaMaskProgram.mShaderFiles.push_back(make_pair("objects/fullbrightV.glsl", GL_VERTEX_SHADER_ARB));
+ gObjectFullbrightWaterAlphaMaskProgram.mShaderFiles.push_back(make_pair("objects/fullbrightWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gObjectFullbrightWaterAlphaMaskProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ gObjectFullbrightWaterAlphaMaskProgram.mShaderGroup = LLGLSLShader::SG_WATER;
+ success = gObjectFullbrightWaterAlphaMaskProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
gObjectShinyProgram.mName = "Shiny Shader";
gObjectShinyProgram.mFeatures.calculatesAtmospherics = true;
gObjectShinyProgram.mFeatures.calculatesLighting = true;
gObjectShinyProgram.mFeatures.hasGamma = true;
gObjectShinyProgram.mFeatures.hasAtmospherics = true;
gObjectShinyProgram.mFeatures.isShiny = true;
+ gObjectShinyProgram.mFeatures.mIndexedTextureChannels = 0;
gObjectShinyProgram.mShaderFiles.clear();
gObjectShinyProgram.mShaderFiles.push_back(make_pair("objects/shinyV.glsl", GL_VERTEX_SHADER_ARB));
gObjectShinyProgram.mShaderFiles.push_back(make_pair("objects/shinyF.glsl", GL_FRAGMENT_SHADER_ARB));
@@ -1295,6 +2169,7 @@ BOOL LLViewerShaderMgr::loadShadersObject()
gObjectShinyWaterProgram.mFeatures.isShiny = true;
gObjectShinyWaterProgram.mFeatures.hasWaterFog = true;
gObjectShinyWaterProgram.mFeatures.hasAtmospherics = true;
+ gObjectShinyWaterProgram.mFeatures.mIndexedTextureChannels = 0;
gObjectShinyWaterProgram.mShaderFiles.clear();
gObjectShinyWaterProgram.mShaderFiles.push_back(make_pair("objects/shinyWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
gObjectShinyWaterProgram.mShaderFiles.push_back(make_pair("objects/shinyV.glsl", GL_VERTEX_SHADER_ARB));
@@ -1311,6 +2186,7 @@ BOOL LLViewerShaderMgr::loadShadersObject()
gObjectFullbrightShinyProgram.mFeatures.isShiny = true;
gObjectFullbrightShinyProgram.mFeatures.hasGamma = true;
gObjectFullbrightShinyProgram.mFeatures.hasTransport = true;
+ gObjectFullbrightShinyProgram.mFeatures.mIndexedTextureChannels = 0;
gObjectFullbrightShinyProgram.mShaderFiles.clear();
gObjectFullbrightShinyProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinyV.glsl", GL_VERTEX_SHADER_ARB));
gObjectFullbrightShinyProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinyF.glsl", GL_FRAGMENT_SHADER_ARB));
@@ -1318,6 +2194,202 @@ BOOL LLViewerShaderMgr::loadShadersObject()
success = gObjectFullbrightShinyProgram.createShader(NULL, &mShinyUniforms);
}
+ if (success)
+ {
+ gObjectFullbrightShinyWaterProgram.mName = "Fullbright Shiny Water Shader";
+ gObjectFullbrightShinyWaterProgram.mFeatures.calculatesAtmospherics = true;
+ gObjectFullbrightShinyWaterProgram.mFeatures.isFullbright = true;
+ gObjectFullbrightShinyWaterProgram.mFeatures.isShiny = true;
+ gObjectFullbrightShinyWaterProgram.mFeatures.hasGamma = true;
+ gObjectFullbrightShinyWaterProgram.mFeatures.hasTransport = true;
+ gObjectFullbrightShinyWaterProgram.mFeatures.hasWaterFog = true;
+ gObjectFullbrightShinyWaterProgram.mFeatures.mIndexedTextureChannels = 0;
+ gObjectFullbrightShinyWaterProgram.mShaderFiles.clear();
+ gObjectFullbrightShinyWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinyV.glsl", GL_VERTEX_SHADER_ARB));
+ gObjectFullbrightShinyWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinyWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gObjectFullbrightShinyWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ gObjectFullbrightShinyWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
+ success = gObjectFullbrightShinyWaterProgram.createShader(NULL, &mShinyUniforms);
+ }
+
+ if (mVertexShaderLevel[SHADER_AVATAR] > 0)
+ { //load hardware skinned attachment shaders
+ if (success)
+ {
+ gSkinnedObjectSimpleProgram.mName = "Skinned Simple Shader";
+ gSkinnedObjectSimpleProgram.mFeatures.calculatesLighting = true;
+ gSkinnedObjectSimpleProgram.mFeatures.calculatesAtmospherics = true;
+ gSkinnedObjectSimpleProgram.mFeatures.hasGamma = true;
+ gSkinnedObjectSimpleProgram.mFeatures.hasAtmospherics = true;
+ gSkinnedObjectSimpleProgram.mFeatures.hasLighting = true;
+ gSkinnedObjectSimpleProgram.mFeatures.hasObjectSkinning = true;
+ gSkinnedObjectSimpleProgram.mFeatures.disableTextureIndex = true;
+ gSkinnedObjectSimpleProgram.mShaderFiles.clear();
+ gSkinnedObjectSimpleProgram.mShaderFiles.push_back(make_pair("objects/simpleSkinnedV.glsl", GL_VERTEX_SHADER_ARB));
+ gSkinnedObjectSimpleProgram.mShaderFiles.push_back(make_pair("objects/simpleF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gSkinnedObjectSimpleProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ success = gSkinnedObjectSimpleProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gSkinnedObjectFullbrightProgram.mName = "Skinned Fullbright Shader";
+ gSkinnedObjectFullbrightProgram.mFeatures.calculatesAtmospherics = true;
+ gSkinnedObjectFullbrightProgram.mFeatures.hasGamma = true;
+ gSkinnedObjectFullbrightProgram.mFeatures.hasTransport = true;
+ gSkinnedObjectFullbrightProgram.mFeatures.isFullbright = true;
+ gSkinnedObjectFullbrightProgram.mFeatures.hasObjectSkinning = true;
+ gSkinnedObjectFullbrightProgram.mFeatures.disableTextureIndex = true;
+ gSkinnedObjectFullbrightProgram.mShaderFiles.clear();
+ gSkinnedObjectFullbrightProgram.mShaderFiles.push_back(make_pair("objects/fullbrightSkinnedV.glsl", GL_VERTEX_SHADER_ARB));
+ gSkinnedObjectFullbrightProgram.mShaderFiles.push_back(make_pair("objects/fullbrightF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gSkinnedObjectFullbrightProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ success = gSkinnedObjectFullbrightProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gSkinnedObjectEmissiveProgram.mName = "Skinned Emissive Shader";
+ gSkinnedObjectEmissiveProgram.mFeatures.calculatesAtmospherics = true;
+ gSkinnedObjectEmissiveProgram.mFeatures.hasGamma = true;
+ gSkinnedObjectEmissiveProgram.mFeatures.hasTransport = true;
+ gSkinnedObjectEmissiveProgram.mFeatures.isFullbright = true;
+ gSkinnedObjectEmissiveProgram.mFeatures.hasObjectSkinning = true;
+ gSkinnedObjectEmissiveProgram.mFeatures.disableTextureIndex = true;
+ gSkinnedObjectEmissiveProgram.mShaderFiles.clear();
+ gSkinnedObjectEmissiveProgram.mShaderFiles.push_back(make_pair("objects/emissiveSkinnedV.glsl", GL_VERTEX_SHADER_ARB));
+ gSkinnedObjectEmissiveProgram.mShaderFiles.push_back(make_pair("objects/fullbrightF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gSkinnedObjectEmissiveProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ success = gSkinnedObjectEmissiveProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gSkinnedObjectEmissiveWaterProgram.mName = "Skinned Emissive Water Shader";
+ gSkinnedObjectEmissiveWaterProgram.mFeatures.calculatesAtmospherics = true;
+ gSkinnedObjectEmissiveWaterProgram.mFeatures.hasGamma = true;
+ gSkinnedObjectEmissiveWaterProgram.mFeatures.hasTransport = true;
+ gSkinnedObjectEmissiveWaterProgram.mFeatures.isFullbright = true;
+ gSkinnedObjectEmissiveWaterProgram.mFeatures.hasObjectSkinning = true;
+ gSkinnedObjectEmissiveWaterProgram.mFeatures.disableTextureIndex = true;
+ gSkinnedObjectEmissiveWaterProgram.mFeatures.hasWaterFog = true;
+ gSkinnedObjectEmissiveWaterProgram.mShaderFiles.clear();
+ gSkinnedObjectEmissiveWaterProgram.mShaderFiles.push_back(make_pair("objects/emissiveSkinnedV.glsl", GL_VERTEX_SHADER_ARB));
+ gSkinnedObjectEmissiveWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gSkinnedObjectEmissiveWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ success = gSkinnedObjectEmissiveWaterProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gSkinnedObjectFullbrightShinyProgram.mName = "Skinned Fullbright Shiny Shader";
+ gSkinnedObjectFullbrightShinyProgram.mFeatures.calculatesAtmospherics = true;
+ gSkinnedObjectFullbrightShinyProgram.mFeatures.hasGamma = true;
+ gSkinnedObjectFullbrightShinyProgram.mFeatures.hasTransport = true;
+ gSkinnedObjectFullbrightShinyProgram.mFeatures.isShiny = true;
+ gSkinnedObjectFullbrightShinyProgram.mFeatures.isFullbright = true;
+ gSkinnedObjectFullbrightShinyProgram.mFeatures.hasObjectSkinning = true;
+ gSkinnedObjectFullbrightShinyProgram.mFeatures.disableTextureIndex = true;
+ gSkinnedObjectFullbrightShinyProgram.mShaderFiles.clear();
+ gSkinnedObjectFullbrightShinyProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinySkinnedV.glsl", GL_VERTEX_SHADER_ARB));
+ gSkinnedObjectFullbrightShinyProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinyF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gSkinnedObjectFullbrightShinyProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ success = gSkinnedObjectFullbrightShinyProgram.createShader(NULL, &mShinyUniforms);
+ }
+
+ if (success)
+ {
+ gSkinnedObjectShinySimpleProgram.mName = "Skinned Shiny Simple Shader";
+ gSkinnedObjectShinySimpleProgram.mFeatures.calculatesLighting = true;
+ gSkinnedObjectShinySimpleProgram.mFeatures.calculatesAtmospherics = true;
+ gSkinnedObjectShinySimpleProgram.mFeatures.hasGamma = true;
+ gSkinnedObjectShinySimpleProgram.mFeatures.hasAtmospherics = true;
+ gSkinnedObjectShinySimpleProgram.mFeatures.hasObjectSkinning = true;
+ gSkinnedObjectShinySimpleProgram.mFeatures.isShiny = true;
+ gSkinnedObjectShinySimpleProgram.mFeatures.disableTextureIndex = true;
+ gSkinnedObjectShinySimpleProgram.mShaderFiles.clear();
+ gSkinnedObjectShinySimpleProgram.mShaderFiles.push_back(make_pair("objects/shinySimpleSkinnedV.glsl", GL_VERTEX_SHADER_ARB));
+ gSkinnedObjectShinySimpleProgram.mShaderFiles.push_back(make_pair("objects/shinyF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gSkinnedObjectShinySimpleProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ success = gSkinnedObjectShinySimpleProgram.createShader(NULL, &mShinyUniforms);
+ }
+
+ if (success)
+ {
+ gSkinnedObjectSimpleWaterProgram.mName = "Skinned Simple Water Shader";
+ gSkinnedObjectSimpleWaterProgram.mFeatures.calculatesLighting = true;
+ gSkinnedObjectSimpleWaterProgram.mFeatures.calculatesAtmospherics = true;
+ gSkinnedObjectSimpleWaterProgram.mFeatures.hasGamma = true;
+ gSkinnedObjectSimpleWaterProgram.mFeatures.hasAtmospherics = true;
+ gSkinnedObjectSimpleWaterProgram.mFeatures.hasLighting = true;
+ gSkinnedObjectSimpleWaterProgram.mFeatures.disableTextureIndex = true;
+ gSkinnedObjectSimpleWaterProgram.mFeatures.hasWaterFog = true;
+ gSkinnedObjectSimpleWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
+ gSkinnedObjectSimpleWaterProgram.mFeatures.hasObjectSkinning = true;
+ gSkinnedObjectSimpleWaterProgram.mFeatures.disableTextureIndex = true;
+ gSkinnedObjectSimpleWaterProgram.mShaderFiles.clear();
+ gSkinnedObjectSimpleWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleSkinnedV.glsl", GL_VERTEX_SHADER_ARB));
+ gSkinnedObjectSimpleWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gSkinnedObjectSimpleWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ success = gSkinnedObjectSimpleWaterProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gSkinnedObjectFullbrightWaterProgram.mName = "Skinned Fullbright Water Shader";
+ gSkinnedObjectFullbrightWaterProgram.mFeatures.calculatesAtmospherics = true;
+ gSkinnedObjectFullbrightWaterProgram.mFeatures.hasGamma = true;
+ gSkinnedObjectFullbrightWaterProgram.mFeatures.hasTransport = true;
+ gSkinnedObjectFullbrightWaterProgram.mFeatures.isFullbright = true;
+ gSkinnedObjectFullbrightWaterProgram.mFeatures.hasObjectSkinning = true;
+ gSkinnedObjectFullbrightWaterProgram.mFeatures.hasWaterFog = true;
+ gSkinnedObjectFullbrightWaterProgram.mFeatures.disableTextureIndex = true;
+ gSkinnedObjectFullbrightWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
+ gSkinnedObjectFullbrightWaterProgram.mShaderFiles.clear();
+ gSkinnedObjectFullbrightWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightSkinnedV.glsl", GL_VERTEX_SHADER_ARB));
+ gSkinnedObjectFullbrightWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gSkinnedObjectFullbrightWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ success = gSkinnedObjectFullbrightWaterProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gSkinnedObjectFullbrightShinyWaterProgram.mName = "Skinned Fullbright Shiny Water Shader";
+ gSkinnedObjectFullbrightShinyWaterProgram.mFeatures.calculatesAtmospherics = true;
+ gSkinnedObjectFullbrightShinyWaterProgram.mFeatures.hasGamma = true;
+ gSkinnedObjectFullbrightShinyWaterProgram.mFeatures.hasTransport = true;
+ gSkinnedObjectFullbrightShinyWaterProgram.mFeatures.isShiny = true;
+ gSkinnedObjectFullbrightShinyWaterProgram.mFeatures.isFullbright = true;
+ gSkinnedObjectFullbrightShinyWaterProgram.mFeatures.hasObjectSkinning = true;
+ gSkinnedObjectFullbrightShinyWaterProgram.mFeatures.hasWaterFog = true;
+ gSkinnedObjectFullbrightShinyWaterProgram.mFeatures.disableTextureIndex = true;
+ gSkinnedObjectFullbrightShinyWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
+ gSkinnedObjectFullbrightShinyWaterProgram.mShaderFiles.clear();
+ gSkinnedObjectFullbrightShinyWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinySkinnedV.glsl", GL_VERTEX_SHADER_ARB));
+ gSkinnedObjectFullbrightShinyWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinyWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gSkinnedObjectFullbrightShinyWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ success = gSkinnedObjectFullbrightShinyWaterProgram.createShader(NULL, &mShinyUniforms);
+ }
+
+ if (success)
+ {
+ gSkinnedObjectShinySimpleWaterProgram.mName = "Skinned Shiny Simple Water Shader";
+ gSkinnedObjectShinySimpleWaterProgram.mFeatures.calculatesLighting = true;
+ gSkinnedObjectShinySimpleWaterProgram.mFeatures.calculatesAtmospherics = true;
+ gSkinnedObjectShinySimpleWaterProgram.mFeatures.hasGamma = true;
+ gSkinnedObjectShinySimpleWaterProgram.mFeatures.hasAtmospherics = true;
+ gSkinnedObjectShinySimpleWaterProgram.mFeatures.hasObjectSkinning = true;
+ gSkinnedObjectShinySimpleWaterProgram.mFeatures.isShiny = true;
+ gSkinnedObjectShinySimpleWaterProgram.mFeatures.hasWaterFog = true;
+ gSkinnedObjectShinySimpleWaterProgram.mFeatures.disableTextureIndex = true;
+ gSkinnedObjectShinySimpleWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
+ gSkinnedObjectShinySimpleWaterProgram.mShaderFiles.clear();
+ gSkinnedObjectShinySimpleWaterProgram.mShaderFiles.push_back(make_pair("objects/shinySimpleSkinnedV.glsl", GL_VERTEX_SHADER_ARB));
+ gSkinnedObjectShinySimpleWaterProgram.mShaderFiles.push_back(make_pair("objects/shinyWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gSkinnedObjectShinySimpleWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+ success = gSkinnedObjectShinySimpleWaterProgram.createShader(NULL, &mShinyUniforms);
+ }
+ }
if( !success )
{
@@ -1350,11 +2422,13 @@ BOOL LLViewerShaderMgr::loadShadersAvatar()
gAvatarProgram.mFeatures.hasGamma = true;
gAvatarProgram.mFeatures.hasAtmospherics = true;
gAvatarProgram.mFeatures.hasLighting = true;
+ gAvatarProgram.mFeatures.hasAlphaMask = true;
+ gAvatarProgram.mFeatures.disableTextureIndex = true;
gAvatarProgram.mShaderFiles.clear();
gAvatarProgram.mShaderFiles.push_back(make_pair("avatar/avatarV.glsl", GL_VERTEX_SHADER_ARB));
gAvatarProgram.mShaderFiles.push_back(make_pair("avatar/avatarF.glsl", GL_FRAGMENT_SHADER_ARB));
gAvatarProgram.mShaderLevel = mVertexShaderLevel[SHADER_AVATAR];
- success = gAvatarProgram.createShader(&mAvatarAttribs, &mAvatarUniforms);
+ success = gAvatarProgram.createShader(NULL, &mAvatarUniforms);
if (success)
{
@@ -1365,13 +2439,15 @@ BOOL LLViewerShaderMgr::loadShadersAvatar()
gAvatarWaterProgram.mFeatures.hasWaterFog = true;
gAvatarWaterProgram.mFeatures.hasAtmospherics = true;
gAvatarWaterProgram.mFeatures.hasLighting = true;
+ gAvatarWaterProgram.mFeatures.hasAlphaMask = true;
+ gAvatarWaterProgram.mFeatures.disableTextureIndex = true;
gAvatarWaterProgram.mShaderFiles.clear();
gAvatarWaterProgram.mShaderFiles.push_back(make_pair("avatar/avatarV.glsl", GL_VERTEX_SHADER_ARB));
gAvatarWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
// Note: no cloth under water:
gAvatarWaterProgram.mShaderLevel = llmin(mVertexShaderLevel[SHADER_AVATAR], 1);
gAvatarWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
- success = gAvatarWaterProgram.createShader(&mAvatarAttribs, &mAvatarUniforms);
+ success = gAvatarWaterProgram.createShader(NULL, &mAvatarUniforms);
}
/// Keep track of avatar levels
@@ -1385,11 +2461,12 @@ BOOL LLViewerShaderMgr::loadShadersAvatar()
{
gAvatarPickProgram.mName = "Avatar Pick Shader";
gAvatarPickProgram.mFeatures.hasSkinning = true;
+ gAvatarPickProgram.mFeatures.disableTextureIndex = true;
gAvatarPickProgram.mShaderFiles.clear();
gAvatarPickProgram.mShaderFiles.push_back(make_pair("avatar/pickAvatarV.glsl", GL_VERTEX_SHADER_ARB));
gAvatarPickProgram.mShaderFiles.push_back(make_pair("avatar/pickAvatarF.glsl", GL_FRAGMENT_SHADER_ARB));
gAvatarPickProgram.mShaderLevel = mVertexShaderLevel[SHADER_AVATAR];
- success = gAvatarPickProgram.createShader(&mAvatarAttribs, &mAvatarUniforms);
+ success = gAvatarPickProgram.createShader(NULL, &mAvatarUniforms);
}
if (success)
@@ -1401,6 +2478,8 @@ BOOL LLViewerShaderMgr::loadShadersAvatar()
gAvatarEyeballProgram.mFeatures.hasGamma = true;
gAvatarEyeballProgram.mFeatures.hasAtmospherics = true;
gAvatarEyeballProgram.mFeatures.hasLighting = true;
+ gAvatarEyeballProgram.mFeatures.hasAlphaMask = true;
+ gAvatarEyeballProgram.mFeatures.disableTextureIndex = true;
gAvatarEyeballProgram.mShaderFiles.clear();
gAvatarEyeballProgram.mShaderFiles.push_back(make_pair("avatar/eyeballV.glsl", GL_VERTEX_SHADER_ARB));
gAvatarEyeballProgram.mShaderFiles.push_back(make_pair("avatar/eyeballF.glsl", GL_FRAGMENT_SHADER_ARB));
@@ -1438,6 +2517,154 @@ BOOL LLViewerShaderMgr::loadShadersInterface()
success = gHighlightProgram.createShader(NULL, NULL);
}
+ if (success)
+ {
+ gUIProgram.mName = "UI Shader";
+ gUIProgram.mShaderFiles.clear();
+ gUIProgram.mShaderFiles.push_back(make_pair("interface/uiV.glsl", GL_VERTEX_SHADER_ARB));
+ gUIProgram.mShaderFiles.push_back(make_pair("interface/uiF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gUIProgram.mShaderLevel = mVertexShaderLevel[SHADER_INTERFACE];
+ success = gUIProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gCustomAlphaProgram.mName = "Custom Alpha Shader";
+ gCustomAlphaProgram.mShaderFiles.clear();
+ gCustomAlphaProgram.mShaderFiles.push_back(make_pair("interface/customalphaV.glsl", GL_VERTEX_SHADER_ARB));
+ gCustomAlphaProgram.mShaderFiles.push_back(make_pair("interface/customalphaF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gCustomAlphaProgram.mShaderLevel = mVertexShaderLevel[SHADER_INTERFACE];
+ success = gCustomAlphaProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gSplatTextureRectProgram.mName = "Splat Texture Rect Shader";
+ gSplatTextureRectProgram.mShaderFiles.clear();
+ gSplatTextureRectProgram.mShaderFiles.push_back(make_pair("interface/splattexturerectV.glsl", GL_VERTEX_SHADER_ARB));
+ gSplatTextureRectProgram.mShaderFiles.push_back(make_pair("interface/splattexturerectF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gSplatTextureRectProgram.mShaderLevel = mVertexShaderLevel[SHADER_INTERFACE];
+ success = gSplatTextureRectProgram.createShader(NULL, NULL);
+ if (success)
+ {
+ gSplatTextureRectProgram.bind();
+ gSplatTextureRectProgram.uniform1i("screenMap", 0);
+ gSplatTextureRectProgram.unbind();
+ }
+ }
+
+ if (success)
+ {
+ gGlowCombineProgram.mName = "Glow Combine Shader";
+ gGlowCombineProgram.mShaderFiles.clear();
+ gGlowCombineProgram.mShaderFiles.push_back(make_pair("interface/glowcombineV.glsl", GL_VERTEX_SHADER_ARB));
+ gGlowCombineProgram.mShaderFiles.push_back(make_pair("interface/glowcombineF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gGlowCombineProgram.mShaderLevel = mVertexShaderLevel[SHADER_INTERFACE];
+ success = gGlowCombineProgram.createShader(NULL, NULL);
+ if (success)
+ {
+ gGlowCombineProgram.bind();
+ gGlowCombineProgram.uniform1i("glowMap", 0);
+ gGlowCombineProgram.uniform1i("screenMap", 1);
+ gGlowCombineProgram.unbind();
+ }
+ }
+
+ if (success)
+ {
+ gGlowCombineFXAAProgram.mName = "Glow CombineFXAA Shader";
+ gGlowCombineFXAAProgram.mShaderFiles.clear();
+ gGlowCombineFXAAProgram.mShaderFiles.push_back(make_pair("interface/glowcombineFXAAV.glsl", GL_VERTEX_SHADER_ARB));
+ gGlowCombineFXAAProgram.mShaderFiles.push_back(make_pair("interface/glowcombineFXAAF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gGlowCombineFXAAProgram.mShaderLevel = mVertexShaderLevel[SHADER_INTERFACE];
+ success = gGlowCombineFXAAProgram.createShader(NULL, NULL);
+ if (success)
+ {
+ gGlowCombineFXAAProgram.bind();
+ gGlowCombineFXAAProgram.uniform1i("glowMap", 0);
+ gGlowCombineFXAAProgram.uniform1i("screenMap", 1);
+ gGlowCombineFXAAProgram.unbind();
+ }
+ }
+
+
+ if (success)
+ {
+ gTwoTextureAddProgram.mName = "Two Texture Add Shader";
+ gTwoTextureAddProgram.mShaderFiles.clear();
+ gTwoTextureAddProgram.mShaderFiles.push_back(make_pair("interface/twotextureaddV.glsl", GL_VERTEX_SHADER_ARB));
+ gTwoTextureAddProgram.mShaderFiles.push_back(make_pair("interface/twotextureaddF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gTwoTextureAddProgram.mShaderLevel = mVertexShaderLevel[SHADER_INTERFACE];
+ success = gTwoTextureAddProgram.createShader(NULL, NULL);
+ if (success)
+ {
+ gTwoTextureAddProgram.bind();
+ gTwoTextureAddProgram.uniform1i("tex0", 0);
+ gTwoTextureAddProgram.uniform1i("tex1", 1);
+ }
+ }
+
+ if (success)
+ {
+ gOneTextureNoColorProgram.mName = "One Texture No Color Shader";
+ gOneTextureNoColorProgram.mShaderFiles.clear();
+ gOneTextureNoColorProgram.mShaderFiles.push_back(make_pair("interface/onetexturenocolorV.glsl", GL_VERTEX_SHADER_ARB));
+ gOneTextureNoColorProgram.mShaderFiles.push_back(make_pair("interface/onetexturenocolorF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gOneTextureNoColorProgram.mShaderLevel = mVertexShaderLevel[SHADER_INTERFACE];
+ success = gOneTextureNoColorProgram.createShader(NULL, NULL);
+ if (success)
+ {
+ gOneTextureNoColorProgram.bind();
+ gOneTextureNoColorProgram.uniform1i("tex0", 0);
+ }
+ }
+
+ if (success)
+ {
+ gSolidColorProgram.mName = "Solid Color Shader";
+ gSolidColorProgram.mShaderFiles.clear();
+ gSolidColorProgram.mShaderFiles.push_back(make_pair("interface/solidcolorV.glsl", GL_VERTEX_SHADER_ARB));
+ gSolidColorProgram.mShaderFiles.push_back(make_pair("interface/solidcolorF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gSolidColorProgram.mShaderLevel = mVertexShaderLevel[SHADER_INTERFACE];
+ success = gSolidColorProgram.createShader(NULL, NULL);
+ if (success)
+ {
+ gSolidColorProgram.bind();
+ gSolidColorProgram.uniform1i("tex0", 0);
+ gSolidColorProgram.unbind();
+ }
+ }
+
+ if (success)
+ {
+ gOcclusionProgram.mName = "Occlusion Shader";
+ gOcclusionProgram.mShaderFiles.clear();
+ gOcclusionProgram.mShaderFiles.push_back(make_pair("interface/occlusionV.glsl", GL_VERTEX_SHADER_ARB));
+ gOcclusionProgram.mShaderFiles.push_back(make_pair("interface/occlusionF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gOcclusionProgram.mShaderLevel = mVertexShaderLevel[SHADER_INTERFACE];
+ success = gOcclusionProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gDebugProgram.mName = "Debug Shader";
+ gDebugProgram.mShaderFiles.clear();
+ gDebugProgram.mShaderFiles.push_back(make_pair("interface/debugV.glsl", GL_VERTEX_SHADER_ARB));
+ gDebugProgram.mShaderFiles.push_back(make_pair("interface/debugF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDebugProgram.mShaderLevel = mVertexShaderLevel[SHADER_INTERFACE];
+ success = gDebugProgram.createShader(NULL, NULL);
+ }
+
+ if (success)
+ {
+ gAlphaMaskProgram.mName = "Alpha Mask Shader";
+ gAlphaMaskProgram.mShaderFiles.clear();
+ gAlphaMaskProgram.mShaderFiles.push_back(make_pair("interface/alphamaskV.glsl", GL_VERTEX_SHADER_ARB));
+ gAlphaMaskProgram.mShaderFiles.push_back(make_pair("interface/alphamaskF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gAlphaMaskProgram.mShaderLevel = mVertexShaderLevel[SHADER_INTERFACE];
+ success = gAlphaMaskProgram.createShader(NULL, NULL);
+ }
+
if( !success )
{
mVertexShaderLevel[SHADER_INTERFACE] = 0;
@@ -1492,6 +2719,16 @@ std::string LLViewerShaderMgr::getShaderDirPrefix(void)
void LLViewerShaderMgr::updateShaderUniforms(LLGLSLShader * shader)
{
- LLWLParamManager::instance()->updateShaderUniforms(shader);
- LLWaterParamManager::instance()->updateShaderUniforms(shader);
+ LLWLParamManager::getInstance()->updateShaderUniforms(shader);
+ LLWaterParamManager::getInstance()->updateShaderUniforms(shader);
+}
+
+LLViewerShaderMgr::shader_iter LLViewerShaderMgr::beginShaders() const
+{
+ return mShaderList.begin();
+}
+
+LLViewerShaderMgr::shader_iter LLViewerShaderMgr::endShaders() const
+{
+ return mShaderList.end();
}
diff --git a/indra/newview/llviewershadermgr.h b/indra/newview/llviewershadermgr.h
index db880fded6..95eb551bf1 100644
--- a/indra/newview/llviewershadermgr.h
+++ b/indra/newview/llviewershadermgr.h
@@ -33,6 +33,7 @@ class LLViewerShaderMgr: public LLShaderMgr
{
public:
static BOOL sInitialized;
+ static bool sSkipReload;
LLViewerShaderMgr();
/* virtual */ ~LLViewerShaderMgr();
@@ -71,75 +72,6 @@ public:
SHADER_COUNT
};
- typedef enum
- {
- MATERIAL_COLOR = 0,
- SPECULAR_COLOR,
- BINORMAL,
- END_RESERVED_ATTRIBS
- } eGLSLReservedAttribs;
-
- typedef enum
- {
- DIFFUSE_MAP = 0,
- SPECULAR_MAP,
- BUMP_MAP,
- ENVIRONMENT_MAP,
- CLOUD_NOISE_MAP,
- FULLBRIGHT,
- LIGHTNORM,
- SUNLIGHT_COLOR,
- AMBIENT,
- BLUE_HORIZON,
- BLUE_DENSITY,
- HAZE_HORIZON,
- HAZE_DENSITY,
- CLOUD_SHADOW,
- DENSITY_MULTIPLIER,
- DISTANCE_MULTIPLIER,
- MAX_Y,
- GLOW,
- CLOUD_COLOR,
- CLOUD_POS_DENSITY1,
- CLOUD_POS_DENSITY2,
- CLOUD_SCALE,
- GAMMA,
- SCENE_LIGHT_STRENGTH,
- DEFERRED_DEPTH,
- DEFERRED_SHADOW0,
- DEFERRED_SHADOW1,
- DEFERRED_SHADOW2,
- DEFERRED_SHADOW3,
- DEFERRED_SHADOW4,
- DEFERRED_SHADOW5,
- DEFERRED_NORMAL,
- DEFERRED_POSITION,
- DEFERRED_DIFFUSE,
- DEFERRED_SPECULAR,
- DEFERRED_NOISE,
- DEFERRED_LIGHTFUNC,
- DEFERRED_LIGHT,
- DEFERRED_LUMINANCE,
- DEFERRED_GI_LIGHT,
- DEFERRED_GI_MIP,
- DEFERRED_EDGE,
- DEFERRED_BLOOM,
- DEFERRED_SUN_LIGHT,
- DEFERRED_LOCAL_LIGHT,
- DEFERRED_PROJECTION,
- DEFERRED_GI_DIFFUSE,
- DEFERRED_GI_SPECULAR,
- DEFERRED_GI_NORMAL,
- DEFERRED_GI_MIN_POS,
- DEFERRED_GI_MAX_POS,
- DEFERRED_GI_DEPTH,
- DEFERRED_GI_LAST_DIFFUSE,
- DEFERRED_GI_LAST_NORMAL,
- DEFERRED_GI_LAST_MIN_POS,
- DEFERRED_GI_LAST_MAX_POS,
- END_RESERVED_UNIFORMS
- } eGLSLReservedUniforms;
-
typedef enum
{
SHINY_ORIGIN = END_RESERVED_UNIFORMS
@@ -185,16 +117,10 @@ public:
typedef enum
{
- AVATAR_WEIGHT = END_RESERVED_ATTRIBS,
- AVATAR_CLOTHING,
+ AVATAR_MATRIX = END_RESERVED_UNIFORMS,
AVATAR_WIND,
AVATAR_SINWAVE,
- AVATAR_GRAVITY
- } eAvatarAttribs;
-
- typedef enum
- {
- AVATAR_MATRIX = END_RESERVED_UNIFORMS
+ AVATAR_GRAVITY,
} eAvatarUniforms;
// simple model of forward iterator
@@ -240,20 +166,12 @@ public:
base_iter_t mIter;
};
- shader_iter beginShaders() const
- {
- return mShaderList.begin();
- }
-
- shader_iter endShaders() const
- {
- return mShaderList.end();
- }
+ shader_iter beginShaders() const;
+ shader_iter endShaders() const;
+ /* virtual */ std::string getShaderDirPrefix(void);
- /* virtual */ std::string getShaderDirPrefix(void); // Virtual
-
- /* virtual */ void updateShaderUniforms(LLGLSLShader * shader); // Virtual
+ /* virtual */ void updateShaderUniforms(LLGLSLShader * shader);
private:
@@ -272,9 +190,6 @@ private:
std::vector<std::string> mGlowExtractUniforms;
- //avatar shader parameter tables
- std::vector<std::string> mAvatarAttribs;
-
std::vector<std::string> mAvatarUniforms;
// the list of shaders we need to propagate parameters to.
@@ -294,18 +209,74 @@ inline bool operator != (LLViewerShaderMgr::shader_iter const & a, LLViewerShade
extern LLVector4 gShinyOrigin;
+//utility shaders
+extern LLGLSLShader gOcclusionProgram;
+extern LLGLSLShader gCustomAlphaProgram;
+extern LLGLSLShader gGlowCombineProgram;
+extern LLGLSLShader gSplatTextureRectProgram;
+extern LLGLSLShader gGlowCombineFXAAProgram;
+extern LLGLSLShader gDebugProgram;
+extern LLGLSLShader gAlphaMaskProgram;
+
+//output tex0[tc0] + tex1[tc1]
+extern LLGLSLShader gTwoTextureAddProgram;
+
+extern LLGLSLShader gOneTextureNoColorProgram;
+
//object shaders
extern LLGLSLShader gObjectSimpleProgram;
+extern LLGLSLShader gObjectPreviewProgram;
+extern LLGLSLShader gObjectSimpleAlphaMaskProgram;
extern LLGLSLShader gObjectSimpleWaterProgram;
+extern LLGLSLShader gObjectSimpleWaterAlphaMaskProgram;
+extern LLGLSLShader gObjectSimpleNonIndexedProgram;
+extern LLGLSLShader gObjectSimpleNonIndexedTexGenProgram;
+extern LLGLSLShader gObjectSimpleNonIndexedTexGenWaterProgram;
+extern LLGLSLShader gObjectSimpleNonIndexedWaterProgram;
+extern LLGLSLShader gObjectAlphaMaskNonIndexedProgram;
+extern LLGLSLShader gObjectAlphaMaskNonIndexedWaterProgram;
+extern LLGLSLShader gObjectAlphaMaskNoColorProgram;
+extern LLGLSLShader gObjectAlphaMaskNoColorWaterProgram;
extern LLGLSLShader gObjectFullbrightProgram;
extern LLGLSLShader gObjectFullbrightWaterProgram;
+extern LLGLSLShader gObjectFullbrightNoColorProgram;
+extern LLGLSLShader gObjectFullbrightNoColorWaterProgram;
+extern LLGLSLShader gObjectEmissiveProgram;
+extern LLGLSLShader gObjectEmissiveWaterProgram;
+extern LLGLSLShader gObjectFullbrightAlphaMaskProgram;
+extern LLGLSLShader gObjectFullbrightWaterAlphaMaskProgram;
+extern LLGLSLShader gObjectFullbrightNonIndexedProgram;
+extern LLGLSLShader gObjectFullbrightNonIndexedWaterProgram;
+extern LLGLSLShader gObjectEmissiveNonIndexedProgram;
+extern LLGLSLShader gObjectEmissiveNonIndexedWaterProgram;
+extern LLGLSLShader gObjectBumpProgram;
+extern LLGLSLShader gTreeProgram;
+extern LLGLSLShader gTreeWaterProgram;
extern LLGLSLShader gObjectSimpleLODProgram;
extern LLGLSLShader gObjectFullbrightLODProgram;
extern LLGLSLShader gObjectFullbrightShinyProgram;
+extern LLGLSLShader gObjectFullbrightShinyWaterProgram;
+extern LLGLSLShader gObjectFullbrightShinyNonIndexedProgram;
+extern LLGLSLShader gObjectFullbrightShinyNonIndexedWaterProgram;
+
extern LLGLSLShader gObjectShinyProgram;
extern LLGLSLShader gObjectShinyWaterProgram;
+extern LLGLSLShader gObjectShinyNonIndexedProgram;
+extern LLGLSLShader gObjectShinyNonIndexedWaterProgram;
+
+extern LLGLSLShader gSkinnedObjectSimpleProgram;
+extern LLGLSLShader gSkinnedObjectFullbrightProgram;
+extern LLGLSLShader gSkinnedObjectEmissiveProgram;
+extern LLGLSLShader gSkinnedObjectFullbrightShinyProgram;
+extern LLGLSLShader gSkinnedObjectShinySimpleProgram;
+
+extern LLGLSLShader gSkinnedObjectSimpleWaterProgram;
+extern LLGLSLShader gSkinnedObjectFullbrightWaterProgram;
+extern LLGLSLShader gSkinnedObjectEmissiveWaterProgram;
+extern LLGLSLShader gSkinnedObjectFullbrightShinyWaterProgram;
+extern LLGLSLShader gSkinnedObjectShinySimpleWaterProgram;
//environment shaders
extern LLGLSLShader gTerrainProgram;
@@ -323,6 +294,7 @@ extern LLGLSLShader gAvatarProgram;
extern LLGLSLShader gAvatarWaterProgram;
extern LLGLSLShader gAvatarEyeballProgram;
extern LLGLSLShader gAvatarPickProgram;
+extern LLGLSLShader gImpostorProgram;
// WindLight shader handles
extern LLGLSLShader gWLSkyProgram;
@@ -334,34 +306,44 @@ extern LLGLSLShader gPostNightVisionProgram;
// Deferred rendering shaders
extern LLGLSLShader gDeferredImpostorProgram;
-extern LLGLSLShader gDeferredEdgeProgram;
extern LLGLSLShader gDeferredWaterProgram;
extern LLGLSLShader gDeferredDiffuseProgram;
+extern LLGLSLShader gDeferredDiffuseAlphaMaskProgram;
+extern LLGLSLShader gDeferredNonIndexedDiffuseAlphaMaskProgram;
+extern LLGLSLShader gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram;
+extern LLGLSLShader gDeferredNonIndexedDiffuseProgram;
+extern LLGLSLShader gDeferredSkinnedDiffuseProgram;
+extern LLGLSLShader gDeferredSkinnedBumpProgram;
+extern LLGLSLShader gDeferredSkinnedAlphaProgram;
extern LLGLSLShader gDeferredBumpProgram;
extern LLGLSLShader gDeferredTerrainProgram;
extern LLGLSLShader gDeferredTreeProgram;
+extern LLGLSLShader gDeferredTreeShadowProgram;
extern LLGLSLShader gDeferredLightProgram;
extern LLGLSLShader gDeferredMultiLightProgram;
extern LLGLSLShader gDeferredSpotLightProgram;
extern LLGLSLShader gDeferredMultiSpotLightProgram;
extern LLGLSLShader gDeferredSunProgram;
-extern LLGLSLShader gDeferredGIProgram;
-extern LLGLSLShader gDeferredGIFinalProgram;
extern LLGLSLShader gDeferredBlurLightProgram;
extern LLGLSLShader gDeferredAvatarProgram;
extern LLGLSLShader gDeferredSoftenProgram;
extern LLGLSLShader gDeferredShadowProgram;
-extern LLGLSLShader gDeferredPostGIProgram;
+extern LLGLSLShader gDeferredShadowAlphaMaskProgram;
extern LLGLSLShader gDeferredPostProgram;
+extern LLGLSLShader gDeferredCoFProgram;
+extern LLGLSLShader gDeferredDoFCombineProgram;
+extern LLGLSLShader gFXAAProgram;
+extern LLGLSLShader gDeferredPostNoDoFProgram;
extern LLGLSLShader gDeferredAvatarShadowProgram;
+extern LLGLSLShader gDeferredAttachmentShadowProgram;
extern LLGLSLShader gDeferredAlphaProgram;
extern LLGLSLShader gDeferredFullbrightProgram;
+extern LLGLSLShader gDeferredEmissiveProgram;
+extern LLGLSLShader gDeferredAvatarEyesProgram;
extern LLGLSLShader gDeferredAvatarAlphaProgram;
-
-extern LLGLSLShader gLuminanceGatherProgram;
-
-//current avatar shader parameter pointer
-extern GLint gAvatarMatrixParam;
-
+extern LLGLSLShader gDeferredWLSkyProgram;
+extern LLGLSLShader gDeferredWLCloudProgram;
+extern LLGLSLShader gDeferredStarProgram;
+extern LLGLSLShader gNormalMapGenProgram;
#endif
diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp
index 402f00c5e7..c88122f22c 100644
--- a/indra/newview/llviewerstats.cpp
+++ b/indra/newview/llviewerstats.cpp
@@ -59,6 +59,7 @@
#include "llworld.h"
#include "llfeaturemanager.h"
#include "llviewernetwork.h"
+#include "llmeshrepository.h" //for LLMeshRepository::sBytesReceived
class StatAttributes
@@ -711,7 +712,7 @@ void send_stats()
// but that day is not today.
// Only send stats if the agent is connected to a region.
- if (!gAgent.getRegion() || gNoRender)
+ if (!gAgent.getRegion())
{
return;
}
@@ -750,7 +751,7 @@ void send_stats()
// send fps only for time app spends in foreground
agent["fps"] = (F32)gForegroundFrameCount / gForegroundTime.getElapsedTimeF32();
- agent["version"] = LLVersionInfo::getVersionAndChannel();
+ agent["version"] = LLVersionInfo::getChannelAndVersion();
std::string language = LLUI::getLanguage();
agent["language"] = language;
@@ -794,6 +795,7 @@ void send_stats()
download["world_kbytes"] = gTotalWorldBytes / 1024.0;
download["object_kbytes"] = gTotalObjectBytes / 1024.0;
download["texture_kbytes"] = gTotalTextureBytes / 1024.0;
+ download["mesh_kbytes"] = LLMeshRepository::sBytesReceived/1024.0;
LLSD &in = body["stats"]["net"]["in"];
@@ -852,6 +854,8 @@ void send_stats()
body["DisplayNamesEnabled"] = gSavedSettings.getBOOL("UseDisplayNames");
body["DisplayNamesShowUsername"] = gSavedSettings.getBOOL("NameTagShowUsernames");
+ body["MinimalSkin"] = false;
+
LLViewerStats::getInstance()->addToMessage(body);
LLHTTPClient::post(url, body, new ViewerStatsResponder());
}
diff --git a/indra/newview/llviewerstats.h b/indra/newview/llviewerstats.h
index 3f9cfb9d9b..f91a1241fe 100644
--- a/indra/newview/llviewerstats.h
+++ b/indra/newview/llviewerstats.h
@@ -196,8 +196,15 @@ public:
S32 mCount;
F32 mSum;
F32 mSumOfSquares;
+ F32 mMinValue;
+ F32 mMaxValue;
U32 mCountOfNextUpdatesToIgnore;
+ inline StatsAccumulator()
+ {
+ reset();
+ }
+
inline void push( F32 val )
{
if ( mCountOfNextUpdatesToIgnore > 0 )
@@ -209,13 +216,31 @@ public:
mCount++;
mSum += val;
mSumOfSquares += val * val;
+ if (mCount == 1 || val > mMaxValue)
+ {
+ mMaxValue = val;
+ }
+ if (mCount == 1 || val < mMinValue)
+ {
+ mMinValue = val;
+ }
}
inline F32 getMean() const
{
return (mCount == 0) ? 0.f : ((F32)mSum)/mCount;
}
-
+
+ inline F32 getMinValue() const
+ {
+ return mMinValue;
+ }
+
+ inline F32 getMaxValue() const
+ {
+ return mMaxValue;
+ }
+
inline F32 getStdDev() const
{
const F32 mean = getMean();
@@ -231,6 +256,8 @@ public:
{
mCount = 0;
mSum = mSumOfSquares = 0.f;
+ mMinValue = 0.0f;
+ mMaxValue = 0.0f;
mCountOfNextUpdatesToIgnore = 0;
}
@@ -240,6 +267,8 @@ public:
data["mean"] = getMean();
data["std_dev"] = getStdDev();
data["count"] = (S32)mCount;
+ data["min"] = getMinValue();
+ data["max"] = getMaxValue();
return data;
}
};
diff --git a/indra/newview/llviewerstatsrecorder.cpp b/indra/newview/llviewerstatsrecorder.cpp
new file mode 100644
index 0000000000..e9d21b4848
--- /dev/null
+++ b/indra/newview/llviewerstatsrecorder.cpp
@@ -0,0 +1,258 @@
+/**
+ * @file llviewerstatsrecorder.cpp
+ * @brief record info about viewer events to a metrics log file
+ *
+ * $LicenseInfo:firstyear=2010&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llviewerstatsrecorder.h"
+
+#if LL_RECORD_VIEWER_STATS
+
+#include "llfile.h"
+#include "llviewerregion.h"
+#include "llviewerobject.h"
+
+
+// To do - something using region name or global position
+#if LL_WINDOWS
+ static const std::string STATS_FILE_NAME("C:\\ViewerObjectCacheStats.csv");
+#else
+ static const std::string STATS_FILE_NAME("/tmp/viewerstats.csv");
+#endif
+
+LLViewerStatsRecorder* LLViewerStatsRecorder::sInstance = NULL;
+LLViewerStatsRecorder::LLViewerStatsRecorder() :
+ mObjectCacheFile(NULL),
+ mTimer(),
+ mRegionp(NULL),
+ mStartTime(0.f),
+ mProcessingTime(0.f)
+{
+ if (NULL != sInstance)
+ {
+ llerrs << "Attempted to create multiple instances of LLViewerStatsRecorder!" << llendl;
+ }
+ sInstance = this;
+ clearStats();
+}
+
+LLViewerStatsRecorder::~LLViewerStatsRecorder()
+{
+ if (mObjectCacheFile != NULL)
+ {
+ LLFile::close(mObjectCacheFile);
+ mObjectCacheFile = NULL;
+ }
+}
+
+// static
+void LLViewerStatsRecorder::initClass()
+{
+ sInstance = new LLViewerStatsRecorder();
+}
+
+// static
+void LLViewerStatsRecorder::cleanupClass()
+{
+ delete sInstance;
+ sInstance = NULL;
+}
+
+
+void LLViewerStatsRecorder::initStatsRecorder(LLViewerRegion *regionp)
+{
+ if (mObjectCacheFile == NULL)
+ {
+ mStartTime = LLTimer::getTotalTime();
+ mObjectCacheFile = LLFile::fopen(STATS_FILE_NAME, "wb");
+ if (mObjectCacheFile)
+ { // Write column headers
+ std::ostringstream data_msg;
+ data_msg << "EventTime, "
+ << "ProcessingTime, "
+ << "CacheHits, "
+ << "CacheFullMisses, "
+ << "CacheCrcMisses, "
+ << "FullUpdates, "
+ << "TerseUpdates, "
+ << "CacheMissRequests, "
+ << "CacheMissResponses, "
+ << "CacheUpdateDupes, "
+ << "CacheUpdateChanges, "
+ << "CacheUpdateAdds, "
+ << "CacheUpdateReplacements, "
+ << "UpdateFailures"
+ << "\n";
+
+ fwrite(data_msg.str().c_str(), 1, data_msg.str().size(), mObjectCacheFile );
+ }
+ }
+}
+
+void LLViewerStatsRecorder::beginObjectUpdateEvents(LLViewerRegion *regionp)
+{
+ initStatsRecorder(regionp);
+ mRegionp = regionp;
+ mProcessingTime = LLTimer::getTotalTime();
+ clearStats();
+}
+
+void LLViewerStatsRecorder::clearStats()
+{
+ mObjectCacheHitCount = 0;
+ mObjectCacheMissFullCount = 0;
+ mObjectCacheMissCrcCount = 0;
+ mObjectFullUpdates = 0;
+ mObjectTerseUpdates = 0;
+ mObjectCacheMissRequests = 0;
+ mObjectCacheMissResponses = 0;
+ mObjectCacheUpdateDupes = 0;
+ mObjectCacheUpdateChanges = 0;
+ mObjectCacheUpdateAdds = 0;
+ mObjectCacheUpdateReplacements = 0;
+ mObjectUpdateFailures = 0;
+}
+
+
+void LLViewerStatsRecorder::recordObjectUpdateFailure(U32 local_id, const EObjectUpdateType update_type)
+{
+ mObjectUpdateFailures++;
+}
+
+void LLViewerStatsRecorder::recordCacheMissEvent(U32 local_id, const EObjectUpdateType update_type, U8 cache_miss_type)
+{
+ if (LLViewerRegion::CACHE_MISS_TYPE_FULL == cache_miss_type)
+ {
+ mObjectCacheMissFullCount++;
+ }
+ else
+ {
+ mObjectCacheMissCrcCount++;
+ }
+}
+
+void LLViewerStatsRecorder::recordObjectUpdateEvent(U32 local_id, const EObjectUpdateType update_type, LLViewerObject * objectp)
+{
+ switch (update_type)
+ {
+ case OUT_FULL:
+ mObjectFullUpdates++;
+ break;
+ case OUT_TERSE_IMPROVED:
+ mObjectTerseUpdates++;
+ break;
+ case OUT_FULL_COMPRESSED:
+ mObjectCacheMissResponses++;
+ break;
+ case OUT_FULL_CACHED:
+ mObjectCacheHitCount++;
+ break;
+ default:
+ llwarns << "Unknown update_type" << llendl;
+ break;
+ };
+}
+
+void LLViewerStatsRecorder::recordCacheFullUpdate(U32 local_id, const EObjectUpdateType update_type, LLViewerRegion::eCacheUpdateResult update_result, LLViewerObject* objectp)
+{
+ switch (update_result)
+ {
+ case LLViewerRegion::CACHE_UPDATE_DUPE:
+ mObjectCacheUpdateDupes++;
+ break;
+ case LLViewerRegion::CACHE_UPDATE_CHANGED:
+ mObjectCacheUpdateChanges++;
+ break;
+ case LLViewerRegion::CACHE_UPDATE_ADDED:
+ mObjectCacheUpdateAdds++;
+ break;
+ case LLViewerRegion::CACHE_UPDATE_REPLACED:
+ mObjectCacheUpdateReplacements++;
+ break;
+ default:
+ llwarns << "Unknown update_result type" << llendl;
+ break;
+ };
+}
+
+void LLViewerStatsRecorder::recordRequestCacheMissesEvent(S32 count)
+{
+ mObjectCacheMissRequests += count;
+}
+
+void LLViewerStatsRecorder::endObjectUpdateEvents()
+{
+ llinfos << "ILX: "
+ << mObjectCacheHitCount << " hits, "
+ << mObjectCacheMissFullCount << " full misses, "
+ << mObjectCacheMissCrcCount << " crc misses, "
+ << mObjectFullUpdates << " full updates, "
+ << mObjectTerseUpdates << " terse updates, "
+ << mObjectCacheMissRequests << " cache miss requests, "
+ << mObjectCacheMissResponses << " cache miss responses, "
+ << mObjectCacheUpdateDupes << " cache update dupes, "
+ << mObjectCacheUpdateChanges << " cache update changes, "
+ << mObjectCacheUpdateAdds << " cache update adds, "
+ << mObjectCacheUpdateReplacements << " cache update replacements, "
+ << mObjectUpdateFailures << " update failures"
+ << llendl;
+
+ S32 total_objects = mObjectCacheHitCount + mObjectCacheMissCrcCount + mObjectCacheMissFullCount + mObjectFullUpdates + mObjectTerseUpdates + mObjectCacheMissRequests + mObjectCacheMissResponses + mObjectCacheUpdateDupes + mObjectCacheUpdateChanges + mObjectCacheUpdateAdds + mObjectCacheUpdateReplacements + mObjectUpdateFailures;
+ if (mObjectCacheFile != NULL &&
+ total_objects > 0)
+ {
+ std::ostringstream data_msg;
+ F32 processing32 = (F32) ((LLTimer::getTotalTime() - mProcessingTime) / 1000.0);
+
+ data_msg << getTimeSinceStart()
+ << ", " << processing32
+ << ", " << mObjectCacheHitCount
+ << ", " << mObjectCacheMissFullCount
+ << ", " << mObjectCacheMissCrcCount
+ << ", " << mObjectFullUpdates
+ << ", " << mObjectTerseUpdates
+ << ", " << mObjectCacheMissRequests
+ << ", " << mObjectCacheMissResponses
+ << ", " << mObjectCacheUpdateDupes
+ << ", " << mObjectCacheUpdateChanges
+ << ", " << mObjectCacheUpdateAdds
+ << ", " << mObjectCacheUpdateReplacements
+ << ", " << mObjectUpdateFailures
+ << "\n";
+
+ fwrite(data_msg.str().c_str(), 1, data_msg.str().size(), mObjectCacheFile );
+ }
+
+ clearStats();
+}
+
+F32 LLViewerStatsRecorder::getTimeSinceStart()
+{
+ return (F32) ((LLTimer::getTotalTime() - mStartTime) / 1000.0);
+}
+
+#endif
+
+
+
diff --git a/indra/newview/llviewerstatsrecorder.h b/indra/newview/llviewerstatsrecorder.h
new file mode 100644
index 0000000000..612ac380f7
--- /dev/null
+++ b/indra/newview/llviewerstatsrecorder.h
@@ -0,0 +1,97 @@
+/**
+ * @file llviewerstatsrecorder.h
+ * @brief record info about viewer events to a metrics log file
+ *
+ * $LicenseInfo:firstyear=2010&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LLVIEWERSTATSRECORDER_H
+#define LLVIEWERSTATSRECORDER_H
+
+
+// This is a diagnostic class used to record information from the viewer
+// for analysis.
+
+// This is normally 0. Set to 1 to enable viewer stats recording
+#define LL_RECORD_VIEWER_STATS 0
+
+
+#if LL_RECORD_VIEWER_STATS
+#include "llframetimer.h"
+#include "llviewerobject.h"
+#include "llviewerregion.h"
+
+class LLMutex;
+class LLViewerRegion;
+class LLViewerObject;
+
+class LLViewerStatsRecorder
+{
+ public:
+ LLViewerStatsRecorder();
+ ~LLViewerStatsRecorder();
+
+ static void initClass();
+ static void cleanupClass();
+ static LLViewerStatsRecorder* instance() {return sInstance; }
+
+ void initStatsRecorder(LLViewerRegion *regionp);
+
+ void beginObjectUpdateEvents(LLViewerRegion *regionp);
+ void recordObjectUpdateFailure(U32 local_id, const EObjectUpdateType update_type);
+ void recordCacheMissEvent(U32 local_id, const EObjectUpdateType update_type, U8 cache_miss_type);
+ void recordObjectUpdateEvent(U32 local_id, const EObjectUpdateType update_type, LLViewerObject * objectp);
+ void recordCacheFullUpdate(U32 local_id, const EObjectUpdateType update_type, LLViewerRegion::eCacheUpdateResult update_result, LLViewerObject* objectp);
+ void recordRequestCacheMissesEvent(S32 count);
+ void endObjectUpdateEvents();
+
+ F32 getTimeSinceStart();
+
+private:
+ static LLViewerStatsRecorder* sInstance;
+
+ LLFILE * mObjectCacheFile; // File to write data into
+ LLFrameTimer mTimer;
+ LLViewerRegion* mRegionp;
+ F64 mStartTime;
+ F64 mProcessingTime;
+
+ S32 mObjectCacheHitCount;
+ S32 mObjectCacheMissFullCount;
+ S32 mObjectCacheMissCrcCount;
+ S32 mObjectFullUpdates;
+ S32 mObjectTerseUpdates;
+ S32 mObjectCacheMissRequests;
+ S32 mObjectCacheMissResponses;
+ S32 mObjectCacheUpdateDupes;
+ S32 mObjectCacheUpdateChanges;
+ S32 mObjectCacheUpdateAdds;
+ S32 mObjectCacheUpdateReplacements;
+ S32 mObjectUpdateFailures;
+
+
+ void clearStats();
+};
+#endif // LL_RECORD_VIEWER_STATS
+
+#endif // LLVIEWERSTATSRECORDER_H
+
diff --git a/indra/newview/llviewertexteditor.cpp b/indra/newview/llviewertexteditor.cpp
index 0c36970878..99102309a1 100644
--- a/indra/newview/llviewertexteditor.cpp
+++ b/indra/newview/llviewertexteditor.cpp
@@ -32,6 +32,7 @@
#include "llaudioengine.h"
#include "llavataractions.h"
#include "llfloaterreg.h"
+#include "llfloatersidepanelcontainer.h"
#include "llfloaterworldmap.h"
#include "llfocusmgr.h"
#include "llinventorybridge.h"
@@ -50,7 +51,6 @@
#include "llpreviewtexture.h"
#include "llscrollbar.h"
#include "llscrollcontainer.h"
-#include "llsidetray.h"
#include "lltooldraganddrop.h"
#include "lltooltip.h"
#include "lltrans.h"
@@ -80,7 +80,7 @@ public:
LLSD key;
key["type"] = "landmark";
key["id"] = landmark_inv_id;
- LLSideTray::getInstance()->showPanel("panel_places", key);
+ LLFloaterSidePanelContainer::showPanel("places", key);
}
static void processForeignLandmark(LLLandmark* landmark,
const LLUUID& object_id, const LLUUID& notecard_inventory_id,
@@ -88,12 +88,12 @@ public:
{
LLVector3d global_pos;
landmark->getGlobalPos(global_pos);
- LLViewerInventoryItem* agent_lanmark =
+ LLViewerInventoryItem* agent_landmark =
LLLandmarkActions::findLandmarkForGlobalPos(global_pos);
- if (agent_lanmark)
+ if (agent_landmark)
{
- showInfo(agent_lanmark->getUUID());
+ showInfo(agent_landmark->getUUID());
}
else
{
@@ -104,8 +104,13 @@ public:
}
else
{
+ LLInventoryItem* item = item_ptr.get();
LLPointer<LLEmbeddedLandmarkCopied> cb = new LLEmbeddedLandmarkCopied();
- copy_inventory_from_notecard(object_id, notecard_inventory_id, item_ptr.get(), gInventoryCallbacks.registerCB(cb));
+ copy_inventory_from_notecard(get_folder_by_itemtype(item),
+ object_id,
+ notecard_inventory_id,
+ item,
+ gInventoryCallbacks.registerCB(cb));
}
}
}
@@ -182,7 +187,7 @@ public:
else
{
width = EMBEDDED_ITEM_LABEL_PADDING + mImage->getWidth() + mStyle->getFont()->getWidth(mLabel.c_str());
- height = llmax(mImage->getHeight(), llceil(mStyle->getFont()->getLineHeight()));
+ height = llmax(mImage->getHeight(), mStyle->getFont()->getLineHeight());
}
return false;
}
@@ -537,6 +542,7 @@ LLUIImagePtr LLEmbeddedItems::getItemImage(llwchar ext_char) const
case LLAssetType::AT_BODYPART: img_name = "Inv_Skin"; break;
case LLAssetType::AT_ANIMATION: img_name = "Inv_Animation"; break;
case LLAssetType::AT_GESTURE: img_name = "Inv_Gesture"; break;
+ case LLAssetType::AT_MESH: img_name = "Inv_Mesh"; break;
default: llassert(0);
}
@@ -846,17 +852,18 @@ BOOL LLViewerTextEditor::handleDragAndDrop(S32 x, S32 y, MASK mask,
{
switch( cargo_type )
{
- case DAD_CALLINGCARD:
- case DAD_TEXTURE:
- case DAD_SOUND:
- case DAD_LANDMARK:
- case DAD_SCRIPT:
- case DAD_CLOTHING:
- case DAD_OBJECT:
- case DAD_NOTECARD:
- case DAD_BODYPART:
- case DAD_ANIMATION:
- case DAD_GESTURE:
+ case DAD_CALLINGCARD:
+ case DAD_TEXTURE:
+ case DAD_SOUND:
+ case DAD_LANDMARK:
+ case DAD_SCRIPT:
+ case DAD_CLOTHING:
+ case DAD_OBJECT:
+ case DAD_NOTECARD:
+ case DAD_BODYPART:
+ case DAD_ANIMATION:
+ case DAD_GESTURE:
+ case DAD_MESH:
{
LLInventoryItem *item = (LLInventoryItem *)cargo_data;
if( item && allowsEmbeddedItems() )
@@ -1264,9 +1271,11 @@ bool LLViewerTextEditor::importStream(std::istream& str)
void LLViewerTextEditor::copyInventory(const LLInventoryItem* item, U32 callback_id)
{
- copy_inventory_from_notecard(mObjectID,
+ copy_inventory_from_notecard(LLUUID::null, // Don't specify a destination -- let the sim do that
+ mObjectID,
mNotecardInventoryID,
- item, callback_id);
+ item,
+ callback_id);
}
bool LLViewerTextEditor::hasEmbeddedInventory()
diff --git a/indra/newview/llviewertexteditor.h b/indra/newview/llviewertexteditor.h
index 0861dfcb20..fb428d0dc1 100644
--- a/indra/newview/llviewertexteditor.h
+++ b/indra/newview/llviewertexteditor.h
@@ -36,12 +36,7 @@ class LLViewerTextEditor : public LLTextEditor
{
public:
struct Params : public LLInitParam::Block<Params, LLTextEditor::Params>
- {
- Params()
- {
- name = "text_editor";
- }
- };
+ {};
protected:
LLViewerTextEditor(const Params&);
diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index 6160510c0e..61236edc86 100644
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -66,6 +66,7 @@
// statics
LLPointer<LLViewerTexture> LLViewerTexture::sNullImagep = NULL;
+LLPointer<LLViewerTexture> LLViewerTexture::sBlackImagep = NULL;
LLPointer<LLViewerFetchedTexture> LLViewerFetchedTexture::sMissingAssetImagep = NULL;
LLPointer<LLViewerFetchedTexture> LLViewerFetchedTexture::sWhiteImagep = NULL;
LLPointer<LLViewerFetchedTexture> LLViewerFetchedTexture::sDefaultImagep = NULL;
@@ -295,17 +296,23 @@ LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTextureFromHost(const
void LLViewerTextureManager::init()
{
- LLPointer<LLImageRaw> raw = new LLImageRaw(1,1,3);
- raw->clear(0x77, 0x77, 0x77, 0xFF);
- LLViewerTexture::sNullImagep = LLViewerTextureManager::getLocalTexture(raw.get(), TRUE) ;
-
-#if 1
- LLPointer<LLViewerFetchedTexture> imagep = LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT);
- LLViewerFetchedTexture::sDefaultImagep = imagep;
+ {
+ LLPointer<LLImageRaw> raw = new LLImageRaw(1,1,3);
+ raw->clear(0x77, 0x77, 0x77, 0xFF);
+ LLViewerTexture::sNullImagep = LLViewerTextureManager::getLocalTexture(raw.get(), TRUE) ;
+ }
const S32 dim = 128;
LLPointer<LLImageRaw> image_raw = new LLImageRaw(dim,dim,3);
U8* data = image_raw->getData();
+
+ memset(data, 0, dim * dim * 3) ;
+ LLViewerTexture::sBlackImagep = LLViewerTextureManager::getLocalTexture(image_raw.get(), TRUE) ;
+
+#if 1
+ LLPointer<LLViewerFetchedTexture> imagep = LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT);
+ LLViewerFetchedTexture::sDefaultImagep = imagep;
+
for (S32 i = 0; i<dim; i++)
{
for (S32 j = 0; j<dim; j++)
@@ -359,6 +366,7 @@ void LLViewerTextureManager::cleanup()
LLImageGL::sDefaultGLTexture = NULL ;
LLViewerTexture::sNullImagep = NULL;
+ LLViewerTexture::sBlackImagep = NULL;
LLViewerFetchedTexture::sDefaultImagep = NULL;
LLViewerFetchedTexture::sSmokeImagep = NULL;
LLViewerFetchedTexture::sMissingAssetImagep = NULL;
@@ -409,6 +417,64 @@ const S32 min_non_tex_system_mem = (128<<20); // 128 MB
F32 texmem_lower_bound_scale = 0.85f;
F32 texmem_middle_bound_scale = 0.925f;
+static LLFastTimer::DeclareTimer FTM_TEXTURE_MEMORY_CHECK("Memory Check");
+
+//static
+bool LLViewerTexture::isMemoryForTextureLow()
+{
+ const F32 WAIT_TIME = 1.0f ; //second
+ static LLFrameTimer timer ;
+
+ if(timer.getElapsedTimeF32() < WAIT_TIME) //call this once per second.
+ {
+ return false;
+ }
+ timer.reset() ;
+
+ LLFastTimer t(FTM_TEXTURE_MEMORY_CHECK);
+
+ const S32 MIN_FREE_TEXTURE_MEMORY = 5 ; //MB
+ const S32 MIN_FREE_MAIN_MEMORy = 100 ; //MB
+
+ bool low_mem = false ;
+ if (gGLManager.mHasATIMemInfo)
+ {
+ S32 meminfo[4];
+ glGetIntegerv(GL_TEXTURE_FREE_MEMORY_ATI, meminfo);
+
+ if(meminfo[0] / 1024 < MIN_FREE_TEXTURE_MEMORY)
+ {
+ low_mem = true ;
+ }
+
+ if(!low_mem) //check main memory, only works for windows.
+ {
+ LLMemory::updateMemoryInfo() ;
+ if(LLMemory::getAvailableMemKB() / 1024 < MIN_FREE_MAIN_MEMORy)
+ {
+ low_mem = true ;
+ }
+ }
+ }
+#if 0 //ignore nVidia cards
+ else if (gGLManager.mHasNVXMemInfo)
+ {
+ S32 free_memory;
+ glGetIntegerv(GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX, &free_memory);
+
+ if(free_memory / 1024 < MIN_FREE_TEXTURE_MEMORY)
+ {
+ low_mem = true ;
+ }
+ }
+#endif
+
+ return low_mem ;
+}
+
+static LLFastTimer::DeclareTimer FTM_TEXTURE_UPDATE_MEDIA("Media");
+static LLFastTimer::DeclareTimer FTM_TEXTURE_UPDATE_TEST("Test");
+
//static
void LLViewerTexture::updateClass(const F32 velocity, const F32 angular_velocity)
{
@@ -417,9 +483,14 @@ void LLViewerTexture::updateClass(const F32 velocity, const F32 angular_velocity
LLTexturePipelineTester* tester = (LLTexturePipelineTester*)LLMetricPerformanceTesterBasic::getTester(sTesterName);
if (tester)
{
+ LLFastTimer t(FTM_TEXTURE_UPDATE_TEST);
tester->update() ;
}
- LLViewerMediaTexture::updateClass() ;
+
+ {
+ LLFastTimer t(FTM_TEXTURE_UPDATE_MEDIA);
+ LLViewerMediaTexture::updateClass() ;
+ }
sBoundTextureMemoryInBytes = LLImageGL::sBoundTextureMemoryInBytes;//in bytes
sTotalTextureMemoryInBytes = LLImageGL::sGlobalTextureMemoryInBytes;//in bytes
@@ -441,6 +512,11 @@ void LLViewerTexture::updateClass(const F32 velocity, const F32 angular_velocity
sEvaluationTimer.reset();
}
}
+ else if(sEvaluationTimer.getElapsedTimeF32() > discard_delta_time && isMemoryForTextureLow())
+ {
+ sDesiredDiscardBias += discard_bias_delta;
+ sEvaluationTimer.reset();
+ }
else if (sDesiredDiscardBias > 0.0f &&
BYTES_TO_MEGA_BYTES(sBoundTextureMemoryInBytes) < sMaxBoundTextureMemInMegaBytes * texmem_lower_bound_scale &&
BYTES_TO_MEGA_BYTES(sTotalTextureMemoryInBytes) < sMaxTotalTextureMemInMegaBytes * texmem_lower_bound_scale)
@@ -599,7 +675,7 @@ bool LLViewerTexture::bindDefaultImage(S32 stage)
}
if (!res && LLViewerTexture::sNullImagep.notNull() && (this != LLViewerTexture::sNullImagep))
{
- res = gGL.getTexUnit(stage)->bind(LLViewerTexture::sNullImagep) ;
+ res = gGL.getTexUnit(stage)->bind(LLViewerTexture::sNullImagep);
}
if (!res)
{
@@ -835,7 +911,7 @@ BOOL LLViewerTexture::createGLTexture(S32 discard_level, const LLImageRaw* image
llassert(mGLTexturep.notNull()) ;
BOOL ret = mGLTexturep->createGLTexture(discard_level, imageraw, usename, to_create, category) ;
-
+
if(ret)
{
mFullWidth = mGLTexturep->getCurrentWidth() ;
@@ -1168,6 +1244,7 @@ void LLViewerFetchedTexture::init(bool firstinit)
mSavedRawDiscardLevel = -1 ;
mDesiredSavedRawDiscardLevel = -1 ;
mLastReferencedSavedRawImageTime = 0.0f ;
+ mKeptSavedRawImageTime = 0.f ;
mLastCallBackActiveTime = 0.f;
}
@@ -1214,12 +1291,15 @@ void LLViewerFetchedTexture::cleanup()
void LLViewerFetchedTexture::setForSculpt()
{
+ static const S32 MAX_INTERVAL = 8 ; //frames
+
mForSculpt = TRUE ;
if(isForSculptOnly() && !getBoundRecently())
{
destroyGLTexture() ; //sculpt image does not need gl texture.
}
checkCachedRawSculptImage() ;
+ setMaxVirtualSizeResetInterval(MAX_INTERVAL) ;
}
BOOL LLViewerFetchedTexture::isForSculptOnly() const
@@ -1412,63 +1492,68 @@ BOOL LLViewerFetchedTexture::createTexture(S32 usename/*= 0*/)
// mRawImage->getWidth(), mRawImage->getHeight(),mRawImage->getDataSize())
// << mID.getString() << llendl;
BOOL res = TRUE;
- if (!gNoRender)
+
+ // store original size only for locally-sourced images
+ if (mUrl.compare(0, 7, "file://") == 0)
{
- // store original size only for locally-sourced images
- if (mUrl.compare(0, 7, "file://") == 0)
- {
- mOrigWidth = mRawImage->getWidth();
- mOrigHeight = mRawImage->getHeight();
+ mOrigWidth = mRawImage->getWidth();
+ mOrigHeight = mRawImage->getHeight();
- // leave black border, do not scale image content
- mRawImage->expandToPowerOfTwo(MAX_IMAGE_SIZE, FALSE);
- mFullWidth = mRawImage->getWidth();
- mFullHeight = mRawImage->getHeight();
- setTexelsPerImage();
+ if (mBoostLevel == BOOST_PREVIEW)
+ {
+ mRawImage->biasedScaleToPowerOfTwo(1024);
}
else
- {
- mOrigWidth = mFullWidth;
- mOrigHeight = mFullHeight;
- }
-
- bool size_okay = true;
-
- U32 raw_width = mRawImage->getWidth() << mRawDiscardLevel;
- U32 raw_height = mRawImage->getHeight() << mRawDiscardLevel;
- if( raw_width > MAX_IMAGE_SIZE || raw_height > MAX_IMAGE_SIZE )
- {
- llinfos << "Width or height is greater than " << MAX_IMAGE_SIZE << ": (" << raw_width << "," << raw_height << ")" << llendl;
- size_okay = false;
- }
-
- if (!LLImageGL::checkSize(mRawImage->getWidth(), mRawImage->getHeight()))
- {
- // A non power-of-two image was uploaded (through a non standard client)
- llinfos << "Non power of two width or height: (" << mRawImage->getWidth() << "," << mRawImage->getHeight() << ")" << llendl;
- size_okay = false;
- }
-
- if( !size_okay )
- {
- // An inappropriately-sized image was uploaded (through a non standard client)
- // We treat these images as missing assets which causes them to
- // be renderd as 'missing image' and to stop requesting data
- setIsMissingAsset();
- destroyRawImage();
- return FALSE;
+ { // leave black border, do not scale image content
+ mRawImage->expandToPowerOfTwo(MAX_IMAGE_SIZE, FALSE);
}
- if(!(res = insertToAtlas()))
- {
- res = mGLTexturep->createGLTexture(mRawDiscardLevel, mRawImage, usename, TRUE, mBoostLevel);
- resetFaceAtlas() ;
- }
- setActive() ;
+ mFullWidth = mRawImage->getWidth();
+ mFullHeight = mRawImage->getHeight();
+ setTexelsPerImage();
+ }
+ else
+ {
+ mOrigWidth = mFullWidth;
+ mOrigHeight = mFullHeight;
}
- if (!mForceToSaveRawImage)
+ bool size_okay = true;
+
+ U32 raw_width = mRawImage->getWidth() << mRawDiscardLevel;
+ U32 raw_height = mRawImage->getHeight() << mRawDiscardLevel;
+ if( raw_width > MAX_IMAGE_SIZE || raw_height > MAX_IMAGE_SIZE )
+ {
+ llinfos << "Width or height is greater than " << MAX_IMAGE_SIZE << ": (" << raw_width << "," << raw_height << ")" << llendl;
+ size_okay = false;
+ }
+
+ if (!LLImageGL::checkSize(mRawImage->getWidth(), mRawImage->getHeight()))
+ {
+ // A non power-of-two image was uploaded (through a non standard client)
+ llinfos << "Non power of two width or height: (" << mRawImage->getWidth() << "," << mRawImage->getHeight() << ")" << llendl;
+ size_okay = false;
+ }
+
+ if( !size_okay )
+ {
+ // An inappropriately-sized image was uploaded (through a non standard client)
+ // We treat these images as missing assets which causes them to
+ // be renderd as 'missing image' and to stop requesting data
+ setIsMissingAsset();
+ destroyRawImage();
+ return FALSE;
+ }
+
+ if(!(res = insertToAtlas()))
+ {
+ res = mGLTexturep->createGLTexture(mRawDiscardLevel, mRawImage, usename, TRUE, mBoostLevel);
+ resetFaceAtlas() ;
+ }
+ setActive() ;
+
+ if (!needsToSaveRawImage())
{
mNeedsAux = FALSE;
destroyRawImage();
@@ -1494,57 +1579,56 @@ void LLViewerFetchedTexture::setKnownDrawSize(S32 width, S32 height)
//virtual
void LLViewerFetchedTexture::processTextureStats()
{
- static LLCachedControl<bool> textures_fullres(gSavedSettings,"TextureLoadFullRes");
-
if(mFullyLoaded)
- {
- if(needsToSaveRawImage())//needs to reload
+ {
+ if(mDesiredDiscardLevel > mMinDesiredDiscardLevel)//need to load more
{
+ mDesiredDiscardLevel = llmin(mDesiredDiscardLevel, mMinDesiredDiscardLevel) ;
mFullyLoaded = FALSE ;
}
- else
- {
- return ;
- }
- }
-
- //updateVirtualSize() ;
-
- if (textures_fullres)
- {
- mDesiredDiscardLevel = 0;
- }
- else if(!mFullWidth || !mFullHeight)
- {
- mDesiredDiscardLevel = llmin(getMaxDiscardLevel(), (S32)mLoadedCallbackDesiredDiscardLevel) ;
}
else
- {
- if(!mKnownDrawWidth || !mKnownDrawHeight || mFullWidth <= mKnownDrawWidth || mFullHeight <= mKnownDrawHeight)
+ {
+ updateVirtualSize() ;
+
+ static LLCachedControl<bool> textures_fullres(gSavedSettings,"TextureLoadFullRes");
+
+ if (textures_fullres)
+ {
+ mDesiredDiscardLevel = 0;
+ }
+ else if(!mFullWidth || !mFullHeight)
{
- if (mFullWidth > MAX_IMAGE_SIZE_DEFAULT || mFullHeight > MAX_IMAGE_SIZE_DEFAULT)
+ mDesiredDiscardLevel = llmin(getMaxDiscardLevel(), (S32)mLoadedCallbackDesiredDiscardLevel) ;
+ }
+ else
+ {
+ if(!mKnownDrawWidth || !mKnownDrawHeight || mFullWidth <= mKnownDrawWidth || mFullHeight <= mKnownDrawHeight)
{
- mDesiredDiscardLevel = 1; // MAX_IMAGE_SIZE_DEFAULT = 1024 and max size ever is 2048
+ if (mFullWidth > MAX_IMAGE_SIZE_DEFAULT || mFullHeight > MAX_IMAGE_SIZE_DEFAULT)
+ {
+ mDesiredDiscardLevel = 1; // MAX_IMAGE_SIZE_DEFAULT = 1024 and max size ever is 2048
+ }
+ else
+ {
+ mDesiredDiscardLevel = 0;
+ }
}
- else
+ else if(mKnownDrawSizeChanged)//known draw size is set
+ {
+ mDesiredDiscardLevel = (S8)llmin(log((F32)mFullWidth / mKnownDrawWidth) / log_2,
+ log((F32)mFullHeight / mKnownDrawHeight) / log_2) ;
+ mDesiredDiscardLevel = llclamp(mDesiredDiscardLevel, (S8)0, (S8)getMaxDiscardLevel()) ;
+ mDesiredDiscardLevel = llmin(mDesiredDiscardLevel, mMinDesiredDiscardLevel) ;
+ }
+ mKnownDrawSizeChanged = FALSE ;
+
+ if(getDiscardLevel() >= 0 && (getDiscardLevel() <= mDesiredDiscardLevel))
{
- mDesiredDiscardLevel = 0;
+ mFullyLoaded = TRUE ;
}
}
- else if(mKnownDrawSizeChanged)//known draw size is set
- {
- mDesiredDiscardLevel = (S8)llmin(log((F32)mFullWidth / mKnownDrawWidth) / log_2,
- log((F32)mFullHeight / mKnownDrawHeight) / log_2) ;
- mDesiredDiscardLevel = llclamp(mDesiredDiscardLevel, (S8)0, (S8)getMaxDiscardLevel()) ;
- mDesiredDiscardLevel = llmin(mDesiredDiscardLevel, mMinDesiredDiscardLevel) ;
- }
- mKnownDrawSizeChanged = FALSE ;
-
- if(getDiscardLevel() >= 0 && (getDiscardLevel() <= mDesiredDiscardLevel))
- {
- mFullyLoaded = TRUE ;
- }
- }
+ }
if(mForceToSaveRawImage && mDesiredSavedRawDiscardLevel >= 0) //force to refetch the texture.
{
@@ -1583,7 +1667,7 @@ F32 LLViewerFetchedTexture::calcDecodePriority()
S32 cur_discard = getCurrentDiscardLevelForFetching();
bool have_all_data = (cur_discard >= 0 && (cur_discard <= mDesiredDiscardLevel));
- F32 pixel_priority = fsqrtf(mMaxVirtualSize);
+ F32 pixel_priority = (F32) sqrt(mMaxVirtualSize);
F32 priority = 0.f;
@@ -2206,6 +2290,7 @@ void LLViewerFetchedTexture::unpauseLoadedCallbacks(const LLLoadedCallbackEntry:
}
}
mPauseLoadedCallBacks = FALSE ;
+ mLastCallBackActiveTime = sCurrentTime ;
if(need_raw)
{
mSaveRawImage = TRUE ;
@@ -2245,13 +2330,18 @@ void LLViewerFetchedTexture::pauseLoadedCallbacks(const LLLoadedCallbackEntry::s
bool LLViewerFetchedTexture::doLoadedCallbacks()
{
- static const F32 MAX_INACTIVE_TIME = 120.f ; //seconds
+ static const F32 MAX_INACTIVE_TIME = 900.f ; //seconds
if (mNeedsCreateTexture)
{
return false;
}
- if(sCurrentTime - mLastCallBackActiveTime > MAX_INACTIVE_TIME)
+ if(mPauseLoadedCallBacks)
+ {
+ destroyRawImage();
+ return false; //paused
+ }
+ if(sCurrentTime - mLastCallBackActiveTime > MAX_INACTIVE_TIME && !mIsFetching)
{
clearCallbackEntryList() ; //remove all callbacks.
return false ;
@@ -2274,12 +2364,8 @@ bool LLViewerFetchedTexture::doLoadedCallbacks()
// Remove ourself from the global list of textures with callbacks
gTextureList.mCallbackList.erase(this);
- }
- if(mPauseLoadedCallBacks)
- {
- destroyRawImage();
- return res; //paused
- }
+ return false ;
+ }
S32 gl_discard = getDiscardLevel();
@@ -2541,7 +2627,11 @@ bool LLViewerFetchedTexture::needsToSaveRawImage()
void LLViewerFetchedTexture::destroyRawImage()
{
- if (mAuxRawImage.notNull()) sAuxCount--;
+ if (mAuxRawImage.notNull())
+ {
+ sAuxCount--;
+ mAuxRawImage = NULL;
+ }
if (mRawImage.notNull())
{
@@ -2555,12 +2645,12 @@ void LLViewerFetchedTexture::destroyRawImage()
}
setCachedRawImage() ;
}
+
+ mRawImage = NULL;
+
+ mIsRawImageValid = FALSE;
+ mRawDiscardLevel = INVALID_DISCARD_LEVEL;
}
-
- mRawImage = NULL;
- mAuxRawImage = NULL;
- mIsRawImageValid = FALSE;
- mRawDiscardLevel = INVALID_DISCARD_LEVEL;
}
//use the mCachedRawImage to (re)generate the gl texture.
@@ -2689,12 +2779,18 @@ void LLViewerFetchedTexture::saveRawImage()
mLastReferencedSavedRawImageTime = sCurrentTime ;
}
-void LLViewerFetchedTexture::forceToSaveRawImage(S32 desired_discard, bool from_callback)
+void LLViewerFetchedTexture::forceToSaveRawImage(S32 desired_discard, F32 kept_time)
{
- if(!mForceToSaveRawImage || mDesiredSavedRawDiscardLevel < 0 || mDesiredSavedRawDiscardLevel > desired_discard)
+ mKeptSavedRawImageTime = kept_time ;
+ mLastReferencedSavedRawImageTime = sCurrentTime ;
+
+ if(mSavedRawDiscardLevel > -1 && mSavedRawDiscardLevel <= desired_discard)
{
- llassert_always(from_callback || mBoostLevel == LLViewerTexture::BOOST_PREVIEW) ;
+ return ; //raw imge is ready.
+ }
+ if(!mForceToSaveRawImage || mDesiredSavedRawDiscardLevel < 0 || mDesiredSavedRawDiscardLevel > desired_discard)
+ {
mForceToSaveRawImage = TRUE ;
mDesiredSavedRawDiscardLevel = desired_discard ;
@@ -2708,11 +2804,19 @@ void LLViewerFetchedTexture::forceToSaveRawImage(S32 desired_discard, bool from_
mRawImage = NULL ;
mRawDiscardLevel = INVALID_DISCARD_LEVEL ;
- }
+ }
}
}
void LLViewerFetchedTexture::destroySavedRawImage()
{
+ if(mLastReferencedSavedRawImageTime < mKeptSavedRawImageTime)
+ {
+ return ; //keep the saved raw image.
+ }
+
+ mForceToSaveRawImage = FALSE ;
+ mSaveRawImage = FALSE ;
+
clearCallbackEntryList() ;
mSavedRawImage = NULL ;
@@ -2721,6 +2825,7 @@ void LLViewerFetchedTexture::destroySavedRawImage()
mSavedRawDiscardLevel = -1 ;
mDesiredSavedRawDiscardLevel = -1 ;
mLastReferencedSavedRawImageTime = 0.0f ;
+ mKeptSavedRawImageTime = 0.f ;
}
LLImageRaw* LLViewerFetchedTexture::getSavedRawImage()
@@ -2872,7 +2977,7 @@ BOOL LLViewerFetchedTexture::insertToAtlas()
}
//process the waiting_list
- for(ll_face_list_t::iterator iter = waiting_list.begin(); iter != waiting_list.end(); ++iter)
+ for(std::vector<LLFace*>::iterator iter = waiting_list.begin(); iter != waiting_list.end(); ++iter)
{
facep = (LLFace*)*iter ;
groupp = facep->getDrawable()->getSpatialGroup() ;
@@ -3058,8 +3163,13 @@ void LLViewerLODTexture::processTextureStats()
S32 current_discard = getDiscardLevel();
if (sDesiredDiscardBias > 0.0f && mBoostLevel < LLViewerTexture::BOOST_SCULPTED && current_discard >= 0)
{
+ if(desired_discard_bias_max <= sDesiredDiscardBias && !mForceToSaveRawImage)
+ {
+ //needs to release texture memory urgently
+ scaleDown() ;
+ }
// Limit the amount of GL memory bound each frame
- if ( BYTES_TO_MEGA_BYTES(sBoundTextureMemoryInBytes) > sMaxBoundTextureMemInMegaBytes * texmem_middle_bound_scale &&
+ else if ( BYTES_TO_MEGA_BYTES(sBoundTextureMemoryInBytes) > sMaxBoundTextureMemInMegaBytes * texmem_middle_bound_scale &&
(!getBoundRecently() || mDesiredDiscardLevel >= mCachedRawDiscardLevel))
{
scaleDown() ;
@@ -3078,9 +3188,16 @@ void LLViewerLODTexture::processTextureStats()
{
mDesiredDiscardLevel = llmin(mDesiredDiscardLevel, (S8)mDesiredSavedRawDiscardLevel) ;
}
+ else if(LLPipeline::sMemAllocationThrottled)//release memory of large textures by decrease their resolutions.
+ {
+ if(scaleDown())
+ {
+ mDesiredDiscardLevel = mCachedRawDiscardLevel ;
+ }
+ }
}
-void LLViewerLODTexture::scaleDown()
+bool LLViewerLODTexture::scaleDown()
{
if(hasGLTexture() && mCachedRawDiscardLevel > getDiscardLevel())
{
@@ -3091,7 +3208,10 @@ void LLViewerLODTexture::scaleDown()
{
tester->setStablizingTime() ;
}
+
+ return true ;
}
+ return false ;
}
//----------------------------------------------------------------------------------------------
//end of LLViewerLODTexture
diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h
index b5636bbdc7..b96441127d 100644
--- a/indra/newview/llviewertexture.h
+++ b/indra/newview/llviewertexture.h
@@ -267,6 +267,7 @@ private:
/*virtual*/ LLImageGL* getGLTexture() const ;
virtual void switchToCachedImage();
+ static bool isMemoryForTextureLow() ;
protected:
LLUUID mID;
S32 mBoostLevel; // enum describing priority level
@@ -330,6 +331,7 @@ public:
static BOOL sUseTextureAtlas ;
static LLPointer<LLViewerTexture> sNullImagep; // Null texture for non-textured objects.
+ static LLPointer<LLViewerTexture> sBlackImagep; // Texture to show NOTHING (pure black)
};
@@ -465,7 +467,7 @@ public:
S32 getCachedRawImageLevel() const {return mCachedRawDiscardLevel;}
BOOL isCachedRawImageReady() const {return mCachedRawImageReady ;}
BOOL isRawImageValid()const { return mIsRawImageValid ; }
- void forceToSaveRawImage(S32 desired_discard = 0, bool from_callback = false) ;
+ void forceToSaveRawImage(S32 desired_discard = 0, F32 kept_time = 0.f) ;
/*virtual*/ void setCachedRawImage(S32 discard_level, LLImageRaw* imageraw) ;
void destroySavedRawImage() ;
LLImageRaw* getSavedRawImage() ;
@@ -550,6 +552,7 @@ protected:
S32 mSavedRawDiscardLevel;
S32 mDesiredSavedRawDiscardLevel;
F32 mLastReferencedSavedRawImageTime ;
+ F32 mKeptSavedRawImageTime ;
//a small version of the copy of the raw image (<= 64 * 64)
LLPointer<LLImageRaw> mCachedRawImage;
@@ -595,7 +598,7 @@ public:
private:
void init(bool firstinit) ;
- void scaleDown() ;
+ bool scaleDown() ;
private:
F32 mDiscardVirtualSize; // Virtual size used to calculate desired discard
diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp
index 275dfaa996..089f45ca89 100644
--- a/indra/newview/llviewertexturelist.cpp
+++ b/indra/newview/llviewertexturelist.cpp
@@ -82,22 +82,18 @@ LLViewerTextureList::LLViewerTextureList()
: mForceResetTextureStats(FALSE),
mUpdateStats(FALSE),
mMaxResidentTexMemInMegaBytes(0),
- mMaxTotalTextureMemInMegaBytes(0)
+ mMaxTotalTextureMemInMegaBytes(0),
+ mInitialized(FALSE)
{
}
void LLViewerTextureList::init()
-{
+{
+ mInitialized = TRUE ;
sNumImages = 0;
+ mUpdateStats = TRUE;
mMaxResidentTexMemInMegaBytes = 0;
mMaxTotalTextureMemInMegaBytes = 0 ;
- if (gNoRender)
- {
- // Don't initialize GL stuff if we're not rendering.
- return;
- }
-
- mUpdateStats = TRUE;
// Update how much texture RAM we're allowed to use.
updateMaxResidentTexMem(0); // 0 = use current
@@ -110,12 +106,16 @@ void LLViewerTextureList::doPreloadImages()
{
LL_DEBUGS("ViewerImages") << "Preloading images..." << LL_ENDL;
+ llassert_always(mInitialized) ;
+ llassert_always(mImageList.empty()) ;
+ llassert_always(mUUIDMap.empty()) ;
+
// Set the "missing asset" image
LLViewerFetchedTexture::sMissingAssetImagep = LLViewerTextureManager::getFetchedTextureFromFile("missing_asset.tga", MIPMAP_NO, LLViewerFetchedTexture::BOOST_UI);
// Set the "white" image
LLViewerFetchedTexture::sWhiteImagep = LLViewerTextureManager::getFetchedTextureFromFile("white.tga", MIPMAP_NO, LLViewerFetchedTexture::BOOST_UI);
-
+ LLTexUnit::sWhiteTexture = LLViewerFetchedTexture::sWhiteImagep->getTexName();
LLUIImageList* image_list = LLUIImageList::getInstance();
image_list->initFromFile();
@@ -279,6 +279,8 @@ void LLViewerTextureList::shutdown()
mUUIDMap.clear();
mImageList.clear();
+
+ mInitialized = FALSE ; //prevent loading textures again.
}
void LLViewerTextureList::dump()
@@ -305,6 +307,7 @@ void LLViewerTextureList::destroyGL(BOOL save_state)
void LLViewerTextureList::restoreGL()
{
+ llassert_always(mInitialized) ;
LLImageGL::restoreGL();
}
@@ -325,6 +328,11 @@ LLViewerFetchedTexture* LLViewerTextureList::getImageFromFile(const std::string&
LLGLenum primary_format,
const LLUUID& force_id)
{
+ if(!mInitialized)
+ {
+ return NULL ;
+ }
+
std::string full_path = gDirUtilp->findSkinnedFilename("textures", filename);
if (full_path.empty())
{
@@ -345,11 +353,9 @@ LLViewerFetchedTexture* LLViewerTextureList::getImageFromUrl(const std::string&
LLGLenum primary_format,
const LLUUID& force_id)
{
- if (gNoRender)
+ if(!mInitialized)
{
- // Never mind that this ignores image_set_id;
- // getImage() will handle that later.
- return LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT, TRUE, LLViewerTexture::BOOST_UI);
+ return NULL ;
}
// generate UUID based on hash of filename
@@ -411,6 +417,11 @@ LLViewerFetchedTexture* LLViewerTextureList::getImage(const LLUUID &image_id,
LLGLenum primary_format,
LLHost request_from_host)
{
+ if(!mInitialized)
+ {
+ return NULL ;
+ }
+
// Return the image with ID image_id
// If the image is not found, creates new image and
// enqueues a request for transmission
@@ -491,6 +502,7 @@ LLViewerFetchedTexture *LLViewerTextureList::findImage(const LLUUID &image_id)
void LLViewerTextureList::addImageToList(LLViewerFetchedTexture *image)
{
+ llassert_always(mInitialized) ;
llassert(image);
if (image->isInImageList())
{
@@ -506,6 +518,7 @@ void LLViewerTextureList::addImageToList(LLViewerFetchedTexture *image)
void LLViewerTextureList::removeImageFromList(LLViewerFetchedTexture *image)
{
+ llassert_always(mInitialized) ;
llassert(image);
if (!image->isInImageList())
{
@@ -517,9 +530,12 @@ void LLViewerTextureList::removeImageFromList(LLViewerFetchedTexture *image)
}
llerrs << "LLViewerTextureList::removeImageFromList - Image not in list" << llendl;
}
- if(mImageList.erase(image) != 1)
+
+ S32 count = mImageList.erase(image) ;
+ if(count != 1)
{
- llerrs << "Error happens when remove image from mImageList!" << llendl ;
+ llinfos << image->getID() << llendl ;
+ llerrs << "Error happens when remove image from mImageList: " << count << llendl ;
}
image->setInImageList(FALSE) ;
@@ -573,6 +589,11 @@ void LLViewerTextureList::dirtyImage(LLViewerFetchedTexture *image)
////////////////////////////////////////////////////////////////////////////
static LLFastTimer::DeclareTimer FTM_IMAGE_MARK_DIRTY("Dirty Images");
+static LLFastTimer::DeclareTimer FTM_IMAGE_UPDATE_PRIORITIES("Prioritize");
+static LLFastTimer::DeclareTimer FTM_IMAGE_CALLBACKS("Callbacks");
+static LLFastTimer::DeclareTimer FTM_IMAGE_FETCH("Fetch");
+static LLFastTimer::DeclareTimer FTM_IMAGE_CREATE("Create");
+static LLFastTimer::DeclareTimer FTM_IMAGE_STATS("Stats");
void LLViewerTextureList::updateImages(F32 max_time)
{
@@ -584,14 +605,25 @@ void LLViewerTextureList::updateImages(F32 max_time)
LLViewerStats::getInstance()->mGLBoundMemStat.addValue((F32)BYTES_TO_MEGA_BYTES(LLImageGL::sBoundTextureMemoryInBytes));
LLViewerStats::getInstance()->mRawMemStat.addValue((F32)BYTES_TO_MEGA_BYTES(LLImageRaw::sGlobalRawMemory));
LLViewerStats::getInstance()->mFormattedMemStat.addValue((F32)BYTES_TO_MEGA_BYTES(LLImageFormatted::sGlobalFormattedMemory));
-
- updateImagesDecodePriorities();
+
+
+ {
+ LLFastTimer t(FTM_IMAGE_UPDATE_PRIORITIES);
+ updateImagesDecodePriorities();
+ }
F32 total_max_time = max_time;
- max_time -= updateImagesFetchTextures(max_time);
+
+ {
+ LLFastTimer t(FTM_IMAGE_FETCH);
+ max_time -= updateImagesFetchTextures(max_time);
+ }
- max_time = llmax(max_time, total_max_time*.50f); // at least 50% of max_time
- max_time -= updateImagesCreateTextures(max_time);
+ {
+ LLFastTimer t(FTM_IMAGE_CREATE);
+ max_time = llmax(max_time, total_max_time*.50f); // at least 50% of max_time
+ max_time -= updateImagesCreateTextures(max_time);
+ }
if (!mDirtyTextureList.empty())
{
@@ -599,24 +631,32 @@ void LLViewerTextureList::updateImages(F32 max_time)
gPipeline.dirtyPoolObjectTextures(mDirtyTextureList);
mDirtyTextureList.clear();
}
- bool didone = false;
- for (image_list_t::iterator iter = mCallbackList.begin();
- iter != mCallbackList.end(); )
+
{
- //trigger loaded callbacks on local textures immediately
- LLViewerFetchedTexture* image = *iter++;
- if (!image->getUrl().empty())
+ LLFastTimer t(FTM_IMAGE_CALLBACKS);
+ bool didone = false;
+ for (image_list_t::iterator iter = mCallbackList.begin();
+ iter != mCallbackList.end(); )
{
- // Do stuff to handle callbacks, update priorities, etc.
- didone = image->doLoadedCallbacks();
- }
- else if (!didone)
- {
- // Do stuff to handle callbacks, update priorities, etc.
- didone = image->doLoadedCallbacks();
+ //trigger loaded callbacks on local textures immediately
+ LLViewerFetchedTexture* image = *iter++;
+ if (!image->getUrl().empty())
+ {
+ // Do stuff to handle callbacks, update priorities, etc.
+ didone = image->doLoadedCallbacks();
+ }
+ else if (!didone)
+ {
+ // Do stuff to handle callbacks, update priorities, etc.
+ didone = image->doLoadedCallbacks();
+ }
}
}
- updateImagesUpdateStats();
+
+ {
+ LLFastTimer t(FTM_IMAGE_STATS);
+ updateImagesUpdateStats();
+ }
}
void LLViewerTextureList::updateImagesDecodePriorities()
@@ -642,10 +682,7 @@ void LLViewerTextureList::updateImagesDecodePriorities()
const F32 LAZY_FLUSH_TIMEOUT = 30.f; // stop decoding
const F32 MAX_INACTIVE_TIME = 50.f; // actually delete
S32 min_refs = 3; // 1 for mImageList, 1 for mUUIDMap, 1 for local reference
- if (imagep->hasCallbacks())
- {
- min_refs++; // Add an extra reference if we're on the loaded callback list
- }
+
S32 num_refs = imagep->getNumRefs();
if (num_refs == min_refs)
{
@@ -737,18 +774,16 @@ void LLViewerTextureList::updateImagesDecodePriorities()
return type_from_host;
}
*/
-static LLFastTimer::DeclareTimer FTM_IMAGE_CREATE("Create Images");
F32 LLViewerTextureList::updateImagesCreateTextures(F32 max_time)
{
- if (gNoRender || gGLManager.mIsDisabled) return 0.0f;
+ if (gGLManager.mIsDisabled) return 0.0f;
//
// Create GL textures for all textures that need them (images which have been
// decoded, but haven't been pushed into GL).
//
- LLFastTimer t(FTM_IMAGE_CREATE);
-
+
LLTimer create_timer;
image_list_t::iterator enditer = mCreateTextureList.begin();
for (image_list_t::iterator iter = mCreateTextureList.begin();
@@ -781,9 +816,8 @@ void LLViewerTextureList::forceImmediateUpdate(LLViewerFetchedTexture* imagep)
imagep->processTextureStats();
F32 decode_priority = LLViewerFetchedTexture::maxDecodePriority() ;
imagep->setDecodePriority(decode_priority);
- mImageList.insert(imagep);
- imagep->setInImageList(TRUE) ;
-
+ addImageToList(imagep);
+
return ;
}
@@ -834,7 +868,7 @@ F32 LLViewerTextureList::updateImagesFetchTextures(F32 max_time)
for (entries_list_t::iterator iter3 = entries.begin();
iter3 != entries.end(); )
{
- LLPointer<LLViewerFetchedTexture> imagep = *iter3++;
+ LLViewerFetchedTexture* imagep = *iter3++;
bool fetching = imagep->updateFetch();
if (fetching)
@@ -876,8 +910,7 @@ void LLViewerTextureList::updateImagesUpdateStats()
void LLViewerTextureList::decodeAllImages(F32 max_time)
{
LLTimer timer;
- if(gNoRender) return;
-
+
// Update texture stats and priorities
std::vector<LLPointer<LLViewerFetchedTexture> > image_list;
for (image_priority_list_t::iterator iter = mImageList.begin();
@@ -887,6 +920,8 @@ void LLViewerTextureList::decodeAllImages(F32 max_time)
image_list.push_back(imagep);
imagep->setInImageList(FALSE) ;
}
+
+ llassert_always(image_list.size() == mImageList.size()) ;
mImageList.clear();
for (std::vector<LLPointer<LLViewerFetchedTexture> >::iterator iter = image_list.begin();
iter != image_list.end(); ++iter)
@@ -895,8 +930,7 @@ void LLViewerTextureList::decodeAllImages(F32 max_time)
imagep->processTextureStats();
F32 decode_priority = imagep->calcDecodePriority();
imagep->setDecodePriority(decode_priority);
- mImageList.insert(imagep);
- imagep->setInImageList(TRUE) ;
+ addImageToList(imagep);
}
image_list.clear();
@@ -940,99 +974,54 @@ void LLViewerTextureList::decodeAllImages(F32 max_time)
BOOL LLViewerTextureList::createUploadFile(const std::string& filename,
const std::string& out_filename,
const U8 codec)
-{
- // First, load the image.
+{
+ // Load the image
+ LLPointer<LLImageFormatted> image = LLImageFormatted::createFromType(codec);
+ if (image.isNull())
+ {
+ image->setLastError("Couldn't open the image to be uploaded.");
+ return FALSE;
+ }
+ if (!image->load(filename))
+ {
+ image->setLastError("Couldn't load the image to be uploaded.");
+ return FALSE;
+ }
+ // Decompress or expand it in a raw image structure
LLPointer<LLImageRaw> raw_image = new LLImageRaw;
-
- switch (codec)
+ if (!image->decode(raw_image, 0.0f))
{
- case IMG_CODEC_BMP:
- {
- LLPointer<LLImageBMP> bmp_image = new LLImageBMP;
-
- if (!bmp_image->load(filename))
- {
- return FALSE;
- }
-
- if (!bmp_image->decode(raw_image, 0.0f))
- {
- return FALSE;
- }
- }
- break;
- case IMG_CODEC_TGA:
- {
- LLPointer<LLImageTGA> tga_image = new LLImageTGA;
-
- if (!tga_image->load(filename))
- {
- return FALSE;
- }
-
- if (!tga_image->decode(raw_image))
- {
- return FALSE;
- }
-
- if( (tga_image->getComponents() != 3) &&
- (tga_image->getComponents() != 4) )
- {
- tga_image->setLastError( "Image files with less than 3 or more than 4 components are not supported." );
- return FALSE;
- }
- }
- break;
- case IMG_CODEC_JPEG:
- {
- LLPointer<LLImageJPEG> jpeg_image = new LLImageJPEG;
-
- if (!jpeg_image->load(filename))
- {
- return FALSE;
- }
-
- if (!jpeg_image->decode(raw_image, 0.0f))
- {
- return FALSE;
- }
- }
- break;
- case IMG_CODEC_PNG:
- {
- LLPointer<LLImagePNG> png_image = new LLImagePNG;
-
- if (!png_image->load(filename))
- {
- return FALSE;
- }
-
- if (!png_image->decode(raw_image, 0.0f))
- {
- return FALSE;
- }
- }
- break;
- default:
- return FALSE;
+ image->setLastError("Couldn't decode the image to be uploaded.");
+ return FALSE;
}
-
- LLPointer<LLImageJ2C> compressedImage = convertToUploadFile(raw_image);
-
- if( !compressedImage->save(out_filename) )
+ // Check the image constraints
+ if ((image->getComponents() != 3) && (image->getComponents() != 4))
{
- llinfos << "Couldn't create output file " << out_filename << llendl;
+ image->setLastError("Image files with less than 3 or more than 4 components are not supported.");
return FALSE;
}
-
- // test to see if the encode and save worked.
+ // Convert to j2c (JPEG2000) and save the file locally
+ LLPointer<LLImageJ2C> compressedImage = convertToUploadFile(raw_image);
+ if (compressedImage.isNull())
+ {
+ image->setLastError("Couldn't convert the image to jpeg2000.");
+ llinfos << "Couldn't convert to j2c, file : " << filename << llendl;
+ return FALSE;
+ }
+ if (!compressedImage->save(out_filename))
+ {
+ image->setLastError("Couldn't create the jpeg2000 image for upload.");
+ llinfos << "Couldn't create output file : " << out_filename << llendl;
+ return FALSE;
+ }
+ // Test to see if the encode and save worked
LLPointer<LLImageJ2C> integrity_test = new LLImageJ2C;
- if( !integrity_test->loadAndValidate( out_filename ) )
+ if (!integrity_test->loadAndValidate( out_filename ))
{
- llinfos << "Image: " << out_filename << " is corrupt." << llendl;
+ image->setLastError("The created jpeg2000 image is corrupt.");
+ llinfos << "Image file : " << out_filename << " is corrupt" << llendl;
return FALSE;
}
-
return TRUE;
}
@@ -1047,7 +1036,25 @@ LLPointer<LLImageJ2C> LLViewerTextureList::convertToUploadFile(LLPointer<LLImage
(raw_image->getWidth() * raw_image->getHeight() <= LL_IMAGE_REZ_LOSSLESS_CUTOFF * LL_IMAGE_REZ_LOSSLESS_CUTOFF))
compressedImage->setReversible(TRUE);
- compressedImage->encode(raw_image, 0.0f);
+
+ if (gSavedSettings.getBOOL("Jpeg2000AdvancedCompression"))
+ {
+ // This test option will create jpeg2000 images with precincts for each level, RPCL ordering
+ // and PLT markers. The block size is also optionally modifiable.
+ // Note: the images hence created are compatible with older versions of the viewer.
+ // Read the blocks and precincts size settings
+ S32 block_size = gSavedSettings.getS32("Jpeg2000BlocksSize");
+ S32 precinct_size = gSavedSettings.getS32("Jpeg2000PrecinctsSize");
+ llinfos << "Advanced JPEG2000 Compression: precinct = " << precinct_size << ", block = " << block_size << llendl;
+ compressedImage->initEncode(*raw_image, block_size, precinct_size, 0);
+ }
+
+ if (!compressedImage->encode(raw_image, 0.0f))
+ {
+ llinfos << "convertToUploadFile : encode returns with error!!" << llendl;
+ // Clear up the pointer so we don't leak that one
+ compressedImage = NULL;
+ }
return compressedImage;
}
@@ -1073,6 +1080,13 @@ S32 LLViewerTextureList::getMaxVideoRamSetting(bool get_recommended)
// Treat any card with < 32 MB (shudder) as having 32 MB
// - it's going to be swapping constantly regardless
S32 max_vram = gGLManager.mVRAM;
+
+ if(gGLManager.mIsATI)
+ {
+ //shrink the availabe vram for ATI cards because some of them do not handel texture swapping well.
+ max_vram = (S32)(max_vram * 0.75f);
+ }
+
max_vram = llmax(max_vram, getMinVideoRamSetting());
max_texmem = max_vram;
if (!get_recommended)
@@ -1080,10 +1094,19 @@ S32 LLViewerTextureList::getMaxVideoRamSetting(bool get_recommended)
}
else
{
- if (get_recommended)
- max_texmem = 128;
- else
+ if (!get_recommended)
+ {
max_texmem = 512;
+ }
+ else if (gSavedSettings.getBOOL("NoHardwareProbe")) //did not do hardware detection at startup
+ {
+ max_texmem = 512;
+ }
+ else
+ {
+ max_texmem = 128;
+ }
+
llwarns << "VRAM amount not detected, defaulting to " << max_texmem << " MB" << llendl;
}
@@ -1362,7 +1385,8 @@ LLUIImagePtr LLUIImageList::getUIImageByID(const LLUUID& image_id, S32 priority)
const BOOL use_mips = FALSE;
const LLRect scale_rect = LLRect::null;
- return loadUIImageByID(image_id, use_mips, scale_rect, (LLViewerTexture::EBoostLevel)priority);
+ const LLRect clip_rect = LLRect::null;
+ return loadUIImageByID(image_id, use_mips, scale_rect, clip_rect, (LLViewerTexture::EBoostLevel)priority);
}
LLUIImagePtr LLUIImageList::getUIImage(const std::string& image_name, S32 priority)
@@ -1376,32 +1400,33 @@ LLUIImagePtr LLUIImageList::getUIImage(const std::string& image_name, S32 priori
const BOOL use_mips = FALSE;
const LLRect scale_rect = LLRect::null;
- return loadUIImageByName(image_name, image_name, use_mips, scale_rect, (LLViewerTexture::EBoostLevel)priority);
+ const LLRect clip_rect = LLRect::null;
+ return loadUIImageByName(image_name, image_name, use_mips, scale_rect, clip_rect, (LLViewerTexture::EBoostLevel)priority);
}
LLUIImagePtr LLUIImageList::loadUIImageByName(const std::string& name, const std::string& filename,
- BOOL use_mips, const LLRect& scale_rect, LLViewerTexture::EBoostLevel boost_priority )
+ BOOL use_mips, const LLRect& scale_rect, const LLRect& clip_rect, LLViewerTexture::EBoostLevel boost_priority )
{
if (boost_priority == LLViewerTexture::BOOST_NONE)
{
boost_priority = LLViewerTexture::BOOST_UI;
}
LLViewerFetchedTexture* imagep = LLViewerTextureManager::getFetchedTextureFromFile(filename, MIPMAP_NO, boost_priority);
- return loadUIImage(imagep, name, use_mips, scale_rect);
+ return loadUIImage(imagep, name, use_mips, scale_rect, clip_rect);
}
LLUIImagePtr LLUIImageList::loadUIImageByID(const LLUUID& id,
- BOOL use_mips, const LLRect& scale_rect, LLViewerTexture::EBoostLevel boost_priority)
+ BOOL use_mips, const LLRect& scale_rect, const LLRect& clip_rect, LLViewerTexture::EBoostLevel boost_priority)
{
if (boost_priority == LLViewerTexture::BOOST_NONE)
{
boost_priority = LLViewerTexture::BOOST_UI;
}
LLViewerFetchedTexture* imagep = LLViewerTextureManager::getFetchedTexture(id, MIPMAP_NO, boost_priority);
- return loadUIImage(imagep, id.asString(), use_mips, scale_rect);
+ return loadUIImage(imagep, id.asString(), use_mips, scale_rect, clip_rect);
}
-LLUIImagePtr LLUIImageList::loadUIImage(LLViewerFetchedTexture* imagep, const std::string& name, BOOL use_mips, const LLRect& scale_rect)
+LLUIImagePtr LLUIImageList::loadUIImage(LLViewerFetchedTexture* imagep, const std::string& name, BOOL use_mips, const LLRect& scale_rect, const LLRect& clip_rect)
{
if (!imagep) return NULL;
@@ -1422,13 +1447,14 @@ LLUIImagePtr LLUIImageList::loadUIImage(LLViewerFetchedTexture* imagep, const st
LLUIImageLoadData* datap = new LLUIImageLoadData;
datap->mImageName = name;
datap->mImageScaleRegion = scale_rect;
+ datap->mImageClipRegion = clip_rect;
imagep->setLoadedCallback(onUIImageLoaded, 0, FALSE, FALSE, datap, NULL);
}
return new_imagep;
}
-LLUIImagePtr LLUIImageList::preloadUIImage(const std::string& name, const std::string& filename, BOOL use_mips, const LLRect& scale_rect)
+LLUIImagePtr LLUIImageList::preloadUIImage(const std::string& name, const std::string& filename, BOOL use_mips, const LLRect& scale_rect, const LLRect& clip_rect)
{
// look for existing image
uuid_ui_image_map_t::iterator found_it = mUIImages.find(name);
@@ -1438,7 +1464,7 @@ LLUIImagePtr LLUIImageList::preloadUIImage(const std::string& name, const std::s
llerrs << "UI Image " << name << " already loaded." << llendl;
}
- return loadUIImageByName(name, filename, use_mips, scale_rect);
+ return loadUIImageByName(name, filename, use_mips, scale_rect, clip_rect);
}
//static
@@ -1452,6 +1478,7 @@ void LLUIImageList::onUIImageLoaded( BOOL success, LLViewerFetchedTexture *src_v
LLUIImageLoadData* image_datap = (LLUIImageLoadData*)user_data;
std::string ui_image_name = image_datap->mImageName;
LLRect scale_rect = image_datap->mImageScaleRegion;
+ LLRect clip_rect = image_datap->mImageClipRegion;
if (final)
{
delete image_datap;
@@ -1468,9 +1495,21 @@ void LLUIImageList::onUIImageLoaded( BOOL success, LLViewerFetchedTexture *src_v
// from power-of-2 gl image
if (success && imagep.notNull() && src_vi && (src_vi->getUrl().compare(0, 7, "file://")==0))
{
- F32 clip_x = (F32)src_vi->getOriginalWidth() / (F32)src_vi->getFullWidth();
- F32 clip_y = (F32)src_vi->getOriginalHeight() / (F32)src_vi->getFullHeight();
- imagep->setClipRegion(LLRectf(0.f, clip_y, clip_x, 0.f));
+ F32 full_width = (F32)src_vi->getFullWidth();
+ F32 full_height = (F32)src_vi->getFullHeight();
+ F32 clip_x = (F32)src_vi->getOriginalWidth() / full_width;
+ F32 clip_y = (F32)src_vi->getOriginalHeight() / full_height;
+ if (clip_rect != LLRect::null)
+ {
+ imagep->setClipRegion(LLRectf(llclamp((F32)clip_rect.mLeft / full_width, 0.f, 1.f),
+ llclamp((F32)clip_rect.mTop / full_height, 0.f, 1.f),
+ llclamp((F32)clip_rect.mRight / full_width, 0.f, 1.f),
+ llclamp((F32)clip_rect.mBottom / full_height, 0.f, 1.f)));
+ }
+ else
+ {
+ imagep->setClipRegion(LLRectf(0.f, clip_y, clip_x, 0.f));
+ }
if (scale_rect != LLRect::null)
{
imagep->setScaleRegion(
@@ -1491,6 +1530,7 @@ struct UIImageDeclaration : public LLInitParam::Block<UIImageDeclaration>
Optional<std::string> file_name;
Optional<bool> preload;
Optional<LLRect> scale;
+ Optional<LLRect> clip;
Optional<bool> use_mips;
UIImageDeclaration()
@@ -1498,6 +1538,7 @@ struct UIImageDeclaration : public LLInitParam::Block<UIImageDeclaration>
file_name("file_name"),
preload("preload", false),
scale("scale"),
+ clip("clip"),
use_mips("use_mips", false)
{}
};
@@ -1531,42 +1572,45 @@ bool LLUIImageList::initFromFile()
return false;
}
- std::vector<std::string> paths;
- // path to current selected skin
- paths.push_back(gDirUtilp->getSkinDir()
- + gDirUtilp->getDirDelimiter()
- + "textures"
- + gDirUtilp->getDirDelimiter()
- + "textures.xml");
- // path to user overrides on current skin
- paths.push_back(gDirUtilp->getUserSkinDir()
- + gDirUtilp->getDirDelimiter()
- + "textures"
- + gDirUtilp->getDirDelimiter()
- + "textures.xml");
-
- // apply skinned xml files incrementally
- for(std::vector<std::string>::iterator path_it = paths.begin();
- path_it != paths.end();
- ++path_it)
- {
- // don't reapply base file to itself
- if (!path_it->empty() && (*path_it) != base_file_path)
- {
- LLXMLNodePtr update_root;
- if (LLXMLNode::parseFile(*path_it, update_root, NULL))
- {
- LLXMLNode::updateNode(root, update_root);
- }
- }
- }
-
UIImageDeclarations images;
LLXUIParser parser;
parser.readXUI(root, images, base_file_path);
+ // add components defined in current skin
+ std::string skin_update_path = gDirUtilp->getSkinDir()
+ + gDirUtilp->getDirDelimiter()
+ + "textures"
+ + gDirUtilp->getDirDelimiter()
+ + "textures.xml";
+ LLXMLNodePtr update_root;
+ if (skin_update_path != base_file_path
+ && LLXMLNode::parseFile(skin_update_path, update_root, NULL))
+ {
+ parser.readXUI(update_root, images, skin_update_path);
+ }
+
+ // add components defined in user override of current skin
+ skin_update_path = gDirUtilp->getUserSkinDir()
+ + gDirUtilp->getDirDelimiter()
+ + "textures"
+ + gDirUtilp->getDirDelimiter()
+ + "textures.xml";
+ if (skin_update_path != base_file_path
+ && LLXMLNode::parseFile(skin_update_path, update_root, NULL))
+ {
+ parser.readXUI(update_root, images, skin_update_path);
+ }
+
if (!images.validateBlock()) return false;
+ std::map<std::string, UIImageDeclaration> merged_declarations;
+ for (LLInitParam::ParamIterator<UIImageDeclaration>::const_iterator image_it = images.textures.begin();
+ image_it != images.textures.end();
+ ++image_it)
+ {
+ merged_declarations[image_it->name].overwriteFrom(*image_it);
+ }
+
enum e_decode_pass
{
PASS_DECODE_NOW,
@@ -1576,19 +1620,20 @@ bool LLUIImageList::initFromFile()
for (S32 cur_pass = PASS_DECODE_NOW; cur_pass < NUM_PASSES; cur_pass++)
{
- for (LLInitParam::ParamIterator<UIImageDeclaration>::const_iterator image_it = images.textures.begin();
- image_it != images.textures.end();
+ for (std::map<std::string, UIImageDeclaration>::const_iterator image_it = merged_declarations.begin();
+ image_it != merged_declarations.end();
++image_it)
{
- std::string file_name = image_it->file_name.isProvided() ? image_it->file_name() : image_it->name();
+ const UIImageDeclaration& image = image_it->second;
+ std::string file_name = image.file_name.isProvided() ? image.file_name() : image.name();
// load high priority textures on first pass (to kick off decode)
- enum e_decode_pass decode_pass = image_it->preload ? PASS_DECODE_NOW : PASS_DECODE_LATER;
+ enum e_decode_pass decode_pass = image.preload ? PASS_DECODE_NOW : PASS_DECODE_LATER;
if (decode_pass != cur_pass)
{
continue;
}
- preloadUIImage(image_it->name, file_name, image_it->use_mips, image_it->scale);
+ preloadUIImage(image.name, file_name, image.use_mips, image.scale, image.clip);
}
if (cur_pass == PASS_DECODE_NOW && !gSavedSettings.getBOOL("NoPreload"))
diff --git a/indra/newview/llviewertexturelist.h b/indra/newview/llviewertexturelist.h
index d508ce1ac6..b386c73d2a 100644
--- a/indra/newview/llviewertexturelist.h
+++ b/indra/newview/llviewertexturelist.h
@@ -65,6 +65,7 @@ class LLViewerTextureList
friend class LLTextureView;
friend class LLViewerTextureManager;
+ friend class LLLocalBitmap;
public:
static BOOL createUploadFile(const std::string& filename, const std::string& out_filename, const U8 codec);
@@ -83,6 +84,7 @@ public:
void dump();
void destroyGL(BOOL save_state = TRUE);
void restoreGL();
+ BOOL isInitialized() const {return mInitialized;}
LLViewerFetchedTexture *findImage(const LLUUID &image_id);
@@ -187,6 +189,7 @@ private:
// simply holds on to LLViewerFetchedTexture references to stop them from being purged too soon
std::set<LLPointer<LLViewerFetchedTexture> > mImagePreloads;
+ BOOL mInitialized ;
BOOL mUpdateStats;
S32 mMaxResidentTexMemInMegaBytes;
S32 mMaxTotalTextureMemInMegaBytes;
@@ -212,30 +215,33 @@ class LLUIImageList : public LLImageProviderInterface, public LLSingleton<LLUIIm
{
public:
// LLImageProviderInterface
- /*virtual*/ LLUIImagePtr getUIImageByID(const LLUUID& id, S32 priority);
- /*virtual*/ LLUIImagePtr getUIImage(const std::string& name, S32 priority);
+ /*virtual*/ LLPointer<LLUIImage> getUIImageByID(const LLUUID& id, S32 priority);
+ /*virtual*/ LLPointer<LLUIImage> getUIImage(const std::string& name, S32 priority);
void cleanUp();
bool initFromFile();
- LLUIImagePtr preloadUIImage(const std::string& name, const std::string& filename, BOOL use_mips, const LLRect& scale_rect);
+ LLPointer<LLUIImage> preloadUIImage(const std::string& name, const std::string& filename, BOOL use_mips, const LLRect& scale_rect, const LLRect& clip_rect);
static void onUIImageLoaded( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* src_aux, S32 discard_level, BOOL final, void* userdata );
private:
- LLUIImagePtr loadUIImageByName(const std::string& name, const std::string& filename,
+ LLPointer<LLUIImage> loadUIImageByName(const std::string& name, const std::string& filename,
BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null,
+ const LLRect& clip_rect = LLRect::null,
LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_UI);
- LLUIImagePtr loadUIImageByID(const LLUUID& id,
+ LLPointer<LLUIImage> loadUIImageByID(const LLUUID& id,
BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null,
+ const LLRect& clip_rect = LLRect::null,
LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_UI);
- LLUIImagePtr loadUIImage(LLViewerFetchedTexture* imagep, const std::string& name, BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null);
+ LLPointer<LLUIImage> loadUIImage(LLViewerFetchedTexture* imagep, const std::string& name, BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null, const LLRect& clip_rect = LLRect::null);
struct LLUIImageLoadData
{
std::string mImageName;
LLRect mImageScaleRegion;
+ LLRect mImageClipRegion;
};
typedef std::map< std::string, LLPointer<LLUIImage> > uuid_ui_image_map_t;
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index a7790243ed..ecd76f5495 100644..100755
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -25,22 +25,20 @@
*/
#include "llviewerprecompiledheaders.h"
-
#include "llviewerwindow.h"
-#if LL_WINDOWS
-#pragma warning (disable : 4355) // 'this' used in initializer list: yes, intentionally
-#endif
// system library includes
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <algorithm>
+#include <boost/lambda/core.hpp>
#include "llagent.h"
#include "llagentcamera.h"
#include "llfloaterreg.h"
+#include "llmeshrepository.h"
#include "llpanellogin.h"
#include "llviewerkeyboard.h"
#include "llviewermenu.h"
@@ -48,7 +46,6 @@
#include "llviewquery.h"
#include "llxmltree.h"
#include "llslurl.h"
-//#include "llviewercamera.h"
#include "llrender.h"
#include "llvoiceclient.h" // for push-to-talk button handling
@@ -79,10 +76,12 @@
#include "lltooltip.h"
#include "llmediaentry.h"
#include "llurldispatcher.h"
+#include "raytrace.h"
// newview includes
#include "llagent.h"
#include "llbox.h"
+#include "llchicletbar.h"
#include "llconsole.h"
#include "llviewercontrol.h"
#include "llcylinder.h"
@@ -127,11 +126,11 @@
#include "llmorphview.h"
#include "llmoveview.h"
#include "llnavigationbar.h"
+#include "llpaneltopinfobar.h"
#include "llpopupview.h"
#include "llpreviewtexture.h"
#include "llprogressview.h"
#include "llresmgr.h"
-#include "llsidetray.h"
#include "llselectmgr.h"
#include "llrootview.h"
#include "llrendersphere.h"
@@ -146,6 +145,7 @@
#include "lltexturefetch.h"
#include "lltextureview.h"
#include "lltool.h"
+#include "lltoolbarview.h"
#include "lltoolcomp.h"
#include "lltooldraganddrop.h"
#include "lltoolface.h"
@@ -185,7 +185,6 @@
#include "llviewerjoystick.h"
#include "llviewernetwork.h"
#include "llpostprocess.h"
-#include "llbottomtray.h"
#include "llnearbychatbar.h"
#include "llagentui.h"
#include "llwearablelist.h"
@@ -197,6 +196,7 @@
#include "llfloaternotificationsconsole.h"
#include "llnearbychat.h"
+#include "llwindowlistener.h"
#include "llviewerwindowlistener.h"
#include "llpaneltopinfobar.h"
@@ -227,6 +227,8 @@ LLVector2 gDebugRaycastTexCoord;
LLVector3 gDebugRaycastNormal;
LLVector3 gDebugRaycastBinormal;
S32 gDebugRaycastFaceHit;
+LLVector3 gDebugRaycastStart;
+LLVector3 gDebugRaycastEnd;
// HUD display lines in lower right
BOOL gDisplayWindInfo = FALSE;
@@ -234,17 +236,10 @@ BOOL gDisplayCameraPos = FALSE;
BOOL gDisplayFOV = FALSE;
BOOL gDisplayBadge = FALSE;
-S32 CHAT_BAR_HEIGHT = 28;
-S32 OVERLAY_BAR_HEIGHT = 20;
-
-const U8 NO_FACE = 255;
+static const U8 NO_FACE = 255;
BOOL gQuietSnapshot = FALSE;
-const F32 MIN_AFK_TIME = 2.f; // minimum time after setting away state before coming back
-const F32 MAX_FAST_FRAME_TIME = 0.5f;
-const F32 FAST_FRAME_INCREMENT = 0.1f;
-
-const F32 MIN_DISPLAY_SCALE = 0.75f;
+static const F32 MIN_DISPLAY_SCALE = 0.75f;
std::string LLViewerWindow::sSnapshotBaseName;
std::string LLViewerWindow::sSnapshotDir;
@@ -296,13 +291,15 @@ private:
line_list_t mLineList;
LLColor4 mTextColor;
-public:
- LLDebugText(LLViewerWindow* window) : mWindow(window) {}
-
void addText(S32 x, S32 y, const std::string &text)
{
mLineList.push_back(Line(text, x, y));
}
+
+ void clearText() { mLineList.clear(); }
+
+public:
+ LLDebugText(LLViewerWindow* window) : mWindow(window) {}
void update()
{
@@ -314,15 +311,25 @@ public:
std::string rwind_vector_text;
std::string audio_text;
+ static const std::string beacon_particle = LLTrans::getString("BeaconParticle");
+ static const std::string beacon_physical = LLTrans::getString("BeaconPhysical");
+ static const std::string beacon_scripted = LLTrans::getString("BeaconScripted");
+ static const std::string beacon_scripted_touch = LLTrans::getString("BeaconScriptedTouch");
+ static const std::string beacon_sound = LLTrans::getString("BeaconSound");
+ static const std::string beacon_media = LLTrans::getString("BeaconMedia");
+ static const std::string particle_hiding = LLTrans::getString("ParticleHiding");
+
// Draw the statistics in a light gray
// and in a thin font
mTextColor = LLColor4( 0.86f, 0.86f, 0.86f, 1.f );
// Draw stuff growing up from right lower corner of screen
- U32 xpos = mWindow->getWindowWidthScaled() - 350;
+ U32 xpos = mWindow->getWorldViewWidthScaled() - 350;
U32 ypos = 64;
const U32 y_inc = 20;
+ clearText();
+
if (gSavedSettings.getBOOL("DebugShowTime"))
{
const U32 y_inc2 = 15;
@@ -347,6 +354,14 @@ public:
addText(xpos, ypos, llformat("Time: %d:%02d:%02d", hours,mins,secs)); ypos += y_inc;
}
+#if LL_WINDOWS
+ if (gSavedSettings.getBOOL("DebugShowMemory"))
+ {
+ addText(xpos, ypos, llformat("Memory: %d (KB)", LLMemory::getWorkingSetSize() / 1024));
+ ypos += y_inc;
+ }
+#endif
+
if (gDisplayCameraPos)
{
std::string camera_view_text;
@@ -443,7 +458,83 @@ public:
addText(xpos, ypos, "Shaders Disabled");
ypos += y_inc;
}
- addText(xpos, ypos, llformat("%d MB Vertex Data", LLVertexBuffer::sAllocatedBytes/(1024*1024)));
+
+ if (gGLManager.mHasATIMemInfo)
+ {
+ S32 meminfo[4];
+ glGetIntegerv(GL_TEXTURE_FREE_MEMORY_ATI, meminfo);
+
+ addText(xpos, ypos, llformat("%.2f MB Texture Memory Free", meminfo[0]/1024.f));
+ ypos += y_inc;
+
+ if (gGLManager.mHasVertexBufferObject)
+ {
+ glGetIntegerv(GL_VBO_FREE_MEMORY_ATI, meminfo);
+ addText(xpos, ypos, llformat("%.2f MB VBO Memory Free", meminfo[0]/1024.f));
+ ypos += y_inc;
+ }
+ }
+ else if (gGLManager.mHasNVXMemInfo)
+ {
+ S32 free_memory;
+ glGetIntegerv(GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX, &free_memory);
+ addText(xpos, ypos, llformat("%.2f MB Video Memory Free", free_memory/1024.f));
+ ypos += y_inc;
+ }
+
+ //show streaming cost/triangle count of known prims in current region OR selection
+ {
+ F32 cost = 0.f;
+ S32 count = 0;
+ S32 vcount = 0;
+ S32 object_count = 0;
+ S32 total_bytes = 0;
+ S32 visible_bytes = 0;
+
+ const char* label = "Region";
+ if (LLSelectMgr::getInstance()->getSelection()->getObjectCount() == 0)
+ { //region
+ LLViewerRegion* region = gAgent.getRegion();
+ if (region)
+ {
+ for (U32 i = 0; i < gObjectList.getNumObjects(); ++i)
+ {
+ LLViewerObject* object = gObjectList.getObject(i);
+ if (object &&
+ object->getRegion() == region &&
+ object->getVolume())
+ {
+ object_count++;
+ S32 bytes = 0;
+ S32 visible = 0;
+ cost += object->getStreamingCost(&bytes, &visible);
+ S32 vt = 0;
+ count += object->getTriangleCount(&vt);
+ vcount += vt;
+ total_bytes += bytes;
+ visible_bytes += visible;
+ }
+ }
+ }
+ }
+ else
+ {
+ label = "Selection";
+ cost = LLSelectMgr::getInstance()->getSelection()->getSelectedObjectStreamingCost(&total_bytes, &visible_bytes);
+ count = LLSelectMgr::getInstance()->getSelection()->getSelectedObjectTriangleCount(&vcount);
+ object_count = LLSelectMgr::getInstance()->getSelection()->getObjectCount();
+ }
+
+ addText(xpos,ypos, llformat("%s streaming cost: %.1f", label, cost));
+ ypos += y_inc;
+
+ addText(xpos, ypos, llformat(" %.3f KTris, %.3f KVerts, %.1f/%.1f KB, %d objects",
+ count/1000.f, vcount/1000.f, visible_bytes/1024.f, total_bytes/1024.f, object_count));
+ ypos += y_inc;
+
+ }
+
+ addText(xpos, ypos, llformat("%d MB Vertex Data (%d MB Pooled)", LLVertexBuffer::sAllocatedBytes/(1024*1024), LLVBOPool::sBytesPooled/(1024*1024)));
ypos += y_inc;
addText(xpos, ypos, llformat("%d Vertex Buffers", LLVertexBuffer::sGLCount));
@@ -495,6 +586,12 @@ public:
ypos += y_inc;
+ if (!LLSpatialGroup::sPendingQueries.empty())
+ {
+ addText(xpos,ypos, llformat("%d Queries pending", LLSpatialGroup::sPendingQueries.size()));
+ ypos += y_inc;
+ }
+
addText(xpos,ypos, llformat("%d Avatars visible", LLVOAvatar::sNumVisibleAvatars));
@@ -504,6 +601,24 @@ public:
ypos += y_inc;
+ if (gMeshRepo.meshRezEnabled())
+ {
+ addText(xpos, ypos, llformat("%.3f MB Mesh Data Received", LLMeshRepository::sBytesReceived/(1024.f*1024.f)));
+
+ ypos += y_inc;
+
+ addText(xpos, ypos, llformat("%d/%d Mesh HTTP Requests/Retries", LLMeshRepository::sHTTPRequestCount,
+ LLMeshRepository::sHTTPRetryCount));
+ ypos += y_inc;
+
+ addText(xpos, ypos, llformat("%d/%d Mesh LOD Pending/Processing", LLMeshRepository::sLODPending, LLMeshRepository::sLODProcessing));
+ ypos += y_inc;
+
+ addText(xpos, ypos, llformat("%.3f/%.3f MB Mesh Cache Read/Write ", LLMeshRepository::sCacheBytesRead/(1024.f*1024.f), LLMeshRepository::sCacheBytesWritten/(1024.f*1024.f)));
+
+ ypos += y_inc;
+ }
+
LLVertexBuffer::sBindCount = LLImageGL::sBindCount =
LLVertexBuffer::sSetCount = LLImageGL::sUniqueCount =
gPipeline.mNumVisibleNodes = LLPipeline::sVisibleLightCount = 0;
@@ -549,41 +664,63 @@ public:
addText(xpos, ypos, llformat("%d %d %d %d", color[0], color[1], color[2], color[3]));
ypos += y_inc;
}
+
+ if (gSavedSettings.getBOOL("DebugShowPrivateMem"))
+ {
+ LLPrivateMemoryPoolManager::getInstance()->updateStatistics() ;
+ addText(xpos, ypos, llformat("Total Reserved(KB): %d", LLPrivateMemoryPoolManager::getInstance()->mTotalReservedSize / 1024));
+ ypos += y_inc;
+
+ addText(xpos, ypos, llformat("Total Allocated(KB): %d", LLPrivateMemoryPoolManager::getInstance()->mTotalAllocatedSize / 1024));
+ ypos += y_inc;
+ }
+
// only display these messages if we are actually rendering beacons at this moment
if (LLPipeline::getRenderBeacons(NULL) && LLFloaterReg::instanceVisible("beacons"))
{
- if (LLPipeline::getRenderParticleBeacons(NULL))
+ if (LLPipeline::getRenderMOAPBeacons(NULL))
{
- addText(xpos, ypos, "Viewing particle beacons (blue)");
+ addText(xpos, ypos, "Viewing media beacons (white)");
ypos += y_inc;
}
+
if (LLPipeline::toggleRenderTypeControlNegated((void*)LLPipeline::RENDER_TYPE_PARTICLES))
{
- addText(xpos, ypos, "Hiding particles");
+ addText(xpos, ypos, particle_hiding);
ypos += y_inc;
}
- if (LLPipeline::getRenderPhysicalBeacons(NULL))
+
+ if (LLPipeline::getRenderParticleBeacons(NULL))
{
- addText(xpos, ypos, "Viewing physical object beacons (green)");
+ addText(xpos, ypos, "Viewing particle beacons (blue)");
+ ypos += y_inc;
+ }
+
+ if (LLPipeline::getRenderSoundBeacons(NULL))
+ {
+ addText(xpos, ypos, "Viewing sound beacons (yellow)");
ypos += y_inc;
}
+
if (LLPipeline::getRenderScriptedBeacons(NULL))
{
- addText(xpos, ypos, "Viewing scripted object beacons (red)");
+ addText(xpos, ypos, beacon_scripted);
ypos += y_inc;
}
else
if (LLPipeline::getRenderScriptedTouchBeacons(NULL))
{
- addText(xpos, ypos, "Viewing scripted object with touch function beacons (red)");
+ addText(xpos, ypos, beacon_scripted_touch);
ypos += y_inc;
}
- if (LLPipeline::getRenderSoundBeacons(NULL))
+
+ if (LLPipeline::getRenderPhysicalBeacons(NULL))
{
- addText(xpos, ypos, "Viewing sound beacons (yellow)");
+ addText(xpos, ypos, "Viewing physical object beacons (green)");
ypos += y_inc;
}
}
+
if(log_texture_traffic)
{
U32 old_y = ypos ;
@@ -600,6 +737,50 @@ public:
addText(xpos, ypos, "Network traffic for textures:");
ypos += y_inc;
}
+ }
+
+ if (gSavedSettings.getBOOL("DebugShowTextureInfo"))
+ {
+ LLViewerObject* objectp = NULL ;
+ //objectp = = gAgentCamera.getFocusObject();
+
+ LLSelectNode* nodep = LLSelectMgr::instance().getHoverNode();
+ if (nodep)
+ {
+ objectp = nodep->getObject();
+ }
+ if (objectp && !objectp->isDead())
+ {
+ S32 num_faces = objectp->mDrawable->getNumFaces() ;
+
+ for(S32 i = 0 ; i < num_faces; i++)
+ {
+ LLFace* facep = objectp->mDrawable->getFace(i) ;
+ if(facep)
+ {
+ //addText(xpos, ypos, llformat("ts_min: %.3f ts_max: %.3f tt_min: %.3f tt_max: %.3f", facep->mTexExtents[0].mV[0], facep->mTexExtents[1].mV[0],
+ // facep->mTexExtents[0].mV[1], facep->mTexExtents[1].mV[1]));
+ //ypos += y_inc;
+
+ addText(xpos, ypos, llformat("v_size: %.3f: p_size: %.3f", facep->getVirtualSize(), facep->getPixelArea()));
+ ypos += y_inc;
+
+ //const LLTextureEntry *tep = facep->getTextureEntry();
+ //if(tep)
+ //{
+ // addText(xpos, ypos, llformat("scale_s: %.3f: scale_t: %.3f", tep->mScaleS, tep->mScaleT)) ;
+ // ypos += y_inc;
+ //}
+
+ LLViewerTexture* tex = facep->getTexture() ;
+ if(tex)
+ {
+ addText(xpos, ypos, llformat("ID: %s v_size: %.3f", tex->getID().asString().c_str(), tex->getMaxVirtualSize()));
+ ypos += y_inc;
+ }
+ }
+ }
+ }
}
}
@@ -628,6 +809,20 @@ void LLViewerWindow::updateDebugText()
// LLViewerWindow
//
+LLViewerWindow::Params::Params()
+: title("title"),
+ name("name"),
+ x("x"),
+ y("y"),
+ width("width"),
+ height("height"),
+ min_width("min_width"),
+ min_height("min_height"),
+ fullscreen("fullscreen", false),
+ ignore_pixel_depth("ignore_pixel_depth", false)
+{}
+
+
BOOL LLViewerWindow::handleAnyMouseClick(LLWindow *window, LLCoordGL pos, MASK mask, LLMouseHandler::EClickType clicktype, BOOL down)
{
const char* buttonname = "";
@@ -730,6 +925,11 @@ BOOL LLViewerWindow::handleAnyMouseClick(LLWindow *window, LLCoordGL pos, MASK
// }
//}
+ // Mark the click as handled and return if we aren't within the root view to avoid spurious bugs
+ if( !mRootView->pointInView(x, y) )
+ {
+ return TRUE;
+ }
// Give the UI views a chance to process the click
if( mRootView->handleAnyMouseClick(x, y, mask, clicktype, down) )
{
@@ -851,7 +1051,7 @@ LLWindowCallbacks::DragNDropResult LLViewerWindow::handleDragNDrop( LLWindow *wi
{
if (drop)
{
- LLURLDispatcher::dispatch( dropped_slurl.getSLURLString(), NULL, true );
+ LLURLDispatcher::dispatch( dropped_slurl.getSLURLString(), "clicked", NULL, true );
return LLWindowCallbacks::DND_MOVE;
}
return LLWindowCallbacks::DND_COPY;
@@ -1004,7 +1204,8 @@ void LLViewerWindow::handleMouseMove(LLWindow *window, LLCoordGL pos, MASK mask
mWindow->showCursorFromMouseMove();
- if (gAwayTimer.getElapsedTimeF32() > MIN_AFK_TIME)
+ if (gAwayTimer.getElapsedTimeF32() > LLAgent::MIN_AFK_TIME
+ && !gDisconnected)
{
gAgent.clearAFK();
}
@@ -1092,7 +1293,7 @@ BOOL LLViewerWindow::handleTranslatedKeyDown(KEY key, MASK mask, BOOL repeated)
// Let the voice chat code check for its PTT key. Note that this never affects event processing.
LLVoiceClient::getInstance()->keyDown(key, mask);
- if (gAwayTimer.getElapsedTimeF32() > MIN_AFK_TIME)
+ if (gAwayTimer.getElapsedTimeF32() > LLAgent::MIN_AFK_TIME)
{
gAgent.clearAFK();
}
@@ -1131,7 +1332,7 @@ BOOL LLViewerWindow::handleActivate(LLWindow *window, BOOL activated)
{
if (activated)
{
- mActive = TRUE;
+ mActive = true;
send_agent_resume();
gAgent.clearAFK();
@@ -1140,8 +1341,9 @@ BOOL LLViewerWindow::handleActivate(LLWindow *window, BOOL activated)
}
else
{
- mActive = FALSE;
+ mActive = false;
+ // if the user has chosen to go Away automatically after some time, then go Away when minimizing
if (gSavedSettings.getS32("AFKTimeout"))
{
gAgent.setAFK();
@@ -1177,8 +1379,9 @@ void LLViewerWindow::handleMenuSelect(LLWindow *window, S32 menu_item)
BOOL LLViewerWindow::handlePaint(LLWindow *window, S32 x, S32 y, S32 width, S32 height)
{
+ // *TODO: Enable similar information output for other platforms? DK 2011-02-18
#if LL_WINDOWS
- if (gNoRender)
+ if (gHeadlessClient)
{
HWND window_handle = (HWND)window->getPlatformWindow();
PAINTSTRUCT ps;
@@ -1208,7 +1411,7 @@ BOOL LLViewerWindow::handlePaint(LLWindow *window, S32 x, S32 y, S32 width, S
len = temp_str.length();
TextOutA(hdc, 0, 25, temp_str.c_str(), len);
- TextOutA(hdc, 0, 50, "Set \"DisableRendering FALSE\" in settings.ini file to reenable", 61);
+ TextOutA(hdc, 0, 50, "Set \"HeadlessClient FALSE\" in settings.ini file to reenable", 61);
EndPaint(window_handle, &ps);
return TRUE;
}
@@ -1242,7 +1445,8 @@ void LLViewerWindow::handleDataCopy(LLWindow *window, S32 data_type, void *data)
std::string url = (const char*)data;
LLMediaCtrl* web = NULL;
const bool trusted_browser = false;
- if (LLURLDispatcher::dispatch(url, web, trusted_browser))
+ // don't treat slapps coming from external browsers as "clicks" as this would bypass throttling
+ if (LLURLDispatcher::dispatch(url, "", web, trusted_browser))
{
// bring window to foreground, as it has just been "launched" from a URL
mWindow->bringToFront();
@@ -1313,17 +1517,13 @@ std::string LLViewerWindow::translateString(const char* tag,
//
// Classes
//
-LLViewerWindow::LLViewerWindow(
- const std::string& title, const std::string& name,
- S32 x, S32 y,
- S32 width, S32 height,
- BOOL fullscreen, BOOL ignore_pixel_depth) // fullscreen is no longer used
- :
- mWindow(NULL),
- mActive(TRUE),
- mWindowRectRaw(0, height, width, 0),
- mWindowRectScaled(0, height, width, 0),
- mWorldViewRectRaw(0, height, width, 0),
+LLViewerWindow::LLViewerWindow(const Params& p)
+: mWindow(NULL),
+ mActive(true),
+ mUIVisible(true),
+ mWindowRectRaw(0, p.height, p.width, 0),
+ mWindowRectScaled(0, p.height, p.width, 0),
+ mWorldViewRectRaw(0, p.height, p.width, 0),
mLeftMouseDown(FALSE),
mMiddleMouseDown(FALSE),
mRightMouseDown(FALSE),
@@ -1336,9 +1536,14 @@ LLViewerWindow::LLViewerWindow(
mResDirty(false),
mStatesDirty(false),
mCurrResolutionIndex(0),
- mViewerWindowListener(new LLViewerWindowListener(this)),
mProgressView(NULL)
{
+ // gKeyboard is still NULL, so it doesn't do LLWindowListener any good to
+ // pass its value right now. Instead, pass it a nullary function that
+ // will, when we later need it, return the value of gKeyboard.
+ // boost::lambda::var() constructs such a functor on the fly.
+ mWindowListener.reset(new LLWindowListener(this, boost::lambda::var(gKeyboard)));
+ mViewerWindowListener.reset(new LLViewerWindowListener(this));
LLNotificationChannel::buildChannel("VW_alerts", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "alert"));
LLNotificationChannel::buildChannel("VW_alertmodal", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "alertmodal"));
@@ -1354,22 +1559,28 @@ LLViewerWindow::LLViewerWindow(
// create window
mWindow = LLWindowManager::createWindow(this,
- title, name, x, y, width, height, 0,
- fullscreen,
- gNoRender,
+ p.title, p.name, p.x, p.y, p.width, p.height, 0,
+ p.fullscreen,
+ gHeadlessClient,
gSavedSettings.getBOOL("DisableVerticalSync"),
- !gNoRender,
- ignore_pixel_depth,
- gSavedSettings.getBOOL("RenderUseFBO") ? 0 : gSavedSettings.getU32("RenderFSAASamples")); //don't use window level anti-aliasing if FBOs are enabled
+ !gHeadlessClient,
+ p.ignore_pixel_depth,
+ gSavedSettings.getBOOL("RenderDeferred") ? 0 : gSavedSettings.getU32("RenderFSAASamples")); //don't use window level anti-aliasing if FBOs are enabled
- if (!LLAppViewer::instance()->restoreErrorTrap())
- {
- LL_WARNS("Window") << " Someone took over my signal/exception handler (post createWindow)!" << LL_ENDL;
+ if (!LLViewerShaderMgr::sInitialized)
+ { //immediately initialize shaders
+ LLViewerShaderMgr::sInitialized = TRUE;
+ LLViewerShaderMgr::instance()->setShaders();
}
-
if (NULL == mWindow)
{
+ LLSplashScreen::update(LLTrans::getString("StartupRequireDriverUpdate"));
+
+ LL_WARNS("Window") << "Failed to create window, to be shutting Down, be sure your graphics driver is updated." << llendl ;
+
+ ms_sleep(5000) ; //wait for 5 seconds.
+
LLSplashScreen::update(LLTrans::getString("ShuttingDown"));
#if LL_LINUX || LL_SOLARIS
llwarns << "Unable to create window, be sure screen is set at 32-bit color and your graphics driver is configured correctly. See README-linux.txt or README-solaris.txt for further information."
@@ -1378,9 +1589,26 @@ LLViewerWindow::LLViewerWindow(
LL_WARNS("Window") << "Unable to create window, be sure screen is set at 32-bit color in Control Panels->Display->Settings"
<< LL_ENDL;
#endif
- LLAppViewer::instance()->forceExit(1);
+ LLAppViewer::instance()->fastQuit(1);
}
+ if (!LLAppViewer::instance()->restoreErrorTrap())
+ {
+ LL_WARNS("Window") << " Someone took over my signal/exception handler (post createWindow)!" << LL_ENDL;
+ }
+
+ const bool do_not_enforce = false;
+ mWindow->setMinSize(p.min_width, p.min_height, do_not_enforce); // root view not set
+ LLCoordScreen scr;
+ mWindow->getSize(&scr);
+
+ if(p.fullscreen && ( scr.mX!=p.width || scr.mY!=p.height))
+ {
+ llwarns << "Fullscreen has forced us in to a different resolution now using "<<scr.mX<<" x "<<scr.mY<<llendl;
+ gSavedSettings.setS32("FullScreenWidth",scr.mX);
+ gSavedSettings.setS32("FullScreenHeight",scr.mY);
+ }
+
// Get the real window rect the window was created with (since there are various OS-dependent reasons why
// the size of a window or fullscreen context may have been adjusted slightly...)
F32 ui_scale_factor = gSavedSettings.getF32("UIScaleFactor");
@@ -1412,11 +1640,13 @@ LLViewerWindow::LLViewerWindow(
{
gSavedSettings.setBOOL("RenderVBOEnable", FALSE);
}
- LLVertexBuffer::initClass(gSavedSettings.getBOOL("RenderVBOEnable"));
+ LLVertexBuffer::initClass(gSavedSettings.getBOOL("RenderVBOEnable"), gSavedSettings.getBOOL("RenderVBOMappingDisable"));
+ LL_INFOS("RenderInit") << "LLVertexBuffer initialization done." << LL_ENDL ;
+ gGL.init() ;
if (LLFeatureManager::getInstance()->isSafe()
|| (gSavedSettings.getS32("LastFeatureVersion") != LLFeatureManager::getInstance()->getVersion())
- || (gSavedSettings.getS32("LastGPUClass") != LLFeatureManager::getInstance()->getGPUClass())
+ || (gSavedSettings.getString("LastGPUString") != LLFeatureManager::getInstance()->getGPUString())
|| (gSavedSettings.getBOOL("ProbeHardwareOnStartup")))
{
LLFeatureManager::getInstance()->applyRecommendedSettings();
@@ -1481,32 +1711,30 @@ LLViewerWindow::LLViewerWindow(
void LLViewerWindow::initGLDefaults()
{
gGL.setSceneBlendType(LLRender::BT_ALPHA);
- glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE );
- F32 ambient[4] = {0.f,0.f,0.f,0.f };
- F32 diffuse[4] = {1.f,1.f,1.f,1.f };
- glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,ambient);
- glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,diffuse);
-
- glPixelStorei(GL_PACK_ALIGNMENT,1);
- glPixelStorei(GL_UNPACK_ALIGNMENT,1);
+ if (!LLGLSLShader::sNoFixedFunction)
+ { //initialize fixed function state
+ glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE );
- gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);
+ glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,LLColor4::black.mV);
+ glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,LLColor4::white.mV);
- // lights for objects
- glShadeModel( GL_SMOOTH );
+ // lights for objects
+ glShadeModel( GL_SMOOTH );
- glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient);
-
- gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
+ gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);
+ gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
+ }
+ glPixelStorei(GL_PACK_ALIGNMENT,1);
+ glPixelStorei(GL_UNPACK_ALIGNMENT,1);
+
+ gGL.setAmbientLightColor(LLColor4::black);
+
glCullFace(GL_BACK);
// RN: Need this for translation and stretch manip.
- gCone.prerender();
gBox.prerender();
- gSphere.prerender();
- gCylinder.prerender();
}
struct MainPanel : public LLPanel
@@ -1543,13 +1771,22 @@ void LLViewerWindow::initBase()
// placeholder widget that controls where "world" is rendered
mWorldViewPlaceholder = main_view->getChildView("world_view_rect")->getHandle();
- mNonSideTrayView = main_view->getChildView("non_side_tray_view")->getHandle();
- mFloaterViewHolder = main_view->getChildView("floater_view_holder")->getHandle();
- mPopupView = main_view->findChild<LLPopupView>("popup_holder");
+ mPopupView = main_view->getChild<LLPopupView>("popup_holder");
mHintHolder = main_view->getChild<LLView>("hint_holder")->getHandle();
+ mLoginPanelHolder = main_view->getChild<LLView>("login_panel_holder")->getHandle();
+
+ // Create the toolbar view
+ // Get a pointer to the toolbar view holder
+ LLPanel* panel_holder = main_view->getChild<LLPanel>("toolbar_view_holder");
+ // Load the toolbar view from file
+ gToolBarView = LLUICtrlFactory::getInstance()->createFromFile<LLToolBarView>("panel_toolbar_view.xml", panel_holder, LLDefaultChildRegistry::instance());
+ gToolBarView->setShape(panel_holder->getLocalRect());
+ // Hide the toolbars for the moment: we'll make them visible after logging in world (see LLViewerWindow::initWorldUI())
+ gToolBarView->setVisible(FALSE);
// Constrain floaters to inside the menu and status bar regions.
gFloaterView = main_view->getChild<LLFloaterView>("Floater View");
+ gFloaterView->setFloaterSnapView(main_view->getChild<LLView>("floater_snap_region")->getHandle());
gSnapshotFloaterView = main_view->getChild<LLSnapshotFloaterView>("Snapshot Floater View");
@@ -1606,13 +1843,12 @@ void LLViewerWindow::initWorldUI()
//getRootView()->sendChildToFront(gFloaterView);
//getRootView()->sendChildToFront(gSnapshotFloaterView);
- // new bottom panel
- LLPanel* bottom_tray_container = getRootView()->getChild<LLPanel>("bottom_tray_container");
- LLBottomTray* bottom_tray = LLBottomTray::getInstance();
- bottom_tray->setShape(bottom_tray_container->getLocalRect());
- bottom_tray->setFollowsAll();
- bottom_tray_container->addChild(bottom_tray);
- bottom_tray_container->setVisible(TRUE);
+ LLPanel* chiclet_container = getRootView()->getChild<LLPanel>("chiclet_container");
+ LLChicletBar* chiclet_bar = LLChicletBar::getInstance();
+ chiclet_bar->setShape(chiclet_container->getLocalRect());
+ chiclet_bar->setFollowsAll();
+ chiclet_container->addChild(chiclet_bar);
+ chiclet_container->setVisible(TRUE);
LLRect morph_view_rect = full_window;
morph_view_rect.stretch( -STATUS_BAR_HEIGHT );
@@ -1640,7 +1876,7 @@ void LLViewerWindow::initWorldUI()
gStatusBar->setShape(status_bar_container->getLocalRect());
// sync bg color with menu bar
gStatusBar->setBackgroundColor( gMenuBarView->getBackgroundColor().get() );
- status_bar_container->addChild(gStatusBar);
+ status_bar_container->addChildInBack(gStatusBar);
status_bar_container->setVisible(TRUE);
// Navigation bar
@@ -1654,12 +1890,7 @@ void LLViewerWindow::initWorldUI()
if (!gSavedSettings.getBOOL("ShowNavbarNavigationPanel"))
{
- navbar->showNavigationPanel(FALSE);
- }
-
- if (!gSavedSettings.getBOOL("ShowNavbarFavoritesPanel"))
- {
- navbar->showFavoritesPanel(FALSE);
+ navbar->setVisible(FALSE);
}
// Top Info bar
@@ -1680,13 +1911,12 @@ void LLViewerWindow::initWorldUI()
{
LLRect hud_rect = full_window;
hud_rect.mBottom += 50;
- if (gMenuBarView)
+ if (gMenuBarView && gMenuBarView->isInVisibleChain())
{
hud_rect.mTop -= gMenuBarView->getRect().getHeight();
}
gHUDView = new LLHUDView(hud_rect);
- // put behind everything else in the UI
- getRootView()->addChildInBack(gHUDView);
+ getRootView()->addChild(gHUDView);
}
LLPanel* panel_ssf_container = getRootView()->getChild<LLPanel>("stand_stop_flying_container");
@@ -1694,21 +1924,30 @@ void LLViewerWindow::initWorldUI()
panel_ssf_container->addChild(panel_stand_stop_flying);
panel_ssf_container->setVisible(TRUE);
- // put sidetray in container
- LLPanel* side_tray_container = getRootView()->getChild<LLPanel>("side_tray_container");
- LLSideTray* sidetrayp = LLSideTray::getInstance();
- sidetrayp->setShape(side_tray_container->getLocalRect());
- // don't follow right edge to avoid spurious resizes, since we are using a fixed width layout
- sidetrayp->setFollows(FOLLOWS_LEFT|FOLLOWS_TOP|FOLLOWS_BOTTOM);
- side_tray_container->addChild(sidetrayp);
- side_tray_container->setVisible(FALSE);
-
- // put sidetray buttons in their own panel
- LLPanel* buttons_panel = sidetrayp->getButtonsPanel();
- LLPanel* buttons_panel_container = getRootView()->getChild<LLPanel>("side_bar_tabs");
- buttons_panel->setShape(buttons_panel_container->getLocalRect());
- buttons_panel->setFollowsAll();
- buttons_panel_container->addChild(buttons_panel);
+ // Load and make the toolbars visible
+ // Note: we need to load the toolbars only *after* the user is logged in and IW
+ if (gToolBarView)
+ {
+ gToolBarView->loadToolbars();
+ gToolBarView->setVisible(TRUE);
+ }
+
+ LLMediaCtrl* destinations = LLFloaterReg::getInstance("destinations")->getChild<LLMediaCtrl>("destination_guide_contents");
+ if (destinations)
+ {
+ destinations->setErrorPageURL(gSavedSettings.getString("GenericErrorPageURL"));
+ std::string url = gSavedSettings.getString("DestinationGuideURL");
+ url = LLWeb::expandURLSubstitutions(url, LLSD());
+ destinations->navigateTo(url, "text/html");
+ }
+ LLMediaCtrl* avatar_picker = LLFloaterReg::getInstance("avatar")->findChild<LLMediaCtrl>("avatar_picker_contents");
+ if (avatar_picker)
+ {
+ avatar_picker->setErrorPageURL(gSavedSettings.getString("GenericErrorPageURL"));
+ std::string url = gSavedSettings.getString("AvatarPickerURL");
+ url = LLWeb::expandURLSubstitutions(url, LLSD());
+ avatar_picker->navigateTo(url, "text/html");
+ }
}
// Destroy the UI
@@ -1717,36 +1956,49 @@ void LLViewerWindow::shutdownViews()
// clean up warning logger
LLError::removeRecorder(RecordToChatConsole::getInstance());
+ llinfos << "Warning logger is cleaned." << llendl ;
+
delete mDebugText;
mDebugText = NULL;
+ llinfos << "DebugText deleted." << llendl ;
+
// Cleanup global views
if (gMorphView)
{
gMorphView->setVisible(FALSE);
}
-
+ llinfos << "Global views cleaned." << llendl ;
+
// DEV-40930: Clear sModalStack. Otherwise, any LLModalDialog left open
// will crump with LL_ERRS.
LLModalDialog::shutdownModals();
-
+ llinfos << "LLModalDialog shut down." << llendl;
+
// destroy the nav bar, not currently part of gViewerWindow
// *TODO: Make LLNavigationBar part of gViewerWindow
- delete LLNavigationBar::getInstance();
-
+ if (LLNavigationBar::instanceExists())
+ {
+ delete LLNavigationBar::getInstance();
+ }
+ llinfos << "LLNavigationBar destroyed." << llendl ;
+
// destroy menus after instantiating navbar above, as it needs
// access to gMenuHolder
cleanup_menus();
-
+ llinfos << "menus destroyed." << llendl ;
+
// Delete all child views.
delete mRootView;
mRootView = NULL;
-
+ llinfos << "RootView deleted." << llendl ;
+
// Automatically deleted as children of mRootView. Fix the globals.
gStatusBar = NULL;
gIMMgr = NULL;
gToolTipView = NULL;
+ gToolBarView = NULL;
gFloaterView = NULL;
gMorphView = NULL;
@@ -1765,6 +2017,12 @@ void LLViewerWindow::shutdownGL()
gSky.cleanup();
stop_glerror();
+ llinfos << "Cleaning up pipeline" << llendl;
+ gPipeline.cleanup();
+ stop_glerror();
+
+ //MUST clean up pipeline before cleaning up wearables
+ llinfos << "Cleaning up wearables" << llendl;
LLWearableList::instance().cleanup() ;
gTextureList.shutdown();
@@ -1775,28 +2033,23 @@ void LLViewerWindow::shutdownGL()
LLWorldMapView::cleanupTextures();
- llinfos << "Cleaning up pipeline" << llendl;
- gPipeline.cleanup();
- stop_glerror();
-
LLViewerTextureManager::cleanup() ;
LLImageGL::cleanupClass() ;
llinfos << "All textures and llimagegl images are destroyed!" << llendl ;
llinfos << "Cleaning up select manager" << llendl;
- LLSelectMgr::getInstance()->cleanup();
-
- LLVertexBuffer::cleanupClass();
+ LLSelectMgr::getInstance()->cleanup();
llinfos << "Stopping GL during shutdown" << llendl;
- if (!gNoRender)
- {
- stopGL(FALSE);
- stop_glerror();
- }
+ stopGL(FALSE);
+ stop_glerror();
gGL.shutdown();
+
+ LLVertexBuffer::cleanupClass();
+
+ llinfos << "LLVertexBuffer cleaned." << llendl ;
}
// shutdownViews() and shutdownGL() need to be called first
@@ -1858,11 +2111,6 @@ void LLViewerWindow::reshape(S32 width, S32 height)
// may have been destructed.
if (!LLApp::isExiting())
{
- if (gNoRender)
- {
- return;
- }
-
gWindowResized = TRUE;
// update our window rectangle
@@ -1903,20 +2151,29 @@ void LLViewerWindow::reshape(S32 width, S32 height)
sendShapeToSim();
// store new settings for the mode we are in, regardless
- // Only save size if not maximized
BOOL maximized = mWindow->getMaximized();
gSavedSettings.setBOOL("WindowMaximized", maximized);
- LLCoordScreen window_size;
- if (!maximized
- && mWindow->getSize(&window_size))
+ if (!maximized)
{
- gSavedSettings.setS32("WindowWidth", window_size.mX);
- gSavedSettings.setS32("WindowHeight", window_size.mY);
+ U32 min_window_width=gSavedSettings.getU32("MinWindowWidth");
+ U32 min_window_height=gSavedSettings.getU32("MinWindowHeight");
+ // tell the OS specific window code about min window size
+ mWindow->setMinSize(min_window_width, min_window_height);
+
+ LLCoordScreen window_rect;
+ if (mWindow->getSize(&window_rect))
+ {
+ // Only save size if not maximized
+ gSavedSettings.setU32("WindowWidth", window_rect.mX);
+ gSavedSettings.setU32("WindowHeight", window_rect.mY);
+ }
}
LLViewerStats::getInstance()->setStat(LLViewerStats::ST_WINDOW_WIDTH, (F64)width);
LLViewerStats::getInstance()->setStat(LLViewerStats::ST_WINDOW_HEIGHT, (F64)height);
+
+ LLLayoutStack::updateClass();
}
}
@@ -1924,10 +2181,10 @@ void LLViewerWindow::reshape(S32 width, S32 height)
// Hide normal UI when a logon fails
void LLViewerWindow::setNormalControlsVisible( BOOL visible )
{
- if(LLBottomTray::instanceExists())
+ if(LLChicletBar::instanceExists())
{
- LLBottomTray::getInstance()->setVisible(visible);
- LLBottomTray::getInstance()->setEnabled(visible);
+ LLChicletBar::getInstance()->setVisible(visible);
+ LLChicletBar::getInstance()->setEnabled(visible);
}
if ( gMenuBarView )
@@ -1949,7 +2206,9 @@ void LLViewerWindow::setNormalControlsVisible( BOOL visible )
LLNavigationBar* navbarp = LLUI::getRootView()->findChild<LLNavigationBar>("navigation_bar");
if (navbarp)
{
- navbarp->setVisible( visible );
+ // when it's time to show navigation bar we need to ensure that the user wants to see it
+ // i.e. ShowNavbarNavigationPanel option is true
+ navbarp->setVisible( visible && gSavedSettings.getBOOL("ShowNavbarNavigationPanel") );
}
}
@@ -2000,6 +2259,10 @@ void LLViewerWindow::drawDebugText()
gGL.color4f(1,1,1,1);
gGL.pushMatrix();
gGL.pushUIMatrix();
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gUIProgram.bind();
+ }
{
// scale view by UI global scale factor and aspect ratio correction factor
gGL.scaleUI(mDisplayScale.mV[VX], mDisplayScale.mV[VY], 1.f);
@@ -2009,6 +2272,10 @@ void LLViewerWindow::drawDebugText()
gGL.popMatrix();
gGL.flush();
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gUIProgram.unbind();
+ }
}
void LLViewerWindow::draw()
@@ -2023,9 +2290,9 @@ void LLViewerWindow::draw()
LLUI::setLineWidth(1.f);
// Reset any left-over transforms
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
- glLoadIdentity();
+ gGL.loadIdentity();
//S32 screen_x, screen_y;
@@ -2040,7 +2307,7 @@ void LLViewerWindow::draw()
// draw timecode block
std::string text;
- glLoadIdentity();
+ gGL.loadIdentity();
microsecondsToTimecodeString(gFrameTime,text);
const LLFontGL* font = LLFontGL::getFontSansSerif();
@@ -2054,6 +2321,11 @@ void LLViewerWindow::draw()
// Draw all nested UI views.
// No translation needed, this view is glued to 0,0
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gUIProgram.bind();
+ }
+
gGL.pushMatrix();
LLUI::pushMatrix();
{
@@ -2071,10 +2343,10 @@ void LLViewerWindow::draw()
int pos_y = sub_region / llceil(zoom_factor);
int pos_x = sub_region - (pos_y*llceil(zoom_factor));
// offset for this tile
- glTranslatef((F32)getWindowWidthScaled() * -(F32)pos_x,
+ gGL.translatef((F32)getWindowWidthScaled() * -(F32)pos_x,
(F32)getWindowHeightScaled() * -(F32)pos_y,
0.f);
- glScalef(zoom_factor, zoom_factor, 1.f);
+ gGL.scalef(zoom_factor, zoom_factor, 1.f);
LLUI::sGLScaleFactor *= zoom_factor;
}
@@ -2103,9 +2375,9 @@ void LLViewerWindow::draw()
S32 screen_x, screen_y;
top_ctrl->localPointToScreen(0, 0, &screen_x, &screen_y);
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
LLUI::pushMatrix();
- LLUI::translate( (F32) screen_x, (F32) screen_y, 0.f);
+ LLUI::translate( (F32) screen_x, (F32) screen_y);
top_ctrl->draw();
LLUI::popMatrix();
}
@@ -2128,6 +2400,11 @@ void LLViewerWindow::draw()
LLUI::popMatrix();
gGL.popMatrix();
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gUIProgram.unbind();
+ }
+
//#if LL_DEBUG
LLView::sIsDrawing = FALSE;
//#endif
@@ -2210,7 +2487,12 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask)
// Traverses up the hierarchy
if( keyboard_focus )
{
- LLLineEditor* chat_editor = LLBottomTray::instanceExists() ? LLBottomTray::getInstance()->getNearbyChatBar()->getChatBox() : NULL;
+ LLNearbyChatBar* nearby_chat = LLFloaterReg::findTypedInstance<LLNearbyChatBar>("chat_bar");
+
+ if (nearby_chat)
+ {
+ LLLineEditor* chat_editor = nearby_chat->getChatBox();
+
// arrow keys move avatar while chatting hack
if (chat_editor && chat_editor->hasFocus())
{
@@ -2241,7 +2523,7 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask)
}
}
}
-
+ }
if (keyboard_focus->handleKey(key, mask, FALSE))
{
return TRUE;
@@ -2272,11 +2554,11 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask)
if ( gSavedSettings.getS32("LetterKeysFocusChatBar") && !gAgentCamera.cameraMouselook() &&
!keyboard_focus && key < 0x80 && (mask == MASK_NONE || mask == MASK_SHIFT) )
{
- LLLineEditor* chat_editor = LLBottomTray::instanceExists() ? LLBottomTray::getInstance()->getNearbyChatBar()->getChatBox() : NULL;
+ LLLineEditor* chat_editor = LLFloaterReg::getTypedInstance<LLNearbyChatBar>("chat_bar")->getChatBox();
if (chat_editor)
{
// passing NULL here, character will be added later when it is handled by character handler.
- LLBottomTray::getInstance()->getNearbyChatBar()->startChat(NULL);
+ LLNearbyChatBar::getInstance()->startChat(NULL);
return TRUE;
}
}
@@ -2499,12 +2781,8 @@ void LLViewerWindow::updateUI()
S32 x = mCurrentMousePoint.mX;
S32 y = mCurrentMousePoint.mY;
- MASK mask = gKeyboard->currentMask(TRUE);
- if (gNoRender)
- {
- return;
- }
+ MASK mask = gKeyboard->currentMask(TRUE);
if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_RAYCAST))
{
@@ -2514,7 +2792,9 @@ void LLViewerWindow::updateUI()
&gDebugRaycastIntersection,
&gDebugRaycastTexCoord,
&gDebugRaycastNormal,
- &gDebugRaycastBinormal);
+ &gDebugRaycastBinormal,
+ &gDebugRaycastStart,
+ &gDebugRaycastEnd);
}
updateMouseDelta();
@@ -2895,7 +3175,8 @@ void LLViewerWindow::updateLayout()
}
// Update the location of the blue box tool popup
LLCoordGL select_center_screen;
- gFloaterTools->updatePopup( select_center_screen, gKeyboard->currentMask(TRUE) );
+ MASK mask = gKeyboard->currentMask(TRUE);
+ gFloaterTools->updatePopup( select_center_screen, mask );
}
else
{
@@ -2975,18 +3256,20 @@ void LLViewerWindow::updateKeyboardFocus()
LLUICtrl* parent = cur_focus->getParentUICtrl();
const LLUICtrl* focus_root = cur_focus->findRootMostFocusRoot();
+ bool new_focus_found = false;
while(parent)
{
- if (parent->isCtrl() &&
- (parent->hasTabStop() || parent == focus_root) &&
- !parent->getIsChrome() &&
- parent->isInVisibleChain() &&
- parent->isInEnabledChain())
+ if (parent->isCtrl()
+ && (parent->hasTabStop() || parent == focus_root)
+ && !parent->getIsChrome()
+ && parent->isInVisibleChain()
+ && parent->isInEnabledChain())
{
if (!parent->focusFirstItem())
{
parent->setFocus(TRUE);
}
+ new_focus_found = true;
break;
}
parent = parent->getParentUICtrl();
@@ -2995,7 +3278,7 @@ void LLViewerWindow::updateKeyboardFocus()
// if we didn't find a better place to put focus, just release it
// hasFocus() will return true if and only if we didn't touch focus since we
// are only moving focus higher in the hierarchy
- if (cur_focus->hasFocus())
+ if (!new_focus_found)
{
cur_focus->setFocus(FALSE);
}
@@ -3019,7 +3302,8 @@ void LLViewerWindow::updateKeyboardFocus()
// sync all floaters with their focus state
gFloaterView->highlightFocusedFloater();
gSnapshotFloaterView->highlightFocusedFloater();
- if ((gKeyboard->currentMask(TRUE) & MASK_CONTROL) == 0)
+ MASK mask = gKeyboard->currentMask(TRUE);
+ if ((mask & MASK_CONTROL) == 0)
{
// control key no longer held down, finish cycle mode
gFloaterView->setCycleMode(FALSE);
@@ -3039,9 +3323,6 @@ void LLViewerWindow::updateKeyboardFocus()
// make sure floater visible order is in sync with tab order
gFloaterView->syncFloaterTabOrder();
}
-
- if(LLSideTray::instanceCreated())//just getInstance will create sidetray. we don't want this
- LLSideTray::getInstance()->highlightFocused();
}
static LLFastTimer::DeclareTimer FTM_UPDATE_WORLD_VIEW("Update World View");
@@ -3065,12 +3346,6 @@ void LLViewerWindow::updateWorldViewRect(bool use_full_window)
new_world_rect.mTop = llround((F32)new_world_rect.mTop * mDisplayScale.mV[VY]);
}
- if (gSavedSettings.getBOOL("SidebarCameraMovement") == FALSE)
- {
- // use right edge of window, ignoring sidebar
- new_world_rect.mRight = mWindowRectRaw.mRight;
- }
-
if (mWorldViewRectRaw != new_world_rect)
{
mWorldViewRectRaw = new_world_rect;
@@ -3154,17 +3429,17 @@ void LLViewerWindow::renderSelections( BOOL for_gl_pick, BOOL pick_parcel_walls,
LLBBox hud_bbox = gAgentAvatarp->getHUDBBox();
// set up transform to encompass bounding box of HUD
- glMatrixMode(GL_PROJECTION);
- glPushMatrix();
- glLoadIdentity();
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.pushMatrix();
+ gGL.loadIdentity();
F32 depth = llmax(1.f, hud_bbox.getExtentLocal().mV[VX] * 1.1f);
- glOrtho(-0.5f * LLViewerCamera::getInstance()->getAspect(), 0.5f * LLViewerCamera::getInstance()->getAspect(), -0.5f, 0.5f, 0.f, depth);
+ gGL.ortho(-0.5f * LLViewerCamera::getInstance()->getAspect(), 0.5f * LLViewerCamera::getInstance()->getAspect(), -0.5f, 0.5f, 0.f, depth);
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
- glLoadIdentity();
- glLoadMatrixf(OGL_TO_CFR_ROTATION); // Load Cory's favorite reference frame
- glTranslatef(-hud_bbox.getCenterLocal().mV[VX] + (depth *0.5f), 0.f, 0.f);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.pushMatrix();
+ gGL.loadIdentity();
+ gGL.loadMatrix(OGL_TO_CFR_ROTATION); // Load Cory's favorite reference frame
+ gGL.translatef(-hud_bbox.getCenterLocal().mV[VX] + (depth *0.5f), 0.f, 0.f);
}
// Render light for editing
@@ -3174,12 +3449,12 @@ void LLViewerWindow::renderSelections( BOOL for_gl_pick, BOOL pick_parcel_walls,
LLGLEnable gls_blend(GL_BLEND);
LLGLEnable gls_cull(GL_CULL_FACE);
LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE);
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.pushMatrix();
if (selection->getSelectType() == SELECT_TYPE_HUD)
{
F32 zoom = gAgentCamera.mHUDCurZoom;
- glScalef(zoom, zoom, zoom);
+ gGL.scalef(zoom, zoom, zoom);
}
struct f : public LLSelectedObjectFunctor
@@ -3190,33 +3465,33 @@ void LLViewerWindow::renderSelections( BOOL for_gl_pick, BOOL pick_parcel_walls,
if (drawable && drawable->isLight())
{
LLVOVolume* vovolume = drawable->getVOVolume();
- glPushMatrix();
+ gGL.pushMatrix();
LLVector3 center = drawable->getPositionAgent();
- glTranslatef(center[0], center[1], center[2]);
+ gGL.translatef(center[0], center[1], center[2]);
F32 scale = vovolume->getLightRadius();
- glScalef(scale, scale, scale);
+ gGL.scalef(scale, scale, scale);
LLColor4 color(vovolume->getLightColor(), .5f);
- glColor4fv(color.mV);
+ gGL.color4fv(color.mV);
- F32 pixel_area = 100000.f;
+ //F32 pixel_area = 100000.f;
// Render Outside
- gSphere.render(pixel_area);
+ gSphere.render();
// Render Inside
glCullFace(GL_FRONT);
- gSphere.render(pixel_area);
+ gSphere.render();
glCullFace(GL_BACK);
- glPopMatrix();
+ gGL.popMatrix();
}
return true;
}
} func;
LLSelectMgr::getInstance()->getSelection()->applyToObjects(&func);
- glPopMatrix();
+ gGL.popMatrix();
}
// NOTE: The average position for the axis arrows of the selected objects should
@@ -3279,11 +3554,11 @@ void LLViewerWindow::renderSelections( BOOL for_gl_pick, BOOL pick_parcel_walls,
}
if (selection->getSelectType() == SELECT_TYPE_HUD && selection->getObjectCount())
{
- glMatrixMode(GL_PROJECTION);
- glPopMatrix();
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.popMatrix();
- glMatrixMode(GL_MODELVIEW);
- glPopMatrix();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.popMatrix();
stop_glerror();
}
}
@@ -3332,11 +3607,6 @@ BOOL LLViewerWindow::clickPointOnSurfaceGlobal(const S32 x, const S32 y, LLViewe
void LLViewerWindow::pickAsync(S32 x, S32 y_from_bot, MASK mask, void (*callback)(const LLPickInfo& info), BOOL pick_transparent)
{
- if (gNoRender)
- {
- return;
- }
-
BOOL in_build_mode = LLFloaterReg::instanceVisible("build");
if (in_build_mode || LLDrawPoolAlpha::sShowDebugAlpha)
{
@@ -3372,11 +3642,6 @@ void LLViewerWindow::schedulePick(LLPickInfo& pick_info)
void LLViewerWindow::performPick()
{
- if (gNoRender)
- {
- return;
- }
-
if (!mPicks.empty())
{
std::vector<LLPickInfo>::iterator pick_it;
@@ -3408,11 +3673,6 @@ void LLViewerWindow::returnEmptyPicks()
// Performs the GL object/land pick.
LLPickInfo LLViewerWindow::pickImmediate(S32 x, S32 y_from_bot, BOOL pick_transparent)
{
- if (gNoRender)
- {
- return LLPickInfo();
- }
-
BOOL in_build_mode = LLFloaterReg::instanceVisible("build");
if (in_build_mode || LLDrawPoolAlpha::sShowDebugAlpha)
{
@@ -3422,7 +3682,8 @@ LLPickInfo LLViewerWindow::pickImmediate(S32 x, S32 y_from_bot, BOOL pick_trans
}
// shortcut queueing in mPicks and just update mLastPick in place
- mLastPick = LLPickInfo(LLCoordGL(x, y_from_bot), gKeyboard->currentMask(TRUE), pick_transparent, TRUE, NULL);
+ MASK key_mask = gKeyboard->currentMask(TRUE);
+ mLastPick = LLPickInfo(LLCoordGL(x, y_from_bot), key_mask, pick_transparent, TRUE, NULL);
mLastPick.fetchResults();
return mLastPick;
@@ -3459,7 +3720,9 @@ LLViewerObject* LLViewerWindow::cursorIntersect(S32 mouse_x, S32 mouse_y, F32 de
LLVector3 *intersection,
LLVector2 *uv,
LLVector3 *normal,
- LLVector3 *binormal)
+ LLVector3 *binormal,
+ LLVector3* start,
+ LLVector3* end)
{
S32 x = mouse_x;
S32 y = mouse_y;
@@ -3491,7 +3754,22 @@ LLViewerObject* LLViewerWindow::cursorIntersect(S32 mouse_x, S32 mouse_y, F32 de
LLVector3 mouse_world_start = mouse_point_global;
LLVector3 mouse_world_end = mouse_point_global + mouse_direction_global * depth;
-
+ if (!LLViewerJoystick::getInstance()->getOverrideCamera())
+ { //always set raycast intersection to mouse_world_end unless
+ //flycam is on (for DoF effect)
+ gDebugRaycastIntersection = mouse_world_end;
+ }
+
+ if (start)
+ {
+ *start = mouse_world_start;
+ }
+
+ if (end)
+ {
+ *end = mouse_world_end;
+ }
+
LLViewerObject* found = NULL;
if (this_object) // check only this object
@@ -3503,8 +3781,7 @@ LLViewerObject* LLViewerWindow::cursorIntersect(S32 mouse_x, S32 mouse_y, F32 de
{
found = this_object;
}
- }
-
+ }
else // is a world object
{
if (this_object->lineSegmentIntersect(mouse_world_start, mouse_world_end, this_face, pick_transparent,
@@ -3512,21 +3789,22 @@ LLViewerObject* LLViewerWindow::cursorIntersect(S32 mouse_x, S32 mouse_y, F32 de
{
found = this_object;
}
- }
- }
-
+ }
+ }
else // check ALL objects
- {
+ {
found = gPipeline.lineSegmentIntersectInHUD(mouse_hud_start, mouse_hud_end, pick_transparent,
face_hit, intersection, uv, normal, binormal);
if (!found) // if not found in HUD, look in world:
-
- {
+ {
found = gPipeline.lineSegmentIntersectInWorld(mouse_world_start, mouse_world_end, pick_transparent,
face_hit, intersection, uv, normal, binormal);
+ if (found && !pick_transparent)
+ {
+ gDebugRaycastIntersection = *intersection;
}
-
+ }
}
return found;
@@ -3747,10 +4025,11 @@ BOOL LLViewerWindow::mousePointOnLandGlobal(const S32 x, const S32 y, LLVector3d
}
// Saves an image to the harddrive as "SnapshotX" where X >= 1.
-BOOL LLViewerWindow::saveImageNumbered(LLImageFormatted *image)
+BOOL LLViewerWindow::saveImageNumbered(LLImageFormatted *image, bool force_picker)
{
if (!image)
{
+ llwarns << "No image to save" << llendl;
return FALSE;
}
@@ -3770,7 +4049,7 @@ BOOL LLViewerWindow::saveImageNumbered(LLImageFormatted *image)
pick_type = LLFilePicker::FFSAVE_ALL; // ???
// Get a base file location if needed.
- if ( ! isSnapshotLocSet())
+ if (force_picker || !isSnapshotLocSet())
{
std::string proposed_name( sSnapshotBaseName );
@@ -3810,6 +4089,7 @@ BOOL LLViewerWindow::saveImageNumbered(LLImageFormatted *image)
}
while( -1 != err ); // search until the file is not found (i.e., stat() gives an error).
+ llinfos << "Saving snapshot to " << filepath << llendl;
return image->save(filepath);
}
@@ -3818,25 +4098,15 @@ void LLViewerWindow::resetSnapshotLoc()
sSnapshotDir.clear();
}
-static S32 BORDERHEIGHT = 0;
-static S32 BORDERWIDTH = 0;
-
// static
void LLViewerWindow::movieSize(S32 new_width, S32 new_height)
{
- LLCoordScreen size;
- gViewerWindow->mWindow->getSize(&size);
- if ( (size.mX != new_width + BORDERWIDTH)
- ||(size.mY != new_height + BORDERHEIGHT))
+ LLCoordWindow size;
+ LLCoordWindow new_size(new_width, new_height);
+ gViewerWindow->getWindow()->getSize(&size);
+ if ( size != new_size )
{
- // use actual display dimensions, not virtual UI dimensions
- S32 x = gViewerWindow->getWindowWidthRaw();
- S32 y = gViewerWindow->getWindowHeightRaw();
- BORDERWIDTH = size.mX - x;
- BORDERHEIGHT = size.mY- y;
- LLCoordScreen new_size(new_width + BORDERWIDTH,
- new_height + BORDERHEIGHT);
- gViewerWindow->mWindow->setSize(new_size);
+ gViewerWindow->getWindow()->setSize(new_size);
}
}
@@ -3884,7 +4154,9 @@ BOOL LLViewerWindow::thumbnailSnapshot(LLImageRaw *raw, S32 preview_width, S32 p
return rawSnapshot(raw, preview_width, preview_height, FALSE, FALSE, show_ui, do_rebuild, type);
}
-// Saves the image from the screen to the specified filename and path.
+// Saves the image from the screen to a raw image
+// Since the required size might be bigger than the available screen, this method rerenders the scene in parts (called subimages) and copy
+// the results over to the final raw image.
BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_height,
BOOL keep_window_aspect, BOOL is_texture, BOOL show_ui, BOOL do_rebuild, ESnapshotType type, S32 max_size)
{
@@ -3892,6 +4164,19 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
{
return FALSE;
}
+ //check if there is enough memory for the snapshot image
+ if(LLPipeline::sMemAllocationThrottled)
+ {
+ return FALSE ; //snapshot taking is disabled due to memory restriction.
+ }
+ if(image_width * image_height > (1 << 22)) //if snapshot image is larger than 2K by 2K
+ {
+ if(!LLMemory::tryToAlloc(NULL, image_width * image_height * 3))
+ {
+ llwarns << "No enough memory to take the snapshot with size (w : h): " << image_width << " : " << image_height << llendl ;
+ return FALSE ; //there is no enough memory for taking this snapshot.
+ }
+ }
// PRE SNAPSHOT
gDisplaySwapBuffers = FALSE;
@@ -3902,8 +4187,6 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
// Hide all the UI widgets first and draw a frame
BOOL prev_draw_ui = gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI) ? TRUE : FALSE;
- show_ui = show_ui ? TRUE : FALSE;
-
if ( prev_draw_ui != show_ui)
{
LLPipeline::toggleRenderDebugFeature((void*)LLPipeline::RENDER_DEBUG_FEATURE_UI);
@@ -3915,95 +4198,78 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
LLPipeline::sShowHUDAttachments = FALSE;
}
+ // if not showing ui, use full window to render world view
+ updateWorldViewRect(!show_ui);
+
// Copy screen to a buffer
// crop sides or top and bottom, if taking a snapshot of different aspect ratio
// from window
- S32 snapshot_width = mWindowRectRaw.getWidth();
- S32 snapshot_height = mWindowRectRaw.getHeight();
+ LLRect window_rect = show_ui ? getWindowRectRaw() : getWorldViewRectRaw();
+
+ S32 snapshot_width = window_rect.getWidth();
+ S32 snapshot_height = window_rect.getHeight();
// SNAPSHOT
- S32 window_width = mWindowRectRaw.getWidth();
- S32 window_height = mWindowRectRaw.getHeight();
- LLRect window_rect = mWindowRectRaw;
- BOOL use_fbo = FALSE;
+ S32 window_width = snapshot_width;
+ S32 window_height = snapshot_height;
+
+ // Note: Scaling of the UI is currently *not* supported so we limit the output size if UI is requested
+ if (show_ui)
+ {
+ // If the user wants the UI, limit the output size to the available screen size
+ image_width = llmin(image_width, window_width);
+ image_height = llmin(image_height, window_height);
+ }
- LLRenderTarget target;
F32 scale_factor = 1.0f ;
- if(!keep_window_aspect) //image cropping
- {
+ if (!keep_window_aspect || (image_width > window_width) || (image_height > window_height))
+ {
+ // if image cropping or need to enlarge the scene, compute a scale_factor
F32 ratio = llmin( (F32)window_width / image_width , (F32)window_height / image_height) ;
- snapshot_width = (S32)(ratio * image_width) ;
+ snapshot_width = (S32)(ratio * image_width) ;
snapshot_height = (S32)(ratio * image_height) ;
scale_factor = llmax(1.0f, 1.0f / ratio) ;
}
- else //the scene(window) proportion needs to be maintained.
+
+ if (show_ui && scale_factor > 1.f)
{
- if(image_width > window_width || image_height > window_height) //need to enlarge the scene
- {
- if (!LLPipeline::sRenderDeferred && gGLManager.mHasFramebufferObject && !show_ui)
- {
- GLint max_size = 0;
- glGetIntegerv(GL_MAX_RENDERBUFFER_SIZE_EXT, &max_size);
-
- if (image_width <= max_size && image_height <= max_size) //re-project the scene
- {
- use_fbo = TRUE;
-
- snapshot_width = image_width;
- snapshot_height = image_height;
- target.allocate(snapshot_width, snapshot_height, GL_RGBA, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, TRUE);
- window_width = snapshot_width;
- window_height = snapshot_height;
- scale_factor = 1.f;
- mWindowRectRaw.set(0, snapshot_height, snapshot_width, 0);
- target.bindTarget();
- }
- }
-
- if(!use_fbo) //no re-projection, so tiling the scene
- {
- F32 ratio = llmin( (F32)window_width / image_width , (F32)window_height / image_height) ;
- snapshot_width = (S32)(ratio * image_width) ;
- snapshot_height = (S32)(ratio * image_height) ;
- scale_factor = llmax(1.0f, 1.0f / ratio) ;
- }
- }
- //else: keep the current scene scale, re-scale it if necessary after reading out.
+ // Note: we should never get there...
+ llwarns << "over scaling UI not supported." << llendl;
}
-
- // if not showing ui, use full window to render world view
- updateWorldViewRect(!show_ui);
- S32 buffer_x_offset = llfloor(((window_width - snapshot_width) * scale_factor) / 2.f);
+ S32 buffer_x_offset = llfloor(((window_width - snapshot_width) * scale_factor) / 2.f);
S32 buffer_y_offset = llfloor(((window_height - snapshot_height) * scale_factor) / 2.f);
- S32 image_buffer_x = llfloor(snapshot_width*scale_factor) ;
- S32 image_buffer_y = llfloor(snapshot_height *scale_factor) ;
- if(image_buffer_x > max_size || image_buffer_y > max_size) //boundary check to avoid memory overflow
+ S32 image_buffer_x = llfloor(snapshot_width * scale_factor) ;
+ S32 image_buffer_y = llfloor(snapshot_height * scale_factor) ;
+
+ if ((image_buffer_x > max_size) || (image_buffer_y > max_size)) // boundary check to avoid memory overflow
{
scale_factor *= llmin((F32)max_size / image_buffer_x, (F32)max_size / image_buffer_y) ;
- image_buffer_x = llfloor(snapshot_width*scale_factor) ;
- image_buffer_y = llfloor(snapshot_height *scale_factor) ;
+ image_buffer_x = llfloor(snapshot_width * scale_factor) ;
+ image_buffer_y = llfloor(snapshot_height * scale_factor) ;
}
- if(image_buffer_x > 0 && image_buffer_y > 0)
+ if ((image_buffer_x > 0) && (image_buffer_y > 0))
{
- raw->resize(image_buffer_x, image_buffer_y, 3);
+ raw->resize(image_buffer_x, image_buffer_y, 3);
}
else
{
return FALSE ;
}
- if(raw->isBufferInvalid())
+ if (raw->isBufferInvalid())
{
return FALSE ;
}
BOOL high_res = scale_factor >= 2.f; // Font scaling is slow, only do so if rez is much higher
- if (high_res)
+ if (high_res && show_ui)
{
- send_agent_pause();
+ // Note: we should never get there...
+ llwarns << "High res UI snapshot not supported. " << llendl;
+ /*send_agent_pause();
//rescale fonts
initFonts(scale_factor);
- LLHUDObject::reshapeAll();
+ LLHUDObject::reshapeAll();*/
}
S32 output_buffer_offset_y = 0;
@@ -4013,6 +4279,8 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
gObjectList.generatePickList(*LLViewerCamera::getInstance());
+ // Subimages are in fact partial rendering of the final view. This happens when the final view is bigger than the screen.
+ // In most common cases, scale_factor is 1 and there's no more than 1 iteration on x and y
for (int subimage_y = 0; subimage_y < scale_factor; ++subimage_y)
{
S32 subimage_y_offset = llclamp(buffer_y_offset - (subimage_y * window_height), 0, window_height);;
@@ -4026,69 +4294,70 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
gDisplaySwapBuffers = FALSE;
gDepthDirty = TRUE;
- const U32 subfield = subimage_x+(subimage_y*llceil(scale_factor));
-
- if (LLPipeline::sRenderDeferred)
- {
- display(do_rebuild, scale_factor, subfield, TRUE);
- }
- else
- {
- display(do_rebuild, scale_factor, subfield, TRUE);
- // Required for showing the GUI in snapshots and performing bloom composite overlay
- // Call even if show_ui is FALSE
- render_ui(scale_factor, subfield);
- }
-
S32 subimage_x_offset = llclamp(buffer_x_offset - (subimage_x * window_width), 0, window_width);
// handle fractional rows
U32 read_width = llmax(0, (window_width - subimage_x_offset) -
llmax(0, (window_width * (subimage_x + 1)) - (buffer_x_offset + raw->getWidth())));
- for(U32 out_y = 0; out_y < read_height ; out_y++)
+
+ // Skip rendering and sampling altogether if either width or height is degenerated to 0 (common in cropping cases)
+ if (read_width && read_height)
{
- S32 output_buffer_offset = (
- (out_y * (raw->getWidth())) // ...plus iterated y...
- + (window_width * subimage_x) // ...plus subimage start in x...
- + (raw->getWidth() * window_height * subimage_y) // ...plus subimage start in y...
- - output_buffer_offset_x // ...minus buffer padding x...
- - (output_buffer_offset_y * (raw->getWidth())) // ...minus buffer padding y...
- ) * raw->getComponents();
+ const U32 subfield = subimage_x+(subimage_y*llceil(scale_factor));
+ display(do_rebuild, scale_factor, subfield, TRUE);
- // Ping the wathdog thread every 100 lines to keep us alive (arbitrary number, feel free to change)
- if (out_y % 100 == 0)
+ if (!LLPipeline::sRenderDeferred)
{
- LLAppViewer::instance()->pingMainloopTimeout("LLViewerWindow::rawSnapshot");
+ // Required for showing the GUI in snapshots and performing bloom composite overlay
+ // Call even if show_ui is FALSE
+ render_ui(scale_factor, subfield);
}
- if (type == SNAPSHOT_TYPE_COLOR)
- {
- glReadPixels(
- subimage_x_offset, out_y + subimage_y_offset,
- read_width, 1,
- GL_RGB, GL_UNSIGNED_BYTE,
- raw->getData() + output_buffer_offset
- );
- }
- else // SNAPSHOT_TYPE_DEPTH
+ for (U32 out_y = 0; out_y < read_height ; out_y++)
{
- LLPointer<LLImageRaw> depth_line_buffer = new LLImageRaw(read_width, 1, sizeof(GL_FLOAT)); // need to store floating point values
- glReadPixels(
- subimage_x_offset, out_y + subimage_y_offset,
- read_width, 1,
- GL_DEPTH_COMPONENT, GL_FLOAT,
- depth_line_buffer->getData()// current output pixel is beginning of buffer...
- );
-
- for (S32 i = 0; i < (S32)read_width; i++)
+ S32 output_buffer_offset = (
+ (out_y * (raw->getWidth())) // ...plus iterated y...
+ + (window_width * subimage_x) // ...plus subimage start in x...
+ + (raw->getWidth() * window_height * subimage_y) // ...plus subimage start in y...
+ - output_buffer_offset_x // ...minus buffer padding x...
+ - (output_buffer_offset_y * (raw->getWidth())) // ...minus buffer padding y...
+ ) * raw->getComponents();
+
+ // Ping the watchdog thread every 100 lines to keep us alive (arbitrary number, feel free to change)
+ if (out_y % 100 == 0)
{
- F32 depth_float = *(F32*)(depth_line_buffer->getData() + (i * sizeof(F32)));
-
- F32 linear_depth_float = 1.f / (depth_conversion_factor_1 - (depth_float * depth_conversion_factor_2));
- U8 depth_byte = F32_to_U8(linear_depth_float, LLViewerCamera::getInstance()->getNear(), LLViewerCamera::getInstance()->getFar());
- //write converted scanline out to result image
- for(S32 j = 0; j < raw->getComponents(); j++)
+ LLAppViewer::instance()->pingMainloopTimeout("LLViewerWindow::rawSnapshot");
+ }
+
+ if (type == SNAPSHOT_TYPE_COLOR)
+ {
+ glReadPixels(
+ subimage_x_offset, out_y + subimage_y_offset,
+ read_width, 1,
+ GL_RGB, GL_UNSIGNED_BYTE,
+ raw->getData() + output_buffer_offset
+ );
+ }
+ else // SNAPSHOT_TYPE_DEPTH
+ {
+ LLPointer<LLImageRaw> depth_line_buffer = new LLImageRaw(read_width, 1, sizeof(GL_FLOAT)); // need to store floating point values
+ glReadPixels(
+ subimage_x_offset, out_y + subimage_y_offset,
+ read_width, 1,
+ GL_DEPTH_COMPONENT, GL_FLOAT,
+ depth_line_buffer->getData()// current output pixel is beginning of buffer...
+ );
+
+ for (S32 i = 0; i < (S32)read_width; i++)
{
- *(raw->getData() + output_buffer_offset + (i * raw->getComponents()) + j) = depth_byte;
+ F32 depth_float = *(F32*)(depth_line_buffer->getData() + (i * sizeof(F32)));
+
+ F32 linear_depth_float = 1.f / (depth_conversion_factor_1 - (depth_float * depth_conversion_factor_2));
+ U8 depth_byte = F32_to_U8(linear_depth_float, LLViewerCamera::getInstance()->getNear(), LLViewerCamera::getInstance()->getFar());
+ // write converted scanline out to result image
+ for (S32 j = 0; j < raw->getComponents(); j++)
+ {
+ *(raw->getData() + output_buffer_offset + (i * raw->getComponents()) + j) = depth_byte;
+ }
}
}
}
@@ -4099,12 +4368,6 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
output_buffer_offset_y += subimage_y_offset;
}
- if (use_fbo)
- {
- mWindowRectRaw = window_rect;
- target.flush();
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
- }
gDisplaySwapBuffers = FALSE;
gDepthDirty = TRUE;
@@ -4119,11 +4382,11 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
LLPipeline::sShowHUDAttachments = TRUE;
}
- if (high_res)
+ /*if (high_res)
{
initFonts(1.f);
LLHUDObject::reshapeAll();
- }
+ }*/
// Pre-pad image to number of pixels such that the line length is a multiple of 4 bytes (for BMP encoding)
// Note: this formula depends on the number of components being 3. Not obvious, but it's correct.
@@ -4281,22 +4544,21 @@ void LLViewerWindow::setup3DRender()
void LLViewerWindow::setup3DViewport(S32 x_offset, S32 y_offset)
{
- if (LLRenderTarget::getCurrentBoundTarget() != NULL)
- {
- // don't use translation component of mWorldViewRectRaw, as we are already in a properly sized render target
- gGLViewport[0] = x_offset;
- gGLViewport[1] = y_offset;
- }
- else
- {
- gGLViewport[0] = mWorldViewRectRaw.mLeft + x_offset;
- gGLViewport[1] = mWorldViewRectRaw.mBottom + y_offset;
- }
+ gGLViewport[0] = mWorldViewRectRaw.mLeft + x_offset;
+ gGLViewport[1] = mWorldViewRectRaw.mBottom + y_offset;
gGLViewport[2] = mWorldViewRectRaw.getWidth();
gGLViewport[3] = mWorldViewRectRaw.getHeight();
glViewport(gGLViewport[0], gGLViewport[1], gGLViewport[2], gGLViewport[3]);
}
+void LLViewerWindow::revealIntroPanel()
+{
+ if (mProgressView)
+ {
+ mProgressView->revealIntroPanel();
+ }
+}
+
void LLViewerWindow::setShowProgress(const BOOL show)
{
if (mProgressView)
@@ -4305,6 +4567,14 @@ void LLViewerWindow::setShowProgress(const BOOL show)
}
}
+void LLViewerWindow::setStartupComplete()
+{
+ if (mProgressView)
+ {
+ mProgressView->setStartupComplete();
+ }
+}
+
BOOL LLViewerWindow::getShowProgress() const
{
return (mProgressView && mProgressView->getVisible());
@@ -4394,10 +4664,7 @@ void LLViewerWindow::stopGL(BOOL save_state)
gPipeline.destroyGL();
}
- gCone.cleanupGL();
gBox.cleanupGL();
- gSphere.cleanupGL();
- gCylinder.cleanupGL();
if(gPostProcess)
{
@@ -4471,6 +4738,9 @@ void LLViewerWindow::initFonts(F32 zoom_factor)
{
LLFontGL::destroyAllGL();
// Initialize with possibly different zoom factor
+
+ LLFontManager::initClass();
+
LLFontGL::initClass( gSavedSettings.getF32("FontScreenDPI"),
mDisplayScale.mV[VX] * zoom_factor,
mDisplayScale.mV[VY] * zoom_factor,
@@ -4522,6 +4792,7 @@ BOOL LLViewerWindow::changeDisplaySettings(LLCoordScreen size, BOOL disable_vsyn
//gResizeScreenTexture = TRUE;
+
//U32 fsaa = gSavedSettings.getU32("RenderFSAASamples");
//U32 old_fsaa = mWindow->getFSAASamples();
@@ -4662,8 +4933,8 @@ S32 LLViewerWindow::getChatConsoleBottomPad()
{
S32 offset = 0;
- if(LLBottomTray::instanceExists())
- offset += LLBottomTray::getInstance()->getRect().getHeight();
+ if(gToolBarView)
+ offset += gToolBarView->getChild<LLView>("bottom_toolbar_panel")->getRect().getHeight();
return offset;
}
@@ -4705,12 +4976,9 @@ bool LLViewerWindow::onAlert(const LLSD& notify)
{
LLNotificationPtr notification = LLNotifications::instance().find(notify["id"].asUUID());
- if (gNoRender)
+ if (gHeadlessClient)
{
llinfos << "Alert: " << notification->getName() << llendl;
- notification->respond(LLSD::emptyMap());
- LLNotifications::instance().cancel(notification);
- return false;
}
// If we're in mouselook, the mouse is hidden and so the user can't click
@@ -4722,6 +4990,35 @@ bool LLViewerWindow::onAlert(const LLSD& notify)
return false;
}
+void LLViewerWindow::setUIVisibility(bool visible)
+{
+ mUIVisible = visible;
+
+ if (!visible)
+ {
+ gAgentCamera.changeCameraToThirdPerson(FALSE);
+ gFloaterView->hideAllFloaters();
+ }
+ else
+ {
+ gFloaterView->showHiddenFloaters();
+ }
+
+ if (gToolBarView)
+ {
+ gToolBarView->setToolBarsVisible(visible);
+ }
+
+ LLNavigationBar::getInstance()->setVisible(visible ? gSavedSettings.getBOOL("ShowNavbarNavigationPanel") : FALSE);
+ LLPanelTopInfoBar::getInstance()->setVisible(visible? gSavedSettings.getBOOL("ShowMiniLocationPanel") : FALSE);
+ mRootView->getChildView("status_bar_container")->setVisible(visible);
+}
+
+bool LLViewerWindow::getUIVisibility()
+{
+ return mUIVisible;
+}
+
////////////////////////////////////////////////////////////////////////////
//
// LLPickInfo
diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h
index 47fb7c4883..6efcaeaf18 100644
--- a/indra/newview/llviewerwindow.h
+++ b/indra/newview/llviewerwindow.h
@@ -38,13 +38,13 @@
#include "v3dmath.h"
#include "v2math.h"
+#include "llcursortypes.h"
#include "llwindowcallbacks.h"
#include "lltimer.h"
#include "llstat.h"
#include "llmousehandler.h"
-#include "llcursortypes.h"
#include "llhandle.h"
-#include "llimage.h"
+#include "llinitparam.h"
#include <boost/function.hpp>
#include <boost/signals2.hpp>
@@ -59,9 +59,11 @@ class LLTool;
class LLVelocityBar;
class LLPanel;
class LLImageRaw;
+class LLImageFormatted;
class LLHUDIcon;
class LLWindow;
class LLRootView;
+class LLWindowListener;
class LLViewerWindowListener;
class LLPopupView;
@@ -132,7 +134,23 @@ public:
//
// CREATORS
//
- LLViewerWindow(const std::string& title, const std::string& name, S32 x, S32 y, S32 width, S32 height, BOOL fullscreen, BOOL ignore_pixel_depth);
+ struct Params : public LLInitParam::Block<Params>
+ {
+ Mandatory<std::string> title,
+ name;
+ Mandatory<S32> x,
+ y,
+ width,
+ height,
+ min_width,
+ min_height;
+ Optional<bool> fullscreen,
+ ignore_pixel_depth;
+
+ Params();
+ };
+
+ LLViewerWindow(const Params& p);
virtual ~LLViewerWindow();
void shutdownViews();
@@ -143,6 +161,8 @@ public:
void adjustRectanglesForFirstUse(const LLRect& window);
void adjustControlRectanglesForFirstUse(const LLRect& window);
void initWorldUI();
+ void setUIVisibility(bool);
+ bool getUIVisibility();
BOOL handleAnyMouseClick(LLWindow *window, LLCoordGL pos, MASK mask, LLMouseHandler::EClickType clicktype, BOOL down);
@@ -186,11 +206,6 @@ public:
/*virtual*/ std::string translateString(const char* tag,
const std::map<std::string, std::string>& args);
- // signal on bottom tray width changed
- typedef boost::function<void (void)> bottom_tray_callback_t;
- typedef boost::signals2::signal<void (void)> bottom_tray_signal_t;
- bottom_tray_signal_t mOnBottomTrayWidthChanged;
- boost::signals2::connection setOnBottomTrayWidthChanged(bottom_tray_callback_t cb) { return mOnBottomTrayWidthChanged.connect(cb); }
// signal on update of WorldView rect
typedef boost::function<void (LLRect old_world_rect, LLRect new_world_rect)> world_rect_callback_t;
typedef boost::signals2::signal<void (LLRect old_world_rect, LLRect new_world_rect)> world_rect_signal_t;
@@ -276,6 +291,8 @@ public:
void setProgressMessage(const std::string& msg);
void setProgressCancelButtonVisible( BOOL b, const std::string& label = LLStringUtil::null );
LLProgressView *getProgressView() const;
+ void revealIntroPanel();
+ void setStartupComplete();
void updateObjectUnderCursor();
@@ -285,9 +302,9 @@ public:
void updateKeyboardFocus();
void updateWorldViewRect(bool use_full_window=false);
- LLView* getNonSideTrayView() { return mNonSideTrayView.get(); }
- LLView* getFloaterViewHolder() { return mFloaterViewHolder.get(); }
+ LLView* getToolBarHolder() { return mToolBarHolder.get(); }
LLView* getHintHolder() { return mHintHolder.get(); }
+ LLView* getLoginPanelHolder() { return mLoginPanelHolder.get(); }
BOOL handleKey(KEY key, MASK mask);
void handleScrollWheel (S32 clicks);
@@ -324,7 +341,7 @@ public:
BOOL thumbnailSnapshot(LLImageRaw *raw, S32 preview_width, S32 preview_height, BOOL show_ui, BOOL do_rebuild, ESnapshotType type) ;
BOOL isSnapshotLocSet() const { return ! sSnapshotDir.empty(); }
void resetSnapshotLoc() const { sSnapshotDir.clear(); }
- BOOL saveImageNumbered(LLImageFormatted *image);
+ BOOL saveImageNumbered(LLImageFormatted *image, bool force_picker = false);
// Reset the directory where snapshots are saved.
// Client will open directory picker on next snapshot save.
@@ -350,7 +367,9 @@ public:
LLVector3 *intersection = NULL,
LLVector2 *uv = NULL,
LLVector3 *normal = NULL,
- LLVector3 *binormal = NULL);
+ LLVector3 *binormal = NULL,
+ LLVector3* start = NULL,
+ LLVector3* end = NULL);
// Returns a pointer to the last object hit
@@ -394,11 +413,10 @@ private:
S32 getChatConsoleBottomPad(); // Vertical padding for child console rect, varied by bottom clutter
LLRect getChatConsoleRect(); // Get optimal cosole rect.
-public:
+private:
LLWindow* mWindow; // graphical window object
-
-protected:
- BOOL mActive;
+ bool mActive;
+ bool mUIVisible;
LLRect mWindowRectRaw; // whole window, including UI
LLRect mWindowRectScaled; // whole window, scaled by UI size
@@ -444,9 +462,9 @@ protected:
std::string mInitAlert; // Window / GL initialization requires an alert
LLHandle<LLView> mWorldViewPlaceholder; // widget that spans the portion of screen dedicated to rendering the 3d world
- LLHandle<LLView> mNonSideTrayView; // parent of world view + bottom bar, etc...everything but the side tray
- LLHandle<LLView> mFloaterViewHolder; // container for floater_view
+ LLHandle<LLView> mToolBarHolder; // container for toolbars
LLHandle<LLView> mHintHolder; // container for hints
+ LLHandle<LLView> mLoginPanelHolder; // container for login panel
LLPopupView* mPopupView; // container for transient popups
class LLDebugText* mDebugText; // Internal class for debug text
@@ -455,25 +473,18 @@ protected:
bool mStatesDirty;
U32 mCurrResolutionIndex;
- boost::scoped_ptr<LLViewerWindowListener> mViewerWindowListener;
+ boost::scoped_ptr<LLWindowListener> mWindowListener;
+ boost::scoped_ptr<LLViewerWindowListener> mViewerWindowListener;
-protected:
static std::string sSnapshotBaseName;
static std::string sSnapshotDir;
static std::string sMovieBaseName;
-private:
// Object temporarily hovered over while dragging
LLPointer<LLViewerObject> mDragHoveredObject;
};
-void toggle_flying(void*);
-void toggle_first_person();
-void toggle_build(void*);
-void reset_viewer_state_on_sim(void);
-void update_saved_window_size(const std::string& control,S32 delta_width, S32 delta_height);
-
//
// Globals
//
@@ -489,8 +500,8 @@ extern LLVector2 gDebugRaycastTexCoord;
extern LLVector3 gDebugRaycastNormal;
extern LLVector3 gDebugRaycastBinormal;
extern S32 gDebugRaycastFaceHit;
-
-extern S32 CHAT_BAR_HEIGHT;
+extern LLVector3 gDebugRaycastStart;
+extern LLVector3 gDebugRaycastEnd;
extern BOOL gDisplayCameraPos;
extern BOOL gDisplayWindInfo;
diff --git a/indra/newview/llviewerwindowlistener.cpp b/indra/newview/llviewerwindowlistener.cpp
index 0b52948680..1fe5fc9800 100644
--- a/indra/newview/llviewerwindowlistener.cpp
+++ b/indra/newview/llviewerwindowlistener.cpp
@@ -65,7 +65,6 @@ LLViewerWindowListener::LLViewerWindowListener(LLViewerWindow* llviewerwindow):
void LLViewerWindowListener::saveSnapshot(const LLSD& event) const
{
- LLReqID reqid(event);
typedef std::map<LLSD::String, LLViewerWindow::ESnapshotType> TypeMap;
TypeMap types;
#define tp(name) types[#name] = LLViewerWindow::SNAPSHOT_TYPE_##name
@@ -98,9 +97,7 @@ void LLViewerWindowListener::saveSnapshot(const LLSD& event) const
type = found->second;
}
bool ok = mViewerWindow->saveSnapshot(event["filename"], width, height, showui, rebuild, type);
- LLSD response(reqid.makeResponse());
- response["ok"] = ok;
- LLEventPumps::instance().obtain(event["reply"]).post(response);
+ sendReply(LLSDMap("ok", ok), event);
}
void LLViewerWindowListener::requestReshape(LLSD const & event_data) const
diff --git a/indra/newview/llvlmanager.cpp b/indra/newview/llvlmanager.cpp
index 25f2687fe2..d8de979f56 100644
--- a/indra/newview/llvlmanager.cpp
+++ b/indra/newview/llvlmanager.cpp
@@ -94,7 +94,7 @@ void LLVLManager::unpackData(const S32 num_packets)
}
else if (CLOUD_LAYER_CODE == datap->mType)
{
- datap->mRegionp->mCloudLayer.decompress(bit_pack, &goph);
+
}
}
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 7ae1f672e8..a7a4281860 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -38,9 +38,9 @@
#include <ctype.h>
#include "llaudioengine.h"
-#include "llcachename.h"
#include "noise.h"
#include "sound_ids.h"
+#include "raytrace.h"
#include "llagent.h" // Get state values from here
#include "llagentcamera.h"
@@ -48,6 +48,7 @@
#include "llanimationstates.h"
#include "llavatarnamecache.h"
#include "llavatarpropertiesprocessor.h"
+#include "llphysicsmotion.h"
#include "llviewercontrol.h"
#include "llcallingcard.h" // IDEVO for LLAvatarTracker
#include "lldrawpoolavatar.h"
@@ -55,6 +56,7 @@
#include "lleditingmotion.h"
#include "llemote.h"
//#include "llfirstuse.h"
+#include "llfloatertools.h"
#include "llheadrotmotion.h"
#include "llhudeffecttrail.h"
#include "llhudmanager.h"
@@ -63,6 +65,8 @@
#include "llkeyframefallmotion.h"
#include "llkeyframestandmotion.h"
#include "llkeyframewalkmotion.h"
+#include "llmanipscale.h" // for get_default_max_prim_scale()
+#include "llmeshrepository.h"
#include "llmutelist.h"
#include "llmoveview.h"
#include "llnotificationsutil.h"
@@ -80,6 +84,7 @@
#include "llviewermenu.h"
#include "llviewerobjectlist.h"
#include "llviewerparcelmgr.h"
+#include "llviewershadermgr.h"
#include "llviewerstats.h"
#include "llvoavatarself.h"
#include "llvovolume.h"
@@ -108,6 +113,8 @@ extern F32 ANIM_SPEED_MIN;
#include <boost/lexical_cast.hpp>
+// #define OUTPUT_BREAST_DATA
+
using namespace LLVOAvatarDefines;
//-----------------------------------------------------------------------------
@@ -123,6 +130,7 @@ const LLUUID ANIM_AGENT_HEAD_ROT = LLUUID("e6e8d1dd-e643-fff7-b238-c6b4b056a68d"
const LLUUID ANIM_AGENT_PELVIS_FIX = LLUUID("0c5dd2a2-514d-8893-d44d-05beffad208b"); //"pelvis_fix"
const LLUUID ANIM_AGENT_TARGET = LLUUID("0e4896cb-fba4-926c-f355-8720189d5b55"); //"target"
const LLUUID ANIM_AGENT_WALK_ADJUST = LLUUID("829bc85b-02fc-ec41-be2e-74cc6dd7215d"); //"walk_adjust"
+const LLUUID ANIM_AGENT_PHYSICS_MOTION = LLUUID("7360e029-3cb8-ebc4-863e-212df440d987"); //"physics_motion"
//-----------------------------------------------------------------------------
@@ -141,10 +149,6 @@ const F32 PELVIS_LAG_WALKING = 0.4f; // ...while walking
const F32 PELVIS_LAG_MOUSELOOK = 0.15f;
const F32 MOUSELOOK_PELVIS_FOLLOW_FACTOR = 0.5f;
const F32 PELVIS_LAG_WHEN_FOLLOW_CAM_IS_ON = 0.0001f; // not zero! - something gets divided by this!
-
-const F32 PELVIS_ROT_THRESHOLD_SLOW = 60.0f; // amount of deviation allowed between
-const F32 PELVIS_ROT_THRESHOLD_FAST = 2.0f; // the pelvis and the view direction
- // when moving fast & slow
const F32 TORSO_NOISE_AMOUNT = 1.0f; // Amount of deviation from up-axis, in degrees
const F32 TORSO_NOISE_SPEED = 0.2f; // Time scale factor on torso noise.
@@ -599,16 +603,16 @@ F32 LLVOAvatar::sRenderDistance = 256.f;
S32 LLVOAvatar::sNumVisibleAvatars = 0;
S32 LLVOAvatar::sNumLODChangesThisFrame = 0;
-const LLUUID LLVOAvatar::sStepSoundOnLand = LLUUID("e8af4a28-aa83-4310-a7c4-c047e15ea0df");
+const LLUUID LLVOAvatar::sStepSoundOnLand("e8af4a28-aa83-4310-a7c4-c047e15ea0df");
const LLUUID LLVOAvatar::sStepSounds[LL_MCODE_END] =
{
- LLUUID(SND_STONE_RUBBER),
- LLUUID(SND_METAL_RUBBER),
- LLUUID(SND_GLASS_RUBBER),
- LLUUID(SND_WOOD_RUBBER),
- LLUUID(SND_FLESH_RUBBER),
- LLUUID(SND_RUBBER_PLASTIC),
- LLUUID(SND_RUBBER_RUBBER)
+ SND_STONE_RUBBER,
+ SND_METAL_RUBBER,
+ SND_GLASS_RUBBER,
+ SND_WOOD_RUBBER,
+ SND_FLESH_RUBBER,
+ SND_RUBBER_PLASTIC,
+ SND_RUBBER_RUBBER
};
S32 LLVOAvatar::sRenderName = RENDER_NAME_ALWAYS;
@@ -620,6 +624,7 @@ BOOL LLVOAvatar::sShowAnimationDebug = FALSE;
BOOL LLVOAvatar::sShowFootPlane = FALSE;
BOOL LLVOAvatar::sVisibleInFirstPerson = FALSE;
F32 LLVOAvatar::sLODFactor = 1.f;
+F32 LLVOAvatar::sPhysicsLODFactor = 1.f;
BOOL LLVOAvatar::sUseImpostors = FALSE;
BOOL LLVOAvatar::sJointDebug = FALSE;
@@ -642,6 +647,8 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,
LLViewerObject(id, pcode, regionp),
mIsDummy(FALSE),
mSpecialRenderMode(0),
+ mAttachmentGeometryBytes(0),
+ mAttachmentSurfaceArea(0.f),
mTurning(FALSE),
mPelvisToFoot(0.f),
mLastSkeletonSerialNum( 0 ),
@@ -674,12 +681,15 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,
mTexHairColor( NULL ),
mTexEyeColor( NULL ),
mNeedsSkin(FALSE),
+ mLastSkinTime(0.f),
mUpdatePeriod(1),
mFullyLoaded(FALSE),
mPreviousFullyLoaded(FALSE),
mFullyLoadedInitialized(FALSE),
mSupportsAlphaLayers(FALSE),
- mLoadedCallbacksPaused(FALSE)
+ mLoadedCallbacksPaused(FALSE),
+ mHasPelvisOffset( FALSE ),
+ mRenderUnloadedAvatar(LLCachedControl<bool>(gSavedSettings, "RenderUnloadedAvatar"))
{
LLMemType mt(LLMemType::MTYPE_AVATAR);
//VTResume(); // VTune
@@ -754,6 +764,10 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,
mRuthTimer.reset();
mRuthDebugTimer.reset();
mDebugExistenceTimer.reset();
+ mPelvisOffset = LLVector3(0.0f,0.0f,0.0f);
+ mLastPelvisToFoot = 0.0f;
+ mPelvisFixup = 0.0f;
+ mLastPelvisFixup = 0.0f;
}
//------------------------------------------------------------------------
@@ -1108,14 +1122,20 @@ void LLVOAvatar::initClass()
// Process XML data
// avatar_skeleton.xml
- llassert(!sAvatarSkeletonInfo);
+ if (sAvatarSkeletonInfo)
+ { //this can happen if a login attempt failed
+ delete sAvatarSkeletonInfo;
+ }
sAvatarSkeletonInfo = new LLVOAvatarSkeletonInfo;
if (!sAvatarSkeletonInfo->parseXml(sSkeletonXMLTree.getRoot()))
{
llerrs << "Error parsing skeleton XML file: " << skeleton_path << llendl;
}
// parse avatar_lad.xml
- llassert(!sAvatarXmlInfo);
+ if (sAvatarXmlInfo)
+ { //this can happen if a login attempt failed
+ deleteAndClear(sAvatarXmlInfo);
+ }
sAvatarXmlInfo = new LLVOAvatarXmlInfo;
if (!sAvatarXmlInfo->parseXmlSkeletonNode(root))
{
@@ -1144,6 +1164,7 @@ void LLVOAvatar::initClass()
gAnimLibrary.animStateSetString(ANIM_AGENT_BODY_NOISE,"body_noise");
gAnimLibrary.animStateSetString(ANIM_AGENT_BREATHE_ROT,"breathe_rot");
+ gAnimLibrary.animStateSetString(ANIM_AGENT_PHYSICS_MOTION,"physics_motion");
gAnimLibrary.animStateSetString(ANIM_AGENT_EDITING,"editing");
gAnimLibrary.animStateSetString(ANIM_AGENT_EYE,"eye");
gAnimLibrary.animStateSetString(ANIM_AGENT_FLY_ADJUST,"fly_adjust");
@@ -1282,6 +1303,7 @@ void LLVOAvatar::initInstance(void)
// motions without a start/stop bit
registerMotion( ANIM_AGENT_BODY_NOISE, LLBodyNoiseMotion::create );
registerMotion( ANIM_AGENT_BREATHE_ROT, LLBreatheMotionRot::create );
+ registerMotion( ANIM_AGENT_PHYSICS_MOTION, LLPhysicsMotionController::create );
registerMotion( ANIM_AGENT_EDITING, LLEditingMotion::create );
registerMotion( ANIM_AGENT_EYE, LLEyeMotion::create );
registerMotion( ANIM_AGENT_FEMALE_WALK, LLKeyframeWalkMotion::create );
@@ -1295,18 +1317,8 @@ void LLVOAvatar::initInstance(void)
}
- if (gNoRender)
- {
- return;
- }
-
buildCharacter();
- if (gNoRender)
- {
- return;
- }
-
// preload specific motions here
createMotion( ANIM_AGENT_CUSTOMIZE);
createMotion( ANIM_AGENT_CUSTOMIZE_DONE);
@@ -1325,7 +1337,17 @@ const LLVector3 LLVOAvatar::getRenderPosition() const
}
else if (isRoot())
{
- return mDrawable->getPositionAgent();
+ if ( !mHasPelvisOffset )
+ {
+ return mDrawable->getPositionAgent();
+ }
+ else
+ {
+ //Apply a pelvis fixup (as defined by the avs skin)
+ LLVector3 pos = mDrawable->getPositionAgent();
+ pos[VZ] += mPelvisFixup;
+ return pos;
+ }
}
else
{
@@ -1338,42 +1360,47 @@ void LLVOAvatar::updateDrawable(BOOL force_damped)
clearChanged(SHIFTED);
}
-void LLVOAvatar::onShift(const LLVector3& shift_vector)
+void LLVOAvatar::onShift(const LLVector4a& shift_vector)
{
- mLastAnimExtents[0] += shift_vector;
- mLastAnimExtents[1] += shift_vector;
+ const LLVector3& shift = reinterpret_cast<const LLVector3&>(shift_vector);
+ mLastAnimExtents[0] += shift;
+ mLastAnimExtents[1] += shift;
mNeedsImpostorUpdate = TRUE;
mNeedsAnimUpdate = TRUE;
}
-void LLVOAvatar::updateSpatialExtents(LLVector3& newMin, LLVector3 &newMax)
+void LLVOAvatar::updateSpatialExtents(LLVector4a& newMin, LLVector4a &newMax)
{
if (isImpostor() && !needsImpostorUpdate())
{
LLVector3 delta = getRenderPosition() -
- ((LLVector3(mDrawable->getPositionGroup())-mImpostorOffset));
+ ((LLVector3(mDrawable->getPositionGroup().getF32ptr())-mImpostorOffset));
- newMin = mLastAnimExtents[0] + delta;
- newMax = mLastAnimExtents[1] + delta;
+ newMin.load3( (mLastAnimExtents[0] + delta).mV);
+ newMax.load3( (mLastAnimExtents[1] + delta).mV);
}
else
{
getSpatialExtents(newMin,newMax);
- mLastAnimExtents[0] = newMin;
- mLastAnimExtents[1] = newMax;
- LLVector3 pos_group = (newMin+newMax)*0.5f;
- mImpostorOffset = pos_group-getRenderPosition();
+ mLastAnimExtents[0].set(newMin.getF32ptr());
+ mLastAnimExtents[1].set(newMax.getF32ptr());
+ LLVector4a pos_group;
+ pos_group.setAdd(newMin,newMax);
+ pos_group.mul(0.5f);
+ mImpostorOffset = LLVector3(pos_group.getF32ptr())-getRenderPosition();
mDrawable->setPositionGroup(pos_group);
}
}
-void LLVOAvatar::getSpatialExtents(LLVector3& newMin, LLVector3& newMax)
+void LLVOAvatar::getSpatialExtents(LLVector4a& newMin, LLVector4a& newMax)
{
- LLVector3 buffer(0.25f, 0.25f, 0.25f);
- LLVector3 pos = getRenderPosition();
- newMin = pos - buffer;
- newMax = pos + buffer;
- float max_attachment_span = DEFAULT_MAX_PRIM_SCALE * 5.0f;
+ LLVector4a buffer(0.25f);
+ LLVector4a pos;
+ pos.load3(getRenderPosition().mV);
+ newMin.setSub(pos, buffer);
+ newMax.setAdd(pos, buffer);
+
+ float max_attachment_span = get_default_max_prim_scale() * 5.0f;
//stretch bounding box by joint positions
for (polymesh_map_t::iterator i = mMeshes.begin(); i != mMeshes.end(); ++i)
@@ -1381,12 +1408,20 @@ void LLVOAvatar::getSpatialExtents(LLVector3& newMin, LLVector3& newMax)
LLPolyMesh* mesh = i->second;
for (S32 joint_num = 0; joint_num < mesh->mJointRenderData.count(); joint_num++)
{
- update_min_max(newMin, newMax,
- mesh->mJointRenderData[joint_num]->mWorldMatrix->getTranslation());
+ LLVector4a trans;
+ trans.load3( mesh->mJointRenderData[joint_num]->mWorldMatrix->getTranslation().mV);
+ update_min_max(newMin, newMax, trans);
}
}
- mPixelArea = LLPipeline::calcPixelArea((newMin+newMax)*0.5f, (newMax-newMin)*0.5f, *LLViewerCamera::getInstance());
+ LLVector4a center, size;
+ center.setAdd(newMin, newMax);
+ center.mul(0.5f);
+
+ size.setSub(newMax,newMin);
+ size.mul(0.5f);
+
+ mPixelArea = LLPipeline::calcPixelArea(center, size, *LLViewerCamera::getInstance());
//stretch bounding box by attachments
for (attachment_map_t::iterator iter = mAttachmentPoints.begin();
@@ -1408,20 +1443,22 @@ void LLVOAvatar::getSpatialExtents(LLVector3& newMin, LLVector3& newMax)
if (attached_object && !attached_object->isHUDAttachment())
{
LLDrawable* drawable = attached_object->mDrawable;
- if (drawable)
+ if (drawable && !drawable->isState(LLDrawable::RIGGED))
{
LLSpatialBridge* bridge = drawable->getSpatialBridge();
if (bridge)
{
- const LLVector3* ext = bridge->getSpatialExtents();
- LLVector3 distance = (ext[1] - ext[0]);
+ const LLVector4a* ext = bridge->getSpatialExtents();
+ LLVector4a distance;
+ distance.setSub(ext[1], ext[0]);
+ LLVector4a max_span(max_attachment_span);
+
+ S32 lt = distance.lessThan(max_span).getGatheredBits() & 0x7;
// Only add the prim to spatial extents calculations if it isn't a megaprim.
// max_attachment_span calculated at the start of the function
// (currently 5 times our max prim size)
- if (distance.mV[0] < max_attachment_span
- && distance.mV[1] < max_attachment_span
- && distance.mV[2] < max_attachment_span)
+ if (lt == 0x7)
{
update_min_max(newMin,newMax,ext[0]);
update_min_max(newMin,newMax,ext[1]);
@@ -1433,8 +1470,9 @@ void LLVOAvatar::getSpatialExtents(LLVector3& newMin, LLVector3& newMax)
}
//pad bounding box
- newMin -= buffer;
- newMax += buffer;
+
+ newMin.sub(buffer);
+ newMax.add(buffer);
}
//-----------------------------------------------------------------------------
@@ -1509,7 +1547,35 @@ BOOL LLVOAvatar::lineSegmentIntersect(const LLVector3& start, const LLVector3& e
return TRUE;
}
}
+
+ if (isSelf())
+ {
+ for (attachment_map_t::iterator iter = mAttachmentPoints.begin();
+ iter != mAttachmentPoints.end();
+ ++iter)
+ {
+ LLViewerJointAttachment* attachment = iter->second;
+
+ for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin();
+ attachment_iter != attachment->mAttachedObjects.end();
+ ++attachment_iter)
+ {
+ LLViewerObject* attached_object = (*attachment_iter);
+
+ if (attached_object && !attached_object->isDead() && attachment->getValid())
+ {
+ LLDrawable* drawable = attached_object->mDrawable;
+ if (drawable->isState(LLDrawable::RIGGED))
+ { //regenerate octree for rigged attachment
+ gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_RIGGED, TRUE);
+ }
+ }
+ }
+ }
+ }
}
+
+
LLVector3 position;
if (mNameText.notNull() && mNameText->lineSegmentIntersect(start, end, position))
@@ -1525,6 +1591,56 @@ BOOL LLVOAvatar::lineSegmentIntersect(const LLVector3& start, const LLVector3& e
return FALSE;
}
+LLViewerObject* LLVOAvatar::lineSegmentIntersectRiggedAttachments(const LLVector3& start, const LLVector3& end,
+ S32 face,
+ BOOL pick_transparent,
+ S32* face_hit,
+ LLVector3* intersection,
+ LLVector2* tex_coord,
+ LLVector3* normal,
+ LLVector3* bi_normal)
+{
+ if (isSelf() && !gAgent.needsRenderAvatar())
+ {
+ return NULL;
+ }
+
+ LLViewerObject* hit = NULL;
+
+ if (lineSegmentBoundingBox(start, end))
+ {
+ LLVector3 local_end = end;
+ LLVector3 local_intersection;
+
+ for (attachment_map_t::iterator iter = mAttachmentPoints.begin();
+ iter != mAttachmentPoints.end();
+ ++iter)
+ {
+ LLViewerJointAttachment* attachment = iter->second;
+
+ for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin();
+ attachment_iter != attachment->mAttachedObjects.end();
+ ++attachment_iter)
+ {
+ LLViewerObject* attached_object = (*attachment_iter);
+
+ if (attached_object->lineSegmentIntersect(start, local_end, face, pick_transparent, face_hit, &local_intersection, tex_coord, normal, bi_normal))
+ {
+ local_end = local_intersection;
+ if (intersection)
+ {
+ *intersection = local_intersection;
+ }
+
+ hit = attached_object;
+ }
+ }
+ }
+ }
+
+ return hit;
+}
+
//-----------------------------------------------------------------------------
// parseSkeletonFile()
//-----------------------------------------------------------------------------
@@ -1609,7 +1725,8 @@ BOOL LLVOAvatar::setupBone(const LLVOAvatarBoneInfo* info, LLViewerJoint* parent
info->mRot.mV[VZ], LLQuaternion::XYZ));
joint->setScale(info->mScale);
-
+ joint->setDefaultFromCurrentXform();
+
if (info->mIsJoint)
{
joint->setSkinOffset( info->mPivot );
@@ -1695,6 +1812,7 @@ void LLVOAvatar::startDefaultMotions()
startMotion( ANIM_AGENT_EYE );
startMotion( ANIM_AGENT_BODY_NOISE );
startMotion( ANIM_AGENT_BREATHE_ROT );
+ startMotion( ANIM_AGENT_PHYSICS_MOTION );
startMotion( ANIM_AGENT_HAND_MOTION );
startMotion( ANIM_AGENT_PELVIS_FIX );
@@ -1747,12 +1865,6 @@ void LLVOAvatar::buildCharacter()
BOOL status = loadAvatar();
stop_glerror();
- if (gNoRender)
- {
- // Still want to load the avatar skeleton so visual parameters work.
- return;
- }
-
// gPrintMessagesThisFrame = TRUE;
lldebugs << "Avatar load took " << timer.getElapsedTimeF32() << " seconds." << llendl;
@@ -1992,26 +2104,29 @@ void LLVOAvatar::updateMeshData()
bool terse_update = false;
- if(facep->mVertexBuffer.isNull())
+ facep->setGeomIndex(0);
+ facep->setIndicesIndex(0);
+
+ LLVertexBuffer* buff = facep->getVertexBuffer();
+ if(!facep->getVertexBuffer())
{
- facep->mVertexBuffer = new LLVertexBufferAvatar();
- facep->mVertexBuffer->allocateBuffer(num_vertices, num_indices, TRUE);
+ buff = new LLVertexBufferAvatar();
+ buff->allocateBuffer(num_vertices, num_indices, TRUE);
+ facep->setVertexBuffer(buff);
}
else
{
- if (facep->mVertexBuffer->getRequestedIndices() == num_indices &&
- facep->mVertexBuffer->getRequestedVerts() == num_vertices)
+ if (buff->getNumIndices() == num_indices &&
+ buff->getNumVerts() == num_vertices)
{
terse_update = true;
}
else
{
- facep->mVertexBuffer->resizeBuffer(num_vertices, num_indices) ;
- }
+ buff->resizeBuffer(num_vertices, num_indices);
+ }
}
-
- facep->setGeomIndex(0);
- facep->setIndicesIndex(0);
+
// This is a hack! Avatars have their own pool, so we are detecting
// the case of more than one avatar in the pool (thus > 0 instead of >= 0)
@@ -2022,11 +2137,19 @@ void LLVOAvatar::updateMeshData()
for(S32 k = j ; k < part_index ; k++)
{
- mMeshLOD[k]->updateFaceData(facep, mAdjustedPixelArea, k == MESH_ID_HAIR, terse_update);
+ bool rigid = false;
+ if (k == MESH_ID_EYEBALL_LEFT ||
+ k == MESH_ID_EYEBALL_RIGHT)
+ { //eyeballs can't have terse updates since they're never rendered with
+ //the hardware skinning shader
+ rigid = true;
+ }
+
+ mMeshLOD[k]->updateFaceData(facep, mAdjustedPixelArea, k == MESH_ID_HAIR, terse_update && !rigid);
}
stop_glerror();
- facep->mVertexBuffer->setBuffer(0);
+ buff->flush();
if(!f_num)
{
@@ -2106,31 +2229,6 @@ void LLVOAvatar::computeBodySize()
gAgent.sendAgentSetAppearance();
}
}
-
-/* debug spam
- std::cout << "skull = " << skull << std::endl; // adebug
- std::cout << "head = " << head << std::endl; // adebug
- std::cout << "head_scale = " << head_scale << std::endl; // adebug
- std::cout << "neck = " << neck << std::endl; // adebug
- std::cout << "neck_scale = " << neck_scale << std::endl; // adebug
- std::cout << "chest = " << chest << std::endl; // adebug
- std::cout << "chest_scale = " << chest_scale << std::endl; // adebug
- std::cout << "torso = " << torso << std::endl; // adebug
- std::cout << "torso_scale = " << torso_scale << std::endl; // adebug
- std::cout << std::endl; // adebug
-
- std::cout << "pelvis_scale = " << pelvis_scale << std::endl;// adebug
- std::cout << std::endl; // adebug
-
- std::cout << "hip = " << hip << std::endl; // adebug
- std::cout << "hip_scale = " << hip_scale << std::endl; // adebug
- std::cout << "ankle = " << ankle << std::endl; // adebug
- std::cout << "ankle_scale = " << ankle_scale << std::endl; // adebug
- std::cout << "foot = " << foot << std::endl; // adebug
- std::cout << "mBodySize = " << mBodySize << std::endl; // adebug
- std::cout << "mPelvisToFoot = " << mPelvisToFoot << std::endl; // adebug
- std::cout << std::endl; // adebug
-*/
}
//------------------------------------------------------------------------
@@ -2248,7 +2346,7 @@ BOOL LLVOAvatar::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
setPixelAreaAndAngle(gAgent);
// force asynchronous drawable update
- if(mDrawable.notNull() && !gNoRender)
+ if(mDrawable.notNull())
{
LLFastTimer t(FTM_JOINT_UPDATE);
@@ -2305,11 +2403,6 @@ BOOL LLVOAvatar::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
LLVector3 root_pos_last = mRoot.getWorldPosition();
BOOL detailed_update = updateCharacter(agent);
- if (gNoRender)
- {
- return TRUE;
- }
-
static LLUICachedControl<bool> visualizers_in_calls("ShowVoiceVisualizersInCalls", false);
bool voice_enabled = (visualizers_in_calls || LLVoiceClient::getInstance()->inProximalChannel()) &&
LLVoiceClient::getInstance()->getVoiceEnabled(mID);
@@ -2333,8 +2426,19 @@ BOOL LLVOAvatar::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
void LLVOAvatar::idleUpdateVoiceVisualizer(bool voice_enabled)
{
- // disable voice visualizer when in mouselook
- mVoiceVisualizer->setVoiceEnabled( voice_enabled && !(isSelf() && gAgentCamera.cameraMouselook()) );
+ bool render_visualizer = voice_enabled;
+
+ // Don't render the user's own voice visualizer when in mouselook, or when opening the mic is disabled.
+ if(isSelf())
+ {
+ if(gAgentCamera.cameraMouselook() || gSavedSettings.getBOOL("VoiceDisableMic"))
+ {
+ render_visualizer = false;
+ }
+ }
+
+ mVoiceVisualizer->setVoiceEnabled(render_visualizer);
+
if ( voice_enabled )
{
//----------------------------------------------------------------
@@ -2413,9 +2517,19 @@ void LLVOAvatar::idleUpdateVoiceVisualizer(bool voice_enabled)
// here we get the approximate head position and set as sound source for the voice symbol
// (the following version uses a tweak of "mHeadOffset" which handle sitting vs. standing)
//--------------------------------------------------------------------------------------------
- LLVector3 headOffset = LLVector3( 0.0f, 0.0f, mHeadOffset.mV[2] );
- mVoiceVisualizer->setVoiceSourceWorldPosition( mRoot.getWorldPosition() + headOffset );
+ if ( mIsSitting )
+ {
+ LLVector3 headOffset = LLVector3( 0.0f, 0.0f, mHeadOffset.mV[2] );
+ mVoiceVisualizer->setVoiceSourceWorldPosition( mRoot.getWorldPosition() + headOffset );
+ }
+ else
+ {
+ LLVector3 tagPos = mRoot.getWorldPosition();
+ tagPos[VZ] -= mPelvisToFoot;
+ tagPos[VZ] += ( mBodySize[VZ] + 0.125f );
+ mVoiceVisualizer->setVoiceSourceWorldPosition( tagPos );
+ }
}//if ( voiceEnabled )
}
@@ -2479,7 +2593,7 @@ void LLVOAvatar::idleUpdateMisc(bool detailed_update)
if (isImpostor() && !mNeedsImpostorUpdate)
{
- LLVector3 ext[2];
+ LLVector4a ext[2];
F32 distance;
LLVector3 angle;
@@ -2508,12 +2622,22 @@ void LLVOAvatar::idleUpdateMisc(bool detailed_update)
}
else
{
+ //VECTORIZE THIS
getSpatialExtents(ext[0], ext[1]);
- if ((ext[1]-mImpostorExtents[1]).length() > 0.05f ||
- (ext[0]-mImpostorExtents[0]).length() > 0.05f)
+ LLVector4a diff;
+ diff.setSub(ext[1], mImpostorExtents[1]);
+ if (diff.getLength3().getF32() > 0.05f)
{
mNeedsImpostorUpdate = TRUE;
}
+ else
+ {
+ diff.setSub(ext[0], mImpostorExtents[0]);
+ if (diff.getLength3().getF32() > 0.05f)
+ {
+ mNeedsImpostorUpdate = TRUE;
+ }
+ }
}
}
}
@@ -2686,7 +2810,10 @@ void LLVOAvatar::idleUpdateLoadingEffect()
LLPartData::LL_PART_EMISSIVE_MASK | // LLPartData::LL_PART_FOLLOW_SRC_MASK |
LLPartData::LL_PART_TARGET_POS_MASK );
- setParticleSource(particle_parameters, getID());
+ if (!isTooComplex()) // do not generate particles for overly-complex avatars
+ {
+ setParticleSource(particle_parameters, getID());
+ }
}
}
}
@@ -2852,10 +2979,8 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last)
}
LLVector3 name_position = idleUpdateNameTagPosition(root_pos_last);
- mNameText->setPositionAgent(name_position);
-
- idleUpdateNameTagText(new_name);
-
+ mNameText->setPositionAgent(name_position);
+ idleUpdateNameTagText(new_name);
idleUpdateNameTagAlpha(new_name, alpha);
}
@@ -3024,7 +3149,7 @@ void LLVOAvatar::idleUpdateNameTagText(BOOL new_name)
std::deque<LLChat>::iterator chat_iter = mChats.begin();
mNameText->clearString();
- LLColor4 new_chat = LLUIColorTable::instance().getColor( "NameTagChat" );
+ LLColor4 new_chat = LLUIColorTable::instance().getColor( isSelf() ? "UserChatColor" : "AgentChatColor" );
LLColor4 normal_chat = lerp(new_chat, LLColor4(0.8f, 0.8f, 0.8f, 1.f), 0.7f);
LLColor4 old_chat = lerp(normal_chat, LLColor4(0.6f, 0.6f, 0.6f, 1.f), 0.7f);
if (mTyping && mChats.size() >= MAX_BUBBLE_CHAT_UTTERANCES)
@@ -3141,8 +3266,9 @@ void LLVOAvatar::invalidateNameTags()
if (avatar->isDead()) continue;
avatar->clearNameTag();
- }
- }
+
+ }
+}
// Compute name tag position during idle update
LLVector3 LLVOAvatar::idleUpdateNameTagPosition(const LLVector3& root_pos_last)
@@ -3161,12 +3287,14 @@ LLVector3 LLVOAvatar::idleUpdateNameTagPosition(const LLVector3& root_pos_last)
local_camera_up.scaleVec(mBodySize * 0.5f);
local_camera_at.scaleVec(mBodySize * 0.5f);
- LLVector3 name_position = mRoot.getWorldPosition() +
- (local_camera_up * root_rot) -
- (projected_vec(local_camera_at * root_rot, camera_to_av));
+ LLVector3 name_position = mRoot.getWorldPosition();
+ name_position[VZ] -= mPelvisToFoot;
+ name_position[VZ] += (mBodySize[VZ]* 0.55f);
+ name_position += (local_camera_up * root_rot) - (projected_vec(local_camera_at * root_rot, camera_to_av));
name_position += pixel_up_vec * 15.f;
+
return name_position;
- }
+}
void LLVOAvatar::idleUpdateNameTagAlpha(BOOL new_name, F32 alpha)
{
@@ -3233,6 +3361,16 @@ void LLVOAvatar::slamPosition()
mRoot.updateWorldMatrixChildren();
}
+bool LLVOAvatar::isVisuallyMuted() const
+{
+ static LLCachedControl<U32> max_attachment_bytes(gSavedSettings, "RenderAutoMuteByteLimit");
+ static LLCachedControl<F32> max_attachment_area(gSavedSettings, "RenderAutoMuteSurfaceAreaLimit");
+
+ return LLMuteList::getInstance()->isMuted(getID()) ||
+ (mAttachmentGeometryBytes > max_attachment_bytes && max_attachment_bytes > 0) ||
+ (mAttachmentSurfaceArea > max_attachment_area && max_attachment_area > 0.f);
+}
+
//------------------------------------------------------------------------
// updateCharacter()
// called on both your avatar and other avatars
@@ -3271,17 +3409,6 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
}
}
- if (gNoRender)
- {
- // Hack if we're running drones...
- if (isSelf())
- {
- gAgent.setPositionAgent(getPositionAgent());
- }
- return FALSE;
- }
-
-
LLVector3d root_pos_global;
if (!mIsBuilt)
@@ -3298,20 +3425,29 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
mTimeVisible.reset();
}
-
+
//--------------------------------------------------------------------
// the rest should only be done occasionally for far away avatars
//--------------------------------------------------------------------
- if (visible && !isSelf() && !mIsDummy && sUseImpostors && !mNeedsAnimUpdate && !sFreezeCounter)
+ if (visible && (!isSelf() || isVisuallyMuted()) && !mIsDummy && sUseImpostors && !mNeedsAnimUpdate && !sFreezeCounter)
{
+ const LLVector4a* ext = mDrawable->getSpatialExtents();
+ LLVector4a size;
+ size.setSub(ext[1],ext[0]);
+ F32 mag = size.getLength3().getF32()*0.5f;
+
+
F32 impostor_area = 256.f*512.f*(8.125f - LLVOAvatar::sLODFactor*8.f);
- if (LLMuteList::getInstance()->isMuted(getID()))
+ if (isVisuallyMuted())
{ // muted avatars update at 16 hz
mUpdatePeriod = 16;
}
- else if (mVisibilityRank <= LLVOAvatar::sMaxVisible)
+ else if (mVisibilityRank <= LLVOAvatar::sMaxVisible ||
+ mDrawable->mDistanceWRTCamera < 1.f + mag)
{ //first 25% of max visible avatars are not impostored
+ //also, don't impostor avatars whose bounding box may be penetrating the
+ //impostor camera near clip plane
mUpdatePeriod = 1;
}
else if (mVisibilityRank > LLVOAvatar::sMaxVisible * 4)
@@ -3334,6 +3470,11 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
visible = (LLDrawable::getCurrentFrame()+mID.mData[0])%mUpdatePeriod == 0 ? TRUE : FALSE;
}
+ else
+ {
+ mUpdatePeriod = 1;
+ }
+
// don't early out for your own avatar, as we rely on your animations playing reliably
// for example, the "turn around" animation when entering customize avatar needs to trigger
@@ -3422,7 +3563,7 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
root_pos = gAgent.getPosGlobalFromAgent(getRenderPosition());
resolveHeightGlobal(root_pos, ground_under_pelvis, normal);
- F32 foot_to_ground = (F32) (root_pos.mdV[VZ] - mPelvisToFoot - ground_under_pelvis.mdV[VZ]);
+ F32 foot_to_ground = (F32) (root_pos.mdV[VZ] - mPelvisToFoot - ground_under_pelvis.mdV[VZ]);
BOOL in_air = ((!LLWorld::getInstance()->getRegionFromPosGlobal(ground_under_pelvis)) ||
foot_to_ground > FOOT_GROUND_COLLISION_TOLERANCE);
@@ -3436,13 +3577,12 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
// of the agent's physical representation
root_pos.mdV[VZ] -= (0.5f * mBodySize.mV[VZ]) - mPelvisToFoot;
-
LLVector3 newPosition = gAgent.getPosAgentFromGlobal(root_pos);
if (newPosition != mRoot.getXform()->getWorldPosition())
{
mRoot.touch();
- mRoot.setWorldPosition(newPosition ); // regular update
+ mRoot.setWorldPosition( newPosition ); // regular update
}
@@ -3513,7 +3653,11 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
BOOL self_in_mouselook = isSelf() && gAgentCamera.cameraMouselook();
LLVector3 pelvisDir( mRoot.getWorldMatrix().getFwdRow4().mV );
- F32 pelvis_rot_threshold = clamp_rescale(speed, 0.1f, 1.0f, PELVIS_ROT_THRESHOLD_SLOW, PELVIS_ROT_THRESHOLD_FAST);
+
+ static LLCachedControl<F32> s_pelvis_rot_threshold_slow(gSavedSettings, "AvatarRotateThresholdSlow");
+ static LLCachedControl<F32> s_pelvis_rot_threshold_fast(gSavedSettings, "AvatarRotateThresholdFast");
+
+ F32 pelvis_rot_threshold = clamp_rescale(speed, 0.1f, 1.0f, s_pelvis_rot_threshold_slow, s_pelvis_rot_threshold_fast);
if (self_in_mouselook)
{
@@ -3718,7 +3862,6 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
return TRUE;
}
-
//-----------------------------------------------------------------------------
// updateHeadOffset()
//-----------------------------------------------------------------------------
@@ -3743,7 +3886,41 @@ void LLVOAvatar::updateHeadOffset()
mHeadOffset = lerp(midEyePt, mHeadOffset, u);
}
}
-
+//------------------------------------------------------------------------
+// setPelvisOffset
+//------------------------------------------------------------------------
+void LLVOAvatar::setPelvisOffset( bool hasOffset, const LLVector3& offsetAmount, F32 pelvisFixup )
+{
+ mHasPelvisOffset = hasOffset;
+ if ( mHasPelvisOffset )
+ {
+ //Store off last pelvis to foot value
+ mLastPelvisToFoot = mPelvisToFoot;
+ mPelvisOffset = offsetAmount;
+ mLastPelvisFixup = mPelvisFixup;
+ mPelvisFixup = pelvisFixup;
+ }
+}
+//------------------------------------------------------------------------
+// postPelvisSetRecalc
+//------------------------------------------------------------------------
+void LLVOAvatar::postPelvisSetRecalc( void )
+{
+ computeBodySize();
+ mRoot.touch();
+ mRoot.updateWorldMatrixChildren();
+ dirtyMesh();
+ updateHeadOffset();
+}
+//------------------------------------------------------------------------
+// pelisPoke
+//------------------------------------------------------------------------
+void LLVOAvatar::setPelvisOffset( F32 pelvisFixupAmount )
+{
+ mHasPelvisOffset = true;
+ mLastPelvisFixup = mPelvisFixup;
+ mPelvisFixup = pelvisFixupAmount;
+}
//------------------------------------------------------------------------
// updateVisibility()
//------------------------------------------------------------------------
@@ -3893,6 +4070,46 @@ bool LLVOAvatar::shouldAlphaMask()
}
+U32 LLVOAvatar::renderSkinnedAttachments()
+{
+ /*U32 num_indices = 0;
+
+ const U32 data_mask = LLVertexBuffer::MAP_VERTEX |
+ LLVertexBuffer::MAP_NORMAL |
+ LLVertexBuffer::MAP_TEXCOORD0 |
+ LLVertexBuffer::MAP_COLOR |
+ LLVertexBuffer::MAP_WEIGHT4;
+
+ for (attachment_map_t::const_iterator iter = mAttachmentPoints.begin();
+ iter != mAttachmentPoints.end();
+ ++iter)
+ {
+ LLViewerJointAttachment* attachment = iter->second;
+ for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin();
+ attachment_iter != attachment->mAttachedObjects.end();
+ ++attachment_iter)
+ {
+ const LLViewerObject* attached_object = (*attachment_iter);
+ if (attached_object && !attached_object->isHUDAttachment())
+ {
+ const LLDrawable* drawable = attached_object->mDrawable;
+ if (drawable)
+ {
+ for (S32 i = 0; i < drawable->getNumFaces(); ++i)
+ {
+ LLFace* face = drawable->getFace(i);
+ if (face->isState(LLFace::RIGGED))
+ {
+
+ }
+ }
+ }
+ }
+
+ return num_indices;*/
+ return 0;
+}
+
//-----------------------------------------------------------------------------
// renderSkinned()
//-----------------------------------------------------------------------------
@@ -3907,7 +4124,7 @@ U32 LLVOAvatar::renderSkinned(EAvatarRenderPass pass)
LLFace* face = mDrawable->getFace(0);
- bool needs_rebuild = !face || face->mVertexBuffer.isNull() || mDrawable->isState(LLDrawable::REBUILD_GEOMETRY);
+ bool needs_rebuild = !face || !face->getVertexBuffer() || mDrawable->isState(LLDrawable::REBUILD_GEOMETRY);
if (needs_rebuild || mDirtyMesh)
{ //LOD changed or new mesh created, allocate new vertex buffer if needed
@@ -3940,11 +4157,12 @@ U32 LLVOAvatar::renderSkinned(EAvatarRenderPass pass)
mMeshLOD[MESH_ID_HAIR]->updateJointGeometry();
}
mNeedsSkin = FALSE;
-
- LLVertexBuffer* vb = mDrawable->getFace(0)->mVertexBuffer;
+ mLastSkinTime = gFrameTimeSeconds;
+
+ LLVertexBuffer* vb = mDrawable->getFace(0)->getVertexBuffer();
if (vb)
{
- vb->setBuffer(0);
+ vb->flush();
}
}
}
@@ -4037,7 +4255,7 @@ U32 LLVOAvatar::renderSkinned(EAvatarRenderPass pass)
bool should_alpha_mask = shouldAlphaMask();
LLGLState test(GL_ALPHA_TEST, should_alpha_mask);
- if (should_alpha_mask)
+ if (should_alpha_mask && !LLGLSLShader::sNoFixedFunction)
{
gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.5f);
}
@@ -4066,7 +4284,10 @@ U32 LLVOAvatar::renderSkinned(EAvatarRenderPass pass)
}
}
- gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
+ if (should_alpha_mask && !LLGLSLShader::sNoFixedFunction)
+ {
+ gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
+ }
if (!LLDrawPoolAvatar::sSkipTransparent || LLPipeline::sImpostorRender)
{
@@ -4149,7 +4370,7 @@ U32 LLVOAvatar::renderRigid()
bool should_alpha_mask = shouldAlphaMask();
LLGLState test(GL_ALPHA_TEST, should_alpha_mask);
- if (should_alpha_mask)
+ if (should_alpha_mask && !LLGLSLShader::sNoFixedFunction)
{
gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.5f);
}
@@ -4160,7 +4381,10 @@ U32 LLVOAvatar::renderRigid()
num_indices += mMeshLOD[MESH_ID_EYEBALL_RIGHT]->render(mAdjustedPixelArea, TRUE, mIsDummy);
}
- gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
+ if (should_alpha_mask && !LLGLSLShader::sNoFixedFunction)
+ {
+ gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
+ }
return num_indices;
}
@@ -4208,7 +4432,7 @@ void LLVOAvatar::updateTextures()
{
BOOL render_avatar = TRUE;
- if (mIsDummy || gNoRender)
+ if (mIsDummy)
{
return;
}
@@ -4288,7 +4512,7 @@ void LLVOAvatar::updateTextures()
if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_TEXTURE_AREA))
{
- setDebugText(llformat("%4.0f:%4.0f", fsqrtf(mMinPixelArea),fsqrtf(mMaxPixelArea)));
+ setDebugText(llformat("%4.0f:%4.0f", (F32) sqrt(mMinPixelArea),(F32) sqrt(mMaxPixelArea)));
}
}
@@ -4430,7 +4654,6 @@ void LLVOAvatar::resolveRayCollisionAgent(const LLVector3d start_pt, const LLVec
LLWorld::getInstance()->resolveStepHeightGlobal(this, start_pt, end_pt, out_pos, out_norm, &obj);
}
-
void LLVOAvatar::resolveHeightGlobal(const LLVector3d &inPos, LLVector3d &outPos, LLVector3 &outNorm)
{
LLVector3d zVec(0.0f, 0.0f, 0.5f);
@@ -4482,11 +4705,6 @@ void LLVOAvatar::processAnimationStateChanges()
{
LLMemType mt(LLMemType::MTYPE_AVATAR);
- if (gNoRender)
- {
- return;
- }
-
if ( isAnyAnimationSignaled(AGENT_WALK_ANIMS, NUM_AGENT_WALK_ANIMS) )
{
startMotion(ANIM_AGENT_WALK_ADJUST);
@@ -4816,7 +5034,7 @@ void LLVOAvatar::addDebugText(const std::string& text)
//-----------------------------------------------------------------------------
// getID()
//-----------------------------------------------------------------------------
-const LLUUID& LLVOAvatar::getID()
+const LLUUID& LLVOAvatar::getID() const
{
return mID;
}
@@ -4832,6 +5050,67 @@ LLJoint *LLVOAvatar::getJoint( const std::string &name )
}
//-----------------------------------------------------------------------------
+// resetJointPositions
+//-----------------------------------------------------------------------------
+void LLVOAvatar::resetJointPositions( void )
+{
+ for(S32 i = 0; i < (S32)mNumJoints; ++i)
+ {
+ mSkeleton[i].restoreOldXform();
+ mSkeleton[i].setId( LLUUID::null );
+ }
+ mHasPelvisOffset = false;
+ mPelvisFixup = mLastPelvisFixup;
+}
+//-----------------------------------------------------------------------------
+// resetSpecificJointPosition
+//-----------------------------------------------------------------------------
+void LLVOAvatar::resetSpecificJointPosition( const std::string& name )
+{
+ LLJoint* pJoint = mRoot.findJoint( name );
+
+ if ( pJoint && pJoint->doesJointNeedToBeReset() )
+ {
+ pJoint->restoreOldXform();
+ pJoint->setId( LLUUID::null );
+ //If we're reseting the pelvis position make sure not to apply offset
+ if ( name == "mPelvis" )
+ {
+ mHasPelvisOffset = false;
+ }
+ }
+ else
+ {
+ llinfos<<"Did not find "<< name.c_str()<<llendl;
+ }
+}
+//-----------------------------------------------------------------------------
+// resetJointPositionsToDefault
+//-----------------------------------------------------------------------------
+void LLVOAvatar::resetJointPositionsToDefault( void )
+{
+
+ //Subsequent joints are relative to pelvis
+ for( S32 i = 0; i < (S32)mNumJoints; ++i )
+ {
+ LLJoint* pJoint = (LLJoint*)&mSkeleton[i];
+ if ( pJoint->doesJointNeedToBeReset() )
+ {
+
+ pJoint->setId( LLUUID::null );
+ //restore joints to default positions, however skip over the pelvis
+ if ( pJoint )
+ {
+ pJoint->restoreOldXform();
+ }
+ }
+ }
+ //make sure we don't apply the joint offset
+ mHasPelvisOffset = false;
+ mPelvisFixup = mLastPelvisFixup;
+ postPelvisSetRecalc();
+}
+//-----------------------------------------------------------------------------
// getCharacterPosition()
//-----------------------------------------------------------------------------
LLVector3 LLVOAvatar::getCharacterPosition()
@@ -4881,7 +5160,7 @@ void LLVOAvatar::getGround(const LLVector3 &in_pos_agent, LLVector3 &out_pos_age
LLVector3d z_vec(0.0f, 0.0f, 1.0f);
LLVector3d p0_global, p1_global;
- if (gNoRender || mIsDummy)
+ if (mIsDummy)
{
outNorm.setVec(z_vec);
out_pos_agent = in_pos_agent;
@@ -5153,18 +5432,6 @@ BOOL LLVOAvatar::loadAvatar()
}
}
- // Uncomment to enable avatar_lad.xml debugging.
- std::ofstream file;
- file.open("avatar_lad.log");
- for( LLViewerVisualParam* param = (LLViewerVisualParam*) getFirstVisualParam();
- param;
- param = (LLViewerVisualParam*) getNextVisualParam() )
- {
- param->getInfo()->toStream(file);
- file << std::endl;
- }
-
- file.close();
return TRUE;
}
@@ -5453,11 +5720,6 @@ BOOL LLVOAvatar::loadLayersets()
//-----------------------------------------------------------------------------
void LLVOAvatar::updateVisualParams()
{
- if (gNoRender)
- {
- return;
- }
-
setSex( (getVisualParamWeight( "male" ) > 0.5f) ? SEX_MALE : SEX_FEMALE );
LLCharacter::updateVisualParams();
@@ -5493,9 +5755,13 @@ void LLVOAvatar::setPixelAreaAndAngle(LLAgent &agent)
return;
}
- const LLVector3* ext = mDrawable->getSpatialExtents();
- LLVector3 center = (ext[1] + ext[0]) * 0.5f;
- LLVector3 size = (ext[1]-ext[0])*0.5f;
+ const LLVector4a* ext = mDrawable->getSpatialExtents();
+ LLVector4a center;
+ center.setAdd(ext[1], ext[0]);
+ center.mul(0.5f);
+ LLVector4a size;
+ size.setSub(ext[1], ext[0]);
+ size.mul(0.5f);
mImpostorPixelArea = LLPipeline::calcPixelArea(center, size, *LLViewerCamera::getInstance());
@@ -5507,7 +5773,7 @@ void LLVOAvatar::setPixelAreaAndAngle(LLAgent &agent)
}
else
{
- F32 radius = size.length();
+ F32 radius = size.getLength3().getF32();
mAppAngle = (F32) atan2( radius, range) * RAD_TO_DEG;
}
@@ -5818,6 +6084,60 @@ void LLVOAvatar::resetHUDAttachments()
}
}
+void LLVOAvatar::rebuildRiggedAttachments( void )
+{
+ for ( attachment_map_t::iterator iter = mAttachmentPoints.begin(); iter != mAttachmentPoints.end(); ++iter )
+ {
+ LLViewerJointAttachment* pAttachment = iter->second;
+ LLViewerJointAttachment::attachedobjs_vec_t::iterator attachmentIterEnd = pAttachment->mAttachedObjects.end();
+
+ for ( LLViewerJointAttachment::attachedobjs_vec_t::iterator attachmentIter = pAttachment->mAttachedObjects.begin();
+ attachmentIter != attachmentIterEnd; ++attachmentIter)
+ {
+ const LLViewerObject* pAttachedObject = *attachmentIter;
+ if ( pAttachment && pAttachedObject->mDrawable.notNull() )
+ {
+ gPipeline.markRebuild(pAttachedObject->mDrawable);
+ }
+ }
+ }
+}
+//-----------------------------------------------------------------------------
+// cleanupAttachedMesh()
+//-----------------------------------------------------------------------------
+void LLVOAvatar::cleanupAttachedMesh( LLViewerObject* pVO )
+{
+ //If a VO has a skin that we'll reset the joint positions to their default
+ if ( pVO && pVO->mDrawable )
+ {
+ LLVOVolume* pVObj = pVO->mDrawable->getVOVolume();
+ if ( pVObj )
+ {
+ const LLMeshSkinInfo* pSkinData = gMeshRepo.getSkinInfo( pVObj->getVolume()->getParams().getSculptID(), pVObj );
+ if ( pSkinData )
+ {
+ const int jointCnt = pSkinData->mJointNames.size();
+ bool fullRig = ( jointCnt>=20 ) ? true : false;
+ if ( fullRig )
+ {
+ const int bindCnt = pSkinData->mAlternateBindMatrix.size();
+ if ( bindCnt > 0 )
+ {
+ LLVOAvatar::resetJointPositionsToDefault();
+ //Need to handle the repositioning of the cam, updating rig data etc during outfit editing
+ //This handles the case where we detach a replacement rig.
+ if ( gAgentCamera.cameraCustomizeAvatar() )
+ {
+ gAgent.unpauseAnimation();
+ //Still want to refocus on head bone
+ gAgentCamera.changeCameraToCustomizeAvatar();
+ }
+ }
+ }
+ }
+ }
+ }
+}
//-----------------------------------------------------------------------------
// detachObject()
//-----------------------------------------------------------------------------
@@ -5828,14 +6148,23 @@ BOOL LLVOAvatar::detachObject(LLViewerObject *viewer_object)
++iter)
{
LLViewerJointAttachment* attachment = iter->second;
-
+
if (attachment->isObjectAttached(viewer_object))
{
+ cleanupAttachedMesh( viewer_object );
attachment->removeObject(viewer_object);
lldebugs << "Detaching object " << viewer_object->mID << " from " << attachment->getName() << llendl;
return TRUE;
}
}
+
+ std::vector<LLPointer<LLViewerObject> >::iterator iter = std::find(mPendingAttachment.begin(), mPendingAttachment.end(), viewer_object);
+ if (iter != mPendingAttachment.end())
+ {
+ mPendingAttachment.erase(iter);
+ return TRUE;
+ }
+
return FALSE;
}
@@ -6078,6 +6407,11 @@ BOOL LLVOAvatar::getIsCloud()
{
return TRUE;
}
+
+ if (isTooComplex())
+ {
+ return TRUE;
+ }
return FALSE;
}
@@ -6166,10 +6500,17 @@ BOOL LLVOAvatar::processFullyLoadedChange(bool loading)
BOOL LLVOAvatar::isFullyLoaded() const
{
- if (gSavedSettings.getBOOL("RenderUnloadedAvatar"))
- return TRUE;
- else
- return mFullyLoaded;
+ return (mRenderUnloadedAvatar || mFullyLoaded);
+}
+
+bool LLVOAvatar::isTooComplex() const
+{
+ if (gSavedSettings.getS32("RenderAvatarComplexityLimit") > 0 && mVisualComplexity >= gSavedSettings.getS32("RenderAvatarComplexityLimit"))
+ {
+ return true;
+ }
+
+ return false;
}
@@ -6188,8 +6529,6 @@ LLMotion* LLVOAvatar::findMotion(const LLUUID& id) const
void LLVOAvatar::updateMeshTextures()
{
// llinfos << "updateMeshTextures" << llendl;
- if (gNoRender) return;
-
// if user has never specified a texture, assign the default
for (U32 i=0; i < getNumTEs(); i++)
{
@@ -6225,11 +6564,9 @@ void LLVOAvatar::updateMeshTextures()
// When an avatar is changing clothes and not in Appearance mode,
// use the last-known good baked texture until it finish the first
// render of the new layerset.
-
const BOOL layerset_invalid = mBakedTextureDatas[i].mTexLayerSet
&& ( !mBakedTextureDatas[i].mTexLayerSet->getComposite()->isInitialized()
|| !mBakedTextureDatas[i].mTexLayerSet->isLocalTextureDataAvailable() );
-
use_lkg_baked_layer[i] = (!is_layer_baked[i]
&& (mBakedTextureDatas[i].mLastTextureIndex != IMG_DEFAULT_AVATAR)
&& layerset_invalid);
@@ -6845,11 +7182,6 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
}
}
- if (gNoRender)
- {
- return;
- }
-
ESex old_sex = getSex();
// llinfos << "LLVOAvatar::processAvatarAppearance()" << llendl;
@@ -6980,9 +7312,9 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
llinfos << "Re-requesting AvatarAppearance for object: " << getID() << llendl;
LLAvatarPropertiesProcessor::getInstance()->sendAvatarTexturesRequest(getID());
mRuthTimer.reset();
- }
- else
- {
+ }
+ else
+ {
llinfos << "That's okay, we already have a non-default shape for object: " << getID() << llendl;
// we don't really care.
}
@@ -7205,12 +7537,16 @@ void LLVOAvatar::useBakedTexture( const LLUUID& id )
void LLVOAvatar::dumpArchetypeXML( void* )
{
LLAPRFile outfile;
- outfile.open(gDirUtilp->getExpandedFilename(LL_PATH_CHARACTER,"new archetype.xml"), LL_APR_WB );
- apr_file_t* file = outfile.getFileHandle() ;
+ outfile.open(gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,"new archetype.xml"), LL_APR_WB );
+ apr_file_t* file = outfile.getFileHandle();
if (!file)
{
return;
}
+ else
+ {
+ llinfos << "xmlfile write handle obtained : " << gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,"new archetype.xml") << llendl;
+ }
apr_file_printf( file, "<?xml version=\"1.0\" encoding=\"US-ASCII\" standalone=\"yes\"?>\n" );
apr_file_printf( file, "<linden_genepool version=\"1.0\">\n" );
@@ -7250,6 +7586,11 @@ void LLVOAvatar::dumpArchetypeXML( void* )
}
apr_file_printf( file, "\t</archetype>\n" );
apr_file_printf( file, "\n</linden_genepool>\n" );
+ //explictly close the file if it is still open which it should be
+ if (file)
+ {
+ outfile.close();
+ }
}
@@ -7921,7 +8262,7 @@ BOOL LLVOAvatar::updateLOD()
BOOL res = updateJointLODs();
LLFace* facep = mDrawable->getFace(0);
- if (facep->mVertexBuffer.isNull())
+ if (!facep->getVertexBuffer())
{
dirtyMesh(2);
}
@@ -7933,12 +8274,16 @@ BOOL LLVOAvatar::updateLOD()
mNeedsSkin = TRUE;
mDrawable->clearState(LLDrawable::REBUILD_GEOMETRY);
}
-
updateVisibility();
return res;
}
+void LLVOAvatar::updateLODRiggedAttachments( void )
+{
+ updateLOD();
+ rebuildRiggedAttachments();
+}
U32 LLVOAvatar::getPartitionType() const
{
// Avatars merely exist as drawables in the bridge partition
@@ -7948,6 +8293,8 @@ U32 LLVOAvatar::getPartitionType() const
//static
void LLVOAvatar::updateImpostors()
{
+ LLCharacter::sAllowInstancesChange = FALSE ;
+
for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();
iter != LLCharacter::sInstances.end(); ++iter)
{
@@ -7957,11 +8304,13 @@ void LLVOAvatar::updateImpostors()
gPipeline.generateImpostor(avatar);
}
}
+
+ LLCharacter::sAllowInstancesChange = TRUE ;
}
BOOL LLVOAvatar::isImpostor() const
{
- return (sUseImpostors && mUpdatePeriod >= IMPOSTOR_PERIOD) ? TRUE : FALSE;
+ return (isVisuallyMuted() || (sUseImpostors && mUpdatePeriod >= IMPOSTOR_PERIOD)) ? TRUE : FALSE;
}
@@ -7990,9 +8339,9 @@ void LLVOAvatar::cacheImpostorValues()
getImpostorValues(mImpostorExtents, mImpostorAngle, mImpostorDistance);
}
-void LLVOAvatar::getImpostorValues(LLVector3* extents, LLVector3& angle, F32& distance) const
+void LLVOAvatar::getImpostorValues(LLVector4a* extents, LLVector3& angle, F32& distance) const
{
- const LLVector3* ext = mDrawable->getSpatialExtents();
+ const LLVector4a* ext = mDrawable->getSpatialExtents();
extents[0] = ext[0];
extents[1] = ext[1];
@@ -8006,18 +8355,23 @@ void LLVOAvatar::getImpostorValues(LLVector3* extents, LLVector3& angle, F32& di
void LLVOAvatar::idleUpdateRenderCost()
{
- static const U32 ARC_BODY_PART_COST = 20;
- static const U32 ARC_LIMIT = 2048;
+ static const U32 ARC_BODY_PART_COST = 200;
+ static const U32 ARC_LIMIT = 20000;
static std::set<LLUUID> all_textures;
+ if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_ATTACHMENT_BYTES))
+ { //set debug text to attachment geometry bytes here so render cost will override
+ setDebugText(llformat("%.1f KB, %.2f m^2", mAttachmentGeometryBytes/1024.f, mAttachmentSurfaceArea));
+ }
+
if (!gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SHAME))
{
return;
}
U32 cost = 0;
- std::set<LLUUID> textures;
+ LLVOVolume::texture_cost_t textures;
for (U8 baked_index = 0; baked_index < BAKED_NUM_INDICES; baked_index++)
{
@@ -8032,6 +8386,7 @@ void LLVOAvatar::idleUpdateRenderCost()
}
}
+
for (attachment_map_t::const_iterator iter = mAttachmentPoints.begin();
iter != mAttachmentPoints.end();
++iter)
@@ -8044,6 +8399,7 @@ void LLVOAvatar::idleUpdateRenderCost()
const LLViewerObject* attached_object = (*attachment_iter);
if (attached_object && !attached_object->isHUDAttachment())
{
+ textures.clear();
const LLDrawable* drawable = attached_object->mDrawable;
if (drawable)
{
@@ -8051,20 +8407,43 @@ void LLVOAvatar::idleUpdateRenderCost()
if (volume)
{
cost += volume->getRenderCost(textures);
+
+ const_child_list_t children = volume->getChildren();
+ for (const_child_list_t::const_iterator child_iter = children.begin();
+ child_iter != children.end();
+ ++child_iter)
+ {
+ LLViewerObject* child_obj = *child_iter;
+ LLVOVolume *child = dynamic_cast<LLVOVolume*>( child_obj );
+ if (child)
+ {
+ cost += child->getRenderCost(textures);
+ }
+ }
+
+ for (LLVOVolume::texture_cost_t::iterator iter = textures.begin(); iter != textures.end(); ++iter)
+ {
+ // add the cost of each individual texture in the linkset
+ cost += iter->second;
+ }
}
}
}
}
+
}
+
+
+
// Diagnostic output to identify all avatar-related textures.
// Does not affect rendering cost calculation.
// Could be wrapped in a debug option if output becomes problematic.
if (isSelf())
{
// print any attachment textures we didn't already know about.
- for (std::set<LLUUID>::iterator it = textures.begin(); it != textures.end(); ++it)
+ for (LLVOVolume::texture_cost_t::iterator it = textures.begin(); it != textures.end(); ++it)
{
- LLUUID image_id = *it;
+ LLUUID image_id = it->first;
if( image_id.isNull() || image_id == IMG_DEFAULT || image_id == IMG_DEFAULT_AVATAR)
continue;
if (all_textures.find(image_id) == all_textures.end())
@@ -8095,9 +8474,9 @@ void LLVOAvatar::idleUpdateRenderCost()
}
}
}
- cost += textures.size() * LLVOVolume::ARC_TEXTURE_COST;
setDebugText(llformat("%d", cost));
+ mVisualComplexity = cost;
F32 green = 1.f-llclamp(((F32) cost-(F32)ARC_LIMIT)/(F32)ARC_LIMIT, 0.f, 1.f);
F32 red = llmin((F32) cost/(F32)ARC_LIMIT, 1.f);
mText->setColor(LLColor4(red,green,0,1));
diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h
index a779a1735c..6a4e09593c 100644
--- a/indra/newview/llvoavatar.h
+++ b/indra/newview/llvoavatar.h
@@ -40,6 +40,7 @@
#include "lldrawpoolalpha.h"
#include "llviewerobject.h"
#include "llcharacter.h"
+#include "llcontrol.h"
#include "llviewerjointmesh.h"
#include "llviewerjointattachment.h"
#include "llrendertarget.h"
@@ -50,6 +51,7 @@
extern const LLUUID ANIM_AGENT_BODY_NOISE;
extern const LLUUID ANIM_AGENT_BREATHE_ROT;
+extern const LLUUID ANIM_AGENT_PHYSICS_MOTION;
extern const LLUUID ANIM_AGENT_EDITING;
extern const LLUUID ANIM_AGENT_EYE;
extern const LLUUID ANIM_AGENT_FLY_ADJUST;
@@ -76,6 +78,8 @@ class LLVOAvatar :
public LLCharacter,
public boost::signals2::trackable
{
+ LOG_CLASS(LLVOAvatar);
+
public:
friend class LLVOAvatarSelf;
protected:
@@ -122,10 +126,11 @@ public:
virtual BOOL idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);
virtual BOOL updateLOD();
BOOL updateJointLODs();
+ void updateLODRiggedAttachments( void );
virtual BOOL isActive() const; // Whether this object needs to do an idleUpdate.
virtual void updateTextures();
virtual S32 setTETexture(const U8 te, const LLUUID& uuid); // If setting a baked texture, need to request it from a non-local sim.
- virtual void onShift(const LLVector3& shift_vector);
+ virtual void onShift(const LLVector4a& shift_vector);
virtual U32 getPartitionType() const;
virtual const LLVector3 getRenderPosition() const;
virtual void updateDrawable(BOOL force_damped);
@@ -133,8 +138,8 @@ public:
virtual BOOL updateGeometry(LLDrawable *drawable);
virtual void setPixelAreaAndAngle(LLAgent &agent);
virtual void updateRegion(LLViewerRegion *regionp);
- virtual void updateSpatialExtents(LLVector3& newMin, LLVector3 &newMax);
- virtual void getSpatialExtents(LLVector3& newMin, LLVector3& newMax);
+ virtual void updateSpatialExtents(LLVector4a& newMin, LLVector4a &newMax);
+ virtual void getSpatialExtents(LLVector4a& newMin, LLVector4a& newMax);
virtual BOOL lineSegmentIntersect(const LLVector3& start, const LLVector3& end,
S32 face = -1, // which face to check, -1 = ALL_SIDES
BOOL pick_transparent = FALSE,
@@ -143,6 +148,14 @@ public:
LLVector2* tex_coord = NULL, // return the texture coordinates of the intersection point
LLVector3* normal = NULL, // return the surface normal at the intersection point
LLVector3* bi_normal = NULL); // return the surface bi-normal at the intersection point
+ LLViewerObject* lineSegmentIntersectRiggedAttachments(const LLVector3& start, const LLVector3& end,
+ S32 face = -1, // which face to check, -1 = ALL_SIDES
+ BOOL pick_transparent = FALSE,
+ S32* face_hit = NULL, // which face was hit
+ LLVector3* intersection = NULL, // return the intersection point
+ LLVector2* tex_coord = NULL, // return the texture coordinates of the intersection point
+ LLVector3* normal = NULL, // return the surface normal at the intersection point
+ LLVector3* bi_normal = NULL); // return the surface bi-normal at the intersection point
//--------------------------------------------------------------------
// LLCharacter interface and related
@@ -166,9 +179,13 @@ public:
virtual LLJoint* getJoint(const std::string &name);
virtual LLJoint* getRootJoint() { return &mRoot; }
-
+
+ void resetJointPositions( void );
+ void resetJointPositionsToDefault( void );
+ void resetSpecificJointPosition( const std::string& name );
+
virtual const char* getAnimationPrefix() { return "avatar"; }
- virtual const LLUUID& getID();
+ virtual const LLUUID& getID() const;
virtual LLVector3 getVolumePos(S32 joint_index, LLVector3& volume_offset);
virtual LLJoint* findCollisionVolume(U32 volume_id);
virtual S32 getCollisionVolumeID(std::string &name);
@@ -195,6 +212,10 @@ public:
public:
virtual bool isSelf() const { return false; } // True if this avatar is for this viewer's agent
bool isBuilt() const { return mIsBuilt; }
+
+private: //aligned members
+ LLVector4a mImpostorExtents[2];
+
private:
BOOL mSupportsAlphaLayers; // For backwards compatibility, TRUE for 1.23+ clients
@@ -240,6 +261,7 @@ public:
static BOOL sDebugInvisible;
static BOOL sShowAttachmentPoints;
static F32 sLODFactor; // user-settable LOD factor
+ static F32 sPhysicsLODFactor; // user-settable physics LOD factor
static BOOL sJointDebug; // output total number of joints being touched for each avatar
static BOOL sDebugAvatarRotation;
@@ -254,6 +276,7 @@ public:
//--------------------------------------------------------------------
public:
BOOL isFullyLoaded() const;
+ bool isTooComplex() const;
bool visualParamWeightsAreDefault();
protected:
virtual BOOL getIsCloud();
@@ -266,6 +289,7 @@ private:
BOOL mPreviousFullyLoaded;
BOOL mFullyLoadedInitialized;
S32 mFullyLoadedFrameCounter;
+ S32 mVisualComplexity;
LLFrameTimer mFullyLoadedTimer;
LLFrameTimer mRuthTimer;
protected:
@@ -283,6 +307,16 @@ protected:
public:
void updateHeadOffset();
F32 getPelvisToFoot() const { return mPelvisToFoot; }
+ void setPelvisOffset( bool hasOffset, const LLVector3& translation, F32 offset ) ;
+ bool hasPelvisOffset( void ) { return mHasPelvisOffset; }
+ void postPelvisSetRecalc( void );
+ void setPelvisOffset( F32 pelvixFixupAmount );
+
+ bool mHasPelvisOffset;
+ LLVector3 mPelvisOffset;
+ F32 mLastPelvisToFoot;
+ F32 mPelvisFixup;
+ F32 mLastPelvisFixup;
LLVector3 mHeadOffset; // current head position
LLViewerJoint mRoot;
@@ -348,8 +382,12 @@ private:
public:
U32 renderImpostor(LLColor4U color = LLColor4U(255,255,255,255), S32 diffuse_channel = 0);
+ bool isVisuallyMuted() const;
+
U32 renderRigid();
U32 renderSkinned(EAvatarRenderPass pass);
+ F32 getLastSkinTime() { return mLastSkinTime; }
+ U32 renderSkinnedAttachments();
U32 renderTransparent(BOOL first_pass);
void renderCollisionVolumes();
static void deleteCachedImages(bool clearAll=true);
@@ -357,10 +395,15 @@ public:
static void restoreGL();
BOOL mIsDummy; // for special views
S32 mSpecialRenderMode; // special lighting
+ U32 mAttachmentGeometryBytes; //number of bytes in attached geometry
+ F32 mAttachmentSurfaceArea; //estimated surface area of attachments
+
private:
bool shouldAlphaMask();
BOOL mNeedsSkin; // avatar has been animated and verts have not been updated
+ F32 mLastSkinTime; //value of gFrameTimeSeconds at last skin update
+
S32 mUpdatePeriod;
S32 mNumInitFaces; //number of faces generated when creating the avatar drawable, does not inculde splitted faces due to long vertex buffer.
@@ -400,7 +443,7 @@ public:
BOOL needsImpostorUpdate() const;
const LLVector3& getImpostorOffset() const;
const LLVector2& getImpostorDim() const;
- void getImpostorValues(LLVector3* extents, LLVector3& angle, F32& distance) const;
+ void getImpostorValues(LLVector4a* extents, LLVector3& angle, F32& distance) const;
void cacheImpostorValues();
void setImpostorDim(const LLVector2& dim);
static void resetImpostors();
@@ -411,11 +454,12 @@ private:
LLVector3 mImpostorOffset;
LLVector2 mImpostorDim;
BOOL mNeedsAnimUpdate;
- LLVector3 mImpostorExtents[2];
LLVector3 mImpostorAngle;
F32 mImpostorDistance;
F32 mImpostorPixelArea;
LLVector3 mLastAnimExtents[2];
+
+ LLCachedControl<bool> mRenderUnloadedAvatar;
//--------------------------------------------------------------------
// Wind rippling in clothes
@@ -669,10 +713,12 @@ public:
void clampAttachmentPositions();
virtual const LLViewerJointAttachment* attachObject(LLViewerObject *viewer_object);
virtual BOOL detachObject(LLViewerObject *viewer_object);
+ void cleanupAttachedMesh( LLViewerObject* pVO );
static LLVOAvatar* findAvatarFromAttachment(LLViewerObject* obj);
protected:
LLViewerJointAttachment* getTargetAttachmentPoint(LLViewerObject* viewer_object);
void lazyAttach();
+ void rebuildRiggedAttachments( void );
//--------------------------------------------------------------------
// Map of attachment points, by ID
@@ -784,6 +830,7 @@ protected:
//--------------------------------------------------------------------
public:
void resolveHeightGlobal(const LLVector3d &inPos, LLVector3d &outPos, LLVector3 &outNorm);
+ bool distanceToGround( const LLVector3d &startPoint, LLVector3d &collisionPoint, F32 distToIntersectionAlongRay );
void resolveHeightAgent(const LLVector3 &inPos, LLVector3 &outPos, LLVector3 &outNorm);
void resolveRayCollisionAgent(const LLVector3d start_pt, const LLVector3d end_pt, LLVector3d &out_pos, LLVector3 &out_norm);
void slamPosition(); // Slam position to transmitted position (for teleport);
diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp
index 0250627d1b..f063653cc5 100644
--- a/indra/newview/llvoavatarself.cpp
+++ b/indra/newview/llvoavatarself.cpp
@@ -56,6 +56,8 @@
#include "llviewerstats.h"
#include "llviewerregion.h"
#include "llappearancemgr.h"
+#include "llmeshrepository.h"
+#include "llvovolume.h"
#if LL_MSVC
// disable boost::lexical_cast warning
@@ -64,10 +66,11 @@
#include <boost/lexical_cast.hpp>
-LLVOAvatarSelf *gAgentAvatarp = NULL;
+LLPointer<LLVOAvatarSelf> gAgentAvatarp = NULL;
+
BOOL isAgentAvatarValid()
{
- return (gAgentAvatarp &&
+ return (gAgentAvatarp.notNull() &&
(gAgentAvatarp->getRegion() != NULL) &&
(!gAgentAvatarp->isDead()));
}
@@ -363,9 +366,9 @@ BOOL LLVOAvatarSelf::buildMenus()
item_params.label = sub_piemenu_name;
}
item_params.name =(item_params.label );
- item_params.on_click.function_name = "Attachment.Detach";
+ item_params.on_click.function_name = "Attachment.DetachFromPoint";
item_params.on_click.parameter = iter->first;
- item_params.on_enable.function_name = "Attachment.EnableDetach";
+ item_params.on_enable.function_name = "Attachment.PointFilled";
item_params.on_enable.parameter = iter->first;
LLMenuItemCallGL* item = LLUICtrlFactory::create<LLMenuItemCallGL>(item_params);
@@ -623,6 +626,7 @@ BOOL LLVOAvatarSelf::updateCharacter(LLAgent &agent)
mScreenp->updateWorldMatrixChildren();
resetHUDAttachments();
}
+
return LLVOAvatar::updateCharacter(agent);
}
@@ -648,7 +652,11 @@ LLJoint *LLVOAvatarSelf::getJoint(const std::string &name)
}
return LLVOAvatar::getJoint(name);
}
-
+//virtual
+void LLVOAvatarSelf::resetJointPositions( void )
+{
+ return LLVOAvatar::resetJointPositions();
+}
// virtual
BOOL LLVOAvatarSelf::setVisualParamWeight(LLVisualParam *which_param, F32 weight, BOOL upload_bake )
{
@@ -783,11 +791,19 @@ void LLVOAvatarSelf::removeMissingBakedTextures()
for (U32 i = 0; i < mBakedTextureDatas.size(); i++)
{
const S32 te = mBakedTextureDatas[i].mTextureIndex;
- LLViewerTexture* tex = getTEImage(te) ;
+ const LLViewerTexture* tex = getTEImage(te);
+
+ // Replace with default if we can't find the asset, assuming the
+ // default is actually valid (which it should be unless something
+ // is seriously wrong).
if (!tex || tex->isMissingAsset())
{
- setTEImage(te, LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT_AVATAR));
- removed = TRUE;
+ LLViewerTexture *imagep = LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT_AVATAR);
+ if (imagep)
+ {
+ setTEImage(te, imagep);
+ removed = TRUE;
+ }
}
}
@@ -823,7 +839,6 @@ void LLVOAvatarSelf::updateRegion(LLViewerRegion *regionp)
// << llendl;
}
-
if (!regionp || (regionp->getHandle() != mLastRegionHandle))
{
if (mLastRegionHandle != 0)
@@ -1010,6 +1025,13 @@ void LLVOAvatarSelf::wearableUpdated( LLWearableType::EType type, BOOL upload_re
}
}
}
+
+ // Physics type has no associated baked textures, but change of params needs to be sent to
+ // other avatars.
+ if (type == LLWearableType::WT_PHYSICS)
+ {
+ gAgent.sendAgentSetAppearance();
+ }
}
//-----------------------------------------------------------------------------
@@ -1125,6 +1147,7 @@ const LLViewerJointAttachment *LLVOAvatarSelf::attachObject(LLViewerObject *view
LLAppearanceMgr::instance().registerAttachment(attachment_id);
// Clear any pending requests once the attachment arrives.
removeAttachmentRequest(attachment_id);
+ updateLODRiggedAttachments();
}
return attachment;
@@ -1134,8 +1157,10 @@ const LLViewerJointAttachment *LLVOAvatarSelf::attachObject(LLViewerObject *view
BOOL LLVOAvatarSelf::detachObject(LLViewerObject *viewer_object)
{
const LLUUID attachment_id = viewer_object->getAttachmentItemID();
- if (LLVOAvatar::detachObject(viewer_object))
+ if ( LLVOAvatar::detachObject(viewer_object) )
{
+ LLVOAvatar::cleanupAttachedMesh( viewer_object );
+
// the simulator should automatically handle permission revocation
stopMotionFromSource(attachment_id);
@@ -1550,7 +1575,7 @@ void LLVOAvatarSelf::invalidateAll()
{
invalidateComposite(mBakedTextureDatas[i].mTexLayerSet, TRUE);
}
- mDebugSelfLoadTimer.reset();
+ //mDebugSelfLoadTimer.reset();
}
//-----------------------------------------------------------------------------
@@ -1872,11 +1897,13 @@ BOOL LLVOAvatarSelf::getIsCloud()
gAgentWearables.getWearableCount(LLWearableType::WT_EYES) == 0 ||
gAgentWearables.getWearableCount(LLWearableType::WT_SKIN) == 0)
{
+ lldebugs << "No body parts" << llendl;
return TRUE;
}
if (!isTextureDefined(TEX_HAIR, 0))
{
+ lldebugs << "No hair texture" << llendl;
return TRUE;
}
@@ -1885,12 +1912,14 @@ BOOL LLVOAvatarSelf::getIsCloud()
if (!isLocalTextureDataAvailable(mBakedTextureDatas[BAKED_LOWER].mTexLayerSet) &&
(!isTextureDefined(TEX_LOWER_BAKED, 0)))
{
+ lldebugs << "Lower textures not baked" << llendl;
return TRUE;
}
if (!isLocalTextureDataAvailable(mBakedTextureDatas[BAKED_UPPER].mTexLayerSet) &&
(!isTextureDefined(TEX_UPPER_BAKED, 0)))
{
+ lldebugs << "Upper textures not baked" << llendl;
return TRUE;
}
@@ -1907,10 +1936,12 @@ BOOL LLVOAvatarSelf::getIsCloud()
const LLViewerTexture* baked_img = getImage( texture_data.mTextureIndex, 0 );
if (!baked_img || !baked_img->hasGLTexture())
{
+ lldebugs << "Texture at index " << i << " (texture index is " << texture_data.mTextureIndex << ") is not loaded" << llendl;
return TRUE;
}
}
+ lldebugs << "Avatar de-clouded" << llendl;
}
return FALSE;
}
@@ -2234,6 +2265,7 @@ void LLVOAvatarSelf::setNewBakedTexture( ETextureIndex te, const LLUUID& uuid )
}
}
+// FIXME: This is never called. Something may be broken.
void LLVOAvatarSelf::outputRezDiagnostics() const
{
if(!gSavedSettings.getBOOL("DebugAvatarLocalTexLoadedTime"))
@@ -2291,6 +2323,18 @@ void LLVOAvatarSelf::outputRezDiagnostics() const
}
}
+void LLVOAvatarSelf::outputRezTiming(const std::string& msg) const
+{
+ LL_DEBUGS("Avatar Rez")
+ << llformat("%s. Time from avatar creation: %.2f", msg.c_str(), mDebugSelfLoadTimer.getElapsedTimeF32())
+ << llendl;
+}
+
+void LLVOAvatarSelf::reportAvatarRezTime() const
+{
+ // TODO: report mDebugSelfLoadTimer.getElapsedTimeF32() somehow.
+}
+
//-----------------------------------------------------------------------------
// setCachedBakedTexture()
// A baked texture id was received from a cache query, make it active
@@ -2499,10 +2543,6 @@ bool LLVOAvatarSelf::sendAppearanceMessage(LLMessageSystem *mesgsys) const
//------------------------------------------------------------------------
BOOL LLVOAvatarSelf::needsRenderBeam()
{
- if (gNoRender)
- {
- return FALSE;
- }
LLTool *tool = LLToolMgr::getInstance()->getCurrentTool();
BOOL is_touching_or_grabbing = (tool == LLToolGrab::getInstance() && LLToolGrab::getInstance()->isEditing());
@@ -2538,7 +2578,7 @@ void LLVOAvatarSelf::deleteScratchTextures()
LLImageGL::decTextureCounter(tex_size, 1, LLViewerTexture::AVATAR_SCRATCH_TEX) ;
total_tex_size -= tex_size ;
}
- if( sScratchTexNames.checkData( GL_LUMINANCE_ALPHA ) )
+ if( sScratchTexNames.checkData( LLRender::sGLCoreProfile ? GL_RG : GL_LUMINANCE_ALPHA ) )
{
LLImageGL::decTextureCounter(tex_size, 2, LLViewerTexture::AVATAR_SCRATCH_TEX) ;
total_tex_size -= 2 * tex_size ;
@@ -2580,89 +2620,6 @@ void LLVOAvatarSelf::deleteScratchTextures()
}
}
-BOOL LLVOAvatarSelf::bindScratchTexture( LLGLenum format )
-{
- U32 texture_bytes = 0;
- S32 components = 0;
- GLuint gl_name = getScratchTexName( format, components, &texture_bytes );
- if( gl_name )
- {
- gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, gl_name);
- stop_glerror();
-
- F32* last_bind_time = sScratchTexLastBindTime.getIfThere( format );
- if( last_bind_time )
- {
- if( *last_bind_time != LLImageGL::sLastFrameTime )
- {
- *last_bind_time = LLImageGL::sLastFrameTime;
- LLImageGL::updateBoundTexMem(texture_bytes, components, LLViewerTexture::AVATAR_SCRATCH_TEX) ;
- }
- }
- else
- {
- LLImageGL::updateBoundTexMem(texture_bytes, components, LLViewerTexture::AVATAR_SCRATCH_TEX) ;
- sScratchTexLastBindTime.addData( format, new F32(LLImageGL::sLastFrameTime) );
- }
- return TRUE;
- }
- return FALSE;
-}
-
-LLGLuint LLVOAvatarSelf::getScratchTexName( LLGLenum format, S32& components, U32* texture_bytes )
-{
- GLenum internal_format;
- switch( format )
- {
- case GL_LUMINANCE: components = 1; internal_format = GL_LUMINANCE8; break;
- case GL_ALPHA: components = 1; internal_format = GL_ALPHA8; break;
- case GL_LUMINANCE_ALPHA: components = 2; internal_format = GL_LUMINANCE8_ALPHA8; break;
- case GL_RGB: components = 3; internal_format = GL_RGB8; break;
- case GL_RGBA: components = 4; internal_format = GL_RGBA8; break;
- default: llassert(0); components = 4; internal_format = GL_RGBA8; break;
- }
-
- *texture_bytes = components * SCRATCH_TEX_WIDTH * SCRATCH_TEX_HEIGHT;
-
- if( sScratchTexNames.checkData( format ) )
- {
- return *( sScratchTexNames.getData( format ) );
- }
-
- LLGLSUIDefault gls_ui;
-
- U32 name = 0;
- LLImageGL::generateTextures(1, &name );
- stop_glerror();
-
- gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, name);
- stop_glerror();
-
- LLImageGL::setManualImage(
- GL_TEXTURE_2D, 0, internal_format,
- SCRATCH_TEX_WIDTH, SCRATCH_TEX_HEIGHT,
- format, GL_UNSIGNED_BYTE, NULL );
- stop_glerror();
-
- gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR);
- gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
- stop_glerror();
-
- gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- stop_glerror();
-
- sScratchTexNames.addData( format, new LLGLuint( name ) );
-
- sScratchTexBytes += *texture_bytes;
- LLImageGL::sGlobalTextureMemoryInBytes += *texture_bytes;
-
- if(gAuditTexture)
- {
- LLImageGL::incTextureCounter(SCRATCH_TEX_WIDTH * SCRATCH_TEX_HEIGHT, components, LLViewerTexture::AVATAR_SCRATCH_TEX) ;
- }
- return name;
-}
-
// static
void LLVOAvatarSelf::dumpScratchTextureByteCount()
{
diff --git a/indra/newview/llvoavatarself.h b/indra/newview/llvoavatarself.h
index d13cf5ba38..655fb3a012 100644
--- a/indra/newview/llvoavatarself.h
+++ b/indra/newview/llvoavatarself.h
@@ -41,6 +41,7 @@ struct LocalTextureData;
class LLVOAvatarSelf :
public LLVOAvatar
{
+ LOG_CLASS(LLVOAvatarSelf);
/********************************************************************************
** **
@@ -83,7 +84,9 @@ public:
/*virtual*/ void stopMotionFromSource(const LLUUID& source_id);
/*virtual*/ void requestStopMotion(LLMotion* motion);
/*virtual*/ LLJoint* getJoint(const std::string &name);
-
+
+ void resetJointPositions( void );
+
/*virtual*/ BOOL setVisualParamWeight(LLVisualParam *which_param, F32 weight, BOOL upload_bake = FALSE );
/*virtual*/ BOOL setVisualParamWeight(const char* param_name, F32 weight, BOOL upload_bake = FALSE );
/*virtual*/ BOOL setVisualParamWeight(S32 index, F32 weight, BOOL upload_bake = FALSE );
@@ -247,10 +250,7 @@ public:
// Scratch textures (used for compositing)
//--------------------------------------------------------------------
public:
- BOOL bindScratchTexture(LLGLenum format);
static void deleteScratchTextures();
-protected:
- LLGLuint getScratchTexName(LLGLenum format, S32& components, U32* texture_bytes);
private:
static S32 sScratchTexBytes;
static LLMap< LLGLenum, LLGLuint*> sScratchTexNames;
@@ -359,6 +359,8 @@ public:
void debugWearablesLoaded() { mDebugTimeWearablesLoaded = mDebugSelfLoadTimer.getElapsedTimeF32(); }
void debugAvatarVisible() { mDebugTimeAvatarVisible = mDebugSelfLoadTimer.getElapsedTimeF32(); }
void outputRezDiagnostics() const;
+ void outputRezTiming(const std::string& msg) const;
+ void reportAvatarRezTime() const;
void debugBakedTextureUpload(LLVOAvatarDefines::EBakedTextureIndex index, BOOL finished);
static void debugOnTimingLocalTexLoaded(BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata);
@@ -381,7 +383,7 @@ private:
};
-extern LLVOAvatarSelf *gAgentAvatarp;
+extern LLPointer<LLVOAvatarSelf> gAgentAvatarp;
BOOL isAgentAvatarValid();
diff --git a/indra/newview/llvocache.cpp b/indra/newview/llvocache.cpp
index 145ee31260..7db19c5c1b 100644
--- a/indra/newview/llvocache.cpp
+++ b/indra/newview/llvocache.cpp
@@ -40,6 +40,7 @@ BOOL check_write(LLAPRFile* apr_file, void* src, S32 n_bytes)
return apr_file->write(src, n_bytes) == n_bytes ;
}
+
//---------------------------------------------------------------------------
// LLVOCacheEntry
//---------------------------------------------------------------------------
@@ -70,10 +71,12 @@ LLVOCacheEntry::LLVOCacheEntry()
}
LLVOCacheEntry::LLVOCacheEntry(LLAPRFile* apr_file)
+ : mBuffer(NULL)
{
S32 size = -1;
BOOL success;
+ mDP.assignBuffer(mBuffer, 0);
success = check_read(apr_file, &mLocalID, sizeof(U32));
if(success)
{
@@ -134,7 +137,7 @@ LLVOCacheEntry::LLVOCacheEntry(LLAPRFile* apr_file)
LLVOCacheEntry::~LLVOCacheEntry()
{
- delete [] mBuffer;
+ mDP.freeBuffer();
}
@@ -212,8 +215,8 @@ BOOL LLVOCacheEntry::writeToFile(LLAPRFile* apr_file) const
if(success)
{
success = check_write(apr_file, (void*)mBuffer, size);
+ }
}
-}
return success ;
}
@@ -224,7 +227,9 @@ BOOL LLVOCacheEntry::writeToFile(LLAPRFile* apr_file) const
// Format string used to construct filename for the object cache
static const char OBJECT_CACHE_FILENAME[] = "objects_%d_%d.slc";
-const U32 NUM_ENTRIES_TO_PURGE = 16 ;
+const U32 MAX_NUM_OBJECT_ENTRIES = 128 ;
+const U32 MIN_ENTRIES_TO_PURGE = 16 ;
+const U32 INVALID_TIME = 0 ;
const char* object_cache_dirname = "objectcache";
const char* header_filename = "object.cache";
@@ -278,30 +283,33 @@ LLVOCache::~LLVOCache()
void LLVOCache::setDirNames(ELLPath location)
{
- std::string delem = gDirUtilp->getDirDelimiter();
-
mHeaderFileName = gDirUtilp->getExpandedFilename(location, object_cache_dirname, header_filename);
mObjectCacheDirName = gDirUtilp->getExpandedFilename(location, object_cache_dirname);
}
void LLVOCache::initCache(ELLPath location, U32 size, U32 cache_version)
{
- if(mInitialized || !mEnabled)
+ if(!mEnabled)
+ {
+ llwarns << "Not initializing cache: Cache is currently disabled." << llendl;
+ return ;
+ }
+
+ if(mInitialized)
{
+ llwarns << "Cache already initialized." << llendl;
return ;
}
+ mInitialized = TRUE ;
setDirNames(location);
if (!mReadOnly)
{
LLFile::mkdir(mObjectCacheDirName);
}
-
- mCacheSize = size;
-
+ mCacheSize = llclamp(size, MIN_ENTRIES_TO_PURGE, MAX_NUM_OBJECT_ENTRIES);
mMetaInfo.mVersion = cache_version;
- readCacheHeader();
- mInitialized = TRUE ;
+ readCacheHeader();
if(mMetaInfo.mVersion != cache_version)
{
@@ -321,12 +329,15 @@ void LLVOCache::removeCache(ELLPath location)
{
if(mReadOnly)
{
+ llwarns << "Not removing cache at " << location << ": Cache is currently in read-only mode." << llendl;
return ;
}
- std::string delem = gDirUtilp->getDirDelimiter();
- std::string mask = delem + "*";
+ llinfos << "about to remove the object cache due to settings." << llendl ;
+
+ std::string mask = "*";
std::string cache_dir = gDirUtilp->getExpandedFilename(location, object_cache_dirname);
+ llinfos << "Removing cache at " << cache_dir << llendl;
gDirUtilp->deleteFilesInDir(cache_dir, mask); //delete all files
LLFile::rmdir(cache_dir);
@@ -339,17 +350,55 @@ void LLVOCache::removeCache()
llassert_always(mInitialized) ;
if(mReadOnly)
{
+ llwarns << "Not clearing object cache: Cache is currently in read-only mode." << llendl;
return ;
}
- std::string delem = gDirUtilp->getDirDelimiter();
- std::string mask = delem + "*";
+ llinfos << "about to remove the object cache due to some error." << llendl ;
+
+ std::string mask = "*";
+ llinfos << "Removing cache at " << mObjectCacheDirName << llendl;
gDirUtilp->deleteFilesInDir(mObjectCacheDirName, mask);
clearCacheInMemory() ;
writeCacheHeader();
}
+void LLVOCache::removeEntry(HeaderEntryInfo* entry)
+{
+ llassert_always(mInitialized) ;
+ if(mReadOnly)
+ {
+ return ;
+ }
+ if(!entry)
+ {
+ return ;
+ }
+
+ header_entry_queue_t::iterator iter = mHeaderEntryQueue.find(entry) ;
+ if(iter != mHeaderEntryQueue.end())
+ {
+ mHandleEntryMap.erase(entry->mHandle) ;
+ mHeaderEntryQueue.erase(iter) ;
+ removeFromCache(entry) ;
+ delete entry ;
+
+ mNumEntries = mHandleEntryMap.size() ;
+ }
+}
+
+void LLVOCache::removeEntry(U64 handle)
+{
+ handle_entry_map_t::iterator iter = mHandleEntryMap.find(handle) ;
+ if(iter == mHandleEntryMap.end()) //no cache
+ {
+ return ;
+ }
+ HeaderEntryInfo* entry = iter->second ;
+ removeEntry(entry) ;
+}
+
void LLVOCache::clearCacheInMemory()
{
if(!mHeaderEntryQueue.empty())
@@ -362,6 +411,7 @@ void LLVOCache::clearCacheInMemory()
mHandleEntryMap.clear();
mNumEntries = 0 ;
}
+
}
void LLVOCache::getObjectCacheFilename(U64 handle, std::string& filename)
@@ -375,146 +425,169 @@ void LLVOCache::getObjectCacheFilename(U64 handle, std::string& filename)
return ;
}
-void LLVOCache::removeFromCache(U64 handle)
+void LLVOCache::removeFromCache(HeaderEntryInfo* entry)
{
if(mReadOnly)
{
+ llwarns << "Not removing cache for handle " << entry->mHandle << ": Cache is currently in read-only mode." << llendl;
return ;
}
std::string filename;
- getObjectCacheFilename(handle, filename);
- LLAPRFile::remove(filename, mLocalAPRFilePoolp);
-}
-
-BOOL LLVOCache::checkRead(LLAPRFile* apr_file, void* src, S32 n_bytes)
-{
- if(!check_read(apr_file, src, n_bytes))
- {
- delete apr_file ;
- removeCache() ;
- return FALSE ;
- }
-
- return TRUE ;
-}
-
-BOOL LLVOCache::checkWrite(LLAPRFile* apr_file, void* src, S32 n_bytes)
-{
- if(!check_write(apr_file, src, n_bytes))
- {
- delete apr_file ;
- removeCache() ;
- return FALSE ;
- }
-
- return TRUE ;
+ getObjectCacheFilename(entry->mHandle, filename);
+ LLAPRFile::remove(filename, mLocalAPRFilePoolp);
+ entry->mTime = INVALID_TIME ;
+ updateEntry(entry) ; //update the head file.
}
void LLVOCache::readCacheHeader()
{
if(!mEnabled)
{
- return ;
+ llwarns << "Not reading cache header: Cache is currently disabled." << llendl;
+ return;
}
//clear stale info.
clearCacheInMemory();
+ bool success = true ;
if (LLAPRFile::isExist(mHeaderFileName, mLocalAPRFilePoolp))
{
- LLAPRFile* apr_file = new LLAPRFile(mHeaderFileName, APR_READ|APR_BINARY, mLocalAPRFilePoolp);
+ LLAPRFile apr_file(mHeaderFileName, APR_READ|APR_BINARY, mLocalAPRFilePoolp);
//read the meta element
- if(!checkRead(apr_file, &mMetaInfo, sizeof(HeaderMetaInfo)))
- {
- return ;
- }
-
- HeaderEntryInfo* entry ;
- mNumEntries = 0 ;
- while(mNumEntries < mCacheSize)
+ success = check_read(&apr_file, &mMetaInfo, sizeof(HeaderMetaInfo)) ;
+
+ if(success)
{
- entry = new HeaderEntryInfo() ;
- if(!checkRead(apr_file, entry, sizeof(HeaderEntryInfo)))
+ HeaderEntryInfo* entry = NULL ;
+ mNumEntries = 0 ;
+ U32 num_read = 0 ;
+ while(num_read++ < MAX_NUM_OBJECT_ENTRIES)
{
- delete entry ;
- return ;
+ if(!entry)
+ {
+ entry = new HeaderEntryInfo() ;
+ }
+ success = check_read(&apr_file, entry, sizeof(HeaderEntryInfo));
+
+ if(!success) //failed
+ {
+ llwarns << "Error reading cache header entry. (entry_index=" << mNumEntries << ")" << llendl;
+ delete entry ;
+ entry = NULL ;
+ break ;
+ }
+ else if(entry->mTime == INVALID_TIME)
+ {
+ continue ; //an empty entry
+ }
+
+ entry->mIndex = mNumEntries++ ;
+ mHeaderEntryQueue.insert(entry) ;
+ mHandleEntryMap[entry->mHandle] = entry ;
+ entry = NULL ;
}
- else if(!entry->mTime) //end of the cache.
+ if(entry)
{
delete entry ;
- return ;
}
-
- entry->mIndex = mNumEntries++ ;
- mHeaderEntryQueue.insert(entry) ;
- mHandleEntryMap[entry->mHandle] = entry ;
}
- delete apr_file ;
+ //---------
+ //debug code
+ //----------
+ //std::string name ;
+ //for(header_entry_queue_t::iterator iter = mHeaderEntryQueue.begin() ; success && iter != mHeaderEntryQueue.end(); ++iter)
+ //{
+ // getObjectCacheFilename((*iter)->mHandle, name) ;
+ // llinfos << name << llendl ;
+ //}
+ //-----------
}
else
{
writeCacheHeader() ;
}
+
+ if(!success)
+ {
+ removeCache() ; //failed to read header, clear the cache
+ }
+ else if(mNumEntries >= mCacheSize)
+ {
+ purgeEntries(mCacheSize) ;
+ }
+
+ return ;
}
void LLVOCache::writeCacheHeader()
{
- if(mReadOnly || !mEnabled)
+ if (!mEnabled)
{
- return ;
- }
-
- LLAPRFile* apr_file = new LLAPRFile(mHeaderFileName, APR_CREATE|APR_WRITE|APR_BINARY, mLocalAPRFilePoolp);
+ llwarns << "Not writing cache header: Cache is currently disabled." << llendl;
+ return;
+ }
- //write the meta element
- if(!checkWrite(apr_file, &mMetaInfo, sizeof(HeaderMetaInfo)))
+ if(mReadOnly)
{
- return ;
+ llwarns << "Not writing cache header: Cache is currently in read-only mode." << llendl;
+ return;
}
- mNumEntries = 0 ;
- for(header_entry_queue_t::iterator iter = mHeaderEntryQueue.begin() ; iter != mHeaderEntryQueue.end(); ++iter)
+ bool success = true ;
{
- (*iter)->mIndex = mNumEntries++ ;
- if(!checkWrite(apr_file, (void*)*iter, sizeof(HeaderEntryInfo)))
+ LLAPRFile apr_file(mHeaderFileName, APR_CREATE|APR_WRITE|APR_BINARY, mLocalAPRFilePoolp);
+
+ //write the meta element
+ success = check_write(&apr_file, &mMetaInfo, sizeof(HeaderMetaInfo)) ;
+
+
+ mNumEntries = 0 ;
+ for(header_entry_queue_t::iterator iter = mHeaderEntryQueue.begin() ; success && iter != mHeaderEntryQueue.end(); ++iter)
{
- return ;
+ (*iter)->mIndex = mNumEntries++ ;
+ success = check_write(&apr_file, (void*)*iter, sizeof(HeaderEntryInfo));
}
- }
-
- mNumEntries = mHeaderEntryQueue.size() ;
- if(mNumEntries < mCacheSize)
- {
- HeaderEntryInfo* entry = new HeaderEntryInfo() ;
- for(U32 i = mNumEntries ; i < mCacheSize; i++)
+
+ mNumEntries = mHeaderEntryQueue.size() ;
+ if(success && mNumEntries < MAX_NUM_OBJECT_ENTRIES)
{
- //fill the cache with the default entry.
- if(!checkWrite(apr_file, entry, sizeof(HeaderEntryInfo)))
+ HeaderEntryInfo* entry = new HeaderEntryInfo() ;
+ entry->mTime = INVALID_TIME ;
+ for(S32 i = mNumEntries ; success && i < MAX_NUM_OBJECT_ENTRIES ; i++)
{
- mReadOnly = TRUE ; //disable the cache.
- return ;
+ //fill the cache with the default entry.
+ success = check_write(&apr_file, entry, sizeof(HeaderEntryInfo)) ;
+
}
+ delete entry ;
}
- delete entry ;
}
- delete apr_file ;
+
+ if(!success)
+ {
+ clearCacheInMemory() ;
+ mReadOnly = TRUE ; //disable the cache.
+ }
+ return ;
}
BOOL LLVOCache::updateEntry(const HeaderEntryInfo* entry)
{
- LLAPRFile* apr_file = new LLAPRFile(mHeaderFileName, APR_WRITE|APR_BINARY, mLocalAPRFilePoolp);
- apr_file->seek(APR_SET, entry->mIndex * sizeof(HeaderEntryInfo) + sizeof(HeaderMetaInfo)) ;
+ LLAPRFile apr_file(mHeaderFileName, APR_WRITE|APR_BINARY, mLocalAPRFilePoolp);
+ apr_file.seek(APR_SET, entry->mIndex * sizeof(HeaderEntryInfo) + sizeof(HeaderMetaInfo)) ;
- return checkWrite(apr_file, (void*)entry, sizeof(HeaderEntryInfo)) ;
+ return check_write(&apr_file, (void*)entry, sizeof(HeaderEntryInfo)) ;
}
void LLVOCache::readFromCache(U64 handle, const LLUUID& id, LLVOCacheEntry::vocache_entry_map_t& cache_entry_map)
{
if(!mEnabled)
{
+ llwarns << "Not reading cache for handle " << handle << "): Cache is currently disabled." << llendl;
return ;
}
llassert_always(mInitialized);
@@ -522,65 +595,73 @@ void LLVOCache::readFromCache(U64 handle, const LLUUID& id, LLVOCacheEntry::voca
handle_entry_map_t::iterator iter = mHandleEntryMap.find(handle) ;
if(iter == mHandleEntryMap.end()) //no cache
{
+ llwarns << "No handle map entry for " << handle << llendl;
return ;
}
- std::string filename;
- getObjectCacheFilename(handle, filename);
- LLAPRFile* apr_file = new LLAPRFile(filename, APR_READ|APR_BINARY, mLocalAPRFilePoolp);
-
- LLUUID cache_id ;
- if(!checkRead(apr_file, cache_id.mData, UUID_BYTES))
+ bool success = true ;
{
- return ;
- }
- if(cache_id != id)
- {
- llinfos << "Cache ID doesn't match for this region, discarding"<< llendl;
-
- delete apr_file ;
- return ;
- }
+ std::string filename;
+ getObjectCacheFilename(handle, filename);
+ LLAPRFile apr_file(filename, APR_READ|APR_BINARY, mLocalAPRFilePoolp);
+
+ LLUUID cache_id ;
+ success = check_read(&apr_file, cache_id.mData, UUID_BYTES) ;
+
+ if(success)
+ {
+ if(cache_id != id)
+ {
+ llinfos << "Cache ID doesn't match for this region, discarding"<< llendl;
+ success = false ;
+ }
- S32 num_entries;
- if(!checkRead(apr_file, &num_entries, sizeof(S32)))
- {
- return ;
+ if(success)
+ {
+ S32 num_entries;
+ success = check_read(&apr_file, &num_entries, sizeof(S32)) ;
+
+ if(success)
+ {
+ for (S32 i = 0; i < num_entries; i++)
+ {
+ LLVOCacheEntry* entry = new LLVOCacheEntry(&apr_file);
+ if (!entry->getLocalID())
+ {
+ llwarns << "Aborting cache file load for " << filename << ", cache file corruption!" << llendl;
+ delete entry ;
+ success = false ;
+ break ;
+ }
+ cache_entry_map[entry->getLocalID()] = entry;
+ }
+ }
+ }
+ }
}
- for (S32 i = 0; i < num_entries; i++)
+ if(!success)
{
- LLVOCacheEntry* entry = new LLVOCacheEntry(apr_file);
- if (!entry->getLocalID())
+ if(cache_entry_map.empty())
{
- llwarns << "Aborting cache file load for " << filename << ", cache file corruption!" << llendl;
- delete entry ;
- break;
+ removeEntry(iter->second) ;
}
- cache_entry_map[entry->getLocalID()] = entry;
}
- num_entries = cache_entry_map.size() ;
- delete apr_file ;
return ;
}
-void LLVOCache::purgeEntries()
+void LLVOCache::purgeEntries(U32 size)
{
- U32 limit = mCacheSize - NUM_ENTRIES_TO_PURGE ;
- while(mHeaderEntryQueue.size() > limit)
+ while(mHeaderEntryQueue.size() > size)
{
header_entry_queue_t::iterator iter = mHeaderEntryQueue.begin() ;
- HeaderEntryInfo* entry = *iter ;
-
- removeFromCache(entry->mHandle) ;
- mHandleEntryMap.erase(entry->mHandle) ;
+ HeaderEntryInfo* entry = *iter ;
+ mHandleEntryMap.erase(entry->mHandle);
mHeaderEntryQueue.erase(iter) ;
- delete entry ;
+ removeFromCache(entry) ;
+ delete entry;
}
-
- writeCacheHeader() ;
- readCacheHeader() ;
mNumEntries = mHandleEntryMap.size() ;
}
@@ -588,80 +669,85 @@ void LLVOCache::writeToCache(U64 handle, const LLUUID& id, const LLVOCacheEntry:
{
if(!mEnabled)
{
+ llwarns << "Not writing cache for handle " << handle << "): Cache is currently disabled." << llendl;
return ;
}
llassert_always(mInitialized);
if(mReadOnly)
{
+ llwarns << "Not writing cache for handle " << handle << "): Cache is currently in read-only mode." << llendl;
return ;
- }
+ }
HeaderEntryInfo* entry;
handle_entry_map_t::iterator iter = mHandleEntryMap.find(handle) ;
if(iter == mHandleEntryMap.end()) //new entry
- {
- if(mNumEntries >= mCacheSize)
+ {
+ if(mNumEntries >= mCacheSize - 1)
{
- purgeEntries() ;
+ purgeEntries(mCacheSize - 1) ;
}
-
+
entry = new HeaderEntryInfo();
entry->mHandle = handle ;
entry->mTime = time(NULL) ;
- entry->mIndex = mNumEntries++ ;
+ entry->mIndex = mNumEntries++;
mHeaderEntryQueue.insert(entry) ;
mHandleEntryMap[handle] = entry ;
}
else
{
- entry = iter->second ;
- entry->mTime = time(NULL) ;
+ // Update access time.
+ entry = iter->second ;
//resort
mHeaderEntryQueue.erase(entry) ;
+
+ entry->mTime = time(NULL) ;
mHeaderEntryQueue.insert(entry) ;
}
//update cache header
if(!updateEntry(entry))
{
+ llwarns << "Failed to update cache header index " << entry->mIndex << ". handle = " << handle << llendl;
return ; //update failed.
}
if(!dirty_cache)
{
+ llwarns << "Skipping write to cache for handle " << handle << ": cache not dirty" << llendl;
return ; //nothing changed, no need to update.
}
//write to cache file
- std::string filename;
- getObjectCacheFilename(handle, filename);
- LLAPRFile* apr_file = new LLAPRFile(filename, APR_CREATE|APR_WRITE|APR_BINARY, mLocalAPRFilePoolp);
-
- if(!checkWrite(apr_file, (void*)id.mData, UUID_BYTES))
+ bool success = true ;
{
- return ;
- }
+ std::string filename;
+ getObjectCacheFilename(handle, filename);
+ LLAPRFile apr_file(filename, APR_CREATE|APR_WRITE|APR_BINARY, mLocalAPRFilePoolp);
+
+ success = check_write(&apr_file, (void*)id.mData, UUID_BYTES) ;
- S32 num_entries = cache_entry_map.size() ;
- if(!checkWrite(apr_file, &num_entries, sizeof(S32)))
- {
- return ;
+
+ if(success)
+ {
+ S32 num_entries = cache_entry_map.size() ;
+ success = check_write(&apr_file, &num_entries, sizeof(S32));
+
+ for (LLVOCacheEntry::vocache_entry_map_t::const_iterator iter = cache_entry_map.begin(); success && iter != cache_entry_map.end(); ++iter)
+ {
+ success = iter->second->writeToFile(&apr_file) ;
+ }
+ }
}
- for (LLVOCacheEntry::vocache_entry_map_t::const_iterator iter = cache_entry_map.begin(); iter != cache_entry_map.end(); ++iter)
+ if(!success)
{
- if(!iter->second->writeToFile(apr_file))
- {
- //failed
- delete apr_file ;
- removeCache() ;
- return ;
- }
+ removeEntry(entry) ;
+
}
- delete apr_file ;
return ;
}
-
diff --git a/indra/newview/llvocache.h b/indra/newview/llvocache.h
index ed2bc8bafe..14e3b4c793 100644
--- a/indra/newview/llvocache.h
+++ b/indra/newview/llvocache.h
@@ -95,7 +95,12 @@ private:
{
bool operator()(const HeaderEntryInfo* lhs, const HeaderEntryInfo* rhs) const
{
- return lhs->mTime < rhs->mTime; // older entry in front of queue (set)
+ if(lhs->mTime == rhs->mTime)
+ {
+ return lhs < rhs ;
+ }
+
+ return lhs->mTime < rhs->mTime ; // older entry in front of queue (set)
}
};
typedef std::set<HeaderEntryInfo*, header_entry_less> header_entry_queue_t;
@@ -111,6 +116,7 @@ public:
void readFromCache(U64 handle, const LLUUID& id, LLVOCacheEntry::vocache_entry_map_t& cache_entry_map) ;
void writeToCache(U64 handle, const LLUUID& id, const LLVOCacheEntry::vocache_entry_map_t& cache_entry_map, BOOL dirty_cache) ;
+ void removeEntry(U64 handle) ;
void setReadOnly(BOOL read_only) {mReadOnly = read_only;}
@@ -118,15 +124,14 @@ private:
void setDirNames(ELLPath location);
// determine the cache filename for the region from the region handle
void getObjectCacheFilename(U64 handle, std::string& filename);
- void removeFromCache(U64 handle);
+ void removeFromCache(HeaderEntryInfo* entry);
void readCacheHeader();
void writeCacheHeader();
void clearCacheInMemory();
void removeCache() ;
- void purgeEntries();
+ void removeEntry(HeaderEntryInfo* entry) ;
+ void purgeEntries(U32 size);
BOOL updateEntry(const HeaderEntryInfo* entry);
- BOOL checkRead(LLAPRFile* apr_file, void* src, S32 n_bytes) ;
- BOOL checkWrite(LLAPRFile* apr_file, void* src, S32 n_bytes) ;
private:
BOOL mEnabled;
diff --git a/indra/newview/llvoclouds.cpp b/indra/newview/llvoclouds.cpp
deleted file mode 100644
index 78aa6e6ab8..0000000000
--- a/indra/newview/llvoclouds.cpp
+++ /dev/null
@@ -1,293 +0,0 @@
-/**
- * @file llvoclouds.cpp
- * @brief Implementation of LLVOClouds class which is a derivation fo LLViewerObject
- *
- * $LicenseInfo:firstyear=2001&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llvoclouds.h"
-
-#include "lldrawpoolalpha.h"
-
-#include "llviewercontrol.h"
-
-#include "llagent.h" // to get camera position
-#include "lldrawable.h"
-#include "llface.h"
-#include "llprimitive.h"
-#include "llsky.h"
-#include "llviewercamera.h"
-#include "llviewertexturelist.h"
-#include "llviewerobjectlist.h"
-#include "llviewerregion.h"
-#include "llvosky.h"
-#include "llworld.h"
-#include "pipeline.h"
-#include "llspatialpartition.h"
-
-LLUUID gCloudTextureID = IMG_CLOUD_POOF;
-
-
-LLVOClouds::LLVOClouds(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp)
-: LLAlphaObject(id, LL_VO_CLOUDS, regionp)
-{
- mCloudGroupp = NULL;
- mbCanSelect = FALSE;
- setNumTEs(1);
- LLViewerTexture* image = LLViewerTextureManager::getFetchedTexture(gCloudTextureID);
- image->setBoostLevel(LLViewerTexture::BOOST_CLOUDS);
- setTEImage(0, image);
-}
-
-
-LLVOClouds::~LLVOClouds()
-{
-}
-
-
-BOOL LLVOClouds::isActive() const
-{
- return TRUE;
-}
-
-BOOL LLVOClouds::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
-{
- static LLFastTimer::DeclareTimer ftm("Idle Clouds");
- LLFastTimer t(ftm);
-
- if (!(gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_CLOUDS)))
- {
- return TRUE;
- }
-
- // Set dirty flag (so renderer will rebuild primitive)
- if (mDrawable)
- {
- gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_VOLUME, TRUE);
- }
-
- return TRUE;
-}
-
-
-void LLVOClouds::setPixelAreaAndAngle(LLAgent &agent)
-{
- mAppAngle = 50;
- mPixelArea = 1500*100;
-}
-
-void LLVOClouds::updateTextures()
-{
- getTEImage(0)->addTextureStats(mPixelArea);
-}
-
-LLDrawable* LLVOClouds::createDrawable(LLPipeline *pipeline)
-{
- pipeline->allocDrawable(this);
- mDrawable->setLit(FALSE);
- mDrawable->setRenderType(LLPipeline::RENDER_TYPE_CLOUDS);
-
- return mDrawable;
-}
-
-static LLFastTimer::DeclareTimer FTM_UPDATE_CLOUDS("Update Clouds");
-
-BOOL LLVOClouds::updateGeometry(LLDrawable *drawable)
-{
- LLFastTimer ftm(FTM_UPDATE_CLOUDS);
- if (!(gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_CLOUDS)))
- {
- return TRUE;
- }
-
- if (drawable->isVisible())
- {
- dirtySpatialGroup(TRUE);
- }
-
- LLFace *facep;
-
- S32 num_faces = mCloudGroupp->getNumPuffs();
-
- if (num_faces > drawable->getNumFaces())
- {
- drawable->setNumFacesFast(num_faces, NULL, getTEImage(0));
- }
-
- mDepth = (getPositionAgent()-LLViewerCamera::getInstance()->getOrigin())*LLViewerCamera::getInstance()->getAtAxis();
-
- S32 face_indx = 0;
- for ( ; face_indx < num_faces; face_indx++)
- {
- facep = drawable->getFace(face_indx);
- if (!facep)
- {
- llwarns << "No facep for index " << face_indx << llendl;
- continue;
- }
-
- facep->setSize(4, 6);
-
- facep->setTEOffset(face_indx);
- facep->setTexture(getTEImage(0));
- const LLCloudPuff &puff = mCloudGroupp->getPuff(face_indx);
- const LLVector3 puff_pos_agent = gAgent.getPosAgentFromGlobal(puff.getPositionGlobal());
- facep->mCenterLocal = puff_pos_agent;
- /// Update cloud color based on sun color.
- LLColor4 float_color(LLColor3(gSky.getSunDiffuseColor() + gSky.getSunAmbientColor()),puff.getAlpha());
- facep->setFaceColor(float_color);
- }
- for ( ; face_indx < drawable->getNumFaces(); face_indx++)
- {
- facep = drawable->getFace(face_indx);
- if (!facep)
- {
- llwarns << "No facep for index " << face_indx << llendl;
- continue;
- }
-
- facep->setTEOffset(face_indx);
- facep->setSize(0,0);
- }
-
- drawable->movePartition();
-
- return TRUE;
-}
-
-F32 LLVOClouds::getPartSize(S32 idx)
-{
- return (CLOUD_PUFF_HEIGHT+CLOUD_PUFF_WIDTH)*0.5f;
-}
-
-void LLVOClouds::getGeometry(S32 te,
- LLStrider<LLVector3>& verticesp,
- LLStrider<LLVector3>& normalsp,
- LLStrider<LLVector2>& texcoordsp,
- LLStrider<LLColor4U>& colorsp,
- LLStrider<U16>& indicesp)
-{
-
- if (te >= mCloudGroupp->getNumPuffs())
- {
- return;
- }
-
- LLDrawable* drawable = mDrawable;
- LLFace *facep = drawable->getFace(te);
-
- if (!facep->hasGeometry())
- {
- return;
- }
-
- LLVector3 normal(0.f,0.f,-1.f);
-
- const LLCloudPuff &puff = mCloudGroupp->getPuff(te);
- S32 index_offset = facep->getGeomIndex();
- LLColor4 float_color(LLColor3(gSky.getSunDiffuseColor() + gSky.getSunAmbientColor()),puff.getAlpha());
- LLColor4U color;
- color.setVec(float_color);
- facep->setFaceColor(float_color);
-
-
- LLVector3 up;
- LLVector3 right;
- LLVector3 at;
-
- const LLVector3& puff_pos_agent = facep->mCenterLocal;
- LLVector2 uvs[4];
-
- uvs[0].setVec(0.f, 1.f);
- uvs[1].setVec(0.f, 0.f);
- uvs[2].setVec(1.f, 1.f);
- uvs[3].setVec(1.f, 0.f);
-
- LLVector3 vtx[4];
-
- at = LLViewerCamera::getInstance()->getAtAxis();
- right = at % LLVector3(0.f, 0.f, 1.f);
- right.normVec();
- up = right % at;
- up.normVec();
- right *= 0.5f*CLOUD_PUFF_WIDTH;
- up *= 0.5f*CLOUD_PUFF_HEIGHT;;
-
- *colorsp++ = color;
- *colorsp++ = color;
- *colorsp++ = color;
- *colorsp++ = color;
-
- vtx[0] = puff_pos_agent - right + up;
- vtx[1] = puff_pos_agent - right - up;
- vtx[2] = puff_pos_agent + right + up;
- vtx[3] = puff_pos_agent + right - up;
-
- *verticesp++ = vtx[0];
- *verticesp++ = vtx[1];
- *verticesp++ = vtx[2];
- *verticesp++ = vtx[3];
-
- *texcoordsp++ = uvs[0];
- *texcoordsp++ = uvs[1];
- *texcoordsp++ = uvs[2];
- *texcoordsp++ = uvs[3];
-
- *normalsp++ = normal;
- *normalsp++ = normal;
- *normalsp++ = normal;
- *normalsp++ = normal;
-
- *indicesp++ = index_offset + 0;
- *indicesp++ = index_offset + 1;
- *indicesp++ = index_offset + 2;
-
- *indicesp++ = index_offset + 1;
- *indicesp++ = index_offset + 3;
- *indicesp++ = index_offset + 2;
-}
-
-U32 LLVOClouds::getPartitionType() const
-{
- return LLViewerRegion::PARTITION_CLOUD;
-}
-
-// virtual
-void LLVOClouds::updateDrawable(BOOL force_damped)
-{
- // Force an immediate rebuild on any update
- if (mDrawable.notNull())
- {
- mDrawable->updateXform(TRUE);
- gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_ALL, TRUE);
- }
- clearChanged(SHIFTED);
-}
-
-LLCloudPartition::LLCloudPartition()
-{
- mDrawableType = LLPipeline::RENDER_TYPE_CLOUDS;
- mPartitionType = LLViewerRegion::PARTITION_CLOUD;
-}
-
diff --git a/indra/newview/llvoclouds.h b/indra/newview/llvoclouds.h
deleted file mode 100644
index 430923a108..0000000000
--- a/indra/newview/llvoclouds.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/**
- * @file llvoclouds.h
- * @brief Description of LLVOClouds class
- *
- * $LicenseInfo:firstyear=2001&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLVOCLOUDS_H
-#define LL_LLVOCLOUDS_H
-
-#include "llviewerobject.h"
-#include "lltable.h"
-#include "v4coloru.h"
-
-class LLViewerTexture;
-class LLViewerCloudGroup;
-
-class LLCloudGroup;
-
-
-class LLVOClouds : public LLAlphaObject
-{
-public:
- LLVOClouds(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp );
-
- // Initialize data that's only inited once per class.
- static void initClass();
-
- void updateDrawable(BOOL force_damped);
-
- /*virtual*/ LLDrawable* createDrawable(LLPipeline *pipeline);
- /*virtual*/ BOOL updateGeometry(LLDrawable *drawable);
- /*virtual*/ void getGeometry(S32 te,
- LLStrider<LLVector3>& verticesp,
- LLStrider<LLVector3>& normalsp,
- LLStrider<LLVector2>& texcoordsp,
- LLStrider<LLColor4U>& colorsp,
- LLStrider<U16>& indicesp);
-
- /*virtual*/ BOOL isActive() const; // Whether this object needs to do an idleUpdate.
- F32 getPartSize(S32 idx);
-
- /*virtual*/ void updateTextures();
- /*virtual*/ void setPixelAreaAndAngle(LLAgent &agent); // generate accurate apparent angle and area
-
- void updateFaceSize(S32 idx) { }
- BOOL idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);
-
- virtual U32 getPartitionType() const;
-
- void setCloudGroup(LLCloudGroup *cgp) { mCloudGroupp = cgp; }
-protected:
- virtual ~LLVOClouds();
-
- LLCloudGroup *mCloudGroupp;
-};
-
-extern LLUUID gCloudTextureID;
-
-#endif // LL_VO_CLOUDS_H
diff --git a/indra/newview/llvograss.cpp b/indra/newview/llvograss.cpp
index f57f7b67ea..8a79d564d3 100644
--- a/indra/newview/llvograss.cpp
+++ b/indra/newview/llvograss.cpp
@@ -340,7 +340,7 @@ void LLVOGrass::updateTextures()
{
if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_TEXTURE_AREA))
{
- setDebugText(llformat("%4.0f", fsqrtf(mPixelArea)));
+ setDebugText(llformat("%4.0f", (F32) sqrt(mPixelArea)));
}
getTEImage(0)->addTextureStats(mPixelArea);
}
@@ -453,7 +453,7 @@ void LLVOGrass::plantBlades()
face->setTexture(getTEImage(0));
face->setState(LLFace::GLOBAL);
face->setSize(mNumBlades * 8, mNumBlades * 12);
- face->mVertexBuffer = NULL;
+ face->setVertexBuffer(NULL);
face->setTEOffset(0);
face->mCenterLocal = mPosition + mRegionp->getOriginAgent();
@@ -464,7 +464,7 @@ void LLVOGrass::plantBlades()
}
void LLVOGrass::getGeometry(S32 idx,
- LLStrider<LLVector3>& verticesp,
+ LLStrider<LLVector4a>& verticesp,
LLStrider<LLVector3>& normalsp,
LLStrider<LLVector2>& texcoordsp,
LLStrider<LLColor4U>& colorsp,
@@ -516,21 +516,24 @@ void LLVOGrass::getGeometry(S32 idx,
position.mV[0] = mPosition.mV[VX] + x + xf;
position.mV[1] = mPosition.mV[VY] + y + yf;
position.mV[2] = mRegionp->getLand().resolveHeightRegion(position);
- *verticesp++ = v1 = position + mRegionp->getOriginAgent();
- *verticesp++ = v1;
+ v1 = position + mRegionp->getOriginAgent();
+ (*verticesp++).load3(v1.mV);
+ (*verticesp++).load3(v1.mV);
position.mV[0] += dzx;
position.mV[1] += dzy;
position.mV[2] += blade_height;
- *verticesp++ = v2 = position + mRegionp->getOriginAgent();
- *verticesp++ = v2;
+ v2 = position + mRegionp->getOriginAgent();
+ (*verticesp++).load3(v2.mV);
+ (*verticesp++).load3(v2.mV);
position.mV[0] = mPosition.mV[VX] + x - xf;
position.mV[1] = mPosition.mV[VY] + y - xf;
position.mV[2] = mRegionp->getLand().resolveHeightRegion(position);
- *verticesp++ = v3 = position + mRegionp->getOriginAgent();
- *verticesp++ = v3;
+ v3 = position + mRegionp->getOriginAgent();
+ (*verticesp++).load3(v3.mV);
+ (*verticesp++).load3(v3.mV);
LLVector3 normal1 = (v1-v2) % (v2-v3);
normal1.mV[VZ] = 0.75f;
@@ -541,8 +544,9 @@ void LLVOGrass::getGeometry(S32 idx,
position.mV[0] += dzx;
position.mV[1] += dzy;
position.mV[2] += blade_height;
- *verticesp++ = v1 = position + mRegionp->getOriginAgent();
- *verticesp++ = v1;
+ v1 = position + mRegionp->getOriginAgent();
+ (*verticesp++).load3(v1.mV);
+ (*verticesp++).load3(v1.mV);
*(normalsp++) = normal1;
*(normalsp++) = normal2;
@@ -640,7 +644,7 @@ BOOL LLVOGrass::lineSegmentIntersect(const LLVector3& start, const LLVector3& en
LLVector2 tc[4];
LLVector3 v[4];
- // LLVector3 n[4]; // unused!
+ //LLVector3 n[4];
F32 closest_t = 1.f;
@@ -686,7 +690,6 @@ BOOL LLVOGrass::lineSegmentIntersect(const LLVector3& start, const LLVector3& en
position.mV[2] += blade_height;
v[3] = v1 = position + mRegionp->getOriginAgent();
-
F32 a,b,t;
BOOL hit = FALSE;
@@ -694,23 +697,23 @@ BOOL LLVOGrass::lineSegmentIntersect(const LLVector3& start, const LLVector3& en
U32 idx0 = 0,idx1 = 0,idx2 = 0;
- if (LLTriangleRayIntersect(v[0], v[1], v[2], start, dir, &a, &b, &t, FALSE))
+ if (LLTriangleRayIntersect(v[0], v[1], v[2], start, dir, a, b, t, FALSE))
{
hit = TRUE;
idx0 = 0; idx1 = 1; idx2 = 2;
}
- else if (LLTriangleRayIntersect(v[1], v[3], v[2], start, dir, &a, &b, &t, FALSE))
+ else if (LLTriangleRayIntersect(v[1], v[3], v[2], start, dir, a, b, t, FALSE))
{
hit = TRUE;
idx0 = 1; idx1 = 3; idx2 = 2;
}
- else if (LLTriangleRayIntersect(v[2], v[1], v[0], start, dir, &a, &b, &t, FALSE))
+ else if (LLTriangleRayIntersect(v[2], v[1], v[0], start, dir, a, b, t, FALSE))
{
normal1 = -normal1;
hit = TRUE;
idx0 = 2; idx1 = 1; idx2 = 0;
}
- else if (LLTriangleRayIntersect(v[2], v[3], v[1], start, dir, &a, &b, &t, FALSE))
+ else if (LLTriangleRayIntersect(v[2], v[3], v[1], start, dir, a, b, t, FALSE))
{
normal1 = -normal1;
hit = TRUE;
diff --git a/indra/newview/llvograss.h b/indra/newview/llvograss.h
index c262fdcc79..00a59facf7 100644
--- a/indra/newview/llvograss.h
+++ b/indra/newview/llvograss.h
@@ -59,7 +59,7 @@ public:
/*virtual*/ LLDrawable* createDrawable(LLPipeline *pipeline);
/*virtual*/ BOOL updateGeometry(LLDrawable *drawable);
/*virtual*/ void getGeometry(S32 idx,
- LLStrider<LLVector3>& verticesp,
+ LLStrider<LLVector4a>& verticesp,
LLStrider<LLVector3>& normalsp,
LLStrider<LLVector2>& texcoordsp,
LLStrider<LLColor4U>& colorsp,
diff --git a/indra/newview/llvoground.cpp b/indra/newview/llvoground.cpp
index f032ae8780..0060f81ab5 100644
--- a/indra/newview/llvoground.cpp
+++ b/indra/newview/llvoground.cpp
@@ -97,13 +97,14 @@ BOOL LLVOGround::updateGeometry(LLDrawable *drawable)
drawable->addFace(poolp, NULL);
face = drawable->getFace(0);
- if (face->mVertexBuffer.isNull())
+ if (!face->getVertexBuffer())
{
face->setSize(5, 12);
- face->mVertexBuffer = new LLVertexBuffer(LLDrawPoolGround::VERTEX_DATA_MASK, GL_STREAM_DRAW_ARB);
- face->mVertexBuffer->allocateBuffer(face->getGeomCount(), face->getIndicesCount(), TRUE);
+ LLVertexBuffer* buff = new LLVertexBuffer(LLDrawPoolGround::VERTEX_DATA_MASK, GL_STREAM_DRAW_ARB);
+ buff->allocateBuffer(face->getGeomCount(), face->getIndicesCount(), TRUE);
face->setGeomIndex(0);
face->setIndicesIndex(0);
+ face->setVertexBuffer(buff);
}
index_offset = face->getGeometry(verticesp,normalsp,texCoordsp, indicesp);
@@ -161,7 +162,7 @@ BOOL LLVOGround::updateGeometry(LLDrawable *drawable)
*(texCoordsp++) = LLVector2(0.f, 1.f);
*(texCoordsp++) = LLVector2(0.5f, 0.5f);
- face->mVertexBuffer->setBuffer(0);
+ face->getVertexBuffer()->flush();
LLPipeline::sCompiles++;
return TRUE;
}
diff --git a/indra/newview/llvoicecallhandler.cpp b/indra/newview/llvoicecallhandler.cpp
new file mode 100644
index 0000000000..2050dab689
--- /dev/null
+++ b/indra/newview/llvoicecallhandler.cpp
@@ -0,0 +1,69 @@
+ /**
+ * @file llvoicecallhandler.cpp
+ * @brief slapp to handle avatar to avatar voice call.
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llcommandhandler.h"
+#include "llavataractions.h"
+#include "llnotificationsutil.h"
+#include "llui.h"
+
+class LLVoiceCallAvatarHandler : public LLCommandHandler
+{
+public:
+ // requires trusted browser to trigger
+ LLVoiceCallAvatarHandler() : LLCommandHandler("voicecallavatar", UNTRUSTED_THROTTLE)
+ {
+ }
+
+ bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web)
+ {
+ if (!LLUI::sSettingGroups["config"]->getBOOL("EnableVoiceCall"))
+ {
+ LLNotificationsUtil::add("NoVoiceCall", LLSD(), LLSD(), std::string("SwitchToStandardSkinAndQuit"));
+ return true;
+ }
+
+ //Make sure we have some parameters
+ if (params.size() == 0)
+ {
+ return false;
+ }
+
+ //Get the ID
+ LLUUID id;
+ if (!id.set( params[0], FALSE ))
+ {
+ return false;
+ }
+
+ //instigate call with this avatar
+ LLAvatarActions::startCall( id );
+ return true;
+ }
+};
+
+LLVoiceCallAvatarHandler gVoiceCallAvatarHandler;
+
diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp
index b692093fb9..bd12328a6b 100644
--- a/indra/newview/llvoicechannel.cpp
+++ b/indra/newview/llvoicechannel.cpp
@@ -412,6 +412,7 @@ void LLVoiceChannel::doSetState(const EState& new_state)
{
EState old_state = mState;
mState = new_state;
+
if (!mStateChangedCallback.empty())
mStateChangedCallback(old_state, mState, mCallDirection, mCallEndedByAgent);
}
@@ -846,14 +847,19 @@ void LLVoiceChannelP2P::activate()
// otherwise answering the call
else
{
- LLVoiceClient::getInstance()->answerInvite(mSessionHandle);
-
+ if (!LLVoiceClient::getInstance()->answerInvite(mSessionHandle))
+ {
+ mCallEndedByAgent = false;
+ mSessionHandle.clear();
+ handleError(ERROR_UNKNOWN);
+ return;
+ }
// using the session handle invalidates it. Clear it out here so we can't reuse it by accident.
mSessionHandle.clear();
}
// Add the party to the list of people with which we've recently interacted.
- LLRecentPeople::instance().add(mOtherUserID);
+ addToTheRecentPeopleList();
//Default mic is ON on initiating/joining P2P calls
if (!LLVoiceClient::getInstance()->getUserPTTState() && LLVoiceClient::getInstance()->getPTTIsToggle())
@@ -938,3 +944,25 @@ void LLVoiceChannelP2P::setState(EState state)
LLVoiceChannel::setState(state);
}
+
+void LLVoiceChannelP2P::addToTheRecentPeopleList()
+{
+ bool avaline_call = LLIMModel::getInstance()->findIMSession(mSessionID)->isAvalineSessionType();
+
+ if (avaline_call)
+ {
+ LLSD call_data;
+ std::string call_number = LLVoiceChannel::getSessionName();
+
+ call_data["avaline_call"] = true;
+ call_data["session_id"] = mSessionID;
+ call_data["call_number"] = call_number;
+ call_data["date"] = LLDate::now();
+
+ LLRecentPeople::instance().add(mOtherUserID, call_data);
+ }
+ else
+ {
+ LLRecentPeople::instance().add(mOtherUserID);
+ }
+}
diff --git a/indra/newview/llvoicechannel.h b/indra/newview/llvoicechannel.h
index 7cef3c13d1..b8597ee5cb 100644
--- a/indra/newview/llvoicechannel.h
+++ b/indra/newview/llvoicechannel.h
@@ -191,6 +191,13 @@ protected:
virtual void setState(EState state);
private:
+
+ /**
+ * Add the caller to the list of people with which we've recently interacted
+ *
+ **/
+ void addToTheRecentPeopleList();
+
std::string mSessionHandle;
LLUUID mOtherUserID;
BOOL mReceivedCall;
diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp
index 6c44f639ec..730f022c50 100644
--- a/indra/newview/llvoiceclient.cpp
+++ b/indra/newview/llvoiceclient.cpp
@@ -35,6 +35,7 @@
#include "llnotificationsutil.h"
#include "llsdserialize.h"
#include "llui.h"
+#include "llkeyboard.h"
const F32 LLVoiceClient::OVERDRIVEN_POWER_LEVEL = 0.7f;
@@ -113,8 +114,18 @@ LLVoiceClient::LLVoiceClient()
mVoiceModule(NULL),
m_servicePump(NULL),
mVoiceEffectEnabled(LLCachedControl<bool>(gSavedSettings, "VoiceMorphingEnabled")),
- mVoiceEffectDefault(LLCachedControl<std::string>(gSavedPerAccountSettings, "VoiceEffectDefault"))
+ mVoiceEffectDefault(LLCachedControl<std::string>(gSavedPerAccountSettings, "VoiceEffectDefault")),
+ mPTTDirty(true),
+ mPTT(true),
+ mUsePTT(true),
+ mPTTIsMiddleMouse(false),
+ mPTTKey(0),
+ mPTTIsToggle(false),
+ mUserPTTState(false),
+ mMuteMic(false),
+ mDisableMic(false)
{
+ updateSettings();
}
//---------------------------------------------------
@@ -173,6 +184,14 @@ const LLVoiceVersionInfo LLVoiceClient::getVersion()
void LLVoiceClient::updateSettings()
{
+ setUsePTT(gSavedSettings.getBOOL("PTTCurrentlyEnabled"));
+ std::string keyString = gSavedSettings.getString("PushToTalkButton");
+ setPTTKey(keyString);
+ setPTTIsToggle(gSavedSettings.getBOOL("PushToTalkToggle"));
+ mDisableMic = gSavedSettings.getBOOL("VoiceDisableMic");
+
+ updateMicMuteLogic();
+
if (mVoiceModule) mVoiceModule->updateSettings();
}
@@ -481,6 +500,26 @@ void LLVoiceClient::setVoiceEnabled(bool enabled)
if (mVoiceModule) mVoiceModule->setVoiceEnabled(enabled);
}
+void LLVoiceClient::updateMicMuteLogic()
+{
+ // If not configured to use PTT, the mic should be open (otherwise the user will be unable to speak).
+ bool new_mic_mute = false;
+
+ if(mUsePTT)
+ {
+ // If configured to use PTT, track the user state.
+ new_mic_mute = !mUserPTTState;
+ }
+
+ if(mMuteMic || mDisableMic)
+ {
+ // Either of these always overrides any other PTT setting.
+ new_mic_mute = true;
+ }
+
+ if (mVoiceModule) mVoiceModule->setMuteMic(new_mic_mute);
+}
+
void LLVoiceClient::setLipSyncEnabled(BOOL enabled)
{
if (mVoiceModule) mVoiceModule->setLipSyncEnabled(enabled);
@@ -500,7 +539,8 @@ BOOL LLVoiceClient::lipSyncEnabled()
void LLVoiceClient::setMuteMic(bool muted)
{
- if (mVoiceModule) mVoiceModule->setMuteMic(muted);
+ mMuteMic = muted;
+ updateMicMuteLogic();
}
@@ -509,64 +549,116 @@ void LLVoiceClient::setMuteMic(bool muted)
void LLVoiceClient::setUserPTTState(bool ptt)
{
- if (mVoiceModule) mVoiceModule->setUserPTTState(ptt);
+ mUserPTTState = ptt;
+ updateMicMuteLogic();
}
bool LLVoiceClient::getUserPTTState()
{
- if (mVoiceModule)
- {
- return mVoiceModule->getUserPTTState();
- }
- else
- {
- return false;
- }
+ return mUserPTTState;
}
void LLVoiceClient::setUsePTT(bool usePTT)
{
- if (mVoiceModule) mVoiceModule->setUsePTT(usePTT);
+ if(usePTT && !mUsePTT)
+ {
+ // When the user turns on PTT, reset the current state.
+ mUserPTTState = false;
+ }
+ mUsePTT = usePTT;
+
+ updateMicMuteLogic();
}
void LLVoiceClient::setPTTIsToggle(bool PTTIsToggle)
{
- if (mVoiceModule) mVoiceModule->setPTTIsToggle(PTTIsToggle);
+ if(!PTTIsToggle && mPTTIsToggle)
+ {
+ // When the user turns off toggle, reset the current state.
+ mUserPTTState = false;
+ }
+
+ mPTTIsToggle = PTTIsToggle;
+
+ updateMicMuteLogic();
}
bool LLVoiceClient::getPTTIsToggle()
{
- if (mVoiceModule)
+ return mPTTIsToggle;
+}
+
+void LLVoiceClient::setPTTKey(std::string &key)
+{
+ if(key == "MiddleMouse")
{
- return mVoiceModule->getPTTIsToggle();
+ mPTTIsMiddleMouse = true;
}
- else {
- return false;
+ else
+ {
+ mPTTIsMiddleMouse = false;
+ if(!LLKeyboard::keyFromString(key, &mPTTKey))
+ {
+ // If the call failed, don't match any key.
+ key = KEY_NONE;
+ }
}
-
}
void LLVoiceClient::inputUserControlState(bool down)
{
- if (mVoiceModule) mVoiceModule->inputUserControlState(down);
+ if(mPTTIsToggle)
+ {
+ if(down) // toggle open-mic state on 'down'
+ {
+ toggleUserPTTState();
+ }
+ }
+ else // set open-mic state as an absolute
+ {
+ setUserPTTState(down);
+ }
}
void LLVoiceClient::toggleUserPTTState(void)
{
- if (mVoiceModule) mVoiceModule->toggleUserPTTState();
+ setUserPTTState(!getUserPTTState());
}
void LLVoiceClient::keyDown(KEY key, MASK mask)
{
- if (mVoiceModule) mVoiceModule->keyDown(key, mask);
+ if (gKeyboard->getKeyRepeated(key))
+ {
+ // ignore auto-repeat keys
+ return;
+ }
+
+ if(!mPTTIsMiddleMouse)
+ {
+ bool down = (mPTTKey != KEY_NONE)
+ && gKeyboard->getKeyDown(mPTTKey);
+ inputUserControlState(down);
+ }
+
}
void LLVoiceClient::keyUp(KEY key, MASK mask)
{
- if (mVoiceModule) mVoiceModule->keyUp(key, mask);
+ if(!mPTTIsMiddleMouse)
+ {
+ bool down = (mPTTKey != KEY_NONE)
+ && gKeyboard->getKeyDown(mPTTKey);
+ inputUserControlState(down);
+ }
}
void LLVoiceClient::middleMouseState(bool down)
{
- if (mVoiceModule) mVoiceModule->middleMouseState(down);
+ if(mPTTIsMiddleMouse)
+ {
+ if(mPTTIsMiddleMouse)
+ {
+ inputUserControlState(down);
+ }
+ }
}
diff --git a/indra/newview/llvoiceclient.h b/indra/newview/llvoiceclient.h
index 24d7d7163e..c9aeea35a9 100644
--- a/indra/newview/llvoiceclient.h
+++ b/indra/newview/llvoiceclient.h
@@ -191,25 +191,9 @@ public:
virtual void setVoiceEnabled(bool enabled)=0;
virtual void setLipSyncEnabled(BOOL enabled)=0;
virtual BOOL lipSyncEnabled()=0;
- virtual void setMuteMic(bool muted)=0; // Use this to mute the local mic (for when the client is minimized, etc), ignoring user PTT state.
+ virtual void setMuteMic(bool muted)=0; // Set the mute state of the local mic.
//@}
-
- ////////////////////////
- /// @name PTT
- //@{
- virtual void setUserPTTState(bool ptt)=0;
- virtual bool getUserPTTState()=0;
- virtual void setUsePTT(bool usePTT)=0;
- virtual void setPTTIsToggle(bool PTTIsToggle)=0;
- virtual bool getPTTIsToggle()=0;
- virtual void toggleUserPTTState(void)=0;
- virtual void inputUserControlState(bool down)=0; // interpret any sort of up-down mic-open control input according to ptt-toggle prefs
-
- virtual void keyDown(KEY key, MASK mask)=0;
- virtual void keyUp(KEY key, MASK mask)=0;
- virtual void middleMouseState(bool down)=0;
- //@}
-
+
//////////////////////////
/// @name nearby speaker accessors
//@{
@@ -406,6 +390,9 @@ public:
void setUsePTT(bool usePTT);
void setPTTIsToggle(bool PTTIsToggle);
bool getPTTIsToggle();
+ void setPTTKey(std::string &key);
+
+ void updateMicMuteLogic();
BOOL lipSyncEnabled();
@@ -471,6 +458,17 @@ protected:
LLCachedControl<bool> mVoiceEffectEnabled;
LLCachedControl<std::string> mVoiceEffectDefault;
+
+ bool mPTTDirty;
+ bool mPTT;
+
+ bool mUsePTT;
+ bool mPTTIsMiddleMouse;
+ KEY mPTTKey;
+ bool mPTTIsToggle;
+ bool mUserPTTState;
+ bool mMuteMic;
+ bool mDisableMic;
};
/**
diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp
index 019629084f..df1d3f2955 100644
--- a/indra/newview/llvoicevivox.cpp
+++ b/indra/newview/llvoicevivox.cpp
@@ -46,7 +46,6 @@
#include "llviewernetwork.h" // for gGridChoice
#include "llbase64.h"
#include "llviewercontrol.h"
-#include "llkeyboard.h"
#include "llappviewer.h" // for gDisconnected, gDisableVoice
// Viewer includes
@@ -56,13 +55,12 @@
#include "llimview.h" // for LLIMMgr
#include "llparcel.h"
#include "llviewerparcelmgr.h"
-//#include "llfirstuse.h"
+#include "llfirstuse.h"
#include "llspeakers.h"
#include "lltrans.h"
#include "llviewerwindow.h"
#include "llviewercamera.h"
-#include "llfloaterfriends.h" //VIVOX, inorder to refresh communicate panel
#include "llviewernetwork.h"
#include "llnotificationsutil.h"
@@ -196,12 +194,13 @@ static LLVivoxVoiceClientFriendsObserver *friendslist_listener = NULL;
class LLVivoxVoiceClientCapResponder : public LLHTTPClient::Responder
{
public:
- LLVivoxVoiceClientCapResponder(void){};
+ LLVivoxVoiceClientCapResponder(LLVivoxVoiceClient::state requesting_state) : mRequestingState(requesting_state) {};
virtual void error(U32 status, const std::string& reason); // called with bad status codes
virtual void result(const LLSD& content);
private:
+ LLVivoxVoiceClient::state mRequestingState; // state
};
void LLVivoxVoiceClientCapResponder::error(U32 status, const std::string& reason)
@@ -209,6 +208,7 @@ void LLVivoxVoiceClientCapResponder::error(U32 status, const std::string& reason
LL_WARNS("Voice") << "LLVivoxVoiceClientCapResponder::error("
<< status << ": " << reason << ")"
<< LL_ENDL;
+ LLVivoxVoiceClient::getInstance()->sessionTerminate();
}
void LLVivoxVoiceClientCapResponder::result(const LLSD& content)
@@ -217,12 +217,12 @@ void LLVivoxVoiceClientCapResponder::result(const LLSD& content)
LL_DEBUGS("Voice") << "ParcelVoiceInfoRequest response:" << ll_pretty_print_sd(content) << LL_ENDL;
+ std::string uri;
+ std::string credentials;
+
if ( content.has("voice_credentials") )
{
LLSD voice_credentials = content["voice_credentials"];
- std::string uri;
- std::string credentials;
-
if ( voice_credentials.has("channel_uri") )
{
uri = voice_credentials["channel_uri"].asString();
@@ -232,7 +232,12 @@ void LLVivoxVoiceClientCapResponder::result(const LLSD& content)
credentials =
voice_credentials["channel_credentials"].asString();
}
-
+ }
+
+ // set the spatial channel. If no voice credentials or uri are
+ // available, then we simply drop out of voice spatially.
+ if(LLVivoxVoiceClient::getInstance()->parcelVoiceInfoReceived(mRequestingState))
+ {
LLVivoxVoiceClient::getInstance()->setSpatialChannel(uri, credentials);
}
}
@@ -326,14 +331,8 @@ LLVivoxVoiceClient::LLVivoxVoiceClient() :
mRenderDeviceDirty(false),
mSpatialCoordsDirty(false),
- mPTTDirty(true),
- mPTT(true),
- mUsePTT(true),
- mPTTIsMiddleMouse(false),
- mPTTKey(0),
- mPTTIsToggle(false),
- mUserPTTState(false),
mMuteMic(false),
+ mMuteMicDirty(false),
mFriendsListDirty(true),
mEarLocation(0),
@@ -435,10 +434,6 @@ const LLVoiceVersionInfo& LLVivoxVoiceClient::getVersion()
void LLVivoxVoiceClient::updateSettings()
{
setVoiceEnabled(gSavedSettings.getBOOL("EnableVoiceChat"));
- setUsePTT(gSavedSettings.getBOOL("PTTCurrentlyEnabled"));
- std::string keyString = gSavedSettings.getString("PushToTalkButton");
- setPTTKey(keyString);
- setPTTIsToggle(gSavedSettings.getBOOL("PushToTalkToggle"));
setEarLocation(gSavedSettings.getS32("VoiceEarLocation"));
std::string inputDevice = gSavedSettings.getString("VoiceInputAudioDevice");
@@ -562,18 +557,27 @@ void LLVivoxVoiceClient::userAuthorized(const std::string& user_id, const LLUUID
void LLVivoxVoiceClient::requestVoiceAccountProvision(S32 retries)
{
- if ( gAgent.getRegion() && mVoiceEnabled )
+ LLViewerRegion *region = gAgent.getRegion();
+
+ if ( region && mVoiceEnabled )
{
std::string url =
- gAgent.getRegion()->getCapability(
- "ProvisionVoiceAccountRequest");
-
- if ( url == "" ) return;
-
+ region->getCapability("ProvisionVoiceAccountRequest");
+
+ if ( url.empty() )
+ {
+ // we've not received the capability yet, so return.
+ // the password will remain empty, so we'll remain in
+ // stateIdle
+ return;
+ }
+
LLHTTPClient::post(
- url,
- LLSD(),
- new LLVivoxVoiceAccountProvisionResponder(retries));
+ url,
+ LLSD(),
+ new LLVivoxVoiceAccountProvisionResponder(retries));
+
+ setState(stateConnectorStart);
}
}
@@ -684,7 +688,8 @@ std::string LLVivoxVoiceClient::state2string(LLVivoxVoiceClient::state inState)
CASE(stateVoiceFontsWait);
CASE(stateVoiceFontsReceived);
CASE(stateCreatingSessionGroup);
- CASE(stateNoChannel);
+ CASE(stateNoChannel);
+ CASE(stateRetrievingParcelVoiceInfo);
CASE(stateJoiningSession);
CASE(stateSessionJoined);
CASE(stateRunning);
@@ -752,42 +757,6 @@ void LLVivoxVoiceClient::stateMachine()
}
}
- // Check for parcel boundary crossing
- {
- LLViewerRegion *region = gAgent.getRegion();
- LLParcel *parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
-
- if(region && parcel)
- {
- S32 parcelLocalID = parcel->getLocalID();
- std::string regionName = region->getName();
- std::string capURI = region->getCapability("ParcelVoiceInfoRequest");
-
-// LL_DEBUGS("Voice") << "Region name = \"" << regionName << "\", parcel local ID = " << parcelLocalID << ", cap URI = \"" << capURI << "\"" << LL_ENDL;
-
- // The region name starts out empty and gets filled in later.
- // Also, the cap gets filled in a short time after the region cross, but a little too late for our purposes.
- // If either is empty, wait for the next time around.
- if(!regionName.empty())
- {
- if(!capURI.empty())
- {
- if((parcelLocalID != mCurrentParcelLocalID) || (regionName != mCurrentRegionName))
- {
- // We have changed parcels. Initiate a parcel channel lookup.
- mCurrentParcelLocalID = parcelLocalID;
- mCurrentRegionName = regionName;
-
- parcelChanged();
- }
- }
- else
- {
- LL_WARNS_ONCE("Voice") << "region doesn't have ParcelVoiceInfoRequest capability. This is normal for a short time after teleporting, but bad if it persists for very long." << LL_ENDL;
- }
- }
- }
- }
switch(getState())
{
@@ -950,7 +919,7 @@ void LLVivoxVoiceClient::stateMachine()
setState(stateDaemonLaunched);
// Dirty the states we'll need to sync with the daemon when it comes up.
- mPTTDirty = true;
+ mMuteMicDirty = true;
mMicVolumeDirty = true;
mSpeakerVolumeDirty = true;
mSpeakerMuteDirty = true;
@@ -1037,22 +1006,9 @@ void LLVivoxVoiceClient::stateMachine()
}
else if(!mAccountName.empty())
{
- LLViewerRegion *region = gAgent.getRegion();
-
- if(region)
+ if ( mAccountPassword.empty() )
{
- if ( region->getCapability("ProvisionVoiceAccountRequest") != "" )
- {
- if ( mAccountPassword.empty() )
- {
- requestVoiceAccountProvision();
- }
- setState(stateConnectorStart);
- }
- else
- {
- LL_WARNS_ONCE("Voice") << "region doesn't have ProvisionVoiceAccountRequest capability!" << LL_ENDL;
- }
+ requestVoiceAccountProvision();
}
}
break;
@@ -1393,11 +1349,7 @@ void LLVivoxVoiceClient::stateMachine()
setState(stateCreatingSessionGroup);
sessionGroupCreateSendMessage();
#else
- // Not using session groups -- skip the stateCreatingSessionGroup state.
- setState(stateNoChannel);
-
- // Initial kick-off of channel lookup logic
- parcelChanged();
+ setState(stateNoChannel);
#endif
break;
@@ -1410,19 +1362,29 @@ void LLVivoxVoiceClient::stateMachine()
}
else if(!mMainSessionGroupHandle.empty())
{
- setState(stateNoChannel);
-
// Start looped recording (needed for "panic button" anti-griefing tool)
recordingLoopStart();
-
- // Initial kick-off of channel lookup logic
- parcelChanged();
+ setState(stateNoChannel);
}
break;
+
+ //MARK: stateRetrievingParcelVoiceInfo
+ case stateRetrievingParcelVoiceInfo:
+ // wait until parcel voice info is received.
+ if(mSessionTerminateRequested || !mVoiceEnabled)
+ {
+ // if a terminate request has been received,
+ // bail and go to the stateSessionTerminated
+ // state. If the cap request is still pending,
+ // the responder will check to see if we've moved
+ // to a new session and won't change any state.
+ setState(stateSessionTerminated);
+ }
+ break;
+
//MARK: stateNoChannel
case stateNoChannel:
-
LL_DEBUGS("Voice") << "State No Channel" << LL_ENDL;
mSpatialJoiningNum = 0;
// Do this here as well as inside sendPositionalUpdate().
@@ -1443,6 +1405,16 @@ void LLVivoxVoiceClient::stateMachine()
{
setState(stateCaptureBufferPaused);
}
+ else if(checkParcelChanged() || (mNextAudioSession == NULL))
+ {
+ // the parcel is changed, or we have no pending audio sessions,
+ // so try to request the parcel voice info
+ // if we have the cap, we move to the appropriate state
+ if(requestParcelVoiceInfo())
+ {
+ setState(stateRetrievingParcelVoiceInfo);
+ }
+ }
else if(sessionNeedsRelog(mNextAudioSession))
{
requestRelog();
@@ -1477,32 +1449,28 @@ void LLVivoxVoiceClient::stateMachine()
notifyStatusObservers(LLVoiceClientStatusObserver::STATUS_JOINING);
setState(stateJoiningSession);
}
- else if(!mSpatialSessionURI.empty())
- {
- // If we're not headed elsewhere and have a spatial URI, return to spatial.
- switchChannel(mSpatialSessionURI, true, false, false, mSpatialSessionCredentials);
- }
break;
-
+
//MARK: stateJoiningSession
case stateJoiningSession: // waiting for session handle
-
- // If this is true we have problem with connection to voice server (EXT-4313).
- // See descriptions of mSpatialJoiningNum and MAX_NORMAL_JOINING_SPATIAL_NUM.
- if(mSpatialJoiningNum == MAX_NORMAL_JOINING_SPATIAL_NUM)
+
+ // If this is true we have problem with connection to voice server (EXT-4313).
+ // See descriptions of mSpatialJoiningNum and MAX_NORMAL_JOINING_SPATIAL_NUM.
+ if(mSpatialJoiningNum == MAX_NORMAL_JOINING_SPATIAL_NUM)
{
- // Notify observers to let them know there is problem with voice
- notifyStatusObservers(LLVoiceClientStatusObserver::STATUS_VOICE_DISABLED);
- llwarns << "There seems to be problem with connection to voice server. Disabling voice chat abilities." << llendl;
+ // Notify observers to let them know there is problem with voice
+ notifyStatusObservers(LLVoiceClientStatusObserver::STATUS_VOICE_DISABLED);
+ llwarns << "There seems to be problem with connection to voice server. Disabling voice chat abilities." << llendl;
}
-
- // Increase mSpatialJoiningNum only for spatial sessions- it's normal to reach this case for
- // example for p2p many times while waiting for response, so it can't be used to detect errors
- if(mAudioSession && mAudioSession->mIsSpatial)
+
+ // Increase mSpatialJoiningNum only for spatial sessions- it's normal to reach this case for
+ // example for p2p many times while waiting for response, so it can't be used to detect errors
+ if(mAudioSession && mAudioSession->mIsSpatial)
{
- mSpatialJoiningNum++;
+
+ mSpatialJoiningNum++;
}
-
+
// joinedAudioSession() will transition from here to stateSessionJoined.
if(!mVoiceEnabled)
{
@@ -1522,12 +1490,13 @@ void LLVivoxVoiceClient::stateMachine()
}
}
}
- break;
-
+ break;
+
//MARK: stateSessionJoined
case stateSessionJoined: // session handle received
- mSpatialJoiningNum = 0;
+
+ mSpatialJoiningNum = 0;
// It appears that I need to wait for BOTH the SessionGroup.AddSession response and the SessionStateChangeEvent with state 4
// before continuing from this state. They can happen in either order, and if I don't wait for both, things can get stuck.
// For now, the SessionGroup.AddSession response handler sets mSessionHandle and the SessionStateChangeEvent handler transitions to stateSessionJoined.
@@ -1535,7 +1504,7 @@ void LLVivoxVoiceClient::stateMachine()
if(mAudioSession && mAudioSession->mVoiceEnabled)
{
// Dirty state that may need to be sync'ed with the daemon.
- mPTTDirty = true;
+ mMuteMicDirty = true;
mSpeakerVolumeDirty = true;
mSpatialCoordsDirty = true;
@@ -1564,7 +1533,7 @@ void LLVivoxVoiceClient::stateMachine()
sessionMediaDisconnectSendMessage(mAudioSession);
setState(stateSessionTerminated);
}
- }
+ }
break;
//MARK: stateRunning
@@ -1577,34 +1546,6 @@ void LLVivoxVoiceClient::stateMachine()
else
{
- // Figure out whether the PTT state needs to change
- {
- bool newPTT;
- if(mUsePTT)
- {
- // If configured to use PTT, track the user state.
- newPTT = mUserPTTState;
- }
- else
- {
- // If not configured to use PTT, it should always be true (otherwise the user will be unable to speak).
- newPTT = true;
- }
-
- if(mMuteMic)
- {
- // This always overrides any other PTT setting.
- newPTT = false;
- }
-
- // Dirty if state changed.
- if(newPTT != mPTT)
- {
- mPTT = newPTT;
- mPTTDirty = true;
- }
- }
-
if(!inSpatialChannel())
{
// When in a non-spatial channel, never send positional updates.
@@ -1612,8 +1553,22 @@ void LLVivoxVoiceClient::stateMachine()
}
else
{
+ if(checkParcelChanged())
+ {
+ // if the parcel has changed, attempted to request the
+ // cap for the parcel voice info. If we can't request it
+ // then we don't have the cap URL so we do nothing and will
+ // recheck next time around
+ if(requestParcelVoiceInfo())
+ {
+ // we did get the cap, and we made the request,
+ // so go wait for the response.
+ setState(stateRetrievingParcelVoiceInfo);
+ }
+ }
// Do the calculation that enforces the listener<->speaker tether (and also updates the real camera position)
enforceTether();
+
}
// Do notifications for expiring Voice Fonts.
@@ -1626,7 +1581,7 @@ void LLVivoxVoiceClient::stateMachine()
// Send an update only if the ptt or mute state has changed (which shouldn't be able to happen that often
// -- the user can only click so fast) or every 10hz, whichever is sooner.
// Sending for every volume update causes an excessive flood of messages whenever a volume slider is dragged.
- if((mAudioSession && mAudioSession->mMuteDirty) || mPTTDirty || mUpdateTimer.hasExpired())
+ if((mAudioSession && mAudioSession->mMuteDirty) || mMuteMicDirty || mUpdateTimer.hasExpired())
{
mUpdateTimer.setTimerExpirySec(UPDATE_THROTTLE_SECONDS);
sendPositionalUpdate();
@@ -2749,19 +2704,17 @@ void LLVivoxVoiceClient::buildLocalAudioUpdates(std::ostringstream &stream)
buildSetRenderDevice(stream);
- if(mPTTDirty)
+ if(mMuteMicDirty)
{
- mPTTDirty = false;
+ mMuteMicDirty = false;
// Send a local mute command.
- // NOTE that the state of "PTT" is the inverse of "local mute".
- // (i.e. when PTT is true, we send a mute command with "false", and vice versa)
- LL_DEBUGS("Voice") << "Sending MuteLocalMic command with parameter " << (mPTT?"false":"true") << LL_ENDL;
+ LL_DEBUGS("Voice") << "Sending MuteLocalMic command with parameter " << (mMuteMic?"true":"false") << LL_ENDL;
stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Connector.MuteLocalMic.1\">"
<< "<ConnectorHandle>" << mConnectorHandle << "</ConnectorHandle>"
- << "<Value>" << (mPTT?"false":"true") << "</Value>"
+ << "<Value>" << (mMuteMic?"true":"false") << "</Value>"
<< "</Request>\n\n\n";
}
@@ -3882,7 +3835,7 @@ void LLVivoxVoiceClient::participantUpdatedEvent(
// also initialize voice moderate_mode depend on Agent's participant. See EXT-6937.
// *TODO: remove once a way to request the current voice channel moderation mode is implemented.
- if (gAgentID == participant->mAvatarID)
+ if (gAgent.getID() == participant->mAvatarID)
{
speaker_manager->initVoiceModerateMode();
}
@@ -4115,7 +4068,7 @@ void LLVivoxVoiceClient::messageEvent(
}
LL_DEBUGS("Voice") << "adding message, name " << session->mName << " session " << session->mIMSessionID << ", target " << session->mCallerID << LL_ENDL;
- gIMMgr->addMessage(session->mIMSessionID,
+ LLIMMgr::getInstance()->addMessage(session->mIMSessionID,
session->mCallerID,
session->mName.c_str(),
message.c_str(),
@@ -4489,24 +4442,92 @@ LLVivoxVoiceClient::participantState* LLVivoxVoiceClient::findParticipantByID(co
}
-void LLVivoxVoiceClient::parcelChanged()
+
+// Check for parcel boundary crossing
+bool LLVivoxVoiceClient::checkParcelChanged(bool update)
{
- if(getState() >= stateNoChannel)
+ LLViewerRegion *region = gAgent.getRegion();
+ LLParcel *parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
+
+ if(region && parcel)
{
- // If the user is logged in, start a channel lookup.
- LL_DEBUGS("Voice") << "sending ParcelVoiceInfoRequest (" << mCurrentRegionName << ", " << mCurrentParcelLocalID << ")" << LL_ENDL;
+ S32 parcelLocalID = parcel->getLocalID();
+ std::string regionName = region->getName();
+
+ // LL_DEBUGS("Voice") << "Region name = \"" << regionName << "\", parcel local ID = " << parcelLocalID << ", cap URI = \"" << capURI << "\"" << LL_ENDL;
+
+ // The region name starts out empty and gets filled in later.
+ // Also, the cap gets filled in a short time after the region cross, but a little too late for our purposes.
+ // If either is empty, wait for the next time around.
+ if(!regionName.empty())
+ {
+ if((parcelLocalID != mCurrentParcelLocalID) || (regionName != mCurrentRegionName))
+ {
+ // We have changed parcels. Initiate a parcel channel lookup.
+ if (update)
+ {
+ mCurrentParcelLocalID = parcelLocalID;
+ mCurrentRegionName = regionName;
+ }
+ return true;
+ }
+ }
+ }
+ return false;
+}
- std::string url = gAgent.getRegion()->getCapability("ParcelVoiceInfoRequest");
- LLSD data;
- LLHTTPClient::post(
- url,
- data,
- new LLVivoxVoiceClientCapResponder);
+bool LLVivoxVoiceClient::parcelVoiceInfoReceived(state requesting_state)
+{
+ // pop back to the state we were in when the parcel changed and we managed to
+ // do the request.
+ if(getState() == stateRetrievingParcelVoiceInfo)
+ {
+ setState(requesting_state);
+ return true;
}
else
{
- // The transition to stateNoChannel needs to kick this off again.
- LL_INFOS("Voice") << "not logged in yet, deferring" << LL_ENDL;
+ // we've dropped out of stateRetrievingParcelVoiceInfo
+ // before we received the cap result, due to a terminate
+ // or transition to a non-voice channel. Don't switch channels.
+ return false;
+ }
+}
+
+
+bool LLVivoxVoiceClient::requestParcelVoiceInfo()
+{
+ LLViewerRegion * region = gAgent.getRegion();
+ if (region == NULL || !region->capabilitiesReceived())
+ {
+ // we don't have the cap yet, so return false so the caller can try again later.
+
+ LL_DEBUGS("Voice") << "ParcelVoiceInfoRequest capability not yet available, deferring" << LL_ENDL;
+ return false;
+ }
+
+ // grab the cap.
+ std::string url = gAgent.getRegion()->getCapability("ParcelVoiceInfoRequest");
+ if (url.empty())
+ {
+ // Region dosn't have the cap. Stop probing.
+ LL_DEBUGS("Voice") << "ParcelVoiceInfoRequest capability not available in this region" << LL_ENDL;
+ setState(stateDisableCleanup);
+ return false;
+ }
+ else
+ {
+ // if we've already retrieved the cap from the region, go ahead and make the request,
+ // and return true so we can go into the state that waits for the response.
+ checkParcelChanged(true);
+ LLSD data;
+ LL_DEBUGS("Voice") << "sending ParcelVoiceInfoRequest (" << mCurrentRegionName << ", " << mCurrentParcelLocalID << ")" << LL_ENDL;
+
+ LLHTTPClient::post(
+ url,
+ data,
+ new LLVivoxVoiceClientCapResponder(getState()));
+ return true;
}
}
@@ -4530,6 +4551,7 @@ void LLVivoxVoiceClient::switchChannel(
case stateJoinSessionFailed:
case stateJoinSessionFailedWaiting:
case stateNoChannel:
+ case stateRetrievingParcelVoiceInfo:
// Always switch to the new URI from these states.
needsSwitch = true;
break;
@@ -4602,13 +4624,10 @@ void LLVivoxVoiceClient::switchChannel(
mNextAudioSession->mIsP2P = is_p2p;
}
- if(getState() <= stateNoChannel)
+ if(getState() >= stateRetrievingParcelVoiceInfo)
{
- // We're already set up to join a channel, just needed to fill in the session URI
- }
- else
- {
- // State machine will come around and rejoin if uri/handle is not empty.
+ // If we're already in a channel, or if we're joining one, terminate
+ // so we can rejoin with the new session data.
sessionTerminate();
}
}
@@ -5130,7 +5149,7 @@ void LLVivoxVoiceClient::enforceTether(void)
}
}
- if(dist_vec(mCameraPosition, tethered) > 0.1)
+ if(dist_vec_squared(mCameraPosition, tethered) > 0.01)
{
mCameraPosition = tethered;
mSpatialCoordsDirty = true;
@@ -5192,7 +5211,7 @@ void LLVivoxVoiceClient::setCameraPosition(const LLVector3d &position, const LLV
void LLVivoxVoiceClient::setAvatarPosition(const LLVector3d &position, const LLVector3 &velocity, const LLMatrix3 &rot)
{
- if(dist_vec(mAvatarPosition, position) > 0.1)
+ if(dist_vec_squared(mAvatarPosition, position) > 0.01)
{
mAvatarPosition = position;
mSpatialCoordsDirty = true;
@@ -5238,40 +5257,13 @@ void LLVivoxVoiceClient::leaveChannel(void)
void LLVivoxVoiceClient::setMuteMic(bool muted)
{
- mMuteMic = muted;
-}
-
-void LLVivoxVoiceClient::setUserPTTState(bool ptt)
-{
- mUserPTTState = ptt;
-}
-
-bool LLVivoxVoiceClient::getUserPTTState()
-{
- return mUserPTTState;
-}
-
-void LLVivoxVoiceClient::inputUserControlState(bool down)
-{
- if(mPTTIsToggle)
- {
- if(down) // toggle open-mic state on 'down'
- {
- toggleUserPTTState();
- }
- }
- else // set open-mic state as an absolute
+ if(mMuteMic != muted)
{
- setUserPTTState(down);
+ mMuteMic = muted;
+ mMuteMicDirty = true;
}
}
-
-void LLVivoxVoiceClient::toggleUserPTTState(void)
-{
- mUserPTTState = !mUserPTTState;
-}
-
void LLVivoxVoiceClient::setVoiceEnabled(bool enabled)
{
if (enabled != mVoiceEnabled)
@@ -5320,48 +5312,6 @@ BOOL LLVivoxVoiceClient::lipSyncEnabled()
}
}
-void LLVivoxVoiceClient::setUsePTT(bool usePTT)
-{
- if(usePTT && !mUsePTT)
- {
- // When the user turns on PTT, reset the current state.
- mUserPTTState = false;
- }
- mUsePTT = usePTT;
-}
-
-void LLVivoxVoiceClient::setPTTIsToggle(bool PTTIsToggle)
-{
- if(!PTTIsToggle && mPTTIsToggle)
- {
- // When the user turns off toggle, reset the current state.
- mUserPTTState = false;
- }
-
- mPTTIsToggle = PTTIsToggle;
-}
-
-bool LLVivoxVoiceClient::getPTTIsToggle()
-{
- return mPTTIsToggle;
-}
-
-void LLVivoxVoiceClient::setPTTKey(std::string &key)
-{
- if(key == "MiddleMouse")
- {
- mPTTIsMiddleMouse = true;
- }
- else
- {
- mPTTIsMiddleMouse = false;
- if(!LLKeyboard::keyFromString(key, &mPTTKey))
- {
- // If the call failed, don't match any key.
- key = KEY_NONE;
- }
- }
-}
void LLVivoxVoiceClient::setEarLocation(S32 loc)
{
@@ -5402,44 +5352,6 @@ void LLVivoxVoiceClient::setMicGain(F32 volume)
}
}
-void LLVivoxVoiceClient::keyDown(KEY key, MASK mask)
-{
- if (gKeyboard->getKeyRepeated(key))
- {
- // ignore auto-repeat keys
- return;
- }
-
- if(!mPTTIsMiddleMouse)
- {
- bool down = (mPTTKey != KEY_NONE)
- && gKeyboard->getKeyDown(mPTTKey);
- inputUserControlState(down);
- }
-
-
-}
-void LLVivoxVoiceClient::keyUp(KEY key, MASK mask)
-{
- if(!mPTTIsMiddleMouse)
- {
- bool down = (mPTTKey != KEY_NONE)
- && gKeyboard->getKeyDown(mPTTKey);
- inputUserControlState(down);
- }
-
-}
-void LLVivoxVoiceClient::middleMouseState(bool down)
-{
- if(mPTTIsMiddleMouse)
- {
- if(mPTTIsMiddleMouse)
- {
- inputUserControlState(down);
- }
- }
-}
-
/////////////////////////////
// Accessors for data related to nearby speakers
BOOL LLVivoxVoiceClient::getVoiceEnabled(const LLUUID& id)
@@ -6345,6 +6257,19 @@ void LLVivoxVoiceClient::notifyStatusObservers(LLVoiceClientStatusObserver::ESta
it = mStatusObservers.upper_bound(observer);
}
+ // skipped to avoid speak button blinking
+ if ( status != LLVoiceClientStatusObserver::STATUS_JOINING
+ && status != LLVoiceClientStatusObserver::STATUS_LEFT_CHANNEL)
+ {
+ bool voice_status = LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking();
+
+ gAgent.setVoiceConnected(voice_status);
+
+ if (voice_status)
+ {
+ LLFirstUse::speak(true);
+ }
+ }
}
void LLVivoxVoiceClient::addObserver(LLFriendObserver* observer)
@@ -6416,13 +6341,13 @@ void LLVivoxVoiceClient::avatarNameResolved(const LLUUID &id, const std::string
{
session->mTextInvitePending = false;
- // We don't need to call gIMMgr->addP2PSession() here. The first incoming message will create the panel.
+ // We don't need to call LLIMMgr::getInstance()->addP2PSession() here. The first incoming message will create the panel.
}
if(session->mVoiceInvitePending)
{
session->mVoiceInvitePending = false;
- gIMMgr->inviteToSession(
+ LLIMMgr::getInstance()->inviteToSession(
session->mIMSessionID,
session->mName,
session->mCallerID,
@@ -7015,8 +6940,8 @@ void LLVivoxVoiceClient::captureBufferRecordStartSendMessage()
<< "<Value>false</Value>"
<< "</Request>\n\n\n";
- // Dirty the PTT state so that it will get reset when we finishing previewing
- mPTTDirty = true;
+ // Dirty the mute mic state so that it will get reset when we finishing previewing
+ mMuteMicDirty = true;
writeString(stream.str());
}
@@ -7030,7 +6955,7 @@ void LLVivoxVoiceClient::captureBufferRecordStopSendMessage()
LL_DEBUGS("Voice") << "Stopping audio capture to buffer." << LL_ENDL;
- // Mute the mic. PTT state was dirtied at recording start, so will be reset when finished previewing.
+ // Mute the mic. Mic mute state was dirtied at recording start, so will be reset when finished previewing.
stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Connector.MuteLocalMic.1\">"
<< "<ConnectorHandle>" << mConnectorHandle << "</ConnectorHandle>"
<< "<Value>true</Value>"
@@ -7094,7 +7019,6 @@ void LLVivoxVoiceClient::captureBufferPlayStopSendMessage()
LLVivoxProtocolParser::LLVivoxProtocolParser()
{
- parser = NULL;
parser = XML_ParserCreate(NULL);
reset();
@@ -7128,13 +7052,6 @@ void LLVivoxProtocolParser::reset()
alias.clear();
numberOfAliases = 0;
applicationString.clear();
- id = 0;
- nameString.clear();
- descriptionString.clear();
- expirationDate = LLDate();
- hasExpired = false;
- fontType = 0;
- fontStatus = 0;
}
//virtual
@@ -7144,6 +7061,8 @@ LLVivoxProtocolParser::~LLVivoxProtocolParser()
XML_ParserFree(parser);
}
+static LLFastTimer::DeclareTimer FTM_VIVOX_PROCESS("Vivox Process");
+
// virtual
LLIOPipe::EStatus LLVivoxProtocolParser::process_impl(
const LLChannelDescriptors& channels,
@@ -7152,6 +7071,7 @@ LLIOPipe::EStatus LLVivoxProtocolParser::process_impl(
LLSD& context,
LLPumpIO* pump)
{
+ LLFastTimer t(FTM_VIVOX_PROCESS);
LLBufferStream istr(channels, buffer.get());
std::ostringstream ostr;
while (istr.good())
diff --git a/indra/newview/llvoicevivox.h b/indra/newview/llvoicevivox.h
index 3ba517bf36..1142a1a49c 100644
--- a/indra/newview/llvoicevivox.h
+++ b/indra/newview/llvoicevivox.h
@@ -173,25 +173,9 @@ public:
virtual void setVoiceEnabled(bool enabled);
virtual BOOL lipSyncEnabled();
virtual void setLipSyncEnabled(BOOL enabled);
- virtual void setMuteMic(bool muted); // Use this to mute the local mic (for when the client is minimized, etc), ignoring user PTT state.
+ virtual void setMuteMic(bool muted); // Set the mute state of the local mic.
//@}
-
- ////////////////////////
- /// @name PTT
- //@{
- virtual void setUserPTTState(bool ptt);
- virtual bool getUserPTTState();
- virtual void setUsePTT(bool usePTT);
- virtual void setPTTIsToggle(bool PTTIsToggle);
- virtual bool getPTTIsToggle();
- virtual void inputUserControlState(bool down); // interpret any sort of up-down mic-open control input according to ptt-toggle prefs
- virtual void toggleUserPTTState(void);
-
- virtual void keyDown(KEY key, MASK mask);
- virtual void keyUp(KEY key, MASK mask);
- virtual void middleMouseState(bool down);
- //@}
-
+
//////////////////////////
/// @name nearby speaker accessors
//@{
@@ -396,7 +380,8 @@ protected:
stateVoiceFontsWait, // Awaiting the list of voice fonts
stateVoiceFontsReceived, // List of voice fonts received
stateCreatingSessionGroup, // Creating the main session group
- stateNoChannel, //
+ stateNoChannel, // Need to join a channel
+ stateRetrievingParcelVoiceInfo, // waiting for parcel voice info request to return with spatial credentials
stateJoiningSession, // waiting for session handle
stateSessionJoined, // session handle received
stateRunning, // in session, steady state
@@ -534,9 +519,6 @@ protected:
// Use this to determine whether to show a "no speech" icon in the menu bar.
- // PTT
- void setPTTKey(std::string &key);
-
/////////////////////////////
// Recording controls
void recordingLoopStart(int seconds = 3600, int deltaFramesPerControlFrame = 200);
@@ -639,6 +621,8 @@ protected:
void sessionMediaDisconnectSendMessage(sessionState *session);
void sessionTextDisconnectSendMessage(sessionState *session);
+
+
// Pokes the state machine to leave the audio session next time around.
void sessionTerminate();
@@ -648,6 +632,12 @@ protected:
// Does the actual work to get out of the audio session
void leaveAudioSession();
+ // notifies the voice client that we've received parcel voice info
+ bool parcelVoiceInfoReceived(state requesting_state);
+
+ friend class LLVivoxVoiceClientCapResponder;
+
+
void lookupName(const LLUUID &id);
void onAvatarNameCache(const LLUUID& id, const LLAvatarName& av_name);
void avatarNameResolved(const LLUUID &id, const std::string &name);
@@ -752,9 +742,11 @@ private:
bool mCaptureDeviceDirty;
bool mRenderDeviceDirty;
+
+ bool checkParcelChanged(bool update = false);
// This should be called when the code detects we have changed parcels.
// It initiates the call to the server that gets the parcel channel.
- void parcelChanged();
+ bool requestParcelVoiceInfo();
void switchChannel(std::string uri = std::string(), bool spatial = true, bool no_reconnect = false, bool is_p2p = false, std::string hash = "");
void joinSession(sessionState *session);
@@ -800,15 +792,8 @@ private:
LLVector3 mAvatarVelocity;
LLMatrix3 mAvatarRot;
- bool mPTTDirty;
- bool mPTT;
-
- bool mUsePTT;
- bool mPTTIsMiddleMouse;
- KEY mPTTKey;
- bool mPTTIsToggle;
- bool mUserPTTState;
bool mMuteMic;
+ bool mMuteMicDirty;
// Set to true when the friends list is known to have changed.
bool mFriendsListDirty;
diff --git a/indra/newview/llvopartgroup.cpp b/indra/newview/llvopartgroup.cpp
index 40833ad259..5c10a80b07 100644
--- a/indra/newview/llvopartgroup.cpp
+++ b/indra/newview/llvopartgroup.cpp
@@ -73,12 +73,14 @@ F32 LLVOPartGroup::getBinRadius()
return mScale.mV[0]*2.f;
}
-void LLVOPartGroup::updateSpatialExtents(LLVector3& newMin, LLVector3& newMax)
+void LLVOPartGroup::updateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax)
{
const LLVector3& pos_agent = getPositionAgent();
- newMin = pos_agent - mScale;
- newMax = pos_agent + mScale;
- mDrawable->setPositionGroup(pos_agent);
+ newMin.load3( (pos_agent - mScale).mV);
+ newMax.load3( (pos_agent + mScale).mV);
+ LLVector4a pos;
+ pos.load3(pos_agent.mV);
+ mDrawable->setPositionGroup(pos);
}
BOOL LLVOPartGroup::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
@@ -272,7 +274,7 @@ BOOL LLVOPartGroup::updateGeometry(LLDrawable *drawable)
}
void LLVOPartGroup::getGeometry(S32 idx,
- LLStrider<LLVector3>& verticesp,
+ LLStrider<LLVector4a>& verticesp,
LLStrider<LLVector3>& normalsp,
LLStrider<LLVector2>& texcoordsp,
LLStrider<LLColor4U>& colorsp,
@@ -288,45 +290,81 @@ void LLVOPartGroup::getGeometry(S32 idx,
U32 vert_offset = mDrawable->getFace(idx)->getGeomIndex();
- LLVector3 part_pos_agent(part.mPosAgent);
- LLVector3 camera_agent = getCameraPosition();
- LLVector3 at = part_pos_agent - camera_agent;
- LLVector3 up;
- LLVector3 right;
-
- right = at % LLVector3(0.f, 0.f, 1.f);
- right.normalize();
- up = right % at;
- up.normalize();
+ LLVector4a part_pos_agent;
+ part_pos_agent.load3(part.mPosAgent.mV);
+ LLVector4a camera_agent;
+ camera_agent.load3(getCameraPosition().mV);
+ LLVector4a at;
+ at.setSub(part_pos_agent, camera_agent);
+ LLVector4a up(0, 0, 1);
+ LLVector4a right;
+
+ right.setCross3(at, up);
+ right.normalize3fast();
+ up.setCross3(right, at);
+ up.normalize3fast();
if (part.mFlags & LLPartData::LL_PART_FOLLOW_VELOCITY_MASK)
{
- LLVector3 normvel = part.mVelocity;
- normvel.normalize();
+ LLVector4a normvel;
+ normvel.load3(part.mVelocity.mV);
+ normvel.normalize3fast();
LLVector2 up_fracs;
- up_fracs.mV[0] = normvel*right;
- up_fracs.mV[1] = normvel*up;
+ up_fracs.mV[0] = normvel.dot3(right).getF32();
+ up_fracs.mV[1] = normvel.dot3(up).getF32();
up_fracs.normalize();
- LLVector3 new_up;
- LLVector3 new_right;
- new_up = up_fracs.mV[0] * right + up_fracs.mV[1]*up;
- new_right = up_fracs.mV[1] * right - up_fracs.mV[0]*up;
+ LLVector4a new_up;
+ LLVector4a new_right;
+
+ //new_up = up_fracs.mV[0] * right + up_fracs.mV[1]*up;
+ LLVector4a t = right;
+ t.mul(up_fracs.mV[0]);
+ new_up = up;
+ new_up.mul(up_fracs.mV[1]);
+ new_up.add(t);
+
+ //new_right = up_fracs.mV[1] * right - up_fracs.mV[0]*up;
+ t = right;
+ t.mul(up_fracs.mV[1]);
+ new_right = up;
+ new_right.mul(up_fracs.mV[0]);
+ t.sub(new_right);
+
up = new_up;
- right = new_right;
- up.normalize();
- right.normalize();
+ right = t;
+ up.normalize3fast();
+ right.normalize3fast();
}
- right *= 0.5f*part.mScale.mV[0];
- up *= 0.5f*part.mScale.mV[1];
+ right.mul(0.5f*part.mScale.mV[0]);
+ up.mul(0.5f*part.mScale.mV[1]);
LLVector3 normal = -LLViewerCamera::getInstance()->getXAxis();
-
- *verticesp++ = part_pos_agent + up - right;
- *verticesp++ = part_pos_agent - up - right;
- *verticesp++ = part_pos_agent + up + right;
- *verticesp++ = part_pos_agent - up + right;
+
+ //HACK -- the verticesp->mV[3] = 0.f here are to set the texture index to 0 (particles don't use texture batching, maybe they should)
+ // this works because there is actually a 4th float stored after the vertex position which is used as a texture index
+ // also, somebody please VECTORIZE THIS
+
+ LLVector4a ppapu;
+ LLVector4a ppamu;
+
+ ppapu.setAdd(part_pos_agent, up);
+ ppamu.setSub(part_pos_agent, up);
+
+ verticesp->setSub(ppapu, right);
+ (*verticesp++).getF32ptr()[3] = 0.f;
+ verticesp->setSub(ppamu, right);
+ (*verticesp++).getF32ptr()[3] = 0.f;
+ verticesp->setAdd(ppapu, right);
+ (*verticesp++).getF32ptr()[3] = 0.f;
+ verticesp->setAdd(ppamu, right);
+ (*verticesp++).getF32ptr()[3] = 0.f;
+
+ //*verticesp++ = part_pos_agent + up - right;
+ //*verticesp++ = part_pos_agent - up - right;
+ //*verticesp++ = part_pos_agent + up + right;
+ //*verticesp++ = part_pos_agent - up + right;
*colorsp++ = part.mColor;
*colorsp++ = part.mColor;
@@ -358,7 +396,7 @@ U32 LLVOPartGroup::getPartitionType() const
}
LLParticlePartition::LLParticlePartition()
-: LLSpatialPartition(LLDrawPoolAlpha::VERTEX_DATA_MASK, TRUE, GL_DYNAMIC_DRAW_ARB)
+: LLSpatialPartition(LLDrawPoolAlpha::VERTEX_DATA_MASK | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, GL_STREAM_DRAW_ARB)
{
mRenderPass = LLRenderPass::PASS_ALPHA;
mDrawableType = LLPipeline::RENDER_TYPE_PARTICLES;
@@ -416,6 +454,7 @@ void LLParticlePartition::addGeometryCount(LLSpatialGroup* group, U32& vertex_co
mFaceList.push_back(facep);
vertex_count += facep->getGeomCount();
index_count += facep->getIndicesCount();
+ llassert(facep->getIndicesCount() < 65536);
}
obj->mDepth /= count;
@@ -442,7 +481,7 @@ void LLParticlePartition::getGeometry(LLSpatialGroup* group)
LLVertexBuffer* buffer = group->mVertexBuffer;
LLStrider<U16> indicesp;
- LLStrider<LLVector3> verticesp;
+ LLStrider<LLVector4a> verticesp;
LLStrider<LLVector3> normalsp;
LLStrider<LLVector2> texcoordsp;
LLStrider<LLColor4U> colorsp;
@@ -461,7 +500,7 @@ void LLParticlePartition::getGeometry(LLSpatialGroup* group)
LLAlphaObject* object = (LLAlphaObject*) facep->getViewerObject();
facep->setGeomIndex(vertex_count);
facep->setIndicesIndex(index_count);
- facep->mVertexBuffer = buffer;
+ facep->setVertexBuffer(buffer);
facep->setPoolType(LLDrawPool::POOL_ALPHA);
object->getGeometry(facep->getTEOffset(), verticesp, normalsp, texcoordsp, colorsp, indicesp);
@@ -502,7 +541,7 @@ void LLParticlePartition::getGeometry(LLSpatialGroup* group)
}
}
- buffer->setBuffer(0);
+ buffer->flush();
mFaceList.clear();
}
diff --git a/indra/newview/llvopartgroup.h b/indra/newview/llvopartgroup.h
index b136f2cbfa..e58fed86d9 100644
--- a/indra/newview/llvopartgroup.h
+++ b/indra/newview/llvopartgroup.h
@@ -51,7 +51,7 @@ public:
BOOL idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);
virtual F32 getBinRadius();
- virtual void updateSpatialExtents(LLVector3& newMin, LLVector3& newMax);
+ virtual void updateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax);
virtual U32 getPartitionType() const;
/*virtual*/ void setPixelAreaAndAngle(LLAgent &agent);
@@ -60,7 +60,7 @@ public:
/*virtual*/ LLDrawable* createDrawable(LLPipeline *pipeline);
/*virtual*/ BOOL updateGeometry(LLDrawable *drawable);
void getGeometry(S32 idx,
- LLStrider<LLVector3>& verticesp,
+ LLStrider<LLVector4a>& verticesp,
LLStrider<LLVector3>& normalsp,
LLStrider<LLVector2>& texcoordsp,
LLStrider<LLColor4U>& colorsp,
diff --git a/indra/newview/llvosky.cpp b/indra/newview/llvosky.cpp
index 7ae8c2c07d..312034022e 100644
--- a/indra/newview/llvosky.cpp
+++ b/indra/newview/llvosky.cpp
@@ -77,9 +77,6 @@ static const LLVector2 TEX11 = LLVector2(1.f, 1.f);
LLUUID gSunTextureID = IMG_SUN;
LLUUID gMoonTextureID = IMG_MOON;
-//static
-LLColor3 LLHaze::sAirScaSeaLevel;
-
class LLFastLn
{
public:
@@ -182,6 +179,23 @@ inline void color_gamma_correct(LLColor3 &col)
}
}
+static LLColor3 calc_air_sca_sea_level()
+{
+ static LLColor3 WAVE_LEN(675, 520, 445);
+ static LLColor3 refr_ind = refr_ind_calc(WAVE_LEN);
+ static LLColor3 n21 = refr_ind * refr_ind - LLColor3(1, 1, 1);
+ static LLColor3 n4 = n21 * n21;
+ static LLColor3 wl2 = WAVE_LEN * WAVE_LEN * 1e-6f;
+ static LLColor3 wl4 = wl2 * wl2;
+ static LLColor3 mult_const = fsigma * 2.0f/ 3.0f * 1e24f * (F_PI * F_PI) * n4;
+ static F32 dens_div_N = F32( ATM_SEA_LEVEL_NDENS / Ndens2);
+ return dens_div_N * color_div ( mult_const, wl4 );
+}
+
+// static constants.
+LLColor3 const LLHaze::sAirScaSeaLevel = calc_air_sca_sea_level();
+F32 const LLHaze::sAirScaIntense = color_intens(LLHaze::sAirScaSeaLevel);
+F32 const LLHaze::sAirScaAvg = LLHaze::sAirScaIntense / 3.f;
/***************************************
@@ -290,7 +304,7 @@ void LLSkyTex::createGLImage(S32 which)
void LLSkyTex::bindTexture(BOOL curr)
{
- gGL.getTexUnit(0)->bind(mTexture[getWhich(curr)]);
+ gGL.getTexUnit(0)->bind(mTexture[getWhich(curr)], true);
}
/***************************************
@@ -328,7 +342,7 @@ LLVOSky::LLVOSky(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp)
blue_density = LLColor3();
blue_horizon = LLColor3();
haze_density = 0.f;
- haze_horizon = LLColor3();
+ haze_horizon = 1.f;
density_multiplier = 0.f;
max_y = 0.f;
glow = LLColor3();
@@ -356,7 +370,7 @@ LLVOSky::LLVOSky(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp)
mAtmHeight = ATM_HEIGHT;
mEarthCenter = LLVector3(mCameraPosAgent.mV[0], mCameraPosAgent.mV[1], -EARTH_RADIUS);
- mSunDefaultPosition = LLVector3(LLWLParamManager::instance()->mCurParams.getVector("lightnorm", error));
+ mSunDefaultPosition = LLVector3(LLWLParamManager::getInstance()->mCurParams.getVector("lightnorm", error));
if (gSavedSettings.getBOOL("SkyOverrideSimSunPosition"))
{
initSunDirection(mSunDefaultPosition, LLVector3(0, 0, 0));
@@ -394,12 +408,6 @@ LLVOSky::~LLVOSky()
mCubeMap = NULL;
}
-void LLVOSky::initClass()
-{
- LLHaze::initClass();
-}
-
-
void LLVOSky::init()
{
const F32 haze_int = color_intens(mHaze.calcSigSca(0));
@@ -638,24 +646,24 @@ void LLVOSky::initAtmospherics(void)
bool error;
// uniform parameters for convenience
- dome_radius = LLWLParamManager::instance()->getDomeRadius();
- dome_offset_ratio = LLWLParamManager::instance()->getDomeOffset();
- sunlight_color = LLColor3(LLWLParamManager::instance()->mCurParams.getVector("sunlight_color", error));
- ambient = LLColor3(LLWLParamManager::instance()->mCurParams.getVector("ambient", error));
- //lightnorm = LLWLParamManager::instance()->mCurParams.getVector("lightnorm", error);
- gamma = LLWLParamManager::instance()->mCurParams.getVector("gamma", error)[0];
- blue_density = LLColor3(LLWLParamManager::instance()->mCurParams.getVector("blue_density", error));
- blue_horizon = LLColor3(LLWLParamManager::instance()->mCurParams.getVector("blue_horizon", error));
- haze_density = LLWLParamManager::instance()->mCurParams.getVector("haze_density", error)[0];
- haze_horizon = LLColor3(LLWLParamManager::instance()->mCurParams.getVector("haze_horizon", error));
- density_multiplier = LLWLParamManager::instance()->mCurParams.getVector("density_multiplier", error)[0];
- max_y = LLWLParamManager::instance()->mCurParams.getVector("max_y", error)[0];
- glow = LLColor3(LLWLParamManager::instance()->mCurParams.getVector("glow", error));
- cloud_shadow = LLWLParamManager::instance()->mCurParams.getVector("cloud_shadow", error)[0];
- cloud_color = LLColor3(LLWLParamManager::instance()->mCurParams.getVector("cloud_color", error));
- cloud_scale = LLWLParamManager::instance()->mCurParams.getVector("cloud_scale", error)[0];
- cloud_pos_density1 = LLColor3(LLWLParamManager::instance()->mCurParams.getVector("cloud_pos_density1", error));
- cloud_pos_density2 = LLColor3(LLWLParamManager::instance()->mCurParams.getVector("cloud_pos_density2", error));
+ dome_radius = LLWLParamManager::getInstance()->getDomeRadius();
+ dome_offset_ratio = LLWLParamManager::getInstance()->getDomeOffset();
+ sunlight_color = LLColor3(LLWLParamManager::getInstance()->mCurParams.getVector("sunlight_color", error));
+ ambient = LLColor3(LLWLParamManager::getInstance()->mCurParams.getVector("ambient", error));
+ //lightnorm = LLWLParamManager::getInstance()->mCurParams.getVector("lightnorm", error);
+ gamma = LLWLParamManager::getInstance()->mCurParams.getFloat("gamma", error);
+ blue_density = LLColor3(LLWLParamManager::getInstance()->mCurParams.getVector("blue_density", error));
+ blue_horizon = LLColor3(LLWLParamManager::getInstance()->mCurParams.getVector("blue_horizon", error));
+ haze_density = LLWLParamManager::getInstance()->mCurParams.getFloat("haze_density", error);
+ haze_horizon = LLWLParamManager::getInstance()->mCurParams.getFloat("haze_horizon", error);
+ density_multiplier = LLWLParamManager::getInstance()->mCurParams.getFloat("density_multiplier", error);
+ max_y = LLWLParamManager::getInstance()->mCurParams.getFloat("max_y", error);
+ glow = LLColor3(LLWLParamManager::getInstance()->mCurParams.getVector("glow", error));
+ cloud_shadow = LLWLParamManager::getInstance()->mCurParams.getFloat("cloud_shadow", error);
+ cloud_color = LLColor3(LLWLParamManager::getInstance()->mCurParams.getVector("cloud_color", error));
+ cloud_scale = LLWLParamManager::getInstance()->mCurParams.getFloat("cloud_scale", error);
+ cloud_pos_density1 = LLColor3(LLWLParamManager::getInstance()->mCurParams.getVector("cloud_pos_density1", error));
+ cloud_pos_density2 = LLColor3(LLWLParamManager::getInstance()->mCurParams.getVector("cloud_pos_density2", error));
// light norm is different. We need the sun's direction, not the light direction
// which could be from the moon. And we need to clamp it
@@ -747,6 +755,11 @@ void LLVOSky::calcSkyColorWLVert(LLVector3 & Pn, LLColor3 & vary_HazeColor, LLCo
// project the direction ray onto the sky dome.
F32 phi = acos(Pn[1]);
F32 sinA = sin(F_PI - phi);
+ if (fabsf(sinA) < 0.01f)
+ { //avoid division by zero
+ sinA = 0.01f;
+ }
+
F32 Plen = dome_radius * sin(F_PI + phi + asin(dome_offset_ratio * sinA)) / sinA;
Pn *= Plen;
@@ -812,7 +825,7 @@ void LLVOSky::calcSkyColorWLVert(LLVector3 & Pn, LLColor3 & vary_HazeColor, LLCo
// Haze color above cloud
vary_HazeColor = (blue_horizon * blue_weight * (sunlight + ambient)
- + componentMult(haze_horizon.mV[0] * haze_weight, sunlight * temp2.mV[0] + ambient)
+ + componentMult(haze_horizon * haze_weight, sunlight * temp2.mV[0] + ambient)
);
// Increase ambient when there are more clouds
@@ -823,7 +836,7 @@ void LLVOSky::calcSkyColorWLVert(LLVector3 & Pn, LLColor3 & vary_HazeColor, LLCo
// Haze color below cloud
LLColor3 additiveColorBelowCloud = (blue_horizon * blue_weight * (sunlight + tmpAmbient)
- + componentMult(haze_horizon.mV[0] * haze_weight, sunlight * temp2.mV[0] + tmpAmbient)
+ + componentMult(haze_horizon * haze_weight, sunlight * temp2.mV[0] + tmpAmbient)
);
// Final atmosphere additive
@@ -989,7 +1002,7 @@ void LLVOSky::calcAtmospherics(void)
//haze color
vary_HazeColor =
(blue_horizon * blue_weight * (sunlight*(1.f - cloud_shadow) + tmpAmbient)
- + componentMult(haze_horizon.mV[0] * haze_weight, sunlight*(1.f - cloud_shadow) * temp2.mV[0] + tmpAmbient)
+ + componentMult(haze_horizon * haze_weight, sunlight*(1.f - cloud_shadow) * temp2.mV[0] + tmpAmbient)
);
//brightness of surface both sunlight and ambient
@@ -1025,7 +1038,7 @@ void LLVOSky::calcAtmospherics(void)
// Since WL scales everything by 2, there should always be at least a 2:1 brightness ratio
// between sunlight and point lights in windlight to normalize point lights.
F32 sun_dynamic_range = llmax(gSavedSettings.getF32("RenderSunDynamicRange"), 0.0001f);
- LLWLParamManager::instance()->mSceneLightStrength = 2.0f * (1.0f + sun_dynamic_range * dp);
+ LLWLParamManager::getInstance()->mSceneLightStrength = 2.0f * (1.0f + sun_dynamic_range * dp);
mSunDiffuse = vary_SunlightColor;
mSunAmbient = vary_AmbientColor;
@@ -1174,7 +1187,7 @@ BOOL LLVOSky::updateSky()
}
}
- if (mDrawable.notNull() && mDrawable->getFace(0) && mDrawable->getFace(0)->mVertexBuffer.isNull())
+ if (mDrawable.notNull() && mDrawable->getFace(0) && !mDrawable->getFace(0)->getVertexBuffer())
{
gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_VOLUME, TRUE);
}
@@ -1225,10 +1238,11 @@ void LLVOSky::createDummyVertexBuffer()
mFace[FACE_DUMMY] = mDrawable->addFace(poolp, NULL);
}
- if(mFace[FACE_DUMMY]->mVertexBuffer.isNull())
+ if(!mFace[FACE_DUMMY]->getVertexBuffer())
{
- mFace[FACE_DUMMY]->mVertexBuffer = new LLVertexBuffer(LLDrawPoolSky::VERTEX_DATA_MASK, GL_DYNAMIC_DRAW_ARB);
- mFace[FACE_DUMMY]->mVertexBuffer->allocateBuffer(1, 1, TRUE);
+ LLVertexBuffer* buff = new LLVertexBuffer(LLDrawPoolSky::VERTEX_DATA_MASK, GL_DYNAMIC_DRAW_ARB);
+ buff->allocateBuffer(1, 1, TRUE);
+ mFace[FACE_DUMMY]->setVertexBuffer(buff);
}
}
@@ -1247,13 +1261,13 @@ void LLVOSky::updateDummyVertexBuffer()
LLFastTimer t(FTM_RENDER_FAKE_VBO_UPDATE) ;
- if(!mFace[FACE_DUMMY] || mFace[FACE_DUMMY]->mVertexBuffer.isNull())
+ if(!mFace[FACE_DUMMY] || !mFace[FACE_DUMMY]->getVertexBuffer())
createDummyVertexBuffer() ;
LLStrider<LLVector3> vertices ;
- mFace[FACE_DUMMY]->mVertexBuffer->getVertexStrider(vertices, 0);
+ mFace[FACE_DUMMY]->getVertexBuffer()->getVertexStrider(vertices, 0);
*vertices = mCameraPosAgent ;
- mFace[FACE_DUMMY]->mVertexBuffer->setBuffer(0) ;
+ mFace[FACE_DUMMY]->getVertexBuffer()->flush();
}
//----------------------------------
//end of fake vertex buffer updating
@@ -1296,14 +1310,15 @@ BOOL LLVOSky::updateGeometry(LLDrawable *drawable)
{
face = mFace[FACE_SIDE0 + side];
- if (face->mVertexBuffer.isNull())
+ if (!face->getVertexBuffer())
{
face->setSize(4, 6);
face->setGeomIndex(0);
face->setIndicesIndex(0);
- face->mVertexBuffer = new LLVertexBuffer(LLDrawPoolSky::VERTEX_DATA_MASK, GL_STREAM_DRAW_ARB);
- face->mVertexBuffer->allocateBuffer(4, 6, TRUE);
-
+ LLVertexBuffer* buff = new LLVertexBuffer(LLDrawPoolSky::VERTEX_DATA_MASK, GL_STREAM_DRAW_ARB);
+ buff->allocateBuffer(4, 6, TRUE);
+ face->setVertexBuffer(buff);
+
index_offset = face->getGeometry(verticesp,normalsp,texCoordsp, indicesp);
S32 vtx = 0;
@@ -1336,7 +1351,7 @@ BOOL LLVOSky::updateGeometry(LLDrawable *drawable)
*indicesp++ = index_offset + 3;
*indicesp++ = index_offset + 2;
- face->mVertexBuffer->setBuffer(0);
+ buff->flush();
}
}
@@ -1463,15 +1478,18 @@ BOOL LLVOSky::updateHeavenlyBodyGeometry(LLDrawable *drawable, const S32 f, cons
facep = mFace[f];
- if (facep->mVertexBuffer.isNull())
+ if (!facep->getVertexBuffer())
{
- facep->setSize(4, 6);
- facep->mVertexBuffer = new LLVertexBuffer(LLDrawPoolSky::VERTEX_DATA_MASK, GL_STREAM_DRAW_ARB);
- facep->mVertexBuffer->allocateBuffer(facep->getGeomCount(), facep->getIndicesCount(), TRUE);
+ facep->setSize(4, 6);
+ LLVertexBuffer* buff = new LLVertexBuffer(LLDrawPoolSky::VERTEX_DATA_MASK, GL_STREAM_DRAW_ARB);
+ buff->allocateBuffer(facep->getGeomCount(), facep->getIndicesCount(), TRUE);
facep->setGeomIndex(0);
facep->setIndicesIndex(0);
+ facep->setVertexBuffer(buff);
}
+ llassert(facep->getVertexBuffer()->getNumIndices() == 6);
+
index_offset = facep->getGeometry(verticesp,normalsp,texCoordsp, indicesp);
if (-1 == index_offset)
@@ -1498,7 +1516,7 @@ BOOL LLVOSky::updateHeavenlyBodyGeometry(LLDrawable *drawable, const S32 f, cons
*indicesp++ = index_offset + 2;
*indicesp++ = index_offset + 3;
- facep->mVertexBuffer->setBuffer(0);
+ facep->getVertexBuffer()->flush();
if (is_sun)
{
@@ -1867,13 +1885,14 @@ void LLVOSky::updateReflectionGeometry(LLDrawable *drawable, F32 H,
LLFace *face = mFace[FACE_REFLECTION];
- if (face->mVertexBuffer.isNull() || quads*4 != face->getGeomCount())
+ if (!face->getVertexBuffer() || quads*4 != face->getGeomCount())
{
face->setSize(quads * 4, quads * 6);
- face->mVertexBuffer = new LLVertexBuffer(LLDrawPoolWater::VERTEX_DATA_MASK, GL_STREAM_DRAW_ARB);
- face->mVertexBuffer->allocateBuffer(face->getGeomCount(), face->getIndicesCount(), TRUE);
+ LLVertexBuffer* buff = new LLVertexBuffer(LLDrawPoolWater::VERTEX_DATA_MASK, GL_STREAM_DRAW_ARB);
+ buff->allocateBuffer(face->getGeomCount(), face->getIndicesCount(), TRUE);
face->setIndicesIndex(0);
face->setGeomIndex(0);
+ face->setVertexBuffer(buff);
}
LLStrider<LLVector3> verticesp;
@@ -2011,7 +2030,7 @@ void LLVOSky::updateReflectionGeometry(LLDrawable *drawable, F32 H,
}
}
- face->mVertexBuffer->setBuffer(0);
+ face->getVertexBuffer()->flush();
}
@@ -2021,9 +2040,12 @@ void LLVOSky::updateFog(const F32 distance)
{
if (!gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_FOG))
{
- glFogf(GL_FOG_DENSITY, 0);
- glFogfv(GL_FOG_COLOR, (F32 *) &LLColor4::white.mV);
- glFogf(GL_FOG_END, 1000000.f);
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ glFogf(GL_FOG_DENSITY, 0);
+ glFogfv(GL_FOG_COLOR, (F32 *) &LLColor4::white.mV);
+ glFogf(GL_FOG_END, 1000000.f);
+ }
return;
}
@@ -2093,7 +2115,10 @@ void LLVOSky::updateFog(const F32 distance)
if (camera_height > water_height)
{
LLColor4 fog(render_fog_color);
- glFogfv(GL_FOG_COLOR, fog.mV);
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ glFogfv(GL_FOG_COLOR, fog.mV);
+ }
mGLFogCol = fog;
if (hide_clip_plane)
@@ -2101,13 +2126,19 @@ void LLVOSky::updateFog(const F32 distance)
// For now, set the density to extend to the cull distance.
const F32 f_log = 2.14596602628934723963618357029f; // sqrt(fabs(log(0.01f)))
fog_density = f_log/fog_distance;
- glFogi(GL_FOG_MODE, GL_EXP2);
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ glFogi(GL_FOG_MODE, GL_EXP2);
+ }
}
else
{
const F32 f_log = 4.6051701859880913680359829093687f; // fabs(log(0.01f))
fog_density = (f_log)/fog_distance;
- glFogi(GL_FOG_MODE, GL_EXP);
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ glFogi(GL_FOG_MODE, GL_EXP);
+ }
}
}
else
@@ -2115,7 +2146,7 @@ void LLVOSky::updateFog(const F32 distance)
F32 depth = water_height - camera_height;
// get the water param manager variables
- float water_fog_density = LLWaterParamManager::instance()->getFogDensity();
+ float water_fog_density = LLWaterParamManager::getInstance()->getFogDensity();
LLColor4 water_fog_color = LLDrawPoolWater::sWaterFogColor.mV;
// adjust the color based on depth. We're doing linear approximations
@@ -2127,37 +2158,34 @@ void LLVOSky::updateFog(const F32 distance)
fogCol.setAlpha(1);
// set the gl fog color
- glFogfv(GL_FOG_COLOR, (F32 *) &fogCol.mV);
mGLFogCol = fogCol;
// set the density based on what the shaders use
fog_density = water_fog_density * gSavedSettings.getF32("WaterGLFogDensityScale");
- glFogi(GL_FOG_MODE, GL_EXP2);
+
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ glFogfv(GL_FOG_COLOR, (F32 *) &fogCol.mV);
+ glFogi(GL_FOG_MODE, GL_EXP2);
+ }
}
mFogColor = sky_fog_color;
mFogColor.setAlpha(1);
- LLGLSFog gls_fog;
-
- glFogf(GL_FOG_END, fog_distance*2.2f);
+ LLDrawPoolWater::sWaterFogEnd = fog_distance*2.2f;
- glFogf(GL_FOG_DENSITY, fog_density);
-
- glHint(GL_FOG_HINT, GL_NICEST);
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ LLGLSFog gls_fog;
+ glFogf(GL_FOG_END, fog_distance*2.2f);
+ glFogf(GL_FOG_DENSITY, fog_density);
+ glHint(GL_FOG_HINT, GL_NICEST);
+ }
stop_glerror();
}
-// static
-void LLHaze::initClass()
-{
- sAirScaSeaLevel = LLHaze::calcAirScaSeaLevel();
-}
-
-
// Functions used a lot.
-
-
F32 color_norm_pow(LLColor3& col, F32 e, BOOL postmultiply)
{
F32 mv = color_max(col);
diff --git a/indra/newview/llvosky.h b/indra/newview/llvosky.h
index 6b3e7873a1..6e6898d80a 100644
--- a/indra/newview/llvosky.h
+++ b/indra/newview/llvosky.h
@@ -292,23 +292,6 @@ LL_FORCE_INLINE LLColor3 refr_ind_calc(const LLColor3 &wave_length)
}
-LL_FORCE_INLINE LLColor3 calc_air_sca_sea_level()
-{
- const static LLColor3 WAVE_LEN(675, 520, 445);
- const static LLColor3 refr_ind = refr_ind_calc(WAVE_LEN);
- const static LLColor3 n21 = refr_ind * refr_ind - LLColor3(1, 1, 1);
- const static LLColor3 n4 = n21 * n21;
- const static LLColor3 wl2 = WAVE_LEN * WAVE_LEN * 1e-6f;
- const static LLColor3 wl4 = wl2 * wl2;
- const static LLColor3 mult_const = fsigma * 2.0f/ 3.0f * 1e24f * (F_PI * F_PI) * n4;
- const static F32 dens_div_N = F32( ATM_SEA_LEVEL_NDENS / Ndens2);
- return dens_div_N * color_div ( mult_const, wl4 );
-}
-
-const LLColor3 gAirScaSeaLevel = calc_air_sca_sea_level();
-const F32 AIR_SCA_INTENS = color_intens(gAirScaSeaLevel);
-const F32 AIR_SCA_AVG = AIR_SCA_INTENS / 3.f;
-
class LLHaze
{
public:
@@ -316,18 +299,15 @@ public:
LLHaze(const F32 g, const LLColor3& sca, const F32 fo = 2.f) :
mG(g), mSigSca(0.25f/F_PI * sca), mFalloff(fo), mAbsCoef(0.f)
{
- mAbsCoef = color_intens(mSigSca) / AIR_SCA_INTENS;
+ mAbsCoef = color_intens(mSigSca) / sAirScaIntense;
}
LLHaze(const F32 g, const F32 sca, const F32 fo = 2.f) : mG(g),
mSigSca(0.25f/F_PI * LLColor3(sca, sca, sca)), mFalloff(fo)
{
- mAbsCoef = 0.01f * sca / AIR_SCA_AVG;
+ mAbsCoef = 0.01f * sca / sAirScaAvg;
}
- static void initClass();
-
-
F32 getG() const { return mG; }
void setG(const F32 g)
@@ -343,12 +323,12 @@ public:
void setSigSca(const LLColor3& s)
{
mSigSca = s;
- mAbsCoef = 0.01f * color_intens(mSigSca) / AIR_SCA_INTENS;
+ mAbsCoef = 0.01f * color_intens(mSigSca) / sAirScaIntense;
}
void setSigSca(const F32 s0, const F32 s1, const F32 s2)
{
- mSigSca = AIR_SCA_AVG * LLColor3 (s0, s1, s2);
+ mSigSca = sAirScaAvg * LLColor3 (s0, s1, s2);
mAbsCoef = 0.01f * (s0 + s1 + s2) / 3;
}
@@ -392,10 +372,11 @@ public:
static inline LLColor3 calcAirSca(const F32 h);
static inline void calcAirSca(const F32 h, LLColor3 &result);
- static LLColor3 calcAirScaSeaLevel() { return gAirScaSeaLevel; }
- static const LLColor3 &getAirScaSeaLevel() { return sAirScaSeaLevel; }
-public:
- static LLColor3 sAirScaSeaLevel;
+
+private:
+ static LLColor3 const sAirScaSeaLevel;
+ static F32 const sAirScaIntense;
+ static F32 const sAirScaAvg;
protected:
F32 mG;
@@ -429,7 +410,7 @@ public:
LLColor3 blue_density;
LLColor3 blue_horizon;
F32 haze_density;
- LLColor3 haze_horizon;
+ F32 haze_horizon;
F32 density_multiplier;
F32 max_y;
LLColor3 glow;
@@ -473,7 +454,6 @@ public:
LLVOSky(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp);
// Initialize/delete data that's only inited once per class.
- static void initClass();
void init();
void initCubeMap();
void initEmpty();
@@ -654,14 +634,12 @@ F32 color_norm_pow(LLColor3& col, F32 e, BOOL postmultiply = FALSE);
inline LLColor3 LLHaze::calcAirSca(const F32 h)
{
- static const LLColor3 air_sca_sea_level = calcAirScaSeaLevel();
- return calcFalloff(h) * air_sca_sea_level;
+ return calcFalloff(h) * sAirScaSeaLevel;
}
inline void LLHaze::calcAirSca(const F32 h, LLColor3 &result)
{
- static const LLColor3 air_sca_sea_level = calcAirScaSeaLevel();
- result = air_sca_sea_level;
+ result = sAirScaSeaLevel;
result *= calcFalloff(h);
}
diff --git a/indra/newview/llvosurfacepatch.cpp b/indra/newview/llvosurfacepatch.cpp
index 2eb4398488..bf6158eeaf 100644
--- a/indra/newview/llvosurfacepatch.cpp
+++ b/indra/newview/llvosurfacepatch.cpp
@@ -54,27 +54,69 @@ public:
LLVertexBuffer(MAP_VERTEX | MAP_NORMAL | MAP_TEXCOORD0 | MAP_TEXCOORD1 | MAP_COLOR, GL_DYNAMIC_DRAW_ARB)
{
//texture coordinates 2 and 3 exist, but use the same data as texture coordinate 1
- mOffsets[TYPE_TEXCOORD3] = mOffsets[TYPE_TEXCOORD2] = mOffsets[TYPE_TEXCOORD1];
- mTypeMask |= MAP_TEXCOORD2 | MAP_TEXCOORD3;
};
- /*// virtual
- void setupVertexBuffer(U32 data_mask) const
- {
- if (LLDrawPoolTerrain::getDetailMode() == 0 || LLPipeline::sShadowRender)
+ // virtual
+ void setupVertexBuffer(U32 data_mask)
+ {
+ if (LLGLSLShader::sNoFixedFunction)
+ { //just use default if shaders are in play
+ LLVertexBuffer::setupVertexBuffer(data_mask & ~(MAP_TEXCOORD2 | MAP_TEXCOORD3));
+ return;
+ }
+
+ volatile U8* base = useVBOs() ? (U8*) mAlignedOffset : mMappedData;
+
+ //assume tex coords 2 and 3 are present
+ U32 type_mask = mTypeMask | MAP_TEXCOORD2 | MAP_TEXCOORD3;
+
+ if ((data_mask & type_mask) != data_mask)
+ {
+ llerrs << "LLVertexBuffer::setupVertexBuffer missing required components for supplied data mask." << llendl;
+ }
+
+ if (data_mask & MAP_NORMAL)
+ {
+ glNormalPointer(GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_NORMAL], (void*)(base + mOffsets[TYPE_NORMAL]));
+ }
+ if (data_mask & MAP_TEXCOORD3)
+ { //substitute tex coord 0 for tex coord 3
+ glClientActiveTextureARB(GL_TEXTURE3_ARB);
+ glTexCoordPointer(2,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD0], (void*)(base + mOffsets[TYPE_TEXCOORD0]));
+ glClientActiveTextureARB(GL_TEXTURE0_ARB);
+ }
+ if (data_mask & MAP_TEXCOORD2)
+ { //substitute tex coord 0 for tex coord 2
+ glClientActiveTextureARB(GL_TEXTURE2_ARB);
+ glTexCoordPointer(2,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD0], (void*)(base + mOffsets[TYPE_TEXCOORD0]));
+ glClientActiveTextureARB(GL_TEXTURE0_ARB);
+ }
+ if (data_mask & MAP_TEXCOORD1)
+ {
+ glClientActiveTextureARB(GL_TEXTURE1_ARB);
+ glTexCoordPointer(2,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD1], (void*)(base + mOffsets[TYPE_TEXCOORD1]));
+ glClientActiveTextureARB(GL_TEXTURE0_ARB);
+ }
+ if (data_mask & MAP_BINORMAL)
+ {
+ glClientActiveTextureARB(GL_TEXTURE2_ARB);
+ glTexCoordPointer(3,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_BINORMAL], (void*)(base + mOffsets[TYPE_BINORMAL]));
+ glClientActiveTextureARB(GL_TEXTURE0_ARB);
+ }
+ if (data_mask & MAP_TEXCOORD0)
{
- LLVertexBuffer::setupVertexBuffer(data_mask);
+ glTexCoordPointer(2,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD0], (void*)(base + mOffsets[TYPE_TEXCOORD0]));
}
- else if (data_mask & LLVertexBuffer::MAP_TEXCOORD1)
+ if (data_mask & MAP_COLOR)
{
- LLVertexBuffer::setupVertexBuffer(data_mask);
+ glColorPointer(4, GL_UNSIGNED_BYTE, LLVertexBuffer::sTypeSize[TYPE_COLOR], (void*)(base + mOffsets[TYPE_COLOR]));
}
- else
+
+ if (data_mask & MAP_VERTEX)
{
- LLVertexBuffer::setupVertexBuffer(data_mask);
+ glVertexPointer(3,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_VERTEX], (void*)(base + 0));
}
- llglassertok();
- }*/
+ }
};
//============================================================================
@@ -275,7 +317,6 @@ BOOL LLVOSurfacePatch::updateLOD()
void LLVOSurfacePatch::getGeometry(LLStrider<LLVector3> &verticesp,
LLStrider<LLVector3> &normalsp,
- LLStrider<LLColor4U> &colorsp,
LLStrider<LLVector2> &texCoords0p,
LLStrider<LLVector2> &texCoords1p,
LLStrider<U16> &indicesp)
@@ -287,7 +328,6 @@ void LLVOSurfacePatch::getGeometry(LLStrider<LLVector3> &verticesp,
updateMainGeometry(facep,
verticesp,
normalsp,
- colorsp,
texCoords0p,
texCoords1p,
indicesp,
@@ -295,7 +335,6 @@ void LLVOSurfacePatch::getGeometry(LLStrider<LLVector3> &verticesp,
updateNorthGeometry(facep,
verticesp,
normalsp,
- colorsp,
texCoords0p,
texCoords1p,
indicesp,
@@ -303,7 +342,6 @@ void LLVOSurfacePatch::getGeometry(LLStrider<LLVector3> &verticesp,
updateEastGeometry(facep,
verticesp,
normalsp,
- colorsp,
texCoords0p,
texCoords1p,
indicesp,
@@ -313,7 +351,6 @@ void LLVOSurfacePatch::getGeometry(LLStrider<LLVector3> &verticesp,
void LLVOSurfacePatch::updateMainGeometry(LLFace *facep,
LLStrider<LLVector3> &verticesp,
LLStrider<LLVector3> &normalsp,
- LLStrider<LLColor4U> &colorsp,
LLStrider<LLVector2> &texCoords0p,
LLStrider<LLVector2> &texCoords1p,
LLStrider<U16> &indicesp,
@@ -325,6 +362,8 @@ void LLVOSurfacePatch::updateMainGeometry(LLFace *facep,
S32 num_vertices, num_indices;
U32 index;
+ llassert(mLastStride > 0);
+
render_stride = mLastStride;
patch_size = mPatchp->getSurface()->getGridsPerPatchEdge();
S32 vert_size = patch_size / render_stride;
@@ -352,7 +391,6 @@ void LLVOSurfacePatch::updateMainGeometry(LLFace *facep,
x = i * render_stride;
y = j * render_stride;
mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());
- *colorsp++ = LLColor4U::white;
verticesp++;
normalsp++;
texCoords0p++;
@@ -417,7 +455,6 @@ void LLVOSurfacePatch::updateMainGeometry(LLFace *facep,
void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep,
LLStrider<LLVector3> &verticesp,
LLStrider<LLVector3> &normalsp,
- LLStrider<LLColor4U> &colorsp,
LLStrider<LLVector2> &texCoords0p,
LLStrider<LLVector2> &texCoords1p,
LLStrider<U16> &indicesp,
@@ -455,7 +492,6 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep,
y = 16 - render_stride;
mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());
- *colorsp++ = LLColor4U::white;
verticesp++;
normalsp++;
texCoords0p++;
@@ -471,7 +507,6 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep,
mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());
verticesp++;
normalsp++;
- *colorsp++ = LLColor4U::white;
texCoords0p++;
texCoords1p++;
vertex_count++;
@@ -510,7 +545,6 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep,
mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());
verticesp++;
normalsp++;
- *colorsp++ = LLColor4U::white;
texCoords0p++;
texCoords1p++;
vertex_count++;
@@ -525,7 +559,6 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep,
mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());
verticesp++;
normalsp++;
- *colorsp++ = LLColor4U::white;
texCoords0p++;
texCoords1p++;
vertex_count++;
@@ -569,7 +602,6 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep,
y = 16 - render_stride;
mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());
- *colorsp++ = LLColor4U::white;
verticesp++;
normalsp++;
texCoords0p++;
@@ -586,7 +618,6 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep,
mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());
verticesp++;
normalsp++;
- *colorsp++ = LLColor4U::white;
texCoords0p++;
texCoords1p++;
vertex_count++;
@@ -624,7 +655,6 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep,
void LLVOSurfacePatch::updateEastGeometry(LLFace *facep,
LLStrider<LLVector3> &verticesp,
LLStrider<LLVector3> &normalsp,
- LLStrider<LLColor4U> &colorsp,
LLStrider<LLVector2> &texCoords0p,
LLStrider<LLVector2> &texCoords1p,
LLStrider<U16> &indicesp,
@@ -658,7 +688,6 @@ void LLVOSurfacePatch::updateEastGeometry(LLFace *facep,
mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());
verticesp++;
normalsp++;
- *colorsp++ = LLColor4U::white;
texCoords0p++;
texCoords1p++;
}
@@ -671,7 +700,6 @@ void LLVOSurfacePatch::updateEastGeometry(LLFace *facep,
mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());
verticesp++;
normalsp++;
- *colorsp++ = LLColor4U::white;
texCoords0p++;
texCoords1p++;
}
@@ -709,7 +737,6 @@ void LLVOSurfacePatch::updateEastGeometry(LLFace *facep,
mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());
verticesp++;
normalsp++;
- *colorsp++ = LLColor4U::white;
texCoords0p++;
texCoords1p++;
}
@@ -722,7 +749,6 @@ void LLVOSurfacePatch::updateEastGeometry(LLFace *facep,
mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());
verticesp++;
normalsp++;
- *colorsp++ = LLColor4U::white;
texCoords0p++;
texCoords1p++;
}
@@ -766,7 +792,6 @@ void LLVOSurfacePatch::updateEastGeometry(LLFace *facep,
mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());
verticesp++;
normalsp++;
- *colorsp++ = LLColor4U::white;
texCoords0p++;
texCoords1p++;
}
@@ -779,7 +804,6 @@ void LLVOSurfacePatch::updateEastGeometry(LLFace *facep,
mPatchp->eval(x, y, render_stride, verticesp.get(), normalsp.get(), texCoords0p.get(), texCoords1p.get());
verticesp++;
normalsp++;
- *colorsp++ = LLColor4U::white;
texCoords0p++;
texCoords1p++;
}
@@ -840,7 +864,7 @@ void LLVOSurfacePatch::dirtyGeom()
if (mDrawable)
{
gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_ALL, TRUE);
- mDrawable->getFace(0)->mVertexBuffer = NULL;
+ mDrawable->getFace(0)->setVertexBuffer(NULL);
mDrawable->movePartition();
}
}
@@ -939,7 +963,13 @@ BOOL LLVOSurfacePatch::lineSegmentIntersect(const LLVector3& start, const LLVect
//step one meter at a time until intersection point found
- const LLVector3* ext = mDrawable->getSpatialExtents();
+ //VECTORIZE THIS
+ const LLVector4a* exta = mDrawable->getSpatialExtents();
+
+ LLVector3 ext[2];
+ ext[0].set(exta[0].getF32ptr());
+ ext[1].set(exta[1].getF32ptr());
+
F32 rad = (delta*tdelta).magVecSquared();
F32 t = 0.f;
@@ -1001,13 +1031,18 @@ BOOL LLVOSurfacePatch::lineSegmentIntersect(const LLVector3& start, const LLVect
return FALSE;
}
-void LLVOSurfacePatch::updateSpatialExtents(LLVector3& newMin, LLVector3 &newMax)
+void LLVOSurfacePatch::updateSpatialExtents(LLVector4a& newMin, LLVector4a &newMax)
{
LLVector3 posAgent = getPositionAgent();
LLVector3 scale = getScale();
- newMin = posAgent-scale*0.5f; // Changing to 2.f makes the culling a -little- better, but still wrong
- newMax = posAgent+scale*0.5f;
- mDrawable->setPositionGroup((newMin+newMax)*0.5f);
+ //make z-axis scale at least 1 to avoid shadow artifacts on totally flat land
+ scale.mV[VZ] = llmax(scale.mV[VZ], 1.f);
+ newMin.load3( (posAgent-scale*0.5f).mV); // Changing to 2.f makes the culling a -little- better, but still wrong
+ newMax.load3( (posAgent+scale*0.5f).mV);
+ LLVector4a pos;
+ pos.setAdd(newMin,newMax);
+ pos.mul(0.5f);
+ mDrawable->setPositionGroup(pos);
}
U32 LLVOSurfacePatch::getPartitionType() const
@@ -1041,14 +1076,12 @@ void LLTerrainPartition::getGeometry(LLSpatialGroup* group)
LLStrider<LLVector3> normals;
LLStrider<LLVector2> texcoords2;
LLStrider<LLVector2> texcoords;
- LLStrider<LLColor4U> colors;
LLStrider<U16> indices;
llassert_always(buffer->getVertexStrider(vertices));
llassert_always(buffer->getNormalStrider(normals));
llassert_always(buffer->getTexCoord0Strider(texcoords));
llassert_always(buffer->getTexCoord1Strider(texcoords2));
- llassert_always(buffer->getColorStrider(colors));
llassert_always(buffer->getIndexStrider(indices));
U32 indices_index = 0;
@@ -1060,16 +1093,16 @@ void LLTerrainPartition::getGeometry(LLSpatialGroup* group)
facep->setIndicesIndex(indices_index);
facep->setGeomIndex(index_offset);
- facep->mVertexBuffer = buffer;
+ facep->setVertexBuffer(buffer);
LLVOSurfacePatch* patchp = (LLVOSurfacePatch*) facep->getViewerObject();
- patchp->getGeometry(vertices, normals, colors, texcoords, texcoords2, indices);
+ patchp->getGeometry(vertices, normals, texcoords, texcoords2, indices);
indices_index += facep->getIndicesCount();
index_offset += facep->getGeomCount();
}
- buffer->setBuffer(0);
+ buffer->flush();
mFaceList.clear();
}
diff --git a/indra/newview/llvosurfacepatch.h b/indra/newview/llvosurfacepatch.h
index bd80e1dbe6..a15878368e 100644
--- a/indra/newview/llvosurfacepatch.h
+++ b/indra/newview/llvosurfacepatch.h
@@ -44,8 +44,7 @@ public:
VERTEX_DATA_MASK = (1 << LLVertexBuffer::TYPE_VERTEX) |
(1 << LLVertexBuffer::TYPE_NORMAL) |
(1 << LLVertexBuffer::TYPE_TEXCOORD0) |
- (1 << LLVertexBuffer::TYPE_TEXCOORD1) |
- (1 << LLVertexBuffer::TYPE_COLOR)
+ (1 << LLVertexBuffer::TYPE_TEXCOORD1)
};
LLVOSurfacePatch(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp);
@@ -64,7 +63,6 @@ public:
/*virtual*/ void updateFaceSize(S32 idx);
void getGeometry(LLStrider<LLVector3> &verticesp,
LLStrider<LLVector3> &normalsp,
- LLStrider<LLColor4U> &colorsp,
LLStrider<LLVector2> &texCoords0p,
LLStrider<LLVector2> &texCoords1p,
LLStrider<U16> &indicesp);
@@ -72,7 +70,7 @@ public:
/*virtual*/ void updateTextures();
/*virtual*/ void setPixelAreaAndAngle(LLAgent &agent); // generate accurate apparent angle and area
- /*virtual*/ void updateSpatialExtents(LLVector3& newMin, LLVector3& newMax);
+ /*virtual*/ void updateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax);
/*virtual*/ BOOL isActive() const; // Whether this object needs to do an idleUpdate.
void setPatch(LLSurfacePatch *patchp);
@@ -116,7 +114,6 @@ protected:
void updateMainGeometry(LLFace *facep,
LLStrider<LLVector3> &verticesp,
LLStrider<LLVector3> &normalsp,
- LLStrider<LLColor4U> &colorsp,
LLStrider<LLVector2> &texCoords0p,
LLStrider<LLVector2> &texCoords1p,
LLStrider<U16> &indicesp,
@@ -124,7 +121,6 @@ protected:
void updateNorthGeometry(LLFace *facep,
LLStrider<LLVector3> &verticesp,
LLStrider<LLVector3> &normalsp,
- LLStrider<LLColor4U> &colorsp,
LLStrider<LLVector2> &texCoords0p,
LLStrider<LLVector2> &texCoords1p,
LLStrider<U16> &indicesp,
@@ -132,7 +128,6 @@ protected:
void updateEastGeometry(LLFace *facep,
LLStrider<LLVector3> &verticesp,
LLStrider<LLVector3> &normalsp,
- LLStrider<LLColor4U> &colorsp,
LLStrider<LLVector2> &texCoords0p,
LLStrider<LLVector2> &texCoords1p,
LLStrider<U16> &indicesp,
diff --git a/indra/newview/llvotextbubble.cpp b/indra/newview/llvotextbubble.cpp
deleted file mode 100644
index b61dae53ba..0000000000
--- a/indra/newview/llvotextbubble.cpp
+++ /dev/null
@@ -1,253 +0,0 @@
-/**
- * @file llvotextbubble.cpp
- * @brief Viewer-object text bubble.
- *
- * $LicenseInfo:firstyear=2001&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llvotextbubble.h"
-
-#include "imageids.h"
-#include "llviewercontrol.h"
-#include "llprimitive.h"
-#include "llrendersphere.h"
-
-#include "llbox.h"
-#include "lldrawable.h"
-#include "llface.h"
-#include "llviewertexturelist.h"
-#include "llvolume.h"
-#include "pipeline.h"
-#include "llviewerregion.h"
-
-LLVOTextBubble::LLVOTextBubble(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp)
-: LLAlphaObject(id, pcode, regionp)
-{
- setScale(LLVector3(1.5f, 1.5f, 0.25f));
- mbCanSelect = FALSE;
- mLOD = MIN_LOD;
- mVolumeChanged = TRUE;
- setVelocity(LLVector3(0.f, 0.f, 0.75f));
- LLVolumeParams volume_params;
- volume_params.setType(LL_PCODE_PROFILE_CIRCLE, LL_PCODE_PATH_LINE);
- volume_params.setBeginAndEndS(0.f, 1.f);
- volume_params.setBeginAndEndT(0.f, 1.f);
- volume_params.setRatio(0.25f, 0.25f);
- volume_params.setShear(0.f, 0.f);
- setVolume(volume_params, 0);
- mColor = LLColor4(1.0f, 0.0f, 0.0f, 1.f);
- S32 i;
- for (i = 0; i < getNumTEs(); i++)
- {
- setTEColor(i, mColor);
- setTETexture(i, LLUUID(IMG_DEFAULT));
- }
-}
-
-
-LLVOTextBubble::~LLVOTextBubble()
-{
-}
-
-
-BOOL LLVOTextBubble::isActive() const
-{
- return TRUE;
-}
-
-BOOL LLVOTextBubble::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
-{
- static LLFastTimer::DeclareTimer ftm("Text Bubble");
- LLFastTimer t(ftm);
-
- F32 dt = mUpdateTimer.getElapsedTimeF32();
- // Die after a few seconds.
- if (dt > 1.5f)
- {
- return FALSE;
- }
-
- LLViewerObject::idleUpdate(agent, world, time);
-
- setScale(0.5f * (1.f+dt) * LLVector3(1.5f, 1.5f, 0.5f));
-
- F32 alpha = 0.35f*dt;
-
- LLColor4 color = mColor;
- color.mV[VALPHA] -= alpha;
- if (color.mV[VALPHA] <= 0.05f)
- {
- return FALSE;
- }
- S32 i;
- for (i = 0; i < getNumTEs(); i++)
- {
- setTEColor(i, color);
- setTEFullbright(i, TRUE);
- }
-
- gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_VOLUME, TRUE);
- return TRUE;
-}
-
-
-void LLVOTextBubble::updateTextures()
-{
- // Update the image levels of all textures...
-
- for (U32 i = 0; i < getNumTEs(); i++)
- {
- const LLTextureEntry *te = getTE(i);
- F32 texel_area_ratio = fabs(te->mScaleS * te->mScaleT);
- texel_area_ratio = llclamp(texel_area_ratio, .125f, 16.f);
- LLViewerTexture *imagep = getTEImage(i);
- if (imagep)
- {
- imagep->addTextureStats(mPixelArea / texel_area_ratio);
- }
- }
-}
-
-
-LLDrawable *LLVOTextBubble::createDrawable(LLPipeline *pipeline)
-{
- pipeline->allocDrawable(this);
- mDrawable->setLit(FALSE);
- mDrawable->setRenderType(LLPipeline::RENDER_TYPE_VOLUME);
-
- for (U32 i = 0; i < getNumTEs(); i++)
- {
- LLViewerTexture *imagep;
- const LLTextureEntry *texture_entry = getTE(i);
- imagep = LLViewerTextureManager::getFetchedTexture(texture_entry->getID());
-
- mDrawable->addFace((LLFacePool*) NULL, imagep);
- }
-
- return mDrawable;
-}
-
-// virtual
-BOOL LLVOTextBubble::setVolume(const LLVolumeParams &volume_params, const S32 detail, bool unique_volume)
-{
- if (LLPrimitive::setVolume(volume_params, mLOD))
- {
- if (mDrawable)
- {
- gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_VOLUME, TRUE);
- mVolumeChanged = TRUE;
- }
- return TRUE;
- }
- return FALSE;
-}
-
-
-BOOL LLVOTextBubble::updateLOD()
-{
- return FALSE;
-}
-
-BOOL LLVOTextBubble::updateGeometry(LLDrawable *drawable)
-{
- if (!(gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_VOLUME)))
- return TRUE;
-
- if (mVolumeChanged)
- {
- LLVolumeParams volume_params = getVolume()->getParams();
- setVolume(volume_params, 0);
-
- LLPipeline::sCompiles++;
-
- drawable->setNumFaces(getVolume()->getNumFaces(), drawable->getFace(0)->getPool(), getTEImage(0));
- }
-
- LLMatrix4 identity4;
- LLMatrix3 identity3;
- for (S32 i = 0; i < drawable->getNumFaces(); i++)
- {
- LLFace *face = drawable->getFace(i);
- face->setTEOffset(i);
- face->setTexture(LLViewerFetchedTexture::sSmokeImagep);
- face->setState(LLFace::FULLBRIGHT);
- }
-
- mVolumeChanged = FALSE;
-
- mDrawable->movePartition();
- return TRUE;
-}
-
-void LLVOTextBubble::updateFaceSize(S32 idx)
-{
- LLFace* face = mDrawable->getFace(idx);
-
- if (idx == 0 || idx == 2)
- {
- face->setSize(0,0);
- }
- else
- {
- const LLVolumeFace& vol_face = getVolume()->getVolumeFace(idx);
- face->setSize(vol_face.mVertices.size(), vol_face.mIndices.size());
- }
-}
-
-void LLVOTextBubble::getGeometry(S32 idx,
- LLStrider<LLVector3>& verticesp,
- LLStrider<LLVector3>& normalsp,
- LLStrider<LLVector2>& texcoordsp,
- LLStrider<LLColor4U>& colorsp,
- LLStrider<U16>& indicesp)
-{
- if (idx == 0 || idx == 2)
- {
- return;
- }
-
- const LLVolumeFace& face = getVolume()->getVolumeFace(idx);
-
- LLVector3 pos = getPositionAgent();
- LLColor4U color = LLColor4U(getTE(idx)->getColor());
- U32 offset = mDrawable->getFace(idx)->getGeomIndex();
-
- for (U32 i = 0; i < face.mVertices.size(); i++)
- {
- *verticesp++ = face.mVertices[i].mPosition.scaledVec(getScale()) + pos;
- *normalsp++ = face.mVertices[i].mNormal;
- *texcoordsp++ = face.mVertices[i].mTexCoord;
- *colorsp++ = color;
- }
-
- for (U32 i = 0; i < face.mIndices.size(); i++)
- {
- *indicesp++ = face.mIndices[i] + offset;
- }
-}
-
-U32 LLVOTextBubble::getPartitionType() const
-{
- return LLViewerRegion::PARTITION_PARTICLE;
-}
diff --git a/indra/newview/llvotextbubble.h b/indra/newview/llvotextbubble.h
deleted file mode 100644
index 9c39929711..0000000000
--- a/indra/newview/llvotextbubble.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/**
- * @file llvotextbubble.h
- * @brief Description of LLVORock class, which a derivation of LLViewerObject
- *
- * $LicenseInfo:firstyear=2001&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLVOTEXTBUBBLE_H
-#define LL_LLVOTEXTBUBBLE_H
-
-#include "llviewerobject.h"
-#include "llframetimer.h"
-
-class LLVOTextBubble : public LLAlphaObject
-{
-public:
- LLVOTextBubble(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp);
-
- /*virtual*/ BOOL isActive() const; // Whether this object needs to do an idleUpdate.
- /*virtual*/ BOOL idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);
-
- /*virtual*/ void updateTextures();
- /*virtual*/ LLDrawable* createDrawable(LLPipeline *pipeline);
- /*virtual*/ BOOL updateGeometry(LLDrawable *drawable);
- /*virtual*/ BOOL updateLOD();
- /*virtual*/ void updateFaceSize(S32 idx);
-
- /*virtual*/ void getGeometry(S32 idx,
- LLStrider<LLVector3>& verticesp,
- LLStrider<LLVector3>& normalsp,
- LLStrider<LLVector2>& texcoordsp,
- LLStrider<LLColor4U>& colorsp,
- LLStrider<U16>& indicesp);
-
- virtual U32 getPartitionType() const;
-
- LLColor4 mColor;
- S32 mLOD;
- BOOL mVolumeChanged;
-
-protected:
- ~LLVOTextBubble();
- BOOL setVolume(const LLVolumeParams &volume_params, const S32 detail, bool unique_volume = false);
- LLFrameTimer mUpdateTimer;
-};
-
-#endif // LL_VO_TEXT_BUBBLE
diff --git a/indra/newview/llvotree.cpp b/indra/newview/llvotree.cpp
index 37a974be28..4564207da4 100644
--- a/indra/newview/llvotree.cpp
+++ b/indra/newview/llvotree.cpp
@@ -50,6 +50,8 @@
#include "pipeline.h"
#include "llspatialpartition.h"
#include "llnotificationsutil.h"
+#include "raytrace.h"
+#include "llglslshader.h"
extern LLPipeline gPipeline;
@@ -339,45 +341,11 @@ U32 LLVOTree::processUpdateMessage(LLMessageSystem *mesgsys,
BOOL LLVOTree::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
{
- const U16 FRAMES_PER_WIND_UPDATE = 20; // How many frames between wind update per tree
- const F32 TREE_WIND_SENSITIVITY = 0.005f;
- const F32 TREE_TRUNK_STIFFNESS = 0.1f;
-
if (mDead || !(gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_TREE)))
{
return TRUE;
}
- if (gSavedSettings.getBOOL("RenderAnimateTrees"))
- {
- F32 mass_inv;
-
- // For all tree objects, update the trunk bending with the current wind
- // Walk sprite list in order away from viewer
- if (!(mFrameCount % FRAMES_PER_WIND_UPDATE))
- {
- // If needed, Get latest wind for this tree
- mWind = mRegionp->mWind.getVelocity(getPositionRegion());
- }
- mFrameCount++;
-
- mass_inv = 1.f/(5.f + mDepth*mBranches*0.2f);
- mTrunkVel += (mWind * mass_inv * TREE_WIND_SENSITIVITY); // Pull in direction of wind
- mTrunkVel -= (mTrunkBend * mass_inv * TREE_TRUNK_STIFFNESS); // Restoring force in direction of trunk
- mTrunkBend += mTrunkVel;
- mTrunkVel *= 0.99f; // Add damping
-
- if (mTrunkBend.length() > 1.f)
- {
- mTrunkBend.normalize();
- }
-
- if (mTrunkVel.length() > 1.f)
- {
- mTrunkVel.normalize();
- }
- }
-
S32 trunk_LOD = sMAX_NUM_TREE_LOD_LEVELS ;
F32 app_angle = getAppAngle()*LLVOTree::sTreeFactor;
@@ -390,39 +358,36 @@ BOOL LLVOTree::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
}
}
- if (!gSavedSettings.getBOOL("RenderAnimateTrees"))
+ if (mReferenceBuffer.isNull())
{
- if (mReferenceBuffer.isNull())
- {
- gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_ALL, TRUE);
- }
- else if (trunk_LOD != mTrunkLOD)
+ gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_ALL, TRUE);
+ }
+ else if (trunk_LOD != mTrunkLOD)
+ {
+ gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_ALL, FALSE);
+ }
+ else
+ {
+ // we're not animating but we may *still* need to
+ // regenerate the mesh if we moved, since position
+ // and rotation are baked into the mesh.
+ // *TODO: I don't know what's so special about trees
+ // that they don't get REBUILD_POSITION automatically
+ // at a higher level.
+ const LLVector3 &this_position = getPositionAgent();
+ if (this_position != mLastPosition)
{
- gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_ALL, FALSE);
+ gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_POSITION);
+ mLastPosition = this_position;
}
else
{
- // we're not animating but we may *still* need to
- // regenerate the mesh if we moved, since position
- // and rotation are baked into the mesh.
- // *TODO: I don't know what's so special about trees
- // that they don't get REBUILD_POSITION automatically
- // at a higher level.
- const LLVector3 &this_position = getPositionAgent();
- if (this_position != mLastPosition)
+ const LLQuaternion &this_rotation = getRotation();
+
+ if (this_rotation != mLastRotation)
{
gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_POSITION);
- mLastPosition = this_position;
- }
- else
- {
- const LLQuaternion &this_rotation = getRotation();
-
- if (this_rotation != mLastRotation)
- {
- gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_POSITION);
- mLastRotation = this_rotation;
- }
+ mLastRotation = this_rotation;
}
}
}
@@ -485,7 +450,7 @@ void LLVOTree::updateTextures()
{
if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_TEXTURE_AREA))
{
- setDebugText(llformat("%4.0f", fsqrtf(mPixelArea)));
+ setDebugText(llformat("%4.0f", (F32) sqrt(mPixelArea)));
}
mTreeImagep->addTextureStats(mPixelArea);
}
@@ -525,11 +490,11 @@ BOOL LLVOTree::updateGeometry(LLDrawable *drawable)
if(mTrunkLOD >= sMAX_NUM_TREE_LOD_LEVELS) //do not display the tree.
{
mReferenceBuffer = NULL ;
- mDrawable->getFace(0)->mVertexBuffer = NULL ;
+ mDrawable->getFace(0)->setVertexBuffer(NULL);
return TRUE ;
}
- if (mReferenceBuffer.isNull() || mDrawable->getFace(0)->mVertexBuffer.isNull())
+ if (mReferenceBuffer.isNull() || !mDrawable->getFace(0)->getVertexBuffer())
{
const F32 SRR3 = 0.577350269f; // sqrt(1/3)
const F32 SRR2 = 0.707106781f; // sqrt(1/2)
@@ -557,7 +522,7 @@ BOOL LLVOTree::updateGeometry(LLDrawable *drawable)
max_vertices += sLODVertexCount[lod];
}
- mReferenceBuffer = new LLVertexBuffer(LLDrawPoolTree::VERTEX_DATA_MASK, gSavedSettings.getBOOL("RenderAnimateTrees") ? GL_STATIC_DRAW_ARB : 0);
+ mReferenceBuffer = new LLVertexBuffer(LLDrawPoolTree::VERTEX_DATA_MASK, 0);
mReferenceBuffer->allocateBuffer(max_vertices, max_indices, TRUE);
LLStrider<LLVector3> vertices;
@@ -856,20 +821,13 @@ BOOL LLVOTree::updateGeometry(LLDrawable *drawable)
slices /= 2;
}
- mReferenceBuffer->setBuffer(0);
+ mReferenceBuffer->flush();
llassert(vertex_count == max_vertices);
llassert(index_count == max_indices);
}
- if (gSavedSettings.getBOOL("RenderAnimateTrees"))
- {
- mDrawable->getFace(0)->mVertexBuffer = mReferenceBuffer;
- }
- else
- {
- //generate tree mesh
- updateMesh();
- }
+ //generate tree mesh
+ updateMesh();
return TRUE;
}
@@ -880,7 +838,7 @@ void LLVOTree::updateMesh()
// Translate to tree base HACK - adjustment in Z plants tree underground
const LLVector3 &pos_agent = getPositionAgent();
- //glTranslatef(pos_agent.mV[VX], pos_agent.mV[VY], pos_agent.mV[VZ] - 0.1f);
+ //gGL.translatef(pos_agent.mV[VX], pos_agent.mV[VY], pos_agent.mV[VZ] - 0.1f);
LLMatrix4 trans_mat;
trans_mat.setTranslation(pos_agent.mV[VX], pos_agent.mV[VY], pos_agent.mV[VZ] - 0.1f);
trans_mat *= matrix;
@@ -921,8 +879,9 @@ void LLVOTree::updateMesh()
calcNumVerts(vert_count, index_count, mTrunkLOD, stop_depth, mDepth, mTrunkDepth, mBranches);
LLFace* facep = mDrawable->getFace(0);
- facep->mVertexBuffer = new LLVertexBuffer(LLDrawPoolTree::VERTEX_DATA_MASK, GL_STATIC_DRAW_ARB);
- facep->mVertexBuffer->allocateBuffer(vert_count, index_count, TRUE);
+ LLVertexBuffer* buff = new LLVertexBuffer(LLDrawPoolTree::VERTEX_DATA_MASK, GL_STATIC_DRAW_ARB);
+ buff->allocateBuffer(vert_count, index_count, TRUE);
+ facep->setVertexBuffer(buff);
LLStrider<LLVector3> vertices;
LLStrider<LLVector3> normals;
@@ -930,16 +889,15 @@ void LLVOTree::updateMesh()
LLStrider<U16> indices;
U16 idx_offset = 0;
- facep->mVertexBuffer->getVertexStrider(vertices);
- facep->mVertexBuffer->getNormalStrider(normals);
- facep->mVertexBuffer->getTexCoord0Strider(tex_coords);
- facep->mVertexBuffer->getIndexStrider(indices);
+ buff->getVertexStrider(vertices);
+ buff->getNormalStrider(normals);
+ buff->getTexCoord0Strider(tex_coords);
+ buff->getIndexStrider(indices);
genBranchPipeline(vertices, normals, tex_coords, indices, idx_offset, scale_mat, mTrunkLOD, stop_depth, mDepth, mTrunkDepth, 1.0, mTwist, droop, mBranches, alpha);
- mReferenceBuffer->setBuffer(0);
- facep->mVertexBuffer->setBuffer(0);
-
+ mReferenceBuffer->flush();
+ buff->flush();
}
void LLVOTree::appendMesh(LLStrider<LLVector3>& vertices,
@@ -979,11 +937,6 @@ void LLVOTree::appendMesh(LLStrider<LLVector3>& vertices,
for (S32 i = 0; i < index_count; i++)
{
U16 index = index_offset + i;
- if (idx[index] >= vert_start + vert_count ||
- idx[index] < vert_start)
- {
- llerrs << "WTF?" << llendl;
- }
*indices++ = idx[index]-vert_start+cur_idx;
}
@@ -1161,7 +1114,8 @@ U32 LLVOTree::drawBranchPipeline(LLMatrix4& matrix, U16* indicesp, S32 trunk_LOD
scale_mat.mMatrix[2][2] = scale*length;
scale_mat *= matrix;
- glLoadMatrixf((F32*) scale_mat.mMatrix);
+ gGL.loadMatrix((F32*) scale_mat.mMatrix);
+ gGL.syncMatrices();
glDrawElements(GL_TRIANGLES, sLODIndexCount[trunk_LOD], GL_UNSIGNED_SHORT, indicesp + sLODIndexOffset[trunk_LOD]);
gPipeline.addTrianglesDrawn(LEAF_INDICES);
stop_glerror();
@@ -1211,7 +1165,8 @@ U32 LLVOTree::drawBranchPipeline(LLMatrix4& matrix, U16* indicesp, S32 trunk_LOD
scale_mat *= matrix;
- glLoadMatrixf((F32*) scale_mat.mMatrix);
+ gGL.loadMatrix((F32*) scale_mat.mMatrix);
+ gGL.syncMatrices();
glDrawElements(GL_TRIANGLES, LEAF_INDICES, GL_UNSIGNED_SHORT, indicesp);
gPipeline.addTrianglesDrawn(LEAF_INDICES);
stop_glerror();
@@ -1232,19 +1187,20 @@ U32 LLVOTree::drawBranchPipeline(LLMatrix4& matrix, U16* indicesp, S32 trunk_LOD
scale_mat *= matrix;
- glMatrixMode(GL_TEXTURE);
- glTranslatef(0.0, -0.5, 0.0);
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.translatef(0.0, -0.5, 0.0);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
- glLoadMatrixf((F32*) scale_mat.mMatrix);
+ gGL.loadMatrix((F32*) scale_mat.mMatrix);
+ gGL.syncMatrices();
glDrawElements(GL_TRIANGLES, LEAF_INDICES, GL_UNSIGNED_SHORT, indicesp);
gPipeline.addTrianglesDrawn(LEAF_INDICES);
stop_glerror();
ret += LEAF_INDICES;
- glMatrixMode(GL_TEXTURE);
- glLoadIdentity();
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.loadIdentity();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
}
return ret;
@@ -1260,7 +1216,7 @@ void LLVOTree::updateRadius()
mDrawable->setRadius(32.0f);
}
-void LLVOTree::updateSpatialExtents(LLVector3& newMin, LLVector3& newMax)
+void LLVOTree::updateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax)
{
F32 radius = getScale().length()*0.05f;
LLVector3 center = getRenderPosition();
@@ -1270,9 +1226,11 @@ void LLVOTree::updateSpatialExtents(LLVector3& newMin, LLVector3& newMax)
center += LLVector3(0, 0, size.mV[2]) * getRotation();
- newMin.set(center-size);
- newMax.set(center+size);
- mDrawable->setPositionGroup(center);
+ newMin.load3((center-size).mV);
+ newMax.load3((center+size).mV);
+ LLVector4a pos;
+ pos.load3(center.mV);
+ mDrawable->setPositionGroup(pos);
}
BOOL LLVOTree::lineSegmentIntersect(const LLVector3& start, const LLVector3& end, S32 face, BOOL pick_transparent, S32 *face_hitp,
@@ -1285,8 +1243,13 @@ BOOL LLVOTree::lineSegmentIntersect(const LLVector3& start, const LLVector3& end
return FALSE;
}
- const LLVector3* ext = mDrawable->getSpatialExtents();
+ const LLVector4a* exta = mDrawable->getSpatialExtents();
+ //VECTORIZE THIS
+ LLVector3 ext[2];
+ ext[0].set(exta[0].getF32ptr());
+ ext[1].set(exta[1].getF32ptr());
+
LLVector3 center = (ext[1]+ext[0])*0.5f;
LLVector3 size = (ext[1]-ext[0]);
@@ -1323,7 +1286,7 @@ U32 LLVOTree::getPartitionType() const
}
LLTreePartition::LLTreePartition()
-: LLSpatialPartition(0, FALSE, 0)
+: LLSpatialPartition(0, FALSE, GL_DYNAMIC_DRAW_ARB)
{
mDrawableType = LLPipeline::RENDER_TYPE_TREE;
mPartitionType = LLViewerRegion::PARTITION_TREE;
diff --git a/indra/newview/llvotree.h b/indra/newview/llvotree.h
index fd0ebdf8e2..0554935539 100644
--- a/indra/newview/llvotree.h
+++ b/indra/newview/llvotree.h
@@ -68,7 +68,7 @@ public:
/*virtual*/ LLDrawable* createDrawable(LLPipeline *pipeline);
/*virtual*/ BOOL updateGeometry(LLDrawable *drawable);
- /*virtual*/ void updateSpatialExtents(LLVector3 &min, LLVector3 &max);
+ /*virtual*/ void updateSpatialExtents(LLVector4a &min, LLVector4a &max);
virtual U32 getPartitionType() const;
@@ -152,7 +152,6 @@ public:
friend class LLDrawPoolTree;
protected:
LLVector3 mTrunkBend; // Accumulated wind (used for blowing trees)
- LLVector3 mTrunkVel; //
LLVector3 mWind;
LLPointer<LLVertexBuffer> mReferenceBuffer; //reference geometry for generating tree mesh
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 761e12020b..e7c35d8220 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -30,12 +30,16 @@
#include "llvovolume.h"
+#include <sstream>
+
#include "llviewercontrol.h"
#include "lldir.h"
#include "llflexibleobject.h"
+#include "llfloatertools.h"
#include "llmaterialtable.h"
#include "llprimitive.h"
#include "llvolume.h"
+#include "llvolumeoctree.h"
#include "llvolumemgr.h"
#include "llvolumemessage.h"
#include "material_codes.h"
@@ -44,6 +48,7 @@
#include "object_flags.h"
#include "llagentconstants.h"
#include "lldrawable.h"
+#include "lldrawpoolavatar.h"
#include "lldrawpoolbump.h"
#include "llface.h"
#include "llspatialpartition.h"
@@ -51,18 +56,26 @@
#include "llflexibleobject.h"
#include "llsky.h"
#include "lltexturefetch.h"
+#include "llvector4a.h"
#include "llviewercamera.h"
#include "llviewertexturelist.h"
+#include "llviewerobjectlist.h"
#include "llviewerregion.h"
#include "llviewertextureanim.h"
#include "llworld.h"
#include "llselectmgr.h"
#include "pipeline.h"
#include "llsdutil.h"
+#include "llmatrix4a.h"
#include "llmediaentry.h"
#include "llmediadataclient.h"
+#include "llmeshrepository.h"
#include "llagent.h"
#include "llviewermediafocus.h"
+#include "lldatapacker.h"
+#include "llviewershadermgr.h"
+#include "llvoavatar.h"
+#include "llvocache.h"
const S32 MIN_QUIET_FRAMES_COALESCE = 30;
const F32 FORCE_SIMPLE_RENDER_AREA = 512.f;
@@ -77,11 +90,14 @@ F32 LLVOVolume::sLODFactor = 1.f;
F32 LLVOVolume::sLODSlopDistanceFactor = 0.5f; //Changing this to zero, effectively disables the LOD transition slop
F32 LLVOVolume::sDistanceFactor = 1.0f;
S32 LLVOVolume::sNumLODChanges = 0;
+S32 LLVOVolume::mRenderComplexity_last = 0;
+S32 LLVOVolume::mRenderComplexity_current = 0;
LLPointer<LLObjectMediaDataClient> LLVOVolume::sObjectMediaClient = NULL;
LLPointer<LLObjectMediaNavigateClient> LLVOVolume::sObjectMediaNavigateClient = NULL;
static LLFastTimer::DeclareTimer FTM_GEN_TRIANGLES("Generate Triangles");
static LLFastTimer::DeclareTimer FTM_GEN_VOLUME("Generate Volumes");
+static LLFastTimer::DeclareTimer FTM_VOLUME_TEXTURES("Volume Textures");
// Implementation class of LLMediaDataClientObject. See llmediadataclient.h
class LLMediaDataClientObjectImpl : public LLMediaDataClientObject
@@ -353,6 +369,7 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys,
//
// Unpack texture entry data
//
+
S32 result = unpackTEMessage(mesgsys, _PREHASH_ObjectData, block_num);
if (result & teDirtyBits)
{
@@ -388,10 +405,12 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys,
// There's something bogus in the data that we're unpacking.
dp->dumpBufferToLog();
llwarns << "Flushing cache files" << llendl;
- std::string mask;
- mask = gDirUtilp->getDirDelimiter() + "*.slc";
- gDirUtilp->deleteFilesInDir(gDirUtilp->getExpandedFilename(LL_PATH_CACHE,""), mask);
-// llerrs << "Bogus TE data in " << getID() << ", crashing!" << llendl;
+
+ if(LLVOCache::hasInstance() && getRegion())
+ {
+ LLVOCache::getInstance()->removeEntry(getRegion()->getHandle()) ;
+ }
+
llwarns << "Bogus TE data in " << getID() << llendl;
}
else
@@ -667,18 +686,43 @@ void LLVOVolume::updateTextures()
}
}
-void LLVOVolume::updateTextureVirtualSize()
+BOOL LLVOVolume::isVisible() const
{
- // Update the pixel area of all faces
+ if(mDrawable.notNull() && mDrawable->isVisible())
+ {
+ return TRUE ;
+ }
- if(mDrawable.isNull() || !mDrawable->isVisible())
+ if(isAttachment())
{
- return ;
+ LLViewerObject* objp = (LLViewerObject*)getParent() ;
+ while(objp && !objp->isAvatar())
+ {
+ objp = (LLViewerObject*)objp->getParent() ;
+ }
+
+ return objp && objp->mDrawable.notNull() && objp->mDrawable->isVisible() ;
}
- if (!gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_SIMPLE))
+ return FALSE ;
+}
+
+void LLVOVolume::updateTextureVirtualSize(bool forced)
+{
+ LLFastTimer ftm(FTM_VOLUME_TEXTURES);
+ // Update the pixel area of all faces
+
+ if(!forced)
{
- return;
+ if(!isVisible())
+ {
+ return ;
+ }
+
+ if (!gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_SIMPLE))
+ {
+ return;
+ }
}
static LLCachedControl<bool> dont_load_textures(gSavedSettings,"TextureDisable");
@@ -702,7 +746,7 @@ void LLVOVolume::updateTextureVirtualSize()
const LLTextureEntry *te = face->getTextureEntry();
LLViewerTexture *imagep = face->getTexture();
if (!imagep || !te ||
- face->mExtents[0] == face->mExtents[1])
+ face->mExtents[0].equals3(face->mExtents[1]))
{
continue;
}
@@ -761,10 +805,12 @@ void LLVOVolume::updateTextureVirtualSize()
if (isSculpted())
{
LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT);
- LLUUID id = sculpt_params->getSculptTexture();
+ LLUUID id = sculpt_params->getSculptTexture();
updateSculptTexture();
+
+
if (mSculptTexture.notNull())
{
mSculptTexture->setBoostLevel(llmax((S32)mSculptTexture->getBoostLevel(),
@@ -805,6 +851,7 @@ void LLVOVolume::updateTextureVirtualSize()
mSculptTexture->getHeight(), mSculptTexture->getWidth()));
}
}
+
}
if (getLightTextureID().notNull())
@@ -820,18 +867,18 @@ void LLVOVolume::updateTextureVirtualSize()
*camera));
}
}
-
+
if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_TEXTURE_AREA))
{
- setDebugText(llformat("%.0f:%.0f", fsqrtf(min_vsize),fsqrtf(max_vsize)));
+ setDebugText(llformat("%.0f:%.0f", (F32) sqrt(min_vsize),(F32) sqrt(max_vsize)));
}
else if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_TEXTURE_PRIORITY))
{
- setDebugText(llformat("%.0f:%.0f", fsqrtf(min_vsize),fsqrtf(max_vsize)));
+ setDebugText(llformat("%.0f:%.0f", (F32) sqrt(min_vsize),(F32) sqrt(max_vsize)));
}
else if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_FACE_AREA))
{
- setDebugText(llformat("%.0f:%.0f", fsqrtf(min_vsize),fsqrtf(max_vsize)));
+ setDebugText(llformat("%.0f:%.0f", (F32) sqrt(min_vsize),(F32) sqrt(max_vsize)));
}
if (mPixelArea == 0)
@@ -842,7 +889,8 @@ void LLVOVolume::updateTextureVirtualSize()
BOOL LLVOVolume::isActive() const
{
- return !mStatic || mTextureAnimp || (mVolumeImpl && mVolumeImpl->isActive());
+ return !mStatic || mTextureAnimp || (mVolumeImpl && mVolumeImpl->isActive()) ||
+ (mDrawable.notNull() && mDrawable->isActive());
}
BOOL LLVOVolume::setMaterial(const U8 material)
@@ -916,8 +964,31 @@ LLDrawable *LLVOVolume::createDrawable(LLPipeline *pipeline)
return mDrawable;
}
-BOOL LLVOVolume::setVolume(const LLVolumeParams &volume_params, const S32 detail, bool unique_volume)
+BOOL LLVOVolume::setVolume(const LLVolumeParams &params_in, const S32 detail, bool unique_volume)
{
+ LLVolumeParams volume_params = params_in;
+
+ S32 last_lod = mVolumep.notNull() ? LLVolumeLODGroup::getVolumeDetailFromScale(mVolumep->getDetail()) : -1;
+ S32 lod = mLOD;
+
+ BOOL is404 = FALSE;
+
+ if (isSculpted())
+ {
+ // if it's a mesh
+ if ((volume_params.getSculptType() & LL_SCULPT_TYPE_MASK) == LL_SCULPT_TYPE_MESH)
+ { //meshes might not have all LODs, get the force detail to best existing LOD
+ LLUUID mesh_id = volume_params.getSculptID();
+
+ lod = gMeshRepo.getActualMeshLOD(volume_params, lod);
+ if (lod == -1)
+ {
+ is404 = TRUE;
+ lod = 0;
+ }
+ }
+ }
+
// Check if we need to change implementations
bool is_flexible = (volume_params.getPathParams().getCurveType() == LL_PCODE_PATH_FLEXIBLE);
if (is_flexible)
@@ -945,13 +1016,21 @@ BOOL LLVOVolume::setVolume(const LLVolumeParams &volume_params, const S32 detail
}
}
- if ((LLPrimitive::setVolume(volume_params, mLOD, (mVolumeImpl && mVolumeImpl->isVolumeUnique()))) || mSculptChanged)
+ if (is404)
+ {
+ setIcon(LLViewerTextureManager::getFetchedTextureFromFile("icons/Inv_Mesh.png", TRUE, LLViewerTexture::BOOST_UI));
+ //render prim proxy when mesh loading attempts give up
+ volume_params.setSculptID(LLUUID::null, LL_SCULPT_TYPE_NONE);
+
+ }
+
+ if ((LLPrimitive::setVolume(volume_params, lod, (mVolumeImpl && mVolumeImpl->isVolumeUnique()))) || mSculptChanged)
{
mFaceMappingChanged = TRUE;
if (mVolumeImpl)
{
- mVolumeImpl->onSetVolume(volume_params, detail);
+ mVolumeImpl->onSetVolume(volume_params, mLOD);
}
updateSculptTexture();
@@ -959,15 +1038,33 @@ BOOL LLVOVolume::setVolume(const LLVolumeParams &volume_params, const S32 detail
if (isSculpted())
{
updateSculptTexture();
-
- if (mSculptTexture.notNull())
+ // if it's a mesh
+ if ((volume_params.getSculptType() & LL_SCULPT_TYPE_MASK) == LL_SCULPT_TYPE_MESH)
+ {
+ if (!getVolume()->isMeshAssetLoaded())
+ {
+ //load request not yet issued, request pipeline load this mesh
+ LLUUID asset_id = volume_params.getSculptID();
+ S32 available_lod = gMeshRepo.loadMesh(this, volume_params, lod, last_lod);
+ if (available_lod != lod)
+ {
+ LLPrimitive::setVolume(volume_params, available_lod);
+ }
+ }
+
+ }
+ else // otherwise is sculptie
{
- sculpt();
+ if (mSculptTexture.notNull())
+ {
+ sculpt();
+ }
}
}
return TRUE;
}
+
return FALSE;
}
@@ -975,7 +1072,7 @@ void LLVOVolume::updateSculptTexture()
{
LLPointer<LLViewerFetchedTexture> old_sculpt = mSculptTexture;
- if (isSculpted())
+ if (isSculpted() && !isMesh())
{
LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT);
LLUUID id = sculpt_params->getSculptTexture();
@@ -1003,6 +1100,12 @@ void LLVOVolume::updateSculptTexture()
}
+void LLVOVolume::notifyMeshLoaded()
+{
+ mSculptChanged = TRUE;
+ gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_GEOMETRY, TRUE);
+}
+
// sculpt replaces generate() for sculpted surfaces
void LLVOVolume::sculpt()
{
@@ -1106,10 +1209,26 @@ BOOL LLVOVolume::calcLOD()
S32 cur_detail = 0;
- F32 radius = getVolume()->mLODScaleBias.scaledVec(getScale()).length();
- F32 distance = mDrawable->mDistanceWRTCamera; //llmin(mDrawable->mDistanceWRTCamera, MAX_LOD_DISTANCE);
+ F32 radius;
+ F32 distance;
+
+ if (mDrawable->isState(LLDrawable::RIGGED))
+ {
+ LLVOAvatar* avatar = getAvatar();
+ distance = avatar->mDrawable->mDistanceWRTCamera;
+ radius = avatar->getBinRadius();
+ }
+ else
+ {
+ distance = mDrawable->mDistanceWRTCamera;
+ radius = getVolume()->mLODScaleBias.scaledVec(getScale()).length();
+ }
+
+ //hold onto unmodified distance for debugging
+ //F32 debug_distance = distance;
+
distance *= sDistanceFactor;
-
+
F32 rampDist = LLVOVolume::sLODFactor * 2;
if (distance < rampDist)
@@ -1126,6 +1245,14 @@ BOOL LLVOVolume::calcLOD()
cur_detail = computeLODDetail(llround(distance, 0.01f),
llround(radius, 0.01f));
+
+ if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_LOD_INFO))
+ {
+ //setDebugText(llformat("%.2f:%.2f, %d", debug_distance, radius, cur_detail));
+
+ setDebugText(llformat("%d", mDrawable->getFace(0)->getTextureIndex()));
+ }
+
if (cur_detail != mLOD)
{
mAppAngle = llround((F32) atan2( mDrawable->getRadius(), mDrawable->mDistanceWRTCamera) * RAD_TO_DEG, 0.01f);
@@ -1152,8 +1279,17 @@ BOOL LLVOVolume::updateLOD()
gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_VOLUME, FALSE);
mLODChanged = TRUE;
}
+ else
+ {
+ F32 new_radius = getBinRadius();
+ F32 old_radius = mDrawable->getBinRadius();
+ if (new_radius < old_radius * 0.9f || new_radius > old_radius*1.1f)
+ {
+ gPipeline.markPartitionMove(mDrawable);
+ }
+ }
- lod_changed |= LLViewerObject::updateLOD();
+ lod_changed = lod_changed || LLViewerObject::updateLOD();
return lod_changed;
}
@@ -1189,6 +1325,11 @@ void LLVOVolume::updateFaceFlags()
for (S32 i = 0; i < getVolume()->getNumFaces(); i++)
{
LLFace *face = mDrawable->getFace(i);
+ if (!face)
+ {
+ return;
+ }
+
BOOL fullbright = getTE(i)->getFullbright();
face->clearState(LLFace::FULLBRIGHT | LLFace::HUD_RENDER | LLFace::LIGHT);
@@ -1268,14 +1409,28 @@ BOOL LLVOVolume::genBBoxes(BOOL force_global)
{
BOOL res = TRUE;
- LLVector3 min,max;
+ LLVector4a min,max;
- BOOL rebuild = mDrawable->isState(LLDrawable::REBUILD_VOLUME | LLDrawable::REBUILD_POSITION);
+ min.clear();
+ max.clear();
- for (S32 i = 0; i < getVolume()->getNumFaces(); i++)
+ BOOL rebuild = mDrawable->isState(LLDrawable::REBUILD_VOLUME | LLDrawable::REBUILD_POSITION | LLDrawable::REBUILD_RIGGED);
+
+// bool rigged = false;
+ LLVolume* volume = mRiggedVolume;
+ if (!volume)
+ {
+ volume = getVolume();
+ }
+
+ for (S32 i = 0; i < getVolume()->getNumVolumeFaces(); i++)
{
LLFace *face = mDrawable->getFace(i);
- res &= face->genVolumeBBoxes(*getVolume(), i,
+ if (!face)
+ {
+ continue;
+ }
+ res &= face->genVolumeBBoxes(*volume, i,
mRelativeXform, mRelativeXformInvTrans,
(mVolumeImpl && mVolumeImpl->isVolumeGlobal()) || force_global);
@@ -1288,17 +1443,8 @@ BOOL LLVOVolume::genBBoxes(BOOL force_global)
}
else
{
- for (U32 i = 0; i < 3; i++)
- {
- if (face->mExtents[0].mV[i] < min.mV[i])
- {
- min.mV[i] = face->mExtents[0].mV[i];
- }
- if (face->mExtents[1].mV[i] > max.mV[i])
- {
- max.mV[i] = face->mExtents[1].mV[i];
- }
- }
+ min.setMin(min, face->mExtents[0]);
+ max.setMax(max, face->mExtents[1]);
}
}
}
@@ -1306,7 +1452,9 @@ BOOL LLVOVolume::genBBoxes(BOOL force_global)
if (rebuild)
{
mDrawable->setSpatialExtents(min,max);
- mDrawable->setPositionGroup((min+max)*0.5f);
+ min.add(max);
+ min.mul(0.5f);
+ mDrawable->setPositionGroup(min);
}
updateRadius();
@@ -1333,7 +1481,21 @@ void LLVOVolume::updateRelativeXform()
LLDrawable* drawable = mDrawable;
- if (drawable->isActive())
+ if (drawable->isState(LLDrawable::RIGGED) && mRiggedVolume.notNull())
+ { //rigged volume (which is in agent space) is used for generating bounding boxes etc
+ //inverse of render matrix should go to partition space
+ mRelativeXform = getRenderMatrix();
+
+ F32* dst = (F32*) mRelativeXformInvTrans.mMatrix;
+ F32* src = (F32*) mRelativeXform.mMatrix;
+ dst[0] = src[0]; dst[1] = src[1]; dst[2] = src[2];
+ dst[3] = src[4]; dst[4] = src[5]; dst[5] = src[6];
+ dst[6] = src[8]; dst[7] = src[9]; dst[8] = src[10];
+
+ mRelativeXform.invert();
+ mRelativeXformInvTrans.transpose();
+ }
+ else if (drawable->isActive())
{
// setup relative transforms
LLQuaternion delta_rot;
@@ -1415,11 +1577,22 @@ void LLVOVolume::updateRelativeXform()
static LLFastTimer::DeclareTimer FTM_GEN_FLEX("Generate Flexies");
static LLFastTimer::DeclareTimer FTM_UPDATE_PRIMITIVES("Update Primitives");
+static LLFastTimer::DeclareTimer FTM_UPDATE_RIGGED_VOLUME("Update Rigged");
BOOL LLVOVolume::updateGeometry(LLDrawable *drawable)
{
LLFastTimer t(FTM_UPDATE_PRIMITIVES);
+ if (mDrawable->isState(LLDrawable::REBUILD_RIGGED))
+ {
+ {
+ LLFastTimer t(FTM_UPDATE_RIGGED_VOLUME);
+ updateRiggedVolume();
+ }
+ genBBoxes(FALSE);
+ mDrawable->clearState(LLDrawable::REBUILD_RIGGED);
+ }
+
if (mVolumeImpl != NULL)
{
BOOL res;
@@ -1487,15 +1660,31 @@ BOOL LLVOVolume::updateGeometry(LLDrawable *drawable)
compiled = TRUE;
sNumLODChanges += new_num_faces ;
+ if((S32)getNumTEs() != getVolume()->getNumFaces())
+ {
+ setNumTEs(getVolume()->getNumFaces()); //mesh loading may change number of faces.
+ }
+
drawable->setState(LLDrawable::REBUILD_VOLUME); // for face->genVolumeTriangles()
{
LLFastTimer t(FTM_GEN_TRIANGLES);
- if (new_num_faces != old_num_faces)
+ if (new_num_faces != old_num_faces || mNumFaces != (S32)getNumTEs())
{
regenFaces();
}
genBBoxes(FALSE);
+
+ if (mSculptChanged)
+ { //changes in sculpt maps can thrash an object bounding box without
+ //triggering a spatial group bounding box update -- force spatial group
+ //to update bounding boxes
+ LLSpatialGroup* group = mDrawable->getSpatialGroup();
+ if (group)
+ {
+ group->unbound();
+ }
+ }
}
}
}
@@ -1515,12 +1704,12 @@ BOOL LLVOVolume::updateGeometry(LLDrawable *drawable)
{
LLPipeline::sCompiles++;
}
-
+
mVolumeChanged = FALSE;
mLODChanged = FALSE;
mSculptChanged = FALSE;
mFaceMappingChanged = FALSE;
-
+
return LLViewerObject::updateGeometry(drawable);
}
@@ -1529,19 +1718,14 @@ void LLVOVolume::updateFaceSize(S32 idx)
LLFace* facep = mDrawable->getFace(idx);
if (idx >= getVolume()->getNumVolumeFaces())
{
- facep->setSize(0,0);
+ facep->setSize(0,0, true);
}
else
{
const LLVolumeFace& vol_face = getVolume()->getVolumeFace(idx);
- if (LLPipeline::sUseTriStrips)
- {
- facep->setSize(vol_face.mVertices.size(), vol_face.mTriStrip.size());
- }
- else
- {
- facep->setSize(vol_face.mVertices.size(), vol_face.mIndices.size());
- }
+ facep->setSize(vol_face.mNumVertices, vol_face.mNumIndices,
+ true); // <--- volume faces should be padded for 16-byte alignment
+
}
}
@@ -1796,21 +1980,25 @@ bool LLVOVolume::hasMedia() const
LLVector3 LLVOVolume::getApproximateFaceNormal(U8 face_id)
{
LLVolume* volume = getVolume();
- LLVector3 result;
+ LLVector4a result;
+ result.clear();
+
+ LLVector3 ret;
if (volume && face_id < volume->getNumVolumeFaces())
{
const LLVolumeFace& face = volume->getVolumeFace(face_id);
- for (S32 i = 0; i < (S32)face.mVertices.size(); ++i)
+ for (S32 i = 0; i < (S32)face.mNumVertices; ++i)
{
- result += face.mVertices[i].mNormal;
+ result.add(face.mNormals[i]);
}
- result = volumeDirectionToAgent(result);
- result.normVec();
+ LLVector3 ret(result.getF32ptr());
+ ret = volumeDirectionToAgent(ret);
+ ret.normVec();
}
- return result;
+ return ret;
}
void LLVOVolume::requestMediaDataUpdate(bool isNew)
@@ -2142,7 +2330,7 @@ void LLVOVolume::removeMediaImpl(S32 texture_index)
}
//make the face referencing to mMediaImplList[texture_index] to point back to the old texture.
- if(mDrawable)
+ if(mDrawable && texture_index < mDrawable->getNumFaces())
{
LLFace* facep = mDrawable->getFace(texture_index) ;
if(facep)
@@ -2607,6 +2795,23 @@ BOOL LLVOVolume::isSculpted() const
return FALSE;
}
+BOOL LLVOVolume::isMesh() const
+{
+ if (isSculpted())
+ {
+ LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT);
+ U8 sculpt_type = sculpt_params->getSculptType();
+
+ if ((sculpt_type & LL_SCULPT_TYPE_MASK) == LL_SCULPT_TYPE_MESH)
+ // mesh is a mesh
+ {
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
BOOL LLVOVolume::hasLightTexture() const
{
if (getParameterEntryInUse(LLNetworkData::PARAMS_LIGHT_IMAGE))
@@ -2623,6 +2828,11 @@ BOOL LLVOVolume::isVolumeGlobal() const
{
return mVolumeImpl->isVolumeGlobal() ? TRUE : FALSE;
}
+ else if (mRiggedVolume.notNull())
+ {
+ return TRUE;
+ }
+
return FALSE;
}
@@ -2707,7 +2917,7 @@ void LLVOVolume::generateSilhouette(LLSelectNode* nodep, const LLVector3& view_p
trans_mat.translate(getRegion()->getOriginAgent());
}
- volume->generateSilhouetteVertices(nodep->mSilhouetteVertices, nodep->mSilhouetteNormals, nodep->mSilhouetteSegments, view_vector, trans_mat, mRelativeXformInvTrans, nodep->getTESelectMask());
+ volume->generateSilhouetteVertices(nodep->mSilhouetteVertices, nodep->mSilhouetteNormals, view_vector, trans_mat, mRelativeXformInvTrans, nodep->getTESelectMask());
nodep->mSilhouetteExists = TRUE;
}
@@ -2738,14 +2948,7 @@ void LLVOVolume::updateRadius()
BOOL LLVOVolume::isAttachment() const
{
- if (mState == 0)
- {
- return FALSE;
- }
- else
- {
- return TRUE;
- }
+ return mState != 0 ;
}
BOOL LLVOVolume::isHUDAttachment() const
@@ -2771,24 +2974,38 @@ const LLMatrix4 LLVOVolume::getRenderMatrix() const
// total cost is returned value + 5 * size of the resulting set.
// Cannot include cost of textures, as they may be re-used in linked
// children, and cost should only be increased for unique textures -Nyx
-U32 LLVOVolume::getRenderCost(std::set<LLUUID> &textures) const
+U32 LLVOVolume::getRenderCost(texture_cost_t &textures) const
{
- // base cost of each prim should be 10 points
- static const U32 ARC_PRIM_COST = 10;
+ // Get access to params we'll need at various points.
+ // Skip if this is object doesn't have a volume (e.g. is an avatar).
+ BOOL has_volume = (getVolume() != NULL);
+ LLVolumeParams volume_params;
+ LLPathParams path_params;
+ LLProfileParams profile_params;
+
+ U32 num_triangles = 0;
+
// per-prim costs
- static const U32 ARC_INVISI_COST = 1;
- static const U32 ARC_SHINY_COST = 1;
- static const U32 ARC_GLOW_COST = 1;
- static const U32 ARC_FLEXI_COST = 8;
- static const U32 ARC_PARTICLE_COST = 16;
- static const U32 ARC_BUMP_COST = 4;
+ static const U32 ARC_PARTICLE_COST = 1; // determined experimentally
+ static const U32 ARC_PARTICLE_MAX = 2048; // default values
+ static const U32 ARC_TEXTURE_COST = 16; // multiplier for texture resolution - performance tested
+ static const U32 ARC_LIGHT_COST = 500; // static cost for light-producing prims
+ static const U32 ARC_MEDIA_FACE_COST = 1500; // static cost per media-enabled face
+
+
+ // per-prim multipliers
+ static const F32 ARC_GLOW_MULT = 1.5f; // tested based on performance
+ static const F32 ARC_BUMP_MULT = 1.25f; // tested based on performance
+ static const F32 ARC_FLEXI_MULT = 5; // tested based on performance
+ static const F32 ARC_SHINY_MULT = 1.6f; // tested based on performance
+ static const F32 ARC_INVISI_COST = 1.2f; // tested based on performance
+ static const F32 ARC_WEIGHTED_MESH = 1.2f; // tested based on performance
- // per-face costs
- static const U32 ARC_PLANAR_COST = 1;
- static const U32 ARC_ANIM_TEX_COST = 4;
- static const U32 ARC_ALPHA_COST = 4;
+ static const F32 ARC_PLANAR_COST = 1.0f; // tested based on performance to have negligible impact
+ static const F32 ARC_ANIM_TEX_COST = 4.f; // tested based on performance
+ static const F32 ARC_ALPHA_COST = 4.f; // 4x max - based on performance
- U32 shame = ARC_PRIM_COST;
+ F32 shame = 0;
U32 invisi = 0;
U32 shiny = 0;
@@ -2797,9 +3014,72 @@ U32 LLVOVolume::getRenderCost(std::set<LLUUID> &textures) const
U32 flexi = 0;
U32 animtex = 0;
U32 particles = 0;
- U32 scale = 0;
U32 bump = 0;
U32 planar = 0;
+ U32 weighted_mesh = 0;
+ U32 produces_light = 0;
+ U32 media_faces = 0;
+
+ const LLDrawable* drawablep = mDrawable;
+ U32 num_faces = drawablep->getNumFaces();
+
+ if (has_volume)
+ {
+ volume_params = getVolume()->getParams();
+ path_params = volume_params.getPathParams();
+ profile_params = volume_params.getProfileParams();
+
+ F32 weighted_triangles = -1.0;
+ getStreamingCost(NULL, NULL, &weighted_triangles);
+
+ if (weighted_triangles > 0.0)
+ {
+ num_triangles = (U32)(weighted_triangles);
+ }
+ }
+
+ if (num_triangles == 0)
+ {
+ num_triangles = 4;
+ }
+
+ if (isSculpted())
+ {
+ if (isMesh())
+ {
+ // base cost is dependent on mesh complexity
+ // note that 3 is the highest LOD as of the time of this coding.
+ S32 size = gMeshRepo.getMeshSize(volume_params.getSculptID(),3);
+ if ( size > 0)
+ {
+ if (gMeshRepo.getSkinInfo(volume_params.getSculptID(), this))
+ {
+ // weighted attachment - 1 point for every 3 bytes
+ weighted_mesh = 1;
+ }
+
+ }
+ else
+ {
+ // something went wrong - user should know their content isn't render-free
+ return 0;
+ }
+ }
+ else
+ {
+ const LLSculptParams *sculpt_params = (LLSculptParams *) getParameterEntry(LLNetworkData::PARAMS_SCULPT);
+ LLUUID sculpt_id = sculpt_params->getSculptTexture();
+ if (textures.find(sculpt_id) == textures.end())
+ {
+ LLViewerFetchedTexture *texture = LLViewerTextureManager::getFetchedTexture(sculpt_id);
+ if (texture)
+ {
+ S32 texture_cost = 256 + (S32)(ARC_TEXTURE_COST * (texture->getFullHeight() / 128.f + texture->getFullWidth() / 128.f));
+ textures.insert(texture_cost_t::value_type(sculpt_id, texture_cost));
+ }
+ }
+ }
+ }
if (isFlexible())
{
@@ -2810,19 +3090,12 @@ U32 LLVOVolume::getRenderCost(std::set<LLUUID> &textures) const
particles = 1;
}
- const LLVector3& sc = getScale();
- scale += (U32) sc.mV[0] + (U32) sc.mV[1] + (U32) sc.mV[2];
-
- const LLDrawable* drawablep = mDrawable;
-
- if (isSculpted())
+ if (getIsLight())
{
- const LLSculptParams *sculpt_params = (LLSculptParams *) getParameterEntry(LLNetworkData::PARAMS_SCULPT);
- LLUUID sculpt_id = sculpt_params->getSculptTexture();
- textures.insert(sculpt_id);
+ produces_light = 1;
}
- for (S32 i = 0; i < drawablep->getNumFaces(); ++i)
+ for (S32 i = 0; i < num_faces; ++i)
{
const LLFace* face = drawablep->getFace(i);
const LLTextureEntry* te = face->getTextureEntry();
@@ -2830,74 +3103,209 @@ U32 LLVOVolume::getRenderCost(std::set<LLUUID> &textures) const
if (img)
{
- textures.insert(img->getID());
+ if (textures.find(img->getID()) == textures.end())
+ {
+ S32 texture_cost = 256 + (S32)(ARC_TEXTURE_COST * (img->getFullHeight() / 128.f + img->getFullWidth() / 128.f));
+ textures.insert(texture_cost_t::value_type(img->getID(), texture_cost));
+ }
}
if (face->getPoolType() == LLDrawPool::POOL_ALPHA)
{
- alpha++;
+ alpha = 1;
}
else if (img && img->getPrimaryFormat() == GL_ALPHA)
{
invisi = 1;
}
+ if (face->hasMedia())
+ {
+ media_faces++;
+ }
if (te)
{
if (te->getBumpmap())
{
+ // bump is a multiplier, don't add per-face
bump = 1;
}
if (te->getShiny())
{
+ // shiny is a multiplier, don't add per-face
shiny = 1;
}
if (te->getGlow() > 0.f)
{
+ // glow is a multiplier, don't add per-face
glow = 1;
}
if (face->mTextureMatrix != NULL)
{
- animtex++;
+ animtex = 1;
}
if (te->getTexGen())
{
- planar++;
+ planar = 1;
}
}
}
+ // shame currently has the "base" cost of 1 point per 15 triangles, min 2.
+ shame = num_triangles * 5.f;
+ shame = shame < 2.f ? 2.f : shame;
+
+ // multiply by per-face modifiers
+ if (planar)
+ {
+ shame *= planar * ARC_PLANAR_COST;
+ }
+
+ if (animtex)
+ {
+ shame *= animtex * ARC_ANIM_TEX_COST;
+ }
+
+ if (alpha)
+ {
+ shame *= alpha * ARC_ALPHA_COST;
+ }
+
+ if(invisi)
+ {
+ shame *= invisi * ARC_INVISI_COST;
+ }
+
+ if (glow)
+ {
+ shame *= glow * ARC_GLOW_MULT;
+ }
+
+ if (bump)
+ {
+ shame *= bump * ARC_BUMP_MULT;
+ }
+
+ if (shiny)
+ {
+ shame *= shiny * ARC_SHINY_MULT;
+ }
+
+
+ // multiply shame by multipliers
+ if (weighted_mesh)
+ {
+ shame *= weighted_mesh * ARC_WEIGHTED_MESH;
+ }
+
+ if (flexi)
+ {
+ shame *= flexi * ARC_FLEXI_MULT;
+ }
- shame += invisi * ARC_INVISI_COST;
- shame += shiny * ARC_SHINY_COST;
- shame += glow * ARC_GLOW_COST;
- shame += alpha * ARC_ALPHA_COST;
- shame += flexi * ARC_FLEXI_COST;
- shame += animtex * ARC_ANIM_TEX_COST;
- shame += particles * ARC_PARTICLE_COST;
- shame += bump * ARC_BUMP_COST;
- shame += planar * ARC_PLANAR_COST;
- shame += scale;
- LLViewerObject::const_child_list_t& child_list = getChildren();
- for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
- iter != child_list.end();
- ++iter)
+ // add additional costs
+ if (particles)
{
- const LLViewerObject* child_objectp = *iter;
- const LLDrawable* child_drawablep = child_objectp->mDrawable;
- if (child_drawablep)
+ const LLPartSysData *part_sys_data = &(mPartSourcep->mPartSysData);
+ const LLPartData *part_data = &(part_sys_data->mPartData);
+ U32 num_particles = (U32)(part_sys_data->mBurstPartCount * llceil( part_data->mMaxAge / part_sys_data->mBurstRate));
+ num_particles = num_particles > ARC_PARTICLE_MAX ? ARC_PARTICLE_MAX : num_particles;
+ F32 part_size = (llmax(part_data->mStartScale[0], part_data->mEndScale[0]) + llmax(part_data->mStartScale[1], part_data->mEndScale[1])) / 2.f;
+ shame += num_particles * part_size * ARC_PARTICLE_COST;
+ }
+
+ if (produces_light)
+ {
+ shame += ARC_LIGHT_COST;
+ }
+
+ if (media_faces)
+ {
+ shame += media_faces * ARC_MEDIA_FACE_COST;
+ }
+
+ if (shame > mRenderComplexity_current)
+ {
+ mRenderComplexity_current = (S32)shame;
+ }
+
+ return (U32)shame;
+}
+
+F32 LLVOVolume::getStreamingCost(S32* bytes, S32* visible_bytes, F32* unscaled_value) const
+{
+ F32 radius = getScale().length()*0.5f;
+
+ if (isMesh())
+ {
+ LLSD& header = gMeshRepo.getMeshHeader(getVolume()->getParams().getSculptID());
+
+ return LLMeshRepository::getStreamingCost(header, radius, bytes, visible_bytes, mLOD, unscaled_value);
+ }
+ else
+ {
+ LLVolume* volume = getVolume();
+ S32 counts[4];
+ LLVolume::getLoDTriangleCounts(volume->getParams(), counts);
+
+ LLSD header;
+ header["lowest_lod"]["size"] = counts[0] * 10;
+ header["low_lod"]["size"] = counts[1] * 10;
+ header["medium_lod"]["size"] = counts[2] * 10;
+ header["high_lod"]["size"] = counts[3] * 10;
+
+ return LLMeshRepository::getStreamingCost(header, radius, NULL, NULL, -1, unscaled_value);
+ }
+}
+
+//static
+void LLVOVolume::updateRenderComplexity()
+{
+ mRenderComplexity_last = mRenderComplexity_current;
+ mRenderComplexity_current = 0;
+}
+
+U32 LLVOVolume::getTriangleCount(S32* vcount) const
+{
+ U32 count = 0;
+ LLVolume* volume = getVolume();
+ if (volume)
+ {
+ count = volume->getNumTriangles(vcount);
+ }
+
+ return count;
+}
+
+U32 LLVOVolume::getHighLODTriangleCount()
+{
+ U32 ret = 0;
+
+ LLVolume* volume = getVolume();
+
+ if (!isSculpted())
+ {
+ LLVolume* ref = LLPrimitive::getVolumeManager()->refVolume(volume->getParams(), 3);
+ ret = ref->getNumTriangles();
+ LLPrimitive::getVolumeManager()->unrefVolume(ref);
+ }
+ else if (isMesh())
+ {
+ LLVolume* ref = LLPrimitive::getVolumeManager()->refVolume(volume->getParams(), 3);
+ if (!ref->isMeshAssetLoaded() || ref->getNumVolumeFaces() == 0)
{
- const LLVOVolume* child_volumep = child_drawablep->getVOVolume();
- if (child_volumep)
- {
- shame += child_volumep->getRenderCost(textures);
- }
+ gMeshRepo.loadMesh(this, volume->getParams(), LLModel::LOD_HIGH);
}
+ ret = ref->getNumTriangles();
+ LLPrimitive::getVolumeManager()->unrefVolume(ref);
+ }
+ else
+ { //default sculpts have a constant number of triangles
+ ret = 31*2*31; //31 rows of 31 columns of quads for a 32x32 vertex patch
}
- return shame;
-
+ return ret;
}
//static
@@ -2937,7 +3345,7 @@ void LLVOVolume::setSelected(BOOL sel)
}
}
-void LLVOVolume::updateSpatialExtents(LLVector3& newMin, LLVector3& newMax)
+void LLVOVolume::updateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax)
{
}
@@ -2945,7 +3353,13 @@ F32 LLVOVolume::getBinRadius()
{
F32 radius;
- const LLVector3* ext = mDrawable->getSpatialExtents();
+ F32 scale = 1.f;
+
+ S32 size_factor = llmax(gSavedSettings.getS32("OctreeStaticObjectSizeFactor"), 1);
+ S32 attachment_size_factor = llmax(gSavedSettings.getS32("OctreeAttachmentSizeFactor"), 1);
+ LLVector3 distance_factor = gSavedSettings.getVector3("OctreeDistanceFactor");
+ LLVector3 alpha_distance_factor = gSavedSettings.getVector3("OctreeAlphaDistanceFactor");
+ const LLVector4a* ext = mDrawable->getSpatialExtents();
BOOL shrink_wrap = mDrawable->isAnimating();
BOOL alpha_wrap = FALSE;
@@ -2974,34 +3388,34 @@ F32 LLVOVolume::getBinRadius()
radius = llmin(bounds.mV[1], bounds.mV[2]);
radius = llmin(radius, bounds.mV[0]);
radius *= 0.5f;
+ radius *= 1.f+mDrawable->mDistanceWRTCamera*alpha_distance_factor[1];
+ radius += mDrawable->mDistanceWRTCamera*alpha_distance_factor[0];
}
else if (shrink_wrap)
{
- radius = (ext[1]-ext[0]).length()*0.5f;
+ LLVector4a rad;
+ rad.setSub(ext[1], ext[0]);
+
+ radius = rad.getLength3().getF32()*0.5f;
}
else if (mDrawable->isStatic())
{
- /*if (mDrawable->getRadius() < 2.0f)
- {
- radius = 16.f;
- }
- else
- {
- radius = llmax(mDrawable->getRadius(), 32.f);
- }*/
-
- radius = (((S32) mDrawable->getRadius())/2+1)*8;
+ radius = llmax((S32) mDrawable->getRadius(), 1)*size_factor;
+ radius *= 1.f + mDrawable->mDistanceWRTCamera * distance_factor[1];
+ radius += mDrawable->mDistanceWRTCamera * distance_factor[0];
}
else if (mDrawable->getVObj()->isAttachment())
{
- radius = (((S32) (mDrawable->getRadius()*4)+1))*2;
+ radius = llmax((S32) mDrawable->getRadius(),1)*attachment_size_factor;
}
else
{
- radius = 8.f;
+ radius = mDrawable->getRadius();
+ radius *= 1.f + mDrawable->mDistanceWRTCamera * distance_factor[1];
+ radius += mDrawable->mDistanceWRTCamera * distance_factor[0];
}
- return llclamp(radius, 0.5f, 256.f);
+ return llclamp(radius*scale, 0.5f, 256.f);
}
const LLVector3 LLVOVolume::getPivotPositionAgent() const
@@ -3013,7 +3427,7 @@ const LLVector3 LLVOVolume::getPivotPositionAgent() const
return LLViewerObject::getPivotPositionAgent();
}
-void LLVOVolume::onShift(const LLVector3 &shift_vector)
+void LLVOVolume::onShift(const LLVector4a &shift_vector)
{
if (mVolumeImpl)
{
@@ -3090,12 +3504,38 @@ BOOL LLVOVolume::lineSegmentIntersect(const LLVector3& start, const LLVector3& e
BOOL ret = FALSE;
LLVolume* volume = getVolume();
+
+ bool transform = true;
+
+ if (mDrawable->isState(LLDrawable::RIGGED))
+ {
+ if (LLFloater::isVisible(gFloaterTools) && getAvatar()->isSelf())
+ {
+ updateRiggedVolume();
+ genBBoxes(FALSE);
+ volume = mRiggedVolume;
+ transform = false;
+ }
+ else
+ { //cannot pick rigged attachments on other avatars or when not in build mode
+ return FALSE;
+ }
+ }
+
if (volume)
{
LLVector3 v_start, v_end, v_dir;
- v_start = agentPositionToVolume(start);
- v_end = agentPositionToVolume(end);
+ if (transform)
+ {
+ v_start = agentPositionToVolume(start);
+ v_end = agentPositionToVolume(end);
+ }
+ else
+ {
+ v_start = start;
+ v_end = end;
+ }
LLVector3 p;
LLVector3 n;
@@ -3136,8 +3576,15 @@ BOOL LLVOVolume::lineSegmentIntersect(const LLVector3& start, const LLVector3& e
end_face = face+1;
}
+ bool special_cursor = specialHoverCursor();
for (S32 i = start_face; i < end_face; ++i)
{
+ if (!special_cursor && !pick_transparent && getTE(i) && getTE(i)->getColor().mV[3] == 0.f)
+ { //don't attempt to pick completely transparent faces unless
+ //pick_transparent is true
+ continue;
+ }
+
face_hit = volume->lineSegmentIntersect(v_start, v_end, i,
&p, &tc, &n, &bn);
@@ -3155,18 +3602,40 @@ BOOL LLVOVolume::lineSegmentIntersect(const LLVector3& start, const LLVector3& e
if (intersection != NULL)
{
- *intersection = volumePositionToAgent(p); // must map back to agent space
+ if (transform)
+ {
+ *intersection = volumePositionToAgent(p); // must map back to agent space
+ }
+ else
+ {
+ *intersection = p;
+ }
}
if (normal != NULL)
{
- *normal = volumeDirectionToAgent(n);
+ if (transform)
+ {
+ *normal = volumeDirectionToAgent(n);
+ }
+ else
+ {
+ *normal = n;
+ }
+
(*normal).normVec();
}
if (bi_normal != NULL)
{
- *bi_normal = volumeDirectionToAgent(bn);
+ if (transform)
+ {
+ *bi_normal = volumeDirectionToAgent(bn);
+ }
+ else
+ {
+ *bi_normal = bn;
+ }
(*bi_normal).normVec();
}
@@ -3184,6 +3653,201 @@ BOOL LLVOVolume::lineSegmentIntersect(const LLVector3& start, const LLVector3& e
return ret;
}
+bool LLVOVolume::treatAsRigged()
+{
+ return LLFloater::isVisible(gFloaterTools) &&
+ isAttachment() &&
+ getAvatar() &&
+ getAvatar()->isSelf() &&
+ mDrawable.notNull() &&
+ mDrawable->isState(LLDrawable::RIGGED);
+}
+
+LLRiggedVolume* LLVOVolume::getRiggedVolume()
+{
+ return mRiggedVolume;
+}
+
+void LLVOVolume::clearRiggedVolume()
+{
+ if (mRiggedVolume.notNull())
+ {
+ mRiggedVolume = NULL;
+ updateRelativeXform();
+ }
+}
+
+void LLVOVolume::updateRiggedVolume()
+{
+ //Update mRiggedVolume to match current animation frame of avatar.
+ //Also update position/size in octree.
+
+ if (!treatAsRigged())
+ {
+ clearRiggedVolume();
+
+ return;
+ }
+
+ LLVolume* volume = getVolume();
+
+ const LLMeshSkinInfo* skin = gMeshRepo.getSkinInfo(volume->getParams().getSculptID(), this);
+
+ if (!skin)
+ {
+ clearRiggedVolume();
+ return;
+ }
+
+ LLVOAvatar* avatar = getAvatar();
+
+ if (!avatar)
+ {
+ clearRiggedVolume();
+ return;
+ }
+
+ if (!mRiggedVolume)
+ {
+ LLVolumeParams p;
+ mRiggedVolume = new LLRiggedVolume(p);
+ updateRelativeXform();
+ }
+
+ mRiggedVolume->update(skin, avatar, volume);
+
+}
+
+static LLFastTimer::DeclareTimer FTM_SKIN_RIGGED("Skin");
+static LLFastTimer::DeclareTimer FTM_RIGGED_OCTREE("Octree");
+
+void LLRiggedVolume::update(const LLMeshSkinInfo* skin, LLVOAvatar* avatar, const LLVolume* volume)
+{
+ bool copy = false;
+ if (volume->getNumVolumeFaces() != getNumVolumeFaces())
+ {
+ copy = true;
+ }
+
+ for (S32 i = 0; i < volume->getNumVolumeFaces() && !copy; ++i)
+ {
+ const LLVolumeFace& src_face = volume->getVolumeFace(i);
+ const LLVolumeFace& dst_face = getVolumeFace(i);
+
+ if (src_face.mNumIndices != dst_face.mNumIndices ||
+ src_face.mNumVertices != dst_face.mNumVertices)
+ {
+ copy = true;
+ }
+ }
+
+ if (copy)
+ {
+ copyVolumeFaces(volume);
+ }
+
+ //build matrix palette
+ LLMatrix4a mp[64];
+ LLMatrix4* mat = (LLMatrix4*) mp;
+
+ for (U32 j = 0; j < skin->mJointNames.size(); ++j)
+ {
+ LLJoint* joint = avatar->getJoint(skin->mJointNames[j]);
+ if (joint)
+ {
+ mat[j] = skin->mInvBindMatrix[j];
+ mat[j] *= joint->getWorldMatrix();
+ }
+ }
+
+ for (S32 i = 0; i < volume->getNumVolumeFaces(); ++i)
+ {
+ const LLVolumeFace& vol_face = volume->getVolumeFace(i);
+
+ LLVolumeFace& dst_face = mVolumeFaces[i];
+
+ LLVector4a* weight = vol_face.mWeights;
+
+ LLMatrix4a bind_shape_matrix;
+ bind_shape_matrix.loadu(skin->mBindShapeMatrix);
+
+ LLVector4a* pos = dst_face.mPositions;
+
+ {
+ LLFastTimer t(FTM_SKIN_RIGGED);
+
+ for (U32 j = 0; j < dst_face.mNumVertices; ++j)
+ {
+ LLMatrix4a final_mat;
+ final_mat.clear();
+
+ S32 idx[4];
+
+ LLVector4 wght;
+
+ F32 scale = 0.f;
+ for (U32 k = 0; k < 4; k++)
+ {
+ F32 w = weight[j][k];
+
+ idx[k] = (S32) floorf(w);
+ wght[k] = w - floorf(w);
+ scale += wght[k];
+ }
+
+ wght *= 1.f/scale;
+
+ for (U32 k = 0; k < 4; k++)
+ {
+ F32 w = wght[k];
+
+ LLMatrix4a src;
+ src.setMul(mp[idx[k]], w);
+
+ final_mat.add(src);
+ }
+
+
+ LLVector4a& v = vol_face.mPositions[j];
+ LLVector4a t;
+ LLVector4a dst;
+ bind_shape_matrix.affineTransform(v, t);
+ final_mat.affineTransform(t, dst);
+ pos[j] = dst;
+ }
+
+ //update bounding box
+ LLVector4a& min = dst_face.mExtents[0];
+ LLVector4a& max = dst_face.mExtents[1];
+
+ min = pos[0];
+ max = pos[1];
+
+ for (U32 j = 1; j < dst_face.mNumVertices; ++j)
+ {
+ min.setMin(min, pos[j]);
+ max.setMax(max, pos[j]);
+ }
+
+ dst_face.mCenter->setAdd(dst_face.mExtents[0], dst_face.mExtents[1]);
+ dst_face.mCenter->mul(0.5f);
+
+ }
+
+ {
+ LLFastTimer t(FTM_RIGGED_OCTREE);
+ delete dst_face.mOctree;
+ dst_face.mOctree = NULL;
+
+ LLVector4a size;
+ size.setSub(dst_face.mExtents[1], dst_face.mExtents[0]);
+ size.splat(size.getLength3().getF32()*0.5f);
+
+ dst_face.createOctree(1.f);
+ }
+ }
+}
+
U32 LLVOVolume::getPartitionType() const
{
if (isHUDAttachment())
@@ -3218,6 +3882,26 @@ LLVolumeBridge::LLVolumeBridge(LLDrawable* drawablep)
mSlopRatio = 0.25f;
}
+bool can_batch_texture(LLFace* facep)
+{
+ if (facep->getTextureEntry()->getBumpmap())
+ { //bump maps aren't worked into texture batching yet
+ return false;
+ }
+
+ if (facep->getTexture() && facep->getTexture()->getPrimaryFormat() == GL_ALPHA)
+ { //can't batch invisiprims
+ return false;
+ }
+
+ if (facep->isState(LLFace::TEXTURE_ANIM) && facep->getVirtualSize() > MIN_TEX_ANIM_SIZE)
+ { //texture animation breaks batches
+ return false;
+ }
+
+ return true;
+}
+
void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep, U32 type)
{
LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
@@ -3236,7 +3920,7 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
(type == LLRenderPass::PASS_INVISIBLE) ||
(type == LLRenderPass::PASS_ALPHA && facep->isState(LLFace::FULLBRIGHT));
- if (!fullbright && type != LLRenderPass::PASS_GLOW && !facep->mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_NORMAL))
+ if (!fullbright && type != LLRenderPass::PASS_GLOW && !facep->getVertexBuffer()->hasDataType(LLVertexBuffer::TYPE_NORMAL))
{
llwarns << "Non fullbright face has no normals!" << llendl;
return;
@@ -3258,29 +3942,48 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
else
{
model_mat = &(drawable->getRegion()->mRenderMatrix);
+ if (model_mat->isIdentity())
+ {
+ model_mat = NULL;
+ }
}
-
U8 bump = (type == LLRenderPass::PASS_BUMP || type == LLRenderPass::PASS_POST_BUMP) ? facep->getTextureEntry()->getBumpmap() : 0;
LLViewerTexture* tex = facep->getTexture();
- U8 glow = (U8) (facep->getTextureEntry()->getGlow() * 255);
+ U8 index = facep->getTextureIndex();
- if (facep->mVertexBuffer.isNull())
+ bool batchable = false;
+
+ if (index < 255 && idx >= 0)
{
- llerrs << "WTF?" << llendl;
+ if (index < draw_vec[idx]->mTextureList.size())
+ {
+ if (draw_vec[idx]->mTextureList[index].isNull())
+ {
+ batchable = true;
+ draw_vec[idx]->mTextureList[index] = tex;
+ }
+ else if (draw_vec[idx]->mTextureList[index] == tex)
+ { //this face's texture index can be used with this batch
+ batchable = true;
+ }
+ }
+ else
+ { //texture list can be expanded to fit this texture index
+ batchable = true;
+ }
}
-
+
if (idx >= 0 &&
- draw_vec[idx]->mVertexBuffer == facep->mVertexBuffer &&
+ draw_vec[idx]->mVertexBuffer == facep->getVertexBuffer() &&
draw_vec[idx]->mEnd == facep->getGeomIndex()-1 &&
- (LLPipeline::sTextureBindTest || draw_vec[idx]->mTexture == tex) &&
+ (LLPipeline::sTextureBindTest || draw_vec[idx]->mTexture == tex || batchable) &&
#if LL_DARWIN
draw_vec[idx]->mEnd - draw_vec[idx]->mStart + facep->getGeomCount() <= (U32) gGLManager.mGLMaxVertexRange &&
draw_vec[idx]->mCount + facep->getIndicesCount() <= (U32) gGLManager.mGLMaxIndexRange &&
#endif
- draw_vec[idx]->mGlowColor.mV[3] == glow &&
draw_vec[idx]->mFullbright == fullbright &&
draw_vec[idx]->mBump == bump &&
draw_vec[idx]->mTextureMatrix == tex_mat &&
@@ -3289,7 +3992,13 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
draw_vec[idx]->mCount += facep->getIndicesCount();
draw_vec[idx]->mEnd += facep->getGeomCount();
draw_vec[idx]->mVSize = llmax(draw_vec[idx]->mVSize, facep->getVirtualSize());
- validate_draw_info(*draw_vec[idx]);
+
+ if (index >= draw_vec[idx]->mTextureList.size())
+ {
+ draw_vec[idx]->mTextureList.resize(index+1);
+ draw_vec[idx]->mTextureList[index] = tex;
+ }
+ draw_vec[idx]->validate();
update_min_max(draw_vec[idx]->mExtents[0], draw_vec[idx]->mExtents[1], facep->mExtents[0]);
update_min_max(draw_vec[idx]->mExtents[0], draw_vec[idx]->mExtents[1], facep->mExtents[1]);
}
@@ -3300,25 +4009,30 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
U32 offset = facep->getIndicesStart();
U32 count = facep->getIndicesCount();
LLPointer<LLDrawInfo> draw_info = new LLDrawInfo(start,end,count,offset, tex,
- facep->mVertexBuffer, fullbright, bump);
+ facep->getVertexBuffer(), fullbright, bump);
draw_info->mGroup = group;
draw_info->mVSize = facep->getVirtualSize();
draw_vec.push_back(draw_info);
draw_info->mTextureMatrix = tex_mat;
draw_info->mModelMatrix = model_mat;
- draw_info->mGlowColor.setVec(0,0,0,glow);
if (type == LLRenderPass::PASS_ALPHA)
{ //for alpha sorting
facep->setDrawInfo(draw_info);
}
draw_info->mExtents[0] = facep->mExtents[0];
draw_info->mExtents[1] = facep->mExtents[1];
- validate_draw_info(*draw_info);
if (LLPipeline::sUseTriStrips)
{
draw_info->mDrawMode = LLRender::TRIANGLE_STRIP;
}
+
+ if (index < 255)
+ { //initialize texture list for texture batching
+ draw_info->mTextureList.resize(index+1);
+ draw_info->mTextureList[index] = tex;
+ }
+ draw_info->validate();
}
}
@@ -3330,6 +4044,32 @@ void LLVolumeGeometryManager::getGeometry(LLSpatialGroup* group)
static LLFastTimer::DeclareTimer FTM_REBUILD_VOLUME_VB("Volume");
static LLFastTimer::DeclareTimer FTM_REBUILD_VBO("VBO Rebuilt");
+static LLDrawPoolAvatar* get_avatar_drawpool(LLViewerObject* vobj)
+{
+ LLVOAvatar* avatar = vobj->getAvatar();
+
+ if (avatar)
+ {
+ LLDrawable* drawable = avatar->mDrawable;
+ if (drawable && drawable->getNumFaces() > 0)
+ {
+ LLFace* face = drawable->getFace(0);
+ if (face)
+ {
+ LLDrawPool* drawpool = face->getPool();
+ if (drawpool)
+ {
+ if (drawpool->getType() == LLDrawPool::POOL_AVATAR)
+ {
+ return (LLDrawPoolAvatar*) drawpool;
+ }
+ }
+ }
+ }
+ }
+
+ return NULL;
+}
void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
{
@@ -3357,6 +4097,32 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
LLFastTimer ftm2(FTM_REBUILD_VOLUME_VB);
+ LLVOAvatar* pAvatarVO = NULL;
+
+ LLSpatialBridge* bridge = group->mSpatialPartition->asBridge();
+ if (bridge)
+ {
+ if (bridge->mAvatar.isNull())
+ {
+ LLViewerObject* vobj = bridge->mDrawable->getVObj();
+ if (vobj)
+ {
+ bridge->mAvatar = vobj->getAvatar();
+ }
+ }
+
+ pAvatarVO = bridge->mAvatar;
+ }
+
+ if (pAvatarVO)
+ {
+ pAvatarVO->mAttachmentGeometryBytes -= group->mGeometryBytes;
+ pAvatarVO->mAttachmentSurfaceArea -= group->mSurfaceArea;
+ }
+
+ group->mGeometryBytes = 0;
+ group->mSurfaceArea = 0;
+
group->clearDrawMap();
mFaceList.clear();
@@ -3368,12 +4134,14 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
std::vector<LLFace*> alpha_faces;
U32 useage = group->mSpatialPartition->mBufferUsage;
- U32 max_vertices = (gSavedSettings.getS32("RenderMaxVBOSize")*1024)/LLVertexBuffer::calcStride(group->mSpatialPartition->mVertexDataMask);
- U32 max_total = (gSavedSettings.getS32("RenderMaxNodeSize")*1024)/LLVertexBuffer::calcStride(group->mSpatialPartition->mVertexDataMask);
+ U32 max_vertices = (gSavedSettings.getS32("RenderMaxVBOSize")*1024)/LLVertexBuffer::calcVertexSize(group->mSpatialPartition->mVertexDataMask);
+ U32 max_total = (gSavedSettings.getS32("RenderMaxNodeSize")*1024)/LLVertexBuffer::calcVertexSize(group->mSpatialPartition->mVertexDataMask);
max_vertices = llmin(max_vertices, (U32) 65535);
U32 cur_total = 0;
+ bool emissive = false;
+
//get all the faces into a list
for (LLSpatialGroup::element_iter drawable_iter = group->getData().begin(); drawable_iter != group->getData().end(); ++drawable_iter)
{
@@ -3390,33 +4158,235 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
}
LLVOVolume* vobj = drawablep->getVOVolume();
+
+ if (!vobj)
+ {
+ continue;
+ }
+
+ if (vobj->isMesh() &&
+ (vobj->getVolume() && !vobj->getVolume()->isMeshAssetLoaded() || !gMeshRepo.meshRezEnabled()))
+ {
+ continue;
+ }
+
+ LLVolume* volume = vobj->getVolume();
+ if (volume)
+ {
+ const LLVector3& scale = vobj->getScale();
+ group->mSurfaceArea += volume->getSurfaceArea() * llmax(llmax(scale.mV[0], scale.mV[1]), scale.mV[2]);
+ }
+
llassert_always(vobj);
- vobj->updateTextureVirtualSize();
+ vobj->updateTextureVirtualSize(true);
vobj->preRebuild();
drawablep->clearState(LLDrawable::HAS_ALPHA);
+ bool rigged = vobj->isAttachment() &&
+ vobj->isMesh() &&
+ gMeshRepo.getSkinInfo(vobj->getVolume()->getParams().getSculptID(), vobj);
+
+ bool bake_sunlight = LLPipeline::sBakeSunlight && drawablep->isStatic();
+
+ bool is_rigged = false;
+
//for each face
for (S32 i = 0; i < drawablep->getNumFaces(); i++)
{
+ LLFace* facep = drawablep->getFace(i);
+
+ //ALWAYS null out vertex buffer on rebuild -- if the face lands in a render
+ // batch, it will recover its vertex buffer reference from the spatial group
+ facep->setVertexBuffer(NULL);
+
//sum up face verts and indices
drawablep->updateFaceSize(i);
- LLFace* facep = drawablep->getFace(i);
+
+
+
+ if (rigged)
+ {
+ if (!facep->isState(LLFace::RIGGED))
+ { //completely reset vertex buffer
+ facep->clearVertexBuffer();
+ }
+
+ facep->setState(LLFace::RIGGED);
+ is_rigged = true;
+
+ //get drawpool of avatar with rigged face
+ LLDrawPoolAvatar* pool = get_avatar_drawpool(vobj);
+
+ //Determine if we've received skininfo that contains an
+ //alternate bind matrix - if it does then apply the translational component
+ //to the joints of the avatar.
+ bool pelvisGotSet = false;
+
+ if ( pAvatarVO )
+ {
+ LLUUID currentId = vobj->getVolume()->getParams().getSculptID();
+ const LLMeshSkinInfo* pSkinData = gMeshRepo.getSkinInfo( currentId, vobj );
+
+ if ( pSkinData )
+ {
+ const int bindCnt = pSkinData->mAlternateBindMatrix.size();
+ if ( bindCnt > 0 )
+ {
+ const int jointCnt = pSkinData->mJointNames.size();
+ const F32 pelvisZOffset = pSkinData->mPelvisOffset;
+ bool fullRig = (jointCnt>=20) ? true : false;
+ if ( fullRig )
+ {
+ for ( int i=0; i<jointCnt; ++i )
+ {
+ std::string lookingForJoint = pSkinData->mJointNames[i].c_str();
+ //llinfos<<"joint name "<<lookingForJoint.c_str()<<llendl;
+ LLJoint* pJoint = pAvatarVO->getJoint( lookingForJoint );
+ if ( pJoint && pJoint->getId() != currentId )
+ {
+ pJoint->setId( currentId );
+ const LLVector3& jointPos = pSkinData->mAlternateBindMatrix[i].getTranslation();
+ //Set the joint position
+ pJoint->storeCurrentXform( jointPos );
+ //If joint is a pelvis then handle old/new pelvis to foot values
+ if ( lookingForJoint == "mPelvis" )
+ {
+ pJoint->storeCurrentXform( jointPos );
+ if ( !pAvatarVO->hasPelvisOffset() )
+ {
+ pAvatarVO->setPelvisOffset( true, jointPos, pelvisZOffset );
+ //Trigger to rebuild viewer AV
+ pelvisGotSet = true;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ //If we've set the pelvis to a new position we need to also rebuild some information that the
+ //viewer does at launch (e.g. body size etc.)
+ if ( pelvisGotSet )
+ {
+ pAvatarVO->postPelvisSetRecalc();
+ }
+
+ if (pool)
+ {
+ const LLTextureEntry* te = facep->getTextureEntry();
+
+ //remove face from old pool if it exists
+ LLDrawPool* old_pool = facep->getPool();
+ if (old_pool && old_pool->getType() == LLDrawPool::POOL_AVATAR)
+ {
+ ((LLDrawPoolAvatar*) old_pool)->removeRiggedFace(facep);
+ }
+
+ //add face to new pool
+ LLViewerTexture* tex = facep->getTexture();
+ U32 type = gPipeline.getPoolTypeFromTE(te, tex);
+
+ if (type == LLDrawPool::POOL_ALPHA)
+ {
+ if (te->getColor().mV[3] > 0.f)
+ {
+ if (te->getFullbright())
+ {
+ pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_FULLBRIGHT_ALPHA);
+ }
+ else
+ {
+ pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_ALPHA);
+ }
+ }
+ }
+ else if (te->getShiny())
+ {
+ if (te->getFullbright())
+ {
+ pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_FULLBRIGHT_SHINY);
+ }
+ else
+ {
+ if (LLPipeline::sRenderDeferred)
+ {
+ pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_SIMPLE);
+ }
+ else
+ {
+ pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_SHINY);
+ }
+ }
+ }
+ else
+ {
+ if (te->getFullbright())
+ {
+ pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_FULLBRIGHT);
+ }
+ else
+ {
+ pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_SIMPLE);
+ }
+ }
+
+ if (te->getGlow())
+ {
+ pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_GLOW);
+ }
+
+ if (LLPipeline::sRenderDeferred)
+ {
+ if (type != LLDrawPool::POOL_ALPHA && !te->getFullbright())
+ {
+ if (te->getBumpmap())
+ {
+ pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_DEFERRED_BUMP);
+ }
+ else
+ {
+ pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_DEFERRED_SIMPLE);
+ }
+ }
+ }
+ }
+
+ continue;
+ }
+ else
+ {
+ if (facep->isState(LLFace::RIGGED))
+ { //face is not rigged but used to be, remove from rigged face pool
+ LLDrawPoolAvatar* pool = (LLDrawPoolAvatar*) facep->getPool();
+ if (pool)
+ {
+ pool->removeRiggedFace(facep);
+ }
+ facep->clearState(LLFace::RIGGED);
+ }
+ }
+
if (cur_total > max_total || facep->getIndicesCount() <= 0 || facep->getGeomCount() <= 0)
{
- facep->mVertexBuffer = NULL;
- facep->mLastVertexBuffer = NULL;
+ facep->clearVertexBuffer();
continue;
}
cur_total += facep->getGeomCount();
- if (facep->hasGeometry() && facep->mPixelArea > FORCE_CULL_AREA)
+ if (facep->hasGeometry() && facep->getPixelArea() > FORCE_CULL_AREA)
{
const LLTextureEntry* te = facep->getTextureEntry();
LLViewerTexture* tex = facep->getTexture();
+ if (te->getGlow() >= 1.f/255.f)
+ {
+ emissive = true;
+ }
+
if (facep->isState(LLFace::TEXTURE_ANIM))
{
if (!vobj->mTexAnimMode)
@@ -3425,7 +4395,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
}
}
- BOOL force_simple = (facep->mPixelArea < FORCE_SIMPLE_RENDER_AREA);
+ BOOL force_simple = (facep->getPixelArea() < FORCE_SIMPLE_RENDER_AREA);
U32 type = gPipeline.getPoolTypeFromTE(te, tex);
if (type != LLDrawPool::POOL_ALPHA && force_simple)
{
@@ -3462,7 +4432,10 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
}
else
{
- drawablep->setState(LLDrawable::HAS_ALPHA);
+ if (te->getColor().mV[3] > 0.f)
+ { //only treat as alpha in the pipeline if < 100% transparent
+ drawablep->setState(LLDrawable::HAS_ALPHA);
+ }
alpha_faces.push_back(facep);
}
}
@@ -3497,7 +4470,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
bump_faces.push_back(facep);
}
else if ((te->getShiny() && LLPipeline::sRenderBump) ||
- !te->getFullbright())
+ !(te->getFullbright() || bake_sunlight))
{ //needs normal
simple_faces.push_back(facep);
}
@@ -3511,10 +4484,18 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
}
else
{ //face has no renderable geometry
- facep->mVertexBuffer = NULL;
- facep->mLastVertexBuffer = NULL;
+ facep->clearVertexBuffer();
}
}
+
+ if (is_rigged)
+ {
+ drawablep->setState(LLDrawable::RIGGED);
+ }
+ else
+ {
+ drawablep->clearState(LLDrawable::RIGGED);
+ }
}
group->mBufferUsage = useage;
@@ -3525,15 +4506,32 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
U32 bump_mask = LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_TEXCOORD1 | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_COLOR;
U32 fullbright_mask = LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_COLOR;
- if (LLPipeline::sRenderDeferred)
+ if (emissive)
+ { //emissive faces are present, include emissive byte to preserve batching
+ simple_mask = simple_mask | LLVertexBuffer::MAP_EMISSIVE;
+ alpha_mask = alpha_mask | LLVertexBuffer::MAP_EMISSIVE;
+ bump_mask = bump_mask | LLVertexBuffer::MAP_EMISSIVE;
+ fullbright_mask = fullbright_mask | LLVertexBuffer::MAP_EMISSIVE;
+ }
+
+ bool batch_textures = LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_OBJECT) > 1;
+
+ if (batch_textures)
{
bump_mask |= LLVertexBuffer::MAP_BINORMAL;
+ genDrawInfo(group, simple_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, simple_faces, FALSE, TRUE);
+ genDrawInfo(group, fullbright_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, fullbright_faces, FALSE, TRUE);
+ genDrawInfo(group, bump_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, bump_faces, FALSE, TRUE);
+ genDrawInfo(group, alpha_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, alpha_faces, TRUE, TRUE);
}
-
- genDrawInfo(group, simple_mask, simple_faces);
- genDrawInfo(group, bump_mask, bump_faces);
- genDrawInfo(group, fullbright_mask, fullbright_faces);
- genDrawInfo(group, alpha_mask, alpha_faces, TRUE);
+ else
+ {
+ genDrawInfo(group, simple_mask, simple_faces);
+ genDrawInfo(group, fullbright_mask, fullbright_faces);
+ genDrawInfo(group, bump_mask, bump_faces, FALSE, TRUE);
+ genDrawInfo(group, alpha_mask, alpha_faces, TRUE);
+ }
+
if (!LLPipeline::sDelayVBUpdate)
{
@@ -3555,6 +4553,12 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
}
mFaceList.clear();
+
+ if (pAvatarVO)
+ {
+ pAvatarVO->mAttachmentGeometryBytes += group->mGeometryBytes;
+ pAvatarVO->mAttachmentSurfaceArea += group->mSurfaceArea;
+ }
}
static LLFastTimer::DeclareTimer FTM_VOLUME_GEOM("Volume Geometry");
@@ -3570,59 +4574,53 @@ void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group)
group->mBuilt = 1.f;
+ std::set<LLVertexBuffer*> mapped_buffers;
+
for (LLSpatialGroup::element_iter drawable_iter = group->getData().begin(); drawable_iter != group->getData().end(); ++drawable_iter)
{
LLFastTimer t(FTM_VOLUME_GEOM_PARTIAL);
LLDrawable* drawablep = *drawable_iter;
- if (drawablep->isDead() || drawablep->isState(LLDrawable::FORCE_INVISIBLE) )
- {
- continue;
- }
-
- if (drawablep->isState(LLDrawable::REBUILD_ALL))
+ if (!drawablep->isDead() && drawablep->isState(LLDrawable::REBUILD_ALL) )
{
LLVOVolume* vobj = drawablep->getVOVolume();
vobj->preRebuild();
+
LLVolume* volume = vobj->getVolume();
for (S32 i = 0; i < drawablep->getNumFaces(); ++i)
{
LLFace* face = drawablep->getFace(i);
- if (face && face->mVertexBuffer.notNull())
+ if (face)
{
- face->getGeometryVolume(*volume, face->getTEOffset(),
- vobj->getRelativeXform(), vobj->getRelativeXformInvTrans(), face->getGeomIndex());
+ LLVertexBuffer* buff = face->getVertexBuffer();
+ if (buff)
+ {
+ face->getGeometryVolume(*volume, face->getTEOffset(),
+ vobj->getRelativeXform(), vobj->getRelativeXformInvTrans(), face->getGeomIndex());
+
+ if (buff->isLocked())
+ {
+ mapped_buffers.insert(buff);
+ }
+ }
}
}
-
+
drawablep->clearState(LLDrawable::REBUILD_ALL);
}
}
- //unmap all the buffers
- for (LLSpatialGroup::buffer_map_t::iterator i = group->mBufferMap.begin(); i != group->mBufferMap.end(); ++i)
+ for (std::set<LLVertexBuffer*>::iterator iter = mapped_buffers.begin(); iter != mapped_buffers.end(); ++iter)
{
- LLSpatialGroup::buffer_texture_map_t& map = i->second;
- for (LLSpatialGroup::buffer_texture_map_t::iterator j = map.begin(); j != map.end(); ++j)
- {
- LLSpatialGroup::buffer_list_t& list = j->second;
- for (LLSpatialGroup::buffer_list_t::iterator k = list.begin(); k != list.end(); ++k)
- {
- LLVertexBuffer* buffer = *k;
- if (buffer->isLocked())
- {
- buffer->setBuffer(0);
- }
- }
- }
+ (*iter)->flush();
}
-
+
// don't forget alpha
if(group != NULL &&
!group->mVertexBuffer.isNull() &&
group->mVertexBuffer->isLocked())
{
- group->mVertexBuffer->setBuffer(0);
+ group->mVertexBuffer->flush();
}
//if not all buffers are unmapped
@@ -3635,9 +4633,10 @@ void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group)
for (S32 i = 0; i < drawablep->getNumFaces(); ++i)
{
LLFace* face = drawablep->getFace(i);
- if (face && face->mVertexBuffer.notNull() && face->mVertexBuffer->isLocked())
+ LLVertexBuffer* buff = face->getVertexBuffer();
+ if (face && buff && buff->isLocked())
{
- face->mVertexBuffer->setBuffer(0) ;
+ buff->flush();
}
}
}
@@ -3646,22 +4645,55 @@ void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group)
group->clearState(LLSpatialGroup::MESH_DIRTY | LLSpatialGroup::NEW_DRAWINFO);
}
- if (group && group->isState(LLSpatialGroup::NEW_DRAWINFO))
+ llassert(!group || !group->isState(LLSpatialGroup::NEW_DRAWINFO));
+}
+
+struct CompareBatchBreakerModified
+{
+ bool operator()(const LLFace* const& lhs, const LLFace* const& rhs)
{
- llerrs << "WTF?" << llendl;
+ const LLTextureEntry* lte = lhs->getTextureEntry();
+ const LLTextureEntry* rte = rhs->getTextureEntry();
+
+ if (lte->getBumpmap() != rte->getBumpmap())
+ {
+ return lte->getBumpmap() < rte->getBumpmap();
+ }
+ else if (lte->getFullbright() != rte->getFullbright())
+ {
+ return lte->getFullbright() < rte->getFullbright();
+ }
+ else
+ {
+ return lhs->getTexture() < rhs->getTexture();
+ }
+
}
-}
+};
-void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::vector<LLFace*>& faces, BOOL distance_sort)
+void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::vector<LLFace*>& faces, BOOL distance_sort, BOOL batch_textures)
{
+ U32 buffer_usage = group->mBufferUsage;
+
+#if LL_DARWIN
+ // HACK from Leslie:
+ // Disable VBO usage for alpha on Mac OS X because it kills the framerate
+ // due to implicit calls to glTexSubImage that are beyond our control.
+ // (this works because the only calls here that sort by distance are alpha)
+ if (distance_sort)
+ {
+ buffer_usage = 0x0;
+ }
+#endif
+
//calculate maximum number of vertices to store in a single buffer
- U32 max_vertices = (gSavedSettings.getS32("RenderMaxVBOSize")*1024)/LLVertexBuffer::calcStride(group->mSpatialPartition->mVertexDataMask);
+ U32 max_vertices = (gSavedSettings.getS32("RenderMaxVBOSize")*1024)/LLVertexBuffer::calcVertexSize(group->mSpatialPartition->mVertexDataMask);
max_vertices = llmin(max_vertices, (U32) 65535);
if (!distance_sort)
{
//sort faces by things that break batches
- std::sort(faces.begin(), faces.end(), LLFace::CompareBatchBreaker());
+ std::sort(faces.begin(), faces.end(), CompareBatchBreakerModified());
}
else
{
@@ -3669,6 +4701,7 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
std::sort(faces.begin(), faces.end(), LLFace::CompareDistanceGreater());
}
+ bool hud_group = group->isHUDGroup() ;
std::vector<LLFace*>::iterator face_iter = faces.begin();
LLSpatialGroup::buffer_map_t buffer_map;
@@ -3681,6 +4714,23 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
buffer_index = -1;
}
+ S32 texture_index_channels = 1;
+
+ if (gGLManager.mGLSLVersionMajor > 1 || gGLManager.mGLSLVersionMinor >= 30)
+ {
+ texture_index_channels = LLGLSLShader::sIndexedTextureChannels-1; //always reserve one for shiny for now just for simplicity;
+ }
+
+ if (LLPipeline::sRenderDeferred && distance_sort)
+ {
+ texture_index_channels = gDeferredAlphaProgram.mFeatures.mIndexedTextureChannels;
+ }
+
+ texture_index_channels = llmin(texture_index_channels, (S32) gSavedSettings.getU32("RenderMaxTextureIndex"));
+
+ //NEVER use more than 16 texture index channels (workaround for prevalent driver bug)
+ texture_index_channels = llmin(texture_index_channels, 16);
+
while (face_iter != faces.end())
{
//pull off next face
@@ -3702,52 +4752,133 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
buffer_index = 0;
}
+ bool bake_sunlight = LLPipeline::sBakeSunlight && facep->getDrawable()->isStatic();
+
U32 index_count = facep->getIndicesCount();
U32 geom_count = facep->getGeomCount();
- //sum up vertices needed for this texture
+ //sum up vertices needed for this render batch
std::vector<LLFace*>::iterator i = face_iter;
++i;
- while (i != faces.end() &&
- (LLPipeline::sTextureBindTest || (distance_sort || (*i)->getTexture() == tex)))
+ std::vector<LLViewerTexture*> texture_list;
+
+ if (batch_textures)
{
- facep = *i;
-
- if (geom_count + facep->getGeomCount() > max_vertices)
- { //cut vertex buffers on geom count too big
- break;
+ U8 cur_tex = 0;
+ facep->setTextureIndex(cur_tex);
+ texture_list.push_back(tex);
+
+ //if (can_batch_texture(facep))
+ {
+ while (i != faces.end())
+ {
+ facep = *i;
+ if (facep->getTexture() != tex)
+ {
+ if (distance_sort)
+ { //textures might be out of order, see if texture exists in current batch
+ bool found = false;
+ for (U32 tex_idx = 0; tex_idx < texture_list.size(); ++tex_idx)
+ {
+ if (facep->getTexture() == texture_list[tex_idx])
+ {
+ cur_tex = tex_idx;
+ found = true;
+ break;
+ }
+ }
+
+ if (!found)
+ {
+ cur_tex = texture_list.size();
+ }
+ }
+ else
+ {
+ cur_tex++;
+ }
+
+ if (!can_batch_texture(facep))
+ { //face is bump mapped or has an animated texture matrix -- can't
+ //batch more than 1 texture at a time
+ break;
+ }
+
+ if (cur_tex >= texture_index_channels)
+ { //cut batches when index channels are depleted
+ break;
+ }
+
+ tex = facep->getTexture();
+
+ texture_list.push_back(tex);
+ }
+
+ if (geom_count + facep->getGeomCount() > max_vertices)
+ { //cut batches on geom count too big
+ break;
+ }
+
+ ++i;
+ index_count += facep->getIndicesCount();
+ geom_count += facep->getGeomCount();
+
+ facep->setTextureIndex(cur_tex);
+ }
}
- ++i;
- index_count += facep->getIndicesCount();
- geom_count += facep->getGeomCount();
+ tex = texture_list[0];
+ }
+ else
+ {
+ while (i != faces.end() &&
+ (LLPipeline::sTextureBindTest || (distance_sort || (*i)->getTexture() == tex)))
+ {
+ facep = *i;
+
+
+ //face has no texture index
+ facep->mDrawInfo = NULL;
+ facep->setTextureIndex(255);
+
+ if (geom_count + facep->getGeomCount() > max_vertices)
+ { //cut batches on geom count too big
+ break;
+ }
+
+ ++i;
+ index_count += facep->getIndicesCount();
+ geom_count += facep->getGeomCount();
+ }
}
//create/delete/resize vertex buffer if needed
LLVertexBuffer* buffer = NULL;
- LLSpatialGroup::buffer_texture_map_t::iterator found_iter = group->mBufferMap[mask].find(tex);
+
+ { //try to find a buffer to reuse
+ LLSpatialGroup::buffer_texture_map_t::iterator found_iter = group->mBufferMap[mask].find(*face_iter);
- if (found_iter != group->mBufferMap[mask].end())
- {
- if ((U32) buffer_index < found_iter->second.size())
+ if (found_iter != group->mBufferMap[mask].end())
{
- buffer = found_iter->second[buffer_index];
+ if ((U32) buffer_index < found_iter->second.size())
+ {
+ buffer = found_iter->second[buffer_index];
+ }
}
}
- if (!buffer)
+ if (!buffer || !buffer->isWriteable())
{ //create new buffer if needed
- buffer = createVertexBuffer(mask,
- group->mBufferUsage);
+ buffer = createVertexBuffer(mask, buffer_usage);
buffer->allocateBuffer(geom_count, index_count, TRUE);
}
else
- {
- if (LLVertexBuffer::sEnableVBOs && buffer->getUsage() != group->mBufferUsage)
+ { //resize pre-existing buffer
+ if (LLVertexBuffer::sEnableVBOs && buffer->getUsage() != buffer_usage ||
+ buffer->getTypeMask() != mask)
{
- buffer = createVertexBuffer(group->mSpatialPartition->mVertexDataMask,
- group->mBufferUsage);
+ buffer = createVertexBuffer(mask, buffer_usage);
buffer->allocateBuffer(geom_count, index_count, TRUE);
}
else
@@ -3756,7 +4887,10 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
}
}
- buffer_map[mask][tex].push_back(buffer);
+ group->mGeometryBytes += buffer->getSize() + buffer->getIndicesSize();
+
+
+ buffer_map[mask][*face_iter].push_back(buffer);
//add face geometry
@@ -3764,50 +4898,67 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
U16 index_offset = 0;
while (face_iter < i)
- {
+ { //update face indices for new buffer
facep = *face_iter;
- facep->mIndicesIndex = indices_index;
- facep->mGeomIndex = index_offset;
- facep->mVertexBuffer = buffer;
+ facep->setIndicesIndex(indices_index);
+ facep->setGeomIndex(index_offset);
+ facep->setVertexBuffer(buffer);
+
+ if (batch_textures && facep->getTextureIndex() == 255)
+ {
+ llerrs << "Invalid texture index." << llendl;
+ }
+
{
+ //for debugging, set last time face was updated vs moved
facep->updateRebuildFlags();
+
if (!LLPipeline::sDelayVBUpdate)
- {
+ { //copy face geometry into vertex buffer
LLDrawable* drawablep = facep->getDrawable();
LLVOVolume* vobj = drawablep->getVOVolume();
LLVolume* volume = vobj->getVolume();
U32 te_idx = facep->getTEOffset();
- if (facep->getGeometryVolume(*volume, te_idx,
- vobj->getRelativeXform(), vobj->getRelativeXformInvTrans(), index_offset))
- {
- buffer->markDirty(facep->getGeomIndex(), facep->getGeomCount(),
- facep->getIndicesStart(), facep->getIndicesCount());
- }
+ facep->getGeometryVolume(*volume, te_idx,
+ vobj->getRelativeXform(), vobj->getRelativeXformInvTrans(), index_offset);
}
}
index_offset += facep->getGeomCount();
- indices_index += facep->mIndicesCount;
+ indices_index += facep->getIndicesCount();
- BOOL force_simple = facep->mPixelArea < FORCE_SIMPLE_RENDER_AREA;
+
+ //append face to appropriate render batch
+
+ BOOL force_simple = facep->getPixelArea() < FORCE_SIMPLE_RENDER_AREA;
BOOL fullbright = facep->isState(LLFace::FULLBRIGHT);
if ((mask & LLVertexBuffer::MAP_NORMAL) == 0)
{ //paranoia check to make sure GL doesn't try to read non-existant normals
fullbright = TRUE;
}
+ if (hud_group)
+ { //all hud attachments are fullbright
+ fullbright = TRUE;
+ }
+
const LLTextureEntry* te = facep->getTextureEntry();
+ tex = facep->getTexture();
BOOL is_alpha = (facep->getPoolType() == LLDrawPool::POOL_ALPHA) ? TRUE : FALSE;
if (is_alpha)
{
// can we safely treat this as an alpha mask?
- if (facep->canRenderAsMask())
+ if (facep->getFaceColor().mV[3] <= 0.f)
+ { //100% transparent, don't render unless we're highlighting transparent
+ registerFace(group, facep, LLRenderPass::PASS_ALPHA_INVISIBLE);
+ }
+ else if (facep->canRenderAsMask())
{
- if (te->getFullbright())
+ if (te->getFullbright() || LLPipeline::sNoAlpha)
{
registerFace(group, facep, LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK);
}
@@ -3820,14 +4971,8 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
{
registerFace(group, facep, LLRenderPass::PASS_ALPHA);
}
-
- if (LLPipeline::sRenderDeferred)
- {
- registerFace(group, facep, LLRenderPass::PASS_ALPHA_SHADOW);
- }
}
else if (gPipeline.canUseVertexShaders()
- && group->mSpatialPartition->mPartitionType != LLViewerRegion::PARTITION_HUD
&& LLPipeline::sRenderBump
&& te->getShiny())
{ //shiny
@@ -3836,7 +4981,7 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
registerFace(group, facep, LLRenderPass::PASS_INVISI_SHINY);
registerFace(group, facep, LLRenderPass::PASS_INVISIBLE);
}
- else if (LLPipeline::sRenderDeferred)
+ else if (LLPipeline::sRenderDeferred && !hud_group)
{ //deferred rendering
if (te->getFullbright())
{ //register in post deferred fullbright shiny pass
@@ -3871,10 +5016,10 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
{ //invisiprim
registerFace(group, facep, LLRenderPass::PASS_INVISIBLE);
}
- else if (fullbright)
+ else if (fullbright || bake_sunlight)
{ //fullbright
registerFace(group, facep, LLRenderPass::PASS_FULLBRIGHT);
- if (LLPipeline::sRenderDeferred && LLPipeline::sRenderBump && te->getBumpmap())
+ if (LLPipeline::sRenderDeferred && !hud_group && LLPipeline::sRenderBump && te->getBumpmap())
{ //if this is the deferred render and a bump map is present, register in post deferred bump
registerFace(group, facep, LLRenderPass::PASS_POST_BUMP);
}
@@ -3892,15 +5037,18 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
}
}
- //not sure why this is here -- shiny HUD attachments maybe? -- davep 5/11/2010
- if (!is_alpha && te->getShiny() && LLPipeline::sRenderBump)
- {
+
+ if (!gPipeline.canUseVertexShaders() &&
+ !is_alpha &&
+ te->getShiny() &&
+ LLPipeline::sRenderBump)
+ { //shiny as an extra pass when shaders are disabled
registerFace(group, facep, LLRenderPass::PASS_SHINY);
}
}
//not sure why this is here, and looks like it might cause bump mapped objects to get rendered redundantly -- davep 5/11/2010
- if (!is_alpha && !LLPipeline::sRenderDeferred)
+ if (!is_alpha && (hud_group || !LLPipeline::sRenderDeferred))
{
llassert((mask & LLVertexBuffer::MAP_NORMAL) || fullbright);
facep->setPoolType((fullbright) ? LLDrawPool::POOL_FULLBRIGHT : LLDrawPool::POOL_SIMPLE);
@@ -3919,7 +5067,7 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
++face_iter;
}
- buffer->setBuffer(0);
+ buffer->flush();
}
group->mBufferMap[mask].clear();
@@ -3958,18 +5106,17 @@ void LLGeometryManager::addGeometryCount(LLSpatialGroup* group, U32 &vertex_coun
//sum up face verts and indices
drawablep->updateFaceSize(i);
LLFace* facep = drawablep->getFace(i);
- if (facep->hasGeometry() && facep->mPixelArea > FORCE_CULL_AREA)
+ if (facep->hasGeometry() && facep->getPixelArea() > FORCE_CULL_AREA)
{
vertex_count += facep->getGeomCount();
index_count += facep->getIndicesCount();
-
+ llassert(facep->getIndicesCount() < 65536);
//remember face (for sorting)
mFaceList.push_back(facep);
}
else
{
- facep->mVertexBuffer = NULL;
- facep->mLastVertexBuffer = NULL;
+ facep->clearVertexBuffer();
}
}
}
@@ -3985,7 +5132,7 @@ LLHUDPartition::LLHUDPartition()
mLODPeriod = 1;
}
-void LLHUDPartition::shift(const LLVector3 &offset)
+void LLHUDPartition::shift(const LLVector4a &offset)
{
//HUD objects don't shift with region crossing. That would be silly.
}
diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h
index 1e9b9737b1..3cf434dc26 100644
--- a/indra/newview/llvovolume.h
+++ b/indra/newview/llvovolume.h
@@ -40,6 +40,8 @@ class LLDrawPool;
class LLSelectNode;
class LLObjectMediaDataClient;
class LLObjectMediaNavigateClient;
+class LLVOAvatar;
+class LLMeshSkinInfo;
typedef std::vector<viewer_media_t> media_list_t;
@@ -48,6 +50,18 @@ enum LLVolumeInterfaceType
INTERFACE_FLEXIBLE = 1,
};
+
+class LLRiggedVolume : public LLVolume
+{
+public:
+ LLRiggedVolume(const LLVolumeParams& params)
+ : LLVolume(params, 0.f)
+ {
+ }
+
+ void update(const LLMeshSkinInfo* skin, LLVOAvatar* avatar, const LLVolume* src_volume);
+};
+
// Base class for implementations of the volume - Primitive, Flexible Object, etc.
class LLVolumeInterface
{
@@ -60,7 +74,7 @@ public:
virtual void onSetVolume(const LLVolumeParams &volume_params, const S32 detail) = 0;
virtual void onSetScale(const LLVector3 &scale, BOOL damped) = 0;
virtual void onParameterChanged(U16 param_type, LLNetworkData *data, BOOL in_use, bool local_origin) = 0;
- virtual void onShift(const LLVector3 &shift_vector) = 0;
+ virtual void onShift(const LLVector4a &shift_vector) = 0;
virtual bool isVolumeUnique() const = 0; // Do we need a unique LLVolume instance?
virtual bool isVolumeGlobal() const = 0; // Are we in global space?
virtual bool isActive() const = 0; // Is this object currently active?
@@ -102,6 +116,7 @@ public:
void animateTextures();
/*virtual*/ BOOL idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);
+ BOOL isVisible() const ;
/*virtual*/ BOOL isActive() const;
/*virtual*/ BOOL isAttachment() const;
/*virtual*/ BOOL isRootEdit() const; // overridden for sake of attachments treating themselves as a root object
@@ -114,8 +129,13 @@ public:
const LLMatrix4& getRelativeXform() const { return mRelativeXform; }
const LLMatrix3& getRelativeXformInvTrans() const { return mRelativeXformInvTrans; }
/*virtual*/ const LLMatrix4 getRenderMatrix() const;
- U32 getRenderCost(std::set<LLUUID> &textures) const;
+ typedef std::map<LLUUID, S32> texture_cost_t;
+ U32 getRenderCost(texture_cost_t &textures) const;
+ F32 getStreamingCost(S32* bytes, S32* visible_bytes, F32* unscaled_value) const;
+ /*virtual*/ F32 getStreamingCost(S32* bytes = NULL, S32* visible_bytes = NULL) { return getStreamingCost(bytes, visible_bytes, NULL); }
+ /*virtual*/ U32 getTriangleCount(S32* vcount = NULL) const;
+ /*virtual*/ U32 getHighLODTriangleCount();
/*virtual*/ BOOL lineSegmentIntersect(const LLVector3& start, const LLVector3& end,
S32 face = -1, // which face to check, -1 = ALL_SIDES
BOOL pick_transparent = FALSE,
@@ -139,7 +159,7 @@ public:
void markForUpdate(BOOL priority) { LLViewerObject::markForUpdate(priority); mVolumeChanged = TRUE; }
- /*virtual*/ void onShift(const LLVector3 &shift_vector); // Called when the drawable shifts
+ /*virtual*/ void onShift(const LLVector4a &shift_vector); // Called when the drawable shifts
/*virtual*/ void parameterChanged(U16 param_type, bool local_origin);
/*virtual*/ void parameterChanged(U16 param_type, LLNetworkData* data, BOOL in_use, bool local_origin);
@@ -178,19 +198,24 @@ public:
void updateSculptTexture();
void setIndexInTex(S32 index) { mIndexInTex = index ;}
void sculpt();
+ static void rebuildMeshAssetCallback(LLVFS *vfs,
+ const LLUUID& asset_uuid,
+ LLAssetType::EType type,
+ void* user_data, S32 status, LLExtStat ext_status);
+
void updateRelativeXform();
/*virtual*/ BOOL updateGeometry(LLDrawable *drawable);
/*virtual*/ void updateFaceSize(S32 idx);
/*virtual*/ BOOL updateLOD();
void updateRadius();
/*virtual*/ void updateTextures();
- void updateTextureVirtualSize();
+ void updateTextureVirtualSize(bool forced = false);
void updateFaceFlags();
void regenFaces();
BOOL genBBoxes(BOOL force_global);
void preRebuild();
- virtual void updateSpatialExtents(LLVector3& min, LLVector3& max);
+ virtual void updateSpatialExtents(LLVector4a& min, LLVector4a& max);
virtual F32 getBinRadius();
virtual U32 getPartitionType() const;
@@ -224,6 +249,7 @@ public:
U32 getVolumeInterfaceID() const;
virtual BOOL isFlexible() const;
virtual BOOL isSculpted() const;
+ virtual BOOL isMesh() const;
virtual BOOL hasLightTexture() const;
BOOL isVolumeGlobal() const;
@@ -248,6 +274,7 @@ public:
void mediaNavigated(LLViewerMediaImpl *impl, LLPluginClassMedia* plugin, std::string new_location);
void mediaEvent(LLViewerMediaImpl *impl, LLPluginClassMedia* plugin, LLViewerMediaObserver::EMediaEvent event);
+
// Sync the given media data with the impl and the given te
void syncMediaData(S32 te, const LLSD &media_data, bool merge, bool ignore_agent);
@@ -263,9 +290,11 @@ public:
LLVector3 getApproximateFaceNormal(U8 face_id);
+ void notifyMeshLoaded();
+
// Returns 'true' iff the media data for this object is in flight
bool isMediaDataBeingFetched() const;
-
+
// Returns the "last fetched" media version, or -1 if not fetched yet
S32 getLastFetchedMediaVersion() const { return mLastFetchedMediaVersion; }
@@ -273,17 +302,40 @@ public:
void removeMDCImpl() { --mMDCImplCount; }
S32 getMDCImplCount() { return mMDCImplCount; }
+
+ //rigged volume update (for raycasting)
+ void updateRiggedVolume();
+ LLRiggedVolume* getRiggedVolume();
+
+ //returns true if volume should be treated as a rigged volume
+ // - Build tools are open
+ // - object is an attachment
+ // - object is attached to self
+ // - object is rendered as rigged
+ bool treatAsRigged();
+
+ //clear out rigged volume and revert back to non-rigged state for picking/LOD/distance updates
+ void clearRiggedVolume();
+
protected:
S32 computeLODDetail(F32 distance, F32 radius);
BOOL calcLOD();
LLFace* addFace(S32 face_index);
void updateTEData();
+ // stats tracking for render complexity
+ static S32 mRenderComplexity_last;
+ static S32 mRenderComplexity_current;
+
void requestMediaDataUpdate(bool isNew);
void cleanUpMediaImpls();
void addMediaImpl(LLViewerMediaImpl* media_impl, S32 texture_index) ;
void removeMediaImpl(S32 texture_index) ;
public:
+
+ static S32 getRenderComplexityMax() {return mRenderComplexity_last;}
+ static void updateRenderComplexity();
+
LLViewerTextureAnim *mTextureAnimp;
U8 mTexAnimMode;
private:
@@ -306,6 +358,9 @@ private:
S32 mLastFetchedMediaVersion; // as fetched from the server, starts as -1
S32 mIndexInTex;
S32 mMDCImplCount;
+
+ LLPointer<LLRiggedVolume> mRiggedVolume;
+
// statics
public:
static F32 sLODSlopDistanceFactor;// Changing this to zero, effectively disables the LOD transition slop
@@ -315,8 +370,6 @@ public:
static LLPointer<LLObjectMediaDataClient> sObjectMediaClient;
static LLPointer<LLObjectMediaNavigateClient> sObjectMediaNavigateClient;
- static const U32 ARC_TEXTURE_COST = 5;
-
protected:
static S32 sNumLODChanges;
diff --git a/indra/newview/llvowater.cpp b/indra/newview/llvowater.cpp
index 71f08ec36d..cd78157944 100644
--- a/indra/newview/llvowater.cpp
+++ b/indra/newview/llvowater.cpp
@@ -160,22 +160,24 @@ BOOL LLVOWater::updateGeometry(LLDrawable *drawable)
static const unsigned int vertices_per_quad = 4;
static const unsigned int indices_per_quad = 6;
- const S32 size = gSavedSettings.getBOOL("RenderTransparentWater") ? 16 : 1;
+ const S32 size = gSavedSettings.getBOOL("RenderTransparentWater") && LLGLSLShader::sNoFixedFunction ? 16 : 1;
const S32 num_quads = size * size;
face->setSize(vertices_per_quad * num_quads,
indices_per_quad * num_quads);
- if (face->mVertexBuffer.isNull())
+ LLVertexBuffer* buff = face->getVertexBuffer();
+ if (!buff || !buff->isWriteable())
{
- face->mVertexBuffer = new LLVertexBuffer(LLDrawPoolWater::VERTEX_DATA_MASK, GL_DYNAMIC_DRAW_ARB);
- face->mVertexBuffer->allocateBuffer(face->getGeomCount(), face->getIndicesCount(), TRUE);
+ buff = new LLVertexBuffer(LLDrawPoolWater::VERTEX_DATA_MASK, GL_DYNAMIC_DRAW_ARB);
+ buff->allocateBuffer(face->getGeomCount(), face->getIndicesCount(), TRUE);
face->setIndicesIndex(0);
face->setGeomIndex(0);
+ face->setVertexBuffer(buff);
}
else
{
- face->mVertexBuffer->resizeBuffer(face->getGeomCount(), face->getIndicesCount());
+ buff->resizeBuffer(face->getGeomCount(), face->getIndicesCount());
}
index_offset = face->getGeometry(verticesp,normalsp,texCoordsp, indicesp);
@@ -195,6 +197,13 @@ BOOL LLVOWater::updateGeometry(LLDrawable *drawable)
F32 size_inv = 1.f / size;
+ F32 z_fudge = 0.f;
+
+ if (getIsEdgePatch())
+ { //bump edge patches down 10 cm to prevent aliasing along edges
+ z_fudge = -0.1f;
+ }
+
for (y = 0; y < size; y++)
{
for (x = 0; x < size; x++)
@@ -203,6 +212,7 @@ BOOL LLVOWater::updateGeometry(LLDrawable *drawable)
position_agent = getPositionAgent() - getScale() * 0.5f;
position_agent.mV[VX] += (x + 0.5f) * step_x;
position_agent.mV[VY] += (y + 0.5f) * step_y;
+ position_agent.mV[VZ] += z_fudge;
*verticesp++ = position_agent - right + up;
*verticesp++ = position_agent - right - up;
@@ -229,7 +239,7 @@ BOOL LLVOWater::updateGeometry(LLDrawable *drawable)
}
}
- face->mVertexBuffer->setBuffer(0);
+ buff->flush();
mDrawable->movePartition();
LLPipeline::sCompiles++;
@@ -261,19 +271,30 @@ void LLVOWater::setIsEdgePatch(const BOOL edge_patch)
mIsEdgePatch = edge_patch;
}
-void LLVOWater::updateSpatialExtents(LLVector3 &newMin, LLVector3& newMax)
+void LLVOWater::updateSpatialExtents(LLVector4a &newMin, LLVector4a& newMax)
{
- LLVector3 pos = getPositionAgent();
- LLVector3 scale = getScale();
-
- newMin = pos - scale * 0.5f;
- newMax = pos + scale * 0.5f;
+ LLVector4a pos;
+ pos.load3(getPositionAgent().mV);
+ LLVector4a scale;
+ scale.load3(getScale().mV);
+ scale.mul(0.5f);
+
+ newMin.setSub(pos, scale);
+ newMax.setAdd(pos, scale);
+
+ pos.setAdd(newMin,newMax);
+ pos.mul(0.5f);
- mDrawable->setPositionGroup((newMin + newMax) * 0.5f);
+ mDrawable->setPositionGroup(pos);
}
U32 LLVOWater::getPartitionType() const
{
+ if (mIsEdgePatch)
+ {
+ return LLViewerRegion::PARTITION_VOIDWATER;
+ }
+
return LLViewerRegion::PARTITION_WATER;
}
@@ -283,7 +304,7 @@ U32 LLVOVoidWater::getPartitionType() const
}
LLWaterPartition::LLWaterPartition()
-: LLSpatialPartition(0, FALSE, 0)
+: LLSpatialPartition(0, FALSE, GL_DYNAMIC_DRAW_ARB)
{
mInfiniteFarClip = TRUE;
mDrawableType = LLPipeline::RENDER_TYPE_WATER;
@@ -292,6 +313,7 @@ LLWaterPartition::LLWaterPartition()
LLVoidWaterPartition::LLVoidWaterPartition()
{
+ mOcclusionEnabled = FALSE;
mDrawableType = LLPipeline::RENDER_TYPE_VOIDWATER;
mPartitionType = LLViewerRegion::PARTITION_VOIDWATER;
}
diff --git a/indra/newview/llvowater.h b/indra/newview/llvowater.h
index cb9584cabf..ed709dd840 100644
--- a/indra/newview/llvowater.h
+++ b/indra/newview/llvowater.h
@@ -61,7 +61,7 @@ public:
/*virtual*/ BOOL idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);
/*virtual*/ LLDrawable* createDrawable(LLPipeline *pipeline);
/*virtual*/ BOOL updateGeometry(LLDrawable *drawable);
- /*virtual*/ void updateSpatialExtents(LLVector3& newMin, LLVector3& newMax);
+ /*virtual*/ void updateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax);
/*virtual*/ void updateTextures();
/*virtual*/ void setPixelAreaAndAngle(LLAgent &agent); // generate accurate apparent angle and area
diff --git a/indra/newview/llvowlsky.cpp b/indra/newview/llvowlsky.cpp
index ca57c0144b..afd902201b 100644
--- a/indra/newview/llvowlsky.cpp
+++ b/indra/newview/llvowlsky.cpp
@@ -326,13 +326,13 @@ BOOL LLVOWLSky::updateGeometry(LLDrawable * drawable)
buildFanBuffer(vertices, texCoords, indices);
- mFanVerts->setBuffer(0);
+ mFanVerts->flush();
}
{
const U32 max_buffer_bytes = gSavedSettings.getS32("RenderMaxVBOSize")*1024;
const U32 data_mask = LLDrawPoolWLSky::SKY_VERTEX_DATA_MASK;
- const U32 max_verts = max_buffer_bytes / LLVertexBuffer::calcStride(data_mask);
+ const U32 max_verts = max_buffer_bytes / LLVertexBuffer::calcVertexSize(data_mask);
const U32 total_stacks = getNumStacks();
@@ -349,6 +349,9 @@ BOOL LLVOWLSky::updateGeometry(LLDrawable * drawable)
mStripsVerts.resize(strips_segments, NULL);
+ LLTimer timer;
+ timer.start();
+
for (U32 i = 0; i < strips_segments ;++i)
{
LLVertexBuffer * segment = new LLVertexBuffer(LLDrawPoolWLSky::SKY_VERTEX_DATA_MASK, GL_STATIC_DRAW_ARB);
@@ -388,8 +391,10 @@ BOOL LLVOWLSky::updateGeometry(LLDrawable * drawable)
buildStripsBuffer(begin_stack, end_stack, vertices, texCoords, indices);
// and unlock the buffer
- segment->setBuffer(0);
+ segment->flush();
}
+
+ llinfos << "completed in " << llformat("%.2f", timer.getElapsedTimeF32()) << "seconds" << llendl;
}
#else
mStripsVerts = new LLVertexBuffer(LLDrawPoolWLSky::SKY_VERTEX_DATA_MASK, GL_STATIC_DRAW_ARB);
@@ -468,7 +473,7 @@ BOOL LLVOWLSky::updateGeometry(LLDrawable * drawable)
}
}
- mStripsVerts->setBuffer(0);
+ mStripsVerts->flush();
#endif
updateStarColors();
@@ -485,7 +490,7 @@ void LLVOWLSky::drawStars(void)
if (mStarsVerts.notNull())
{
mStarsVerts->setBuffer(LLDrawPoolWLSky::STAR_VERTEX_DATA_MASK);
- mStarsVerts->drawArrays(LLRender::QUADS, 0, getStarsNumVerts()*4);
+ mStarsVerts->drawArrays(LLRender::TRIANGLES, 0, getStarsNumVerts()*4);
}
}
@@ -511,13 +516,14 @@ void LLVOWLSky::drawDome(void)
strips_segment->drawRange(
LLRender::TRIANGLE_STRIP,
- 0, strips_segment->getRequestedVerts()-1, strips_segment->getRequestedIndices(),
+ 0, strips_segment->getNumVerts()-1, strips_segment->getNumIndices(),
0);
- gPipeline.addTrianglesDrawn(strips_segment->getRequestedIndices(), LLRender::TRIANGLE_STRIP);
+ gPipeline.addTrianglesDrawn(strips_segment->getNumIndices(), LLRender::TRIANGLE_STRIP);
}
#else
mStripsVerts->setBuffer(data_mask);
+ gGL.syncMatrices();
glDrawRangeElements(
GL_TRIANGLES,
0, mStripsVerts->getNumVerts()-1, mStripsVerts->getNumIndices(),
@@ -568,7 +574,7 @@ void LLVOWLSky::buildFanBuffer(LLStrider<LLVector3> & vertices,
LLStrider<LLVector2> & texCoords,
LLStrider<U16> & indices)
{
- const F32 RADIUS = LLWLParamManager::instance()->getDomeRadius();
+ const F32 RADIUS = LLWLParamManager::getInstance()->getDomeRadius();
U32 i, num_slices;
F32 phi0, theta, x0, y0, z0;
@@ -629,7 +635,7 @@ void LLVOWLSky::buildStripsBuffer(U32 begin_stack, U32 end_stack,
LLStrider<LLVector2> & texCoords,
LLStrider<U16> & indices)
{
- const F32 RADIUS = LLWLParamManager::instance()->getDomeRadius();
+ const F32 RADIUS = LLWLParamManager::getInstance()->getDomeRadius();
U32 i, j, num_slices, num_stacks;
F32 phi0, theta, x0, y0, z0;
@@ -768,10 +774,10 @@ BOOL LLVOWLSky::updateStarGeometry(LLDrawable *drawable)
LLStrider<LLColor4U> colorsp;
LLStrider<LLVector2> texcoordsp;
- if (mStarsVerts.isNull())
+ if (mStarsVerts.isNull() || !mStarsVerts->isWriteable())
{
mStarsVerts = new LLVertexBuffer(LLDrawPoolWLSky::STAR_VERTEX_DATA_MASK, GL_DYNAMIC_DRAW);
- mStarsVerts->allocateBuffer(getStarsNumVerts()*4, 0, TRUE);
+ mStarsVerts->allocateBuffer(getStarsNumVerts()*6, 0, TRUE);
}
BOOL success = mStarsVerts->getVertexStrider(verticesp)
@@ -806,19 +812,25 @@ BOOL LLVOWLSky::updateStarGeometry(LLDrawable *drawable)
*(verticesp++) = mStarVertices[vtx];
*(verticesp++) = mStarVertices[vtx]+left;
*(verticesp++) = mStarVertices[vtx]+left+up;
+ *(verticesp++) = mStarVertices[vtx]+left;
+ *(verticesp++) = mStarVertices[vtx]+left+up;
*(verticesp++) = mStarVertices[vtx]+up;
*(texcoordsp++) = LLVector2(0,0);
*(texcoordsp++) = LLVector2(0,1);
*(texcoordsp++) = LLVector2(1,1);
+ *(texcoordsp++) = LLVector2(0,1);
+ *(texcoordsp++) = LLVector2(1,1);
*(texcoordsp++) = LLVector2(1,0);
*(colorsp++) = LLColor4U(mStarColors[vtx]);
*(colorsp++) = LLColor4U(mStarColors[vtx]);
*(colorsp++) = LLColor4U(mStarColors[vtx]);
*(colorsp++) = LLColor4U(mStarColors[vtx]);
+ *(colorsp++) = LLColor4U(mStarColors[vtx]);
+ *(colorsp++) = LLColor4U(mStarColors[vtx]);
}
- mStarsVerts->setBuffer(0);
+ mStarsVerts->flush();
return TRUE;
}
diff --git a/indra/newview/llwatchdog.cpp b/indra/newview/llwatchdog.cpp
index 1694126802..4f582fc2db 100644
--- a/indra/newview/llwatchdog.cpp
+++ b/indra/newview/llwatchdog.cpp
@@ -126,8 +126,8 @@ void LLWatchdogTimeout::start(const std::string& state)
// Order of operation is very impmortant here.
// After LLWatchdogEntry::start() is called
// LLWatchdogTimeout::isAlive() will be called asynchronously.
- mTimer.start();
ping(state);
+ mTimer.start();
LLWatchdogEntry::start();
}
diff --git a/indra/newview/llwaterparammanager.cpp b/indra/newview/llwaterparammanager.cpp
index d239347810..e386112334 100644
--- a/indra/newview/llwaterparammanager.cpp
+++ b/indra/newview/llwaterparammanager.cpp
@@ -33,6 +33,7 @@
#include "pipeline.h"
#include "llsky.h"
+#include "lldiriterator.h"
#include "llfloaterreg.h"
#include "llsliderctrl.h"
#include "llspinctrl.h"
@@ -53,12 +54,9 @@
#include "llwlparammanager.h"
#include "llwaterparamset.h"
-#include "llfloaterwater.h"
#include "curl/curl.h"
-LLWaterParamManager * LLWaterParamManager::sInstance = NULL;
-
LLWaterParamManager::LLWaterParamManager() :
mFogColor(22.f/255.f, 43.f/255.f, 54.f/255.f, 0.0f, 0.0f, "waterFogColor", "WaterFogColor"),
mFogDensity(4, "waterFogDensity", 2),
@@ -80,129 +78,73 @@ LLWaterParamManager::~LLWaterParamManager()
{
}
-void LLWaterParamManager::loadAllPresets(const std::string& file_name)
+void LLWaterParamManager::loadAllPresets()
{
- std::string path_name(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/water", ""));
- LL_DEBUGS2("AppInit", "Shaders") << "Loading Default water settings from " << path_name << LL_ENDL;
-
- bool found = true;
- while(found)
- {
- std::string name;
- found = gDirUtilp->getNextFileInDir(path_name, "*.xml", name);
- if(found)
- {
-
- name=name.erase(name.length()-4);
+ // First, load system (coming out of the box) water presets.
+ loadPresetsFromDir(getSysDir());
- // bugfix for SL-46920: preventing filenames that break stuff.
- char * curl_str = curl_unescape(name.c_str(), name.size());
- std::string unescaped_name(curl_str);
- curl_free(curl_str);
- curl_str = NULL;
-
- LL_DEBUGS2("AppInit", "Shaders") << "name: " << name << LL_ENDL;
- loadPreset(unescaped_name,FALSE);
- }
- }
+ // Then load user presets. Note that user day presets will modify any system ones already loaded.
+ loadPresetsFromDir(getUserDir());
+}
- // And repeat for user presets, note the user presets will modify any system presets already loaded
+void LLWaterParamManager::loadPresetsFromDir(const std::string& dir)
+{
+ LL_INFOS2("AppInit", "Shaders") << "Loading water presets from " << dir << LL_ENDL;
- std::string path_name2(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/water", ""));
- LL_DEBUGS2("AppInit", "Shaders") << "Loading User water settings from " << path_name2 << LL_ENDL;
-
- found = true;
- while(found)
+ LLDirIterator dir_iter(dir, "*.xml");
+ while (1)
{
- std::string name;
- found = gDirUtilp->getNextFileInDir(path_name2, "*.xml", name);
- if(found)
+ std::string file;
+ if (!dir_iter.next(file))
{
- name=name.erase(name.length()-4);
-
- // bugfix for SL-46920: preventing filenames that break stuff.
- char * curl_str = curl_unescape(name.c_str(), name.size());
- std::string unescaped_name(curl_str);
- curl_free(curl_str);
- curl_str = NULL;
+ break; // no more files
+ }
- LL_DEBUGS2("AppInit", "Shaders") << "name: " << name << LL_ENDL;
- loadPreset(unescaped_name,FALSE);
+ std::string path = dir + file;
+ if (!loadPreset(path))
+ {
+ llwarns << "Error loading water preset from " << path << llendl;
}
}
-
}
-void LLWaterParamManager::loadPreset(const std::string & name,bool propagate)
+bool LLWaterParamManager::loadPreset(const std::string& path)
{
- // bugfix for SL-46920: preventing filenames that break stuff.
- char * curl_str = curl_escape(name.c_str(), name.size());
- std::string escaped_filename(curl_str);
- curl_free(curl_str);
- curl_str = NULL;
-
- escaped_filename += ".xml";
+ llifstream xml_file;
+ std::string name(gDirUtilp->getBaseFileName(LLURI::unescape(path), /*strip_exten = */ true));
- std::string pathName(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/water", escaped_filename));
- LL_DEBUGS2("AppInit", "Shaders") << "Loading water settings from " << pathName << LL_ENDL;
-
- llifstream presetsXML;
- presetsXML.open(pathName.c_str());
-
- // That failed, try loading from the users area instead.
- if(!presetsXML)
+ xml_file.open(path.c_str());
+ if (!xml_file)
{
- pathName=gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/water", escaped_filename);
- LL_DEBUGS2("AppInit", "Shaders") << "Loading User water setting from " << pathName << LL_ENDL;
- presetsXML.clear();
- presetsXML.open(pathName.c_str());
+ return false;
}
- if (presetsXML)
- {
- LLSD paramsData(LLSD::emptyMap());
+ LL_DEBUGS2("AppInit", "Shaders") << "Loading water " << name << LL_ENDL;
- LLPointer<LLSDParser> parser = new LLSDXMLParser();
+ LLSD params_data;
+ LLPointer<LLSDParser> parser = new LLSDXMLParser();
+ parser->parse(xml_file, params_data, LLSDSerialize::SIZE_UNLIMITED);
+ xml_file.close();
- parser->parse(presetsXML, paramsData, LLSDSerialize::SIZE_UNLIMITED);
-
- std::map<std::string, LLWaterParamSet>::iterator mIt = mParamList.find(name);
- if(mIt == mParamList.end())
- {
- addParamSet(name, paramsData);
- }
- else
- {
- setParamSet(name, paramsData);
- }
- presetsXML.close();
- }
- else
+ if (hasParamSet(name))
{
- llwarns << "Can't find " << name << llendl;
- return;
+ setParamSet(name, params_data);
}
-
- if(propagate)
+ else
{
- getParamSet(name, mCurParams);
- propagateParameters();
+ addParamSet(name, params_data);
}
-}
+
+ return true;
+}
void LLWaterParamManager::savePreset(const std::string & name)
{
- // bugfix for SL-46920: preventing filenames that break stuff.
- char * curl_str = curl_escape(name.c_str(), name.size());
- std::string escaped_filename(curl_str);
- curl_free(curl_str);
- curl_str = NULL;
-
- escaped_filename += ".xml";
+ llassert(!name.empty());
// make an empty llsd
LLSD paramsData(LLSD::emptyMap());
- std::string pathName(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/water", escaped_filename));
+ std::string pathName(getUserDir() + LLURI::escape(name) + ".xml");
// fill it with LLSD windlight params
paramsData = mParamList[name].getAll();
@@ -216,7 +158,6 @@ void LLWaterParamManager::savePreset(const std::string & name)
propagateParameters();
}
-
void LLWaterParamManager::propagateParameters(void)
{
// bind the variables only if we're using shaders
@@ -246,32 +187,44 @@ void LLWaterParamManager::updateShaderUniforms(LLGLSLShader * shader)
{
if (shader->mShaderGroup == LLGLSLShader::SG_WATER)
{
- shader->uniform4fv(LLViewerShaderMgr::LIGHTNORM, 1, LLWLParamManager::instance()->getRotatedLightDir().mV);
+ shader->uniform4fv(LLViewerShaderMgr::LIGHTNORM, 1, LLWLParamManager::getInstance()->getRotatedLightDir().mV);
shader->uniform3fv("camPosLocal", 1, LLViewerCamera::getInstance()->getOrigin().mV);
shader->uniform4fv("waterFogColor", 1, LLDrawPoolWater::sWaterFogColor.mV);
+ shader->uniform1f("waterFogEnd", LLDrawPoolWater::sWaterFogEnd);
shader->uniform4fv("waterPlane", 1, mWaterPlane.mV);
shader->uniform1f("waterFogDensity", getFogDensity());
shader->uniform1f("waterFogKS", mWaterFogKS);
- shader->uniform4f("distance_multiplier", 0, 0, 0, 0);
+ shader->uniform1f("distance_multiplier", 0);
+ }
+}
+
+void LLWaterParamManager::applyParams(const LLSD& params, bool interpolate)
+{
+ if (params.size() == 0)
+ {
+ llwarns << "Undefined water params" << llendl;
+ return;
+ }
+
+ if (interpolate)
+ {
+ LLWLParamManager::getInstance()->mAnimator.startInterpolation(params);
+ }
+ else
+ {
+ mCurParams.setAll(params);
}
}
-static LLFastTimer::DeclareTimer FTM_UPDATE_WLPARAM("Update Windlight Params");
+static LLFastTimer::DeclareTimer FTM_UPDATE_WATERPARAM("Update Water Params");
void LLWaterParamManager::update(LLViewerCamera * cam)
{
- LLFastTimer ftm(FTM_UPDATE_WLPARAM);
+ LLFastTimer ftm(FTM_UPDATE_WATERPARAM);
// update the shaders and the menu
propagateParameters();
- // sync menus if they exist
- LLFloaterWater* waterfloater = LLFloaterReg::findTypedInstance<LLFloaterWater>("env_water");
- if(waterfloater)
- {
- waterfloater->syncMenu();
- }
-
// only do this if we're dealing with shaders
if(gPipeline.canUseVertexShaders())
{
@@ -320,26 +273,14 @@ void LLWaterParamManager::update(LLViewerCamera * cam)
}
}
-// static
-void LLWaterParamManager::initClass(void)
-{
- instance();
-}
-
-// static
-void LLWaterParamManager::cleanupClass(void)
-{
- delete sInstance;
- sInstance = NULL;
-}
-
bool LLWaterParamManager::addParamSet(const std::string& name, LLWaterParamSet& param)
{
// add a new one if not one there already
- std::map<std::string, LLWaterParamSet>::iterator mIt = mParamList.find(name);
+ preset_map_t::iterator mIt = mParamList.find(name);
if(mIt == mParamList.end())
{
mParamList[name] = param;
+ mPresetListChangeSignal();
return true;
}
@@ -348,23 +289,15 @@ bool LLWaterParamManager::addParamSet(const std::string& name, LLWaterParamSet&
BOOL LLWaterParamManager::addParamSet(const std::string& name, LLSD const & param)
{
- // add a new one if not one there already
- std::map<std::string, LLWaterParamSet>::const_iterator finder = mParamList.find(name);
- if(finder == mParamList.end())
- {
- mParamList[name].setAll(param);
- return TRUE;
- }
- else
- {
- return FALSE;
- }
+ LLWaterParamSet param_set;
+ param_set.setAll(param);
+ return addParamSet(name, param_set);
}
bool LLWaterParamManager::getParamSet(const std::string& name, LLWaterParamSet& param)
{
// find it and set it
- std::map<std::string, LLWaterParamSet>::iterator mIt = mParamList.find(name);
+ preset_map_t::iterator mIt = mParamList.find(name);
if(mIt != mParamList.end())
{
param = mParamList[name];
@@ -375,6 +308,12 @@ bool LLWaterParamManager::getParamSet(const std::string& name, LLWaterParamSet&
return false;
}
+bool LLWaterParamManager::hasParamSet(const std::string& name)
+{
+ LLWaterParamSet dummy;
+ return getParamSet(name, dummy);
+}
+
bool LLWaterParamManager::setParamSet(const std::string& name, LLWaterParamSet& param)
{
mParamList[name] = param;
@@ -398,29 +337,74 @@ bool LLWaterParamManager::setParamSet(const std::string& name, const LLSD & para
bool LLWaterParamManager::removeParamSet(const std::string& name, bool delete_from_disk)
{
// remove from param list
- std::map<std::string, LLWaterParamSet>::iterator mIt = mParamList.find(name);
- if(mIt != mParamList.end())
+ preset_map_t::iterator it = mParamList.find(name);
+ if (it == mParamList.end())
{
- mParamList.erase(mIt);
+ LL_WARNS("WindLight") << "No water preset named " << name << LL_ENDL;
+ return false;
}
- if(delete_from_disk)
- {
+ mParamList.erase(it);
- std::string path_name(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/water", ""));
-
- // use full curl escaped name
- char * curl_str = curl_escape(name.c_str(), name.size());
- std::string escaped_name(curl_str);
- curl_free(curl_str);
- curl_str = NULL;
-
- gDirUtilp->deleteFilesInDir(path_name, escaped_name + ".xml");
+ // remove from file system if requested
+ if (delete_from_disk)
+ {
+ if (gDirUtilp->deleteFilesInDir(getUserDir(), LLURI::escape(name) + ".xml") < 1)
+ {
+ LL_WARNS("WindLight") << "Error removing water preset " << name << " from disk" << LL_ENDL;
+ }
}
+ // signal interested parties
+ mPresetListChangeSignal();
return true;
}
+bool LLWaterParamManager::isSystemPreset(const std::string& preset_name) const
+{
+ // *TODO: file system access is excessive here.
+ return gDirUtilp->fileExists(getSysDir() + LLURI::escape(preset_name) + ".xml");
+}
+
+void LLWaterParamManager::getPresetNames(preset_name_list_t& presets) const
+{
+ presets.clear();
+
+ for (preset_map_t::const_iterator it = mParamList.begin(); it != mParamList.end(); ++it)
+ {
+ presets.push_back(it->first);
+ }
+}
+
+void LLWaterParamManager::getPresetNames(preset_name_list_t& user_presets, preset_name_list_t& system_presets) const
+{
+ user_presets.clear();
+ system_presets.clear();
+
+ for (preset_map_t::const_iterator it = mParamList.begin(); it != mParamList.end(); ++it)
+ {
+ if (isSystemPreset(it->first))
+ {
+ system_presets.push_back(it->first);
+ }
+ else
+ {
+ user_presets.push_back(it->first);
+ }
+ }
+}
+
+void LLWaterParamManager::getUserPresetNames(preset_name_list_t& user_presets) const
+{
+ preset_name_list_t dummy;
+ getPresetNames(user_presets, dummy);
+}
+
+boost::signals2::connection LLWaterParamManager::setPresetListChangeCallback(const preset_list_signal_t::slot_type& cb)
+{
+ return mPresetListChangeSignal.connect(cb);
+}
+
F32 LLWaterParamManager::getFogDensity(void)
{
bool err;
@@ -439,17 +423,22 @@ F32 LLWaterParamManager::getFogDensity(void)
return fogDensity;
}
-// static
-LLWaterParamManager * LLWaterParamManager::instance()
+// virtual static
+void LLWaterParamManager::initSingleton()
{
- if(NULL == sInstance)
- {
- sInstance = new LLWaterParamManager();
-
- sInstance->loadAllPresets(LLStringUtil::null);
+ LL_DEBUGS("Windlight") << "Initializing water" << LL_ENDL;
+ loadAllPresets();
+ LLEnvManagerNew::instance().usePrefs();
+}
- sInstance->getParamSet("Default", sInstance->mCurParams);
- }
+// static
+std::string LLWaterParamManager::getSysDir()
+{
+ return gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/water", "");
+}
- return sInstance;
+// static
+std::string LLWaterParamManager::getUserDir()
+{
+ return gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS , "windlight/water", "");
}
diff --git a/indra/newview/llwaterparammanager.h b/indra/newview/llwaterparammanager.h
index c479f1861c..dc7d41be2a 100644
--- a/indra/newview/llwaterparammanager.h
+++ b/indra/newview/llwaterparammanager.h
@@ -27,7 +27,7 @@
#ifndef LL_WATER_PARAMMANAGER_H
#define LL_WATER_PARAMMANAGER_H
-#include <vector>
+#include <list>
#include <map>
#include "llwaterparamset.h"
#include "llviewercamera.h"
@@ -212,19 +212,13 @@ struct WaterExpFloatControl
/// WindLight parameter manager class - what controls all the wind light shaders
-class LLWaterParamManager
+class LLWaterParamManager : public LLSingleton<LLWaterParamManager>
{
+ LOG_CLASS(LLWaterParamManager);
public:
-
- LLWaterParamManager();
- ~LLWaterParamManager();
-
- /// load a preset file
- void loadAllPresets(const std::string & fileName);
-
- /// load an individual preset into the sky
-
- void loadPreset(const std::string & name,bool propagate=true);
+ typedef std::list<std::string> preset_name_list_t;
+ typedef std::map<std::string, LLWaterParamSet> preset_map_t;
+ typedef boost::signals2::signal<void()> preset_list_signal_t;
/// save the parameter presets to file
void savePreset(const std::string & name);
@@ -232,18 +226,15 @@ public:
/// send the parameters to the shaders
void propagateParameters(void);
+ // display specified water
+ void applyParams(const LLSD& params, bool interpolate);
+
/// update information for the shader
void update(LLViewerCamera * cam);
/// Update shader uniforms that have changed.
void updateShaderUniforms(LLGLSLShader * shader);
- /// Perform global initialization for this class.
- static void initClass(void);
-
- // Cleanup of global data that's only inited once per class.
- static void cleanupClass();
-
/// add a param to the list
bool addParamSet(const std::string& name, LLWaterParamSet& param);
@@ -253,6 +244,9 @@ public:
/// get a param from the list
bool getParamSet(const std::string& name, LLWaterParamSet& param);
+ /// check whether the preset is in the list
+ bool hasParamSet(const std::string& name);
+
/// set the param in the list with a new param
bool setParamSet(const std::string& name, LLWaterParamSet& param);
@@ -263,6 +257,24 @@ public:
/// returns true if successful
bool removeParamSet(const std::string& name, bool delete_from_disk);
+ /// @return true if the preset comes out of the box
+ bool isSystemPreset(const std::string& preset_name) const;
+
+ /// @return all named water presets.
+ const preset_map_t& getPresets() const { return mParamList; }
+
+ /// @return user and system preset names as a single list
+ void getPresetNames(preset_name_list_t& presets) const;
+
+ /// @return user and system preset names separately
+ void getPresetNames(preset_name_list_t& user_presets, preset_name_list_t& system_presets) const;
+
+ /// @return list of user presets names
+ void getUserPresetNames(preset_name_list_t& user_presets) const;
+
+ /// Emitted when a preset gets added or deleted.
+ boost::signals2::connection setPresetListChangeCallback(const preset_list_signal_t::slot_type& cb);
+
/// set the normap map we want for water
bool setNormalMapID(const LLUUID& img);
@@ -281,9 +293,6 @@ public:
F32 getFogDensity(void);
LLColor4 getFogColor(void);
- // singleton pattern implementation
- static LLWaterParamManager * instance();
-
public:
LLWaterParamSet mCurParams;
@@ -305,17 +314,28 @@ public:
WaterFloatControl mScaleBelow;
WaterFloatControl mBlurMultiplier;
- // list of all the parameters, listed by name
- std::map<std::string, LLWaterParamSet> mParamList;
-
F32 mDensitySliderValue;
private:
+ friend class LLSingleton<LLWaterParamManager>;
+ /*virtual*/ void initSingleton();
+ LLWaterParamManager();
+ ~LLWaterParamManager();
+
+ void loadAllPresets();
+ void loadPresetsFromDir(const std::string& dir);
+ bool loadPreset(const std::string& path);
+
+ static std::string getSysDir();
+ static std::string getUserDir();
+
LLVector4 mWaterPlane;
F32 mWaterFogKS;
- // our parameter manager singleton instance
- static LLWaterParamManager * sInstance;
+ // list of all the parameters, listed by name
+ preset_map_t mParamList;
+
+ preset_list_signal_t mPresetListChangeSignal;
};
inline void LLWaterParamManager::setDensitySliderValue(F32 val)
diff --git a/indra/newview/llwaterparamset.cpp b/indra/newview/llwaterparamset.cpp
index 9457d631be..39d366b023 100644
--- a/indra/newview/llwaterparamset.cpp
+++ b/indra/newview/llwaterparamset.cpp
@@ -29,7 +29,6 @@
#include "llwaterparamset.h"
#include "llsd.h"
-#include "llfloaterwater.h"
#include "llwaterparammanager.h"
#include "lluictrlfactory.h"
#include "llsliderctrl.h"
@@ -224,3 +223,46 @@ F32 LLWaterParamSet::getFloat(const std::string& paramName, bool& error)
return 0;
}
+// Added for interpolation effect in DEV-33645
+// Based on LLWLParamSet::mix, but written by Jacob without an intimate knowledge of how WindLight works.
+// The function definition existed in the header but was never implemented. If you think there is something
+// wrong with this, you're probably right. Ask Jacob, Q, or a member of the original WindLight team.
+void LLWaterParamSet::mix(LLWaterParamSet& src, LLWaterParamSet& dest, F32 weight)
+{
+ // Setup
+ LLSD srcVal, destVal; // LLSD holders for get/set calls, reusable
+
+ // Iterate through values
+ for(LLSD::map_iterator iter = mParamValues.beginMap(); iter != mParamValues.endMap(); ++iter)
+ {
+ // If param exists in both src and dest, set the holder variables, otherwise skip
+ if(src.mParamValues.has(iter->first) && dest.mParamValues.has(iter->first))
+ {
+ srcVal = src.mParamValues[iter->first];
+ destVal = dest.mParamValues[iter->first];
+ }
+ else
+ {
+ continue;
+ }
+
+ if(iter->second.isReal()) // If it's a real, interpolate directly
+ {
+ iter->second = srcVal.asReal() + ((destVal.asReal() - srcVal.asReal()) * weight);
+ }
+ else if(iter->second.isArray() && iter->second[0].isReal() // If it's an array of reals, loop through the reals and interpolate on those
+ && iter->second.size() == srcVal.size() && iter->second.size() == destVal.size())
+ {
+ // Actually do interpolation: old value + (difference in values * factor)
+ for(int i=0; i < iter->second.size(); ++i)
+ {
+ // iter->second[i] = (1.f-weight)*(F32)srcVal[i].asReal() + weight*(F32)destVal[i].asReal(); // old way of doing it -- equivalent but one more operation
+ iter->second[i] = srcVal[i].asReal() + ((destVal[i].asReal() - srcVal[i].asReal()) * weight);
+ }
+ }
+ else // Else, skip
+ {
+ continue;
+ }
+ }
+}
diff --git a/indra/newview/llwaterparamset.h b/indra/newview/llwaterparamset.h
index 9957d5371b..b28585af59 100644
--- a/indra/newview/llwaterparamset.h
+++ b/indra/newview/llwaterparamset.h
@@ -34,7 +34,6 @@
#include "v4color.h"
#include "llviewershadermgr.h"
-class LLFloaterWater;
class LLWaterParamSet;
/// A class representing a set of parameter values for the Water shaders.
diff --git a/indra/newview/llwearable.cpp b/indra/newview/llwearable.cpp
index d1c0990f90..402504933c 100644
--- a/indra/newview/llwearable.cpp
+++ b/indra/newview/llwearable.cpp
@@ -30,13 +30,13 @@
#include "llagentcamera.h"
#include "llagentwearables.h"
#include "lldictionary.h"
+#include "llfloatersidepanelcontainer.h"
#include "lllocaltextureobject.h"
#include "llnotificationsutil.h"
#include "llviewertexturelist.h"
#include "llinventorymodel.h"
#include "llinventoryobserver.h"
#include "llsidepanelappearance.h"
-#include "llsidetray.h"
#include "lltexlayer.h"
#include "lltexglobalcolor.h"
#include "lltrans.h"
@@ -221,7 +221,7 @@ void LLWearable::createVisualParams()
param->resetDrivenParams();
if(!param->linkDrivenParams(boost::bind(wearable_function,(LLWearable*)this, _1), false))
{
- if( !param->linkDrivenParams(boost::bind(avatar_function,gAgentAvatarp,_1 ), true))
+ if( !param->linkDrivenParams(boost::bind(avatar_function,gAgentAvatarp.get(),_1 ), true))
{
llwarns << "could not link driven params for wearable " << getName() << " id: " << param->getID() << llendl;
continue;
@@ -697,7 +697,7 @@ void LLWearable::removeFromAvatar( LLWearableType::EType type, BOOL upload_bake
if(gAgentCamera.cameraCustomizeAvatar())
{
- LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD().with("type", "edit_outfit"));
+ LLFloaterSidePanelContainer::showPanel("appearance", LLSD().with("type", "edit_outfit"));
}
gAgentAvatarp->updateVisualParams();
@@ -810,6 +810,20 @@ const LLLocalTextureObject* LLWearable::getLocalTextureObject(S32 index) const
return NULL;
}
+std::vector<LLLocalTextureObject*> LLWearable::getLocalTextureListSeq()
+{
+ std::vector<LLLocalTextureObject*> result;
+
+ for(te_map_t::const_iterator iter = mTEMap.begin();
+ iter != mTEMap.end(); iter++)
+ {
+ LLLocalTextureObject* lto = iter->second;
+ result.push_back(lto);
+ }
+
+ return result;
+}
+
void LLWearable::setLocalTextureObject(S32 index, LLLocalTextureObject &lto)
{
if( mTEMap.find(index) != mTEMap.end() )
@@ -967,7 +981,7 @@ void LLWearable::revertValues()
syncImages(mSavedTEMap, mTEMap);
- LLSidepanelAppearance *panel = dynamic_cast<LLSidepanelAppearance*>(LLSideTray::getInstance()->getPanel("sidepanel_appearance"));
+ LLSidepanelAppearance *panel = dynamic_cast<LLSidepanelAppearance*>(LLFloaterSidePanelContainer::getPanel("appearance"));
if( panel )
{
panel->updateScrollingPanelList();
@@ -1008,7 +1022,7 @@ void LLWearable::saveValues()
syncImages(mTEMap, mSavedTEMap);
- LLSidepanelAppearance *panel = dynamic_cast<LLSidepanelAppearance*>(LLSideTray::getInstance()->getPanel("sidepanel_appearance"));
+ LLSidepanelAppearance *panel = dynamic_cast<LLSidepanelAppearance*>(LLFloaterSidePanelContainer::getPanel("appearance"));
if( panel )
{
panel->updateScrollingPanelList();
diff --git a/indra/newview/llwearable.h b/indra/newview/llwearable.h
index fd614ade64..3d8c53a755 100644
--- a/indra/newview/llwearable.h
+++ b/indra/newview/llwearable.h
@@ -106,6 +106,7 @@ public:
LLLocalTextureObject* getLocalTextureObject(S32 index);
const LLLocalTextureObject* getLocalTextureObject(S32 index) const;
+ std::vector<LLLocalTextureObject*> getLocalTextureListSeq();
void setLocalTextureObject(S32 index, LLLocalTextureObject &lto);
void addVisualParam(LLVisualParam *param);
diff --git a/indra/newview/llwearableitemslist.cpp b/indra/newview/llwearableitemslist.cpp
index a49dc1b59d..92697fb2eb 100644
--- a/indra/newview/llwearableitemslist.cpp
+++ b/indra/newview/llwearableitemslist.cpp
@@ -287,6 +287,9 @@ BOOL LLPanelBodyPartsListItem::postBuild()
addWidgetToRightSide("btn_lock");
addWidgetToRightSide("btn_edit_panel");
+ setWidgetsVisible(false);
+ reshapeWidgets();
+
return TRUE;
}
@@ -443,6 +446,7 @@ clothing_to_string_map_t init_clothing_string_map()
w_map.insert(std::make_pair(LLWearableType::WT_SKIRT, "skirt_not_worn"));
w_map.insert(std::make_pair(LLWearableType::WT_ALPHA, "alpha_not_worn"));
w_map.insert(std::make_pair(LLWearableType::WT_TATTOO, "tattoo_not_worn"));
+ w_map.insert(std::make_pair(LLWearableType::WT_PHYSICS, "physics_not_worn"));
return w_map;
}
@@ -888,6 +892,7 @@ void LLWearableItemsList::ContextMenu::updateItemsVisibility(LLContextMenu* menu
setMenuItemVisible(menu, "edit", !standalone && mask & (MASK_CLOTHING|MASK_BODYPART) && n_worn == n_items && n_worn == 1);
setMenuItemEnabled(menu, "edit", n_editable == 1 && n_worn == 1 && n_items == 1);
setMenuItemVisible(menu, "create_new", mask & (MASK_CLOTHING|MASK_BODYPART) && n_items == 1);
+ setMenuItemEnabled(menu, "create_new", canAddWearables(ids));
setMenuItemVisible(menu, "show_original", !standalone);
setMenuItemEnabled(menu, "show_original", n_items == 1 && n_links == n_items);
setMenuItemVisible(menu, "take_off", mask == MASK_CLOTHING && n_worn == n_items);
@@ -1038,6 +1043,10 @@ bool LLWearableItemsList::ContextMenu::canAddWearables(const uuid_vec_t& item_id
U32 n_clothes = m_it->second;
U32 wearable_count = gAgentWearables.getWearableCount(w_type);
+ if ((wearable_count > 0) && !LLWearableType::getAllowMultiwear(w_type))
+ {
+ return false;
+ }
if ((wearable_count + n_clothes) > LLAgentWearables::MAX_CLOTHING_PER_TYPE)
{
return false;
diff --git a/indra/newview/llwearableitemslist.h b/indra/newview/llwearableitemslist.h
index b060c9f076..a8a5ef3117 100644
--- a/indra/newview/llwearableitemslist.h
+++ b/indra/newview/llwearableitemslist.h
@@ -396,7 +396,6 @@ protected:
*/
class LLWearableItemsList : public LLInventoryItemsList
{
- LOG_CLASS(LLWearableItemsList);
public:
/**
* Context menu.
diff --git a/indra/newview/llwearablelist.cpp b/indra/newview/llwearablelist.cpp
index ddbcdfc3f7..6f6411ce3c 100644
--- a/indra/newview/llwearablelist.cpp
+++ b/indra/newview/llwearablelist.cpp
@@ -63,7 +63,7 @@ struct LLWearableArrivedData
LLWearableList::~LLWearableList()
{
- llassert_always(mList.empty()) ;
+ cleanup();
}
void LLWearableList::cleanup()
diff --git a/indra/newview/llwearabletype.cpp b/indra/newview/llwearabletype.cpp
index 0d707d65bf..c090ab5c3d 100644
--- a/indra/newview/llwearabletype.cpp
+++ b/indra/newview/llwearabletype.cpp
@@ -34,25 +34,27 @@ struct WearableEntry : public LLDictionaryEntry
WearableEntry(const std::string &name,
const std::string& default_new_name,
LLAssetType::EType assetType,
- LLInventoryIcon::EIconName iconName);
+ LLInventoryIcon::EIconName iconName,
+ BOOL disable_camera_switch = FALSE,
+ BOOL allow_multiwear = TRUE) :
+ LLDictionaryEntry(name),
+ mAssetType(assetType),
+ mDefaultNewName(default_new_name),
+ mLabel(LLTrans::getString(name)),
+ mIconName(iconName),
+ mDisableCameraSwitch(disable_camera_switch),
+ mAllowMultiwear(allow_multiwear)
+ {
+
+ }
const LLAssetType::EType mAssetType;
const std::string mLabel;
const std::string mDefaultNewName; //keep mLabel for backward compatibility
LLInventoryIcon::EIconName mIconName;
+ BOOL mDisableCameraSwitch;
+ BOOL mAllowMultiwear;
};
-WearableEntry::WearableEntry(const std::string &name,
- const std::string& default_new_name,
- LLAssetType::EType assetType,
- LLInventoryIcon::EIconName iconName) :
- LLDictionaryEntry(name),
- mAssetType(assetType),
- mDefaultNewName(default_new_name),
- mLabel(LLTrans::getString(name)),
- mIconName(iconName)
-{
-}
-
class LLWearableDictionary : public LLSingleton<LLWearableDictionary>,
public LLDictionary<LLWearableType::EType, WearableEntry>
{
@@ -62,23 +64,26 @@ public:
LLWearableDictionary::LLWearableDictionary()
{
- addEntry(LLWearableType::WT_SHAPE, new WearableEntry("shape", "New Shape", LLAssetType::AT_BODYPART, LLInventoryIcon::ICONNAME_BODYPART_SHAPE));
- addEntry(LLWearableType::WT_SKIN, new WearableEntry("skin", "New Skin", LLAssetType::AT_BODYPART, LLInventoryIcon::ICONNAME_BODYPART_SKIN));
- addEntry(LLWearableType::WT_HAIR, new WearableEntry("hair", "New Hair", LLAssetType::AT_BODYPART, LLInventoryIcon::ICONNAME_BODYPART_HAIR));
- addEntry(LLWearableType::WT_EYES, new WearableEntry("eyes", "New Eyes", LLAssetType::AT_BODYPART, LLInventoryIcon::ICONNAME_BODYPART_EYES));
- addEntry(LLWearableType::WT_SHIRT, new WearableEntry("shirt", "New Shirt", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_SHIRT));
- addEntry(LLWearableType::WT_PANTS, new WearableEntry("pants", "New Pants", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_PANTS));
- addEntry(LLWearableType::WT_SHOES, new WearableEntry("shoes", "New Shoes", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_SHOES));
- addEntry(LLWearableType::WT_SOCKS, new WearableEntry("socks", "New Socks", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_SOCKS));
- addEntry(LLWearableType::WT_JACKET, new WearableEntry("jacket", "New Jacket", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_JACKET));
- addEntry(LLWearableType::WT_GLOVES, new WearableEntry("gloves", "New Gloves", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_GLOVES));
- addEntry(LLWearableType::WT_UNDERSHIRT, new WearableEntry("undershirt", "New Undershirt", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_UNDERSHIRT));
- addEntry(LLWearableType::WT_UNDERPANTS, new WearableEntry("underpants", "New Underpants", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_UNDERPANTS));
- addEntry(LLWearableType::WT_SKIRT, new WearableEntry("skirt", "New Skirt", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_SKIRT));
- addEntry(LLWearableType::WT_ALPHA, new WearableEntry("alpha", "New Alpha", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_ALPHA));
- addEntry(LLWearableType::WT_TATTOO, new WearableEntry("tattoo", "New Tattoo", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_TATTOO));
- addEntry(LLWearableType::WT_INVALID, new WearableEntry("invalid", "Invalid Wearable", LLAssetType::AT_NONE, LLInventoryIcon::ICONNAME_INVALID));
- addEntry(LLWearableType::WT_NONE, new WearableEntry("none", "Invalid Wearable", LLAssetType::AT_NONE, LLInventoryIcon::ICONNAME_INVALID));
+ addEntry(LLWearableType::WT_SHAPE, new WearableEntry("shape", "New Shape", LLAssetType::AT_BODYPART, LLInventoryIcon::ICONNAME_BODYPART_SHAPE, FALSE, FALSE));
+ addEntry(LLWearableType::WT_SKIN, new WearableEntry("skin", "New Skin", LLAssetType::AT_BODYPART, LLInventoryIcon::ICONNAME_BODYPART_SKIN, FALSE, FALSE));
+ addEntry(LLWearableType::WT_HAIR, new WearableEntry("hair", "New Hair", LLAssetType::AT_BODYPART, LLInventoryIcon::ICONNAME_BODYPART_HAIR, FALSE, FALSE));
+ addEntry(LLWearableType::WT_EYES, new WearableEntry("eyes", "New Eyes", LLAssetType::AT_BODYPART, LLInventoryIcon::ICONNAME_BODYPART_EYES, FALSE, FALSE));
+ addEntry(LLWearableType::WT_SHIRT, new WearableEntry("shirt", "New Shirt", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_SHIRT, FALSE, TRUE));
+ addEntry(LLWearableType::WT_PANTS, new WearableEntry("pants", "New Pants", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_PANTS, FALSE, TRUE));
+ addEntry(LLWearableType::WT_SHOES, new WearableEntry("shoes", "New Shoes", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_SHOES, FALSE, TRUE));
+ addEntry(LLWearableType::WT_SOCKS, new WearableEntry("socks", "New Socks", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_SOCKS, FALSE, TRUE));
+ addEntry(LLWearableType::WT_JACKET, new WearableEntry("jacket", "New Jacket", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_JACKET, FALSE, TRUE));
+ addEntry(LLWearableType::WT_GLOVES, new WearableEntry("gloves", "New Gloves", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_GLOVES, FALSE, TRUE));
+ addEntry(LLWearableType::WT_UNDERSHIRT, new WearableEntry("undershirt", "New Undershirt", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_UNDERSHIRT, FALSE, TRUE));
+ addEntry(LLWearableType::WT_UNDERPANTS, new WearableEntry("underpants", "New Underpants", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_UNDERPANTS, FALSE, TRUE));
+ addEntry(LLWearableType::WT_SKIRT, new WearableEntry("skirt", "New Skirt", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_SKIRT, FALSE, TRUE));
+ addEntry(LLWearableType::WT_ALPHA, new WearableEntry("alpha", "New Alpha", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_ALPHA, FALSE, TRUE));
+ addEntry(LLWearableType::WT_TATTOO, new WearableEntry("tattoo", "New Tattoo", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_TATTOO, FALSE, TRUE));
+
+ addEntry(LLWearableType::WT_PHYSICS, new WearableEntry("physics", "New Physics", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_PHYSICS, TRUE, TRUE));
+
+ addEntry(LLWearableType::WT_INVALID, new WearableEntry("invalid", "Invalid Wearable", LLAssetType::AT_NONE, LLInventoryIcon::ICONNAME_NONE, FALSE, FALSE));
+ addEntry(LLWearableType::WT_NONE, new WearableEntry("none", "Invalid Wearable", LLAssetType::AT_NONE, LLInventoryIcon::ICONNAME_NONE, FALSE, FALSE));
}
// static
@@ -134,3 +139,21 @@ LLInventoryIcon::EIconName LLWearableType::getIconName(LLWearableType::EType typ
return entry->mIconName;
}
+// static
+BOOL LLWearableType::getDisableCameraSwitch(LLWearableType::EType type)
+{
+ const LLWearableDictionary *dict = LLWearableDictionary::getInstance();
+ const WearableEntry *entry = dict->lookup(type);
+ if (!entry) return FALSE;
+ return entry->mDisableCameraSwitch;
+}
+
+// static
+BOOL LLWearableType::getAllowMultiwear(LLWearableType::EType type)
+{
+ const LLWearableDictionary *dict = LLWearableDictionary::getInstance();
+ const WearableEntry *entry = dict->lookup(type);
+ if (!entry) return FALSE;
+ return entry->mAllowMultiwear;
+}
+
diff --git a/indra/newview/llwearabletype.h b/indra/newview/llwearabletype.h
index 3bbf8ba0bd..d633b4807e 100644
--- a/indra/newview/llwearabletype.h
+++ b/indra/newview/llwearabletype.h
@@ -52,7 +52,8 @@ public:
WT_SKIRT = 12,
WT_ALPHA = 13,
WT_TATTOO = 14,
- WT_COUNT = 15,
+ WT_PHYSICS = 15,
+ WT_COUNT = 16,
WT_INVALID = 255,
WT_NONE = -1,
@@ -64,6 +65,8 @@ public:
static LLAssetType::EType getAssetType(EType type);
static EType typeNameToType(const std::string& type_name);
static LLInventoryIcon::EIconName getIconName(EType type);
+ static BOOL getDisableCameraSwitch(EType type);
+ static BOOL getAllowMultiwear(EType type);
protected:
LLWearableType() {}
diff --git a/indra/newview/llweb.cpp b/indra/newview/llweb.cpp
index 73a37a6993..d2d48dc68f 100644
--- a/indra/newview/llweb.cpp
+++ b/indra/newview/llweb.cpp
@@ -34,7 +34,7 @@
#include "llagent.h"
#include "llappviewer.h"
-#include "llfloatermediabrowser.h"
+#include "llfloaterwebcontent.h"
#include "llfloaterreg.h"
#include "lllogininstance.h"
#include "llparcel.h"
@@ -77,6 +77,8 @@ void LLWeb::initClass()
}
+
+
// static
void LLWeb::loadURL(const std::string& url, const std::string& target, const std::string& uuid)
{
@@ -95,27 +97,34 @@ void LLWeb::loadURL(const std::string& url, const std::string& target, const std
}
}
-
// static
+// Explicitly open a Web URL using the Web content floater
void LLWeb::loadURLInternal(const std::string &url, const std::string& target, const std::string& uuid)
{
- LLFloaterMediaBrowser::create(url, target, uuid);
+ LLFloaterWebContent::Params p;
+ p.url(url).target(target).id(uuid);
+ LLFloaterReg::showInstance("web_content", p);
}
-
// static
void LLWeb::loadURLExternal(const std::string& url, const std::string& uuid)
{
loadURLExternal(url, true, uuid);
}
-
// static
void LLWeb::loadURLExternal(const std::string& url, bool async, const std::string& uuid)
{
// Act like the proxy window was closed, since we won't be able to track targeted windows in the external browser.
LLViewerMedia::proxyWindowClosed(uuid);
+ if(gSavedSettings.getBOOL("DisableExternalBrowser"))
+ {
+ // Don't open an external browser under any circumstances.
+ llwarns << "Blocked attempt to open external browser." << llendl;
+ return;
+ }
+
LLSD payload;
payload["url"] = url;
LLNotificationsUtil::add( "WebLaunchExternalTarget", LLSD(), payload, boost::bind(on_load_url_external_response, _1, _2, async));
@@ -177,6 +186,7 @@ std::string LLWeb::expandURLSubstitutions(const std::string &url,
substitution["VERSION_BUILD"] = LLVersionInfo::getBuild();
substitution["CHANNEL"] = LLVersionInfo::getChannel();
substitution["GRID"] = LLGridManager::getInstance()->getGridLabel();
+ substitution["GRID_LOWERCASE"] = utf8str_tolower(LLGridManager::getInstance()->getGridLabel());
substitution["OS"] = LLAppViewer::instance()->getOSInfo().getOSStringSimple();
substitution["SESSION_ID"] = gAgent.getSessionID();
substitution["FIRST_LOGIN"] = gAgent.isFirstLogin();
diff --git a/indra/newview/llweb.h b/indra/newview/llweb.h
index 2915376583..0b95f664d6 100644
--- a/indra/newview/llweb.h
+++ b/indra/newview/llweb.h
@@ -42,21 +42,16 @@ class LLWeb
public:
static void initClass();
- /// Load the given url in the user's preferred web browser
- static void loadURL(const std::string& url, const std::string& target, const std::string& uuid = LLStringUtil::null);
- static void loadURL(const std::string& url) { loadURL(url, LLStringUtil::null); }
- /// Load the given url in the user's preferred web browser
- static void loadURL(const char* url, const std::string& target) { loadURL( ll_safe_string(url), target); }
- static void loadURL(const char* url) { loadURL( ll_safe_string(url), LLStringUtil::null ); }
- /// Load the given url in the Second Life internal web browser
- static void loadURLInternal(const std::string &url, const std::string& target, const std::string& uuid = LLStringUtil::null);
- static void loadURLInternal(const std::string &url) { loadURLInternal(url, LLStringUtil::null); }
/// Load the given url in the operating system's web browser, async if we want to return immediately
/// before browser has spawned
- static void loadURLExternal(const std::string& url) { loadURLExternal(url, LLStringUtil::null); };
+ static void loadURLExternal(const std::string& url) {loadURLExternal(url, LLStringUtil::null);}
static void loadURLExternal(const std::string& url, const std::string& uuid);
static void loadURLExternal(const std::string& url, bool async, const std::string& uuid = LLStringUtil::null);
+ static void loadURL(const std::string& url, const std::string& target = LLStringUtil::null, const std::string& uuid = LLStringUtil::null);
+ // load content using built-in browser
+ static void loadURLInternal(const std::string &url, const std::string& target = LLStringUtil::null, const std::string& uuid = LLStringUtil::null);
+
/// Returns escaped url (eg, " " to "%20") - used by all loadURL methods
static std::string escapeURL(const std::string& url);
/// Expands various strings like [LANG], [VERSION], etc. in a URL
diff --git a/indra/newview/llwebprofile.cpp b/indra/newview/llwebprofile.cpp
new file mode 100644
index 0000000000..641f338f2c
--- /dev/null
+++ b/indra/newview/llwebprofile.cpp
@@ -0,0 +1,305 @@
+/**
+ * @file llwebprofile.cpp
+ * @brief Web profile access.
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llwebprofile.h"
+
+// libs
+#include "llbufferstream.h"
+#include "llhttpclient.h"
+#include "llimagepng.h"
+#include "llplugincookiestore.h"
+
+// newview
+#include "llpanelprofile.h" // for getProfileURL(). FIXME: move the method to LLAvatarActions
+#include "llviewermedia.h" // FIXME: don't use LLViewerMedia internals
+
+// third-party
+#include "reader.h" // JSON
+
+/*
+ * Workflow:
+ * 1. LLViewerMedia::setOpenIDCookie()
+ * -> GET https://my-demo.secondlife.com/ via LLViewerMediaWebProfileResponder
+ * -> LLWebProfile::setAuthCookie()
+ * 2. LLWebProfile::uploadImage()
+ * -> GET "https://my-demo.secondlife.com/snapshots/s3_upload_config" via ConfigResponder
+ * 3. LLWebProfile::post()
+ * -> POST <config_url> via PostImageResponder
+ * -> redirect
+ * -> GET <redirect_url> via PostImageRedirectResponder
+ */
+
+///////////////////////////////////////////////////////////////////////////////
+// LLWebProfileResponders::ConfigResponder
+
+class LLWebProfileResponders::ConfigResponder : public LLHTTPClient::Responder
+{
+ LOG_CLASS(LLWebProfileResponders::ConfigResponder);
+
+public:
+ ConfigResponder(LLPointer<LLImageFormatted> imagep)
+ : mImagep(imagep)
+ {
+ }
+
+ /*virtual*/ void completedRaw(
+ U32 status,
+ const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer)
+ {
+ LLBufferStream istr(channels, buffer.get());
+ std::stringstream strstrm;
+ strstrm << istr.rdbuf();
+ const std::string body = strstrm.str();
+
+ if (status != 200)
+ {
+ llwarns << "Failed to get upload config (" << status << ")" << llendl;
+ LLWebProfile::reportImageUploadStatus(false);
+ return;
+ }
+
+ Json::Value root;
+ Json::Reader reader;
+ if (!reader.parse(body, root))
+ {
+ llwarns << "Failed to parse upload config: " << reader.getFormatedErrorMessages() << llendl;
+ LLWebProfile::reportImageUploadStatus(false);
+ return;
+ }
+
+ // *TODO: 404 = not supported by the grid
+ // *TODO: increase timeout or handle 499 Expired
+
+ // Convert config to LLSD.
+ const Json::Value data = root["data"];
+ const std::string upload_url = root["url"].asString();
+ LLSD config;
+ config["acl"] = data["acl"].asString();
+ config["AWSAccessKeyId"] = data["AWSAccessKeyId"].asString();
+ config["Content-Type"] = data["Content-Type"].asString();
+ config["key"] = data["key"].asString();
+ config["policy"] = data["policy"].asString();
+ config["success_action_redirect"] = data["success_action_redirect"].asString();
+ config["signature"] = data["signature"].asString();
+ config["add_loc"] = data.get("add_loc", "0").asString();
+ config["caption"] = data.get("caption", "").asString();
+
+ // Do the actual image upload using the configuration.
+ LL_DEBUGS("Snapshots") << "Got upload config, POSTing image to " << upload_url << ", config=[" << config << "]" << llendl;
+ LLWebProfile::post(mImagep, config, upload_url);
+ }
+
+private:
+ LLPointer<LLImageFormatted> mImagep;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// LLWebProfilePostImageRedirectResponder
+class LLWebProfileResponders::PostImageRedirectResponder : public LLHTTPClient::Responder
+{
+ LOG_CLASS(LLWebProfileResponders::PostImageRedirectResponder);
+
+public:
+ /*virtual*/ void completedRaw(
+ U32 status,
+ const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer)
+ {
+ if (status != 200)
+ {
+ llwarns << "Failed to upload image: " << status << " " << reason << llendl;
+ LLWebProfile::reportImageUploadStatus(false);
+ return;
+ }
+
+ LLBufferStream istr(channels, buffer.get());
+ std::stringstream strstrm;
+ strstrm << istr.rdbuf();
+ const std::string body = strstrm.str();
+ llinfos << "Image uploaded." << llendl;
+ LL_DEBUGS("Snapshots") << "Uploading image succeeded. Response: [" << body << "]" << llendl;
+ LLWebProfile::reportImageUploadStatus(true);
+ }
+
+private:
+ LLPointer<LLImageFormatted> mImagep;
+};
+
+
+///////////////////////////////////////////////////////////////////////////////
+// LLWebProfileResponders::PostImageResponder
+class LLWebProfileResponders::PostImageResponder : public LLHTTPClient::Responder
+{
+ LOG_CLASS(LLWebProfileResponders::PostImageResponder);
+
+public:
+ /*virtual*/ void completedHeader(U32 status, const std::string& reason, const LLSD& content)
+ {
+ // Viewer seems to fail to follow a 303 redirect on POST request
+ // (URLRequest Error: 65, Send failed since rewinding of the data stream failed).
+ // Handle it manually.
+ if (status == 303)
+ {
+ LLSD headers = LLViewerMedia::getHeaders();
+ headers["Cookie"] = LLWebProfile::getAuthCookie();
+ const std::string& redir_url = content["location"];
+ LL_DEBUGS("Snapshots") << "Got redirection URL: " << redir_url << llendl;
+ LLHTTPClient::get(redir_url, new LLWebProfileResponders::PostImageRedirectResponder, headers);
+ }
+ else
+ {
+ llwarns << "Unexpected POST status: " << status << " " << reason << llendl;
+ LL_DEBUGS("Snapshots") << "headers: [" << content << "]" << llendl;
+ LLWebProfile::reportImageUploadStatus(false);
+ }
+ }
+
+ // Override just to suppress warnings.
+ /*virtual*/ void completedRaw(U32 status, const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer)
+ {
+ }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// LLWebProfile
+
+std::string LLWebProfile::sAuthCookie;
+LLWebProfile::status_callback_t LLWebProfile::mStatusCallback;
+
+// static
+void LLWebProfile::uploadImage(LLPointer<LLImageFormatted> image, const std::string& caption, bool add_location)
+{
+ // Get upload configuration data.
+ std::string config_url(getProfileURL(LLStringUtil::null) + "snapshots/s3_upload_config");
+ config_url += "?caption=" + LLURI::escape(caption);
+ config_url += "&add_loc=" + std::string(add_location ? "1" : "0");
+
+ LL_DEBUGS("Snapshots") << "Requesting " << config_url << llendl;
+ LLSD headers = LLViewerMedia::getHeaders();
+ headers["Cookie"] = getAuthCookie();
+ LLHTTPClient::get(config_url, new LLWebProfileResponders::ConfigResponder(image), headers);
+}
+
+// static
+void LLWebProfile::setAuthCookie(const std::string& cookie)
+{
+ LL_DEBUGS("Snapshots") << "Setting auth cookie: " << cookie << llendl;
+ sAuthCookie = cookie;
+}
+
+// static
+void LLWebProfile::post(LLPointer<LLImageFormatted> image, const LLSD& config, const std::string& url)
+{
+ if (dynamic_cast<LLImagePNG*>(image.get()) == 0)
+ {
+ llwarns << "Image to upload is not a PNG" << llendl;
+ llassert(dynamic_cast<LLImagePNG*>(image.get()) != 0);
+ return;
+ }
+
+ const std::string boundary = "----------------------------0123abcdefab";
+
+ LLSD headers = LLViewerMedia::getHeaders();
+ headers["Cookie"] = getAuthCookie();
+ headers["Content-Type"] = "multipart/form-data; boundary=" + boundary;
+
+ std::ostringstream body;
+
+ // *NOTE: The order seems to matter.
+ body << "--" << boundary << "\r\n"
+ << "Content-Disposition: form-data; name=\"key\"\r\n\r\n"
+ << config["key"].asString() << "\r\n";
+
+ body << "--" << boundary << "\r\n"
+ << "Content-Disposition: form-data; name=\"AWSAccessKeyId\"\r\n\r\n"
+ << config["AWSAccessKeyId"].asString() << "\r\n";
+
+ body << "--" << boundary << "\r\n"
+ << "Content-Disposition: form-data; name=\"acl\"\r\n\r\n"
+ << config["acl"].asString() << "\r\n";
+
+ body << "--" << boundary << "\r\n"
+ << "Content-Disposition: form-data; name=\"Content-Type\"\r\n\r\n"
+ << config["Content-Type"].asString() << "\r\n";
+
+ body << "--" << boundary << "\r\n"
+ << "Content-Disposition: form-data; name=\"policy\"\r\n\r\n"
+ << config["policy"].asString() << "\r\n";
+
+ body << "--" << boundary << "\r\n"
+ << "Content-Disposition: form-data; name=\"signature\"\r\n\r\n"
+ << config["signature"].asString() << "\r\n";
+
+ body << "--" << boundary << "\r\n"
+ << "Content-Disposition: form-data; name=\"success_action_redirect\"\r\n\r\n"
+ << config["success_action_redirect"].asString() << "\r\n";
+
+ body << "--" << boundary << "\r\n"
+ << "Content-Disposition: form-data; name=\"file\"; filename=\"snapshot.png\"\r\n"
+ << "Content-Type: image/png\r\n\r\n";
+
+ // Insert the image data.
+ // *FIX: Treating this as a string will probably screw it up ...
+ U8* image_data = image->getData();
+ for (S32 i = 0; i < image->getDataSize(); ++i)
+ {
+ body << image_data[i];
+ }
+
+ body << "\r\n--" << boundary << "--\r\n";
+
+ // postRaw() takes ownership of the buffer and releases it later.
+ size_t size = body.str().size();
+ U8 *data = new U8[size];
+ memcpy(data, body.str().data(), size);
+
+ // Send request, successful upload will trigger posting metadata.
+ LLHTTPClient::postRaw(url, data, size, new LLWebProfileResponders::PostImageResponder(), headers);
+}
+
+// static
+void LLWebProfile::reportImageUploadStatus(bool ok)
+{
+ if (mStatusCallback)
+ {
+ mStatusCallback(ok);
+ }
+}
+
+// static
+std::string LLWebProfile::getAuthCookie()
+{
+ // This is needed to test image uploads on Linux viewer built with OpenSSL 1.0.0 (0.9.8 works fine).
+ const char* debug_cookie = getenv("LL_SNAPSHOT_COOKIE");
+ return debug_cookie ? debug_cookie : sAuthCookie;
+}
diff --git a/indra/newview/llwebprofile.h b/indra/newview/llwebprofile.h
new file mode 100644
index 0000000000..10279bffac
--- /dev/null
+++ b/indra/newview/llwebprofile.h
@@ -0,0 +1,69 @@
+/**
+ * @file llwebprofile.h
+ * @brief Web profile access.
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLWEBPROFILE_H
+#define LL_LLWEBPROFILE_H
+
+#include "llimage.h"
+
+namespace LLWebProfileResponders
+{
+ class ConfigResponder;
+ class PostImageResponder;
+ class PostImageRedirectResponder;
+};
+
+/**
+ * @class LLWebProfile
+ *
+ * Manages interaction with, a web service allowing the upload of snapshot images
+ * taken within the viewer.
+ */
+class LLWebProfile
+{
+ LOG_CLASS(LLWebProfile);
+
+public:
+ typedef boost::function<void(bool ok)> status_callback_t;
+
+ static void uploadImage(LLPointer<LLImageFormatted> image, const std::string& caption, bool add_location);
+ static void setAuthCookie(const std::string& cookie);
+ static void setImageUploadResultCallback(status_callback_t cb) { mStatusCallback = cb; }
+
+private:
+ friend class LLWebProfileResponders::ConfigResponder;
+ friend class LLWebProfileResponders::PostImageResponder;
+ friend class LLWebProfileResponders::PostImageRedirectResponder;
+
+ static void post(LLPointer<LLImageFormatted> image, const LLSD& config, const std::string& url);
+ static void reportImageUploadStatus(bool ok);
+ static std::string getAuthCookie();
+
+ static std::string sAuthCookie;
+ static status_callback_t mStatusCallback;
+};
+
+#endif // LL_LLWEBPROFILE_H
diff --git a/indra/newview/llwind.cpp b/indra/newview/llwind.cpp
index 69d3090442..4c39fb5b74 100644
--- a/indra/newview/llwind.cpp
+++ b/indra/newview/llwind.cpp
@@ -46,16 +46,12 @@
#include "llworld.h"
-const F32 CLOUD_DIVERGENCE_COEF = 0.5f;
-
-
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
LLWind::LLWind()
-: mSize(16),
- mCloudDensityp(NULL)
+: mSize(16)
{
init();
}
@@ -65,8 +61,6 @@ LLWind::~LLWind()
{
delete [] mVelX;
delete [] mVelY;
- delete [] mCloudVelX;
- delete [] mCloudVelY;
}
@@ -77,31 +71,23 @@ LLWind::~LLWind()
void LLWind::init()
{
+ LL_DEBUGS("Wind") << "initializing wind size: "<< mSize << LL_ENDL;
+
// Initialize vector data
mVelX = new F32[mSize*mSize];
mVelY = new F32[mSize*mSize];
- mCloudVelX = new F32[mSize*mSize];
- mCloudVelY = new F32[mSize*mSize];
-
S32 i;
for (i = 0; i < mSize*mSize; i++)
{
mVelX[i] = 0.5f;
mVelY[i] = 0.5f;
- mCloudVelX[i] = 0.0f;
- mCloudVelY[i] = 0.0f;
}
}
void LLWind::decompress(LLBitPack &bitpack, LLGroupHeader *group_headerp)
{
- if (!mCloudDensityp)
- {
- return;
- }
-
LLPatchHeader patch_header;
S32 buffer[16*16];
@@ -122,22 +108,15 @@ void LLWind::decompress(LLBitPack &bitpack, LLGroupHeader *group_headerp)
decode_patch(bitpack, buffer);
decompress_patch(mVelY, buffer, &patch_header);
-
-
S32 i, j, k;
- // HACK -- mCloudVelXY is the same as mVelXY, except we add a divergence
- // that is proportional to the gradient of the cloud density
- // ==> this helps to clump clouds together
- // NOTE ASSUMPTION: cloud density has the same dimensions as the wind field
- // This needs to be fixed... causes discrepency at region boundaries
for (j=1; j<mSize-1; j++)
{
for (i=1; i<mSize-1; i++)
{
k = i + j * mSize;
- *(mCloudVelX + k) = *(mVelX + k) + CLOUD_DIVERGENCE_COEF * (*(mCloudDensityp + k + 1) - *(mCloudDensityp + k - 1));
- *(mCloudVelY + k) = *(mVelY + k) + CLOUD_DIVERGENCE_COEF * (*(mCloudDensityp + k + mSize) - *(mCloudDensityp + k - mSize));
+ *(mVelX + k) = *(mVelX + k);
+ *(mVelY + k) = *(mVelY + k);
}
}
@@ -145,29 +124,29 @@ void LLWind::decompress(LLBitPack &bitpack, LLGroupHeader *group_headerp)
for (j=1; j<mSize-1; j++)
{
k = i + j * mSize;
- *(mCloudVelX + k) = *(mVelX + k) + CLOUD_DIVERGENCE_COEF * (*(mCloudDensityp + k) - *(mCloudDensityp + k - 2));
- *(mCloudVelY + k) = *(mVelY + k) + CLOUD_DIVERGENCE_COEF * (*(mCloudDensityp + k + mSize) - *(mCloudDensityp + k - mSize));
+ *(mVelX + k) = *(mVelX + k);
+ *(mVelY + k) = *(mVelY + k);
}
i = 0;
for (j=1; j<mSize-1; j++)
{
k = i + j * mSize;
- *(mCloudVelX + k) = *(mVelX + k) + CLOUD_DIVERGENCE_COEF * (*(mCloudDensityp + k + 2) - *(mCloudDensityp + k));
- *(mCloudVelY + k) = *(mVelY + k) + CLOUD_DIVERGENCE_COEF * (*(mCloudDensityp + k + mSize) - *(mCloudDensityp + k + mSize));
+ *(mVelX + k) = *(mVelX + k);
+ *(mVelY + k) = *(mVelY + k);
}
j = mSize - 1;
for (i=1; i<mSize-1; i++)
{
k = i + j * mSize;
- *(mCloudVelX + k) = *(mVelX + k) + CLOUD_DIVERGENCE_COEF * (*(mCloudDensityp + k + 1) - *(mCloudDensityp + k - 1));
- *(mCloudVelY + k) = *(mVelY + k) + CLOUD_DIVERGENCE_COEF * (*(mCloudDensityp + k) - *(mCloudDensityp + k - 2*mSize));
+ *(mVelX + k) = *(mVelX + k);
+ *(mVelY + k) = *(mVelY + k);
}
j = 0;
for (i=1; i<mSize-1; i++)
{
k = i + j * mSize;
- *(mCloudVelX + k) = *(mVelX + k) + CLOUD_DIVERGENCE_COEF * (*(mCloudDensityp + k + 1) - *(mCloudDensityp + k -1));
- *(mCloudVelY + k) = *(mVelY + k) + CLOUD_DIVERGENCE_COEF * (*(mCloudDensityp + k + 2*mSize) - *(mCloudDensityp + k));
+ *(mVelX + k) = *(mVelX + k);
+ *(mVelY + k) = *(mVelY + k);
}
}
@@ -280,74 +259,6 @@ LLVector3 LLWind::getVelocity(const LLVector3 &pos_region)
return r_val * WIND_SCALE_HACK;
}
-
-LLVector3 LLWind::getCloudVelocity(const LLVector3 &pos_region)
-{
- llassert(mSize == 16);
- // Resolves value of wind at a location relative to SW corner of region
- //
- // Returns wind magnitude in X,Y components of vector3
- LLVector3 r_val;
- F32 dx,dy;
- S32 k;
-
- LLVector3 pos_clamped_region(pos_region);
-
- F32 region_width_meters = LLWorld::getInstance()->getRegionWidthInMeters();
-
- if (pos_clamped_region.mV[VX] < 0.f)
- {
- pos_clamped_region.mV[VX] = 0.f;
- }
- else if (pos_clamped_region.mV[VX] >= region_width_meters)
- {
- pos_clamped_region.mV[VX] = (F32) fmod(pos_clamped_region.mV[VX], region_width_meters);
- }
-
- if (pos_clamped_region.mV[VY] < 0.f)
- {
- pos_clamped_region.mV[VY] = 0.f;
- }
- else if (pos_clamped_region.mV[VY] >= region_width_meters)
- {
- pos_clamped_region.mV[VY] = (F32) fmod(pos_clamped_region.mV[VY], region_width_meters);
- }
-
-
- S32 i = llfloor(pos_clamped_region.mV[VX] * mSize / region_width_meters);
- S32 j = llfloor(pos_clamped_region.mV[VY] * mSize / region_width_meters);
- k = i + j*mSize;
- dx = ((pos_clamped_region.mV[VX] * mSize / region_width_meters) - (F32) i);
- dy = ((pos_clamped_region.mV[VY] * mSize / region_width_meters) - (F32) j);
-
- if ((i < mSize-1) && (j < mSize-1))
- {
- // Interior points, no edges
- r_val.mV[VX] = mCloudVelX[k]*(1.0f - dx)*(1.0f - dy) +
- mCloudVelX[k + 1]*dx*(1.0f - dy) +
- mCloudVelX[k + mSize]*dy*(1.0f - dx) +
- mCloudVelX[k + mSize + 1]*dx*dy;
- r_val.mV[VY] = mCloudVelY[k]*(1.0f - dx)*(1.0f - dy) +
- mCloudVelY[k + 1]*dx*(1.0f - dy) +
- mCloudVelY[k + mSize]*dy*(1.0f - dx) +
- mCloudVelY[k + mSize + 1]*dx*dy;
- }
- else
- {
- r_val.mV[VX] = mCloudVelX[k];
- r_val.mV[VY] = mCloudVelY[k];
- }
-
- r_val.mV[VZ] = 0.f;
- return r_val * WIND_SCALE_HACK;
-}
-
-
-void LLWind::setCloudDensityPointer(F32 *densityp)
-{
- mCloudDensityp = densityp;
-}
-
void LLWind::setOriginGlobal(const LLVector3d &origin_global)
{
mOriginGlobal = origin_global;
diff --git a/indra/newview/llwind.h b/indra/newview/llwind.h
index 925cb6d642..3b57f07124 100644
--- a/indra/newview/llwind.h
+++ b/indra/newview/llwind.h
@@ -27,7 +27,6 @@
#ifndef LL_LLWIND_H
#define LL_LLWIND_H
-//#include "vmath.h"
#include "llmath.h"
#include "v3math.h"
#include "v3dmath.h"
@@ -44,25 +43,21 @@ public:
~LLWind();
void renderVectors();
LLVector3 getVelocity(const LLVector3 &location); // "location" is region-local
- LLVector3 getCloudVelocity(const LLVector3 &location); // "location" is region-local
LLVector3 getVelocityNoisy(const LLVector3 &location, const F32 dim); // "location" is region-local
void decompress(LLBitPack &bitpack, LLGroupHeader *group_headerp);
LLVector3 getAverage();
- void setCloudDensityPointer(F32 *densityp);
void setOriginGlobal(const LLVector3d &origin_global);
private:
S32 mSize;
F32 * mVelX;
F32 * mVelY;
- F32 * mCloudVelX;
- F32 * mCloudVelY;
- F32 * mCloudDensityp;
LLVector3d mOriginGlobal;
void init();
+ LOG_CLASS(LLWind);
};
#endif
diff --git a/indra/newview/llwindowlistener.cpp b/indra/newview/llwindowlistener.cpp
new file mode 100644
index 0000000000..28f959eb71
--- /dev/null
+++ b/indra/newview/llwindowlistener.cpp
@@ -0,0 +1,505 @@
+/**
+ * @file llwindowlistener.cpp
+ * @brief EventAPI interface for injecting input into LLWindow
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "linden_common.h"
+
+#include "llwindowlistener.h"
+
+#include "llcoord.h"
+#include "llfocusmgr.h"
+#include "llkeyboard.h"
+#include "llwindowcallbacks.h"
+#include "llui.h"
+#include "llview.h"
+#include "llviewinject.h"
+#include "llviewerwindow.h"
+#include "llviewerkeyboard.h"
+#include "llrootview.h"
+#include "llsdutil.h"
+#include "stringize.h"
+#include <typeinfo>
+#include <map>
+#include <boost/scoped_ptr.hpp>
+#include <boost/lambda/core.hpp>
+#include <boost/lambda/bind.hpp>
+
+namespace bll = boost::lambda;
+
+LLWindowListener::LLWindowListener(LLViewerWindow *window, const KeyboardGetter& kbgetter)
+ : LLEventAPI("LLWindow", "Inject input events into the LLWindow instance"),
+ mWindow(window),
+ mKbGetter(kbgetter)
+{
+ std::string keySomething =
+ "Given [\"keysym\"], [\"keycode\"] or [\"char\"], inject the specified ";
+ std::string keyExplain =
+ "(integer keycode values, or keysym string from any addKeyName() call in\n"
+ "http://hg.secondlife.com/viewer-development/src/tip/indra/llwindow/llkeyboard.cpp )\n";
+ std::string mask =
+ "Specify optional [\"mask\"] as an array containing any of \"CTL\", \"ALT\",\n"
+ "\"SHIFT\" or \"MAC_CONTROL\"; the corresponding modifier bits will be combined\n"
+ "to form the mask used with the event.";
+
+ std::string given = "Given ";
+ std::string mouseParams =
+ "optional [\"path\"], optional [\"x\"] and [\"y\"], inject the requested mouse ";
+ std::string buttonParams =
+ std::string("[\"button\"], ") + mouseParams;
+ std::string buttonExplain =
+ "(button values \"LEFT\", \"MIDDLE\", \"RIGHT\")\n";
+ std::string paramsExplain =
+ "[\"path\"] is as for LLUI::resolvePath(), described in\n"
+ "http://hg.secondlife.com/viewer-development/src/tip/indra/llui/llui.h\n"
+ "If you omit [\"path\"], you must specify both [\"x\"] and [\"y\"].\n"
+ "If you specify [\"path\"] without both [\"x\"] and [\"y\"], will synthesize (x, y)\n"
+ "in the center of the LLView selected by [\"path\"].\n"
+ "You may specify [\"path\"] with both [\"x\"] and [\"y\"], will use your (x, y).\n"
+ "This may cause the LLView selected by [\"path\"] to reject the event.\n"
+ "Optional [\"reply\"] requests a reply event on the named LLEventPump.\n"
+ "reply[\"error\"] isUndefined (None) on success, else an explanatory message.\n";
+
+ add("getInfo",
+ "Get information about the ui element specified by [\"path\"]",
+ &LLWindowListener::getInfo,
+ LLSDMap("reply", LLSD()));
+ add("getPaths",
+ "Send on [\"reply\"] an event in which [\"paths\"] is an array of valid LLView\n"
+ "pathnames. Optional [\"under\"] pathname specifies the base node under which\n"
+ "to list; all nodes from root if no [\"under\"].",
+ &LLWindowListener::getPaths,
+ LLSDMap("reply", LLSD()));
+ add("keyDown",
+ keySomething + "keypress event.\n" + keyExplain + mask,
+ &LLWindowListener::keyDown);
+ add("keyUp",
+ keySomething + "key release event.\n" + keyExplain + mask,
+ &LLWindowListener::keyUp);
+ add("mouseDown",
+ given + buttonParams + "click event.\n" + buttonExplain + paramsExplain + mask,
+ &LLWindowListener::mouseDown);
+ add("mouseUp",
+ given + buttonParams + "release event.\n" + buttonExplain + paramsExplain + mask,
+ &LLWindowListener::mouseUp);
+ add("mouseMove",
+ given + mouseParams + "movement event.\n" + paramsExplain + mask,
+ &LLWindowListener::mouseMove);
+ add("mouseScroll",
+ "Given an integer number of [\"clicks\"], inject the requested mouse scroll event.\n"
+ "(positive clicks moves downward through typical content)",
+ &LLWindowListener::mouseScroll);
+}
+
+template <typename MAPPED>
+class StringLookup
+{
+private:
+ std::string mDesc;
+ typedef std::map<std::string, MAPPED> Map;
+ Map mMap;
+
+public:
+ StringLookup(const std::string& desc): mDesc(desc) {}
+
+ MAPPED lookup(const typename Map::key_type& key) const
+ {
+ typename Map::const_iterator found = mMap.find(key);
+ if (found == mMap.end())
+ {
+ LL_WARNS("LLWindowListener") << "Unknown " << mDesc << " '" << key << "'" << LL_ENDL;
+ return MAPPED();
+ }
+ return found->second;
+ }
+
+protected:
+ void add(const typename Map::key_type& key, const typename Map::mapped_type& value)
+ {
+ mMap.insert(typename Map::value_type(key, value));
+ }
+};
+
+namespace {
+
+// helper for getMask()
+MASK lookupMask_(const std::string& maskname)
+{
+ // It's unclear to me whether MASK_MAC_CONTROL is important, but it's not
+ // supported by maskFromString(). Handle that specially.
+ if (maskname == "MAC_CONTROL")
+ {
+ return MASK_MAC_CONTROL;
+ }
+ else
+ {
+ // In case of lookup failure, return MASK_NONE, which won't affect our
+ // caller's OR.
+ MASK mask(MASK_NONE);
+ LLKeyboard::maskFromString(maskname, &mask);
+ return mask;
+ }
+}
+
+MASK getMask(const LLSD& event)
+{
+ LLSD masknames(event["mask"]);
+ if (! masknames.isArray())
+ {
+ // If event["mask"] is a single string, perform normal lookup on it.
+ return lookupMask_(masknames);
+ }
+
+ // Here event["mask"] is an array of mask-name strings. OR together their
+ // corresponding bits.
+ MASK mask(MASK_NONE);
+ for (LLSD::array_const_iterator ai(masknames.beginArray()), aend(masknames.endArray());
+ ai != aend; ++ai)
+ {
+ mask |= lookupMask_(*ai);
+ }
+ return mask;
+}
+
+KEY getKEY(const LLSD& event)
+{
+ if (event.has("keysym"))
+ {
+ // Initialize to KEY_NONE; that way we can ignore the bool return from
+ // keyFromString() and, in the lookup-fail case, simply return KEY_NONE.
+ KEY key(KEY_NONE);
+ LLKeyboard::keyFromString(event["keysym"], &key);
+ return key;
+ }
+ else if (event.has("keycode"))
+ {
+ return KEY(event["keycode"].asInteger());
+ }
+ else
+ {
+ return KEY(event["char"].asString()[0]);
+ }
+}
+
+} // namespace
+
+void LLWindowListener::getInfo(LLSD const & evt)
+{
+ Response response(LLSD(), evt);
+
+ if (evt.has("path"))
+ {
+ std::string path(evt["path"]);
+ LLView * target_view = LLUI::resolvePath(LLUI::getRootView(), path);
+ if (target_view != 0)
+ {
+ response.setResponse(target_view->getInfo());
+ }
+ else
+ {
+ response.error(STRINGIZE(evt["op"].asString() << " request "
+ "specified invalid \"path\": '" << path << "'"));
+ }
+ }
+ else
+ {
+ response.error(
+ STRINGIZE(evt["op"].asString() << "request did not provide a path" ));
+ }
+}
+
+void LLWindowListener::getPaths(LLSD const & request)
+{
+ Response response(LLSD(), request);
+ LLView *root(LLUI::getRootView()), *base(NULL);
+ // Capturing request["under"] as string means we conflate the case in
+ // which there is no ["under"] key with the case in which its value is the
+ // empty string. That seems to make sense to me.
+ std::string under(request["under"]);
+
+ // Deal with optional "under" parameter
+ if (under.empty())
+ {
+ base = root;
+ }
+ else
+ {
+ base = LLUI::resolvePath(root, under);
+ if (! base)
+ {
+ return response.error(STRINGIZE(request["op"].asString() << " request "
+ "specified invalid \"under\" path: '" << under << "'"));
+ }
+ }
+
+ // Traverse the entire subtree under 'base', collecting pathnames
+ for (LLView::tree_iterator_t ti(base->beginTreeDFS()), tend(base->endTreeDFS());
+ ti != tend; ++ti)
+ {
+ response["paths"].append((*ti)->getPathname());
+ }
+}
+
+void LLWindowListener::keyDown(LLSD const & evt)
+{
+ Response response(LLSD(), evt);
+
+ if (evt.has("path"))
+ {
+ std::string path(evt["path"]);
+ LLView * target_view = LLUI::resolvePath(LLUI::getRootView(), path);
+ if (target_view == 0)
+ {
+ response.error(STRINGIZE(evt["op"].asString() << " request "
+ "specified invalid \"path\": '" << path << "'"));
+ }
+ else if(target_view->isAvailable())
+ {
+ response.setResponse(target_view->getInfo());
+
+ gFocusMgr.setKeyboardFocus(target_view);
+ KEY key = getKEY(evt);
+ MASK mask = getMask(evt);
+ gViewerKeyboard.handleKey(key, mask, false);
+ if(key < 0x80) mWindow->handleUnicodeChar(key, mask);
+ }
+ else
+ {
+ response.error(STRINGIZE(evt["op"].asString() << " request "
+ "element specified by \"path\": '" << path << "'"
+ << " is not visible"));
+ }
+ }
+ else
+ {
+ mKbGetter()->handleTranslatedKeyDown(getKEY(evt), getMask(evt));
+ }
+}
+
+void LLWindowListener::keyUp(LLSD const & evt)
+{
+ Response response(LLSD(), evt);
+
+ if (evt.has("path"))
+ {
+ std::string path(evt["path"]);
+ LLView * target_view = LLUI::resolvePath(LLUI::getRootView(), path);
+ if (target_view == 0 )
+ {
+ response.error(STRINGIZE(evt["op"].asString() << " request "
+ "specified invalid \"path\": '" << path << "'"));
+ }
+ else if (target_view->isAvailable())
+ {
+ response.setResponse(target_view->getInfo());
+
+ gFocusMgr.setKeyboardFocus(target_view);
+ mKbGetter()->handleTranslatedKeyUp(getKEY(evt), getMask(evt));
+ }
+ else
+ {
+ response.error(STRINGIZE(evt["op"].asString() << " request "
+ "element specified byt \"path\": '" << path << "'"
+ << " is not visible"));
+ }
+ }
+ else
+ {
+ mKbGetter()->handleTranslatedKeyUp(getKEY(evt), getMask(evt));
+ }
+}
+
+// for WhichButton
+typedef BOOL (LLWindowCallbacks::*MouseMethod)(LLWindow *, LLCoordGL, MASK);
+struct Actions
+{
+ Actions(const MouseMethod& d, const MouseMethod& u): down(d), up(u), valid(true) {}
+ Actions(): valid(false) {}
+ MouseMethod down, up;
+ bool valid;
+};
+
+struct WhichButton: public StringLookup<Actions>
+{
+ WhichButton(): StringLookup<Actions>("mouse button")
+ {
+ add("LEFT", Actions(&LLWindowCallbacks::handleMouseDown,
+ &LLWindowCallbacks::handleMouseUp));
+ add("RIGHT", Actions(&LLWindowCallbacks::handleRightMouseDown,
+ &LLWindowCallbacks::handleRightMouseUp));
+ add("MIDDLE", Actions(&LLWindowCallbacks::handleMiddleMouseDown,
+ &LLWindowCallbacks::handleMiddleMouseUp));
+ }
+};
+static WhichButton buttons;
+
+typedef boost::function<bool(LLCoordGL, MASK)> MouseFunc;
+
+static void mouseEvent(const MouseFunc& func, const LLSD& request)
+{
+ // Ensure we send response
+ LLEventAPI::Response response(LLSD(), request);
+ // We haven't yet established whether the incoming request has "x" and "y",
+ // but capture this anyway, with 0 for omitted values.
+ LLCoordGL pos(request["x"].asInteger(), request["y"].asInteger());
+ bool has_pos(request.has("x") && request.has("y"));
+
+ boost::scoped_ptr<LLView::TemporaryDrilldownFunc> tempfunc;
+
+ // Documentation for mouseDown(), mouseUp() and mouseMove() claims you
+ // must either specify ["path"], or both of ["x"] and ["y"]. You MAY
+ // specify all. Let's say that passing "path" as an empty string is
+ // equivalent to not passing it at all.
+ std::string path(request["path"]);
+ if (path.empty())
+ {
+ // Without "path", you must specify both "x" and "y".
+ if (! has_pos)
+ {
+ return response.error(STRINGIZE(request["op"].asString() << " request "
+ "without \"path\" must specify both \"x\" and \"y\": "
+ << request));
+ }
+ }
+ else // ! path.empty()
+ {
+ LLView* root = LLUI::getRootView();
+ LLView* target = LLUI::resolvePath(root, path);
+ if (! target)
+ {
+ return response.error(STRINGIZE(request["op"].asString() << " request "
+ "specified invalid \"path\": '" << path << "'"));
+ }
+
+ response.setResponse(target->getInfo());
+
+ // The intent of this test is to prevent trying to drill down to a
+ // widget in a hidden floater, or on a tab that's not current, etc.
+ if (! target->isInVisibleChain())
+ {
+ return response.error(STRINGIZE(request["op"].asString() << " request "
+ "specified \"path\" not currently visible: '"
+ << path << "'"));
+ }
+
+ // This test isn't folded in with the above error case since you can
+ // (e.g.) pop up a tooltip even for a disabled widget.
+ if (! target->isInEnabledChain())
+ {
+ response.warn(STRINGIZE(request["op"].asString() << " request "
+ "specified \"path\" not currently enabled: '"
+ << path << "'"));
+ }
+
+ if (! has_pos)
+ {
+ LLRect rect(target->calcScreenRect());
+ pos.set(rect.getCenterX(), rect.getCenterY());
+ // nonstandard warning tactic: probably usual case; we want event
+ // sender to know synthesized (x, y), but maybe don't need to log?
+ response["warnings"].append(STRINGIZE("using center point ("
+ << pos.mX << ", " << pos.mY << ")"));
+ }
+
+/*==========================================================================*|
+ // NEVER MIND: the LLView tree defines priority handler layers in
+ // front of the normal widget set, so this has never yet produced
+ // anything but spam warnings. (sigh)
+
+ // recursive childFromPoint() should give us the frontmost, leafmost
+ // widget at the specified (x, y).
+ LLView* frontmost = root->childFromPoint(pos.mX, pos.mY, true);
+ if (frontmost != target)
+ {
+ response.warn(STRINGIZE(request["op"].asString() << " request "
+ "specified \"path\" = '" << path
+ << "', but frontmost LLView at (" << pos.mX << ", " << pos.mY
+ << ") is '" << LLView::getPathname(frontmost) << "'"));
+ }
+|*==========================================================================*/
+
+ // Instantiate a TemporaryDrilldownFunc to route incoming mouse events
+ // to the target LLView*. But put it on the heap since "path" is
+ // optional. Nonetheless, manage it with a boost::scoped_ptr so it
+ // will be destroyed when we leave.
+ tempfunc.reset(new LLView::TemporaryDrilldownFunc(llview::TargetEvent(target)));
+ }
+
+ // The question of whether the requested LLView actually handled the
+ // specified event is important enough, and its handling unclear enough,
+ // to warrant a separate response attribute. Instead of deciding here to
+ // make it a warning, or an error, let caller decide.
+ response["handled"] = func(pos, getMask(request));
+
+ // On exiting this scope, response will send, tempfunc will restore the
+ // normal pointInView(x, y) containment logic, etc.
+}
+
+void LLWindowListener::mouseDown(LLSD const & request)
+{
+ Actions actions(buttons.lookup(request["button"]));
+ if (actions.valid)
+ {
+ // Normally you can pass NULL to an LLWindow* without compiler
+ // complaint, but going through boost::lambda::bind() evidently
+ // bypasses that special case: it only knows you're trying to pass an
+ // int to a pointer. Explicitly cast NULL to the desired pointer type.
+ mouseEvent(bll::bind(actions.down, mWindow,
+ static_cast<LLWindow*>(NULL), bll::_1, bll::_2),
+ request);
+ }
+}
+
+void LLWindowListener::mouseUp(LLSD const & request)
+{
+ Actions actions(buttons.lookup(request["button"]));
+ if (actions.valid)
+ {
+ mouseEvent(bll::bind(actions.up, mWindow,
+ static_cast<LLWindow*>(NULL), bll::_1, bll::_2),
+ request);
+ }
+}
+
+void LLWindowListener::mouseMove(LLSD const & request)
+{
+ // We want to call the same central mouseEvent() routine for
+ // handleMouseMove() as for button clicks. But handleMouseMove() returns
+ // void, whereas mouseEvent() accepts a function returning bool -- and
+ // uses that bool return. Use (void-lambda-expression, true) to construct
+ // a callable that returns bool anyway. Pass 'true' because we expect that
+ // our caller will usually treat 'false' as a problem.
+ mouseEvent((bll::bind(&LLWindowCallbacks::handleMouseMove, mWindow,
+ static_cast<LLWindow*>(NULL), bll::_1, bll::_2),
+ true),
+ request);
+}
+
+void LLWindowListener::mouseScroll(LLSD const & request)
+{
+ S32 clicks = request["clicks"].asInteger();
+
+ mWindow->handleScrollWheel(NULL, clicks);
+}
diff --git a/indra/newview/llwindowlistener.h b/indra/newview/llwindowlistener.h
new file mode 100644
index 0000000000..7af5ab3b9f
--- /dev/null
+++ b/indra/newview/llwindowlistener.h
@@ -0,0 +1,57 @@
+/**
+ * @file llwindowlistener.h
+ * @brief EventAPI interface for injecting input into LLWindow
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLWINDOWLISTENER_H
+#define LL_LLWINDOWLISTENER_H
+
+#include "lleventapi.h"
+#include <boost/function.hpp>
+
+class LLKeyboard;
+class LLViewerWindow;
+
+class LLWindowListener : public LLEventAPI
+{
+public:
+ typedef boost::function<LLKeyboard*()> KeyboardGetter;
+ LLWindowListener(LLViewerWindow * window, const KeyboardGetter& kbgetter);
+
+ void getInfo(LLSD const & evt);
+ void getPaths(LLSD const & evt);
+ void keyDown(LLSD const & evt);
+ void keyUp(LLSD const & evt);
+ void mouseDown(LLSD const & evt);
+ void mouseUp(LLSD const & evt);
+ void mouseMove(LLSD const & evt);
+ void mouseScroll(LLSD const & evt);
+
+private:
+ LLViewerWindow * mWindow;
+ KeyboardGetter mKbGetter;
+};
+
+
+#endif // LL_LLWINDOWLISTENER_H
diff --git a/indra/newview/llwlanimator.cpp b/indra/newview/llwlanimator.cpp
index a94a2e41aa..e568638cf6 100644
--- a/indra/newview/llwlanimator.cpp
+++ b/indra/newview/llwlanimator.cpp
@@ -30,20 +30,31 @@
#include "llsky.h"
#include "pipeline.h"
#include "llwlparammanager.h"
+#include "llwaterparammanager.h"
-LLWLAnimator::LLWLAnimator() : mStartTime(0), mDayRate(1), mDayTime(0),
- mIsRunning(FALSE), mUseLindenTime(false)
+extern LLControlGroup gSavedSettings;
+
+F64 LLWLAnimator::INTERP_TOTAL_SECONDS = 3.f;
+
+LLWLAnimator::LLWLAnimator() : mStartTime(0.f), mDayRate(1.f), mDayTime(0.f),
+ mIsRunning(FALSE), mIsInterpolating(FALSE), mTimeType(TIME_LINDEN),
+ mInterpStartTime(), mInterpEndTime()
{
- mDayTime = 0;
+ mInterpBeginWL = new LLWLParamSet();
+ mInterpBeginWater = new LLWaterParamSet();
+ mInterpEndWater = new LLWaterParamSet();
}
void LLWLAnimator::update(LLWLParamSet& curParams)
{
+ //llassert(mUseLindenTime != mUseLocalTime);
+
F64 curTime;
curTime = getDayTime();
// don't do anything if empty
- if(mTimeTrack.size() == 0) {
+ if(mTimeTrack.size() == 0)
+ {
return;
}
@@ -53,13 +64,15 @@ void LLWLAnimator::update(LLWLParamSet& curParams)
mSecondIt++;
// grab the two tween iterators
- while(mSecondIt != mTimeTrack.end() && curTime > mSecondIt->first) {
+ while(mSecondIt != mTimeTrack.end() && curTime > mSecondIt->first)
+ {
mFirstIt++;
mSecondIt++;
}
// scroll it around when you get to the end
- if(mSecondIt == mTimeTrack.end() || mFirstIt->first > curTime) {
+ if(mSecondIt == mTimeTrack.end() || mFirstIt->first > curTime)
+ {
mSecondIt = mTimeTrack.begin();
mFirstIt = mTimeTrack.end();
mFirstIt--;
@@ -67,70 +80,111 @@ void LLWLAnimator::update(LLWLParamSet& curParams)
F32 weight = 0;
- if(mFirstIt->first < mSecondIt->first) {
+ if(mFirstIt->first < mSecondIt->first)
+ {
// get the delta time and the proper weight
weight = F32 (curTime - mFirstIt->first) /
(mSecondIt->first - mFirstIt->first);
// handle the ends
- } else if(mFirstIt->first > mSecondIt->first) {
+ }
+ else if(mFirstIt->first > mSecondIt->first)
+ {
// right edge of time line
- if(curTime >= mFirstIt->first) {
+ if(curTime >= mFirstIt->first)
+ {
weight = F32 (curTime - mFirstIt->first) /
((1 + mSecondIt->first) - mFirstIt->first);
-
// left edge of time line
- } else {
+ }
+ else
+ {
weight = F32 ((1 + curTime) - mFirstIt->first) /
((1 + mSecondIt->first) - mFirstIt->first);
}
-
// handle same as whatever the last one is
- } else {
+ }
+ else
+ {
weight = 1;
}
+ if(mIsInterpolating)
+ {
+ // *TODO_JACOB: this is kind of laggy. Not sure why. The part that lags is the curParams.mix call, and none of the other mixes. It works, though.
+ clock_t current = clock();
+ if(current >= mInterpEndTime)
+ {
+ mIsInterpolating = false;
+ return;
+ }
+
+ // determine moving target for final interpolation value
+ // *TODO: this will not work with lazy loading of sky presets.
+ LLWLParamSet buf = LLWLParamSet();
+ buf.setAll(LLWLParamManager::getInstance()->mParamList[mFirstIt->second].getAll()); // just give it some values, otherwise it has no params to begin with (see comment in constructor)
+ buf.mix(LLWLParamManager::getInstance()->mParamList[mFirstIt->second], LLWLParamManager::getInstance()->mParamList[mSecondIt->second], weight); // mix to determine moving target for interpolation finish (as below)
+
+ // mix from previous value to moving target
+ weight = (current - mInterpStartTime) / (INTERP_TOTAL_SECONDS * CLOCKS_PER_SEC);
+ curParams.mix(*mInterpBeginWL, buf, weight);
+
+ // mix water
+ LLWaterParamManager::getInstance()->mCurParams.mix(*mInterpBeginWater, *mInterpEndWater, weight);
+ }
+ else
+ {
// do the interpolation and set the parameters
- curParams.mix(LLWLParamManager::instance()->mParamList[mFirstIt->second],
- LLWLParamManager::instance()->mParamList[mSecondIt->second], weight);
+ // *TODO: this will not work with lazy loading of sky presets.
+ curParams.mix(LLWLParamManager::getInstance()->mParamList[mFirstIt->second], LLWLParamManager::getInstance()->mParamList[mSecondIt->second], weight);
+ }
}
F64 LLWLAnimator::getDayTime()
{
- if(!mIsRunning) {
+ if(!mIsRunning)
+ {
return mDayTime;
}
-
- if(mUseLindenTime) {
-
+ else if(mTimeType == TIME_LINDEN)
+ {
F32 phase = gSky.getSunPhase() / F_PI;
// we're not solving the non-linear equation that determines sun phase
// we're just linearly interpolating between the major points
if (phase <= 5.0 / 4.0) {
mDayTime = (1.0 / 3.0) * phase + (1.0 / 3.0);
- } else {
+ }
+ else
+ {
mDayTime = phase - (1.0 / 2.0);
}
- if(mDayTime > 1) {
+ if(mDayTime > 1)
+ {
mDayTime--;
}
return mDayTime;
}
+ else if(mTimeType == TIME_LOCAL)
+ {
+ return getLocalTime();
+ }
// get the time;
mDayTime = (LLTimer::getElapsedSeconds() - mStartTime) / mDayRate;
// clamp it
- if(mDayTime < 0) {
+ if(mDayTime < 0)
+ {
mDayTime = 0;
}
- while(mDayTime > 1) {
+ while(mDayTime > 1)
+ {
mDayTime--;
}
@@ -144,15 +198,18 @@ void LLWLAnimator::setDayTime(F64 dayTime)
mDayTime = dayTime;
// clamp it
- if(mDayTime < 0) {
+ if(mDayTime < 0)
+ {
mDayTime = 0;
- } else if(mDayTime > 1) {
+ }
+ else if(mDayTime > 1)
+ {
mDayTime = 1;
}
}
-void LLWLAnimator::setTrack(std::map<F32, std::string>& curTrack,
+void LLWLAnimator::setTrack(std::map<F32, LLWLParamKey>& curTrack,
F32 dayRate, F64 dayTime, bool run)
{
mTimeTrack = curTrack;
@@ -161,3 +218,96 @@ void LLWLAnimator::setTrack(std::map<F32, std::string>& curTrack,
mIsRunning = run;
}
+
+void LLWLAnimator::startInterpolation(const LLSD& targetWater)
+{
+ mInterpBeginWL->setAll(LLWLParamManager::getInstance()->mCurParams.getAll());
+ mInterpBeginWater->setAll(LLWaterParamManager::getInstance()->mCurParams.getAll());
+
+ mInterpStartTime = clock();
+ mInterpEndTime = mInterpStartTime + clock_t(INTERP_TOTAL_SECONDS) * CLOCKS_PER_SEC;
+
+ // Don't set any ending WL -- this is continuously calculated as the animator updates since it's a moving target
+ mInterpEndWater->setAll(targetWater);
+
+ mIsInterpolating = true;
+}
+
+std::string LLWLAnimator::timeToString(F32 curTime)
+{
+ S32 hours;
+ S32 min;
+ bool isPM = false;
+
+ // get hours and minutes
+ hours = (S32) (24.0 * curTime);
+ curTime -= ((F32) hours / 24.0f);
+ min = llround(24.0f * 60.0f * curTime);
+
+ // handle case where it's 60
+ if(min == 60)
+ {
+ hours++;
+ min = 0;
+ }
+
+ // set for PM
+ if(hours >= 12 && hours < 24)
+ {
+ isPM = true;
+ }
+
+ // convert to non-military notation
+ if(hours >= 24)
+ {
+ hours = 12;
+ }
+ else if(hours > 12)
+ {
+ hours -= 12;
+ }
+ else if(hours == 0)
+ {
+ hours = 12;
+ }
+
+ // make the string
+ std::stringstream newTime;
+ newTime << hours << ":";
+
+ // double 0
+ if(min < 10)
+ {
+ newTime << 0;
+ }
+
+ // finish it
+ newTime << min << " ";
+ if(isPM)
+ {
+ newTime << "PM";
+ }
+ else
+ {
+ newTime << "AM";
+ }
+
+ return newTime.str();
+}
+
+F64 LLWLAnimator::getLocalTime()
+{
+ char buffer[9];
+ time_t rawtime;
+ struct tm* timeinfo;
+
+ time(&rawtime);
+ timeinfo = localtime(&rawtime);
+ strftime(buffer, 9, "%H:%M:%S", timeinfo);
+ std::string timeStr(buffer);
+
+ F64 tod = ((F64)atoi(timeStr.substr(0,2).c_str())) / 24.f +
+ ((F64)atoi(timeStr.substr(3,2).c_str())) / 1440.f +
+ ((F64)atoi(timeStr.substr(6,2).c_str())) / 86400.f;
+ return tod;
+}
diff --git a/indra/newview/llwlanimator.h b/indra/newview/llwlanimator.h
index 5677290213..5223b45343 100644
--- a/indra/newview/llwlanimator.h
+++ b/indra/newview/llwlanimator.h
@@ -28,28 +28,39 @@
#define LL_WL_ANIMATOR_H
#include "llwlparamset.h"
+#include "llwaterparamset.h"
#include <string>
#include <map>
+struct LLWLParamKey;
+
class LLWLAnimator {
public:
+ typedef enum e_time
+ {
+ TIME_LINDEN,
+ TIME_LOCAL,
+ TIME_CUSTOM
+ } ETime;
+
F64 mStartTime;
F32 mDayRate;
F64 mDayTime;
// track to play
- std::map<F32, std::string> mTimeTrack;
- std::map<F32, std::string>::iterator mFirstIt, mSecondIt;
-
- // params to use
- //std::map<std::string, LLWLParamSet> mParamList;
-
- bool mIsRunning;
- bool mUseLindenTime;
+ std::map<F32, LLWLParamKey> mTimeTrack;
+ std::map<F32, LLWLParamKey>::iterator mFirstIt, mSecondIt;
// simple constructor
LLWLAnimator();
+ ~LLWLAnimator()
+ {
+ delete mInterpBeginWL;
+ delete mInterpBeginWater;
+ delete mInterpEndWater;
+ }
+
// update the parameters
void update(LLWLParamSet& curParams);
@@ -63,9 +74,66 @@ public:
void setDayTime(F64 dayTime);
// set an animation track
- void setTrack(std::map<F32, std::string>& track,
+ void setTrack(std::map<F32, LLWLParamKey>& track,
F32 dayRate, F64 dayTime = 0, bool run = true);
+ void deactivate()
+ {
+ mIsRunning = false;
+ }
+
+ void activate(ETime time)
+ {
+ mIsRunning = true;
+ mTimeType = time;
+ }
+
+ void startInterpolation(const LLSD& targetWater);
+
+ bool getIsRunning()
+ {
+ return mIsRunning;
+ }
+
+ bool getUseCustomTime()
+ {
+ return mTimeType == TIME_CUSTOM;
+ }
+
+ bool getUseLocalTime()
+ {
+ return mTimeType == TIME_LOCAL;
+ }
+
+ bool getUseLindenTime()
+ {
+ return mTimeType == TIME_LINDEN;
+ }
+
+ void setTimeType(ETime time)
+ {
+ mTimeType = time;
+ }
+
+ ETime getTimeType()
+ {
+ return mTimeType;
+ }
+
+ /// convert the present time to a digital clock time
+ static std::string timeToString(F32 curTime);
+
+ /// get local time between 0 and 1
+ static F64 getLocalTime();
+
+private:
+ ETime mTimeType;
+ bool mIsRunning, mIsInterpolating;
+ LLWLParamSet *mInterpBeginWL;
+ LLWaterParamSet *mInterpBeginWater, *mInterpEndWater;
+ clock_t mInterpStartTime, mInterpEndTime;
+
+ static F64 INTERP_TOTAL_SECONDS;
};
#endif // LL_WL_ANIMATOR_H
diff --git a/indra/newview/llwldaycycle.cpp b/indra/newview/llwldaycycle.cpp
index 85b3d62a49..4c0cb7c0f4 100644
--- a/indra/newview/llwldaycycle.cpp
+++ b/indra/newview/llwldaycycle.cpp
@@ -27,12 +27,11 @@
#include "llviewerprecompiledheaders.h"
#include "llwldaycycle.h"
-
-#include "llnotificationsutil.h"
#include "llsdserialize.h"
-#include "llxmlnode.h"
-
#include "llwlparammanager.h"
+#include "llnotifications.h"
+
+#include "llviewerwindow.h"
#include <map>
@@ -45,85 +44,160 @@ LLWLDayCycle::~LLWLDayCycle()
{
}
-void LLWLDayCycle::loadDayCycle(const std::string & fileName)
+void LLWLDayCycle::loadDayCycle(const LLSD& day_data, LLWLParamKey::EScope scope)
{
- // clear the first few things
+ lldebugs << "Loading day cycle (day_data.size() = " << day_data.size() << ", scope = " << scope << ")" << llendl;
mTimeMap.clear();
- // now load the file
- std::string pathName(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,
- "windlight/days", fileName));
- llinfos << "Loading DayCycle settings from " << pathName << llendl;
-
- llifstream day_cycle_xml(pathName);
- if (day_cycle_xml.is_open())
+ // add each key frame
+ for(S32 i = 0; i < day_data.size(); ++i)
{
- // load and parse it
- LLSD day_data(LLSD::emptyArray());
- LLPointer<LLSDParser> parser = new LLSDXMLParser();
- parser->parse(day_cycle_xml, day_data, LLSDSerialize::SIZE_UNLIMITED);
-
- // add each key
- for(S32 i = 0; i < day_data.size(); ++i)
+ // make sure it's a two array
+ if(day_data[i].size() != 2)
+ {
+ continue;
+ }
+
+ // check each param key exists in param manager
+ bool success;
+ LLWLParamSet pset;
+ LLWLParamKey frame = LLWLParamKey(day_data[i][1].asString(), scope);
+ success =
+ LLWLParamManager::getInstance()->getParamSet(frame, pset);
+ if(!success)
{
- // make sure it's a two array
- if(day_data[i].size() != 2)
+ // *HACK: If loading region day cycle, try local sky presets as well.
+ // Local presets may be referenced by a region day cycle after
+ // it has been edited but the changes have not been uploaded.
+ if (scope == LLEnvKey::SCOPE_REGION)
{
- continue;
+ frame.scope = LLEnvKey::SCOPE_LOCAL;
+ success = LLWLParamManager::getInstance()->getParamSet(frame, pset);
}
-
- // check each param name exists in param manager
- bool success;
- LLWLParamSet pset;
- success = LLWLParamManager::instance()->getParamSet(day_data[i][1].asString(), pset);
- if(!success)
+
+ if (!success)
{
// alert the user
LLSD args;
args["SKY"] = day_data[i][1].asString();
- LLNotificationsUtil::add("WLMissingSky", args);
+ LLNotifications::instance().add("WLMissingSky", args, LLSD());
continue;
}
-
- // then add the key
- addKey((F32)day_data[i][0].asReal(), day_data[i][1].asString());
}
+
+ // then add the keyframe
+ addKeyframe((F32)day_data[i][0].asReal(), frame);
+ }
+}
+
+void LLWLDayCycle::loadDayCycleFromFile(const std::string & fileName)
+{
+ loadDayCycle(loadCycleDataFromFile(fileName), LLWLParamKey::SCOPE_LOCAL);
+}
+/*static*/ LLSD LLWLDayCycle::loadCycleDataFromFile(const std::string & fileName)
+{
+ // *FIX: Cannot load user day cycles.
+ std::string pathName(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,
+ "windlight/days", fileName));
+
+ return loadDayCycleFromPath(pathName);
+}
+
+// static
+LLSD LLWLDayCycle::loadDayCycleFromPath(const std::string& file_path)
+{
+ LL_INFOS("Windlight") << "Loading DayCycle settings from " << file_path << LL_ENDL;
+
+ llifstream day_cycle_xml(file_path);
+ if (day_cycle_xml.is_open())
+ {
+ // load and parse it
+ LLSD day_data(LLSD::emptyArray());
+ LLPointer<LLSDParser> parser = new LLSDXMLParser();
+ parser->parse(day_cycle_xml, day_data, LLSDSerialize::SIZE_UNLIMITED);
day_cycle_xml.close();
+ return day_data;
+ }
+ else
+ {
+ return LLSD();
}
}
void LLWLDayCycle::saveDayCycle(const std::string & fileName)
{
- LLSD day_data(LLSD::emptyArray());
-
std::string pathName(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/days", fileName));
//llinfos << "Saving WindLight settings to " << pathName << llendl;
- for(std::map<F32, std::string>::const_iterator mIt = mTimeMap.begin();
- mIt != mTimeMap.end();
- ++mIt)
+ save(pathName);
+}
+
+void LLWLDayCycle::save(const std::string& file_path)
+{
+ LLSD day_data = asLLSD();
+
+ llofstream day_cycle_xml(file_path);
+ LLPointer<LLSDFormatter> formatter = new LLSDXMLFormatter();
+ formatter->format(day_data, day_cycle_xml, LLSDFormatter::OPTIONS_PRETTY);
+ day_cycle_xml.close();
+}
+
+LLSD LLWLDayCycle::asLLSD()
+{
+ LLSD day_data(LLSD::emptyArray());
+ for(std::map<F32, LLWLParamKey>::const_iterator mIt = mTimeMap.begin(); mIt != mTimeMap.end(); ++mIt)
{
LLSD key(LLSD::emptyArray());
key.append(mIt->first);
- key.append(mIt->second);
+ key.append(mIt->second.name);
day_data.append(key);
}
- llofstream day_cycle_xml(pathName);
- LLPointer<LLSDFormatter> formatter = new LLSDXMLFormatter();
- formatter->format(day_data, day_cycle_xml, LLSDFormatter::OPTIONS_PRETTY);
- day_cycle_xml.close();
+ lldebugs << "Dumping day cycle (" << mTimeMap.size() << ") to LLSD: " << day_data << llendl;
+ return day_data;
}
+bool LLWLDayCycle::getSkyRefs(std::map<LLWLParamKey, LLWLParamSet>& refs) const
+{
+ bool result = true;
+ LLWLParamManager& wl_mgr = LLWLParamManager::instance();
+
+ refs.clear();
+ for (std::map<F32, LLWLParamKey>::const_iterator iter = mTimeMap.begin(); iter != mTimeMap.end(); ++iter)
+ {
+ const LLWLParamKey& key = iter->second;
+ if (!wl_mgr.getParamSet(key, refs[key]))
+ {
+ llwarns << "Cannot find sky [" << key.name << "] referenced by a day cycle" << llendl;
+ result = false;
+ }
+ }
+
+ return result;
+}
-void LLWLDayCycle::clearKeys()
+bool LLWLDayCycle::getSkyMap(LLSD& sky_map) const
{
+ std::map<LLWLParamKey, LLWLParamSet> refs;
+
+ if (!getSkyRefs(refs))
+ {
+ return false;
+ }
+
+ sky_map = LLWLParamManager::createSkyMap(refs);
+ return true;
+}
+
+void LLWLDayCycle::clearKeyframes()
+{
+ lldebugs << "Clearing key frames" << llendl;
mTimeMap.clear();
}
-bool LLWLDayCycle::addKey(F32 newTime, const std::string & paramName)
+bool LLWLDayCycle::addKeyframe(F32 newTime, LLWLParamKey frame)
{
// no adding negative time
if(newTime < 0)
@@ -134,48 +208,58 @@ bool LLWLDayCycle::addKey(F32 newTime, const std::string & paramName)
// if time not being used, add it and return true
if(mTimeMap.find(newTime) == mTimeMap.end())
{
- mTimeMap.insert(std::pair<F32, std::string>(newTime, paramName));
+ mTimeMap.insert(std::pair<F32, LLWLParamKey>(newTime, frame));
+ lldebugs << "Adding key frame (" << newTime << ", " << frame.toLLSD() << ")" << llendl;
return true;
}
// otherwise, don't add, and return error
+ llwarns << "Error adding key frame (" << newTime << ", " << frame.toLLSD() << ")" << llendl;
return false;
}
-bool LLWLDayCycle::changeKeyTime(F32 oldTime, F32 newTime)
+bool LLWLDayCycle::changeKeyframeTime(F32 oldTime, F32 newTime)
{
+ lldebugs << "Changing key frame time (" << oldTime << " => " << newTime << ")" << llendl;
+
// just remove and add back
- std::string name = mTimeMap[oldTime];
+ LLWLParamKey frame = mTimeMap[oldTime];
- bool stat = removeKey(oldTime);
+ bool stat = removeKeyframe(oldTime);
if(stat == false)
{
+ lldebugs << "Failed to change key frame time (" << oldTime << " => " << newTime << ")" << llendl;
return stat;
}
- return addKey(newTime, name);
+ return addKeyframe(newTime, frame);
}
-bool LLWLDayCycle::changeKeyParam(F32 time, const std::string & name)
+bool LLWLDayCycle::changeKeyframeParam(F32 time, LLWLParamKey key)
{
+ lldebugs << "Changing key frame param (" << time << ", " << key.toLLSD() << ")" << llendl;
+
// just remove and add back
// make sure param exists
LLWLParamSet tmp;
- bool stat = LLWLParamManager::instance()->getParamSet(name, tmp);
+ bool stat = LLWLParamManager::getInstance()->getParamSet(key, tmp);
if(stat == false)
{
+ lldebugs << "Failed to change key frame param (" << time << ", " << key.toLLSD() << ")" << llendl;
return stat;
}
- mTimeMap[time] = name;
+ mTimeMap[time] = key;
return true;
}
-bool LLWLDayCycle::removeKey(F32 time)
+bool LLWLDayCycle::removeKeyframe(F32 time)
{
+ lldebugs << "Removing key frame (" << time << ")" << llendl;
+
// look for the time. If there, erase it
- std::map<F32, std::string>::iterator mIt = mTimeMap.find(time);
+ std::map<F32, LLWLParamKey>::iterator mIt = mTimeMap.find(time);
if(mIt != mTimeMap.end())
{
mTimeMap.erase(mIt);
@@ -185,15 +269,15 @@ bool LLWLDayCycle::removeKey(F32 time)
return false;
}
-bool LLWLDayCycle::getKey(const std::string & name, F32& key)
+bool LLWLDayCycle::getKeytime(LLWLParamKey frame, F32& key_time) const
{
- // scroll through till we find the
- std::map<F32, std::string>::iterator mIt = mTimeMap.begin();
+ // scroll through till we find the correct value in the map
+ std::map<F32, LLWLParamKey>::const_iterator mIt = mTimeMap.begin();
for(; mIt != mTimeMap.end(); ++mIt)
{
- if(name == mIt->second)
+ if(frame == mIt->second)
{
- key = mIt->first;
+ key_time = mIt->first;
return true;
}
}
@@ -204,26 +288,52 @@ bool LLWLDayCycle::getKey(const std::string & name, F32& key)
bool LLWLDayCycle::getKeyedParam(F32 time, LLWLParamSet& param)
{
// just scroll on through till you find it
- std::map<F32, std::string>::iterator mIt = mTimeMap.find(time);
- if(mIt != mTimeMap.end())
+ std::map<F32, LLWLParamKey>::iterator mIt = mTimeMap.find(time);
+ if(mIt != mTimeMap.end())
{
- return LLWLParamManager::instance()->getParamSet(mIt->second, param);
+ return LLWLParamManager::getInstance()->getParamSet(mIt->second, param);
}
// return error if not found
+ lldebugs << "Key " << time << " not found" << llendl;
return false;
}
bool LLWLDayCycle::getKeyedParamName(F32 time, std::string & name)
{
// just scroll on through till you find it
- std::map<F32, std::string>::iterator mIt = mTimeMap.find(time);
+ std::map<F32, LLWLParamKey>::iterator mIt = mTimeMap.find(time);
if(mIt != mTimeMap.end())
{
- name = mTimeMap[time];
+ name = mTimeMap[time].name;
return true;
}
// return error if not found
+ lldebugs << "Key " << time << " not found" << llendl;
return false;
}
+
+bool LLWLDayCycle::hasReferencesTo(const LLWLParamKey& keyframe) const
+{
+ F32 dummy;
+ return getKeytime(keyframe, dummy);
+}
+
+void LLWLDayCycle::removeReferencesTo(const LLWLParamKey& keyframe)
+{
+ lldebugs << "Removing references to key frame " << keyframe.toLLSD() << llendl;
+ F32 keytime;
+ bool might_exist;
+ do
+ {
+ // look for it
+ might_exist = getKeytime(keyframe, keytime);
+ if(!might_exist)
+ {
+ return;
+ }
+ might_exist = removeKeyframe(keytime);
+
+ } while(might_exist); // might be another one
+}
diff --git a/indra/newview/llwldaycycle.h b/indra/newview/llwldaycycle.h
index 5cbf72191d..c8585564ed 100644
--- a/indra/newview/llwldaycycle.h
+++ b/indra/newview/llwldaycycle.h
@@ -34,13 +34,16 @@ class LLWLDayCycle;
#include <string>
#include "llwlparamset.h"
#include "llwlanimator.h"
+struct LLWLParamKey;
+#include "llenvmanager.h" // for LLEnvKey::EScope
class LLWLDayCycle
{
+ LOG_CLASS(LLWLDayCycle);
public:
// lists what param sets are used when during the day
- std::map<F32, std::string> mTimeMap;
+ std::map<F32, LLWLParamKey> mTimeMap;
// how long is my day
F32 mDayRate;
@@ -54,35 +57,56 @@ public:
~LLWLDayCycle();
/// load a day cycle
- void loadDayCycle(const std::string & fileName);
+ void loadDayCycle(const LLSD& llsd, LLEnvKey::EScope scope);
/// load a day cycle
+ void loadDayCycleFromFile(const std::string & fileName);
+
+ /// save a day cycle
void saveDayCycle(const std::string & fileName);
- /// clear keys
- void clearKeys();
+ /// save a day cycle
+ void save(const std::string& file_path);
+
+ /// load the LLSD data from a file (returns the undefined LLSD if not found)
+ static LLSD loadCycleDataFromFile(const std::string & fileName);
+
+ /// load the LLSD data from a file specified by full path
+ static LLSD loadDayCycleFromPath(const std::string& file_path);
+
+ /// get the LLSD data for this day cycle
+ LLSD asLLSD();
+
+ // get skies referenced by this day cycle
+ bool getSkyRefs(std::map<LLWLParamKey, LLWLParamSet>& refs) const;
+
+ // get referenced skies as LLSD
+ bool getSkyMap(LLSD& sky_map) const;
+
+ /// clear keyframes
+ void clearKeyframes();
/// Getters and Setters
/// add a new key frame to the day cycle
/// returns true if successful
/// no negative time
- bool addKey(F32 newTime, const std::string & paramName);
+ bool addKeyframe(F32 newTime, LLWLParamKey key);
- /// adjust a key's placement in the day cycle
+ /// adjust a keyframe's placement in the day cycle
/// returns true if successful
- bool changeKeyTime(F32 oldTime, F32 newTime);
+ bool changeKeyframeTime(F32 oldTime, F32 newTime);
- /// adjust a key's parameter used
+ /// adjust a keyframe's parameter used
/// returns true if successful
- bool changeKeyParam(F32 time, const std::string & paramName);
+ bool changeKeyframeParam(F32 time, LLWLParamKey key);
- /// remove a key from the day cycle
+ /// remove a key frame from the day cycle
/// returns true if successful
- bool removeKey(F32 time);
+ bool removeKeyframe(F32 time);
/// get the first key time for a parameter
/// returns false if not there
- bool getKey(const std::string & name, F32& key);
+ bool getKeytime(LLWLParamKey keyFrame, F32& keyTime) const;
/// get the param set at a given time
/// returns true if found one
@@ -92,6 +116,12 @@ public:
/// returns true if it found one
bool getKeyedParamName(F32 time, std::string & name);
+ /// @return true if there are references to the given sky
+ bool hasReferencesTo(const LLWLParamKey& keyframe) const;
+
+ /// removes all references to the sky (paramkey)
+ /// does nothing if the sky doesn't exist in the day
+ void removeReferencesTo(const LLWLParamKey& keyframe);
};
diff --git a/indra/newview/llwlhandlers.cpp b/indra/newview/llwlhandlers.cpp
new file mode 100644
index 0000000000..2425b96678
--- /dev/null
+++ b/indra/newview/llwlhandlers.cpp
@@ -0,0 +1,197 @@
+/**
+ * @file llwlhandlers.cpp
+ * @brief Various classes which handle Windlight-related messaging
+ *
+ * $LicenseInfo:firstyear=2009&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llwlhandlers.h"
+
+#include "llagent.h"
+#include "llviewerregion.h"
+#include "llenvmanager.h"
+#include "llnotificationsutil.h"
+
+/****
+ * LLEnvironmentRequest
+ ****/
+// static
+bool LLEnvironmentRequest::initiate()
+{
+ LLViewerRegion* cur_region = gAgent.getRegion();
+
+ if (!cur_region)
+ {
+ LL_WARNS("WindlightCaps") << "Viewer region not set yet, skipping env. settings request" << LL_ENDL;
+ return false;
+ }
+
+ if (!cur_region->capabilitiesReceived())
+ {
+ LL_INFOS("WindlightCaps") << "Deferring windlight settings request until we've got region caps" << LL_ENDL;
+ cur_region->setCapabilitiesReceivedCallback(boost::bind(&LLEnvironmentRequest::onRegionCapsReceived, _1));
+ return false;
+ }
+
+ return doRequest();
+}
+
+// static
+void LLEnvironmentRequest::onRegionCapsReceived(const LLUUID& region_id)
+{
+ if (region_id != gAgent.getRegion()->getRegionID())
+ {
+ LL_INFOS("WindlightCaps") << "Got caps for a non-current region" << LL_ENDL;
+ return;
+ }
+
+ LL_DEBUGS("WindlightCaps") << "Received region capabilities" << LL_ENDL;
+ doRequest();
+}
+
+// static
+bool LLEnvironmentRequest::doRequest()
+{
+ std::string url = gAgent.getRegion()->getCapability("EnvironmentSettings");
+ if (url.empty())
+ {
+ LL_INFOS("WindlightCaps") << "Skipping windlight setting request - we don't have this capability" << LL_ENDL;
+ // region is apparently not capable of this; don't respond at all
+ return false;
+ }
+
+ LL_INFOS("WindlightCaps") << "Requesting region windlight settings via " << url << LL_ENDL;
+ LLHTTPClient::get(url, new LLEnvironmentRequestResponder());
+ return true;
+}
+
+/****
+ * LLEnvironmentRequestResponder
+ ****/
+int LLEnvironmentRequestResponder::sCount = 0; // init to 0
+
+LLEnvironmentRequestResponder::LLEnvironmentRequestResponder()
+{
+ mID = ++sCount;
+}
+/*virtual*/ void LLEnvironmentRequestResponder::result(const LLSD& unvalidated_content)
+{
+ LL_INFOS("WindlightCaps") << "Received region windlight settings" << LL_ENDL;
+
+ if (mID != sCount)
+ {
+ LL_INFOS("WindlightCaps") << "Got superseded by another responder; ignoring..." << LL_ENDL;
+ return;
+ }
+
+ if (unvalidated_content[0]["regionID"].asUUID() != gAgent.getRegion()->getRegionID())
+ {
+ LL_WARNS("WindlightCaps") << "Not in the region from where this data was received (wanting "
+ << gAgent.getRegion()->getRegionID() << " but got " << unvalidated_content[0]["regionID"].asUUID()
+ << ") - ignoring..." << LL_ENDL;
+ return;
+ }
+
+ LLEnvManagerNew::getInstance()->onRegionSettingsResponse(unvalidated_content);
+}
+/*virtual*/ void LLEnvironmentRequestResponder::error(U32 status, const std::string& reason)
+{
+ LL_INFOS("WindlightCaps") << "Got an error, not using region windlight..." << LL_ENDL;
+ LLEnvManagerNew::getInstance()->onRegionSettingsResponse(LLSD());
+}
+
+/****
+ * LLEnvironmentApply
+ ****/
+
+clock_t LLEnvironmentApply::UPDATE_WAIT_SECONDS = clock_t(3.f);
+clock_t LLEnvironmentApply::sLastUpdate = clock_t(0.f);
+
+// static
+bool LLEnvironmentApply::initiateRequest(const LLSD& content)
+{
+ clock_t current = clock();
+
+ // Make sure we don't update too frequently.
+ if (current < sLastUpdate + (UPDATE_WAIT_SECONDS * CLOCKS_PER_SEC))
+ {
+ LLSD args(LLSD::emptyMap());
+ args["WAIT"] = (F64)UPDATE_WAIT_SECONDS;
+ LLNotificationsUtil::add("EnvUpdateRate", args);
+ return false;
+ }
+
+ sLastUpdate = current;
+
+ // Send update request.
+ std::string url = gAgent.getRegion()->getCapability("EnvironmentSettings");
+ if (url.empty())
+ {
+ LL_WARNS("WindlightCaps") << "Applying windlight settings not supported" << LL_ENDL;
+ return false;
+ }
+
+ LL_INFOS("WindlightCaps") << "Sending windlight settings to " << url << LL_ENDL;
+ LL_DEBUGS("WindlightCaps") << "content: " << content << LL_ENDL;
+ LLHTTPClient::post(url, content, new LLEnvironmentApplyResponder());
+ return true;
+}
+
+/****
+ * LLEnvironmentApplyResponder
+ ****/
+/*virtual*/ void LLEnvironmentApplyResponder::result(const LLSD& content)
+{
+ if (content["regionID"].asUUID() != gAgent.getRegion()->getRegionID())
+ {
+ LL_WARNS("WindlightCaps") << "No longer in the region where data was sent (currently "
+ << gAgent.getRegion()->getRegionID() << ", reply is from " << content["regionID"].asUUID()
+ << "); ignoring..." << LL_ENDL;
+ return;
+ }
+ else if (content["success"].asBoolean())
+ {
+ LL_DEBUGS("WindlightCaps") << "Success in applying windlight settings to region " << content["regionID"].asUUID() << LL_ENDL;
+ LLEnvManagerNew::instance().onRegionSettingsApplyResponse(true);
+ }
+ else
+ {
+ LL_WARNS("WindlightCaps") << "Region couldn't apply windlight settings! Reason from sim: " << content["fail_reason"].asString() << LL_ENDL;
+ LLSD args(LLSD::emptyMap());
+ args["FAIL_REASON"] = content["fail_reason"].asString();
+ LLNotificationsUtil::add("WLRegionApplyFail", args);
+ LLEnvManagerNew::instance().onRegionSettingsApplyResponse(false);
+ }
+}
+/*virtual*/ void LLEnvironmentApplyResponder::error(U32 status, const std::string& reason)
+{
+ std::stringstream msg;
+ msg << reason << " (Code " << status << ")";
+
+ LL_WARNS("WindlightCaps") << "Couldn't apply windlight settings to region! Reason: " << msg << LL_ENDL;
+
+ LLSD args(LLSD::emptyMap());
+ args["FAIL_REASON"] = msg.str();
+ LLNotificationsUtil::add("WLRegionApplyFail", args);
+}
diff --git a/indra/newview/llwlhandlers.h b/indra/newview/llwlhandlers.h
new file mode 100644
index 0000000000..23558876da
--- /dev/null
+++ b/indra/newview/llwlhandlers.h
@@ -0,0 +1,100 @@
+/**
+ * @file llwlhandlers.h
+ * @brief Headers for classes in llwlhandlers.cpp
+ *
+ * $LicenseInfo:firstyear=2009&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLWLHANDLERS_H
+#define LL_LLWLHANDLERS_H
+
+#include "llviewerprecompiledheaders.h"
+#include "llhttpclient.h"
+
+class LLEnvironmentRequest
+{
+ LOG_CLASS(LLEnvironmentRequest);
+public:
+ /// @return true if request was successfully sent
+ static bool initiate();
+
+private:
+ static void onRegionCapsReceived(const LLUUID& region_id);
+ static bool doRequest();
+};
+
+class LLEnvironmentRequestResponder: public LLHTTPClient::Responder
+{
+ LOG_CLASS(LLEnvironmentRequestResponder);
+public:
+ virtual void result(const LLSD& content);
+ virtual void error(U32 status, const std::string& reason);
+
+private:
+ friend class LLEnvironmentRequest;
+
+ LLEnvironmentRequestResponder();
+ static int sCount;
+ int mID;
+};
+
+class LLEnvironmentApply
+{
+ LOG_CLASS(LLEnvironmentApply);
+public:
+ /// @return true if request was successfully sent
+ static bool initiateRequest(const LLSD& content);
+
+private:
+ static clock_t sLastUpdate;
+ static clock_t UPDATE_WAIT_SECONDS;
+};
+
+class LLEnvironmentApplyResponder: public LLHTTPClient::Responder
+{
+ LOG_CLASS(LLEnvironmentApplyResponder);
+public:
+ /*
+ * Expecting reply from sim in form of:
+ * {
+ * regionID : uuid,
+ * messageID: uuid,
+ * success : true
+ * }
+ * or
+ * {
+ * regionID : uuid,
+ * success : false,
+ * fail_reason : string
+ * }
+ */
+ virtual void result(const LLSD& content);
+
+ virtual void error(U32 status, const std::string& reason); // non-200 errors only
+
+private:
+ friend class LLEnvironmentApply;
+
+ LLEnvironmentApplyResponder() {}
+};
+
+#endif // LL_LLWLHANDLERS_H
diff --git a/indra/newview/llwlparammanager.cpp b/indra/newview/llwlparammanager.cpp
index e5f52dfc97..49d9d44d74 100644
--- a/indra/newview/llwlparammanager.cpp
+++ b/indra/newview/llwlparammanager.cpp
@@ -31,33 +31,39 @@
#include "pipeline.h"
#include "llsky.h"
+#include "lldiriterator.h"
#include "llfloaterreg.h"
#include "llsliderctrl.h"
#include "llspinctrl.h"
#include "llcheckboxctrl.h"
#include "lluictrlfactory.h"
+#include "llviewercamera.h"
#include "llcombobox.h"
#include "lllineeditor.h"
#include "llsdserialize.h"
#include "v4math.h"
+#include "llviewerdisplay.h"
#include "llviewercontrol.h"
+#include "llviewerwindow.h"
+#include "lldrawpoolwater.h"
+#include "llagent.h"
+#include "llviewerregion.h"
+#include "lldaycyclemanager.h"
+#include "llenvmanager.h"
#include "llwlparamset.h"
#include "llpostprocess.h"
-#include "llfloaterwindlight.h"
-#include "llfloaterdaycycle.h"
-#include "llfloaterenvsettings.h"
-#include "curl/curl.h"
+#include "llviewershadermgr.h"
+#include "llglslshader.h"
-LLWLParamManager * LLWLParamManager::sInstance = NULL;
-static LLFastTimer::DeclareTimer FTM_UPDATE_WLPARAM("Update Windlight Params");
+#include "curl/curl.h"
+#include "llstreamtools.h"
LLWLParamManager::LLWLParamManager() :
//set the defaults for the controls
- // index is from sWLUniforms in pipeline.cpp line 979
/// Sun Delta Terrain tweak variables.
mSunDeltaYaw(180.0f),
@@ -65,10 +71,10 @@ LLWLParamManager::LLWLParamManager() :
mWLGamma(1.0f, "gamma"),
mBlueHorizon(0.25f, 0.25f, 1.0f, 1.0f, "blue_horizon", "WLBlueHorizon"),
- mHazeDensity(1.0f, 1.0f, 1.0f, 0.5f, "haze_density"),
+ mHazeDensity(1.0f, "haze_density"),
mBlueDensity(0.25f, 0.25f, 0.25f, 1.0f, "blue_density", "WLBlueDensity"),
mDensityMult(1.0f, "density_multiplier", 1000),
- mHazeHorizon(1.0f, 1.0f, 1.0f, 0.5f, "haze_horizon"),
+ mHazeHorizon(1.0f, "haze_horizon"),
mMaxAlt(4000.0f, "max_y"),
// Lighting
@@ -95,159 +101,237 @@ LLWLParamManager::~LLWLParamManager()
{
}
-void LLWLParamManager::loadPresets(const std::string& file_name)
+void LLWLParamManager::clearParamSetsOfScope(LLWLParamKey::EScope scope)
{
- std::string path_name(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/skies", ""));
- LL_DEBUGS2("AppInit", "Shaders") << "Loading Default WindLight settings from " << path_name << LL_ENDL;
-
- bool found = true;
- while(found)
+ if (LLWLParamKey::SCOPE_LOCAL == scope)
{
- std::string name;
- found = gDirUtilp->getNextFileInDir(path_name, "*.xml", name);
- if(found)
- {
-
- name=name.erase(name.length()-4);
-
- // bugfix for SL-46920: preventing filenames that break stuff.
- char * curl_str = curl_unescape(name.c_str(), name.size());
- std::string unescaped_name(curl_str);
- curl_free(curl_str);
- curl_str = NULL;
+ LL_WARNS("Windlight") << "Tried to clear windlight sky presets from local system! This shouldn't be called..." << LL_ENDL;
+ return;
+ }
- LL_DEBUGS2("AppInit", "Shaders") << "name: " << name << LL_ENDL;
- loadPreset(unescaped_name,FALSE);
+ std::set<LLWLParamKey> to_remove;
+ for(std::map<LLWLParamKey, LLWLParamSet>::iterator iter = mParamList.begin(); iter != mParamList.end(); ++iter)
+ {
+ if(iter->first.scope == scope)
+ {
+ to_remove.insert(iter->first);
}
}
- // And repeat for user presets, note the user presets will modify any system presets already loaded
+ for(std::set<LLWLParamKey>::iterator iter = to_remove.begin(); iter != to_remove.end(); ++iter)
+ {
+ mParamList.erase(*iter);
+ }
+}
- std::string path_name2(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/skies", ""));
- LL_DEBUGS2("AppInit", "Shaders") << "Loading User WindLight settings from " << path_name2 << LL_ENDL;
-
- found = true;
- while(found)
+// returns all skies referenced by the day cycle, with their final names
+// side effect: applies changes to all internal structures!
+std::map<LLWLParamKey, LLWLParamSet> LLWLParamManager::finalizeFromDayCycle(LLWLParamKey::EScope scope)
+{
+ lldebugs << "mDay before finalizing:" << llendl;
{
- std::string name;
- found = gDirUtilp->getNextFileInDir(path_name2, "*.xml", name);
- if(found)
+ for (std::map<F32, LLWLParamKey>::iterator iter = mDay.mTimeMap.begin(); iter != mDay.mTimeMap.end(); ++iter)
{
- name=name.erase(name.length()-4);
+ LLWLParamKey& key = iter->second;
+ lldebugs << iter->first << "->" << key.name << llendl;
+ }
+ }
+
+ std::map<LLWLParamKey, LLWLParamSet> final_references;
- // bugfix for SL-46920: preventing filenames that break stuff.
- char * curl_str = curl_unescape(name.c_str(), name.size());
- std::string unescaped_name(curl_str);
- curl_free(curl_str);
- curl_str = NULL;
+ // Move all referenced to desired scope, renaming if necessary
+ // First, save skies referenced
+ std::map<LLWLParamKey, LLWLParamSet> current_references; // all skies referenced by the day cycle, with their current names
+ // guard against skies with same name and different scopes
+ std::set<std::string> inserted_names;
+ std::map<std::string, unsigned int> conflicted_names; // integer later used as a count, for uniquely renaming conflicts
- LL_DEBUGS2("AppInit", "Shaders") << "name: " << name << LL_ENDL;
- loadPreset(unescaped_name,FALSE);
+ LLWLDayCycle& cycle = mDay;
+ for(std::map<F32, LLWLParamKey>::iterator iter = cycle.mTimeMap.begin();
+ iter != cycle.mTimeMap.end();
+ ++iter)
+ {
+ LLWLParamKey& key = iter->second;
+ std::string desired_name = key.name;
+ replace_newlines_with_whitespace(desired_name); // already shouldn't have newlines, but just in case
+ if(inserted_names.find(desired_name) == inserted_names.end())
+ {
+ inserted_names.insert(desired_name);
}
+ else
+ {
+ // make exist in map
+ conflicted_names[desired_name] = 0;
+ }
+ current_references[key] = mParamList[key];
}
-}
+ // forget all old skies in target scope, and rebuild, renaming as needed
+ clearParamSetsOfScope(scope);
+ for(std::map<LLWLParamKey, LLWLParamSet>::iterator iter = current_references.begin(); iter != current_references.end(); ++iter)
+ {
+ const LLWLParamKey& old_key = iter->first;
-void LLWLParamManager::savePresets(const std::string & fileName)
-{
- //Nobody currently calls me, but if they did, then its reasonable to write the data out to the user's folder
- //and not over the RO system wide version.
+ std::string desired_name(old_key.name);
+ replace_newlines_with_whitespace(desired_name);
- LLSD paramsData(LLSD::emptyMap());
-
- std::string pathName(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight", fileName));
+ LLWLParamKey new_key(desired_name, scope); // name will be replaced later if necessary
- for(std::map<std::string, LLWLParamSet>::iterator mIt = mParamList.begin();
- mIt != mParamList.end();
- ++mIt)
- {
- paramsData[mIt->first] = mIt->second.getAll();
- }
+ // if this sky is one with a non-unique name, rename via appending a number
+ // an existing preset of the target scope gets to keep its name
+ if (scope != old_key.scope && conflicted_names.find(desired_name) != conflicted_names.end())
+ {
+ std::string& new_name = new_key.name;
- llofstream presetsXML(pathName);
+ do
+ {
+ // if this executes more than once, this is an absurdly pathological case
+ // (e.g. "x" repeated twice, but "x 1" already exists, so need to use "x 2")
+ std::stringstream temp;
+ temp << desired_name << " " << (++conflicted_names[desired_name]);
+ new_name = temp.str();
+ } while (inserted_names.find(new_name) != inserted_names.end());
- LLPointer<LLSDFormatter> formatter = new LLSDXMLFormatter();
+ // yay, found one that works
+ inserted_names.insert(new_name); // track names we consume here; shouldn't be necessary due to ++int? but just in case
- formatter->format(paramsData, presetsXML, LLSDFormatter::OPTIONS_PRETTY);
+ // *TODO factor out below into a rename()?
- presetsXML.close();
-}
+ LL_INFOS("Windlight") << "Renamed " << old_key.name << " (scope" << old_key.scope << ") to "
+ << new_key.name << " (scope " << new_key.scope << ")" << LL_ENDL;
-void LLWLParamManager::loadPreset(const std::string & name,bool propagate)
-{
-
- // bugfix for SL-46920: preventing filenames that break stuff.
- char * curl_str = curl_escape(name.c_str(), name.size());
- std::string escaped_filename(curl_str);
- curl_free(curl_str);
- curl_str = NULL;
+ // update name in sky
+ iter->second.mName = new_name;
- escaped_filename += ".xml";
+ // update keys in day cycle
+ for(std::map<F32, LLWLParamKey>::iterator frame = cycle.mTimeMap.begin(); frame != cycle.mTimeMap.end(); ++frame)
+ {
+ if (frame->second == old_key)
+ {
+ frame->second = new_key;
+ }
+ }
- std::string pathName(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/skies", escaped_filename));
- LL_DEBUGS2("AppInit", "Shaders") << "Loading WindLight sky setting from " << pathName << LL_ENDL;
+ // add to master sky map
+ mParamList[new_key] = iter->second;
+ }
- llifstream presetsXML;
- presetsXML.open(pathName.c_str());
+ final_references[new_key] = iter->second;
+ }
- // That failed, try loading from the users area instead.
- if(!presetsXML)
+ lldebugs << "mDay after finalizing:" << llendl;
{
- pathName=gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/skies", escaped_filename);
- LL_DEBUGS2("AppInit", "Shaders") << "Loading User WindLight sky setting from " << pathName << LL_ENDL;
- presetsXML.clear();
- presetsXML.open(pathName.c_str());
+ for (std::map<F32, LLWLParamKey>::iterator iter = mDay.mTimeMap.begin(); iter != mDay.mTimeMap.end(); ++iter)
+ {
+ LLWLParamKey& key = iter->second;
+ lldebugs << iter->first << "->" << key.name << llendl;
+ }
}
- if (presetsXML)
+ return final_references;
+}
+
+// static
+LLSD LLWLParamManager::createSkyMap(std::map<LLWLParamKey, LLWLParamSet> refs)
+{
+ LLSD skies = LLSD::emptyMap();
+ for(std::map<LLWLParamKey, LLWLParamSet>::iterator iter = refs.begin(); iter != refs.end(); ++iter)
{
- LLSD paramsData(LLSD::emptyMap());
+ skies.insert(iter->first.name, iter->second.getAll());
+ }
+ return skies;
+}
- LLPointer<LLSDParser> parser = new LLSDXMLParser();
+void LLWLParamManager::addAllSkies(const LLWLParamKey::EScope scope, const LLSD& sky_presets)
+{
+ for(LLSD::map_const_iterator iter = sky_presets.beginMap(); iter != sky_presets.endMap(); ++iter)
+ {
+ LLWLParamSet set;
+ set.setAll(iter->second);
+ mParamList[LLWLParamKey(iter->first, scope)] = set;
+ }
+}
- parser->parse(presetsXML, paramsData, LLSDSerialize::SIZE_UNLIMITED);
+void LLWLParamManager::refreshRegionPresets()
+{
+ // Remove all region sky presets because they may belong to a previously visited region.
+ clearParamSetsOfScope(LLEnvKey::SCOPE_REGION);
+
+ // Add all sky presets belonging to the current region.
+ addAllSkies(LLEnvKey::SCOPE_REGION, LLEnvManagerNew::instance().getRegionSettings().getSkyMap());
+}
+
+void LLWLParamManager::loadAllPresets()
+{
+ // First, load system (coming out of the box) sky presets.
+ loadPresetsFromDir(getSysDir());
- std::map<std::string, LLWLParamSet>::iterator mIt = mParamList.find(name);
- if(mIt == mParamList.end())
+ // Then load user presets. Note that user day presets will modify any system ones already loaded.
+ loadPresetsFromDir(getUserDir());
+}
+
+void LLWLParamManager::loadPresetsFromDir(const std::string& dir)
+{
+ LL_INFOS2("AppInit", "Shaders") << "Loading sky presets from " << dir << LL_ENDL;
+
+ LLDirIterator dir_iter(dir, "*.xml");
+ while (1)
+ {
+ std::string file;
+ if (!dir_iter.next(file))
{
- addParamSet(name, paramsData);
+ break; // no more files
}
- else
+
+ std::string path = dir + file;
+ if (!loadPreset(path))
{
- setParamSet(name, paramsData);
+ llwarns << "Error loading sky preset from " << path << llendl;
}
- presetsXML.close();
- }
- else
+ }
+}
+
+bool LLWLParamManager::loadPreset(const std::string& path)
+{
+ llifstream xml_file;
+ std::string name(gDirUtilp->getBaseFileName(LLURI::unescape(path), /*strip_exten = */ true));
+
+ xml_file.open(path.c_str());
+ if (!xml_file)
{
- llwarns << "Can't find " << name << llendl;
- return;
+ return false;
}
-
- if(propagate)
+ LL_DEBUGS2("AppInit", "Shaders") << "Loading sky " << name << LL_ENDL;
+
+ LLSD params_data;
+ LLPointer<LLSDParser> parser = new LLSDXMLParser();
+ parser->parse(xml_file, params_data, LLSDSerialize::SIZE_UNLIMITED);
+ xml_file.close();
+
+ LLWLParamKey key(name, LLEnvKey::SCOPE_LOCAL);
+ if (hasParamSet(key))
{
- getParamSet(name, mCurParams);
- propagateParameters();
+ setParamSet(key, params_data);
+ }
+ else
+ {
+ addParamSet(key, params_data);
}
-}
-void LLWLParamManager::savePreset(const std::string & name)
-{
- // bugfix for SL-46920: preventing filenames that break stuff.
- char * curl_str = curl_escape(name.c_str(), name.size());
- std::string escaped_filename(curl_str);
- curl_free(curl_str);
- curl_str = NULL;
+ return true;
+}
- escaped_filename += ".xml";
+void LLWLParamManager::savePreset(LLWLParamKey key)
+{
+ llassert(key.scope == LLEnvKey::SCOPE_LOCAL && !key.name.empty());
// make an empty llsd
LLSD paramsData(LLSD::emptyMap());
- std::string pathName(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/skies", escaped_filename));
+ std::string pathName(getUserDir() + escapeString(key.name) + ".xml");
// fill it with LLSD windlight params
- paramsData = mParamList[name].getAll();
+ paramsData = mParamList[key].getAll();
// write to file
llofstream presetsXML(pathName);
@@ -280,6 +364,8 @@ void LLWLParamManager::updateShaderUniforms(LLGLSLShader * shader)
}
+static LLFastTimer::DeclareTimer FTM_UPDATE_WLPARAM("Update Windlight Params");
+
void LLWLParamManager::propagateParameters(void)
{
LLFastTimer ftm(FTM_UPDATE_WLPARAM);
@@ -359,7 +445,7 @@ void LLWLParamManager::update(LLViewerCamera * cam)
mCurParams.updateCloudScrolling();
// update only if running
- if(mAnimator.mIsRunning)
+ if(mAnimator.getIsRunning())
{
mAnimator.update(mCurParams);
}
@@ -367,31 +453,16 @@ void LLWLParamManager::update(LLViewerCamera * cam)
// update the shaders and the menu
propagateParameters();
- // sync menus if they exist
- LLFloaterWindLight* wlfloater = LLFloaterReg::findTypedInstance<LLFloaterWindLight>("env_windlight");
- if (wlfloater)
- {
- wlfloater->syncMenu();
- }
- LLFloaterDayCycle* dlfloater = LLFloaterReg::findTypedInstance<LLFloaterDayCycle>("env_day_cycle");
- if (dlfloater)
- {
- dlfloater->syncMenu();
- }
- LLFloaterEnvSettings* envfloater = LLFloaterReg::findTypedInstance<LLFloaterEnvSettings>("env_settings");
- if (envfloater)
- {
- envfloater->syncMenu();
- }
-
F32 camYaw = cam->getYaw();
+ stop_glerror();
+
// *TODO: potential optimization - this block may only need to be
// executed some of the time. For example for water shaders only.
{
F32 camYawDelta = mSunDeltaYaw * DEG_TO_RAD;
- LLVector3 lightNorm3(mLightDir);
+ LLVector3 lightNorm3(mLightDir);
lightNorm3 *= LLQuaternion(-(camYaw + camYawDelta), LLVector3(0.f, 1.f, 0.f));
mRotatedLightDir = LLVector4(lightNorm3, 0.f);
@@ -409,17 +480,18 @@ void LLWLParamManager::update(LLViewerCamera * cam)
}
}
-// static
-void LLWLParamManager::initClass(void)
+bool LLWLParamManager::applyDayCycleParams(const LLSD& params, LLEnvKey::EScope scope, F32 time)
{
- instance();
+ mDay.loadDayCycle(params, scope);
+ resetAnimator(time, true); // set to specified time and start animator
+ return true;
}
-// static
-void LLWLParamManager::cleanupClass()
+bool LLWLParamManager::applySkyParams(const LLSD& params)
{
- delete sInstance;
- sInstance = NULL;
+ mAnimator.deactivate();
+ mCurParams.setAll(params);
+ return true;
}
void LLWLParamManager::resetAnimator(F32 curTime, bool run)
@@ -429,133 +501,227 @@ void LLWLParamManager::resetAnimator(F32 curTime, bool run)
return;
}
-bool LLWLParamManager::addParamSet(const std::string& name, LLWLParamSet& param)
+
+bool LLWLParamManager::addParamSet(const LLWLParamKey& key, LLWLParamSet& param)
{
// add a new one if not one there already
- std::map<std::string, LLWLParamSet>::iterator mIt = mParamList.find(name);
+ std::map<LLWLParamKey, LLWLParamSet>::iterator mIt = mParamList.find(key);
if(mIt == mParamList.end())
{
- mParamList[name] = param;
+ llassert(!key.name.empty());
+ // *TODO: validate params
+ mParamList[key] = param;
+ mPresetListChangeSignal();
return true;
}
return false;
}
-BOOL LLWLParamManager::addParamSet(const std::string& name, LLSD const & param)
+BOOL LLWLParamManager::addParamSet(const LLWLParamKey& key, LLSD const & param)
{
- // add a new one if not one there already
- std::map<std::string, LLWLParamSet>::const_iterator finder = mParamList.find(name);
- if(finder == mParamList.end())
- {
- mParamList[name].setAll(param);
- return TRUE;
- }
- else
- {
- return FALSE;
- }
+ LLWLParamSet param_set;
+ param_set.setAll(param);
+ return addParamSet(key, param_set);
}
-bool LLWLParamManager::getParamSet(const std::string& name, LLWLParamSet& param)
+bool LLWLParamManager::getParamSet(const LLWLParamKey& key, LLWLParamSet& param)
{
// find it and set it
- std::map<std::string, LLWLParamSet>::iterator mIt = mParamList.find(name);
+ std::map<LLWLParamKey, LLWLParamSet>::iterator mIt = mParamList.find(key);
if(mIt != mParamList.end())
{
- param = mParamList[name];
- param.mName = name;
+ param = mParamList[key];
+ param.mName = key.name;
return true;
}
return false;
}
-bool LLWLParamManager::setParamSet(const std::string& name, LLWLParamSet& param)
+bool LLWLParamManager::hasParamSet(const LLWLParamKey& key)
{
- mParamList[name] = param;
+ LLWLParamSet dummy;
+ return getParamSet(key, dummy);
+}
+
+bool LLWLParamManager::setParamSet(const LLWLParamKey& key, LLWLParamSet& param)
+{
+ llassert(!key.name.empty());
+ // *TODO: validate params
+ mParamList[key] = param;
return true;
}
-bool LLWLParamManager::setParamSet(const std::string& name, const LLSD & param)
+bool LLWLParamManager::setParamSet(const LLWLParamKey& key, const LLSD & param)
{
+ llassert(!key.name.empty());
+ // *TODO: validate params
+
// quick, non robust (we won't be working with files, but assets) check
+ // this might not actually be true anymore....
if(!param.isMap())
{
return false;
}
- mParamList[name].setAll(param);
-
- return true;
+ LLWLParamSet param_set;
+ param_set.setAll(param);
+ return setParamSet(key, param_set);
}
-bool LLWLParamManager::removeParamSet(const std::string& name, bool delete_from_disk)
+void LLWLParamManager::removeParamSet(const LLWLParamKey& key, bool delete_from_disk)
{
+ // *NOTE: Removing a sky preset invalidates day cycles that refer to it.
+
+ if (key.scope == LLEnvKey::SCOPE_REGION)
+ {
+ llwarns << "Removing region skies not supported" << llendl;
+ llassert(key.scope == LLEnvKey::SCOPE_LOCAL);
+ return;
+ }
+
// remove from param list
- std::map<std::string, LLWLParamSet>::iterator mIt = mParamList.find(name);
- if(mIt != mParamList.end())
+ std::map<LLWLParamKey, LLWLParamSet>::iterator it = mParamList.find(key);
+ if (it == mParamList.end())
{
- mParamList.erase(mIt);
+ LL_WARNS("WindLight") << "No sky preset named " << key.name << LL_ENDL;
+ return;
}
- F32 key;
+ mParamList.erase(it);
+ mDay.removeReferencesTo(key);
- // remove all references
- bool stat = true;
- do
+ // remove from file system if requested
+ if (delete_from_disk)
{
- // get it
- stat = mDay.getKey(name, key);
- if(stat == false)
+ std::string path_name(getUserDir());
+ std::string escaped_name = escapeString(key.name);
+
+ if(gDirUtilp->deleteFilesInDir(path_name, escaped_name + ".xml") < 1)
{
- break;
+ LL_WARNS("WindLight") << "Error removing sky preset " << key.name << " from disk" << LL_ENDL;
}
+ }
- // and remove
- stat = mDay.removeKey(key);
+ // signal interested parties
+ mPresetListChangeSignal();
+}
- } while(stat == true);
-
- if(delete_from_disk)
+bool LLWLParamManager::isSystemPreset(const std::string& preset_name) const
+{
+ // *TODO: file system access is excessive here.
+ return gDirUtilp->fileExists(getSysDir() + escapeString(preset_name) + ".xml");
+}
+
+void LLWLParamManager::getPresetNames(preset_name_list_t& region, preset_name_list_t& user, preset_name_list_t& sys) const
+{
+ region.clear();
+ user.clear();
+ sys.clear();
+
+ for (std::map<LLWLParamKey, LLWLParamSet>::const_iterator it = mParamList.begin(); it != mParamList.end(); it++)
{
- std::string path_name(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/skies", ""));
-
- // use full curl escaped name
- char * curl_str = curl_escape(name.c_str(), name.size());
- std::string escaped_name(curl_str);
- curl_free(curl_str);
- curl_str = NULL;
-
- gDirUtilp->deleteFilesInDir(path_name, escaped_name + ".xml");
- }
+ const LLWLParamKey& key = it->first;
+ const std::string& name = key.name;
- return true;
+ if (key.scope == LLEnvKey::SCOPE_REGION)
+ {
+ region.push_back(name);
+ }
+ else
+ {
+ if (isSystemPreset(name))
+ {
+ sys.push_back(name);
+ }
+ else
+ {
+ user.push_back(name);
+ }
+ }
+ }
}
+void LLWLParamManager::getUserPresetNames(preset_name_list_t& user) const
+{
+ preset_name_list_t region, sys; // unused
+ getPresetNames(region, user, sys);
+}
-// static
-LLWLParamManager * LLWLParamManager::instance()
+void LLWLParamManager::getPresetKeys(preset_key_list_t& keys) const
{
- if(NULL == sInstance)
+ keys.clear();
+
+ for (std::map<LLWLParamKey, LLWLParamSet>::const_iterator it = mParamList.begin(); it != mParamList.end(); it++)
{
- sInstance = new LLWLParamManager();
+ keys.push_back(it->first);
+ }
+}
+
+boost::signals2::connection LLWLParamManager::setPresetListChangeCallback(const preset_list_signal_t::slot_type& cb)
+{
+ return mPresetListChangeSignal.connect(cb);
+}
- sInstance->loadPresets(LLStringUtil::null);
+// virtual static
+void LLWLParamManager::initSingleton()
+{
+ LL_DEBUGS("Windlight") << "Initializing sky" << LL_ENDL;
+
+ loadAllPresets();
- // load the day
- sInstance->mDay.loadDayCycle(std::string("Default.xml"));
+ // load the day
+ std::string preferred_day = LLEnvManagerNew::instance().getDayCycleName();
+ if (!LLDayCycleManager::instance().getPreset(preferred_day, mDay))
+ {
+ // Fall back to default.
+ llwarns << "No day cycle named " << preferred_day << ", falling back to defaults" << llendl;
+ mDay.loadDayCycleFromFile("Default.xml");
- // *HACK - sets cloud scrolling to what we want... fix this better in the future
- sInstance->getParamSet("Default", sInstance->mCurParams);
+ // *TODO: Fix user preferences accordingly.
+ }
- // set it to noon
- sInstance->resetAnimator(0.5, true);
+ // *HACK - sets cloud scrolling to what we want... fix this better in the future
+ std::string sky = LLEnvManagerNew::instance().getSkyPresetName();
+ if (!getParamSet(LLWLParamKey(sky, LLWLParamKey::SCOPE_LOCAL), mCurParams))
+ {
+ llwarns << "No sky preset named " << sky << ", falling back to defaults" << llendl;
+ getParamSet(LLWLParamKey("Default", LLWLParamKey::SCOPE_LOCAL), mCurParams);
- // but use linden time sets it to what the estate is
- sInstance->mAnimator.mUseLindenTime = true;
+ // *TODO: Fix user preferences accordingly.
}
- return sInstance;
+ // set it to noon
+ resetAnimator(0.5, LLEnvManagerNew::instance().getUseDayCycle());
+
+ // but use linden time sets it to what the estate is
+ mAnimator.setTimeType(LLWLAnimator::TIME_LINDEN);
+
+ LLEnvManagerNew::instance().usePrefs();
+}
+
+// static
+std::string LLWLParamManager::getSysDir()
+{
+ return gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/skies", "");
+}
+
+// static
+std::string LLWLParamManager::getUserDir()
+{
+ return gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS , "windlight/skies", "");
+}
+
+// static
+std::string LLWLParamManager::escapeString(const std::string& str)
+{
+ // Don't use LLURI::escape() because it doesn't encode '-' characters
+ // which may break handling of some system presets like "A-12AM".
+ char* curl_str = curl_escape(str.c_str(), str.size());
+ std::string escaped_str(curl_str);
+ curl_free(curl_str);
+
+ return escaped_str;
}
diff --git a/indra/newview/llwlparammanager.h b/indra/newview/llwlparammanager.h
index 8c6329e769..72422500fc 100644
--- a/indra/newview/llwlparammanager.h
+++ b/indra/newview/llwlparammanager.h
@@ -27,12 +27,14 @@
#ifndef LL_WLPARAMMANAGER_H
#define LL_WLPARAMMANAGER_H
-#include <vector>
+#include <list>
#include <map>
+#include "llenvmanager.h"
#include "llwlparamset.h"
#include "llwlanimator.h"
#include "llwldaycycle.h"
#include "llviewercamera.h"
+#include "lltrans.h"
class LLGLSLShader;
@@ -72,7 +74,7 @@ struct WLColorControl {
r = val.mV[0];
g = val.mV[1];
b = val.mV[2];
- i = val.mV[3];
+ i = val.mV[3];
return *this;
}
@@ -100,9 +102,8 @@ struct WLFloatControl {
{
}
- inline WLFloatControl & operator = (LLVector4 const & val) {
- x = val.mV[0];
-
+ inline WLFloatControl & operator = (F32 val) {
+ x = val;
return *this;
}
@@ -115,25 +116,112 @@ struct WLFloatControl {
}
};
-/// WindLight parameter manager class - what controls all the wind light shaders
-class LLWLParamManager
+struct LLWLParamKey : LLEnvKey
{
public:
+ // scope and source of a param set (WL sky preset)
+ std::string name;
+ EScope scope;
- LLWLParamManager();
- ~LLWLParamManager();
+ // for conversion from LLSD
+ static const int NAME_IDX = 0;
+ static const int SCOPE_IDX = 1;
+
+ inline LLWLParamKey(const std::string& n, EScope s)
+ : name(n), scope(s)
+ {
+ }
+
+ inline LLWLParamKey(LLSD llsd)
+ : name(llsd[NAME_IDX].asString()), scope(EScope(llsd[SCOPE_IDX].asInteger()))
+ {
+ }
- /// load a preset file
- void loadPresets(const std::string & fileName);
+ inline LLWLParamKey() // NOT really valid, just so std::maps can return a default of some sort
+ : name(""), scope(SCOPE_LOCAL)
+ {
+ }
- /// save the preset file
- void savePresets(const std::string & fileName);
+ inline LLWLParamKey(std::string& stringVal)
+ {
+ size_t len = stringVal.length();
+ if (len > 0)
+ {
+ name = stringVal.substr(0, len - 1);
+ scope = (EScope) atoi(stringVal.substr(len - 1, len).c_str());
+ }
+ }
- /// load an individual preset into the sky
- void loadPreset(const std::string & name,bool propogate=true);
+ inline std::string toStringVal() const
+ {
+ std::stringstream str;
+ str << name << scope;
+ return str.str();
+ }
+
+ inline LLSD toLLSD() const
+ {
+ LLSD llsd = LLSD::emptyArray();
+ llsd.append(LLSD(name));
+ llsd.append(LLSD(scope));
+ return llsd;
+ }
+
+ inline void fromLLSD(const LLSD& llsd)
+ {
+ name = llsd[NAME_IDX].asString();
+ scope = EScope(llsd[SCOPE_IDX].asInteger());
+ }
+
+ inline bool operator <(const LLWLParamKey other) const
+ {
+ if (name < other.name)
+ {
+ return true;
+ }
+ else if (name > other.name)
+ {
+ return false;
+ }
+ else
+ {
+ return scope < other.scope;
+ }
+ }
+
+ inline bool operator ==(const LLWLParamKey other) const
+ {
+ return (name == other.name) && (scope == other.scope);
+ }
+
+ inline std::string toString() const
+ {
+ switch (scope)
+ {
+ case SCOPE_LOCAL:
+ return name + std::string(" (") + LLTrans::getString("Local") + std::string(")");
+ break;
+ case SCOPE_REGION:
+ return name + std::string(" (") + LLTrans::getString("Region") + std::string(")");
+ break;
+ default:
+ return name + " (?)";
+ }
+ }
+};
+
+/// WindLight parameter manager class - what controls all the wind light shaders
+class LLWLParamManager : public LLSingleton<LLWLParamManager>
+{
+ LOG_CLASS(LLWLParamManager);
+
+public:
+ typedef std::list<std::string> preset_name_list_t;
+ typedef std::list<LLWLParamKey> preset_key_list_t;
+ typedef boost::signals2::signal<void()> preset_list_signal_t;
/// save the parameter presets to file
- void savePreset(const std::string & name);
+ void savePreset(const LLWLParamKey key);
/// Set shader uniforms dirty, so they'll update automatically.
void propagateParameters(void);
@@ -147,6 +235,12 @@ public:
/// update information camera dependent parameters
void update(LLViewerCamera * cam);
+ /// apply specified day cycle, setting time to noon by default
+ bool applyDayCycleParams(const LLSD& params, LLEnvKey::EScope scope, F32 time = 0.5);
+
+ /// apply specified fixed sky params
+ bool applySkyParams(const LLSD& params);
+
// get where the light is pointing
inline LLVector4 getLightDir(void) const;
@@ -161,36 +255,62 @@ public:
/// get the radius of the dome
inline F32 getDomeRadius(void) const;
-
- /// Perform global initialization for this class.
- static void initClass(void);
-
- // Cleanup of global data that's only inited once per class.
- static void cleanupClass();
- /// add a param to the list
- bool addParamSet(const std::string& name, LLWLParamSet& param);
+ /// add a param set (preset) to the list
+ bool addParamSet(const LLWLParamKey& key, LLWLParamSet& param);
- /// add a param to the list
- BOOL addParamSet(const std::string& name, LLSD const & param);
+ /// add a param set (preset) to the list
+ BOOL addParamSet(const LLWLParamKey& key, LLSD const & param);
- /// get a param from the list
- bool getParamSet(const std::string& name, LLWLParamSet& param);
+ /// get a param set (preset) from the list
+ bool getParamSet(const LLWLParamKey& key, LLWLParamSet& param);
+
+ /// check whether the preset is in the list
+ bool hasParamSet(const LLWLParamKey& key);
/// set the param in the list with a new param
- bool setParamSet(const std::string& name, LLWLParamSet& param);
+ bool setParamSet(const LLWLParamKey& key, LLWLParamSet& param);
/// set the param in the list with a new param
- bool setParamSet(const std::string& name, LLSD const & param);
+ bool setParamSet(const LLWLParamKey& key, LLSD const & param);
/// gets rid of a parameter and any references to it
- /// returns true if successful
- bool removeParamSet(const std::string& name, bool delete_from_disk);
+ /// ignores "delete_from_disk" if the scope is not local
+ void removeParamSet(const LLWLParamKey& key, bool delete_from_disk);
- // singleton pattern implementation
- static LLWLParamManager * instance();
+ /// clear parameter mapping of a given scope
+ void clearParamSetsOfScope(LLEnvKey::EScope scope);
-public:
+ /// @return true if the preset comes out of the box
+ bool isSystemPreset(const std::string& preset_name) const;
+
+ /// @return user and system preset names as a single list
+ void getPresetNames(preset_name_list_t& region, preset_name_list_t& user, preset_name_list_t& sys) const;
+
+ /// @return user preset names
+ void getUserPresetNames(preset_name_list_t& user) const;
+
+ /// @return keys of all known presets
+ void getPresetKeys(preset_key_list_t& keys) const;
+
+ /// Emitted when a preset gets added or deleted.
+ boost::signals2::connection setPresetListChangeCallback(const preset_list_signal_t::slot_type& cb);
+
+ /// add all skies in LLSD using the given scope
+ void addAllSkies(LLEnvKey::EScope scope, const LLSD& preset_map);
+
+ /// refresh region-scope presets
+ void refreshRegionPresets();
+
+ // returns all skies referenced by the current day cycle (in mDay), with their final names
+ // side effect: applies changes to all internal structures! (trashes all unreferenced skies in scope, keys in day cycle rescoped to scope, etc.)
+ std::map<LLWLParamKey, LLWLParamSet> finalizeFromDayCycle(LLWLParamKey::EScope scope);
+
+ // returns all skies in map (intended to be called with output from a finalize)
+ static LLSD createSkyMap(std::map<LLWLParamKey, LLWLParamSet> map);
+
+ /// escape string in a way different from LLURI::escape()
+ static std::string escapeString(const std::string& str);
// helper variables
LLWLAnimator mAnimator;
@@ -219,10 +339,10 @@ public:
/// Atmospherics
WLColorControl mBlueHorizon;
- WLColorControl mHazeDensity;
+ WLFloatControl mHazeDensity;
WLColorControl mBlueDensity;
WLFloatControl mDensityMult;
- WLColorControl mHazeHorizon;
+ WLFloatControl mHazeHorizon;
WLFloatControl mMaxAlt;
/// Lighting
@@ -243,14 +363,27 @@ public:
F32 mDomeOffset;
F32 mDomeRadius;
- // list of all the parameters, listed by name
- std::map<std::string, LLWLParamSet> mParamList;
-
-
+
private:
- // our parameter manager singleton instance
- static LLWLParamManager * sInstance;
+ friend class LLWLAnimator;
+
+ void loadAllPresets();
+ void loadPresetsFromDir(const std::string& dir);
+ bool loadPreset(const std::string& path);
+
+ static std::string getSysDir();
+ static std::string getUserDir();
+
+ friend class LLSingleton<LLWLParamManager>;
+ /*virtual*/ void initSingleton();
+ LLWLParamManager();
+ ~LLWLParamManager();
+
+ // list of all the parameters, listed by name
+ std::map<LLWLParamKey, LLWLParamSet> mParamList;
+
+ preset_list_signal_t mPresetListChangeSignal;
};
inline F32 LLWLParamManager::getDomeOffset(void) const
diff --git a/indra/newview/llwlparamset.cpp b/indra/newview/llwlparamset.cpp
index cf06766d73..b04d30db55 100644
--- a/indra/newview/llwlparamset.cpp
+++ b/indra/newview/llwlparamset.cpp
@@ -29,8 +29,8 @@
#include "llwlparamset.h"
#include "llwlanimator.h"
-#include "llfloaterwindlight.h"
#include "llwlparammanager.h"
+#include "llglslshader.h"
#include "lluictrlfactory.h"
#include "llsliderctrl.h"
@@ -41,86 +41,90 @@
LLWLParamSet::LLWLParamSet(void) :
mName("Unnamed Preset"),
mCloudScrollXOffset(0.f), mCloudScrollYOffset(0.f)
-{
-/* REMOVE or init the LLSD
- const std::map<std::string, LLVector4>::value_type hardcodedPreset[] = {
- std::make_pair("lightnorm", LLVector4(0.f, 0.707f, -0.707f, 0.f)),
- std::make_pair("sunlight_color", LLVector4(0.6f, 0.6f, 2.83f, 2.27f)),
- std::make_pair("ambient", LLVector4(0.27f, 0.33f, 0.44f, 1.19f)),
- std::make_pair("blue_horizon", LLVector4(0.3f, 0.4f, 0.9f, 1.f)),
- std::make_pair("blue_density", LLVector4(0.3f, 0.4f, 0.8f, 1.f)),
- std::make_pair("haze_horizon", LLVector4(0.6f, 0.6f, 0.6f, 1.f)),
- std::make_pair("haze_density", LLVector4(0.3f, 0.3f, 0.3f, 1.f)),
- std::make_pair("cloud_shadow", LLVector4(0.f, 0.f, 0.f, 0.f)),
- std::make_pair("density_multiplier", LLVector4(0.001f, 0.001f, 0.001f, 0.001f)),
- std::make_pair("distance_multiplier", LLVector4(1.f, 1.f, 1.f, 1.f)),
- std::make_pair("max_y", LLVector4(600.f, 600.f, 600.f, 0.f)),
- std::make_pair("glow", LLVector4(15.f, 0.001f, -0.03125f, 0.f)),
- std::make_pair("cloud_color", LLVector4(0.0f, 0.0f, 0.0f, 0.0f)),
- std::make_pair("cloud_pos_density1", LLVector4(0.f, 0.f, 0.f, 1.f)),
- std::make_pair("cloud_pos_density2", LLVector4(0.f, 0.f, 0.f, 1.f)),
- std::make_pair("cloud_scale", LLVector4(0.42f, 0.f, 0.f, 1.f)),
- std::make_pair("gamma", LLVector4(2.0f, 2.0f, 2.0f, 0.0f)),
- };
- std::map<std::string, LLVector4>::value_type const * endHardcodedPreset =
- hardcodedPreset + LL_ARRAY_SIZE(hardcodedPreset);
-
- mParamValues.insert(hardcodedPreset, endHardcodedPreset);
-*/
-}
+{}
+
+static LLFastTimer::DeclareTimer FTM_WL_PARAM_UPDATE("WL Param Update");
void LLWLParamSet::update(LLGLSLShader * shader) const
{
+ LLFastTimer t(FTM_WL_PARAM_UPDATE);
+
for(LLSD::map_const_iterator i = mParamValues.beginMap();
i != mParamValues.endMap();
++i)
{
const std::string& param = i->first;
- if( param == "star_brightness" || param == "preset_num" || param == "sun_angle" ||
+ if (param == "star_brightness" || param == "preset_num" || param == "sun_angle" ||
param == "east_angle" || param == "enable_cloud_scroll" ||
param == "cloud_scroll_rate" || param == "lightnorm" )
{
continue;
}
- if(param == "cloud_pos_density1")
+ if (param == "cloud_pos_density1")
{
LLVector4 val;
val.mV[0] = F32(i->second[0].asReal()) + mCloudScrollXOffset;
val.mV[1] = F32(i->second[1].asReal()) + mCloudScrollYOffset;
val.mV[2] = (F32) i->second[2].asReal();
val.mV[3] = (F32) i->second[3].asReal();
-
- shader->uniform4fv(param, 1, val.mV);
- }
- else
+
+ stop_glerror();
+ shader->uniform4fv(param, 1, val.mV);
+ stop_glerror();
+ }
+ else if (param == "cloud_scale" || param == "cloud_shadow" ||
+ param == "density_multiplier" || param == "distance_multiplier" ||
+ param == "haze_density" || param == "haze_horizon" ||
+ param == "max_y" )
+ {
+ F32 val = (F32) i->second[0].asReal();
+
+ stop_glerror();
+ shader->uniform1f(param, val);
+ stop_glerror();
+ }
+ else // param is the uniform name
{
- LLVector4 val;
-
// handle all the different cases
- if(i->second.isArray() && i->second.size() == 4)
+ if (i->second.isArray() && i->second.size() == 4)
{
+ LLVector4 val;
+
val.mV[0] = (F32) i->second[0].asReal();
val.mV[1] = (F32) i->second[1].asReal();
val.mV[2] = (F32) i->second[2].asReal();
val.mV[3] = (F32) i->second[3].asReal();
+
+ stop_glerror();
+ shader->uniform4fv(param, 1, val.mV);
+ stop_glerror();
}
- else if(i->second.isReal())
+ else if (i->second.isReal())
{
- val.mV[0] = (F32) i->second.asReal();
+ F32 val = (F32) i->second.asReal();
+
+ stop_glerror();
+ shader->uniform1f(param, val);
+ stop_glerror();
}
- else if(i->second.isInteger())
+ else if (i->second.isInteger())
{
- val.mV[0] = (F32) i->second.asReal();
+ S32 val = (S32) i->second.asInteger();
+
+ stop_glerror();
+ shader->uniform1i(param, val);
+ stop_glerror();
}
- else if(i->second.isBoolean())
+ else if (i->second.isBoolean())
{
- val.mV[0] = i->second.asBoolean();
+ S32 val = (i->second.asBoolean() ? 1 : 0);
+
+ stop_glerror();
+ shader->uniform1i(param, val);
+ stop_glerror();
}
-
-
- shader->uniform4fv(param, 1, val.mV);
}
}
}
@@ -141,7 +145,8 @@ void LLWLParamSet::set(const std::string& paramName, float x)
}
}
-void LLWLParamSet::set(const std::string& paramName, float x, float y) {
+void LLWLParamSet::set(const std::string& paramName, float x, float y)
+{
mParamValues[paramName][0] = x;
mParamValues[paramName][1] = y;
}
@@ -187,7 +192,6 @@ void LLWLParamSet::set(const std::string& paramName, const LLColor4 & val)
LLVector4 LLWLParamSet::getVector(const std::string& paramName, bool& error)
{
-
// test to see if right type
LLSD cur_val = mParamValues.get(paramName);
if (!cur_val.isArray())
@@ -208,7 +212,6 @@ LLVector4 LLWLParamSet::getVector(const std::string& paramName, bool& error)
F32 LLWLParamSet::getFloat(const std::string& paramName, bool& error)
{
-
// test to see if right type
LLSD cur_val = mParamValues.get(paramName);
if (cur_val.isArray() && cur_val.size() != 0)
@@ -227,8 +230,6 @@ F32 LLWLParamSet::getFloat(const std::string& paramName, bool& error)
return 0;
}
-
-
void LLWLParamSet::setSunAngle(float val)
{
// keep range 0 - 2pi
@@ -256,11 +257,9 @@ void LLWLParamSet::setEastAngle(float val)
mParamValues["east_angle"] = val;
}
-
void LLWLParamSet::mix(LLWLParamSet& src, LLWLParamSet& dest, F32 weight)
{
// set up the iterators
- LLSD::map_iterator cIt = mParamValues.beginMap();
// keep cloud positions and coverage the same
/// TODO masking will do this later
@@ -273,55 +272,38 @@ void LLWLParamSet::mix(LLWLParamSet& src, LLWLParamSet& dest, F32 weight)
LLSD srcVal;
LLSD destVal;
- // do the interpolation for all the ones saved as vectors
- // skip the weird ones
- for(; cIt != mParamValues.endMap(); cIt++) {
-
- // check params to make sure they're actually there
- if(src.mParamValues.has(cIt->first))
+ // Iterate through values
+ for(LLSD::map_iterator iter = mParamValues.beginMap(); iter != mParamValues.endMap(); ++iter)
+ {
+ // If param exists in both src and dest, set the holder variables, otherwise skip
+ if(src.mParamValues.has(iter->first) && dest.mParamValues.has(iter->first))
{
- srcVal = src.mParamValues[cIt->first];
+ srcVal = src.mParamValues[iter->first];
+ destVal = dest.mParamValues[iter->first];
}
else
{
continue;
}
- if(dest.mParamValues.has(cIt->first))
+ if(iter->second.isReal()) // If it's a real, interpolate directly
{
- destVal = dest.mParamValues[cIt->first];
- }
- else
- {
- continue;
- }
-
- // skip if not a vector
- if(!cIt->second.isArray())
- {
- continue;
+ iter->second = srcVal.asReal() + ((destVal.asReal() - srcVal.asReal()) * weight);
}
-
- // only Real vectors allowed
- if(!cIt->second[0].isReal())
+ else if(iter->second.isArray() && iter->second[0].isReal() // If it's an array of reals, loop through the reals and interpolate on those
+ && iter->second.size() == srcVal.size() && iter->second.size() == destVal.size())
{
- continue;
+ // Actually do interpolation: old value + (difference in values * factor)
+ for(int i=0; i < iter->second.size(); ++i)
+ {
+ // iter->second[i] = (1.f-weight)*(F32)srcVal[i].asReal() + weight*(F32)destVal[i].asReal(); // old way of doing it -- equivalent but one more operation
+ iter->second[i] = srcVal[i].asReal() + ((destVal[i].asReal() - srcVal[i].asReal()) * weight);
+ }
}
-
- // make sure all the same size
- if( cIt->second.size() != srcVal.size() ||
- cIt->second.size() != destVal.size())
+ else // Else, skip
{
continue;
- }
-
- // more error checking might be necessary;
-
- for(int i=0; i < cIt->second.size(); ++i)
- {
- cIt->second[i] = (1.0f - weight) * (F32) srcVal[i].asReal() +
- weight * (F32) destVal[i].asReal();
- }
+ }
}
// now mix the extra parameters
diff --git a/indra/newview/llwlparamset.h b/indra/newview/llwlparamset.h
index 487e2bf922..b087119dd5 100644
--- a/indra/newview/llwlparamset.h
+++ b/indra/newview/llwlparamset.h
@@ -32,10 +32,9 @@
#include "v4math.h"
#include "v4color.h"
-#include "llviewershadermgr.h"
-class LLFloaterWindLight;
class LLWLParamSet;
+class LLGLSLShader;
/// A class representing a set of parameter values for the WindLight shaders.
class LLWLParamSet {
@@ -111,7 +110,7 @@ public:
/// \param error A flag to set if it's not the proper return type
LLVector4 getVector(const std::string& paramName, bool& error);
- /// Get an integer parameter
+ /// Get a float parameter
/// \param paramName The name of the parameter to set.
/// \param error A flag to set if it's not the proper return type
F32 getFloat(const std::string& paramName, bool& error);
diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp
index 399442e5c4..3d971e738e 100644
--- a/indra/newview/llworld.cpp
+++ b/indra/newview/llworld.cpp
@@ -50,6 +50,7 @@
#include "llviewerstats.h"
#include "llvlcomposition.h"
#include "llvoavatar.h"
+#include "llvocache.h"
#include "llvowater.h"
#include "message.h"
#include "pipeline.h"
@@ -60,6 +61,7 @@
#include <map>
#include <cstring>
+
//
// Globals
//
@@ -90,19 +92,13 @@ LLWorld::LLWorld() :
mLastPacketsIn(0),
mLastPacketsOut(0),
mLastPacketsLost(0),
- mSpaceTimeUSec(0),
- mClassicCloudsEnabled(TRUE)
+ mSpaceTimeUSec(0)
{
for (S32 i = 0; i < 8; i++)
{
mEdgeWaterObjects[i] = NULL;
}
- if (gNoRender)
- {
- return;
- }
-
LLPointer<LLImageRaw> raw = new LLImageRaw(1,1,4);
U8 *default_texture = raw->getData();
*(default_texture++) = MAX_WATER_COLOR.mV[0];
@@ -131,6 +127,12 @@ void LLWorld::destroyClass()
LLVOCache::getInstance()->destroyClass() ;
}
LLViewerPartSim::getInstance()->destroyClass();
+
+ mDefaultWaterTexturep = NULL ;
+ for (S32 i = 0; i < 8; i++)
+ {
+ mEdgeWaterObjects[i] = NULL;
+ }
}
@@ -187,10 +189,6 @@ LLViewerRegion* LLWorld::addRegion(const U64 &region_handle, const LLHost &host)
llerrs << "Unable to create new region!" << llendl;
}
- regionp->mCloudLayer.create(regionp);
- regionp->mCloudLayer.setWidth((F32)mWidth);
- regionp->mCloudLayer.setWindPointer(&regionp->mWind);
-
mRegionList.push_back(regionp);
mActiveRegionList.push_back(regionp);
mCulledRegionList.push_back(regionp);
@@ -281,6 +279,10 @@ void LLWorld::removeRegion(const LLHost &host)
delete regionp;
updateWaterObjects();
+
+ //double check all objects of this region are removed.
+ gObjectList.clearAllMapObjectsInRegion(regionp) ;
+ //llassert_always(!gObjectList.hasMapObjectInRegion(regionp)) ;
}
@@ -587,22 +589,22 @@ void LLWorld::updateVisibilities()
{
F32 cur_far_clip = LLViewerCamera::getInstance()->getFar();
- LLViewerCamera::getInstance()->setFar(mLandFarClip);
-
- F32 diagonal_squared = F_SQRT2 * F_SQRT2 * mWidth * mWidth;
- // Go through the culled list and check for visible regions
+ // Go through the culled list and check for visible regions (region is visible if land is visible)
for (region_list_t::iterator iter = mCulledRegionList.begin();
iter != mCulledRegionList.end(); )
{
region_list_t::iterator curiter = iter++;
LLViewerRegion* regionp = *curiter;
- F32 height = regionp->getLand().getMaxZ() - regionp->getLand().getMinZ();
- F32 radius = 0.5f*fsqrtf(height * height + diagonal_squared);
- if (!regionp->getLand().hasZData()
- || LLViewerCamera::getInstance()->sphereInFrustum(regionp->getCenterAgent(), radius))
+
+ LLSpatialPartition* part = regionp->getSpatialPartition(LLViewerRegion::PARTITION_TERRAIN);
+ if (part)
{
- mCulledRegionList.erase(curiter);
- mVisibleRegionList.push_back(regionp);
+ LLSpatialGroup* group = (LLSpatialGroup*) part->mOctree->getListener(0);
+ if (LLViewerCamera::getInstance()->AABBInFrustum(group->mBounds[0], group->mBounds[1]))
+ {
+ mCulledRegionList.erase(curiter);
+ mVisibleRegionList.push_back(regionp);
+ }
}
}
@@ -617,20 +619,20 @@ void LLWorld::updateVisibilities()
continue;
}
- F32 height = regionp->getLand().getMaxZ() - regionp->getLand().getMinZ();
- F32 radius = 0.5f*fsqrtf(height * height + diagonal_squared);
- if (LLViewerCamera::getInstance()->sphereInFrustum(regionp->getCenterAgent(), radius))
+ LLSpatialPartition* part = regionp->getSpatialPartition(LLViewerRegion::PARTITION_TERRAIN);
+ if (part)
{
- regionp->calculateCameraDistance();
- if (!gNoRender)
+ LLSpatialGroup* group = (LLSpatialGroup*) part->mOctree->getListener(0);
+ if (LLViewerCamera::getInstance()->AABBInFrustum(group->mBounds[0], group->mBounds[1]))
{
+ regionp->calculateCameraDistance();
regionp->getLand().updatePatchVisibilities(gAgent);
}
- }
- else
- {
- mVisibleRegionList.erase(curiter);
- mCulledRegionList.push_back(regionp);
+ else
+ {
+ mVisibleRegionList.erase(curiter);
+ mCulledRegionList.push_back(regionp);
+ }
}
}
@@ -664,92 +666,6 @@ void LLWorld::updateParticles()
LLViewerPartSim::getInstance()->updateSimulation();
}
-void LLWorld::updateClouds(const F32 dt)
-{
- static LLFastTimer::DeclareTimer ftm("World Clouds");
- LLFastTimer t(ftm);
-
- if ( gSavedSettings.getBOOL("FreezeTime") )
- {
- // don't move clouds in snapshot mode
- return;
- }
-
- if (
- mClassicCloudsEnabled !=
- gSavedSettings.getBOOL("SkyUseClassicClouds") )
- {
- // The classic cloud toggle has been flipped
- // gotta update all of the cloud layers
- mClassicCloudsEnabled =
- gSavedSettings.getBOOL("SkyUseClassicClouds");
-
- if ( !mClassicCloudsEnabled && mActiveRegionList.size() )
- {
- // We've transitioned to having classic clouds disabled
- // reset all cloud layers.
- for (
- region_list_t::iterator iter = mActiveRegionList.begin();
- iter != mActiveRegionList.end();
- ++iter)
- {
- LLViewerRegion* regionp = *iter;
- regionp->mCloudLayer.reset();
- }
-
- return;
- }
- }
- else if ( !mClassicCloudsEnabled ) return;
-
- if (mActiveRegionList.size())
- {
- for (region_list_t::iterator iter = mActiveRegionList.begin();
- iter != mActiveRegionList.end(); ++iter)
- {
- LLViewerRegion* regionp = *iter;
- regionp->mCloudLayer.updatePuffs(dt);
- }
-
- // Reshuffle who owns which puffs
- for (region_list_t::iterator iter = mActiveRegionList.begin();
- iter != mActiveRegionList.end(); ++iter)
- {
- LLViewerRegion* regionp = *iter;
- regionp->mCloudLayer.updatePuffOwnership();
- }
-
- // Add new puffs
- for (region_list_t::iterator iter = mActiveRegionList.begin();
- iter != mActiveRegionList.end(); ++iter)
- {
- LLViewerRegion* regionp = *iter;
- regionp->mCloudLayer.updatePuffCount();
- }
- }
-}
-
-LLCloudGroup* LLWorld::findCloudGroup(const LLCloudPuff &puff)
-{
- if (mActiveRegionList.size())
- {
- // Update all the cloud puff positions, and timer based stuff
- // such as death decay
- for (region_list_t::iterator iter = mActiveRegionList.begin();
- iter != mActiveRegionList.end(); ++iter)
- {
- LLViewerRegion* regionp = *iter;
- LLCloudGroup *groupp = regionp->mCloudLayer.findCloudGroup(puff);
- if (groupp)
- {
- return groupp;
- }
- }
- }
- return NULL;
-}
-
-
void LLWorld::renderPropertyLines()
{
S32 region_count = 0;
@@ -870,42 +786,6 @@ void LLWorld::waterHeightRegionInfo(std::string const& sim_name, F32 water_heigh
}
}
-// There are three types of water objects:
-// Region water objects: the water in a region.
-// Hole water objects: water in the void but within current draw distance.
-// Edge water objects: the water outside the draw distance, up till the horizon.
-//
-// For example:
-//
-// -----------------------horizon-------------------------
-// | | | |
-// | Edge Water | | |
-// | | | |
-// | | | |
-// | | | |
-// | | | |
-// | | rwidth | |
-// | | <-----> | |
-// -------------------------------------------------------
-// | |Hole |other| | |
-// | |Water|reg. | | |
-// | |-----------------| |
-// | |other|cur. |<--> | |
-// | |reg. | reg.| \__|_ draw distance |
-// | |-----------------| |
-// | | | |<--->| |
-// | | | | \__|_ range |
-// -------------------------------------------------------
-// | |<----width------>|<--horizon ext.->|
-// | | | |
-// | | | |
-// | | | |
-// | | | |
-// | | | |
-// | | | |
-// | | | |
-// -------------------------------------------------------
-//
void LLWorld::updateWaterObjects()
{
if (!gAgent.getRegion())
@@ -918,187 +798,28 @@ void LLWorld::updateWaterObjects()
return;
}
- // Region width in meters.
- S32 const rwidth = (S32)REGION_WIDTH_U32;
-
- // The distance we might see into the void
- // when standing on the edge of a region, in meters.
- S32 const draw_distance = llceil(mLandFarClip);
-
- // We can only have "holes" in the water (where there no region) if we
- // can have existing regions around it. Taking into account that this
- // code is only executed when we enter a region, and not when we walk
- // around in it, we (only) need to take into account regions that fall
- // within the draw_distance.
- //
- // Set 'range' to draw_distance, rounded up to the nearest multiple of rwidth.
- S32 const nsims = (draw_distance + rwidth - 1) / rwidth;
- S32 const range = nsims * rwidth;
-
- // Get South-West corner of current region.
- LLViewerRegion const* regionp = gAgent.getRegion();
+ // First, determine the min and max "box" of water objects
+ S32 min_x = 0;
+ S32 min_y = 0;
+ S32 max_x = 0;
+ S32 max_y = 0;
U32 region_x, region_y;
+
+ S32 rwidth = 256;
+
+ // We only want to fill in water for stuff that's near us, say, within 256 or 512m
+ S32 range = LLViewerCamera::getInstance()->getFar() > 256.f ? 512 : 256;
+
+ LLViewerRegion* regionp = gAgent.getRegion();
from_region_handle(regionp->getHandle(), &region_x, &region_y);
- // The min. and max. coordinates of the South-West corners of the Hole water objects.
- S32 const min_x = (S32)region_x - range;
- S32 const min_y = (S32)region_y - range;
- S32 const max_x = (S32)region_x + range;
- S32 const max_y = (S32)region_y + range;
-
- // Attempt to determine a sensible water height for all the
- // Hole Water objects.
- //
- // It make little sense to try to guess what the best water
- // height should be when that isn't completely obvious: if it's
- // impossible to satisfy every region's water height without
- // getting a jump in the water height.
- //
- // In order to keep the reasoning simple, we assume something
- // logical as a group of connected regions, where the coastline
- // is at the outer edge. Anything more complex that would "break"
- // under such an assumption would probably break anyway (would
- // depend on terrain editing and existing mega prims, say, if
- // anything would make sense at all).
- //
- // So, what we do is find all connected regions within the
- // draw distance that border void, and then pick the lowest
- // water height of those (coast) regions.
- S32 const n = 2 * nsims + 1;
- S32 const origin = nsims + nsims * n;
- std::vector<F32> water_heights(n * n);
- std::vector<U8> checked(n * n, 0); // index = nx + ny * n + origin;
- U8 const region_bit = 1;
- U8 const hole_bit = 2;
- U8 const bordering_hole_bit = 4;
- U8 const bordering_edge_bit = 8;
- // Use the legacy waterheight for the Edge water in the case
- // that we don't find any Hole water at all.
- F32 water_height = DEFAULT_WATER_HEIGHT;
- int max_count = 0;
- LL_DEBUGS("WaterHeight") << "Current region: " << regionp->getName() << "; water height: " << regionp->getWaterHeight() << " m." << LL_ENDL;
- std::map<S32, int> water_height_counts;
- typedef std::queue<std::pair<S32, S32>, std::deque<std::pair<S32, S32> > > nxny_pairs_type;
- nxny_pairs_type nxny_pairs;
- nxny_pairs.push(nxny_pairs_type::value_type(0, 0));
- water_heights[origin] = regionp->getWaterHeight();
- checked[origin] = region_bit;
- // For debugging purposes.
- int number_of_connected_regions = 1;
- int uninitialized_regions = 0;
- int bordering_hole = 0;
- int bordering_edge = 0;
- while(!nxny_pairs.empty())
- {
- S32 const nx = nxny_pairs.front().first;
- S32 const ny = nxny_pairs.front().second;
- LL_DEBUGS("WaterHeight") << "nx,ny = " << nx << "," << ny << LL_ENDL;
- S32 const index = nx + ny * n + origin;
- nxny_pairs.pop();
- for (S32 dir = 0; dir < 4; ++dir)
- {
- S32 const cnx = nx + gDirAxes[dir][0];
- S32 const cny = ny + gDirAxes[dir][1];
- LL_DEBUGS("WaterHeight") << "dir = " << dir << "; cnx,cny = " << cnx << "," << cny << LL_ENDL;
- S32 const cindex = cnx + cny * n + origin;
- bool is_hole = false;
- bool is_edge = false;
- LLViewerRegion* new_region_found = NULL;
- if (cnx < -nsims || cnx > nsims ||
- cny < -nsims || cny > nsims)
- {
- LL_DEBUGS("WaterHeight") << " Edge Water!" << LL_ENDL;
- // Bumped into Edge water object.
- is_edge = true;
- }
- else if (checked[cindex])
- {
- LL_DEBUGS("WaterHeight") << " Already checked before!" << LL_ENDL;
- // Already checked.
- is_hole = (checked[cindex] & hole_bit);
- }
- else
- {
- S32 x = (S32)region_x + cnx * rwidth;
- S32 y = (S32)region_y + cny * rwidth;
- U64 region_handle = to_region_handle(x, y);
- new_region_found = getRegionFromHandle(region_handle);
- is_hole = !new_region_found;
- checked[cindex] = is_hole ? hole_bit : region_bit;
- }
- if (is_hole)
- {
- // This was a region that borders at least one 'hole'.
- // Count the found coastline.
- F32 new_water_height = water_heights[index];
- LL_DEBUGS("WaterHeight") << " This is void; counting coastline with water height of " << new_water_height << LL_ENDL;
- S32 new_water_height_cm = llround(new_water_height * 100);
- int count = (water_height_counts[new_water_height_cm] += 1);
- // Just use the lowest water height: this is mainly about the horizon water,
- // and whatever we do, we don't want it to be possible to look under the water
- // when looking in the distance: it is better to make a step downwards in water
- // height when going away from the avie than a step upwards. However, since
- // everyone is used to DEFAULT_WATER_HEIGHT, don't allow a single region
- // to drag the water level below DEFAULT_WATER_HEIGHT on it's own.
- if (bordering_hole == 0 || // First time we get here.
- (new_water_height >= DEFAULT_WATER_HEIGHT &&
- new_water_height < water_height) ||
- (new_water_height < DEFAULT_WATER_HEIGHT &&
- count > max_count)
- )
- {
- water_height = new_water_height;
- }
- if (count > max_count)
- {
- max_count = count;
- }
- if (!(checked[index] & bordering_hole_bit))
- {
- checked[index] |= bordering_hole_bit;
- ++bordering_hole;
- }
- }
- else if (is_edge && !(checked[index] & bordering_edge_bit))
- {
- checked[index] |= bordering_edge_bit;
- ++bordering_edge;
- }
- if (!new_region_found)
- {
- // Dead end, there is no region here.
- continue;
- }
- // Found a new connected region.
- ++number_of_connected_regions;
- if (new_region_found->getName().empty())
- {
- // Uninitialized LLViewerRegion, don't use it's water height.
- LL_DEBUGS("WaterHeight") << " Uninitialized region." << LL_ENDL;
- ++uninitialized_regions;
- continue;
- }
- nxny_pairs.push(nxny_pairs_type::value_type(cnx, cny));
- water_heights[cindex] = new_region_found->getWaterHeight();
- LL_DEBUGS("WaterHeight") << " Found a new region (name: " << new_region_found->getName() << "; water height: " << water_heights[cindex] << " m)!" << LL_ENDL;
- }
- }
- llinfos << "Number of connected regions: " << number_of_connected_regions << " (" << uninitialized_regions <<
- " uninitialized); number of regions bordering Hole water: " << bordering_hole <<
- "; number of regions bordering Edge water: " << bordering_edge << llendl;
- llinfos << "Coastline count (height, count): ";
- bool first = true;
- for (std::map<S32, int>::iterator iter = water_height_counts.begin(); iter != water_height_counts.end(); ++iter)
- {
- if (!first) llcont << ", ";
- llcont << "(" << (iter->first / 100.f) << ", " << iter->second << ")";
- first = false;
- }
- llcont << llendl;
- llinfos << "Water height used for Hole and Edge water objects: " << water_height << llendl;
+ min_x = (S32)region_x - range;
+ min_y = (S32)region_y - range;
+ max_x = (S32)region_x + range;
+ max_y = (S32)region_y + range;
- // Update all Region water objects.
- for (region_list_t::iterator iter = mRegionList.begin(); iter != mRegionList.end(); ++iter)
+ for (region_list_t::iterator iter = mRegionList.begin();
+ iter != mRegionList.end(); ++iter)
{
LLViewerRegion* regionp = *iter;
LLVOWater* waterp = regionp->getLand().getWaterObj();
@@ -1108,75 +829,94 @@ void LLWorld::updateWaterObjects()
}
}
- // Clean up all existing Hole water objects.
for (std::list<LLVOWater*>::iterator iter = mHoleWaterObjects.begin();
- iter != mHoleWaterObjects.end(); ++iter)
+ iter != mHoleWaterObjects.end(); ++ iter)
{
LLVOWater* waterp = *iter;
gObjectList.killObject(waterp);
}
mHoleWaterObjects.clear();
- // Let the Edge and Hole water boxes be 1024 meter high so that they
- // are never too small to be drawn (A LL_VO_*_WATER box has water
- // rendered on it's bottom surface only), and put their bottom at
- // the current regions water height.
- F32 const box_height = 1024;
- F32 const water_center_z = water_height + box_height / 2;
-
- // Create new Hole water objects within 'range' where there is no region.
- for (S32 x = min_x; x <= max_x; x += rwidth)
+ // Now, get a list of the holes
+ S32 x, y;
+ F32 water_height = gAgent.getRegion()->getWaterHeight() + 256.f;
+ for (x = min_x; x <= max_x; x += rwidth)
{
- for (S32 y = min_y; y <= max_y; y += rwidth)
+ for (y = min_y; y <= max_y; y += rwidth)
{
U64 region_handle = to_region_handle(x, y);
if (!getRegionFromHandle(region_handle))
{
- LLVOWater* waterp = (LLVOWater*)gObjectList.createObjectViewer(LLViewerObject::LL_VO_VOID_WATER, gAgent.getRegion());
+ LLVOWater* waterp = (LLVOWater *)gObjectList.createObjectViewer(LLViewerObject::LL_VO_WATER, gAgent.getRegion());
waterp->setUseTexture(FALSE);
- waterp->setPositionGlobal(LLVector3d(x + rwidth / 2, y + rwidth / 2, water_center_z));
- waterp->setScale(LLVector3((F32)rwidth, (F32)rwidth, box_height));
+ waterp->setPositionGlobal(LLVector3d(x + rwidth/2,
+ y + rwidth/2,
+ water_height));
+ waterp->setScale(LLVector3((F32)rwidth, (F32)rwidth, 512.f));
gPipeline.createObject(waterp);
mHoleWaterObjects.push_back(waterp);
}
}
}
- // Center of the region.
- S32 const center_x = region_x + rwidth / 2;
- S32 const center_y = region_y + rwidth / 2;
- // Width of the area with Hole water objects.
- S32 const width = rwidth + 2 * range;
- S32 const horizon_extend = 2048 + 512 - range; // Legacy value.
- // The overlap is needed to get rid of sky pixels being visible between the
- // Edge and Hole water object at greater distances (due to floating point
- // round off errors).
- S32 const edge_hole_overlap = 1; // Twice the actual overlap.
+ // Update edge water objects
+ S32 wx, wy;
+ S32 center_x, center_y;
+ wx = (max_x - min_x) + rwidth;
+ wy = (max_y - min_y) + rwidth;
+ center_x = min_x + (wx >> 1);
+ center_y = min_y + (wy >> 1);
+
+ S32 add_boundary[4] = {
+ 512 - (max_x - region_x),
+ 512 - (max_y - region_y),
+ 512 - (region_x - min_x),
+ 512 - (region_y - min_y) };
- for (S32 dir = 0; dir < 8; ++dir)
+ S32 dir;
+ for (dir = 0; dir < 8; dir++)
{
- // Size of the Edge water objects.
- S32 const dim_x = (gDirAxes[dir][0] == 0) ? width : (horizon_extend + edge_hole_overlap);
- S32 const dim_y = (gDirAxes[dir][1] == 0) ? width : (horizon_extend + edge_hole_overlap);
- // And their position.
- S32 const water_center_x = center_x + (width + horizon_extend) / 2 * gDirAxes[dir][0];
- S32 const water_center_y = center_y + (width + horizon_extend) / 2 * gDirAxes[dir][1];
+ S32 dim[2] = { 0 };
+ switch (gDirAxes[dir][0])
+ {
+ case -1: dim[0] = add_boundary[2]; break;
+ case 0: dim[0] = wx; break;
+ default: dim[0] = add_boundary[0]; break;
+ }
+ switch (gDirAxes[dir][1])
+ {
+ case -1: dim[1] = add_boundary[3]; break;
+ case 0: dim[1] = wy; break;
+ default: dim[1] = add_boundary[1]; break;
+ }
+ // Resize and reshape the water objects
+ const S32 water_center_x = center_x + llround((wx + dim[0]) * 0.5f * gDirAxes[dir][0]);
+ const S32 water_center_y = center_y + llround((wy + dim[1]) * 0.5f * gDirAxes[dir][1]);
+
LLVOWater* waterp = mEdgeWaterObjects[dir];
if (!waterp || waterp->isDead())
{
// The edge water objects can be dead because they're attached to the region that the
// agent was in when they were originally created.
- mEdgeWaterObjects[dir] = (LLVOWater *)gObjectList.createObjectViewer(LLViewerObject::LL_VO_VOID_WATER, gAgent.getRegion());
+ mEdgeWaterObjects[dir] = (LLVOWater *)gObjectList.createObjectViewer(LLViewerObject::LL_VO_VOID_WATER,
+ gAgent.getRegion());
waterp = mEdgeWaterObjects[dir];
waterp->setUseTexture(FALSE);
- waterp->setIsEdgePatch(TRUE); // Mark that this is edge water and not hole water.
+ waterp->setIsEdgePatch(TRUE);
gPipeline.createObject(waterp);
}
waterp->setRegion(gAgent.getRegion());
- LLVector3d water_pos(water_center_x, water_center_y, water_center_z);
- LLVector3 water_scale((F32) dim_x, (F32) dim_y, box_height);
+ LLVector3d water_pos(water_center_x, water_center_y, water_height) ;
+ LLVector3 water_scale((F32) dim[0], (F32) dim[1], 512.f);
+
+ //stretch out to horizon
+ water_scale.mV[0] += fabsf(2048.f * gDirAxes[dir][0]);
+ water_scale.mV[1] += fabsf(2048.f * gDirAxes[dir][1]);
+
+ water_pos.mdV[0] += 1024.f * gDirAxes[dir][0];
+ water_pos.mdV[1] += 1024.f * gDirAxes[dir][1];
waterp->setPositionGlobal(water_pos);
waterp->setScale(water_scale);
@@ -1185,6 +925,7 @@ void LLWorld::updateWaterObjects()
}
}
+
void LLWorld::shiftRegions(const LLVector3& offset)
{
for (region_list_t::const_iterator i = getRegionList().begin(); i != getRegionList().end(); ++i)
@@ -1420,28 +1161,19 @@ void send_agent_resume()
static LLVector3d unpackLocalToGlobalPosition(U32 compact_local, const LLVector3d& region_origin)
{
- LLVector3d pos_global;
- LLVector3 pos_local;
- U8 bits;
-
- bits = compact_local & 0xFF;
- pos_local.mV[VZ] = F32(bits) * 4.f;
- compact_local >>= 8;
+ LLVector3d pos_local;
- bits = compact_local & 0xFF;
- pos_local.mV[VY] = (F32)bits;
- compact_local >>= 8;
+ pos_local.mdV[VZ] = (compact_local & 0xFFU) * 4;
+ pos_local.mdV[VY] = (compact_local >> 8) & 0xFFU;
+ pos_local.mdV[VX] = (compact_local >> 16) & 0xFFU;
- bits = compact_local & 0xFF;
- pos_local.mV[VX] = (F32)bits;
-
- pos_global.setVec( pos_local );
- pos_global += region_origin;
- return pos_global;
+ return region_origin + pos_local;
}
void LLWorld::getAvatars(uuid_vec_t* avatar_ids, std::vector<LLVector3d>* positions, const LLVector3d& relative_to, F32 radius) const
{
+ F32 radius_squared = radius * radius;
+
if(avatar_ids != NULL)
{
avatar_ids->clear();
@@ -1450,6 +1182,33 @@ void LLWorld::getAvatars(uuid_vec_t* avatar_ids, std::vector<LLVector3d>* positi
{
positions->clear();
}
+ // get the list of avatars from the character list first, so distances are correct
+ // when agent is above 1020m and other avatars are nearby
+ for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();
+ iter != LLCharacter::sInstances.end(); ++iter)
+ {
+ LLVOAvatar* pVOAvatar = (LLVOAvatar*) *iter;
+
+ if (!pVOAvatar->isDead() && !pVOAvatar->isSelf())
+ {
+ LLVector3d pos_global = pVOAvatar->getPositionGlobal();
+ LLUUID uuid = pVOAvatar->getID();
+
+ if (!uuid.isNull()
+ && dist_vec_squared(pos_global, relative_to) <= radius_squared)
+ {
+ if(positions != NULL)
+ {
+ positions->push_back(pos_global);
+ }
+ if(avatar_ids !=NULL)
+ {
+ avatar_ids->push_back(uuid);
+ }
+ }
+ }
+ }
+ // region avatars added for situations where radius is greater than RenderFarClip
for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin();
iter != LLWorld::getInstance()->getRegionList().end(); ++iter)
{
@@ -1459,21 +1218,28 @@ void LLWorld::getAvatars(uuid_vec_t* avatar_ids, std::vector<LLVector3d>* positi
for (S32 i = 0; i < count; i++)
{
LLVector3d pos_global = unpackLocalToGlobalPosition(regionp->mMapAvatars.get(i), origin_global);
- if(dist_vec(pos_global, relative_to) <= radius)
+ if(dist_vec_squared(pos_global, relative_to) <= radius_squared)
{
- if(positions != NULL)
- {
- positions->push_back(pos_global);
- }
- if(avatar_ids != NULL)
+ LLUUID uuid = regionp->mMapAvatarIDs.get(i);
+ // if this avatar doesn't already exist in the list, add it
+ if(uuid.notNull() && avatar_ids != NULL && std::find(avatar_ids->begin(), avatar_ids->end(), uuid) == avatar_ids->end())
{
- avatar_ids->push_back(regionp->mMapAvatarIDs.get(i));
+ if (positions != NULL)
+ {
+ positions->push_back(pos_global);
+ }
+ avatar_ids->push_back(uuid);
}
}
}
}
}
+bool LLWorld::isRegionListed(const LLViewerRegion* region) const
+{
+ region_list_t::const_iterator it = find(mRegionList.begin(), mRegionList.end(), region);
+ return it != mRegionList.end();
+}
LLHTTPRegistration<LLEstablishAgentCommunication>
gHTTPRegistrationEstablishAgentCommunication(
diff --git a/indra/newview/llworld.h b/indra/newview/llworld.h
index d8ab4bc508..f350009d10 100644
--- a/indra/newview/llworld.h
+++ b/indra/newview/llworld.h
@@ -157,6 +157,11 @@ public:
std::vector<LLVector3d>* positions = NULL,
const LLVector3d& relative_to = LLVector3d(), F32 radius = FLT_MAX) const;
+ // Returns 'true' if the region is in mRegionList,
+ // 'false' if the region has been removed due to region change
+ // or if the circuit to this simulator had been lost.
+ bool isRegionListed(const LLViewerRegion* region) const;
+
private:
region_list_t mActiveRegionList;
region_list_t mRegionList;
diff --git a/indra/newview/llworldmapmessage.cpp b/indra/newview/llworldmapmessage.cpp
index 66d0d698ba..8307d32336 100644
--- a/indra/newview/llworldmapmessage.cpp
+++ b/indra/newview/llworldmapmessage.cpp
@@ -210,15 +210,14 @@ void LLWorldMapMessage::processMapBlockReply(LLMessageSystem* msg, void**)
}
// Handle the SLURL callback if any
- if(LLWorldMapMessage::getInstance()->mSLURLCallback != NULL)
+ url_callback_t callback = LLWorldMapMessage::getInstance()->mSLURLCallback;
+ if(callback != NULL)
{
U64 handle = to_region_handle(x_world, y_world);
// Check if we reached the requested region
if ((LLStringUtil::compareInsensitive(LLWorldMapMessage::getInstance()->mSLURLRegionName, name)==0)
|| (LLWorldMapMessage::getInstance()->mSLURLRegionHandle == handle))
{
- url_callback_t callback = LLWorldMapMessage::getInstance()->mSLURLCallback;
-
LLWorldMapMessage::getInstance()->mSLURLCallback = NULL;
LLWorldMapMessage::getInstance()->mSLURLRegionName.clear();
LLWorldMapMessage::getInstance()->mSLURLRegionHandle = 0;
diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp
index 8ef3a3b839..a3ccf87cfc 100644
--- a/indra/newview/llworldmapview.cpp
+++ b/indra/newview/llworldmapview.cpp
@@ -77,6 +77,7 @@ LLUIImagePtr LLWorldMapView::sAvatarYouLargeImage = NULL;
LLUIImagePtr LLWorldMapView::sAvatarLevelImage = NULL;
LLUIImagePtr LLWorldMapView::sAvatarAboveImage = NULL;
LLUIImagePtr LLWorldMapView::sAvatarBelowImage = NULL;
+LLUIImagePtr LLWorldMapView::sAvatarUnknownImage = NULL;
LLUIImagePtr LLWorldMapView::sTelehubImage = NULL;
LLUIImagePtr LLWorldMapView::sInfohubImage = NULL;
@@ -120,6 +121,7 @@ void LLWorldMapView::initClass()
sAvatarLevelImage = LLUI::getUIImage("map_avatar_32.tga");
sAvatarAboveImage = LLUI::getUIImage("map_avatar_above_32.tga");
sAvatarBelowImage = LLUI::getUIImage("map_avatar_below_32.tga");
+ sAvatarUnknownImage = LLUI::getUIImage("map_avatar_unknown_32.tga");
sHomeImage = LLUI::getUIImage("map_home.tga");
sTelehubImage = LLUI::getUIImage("map_telehub.tga");
@@ -149,6 +151,7 @@ void LLWorldMapView::cleanupClass()
sAvatarLevelImage = NULL;
sAvatarAboveImage = NULL;
sAvatarBelowImage = NULL;
+ sAvatarUnknownImage = NULL;
sTelehubImage = NULL;
sInfohubImage = NULL;
@@ -314,7 +317,7 @@ void LLWorldMapView::draw()
{
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
// Clear the background alpha to 0
gGL.flush();
@@ -422,7 +425,7 @@ void LLWorldMapView::draw()
// Draw something whenever we have enough info
if (overlayimage->hasGLTexture())
{
- gGL.blendFunc(LLRender::BF_DEST_ALPHA, LLRender::BF_ZERO);
+ gGL.blendFunc(LLRender::BF_SOURCE_ALPHA, LLRender::BF_ONE_MINUS_SOURCE_ALPHA);
gGL.getTexUnit(0)->bind(overlayimage);
gGL.color4f(1.f, 1.f, 1.f, 1.f);
gGL.begin(LLRender::QUADS);
@@ -513,7 +516,7 @@ void LLWorldMapView::draw()
TRUE,
"You are here",
"",
- llround(LLFontGL::getFontSansSerifSmall()->getLineHeight())); // offset vertically by one line, to avoid overlap with target tracking
+ LLFontGL::getFontSansSerifSmall()->getLineHeight()); // offset vertically by one line, to avoid overlap with target tracking
}
// Draw the current agent viewing angle
@@ -992,7 +995,7 @@ void LLWorldMapView::drawTracking(const LLVector3d& pos_global, const LLColor4&
const S32 TEXT_PADDING = DEFAULT_TRACKING_ARROW_SIZE + 2;
S32 half_text_width = llfloor(font->getWidthF32(label) * 0.5f);
text_x = llclamp(text_x, half_text_width + TEXT_PADDING, getRect().getWidth() - half_text_width - TEXT_PADDING);
- text_y = llclamp(text_y + vert_offset, TEXT_PADDING + vert_offset, getRect().getHeight() - llround(font->getLineHeight()) - TEXT_PADDING - vert_offset);
+ text_y = llclamp(text_y + vert_offset, TEXT_PADDING + vert_offset, getRect().getHeight() - font->getLineHeight() - TEXT_PADDING - vert_offset);
if (label != "")
{
@@ -1005,7 +1008,7 @@ void LLWorldMapView::drawTracking(const LLVector3d& pos_global, const LLColor4&
if (tooltip != "")
{
- text_y -= (S32)font->getLineHeight();
+ text_y -= font->getLineHeight();
font->renderUTF8(
tooltip, 0,
@@ -1147,17 +1150,25 @@ void LLWorldMapView::drawAvatar(F32 x_pixels,
F32 y_pixels,
const LLColor4& color,
F32 relative_z,
- F32 dot_radius)
+ F32 dot_radius,
+ bool unknown_relative_z)
{
const F32 HEIGHT_THRESHOLD = 7.f;
LLUIImagePtr dot_image = sAvatarLevelImage;
- if(relative_z < -HEIGHT_THRESHOLD)
+ if (unknown_relative_z)
{
- dot_image = sAvatarBelowImage;
+ dot_image = sAvatarUnknownImage;
}
- else if(relative_z > HEIGHT_THRESHOLD)
- {
- dot_image = sAvatarAboveImage;
+ else
+ {
+ if(relative_z < -HEIGHT_THRESHOLD)
+ {
+ dot_image = sAvatarBelowImage;
+ }
+ else if(relative_z > HEIGHT_THRESHOLD)
+ {
+ dot_image = sAvatarAboveImage;
+ }
}
S32 dot_width = llround(dot_radius * 2.f);
dot_image->draw(llround(x_pixels - dot_radius),
@@ -1203,7 +1214,7 @@ void LLWorldMapView::drawIconName(F32 x_pixels,
LLFontGL::NORMAL,
LLFontGL::DROP_SHADOW);
- text_y -= llround(LLFontGL::getFontSansSerif()->getLineHeight());
+ text_y -= LLFontGL::getFontSansSerif()->getLineHeight();
// render text
LLFontGL::getFontSansSerif()->renderUTF8(second_line, 0,
@@ -1307,7 +1318,7 @@ void LLWorldMapView::drawTrackingCircle( const LLRect& rect, S32 x, S32 y, const
end_theta -= angle_adjust_y;
}
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.pushMatrix();
gGL.translatef((F32)x, (F32)y, 0.f);
gl_washer_segment_2d(inner_radius, outer_radius, start_theta, end_theta, 40, color, color);
@@ -1745,20 +1756,20 @@ BOOL LLWorldMapView::handleDoubleClick( S32 x, S32 y, MASK mask )
// Invoke the event details floater if someone is clicking on an event.
LLSD params(LLSD::emptyArray());
params.append(event_id);
- LLCommandDispatcher::dispatch("event", params, LLSD(), NULL, true);
+ LLCommandDispatcher::dispatch("event", params, LLSD(), NULL, "clicked", true);
break;
}
case MAP_ITEM_LAND_FOR_SALE:
case MAP_ITEM_LAND_FOR_SALE_ADULT:
{
LLFloaterReg::hideInstance("world_map");
- LLFloaterReg::showInstance("search", LLSD().with("category", "destinations").with("id", id));
+ LLFloaterReg::showInstance("search", LLSD().with("category", "destinations").with("query", id));
break;
}
case MAP_ITEM_CLASSIFIED:
{
LLFloaterReg::hideInstance("world_map");
- LLFloaterReg::showInstance("search", LLSD().with("category", "classifieds").with("id", id));
+ LLFloaterReg::showInstance("search", LLSD().with("category", "classifieds").with("query", id));
break;
}
default:
diff --git a/indra/newview/llworldmapview.h b/indra/newview/llworldmapview.h
index 9ab53b1ba3..a2a6dc53fb 100644
--- a/indra/newview/llworldmapview.h
+++ b/indra/newview/llworldmapview.h
@@ -112,7 +112,8 @@ public:
F32 y_pixels,
const LLColor4& color,
F32 relative_z = 0.f,
- F32 dot_radius = 3.f);
+ F32 dot_radius = 3.f,
+ bool reached_max_z = false);
static void drawIconName(F32 x_pixels,
F32 y_pixels,
const LLColor4& color,
@@ -138,6 +139,7 @@ public:
static LLUIImagePtr sAvatarLevelImage;
static LLUIImagePtr sAvatarAboveImage;
static LLUIImagePtr sAvatarBelowImage;
+ static LLUIImagePtr sAvatarUnknownImage;
static LLUIImagePtr sTelehubImage;
static LLUIImagePtr sInfohubImage;
diff --git a/indra/newview/llworldmipmap.cpp b/indra/newview/llworldmipmap.cpp
index be8298daab..74ed844376 100644
--- a/indra/newview/llworldmipmap.cpp
+++ b/indra/newview/llworldmipmap.cpp
@@ -181,8 +181,7 @@ LLPointer<LLViewerFetchedTexture> LLWorldMipmap::getObjectsTile(U32 grid_x, U32
LLPointer<LLViewerFetchedTexture> LLWorldMipmap::loadObjectsTile(U32 grid_x, U32 grid_y, S32 level)
{
// Get the grid coordinates
- std::string imageurl = gSavedSettings.getString("MapServerURL") + llformat("map-%d-%d-%d-objects.jpg", level, grid_x, grid_y);
-
+ std::string imageurl = gSavedSettings.getString("CurrentMapServerURL") + llformat("map-%d-%d-%d-objects.jpg", level, grid_x, grid_y);
// DO NOT COMMIT!! DEBUG ONLY!!!
// Use a local jpeg for every tile to test map speed without S3 access
diff --git a/indra/newview/llworldview.cpp b/indra/newview/llworldview.cpp
deleted file mode 100644
index f5dc2a5290..0000000000
--- a/indra/newview/llworldview.cpp
+++ /dev/null
@@ -1,61 +0,0 @@
-/**
- * @file llworldview.cpp
- * @brief LLWorldView class implementation
- *
- * $LicenseInfo:firstyear=2001&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llworldview.h"
-
-#include "llviewercontrol.h"
-#include "llsidetray.h"
-/////////////////////////////////////////////////////
-// LLFloaterView
-
-static LLDefaultChildRegistry::Register<LLWorldView> r("world_view");
-
-LLWorldView::LLWorldView(const Params& p)
-: LLUICtrl (p)
-{
- gSavedSettings.getControl("SidebarCameraMovement")->getSignal()->connect(boost::bind(&LLWorldView::toggleSidebarCameraMovement, this, _2));
-}
-
-void LLWorldView::reshape(S32 width, S32 height, BOOL called_from_parent)
-{
- //if (FALSE == gSavedSettings.getBOOL("SidebarCameraMovement") )
- //{
- // LLView* main_view = LLUI::getRootView()->findChild<LLView>("main_view");
- // if(main_view)
- // {
- // width = main_view->getRect().getWidth();
- // }
- //}
-
- LLUICtrl::reshape(width, height, called_from_parent);
-}
-void LLWorldView::toggleSidebarCameraMovement(const LLSD::Boolean& new_visibility)
-{
- reshape(getParent()->getRect().getWidth(),getRect().getHeight());
-}
-
diff --git a/indra/newview/llxmlrpclistener.cpp b/indra/newview/llxmlrpclistener.cpp
index 2596f239ca..97a9eb7f5f 100644
--- a/indra/newview/llxmlrpclistener.cpp
+++ b/indra/newview/llxmlrpclistener.cpp
@@ -499,6 +499,13 @@ private:
// 'array' as the value of this 'key'.
responses.insert(key, array);
}
+ else if (xmlrpc_type_struct == type)
+ {
+ LLSD submap = parseValues(status_string,
+ STRINGIZE(key_pfx << key << ':'),
+ current);
+ responses.insert(key, submap);
+ }
else
{
// whoops - unrecognized type
diff --git a/indra/newview/llxmlrpctransaction.cpp b/indra/newview/llxmlrpctransaction.cpp
index 257884d921..0da70d398b 100644
--- a/indra/newview/llxmlrpctransaction.cpp
+++ b/indra/newview/llxmlrpctransaction.cpp
@@ -305,20 +305,18 @@ void LLXMLRPCTransaction::Impl::init(XMLRPC_REQUEST request, bool useGzip)
{
mCurlRequest = new LLCurlEasyRequest();
}
- mErrorCert = NULL;
-
- if (gSavedSettings.getBOOL("BrowserProxyEnabled"))
+ if(!mCurlRequest->isValid())
{
- mProxyAddress = gSavedSettings.getString("BrowserProxyAddress");
- S32 port = gSavedSettings.getS32 ( "BrowserProxyPort" );
+ llwarns << "mCurlRequest is invalid." << llendl ;
- // tell curl about the settings
- mCurlRequest->setoptString(CURLOPT_PROXY, mProxyAddress);
- mCurlRequest->setopt(CURLOPT_PROXYPORT, port);
- mCurlRequest->setopt(CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
+ delete mCurlRequest ;
+ mCurlRequest = NULL ;
+ return ;
}
-// mCurlRequest->setopt(CURLOPT_VERBOSE, 1); // usefull for debugging
+ mErrorCert = NULL;
+
+// mCurlRequest->setopt(CURLOPT_VERBOSE, 1); // useful for debugging
mCurlRequest->setopt(CURLOPT_NOSIGNAL, 1);
mCurlRequest->setWriteCallback(&curlDownloadCallback, (void*)this);
BOOL vefifySSLCert = !gSavedSettings.getBOOL("NoVerifySSLCert");
@@ -368,10 +366,20 @@ LLXMLRPCTransaction::Impl::~Impl()
}
delete mCurlRequest;
+ mCurlRequest = NULL ;
}
bool LLXMLRPCTransaction::Impl::process()
{
+ if(!mCurlRequest || !mCurlRequest->isValid())
+ {
+ llwarns << "transaction failed." << llendl ;
+
+ delete mCurlRequest ;
+ mCurlRequest = NULL ;
+ return true ; //failed, quit.
+ }
+
switch(mStatus)
{
case LLXMLRPCTransaction::StatusComplete:
@@ -393,16 +401,10 @@ bool LLXMLRPCTransaction::Impl::process()
// continue onward
}
}
-
- const F32 MAX_PROCESSING_TIME = 0.05f;
- LLTimer timer;
-
- while (mCurlRequest->perform() > 0)
+
+ if(!mCurlRequest->wait())
{
- if (timer.getElapsedTimeF32() >= MAX_PROCESSING_TIME)
- {
- return false;
- }
+ return false ;
}
while(1)
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 15477e0a80..ab994c71cb 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -67,6 +67,7 @@
#include "llhudnametag.h"
#include "llhudtext.h"
#include "lllightconstants.h"
+#include "llmeshrepository.h"
#include "llresmgr.h"
#include "llselectmgr.h"
#include "llsky.h"
@@ -74,6 +75,7 @@
#include "lltool.h"
#include "lltoolmgr.h"
#include "llviewercamera.h"
+#include "llviewermediafocus.h"
#include "llviewertexturelist.h"
#include "llviewerobject.h"
#include "llviewerobjectlist.h"
@@ -100,6 +102,8 @@
#include "llspatialpartition.h"
#include "llmutelist.h"
#include "lltoolpie.h"
+#include "llcurl.h"
+#include "llnotifications.h"
#ifdef _DEBUG
@@ -109,13 +113,88 @@
//#define DEBUG_INDICES
#endif
+//cached settings
+BOOL LLPipeline::RenderAvatarVP;
+BOOL LLPipeline::VertexShaderEnable;
+BOOL LLPipeline::WindLightUseAtmosShaders;
+BOOL LLPipeline::RenderDeferred;
+F32 LLPipeline::RenderDeferredSunWash;
+U32 LLPipeline::RenderFSAASamples;
+U32 LLPipeline::RenderResolutionDivisor;
+BOOL LLPipeline::RenderUIBuffer;
+S32 LLPipeline::RenderShadowDetail;
+BOOL LLPipeline::RenderDeferredSSAO;
+F32 LLPipeline::RenderShadowResolutionScale;
+BOOL LLPipeline::RenderLocalLights;
+BOOL LLPipeline::RenderDelayCreation;
+BOOL LLPipeline::RenderAnimateRes;
+BOOL LLPipeline::FreezeTime;
+S32 LLPipeline::DebugBeaconLineWidth;
+F32 LLPipeline::RenderHighlightBrightness;
+LLColor4 LLPipeline::RenderHighlightColor;
+F32 LLPipeline::RenderHighlightThickness;
+BOOL LLPipeline::RenderSpotLightsInNondeferred;
+LLColor4 LLPipeline::PreviewAmbientColor;
+LLColor4 LLPipeline::PreviewDiffuse0;
+LLColor4 LLPipeline::PreviewSpecular0;
+LLColor4 LLPipeline::PreviewDiffuse1;
+LLColor4 LLPipeline::PreviewSpecular1;
+LLColor4 LLPipeline::PreviewDiffuse2;
+LLColor4 LLPipeline::PreviewSpecular2;
+LLVector3 LLPipeline::PreviewDirection0;
+LLVector3 LLPipeline::PreviewDirection1;
+LLVector3 LLPipeline::PreviewDirection2;
+F32 LLPipeline::RenderGlowMinLuminance;
+F32 LLPipeline::RenderGlowMaxExtractAlpha;
+F32 LLPipeline::RenderGlowWarmthAmount;
+LLVector3 LLPipeline::RenderGlowLumWeights;
+LLVector3 LLPipeline::RenderGlowWarmthWeights;
+S32 LLPipeline::RenderGlowResolutionPow;
+S32 LLPipeline::RenderGlowIterations;
+F32 LLPipeline::RenderGlowWidth;
+F32 LLPipeline::RenderGlowStrength;
+BOOL LLPipeline::RenderDepthOfField;
+F32 LLPipeline::CameraFocusTransitionTime;
+F32 LLPipeline::CameraFNumber;
+F32 LLPipeline::CameraFocalLength;
+F32 LLPipeline::CameraFieldOfView;
+F32 LLPipeline::RenderShadowNoise;
+F32 LLPipeline::RenderShadowBlurSize;
+F32 LLPipeline::RenderSSAOScale;
+U32 LLPipeline::RenderSSAOMaxScale;
+F32 LLPipeline::RenderSSAOFactor;
+LLVector3 LLPipeline::RenderSSAOEffect;
+F32 LLPipeline::RenderShadowOffsetError;
+F32 LLPipeline::RenderShadowBiasError;
+F32 LLPipeline::RenderShadowOffset;
+F32 LLPipeline::RenderShadowBias;
+F32 LLPipeline::RenderSpotShadowOffset;
+F32 LLPipeline::RenderSpotShadowBias;
+F32 LLPipeline::RenderEdgeDepthCutoff;
+F32 LLPipeline::RenderEdgeNormCutoff;
+LLVector3 LLPipeline::RenderShadowGaussian;
+F32 LLPipeline::RenderShadowBlurDistFactor;
+BOOL LLPipeline::RenderDeferredAtmospheric;
+S32 LLPipeline::RenderReflectionDetail;
+F32 LLPipeline::RenderHighlightFadeTime;
+LLVector3 LLPipeline::RenderShadowClipPlanes;
+LLVector3 LLPipeline::RenderShadowOrthoClipPlanes;
+LLVector3 LLPipeline::RenderShadowNearDist;
+F32 LLPipeline::RenderFarClip;
+LLVector3 LLPipeline::RenderShadowSplitExponent;
+F32 LLPipeline::RenderShadowErrorCutoff;
+F32 LLPipeline::RenderShadowFOVCutoff;
+BOOL LLPipeline::CameraOffset;
+F32 LLPipeline::CameraMaxCoF;
+F32 LLPipeline::CameraDoFResScale;
+
const F32 BACKLIGHT_DAY_MAGNITUDE_AVATAR = 0.2f;
const F32 BACKLIGHT_NIGHT_MAGNITUDE_AVATAR = 0.1f;
const F32 BACKLIGHT_DAY_MAGNITUDE_OBJECT = 0.1f;
const F32 BACKLIGHT_NIGHT_MAGNITUDE_OBJECT = 0.08f;
const S32 MAX_OFFSCREEN_GEOMETRY_CHANGES_PER_FRAME = 10;
const U32 REFLECTION_MAP_RES = 128;
-
+const U32 DEFERRED_VB_MASK = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_TEXCOORD1;
// Max number of occluders to search for. JC
const S32 MAX_OCCLUDER_COUNT = 2;
@@ -124,10 +203,6 @@ extern S32 gBoxFrame;
extern BOOL gDisplaySwapBuffers;
extern BOOL gDebugGL;
-// hack counter for rendering a fixed number of frames after toggling
-// fullscreen to work around DEV-5361
-static S32 sDelayedVBOEnable = 0;
-
BOOL gAvatarBacklight = FALSE;
BOOL gDebugPipeline = FALSE;
@@ -169,40 +244,30 @@ std::string gPoolNames[] =
// Correspond to LLDrawpool enum render type
"NONE",
"POOL_SIMPLE",
- "POOL_TERRAIN",
+ "POOL_GROUND",
+ "POOL_FULLBRIGHT",
"POOL_BUMP",
- "POOL_TREE",
+ "POOL_TERRAIN,"
"POOL_SKY",
"POOL_WL_SKY",
- "POOL_GROUND",
+ "POOL_TREE",
+ "POOL_GRASS",
"POOL_INVISIBLE",
"POOL_AVATAR",
+ "POOL_VOIDWATER",
"POOL_WATER",
- "POOL_GRASS",
- "POOL_FULLBRIGHT",
"POOL_GLOW",
- "POOL_ALPHA",
+ "POOL_ALPHA"
};
void drawBox(const LLVector3& c, const LLVector3& r);
void drawBoxOutline(const LLVector3& pos, const LLVector3& size);
+U32 nhpo2(U32 v);
-U32 nhpo2(U32 v)
-{
- U32 r = 1;
- while (r < v) {
- r *= 2;
- }
- return r;
-}
-
-glh::matrix4f glh_copy_matrix(GLdouble* src)
+glh::matrix4f glh_copy_matrix(F32* src)
{
glh::matrix4f ret;
- for (U32 i = 0; i < 16; i++)
- {
- ret.m[i] = (F32) src[i];
- }
+ ret.set_value(src);
return ret;
}
@@ -216,7 +281,17 @@ glh::matrix4f glh_get_current_projection()
return glh_copy_matrix(gGLProjection);
}
-void glh_copy_matrix(const glh::matrix4f& src, GLdouble* dst)
+glh::matrix4f glh_get_last_modelview()
+{
+ return glh_copy_matrix(gGLLastModelView);
+}
+
+glh::matrix4f glh_get_last_projection()
+{
+ return glh_copy_matrix(gGLLastProjection);
+}
+
+void glh_copy_matrix(const glh::matrix4f& src, F32* dst)
{
for (U32 i = 0; i < 16; i++)
{
@@ -253,6 +328,7 @@ S32 LLPipeline::sCompiles = 0;
BOOL LLPipeline::sPickAvatar = TRUE;
BOOL LLPipeline::sDynamicLOD = TRUE;
BOOL LLPipeline::sShowHUDAttachments = TRUE;
+BOOL LLPipeline::sRenderMOAPBeacons = FALSE;
BOOL LLPipeline::sRenderPhysicalBeacons = TRUE;
BOOL LLPipeline::sRenderScriptedBeacons = FALSE;
BOOL LLPipeline::sRenderScriptedTouchBeacons = TRUE;
@@ -267,6 +343,8 @@ BOOL LLPipeline::sAutoMaskAlphaDeferred = TRUE;
BOOL LLPipeline::sAutoMaskAlphaNonDeferred = FALSE;
BOOL LLPipeline::sDisableShaders = FALSE;
BOOL LLPipeline::sRenderBump = TRUE;
+BOOL LLPipeline::sBakeSunlight = FALSE;
+BOOL LLPipeline::sNoAlpha = FALSE;
BOOL LLPipeline::sUseTriStrips = TRUE;
BOOL LLPipeline::sUseFarClip = TRUE;
BOOL LLPipeline::sShadowRender = FALSE;
@@ -280,7 +358,7 @@ BOOL LLPipeline::sRenderFrameTest = FALSE;
BOOL LLPipeline::sRenderAttachedLights = TRUE;
BOOL LLPipeline::sRenderAttachedParticles = TRUE;
BOOL LLPipeline::sRenderDeferred = FALSE;
-BOOL LLPipeline::sAllowRebuildPriorityGroup = FALSE ;
+BOOL LLPipeline::sMemAllocationThrottled = FALSE;
S32 LLPipeline::sVisibleLightCount = 0;
F32 LLPipeline::sMinRenderSize = 0.f;
@@ -300,10 +378,10 @@ static const U32 gl_cube_face[] =
void validate_framebuffer_object();
-void addDeferredAttachments(LLRenderTarget& target)
+bool addDeferredAttachments(LLRenderTarget& target)
{
- target.addColorAttachment(GL_RGBA); //specular
- target.addColorAttachment(GL_RGBA); //normal+z
+ return target.addColorAttachment(GL_RGBA) && //specular
+ target.addColorAttachment(GL_RGBA); //normal+z
}
LLPipeline::LLPipeline() :
@@ -327,6 +405,9 @@ LLPipeline::LLPipeline() :
mRenderDebugFeatureMask(0),
mRenderDebugMask(0),
mOldRenderDebugMask(0),
+ mGroupQ1Locked(false),
+ mGroupQ2Locked(false),
+ mResetVertexBuffers(false),
mLastRebuildPool(NULL),
mAlphaPool(NULL),
mSkyPool(NULL),
@@ -354,10 +435,15 @@ void LLPipeline::init()
{
LLMemType mt(LLMemType::MTYPE_PIPELINE_INIT);
+ refreshCachedSettings();
+
+ gOctreeMaxCapacity = gSavedSettings.getU32("OctreeMaxNodeCapacity");
sDynamicLOD = gSavedSettings.getBOOL("RenderDynamicLOD");
sRenderBump = gSavedSettings.getBOOL("RenderObjectBump");
sUseTriStrips = gSavedSettings.getBOOL("RenderUseTriStrips");
LLVertexBuffer::sUseStreamDraw = gSavedSettings.getBOOL("RenderUseStreamVBO");
+ LLVertexBuffer::sUseVAO = gSavedSettings.getBOOL("RenderUseVAO");
+ LLVertexBuffer::sPreferStreamDraw = gSavedSettings.getBOOL("RenderPreferStreamDraw");
sRenderAttachedLights = gSavedSettings.getBOOL("RenderAttachedLights");
sRenderAttachedParticles = gSavedSettings.getBOOL("RenderAttachedParticles");
@@ -392,6 +478,14 @@ void LLPipeline::init()
toggleRenderType(RENDER_TYPE_GROUND);
}
+ // make sure RenderPerformanceTest persists (hackity hack hack)
+ // disables non-object rendering (UI, sky, water, etc)
+ if (gSavedSettings.getBOOL("RenderPerformanceTest"))
+ {
+ gSavedSettings.setBOOL("RenderPerformanceTest", FALSE);
+ gSavedSettings.setBOOL("RenderPerformanceTest", TRUE);
+ }
+
mOldRenderDebugMask = mRenderDebugMask;
mBackfaceCull = TRUE;
@@ -409,7 +503,95 @@ void LLPipeline::init()
mSpotLightFade[i] = 1.f;
}
+ mDeferredVB = new LLVertexBuffer(DEFERRED_VB_MASK, 0);
+ mDeferredVB->allocateBuffer(8, 0, true);
setLightingDetail(-1);
+
+ //
+ // Update all settings to trigger a cached settings refresh
+ //
+
+ gSavedSettings.getControl("RenderAutoMaskAlphaDeferred")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderAutoMaskAlphaNonDeferred")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderUseFarClip")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderAvatarMaxVisible")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderDelayVBUpdate")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+
+ gSavedSettings.getControl("UseOcclusion")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+
+ gSavedSettings.getControl("VertexShaderEnable")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderAvatarVP")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("WindLightUseAtmosShaders")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderDeferred")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderDeferredSunWash")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderFSAASamples")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderResolutionDivisor")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderUIBuffer")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderShadowDetail")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderDeferredSSAO")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderShadowResolutionScale")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderLocalLights")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderDelayCreation")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderAnimateRes")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("FreezeTime")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("DebugBeaconLineWidth")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderHighlightBrightness")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderHighlightColor")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderHighlightThickness")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderSpotLightsInNondeferred")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("PreviewAmbientColor")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("PreviewDiffuse0")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("PreviewSpecular0")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("PreviewDiffuse1")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("PreviewSpecular1")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("PreviewDiffuse2")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("PreviewSpecular2")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("PreviewDirection0")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("PreviewDirection1")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("PreviewDirection2")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderGlowMinLuminance")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderGlowMaxExtractAlpha")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderGlowWarmthAmount")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderGlowLumWeights")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderGlowWarmthWeights")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderGlowResolutionPow")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderGlowIterations")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderGlowWidth")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderGlowStrength")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderDepthOfField")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("CameraFocusTransitionTime")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("CameraFNumber")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("CameraFocalLength")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("CameraFieldOfView")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderShadowNoise")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderShadowBlurSize")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderSSAOScale")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderSSAOMaxScale")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderSSAOFactor")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderSSAOEffect")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderShadowOffsetError")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderShadowBiasError")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderShadowOffset")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderShadowBias")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderSpotShadowOffset")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderSpotShadowBias")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderEdgeDepthCutoff")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderEdgeNormCutoff")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderShadowGaussian")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderShadowBlurDistFactor")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderDeferredAtmospheric")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderReflectionDetail")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderHighlightFadeTime")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderShadowClipPlanes")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderShadowOrthoClipPlanes")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderShadowNearDist")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderFarClip")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderShadowSplitExponent")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderShadowErrorCutoff")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("RenderShadowFOVCutoff")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("CameraOffset")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("CameraMaxCoF")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
+ gSavedSettings.getControl("CameraDoFResScale")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
}
LLPipeline::~LLPipeline()
@@ -487,6 +669,8 @@ void LLPipeline::cleanup()
mMovedBridge.clear();
mInitialized = FALSE;
+
+ mDeferredVB = NULL;
}
//============================================================================
@@ -505,14 +689,30 @@ void LLPipeline::destroyGL()
if (LLVertexBuffer::sEnableVBOs)
{
- // render 30 frames after switching to work around DEV-5361
- sDelayedVBOEnable = 30;
LLVertexBuffer::sEnableVBOs = FALSE;
}
}
static LLFastTimer::DeclareTimer FTM_RESIZE_SCREEN_TEXTURE("Resize Screen Texture");
+//static
+void LLPipeline::throttleNewMemoryAllocation(BOOL disable)
+{
+ if(sMemAllocationThrottled != disable)
+ {
+ sMemAllocationThrottled = disable ;
+
+ if(sMemAllocationThrottled)
+ {
+ //send out notification
+ LLNotification::Params params("LowMemory");
+ LLNotifications::instance().add(params);
+
+ //release some memory.
+ }
+ }
+}
+
void LLPipeline::resizeScreenTexture()
{
LLFastTimer ft(FTM_RESIZE_SCREEN_TEXTURE);
@@ -525,15 +725,75 @@ void LLPipeline::resizeScreenTexture()
}
}
+void LLPipeline::allocatePhysicsBuffer()
+{
+ GLuint resX = gViewerWindow->getWorldViewWidthRaw();
+ GLuint resY = gViewerWindow->getWorldViewHeightRaw();
+
+ if (mPhysicsDisplay.getWidth() != resX || mPhysicsDisplay.getHeight() != resY)
+ {
+ mPhysicsDisplay.allocate(resX, resY, GL_RGBA, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
+ }
+}
+
void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
{
+ refreshCachedSettings();
+ U32 samples = RenderFSAASamples;
+
+ //try to allocate screen buffers at requested resolution and samples
+ // - on failure, shrink number of samples and try again
+ // - if not multisampled, shrink resolution and try again (favor X resolution over Y)
+ // Make sure to call "releaseScreenBuffers" after each failure to cleanup the partially loaded state
+
+ if (!allocateScreenBuffer(resX, resY, samples))
+ {
+ releaseScreenBuffers();
+ //reduce number of samples
+ while (samples > 0)
+ {
+ samples /= 2;
+ if (allocateScreenBuffer(resX, resY, samples))
+ { //success
+ return;
+ }
+ releaseScreenBuffers();
+ }
+
+ samples = 0;
+
+ //reduce resolution
+ while (resY > 0 && resX > 0)
+ {
+ resY /= 2;
+ if (allocateScreenBuffer(resX, resY, samples))
+ {
+ return;
+ }
+ releaseScreenBuffers();
+
+ resX /= 2;
+ if (allocateScreenBuffer(resX, resY, samples))
+ {
+ return;
+ }
+ releaseScreenBuffers();
+ }
+
+ llwarns << "Unable to allocate screen buffer at any resolution!" << llendl;
+ }
+}
+
+
+bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)
+{
+ refreshCachedSettings();
+
// remember these dimensions
mScreenWidth = resX;
mScreenHeight = resY;
- //never use more than 4 samples for render targets
- U32 samples = llmin(gSavedSettings.getU32("RenderFSAASamples"), (U32) 4);
- U32 res_mod = gSavedSettings.getU32("RenderResolutionDivisor");
+ U32 res_mod = RenderResolutionDivisor;
if (res_mod > 1 && res_mod < resX && res_mod < resY)
{
@@ -541,101 +801,222 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
resY /= res_mod;
}
- if (gSavedSettings.getBOOL("RenderUIBuffer"))
+ if (RenderUIBuffer)
{
- mUIScreen.allocate(resX,resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
+ if (!mUIScreen.allocate(resX,resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE))
+ {
+ return false;
+ }
}
if (LLPipeline::sRenderDeferred)
{
+ // Set this flag in case we crash while resizing window or allocating space for deferred rendering targets
+ gSavedSettings.setBOOL("RenderInitError", TRUE);
+ gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile"), TRUE );
+
+ S32 shadow_detail = RenderShadowDetail;
+ BOOL ssao = RenderDeferredSSAO;
+
//allocate deferred rendering color buffers
- mDeferredScreen.allocate(resX, resY, GL_RGBA, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
- mDeferredDepth.allocate(resX, resY, 0, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
- addDeferredAttachments(mDeferredScreen);
+ if (!mDeferredScreen.allocate(resX, resY, GL_RGBA, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples)) return false;
+ if (!mDeferredDepth.allocate(resX, resY, 0, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples)) return false;
+ if (!addDeferredAttachments(mDeferredScreen)) return false;
- mScreen.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
- mEdgeMap.allocate(resX, resY, GL_ALPHA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
-
- for (U32 i = 0; i < 3; i++)
+ if (!mScreen.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples)) return false;
+ if (samples > 0)
{
- mDeferredLight[i].allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE);
+ if (!mFXAABuffer.allocate(nhpo2(resX), nhpo2(resY), GL_RGBA, FALSE, FALSE, LLTexUnit::TT_TEXTURE, FALSE, samples)) return false;
}
-
- for (U32 i = 0; i < 2; i++)
+ else
{
- mGIMapPost[i].allocate(resX,resY, GL_RGB, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE);
+ mFXAABuffer.release();
+ }
+
+ if (shadow_detail > 0 || ssao || RenderDepthOfField || samples > 0)
+ { //only need mDeferredLight for shadows OR ssao OR dof OR fxaa
+ if (!mDeferredLight.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE)) return false;
+ }
+ else
+ {
+ mDeferredLight.release();
}
- F32 scale = gSavedSettings.getF32("RenderShadowResolutionScale");
-
- //HACK: make alpha masking work on ATI depth shadows (work around for ATI driver bug)
- U32 shadow_fmt = gGLManager.mIsATI ? GL_ALPHA : 0;
+ F32 scale = RenderShadowResolutionScale;
- for (U32 i = 0; i < 4; i++)
+ if (shadow_detail > 0)
+ { //allocate 4 sun shadow maps
+ for (U32 i = 0; i < 4; i++)
+ {
+ if (!mShadow[i].allocate(U32(resX*scale),U32(resY*scale), 0, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE)) return false;
+ }
+ }
+ else
{
- mShadow[i].allocate(U32(resX*scale),U32(resY*scale), shadow_fmt, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE);
+ for (U32 i = 0; i < 4; i++)
+ {
+ mShadow[i].release();
+ }
}
-
U32 width = nhpo2(U32(resX*scale))/2;
U32 height = width;
- for (U32 i = 4; i < 6; i++)
+ if (shadow_detail > 1)
+ { //allocate two spot shadow maps
+ for (U32 i = 4; i < 6; i++)
+ {
+ if (!mShadow[i].allocate(width, height, 0, TRUE, FALSE)) return false;
+ }
+ }
+ else
{
- mShadow[i].allocate(width, height, shadow_fmt, TRUE, FALSE);
+ for (U32 i = 4; i < 6; i++)
+ {
+ mShadow[i].release();
+ }
}
- width = nhpo2(resX)/2;
- height = nhpo2(resY)/2;
- mLuminanceMap.allocate(width,height, GL_RGBA, FALSE, FALSE);
+ // don't disable shaders on next session
+ gSavedSettings.setBOOL("RenderInitError", FALSE);
+ gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile"), TRUE );
}
else
{
- mScreen.allocate(resX, resY, GL_RGBA, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
- }
-
-
- if (LLRenderTarget::sUseFBO && gGLManager.mHasFramebufferMultisample && samples > 1)
- {
- mSampleBuffer.allocate(resX,resY,GL_RGBA,TRUE,TRUE,LLTexUnit::TT_RECT_TEXTURE,FALSE,samples);
- if (LLPipeline::sRenderDeferred)
+ mDeferredLight.release();
+
+ for (U32 i = 0; i < 6; i++)
{
- addDeferredAttachments(mSampleBuffer);
- mDeferredScreen.setSampleBuffer(&mSampleBuffer);
+ mShadow[i].release();
}
-
- mScreen.setSampleBuffer(&mSampleBuffer);
-
- stop_glerror();
+ mFXAABuffer.release();
+ mScreen.release();
+ mDeferredScreen.release(); //make sure to release any render targets that share a depth buffer with mDeferredScreen first
+ mDeferredDepth.release();
+
+ if (!mScreen.allocate(resX, resY, GL_RGBA, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE)) return false;
}
if (LLPipeline::sRenderDeferred)
{ //share depth buffer between deferred targets
mDeferredScreen.shareDepthBuffer(mScreen);
- for (U32 i = 0; i < 3; i++)
- { //share stencil buffer with screen space lightmap to stencil out sky
- mDeferredScreen.shareDepthBuffer(mDeferredLight[i]);
- }
}
gGL.getTexUnit(0)->disable();
stop_glerror();
+ return true;
}
//static
void LLPipeline::updateRenderDeferred()
{
- BOOL deferred = ((gSavedSettings.getBOOL("RenderDeferred") &&
+ BOOL deferred = ((RenderDeferred &&
LLRenderTarget::sUseFBO &&
- LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred") &&
- gSavedSettings.getBOOL("VertexShaderEnable") &&
- gSavedSettings.getBOOL("RenderAvatarVP") &&
- gSavedSettings.getBOOL("WindLightUseAtmosShaders")) ? TRUE : FALSE) &&
+ LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred") &&
+ VertexShaderEnable &&
+ RenderAvatarVP &&
+ WindLightUseAtmosShaders) ? TRUE : FALSE) &&
!gUseWireframe;
- sRenderDeferred = deferred;
+ sRenderDeferred = deferred;
+ if (deferred)
+ { //must render glow when rendering deferred since post effect pass is needed to present any lighting at all
+ sRenderGlow = TRUE;
+ }
+}
+
+//static
+void LLPipeline::refreshCachedSettings()
+{
+ LLPipeline::sAutoMaskAlphaDeferred = gSavedSettings.getBOOL("RenderAutoMaskAlphaDeferred");
+ LLPipeline::sAutoMaskAlphaNonDeferred = gSavedSettings.getBOOL("RenderAutoMaskAlphaNonDeferred");
+ LLPipeline::sUseFarClip = gSavedSettings.getBOOL("RenderUseFarClip");
+ LLVOAvatar::sMaxVisible = (U32)gSavedSettings.getS32("RenderAvatarMaxVisible");
+ LLPipeline::sDelayVBUpdate = gSavedSettings.getBOOL("RenderDelayVBUpdate");
+
+ LLPipeline::sUseOcclusion =
+ (!gUseWireframe
+ && LLFeatureManager::getInstance()->isFeatureAvailable("UseOcclusion")
+ && gSavedSettings.getBOOL("UseOcclusion")
+ && gGLManager.mHasOcclusionQuery) ? 2 : 0;
+
+ VertexShaderEnable = gSavedSettings.getBOOL("VertexShaderEnable");
+ RenderAvatarVP = gSavedSettings.getBOOL("RenderAvatarVP");
+ WindLightUseAtmosShaders = gSavedSettings.getBOOL("WindLightUseAtmosShaders");
+ RenderDeferred = gSavedSettings.getBOOL("RenderDeferred");
+ RenderDeferredSunWash = gSavedSettings.getF32("RenderDeferredSunWash");
+ RenderFSAASamples = gSavedSettings.getU32("RenderFSAASamples");
+ RenderResolutionDivisor = gSavedSettings.getU32("RenderResolutionDivisor");
+ RenderUIBuffer = gSavedSettings.getBOOL("RenderUIBuffer");
+ RenderShadowDetail = gSavedSettings.getS32("RenderShadowDetail");
+ RenderDeferredSSAO = gSavedSettings.getBOOL("RenderDeferredSSAO");
+ RenderShadowResolutionScale = gSavedSettings.getF32("RenderShadowResolutionScale");
+ RenderLocalLights = gSavedSettings.getBOOL("RenderLocalLights");
+ RenderDelayCreation = gSavedSettings.getBOOL("RenderDelayCreation");
+ RenderAnimateRes = gSavedSettings.getBOOL("RenderAnimateRes");
+ FreezeTime = gSavedSettings.getBOOL("FreezeTime");
+ DebugBeaconLineWidth = gSavedSettings.getS32("DebugBeaconLineWidth");
+ RenderHighlightBrightness = gSavedSettings.getF32("RenderHighlightBrightness");
+ RenderHighlightColor = gSavedSettings.getColor4("RenderHighlightColor");
+ RenderHighlightThickness = gSavedSettings.getF32("RenderHighlightThickness");
+ RenderSpotLightsInNondeferred = gSavedSettings.getBOOL("RenderSpotLightsInNondeferred");
+ PreviewAmbientColor = gSavedSettings.getColor4("PreviewAmbientColor");
+ PreviewDiffuse0 = gSavedSettings.getColor4("PreviewDiffuse0");
+ PreviewSpecular0 = gSavedSettings.getColor4("PreviewSpecular0");
+ PreviewDiffuse1 = gSavedSettings.getColor4("PreviewDiffuse1");
+ PreviewSpecular1 = gSavedSettings.getColor4("PreviewSpecular1");
+ PreviewDiffuse2 = gSavedSettings.getColor4("PreviewDiffuse2");
+ PreviewSpecular2 = gSavedSettings.getColor4("PreviewSpecular2");
+ PreviewDirection0 = gSavedSettings.getVector3("PreviewDirection0");
+ PreviewDirection1 = gSavedSettings.getVector3("PreviewDirection1");
+ PreviewDirection2 = gSavedSettings.getVector3("PreviewDirection2");
+ RenderGlowMinLuminance = gSavedSettings.getF32("RenderGlowMinLuminance");
+ RenderGlowMaxExtractAlpha = gSavedSettings.getF32("RenderGlowMaxExtractAlpha");
+ RenderGlowWarmthAmount = gSavedSettings.getF32("RenderGlowWarmthAmount");
+ RenderGlowLumWeights = gSavedSettings.getVector3("RenderGlowLumWeights");
+ RenderGlowWarmthWeights = gSavedSettings.getVector3("RenderGlowWarmthWeights");
+ RenderGlowResolutionPow = gSavedSettings.getS32("RenderGlowResolutionPow");
+ RenderGlowIterations = gSavedSettings.getS32("RenderGlowIterations");
+ RenderGlowWidth = gSavedSettings.getF32("RenderGlowWidth");
+ RenderGlowStrength = gSavedSettings.getF32("RenderGlowStrength");
+ RenderDepthOfField = gSavedSettings.getBOOL("RenderDepthOfField");
+ CameraFocusTransitionTime = gSavedSettings.getF32("CameraFocusTransitionTime");
+ CameraFNumber = gSavedSettings.getF32("CameraFNumber");
+ CameraFocalLength = gSavedSettings.getF32("CameraFocalLength");
+ CameraFieldOfView = gSavedSettings.getF32("CameraFieldOfView");
+ RenderShadowNoise = gSavedSettings.getF32("RenderShadowNoise");
+ RenderShadowBlurSize = gSavedSettings.getF32("RenderShadowBlurSize");
+ RenderSSAOScale = gSavedSettings.getF32("RenderSSAOScale");
+ RenderSSAOMaxScale = gSavedSettings.getU32("RenderSSAOMaxScale");
+ RenderSSAOFactor = gSavedSettings.getF32("RenderSSAOFactor");
+ RenderSSAOEffect = gSavedSettings.getVector3("RenderSSAOEffect");
+ RenderShadowOffsetError = gSavedSettings.getF32("RenderShadowOffsetError");
+ RenderShadowBiasError = gSavedSettings.getF32("RenderShadowBiasError");
+ RenderShadowOffset = gSavedSettings.getF32("RenderShadowOffset");
+ RenderShadowBias = gSavedSettings.getF32("RenderShadowBias");
+ RenderSpotShadowOffset = gSavedSettings.getF32("RenderSpotShadowOffset");
+ RenderSpotShadowBias = gSavedSettings.getF32("RenderSpotShadowBias");
+ RenderEdgeDepthCutoff = gSavedSettings.getF32("RenderEdgeDepthCutoff");
+ RenderEdgeNormCutoff = gSavedSettings.getF32("RenderEdgeNormCutoff");
+ RenderShadowGaussian = gSavedSettings.getVector3("RenderShadowGaussian");
+ RenderShadowBlurDistFactor = gSavedSettings.getF32("RenderShadowBlurDistFactor");
+ RenderDeferredAtmospheric = gSavedSettings.getBOOL("RenderDeferredAtmospheric");
+ RenderReflectionDetail = gSavedSettings.getS32("RenderReflectionDetail");
+ RenderHighlightFadeTime = gSavedSettings.getF32("RenderHighlightFadeTime");
+ RenderShadowClipPlanes = gSavedSettings.getVector3("RenderShadowClipPlanes");
+ RenderShadowOrthoClipPlanes = gSavedSettings.getVector3("RenderShadowOrthoClipPlanes");
+ RenderShadowNearDist = gSavedSettings.getVector3("RenderShadowNearDist");
+ RenderFarClip = gSavedSettings.getF32("RenderFarClip");
+ RenderShadowSplitExponent = gSavedSettings.getVector3("RenderShadowSplitExponent");
+ RenderShadowErrorCutoff = gSavedSettings.getF32("RenderShadowErrorCutoff");
+ RenderShadowFOVCutoff = gSavedSettings.getF32("RenderShadowFOVCutoff");
+ CameraOffset = gSavedSettings.getBOOL("CameraOffset");
+ CameraMaxCoF = gSavedSettings.getF32("CameraMaxCoF");
+ CameraDoFResScale = gSavedSettings.getF32("CameraDoFResScale");
+
+ updateRenderDeferred();
}
void LLPipeline::releaseGLBuffers()
@@ -654,46 +1035,53 @@ void LLPipeline::releaseGLBuffers()
mTrueNoiseMap = 0;
}
+ releaseLUTBuffers();
+
+ mWaterRef.release();
+ mWaterDis.release();
+
+ for (U32 i = 0; i < 3; i++)
+ {
+ mGlow[i].release();
+ }
+
+ releaseScreenBuffers();
+
+ gBumpImageList.destroyGL();
+ LLVOAvatar::resetImpostors();
+}
+
+void LLPipeline::releaseLUTBuffers()
+{
if (mLightFunc)
{
LLImageGL::deleteTextures(1, &mLightFunc);
mLightFunc = 0;
}
+}
- mWaterRef.release();
- mWaterDis.release();
- mScreen.release();
+void LLPipeline::releaseScreenBuffers()
+{
mUIScreen.release();
- mSampleBuffer.releaseSampleBuffer();
+ mScreen.release();
+ mFXAABuffer.release();
+ mPhysicsDisplay.release();
mDeferredScreen.release();
mDeferredDepth.release();
- for (U32 i = 0; i < 3; i++)
- {
- mDeferredLight[i].release();
- }
-
- mEdgeMap.release();
- mGIMap.release();
- mGIMapPost[0].release();
- mGIMapPost[1].release();
- mHighlight.release();
- mLuminanceMap.release();
+ mDeferredLight.release();
+ mHighlight.release();
+
for (U32 i = 0; i < 6; i++)
{
mShadow[i].release();
}
-
- for (U32 i = 0; i < 3; i++)
- {
- mGlow[i].release();
- }
-
- LLVOAvatar::resetImpostors();
}
+
void LLPipeline::createGLBuffers()
{
+ stop_glerror();
LLMemType mt_cb(LLMemType::MTYPE_PIPELINE_CREATE_BUFFERS);
assertInitialized();
@@ -701,10 +1089,11 @@ void LLPipeline::createGLBuffers()
if (LLPipeline::sWaterReflections)
{ //water reflection texture
- U32 res = (U32) gSavedSettings.getS32("RenderWaterRefResolution");
+ U32 res = (U32) llmax(gSavedSettings.getS32("RenderWaterRefResolution"), 512);
mWaterRef.allocate(res,res,GL_RGBA,TRUE,FALSE);
- mWaterDis.allocate(res,res,GL_RGBA,TRUE,FALSE);
+ //always use FBO for mWaterDis so it can be used for avatar texture bakes
+ mWaterDis.allocate(res,res,GL_RGBA,TRUE,FALSE,LLTexUnit::TT_TEXTURE, true);
}
mHighlight.allocate(256,256,GL_RGBA, FALSE, FALSE);
@@ -727,7 +1116,6 @@ void LLPipeline::createGLBuffers()
allocateScreenBuffer(resX,resY);
mScreenWidth = 0;
mScreenHeight = 0;
-
}
if (sRenderDeferred)
@@ -767,54 +1155,69 @@ void LLPipeline::createGLBuffers()
gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_POINT);
}
+ createLUTBuffers();
+ }
+
+ gBumpImageList.restoreGL();
+}
+
+void LLPipeline::createLUTBuffers()
+{
+ if (sRenderDeferred)
+ {
if (!mLightFunc)
{
U32 lightResX = gSavedSettings.getU32("RenderSpecularResX");
U32 lightResY = gSavedSettings.getU32("RenderSpecularResY");
- U8* lg = new U8[lightResX*lightResY];
-
+ U8* ls = new U8[lightResX*lightResY];
+ F32 specExp = gSavedSettings.getF32("RenderSpecularExponent");
+ // Calculate the (normalized) Blinn-Phong specular lookup texture.
for (U32 y = 0; y < lightResY; ++y)
{
for (U32 x = 0; x < lightResX; ++x)
{
- //spec func
+ ls[y*lightResX+x] = 0;
F32 sa = (F32) x/(lightResX-1);
F32 spec = (F32) y/(lightResY-1);
- //lg[y*lightResX+x] = (U8) (powf(sa, 128.f*spec*spec)*255);
-
- //F32 sp = acosf(sa)/(1.f-spec);
-
- sa = powf(sa, gSavedSettings.getF32("RenderSpecularExponent"));
- F32 a = acosf(sa*0.25f+0.75f);
- F32 m = llmax(0.5f-spec*0.5f, 0.001f);
- F32 t2 = tanf(a)/m;
- t2 *= t2;
-
- F32 c4a = (3.f+4.f*cosf(2.f*a)+cosf(4.f*a))/8.f;
- F32 bd = 1.f/(4.f*m*m*c4a)*powf(F_E, -t2);
-
- lg[y*lightResX+x] = (U8) (llclamp(bd, 0.f, 1.f)*255);
+ F32 n = spec * spec * specExp;
+
+ // Nothing special here. Just your typical blinn-phong term.
+ spec = powf(sa, n);
+
+ // Apply our normalization function.
+ // Note: This is the full equation that applies the full normalization curve, not an approximation.
+ // This is fine, given we only need to create our LUT once per buffer initialization.
+ // The only trade off is we have a really low dynamic range.
+ // This means we have to account for things not being able to exceed 0 to 1 in our shaders.
+ spec *= (((n + 2) * (n + 4)) / (8 * F_PI * (powf(2, -n/2) + n)));
+
+ // Always sample at a 1.0/2.2 curve.
+ // This "Gamma corrects" our specular term, boosting our lower exponent reflections.
+ spec = powf(spec, 1.f/2.2f);
+
+ // Easy fix for our dynamic range problem: divide by 6 here, multiply by 6 in our shaders.
+ // This allows for our specular term to exceed a value of 1 in our shaders.
+ // This is something that can be important for energy conserving specular models where higher exponents can result in highlights that exceed a range of 0 to 1.
+ // Technically, we could just use an R16F texture, but driver support for R16F textures can be somewhat spotty at times.
+ // This works remarkably well for higher specular exponents, though banding can sometimes be seen on lower exponents.
+ // Combined with a bit of noise and trilinear filtering, the banding is hardly noticable.
+ ls[y*lightResX+x] = (U8)(llclamp(spec * (1.f / 6), 0.f, 1.f) * 255);
}
}
-
+
LLImageGL::generateTextures(1, &mLightFunc);
gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, mLightFunc);
- LLImageGL::setManualImage(LLTexUnit::getInternalType(LLTexUnit::TT_TEXTURE), 0, GL_ALPHA, lightResX, lightResY, GL_ALPHA, GL_UNSIGNED_BYTE, lg);
+ LLImageGL::setManualImage(LLTexUnit::getInternalType(LLTexUnit::TT_TEXTURE), 0, GL_R8, lightResX, lightResY, GL_RED, GL_UNSIGNED_BYTE, ls);
gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_TRILINEAR);
-
- delete [] lg;
- }
-
- if (gSavedSettings.getBOOL("RenderDeferredGI"))
- {
- mGIMap.allocate(512,512,GL_RGBA, TRUE, FALSE);
- addDeferredAttachments(mGIMap);
+
+ delete [] ls;
}
}
}
-void LLPipeline::restoreGL()
+
+void LLPipeline::restoreGL()
{
LLMemType mt_cb(LLMemType::MTYPE_PIPELINE_RESTORE_GL);
assertInitialized();
@@ -842,10 +1245,12 @@ void LLPipeline::restoreGL()
BOOL LLPipeline::canUseVertexShaders()
{
+ static const std::string vertex_shader_enable_feature_string = "VertexShaderEnable";
+
if (sDisableShaders ||
!gGLManager.mHasVertexShader ||
!gGLManager.mHasFragmentShader ||
- !LLFeatureManager::getInstance()->isFeatureAvailable("VertexShaderEnable") ||
+ !LLFeatureManager::getInstance()->isFeatureAvailable(vertex_shader_enable_feature_string) ||
(assertInitialized() && mVertexShadersLoaded != 1) )
{
return FALSE;
@@ -871,7 +1276,7 @@ BOOL LLPipeline::canUseWindLightShadersOnObjects() const
BOOL LLPipeline::canUseAntiAliasing() const
{
- return TRUE; //(gSavedSettings.getBOOL("RenderUseFBO"));
+ return TRUE;
}
void LLPipeline::unloadShaders()
@@ -909,11 +1314,11 @@ S32 LLPipeline::getMaxLightingDetail() const
S32 LLPipeline::setLightingDetail(S32 level)
{
LLMemType mt_ld(LLMemType::MTYPE_PIPELINE_LIGHTING_DETAIL);
- assertInitialized();
+ refreshCachedSettings();
if (level < 0)
{
- if (gSavedSettings.getBOOL("VertexShaderEnable"))
+ if (RenderLocalLights)
{
level = 1;
}
@@ -923,15 +1328,8 @@ S32 LLPipeline::setLightingDetail(S32 level)
}
}
level = llclamp(level, 0, getMaxLightingDetail());
- if (level != mLightingDetail)
- {
- mLightingDetail = level;
-
- if (mVertexShadersLoaded == 1)
- {
- LLViewerShaderMgr::instance()->setShaders();
- }
- }
+ mLightingDetail = level;
+
return mLightingDetail;
}
@@ -1157,9 +1555,15 @@ void LLPipeline::allocDrawable(LLViewerObject *vobj)
}
+static LLFastTimer::DeclareTimer FTM_UNLINK("Unlink");
+static LLFastTimer::DeclareTimer FTM_REMOVE_FROM_MOVE_LIST("Movelist");
+static LLFastTimer::DeclareTimer FTM_REMOVE_FROM_SPATIAL_PARTITION("Spatial Partition");
+static LLFastTimer::DeclareTimer FTM_REMOVE_FROM_LIGHT_SET("Light Set");
+static LLFastTimer::DeclareTimer FTM_REMOVE_FROM_HIGHLIGHT_SET("Highlight Set");
+
void LLPipeline::unlinkDrawable(LLDrawable *drawable)
{
- LLFastTimer t(FTM_PIPELINE);
+ LLFastTimer t(FTM_UNLINK);
assertInitialized();
@@ -1168,6 +1572,7 @@ void LLPipeline::unlinkDrawable(LLDrawable *drawable)
// Based on flags, remove the drawable from the queues that it's on.
if (drawablep->isState(LLDrawable::ON_MOVE_LIST))
{
+ LLFastTimer t(FTM_REMOVE_FROM_MOVE_LIST);
LLDrawable::drawable_vector_t::iterator iter = std::find(mMovedList.begin(), mMovedList.end(), drawablep);
if (iter != mMovedList.end())
{
@@ -1177,6 +1582,7 @@ void LLPipeline::unlinkDrawable(LLDrawable *drawable)
if (drawablep->getSpatialGroup())
{
+ LLFastTimer t(FTM_REMOVE_FROM_SPATIAL_PARTITION);
if (!drawablep->getSpatialGroup()->mSpatialPartition->remove(drawablep, drawablep->getSpatialGroup()))
{
#ifdef LL_RELEASE_FOR_DOWNLOAD
@@ -1187,18 +1593,23 @@ void LLPipeline::unlinkDrawable(LLDrawable *drawable)
}
}
- mLights.erase(drawablep);
- for (light_set_t::iterator iter = mNearbyLights.begin();
- iter != mNearbyLights.end(); iter++)
{
- if (iter->drawable == drawablep)
+ LLFastTimer t(FTM_REMOVE_FROM_LIGHT_SET);
+ mLights.erase(drawablep);
+
+ for (light_set_t::iterator iter = mNearbyLights.begin();
+ iter != mNearbyLights.end(); iter++)
{
- mNearbyLights.erase(iter);
- break;
+ if (iter->drawable == drawablep)
+ {
+ mNearbyLights.erase(iter);
+ break;
+ }
}
}
{
+ LLFastTimer t(FTM_REMOVE_FROM_HIGHLIGHT_SET);
HighlightItem item(drawablep);
mHighlightSet.erase(item);
@@ -1227,12 +1638,8 @@ void LLPipeline::unlinkDrawable(LLDrawable *drawable)
U32 LLPipeline::addObject(LLViewerObject *vobj)
{
LLMemType mt_ao(LLMemType::MTYPE_PIPELINE_ADD_OBJECT);
- if (gNoRender)
- {
- return 0;
- }
- if (gSavedSettings.getBOOL("RenderDelayCreation"))
+ if (RenderDelayCreation)
{
mCreateQ.push_back(vobj);
}
@@ -1295,7 +1702,7 @@ void LLPipeline::createObject(LLViewerObject* vobj)
markRebuild(drawablep, LLDrawable::REBUILD_ALL, TRUE);
- if (drawablep->getVOVolume() && gSavedSettings.getBOOL("RenderAnimateRes"))
+ if (drawablep->getVOVolume() && RenderAnimateRes)
{
// fun animated res
drawablep->updateXform(TRUE);
@@ -1334,7 +1741,7 @@ void LLPipeline::resetFrameStats()
//external functions for asynchronous updating
void LLPipeline::updateMoveDampedAsync(LLDrawable* drawablep)
{
- if (gSavedSettings.getBOOL("FreezeTime"))
+ if (FreezeTime)
{
return;
}
@@ -1364,7 +1771,7 @@ void LLPipeline::updateMoveDampedAsync(LLDrawable* drawablep)
void LLPipeline::updateMoveNormalAsync(LLDrawable* drawablep)
{
- if (gSavedSettings.getBOOL("FreezeTime"))
+ if (FreezeTime)
{
return;
}
@@ -1421,7 +1828,7 @@ void LLPipeline::updateMove()
LLFastTimer t(FTM_UPDATE_MOVE);
LLMemType mt_um(LLMemType::MTYPE_PIPELINE_UPDATE_MOVE);
- if (gSavedSettings.getBOOL("FreezeTime"))
+ if (FreezeTime)
{
return;
}
@@ -1495,11 +1902,214 @@ F32 LLPipeline::calcPixelArea(LLVector3 center, LLVector3 size, LLCamera &camera
return radius*radius * F_PI;
}
+//static
+F32 LLPipeline::calcPixelArea(const LLVector4a& center, const LLVector4a& size, LLCamera &camera)
+{
+ LLVector4a origin;
+ origin.load3(camera.getOrigin().mV);
+
+ LLVector4a lookAt;
+ lookAt.setSub(center, origin);
+ F32 dist = lookAt.getLength3().getF32();
+
+ //ramp down distance for nearby objects
+ //shrink dist by dist/16.
+ if (dist < 16.f)
+ {
+ dist /= 16.f;
+ dist *= dist;
+ dist *= 16.f;
+ }
+
+ //get area of circle around node
+ F32 app_angle = atanf(size.getLength3().getF32()/dist);
+ F32 radius = app_angle*LLDrawable::sCurPixelAngle;
+ return radius*radius * F_PI;
+}
+
void LLPipeline::grabReferences(LLCullResult& result)
{
sCull = &result;
}
+void LLPipeline::clearReferences()
+{
+ sCull = NULL;
+}
+
+void check_references(LLSpatialGroup* group, LLDrawable* drawable)
+{
+ for (LLSpatialGroup::element_iter i = group->getData().begin(); i != group->getData().end(); ++i)
+ {
+ if (drawable == *i)
+ {
+ llerrs << "LLDrawable deleted while actively reference by LLPipeline." << llendl;
+ }
+ }
+}
+
+void check_references(LLDrawable* drawable, LLFace* face)
+{
+ for (S32 i = 0; i < drawable->getNumFaces(); ++i)
+ {
+ if (drawable->getFace(i) == face)
+ {
+ llerrs << "LLFace deleted while actively referenced by LLPipeline." << llendl;
+ }
+ }
+}
+
+void check_references(LLSpatialGroup* group, LLFace* face)
+{
+ for (LLSpatialGroup::element_iter i = group->getData().begin(); i != group->getData().end(); ++i)
+ {
+ LLDrawable* drawable = *i;
+ check_references(drawable, face);
+ }
+}
+
+void LLPipeline::checkReferences(LLFace* face)
+{
+#if 0
+ if (sCull)
+ {
+ for (LLCullResult::sg_list_t::iterator iter = sCull->beginVisibleGroups(); iter != sCull->endVisibleGroups(); ++iter)
+ {
+ LLSpatialGroup* group = *iter;
+ check_references(group, face);
+ }
+
+ for (LLCullResult::sg_list_t::iterator iter = sCull->beginAlphaGroups(); iter != sCull->endAlphaGroups(); ++iter)
+ {
+ LLSpatialGroup* group = *iter;
+ check_references(group, face);
+ }
+
+ for (LLCullResult::sg_list_t::iterator iter = sCull->beginDrawableGroups(); iter != sCull->endDrawableGroups(); ++iter)
+ {
+ LLSpatialGroup* group = *iter;
+ check_references(group, face);
+ }
+
+ for (LLCullResult::drawable_list_t::iterator iter = sCull->beginVisibleList(); iter != sCull->endVisibleList(); ++iter)
+ {
+ LLDrawable* drawable = *iter;
+ check_references(drawable, face);
+ }
+ }
+#endif
+}
+
+void LLPipeline::checkReferences(LLDrawable* drawable)
+{
+#if 0
+ if (sCull)
+ {
+ for (LLCullResult::sg_list_t::iterator iter = sCull->beginVisibleGroups(); iter != sCull->endVisibleGroups(); ++iter)
+ {
+ LLSpatialGroup* group = *iter;
+ check_references(group, drawable);
+ }
+
+ for (LLCullResult::sg_list_t::iterator iter = sCull->beginAlphaGroups(); iter != sCull->endAlphaGroups(); ++iter)
+ {
+ LLSpatialGroup* group = *iter;
+ check_references(group, drawable);
+ }
+
+ for (LLCullResult::sg_list_t::iterator iter = sCull->beginDrawableGroups(); iter != sCull->endDrawableGroups(); ++iter)
+ {
+ LLSpatialGroup* group = *iter;
+ check_references(group, drawable);
+ }
+
+ for (LLCullResult::drawable_list_t::iterator iter = sCull->beginVisibleList(); iter != sCull->endVisibleList(); ++iter)
+ {
+ if (drawable == *iter)
+ {
+ llerrs << "LLDrawable deleted while actively referenced by LLPipeline." << llendl;
+ }
+ }
+ }
+#endif
+}
+
+void check_references(LLSpatialGroup* group, LLDrawInfo* draw_info)
+{
+ for (LLSpatialGroup::draw_map_t::iterator i = group->mDrawMap.begin(); i != group->mDrawMap.end(); ++i)
+ {
+ LLSpatialGroup::drawmap_elem_t& draw_vec = i->second;
+ for (LLSpatialGroup::drawmap_elem_t::iterator j = draw_vec.begin(); j != draw_vec.end(); ++j)
+ {
+ LLDrawInfo* params = *j;
+ if (params == draw_info)
+ {
+ llerrs << "LLDrawInfo deleted while actively referenced by LLPipeline." << llendl;
+ }
+ }
+ }
+}
+
+
+void LLPipeline::checkReferences(LLDrawInfo* draw_info)
+{
+#if 0
+ if (sCull)
+ {
+ for (LLCullResult::sg_list_t::iterator iter = sCull->beginVisibleGroups(); iter != sCull->endVisibleGroups(); ++iter)
+ {
+ LLSpatialGroup* group = *iter;
+ check_references(group, draw_info);
+ }
+
+ for (LLCullResult::sg_list_t::iterator iter = sCull->beginAlphaGroups(); iter != sCull->endAlphaGroups(); ++iter)
+ {
+ LLSpatialGroup* group = *iter;
+ check_references(group, draw_info);
+ }
+
+ for (LLCullResult::sg_list_t::iterator iter = sCull->beginDrawableGroups(); iter != sCull->endDrawableGroups(); ++iter)
+ {
+ LLSpatialGroup* group = *iter;
+ check_references(group, draw_info);
+ }
+ }
+#endif
+}
+
+void LLPipeline::checkReferences(LLSpatialGroup* group)
+{
+#if 0
+ if (sCull)
+ {
+ for (LLCullResult::sg_list_t::iterator iter = sCull->beginVisibleGroups(); iter != sCull->endVisibleGroups(); ++iter)
+ {
+ if (group == *iter)
+ {
+ llerrs << "LLSpatialGroup deleted while actively referenced by LLPipeline." << llendl;
+ }
+ }
+
+ for (LLCullResult::sg_list_t::iterator iter = sCull->beginAlphaGroups(); iter != sCull->endAlphaGroups(); ++iter)
+ {
+ if (group == *iter)
+ {
+ llerrs << "LLSpatialGroup deleted while actively referenced by LLPipeline." << llendl;
+ }
+ }
+
+ for (LLCullResult::sg_list_t::iterator iter = sCull->beginDrawableGroups(); iter != sCull->endDrawableGroups(); ++iter)
+ {
+ if (group == *iter)
+ {
+ llerrs << "LLSpatialGroup deleted while actively referenced by LLPipeline." << llendl;
+ }
+ }
+ }
+#endif
+}
+
+
BOOL LLPipeline::visibleObjectsInFrustum(LLCamera& camera)
{
for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin();
@@ -1566,7 +2176,7 @@ BOOL LLPipeline::getVisibleExtents(LLCamera& camera, LLVector3& min, LLVector3&
static LLFastTimer::DeclareTimer FTM_CULL("Object Culling");
-void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_clip)
+void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_clip, LLPlane* planep)
{
LLFastTimer t(FTM_CULL);
LLMemType mt_uc(LLMemType::MTYPE_PIPELINE_UPDATE_CULL);
@@ -1586,13 +2196,18 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_cl
mScreen.bindTarget();
}
- glMatrixMode(GL_PROJECTION);
- glPushMatrix();
- glLoadMatrixd(gGLLastProjection);
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
+ if (sUseOcclusion > 1)
+ {
+ gGL.setColorMask(false, false);
+ }
+
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.pushMatrix();
+ gGL.loadMatrix(gGLLastProjection);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.pushMatrix();
gGLLastMatrix = NULL;
- glLoadMatrixd(gGLLastModelView);
+ gGL.loadMatrix(gGLLastModelView);
LLVertexBuffer::unbind();
@@ -1600,13 +2215,48 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_cl
LLGLDisable test(GL_ALPHA_TEST);
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- if (sUseOcclusion > 1)
+
+ //setup a clip plane in projection matrix for reflection renders (prevents flickering from occlusion culling)
+ LLViewerRegion* region = gAgent.getRegion();
+ LLPlane plane;
+
+ if (planep)
{
- gGL.setColorMask(false, false);
+ plane = *planep;
}
+ else
+ {
+ if (region)
+ {
+ LLVector3 pnorm;
+ F32 height = region->getWaterHeight();
+ if (water_clip < 0)
+ { //camera is above water, clip plane points up
+ pnorm.setVec(0,0,1);
+ plane.setVec(pnorm, -height);
+ }
+ else if (water_clip > 0)
+ { //camera is below water, clip plane points down
+ pnorm = LLVector3(0,0,-1);
+ plane.setVec(pnorm, height);
+ }
+ }
+ }
+
+ glh::matrix4f modelview = glh_get_last_modelview();
+ glh::matrix4f proj = glh_get_last_projection();
+ LLGLUserClipPlane clip(plane, modelview, proj, water_clip != 0 && LLPipeline::sReflectionRender);
LLGLDepthTest depth(GL_TRUE, GL_FALSE);
+ bool bound_shader = false;
+ if (gPipeline.canUseVertexShaders() && LLGLSLShader::sCurBoundShader == 0)
+ { //if no shader is currently bound, use the occlusion shader instead of fixed function if we can
+ // (shadow render uses a special shader that clamps to clip planes)
+ bound_shader = true;
+ gOcclusionProgram.bind();
+ }
+
for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin();
iter != LLWorld::getInstance()->getRegionList().end(); ++iter)
{
@@ -1634,6 +2284,11 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_cl
}
}
+ if (bound_shader)
+ {
+ gOcclusionProgram.unbind();
+ }
+
camera.disableUserClipPlane();
if (hasRenderType(LLPipeline::RENDER_TYPE_SKY) &&
@@ -1657,10 +2312,10 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_cl
}
- glMatrixMode(GL_PROJECTION);
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW);
- glPopMatrix();
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.popMatrix();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.popMatrix();
if (sUseOcclusion > 1)
{
@@ -1695,7 +2350,7 @@ void LLPipeline::markNotCulled(LLSpatialGroup* group, LLCamera& camera)
}
if (sMinRenderSize > 0.f &&
- llmax(llmax(group->mBounds[1].mV[0], group->mBounds[1].mV[1]), group->mBounds[1].mV[2]) < sMinRenderSize)
+ llmax(llmax(group->mBounds[1][0], group->mBounds[1][1]), group->mBounds[1][2]) < sMinRenderSize)
{
return;
}
@@ -1739,33 +2394,60 @@ void LLPipeline::markOccluder(LLSpatialGroup* group)
void LLPipeline::doOcclusion(LLCamera& camera)
{
- LLVertexBuffer::unbind();
-
- if (hasRenderDebugMask(LLPipeline::RENDER_DEBUG_OCCLUSION))
- {
- gGL.setColorMask(true, false, false, false);
- }
- else
+ if (LLPipeline::sUseOcclusion > 1 && sCull->hasOcclusionGroups())
{
- gGL.setColorMask(false, false);
- }
- LLGLDisable blend(GL_BLEND);
- LLGLDisable test(GL_ALPHA_TEST);
- gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- LLGLDepthTest depth(GL_TRUE, GL_FALSE);
+ LLVertexBuffer::unbind();
+
+ if (hasRenderDebugMask(LLPipeline::RENDER_DEBUG_OCCLUSION))
+ {
+ gGL.setColorMask(true, false, false, false);
+ }
+ else
+ {
+ gGL.setColorMask(false, false);
+ }
+ LLGLDisable blend(GL_BLEND);
+ LLGLDisable test(GL_ALPHA_TEST);
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+ LLGLDepthTest depth(GL_TRUE, GL_FALSE);
+
+ LLGLDisable cull(GL_CULL_FACE);
+
+
+ bool bind_shader = LLGLSLShader::sNoFixedFunction && LLGLSLShader::sCurBoundShader == 0;
+ if (bind_shader)
+ {
+ if (LLPipeline::sShadowRender)
+ {
+ gDeferredShadowProgram.bind();
+ }
+ else
+ {
+ gOcclusionProgram.bind();
+ }
+ }
- LLGLDisable cull(GL_CULL_FACE);
- if (LLPipeline::sUseOcclusion > 1)
- {
for (LLCullResult::sg_list_t::iterator iter = sCull->beginOcclusionGroups(); iter != sCull->endOcclusionGroups(); ++iter)
{
LLSpatialGroup* group = *iter;
group->doOcclusion(&camera);
group->clearOcclusionState(LLSpatialGroup::ACTIVE_OCCLUSION);
}
- }
+
+ if (bind_shader)
+ {
+ if (LLPipeline::sShadowRender)
+ {
+ gDeferredShadowProgram.unbind();
+ }
+ else
+ {
+ gOcclusionProgram.unbind();
+ }
+ }
- gGL.setColorMask(true, false);
+ gGL.setColorMask(true, false);
+ }
}
BOOL LLPipeline::updateDrawableGeom(LLDrawable* drawablep, BOOL priority)
@@ -1792,17 +2474,14 @@ void LLPipeline::updateGL()
void LLPipeline::rebuildPriorityGroups()
{
- if(!sAllowRebuildPriorityGroup)
- {
- return ;
- }
- sAllowRebuildPriorityGroup = FALSE ;
-
LLTimer update_timer;
LLMemType mt(LLMemType::MTYPE_PIPELINE);
assertInitialized();
+ gMeshRepo.notifyLoadedMeshes();
+
+ mGroupQ1Locked = true;
// Iterate through all drawables on the priority build queue,
for (LLSpatialGroup::sg_vector_t::iterator iter = mGroupQ1.begin();
iter != mGroupQ1.end(); ++iter)
@@ -1813,10 +2492,18 @@ void LLPipeline::rebuildPriorityGroups()
}
mGroupQ1.clear();
+ mGroupQ1Locked = false;
+
}
void LLPipeline::rebuildGroups()
{
+ if (mGroupQ2.empty())
+ {
+ return;
+ }
+
+ mGroupQ2Locked = true;
// Iterate through some drawables on the non-priority build queue
S32 size = (S32) mGroupQ2.size();
S32 min_count = llclamp((S32) ((F32) (size * size)/4096*0.25f), 1, size);
@@ -1826,33 +2513,30 @@ void LLPipeline::rebuildGroups()
std::sort(mGroupQ2.begin(), mGroupQ2.end(), LLSpatialGroup::CompareUpdateUrgency());
LLSpatialGroup::sg_vector_t::iterator iter;
+ LLSpatialGroup::sg_vector_t::iterator last_iter = mGroupQ2.begin();
+
for (iter = mGroupQ2.begin();
- iter != mGroupQ2.end(); ++iter)
+ iter != mGroupQ2.end() && count <= min_count; ++iter)
{
LLSpatialGroup* group = *iter;
+ last_iter = iter;
- if (group->isDead())
+ if (!group->isDead())
{
- continue;
+ group->rebuildGeom();
+
+ if (group->mSpatialPartition->mRenderByGroup)
+ {
+ count++;
+ }
}
- group->rebuildGeom();
-
- if (group->mSpatialPartition->mRenderByGroup)
- {
- count++;
- }
-
group->clearState(LLSpatialGroup::IN_BUILD_Q2);
-
- if (count > min_count)
- {
- ++iter;
- break;
- }
}
- mGroupQ2.erase(mGroupQ2.begin(), iter);
+ mGroupQ2.erase(mGroupQ2.begin(), ++last_iter);
+
+ mGroupQ2Locked = false;
updateMovedList(mMovedBridge);
}
@@ -1867,15 +2551,6 @@ void LLPipeline::updateGeom(F32 max_dtime)
assertInitialized();
- if (sDelayedVBOEnable > 0)
- {
- if (--sDelayedVBOEnable <= 0)
- {
- resetVertexBuffers();
- LLVertexBuffer::sEnableVBOs = TRUE;
- }
- }
-
// notify various object types to reset internal cost metrics, etc.
// for now, only LLVOVolume does this to throttle LOD changes
LLVOVolume::preUpdateGeom();
@@ -1967,12 +2642,12 @@ void LLPipeline::markVisible(LLDrawable *drawablep, LLCamera& camera)
if(drawablep && !drawablep->isDead())
{
- if (drawablep->isSpatialBridge())
- {
+ if (drawablep->isSpatialBridge())
+ {
const LLDrawable* root = ((LLSpatialBridge*) drawablep)->mDrawable;
llassert(root); // trying to catch a bad assumption
if (root && // // this test may not be needed, see above
- root->getVObj()->isAttachment())
+ root->getVObj()->isAttachment())
{
LLDrawable* rootparent = root->getParent();
if (rootparent) // this IS sometimes NULL
@@ -1980,24 +2655,24 @@ void LLPipeline::markVisible(LLDrawable *drawablep, LLCamera& camera)
LLViewerObject *vobj = rootparent->getVObj();
llassert(vobj); // trying to catch a bad assumption
if (vobj) // this test may not be needed, see above
- {
+ {
const LLVOAvatar* av = vobj->asAvatar();
- if (av && av->isImpostor())
- {
- return;
- }
- }
+ if (av && av->isImpostor())
+ {
+ return;
+ }
+ }
}
}
- sCull->pushBridge((LLSpatialBridge*) drawablep);
- }
- else
- {
- sCull->pushDrawable(drawablep);
- }
+ sCull->pushBridge((LLSpatialBridge*) drawablep);
+ }
+ else
+ {
+ sCull->pushDrawable(drawablep);
+ }
- drawablep->setVisible(camera);
-}
+ drawablep->setVisible(camera);
+ }
}
void LLPipeline::markMoved(LLDrawable *drawablep, BOOL damped_motion)
@@ -2078,6 +2753,9 @@ void LLPipeline::shiftObjects(const LLVector3 &offset)
glClear(GL_DEPTH_BUFFER_BIT);
gDepthDirty = TRUE;
+ LLVector4a offseta;
+ offseta.load3(offset.mV);
+
for (LLDrawable::drawable_vector_t::iterator iter = mShiftList.begin();
iter != mShiftList.end(); iter++)
{
@@ -2086,7 +2764,7 @@ void LLPipeline::shiftObjects(const LLVector3 &offset)
{
continue;
}
- drawablep->shiftPos(offset);
+ drawablep->shiftPos(offseta);
drawablep->clearState(LLDrawable::ON_SHIFT_LIST);
}
mShiftList.resize(0);
@@ -2100,7 +2778,7 @@ void LLPipeline::shiftObjects(const LLVector3 &offset)
LLSpatialPartition* part = region->getSpatialPartition(i);
if (part)
{
- part->shift(offset);
+ part->shift(offseta);
}
}
}
@@ -2129,11 +2807,36 @@ void LLPipeline::markGLRebuild(LLGLUpdate* glu)
}
}
+void LLPipeline::markPartitionMove(LLDrawable* drawable)
+{
+ if (!drawable->isState(LLDrawable::PARTITION_MOVE) &&
+ !drawable->getPositionGroup().equals3(LLVector4a::getZero()))
+ {
+ drawable->setState(LLDrawable::PARTITION_MOVE);
+ mPartitionQ.push_back(drawable);
+ }
+}
+
+void LLPipeline::processPartitionQ()
+{
+ for (LLDrawable::drawable_list_t::iterator iter = mPartitionQ.begin(); iter != mPartitionQ.end(); ++iter)
+ {
+ LLDrawable* drawable = *iter;
+ if (!drawable->isDead())
+ {
+ drawable->updateBinRadius();
+ drawable->movePartition();
+ }
+ drawable->clearState(LLDrawable::PARTITION_MOVE);
+ }
+
+ mPartitionQ.clear();
+}
+
void LLPipeline::markRebuild(LLSpatialGroup* group, BOOL priority)
{
LLMemType mt(LLMemType::MTYPE_PIPELINE);
- //assert_main_thread();
-
+
if (group && !group->isDead() && group->mSpatialPartition)
{
if (group->mSpatialPartition->mPartitionType == LLViewerRegion::PARTITION_HUD)
@@ -2145,6 +2848,8 @@ void LLPipeline::markRebuild(LLSpatialGroup* group, BOOL priority)
{
if (!group->isState(LLSpatialGroup::IN_BUILD_Q1))
{
+ llassert_always(!mGroupQ1Locked);
+
mGroupQ1.push_back(group);
group->setState(LLSpatialGroup::IN_BUILD_Q1);
@@ -2161,11 +2866,7 @@ void LLPipeline::markRebuild(LLSpatialGroup* group, BOOL priority)
}
else if (!group->isState(LLSpatialGroup::IN_BUILD_Q2 | LLSpatialGroup::IN_BUILD_Q1))
{
- //llerrs << "Non-priority updates not yet supported!" << llendl;
- if (std::find(mGroupQ2.begin(), mGroupQ2.end(), group) != mGroupQ2.end())
- {
- llerrs << "WTF?" << llendl;
- }
+ llassert_always(!mGroupQ2Locked);
mGroupQ2.push_back(group);
group->setState(LLSpatialGroup::IN_BUILD_Q2);
@@ -2243,8 +2944,49 @@ void LLPipeline::stateSort(LLCamera& camera, LLCullResult &result)
{
markVisible(*i, camera);
}
+
+ if (!sDelayVBUpdate)
+ { //rebuild mesh as soon as we know it's visible
+ group->rebuildMesh();
+ }
}
}
+
+ if (LLViewerCamera::sCurCameraID == LLViewerCamera::CAMERA_WORLD)
+ {
+ LLSpatialGroup* last_group = NULL;
+ for (LLCullResult::bridge_list_t::iterator i = sCull->beginVisibleBridge(); i != sCull->endVisibleBridge(); ++i)
+ {
+ LLCullResult::bridge_list_t::iterator cur_iter = i;
+ LLSpatialBridge* bridge = *cur_iter;
+ LLSpatialGroup* group = bridge->getSpatialGroup();
+
+ if (last_group == NULL)
+ {
+ last_group = group;
+ }
+
+ if (!bridge->isDead() && group && !group->isOcclusionState(LLSpatialGroup::OCCLUDED))
+ {
+ stateSort(bridge, camera);
+ }
+
+ if (LLViewerCamera::sCurCameraID == LLViewerCamera::CAMERA_WORLD &&
+ last_group != group && last_group->changeLOD())
+ {
+ last_group->mLastUpdateDistance = last_group->mDistance;
+ }
+
+ last_group = group;
+ }
+
+ if (LLViewerCamera::sCurCameraID == LLViewerCamera::CAMERA_WORLD &&
+ last_group && last_group->changeLOD())
+ {
+ last_group->mLastUpdateDistance = last_group->mDistance;
+ }
+ }
+
for (LLCullResult::sg_list_t::iterator iter = sCull->beginVisibleGroups(); iter != sCull->endVisibleGroups(); ++iter)
{
LLSpatialGroup* group = *iter;
@@ -2257,22 +2999,14 @@ void LLPipeline::stateSort(LLCamera& camera, LLCullResult &result)
{
group->setVisible();
stateSort(group, camera);
- }
- }
-
- if (LLViewerCamera::sCurCameraID == LLViewerCamera::CAMERA_WORLD)
- {
- for (LLCullResult::bridge_list_t::iterator i = sCull->beginVisibleBridge(); i != sCull->endVisibleBridge(); ++i)
- {
- LLCullResult::bridge_list_t::iterator cur_iter = i;
- LLSpatialBridge* bridge = *cur_iter;
- LLSpatialGroup* group = bridge->getSpatialGroup();
- if (!bridge->isDead() && group && !group->isOcclusionState(LLSpatialGroup::OCCLUDED))
- {
- stateSort(bridge, camera);
+
+ if (!sDelayVBUpdate)
+ { //rebuild mesh as soon as we know it's visible
+ group->rebuildMesh();
}
}
}
+
{
LLFastTimer ftm(FTM_STATESORT_DRAWABLE);
for (LLCullResult::drawable_list_t::iterator iter = sCull->beginVisibleList();
@@ -2285,11 +3019,7 @@ void LLPipeline::stateSort(LLCamera& camera, LLCullResult &result)
}
}
}
- {
- LLFastTimer ftm(FTM_CLIENT_COPY);
- LLVertexBuffer::clientCopy();
- }
-
+
postSort(camera);
}
@@ -2303,6 +3033,11 @@ void LLPipeline::stateSort(LLSpatialGroup* group, LLCamera& camera)
LLDrawable* drawablep = *i;
stateSort(drawablep, camera);
}
+
+ if (LLViewerCamera::sCurCameraID == LLViewerCamera::CAMERA_WORLD)
+ { //avoid redundant stateSort calls
+ group->mLastUpdateDistance = group->mDistance;
+ }
}
}
@@ -2310,7 +3045,7 @@ void LLPipeline::stateSort(LLSpatialGroup* group, LLCamera& camera)
void LLPipeline::stateSort(LLSpatialBridge* bridge, LLCamera& camera)
{
LLMemType mt(LLMemType::MTYPE_PIPELINE_STATE_SORT);
- if (!sShadowRender && bridge->getSpatialGroup()->changeLOD())
+ if (bridge->getSpatialGroup()->changeLOD())
{
bool force_update = false;
bridge->updateDistance(camera, force_update);
@@ -2369,21 +3104,17 @@ void LLPipeline::stateSort(LLDrawable* drawablep, LLCamera& camera)
if (LLViewerCamera::sCurCameraID == LLViewerCamera::CAMERA_WORLD)
{
- LLSpatialGroup* group = drawablep->getSpatialGroup();
- if (!group || group->changeLOD())
+ //if (drawablep->isVisible()) isVisible() check here is redundant, if it wasn't visible, it wouldn't be here
{
- if (drawablep->isVisible())
+ if (!drawablep->isActive())
{
- if (!drawablep->isActive())
- {
- bool force_update = false;
- drawablep->updateDistance(camera, force_update);
- }
- else if (drawablep->isAvatar())
- {
- bool force_update = false;
- drawablep->updateDistance(camera, force_update); // calls vobj->updateLOD() which calls LLVOAvatar::updateVisibility()
- }
+ bool force_update = false;
+ drawablep->updateDistance(camera, force_update);
+ }
+ else if (drawablep->isAvatar())
+ {
+ bool force_update = false;
+ drawablep->updateDistance(camera, force_update); // calls vobj->updateLOD() which calls LLVOAvatar::updateVisibility()
}
}
}
@@ -2444,7 +3175,7 @@ void renderScriptedBeacons(LLDrawable* drawablep)
{
if (gPipeline.sRenderBeacons)
{
- gObjectList.addDebugBeacon(vobj->getPositionAgent(), "", LLColor4(1.f, 0.f, 0.f, 0.5f), LLColor4(1.f, 1.f, 1.f, 0.5f), gSavedSettings.getS32("DebugBeaconLineWidth"));
+ gObjectList.addDebugBeacon(vobj->getPositionAgent(), "", LLColor4(1.f, 0.f, 0.f, 0.5f), LLColor4(1.f, 1.f, 1.f, 0.5f), LLPipeline::DebugBeaconLineWidth);
}
if (gPipeline.sRenderHighlight)
@@ -2470,7 +3201,7 @@ void renderScriptedTouchBeacons(LLDrawable* drawablep)
{
if (gPipeline.sRenderBeacons)
{
- gObjectList.addDebugBeacon(vobj->getPositionAgent(), "", LLColor4(1.f, 0.f, 0.f, 0.5f), LLColor4(1.f, 1.f, 1.f, 0.5f), gSavedSettings.getS32("DebugBeaconLineWidth"));
+ gObjectList.addDebugBeacon(vobj->getPositionAgent(), "", LLColor4(1.f, 0.f, 0.f, 0.5f), LLColor4(1.f, 1.f, 1.f, 0.5f), LLPipeline::DebugBeaconLineWidth);
}
if (gPipeline.sRenderHighlight)
@@ -2495,7 +3226,43 @@ void renderPhysicalBeacons(LLDrawable* drawablep)
{
if (gPipeline.sRenderBeacons)
{
- gObjectList.addDebugBeacon(vobj->getPositionAgent(), "", LLColor4(0.f, 1.f, 0.f, 0.5f), LLColor4(1.f, 1.f, 1.f, 0.5f), gSavedSettings.getS32("DebugBeaconLineWidth"));
+ gObjectList.addDebugBeacon(vobj->getPositionAgent(), "", LLColor4(0.f, 1.f, 0.f, 0.5f), LLColor4(1.f, 1.f, 1.f, 0.5f), LLPipeline::DebugBeaconLineWidth);
+ }
+
+ if (gPipeline.sRenderHighlight)
+ {
+ S32 face_id;
+ S32 count = drawablep->getNumFaces();
+ for (face_id = 0; face_id < count; face_id++)
+ {
+ gPipeline.mHighlightFaces.push_back(drawablep->getFace(face_id) );
+ }
+ }
+ }
+}
+
+void renderMOAPBeacons(LLDrawable* drawablep)
+{
+ LLViewerObject *vobj = drawablep->getVObj();
+
+ if(!vobj || vobj->isAvatar())
+ return;
+
+ BOOL beacon=FALSE;
+ U8 tecount=vobj->getNumTEs();
+ for(int x=0;x<tecount;x++)
+ {
+ if(vobj->getTE(x)->hasMedia())
+ {
+ beacon=TRUE;
+ break;
+ }
+ }
+ if(beacon==TRUE)
+ {
+ if (gPipeline.sRenderBeacons)
+ {
+ gObjectList.addDebugBeacon(vobj->getPositionAgent(), "", LLColor4(1.f, 1.f, 1.f, 0.5f), LLColor4(1.f, 1.f, 1.f, 0.5f), LLPipeline::DebugBeaconLineWidth);
}
if (gPipeline.sRenderHighlight)
@@ -2520,7 +3287,7 @@ void renderParticleBeacons(LLDrawable* drawablep)
if (gPipeline.sRenderBeacons)
{
LLColor4 light_blue(0.5f, 0.5f, 1.f, 0.5f);
- gObjectList.addDebugBeacon(vobj->getPositionAgent(), "", light_blue, LLColor4(1.f, 1.f, 1.f, 0.5f), gSavedSettings.getS32("DebugBeaconLineWidth"));
+ gObjectList.addDebugBeacon(vobj->getPositionAgent(), "", light_blue, LLColor4(1.f, 1.f, 1.f, 0.5f), LLPipeline::DebugBeaconLineWidth);
}
if (gPipeline.sRenderHighlight)
@@ -2575,21 +3342,6 @@ void LLPipeline::postSort(LLCamera& camera)
//rebuild groups
sCull->assertDrawMapsEmpty();
- /*LLSpatialGroup::sNoDelete = FALSE;
- for (LLCullResult::sg_list_t::iterator i = sCull->beginVisibleGroups(); i != sCull->endVisibleGroups(); ++i)
- {
- LLSpatialGroup* group = *i;
- if (sUseOcclusion &&
- group->isState(LLSpatialGroup::OCCLUDED))
- {
- continue;
- }
-
- group->rebuildGeom();
- }
- LLSpatialGroup::sNoDelete = TRUE;*/
-
-
rebuildPriorityGroups();
llpushcallstacks ;
@@ -2635,8 +3387,10 @@ void LLPipeline::postSort(LLCamera& camera)
{
if (sMinRenderSize > 0.f)
{
- LLVector3 bounds = (*k)->mExtents[1]-(*k)->mExtents[0];
- if (llmax(llmax(bounds.mV[0], bounds.mV[1]), bounds.mV[2]) > sMinRenderSize)
+ LLVector4a bounds;
+ bounds.setSub((*k)->mExtents[1],(*k)->mExtents[0]);
+
+ if (llmax(llmax(bounds[0], bounds[1]), bounds[2]) > sMinRenderSize)
{
sCull->pushDrawInfo(j->first, *k);
}
@@ -2678,19 +3432,6 @@ void LLPipeline::postSort(LLCamera& camera)
if (!sShadowRender)
{
- //sort by texture or bump map
- for (U32 i = 0; i < LLRenderPass::NUM_RENDER_TYPES; ++i)
- {
- if (i == LLRenderPass::PASS_BUMP)
- {
- std::sort(sCull->beginRenderMap(i), sCull->endRenderMap(i), LLDrawInfo::CompareBump());
- }
- else
- {
- std::sort(sCull->beginRenderMap(i), sCull->endRenderMap(i), LLDrawInfo::CompareTexturePtrMatrix());
- }
- }
-
std::sort(sCull->beginAlphaGroups(), sCull->endAlphaGroups(), LLSpatialGroup::CompareDepthGreater());
}
llpushcallstacks ;
@@ -2715,6 +3456,11 @@ void LLPipeline::postSort(LLCamera& camera)
forAllVisibleDrawables(renderPhysicalBeacons);
}
+ if(sRenderMOAPBeacons)
+ {
+ forAllVisibleDrawables(renderMOAPBeacons);
+ }
+
if (sRenderParticleBeacons)
{
forAllVisibleDrawables(renderParticleBeacons);
@@ -2734,7 +3480,7 @@ void LLPipeline::postSort(LLCamera& camera)
if (gPipeline.sRenderBeacons)
{
//pos += LLVector3(0.f, 0.f, 0.2f);
- gObjectList.addDebugBeacon(pos, "", LLColor4(1.f, 1.f, 0.f, 0.5f), LLColor4(1.f, 1.f, 1.f, 0.5f), gSavedSettings.getS32("DebugBeaconLineWidth"));
+ gObjectList.addDebugBeacon(pos, "", LLColor4(1.f, 1.f, 0.f, 0.5f), LLColor4(1.f, 1.f, 1.f, 0.5f), DebugBeaconLineWidth);
}
}
// now deal with highlights for all those seeable sound sources
@@ -2790,9 +3536,16 @@ void render_hud_elements()
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
gGL.color4f(1,1,1,1);
+
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gUIProgram.bind();
+ }
+ LLGLDepthTest depth(GL_TRUE, GL_FALSE);
+
if (!LLPipeline::sReflectionRender && gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI))
{
- LLGLEnable multisample(GL_MULTISAMPLE_ARB);
+ LLGLEnable multisample(LLPipeline::RenderFSAASamples > 0 ? GL_MULTISAMPLE_ARB : 0);
gViewerWindow->renderSelections(FALSE, FALSE, FALSE); // For HUD version in render_ui_3d()
// Draw the tracking overlays
@@ -2815,6 +3568,11 @@ void render_hud_elements()
{
LLHUDText::renderAllHUD();
}
+
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gUIProgram.unbind();
+ }
gGL.flush();
}
@@ -2859,10 +3617,10 @@ void LLPipeline::renderHighlights()
//gGL.setSceneBlendType(LLRender::BT_ADD_WITH_ALPHA);
gGL.pushMatrix();
- glLoadIdentity();
- glMatrixMode(GL_PROJECTION);
+ gGL.loadIdentity();
+ gGL.matrixMode(LLRender::MM_PROJECTION);
gGL.pushMatrix();
- glLoadIdentity();
+ gGL.loadIdentity();
gGL.getTexUnit(0)->bind(&mHighlight);
@@ -2874,9 +3632,9 @@ void LLPipeline::renderHighlights()
gGL.begin(LLRender::TRIANGLES);
- F32 scale = gSavedSettings.getF32("RenderHighlightBrightness");
- LLColor4 color = gSavedSettings.getColor4("RenderHighlightColor");
- F32 thickness = gSavedSettings.getF32("RenderHighlightThickness");
+ F32 scale = RenderHighlightBrightness;
+ LLColor4 color = RenderHighlightColor;
+ F32 thickness = RenderHighlightThickness;
for (S32 pass = 0; pass < 2; ++pass)
{
@@ -2922,7 +3680,7 @@ void LLPipeline::renderHighlights()
gGL.end();
gGL.popMatrix();
- glMatrixMode(GL_MODELVIEW);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.popMatrix();
//gGL.setSceneBlendType(LLRender::BT_ALPHA);
@@ -2931,7 +3689,7 @@ void LLPipeline::renderHighlights()
if ((LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_INTERFACE) > 0))
{
gHighlightProgram.bind();
- gHighlightProgram.vertexAttrib4f(LLViewerShaderMgr::MATERIAL_COLOR,1,1,1,0.5f);
+ gGL.diffuseColor4f(1,1,1,0.5f);
}
if (hasRenderDebugFeatureMask(RENDER_DEBUG_FEATURE_SELECTED))
@@ -2961,10 +3719,7 @@ void LLPipeline::renderHighlights()
{
// Paint 'em red!
color.setVec(1.f, 0.f, 0.f, 0.5f);
- if ((LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_INTERFACE) > 0))
- {
- gHighlightProgram.vertexAttrib4f(LLViewerShaderMgr::MATERIAL_COLOR,1,0,0,0.5f);
- }
+
int count = mHighlightFaces.size();
for (S32 i = 0; i < count; i++)
{
@@ -2993,8 +3748,8 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate)
assertInitialized();
- F64 saved_modelview[16];
- F64 saved_projection[16];
+ F32 saved_modelview[16];
+ F32 saved_projection[16];
//HACK: preserve/restore matrices around HUD render
if (gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_HUD))
@@ -3031,12 +3786,13 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate)
LLAppViewer::instance()->pingMainloopTimeout("Pipeline:ForceVBO");
// Initialize lots of GL state to "safe" values
- glMatrixMode(GL_TEXTURE);
- glLoadIdentity();
- glMatrixMode(GL_MODELVIEW);
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+ gGL.matrixMode(LLRender::MM_TEXTURE);
+ gGL.loadIdentity();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
LLGLSPipeline gls_pipeline;
- LLGLEnable multisample(GL_MULTISAMPLE_ARB);
+ LLGLEnable multisample(RenderFSAASamples > 0 ? GL_MULTISAMPLE_ARB : 0);
LLGLState gls_color_material(GL_COLOR_MATERIAL, mLightingDetail < 2);
@@ -3102,7 +3858,8 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate)
{
occlude = FALSE;
gGLLastMatrix = NULL;
- glLoadMatrixd(gGLModelView);
+ gGL.loadMatrix(gGLModelView);
+ LLGLSLShader::bindNoShader();
doOcclusion(camera);
}
@@ -3112,7 +3869,7 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate)
LLFastTimer t(FTM_POOLRENDER);
gGLLastMatrix = NULL;
- glLoadMatrixd(gGLModelView);
+ gGL.loadMatrix(gGLModelView);
for( S32 i = 0; i < poolp->getNumPasses(); i++ )
{
@@ -3130,22 +3887,12 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate)
}
poolp->endRenderPass(i);
LLVertexBuffer::unbind();
- if (gDebugGL || gDebugPipeline)
+ if (gDebugGL)
{
- GLint depth;
- glGetIntegerv(GL_MODELVIEW_STACK_DEPTH, &depth);
- if (depth > 3)
- {
- if (gDebugSession)
- {
- ll_fail("GL matrix stack corrupted.");
- }
- llerrs << "GL matrix stack corrupted!" << llendl;
- }
- std::string msg = llformat("%s pass %d", gPoolNames[cur_type].c_str(), i);
+ std::string msg = llformat("pass %d", i);
LLGLState::checkStates(msg);
- LLGLState::checkTextureChannels(msg);
- LLGLState::checkClientArrays(msg);
+ //LLGLState::checkTextureChannels(msg);
+ //LLGLState::checkClientArrays(msg);
}
}
}
@@ -3164,90 +3911,84 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate)
iter1 = iter2;
stop_glerror();
}
-
- LLAppViewer::instance()->pingMainloopTimeout("Pipeline:RenderDrawPoolsEnd");
-
- LLVertexBuffer::unbind();
+ LLAppViewer::instance()->pingMainloopTimeout("Pipeline:RenderDrawPoolsEnd");
+
+ LLVertexBuffer::unbind();
+
gGLLastMatrix = NULL;
- glLoadMatrixd(gGLModelView);
+ gGL.loadMatrix(gGLModelView);
if (occlude)
{
occlude = FALSE;
gGLLastMatrix = NULL;
- glLoadMatrixd(gGLModelView);
+ gGL.loadMatrix(gGLModelView);
+ LLGLSLShader::bindNoShader();
doOcclusion(camera);
}
}
LLVertexBuffer::unbind();
LLGLState::checkStates();
- LLGLState::checkTextureChannels();
- LLGLState::checkClientArrays();
-
-
-
- stop_glerror();
-
- LLGLState::checkStates();
- LLGLState::checkTextureChannels();
- LLGLState::checkClientArrays();
- LLAppViewer::instance()->pingMainloopTimeout("Pipeline:RenderHighlights");
-
- if (!sReflectionRender)
+ if (!LLPipeline::sImpostorRender)
{
- renderHighlights();
- }
+ LLAppViewer::instance()->pingMainloopTimeout("Pipeline:RenderHighlights");
- // Contains a list of the faces of objects that are physical or
- // have touch-handlers.
- mHighlightFaces.clear();
+ if (!sReflectionRender)
+ {
+ renderHighlights();
+ }
+
+ // Contains a list of the faces of objects that are physical or
+ // have touch-handlers.
+ mHighlightFaces.clear();
- LLAppViewer::instance()->pingMainloopTimeout("Pipeline:RenderDebug");
+ LLAppViewer::instance()->pingMainloopTimeout("Pipeline:RenderDebug");
- renderDebug();
+ renderDebug();
- LLVertexBuffer::unbind();
+ LLVertexBuffer::unbind();
- if (!LLPipeline::sReflectionRender && !LLPipeline::sRenderDeferred)
- {
- if (gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI))
+ if (!LLPipeline::sReflectionRender && !LLPipeline::sRenderDeferred)
{
- // Render debugging beacons.
- gObjectList.renderObjectBeacons();
- gObjectList.resetObjectBeacons();
+ if (gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI))
+ {
+ // Render debugging beacons.
+ gObjectList.renderObjectBeacons();
+ gObjectList.resetObjectBeacons();
+ }
+ else
+ {
+ // Make sure particle effects disappear
+ LLHUDObject::renderAllForTimer();
+ }
}
else
{
// Make sure particle effects disappear
LLHUDObject::renderAllForTimer();
}
- }
- else
- {
- // Make sure particle effects disappear
- LLHUDObject::renderAllForTimer();
- }
- LLAppViewer::instance()->pingMainloopTimeout("Pipeline:RenderGeomEnd");
+ LLAppViewer::instance()->pingMainloopTimeout("Pipeline:RenderGeomEnd");
- //HACK: preserve/restore matrices around HUD render
- if (gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_HUD))
- {
- for (U32 i = 0; i < 16; i++)
+ //HACK: preserve/restore matrices around HUD render
+ if (gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_HUD))
{
- gGLModelView[i] = saved_modelview[i];
- gGLProjection[i] = saved_projection[i];
+ for (U32 i = 0; i < 16; i++)
+ {
+ gGLModelView[i] = saved_modelview[i];
+ gGLProjection[i] = saved_projection[i];
+ }
}
}
LLVertexBuffer::unbind();
LLGLState::checkStates();
- LLGLState::checkTextureChannels();
- LLGLState::checkClientArrays();
+// LLGLState::checkTextureChannels();
+// LLGLState::checkClientArrays();
}
void LLPipeline::renderGeomDeferred(LLCamera& camera)
@@ -3276,7 +4017,7 @@ void LLPipeline::renderGeomDeferred(LLCamera& camera)
}
}
- LLGLEnable multisample(GL_MULTISAMPLE_ARB);
+ LLGLEnable multisample(RenderFSAASamples > 0 ? GL_MULTISAMPLE_ARB : 0);
LLVertexBuffer::unbind();
@@ -3302,7 +4043,7 @@ void LLPipeline::renderGeomDeferred(LLCamera& camera)
LLFastTimer t(FTM_POOLRENDER);
gGLLastMatrix = NULL;
- glLoadMatrixd(gGLModelView);
+ gGL.loadMatrix(gGLModelView);
for( S32 i = 0; i < poolp->getNumDeferredPasses(); i++ )
{
@@ -3323,15 +4064,7 @@ void LLPipeline::renderGeomDeferred(LLCamera& camera)
if (gDebugGL || gDebugPipeline)
{
- GLint depth;
- glGetIntegerv(GL_MODELVIEW_STACK_DEPTH, &depth);
- if (depth > 3)
- {
- llerrs << "GL matrix stack corrupted!" << llendl;
- }
LLGLState::checkStates();
- LLGLState::checkTextureChannels();
- LLGLState::checkClientArrays();
}
}
}
@@ -3352,7 +4085,7 @@ void LLPipeline::renderGeomDeferred(LLCamera& camera)
}
gGLLastMatrix = NULL;
- glLoadMatrixd(gGLModelView);
+ gGL.loadMatrix(gGLModelView);
gGL.setColorMask(true, false);
}
@@ -3365,7 +4098,7 @@ void LLPipeline::renderGeomPostDeferred(LLCamera& camera)
LLGLEnable cull(GL_CULL_FACE);
- LLGLEnable multisample(GL_MULTISAMPLE_ARB);
+ LLGLEnable multisample(RenderFSAASamples > 0 ? GL_MULTISAMPLE_ARB : 0);
calcNearbyLights(camera);
setupHWLights(NULL);
@@ -3385,7 +4118,8 @@ void LLPipeline::renderGeomPostDeferred(LLCamera& camera)
{
occlude = FALSE;
gGLLastMatrix = NULL;
- glLoadMatrixd(gGLModelView);
+ gGL.loadMatrix(gGLModelView);
+ LLGLSLShader::bindNoShader();
doOcclusion(camera);
gGL.setColorMask(true, false);
}
@@ -3396,7 +4130,7 @@ void LLPipeline::renderGeomPostDeferred(LLCamera& camera)
LLFastTimer t(FTM_POOLRENDER);
gGLLastMatrix = NULL;
- glLoadMatrixd(gGLModelView);
+ gGL.loadMatrix(gGLModelView);
for( S32 i = 0; i < poolp->getNumPostDeferredPasses(); i++ )
{
@@ -3417,15 +4151,7 @@ void LLPipeline::renderGeomPostDeferred(LLCamera& camera)
if (gDebugGL || gDebugPipeline)
{
- GLint depth;
- glGetIntegerv(GL_MODELVIEW_STACK_DEPTH, &depth);
- if (depth > 3)
- {
- llerrs << "GL matrix stack corrupted!" << llendl;
- }
LLGLState::checkStates();
- LLGLState::checkTextureChannels();
- LLGLState::checkClientArrays();
}
}
}
@@ -3446,16 +4172,17 @@ void LLPipeline::renderGeomPostDeferred(LLCamera& camera)
}
gGLLastMatrix = NULL;
- glLoadMatrixd(gGLModelView);
+ gGL.loadMatrix(gGLModelView);
if (occlude)
{
occlude = FALSE;
gGLLastMatrix = NULL;
- glLoadMatrixd(gGLModelView);
+ gGL.loadMatrix(gGLModelView);
+ LLGLSLShader::bindNoShader();
doOcclusion(camera);
gGLLastMatrix = NULL;
- glLoadMatrixd(gGLModelView);
+ gGL.loadMatrix(gGLModelView);
}
}
@@ -3479,8 +4206,10 @@ void LLPipeline::renderGeomShadow(LLCamera& camera)
pool_set_t::iterator iter2 = iter1;
if (hasRenderType(poolp->getType()) && poolp->getNumShadowPasses() > 0)
{
+ poolp->prerender() ;
+
gGLLastMatrix = NULL;
- glLoadMatrixd(gGLModelView);
+ gGL.loadMatrix(gGLModelView);
for( S32 i = 0; i < poolp->getNumShadowPasses(); i++ )
{
@@ -3500,8 +4229,6 @@ void LLPipeline::renderGeomShadow(LLCamera& camera)
LLVertexBuffer::unbind();
LLGLState::checkStates();
- LLGLState::checkTextureChannels();
- LLGLState::checkClientArrays();
}
}
else
@@ -3521,7 +4248,7 @@ void LLPipeline::renderGeomShadow(LLCamera& camera)
}
gGLLastMatrix = NULL;
- glLoadMatrixd(gGLModelView);
+ gGL.loadMatrix(gGLModelView);
}
@@ -3550,6 +4277,69 @@ void LLPipeline::addTrianglesDrawn(S32 index_count, U32 render_type)
}
}
+void LLPipeline::renderPhysicsDisplay()
+{
+ if (!hasRenderDebugMask(LLPipeline::RENDER_DEBUG_PHYSICS_SHAPES))
+ {
+ return;
+ }
+
+ allocatePhysicsBuffer();
+
+ gGL.flush();
+ mPhysicsDisplay.bindTarget();
+ glClearColor(0,0,0,1);
+ gGL.setColorMask(true, true);
+ mPhysicsDisplay.clear();
+ glClearColor(0,0,0,0);
+
+ gGL.setColorMask(true, false);
+
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gDebugProgram.bind();
+ }
+
+ for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin();
+ iter != LLWorld::getInstance()->getRegionList().end(); ++iter)
+ {
+ LLViewerRegion* region = *iter;
+ for (U32 i = 0; i < LLViewerRegion::NUM_PARTITIONS; i++)
+ {
+ LLSpatialPartition* part = region->getSpatialPartition(i);
+ if (part)
+ {
+ if (hasRenderType(part->mDrawableType))
+ {
+ part->renderPhysicsShapes();
+ }
+ }
+ }
+ }
+
+ for (LLCullResult::bridge_list_t::const_iterator i = sCull->beginVisibleBridge(); i != sCull->endVisibleBridge(); ++i)
+ {
+ LLSpatialBridge* bridge = *i;
+ if (!bridge->isDead() && hasRenderType(bridge->mDrawableType))
+ {
+ gGL.pushMatrix();
+ gGL.multMatrix((F32*)bridge->mDrawable->getRenderMatrix().mMatrix);
+ bridge->renderPhysicsShapes();
+ gGL.popMatrix();
+ }
+ }
+
+ gGL.flush();
+
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gDebugProgram.unbind();
+ }
+
+ mPhysicsDisplay.flush();
+}
+
+
void LLPipeline::renderDebug()
{
LLMemType mt(LLMemType::MTYPE_PIPELINE);
@@ -3559,9 +4349,50 @@ void LLPipeline::renderDebug()
gGL.color4f(1,1,1,1);
gGLLastMatrix = NULL;
- glLoadMatrixd(gGLModelView);
+ gGL.loadMatrix(gGLModelView);
gGL.setColorMask(true, false);
+ bool hud_only = hasRenderType(LLPipeline::RENDER_TYPE_HUD);
+
+
+ if (!hud_only && !mDebugBlips.empty())
+ { //render debug blips
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gUIProgram.bind();
+ }
+
+ gGL.getTexUnit(0)->bind(LLViewerFetchedTexture::sWhiteImagep, true);
+
+ glPointSize(8.f);
+ LLGLDepthTest depth(GL_TRUE, GL_TRUE, GL_ALWAYS);
+
+ gGL.begin(LLRender::POINTS);
+ for (std::list<DebugBlip>::iterator iter = mDebugBlips.begin(); iter != mDebugBlips.end(); )
+ {
+ DebugBlip& blip = *iter;
+
+ blip.mAge += gFrameIntervalSeconds;
+ if (blip.mAge > 2.f)
+ {
+ mDebugBlips.erase(iter++);
+ }
+ else
+ {
+ iter++;
+ }
+
+ blip.mPosition.mV[2] += gFrameIntervalSeconds*2.f;
+
+ gGL.color4fv(blip.mColor.mV);
+ gGL.vertex3fv(blip.mPosition.mV);
+ }
+ gGL.end();
+ gGL.flush();
+ glPointSize(1.f);
+ }
+
+
// Debug stuff.
for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin();
iter != LLWorld::getInstance()->getRegionList().end(); ++iter)
@@ -3572,7 +4403,8 @@ void LLPipeline::renderDebug()
LLSpatialPartition* part = region->getSpatialPartition(i);
if (part)
{
- if (hasRenderType(part->mDrawableType))
+ if ( hud_only && (part->mDrawableType == RENDER_TYPE_HUD || part->mDrawableType == RENDER_TYPE_HUD_PARTICLES) ||
+ !hud_only && hasRenderType(part->mDrawableType) )
{
part->renderDebug();
}
@@ -3585,15 +4417,22 @@ void LLPipeline::renderDebug()
LLSpatialBridge* bridge = *i;
if (!bridge->isDead() && hasRenderType(bridge->mDrawableType))
{
- glPushMatrix();
- glMultMatrixf((F32*)bridge->mDrawable->getRenderMatrix().mMatrix);
+ gGL.pushMatrix();
+ gGL.multMatrix((F32*)bridge->mDrawable->getRenderMatrix().mMatrix);
bridge->renderDebug();
- glPopMatrix();
+ gGL.popMatrix();
}
}
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gUIProgram.bind();
+ }
+
if (hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SHADOW_FRUSTA))
{
+ LLVertexBuffer::unbind();
+
LLGLEnable blend(GL_BLEND);
LLGLDepthTest depth(TRUE, FALSE);
LLGLDisable cull(GL_CULL_FACE);
@@ -3657,7 +4496,7 @@ void LLPipeline::renderDebug()
if (i < 4)
{
- if (i == 0 || !mShadowFrustPoints[i].empty())
+ //if (i == 0 || !mShadowFrustPoints[i].empty())
{
//render visible point cloud
gGL.flush();
@@ -3697,11 +4536,12 @@ void LLPipeline::renderDebug()
gGL.vertex3fv(frust[2].mV); gGL.vertex3fv(frust[6].mV);
gGL.vertex3fv(frust[3].mV); gGL.vertex3fv(frust[7].mV);
gGL.end();
- }
-
+ }
}
- /*for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin();
+ /*gGL.flush();
+ glLineWidth(16-i*2);
+ for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin();
iter != LLWorld::getInstance()->getRegionList().end(); ++iter)
{
LLViewerRegion* region = *iter;
@@ -3716,10 +4556,17 @@ void LLPipeline::renderDebug()
}
}
}
- }*/
+ }
+ gGL.flush();
+ glLineWidth(1.f);*/
}
}
+ if (mRenderDebugMask & RENDER_DEBUG_WIND_VECTORS)
+ {
+ gAgent.getRegion()->mWind.renderVectors();
+ }
+
if (mRenderDebugMask & RENDER_DEBUG_COMPOSITION)
{
// Debug composition layers
@@ -3756,13 +4603,19 @@ void LLPipeline::renderDebug()
if (mRenderDebugMask & LLPipeline::RENDER_DEBUG_BUILD_QUEUE)
{
U32 count = 0;
- U32 size = mBuildQ2.size();
+ U32 size = mGroupQ2.size();
LLColor4 col;
+ LLVertexBuffer::unbind();
LLGLEnable blend(GL_BLEND);
+ gGL.setSceneBlendType(LLRender::BT_ALPHA);
LLGLDepthTest depth(GL_TRUE, GL_FALSE);
gGL.getTexUnit(0)->bind(LLViewerFetchedTexture::sWhiteImagep);
+ gGL.pushMatrix();
+ gGL.loadMatrix(gGLModelView);
+ gGLLastMatrix = NULL;
+
for (LLSpatialGroup::sg_vector_t::iterator iter = mGroupQ2.begin(); iter != mGroupQ2.end(); ++iter)
{
LLSpatialGroup* group = *iter;
@@ -3781,10 +4634,10 @@ void LLPipeline::renderDebug()
if (bridge)
{
gGL.pushMatrix();
- glMultMatrixf((F32*)bridge->mDrawable->getRenderMatrix().mMatrix);
+ gGL.multMatrix((F32*)bridge->mDrawable->getRenderMatrix().mMatrix);
}
- F32 alpha = (F32) (size-count)/size;
+ F32 alpha = llclamp((F32) (size-count)/size, 0.f, 1.f);
LLVector2 c(1.f-alpha, alpha);
@@ -3792,7 +4645,7 @@ void LLPipeline::renderDebug()
++count;
- col.set(c.mV[0], c.mV[1], 0, alpha*0.5f+0.1f);
+ col.set(c.mV[0], c.mV[1], 0, alpha*0.5f+0.5f);
group->drawObjectBox(col);
if (bridge)
@@ -3800,9 +4653,15 @@ void LLPipeline::renderDebug()
gGL.popMatrix();
}
}
+
+ gGL.popMatrix();
}
gGL.flush();
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gUIProgram.unbind();
+ }
}
void LLPipeline::rebuildPools()
@@ -4134,16 +4993,19 @@ void LLPipeline::setupAvatarLights(BOOL for_edit)
light_pos.normalize();
+ LLLightState* light = gGL.getLight(1);
+
mHWLightColors[1] = diffuse;
- glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse.mV);
- glLightfv(GL_LIGHT1, GL_AMBIENT, LLColor4::black.mV);
- glLightfv(GL_LIGHT1, GL_SPECULAR, LLColor4::black.mV);
- glLightfv(GL_LIGHT1, GL_POSITION, light_pos.mV);
- glLightf (GL_LIGHT1, GL_CONSTANT_ATTENUATION, 1.0f);
- glLightf (GL_LIGHT1, GL_LINEAR_ATTENUATION, 0.0f);
- glLightf (GL_LIGHT1, GL_QUADRATIC_ATTENUATION, 0.0f);
- glLightf (GL_LIGHT1, GL_SPOT_EXPONENT, 0.0f);
- glLightf (GL_LIGHT1, GL_SPOT_CUTOFF, 180.0f);
+
+ light->setDiffuse(diffuse);
+ light->setAmbient(LLColor4::black);
+ light->setSpecular(LLColor4::black);
+ light->setPosition(light_pos);
+ light->setConstantAttenuation(1.f);
+ light->setLinearAttenuation(0.f);
+ light->setQuadraticAttenuation(0.f);
+ light->setSpotExponent(0.f);
+ light->setSpotCutoff(180.f);
}
else if (gAvatarBacklight) // Always true (unless overridden in a devs .ini)
{
@@ -4174,22 +5036,28 @@ void LLPipeline::setupAvatarLights(BOOL for_edit)
backlight_diffuse *= backlight_mag / max_component;
mHWLightColors[1] = backlight_diffuse;
- glLightfv(GL_LIGHT1, GL_POSITION, backlight_pos.mV); // this is just sun/moon direction
- glLightfv(GL_LIGHT1, GL_DIFFUSE, backlight_diffuse.mV);
- glLightfv(GL_LIGHT1, GL_AMBIENT, LLColor4::black.mV);
- glLightfv(GL_LIGHT1, GL_SPECULAR, LLColor4::black.mV);
- glLightf (GL_LIGHT1, GL_CONSTANT_ATTENUATION, 1.0f);
- glLightf (GL_LIGHT1, GL_LINEAR_ATTENUATION, 0.0f);
- glLightf (GL_LIGHT1, GL_QUADRATIC_ATTENUATION, 0.0f);
- glLightf (GL_LIGHT1, GL_SPOT_EXPONENT, 0.0f);
- glLightf (GL_LIGHT1, GL_SPOT_CUTOFF, 180.0f);
+
+ LLLightState* light = gGL.getLight(1);
+
+ light->setPosition(backlight_pos);
+ light->setDiffuse(backlight_diffuse);
+ light->setAmbient(LLColor4::black);
+ light->setSpecular(LLColor4::black);
+ light->setConstantAttenuation(1.f);
+ light->setLinearAttenuation(0.f);
+ light->setQuadraticAttenuation(0.f);
+ light->setSpotExponent(0.f);
+ light->setSpotCutoff(180.f);
}
else
{
+ LLLightState* light = gGL.getLight(1);
+
mHWLightColors[1] = LLColor4::black;
- glLightfv(GL_LIGHT1, GL_DIFFUSE, LLColor4::black.mV);
- glLightfv(GL_LIGHT1, GL_AMBIENT, LLColor4::black.mV);
- glLightfv(GL_LIGHT1, GL_SPECULAR, LLColor4::black.mV);
+
+ light->setDiffuse(LLColor4::black);
+ light->setAmbient(LLColor4::black);
+ light->setSpecular(LLColor4::black);
}
}
@@ -4208,7 +5076,7 @@ static F32 calc_light_dist(LLVOVolume* light, const LLVector3& cam_pos, F32 max_
{
return max_dist;
}
- F32 dist = fsqrtf(dist2);
+ F32 dist = (F32) sqrt(dist2);
dist *= 1.f / inten;
dist -= radius;
if (selected)
@@ -4237,7 +5105,7 @@ void LLPipeline::calcNearbyLights(LLCamera& camera)
// mNearbyLight (and all light_set_t's) are sorted such that
// begin() == the closest light and rbegin() == the farthest light
const S32 MAX_LOCAL_LIGHTS = 6;
-// LLVector3 cam_pos = gAgentCamera.getCameraPositionAgent();
+// LLVector3 cam_pos = gAgent.getCameraPositionAgent();
LLVector3 cam_pos = LLViewerJoystick::getInstance()->getOverrideCamera() ?
camera.getOrigin() :
gAgent.getPositionAgent();
@@ -4342,10 +5210,14 @@ void LLPipeline::calcNearbyLights(LLCamera& camera)
void LLPipeline::setupHWLights(LLDrawPool* pool)
{
assertInitialized();
-
+
// Ambient
- LLColor4 ambient = gSky.getTotalAmbientColor();
- glLightModelfv(GL_LIGHT_MODEL_AMBIENT,ambient.mV);
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ gGL.syncMatrices();
+ LLColor4 ambient = gSky.getTotalAmbientColor();
+ gGL.setAmbientLightColor(ambient);
+ }
// Light 0 = Sun or Moon (All objects)
{
@@ -4370,15 +5242,17 @@ void LLPipeline::setupHWLights(LLDrawPool* pool)
LLVector4 light_pos(mSunDir, 0.0f);
LLColor4 light_diffuse = mSunDiffuse;
mHWLightColors[0] = light_diffuse;
- glLightfv(GL_LIGHT0, GL_POSITION, light_pos.mV); // this is just sun/moon direction
- glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse.mV);
- glLightfv(GL_LIGHT0, GL_AMBIENT, LLColor4::black.mV);
- glLightfv(GL_LIGHT0, GL_SPECULAR, LLColor4::black.mV);
- glLightf (GL_LIGHT0, GL_CONSTANT_ATTENUATION, 1.0f);
- glLightf (GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.0f);
- glLightf (GL_LIGHT0, GL_QUADRATIC_ATTENUATION, 0.0f);
- glLightf (GL_LIGHT0, GL_SPOT_EXPONENT, 0.0f);
- glLightf (GL_LIGHT0, GL_SPOT_CUTOFF, 180.0f);
+
+ LLLightState* light = gGL.getLight(0);
+ light->setPosition(light_pos);
+ light->setDiffuse(light_diffuse);
+ light->setAmbient(LLColor4::black);
+ light->setSpecular(LLColor4::black);
+ light->setConstantAttenuation(1.f);
+ light->setLinearAttenuation(0.f);
+ light->setQuadraticAttenuation(0.f);
+ light->setSpotExponent(0.f);
+ light->setSpotCutoff(180.f);
}
// Light 1 = Backlight (for avatars)
@@ -4436,36 +5310,48 @@ void LLPipeline::setupHWLights(LLDrawPool* pool)
float linatten = x / (light_radius); // % of brightness at radius
mHWLightColors[cur_light] = light_color;
- S32 gllight = GL_LIGHT0+cur_light;
- glLightfv(gllight, GL_POSITION, light_pos_gl.mV);
- glLightfv(gllight, GL_DIFFUSE, light_color.mV);
- glLightfv(gllight, GL_AMBIENT, LLColor4::black.mV);
- glLightf (gllight, GL_CONSTANT_ATTENUATION, 0.0f);
- glLightf (gllight, GL_LINEAR_ATTENUATION, linatten);
- glLightf (gllight, GL_QUADRATIC_ATTENUATION, 0.0f);
+ LLLightState* light_state = gGL.getLight(cur_light);
+
+ light_state->setPosition(light_pos_gl);
+ light_state->setDiffuse(light_color);
+ light_state->setAmbient(LLColor4::black);
+ light_state->setConstantAttenuation(0.f);
+ if (sRenderDeferred)
+ {
+ F32 size = light_radius*1.5f;
+ light_state->setLinearAttenuation(size*size);
+ light_state->setQuadraticAttenuation(light->getLightFalloff()*0.5f+1.f);
+ }
+ else
+ {
+ light_state->setLinearAttenuation(linatten);
+ light_state->setQuadraticAttenuation(0.f);
+ }
+
+
if (light->isLightSpotlight() // directional (spot-)light
- && (LLPipeline::sRenderDeferred || gSavedSettings.getBOOL("RenderSpotLightsInNondeferred"))) // these are only rendered as GL spotlights if we're in deferred rendering mode *or* the setting forces them on
+ && (LLPipeline::sRenderDeferred || RenderSpotLightsInNondeferred)) // these are only rendered as GL spotlights if we're in deferred rendering mode *or* the setting forces them on
{
LLVector3 spotparams = light->getSpotLightParams();
LLQuaternion quat = light->getRenderRotation();
LLVector3 at_axis(0,0,-1); // this matches deferred rendering's object light direction
at_axis *= quat;
- //llinfos << "SPOT!!!!!!! fov: " << spotparams.mV[0] << " focus: " << spotparams.mV[1] << " dir: " << at_axis << llendl;
- glLightfv(gllight, GL_SPOT_DIRECTION, at_axis.mV);
- glLightf (gllight, GL_SPOT_EXPONENT, 2.0f); // 2.0 = good old dot product ^ 2
- glLightf (gllight, GL_SPOT_CUTOFF, 90.0f); // hemisphere
- const float specular[] = {0.f, 0.f, 0.f, 0.f};
- glLightfv(gllight, GL_SPECULAR, specular);
+
+ light_state->setSpotDirection(at_axis);
+ light_state->setSpotCutoff(90.f);
+ light_state->setSpotExponent(2.f);
+
+ const LLColor4 specular(0.f, 0.f, 0.f, 0.f);
+ light_state->setSpecular(specular);
}
else // omnidirectional (point) light
{
- glLightf (gllight, GL_SPOT_EXPONENT, 0.0f);
- glLightf (gllight, GL_SPOT_CUTOFF, 180.0f);
-
+ light_state->setSpotExponent(0.f);
+ light_state->setSpotCutoff(180.f);
+
// we use specular.w = 1.0 as a cheap hack for the shaders to know that this is omnidirectional rather than a spotlight
- const float specular[] = {0.f, 0.f, 0.f, 1.f};
- glLightfv(gllight, GL_SPECULAR, specular);
- //llinfos << "boring light" << llendl;
+ const LLColor4 specular(0.f, 0.f, 0.f, 1.f);
+ light_state->setSpecular(specular);
}
cur_light++;
if (cur_light >= 8)
@@ -4477,13 +5363,13 @@ void LLPipeline::setupHWLights(LLDrawPool* pool)
for ( ; cur_light < 8 ; cur_light++)
{
mHWLightColors[cur_light] = LLColor4::black;
- S32 gllight = GL_LIGHT0+cur_light;
- glLightfv(gllight, GL_DIFFUSE, LLColor4::black.mV);
- glLightfv(gllight, GL_AMBIENT, LLColor4::black.mV);
- glLightfv(gllight, GL_SPECULAR, LLColor4::black.mV);
- }
+ LLLightState* light = gGL.getLight(cur_light);
- if (isAgentAvatarValid() &&
+ light->setDiffuse(LLColor4::black);
+ light->setAmbient(LLColor4::black);
+ light->setSpecular(LLColor4::black);
+ }
+ if (gAgentAvatarp &&
gAgentAvatarp->mSpecialRenderMode == 3)
{
LLColor4 light_color = LLColor4::white;
@@ -4498,23 +5384,28 @@ void LLPipeline::setupHWLights(LLDrawPool* pool)
float linatten = x / (light_radius); // % of brightness at radius
mHWLightColors[2] = light_color;
- S32 gllight = GL_LIGHT2;
- glLightfv(gllight, GL_POSITION, light_pos_gl.mV);
- glLightfv(gllight, GL_DIFFUSE, light_color.mV);
- glLightfv(gllight, GL_AMBIENT, LLColor4::black.mV);
- glLightfv(gllight, GL_SPECULAR, LLColor4::black.mV);
- glLightf (gllight, GL_CONSTANT_ATTENUATION, 0.0f);
- glLightf (gllight, GL_LINEAR_ATTENUATION, linatten);
- glLightf (gllight, GL_QUADRATIC_ATTENUATION, 0.0f);
- glLightf (gllight, GL_SPOT_EXPONENT, 0.0f);
- glLightf (gllight, GL_SPOT_CUTOFF, 180.0f);
+ LLLightState* light = gGL.getLight(2);
+
+ light->setPosition(light_pos_gl);
+ light->setDiffuse(light_color);
+ light->setAmbient(LLColor4::black);
+ light->setSpecular(LLColor4::black);
+ light->setQuadraticAttenuation(0.f);
+ light->setConstantAttenuation(0.f);
+ light->setLinearAttenuation(linatten);
+ light->setSpotExponent(0.f);
+ light->setSpotCutoff(180.f);
}
// Init GL state
- glDisable(GL_LIGHTING);
- for (S32 gllight=GL_LIGHT0; gllight<=GL_LIGHT7; gllight++)
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ glDisable(GL_LIGHTING);
+ }
+
+ for (S32 i = 0; i < 8; ++i)
{
- glDisable(gllight);
+ gGL.getLight(i)->disable();
}
mLightMask = 0;
}
@@ -4532,35 +5423,42 @@ void LLPipeline::enableLights(U32 mask)
stop_glerror();
if (!mLightMask)
{
- glEnable(GL_LIGHTING);
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ glEnable(GL_LIGHTING);
+ }
}
if (mask)
{
stop_glerror();
for (S32 i=0; i<8; i++)
{
+ LLLightState* light = gGL.getLight(i);
if (mask & (1<<i))
{
- glEnable(GL_LIGHT0 + i);
- glLightfv(GL_LIGHT0 + i, GL_DIFFUSE, mHWLightColors[i].mV);
+ light->enable();
+ light->setDiffuse(mHWLightColors[i]);
}
else
{
- glDisable(GL_LIGHT0 + i);
- glLightfv(GL_LIGHT0 + i, GL_DIFFUSE, LLColor4::black.mV);
+ light->disable();
+ light->setDiffuse(LLColor4::black);
}
}
stop_glerror();
}
else
{
- glDisable(GL_LIGHTING);
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ glDisable(GL_LIGHTING);
+ }
}
- stop_glerror();
mLightMask = mask;
- LLColor4 ambient = gSky.getTotalAmbientColor();
- glLightModelfv(GL_LIGHT_MODEL_AMBIENT,ambient.mV);
stop_glerror();
+
+ LLColor4 ambient = gSky.getTotalAmbientColor();
+ gGL.setAmbientLightColor(ambient);
}
}
@@ -4571,7 +5469,6 @@ void LLPipeline::enableLightsStatic()
if (mLightingDetail >= 2)
{
mask |= mLightMovingMask; // Hardware moving lights
- glColor4f(0.f, 0.f, 0.f, 1.0f); // no local lighting by default
}
else
{
@@ -4585,11 +5482,7 @@ void LLPipeline::enableLightsDynamic()
assertInitialized();
U32 mask = 0xff & (~2); // Local lights
enableLights(mask);
- if (mLightingDetail >= 2)
- {
- glColor4f(0.f, 0.f, 0.f, 1.f); // no local lighting by default
- }
-
+
if (isAgentAvatarValid() && getLightingDetail() <= 0)
{
if (gAgentAvatarp->mSpecialRenderMode == 0) // normal
@@ -4610,13 +5503,75 @@ void LLPipeline::enableLightsAvatar()
enableLights(mask);
}
+void LLPipeline::enableLightsPreview()
+{
+ disableLights();
+
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ glEnable(GL_LIGHTING);
+ }
+
+ LLColor4 ambient = PreviewAmbientColor;
+ gGL.setAmbientLightColor(ambient);
+
+ LLColor4 diffuse0 = PreviewDiffuse0;
+ LLColor4 specular0 = PreviewSpecular0;
+ LLColor4 diffuse1 = PreviewDiffuse1;
+ LLColor4 specular1 = PreviewSpecular1;
+ LLColor4 diffuse2 = PreviewDiffuse2;
+ LLColor4 specular2 = PreviewSpecular2;
+
+ LLVector3 dir0 = PreviewDirection0;
+ LLVector3 dir1 = PreviewDirection1;
+ LLVector3 dir2 = PreviewDirection2;
+
+ dir0.normVec();
+ dir1.normVec();
+ dir2.normVec();
+
+ LLVector4 light_pos(dir0, 0.0f);
+
+ LLLightState* light = gGL.getLight(0);
+
+ light->enable();
+ light->setPosition(light_pos);
+ light->setDiffuse(diffuse0);
+ light->setAmbient(LLColor4::black);
+ light->setSpecular(specular0);
+ light->setSpotExponent(0.f);
+ light->setSpotCutoff(180.f);
+
+ light_pos = LLVector4(dir1, 0.f);
+
+ light = gGL.getLight(1);
+ light->enable();
+ light->setPosition(light_pos);
+ light->setDiffuse(diffuse1);
+ light->setAmbient(LLColor4::black);
+ light->setSpecular(specular1);
+ light->setSpotExponent(0.f);
+ light->setSpotCutoff(180.f);
+
+ light_pos = LLVector4(dir2, 0.f);
+ light = gGL.getLight(2);
+ light->enable();
+ light->setPosition(light_pos);
+ light->setDiffuse(diffuse2);
+ light->setAmbient(LLColor4::black);
+ light->setSpecular(specular2);
+ light->setSpotExponent(0.f);
+ light->setSpotCutoff(180.f);
+}
+
+
void LLPipeline::enableLightsAvatarEdit(const LLColor4& color)
{
U32 mask = 0x2002; // Avatar backlight only, set ambient
setupAvatarLights(TRUE);
enableLights(mask);
- glLightModelfv(GL_LIGHT_MODEL_AMBIENT,color.mV);
+ gGL.setAmbientLightColor(color);
}
void LLPipeline::enableLightsFullbright(const LLColor4& color)
@@ -4625,17 +5580,12 @@ void LLPipeline::enableLightsFullbright(const LLColor4& color)
U32 mask = 0x1000; // Non-0 mask, set ambient
enableLights(mask);
- glLightModelfv(GL_LIGHT_MODEL_AMBIENT,color.mV);
- /*if (mLightingDetail >= 2)
- {
- glColor4f(0.f, 0.f, 0.f, 1.f); // no local lighting by default
- }*/
+ gGL.setAmbientLightColor(color);
}
void LLPipeline::disableLights()
{
enableLights(0); // no lighting (full bright)
- glColor4f(1.f, 1.f, 1.f, 1.f); // lighting color = white by default
}
//============================================================================
@@ -4901,6 +5851,18 @@ BOOL LLPipeline::toggleRenderDebugFeatureControl(void* data)
return gPipeline.hasRenderDebugFeatureMask(bit);
}
+void LLPipeline::setRenderDebugFeatureControl(U32 bit, bool value)
+{
+ if (value)
+ {
+ gPipeline.mRenderDebugFeatureMask |= bit;
+ }
+ else
+ {
+ gPipeline.mRenderDebugFeatureMask &= !bit;
+ }
+}
+
// static
void LLPipeline::setRenderScriptedBeacons(BOOL val)
{
@@ -4938,6 +5900,24 @@ BOOL LLPipeline::getRenderScriptedTouchBeacons(void*)
}
// static
+void LLPipeline::setRenderMOAPBeacons(BOOL val)
+{
+ sRenderMOAPBeacons = val;
+}
+
+// static
+void LLPipeline::toggleRenderMOAPBeacons(void*)
+{
+ sRenderMOAPBeacons = !sRenderMOAPBeacons;
+}
+
+// static
+BOOL LLPipeline::getRenderMOAPBeacons(void*)
+{
+ return sRenderMOAPBeacons;
+}
+
+// static
void LLPipeline::setRenderPhysicalBeacons(BOOL val)
{
sRenderPhysicalBeacons = val;
@@ -5222,10 +6202,9 @@ LLSpatialPartition* LLPipeline::getSpatialPartition(LLViewerObject* vobj)
return NULL;
}
-
void LLPipeline::resetVertexBuffers(LLDrawable* drawable)
{
- if (!drawable || drawable->isDead())
+ if (!drawable)
{
return;
}
@@ -5233,16 +6212,23 @@ void LLPipeline::resetVertexBuffers(LLDrawable* drawable)
for (S32 i = 0; i < drawable->getNumFaces(); i++)
{
LLFace* facep = drawable->getFace(i);
- facep->mVertexBuffer = NULL;
- facep->mLastVertexBuffer = NULL;
+ facep->clearVertexBuffer();
}
}
void LLPipeline::resetVertexBuffers()
{
- sRenderBump = gSavedSettings.getBOOL("RenderObjectBump");
- sUseTriStrips = gSavedSettings.getBOOL("RenderUseTriStrips");
- LLVertexBuffer::sUseStreamDraw = gSavedSettings.getBOOL("RenderUseStreamVBO");
+ mResetVertexBuffers = true;
+}
+
+void LLPipeline::doResetVertexBuffers()
+{
+ if (!mResetVertexBuffers)
+ {
+ return;
+ }
+
+ mResetVertexBuffers = false;
for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin();
iter != LLWorld::getInstance()->getRegionList().end(); ++iter)
@@ -5262,85 +6248,67 @@ void LLPipeline::resetVertexBuffers()
gSky.resetVertexBuffers();
- if (LLVertexBuffer::sGLCount > 0)
- {
- LLVertexBuffer::cleanupClass();
- }
-
+ LLVertexBuffer::cleanupClass();
+
//delete all name pool caches
LLGLNamePool::cleanupPools();
if (LLVertexBuffer::sGLCount > 0)
{
- llwarns << "VBO wipe failed." << llendl;
- }
-
- if (!LLVertexBuffer::sStreamIBOPool.mNameList.empty() ||
- !LLVertexBuffer::sStreamVBOPool.mNameList.empty() ||
- !LLVertexBuffer::sDynamicIBOPool.mNameList.empty() ||
- !LLVertexBuffer::sDynamicVBOPool.mNameList.empty())
- {
- llwarns << "VBO name pool cleanup failed." << llendl;
+ llwarns << "VBO wipe failed -- " << LLVertexBuffer::sGLCount << " buffers remaining." << llendl;
}
- LLVertexBuffer::unbind();
-
+ LLVertexBuffer::unbind();
+
+ sRenderBump = gSavedSettings.getBOOL("RenderObjectBump");
+ sUseTriStrips = gSavedSettings.getBOOL("RenderUseTriStrips");
+ LLVertexBuffer::sUseStreamDraw = gSavedSettings.getBOOL("RenderUseStreamVBO");
+ LLVertexBuffer::sUseVAO = gSavedSettings.getBOOL("RenderUseVAO");
+ LLVertexBuffer::sPreferStreamDraw = gSavedSettings.getBOOL("RenderPreferStreamDraw");
+ LLVertexBuffer::sEnableVBOs = gSavedSettings.getBOOL("RenderVBOEnable");
+ LLVertexBuffer::sDisableVBOMapping = LLVertexBuffer::sEnableVBOs && gSavedSettings.getBOOL("RenderVBOMappingDisable") ;
+ sBakeSunlight = gSavedSettings.getBOOL("RenderBakeSunlight");
+ sNoAlpha = gSavedSettings.getBOOL("RenderNoAlpha");
LLPipeline::sTextureBindTest = gSavedSettings.getBOOL("RenderDebugTextureBind");
+
+ LLVertexBuffer::initClass(LLVertexBuffer::sEnableVBOs, LLVertexBuffer::sDisableVBOMapping);
}
-void LLPipeline::renderObjects(U32 type, U32 mask, BOOL texture)
+void LLPipeline::renderObjects(U32 type, U32 mask, BOOL texture, BOOL batch_texture)
{
LLMemType mt_ro(LLMemType::MTYPE_PIPELINE_RENDER_OBJECTS);
assertInitialized();
- glLoadMatrixd(gGLModelView);
+ gGL.loadMatrix(gGLModelView);
gGLLastMatrix = NULL;
- mSimplePool->pushBatches(type, mask);
- glLoadMatrixd(gGLModelView);
+ mSimplePool->pushBatches(type, mask, texture, batch_texture);
+ gGL.loadMatrix(gGLModelView);
gGLLastMatrix = NULL;
}
-void LLPipeline::setUseVBO(BOOL use_vbo)
-{
- if (use_vbo != LLVertexBuffer::sEnableVBOs)
- {
- if (use_vbo)
- {
- llinfos << "Enabling VBO." << llendl;
- }
- else
- {
- llinfos << "Disabling VBO." << llendl;
- }
-
- resetVertexBuffers();
- LLVertexBuffer::initClass(use_vbo);
- }
-}
-
void apply_cube_face_rotation(U32 face)
{
switch (face)
{
case 0:
- glRotatef(90.f, 0, 1, 0);
- glRotatef(180.f, 1, 0, 0);
+ gGL.rotatef(90.f, 0, 1, 0);
+ gGL.rotatef(180.f, 1, 0, 0);
break;
case 2:
- glRotatef(-90.f, 1, 0, 0);
+ gGL.rotatef(-90.f, 1, 0, 0);
break;
case 4:
- glRotatef(180.f, 0, 1, 0);
- glRotatef(180.f, 0, 0, 1);
+ gGL.rotatef(180.f, 0, 1, 0);
+ gGL.rotatef(180.f, 0, 0, 1);
break;
case 1:
- glRotatef(-90.f, 0, 1, 0);
- glRotatef(180.f, 1, 0, 0);
+ gGL.rotatef(-90.f, 0, 1, 0);
+ gGL.rotatef(180.f, 1, 0, 0);
break;
case 3:
- glRotatef(90, 1, 0, 0);
+ gGL.rotatef(90, 1, 0, 0);
break;
case 5:
- glRotatef(180, 0, 0, 1);
+ gGL.rotatef(180, 0, 0, 1);
break;
}
}
@@ -5348,21 +6316,21 @@ void apply_cube_face_rotation(U32 face)
void validate_framebuffer_object()
{
GLenum status;
- status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
+ status = glCheckFramebufferStatus(GL_FRAMEBUFFER_EXT);
switch(status)
{
- case GL_FRAMEBUFFER_COMPLETE_EXT:
+ case GL_FRAMEBUFFER_COMPLETE:
//framebuffer OK, no error.
break;
- case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT:
+ case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:
// frame buffer not OK: probably means unsupported depth buffer format
- llerrs << "Framebuffer Incomplete Dimensions." << llendl;
+ llerrs << "Framebuffer Incomplete Missing Attachment." << llendl;
break;
- case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT:
+ case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT:
// frame buffer not OK: probably means unsupported depth buffer format
llerrs << "Framebuffer Incomplete Attachment." << llendl;
break;
- case GL_FRAMEBUFFER_UNSUPPORTED_EXT:
+ case GL_FRAMEBUFFER_UNSUPPORTED:
/* choose different formats */
llerrs << "Framebuffer unsupported." << llendl;
break;
@@ -5399,19 +6367,10 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
}
- U32 res_mod = gSavedSettings.getU32("RenderResolutionDivisor");
-
LLVector2 tc1(0,0);
- LLVector2 tc2((F32) gViewerWindow->getWorldViewWidthRaw()*2,
- (F32) gViewerWindow->getWorldViewHeightRaw()*2);
-
- if (res_mod > 1)
- {
- tc2 /= (F32) res_mod;
- }
+ LLVector2 tc2((F32) mScreen.getWidth()*2,
+ (F32) mScreen.getHeight()*2);
- gGL.setColorMask(true, true);
-
LLFastTimer ftm(FTM_RENDER_BLOOM);
gGL.color4f(1,1,1,1);
LLGLDepthTest depth(GL_FALSE);
@@ -5420,71 +6379,18 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
enableLightsFullbright(LLColor4(1,1,1,1));
- glMatrixMode(GL_PROJECTION);
- glPushMatrix();
- glLoadIdentity();
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
- glLoadIdentity();
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.pushMatrix();
+ gGL.loadIdentity();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.pushMatrix();
+ gGL.loadIdentity();
LLGLDisable test(GL_ALPHA_TEST);
gGL.setColorMask(true, true);
glClearColor(0,0,0,0);
-
- if (for_snapshot)
- {
- gGL.getTexUnit(0)->bind(&mGlow[1]);
- {
- //LLGLEnable stencil(GL_STENCIL_TEST);
- //glStencilFunc(GL_NOTEQUAL, 255, 0xFFFFFFFF);
- //glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
- //LLGLDisable blend(GL_BLEND);
-
- // If the snapshot is constructed from tiles, calculate which
- // tile we're in.
- const S32 num_horizontal_tiles = llceil(zoom_factor);
- const LLVector2 tile(subfield % num_horizontal_tiles,
- (S32)(subfield / num_horizontal_tiles));
- llassert(zoom_factor > 0.0); // Non-zero, non-negative.
- const F32 tile_size = 1.0/zoom_factor;
-
- tc1 = tile*tile_size; // Top left texture coordinates
- tc2 = (tile+LLVector2(1,1))*tile_size; // Bottom right texture coordinates
-
- LLGLEnable blend(GL_BLEND);
- gGL.setSceneBlendType(LLRender::BT_ADD);
-
-
- gGL.begin(LLRender::TRIANGLE_STRIP);
- gGL.color4f(1,1,1,1);
- gGL.texCoord2f(tc1.mV[0], tc1.mV[1]);
- gGL.vertex2f(-1,-1);
-
- gGL.texCoord2f(tc1.mV[0], tc2.mV[1]);
- gGL.vertex2f(-1,1);
-
- gGL.texCoord2f(tc2.mV[0], tc1.mV[1]);
- gGL.vertex2f(1,-1);
-
- gGL.texCoord2f(tc2.mV[0], tc2.mV[1]);
- gGL.vertex2f(1,1);
-
- gGL.end();
-
- gGL.flush();
- gGL.setSceneBlendType(LLRender::BT_ALPHA);
- }
-
- gGL.flush();
- glMatrixMode(GL_PROJECTION);
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW);
- glPopMatrix();
-
- return;
- }
-
+
{
{
LLFastTimer ftm(FTM_RENDER_BLOOM_FBO);
@@ -5493,26 +6399,25 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
}
gGlowExtractProgram.bind();
- F32 minLum = llmax(gSavedSettings.getF32("RenderGlowMinLuminance"), 0.0f);
- F32 maxAlpha = gSavedSettings.getF32("RenderGlowMaxExtractAlpha");
- F32 warmthAmount = gSavedSettings.getF32("RenderGlowWarmthAmount");
- LLVector3 lumWeights = gSavedSettings.getVector3("RenderGlowLumWeights");
- LLVector3 warmthWeights = gSavedSettings.getVector3("RenderGlowWarmthWeights");
- gGlowExtractProgram.uniform1f("minLuminance", minLum);
- gGlowExtractProgram.uniform1f("maxExtractAlpha", maxAlpha);
- gGlowExtractProgram.uniform3f("lumWeights", lumWeights.mV[0], lumWeights.mV[1], lumWeights.mV[2]);
- gGlowExtractProgram.uniform3f("warmthWeights", warmthWeights.mV[0], warmthWeights.mV[1], warmthWeights.mV[2]);
- gGlowExtractProgram.uniform1f("warmthAmount", warmthAmount);
+ F32 minLum = llmax((F32) RenderGlowMinLuminance, 0.0f);
+ F32 maxAlpha = RenderGlowMaxExtractAlpha;
+ F32 warmthAmount = RenderGlowWarmthAmount;
+ LLVector3 lumWeights = RenderGlowLumWeights;
+ LLVector3 warmthWeights = RenderGlowWarmthWeights;
+
+
+ gGlowExtractProgram.uniform1f(LLShaderMgr::GLOW_MIN_LUMINANCE, minLum);
+ gGlowExtractProgram.uniform1f(LLShaderMgr::GLOW_MAX_EXTRACT_ALPHA, maxAlpha);
+ gGlowExtractProgram.uniform3f(LLShaderMgr::GLOW_LUM_WEIGHTS, lumWeights.mV[0], lumWeights.mV[1], lumWeights.mV[2]);
+ gGlowExtractProgram.uniform3f(LLShaderMgr::GLOW_WARMTH_WEIGHTS, warmthWeights.mV[0], warmthWeights.mV[1], warmthWeights.mV[2]);
+ gGlowExtractProgram.uniform1f(LLShaderMgr::GLOW_WARMTH_AMOUNT, warmthAmount);
LLGLEnable blend_on(GL_BLEND);
LLGLEnable test(GL_ALPHA_TEST);
- gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
+
gGL.setSceneBlendType(LLRender::BT_ADD_WITH_ALPHA);
- gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- gGL.getTexUnit(0)->disable();
- gGL.getTexUnit(0)->enable(LLTexUnit::TT_RECT_TEXTURE);
- gGL.getTexUnit(0)->bind(&mScreen);
-
+ mScreen.bindTexture(0, 0);
+
gGL.color4f(1,1,1,1);
gPipeline.enableLightsFullbright(LLColor4(1,1,1,1));
gGL.begin(LLRender::TRIANGLE_STRIP);
@@ -5527,7 +6432,7 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
gGL.end();
- gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);
+ gGL.getTexUnit(0)->unbind(mScreen.getUsage());
mGlow[2].flush();
}
@@ -5536,26 +6441,25 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
tc2.setVec(2,2);
// power of two between 1 and 1024
- U32 glowResPow = gSavedSettings.getS32("RenderGlowResolutionPow");
+ U32 glowResPow = RenderGlowResolutionPow;
const U32 glow_res = llmax(1,
llmin(1024, 1 << glowResPow));
- S32 kernel = gSavedSettings.getS32("RenderGlowIterations")*2;
- F32 delta = gSavedSettings.getF32("RenderGlowWidth") / glow_res;
+ S32 kernel = RenderGlowIterations*2;
+ F32 delta = RenderGlowWidth / glow_res;
// Use half the glow width if we have the res set to less than 9 so that it looks
// almost the same in either case.
if (glowResPow < 9)
{
delta *= 0.5f;
}
- F32 strength = gSavedSettings.getF32("RenderGlowStrength");
+ F32 strength = RenderGlowStrength;
gGlowProgram.bind();
- gGlowProgram.uniform1f("glowStrength", strength);
+ gGlowProgram.uniform1f(LLShaderMgr::GLOW_STRENGTH, strength);
for (S32 i = 0; i < kernel; i++)
{
- gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
{
LLFastTimer ftm(FTM_RENDER_BLOOM_FBO);
mGlow[i%2].bindTarget();
@@ -5573,11 +6477,11 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
if (i%2 == 0)
{
- gGlowProgram.uniform2f("glowDelta", delta, 0);
+ gGlowProgram.uniform2f(LLShaderMgr::GLOW_DELTA, delta, 0);
}
else
{
- gGlowProgram.uniform2f("glowDelta", 0, delta);
+ gGlowProgram.uniform2f(LLShaderMgr::GLOW_DELTA, 0, delta);
}
gGL.begin(LLRender::TRIANGLE_STRIP);
@@ -5600,7 +6504,7 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
if (LLRenderTarget::sUseFBO)
{
LLFastTimer ftm(FTM_RENDER_BLOOM_FBO);
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
+ glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
gGLViewport[0] = gViewerWindow->getWorldViewRectRaw().mLeft;
@@ -5609,46 +6513,358 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
gGLViewport[3] = gViewerWindow->getWorldViewRectRaw().getHeight();
glViewport(gGLViewport[0], gGLViewport[1], gGLViewport[2], gGLViewport[3]);
- tc2.setVec((F32) gViewerWindow->getWorldViewWidthRaw(),
- (F32) gViewerWindow->getWorldViewHeightRaw());
+ tc2.setVec((F32) mScreen.getWidth(),
+ (F32) mScreen.getHeight());
gGL.flush();
LLVertexBuffer::unbind();
- if (LLPipeline::sRenderDeferred && LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_DEFERRED) > 2)
+ if (LLPipeline::sRenderDeferred)
{
- LLGLDisable blend(GL_BLEND);
- bindDeferredShader(gDeferredGIFinalProgram);
- S32 channel = gDeferredGIFinalProgram.enableTexture(LLViewerShaderMgr::DEFERRED_DIFFUSE, LLTexUnit::TT_RECT_TEXTURE);
- if (channel > -1)
+ bool dof_enabled = !LLViewerCamera::getInstance()->cameraUnderWater() &&
+ !LLToolMgr::getInstance()->inBuildMode() &&
+ RenderDepthOfField;
+
+
+ bool multisample = RenderFSAASamples > 1 && mFXAABuffer.isComplete();
+
+ gViewerWindow->setup3DViewport();
+
+ if (dof_enabled)
{
- mScreen.bindTexture(0, channel);
- }
+ LLGLSLShader* shader = &gDeferredPostProgram;
+ LLGLDisable blend(GL_BLEND);
- gGL.begin(LLRender::TRIANGLE_STRIP);
- gGL.texCoord2f(tc1.mV[0], tc1.mV[1]);
- gGL.vertex2f(-1,-1);
+ //depth of field focal plane calculations
+ static F32 current_distance = 16.f;
+ static F32 start_distance = 16.f;
+ static F32 transition_time = 1.f;
+
+ LLVector3 focus_point;
+
+ LLViewerObject* obj = LLViewerMediaFocus::getInstance()->getFocusedObject();
+ if (obj && obj->mDrawable && obj->isSelected())
+ { //focus on selected media object
+ S32 face_idx = LLViewerMediaFocus::getInstance()->getFocusedFace();
+ if (obj && obj->mDrawable)
+ {
+ LLFace* face = obj->mDrawable->getFace(face_idx);
+ if (face)
+ {
+ focus_point = face->getPositionAgent();
+ }
+ }
+ }
- gGL.texCoord2f(tc1.mV[0], tc2.mV[1]);
- gGL.vertex2f(-1,3);
+ if (focus_point.isExactlyZero())
+ {
+ if (LLViewerJoystick::getInstance()->getOverrideCamera())
+ { //focus on point under cursor
+ focus_point = gDebugRaycastIntersection;
+ }
+ else if (gAgentCamera.cameraMouselook())
+ { //focus on point under mouselook crosshairs
+ gViewerWindow->cursorIntersect(-1, -1, 512.f, NULL, -1, FALSE,
+ NULL,
+ &focus_point);
+ }
+ else
+ {
+ LLViewerObject* obj = gAgentCamera.getFocusObject();
+ if (obj)
+ { //focus on alt-zoom target
+ focus_point = LLVector3(gAgentCamera.getFocusGlobal()-gAgent.getRegion()->getOriginGlobal());
+ }
+ else
+ { //focus on your avatar
+ focus_point = gAgent.getPositionAgent();
+ }
+ }
+ }
+
+ LLVector3 eye = LLViewerCamera::getInstance()->getOrigin();
+ F32 target_distance = 16.f;
+ if (!focus_point.isExactlyZero())
+ {
+ target_distance = LLViewerCamera::getInstance()->getAtAxis() * (focus_point-eye);
+ }
+
+ if (transition_time >= 1.f &&
+ fabsf(current_distance-target_distance)/current_distance > 0.01f)
+ { //large shift happened, interpolate smoothly to new target distance
+ transition_time = 0.f;
+ start_distance = current_distance;
+ }
+ else if (transition_time < 1.f)
+ { //currently in a transition, continue interpolating
+ transition_time += 1.f/CameraFocusTransitionTime*gFrameIntervalSeconds;
+ transition_time = llmin(transition_time, 1.f);
+
+ F32 t = cosf(transition_time*F_PI+F_PI)*0.5f+0.5f;
+ current_distance = start_distance + (target_distance-start_distance)*t;
+ }
+ else
+ { //small or no change, just snap to target distance
+ current_distance = target_distance;
+ }
+
+ //convert to mm
+ F32 subject_distance = current_distance*1000.f;
+ F32 fnumber = CameraFNumber;
+ F32 default_focal_length = CameraFocalLength;
+
+ F32 fov = LLViewerCamera::getInstance()->getView();
- gGL.texCoord2f(tc2.mV[0], tc1.mV[1]);
- gGL.vertex2f(3,-1);
+ const F32 default_fov = CameraFieldOfView * F_PI/180.f;
+ //const F32 default_aspect_ratio = gSavedSettings.getF32("CameraAspectRatio");
- gGL.end();
+ //F32 aspect_ratio = (F32) mScreen.getWidth()/(F32)mScreen.getHeight();
+
+ F32 dv = 2.f*default_focal_length * tanf(default_fov/2.f);
+ //F32 dh = 2.f*default_focal_length * tanf(default_fov*default_aspect_ratio/2.f);
- unbindDeferredShader(gDeferredGIFinalProgram);
- }
- else
- {
+ F32 focal_length = dv/(2*tanf(fov/2.f));
+
+ //F32 tan_pixel_angle = tanf(LLDrawable::sCurPixelAngle);
+
+ // from wikipedia -- c = |s2-s1|/s2 * f^2/(N(S1-f))
+ // where N = fnumber
+ // s2 = dot distance
+ // s1 = subject distance
+ // f = focal length
+ //
+
+ F32 blur_constant = focal_length*focal_length/(fnumber*(subject_distance-focal_length));
+ blur_constant /= 1000.f; //convert to meters for shader
+ F32 magnification = focal_length/(subject_distance-focal_length);
+
+ { //build diffuse+bloom+CoF
+ mDeferredLight.bindTarget();
+ shader = &gDeferredCoFProgram;
+
+ bindDeferredShader(*shader);
+
+ S32 channel = shader->enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, mScreen.getUsage());
+ if (channel > -1)
+ {
+ mScreen.bindTexture(0, channel);
+ }
+
+ shader->uniform1f(LLShaderMgr::DOF_FOCAL_DISTANCE, -subject_distance/1000.f);
+ shader->uniform1f(LLShaderMgr::DOF_BLUR_CONSTANT, blur_constant);
+ shader->uniform1f(LLShaderMgr::DOF_TAN_PIXEL_ANGLE, tanf(1.f/LLDrawable::sCurPixelAngle));
+ shader->uniform1f(LLShaderMgr::DOF_MAGNIFICATION, magnification);
+ shader->uniform1f(LLShaderMgr::DOF_MAX_COF, CameraMaxCoF);
+ shader->uniform1f(LLShaderMgr::DOF_RES_SCALE, CameraDoFResScale);
+
+ gGL.begin(LLRender::TRIANGLE_STRIP);
+ gGL.texCoord2f(tc1.mV[0], tc1.mV[1]);
+ gGL.vertex2f(-1,-1);
+
+ gGL.texCoord2f(tc1.mV[0], tc2.mV[1]);
+ gGL.vertex2f(-1,3);
+
+ gGL.texCoord2f(tc2.mV[0], tc1.mV[1]);
+ gGL.vertex2f(3,-1);
+
+ gGL.end();
- if (res_mod > 1)
+ unbindDeferredShader(*shader);
+ mDeferredLight.flush();
+ }
+
+ U32 dof_width = (U32) (mScreen.getWidth()*CameraDoFResScale);
+ U32 dof_height = (U32) (mScreen.getHeight()*CameraDoFResScale);
+
+ { //perform DoF sampling at half-res (preserve alpha channel)
+ mScreen.bindTarget();
+ glViewport(0,0, dof_width, dof_height);
+ gGL.setColorMask(true, false);
+
+ shader = &gDeferredPostProgram;
+ bindDeferredShader(*shader);
+ S32 channel = shader->enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, mDeferredLight.getUsage());
+ if (channel > -1)
+ {
+ mDeferredLight.bindTexture(0, channel);
+ }
+
+ shader->uniform1f(LLShaderMgr::DOF_MAX_COF, CameraMaxCoF);
+ shader->uniform1f(LLShaderMgr::DOF_RES_SCALE, CameraDoFResScale);
+
+ gGL.begin(LLRender::TRIANGLE_STRIP);
+ gGL.texCoord2f(tc1.mV[0], tc1.mV[1]);
+ gGL.vertex2f(-1,-1);
+
+ gGL.texCoord2f(tc1.mV[0], tc2.mV[1]);
+ gGL.vertex2f(-1,3);
+
+ gGL.texCoord2f(tc2.mV[0], tc1.mV[1]);
+ gGL.vertex2f(3,-1);
+
+ gGL.end();
+
+ unbindDeferredShader(*shader);
+ mScreen.flush();
+ gGL.setColorMask(true, true);
+ }
+
+ { //combine result based on alpha
+ if (multisample)
+ {
+ mDeferredLight.bindTarget();
+ glViewport(0, 0, mDeferredScreen.getWidth(), mDeferredScreen.getHeight());
+ }
+ else
+ {
+ gGLViewport[0] = gViewerWindow->getWorldViewRectRaw().mLeft;
+ gGLViewport[1] = gViewerWindow->getWorldViewRectRaw().mBottom;
+ gGLViewport[2] = gViewerWindow->getWorldViewRectRaw().getWidth();
+ gGLViewport[3] = gViewerWindow->getWorldViewRectRaw().getHeight();
+ glViewport(gGLViewport[0], gGLViewport[1], gGLViewport[2], gGLViewport[3]);
+ }
+
+ shader = &gDeferredDoFCombineProgram;
+ bindDeferredShader(*shader);
+
+ S32 channel = shader->enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, mScreen.getUsage());
+ if (channel > -1)
+ {
+ mScreen.bindTexture(0, channel);
+ gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR);
+ }
+
+ shader->uniform1f(LLShaderMgr::DOF_MAX_COF, CameraMaxCoF);
+ shader->uniform1f(LLShaderMgr::DOF_RES_SCALE, CameraDoFResScale);
+ shader->uniform1f(LLShaderMgr::DOF_WIDTH, dof_width-1);
+ shader->uniform1f(LLShaderMgr::DOF_HEIGHT, dof_height-1);
+
+ gGL.begin(LLRender::TRIANGLE_STRIP);
+ gGL.texCoord2f(tc1.mV[0], tc1.mV[1]);
+ gGL.vertex2f(-1,-1);
+
+ gGL.texCoord2f(tc1.mV[0], tc2.mV[1]);
+ gGL.vertex2f(-1,3);
+
+ gGL.texCoord2f(tc2.mV[0], tc1.mV[1]);
+ gGL.vertex2f(3,-1);
+
+ gGL.end();
+
+ unbindDeferredShader(*shader);
+
+ if (multisample)
+ {
+ mDeferredLight.flush();
+ }
+ }
+ }
+ else
{
- tc2 /= (F32) res_mod;
+ if (multisample)
+ {
+ mDeferredLight.bindTarget();
+ }
+ LLGLSLShader* shader = &gDeferredPostNoDoFProgram;
+
+ bindDeferredShader(*shader);
+
+ S32 channel = shader->enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, mScreen.getUsage());
+ if (channel > -1)
+ {
+ mScreen.bindTexture(0, channel);
+ }
+
+ gGL.begin(LLRender::TRIANGLE_STRIP);
+ gGL.texCoord2f(tc1.mV[0], tc1.mV[1]);
+ gGL.vertex2f(-1,-1);
+
+ gGL.texCoord2f(tc1.mV[0], tc2.mV[1]);
+ gGL.vertex2f(-1,3);
+
+ gGL.texCoord2f(tc2.mV[0], tc1.mV[1]);
+ gGL.vertex2f(3,-1);
+
+ gGL.end();
+
+ unbindDeferredShader(*shader);
+
+ if (multisample)
+ {
+ mDeferredLight.flush();
+ }
}
+ if (multisample)
+ {
+ //bake out texture2D with RGBL for FXAA shader
+ mFXAABuffer.bindTarget();
+
+ S32 width = mScreen.getWidth();
+ S32 height = mScreen.getHeight();
+ glViewport(0, 0, width, height);
+
+ LLGLSLShader* shader = &gGlowCombineFXAAProgram;
+
+ shader->bind();
+ shader->uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, width, height);
+
+ S32 channel = shader->enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, mDeferredLight.getUsage());
+ if (channel > -1)
+ {
+ mDeferredLight.bindTexture(0, channel);
+ }
+
+ gGL.begin(LLRender::TRIANGLE_STRIP);
+ gGL.vertex2f(-1,-1);
+ gGL.vertex2f(-1,3);
+ gGL.vertex2f(3,-1);
+ gGL.end();
+
+ gGL.flush();
+
+ shader->disableTexture(LLShaderMgr::DEFERRED_DIFFUSE, mDeferredLight.getUsage());
+ shader->unbind();
+
+ mFXAABuffer.flush();
+
+ shader = &gFXAAProgram;
+ shader->bind();
+
+ channel = shader->enableTexture(LLShaderMgr::DIFFUSE_MAP, mFXAABuffer.getUsage());
+ if (channel > -1)
+ {
+ mFXAABuffer.bindTexture(0, channel);
+ gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR);
+ }
+
+ gGLViewport[0] = gViewerWindow->getWorldViewRectRaw().mLeft;
+ gGLViewport[1] = gViewerWindow->getWorldViewRectRaw().mBottom;
+ gGLViewport[2] = gViewerWindow->getWorldViewRectRaw().getWidth();
+ gGLViewport[3] = gViewerWindow->getWorldViewRectRaw().getHeight();
+ glViewport(gGLViewport[0], gGLViewport[1], gGLViewport[2], gGLViewport[3]);
+
+ F32 scale_x = (F32) width/mFXAABuffer.getWidth();
+ F32 scale_y = (F32) height/mFXAABuffer.getHeight();
+ shader->uniform2f(LLShaderMgr::FXAA_TC_SCALE, scale_x, scale_y);
+ shader->uniform2f(LLShaderMgr::FXAA_RCP_SCREEN_RES, 1.f/width*scale_x, 1.f/height*scale_y);
+ shader->uniform4f(LLShaderMgr::FXAA_RCP_FRAME_OPT, -0.5f/width*scale_x, -0.5f/height*scale_y, 0.5f/width*scale_x, 0.5f/height*scale_y);
+ shader->uniform4f(LLShaderMgr::FXAA_RCP_FRAME_OPT2, -2.f/width*scale_x, -2.f/height*scale_y, 2.f/width*scale_x, 2.f/height*scale_y);
+
+ gGL.begin(LLRender::TRIANGLE_STRIP);
+ gGL.vertex2f(-1,-1);
+ gGL.vertex2f(-1,3);
+ gGL.vertex2f(3,-1);
+ gGL.end();
+
+ gGL.flush();
+ shader->unbind();
+ }
+ }
+ else
+ {
U32 mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_TEXCOORD1;
LLPointer<LLVertexBuffer> buff = new LLVertexBuffer(mask, 0);
buff->allocateBuffer(3,0,TRUE);
@@ -5673,48 +6889,96 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
v[1] = LLVector3(-1,3,0);
v[2] = LLVector3(3,-1,0);
- buff->setBuffer(0);
+ buff->flush();
LLGLDisable blend(GL_BLEND);
- //tex unit 0
- gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_COLOR);
-
- gGL.getTexUnit(0)->bind(&mGlow[1]);
- gGL.getTexUnit(1)->activate();
- gGL.getTexUnit(1)->enable(LLTexUnit::TT_RECT_TEXTURE);
-
-
- //tex unit 1
- gGL.getTexUnit(1)->setTextureColorBlend(LLTexUnit::TBO_ADD, LLTexUnit::TBS_TEX_COLOR, LLTexUnit::TBS_PREV_COLOR);
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gGlowCombineProgram.bind();
+ }
+ else
+ {
+ //tex unit 0
+ gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_COLOR);
+ //tex unit 1
+ gGL.getTexUnit(1)->setTextureColorBlend(LLTexUnit::TBO_ADD, LLTexUnit::TBS_TEX_COLOR, LLTexUnit::TBS_PREV_COLOR);
+ }
+ gGL.getTexUnit(0)->bind(&mGlow[1]);
gGL.getTexUnit(1)->bind(&mScreen);
- gGL.getTexUnit(1)->activate();
- LLGLEnable multisample(GL_MULTISAMPLE_ARB);
+ LLGLEnable multisample(RenderFSAASamples > 0 ? GL_MULTISAMPLE_ARB : 0);
buff->setBuffer(mask);
buff->drawArrays(LLRender::TRIANGLE_STRIP, 0, 3);
- gGL.getTexUnit(1)->disable();
- gGL.getTexUnit(1)->setTextureBlendType(LLTexUnit::TB_MULT);
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gGlowCombineProgram.unbind();
+ }
+ else
+ {
+ gGL.getTexUnit(1)->disable();
+ gGL.getTexUnit(1)->setTextureBlendType(LLTexUnit::TB_MULT);
- gGL.getTexUnit(0)->activate();
- gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
+ gGL.getTexUnit(0)->activate();
+ gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
+ }
+
+ }
+
+ gGL.setSceneBlendType(LLRender::BT_ALPHA);
+
+ if (hasRenderDebugMask(LLPipeline::RENDER_DEBUG_PHYSICS_SHAPES))
+ {
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gSplatTextureRectProgram.bind();
+ }
+
+ gGL.setColorMask(true, false);
+
+ LLVector2 tc1(0,0);
+ LLVector2 tc2((F32) gViewerWindow->getWorldViewWidthRaw()*2,
+ (F32) gViewerWindow->getWorldViewHeightRaw()*2);
+
+ LLGLEnable blend(GL_BLEND);
+ gGL.color4f(1,1,1,0.75f);
+
+ gGL.getTexUnit(0)->bind(&mPhysicsDisplay);
+
+ gGL.begin(LLRender::TRIANGLES);
+ gGL.texCoord2f(tc1.mV[0], tc1.mV[1]);
+ gGL.vertex2f(-1,-1);
+
+ gGL.texCoord2f(tc1.mV[0], tc2.mV[1]);
+ gGL.vertex2f(-1,3);
+
+ gGL.texCoord2f(tc2.mV[0], tc1.mV[1]);
+ gGL.vertex2f(3,-1);
+
+ gGL.end();
+ gGL.flush();
- if (LLRenderTarget::sUseFBO)
- { //copy depth buffer from mScreen to framebuffer
- LLRenderTarget::copyContentsToFramebuffer(mScreen, 0, 0, mScreen.getWidth(), mScreen.getHeight(),
- 0, 0, mScreen.getWidth(), mScreen.getHeight(), GL_DEPTH_BUFFER_BIT, GL_NEAREST);
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gSplatTextureRectProgram.unbind();
}
}
+
+
+ if (LLRenderTarget::sUseFBO)
+ { //copy depth buffer from mScreen to framebuffer
+ LLRenderTarget::copyContentsToFramebuffer(mScreen, 0, 0, mScreen.getWidth(), mScreen.getHeight(),
+ 0, 0, mScreen.getWidth(), mScreen.getHeight(), GL_DEPTH_BUFFER_BIT, GL_NEAREST);
+ }
- gGL.setSceneBlendType(LLRender::BT_ALPHA);
- glMatrixMode(GL_PROJECTION);
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW);
- glPopMatrix();
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.popMatrix();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.popMatrix();
LLVertexBuffer::unbind();
@@ -5725,7 +6989,7 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
static LLFastTimer::DeclareTimer FTM_BIND_DEFERRED("Bind Deferred");
-void LLPipeline::bindDeferredShader(LLGLSLShader& shader, U32 light_index, LLRenderTarget* gi_source, LLRenderTarget* last_gi_post, U32 noise_map)
+void LLPipeline::bindDeferredShader(LLGLSLShader& shader, U32 light_index, U32 noise_map)
{
LLFastTimer t(FTM_BIND_DEFERRED);
@@ -5734,184 +6998,58 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, U32 light_index, LLRen
noise_map = mNoiseMap;
}
- LLGLState::checkTextureChannels();
-
shader.bind();
S32 channel = 0;
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_DIFFUSE, LLTexUnit::TT_RECT_TEXTURE);
+ channel = shader.enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, mDeferredScreen.getUsage());
if (channel > -1)
{
mDeferredScreen.bindTexture(0,channel);
gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_POINT);
}
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_SPECULAR, LLTexUnit::TT_RECT_TEXTURE);
+ channel = shader.enableTexture(LLShaderMgr::DEFERRED_SPECULAR, mDeferredScreen.getUsage());
if (channel > -1)
{
mDeferredScreen.bindTexture(1, channel);
gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_POINT);
}
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_NORMAL, LLTexUnit::TT_RECT_TEXTURE);
+ channel = shader.enableTexture(LLShaderMgr::DEFERRED_NORMAL, mDeferredScreen.getUsage());
if (channel > -1)
{
mDeferredScreen.bindTexture(2, channel);
gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_POINT);
}
- if (gi_source)
- {
- BOOL has_gi = FALSE;
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_GI_DIFFUSE);
- if (channel > -1)
- {
- has_gi = TRUE;
- gi_source->bindTexture(0, channel);
- gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR);
- }
-
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_GI_SPECULAR);
- if (channel > -1)
- {
- has_gi = TRUE;
- gi_source->bindTexture(1, channel);
- gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR);
- }
-
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_GI_NORMAL);
- if (channel > -1)
- {
- has_gi = TRUE;
- gi_source->bindTexture(2, channel);
- gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR);
- }
-
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_GI_MIN_POS);
- if (channel > -1)
- {
- has_gi = TRUE;
- gi_source->bindTexture(1, channel);
- gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR);
- }
-
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_GI_MAX_POS);
- if (channel > -1)
- {
- has_gi = TRUE;
- gi_source->bindTexture(3, channel);
- gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR);
- }
-
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_GI_LAST_DIFFUSE);
- if (channel > -1)
- {
- has_gi = TRUE;
- last_gi_post->bindTexture(0, channel);
- gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR);
- }
-
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_GI_LAST_NORMAL);
- if (channel > -1)
- {
- has_gi = TRUE;
- last_gi_post->bindTexture(2, channel);
- gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR);
- }
-
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_GI_LAST_MAX_POS);
- if (channel > -1)
- {
- has_gi = TRUE;
- last_gi_post->bindTexture(1, channel);
- gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR);
- }
-
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_GI_LAST_MIN_POS);
- if (channel > -1)
- {
- has_gi = TRUE;
- last_gi_post->bindTexture(3, channel);
- gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR);
- }
-
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_GI_DEPTH);
- if (channel > -1)
- {
- has_gi = TRUE;
- gGL.getTexUnit(channel)->bind(gi_source, TRUE);
- gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_POINT);
- stop_glerror();
-
- glTexParameteri(LLTexUnit::getInternalType(mGIMap.getUsage()), GL_TEXTURE_COMPARE_MODE_ARB, GL_NONE);
- glTexParameteri(LLTexUnit::getInternalType(mGIMap.getUsage()), GL_DEPTH_TEXTURE_MODE_ARB, GL_ALPHA);
-
- stop_glerror();
- }
-
- if (has_gi)
- {
- F32 range_x = llmin(mGIRange.mV[0], 1.f);
- F32 range_y = llmin(mGIRange.mV[1], 1.f);
-
- LLVector2 scale(range_x,range_y);
-
- LLVector2 kern[25];
-
- for (S32 i = 0; i < 5; ++i)
- {
- for (S32 j = 0; j < 5; ++j)
- {
- S32 idx = i*5+j;
- kern[idx].mV[0] = (i-2)*0.5f;
- kern[idx].mV[1] = (j-2)*0.5f;
- kern[idx].scaleVec(scale);
- }
- }
-
- shader.uniform2fv("gi_kern", 25, (F32*) kern);
- shader.uniformMatrix4fv("gi_mat", 1, FALSE, mGIMatrix.m);
- shader.uniformMatrix4fv("gi_mat_proj", 1, FALSE, mGIMatrixProj.m);
- shader.uniformMatrix4fv("gi_inv_proj", 1, FALSE, mGIInvProj.m);
- shader.uniformMatrix4fv("gi_norm_mat", 1, FALSE, mGINormalMatrix.m);
- }
- }
-
- /*channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_POSITION, LLTexUnit::TT_RECT_TEXTURE);
- if (channel > -1)
- {
- mDeferredScreen.bindTexture(3, channel);
- }*/
-
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_DEPTH, LLTexUnit::TT_RECT_TEXTURE);
+ channel = shader.enableTexture(LLShaderMgr::DEFERRED_DEPTH, mDeferredDepth.getUsage());
if (channel > -1)
{
gGL.getTexUnit(channel)->bind(&mDeferredDepth, TRUE);
- gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_POINT);
stop_glerror();
- glTexParameteri(LLTexUnit::getInternalType(mDeferredDepth.getUsage()), GL_TEXTURE_COMPARE_MODE_ARB, GL_NONE);
- glTexParameteri(LLTexUnit::getInternalType(mDeferredDepth.getUsage()), GL_DEPTH_TEXTURE_MODE_ARB, GL_ALPHA);
+ //glTexParameteri(LLTexUnit::getInternalType(mDeferredDepth.getUsage()), GL_TEXTURE_COMPARE_MODE_ARB, GL_NONE);
+ //glTexParameteri(LLTexUnit::getInternalType(mDeferredDepth.getUsage()), GL_DEPTH_TEXTURE_MODE_ARB, GL_ALPHA);
stop_glerror();
glh::matrix4f projection = glh_get_current_projection();
glh::matrix4f inv_proj = projection.inverse();
- shader.uniformMatrix4fv("inv_proj", 1, FALSE, inv_proj.m);
- shader.uniform4f("viewport", (F32) gGLViewport[0],
+ shader.uniformMatrix4fv(LLShaderMgr::INVERSE_PROJECTION_MATRIX, 1, FALSE, inv_proj.m);
+ shader.uniform4f(LLShaderMgr::VIEWPORT, (F32) gGLViewport[0],
(F32) gGLViewport[1],
(F32) gGLViewport[2],
(F32) gGLViewport[3]);
}
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_NOISE);
+ channel = shader.enableTexture(LLShaderMgr::DEFERRED_NOISE);
if (channel > -1)
{
gGL.getTexUnit(channel)->bindManual(LLTexUnit::TT_TEXTURE, noise_map);
gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_POINT);
}
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_LIGHTFUNC);
+ channel = shader.enableTexture(LLShaderMgr::DEFERRED_LIGHTFUNC);
if (channel > -1)
{
gGL.getTexUnit(channel)->bindManual(LLTexUnit::TT_TEXTURE, mLightFunc);
@@ -5919,60 +7057,31 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, U32 light_index, LLRen
stop_glerror();
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_LIGHT, LLTexUnit::TT_RECT_TEXTURE);
+ channel = shader.enableTexture(LLShaderMgr::DEFERRED_LIGHT, mDeferredLight.getUsage());
if (channel > -1)
{
- mDeferredLight[light_index].bindTexture(0, channel);
+ if (light_index > 0)
+ {
+ mScreen.bindTexture(0, channel);
+ }
+ else
+ {
+ mDeferredLight.bindTexture(0, channel);
+ }
gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_POINT);
}
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_LUMINANCE);
- if (channel > -1)
- {
- gGL.getTexUnit(channel)->bindManual(LLTexUnit::TT_TEXTURE, mLuminanceMap.getTexture(), true);
- gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_TRILINEAR);
- }
-
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_BLOOM);
+ channel = shader.enableTexture(LLShaderMgr::DEFERRED_BLOOM);
if (channel > -1)
{
mGlow[1].bindTexture(0, channel);
}
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_GI_LIGHT, LLTexUnit::TT_RECT_TEXTURE);
- if (channel > -1)
- {
- gi_source->bindTexture(0, channel);
- gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_POINT);
- }
-
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_EDGE, LLTexUnit::TT_RECT_TEXTURE);
- if (channel > -1)
- {
- mEdgeMap.bindTexture(0, channel);
- gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_POINT);
- }
-
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_SUN_LIGHT, LLTexUnit::TT_RECT_TEXTURE);
- if (channel > -1)
- {
- mDeferredLight[1].bindTexture(0, channel);
- gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_POINT);
- }
-
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_LOCAL_LIGHT, LLTexUnit::TT_RECT_TEXTURE);
- if (channel > -1)
- {
- mDeferredLight[2].bindTexture(0, channel);
- gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_POINT);
- }
-
-
stop_glerror();
for (U32 i = 0; i < 4; i++)
{
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_SHADOW0+i, LLTexUnit::TT_RECT_TEXTURE);
+ channel = shader.enableTexture(LLShaderMgr::DEFERRED_SHADOW0+i, LLTexUnit::TT_RECT_TEXTURE);
stop_glerror();
if (channel > -1)
{
@@ -5990,7 +7099,7 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, U32 light_index, LLRen
for (U32 i = 4; i < 6; i++)
{
- channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_SHADOW0+i);
+ channel = shader.enableTexture(LLShaderMgr::DEFERRED_SHADOW0+i);
stop_glerror();
if (channel > -1)
{
@@ -6019,12 +7128,11 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, U32 light_index, LLRen
mat[i+80] = mSunShadowMatrix[5].m[i];
}
- shader.uniformMatrix4fv("shadow_matrix[0]", 6, FALSE, mat);
- shader.uniformMatrix4fv("shadow_matrix", 6, FALSE, mat);
+ shader.uniformMatrix4fv(LLShaderMgr::DEFERRED_SHADOW_MATRIX, 6, FALSE, mat);
stop_glerror();
- channel = shader.enableTexture(LLViewerShaderMgr::ENVIRONMENT_MAP, LLTexUnit::TT_CUBE_MAP);
+ channel = shader.enableTexture(LLShaderMgr::ENVIRONMENT_MAP, LLTexUnit::TT_CUBE_MAP);
if (channel > -1)
{
LLCubeMap* cube_map = gSky.mVOSkyp ? gSky.mVOSkyp->getCubeMap() : NULL;
@@ -6032,31 +7140,29 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, U32 light_index, LLRen
{
cube_map->enable(channel);
cube_map->bind();
- F64* m = gGLModelView;
-
-
+ F32* m = gGLModelView;
+
F32 mat[] = { m[0], m[1], m[2],
m[4], m[5], m[6],
m[8], m[9], m[10] };
- shader.uniform3fv("env_mat[0]", 3, mat);
- shader.uniform3fv("env_mat", 3, mat);
+ shader.uniformMatrix3fv(LLShaderMgr::DEFERRED_ENV_MAT, 1, TRUE, mat);
}
}
- shader.uniform4fv("shadow_clip", 1, mSunClipPlanes.mV);
- shader.uniform1f("sun_wash", gSavedSettings.getF32("RenderDeferredSunWash"));
- shader.uniform1f("shadow_noise", gSavedSettings.getF32("RenderShadowNoise"));
- shader.uniform1f("blur_size", gSavedSettings.getF32("RenderShadowBlurSize"));
+ shader.uniform4fv(LLShaderMgr::DEFERRED_SHADOW_CLIP, 1, mSunClipPlanes.mV);
+ shader.uniform1f(LLShaderMgr::DEFERRED_SUN_WASH, RenderDeferredSunWash);
+ shader.uniform1f(LLShaderMgr::DEFERRED_SHADOW_NOISE, RenderShadowNoise);
+ shader.uniform1f(LLShaderMgr::DEFERRED_BLUR_SIZE, RenderShadowBlurSize);
- shader.uniform1f("ssao_radius", gSavedSettings.getF32("RenderSSAOScale"));
- shader.uniform1f("ssao_max_radius", gSavedSettings.getU32("RenderSSAOMaxScale"));
+ shader.uniform1f(LLShaderMgr::DEFERRED_SSAO_RADIUS, RenderSSAOScale);
+ shader.uniform1f(LLShaderMgr::DEFERRED_SSAO_MAX_RADIUS, RenderSSAOMaxScale);
- F32 ssao_factor = gSavedSettings.getF32("RenderSSAOFactor");
- shader.uniform1f("ssao_factor", ssao_factor);
- shader.uniform1f("ssao_factor_inv", 1.0/ssao_factor);
+ F32 ssao_factor = RenderSSAOFactor;
+ shader.uniform1f(LLShaderMgr::DEFERRED_SSAO_FACTOR, ssao_factor);
+ shader.uniform1f(LLShaderMgr::DEFERRED_SSAO_FACTOR_INV, 1.0/ssao_factor);
- LLVector3 ssao_effect = gSavedSettings.getVector3("RenderSSAOEffect");
+ LLVector3 ssao_effect = RenderSSAOEffect;
F32 matrix_diag = (ssao_effect[0] + 2.0*ssao_effect[1])/3.0;
F32 matrix_nondiag = (ssao_effect[0] - ssao_effect[1])/3.0;
// This matrix scales (proj of color onto <1/rt(3),1/rt(3),1/rt(3)>) by
@@ -6064,35 +7170,24 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, U32 light_index, LLRen
F32 ssao_effect_mat[] = { matrix_diag, matrix_nondiag, matrix_nondiag,
matrix_nondiag, matrix_diag, matrix_nondiag,
matrix_nondiag, matrix_nondiag, matrix_diag};
- shader.uniformMatrix3fv("ssao_effect_mat", 1, GL_FALSE, ssao_effect_mat);
-
- F32 shadow_offset_error = 1.f + gSavedSettings.getF32("RenderShadowOffsetError") * fabsf(LLViewerCamera::getInstance()->getOrigin().mV[2]);
- F32 shadow_bias_error = 1.f + gSavedSettings.getF32("RenderShadowBiasError") * fabsf(LLViewerCamera::getInstance()->getOrigin().mV[2]);
-
- shader.uniform2f("screen_res", mDeferredScreen.getWidth(), mDeferredScreen.getHeight());
- shader.uniform1f("near_clip", LLViewerCamera::getInstance()->getNear()*2.f);
- shader.uniform1f ("shadow_offset", gSavedSettings.getF32("RenderShadowOffset")*shadow_offset_error);
- shader.uniform1f("shadow_bias", gSavedSettings.getF32("RenderShadowBias")*shadow_bias_error);
- shader.uniform1f ("spot_shadow_offset", gSavedSettings.getF32("RenderSpotShadowOffset"));
- shader.uniform1f("spot_shadow_bias", gSavedSettings.getF32("RenderSpotShadowBias"));
-
- shader.uniform1f("lum_scale", gSavedSettings.getF32("RenderLuminanceScale"));
- shader.uniform1f("sun_lum_scale", gSavedSettings.getF32("RenderSunLuminanceScale"));
- shader.uniform1f("sun_lum_offset", gSavedSettings.getF32("RenderSunLuminanceOffset"));
- shader.uniform1f("lum_lod", gSavedSettings.getF32("RenderLuminanceDetail"));
- shader.uniform1f("gi_range", gSavedSettings.getF32("RenderGIRange"));
- shader.uniform1f("gi_brightness", gSavedSettings.getF32("RenderGIBrightness"));
- shader.uniform1f("gi_luminance", gSavedSettings.getF32("RenderGILuminance"));
- shader.uniform1f("gi_edge_weight", gSavedSettings.getF32("RenderGIBlurEdgeWeight"));
- shader.uniform1f("gi_blur_brightness", gSavedSettings.getF32("RenderGIBlurBrightness"));
- shader.uniform1f("gi_sample_width", mGILightRadius);
- shader.uniform1f("gi_noise", gSavedSettings.getF32("RenderGINoise"));
- shader.uniform1f("gi_attenuation", gSavedSettings.getF32("RenderGIAttenuation"));
- shader.uniform1f("gi_ambiance", gSavedSettings.getF32("RenderGIAmbiance"));
- shader.uniform2f("shadow_res", mShadow[0].getWidth(), mShadow[0].getHeight());
- shader.uniform2f("proj_shadow_res", mShadow[4].getWidth(), mShadow[4].getHeight());
- shader.uniform1f("depth_cutoff", gSavedSettings.getF32("RenderEdgeDepthCutoff"));
- shader.uniform1f("norm_cutoff", gSavedSettings.getF32("RenderEdgeNormCutoff"));
+ shader.uniformMatrix3fv(LLShaderMgr::DEFERRED_SSAO_EFFECT_MAT, 1, GL_FALSE, ssao_effect_mat);
+
+ F32 shadow_offset_error = 1.f + RenderShadowOffsetError * fabsf(LLViewerCamera::getInstance()->getOrigin().mV[2]);
+ F32 shadow_bias_error = 1.f + RenderShadowBiasError * fabsf(LLViewerCamera::getInstance()->getOrigin().mV[2]);
+
+ shader.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, mDeferredScreen.getWidth(), mDeferredScreen.getHeight());
+ shader.uniform1f(LLShaderMgr::DEFERRED_NEAR_CLIP, LLViewerCamera::getInstance()->getNear()*2.f);
+ shader.uniform1f (LLShaderMgr::DEFERRED_SHADOW_OFFSET, RenderShadowOffset*shadow_offset_error);
+ shader.uniform1f(LLShaderMgr::DEFERRED_SHADOW_BIAS, RenderShadowBias*shadow_bias_error);
+ shader.uniform1f(LLShaderMgr::DEFERRED_SPOT_SHADOW_OFFSET, RenderSpotShadowOffset);
+ shader.uniform1f(LLShaderMgr::DEFERRED_SPOT_SHADOW_BIAS, RenderSpotShadowBias);
+
+ shader.uniform3fv(LLShaderMgr::DEFERRED_SUN_DIR, 1, mTransformedSunDir.mV);
+ shader.uniform2f(LLShaderMgr::DEFERRED_SHADOW_RES, mShadow[0].getWidth(), mShadow[0].getHeight());
+ shader.uniform2f(LLShaderMgr::DEFERRED_PROJ_SHADOW_RES, mShadow[4].getWidth(), mShadow[4].getHeight());
+ shader.uniform1f(LLShaderMgr::DEFERRED_DEPTH_CUTOFF, RenderEdgeDepthCutoff);
+ shader.uniform1f(LLShaderMgr::DEFERRED_NORM_CUTOFF, RenderEdgeNormCutoff);
+
if (shader.getUniformLocation("norm_mat") >= 0)
{
@@ -6130,7 +7225,7 @@ void LLPipeline::renderDeferredLighting()
0, 0, mDeferredDepth.getWidth(), mDeferredDepth.getHeight(), GL_DEPTH_BUFFER_BIT, GL_NEAREST);
}
- LLGLEnable multisample(GL_MULTISAMPLE_ARB);
+ LLGLEnable multisample(RenderFSAASamples > 0 ? GL_MULTISAMPLE_ARB : 0);
if (gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_HUD))
{
@@ -6138,9 +7233,9 @@ void LLPipeline::renderDeferredLighting()
}
//ati doesn't seem to love actually using the stencil buffer on FBO's
- LLGLEnable stencil(GL_STENCIL_TEST);
- glStencilFunc(GL_EQUAL, 1, 0xFFFFFFFF);
- glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
+ LLGLDisable stencil(GL_STENCIL_TEST);
+ //glStencilFunc(GL_EQUAL, 1, 0xFFFFFFFF);
+ //glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
gGL.setColorMask(true, true);
@@ -6152,39 +7247,40 @@ void LLPipeline::renderDeferredLighting()
glh::matrix4f mat = glh_copy_matrix(gGLModelView);
- F32 vert[] =
- {
- -1,1,
- -1,-3,
- 3,1,
- };
- glVertexPointer(2, GL_FLOAT, 0, vert);
- glColor3f(1,1,1);
+ LLStrider<LLVector3> vert;
+ mDeferredVB->getVertexStrider(vert);
+ LLStrider<LLVector2> tc0;
+ LLStrider<LLVector2> tc1;
+ mDeferredVB->getTexCoord0Strider(tc0);
+ mDeferredVB->getTexCoord1Strider(tc1);
+ vert[0].set(-1,1,0);
+ vert[1].set(-1,-3,0);
+ vert[2].set(3,1,0);
+
{
setupHWLights(NULL); //to set mSunDir;
LLVector4 dir(mSunDir, 0.f);
glh::vec4f tc(dir.mV);
mat.mult_matrix_vec(tc);
- glTexCoord4f(tc.v[0], tc.v[1], tc.v[2], 0);
+ mTransformedSunDir.set(tc.v);
}
- glPushMatrix();
- glLoadIdentity();
- glMatrixMode(GL_PROJECTION);
- glPushMatrix();
- glLoadIdentity();
-
- mDeferredLight[0].bindTarget();
+ gGL.pushMatrix();
+ gGL.loadIdentity();
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.pushMatrix();
+ gGL.loadIdentity();
- if (gSavedSettings.getBOOL("RenderDeferredSSAO") || gSavedSettings.getS32("RenderShadowDetail") > 0)
+ if (RenderDeferredSSAO || RenderShadowDetail > 0)
{
+ mDeferredLight.bindTarget();
{ //paint shadow/SSAO light map (direct lighting lightmap)
LLFastTimer ftm(FTM_SUN_SHADOW);
bindDeferredShader(gDeferredSunProgram, 0);
-
+ mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
glClearColor(1,1,1,1);
- mDeferredLight[0].clear(GL_COLOR_BUFFER_BIT);
+ mDeferredLight.clear(GL_COLOR_BUFFER_BIT);
glClearColor(0,0,0,0);
glh::matrix4f inv_trans = glh_get_current_modelview().inverse().transpose();
@@ -6207,251 +7303,129 @@ void LLPipeline::renderDeferredLighting()
}
gDeferredSunProgram.uniform3fv("offset", slice, offset);
- gDeferredSunProgram.uniform2f("screenRes", mDeferredLight[0].getWidth(), mDeferredLight[0].getHeight());
+ gDeferredSunProgram.uniform2f("screenRes", mDeferredLight.getWidth(), mDeferredLight.getHeight());
{
LLGLDisable blend(GL_BLEND);
LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_ALWAYS);
stop_glerror();
- glDrawArrays(GL_TRIANGLE_STRIP, 0, 3);
+ mDeferredVB->drawArrays(LLRender::TRIANGLES, 0, 3);
stop_glerror();
}
unbindDeferredShader(gDeferredSunProgram);
}
+ mDeferredLight.flush();
}
- else
- {
+
+ if (RenderDeferredSSAO)
+ { //soften direct lighting lightmap
+ LLFastTimer ftm(FTM_SOFTEN_SHADOW);
+ //blur lightmap
+ mScreen.bindTarget();
glClearColor(1,1,1,1);
- mDeferredLight[0].clear(GL_COLOR_BUFFER_BIT);
+ mScreen.clear(GL_COLOR_BUFFER_BIT);
glClearColor(0,0,0,0);
- }
+
+ bindDeferredShader(gDeferredBlurLightProgram);
+ mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
+ LLVector3 go = RenderShadowGaussian;
+ const U32 kern_length = 4;
+ F32 blur_size = RenderShadowBlurSize;
+ F32 dist_factor = RenderShadowBlurDistFactor;
- mDeferredLight[0].flush();
+ // sample symmetrically with the middle sample falling exactly on 0.0
+ F32 x = 0.f;
- { //global illumination specific block (still experimental)
- if (gSavedSettings.getBOOL("RenderDeferredBlurLight") &&
- gSavedSettings.getBOOL("RenderDeferredGI"))
- {
- LLFastTimer ftm(FTM_EDGE_DETECTION);
- //generate edge map
- LLGLDisable blend(GL_BLEND);
- LLGLDisable test(GL_ALPHA_TEST);
- LLGLDepthTest depth(GL_FALSE);
- LLGLDisable stencil(GL_STENCIL_TEST);
+ LLVector3 gauss[32]; // xweight, yweight, offset
- {
- gDeferredEdgeProgram.bind();
- mEdgeMap.bindTarget();
- bindDeferredShader(gDeferredEdgeProgram);
- glDrawArrays(GL_TRIANGLE_STRIP, 0, 3);
- unbindDeferredShader(gDeferredEdgeProgram);
- mEdgeMap.flush();
- }
+ for (U32 i = 0; i < kern_length; i++)
+ {
+ gauss[i].mV[0] = llgaussian(x, go.mV[0]);
+ gauss[i].mV[1] = llgaussian(x, go.mV[1]);
+ gauss[i].mV[2] = x;
+ x += 1.f;
}
- if (LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_DEFERRED) > 2)
+ gDeferredBlurLightProgram.uniform2f("delta", 1.f, 0.f);
+ gDeferredBlurLightProgram.uniform1f("dist_factor", dist_factor);
+ gDeferredBlurLightProgram.uniform3fv("kern", kern_length, gauss[0].mV);
+ gDeferredBlurLightProgram.uniform1f("kern_scale", blur_size * (kern_length/2.f - 0.5f));
+
{
- { //get luminance map from previous frame's light map
- LLGLEnable blend(GL_BLEND);
- LLGLDisable test(GL_ALPHA_TEST);
- LLGLDepthTest depth(GL_FALSE);
- LLGLDisable stencil(GL_STENCIL_TEST);
-
- //static F32 fade = 1.f;
-
- {
- gGL.setSceneBlendType(LLRender::BT_ALPHA);
- gLuminanceGatherProgram.bind();
- gLuminanceGatherProgram.uniform2f("screen_res", mDeferredLight[0].getWidth(), mDeferredLight[0].getHeight());
- mLuminanceMap.bindTarget();
- bindDeferredShader(gLuminanceGatherProgram);
- glDrawArrays(GL_TRIANGLE_STRIP, 0, 3);
- unbindDeferredShader(gLuminanceGatherProgram);
- mLuminanceMap.flush();
- gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, mLuminanceMap.getTexture(), true);
- gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_TRILINEAR);
- glGenerateMipmapEXT(GL_TEXTURE_2D);
- }
- }
-
- { //paint noisy GI map (bounce lighting lightmap)
- LLFastTimer ftm(FTM_GI_TRACE);
- LLGLDisable blend(GL_BLEND);
- LLGLDepthTest depth(GL_FALSE);
- LLGLDisable test(GL_ALPHA_TEST);
-
- mGIMapPost[0].bindTarget();
-
- bindDeferredShader(gDeferredGIProgram, 0, &mGIMap, 0, mTrueNoiseMap);
- glDrawArrays(GL_TRIANGLE_STRIP, 0, 3);
- unbindDeferredShader(gDeferredGIProgram);
- mGIMapPost[0].flush();
- }
-
- U32 pass_count = 0;
- if (gSavedSettings.getBOOL("RenderDeferredBlurLight"))
- {
- pass_count = llclamp(gSavedSettings.getU32("RenderGIBlurPasses"), (U32) 1, (U32) 128);
- }
-
- for (U32 i = 0; i < pass_count; ++i)
- { //gather/soften indirect lighting map
- LLFastTimer ftm(FTM_GI_GATHER);
- bindDeferredShader(gDeferredPostGIProgram, 0, &mGIMapPost[0], NULL, mTrueNoiseMap);
- F32 blur_size = gSavedSettings.getF32("RenderGIBlurSize")/((F32) i * gSavedSettings.getF32("RenderGIBlurIncrement")+1.f);
- gDeferredPostGIProgram.uniform2f("delta", 1.f, 0.f);
- gDeferredPostGIProgram.uniform1f("kern_scale", blur_size);
- gDeferredPostGIProgram.uniform1f("gi_blur_brightness", gSavedSettings.getF32("RenderGIBlurBrightness"));
-
- mGIMapPost[1].bindTarget();
- {
- LLGLDisable blend(GL_BLEND);
- LLGLDepthTest depth(GL_FALSE);
- stop_glerror();
- glDrawArrays(GL_TRIANGLE_STRIP, 0, 3);
- stop_glerror();
- }
-
- mGIMapPost[1].flush();
- unbindDeferredShader(gDeferredPostGIProgram);
- bindDeferredShader(gDeferredPostGIProgram, 0, &mGIMapPost[1], NULL, mTrueNoiseMap);
- mGIMapPost[0].bindTarget();
-
- gDeferredPostGIProgram.uniform2f("delta", 0.f, 1.f);
-
- {
- LLGLDisable blend(GL_BLEND);
- LLGLDepthTest depth(GL_FALSE);
- stop_glerror();
- glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
- stop_glerror();
- }
- mGIMapPost[0].flush();
- unbindDeferredShader(gDeferredPostGIProgram);
- }
+ LLGLDisable blend(GL_BLEND);
+ LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_ALWAYS);
+ stop_glerror();
+ mDeferredVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+ stop_glerror();
}
- }
-
- if (gSavedSettings.getBOOL("RenderDeferredSSAO"))
- { //soften direct lighting lightmap
- LLFastTimer ftm(FTM_SOFTEN_SHADOW);
- //blur lightmap
- mDeferredLight[1].bindTarget();
-
- glClearColor(1,1,1,1);
- mDeferredLight[1].clear(GL_COLOR_BUFFER_BIT);
- glClearColor(0,0,0,0);
-
- bindDeferredShader(gDeferredBlurLightProgram);
-
- LLVector3 go = gSavedSettings.getVector3("RenderShadowGaussian");
- const U32 kern_length = 4;
- F32 blur_size = gSavedSettings.getF32("RenderShadowBlurSize");
- F32 dist_factor = gSavedSettings.getF32("RenderShadowBlurDistFactor");
-
- // sample symmetrically with the middle sample falling exactly on 0.0
- F32 x = 0.f;
-
- LLVector3 gauss[32]; // xweight, yweight, offset
-
- for (U32 i = 0; i < kern_length; i++)
- {
- gauss[i].mV[0] = llgaussian(x, go.mV[0]);
- gauss[i].mV[1] = llgaussian(x, go.mV[1]);
- gauss[i].mV[2] = x;
- x += 1.f;
- }
-
- gDeferredBlurLightProgram.uniform2f("delta", 1.f, 0.f);
- gDeferredBlurLightProgram.uniform1f("dist_factor", dist_factor);
- gDeferredBlurLightProgram.uniform3fv("kern[0]", kern_length, gauss[0].mV);
- gDeferredBlurLightProgram.uniform3fv("kern", kern_length, gauss[0].mV);
- gDeferredBlurLightProgram.uniform1f("kern_scale", blur_size * (kern_length/2.f - 0.5f));
- {
- LLGLDisable blend(GL_BLEND);
- LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_ALWAYS);
- stop_glerror();
- glDrawArrays(GL_TRIANGLE_STRIP, 0, 3);
- stop_glerror();
- }
-
- mDeferredLight[1].flush();
- unbindDeferredShader(gDeferredBlurLightProgram);
+ mScreen.flush();
+ unbindDeferredShader(gDeferredBlurLightProgram);
- bindDeferredShader(gDeferredBlurLightProgram, 1);
- mDeferredLight[0].bindTarget();
+ bindDeferredShader(gDeferredBlurLightProgram, 1);
+ mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
+ mDeferredLight.bindTarget();
- gDeferredBlurLightProgram.uniform2f("delta", 0.f, 1.f);
+ gDeferredBlurLightProgram.uniform2f("delta", 0.f, 1.f);
- {
- LLGLDisable blend(GL_BLEND);
- LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_ALWAYS);
- stop_glerror();
- glDrawArrays(GL_TRIANGLE_STRIP, 0, 3);
- stop_glerror();
- }
- mDeferredLight[0].flush();
- unbindDeferredShader(gDeferredBlurLightProgram);
+ {
+ LLGLDisable blend(GL_BLEND);
+ LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_ALWAYS);
+ stop_glerror();
+ mDeferredVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+ stop_glerror();
}
+ mDeferredLight.flush();
+ unbindDeferredShader(gDeferredBlurLightProgram);
+ }
- stop_glerror();
- glPopMatrix();
- stop_glerror();
- glMatrixMode(GL_MODELVIEW);
- stop_glerror();
- glPopMatrix();
- stop_glerror();
+ stop_glerror();
+ gGL.popMatrix();
+ stop_glerror();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ stop_glerror();
+ gGL.popMatrix();
+ stop_glerror();
//copy depth and stencil from deferred screen
//mScreen.copyContents(mDeferredScreen, 0, 0, mDeferredScreen.getWidth(), mDeferredScreen.getHeight(),
// 0, 0, mScreen.getWidth(), mScreen.getHeight(), GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST);
- if (LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_DEFERRED) > 2)
- {
- mDeferredLight[1].bindTarget();
- // clear color buffer here (GI) - zeroing alpha (glow) is important or it will accumulate against sky
- glClearColor(0,0,0,0);
- mScreen.clear(GL_COLOR_BUFFER_BIT);
- }
- else
- {
- mScreen.bindTarget();
- // clear color buffer here - zeroing alpha (glow) is important or it will accumulate against sky
- glClearColor(0,0,0,0);
- mScreen.clear(GL_COLOR_BUFFER_BIT);
- }
-
- if (gSavedSettings.getBOOL("RenderDeferredAtmospheric"))
+ mScreen.bindTarget();
+ // clear color buffer here - zeroing alpha (glow) is important or it will accumulate against sky
+ glClearColor(0,0,0,0);
+ mScreen.clear(GL_COLOR_BUFFER_BIT);
+
+ if (RenderDeferredAtmospheric)
{ //apply sunlight contribution
LLFastTimer ftm(FTM_ATMOSPHERICS);
- bindDeferredShader(gDeferredSoftenProgram, 0, &mGIMapPost[0]);
+ bindDeferredShader(gDeferredSoftenProgram);
{
LLGLDepthTest depth(GL_FALSE);
LLGLDisable blend(GL_BLEND);
LLGLDisable test(GL_ALPHA_TEST);
//full screen blit
- glPushMatrix();
- glLoadIdentity();
- glMatrixMode(GL_PROJECTION);
- glPushMatrix();
- glLoadIdentity();
+ gGL.pushMatrix();
+ gGL.loadIdentity();
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.pushMatrix();
+ gGL.loadIdentity();
- glVertexPointer(2, GL_FLOAT, 0, vert);
+ mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
- glDrawArrays(GL_TRIANGLE_STRIP, 0, 3);
-
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW);
- glPopMatrix();
+ mDeferredVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+
+ gGL.popMatrix();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.popMatrix();
}
unbindDeferredShader(gDeferredSoftenProgram);
}
- { //render sky
+ { //render non-deferred geometry (fullbright, alpha, etc)
LLGLDisable blend(GL_BLEND);
LLGLDisable stencil(GL_STENCIL_TEST);
gGL.setSceneBlendType(LLRender::BT_ALPHA);
@@ -6468,18 +7442,9 @@ void LLPipeline::renderDeferredLighting()
gPipeline.popRenderTypeMask();
}
- BOOL render_local = gSavedSettings.getBOOL("RenderDeferredLocalLights");
- BOOL render_fullscreen = gSavedSettings.getBOOL("RenderDeferredFullscreenLights");
-
-
- if (LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_DEFERRED) > 2)
- {
- mDeferredLight[1].flush();
- mDeferredLight[2].bindTarget();
- mDeferredLight[2].clear(GL_COLOR_BUFFER_BIT);
- }
-
- if (render_local || render_fullscreen)
+ BOOL render_local = RenderLocalLights;
+
+ if (render_local)
{
gGL.setSceneBlendType(LLRender::BT_ADD);
std::list<LLVector4> fullscreen_lights;
@@ -6493,12 +7458,13 @@ void LLPipeline::renderDeferredLighting()
std::list<LLVector4> light_colors;
- F32 v[24];
- glVertexPointer(3, GL_FLOAT, 0, v);
- BOOL render_local = gSavedSettings.getBOOL("RenderDeferredLocalLights");
+ LLVertexBuffer::unbind();
+ LLVector4a* v = (LLVector4a*) vert.get();
{
bindDeferredShader(gDeferredLightProgram);
+ mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
+
LLGLDepthTest depth(GL_TRUE, GL_FALSE);
for (LLDrawable::drawable_set_t::iterator iter = mLights.begin(); iter != mLights.end(); ++iter)
{
@@ -6519,13 +7485,13 @@ void LLPipeline::renderDeferredLighting()
}
- LLVector3 center = drawablep->getPositionAgent();
- F32* c = center.mV;
+ LLVector4a center;
+ center.load3(drawablep->getPositionAgent().mV);
+ const F32* c = center.getF32ptr();
F32 s = volume->getLightRadius()*1.5f;
LLColor3 col = volume->getLightColor();
- col *= volume->getLightIntensity();
-
+
if (col.magVecSquared() < 0.001f)
{
continue;
@@ -6536,7 +7502,9 @@ void LLPipeline::renderDeferredLighting()
continue;
}
- if (camera->AABBInFrustumNoFarClip(center, LLVector3(s,s,s)) == 0)
+ LLVector4a sa;
+ sa.splat(s);
+ if (camera->AABBInFrustumNoFarClip(center, sa) == 0)
{
continue;
}
@@ -6550,15 +7518,16 @@ void LLPipeline::renderDeferredLighting()
//correspond to their axis facing, with bit position 3,2,1 matching
//axis facing x,y,z, bit set meaning positive facing, bit clear
//meaning negative facing
- v[0] = c[0]-s; v[1] = c[1]-s; v[2] = c[2]-s; // 0 - 0000
- v[3] = c[0]-s; v[4] = c[1]-s; v[5] = c[2]+s; // 1 - 0001
- v[6] = c[0]-s; v[7] = c[1]+s; v[8] = c[2]-s; // 2 - 0010
- v[9] = c[0]-s; v[10] = c[1]+s; v[11] = c[2]+s; // 3 - 0011
+ mDeferredVB->getVertexStrider(vert);
+ v[0].set(c[0]-s,c[1]-s,c[2]-s); // 0 - 0000
+ v[1].set(c[0]-s,c[1]-s,c[2]+s); // 1 - 0001
+ v[2].set(c[0]-s,c[1]+s,c[2]-s); // 2 - 0010
+ v[3].set(c[0]-s,c[1]+s,c[2]+s); // 3 - 0011
- v[12] = c[0]+s; v[13] = c[1]-s; v[14] = c[2]-s; // 4 - 0100
- v[15] = c[0]+s; v[16] = c[1]-s; v[17] = c[2]+s; // 5 - 0101
- v[18] = c[0]+s; v[19] = c[1]+s; v[20] = c[2]-s; // 6 - 0110
- v[21] = c[0]+s; v[22] = c[1]+s; v[23] = c[2]+s; // 7 - 0111
+ v[4].set(c[0]+s,c[1]-s,c[2]-s); // 4 - 0100
+ v[5].set(c[0]+s,c[1]-s,c[2]+s); // 5 - 0101
+ v[6].set(c[0]+s,c[1]+s,c[2]-s); // 6 - 0110
+ v[7].set(c[0]+s,c[1]+s,c[2]+s); // 7 - 0111
if (camera->getOrigin().mV[0] > c[0] + s + 0.2f ||
camera->getOrigin().mV[0] < c[0] - s - 0.2f ||
@@ -6577,14 +7546,20 @@ void LLPipeline::renderDeferredLighting()
}
LLFastTimer ftm(FTM_LOCAL_LIGHTS);
- glTexCoord4f(tc.v[0], tc.v[1], tc.v[2], s*s);
- glColor4f(col.mV[0], col.mV[1], col.mV[2], volume->getLightFalloff()*0.5f);
+ //glTexCoord4f(tc.v[0], tc.v[1], tc.v[2], s*s);
+ gDeferredLightProgram.uniform3fv(LLShaderMgr::LIGHT_CENTER, 1, tc.v);
+ gDeferredLightProgram.uniform1f(LLShaderMgr::LIGHT_SIZE, s*s);
+ gDeferredLightProgram.uniform3fv(LLShaderMgr::DIFFUSE_COLOR, 1, col.mV);
+ gDeferredLightProgram.uniform1f(LLShaderMgr::LIGHT_FALLOFF, volume->getLightFalloff()*0.5f);
+ //gGL.diffuseColor4f(col.mV[0], col.mV[1], col.mV[2], volume->getLightFalloff()*0.5f);
+ gGL.syncMatrices();
+ mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
glDrawRangeElements(GL_TRIANGLE_FAN, 0, 7, 8,
- GL_UNSIGNED_BYTE, get_box_fan_indices(camera, center));
+ GL_UNSIGNED_SHORT, get_box_fan_indices_ptr(camera, center));
stop_glerror();
}
}
- else if (render_fullscreen)
+ else
{
if (volume->isLightSpotlight())
{
@@ -6605,7 +7580,9 @@ void LLPipeline::renderDeferredLighting()
LLGLDepthTest depth(GL_TRUE, GL_FALSE);
bindDeferredShader(gDeferredSpotLightProgram);
- gDeferredSpotLightProgram.enableTexture(LLViewerShaderMgr::DEFERRED_PROJECTION);
+ mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
+
+ gDeferredSpotLightProgram.enableTexture(LLShaderMgr::DEFERRED_PROJECTION);
for (LLDrawable::drawable_list_t::iterator iter = spot_lights.begin(); iter != spot_lights.end(); ++iter)
{
@@ -6614,8 +7591,9 @@ void LLPipeline::renderDeferredLighting()
LLVOVolume* volume = drawablep->getVOVolume();
- LLVector3 center = drawablep->getPositionAgent();
- F32* c = center.mV;
+ LLVector4a center;
+ center.load3(drawablep->getPositionAgent().mV);
+ const F32* c = center.getF32ptr();
F32 s = volume->getLightRadius()*1.5f;
sVisibleLightCount++;
@@ -6626,42 +7604,54 @@ void LLPipeline::renderDeferredLighting()
setupSpotLight(gDeferredSpotLightProgram, drawablep);
LLColor3 col = volume->getLightColor();
- col *= volume->getLightIntensity();
-
+
//vertex positions are encoded so the 3 bits of their vertex index
//correspond to their axis facing, with bit position 3,2,1 matching
//axis facing x,y,z, bit set meaning positive facing, bit clear
//meaning negative facing
- v[0] = c[0]-s; v[1] = c[1]-s; v[2] = c[2]-s; // 0 - 0000
- v[3] = c[0]-s; v[4] = c[1]-s; v[5] = c[2]+s; // 1 - 0001
- v[6] = c[0]-s; v[7] = c[1]+s; v[8] = c[2]-s; // 2 - 0010
- v[9] = c[0]-s; v[10] = c[1]+s; v[11] = c[2]+s; // 3 - 0011
+ mDeferredVB->getVertexStrider(vert);
+ v[0].set(c[0]-s,c[1]-s,c[2]-s); // 0 - 0000
+ v[1].set(c[0]-s,c[1]-s,c[2]+s); // 1 - 0001
+ v[2].set(c[0]-s,c[1]+s,c[2]-s); // 2 - 0010
+ v[3].set(c[0]-s,c[1]+s,c[2]+s); // 3 - 0011
- v[12] = c[0]+s; v[13] = c[1]-s; v[14] = c[2]-s; // 4 - 0100
- v[15] = c[0]+s; v[16] = c[1]-s; v[17] = c[2]+s; // 5 - 0101
- v[18] = c[0]+s; v[19] = c[1]+s; v[20] = c[2]-s; // 6 - 0110
- v[21] = c[0]+s; v[22] = c[1]+s; v[23] = c[2]+s; // 7 - 0111
-
- glTexCoord4f(tc.v[0], tc.v[1], tc.v[2], s*s);
- glColor4f(col.mV[0], col.mV[1], col.mV[2], volume->getLightFalloff()*0.5f);
+ v[4].set(c[0]+s,c[1]-s,c[2]-s); // 4 - 0100
+ v[5].set(c[0]+s,c[1]-s,c[2]+s); // 5 - 0101
+ v[6].set(c[0]+s,c[1]+s,c[2]-s); // 6 - 0110
+ v[7].set(c[0]+s,c[1]+s,c[2]+s); // 7 - 0111
+
+ gDeferredSpotLightProgram.uniform3fv(LLShaderMgr::LIGHT_CENTER, 1, tc.v);
+ gDeferredSpotLightProgram.uniform1f(LLShaderMgr::LIGHT_SIZE, s*s);
+ gDeferredSpotLightProgram.uniform3fv(LLShaderMgr::DIFFUSE_COLOR, 1, col.mV);
+ gDeferredSpotLightProgram.uniform1f(LLShaderMgr::LIGHT_FALLOFF, volume->getLightFalloff()*0.5f);
+ gGL.syncMatrices();
+ mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
glDrawRangeElements(GL_TRIANGLE_FAN, 0, 7, 8,
- GL_UNSIGNED_BYTE, get_box_fan_indices(camera, center));
+ GL_UNSIGNED_SHORT, get_box_fan_indices_ptr(camera, center));
}
- gDeferredSpotLightProgram.disableTexture(LLViewerShaderMgr::DEFERRED_PROJECTION);
+ gDeferredSpotLightProgram.disableTexture(LLShaderMgr::DEFERRED_PROJECTION);
unbindDeferredShader(gDeferredSpotLightProgram);
}
+ //reset mDeferredVB to fullscreen triangle
+ mDeferredVB->getVertexStrider(vert);
+ vert[0].set(-1,1,0);
+ vert[1].set(-1,-3,0);
+ vert[2].set(3,1,0);
+
{
bindDeferredShader(gDeferredMultiLightProgram);
+ mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
+
LLGLDepthTest depth(GL_FALSE);
//full screen blit
- glPushMatrix();
- glLoadIdentity();
- glMatrixMode(GL_PROJECTION);
- glPushMatrix();
- glLoadIdentity();
+ gGL.pushMatrix();
+ gGL.loadIdentity();
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.pushMatrix();
+ gGL.loadIdentity();
U32 count = 0;
@@ -6669,7 +7659,7 @@ void LLPipeline::renderDeferredLighting()
LLVector4 light[max_count];
LLVector4 col[max_count];
- glVertexPointer(2, GL_FLOAT, 0, vert);
+// glVertexPointer(2, GL_FLOAT, 0, vert);
F32 far_z = 0.f;
@@ -6686,15 +7676,13 @@ void LLPipeline::renderDeferredLighting()
count++;
if (count == max_count || fullscreen_lights.empty())
{
- gDeferredMultiLightProgram.uniform1i("light_count", count);
- gDeferredMultiLightProgram.uniform4fv("light[0]", count, (GLfloat*) light);
- gDeferredMultiLightProgram.uniform4fv("light", count, (GLfloat*) light);
- gDeferredMultiLightProgram.uniform4fv("light_col[0]", count, (GLfloat*) col);
- gDeferredMultiLightProgram.uniform4fv("light_col", count, (GLfloat*) col);
- gDeferredMultiLightProgram.uniform1f("far_z", far_z);
+ gDeferredMultiLightProgram.uniform1i(LLShaderMgr::MULTI_LIGHT_COUNT, count);
+ gDeferredMultiLightProgram.uniform4fv(LLShaderMgr::MULTI_LIGHT, count, (GLfloat*) light);
+ gDeferredMultiLightProgram.uniform4fv(LLShaderMgr::MULTI_LIGHT_COL, count, (GLfloat*) col);
+ gDeferredMultiLightProgram.uniform1f(LLShaderMgr::MULTI_LIGHT_FAR_Z, far_z);
far_z = 0.f;
- count = 0;
- glDrawArrays(GL_TRIANGLE_STRIP, 0, 3);
+ count = 0;
+ mDeferredVB->drawArrays(LLRender::TRIANGLES, 0, 3);
}
}
@@ -6702,7 +7690,9 @@ void LLPipeline::renderDeferredLighting()
bindDeferredShader(gDeferredMultiSpotLightProgram);
- gDeferredMultiSpotLightProgram.enableTexture(LLViewerShaderMgr::DEFERRED_PROJECTION);
+ gDeferredMultiSpotLightProgram.enableTexture(LLShaderMgr::DEFERRED_PROJECTION);
+
+ mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
for (LLDrawable::drawable_list_t::iterator iter = fullscreen_spot_lights.begin(); iter != fullscreen_spot_lights.end(); ++iter)
{
@@ -6723,64 +7713,24 @@ void LLPipeline::renderDeferredLighting()
setupSpotLight(gDeferredMultiSpotLightProgram, drawablep);
LLColor3 col = volume->getLightColor();
- col *= volume->getLightIntensity();
-
- glTexCoord4f(tc.v[0], tc.v[1], tc.v[2], s*s);
- glColor4f(col.mV[0], col.mV[1], col.mV[2], volume->getLightFalloff()*0.5f);
- glDrawArrays(GL_TRIANGLE_STRIP, 0, 3);
+
+ gDeferredMultiSpotLightProgram.uniform3fv(LLShaderMgr::LIGHT_CENTER, 1, tc.v);
+ gDeferredMultiSpotLightProgram.uniform1f(LLShaderMgr::LIGHT_SIZE, s*s);
+ gDeferredMultiSpotLightProgram.uniform3fv(LLShaderMgr::DIFFUSE_COLOR, 1, col.mV);
+ gDeferredMultiSpotLightProgram.uniform1f(LLShaderMgr::LIGHT_FALLOFF, volume->getLightFalloff()*0.5f);
+ mDeferredVB->drawArrays(LLRender::TRIANGLES, 0, 3);
}
- gDeferredMultiSpotLightProgram.disableTexture(LLViewerShaderMgr::DEFERRED_PROJECTION);
+ gDeferredMultiSpotLightProgram.disableTexture(LLShaderMgr::DEFERRED_PROJECTION);
unbindDeferredShader(gDeferredMultiSpotLightProgram);
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW);
- glPopMatrix();
+ gGL.popMatrix();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.popMatrix();
}
}
gGL.setColorMask(true, true);
-
- if (LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_DEFERRED) > 2)
- {
- mDeferredLight[2].flush();
-
- mScreen.bindTarget();
- mScreen.clear(GL_COLOR_BUFFER_BIT);
-
- gGL.setSceneBlendType(LLRender::BT_ALPHA);
-
- { //mix various light maps (local, sun, gi)
- LLFastTimer ftm(FTM_POST);
- LLGLDisable blend(GL_BLEND);
- LLGLDisable test(GL_ALPHA_TEST);
- LLGLDepthTest depth(GL_FALSE);
- LLGLDisable stencil(GL_STENCIL_TEST);
-
- bindDeferredShader(gDeferredPostProgram, 0, &mGIMapPost[0]);
-
- gDeferredPostProgram.bind();
-
- LLVertexBuffer::unbind();
-
- glVertexPointer(2, GL_FLOAT, 0, vert);
- glColor3f(1,1,1);
-
- glPushMatrix();
- glLoadIdentity();
- glMatrixMode(GL_PROJECTION);
- glPushMatrix();
- glLoadIdentity();
-
- glDrawArrays(GL_TRIANGLES, 0, 3);
-
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW);
- glPopMatrix();
-
- unbindDeferredShader(gDeferredPostProgram);
- }
- }
}
{ //render non-deferred geometry (alpha, fullbright, glow)
@@ -6826,7 +7776,6 @@ void LLPipeline::renderDeferredLighting()
{
// Render debugging beacons.
gObjectList.renderObjectBeacons();
- LLHUDObject::renderAll();
gObjectList.resetObjectBeacons();
}
}
@@ -6897,13 +7846,13 @@ void LLPipeline::setupSpotLight(LLGLSLShader& shader, LLDrawable* drawablep)
F32 proj_range = far_clip - near_clip;
glh::matrix4f light_proj = gl_perspective(fovy, aspect, near_clip, far_clip);
screen_to_light = trans * light_proj * screen_to_light;
- shader.uniformMatrix4fv("proj_mat", 1, FALSE, screen_to_light.m);
- shader.uniform1f("proj_near", near_clip);
- shader.uniform3fv("proj_p", 1, p1.v);
- shader.uniform3fv("proj_n", 1, n.v);
- shader.uniform3fv("proj_origin", 1, screen_origin.v);
- shader.uniform1f("proj_range", proj_range);
- shader.uniform1f("proj_ambiance", params.mV[2]);
+ shader.uniformMatrix4fv(LLShaderMgr::PROJECTOR_MATRIX, 1, FALSE, screen_to_light.m);
+ shader.uniform1f(LLShaderMgr::PROJECTOR_NEAR, near_clip);
+ shader.uniform3fv(LLShaderMgr::PROJECTOR_P, 1, p1.v);
+ shader.uniform3fv(LLShaderMgr::PROJECTOR_N, 1, n.v);
+ shader.uniform3fv(LLShaderMgr::PROJECTOR_ORIGIN, 1, screen_origin.v);
+ shader.uniform1f(LLShaderMgr::PROJECTOR_RANGE, proj_range);
+ shader.uniform1f(LLShaderMgr::PROJECTOR_AMBIANCE, params.mV[2]);
S32 s_idx = -1;
for (U32 i = 0; i < 2; i++)
@@ -6914,15 +7863,15 @@ void LLPipeline::setupSpotLight(LLGLSLShader& shader, LLDrawable* drawablep)
}
}
- shader.uniform1i("proj_shadow_idx", s_idx);
+ shader.uniform1i(LLShaderMgr::PROJECTOR_SHADOW_INDEX, s_idx);
if (s_idx >= 0)
{
- shader.uniform1f("shadow_fade", 1.f-mSpotLightFade[s_idx]);
+ shader.uniform1f(LLShaderMgr::PROJECTOR_SHADOW_FADE, 1.f-mSpotLightFade[s_idx]);
}
else
{
- shader.uniform1f("shadow_fade", 1.f);
+ shader.uniform1f(LLShaderMgr::PROJECTOR_SHADOW_FADE, 1.f);
}
{
@@ -6951,51 +7900,43 @@ void LLPipeline::setupSpotLight(LLGLSLShader& shader, LLDrawable* drawablep)
LLViewerTexture* img = volume->getLightTexture();
- S32 channel = shader.enableTexture(LLViewerShaderMgr::DEFERRED_PROJECTION);
+ if (img == NULL)
+ {
+ img = LLViewerFetchedTexture::sWhiteImagep;
+ }
+
+ S32 channel = shader.enableTexture(LLShaderMgr::DEFERRED_PROJECTION);
- if (channel > -1 && img)
+ if (channel > -1)
{
- gGL.getTexUnit(channel)->bind(img);
+ if (img)
+ {
+ gGL.getTexUnit(channel)->bind(img);
- F32 lod_range = logf(img->getWidth())/logf(2.f);
+ F32 lod_range = logf(img->getWidth())/logf(2.f);
- shader.uniform1f("proj_focus", focus);
- shader.uniform1f("proj_lod", lod_range);
- shader.uniform1f("proj_ambient_lod", llclamp((proj_range-focus)/proj_range*lod_range, 0.f, 1.f));
+ shader.uniform1f(LLShaderMgr::PROJECTOR_FOCUS, focus);
+ shader.uniform1f(LLShaderMgr::PROJECTOR_LOD, lod_range);
+ shader.uniform1f(LLShaderMgr::PROJECTOR_AMBIENT_LOD, llclamp((proj_range-focus)/proj_range*lod_range, 0.f, 1.f));
+ }
}
+
}
void LLPipeline::unbindDeferredShader(LLGLSLShader &shader)
{
stop_glerror();
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_POSITION, LLTexUnit::TT_RECT_TEXTURE);
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_NORMAL, LLTexUnit::TT_RECT_TEXTURE);
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_DIFFUSE, LLTexUnit::TT_RECT_TEXTURE);
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_SPECULAR, LLTexUnit::TT_RECT_TEXTURE);
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_DEPTH, LLTexUnit::TT_RECT_TEXTURE);
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_LIGHT, LLTexUnit::TT_RECT_TEXTURE);
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_GI_LIGHT, LLTexUnit::TT_RECT_TEXTURE);
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_EDGE, LLTexUnit::TT_RECT_TEXTURE);
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_SUN_LIGHT, LLTexUnit::TT_RECT_TEXTURE);
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_LOCAL_LIGHT, LLTexUnit::TT_RECT_TEXTURE);
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_LUMINANCE);
- shader.disableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_GI_MIP);
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_BLOOM);
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_GI_NORMAL);
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_GI_DIFFUSE);
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_GI_SPECULAR);
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_GI_DEPTH);
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_GI_MIN_POS);
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_GI_MAX_POS);
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_GI_LAST_NORMAL);
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_GI_LAST_DIFFUSE);
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_GI_LAST_MIN_POS);
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_GI_LAST_MAX_POS);
+ shader.disableTexture(LLShaderMgr::DEFERRED_NORMAL, mDeferredScreen.getUsage());
+ shader.disableTexture(LLShaderMgr::DEFERRED_DIFFUSE, mDeferredScreen.getUsage());
+ shader.disableTexture(LLShaderMgr::DEFERRED_SPECULAR, mDeferredScreen.getUsage());
+ shader.disableTexture(LLShaderMgr::DEFERRED_DEPTH, mDeferredScreen.getUsage());
+ shader.disableTexture(LLShaderMgr::DEFERRED_LIGHT, mDeferredLight.getUsage());
+ shader.disableTexture(LLShaderMgr::DIFFUSE_MAP);
+ shader.disableTexture(LLShaderMgr::DEFERRED_BLOOM);
for (U32 i = 0; i < 4; i++)
{
- if (shader.disableTexture(LLViewerShaderMgr::DEFERRED_SHADOW0+i, LLTexUnit::TT_RECT_TEXTURE) > -1)
+ if (shader.disableTexture(LLShaderMgr::DEFERRED_SHADOW0+i, LLTexUnit::TT_RECT_TEXTURE) > -1)
{
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_COMPARE_MODE_ARB, GL_NONE);
}
@@ -7003,16 +7944,16 @@ void LLPipeline::unbindDeferredShader(LLGLSLShader &shader)
for (U32 i = 4; i < 6; i++)
{
- if (shader.disableTexture(LLViewerShaderMgr::DEFERRED_SHADOW0+i) > -1)
+ if (shader.disableTexture(LLShaderMgr::DEFERRED_SHADOW0+i) > -1)
{
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE_ARB, GL_NONE);
}
}
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_NOISE);
- shader.disableTexture(LLViewerShaderMgr::DEFERRED_LIGHTFUNC);
+ shader.disableTexture(LLShaderMgr::DEFERRED_NOISE);
+ shader.disableTexture(LLShaderMgr::DEFERRED_LIGHTFUNC);
- S32 channel = shader.disableTexture(LLViewerShaderMgr::ENVIRONMENT_MAP, LLTexUnit::TT_CUBE_MAP);
+ S32 channel = shader.disableTexture(LLShaderMgr::ENVIRONMENT_MAP, LLTexUnit::TT_CUBE_MAP);
if (channel > -1)
{
LLCubeMap* cube_map = gSky.mVOSkyp ? gSky.mVOSkyp->getCubeMap() : NULL;
@@ -7024,8 +7965,6 @@ void LLPipeline::unbindDeferredShader(LLGLSLShader &shader)
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
gGL.getTexUnit(0)->activate();
shader.unbind();
-
- LLGLState::checkTextureChannels();
}
inline float sgn(float a)
@@ -7040,11 +7979,11 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
if (LLPipeline::sWaterReflections && assertInitialized() && LLDrawPoolWater::sNeedsReflectionUpdate)
{
BOOL skip_avatar_update = FALSE;
- if (!isAgentAvatarValid() || gAgentCamera.getCameraAnimating() || gAgentCamera.getCameraMode() != CAMERA_MODE_MOUSELOOK)
+ if (!isAgentAvatarValid() || gAgentCamera.getCameraAnimating() || gAgentCamera.getCameraMode() != CAMERA_MODE_MOUSELOOK || !LLVOAvatar::sVisibleInFirstPerson)
{
skip_avatar_update = TRUE;
}
-
+
if (!skip_avatar_update)
{
gAgentAvatarp->updateAttachmentVisibility(CAMERA_MODE_THIRD_PERSON);
@@ -7058,11 +7997,6 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
LLCamera camera = camera_in;
camera.setFar(camera.getFar()*0.87654321f);
LLPipeline::sReflectionRender = TRUE;
- S32 occlusion = LLPipeline::sUseOcclusion;
-
- LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_WORLD;
-
- LLPipeline::sUseOcclusion = llmin(occlusion, 1);
gPipeline.pushRenderTypeMask();
@@ -7098,28 +8032,33 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
if (!LLViewerCamera::getInstance()->cameraUnderWater())
{ //generate planar reflection map
+
+ //disable occlusion culling for reflection map for now
+ S32 occlusion = LLPipeline::sUseOcclusion;
+ LLPipeline::sUseOcclusion = 0;
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
glClearColor(0,0,0,0);
mWaterRef.bindTarget();
+ LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_WATER0;
gGL.setColorMask(true, true);
mWaterRef.clear();
gGL.setColorMask(true, false);
mWaterRef.getViewport(gGLViewport);
-
+
stop_glerror();
- glPushMatrix();
+ gGL.pushMatrix();
mat.set_scale(glh::vec3f(1,1,-1));
mat.set_translate(glh::vec3f(0,0,height*2.f));
-
+
glh::matrix4f current = glh_get_current_modelview();
mat = current * mat;
glh_set_current_modelview(mat);
- glLoadMatrixf(mat.m);
+ gGL.loadMatrix(mat.m);
LLViewerCamera::updateFrustumPlanes(camera, FALSE, TRUE);
@@ -7133,47 +8072,46 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
glCullFace(GL_FRONT);
static LLCullResult ref_result;
-
- if (LLDrawPoolWater::sNeedsDistortionUpdate)
+
+ if (LLDrawPoolWater::sNeedsReflectionUpdate)
{
//initial sky pass (no user clip plane)
{ //mask out everything but the sky
gPipeline.pushRenderTypeMask();
gPipeline.andRenderTypeMask(LLPipeline::RENDER_TYPE_SKY,
- LLPipeline::RENDER_TYPE_WL_SKY,
- LLPipeline::END_RENDER_TYPES);
+ LLPipeline::RENDER_TYPE_WL_SKY,
+ LLPipeline::RENDER_TYPE_CLOUDS,
+ LLPipeline::END_RENDER_TYPES);
+
static LLCullResult result;
updateCull(camera, result);
stateSort(camera, result);
- andRenderTypeMask(LLPipeline::RENDER_TYPE_SKY,
- LLPipeline::RENDER_TYPE_CLOUDS,
- LLPipeline::RENDER_TYPE_WL_SKY,
- LLPipeline::END_RENDER_TYPES);
renderGeom(camera, TRUE);
+
gPipeline.popRenderTypeMask();
}
gPipeline.pushRenderTypeMask();
clearRenderTypeMask(LLPipeline::RENDER_TYPE_WATER,
- LLPipeline::RENDER_TYPE_VOIDWATER,
- LLPipeline::RENDER_TYPE_GROUND,
- LLPipeline::RENDER_TYPE_SKY,
- LLPipeline::RENDER_TYPE_CLOUDS,
- LLPipeline::END_RENDER_TYPES);
+ LLPipeline::RENDER_TYPE_VOIDWATER,
+ LLPipeline::RENDER_TYPE_GROUND,
+ LLPipeline::RENDER_TYPE_SKY,
+ LLPipeline::RENDER_TYPE_CLOUDS,
+ LLPipeline::END_RENDER_TYPES);
- S32 detail = gSavedSettings.getS32("RenderReflectionDetail");
+ S32 detail = RenderReflectionDetail;
if (detail > 0)
{ //mask out selected geometry based on reflection detail
if (detail < 4)
{
clearRenderTypeMask(LLPipeline::RENDER_TYPE_PARTICLES, END_RENDER_TYPES);
- if (detail < 3)
- {
- clearRenderTypeMask(LLPipeline::RENDER_TYPE_AVATAR, END_RENDER_TYPES);
- if (detail < 2)
+ if (detail < 3)
{
+ clearRenderTypeMask(LLPipeline::RENDER_TYPE_AVATAR, END_RENDER_TYPES);
+ if (detail < 2)
+ {
clearRenderTypeMask(LLPipeline::RENDER_TYPE_VOLUME, END_RENDER_TYPES);
}
}
@@ -7181,26 +8119,27 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
LLGLUserClipPlane clip_plane(plane, mat, projection);
LLGLDisable cull(GL_CULL_FACE);
- updateCull(camera, ref_result, 1);
+ updateCull(camera, ref_result, -water_clip, &plane);
stateSort(camera, ref_result);
- }
-
- if (LLDrawPoolWater::sNeedsDistortionUpdate)
- {
- if (gSavedSettings.getS32("RenderReflectionDetail") > 0)
+ }
+
+ if (LLDrawPoolWater::sNeedsDistortionUpdate)
{
- gPipeline.grabReferences(ref_result);
- LLGLUserClipPlane clip_plane(plane, mat, projection);
- renderGeom(camera);
- }
- }
+ if (RenderReflectionDetail > 0)
+ {
+ gPipeline.grabReferences(ref_result);
+ LLGLUserClipPlane clip_plane(plane, mat, projection);
+ renderGeom(camera);
+ }
+ }
gPipeline.popRenderTypeMask();
}
glCullFace(GL_BACK);
- glPopMatrix();
+ gGL.popMatrix();
mWaterRef.flush();
glh_set_current_modelview(current);
+ LLPipeline::sUseOcclusion = occlusion;
}
camera.setOrigin(camera_in.getOrigin());
@@ -7231,15 +8170,18 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
LLColor4& col = LLDrawPoolWater::sWaterFogColor;
glClearColor(col.mV[0], col.mV[1], col.mV[2], 0.f);
mWaterDis.bindTarget();
+ LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_WATER1;
mWaterDis.getViewport(gGLViewport);
if (!LLPipeline::sUnderWaterRender || LLDrawPoolWater::sNeedsReflectionUpdate)
{
//clip out geometry on the same side of water as the camera
mat = glh_get_current_modelview();
- LLGLUserClipPlane clip_plane(LLPlane(-pnorm, -(pd+pad)), mat, projection);
+ LLPlane plane(-pnorm, -(pd+pad));
+
+ LLGLUserClipPlane clip_plane(plane, mat, projection);
static LLCullResult result;
- updateCull(camera, result, water_clip);
+ updateCull(camera, result, water_clip, &plane);
stateSort(camera, result);
gGL.setColorMask(true, true);
@@ -7267,17 +8209,17 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
gPipeline.popRenderTypeMask();
LLDrawPoolWater::sNeedsReflectionUpdate = FALSE;
LLDrawPoolWater::sNeedsDistortionUpdate = FALSE;
- LLViewerCamera::getInstance()->setUserClipPlane(LLPlane(-pnorm, -pd));
- LLPipeline::sUseOcclusion = occlusion;
+ LLPlane npnorm(-pnorm, -pd);
+ LLViewerCamera::getInstance()->setUserClipPlane(npnorm);
LLGLState::checkStates();
- LLGLState::checkTextureChannels();
- LLGLState::checkClientArrays();
if (!skip_avatar_update)
{
gAgentAvatarp->updateAttachmentVisibility(gAgentCamera.getCameraMode());
}
+
+ LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_WORLD;
}
}
@@ -7363,7 +8305,14 @@ void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera
}
LLPipeline::sShadowRender = TRUE;
- U32 types[] = { LLRenderPass::PASS_SIMPLE, LLRenderPass::PASS_FULLBRIGHT, LLRenderPass::PASS_SHINY, LLRenderPass::PASS_BUMP, LLRenderPass::PASS_FULLBRIGHT_SHINY };
+ U32 types[] = {
+ LLRenderPass::PASS_SIMPLE,
+ LLRenderPass::PASS_FULLBRIGHT,
+ LLRenderPass::PASS_SHINY,
+ LLRenderPass::PASS_BUMP,
+ LLRenderPass::PASS_FULLBRIGHT_SHINY
+ };
+
LLGLEnable cull(GL_CULL_FACE);
if (use_shader)
@@ -7375,40 +8324,49 @@ void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera
stateSort(shadow_cam, result);
//generate shadow map
- glMatrixMode(GL_PROJECTION);
- glPushMatrix();
- glLoadMatrixf(proj.m);
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
- glLoadMatrixf(view.m);
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.pushMatrix();
+ gGL.loadMatrix(proj.m);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.pushMatrix();
+ gGL.loadMatrix(gGLModelView);
stop_glerror();
gGLLastMatrix = NULL;
{
- LLGLDepthTest depth(GL_TRUE);
- glClear(GL_DEPTH_BUFFER_BIT);
+ //LLGLDepthTest depth(GL_TRUE);
+ //glClear(GL_DEPTH_BUFFER_BIT);
}
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
-
- glColor4f(1,1,1,1);
stop_glerror();
-
- gGL.setColorMask(false, false);
//glCullFace(GL_FRONT);
+ LLVertexBuffer::unbind();
+
{
+ if (!use_shader)
+ { //occlusion program is general purpose depth-only no-textures
+ gOcclusionProgram.bind();
+ }
+
+ gGL.diffuseColor4f(1,1,1,1);
+ gGL.setColorMask(false, false);
+
LLFastTimer ftm(FTM_SHADOW_SIMPLE);
- LLGLDisable test(GL_ALPHA_TEST);
gGL.getTexUnit(0)->disable();
for (U32 i = 0; i < sizeof(types)/sizeof(U32); ++i)
{
renderObjects(types[i], LLVertexBuffer::MAP_VERTEX, FALSE);
}
gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);
+ if (!use_shader)
+ {
+ gOcclusionProgram.unbind();
+ }
}
if (use_shader)
@@ -7424,18 +8382,27 @@ void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera
{
LLFastTimer ftm(FTM_SHADOW_ALPHA);
- LLGLEnable test(GL_ALPHA_TEST);
- gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.6f);
- renderObjects(LLRenderPass::PASS_ALPHA_SHADOW, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_COLOR, TRUE);
- glColor4f(1,1,1,1);
+ gDeferredShadowAlphaMaskProgram.bind();
+ gDeferredShadowAlphaMaskProgram.setMinimumAlpha(0.598f);
+
+ U32 mask = LLVertexBuffer::MAP_VERTEX |
+ LLVertexBuffer::MAP_TEXCOORD0 |
+ LLVertexBuffer::MAP_COLOR |
+ LLVertexBuffer::MAP_TEXTURE_INDEX;
+
+ renderObjects(LLRenderPass::PASS_ALPHA_MASK, mask, TRUE, TRUE);
+ renderObjects(LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK, mask, TRUE, TRUE);
+ renderObjects(LLRenderPass::PASS_ALPHA, mask, TRUE, TRUE);
+ gDeferredTreeShadowProgram.bind();
+ gDeferredTreeShadowProgram.setMinimumAlpha(0.598f);
renderObjects(LLRenderPass::PASS_GRASS, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, TRUE);
- gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
}
//glCullFace(GL_BACK);
+ gDeferredShadowProgram.bind();
gGLLastMatrix = NULL;
- glLoadMatrixd(gGLModelView);
+ gGL.loadMatrix(gGLModelView);
doOcclusion(shadow_cam);
if (use_shader)
@@ -7445,10 +8412,10 @@ void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera
gGL.setColorMask(true, true);
- glMatrixMode(GL_PROJECTION);
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW);
- glPopMatrix();
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.popMatrix();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.popMatrix();
gGLLastMatrix = NULL;
LLPipeline::sUseOcclusion = occlude;
@@ -7467,14 +8434,13 @@ BOOL LLPipeline::getVisiblePointCloud(LLCamera& camera, LLVector3& min, LLVector
}
//get set of planes on bounding box
- std::vector<LLPlane> bp;
-
- bp.push_back(LLPlane(min, LLVector3(-1,0,0)));
- bp.push_back(LLPlane(min, LLVector3(0,-1,0)));
- bp.push_back(LLPlane(min, LLVector3(0,0,-1)));
- bp.push_back(LLPlane(max, LLVector3(1,0,0)));
- bp.push_back(LLPlane(max, LLVector3(0,1,0)));
- bp.push_back(LLPlane(max, LLVector3(0,0,1)));
+ LLPlane bp[] = {
+ LLPlane(min, LLVector3(-1,0,0)),
+ LLPlane(min, LLVector3(0,-1,0)),
+ LLPlane(min, LLVector3(0,0,-1)),
+ LLPlane(max, LLVector3(1,0,0)),
+ LLPlane(max, LLVector3(0,1,0)),
+ LLPlane(max, LLVector3(0,0,1))};
//potential points
std::vector<LLVector3> pp;
@@ -7522,7 +8488,8 @@ BOOL LLPipeline::getVisiblePointCloud(LLCamera& camera, LLVector3& min, LLVector
const LLPlane& cp = camera.getAgentPlane(j);
const LLVector3& v1 = pp[bs[i*2+0]];
const LLVector3& v2 = pp[bs[i*2+1]];
- const LLVector3 n(cp.mV);
+ LLVector3 n;
+ cp.getVector3(n);
LLVector3 line = v1-v2;
@@ -7536,8 +8503,8 @@ BOOL LLPipeline::getVisiblePointCloud(LLCamera& camera, LLVector3& min, LLVector
LLVector3 intersect = v2+line*t;
pp.push_back(intersect);
}
- }
}
+ }
//camera frustum line segments
const U32 fs[] =
@@ -7545,7 +8512,7 @@ BOOL LLPipeline::getVisiblePointCloud(LLCamera& camera, LLVector3& min, LLVector
0,1,
1,2,
2,3,
- 3,1,
+ 3,0,
4,5,
5,6,
@@ -7568,7 +8535,8 @@ BOOL LLPipeline::getVisiblePointCloud(LLCamera& camera, LLVector3& min, LLVector
const LLVector3& v1 = pp[fs[i*2+0]+8];
const LLVector3& v2 = pp[fs[i*2+1]+8];
const LLPlane& cp = bp[j];
- const LLVector3 n(cp.mV);
+ LLVector3 n;
+ cp.getVector3(n);
LLVector3 line = v1-v2;
@@ -7583,7 +8551,7 @@ BOOL LLPipeline::getVisiblePointCloud(LLCamera& camera, LLVector3& min, LLVector
pp.push_back(intersect);
}
}
- }
+ }
LLVector3 ext[] = { min-LLVector3(0.05f,0.05f,0.05f),
max+LLVector3(0.05f,0.05f,0.05f) };
@@ -7629,184 +8597,6 @@ BOOL LLPipeline::getVisiblePointCloud(LLCamera& camera, LLVector3& min, LLVector
return TRUE;
}
-void LLPipeline::generateGI(LLCamera& camera, LLVector3& lightDir, std::vector<LLVector3>& vpc)
-{
- if (LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_DEFERRED) < 3)
- {
- return;
- }
-
- LLVector3 up;
-
- //LLGLEnable depth_clamp(GL_DEPTH_CLAMP_NV);
-
- if (lightDir.mV[2] > 0.5f)
- {
- up = LLVector3(1,0,0);
- }
- else
- {
- up = LLVector3(0, 0, 1);
- }
-
-
- F32 gi_range = gSavedSettings.getF32("RenderGIRange");
-
- U32 res = mGIMap.getWidth();
-
- F32 atten = llmax(gSavedSettings.getF32("RenderGIAttenuation"), 0.001f);
-
- //set radius to range at which distance attenuation of incoming photons is near 0
-
- F32 lrad = sqrtf(1.f/(atten*0.01f));
-
- F32 lrange = lrad+gi_range*0.5f;
-
- LLVector3 pad(lrange,lrange,lrange);
-
- glh::matrix4f view = look(LLVector3(128.f,128.f,128.f), lightDir, up);
-
- LLVector3 cp = camera.getOrigin()+camera.getAtAxis()*(gi_range*0.5f);
-
- glh::vec3f scp(cp.mV);
- view.mult_matrix_vec(scp);
- cp.setVec(scp.v);
-
- F32 pix_width = lrange/(res*0.5f);
-
- //move cp to the nearest pix_width
- for (U32 i = 0; i < 3; i++)
- {
- cp.mV[i] = llround(cp.mV[i], pix_width);
- }
-
- LLVector3 min = cp-pad;
- LLVector3 max = cp+pad;
-
- //set mGIRange to range in tc space[0,1] that covers texture block of intersecting lights around a point
- mGIRange.mV[0] = (max.mV[0]-min.mV[0])/res;
- mGIRange.mV[1] = (max.mV[1]-min.mV[1])/res;
- mGILightRadius = lrad/lrange*0.5f;
-
- glh::matrix4f proj = gl_ortho(min.mV[0], max.mV[0],
- min.mV[1], max.mV[1],
- -max.mV[2], -min.mV[2]);
-
- LLCamera sun_cam = camera;
-
- glh::matrix4f eye_view = glh_get_current_modelview();
-
- //get eye space to camera space matrix
- mGIMatrix = view*eye_view.inverse();
- mGINormalMatrix = mGIMatrix.inverse().transpose();
- mGIInvProj = proj.inverse();
- mGIMatrixProj = proj*mGIMatrix;
-
- //translate and scale to [0,1]
- glh::matrix4f trans(.5f, 0.f, 0.f, .5f,
- 0.f, 0.5f, 0.f, 0.5f,
- 0.f, 0.f, 0.5f, 0.5f,
- 0.f, 0.f, 0.f, 1.f);
-
- mGIMatrixProj = trans*mGIMatrixProj;
-
- glh_set_current_modelview(view);
- glh_set_current_projection(proj);
-
- LLViewerCamera::updateFrustumPlanes(sun_cam, TRUE, FALSE, TRUE);
-
- sun_cam.ignoreAgentFrustumPlane(LLCamera::AGENT_PLANE_NEAR);
- static LLCullResult result;
-
- pushRenderTypeMask();
-
- andRenderTypeMask(LLPipeline::RENDER_TYPE_SIMPLE,
- LLPipeline::RENDER_TYPE_FULLBRIGHT,
- LLPipeline::RENDER_TYPE_BUMP,
- LLPipeline::RENDER_TYPE_VOLUME,
- LLPipeline::RENDER_TYPE_TREE,
- LLPipeline::RENDER_TYPE_TERRAIN,
- LLPipeline::RENDER_TYPE_WATER,
- LLPipeline::RENDER_TYPE_VOIDWATER,
- LLPipeline::RENDER_TYPE_PASS_ALPHA_SHADOW,
- LLPipeline::RENDER_TYPE_AVATAR,
- LLPipeline::RENDER_TYPE_PASS_SIMPLE,
- LLPipeline::RENDER_TYPE_PASS_BUMP,
- LLPipeline::RENDER_TYPE_PASS_FULLBRIGHT,
- LLPipeline::RENDER_TYPE_PASS_SHINY,
- END_RENDER_TYPES);
-
-
-
- S32 occlude = LLPipeline::sUseOcclusion;
- //LLPipeline::sUseOcclusion = 0;
- LLPipeline::sShadowRender = TRUE;
-
- //only render large objects into GI map
- sMinRenderSize = gSavedSettings.getF32("RenderGIMinRenderSize");
-
- LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_GI_SOURCE;
- mGIMap.bindTarget();
-
- F64 last_modelview[16];
- F64 last_projection[16];
- for (U32 i = 0; i < 16; i++)
- {
- last_modelview[i] = gGLLastModelView[i];
- last_projection[i] = gGLLastProjection[i];
- gGLLastModelView[i] = mGIModelview.m[i];
- gGLLastProjection[i] = mGIProjection.m[i];
- }
-
- sun_cam.setOrigin(0.f, 0.f, 0.f);
- updateCull(sun_cam, result);
- stateSort(sun_cam, result);
-
- for (U32 i = 0; i < 16; i++)
- {
- gGLLastModelView[i] = last_modelview[i];
- gGLLastProjection[i] = last_projection[i];
- }
-
- mGIProjection = proj;
- mGIModelview = view;
-
- LLGLEnable cull(GL_CULL_FACE);
-
- //generate GI map
- glMatrixMode(GL_PROJECTION);
- glPushMatrix();
- glLoadMatrixf(proj.m);
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
- glLoadMatrixf(view.m);
-
- stop_glerror();
- gGLLastMatrix = NULL;
-
- mGIMap.clear();
-
- {
- //LLGLEnable enable(GL_DEPTH_CLAMP_NV);
- renderGeomDeferred(camera);
- }
-
- mGIMap.flush();
-
- glMatrixMode(GL_PROJECTION);
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW);
- glPopMatrix();
- gGLLastMatrix = NULL;
-
- LLPipeline::sUseOcclusion = occlude;
- LLPipeline::sShadowRender = FALSE;
- sMinRenderSize = 0.f;
-
- popRenderTypeMask();
-
-}
-
void LLPipeline::renderHighlight(const LLViewerObject* obj, F32 fade)
{
if (obj && obj->getVolume())
@@ -7841,7 +8631,7 @@ void LLPipeline::generateHighlight(LLCamera& camera)
if (!mHighlightSet.empty())
{
- F32 transition = gFrameIntervalSeconds/gSavedSettings.getF32("RenderHighlightFadeTime");
+ F32 transition = gFrameIntervalSeconds/RenderHighlightFadeTime;
LLGLDisable test(GL_ALPHA_TEST);
LLGLDepthTest depth(GL_FALSE);
@@ -7887,11 +8677,23 @@ void LLPipeline::generateHighlight(LLCamera& camera)
void LLPipeline::generateSunShadow(LLCamera& camera)
{
- if (!sRenderDeferred || gSavedSettings.getS32("RenderShadowDetail") <= 0)
+ if (!sRenderDeferred || RenderShadowDetail <= 0)
{
return;
}
+ BOOL skip_avatar_update = FALSE;
+ if (!isAgentAvatarValid() || gAgentCamera.getCameraAnimating() || gAgentCamera.getCameraMode() != CAMERA_MODE_MOUSELOOK || !LLVOAvatar::sVisibleInFirstPerson)
+ {
+
+ skip_avatar_update = TRUE;
+ }
+
+ if (!skip_avatar_update)
+ {
+ gAgentAvatarp->updateAttachmentVisibility(CAMERA_MODE_THIRD_PERSON);
+ }
+
F64 last_modelview[16];
F64 last_projection[16];
for (U32 i = 0; i < 16; i++)
@@ -7912,7 +8714,10 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
LLPipeline::RENDER_TYPE_TERRAIN,
LLPipeline::RENDER_TYPE_WATER,
LLPipeline::RENDER_TYPE_VOIDWATER,
- LLPipeline::RENDER_TYPE_PASS_ALPHA_SHADOW,
+ LLPipeline::RENDER_TYPE_PASS_ALPHA,
+ LLPipeline::RENDER_TYPE_PASS_ALPHA_MASK,
+ LLPipeline::RENDER_TYPE_PASS_FULLBRIGHT_ALPHA_MASK,
+ LLPipeline::RENDER_TYPE_PASS_GRASS,
LLPipeline::RENDER_TYPE_PASS_SIMPLE,
LLPipeline::RENDER_TYPE_PASS_BUMP,
LLPipeline::RENDER_TYPE_PASS_FULLBRIGHT,
@@ -7933,20 +8738,28 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
glh::matrix4f proj[6];
//clip contains parallel split distances for 3 splits
- LLVector3 clip = gSavedSettings.getVector3("RenderShadowClipPlanes");
+ LLVector3 clip = RenderShadowClipPlanes;
//F32 slope_threshold = gSavedSettings.getF32("RenderShadowSlopeThreshold");
//far clip on last split is minimum of camera view distance and 128
mSunClipPlanes = LLVector4(clip, clip.mV[2] * clip.mV[2]/clip.mV[1]);
- clip = gSavedSettings.getVector3("RenderShadowOrthoClipPlanes");
+ clip = RenderShadowOrthoClipPlanes;
mSunOrthoClipPlanes = LLVector4(clip, clip.mV[2]*clip.mV[2]/clip.mV[1]);
//currently used for amount to extrude frusta corners for constructing shadow frusta
- LLVector3 n = gSavedSettings.getVector3("RenderShadowNearDist");
+ LLVector3 n = RenderShadowNearDist;
//F32 nearDist[] = { n.mV[0], n.mV[1], n.mV[2], n.mV[2] };
+ //put together a universal "near clip" plane for shadow frusta
+ LLPlane shadow_near_clip;
+ {
+ LLVector3 p = gAgent.getPositionAgent();
+ p += mSunDir * RenderFarClip*2.f;
+ shadow_near_clip.setVec(p, mSunDir);
+ }
+
LLVector3 lightDir = -mSunDir;
lightDir.normVec();
@@ -7996,11 +8809,15 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
mShadowFrustPoints[3].clear();
}
popRenderTypeMask();
+
+ if (!skip_avatar_update)
+ {
+ gAgentAvatarp->updateAttachmentVisibility(gAgentCamera.getCameraMode());
+ }
+
return;
}
- generateGI(camera, lightDir, fp);
-
//get good split distances for frustum
for (U32 i = 0; i < fp.size(); ++i)
{
@@ -8021,561 +8838,564 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
near_clip = -max.mV[2];
F32 far_clip = -min.mV[2]*2.f;
- far_clip = llmin(far_clip, 128.f);
+ //far_clip = llmin(far_clip, 128.f);
far_clip = llmin(far_clip, camera.getFar());
F32 range = far_clip-near_clip;
- LLVector3 split_exp = gSavedSettings.getVector3("RenderShadowSplitExponent");
+ LLVector3 split_exp = RenderShadowSplitExponent;
F32 da = 1.f-llmax( fabsf(lightDir*up), fabsf(lightDir*camera.getLeftAxis()) );
da = powf(da, split_exp.mV[2]);
-
F32 sxp = split_exp.mV[1] + (split_exp.mV[0]-split_exp.mV[1])*da;
-
-
+
for (U32 i = 0; i < 4; ++i)
{
F32 x = (F32)(i+1)/4.f;
x = powf(x, sxp);
mSunClipPlanes.mV[i] = near_clip+range*x;
}
+
+ mSunClipPlanes.mV[0] *= 1.25f; //bump back first split for transition padding
}
// convenience array of 4 near clip plane distances
F32 dist[] = { near_clip, mSunClipPlanes.mV[0], mSunClipPlanes.mV[1], mSunClipPlanes.mV[2], mSunClipPlanes.mV[3] };
- for (S32 j = 0; j < 4; j++)
- {
- if (!hasRenderDebugMask(RENDER_DEBUG_SHADOW_FRUSTA))
+
+ if (mSunDiffuse == LLColor4::black)
+ { //sun diffuse is totally black, shadows don't matter
+ LLGLDepthTest depth(GL_TRUE);
+
+ for (S32 j = 0; j < 4; j++)
{
- mShadowFrustPoints[j].clear();
+ mShadow[j].bindTarget();
+ mShadow[j].clear();
+ mShadow[j].flush();
}
+ }
+ else
+ {
+ for (S32 j = 0; j < 4; j++)
+ {
+ if (!hasRenderDebugMask(RENDER_DEBUG_SHADOW_FRUSTA))
+ {
+ mShadowFrustPoints[j].clear();
+ }
- LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_SHADOW0+j;
+ LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_SHADOW0+j;
- //restore render matrices
- glh_set_current_modelview(saved_view);
- glh_set_current_projection(saved_proj);
+ //restore render matrices
+ glh_set_current_modelview(saved_view);
+ glh_set_current_projection(saved_proj);
- LLVector3 eye = camera.getOrigin();
+ LLVector3 eye = camera.getOrigin();
- //camera used for shadow cull/render
- LLCamera shadow_cam;
+ //camera used for shadow cull/render
+ LLCamera shadow_cam;
- //create world space camera frustum for this split
- shadow_cam = camera;
- shadow_cam.setFar(16.f);
+ //create world space camera frustum for this split
+ shadow_cam = camera;
+ shadow_cam.setFar(16.f);
- LLViewerCamera::updateFrustumPlanes(shadow_cam, FALSE, FALSE, TRUE);
+ LLViewerCamera::updateFrustumPlanes(shadow_cam, FALSE, FALSE, TRUE);
- LLVector3* frust = shadow_cam.mAgentFrustum;
+ LLVector3* frust = shadow_cam.mAgentFrustum;
- LLVector3 pn = shadow_cam.getAtAxis();
+ LLVector3 pn = shadow_cam.getAtAxis();
- LLVector3 min, max;
+ LLVector3 min, max;
- //construct 8 corners of split frustum section
- for (U32 i = 0; i < 4; i++)
- {
- LLVector3 delta = frust[i+4]-eye;
- delta += (frust[i+4]-frust[(i+2)%4+4])*0.05f;
- delta.normVec();
- F32 dp = delta*pn;
- frust[i] = eye + (delta*dist[j]*0.95f)/dp;
- frust[i+4] = eye + (delta*dist[j+1]*1.05f)/dp;
- }
+ //construct 8 corners of split frustum section
+ for (U32 i = 0; i < 4; i++)
+ {
+ LLVector3 delta = frust[i+4]-eye;
+ delta += (frust[i+4]-frust[(i+2)%4+4])*0.05f;
+ delta.normVec();
+ F32 dp = delta*pn;
+ frust[i] = eye + (delta*dist[j]*0.75f)/dp;
+ frust[i+4] = eye + (delta*dist[j+1]*1.25f)/dp;
+ }
- shadow_cam.calcAgentFrustumPlanes(frust);
- shadow_cam.mFrustumCornerDist = 0.f;
+ shadow_cam.calcAgentFrustumPlanes(frust);
+ shadow_cam.mFrustumCornerDist = 0.f;
- if (!gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SHADOW_FRUSTA))
- {
- mShadowCamera[j] = shadow_cam;
- }
-
- std::vector<LLVector3> fp;
-
- if (!gPipeline.getVisiblePointCloud(shadow_cam, min, max, fp, lightDir))
- {
- //no possible shadow receivers
if (!gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SHADOW_FRUSTA))
{
- mShadowExtents[j][0] = LLVector3();
- mShadowExtents[j][1] = LLVector3();
- mShadowCamera[j+4] = shadow_cam;
+ mShadowCamera[j] = shadow_cam;
}
- mShadow[j].bindTarget();
- {
- LLGLDepthTest depth(GL_TRUE);
- mShadow[j].clear();
- }
- mShadow[j].flush();
+ std::vector<LLVector3> fp;
- mShadowError.mV[j] = 0.f;
- mShadowFOV.mV[j] = 0.f;
+ if (!gPipeline.getVisiblePointCloud(shadow_cam, min, max, fp, lightDir))
+ {
+ //no possible shadow receivers
+ if (!gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SHADOW_FRUSTA))
+ {
+ mShadowExtents[j][0] = LLVector3();
+ mShadowExtents[j][1] = LLVector3();
+ mShadowCamera[j+4] = shadow_cam;
+ }
- continue;
- }
+ mShadow[j].bindTarget();
+ {
+ LLGLDepthTest depth(GL_TRUE);
+ mShadow[j].clear();
+ }
+ mShadow[j].flush();
- if (!gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SHADOW_FRUSTA))
- {
- mShadowExtents[j][0] = min;
- mShadowExtents[j][1] = max;
- mShadowFrustPoints[j] = fp;
- }
-
+ mShadowError.mV[j] = 0.f;
+ mShadowFOV.mV[j] = 0.f;
- //find a good origin for shadow projection
- LLVector3 origin;
+ continue;
+ }
- //get a temporary view projection
- view[j] = look(camera.getOrigin(), lightDir, -up);
+ if (!gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SHADOW_FRUSTA))
+ {
+ mShadowExtents[j][0] = min;
+ mShadowExtents[j][1] = max;
+ mShadowFrustPoints[j] = fp;
+ }
+
- std::vector<LLVector3> wpf;
+ //find a good origin for shadow projection
+ LLVector3 origin;
- for (U32 i = 0; i < fp.size(); i++)
- {
- glh::vec3f p = glh::vec3f(fp[i].mV);
- view[j].mult_matrix_vec(p);
- wpf.push_back(LLVector3(p.v));
- }
+ //get a temporary view projection
+ view[j] = look(camera.getOrigin(), lightDir, -up);
- min = wpf[0];
- max = wpf[0];
+ std::vector<LLVector3> wpf;
- for (U32 i = 0; i < fp.size(); ++i)
- { //get AABB in camera space
- update_min_max(min, max, wpf[i]);
- }
-
- // Construct a perspective transform with perspective along y-axis that contains
- // points in wpf
- //Known:
- // - far clip plane
- // - near clip plane
- // - points in frustum
- //Find:
- // - origin
-
- //get some "interesting" points of reference
- LLVector3 center = (min+max)*0.5f;
- LLVector3 size = (max-min)*0.5f;
- LLVector3 near_center = center;
- near_center.mV[1] += size.mV[1]*2.f;
-
-
- //put all points in wpf in quadrant 0, reletive to center of min/max
- //get the best fit line using least squares
- F32 bfm = 0.f;
- F32 bfb = 0.f;
+ for (U32 i = 0; i < fp.size(); i++)
+ {
+ glh::vec3f p = glh::vec3f(fp[i].mV);
+ view[j].mult_matrix_vec(p);
+ wpf.push_back(LLVector3(p.v));
+ }
- for (U32 i = 0; i < wpf.size(); ++i)
- {
- wpf[i] -= center;
- wpf[i].mV[0] = fabsf(wpf[i].mV[0]);
- wpf[i].mV[2] = fabsf(wpf[i].mV[2]);
- }
+ min = wpf[0];
+ max = wpf[0];
- if (!wpf.empty())
- {
- F32 sx = 0.f;
- F32 sx2 = 0.f;
- F32 sy = 0.f;
- F32 sxy = 0.f;
-
- for (U32 i = 0; i < wpf.size(); ++i)
- {
- sx += wpf[i].mV[0];
- sx2 += wpf[i].mV[0]*wpf[i].mV[0];
- sy += wpf[i].mV[1];
- sxy += wpf[i].mV[0]*wpf[i].mV[1];
+ for (U32 i = 0; i < fp.size(); ++i)
+ { //get AABB in camera space
+ update_min_max(min, max, wpf[i]);
}
- bfm = (sy*sx-wpf.size()*sxy)/(sx*sx-wpf.size()*sx2);
- bfb = (sx*sxy-sy*sx2)/(sx*sx-bfm*sx2);
- }
+ // Construct a perspective transform with perspective along y-axis that contains
+ // points in wpf
+ //Known:
+ // - far clip plane
+ // - near clip plane
+ // - points in frustum
+ //Find:
+ // - origin
+
+ //get some "interesting" points of reference
+ LLVector3 center = (min+max)*0.5f;
+ LLVector3 size = (max-min)*0.5f;
+ LLVector3 near_center = center;
+ near_center.mV[1] += size.mV[1]*2.f;
- {
- // best fit line is y=bfm*x+bfb
- //find point that is furthest to the right of line
- F32 off_x = -1.f;
- LLVector3 lp;
-
- for (U32 i = 0; i < wpf.size(); ++i)
- {
- //y = bfm*x+bfb
- //x = (y-bfb)/bfm
- F32 lx = (wpf[i].mV[1]-bfb)/bfm;
-
- lx = wpf[i].mV[0]-lx;
-
- if (off_x < lx)
- {
- off_x = lx;
- lp = wpf[i];
- }
- }
-
- //get line with slope bfm through lp
- // bfb = y-bfm*x
- bfb = lp.mV[1]-bfm*lp.mV[0];
-
- //calculate error
- mShadowError.mV[j] = 0.f;
+ //put all points in wpf in quadrant 0, reletive to center of min/max
+ //get the best fit line using least squares
+ F32 bfm = 0.f;
+ F32 bfb = 0.f;
for (U32 i = 0; i < wpf.size(); ++i)
{
- F32 lx = (wpf[i].mV[1]-bfb)/bfm;
- mShadowError.mV[j] += fabsf(wpf[i].mV[0]-lx);
+ wpf[i] -= center;
+ wpf[i].mV[0] = fabsf(wpf[i].mV[0]);
+ wpf[i].mV[2] = fabsf(wpf[i].mV[2]);
}
- mShadowError.mV[j] /= wpf.size();
- mShadowError.mV[j] /= size.mV[0];
+ if (!wpf.empty())
+ {
+ F32 sx = 0.f;
+ F32 sx2 = 0.f;
+ F32 sy = 0.f;
+ F32 sxy = 0.f;
+
+ for (U32 i = 0; i < wpf.size(); ++i)
+ {
+ sx += wpf[i].mV[0];
+ sx2 += wpf[i].mV[0]*wpf[i].mV[0];
+ sy += wpf[i].mV[1];
+ sxy += wpf[i].mV[0]*wpf[i].mV[1];
+ }
- if (mShadowError.mV[j] > gSavedSettings.getF32("RenderShadowErrorCutoff"))
- { //just use ortho projection
- mShadowFOV.mV[j] = -1.f;
- origin.clearVec();
- proj[j] = gl_ortho(min.mV[0], max.mV[0],
- min.mV[1], max.mV[1],
- -max.mV[2], -min.mV[2]);
+ bfm = (sy*sx-wpf.size()*sxy)/(sx*sx-wpf.size()*sx2);
+ bfb = (sx*sxy-sy*sx2)/(sx*sx-bfm*sx2);
}
- else
+
{
- //origin is where line x = 0;
- origin.setVec(0,bfb,0);
-
- F32 fovz = 1.f;
- F32 fovx = 1.f;
-
- LLVector3 zp;
- LLVector3 xp;
+ // best fit line is y=bfm*x+bfb
+
+ //find point that is furthest to the right of line
+ F32 off_x = -1.f;
+ LLVector3 lp;
for (U32 i = 0; i < wpf.size(); ++i)
{
- LLVector3 atz = wpf[i]-origin;
- atz.mV[0] = 0.f;
- atz.normVec();
- if (fovz > -atz.mV[1])
- {
- zp = wpf[i];
- fovz = -atz.mV[1];
- }
-
- LLVector3 atx = wpf[i]-origin;
- atx.mV[2] = 0.f;
- atx.normVec();
- if (fovx > -atx.mV[1])
+ //y = bfm*x+bfb
+ //x = (y-bfb)/bfm
+ F32 lx = (wpf[i].mV[1]-bfb)/bfm;
+
+ lx = wpf[i].mV[0]-lx;
+
+ if (off_x < lx)
{
- fovx = -atx.mV[1];
- xp = wpf[i];
+ off_x = lx;
+ lp = wpf[i];
}
}
- fovx = acos(fovx);
- fovz = acos(fovz);
+ //get line with slope bfm through lp
+ // bfb = y-bfm*x
+ bfb = lp.mV[1]-bfm*lp.mV[0];
- F32 cutoff = llmin(gSavedSettings.getF32("RenderShadowFOVCutoff"), 1.4f);
-
- mShadowFOV.mV[j] = fovx;
-
- if (fovx < cutoff && fovz > cutoff)
+ //calculate error
+ mShadowError.mV[j] = 0.f;
+
+ for (U32 i = 0; i < wpf.size(); ++i)
{
- //x is a good fit, but z is too big, move away from zp enough so that fovz matches cutoff
- F32 d = zp.mV[2]/tan(cutoff);
- F32 ny = zp.mV[1] + fabsf(d);
+ F32 lx = (wpf[i].mV[1]-bfb)/bfm;
+ mShadowError.mV[j] += fabsf(wpf[i].mV[0]-lx);
+ }
- origin.mV[1] = ny;
+ mShadowError.mV[j] /= wpf.size();
+ mShadowError.mV[j] /= size.mV[0];
+
+ if (mShadowError.mV[j] > RenderShadowErrorCutoff)
+ { //just use ortho projection
+ mShadowFOV.mV[j] = -1.f;
+ origin.clearVec();
+ proj[j] = gl_ortho(min.mV[0], max.mV[0],
+ min.mV[1], max.mV[1],
+ -max.mV[2], -min.mV[2]);
+ }
+ else
+ {
+ //origin is where line x = 0;
+ origin.setVec(0,bfb,0);
- fovz = 1.f;
- fovx = 1.f;
+ F32 fovz = 1.f;
+ F32 fovx = 1.f;
+
+ LLVector3 zp;
+ LLVector3 xp;
for (U32 i = 0; i < wpf.size(); ++i)
{
LLVector3 atz = wpf[i]-origin;
atz.mV[0] = 0.f;
atz.normVec();
- fovz = llmin(fovz, -atz.mV[1]);
-
+ if (fovz > -atz.mV[1])
+ {
+ zp = wpf[i];
+ fovz = -atz.mV[1];
+ }
+
LLVector3 atx = wpf[i]-origin;
atx.mV[2] = 0.f;
atx.normVec();
- fovx = llmin(fovx, -atx.mV[1]);
+ if (fovx > -atx.mV[1])
+ {
+ fovx = -atx.mV[1];
+ xp = wpf[i];
+ }
}
fovx = acos(fovx);
fovz = acos(fovz);
- if (fovx > cutoff || llround(fovz, 0.01f) > cutoff)
+ F32 cutoff = llmin((F32) RenderShadowFOVCutoff, 1.4f);
+
+ mShadowFOV.mV[j] = fovx;
+
+ if (fovx < cutoff && fovz > cutoff)
{
- // llerrs << "WTF?" << llendl;
- }
+ //x is a good fit, but z is too big, move away from zp enough so that fovz matches cutoff
+ F32 d = zp.mV[2]/tan(cutoff);
+ F32 ny = zp.mV[1] + fabsf(d);
- mShadowFOV.mV[j] = cutoff;
- }
+ origin.mV[1] = ny;
+
+ fovz = 1.f;
+ fovx = 1.f;
+
+ for (U32 i = 0; i < wpf.size(); ++i)
+ {
+ LLVector3 atz = wpf[i]-origin;
+ atz.mV[0] = 0.f;
+ atz.normVec();
+ fovz = llmin(fovz, -atz.mV[1]);
+
+ LLVector3 atx = wpf[i]-origin;
+ atx.mV[2] = 0.f;
+ atx.normVec();
+ fovx = llmin(fovx, -atx.mV[1]);
+ }
+
+ fovx = acos(fovx);
+ fovz = acos(fovz);
+
+ mShadowFOV.mV[j] = cutoff;
+ }
- origin += center;
+ origin += center;
- F32 ynear = -(max.mV[1]-origin.mV[1]);
- F32 yfar = -(min.mV[1]-origin.mV[1]);
+ F32 ynear = -(max.mV[1]-origin.mV[1]);
+ F32 yfar = -(min.mV[1]-origin.mV[1]);
- if (ynear < 0.1f) //keep a sensible near clip plane
- {
- F32 diff = 0.1f-ynear;
- origin.mV[1] += diff;
- ynear += diff;
- yfar += diff;
- }
+ if (ynear < 0.1f) //keep a sensible near clip plane
+ {
+ F32 diff = 0.1f-ynear;
+ origin.mV[1] += diff;
+ ynear += diff;
+ yfar += diff;
+ }
- if (fovx > cutoff)
- { //just use ortho projection
- origin.clearVec();
- mShadowError.mV[j] = -1.f;
- proj[j] = gl_ortho(min.mV[0], max.mV[0],
- min.mV[1], max.mV[1],
- -max.mV[2], -min.mV[2]);
- }
- else
- {
- //get perspective projection
- view[j] = view[j].inverse();
+ if (fovx > cutoff)
+ { //just use ortho projection
+ origin.clearVec();
+ mShadowError.mV[j] = -1.f;
+ proj[j] = gl_ortho(min.mV[0], max.mV[0],
+ min.mV[1], max.mV[1],
+ -max.mV[2], -min.mV[2]);
+ }
+ else
+ {
+ //get perspective projection
+ view[j] = view[j].inverse();
- glh::vec3f origin_agent(origin.mV);
+ glh::vec3f origin_agent(origin.mV);
- //translate view to origin
- view[j].mult_matrix_vec(origin_agent);
+ //translate view to origin
+ view[j].mult_matrix_vec(origin_agent);
- eye = LLVector3(origin_agent.v);
+ eye = LLVector3(origin_agent.v);
- if (!hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SHADOW_FRUSTA))
- {
- mShadowFrustOrigin[j] = eye;
- }
+ if (!hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SHADOW_FRUSTA))
+ {
+ mShadowFrustOrigin[j] = eye;
+ }
- view[j] = look(LLVector3(origin_agent.v), lightDir, -up);
+ view[j] = look(LLVector3(origin_agent.v), lightDir, -up);
- F32 fx = 1.f/tanf(fovx);
- F32 fz = 1.f/tanf(fovz);
+ F32 fx = 1.f/tanf(fovx);
+ F32 fz = 1.f/tanf(fovz);
- proj[j] = glh::matrix4f(-fx, 0, 0, 0,
- 0, (yfar+ynear)/(ynear-yfar), 0, (2.f*yfar*ynear)/(ynear-yfar),
- 0, 0, -fz, 0,
- 0, -1.f, 0, 0);
+ proj[j] = glh::matrix4f(-fx, 0, 0, 0,
+ 0, (yfar+ynear)/(ynear-yfar), 0, (2.f*yfar*ynear)/(ynear-yfar),
+ 0, 0, -fz, 0,
+ 0, -1.f, 0, 0);
+ }
}
}
- }
- shadow_cam.setFar(128.f);
- shadow_cam.setOriginAndLookAt(eye, up, center);
+ //shadow_cam.setFar(128.f);
+ shadow_cam.setOriginAndLookAt(eye, up, center);
- shadow_cam.setOrigin(0,0,0);
+ shadow_cam.setOrigin(0,0,0);
- glh_set_current_modelview(view[j]);
- glh_set_current_projection(proj[j]);
+ glh_set_current_modelview(view[j]);
+ glh_set_current_projection(proj[j]);
- LLViewerCamera::updateFrustumPlanes(shadow_cam, FALSE, FALSE, TRUE);
+ LLViewerCamera::updateFrustumPlanes(shadow_cam, FALSE, FALSE, TRUE);
- shadow_cam.ignoreAgentFrustumPlane(LLCamera::AGENT_PLANE_NEAR);
+ //shadow_cam.ignoreAgentFrustumPlane(LLCamera::AGENT_PLANE_NEAR);
+ shadow_cam.getAgentPlane(LLCamera::AGENT_PLANE_NEAR).set(shadow_near_clip);
- //translate and scale to from [-1, 1] to [0, 1]
- glh::matrix4f trans(0.5f, 0.f, 0.f, 0.5f,
- 0.f, 0.5f, 0.f, 0.5f,
- 0.f, 0.f, 0.5f, 0.5f,
- 0.f, 0.f, 0.f, 1.f);
+ //translate and scale to from [-1, 1] to [0, 1]
+ glh::matrix4f trans(0.5f, 0.f, 0.f, 0.5f,
+ 0.f, 0.5f, 0.f, 0.5f,
+ 0.f, 0.f, 0.5f, 0.5f,
+ 0.f, 0.f, 0.f, 1.f);
- glh_set_current_modelview(view[j]);
- glh_set_current_projection(proj[j]);
+ glh_set_current_modelview(view[j]);
+ glh_set_current_projection(proj[j]);
- for (U32 i = 0; i < 16; i++)
- {
- gGLLastModelView[i] = mShadowModelview[j].m[i];
- gGLLastProjection[i] = mShadowProjection[j].m[i];
- }
+ for (U32 i = 0; i < 16; i++)
+ {
+ gGLLastModelView[i] = mShadowModelview[j].m[i];
+ gGLLastProjection[i] = mShadowProjection[j].m[i];
+ }
- mShadowModelview[j] = view[j];
- mShadowProjection[j] = proj[j];
+ mShadowModelview[j] = view[j];
+ mShadowProjection[j] = proj[j];
- mSunShadowMatrix[j] = trans*proj[j]*view[j]*inv_view;
+ mSunShadowMatrix[j] = trans*proj[j]*view[j]*inv_view;
- stop_glerror();
-
- mShadow[j].bindTarget();
- mShadow[j].getViewport(gGLViewport);
+ stop_glerror();
- {
- static LLCullResult result[4];
+ mShadow[j].bindTarget();
+ mShadow[j].getViewport(gGLViewport);
+ mShadow[j].clear();
+
+ {
+ static LLCullResult result[4];
- //LLGLEnable enable(GL_DEPTH_CLAMP_NV);
- renderShadow(view[j], proj[j], shadow_cam, result[j], TRUE);
- }
+ //LLGLEnable enable(GL_DEPTH_CLAMP_NV);
+ renderShadow(view[j], proj[j], shadow_cam, result[j], TRUE);
+ }
- mShadow[j].flush();
+ mShadow[j].flush();
- if (!gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SHADOW_FRUSTA))
- {
- LLViewerCamera::updateFrustumPlanes(shadow_cam, FALSE, FALSE, TRUE);
- mShadowCamera[j+4] = shadow_cam;
+ if (!gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SHADOW_FRUSTA))
+ {
+ LLViewerCamera::updateFrustumPlanes(shadow_cam, FALSE, FALSE, TRUE);
+ mShadowCamera[j+4] = shadow_cam;
+ }
}
}
//hack to disable projector shadows
- static bool clear = true;
- bool gen_shadow = gSavedSettings.getS32("RenderShadowDetail") > 1;
+ bool gen_shadow = RenderShadowDetail > 1;
if (gen_shadow)
{
- clear = true;
- F32 fade_amt = gFrameIntervalSeconds * llmax(LLViewerCamera::getInstance()->getVelocityStat()->getCurrentPerSec(), 1.f);
+ F32 fade_amt = gFrameIntervalSeconds * llmax(LLViewerCamera::getInstance()->getVelocityStat()->getCurrentPerSec(), 1.f);
- //update shadow targets
- for (U32 i = 0; i < 2; i++)
- { //for each current shadow
- LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_SHADOW4+i;
-
- if (mShadowSpotLight[i].notNull() &&
- (mShadowSpotLight[i] == mTargetShadowSpotLight[0] ||
- mShadowSpotLight[i] == mTargetShadowSpotLight[1]))
- { //keep this spotlight
- mSpotLightFade[i] = llmin(mSpotLightFade[i]+fade_amt, 1.f);
- }
- else
- { //fade out this light
- mSpotLightFade[i] = llmax(mSpotLightFade[i]-fade_amt, 0.f);
-
- if (mSpotLightFade[i] == 0.f || mShadowSpotLight[i].isNull())
- { //faded out, grab one of the pending spots (whichever one isn't already taken)
- if (mTargetShadowSpotLight[0] != mShadowSpotLight[(i+1)%2])
- {
- mShadowSpotLight[i] = mTargetShadowSpotLight[0];
- }
- else
- {
- mShadowSpotLight[i] = mTargetShadowSpotLight[1];
+ //update shadow targets
+ for (U32 i = 0; i < 2; i++)
+ { //for each current shadow
+ LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_SHADOW4+i;
+
+ if (mShadowSpotLight[i].notNull() &&
+ (mShadowSpotLight[i] == mTargetShadowSpotLight[0] ||
+ mShadowSpotLight[i] == mTargetShadowSpotLight[1]))
+ { //keep this spotlight
+ mSpotLightFade[i] = llmin(mSpotLightFade[i]+fade_amt, 1.f);
+ }
+ else
+ { //fade out this light
+ mSpotLightFade[i] = llmax(mSpotLightFade[i]-fade_amt, 0.f);
+
+ if (mSpotLightFade[i] == 0.f || mShadowSpotLight[i].isNull())
+ { //faded out, grab one of the pending spots (whichever one isn't already taken)
+ if (mTargetShadowSpotLight[0] != mShadowSpotLight[(i+1)%2])
+ {
+ mShadowSpotLight[i] = mTargetShadowSpotLight[0];
+ }
+ else
+ {
+ mShadowSpotLight[i] = mTargetShadowSpotLight[1];
+ }
}
}
}
- }
-
- for (S32 i = 0; i < 2; i++)
- {
- glh_set_current_modelview(saved_view);
- glh_set_current_projection(saved_proj);
- if (mShadowSpotLight[i].isNull())
+ for (S32 i = 0; i < 2; i++)
{
- continue;
- }
+ glh_set_current_modelview(saved_view);
+ glh_set_current_projection(saved_proj);
- LLVOVolume* volume = mShadowSpotLight[i]->getVOVolume();
+ if (mShadowSpotLight[i].isNull())
+ {
+ continue;
+ }
- if (!volume)
- {
- mShadowSpotLight[i] = NULL;
- continue;
- }
+ LLVOVolume* volume = mShadowSpotLight[i]->getVOVolume();
- LLDrawable* drawable = mShadowSpotLight[i];
+ if (!volume)
+ {
+ mShadowSpotLight[i] = NULL;
+ continue;
+ }
- LLVector3 params = volume->getSpotLightParams();
- F32 fov = params.mV[0];
+ LLDrawable* drawable = mShadowSpotLight[i];
- //get agent->light space matrix (modelview)
- LLVector3 center = drawable->getPositionAgent();
- LLQuaternion quat = volume->getRenderRotation();
+ LLVector3 params = volume->getSpotLightParams();
+ F32 fov = params.mV[0];
- //get near clip plane
- LLVector3 scale = volume->getScale();
- LLVector3 at_axis(0,0,-scale.mV[2]*0.5f);
- at_axis *= quat;
+ //get agent->light space matrix (modelview)
+ LLVector3 center = drawable->getPositionAgent();
+ LLQuaternion quat = volume->getRenderRotation();
- LLVector3 np = center+at_axis;
- at_axis.normVec();
+ //get near clip plane
+ LLVector3 scale = volume->getScale();
+ LLVector3 at_axis(0,0,-scale.mV[2]*0.5f);
+ at_axis *= quat;
- //get origin that has given fov for plane np, at_axis, and given scale
- F32 dist = (scale.mV[1]*0.5f)/tanf(fov*0.5f);
+ LLVector3 np = center+at_axis;
+ at_axis.normVec();
- LLVector3 origin = np - at_axis*dist;
+ //get origin that has given fov for plane np, at_axis, and given scale
+ F32 dist = (scale.mV[1]*0.5f)/tanf(fov*0.5f);
- LLMatrix4 mat(quat, LLVector4(origin, 1.f));
+ LLVector3 origin = np - at_axis*dist;
- view[i+4] = glh::matrix4f((F32*) mat.mMatrix);
+ LLMatrix4 mat(quat, LLVector4(origin, 1.f));
- view[i+4] = view[i+4].inverse();
+ view[i+4] = glh::matrix4f((F32*) mat.mMatrix);
- //get perspective matrix
- F32 near_clip = dist+0.01f;
- F32 width = scale.mV[VX];
- F32 height = scale.mV[VY];
- F32 far_clip = dist+volume->getLightRadius()*1.5f;
+ view[i+4] = view[i+4].inverse();
- F32 fovy = fov * RAD_TO_DEG;
- F32 aspect = width/height;
-
- proj[i+4] = gl_perspective(fovy, aspect, near_clip, far_clip);
+ //get perspective matrix
+ F32 near_clip = dist+0.01f;
+ F32 width = scale.mV[VX];
+ F32 height = scale.mV[VY];
+ F32 far_clip = dist+volume->getLightRadius()*1.5f;
- //translate and scale to from [-1, 1] to [0, 1]
- glh::matrix4f trans(0.5f, 0.f, 0.f, 0.5f,
- 0.f, 0.5f, 0.f, 0.5f,
- 0.f, 0.f, 0.5f, 0.5f,
- 0.f, 0.f, 0.f, 1.f);
+ F32 fovy = fov * RAD_TO_DEG;
+ F32 aspect = width/height;
+
+ proj[i+4] = gl_perspective(fovy, aspect, near_clip, far_clip);
- glh_set_current_modelview(view[i+4]);
- glh_set_current_projection(proj[i+4]);
+ //translate and scale to from [-1, 1] to [0, 1]
+ glh::matrix4f trans(0.5f, 0.f, 0.f, 0.5f,
+ 0.f, 0.5f, 0.f, 0.5f,
+ 0.f, 0.f, 0.5f, 0.5f,
+ 0.f, 0.f, 0.f, 1.f);
- mSunShadowMatrix[i+4] = trans*proj[i+4]*view[i+4]*inv_view;
-
- for (U32 j = 0; j < 16; j++)
- {
- gGLLastModelView[j] = mShadowModelview[i+4].m[j];
- gGLLastProjection[j] = mShadowProjection[i+4].m[j];
- }
+ glh_set_current_modelview(view[i+4]);
+ glh_set_current_projection(proj[i+4]);
- mShadowModelview[i+4] = view[i+4];
- mShadowProjection[i+4] = proj[i+4];
+ mSunShadowMatrix[i+4] = trans*proj[i+4]*view[i+4]*inv_view;
+
+ for (U32 j = 0; j < 16; j++)
+ {
+ gGLLastModelView[j] = mShadowModelview[i+4].m[j];
+ gGLLastProjection[j] = mShadowProjection[i+4].m[j];
+ }
- LLCamera shadow_cam = camera;
- shadow_cam.setFar(far_clip);
- shadow_cam.setOrigin(origin);
+ mShadowModelview[i+4] = view[i+4];
+ mShadowProjection[i+4] = proj[i+4];
- LLViewerCamera::updateFrustumPlanes(shadow_cam, FALSE, FALSE, TRUE);
+ LLCamera shadow_cam = camera;
+ shadow_cam.setFar(far_clip);
+ shadow_cam.setOrigin(origin);
- stop_glerror();
+ LLViewerCamera::updateFrustumPlanes(shadow_cam, FALSE, FALSE, TRUE);
+
+ stop_glerror();
- mShadow[i+4].bindTarget();
- mShadow[i+4].getViewport(gGLViewport);
+ mShadow[i+4].bindTarget();
+ mShadow[i+4].getViewport(gGLViewport);
+ mShadow[i+4].clear();
- static LLCullResult result[2];
+ static LLCullResult result[2];
- LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_SHADOW0+i+4;
+ LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_SHADOW0+i+4;
- renderShadow(view[i+4], proj[i+4], shadow_cam, result[i], FALSE, FALSE);
+ renderShadow(view[i+4], proj[i+4], shadow_cam, result[i], FALSE, FALSE);
- mShadow[i+4].flush();
- }
+ mShadow[i+4].flush();
+ }
}
else
- {
- if (clear)
- {
- clear = false;
- for (U32 i = 4; i < 6; i++)
- {
- mShadow[i].bindTarget();
- mShadow[i].clear();
- mShadow[i].flush();
- }
- }
+ { //no spotlight shadows
+ mShadowSpotLight[0] = mShadowSpotLight[1] = NULL;
}
- if (!gSavedSettings.getBOOL("CameraOffset"))
+
+ if (!CameraOffset)
{
glh_set_current_modelview(saved_view);
glh_set_current_projection(saved_proj);
@@ -8584,10 +9404,10 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
{
glh_set_current_modelview(view[1]);
glh_set_current_projection(proj[1]);
- glLoadMatrixf(view[1].m);
- glMatrixMode(GL_PROJECTION);
- glLoadMatrixf(proj[1].m);
- glMatrixMode(GL_MODELVIEW);
+ gGL.loadMatrix(view[1].m);
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.loadMatrix(proj[1].m);
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
}
gGL.setColorMask(true, false);
@@ -8598,6 +9418,11 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
}
popRenderTypeMask();
+
+ if (!skip_avatar_update)
+ {
+ gAgentAvatarp->updateAttachmentVisibility(gAgentCamera.getCameraMode());
+ }
}
void LLPipeline::renderGroups(LLRenderPass* pass, U32 type, U32 mask, BOOL texture)
@@ -8633,7 +9458,7 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)
assertInitialized();
- BOOL muted = LLMuteList::getInstance()->isMuted(avatar->getID());
+ bool muted = avatar->isVisuallyMuted();
pushRenderTypeMask();
@@ -8692,7 +9517,7 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)
stateSort(*LLViewerCamera::getInstance(), result);
- const LLVector3* ext = avatar->mDrawable->getSpatialExtents();
+ const LLVector4a* ext = avatar->mDrawable->getSpatialExtents();
LLVector3 pos(avatar->getRenderPosition()+avatar->getImpostorOffset());
LLCamera camera = *viewer_camera;
@@ -8701,44 +9526,47 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)
LLVector2 tdim;
- LLVector3 half_height = (ext[1]-ext[0])*0.5f;
- LLVector3 left = camera.getLeftAxis();
- left *= left;
- left.normalize();
+ LLVector4a half_height;
+ half_height.setSub(ext[1], ext[0]);
+ half_height.mul(0.5f);
- LLVector3 up = camera.getUpAxis();
- up *= up;
- up.normalize();
+ LLVector4a left;
+ left.load3(camera.getLeftAxis().mV);
+ left.mul(left);
+ left.normalize3fast();
- tdim.mV[0] = fabsf(half_height * left);
- tdim.mV[1] = fabsf(half_height * up);
+ LLVector4a up;
+ up.load3(camera.getUpAxis().mV);
+ up.mul(up);
+ up.normalize3fast();
- glMatrixMode(GL_PROJECTION);
- glPushMatrix();
- //glh::matrix4f ortho = gl_ortho(-tdim.mV[0], tdim.mV[0], -tdim.mV[1], tdim.mV[1], 1.0, 256.0);
+ tdim.mV[0] = fabsf(half_height.dot3(left).getF32());
+ tdim.mV[1] = fabsf(half_height.dot3(up).getF32());
+
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.pushMatrix();
+
F32 distance = (pos-camera.getOrigin()).length();
F32 fov = atanf(tdim.mV[1]/distance)*2.f*RAD_TO_DEG;
- F32 aspect = tdim.mV[0]/tdim.mV[1]; //128.f/256.f;
+ F32 aspect = tdim.mV[0]/tdim.mV[1];
glh::matrix4f persp = gl_perspective(fov, aspect, 1.f, 256.f);
glh_set_current_projection(persp);
- glLoadMatrixf(persp.m);
+ gGL.loadMatrix(persp.m);
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.pushMatrix();
glh::matrix4f mat;
camera.getOpenGLTransform(mat.m);
mat = glh::matrix4f((GLfloat*) OGL_TO_CFR_ROTATION) * mat;
- glLoadMatrixf(mat.m);
+ gGL.loadMatrix(mat.m);
glh_set_current_modelview(mat);
glClearColor(0.0f,0.0f,0.0f,0.0f);
gGL.setColorMask(true, true);
- glStencilMask(0xFFFFFFFF);
- glClearStencil(0);
-
+
// get the number of pixels per angle
F32 pa = gViewerWindow->getWindowHeightRaw() / (RAD_TO_DEG * viewer_camera->getView());
@@ -8749,7 +9577,7 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)
if (!avatar->mImpostor.isComplete() || resX != avatar->mImpostor.getWidth() ||
resY != avatar->mImpostor.getHeight())
{
- avatar->mImpostor.allocate(resX,resY,GL_RGBA,TRUE,TRUE);
+ avatar->mImpostor.allocate(resX,resY,GL_RGBA,TRUE,FALSE);
if (LLPipeline::sRenderDeferred)
{
@@ -8761,43 +9589,30 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
}
- LLGLEnable stencil(GL_STENCIL_TEST);
- glStencilMask(0xFFFFFFFF);
- glStencilFunc(GL_ALWAYS, 1, 0xFFFFFFFF);
- glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
+ avatar->mImpostor.bindTarget();
- {
- LLGLEnable scissor(GL_SCISSOR_TEST);
- glScissor(0, 0, resX, resY);
- avatar->mImpostor.bindTarget();
- avatar->mImpostor.clear();
- }
-
if (LLPipeline::sRenderDeferred)
{
- stop_glerror();
+ avatar->mImpostor.clear();
renderGeomDeferred(camera);
renderGeomPostDeferred(camera);
}
else
{
+ LLGLEnable scissor(GL_SCISSOR_TEST);
+ glScissor(0, 0, resX, resY);
+ avatar->mImpostor.clear();
renderGeom(camera);
}
- glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
- glStencilFunc(GL_EQUAL, 1, 0xFFFFFF);
-
- { //create alpha mask based on stencil buffer (grey out if muted)
- LLVector3 left = camera.getLeftAxis()*tdim.mV[0]*2.f;
- LLVector3 up = camera.getUpAxis()*tdim.mV[1]*2.f;
-
+ { //create alpha mask based on depth buffer (grey out if muted)
if (LLPipeline::sRenderDeferred)
{
- GLuint buff = GL_COLOR_ATTACHMENT0_EXT;
+ GLuint buff = GL_COLOR_ATTACHMENT0;
glDrawBuffersARB(1, &buff);
}
- LLGLEnable blend(muted ? 0 : GL_BLEND);
+ LLGLDisable blend(GL_BLEND);
if (muted)
{
@@ -8808,24 +9623,43 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)
gGL.setColorMask(false, true);
}
- gGL.setSceneBlendType(LLRender::BT_ADD);
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- LLGLDepthTest depth(GL_FALSE, GL_FALSE);
+ LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_GREATER);
+
+ gGL.flush();
+
+ gGL.pushMatrix();
+ gGL.loadIdentity();
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.pushMatrix();
+ gGL.loadIdentity();
+
+ static const F32 clip_plane = 0.99999f;
+
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gUIProgram.bind();
+ }
- gGL.color4f(1,1,1,1);
gGL.color4ub(64,64,64,255);
gGL.begin(LLRender::QUADS);
- gGL.vertex3fv((pos+left-up).mV);
- gGL.vertex3fv((pos-left-up).mV);
- gGL.vertex3fv((pos-left+up).mV);
- gGL.vertex3fv((pos+left+up).mV);
+ gGL.vertex3f(-1, -1, clip_plane);
+ gGL.vertex3f(1, -1, clip_plane);
+ gGL.vertex3f(1, 1, clip_plane);
+ gGL.vertex3f(-1, 1, clip_plane);
gGL.end();
gGL.flush();
- gGL.setSceneBlendType(LLRender::BT_ALPHA);
- }
+ if (LLGLSLShader::sNoFixedFunction)
+ {
+ gUIProgram.unbind();
+ }
+ gGL.popMatrix();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.popMatrix();
+ }
avatar->mImpostor.flush();
@@ -8838,10 +9672,10 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)
sShadowRender = FALSE;
popRenderTypeMask();
- glMatrixMode(GL_PROJECTION);
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW);
- glPopMatrix();
+ gGL.matrixMode(LLRender::MM_PROJECTION);
+ gGL.popMatrix();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.popMatrix();
avatar->mNeedsImpostorUpdate = FALSE;
avatar->cacheImpostorValues();
@@ -8997,4 +9831,9 @@ void LLPipeline::clearRenderTypeMask(U32 type, ...)
}
}
+void LLPipeline::addDebugBlip(const LLVector3& position, const LLColor4& color)
+{
+ DebugBlip blip(position, color);
+ mDebugBlips.push_back(blip);
+}
diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h
index 3f785a99fe..b8b4f164fe 100644
--- a/indra/newview/pipeline.h
+++ b/indra/newview/pipeline.h
@@ -42,6 +42,10 @@
#include <stack>
+#include <stack>
+
+#include <stack>
+
class LLViewerTexture;
class LLEdge;
class LLFace;
@@ -54,6 +58,9 @@ class LLCubeMap;
class LLCullResult;
class LLVOAvatar;
class LLGLSLShader;
+class LLCurlRequest;
+
+class LLMeshResponder;
typedef enum e_avatar_skinning_method
{
@@ -65,7 +72,7 @@ BOOL compute_min_max(LLMatrix4& box, LLVector2& min, LLVector2& max); // Shouldn
bool LLRayAABB(const LLVector3 &center, const LLVector3 &size, const LLVector3& origin, const LLVector3& dir, LLVector3 &coord, F32 epsilon = 0);
BOOL setup_hud_matrices(); // use whole screen to render hud
BOOL setup_hud_matrices(const LLRect& screen_region); // specify portion of screen (in pixels) to render hud attachments from (for picking)
-glh::matrix4f glh_copy_matrix(GLdouble* src);
+glh::matrix4f glh_copy_matrix(F32* src);
glh::matrix4f glh_get_current_modelview();
void glh_set_current_modelview(const glh::matrix4f& mat);
glh::matrix4f glh_get_current_projection();
@@ -104,13 +111,19 @@ public:
void destroyGL();
void restoreGL();
void resetVertexBuffers();
+ void doResetVertexBuffers();
void resizeScreenTexture();
void releaseGLBuffers();
+ void releaseLUTBuffers();
+ void releaseScreenBuffers();
void createGLBuffers();
- void allocateScreenBuffer(U32 resX, U32 resY);
+ void createLUTBuffers();
+ void allocateScreenBuffer(U32 resX, U32 resY);
+ bool allocateScreenBuffer(U32 resX, U32 resY, U32 samples);
+ void allocatePhysicsBuffer();
+
void resetVertexBuffers(LLDrawable* drawable);
- void setUseVBO(BOOL use_vbo);
void generateImpostor(LLVOAvatar* avatar);
void bindScreenToTexture();
void renderBloom(BOOL for_snapshot, F32 zoom_factor = 1.f, int subfield = 0);
@@ -149,7 +162,8 @@ public:
void markGLRebuild(LLGLUpdate* glu);
void markRebuild(LLSpatialGroup* group, BOOL priority = FALSE);
void markRebuild(LLDrawable *drawablep, LLDrawable::EDrawableFlags flag = LLDrawable::REBUILD_ALL, BOOL priority = FALSE);
-
+ void markPartitionMove(LLDrawable* drawablep);
+
//get the object between start and end that's closest to start.
LLViewerObject* lineSegmentIntersectInWorld(const LLVector3& start, const LLVector3& end,
BOOL pick_transparent,
@@ -200,9 +214,10 @@ public:
BOOL visibleObjectsInFrustum(LLCamera& camera);
BOOL getVisibleExtents(LLCamera& camera, LLVector3 &min, LLVector3& max);
BOOL getVisiblePointCloud(LLCamera& camera, LLVector3 &min, LLVector3& max, std::vector<LLVector3>& fp, LLVector3 light_dir = LLVector3(0,0,0));
- void updateCull(LLCamera& camera, LLCullResult& result, S32 water_clip = 0); //if water_clip is 0, ignore water plane, 1, cull to above plane, -1, cull to below plane
+ void updateCull(LLCamera& camera, LLCullResult& result, S32 water_clip = 0, LLPlane* plane = NULL); //if water_clip is 0, ignore water plane, 1, cull to above plane, -1, cull to below plane
void createObjects(F32 max_dtime);
void createObject(LLViewerObject* vobj);
+ void processPartitionQ();
void updateGeom(F32 max_dtime);
void updateGL();
void rebuildPriorityGroups();
@@ -210,6 +225,7 @@ public:
//calculate pixel area of given box from vantage point of given camera
static F32 calcPixelArea(LLVector3 center, LLVector3 size, LLCamera& camera);
+ static F32 calcPixelArea(const LLVector4a& center, const LLVector4a& size, LLCamera &camera);
void stateSort(LLCamera& camera, LLCullResult& result);
void stateSort(LLSpatialGroup* group, LLCamera& camera);
@@ -218,16 +234,24 @@ public:
void postSort(LLCamera& camera);
void forAllVisibleDrawables(void (*func)(LLDrawable*));
- void renderObjects(U32 type, U32 mask, BOOL texture = TRUE);
+ void renderObjects(U32 type, U32 mask, BOOL texture = TRUE, BOOL batch_texture = FALSE);
void renderGroups(LLRenderPass* pass, U32 type, U32 mask, BOOL texture);
void grabReferences(LLCullResult& result);
+ void clearReferences();
+
+ //check references will assert that there are no references in sCullResult to the provided data
+ void checkReferences(LLFace* face);
+ void checkReferences(LLDrawable* drawable);
+ void checkReferences(LLDrawInfo* draw_info);
+ void checkReferences(LLSpatialGroup* group);
+
void renderGeom(LLCamera& camera, BOOL forceVBOUpdate = FALSE);
void renderGeomDeferred(LLCamera& camera);
void renderGeomPostDeferred(LLCamera& camera);
void renderGeomShadow(LLCamera& camera);
- void bindDeferredShader(LLGLSLShader& shader, U32 light_index = 0, LLRenderTarget* gi_source = NULL, LLRenderTarget* last_gi_post = NULL, U32 noise_map = 0xFFFFFFFF);
+ void bindDeferredShader(LLGLSLShader& shader, U32 light_index = 0, U32 noise_map = 0xFFFFFFFF);
void setupSpotLight(LLGLSLShader& shader, LLDrawable* drawablep);
void unbindDeferredShader(LLGLSLShader& shader);
@@ -241,9 +265,9 @@ public:
void renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera& camera, LLCullResult& result, BOOL use_shader = TRUE, BOOL use_occlusion = TRUE);
- void generateGI(LLCamera& camera, LLVector3& lightDir, std::vector<LLVector3>& vpc);
void renderHighlights();
void renderDebug();
+ void renderPhysicsDisplay();
void rebuildPools(); // Rebuild pools
@@ -259,6 +283,7 @@ public:
void enableLightsStatic();
void enableLightsDynamic();
void enableLightsAvatar();
+ void enableLightsPreview();
void enableLightsAvatarEdit(const LLColor4& color);
void enableLightsFullbright(const LLColor4& color);
void disableLights();
@@ -302,6 +327,7 @@ public:
static BOOL toggleRenderTypeControlNegated(void* data);
static BOOL toggleRenderDebugControl(void* data);
static BOOL toggleRenderDebugFeatureControl(void* data);
+ static void setRenderDebugFeatureControl(U32 bit, bool value);
static void setRenderParticleBeacons(BOOL val);
static void toggleRenderParticleBeacons(void* data);
@@ -311,6 +337,10 @@ public:
static void toggleRenderSoundBeacons(void* data);
static BOOL getRenderSoundBeacons(void* data);
+ static void setRenderMOAPBeacons(BOOL val);
+ static void toggleRenderMOAPBeacons(void * data);
+ static BOOL getRenderMOAPBeacons(void * data);
+
static void setRenderPhysicalBeacons(BOOL val);
static void toggleRenderPhysicalBeacons(void* data);
static BOOL getRenderPhysicalBeacons(void* data);
@@ -332,6 +362,11 @@ public:
static BOOL getRenderHighlights(void* data);
static void updateRenderDeferred();
+ static void refreshCachedSettings();
+
+ static void throttleNewMemoryAllocation(BOOL disable);
+
+ void addDebugBlip(const LLVector3& position, const LLColor4& color);
private:
void unloadShaders();
@@ -375,7 +410,6 @@ public:
RENDER_TYPE_PASS_ALPHA = LLRenderPass::PASS_ALPHA,
RENDER_TYPE_PASS_ALPHA_MASK = LLRenderPass::PASS_ALPHA_MASK,
RENDER_TYPE_PASS_FULLBRIGHT_ALPHA_MASK = LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK,
- RENDER_TYPE_PASS_ALPHA_SHADOW = LLRenderPass::PASS_ALPHA_SHADOW,
// Following are object types (only used in drawable mRenderType)
RENDER_TYPE_HUD = LLRenderPass::NUM_RENDER_TYPES,
RENDER_TYPE_VOLUME,
@@ -401,29 +435,35 @@ public:
enum LLRenderDebugMask
{
- RENDER_DEBUG_COMPOSITION = 0x0000001,
- RENDER_DEBUG_VERIFY = 0x0000002,
- RENDER_DEBUG_BBOXES = 0x0000004,
- RENDER_DEBUG_OCTREE = 0x0000008,
- RENDER_DEBUG_PICKING = 0x0000010,
- RENDER_DEBUG_OCCLUSION = 0x0000020,
- RENDER_DEBUG_POINTS = 0x0000040,
- RENDER_DEBUG_TEXTURE_PRIORITY = 0x0000080,
- RENDER_DEBUG_TEXTURE_AREA = 0x0000100,
- RENDER_DEBUG_FACE_AREA = 0x0000200,
- RENDER_DEBUG_PARTICLES = 0x0000400,
- RENDER_DEBUG_GLOW = 0x0000800,
- RENDER_DEBUG_TEXTURE_ANIM = 0x0001000,
- RENDER_DEBUG_LIGHTS = 0x0002000,
- RENDER_DEBUG_BATCH_SIZE = 0x0004000,
- RENDER_DEBUG_ALPHA_BINS = 0x0008000,
- RENDER_DEBUG_RAYCAST = 0x0010000,
- RENDER_DEBUG_SHAME = 0x0020000,
- RENDER_DEBUG_SHADOW_FRUSTA = 0x0040000,
- RENDER_DEBUG_SCULPTED = 0x0080000,
- RENDER_DEBUG_AVATAR_VOLUME = 0x0100000,
- RENDER_DEBUG_BUILD_QUEUE = 0x0200000,
- RENDER_DEBUG_AGENT_TARGET = 0x0400000,
+ RENDER_DEBUG_COMPOSITION = 0x00000001,
+ RENDER_DEBUG_VERIFY = 0x00000002,
+ RENDER_DEBUG_BBOXES = 0x00000004,
+ RENDER_DEBUG_OCTREE = 0x00000008,
+ RENDER_DEBUG_WIND_VECTORS = 0x00000010,
+ RENDER_DEBUG_OCCLUSION = 0x00000020,
+ RENDER_DEBUG_POINTS = 0x00000040,
+ RENDER_DEBUG_TEXTURE_PRIORITY = 0x00000080,
+ RENDER_DEBUG_TEXTURE_AREA = 0x00000100,
+ RENDER_DEBUG_FACE_AREA = 0x00000200,
+ RENDER_DEBUG_PARTICLES = 0x00000400,
+ RENDER_DEBUG_GLOW = 0x00000800,
+ RENDER_DEBUG_TEXTURE_ANIM = 0x00001000,
+ RENDER_DEBUG_LIGHTS = 0x00002000,
+ RENDER_DEBUG_BATCH_SIZE = 0x00004000,
+ RENDER_DEBUG_ALPHA_BINS = 0x00008000,
+ RENDER_DEBUG_RAYCAST = 0x00010000,
+ RENDER_DEBUG_SHAME = 0x00020000,
+ RENDER_DEBUG_SHADOW_FRUSTA = 0x00040000,
+ RENDER_DEBUG_SCULPTED = 0x00080000,
+ RENDER_DEBUG_AVATAR_VOLUME = 0x00100000,
+ RENDER_DEBUG_BUILD_QUEUE = 0x00200000,
+ RENDER_DEBUG_AGENT_TARGET = 0x00400000,
+ RENDER_DEBUG_UPDATE_TYPE = 0x00800000,
+ RENDER_DEBUG_PHYSICS_SHAPES = 0x01000000,
+ RENDER_DEBUG_NORMALS = 0x02000000,
+ RENDER_DEBUG_LOD_INFO = 0x04000000,
+ RENDER_DEBUG_RENDER_COMPLEXITY = 0x08000000,
+ RENDER_DEBUG_ATTACHMENT_BYTES = 0x10000000,
};
public:
@@ -446,6 +486,10 @@ public:
S32 mNumVisibleNodes;
S32 mVerticesRelit;
+ S32 mDebugTextureUploadCost;
+ S32 mDebugSculptUploadCost;
+ S32 mDebugMeshUploadCost;
+
S32 mLightingChanges;
S32 mGeometryChanges;
@@ -461,6 +505,8 @@ public:
static BOOL sAutoMaskAlphaNonDeferred;
static BOOL sDisableShaders; // if TRUE, rendering will be done without shaders
static BOOL sRenderBump;
+ static BOOL sBakeSunlight;
+ static BOOL sNoAlpha;
static BOOL sUseTriStrips;
static BOOL sUseFarClip;
static BOOL sShadowRender;
@@ -476,9 +522,9 @@ public:
static BOOL sRenderAttachedLights;
static BOOL sRenderAttachedParticles;
static BOOL sRenderDeferred;
- static BOOL sAllowRebuildPriorityGroup;
+ static BOOL sMemAllocationThrottled;
static S32 sVisibleLightCount;
- static F32 sMinRenderSize;
+ static F32 sMinRenderSize;
//screen texture
U32 mScreenWidth;
@@ -487,14 +533,15 @@ public:
LLRenderTarget mScreen;
LLRenderTarget mUIScreen;
LLRenderTarget mDeferredScreen;
+ LLRenderTarget mFXAABuffer;
LLRenderTarget mEdgeMap;
LLRenderTarget mDeferredDepth;
- LLRenderTarget mDeferredLight[3];
- LLMultisampleBuffer mSampleBuffer;
- LLRenderTarget mGIMap;
- LLRenderTarget mGIMapPost[2];
- LLRenderTarget mLuminanceMap;
+ LLRenderTarget mDeferredLight;
LLRenderTarget mHighlight;
+ LLRenderTarget mPhysicsDisplay;
+
+ //utility buffer for rendering post effects, gets abused by renderDeferredLighting
+ LLPointer<LLVertexBuffer> mDeferredVB;
//sun shadow map
LLRenderTarget mShadow[6];
@@ -541,6 +588,7 @@ public:
LLColor4 mSunDiffuse;
LLVector3 mSunDir;
+ LLVector3 mTransformedSunDir;
BOOL mInitialized;
BOOL mVertexShadersEnabled;
@@ -603,6 +651,13 @@ protected:
LLSpatialGroup::sg_vector_t mGroupQ1; //priority
LLSpatialGroup::sg_vector_t mGroupQ2; // non-priority
+ LLDrawable::drawable_list_t mPartitionQ; //drawables that need to update their spatial partition radius
+
+ bool mGroupQ2Locked;
+ bool mGroupQ1Locked;
+
+ bool mResetVertexBuffers; //if true, clear vertex buffers on next update
+
LLViewerObject::vobj_list_t mCreateQ;
LLDrawable::drawable_set_t mRetexturedList;
@@ -689,6 +744,20 @@ public:
protected:
std::vector<LLFace*> mSelectedFaces;
+ class DebugBlip
+ {
+ public:
+ LLColor4 mColor;
+ LLVector3 mPosition;
+ F32 mAge;
+
+ DebugBlip(const LLVector3& position, const LLColor4& color)
+ : mColor(color), mPosition(position), mAge(0.f)
+ { }
+ };
+
+ std::list<DebugBlip> mDebugBlips;
+
LLPointer<LLViewerFetchedTexture> mFaceSelectImagep;
U32 mLightMask;
@@ -696,6 +765,7 @@ protected:
S32 mLightingDetail;
static BOOL sRenderPhysicalBeacons;
+ static BOOL sRenderMOAPBeacons;
static BOOL sRenderScriptedTouchBeacons;
static BOOL sRenderScriptedBeacons;
static BOOL sRenderParticleBeacons;
@@ -706,6 +776,81 @@ public:
//debug use
static U32 sCurRenderPoolType ;
+
+ //cached settings
+ static BOOL WindLightUseAtmosShaders;
+ static BOOL VertexShaderEnable;
+ static BOOL RenderAvatarVP;
+ static BOOL RenderDeferred;
+ static F32 RenderDeferredSunWash;
+ static U32 RenderFSAASamples;
+ static U32 RenderResolutionDivisor;
+ static BOOL RenderUIBuffer;
+ static S32 RenderShadowDetail;
+ static BOOL RenderDeferredSSAO;
+ static F32 RenderShadowResolutionScale;
+ static BOOL RenderLocalLights;
+ static BOOL RenderDelayCreation;
+ static BOOL RenderAnimateRes;
+ static BOOL FreezeTime;
+ static S32 DebugBeaconLineWidth;
+ static F32 RenderHighlightBrightness;
+ static LLColor4 RenderHighlightColor;
+ static F32 RenderHighlightThickness;
+ static BOOL RenderSpotLightsInNondeferred;
+ static LLColor4 PreviewAmbientColor;
+ static LLColor4 PreviewDiffuse0;
+ static LLColor4 PreviewSpecular0;
+ static LLColor4 PreviewDiffuse1;
+ static LLColor4 PreviewSpecular1;
+ static LLColor4 PreviewDiffuse2;
+ static LLColor4 PreviewSpecular2;
+ static LLVector3 PreviewDirection0;
+ static LLVector3 PreviewDirection1;
+ static LLVector3 PreviewDirection2;
+ static F32 RenderGlowMinLuminance;
+ static F32 RenderGlowMaxExtractAlpha;
+ static F32 RenderGlowWarmthAmount;
+ static LLVector3 RenderGlowLumWeights;
+ static LLVector3 RenderGlowWarmthWeights;
+ static S32 RenderGlowResolutionPow;
+ static S32 RenderGlowIterations;
+ static F32 RenderGlowWidth;
+ static F32 RenderGlowStrength;
+ static BOOL RenderDepthOfField;
+ static F32 CameraFocusTransitionTime;
+ static F32 CameraFNumber;
+ static F32 CameraFocalLength;
+ static F32 CameraFieldOfView;
+ static F32 RenderShadowNoise;
+ static F32 RenderShadowBlurSize;
+ static F32 RenderSSAOScale;
+ static U32 RenderSSAOMaxScale;
+ static F32 RenderSSAOFactor;
+ static LLVector3 RenderSSAOEffect;
+ static F32 RenderShadowOffsetError;
+ static F32 RenderShadowBiasError;
+ static F32 RenderShadowOffset;
+ static F32 RenderShadowBias;
+ static F32 RenderSpotShadowOffset;
+ static F32 RenderSpotShadowBias;
+ static F32 RenderEdgeDepthCutoff;
+ static F32 RenderEdgeNormCutoff;
+ static LLVector3 RenderShadowGaussian;
+ static F32 RenderShadowBlurDistFactor;
+ static BOOL RenderDeferredAtmospheric;
+ static S32 RenderReflectionDetail;
+ static F32 RenderHighlightFadeTime;
+ static LLVector3 RenderShadowClipPlanes;
+ static LLVector3 RenderShadowOrthoClipPlanes;
+ static LLVector3 RenderShadowNearDist;
+ static F32 RenderFarClip;
+ static LLVector3 RenderShadowSplitExponent;
+ static F32 RenderShadowErrorCutoff;
+ static F32 RenderShadowFOVCutoff;
+ static BOOL CameraOffset;
+ static F32 CameraMaxCoF;
+ static F32 CameraDoFResScale;
};
void render_bbox(const LLVector3 &min, const LLVector3 &max);
diff --git a/indra/newview/res-sdl/ll_icon.BMP b/indra/newview/res-sdl/ll_icon.BMP
deleted file mode 100644
index 6f9366df41..0000000000
--- a/indra/newview/res-sdl/ll_icon.BMP
+++ /dev/null
Binary files differ
diff --git a/indra/newview/res/ll_icon.BMP b/indra/newview/res/ll_icon.BMP
deleted file mode 100644
index 3a9964cd95..0000000000
--- a/indra/newview/res/ll_icon.BMP
+++ /dev/null
Binary files differ
diff --git a/indra/newview/res/ll_icon.ico b/indra/newview/res/ll_icon.ico
deleted file mode 100644
index 87985b9285..0000000000
--- a/indra/newview/res/ll_icon.ico
+++ /dev/null
Binary files differ
diff --git a/indra/newview/res/ll_icon.png b/indra/newview/res/ll_icon.png
deleted file mode 100644
index ae573b3874..0000000000
--- a/indra/newview/res/ll_icon.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/res/resource.h b/indra/newview/res/resource.h
index 28813be896..01d90da971 100644
--- a/indra/newview/res/resource.h
+++ b/indra/newview/res/resource.h
@@ -38,6 +38,7 @@
#define IDC_CURSOR5 154
#define IDI_LCD_LL_ICON 157
#define IDC_CURSOR6 158
+#define IDC_STATIC 1000
#define IDC_RADIO_56 1000
#define IDC_RADIO_128 1001
#define IDC_RADIO_256 1002
diff --git a/indra/newview/res/toolbuy.cur b/indra/newview/res/toolbuy.cur
index a1bc278116..65bbf01d45 100644
--- a/indra/newview/res/toolbuy.cur
+++ b/indra/newview/res/toolbuy.cur
Binary files differ
diff --git a/indra/newview/res/toolopen.cur b/indra/newview/res/toolopen.cur
index a72cdfe4c0..22ecbd5228 100644
--- a/indra/newview/res/toolopen.cur
+++ b/indra/newview/res/toolopen.cur
Binary files differ
diff --git a/indra/newview/res/toolsit.cur b/indra/newview/res/toolsit.cur
index 6327bdb281..d26b6f8638 100644
--- a/indra/newview/res/toolsit.cur
+++ b/indra/newview/res/toolsit.cur
Binary files differ
diff --git a/indra/newview/res/viewerRes.rc b/indra/newview/res/viewerRes.rc
index 5e8cee1f5f..a53dece422 100644
--- a/indra/newview/res/viewerRes.rc
+++ b/indra/newview/res/viewerRes.rc
@@ -7,7 +7,7 @@
//
// Generated from the TEXTINCLUDE 2 resource.
//
-#include "winres.h"
+#include "windows.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
@@ -34,7 +34,7 @@ END
2 TEXTINCLUDE
BEGIN
- "#include ""winres.h""\r\n"
+ "#include ""windows.h""\r\n"
"\0"
END
@@ -62,12 +62,12 @@ IDI_LCD_LL_ICON ICON "icon1.ico"
// Dialog
//
-SPLASHSCREEN DIALOG 32, 32, 144, 34
+SPLASHSCREEN DIALOG 32, 32, 264, 34
STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE
FONT 8, "MS Sans Serif"
BEGIN
ICON IDI_LL_ICON,IDC_STATIC,7,7,20,20
- LTEXT "Loading Second Life...",666,36,13,91,8
+ LTEXT "Loading Second Life...",666,36,13,211,8
END
@@ -82,7 +82,7 @@ BEGIN
"SPLASHSCREEN", DIALOG
BEGIN
LEFTMARGIN, 7
- RIGHTMARGIN, 137
+ RIGHTMARGIN, 257
VERTGUIDE, 36
TOPMARGIN, 7
BOTTOMMARGIN, 27
diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml
index be94b40065..b616e2327b 100644
--- a/indra/newview/skins/default/colors.xml
+++ b/indra/newview/skins/default/colors.xml
@@ -30,9 +30,15 @@
name="LtGray"
value="0.75 0.75 0.75 1" />
<color
+ name="LtGray_35"
+ value="0.75 0.75 0.75 0.35" />
+ <color
name="LtGray_50"
value="0.75 0.75 0.75 0.50" />
<color
+ name="Gray"
+ value="0.5 0.5 0.5 1" />
+ <color
name="DkGray"
value="0.125 0.125 0.125 1" />
<color
@@ -84,6 +90,9 @@
name="LtYellow"
value="1 1 .79 1" />
<color
+ name="DrYellow"
+ value="1 0.86 0 1" />
+ <color
name="LtOrange"
value="1 .85 .73 1" />
<color
@@ -115,12 +124,6 @@
name="AlertCautionTextColor"
reference="LtYellow" />
<color
- name="AgentLinkColor"
- reference="EmphasisColor" />
- <color
- name="AlertTextColor"
- value="0.58 0.66 0.84 1" />
- <color
name="AvatarListItemIconDefaultColor"
reference="White" />
<color
@@ -139,7 +142,13 @@
name="AvatarListItemIconVoiceLeftColor"
reference="AvatarListItemIconOfflineColor" />
<color
- name="BackgroundChatColor"
+ name="BadgeImageColor"
+ value="1.0 0.40 0.0 1.0" />
+ <color
+ name="BadgeBorderColor"
+ value="0.9 0.9 0.9 1.0" />
+ <color
+ name="BadgeLabelColor"
reference="White" />
<color
name="ButtonBorderColor"
@@ -197,7 +206,7 @@
reference="Black" />
<color
name="ColorPaletteEntry02"
- value="0.5 0.5 0.5 1" />
+ reference="Gray" />
<color
name="ColorPaletteEntry03"
value="0.5 0 0 1" />
@@ -352,9 +361,6 @@
name="GridlineShadowColor"
value="0 0 0 0.31" />
<color
- name="GroupLinkColor"
- reference="White" />
- <color
name="GroupNotifyBoxColor"
value="0.3344 0.5456 0.5159 1" />
<color
@@ -427,11 +433,14 @@
name="InventoryItemLinkColor"
reference="LtGray_50" />
<color
+ name="InventoryMouseOverColor"
+ reference="LtGray_35" />
+ <color
name="InventorySearchStatusColor"
reference="EmphasisColor" />
<color
name="LabelDisabledColor"
- reference="White_25" />
+ reference="White_25" />
<color
name="LabelSelectedColor"
reference="White" />
@@ -511,23 +520,26 @@
name="MenuPopupBgColor"
reference="DkGray2" />
<color
+ name="ModelUploaderLabels"
+ value="1 0.6 0 1" />
+ <color
name="MultiSliderDisabledThumbColor"
- reference="Unused?" />
+ reference="Black" />
<color
name="MultiSliderThumbCenterColor"
- reference="Unused?" />
+ reference="White" />
<color
name="MultiSliderThumbCenterSelectedColor"
- reference="Unused?" />
+ reference="Green" />
<color
name="MultiSliderThumbOutlineColor"
reference="Unused?" />
<color
name="MultiSliderTrackColor"
- reference="Unused?" />
+ reference="LtGray" />
<color
name="MultiSliderTriangleColor"
- reference="Unused?" />
+ reference="Yellow" />
<!--
<color
name="NameTagBackground"
@@ -603,6 +615,9 @@
name="PanelFocusBackgroundColor"
reference="DkGray2" />
<color
+ name="PanelNotificationBackground"
+ value="1 0.3 0.3 0" />
+ <color
name="ParcelHoverColor"
reference="White" />
<color
@@ -735,6 +750,9 @@
name="TitleBarFocusColor"
reference="White_10" />
<color
+ name="ToastBackground"
+ value="0.3 0.3 0.3 0" />
+ <color
name="ToolTipBgColor"
value="0.937 0.89 0.655 1" />
<color
@@ -772,4 +790,36 @@
<color
name="MenuBarProjectBgColor"
reference="MdBlue" />
+
+ <color
+ name="MeshImportTableNormalColor"
+ value="1 1 1 1"/>
+ <color
+ name="MeshImportTableHighlightColor"
+ value="0.2 0.8 1 1"/>
+
+ <color
+ name="DirectChatColor"
+ reference="LtOrange" />
+
+ <color
+ name="ToolbarDropZoneColor"
+ value=".48 .69 1 .5" />
+
+ <!-- Generic color names (legacy) -->
+ <color
+ name="white"
+ value="1 1 1 1"/>
+ <color
+ name="black"
+ value="0 0 0 1"/>
+ <color
+ name="red"
+ value="1 0 0 1"/>
+ <color
+ name="green"
+ value="0 1 0 1"/>
+ <color
+ name="blue"
+ value="0 0 1 1"/>
</colors>
diff --git a/indra/newview/skins/default/textures/bottomtray/Cam_Pan_Over.png b/indra/newview/skins/default/textures/bottomtray/Cam_Pan_Over.png
deleted file mode 100644
index b5781718ec..0000000000
--- a/indra/newview/skins/default/textures/bottomtray/Cam_Pan_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/CameraView_Press.png b/indra/newview/skins/default/textures/bottomtray/CameraView_Press.png
deleted file mode 100644
index 5a9346fd39..0000000000
--- a/indra/newview/skins/default/textures/bottomtray/CameraView_Press.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/ChatBarHandle.png b/indra/newview/skins/default/textures/bottomtray/ChatBarHandle.png
new file mode 100644
index 0000000000..8b58db0cba
--- /dev/null
+++ b/indra/newview/skins/default/textures/bottomtray/ChatBarHandle.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/PanOrbit_Disabled.png b/indra/newview/skins/default/textures/bottomtray/PanOrbit_Disabled.png
deleted file mode 100644
index 20fa40e127..0000000000
--- a/indra/newview/skins/default/textures/bottomtray/PanOrbit_Disabled.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/PanOrbit_Over.png b/indra/newview/skins/default/textures/bottomtray/PanOrbit_Over.png
deleted file mode 100644
index f1420e0002..0000000000
--- a/indra/newview/skins/default/textures/bottomtray/PanOrbit_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/PanOrbit_Press.png b/indra/newview/skins/default/textures/bottomtray/PanOrbit_Press.png
deleted file mode 100644
index 89a6269edc..0000000000
--- a/indra/newview/skins/default/textures/bottomtray/PanOrbit_Press.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl1_Dark.png b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl1_Dark.png
new file mode 100644
index 0000000000..857fa1e047
--- /dev/null
+++ b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl1_Dark.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl2_Dark.png b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl2_Dark.png
new file mode 100644
index 0000000000..453bb53673
--- /dev/null
+++ b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl2_Dark.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl3_Dark.png b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl3_Dark.png
new file mode 100644
index 0000000000..135a66ca0d
--- /dev/null
+++ b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl3_Dark.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/VoicePTT_Off_Dark.png b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Off_Dark.png
new file mode 100644
index 0000000000..a63aec5e6d
--- /dev/null
+++ b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Off_Dark.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/VoicePTT_On_Dark.png b/indra/newview/skins/default/textures/bottomtray/VoicePTT_On_Dark.png
new file mode 100644
index 0000000000..1719eb3e84
--- /dev/null
+++ b/indra/newview/skins/default/textures/bottomtray/VoicePTT_On_Dark.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/checker.png b/indra/newview/skins/default/textures/checker.png
new file mode 100644
index 0000000000..1ab87e3f02
--- /dev/null
+++ b/indra/newview/skins/default/textures/checker.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/checkerboard_transparency_bg.png b/indra/newview/skins/default/textures/checkerboard_transparency_bg.png
deleted file mode 100644
index 9a16935204..0000000000
--- a/indra/newview/skins/default/textures/checkerboard_transparency_bg.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/circle.tga b/indra/newview/skins/default/textures/circle.tga
deleted file mode 100644
index d7097e3a35..0000000000
--- a/indra/newview/skins/default/textures/circle.tga
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/containers/Accordion_ArrowClosed_Over.png b/indra/newview/skins/default/textures/containers/Accordion_ArrowClosed_Over.png
deleted file mode 100644
index e47f913db1..0000000000
--- a/indra/newview/skins/default/textures/containers/Accordion_ArrowClosed_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/containers/Accordion_ArrowOpened_Over.png b/indra/newview/skins/default/textures/containers/Accordion_ArrowOpened_Over.png
deleted file mode 100644
index e2c67de9c0..0000000000
--- a/indra/newview/skins/default/textures/containers/Accordion_ArrowOpened_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/containers/TabTop_Left_Over.png b/indra/newview/skins/default/textures/containers/TabTop_Left_Over.png
deleted file mode 100644
index 295cd89a57..0000000000
--- a/indra/newview/skins/default/textures/containers/TabTop_Left_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/containers/TabTop_Middle_Over.png b/indra/newview/skins/default/textures/containers/TabTop_Middle_Over.png
deleted file mode 100644
index 0758cbcf0d..0000000000
--- a/indra/newview/skins/default/textures/containers/TabTop_Middle_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/containers/TabTop_Right_Over.png b/indra/newview/skins/default/textures/containers/TabTop_Right_Over.png
deleted file mode 100644
index c2cbc2b1e5..0000000000
--- a/indra/newview/skins/default/textures/containers/TabTop_Right_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/green_checkmark.png b/indra/newview/skins/default/textures/green_checkmark.png
new file mode 100644
index 0000000000..d2a5b348dc
--- /dev/null
+++ b/indra/newview/skins/default/textures/green_checkmark.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icn_label_web.tga b/indra/newview/skins/default/textures/icn_label_web.tga
deleted file mode 100644
index 7c9131dfff..0000000000
--- a/indra/newview/skins/default/textures/icn_label_web.tga
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/icn_media.tga b/indra/newview/skins/default/textures/icn_media.tga
deleted file mode 100644
index 43dd342c9d..0000000000
--- a/indra/newview/skins/default/textures/icn_media.tga
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/icn_voice-groupfocus.tga b/indra/newview/skins/default/textures/icn_voice-groupfocus.tga
deleted file mode 100644
index 9f48d4609d..0000000000
--- a/indra/newview/skins/default/textures/icn_voice-groupfocus.tga
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/icn_voice-localchat.tga b/indra/newview/skins/default/textures/icn_voice-localchat.tga
deleted file mode 100644
index 7cf267eaf5..0000000000
--- a/indra/newview/skins/default/textures/icn_voice-localchat.tga
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/icn_voice-pvtfocus.tga b/indra/newview/skins/default/textures/icn_voice-pvtfocus.tga
deleted file mode 100644
index abadb09aaf..0000000000
--- a/indra/newview/skins/default/textures/icn_voice-pvtfocus.tga
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/icon_day_cycle.tga b/indra/newview/skins/default/textures/icon_day_cycle.tga
deleted file mode 100644
index 2d5dee1e94..0000000000
--- a/indra/newview/skins/default/textures/icon_day_cycle.tga
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/icon_event_adult.tga b/indra/newview/skins/default/textures/icon_event_adult.tga
deleted file mode 100644
index f548126e5a..0000000000
--- a/indra/newview/skins/default/textures/icon_event_adult.tga
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/icon_lock.tga b/indra/newview/skins/default/textures/icon_lock.tga
deleted file mode 100644
index 23521aa113..0000000000
--- a/indra/newview/skins/default/textures/icon_lock.tga
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/AddItem_Over.png b/indra/newview/skins/default/textures/icons/AddItem_Over.png
deleted file mode 100644
index cad6e8d52f..0000000000
--- a/indra/newview/skins/default/textures/icons/AddItem_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/BackArrow_Over.png b/indra/newview/skins/default/textures/icons/BackArrow_Over.png
deleted file mode 100644
index b36e03a8cf..0000000000
--- a/indra/newview/skins/default/textures/icons/BackArrow_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/DragHandle.png b/indra/newview/skins/default/textures/icons/DragHandle.png
deleted file mode 100644
index c3cbc07a33..0000000000
--- a/indra/newview/skins/default/textures/icons/DragHandle.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Edit_Wrench.png b/indra/newview/skins/default/textures/icons/Edit_Wrench.png
index 250697b4b1..edb40b9c96 100644
--- a/indra/newview/skins/default/textures/icons/Edit_Wrench.png
+++ b/indra/newview/skins/default/textures/icons/Edit_Wrench.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Generic_Object.png b/indra/newview/skins/default/textures/icons/Generic_Object.png
deleted file mode 100644
index e3a80b2aef..0000000000
--- a/indra/newview/skins/default/textures/icons/Generic_Object.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Inv_Mesh.png b/indra/newview/skins/default/textures/icons/Inv_Mesh.png
new file mode 100644
index 0000000000..f1f21f7941
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Inv_Mesh.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Inv_Physics.png b/indra/newview/skins/default/textures/icons/Inv_Physics.png
new file mode 100644
index 0000000000..360baec46d
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Inv_Physics.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/OptionsMenu_Over.png b/indra/newview/skins/default/textures/icons/OptionsMenu_Over.png
deleted file mode 100644
index fcabd4c6d3..0000000000
--- a/indra/newview/skins/default/textures/icons/OptionsMenu_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/OutboxPush_Disabled.png b/indra/newview/skins/default/textures/icons/OutboxPush_Disabled.png
new file mode 100644
index 0000000000..be58114aa1
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/OutboxPush_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/OutboxPush_Off.png b/indra/newview/skins/default/textures/icons/OutboxPush_Off.png
new file mode 100644
index 0000000000..e6b9480ab1
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/OutboxPush_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/OutboxPush_On.png b/indra/newview/skins/default/textures/icons/OutboxPush_On.png
new file mode 100644
index 0000000000..ffda2e92d4
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/OutboxPush_On.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/OutboxPush_On_Over.png b/indra/newview/skins/default/textures/icons/OutboxPush_On_Over.png
new file mode 100644
index 0000000000..6b5911014f
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/OutboxPush_On_Over.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/OutboxPush_Over.png b/indra/newview/skins/default/textures/icons/OutboxPush_Over.png
new file mode 100644
index 0000000000..9c26b92e73
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/OutboxPush_Over.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/OutboxPush_Press.png b/indra/newview/skins/default/textures/icons/OutboxPush_Press.png
new file mode 100644
index 0000000000..3b5d462975
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/OutboxPush_Press.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/OutboxPush_Progress_1.png b/indra/newview/skins/default/textures/icons/OutboxPush_Progress_1.png
new file mode 100644
index 0000000000..f85be047b0
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/OutboxPush_Progress_1.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/OutboxPush_Progress_2.png b/indra/newview/skins/default/textures/icons/OutboxPush_Progress_2.png
new file mode 100644
index 0000000000..cd4e482216
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/OutboxPush_Progress_2.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/OutboxPush_Progress_3.png b/indra/newview/skins/default/textures/icons/OutboxPush_Progress_3.png
new file mode 100644
index 0000000000..d212a871ce
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/OutboxPush_Progress_3.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/OutboxPush_Progress_4.png b/indra/newview/skins/default/textures/icons/OutboxPush_Progress_4.png
new file mode 100644
index 0000000000..e5b6023e36
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/OutboxPush_Progress_4.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/OutboxPush_Progress_5.png b/indra/newview/skins/default/textures/icons/OutboxPush_Progress_5.png
new file mode 100644
index 0000000000..e1911a092f
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/OutboxPush_Progress_5.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/OutboxPush_Progress_6.png b/indra/newview/skins/default/textures/icons/OutboxPush_Progress_6.png
new file mode 100644
index 0000000000..9e59f7843a
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/OutboxPush_Progress_6.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/OutboxPush_Selected.png b/indra/newview/skins/default/textures/icons/OutboxPush_Selected.png
new file mode 100644
index 0000000000..51e8bff646
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/OutboxPush_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/OutboxPush_Selected_Disabled.png b/indra/newview/skins/default/textures/icons/OutboxPush_Selected_Disabled.png
new file mode 100644
index 0000000000..300e2e69e1
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/OutboxPush_Selected_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/OutboxPush_Selected_Over.png b/indra/newview/skins/default/textures/icons/OutboxPush_Selected_Over.png
new file mode 100644
index 0000000000..32fb236381
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/OutboxPush_Selected_Over.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/OutboxPush_Selected_Press.png b/indra/newview/skins/default/textures/icons/OutboxPush_Selected_Press.png
new file mode 100644
index 0000000000..827f343b1e
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/OutboxPush_Selected_Press.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Parcel_Damage_Light_Alt.png b/indra/newview/skins/default/textures/icons/Parcel_Damage_Light_Alt.png
deleted file mode 100644
index d72f02f708..0000000000
--- a/indra/newview/skins/default/textures/icons/Parcel_Damage_Light_Alt.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Parcel_NoScripts_Light.png b/indra/newview/skins/default/textures/icons/Parcel_NoScripts_Light.png
deleted file mode 100644
index f82354959e..0000000000
--- a/indra/newview/skins/default/textures/icons/Parcel_NoScripts_Light.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Parcel_SeeAVsOff_Dark.png b/indra/newview/skins/default/textures/icons/Parcel_SeeAVsOff_Dark.png
new file mode 100644
index 0000000000..956e02b14d
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Parcel_SeeAVsOff_Dark.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Parcel_SeeAVsOff_Light.png b/indra/newview/skins/default/textures/icons/Parcel_SeeAVsOff_Light.png
new file mode 100644
index 0000000000..434caeda8b
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Parcel_SeeAVsOff_Light.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Parcel_SeeAVsOn_Dark.png b/indra/newview/skins/default/textures/icons/Parcel_SeeAVsOn_Dark.png
new file mode 100644
index 0000000000..064687ed0f
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Parcel_SeeAVsOn_Dark.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Parcel_SeeAVsOn_Light.png b/indra/newview/skins/default/textures/icons/Parcel_SeeAVsOn_Light.png
new file mode 100644
index 0000000000..5465650d0c
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Parcel_SeeAVsOn_Light.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Sync_Disabled.png b/indra/newview/skins/default/textures/icons/Sync_Disabled.png
new file mode 100644
index 0000000000..ca2e8def97
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Sync_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Sync_Enabled.png b/indra/newview/skins/default/textures/icons/Sync_Enabled.png
new file mode 100644
index 0000000000..bc236c8b98
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Sync_Enabled.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Sync_Progress_1.png b/indra/newview/skins/default/textures/icons/Sync_Progress_1.png
new file mode 100644
index 0000000000..624e556376
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Sync_Progress_1.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Sync_Progress_2.png b/indra/newview/skins/default/textures/icons/Sync_Progress_2.png
new file mode 100644
index 0000000000..5769803b3f
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Sync_Progress_2.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Sync_Progress_3.png b/indra/newview/skins/default/textures/icons/Sync_Progress_3.png
new file mode 100644
index 0000000000..92d4bfb020
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Sync_Progress_3.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Sync_Progress_4.png b/indra/newview/skins/default/textures/icons/Sync_Progress_4.png
new file mode 100644
index 0000000000..6d43eb3a9f
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Sync_Progress_4.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Sync_Progress_5.png b/indra/newview/skins/default/textures/icons/Sync_Progress_5.png
new file mode 100644
index 0000000000..766d063c99
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Sync_Progress_5.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Sync_Progress_6.png b/indra/newview/skins/default/textures/icons/Sync_Progress_6.png
new file mode 100644
index 0000000000..dfe7f68b72
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Sync_Progress_6.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/TrashItem_Over.png b/indra/newview/skins/default/textures/icons/TrashItem_Over.png
deleted file mode 100644
index 1a0eea6c67..0000000000
--- a/indra/newview/skins/default/textures/icons/TrashItem_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Web_Profile_Off.png b/indra/newview/skins/default/textures/icons/Web_Profile_Off.png
new file mode 100644
index 0000000000..f5fb774a6f
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Web_Profile_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/check_mark.png b/indra/newview/skins/default/textures/icons/check_mark.png
new file mode 100644
index 0000000000..2c05297f4f
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/check_mark.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/parcel_color_EVRY.png b/indra/newview/skins/default/textures/icons/parcel_color_EVRY.png
deleted file mode 100644
index b5508423eb..0000000000
--- a/indra/newview/skins/default/textures/icons/parcel_color_EVRY.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/parcel_color_EXP.png b/indra/newview/skins/default/textures/icons/parcel_color_EXP.png
deleted file mode 100644
index 4813d37198..0000000000
--- a/indra/newview/skins/default/textures/icons/parcel_color_EXP.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/parcel_color_M.png b/indra/newview/skins/default/textures/icons/parcel_color_M.png
deleted file mode 100644
index 41984c43e4..0000000000
--- a/indra/newview/skins/default/textures/icons/parcel_color_M.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/image_edit_icon.tga b/indra/newview/skins/default/textures/image_edit_icon.tga
deleted file mode 100644
index 8666f0bbe6..0000000000
--- a/indra/newview/skins/default/textures/image_edit_icon.tga
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/inv_folder_animation.tga b/indra/newview/skins/default/textures/inv_folder_animation.tga
deleted file mode 100644
index 1b4df7a2d8..0000000000
--- a/indra/newview/skins/default/textures/inv_folder_animation.tga
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/inv_folder_inbox.tga b/indra/newview/skins/default/textures/inv_folder_inbox.tga
deleted file mode 100644
index 04539c2cc4..0000000000
--- a/indra/newview/skins/default/textures/inv_folder_inbox.tga
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/map_avatar_above_8.tga b/indra/newview/skins/default/textures/map_avatar_above_8.tga
deleted file mode 100644
index 193428e530..0000000000
--- a/indra/newview/skins/default/textures/map_avatar_above_8.tga
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/map_avatar_below_8.tga b/indra/newview/skins/default/textures/map_avatar_below_8.tga
deleted file mode 100644
index 9e14bfab90..0000000000
--- a/indra/newview/skins/default/textures/map_avatar_below_8.tga
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/map_avatar_unknown_32.tga b/indra/newview/skins/default/textures/map_avatar_unknown_32.tga
new file mode 100644
index 0000000000..d1192478c6
--- /dev/null
+++ b/indra/newview/skins/default/textures/map_avatar_unknown_32.tga
Binary files differ
diff --git a/indra/newview/skins/default/textures/map_event_adult.tga b/indra/newview/skins/default/textures/map_event_adult.tga
deleted file mode 100644
index f548126e5a..0000000000
--- a/indra/newview/skins/default/textures/map_event_adult.tga
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/map_event_mature.tga b/indra/newview/skins/default/textures/map_event_mature.tga
deleted file mode 100644
index 71067c0dfd..0000000000
--- a/indra/newview/skins/default/textures/map_event_mature.tga
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/map_track_8.tga b/indra/newview/skins/default/textures/map_track_8.tga
deleted file mode 100644
index 53425ff45b..0000000000
--- a/indra/newview/skins/default/textures/map_track_8.tga
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/model_wizard/progress_bar_bg.png b/indra/newview/skins/default/textures/model_wizard/progress_bar_bg.png
new file mode 100644
index 0000000000..d0b213cdc5
--- /dev/null
+++ b/indra/newview/skins/default/textures/model_wizard/progress_bar_bg.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/model_wizard/progress_light.png b/indra/newview/skins/default/textures/model_wizard/progress_light.png
new file mode 100644
index 0000000000..019344f812
--- /dev/null
+++ b/indra/newview/skins/default/textures/model_wizard/progress_light.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/mute_icon.tga b/indra/newview/skins/default/textures/mute_icon.tga
deleted file mode 100644
index 879b9e6188..0000000000
--- a/indra/newview/skins/default/textures/mute_icon.tga
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/navbar/Arrow_Left_Over.png b/indra/newview/skins/default/textures/navbar/Arrow_Left_Over.png
deleted file mode 100644
index a91b74819f..0000000000
--- a/indra/newview/skins/default/textures/navbar/Arrow_Left_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/navbar/Arrow_Right_Over.png b/indra/newview/skins/default/textures/navbar/Arrow_Right_Over.png
deleted file mode 100644
index a2caf227a7..0000000000
--- a/indra/newview/skins/default/textures/navbar/Arrow_Right_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/navbar/Help_Over.png b/indra/newview/skins/default/textures/navbar/Help_Over.png
deleted file mode 100644
index b9bc0d0f87..0000000000
--- a/indra/newview/skins/default/textures/navbar/Help_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/navbar/Home_Over.png b/indra/newview/skins/default/textures/navbar/Home_Over.png
deleted file mode 100644
index d9c6b3842e..0000000000
--- a/indra/newview/skins/default/textures/navbar/Home_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/navbar/separator.png b/indra/newview/skins/default/textures/navbar/separator.png
new file mode 100644
index 0000000000..b93e5791a7
--- /dev/null
+++ b/indra/newview/skins/default/textures/navbar/separator.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/places_rating_adult.tga b/indra/newview/skins/default/textures/places_rating_adult.tga
deleted file mode 100644
index c344fb1e78..0000000000
--- a/indra/newview/skins/default/textures/places_rating_adult.tga
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/places_rating_mature.tga b/indra/newview/skins/default/textures/places_rating_mature.tga
deleted file mode 100644
index 61c879bc92..0000000000
--- a/indra/newview/skins/default/textures/places_rating_mature.tga
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/places_rating_pg.tga b/indra/newview/skins/default/textures/places_rating_pg.tga
deleted file mode 100644
index 7805dbce60..0000000000
--- a/indra/newview/skins/default/textures/places_rating_pg.tga
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/propertyline.tga b/indra/newview/skins/default/textures/propertyline.tga
deleted file mode 100644
index 0c504eea71..0000000000
--- a/indra/newview/skins/default/textures/propertyline.tga
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/quick_tips/avatar_free_mode.png b/indra/newview/skins/default/textures/quick_tips/avatar_free_mode.png
deleted file mode 100644
index be7c87efb6..0000000000
--- a/indra/newview/skins/default/textures/quick_tips/avatar_free_mode.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/quick_tips/camera_free_mode.png b/indra/newview/skins/default/textures/quick_tips/camera_free_mode.png
deleted file mode 100644
index 9a3f3703b2..0000000000
--- a/indra/newview/skins/default/textures/quick_tips/camera_free_mode.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/quick_tips/camera_orbit_mode.png b/indra/newview/skins/default/textures/quick_tips/camera_orbit_mode.png
deleted file mode 100644
index dd72cc0162..0000000000
--- a/indra/newview/skins/default/textures/quick_tips/camera_orbit_mode.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/quick_tips/camera_pan_mode.png b/indra/newview/skins/default/textures/quick_tips/camera_pan_mode.png
deleted file mode 100644
index b537dcbe46..0000000000
--- a/indra/newview/skins/default/textures/quick_tips/camera_pan_mode.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/quick_tips/camera_preset_front_view.png b/indra/newview/skins/default/textures/quick_tips/camera_preset_front_view.png
deleted file mode 100644
index 7674a75ac3..0000000000
--- a/indra/newview/skins/default/textures/quick_tips/camera_preset_front_view.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/quick_tips/camera_preset_group_view.png b/indra/newview/skins/default/textures/quick_tips/camera_preset_group_view.png
deleted file mode 100644
index 9c9b923a5a..0000000000
--- a/indra/newview/skins/default/textures/quick_tips/camera_preset_group_view.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/quick_tips/camera_preset_rear_view.png b/indra/newview/skins/default/textures/quick_tips/camera_preset_rear_view.png
deleted file mode 100644
index 15c3053491..0000000000
--- a/indra/newview/skins/default/textures/quick_tips/camera_preset_rear_view.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/quick_tips/move_fly_first.png b/indra/newview/skins/default/textures/quick_tips/move_fly_first.png
deleted file mode 100644
index b6e2ce60e4..0000000000
--- a/indra/newview/skins/default/textures/quick_tips/move_fly_first.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/quick_tips/move_fly_second.png b/indra/newview/skins/default/textures/quick_tips/move_fly_second.png
deleted file mode 100644
index 84b63cc338..0000000000
--- a/indra/newview/skins/default/textures/quick_tips/move_fly_second.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/quick_tips/move_run_first.png b/indra/newview/skins/default/textures/quick_tips/move_run_first.png
deleted file mode 100644
index 16093dc683..0000000000
--- a/indra/newview/skins/default/textures/quick_tips/move_run_first.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/quick_tips/move_run_second.png b/indra/newview/skins/default/textures/quick_tips/move_run_second.png
deleted file mode 100644
index 19fa43ec32..0000000000
--- a/indra/newview/skins/default/textures/quick_tips/move_run_second.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/quick_tips/move_walk_first.png b/indra/newview/skins/default/textures/quick_tips/move_walk_first.png
deleted file mode 100644
index 92d120d53e..0000000000
--- a/indra/newview/skins/default/textures/quick_tips/move_walk_first.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/quick_tips/move_walk_second.png b/indra/newview/skins/default/textures/quick_tips/move_walk_second.png
deleted file mode 100644
index f8e28722be..0000000000
--- a/indra/newview/skins/default/textures/quick_tips/move_walk_second.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/red_x.png b/indra/newview/skins/default/textures/red_x.png
new file mode 100644
index 0000000000..a61202f09b
--- /dev/null
+++ b/indra/newview/skins/default/textures/red_x.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/show_btn.tga b/indra/newview/skins/default/textures/show_btn.tga
deleted file mode 100644
index 5f05f377e3..0000000000
--- a/indra/newview/skins/default/textures/show_btn.tga
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/show_btn_selected.tga b/indra/newview/skins/default/textures/show_btn_selected.tga
deleted file mode 100644
index 00a2f34a37..0000000000
--- a/indra/newview/skins/default/textures/show_btn_selected.tga
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/smicon_warn.tga b/indra/newview/skins/default/textures/smicon_warn.tga
deleted file mode 100644
index 90ccaa07e5..0000000000
--- a/indra/newview/skins/default/textures/smicon_warn.tga
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/snapshot_download.png b/indra/newview/skins/default/textures/snapshot_download.png
new file mode 100644
index 0000000000..6aa1abded5
--- /dev/null
+++ b/indra/newview/skins/default/textures/snapshot_download.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/snapshot_email.png b/indra/newview/skins/default/textures/snapshot_email.png
new file mode 100644
index 0000000000..dee784a9bf
--- /dev/null
+++ b/indra/newview/skins/default/textures/snapshot_email.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/spacer35.tga b/indra/newview/skins/default/textures/spacer35.tga
deleted file mode 100644
index b88bc6680a..0000000000
--- a/indra/newview/skins/default/textures/spacer35.tga
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/square_btn_32x128.tga b/indra/newview/skins/default/textures/square_btn_32x128.tga
deleted file mode 100644
index d7ce58dac3..0000000000
--- a/indra/newview/skins/default/textures/square_btn_32x128.tga
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/square_btn_selected_32x128.tga b/indra/newview/skins/default/textures/square_btn_selected_32x128.tga
deleted file mode 100644
index 59ca365aa4..0000000000
--- a/indra/newview/skins/default/textures/square_btn_selected_32x128.tga
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/startup_logo.j2c b/indra/newview/skins/default/textures/startup_logo.j2c
deleted file mode 100644
index d1b991f17f..0000000000
--- a/indra/newview/skins/default/textures/startup_logo.j2c
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/status_busy.tga b/indra/newview/skins/default/textures/status_busy.tga
deleted file mode 100644
index 7743d9c7bb..0000000000
--- a/indra/newview/skins/default/textures/status_busy.tga
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/taskpanel/TabIcon_Appearance_Off.png b/indra/newview/skins/default/textures/taskpanel/TabIcon_Appearance_Off.png
deleted file mode 100644
index 0b91abfb0d..0000000000
--- a/indra/newview/skins/default/textures/taskpanel/TabIcon_Appearance_Off.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/taskpanel/TabIcon_Appearance_Selected.png b/indra/newview/skins/default/textures/taskpanel/TabIcon_Appearance_Selected.png
deleted file mode 100644
index 33a47236a5..0000000000
--- a/indra/newview/skins/default/textures/taskpanel/TabIcon_Appearance_Selected.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/taskpanel/TabIcon_Home_Off.png b/indra/newview/skins/default/textures/taskpanel/TabIcon_Home_Off.png
deleted file mode 100644
index 421f5e1705..0000000000
--- a/indra/newview/skins/default/textures/taskpanel/TabIcon_Home_Off.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/taskpanel/TabIcon_Me_Selected.png b/indra/newview/skins/default/textures/taskpanel/TabIcon_Me_Selected.png
deleted file mode 100644
index 905d4c973e..0000000000
--- a/indra/newview/skins/default/textures/taskpanel/TabIcon_Me_Selected.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/taskpanel/TabIcon_People_Selected.png b/indra/newview/skins/default/textures/taskpanel/TabIcon_People_Selected.png
deleted file mode 100644
index 909f0d0a47..0000000000
--- a/indra/newview/skins/default/textures/taskpanel/TabIcon_People_Selected.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/taskpanel/TabIcon_Places_Large.png b/indra/newview/skins/default/textures/taskpanel/TabIcon_Places_Large.png
deleted file mode 100644
index cc505c4a30..0000000000
--- a/indra/newview/skins/default/textures/taskpanel/TabIcon_Places_Large.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/taskpanel/TabIcon_Places_Selected.png b/indra/newview/skins/default/textures/taskpanel/TabIcon_Places_Selected.png
deleted file mode 100644
index 8e0fb9661e..0000000000
--- a/indra/newview/skins/default/textures/taskpanel/TabIcon_Places_Selected.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/taskpanel/TabIcon_Things_Selected.png b/indra/newview/skins/default/textures/taskpanel/TabIcon_Things_Selected.png
deleted file mode 100644
index d4ac451c8e..0000000000
--- a/indra/newview/skins/default/textures/taskpanel/TabIcon_Things_Selected.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index b2658d2525..eabcc68916 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -1,4 +1,4 @@
-<!--
+<!--
This file contains metadata about how to load, display, and scale textures for rendering in the UI.
Images do *NOT* have to appear in this file in order to use them as textures in the UI...simply refer
to them by filename (relative to textures directory).
@@ -39,7 +39,7 @@ with the same filename but different name
<texture name="Accordion_Over" file_name="containers/Accordion_Over.png" preload="false" />
<texture name="Accordion_Selected" file_name="containers/Accordion_Selected.png" preload="false" />
-<texture name="Activate_Checkmark" file_name="taskpanel/Activate_Checkmark.png" preload="false" />
+ <texture name="Activate_Checkmark" file_name="taskpanel/Activate_Checkmark.png" preload="false" />
<texture name="AddItem_Disabled" file_name="icons/AddItem_Disabled.png" preload="false" />
<texture name="AddItem_Off" file_name="icons/AddItem_Off.png" preload="false" />
@@ -48,9 +48,6 @@ with the same filename but different name
<texture name="Arrow_Left_Off" file_name="navbar/Arrow_Left_Off.png" preload="true" />
<texture name="Arrow_Right_Off" file_name="navbar/Arrow_Right_Off.png" preload="true" />
-<!--
--->
-
<texture name="Arrow_Small_Up" file_name="widgets/Arrow_Small_Up.png" preload="true" />
<texture name="Arrow_Small_Left" file_name="widgets/Arrow_Small_Left.png" preload="true" />
<texture name="Arrow_Small_Right" file_name="widgets/Arrow_Small_Right.png" preload="true" />
@@ -72,8 +69,29 @@ with the same filename but different name
<texture name="BackButton_Over" file_name="icons/back_arrow_over.png" preload="false" scale.left="22" scale.top="12" scale.right="25" scale.bottom="12" />
<texture name="BackButton_Press" file_name="icons/back_arrow_press.png" preload="false" scale.left="22" scale.top="12" scale.right="25" scale.bottom="12" />
+ <texture name="Error_Tag_Background" file_name="widgets/Error_Tag_Background.png" preload="true" scale.left="12" scale.top="2" scale.right="36" scale.bottom="2" />
+ <texture name="New_Tag_Background" file_name="widgets/New_Tag_Background.png" preload="true" scale.left="12" scale.top="2" scale.right="36" scale.bottom="2" />
+ <texture name="New_Tag_Border" file_name="widgets/New_Tag_Border.png" preload="true" scale.left="12" scale.top="2" scale.right="36" scale.bottom="2" />
+
+ <texture name="Badge_Background" file_name="widgets/Badge_Background.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" />
+ <texture name="Badge_Border" file_name="widgets/Badge_Border.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" />
+
<texture name="Blank" file_name="Blank.png" preload="false" />
+ <texture name="BreadCrumbBtn_Left_Disabled" file_name="widgets/BreadCrumbBtn_Left_Disabled.png" preload="false"/>
+ <texture name="BreadCrumbBtn_Left_Off" file_name="widgets/BreadCrumbBtn_Left_Off.png" preload="false"/>
+ <texture name="BreadCrumbBtn_Left_Over" file_name="widgets/BreadCrumbBtn_Left_Over.png" preload="false"/>
+ <texture name="BreadCrumbBtn_Left_Press" file_name="widgets/BreadCrumbBtn_Left_Press.png" preload="false"/>
+
+ <texture name="BreadCrumbBtn_Middle_Disabled" file_name="widgets/BreadCrumbBtn_Middle_Disabled.png" preload="false"/>
+ <texture name="BreadCrumbBtn_Middle_Off" file_name="widgets/BreadCrumbBtn_Middle_Off.png" preload="false"/>
+ <texture name="BreadCrumbBtn_Middle_Over" file_name="widgets/BreadCrumbBtn_Middle_Over.png" preload="false"/>
+ <texture name="BreadCrumbBtn_Middle_Press" file_name="widgets/BreadCrumbBtn_Middle_Press.png" preload="false"/>
+
+ <texture name="BreadCrumbBtn_Right_Disabled" file_name="widgets/BreadCrumbBtn_Right_Disabled.png" preload="false"/>
+ <texture name="BreadCrumbBtn_Right_Off" file_name="widgets/BreadCrumbBtn_Right_Off.png" preload="false"/>
+ <texture name="BreadCrumbBtn_Right_Over" file_name="widgets/BreadCrumbBtn_Right_Over.png" preload="false"/>
+ <texture name="BreadCrumbBtn_Right_Press" file_name="widgets/BreadCrumbBtn_Right_Press.png" preload="false"/>
<texture name="BuyArrow_Over" file_name="navbar/BuyArrow_Over.png" preload="true" scale.left="0" scale.top="1" scale.right="0" scale.bottom="0" />
<texture name="BuyArrow_Press" file_name="navbar/BuyArrow_Press.png" preload="true" scale.left="1" scale.top="1" scale.right="0" scale.bottom="0" />
@@ -102,11 +120,44 @@ with the same filename but different name
<texture name="Checkbox_On" file_name="widgets/Checkbox_On.png" preload="true" />
<texture name="Checkbox_On_Press" file_name="widgets/Checkbox_On_Press.png" preload="true" />
<texture name="Checkbox_Press" file_name="widgets/Checkbox_Press.png" preload="true" />
+ <texture name="Check_Mark" file_name="icons/check_mark.png" preload="true" />
+
+ <texture name="Checker" file_name="checker.png" preload="false" />
+
+ <texture name="Command_AboutLand_Icon" file_name="toolbar_icons/land.png" preload="true" />
+ <texture name="Command_Appearance_Icon" file_name="toolbar_icons/appearance.png" preload="true" />
+ <texture name="Command_Avatar_Icon" file_name="toolbar_icons/avatars.png" preload="true" />
+ <texture name="Command_Build_Icon" file_name="toolbar_icons/build.png" preload="true" />
+ <texture name="Command_Chat_Icon" file_name="toolbar_icons/chat.png" preload="true" />
+ <texture name="Command_Compass_Icon" file_name="toolbar_icons/land.png" preload="true" />
+ <texture name="Command_Destinations_Icon" file_name="toolbar_icons/destinations.png" preload="true" />
+ <texture name="Command_Gestures_Icon" file_name="toolbar_icons/gestures.png" preload="true" />
+ <texture name="Command_HowTo_Icon" file_name="toolbar_icons/howto.png" preload="true" />
+ <texture name="Command_Inventory_Icon" file_name="toolbar_icons/inventory.png" preload="true" />
+ <texture name="Command_Map_Icon" file_name="toolbar_icons/map.png" preload="true" />
+ <texture name="Command_Marketplace_Icon" file_name="toolbar_icons/marketplace.png" preload="true" />
+ <texture name="Command_MiniCart_Icon" file_name="toolbar_icons/mini_cart.png" preload="true" />
+ <texture name="Command_MiniMap_Icon" file_name="toolbar_icons/mini_map.png" preload="true" />
+ <texture name="Command_Move_Icon" file_name="toolbar_icons/move.png" preload="true" />
+ <texture name="Command_Outbox_Icon" file_name="toolbar_icons/outbox.png" preload="true" />
+ <texture name="Command_People_Icon" file_name="toolbar_icons/people.png" preload="true" />
+ <texture name="Command_Picks_Icon" file_name="toolbar_icons/picks.png" preload="true" />
+ <texture name="Command_Places_Icon" file_name="toolbar_icons/places.png" preload="true" />
+ <texture name="Command_Preferences_Icon" file_name="toolbar_icons/preferences.png" preload="true" />
+ <texture name="Command_Profile_Icon" file_name="toolbar_icons/profile.png" preload="true" />
+ <texture name="Command_Search_Icon" file_name="toolbar_icons/search.png" preload="true" />
+ <texture name="Command_Snapshot_Icon" file_name="toolbar_icons/snapshot.png" preload="true" />
+ <texture name="Command_Speak_Icon" file_name="toolbar_icons/speak.png" preload="true" />
+ <texture name="Command_View_Icon" file_name="toolbar_icons/view.png" preload="true" />
+ <texture name="Command_Voice_Icon" file_name="toolbar_icons/nearbyvoice.png" preload="true" />
+ <texture name="Caret_Bottom_Icon" file_name="toolbar_icons/caret_bottom.png" preload="true" scale.left="1" scale.top="23" scale.right="15" scale.bottom="1" />
+ <texture name="Caret_Right_Icon" file_name="toolbar_icons/caret_right.png" preload="true" scale.left="5" scale.top="15" scale.right="28" scale.bottom="1" />
+ <texture name="Caret_Left_Icon" file_name="toolbar_icons/caret_left.png" preload="true" scale.left="1" scale.top="15" scale.right="23" scale.bottom="1" />
<texture name="ComboButton_Disabled" file_name="widgets/ComboButton_Disabled.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
<texture name="ComboButton_Selected" file_name="widgets/ComboButton_Selected.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
<texture name="ComboButton_UpSelected" file_name="widgets/ComboButton_UpSelected.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
- <texture name="ComboButton_Up_On_Selected" file_name="widgets/ComboButton_Up_On_Selected.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
+ <texture name="ComboButton_On" file_name="widgets/ComboButton_On.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
<texture name="ComboButton_Off" file_name="widgets/ComboButton_Off.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
<texture name="ComboButton_UpOff" file_name="widgets/ComboButton_UpOff.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
<texture name="Container" file_name="containers/Container.png" preload="false" />
@@ -114,6 +165,7 @@ with the same filename but different name
<texture name="DisclosureArrow_Opened_Off" file_name="widgets/DisclosureArrow_Opened_Off.png" preload="true" />
+ <texture name="ChatBarHandle" file_name="bottomtray/ChatBarHandle.png" preload="false" />
<texture name="DownArrow" file_name="bottomtray/DownArrow.png" preload="false" />
<texture name="DownArrow_Off" file_name="icons/DownArrow_Off.png" preload="false" />
<texture name="Dragbar" file_name="windows/Dragbar.png" preload="false" scale.left="35" scale.top="5" scale.right="29" scale.bottom="5" />
@@ -137,6 +189,10 @@ with the same filename but different name
<texture name="Flag" file_name="navbar/Flag.png" preload="false" />
+ <texture name="Flyout_Left" file_name="windows/Flyout_Left.png" preload="false" />
+ <texture name="Flyout_Pointer" file_name="windows/Flyout_Pointer.png" preload="false" />
+ <texture name="Flyout_Right" file_name="windows/Flyout_Right.png" preload="false" />
+
<texture name="Folder_Arrow" file_name="folder_arrow.tga" preload="false" />
<texture name="ForSale_Badge" file_name="icons/ForSale_Badge.png" preload="false" />
<texture name="ForwardArrow_Off" file_name="icons/ForwardArrow_Off.png" preload="false" />
@@ -209,6 +265,7 @@ with the same filename but different name
<texture name="Inv_LostClosed" file_name="icons/Inv_LostClosed.png" preload="false" />
<texture name="Inv_LostOpen" file_name="icons/Inv_LostOpen.png" preload="false" />
<texture name="Inv_Landmark" file_name="icons/Inv_Landmark.png" preload="false" />
+ <texture name="Inv_Mesh" file_name="icons/Inv_Mesh.png" preload="false" />
<texture name="Inv_Notecard" file_name="icons/Inv_Notecard.png" preload="false" />
<texture name="Inv_Object" file_name="icons/Inv_Object.png" preload="false" />
<texture name="Inv_Object_Multi" file_name="icons/Inv_Object_Multi.png" preload="false" />
@@ -224,6 +281,7 @@ with the same filename but different name
<texture name="Inv_SysClosed" file_name="icons/Inv_SysClosed.png" preload="false" />
<texture name="Inv_SysOpen" file_name="icons/Inv_SysOpen.png" preload="false" />
<texture name="Inv_Tattoo" file_name="icons/Inv_Tattoo.png" preload="false" />
+ <texture name="Inv_Physics" file_name="icons/Inv_Physics.png" preload="false" />
<texture name="Inv_Texture" file_name="icons/Inv_Texture.png" preload="false" />
<texture name="Inv_TrashClosed" file_name="icons/Inv_TrashClosed.png" preload="false" />
<texture name="Inv_TrashOpen" file_name="icons/Inv_TrashOpen.png" preload="false" />
@@ -246,6 +304,8 @@ with the same filename but different name
<texture name="Locked_Icon" file_name="icons/Locked_Icon.png" preload="false" />
+ <texture name="MarketplaceBtn_Off" file_name="widgets/MarketplaceBtn_Off.png" preload="true" scale.left="30" scale.top="19" scale.right="35" scale.bottom="4" />
+ <texture name="MarketplaceBtn_Selected" file_name="widgets/MarketplaceBtn_Selected.png" preload="true" scale.left="30" scale.top="19" scale.right="35" scale.bottom="4" />
<texture name="Microphone_On" file_name="icons/Microphone_On.png" preload="false" />
@@ -255,6 +315,10 @@ with the same filename but different name
<texture name="menu_separator" file_name="navbar/FileMenu_Divider.png" scale.left="4" scale.top="166" scale.right="0" scale.bottom="0" />
+ <texture name="ModelImport_Status_Good" file_name="green_checkmark.png" preload="false"/>
+ <texture name="ModelImport_Status_Warning" file_name="lag_status_warning.tga" preload="false"/>
+ <texture name="ModelImport_Status_Error" file_name="red_x.png" preload="false"/>
+
<texture name="MouseLook_View_Off" file_name="bottomtray/MouseLook_view_off.png" preload="false" />
<texture name="MouseLook_View_On" file_name="bottomtray/MouseLook_view_on.png" preload="false" />
@@ -325,6 +389,10 @@ with the same filename but different name
<texture name="OptionsMenu_Off" file_name="icons/OptionsMenu_Off.png" preload="false" />
<texture name="OptionsMenu_Press" file_name="icons/OptionsMenu_Press.png" preload="false" />
+ <texture name="OutboxStatus_Success" file_name="green_checkmark.png" preload="false" />
+ <texture name="OutboxStatus_Warning" file_name="icons/pop_up_caution.png" preload="false" />
+ <texture name="OutboxStatus_Error" file_name="red_x.png" preload="false" />
+
<texture name="PanOrbit_Off" file_name="bottomtray/PanOrbit_Off.png" preload="false" />
<texture name="Parcel_Exp_Color" file_name="icons/Parcel_Exp_Color.png" preload="false" />
@@ -345,6 +413,10 @@ with the same filename but different name
<texture name="Parcel_ScriptsNo_Dark" file_name="icons/Parcel_ScriptsNo_Dark.png" preload="false" />
<texture name="Parcel_Voice_Dark" file_name="icons/Parcel_Voice_Dark.png" preload="false" />
<texture name="Parcel_VoiceNo_Dark" file_name="icons/Parcel_VoiceNo_Dark.png" preload="false" />
+ <texture name="Parcel_SeeAVsOff_Dark" file_name="icons/Parcel_SeeAVsOff_Dark.png" preload="false" />
+ <texture name="Parcel_SeeAVsOn_Dark" file_name="icons/Parcel_SeeAVsOn_Dark.png" preload="false" />
+ <texture name="Parcel_SeeAVsOff_Light" file_name="icons/Parcel_SeeAVsOff_Light.png" preload="false" />
+ <texture name="Parcel_SeeAVsOn_Light" file_name="icons/Parcel_SeeAVsOn_Light.png" preload="false" />
<texture name="Parcel_BuildNo_Light" file_name="icons/Parcel_BuildNo_Light.png" preload="false" />
<texture name="Parcel_FlyNo_Light" file_name="icons/Parcel_FlyNo_Light.png" preload="false" />
@@ -371,14 +443,15 @@ with the same filename but different name
<texture name="Play_Off" file_name="icons/Play_Off.png" preload="false" />
<texture name="Play_Over" file_name="icons/Play_Over.png" preload="false" />
<texture name="Play_Press" file_name="icons/Play_Press.png" preload="false" />
-
- <texture name="ProgressBar" file_name="widgets/ProgressBar.png" preload="true" scale.left="4" scale.top="10" scale.right="48" scale.bottom="2" />
+
+ <texture name="ProgressBar" file_name="widgets/ProgressBar.png" preload="true" scale.left="4" scale.top="11" scale.right="48" scale.bottom="3" />
<texture name="ProgressTrack" file_name="widgets/ProgressTrack.png" preload="true" scale.left="4" scale.top="13" scale.right="148" scale.bottom="2" />
<texture name="PushButton_Disabled" file_name="widgets/PushButton_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
<texture name="PushButton_Off" file_name="widgets/PushButton_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
<texture name="PushButton_On" file_name="widgets/PushButton_On.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
<texture name="PushButton_On_Selected" file_name="widgets/PushButton_On_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
+ <texture name="PushButton_Over" file_name="widgets/PushButton_Over.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
<texture name="PushButton_Press" file_name="widgets/PushButton_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
<texture name="PushButton_Selected" file_name="widgets/PushButton_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
<texture name="PushButton_Selected_Press" file_name="widgets/PushButton_Selected_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
@@ -392,11 +465,15 @@ with the same filename but different name
<texture name="RadioButton_On_Disabled" file_name="widgets/RadioButton_On_Disabled.png" preload="true" />
- <texture name="Refresh_Off" file_name="icons/Refresh_Off.png" preload="false" />
+ <texture name="Refresh_Off" file_name="icons/Refresh_Off.png" preload="true" />
<texture name="Resize_Corner" file_name="windows/Resize_Corner.png" preload="true" />
- <texture name="Rounded_Rect" file_name="Rounded_Rect.png" preload="true" scale.left="6" scale.top="24" scale.right="58" scale.bottom="6" />
+ <texture name="Rounded_Rect" file_name="Rounded_Rect.png" preload="true" scale.left="6" scale.top="26" scale.right="58" scale.bottom="6" />
+ <texture name="Rounded_Rect_Top" file_name="Rounded_Rect.png" preload="true" scale.left="6" scale.top="8" scale.right="58" scale.bottom="0" clip.left="0" clip.right="64" clip.bottom="16" clip.top="32" />
+ <texture name="Rounded_Rect_Bottom" file_name="Rounded_Rect.png" preload="true" scale.left="6" scale.top="16" scale.right="58" scale.bottom="8" clip.left="0" clip.right="64" clip.bottom="0" clip.top="16" />
+ <texture name="Rounded_Rect_Left" file_name="Rounded_Rect.png" preload="true" scale.left="6" scale.top="26" scale.right="32" scale.bottom="6" clip.left="0" clip.right="32" clip.bottom="0" clip.top="32" />
+ <texture name="Rounded_Rect_Right" file_name="Rounded_Rect.png" preload="true" scale.left="0" scale.top="26" scale.right="26" scale.bottom="6" clip.left="32" clip.right="64" clip.bottom="0" clip.top="32" />
<texture name="Rounded_Square" file_name="rounded_square.j2c" preload="true" scale.left="16" scale.top="16" scale.right="112" scale.bottom="16" />
<texture name="Row_Selection" file_name="navbar/Row_Selection.png" preload="false" />
@@ -460,6 +537,10 @@ with the same filename but different name
<texture name="Unknown_Icon" file_name="icons/unknown_icon.png" preload="true" />
<texture name="Snapshot_Off" file_name="bottomtray/Snapshot_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
+ <texture name="Snapshot_Download" file_name="snapshot_download.png" preload="false" />
+ <texture name="Snapshot_Email" file_name="snapshot_email.png" preload="false" />
+ <texture name="Snapshot_Inventory" file_name="toolbar_icons/inventory.png" preload="false" />
+ <texture name="Snapshot_Profile" file_name="toolbar_icons/profile.png" preload="false" />
<texture name="startup_logo" file_name="windows/startup_logo.png" preload="true" />
@@ -468,25 +549,26 @@ with the same filename but different name
<texture name="Stepper_Up_Off" file_name="widgets/Stepper_Up_Off.png" preload="false" />
<texture name="Stepper_Up_Press" file_name="widgets/Stepper_Up_Press.png" preload="false" />
- <texture name="Stop_Off" file_name="icons/Stop_Off.png" preload="false" />
+ <texture name="Stop_Off" file_name="icons/Stop_Off.png" preload="true" />
<texture name="StopReload_Off" file_name="icons/StopReload_Off.png" preload="false" />
<texture name="StopReload_Over" file_name="icons/StopReload_Over.png" preload="false" />
- <texture name="TabIcon_Appearance_Off" file_name="taskpanel/TabIcon_Appearance_Off.png" preload="false" />
- <texture name="TabIcon_Appearance_Selected" file_name="taskpanel/TabIcon_Appearance_Selected.png" preload="false" />
+ <texture name="Sync_Disabled" file_name="icons/Sync_Disabled.png" preload="true" />
+ <texture name="Sync_Enabled" file_name="icons/Sync_Enabled.png" preload="true" />
+ <texture name="Sync_Progress_1" file_name="icons/Sync_Progress_1.png" preload="true" />
+ <texture name="Sync_Progress_2" file_name="icons/Sync_Progress_2.png" preload="true" />
+ <texture name="Sync_Progress_3" file_name="icons/Sync_Progress_3.png" preload="true" />
+ <texture name="Sync_Progress_4" file_name="icons/Sync_Progress_4.png" preload="true" />
+ <texture name="Sync_Progress_5" file_name="icons/Sync_Progress_5.png" preload="true" />
+ <texture name="Sync_Progress_6" file_name="icons/Sync_Progress_6.png" preload="true" />
+
<texture name="TabIcon_Close_Off" file_name="taskpanel/TabIcon_Close_Off.png" preload="false" />
- <texture name="TabIcon_Home_Off" file_name="taskpanel/TabIcon_Home_Off.png" preload="false" />
<texture name="TabIcon_Home_Selected" file_name="taskpanel/TabIcon_Home_Selected.png" preload="false" />
<texture name="TabIcon_Me_Off" file_name="taskpanel/TabIcon_Me_Off.png" preload="false" />
- <texture name="TabIcon_Me_Selected" file_name="taskpanel/TabIcon_Me_Selected.png" preload="false" />
<texture name="TabIcon_Open_Off" file_name="taskpanel/TabIcon_Open_Off.png" preload="false" />
<texture name="TabIcon_People_Off" file_name="taskpanel/TabIcon_People_Off.png" preload="false" />
- <texture name="TabIcon_People_Selected" file_name="taskpanel/TabIcon_People_Selected.png" preload="false" />
- <texture name="TabIcon_Places_Large" file_name="taskpanel/TabIcon_Places_Large.png" preload="false" />
<texture name="TabIcon_Places_Off" file_name="taskpanel/TabIcon_Places_Off.png" preload="false" />
- <texture name="TabIcon_Places_Selected" file_name="taskpanel/TabIcon_Places_Selected.png" preload="false" />
<texture name="TabIcon_Things_Off" file_name="taskpanel/TabIcon_Things_Off.png" preload="false" />
- <texture name="TabIcon_Things_Selected" file_name="taskpanel/TabIcon_Things_Selected.png" preload="false" />
<texture name="TabTop_Right_Off" file_name="containers/TabTop_Right_Off.png" preload="false" scale.left="8" scale.top="8" scale.right="62" scale.bottom="9" />
<texture name="TabTop_Right_Selected" file_name="containers/TabTop_Right_Selected.png" preload="false" scale.left="8" scale.top="8" scale.right="62" scale.bottom="9" />
@@ -550,14 +632,20 @@ with the same filename but different name
<texture name="VoicePTT_Lvl3" file_name="bottomtray/VoicePTT_Lvl3.png" preload="false" />
<texture name="VoicePTT_Off" file_name="bottomtray/VoicePTT_Off.png" preload="false" />
<texture name="VoicePTT_On" file_name="bottomtray/VoicePTT_On.png" preload="false" />
+
+ <texture name="VoicePTT_Lvl1_Dark" file_name="bottomtray/VoicePTT_Lvl1_Dark.png" preload="false" />
+ <texture name="VoicePTT_Lvl2_Dark" file_name="bottomtray/VoicePTT_Lvl2_Dark.png" preload="false" />
+ <texture name="VoicePTT_Lvl3_Dark" file_name="bottomtray/VoicePTT_Lvl3_Dark.png" preload="false" />
+ <texture name="VoicePTT_Off_Dark" file_name="bottomtray/VoicePTT_Off_Dark.png" preload="false" />
+ <texture name="VoicePTT_On_Dark" file_name="bottomtray/VoicePTT_On_Dark.png" preload="false" />
<texture name="Wearables_Divider" file_name="windows/Wearables_Divider.png" preload="false" />
+ <texture name="Web_Profile_Off" file_name="icons/Web_Profile_Off.png" preload="false" />
+
<texture name="WellButton_Lit" file_name="bottomtray/WellButton_Lit.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
<texture name="WellButton_Lit_Selected" file_name="bottomtray/WellButton_Lit_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
-
-
<texture name="Window_Background" file_name="windows/Window_Background.png" preload="true"
scale.left="4" scale.top="24" scale.right="26" scale.bottom="4" />
<texture name="Window_Foreground" file_name="windows/Window_Foreground.png" preload="true"
@@ -582,9 +670,6 @@ with the same filename but different name
<!--WARNING OLD ART BELOW *do not use*-->
<texture name="icn_media_web.tga" preload="true" />
<texture name="icn_media_movie.tga" preload="true" />
- <texture name="icn_voice-localchat.tga" />
- <texture name="icn_voice-groupfocus.tga" />
- <texture name="icn_voice-pvtfocus.tga" />
<texture name="jump_left_out.tga" file_name="widgets/jump_left_out.png" />
<texture name="jump_left_in.tga" file_name="widgets/jump_left_in.png" />
@@ -618,11 +703,13 @@ with the same filename but different name
<texture name="icon_avatar_offline.tga" />
<texture name="icon_avatar_online.tga" />
- <texture name="icon_day_cycle.tga" />
<texture name="icon_diurnal.tga" />
<texture name="icon_for_sale.tga" file_name="icons/Icon_For_Sale.png" />
<texture name="icon_top_pick.tga" />
+ <texture name="inv_folder_mesh.tga"/>
+ <texture name="inv_item_mesh.tga"/>
+
<texture name="lag_status_critical.tga" />
<texture name="lag_status_good.tga" />
<texture name="lag_status_warning.tga" />
@@ -632,7 +719,6 @@ with the same filename but different name
<texture name="map_avatar_16.tga" />
<texture name="map_avatar_8.tga" />
<texture name="map_event.tga" />
- <texture name="map_event_mature.tga" />
<texture name="map_home.tga" />
<texture name="map_infohub.tga" />
<texture name="map_telehub.tga" />
@@ -671,4 +757,6 @@ with the same filename but different name
<texture name="Yellow_Gradient" file_name="windows/yellow_gradient.png"/>
<texture name="Popup_Caution" file_name="icons/pop_up_caution.png"/>
+ <texture name="Camera_Drag_Dot" file_name="world/CameraDragDot.png"/>
+ <texture name="NavBar Separator" file_name="navbar/separator.png"/>
</textures>
diff --git a/indra/newview/skins/default/textures/toolbar_icons/appearance.png b/indra/newview/skins/default/textures/toolbar_icons/appearance.png
new file mode 100644
index 0000000000..e6b1365388
--- /dev/null
+++ b/indra/newview/skins/default/textures/toolbar_icons/appearance.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/toolbar_icons/avatars.png b/indra/newview/skins/default/textures/toolbar_icons/avatars.png
new file mode 100644
index 0000000000..8fa0600cee
--- /dev/null
+++ b/indra/newview/skins/default/textures/toolbar_icons/avatars.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/toolbar_icons/build.png b/indra/newview/skins/default/textures/toolbar_icons/build.png
new file mode 100644
index 0000000000..e21ab3f0e4
--- /dev/null
+++ b/indra/newview/skins/default/textures/toolbar_icons/build.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/toolbar_icons/caret_bottom.png b/indra/newview/skins/default/textures/toolbar_icons/caret_bottom.png
new file mode 100644
index 0000000000..5f6a01eaa1
--- /dev/null
+++ b/indra/newview/skins/default/textures/toolbar_icons/caret_bottom.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/toolbar_icons/caret_left.png b/indra/newview/skins/default/textures/toolbar_icons/caret_left.png
new file mode 100644
index 0000000000..0b8090314c
--- /dev/null
+++ b/indra/newview/skins/default/textures/toolbar_icons/caret_left.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/toolbar_icons/caret_right.png b/indra/newview/skins/default/textures/toolbar_icons/caret_right.png
new file mode 100644
index 0000000000..044751560f
--- /dev/null
+++ b/indra/newview/skins/default/textures/toolbar_icons/caret_right.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/toolbar_icons/chat.png b/indra/newview/skins/default/textures/toolbar_icons/chat.png
new file mode 100644
index 0000000000..e0dbac495f
--- /dev/null
+++ b/indra/newview/skins/default/textures/toolbar_icons/chat.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/toolbar_icons/destinations.png b/indra/newview/skins/default/textures/toolbar_icons/destinations.png
new file mode 100644
index 0000000000..e2325f083a
--- /dev/null
+++ b/indra/newview/skins/default/textures/toolbar_icons/destinations.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/toolbar_icons/gestures.png b/indra/newview/skins/default/textures/toolbar_icons/gestures.png
new file mode 100644
index 0000000000..2404bb4e25
--- /dev/null
+++ b/indra/newview/skins/default/textures/toolbar_icons/gestures.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/toolbar_icons/howto.png b/indra/newview/skins/default/textures/toolbar_icons/howto.png
new file mode 100644
index 0000000000..8594d71113
--- /dev/null
+++ b/indra/newview/skins/default/textures/toolbar_icons/howto.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/toolbar_icons/inventory.png b/indra/newview/skins/default/textures/toolbar_icons/inventory.png
new file mode 100644
index 0000000000..ab3191255e
--- /dev/null
+++ b/indra/newview/skins/default/textures/toolbar_icons/inventory.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/toolbar_icons/land.png b/indra/newview/skins/default/textures/toolbar_icons/land.png
new file mode 100644
index 0000000000..89ea7604a4
--- /dev/null
+++ b/indra/newview/skins/default/textures/toolbar_icons/land.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/toolbar_icons/map.png b/indra/newview/skins/default/textures/toolbar_icons/map.png
new file mode 100644
index 0000000000..ed1049b7db
--- /dev/null
+++ b/indra/newview/skins/default/textures/toolbar_icons/map.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/toolbar_icons/marketplace.png b/indra/newview/skins/default/textures/toolbar_icons/marketplace.png
new file mode 100644
index 0000000000..62bad20be6
--- /dev/null
+++ b/indra/newview/skins/default/textures/toolbar_icons/marketplace.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/toolbar_icons/mini_cart.png b/indra/newview/skins/default/textures/toolbar_icons/mini_cart.png
new file mode 100644
index 0000000000..9fcf46794d
--- /dev/null
+++ b/indra/newview/skins/default/textures/toolbar_icons/mini_cart.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/toolbar_icons/mini_map.png b/indra/newview/skins/default/textures/toolbar_icons/mini_map.png
new file mode 100644
index 0000000000..ab0a654056
--- /dev/null
+++ b/indra/newview/skins/default/textures/toolbar_icons/mini_map.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/toolbar_icons/move.png b/indra/newview/skins/default/textures/toolbar_icons/move.png
new file mode 100644
index 0000000000..5c2ced7375
--- /dev/null
+++ b/indra/newview/skins/default/textures/toolbar_icons/move.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/toolbar_icons/nearbyvoice.png b/indra/newview/skins/default/textures/toolbar_icons/nearbyvoice.png
new file mode 100644
index 0000000000..77a7cd5f44
--- /dev/null
+++ b/indra/newview/skins/default/textures/toolbar_icons/nearbyvoice.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/toolbar_icons/outbox.png b/indra/newview/skins/default/textures/toolbar_icons/outbox.png
new file mode 100644
index 0000000000..0f3db1c47c
--- /dev/null
+++ b/indra/newview/skins/default/textures/toolbar_icons/outbox.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/toolbar_icons/people.png b/indra/newview/skins/default/textures/toolbar_icons/people.png
new file mode 100644
index 0000000000..7228ae8e2f
--- /dev/null
+++ b/indra/newview/skins/default/textures/toolbar_icons/people.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/toolbar_icons/picks.png b/indra/newview/skins/default/textures/toolbar_icons/picks.png
new file mode 100644
index 0000000000..befda04b42
--- /dev/null
+++ b/indra/newview/skins/default/textures/toolbar_icons/picks.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/toolbar_icons/places.png b/indra/newview/skins/default/textures/toolbar_icons/places.png
new file mode 100644
index 0000000000..97d9fa066c
--- /dev/null
+++ b/indra/newview/skins/default/textures/toolbar_icons/places.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/toolbar_icons/preferences.png b/indra/newview/skins/default/textures/toolbar_icons/preferences.png
new file mode 100644
index 0000000000..4ccd7b8ae1
--- /dev/null
+++ b/indra/newview/skins/default/textures/toolbar_icons/preferences.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/toolbar_icons/profile.png b/indra/newview/skins/default/textures/toolbar_icons/profile.png
new file mode 100644
index 0000000000..32fe2bf8ac
--- /dev/null
+++ b/indra/newview/skins/default/textures/toolbar_icons/profile.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/toolbar_icons/search.png b/indra/newview/skins/default/textures/toolbar_icons/search.png
new file mode 100644
index 0000000000..bcb11e950d
--- /dev/null
+++ b/indra/newview/skins/default/textures/toolbar_icons/search.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/toolbar_icons/snapshot.png b/indra/newview/skins/default/textures/toolbar_icons/snapshot.png
new file mode 100644
index 0000000000..d26da9b1d2
--- /dev/null
+++ b/indra/newview/skins/default/textures/toolbar_icons/snapshot.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/toolbar_icons/speak.png b/indra/newview/skins/default/textures/toolbar_icons/speak.png
new file mode 100644
index 0000000000..10cd354c5c
--- /dev/null
+++ b/indra/newview/skins/default/textures/toolbar_icons/speak.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/toolbar_icons/view.png b/indra/newview/skins/default/textures/toolbar_icons/view.png
new file mode 100644
index 0000000000..ddf0df7c26
--- /dev/null
+++ b/indra/newview/skins/default/textures/toolbar_icons/view.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/Badge_Background.png b/indra/newview/skins/default/textures/widgets/Badge_Background.png
new file mode 100644
index 0000000000..5089c30312
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/Badge_Background.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/Badge_Border.png b/indra/newview/skins/default/textures/widgets/Badge_Border.png
new file mode 100644
index 0000000000..4b086a63fb
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/Badge_Border.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Left_Disabled.png b/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Left_Disabled.png
new file mode 100644
index 0000000000..c7c0eaa96b
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Left_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Left_Off.png b/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Left_Off.png
new file mode 100644
index 0000000000..4a73c254fc
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Left_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Left_Over.png b/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Left_Over.png
new file mode 100644
index 0000000000..6fb5c432de
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Left_Over.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Left_Press.png b/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Left_Press.png
new file mode 100644
index 0000000000..fa18517933
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Left_Press.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Middle_Disabled.png b/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Middle_Disabled.png
new file mode 100644
index 0000000000..bed1a701bd
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Middle_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Middle_Off.png b/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Middle_Off.png
new file mode 100644
index 0000000000..57ce9af574
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Middle_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Middle_Over.png b/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Middle_Over.png
new file mode 100644
index 0000000000..2c43022f0e
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Middle_Over.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Middle_Press.png b/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Middle_Press.png
new file mode 100644
index 0000000000..6b8c1baca4
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Middle_Press.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Right_Disabled.png b/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Right_Disabled.png
new file mode 100644
index 0000000000..51505e80c5
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Right_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Right_Off.png b/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Right_Off.png
new file mode 100644
index 0000000000..9f93efbd93
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Right_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Right_Over.png b/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Right_Over.png
new file mode 100644
index 0000000000..3a4ec1a315
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Right_Over.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Right_Press.png b/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Right_Press.png
new file mode 100644
index 0000000000..1f1b4c2ed5
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/BreadCrumbBtn_Right_Press.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/Checkbox_On_Over.png b/indra/newview/skins/default/textures/widgets/Checkbox_On_Over.png
deleted file mode 100644
index bc504d130e..0000000000
--- a/indra/newview/skins/default/textures/widgets/Checkbox_On_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/Checkbox_Over.png b/indra/newview/skins/default/textures/widgets/Checkbox_Over.png
deleted file mode 100644
index 5a7162addf..0000000000
--- a/indra/newview/skins/default/textures/widgets/Checkbox_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/ComboButton_Up_On_Selected.png b/indra/newview/skins/default/textures/widgets/ComboButton_Up_On_Selected.png
deleted file mode 100644
index fd1d11dd0b..0000000000
--- a/indra/newview/skins/default/textures/widgets/ComboButton_Up_On_Selected.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/DisclosureArrow_Closed_Over.png b/indra/newview/skins/default/textures/widgets/DisclosureArrow_Closed_Over.png
deleted file mode 100644
index 45bcb0464e..0000000000
--- a/indra/newview/skins/default/textures/widgets/DisclosureArrow_Closed_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/DisclosureArrow_Opened_Over.png b/indra/newview/skins/default/textures/widgets/DisclosureArrow_Opened_Over.png
deleted file mode 100644
index dabbd85b34..0000000000
--- a/indra/newview/skins/default/textures/widgets/DisclosureArrow_Opened_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/Error_Tag_Background.png b/indra/newview/skins/default/textures/widgets/Error_Tag_Background.png
new file mode 100644
index 0000000000..c8dbc8e87a
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/Error_Tag_Background.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/MarketplaceBtn_Off.png b/indra/newview/skins/default/textures/widgets/MarketplaceBtn_Off.png
new file mode 100644
index 0000000000..e603c44384
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/MarketplaceBtn_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/MarketplaceBtn_Selected.png b/indra/newview/skins/default/textures/widgets/MarketplaceBtn_Selected.png
new file mode 100644
index 0000000000..fbc164123f
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/MarketplaceBtn_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/New_Tag_Background.png b/indra/newview/skins/default/textures/widgets/New_Tag_Background.png
new file mode 100644
index 0000000000..cd639dd80f
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/New_Tag_Background.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/New_Tag_Border.png b/indra/newview/skins/default/textures/widgets/New_Tag_Border.png
new file mode 100644
index 0000000000..56df0d0127
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/New_Tag_Border.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/ProgressBar.png b/indra/newview/skins/default/textures/widgets/ProgressBar.png
index edf11ac1f5..3f0e4eba28 100644
--- a/indra/newview/skins/default/textures/widgets/ProgressBar.png
+++ b/indra/newview/skins/default/textures/widgets/ProgressBar.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/PushButton_On_Over.png b/indra/newview/skins/default/textures/widgets/PushButton_On_Over.png
deleted file mode 100644
index 064a4c4f7f..0000000000
--- a/indra/newview/skins/default/textures/widgets/PushButton_On_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/PushButton_Selected_Over.png b/indra/newview/skins/default/textures/widgets/PushButton_Selected_Over.png
deleted file mode 100644
index 064a4c4f7f..0000000000
--- a/indra/newview/skins/default/textures/widgets/PushButton_Selected_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/RadioButton_On_Over.png b/indra/newview/skins/default/textures/widgets/RadioButton_On_Over.png
deleted file mode 100644
index 3e7d803a28..0000000000
--- a/indra/newview/skins/default/textures/widgets/RadioButton_On_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/RadioButton_Over.png b/indra/newview/skins/default/textures/widgets/RadioButton_Over.png
deleted file mode 100644
index a5c8cbe293..0000000000
--- a/indra/newview/skins/default/textures/widgets/RadioButton_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/ScrollArrow_Down_Over.png b/indra/newview/skins/default/textures/widgets/ScrollArrow_Down_Over.png
deleted file mode 100644
index 605d159eaa..0000000000
--- a/indra/newview/skins/default/textures/widgets/ScrollArrow_Down_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/ScrollArrow_Left_Over.png b/indra/newview/skins/default/textures/widgets/ScrollArrow_Left_Over.png
deleted file mode 100644
index c79547dffd..0000000000
--- a/indra/newview/skins/default/textures/widgets/ScrollArrow_Left_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/ScrollArrow_Right_Over.png b/indra/newview/skins/default/textures/widgets/ScrollArrow_Right_Over.png
deleted file mode 100644
index e353542ad9..0000000000
--- a/indra/newview/skins/default/textures/widgets/ScrollArrow_Right_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/ScrollArrow_Up_Over.png b/indra/newview/skins/default/textures/widgets/ScrollArrow_Up_Over.png
deleted file mode 100644
index dd2fceb716..0000000000
--- a/indra/newview/skins/default/textures/widgets/ScrollArrow_Up_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/ScrollThumb_Horiz_Over.png b/indra/newview/skins/default/textures/widgets/ScrollThumb_Horiz_Over.png
deleted file mode 100644
index cf78ea3924..0000000000
--- a/indra/newview/skins/default/textures/widgets/ScrollThumb_Horiz_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/ScrollThumb_Vert_Over.png b/indra/newview/skins/default/textures/widgets/ScrollThumb_Vert_Over.png
deleted file mode 100644
index 53587197da..0000000000
--- a/indra/newview/skins/default/textures/widgets/ScrollThumb_Vert_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On.png
deleted file mode 100644
index 7afb9c99c3..0000000000
--- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On_Disabled.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On_Disabled.png
deleted file mode 100644
index 77c4224539..0000000000
--- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On_Disabled.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On_Over.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On_Over.png
deleted file mode 100644
index 8b93dd551e..0000000000
--- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On_Selected.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On_Selected.png
deleted file mode 100644
index 3f207cbea2..0000000000
--- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On_Selected.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_On.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_On.png
deleted file mode 100644
index 220df9db25..0000000000
--- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_On.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_On_Over.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_On_Over.png
deleted file mode 100644
index 5bbcdcb0b4..0000000000
--- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_On_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_On_Press.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_On_Press.png
deleted file mode 100644
index dde367f05e..0000000000
--- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_On_Press.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Over.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Over.png
deleted file mode 100644
index d4f30b9adb..0000000000
--- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected_Over.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected_Over.png
deleted file mode 100644
index 5bbcdcb0b4..0000000000
--- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_On.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_On.png
deleted file mode 100644
index 467c43fc90..0000000000
--- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_On.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_On_Over.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_On_Over.png
deleted file mode 100644
index 2049736897..0000000000
--- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_On_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Selected_Over.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Selected_Over.png
deleted file mode 100644
index 2049736897..0000000000
--- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Selected_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/SliderThumb_Over.png b/indra/newview/skins/default/textures/widgets/SliderThumb_Over.png
deleted file mode 100644
index b6f900d3bd..0000000000
--- a/indra/newview/skins/default/textures/widgets/SliderThumb_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/Stepper_Down_Over.png b/indra/newview/skins/default/textures/widgets/Stepper_Down_Over.png
deleted file mode 100644
index 01e0a2d9f1..0000000000
--- a/indra/newview/skins/default/textures/widgets/Stepper_Down_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/Stepper_Up_Over.png b/indra/newview/skins/default/textures/widgets/Stepper_Up_Over.png
deleted file mode 100644
index 2ce84ea5be..0000000000
--- a/indra/newview/skins/default/textures/widgets/Stepper_Up_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/windows/Flyout.png b/indra/newview/skins/default/textures/windows/Flyout.png
deleted file mode 100644
index 5596b194c9..0000000000
--- a/indra/newview/skins/default/textures/windows/Flyout.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/windows/Flyout_Left.png b/indra/newview/skins/default/textures/windows/Flyout_Left.png
new file mode 100644
index 0000000000..6ac9fe2efd
--- /dev/null
+++ b/indra/newview/skins/default/textures/windows/Flyout_Left.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/windows/Flyout_Pointer_Up.png b/indra/newview/skins/default/textures/windows/Flyout_Pointer_Up.png
deleted file mode 100644
index 361fab59e0..0000000000
--- a/indra/newview/skins/default/textures/windows/Flyout_Pointer_Up.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/windows/Flyout_Right.png b/indra/newview/skins/default/textures/windows/Flyout_Right.png
new file mode 100644
index 0000000000..aa1f0625aa
--- /dev/null
+++ b/indra/newview/skins/default/textures/windows/Flyout_Right.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/windows/Icon_Gear_Over.png b/indra/newview/skins/default/textures/windows/Icon_Gear_Over.png
deleted file mode 100644
index 67bd399358..0000000000
--- a/indra/newview/skins/default/textures/windows/Icon_Gear_Over.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/windows/Icon_Undock_Press.png b/indra/newview/skins/default/textures/windows/Icon_Undock_Press.png
deleted file mode 100644
index 3ab8c3666a..0000000000
--- a/indra/newview/skins/default/textures/windows/Icon_Undock_Press.png
+++ /dev/null
Binary files differ
diff --git a/indra/newview/skins/default/textures/world/CameraDragDot.png b/indra/newview/skins/default/textures/world/CameraDragDot.png
new file mode 100644
index 0000000000..57698e1956
--- /dev/null
+++ b/indra/newview/skins/default/textures/world/CameraDragDot.png
Binary files differ
diff --git a/indra/newview/skins/default/xui/da/floater_about.xml b/indra/newview/skins/default/xui/da/floater_about.xml
index 9b1df65d1b..fc8bc33096 100644
--- a/indra/newview/skins/default/xui/da/floater_about.xml
+++ b/indra/newview/skins/default/xui/da/floater_about.xml
@@ -10,7 +10,7 @@
<floater.string name="AboutPosition">
Du er ved [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] i regionen [REGION] lokaliseret ved &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ([HOSTIP])
[SERVER_VERSION]
-[[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]]
+[SERVER_RELEASE_NOTES_URL]
</floater.string>
<floater.string name="AboutSystem">
CPU: [CPU]
@@ -56,24 +56,30 @@ Tak til følgende beboere: Drew Dwi, Zai Lynch, Latif Khalifa, Ellla McMahon, Ha
<panel label="Licenser" name="licenses_panel">
<text_editor name="credits_editor">
3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion
- APR Copyright (C) 2000-2004 The Apache Software Foundation
- cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)
- DBus/dbus-glib Copyright (C) 2002, 2003 CodeFactory AB / Copyright (C) 2003, 2004 Red Hat, Inc.
- expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.
- FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org).
- GL Copyright (C) 1999-2004 Brian Paul.
- Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.
- jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)
- jpeglib Copyright (C) 1991-1998, Thomas G. Lane.
- ogg/vorbis Copyright (C) 2001, Xiphophorus
- OpenSSL Copyright (C) 1998-2002 The OpenSSL Project.
- SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
- SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
- xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
- zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler.
- google-perftools Copyright (c) 2005, Google Inc.
+APR Copyright (C) 2000-2004 The Apache Software Foundation
+Collada DOM Copyright 2005 Sony Computer Entertainment Inc.
+cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)
+DBus/dbus-glib Copyright (C) 2002, 2003 CodeFactory AB / Copyright (C) 2003, 2004 Red Hat, Inc.
+expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.
+FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org).
+GL Copyright (C) 1999-2004 Brian Paul.
+GLOD Copyright (C) 2003-04 Jonathan Cohen, Nat Duca, Chris Niski, Johns Hopkins University and David Luebke, Brenden Schubert, University of Virginia.
+google-perftools Copyright (c) 2005, Google Inc.
+Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.
+jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)
+jpeglib Copyright (C) 1991-1998, Thomas G. Lane.
+ogg/vorbis Copyright (C) 2001, Xiphophorus
+OpenSSL Copyright (C) 1998-2002 The OpenSSL Project.
+PCRE Copyright (c) 1997-2008 University of Cambridge
+SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
+SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
+zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler.
+google-perftools Copyright (c) 2005, Google Inc.
-Alle rettigheder forbeholdes. Se licenses.txt for detaljer.
+Second Life Viewer uses Havok (TM) Physics. (c)Copyright 1999-2010 Havok.com Inc. (and its Licensors). All Rights Reserved. See www.havok.com for details.
+
+All rights reserved. See licenses.txt for details.
Voice chat Audio coding: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
</text_editor>
diff --git a/indra/newview/skins/default/xui/da/floater_about_land.xml b/indra/newview/skins/default/xui/da/floater_about_land.xml
index a096a87928..5b9e618666 100644
--- a/indra/newview/skins/default/xui/da/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/da/floater_about_land.xml
@@ -87,15 +87,9 @@ Gå til &apos;Verden&apos; &gt; &apos;Om land&apos; eller vælg en anden parcel
<text name="Owner:">
Ejer:
</text>
- <text name="OwnerText">
- Leyla Linden
- </text>
<text name="Group:">
Gruppe:
</text>
- <text name="GroupText">
- Leyla Linden
- </text>
<button label="Vælg" name="Set..."/>
<check_box label="Tillad dedikering til gruppe" name="check deed" tool_tip="En gruppe administrator kan dedikere denne jord til gruppen, så det vil blive støttet af gruppen&apos;s jord tildeling."/>
<button label="Dedikér" name="Deed..." tool_tip="Du kan kun dedikere jord, hvis du er en administrator i den valgte gruppe."/>
@@ -318,17 +312,17 @@ Kun større parceller kan vises i søgning.
</text>
<check_box label="Redigere terræn" name="edit land check" tool_tip="Hvis dette er valg, kan enhver redigere dit land. Det er bedst ikke at vælge her, da det altid er muligt for dig som ejer at ændre terræn på dit eget land."/>
<check_box label="Flyve" name="check fly" tool_tip="Hvis valgt, kan beboere flyve på dit land. Hvis ikke valgt kan beboere kun flyve ind på dit land og over dit land."/>
- <text left="194" name="allow_label2">
+ <text name="allow_label2">
Lave objekter:
</text>
<check_box label="Alle beboere" name="edit objects check"/>
<check_box label="Gruppe" name="edit group objects check"/>
- <text left="170" name="allow_label3">
+ <text name="allow_label3">
Anbringe objekter:
</text>
<check_box label="Alle beboere" name="all object entry check"/>
<check_box label="Gruppe" name="group object entry check"/>
- <text left="200" name="allow_label4">
+ <text name="allow_label4">
Køre scripts:
</text>
<check_box label="Alle beboere" name="check other scripts"/>
@@ -352,6 +346,7 @@ Kun større parceller kan vises i søgning.
<combo_box.item label="Parker &amp; natur" name="item9"/>
<combo_box.item label="Beboelse" name="item10"/>
<combo_box.item label="Indkøb" name="item11"/>
+ <combo_box.item label="Leje" name="item13"/>
<combo_box.item label="Andet" name="item12"/>
</combo_box>
<combo_box name="land category">
@@ -366,6 +361,7 @@ Kun større parceller kan vises i søgning.
<combo_box.item label="Parker &amp; natur" name="item9"/>
<combo_box.item label="Beboelse" name="item10"/>
<combo_box.item label="Indkøb" name="item11"/>
+ <combo_box.item label="Leje" name="item13"/>
<combo_box.item label="Andet" name="item12"/>
</combo_box>
<check_box label="Mature indhold" name="MatureCheck" tool_tip=""/>
@@ -396,7 +392,6 @@ Kun større parceller kan vises i søgning.
Hjemmeside:
</text>
<button label="Vælg" name="set_media_url"/>
- <check_box label="Skjul medie URL" name="hide_media_url" tool_tip="Klik her for at skjule medie adressen så det kun er dig og evt. parcel gruppens ejer/administratorer der kan se den."/>
<text left="4" name="Description:">
Beskrivelse:
</text>
@@ -424,7 +419,6 @@ Kun større parceller kan vises i søgning.
<check_box label="Gentag afspil" name="media_loop" tool_tip="Gentager automatisk medie, når det er færdigt med at spille starter det automatisk forfra."/>
</panel>
<panel label="LYD" name="land_audio_panel">
- <check_box label="Skjul URL" name="hide_music_url" tool_tip="Ved at vælge her, vil musik URL skjules for alle ikke autoriserede brugere der læser denne parcels information."/>
<check_box label="Tillad stemmer" name="parcel_enable_voice_channel"/>
<check_box label="Tillad stemmer (håndteret af estate)" name="parcel_enable_voice_channel_is_estate_disabled"/>
<check_box label="Begræns stemme chat til denne parcel" name="parcel_enable_voice_channel_local"/>
@@ -434,7 +428,7 @@ Kun større parceller kan vises i søgning.
(Defineret via estate)
</panel.string>
<panel.string name="allow_public_access">
- Tillad adgang for alle ([MATURITY])
+ Tillad offentlig adgang ([MATURITY]) (Bemærk: Ellers oprettes blokeringslinier)
</panel.string>
<panel.string name="estate_override">
En eller flere af disse valg er indstillet på estate niveau
diff --git a/indra/newview/skins/default/xui/da/floater_beacons.xml b/indra/newview/skins/default/xui/da/floater_beacons.xml
index 8049b072ce..5100a6df1f 100644
--- a/indra/newview/skins/default/xui/da/floater_beacons.xml
+++ b/indra/newview/skins/default/xui/da/floater_beacons.xml
@@ -17,5 +17,6 @@
<check_box label="Kun berøring" name="touch_only"/>
<check_box label="Lydkilder" name="sounds"/>
<check_box label="Partikel kilder" name="particles"/>
+ <check_box label="Medie kilder" name="moapbeacon"/>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_buy_contents.xml b/indra/newview/skins/default/xui/da/floater_buy_contents.xml
index c2b2ccc244..085fa2f9cc 100644
--- a/indra/newview/skins/default/xui/da/floater_buy_contents.xml
+++ b/indra/newview/skins/default/xui/da/floater_buy_contents.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_buy_contents" title="KØB INDHOLD">
<text name="contains_text">
- [NAME] indeholder:
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; contains:
</text>
<text name="buy_text">
Køb for L$[AMOUNT] fra [NAME]?
diff --git a/indra/newview/skins/default/xui/da/floater_buy_currency.xml b/indra/newview/skins/default/xui/da/floater_buy_currency.xml
index ec6ac5b2a8..3c0428b2b0 100644
--- a/indra/newview/skins/default/xui/da/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/da/floater_buy_currency.xml
@@ -46,13 +46,14 @@
L$ [AMT]
</text>
<text name="currency_links">
- [http://www.secondlife.com/my/account/payment_method_management.php payment method] | [http://www.secondlife.com/my/account/currency.php currency] | [http://www.secondlife.com/my/account/exchange_rates.php exchange rate]
+ [http://www.secondlife.com/my/account/payment_method_management.php payment method] | [http://www.secondlife.com/my/account/currency.php currency]
</text>
<text name="exchange_rate_note">
Indtast beløbet for at se nyeste valutakurs.
</text>
<text name="purchase_warning_repurchase">
- Bekræftelse af dette køb medfører kun køb af L$, ikke objektet.
+ Bekræftelse af dette køb medfører kun køb af L$, ikke
+objektet.
</text>
<text name="purchase_warning_notenough">
Du køber ikke nok L$. Forøg venligst beløbet.
diff --git a/indra/newview/skins/default/xui/da/floater_camera.xml b/indra/newview/skins/default/xui/da/floater_camera.xml
index 5b7ef6db54..b5d5e8bc08 100644
--- a/indra/newview/skins/default/xui/da/floater_camera.xml
+++ b/indra/newview/skins/default/xui/da/floater_camera.xml
@@ -9,15 +9,6 @@
<floater.string name="move_tooltip">
Flyt kamera op og ned, til venstre og højre
</floater.string>
- <floater.string name="camera_modes_title">
- Kamera valg
- </floater.string>
- <floater.string name="pan_mode_title">
- Kredsløb zoom panorering
- </floater.string>
- <floater.string name="presets_mode_title">
- Forvalg
- </floater.string>
<floater.string name="free_mode_title">
Se objekt
</floater.string>
diff --git a/indra/newview/skins/default/xui/da/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/da/floater_day_cycle_options.xml
deleted file mode 100644
index ffae3d788f..0000000000
--- a/indra/newview/skins/default/xui/da/floater_day_cycle_options.xml
+++ /dev/null
@@ -1,96 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Day Cycle Floater" title="DAG CYKLUS OPSÆTNING">
- <tab_container name="Day Cycle Tabs">
- <panel label="Dag cyklus" name="Day Cycle">
- <button label="?" name="WLDayCycleHelp"/>
- <multi_slider label="" name="WLTimeSlider"/>
- <multi_slider label="" name="WLDayCycleKeys"/>
- <text name="WL12am">
- 00:00
- </text>
- <text name="WL3am">
- 03:00
- </text>
- <text name="WL6am">
- 06:00
- </text>
- <text name="WL9amHash">
- 09:00
- </text>
- <text name="WL12pmHash">
- 12:00
- </text>
- <text name="WL3pm">
- 15:00
- </text>
- <text name="WL6pm">
- 18:00
- </text>
- <text name="WL9pm">
- 21:00
- </text>
- <text name="WL12am2">
- 00:00
- </text>
- <text name="WL12amHash">
- |
- </text>
- <text name="WL3amHash">
- I
- </text>
- <text name="WL6amHash">
- |
- </text>
- <text name="WL9amHash2">
- I
- </text>
- <text name="WL12pmHash2">
- |
- </text>
- <text name="WL3pmHash">
- I
- </text>
- <text name="WL6pmHash">
- |
- </text>
- <text name="WL9pmHash">
- I
- </text>
- <text name="WL12amHash2">
- |
- </text>
- <button label="Tilføj key" label_selected="Tilføj key" name="WLAddKey"/>
- <button label="Slet key" label_selected="Slet key" name="WLDeleteKey"/>
- <text name="WLCurKeyFrameText">
- Key-frame indstillinger:
- </text>
- <text name="WLCurKeyTimeText">
- Key tid:
- </text>
- <spinner label="Timer" name="WLCurKeyHour"/>
- <spinner label="Min." name="WLCurKeyMin"/>
- <text name="WLCurKeyTimeText2">
- Key fast indstilling:
- </text>
- <combo_box label="Faste" name="WLKeyPresets"/>
- <text name="DayCycleText">
- Snap:
- </text>
- <combo_box label="5 min" name="WLSnapOptions"/>
- <text name="DayCycleText2">
- Cycluslængde:
- </text>
- <spinner label="Timer" name="WLLengthOfDayHour"/>
- <spinner label="Min." name="WLLengthOfDayMin"/>
- <spinner label="Sek." name="WLLengthOfDaySec"/>
- <text name="DayCycleText3">
- Vis :
- </text>
- <button label="Afspil" label_selected="Afspil" name="WLAnimSky"/>
- <button label="Stop!" label_selected="Stop" name="WLStopAnimSky"/>
- <button label="Benyt estate tid" label_selected="GÃ¥ til estate tid" name="WLUseLindenTime"/>
- <button label="Gem test-dag" label_selected="Gem test-dag" name="WLSaveDayCycle"/>
- <button label="Hent test-dag" label_selected="Hent test-dag" name="WLLoadDayCycle"/>
- </panel>
- </tab_container>
-</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_env_settings.xml b/indra/newview/skins/default/xui/da/floater_env_settings.xml
deleted file mode 100644
index 8d9c05500b..0000000000
--- a/indra/newview/skins/default/xui/da/floater_env_settings.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Environment Editor Floater" title="REDIGERING AF OMGIVELSER">
- <floater.string name="timeStr">
- [hour12,datetime,utc]:[min,datetime,utc] [ampm,datetime,utc]
- </floater.string>
- <text name="EnvTimeText">
- Tid på dagen
- </text>
- <text name="EnvTimeText2">
- 00:00
- </text>
- <slider label="" name="EnvTimeSlider"/>
- <text name="EnvCloudText">
- Skydække
- </text>
- <slider label="" name="EnvCloudSlider"/>
- <text name="EnvWaterColorText">
- Farve på vand
- </text>
- <color_swatch label="" name="EnvWaterColor" tool_tip="Klik for at åbne farvevælger"/>
- <text name="EnvWaterFogText">
- Tåge på vand
- </text>
- <slider label="" name="EnvWaterFogSlider"/>
- <button label="Benyt tid fra estate" name="EnvUseEstateTimeButton"/>
- <button label="Avanceret himmel" name="EnvAdvancedSkyButton"/>
- <button label="Avanceret vand" name="EnvAdvancedWaterButton"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_hardware_settings.xml b/indra/newview/skins/default/xui/da/floater_hardware_settings.xml
index 2b10afe7e3..a5942eb625 100644
--- a/indra/newview/skins/default/xui/da/floater_hardware_settings.xml
+++ b/indra/newview/skins/default/xui/da/floater_hardware_settings.xml
@@ -14,6 +14,9 @@
<combo_box.item label="8x" name="8x"/>
<combo_box.item label="16x" name="16x"/>
</combo_box>
+ <text name="antialiasing restart">
+ (kræver genstart af din Second Life klient)
+ </text>
<spinner label="Gamma:" name="gamma"/>
<text name="(brightness, lower is brighter)">
(Lysstyrke, lavere er lysere, 0=benyt standard)
diff --git a/indra/newview/skins/default/xui/da/floater_import_collada.xml b/indra/newview/skins/default/xui/da/floater_import_collada.xml
new file mode 100644
index 0000000000..ebc7c86388
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/floater_import_collada.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Import Collada" title="Import Scene">
+ <text name="mesh count">
+ Meshes: [COUNT]
+ </text>
+ <text name="texture count">
+ Textures: [COUNT]
+ </text>
+ <text name="status">
+ Status: [STATUS]
+ </text>
+ <button label="Cancel" name="cancel"/>
+ <button label="OK" name="ok"/>
+ <string name="status_idle">
+ Idle
+ </string>
+ <string name="status_uploading">
+ Uploading [NAME]
+ </string>
+ <string name="status_creating">
+ Creating object [NAME]
+ </string>
+</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/da/floater_inventory_item_properties.xml
index fa36fab762..59dcc87140 100644
--- a/indra/newview/skins/default/xui/da/floater_inventory_item_properties.xml
+++ b/indra/newview/skins/default/xui/da/floater_inventory_item_properties.xml
@@ -24,16 +24,10 @@
<text name="LabelCreatorTitle">
Skaber:
</text>
- <text name="LabelCreatorName">
- Nicole Linden
- </text>
<button label="Profil..." label_selected="" name="BtnCreator"/>
<text name="LabelOwnerTitle">
Ejer:
</text>
- <text name="LabelOwnerName">
- Thrax Linden
- </text>
<button label="Profil..." label_selected="" name="BtnOwner"/>
<text name="LabelAcquiredTitle">
Erhvervet:
diff --git a/indra/newview/skins/default/xui/da/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/da/floater_inventory_view_finder.xml
index af2910fe58..655701bb96 100644
--- a/indra/newview/skins/default/xui/da/floater_inventory_view_finder.xml
+++ b/indra/newview/skins/default/xui/da/floater_inventory_view_finder.xml
@@ -1,24 +1,25 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Inventory Finder" title="INVENTORY_RECENT_ITEMS">
- <check_box label="Animation" name="check_animation" />
- <check_box label="Visitkort" name="check_calling_card" />
- <check_box label="Tøj" name="check_clothing" />
- <check_box label="Bevægelser" name="check_gesture" />
- <check_box label="Landemærke" name="check_landmark" />
- <check_box label="Note" name="check_notecard" />
- <check_box label="Objekter" name="check_object" />
- <check_box label="Scripts" name="check_script" />
- <check_box label="Lyde" name="check_sound" />
- <check_box label="Teksturer" name="check_texture" />
- <check_box label="Foto&apos;s" name="check_snapshot" />
- <button label="Alle" label_selected="Alle" name="All" />
- <button label="Ingen" label_selected="Ingen" name="None" />
- <check_box label="Vis altid mapper" name="check_show_empty" />
- <check_box label="Siden sidste logoff" name="check_since_logoff" />
+ <check_box label="Animation" name="check_animation"/>
+ <check_box label="Visitkort" name="check_calling_card"/>
+ <check_box label="Tøj" name="check_clothing"/>
+ <check_box label="Bevægelser" name="check_gesture"/>
+ <check_box label="Landemærke" name="check_landmark"/>
+ <check_box label="Meshes" name="check_mesh"/>
+ <check_box label="Note" name="check_notecard"/>
+ <check_box label="Objekter" name="check_object"/>
+ <check_box label="Scripts" name="check_script"/>
+ <check_box label="Lyde" name="check_sound"/>
+ <check_box label="Teksturer" name="check_texture"/>
+ <check_box label="Foto&apos;s" name="check_snapshot"/>
+ <button label="Alle" label_selected="Alle" name="All"/>
+ <button label="Ingen" label_selected="Ingen" name="None"/>
+ <check_box label="Vis altid mapper" name="check_show_empty"/>
+ <check_box label="Siden sidste logoff" name="check_since_logoff"/>
<text name="- OR -">
- ELLER -
</text>
- <spinner label="Timer siden" name="spin_hours_ago" />
- <spinner label="Dage siden" name="spin_days_ago" />
- <button label="Luk" label_selected="Luk" name="Close" />
+ <spinner label="Timer siden" name="spin_hours_ago"/>
+ <spinner label="Dage siden" name="spin_days_ago"/>
+ <button label="Luk" label_selected="Luk" name="Close"/>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_map.xml b/indra/newview/skins/default/xui/da/floater_map.xml
index 5df9bb5f6e..4912d73ba0 100644
--- a/indra/newview/skins/default/xui/da/floater_map.xml
+++ b/indra/newview/skins/default/xui/da/floater_map.xml
@@ -3,6 +3,9 @@
<floater.string name="ToolTipMsg">
[REGION](Dobbeltklik for at åbne kort, klik-og-træk for at panorere)
</floater.string>
+ <floater.string name="AltToolTipMsg">
+ [REGION](Dobbeltklik for at teleportere, træk for at panorere)
+ </floater.string>
<floater.string name="mini_map_caption">
MINIKORT
</floater.string>
diff --git a/indra/newview/skins/default/xui/da/floater_model_preview.xml b/indra/newview/skins/default/xui/da/floater_model_preview.xml
new file mode 100644
index 0000000000..a98c70ff52
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/floater_model_preview.xml
@@ -0,0 +1,231 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Model Preview" title="Upload Model">
+ <string name="status_idle">
+ Idle
+ </string>
+ <string name="status_reading_file">
+ Loading...
+ </string>
+ <string name="status_generating_meshes">
+ Generating Meshes...
+ </string>
+ <string name="status_vertex_number_overflow">
+ Error: Vertex number is more than 65534, aborted!
+ </string>
+ <string name="high">
+ High
+ </string>
+ <string name="medium">
+ Medium
+ </string>
+ <string name="low">
+ Low
+ </string>
+ <string name="lowest">
+ Lowest
+ </string>
+ <string name="mesh_status_good">
+ Ship it!
+ </string>
+ <string name="mesh_status_na">
+ N/A
+ </string>
+ <string name="mesh_status_none">
+ None
+ </string>
+ <string name="mesh_status_submesh_mismatch">
+ Levels of detail have a different number of textureable faces.
+ </string>
+ <string name="mesh_status_mesh_mismatch">
+ Levels of detail have a different number of mesh instances.
+ </string>
+ <string name="mesh_status_too_many_vertices">
+ Level of detail has too many vertices.
+ </string>
+ <string name="mesh_status_missing_lod">
+ Missing required level of detail.
+ </string>
+ <string name="layer_all">
+ All
+ </string>
+ <string name="decomposing">
+ Analyzing...
+ </string>
+ <string name="simplifying">
+ Simplifying...
+ </string>
+ <text name="name_label">
+ Name:
+ </text>
+ <text name="lod_label">
+ Preview:
+ </text>
+ <combo_box name="preview_lod_combo" tool_tip="LOD to view in preview render">
+ <combo_item name="high">
+ Level of Detail: High
+ </combo_item>
+ <combo_item name="medium">
+ Level of Detail: Medium
+ </combo_item>
+ <combo_item name="low">
+ Level of Detail: Low
+ </combo_item>
+ <combo_item name="lowest">
+ Level of Detail: Lowest
+ </combo_item>
+ </combo_box>
+ <panel>
+ <text name="streaming cost">
+ Resource Cost: [COST]
+ </text>
+ <text name="physics cost">
+ Physics Cost: [COST]
+ </text>
+ <text name="upload fee">
+ Upload Fee: N/A
+ </text>
+ </panel>
+ <text name="status">
+ [STATUS]
+ </text>
+ <button label="Defaults" name="reset_btn" tool_tip="Reset to defaults"/>
+ <button label="Upload" name="ok_btn" tool_tip="Upload to simulator"/>
+ <button label="Cancel" name="cancel_btn"/>
+ <tab_container name="import_tab">
+ <panel label="Level of Detail" name="lod_panel">
+ <text name="lod_table_header">
+ Select Level of Detail:
+ </text>
+ <text name="high_label" value="High"/>
+ <text name="high_triangles" value="0"/>
+ <text name="high_vertices" value="0"/>
+ <text name="medium_label" value="Medium"/>
+ <text name="medium_triangles" value="0"/>
+ <text name="medium_vertices" value="0"/>
+ <text name="low_label" value="Low"/>
+ <text name="low_triangles" value="0"/>
+ <text name="low_vertices" value="0"/>
+ <text name="lowest_label" value="Lowest"/>
+ <text name="lowest_triangles" value="0"/>
+ <text name="lowest_vertices" value="0"/>
+ <text name="lod_table_footer">
+ Level of Detail: [DETAIL]
+ </text>
+ <radio_group name="lod_file_or_limit" value="lod_from_file">
+ <radio_item label="Load from file" name="lod_from_file"/>
+ <radio_item label="Auto generate" name="lod_auto_generate"/>
+ <radio_item label="None" name="lod_none"/>
+ </radio_group>
+ <button label="Browse..." name="lod_browse"/>
+ <combo_box name="lod_mode">
+ <combo_item name="triangle_limit">
+ Triangle Limit
+ </combo_item>
+ <combo_item name="error_threshold">
+ Error Threshold
+ </combo_item>
+ </combo_box>
+ <text name="build_operator_text">
+ Build Operator:
+ </text>
+ <text name="queue_mode_text">
+ Queue Mode:
+ </text>
+ <combo_box name="build_operator">
+ <combo_item name="edge_collapse">
+ Edge Collapse
+ </combo_item>
+ <combo_item name="half_edge_collapse">
+ Half Edge Collapse
+ </combo_item>
+ </combo_box>
+ <combo_box name="queue_mode">
+ <combo_item name="greedy">
+ Greedy
+ </combo_item>
+ <combo_item name="lazy">
+ Lazy
+ </combo_item>
+ <combo_item name="independent">
+ Independent
+ </combo_item>
+ </combo_box>
+ <text name="border_mode_text">
+ Border Mode:
+ </text>
+ <text name="share_tolderance_text">
+ Share Tolerance:
+ </text>
+ <combo_box name="border_mode">
+ <combo_item name="border_unlock">
+ Unlock
+ </combo_item>
+ <combo_item name="border_lock">
+ Lock
+ </combo_item>
+ </combo_box>
+ <text name="crease_label">
+ Crease Angle:
+ </text>
+ <spinner name="crease_angle" value="75"/>
+ </panel>
+ <panel label="Physics" name="physics_panel">
+ <panel name="physics geometry">
+ <radio_group name="physics_load_radio" value="physics_load_from_file">
+ <radio_item label="File:" name="physics_load_from_file"/>
+ <radio_item label="Use Level of Detail:" name="physics_use_lod"/>
+ </radio_group>
+ <combo_box name="physics_lod_combo" tool_tip="LOD to use for physics shape">
+ <combo_item name="physics_lowest">
+ Lowest
+ </combo_item>
+ <combo_item name="physics_low">
+ Low
+ </combo_item>
+ <combo_item name="physics_medium">
+ Medium
+ </combo_item>
+ <combo_item name="physics_high">
+ High
+ </combo_item>
+ </combo_box>
+ <button label="Browse..." name="physics_browse"/>
+ </panel>
+ <panel name="physics analysis">
+ <slider label="Smooth:" name="Smooth"/>
+ <check_box label="Close Holes (slow)" name="Close Holes (Slow)"/>
+ <button label="Analyze" name="Decompose"/>
+ <button label="Cancel" name="decompose_cancel"/>
+ </panel>
+ <panel name="physics simplification">
+ <slider label="Passes:" name="Combine Quality"/>
+ <slider label="Detail Scale:" name="Detail Scale"/>
+ <slider label="Retain:" name="Retain%"/>
+ <button label="Simplify" name="Simplify"/>
+ <button label="Cancel" name="simplify_cancel"/>
+ </panel>
+ <panel name="physics info">
+ <slider label="Preview Spread:" name="physics_explode"/>
+ <text name="physics_triangles">
+ Triangles: [TRIANGLES]
+ </text>
+ <text name="physics_points">
+ Vertices: [POINTS]
+ </text>
+ <text name="physics_hulls">
+ Hulls: [HULLS]
+ </text>
+ </panel>
+ </panel>
+ <panel label="Modifiers" name="modifiers_panel">
+ <spinner name="import_scale" value="1.0"/>
+ <text name="import_dimensions">
+ [X] x [Y] x [Z] m
+ </text>
+ <check_box label="Textures" name="upload_textures"/>
+ <check_box label="Skin weight" name="upload_skin"/>
+ <check_box label="Joint positions" name="upload_joints"/>
+ <spinner name="pelvis_offset" value="0.0"/>
+ </panel>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_nearby_chat.xml b/indra/newview/skins/default/xui/da/floater_nearby_chat.xml
index bd17224259..76bc40edac 100644
--- a/indra/newview/skins/default/xui/da/floater_nearby_chat.xml
+++ b/indra/newview/skins/default/xui/da/floater_nearby_chat.xml
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="nearby_chat" title="CHAT NÆRVED">
- <check_box label="Oversæt chat (håndteret af Google)" name="translate_chat_checkbox"/>
+ <check_box label="Oversæt chat" name="translate_chat_checkbox"/>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_preferences.xml b/indra/newview/skins/default/xui/da/floater_preferences.xml
index a53586eaaf..6caac14cf5 100644
--- a/indra/newview/skins/default/xui/da/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/da/floater_preferences.xml
@@ -5,10 +5,12 @@
<tab_container name="pref core">
<panel label="Generelt" name="general"/>
<panel label="Grafik" name="display"/>
- <panel label="Privatliv" name="im"/>
<panel label="Lyd &amp; medier" name="audio"/>
<panel label="Chat" name="chat"/>
+ <panel label="Flyt &amp; se" name="move"/>
<panel label="Beskeder" name="msgs"/>
+ <panel label="Farver" name="colors"/>
+ <panel label="Privatliv" name="im"/>
<panel label="Opsætning" name="input"/>
<panel label="Avanceret" name="advanced1"/>
</tab_container>
diff --git a/indra/newview/skins/default/xui/da/floater_price_for_listing.xml b/indra/newview/skins/default/xui/da/floater_price_for_listing.xml
new file mode 100644
index 0000000000..b091fa09b5
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/floater_price_for_listing.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="price_for_listing" title="PUBLISH CLASSIFIED AD">
+ <text name="explanation_text">
+ Din annonce vil løbe en uge fra udgivelsesdatoen.
+
+Placeringen af din annonce i listerne er afhængig af hvor meget du har valgt at betale.
+
+De annoncer der betales mest for vises øverst i lister og højere i søgeresultater.
+ </text>
+ <text name="price_text">
+ Pris for annonce:
+ </text>
+ <text name="price_symbol">
+ L$
+ </text>
+ <button label="OK" name="set_price_btn"/>
+ <button label="Annullér" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_region_debug_console.xml b/indra/newview/skins/default/xui/da/floater_region_debug_console.xml
new file mode 100644
index 0000000000..71313f4fea
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/floater_region_debug_console.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="region_debug_console" title="Debug region"/>
diff --git a/indra/newview/skins/default/xui/da/floater_settings_debug.xml b/indra/newview/skins/default/xui/da/floater_settings_debug.xml
index 016e5af378..f7eda56e48 100644
--- a/indra/newview/skins/default/xui/da/floater_settings_debug.xml
+++ b/indra/newview/skins/default/xui/da/floater_settings_debug.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="settings_debug" title="DEBUG INDSTILLINGER">
<radio_group name="boolean_combo">
- <radio_item label="SANDT" name="TRUE" value="sand"/>
- <radio_item label="FALSK" name="FALSE" value=""/>
+ <radio_item label="SANDT" name="TRUE" />
+ <radio_item label="FALSK" name="FALSE" />
</radio_group>
<color_swatch label="Farve" name="val_color_swatch"/>
<spinner label="x" name="val_spinner_1"/>
diff --git a/indra/newview/skins/default/xui/da/floater_sound_devices.xml b/indra/newview/skins/default/xui/da/floater_sound_devices.xml
new file mode 100644
index 0000000000..cb4cbba570
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/floater_sound_devices.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_sound_devices" title="Lyd enheder">
+ <text name="voice_label">
+ Stemme chat
+ </text>
+ <check_box label="Aktiveret" name="enable_voice"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_tools.xml b/indra/newview/skins/default/xui/da/floater_tools.xml
index 781adcd50b..815bde456e 100644
--- a/indra/newview/skins/default/xui/da/floater_tools.xml
+++ b/indra/newview/skins/default/xui/da/floater_tools.xml
@@ -64,6 +64,8 @@
<radio_item label="Vælg overflade" name="radio select face"/>
</radio_group>
<check_box label="Redigér lænkede" name="checkbox edit linked parts"/>
+ <button label="Sammenkæd" name="link_btn"/>
+ <button label="Adskil" name="unlink_btn"/>
<text name="RenderingCost" tool_tip="Hvis beregnede rendering omkostninger for dette objekt">
þ: [COUNT]
</text>
@@ -120,6 +122,18 @@
<text name="prim_count">
Prims: [COUNT]
</text>
+ <text name="linked_set_count">
+ Lænkede sæt: [COUNT]
+ </text>
+ <text name="linked_set_cost" tool_tip="Pris for nuværende valgte lænkede sæt som [prims] / [physics complexity]">
+ Pris: [COST] / [PHYSICS]
+ </text>
+ <text name="object_count">
+ Objekter: [COUNT]
+ </text>
+ <text name="object_cost" tool_tip="Pris for nuværende valgte objekter som [prims] / [physics complexity]">
+ Pris: [COST] / [PHYSICS]
+ </text>
<tab_container name="Object Info Tabs">
<panel label="Generelt" name="General">
<panel.string name="text deed continued">
@@ -167,15 +181,9 @@
<text name="Creator:">
Skaber:
</text>
- <text name="Creator Name">
- Mrs. Esbee Linden (esbee.linden)
- </text>
<text name="Owner:">
Ejer:
</text>
- <text name="Owner Name">
- Mrs. Erica &quot;Moose&quot; Linden (erica.linden)
- </text>
<text name="Group:">
Gruppe:
</text>
@@ -270,15 +278,6 @@
<combo_box.item label="Ring" name="Ring"/>
<combo_box.item label="Sculpted" name="Sculpted"/>
</combo_box>
- <combo_box name="material">
- <combo_box.item label="Sten" name="Stone"/>
- <combo_box.item label="Metal" name="Metal"/>
- <combo_box.item label="Glas" name="Glass"/>
- <combo_box.item label="Træ" name="Wood"/>
- <combo_box.item label="Kød" name="Flesh"/>
- <combo_box.item label="Plastik" name="Plastic"/>
- <combo_box.item label="Gummi" name="Rubber"/>
- </combo_box>
<text name="text cut">
Snit Z-akse (start/slut)
</text>
@@ -351,9 +350,19 @@
<combo_box.item label="Kuglering" name="Torus"/>
<combo_box.item label="Plan" name="Plane"/>
<combo_box.item label="Cylinder" name="Cylinder"/>
+ <combo_box.item label="Mesh" name="Mesh"/>
</combo_box>
</panel>
<panel label="Features" name="Features">
+ <panel.string name="None">
+ Ingen
+ </panel.string>
+ <panel.string name="Prim">
+ Prim
+ </panel.string>
+ <panel.string name="Convex Hull">
+ Konveks skrog
+ </panel.string>
<text name="select_single">
Vælg kun én prim for at ændre egenskaber.
</text>
@@ -378,6 +387,23 @@
<spinner label="Fokus" name="Light Focus"/>
<spinner label="Udfasning" name="Light Falloff"/>
<spinner label="Omgivelser" name="Light Ambiance"/>
+ <text name="label physicsshapetype">
+ Fysisk form type:
+ </text>
+ <combo_box name="Physics Shape Type Combo Ctrl" tool_tip="Vælg fysisk form type"/>
+ <combo_box name="material">
+ <combo_box.item label="Sten" name="Stone"/>
+ <combo_box.item label="Metal" name="Metal"/>
+ <combo_box.item label="Glas" name="Glass"/>
+ <combo_box.item label="Træ" name="Wood"/>
+ <combo_box.item label="Kød" name="Flesh"/>
+ <combo_box.item label="Plastik" name="Plastic"/>
+ <combo_box.item label="Gummi" name="Rubber"/>
+ </combo_box>
+ <spinner label="Tyngde" name="Physics Gravity"/>
+ <spinner label="Friktion" name="Physics Friction"/>
+ <spinner label="Tæthed" name="Physics Density"/>
+ <spinner label="Restitution" name="Physics Restitution"/>
</panel>
<panel label="Tekstur" name="Texture">
<panel.string name="string repeats per meter">
diff --git a/indra/newview/skins/default/xui/da/floater_tos.xml b/indra/newview/skins/default/xui/da/floater_tos.xml
index 760f60c996..af9ee0bd06 100644
--- a/indra/newview/skins/default/xui/da/floater_tos.xml
+++ b/indra/newview/skins/default/xui/da/floater_tos.xml
@@ -4,7 +4,7 @@
http://secondlife.com/app/tos/
</floater.string>
<floater.string name="loading_url">
- data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Loading %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
+ data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Henter %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
</floater.string>
<button label="Fortsæt" label_selected="Fortsæt" name="Continue"/>
<button label="Annullér" label_selected="Annullér" name="Cancel"/>
diff --git a/indra/newview/skins/default/xui/da/floater_water.xml b/indra/newview/skins/default/xui/da/floater_water.xml
deleted file mode 100644
index aedd1b442c..0000000000
--- a/indra/newview/skins/default/xui/da/floater_water.xml
+++ /dev/null
@@ -1,103 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Water Floater" title="AVANCERET OPSÆTNING AF VAND">
- <text name="KeyFramePresetsText">
- Vand opsætninger:
- </text>
- <button label="Ny" label_selected="Ny" name="WaterNewPreset"/>
- <button label="Gem" label_selected="Gem" name="WaterSavePreset"/>
- <button label="Slet" label_selected="Slet" name="WaterDeletePreset"/>
- <tab_container name="Water Tabs">
- <panel label="INDSTILLINGER" name="Settings">
- <text name="BHText">
- Vandtåge farve
- </text>
- <button label="?" name="WaterFogColorHelp"/>
- <color_swatch label="" name="WaterFogColor" tool_tip="Klik for at åbne farvevælger"/>
- <text name="WaterFogDensText">
- Tåge tæthedskarakteristik
- </text>
- <button label="?" name="WaterFogDensityHelp"/>
- <slider label="" name="WaterFogDensity"/>
- <text name="WaterUnderWaterFogModText">
- Tilretning undervandståge
- </text>
- <button label="?" name="WaterUnderWaterFogModHelp"/>
- <slider label="" name="WaterUnderWaterFogMod"/>
- <text name="BDensText">
- Lille bølge reflektionsskala
- </text>
- <button label="?" name="WaterNormalScaleHelp"/>
- <text name="BHText2">
- 1
- </text>
- <text name="BHText3">
- 2
- </text>
- <text name="BHText4">
- 3
- </text>
- <slider label="" name="WaterNormalScaleX"/>
- <slider label="" name="WaterNormalScaleY"/>
- <slider label="" name="WaterNormalScaleZ"/>
- <text name="HDText">
- Spredningsskala
- </text>
- <button label="?" name="WaterFresnelScaleHelp"/>
- <slider label="" name="WaterFresnelScale"/>
- <text name="FresnelOffsetText">
- Spredning offset
- </text>
- <button label="?" name="WaterFresnelOffsetHelp"/>
- <slider label="" name="WaterFresnelOffset"/>
- <text name="DensMultText">
- Lysbrydning fra oven
- </text>
- <button label="?" name="WaterScaleAboveHelp"/>
- <slider label="" name="WaterScaleAbove"/>
- <text name="WaterScaleBelowText">
- Lysbrydning fra neden
- </text>
- <button label="?" name="WaterScaleBelowHelp"/>
- <slider label="" name="WaterScaleBelow"/>
- <text name="MaxAltText">
- Udviskning
- </text>
- <button label="?" name="WaterBlurMultiplierHelp"/>
- <slider label="" name="WaterBlurMult"/>
- </panel>
- <panel label="BILLEDE" name="Waves">
- <text name="BHText">
- Retning for store bølger
- </text>
- <button label="?" name="WaterWave1Help"/>
- <text name="WaterWave1DirXText">
- X
- </text>
- <text name="WaterWave1DirYText">
- Y
- </text>
- <slider label="" name="WaterWave1DirX"/>
- <slider label="" name="WaterWave1DirY"/>
- <text name="BHText2">
- Retning for små bølger
- </text>
- <button label="?" name="WaterWave2Help"/>
- <text name="WaterWave2DirXText">
- X
- </text>
- <text name="WaterWave2DirYText">
- Y
- </text>
- <slider label="" name="WaterWave2DirX"/>
- <slider label="" name="WaterWave2DirY"/>
- <text name="BHText3">
- Tekstur map
- </text>
- <button label="?" name="WaterNormalMapHelp"/>
- <texture_picker label="" name="WaterNormalMap"/>
- </panel>
- </tab_container>
- <string name="WLDefaultWaterNames">
- Default:Glassy:Pond:Murky:Second Plague:SNAKE!!!:Valdez
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_web_content.xml b/indra/newview/skins/default/xui/da/floater_web_content.xml
new file mode 100644
index 0000000000..74092e88ec
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/floater_web_content.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_web_content" title="">
+ <layout_stack name="stack1">
+ <layout_panel name="nav_controls">
+ <button name="back" tool_tip="Navigér tilbage"/>
+ <button name="forward" tool_tip="Navigér frem"/>
+ <button name="stop" tool_tip="Stop navigering"/>
+ <button name="reload" tool_tip="Genindlæs side"/>
+ <combo_box name="address" tool_tip="Indtast URL her"/>
+ <icon name="media_secure_lock_flag" tool_tip="Sikker browsing"/>
+ <button name="popexternal" tool_tip="Ã…ben denne URL i din normale browser"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_windlight_options.xml b/indra/newview/skins/default/xui/da/floater_windlight_options.xml
deleted file mode 100644
index 56f94b24e9..0000000000
--- a/indra/newview/skins/default/xui/da/floater_windlight_options.xml
+++ /dev/null
@@ -1,228 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="WindLight floater" title="AVANCERET OPSÆTNING FOR HIMMEL">
- <text name="KeyFramePresetsText">
- Faste indstillinger:
- </text>
- <button label="Ny" label_selected="Ny" name="WLNewPreset" />
- <button label="Gem" label_selected="Gem" name="WLSavePreset" />
- <button label="Slet" label_selected="Slet" name="WLDeletePreset" />
- <button label="Dags cyklus" label_selected="Dags cyklus" name="WLDayCycleMenuButton" />
- <tab_container name="WindLight Tabs">
- <panel label="ATMOSFÆRE" name="Atmosphere">
- <text name="BHText">
- Blå - horisont
- </text>
- <button label="?" name="WLBlueHorizonHelp" />
- <text name="BHText2">
- R
- </text>
- <text name="BHText3">
- G
- </text>
- <text name="BHText4">
- B
- </text>
- <text name="BHText5">
- I
- </text>
- <slider label="" name="WLBlueHorizonR" />
- <slider label="" name="WLBlueHorizonG" />
- <slider label="" name="WLBlueHorizonB" />
- <slider label="" name="WLBlueHorizonI" />
- <text name="BDensText">
- Dis - horisont
- </text>
- <button label="?" name="WLHazeHorizonHelp" />
- <slider label="" name="WLHazeHorizon" />
- <text name="BDensText2">
- Blå - tæthed
- </text>
- <button label="?" name="WLBlueDensityHelp" />
- <text name="BHText6">
- R
- </text>
- <text name="BHText7">
- G
- </text>
- <text name="BHText8">
- B
- </text>
- <text name="BHText9">
- I
- </text>
- <slider label="" name="WLBlueDensityR" />
- <slider label="" name="WLBlueDensityG" />
- <slider label="" name="WLBlueDensityB" />
- <slider label="" name="WLBlueDensityI" />
- <text name="HDText">
- Dis - intensitet
- </text>
- <button label="?" name="WLHazeDensityHelp" />
- <slider label="" name="WLHazeDensity" />
- <text name="DensMultText">
- Densitet faktor
- </text>
- <button label="?" name="WLDensityMultHelp" />
- <slider label="" name="WLDensityMult" />
- <text name="WLDistanceMultText">
- Distance faktor
- </text>
- <button label="?" name="WLDistanceMultHelp" />
- <slider label="" name="WLDistanceMult" />
- <text name="MaxAltText">
- Maximum højde
- </text>
- <button label="?" name="WLMaxAltitudeHelp" />
- <slider label="" name="WLMaxAltitude" />
- </panel>
- <panel label="LYS" name="Lighting">
- <text name="SLCText">
- Sol/MÃ¥ne farve
- </text>
- <button label="?" name="WLSunlightColorHelp" />
- <text name="BHText">
- R
- </text>
- <text name="BHText2">
- G
- </text>
- <text name="BHText3">
- B
- </text>
- <text name="BHText4">
- I
- </text>
- <slider label="" name="WLSunlightR" />
- <slider label="" name="WLSunlightG" />
- <slider label="" name="WLSunlightB" />
- <slider label="" name="WLSunlightI" />
- <text name="TODText">
- Sol/MÃ¥ne position
- </text>
- <button label="?" name="WLTimeOfDayHelp" />
- <slider label="" name="WLSunAngle" />
- <text name="WLAmbientText">
- Omgivende
- </text>
- <button label="?" name="WLAmbientHelp" />
- <text name="BHText5">
- R
- </text>
- <text name="BHText6">
- G
- </text>
- <text name="BHText7">
- B
- </text>
- <text name="BHText8">
- I
- </text>
- <slider label="" name="WLAmbientR" />
- <slider label="" name="WLAmbientG" />
- <slider label="" name="WLAmbientB" />
- <slider label="" name="WLAmbientI" />
- <text name="WLEastAngleText">
- Øst vinkel
- </text>
- <button label="?" name="WLEastAngleHelp" />
- <slider label="" name="WLEastAngle" />
- <text name="SunGlowText">
- Sol glød
- </text>
- <button label="?" name="WLSunGlowHelp" />
- <slider label="Fokus " name="WLGlowB" />
- <slider label="Størr. " name="WLGlowR" />
- <text name="SceneGammaText">
- Lysintensitet (gamma)
- </text>
- <button label="?" name="WLSceneGammaHelp" />
- <slider label="" name="WLGamma" />
- <text name="WLStarText">
- Stjerne intensitet
- </text>
- <button label="?" name="WLStarBrightnessHelp" />
- <slider label="" name="WLStarAlpha" />
- </panel>
- <panel label="SKYER" name="Clouds">
- <text name="WLCloudColorText">
- Farve på skyer
- </text>
- <button label="?" name="WLCloudColorHelp" />
- <text name="BHText">
- R
- </text>
- <text name="BHText2">
- G
- </text>
- <text name="BHText3">
- B
- </text>
- <text name="BHText4">
- I
- </text>
- <slider label="" name="WLCloudColorR" />
- <slider label="" name="WLCloudColorG" />
- <slider label="" name="WLCloudColorB" />
- <slider label="" name="WLCloudColorI" />
- <text name="WLCloudColorText2">
- Skyer XY/Tæthed
- </text>
- <button label="?" name="WLCloudDensityHelp" />
- <text name="BHText5">
- X
- </text>
- <text name="BHText6">
- Y
- </text>
- <text name="BHText7">
- T
- </text>
- <slider label="" name="WLCloudX" />
- <slider label="" name="WLCloudY" />
- <slider label="" name="WLCloudDensity" />
- <text name="WLCloudCoverageText">
- Skydække
- </text>
- <button label="?" name="WLCloudCoverageHelp" />
- <slider label="" name="WLCloudCoverage" />
- <text name="WLCloudScaleText">
- Skystørrelse
- </text>
- <button label="?" name="WLCloudScaleHelp" />
- <slider label="" name="WLCloudScale" />
- <text name="WLCloudDetailText">
- Sky detaljer(XY/tæthed)
- </text>
- <button label="?" name="WLCloudDetailHelp" />
- <text name="BHText8">
- X
- </text>
- <text name="BHText9">
- Y
- </text>
- <text name="BHText10">
- T
- </text>
- <slider label="" name="WLCloudDetailX" />
- <slider label="" name="WLCloudDetailY" />
- <slider label="" name="WLCloudDetailDensity" />
- <text name="WLCloudScrollXText">
- Sky drift X
- </text>
- <button label="?" name="WLCloudScrollXHelp" />
- <check_box label="LÃ¥s" name="WLCloudLockX" />
- <slider label="" name="WLCloudScrollX" />
- <text name="WLCloudScrollYText">
- Sky drift Y
- </text>
- <button label="?" name="WLCloudScrollYHelp" />
- <check_box label="LÃ¥s" name="WLCloudLockY" />
- <slider label="" name="WLCloudScrollY" />
- <check_box label="Benyt simple skyer" name="DrawClassicClouds" />
- <button label="?" name="WLClassicCloudsHelp" />
- </panel>
- </tab_container>
- <string name="WLDefaultSkyNames">
- A-12AM:A-12PM:A-3AM:A-3PM:A-4.30PM:A-6AM:A-6PM:A-9AM:A-9PM:Barcelona:Blizzard:Blue Midday:Coastal Afternoon:Coastal Sunset:Default:Desert Sunset:Fine Day:Fluffy Big Clouds:Foggy:Funky Funky:Funky Funky Funky:Gelatto:Ghost:Incongruent Truths:Midday 1:Midday 2:Midday 3:Midday 4:Night:Pirate:Purple:Sailor&apos;s Delight:Sheer Sensuality
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/da/inspect_avatar.xml b/indra/newview/skins/default/xui/da/inspect_avatar.xml
index f581210e1b..dc1ed562eb 100644
--- a/indra/newview/skins/default/xui/da/inspect_avatar.xml
+++ b/indra/newview/skins/default/xui/da/inspect_avatar.xml
@@ -10,8 +10,6 @@
<string name="Details">
[SL_PROFILE]
</string>
- <text name="user_name_small" value="Grumpity ProductEngine med et langt navn"/>
- <text name="user_slid" value="james.linden"/>
<text name="user_details">
Dette er min second life beskrivelse og jeg synes den er rigtig god. Men af en eller ande grund er min beskrivelse meget lang fordi jeg taler en hel masse
</text>
diff --git a/indra/newview/skins/default/xui/da/language_settings.xml b/indra/newview/skins/default/xui/da/language_settings.xml
index 3e46f69af1..0e3cbfd2d2 100644
--- a/indra/newview/skins/default/xui/da/language_settings.xml
+++ b/indra/newview/skins/default/xui/da/language_settings.xml
@@ -4,6 +4,7 @@
<!-- Locale Information -->
<string name="MicrosoftLocale">danish</string>
+ <string name="MacLocale">da_DK.UTF-8</string>
<string name="DarwinLocale">da_DK.UTF-8</string>
<string name="LinuxLocale">da_DK.UTF-8</string>
diff --git a/indra/newview/skins/default/xui/da/menu_attachment_self.xml b/indra/newview/skins/default/xui/da/menu_attachment_self.xml
index 1c19435f90..35ba27f9e2 100644
--- a/indra/newview/skins/default/xui/da/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/da/menu_attachment_self.xml
@@ -5,7 +5,7 @@
<menu_item_call label="Tag af" name="Detach"/>
<menu_item_call label="Sid ned" name="Sit Down Here"/>
<menu_item_call label="Stå op" name="Stand Up"/>
- <menu_item_call label="Skift sæt" name="Change Outfit"/>
+ <menu_item_call label="Udseende" name="Change Outfit"/>
<menu_item_call label="Redigér mit sæt" name="Edit Outfit"/>
<menu_item_call label="Redigér min figur" name="Edit My Shape"/>
<menu_item_call label="Venner" name="Friends..."/>
diff --git a/indra/newview/skins/default/xui/da/menu_avatar_self.xml b/indra/newview/skins/default/xui/da/menu_avatar_self.xml
index 5a05a12b4e..4e6b42a744 100644
--- a/indra/newview/skins/default/xui/da/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/da/menu_avatar_self.xml
@@ -14,6 +14,7 @@
<menu_item_call label="Undertrøje" name="Self Undershirt"/>
<menu_item_call label="Underbukser" name="Self Underpants"/>
<menu_item_call label="Tatovering" name="Self Tattoo"/>
+ <menu_item_call label="Fysik" name="Self Physics"/>
<menu_item_call label="Alpha" name="Self Alpha"/>
<menu_item_call label="Alt tøj" name="All Clothes"/>
</context_menu>
@@ -21,7 +22,7 @@
<context_menu label="Tag af" name="Object Detach"/>
<menu_item_call label="Tag alt af" name="Detach All"/>
</context_menu>
- <menu_item_call label="Skift sæt" name="Chenge Outfit"/>
+ <menu_item_call label="Mit udseende" name="Chenge Outfit"/>
<menu_item_call label="Redigér mit sæt" name="Edit Outfit"/>
<menu_item_call label="Redigér min form" name="Edit My Shape"/>
<menu_item_call label="Venner" name="Friends..."/>
diff --git a/indra/newview/skins/default/xui/da/menu_bottomtray.xml b/indra/newview/skins/default/xui/da/menu_bottomtray.xml
index e979e35a91..a0d74db36d 100644
--- a/indra/newview/skins/default/xui/da/menu_bottomtray.xml
+++ b/indra/newview/skins/default/xui/da/menu_bottomtray.xml
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="hide_camera_move_controls_menu">
+ <menu_item_check label="Tal knap" name="EnableVoiceChat"/>
<menu_item_check label="Faste bevægelser" name="ShowGestureButton"/>
<menu_item_check label="Bevægelse knap" name="ShowMoveButton"/>
<menu_item_check label="Vis knap" name="ShowCameraButton"/>
<menu_item_check label="Foto knap" name="ShowSnapshotButton"/>
- <menu_item_check label="Sidepanel knap" name="ShowSidebarButton"/>
<menu_item_check label="Bygge knap" name="ShowBuildButton"/>
<menu_item_check label="Søge knap" name="ShowSearchButton"/>
<menu_item_check label="Kort knap" name="ShowWorldMapButton"/>
diff --git a/indra/newview/skins/default/xui/da/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/da/menu_inspect_avatar_gear.xml
index 89111d49f1..8da35adb1b 100644
--- a/indra/newview/skins/default/xui/da/menu_inspect_avatar_gear.xml
+++ b/indra/newview/skins/default/xui/da/menu_inspect_avatar_gear.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<menu name="Gear Menu">
+<toggleable_menu name="Gear Menu">
<menu_item_call label="Profil" name="view_profile"/>
<menu_item_call label="Tilføj ven" name="add_friend"/>
<menu_item_call label="Besked" name="im"/>
@@ -11,9 +11,11 @@
<menu_item_call label="Rapportér" name="report"/>
<menu_item_call label="Frys" name="freeze"/>
<menu_item_call label="Smid ud" name="eject"/>
+ <menu_item_call label="Spark" name="kick"/>
+ <menu_item_call label="CSR" name="csr"/>
<menu_item_call label="Debug teksturer" name="debug"/>
<menu_item_call label="Find på kort" name="find_on_map"/>
<menu_item_call label="Zoom ind" name="zoom_in"/>
<menu_item_call label="Betal" name="pay"/>
<menu_item_call label="Del" name="share"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/da/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/da/menu_inspect_self_gear.xml
index a2ddd116a7..887c6484bc 100644
--- a/indra/newview/skins/default/xui/da/menu_inspect_self_gear.xml
+++ b/indra/newview/skins/default/xui/da/menu_inspect_self_gear.xml
@@ -1,10 +1,31 @@
-<?xml version="1.0" encoding="utf-8"?>
-<menu name="Gear Menu">
- <menu_item_call label="Sid ned" name="sit_down_here"/>
- <menu_item_call label="Stå op" name="stand_up"/>
- <menu_item_call label="Skift sæt" name="change_outfit"/>
- <menu_item_call label="Profil" name="my_profile"/>
- <menu_item_call label="Venner" name="my_friends"/>
- <menu_item_call label="Grupper" name="my_groups"/>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Gear Menu">
+ <menu_item_call label="Sid ned" name="Sit Down Here"/>
+ <menu_item_call label="Stå op" name="Stand Up"/>
+ <context_menu label="Tag af" name="Take Off &gt;">
+ <context_menu label="Tøj" name="Clothes &gt;">
+ <menu_item_call label="Trøje" name="Shirt"/>
+ <menu_item_call label="Bukser" name="Pants"/>
+ <menu_item_call label="Nederdel" name="Skirt"/>
+ <menu_item_call label="Sko" name="Shoes"/>
+ <menu_item_call label="Strømper" name="Socks"/>
+ <menu_item_call label="Jakke" name="Jacket"/>
+ <menu_item_call label="Handsker" name="Gloves"/>
+ <menu_item_call label="Undertrøje" name="Self Undershirt"/>
+ <menu_item_call label="Underbukser" name="Self Underpants"/>
+ <menu_item_call label="Tatovering" name="Self Tattoo"/>
+ <menu_item_call label="Alpha" name="Self Alpha"/>
+ <menu_item_call label="Alt tøj" name="All Clothes"/>
+ </context_menu>
+ <context_menu label="HUD" name="Object Detach HUD"/>
+ <context_menu label="Tag af" name="Object Detach"/>
+ <menu_item_call label="Tag alt af" name="Detach All"/>
+ </context_menu>
+ <menu_item_call label="Skift sæt" name="Chenge Outfit"/>
+ <menu_item_call label="Redigér sæt" name="Edit Outfit"/>
+ <menu_item_call label="Redigér min figur" name="Edit My Shape"/>
+ <menu_item_call label="Mine venner" name="Friends..."/>
+ <menu_item_call label="Mine grupper" name="Groups..."/>
+ <menu_item_call label="Min profil" name="Profile..."/>
<menu_item_call label="Debug teksturer" name="Debug..."/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/da/menu_inventory.xml b/indra/newview/skins/default/xui/da/menu_inventory.xml
index 35551318d1..f9bdf36f1f 100644
--- a/indra/newview/skins/default/xui/da/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/da/menu_inventory.xml
@@ -25,6 +25,7 @@
<menu_item_call label="Nye underbukser" name="New Underpants"/>
<menu_item_call label="Nyt alpha lag" name="New Alpha Mask"/>
<menu_item_call label="Ny tatovering" name="New Tattoo"/>
+ <menu_item_call label="Ny fysik" name="New Physics"/>
</menu>
<menu label="Nye kropsdele" name="New Body Parts">
<menu_item_call label="Ny figur" name="New Shape"/>
diff --git a/indra/newview/skins/default/xui/da/menu_inventory_add.xml b/indra/newview/skins/default/xui/da/menu_inventory_add.xml
index 07f70d7190..eca03d3ee9 100644
--- a/indra/newview/skins/default/xui/da/menu_inventory_add.xml
+++ b/indra/newview/skins/default/xui/da/menu_inventory_add.xml
@@ -4,6 +4,8 @@
<menu_item_call label="Billede (L$[COST])..." name="Upload Image"/>
<menu_item_call label="Lyd (L$[COST])..." name="Upload Sound"/>
<menu_item_call label="Animation (L$[COST])..." name="Upload Animation"/>
+ <menu_item_call label="Model..." name="Upload Model"/>
+ <menu_item_call label="Model Wizard..." name="Upload Model Wizard"/>
<menu_item_call label="Hent mange (L$[COST] pr. fil)..." name="Bulk Upload"/>
<menu_item_call label="Sæt standardværdier for upload rettigheder" name="perm prefs"/>
</menu>
@@ -23,6 +25,7 @@
<menu_item_call label="Nye underbukser" name="New Underpants"/>
<menu_item_call label="Nyt alpha lag" name="New Alpha"/>
<menu_item_call label="Ny tatovering" name="New Tattoo"/>
+ <menu_item_call label="Ny fysik" name="New Physics"/>
</menu>
<menu label="Nye kropsdele" name="New Body Parts">
<menu_item_call label="Ny kropsbygning" name="New Shape"/>
diff --git a/indra/newview/skins/default/xui/da/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/da/menu_inventory_gear_default.xml
index 75ce7b22f6..4809b24463 100644
--- a/indra/newview/skins/default/xui/da/menu_inventory_gear_default.xml
+++ b/indra/newview/skins/default/xui/da/menu_inventory_gear_default.xml
@@ -1,8 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_gear_default">
+<toggleable_menu name="menu_gear_default">
<menu_item_call label="Nyt vindue" name="new_window"/>
- <menu_item_call label="Sortér efter navn" name="sort_by_name"/>
- <menu_item_call label="Sortér efter nyeste" name="sort_by_recent"/>
+ <menu_item_check label="Sortér efter navn" name="sort_by_name"/>
+ <menu_item_check label="Sortér efter nyeste" name="sort_by_recent"/>
+ <menu_item_check label="Sortér altid mapper efter navn" name="sort_folders_by_name"/>
+ <menu_item_check label="Vis System mapper øverst" name="sort_system_folders_to_top"/>
<menu_item_call label="Vis filtre" name="show_filters"/>
<menu_item_call label="Nulstil filtre" name="reset_filters"/>
<menu_item_call label="Luk alle mapper" name="close_folders"/>
@@ -12,4 +14,4 @@
<menu_item_call label="Find original" name="Find Original"/>
<menu_item_call label="Find alle links" name="Find All Links"/>
<menu_item_call label="Tøm papirkurv" name="empty_trash"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/da/menu_login.xml b/indra/newview/skins/default/xui/da/menu_login.xml
index 1231c4c08d..0b7a5040ae 100644
--- a/indra/newview/skins/default/xui/da/menu_login.xml
+++ b/indra/newview/skins/default/xui/da/menu_login.xml
@@ -16,7 +16,8 @@
<menu_item_call label="Sæt vinduesstørrelse" name="Set Window Size..."/>
<menu_item_call label="Vis betingelser" name="TOS"/>
<menu_item_call label="Vis vigtig besked" name="Critical"/>
- <menu_item_call label="Test i web browser" name="Web Browser Test"/>
+ <menu_item_call label="Media Browser Test" name="Web Browser Test"/>
+ <menu_item_call label="Web Content Floater Test" name="Web Content Floater Test"/>
<menu_item_check label="Vis gitter vælger" name="Show Grid Picker"/>
<menu_item_call label="Vis notifikationskonsol" name="Show Notifications Console"/>
</menu>
diff --git a/indra/newview/skins/default/xui/da/menu_media_ctrl.xml b/indra/newview/skins/default/xui/da/menu_media_ctrl.xml
new file mode 100644
index 0000000000..788b1c4b59
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_media_ctrl.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="media ctrl context menu">
+ <menu_item_call label="Klip" name="Cut"/>
+ <menu_item_call label="Kopier" name="Copy"/>
+ <menu_item_call label="Sæt ind" name="Paste"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/da/menu_mini_map.xml b/indra/newview/skins/default/xui/da/menu_mini_map.xml
index 9dcce49708..186dbd476a 100644
--- a/indra/newview/skins/default/xui/da/menu_mini_map.xml
+++ b/indra/newview/skins/default/xui/da/menu_mini_map.xml
@@ -3,6 +3,7 @@
<menu_item_call label="Zoom tæt" name="Zoom Close"/>
<menu_item_call label="Zoom mellem" name="Zoom Medium"/>
<menu_item_call label="Zoom langt" name="Zoom Far"/>
+ <menu_item_call label="Zoom standard" name="Zoom Default"/>
<menu_item_check label="Rotér kort" name="Rotate Map"/>
<menu_item_check label="Auto centrér" name="Auto Center"/>
<menu_item_call label="Fjern ref." name="Stop Tracking"/>
diff --git a/indra/newview/skins/default/xui/da/menu_model_import_gear_default.xml b/indra/newview/skins/default/xui/da/menu_model_import_gear_default.xml
new file mode 100644
index 0000000000..d9626692d5
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_model_import_gear_default.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="model_menu_gear_default">
+ <menu_item_check label="Show edges" name="show_edges"/>
+ <menu_item_check label="Show physics" name="show_physics"/>
+ <menu_item_check label="Show textures" name="show_textures"/>
+ <menu_item_check label="Show skin weight" name="show_skin_weight"/>
+ <menu_item_check label="Show joint positions" name="show_joint_positions"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/da/menu_object.xml b/indra/newview/skins/default/xui/da/menu_object.xml
index bc0cdde86f..ba62ccf90c 100644
--- a/indra/newview/skins/default/xui/da/menu_object.xml
+++ b/indra/newview/skins/default/xui/da/menu_object.xml
@@ -16,14 +16,14 @@
<context_menu label="Vedhæft" name="Object Attach"/>
<context_menu label="Vedhæft HUD" name="Object Attach HUD"/>
</context_menu>
- <context_menu label="Fjern" name="Remove">
+ <context_menu label="Administrér" name="Remove">
<menu_item_call label="Rapportér misbrug" name="Report Abuse..."/>
<menu_item_call label="Blokér" name="Object Mute"/>
<menu_item_call label="Returnér" name="Return..."/>
- <menu_item_call label="Slet" name="Delete"/>
</context_menu>
<menu_item_call label="Tag" name="Pie Object Take"/>
<menu_item_call label="Tag kopi" name="Take Copy"/>
<menu_item_call label="Betal" name="Pay..."/>
<menu_item_call label="Køb" name="Buy..."/>
+ <menu_item_call label="Slet" name="Delete"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/da/menu_outfit_gear.xml b/indra/newview/skins/default/xui/da/menu_outfit_gear.xml
index 8b4c776496..0b0fff3b93 100644
--- a/indra/newview/skins/default/xui/da/menu_outfit_gear.xml
+++ b/indra/newview/skins/default/xui/da/menu_outfit_gear.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Gear Outfit">
+<toggleable_menu name="Gear Outfit">
<menu_item_call label="Tag på - Erstat nuværende sæt" name="wear"/>
<menu_item_call label="Tag på - Tilføj til nuværende sæt" name="wear_add"/>
<menu_item_call label="Tag af - Fjern fra nuværende sæt" name="take_off"/>
@@ -14,6 +14,7 @@
<menu_item_call label="Ny undertrøje" name="New Undershirt"/>
<menu_item_call label="Nye underbukser" name="New Underpants"/>
<menu_item_call label="Ny alpha" name="New Alpha"/>
+ <menu_item_call label="Ny fysik" name="New Physics"/>
<menu_item_call label="Ny tatovering" name="New Tattoo"/>
</menu>
<menu label="Nye kropsdele" name="New Body Parts">
@@ -24,4 +25,4 @@
</menu>
<menu_item_call label="Omdøb sæt" name="rename"/>
<menu_item_call label="Slet sæt" name="delete_outfit"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/da/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/da/menu_places_gear_folder.xml
index 3ee3c02fb1..5f573c2363 100644
--- a/indra/newview/skins/default/xui/da/menu_places_gear_folder.xml
+++ b/indra/newview/skins/default/xui/da/menu_places_gear_folder.xml
@@ -1,7 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_folder_gear">
+<toggleable_menu name="menu_folder_gear">
<menu_item_call label="Tilføj landemærke" name="add_landmark"/>
<menu_item_call label="Tilføj mappe" name="add_folder"/>
+ <menu_item_call label="Gendan genstand" name="restore_item"/>
<menu_item_call label="Klip" name="cut"/>
<menu_item_call label="Kopiér" name="copy_folder"/>
<menu_item_call label="Sæt ind" name="paste"/>
@@ -12,4 +13,4 @@
<menu_item_call label="Udvid alle mapper" name="expand_all"/>
<menu_item_call label="Luk alle mapper" name="collapse_all"/>
<menu_item_check label="Sortér efter dato" name="sort_by_date"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/da/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/da/menu_places_gear_landmark.xml
index 21f425c49d..13dbcdd42e 100644
--- a/indra/newview/skins/default/xui/da/menu_places_gear_landmark.xml
+++ b/indra/newview/skins/default/xui/da/menu_places_gear_landmark.xml
@@ -1,10 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_ladmark_gear">
+<toggleable_menu name="menu_ladmark_gear">
<menu_item_call label="Teleportér" name="teleport"/>
<menu_item_call label="Mere information" name="more_info"/>
<menu_item_call label="Vis på kort" name="show_on_map"/>
<menu_item_call label="Tilføj landemærke" name="add_landmark"/>
<menu_item_call label="Tilføj mappe" name="add_folder"/>
+ <menu_item_call label="Gendan genstand" name="restore_item"/>
<menu_item_call label="Klip" name="cut"/>
<menu_item_call label="Kopiér landemærke" name="copy_landmark"/>
<menu_item_call label="Kopiér SLurl" name="copy_slurl"/>
@@ -15,4 +16,4 @@
<menu_item_call label="Luk alle mapper" name="collapse_all"/>
<menu_item_check label="Sortér efter dato" name="sort_by_date"/>
<menu_item_call label="Opret favorit" name="create_pick"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/da/menu_viewer.xml b/indra/newview/skins/default/xui/da/menu_viewer.xml
index cfc60c8f84..d695cd1f89 100644
--- a/indra/newview/skins/default/xui/da/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/da/menu_viewer.xml
@@ -5,17 +5,21 @@
<menu_item_call label="Mit instrumentpanel" name="Manage My Account"/>
<menu_item_call label="Køb L$" name="Buy and Sell L$"/>
<menu_item_call label="Profil" name="Profile"/>
- <menu_item_call label="Skift sæt" name="ChangeOutfit"/>
+ <menu_item_call label="Udseende" name="ChangeOutfit"/>
<menu_item_check label="Beholdning" name="Inventory"/>
<menu_item_check label="Min beholdning" name="ShowSidetrayInventory"/>
<menu_item_check label="Mine bevægelser" name="Gestures"/>
<menu_item_check label="Min stemme" name="ShowVoice"/>
+ <menu label="Bevægelser" name="Movement">
+ <menu_item_call label="Sid ned" name="Sit Down Here"/>
+ <menu_item_check label="Flyv" name="Fly"/>
+ <menu_item_check label="Løb altid" name="Always Run"/>
+ <menu_item_call label="Stop animering" name="Stop Animating My Avatar"/>
+ </menu>
<menu label="Min status" name="Status">
<menu_item_call label="Væk" name="Set Away"/>
<menu_item_call label="Optaget" name="Set Busy"/>
</menu>
- <menu_item_call label="Anmod om administrator status" name="Request Admin Options"/>
- <menu_item_call label="Stop administrator status" name="Leave Admin Options"/>
<menu_item_call label="Afslut [APP_NAME]" name="Quit"/>
</menu>
<menu label="Kommunikér" name="Communicate">
@@ -27,13 +31,13 @@
<menu label="Verden" name="World">
<menu_item_check label="Mini-kort" name="Mini-Map"/>
<menu_item_check label="Verdenskort" name="World Map"/>
+ <menu_item_check label="Søg" name="Search"/>
<menu_item_call label="Foto" name="Take Snapshot"/>
<menu_item_call label="Opret landemærke for dette sted" name="Create Landmark Here"/>
- <menu label="Profil for sted" name="Land">
- <menu_item_call label="Profil for sted" name="Place Profile"/>
- <menu_item_call label="Om land" name="About Land"/>
- <menu_item_call label="Region/Estate" name="Region/Estate"/>
- </menu>
+ <menu_item_separator/>
+ <menu_item_call label="Profil for sted" name="Place Profile"/>
+ <menu_item_call label="Om land" name="About Land"/>
+ <menu_item_call label="Region/Estate" name="Region/Estate"/>
<menu_item_call label="Køb dette land" name="Buy Land"/>
<menu_item_call label="Mit land" name="My Land"/>
<menu label="Vis" name="LandShow">
@@ -45,10 +49,11 @@
<menu_item_check label="Grundejere" name="Land Owners"/>
<menu_item_check label="Koordinater" name="Coordinates"/>
<menu_item_check label="Parcel egenskaber" name="Parcel Properties"/>
+ <menu_item_check label="Avanceret menu" name="Show Advanced Menu"/>
</menu>
<menu_item_call label="Teleport hjem" name="Teleport Home"/>
<menu_item_call label="Sæt dette sted som &apos;Hjem&apos;" name="Set Home to Here"/>
- <menu label="Sol" name="Environment Settings">
+ <menu label="Sol" name="Sun">
<menu_item_call label="Solopgang" name="Sunrise"/>
<menu_item_call label="Middag" name="Noon"/>
<menu_item_call label="Solnedgang" name="Sunset"/>
@@ -110,18 +115,22 @@
<menu_item_call label="Billede (L$[COST])..." name="Upload Image"/>
<menu_item_call label="Lyd (L$[COST])..." name="Upload Sound"/>
<menu_item_call label="Animation (L$[COST])..." name="Upload Animation"/>
+ <menu_item_call label="Model..." name="Upload Model"/>
+ <menu_item_call label="Model Wizard..." name="Upload Model Wizard"/>
<menu_item_call label="Mange (L$[COST] pr. fil)..." name="Bulk Upload"/>
+ <menu_item_call label="Sæt standardværdier for upload rettigheder" name="perm prefs"/>
</menu>
+ <menu_item_call label="Fortyd" name="Undo"/>
+ <menu_item_call label="Gendan" name="Redo"/>
</menu>
<menu label="Hjælp" name="Help">
<menu_item_call label="[SECOND_LIFE] Help" name="Second Life Help"/>
+ <menu_item_check label="Aktiver tips" name="Enable Hints"/>
<menu_item_call label="Rapporter misbrug" name="Report Abuse"/>
<menu_item_call label="Rapportér fejl" name="Report Bug"/>
<menu_item_call label="Om [APP_NAME]" name="About Second Life"/>
- <menu_item_check label="Aktiver tips" name="Enable Hints"/>
</menu>
<menu label="Avanceret" name="Advanced">
- <menu_item_call label="Stop animering af min avatar" name="Stop Animating My Avatar"/>
<menu_item_call label="Gendan teksturer" name="Rebake Texture"/>
<menu_item_call label="Sæt UI størrelse til standard" name="Set UI Size to Default"/>
<menu_item_call label="Vælg vinduesstørrelse..." name="Set Window Size..."/>
@@ -129,7 +138,6 @@
<menu_item_check label="Fjern kamerabegrænsninger" name="Disable Camera Distance"/>
<menu_item_check label="Højopløsningsfoto" name="HighResSnapshot"/>
<menu_item_check label="Lydløse fotos til disk" name="QuietSnapshotsToDisk"/>
- <menu_item_check label="Komprimér fotos til disk" name="CompressSnapshotsToDisk"/>
<menu label="Værktøjer til ydelse" name="Performance Tools">
<menu_item_call label="Lag meter" name="Lag Meter"/>
<menu_item_check label="Statistik bjælke" name="Statistics Bar"/>
@@ -144,22 +152,22 @@
<menu_item_check label="Vis muse-sigte" name="ShowCrosshairs"/>
</menu>
<menu label="Gengivelsestyper" name="Rendering Types">
- <menu_item_check label="Simpel" name="Simple"/>
- <menu_item_check label="Alpha" name="Alpha"/>
- <menu_item_check label="Træer" name="Tree"/>
- <menu_item_check label="Avatarer" name="Character"/>
- <menu_item_check label="Overflade" name="SurfacePath"/>
- <menu_item_check label="Himmel" name="Sky"/>
- <menu_item_check label="Vand" name="Water"/>
- <menu_item_check label="Jord" name="Ground"/>
- <menu_item_check label="Volume" name="Volume"/>
- <menu_item_check label="Græs" name="Grass"/>
- <menu_item_check label="Skyer" name="Clouds"/>
- <menu_item_check label="Partikler" name="Particles"/>
- <menu_item_check label="Bump" name="Bump"/>
+ <menu_item_check label="Simpel" name="Rendering Type Simple"/>
+ <menu_item_check label="Alpha" name="Rendering Type Alpha"/>
+ <menu_item_check label="Træer" name="Rendering Type Tree"/>
+ <menu_item_check label="Avatarer" name="Rendering Type Character"/>
+ <menu_item_check label="Surface Patch" name="Rendering Type Surface Patch"/>
+ <menu_item_check label="Himmel" name="Rendering Type Sky"/>
+ <menu_item_check label="Vand" name="Rendering Type Water"/>
+ <menu_item_check label="Jord" name="Rendering Type Ground"/>
+ <menu_item_check label="Volume" name="Rendering Type Volume"/>
+ <menu_item_check label="Græs" name="Rendering Type Grass"/>
+ <menu_item_check label="Skyer" name="Rendering Type Clouds"/>
+ <menu_item_check label="Partikler" name="Rendering Type Particles"/>
+ <menu_item_check label="Bump" name="Rendering Type Bump"/>
</menu>
<menu label="Gengivelsesegenskaber" name="Rendering Features">
- <menu_item_check label="UI" name="UI"/>
+ <menu_item_check label="UI" name="ToggleUI"/>
<menu_item_check label="Valgte" name="Selected"/>
<menu_item_check label="Fremhævede" name="Highlighted"/>
<menu_item_check label="Dynamiske teksturer" name="Dynamic Textures"/>
@@ -171,12 +179,8 @@
<menu_item_call label="Tøm gruppe cache" name="ClearGroupCache"/>
<menu_item_check label="Muse udjævning" name="Mouse Smoothing"/>
<menu label="Shortcuts" name="Shortcuts">
- <menu_item_call label="Billede (L$[COST])..." name="Upload Image"/>
- <menu_item_check label="Søg" name="Search"/>
<menu_item_call label="Frigør taster" name="Release Keys"/>
- <menu_item_call label="Sæt UI størrelse til standard" name="Set UI Size to Default"/>
- <menu_item_check label="Løb altid" name="Always Run"/>
- <menu_item_check label="Flyv" name="Fly"/>
+ <menu_item_check label="Vis avanceret menu (gammel genvej)" name="Show Advanced Menu - legacy shortcut"/>
<menu_item_call label="Luk vindue" name="Close Window"/>
<menu_item_call label="Luk alle vinduer" name="Close All Windows"/>
<menu_item_call label="Foto til disk" name="Snapshot to Disk"/>
@@ -184,17 +188,9 @@
<menu_item_check label="&quot;Joystick Flycam&quot;" name="Joystick Flycam"/>
<menu_item_call label="Nulstil udsyn" name="Reset View"/>
<menu_item_call label="Se på den sidste der chattede" name="Look at Last Chatter"/>
- <menu label="Vælg byggeværktøj" name="Select Tool">
- <menu_item_call label="Fokuseringsværktøj" name="Focus"/>
- <menu_item_call label="Flyt værktøj" name="Move"/>
- <menu_item_call label="Redigeringsværktøj" name="Edit"/>
- <menu_item_call label="Opret værktøj" name="Create"/>
- <menu_item_call label="Land værktøj" name="Land"/>
- </menu>
<menu_item_call label="Zoom ind" name="Zoom In"/>
<menu_item_call label="Zoom standard" name="Zoom Default"/>
<menu_item_call label="Zoom ud" name="Zoom Out"/>
- <menu_item_check label="Vis avanceret menu" name="Show Advanced Menu"/>
</menu>
<menu_item_call label="Vis debug valg" name="Debug Settings"/>
<menu_item_check label="Vis udviklingsmenu" name="Debug Mode"/>
@@ -208,6 +204,7 @@
<menu_item_check label="Konsol med tekstur kategorier" name="Texture Category"/>
<menu_item_check label="Hurtig-timere" name="Fast Timers"/>
<menu_item_check label="Hukommelse" name="Memory"/>
+ <menu_item_check label="Scene Statistics" name="Scene Statistics"/>
<menu_item_call label="Vis Regionsinfo i debug-konsol" name="Region Info to Debug Console"/>
<menu_item_check label="Kamera" name="Camera"/>
<menu_item_check label="Vind" name="Wind"/>
@@ -215,8 +212,11 @@
</menu>
<menu label="Vis info" name="Display Info">
<menu_item_check label="Vis tid" name="Show Time"/>
+ <menu_item_check label="Show Upload Cost" name="Show Upload Cost"/>
<menu_item_check label="Vis gengivelses information" name="Show Render Info"/>
+ <menu_item_check label="Vis tekstur information" name="Show Texture Info"/>
<menu_item_check label="Vis farve under cursor" name="Show Color Under Cursor"/>
+ <menu_item_check label="Vis memory" name="Show Memory"/>
<menu_item_check label="Vis opdateringer på objekter" name="Show Updates"/>
</menu>
<menu label="Fremtving en fejl" name="Force Errors">
@@ -234,6 +234,14 @@
<menu_item_check label="Tilfældige framerates" name="Randomize Framerate"/>
<menu_item_check label="Frame test" name="Frame Test"/>
</menu>
+ <menu label="Render Metadata" name="Render Metadata">
+ <menu_item_check label="Normals" name="Normals"/>
+ <menu_item_check label="Physics Shapes" name="Physics Shapes"/>
+ <menu_item_check label="Opdatér type" name="Update Type"/>
+ <menu_item_check label="LOD Info" name="LOD Info"/>
+ <menu_item_check label="Build Queue" name="Build Queue"/>
+ <menu_item_check label="Sculpt" name="Sculpt"/>
+ </menu>
<menu label="Gengivelse" name="Rendering">
<menu_item_check label="Akser" name="Axes"/>
<menu_item_check label="Wireframe" name="Wireframe"/>
@@ -255,37 +263,34 @@
<menu_item_call label="Mist en netværkspakke" name="Drop a Packet"/>
</menu>
<menu_item_call label="Stød, skub &amp; slag" name="Bumps, Pushes &amp;amp; Hits"/>
- <menu label="Verden" name="World">
+ <menu label="Verden" name="DevelopWorld">
<menu_item_check label="Vælg anden sol end region" name="Sim Sun Override"/>
- <menu_item_check label="Pejlelys blink effekt" name="Cheesy Beacon"/>
<menu_item_check label="Fast vejr" name="Fixed Weather"/>
<menu_item_call label="Dump Region Object Cache" name="Dump Region Object Cache"/>
</menu>
<menu label="UI (brugerflade)" name="UI">
- <menu_item_call label="Test web browser" name="Web Browser Test"/>
+ <menu_item_call label="Media browser test" name="Web Browser Test"/>
+ <menu_item_call label="Browser med webindhold" name="Web Content Browser"/>
<menu_item_call label="Print info om valgt objekt" name="Print Selected Object Info"/>
<menu_item_call label="Hukommelse statistik" name="Memory Stats"/>
- <menu_item_check label="Dobbelt-klink Auto-pilot" name="Double-ClickAuto-Pilot"/>
- <menu_item_check label="Dobeltklik for at teleportere" name="DoubleClick Teleport"/>
+ <menu_item_check label="Debug konsol for region" name="Region Debug Console"/>
<menu_item_check label="Debug klik" name="Debug Clicks"/>
<menu_item_check label="Debug muse-hændelser" name="Debug Mouse Events"/>
</menu>
<menu label="XUI" name="XUI">
<menu_item_call label="Genindlæs farveopsætning" name="Reload Color Settings"/>
<menu_item_call label="Vis font test" name="Show Font Test"/>
- <menu_item_call label="Hent fra XML" name="Load from XML"/>
- <menu_item_call label="Gem til XML" name="Save to XML"/>
<menu_item_check label="Vis XUI navne" name="Show XUI Names"/>
<menu_item_call label="Send testbeskeder (IM)" name="Send Test IMs"/>
<menu_item_call label="Skriv navne-cache til disk" name="Flush Names Caches"/>
</menu>
<menu label="Avatar" name="Character">
<menu label="Grab Baked Texture" name="Grab Baked Texture">
- <menu_item_call label="Iris" name="Iris"/>
- <menu_item_call label="Hovede" name="Head"/>
- <menu_item_call label="Overkrop" name="Upper Body"/>
- <menu_item_call label="Underkrop" name="Lower Body"/>
- <menu_item_call label="Nederdel" name="Skirt"/>
+ <menu_item_call label="Iris" name="Grab Iris"/>
+ <menu_item_call label="Hovede" name="Grab Head"/>
+ <menu_item_call label="Overkrop" name="Grab Upper Body"/>
+ <menu_item_call label="Underkrop" name="Grab Lower Body"/>
+ <menu_item_call label="Nederdel" name="Grab Skirt"/>
</menu>
<menu label="Avatar tests" name="Character Tests">
<menu_item_call label="Skift avatar geometri" name="Toggle Character Geometry"/>
@@ -300,14 +305,15 @@
<menu_item_call label="Debug avatar teksturer" name="Debug Avatar Textures"/>
</menu>
<menu_item_check label="HTTP teksturer" name="HTTP Textures"/>
+ <menu_item_check label="HTTP Inventory" name="HTTP Inventory"/>
<menu_item_check label="Benyt consol vindue ved næste opstart" name="Console Window"/>
- <menu_item_check label="Vis administrationsmenu" name="View Admin Options"/>
<menu_item_call label="Anmod om administrator status" name="Request Admin Options"/>
<menu_item_call label="Forlad administrationsstatus" name="Leave Admin Options"/>
+ <menu_item_check label="Vis administrationsmenu" name="View Admin Options"/>
</menu>
<menu label="Administrér" name="Admin">
- <menu label="Object">
- <menu_item_call label="Tag kopi" name="Take Copy"/>
+ <menu label="Object" name="AdminObject">
+ <menu_item_call label="Tag kopi" name="Admin Take Copy"/>
<menu_item_call label="Gennemtving ejer til mig" name="Force Owner To Me"/>
<menu_item_call label="Gennemtving ejer tolerance" name="Force Owner Permissive"/>
<menu_item_call label="Slet" name="Delete"/>
@@ -324,4 +330,9 @@
</menu>
<menu_item_call label="&quot;God Tools&quot;" name="God Tools"/>
</menu>
+ <menu label="Admin" name="Deprecated">
+ <menu label="Take Off Clothing" name="Take Off Clothing">
+ <menu_item_call label="Fysik" name="Physics"/>
+ </menu>
+ </menu>
</menu_bar>
diff --git a/indra/newview/skins/default/xui/da/notifications.xml b/indra/newview/skins/default/xui/da/notifications.xml
index 63c06ec27e..cf6f1ccdd9 100644
--- a/indra/newview/skins/default/xui/da/notifications.xml
+++ b/indra/newview/skins/default/xui/da/notifications.xml
@@ -72,9 +72,9 @@ Fejl detaljer: Beskeden kaldet &apos;[_NAME]&apos; blev ikke fundet i notificati
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="LoginFailedNoNetwork">
- Kunne ikke oprette forbindelse til [SECOND_LIFE_GRID].
-&apos;[DIAGNOSTIC]&apos;
-Make sure your Internet connection is working properly.
+ Kunne ikke tilslutte til [SECOND_LIFE_GRID].
+ &apos;[DIAGNOSTIC]&apos;
+Check at Internet forbindelsen fungerer korrekt.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="MessageTemplateNotFound">
@@ -109,6 +109,10 @@ Vælg kun en genstand, og prøv igen.
&apos;Ikke-venner&apos; vil ikke vide, at du har valgt at ignorere deres opkald og personlige beskeder (IM)
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="FavoritesOnLogin">
+ Bemærk: Når du aktiverer dette valg, kan enhver der bruger denne computer se dine favorit lokationer.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="GrantModifyRights">
Tildeling af ændre-rettigheder til andre beboere, tillader dem at ændre, slette eller tage ETHVERT objekt du måtte have. Vær MEGET forsigtig ved tildeling af denne rettighed.
Ønsker du at give ændre-rettgheder til [NAME]?
@@ -211,13 +215,6 @@ Du skal bruge en konto for at benytte [SECOND_LIFE]. Ønsker du at oprette en ko
<notification name="InvalidCredentialFormat">
Du skal indtaste enten dit brugernavn eller både dit fornavn og efternavn for din avatar i brugernavn feltet, derefter log på igen.
</notification>
- <notification name="AddClassified">
- Annoncer vil vises i &apos;Annoncer&apos; sektionen i søge biblioteket og på [http://secondlife.com/community/classifieds secondlife.com] i en uge.
-Udfyld din annonce og klik på &apos;Udgiv...&apos; for at tilf&apos;je den til biblioteket.
-Du vil blive spurgt om en pris når du klikker på &apos;Udgiv&apos;.
-Jo mere du betaler, jo højere oppe på listen vises annoncen, og den vil også optræde højere oppe når personer søger.
- <usetemplate ignoretext="Hvordan man opretter en annonce" name="okcancelignore" notext="Cancel" yestext="OK"/>
- </notification>
<notification name="DeleteMedia">
Du har valgt at slette media tilknyttet denne overflade.
Er du sikker på at du vil fortsætte?
@@ -247,6 +244,9 @@ Note: This will clear the cache.
<notification name="ChangeSkin">
Den nye hud vil blive vist ved næste genstart af [APP_NAME].
</notification>
+ <notification name="ChangeLanguage">
+ Ændring af sprog vil først have effekt efter genstart af [APP_NAME].
+ </notification>
<notification name="StartRegionEmpty">
Ups, din start region er ikke angivet.
Indtast venligst navn på region i Start lokation feltet eller vælg &quot;Min sidste lokation&quot; eller &quot;Hjem&quot;.
@@ -288,6 +288,10 @@ og du vil miste dem fra din beholdning hvis du forærer dem væk. Er du sikker p
Gå til [_URL] for information om køb af L$?
</notification>
+ <notification name="SoundFileInvalidChunkSize">
+ Fejl i WAV fil (chunk size):
+[FILE]
+ </notification>
<notification name="CannotEncodeFile">
Kunne ikke &apos;forstå&apos; filen: [FILE]
</notification>
@@ -409,7 +413,7 @@ Tilbyd venskab til [NAME]?
<input name="message">
[DESC] (ny)
</input>
- <button name="Offer" text="OK"/>
+ <button name="OK" text="OK"/>
<button name="Cancel" text="Annullér"/>
</form>
</notification>
@@ -419,7 +423,7 @@ Tilbyd venskab til [NAME]?
<input name="message">
[DESC] (ny)
</input>
- <button name="Offer" text="OK"/>
+ <button name="OK" text="OK"/>
<button name="Cancel" text="Annullér"/>
</form>
</notification>
@@ -429,12 +433,12 @@ Tilbyd venskab til [NAME]?
<input name="new_name">
[NAME]
</input>
- <button name="Offer" text="OK"/>
+ <button name="OK" text="OK"/>
<button name="Cancel" text="Annullér"/>
</form>
</notification>
<notification name="RemoveFromFriends">
- Ønsker du at fjerne [NAME] fra din venneliste?
+ Ønsker du at fjerne &lt;nolink&gt;[NAME]&lt;/nolink&gt; fra din venneliste?
</notification>
<notification name="ConfirmItemDeleteHasLinks">
Mindst en af genstandene har lænkede genstande der peger på den. Hvis du sletter denne genstand, vil lænkninger ikke virke mere. Det anbefales kraftigt at fjerne lænkninger først.
@@ -450,6 +454,7 @@ Købsprisen for dette land er ikke refunderet til ejeren. Hvis en dedikeret parv
Dediker disse [AREA] m² land til gruppen &apos;[GROUP_NAME]&apos;?
</notification>
<notification name="ErrorMessage">
+ [ERROR_MESSAGE]
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="AvatarMovedDesired">
@@ -585,6 +590,48 @@ Denne opdatering er ikke påkrævet, men det anbefales at installere den for at
Download til dit Program bibliotek?
</notification>
+ <notification name="FailedUpdateInstall">
+ Der opstod en fejl ved installation af opdatering.
+Hent og installér venligst den nyeste version fra
+http://secondlife.com/download.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="FailedRequiredUpdateInstall">
+ Vi kunne ikke installere en påkrævet opdatering.
+Du kan ikke logge på før [APP_NAME] er blevet opdateret.
+
+Hent og installer venligst den nyeste klien fra
+http://secondlife.com/download.
+ <usetemplate name="okbutton" yestext="Afslut"/>
+ </notification>
+ <notification name="UpdaterServiceNotRunning">
+ Dette er en påkrævet opdatering af din Second Life installation.
+
+Du kan downloade opdateringen fra http://www.secondlife.com/downloads
+eller du kan installere den nu.
+ <usetemplate name="okcancelbuttons" notext="Afslut Second Life" yestext="Hent og installér nu"/>
+ </notification>
+ <notification name="DownloadBackgroundTip">
+ Vi har hentet en opdatering til din [APP_NAME] installation.
+Version [VERSION] [[RELEASE_NOTES_FULL_URL] Information about this update]
+ <usetemplate name="okcancelbuttons" notext="Senere..." yestext="Installér nu og genstart [APP_NAME]"/>
+ </notification>
+ <notification name="DownloadBackgroundDialog">
+ Vi har hentet en opdatering til din [APP_NAME] installation.
+Version [VERSION] [[RELEASE_NOTES_FULL_URL] Information about this update]
+ <usetemplate name="okcancelbuttons" notext="Senere..." yestext="Installér nu og genstart [APP_NAME]"/>
+ </notification>
+ <notification name="RequiredUpdateDownloadedVerboseDialog">
+ Vi har hentet en påkrævet opdatering.
+Version [VERSION]
+
+Du skal genstarte [APP_NAME] for at installere denne opdatering.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="RequiredUpdateDownloadedDialog">
+ Du skal genstarte [APP_NAME] for at installere opdateringen.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="DeedObjectToGroup">
<usetemplate ignoretext="Bekræft før jeg dedikerer et objekt til en gruppe" name="okcancelignore" notext="Cancel" yestext="Deed"/>
</notification>
@@ -695,6 +742,7 @@ Prøv venligst igen senere.
[OLD_NAME] ([SLID]) er nu kendt som [NEW_NAME].
</notification>
<notification name="OfferTeleport">
+ Tilbyd en teleport til din position med følgende besked?
<form name="form">
<input name="message">
Mød mig i [REGION]
@@ -975,10 +1023,10 @@ Henvis til dette fra en hjemmeside for at give andre nem adgang til denne lokati
Erstattet manglende tøj/kropsdele med standard.
</notification>
<notification name="FriendOnline">
- [NAME] er logget på
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; er logget på
</notification>
<notification name="FriendOffline">
- [NAME] er logget af
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; er logget af
</notification>
<notification name="AddSelfFriend">
Selvom du nok er meget sød, kan du ikke tilføje dig selv som ven.
@@ -1024,6 +1072,12 @@ Det kan påvirke din indtastning af password.
<notification name="RezItemNoPermissions">
Utilstrækkelige tilladelser til at danne genstanden.
</notification>
+ <notification name="IMAcrossParentEstates">
+ Ikke muligt at sende IM over forældre estates.
+ </notification>
+ <notification name="TransferInventoryAcrossParentEstates">
+ Ikke muligt at overføre din beholdning over forældre parceller.
+ </notification>
<notification name="UnableToLoadNotecard">
Ikke muligt at indlæse note.
Prøv venligst igen.
@@ -1106,14 +1160,6 @@ Prøv at vælge mindre stykker land.
<notification name="NoContentToSearch">
Vælg venligst mindst en indholdstype for at søge (PG, Mature, or Adult).
</notification>
- <notification name="GroupVote">
- [NAME] har forslået at stemme for:
-[MESSAGE]
- <form name="form">
- <button name="VoteNow" text="Stem nu"/>
- <button name="Later" text="Senere"/>
- </form>
- </notification>
<notification name="SystemMessage">
[MESSAGE]
</notification>
@@ -1289,7 +1335,7 @@ Prøv igen om lidt.
</notification>
<notification name="ObjectGiveItem">
Et object med navnet &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; ejet af [NAME_SLURL] har givet dig denne [OBJECTTYPE]:
-[ITEM_SLURL]
+&lt;nolink&gt;[ITEM_SLURL]&lt;/nolink&gt;
<form name="form">
<button name="Keep" text="Behold"/>
<button name="Discard" text="Smid væk"/>
@@ -1358,10 +1404,10 @@ Prøv igen om lidt.
(Som udgangspunkt, vil du være i stand til at se den andens online status)
</notification>
<notification name="FriendshipAccepted">
- [NAME] accepterede dit tilbud om venskab.
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; accepterede dit tilbud om venskab.
</notification>
<notification name="FriendshipDeclined">
- [NAME] afviste dit tilbud om venskab.
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; afviste dit tilbud om venskab.
</notification>
<notification name="FriendshipAcceptedByMe">
Tilbud om venskab accepteret.
@@ -1370,8 +1416,8 @@ Prøv igen om lidt.
Tilbud om venskab afvist.
</notification>
<notification name="OfferCallingCard">
- [NAME] tilbyder dig et visitkort.
-Dette vil lave et bogmørke i din beholding, så du hurtigt kan sende en IM til denne beboer.
+ [NAME] tilbyder sit visitkort.
+Dette vil tilføje et bogmærke i din beholdning, så du hurtigt kan sende en personlig besked til denne beboer.
<form name="form">
<button name="Accept" text="Acceptér"/>
<button name="Decline" text="Afvis"/>
@@ -1563,9 +1609,6 @@ Klik på Acceptér for at deltage eller Afvis for at afvise invitationen. Klik p
<notification name="VoiceCallGenericError">
En fejl er opstået under forsøget på at koble sig på stemme chatten [VOICE_CHANNEL_NAME]. Pråv venligst senere.
</notification>
- <notification name="ServerVersionChanged">
- Du er netop ankommet til en region der benytter en anden server version, hvilket kan influere på hastigheden. [[URL] For at se yderligere.]
- </notification>
<notification name="UnsupportedCommandSLURL">
Den SLurl du klikkede på understøttes ikke.
</notification>
@@ -1605,6 +1648,10 @@ De vil blive blokeret nogle få sekunder af sikkerhedsmæssige årsager.
Din stemme er blevet slukket af moderatoren.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="UploadCostConfirmation">
+ Dette upload vil koste L$[PRICE], ønsker du at sende?
+ <usetemplate name="okcancelbuttons" notext="Annullér" yestext="Send"/>
+ </notification>
<notification name="ConfirmClearTeleportHistory">
Er du sikker på at du vil slette teleport historikken?
<usetemplate name="okcancelbuttons" notext="Annullér" yestext="OK"/>
@@ -1616,12 +1663,15 @@ Knappen vil blive vist når der er nok plads til den.
<notification name="ShareNotification">
Vælg beboere at dele med.
</notification>
+ <notification name="MeshUploadError">
+ [LABEL] kunne ikke sendes: [MESSAGE] [IDENTIFIER] [INVALIDITY_IDENTIFIER]
+ </notification>
<notification name="ShareItemsConfirmation">
Er du sikker på at du vil dele følgende genstande:
-[ITEMS]
+&lt;nolink&gt;[ITEMS]&lt;/nolink&gt;
-Med følgende beboere:
+Me følgende beboere:
[RESIDENTS]
<usetemplate name="okcancelbuttons" notext="Annullér" yestext="Ok"/>
@@ -1632,6 +1682,19 @@ Med følgende beboere:
<notification name="DeedToGroupFail">
Dedikering til gruppe fejlede.
</notification>
+ <notification name="ReleaseLandThrottled">
+ Parcellen [PARCEL_NAME] kan ikke efterlades på nuværende tidspunkt.
+ </notification>
+ <notification name="ReleasedLandWithReclaim">
+ [AREA] m² parcellen &apos;[PARCEL_NAME]&apos; er blevet frigivet.
+
+Du har [RECLAIM_PERIOD] timer til at få den tilbage for L$0 før den udbydes til salg til andre beboere.
+ </notification>
+ <notification name="ReleasedLandNoReclaim">
+ [AREA] m² parcel &apos;[PARCEL_NAME]&apos; er blevet frigivet.
+
+Parcellen kan nu købes af enhver beboer.
+ </notification>
<notification name="AvatarRezNotification">
( [EXISTENCE] sekunder i live )
Avatar &apos;[NAME]&apos; var ikke sky mere, efter [TIME] sekunder.
@@ -1668,9 +1731,7 @@ Avatar &apos;[NAME]&apos; har forladt udseende modus.
<notification name="NoConnect">
Vi har problemer med at oprette forbindelse via [PROTOCOL] [HOSTID].
Check venligst din netværks- og firewallsetup.
- <form name="form">
- <button name="OK" text="OK"/>
- </form>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="NoVoiceConnect">
Vi har problemer med at oprette forbindelse til din stemme server:
@@ -1679,9 +1740,7 @@ Check venligst din netværks- og firewallsetup.
Stemme kommunikation vil ikke være tilgængelig.
Check venligst din netværks- og firewall setup.
- <form name="form">
- <button name="OK" text="OK"/>
- </form>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="AvatarRezLeftNotification">
( [EXISTENCE] sekunder i live )
@@ -1714,6 +1773,13 @@ Sluk for alles lyd?
<notification label="Stå op" name="HintSit">
For at rejse dig op og forlad siddeposition, tryk på &quot;Stå op&quot; knappen.
</notification>
+ <notification label="Tal" name="HintSpeak">
+ Klik på tal knappen for at tænde og slukke for din mikrofon.
+
+Klik på den lille pil-op for at se stemme kontrolpanelet.
+
+Skjules tale knappen, vil stemmechat ikke være mulig.
+ </notification>
<notification label="Undersøg verden" name="HintDestinationGuide">
Destinationsguiden indeholder tusinder af nye steder der kan opleves. Vælg venligst et sted og vælg Teleport for at komme derhen.
</notification>
@@ -1723,9 +1789,19 @@ Sluk for alles lyd?
<notification label="Flyt" name="HintMove">
For at gå eller løbe, åben Flyt panelet for neden og brug pilene til at navigere. Du kan også bruge pile-tasterne på dit tastatur.
</notification>
+ <notification label="" name="HintMoveClick">
+ 1. Klik for at gå
+Klik et hvorsomhelst på jorden for at gå til dette sted.
+
+2. Klik og træk for at rotere visning
+Klik hvorsomhelst i verden for at rotere din visning
+ </notification>
<notification label="Visningsnavn" name="HintDisplayName">
Angiv dit konfigurérbare visningsnavn her. Dette er i tillæg til dit unikke brugernavn, som ikke kan ændres. Du kan ændre hvordan du ser andre beboeres navne i dine indstillinger.
</notification>
+ <notification label="Se" name="HintView">
+ For at ændre dit kamera-view, benyt kredsløbs og panoreringskontrollerne. Nulstil view ved at trykke Esc eller ved at gå.
+ </notification>
<notification label="Beholdning" name="HintInventory">
Undersøg din beholdning for at finde ting. Nyeste genstand findes lettes under fanen &quot;Nye ting&quot;
</notification>
@@ -1739,6 +1815,63 @@ Sluk for alles lyd?
<button name="open" text="Ã…ben pop-up vindue"/>
</form>
</notification>
+ <notification name="AuthRequest">
+ Hjemmesiden på &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos; in realm &apos;[REALM]&apos; kræver et brugernavn og password.
+ <form name="form">
+ <input name="username" text="Brugernavn"/>
+ <input name="password" text="Password"/>
+ <button name="ok" text="Send"/>
+ <button name="cancel" text="Annullér"/>
+ </form>
+ </notification>
+ <notification label="" name="ModeChange">
+ For at skifte tilstand skal du genstarte programmet.
+ <usetemplate name="okcancelbuttons" notext="Afslut ikke" yestext="Afslut"/>
+ </notification>
+ <notification label="" name="NoClassifieds">
+ Oprettelse og redigering af annoncer er kun muligt i avanceret tilstand. Ønsker du at logge ud for at skifte tilstand? Valg af tilstand findes på login skærmbilledet.
+ <usetemplate name="okcancelbuttons" notext="Afslut ikke" yestext="Afslut"/>
+ </notification>
+ <notification label="" name="NoGroupInfo">
+ Oprettelse og redigering af grupper er kun muligt i avanceret tilstand. Ønsker du at logge ud for at skifte tilstand? Valg af tilstand findes på login skærmbilledet.
+ <usetemplate name="okcancelbuttons" notext="Afslut ikke" yestext="Afslut"/>
+ </notification>
+ <notification label="" name="NoPlaceInfo">
+ Det er kun muligt at vise profil for stedet i avanceret opsætning. Ønsker du at logge ud for at skifte tilstand? Valg af tilstand findes på login skærmbilledet.
+ <usetemplate name="okcancelbuttons" notext="Afslut ikke" yestext="Afslut"/>
+ </notification>
+ <notification label="" name="NoPicks">
+ Oprettelse og redigering af favoritter er kun mulig i avanceret tilstand. Ønsker du at logge ud for at skifte tilstand? Valg af tilstand findes på login skærmbilledet.
+ <usetemplate name="okcancelbuttons" notext="Afslut ikke" yestext="Afslut"/>
+ </notification>
+ <notification label="" name="NoWorldMap">
+ Det er kun muligt at se verdenskortet i avanceret tilstand.Ønsker du at logge ud for at skifte tilstand? Valg af tilstand findes på login skærmbilledet.
+ <usetemplate name="okcancelbuttons" notext="Afslut ikke" yestext="Afslut"/>
+ </notification>
+ <notification label="" name="NoVoiceCall">
+ Stemme kald kan kun benttes i avanceret tilstand. Ønsker du at logge ud for at skifte tilstand?
+ <usetemplate name="okcancelbuttons" notext="Afslut ikke" yestext="Afslut"/>
+ </notification>
+ <notification label="" name="NoAvatarShare">
+ Det er kun mulig at dele i avanceret tilstand. Ønsker du at logge ud for at skifte tilstand?
+ <usetemplate name="okcancelbuttons" notext="Afslut ikke" yestext="Afslut"/>
+ </notification>
+ <notification label="" name="NoAvatarPay">
+ Det er kun muligt at betale andre beboere i avanceret tilstand. Ønsker du at logge ud for at skifte tilstand?
+ <usetemplate name="okcancelbuttons" notext="Afslut ikke" yestext="Afslut"/>
+ </notification>
+ <notification label="" name="NoInventory">
+ Det er kun muligt at vise beholdning i avanceret tilstand. Ønsker du at logge ud og logge på i avanceret tilstand.
+ <usetemplate name="okcancelbuttons" notext="Afslut ikke" yestext="Afslut"/>
+ </notification>
+ <notification label="" name="NoAppearance">
+ Udseende opsætning er kun tilgængelig i avanceret tilstand. Ønsker du at logge ud og logge på i avanceret tilstand.
+ <usetemplate name="okcancelbuttons" notext="Afslut ikke" yestext="Afslut"/>
+ </notification>
+ <notification label="" name="NoSearch">
+ Søgning er kun mulig i avanceret tilstand. Ønsker du at logge ud og logge på i avanceret tilstand.
+ <usetemplate name="okcancelbuttons" notext="Afslut ikke" yestext="Afslut"/>
+ </notification>
<global name="UnsupportedGLRequirements">
Det ser ikke ud til at din hardware opfylder minimumskravene til [APP_NAME]. [APP_NAME] kræver et OpenGL grafikkort som understøter &apos;multitexture&apos;. Check eventuelt om du har de nyeste drivere for grafikkortet, og de nyeste service-packs og patches til dit operativsystem.
diff --git a/indra/newview/skins/default/xui/da/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/da/panel_avatar_list_item.xml
index df1173a0a0..890f4a2f0a 100644
--- a/indra/newview/skins/default/xui/da/panel_avatar_list_item.xml
+++ b/indra/newview/skins/default/xui/da/panel_avatar_list_item.xml
@@ -21,7 +21,7 @@
<string name="FormatYears">
[COUNT]Ã¥
</string>
- <text name="avatar_name" value="Ukendt"/>
+ <text name="avatar_name" value="(henter)"/>
<icon name="permission_edit_theirs_icon" tool_tip="Du kan redigere denne vens objekter"/>
<icon name="permission_edit_mine_icon" tool_tip="Denne ven kan redigere, slette eller tage dine objekter"/>
<icon name="permission_map_icon" tool_tip="Denne ven kan finde dig på kortet"/>
diff --git a/indra/newview/skins/default/xui/da/panel_edit_alpha.xml b/indra/newview/skins/default/xui/da/panel_edit_alpha.xml
index 3826e8a228..0f60a6df51 100644
--- a/indra/newview/skins/default/xui/da/panel_edit_alpha.xml
+++ b/indra/newview/skins/default/xui/da/panel_edit_alpha.xml
@@ -1,10 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_alpha_panel">
- <panel name="avatar_alpha_color_panel">
- <texture_picker label="Alpha - nedre" name="Lower Alpha" tool_tip="Klik for at vælge et billede"/>
- <texture_picker label="Alpha - øvre" name="Upper Alpha" tool_tip="Klik for at vælge et billede"/>
- <texture_picker label="Alpha - hoved" name="Head Alpha" tool_tip="Klik for at vælge et billede"/>
- <texture_picker label="Alpha - øje" name="Eye Alpha" tool_tip="Klik for at vælge et billede"/>
- <texture_picker label="Alpha - hår" name="Hair Alpha" tool_tip="Klik for at vælge et billede"/>
- </panel>
+ <scroll_container name="avatar_alpha_color_panel_scroll">
+ <panel name="avatar_alpha_color_panel">
+ <texture_picker label="Nedre alpha" name="Lower Alpha" tool_tip="Klik for at vælge et billede"/>
+ <texture_picker label="Øverste alpha" name="Upper Alpha" tool_tip="Klik for at vælge et billede"/>
+ <texture_picker label="Hovede alpha" name="Head Alpha" tool_tip="Klik for at vælge et billede"/>
+ <texture_picker label="Øje alpha" name="Eye Alpha" tool_tip="Klik for at vælge et billede"/>
+ <texture_picker label="Hår alpha" name="Hair Alpha" tool_tip="Klik for at vælge et billede"/>
+ </panel>
+ </scroll_container>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_edit_gloves.xml b/indra/newview/skins/default/xui/da/panel_edit_gloves.xml
index 837abdac80..36f58428a6 100644
--- a/indra/newview/skins/default/xui/da/panel_edit_gloves.xml
+++ b/indra/newview/skins/default/xui/da/panel_edit_gloves.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_gloves_panel">
<panel name="avatar_gloves_color_panel">
- <texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge bilede"/>
+ <texture_picker label="Tekstur" name="Fabric" tool_tip="Klik for at vælge bilede"/>
<color_swatch label="Farve/nuance" name="Color/Tint" tool_tip="Klik for at åbne farvevælger"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/da/panel_edit_jacket.xml b/indra/newview/skins/default/xui/da/panel_edit_jacket.xml
index 62934e96c8..4e7336747d 100644
--- a/indra/newview/skins/default/xui/da/panel_edit_jacket.xml
+++ b/indra/newview/skins/default/xui/da/panel_edit_jacket.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_jacket_panel">
<panel name="avatar_jacket_color_panel">
- <texture_picker label="Stof foroven" name="Upper Fabric" tool_tip="Klik for at vælge et billede"/>
- <texture_picker label="Stof forneden" name="Lower Fabric" tool_tip="Klik for at vælge et billede"/>
+ <texture_picker label="Øvre tekstur" name="Upper Fabric" tool_tip="Klik for at vælge et billede"/>
+ <texture_picker label="Nedre tekstur" name="Lower Fabric" tool_tip="Klik for at vælge et billede"/>
<color_swatch label="Farve/nuance" name="Color/Tint" tool_tip="Klik for at åbne farvevælger"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/da/panel_edit_pants.xml b/indra/newview/skins/default/xui/da/panel_edit_pants.xml
index 36a9bc60a9..61056e9e6c 100644
--- a/indra/newview/skins/default/xui/da/panel_edit_pants.xml
+++ b/indra/newview/skins/default/xui/da/panel_edit_pants.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_pants_panel">
<panel name="avatar_pants_color_panel">
- <texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge et bilede"/>
+ <texture_picker label="Tekstur" name="Fabric" tool_tip="Klik for at vælge et bilede"/>
<color_swatch label="Farve/Nuance" name="Color/Tint" tool_tip="Klik for at åbne farvevælger"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/da/panel_edit_physics.xml b/indra/newview/skins/default/xui/da/panel_edit_physics.xml
new file mode 100644
index 0000000000..16c9b16fa3
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_edit_physics.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_physics_panel">
+ <panel label="" name="accordion_panel">
+ <accordion name="physics_accordion">
+ <accordion_tab name="physics_breasts_updown_tab" title="Bryst fasthed"/>
+ <accordion_tab name="physics_breasts_inout_tab" title="Kavalergang"/>
+ <accordion_tab name="physics_breasts_leftright_tab" title="Bryst sving"/>
+ <accordion_tab name="physics_belly_tab" title="Mave fasthed"/>
+ <accordion_tab name="physics_butt_tab" title="Bagdel fasthed"/>
+ <accordion_tab name="physics_butt_leftright_tab" title="Bagdel sving"/>
+ <accordion_tab name="physics_advanced_tab" title="Avancerede parametre"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_edit_pick.xml b/indra/newview/skins/default/xui/da/panel_edit_pick.xml
index fd287b1a0a..3036f30240 100644
--- a/indra/newview/skins/default/xui/da/panel_edit_pick.xml
+++ b/indra/newview/skins/default/xui/da/panel_edit_pick.xml
@@ -29,7 +29,7 @@
<layout_panel name="layout_panel1">
<button label="Gem valgte" name="save_changes_btn"/>
</layout_panel>
- <layout_panel name="layout_panel1">
+ <layout_panel name="layout_panel2">
<button label="Annullér" name="cancel_btn"/>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/da/panel_edit_profile.xml b/indra/newview/skins/default/xui/da/panel_edit_profile.xml
index 80b20f15e9..14fd48ba2f 100644
--- a/indra/newview/skins/default/xui/da/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/da/panel_edit_profile.xml
@@ -26,11 +26,7 @@
<text name="display_name_label" value="Visningsnavn:"/>
<text name="solo_username_label" value="Bugernavn:"/>
<button name="set_name" tool_tip="Sæt visningsnavn"/>
- <text name="solo_user_name" value="Hamilton Hitchings"/>
- <text name="user_name" value="Hamilton Hitchings"/>
- <text name="user_name_small" value="Hamilton Hitchings"/>
<text name="user_label" value="Brugernavn:"/>
- <text name="user_slid" value="hamilton.linden"/>
<panel name="lifes_images_panel">
<icon label="" name="2nd_life_edit_icon" tool_tip="Klik for at vælge et billede"/>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_edit_shirt.xml b/indra/newview/skins/default/xui/da/panel_edit_shirt.xml
index e49667dc8f..4dfb47aab2 100644
--- a/indra/newview/skins/default/xui/da/panel_edit_shirt.xml
+++ b/indra/newview/skins/default/xui/da/panel_edit_shirt.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_shirt_panel">
<panel name="avatar_shirt_color_panel">
- <texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge et billede"/>
+ <texture_picker label="Tekstur" name="Fabric" tool_tip="Klik for at vælge et billede"/>
<color_swatch label="Farve/Nuance" name="Color/Tint" tool_tip="Klik for at åbne farvevælger"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/da/panel_edit_shoes.xml b/indra/newview/skins/default/xui/da/panel_edit_shoes.xml
index 00d31da95a..653ea421b5 100644
--- a/indra/newview/skins/default/xui/da/panel_edit_shoes.xml
+++ b/indra/newview/skins/default/xui/da/panel_edit_shoes.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_shoes_panel">
<panel name="avatar_shoes_color_panel">
- <texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge et billede"/>
+ <texture_picker label="Tekstur" name="Fabric" tool_tip="Klik for at vælge et billede"/>
<color_swatch label="Farve/nuance" name="Color/Tint" tool_tip="Klik for at åbne farvevælger"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/da/panel_edit_skirt.xml b/indra/newview/skins/default/xui/da/panel_edit_skirt.xml
index 44a5beca45..e80e60efd8 100644
--- a/indra/newview/skins/default/xui/da/panel_edit_skirt.xml
+++ b/indra/newview/skins/default/xui/da/panel_edit_skirt.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_skirt_panel">
<panel name="avatar_skirt_color_panel">
- <texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge et billede"/>
+ <texture_picker label="Tekstur" name="Fabric" tool_tip="Klik for at vælge et billede"/>
<color_swatch label="Farve/Nuance" name="Color/Tint" tool_tip="Klik for at åbne farvevælger"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/da/panel_edit_socks.xml b/indra/newview/skins/default/xui/da/panel_edit_socks.xml
index b7abd9d1a0..82a7341317 100644
--- a/indra/newview/skins/default/xui/da/panel_edit_socks.xml
+++ b/indra/newview/skins/default/xui/da/panel_edit_socks.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_socks_panel">
<panel name="avatar_socks_color_panel">
- <texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge et billede"/>
+ <texture_picker label="Tekstur" name="Fabric" tool_tip="Klik for at vælge et billede"/>
<color_swatch label="Farve/Nuance" name="Color/Tint" tool_tip="Klik for at åbne farvevælger"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/da/panel_edit_underpants.xml b/indra/newview/skins/default/xui/da/panel_edit_underpants.xml
index 32596be57b..aacfae79e1 100644
--- a/indra/newview/skins/default/xui/da/panel_edit_underpants.xml
+++ b/indra/newview/skins/default/xui/da/panel_edit_underpants.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_underpants_panel">
<panel name="avatar_underpants_color_panel">
- <texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge bilede"/>
+ <texture_picker label="Tekstur" name="Fabric" tool_tip="Klik for at vælge bilede"/>
<color_swatch label="Farve/nuance" name="Color/Tint" tool_tip="Klik for at åbne farvevælger"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/da/panel_edit_undershirt.xml b/indra/newview/skins/default/xui/da/panel_edit_undershirt.xml
index 14cf79b97f..a9db5d2ab0 100644
--- a/indra/newview/skins/default/xui/da/panel_edit_undershirt.xml
+++ b/indra/newview/skins/default/xui/da/panel_edit_undershirt.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_undershirt_panel">
<panel name="avatar_undershirt_color_panel">
- <texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge bilede"/>
+ <texture_picker label="Tekstur" name="Fabric" tool_tip="Klik for at vælge bilede"/>
<color_swatch label="Farve/nuance" name="Color/Tint" tool_tip="Klik for at åbne farvevælger"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/da/panel_edit_wearable.xml b/indra/newview/skins/default/xui/da/panel_edit_wearable.xml
index 4b9360f0d1..906870e6d9 100644
--- a/indra/newview/skins/default/xui/da/panel_edit_wearable.xml
+++ b/indra/newview/skins/default/xui/da/panel_edit_wearable.xml
@@ -45,6 +45,9 @@
<string name="edit_tattoo_title">
Redigerer tatovering
</string>
+ <string name="edit_physics_title">
+ Redigering af fysik
+ </string>
<string name="shape_desc_text">
Kropsbygning:
</string>
@@ -90,6 +93,9 @@
<string name="tattoo_desc_text">
Tatovering:
</string>
+ <string name="physics_desc_text">
+ Fysik:
+ </string>
<labeled_back_button label="Gem" name="back_btn" tool_tip="Tilbage til redigering"/>
<text name="edit_wearable_title" value="Redigerer kropsbygning"/>
<panel label="Trøje" name="wearable_type_panel">
diff --git a/indra/newview/skins/default/xui/da/panel_login.xml b/indra/newview/skins/default/xui/da/panel_login.xml
index 268f138185..2e0f726e1a 100644
--- a/indra/newview/skins/default/xui/da/panel_login.xml
+++ b/indra/newview/skins/default/xui/da/panel_login.xml
@@ -3,9 +3,6 @@
<panel.string name="create_account_url">
http://join.secondlife.com/
</panel.string>
- <panel.string name="real_url">
- http://secondlife.com/app/login/
- </panel.string>
<panel.string name="forgot_password_url">
http://secondlife.com/account/request.php
</panel.string>
@@ -14,12 +11,19 @@
<text name="username_text">
Brugernavn:
</text>
- <line_editor label="bobsmith12 eller Steller Sunshine" name="username_edit" tool_tip="Det brugernavn du valgte da du registrerede, som f.eks. bobsmith12 eller Steller Sunshine"/>
+ <combo_box name="username_combo" tool_tip="Brugernavnet du valgte da du registrerde dig, som f.eks. bobsmith12 or Steller Sunshine"/>
<text name="password_text">
Password:
</text>
<check_box label="Husk password" name="remember_check"/>
<button label="Log på" name="connect_btn"/>
+ <text name="mode_selection_text">
+ Tilstand:
+ </text>
+ <combo_box name="mode_combo" tool_tip="Vælg ønsket tilstand. Vælg basis for hurtig og nem udforskning og chat. Vælg avanceret for at få adgang til flere muligheder.">
+ <combo_box.item label="Basis" name="Basic"/>
+ <combo_box.item label="Avanceret" name="Advanced"/>
+ </combo_box>
<text name="start_location_text">
Start ved:
</text>
diff --git a/indra/newview/skins/default/xui/da/panel_media_settings_security.xml b/indra/newview/skins/default/xui/da/panel_media_settings_security.xml
index 278fe0eeea..1b64888271 100644
--- a/indra/newview/skins/default/xui/da/panel_media_settings_security.xml
+++ b/indra/newview/skins/default/xui/da/panel_media_settings_security.xml
@@ -2,7 +2,8 @@
<panel label="Sikkerhed" name="Media Settings Security">
<check_box initial_value="false" label="Tillad kun adgang til angivne URL mønstre" name="whitelist_enable"/>
<text name="home_url_fails_some_items_in_whitelist">
- Angivelser som hjemmesiden fejler imod er markeret:
+ Angivelser som hjemmesiden fejler imod er
+markeret:
</text>
<button label="Tilføj" name="whitelist_add"/>
<button label="Slet" name="whitelist_del"/>
diff --git a/indra/newview/skins/default/xui/da/panel_my_profile.xml b/indra/newview/skins/default/xui/da/panel_my_profile.xml
deleted file mode 100644
index 2db4b278d7..0000000000
--- a/indra/newview/skins/default/xui/da/panel_my_profile.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Profil" name="panel_profile">
- <string name="no_partner_text" value="Ingen"/>
- <string name="no_group_text" value="Ingen"/>
- <string name="RegisterDateFormat">
- [REG_DATE] ([AGE])
- </string>
- <layout_stack name="layout">
- <layout_panel name="profile_stack">
- <scroll_container name="profile_scroll">
- <panel name="scroll_content_panel">
- <panel name="second_life_image_panel">
- <icon label="" name="2nd_life_edit_icon" tool_tip="Klik på Redigér profil knappen forneden for at ændre billede"/>
- <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/>
- </panel>
- <panel name="first_life_image_panel">
- <icon label="" name="real_world_edit_icon" tool_tip="Klik på Redigér profil knappen forneden for at ændre billede"/>
- <text name="title_rw_descr_text" value="Real World:"/>
- </panel>
- <text name="title_member_text" value="Beboer siden:"/>
- <text name="title_acc_status_text" value="Konto status:"/>
- <text name="title_partner_text" value="Partner:"/>
- <panel name="partner_data_panel">
- <name_box initial_value="(henter)" name="partner_text"/>
- </panel>
- <text name="title_groups_text" value="Grupper:"/>
- </panel>
- </scroll_container>
- </layout_panel>
- </layout_stack>
- <panel name="profile_me_buttons_panel">
- <button label="Redigér profil" name="edit_profile_btn" tool_tip="Redigér din personlige information"/>
- </panel>
-</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_nearby_media.xml b/indra/newview/skins/default/xui/da/panel_nearby_media.xml
index b4be70a22a..ef8ed3ad07 100644
--- a/indra/newview/skins/default/xui/da/panel_nearby_media.xml
+++ b/indra/newview/skins/default/xui/da/panel_nearby_media.xml
@@ -19,7 +19,7 @@
<button label="Stop alt" name="all_nearby_media_disable_btn" tool_tip="Stop al media tæt på"/>
<button label="Start alt" name="all_nearby_media_enable_btn" tool_tip="Tænd al media tæt på"/>
<button name="open_prefs_btn" tool_tip="Vis media preferencer"/>
- <button label="Mere &gt;&gt;" label_selected="Mindre &lt;&lt;" name="more_btn" tool_tip="Advancerede kontroller"/>
+ <button label="Mere &gt;&gt;" label_selected="&lt;&lt; Mindre" name="more_btn" tool_tip="Advancerede kontroller"/>
<button label="Mere &gt;&gt;" label_selected="Mindre &lt;&lt;" name="less_btn" tool_tip="Advancerede kontroller"/>
</panel>
<panel name="nearby_media_panel">
diff --git a/indra/newview/skins/default/xui/da/panel_notes.xml b/indra/newview/skins/default/xui/da/panel_notes.xml
deleted file mode 100644
index 7d8097f6ff..0000000000
--- a/indra/newview/skins/default/xui/da/panel_notes.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Noter &amp; Privatliv" name="panel_notes">
- <layout_stack name="layout">
- <layout_panel name="notes_stack">
- <scroll_container name="profile_scroll">
- <panel name="profile_scroll_panel">
- <text name="status_message" value="Min private noter:"/>
- <text name="status_message2" value="Tillad denne person at:"/>
- <check_box label="Se min online status" name="status_check"/>
- <check_box label="Se mig på kortet" name="map_check"/>
- <check_box label="Editére, slette og tage mine objekter" name="objects_check"/>
- </panel>
- </scroll_container>
- </layout_panel>
- <layout_panel name="notes_buttons_panel">
- <layout_stack name="bottom_bar_ls">
- <layout_panel name="add_friend_btn_lp">
- <button label="Tilføj ven" name="add_friend" tool_tip="Tilbyd venskab til beboer"/>
- </layout_panel>
- <layout_panel name="im_btn_lp">
- <button label="IM" name="im" tool_tip="Ã…ben session med personlige beskeder"/>
- </layout_panel>
- <layout_panel name="call_btn_lp">
- <button label="Opkald" name="call" tool_tip="Opkald til denne beboer"/>
- </layout_panel>
- <layout_panel name="show_on_map_btn_lp">
- <button label="Kort" name="show_on_map_btn" tool_tip="Vis denne beboer på kortet"/>
- </layout_panel>
- <layout_panel name="teleport_btn_lp">
- <button label="Teleportér" name="teleport" tool_tip="Tilbyd teleport"/>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_notify_textbox.xml b/indra/newview/skins/default/xui/da/panel_notify_textbox.xml
new file mode 100644
index 0000000000..30ad4ff9f6
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_notify_textbox.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="instant_message" name="panel_notify_textbox">
+ <string name="message_max_lines_count" value="7"/>
+ <panel label="info_panel" name="info_panel">
+ <text_editor name="message" value="besked"/>
+ </panel>
+ <panel label="control_panel" name="control_panel">
+ <button label="Send" name="btn_submit"/>
+ <button label="Ignorér" name="ignore_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_people.xml b/indra/newview/skins/default/xui/da/panel_people.xml
index 6c910cc3b2..66a128cd13 100644
--- a/indra/newview/skins/default/xui/da/panel_people.xml
+++ b/indra/newview/skins/default/xui/da/panel_people.xml
@@ -1,28 +1,30 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Side tray panel -->
<panel label="Personer" name="people_panel">
- <string name="no_recent_people" value="Ingen tidligere personer. Leder du efter nogen at være sammen med? Prøv [secondlife:///app/search/people Search] eller [secondlife:///app/worldmap World Map]."/>
- <string name="no_filtered_recent_people" value="Fandt du ikke det du søgte? Prøv [secondlife:///app/search/people/[SEARCH_TERM] Search]."/>
- <string name="no_one_near" value="Ingen i nærheden. Leder du efter nogen at være sammen med? Prøv [secondlife:///app/search/people Search] eller [secondlife:///app/worldmap World Map]."/>
- <string name="no_one_filtered_near" value="Fandt du ikke det du søgte? Prøv [secondlife:///app/search/people/[SEARCH_TERM] Search]."/>
+ <string name="no_recent_people" value="Ingen tidligere personer. Leder du efter nogen at være sammen med? Prøv [secondlife:///app/search/people Søg] eller [secondlife:///app/worldmap Verdenskort]."/>
+ <string name="no_filtered_recent_people" value="Fandt du ikke det du søgte? Prøv [secondlife:///app/search/people/[SEARCH_TERM] Søg]."/>
+ <string name="no_one_near" value="Ingen i nærheden. Leder du efter nogen at være sammen med? Prøv [secondlife:///app/search/people Søg] eller [secondlife:///app/worldmap Verdenskort]."/>
+ <string name="no_one_filtered_near" value="Fandt du ikke det du søgte? Prøv [secondlife:///app/search/people/[SEARCH_TERM] Søg]."/>
<string name="no_friends_online" value="Ingen venner online"/>
<string name="no_friends" value="Ingen venner"/>
<string name="no_friends_msg">
- Find venner via [secondlife:///app/search/people Search] eller højre-klik på en beboer og tilføj dem som venner.
-Leder du efter nogen at være sammen med? Prøv [secondlife:///app/worldmap World Map].
+ Find venner via [secondlife:///app/search/people Søg] eller højre-klik på en beboer og tilføj dem som venner.
+Leder du efter nogen at være sammen med? Prøv [secondlife:///app/worldmap Verdenskort].
</string>
<string name="no_filtered_friends_msg">
- Fandt du ikke det du søgte? Prøv [secondlife:///app/search/people/[SEARCH_TERM] Search].
+ Fandt du ikke det du søgte? Prøv [secondlife:///app/search/people/[SEARCH_TERM] Søg].
</string>
<string name="people_filter_label" value="Filtrér personer"/>
<string name="groups_filter_label" value="Filtrér grupper"/>
- <string name="no_filtered_groups_msg" value="Fandt du ikke det du søgte? Prøv [secondlife:///app/search/groups/[SEARCH_TERM] Search]."/>
- <string name="no_groups_msg" value="Leder du efter grupper at være med i? Prøv [secondlife:///app/search/groups Search]."/>
+ <string name="no_filtered_groups_msg" value="Fandt du ikke det du søgte? Prøv [secondlife:///app/search/groups/[SEARCH_TERM] Søg]."/>
+ <string name="no_groups_msg" value="Leder du efter grupper at være med i? Prøv [secondlife:///app/search/groups Søg]."/>
+ <string name="MiniMapToolTipMsg" value="[REGION](Dobbeltklik for at åbne kort, træk for at panorere)"/>
+ <string name="AltMiniMapToolTipMsg" value="[REGION](Dobbelt-klik fot at teleportere, træk for at panorere)"/>
<filter_editor label="Filtrér" name="filter_input"/>
<tab_container name="tabs">
<panel label="TÆT PÅ" name="nearby_panel">
<panel label="bottom_panel" name="bottom_panel">
- <button name="nearby_view_sort_btn" tool_tip="Valg"/>
+ <menu_button name="nearby_view_sort_btn" tool_tip="Valg"/>
<button name="add_friend_btn" tool_tip="Tilføj valgte beboer til din venneliste"/>
</panel>
</panel>
@@ -34,27 +36,27 @@ Leder du efter nogen at være sammen med? Prøv [secondlife:///app/worldmap Worl
<panel label="bottom_panel" name="bottom_panel">
<layout_stack name="bottom_panel">
<layout_panel name="options_gear_btn_panel">
- <button name="friends_viewsort_btn" tool_tip="Vis flere valg"/>
+ <menu_button name="friends_viewsort_btn" tool_tip="Vis flere valg"/>
</layout_panel>
<layout_panel name="add_btn_panel">
<button name="add_btn" tool_tip="Tilbyd venskab til en beboer"/>
</layout_panel>
<layout_panel name="trash_btn_panel">
- <dnd_button name="trash_btn" tool_tip="Fjern valgte personer fra venneliste"/>
+ <dnd_button name="del_btn" tool_tip="Fjern valgte person fra din venneliste"/>
</layout_panel>
</layout_stack>
</panel>
</panel>
<panel label="MINE GRUPPER" name="groups_panel">
<panel label="bottom_panel" name="bottom_panel">
- <button name="groups_viewsort_btn" tool_tip="Valg"/>
+ <menu_button name="groups_viewsort_btn" tool_tip="Valg"/>
<button name="plus_btn" tool_tip="Bliv medlem af gruppe/Opret ny gruppe"/>
<button name="activate_btn" tool_tip="Activér valgte gruppe"/>
</panel>
</panel>
<panel label="NYLIGE" name="recent_panel">
<panel label="bottom_panel" name="bottom_panel">
- <button name="recent_viewsort_btn" tool_tip="Valg"/>
+ <menu_button name="recent_viewsort_btn" tool_tip="Valg"/>
<button name="add_friend_btn" tool_tip="Tilføj valgte beboer til din venneliste"/>
</panel>
</panel>
@@ -64,16 +66,16 @@ Leder du efter nogen at være sammen med? Prøv [secondlife:///app/worldmap Worl
<layout_panel name="view_profile_btn_lp">
<button label="Profil" name="view_profile_btn" tool_tip="Vis billeder, grupper og anden beboer information"/>
</layout_panel>
- <layout_panel name="chat_btn_lp">
+ <layout_panel name="im_btn_lp">
<button label="IM" name="im_btn" tool_tip="Ã…ben session med privat besked (IM)"/>
</layout_panel>
- <layout_panel name="chat_btn_lp">
+ <layout_panel name="call_btn_lp">
<button label="Kald" name="call_btn" tool_tip="Opkald til denne beboer"/>
</layout_panel>
- <layout_panel name="chat_btn_lp">
+ <layout_panel name="share_btn_lp">
<button label="Del" name="share_btn" tool_tip="Del en genstand fra beholdning"/>
</layout_panel>
- <layout_panel name="chat_btn_lp">
+ <layout_panel name="teleport_btn_lp">
<button label="Teleportér" name="teleport_btn" tool_tip="Tilbyd teleport"/>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/da/panel_places.xml b/indra/newview/skins/default/xui/da/panel_places.xml
index ca3d7c71bb..c555f2fb09 100644
--- a/indra/newview/skins/default/xui/da/panel_places.xml
+++ b/indra/newview/skins/default/xui/da/panel_places.xml
@@ -21,10 +21,10 @@
<button label="Redigér" name="edit_btn" tool_tip="Redigér landemærke information"/>
</layout_panel>
<layout_panel name="overflow_btn_lp">
- <button label="â–¼" name="overflow_btn" tool_tip="Vis flere valg"/>
+ <menu_button label="â–¼" name="overflow_btn" tool_tip="Vis flere valg"/>
</layout_panel>
</layout_stack>
- <layout_stack name="bottom_bar_ls3">
+ <layout_stack name="bottom_bar_profile_ls">
<layout_panel name="profile_btn_lp">
<button label="Profil" name="profile_btn" tool_tip="Vis profil for sted"/>
</layout_panel>
diff --git a/indra/newview/skins/default/xui/da/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/da/panel_preferences_advanced.xml
index b267c75673..48106c7dfe 100644
--- a/indra/newview/skins/default/xui/da/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/da/panel_preferences_advanced.xml
@@ -3,35 +3,16 @@
<panel.string name="aspect_ratio_text">
[NUM]:[DEN]
</panel.string>
- <panel.string name="middle_mouse">
- Midterste mus
- </panel.string>
- <slider label="Synsvinkel" name="camera_fov"/>
- <slider label="Distance" name="camera_offset_scale"/>
- <text name="heading2">
- Automatisk positionering for:
- </text>
- <check_box label="Byg/Redigér" name="edit_camera_movement" tool_tip="Benyt automatisk kamera positionering ved start og slut af editerings modus"/>
- <check_box label="Udseende" name="appearance_camera_movement" tool_tip="Benyt automatisk kamera positionering ved redigering"/>
- <check_box initial_value="sand" label="Sidepanel" name="appearance_sidebar_positioning" tool_tip="Benyt automatisk positionering af kamera"/>
- <check_box label="Vis avatar i førsteperson" name="first_person_avatar_visible"/>
- <check_box label="Piletaster bruges altid til bevægelse" name="arrow_keys_move_avatar_check"/>
- <check_box label="Tast-tast-hold for at løbe" name="tap_tap_hold_to_run"/>
- <check_box label="Bevæg avatarlæber når der tales" name="enable_lip_sync"/>
- <check_box label="Talebobler" name="bubble_text_chat"/>
- <slider label="Synlighed" name="bubble_chat_opacity"/>
- <color_swatch name="background" tool_tip="Vælg farve for talebobler"/>
<text name="UI Size:">
- Brugerflade størrelse
+ UI størrelse:
</text>
<check_box label="Vis script fejl i:" name="show_script_errors"/>
<radio_group name="show_location">
<radio_item label="Chat" name="0"/>
<radio_item label="Separat vindue" name="1"/>
</radio_group>
- <check_box label="Knap til aktiverering af mikrofon:" name="push_to_talk_toggle_check" tool_tip="I walkie-talkie-modus sendes stemme kun når knappen er trykket ned, ellers vil tryk på knap tænde og slukke mikrofon."/>
- <line_editor label="Brug walkie-talkie modus" name="modifier_combo"/>
- <button label="Angiv taste" name="set_voice_hotkey_button"/>
- <button label="Midterste museknap" name="set_voice_middlemouse_button" tool_tip="Nulstil til midterste musetaste"/>
- <button label="Andre enheder" name="joystick_setup_button"/>
+ <check_box label="Tillad flere åbne klienter" name="allow_multiple_viewer_check"/>
+ <check_box label="Vælg netværk ved login" name="show_grid_selection_check"/>
+ <check_box label="Vælg avanceret menu" name="show_advanced_menu_check"/>
+ <check_box label="Vis udvikler menu" name="show_develop_menu_check"/>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_preferences_chat.xml b/indra/newview/skins/default/xui/da/panel_preferences_chat.xml
index 72f8476094..890a3038ef 100644
--- a/indra/newview/skins/default/xui/da/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/da/panel_preferences_chat.xml
@@ -8,44 +8,10 @@
<radio_item label="Mellem" name="radio2" value="1"/>
<radio_item label="Stor" name="radio3" value="2"/>
</radio_group>
- <text name="font_colors">
- Skriftfarve:
- </text>
- <color_swatch label="Dig" name="user"/>
- <text name="text_box1">
- Dig
- </text>
- <color_swatch label="Andre" name="agent"/>
- <text name="text_box2">
- Andre
- </text>
- <color_swatch label="IM" name="im"/>
- <text name="text_box3">
- IM
- </text>
- <color_swatch label="System" name="system"/>
- <text name="text_box4">
- System
- </text>
- <color_swatch label="Fejl" name="script_error"/>
- <text name="text_box5">
- Fejl
- </text>
- <color_swatch label="Objekter" name="objects"/>
- <text name="text_box6">
- Objekter
- </text>
- <color_swatch label="Ejer" name="owner"/>
- <text name="text_box7">
- Ejer
- </text>
- <color_swatch label="URL&apos;er" name="links"/>
- <text name="text_box9">
- URL&apos;er
- </text>
<check_box initial_value="true" label="Afspil skrive animation ved chat" name="play_typing_animation"/>
<check_box label="Send e-mail til mig når jeg modtager IM og er offline" name="send_im_to_email"/>
<check_box label="Ã…ben for almindelig tekst i IM og chat historik" name="plain_text_chat_history"/>
+ <check_box label="Boble chat" name="bubble_text_chat"/>
<text name="show_ims_in_label">
Vis IM&apos;er i:
</text>
@@ -56,7 +22,17 @@
<radio_item label="Separate vinduer" name="radio" value="0"/>
<radio_item label="Faner" name="radio2" value="1"/>
</radio_group>
- <check_box label="Benyt maskin-oversættelse ved chat (håndteret af Google)" name="translate_chat_checkbox"/>
+ <text name="disable_toast_label">
+ Tillad ingående chat popup vinduer:
+ </text>
+ <check_box label="Gruppe chats" name="EnableGroupChatPopups" tool_tip="Vælg for at se popup vindue når gruppe chat beskeder modtages"/>
+ <check_box label="IM chats" name="EnableIMChatPopups" tool_tip="Vælg for at se popup vindue når personlige beskeder (IM) modtages"/>
+ <spinner label="Tid før chatvisning forsvinder:" name="nearby_toasts_lifetime"/>
+ <spinner label="Tid før chatvisning forsvinder:" name="nearby_toasts_fadingtime"/>
+ <check_box name="translate_chat_checkbox"/>
+ <text name="translate_chb_label">
+ Benyt maskinel oversættelse ved chat
+ </text>
<text name="translate_language_text" width="110">
Oversæt chat til :
</text>
@@ -75,7 +51,7 @@
<combo_box.item label="РуÑÑкий (Russisk)" name="Russian"/>
<combo_box.item label="Türkçe (Tyrkisk)" name="Turkish"/>
<combo_box.item label="УкраїнÑька (Ukrainsk)" name="Ukrainian"/>
- <combo_box.item label="中文 (简体) (Kinesisk)" name="Chinese"/>
+ <combo_box.item label="中文 (正體) (Kinesisk)" name="Chinese"/>
<combo_box.item label="日本語 (Japansk)" name="Japanese"/>
<combo_box.item label="한국어 (Koreansk)" name="Korean"/>
</combo_box>
diff --git a/indra/newview/skins/default/xui/da/panel_preferences_colors.xml b/indra/newview/skins/default/xui/da/panel_preferences_colors.xml
new file mode 100644
index 0000000000..cc3dc480bc
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_preferences_colors.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Farver" name="colors_panel">
+ <text name="effects_color_textbox">
+ Mine effekter (selektions pejlelys):
+ </text>
+ <color_swatch name="effect_color_swatch" tool_tip="Klik for at åbne farvevælger"/>
+ <text name="font_colors">
+ Vælg font farver:
+ </text>
+ <text name="text_box1">
+ Mig
+ </text>
+ <text name="text_box2">
+ Andre
+ </text>
+ <text name="text_box3">
+ Objekter
+ </text>
+ <text name="text_box4">
+ System
+ </text>
+ <text name="text_box5">
+ Fejl
+ </text>
+ <text name="text_box10">
+ Direkte
+ </text>
+ <text name="text_box7">
+ Ejer
+ </text>
+ <text name="text_box9">
+ URL&apos;er
+ </text>
+ <text name="bubble_chat">
+ Navneskilt baggrundsfarve (påvirker også chat talebobler):
+ </text>
+ <color_swatch name="background" tool_tip="Vælg navneskilt farve"/>
+ <slider label="Gennemsigtighed:" name="bubble_chat_opacity" tool_tip="Vælg navneskilt gennemsigtighed"/>
+ <text name="floater_opacity">
+ Floater gennemsigtighed:
+ </text>
+ <slider label="Aktiv:" name="active"/>
+ <slider label="Inaktiv:" name="inactive"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_preferences_general.xml b/indra/newview/skins/default/xui/da/panel_preferences_general.xml
index 9c0cb583af..5702d48e97 100644
--- a/indra/newview/skins/default/xui/da/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/da/panel_preferences_general.xml
@@ -46,13 +46,18 @@
<check_box label="Brugernavne" name="show_slids" tool_tip="Vis brugernavne, som bobsmith123"/>
<check_box label="Gruppe titler" name="show_all_title_checkbox1" tool_tip="Vis hgruppetitler, som f.eks. administrator eller medlem"/>
<check_box label="Fremhæv venner" name="show_friends" tool_tip="Fremhæv navne-tags for dine venner"/>
- <text name="effects_color_textbox">
- Farve til mine effekter:
+ <check_box label="Vis visningsnavne" name="display_names_check" tool_tip="Vælg for at bruge visningsnavne i chat, IM, navne-tags m.v."/>
+ <check_box label="Aktivér UI tips i klient" name="viewer_hints_check"/>
+ <text name="inworld_typing_rg_label">
+ Trykker bogstav taster:
</text>
+ <radio_group name="inworld_typing_preference">
+ <radio_item label="Starter lokal chat" name="radio_start_chat" value="1"/>
+ <radio_item label="Påvirker bevægelse (f.eks. WASD)" name="radio_move" value="0"/>
+ </radio_group>
<text name="title_afk_text">
Tid inden &quot;væk&quot;:
</text>
- <color_swatch label="" name="effect_color_swatch" tool_tip="Klik for at åbne farvevælger"/>
<combo_box label="Timeout før &apos;væk&apos;:" name="afk">
<combo_box.item label="2 minutter" name="item0"/>
<combo_box.item label="5 minutter" name="item1"/>
@@ -60,7 +65,6 @@
<combo_box.item label="30 minutter" name="item3"/>
<combo_box.item label="aldrig" name="item4"/>
</combo_box>
- <check_box label="Vis visningsnavne" name="display_names_check" tool_tip="Vælg for at bruge visningsnavne i chat, IM, navne-tags m.v."/>
<text name="text_box3">
Optaget autosvar:
</text>
diff --git a/indra/newview/skins/default/xui/da/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/da/panel_preferences_graphics1.xml
index 5bc5025ff1..72200a07ad 100644
--- a/indra/newview/skins/default/xui/da/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/da/panel_preferences_graphics1.xml
@@ -26,9 +26,22 @@
<text name="ShadersText">
Overflader:
</text>
+ <check_box initial_value="sand" label="Gennemsigtig vand" name="TransparentWater"/>
<check_box initial_value="true" label="Glatte flader og skin" name="BumpShiny"/>
+ <check_box initial_value="sand" label="Lokale lys" name="LocalLights"/>
<check_box initial_value="true" label="Basale flader" name="BasicShaders" tool_tip="Ved at slå dette valg fra, kan det forhindres at visse grafikkort drivere crasher."/>
<check_box initial_value="true" label="Atmosfæriske flader" name="WindLightUseAtmosShaders"/>
+ <check_box initial_value="sand" label="Lys og skygger" name="UseLightShaders"/>
+ <check_box initial_value="sand" label="&quot;Ambient Occlusion&quot;" name="UseSSAO"/>
+ <check_box initial_value="sand" label="Skarphedsdybde" name="UseDoF"/>
+ <text name="shadows_label">
+ Skygger:
+ </text>
+ <combo_box name="ShadowDetail">
+ <combo_box.item label="Ingen" name="0"/>
+ <combo_box.item label="Sol/MÃ¥ne" name="1"/>
+ <combo_box.item label="Sol/MÃ¥ne + Projektorer" name="2"/>
+ </combo_box>
<text name="reflection_label">
Reflektioner i vand:
</text>
@@ -39,6 +52,10 @@
<combo_box.item label="Alle avatarer og objekter" name="3"/>
<combo_box.item label="Alt" name="4"/>
</combo_box>
+ <slider label="Avatar fysik:" name="AvatarPhysicsDetail"/>
+ <text name="AvatarPhysicsDetailText">
+ Lav
+ </text>
<slider label="Maks. visnings-afstand:" name="DrawDistance"/>
<text name="DrawDistanceMeterText2">
m
@@ -77,7 +94,7 @@
Lav
</text>
<text name="AvatarRenderingText">
- Avatar gengivelse
+ Avatar rendering:
</text>
<check_box initial_value="true" label="Mini-figurer på lang afstand" name="AvatarImpostors"/>
<check_box initial_value="true" label="Hardware Skinning" name="AvatarVertexProgram"/>
diff --git a/indra/newview/skins/default/xui/da/panel_preferences_move.xml b/indra/newview/skins/default/xui/da/panel_preferences_move.xml
new file mode 100644
index 0000000000..98dfed92c1
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_preferences_move.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Flyv" name="move_panel">
+ <slider label="Se vinkel" name="camera_fov"/>
+ <slider label="Distance" name="camera_offset_scale"/>
+ <text name="heading2">
+ Automatisk position for:
+ </text>
+ <check_box label="Byg/Redigér" name="edit_camera_movement" tool_tip="Benyt automatisk kamera positionering når edit modus aktiveres og forlades"/>
+ <check_box label="Udseende" name="appearance_camera_movement" tool_tip="Benyt automatisk kamera positionering i edit modus"/>
+ <check_box initial_value="sand" label="Sidepanel" name="appearance_sidebar_positioning" tool_tip="Benyt automatisk kamera positionering ved sidepanel"/>
+ <check_box label="Vis avatar i første-person" name="first_person_avatar_visible"/>
+ <text name=" Mouse Sensitivity">
+ Muse-følsomhed i første-person:
+ </text>
+ <check_box label="Omvend" name="invert_mouse"/>
+ <check_box label="Piletaster bevæger altid avatar" name="arrow_keys_move_avatar_check"/>
+ <check_box label="Tryk to gange for at løbe" name="tap_tap_hold_to_run"/>
+ <check_box label="Dobbelt-klik for at:" name="double_click_chkbox"/>
+ <radio_group name="double_click_action">
+ <radio_item label="Teleportere" name="radio_teleport"/>
+ <radio_item label="Auto-pilot" name="radio_autopilot"/>
+ </radio_group>
+ <button label="Andre enheder" name="joystick_setup_button"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/da/panel_preferences_privacy.xml
index cdb407dbad..0df330b016 100644
--- a/indra/newview/skins/default/xui/da/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/da/panel_preferences_privacy.xml
@@ -7,19 +7,24 @@
<text name="cache_size_label_l">
(Lokationer, billeder, web, søge historik)
</text>
+ <check_box label="Vis dig selv i søgeresultater" name="online_searchresults"/>
<check_box label="Kun venner og grupper ved jeg er online" name="online_visibility"/>
<check_box label="Kun venner og grupper kan sende besked til mig" name="voice_call_friends_only_check"/>
<check_box label="Slå mikrofon fra når opkald slutter" name="auto_disengage_mic_check"/>
- <check_box label="Acceptér cookies" name="cookies_enabled"/>
+ <check_box label="Vis mine favorit landemærker ved login (via &quot;Start ved&quot; menuen)" name="favorites_on_login_check"/>
<text name="Logs:">
- Logs:
+ Chat Logs:
</text>
<check_box label="Gem en log med lokal chat på min computer" name="log_nearby_chat"/>
<check_box label="Gem en log med private beskeder (IM) på min computer" name="log_instant_messages"/>
- <check_box label="Tilføj tidsstempel" name="show_timestamps_check_im"/>
+ <check_box label="Tilføj klokkeslæt til hver linie i chat log" name="show_timestamps_check_im"/>
+ <check_box label="Tilføj datostempel til log filnavn." name="logfile_name_datestamp"/>
<text name="log_path_desc">
Placering af logfiler:
</text>
<button label="Ændre sti" label_selected="Ændre sti" left="150" name="log_path_button"/>
<button label="Liste med blokeringer" name="block_list"/>
+ <text name="block_list_label">
+ (Personer og/eller objekter du har blokeret)
+ </text>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_preferences_setup.xml b/indra/newview/skins/default/xui/da/panel_preferences_setup.xml
index 553d21d597..479e98817e 100644
--- a/indra/newview/skins/default/xui/da/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/da/panel_preferences_setup.xml
@@ -1,12 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Opsætning" name="Input panel">
- <text name="Mouselook:">
- Første person:
- </text>
- <text name=" Mouse Sensitivity">
- Mus - følsomhed
- </text>
- <check_box label="Omvendt" name="invert_mouse"/>
<text name="Network:">
Netværk:
</text>
@@ -46,4 +39,11 @@
</text>
<line_editor name="web_proxy_editor" tool_tip="Angiv navn eller IP addresse på den proxy du ønsker at anvende"/>
<spinner label="Port nummer:" name="web_proxy_port"/>
+ <text name="Software updates:">
+ Software opdateringer:
+ </text>
+ <combo_box name="updater_service_combobox">
+ <combo_box.item label="Installér automatisk" name="Install_automatically"/>
+ <combo_box.item label="Hent og installér opdateringer manuelt" name="Install_manual"/>
+ </combo_box>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_preferences_sound.xml b/indra/newview/skins/default/xui/da/panel_preferences_sound.xml
index 18cb0e47b9..26d2ae4abd 100644
--- a/indra/newview/skins/default/xui/da/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/da/panel_preferences_sound.xml
@@ -1,12 +1,18 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Lyde" name="Preference Media panel">
+ <panel.string name="middle_mouse">
+ Midterste museknap
+ </panel.string>
<slider label="Generel" name="System Volume"/>
- <check_box initial_value="true" label="Sluk lyd når minimeret" name="mute_when_minimized"/>
+ <check_box initial_value="true" name="mute_when_minimized"/>
+ <text name="mute_chb_label">
+ Sluk for lyd når minimeret
+ </text>
<slider label="Knapper" name="UI Volume"/>
<slider label="Omgivelser" name="Wind Volume"/>
<slider label="Lyd effekter" name="SFX Volume"/>
<slider label="Musik" name="Music Volume"/>
- <check_box label="Aktiveret" name="music_enabled"/>
+ <check_box label="Aktiveret" name="enable_music"/>
<slider label="Media" name="Media Volume"/>
<check_box label="Aktiveret" name="enable_media"/>
<slider label="Stemme chat" name="Voice Volume"/>
@@ -23,6 +29,11 @@
<radio_item label="Kamera position" name="0"/>
<radio_item label="Avatar position" name="1"/>
</radio_group>
+ <check_box label="Bevæg avatar-læber når der snakkes" name="enable_lip_sync"/>
+ <check_box label="Skift tale tænd/sluk når jeg trykker:" name="push_to_talk_toggle_check" tool_tip="Når du er i skift-modus, vil hvert tryk tænde eller slukke din mikrofon. Når du ikke er i skift-modus, vil din mikrofon kun være tændt når knappen/tasten holdes nede (som en Walkie Talkie)"/>
+ <line_editor label="Tryk-for-tale udløser" name="modifier_combo"/>
+ <button label="Angiv taste" name="set_voice_hotkey_button"/>
+ <button name="set_voice_middlemouse_button" tool_tip="Nulstil til midterste muse-knap"/>
<button label="Input/Output enheder" name="device_settings_btn"/>
<panel label="Enhedsopsætning" name="device_settings_panel">
<panel.string name="default_text">
diff --git a/indra/newview/skins/default/xui/da/panel_profile.xml b/indra/newview/skins/default/xui/da/panel_profile.xml
deleted file mode 100644
index b2d1e9791a..0000000000
--- a/indra/newview/skins/default/xui/da/panel_profile.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Profil" name="panel_profile">
- <string name="no_partner_text" value="Ingen"/>
- <string name="no_group_text" value="Ingen"/>
- <string name="RegisterDateFormat">
- [REG_DATE] ([AGE])
- </string>
- <layout_stack name="layout">
- <layout_panel name="profile_stack">
- <scroll_container name="profile_scroll">
- <panel name="profile_scroll_panel">
- <panel name="second_life_image_panel">
- <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/>
- </panel>
- <panel name="first_life_image_panel">
- <text name="title_rw_descr_text" value="Real World:"/>
- </panel>
- <text name="title_member_text" value="Beboer siden:"/>
- <text name="title_acc_status_text" value="Konto status:"/>
- <text name="title_partner_text" value="Partner:"/>
- <panel name="partner_data_panel">
- <name_box initial_value="(henter)" name="partner_text"/>
- </panel>
- <text name="title_groups_text" value="Grupper:"/>
- </panel>
- </scroll_container>
- </layout_panel>
- </layout_stack>
- <layout_stack name="layout_verb_buttons">
- <layout_panel name="profile_buttons_panel">
- <layout_stack name="bottom_bar_ls">
- <layout_panel name="add_friend_btn_lp">
- <button label="Tilføj ven" name="add_friend" tool_tip="Tilbyd venskab til beboeren"/>
- </layout_panel>
- <layout_panel name="im_btn_lp">
- <button label="Personlig besked" name="im" tool_tip="Ã…ben session med personlig besked"/>
- </layout_panel>
- <layout_panel name="call_btn_lp">
- <button label="Opkald" name="call" tool_tip="Opkald til denne beboer"/>
- </layout_panel>
- <layout_panel name="chat_btn_lp">
- <button label="Teleportér" name="teleport" tool_tip="Tilbyd teleport"/>
- </layout_panel>
- <layout_panel name="overflow_btn_lp">
- <button label="â–¼" name="overflow_btn" tool_tip="Betal eller del beholdning med denne beboer"/>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- <layout_panel name="profile_me_buttons_panel">
- <button label="Redigér profil" name="edit_profile_btn" tool_tip="Redigér din personlige information"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_profile_view.xml b/indra/newview/skins/default/xui/da/panel_profile_view.xml
deleted file mode 100644
index 5e0a51eb28..0000000000
--- a/indra/newview/skins/default/xui/da/panel_profile_view.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_target_profile">
- <string name="status_online">
- Online
- </string>
- <string name="status_offline">
- Offline
- </string>
- <text name="display_name_label" value="Visningsnavn:"/>
- <text name="solo_username_label" value="Brugernavn:"/>
- <text name="status" value="Online"/>
- <text name="user_name_small" value="Se på mig med dette enormt ekstremt super lange navn"/>
- <text name="user_name" value="Jack Linden"/>
- <button name="copy_to_clipboard" tool_tip="Kopiér til udskriftsholder"/>
- <text name="user_label" value="Brugernavn:"/>
- <text name="user_slid" value="jack.linden"/>
- <tab_container name="tabs">
- <panel label="PROFIL" name="panel_profile"/>
- <panel label="FAVORITTER" name="panel_picks"/>
- <panel label="NOTER &amp; PRIVATLIV" name="panel_notes"/>
- </tab_container>
-</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_region_general.xml b/indra/newview/skins/default/xui/da/panel_region_general.xml
index 5b5dd411ac..667c88c5b1 100644
--- a/indra/newview/skins/default/xui/da/panel_region_general.xml
+++ b/indra/newview/skins/default/xui/da/panel_region_general.xml
@@ -25,6 +25,7 @@
<check_box label="Tillad at sælge land" name="allow_land_resell_check"/>
<check_box label="Tillad at samle/dele land" name="allow_parcel_changes_check"/>
<check_box label="Blokér visning af land i Søgning" name="block_parcel_search_check" tool_tip="Lad beboere se denne region og dens parceller i søgeresultater"/>
+ <check_box label="Til &quot;mesh&quot; objekter" name="mesh_rez_enabled_check" tool_tip="Lad personer rezze mesh objekter i denne region"/>
<spinner label="Max besøgende" name="agent_limit_spin"/>
<spinner label="Objekt bonus" name="object_bonus_spin"/>
<text label="Indhold" name="access_text">
diff --git a/indra/newview/skins/default/xui/da/panel_script_ed.xml b/indra/newview/skins/default/xui/da/panel_script_ed.xml
index 0bdfa89d3b..3dec4bf101 100644
--- a/indra/newview/skins/default/xui/da/panel_script_ed.xml
+++ b/indra/newview/skins/default/xui/da/panel_script_ed.xml
@@ -15,11 +15,9 @@
<panel.string name="Title">
Script: [NAME]
</panel.string>
- <text_editor name="Script Editor">
- Henter...
- </text_editor>
- <button label="Gem" label_selected="Gem" name="Save_btn"/>
- <combo_box label="Indsæt..." name="Insert..."/>
+ <panel.string name="external_editor_not_set">
+ Vælg en editor ved at opsætte miljø-variablen LL_SCRIPT_EDITOR eller opsætning af Ekstern editor.
+ </panel.string>
<menu_bar name="script_menu">
<menu label="Filer" name="File">
<menu_item_call label="Gem" name="Save"/>
@@ -40,4 +38,10 @@
<menu_item_call label="Hjælp med keywords..." name="Keyword Help..."/>
</menu>
</menu_bar>
+ <text_editor name="Script Editor">
+ Henter...
+ </text_editor>
+ <combo_box label="Indsæt..." name="Insert..."/>
+ <button label="Gem" label_selected="Gem" name="Save_btn"/>
+ <button label="Redigér..." name="Edit_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_scrolling_param_base.xml b/indra/newview/skins/default/xui/da/panel_scrolling_param_base.xml
new file mode 100644
index 0000000000..fa659040ea
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_scrolling_param_base.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="LLScrollingPanelParamBase">
+ <slider label="[DESC]" name="param slider"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_sound_devices.xml b/indra/newview/skins/default/xui/da/panel_sound_devices.xml
new file mode 100644
index 0000000000..27b7666a1f
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_sound_devices.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<panel label="Opsætning for udstyr" name="device_settings_panel">
+ <panel.string name="default_text">
+ Standard
+ </panel.string>
+ <text name="Input">
+ Input
+ </text>
+ <text name="My volume label">
+ Min lydstyrke:
+ </text>
+ <slider_bar initial_value="1.0" name="mic_volume_slider" tool_tip="Ændre lydstyrke med denne skyder"/>
+ <text name="wait_text">
+ Vent venligst
+ </text>
+ <text name="Output">
+ Output
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_status_bar.xml b/indra/newview/skins/default/xui/da/panel_status_bar.xml
index 8633f12d24..6e7bdfc188 100644
--- a/indra/newview/skins/default/xui/da/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/da/panel_status_bar.xml
@@ -22,7 +22,7 @@
L$ [AMT]
</panel.string>
<panel name="balance_bg">
- <text name="balance" tool_tip="Min status" value="L$20"/>
+ <text name="balance" tool_tip="Klik for at opdaterer din L$ balance" value="L$20"/>
<button label="KØB L$" name="buyL" tool_tip="Klik for at købe flere L$"/>
</panel>
<text name="TimeText" tool_tip="Nuværende tid (Pacific)">
diff --git a/indra/newview/skins/default/xui/da/sidepanel_task_info.xml b/indra/newview/skins/default/xui/da/sidepanel_task_info.xml
index 746cf201bc..f80d5aeb15 100644
--- a/indra/newview/skins/default/xui/da/sidepanel_task_info.xml
+++ b/indra/newview/skins/default/xui/da/sidepanel_task_info.xml
@@ -48,15 +48,9 @@
<text name="CreatorNameLabel">
Skaber:
</text>
- <text name="Creator Name">
- Erica Linden
- </text>
<text name="Owner:">
Ejer:
</text>
- <text name="Owner Name">
- Erica Linden
- </text>
<text name="Group_label">
Gruppe:
</text>
diff --git a/indra/newview/skins/default/xui/da/strings.xml b/indra/newview/skins/default/xui/da/strings.xml
index 198d8eea0e..11d100eeff 100644
--- a/indra/newview/skins/default/xui/da/strings.xml
+++ b/indra/newview/skins/default/xui/da/strings.xml
@@ -115,6 +115,140 @@
<string name="Quit">
Afslut
</string>
+ <string name="LoginFailedViewerNotPermitted">
+ Den klient du benytter kan ikke længere få adgang til Second Life. Besøg venligst denne side for at hente en ny klient:
+http://secondlife.com/download
+
+For mere information, se denne FAQ:
+http://secondlife.com/viewer-access-faq
+ </string>
+ <string name="LoginIntermediateOptionalUpdateAvailable">
+ Valgfri klient opdatering tilgængelig: [VERSION]
+ </string>
+ <string name="LoginFailedRequiredUpdate">
+ Påkrævet opdatering a klient: [VERSION]
+ </string>
+ <string name="LoginFailedAlreadyLoggedIn">
+ Din avatar er allerede logget på.
+ </string>
+ <string name="LoginFailedAuthenticationFailed">
+ Beklager! vi kunne ikke logge dig på.
+Undersøg venligst at du har indtastet det rette
+Please check to make sure you entered the right
+ * Brugernavn (like bobsmith12 or steller.sunshine)
+ * Password
+Check også at Caps Lock ikke er aktiveret.
+ </string>
+ <string name="LoginFailedPasswordChanged">
+ Som en sikkerhedsforanstaltning er dit password blevet ændret.
+Går venligst til din konto-side på http://secondlife.com/password
+og besvar sikkerhedsspørgsmål for at nulstille dit password.
+Vi undskylder besværet.
+ </string>
+ <string name="LoginFailedPasswordReset">
+ vi har lavet nogle ændringer i vores system og det er nødvendigt at nulstille dit password.
+Går venligst til din konto-side på http://secondlife.com/password
+og besvar sikkerhedsspørgsmål for at nulstille dit password.
+Vi undskylder besværet.
+ </string>
+ <string name="LoginFailedEmployeesOnly">
+ Second Life er midlertidig lukket ned for vedligeholdelse.
+Kun medarbejdere kan logge på for øjeblikket.
+Check www.secondlife.com/status for opdateringer.
+ </string>
+ <string name="LoginFailedPremiumOnly">
+ Second Life har midlertidig begrænset muligheden for log-in for at sikre, at brugere på systemet ikke får dårlige svartider.
+
+ Brugere med gratis-konti vil ikke kunne logge på Second Life på dette tidspunkt.
+ </string>
+ <string name="LoginFailedComputerProhibited">
+ Second Life kan ikke tilgås fra dennecomputer.
+Hvis du mener dette er en fejl, kontakt venligst support@secondlife.com.
+ </string>
+ <string name="LoginFailedAcountSuspended">
+ Din konto vil ikke være tilgængelig før
+[TIME] Pacific Time.
+ </string>
+ <string name="LoginFailedAccountDisabled">
+ Vi kan desværre ikke behandle forespøgsel lige nu.
+Kontakt venligst Second Life supper for assitance via http://secondlife.com/support.
+Hvis du ikke kan ændre dit password ring venligst +1 (866) 476-9763.
+ </string>
+ <string name="LoginFailedTransformError">
+ Data inkonsistens registret ved login.
+Kontakt venligst support@secondlife.com.
+ </string>
+ <string name="LoginFailedAccountMaintenance">
+ Der foretages vedligehold på din konto lige nu.
+Din konto vil ikke være tilgængelig før
+[TIME] Pacific Time.
+Hvis du mener dette er en fejl, kontakt venligst support@secondlife.com.
+ </string>
+ <string name="LoginFailedPendingLogoutFault">
+ Forespøgsel på logout blev besvaret med en fejl fra simulatoren.
+ </string>
+ <string name="LoginFailedPendingLogout">
+ Systemet er i gang med at logge dig ud netop nu.
+Din konto vil ikke være tilgængelig før
+[TIME] Pacific Time.
+ </string>
+ <string name="LoginFailedUnableToCreateSession">
+ Ikke muligt at oprette gyldig session.
+ </string>
+ <string name="LoginFailedUnableToConnectToSimulator">
+ Ikke muligt at koble til en simulator.
+ </string>
+ <string name="LoginFailedRestrictedHours">
+ Din konto kan kun tilgå Second Life
+mellem [START] [END] Pacific Time.
+Kom venligst tilbage i dette tidsrum.
+
+Hvis du mener dette er en fejl, kontakt venligst support@secondlife.com.
+ </string>
+ <string name="LoginFailedIncorrectParameters">
+ Ugyldig parametre.
+Hvis du mener dette er en fejl, kontakt venligst support@secondlife.com.
+ </string>
+ <string name="LoginFailedFirstNameNotAlphanumeric">
+ Fornavn parameter skal være alfanumerisk
+Hvis du mener dette er en fejl, kontakt venligst support@secondlife.com.
+ </string>
+ <string name="LoginFailedLastNameNotAlphanumeric">
+ Efternavn parameter skal være alfanumerisk
+Hvis du mener dette er en fejl, kontakt venligst support@secondlife.com.
+ </string>
+ <string name="LogoutFailedRegionGoingOffline">
+ Regionen er lukket ned.
+Prøv at logge på om lidt igen.
+ </string>
+ <string name="LogoutFailedAgentNotInRegion">
+ Avatar ikke i en region.
+Prøv venligst om lidt igen.
+ </string>
+ <string name="LogoutFailedPendingLogin">
+ The region was logging in another session.
+Please try logging in again in a minute.
+ </string>
+ <string name="LogoutFailedLoggingOut">
+ Region har lukket sidste session ned.
+Prøv venligst om lidt igen.
+ </string>
+ <string name="LogoutFailedStillLoggingOut">
+ Regionen er stadig ved at lukke forrige session ud.
+Prøv venligst om lidt igen.
+ </string>
+ <string name="LogoutSucceeded">
+ Region har lukket sidste session ned.
+Prøv venligst om lidt igen.
+ </string>
+ <string name="LogoutFailedLogoutBegun">
+ Region er i gang med at logge ud.
+Prøv venligst om lidt igen.
+ </string>
+ <string name="LoginFailedLoggingOutSession">
+ Region er i gang med at lukket sidste session ned.
+Prøv venligst om lidt igen.
+ </string>
<string name="AgentLostConnection">
Denne region kan have problemer. Tjek venligst din forbindelse til internettet.
</string>
@@ -423,6 +557,12 @@
<string name="symbolic folder link">
link til mappe
</string>
+ <string name="mesh">
+ mesh
+ </string>
+ <string name="AvatarEditingAppearance">
+ (Redigering Udseende)
+ </string>
<string name="AvatarAway">
Væk
</string>
@@ -784,7 +924,7 @@
XML Fil
</string>
<string name="raw_file">
- RAW Fil
+ RAW fil
</string>
<string name="compressed_image_files">
Komprimerede billeder
@@ -852,6 +992,9 @@
<string name="tattoo">
Tatovering
</string>
+ <string name="physics">
+ Fysik
+ </string>
<string name="invalid">
ugyldig
</string>
@@ -891,6 +1034,9 @@
<string name="tattoo_not_worn">
Tatovering ikke benyttet
</string>
+ <string name="physics_not_worn">
+ Ikke noget fysisk båret
+ </string>
<string name="invalid_not_worn">
ugyldig
</string>
@@ -939,6 +1085,9 @@
<string name="create_new_tattoo">
Opret ny tatovering
</string>
+ <string name="create_new_physics">
+ Opret ny fysik
+ </string>
<string name="create_new_invalid">
ugyldig
</string>
@@ -1037,7 +1186,7 @@
</string>
<string name="WornOnAttachmentPoint" value=" (båret på [ATTACHMENT_POINT])"/>
<string name="ActiveGesture" value="[GESLABEL] (aktiv)"/>
- <string name="Chat" value=" Chat : "/>
+ <string name="Chat Message" value="Chat :"/>
<string name="Sound" value=" Lyd : "/>
<string name="Wait" value=" --- Vent : "/>
<string name="AnimFlagStop" value=" Stop Animation : "/>
@@ -1063,9 +1212,6 @@
<string name="InvFolder My Inventory">
Min beholdning
</string>
- <string name="InvFolder My Favorites">
- Mine favoritter
- </string>
<string name="InvFolder Library">
Bibliotek
</string>
@@ -1124,10 +1270,10 @@
Bevægelser
</string>
<string name="InvFolder Favorite">
- Favoritter
+ Mine favoritter
</string>
<string name="InvFolder favorite">
- Favoritter
+ Mine favoritter
</string>
<string name="InvFolder Current Outfit">
Nuværende sæt
@@ -1141,6 +1287,9 @@
<string name="InvFolder Accessories">
Tilbehør
</string>
+ <string name="InvFolder Meshes">
+ Meshes
+ </string>
<string name="InvFolder Friends">
Venner
</string>
@@ -1455,7 +1604,7 @@
(ukendt)
</string>
<string name="SummaryForTheWeek" value="Opsummering for denne uge, begyndende med "/>
- <string name="NextStipendDay" value="Næste stipendie dag er "/>
+ <string name="NextStipendDay" value=". Næste stipendie dag er "/>
<string name="GroupIndividualShare" value=" Gruppe Individuel Delt"/>
<string name="GroupColumn" value="Gruppe"/>
<string name="Balance">
@@ -1689,7 +1838,7 @@
<string name="RegionNoCovenantOtherOwner">
Der er ingen regler for dette estate. Land på dette estate sælges af estate ejeren, ikke af Linden Lab. Kontakt venligst estate ejeren for detaljer om salg.
</string>
- <string name="covenant_last_modified" value="Sidst rettet:"/>
+ <string name="covenant_last_modified" value="Sidst rettet: "/>
<string name="none_text" value=" (ingen) "/>
<string name="never_text" value=" (aldrig) "/>
<string name="GroupOwned">
@@ -1737,11 +1886,8 @@
<string name="InvOfferGaveYou">
gav dig
</string>
- <string name="InvOfferYouDecline">
- Du afslår
- </string>
- <string name="InvOfferFrom">
- fra
+ <string name="InvOfferDecline">
+ Du afslår [DESC] fra &lt;nolink&gt;[NAME]&lt;/nolink&gt;.
</string>
<string name="GroupMoneyTotal">
Total
@@ -1822,12 +1968,6 @@ Forventet .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
<string name="accel-win-shift">
Shift+
</string>
- <string name="Esc">
- Esc
- </string>
- <string name="Home">
- Hjem
- </string>
<string name="FileSaved">
Fil gemt
</string>
@@ -1846,34 +1986,34 @@ Forventet .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
<string name="PDT">
PDT
</string>
- <string name="Forward">
+ <string name="Direction_Forward">
Fremad
</string>
- <string name="Left">
+ <string name="Direction_Left">
Venstre
</string>
- <string name="Right">
+ <string name="Direction_Right">
Højre
</string>
- <string name="Back">
+ <string name="Direction_Back">
Bagud
</string>
- <string name="North">
+ <string name="Direction_North">
Nord
</string>
- <string name="South">
+ <string name="Direction_South">
Syd
</string>
- <string name="West">
+ <string name="Direction_West">
Vest
</string>
- <string name="East">
+ <string name="Direction_East">
Øst
</string>
- <string name="Up">
+ <string name="Direction_Up">
Op
</string>
- <string name="Down">
+ <string name="Direction_Down">
Ned
</string>
<string name="Any Category">
@@ -1945,6 +2085,9 @@ Forventet .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
<string name="Other">
Andet
</string>
+ <string name="Rental">
+ Leje
+ </string>
<string name="Any">
Enhver
</string>
@@ -2181,6 +2324,114 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE].
<string name="Bulbous Nose">
Kartoffelnæse
</string>
+ <string name="Breast Physics Mass">
+ Bryst fylde
+ </string>
+ <string name="Breast Physics Smoothing">
+ Brystudjævning
+ </string>
+ <string name="Breast Physics Gravity">
+ Bryst tyngde
+ </string>
+ <string name="Breast Physics Drag">
+ Bryst inerti
+ </string>
+ <string name="Breast Physics InOut Max Effect">
+ Maks. effekt
+ </string>
+ <string name="Breast Physics InOut Spring">
+ Fjeder
+ </string>
+ <string name="Breast Physics InOut Gain">
+ Øg
+ </string>
+ <string name="Breast Physics InOut Damping">
+ Dæmpning
+ </string>
+ <string name="Breast Physics UpDown Max Effect">
+ Maks. effekt
+ </string>
+ <string name="Breast Physics UpDown Spring">
+ Fjeder
+ </string>
+ <string name="Breast Physics UpDown Gain">
+ Øg
+ </string>
+ <string name="Breast Physics UpDown Damping">
+ Dæmpning
+ </string>
+ <string name="Breast Physics LeftRight Max Effect">
+ Maks. effekt
+ </string>
+ <string name="Breast Physics LeftRight Spring">
+ Fjeder
+ </string>
+ <string name="Breast Physics LeftRight Gain">
+ Øg
+ </string>
+ <string name="Breast Physics LeftRight Damping">
+ Dæmpning
+ </string>
+ <string name="Belly Physics Mass">
+ Mave omfang
+ </string>
+ <string name="Belly Physics Smoothing">
+ maveudjævning
+ </string>
+ <string name="Belly Physics Gravity">
+ Mave tyngde
+ </string>
+ <string name="Belly Physics Drag">
+ Mave inerti
+ </string>
+ <string name="Belly Physics UpDown Max Effect">
+ Maks. effekt
+ </string>
+ <string name="Belly Physics UpDown Spring">
+ Fjeder
+ </string>
+ <string name="Belly Physics UpDown Gain">
+ Øg
+ </string>
+ <string name="Belly Physics UpDown Damping">
+ Dæmpning
+ </string>
+ <string name="Butt Physics Mass">
+ Bagdel omfang
+ </string>
+ <string name="Butt Physics Smoothing">
+ Bagdelsudjævning
+ </string>
+ <string name="Butt Physics Gravity">
+ Bagdel tyngde
+ </string>
+ <string name="Butt Physics Drag">
+ Bagdel modstand
+ </string>
+ <string name="Butt Physics UpDown Max Effect">
+ Maks. effekt
+ </string>
+ <string name="Butt Physics UpDown Spring">
+ Fjeder
+ </string>
+ <string name="Butt Physics UpDown Gain">
+ Øg
+ </string>
+ <string name="Butt Physics UpDown Damping">
+ Dæmpning
+ </string>
+ <string name="Butt Physics LeftRight Max Effect">
+ Maks. effekt
+ </string>
+ <string name="Butt Physics LeftRight Spring">
+ Fjeder
+ </string>
+ <string name="Butt Physics LeftRight Gain">
+ Øg
+ </string>
+ <string name="Butt Physics LeftRight Damping">
+ Dæmpning
+ </string>
<string name="Bushy Eyebrows">
Buskede øjenbryn
</string>
@@ -2190,6 +2441,9 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE].
<string name="Butt Size">
Størrelse bagdel
</string>
+ <string name="Butt Gravity">
+ Bagdel tyngde
+ </string>
<string name="bustle skirt">
Tournure
</string>
@@ -3543,6 +3797,9 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE].
<string name="session_initialization_timed_out_error">
Initialisering af session er &quot;timed out&quot;
</string>
+ <string name="Home position set.">
+ Hjemmeposition sat.
+ </string>
<string name="voice_morphing_url">
http://secondlife.com/landing/voicemorphing
</string>
@@ -3665,6 +3922,9 @@ Krænkelsesanmeldelse
<string name="New Tattoo">
Ny tatovering
</string>
+ <string name="New Physics">
+ Ny fysik
+ </string>
<string name="Invalid Wearable">
Kan ikke tages på
</string>
@@ -3864,7 +4124,7 @@ Krænkelsesanmeldelse
<string name="Notices">
Beskeder
</string>
- <string name="Chat">
+ <string name="Chat" value=" Chat : ">
Chat
</string>
<string name="DeleteItems">
@@ -3876,4 +4136,348 @@ Krænkelsesanmeldelse
<string name="EmptyOutfitText">
Der er ingen genstande i dette sæt
</string>
+ <string name="ExternalEditorNotSet">
+ Vælg en editor via opsætningen for Ekstern editor.
+ </string>
+ <string name="ExternalEditorNotFound">
+ Kan ikke benytte deb eksterne editor der er angivet.
+Prøv at omkrandse stien til editor med anførselstegn.
+(f.eks. &quot;/stil til min editor&quot; &quot;%s&quot;)
+ </string>
+ <string name="ExternalEditorCommandParseError">
+ Fejl ved håndtering af kommando til ekstern editor.
+ </string>
+ <string name="ExternalEditorFailedToRun">
+ Den eksterne editor kunne ikke startes.
+ </string>
+ <string name="Esc">
+ Esc
+ </string>
+ <string name="Space">
+ Space
+ </string>
+ <string name="Enter">
+ Enter
+ </string>
+ <string name="Tab">
+ Tab
+ </string>
+ <string name="Ins">
+ Ins
+ </string>
+ <string name="Del">
+ Del
+ </string>
+ <string name="Backsp">
+ Backsp
+ </string>
+ <string name="Shift">
+ Shift
+ </string>
+ <string name="Ctrl">
+ Ctrl
+ </string>
+ <string name="Alt">
+ Alt
+ </string>
+ <string name="CapsLock">
+ CapsLock
+ </string>
+ <string name="Home">
+ Hjem
+ </string>
+ <string name="End">
+ End
+ </string>
+ <string name="PgUp">
+ PgUp
+ </string>
+ <string name="PgDn">
+ PgDn
+ </string>
+ <string name="F1">
+ F1
+ </string>
+ <string name="F2">
+ F2
+ </string>
+ <string name="F3">
+ F3
+ </string>
+ <string name="F4">
+ F4
+ </string>
+ <string name="F5">
+ F5
+ </string>
+ <string name="F6">
+ F6
+ </string>
+ <string name="F7">
+ F7
+ </string>
+ <string name="F8">
+ F8
+ </string>
+ <string name="F9">
+ F9
+ </string>
+ <string name="F10">
+ F10
+ </string>
+ <string name="F11">
+ F11
+ </string>
+ <string name="F12">
+ F12
+ </string>
+ <string name="Add">
+ Tilføj
+ </string>
+ <string name="Subtract">
+ Træk fra
+ </string>
+ <string name="Multiply">
+ Multiplicer
+ </string>
+ <string name="Divide">
+ Divider
+ </string>
+ <string name="PAD_DIVIDE">
+ PAD_DIVIDE
+ </string>
+ <string name="PAD_LEFT">
+ PAD_LEFT
+ </string>
+ <string name="PAD_RIGHT">
+ PAD_RIGHT
+ </string>
+ <string name="PAD_DOWN">
+ PAD_DOWN
+ </string>
+ <string name="PAD_UP">
+ PAD_UP
+ </string>
+ <string name="PAD_HOME">
+ PAD_HOME
+ </string>
+ <string name="PAD_END">
+ PAD_END
+ </string>
+ <string name="PAD_PGUP">
+ PAD_PGUP
+ </string>
+ <string name="PAD_PGDN">
+ PAD_PGDN
+ </string>
+ <string name="PAD_CENTER">
+ PAD_CENTER
+ </string>
+ <string name="PAD_INS">
+ PAD_INS
+ </string>
+ <string name="PAD_DEL">
+ PAD_DEL
+ </string>
+ <string name="PAD_Enter">
+ PAD_Enter
+ </string>
+ <string name="PAD_BUTTON0">
+ PAD_BUTTON0
+ </string>
+ <string name="PAD_BUTTON1">
+ PAD_BUTTON1
+ </string>
+ <string name="PAD_BUTTON2">
+ PAD_BUTTON2
+ </string>
+ <string name="PAD_BUTTON3">
+ PAD_BUTTON3
+ </string>
+ <string name="PAD_BUTTON4">
+ PAD_BUTTON4
+ </string>
+ <string name="PAD_BUTTON5">
+ PAD_BUTTON5
+ </string>
+ <string name="PAD_BUTTON6">
+ PAD_BUTTON6
+ </string>
+ <string name="PAD_BUTTON7">
+ PAD_BUTTON7
+ </string>
+ <string name="PAD_BUTTON8">
+ PAD_BUTTON8
+ </string>
+ <string name="PAD_BUTTON9">
+ PAD_BUTTON9
+ </string>
+ <string name="PAD_BUTTON10">
+ PAD_BUTTON10
+ </string>
+ <string name="PAD_BUTTON11">
+ PAD_BUTTON11
+ </string>
+ <string name="PAD_BUTTON12">
+ PAD_BUTTON12
+ </string>
+ <string name="PAD_BUTTON13">
+ PAD_BUTTON13
+ </string>
+ <string name="PAD_BUTTON14">
+ PAD_BUTTON14
+ </string>
+ <string name="PAD_BUTTON15">
+ PAD_BUTTON15
+ </string>
+ <string name="-">
+ -
+ </string>
+ <string name="=">
+ =
+ </string>
+ <string name="`">
+ `
+ </string>
+ <string name=";">
+ ;
+ </string>
+ <string name="[">
+ [
+ </string>
+ <string name="]">
+ ]
+ </string>
+ <string name="\">
+ \
+ </string>
+ <string name="0">
+ 0
+ </string>
+ <string name="1">
+ 1
+ </string>
+ <string name="2">
+ 2
+ </string>
+ <string name="3">
+ 3
+ </string>
+ <string name="4">
+ 4
+ </string>
+ <string name="5">
+ 5
+ </string>
+ <string name="6">
+ 6
+ </string>
+ <string name="7">
+ 7
+ </string>
+ <string name="8">
+ 8
+ </string>
+ <string name="9">
+ 9
+ </string>
+ <string name="A">
+ A
+ </string>
+ <string name="B">
+ B
+ </string>
+ <string name="C">
+ C
+ </string>
+ <string name="D">
+ D
+ </string>
+ <string name="E">
+ E
+ </string>
+ <string name="F">
+ F
+ </string>
+ <string name="G">
+ G
+ </string>
+ <string name="H">
+ H
+ </string>
+ <string name="I">
+ I
+ </string>
+ <string name="J">
+ J
+ </string>
+ <string name="K">
+ K
+ </string>
+ <string name="L">
+ L
+ </string>
+ <string name="M">
+ M
+ </string>
+ <string name="N">
+ N
+ </string>
+ <string name="O">
+ O
+ </string>
+ <string name="P">
+ P
+ </string>
+ <string name="Q">
+ Q
+ </string>
+ <string name="R">
+ R
+ </string>
+ <string name="S">
+ S
+ </string>
+ <string name="T">
+ T
+ </string>
+ <string name="U">
+ U
+ </string>
+ <string name="V">
+ V
+ </string>
+ <string name="W">
+ W
+ </string>
+ <string name="X">
+ X
+ </string>
+ <string name="Y">
+ Y
+ </string>
+ <string name="Z">
+ Z
+ </string>
+ <string name="BeaconParticle">
+ Viser pejlelys for for partikler (blå)
+ </string>
+ <string name="BeaconPhysical">
+ Viser pejlelys for fysiske objekter (grøn)
+ </string>
+ <string name="BeaconScripted">
+ Viser pejlelys for &quot;scriptede&quot; objekter (rød)
+ </string>
+ <string name="BeaconScriptedTouch">
+ Viser pejlelys for &quot;scriptede&quot; objekter med berøringsfunktion (rød)
+ </string>
+ <string name="BeaconSound">
+ Viser pejlelys for lyd (gul)
+ </string>
+ <string name="BeaconMedia">
+ Viser pejlelys for media (hvid)
+ </string>
+ <string name="ParticleHiding">
+ Skjuler partikler
+ </string>
</strings>
diff --git a/indra/newview/skins/default/xui/da/teleport_strings.xml b/indra/newview/skins/default/xui/da/teleport_strings.xml
index 071aab46f4..0d89fae986 100644
--- a/indra/newview/skins/default/xui/da/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/da/teleport_strings.xml
@@ -20,6 +20,10 @@ Hvis du stadig ikke kan teleporte, prøv venligst at logge ud og ligge ind for a
Beklager, systemet kunne ikke fuldføre teleport forbindelse.
Prøv igen om lidt.
</message>
+ <message name="NoHelpIslandTP">
+ Du kan ikke teleportere tilbage til Welcome Island.
+Gå til &apos;Welcome Island Puclic&apos; for at prøve tutorial igen.
+ </message>
<message name="noaccess_tport">
Beklager, du har ikke adgang til denne teleport destination.
</message>
diff --git a/indra/newview/skins/default/xui/de/floater_about.xml b/indra/newview/skins/default/xui/de/floater_about.xml
index d15ab105c2..b4c28daac9 100644
--- a/indra/newview/skins/default/xui/de/floater_about.xml
+++ b/indra/newview/skins/default/xui/de/floater_about.xml
@@ -10,7 +10,7 @@
<floater.string name="AboutPosition">
Sie befinden sich in [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] in [REGION] auf &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ([HOSTIP])
[SERVER_VERSION]
-[[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]]
+[SERVER_RELEASE_NOTES_URL]
</floater.string>
<floater.string name="AboutSystem">
CPU: [CPU]
@@ -37,45 +37,64 @@ Voice-Serverversion: [VOICE_VERSION]
<floater.string name="AboutTraffic">
Paketverlust: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
</floater.string>
+ <floater.string name="ErrorFetchingServerReleaseNotesURL">
+ Fehler beim Abrufen der URL für die Server-Versionshinweise.
+ </floater.string>
<tab_container name="about_tab">
<panel label="Info" name="support_panel">
<button label="In Zwischenablage kopieren" name="copy_btn"/>
</panel>
<panel label="Danksagung" name="credits_panel">
- <text_editor name="credits_editor">
- Second Life wird Ihnen präsentiert von Philip, Tessa, Andrew, Cory, Ian, James, Phoenix, Ryan, Haney, Dan, Char, Ben, John, Tanya, Eddie, Richard, Mitch, Doug, Eric, Frank, Bruce, Aaron, Peter, Alice, Charlie, Debra, Eileen, Helen, Janet, Steffan, Steve, Tom, Mark, Hunter, Xenon, Burgess, Bill, Jim, Lee, Hamlet, Daniel, Jeff, Todd, Sarah, Tim, Stephanie, Colin, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Jack, Vektor, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Jesse, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Yuko, Makiko, Thomas, Harry, Seth, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Brad, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, Beez, Milo, Hermia, Red, Thrax, Gulliver, Joe, Sally, Paul, Jose, Rejean, Dore, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, Dustin, George, Del, Matthew, Cat, Jacqui, Adrian, Viola, Alfred, Noel, Irfan, Yool, Rika, Jane, Frontier, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Jeremy, JP, Jake, Anthony, Maurice, Madhavi, Leopard, Kyle, Joon, Bert, Belinda, Jon, Kristi, Bridie, Pramod, Socrates, Maria, Aric, Adreanne, Jay, Kari, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Colossus, Zen, BigPapi, Pastrami, Kurz, Mani, Neuro, Mel, Sardonyx, MJ, Rowan, Sgt, Elvis, Samuel, Leo, Bryan, Niko, Austin, Soft, Poppy, Rachel, Aki, Banzai, Alexa, Sue, Bender, CG, Angelo, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Rothman, Niall, Marin, Allison, Katie, Dawn, Dusty, Katt, Judy, Andrea, Ambroff, Infinity, Rico, Gail, Kalpana, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Maestro, Simone, Yang, T, Shannon, Nelson, Khanh, Scott, Courtney, Charlene, Quixote, Susan, Zed, Amanda, Katelin, Enkidu, Roxie, Esbee, JoRoan, Scarlet, Tay, Kevin, Wolfgang, Johnny, Ray, Andren, Merov, Bob, Rand, Howard, Callen, Heff, Galen, Newell, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl, Ashley, JessieAnn, Huseby, Karina, Paris, Kurt, Rick, Lis, Kotler, Theeba, Lynx, Murphy, Doten, Taka, Norm, Jillian, Marcus, Mae, Novack, Esther, Perry, Dana, Ducot, Javier, Porter, Madison, Gecko, Dough, JR, Gisele, Crimp, Norie, Arch, Kimi, Fisher, Barbara, Jason, Peggy, Bernard, Jules, Leroy, Eva, Khederian, Campbell, Vogt, Masido, Karel, Torres, Lo, Breezer, Delby, Rountree, Anna, Servus, Rue, Itiaes, Chuck, Luna, Novella, Zaza, Wen, Gino, Lex, Cassandra, Limey, Nancy, Anukul, Silver, Brodesky, Jinsai, Squid, Gez, Rakesh, Ladan, Edelman, Marcet, Squire, Tatem, Tony, Jerm, Tia, Falcon, BK, Tiggs, Driscoll, Bacon, Timothee, Cru, Carmilla, Coyot, Webb, Kazu, Rudas, LJ, Sea, Ali Wallace, Bewest, Pup, Drub, Dragon, Inoshiro, Byron, Rhett, Xandix, Aimee, Fredrik, Thor, Teddy, Baron, Nelly, Ghengis, Epic, Eli, Stone, Grapes, Irie, Prep, Scobu, Valerie, Alain und vielen anderen.
-
-Wir bedanken uns bei folgenden Einwohnern, die uns geholfen haben, dies zur bisher besten Version zu machen: Drew Dwi, Zai Lynch, Latif Khalifa, Ellla McMahon, Harleen Gretzky, Squirrel Wood, Malarthi Behemoth, Dante Tucker, Buckaroo Mu, Eddi Decosta, Dirk, Talamasca, Torben Trautman, Irene Muni, Aralara Rajal, Aura Dirval, Cayu Cluny, Eva Rau, FreeSL Aeon, Frontera Thor, Inma Rau, Lunita Savira, Minerva Memel, Polo Gufler, Xiki Luik, Lilly Zenovka, Vick Forcella, Sasy Scarborough, Gentle Welinder, Elric Anatine, Techwolf Lupindo, Dusan Writer, WolfPup Lowenhar, Marianne McCann, Fiachra Lach, Sitearm Madonna, Sudane Erato, Sahkolihaa Contepomi, Sachi Vixen, Questar Utu, Dimitrio Lewis, Matto Destiny, Scrim Pinion, Radio Signals, Psi Merlin, Pixel Gausman, Mel Vanbeeck, Laurent Bechir, Lamorna Proctor, Lares Carter, Gwyneth Llewelyn, Hydra Shaftoe, Holger Gilruth, Gentle Heron, Carla Broek, Boroondas Gupte, Fury Rosewood, Flower Ducatillon, Colpo Wexler, gwampa Lomu, Borg Capalini, Beansy Twine, Ardy Lay, , 45ms Zhong, Adeon Writer, Aeonix Aeon, Ai Austin, Aiko Ying, Alexandrea Fride, Alliez Mysterio, Annie Milestone, Annika Genezzia, Ansariel Hiller, ArminasX Saiman, Arya Braveheart, Asaeda Meltingdots, Asturkon Jua, Avallyn Oakleaf, Avatar Quinzet, BabyA Littlething, Bacchus Ireto, Bazaar, Riva, Benjamin Bigdipper, Beth Walcher, Bezilon Kasei, Biancaluce Robbiani, Bill Walach, blakopal Galicia, Blitzckreed Levenque, Bryn Oh, Callipygian Christensen, Cap Carver, Carr Arbenlow, Chantal Harvey, Charles Courtois, Charlie Sazaland, Cherry Cheevers, ChickyBabes Zuzu, Christopher Organiser, Ciaran Laval, Clara Young, Celierra Darling, Corinne Helendale, Corro Moseley, Coughdrop Littlething, Darien Caldwell, Dartagan Shepherd, Debs Regent, Decro Schmooz, Denim Kamachi, DiJodi Dubratt, Dil Spitz, Edgware Marker, Egehan Dryke, Emma Portilo, Emmie Fairymeadow, Evangelista Emerald, Faelon Swordthain, Frenchimmo Sabra, Gaberoonie Zanzibar, Ganymedes Costagravas, Gene Frostbite, GeneJ Composer, Giggles Littlebird, Grady Echegaray, Guni Greenstein, Gypsy Tripsa, Hackshaven Harford, Ham Rambler, Han Shuffle, Hanglow Short, Hatzfeld Runo, herina Bode, Horatio Freund, Hypatia Callisto, Hypatia Pickens, Identity Euler, Imnotgoing Sideways, Innula Zenovka, Iyoba Tarantal, Jack Abraham, Jagga Meredith, Jennifer Boyle, Jeremy Marquez, Jessica Qin, Jinx Nordberg, Jo Bernandes, Jocial Sonnenkern, Joel Savard, Jondan Lundquist, Josef Munster, Josette Windlow, Juilan Tripsa, Juro Kothari, Justin RiversRunRed, Kagehi Kohn, Kaimen Takahe, Keklily Longfall, Ken Lavender, Kestral Karas, Khisme Nitely, Kimar Coba, Kithrak Kirkorian, Kitty Barnett, Kolor Fall, Komiko Okamoto, Korvel Noh, Larry Pixel, Leal Choche, len Starship, Lenae Munz, Lexi Frua, Lillie Cordeaux, Lizzy Macarthur, LSL Scientist, Luban Yiyuan, Luc Starsider, Maccus McCullough, Madison Blanc, Maggie Darwin, Mallory Destiny, Manx Wharton, Marc Claridge, Marc2 Sands, Matthew Anthony, Maxim RiversRunRed, Medhue Simoni, Melinda Latynina, Mencius Watts, Michi Lumin, Midian Farspire, Miles Glaz, Mindy Mathy, Mitch Wagner, Mo Hax, Mourna Biziou, Nao Noe, naofan Teardrop, Naomah Beaumont, Nathiel Siamendes, Nber Medici, Neko Link, Netpat Igaly, Neutron Chesnokov, Newfie Pendragon, Nicholai Laviscu, Nick Rhodes, Nicoladie Gymnast, Ollie Kubrick, Orenj Marat, Orion Delphis, Oryx Tempel, Parvati Silverweb, PeterPunk Mooney, Pixel Scientist, Pounce Teazle, Professor Noarlunga, Quantum Destiny, Quicksilver Hermes, Ralf Setsuko, RAT Quan, RedMokum Bravin, Revolution Perenti, Rezit Sideways, Rich Grainger, Rosco Teardrop, Rose Evans, Rudee Voom, RufusTT Horsefly, Saii Hallard, SaintLEOlions Zimer, Samm Larkham, Satanello Miami, SexySteven Morrisey, Sheet Spotter, Shnurui Troughton, sicarius Thorne, Sicarius Toxx, Sini Nubalo, SLB Wirefly, snowy Sidran, Soupa Segura, ST Mensing, Starshine Halasy, Stickman Ingmann, Synystyr Texan, Takeda Terrawyng, Tali Rosca, Templar Merlin, Tezcatlipoca Bisiani, Tiel Stonecutter, Tony Kembia, TouchaHoney Perhaps, Trey Reanimator, TriloByte Zanzibar, Trinity Dechou, Trinity Dejavu, Unlikely Quintessa, UsikuFarasi Kanarik, Veritas Raymaker, Vex Streeter, Viaticus Speculaas, Villain Baroque, Vixie Durant, Void Singer, Watty Berkson, Westley Schridde, Westley Streeter, Whimsy Winx, Winter Ventura, Wundur Primbee, xstorm Radek, YongYong Francois, Zak Westminster, Zana Kohime, Zaren Alexander, Zeja Pyle, ZenMondo Wormser, Zoex Flanagan und vielen anderen.
-
-
-
-
-„Die Arbeit beginnt aufs Neue, die Hoffnung lebt weiter, und der Traum wird niemals sterben.“ - Edward Kennedy
+ <text name="linden_intro">
+ Second Life wird präsentiert von den Lindens:
+ </text>
+ <text_editor name="linden_names">
+ Philip, Andrew, Doug, Richard, Phoenix, Ian, Mark, Robin, Dan, Char, Ryan, Eric, Jim, Lee, Jeff, Michael, Kelly, Steve, Catherine, Bub, Ramzi, Jill, Jeska, Don, Kona, Callum, Charity, Jack, Shawn, babbage, James, Lauren, Blue, Brent, Reuben, Pathfinder, Jesse, Patsy, Torley, Bo, Cyn, Jonathan, Gia, Annette, Ginsu, Harry, Lex, Runitai, Guy, Cornelius, Beth, Swiss, Thumper, Wendy, Teeple, Seth, Dee, Mia, Sally, Liana, Aura, Beez, Milo, Red, Gulliver, Marius, Joe, Jose, Dore, Justin, Nora, Morpheus, Lexie, Amber, Chris, Xan, Leyla, Walker, Sabin, Joshua, Hiromi, Tofu, Fritz, June, Jean, Ivy, Dez, Ken, Betsy, Which, Spike, Rob, Zee, Dustin, George, Claudia, del, Matthew, jane, jay, Adrian, Yool, Rika, Yoz, siobhan, Qarl, Benjamin, Beast, Everett, madhavi, Christopher, Izzy, stephany, Jeremy, sean, adreanne, Pramod, Tobin, sejong, Iridium, maurice, kj, Meta, kari, JP, bert, kyle, Jon, Socrates, Bridie, Ivan, maria, Aric, Coco, Periapse, sandy, Storrs, Lotte, Colossus, Brad, Pastrami, Zen, BigPapi, Banzai, Sardonyx, Mani, Garry, Jaime, Neuro, Samuel, Niko, CeeLo, Austin, Soft, Poppy, emma, tessa, angelo, kurz, alexa, Sue, CG, Blake, Erica, Brett, Bevis, kristen, Q, simon, Enus, MJ, laurap, Kip, Scouse, Ron, Ram, kend, Marty, Prospero, melissa, kraft, Nat, Seraph, Hamilton, Lordan, Green, miz, Ashlei, Trinity, Ekim, Echo, Charlie, Rowan, Rome, Jt, Doris, benoc, Christy, Bao, Kate, Tj, Patch, Cheah, Johan, Brandy, Angela, Oreh, Cogsworth, Lan, Mitchell, Space, Bambers, Einstein, Bender, Malbers, Matias, Maggie, Rothman, Milton, Niall, Marin, Allison, Mango, Andrea, Katt, Yi, Ambroff, Rico, Raymond, Gail, Christa, William, Dawn, Usi, Dynamike, M, Corr, Dante, Molly, kaylee, Danica, Kelv, Lil, jacob, Nya, Rodney, elsie, Blondin, Grant, Nyx, Devin, Monty, Minerva, Keira, Katie, Jenn, Makai, Clare, Joy, Cody, Gayathri, FJ, spider, Oskar, Landon, Jarv, Noelle, Al, Doc, Gray, Vir, t, Maestro, Simone, Shannon, yang, Courtney, Scott, charlene, Quixote, Susan, Zed, Amanda, Katelin, Esbee, JoRoan, Enkidu, roxie, Scarlet, Merov, Kevin, Judy, Rand, Newell, Les, Dessie, Galen, Michon, Geo, Siz, Calyle, Pete, Praveen, Callen, Sheldon, Pink, Nelson, jenelle, Terrence, Nathan, Juan, Sascha, Huseby, Karina, Kaye, Kotler, Lis, Darv, Charrell, Dakota, Kimmora, Theeba, Taka, Mae, Perry, Ducot, dana, Esther, Dough, gisele, Doten, Viale, Fisher, jessieann, ashley, Torres, delby, rountree, kurt, Slaton, Madison, Rue, Gino, Wen, Casssandra, Brodesky, Squid, Gez, Rakesh, Gecko, Ladan, Tony, Tatem, Squire, Falcon, BK, Crimp, Tiggs, Bacon, Coyot, Carmilla, Webb, Sea, Arch, Jillian, Jason, Bernard, Vogt, Peggy, dragon, Pup, xandix, Wallace, Bewest, Inoshiro, Rhett, AG, Aimee, Ghengis, Itiaes, Eli, Steffan, Epic, Grapes, Stone, Prep, Scobu, Robert, Alain, Carla, Vicky, Tia, Alec, Taras, Lisa, Oz, Ariane, Log, House, Kazu, Kim, Drofnas, Tyler, Campbell, Michele, Madeline, Nelly, Baron, Thor, Lori, Hele, Fredrik, Teddy, Pixie, Berry, Gabrielle, Alfonso, Brooke, Wolf, Ringo, Cru, Charlar, Rodvik, Gibson, Elise, Bagman, Greger, Leonidas, Jerm, Leslie, CB, Brenda, Durian, Carlo, mm, Zeeshan, Caleb, Max, Elikak, Mercille, Steph, Chase
+ </text_editor>
+ <text name="contrib_intro">
+ mit Open-Source-Beiträgen von:
+ </text>
+ <text_editor name="contrib_names">
+ Dummy-Name wird zur Laufzeit ersetzt
+ </text_editor>
+ <text name="trans_intro">
+ mit Ãœbersetzungen von:
+ </text>
+ <text_editor name="trans_names">
+ Dummy Name wird zur Laufzeit ersetzt
</text_editor>
</panel>
<panel label="Lizenzen" name="licenses_panel">
<text_editor name="credits_editor">
- 3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion
-APR Copyright (C) 2000-2004 The Apache Software Foundation
-cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)
-expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.
-FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org).
-GL Copyright (C) 1999-2004 Brian Paul.
-Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.
-jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)
-jpeglib Copyright (C) 1991-1998, Thomas G. Lane.
-ogg/vorbis Copyright (C) 2001, Xiphophorus
-OpenSSL Copyright (C) 1998-2002 The OpenSSL Project.
-SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
-SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
-xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
-zlib Copyright (C) 1995-2002 Jean-loup Gailly und Mark Adler.
-google-perftools Copyright (c) 2005, Google Inc.
+ 3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion.
+ APR Copyright (C) 2000-2004 The Apache Software Foundation.
+ Collada DOM Copyright 2005 Sony Computer Entertainment Inc.
+ cURL Copyright (C) 1996-2002, Daniel Stenberg (daniel@haxx.se).
+ DBus/dbus-glib Copyright (C) 2002, 2003 CodeFactory AB / Copyright (C) 2003, 2004 Red Hat, Inc.
+ expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.
+ FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org).
+ GL Copyright (C) 1999-2004 Brian Paul.
+ GLOD Copyright (C) 2003-04 Jonathan Cohen, Nat Duca, Chris Niski, Johns Hopkins University sowie David Luebke, Brenden Schubert, University of Virginia.
+ google-perftools Copyright (c) 2005, Google Inc.
+ Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.
+ jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW).
+ jpeglib Copyright (C) 1991-1998, Thomas G. Lane.
+ ogg/vorbis Copyright (C) 2001, Xiphophorus.
+ OpenSSL Copyright (C) 1998-2002 The OpenSSL Project.
+ PCRE Copyright (c) 1997-2008 University of Cambridge.
+ SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga.
+ SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com).
+ xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
+ zlib Copyright (C) 1995-2002 Jean-loup Gailly und Mark Adler.
+ google-perftools Copyright (c) 2005, Google Inc.
+
+ Second Life Viewer verwendet Havok (TM) Physics. (c)Copyright 1999-2010 Havok.com Inc. (und Lizenzgeber). Alle Rechte vorbehalten. Details siehe www.havok.com.
+
+ Diese Software enthält von der NVIDIA Corporation bereitgestellten Quellcode.
-Alle Rechte vorbehalten. Details siehe licenses.txt.
+ Alle Rechte vorbehalten. Details siehe licenses.txt.
-Voice-Chat-Audiocoding: Polycom(R) Siren14(TM)
-(ITU-T Empf.G.722.1 Anhang C)
+ Audiocodierung für Voice-Chat: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
</text_editor>
</panel>
</tab_container>
diff --git a/indra/newview/skins/default/xui/de/floater_about_land.xml b/indra/newview/skins/default/xui/de/floater_about_land.xml
index f9169ed748..9e330f9766 100644
--- a/indra/newview/skins/default/xui/de/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/de/floater_about_land.xml
@@ -86,15 +86,9 @@
<text name="Owner:">
Eigentümer:
</text>
- <text name="OwnerText">
- Leyla Linden
- </text>
<text name="Group:">
Gruppe:
</text>
- <text name="GroupText">
- Leyla Linden
- </text>
<button label="Festlegen" label_selected="Einstellen..." name="Set..." width="90"/>
<check_box label="Übertragung an Gruppe zulassen" name="check deed" tool_tip="Ein Gruppen-Officer kann dieses Land der Gruppe übertragen. Das Land wird dann über die Landzuteilung der Gruppe verwaltet."/>
<button label="Übertragung" label_selected="Übertragen..." name="Deed..." tool_tip="Sie können Land nur übertragen, wenn Sie in der ausgewählten Gruppe Officer sind."/>
@@ -109,17 +103,17 @@
Preis: [PRICE] L$ ([PRICE_PER_SQM]L$/m²)
</text>
<text name="SalePending"/>
- <button bottom="-222" label="Land verkaufen" label_selected="Land verkaufen..." name="Sell Land..."/>
+ <button label="Land verkaufen" label_selected="Land verkaufen..." name="Sell Land..."/>
<text name="For sale to">
Zum Verkauf an: [BUYER]
</text>
- <text left_delta="-50" name="Sell with landowners objects in parcel." width="240">
+ <text name="Sell with landowners objects in parcel.">
Objekte sind im Verkauf eingeschlossen
</text>
- <text name="Selling with no objects in parcel." width="260">
+ <text name="Selling with no objects in parcel.">
Objekte sind im Verkauf nicht eingeschlossen
</text>
- <button bottom="-222" label="Landverkauf abbrechen" label_selected="Landverkauf abbrechen" name="Cancel Land Sale"/>
+ <button label="Landverkauf abbrechen" label_selected="Landverkauf abbrechen" name="Cancel Land Sale"/>
<text name="Claimed:">
Gekauft am:
</text>
@@ -136,15 +130,15 @@
Traffic:
</text>
<text name="DwellText">
- 0
+ Laden...
</text>
<button label="Land kaufen" label_selected="Land kaufen..." name="Buy Land..."/>
+ <button label="Linden-Verkauf" label_selected="Linden-Verkauf..." name="Linden Sale..." tool_tip="Land muss Eigentum und auf Inhalt gesetzt sein und nicht zur Auktion stehen."/>
<button label="Skriptinfo" name="Scripts..."/>
<button label="Für Gruppe kaufen" label_selected="Für Gruppe kaufen..." name="Buy For Group..."/>
<button label="Pass kaufen" label_selected="Pass kaufen..." name="Buy Pass..." tool_tip="Ein Pass gibt Ihnen zeitbegrenzten Zugang zu diesem Land."/>
<button label="Land aufgeben" label_selected="Land aufgeben..." name="Abandon Land..."/>
<button label="Land in Besitz nehmen" label_selected="Land in Besitz nehmen..." name="Reclaim Land..."/>
- <button label="Linden-Verkauf" label_selected="Linden-Verkauf..." name="Linden Sale..." tool_tip="Land muss Eigentum und auf Inhalt gesetzt sein und nicht zur Auktion stehen."/>
</panel>
<panel label="VERTRAG" name="land_covenant_panel">
<panel.string name="can_resell">
@@ -220,43 +214,43 @@ werden.
Objektbonusfaktor in Region: [BONUS]
</text>
<text name="Simulator primitive usage:">
- Prim-Verwendung:
+ Regionskapazität:
</text>
<text name="objects_available">
[COUNT] von [MAX] ([AVAILABLE] verfügbar)
</text>
- <text name="Primitives parcel supports:" width="200">
- Von Parzelle unterstützte Prims:
+ <text name="Primitives parcel supports:">
+ Parzellenlandkapazität:
</text>
- <text left="204" name="object_contrib_text" width="152">
+ <text name="object_contrib_text">
[COUNT]
</text>
<text name="Primitives on parcel:">
- Prims auf Parzelle:
+ Parzellenlandauswirkung:
</text>
- <text left="204" name="total_objects_text" width="48">
+ <text name="total_objects_text">
[COUNT]
</text>
- <text left="14" name="Owned by parcel owner:" width="200">
+ <text name="Owned by parcel owner:" width="200">
Im Eigentum des Parzellenbesitzers:
</text>
- <text left="204" left_delta="200" name="owner_objects_text" width="48">
+ <text left_delta="204" name="owner_objects_text">
[COUNT]
</text>
- <button label="Anzeigen" label_selected="Anzeigen" name="ShowOwner" right="-135" width="60"/>
- <button label="Zurückgeben" label_selected="Zurückgeben..." name="ReturnOwner..." right="-10" tool_tip="Objekte an ihre Eigentümer zurückgeben." width="119"/>
- <text left="14" name="Set to group:">
+ <button label="Anzeigen" label_selected="Anzeigen" name="ShowOwner"/>
+ <button label="Zurückgeben" label_selected="Zurückgeben..." name="ReturnOwner..." tool_tip="Objekte an ihre Eigentümer zurückgeben."/>
+ <text name="Set to group:">
Der Gruppe zugeordnet:
</text>
- <text left="204" name="group_objects_text" width="48">
+ <text name="group_objects_text">
[COUNT]
</text>
- <button label="Anzeigen" label_selected="Anzeigen" name="ShowGroup" right="-135" width="60"/>
- <button label="Zurückgeben" label_selected="Zurückgeben..." name="ReturnGroup..." right="-10" tool_tip="Objekte an ihre Eigentümer zurückgeben." width="119"/>
- <text left="14" name="Owned by others:" width="128">
+ <button label="Anzeigen" label_selected="Anzeigen" name="ShowGroup"/>
+ <button label="Zurückgeben" label_selected="Zurückgeben..." name="ReturnGroup..." tool_tip="Objekte an ihre Eigentümer zurückgeben."/>
+ <text name="Owned by others:">
Im Eigentum anderer:
</text>
- <text left="204" name="other_objects_text" width="48">
+ <text name="other_objects_text">
[COUNT]
</text>
<button label="Anzeigen" label_selected="Anzeigen" name="ShowOther"/>
@@ -315,11 +309,16 @@ Nur große Parzellen können in der Suche aufgeführt werden.
<panel.string name="push_restrict_region_text">
Kein Stoßen (regional)
</panel.string>
+ <panel.string name="see_avs_text">
+ Avatare auf anderen Parzellen können
+ </panel.string>
<text name="allow_label">
Anderen Einwohnern gestatten:
</text>
- <check_box label="Terrain bearbeiten" name="edit land check" tool_tip="Falls aktiviert, kann jeder Ihr Land terraformen. Am besten ist es, wenn Sie diese Option deaktiviert lassen. Sie können Ihr eigenes Land jederzeit bearbeiten."/>
- <check_box label="Fliegen" name="check fly" tool_tip="Falls aktiviert, können Einwohner auf Ihrem Land fliegen. Falls nicht aktiviert, können Einwohner lediglich auf Ihr Land fliegen und dort landen (dann jedoch nicht wieder weiterfliegen) oder über Ihr Land hinweg fliegen."/>
+ <text name="allow_label0">
+ Fliegen:
+ </text>
+ <check_box label="Jeder" name="check fly" tool_tip="Falls aktiviert, können Einwohner auf Ihrem Land fliegen. Falls nicht aktiviert, können Einwohner lediglich auf Ihr Land fliegen und dort landen (dann jedoch nicht wieder weiterfliegen) oder über Ihr Land hinweg fliegen."/>
<text name="allow_label2">
Bauen:
</text>
@@ -335,9 +334,6 @@ Nur große Parzellen können in der Suche aufgeführt werden.
</text>
<check_box label="Jeder" name="check other scripts"/>
<check_box label="Gruppe" name="check group scripts"/>
- <text name="land_options_label">
- Landoptionen:
- </text>
<check_box label="Sicher (kein Schaden)" name="check safe" tool_tip="Falls aktiviert, wird Land auf Option „Sicher“ eingestellt, Kampfschäden sind deaktiviert. Ansonsten sind Kampfschäden aktiviert."/>
<check_box label="Kein Stoßen" name="PushRestrictCheck" tool_tip="Verhindert Stoßen durch Skripte. Durch Aktivieren dieser Option verhindern Sie störendes Verhalten auf Ihrem Land."/>
<check_box label="Ort in Suche anzeigen (30 L$/Woche)" name="ShowDirectoryCheck" tool_tip="Diese Parzelle in Suchergebnissen anzeigen."/>
@@ -354,6 +350,7 @@ Nur große Parzellen können in der Suche aufgeführt werden.
<combo_box.item label="Parks und Natur" name="item9"/>
<combo_box.item label="Wohngebiet" name="item10"/>
<combo_box.item label="Shopping" name="item11"/>
+ <combo_box.item label="Vermietung" name="item13"/>
<combo_box.item label="Sonstige" name="item12"/>
</combo_box>
<combo_box name="land category">
@@ -368,6 +365,7 @@ Nur große Parzellen können in der Suche aufgeführt werden.
<combo_box.item label="Parks und Natur" name="item9"/>
<combo_box.item label="Wohngebiet" name="item10"/>
<combo_box.item label="Shopping" name="item11"/>
+ <combo_box.item label="Vermietung" name="item13"/>
<combo_box.item label="Sonstige" name="item12"/>
</combo_box>
<check_box label="Moderater Inhalt" name="MatureCheck" tool_tip=""/>
@@ -375,6 +373,10 @@ Nur große Parzellen können in der Suche aufgeführt werden.
Foto:
</text>
<texture_picker label="" name="snapshot_ctrl" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
+ <text name="allow_label5">
+ Avatare in anderen Parzellen können Avatare in dieser Parzelle sehen und mit ihnen chatten
+ </text>
+ <check_box label="Avatare sehen" name="SeeAvatarsCheck" tool_tip="Gestattet sowohl Avataren auf anderen Parzellen, Avatare auf dieser Parzelle zu sehen und mit ihnen zu chatten, als auch Ihnen, diese Avatare auf anderen Parzellen zu sehen und mit ihnen zu chatten."/>
<text name="landing_point">
Landepunkt: [LANDING]
</text>
@@ -398,7 +400,6 @@ Nur große Parzellen können in der Suche aufgeführt werden.
Homepage:
</text>
<button label="Festlegen" name="set_media_url"/>
- <check_box label="URL ausblenden" name="hide_media_url" tool_tip="Aktivieren Sie diese Option, wenn Sie nicht möchten, dass unautorisierte Personen die Medien-URL sehen können. Diese Option ist für HTML-Medien nicht verfügbar."/>
<text name="Description:">
Inhalt:
</text>
@@ -428,11 +429,15 @@ Nur große Parzellen können in der Suche aufgeführt werden.
<text name="MusicURL:">
Musik-URL:
</text>
- <check_box label="URL ausblenden" name="hide_music_url" tool_tip="Aktivieren Sie diese Option, wenn Sie nicht möchten, dass unautorisierte Personen die Musik-URL sehen können"/>
<text name="Sound:">
Sound:
</text>
<check_box label="Gesten- und Objektgeräusche auf diese Parzelle beschränken" name="check sound local"/>
+ <text name="Avatar Sounds:">
+ Avatarsounds:
+ </text>
+ <check_box label="Jeder" name="all av sound check"/>
+ <check_box label="Gruppe" name="group av sound check"/>
<text name="Voice settings:">
Voice:
</text>
@@ -445,7 +450,7 @@ Nur große Parzellen können in der Suche aufgeführt werden.
(Durch Grundbesitz festgelegt)
</panel.string>
<panel.string name="allow_public_access">
- Öffentlichen Zugang erlauben ([MATURITY])
+ Öffentlichen Zugang erlauben ([MATURITY]) (Hinweis: Bei Deaktivierung dieser Option werden Bannlinien generiert)
</panel.string>
<panel.string name="estate_override">
Eine oder mehrere dieser Optionen gelten auf Grundbesitzebene
@@ -453,12 +458,12 @@ Nur große Parzellen können in der Suche aufgeführt werden.
<text name="Limit access to this parcel to:">
Zugang zu dieser Parzelle
</text>
- <check_box label="Öffentlichen Zugang erlauben [MATURITY]" name="public_access"/>
+ <check_box label="Öffentlichen Zugang gestatten (bei Deaktivierung dieser Option werden Bannlinien generiert)" name="public_access"/>
<text name="Only Allow" width="400">
- Zugang auf Einwohner beschränken, die überprüft wurden von:
+ Zugang nur Einwohnern gestatten, die:
</text>
- <check_box label="Zahlungsinformation gespeichert [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Einwohner ohne Zahlungsinformation nicht zulassen."/>
- <check_box label="Altersüberprüfung [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Einwohner ohne Altersüberprüfung nicht zulassen. Weitere Informationen finden Sie im [SUPPORT_SITE]."/>
+ <check_box label="Zahlungsinformationen hinterlegt haben [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Um diese Parzelle besuchen zu können, müssen Einwohner Zahlungsinformationen hinterlegt haben. Weitere Informationen finden Sie auf [SUPPORT_SITE]."/>
+ <check_box label="ihr Alter bestätigt haben [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Um diese Parzelle besuchen zu können, müssen Einwohner ihr Alter bestätigt haben. Weitere Informationen finden Sie auf [SUPPORT_SITE]."/>
<check_box label="Gruppenzugang erlauben: [GROUP]" name="GroupCheck" tool_tip="Gruppe im Register „Allgemein“ festlegen."/>
<check_box label="Pässe verkaufen an:" name="PassCheck" tool_tip="Ermöglicht befristeten Zugang zu dieser Parzelle"/>
<combo_box name="pass_combo">
diff --git a/indra/newview/skins/default/xui/de/floater_animation_anim_preview.xml b/indra/newview/skins/default/xui/de/floater_animation_anim_preview.xml
new file mode 100644
index 0000000000..3dc554b120
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_animation_anim_preview.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Anim Preview" title="ANIMATION.ANIM">
+ <text name="name_label">
+ Name:
+ </text>
+ <text name="description_label">
+ Beschreibung:
+ </text>
+ <button label="Hochladen (L$ [AMOUNT])" name="ok_btn"/>
+ <button label="Abbrechen" label_selected="Abbrechen" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_animation_bvh_preview.xml b/indra/newview/skins/default/xui/de/floater_animation_bvh_preview.xml
new file mode 100644
index 0000000000..9a6f5e0166
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_animation_bvh_preview.xml
@@ -0,0 +1,186 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Animation Preview">
+ <floater.string name="failed_to_initialize">
+ Bewegung konnte nicht initialisiert werden
+ </floater.string>
+ <floater.string name="anim_too_long">
+ Animationsdatei ist [LENGTH] Sekunden lang.
+
+Maximal erlaubt sind [MAX_LENGTH] Sekunden.
+ </floater.string>
+ <floater.string name="failed_file_read">
+ Animationsdatei kann nicht gelesen werden.
+
+[STATUS]
+ </floater.string>
+ <floater.string name="E_ST_OK">
+ OK
+ </floater.string>
+ <floater.string name="E_ST_EOF">
+ Vorzeitiges Dateiende.
+ </floater.string>
+ <floater.string name="E_ST_NO_CONSTRAINT">
+ Constraint-Definition kann nicht gelesen werden.
+ </floater.string>
+ <floater.string name="E_ST_NO_FILE">
+ BVH-Datei kann nicht geöffnet werden.
+ </floater.string>
+ <floater.string name="E_ST_NO_HIER">
+ Ungültige HIERARCHY-Kopfzeile.
+ </floater.string>
+ <floater.string name="E_ST_NO_JOINT">
+ ROOT oder JOINT nicht gefunden.
+ </floater.string>
+ <floater.string name="E_ST_NO_NAME">
+ JOINT-Name nicht erfasst.
+ </floater.string>
+ <floater.string name="E_ST_NO_OFFSET">
+ OFFSET nicht gefunden.
+ </floater.string>
+ <floater.string name="E_ST_NO_CHANNELS">
+ CHANNELS nicht gefunden.
+ </floater.string>
+ <floater.string name="E_ST_NO_ROTATION">
+ Rotationsreihenfolge kann nicht erfasst werden.
+ </floater.string>
+ <floater.string name="E_ST_NO_AXIS">
+ Rotationsachse kann nicht erfasst werden.
+ </floater.string>
+ <floater.string name="E_ST_NO_MOTION">
+ MOTION nicht gefunden.
+ </floater.string>
+ <floater.string name="E_ST_NO_FRAMES">
+ Anzahl der Bilder kann nicht erfasst werden.
+ </floater.string>
+ <floater.string name="E_ST_NO_FRAME_TIME">
+ Bildzeit kann nicht erfasst werden.
+ </floater.string>
+ <floater.string name="E_ST_NO_POS">
+ Positionswerte können nicht erfasst werden.
+ </floater.string>
+ <floater.string name="E_ST_NO_ROT">
+ Rotationswerte können nicht erfasst werden.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_FILE">
+ Transformationsdatei kann nicht geöffnet werden.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_HEADER">
+ Transformationskopfzeile kann nicht gelesen werden.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_NAME">
+ Transformationsnamen können nicht gelesen werden.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_IGNORE">
+ Ignorieren-Transformationswert kann nicht gelesen werden.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_RELATIVE">
+ Relativer Transformationswert kann nicht gelesen werden.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_OUTNAME">
+ Outname-Transformationswert kann nicht gelesen werden.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MATRIX">
+ Transformationsmatrix kann nicht gelesen werden.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MERGECHILD">
+ Mergechild-Name kann nicht erfasst werden.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MERGEPARENT">
+ Mergeparent-Name kann nicht erfasst werden.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_PRIORITY">
+ Priority-Wert kann nicht erfasst werden.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_LOOP">
+ Loop-Wert kann nicht erfasst werden.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EASEIN">
+ EaseIn-Werte können nicht erfasst werden.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EASEOUT">
+ EaseOut-Werte können nicht erfasst werden.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_HAND">
+ Hand-Morph-Wert kann nicht erfasst werden.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EMOTE">
+ Emote-Name kann nicht gelesen werden.
+ </floater.string>
+ <floater.string name="E_ST_BAD_ROOT">
+ Falscher Root-Joint-Name, „hip“ verwenden.
+ </floater.string>
+ <text name="name_label">
+ Name:
+ </text>
+ <text name="description_label">
+ Beschreibung:
+ </text>
+ <spinner label="Priorität" name="priority" tool_tip="Steuert, welche Animationen von dieser Animation überschrieben werden können"/>
+ <check_box label="Schleife" name="loop_check" tool_tip="Erzeugt eine Animationsschleife"/>
+ <spinner label="Ein (%)" name="loop_in_point" tool_tip="Anfang einer Animationsschleife festlegen"/>
+ <spinner label="Aus (%)" name="loop_out_point" tool_tip="Ende einer Animationsschleife festlegen"/>
+ <text name="hand_label">
+ Handhaltung
+ </text>
+ <combo_box name="hand_pose_combo" tool_tip="Steuert während der Animation die Bewegung der Hände">
+ <combo_box.item label="Dehnen" name="Spread"/>
+ <combo_box.item label="Entspannt" name="Relaxed"/>
+ <combo_box.item label="Beide zeigen" name="PointBoth"/>
+ <combo_box.item label="Faust" name="Fist"/>
+ <combo_box.item label="Links entspannt" name="RelaxedLeft"/>
+ <combo_box.item label="Nach links zeigen" name="PointLeft"/>
+ <combo_box.item label="Linke Faust" name="FistLeft"/>
+ <combo_box.item label="Rechts entspannt" name="RelaxedRight"/>
+ <combo_box.item label="Nach rechts zeigen" name="PointRight"/>
+ <combo_box.item label="Rechte Faust" name="FistRight"/>
+ <combo_box.item label="Rechts salutieren" name="SaluteRight"/>
+ <combo_box.item label="Tippen" name="Typing"/>
+ <combo_box.item label="Friedensgeste rechts" name="PeaceRight"/>
+ </combo_box>
+ <text name="emote_label">
+ Ausdruck
+ </text>
+ <combo_box name="emote_combo" tool_tip="Steuert Gesichtsregungen während der Animation">
+ <item label="(Keine)" name="[None]" value=""/>
+ <item label="Aaaaah" name="Aaaaah" value="Aaaaah"/>
+ <item label="Ängstlich" name="Afraid" value="Ängstlich"/>
+ <item label="Verärgert" name="Angry" value="Verärgert"/>
+ <item label="Grinst" name="BigSmile" value="Grinst"/>
+ <item label="Gelangweilt" name="Bored" value="Gelangweilt"/>
+ <item label="Weinen" name="Cry" value="Weinen"/>
+ <item label="Verachtung" name="Disdain" value="Verachtung"/>
+ <item label="Verlegen" name="Embarrassed" value="Verlegen"/>
+ <item label="Stirnrunzeln" name="Frown" value="Stirnrunzeln"/>
+ <item label="Küssen" name="Kiss" value="Küssen"/>
+ <item label="Lachen" name="Laugh" value="Lachen"/>
+ <item label="Bäääh" name="Plllppt" value="Bäääh"/>
+ <item label="Angewidert" name="Repulsed" value="Angewidert"/>
+ <item label="Traurig" name="Sad" value="Traurig"/>
+ <item label="Achselzucken" name="Shrug" value="Achselzucken"/>
+ <item label="Lächeln" name="Smile" value="Lächeln"/>
+ <item label="Ãœberraschung" name="Surprise" value="Ãœberraschung"/>
+ <item label="Zwinkern" name="Wink" value="Zwinkern"/>
+ <item label="Sorgenvoll" name="Worry" value="Sorgenvoll"/>
+ </combo_box>
+ <text name="preview_label">
+ Vorschau während:
+ </text>
+ <combo_box name="preview_base_anim" tool_tip="Hiermit können Sie das Verhalten Ihres Avatars testen, während Ihr Avatar normale Bewegungen ausführt.">
+ <item label="Stehen" name="Standing" value="Stehen"/>
+ <item label="Gehen" name="Walking" value="Gehen"/>
+ <item label="Sitzen" name="Sitting" value="Sitzen"/>
+ <item label="Fliegen" name="Flying" value="Fliegen"/>
+ </combo_box>
+ <spinner label="Einblenden (s)" name="ease_in_time" tool_tip="Einblendungszeit für Animationen (in Sekunden)"/>
+ <spinner label="Ausblenden (s)" name="ease_out_time" tool_tip="Ausblendungszeit für Animationen (in Sekunden)"/>
+ <button name="play_btn" tool_tip="Animation abspielen"/>
+ <button name="pause_btn" tool_tip="Animation unterbrechen"/>
+ <button name="stop_btn" tool_tip="Animation anhalten"/>
+ <text name="bad_animation_text">
+ Animationsdatei kann nicht gelesen werden.
+
+Wir empfehlen exportierte BVH-Dateien aus Poser 4.
+ </text>
+ <button label="Hochladen (L$ [AMOUNT])" name="ok_btn"/>
+ <button label="Abbrechen" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_avatar.xml b/indra/newview/skins/default/xui/de/floater_avatar.xml
new file mode 100644
index 0000000000..ba0dd54d96
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_avatar.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Avatar" title="AVATAR AUSWÄHLEN"/>
diff --git a/indra/newview/skins/default/xui/de/floater_beacons.xml b/indra/newview/skins/default/xui/de/floater_beacons.xml
index 6e83e0419b..1a052bd814 100644
--- a/indra/newview/skins/default/xui/de/floater_beacons.xml
+++ b/indra/newview/skins/default/xui/de/floater_beacons.xml
@@ -17,5 +17,6 @@
<check_box label="Nur berühren" name="touch_only"/>
<check_box label="Soundquellen" name="sounds"/>
<check_box label="Partikelquellen" name="particles"/>
+ <check_box label="Medienquellen" name="moapbeacon"/>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_build_options.xml b/indra/newview/skins/default/xui/de/floater_build_options.xml
index e90eb2c00b..939fd5dee4 100644
--- a/indra/newview/skins/default/xui/de/floater_build_options.xml
+++ b/indra/newview/skins/default/xui/de/floater_build_options.xml
@@ -1,7 +1,30 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="build options floater" title="RASTER-OPTIONEN">
- <spinner label="Raster-Einheiten (Meter)" name="GridResolution"/>
- <spinner label="Rastergröße (Meter)" name="GridDrawSize"/>
+ <floater.string name="grid_screen_text">
+ Bildschirm
+ </floater.string>
+ <floater.string name="grid_local_text">
+ Lokal
+ </floater.string>
+ <floater.string name="grid_world_text">
+ Welt
+ </floater.string>
+ <floater.string name="grid_reference_text">
+ Referenz
+ </floater.string>
+ <floater.string name="grid_attachment_text">
+ Anhang
+ </floater.string>
+ <text name="grid_mode_label" tool_tip="Rasteropazität">
+ Modus
+ </text>
+ <combo_box name="combobox grid mode" tool_tip="Wählen Sie das gewünschte Rasterlineal zum Positionieren des Objekts aus.">
+ <combo_box.item label="Globales Raster" name="World"/>
+ <combo_box.item label="Lokales Raster" name="Local"/>
+ <combo_box.item label="Referenzraster" name="Reference"/>
+ </combo_box>
+ <spinner label="Einheiten (m)" name="GridResolution"/>
+ <spinner label="Rastergröße (meter)" name="GridDrawSize"/>
<check_box label="An Untereinheiten ausrichten" name="GridSubUnit"/>
<check_box label="Ãœberschneidungen anzeigen" name="GridCrossSection"/>
<text name="grid_opacity_label" tool_tip="Raster-Deckkraft">
diff --git a/indra/newview/skins/default/xui/de/floater_buy_contents.xml b/indra/newview/skins/default/xui/de/floater_buy_contents.xml
index ccafa11cf4..bd6ace6bda 100644
--- a/indra/newview/skins/default/xui/de/floater_buy_contents.xml
+++ b/indra/newview/skins/default/xui/de/floater_buy_contents.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater min_width="300" name="floater_buy_contents" title="INHALT KAUFEN">
<text name="contains_text">
- [NAME] enthält:
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; enthält:
</text>
<text name="buy_text">
[AMOUNT] L$ von [NAME] kaufen?
diff --git a/indra/newview/skins/default/xui/de/floater_buy_currency.xml b/indra/newview/skins/default/xui/de/floater_buy_currency.xml
index 38321b7906..65926c088c 100644
--- a/indra/newview/skins/default/xui/de/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/de/floater_buy_currency.xml
@@ -46,7 +46,7 @@
[AMT] L$
</text>
<text name="currency_links">
- [http://www.secondlife.com/my/account/payment_method_management.php?lang=de-DE Zahlungsart] | [http://www.secondlife.com/my/account/currency.php?lang=de-DE Währung] | [http://www.secondlife.com/my/account/exchange_rates.php?lang=de-DE Umtauschrate]
+ [http://www.secondlife.com/my/account/payment_method_management.php Zahlungsart] | [http://www.secondlife.com/my/account/currency.php Währung]
</text>
<text name="exchange_rate_note">
Geben Sie den Betrag erneut ein, um die aktuellste Umtauschrate anzuzeigen.
diff --git a/indra/newview/skins/default/xui/de/floater_buy_land.xml b/indra/newview/skins/default/xui/de/floater_buy_land.xml
index 5369155cf9..ca4ee8981b 100644
--- a/indra/newview/skins/default/xui/de/floater_buy_land.xml
+++ b/indra/newview/skins/default/xui/de/floater_buy_land.xml
@@ -127,41 +127,41 @@ unterstützt [AMOUNT2] Objekte
<text name="region_name_label">
Region:
</text>
- <text left="680" left_delta="140" name="region_name_text">
+ <text name="region_name_text">
(unbekannt)
</text>
<text name="region_type_label">
Typ:
</text>
- <text left="680" left_delta="140" name="region_type_text">
+ <text name="region_type_text">
(unbekannt)
</text>
<text name="estate_name_label">
Grundbesitz:
</text>
- <text left="680" left_delta="140" name="estate_name_text">
+ <text name="estate_name_text">
(unbekannt)
</text>
- <text name="estate_owner_label" right="600" width="200">
+ <text name="estate_owner_label">
Grundbesitzer:
</text>
- <text left="680" left_delta="140" name="estate_owner_text">
+ <text name="estate_owner_text">
(unbekannt)
</text>
- <text left="410" name="resellable_changeable_label">
+ <text name="resellable_changeable_label">
Gekauftes Land in dieser Region:
</text>
- <text left="410" name="resellable_clause">
+ <text name="resellable_clause">
Wiederverkauf möglich oder nicht möglich.
</text>
- <text left="410" name="changeable_clause">
+ <text name="changeable_clause">
Darft oder darf nicht zusammengelegt/unterteilt werden.
</text>
- <text left="410" name="covenant_text">
+ <text name="covenant_text">
Sie müssen dem Grundbesitzvertrag zustimmen:
</text>
- <text left="470" name="covenant_timestamp_text"/>
- <text_editor left="470" name="covenant_editor">
+ <text name="covenant_timestamp_text"/>
+ <text_editor name="covenant_editor">
Wird geladen...
</text_editor>
<check_box label="Ich stimme dem obigen Vertrag zu." name="agree_covenant"/>
@@ -191,7 +191,7 @@ Objekte im Verkauf eingeschlossen
<text name="error_message">
Irgendetwas stimmt nicht.
</text>
- <button label="Gehe zu Website" name="error_web" top_delta="136"/>
+ <button label="Gehe zu Website" name="error_web" />
<text name="account_action">
Macht Sie zum Premium-Mitglied.
</text>
@@ -203,9 +203,8 @@ Objekte im Verkauf eingeschlossen
<combo_box.item label="7,50 US$/Monat, vierteljährliche Abrechnung" name="US$7.50/month,billedquarterly"/>
<combo_box.item label="6,00 US$/Monat, jährliche Abrechnung" name="US$6.00/month,billedannually"/>
</combo_box>
- <text height="36" name="land_use_action" top="270">
- Erhöhen Sie Ihre monatlichen Landnutzungsgebühren
-auf 40 US$/month.
+ <text name="land_use_action">
+ Erhöhen Sie Ihre monatlichen Landnutzungsgebühren auf 40 US$/month.
</text>
<text name="land_use_reason">
Sie besitzen 1309 m² Land.
diff --git a/indra/newview/skins/default/xui/de/floater_camera.xml b/indra/newview/skins/default/xui/de/floater_camera.xml
index d49c207f98..163ef87d8c 100644
--- a/indra/newview/skins/default/xui/de/floater_camera.xml
+++ b/indra/newview/skins/default/xui/de/floater_camera.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="camera_floater">
+<floater name="camera_floater" title="KAMERASTEUERUNGEN">
<floater.string name="rotate_tooltip">
Kamera um Fokus drehen
</floater.string>
@@ -9,15 +9,6 @@
<floater.string name="move_tooltip">
Kamera nach oben, unten, links und rechts bewegen
</floater.string>
- <floater.string name="camera_modes_title">
- Kameramodi
- </floater.string>
- <floater.string name="pan_mode_title">
- Kreisen - Zoomen - Schwenken
- </floater.string>
- <floater.string name="presets_mode_title">
- Ansichten
- </floater.string>
<floater.string name="free_mode_title">
Objekt ansehen
</floater.string>
diff --git a/indra/newview/skins/default/xui/de/floater_chat_bar.xml b/indra/newview/skins/default/xui/de/floater_chat_bar.xml
new file mode 100644
index 0000000000..2464a55665
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_chat_bar.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="chat_bar" title="CHAT IN DER NÄHE">
+ <panel name="bottom_panel">
+ <line_editor label="Zum Chatten hier klicken." name="chat_box" tool_tip="Eingabetaste zum Sprechen, Strg+Eingabe zum Rufen"/>
+ <button name="show_nearby_chat" tool_tip="Chatprotokoll in der Nähe ein-/ausblenden"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_customize.xml b/indra/newview/skins/default/xui/de/floater_customize.xml
deleted file mode 100644
index 3651577797..0000000000
--- a/indra/newview/skins/default/xui/de/floater_customize.xml
+++ /dev/null
@@ -1,529 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater customize" title="AUSSEHEN">
- <tab_container name="customize tab container">
- <text label="Körperteile" name="body_parts_placeholder">
- Körperteile
- </text>
- <panel label="Form" name="Shape">
- <button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>
- <button label="Körper" label_selected="Körper" name="Body"/>
- <button label="Kopf" label_selected="Kopf" name="Head"/>
- <button label="Augen" label_selected="Augen" name="Eyes"/>
- <button label="Ohren" label_selected="Ohren" name="Ears"/>
- <button label="Nase" label_selected="Nase" name="Nose"/>
- <button label="Mund" label_selected="Mund" name="Mouth"/>
- <button label="Kinn" label_selected="Kinn" name="Chin"/>
- <button label="Oberkörper" label_selected="Oberkörper" name="Torso"/>
- <button label="Beine" label_selected="Beine" name="Legs"/>
- <radio_group name="sex radio">
- <radio_item label="Weiblich" name="radio" value="0"/>
- <radio_item label="Männlich" name="radio2" value="1"/>
- </radio_group>
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: bearbeiten nicht möglich
- </text>
- <text name="title_loading">
- [DESC]: wird geladen...
- </text>
- <text name="title_not_worn">
- [DESC]: nicht getragen
- </text>
- <text name="path">
- In [PATH]
- </text>
- <text name="not worn instructions">
- Ziehen Sie eine neue Form aus dem Inventar auf Ihren Avatar, um diese anzulegen. Sie können aber auch eine neue erstellen und diese anlegen.
- </text>
- <text name="no modify instructions">
- Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
- </text>
- <text name="Item Action Label">
- Form:
- </text>
- <button label="Neue Form/Gestalt" label_selected="Neue Form/Gestalt" name="Create New"/>
- <button font="SansSerifSmall" label="Speichern" label_selected="Speichern" name="Save"/>
- <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/>
- </panel>
- <panel label="Haut" name="Skin">
- <button label="Hautfarbe" label_selected="Hautfarbe" left="2" name="Skin Color" width="92"/>
- <button label="Gesichtsdetails" label_selected="Gesichtsdetails" left="2" name="Face Detail" width="92"/>
- <button label="Make-Up" label_selected="Make-Up" left="2" name="Makeup" width="92"/>
- <button label="Körperdetails" label_selected="Körperdetails" left="2" name="Body Detail" width="92"/>
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: bearbeiten nicht möglich
- </text>
- <text name="title_loading">
- [DESC]: wird geladen...
- </text>
- <text name="title_not_worn">
- [DESC]: nicht getragen
- </text>
- <text name="path">
- In [PATH]
- </text>
- <text name="not worn instructions">
- Ziehen Sie eine neue Skin (Haut) aus dem Inventar auf Ihren Avatar, um diese anzulegen. Sie können aber auch eine neue erstellen und diese anlegen.
- </text>
- <text name="no modify instructions">
- Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
- </text>
- <text name="Item Action Label" right="100">
- Haut:
- </text>
- <texture_picker label="Kopftattoo" name="Head Tattoos" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
- <texture_picker label="Obere Tattoos" name="Upper Tattoos" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
- <texture_picker label="Untere Tattoos" name="Lower Tattoos" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
- <button label="Neue Haut" label_selected="Neue Haut" name="Create New"/>
- <button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/>
- <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/>
- <button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>
- </panel>
- <panel label="Haar" name="Hair">
- <button label="Farbe" label_selected="Farbe" name="Color"/>
- <button label="Stil" label_selected="Stil" name="Style"/>
- <button label="Augenbrauen" label_selected="Augenbrauen" name="Eyebrows"/>
- <button label="Gesichtshaar" label_selected="Gesichtshaar" name="Facial"/>
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: bearbeiten nicht möglich
- </text>
- <text name="title_loading">
- [DESC]: wird geladen...
- </text>
- <text name="title_not_worn">
- [DESC]: nicht getragen
- </text>
- <text name="path">
- In [PATH]
- </text>
- <text name="not worn instructions">
- Ziehen Sie Haar aus dem Inventar auf Ihren Avatar, um dieses anzulegen. Sie können aber auch neues Haar erstellen und anlegen.
- </text>
- <text name="no modify instructions">
- Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
- </text>
- <text name="Item Action Label" right="100">
- Haare:
- </text>
- <texture_picker label="Textur" name="Texture" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
- <button label="Neue Haare" label_selected="Neue Haare" name="Create New"/>
- <button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/>
- <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/>
- <button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>
- </panel>
- <panel label="Augen" name="Eyes">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: bearbeiten nicht möglich
- </text>
- <text name="title_loading">
- [DESC]: wird geladen...
- </text>
- <text name="title_not_worn">
- [DESC]: nicht getragen
- </text>
- <text name="path">
- In [PATH]
- </text>
- <text name="not worn instructions">
- Ziehen Sie neue Augen aus dem Inventar auf Ihren Avatar, um diese anzulegen. Sie können aber auch neue Augen erstellen und diese anlegen.
- </text>
- <text name="no modify instructions">
- Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
- </text>
- <text name="Item Action Label" right="100">
- Augen:
- </text>
- <texture_picker label="Iris" name="Iris" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
- <button label="Neue Augen" label_selected="Neue Augen" name="Create New"/>
- <button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/>
- <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/>
- <button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>
- </panel>
- <text label="Kleidung" name="clothes_placeholder">
- Kleidung
- </text>
- <panel label="Hemd" name="Shirt">
- <texture_picker label="Stoff" name="Fabric" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
- <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
- <button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/>
- <button label="Neues Hemd" label_selected="Neues Hemd" name="Create New"/>
- <button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/>
- <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/>
- <button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: bearbeiten nicht möglich
- </text>
- <text name="title_loading">
- [DESC]: wird geladen...
- </text>
- <text name="title_not_worn">
- [DESC]: nicht getragen
- </text>
- <text name="path">
- In [PATH]
- </text>
- <text name="not worn instructions">
- Ziehen Sie ein neues Hemd aus dem Inventar auf Ihren Avatar, um dieses anzuziehen. Sie können aber auch ein neues Hemd erstellen und dieses anlegen.
- </text>
- <text name="no modify instructions">
- Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
- </text>
- <text name="Item Action Label" right="100">
- Hemd:
- </text>
- </panel>
- <panel label="Hose" name="Pants">
- <texture_picker label="Stoff" name="Fabric" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
- <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
- <button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/>
- <button label="Neue Hose" label_selected="Neue Hose" name="Create New"/>
- <button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/>
- <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/>
- <button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: bearbeiten nicht möglich
- </text>
- <text name="title_loading">
- [DESC]: wird geladen...
- </text>
- <text name="title_not_worn">
- [DESC]: nicht getragen
- </text>
- <text name="path">
- In [PATH]
- </text>
- <text name="not worn instructions">
- Ziehen Sie eine neue Hose aus dem Inventar auf Ihren Avatar, um diese anzuziehen. Sie können aber auch eine neue erstellen und diese anziehen.
- </text>
- <text name="no modify instructions">
- Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
- </text>
- <text name="Item Action Label" right="100">
- Hose:
- </text>
- </panel>
- <panel label="Schuhe" name="Shoes">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: bearbeiten nicht möglich
- </text>
- <text name="title_loading">
- [DESC]: wird geladen...
- </text>
- <text name="title_not_worn">
- [DESC]: nicht getragen
- </text>
- <text name="path">
- In [PATH]
- </text>
- <text name="not worn instructions">
- Ziehen Sie neue Schuhe aus dem Inventar auf Ihren Avatar, um diese anzuziehen. Sie können aber auch neue Schuhe erstellen und diese anlegen.
- </text>
- <button label="Neue Schuhe" label_selected="Neue Schuhe" name="Create New"/>
- <text name="no modify instructions">
- Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
- </text>
- <text name="Item Action Label" right="100">
- Schuhe:
- </text>
- <texture_picker label="Stoff" name="Fabric" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
- <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
- <button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/>
- <button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/>
- <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/>
- <button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>
- </panel>
- <panel label="Socken" name="Socks">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: bearbeiten nicht möglich
- </text>
- <text name="title_loading">
- [DESC]: wird geladen...
- </text>
- <text name="title_not_worn">
- [DESC]: nicht getragen
- </text>
- <text name="path">
- In [PATH]
- </text>
- <text name="not worn instructions">
- Ziehen Sie neue Socken aus dem Inventar auf Ihren Avatar, um diese anzuziehen. Sie können aber auch neue erstellen und diese anziehen.
- </text>
- <button label="Neue Socken" label_selected="Neue Socken" name="Create New"/>
- <text name="no modify instructions">
- Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
- </text>
- <text name="Item Action Label" right="100">
- Socken:
- </text>
- <texture_picker label="Stoff" name="Fabric" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
- <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
- <button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/>
- <button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/>
- <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/>
- <button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>
- </panel>
- <panel label="Jacke" name="Jacket">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: bearbeiten nicht möglich
- </text>
- <text name="title_loading">
- [DESC]: wird geladen...
- </text>
- <text name="title_not_worn">
- [DESC]: nicht getragen
- </text>
- <text name="path">
- In [PATH]
- </text>
- <text name="not worn instructions">
- Ziehen Sie eine neue Jacke aus dem Inventar auf Ihren Avatar, um diese anzuziehen. Sie können aber auch eine neue erstellen und diese anziehen.
- </text>
- <button label="Neue Jacke" label_selected="Neue Jacke" name="Create New"/>
- <text name="no modify instructions">
- Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
- </text>
- <text name="Item Action Label" right="100">
- Jacke:
- </text>
- <texture_picker label="Stoff: oben" name="Upper Fabric" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
- <texture_picker label="Stoff: unten" name="Lower Fabric" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
- <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
- <button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/>
- <button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/>
- <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/>
- <button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>
- </panel>
- <panel label="Handschuhe" name="Gloves">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: bearbeiten nicht möglich
- </text>
- <text name="title_loading">
- [DESC]: wird geladen...
- </text>
- <text name="title_not_worn">
- [DESC]: nicht getragen
- </text>
- <text name="path">
- In [PATH]
- </text>
- <text name="not worn instructions">
- Ziehen Sie neue Handschuhe aus dem Inventar auf Ihren Avatar, um diese anzuziehen. Sie können aber auch neue erstellen und diese anziehen.
- </text>
- <button label="Neue Handschuhe" label_selected="Neue Handschuhe" name="Create New"/>
- <text name="no modify instructions">
- Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
- </text>
- <text name="Item Action Label" right="100">
- Handschuhe:
- </text>
- <texture_picker label="Stoff" name="Fabric" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
- <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
- <button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/>
- <button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/>
- <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/>
- <button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>
- </panel>
- <panel label="Unterhemd" name="Undershirt">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: bearbeiten nicht möglich
- </text>
- <text name="title_loading">
- [DESC]: wird geladen...
- </text>
- <text name="title_not_worn">
- [DESC]: nicht getragen
- </text>
- <text name="path">
- In [PATH]
- </text>
- <text name="not worn instructions">
- Ziehen Sie ein neues Unterhemd aus dem Inventar auf Ihren Avatar, um dieses anzuziehen. Sie können aber auch ein neues Unterhemd erstellen und dieses anziehen.
- </text>
- <button label="Neues Unterhemd" label_selected="Neues Unterhemd" name="Create New"/>
- <text name="no modify instructions">
- Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
- </text>
- <text name="Item Action Label" right="100">
- Unterhemd:
- </text>
- <texture_picker label="Stoff" name="Fabric" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
- <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
- <button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/>
- <button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/>
- <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/>
- <button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>
- </panel>
- <panel label="Unterhose" name="Underpants">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: bearbeiten nicht möglich
- </text>
- <text name="title_loading">
- [DESC]: wird geladen...
- </text>
- <text name="title_not_worn">
- [DESC]: nicht getragen
- </text>
- <text name="path">
- In [PATH]
- </text>
- <text name="not worn instructions">
- Ziehen Sie eine neue Unterhose aus dem Inventar auf Ihren Avatar, um diese anzuziehen. Sie können aber auch eine neue erstellen und diese anziehen.
- </text>
- <button label="Neue Unterhose" label_selected="Neue Unterhose" name="Create New"/>
- <text name="no modify instructions">
- Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
- </text>
- <text name="Item Action Label" right="100">
- Unterhose:
- </text>
- <texture_picker label="Stoff" name="Fabric" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
- <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
- <button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/>
- <button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/>
- <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/>
- <button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>
- </panel>
- <panel label="Rock" name="Skirt">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: bearbeiten nicht möglich
- </text>
- <text name="title_loading">
- [DESC]: wird geladen...
- </text>
- <text name="title_not_worn">
- [DESC]: nicht getragen
- </text>
- <text name="path">
- In [PATH]
- </text>
- <text name="not worn instructions">
- Ziehen Sie einen neuen Rock aus dem Inventar auf Ihren Avatar, um diesen anzuziehen. Sie können aber auch einen neuen Rock erstellen und diesen anziehen.
- </text>
- <button label="Neuer Rock" label_selected="Neuer Rock" name="Create New"/>
- <text name="no modify instructions">
- Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
- </text>
- <text name="Item Action Label" right="100">
- Rock:
- </text>
- <texture_picker label="Stoff" name="Fabric" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
- <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
- <button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/>
- <button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/>
- <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/>
- <button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>
- </panel>
- <panel label="Tätowierung" name="Tattoo">
- <text name="title">
- Tätowierung
- </text>
- <text name="title_no_modify">
- [BESCHR]: bearbeiten nicht möglich
- </text>
- <text name="title_loading">
- [BESCHR]: wird geladen...
- </text>
- <text name="title_not_worn">
- [BESCHR]: nicht getragen
- </text>
- <text name="path">
- Befindet sich in [PATH]
- </text>
- <text name="not worn instructions">
- Ziehen Sie eine neue Tätowierung aus dem Inventar auf Ihren Avatar, um diese anzulegen. Sie können aber auch eine neue erstellen und diese anlegen.
- </text>
- <button label="Neue Tätowierung erstellen" label_selected="Neue Tätowierung erstellen" name="Create New"/>
- <text name="no modify instructions">
- Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
- </text>
- <text name="Item Action Label">
- Tätowierung:
- </text>
- <texture_picker label="Kopftattoo" name="Head Tattoo" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
- <texture_picker label="Obere Tattoos" name="Upper Tattoo" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
- <texture_picker label="Untere Tattoos" name="Lower Tattoo" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
- <button label="Ausziehen" label_selected="Ausziehen" name="Take Off"/>
- <button label="Speichern" label_selected="Speichern" name="Save"/>
- <button label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/>
- <button label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>
- </panel>
- <panel label="Alpha" name="Alpha">
- <text name="title">
- Alpha
- </text>
- <text name="title_no_modify">
- [BESCHR]: bearbeiten nicht möglich
- </text>
- <text name="title_loading">
- [BESCHR]: wird geladen...
- </text>
- <text name="title_not_worn">
- [BESCHR]: nicht getragen
- </text>
- <text name="path">
- Befindet sich in [PATH]
- </text>
- <text name="not worn instructions">
- Sie können eine neue Alpha-Maske anlegen, indem Sie eine von Ihrem Inventar auf Ihren Avatar ziehen. Sie können aber auch eine neue erstellen und diese anlegen.
- </text>
- <button label="Neue Alpha erstellen" label_selected="Neue Alpha erstellen" name="Create New"/>
- <text name="no modify instructions">
- Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
- </text>
- <text name="Item Action Label">
- Alpha:
- </text>
- <texture_picker label="Alpha: Unten" name="Lower Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
- <texture_picker label="Alpha: Oben" name="Upper Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
- <texture_picker label="Kopf: Alpha" name="Head Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
- <texture_picker label="Alpha: Augen" name="Eye Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
- <texture_picker label="Alpha: Haare" name="Hair Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
- <button label="Ausziehen" label_selected="Ausziehen" name="Take Off"/>
- <button label="Speichern" label_selected="Speichern" name="Save"/>
- <button label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/>
- <button label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>
- </panel>
- </tab_container>
- <button label="Skriptinfo" label_selected="Skriptinfo" name="script_info" tool_tip="Skripts, die an Ihren Avatar angehängt sind, anzeigen"/>
- <button label="Outfit erstellen" label_selected="Outfit erstellen" name="make_outfit_btn"/>
- <button label="Abbrechen" label_selected="Abbrechen" name="Cancel"/>
- <button label="OK" label_selected="OK" name="Ok"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/de/floater_day_cycle_options.xml
deleted file mode 100644
index 8599737106..0000000000
--- a/indra/newview/skins/default/xui/de/floater_day_cycle_options.xml
+++ /dev/null
@@ -1,94 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Day Cycle Floater" title="TAGESZYKLUS-EDITOR">
- <tab_container name="Day Cycle Tabs">
- <panel label="Tageszyklus" name="Day Cycle">
- <button label=" ?" name="WLDayCycleHelp"/>
- <text name="WL12am">
- 24:00
- </text>
- <text name="WL3am">
- 03:00
- </text>
- <text name="WL6am">
- 06:00
- </text>
- <text name="WL9amHash">
- 09:00
- </text>
- <text name="WL12pmHash">
- 12:00
- </text>
- <text name="WL3pm">
- 15:00
- </text>
- <text name="WL6pm">
- 18:00
- </text>
- <text name="WL9pm">
- 21:00
- </text>
- <text name="WL12am2">
- 24:00
- </text>
- <text name="WL12amHash">
- |
- </text>
- <text name="WL3amHash">
- I
- </text>
- <text name="WL6amHash">
- |
- </text>
- <text name="WL9amHash2">
- I
- </text>
- <text name="WL12pmHash2">
- |
- </text>
- <text name="WL3pmHash">
- I
- </text>
- <text name="WL6pmHash">
- |
- </text>
- <text name="WL9pmHash">
- I
- </text>
- <text name="WL12amHash2">
- |
- </text>
- <button label="Key hinzu" label_selected="Key hinzu" name="WLAddKey"/>
- <button label="Key löschen" label_selected="Key löschen" name="WLDeleteKey"/>
- <text name="WLCurKeyFrameText">
- Keyframe-Einstellungen:
- </text>
- <text name="WLCurKeyTimeText">
- Key-Zeit:
- </text>
- <spinner label="Std." name="WLCurKeyHour"/>
- <spinner label="Min." name="WLCurKeyMin"/>
- <text name="WLCurKeyTimeText2">
- Key-Voreinstellung:
- </text>
- <combo_box label="Voreinstellung" name="WLKeyPresets"/>
- <text name="DayCycleText">
- Einrasten:
- </text>
- <combo_box label="5 min" name="WLSnapOptions"/>
- <text name="DayCycleText2">
- Zykluslänge:
- </text>
- <spinner label="Std." name="WLLengthOfDayHour"/>
- <spinner label="Min." name="WLLengthOfDayMin"/>
- <spinner label="Sek." name="WLLengthOfDaySec"/>
- <text name="DayCycleText3">
- Vorschau:
- </text>
- <button label="Start" label_selected="Start" name="WLAnimSky"/>
- <button label="Stopp" label_selected="Stopp" name="WLStopAnimSky"/>
- <button label="Grundbesitzzeit verw" label_selected="Zur Grundbesitzzeit" name="WLUseLindenTime"/>
- <button label="Testtag speichern" label_selected="Testtag speichern" name="WLSaveDayCycle"/>
- <button label="Testtag laden" label_selected="Testtag laden" name="WLLoadDayCycle"/>
- </panel>
- </tab_container>
-</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_delete_env_preset.xml b/indra/newview/skins/default/xui/de/floater_delete_env_preset.xml
new file mode 100644
index 0000000000..cc14ce640d
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_delete_env_preset.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<floater name="Delete Env Preset" title="UMGEB.VOREINST. LÖSCHEN">
+ <string name="title_water">
+ Wasser-Voreinstellung löschen
+ </string>
+ <string name="title_sky">
+ Himmel-Voreinstellung löschen
+ </string>
+ <string name="title_day_cycle">
+ Tageszyklus löschen
+ </string>
+ <string name="label_water">
+ Voreinstellung:
+ </string>
+ <string name="label_sky">
+ Voreinstellung:
+ </string>
+ <string name="label_day_cycle">
+ Tageszyklus:
+ </string>
+ <string name="msg_confirm_deletion">
+ Möchten Sie die ausgewählte Voreinstellung wirklich löschen?
+ </string>
+ <string name="msg_sky_is_referenced">
+ Eine Voreinstellung, auf die sich ein Tageszyklus bezieht, kann nicht gelöscht werden.
+ </string>
+ <string name="combo_label">
+ -Voreinstellung auswählen-
+ </string>
+ <text name="label">
+ Voreinstellung:
+ </text>
+ <button label="Löschen" name="delete"/>
+ <button label="Abbrechen" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_destinations.xml b/indra/newview/skins/default/xui/de/floater_destinations.xml
new file mode 100644
index 0000000000..57881488fd
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_destinations.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Destinations" title="ZIELE"/>
diff --git a/indra/newview/skins/default/xui/de/floater_edit_day_cycle.xml b/indra/newview/skins/default/xui/de/floater_edit_day_cycle.xml
new file mode 100644
index 0000000000..8b29428c24
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_edit_day_cycle.xml
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Edit Day cycle" title="Tageszyklus bearbeiten">
+ <string name="title_new">
+ Neuen Tageszyklus erstellen
+ </string>
+ <string name="title_edit">
+ Tageszyklus bearbeiten
+ </string>
+ <string name="hint_new">
+ Geben Sie einen Namen für den Tageszyklus ein, passen Sie die Steuerungen an, um den Tageszyklus zu erstellen, und klicken Sie auf „Speichern“.
+ </string>
+ <string name="hint_edit">
+ Um den Tageszyklus zu bearbeiten, passen Sie die Steuerungen unten an und klicken Sie auf „Speichern“.
+ </string>
+ <string name="combo_label">
+ -Voreinstellung auswählen-
+ </string>
+ <text name="label">
+ Name der Voreinstellung:
+ </text>
+ <text name="note">
+ Hinweis: Wenn Sie den Namen Ihrer Voreinstellung ändern, entsteht eine neue Voreinstellung; die vorhandene Voreinstellung wird nicht geändert.
+ </text>
+ <text name="hint_item1">
+ - Klicken Sie auf eine Registerkarte, um die Himmeleinstellungen und die Uhrzeit zu bearbeiten.
+ </text>
+ <text name="hint_item2">
+ - Klicken und ziehen Sie die Registerkarten, um die Ãœbergangszeiten einzustellen.
+ </text>
+ <text name="hint_item3">
+ - Anhand des Scrubbers können Sie eine Vorschau Ihres Tageszyklus anzeigen.
+ </text>
+ <panel name="day_cycle_slider_panel">
+ <multi_slider initial_value="0" name="WLTimeSlider"/>
+ <multi_slider initial_value="0" name="WLDayCycleKeys"/>
+ <button label="Schlüssel hinzufügen" label_selected="Schlüssel hinzufügen" name="WLAddKey"/>
+ <button label="Schlüssel löschen" label_selected="Schlüssel löschen" name="WLDeleteKey"/>
+ <text name="WL12am">
+ 0:00
+ </text>
+ <text name="WL3am">
+ 3:00
+ </text>
+ <text name="WL6am">
+ 6:00
+ </text>
+ <text name="WL9amHash">
+ 9:00
+ </text>
+ <text name="WL12pmHash">
+ 12:00
+ </text>
+ <text name="WL3pm">
+ 15:00
+ </text>
+ <text name="WL6pm">
+ 18:00
+ </text>
+ <text name="WL9pm">
+ 21:00
+ </text>
+ <text name="WL12am2">
+ 0:00
+ </text>
+ <text name="WL12amHash">
+ |
+ </text>
+ <text name="WL3amHash">
+ I
+ </text>
+ <text name="WL6amHash">
+ |
+ </text>
+ <text name="WL9amHash2">
+ I
+ </text>
+ <text name="WL12pmHash2">
+ |
+ </text>
+ <text name="WL3pmHash">
+ I
+ </text>
+ <text name="WL6pmHash">
+ |
+ </text>
+ <text name="WL9pmHash">
+ I
+ </text>
+ <text name="WL12amHash2">
+ |
+ </text>
+ </panel>
+ <text name="WLCurKeyPresetText">
+ Himmeleinstellung:
+ </text>
+ <combo_box label="Voreinstellung" name="WLSkyPresets"/>
+ <text name="WLCurKeyTimeText">
+ Uhrzeit:
+ </text>
+ <time name="time" value="6:00"/>
+ <check_box label="Zu meinem neuen Tageszyklus machen" name="make_default_cb"/>
+ <button label="Speichern" name="save"/>
+ <button label="Abbrechen" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_edit_sky_preset.xml b/indra/newview/skins/default/xui/de/floater_edit_sky_preset.xml
new file mode 100644
index 0000000000..ea4c5f7ebc
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_edit_sky_preset.xml
@@ -0,0 +1,143 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Edit Sky Preset" title="Himmel-Voreinstellung bearbeiten">
+ <string name="title_new">
+ Neue Himmel-Voreinstellung erstellen
+ </string>
+ <string name="title_edit">
+ Himmel-Voreinstellung bearbeiten
+ </string>
+ <string name="hint_new">
+ Geben Sie einen Namen für die Voreinstellung ein, passen Sie die Steuerungen an, um die Voreinstellung zu erstellen, und klicken Sie dann auf „Speichern“.
+ </string>
+ <string name="hint_edit">
+ Um Ihre Himmel-Voreinstellung zu bearbeiten, passen Sie die Steuerungen an und klicken Sie auf „Speichern“.
+ </string>
+ <string name="combo_label">
+ -Voreinstellung auswählen-
+ </string>
+ <text name="hint">
+ Um Ihre Voreinstellung zu bearbeiten, passen Sie die Steuerungen an und klicken Sie auf „Speichern“.
+ </text>
+ <text name="label">
+ Name der Voreinstellung:
+ </text>
+ <text name="note">
+ Hinweis: Wenn Sie den Namen Ihrer Voreinstellung ändern, entsteht eine neue Voreinstellung; die vorhandene Voreinstellung wird nicht geändert.
+ </text>
+ <tab_container name="WindLight Tabs">
+ <panel label="ATMOSPHÄRE" name="Atmosphere">
+ <text name="BHText">
+ Blauer Horizont
+ </text>
+ <text name="BDensText">
+ Horizonttrübung
+ </text>
+ <text name="BDensText2">
+ Farbintensität
+ </text>
+ <text name="HDText">
+ Trübungsintensität
+ </text>
+ <text name="DensMultText">
+ Dichtemultiplikator
+ </text>
+ <text name="WLDistanceMultText">
+ Entfernungsmultiplikator
+ </text>
+ <text name="MaxAltText">
+ Max. Höhe
+ </text>
+ </panel>
+ <panel label="BELEUCHTUNG" name="Lighting">
+ <text name="SLCText">
+ Sonne/Mond-Farbe
+ </text>
+ <text name="WLAmbientText">
+ Umgebung
+ </text>
+ <text name="SunGlowText">
+ Sonnenleuchtkraft
+ </text>
+ <slider label="Fokus" name="WLGlowB"/>
+ <slider label="Größe" name="WLGlowR"/>
+ <text name="WLStarText">
+ Sternenleuchtkraft
+ </text>
+ <text name="SceneGammaText">
+ Gamma in Szene
+ </text>
+ <text name="TODText">
+ Sonne/Mond-Stand
+ </text>
+ <multi_slider initial_value="0" name="WLSunPos"/>
+ <text name="WL12amHash">
+ |
+ </text>
+ <text name="WL6amHash">
+ |
+ </text>
+ <text name="WL12pmHash2">
+ |
+ </text>
+ <text name="WL6pmHash">
+ |
+ </text>
+ <text name="WL12amHash2">
+ |
+ </text>
+ <text name="WL12am">
+ 0:00
+ </text>
+ <text name="WL6am">
+ 3:00
+ </text>
+ <text name="WL12pmHash">
+ 12:00
+ </text>
+ <text name="WL6pm">
+ 18:00
+ </text>
+ <text name="WL12am2">
+ 0:00
+ </text>
+ <time name="WLDayTime" value="6:00"/>
+ <text name="WLEastAngleText">
+ Ostausrichtung
+ </text>
+ </panel>
+ <panel label="WOLKEN" name="Clouds">
+ <text name="WLCloudColorText">
+ Wolkenfarbe
+ </text>
+ <text name="WLCloudColorText2">
+ Wolken-XY/Dichte
+ </text>
+ <slider label="X" name="WLCloudX"/>
+ <slider label="Y" name="WLCloudY"/>
+ <slider label="D" name="WLCloudDensity"/>
+ <text name="WLCloudCoverageText">
+ Wolkendichte
+ </text>
+ <text name="WLCloudScaleText">
+ Wolkenskalierung
+ </text>
+ <text name="WLCloudDetailText">
+ Wolkendetails (XY/Dichte)
+ </text>
+ <slider label="X" name="WLCloudDetailX"/>
+ <slider label="Y" name="WLCloudDetailY"/>
+ <slider label="D" name="WLCloudDetailDensity"/>
+ <text name="WLCloudScrollXText">
+ Wolkenbewegung X
+ </text>
+ <check_box label="Sperren" name="WLCloudLockX"/>
+ <text name="WLCloudScrollYText">
+ Wolkenbewegung Y
+ </text>
+ <check_box label="Sperren" name="WLCloudLockY"/>
+ </panel>
+ </tab_container>
+ <check_box label="Diese Voreinstellung zu meiner neuen Himmeleinstellung machen" name="make_default_cb"/>
+ <button label="Speichern" name="save"/>
+ <button label="Abbrechen" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_edit_water_preset.xml b/indra/newview/skins/default/xui/de/floater_edit_water_preset.xml
new file mode 100644
index 0000000000..9b9d5e7d77
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_edit_water_preset.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Edit Water Preset" title="Wasser-Voreinstellung bearbeiten">
+ <string name="title_new">
+ Neue Wasser-Voreinstellung erstellen
+ </string>
+ <string name="title_edit">
+ Wasser-Voreinstellung bearbeiten
+ </string>
+ <string name="hint_new">
+ Geben Sie einen Namen für die Voreinstellung ein, passen Sie die Steuerungen an, um die Voreinstellung zu erstellen, und klicken Sie dann auf „Speichern“.
+ </string>
+ <string name="hint_edit">
+ Um Ihre Wasser-Voreinstellung zu bearbeiten, passen Sie die Steuerungen an und klicken Sie auf „Speichern“.
+ </string>
+ <string name="combo_label">
+ -Voreinstellung auswählen-
+ </string>
+ <text name="hint">
+ Um Ihre Voreinstellung zu bearbeiten, passen Sie die Steuerungen an und klicken Sie auf „Speichern“.
+ </text>
+ <text name="label">
+ Name der Voreinstellung:
+ </text>
+ <text name="note">
+ Hinweis: Wenn Sie den Namen Ihrer Voreinstellung ändern, entsteht eine neue Voreinstellung; die vorhandene Voreinstellung wird nicht geändert.
+ </text>
+ <panel name="panel_water_preset">
+ <text name="water_color_label">
+ Trübungsfarbe
+ </text>
+ <text name="water_fog_density_label">
+ Exponent für Trübungsdichte
+ </text>
+ <text name="underwater_fog_modifier_label">
+ Modifikator für Wassertrübung
+ </text>
+ <text name="BHText">
+ Richtung für große Wellen
+ </text>
+ <slider label="X" name="WaterWave1DirX"/>
+ <slider label="Y" name="WaterWave1DirY"/>
+ <text name="BDensText">
+ Reflexionswellengröße
+ </text>
+ <text name="HDText">
+ Fresnel-Skalierung
+ </text>
+ <text name="FresnelOffsetText">
+ Fresnel-Versatz
+ </text>
+ <text name="BHText2">
+ Richtung für kleine Wellen
+ </text>
+ <slider label="X" name="WaterWave2DirX"/>
+ <slider label="Y" name="WaterWave2DirY"/>
+ <text name="DensMultText">
+ Brechungsstärke oben
+ </text>
+ <text name="WaterScaleBelowText">
+ Brechungsstärke unten
+ </text>
+ <text name="MaxAltText">
+ Mischungsmultiplikator
+ </text>
+ <text name="BHText3">
+ Normal-Map
+ </text>
+ </panel>
+ <check_box label="Diese Voreinstellung zu meiner neuen Wassereinstellung machen" name="make_default_cb"/>
+ <button label="Speichern" name="save"/>
+ <button label="Abbrechen" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_env_settings.xml b/indra/newview/skins/default/xui/de/floater_env_settings.xml
deleted file mode 100644
index 0c78909108..0000000000
--- a/indra/newview/skins/default/xui/de/floater_env_settings.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Environment Editor Floater" title="UMWELT-EDITOR">
- <floater.string name="timeStr">
- [hour12,datetime,utc]:[min,datetime,utc] [ampm,datetime,utc]
- </floater.string>
- <text name="EnvTimeText">
- Tageszeit
- </text>
- <text name="EnvTimeText2">
- 12:00
- </text>
- <text name="EnvCloudText">
- Wolkendecke
- </text>
- <text name="EnvWaterColorText">
- Wasserfarbe
- </text>
- <color_swatch name="EnvWaterColor" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
- <text name="EnvWaterFogText">
- Wasser-
-trübung
- </text>
- <button label="Grundbesitzzeit verw." name="EnvUseEstateTimeButton"/>
- <button label="Himmel (erweitert)" name="EnvAdvancedSkyButton"/>
- <button label="Wasser (erweitert)" name="EnvAdvancedWaterButton"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_environment_settings.xml b/indra/newview/skins/default/xui/de/floater_environment_settings.xml
new file mode 100644
index 0000000000..946416980a
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_environment_settings.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Environment Editor Floater" title="UMGEBUNGSEINSTELLUNGEN">
+ <text name="note">
+ Anhand der Optionen unten können Sie die Umgebungseinstellungen für Ihren Viewer anpassen.
+ </text>
+ <radio_group name="region_settings_radio_group">
+ <radio_item label="Regionseinstellungen verwenden" name="use_region_settings"/>
+ <radio_item label="Meine Umgebung anpassen" name="use_my_settings"/>
+ </radio_group>
+ <panel name="user_environment_settings">
+ <text name="note">
+ Hinweis: Ihre benutzerdefinierten Einstellungen sind für andere Benutzer nicht sichtbar.
+ </text>
+ <text name="water_settings_title">
+ Wassereinstellung
+ </text>
+ <combo_box name="water_settings_preset_combo">
+ <combo_box.item label="-Voreinstellung auswählen-" name="item0"/>
+ </combo_box>
+ <text name="sky_dayc_settings_title">
+ Himmel / Tageszyklus
+ </text>
+ <radio_group name="sky_dayc_settings_radio_group">
+ <radio_item label="Fester Himmel" name="my_sky_settings"/>
+ <radio_item label="Tageszyklus" name="my_dayc_settings"/>
+ </radio_group>
+ <combo_box name="sky_settings_preset_combo">
+ <combo_box.item label="-Voreinstellung auswählen-" name="item0"/>
+ </combo_box>
+ <combo_box name="dayc_settings_preset_combo">
+ <combo_box.item label="-Voreinstellung auswählen-" name="item0"/>
+ </combo_box>
+ </panel>
+ <button label="OK" name="ok_btn"/>
+ <button label="Abbrechen" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_fast_timers.xml b/indra/newview/skins/default/xui/de/floater_fast_timers.xml
new file mode 100644
index 0000000000..e61e542688
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_fast_timers.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="fast_timers">
+ <string name="pause">
+ Pause
+ </string>
+ <string name="run">
+ Rennen
+ </string>
+ <button label="Pause" name="pause_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_hardware_settings.xml b/indra/newview/skins/default/xui/de/floater_hardware_settings.xml
index d931596efe..ca081aafae 100644
--- a/indra/newview/skins/default/xui/de/floater_hardware_settings.xml
+++ b/indra/newview/skins/default/xui/de/floater_hardware_settings.xml
@@ -4,7 +4,7 @@
Filtern:
</text>
<check_box label="Anisotropische Filterung (langsamer, wenn aktiviert)" name="ani"/>
- <text name="Antialiasing:">
+ <text name="antialiasing label">
Antialiasing:
</text>
<combo_box label="Antialiasing" name="fsaa">
@@ -14,6 +14,9 @@
<combo_box.item label="8x" name="8x"/>
<combo_box.item label="16x" name="16x"/>
</combo_box>
+ <text name="antialiasing restart">
+ (Neustart des Viewers erforderlich)
+ </text>
<spinner label="Gamma:" name="gamma"/>
<text name="(brightness, lower is brighter)">
(0 = Standard-Helligkeit, weniger = heller)
diff --git a/indra/newview/skins/default/xui/de/floater_how_to.xml b/indra/newview/skins/default/xui/de/floater_how_to.xml
new file mode 100644
index 0000000000..caea221f83
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_how_to.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_how_to" title="INFOS"/>
diff --git a/indra/newview/skins/default/xui/de/floater_import_collada.xml b/indra/newview/skins/default/xui/de/floater_import_collada.xml
new file mode 100644
index 0000000000..8b1313c7b5
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_import_collada.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Import Collada" title="Szene importieren">
+ <text name="mesh count">
+ Netze: [COUNT]
+ </text>
+ <text name="texture count">
+ Texturen: [COUNT]
+ </text>
+ <text name="status">
+ Status: [STATUS]
+ </text>
+ <button label="Abbrechen" name="cancel"/>
+ <button label="OK" name="ok"/>
+ <string name="status_idle">
+ Inaktiv
+ </string>
+ <string name="status_uploading">
+ [NAME] wird hochgeladen
+ </string>
+ <string name="status_creating">
+ Objektname [NAME] wird erstellt
+ </string>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml
index f98e23bbc4..7f48105460 100644
--- a/indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml
+++ b/indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml
@@ -24,16 +24,10 @@
<text name="LabelCreatorTitle">
Ersteller:
</text>
- <text name="LabelCreatorName">
- Nicole Linden
- </text>
<button label="Profil..." label_selected="" name="BtnCreator"/>
<text name="LabelOwnerTitle">
Eigentümer:
</text>
- <text name="LabelOwnerName">
- Thrax Linden
- </text>
<button label="Profil..." label_selected="" name="BtnOwner"/>
<text name="LabelAcquiredTitle">
Erworben:
diff --git a/indra/newview/skins/default/xui/de/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/de/floater_inventory_view_finder.xml
index 9cc5b92daf..d63426d684 100644
--- a/indra/newview/skins/default/xui/de/floater_inventory_view_finder.xml
+++ b/indra/newview/skins/default/xui/de/floater_inventory_view_finder.xml
@@ -5,6 +5,7 @@
<check_box label="Kleidung" name="check_clothing"/>
<check_box label="Gesten" name="check_gesture"/>
<check_box label="Landmarken" name="check_landmark"/>
+ <check_box label="Netze" name="check_mesh"/>
<check_box label="Notizkarten" name="check_notecard"/>
<check_box label="Objekte" name="check_object"/>
<check_box label="Skripts" name="check_script"/>
diff --git a/indra/newview/skins/default/xui/de/floater_map.xml b/indra/newview/skins/default/xui/de/floater_map.xml
index 217a641dec..c4c42af66d 100644
--- a/indra/newview/skins/default/xui/de/floater_map.xml
+++ b/indra/newview/skins/default/xui/de/floater_map.xml
@@ -1,34 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Map" title="">
- <floater.string name="mini_map_north">
- N
- </floater.string>
- <floater.string name="mini_map_east">
- O
- </floater.string>
- <floater.string name="mini_map_west">
- W
- </floater.string>
- <floater.string name="mini_map_south">
- S
- </floater.string>
- <floater.string name="mini_map_southeast">
- SO
- </floater.string>
- <floater.string name="mini_map_northeast">
- NO
- </floater.string>
- <floater.string name="mini_map_southwest">
- SW
- </floater.string>
- <floater.string name="mini_map_northwest">
- NW
- </floater.string>
+<floater name="Map" title="MINIKARTE">
<floater.string name="ToolTipMsg">
[REGION](Doppelklicken, um Karte zu öffnen; Umschalt-Taste gedrückt halten und ziehen, um zu schwenken)
</floater.string>
+ <floater.string name="AltToolTipMsg">
+ [REGION](Doppelklicken, um zu teleportieren; Umschalttaste gedrückt halten und ziehen, um zu schwenken)
+ </floater.string>
<floater.string name="mini_map_caption">
- MINI-KARTE
+ Minikarte
</floater.string>
<text label="N" name="floater_map_north" text="N">
N
diff --git a/indra/newview/skins/default/xui/de/floater_merchant_outbox.xml b/indra/newview/skins/default/xui/de/floater_merchant_outbox.xml
new file mode 100644
index 0000000000..a412b530a4
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_merchant_outbox.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_merchant_outbox" title="HÄNDLER-OUTBOX">
+ <string name="OutboxFolderCount1">
+ 1 Ordner
+ </string>
+ <string name="OutboxFolderCountN">
+ [NUM] Ordner
+ </string>
+ <string name="OutboxImporting">
+ Ordner übertragen...
+ </string>
+ <string name="OutboxInitializing">
+ Initialisieren...
+ </string>
+ <panel label="">
+ <panel>
+ <panel name="outbox_inventory_placeholder_panel">
+ <text name="outbox_inventory_placeholder_title">
+ Laden...
+ </text>
+ </panel>
+ </panel>
+ <panel>
+ <button label="In Marktplatz übertragen" name="outbox_import_btn" tool_tip="In meinen Marktplatz-Laden verschieben"/>
+ </panel>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_model_preview.xml b/indra/newview/skins/default/xui/de/floater_model_preview.xml
new file mode 100644
index 0000000000..4af8d67686
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_model_preview.xml
@@ -0,0 +1,277 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Model Preview" title="MODELL HOCHLADEN">
+ <string name="status_idle"/>
+ <string name="status_parse_error">
+ Fehler: Fehler beim DAE-Parsen – Details siehe Protokoll.
+ </string>
+ <string name="status_material_mismatch">
+ Fehler: Das Material des Modells ist keine Teilmenge des Referenzmodells.
+ </string>
+ <string name="status_reading_file">
+ Laden...
+ </string>
+ <string name="status_generating_meshes">
+ Netze werden generiert...
+ </string>
+ <string name="status_vertex_number_overflow">
+ Fehler: Anzahl von Vertices überschreitet 65534. Operation abgebrochen.
+ </string>
+ <string name="bad_element">
+ Fehler: ungültiges Element.
+ </string>
+ <string name="high">
+ Hoch
+ </string>
+ <string name="medium">
+ Mittel
+ </string>
+ <string name="low">
+ Niedrig
+ </string>
+ <string name="lowest">
+ Niedrigste
+ </string>
+ <string name="mesh_status_good">
+ Ausliefern
+ </string>
+ <string name="mesh_status_na">
+ --
+ </string>
+ <string name="mesh_status_none">
+ Keine
+ </string>
+ <string name="mesh_status_submesh_mismatch">
+ Detailstufen haben unterschiedliche Anzahl texturfähiger Flächen.
+ </string>
+ <string name="mesh_status_mesh_mismatch">
+ Detailstufen haben unterschiedliche Anzahl von Netzinstanzen.
+ </string>
+ <string name="mesh_status_too_many_vertices">
+ Detailstufe hat zu viele Vertices.
+ </string>
+ <string name="mesh_status_missing_lod">
+ Erforderliche Detailstufe fehlt.
+ </string>
+ <string name="mesh_status_invalid_material_list">
+ Detailstufenmaterial ist keine Teilmenge des Referenzmodells.
+ </string>
+ <string name="layer_all">
+ Alle
+ </string>
+ <string name="decomposing">
+ Analyse läuft...
+ </string>
+ <string name="simplifying">
+ Vereinfachung läuft...
+ </string>
+ <string name="tbd">
+ noch nicht festgelegt
+ </string>
+ <panel name="left_panel">
+ <panel name="model_name_representation_panel">
+ <text name="name_label">
+ Modellname:
+ </text>
+ <text name="model_category_label">
+ Dieses Modell repräsentiert...
+ </text>
+ <combo_box name="model_category_combo">
+ <combo_item label="Eine auswählen..." name="Choose one"/>
+ <combo_item label="Avatarform" name="Avatar shape"/>
+ <combo_item label="Avatar-Anhang" name="Avatar attachment"/>
+ <combo_item label="Mobile Objekte (Fahrzeug, Tier)" name="Moving object (vehicle, animal)"/>
+ <combo_item label="Baukomponenten" name="Building Component"/>
+ <combo_item label="Groß, unbeweglich usw." name="Large, non moving etc"/>
+ <combo_item label="Kleiner, unbeweglich usw." name="Smaller, non-moving etc"/>
+ <combo_item label="Keine der oben genannten" name="Not really any of these"/>
+ </combo_box>
+ </panel>
+ <tab_container name="import_tab">
+ <panel label="Detailstufe" name="lod_panel" title="Detailstufe">
+ <text initial_value="Quelle" name="source" value="Quelle"/>
+ <text initial_value="Dreiecke" name="triangles" value="Dreiecke"/>
+ <text initial_value="Scheitelpunkte" name="vertices" value="Scheitelpunkte"/>
+ <text initial_value="Hoch" name="high_label" value="Hoch"/>
+ <button label="Durchsuchen..." name="lod_browse_high"/>
+ <text initial_value="0" name="high_triangles" value="0"/>
+ <text initial_value="0" name="high_vertices" value="0"/>
+ <text initial_value="Mittel" name="medium_label" value="Mittel"/>
+ <button label="Durchsuchen..." name="lod_browse_medium"/>
+ <text initial_value="0" name="medium_triangles" value="0"/>
+ <text initial_value="0" name="medium_vertices" value="0"/>
+ <text initial_value="Niedrig" name="low_label" value="Niedrig"/>
+ <button label="Durchsuchen..." name="lod_browse_low"/>
+ <text initial_value="0" name="low_triangles" value="0"/>
+ <text initial_value="0" name="low_vertices" value="0"/>
+ <text initial_value="Niedrigste" name="lowest_label" value="Niedrigste"/>
+ <button label="Durchsuchen..." name="lod_browse_lowest"/>
+ <text initial_value="0" name="lowest_triangles" value="0"/>
+ <text initial_value="0" name="lowest_vertices" value="0"/>
+ <check_box label="Normalen generieren" name="gen_normals"/>
+ <text initial_value="Knitterwinkel:" name="crease_label" value="Knitterwinkel:"/>
+ <spinner name="crease_angle" value="75"/>
+ </panel>
+ <panel label="Physik" name="physics_panel">
+ <panel name="physics geometry">
+ <text name="first_step_name">
+ Schritt 1: Detailstufe
+ </text>
+ <combo_box name="physics_lod_combo" tool_tip="Detailstufe für Physikform">
+ <combo_item name="choose_one">
+ Eine auswählen...
+ </combo_item>
+ <combo_item name="physics_high">
+ Hoch
+ </combo_item>
+ <combo_item name="physics_medium">
+ Mittel
+ </combo_item>
+ <combo_item name="physics_low">
+ Niedrig
+ </combo_item>
+ <combo_item name="physics_lowest">
+ Niedrigste
+ </combo_item>
+ <combo_item name="load_from_file">
+ Aus Datei
+ </combo_item>
+ </combo_box>
+ <button label="Durchsuchen..." name="physics_browse"/>
+ </panel>
+ <panel name="physics analysis">
+ <text name="method_label">
+ Schritt 2: Analysieren
+ </text>
+ <text name="analysis_method_label">
+ Methode:
+ </text>
+ <text name="quality_label">
+ Qualität:
+ </text>
+ <text name="smooth_method_label">
+ Glätten:
+ </text>
+ <check_box label="Löcher schließen" name="Close Holes (Slow)"/>
+ <button label="Analysieren" name="Decompose"/>
+ <button label="Abbrechen" name="decompose_cancel"/>
+ </panel>
+ <panel name="physics simplification">
+ <text name="second_step_label">
+ Schritt 3: Vereinfachen
+ </text>
+ <text name="simp_method_header">
+ Methode:
+ </text>
+ <text name="pass_method_header">
+ Durchläufe:
+ </text>
+ <text name="Detail Scale label">
+ Detailskalierung:
+ </text>
+ <text name="Retain%_label">
+ Beibehalten:
+ </text>
+ <combo_box name="Combine Quality" value="1"/>
+ <button label="Vereinfachen" name="Simplify"/>
+ <button label="Abbrechen" name="simplify_cancel"/>
+ </panel>
+ <panel name="physics info">
+ <text name="results_text">
+ Ergebnisse:
+ </text>
+ <text name="physics_triangles">
+ Dreiecke: [TRIANGLES],
+ </text>
+ <text name="physics_points">
+ Scheitelpunkte: [POINTS],
+ </text>
+ <text name="physics_hulls">
+ Hüllen: [HULLS]
+ </text>
+ </panel>
+ </panel>
+ <panel label="Hochladeoptionen" name="modifiers_panel">
+ <text name="scale_label">
+ Skalierung (1=keine Skalierung):
+ </text>
+ <spinner name="import_scale" value="1.0"/>
+ <text name="dimensions_label">
+ Dimensionen:
+ </text>
+ <text name="import_dimensions">
+ [X] X [Y] X [Z]
+ </text>
+ <check_box label="Texturen einschließen" name="upload_textures"/>
+ <text name="include_label">
+ Nur für Avatarmodelle:
+ </text>
+ <check_box label="Skingewicht einschließen" name="upload_skin"/>
+ <check_box label="Gelenkpositionen einschließen" name="upload_joints"/>
+ <text name="pelvis_offset_label">
+ Z-Offset (Avatar anheben oder senken):
+ </text>
+ <spinner name="pelvis_offset" value="0.0"/>
+ </panel>
+ </tab_container>
+ <panel name="weights_and_warning_panel">
+ <button label="Gewichte und Gebühr berechnen" name="calculate_btn" tool_tip="Gewichte und Gebühr berechnen"/>
+ <button label="Abbrechen" name="cancel_btn"/>
+ <button label="Hochladen" name="ok_btn" tool_tip="Auf Simulator hochladen"/>
+ <button label="Einstellungen löschen und Formular zurücksetzen" name="reset_btn"/>
+ <text name="upload_fee">
+ Gebühr für Hochladen: [FEE] L$
+ </text>
+ <text name="prim_weight">
+ Auswirkung auf Land: [EQ]
+ </text>
+ <text name="download_weight">
+ Herunterladen: [ST]
+ </text>
+ <text name="physics_weight">
+ Physik: [PH]
+ </text>
+ <text name="server_weight">
+ Server: [SIM]
+ </text>
+ <text name="warning_title">
+ HINWEIS:
+ </text>
+ <text name="warning_message">
+ Sie haben keine Berechtigung zum Hochladen von Netzmodellen. [[VURL] Weitere Infos], wie Sie sich zertifizieren lassen können.
+ </text>
+ <text name="status">
+ [STATUS]
+ </text>
+ </panel>
+ </panel>
+ <text name="lod_label">
+ Vorschau:
+ </text>
+ <panel name="right_panel">
+ <combo_box name="preview_lod_combo" tool_tip="Detailstufe zur Anzeige in Vorschaudarstellung">
+ <combo_item name="high">
+ Hoch
+ </combo_item>
+ <combo_item name="medium">
+ Mittel
+ </combo_item>
+ <combo_item name="low">
+ Niedrig
+ </combo_item>
+ <combo_item name="lowest">
+ Niedrigste
+ </combo_item>
+ </combo_box>
+ <text name="label_display">
+ Anzeige...
+ </text>
+ <check_box label="Kanten" name="show_edges"/>
+ <check_box label="Physik" name="show_physics"/>
+ <check_box label="Texturen" name="show_textures"/>
+ <check_box label="Skingewichte" name="show_skin_weight"/>
+ <check_box label="Gelenke" name="show_joint_positions"/>
+ <text name="physics_explode_label">
+ Vorschaudehnung:
+ </text>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_moveview.xml b/indra/newview/skins/default/xui/de/floater_moveview.xml
index 4333392582..c1c8271310 100644
--- a/indra/newview/skins/default/xui/de/floater_moveview.xml
+++ b/indra/newview/skins/default/xui/de/floater_moveview.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="move_floater">
+<floater name="move_floater" title="GEHEN / RENNEN / FLIEGEN">
<string name="walk_forward_tooltip">
Vorwärts gehen (Nach-oben-Pfeil oder W drücken)
</string>
@@ -58,14 +58,14 @@
Fliegen
</string>
<panel name="panel_actions">
- <button label="" label_selected="" name="move up btn" tool_tip="Nach oben fliegen, „E&quot; drücken"/>
<button label="" label_selected="" name="turn left btn" tool_tip="Nach links (Links-Pfeil oder A drücken)"/>
<joystick_slide name="move left btn" tool_tip="Nach links gehen (Umschalt + Links-Pfeil oder A drücken)"/>
- <button label="" label_selected="" name="move down btn" tool_tip="Nach unten fliegen, „C&quot; drücken"/>
<button label="" label_selected="" name="turn right btn" tool_tip="Nach rechts (Rechts-Pfeil oder D drücken)"/>
<joystick_slide name="move right btn" tool_tip="Nach rechts fliegen (Umschalt + Rechts-Pfeil oder D drücken)"/>
<joystick_turn name="forward btn" tool_tip="Vorwärts gehen (Nach-oben-Pfeil oder W drücken)"/>
<joystick_turn name="backward btn" tool_tip="Rückwärts gehen (Nach-Unten-Pfeil oder S drücken)"/>
+ <button label="" label_selected="" name="move up btn" tool_tip="Nach oben fliegen, „E&quot; drücken"/>
+ <button label="" label_selected="" name="move down btn" tool_tip="Nach unten fliegen, „C&quot; drücken"/>
</panel>
<panel name="panel_modes">
<button label="" name="mode_walk_btn" tool_tip="Gehen"/>
diff --git a/indra/newview/skins/default/xui/de/floater_my_appearance.xml b/indra/newview/skins/default/xui/de/floater_my_appearance.xml
new file mode 100644
index 0000000000..e26b2434cc
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_my_appearance.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_my_appearance" title="AUSSEHEN">
+ <panel label="Aussehen bearbeiten" name="main_panel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_my_inventory.xml b/indra/newview/skins/default/xui/de/floater_my_inventory.xml
new file mode 100644
index 0000000000..0cfa17562e
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_my_inventory.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_my_inventory" title="INVENTAR"/>
diff --git a/indra/newview/skins/default/xui/de/floater_nearby_chat.xml b/indra/newview/skins/default/xui/de/floater_nearby_chat.xml
index bbb4114200..2aabbb18f2 100644
--- a/indra/newview/skins/default/xui/de/floater_nearby_chat.xml
+++ b/indra/newview/skins/default/xui/de/floater_nearby_chat.xml
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="nearby_chat" title="CHAT IN DER NÄHE">
- <check_box label="Chat übersetzen (Service von Google)" name="translate_chat_checkbox"/>
+ <check_box label="Chat übersetzen" name="translate_chat_checkbox"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_object_weights.xml b/indra/newview/skins/default/xui/de/floater_object_weights.xml
new file mode 100644
index 0000000000..e6641d3d18
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_object_weights.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="object_weights" title="ERWEITERT">
+ <floater.string name="nothing_selected" value="--"/>
+ <text name="selected_text" value="AUSGEWÄHLT"/>
+ <text name="objects" value="--"/>
+ <text name="objects_label" value="Objekte"/>
+ <text name="prims" value="--"/>
+ <text name="prims_label" value="Primitive"/>
+ <text name="weights_of_selected_text" value="GEWICHT DER AUSGEWÄHLTEN"/>
+ <text name="download" value="--"/>
+ <text name="download_label" value="Herunterladen"/>
+ <text name="physics" value="--"/>
+ <text name="physics_label" value="Physik"/>
+ <text name="server" value="--"/>
+ <text name="server_label" value="Server"/>
+ <text name="display" value="--"/>
+ <text name="display_label" value="Anzeige"/>
+ <text name="land_impacts_text" value="AUSWIRKUNGEN AUF LAND"/>
+ <text name="selected" value="--"/>
+ <text name="selected_label" value="Ausgewählt"/>
+ <text name="rezzed_on_land" value="--"/>
+ <text name="rezzed_on_land_label" value="Auf Land gerezzt"/>
+ <text name="remaining_capacity" value="--"/>
+ <text name="remaining_capacity_label" value="Verbleibende Kapazität"/>
+ <text name="total_capacity" value="--"/>
+ <text name="total_capacity_label" value="Gesamtkapazität"/>
+ <text name="help_SLURL" value="[secondlife:///app/help/object_weights Was ist das?...]"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_outfit_save_as.xml b/indra/newview/skins/default/xui/de/floater_outfit_save_as.xml
index 8c110e5516..7481e6d4b7 100644
--- a/indra/newview/skins/default/xui/de/floater_outfit_save_as.xml
+++ b/indra/newview/skins/default/xui/de/floater_outfit_save_as.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="modal container" title="Outfit speichern">
+<floater name="modal container" title="OUTFIT SPEICHERN">
<button label="Speichern" label_selected="Speichern" name="Save"/>
<button label="Abbrechen" label_selected="Abbrechen" name="Cancel"/>
<text name="Save item as:">
diff --git a/indra/newview/skins/default/xui/de/floater_people.xml b/indra/newview/skins/default/xui/de/floater_people.xml
new file mode 100644
index 0000000000..fd1db148ac
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_people.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_people" title="LEUTE">
+ <panel_container name="main_panel">
+ <panel label="Gruppenprofil" name="panel_group_info_sidetray"/>
+ <panel label="Blockierte Einwohner und Objekte" name="panel_block_list_sidetray"/>
+ </panel_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_perm_prefs.xml b/indra/newview/skins/default/xui/de/floater_perm_prefs.xml
index fd65987aa9..9be22f3ccb 100644
--- a/indra/newview/skins/default/xui/de/floater_perm_prefs.xml
+++ b/indra/newview/skins/default/xui/de/floater_perm_prefs.xml
@@ -9,7 +9,7 @@
</text>
<check_box label="Bearbeiten" name="next_owner_modify"/>
<check_box label="Kopieren" name="next_owner_copy"/>
- <check_box label="Verkaufen/Weggeben" left_delta="80" name="next_owner_transfer"/>
+ <check_box label="Verkaufen/Weggeben" name="next_owner_transfer"/>
</panel>
<button label="OK" label_selected="OK" name="ok"/>
<button label="Abbrechen" label_selected="Abbrechen" name="cancel"/>
diff --git a/indra/newview/skins/default/xui/de/floater_picks.xml b/indra/newview/skins/default/xui/de/floater_picks.xml
new file mode 100644
index 0000000000..2521920e83
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_picks.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_picks" title="Auswahlen"/>
diff --git a/indra/newview/skins/default/xui/de/floater_places.xml b/indra/newview/skins/default/xui/de/floater_places.xml
new file mode 100644
index 0000000000..80a1490afd
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_places.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_places" title="ORTE">
+ <panel label="Orte" name="main_panel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_postcard.xml b/indra/newview/skins/default/xui/de/floater_postcard.xml
index 91e0bb8133..28af0183cb 100644
--- a/indra/newview/skins/default/xui/de/floater_postcard.xml
+++ b/indra/newview/skins/default/xui/de/floater_postcard.xml
@@ -3,29 +3,23 @@
<text name="to_label">
E-Mail des Empfängers:
</text>
- <line_editor left_delta="145" name="to_form" width="125"/>
<text name="from_label">
Ihre E-Mail:
- </text>
- <line_editor left_delta="145" name="from_form" width="125"/>
+ </text>
<text name="name_label">
Ihr Name:
- </text>
- <line_editor left_delta="145" name="name_form" width="125"/>
+ </text>
<text name="subject_label">
Betreff:
</text>
- <line_editor label="Betreff hier eingeben." left_delta="145" name="subject_form" width="125"/>
+ <line_editor label="Betreff hier eingeben." name="subject_form"/>
<text name="msg_label">
Nachricht:
</text>
<text_editor name="msg_form">
Nachricht hier eingeben.
- </text_editor>
- <check_box label="Im Web veröffentlichen" name="allow_publish_check" tool_tip="Veröffentlicht diese Postkarte im Web."/>
- <check_box label="Ab-18-Inhalt" name="mature_check" tool_tip="Diese Postkarte enthält nicht jugendfreie Inhalte."/>
- <button label="?" name="publish_help_btn"/>
- <text name="fine_print" bottom_delta="21" height="140">
+ </text_editor>
+ <text name="fine_print">
Wenn sich der Empfänger bei SL anmeldet, erhalten Sie einen Empfehlungsbonus.
</text>
<button label="Abbrechen" name="cancel_btn"/>
diff --git a/indra/newview/skins/default/xui/de/floater_preferences.xml b/indra/newview/skins/default/xui/de/floater_preferences.xml
index a2712c437b..3624c4c968 100644
--- a/indra/newview/skins/default/xui/de/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/de/floater_preferences.xml
@@ -5,10 +5,12 @@
<tab_container name="pref core">
<panel label="Allgemein" name="general"/>
<panel label="Grafik" name="display"/>
- <panel label="Privatsphäre" name="im"/>
<panel label="Sound &amp; Medien" name="audio"/>
<panel label="Chat" name="chat"/>
+ <panel label="Bewegen und anzeigen" name="move"/>
<panel label="Meldungen" name="msgs"/>
+ <panel label="Farben" name="colors"/>
+ <panel label="Privatsphäre" name="im"/>
<panel label="Konfiguration" name="input"/>
<panel label="Erweitert" name="advanced1"/>
</tab_container>
diff --git a/indra/newview/skins/default/xui/de/floater_preferences_proxy.xml b/indra/newview/skins/default/xui/de/floater_preferences_proxy.xml
new file mode 100644
index 0000000000..cdefb470c2
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_preferences_proxy.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Proxy Settings Floater" title="Proxy-Einstellungen">
+ <check_box initial_value="false" label="HTTP-Proxy für Webseiten verwenden" name="web_proxy_enabled"/>
+ <text name="http_proxy_label">
+ HTTP-Proxy:
+ </text>
+ <line_editor name="web_proxy_editor" tool_tip="DNS-Name oder IP-Adresse des gewünschten HTTP-Proxys."/>
+ <spinner label="Portnummer:" name="web_proxy_port" tool_tip="Portnummer des gewünschten HTTP-Proxys."/>
+ <check_box label="SOCKS 5-Proxy für UDP-Verkehr verwenden" name="socks_proxy_enabled"/>
+ <text name="socks5_proxy_label">
+ SOCKS 5-Proxy:
+ </text>
+ <line_editor name="socks_proxy_editor" tool_tip="DNS-Name oder IP-Adresse des gewünschten SOCKS 5-Proxys."/>
+ <spinner label="Portnummer:" name="socks_proxy_port" tool_tip="Portnummer des gewünschten SOCKS 5-Proxys."/>
+ <text name="socks_auth_label">
+ SOCKS-Authentifizierung:
+ </text>
+ <radio_group name="socks5_auth_type">
+ <radio_item label="Keine Authentifizierung" name="Socks5NoAuth" tool_tip="SOCKS 5-Proxy erfordert keine Authentifizierung." value="Keine"/>
+ <radio_item label="Benutzername/Kennwort" name="Socks5UserPass" tool_tip="SOCKS 5-Proxy erfordert Authentifizierung per Benutzername/Kennwort." value="UserPass"/>
+ </radio_group>
+ <text name="socks5_username_label">
+ Benutzername:
+ </text>
+ <text name="socks5_password_label">
+ Kennwort:
+ </text>
+ <line_editor name="socks5_username" tool_tip="Benutzername zur Authentifizierung über Ihren SOCKS 5-Server"/>
+ <line_editor name="socks5_password" tool_tip="Kennwort zur Authentifizierung über Ihren SOCKS 5-Server"/>
+ <text name="other_proxy_label">
+ Anderer HTTP-Verkehrs-Proxy:
+ </text>
+ <radio_group name="other_http_proxy_type">
+ <radio_item label="Keinen Proxy verwenden" name="OtherNoProxy" tool_tip="Nicht-Web-HTTP-Verkehr wird an KEINEN Proxy weitergeleitet." value="Keiner"/>
+ <radio_item label="HTTP-Proxy verwenden" name="OtherHTTPProxy" tool_tip="Nicht-Web-HTTP-Verkehr wird über den konfigurierten Web-Proxy weitergeleitet." value="Web"/>
+ <radio_item label="SOCKS 5-Proxy verwenden" name="OtherSocksProxy" tool_tip="Nicht-Web-HTTP-Verkehr wird über den konfigurierten SOCKS 5-Proxy weitergeleitet." value="SOCKS"/>
+ </radio_group>
+ <button label="OK" label_selected="OK" name="OK"/>
+ <button label="Abbrechen" label_selected="Abbrechen" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_preview_animation.xml b/indra/newview/skins/default/xui/de/floater_preview_animation.xml
index 3dcdb52555..2dd47a27ad 100644
--- a/indra/newview/skins/default/xui/de/floater_preview_animation.xml
+++ b/indra/newview/skins/default/xui/de/floater_preview_animation.xml
@@ -7,6 +7,6 @@
Beschreibung:
</text>
<line_editor left="108" name="desc" width="160"/>
- <button label="Inworld abspielen" label_selected="Stopp" name="Anim play btn" tool_tip="Diese Animation so wiedergeben, dass andere sie sehen können." width="116"/>
- <button label="Lokal abspielen" label_selected="Stopp" left="171" name="Anim audition btn" tool_tip="Diese Animation so wiedergeben, dass nur Sie sie sehen." width="116"/>
+ <button label="Inworld abspielen" label_selected="Stopp" name="Inworld" tool_tip="Diese Animation so wiedergeben, dass andere sie sehen können."/>
+ <button label="Lokal wiedergeben" label_selected="Stopp" name="Locally" tool_tip="Diese Animation so wiedergeben, dass nur Sie sie sehen."/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_preview_gesture.xml b/indra/newview/skins/default/xui/de/floater_preview_gesture.xml
index 6d3635fa8d..76dc623ca4 100644
--- a/indra/newview/skins/default/xui/de/floater_preview_gesture.xml
+++ b/indra/newview/skins/default/xui/de/floater_preview_gesture.xml
@@ -33,7 +33,7 @@
<text name="replace_text" tool_tip="Ersetzt den Auslösertext mit diesem Text. Wenn Sie zum Beispiel den Auslöser „hallo“ durch „wie geht&apos;s“ ersetzen, erscheint im Chat anstelle von „Ich wollte nur hallo sagen“ der Text „Ich wollte nur wie geht&apos;s sagen“ und die zugehörige Geste wird abgespielt.">
Ersetzen mit:
</text>
- <line_editor left_delta="94" name="replace_editor" tool_tip="Ersetzt den Auslösertext mit diesem Text. Wenn Sie zum Beispiel den Auslöser „hallo“ durch „wie geht&apos;s“ ersetzen, erscheint im Chat anstelle von „Ich wollte nur hallo sagen“ der Text „Ich wollte nur wie geht&apos;s sagen“ und die zugehörige Geste wird abgespielt." width="160"/>
+ <line_editor name="replace_editor" tool_tip="Ersetzt den Auslösertext mit diesem Text. Wenn Sie zum Beispiel den Auslöser „hallo“ durch „wie geht&apos;s“ ersetzen, erscheint im Chat anstelle von „Ich wollte nur hallo sagen“ der Text „Ich wollte nur wie geht&apos;s sagen“ und die zugehörige Geste wird abgespielt."/>
<text name="key_label">
Tastenkürzel:
</text>
diff --git a/indra/newview/skins/default/xui/de/floater_price_for_listing.xml b/indra/newview/skins/default/xui/de/floater_price_for_listing.xml
new file mode 100644
index 0000000000..bdd772a9c2
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_price_for_listing.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="price_for_listing" title="ANZEIGE VERÖFFENTLICHEN">
+ <text name="explanation_text">
+ Ihre Anzeige wird für eine Woche veröffentlicht.
+
+Die Position Ihrer Anzeige hängt davon ab, wie viel Sie dafür bezahlen möchten.
+
+Die Anzeigen, für die am meisten bezahlt wird, werden am Anfang der Liste angezeigt und erscheinen in Suchergebnissen weiter oben.
+ </text>
+ <text name="price_text">
+ Anzeigenpreis:
+ </text>
+ <text name="price_symbol">
+ L$
+ </text>
+ <button label="OK" name="set_price_btn"/>
+ <button label="Abbrechen" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_region_debug_console.xml b/indra/newview/skins/default/xui/de/floater_region_debug_console.xml
new file mode 100644
index 0000000000..b8a1a89c30
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_region_debug_console.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="region_debug_console" title="Regions-Debug"/>
diff --git a/indra/newview/skins/default/xui/de/floater_script_search.xml b/indra/newview/skins/default/xui/de/floater_script_search.xml
index de959cbb28..ffae96f6a1 100644
--- a/indra/newview/skins/default/xui/de/floater_script_search.xml
+++ b/indra/newview/skins/default/xui/de/floater_script_search.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="script search" title="SKRIPT-SUCHE">
- <check_box label="Groß-/Kleinschreibung irrelevant" name="case_text"/>
+ <check_box label="Groß-/Kleinschreibung ignorieren" name="case_text"/>
<button label="Suchen" label_selected="Suchen" name="search_btn"/>
<button label="Ersetzen" label_selected="Ersetzen" name="replace_btn"/>
<button label="Alle ersetzen" label_selected="Alle ersetzen" name="replace_all_btn"/>
diff --git a/indra/newview/skins/default/xui/de/floater_search.xml b/indra/newview/skins/default/xui/de/floater_search.xml
index d44ad44aea..bd39bf2bce 100644
--- a/indra/newview/skins/default/xui/de/floater_search.xml
+++ b/indra/newview/skins/default/xui/de/floater_search.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_search" title="SUCHEN">
+<floater name="floater_search" title="">
<floater.string name="loading_text">
Wird geladen...
</floater.string>
diff --git a/indra/newview/skins/default/xui/de/floater_sell_land.xml b/indra/newview/skins/default/xui/de/floater_sell_land.xml
index 8f67fae464..646138eaad 100644
--- a/indra/newview/skins/default/xui/de/floater_sell_land.xml
+++ b/indra/newview/skins/default/xui/de/floater_sell_land.xml
@@ -5,16 +5,16 @@
<text name="info_parcel_label">
Parzelle:
</text>
- <text bottom_delta="-5" height="16" name="info_parcel" left="70">
+ <text name="info_parcel">
PARZELLENNAME
</text>
<text name="info_size_label">
Größe:
</text>
- <text bottom_delta="-21" height="32" name="info_size" left="70">
+ <text name="info_size">
[AREA] m².
</text>
- <text bottom_delta="-57" height="28" name="info_action">
+ <text name="info_action">
Zum Verkauf dieser Parzelle:
</text>
<text name="price_label">
@@ -32,13 +32,13 @@
<text name="price_per_m">
([PER_METER] L$ pro m²)
</text>
- <text bottom_delta="38" left="72" name="sell_to_label" right="-20">
+ <text name="sell_to_label">
2. Land verkaufen an:
</text>
- <text bottom_delta="-16" height="16" left="72" name="sell_to_text" right="-10">
+ <text name="sell_to_text">
Offener Verkauf oder Verkauf an bestimmte Person?
</text>
- <combo_box bottom_delta="-32" height="16" left="72" name="sell_to" width="140">
+ <combo_box name="sell_to">
<combo_box.item label="-- Auswählen --" name="--selectone--"/>
<combo_box.item label="An jeden" name="Anyone"/>
<combo_box.item label="An bestimmte Person:" name="Specificuser:"/>
@@ -50,15 +50,15 @@
<text name="sell_objects_text">
Die transferierbaren Landeigentümer-Objekte auf der Parzelle wechseln den Eigentümer.
</text>
- <radio_group bottom_delta="-58" name="sell_objects">
+ <radio_group name="sell_objects">
<radio_item label="Nein, Objekte behalten" name="no"/>
<radio_item label="Ja, Objekte mit Land verkaufen" name="yes"/>
</radio_group>
- <button label="Objekte anzeigen" name="show_objects" width="116"/>
+ <button label="Objekte anzeigen" name="show_objects"/>
<text name="nag_message_label">
ACHTUNG: Verkäufe sind endgültig.
</text>
- <button label="Zum Verkauf freigeben" name="sell_btn" width="180"/>
+ <button label="Zum Verkauf freigeben" name="sell_btn"/>
<button label="Abbrechen" name="cancel_btn"/>
</panel>
</scroll_container>
diff --git a/indra/newview/skins/default/xui/de/floater_snapshot.xml b/indra/newview/skins/default/xui/de/floater_snapshot.xml
index c014b8e040..798461c007 100644
--- a/indra/newview/skins/default/xui/de/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/de/floater_snapshot.xml
@@ -3,73 +3,63 @@
<floater.string name="unknown">
unbekannt
</floater.string>
- <radio_group label="Fototyp" name="snapshot_type_radio">
- <radio_item label="Email" name="postcard"/>
- <radio_item label="Mein Inventar ([AMOUNT] L$)" name="texture"/>
- <radio_item label="Auf meinem Computer speichern" name="local"/>
- </radio_group>
+ <string name="postcard_progress_str">
+ E-Mail senden
+ </string>
+ <string name="profile_progress_str">
+ Posten
+ </string>
+ <string name="inventory_progress_str">
+ Speichern im Inventar
+ </string>
+ <string name="local_progress_str">
+ Speichern auf Computer
+ </string>
+ <string name="profile_succeeded_str">
+ Bild hochgeladen
+ </string>
+ <string name="postcard_succeeded_str">
+ E-Mail gesendet!
+ </string>
+ <string name="inventory_succeeded_str">
+ Im Inventar gespeichert!
+ </string>
+ <string name="local_succeeded_str">
+ Auf Computer gespeichert!
+ </string>
+ <string name="profile_failed_str">
+ Fehler beim Hochladen des Bilds in Ihr Profil.
+ </string>
+ <string name="postcard_failed_str">
+ Fehler beim Senden der E-Mail.
+ </string>
+ <string name="inventory_failed_str">
+ Fehler beim Speichern im Inventar.
+ </string>
+ <string name="local_failed_str">
+ Fehler beim Speichern auf dem Computer.
+ </string>
+ <button name="advanced_options_btn" tool_tip="Erweiterte Optionen"/>
+ <text name="image_res_text">
+ [WIDTH] x [HEIGHT] px
+ </text>
<text name="file_size_label">
[SIZE] KB
</text>
- <button label="Foto aktualisieren" name="new_snapshot_btn"/>
- <button label="Senden" name="send_btn"/>
- <button label="Speichern ([AMOUNT] L$)" name="upload_btn"/>
- <flyout_button label="Speichern" name="save_btn" tool_tip="Bild als Datei speichern">
- <flyout_button.item label="Speichern" name="save_item"/>
- <flyout_button.item label="Speichern unter..." name="saveas_item"/>
- </flyout_button>
- <button label="Mehr" name="more_btn" tool_tip="Erweiterte Optionen"/>
- <button label="Weniger" name="less_btn" tool_tip="Erweiterte Optionen"/>
- <button label="Abbrechen" name="discard_btn"/>
- <text name="type_label2">
- Größe
- </text>
- <text name="format_label">
- Format
- </text>
- <combo_box label="Auflösung" name="postcard_size_combo">
- <combo_box.item label="Aktuelles Fenster" name="CurrentWindow"/>
- <combo_box.item label="640x480" name="640x480"/>
- <combo_box.item label="800x600" name="800x600"/>
- <combo_box.item label="1024x768" name="1024x768"/>
- <combo_box.item label="Benutzerdefiniert" name="Custom"/>
- </combo_box>
- <combo_box label="Auflösung" name="texture_size_combo">
- <combo_box.item label="Aktuelles Fenster" name="CurrentWindow"/>
- <combo_box.item label="Klein (128x128)" name="Small(128x128)"/>
- <combo_box.item label="Mittel (256x256)" name="Medium(256x256)"/>
- <combo_box.item label="Groß (512x512)" name="Large(512x512)"/>
- <combo_box.item label="Benutzerdefiniert" name="Custom"/>
- </combo_box>
- <combo_box label="Auflösung" name="local_size_combo">
- <combo_box.item label="Aktuelles Fenster" name="CurrentWindow"/>
- <combo_box.item label="320x240" name="320x240"/>
- <combo_box.item label="640x480" name="640x480"/>
- <combo_box.item label="800x600" name="800x600"/>
- <combo_box.item label="1024x768" name="1024x768"/>
- <combo_box.item label="1280x1024" name="1280x1024"/>
- <combo_box.item label="1600x1200" name="1600x1200"/>
- <combo_box.item label="Benutzerdefiniert" name="Custom"/>
- </combo_box>
- <combo_box label="Format" name="local_format_combo">
- <combo_box.item label="PNG" name="PNG"/>
- <combo_box.item label="JPEG" name="JPEG"/>
- <combo_box.item label="BMP" name="BMP"/>
- </combo_box>
- <spinner label="Breite" name="snapshot_width"/>
- <spinner label="Größe" name="snapshot_height"/>
- <check_box label="Seitenverhältnis beibehalten" name="keep_aspect_check"/>
- <slider label="Bildqualität" name="image_quality_slider"/>
- <text name="layer_type_label">
- Aufnehmen:
- </text>
- <combo_box label="Bildlayer" name="layer_types">
- <combo_box.item label="Farben" name="Colors"/>
- <combo_box.item label="Tiefe" name="Depth"/>
- </combo_box>
- <check_box label="Schnittstelle" name="ui_check"/>
- <check_box label="HUDs" name="hud_check"/>
- <check_box label="Nach dem Speichern offen lassen" name="keep_open_check"/>
- <check_box label="Frame einfrieren (Vollbild)" name="freeze_frame_check"/>
- <check_box label="Automatisch aktualisieren" name="auto_snapshot_check"/>
+ <panel name="advanced_options_panel">
+ <text name="advanced_options_label">
+ ERWEITERTE OPTIONEN
+ </text>
+ <text name="layer_type_label">
+ Aufnahme:
+ </text>
+ <combo_box label="Bildebenen" name="layer_types">
+ <combo_box.item label="Farben" name="Colors"/>
+ <combo_box.item label="Tiefe" name="Depth"/>
+ </combo_box>
+ <check_box label="Schnittstelle" name="ui_check"/>
+ <check_box label="HUDs" name="hud_check"/>
+ <check_box label="Standbild (Vollbild)" name="freeze_frame_check"/>
+ <check_box label="Automatisch aktualisieren" name="auto_snapshot_check"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_sound_devices.xml b/indra/newview/skins/default/xui/de/floater_sound_devices.xml
new file mode 100644
index 0000000000..22ccb2c1a2
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_sound_devices.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_sound_devices" title="SOUNDGERÄTE">
+ <text name="voice_label">
+ Voice-Chat
+ </text>
+ <check_box label="Aktiviert" name="enable_voice"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_stats.xml b/indra/newview/skins/default/xui/de/floater_stats.xml
index 1eb2dd4288..f6dc9fe15d 100644
--- a/indra/newview/skins/default/xui/de/floater_stats.xml
+++ b/indra/newview/skins/default/xui/de/floater_stats.xml
@@ -10,8 +10,8 @@
</stat_view>
<stat_view label="Erweitert" name="advanced">
<stat_view label="Darstellung" name="render">
- <stat_bar label="Gezeichnete KTris" name="ktrisframe"/>
- <stat_bar label="Gezeichnete KTris" name="ktrissec"/>
+ <stat_bar label="Pro Frame gezeichnete KTris" name="ktrisframe"/>
+ <stat_bar label="Pro Sek. gezeichnete KTris" name="ktrissec"/>
<stat_bar label="Objektanzahl" name="objs"/>
<stat_bar label="Neue Objekte" name="newobjs"/>
</stat_view>
@@ -32,7 +32,7 @@
<stat_bar label="Ebenen" name="layerskbitstat"/>
<stat_bar label="Tatsächlicher Eingang" name="actualinkbitstat"/>
<stat_bar label="Tatsächlicher Ausgang" name="actualoutkbitstat"/>
- <stat_bar label="VFS Ausstehende Ops" name="vfspendingoperations"/>
+ <stat_bar label="Ausstehende Vorgänge im VFS" name="vfspendingoperations"/>
</stat_view>
</stat_view>
<stat_view label="Simulator" name="sim">
@@ -64,6 +64,14 @@
<stat_bar label="Agent-Zeit" name="simagentmsec"/>
<stat_bar label="Bilder-Zeit" name="simimagesmsec"/>
<stat_bar label="Skript-Zeit" name="simscriptmsec"/>
+ <stat_bar label="Verbleib. Zeit" name="simsparemsec"/>
+ <stat_view label="Zeitdetails (ms)" name="timedetails">
+ <stat_bar label="Physik-Schritt" name="simsimphysicsstepmsec"/>
+ <stat_bar label="Phys. Formen aktualisieren" name="simsimphysicsshapeupdatemsec"/>
+ <stat_bar label="Physik – andere" name="simsimphysicsothermsec"/>
+ <stat_bar label="Schlafzeit" name="simsleepmsec"/>
+ <stat_bar label="Pump IO" name="simpumpiomsec"/>
+ </stat_view>
</stat_view>
</stat_view>
</container_view>
diff --git a/indra/newview/skins/default/xui/de/floater_test_layout_stacks.xml b/indra/newview/skins/default/xui/de/floater_test_layout_stacks.xml
new file mode 100644
index 0000000000..429447c378
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_test_layout_stacks.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Test Floater" title="LAYOUTSTACK-TESTS"/>
diff --git a/indra/newview/skins/default/xui/de/floater_test_text_vertical_aligment.xml b/indra/newview/skins/default/xui/de/floater_test_text_vertical_aligment.xml
new file mode 100644
index 0000000000..506d2b013a
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_test_text_vertical_aligment.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Test Floater" title="TEST-FENSTER"/>
diff --git a/indra/newview/skins/default/xui/de/floater_tools.xml b/indra/newview/skins/default/xui/de/floater_tools.xml
index 2d30814974..dee89b28e5 100644
--- a/indra/newview/skins/default/xui/de/floater_tools.xml
+++ b/indra/newview/skins/default/xui/de/floater_tools.xml
@@ -1,5 +1,20 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="toolbox floater" short_title="BAU-WERKZEUGE" title="">
+ <floater.string name="grid_screen_text">
+ Bildschirm
+ </floater.string>
+ <floater.string name="grid_local_text">
+ Lokal
+ </floater.string>
+ <floater.string name="grid_world_text">
+ Welt
+ </floater.string>
+ <floater.string name="grid_reference_text">
+ Referenz
+ </floater.string>
+ <floater.string name="grid_attachment_text">
+ Anhang
+ </floater.string>
<floater.string name="status_rotate">
An den farbigen Bändern ziehen, um das Objekt zu drehen
</floater.string>
@@ -24,20 +39,11 @@
<floater.string name="status_selectland">
Klicken und ziehen, um Land auszuwählen
</floater.string>
- <floater.string name="grid_screen_text">
- Bildschirm
+ <floater.string name="status_selectcount">
+ [OBJ_COUNT] Objekte ausgewählt, Auswirkung auf Land [LAND_IMPACT]
</floater.string>
- <floater.string name="grid_local_text">
- Lokal
- </floater.string>
- <floater.string name="grid_world_text">
- Welt
- </floater.string>
- <floater.string name="grid_reference_text">
- Referenz
- </floater.string>
- <floater.string name="grid_attachment_text">
- Anhang
+ <floater.string name="status_remaining_capacity">
+ Verbleibende Kapazität [LAND_CAPACITY].
</floater.string>
<button label="" label_selected="" name="button focus" tool_tip="Fokus"/>
<button label="" label_selected="" name="button move" tool_tip="Verschieben"/>
@@ -64,21 +70,20 @@
<radio_item label="Fläche auswählen" name="radio select face"/>
</radio_group>
<check_box label="Verknüpfte Teile bearbeiten" name="checkbox edit linked parts"/>
- <text name="RenderingCost" tool_tip="Zeigt die errechneten Wiedergabekosten für dieses Objekt">
- þ: [COUNT]
- </text>
+ <button label="Link" name="link_btn" width="30"/>
+ <button label="Verknüpfung auflösen" name="unlink_btn" width="126"/>
<check_box label="" name="checkbox uniform"/>
<text label="Beide Seiten dehnen" name="checkbox uniform label">
Beide Seiten dehnen
</text>
<check_box initial_value="true" label="Texturen dehnen" name="checkbox stretch textures" top_pad="-5"/>
- <check_box initial_value="true" label="An Raster ausrichten" name="checkbox snap to grid" top_pad="15"/>
- <combo_box name="combobox grid mode" tool_tip="Wählen Sie ein Rasterlineal zum Positionieren des Objekts aus.">
- <combo_box.item label="Globales Raster" name="World"/>
- <combo_box.item label="Lokales Raster" name="Local"/>
- <combo_box.item label="Referenzraster" name="Reference"/>
+ <check_box initial_value="true" label="Einrasten" name="checkbox snap to grid" top_pad="15"/>
+ <combo_box name="combobox grid mode" tool_tip="Wählen Sie das gewünschte Rasterlineal zum Positionieren des Objekts aus.">
+ <combo_box.item label="Welt" name="World"/>
+ <combo_box.item label="Lokal" name="Local"/>
+ <combo_box.item label="Referenz" name="Reference"/>
</combo_box>
- <button label="Optionen..." label_selected="Optionen..." name="Options..." tool_tip="Mehr Raster-Optionen anzeigen"/>
+ <button label="" label_selected="Optionen..." name="Options..." tool_tip="Mehr Raster-Optionen anzeigen"/>
<button label="" label_selected="" name="ToolCube" tool_tip="Würfel"/>
<button label="" label_selected="" name="ToolPrism" tool_tip="Prisma"/>
<button label="" label_selected="" name="ToolPyramid" tool_tip="Pyramide"/>
@@ -117,11 +122,11 @@
Stärke
</text>
<button label="Übernehmen" label_selected="Übernehmen" name="button apply to selection" tool_tip="Ausgewähltes Land bearbeiten"/>
- <text name="obj_count">
- Objekte: [COUNT]
+ <text name="selection_empty">
+ Nichts ausgewählt.
</text>
- <text name="prim_count">
- Primitive: [COUNT]
+ <text name="remaining_capacity">
+ [CAPACITY_STRING] [secondlife:///app/openfloater/object_weights Weitere Infos]
</text>
<tab_container name="Object Info Tabs">
<panel label="Allgemein" name="General">
@@ -170,15 +175,9 @@
<text name="Creator:">
Ersteller:
</text>
- <text name="Creator Name">
- Frau Esbee Linden (esbee.linden)
- </text>
<text name="Owner:">
Eigentümer:
</text>
- <text name="Owner Name">
- Frau Erica &quot;Elch&quot; Linden (erica.linden)
- </text>
<text name="Group:">
Gruppe:
</text>
@@ -273,15 +272,6 @@
<combo_box.item label="Ring" name="Ring"/>
<combo_box.item label="Geformt" name="Sculpted"/>
</combo_box>
- <combo_box name="material">
- <combo_box.item label="Stein" name="Stone"/>
- <combo_box.item label="Metall" name="Metal"/>
- <combo_box.item label="Glas" name="Glass"/>
- <combo_box.item label="Holz" name="Wood"/>
- <combo_box.item label="Fleisch" name="Flesh"/>
- <combo_box.item label="Kunststoff" name="Plastic"/>
- <combo_box.item label="Gummi" name="Rubber"/>
- </combo_box>
<text name="text cut">
Pfadschnitt (Anfang/Ende)
</text>
@@ -352,7 +342,6 @@
Naht
</text>
<combo_box name="sculpt type control">
- <combo_box.item label="(keiner)" name="None"/>
<combo_box.item label="Kugel" name="Sphere"/>
<combo_box.item label="Torus" name="Torus"/>
<combo_box.item label="Fläche" name="Plane"/>
@@ -360,6 +349,15 @@
</combo_box>
</panel>
<panel label="Eigenschaften" name="Features">
+ <panel.string name="None">
+ Keine
+ </panel.string>
+ <panel.string name="Prim">
+ Prim
+ </panel.string>
+ <panel.string name="Convex Hull">
+ Konvexe Hülle
+ </panel.string>
<text name="select_single">
Wählen Sie nur einen einzelnen Baustein aus, um Eigenschaften zu bearbeiten.
</text>
@@ -384,6 +382,23 @@
<spinner label="Fokus" name="Light Focus"/>
<spinner label="Abnehmend" name="Light Falloff"/>
<spinner label="Ambiente" name="Light Ambiance"/>
+ <text name="label physicsshapetype">
+ Art der physischen Form:
+ </text>
+ <combo_box name="Physics Shape Type Combo Ctrl" tool_tip="Art der physischen Form auswählen"/>
+ <combo_box name="material">
+ <combo_box.item label="Stein" name="Stone"/>
+ <combo_box.item label="Metall" name="Metal"/>
+ <combo_box.item label="Glas" name="Glass"/>
+ <combo_box.item label="Holz" name="Wood"/>
+ <combo_box.item label="Fleisch" name="Flesh"/>
+ <combo_box.item label="Plastik" name="Plastic"/>
+ <combo_box.item label="Gummi" name="Rubber"/>
+ </combo_box>
+ <spinner label="Schwerkraft" name="Physics Gravity"/>
+ <spinner label="Reibung" name="Physics Friction"/>
+ <spinner label="Dichte in 100 kg/m^3" name="Physics Density"/>
+ <spinner label="Restitution" name="Physics Restitution"/>
</panel>
<panel label="Textur" name="Texture">
<panel.string name="string repeats per meter">
diff --git a/indra/newview/skins/default/xui/de/floater_top_objects.xml b/indra/newview/skins/default/xui/de/floater_top_objects.xml
index dad550227e..d2055a53db 100644
--- a/indra/newview/skins/default/xui/de/floater_top_objects.xml
+++ b/indra/newview/skins/default/xui/de/floater_top_objects.xml
@@ -39,21 +39,18 @@
<text name="id_text">
Objekt-ID:
</text>
- <line_editor bg_readonly_color="clear" bottom_delta="3" enabled="false" follows="left|bottom|right" font="SansSerifSmall" height="20" left="80" name="id_editor" text_readonly_color="white" width="244"/>
- <button bottom_delta="0" follows="bottom|right" height="20" label="Beacon anzeigen" name="show_beacon_btn" right="-10" width="110"/>
+ <button label="Beacon anzeigen" name="show_beacon_btn"/>
<text name="obj_name_text">
Objektname:
- </text>
- <line_editor bg_readonly_color="clear" bottom_delta="3" enabled="false" follows="left|bottom|right" font="SansSerifSmall" height="20" left="80" name="object_name_editor" text_readonly_color="white" width="244"/>
- <button bottom_delta="0" follows="bottom|right" height="20" label="Filter" name="filter_object_btn" right="-10" width="110"/>
+ </text>
+ <button label="Filter" name="filter_object_btn"/>
<text name="owner_name_text">
Eigentümer:
- </text>
- <line_editor bg_readonly_color="clear" bottom_delta="3" enabled="true" follows="left|bottom|right" font="SansSerifSmall" height="20" left="106" name="owner_name_editor" text_readonly_color="white" width="218"/>
- <button bottom_delta="0" follows="bottom|right" height="20" label="Filter" name="filter_owner_btn" right="-10" width="110"/>
- <button bottom_delta="0" follows="bottom|right" height="20" label="Aktualisieren" name="refresh_btn" right="-10" width="110"/>
- <button bottom="35" follows="bottom|left" height="20" label="Auswahl zurückgeben" left="10" name="return_selected_btn" width="134"/>
- <button bottom="35" follows="bottom|left" height="20" label="Alle zurückgeben" left="150" name="return_all_btn" width="134"/>
- <button bottom="10" follows="bottom|left" height="20" label="Auswahl deaktivieren" left="10" name="disable_selected_btn" width="134"/>
- <button bottom="10" follows="bottom|left" height="20" label="Alle deaktivieren" left="150" name="disable_all_btn" width="134"/>
+ </text>
+ <button label="Filter" name="filter_owner_btn"/>
+ <button label="Aktualisieren" name="refresh_btn"/>
+ <button label="Auswahl zurückgeben" name="return_selected_btn" width="134"/>
+ <button label="Alle zurückgeben" left="150" name="return_all_btn" width="134"/>
+ <button label="Auswahl deaktivieren" name="disable_selected_btn" width="134"/>
+ <button label="Alle deaktivieren" left="150" name="disable_all_btn" width="134"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_tos.xml b/indra/newview/skins/default/xui/de/floater_tos.xml
index 1f3ef2f0b4..ba329371f8 100644
--- a/indra/newview/skins/default/xui/de/floater_tos.xml
+++ b/indra/newview/skins/default/xui/de/floater_tos.xml
@@ -4,7 +4,7 @@
http://secondlife.com/app/tos/
</floater.string>
<floater.string name="loading_url">
- data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Loading %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
+ data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Wird geladen %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3EServicebedingungen%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
</floater.string>
<button label="Weiter" label_selected="Weiter" name="Continue"/>
<button label="Abbrechen" label_selected="Abbrechen" name="Cancel"/>
diff --git a/indra/newview/skins/default/xui/de/floater_toybox.xml b/indra/newview/skins/default/xui/de/floater_toybox.xml
new file mode 100644
index 0000000000..90e50804d6
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_toybox.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Toybox" title="SYMBOLLEISTENSCHALTFLÄCHEN">
+ <text name="toybox label 1">
+ Sie können Schaltflächen durch Ziehen zu Symbolleisten hinzufügen oder daraus entfernen.
+ </text>
+ <text name="toybox label 2">
+ Je nach Einstellung erscheinen Schaltflächen wie dargestellt oder nur als Symbol.
+ </text>
+ <button label="Alle Symbolleisten leeren" label_selected="Alle Symbolleisten leeren" name="btn_clear_all"/>
+ <button label="Standards wiederherstellen" label_selected="Standards wiederherstellen" name="btn_restore_defaults"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_translation_settings.xml b/indra/newview/skins/default/xui/de/floater_translation_settings.xml
new file mode 100644
index 0000000000..3d5d1d46a8
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_translation_settings.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_translation_settings" title="ÃœBERSETZUNGSEINSTELLUNGEN FÃœR CHATS">
+ <string name="bing_api_key_not_verified">
+ Bing-AppID nicht verifiziert. Versuchen Sie es erneut.
+ </string>
+ <string name="google_api_key_not_verified">
+ Google-API-Schlüssel nicht verifiziert. Versuchen Sie es erneut.
+ </string>
+ <string name="bing_api_key_verified">
+ Bing-AppID verifiziert.
+ </string>
+ <string name="google_api_key_verified">
+ Google-API-Schlüssel verifiziert.
+ </string>
+ <check_box label="Maschinenübersetzung beim Chatten aktivieren" name="translate_chat_checkbox"/>
+ <text name="translate_language_label">
+ Chat übersetzen in:
+ </text>
+ <combo_box name="translate_language_combo">
+ <combo_box.item label="Systemstandard" name="System Default Language"/>
+ <combo_box.item label="English (Englisch)" name="English"/>
+ <combo_box.item label="Dansk (Dänisch)" name="Danish"/>
+ <combo_box.item label="Deutsch" name="German"/>
+ <combo_box.item label="Español (Spanisch)" name="Spanish"/>
+ <combo_box.item label="Français (Französisch)" name="French"/>
+ <combo_box.item label="Italiano (Italienisch)" name="Italian"/>
+ <combo_box.item label="Magyar (Ungarisch)" name="Hungarian"/>
+ <combo_box.item label="Nederlands (Holländisch)" name="Dutch"/>
+ <combo_box.item label="Polski (Polnisch)" name="Polish"/>
+ <combo_box.item label="Português (Portugiesisch)" name="Portugese"/>
+ <combo_box.item label="РуÑÑкий (Russisch)" name="Russian"/>
+ <combo_box.item label="Türkçe (Türkisch)" name="Turkish"/>
+ <combo_box.item label="УкраїнÑька (Ukrainisch)" name="Ukrainian"/>
+ <combo_box.item label="中文 (正體) (Chinesisch)" name="Chinese"/>
+ <combo_box.item label="日本語 (Japanisch)" name="Japanese"/>
+ <combo_box.item label="한국어 (Koreanisch)" name="Korean"/>
+ </combo_box>
+ <text name="tip">
+ Übersetzungsservice auswählen:
+ </text>
+ <radio_group name="translation_service_rg">
+ <radio_item initial_value="bing" label="Bing Translator" name="bing"/>
+ <radio_item initial_value="google" label="Google Translate" name="google"/>
+ </radio_group>
+ <text name="bing_api_key_label">
+ Bing-[http://www.bing.com/developers/createapp.aspx AppID]:
+ </text>
+ <button label="Verifizieren" name="verify_bing_api_key_btn"/>
+ <text name="google_api_key_label">
+ Google-[http://code.google.com/apis/language/translate/v2/getting_started.html#auth API-Schlüssel]:
+ </text>
+ <button label="Verifizieren" name="verify_google_api_key_btn"/>
+ <text name="google_links_text">
+ [http://code.google.com/apis/language/translate/v2/pricing.html Pricing] | [https://code.google.com/apis/console Statistik]
+ </text>
+ <button label="OK" name="ok_btn"/>
+ <button label="Abbrechen" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_voice_controls.xml b/indra/newview/skins/default/xui/de/floater_voice_controls.xml
index c97852b6e7..5efda4136e 100644
--- a/indra/newview/skins/default/xui/de/floater_voice_controls.xml
+++ b/indra/newview/skins/default/xui/de/floater_voice_controls.xml
@@ -1,16 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_voice_controls" title="Voice-Steuerung">
+<floater name="floater_voice_controls" title="SPRACHSTEUERUNGEN">
<string name="title_nearby">
- VOICE IN DER NÄHE
+ VOICE-EINSTELLUNGEN
</string>
<string name="title_group">
- Gruppengespräch mit [GROUP]
+ GRUPPENGESPRÄCH MIT [GROUP]
</string>
<string name="title_adhoc">
- Konferenzgespräch
+ KONFERENZGESPRÄCH
</string>
<string name="title_peer_2_peer">
- Gespräch mit [NAME]
+ GESPRÄCH MIT [NAME]
</string>
<string name="no_one_near">
Es ist niemand in der Nähe, der Voice aktiviert hat.
diff --git a/indra/newview/skins/default/xui/de/floater_voice_effect.xml b/indra/newview/skins/default/xui/de/floater_voice_effect.xml
index 21031cd556..413a46525c 100644
--- a/indra/newview/skins/default/xui/de/floater_voice_effect.xml
+++ b/indra/newview/skins/default/xui/de/floater_voice_effect.xml
@@ -12,6 +12,135 @@
<string name="new_voice_effect">
(Neu!)
</string>
+ <string name="effect_Arena">
+ Arena
+ </string>
+ <string name="effect_Beast">
+ Bestie
+ </string>
+ <string name="effect_Buff">
+ Muskulös
+ </string>
+ <string name="effect_Buzz">
+ Buzz
+ </string>
+ <string name="effect_Camille">
+ Camille
+ </string>
+ <string name="effect_Creepy">
+ Unheimlich
+ </string>
+ <string name="effect_CreepyBot">
+ UnheimlicherBot
+ </string>
+ <string name="effect_Cyber">
+ Cyber
+ </string>
+ <string name="effect_DeepBot">
+ TieferBot
+ </string>
+ <string name="effect_Demon">
+ Dämon
+ </string>
+ <string name="effect_Female Elf">
+ Weibliche Elfe
+ </string>
+ <string name="effect_Flirty">
+ Kokett
+ </string>
+ <string name="effect_Foxy">
+ Attraktiv
+ </string>
+ <string name="effect_Halloween 2010 Bonus">
+ Bonus_Halloween_2010
+ </string>
+ <string name="effect_Helium">
+ Helium
+ </string>
+ <string name="effect_Husky">
+ Rauchig
+ </string>
+ <string name="effect_Husky Whisper">
+ Rauchiges Flüstern
+ </string>
+ <string name="effect_Intercom">
+ Intercom
+ </string>
+ <string name="effect_Julia">
+ Julia
+ </string>
+ <string name="effect_Lo Lilt">
+ Leises Trällern
+ </string>
+ <string name="effect_Macho">
+ Macho
+ </string>
+ <string name="effect_Micro">
+ Micro
+ </string>
+ <string name="effect_Mini">
+ Mini
+ </string>
+ <string name="effect_Model">
+ Modell
+ </string>
+ <string name="effect_Nano">
+ Nano
+ </string>
+ <string name="effect_Nightmare">
+ Alptraum
+ </string>
+ <string name="effect_PopBot">
+ PopBot
+ </string>
+ <string name="effect_Rachel">
+ Rachel
+ </string>
+ <string name="effect_Radio">
+ Radio
+ </string>
+ <string name="effect_Robot">
+ Roboter
+ </string>
+ <string name="effect_Roxanne">
+ Roxanne
+ </string>
+ <string name="effect_Rumble">
+ Rumpeln
+ </string>
+ <string name="effect_Sabrina">
+ Sabrina
+ </string>
+ <string name="effect_Samantha">
+ Samantha
+ </string>
+ <string name="effect_Sexy">
+ Sexy
+ </string>
+ <string name="effect_Shorty">
+ Shorty
+ </string>
+ <string name="effect_Smaller">
+ Kleiner
+ </string>
+ <string name="effect_Sneaky">
+ Hinterhältig
+ </string>
+ <string name="effect_Stallion">
+ Hengst
+ </string>
+ <string name="effect_Sultry">
+ Feurig
+ </string>
+ <string name="effect_Thunder">
+ Donner
+ </string>
+ <string name="effect_Vixen">
+ Erotisch
+ </string>
+ <string name="effect_WhinyBot">
+ JammernderBot
+ </string>
<text name="preview_text">
Zur Vorschau
</text>
diff --git a/indra/newview/skins/default/xui/de/floater_water.xml b/indra/newview/skins/default/xui/de/floater_water.xml
deleted file mode 100644
index 097a60a444..0000000000
--- a/indra/newview/skins/default/xui/de/floater_water.xml
+++ /dev/null
@@ -1,71 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Water Floater" title="ERWEITERTER WASSER-EDITOR">
- <floater.string name="WLDefaultWaterNames">
- Default:Glassy:Pond:Murky:Second Plague:SNAKE!!!:Valdez
- </floater.string>
- <text name="KeyFramePresetsText" width="116">
- Voreinstellungen:
- </text>
- <button label="Neu" label_selected="Neu" name="WaterNewPreset"/>
- <button label="Speichern" label_selected="Speichern" name="WaterSavePreset"/>
- <button label="Löschen" label_selected="Löschen" name="WaterDeletePreset"/>
- <tab_container name="Water Tabs">
- <panel label="EINSTELLUNGEN" name="Settings">
- <text name="BHText">
- Wassertrübungsfarbe
- </text>
- <color_swatch name="WaterFogColor" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
- <text name="WaterFogDensText">
- Wassertrübungsdichte
- </text>
- <text name="WaterUnderWaterFogModText">
- Wassertrübungs-Modifikator
- </text>
- <slider bottom_delta="-34" name="WaterUnderWaterFogMod"/>
- <text name="BDensText">
- Reflexionswellengröße
- </text>
- <slider label="1" name="WaterNormalScaleX"/>
- <slider label="2" name="WaterNormalScaleY"/>
- <slider label="3" name="WaterNormalScaleZ"/>
- <text name="HDText">
- Fresnel-Skalierung
- </text>
- <text name="FresnelOffsetText">
- Fresnel-Versatz
- </text>
- <text name="DensMultText">
- Brechungsstärke oben
- </text>
- <text name="WaterScaleBelowText">
- Brechungsstärke unten
- </text>
- <text name="MaxAltText">
- Mischungsmultiplikator
- </text>
- </panel>
- <panel label="BILD" name="Waves">
- <text name="BHText">
- Richtung große Welle
- </text>
- <text name="WaterWave1DirXText">
- X
- </text>
- <text name="WaterWave1DirYText">
- Y
- </text>
- <text name="BHText2">
- Richtung kleine Welle
- </text>
- <text name="WaterWave2DirXText">
- X
- </text>
- <text name="WaterWave2DirYText">
- Y
- </text>
- <text name="BHText3">
- Normal-Map
- </text>
- </panel>
- </tab_container>
-</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_wearable_save_as.xml b/indra/newview/skins/default/xui/de/floater_wearable_save_as.xml
deleted file mode 100644
index f9b3552e8b..0000000000
--- a/indra/newview/skins/default/xui/de/floater_wearable_save_as.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="modal container" title=" ">
- <button label="Speichern" label_selected="Speichern" name="Save"/>
- <button label="Abbrechen" label_selected="Abbrechen" name="Cancel"/>
- <text name="Save item as:">
- Objekt in meinem Inventar speichern als:
- </text>
- <line_editor name="name ed">
- Neu [DESC]
- </line_editor>
-</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_web_content.xml b/indra/newview/skins/default/xui/de/floater_web_content.xml
new file mode 100644
index 0000000000..6ab119eeab
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_web_content.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_web_content" title="">
+ <layout_stack name="stack1">
+ <layout_panel name="nav_controls">
+ <button name="back" tool_tip="Rückwärts"/>
+ <button name="forward" tool_tip="Vorwärts"/>
+ <button name="stop" tool_tip="Navigation stoppen"/>
+ <button name="reload" tool_tip="Seite neu laden"/>
+ <combo_box name="address" tool_tip="URL hier eingeben"/>
+ <icon name="media_secure_lock_flag" tool_tip="Sicheres Browsen"/>
+ <button name="popexternal" tool_tip="Aktuelle URL im Desktop-Browser öffnen"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_windlight_options.xml b/indra/newview/skins/default/xui/de/floater_windlight_options.xml
deleted file mode 100644
index 5b59336f9d..0000000000
--- a/indra/newview/skins/default/xui/de/floater_windlight_options.xml
+++ /dev/null
@@ -1,189 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="WindLight floater" title="ERWEITERTER HIMMEL-EDITOR">
- <text name="KeyFramePresetsText">
- Voreinstellungen:
- </text>
- <button label="Neu" label_selected="Neu" name="WLNewPreset"/>
- <button label="Speichern" label_selected="Speichern" name="WLSavePreset"/>
- <button label="Löschen" label_selected="Löschen" name="WLDeletePreset"/>
- <button label="Tageszyklus-Editor" label_selected="Tageszyklus-Editor" name="WLDayCycleMenuButton"/>
- <tab_container name="WindLight Tabs">
- <panel label="ATMOSPHÄRE" name="Atmosphere">
- <text name="BHText">
- Horizontfarbe
- </text>
- <button label=" ?" name="WLBlueHorizonHelp"/>
- <text name="BHText2">
- R
- </text>
- <text name="BHText3">
- G
- </text>
- <text name="BHText4">
- B
- </text>
- <text name="BHText5">
- I
- </text>
- <text name="BDensText">
- Horizonttrübung
- </text>
- <button label=" ?" name="WLHazeHorizonHelp"/>
- <text name="BDensText2">
- Farbintensität
- </text>
- <button label=" ?" name="WLBlueDensityHelp"/>
- <text name="BHText6">
- R
- </text>
- <text name="BHText7">
- G
- </text>
- <text name="BHText8">
- B
- </text>
- <text name="BHText9">
- I
- </text>
- <text name="HDText">
- Trübungsintensität
- </text>
- <button label=" ?" name="WLHazeDensityHelp"/>
- <text name="DensMultText">
- Dichtemultiplikator
- </text>
- <button label=" ?" name="WLDensityMultHelp"/>
- <text name="WLDistanceMultText">
- Entfernungsmultiplikator
- </text>
- <button label=" ?" name="WLDistanceMultHelp"/>
- <text name="MaxAltText">
- Max. Höhe
- </text>
- <button label=" ?" name="WLMaxAltitudeHelp"/>
- </panel>
- <panel label="LICHT" name="Lighting">
- <text name="SLCText">
- Sonne/Mond-Farbe
- </text>
- <button label=" ?" name="WLSunlightColorHelp"/>
- <text name="BHText">
- R
- </text>
- <text name="BHText2">
- G
- </text>
- <text name="BHText3">
- B
- </text>
- <text name="BHText4">
- I
- </text>
- <text name="TODText">
- Sonne/Mond-Stand
- </text>
- <button label=" ?" name="WLTimeOfDayHelp"/>
- <text name="WLAmbientText">
- Umgebung
- </text>
- <button label=" ?" name="WLAmbientHelp"/>
- <text name="BHText5">
- R
- </text>
- <text name="BHText6">
- G
- </text>
- <text name="BHText7">
- B
- </text>
- <text name="BHText8">
- I
- </text>
- <text name="WLEastAngleText">
- Ostausrichtung
- </text>
- <button label=" ?" name="WLEastAngleHelp"/>
- <text name="SunGlowText">
- Sonnenleuchtkraft
- </text>
- <button label=" ?" name="WLSunGlowHelp"/>
- <slider label="Fokus " name="WLGlowB"/>
- <slider label="Größe " name="WLGlowR"/>
- <text name="SceneGammaText">
- Gamma in Szene
- </text>
- <button label=" ?" name="WLSceneGammaHelp"/>
- <text name="WLStarText">
- Sternenleuchtkraft
- </text>
- <button label=" ?" name="WLStarBrightnessHelp"/>
- </panel>
- <panel label="WOLKEN" name="Clouds">
- <text name="WLCloudColorText">
- Wolkenfarbe
- </text>
- <button label=" ?" name="WLCloudColorHelp"/>
- <text name="BHText">
- R
- </text>
- <text name="BHText2">
- G
- </text>
- <text name="BHText3">
- B
- </text>
- <text name="BHText4">
- I
- </text>
- <text name="WLCloudColorText2">
- Wolken-XY/Dichte
- </text>
- <button label=" ?" name="WLCloudDensityHelp"/>
- <text name="BHText5">
- X
- </text>
- <text name="BHText6">
- Y
- </text>
- <text name="BHText7">
- D
- </text>
- <text name="WLCloudCoverageText">
- Wolkendichte
- </text>
- <button label=" ?" name="WLCloudCoverageHelp"/>
- <text name="WLCloudScaleText">
- Wolkenskalierung
- </text>
- <button label=" ?" name="WLCloudScaleHelp"/>
- <text name="WLCloudDetailText">
- Wolkendetails (XY/Dichte)
- </text>
- <button label=" ?" name="WLCloudDetailHelp"/>
- <text name="BHText8">
- X
- </text>
- <text name="BHText9">
- Y
- </text>
- <text name="BHText10">
- D
- </text>
- <text name="WLCloudScrollXText">
- Wolkenbewegung X
- </text>
- <button label=" ?" name="WLCloudScrollXHelp"/>
- <check_box label="Fest" name="WLCloudLockX"/>
- <text name="WLCloudScrollYText">
- Wolkenbewegung Y
- </text>
- <button label=" ?" name="WLCloudScrollYHelp"/>
- <check_box label="Fest" name="WLCloudLockY"/>
- <check_box label="Klassische Wolken" name="DrawClassicClouds"/>
- <button label=" ?" name="WLClassicCloudsHelp"/>
- </panel>
- </tab_container>
- <string name="WLDefaultSkyNames">
- A-12AM:A-12PM:A-3AM:A-3PM:A-4.30PM:A-6AM:A-6PM:A-9AM:A-9PM:Barcelona:Blizzard:Blue Midday:Coastal Afternoon:Coastal Sunset:Default:Desert Sunset:Fine Day:Fluffy Big Clouds:Foggy:Funky Funky:Funky Funky Funky:Gelatto:Ghost:Incongruent Truths:Midday 1:Midday 2:Midday 3:Midday 4:Night:Pirate:Purple:Sailor&apos;s Delight:Sheer Sensuality
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/de/inspect_avatar.xml b/indra/newview/skins/default/xui/de/inspect_avatar.xml
index 92d9bc37c4..4b8fd8a0ad 100644
--- a/indra/newview/skins/default/xui/de/inspect_avatar.xml
+++ b/indra/newview/skins/default/xui/de/inspect_avatar.xml
@@ -10,9 +10,6 @@
<string name="Details">
[SL_PROFILE]
</string>
- <text name="user_name_small" value="Launische Produktengine mit langem Namen"/>
- <text name="user_name" value="Grumpity ProductEngine"/>
- <text name="user_slid" value="james.linden"/>
<text name="user_subtitle" value="11 Monate und 3 Tage alt"/>
<text name="user_details">
Dies ist meine Second Life-Beschreibung und ich finde sie wirklich gut! Meine Beschreibung ist deshalb so lang, weil ich gerne rede.
diff --git a/indra/newview/skins/default/xui/de/inspect_group.xml b/indra/newview/skins/default/xui/de/inspect_group.xml
index badb47bf08..60fa8ff0d8 100644
--- a/indra/newview/skins/default/xui/de/inspect_group.xml
+++ b/indra/newview/skins/default/xui/de/inspect_group.xml
@@ -16,9 +16,6 @@
<string name="YouAreMember">
Sie sind Mitglied
</string>
- <text name="group_name">
- Grumpitys schlecht gelaunte Elche
- </text>
<text name="group_subtitle">
123 Mitglieder
</text>
@@ -29,7 +26,7 @@ Hoch solln sie leben! Elche forever! Und auch Mungos!
<text name="group_cost">
Mitgliedschaft: 123 L$
</text>
- <button label="Zusammen" name="join_btn"/>
+ <button label="Beitreten" name="join_btn"/>
<button label="Verlassen" name="leave_btn"/>
<button label="Profil anzeigen" name="view_profile_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/language_settings.xml b/indra/newview/skins/default/xui/de/language_settings.xml
index d54f548fe1..f9346eef7d 100644
--- a/indra/newview/skins/default/xui/de/language_settings.xml
+++ b/indra/newview/skins/default/xui/de/language_settings.xml
@@ -4,6 +4,7 @@
<!-- Locale Information -->
<string name="MicrosoftLocale">german</string>
+ <string name="MacLocale">de_DE.UTF-8</string>
<string name="DarwinLocale">de_DE.UTF-8</string>
<string name="LinuxLocale">de_DE.UTF-8</string>
diff --git a/indra/newview/skins/default/xui/de/menu_attachment_self.xml b/indra/newview/skins/default/xui/de/menu_attachment_self.xml
index 644fc68ba4..325d52a22e 100644
--- a/indra/newview/skins/default/xui/de/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/de/menu_attachment_self.xml
@@ -5,7 +5,7 @@
<menu_item_call label="Abnehmen" name="Detach"/>
<menu_item_call label="Hinsetzen" name="Sit Down Here"/>
<menu_item_call label="Aufstehen" name="Stand Up"/>
- <menu_item_call label="Outfit ändern" name="Change Outfit"/>
+ <menu_item_call label="Mein Aussehen" name="Change Outfit"/>
<menu_item_call label="Mein Outfit bearbeiten" name="Edit Outfit"/>
<menu_item_call label="Meine Form bearbeiten" name="Edit My Shape"/>
<menu_item_call label="Meine Freunde" name="Friends..."/>
diff --git a/indra/newview/skins/default/xui/de/menu_avatar_self.xml b/indra/newview/skins/default/xui/de/menu_avatar_self.xml
index 582c76ac94..c49f4b198b 100644
--- a/indra/newview/skins/default/xui/de/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/de/menu_avatar_self.xml
@@ -14,6 +14,7 @@
<menu_item_call label="Unterhemd" name="Self Undershirt"/>
<menu_item_call label="Unterhose" name="Self Underpants"/>
<menu_item_call label="Tätowierung" name="Self Tattoo"/>
+ <menu_item_call label="Physik" name="Self Physics"/>
<menu_item_call label="Alpha" name="Self Alpha"/>
<menu_item_call label="Alle Kleider" name="All Clothes"/>
</context_menu>
@@ -21,7 +22,7 @@
<context_menu label="Abnehmen" name="Object Detach"/>
<menu_item_call label="Alles abnehmen" name="Detach All"/>
</context_menu>
- <menu_item_call label="Outfit ändern" name="Chenge Outfit"/>
+ <menu_item_call label="Mein Aussehen" name="Chenge Outfit"/>
<menu_item_call label="Mein Outfit bearbeiten" name="Edit Outfit"/>
<menu_item_call label="Meine Form bearbeiten" name="Edit My Shape"/>
<menu_item_call label="Meine Freunde" name="Friends..."/>
diff --git a/indra/newview/skins/default/xui/de/menu_bottomtray.xml b/indra/newview/skins/default/xui/de/menu_bottomtray.xml
index 6c4308286a..cb0082f944 100644
--- a/indra/newview/skins/default/xui/de/menu_bottomtray.xml
+++ b/indra/newview/skins/default/xui/de/menu_bottomtray.xml
@@ -1,14 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="hide_camera_move_controls_menu">
+ <menu_item_check label="Schaltfläche „Sprechen“" name="EnableVoiceChat"/>
<menu_item_check label="Schaltfläche Gesten" name="ShowGestureButton"/>
<menu_item_check label="Schaltfläche Bewegungssteuerung" name="ShowMoveButton"/>
<menu_item_check label="Schaltfläche Ansicht" name="ShowCameraButton"/>
<menu_item_check label="Schaltfläche Foto" name="ShowSnapshotButton"/>
- <menu_item_check label="Schaltfläche „Seitenleiste“" name="ShowSidebarButton"/>
<menu_item_check label="Schaltfläche „Bauen“" name="ShowBuildButton"/>
<menu_item_check label="Schaltfläche „Suchen“" name="ShowSearchButton"/>
<menu_item_check label="Schaltfläche „Karte“" name="ShowWorldMapButton"/>
- <menu_item_check label="Schaltfläche „Minikarte“" name="ShowMiniMapButton"/>
+ <menu_item_check label="Minikarten-Schaltfläche" name="ShowMiniMapButton"/>
<menu_item_call label="Ausschneiden" name="NearbyChatBar_Cut"/>
<menu_item_call label="Kopieren" name="NearbyChatBar_Copy"/>
<menu_item_call label="Einfügen" name="NearbyChatBar_Paste"/>
diff --git a/indra/newview/skins/default/xui/de/menu_hide_navbar.xml b/indra/newview/skins/default/xui/de/menu_hide_navbar.xml
index 9acf96dc6d..33d55e85bd 100644
--- a/indra/newview/skins/default/xui/de/menu_hide_navbar.xml
+++ b/indra/newview/skins/default/xui/de/menu_hide_navbar.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="hide_navbar_menu">
- <menu_item_check label="Navigationsleiste anzeigen" name="ShowNavbarNavigationPanel"/>
+ <menu_item_check label="Navigations- und Favoritenleiste anzeigen" name="ShowNavbarNavigationPanel"/>
<menu_item_check label="Favoritenleiste anzeigen" name="ShowNavbarFavoritesPanel"/>
<menu_item_check label="Mini-Standortleiste anzeigen" name="ShowMiniLocationPanel"/>
</menu>
diff --git a/indra/newview/skins/default/xui/de/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/de/menu_inspect_avatar_gear.xml
index edad34a1d5..641a0ceebe 100644
--- a/indra/newview/skins/default/xui/de/menu_inspect_avatar_gear.xml
+++ b/indra/newview/skins/default/xui/de/menu_inspect_avatar_gear.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<menu name="Gear Menu">
+<toggleable_menu name="Gear Menu">
<menu_item_call label="Profil anzeigen" name="view_profile"/>
<menu_item_call label="Freund hinzufügen" name="add_friend"/>
<menu_item_call label="IM" name="im"/>
@@ -11,9 +11,11 @@
<menu_item_call label="Melden" name="report"/>
<menu_item_call label="Einfrieren" name="freeze"/>
<menu_item_call label="Hinauswerfen" name="eject"/>
+ <menu_item_call label="Hinauswerfen" name="kick"/>
+ <menu_item_call label="CSR" name="csr"/>
<menu_item_call label="Fehler in Texturen beseitigen" name="debug"/>
<menu_item_call label="Auf Karte anzeigen" name="find_on_map"/>
<menu_item_call label="Hineinzoomen" name="zoom_in"/>
<menu_item_call label="Bezahlen" name="pay"/>
<menu_item_call label="Teilen" name="share"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_inspect_object_gear.xml b/indra/newview/skins/default/xui/de/menu_inspect_object_gear.xml
index 7c47913e30..73e0029b76 100644
--- a/indra/newview/skins/default/xui/de/menu_inspect_object_gear.xml
+++ b/indra/newview/skins/default/xui/de/menu_inspect_object_gear.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<menu name="Gear Menu">
+<toggleable_menu name="Gear Menu">
<menu_item_call label="Berühren" name="touch"/>
<menu_item_call label="Sitzen" name="sit"/>
<menu_item_call label="Bezahlen" name="pay"/>
@@ -12,7 +12,8 @@
<menu_item_call label="Hinzufügen" name="add"/>
<menu_item_call label="Melden" name="report"/>
<menu_item_call label="Ignorieren" name="block"/>
+ <menu_item_call label="Freischalten" name="unblock"/>
<menu_item_call label="Hineinzoomen" name="zoom_in"/>
<menu_item_call label="Entfernen" name="remove"/>
<menu_item_call label="Weitere Infos" name="more_info"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/de/menu_inspect_self_gear.xml
index 851a96cc09..5979194bfb 100644
--- a/indra/newview/skins/default/xui/de/menu_inspect_self_gear.xml
+++ b/indra/newview/skins/default/xui/de/menu_inspect_self_gear.xml
@@ -1,10 +1,31 @@
-<?xml version="1.0" encoding="utf-8"?>
-<menu name="Gear Menu">
- <menu_item_call label="Hinsetzen" name="sit_down_here"/>
- <menu_item_call label="Aufstehen" name="stand_up"/>
- <menu_item_call label="Outfit ändern" name="change_outfit"/>
- <menu_item_call label="Mein Profil" name="my_profile"/>
- <menu_item_call label="Meine Freunde" name="my_friends"/>
- <menu_item_call label="Meine Gruppen" name="my_groups"/>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Gear Menu">
+ <menu_item_call label="Hinsetzen" name="Sit Down Here"/>
+ <menu_item_call label="Aufstehen" name="Stand Up"/>
+ <context_menu label="Ausziehen" name="Take Off &gt;">
+ <context_menu label="Kleidung" name="Clothes &gt;">
+ <menu_item_call label="Hemd" name="Shirt"/>
+ <menu_item_call label="Hose" name="Pants"/>
+ <menu_item_call label="Rock" name="Skirt"/>
+ <menu_item_call label="Schuhe" name="Shoes"/>
+ <menu_item_call label="Strümpfe" name="Socks"/>
+ <menu_item_call label="Jacke" name="Jacket"/>
+ <menu_item_call label="Handschuhe" name="Gloves"/>
+ <menu_item_call label="Unterhemd" name="Self Undershirt"/>
+ <menu_item_call label="Unterhose" name="Self Underpants"/>
+ <menu_item_call label="Tätowierung" name="Self Tattoo"/>
+ <menu_item_call label="Alpha" name="Self Alpha"/>
+ <menu_item_call label="Alle Kleider" name="All Clothes"/>
+ </context_menu>
+ <context_menu label="HUD" name="Object Detach HUD"/>
+ <context_menu label="Abnehmen" name="Object Detach"/>
+ <menu_item_call label="Alles abnehmen" name="Detach All"/>
+ </context_menu>
+ <menu_item_call label="Outfit ändern" name="Chenge Outfit"/>
+ <menu_item_call label="Mein Outfit bearbeiten" name="Edit Outfit"/>
+ <menu_item_call label="Meine Form bearbeiten" name="Edit My Shape"/>
+ <menu_item_call label="Meine Freunde" name="Friends..."/>
+ <menu_item_call label="Meine Gruppen" name="Groups..."/>
+ <menu_item_call label="Mein Profil" name="Profile..."/>
<menu_item_call label="Fehler in Texturen beseitigen" name="Debug..."/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_inventory.xml b/indra/newview/skins/default/xui/de/menu_inventory.xml
index 43722e0dcf..39b3099336 100644
--- a/indra/newview/skins/default/xui/de/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/de/menu_inventory.xml
@@ -25,6 +25,7 @@
<menu_item_call label="Neue Unterhose" name="New Underpants"/>
<menu_item_call label="Neue Alpha-Maske" name="New Alpha Mask"/>
<menu_item_call label="Neue Tätowierung" name="New Tattoo"/>
+ <menu_item_call label="Neue Physik" name="New Physics"/>
</menu>
<menu label="Neue Körperteile" name="New Body Parts">
<menu_item_call label="Neue Form/Gestalt" name="New Shape"/>
@@ -58,6 +59,7 @@
<menu_item_call label="Eigenschaften" name="Properties"/>
<menu_item_call label="Umbenennen" name="Rename"/>
<menu_item_call label="Asset-UUID kopieren" name="Copy Asset UUID"/>
+ <menu_item_call label="Ausschneiden" name="Cut"/>
<menu_item_call label="Kopieren" name="Copy"/>
<menu_item_call label="Einfügen" name="Paste"/>
<menu_item_call label="Als Link einfügen" name="Paste As Link"/>
@@ -82,5 +84,7 @@
<menu_item_call label="Bearbeiten" name="Wearable Edit"/>
<menu_item_call label="Hinzufügen" name="Wearable Add"/>
<menu_item_call label="Ausziehen" name="Take Off"/>
+ <menu_item_call label="In Händler-Outbox kopieren" name="Merchant Copy"/>
+ <menu_item_call label="In Marktplatz übertragen" name="Marketplace Send"/>
<menu_item_call label="--keine Optionen--" name="--no options--"/>
</menu>
diff --git a/indra/newview/skins/default/xui/de/menu_inventory_add.xml b/indra/newview/skins/default/xui/de/menu_inventory_add.xml
index dccee6712d..af70c08ba1 100644
--- a/indra/newview/skins/default/xui/de/menu_inventory_add.xml
+++ b/indra/newview/skins/default/xui/de/menu_inventory_add.xml
@@ -4,6 +4,8 @@
<menu_item_call label="Bild ([COST] L$)..." name="Upload Image"/>
<menu_item_call label="Sound ([COST] L$)..." name="Upload Sound"/>
<menu_item_call label="Animation ([COST] L$)..." name="Upload Animation"/>
+ <menu_item_call label="Modell..." name="Upload Model"/>
+ <menu_item_call label="Modellassistent..." name="Upload Model Wizard"/>
<menu_item_call label="Mehrfach-Upload ([COST] L$ pro Datei)..." name="Bulk Upload"/>
<menu_item_call label="Hochlade-Berechtigungen (Standard) festlegen" name="perm prefs"/>
</menu>
@@ -23,6 +25,7 @@
<menu_item_call label="Neue Unterhose" name="New Underpants"/>
<menu_item_call label="Neues Alpha" name="New Alpha"/>
<menu_item_call label="Neue Tätowierung" name="New Tattoo"/>
+ <menu_item_call label="Neue Physik" name="New Physics"/>
</menu>
<menu label="Neue Körperteile" name="New Body Parts">
<menu_item_call label="Neue Form/Gestalt" name="New Shape"/>
diff --git a/indra/newview/skins/default/xui/de/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/de/menu_inventory_gear_default.xml
index 3fa68a27bd..48dec3e856 100644
--- a/indra/newview/skins/default/xui/de/menu_inventory_gear_default.xml
+++ b/indra/newview/skins/default/xui/de/menu_inventory_gear_default.xml
@@ -1,8 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_gear_default">
+<toggleable_menu name="menu_gear_default">
<menu_item_call label="Neues Inventar-Fenster" name="new_window"/>
- <menu_item_call label="Nach Name sortieren" name="sort_by_name"/>
- <menu_item_call label="Nach aktuellesten Objekten sortieren" name="sort_by_recent"/>
+ <menu_item_check label="Nach Name sortieren" name="sort_by_name"/>
+ <menu_item_check label="Nach aktuellesten Objekten sortieren" name="sort_by_recent"/>
+ <menu_item_check label="Ordner immer nach Namen sortieren" name="sort_folders_by_name"/>
+ <menu_item_check label="Systemordner nach oben" name="sort_system_folders_to_top"/>
<menu_item_call label="Filter anzeigen" name="show_filters"/>
<menu_item_call label="Filter zurücksetzen" name="reset_filters"/>
<menu_item_call label="Alle Ordner schließen" name="close_folders"/>
@@ -12,4 +14,4 @@
<menu_item_call label="Original suchen" name="Find Original"/>
<menu_item_call label="Alle Links suchen" name="Find All Links"/>
<menu_item_call label="Papierkorb ausleeren" name="empty_trash"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_login.xml b/indra/newview/skins/default/xui/de/menu_login.xml
index 70d31f93de..b43b41a5dc 100644
--- a/indra/newview/skins/default/xui/de/menu_login.xml
+++ b/indra/newview/skins/default/xui/de/menu_login.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu_bar name="Login Menu">
<menu label="Ich" name="File">
- <menu_item_call label="Einstellungen" name="Preferences..."/>
+ <menu_item_call label="Einstellungen..." name="Preferences..."/>
<menu_item_call label="[APP_NAME] schließen" name="Quit"/>
</menu>
<menu label="Hilfe" name="Help">
@@ -17,7 +17,8 @@
<menu_item_call label="Fenstergröße einstellen..." name="Set Window Size..."/>
<menu_item_call label="Servicebedingungen anzeigen" name="TOS"/>
<menu_item_call label="Wichtige Meldung anzeigen" name="Critical"/>
- <menu_item_call label="Web-Browser-Test" name="Web Browser Test"/>
+ <menu_item_call label="Web Content Floater Debug Test" name="Web Content Floater Debug Test"/>
+ <menu label="Protokollierungsstufe festlegen" name="Set Logging Level"/>
<menu_item_check label="Grid-Auswahl anzeigen" name="Show Grid Picker"/>
<menu_item_call label="Benachrichtigungs-Konsole anzeigen" name="Show Notifications Console"/>
</menu>
diff --git a/indra/newview/skins/default/xui/de/menu_media_ctrl.xml b/indra/newview/skins/default/xui/de/menu_media_ctrl.xml
new file mode 100644
index 0000000000..59c1c2ee86
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_media_ctrl.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="media ctrl context menu">
+ <menu_item_call label="Ausschneiden" name="Cut"/>
+ <menu_item_call label="Kopieren" name="Copy"/>
+ <menu_item_call label="Einfügen" name="Paste"/>
+ <menu_item_call label="Webinspektor öffnen" name="open_webinspector"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_mini_map.xml b/indra/newview/skins/default/xui/de/menu_mini_map.xml
index bec79be34d..2e0d72c40c 100644
--- a/indra/newview/skins/default/xui/de/menu_mini_map.xml
+++ b/indra/newview/skins/default/xui/de/menu_mini_map.xml
@@ -3,6 +3,7 @@
<menu_item_call label="Zoom Nah" name="Zoom Close"/>
<menu_item_call label="Zoom Mittel" name="Zoom Medium"/>
<menu_item_call label="Zoom Weit" name="Zoom Far"/>
+ <menu_item_call label="Zoom-Standard" name="Zoom Default"/>
<menu_item_check label="Karte drehen" name="Rotate Map"/>
<menu_item_check label="Automatisch zentrieren" name="Auto Center"/>
<menu_item_call label="Verfolgung abschalten" name="Stop Tracking"/>
diff --git a/indra/newview/skins/default/xui/de/menu_mode_change.xml b/indra/newview/skins/default/xui/de/menu_mode_change.xml
new file mode 100644
index 0000000000..b8090018b7
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_mode_change.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Mode Change">
+ <menu_item_check label="Basis" name="BasicMode"/>
+ <menu_item_check label="Erweitert" name="AdvancedMode"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_model_import_gear_default.xml b/indra/newview/skins/default/xui/de/menu_model_import_gear_default.xml
new file mode 100644
index 0000000000..e1faeedcde
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_model_import_gear_default.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="model_menu_gear_default">
+ <menu_item_check label="Kanten anzeigen" name="show_edges"/>
+ <menu_item_check label="Physik anzeigen" name="show_physics"/>
+ <menu_item_check label="Texturen anzeigen" name="show_textures"/>
+ <menu_item_check label="Skingewicht anzeigen" name="show_skin_weight"/>
+ <menu_item_check label="Gelenkpositionen anzeigen" name="show_joint_positions"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_object.xml b/indra/newview/skins/default/xui/de/menu_object.xml
index 19057d4228..412bd3ac04 100644
--- a/indra/newview/skins/default/xui/de/menu_object.xml
+++ b/indra/newview/skins/default/xui/de/menu_object.xml
@@ -16,14 +16,14 @@
<context_menu label="Anhängen" name="Object Attach"/>
<context_menu label="HUD anhängen" name="Object Attach HUD"/>
</context_menu>
- <context_menu label="Entfernen" name="Remove">
+ <context_menu label="Verwalten" name="Remove">
<menu_item_call label="Missbrauch melden" name="Report Abuse..."/>
<menu_item_call label="Ignorieren" name="Object Mute"/>
<menu_item_call label="Zurückgeben" name="Return..."/>
- <menu_item_call label="Löschen" name="Delete"/>
</context_menu>
<menu_item_call label="Nehmen" name="Pie Object Take"/>
<menu_item_call label="Kopie nehmen" name="Take Copy"/>
<menu_item_call label="Bezahlen" name="Pay..."/>
<menu_item_call label="Kaufen" name="Buy..."/>
+ <menu_item_call label="Löschen" name="Delete"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_outfit_gear.xml b/indra/newview/skins/default/xui/de/menu_outfit_gear.xml
index 897154ec56..d56c93533c 100644
--- a/indra/newview/skins/default/xui/de/menu_outfit_gear.xml
+++ b/indra/newview/skins/default/xui/de/menu_outfit_gear.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Gear Outfit">
+<toggleable_menu name="Gear Outfit">
<menu_item_call label="Anziehen - Aktuelles Outfit ersetzen" name="wear"/>
<menu_item_call label="Anziehen - Aktuelles Outfit hinzufügen" name="wear_add"/>
<menu_item_call label="Ausziehen - Aus aktuellem Outfit entfernen" name="take_off"/>
@@ -14,6 +14,7 @@
<menu_item_call label="Neues Unterhemd" name="New Undershirt"/>
<menu_item_call label="Neue Unterhose" name="New Underpants"/>
<menu_item_call label="Neues Alpha" name="New Alpha"/>
+ <menu_item_call label="Neue Physik" name="New Physics"/>
<menu_item_call label="Neue Tätowierung" name="New Tattoo"/>
</menu>
<menu label="Neue Körperteile" name="New Body Parts">
@@ -24,4 +25,4 @@
</menu>
<menu_item_call label="Outfit neu benennen" name="rename"/>
<menu_item_call label="Outfit löschen" name="delete_outfit"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_people_nearby_view_sort.xml b/indra/newview/skins/default/xui/de/menu_people_nearby_view_sort.xml
index 0f252ab46d..a001544f3e 100644
--- a/indra/newview/skins/default/xui/de/menu_people_nearby_view_sort.xml
+++ b/indra/newview/skins/default/xui/de/menu_people_nearby_view_sort.xml
@@ -1,8 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
+<toggleable_menu name="menu_group_plus">
<menu_item_check label="Nach letzten Sprechern sortieren" name="sort_by_recent_speakers"/>
<menu_item_check label="Nach Name sortieren" name="sort_name"/>
<menu_item_check label="Nach Entfernung sortieren" name="sort_distance"/>
<menu_item_check label="Symbole für Personen anzeigen" name="view_icons"/>
+ <menu_item_check label="Karte anzeigen" name="view_map"/>
<menu_item_call label="Ignorierte Einwohner &amp; Objekte anzeigen" name="show_blocked_list"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/de/menu_places_gear_folder.xml
index 132d3f6466..892f075d3c 100644
--- a/indra/newview/skins/default/xui/de/menu_places_gear_folder.xml
+++ b/indra/newview/skins/default/xui/de/menu_places_gear_folder.xml
@@ -1,7 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_folder_gear">
+<toggleable_menu name="menu_folder_gear">
<menu_item_call label="Landmarke hinzufügen" name="add_landmark"/>
<menu_item_call label="Ordner hinzufügen" name="add_folder"/>
+ <menu_item_call label="Objekt wiederherstellen" name="restore_item"/>
<menu_item_call label="Ausschneiden" name="cut"/>
<menu_item_call label="Kopieren" name="copy_folder"/>
<menu_item_call label="Einfügen" name="paste"/>
@@ -12,4 +13,4 @@
<menu_item_call label="Alle Ordner aufklappen" name="expand_all"/>
<menu_item_call label="Alle Ordner schließen" name="collapse_all"/>
<menu_item_check label="Nach Datum sortieren" name="sort_by_date"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/de/menu_places_gear_landmark.xml
index 6af4d644af..8955f797a2 100644
--- a/indra/newview/skins/default/xui/de/menu_places_gear_landmark.xml
+++ b/indra/newview/skins/default/xui/de/menu_places_gear_landmark.xml
@@ -1,10 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_ladmark_gear">
+<toggleable_menu name="menu_ladmark_gear">
<menu_item_call label="Teleportieren" name="teleport"/>
<menu_item_call label="Weitere Informationen" name="more_info"/>
<menu_item_call label="Auf Karte zeigen" name="show_on_map"/>
<menu_item_call label="Landmarke hinzufügen" name="add_landmark"/>
<menu_item_call label="Ordner hinzufügen" name="add_folder"/>
+ <menu_item_call label="Objekt wiederherstellen" name="restore_item"/>
<menu_item_call label="Ausschneiden" name="cut"/>
<menu_item_call label="Landmarke kopieren" name="copy_landmark"/>
<menu_item_call label="SLurl kopieren" name="copy_slurl"/>
@@ -15,4 +16,4 @@
<menu_item_call label="Alle Ordner schließen" name="collapse_all"/>
<menu_item_check label="Nach Datum sortieren" name="sort_by_date"/>
<menu_item_call label="Auswahl erstellen" name="create_pick"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_toolbars.xml b/indra/newview/skins/default/xui/de/menu_toolbars.xml
new file mode 100644
index 0000000000..3fb48e26b2
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_toolbars.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Toolbars Popup">
+ <menu_item_call label="Diese Schaltfläche entfernen" name="Remove button"/>
+ <menu_item_call label="Symbolleistenschaltflächen..." name="Choose Buttons"/>
+ <menu_item_check label="Symbole und Beschriftungen" name="icons_with_text"/>
+ <menu_item_check label="Nur Symbole" name="icons_only"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_viewer.xml b/indra/newview/skins/default/xui/de/menu_viewer.xml
index 489990608f..d011c7295c 100644
--- a/indra/newview/skins/default/xui/de/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/de/menu_viewer.xml
@@ -1,62 +1,92 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu_bar name="Main Menu">
<menu label="Ich" name="Me">
- <menu_item_call label="Einstellungen" name="Preferences"/>
- <menu_item_call label="Meine Startseite" name="Manage My Account">
- <menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=de"/>
- </menu_item_call>
- <menu_item_call label="L$ kaufen" name="Buy and Sell L$"/>
- <menu_item_call label="Mein Profil" name="Profile"/>
- <menu_item_call label="Outfit ändern" name="ChangeOutfit"/>
- <menu_item_check label="Mein Inventar" name="Inventory"/>
- <menu_item_check label="Mein Inventar" name="ShowSidetrayInventory"/>
- <menu_item_check label="Meine Gesten" name="Gestures"/>
- <menu_item_check label="Meine Stimme" name="ShowVoice"/>
- <menu label="Mein Status" name="Status">
+ <menu_item_call label="Profil..." name="Profile"/>
+ <menu_item_call label="Aussehen..." name="ChangeOutfit"/>
+ <menu_item_call label="Avatar auswählen..." name="Avatar Picker"/>
+ <menu_item_check label="Inventar..." name="Inventory"/>
+ <menu_item_call label="Neues Inventarfenster" name="NewInventoryWindow"/>
+ <menu_item_call label="Orte..." name="Places"/>
+ <menu_item_call label="Auswahlen..." name="Picks"/>
+ <menu_item_call label="Kamerasteuerungen..." name="Camera Controls"/>
+ <menu label="Bewegung" name="Movement">
+ <menu_item_call label="Hinsetzen" name="Sit Down Here"/>
+ <menu_item_check label="Fliegen" name="Fly"/>
+ <menu_item_check label="Immer rennen" name="Always Run"/>
+ <menu_item_call label="Animation meines Avatars stoppen" name="Stop Animating My Avatar"/>
+ <menu_item_call label="Gehen/Rennen/Fliegen..." name="Walk / run / fly"/>
+ </menu>
+ <menu label="Status" name="Status">
<menu_item_call label="Abwesend" name="Set Away"/>
<menu_item_call label="Beschäftigt" name="Set Busy"/>
</menu>
- <menu_item_call label="Admin-Status anfordern" name="Request Admin Options"/>
- <menu_item_call label="Admin-Status verlassen" name="Leave Admin Options"/>
+ <menu_item_call label="L$ kaufen..." name="Buy and Sell L$"/>
+ <menu_item_call label="Händler-Outbox..." name="MerchantOutbox"/>
+ <menu_item_call label="Kontoübersicht..." name="Manage My Account">
+ <menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=de"/>
+ </menu_item_call>
+ <menu_item_call label="Einstellungen..." name="Preferences"/>
+ <menu_item_call label="Symbolleistenschaltflächen..." name="Toolbars"/>
+ <menu_item_call label="Alle Steuerelemente ausblenden" name="Hide UI"/>
<menu_item_call label="[APP_NAME] schließen" name="Quit"/>
</menu>
<menu label="Unterhalten" name="Communicate">
- <menu_item_call label="Meine Freunde" name="My Friends"/>
- <menu_item_call label="Meine Gruppen" name="My Groups"/>
- <menu_item_check label="Chat in der Nähe" name="Nearby Chat"/>
+ <menu_item_check label="Chat..." name="Nearby Chat"/>
+ <menu_item_check label="Sprechen" name="Speak"/>
+ <menu_item_check label="Voice-Einstellungen..." name="Nearby Voice"/>
+ <menu_item_check label="Voice-Morphing..." name="ShowVoice"/>
+ <menu_item_check label="Gesten..." name="Gestures"/>
+ <menu_item_call label="Freunde" name="My Friends"/>
+ <menu_item_call label="Gruppen" name="My Groups"/>
<menu_item_call label="Leute in der Nähe" name="Active Speakers"/>
</menu>
<menu label="Welt" name="World">
- <menu_item_check label="Minikarte" name="Mini-Map"/>
+ <menu_item_call label="Landmarke für diesen Ort setzen" name="Create Landmark Here"/>
+ <menu_item_call label="Ziele..." name="Destinations"/>
<menu_item_check label="Karte" name="World Map"/>
+ <menu_item_check label="Minikarte" name="Mini-Map"/>
+ <menu_item_check label="Suchen" name="Search"/>
+ <menu_item_call label="Nach Hause teleportieren" name="Teleport Home"/>
+ <menu_item_call label="Hier als Zuhause wählen" name="Set Home to Here"/>
<menu_item_call label="Foto" name="Take Snapshot"/>
- <menu_item_call label="Landmarke für diesen Ort setzen" name="Create Landmark Here"/>
- <menu label="Ortsprofil" name="Land">
- <menu_item_call label="Ortsprofil" name="Place Profile"/>
- <menu_item_call label="Land-Info" name="About Land"/>
- <menu_item_call label="Region/Grundbesitz" name="Region/Estate"/>
- </menu>
+ <menu_item_call label="Ortsprofil" name="Place Profile"/>
+ <menu_item_call label="Landinformationen" name="About Land"/>
+ <menu_item_call label="Region/Grundbesitz" name="Region/Estate"/>
+ <menu_item_call label="Mein Landbesitz..." name="My Land"/>
<menu_item_call label="Dieses Land kaufen" name="Buy Land"/>
- <menu_item_call label="Mein Land" name="My Land"/>
<menu label="Anzeigen" name="LandShow">
- <menu_item_check label="Bewegungssteuerung" name="Movement Controls"/>
- <menu_item_check label="Ansichtsteuerung" name="Camera Controls"/>
<menu_item_check label="Bannlinien" name="Ban Lines"/>
<menu_item_check label="Strahlen" name="beacons"/>
<menu_item_check label="Grundstücksgrenzen" name="Property Lines"/>
<menu_item_check label="Landeigentümer" name="Land Owners"/>
<menu_item_check label="Koordinaten" name="Coordinates"/>
<menu_item_check label="Parzelleneigenschaften" name="Parcel Properties"/>
+ <menu_item_check label="Menü „Erweitert“" name="Show Advanced Menu"/>
</menu>
- <menu_item_call label="Teleport nach Hause" name="Teleport Home"/>
- <menu_item_call label="Hier als Zuhause wählen" name="Set Home to Here"/>
- <menu label="Sonne" name="Environment Settings">
+ <menu label="Sonne" name="Sun">
<menu_item_call label="Sonnenaufgang" name="Sunrise"/>
<menu_item_call label="Mittag" name="Noon"/>
<menu_item_call label="Sonnenuntergang" name="Sunset"/>
<menu_item_call label="Mitternacht" name="Midnight"/>
- <menu_item_call label="Grundbesitzzeit" name="Revert to Region Default"/>
- <menu_item_call label="Umwelt-Editor" name="Environment Editor"/>
+ <menu_item_call label="Regionseinstellungen verwenden" name="Use Region Settings"/>
+ </menu>
+ <menu label="Umwelt-Editor" name="Environment Editor">
+ <menu_item_call label="Umwelt-Einstellungen..." name="Environment Settings"/>
+ <menu label="Wasser-Voreinstellungen" name="Water Presets">
+ <menu_item_call label="Neue Voreinstellung..." name="new_water_preset"/>
+ <menu_item_call label="Voreinstellung bearbeiten..." name="edit_water_preset"/>
+ <menu_item_call label="Voreinstellung löschen..." name="delete_water_preset"/>
+ </menu>
+ <menu label="Himmel-Voreinstellungen" name="Sky Presets">
+ <menu_item_call label="Neue Voreinstellung..." name="new_sky_preset"/>
+ <menu_item_call label="Voreinstellung bearbeiten..." name="edit_sky_preset"/>
+ <menu_item_call label="Voreinstellung löschen..." name="delete_sky_preset"/>
+ </menu>
+ <menu label="Tag-Voreinstellungen" name="Day Presets">
+ <menu_item_call label="Neue Voreinstellung..." name="new_day_preset"/>
+ <menu_item_call label="Voreinstellung bearbeiten..." name="edit_day_preset"/>
+ <menu_item_call label="Voreinstellung löschen..." name="delete_day_preset"/>
+ </menu>
</menu>
</menu>
<menu label="Bauen" name="BuildTools">
@@ -112,18 +142,21 @@
<menu_item_call label="Bild ([COST] L$)..." name="Upload Image"/>
<menu_item_call label="Sound ([COST] L$)..." name="Upload Sound"/>
<menu_item_call label="Animation ([COST] L$)..." name="Upload Animation"/>
+ <menu_item_call label="Modell..." name="Upload Model"/>
<menu_item_call label="Mehrfach-Upload ([COST] L$ pro Datei)..." name="Bulk Upload"/>
+ <menu_item_call label="Hochlade-Berechtigungen (Standard) festlegen" name="perm prefs"/>
</menu>
+ <menu_item_call label="Rückgängig" name="Undo"/>
+ <menu_item_call label="Wiederholen" name="Redo"/>
</menu>
<menu label="Hilfe" name="Help">
+ <menu_item_call label="Anweisungen..." name="How To"/>
<menu_item_call label="[SECOND_LIFE]-Hilfe" name="Second Life Help"/>
<menu_item_call label="Missbrauch melden" name="Report Abuse"/>
<menu_item_call label="Fehler melden" name="Report Bug"/>
<menu_item_call label="INFO ÃœBER [APP_NAME]" name="About Second Life"/>
- <menu_item_check label="Hinweise aktivieren" name="Enable Hints"/>
</menu>
<menu label="Erweitert" name="Advanced">
- <menu_item_call label="Animation meines Avatars stoppen" name="Stop Animating My Avatar"/>
<menu_item_call label="Textur neu laden" name="Rebake Texture"/>
<menu_item_call label="UI-Größe auf Standard setzen" name="Set UI Size to Default"/>
<menu_item_call label="Fenstergröße einstellen..." name="Set Window Size..."/>
@@ -131,11 +164,10 @@
<menu_item_check label="Kamerabeschränkungen deaktivieren" name="Disable Camera Distance"/>
<menu_item_check label="Foto (hohe Auflösung)" name="HighResSnapshot"/>
<menu_item_check label="Fotos auf Festplatte leise speichern" name="QuietSnapshotsToDisk"/>
- <menu_item_check label="Fotos auf Festplatte komprimieren" name="CompressSnapshotsToDisk"/>
<menu label="Performance Tools" name="Performance Tools">
<menu_item_call label="Lag-Anzeige" name="Lag Meter"/>
<menu_item_check label="Statistikleiste" name="Statistics Bar"/>
- <menu_item_check label="Avatar-Darstellungskosten anzeigen" name="Avatar Rendering Cost"/>
+ <menu_item_check label="Zuggewicht für Avatare anzeigen" name="Avatar Rendering Cost"/>
</menu>
<menu label="Hervorhebung und Sichtbarkeit" name="Highlighting and Visibility">
<menu_item_check label="Pulsierender Strahl" name="Cheesy Beacon"/>
@@ -146,22 +178,22 @@
<menu_item_check label="Fadenkreuz für Mouselook anzeigen" name="ShowCrosshairs"/>
</menu>
<menu label="Darstellungstypen" name="Rendering Types">
- <menu_item_check label="Einfach" name="Simple"/>
- <menu_item_check label="Alpha" name="Alpha"/>
- <menu_item_check label="Baum" name="Tree"/>
- <menu_item_check label="Avatare" name="Character"/>
- <menu_item_check label="SurfacePath" name="SurfacePath"/>
- <menu_item_check label="Himmel" name="Sky"/>
- <menu_item_check label="Wasser" name="Water"/>
- <menu_item_check label="Boden" name="Ground"/>
- <menu_item_check label="Volumen" name="Volume"/>
- <menu_item_check label="Gras" name="Grass"/>
- <menu_item_check label="Wolken" name="Clouds"/>
- <menu_item_check label="Partikel" name="Particles"/>
- <menu_item_check label="Unebenheiten" name="Bump"/>
+ <menu_item_check label="Einfach" name="Rendering Type Simple"/>
+ <menu_item_check label="Alpha" name="Rendering Type Alpha"/>
+ <menu_item_check label="Baum" name="Rendering Type Tree"/>
+ <menu_item_check label="Avatare" name="Rendering Type Character"/>
+ <menu_item_check label="Flächenpatch" name="Rendering Type Surface Patch"/>
+ <menu_item_check label="Himmel" name="Rendering Type Sky"/>
+ <menu_item_check label="Wasser" name="Rendering Type Water"/>
+ <menu_item_check label="Boden" name="Rendering Type Ground"/>
+ <menu_item_check label="Volumen" name="Rendering Type Volume"/>
+ <menu_item_check label="Gras" name="Rendering Type Grass"/>
+ <menu_item_check label="Wolken" name="Rendering Type Clouds"/>
+ <menu_item_check label="Partikel" name="Rendering Type Particles"/>
+ <menu_item_check label="Unebenheiten" name="Rendering Type Bump"/>
</menu>
<menu label="Rendering-Eigenschaften" name="Rendering Features">
- <menu_item_check label="UI" name="UI"/>
+ <menu_item_check label="UI" name="ToggleUI"/>
<menu_item_check label="Ausgewählt" name="Selected"/>
<menu_item_check label="Farblich hervorgehoben" name="Highlighted"/>
<menu_item_check label="Dynamische Texturen" name="Dynamic Textures"/>
@@ -173,13 +205,9 @@
<menu_item_check label="Plugin Read Thread verwenden" name="Use Plugin Read Thread"/>
<menu_item_call label="Gruppen-Cache löschen" name="ClearGroupCache"/>
<menu_item_check label="Weiche Mausbewegung" name="Mouse Smoothing"/>
+ <menu_item_call label="Tasten freigeben" name="Release Keys"/>
<menu label="Tastaturkürzel" name="Shortcuts">
- <menu_item_call label="Bild ([COST] L$)..." name="Upload Image"/>
- <menu_item_check label="Suchen" name="Search"/>
- <menu_item_call label="Tasten freigeben" name="Release Keys"/>
- <menu_item_call label="UI-Größe auf Standard setzen" name="Set UI Size to Default"/>
- <menu_item_check label="Immer rennen" name="Always Run"/>
- <menu_item_check label="Fliegen" name="Fly"/>
+ <menu_item_check label="Erweitert-Menü anzeigen - veraltetet" name="Show Advanced Menu - legacy shortcut"/>
<menu_item_call label="Fenster schließen" name="Close Window"/>
<menu_item_call label="Alle Fenster schließen" name="Close All Windows"/>
<menu_item_call label="Foto auf Datenträger" name="Snapshot to Disk"/>
@@ -187,17 +215,9 @@
<menu_item_check label="Joystick-Flycam" name="Joystick Flycam"/>
<menu_item_call label="Ansicht zurücksetzen" name="Reset View"/>
<menu_item_call label="Letzten Chatter ansehen" name="Look at Last Chatter"/>
- <menu label="Bauwerkzeug auswählen" name="Select Tool">
- <menu_item_call label="Fokus-Werkzeug" name="Focus"/>
- <menu_item_call label="Werkzeug „Bewegen“" name="Move"/>
- <menu_item_call label="Bearbeiten" name="Edit"/>
- <menu_item_call label="Werkzeug „Erstellen&quot;" name="Create"/>
- <menu_item_call label="Land-Werkzeug" name="Land"/>
- </menu>
<menu_item_call label="Hineinzoomen" name="Zoom In"/>
<menu_item_call label="Zoom-Standard" name="Zoom Default"/>
<menu_item_call label="Wegzoomen" name="Zoom Out"/>
- <menu_item_check label="Menü „Erweitert“ anzeigen" name="Show Advanced Menu"/>
</menu>
<menu_item_call label="Debug-Einstellungen anzeigen" name="Debug Settings"/>
<menu_item_check label="Menü „Entwickler“ anzeigen" name="Debug Mode"/>
@@ -211,6 +231,7 @@
<menu_item_check label="Texture-Kategorie" name="Texture Category"/>
<menu_item_check label="Schnelle Timer" name="Fast Timers"/>
<menu_item_check label="Speicher" name="Memory"/>
+ <menu_item_check label="Szenestatistiken" name="Scene Statistics"/>
<menu_item_call label="Info zu Region in Fenster Fehler beseitigen" name="Region Info to Debug Console"/>
<menu_item_call label="Gruppeninfo in Fenster Fehler beseitigen" name="Group Info to Debug Console"/>
<menu_item_call label="Info zu Fähigkeiten in Fenster Fehler beseitigen" name="Capabilities Info to Debug Console"/>
@@ -221,9 +242,13 @@
</menu>
<menu label="Info anzeigen" name="Display Info">
<menu_item_check label="Zeit anzeigen" name="Show Time"/>
+ <menu_item_check label="Kosten für Hochladen anzeigen" name="Show Upload Cost"/>
<menu_item_check label="Render-Info anzeigen" name="Show Render Info"/>
+ <menu_item_check label="Texturinfos anzeigen" name="Show Texture Info"/>
<menu_item_check label="Matrizen anzeigen" name="Show Matrices"/>
<menu_item_check label="Farbe unter Cursor anzeigen" name="Show Color Under Cursor"/>
+ <menu_item_check label="Speicher anzeigen" name="Show Memory"/>
+ <menu_item_check label="Info über privaten Speicher anzeigen" name="Show Private Mem Info"/>
<menu_item_check label="Akutalisierungen an Objekten anzeigen" name="Show Updates"/>
</menu>
<menu label="Fehler erzwingen" name="Force Errors">
@@ -244,17 +269,26 @@
</menu>
<menu label="Metadaten darstellen" name="Render Metadata">
<menu_item_check label="Bonding Boxes" name="Bounding Boxes"/>
+ <menu_item_check label="Normalen" name="Normals"/>
<menu_item_check label="Octree" name="Octree"/>
<menu_item_check label="Shadow Frusta" name="Shadow Frusta"/>
+ <menu_item_check label="Physische Formen" name="Physics Shapes"/>
<menu_item_check label="Okklusion" name="Occlusion"/>
<menu_item_check label="Bündel rendern" name="Render Batches"/>
+ <menu_item_check label="Typ aktualisieren" name="Update Type"/>
<menu_item_check label="Texture-Anim" name="Texture Anim"/>
<menu_item_check label="Textur-Priorität" name="Texture Priority"/>
<menu_item_check label="Texturbereich" name="Texture Area"/>
<menu_item_check label="Oberflächenbereich" name="Face Area"/>
+ <menu_item_check label="Detailstufeninfos" name="LOD Info"/>
+ <menu_item_check label="Konstruktionswarteschlange" name="Build Queue"/>
<menu_item_check label="Lichter" name="Lights"/>
<menu_item_check label="Gelenkpunkte" name="Collision Skeleton"/>
<menu_item_check label="Raycast" name="Raycast"/>
+ <menu_item_check label="Windvektoren" name="Wind Vectors"/>
+ <menu_item_check label="Komplexität beim Rendern" name="rendercomplexity"/>
+ <menu_item_check label="Byte in Anhängen" name="attachment bytes"/>
+ <menu_item_check label="Formen" name="Sculpt"/>
</menu>
<menu label="Rendering" name="Rendering">
<menu_item_check label="Achsen" name="Axes"/>
@@ -262,11 +296,9 @@
<menu_item_call label="Texturinfo für ausgewähltes Objekt" name="Selected Texture Info Basis"/>
<menu_item_check label="Wireframe" name="Wireframe"/>
<menu_item_check label="Objekt-Objekt Okklusion" name="Object-Object Occlusion"/>
- <menu_item_check label="Framebuffer-Objekte" name="Framebuffer Objects"/>
<menu_item_check label="Licht und Schatten" name="Lighting and Shadows"/>
<menu_item_check label="Schatten von Sonne-/Mond-Projektoren" name="Shadows from Sun/Moon/Projectors"/>
<menu_item_check label="SSAO und Schattenglättung" name="SSAO and Shadow Smoothing"/>
- <menu_item_check label="Globale Beleuchtung (experimentell)" name="Global Illumination"/>
<menu_item_check label="Fehler in GL beseitigen" name="Debug GL"/>
<menu_item_check label="Fehler in Pipeline beseitigen" name="Debug Pipeline"/>
<menu_item_check label="Automatische Alpha-Masken (aufgeschoben)" name="Automatic Alpha Masks (deferred)"/>
@@ -297,14 +329,14 @@
<menu_item_call label="Aufnahme starten" name="Start Record"/>
<menu_item_call label="Aufnahme stoppen" name="Stop Record"/>
</menu>
- <menu label="Welt" name="World">
+ <menu label="Welt" name="DevelopWorld">
<menu_item_check label="Sonnen-Override für Sim" name="Sim Sun Override"/>
- <menu_item_check label="Pulsierender Strahl" name="Cheesy Beacon"/>
<menu_item_check label="Festgelegtes Wetter" name="Fixed Weather"/>
<menu_item_call label="Regionsobjekt-Cache ausgeben" name="Dump Region Object Cache"/>
</menu>
<menu label="UI" name="UI">
- <menu_item_call label="Web-Browser-Test" name="Web Browser Test"/>
+ <menu_item_call label="Test Medienbrowser" name="Web Browser Test"/>
+ <menu_item_call label="Webinhaltsbrowser" name="Web Content Browser"/>
<menu_item_call label="SelectMgr ausgeben" name="Dump SelectMgr"/>
<menu_item_call label="Inventarinfo ausgeben" name="Dump Inventory"/>
<menu_item_call label="Timer ausgeben" name="Dump Timers"/>
@@ -312,8 +344,7 @@
<menu_item_call label="Ausgewählte Objektinfo drucken" name="Print Selected Object Info"/>
<menu_item_call label="Agent-Info drucken" name="Print Agent Info"/>
<menu_item_call label="Speicher-Stats" name="Memory Stats"/>
- <menu_item_check label="Doppelklicken: Auto-Pilot" name="Double-ClickAuto-Pilot"/>
- <menu_item_check label="Doppelklicken: Teleport" name="DoubleClick Teleport"/>
+ <menu_item_check label="Regions-Debug-Konsole" name="Region Debug Console"/>
<menu_item_check label="Fehler in SelectMgr beseitigen" name="Debug SelectMgr"/>
<menu_item_check label="Fehler in Klicks beseitigen" name="Debug Clicks"/>
<menu_item_check label="Debug-Ansichten" name="Debug Views"/>
@@ -325,19 +356,17 @@
<menu label="XUI" name="XUI">
<menu_item_call label="Farbeinstellungen neu laden" name="Reload Color Settings"/>
<menu_item_call label="Schriftarttest anzeigen" name="Show Font Test"/>
- <menu_item_call label="Von XML laden" name="Load from XML"/>
- <menu_item_call label="Als XML speichern" name="Save to XML"/>
<menu_item_check label="XUI-Namen anzeigen" name="Show XUI Names"/>
<menu_item_call label="Test-IMs senden" name="Send Test IMs"/>
<menu_item_call label="Namen-Cache leeren" name="Flush Names Caches"/>
</menu>
<menu label="Avatar" name="Character">
<menu label="Geladene Textur nehmen" name="Grab Baked Texture">
- <menu_item_call label="Iris" name="Iris"/>
- <menu_item_call label="Kopf" name="Head"/>
- <menu_item_call label="Oberkörper" name="Upper Body"/>
- <menu_item_call label="Unterkörper" name="Lower Body"/>
- <menu_item_call label="Rock" name="Skirt"/>
+ <menu_item_call label="Iris" name="Grab Iris"/>
+ <menu_item_call label="Kopf" name="Grab Head"/>
+ <menu_item_call label="Oberkörper" name="Grab Upper Body"/>
+ <menu_item_call label="Unterkörper" name="Grab Lower Body"/>
+ <menu_item_call label="Rock" name="Grab Skirt"/>
</menu>
<menu label="Avatar-Tests" name="Character Tests">
<menu_item_call label="Aussehen als XML speichern" name="Appearance To XML"/>
@@ -363,21 +392,30 @@
<menu_item_call label="Lokale Texturen ausgeben" name="Dump Local Textures"/>
</menu>
<menu_item_check label="HTTP-Texturen" name="HTTP Textures"/>
+ <menu_item_check label="HTTP-Inventar" name="HTTP Inventory"/>
<menu_item_call label="Bilder komprimieren" name="Compress Images"/>
+ <menu_item_call label="Visual Leak Detector aktivieren" name="Enable Visual Leak Detector"/>
<menu_item_check label="Ausgabe Fehlerbeseitigung ausgeben" name="Output Debug Minidump"/>
<menu_item_check label="Bei nächster Ausführung Fenster öffnen" name="Console Window"/>
- <menu_item_check label="Admin-Menü anzeigen" name="View Admin Options"/>
+ <menu label="Protokollierungsstufe festlegen" name="Set Logging Level">
+ <menu_item_check label="Debug" name="Debug"/>
+ <menu_item_check label="Info" name="Info"/>
+ <menu_item_check label="Warnung" name="Warning"/>
+ <menu_item_check label="Fehler" name="Error"/>
+ <menu_item_check label="Keine" name="None"/>
+ </menu>
<menu_item_call label="Admin-Status anfordern" name="Request Admin Options"/>
<menu_item_call label="Admin-Status verlassen" name="Leave Admin Options"/>
+ <menu_item_check label="Admin-Menü anzeigen" name="View Admin Options"/>
</menu>
<menu label="Admin" name="Admin">
- <menu label="Object">
- <menu_item_call label="Kopie nehmen" name="Take Copy"/>
- <menu_item_call label="Besitzer zu mir zwingen" name="Force Owner To Me"/>
- <menu_item_call label="Erlaubnis des Besitzers erzwingen" name="Force Owner Permissive"/>
+ <menu label="Objekt" name="AdminObject">
+ <menu_item_call label="Kopie nehmen" name="Admin Take Copy"/>
+ <menu_item_call label="Mich zum Besitzer machen" name="Force Owner To Me"/>
+ <menu_item_call label="Besitzererlaubnis erzwingen" name="Force Owner Permissive"/>
<menu_item_call label="Löschen" name="Delete"/>
- <menu_item_call label="Fest" name="Lock"/>
- <menu_item_call label="Asset-ID zulassen" name="Get Assets IDs"/>
+ <menu_item_call label="Sperren" name="Lock"/>
+ <menu_item_call label="Asset-IDs abrufen" name="Get Assets IDs"/>
</menu>
<menu label="Parzelle" name="Parcel">
<menu_item_call label="Besitzer zu mir zwingen" name="Owner To Me"/>
@@ -405,16 +443,17 @@
<menu_item_call label="Rock" name="Skirt"/>
<menu_item_call label="Alpha" name="Alpha"/>
<menu_item_call label="Tätowierung" name="Tattoo"/>
+ <menu_item_call label="Physik" name="Physics"/>
<menu_item_call label="Alle Kleider" name="All Clothes"/>
</menu>
- <menu label="Hilfe" name="Help">
+ <menu label="Hilfe" name="DeprecatedHelp">
<menu_item_call label="Offizielles Linden-Blog" name="Official Linden Blog"/>
<menu_item_call label="Scripting-Portal" name="Scripting Portal"/>
<menu label="Fehlermeldungen" name="Bug Reporting">
<menu_item_call label="Allgemeiner Probleme-Tracker" name="Public Issue Tracker"/>
<menu_item_call label="Hilfe zum Allgemeinen Probleme-Tracker" name="Publc Issue Tracker Help"/>
<menu_item_call label="Fehlermeldungs-1x1" name="Bug Reporing 101"/>
- <menu_item_call label="Sicherheitsfragen" name="Security Issues"/>
+ <menu_item_call label="Sicherheitsprobleme" name="Security Issues"/>
<menu_item_call label="QA-Wiki" name="QA Wiki"/>
</menu>
</menu>
diff --git a/indra/newview/skins/default/xui/de/menu_wearing_gear.xml b/indra/newview/skins/default/xui/de/menu_wearing_gear.xml
index 80d4ff4d9f..dacf898b6a 100644
--- a/indra/newview/skins/default/xui/de/menu_wearing_gear.xml
+++ b/indra/newview/skins/default/xui/de/menu_wearing_gear.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Gear Wearing">
+<toggleable_menu name="Gear Wearing">
<menu_item_call label="Outfit bearbeiten" name="edit"/>
<menu_item_call label="Ausziehen" name="takeoff"/>
-</menu>
+ <menu_item_call label="Outfitliste in Zwischenablage kopieren" name="copy"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/de/notifications.xml b/indra/newview/skins/default/xui/de/notifications.xml
index a904604b62..ac068fcd4e 100644
--- a/indra/newview/skins/default/xui/de/notifications.xml
+++ b/indra/newview/skins/default/xui/de/notifications.xml
@@ -72,9 +72,9 @@ Fehlerdetails: The notification called &apos;[_NAME]&apos; was not found in noti
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="LoginFailedNoNetwork">
- Eine Verbindung zum [SECOND_LIFE_GRID] konnte nicht hergestellt werden.
-&apos;[DIAGNOSTIC]&apos;
-Bitte vergewissern Sie sich, dass Ihre Internetverbindung funktioniert.
+ Verbindung nicht möglich zum [SECOND_LIFE_GRID].
+ &apos;[DIAGNOSTIC]&apos;
+Stellen Sie sicher, dass Ihre Internetverbindung funktioniert.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="MessageTemplateNotFound">
@@ -85,6 +85,40 @@ Bitte vergewissern Sie sich, dass Ihre Internetverbindung funktioniert.
Änderung an aktueller Kleidung/Körperteil speichern?
<usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Nicht speichern" yestext="Speichern"/>
</notification>
+ <notification name="ConfirmNoCopyToOutbox">
+ Sie sind nicht berechtigt, einen oder mehrere dieser Artikel in die Händler-Outbox zu kopieren. Sie können sie verschieben oder zurücklassen.
+ <usetemplate name="okcancelbuttons" notext="Artikel nicht verschieben" yestext="Artikel verschieben"/>
+ </notification>
+ <notification name="OutboxFolderCreated">
+ Für jeden Artikel, den Sie in die oberste Ebene Ihrer Händler-Outbox übertragen haben, wurde ein neuer Ordner erstellt.
+ <usetemplate ignoretext="Neuer Ordner in Händler-Outbox erstellt" name="okignore" yestext="OK"/>
+ </notification>
+ <notification name="OutboxImportComplete">
+ Erfolg
+
+Alle Ordner wurden erfolgreich an den Marktplatz übertragen.
+ <usetemplate ignoretext="Alle Ordner an den Marktplatz übertragen" name="okignore" yestext="OK"/>
+ </notification>
+ <notification name="OutboxImportHadErrors">
+ Einige Ordner wurden nicht übertragen
+
+Beim Übertragen bestimmter Ordner an den Marktplatz ist ein Fehler aufgetreten. Diese Ordner befinden sich noch in Ihrer Händler-Outbox.
+
+Weitere Informationen finden Sie im [[MARKETPLACE_IMPORTS_URL] Fehlerprotokoll].
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="OutboxImportFailed">
+ Ãœbertragung fehlgeschlagen
+
+Aufgrund eines System- oder Netzwerkfehlers wurden keine Ordner an den Marktplatz übertragen. Versuchen Sie es später erneut.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="OutboxInitFailed">
+ Marktplatzinitialisierung fehlgeschlagen
+
+Marktplatzinitialisierung aufgrund eines System- oder Netzwerkfehlers fehlgeschlagen. Versuchen Sie es später erneut.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="CompileQueueSaveText">
Der Text für ein Skript konnte aus folgendem Grund nicht hochgeladen werden: [REASON]. Bitte versuchen Sie es erneut.
</notification>
@@ -109,6 +143,10 @@ Wählen Sie ein einzelnes Objekt aus und versuchen Sie es erneut.
Leute, die nicht auf Ihrer Freundesliste stehen, werden nicht wissen, dass Sie deren Anrufe oder Sofortnachrichten ignoriert haben.
<usetemplate name="okbutton" yestext="Ja"/>
</notification>
+ <notification name="FavoritesOnLogin">
+ Hinweis: Bei Aktivierung dieser Option sehen alle Personen, die diesen Computer benutzen, Ihre Lieblingsorte.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="GrantModifyRights">
Wenn Sie einem anderen Einwohner Änderungsrechte gewähren, dann kann dieser JEDES Objekt, das Sie inworld besitzen, ändern, löschen oder an sich nehmen. Seien Sie daher beim Gewähren dieser Rechte sehr vorsichtig!
Möchten Sie [NAME] Änderungsrechte gewähren?
@@ -336,13 +374,6 @@ Sie benötigen ein Konto, um [SECOND_LIFE] betreten zu können. Möchten Sie jet
<notification name="InvalidCredentialFormat">
Sie müssen entweder den Benutzernamen oder den Vor- und Nachnamen Ihres Avatars in das Feld „Benutzername“ eingeben und die Anmeldung dann erneut versuchen.
</notification>
- <notification name="AddClassified">
- Anzeigen werden im Suchverzeichnis im Abschnitt „Anzeigen&quot; und auf [http://secondlife.com/community/classifieds secondlife.com] für eine Woche angezeigt.
-Füllen Sie Ihre Anzeige aus und klicken Sie auf &apos;Veröffentlichen...&apos;, um sie zum Verzeichnis hinzuzufügen.
-Sie werden gebeten für die Anzeige zu bezahlen, wenn Sie auf &apos;Veröffentlichen&apos; klicken.
-Wenn Sie mehr bezahlen, erscheint Ihre Anzeige weiter oben in der Liste, ebenso wenn ein Benutzer nach Ihren Suchbegriffen sucht.
- <usetemplate ignoretext="So wird eine neue Anzeige erstellt" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
- </notification>
<notification name="DeleteClassified">
Anzeige „[NAME]“ löschen?
Gebühren werden nicht rückerstattet.
@@ -395,6 +426,9 @@ Hinweis: Der Cache wird dabei gelöscht/geleert.
<notification name="ChangeSkin">
Die neue Benutzeroberfläche wird nach einem Neustart von [APP_NAME] angezeigt.
</notification>
+ <notification name="ChangeLanguage">
+ Die Sprachänderung tritt nach Neustart von [APP_NAME] in Kraft.
+ </notification>
<notification name="GoToAuctionPage">
Zur [SECOND_LIFE]-Webseite, um Auktionen anzuzeigen oder ein Gebot abzugeben?
<url name="url">
@@ -607,6 +641,10 @@ Erwartet wurde [VALIDS]
„Daten“-Chunk in WAV-Header nicht gefunden:
[FILE]
</notification>
+ <notification name="SoundFileInvalidChunkSize">
+ Falsche Chunk-Größe in WAV-Datei:
+[FILE]
+ </notification>
<notification name="SoundFileInvalidTooLong">
Audiodatei ist zu lang (max. 10 Sekunden):
[FILE]
@@ -639,7 +677,7 @@ Erwartet wurde [VALIDS]
Ausgabedatei konnte nicht erstellt werden: [FILE]
</notification>
<notification name="DoNotSupportBulkAnimationUpload">
- Der Mehrfach-Upload von Animationsdateien wird zurzeit von [APP_NAME] nicht unterstützt.
+ Der Bulk-Upload von BVH-Animationsdateien wird zurzeit von [APP_NAME] nicht unterstützt.
</notification>
<notification name="CannotUploadReason">
Datei [FILE] kann aus folgendem Grund nicht hochgeladen werden: [REASON]
@@ -950,7 +988,7 @@ Sie sind nicht berechtigt, Land für die aktive Gruppe zu kaufen.
<input name="message">
[DESC] (neu)
</input>
- <button name="Offer" text="OK"/>
+ <button name="OK" text="OK"/>
<button name="Cancel" text="Abbrechen"/>
</form>
</notification>
@@ -960,7 +998,7 @@ Sie sind nicht berechtigt, Land für die aktive Gruppe zu kaufen.
<input name="message">
[DESC] (neu)
</input>
- <button name="Offer" text="OK"/>
+ <button name="OK" text="OK"/>
<button name="Cancel" text="Abbrechen"/>
</form>
</notification>
@@ -970,12 +1008,12 @@ Sie sind nicht berechtigt, Land für die aktive Gruppe zu kaufen.
<input name="new_name">
[NAME]
</input>
- <button name="Offer" text="OK"/>
+ <button name="OK" text="OK"/>
<button name="Cancel" text="Abbrechen"/>
</form>
</notification>
<notification name="RemoveFromFriends">
- Möchten Sie [NAME] aus Ihrer Freundesliste entfernen?
+ Möchten Sie &lt;nolink&gt;[NAME]&lt;/nolink&gt; aus Ihrer Freundesliste entfernen?
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
</notification>
<notification name="RemoveMultipleFromFriends">
@@ -1107,8 +1145,13 @@ Der Gruppe „[GROUP_NAME]“ [AREA] m² an Land schenken?
<notification name="DisplaySetToSafe">
Es wurden sichere Anzeige-Einstellungen gewählt, da die Option -safe verwendet wurde.
</notification>
- <notification name="DisplaySetToRecommended">
- Es wurden die für Ihre Systemkonfiguration empfohlenen Anzeige-Einstellungen gewählt.
+ <notification name="DisplaySetToRecommendedGPUChange">
+ Die Anzeigeeinstellungen wurden auf die empfohlenen Werte gesetzt, da Ihre Grafikkarte geändert wurde
+von „[LAST_GPU]“
+in „[THIS_GPU]“
+ </notification>
+ <notification name="DisplaySetToRecommendedFeatureChange">
+ Aufgrund einer Änderung des Rendersubsystems wurden die Anzeigeeinstellungen auf die empfohlenen Werte gesetzt.
</notification>
<notification name="ErrorMessage">
[ERROR_MESSAGE]
@@ -1343,6 +1386,45 @@ Dieses Update ist nicht erforderlich, für bessere Leistung und Stabilität soll
In Ihren Anwendungsordner herunterladen?
<usetemplate name="okcancelbuttons" notext="Weiter" yestext="Herunterladen"/>
</notification>
+ <notification name="FailedUpdateInstall">
+ Beim Installieren des Viewer-Updates ist ein Fehler aufgetreten.
+Laden Sie den neuesten Viewer von http://secondlife.com/download herunter und installieren Sie ihn.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="FailedRequiredUpdateInstall">
+ Ein erforderliches Update konnte nicht installiert werden.
+Sie können sich erst anmelden, wenn [APP_NAME] aktualisiert wurde.
+
+Laden Sie den neuesten Viewer von http://secondlife.com/download herunter und installieren Sie ihn.
+ <usetemplate name="okbutton" yestext="Beenden"/>
+ </notification>
+ <notification name="UpdaterServiceNotRunning">
+ Für Ihre SecondLife-Installation ist ein Update erforderlich.
+
+Sie können dieses Update von http://www.secondlife.com/downloads herunterladen oder jetzt installieren.
+ <usetemplate name="okcancelbuttons" notext="Second Life beenden" yestext="Jetzt herunterladen und installieren"/>
+ </notification>
+ <notification name="DownloadBackgroundTip">
+ Für Ihre [APP_NAME]-Installation wurde ein Update heruntergeladen.
+Version [VERSION] [[RELEASE_NOTES_FULL_URL] Informationen zu diesem Update]
+ <usetemplate name="okcancelbuttons" notext="Später..." yestext="Jetzt installieren und [APP_NAME] neu starten"/>
+ </notification>
+ <notification name="DownloadBackgroundDialog">
+ Für Ihre [APP_NAME]-Installation wurde ein Update heruntergeladen.
+Version [VERSION] [[RELEASE_NOTES_FULL_URL] Informationen zu diesem Update]
+ <usetemplate name="okcancelbuttons" notext="Später..." yestext="Jetzt installieren und [APP_NAME] neu starten"/>
+ </notification>
+ <notification name="RequiredUpdateDownloadedVerboseDialog">
+ Ein erforderliches Softwareupdate wurde heruntergeladen.
+Version [VERSION]
+
+Zur Installation des Updates muss [APP_NAME] neu gestartet werden.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="RequiredUpdateDownloadedDialog">
+ Zur Installation des Updates muss [APP_NAME] neu gestartet werden.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="DeedObjectToGroup">
Bei Übertragung dieses Objekts erhält die Gruppe:
* An das Objekt bezahlte L$
@@ -1387,7 +1469,7 @@ In Ihren Anwendungsordner herunterladen?
<usetemplate ignoretext="Bestätigen, bevor Objekte an Ihre Eigentümer zurückgegeben werden" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
</notification>
<notification name="GroupLeaveConfirmMember">
- Sie sind Mitglied der Gruppe [GROUP].
+ Sie sind gegenwärtig Mitglied der Gruppe &lt;nolink&gt;[GROUP]&lt;/nolink&gt;.
Diese Gruppe verlassen?
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
</notification>
@@ -1522,6 +1604,11 @@ Versuchen Sie es später erneut.
<button name="Cancel" text="Abbrechen"/>
</form>
</notification>
+ <notification name="TooManyTeleportOffers">
+ Sie haben versucht, [OFFERS] Teleport-Angebote zu machen,
+womit Sie die Höchstgrenze von [LIMIT] überschreiten.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="OfferTeleportFromGod">
Einwohner zu Ihrem Standort einladen?
<form name="form">
@@ -1864,6 +1951,18 @@ Inventarobjekt(e) verschieben?
Wirklich beenden?
<usetemplate ignoretext="Bestätigen, bevor Sitzung beendet wird" name="okcancelignore" notext="Nicht beenden" yestext="Beenden"/>
</notification>
+ <notification name="ConfirmRestoreToybox">
+ Durch diese Aktion werden Ihre Standardschaltflächen und -symbolleisten wiederhergestellt.
+
+Diese Aktion kann nicht rückgängig gemacht werden.
+ <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmClearAllToybox">
+ Durch diese Aktion werden alle Schaltflächen zurück in die Toolbox gestellt; die Symbolleisten sind leer.
+
+Diese Aktion kann nicht rückgängig gemacht werden.
+ <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+ </notification>
<notification name="DeleteItems">
[QUESTION]
<usetemplate ignoretext="Vor dem Löschen von Objekten bestätigen" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
@@ -1943,6 +2042,10 @@ Möchten Sie den Bechäftigt-Modus verlassen, bevor Sie diese Transaktion abschl
Sind Sie sicher, dass Sie Ihren Reise-, Internet- und Suchverlauf löschen möchten?
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
</notification>
+ <notification name="ConfirmClearCache">
+ Möchten Sie Ihren Viewer-Cache wirklich leeren?
+ <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+ </notification>
<notification name="ConfirmClearCookies">
Sind Sie sicher, dass Sie Ihre Cookies löschen möchten?
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Ja"/>
@@ -1968,48 +2071,30 @@ Von einer Webseite zu diesem Formular linken, um anderen leichten Zugang zu dies
Die gespeicherte Voreinstellung überschreiben?
<usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/>
</notification>
- <notification name="WLDeletePresetAlert">
- [SKY] löschen?
- <usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/>
- </notification>
<notification name="WLNoEditDefault">
Standardvoreinstellungen können nicht bearbeitet oder gelöscht werden.
</notification>
<notification name="WLMissingSky">
Diese Tageszyklusdatei verweist auf eine fehlende Himmel-Datei: [SKY].
</notification>
- <notification name="PPSaveEffectAlert">
- Post-Processing-Effekt bereits vorhanden. Möchten Sie ihn überschreiben?
- <usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/>
- </notification>
- <notification name="NewSkyPreset">
- Wählen Sie einen Namen für den neuen Himmel.
- <form name="form">
- <input name="message">
- Neue Voreinstellung
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Abbrechen"/>
- </form>
+ <notification name="WLRegionApplyFail">
+ Die Einstellungen konnten nicht auf die Region angewendet werden. Verlassen Sie die Region und kehren Sie zurück, um das Problem zu beheben. Angegebener Grund: [FAIL_REASON]
</notification>
- <notification name="ExistsSkyPresetAlert">
- Voreinstellung bereits vorhanden!
+ <notification name="EnvCannotDeleteLastDayCycleKey">
+ Der letzte Schlüssel in diesem Tageszyklus kann nicht gelöscht werden, da ein Tageszyklus nicht leer sein kann. Statt den letzten verbleibenden Schlüssel zu löschen, versuchen Sie stattdessen, ihn zu modifizieren und dann einen neuen zu erstellen.
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="NewWaterPreset">
- Wählen Sie einen Namen für die neue Wasservoreinstellung.
- <form name="form">
- <input name="message">
- Neue Voreinstellung
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Abbrechen"/>
- </form>
+ <notification name="DayCycleTooManyKeyframes">
+ Sie können diesem Tageszyklus keine Keyframes mehr hinzufügen. Die Höchstzahl an Keyframes für Tageszyklen mit Umfang [SCOPE] beträgt [MAX].
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="ExistsWaterPresetAlert">
- Voreinstellung bereits vorhanden!
+ <notification name="EnvUpdateRate">
+ Sie können die Umgebungseinstellungen der Region nur alle [WAIT] Sekunden aktualisieren. Warten Sie mindestens so lange und versuchen Sie es dann erneut.
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="WaterNoEditDefault">
- Standardvoreinstellungen können nicht bearbeitet oder gelöscht werden.
+ <notification name="PPSaveEffectAlert">
+ Post-Processing-Effekt bereits vorhanden. Möchten Sie ihn überschreiben?
+ <usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/>
</notification>
<notification name="ChatterBoxSessionStartError">
Neue Chat-Sitzung mit [RECIPIENT] konnte nicht gestartet werden.
@@ -2038,13 +2123,14 @@ Von einer Webseite zu diesem Formular linken, um anderen leichten Zugang zu dies
<usetemplate ignoretext="Die Kleidung, die während dem Bearbeiten meines Aussehens erstellt wird, sofort anziehen" name="okcancelignore" notext="Nein" yestext="Ja"/>
</notification>
<notification name="NotAgeVerified">
- Sie müssen altersüberprüft sein, um diesen Bereich betreten zu können. Möchten Sie auf der [SECOND_LIFE]-Webseite Ihr Alter verifizieren lassen?
+ Um auf Adult-Inhalte und –Bereiche in Second Life zuzugreifen, müssen Sie mindestens 18 Jahre alt sein. Bitte besuchen Sie die Altersüberprüfungsseite, um zu bestätigen, dass Sie mindestens 18 Jahre alt sind.
+Hierzu wird Ihr Webbrowser geöffnet.
[_URL]
<url name="url" option="0">
- https://secondlife.com/account/verification.php?lang=de
+ https://secondlife.com/my/account/verification.php
</url>
- <usetemplate ignoretext="Ich habe mein Alter nicht verifizieren lassen" name="okcancelignore" notext="Nein" yestext="Ja"/>
+ <usetemplate ignoretext="Ich habe mein Alter nicht verifizieren lassen" name="okcancelignore" notext="Abbrechen" yestext="Zur Altersüberprüfung"/>
</notification>
<notification name="Cannot enter parcel: no payment info on file">
Um diesen Bereich besuchen zu können, müssen Ihre Zahlungsinformationen gespeichert sein. Möchten Sie diese Einstellung auf der [SECOND_LIFE]-Webseite einrichten?
@@ -2080,10 +2166,10 @@ Von einer Webseite zu diesem Formular linken, um anderen leichten Zugang zu dies
Betreff: [SUBJECT], Nachricht: [MESSAGE]
</notification>
<notification name="FriendOnline">
- [NAME] ist online
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; ist online
</notification>
<notification name="FriendOffline">
- [NAME] ist offline
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; ist offline
</notification>
<notification name="AddSelfFriend">
Obwohl Sie ein sehr netter Mensch sind, können Sie sich nicht selbst als Freund hinzufügen.
@@ -2129,6 +2215,12 @@ Dies kann die Eingabe Ihres Passworts beeinflussen.
<notification name="RezItemNoPermissions">
Keine Berechtigung zum Rezzen von Objekten.
</notification>
+ <notification name="IMAcrossParentEstates">
+ Senden von IMs über übergeordnete Grundbesitze hinweg nicht möglich.
+ </notification>
+ <notification name="TransferInventoryAcrossParentEstates">
+ Inventarübertragung über übergeordnete Grundbesitze hinweg nicht möglich.
+ </notification>
<notification name="UnableToLoadNotecard">
Notizkarten-Asset konnte nicht geladen werden.
</notification>
@@ -2190,14 +2282,16 @@ Wählen Sie ein einzelnes Objekt aus.
Ihre Visitenkarte wurde abgelehnt.
</notification>
<notification name="TeleportToLandmark">
- Sie können an Positionen wie „[NAME]“ teleportieren, wenn Sie rechts in Ihrem Bildschirm die Tafel „Orte“ öffnen und dann die Registerkarte „Meine Landmarken“ auswählen.
-Klicken Sie auf eine Landmarke, um diese auszuwählen. Klicken Sie anschließend auf unten in der Registerkarte auf „Teleportieren“.
-(Sie können auch auf die Landmarke doppelt klicken oder mit rechts auf die Landmarke klicken und dann „Teleportieren“ auswählen).
+ Um zu Orten wie „[NAME]“ zu teleportieren, klicken Sie zuerst auf die Schaltfläche „Orte“
+ und dann im eingeblendeten Fenster auf die Registerkarte „Landmarken“. Klicken Sie auf
+ die gewünschte Landmarke und dann unten im Fenster auf „Teleportieren“.
+ (Sie können auch auf die Landmarke doppelklicken bzw. sie mit der rechten Maustaste ankklicken und dann
+ „Teleportieren“ wählen.)
</notification>
<notification name="TeleportToPerson">
- Sie können Einwohner wie „[NAME]“ kontaktieren, wenn Sie die Tafel „Leute“ auf der rechten Seite Ihres Bildschirms öffnen.
-Wählen Sie den Einwohner aus der Liste aus und klicken Sie unten auf „IM“.
-(Sie können auch auf den Namen doppelt klicken oder mit rechts auf den Namen klicken und dann „IM“ auswählen).
+ Um Einwohner wie „[NAME]“ zu kontaktieren, klicken Sie auf die Schaltfläche „Leute“, wählen Sie eingeblendeten Fenster einen Einwohner aus
+ und klicken Sie unten im Fenster auf „IM“.
+ (Sie können auch auf den Namen doppelklicken bzw. ihn mit der rechten Maustaste anklicken und dann „IM“ wählen.)
</notification>
<notification name="CantSelectLandFromMultipleRegions">
Land kann nicht über Servergrenzen hinweg ausgewählt werden.
@@ -2209,14 +2303,6 @@ Wählen Sie eine kleinere Landfläche.
<notification name="NoContentToSearch">
Bitte wählen Sie mindestens eine Inhaltsart für die Suche aus (Generell, Moderat oder Adult).
</notification>
- <notification name="GroupVote">
- [NAME] hat eine Abstimmung vorgeschlagen über:
-[MESSAGE]
- <form name="form">
- <button name="VoteNow" text="Abstimmen"/>
- <button name="Later" text="Später"/>
- </form>
- </notification>
<notification name="SystemMessage">
[MESSAGE]
</notification>
@@ -2226,6 +2312,9 @@ Wählen Sie eine kleinere Landfläche.
<notification name="PaymentSent">
[MESSAGE]
</notification>
+ <notification name="PaymentFailure">
+ [MESSAGE]
+ </notification>
<notification name="EventNotification">
Event-Benachrichtigung:
@@ -2302,6 +2391,9 @@ Fliegen ist hier nicht möglich.
<notification name="NoBuild">
In diesem Bereich ist das Bauen deaktiviert. Sie können keine Objekte bauen oder rezzen.
</notification>
+ <notification name="SeeAvatars">
+ Diese Parzelle verbirgt Avatare und Text-Chat vor einer anderen Parzelle. Sie können Einwohner außerhalb dieser Parzelle weder sehen noch von ihnen gesehen werden. Regulärer Text-Chat auf Kanal 0 ist ebenfalls blockiert.
+ </notification>
<notification name="ScriptsStopped">
Ein Administrator hat die Skriptausführung in dieser Region vorübergehend deaktiviert.
</notification>
@@ -2396,11 +2488,19 @@ Versuchen Sie es in einigen Minuten erneut.
</notification>
<notification name="ObjectGiveItem">
Ein Objekt namens &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt;, das [NAME_SLURL] gehört, hat Ihnen folgende/n/s [OBJECTTYPE] übergeben:
-[ITEM_SLURL]
+&lt;nolink&gt;[ITEM_SLURL]&lt;/nolink&gt;
<form name="form">
<button name="Keep" text="Behalten"/>
<button name="Discard" text="Verwerfen"/>
- <button name="Mute" text="Ignorieren"/>
+ <button name="Mute" text="Eigentümer blockieren"/>
+ </form>
+ </notification>
+ <notification name="OwnObjectGiveItem">
+ Ein Objekt namens &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; hat Ihnen folgende/n/s [OBJECTTYPE] übergeben:
+&lt;nolink&gt;[ITEM_SLURL]&lt;/nolink&gt;
+ <form name="form">
+ <button name="Keep" text="Beibehalten"/>
+ <button name="Discard" text="Verwerfen"/>
</form>
</notification>
<notification name="UserGiveItem">
@@ -2469,10 +2569,10 @@ Versuchen Sie es in einigen Minuten erneut.
</form>
</notification>
<notification name="FriendshipAccepted">
- [NAME] hat Ihr Freundschaftsangebot akzeptiert.
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; hat Ihr Freundschaftsangebot akzeptiert.
</notification>
<notification name="FriendshipDeclined">
- [NAME] hat Ihr Freundschaftsangebot abgelehnt.
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; hat Ihr Freundschaftsangebot abgelehnt.
</notification>
<notification name="FriendshipAcceptedByMe">
Ihr Freundschaftsangebot wurde angeommen.
@@ -2481,8 +2581,8 @@ Versuchen Sie es in einigen Minuten erneut.
Ihr Freundschaftsangebot wurde abgelehnt.
</notification>
<notification name="OfferCallingCard">
- [NAME] bietet Ihnen ihre/seine Visitenkarte an.
-Ihrem Inventar wird ein Lesezeichen erstellt, damit Sie diesem Einwohner einfach eine IM schicken können.
+ [NAME] bietet Ihnen eine Visitenkarte an.
+In Ihrem Inventar wird ein Lesezeichen erstellt, damit Sie diesem Einwohner schnell IMs senden können.
<form name="form">
<button name="Accept" text="Akzeptieren"/>
<button name="Decline" text="Ablehnen"/>
@@ -2544,14 +2644,16 @@ Anfrage gestatten?
„&lt;nolink&gt;[TITLE]&lt;/nolink&gt;“ von [NAME]
[MESSAGE]
<form name="form">
- <button name="Ignore" text="Ignorieren"/>
+ <button name="Client_Side_Mute" text="Blockieren"/>
+ <button name="Client_Side_Ignore" text="Ignorieren"/>
</form>
</notification>
<notification name="ScriptDialogGroup">
„&lt;nolink&gt;[TITLE]&lt;/nolink&gt;“ von [GROUPNAME]
[MESSAGE]
<form name="form">
- <button name="Ignore" text="Ignorieren"/>
+ <button name="Client_Side_Mute" text="Blockieren"/>
+ <button name="Client_Side_Ignore" text="Ignorieren"/>
</form>
</notification>
<notification name="BuyLindenDollarSuccess">
@@ -2675,9 +2777,6 @@ Klicken Sie auf &apos;Akzeptieren &apos;, um dem Chat beizutreten, oder auf &a
<notification name="VoiceCallGenericError">
Fehler beim Versuch, eine Voice-Chat-Verbindung zu [VOICE_CHANNEL_NAME] herzustellen. Bitte versuchen Sie es erneut.
</notification>
- <notification name="ServerVersionChanged">
- Sie haben eine Region betreten, die eine andere Server-Version verwendet. Dies kann sich auf die Leistung auswirken. [[URL] Versionshinweise anzeigen.]
- </notification>
<notification name="UnsupportedCommandSLURL">
Die SLurl, auf die Sie geklickt haben, wird nicht unterstützt.
</notification>
@@ -2717,6 +2816,10 @@ Diese werden für ein paar Sekunden sicherheitshalber gesperrt.
Sie wurden vom Moderator stummgeschaltet.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="UploadCostConfirmation">
+ Das Hochladen kostet [PRICE] L$. Möchten Sie fortfahren?
+ <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Hochladen"/>
+ </notification>
<notification name="ConfirmClearTeleportHistory">
Möchten Sie Ihre Teleport-Liste löschen?
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
@@ -2728,12 +2831,35 @@ Die Schaltfläche wird angezeigt, wenn genügend Platz vorhanden ist.
<notification name="ShareNotification">
Wählen Sie Einwohner aus, für die Sie das Objekt freigeben möchten.
</notification>
+ <notification name="MeshUploadError">
+ [LABEL] konnte nicht hochgeladen werden: [MESSAGE] [IDENTIFIER]
+
+Details finden Sie in der Protokolldatei.
+ </notification>
+ <notification name="MeshUploadPermError">
+ Fehler beim Anfordern der Berechtigungen zum Hochladen des Netzes
+ </notification>
+ <notification name="RegionCapabilityRequestError">
+ Regionsfähigkeit „[CAPABILITY]“ konnte nicht abgerufen werden.
+ </notification>
<notification name="ShareItemsConfirmation">
- Möchten Sie diese Objekte wirklich für andere freigeben:
+ Möchten Sie wirklich die folgenden Objekte:
-[ITEMS]
+&lt;nolink&gt;[ITEMS]&lt;/nolink&gt;
+
+für folgende Einwohner freigeben:
+
+[RESIDENTS]
+ <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+ </notification>
+ <notification name="ShareFolderConfirmation">
+ Es kann nur jeweils ein Ordner geteilt werden.
+
+Möchten Sie wirklich die folgenden Artikel:
+
+&lt;nolink&gt;[ITEMS]&lt;/nolink&gt;
-Für folgende Einwohner:
+mit den folgenden Einwohnern teilen:
[RESIDENTS]
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
@@ -2744,6 +2870,19 @@ Für folgende Einwohner:
<notification name="DeedToGroupFail">
Ãœbertragung an Gruppe ist fehlgeschlagen.
</notification>
+ <notification name="ReleaseLandThrottled">
+ Die Parzelle [PARCEL_NAME] kann zurzeit nicht aufgegeben werden.
+ </notification>
+ <notification name="ReleasedLandWithReclaim">
+ Die [AREA] m² große Parzelle „[PARCEL_NAME]“ wurde freigegeben.
+
+Sie haben [RECLAIM_PERIOD] Stunden, um die Parzelle für 0 L$ zurückzufordern, bevor sie zum Verkauf an alle freigegeben wird.
+ </notification>
+ <notification name="ReleasedLandNoReclaim">
+ Die [AREA] m² große Parzelle „[PARCEL_NAME]“ wurde freigegeben.
+
+Sie steht jetzt zum Verkauf an alle zur Verfügung.
+ </notification>
<notification name="AvatarRezNotification">
(Seit [EXISTENCE] Sekunden inworld )
Avatar &apos;[NAME]&apos; wurde in [TIME] Sekunden gerezzt.
@@ -2780,9 +2919,7 @@ Avatar &apos;[NAME]&apos; hat Modus „Aussehen bearbeiten&quot; verlassen.
<notification name="NoConnect">
Es gibt Probleme mit der Verbindung mit [PROTOCOL] [HOSTID].
Bitte überprüfen Sie Ihre Netzwerk- und Firewalleinstellungen.
- <form name="form">
- <button name="OK" text="OK"/>
- </form>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="NoVoiceConnect">
Verbindung mit Voice-Server ist leider nicht möglich:
@@ -2791,9 +2928,7 @@ Bitte überprüfen Sie Ihre Netzwerk- und Firewalleinstellungen.
Voice-Kommunikation ist leider nicht verfügbar.
Bitte überprüfen Sie Ihr Netzwerk- und Firewall-Setup.
- <form name="form">
- <button name="OK" text="OK"/>
- </form>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="AvatarRezLeftNotification">
(Seit [EXISTENCE] Sekunden inworld )
@@ -2825,6 +2960,13 @@ Alle stummschalten?
<notification label="Stehen" name="HintSit">
Um aufzustehen, klicken Sie auf die Schaltfläche „Stehen“.
</notification>
+ <notification label="Sprechen" name="HintSpeak">
+ Auf Schaltfläche „Sprechen“ klicken, um das Mikrofon ein- und auszuschalten.
+
+Auf den Pfeil nach oben klicken, um die Sprachsteuerung zu sehen.
+
+Durch Ausblenden der Schaltfläche „Sprechen“ wird die Sprechfunktion deaktiviert.
+ </notification>
<notification label="Welt erkunden" name="HintDestinationGuide">
Im Reiseführer finden Sie Tausende von interessanten Orten. Wählen Sie einfach einen Ort aus und klicken Sie auf „Teleportieren“.
</notification>
@@ -2834,15 +2976,29 @@ Alle stummschalten?
<notification label="Bewegen" name="HintMove">
Um zu gehen oder zu rennen, öffnen Sie das Bedienfeld „Bewegen“ und klicken Sie auf die Pfeile. Sie können auch die Pfeiltasten auf Ihrer Tastatur verwenden.
</notification>
+ <notification label="" name="HintMoveClick">
+ 1. Zum Gehen klicken: Auf beliebige Stelle am Boden klicken, um zu dieser Stelle zu gehen.
+
+2. Zum Drehen der Anzeige klicken und ziehen: Auf beliebige Stelle in der Welt klicken und ziehen, um Ihre Ansicht zu ändern.
+ </notification>
<notification label="Anzeigename" name="HintDisplayName">
Hier können Sie Ihren anpassbaren Anzeigenamen festlegen. Der Anzeigename unterscheidet sich von Ihrem eindeutigen Benutzernamen, der nicht geändert werden kann. In den Einstellungen können Sie festlegen, welcher Name von anderen Einwohnern angezeigt wird.
</notification>
+ <notification label="Ansicht" name="HintView">
+ Um die Kameraansicht zu ändern, verwenden Sie die Schwenk- und Kreissteuerungen. Um die Ansicht zurückzusetzen, drücken Sie die Esc-Taste oder laufen Sie einfach.
+ </notification>
<notification label="Inventar" name="HintInventory">
In Ihrem Inventar befinden sich verschiedene Objekte. Die neuesten Objekte finden Sie in der Registerkarte „Aktuell“.
</notification>
<notification label="Sie haben Linden-Dollar!" name="HintLindenDollar">
Hier wird Ihr aktueller L$-Kontostand angezeigt. Klicken Sie auf „L$ kaufen“, um mehr Linden-Dollar zu kaufen.
</notification>
+ <notification name="LowMemory">
+ Nicht genügend Arbeitsspeicher. Einige SL-Funktionen werden deaktiviert, um einen Absturz zu verhindern. Schließen Sie andere Anwendungen. Starten Sie SL neu, falls dieser Fehler erneut auftritt.
+ </notification>
+ <notification name="ForceQuitDueToLowMemory">
+ SL wird wegen Speichermangel in 30 Sekunden beendet.
+ </notification>
<notification name="PopupAttempt">
Ein Popup konnte nicht geöffnet werden.
<form name="form">
@@ -2850,9 +3006,111 @@ Alle stummschalten?
<button name="open" text="Popup-Fenster öffnen"/>
</form>
</notification>
- <global name="UnsupportedCPU">
- - Ihre CPU-Geschwindigkeit entspricht nicht den Mindestanforderungen.
- </global>
+ <notification name="SOCKS_NOT_PERMITTED">
+ SOCKS 5-Proxy „[HOST]:[PORT]“ hat Verbindungsverbindung abgewiesen, da laut Regelsatz nicht zulässig.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_CONNECT_ERROR">
+ SOCKS 5-Proxy „[HOST]:[PORT]“ hat den Verbindungsversuch abgewiesen. Der TCP-Kanal konnte nicht geöffnet werden.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_NOT_ACCEPTABLE">
+ SOCKS 5-Proxy „[HOST]:[PORT]“ hat das ausgewählte Authentifizierungssystem abgewiesen.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_AUTH_FAIL">
+ SOCKS 5-Proxy „[HOST]:[PORT]“ hat gemeldet, dass Ihre Angaben ungültig sind.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_UDP_FWD_NOT_GRANTED">
+ SOCKS 5-Proxy „[HOST]:[PORT]“ hat die Anforderung UDP ASSOCIATE abgewiesen.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_HOST_CONNECT_FAILED">
+ Keine Verbindung möglich zum SOCKS 5-Proxy-Server „[HOST]:[PORT]“.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_UNKNOWN_STATUS">
+ Unbekannter Proxy-Fehler bei Server „[HOST]:[PORT]“.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_INVALID_HOST">
+ SOCKS-Proxy-Address oder Port „[HOST]:[PORT]“ ungültig.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_BAD_CREDS">
+ SOCKS 5-Benutzername oder -Kennwort ungültig.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="PROXY_INVALID_HTTP_HOST">
+ HTTP-Proxy-Address oder Port „[HOST]:[PORT]“ ungültig.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="PROXY_INVALID_SOCKS_HOST">
+ SOCKS-Proxy-Address oder Port „[HOST]:[PORT]“ ungültig.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ChangeProxySettings">
+ Proxy-Einstellungen treten nach Neustart von [APP_NAME] in Kraft.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="AuthRequest">
+ Für die Site „&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;“ in der Domäne „[REALM]“ ist ein Benutzername und Kennwort erforderlich.
+ <form name="form">
+ <input name="username" text="Benutzername"/>
+ <input name="password" text="Kennwort"/>
+ <button name="ok" text="Senden"/>
+ <button name="cancel" text="Abbrechen"/>
+ </form>
+ </notification>
+ <notification label="" name="NoClassifieds">
+ Die Erstellung und Bearbeitung von Anzeigen ist nur im Modus „Erweitert“ möglich. Möchten Sie das Programm beenden und den Modus wechseln? Die Modusauswahl ist auf dem Anmeldebildschirm zu finden.
+ <usetemplate name="okcancelbuttons" notext="Nicht beenden" yestext="Beenden"/>
+ </notification>
+ <notification label="" name="NoGroupInfo">
+ Die Erstellung und Bearbeitung von Gruppen ist nur im Modus „Erweitert“ möglich. Möchten Sie das Programm beenden und den Modus wechseln? Die Modusauswahl ist auf dem Anmeldebildschirm zu finden.
+ <usetemplate name="okcancelbuttons" notext="Nicht beenden" yestext="Beenden"/>
+ </notification>
+ <notification label="" name="NoPlaceInfo">
+ Die Anzeige des Ortsprofils ist nur im Modus „Erweitert“ möglich. Möchten Sie das Programm beenden und den Modus wechseln? Die Modusauswahl ist auf dem Anmeldebildschirm zu finden.
+ <usetemplate name="okcancelbuttons" notext="Nicht beenden" yestext="Beenden"/>
+ </notification>
+ <notification label="" name="NoPicks">
+ Die Erstellung und Bearbeitung von Auswahlen ist nur im Modus „Erweitert“ möglich. Möchten Sie das Programm beenden und den Modus wechseln? Die Modusauswahl ist auf dem Anmeldebildschirm zu finden.
+ <usetemplate name="okcancelbuttons" notext="Nicht beenden" yestext="Beenden"/>
+ </notification>
+ <notification label="" name="NoWorldMap">
+ Die Anzeige der Weltkarte ist nur im Modus „Erweitert“ möglich. Möchten Sie das Programm beenden und den Modus wechseln? Die Modusauswahl ist auf dem Anmeldebildschirm zu finden.
+ <usetemplate name="okcancelbuttons" notext="Nicht beenden" yestext="Beenden"/>
+ </notification>
+ <notification label="" name="NoVoiceCall">
+ Voice-Anrufe sind nur im Modus „Erweitert“ möglich. Möchten Sie sich abmelden und den Modus wechseln?
+ <usetemplate name="okcancelbuttons" notext="Nicht beenden" yestext="Beenden"/>
+ </notification>
+ <notification label="" name="NoAvatarShare">
+ Die Freigabe ist nur im Modus „Erweitert“ möglich. Möchten Sie sich abmelden und den Modus wechseln?
+ <usetemplate name="okcancelbuttons" notext="Nicht beenden" yestext="Beenden"/>
+ </notification>
+ <notification label="" name="NoAvatarPay">
+ Die Bezahlung anderer Einwohner ist nur im Modus „Erweitert“ möglich. Möchten Sie sich abmelden und den Modus wechseln?
+ <usetemplate name="okcancelbuttons" notext="Nicht beenden" yestext="Beenden"/>
+ </notification>
+ <notification label="" name="NoInventory">
+ Die Inventaranzeige ist nur im Modus „Erweitert“ möglich. Möchten Sie sich abmelden und den Modus wechseln?
+ <usetemplate name="okcancelbuttons" notext="Nicht beenden" yestext="Beenden"/>
+ </notification>
+ <notification label="" name="NoAppearance">
+ Das Fenster zum Bearbeiten des Aussehens ist nur im Modus „Erweitert“ verfügbar. Möchten Sie sich abmelden und den Modus wechseln?
+ <usetemplate name="okcancelbuttons" notext="Nicht beenden" yestext="Beenden"/>
+ </notification>
+ <notification label="" name="NoSearch">
+ Die Suche ist nur im Modus „Erweitert“ möglich. Möchten Sie sich abmelden und den Modus wechseln?
+ <usetemplate name="okcancelbuttons" notext="Nicht beenden" yestext="Beenden"/>
+ </notification>
+ <notification label="" name="ConfirmHideUI">
+ Durch diese Aktion werden alle Menüelemente und Schaltflächen ausgeblendet. Um sie wieder anzuzeigen, klicken Sie erneut auf [SHORTCUT].
+ <usetemplate ignoretext="Vor Ausblenden der UI bestätigen" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
+ </notification>
<global name="UnsupportedGLRequirements">
Ihr Computer entspricht nicht den Hardwareanforderungen von [APP_NAME]. [APP_NAME] setzt eine OpenGL-Grafikkarte mit Multitextur-Unterstützung voraus. Falls Ihre Grafikkarte diese Funktion unterstützt, installieren Sie die neuesten Treiber sowie die aktuellen Service Packs und Patches für Ihr Betriebssystem.
diff --git a/indra/newview/skins/default/xui/de/panel_activeim_row.xml b/indra/newview/skins/default/xui/de/panel_activeim_row.xml
deleted file mode 100644
index 84272752cf..0000000000
--- a/indra/newview/skins/default/xui/de/panel_activeim_row.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_activeim_row">
- <text name="contact_name">
- Grumpity ProductEngine
- </text>
-</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/de/panel_avatar_list_item.xml
index 2db8cf7c09..dcfcffa6e2 100644
--- a/indra/newview/skins/default/xui/de/panel_avatar_list_item.xml
+++ b/indra/newview/skins/default/xui/de/panel_avatar_list_item.xml
@@ -21,7 +21,7 @@
<string name="FormatYears">
[COUNT]J
</string>
- <text name="avatar_name" value="Unbekannt"/>
+ <text name="avatar_name" value="(laden)"/>
<text name="last_interaction" value="0s"/>
<icon name="permission_edit_theirs_icon" tool_tip="Sie können die Objekte dieses Freunds bearbeiten"/>
<icon name="permission_edit_mine_icon" tool_tip="Dieser Freund kann Ihre Objekte bearbeiten, löschen und an sich nehmen"/>
diff --git a/indra/newview/skins/default/xui/de/panel_chat_header.xml b/indra/newview/skins/default/xui/de/panel_chat_header.xml
index babbff3132..7916bf5155 100644
--- a/indra/newview/skins/default/xui/de/panel_chat_header.xml
+++ b/indra/newview/skins/default/xui/de/panel_chat_header.xml
@@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="im_header" name="im_header">
- <text_editor name="user_name" value="Ericag Vader"/>
<text name="time_box" value="23:30"/>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_chiclet_bar.xml b/indra/newview/skins/default/xui/de/panel_chiclet_bar.xml
new file mode 100644
index 0000000000..bcc6772bb9
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_chiclet_bar.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="chiclet_bar">
+ <layout_stack name="toolbar_stack">
+ <layout_panel name="im_well_panel">
+ <chiclet_im_well name="im_well">
+ <button name="Unread IM messages" tool_tip="Unterhaltungen"/>
+ </chiclet_im_well>
+ </layout_panel>
+ <layout_panel name="notification_well_panel">
+ <chiclet_notification name="notification_well">
+ <button name="Unread" tool_tip="Benachrichtigungen"/>
+ </chiclet_notification>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_edit_alpha.xml b/indra/newview/skins/default/xui/de/panel_edit_alpha.xml
index 4b48950341..4c6facf5e3 100644
--- a/indra/newview/skins/default/xui/de/panel_edit_alpha.xml
+++ b/indra/newview/skins/default/xui/de/panel_edit_alpha.xml
@@ -1,10 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_alpha_panel">
- <panel name="avatar_alpha_color_panel">
- <texture_picker label="Alpha: Unten" name="Lower Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
- <texture_picker label="Alpha: Oben" name="Upper Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
- <texture_picker label="Kopf: Alpha" name="Head Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
- <texture_picker label="Alpha: Augen" name="Eye Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
- <texture_picker label="Alpha: Haare" name="Hair Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
- </panel>
+ <scroll_container name="avatar_alpha_color_panel_scroll">
+ <panel name="avatar_alpha_color_panel">
+ <texture_picker label="Alpha: Unten" name="Lower Alpha" tool_tip="Klicken, um ein Bild auszuwählen"/>
+ <texture_picker label="Alpha: Oben" name="Upper Alpha" tool_tip="Klicken, um ein Bild auszuwählen"/>
+ <texture_picker label="Alpha: Kopf" name="Head Alpha" tool_tip="Klicken, um ein Bild auszuwählen"/>
+ <texture_picker label="Alpha: Augen" name="Eye Alpha" tool_tip="Klicken, um ein Bild auszuwählen"/>
+ <texture_picker label="Alpha: Haare" name="Hair Alpha" tool_tip="Klicken, um ein Bild auszuwählen"/>
+ </panel>
+ </scroll_container>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_edit_gloves.xml b/indra/newview/skins/default/xui/de/panel_edit_gloves.xml
index ad87e432d6..fb7d18f66c 100644
--- a/indra/newview/skins/default/xui/de/panel_edit_gloves.xml
+++ b/indra/newview/skins/default/xui/de/panel_edit_gloves.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_gloves_panel">
<panel name="avatar_gloves_color_panel">
- <texture_picker label="Stoff" name="Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
+ <texture_picker label="Textur" name="Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
<color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/de/panel_edit_jacket.xml b/indra/newview/skins/default/xui/de/panel_edit_jacket.xml
index 8fe76f6225..1b7c1d79a5 100644
--- a/indra/newview/skins/default/xui/de/panel_edit_jacket.xml
+++ b/indra/newview/skins/default/xui/de/panel_edit_jacket.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_jacket_panel">
<panel name="avatar_jacket_color_panel">
- <texture_picker label="Stoff: oben" name="Upper Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
- <texture_picker label="Stoff: unten" name="Lower Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
+ <texture_picker label="Obere Textur" name="Upper Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
+ <texture_picker label="Untere Textur" name="Lower Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
<color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/de/panel_edit_pants.xml b/indra/newview/skins/default/xui/de/panel_edit_pants.xml
index d40a27c5fd..533cf20412 100644
--- a/indra/newview/skins/default/xui/de/panel_edit_pants.xml
+++ b/indra/newview/skins/default/xui/de/panel_edit_pants.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_pants_panel">
<panel name="avatar_pants_color_panel">
- <texture_picker label="Stoff" name="Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
+ <texture_picker label="Textur" name="Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
<color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/de/panel_edit_physics.xml b/indra/newview/skins/default/xui/de/panel_edit_physics.xml
new file mode 100644
index 0000000000..bd9c84577a
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_edit_physics.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_physics_panel">
+ <panel label="" name="accordion_panel">
+ <accordion name="physics_accordion">
+ <accordion_tab name="physics_breasts_updown_tab" title="Brust – Hüpfen"/>
+ <accordion_tab name="physics_breasts_inout_tab" title="Brust – Dekolleté"/>
+ <accordion_tab name="physics_breasts_leftright_tab" title="Brust – Schwingen"/>
+ <accordion_tab name="physics_belly_tab" title="Bauch – Hüpfen"/>
+ <accordion_tab name="physics_butt_tab" title="Po – Hüpfen"/>
+ <accordion_tab name="physics_butt_leftright_tab" title="Po – Wiegen"/>
+ <accordion_tab name="physics_advanced_tab" title="Erweiterte Parameter"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_edit_pick.xml b/indra/newview/skins/default/xui/de/panel_edit_pick.xml
index 3c56df763d..aafffc7ae3 100644
--- a/indra/newview/skins/default/xui/de/panel_edit_pick.xml
+++ b/indra/newview/skins/default/xui/de/panel_edit_pick.xml
@@ -29,7 +29,7 @@
<layout_panel name="layout_panel1">
<button label="Auswahl speichern" name="save_changes_btn"/>
</layout_panel>
- <layout_panel name="layout_panel1">
+ <layout_panel name="layout_panel2">
<button label="Abbrechen" name="cancel_btn"/>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/de/panel_edit_profile.xml b/indra/newview/skins/default/xui/de/panel_edit_profile.xml
index be124050e8..03974e7f7f 100644
--- a/indra/newview/skins/default/xui/de/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/de/panel_edit_profile.xml
@@ -29,11 +29,7 @@
<text name="display_name_label" value="Anzeigename:"/>
<text name="solo_username_label" value="Benutzername:"/>
<button name="set_name" tool_tip="Anzeigenamen festlegen"/>
- <text name="solo_user_name" value="Hamilton Hitchings"/>
- <text name="user_name" value="Hamilton Hitchings"/>
- <text name="user_name_small" value="Hamilton Hitchings"/>
<text name="user_label" value="Benutzername:"/>
- <text name="user_slid" value="hamilton.linden"/>
<panel name="lifes_images_panel">
<panel name="second_life_image_panel">
<text name="second_life_photo_title_text" value="[SECOND_LIFE]:"/>
diff --git a/indra/newview/skins/default/xui/de/panel_edit_shirt.xml b/indra/newview/skins/default/xui/de/panel_edit_shirt.xml
index 344b0b412a..4f140a2b01 100644
--- a/indra/newview/skins/default/xui/de/panel_edit_shirt.xml
+++ b/indra/newview/skins/default/xui/de/panel_edit_shirt.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_shirt_panel">
<panel name="avatar_shirt_color_panel">
- <texture_picker label="Stoff" name="Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
+ <texture_picker label="Textur" name="Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
<color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/de/panel_edit_shoes.xml b/indra/newview/skins/default/xui/de/panel_edit_shoes.xml
index 56aee5d0fe..abedb8d89e 100644
--- a/indra/newview/skins/default/xui/de/panel_edit_shoes.xml
+++ b/indra/newview/skins/default/xui/de/panel_edit_shoes.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_shoes_panel">
<panel name="avatar_shoes_color_panel">
- <texture_picker label="Stoff" name="Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
+ <texture_picker label="Textur" name="Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
<color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/de/panel_edit_skin.xml b/indra/newview/skins/default/xui/de/panel_edit_skin.xml
index f167f45e98..60f6919485 100644
--- a/indra/newview/skins/default/xui/de/panel_edit_skin.xml
+++ b/indra/newview/skins/default/xui/de/panel_edit_skin.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_skin_panel">
<panel name="avatar_skin_color_panel">
- <texture_picker label="Kopftattoo" name="Head Tattoos" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
- <texture_picker label="Obere Tattoos" name="Upper Tattoos" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
- <texture_picker label="Untere Tattoos" name="Lower Tattoos" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
+ <texture_picker label="Kopf" name="Head" tool_tip="Klicken, um ein Bild zu wählen"/>
+ <texture_picker label="Oberkörper" name="Upper Body" tool_tip="Klicken, um ein Bild zu wählen"/>
+ <texture_picker label="Unterkörper" name="Lower Body" tool_tip="Klicken, um ein Bild zu wählen"/>
</panel>
<panel name="accordion_panel">
<accordion name="wearable_accordion">
diff --git a/indra/newview/skins/default/xui/de/panel_edit_skirt.xml b/indra/newview/skins/default/xui/de/panel_edit_skirt.xml
index c8931bc947..07ce8a7436 100644
--- a/indra/newview/skins/default/xui/de/panel_edit_skirt.xml
+++ b/indra/newview/skins/default/xui/de/panel_edit_skirt.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_skirt_panel">
<panel name="avatar_skirt_color_panel">
- <texture_picker label="Stoff" name="Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
+ <texture_picker label="Textur" name="Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
<color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/de/panel_edit_socks.xml b/indra/newview/skins/default/xui/de/panel_edit_socks.xml
index abbeefa44e..4e72b63f49 100644
--- a/indra/newview/skins/default/xui/de/panel_edit_socks.xml
+++ b/indra/newview/skins/default/xui/de/panel_edit_socks.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_socks_panel">
<panel name="avatar_socks_color_panel">
- <texture_picker label="Stoff" name="Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
+ <texture_picker label="Textur" name="Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
<color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/de/panel_edit_underpants.xml b/indra/newview/skins/default/xui/de/panel_edit_underpants.xml
index 03c61a495d..1fad0ccedb 100644
--- a/indra/newview/skins/default/xui/de/panel_edit_underpants.xml
+++ b/indra/newview/skins/default/xui/de/panel_edit_underpants.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_underpants_panel">
<panel name="avatar_underpants_color_panel">
- <texture_picker label="Stoff" name="Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
+ <texture_picker label="Textur" name="Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
<color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/de/panel_edit_undershirt.xml b/indra/newview/skins/default/xui/de/panel_edit_undershirt.xml
index 39919393e1..9d193ffedb 100644
--- a/indra/newview/skins/default/xui/de/panel_edit_undershirt.xml
+++ b/indra/newview/skins/default/xui/de/panel_edit_undershirt.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_undershirt_panel">
<panel name="avatar_undershirt_color_panel">
- <texture_picker label="Stoff" name="Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
+ <texture_picker label="Textur" name="Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
<color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/de/panel_edit_wearable.xml b/indra/newview/skins/default/xui/de/panel_edit_wearable.xml
index 271db4c15c..94a79a0bbd 100644
--- a/indra/newview/skins/default/xui/de/panel_edit_wearable.xml
+++ b/indra/newview/skins/default/xui/de/panel_edit_wearable.xml
@@ -45,6 +45,9 @@
<string name="edit_tattoo_title">
Tätowierung bearbeiten
</string>
+ <string name="edit_physics_title">
+ Physik bearbeiten
+ </string>
<string name="shape_desc_text">
Form:
</string>
@@ -90,6 +93,9 @@
<string name="tattoo_desc_text">
Tätowierung:
</string>
+ <string name="physics_desc_text">
+ Physik:
+ </string>
<labeled_back_button label="Speichern" name="back_btn" tool_tip="Zurück zu Outfit bearbeiten"/>
<text name="edit_wearable_title" value="Form bearbeiten"/>
<panel label="Hemd" name="wearable_type_panel">
diff --git a/indra/newview/skins/default/xui/de/panel_friends.xml b/indra/newview/skins/default/xui/de/panel_friends.xml
deleted file mode 100644
index 50013a2b24..0000000000
--- a/indra/newview/skins/default/xui/de/panel_friends.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="friends">
- <string name="Multiple">
- Mehrere Freunde
- </string>
- <scroll_list name="friend_list" tool_tip="Halten Sie die Tasten „Umschalt“ oder „Strg“ gedrückt, um durch Klicken mehrere Freunde auszuwählen.">
- <column name="icon_online_status" tool_tip="Online-Status"/>
- <column label="Name" name="friend_name" tool_tip="Name"/>
- <column name="icon_visible_online" tool_tip="Freund kann sehen, wenn Sie online sind"/>
- <column name="icon_visible_map" tool_tip="Freund kann Sie auf der Karte finden"/>
- <column name="icon_edit_mine" tool_tip="Freunde können Objekte bearbeiten, löschen und an sich nehmen"/>
- <column name="icon_edit_theirs" tool_tip="Sie können die Objekte dieses Freunds bearbeiten"/>
- </scroll_list>
- <panel name="rights_container">
- <text name="friend_name_label">
- Wählen Sie den/die Freund(e) aus, dessen/deren Rechte Sie ändern möchten...
- </text>
- <check_box label="Kann meinen Online-Status sehen" name="online_status_cb" tool_tip="Festlegen, ob dieser Freund meinen Online-Status auf seiner Freundesliste oder Visitenkarte einsehen kann"/>
- <check_box label="Kann mich auf der Weltkarte sehen" name="map_status_cb" tool_tip="Festlegen, ob dieser Freund auf seiner Karte meinen Standort sehen kann"/>
- <check_box label="Kann meine Objekte verändern" name="modify_status_cb" tool_tip="Festlegen, ob dieser Freund meine Objekte verändern kann"/>
- <text name="process_rights_label">
- Rechte werden geändert...
- </text>
- </panel>
- <button label="IM/Anruf" name="im_btn" tool_tip="Beginnt eine Instant Message-Sitzung"/>
- <button label="Profil" name="profile_btn" tool_tip="Bilder, Gruppen und andere Informationen anzeigen"/>
- <button label="Teleportieren" name="offer_teleport_btn" tool_tip="Bieten Sie diesem Freund einen Teleport an Ihre Position an"/>
- <button label="Bezahlen" name="pay_btn" tool_tip="Diesem Freund Linden-Dollar (L$) geben"/>
- <button label="Entfernen" name="remove_btn" tool_tip="Diese Person von Ihrer Freundesliste entfernen"/>
- <button label="Hinzufügen" name="add_btn" tool_tip="Bieten Sie einem Einwohner die Freundschaft an"/>
-</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_group_invite.xml b/indra/newview/skins/default/xui/de/panel_group_invite.xml
index 4e3a304609..5f323d80dd 100644
--- a/indra/newview/skins/default/xui/de/panel_group_invite.xml
+++ b/indra/newview/skins/default/xui/de/panel_group_invite.xml
@@ -10,7 +10,7 @@
Einige der ausgewählten Einwohner sind bereits Gruppenmitglieder und haben aus diesem Grund keine Einladung erhalten.
</panel.string>
<text name="help_text">
- Sie können mehrere Einwohner Ihre Gruppe einladen. Klicken Sie hierzu auf „Einwohnerliste öffnen“.
+ Sie können mehrere Einwohner in Ihre Gruppe einladen. Klicken Sie hierzu auf „Einwohnerliste öffnen“.
</text>
<button label="Einwohnerliste öffnen" name="add_button" tool_tip=""/>
<name_list name="invitee_list" tool_tip="Halten Sie zur Mehrfachauswahl die Strg-Taste gedrückt und klicken Sie auf die Namen."/>
diff --git a/indra/newview/skins/default/xui/de/panel_group_notices.xml b/indra/newview/skins/default/xui/de/panel_group_notices.xml
index 8c1df04ed8..df423cc69a 100644
--- a/indra/newview/skins/default/xui/de/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/de/panel_group_notices.xml
@@ -49,7 +49,7 @@ Maximal 200 pro Gruppe täglich
Archivierte Mitteilung
</text>
<text name="lbl2">
- Um eine neue Mitteilung zu senden, klicken Sie die Schaltfläche +
+ Um eine neue Mitteilung zu senden, klicken Sie die + Neue Mitteilung
</text>
<text name="lbl3">
Betreff:
diff --git a/indra/newview/skins/default/xui/de/panel_instant_message.xml b/indra/newview/skins/default/xui/de/panel_instant_message.xml
index 1433552c15..372def78ca 100644
--- a/indra/newview/skins/default/xui/de/panel_instant_message.xml
+++ b/indra/newview/skins/default/xui/de/panel_instant_message.xml
@@ -4,7 +4,6 @@
6
</string>
<panel label="im_header" name="im_header">
- <text name="user_name" value="Erica Vader"/>
<text name="time_box" value="23:30"/>
</panel>
<button label="Antworten" name="reply"/>
diff --git a/indra/newview/skins/default/xui/de/panel_login.xml b/indra/newview/skins/default/xui/de/panel_login.xml
index 0fc4fa7117..553bd3e2ff 100644
--- a/indra/newview/skins/default/xui/de/panel_login.xml
+++ b/indra/newview/skins/default/xui/de/panel_login.xml
@@ -11,12 +11,19 @@
<text name="username_text">
Benutzername:
</text>
- <line_editor label="berndschmidt12 oder Liebe Sonne" name="username_edit" tool_tip="Bei der Registrierung gewählter Benutzername wie „berndschmidt12“ oder „Liebe Sonne“"/>
+ <combo_box name="username_combo" tool_tip="Bei der Registrierung gewählter Benutzername wie „berndschmidt12“ oder „Liebe Sonne“"/>
<text name="password_text">
Kennwort:
</text>
<check_box label="Kennwort merken" name="remember_check"/>
<button label="Anmelden" name="connect_btn"/>
+ <text name="mode_selection_text">
+ Modus:
+ </text>
+ <combo_box name="mode_combo" tool_tip="Wählen Sie den gewünschten Modus aus. Basis: Second Life schnell und einfach erkunden und chatten. Erweitert: Zugriff auf zusätzliche Funktionen.">
+ <combo_box.item label="Basis" name="Basic"/>
+ <combo_box.item label="Erweitert" name="Advanced"/>
+ </combo_box>
<text name="start_location_text">
Hier anfangen:
</text>
diff --git a/indra/newview/skins/default/xui/de/panel_me.xml b/indra/newview/skins/default/xui/de/panel_me.xml
index 26b9812212..f49446fbbf 100644
--- a/indra/newview/skins/default/xui/de/panel_me.xml
+++ b/indra/newview/skins/default/xui/de/panel_me.xml
@@ -1,7 +1,4 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Mein Profil" name="panel_me">
- <tab_container name="tabs">
- <panel label="MEIN PROFIL" name="panel_profile"/>
- <panel label="MEINE AUSWAHL" name="panel_picks"/>
- </tab_container>
+ <panel label="MEINE AUSWAHLEN" name="panel_picks"/>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_my_profile.xml b/indra/newview/skins/default/xui/de/panel_my_profile.xml
deleted file mode 100644
index aea87cc2c4..0000000000
--- a/indra/newview/skins/default/xui/de/panel_my_profile.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Profil" name="panel_profile">
- <string name="CaptionTextAcctInfo">
- [ACCTTYPE]
-[PAYMENTINFO] [AGEVERIFICATION]
- </string>
- <string name="payment_update_link_url">
- http://www.secondlife.com/account/billing.php?lang=de-DE
- </string>
- <string name="partner_edit_link_url">
- http://www.secondlife.com/account/partners.php?lang=de
- </string>
- <string name="my_account_link_url" value="http://secondlife.com/my/account/index.php?lang=de-DE"/>
- <string name="no_partner_text" value="Keiner"/>
- <string name="no_group_text" value="Keiner"/>
- <string name="RegisterDateFormat">
- [REG_DATE] ([AGE])
- </string>
- <layout_stack name="layout">
- <layout_panel name="profile_stack">
- <scroll_container name="profile_scroll">
- <panel name="scroll_content_panel">
- <panel name="second_life_image_panel">
- <icon label="" name="2nd_life_edit_icon" tool_tip="Klicken Sie unten auf die Schaltfläche Profil bearbeiten, um das Bild zu ändern."/>
- <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/>
- </panel>
- <panel name="first_life_image_panel">
- <icon label="" name="real_world_edit_icon" tool_tip="Klicken Sie unten auf die Schaltfläche Profil bearbeiten, um das Bild zu ändern."/>
- <text name="title_rw_descr_text" value="Echtes Leben:"/>
- </panel>
- <text name="title_member_text" value="Einwohner seit:"/>
- <text name="title_acc_status_text" value="Kontostatus:"/>
- <text_editor name="acc_status_text">
- Einwohner. Keine Zahlungsinfo archiviert.
- Linden.
- </text_editor>
- <text name="title_partner_text" value="Partner:"/>
- <panel name="partner_data_panel">
- <name_box initial_value="(wird in Datenbank gesucht)" name="partner_text"/>
- </panel>
- <text name="title_groups_text" value="Gruppen:"/>
- </panel>
- </scroll_container>
- </layout_panel>
- </layout_stack>
- <panel name="profile_me_buttons_panel">
- <button label="Profil bearbeiten" name="edit_profile_btn" tool_tip="Ihre persönlichen Informationen bearbeiten"/>
- </panel>
-</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_navigation_bar.xml b/indra/newview/skins/default/xui/de/panel_navigation_bar.xml
index ee1a543aac..53794b6619 100644
--- a/indra/newview/skins/default/xui/de/panel_navigation_bar.xml
+++ b/indra/newview/skins/default/xui/de/panel_navigation_bar.xml
@@ -1,18 +1,23 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="navigation_bar">
- <panel name="navigation_panel">
- <pull_button name="back_btn" tool_tip="Zurück zum vorherigen Standort teleportieren"/>
- <pull_button name="forward_btn" tool_tip="Um einen Standort weiter teleportieren"/>
- <button name="home_btn" tool_tip="Zu meinem Zuhause teleportieren"/>
- <location_input label="Standort" name="location_combo"/>
- <search_combo_box label="Suche" name="search_combo_box" tool_tip="Suche">
- <combo_editor label="[SECOND_LIFE] durchsuchen" name="search_combo_editor"/>
- </search_combo_box>
- </panel>
- <favorites_bar name="favorite" tool_tip="Ziehen Sie Landmarken hier hin, damit Sie schnell zu Ihren Lieblingsplätzen in Second Life gelangen können!">
- <label name="favorites_bar_label" tool_tip="Ziehen Sie Landmarken hier hin, damit Sie schnell zu Ihren Lieblingsplätzen in Second Life gelangen können!">
- Favoritenleiste
- </label>
- <chevron_button name="&gt;&gt;" tool_tip="Mehr meiner Favoriten anzeigen"/>
- </favorites_bar>
+ <layout_stack name="nvp_stack">
+ <layout_panel name="navigation_layout_panel">
+ <panel name="navigation_panel">
+ <pull_button name="back_btn" tool_tip="Zum vorherigen Standort zurückgehen"/>
+ <pull_button name="forward_btn" tool_tip="Einen Standort weiter gehen"/>
+ <button name="home_btn" tool_tip="Zu meinem Zuhause teleportieren"/>
+ <location_input label="Standort" name="location_combo"/>
+ </panel>
+ </layout_panel>
+ <layout_panel name="favorites_layout_panel">
+ <favorites_bar name="favorite" tool_tip="Landmarken hierher ziehen für schnellen Zugriff auf Lieblingsorte in Second Life.">
+ <label name="favorites_bar_label" tool_tip="Landmarken hierher ziehen für schnellen Zugriff auf Lieblingsorte in Second Life.">
+ Favoritenleiste
+ </label>
+ <more_button name="&gt;&gt;" tool_tip="Mehr meiner Favoriten anzeigen">
+ Mehr â–¼
+ </more_button>
+ </favorites_bar>
+ </layout_panel>
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_nearby_chat.xml b/indra/newview/skins/default/xui/de/panel_nearby_chat.xml
new file mode 100644
index 0000000000..07ad761791
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_nearby_chat.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="nearby_chat">
+ <layout_stack name="stack">
+ <layout_panel name="translate_chat_checkbox_lp">
+ <check_box label="Chat übersetzen" name="translate_chat_checkbox"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_nearby_media.xml b/indra/newview/skins/default/xui/de/panel_nearby_media.xml
index ef66148902..90885c7192 100644
--- a/indra/newview/skins/default/xui/de/panel_nearby_media.xml
+++ b/indra/newview/skins/default/xui/de/panel_nearby_media.xml
@@ -19,7 +19,7 @@
<button label="Stoppen" name="all_nearby_media_disable_btn" tool_tip="Alle Medien in der Nähe ausschalten"/>
<button label="Starten" name="all_nearby_media_enable_btn" tool_tip="Alle Medien in der Nähe einschalten"/>
<button name="open_prefs_btn" tool_tip="Medien-Einstellungen öffnen"/>
- <button label="Mehr &gt;&gt;" label_selected="Weniger &lt;&lt;" name="more_btn" tool_tip="Erweiterte Steuerung"/>
+ <button label="Mehr &gt;&gt;" label_selected="&lt;&lt; Weniger" name="more_btn" tool_tip="Erweiterte Steuerung"/>
<button label="Mehr &gt;&gt;" label_selected="Weniger &lt;&lt;" name="less_btn" tool_tip="Erweiterte Steuerung"/>
</panel>
<panel name="nearby_media_panel">
diff --git a/indra/newview/skins/default/xui/de/panel_notes.xml b/indra/newview/skins/default/xui/de/panel_notes.xml
deleted file mode 100644
index ef1961b63d..0000000000
--- a/indra/newview/skins/default/xui/de/panel_notes.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Notizen &amp; Privatsphäre" name="panel_notes">
- <layout_stack name="layout">
- <layout_panel name="notes_stack">
- <scroll_container name="profile_scroll">
- <panel name="profile_scroll_panel">
- <text name="status_message" value="Meine Notizen:"/>
- <text name="status_message2" value="Diese Person kann:"/>
- <check_box label="meinen Online-Status sehen." name="status_check"/>
- <check_box label="mich auf der Karte sehen." name="map_check"/>
- <check_box label="meine Objekte bearbeiten, löschen oder nehmen." name="objects_check"/>
- </panel>
- </scroll_container>
- </layout_panel>
- <layout_panel name="notes_buttons_panel">
- <layout_stack name="bottom_bar_ls">
- <layout_panel name="add_friend_btn_lp">
- <button label="Freund hinzufügen" name="add_friend" tool_tip="Dem Einwohner die Freundschaft anbieten"/>
- </layout_panel>
- <layout_panel name="im_btn_lp">
- <button label="IM" name="im" tool_tip="Instant Messenger öffnen"/>
- </layout_panel>
- <layout_panel name="call_btn_lp">
- <button label="Anrufen" name="call" tool_tip="Diesen Einwohner anrufen"/>
- </layout_panel>
- <layout_panel name="show_on_map_btn_lp">
- <button label="Karte" name="show_on_map_btn" tool_tip="Einwohner auf Karte anzeigen"/>
- </layout_panel>
- <layout_panel name="teleport_btn_lp">
- <button label="Teleportieren" name="teleport" tool_tip="Teleport anbieten"/>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_notify_textbox.xml b/indra/newview/skins/default/xui/de/panel_notify_textbox.xml
new file mode 100644
index 0000000000..da672a0309
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_notify_textbox.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="instant_message" name="panel_notify_textbox">
+ <string name="message_max_lines_count" value="7"/>
+ <panel label="info_panel" name="info_panel">
+ <text_editor name="message" value="message"/>
+ </panel>
+ <panel label="control_panel" name="control_panel">
+ <button label="Senden" name="btn_submit"/>
+ <button label="Ignorieren" name="ignore_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_outbox_inventory.xml b/indra/newview/skins/default/xui/de/panel_outbox_inventory.xml
new file mode 100644
index 0000000000..4006022ffc
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_outbox_inventory.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<outbox_inventory_panel name="inventory_outbox" tool_tip="Legen Sie Artikel hier ab, um sie zum Verkauf in Ihrem Laden vorzubereiten"/>
diff --git a/indra/newview/skins/default/xui/de/panel_outfit_edit.xml b/indra/newview/skins/default/xui/de/panel_outfit_edit.xml
index 632f414747..1af0492aa1 100644
--- a/indra/newview/skins/default/xui/de/panel_outfit_edit.xml
+++ b/indra/newview/skins/default/xui/de/panel_outfit_edit.xml
@@ -46,8 +46,8 @@
</panel>
<panel name="save_revert_button_bar">
<layout_stack name="button_bar_ls">
- <layout_panel name="save_btn_lp">
- <button label="Speichern" name="save_btn"/>
+ <layout_panel name="save_btn_lp" width="61">
+ <button label="Speichern" name="save_btn" width="60" />
</layout_panel>
<layout_panel name="revert_btn_lp">
<button label="Änderungen rückgängig machen" name="revert_btn" tool_tip="Zur zuletzt gespeicherten Version zurückkehren"/>
diff --git a/indra/newview/skins/default/xui/de/panel_outfits_list.xml b/indra/newview/skins/default/xui/de/panel_outfits_list.xml
index 65a38ea342..ea3a938be9 100644
--- a/indra/newview/skins/default/xui/de/panel_outfits_list.xml
+++ b/indra/newview/skins/default/xui/de/panel_outfits_list.xml
@@ -1,7 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="Outfits">
+ <accordion name="outfits_accordion">
+ <no_matched_tabs_text name="no_matched_outfits_msg" value="Sie haben nicht das Richtige gefunden? Versuchen Sie es mit der [secondlife:///app/search/all/[SEARCH_TERM] Suche]."/>
+ <no_visible_tabs_text name="no_outfits_msg" value="Sie haben noch keine Outfits. Versuchen Sie es mit der [secondlife:///app/search/all/ ] Suche]."/>
+ </accordion>
<panel name="bottom_panel">
- <button name="options_gear_btn" tool_tip="Zusätzliche Optionen anzeigen"/>
+ <menu_button name="options_gear_btn" tool_tip="Zusätzliche Optionen anzeigen"/>
<button name="trash_btn" tool_tip="Ausgewähltes Outfit löschen"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_people.xml b/indra/newview/skins/default/xui/de/panel_people.xml
index 6c859da4d6..4e76147746 100644
--- a/indra/newview/skins/default/xui/de/panel_people.xml
+++ b/indra/newview/skins/default/xui/de/panel_people.xml
@@ -18,11 +18,13 @@ Sie suchen nach Leuten? Verwenden Sie die [secondlife:///app/worldmap Karte].
<string name="groups_filter_label" value="Nach Gruppen filtern"/>
<string name="no_filtered_groups_msg" value="Sie haben nicht das Richtige gefunden? Versuchen Sie es mit der [secondlife:///app/search/groups/[SEARCH_TERM] Suche]."/>
<string name="no_groups_msg" value="Suchen Sie nach Gruppen? Versuchen Sie es mit der [secondlife:///app/search/groups Suche]."/>
+ <string name="MiniMapToolTipMsg" value="[REGION](Doppelklicken, um Karte zu öffnen; Umschalttaste gedrückt halten und ziehen, um zu schwenken)"/>
+ <string name="AltMiniMapToolTipMsg" value="[REGION](Doppelklicken, um zu teleportieren; Umschalttaste gedrückt halten und ziehen, um zu schwenken)"/>
<filter_editor label="Filter" name="filter_input"/>
<tab_container name="tabs">
<panel label="IN DER NÄHE" name="nearby_panel">
<panel label="bottom_panel" name="bottom_panel">
- <button name="nearby_view_sort_btn" tool_tip="Optionen"/>
+ <menu_button name="nearby_view_sort_btn" tool_tip="Optionen"/>
<button name="add_friend_btn" tool_tip="Ausgewählten Einwohner zur Freundeliste hinzufügen"/>
</panel>
</panel>
@@ -34,27 +36,27 @@ Sie suchen nach Leuten? Verwenden Sie die [secondlife:///app/worldmap Karte].
<panel label="bottom_panel" name="bottom_panel">
<layout_stack name="bottom_panel">
<layout_panel name="options_gear_btn_panel">
- <button name="friends_viewsort_btn" tool_tip="Zusätzliche Optionen anzeigen"/>
+ <menu_button name="friends_viewsort_btn" tool_tip="Zusätzliche Optionen anzeigen"/>
</layout_panel>
<layout_panel name="add_btn_panel">
<button name="add_btn" tool_tip="Bieten Sie einem Einwohner die Freundschaft an"/>
</layout_panel>
<layout_panel name="trash_btn_panel">
- <dnd_button name="trash_btn" tool_tip="Ausgewählte Person von Ihrer Freundesliste entfernen"/>
+ <dnd_button name="del_btn" tool_tip="Ausgewählte Person aus Ihrer Freundesliste entfernen"/>
</layout_panel>
</layout_stack>
</panel>
</panel>
<panel label="MEINE GRUPPEN" name="groups_panel">
<panel label="bottom_panel" name="bottom_panel">
- <button name="groups_viewsort_btn" tool_tip="Optionen"/>
+ <menu_button name="groups_viewsort_btn" tool_tip="Optionen"/>
<button name="plus_btn" tool_tip="Gruppe beitreten/Neue Gruppe erstellen"/>
<button name="activate_btn" tool_tip="Ausgewählte Gruppe aktivieren"/>
</panel>
</panel>
<panel label="AKTUELL" name="recent_panel">
<panel label="bottom_panel" name="bottom_panel">
- <button name="recent_viewsort_btn" tool_tip="Optionen"/>
+ <menu_button name="recent_viewsort_btn" tool_tip="Optionen"/>
<button name="add_friend_btn" tool_tip="Ausgewählten Einwohner zur Freundeliste hinzufügen"/>
</panel>
</panel>
@@ -64,16 +66,16 @@ Sie suchen nach Leuten? Verwenden Sie die [secondlife:///app/worldmap Karte].
<layout_panel name="view_profile_btn_lp">
<button label="Profil" name="view_profile_btn" tool_tip="Bilder, Gruppen und andere Einwohner-Informationen anzeigen"/>
</layout_panel>
- <layout_panel name="chat_btn_lp">
- <button label="IM" name="im_btn" tool_tip="Instant Messenger öffnen"/>
+ <layout_panel name="im_btn_lp">
+ <button label="IM" name="im_btn" tool_tip="IM-Sitzung öffnen"/>
</layout_panel>
- <layout_panel name="chat_btn_lp">
+ <layout_panel name="call_btn_lp">
<button label="Anrufen" name="call_btn" tool_tip="Diesen Einwohner anrufen"/>
</layout_panel>
- <layout_panel name="chat_btn_lp">
- <button label="Teilen" name="share_btn" tool_tip="Inventarobjekt teilen"/>
+ <layout_panel name="share_btn_lp">
+ <button label="Freigeben" name="share_btn" tool_tip="Inventarobjekt freigeben"/>
</layout_panel>
- <layout_panel name="chat_btn_lp">
+ <layout_panel name="teleport_btn_lp">
<button label="Teleportieren" name="teleport_btn" tool_tip="Teleport anbieten"/>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/de/panel_place_profile.xml b/indra/newview/skins/default/xui/de/panel_place_profile.xml
index 555fa56d57..4077fdab36 100644
--- a/indra/newview/skins/default/xui/de/panel_place_profile.xml
+++ b/indra/newview/skins/default/xui/de/panel_place_profile.xml
@@ -68,6 +68,8 @@
<text name="scripts_value" value="Ein"/>
<text name="damage_label" value="Schaden:"/>
<text name="damage_value" value="Aus"/>
+ <text name="see_avatars_label" value="Avatare sehen:"/>
+ <text name="see_avatars_value" value="Aus"/>
<button label="Ãœber Land" name="about_land_btn"/>
</panel>
</accordion_tab>
diff --git a/indra/newview/skins/default/xui/de/panel_places.xml b/indra/newview/skins/default/xui/de/panel_places.xml
index 0e85829a0b..602ffff94d 100644
--- a/indra/newview/skins/default/xui/de/panel_places.xml
+++ b/indra/newview/skins/default/xui/de/panel_places.xml
@@ -21,10 +21,10 @@
<button label="Bearbeiten" name="edit_btn" tool_tip="Landmarken-Info bearbeiten"/>
</layout_panel>
<layout_panel name="overflow_btn_lp">
- <button label="▼" name="overflow_btn" tool_tip="Zusätzliche Optionen anzeigen"/>
+ <menu_button label="▼" name="overflow_btn" tool_tip="Zusätzliche Optionen anzeigen"/>
</layout_panel>
</layout_stack>
- <layout_stack name="bottom_bar_ls3">
+ <layout_stack name="bottom_bar_profile_ls">
<layout_panel name="profile_btn_lp">
<button label="Profil" name="profile_btn" tool_tip="Ortsprofil anzeigen"/>
</layout_panel>
diff --git a/indra/newview/skins/default/xui/de/panel_postcard_message.xml b/indra/newview/skins/default/xui/de/panel_postcard_message.xml
new file mode 100644
index 0000000000..6eeef8af71
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_postcard_message.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_postcard_message">
+ <text name="to_label">
+ An:
+ </text>
+ <text name="name_label">
+ Von:
+ </text>
+ <text name="subject_label">
+ Betreff:
+ </text>
+ <line_editor label="Betreff hier eingeben." name="subject_form"/>
+ <text name="msg_label">
+ Nachricht:
+ </text>
+ <text_editor name="msg_form">
+ Nachricht hier eingeben.
+ </text_editor>
+ <button label="Abbrechen" name="cancel_btn"/>
+ <button label="Senden" name="send_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_postcard_settings.xml b/indra/newview/skins/default/xui/de/panel_postcard_settings.xml
new file mode 100644
index 0000000000..c1a1c0cc46
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_postcard_settings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_postcard_settings">
+ <combo_box label="Auflösung" name="postcard_size_combo">
+ <combo_box.item label="Aktuelles Fenster" name="CurrentWindow"/>
+ <combo_box.item label="640x480" name="640x480"/>
+ <combo_box.item label="800x600" name="800x600"/>
+ <combo_box.item label="1024x768" name="1024x768"/>
+ <combo_box.item label="Benutzerdefiniert" name="Custom"/>
+ </combo_box>
+ <layout_stack name="postcard_image_params_ls">
+ <layout_panel name="postcard_image_size_lp">
+ <spinner label="Breite" name="postcard_snapshot_width"/>
+ <spinner label="Höhe" name="postcard_snapshot_height"/>
+ <check_box label="Seitenverhältnis beibehalten" name="postcard_keep_aspect_check"/>
+ </layout_panel>
+ <layout_panel name="postcard_image_format_quality_lp">
+ <slider label="Bildqualität" name="image_quality_slider"/>
+ <text name="image_quality_level">
+ ([QLVL])
+ </text>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/de/panel_preferences_advanced.xml
index 7b6918ae24..8a5c175f2f 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_advanced.xml
@@ -3,35 +3,29 @@
<panel.string name="aspect_ratio_text">
[NUM]:[DEN]
</panel.string>
- <panel.string name="middle_mouse">
- Mittlere Maustaste
- </panel.string>
- <slider label="Sichtwinkel" name="camera_fov"/>
- <slider label="Abstand" name="camera_offset_scale"/>
- <text name="heading2">
- Automatische Position für:
+ <text name="Cache:">
+ Cache:
+ </text>
+ <spinner label="Cache-Größe (64 – 9.984 MB)" name="cachesizespinner"/>
+ <text name="text_box5">
+ MB
+ </text>
+ <button label="Cache leeren" label_selected="Cache leeren" name="clear_cache"/>
+ <text name="Cache location">
+ Cache-Ordner:
</text>
- <check_box label="Bauen/Bearbeiten" name="edit_camera_movement" tool_tip="Automatische Kamerapositionierung bei Wechsel in und aus dem Bearbeitungsmodus verwenden"/>
- <check_box label="Aussehen" name="appearance_camera_movement" tool_tip="Automatische Kamerapositionierung im Bearbeitenmodus verwenden"/>
- <check_box initial_value="true" label="Seitenleiste" name="appearance_sidebar_positioning" tool_tip="Automatische Kameraposition für Seitenleiste verwenden"/>
- <check_box label="Mich im Mouselook anzeigen" name="first_person_avatar_visible"/>
- <check_box label="Mit Pfeiltasten bewegen" name="arrow_keys_move_avatar_check"/>
- <check_box label="2-mal-drücken-halten, um zu rennen" name="tap_tap_hold_to_run"/>
- <check_box label="Avatarlippen beim Sprechen bewegen" name="enable_lip_sync"/>
- <check_box label="Blasen-Chat" name="bubble_text_chat"/>
- <slider label="Deckkraft" label_width="66" name="bubble_chat_opacity"/>
- <color_swatch left_pad="35" name="background" tool_tip="Farbe für Blasen-Chat auswählen"/>
+ <button label="Durchsuchen" label_selected="Durchsuchen" name="set_cache"/>
+ <button label="Vorgabestandort" label_selected="Vorgabestandort" name="default_cache_location"/>
<text name="UI Size:">
- UI-Größe
+ UI-Größe:
</text>
<check_box label="Skript-Fehler anzeigen:" name="show_script_errors"/>
<radio_group name="show_location">
<radio_item label="Chat in der Nähe" name="0"/>
<radio_item label="Getrenntes Fenster" name="1"/>
</radio_group>
- <check_box label="Sprachfunktion ein-/ausschalten, wenn gedrückt wird:" name="push_to_talk_toggle_check" tool_tip="Wenn der Umschaltmodus aktiviert ist, drücken Sie die Auslöse-Taste EINMAL, um Ihr Mikrofon an oder aus zu stellen. Wenn der Umschaltmodus nicht motiviert ist, ist das Mikro nur dann eingeschaltet, wenn Sie die Auslösetaste gedrückt halten."/>
- <line_editor label="Auslöser für Zum-Sprechen-drücken:" name="modifier_combo"/>
- <button label="Taste festlegen" name="set_voice_hotkey_button"/>
- <button label="Mittlere Maustaste" name="set_voice_middlemouse_button" tool_tip="Auf mittlere Maustaste zurücksetzen"/>
- <button label="Andere Geräte" name="joystick_setup_button"/>
+ <check_box label="Mehrere Viewer zulassen" name="allow_multiple_viewer_check"/>
+ <check_box label="Bei Anmeldung Rasterauswahl anzeigen" name="show_grid_selection_check"/>
+ <check_box label="Menü „Erweitert“ anzeigen" name="show_advanced_menu_check"/>
+ <check_box label="Menü „Entwickler“ anzeigen" name="show_develop_menu_check"/>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_chat.xml b/indra/newview/skins/default/xui/de/panel_preferences_chat.xml
index aa314a1a57..746a561e6c 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_chat.xml
@@ -8,44 +8,10 @@
<radio_item label="Mittel" name="radio2" value="1"/>
<radio_item label="Groß" name="radio3" value="2"/>
</radio_group>
- <text name="font_colors">
- Schriftfarben:
- </text>
- <color_swatch label="Sie" name="user"/>
- <text name="text_box1">
- Ich
- </text>
- <color_swatch label="Andere" name="agent"/>
- <text name="text_box2">
- Andere
- </text>
- <color_swatch label="IM" name="im"/>
- <text name="text_box3">
- IM
- </text>
- <color_swatch label="System" name="system"/>
- <text name="text_box4">
- System
- </text>
- <color_swatch label="Skriptfehler" name="script_error"/>
- <text name="text_box5">
- Skriptfehler
- </text>
- <color_swatch label="Objekte" name="objects"/>
- <text name="text_box6">
- Objekte
- </text>
- <color_swatch label="Eigentümer" name="owner"/>
- <text name="text_box7">
- Eigentümer
- </text>
- <color_swatch label="URLs" name="links"/>
- <text name="text_box9">
- URLs
- </text>
<check_box initial_value="true" label="Beim Chatten Tippanimation abspielen" name="play_typing_animation"/>
<check_box label="IMs per Email zuschicken, wenn ich offline bin" name="send_im_to_email"/>
<check_box label="Kompakten IM- und Text-Chatverlauf aktivieren" name="plain_text_chat_history"/>
+ <check_box label="Blasen-Chat" name="bubble_text_chat"/>
<text name="show_ims_in_label">
IMs anzeigen in:
</text>
@@ -56,27 +22,12 @@
<radio_item label="Getrennte Fenster" name="radio" value="0"/>
<radio_item label="Registerkarten" name="radio2" value="1"/>
</radio_group>
- <check_box label="Bei Chat Maschinenübersetzung verwenden (Service von Google)" name="translate_chat_checkbox"/>
- <text name="translate_language_text">
- Chat übersetzen in:
- </text>
- <combo_box name="translate_language_combobox" width="200">
- <combo_box.item label="Systemstandard" name="System Default Language"/>
- <combo_box.item label="English (Englisch)" name="English"/>
- <combo_box.item label="Dansk (Dänisch)" name="Danish"/>
- <combo_box.item label="Deutsch" name="German"/>
- <combo_box.item label="Español (Spanisch)" name="Spanish"/>
- <combo_box.item label="Français (Französisch)" name="French"/>
- <combo_box.item label="Italiano (Italienisch)" name="Italian"/>
- <combo_box.item label="Magyar (Ungarisch)" name="Hungarian"/>
- <combo_box.item label="Nederlands (Holländisch)" name="Dutch"/>
- <combo_box.item label="Polski (Polnisch)" name="Polish"/>
- <combo_box.item label="Português (Portugiesisch)" name="Portugese"/>
- <combo_box.item label="РуÑÑкий (Russisch)" name="Russian"/>
- <combo_box.item label="Türkçe (Türkisch)" name="Turkish"/>
- <combo_box.item label="УкраїнÑька (Ukrainisch)" name="Ukrainian"/>
- <combo_box.item label="中文 (简体) (Chinesisch)" name="Chinese"/>
- <combo_box.item label="日本語 (Japanisch)" name="Japanese"/>
- <combo_box.item label="한국어 (Koreanisch)" name="Korean"/>
- </combo_box>
+ <text name="disable_toast_label">
+ Popups für eingehende Chats aktivieren:
+ </text>
+ <check_box label="Gruppen-Chats" name="EnableGroupChatPopups" tool_tip="Markieren, um Popups zu sehen, wenn Gruppen-Chat-Message eintrifft"/>
+ <check_box label="IM-Chats" name="EnableIMChatPopups" tool_tip="Markieren, um Popups zu sehen, wenn Instant Message eintrifft"/>
+ <spinner label="Lebenszeit von Toasts für Chat in der Nähe:" name="nearby_toasts_lifetime"/>
+ <spinner label="Ein-/Ausblenddauer von Toasts für Chat in der Nähe:" name="nearby_toasts_fadingtime"/>
+ <button label="Übersetzungseinstellungen für Chats" name="ok_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_colors.xml b/indra/newview/skins/default/xui/de/panel_preferences_colors.xml
new file mode 100644
index 0000000000..19c5efcb05
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_preferences_colors.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Farben" name="colors_panel">
+ <text name="effects_color_textbox">
+ Meine Effekte (Auswahlstrahl):
+ </text>
+ <color_swatch name="effect_color_swatch" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
+ <text name="font_colors">
+ Schriftfarben für Chat:
+ </text>
+ <text name="text_box1">
+ Ich
+ </text>
+ <text name="text_box2">
+ Andere
+ </text>
+ <text name="text_box3">
+ Objekte
+ </text>
+ <text name="text_box4">
+ System
+ </text>
+ <text name="text_box5">
+ Fehler
+ </text>
+ <text name="text_box10">
+ Direkt
+ </text>
+ <text name="text_box7">
+ Eigentümer
+ </text>
+ <text name="text_box9">
+ URLs
+ </text>
+ <text name="bubble_chat">
+ Hintergrundfarbe für Avatarnamen (wirkt sich auch auf Blasen-Chat aus):
+ </text>
+ <color_swatch name="background" tool_tip="Farbe für Avatarnamen auswählen"/>
+ <slider label="Deckkraft:" name="bubble_chat_opacity" tool_tip="Deckkraft für Avatarnamen auswählen"/>
+ <text name="floater_opacity">
+ Floater-Deckkraft:
+ </text>
+ <slider label="Aktiv:" name="active"/>
+ <slider label="Inaktiv:" name="inactive"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_general.xml b/indra/newview/skins/default/xui/de/panel_preferences_general.xml
index 8492d36bc7..979ccba48d 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_general.xml
@@ -11,10 +11,12 @@
<combo_box.item label="Español (Spanisch) - Beta" name="Spanish"/>
<combo_box.item label="Français (Französisch) - Beta" name="French"/>
<combo_box.item label="Italiano (Italienisch) - Beta" name="Italian"/>
- <combo_box.item label="Nederlands (Niederländisch) - Beta" name="Dutch"/>
<combo_box.item label="Polski (Polnisch) - Beta" name="Polish"/>
<combo_box.item label="Português (Portugiesisch) - Beta" name="Portugese"/>
+ <combo_box.item label="РуÑÑкий (Russisch) – Beta" name="Russian"/>
+ <combo_box.item label="Türkçe (Türkisch) – Beta" name="Turkish"/>
<combo_box.item label="日本語 (Japanisch) - Beta" name="(Japanese)"/>
+ <combo_box.item label="正體中文 (Traditionelles Chinesisch) – Beta" name="Traditional Chinese"/>
</combo_box>
<text name="language_textbox2">
(Erfordert Neustart)
@@ -48,13 +50,17 @@
<check_box label="Benutzernamen" name="show_slids" tool_tip="Benutzernamen wie berndschmidt123 anzeigen"/>
<check_box label="Gruppentitel" name="show_all_title_checkbox1" tool_tip="Gruppentitel wie „Vorstand“ oder „Mitglied“"/>
<check_box label="Freunde hervorheben" name="show_friends" tool_tip="Avatarnamen Ihrer Freunde hervorheben"/>
- <text name="effects_color_textbox">
- Meine Effekte:
+ <check_box label="Anzeigenamen anzeigen" name="display_names_check" tool_tip="Aktivieren Sie diese Option, um Anzeigenamen in Chat, IM, Avatarnamen usw. zu verwenden."/>
+ <text name="inworld_typing_rg_label">
+ Drücken von Buchstabentasten:
</text>
+ <radio_group name="inworld_typing_preference">
+ <radio_item label="Startet lokalen Chat" name="radio_start_chat" value="1"/>
+ <radio_item label="Beeinflusst Bewegung (z. B. WASD)" name="radio_move" value="0"/>
+ </radio_group>
<text name="title_afk_text">
Zeit bis zur Abwesenheit:
</text>
- <color_swatch label="" name="effect_color_swatch" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
<combo_box label="Timeout für Abwesenheit:" name="afk">
<combo_box.item label="2 Minuten" name="item0"/>
<combo_box.item label="5 Minuten" name="item1"/>
@@ -62,7 +68,6 @@
<combo_box.item label="30 Minuten" name="item3"/>
<combo_box.item label="nie" name="item4"/>
</combo_box>
- <check_box label="Anzeigenamen anzeigen" name="display_names_check" tool_tip="Aktivieren Sie diese Option, um Anzeigenamen in Chat, IM, Avatarnamen usw. zu verwenden."/>
<text name="text_box3">
Antwort, wenn im „Beschäftigt“-Modus:
</text>
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml
index ae3c791ab9..9175ea0bae 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml
@@ -25,9 +25,22 @@
<text name="ShadersText">
Shader:
</text>
+ <check_box initial_value="true" label="Transparentes Wasser" name="TransparentWater"/>
<check_box initial_value="true" label="Bumpmapping und Glanz" name="BumpShiny"/>
+ <check_box initial_value="true" label="Lokale Lichtquellen" name="LocalLights"/>
<check_box initial_value="true" label="Einfache Shader" name="BasicShaders" tool_tip="Deaktivieren Sie diese Option, wenn der Grafikkartentreiber Abstürze verursacht"/>
<check_box initial_value="true" label="Atmosphären-Shader" name="WindLightUseAtmosShaders"/>
+ <check_box initial_value="true" label="Licht und Schatten" name="UseLightShaders"/>
+ <check_box initial_value="true" label="Ambient Occlusion" name="UseSSAO"/>
+ <check_box initial_value="true" label="Schärfentiefe" name="UseDoF"/>
+ <text name="shadows_label">
+ Schatten:
+ </text>
+ <combo_box name="ShadowDetail">
+ <combo_box.item label="Keine" name="0"/>
+ <combo_box.item label="Sonne/Mond" name="1"/>
+ <combo_box.item label="Sonne/Mond + Projektoren" name="2"/>
+ </combo_box>
<text name="reflection_label">
Wasserreflexionen:
</text>
@@ -38,15 +51,19 @@
<combo_box.item label="Alle Avatare und Objekte" name="3"/>
<combo_box.item label="Alles" name="4"/>
</combo_box>
+ <slider label="Avatar-Physik:" name="AvatarPhysicsDetail"/>
+ <text name="AvatarPhysicsDetailText">
+ Niedrig
+ </text>
<slider label="Sichtweite:" name="DrawDistance"/>
<text name="DrawDistanceMeterText2">
m
</text>
<slider label="Max. Partikelzahl:" name="MaxParticleCount"/>
- <slider label="Max. Anzahl an voll dargestellten Avataren:" name="MaxNumberAvatarDrawn"/>
+ <slider label="Max. Anzahl an voll dargestellten Avataren:" label_width="230" name="MaxNumberAvatarDrawn" width="315"/>
<slider label="Post-Processing-Qualität:" name="RenderPostProcess"/>
<text name="MeshDetailText">
- Gitterdetails:
+ Darstellungsgrad:
</text>
<slider label=" Objekte:" name="ObjectMeshDetail"/>
<slider label=" Flexiprimitiva:" name="FlexibleMeshDetail"/>
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_move.xml b/indra/newview/skins/default/xui/de/panel_preferences_move.xml
new file mode 100644
index 0000000000..3e248f0bf0
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_preferences_move.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Bewegen" name="move_panel">
+ <slider label="Sichtwinkel" name="camera_fov"/>
+ <slider label="Abstand" name="camera_offset_scale"/>
+ <text name="heading2">
+ Automatische Position für:
+ </text>
+ <check_box label="Bauen/Bearbeiten" name="edit_camera_movement" tool_tip="Automatische Kamerapositionierung bei Wechsel in und aus dem Bearbeitungsmodus verwenden"/>
+ <check_box label="Aussehen" name="appearance_camera_movement" tool_tip="Automatische Kamerapositionierung im Bearbeitenmodus verwenden"/>
+ <text name="keyboard_lbl">
+ Tastatur:
+ </text>
+ <check_box label="Mit Pfeiltasten bewegen" name="arrow_keys_move_avatar_check"/>
+ <check_box label="Drücken-drücken-halten, um zu rennen" name="tap_tap_hold_to_run"/>
+ <text name="mouse_lbl">
+ Maus:
+ </text>
+ <check_box label="Mich im Mouselook anzeigen" name="first_person_avatar_visible"/>
+ <text name=" Mouse Sensitivity">
+ Mausempfindlichkeit für Mouselook:
+ </text>
+ <check_box label="Umkehren" name="invert_mouse"/>
+ <text name="single_click_action_lbl">
+ Einmal auf Land klicken:
+ </text>
+ <combo_box name="single_click_action_combo">
+ <combo_box.item label="Keine Aktion" name="0"/>
+ <combo_box.item label="Zu angeklicktem Ort bewegen" name="1"/>
+ </combo_box>
+ <text name="double_click_action_lbl">
+ Auf Land doppelklicken:
+ </text>
+ <combo_box name="double_click_action_combo">
+ <combo_box.item label="Keine Aktion" name="0"/>
+ <combo_box.item label="Zu angeklicktem Ort bewegen" name="1"/>
+ <combo_box.item label="Zu angeklicktem Ort teleportieren" name="2"/>
+ </combo_box>
+ <button label="Andere Geräte" name="joystick_setup_button"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml
index 42a625fbf6..e21bed6bb5 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml
@@ -7,19 +7,24 @@
<text name="cache_size_label_l">
(Standorte, Bilder, Web, Suchverlauf)
</text>
+ <check_box label="In Suchergebnissen anzeigen" name="online_searchresults"/>
<check_box label="Nur Freunde und Gruppen wissen, dass ich online bin" name="online_visibility"/>
<check_box label="Nur Freunde und Gruppen können mich anrufen oder mir eine IM schicken" name="voice_call_friends_only_check"/>
<check_box label="Mikrofon ausschalten, wenn Anrufe beendet werden" name="auto_disengage_mic_check"/>
- <check_box label="Cookies annehmen" name="cookies_enabled"/>
+ <check_box label="Meine Lieblingslandmarken bei Anmeldung anzeigen (im Dropdown-Menü &#10;„Hier anfangen“)" name="favorites_on_login_check" top_pad="15"/>
<text name="Logs:">
- Protokolle:
+ Chatprotokolle:
</text>
<check_box label="Protokolle von Gesprächen in der Nähe auf meinem Computer speichern" name="log_nearby_chat"/>
<check_box label="IM Protokolle auf meinem Computer speichern" name="log_instant_messages"/>
- <check_box label="Zeitstempel hinzufügen" name="show_timestamps_check_im"/>
+ <check_box label="Zeitstempel zu jeder Zeile im Chatprotokoll hinzufügen" name="show_timestamps_check_im"/>
+ <check_box label="Datumsstempel zu Protokolldateinamen hinzufügen" name="logfile_name_datestamp"/>
<text name="log_path_desc">
Protokolle speichern in:
</text>
<button label="Durchsuchen" label_selected="Durchsuchen" name="log_path_button"/>
<button label="Ignorierte Einwohner/Objekte" name="block_list" width="180"/>
+ <text name="block_list_label">
+ (Personen und/oder Objekte, die Sie blockiert haben)
+ </text>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_setup.xml b/indra/newview/skins/default/xui/de/panel_preferences_setup.xml
index 140b1ce7a4..8c7ea688d7 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_setup.xml
@@ -1,12 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Hardware/Internet" name="Input panel">
- <text name="Mouselook:">
- Mouselook:
- </text>
- <text name=" Mouse Sensitivity">
- Mausempfindlichkeit:
- </text>
- <check_box label="Umkehren" name="invert_mouse"/>
<text name="Network:">
Netzwerk:
</text>
@@ -18,32 +11,26 @@
</text>
<check_box label="Eigener Port" name="connection_port_enabled"/>
<spinner label="Port-Nummer:" name="connection_port"/>
- <text name="cache_size_label_l">
- Cachegröße
- </text>
- <text name="text_box5">
- MB
- </text>
- <text name="Cache location">
- Cache-Ordner:
- </text>
- <button label="Durchsuchen" label_selected="Durchsuchen" name="set_cache"/>
- <button label="Zurücksetzen" label_selected="Zurücksetzen" name="reset_cache"/>
<text name="Web:">
Web:
</text>
<radio_group name="use_external_browser">
- <radio_item label="Meinen Browser verwenden (IE, Firefox, Safari)" name="external" tool_tip="Standard Webbrowser des Systems verwenden, um die Hilfe, Weblinks usw. anzuzeigen. Bei Vollbildmodus nicht empfohlen." value="1"/>
+ <radio_item label="Meinen Browser verwenden (IE, Firefox, Safari)" name="external" tool_tip="Standard Webbrowser des Systems verwenden, um die Hilfe, Weblinks usw. anzuzeigen. Bei Vollbildmodus nicht empfohlen." value="true"/>
<radio_item label="Integrierten Browser verwenden" name="internal" tool_tip="Integrierten Webbrowser verwenden, um die Hilfe, Weblinks usw. anzuzeigen. Dieser Browser öffnet als neues Fenster innerhalb von [APP_NAME]." value=""/>
</radio_group>
<check_box initial_value="true" label="Plugins aktivieren" name="browser_plugins_enabled"/>
<check_box initial_value="true" label="Cookies annehmen" name="cookies_enabled"/>
<check_box initial_value="true" label="Javascript aktivieren" name="browser_javascript_enabled"/>
<check_box initial_value="false" label="Medienbrowser-Popups aktivieren" name="media_popup_enabled"/>
- <check_box initial_value="false" label="Web-Proxy aktivieren" name="web_proxy_enabled"/>
- <text name="Proxy location">
- Proxy-Standort:
+ <text name="Software updates:">
+ Softwareupdates:
+ </text>
+ <combo_box name="updater_service_combobox">
+ <combo_box.item label="Automatisch installieren" name="Install_automatically"/>
+ <combo_box.item label="Updates manuell herunterladen und installieren" name="Install_manual"/>
+ </combo_box>
+ <text name="Proxy Settings:">
+ Proxy-Einstellungen:
</text>
- <line_editor name="web_proxy_editor" tool_tip="Name oder IP Adresse des Proxyservers, den Sie benutzen möchten"/>
- <spinner label="Portnummer:" name="web_proxy_port"/>
+ <button label="Proxy-Einstellungen ändern" label_selected="Durchsuchen" name="set_proxy"/>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_sound.xml b/indra/newview/skins/default/xui/de/panel_preferences_sound.xml
index 5c71b20fb0..1e6a03c99f 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_sound.xml
@@ -1,18 +1,25 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Sounds" name="Preference Media panel">
+ <panel.string name="middle_mouse">
+ Mittlere Maustaste
+ </panel.string>
<slider label="Master-Lautstärke" name="System Volume"/>
- <check_box initial_value="true" label="Stummschalten, wenn minimiert" name="mute_when_minimized"/>
+ <check_box initial_value="true" name="mute_when_minimized"/>
+ <text name="mute_chb_label">
+ Stummschalten, wenn minimiert
+ </text>
<slider label="Schaltflächen" name="UI Volume"/>
<slider label="Umgebung" name="Wind Volume"/>
<slider label="Soundeffekte" name="SFX Volume"/>
<slider label="Musik wird gestreamt" name="Music Volume"/>
- <check_box label="Aktiviert" name="music_enabled"/>
+ <check_box label="Aktiviert" name="enable_music"/>
<slider label="Medien" name="Media Volume"/>
<check_box label="Aktiviert" name="enable_media"/>
<slider label="Voice-Chat" name="Voice Volume"/>
<check_box label="Aktiviert" name="enable_voice_check"/>
<check_box label="Automatische Wiedergabe zulassen" name="media_auto_play_btn" tool_tip="Hier aktivieren, um Medien automatisch wiederzugeben." value="true"/>
<check_box label="Medien, die an andere Avatare angehängt sind, wiedergeben." name="media_show_on_others_btn" tool_tip="Diese Option deaktivieren, um Medien für andere Avataren, die sich in der Nähe befinden, auszublenden." value="true"/>
+ <check_box label="Sounds von Gesten abspielen" name="gesture_audio_play_btn" tool_tip="Markieren, um Sounds von Gesten zu hören" value="true"/>
<text name="voice_chat_settings">
Voice-Chat-Einstellungen
</text>
@@ -23,29 +30,11 @@
<radio_item label="Kameraposition" name="0"/>
<radio_item label="Avatarposition" name="1"/>
</radio_group>
+ <check_box label="Avatarlippen beim Sprechen bewegen" name="enable_lip_sync"/>
+ <check_box label="Sprachfunktion beim Drücken folgender Taste(n) ein-/ausschalten:" name="push_to_talk_toggle_check" tool_tip="Wenn der Umschaltmodus aktiviert ist, drücken Sie die Auslöse-Taste EINMAL, um Ihr Mikrofon ein- oder auszuschalten. Wenn der Umschaltmodus nicht aktiviert ist, ist das Mikrofon nur dann eingeschaltet, wenn Sie die Auslösetaste gedrückt halten."/>
+ <line_editor label="Auslöser für Zum-Sprechen-drücken:" name="modifier_combo"/>
+ <button label="Taste festlegen" name="set_voice_hotkey_button"/>
+ <button name="set_voice_middlemouse_button" tool_tip="Auf mittlere Maustaste zurücksetzen"/>
<button label="Eingabe-/Ausgabegeräte" name="device_settings_btn"/>
- <panel label="Geräte-Einstellungen" name="device_settings_panel">
- <panel.string name="default_text">
- Standard
- </panel.string>
- <panel.string name="default system device">
- Standardgerät
- </panel.string>
- <panel.string name="no device">
- Kein Gerät
- </panel.string>
- <text name="Input">
- Eingabe
- </text>
- <text name="My volume label">
- Meine Lautstärke:
- </text>
- <slider_bar initial_value="1.0" name="mic_volume_slider" tool_tip="Ändern Sie die Lautstärke mit dem Regler"/>
- <text name="wait_text">
- Bitte warten
- </text>
- <text name="Output">
- Ausgabe
- </text>
- </panel>
+ <panel label="Geräte-Einstellungen" name="device_settings_panel"/>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_profile.xml b/indra/newview/skins/default/xui/de/panel_profile.xml
deleted file mode 100644
index 40fa2f922a..0000000000
--- a/indra/newview/skins/default/xui/de/panel_profile.xml
+++ /dev/null
@@ -1,68 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Profil" name="panel_profile">
- <string name="CaptionTextAcctInfo">
- [ACCTTYPE]
-[PAYMENTINFO] [AGEVERIFICATION]
- </string>
- <string name="payment_update_link_url">
- http://www.secondlife.com/account/billing.php?lang=de-DE
- </string>
- <string name="partner_edit_link_url">
- http://www.secondlife.com/account/partners.php?lang=de
- </string>
- <string name="my_account_link_url" value="http://secondlife.com/my/account/index.php?lang=de-DE"/>
- <string name="no_partner_text" value="Keiner"/>
- <string name="no_group_text" value="Keiner"/>
- <string name="RegisterDateFormat">
- [REG_DATE] ([AGE])
- </string>
- <layout_stack name="layout">
- <layout_panel name="profile_stack">
- <scroll_container name="profile_scroll">
- <panel name="profile_scroll_panel">
- <panel name="second_life_image_panel">
- <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/>
- </panel>
- <panel name="first_life_image_panel">
- <text name="title_rw_descr_text" value="Echtes Leben:"/>
- </panel>
- <text name="title_member_text" value="Einwohner seit:"/>
- <text name="title_acc_status_text" value="Kontostatus:"/>
- <text_editor name="acc_status_text">
- Einwohner. Keine Zahlungsinfo archiviert.
- Linden.
- </text_editor>
- <text name="title_partner_text" value="Partner:"/>
- <panel name="partner_data_panel">
- <name_box initial_value="(wird in Datenbank gesucht)" name="partner_text"/>
- </panel>
- <text name="title_groups_text" value="Gruppen:"/>
- </panel>
- </scroll_container>
- </layout_panel>
- </layout_stack>
- <layout_stack name="layout_verb_buttons">
- <layout_panel name="profile_buttons_panel">
- <layout_stack name="bottom_bar_ls">
- <layout_panel name="add_friend_btn_lp">
- <button label="Freund hinzufügen" name="add_friend" tool_tip="Dem Einwohner die Freundschaft anbieten"/>
- </layout_panel>
- <layout_panel name="im_btn_lp">
- <button label="IM" name="im" tool_tip="Instant Messenger öffnen"/>
- </layout_panel>
- <layout_panel name="call_btn_lp">
- <button label="Anrufen" name="call" tool_tip="Diesen Einwohner anrufen"/>
- </layout_panel>
- <layout_panel name="chat_btn_lp">
- <button label="Teleportieren" name="teleport" tool_tip="Teleport anbieten"/>
- </layout_panel>
- <layout_panel name="overflow_btn_lp">
- <button label="â–¼" name="overflow_btn" tool_tip="Dem Einwohner Geld geben oder Inventar an den Einwohner schicken"/>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- <layout_panel name="profile_me_buttons_panel">
- <button label="Profil bearbeiten" name="edit_profile_btn" tool_tip="Ihre persönlichen Informationen bearbeiten"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_profile_view.xml b/indra/newview/skins/default/xui/de/panel_profile_view.xml
deleted file mode 100644
index b44c128000..0000000000
--- a/indra/newview/skins/default/xui/de/panel_profile_view.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_target_profile">
- <string name="status_online">
- Online
- </string>
- <string name="status_offline">
- Offline
- </string>
- <text name="display_name_label" value="Anzeigename:"/>
- <text name="solo_username_label" value="Benutzername:"/>
- <text name="status" value="Online"/>
- <text name="user_name_small" value="Dieser Name ist ein ganz außerordentlich langer Name"/>
- <text name="user_name" value="Jack Linden"/>
- <button name="copy_to_clipboard" tool_tip="In Zwischenablage kopieren"/>
- <text name="user_label" value="Benutzername:"/>
- <text name="user_slid" value="jack.linden"/>
- <tab_container name="tabs" tab_min_width="60">
- <panel label="PROFIL" name="panel_profile"/>
- <panel label="AUSWAHL" name="panel_picks"/>
- <panel label="NOTIZEN &amp; PRIVATSPHÄRE" name="panel_notes"/>
- </tab_container>
-</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_region_environment.xml b/indra/newview/skins/default/xui/de/panel_region_environment.xml
new file mode 100644
index 0000000000..daadd30f62
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_region_environment.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Umgebung" name="panel_env_info">
+ <text name="water_settings_title">
+ Wählen Sie die Wasser- und Himmel-/Tageszykluseinstellungen aus, die alle Besucher Ihrer Region sehen sollen. Mehr Infos
+ </text>
+ <radio_group name="region_settings_radio_group">
+ <radio_item label="Second Life-Standard verwenden" name="use_sl_default_settings"/>
+ <radio_item label="Folgende Einstellungen verwenden" name="use_my_settings"/>
+ </radio_group>
+ <panel name="user_environment_settings">
+ <text name="water_settings_title">
+ Wassereinstellung
+ </text>
+ <combo_box name="water_settings_preset_combo">
+ <combo_box.item label="-Voreinstellung auswählen-" name="item0"/>
+ </combo_box>
+ <text name="sky_dayc_settings_title">
+ Himmel / Tageszyklus
+ </text>
+ <radio_group name="sky_dayc_settings_radio_group">
+ <radio_item label="Fester Himmel" name="my_sky_settings"/>
+ <radio_item label="Tageszyklus" name="my_dayc_settings"/>
+ </radio_group>
+ <combo_box name="sky_settings_preset_combo">
+ <combo_box.item label="-Voreinstellung auswählen-" name="item0"/>
+ </combo_box>
+ <combo_box name="dayc_settings_preset_combo">
+ <combo_box.item label="-Voreinstellung auswählen-" name="item0"/>
+ </combo_box>
+ </panel>
+ <button label="Anwenden" name="apply_btn"/>
+ <button label="Abbrechen" name="cancel_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_region_estate.xml b/indra/newview/skins/default/xui/de/panel_region_estate.xml
index b93bd3e442..aecf6f62fc 100644
--- a/indra/newview/skins/default/xui/de/panel_region_estate.xml
+++ b/indra/newview/skins/default/xui/de/panel_region_estate.xml
@@ -16,10 +16,10 @@
(unbekannt)
</text>
<text name="Only Allow">
- Zugang nur dann, wenn überprüft mit:
+ Zugang nur Einwohnern gestatten, die:
</text>
- <check_box label="Zahlungsinformation gespeichert" name="limit_payment" tool_tip="Einwohner ohne Zahlungsinformation nicht zulassen."/>
- <check_box label="Altersüberprüfung" name="limit_age_verified" tool_tip="Einwohner ohne Altersüberprüfung verbannen. Weitere Informationen finden Sie auf [SUPPORT_SITE]."/>
+ <check_box label="Zahlungsinformationen hinterlegt haben" name="limit_payment" tool_tip="Um diesen Grundbesitz besuchen zu können, müssen Einwohner Zahlungsinformationen hinterlegt haben. Weitere Informationen finden Sie auf [SUPPORT_SITE]."/>
+ <check_box label="ihr Alter bestätigt haben" name="limit_age_verified" tool_tip="Um diesen Grundbesitz besuchen zu können, müssen Einwohner ihr Alter bestätigt haben. Weitere Informationen finden Sie auf [SUPPORT_SITE]."/>
<check_box label="Voice-Chat erlauben" name="voice_chat_check"/>
<button label="?" name="voice_chat_help"/>
<text name="abuse_email_text" width="222">
diff --git a/indra/newview/skins/default/xui/de/panel_region_general.xml b/indra/newview/skins/default/xui/de/panel_region_general.xml
index be8507ebbd..f383be992b 100644
--- a/indra/newview/skins/default/xui/de/panel_region_general.xml
+++ b/indra/newview/skins/default/xui/de/panel_region_general.xml
@@ -25,6 +25,7 @@
<check_box label="Landwiederverkauf zulassen" name="allow_land_resell_check"/>
<check_box label="Landumverteilung zulassen" name="allow_parcel_changes_check"/>
<check_box label="Landanzeige in Suche blockieren" name="block_parcel_search_check" tool_tip="Diese Region und ihre Parzellen in Suchergebnissen anzeigen"/>
+ <check_box label="Netzobjekte zulassen" name="mesh_rez_enabled_check" tool_tip="Anderen das Rezzen von Netzobjekten in dieser Region gestatten"/>
<spinner label="Avatar-Limit" name="agent_limit_spin"/>
<spinner label="Objektbonus" name="object_bonus_spin"/>
<text label="Inhaltseinstufung" name="access_text">
diff --git a/indra/newview/skins/default/xui/de/panel_region_terrain.xml b/indra/newview/skins/default/xui/de/panel_region_terrain.xml
index 01721791a7..7801be30e4 100644
--- a/indra/newview/skins/default/xui/de/panel_region_terrain.xml
+++ b/indra/newview/skins/default/xui/de/panel_region_terrain.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Terrain" name="Terrain">
<text name="region_text_lbl">
Region:
@@ -6,25 +6,55 @@
<text name="region_text">
unbekannt
</text>
- <spinner label="Wasserhöhe" name="water_height_spin" />
- <button label="?" name="water_height_help" />
- <spinner label="Obere Terraingrenze" name="terrain_raise_spin" />
- <button label="?" name="terrain_raise_help" />
- <spinner label="Untere Terraingrenze" name="terrain_lower_spin" />
- <button label="?" name="terrain_lower_help" />
- <check_box label="Grundbesitzsonne verwenden" name="use_estate_sun_check" />
- <button label="?" name="use_estate_sun_help" />
- <check_box label="Sonne fest" name="fixed_sun_check" />
- <button label="?" name="fixed_sun_help" />
- <slider label="Phase" name="sun_hour_slider" />
- <button label="Ãœbernehmen" name="apply_btn" />
- <button label="RAW-Terrain herunterladen..." name="download_raw_btn"
- tool_tip="Nur für Grundbesitzeigentümer verfügbar, nicht für Verwalter" />
- <button label="?" name="download_raw_help" />
- <button label="RAW-Terrain hochladen..." name="upload_raw_btn"
- tool_tip="Nur für Grundbesitzeigentümer verfügbar, nicht für Verwalter" />
- <button label="?" name="upload_raw_help" />
- <button label="Terrain formen" name="bake_terrain_btn"
- tool_tip="Das aktuelle Terrain zum Mittelpunkt für die oberen/unteren Terraingrenzen machen" />
- <button label="?" name="bake_terrain_help" />
+ <spinner label="Wasserhöhe" name="water_height_spin"/>
+ <spinner label="Obere Terraingrenze" name="terrain_raise_spin"/>
+ <spinner label="Untere Terraingrenze" name="terrain_lower_spin"/>
+ <text name="detail_texture_text">
+ Terraintexturen (erfordert 24-Bit-.tga-Dateien mit einer Größe von 512x512)
+ </text>
+ <text name="height_text_lbl">
+ 1 (niedrig)
+ </text>
+ <text name="height_text_lbl2">
+ 2
+ </text>
+ <text name="height_text_lbl3">
+ 3
+ </text>
+ <text name="height_text_lbl4">
+ 4 (Hoch)
+ </text>
+ <text name="height_text_lbl5">
+ Texturhöhenbereich
+ </text>
+ <text name="height_text_lbl10">
+ Diese Werte geben den Mischungsgrad für die obigen Texturen an.
+ </text>
+ <text name="height_text_lbl11">
+ In Metern gemessen. Der Wert „Niedrig“ ist die maximale Höhe von Textur 1, der Wert „Hoch“ die Mindesthöhe von Textur 4.
+ </text>
+ <text name="height_text_lbl6">
+ Nordwest
+ </text>
+ <text name="height_text_lbl7">
+ Nordost
+ </text>
+ <spinner label="Niedrig" name="height_start_spin_1"/>
+ <spinner label="Niedrig" name="height_start_spin_3"/>
+ <spinner label="Hoch" name="height_range_spin_1"/>
+ <spinner label="Hoch" name="height_range_spin_3"/>
+ <text name="height_text_lbl8">
+ Südwest
+ </text>
+ <text name="height_text_lbl9">
+ Südost
+ </text>
+ <spinner label="Niedrig" name="height_start_spin_0"/>
+ <spinner label="Niedrig" name="height_start_spin_2"/>
+ <spinner label="Hoch" name="height_range_spin_0"/>
+ <spinner label="Hoch" name="height_range_spin_2"/>
+ <button label="RAW-Terrain herunterladen..." name="download_raw_btn" tool_tip="Nur für Grundbesitzeigentümer verfügbar, nicht für Verwalter"/>
+ <button label="RAW-Terrain hochladen..." name="upload_raw_btn" tool_tip="Nur für Grundbesitzeigentümer verfügbar, nicht für Verwalter"/>
+ <button label="Terrain formen" name="bake_terrain_btn" tool_tip="Das aktuelle Terrain zum Mittelpunkt für die oberen/unteren Terraingrenzen machen"/>
+ <button label="Ãœbernehmen" name="apply_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_script_ed.xml b/indra/newview/skins/default/xui/de/panel_script_ed.xml
index 17970cf261..7e03aeff15 100644
--- a/indra/newview/skins/default/xui/de/panel_script_ed.xml
+++ b/indra/newview/skins/default/xui/de/panel_script_ed.xml
@@ -15,15 +15,15 @@
<panel.string name="Title">
Skript: [NAME]
</panel.string>
- <text_editor name="Script Editor">
- Wird geladen...
- </text_editor>
- <button label="Speichern" label_selected="Speichern" name="Save_btn"/>
- <combo_box label="Einfügen..." name="Insert..."/>
+ <panel.string name="external_editor_not_set">
+ Wählen Sie über die Umgebungsvariable „LL_SCRIPT_EDITOR“ oder die Einstellung „ExternalEditor“ einen Editor aus.
+ </panel.string>
<menu_bar name="script_menu">
<menu label="Datei" name="File">
<menu_item_call label="Speichern" name="Save"/>
<menu_item_call label="Alle Änderungen zurücksetzen" name="Revert All Changes"/>
+ <menu_item_call label="Aus Datei laden..." name="LoadFromFile"/>
+ <menu_item_call label="In Datei speichern..." name="SaveToFile"/>
</menu>
<menu label="Bearbeiten" name="Edit">
<menu_item_call label="Rückgängig" name="Undo"/>
@@ -40,4 +40,10 @@
<menu_item_call label="Schlüsselwort-Hilfe" name="Keyword Help..."/>
</menu>
</menu_bar>
+ <text_editor name="Script Editor">
+ Wird geladen...
+ </text_editor>
+ <combo_box label="Einfügen..." name="Insert..."/>
+ <button label="Speichern" label_selected="Speichern" name="Save_btn"/>
+ <button label="Bearbeiten..." name="Edit_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_scrolling_param_base.xml b/indra/newview/skins/default/xui/de/panel_scrolling_param_base.xml
new file mode 100644
index 0000000000..fa659040ea
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_scrolling_param_base.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="LLScrollingPanelParamBase">
+ <slider label="[DESC]" name="param slider"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/de/panel_snapshot_inventory.xml
new file mode 100644
index 0000000000..10827ce6f2
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_snapshot_inventory.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_inventory">
+ <text name="title">
+ In meinem Inventar speichern
+ </text>
+ <text name="hint_lbl">
+ Das Speichern eines Bilds in Ihrem Inventar kostet [UPLOAD_COST] L$. Um das Bild als Textur zu speichern, wählen Sie eines der quadratischen Formate aus.
+ </text>
+ <combo_box label="Auflösung" name="texture_size_combo">
+ <combo_box.item label="Aktuelles Fenster" name="CurrentWindow"/>
+ <combo_box.item label="Klein (128x128)" name="Small(128x128)"/>
+ <combo_box.item label="Mittel (256x256)" name="Medium(256x256)"/>
+ <combo_box.item label="Groß (512x512)" name="Large(512x512)"/>
+ <combo_box.item label="Benutzerdefiniert" name="Custom"/>
+ </combo_box>
+ <spinner label="Breite" name="inventory_snapshot_width"/>
+ <spinner label="Höhe" name="inventory_snapshot_height"/>
+ <check_box label="Seitenverhältnis beibehalten" name="inventory_keep_aspect_check"/>
+ <button label="Abbrechen" name="cancel_btn"/>
+ <button label="Speichern" name="save_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_snapshot_local.xml b/indra/newview/skins/default/xui/de/panel_snapshot_local.xml
new file mode 100644
index 0000000000..3aeae80388
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_snapshot_local.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_local">
+ <text name="title">
+ Auf meinem Computer speichern
+ </text>
+ <combo_box label="Auflösung" name="local_size_combo">
+ <combo_box.item label="Aktuelles Fenster" name="CurrentWindow"/>
+ <combo_box.item label="320x240" name="320x240"/>
+ <combo_box.item label="640x480" name="640x480"/>
+ <combo_box.item label="800x600" name="800x600"/>
+ <combo_box.item label="1024x768" name="1024x768"/>
+ <combo_box.item label="1280x1024" name="1280x1024"/>
+ <combo_box.item label="1600x1200" name="1600x1200"/>
+ <combo_box.item label="Benutzerdefiniert" name="Custom"/>
+ </combo_box>
+ <layout_stack name="local_image_params_ls">
+ <layout_panel name="local_image_size_lp">
+ <spinner label="Breite" name="local_snapshot_width"/>
+ <spinner label="Höhe" name="local_snapshot_height"/>
+ <check_box label="Seitenverhältnis beibehalten" name="local_keep_aspect_check"/>
+ </layout_panel>
+ <layout_panel name="local_image_format_quality_lp">
+ <combo_box label="Format" name="local_format_combo">
+ <combo_box.item label="PNG (verlustfrei)" name="PNG"/>
+ <combo_box.item label="JPEG" name="JPEG"/>
+ <combo_box.item label="BMP (verlustfrei)" name="BMP"/>
+ </combo_box>
+ <slider label="Bildqualität" name="image_quality_slider"/>
+ <text name="image_quality_level">
+ ([QLVL])
+ </text>
+ </layout_panel>
+ </layout_stack>
+ <button label="Abbrechen" name="cancel_btn"/>
+ <flyout_button label="Speichern" name="save_btn" tool_tip="Bild als Datei speichern">
+ <flyout_button.item label="Speichern" name="save_item"/>
+ <flyout_button.item label="Speichern unter..." name="saveas_item"/>
+ </flyout_button>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_snapshot_options.xml b/indra/newview/skins/default/xui/de/panel_snapshot_options.xml
new file mode 100644
index 0000000000..e1d8a5dc6d
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_snapshot_options.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_options">
+ <button label="In meinem Profil posten" name="save_to_profile_btn"/>
+ <button label="E-Mail" name="save_to_email_btn"/>
+ <button label="In meinem Inventar speichern ([AMOUNT] L$)" name="save_to_inventory_btn"/>
+ <button label="Auf meinem Computer speichern" name="save_to_computer_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_snapshot_postcard.xml b/indra/newview/skins/default/xui/de/panel_snapshot_postcard.xml
new file mode 100644
index 0000000000..c9afe86d7f
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_snapshot_postcard.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_postcard">
+ <string name="default_subject">
+ Postkarte aus [SECOND_LIFE].
+ </string>
+ <string name="default_message">
+ Sehen Sie mal!
+ </string>
+ <string name="upload_message">
+ Senden...
+ </string>
+ <text name="title">
+ E-Mail
+ </text>
+ <button label="Nachricht" name="message_btn"/>
+ <button label="Einstellungen" name="settings_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_snapshot_profile.xml b/indra/newview/skins/default/xui/de/panel_snapshot_profile.xml
new file mode 100644
index 0000000000..8d1c52dea8
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_snapshot_profile.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_profile">
+ <text name="title">
+ In meinem Profil posten
+ </text>
+ <combo_box label="Auflösung" name="profile_size_combo">
+ <combo_box.item label="Aktuelles Fenster" name="CurrentWindow"/>
+ <combo_box.item label="640x480" name="640x480"/>
+ <combo_box.item label="800x600" name="800x600"/>
+ <combo_box.item label="1024x768" name="1024x768"/>
+ <combo_box.item label="Benutzerdefiniert" name="Custom"/>
+ </combo_box>
+ <layout_stack name="profile_image_params_ls">
+ <layout_panel name="profile_image_size_lp">
+ <spinner label="Breite" name="profile_snapshot_width"/>
+ <spinner label="Höhe" name="profile_snapshot_height"/>
+ <check_box label="Seitenverhältnis beibehalten" name="profile_keep_aspect_check"/>
+ </layout_panel>
+ <layout_panel name="profile_image_metadata_lp">
+ <text name="caption_label">
+ Bildunterschrift:
+ </text>
+ <check_box initial_value="true" label="Ort einschließen" name="add_location_cb"/>
+ </layout_panel>
+ </layout_stack>
+ <button label="Abbrechen" name="cancel_btn"/>
+ <button label="Posten" name="post_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_sound_devices.xml b/indra/newview/skins/default/xui/de/panel_sound_devices.xml
new file mode 100644
index 0000000000..b739b6197f
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_sound_devices.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<panel label="Geräteeinstellungen" name="device_settings_panel">
+ <panel.string name="default_text">
+ Standard
+ </panel.string>
+ <string name="name_no_device">
+ Kein Gerät
+ </string>
+ <string name="name_default_system_device">
+ Standardsystemgerät
+ </string>
+ <text name="Input">
+ Eingabe
+ </text>
+ <text name="Output">
+ Ausgabe
+ </text>
+ <text name="My volume label">
+ Meine Lautstärke:
+ </text>
+ <slider_bar initial_value="1,0" name="mic_volume_slider" tool_tip="Lautstärke mit diesem Regler ändern"/>
+ <text name="wait_text">
+ Bitte warten
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_status_bar.xml b/indra/newview/skins/default/xui/de/panel_status_bar.xml
index 005290c1ff..14ace0ac3a 100644
--- a/indra/newview/skins/default/xui/de/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/de/panel_status_bar.xml
@@ -1,11 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="status">
- <panel.string name="StatBarDaysOfWeek">
- Sonntag:Montag:Dienstag:Mittwoch:Donnerstag:Freitag:Samstag
- </panel.string>
- <panel.string name="StatBarMonthsOfYear">
- Januar:Februar:März:April:Mai:Juni:Juli:August:September:Oktober:November:Dezember
- </panel.string>
<panel.string name="packet_loss_tooltip">
Paketverlust
</panel.string>
@@ -21,9 +15,10 @@
<panel.string name="buycurrencylabel">
[AMT] L$
</panel.string>
- <panel name="balance_bg">
- <text name="balance" tool_tip="Mein Kontostand" value="20 L$"/>
+ <panel left="-415" name="balance_bg" width="205">
+ <text name="balance" tool_tip="Klicken, um L$-Guthaben zu aktualisieren" value="20 L$"/>
<button label="L$ kaufen" name="buyL" tool_tip="Hier klicken, um mehr L$ zu kaufen"/>
+ <button label="Einkaufen" name="goShop" tool_tip="Second Life-Marktplatz öffnen" width="85"/>
</panel>
<text name="TimeText" tool_tip="Aktuelle Zeit (Pazifik)">
24:00 H PST
diff --git a/indra/newview/skins/default/xui/de/sidepanel_inventory.xml b/indra/newview/skins/default/xui/de/sidepanel_inventory.xml
index d817d1df90..18aad64f96 100644
--- a/indra/newview/skins/default/xui/de/sidepanel_inventory.xml
+++ b/indra/newview/skins/default/xui/de/sidepanel_inventory.xml
@@ -1,6 +1,27 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Sonstiges" name="objects panel">
<panel label="" name="sidepanel__inventory_panel">
+ <layout_stack name="inventory_layout_stack">
+ <layout_panel name="inbox_layout_panel">
+ <panel label="" name="marketplace_inbox">
+ <string name="InboxLabelWithArg">
+ Erhaltene Artikel ([NUM])
+ </string>
+ <string name="InboxLabelNoArg">
+ Erhaltene Artikel
+ </string>
+ <button label="Erhaltene Artikel" name="inbox_btn"/>
+ <text name="inbox_fresh_new_count">
+ [NUM] neu
+ </text>
+ <panel name="inbox_inventory_placeholder_panel" tool_tip="Artikel zur Verwendung in Ihr Inventar ziehen">
+ <text name="inbox_inventory_placeholder">
+ Einkäufe aus dem Marktplatz werden hierher geliefert.
+ </text>
+ </panel>
+ </panel>
+ </layout_panel>
+ </layout_stack>
<panel name="button_panel">
<layout_stack name="button_panel_ls">
<layout_panel name="info_btn_lp">
diff --git a/indra/newview/skins/default/xui/de/sidepanel_task_info.xml b/indra/newview/skins/default/xui/de/sidepanel_task_info.xml
index 6474576c0f..7b46ee7c9b 100644
--- a/indra/newview/skins/default/xui/de/sidepanel_task_info.xml
+++ b/indra/newview/skins/default/xui/de/sidepanel_task_info.xml
@@ -48,15 +48,9 @@
<text name="CreatorNameLabel">
Ersteller:
</text>
- <text name="Creator Name">
- Erica Linden
- </text>
<text name="Owner:">
Eigentümer:
</text>
- <text name="Owner Name">
- Erica Linden
- </text>
<text name="Group_label">
Gruppe:
</text>
diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml
index f890506a5d..d917d33d12 100644
--- a/indra/newview/skins/default/xui/de/strings.xml
+++ b/indra/newview/skins/default/xui/de/strings.xml
@@ -34,6 +34,9 @@
<string name="StartupInitializingVFS">
VFS wird initialisiert...
</string>
+ <string name="StartupRequireDriverUpdate">
+ Grafikinitialisierung fehlgeschlagen. Bitte aktualisieren Sie Ihren Grafiktreiber.
+ </string>
<string name="ProgressRestoring">
Wird wiederhergestellt...
</string>
@@ -91,6 +94,12 @@
<string name="LoginQuicktimeOK">
QuickTime wurde initialisiert.
</string>
+ <string name="LoginRequestSeedCapGrant">
+ Regionsfähigkeiten anfordern...
+ </string>
+ <string name="LoginRetrySeedCapGrant">
+ Regionsfähigkeiten anfordern. Versuch [NUMBER]...
+ </string>
<string name="LoginWaitingForRegionHandshake">
Region-Handshake...
</string>
@@ -119,7 +128,7 @@
Die Zertifikatsunterschrift des Gridservers konnte nicht bestätigt werden. Bitte kontaktieren Sie Ihren Grid-Administrator.
</string>
<string name="LoginFailedNoNetwork">
- Netzwerk Fehler: Eine Verbindung konnte nicht hergestellt werden. Bitte überprüfen Sie Ihre Netzwerkverbindung.
+ Netzwerkfehler: Verbindung konnte nicht hergestellt werden. Bitte überprüfen Sie Ihre Netzwerkverbindung.
</string>
<string name="LoginFailed">
Anmeldung fehlgeschlagen
@@ -130,6 +139,139 @@
<string name="create_account_url">
http://join.secondlife.com/index.php?lang=de-DE
</string>
+ <string name="LoginFailedViewerNotPermitted">
+ Mit dem von Ihnen verwendeten Viewer ist der Zugriff auf Second Life nicht mehr möglich. Laden Sie von den folgenden Seite einen neuen Viewer herunter:
+http://secondlife.com/download
+
+Weitere Informationen finden Sie auf der folgenden FAQ-Seite:
+http://secondlife.com/viewer-access-faq
+ </string>
+ <string name="LoginIntermediateOptionalUpdateAvailable">
+ Optionales Viewer-Update verfügbar: [VERSION]
+ </string>
+ <string name="LoginFailedRequiredUpdate">
+ Erforderliches Viewer-Update: [VERSION]
+ </string>
+ <string name="LoginFailedAlreadyLoggedIn">
+ Dieser Agent ist bereits angemeldet.
+ </string>
+ <string name="LoginFailedAuthenticationFailed">
+ Wir bitten um Entschuldigung! Wir konnten Sie nicht anmelden.
+Stellen Sie sicher, dass Sie die richtigen Informationen eingegeben haben:
+ * Benutzername (wie robertschmidt12 oder warme.sonne)
+ * Kennwort
+Stellen Sie außerdem sicher, dass die Umschaltsperre deaktiviert ist.
+ </string>
+ <string name="LoginFailedPasswordChanged">
+ Ihr Kennwort wurde aus Sicherheitsgründen geändert.
+Gehen Sie zur Seite „Mein Account“ unter http://secondlife.com/password
+und beantworten Sie die Sicherheitsfrage, um Ihr Kennwort zurückzusetzen.
+Wir entschuldigen uns für eventuell enstandene Unannehmlichkeiten.
+ </string>
+ <string name="LoginFailedPasswordReset">
+ Aufgrund von Systemänderungen müssen Sie Ihr Kennwort zurücksetzen.
+Gehen Sie zur Seite „Mein Account“ unter http://secondlife.com/password
+und beantworten Sie die Sicherheitsfrage, um Ihr Kennwort zurückzusetzen.
+Wir entschuldigen uns für eventuell enstandene Unannehmlichkeiten.
+ </string>
+ <string name="LoginFailedEmployeesOnly">
+ Second Life ist vorübergehend wegen Wartung geschlossen.
+Nur Mitarbeiter können sich anmelden.
+Aktuelle Informationen finden Sie unter www.secondlife.com/status.
+ </string>
+ <string name="LoginFailedPremiumOnly">
+ Die Anmeldung bei Second Life ist vorübergehend eingeschränkt, um sicherzustellen, dass Einwohner, die sich bereits inworld aufhalten, das bestmögliche Erlebnis haben.
+
+Benutzer mit kostenlosen Konten können sich während dieses Zeitraums nicht bei Second Life anmelden, damit die Kapazität Benutzern zur Verfügung steht, die ein gebührenpflichtiges Premium-Konto besitzen.
+ </string>
+ <string name="LoginFailedComputerProhibited">
+ Der Zugriff auf Second Life ist von diesem Computer aus nicht möglich.
+Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an
+support@secondlife.com.
+ </string>
+ <string name="LoginFailedAcountSuspended">
+ Ihr Konto ist erst ab
+[TIME] Pacific Time wieder verfügbar.
+ </string>
+ <string name="LoginFailedAccountDisabled">
+ Ihre Anfrage kann derzeit nicht bearbeitet werden.
+Wenden Sie sich unter http://secondlife.com/support an den Second Life-Support.
+Wenn Sie Ihr Kennwort nicht ändern können, rufen Sie die US-Nummer (866) 476-9763 an.
+ </string>
+ <string name="LoginFailedTransformError">
+ Nicht übereinstimmende Daten bei der Anmeldung festgestellt.
+Wenden Sie sich an support@secondlife.com.
+ </string>
+ <string name="LoginFailedAccountMaintenance">
+ An Ihrem Konto werden gerade kleinere Wartungsarbeiten durchgeführt.
+Ihr Konto ist erst ab
+[TIME] Pacific Time wieder verfügbar.
+Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an support@secondlife.com.
+ </string>
+ <string name="LoginFailedPendingLogoutFault">
+ Abmeldeanforderung führte zu einem Simulatorfehler.
+ </string>
+ <string name="LoginFailedPendingLogout">
+ Das System meldet Sie gerade ab.
+Ihr Konto ist erst ab
+[TIME] Pacific Time wieder verfügbar.
+ </string>
+ <string name="LoginFailedUnableToCreateSession">
+ Es kann keine gültige Sitzung erstellt werden.
+ </string>
+ <string name="LoginFailedUnableToConnectToSimulator">
+ Es kann keine Simulatorverbindung hergestellt werden.
+ </string>
+ <string name="LoginFailedRestrictedHours">
+ Mit Ihrem Konto ist der Zugriff auf Second Life
+nur zwischen [START] und [END] Pacific Time möglich.
+Schauen Sie während dieses Zeitraums vorbei.
+Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an support@secondlife.com.
+ </string>
+ <string name="LoginFailedIncorrectParameters">
+ Falsche Parameter.
+Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an support@secondlife.com.
+ </string>
+ <string name="LoginFailedFirstNameNotAlphanumeric">
+ Vorname muss alphanumerisch sein.
+Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an support@secondlife.com.
+ </string>
+ <string name="LoginFailedLastNameNotAlphanumeric">
+ Nachname muss alphanumerisch sein.
+Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an support@secondlife.com.
+ </string>
+ <string name="LogoutFailedRegionGoingOffline">
+ Die Region wird gerade offline geschaltet.
+Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
+ </string>
+ <string name="LogoutFailedAgentNotInRegion">
+ Agent nicht in Region.
+Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
+ </string>
+ <string name="LogoutFailedPendingLogin">
+ Die Region war gerade dabei, eine andere Sitzung anzumelden.
+Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
+ </string>
+ <string name="LogoutFailedLoggingOut">
+ Die Region war gerade dabei, die vorherige Sitzung abzumelden.
+Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
+ </string>
+ <string name="LogoutFailedStillLoggingOut">
+ Die Region ist noch immer dabei, die vorherige Sitzung abzumelden.
+Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
+ </string>
+ <string name="LogoutSucceeded">
+ Die Region hat soeben die letzte Sitzung abgemeldet.
+Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
+ </string>
+ <string name="LogoutFailedLogoutBegun">
+ Die Region hat den Abmeldevorgang gestartet.
+Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
+ </string>
+ <string name="LoginFailedLoggingOutSession">
+ Das System hat begonnen, Ihre letzte Sitzung abzumelden.
+Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
+ </string>
<string name="AgentLostConnection">
In dieser Region kann es zu Problemen kommen. Bitte überprüfen Sie Ihre Internetverbindung.
</string>
@@ -197,6 +339,36 @@
Sie können nur ein einzelnes Objekt hierher ziehen
</string>
<string name="TooltipPrice" value="[AMOUNT] L$"/>
+ <string name="TooltipOutboxDragToWorld">
+ Sie können Artikel nicht in Ihrer Händler-Outbox rezzen
+ </string>
+ <string name="TooltipOutboxNoTransfer">
+ Einer oder mehrere dieser Artikel können nicht verkauft oder übertragen werden.
+ </string>
+ <string name="TooltipOutboxNotInInventory">
+ Nur Artikel direkt aus Ihrem Inventar können in Ihre Händler-Outbox gelegt werden
+ </string>
+ <string name="TooltipOutboxWorn">
+ Artikel, die Sie tragen, können nicht in Ihre Händler-Outbox gelegt werden.
+ </string>
+ <string name="TooltipOutboxCallingCard">
+ Sie können keine Visitenkarten in Ihre Händler-Outbox legen
+ </string>
+ <string name="TooltipOutboxFolderLevels">
+ Tiefe der verschachtelten Ordner überschreitet 3
+ </string>
+ <string name="TooltipOutboxTooManyFolders">
+ Anzahl von Unterordnern im obersten Ordner überschreitet 20
+ </string>
+ <string name="TooltipOutboxTooManyObjects">
+ Anzahl von Artikeln im obersten Ordner überschreitet 200
+ </string>
+ <string name="TooltipDragOntoOwnChild">
+ Sie können einen Ordner nicht in einen seiner untergeordneten Ordner verschieben
+ </string>
+ <string name="TooltipDragOntoSelf">
+ Sie können einen Ordner nicht in sich selbst verschieben
+ </string>
<string name="TooltipHttpUrl">
Anklicken, um Webseite anzuzeigen
</string>
@@ -441,6 +613,9 @@
<string name="symbolic folder link">
Link zu Ordner
</string>
+ <string name="mesh">
+ mesh
+ </string>
<string name="AvatarEditingAppearance">
(Aussehen wird bearbeitet)
</string>
@@ -660,6 +835,9 @@
<string name="anim_yes_head">
Ja
</string>
+ <string name="multiple_textures">
+ Mehrfach
+ </string>
<string name="texture_loading">
Wird geladen...
</string>
@@ -819,6 +997,9 @@
<string name="choose_the_directory">
Verzeichnis auswählen
</string>
+ <string name="script_files">
+ Skripts
+ </string>
<string name="AvatarSetNotAway">
Nicht abwesend
</string>
@@ -876,6 +1057,9 @@
<string name="tattoo">
Tätowierung
</string>
+ <string name="physics">
+ Physik
+ </string>
<string name="invalid">
ungültig
</string>
@@ -915,6 +1099,9 @@
<string name="tattoo_not_worn">
Tätowierung nicht getragen
</string>
+ <string name="physics_not_worn">
+ Physik nicht getragen
+ </string>
<string name="invalid_not_worn">
ungültig
</string>
@@ -963,6 +1150,9 @@
<string name="create_new_tattoo">
Neue Tätowierung erstellen
</string>
+ <string name="create_new_physics">
+ Neue Physik erstellen
+ </string>
<string name="create_new_invalid">
ungültig
</string>
@@ -1047,6 +1237,65 @@
<string name="InventoryNoTexture">
Sie haben keine Kopie dieser Textur in Ihrem Inventar.
</string>
+ <string name="InventoryInboxNoItems">
+ Einkäufe aus dem Marktplatz erscheinen hier. Sie können diese dann zur Verwendung in Ihr Inventar ziehen.
+ </string>
+ <string name="MarketplaceURL">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/
+ </string>
+ <string name="MarketplaceURL_CreateStore">
+ http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.4
+ </string>
+ <string name="MarketplaceURL_Dashboard">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard
+ </string>
+ <string name="MarketplaceURL_Imports">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports
+ </string>
+ <string name="MarketplaceURL_LearnMore">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more
+ </string>
+ <string name="InventoryOutboxNotMerchantTitle">
+ Jeder kann Artikel im Marktplatz verkaufen.
+ </string>
+ <string name="InventoryOutboxNotMerchantTooltip"/>
+ <string name="InventoryOutboxNotMerchant">
+ Wenn Sie als Händler aktiv werden möchten, müssen Sie einen [[MARKETPLACE_CREATE_STORE_URL] Laden im Marktplatz erstellen].
+ </string>
+ <string name="InventoryOutboxNoItemsTitle">
+ Ihre Outbox ist leer.
+ </string>
+ <string name="InventoryOutboxNoItemsTooltip"/>
+ <string name="InventoryOutboxNoItems">
+ Ziehen Sie Ordner in dien Bereich und klicken Sie auf „In Marktplatz übertragen“, um sie im [[MARKETPLACE_DASHBOARD_URL] Marktplatz] zum Verkauf anzubieten.
+ </string>
+ <string name="Marketplace Error None">
+ Keine Fehler
+ </string>
+ <string name="Marketplace Error Not Merchant">
+ Fehler: Bevor Sie Artikel in den Marktplatz übertragen können, müssen Sie sich als Händler registrieren (kostenlos).
+ </string>
+ <string name="Marketplace Error Empty Folder">
+ Fehler: Dieser Ordner ist leer.
+ </string>
+ <string name="Marketplace Error Unassociated Products">
+ Fehler: Dieser Artikel konnte nicht hochgeladen werden, da in Ihrem Händlerkonto zu viele Artikel nicht mit Produkten verknüpft sind. Um diesen Fehler zu beheben, melden Sie sich auf der Marktplatz-Website an und reduzieren Sie die Anzahl von Artikeln, die nicht mit Produkten verknüpft sind.
+ </string>
+ <string name="Marketplace Error Object Limit">
+ Fehler: Dieser Artikel enthält zu viele Objekte. Beheben Sie diesen Fehler, indem Sie Objekte zusammen in Behältern verpacken, um die Objektanzahl auf unter 200 zu verringern.
+ </string>
+ <string name="Marketplace Error Folder Depth">
+ Fehler: Dieser Artikel enthält zu viele verschachtelte Ordnerebenen. Organisieren Sie ihn neu, sodass maximal drei verschachtelte Ordnerebenen vorhanden sind.
+ </string>
+ <string name="Marketplace Error Unsellable Item">
+ Fehler: Dieser Artikel kann nicht im Marktplatz verkauft werden.
+ </string>
+ <string name="Marketplace Error Internal Import">
+ Fehler: Bei diesem Artikel ist ein Problem aufgetreten. Versuchen Sie es später erneut.
+ </string>
+ <string name="Open landmarks">
+ Landmarken öffnen
+ </string>
<string name="no_transfer" value=" (kein Transferieren)"/>
<string name="no_modify" value=" (kein Bearbeiten)"/>
<string name="no_copy" value=" (kein Kopieren)"/>
@@ -1067,7 +1316,7 @@
<string name="PermNo">
Nein
</string>
- <string name="Chat" value=" Chat:"/>
+ <string name="Chat Message" value="Chat:"/>
<string name="Sound" value=" Sound:"/>
<string name="Wait" value=" --- Warten:"/>
<string name="AnimFlagStop" value=" Animation stoppen:"/>
@@ -1093,9 +1342,6 @@
<string name="InvFolder My Inventory">
Mein Inventar
</string>
- <string name="InvFolder My Favorites">
- Meine Favoriten
- </string>
<string name="InvFolder Library">
Bibliothek
</string>
@@ -1154,10 +1400,10 @@
Gesten
</string>
<string name="InvFolder Favorite">
- Favoriten
+ Meine Favoriten
</string>
<string name="InvFolder favorite">
- Favoriten
+ Meine Favoriten
</string>
<string name="InvFolder Current Outfit">
Aktuelles Outfit
@@ -1171,12 +1417,21 @@
<string name="InvFolder Accessories">
Zubehör
</string>
+ <string name="InvFolder Meshes">
+ Netze
+ </string>
<string name="InvFolder Friends">
Freunde
</string>
<string name="InvFolder All">
Alle
</string>
+ <string name="no_attachments">
+ Keine Anhänge getragen
+ </string>
+ <string name="Attachments remain">
+ Anhänge (noch [COUNT] Positionen frei)
+ </string>
<string name="Buy">
Kaufen
</string>
@@ -1303,6 +1558,12 @@
<string name="Right Pec">
Rechts
</string>
+ <string name="Neck">
+ Hals
+ </string>
+ <string name="Avatar Center">
+ Avatar-Mitte
+ </string>
<string name="Invalid Attachment">
Ungültige Stelle für Anhang
</string>
@@ -1486,6 +1747,9 @@
</string>
<string name="SummaryForTheWeek" value="Zusammenfassung für diese Woche, beginnend am "/>
<string name="NextStipendDay" value=". Der nächste Stipendium-Tag ist "/>
+ <string name="GroupPlanningDate">
+ [mthnum,datetime,utc]/[day,datetime,utc]/[year,datetime,utc]
+ </string>
<string name="GroupIndividualShare" value=" Gruppenanteil Einzelanteil"/>
<string name="GroupColumn" value="Gruppe"/>
<string name="Balance">
@@ -1512,6 +1776,9 @@
<string name="IMTeen">
Teen
</string>
+ <string name="Anyone">
+ jeder
+ </string>
<string name="RegionInfoError">
Fehler
</string>
@@ -1725,7 +1992,7 @@
<string name="RegionNoCovenantOtherOwner">
Für diesen Grundbesitz liegt kein Vertrag vor. Das Land auf diesem Grundbesitz wird vom Grundbesitzer und nicht von Linden Lab verkauft. Für Informationen zum Verkauf setzen Sie sich bitte mit dem Grundbesitzer in Verbindung.
</string>
- <string name="covenant_last_modified" value="Zuletzt geändert:"/>
+ <string name="covenant_last_modified" value="Zuletzt geändert: "/>
<string name="none_text" value=" (keiner) "/>
<string name="never_text" value=" (nie) "/>
<string name="GroupOwned">
@@ -1734,6 +2001,12 @@
<string name="Public">
Öffentlich
</string>
+ <string name="LocalSettings">
+ Lokale Einstellungen
+ </string>
+ <string name="RegionSettings">
+ Regionseinstellungen
+ </string>
<string name="ClassifiedClicksTxt">
Klicks: [TELEPORT] teleportieren, [MAP] Karte, [PROFILE] Profil
</string>
@@ -1773,11 +2046,8 @@
<string name="InvOfferGaveYou">
hat Ihnen folgendes übergeben
</string>
- <string name="InvOfferYouDecline">
- Sie lehnen folgendes ab:
- </string>
- <string name="InvOfferFrom">
- von
+ <string name="InvOfferDecline">
+ Sie lehnen [DESC] von &lt;nolink&gt;[NAME]&lt;/nolink&gt; ab.
</string>
<string name="GroupMoneyTotal">
Gesamtbetrag
@@ -1809,6 +2079,9 @@
<string name="GroupMoneyDebits">
Soll
</string>
+ <string name="GroupMoneyDate">
+ [weekday,datetime,utc] [mth,datetime,utc] [day,datetime,utc], [year,datetime,utc]
+ </string>
<string name="ViewerObjectContents">
Inhalte
</string>
@@ -1867,12 +2140,6 @@ Gültige Formate: .wav, .tga, .bmp, .jpg, .jpeg oder .bvh
<string name="accel-win-shift">
Umschalt+
</string>
- <string name="Esc">
- Esc
- </string>
- <string name="Home">
- Zuhause
- </string>
<string name="FileSaved">
Datei wurde gespeichert
</string>
@@ -1891,34 +2158,34 @@ Gültige Formate: .wav, .tga, .bmp, .jpg, .jpeg oder .bvh
<string name="PDT">
PDT
</string>
- <string name="Forward">
+ <string name="Direction_Forward">
Vorwärts
</string>
- <string name="Left">
+ <string name="Direction_Left">
Links
</string>
- <string name="Right">
+ <string name="Direction_Right">
Rechts
</string>
- <string name="Back">
- Hinten
+ <string name="Direction_Back">
+ Zurück
</string>
- <string name="North">
+ <string name="Direction_North">
Norden
</string>
- <string name="South">
+ <string name="Direction_South">
Süden
</string>
- <string name="West">
+ <string name="Direction_West">
Westen
</string>
- <string name="East">
+ <string name="Direction_East">
Osten
</string>
- <string name="Up">
+ <string name="Direction_Up">
Nach oben
</string>
- <string name="Down">
+ <string name="Direction_Down">
Nach unten
</string>
<string name="Any Category">
@@ -1990,6 +2257,9 @@ Gültige Formate: .wav, .tga, .bmp, .jpg, .jpeg oder .bvh
<string name="Other">
Sonstige
</string>
+ <string name="Rental">
+ Vermietung
+ </string>
<string name="Any">
Alle
</string>
@@ -2253,6 +2523,114 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_
<string name="Bulbous Nose">
Knollennase
</string>
+ <string name="Breast Physics Mass">
+ Brust – Masse
+ </string>
+ <string name="Breast Physics Smoothing">
+ Brust – Glättung
+ </string>
+ <string name="Breast Physics Gravity">
+ Brust – Schwerkraft
+ </string>
+ <string name="Breast Physics Drag">
+ Brust – Luftwiderstand
+ </string>
+ <string name="Breast Physics InOut Max Effect">
+ Max. Effekt
+ </string>
+ <string name="Breast Physics InOut Spring">
+ Federn
+ </string>
+ <string name="Breast Physics InOut Gain">
+ Verstärkung
+ </string>
+ <string name="Breast Physics InOut Damping">
+ Dämpfung
+ </string>
+ <string name="Breast Physics UpDown Max Effect">
+ Max. Effekt
+ </string>
+ <string name="Breast Physics UpDown Spring">
+ Federn
+ </string>
+ <string name="Breast Physics UpDown Gain">
+ Verstärkung
+ </string>
+ <string name="Breast Physics UpDown Damping">
+ Dämpfung
+ </string>
+ <string name="Breast Physics LeftRight Max Effect">
+ Max. Effekt
+ </string>
+ <string name="Breast Physics LeftRight Spring">
+ Federn
+ </string>
+ <string name="Breast Physics LeftRight Gain">
+ Verstärkung
+ </string>
+ <string name="Breast Physics LeftRight Damping">
+ Dämpfung
+ </string>
+ <string name="Belly Physics Mass">
+ Bauch – Masse
+ </string>
+ <string name="Belly Physics Smoothing">
+ Bauch – Glättung
+ </string>
+ <string name="Belly Physics Gravity">
+ Bauch – Schwerkraft
+ </string>
+ <string name="Belly Physics Drag">
+ Bauch – Luftwiderstand
+ </string>
+ <string name="Belly Physics UpDown Max Effect">
+ Max. Effekt
+ </string>
+ <string name="Belly Physics UpDown Spring">
+ Federn
+ </string>
+ <string name="Belly Physics UpDown Gain">
+ Verstärkung
+ </string>
+ <string name="Belly Physics UpDown Damping">
+ Dämpfung
+ </string>
+ <string name="Butt Physics Mass">
+ Po – Masse
+ </string>
+ <string name="Butt Physics Smoothing">
+ Po – Glättung
+ </string>
+ <string name="Butt Physics Gravity">
+ Po – Schwerkraft
+ </string>
+ <string name="Butt Physics Drag">
+ Po – Luftwiderstand
+ </string>
+ <string name="Butt Physics UpDown Max Effect">
+ Max. Effekt
+ </string>
+ <string name="Butt Physics UpDown Spring">
+ Federn
+ </string>
+ <string name="Butt Physics UpDown Gain">
+ Verstärkung
+ </string>
+ <string name="Butt Physics UpDown Damping">
+ Dämpfung
+ </string>
+ <string name="Butt Physics LeftRight Max Effect">
+ Max. Effekt
+ </string>
+ <string name="Butt Physics LeftRight Spring">
+ Federn
+ </string>
+ <string name="Butt Physics LeftRight Gain">
+ Verstärkung
+ </string>
+ <string name="Butt Physics LeftRight Damping">
+ Dämpfung
+ </string>
<string name="Bushy Eyebrows">
Buschige Augenbrauen
</string>
@@ -2262,6 +2640,9 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_
<string name="Butt Size">
Hintern, Größe
</string>
+ <string name="Butt Gravity">
+ Po – Schwerkraft
+ </string>
<string name="bustle skirt">
Tournürenrock
</string>
@@ -3474,6 +3855,9 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_
<string name="LocationCtrlGeneralIconTooltip">
Generelle Region
</string>
+ <string name="LocationCtrlSeeAVsTooltip">
+ Avatare sichtbar; Chat außerhalb dieser Parzelle gestattet
+ </string>
<string name="UpdaterWindowTitle">
[APP_NAME] Aktualisierung
</string>
@@ -3540,6 +3924,9 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_
<string name="Saved_message">
(Gespeichert am [LONG_TIMESTAMP])
</string>
+ <string name="IM_unblock_only_groups_friends">
+ Wenn Sie diese Meldung sehen, müssen Sie unter „Einstellungen“ &gt; „Privatsphäre“ die Option „Nur IMs und Anrufe von Freunden oder Gruppen durchstellen“ deaktivieren.
+ </string>
<string name="answered_call">
Ihr Anruf wurde entgegengenommen
</string>
@@ -3648,6 +4035,9 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_
<string name="session_initialization_timed_out_error">
Die Initialisierung der Sitzung ist fehlgeschlagen
</string>
+ <string name="Home position set.">
+ Position für Zuhause festgelegt.
+ </string>
<string name="voice_morphing_url">
http://secondlife.com/landing/voicemorphing
</string>
@@ -3669,6 +4059,18 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_
<string name="you_paid_ldollars_no_name">
Sie haben [REASON] [AMOUNT] L$ bezahlt.
</string>
+ <string name="you_paid_failure_ldollars">
+ Sie haben [NAME] [AMOUNT] L$ [REASON] nicht bezahlt.
+ </string>
+ <string name="you_paid_failure_ldollars_no_info">
+ Sie haben [AMOUNT] L$ nicht bezahlt.
+ </string>
+ <string name="you_paid_failure_ldollars_no_reason">
+ Sie haben [NAME] [AMOUNT] L$ nicht bezahlt.
+ </string>
+ <string name="you_paid_failure_ldollars_no_name">
+ Sie haben [AMOUNT] L$ [REASON] nicht bezahlt.
+ </string>
<string name="for item">
für [ITEM]
</string>
@@ -3721,8 +4123,8 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_
Online
</string>
<string name="uploading_abuse_report">
- Bericht wird hochgeladen...
-
+ Hochladen...
+
Missbrauchsbericht
</string>
<string name="New Shape">
@@ -3770,6 +4172,9 @@ Missbrauchsbericht
<string name="New Tattoo">
Neue Tätowierung
</string>
+ <string name="New Physics">
+ Neue Physik
+ </string>
<string name="Invalid Wearable">
Ungültiges Objekt
</string>
@@ -3893,6 +4298,87 @@ Missbrauchsbericht
<string name="Female - Wow">
Weiblich - Wow
</string>
+ <string name="/bow">
+ /verbeugen
+ </string>
+ <string name="/clap">
+ /klatschen
+ </string>
+ <string name="/count">
+ /zählen
+ </string>
+ <string name="/extinguish">
+ /löschen
+ </string>
+ <string name="/kmb">
+ /lmaa
+ </string>
+ <string name="/muscle">
+ /Muskel
+ </string>
+ <string name="/no">
+ /nein
+ </string>
+ <string name="/no!">
+ /nein!
+ </string>
+ <string name="/paper">
+ /Papier
+ </string>
+ <string name="/pointme">
+ /auf mich zeigen
+ </string>
+ <string name="/pointyou">
+ /auf dich zeigen
+ </string>
+ <string name="/rock">
+ /Stein
+ </string>
+ <string name="/scissor">
+ /Schere
+ </string>
+ <string name="/smoke">
+ /rauchen
+ </string>
+ <string name="/stretch">
+ /dehnen
+ </string>
+ <string name="/whistle">
+ /pfeifen
+ </string>
+ <string name="/yes">
+ /ja
+ </string>
+ <string name="/yes!">
+ /ja!
+ </string>
+ <string name="afk">
+ afk
+ </string>
+ <string name="dance1">
+ Tanzen1
+ </string>
+ <string name="dance2">
+ Tanzen2
+ </string>
+ <string name="dance3">
+ Tanzen3
+ </string>
+ <string name="dance4">
+ Tanzen4
+ </string>
+ <string name="dance5">
+ Tanzen5
+ </string>
+ <string name="dance6">
+ Tanzen6
+ </string>
+ <string name="dance7">
+ Tanzen7
+ </string>
+ <string name="dance8">
+ Tanzen8
+ </string>
<string name="AvatarBirthDateFormat">
[mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt]
</string>
@@ -3906,8 +4392,8 @@ Missbrauchsbericht
<string name="server_is_down">
Trotz all unserer Bemühungen ist ein unerwarteter Fehler aufgetreten.
- Bitte überprüfen Sie status.secondlifegrid.net, um festzustellen, ob ein Problem besteht.
- Falls Sie weiterhin Problem haben, überprüfen Sie bitte Ihre Netzwerk- und Firewalleinstellungen.
+ Bitte überprüfen Sie status.secondlifegrid.net, um herauszufinden, ob ein Problem besteht.
+ Falls Sie weiterhin Problem haben, überprüfen Sie bitte Ihre Netzwerk- und Firewalleinstellungen.
</string>
<string name="dateTimeWeekdaysNames">
Sonntag:Montag:Dienstag:Mittwoch:Donnerstag:Freitag:Samstag
@@ -3969,7 +4455,7 @@ Missbrauchsbericht
<string name="Notices">
Mitteilungen
</string>
- <string name="Chat">
+ <string name="Chat" value=" Chat:">
Chat
</string>
<string name="DeleteItems">
@@ -3981,4 +4467,552 @@ Missbrauchsbericht
<string name="EmptyOutfitText">
Keine Objekte in diesem Outfit
</string>
+ <string name="ExternalEditorNotSet">
+ Wählen Sie über die Einstellung „ExternalEditor“ einen Editor aus
+ </string>
+ <string name="ExternalEditorNotFound">
+ Angegebener externer Editor nicht gefunden.
+Setzen Sie den Editorpfad in Anführungszeichen
+(z. B. &quot;/pfad/editor&quot; &quot;%s&quot;).
+ </string>
+ <string name="ExternalEditorCommandParseError">
+ Fehler beim Parsen des externen Editorbefehls.
+ </string>
+ <string name="ExternalEditorFailedToRun">
+ Externer Editor konnte nicht ausgeführt werden.
+ </string>
+ <string name="TranslationFailed">
+ Ãœbersetzung fehlgeschlagen: [REASON]
+ </string>
+ <string name="TranslationResponseParseError">
+ Fehler beim Parsen der Ãœbersetzungsantwort.
+ </string>
+ <string name="Esc">
+ Esc
+ </string>
+ <string name="Space">
+ Space
+ </string>
+ <string name="Enter">
+ Enter
+ </string>
+ <string name="Tab">
+ Tab
+ </string>
+ <string name="Ins">
+ Ins
+ </string>
+ <string name="Del">
+ Del
+ </string>
+ <string name="Backsp">
+ Backsp
+ </string>
+ <string name="Shift">
+ Shift
+ </string>
+ <string name="Ctrl">
+ Ctrl
+ </string>
+ <string name="Alt">
+ Alt
+ </string>
+ <string name="CapsLock">
+ CapsLock
+ </string>
+ <string name="Home">
+ Zuhause
+ </string>
+ <string name="End">
+ End
+ </string>
+ <string name="PgUp">
+ PgUp
+ </string>
+ <string name="PgDn">
+ PgDn
+ </string>
+ <string name="F1">
+ F1
+ </string>
+ <string name="F2">
+ F2
+ </string>
+ <string name="F3">
+ F3
+ </string>
+ <string name="F4">
+ F4
+ </string>
+ <string name="F5">
+ F5
+ </string>
+ <string name="F6">
+ F6
+ </string>
+ <string name="F7">
+ F7
+ </string>
+ <string name="F8">
+ F8
+ </string>
+ <string name="F9">
+ F9
+ </string>
+ <string name="F10">
+ F10
+ </string>
+ <string name="F11">
+ F11
+ </string>
+ <string name="F12">
+ F12
+ </string>
+ <string name="Add">
+ Addieren
+ </string>
+ <string name="Subtract">
+ Subtrahieren
+ </string>
+ <string name="Multiply">
+ Multiplizieren
+ </string>
+ <string name="Divide">
+ Dividieren
+ </string>
+ <string name="PAD_DIVIDE">
+ PAD_DIVIDE
+ </string>
+ <string name="PAD_LEFT">
+ PAD_LEFT
+ </string>
+ <string name="PAD_RIGHT">
+ PAD_RIGHT
+ </string>
+ <string name="PAD_DOWN">
+ PAD_DOWN
+ </string>
+ <string name="PAD_UP">
+ PAD_UP
+ </string>
+ <string name="PAD_HOME">
+ PAD_HOME
+ </string>
+ <string name="PAD_END">
+ PAD_END
+ </string>
+ <string name="PAD_PGUP">
+ PAD_PGUP
+ </string>
+ <string name="PAD_PGDN">
+ PAD_PGDN
+ </string>
+ <string name="PAD_CENTER">
+ PAD_CENTER
+ </string>
+ <string name="PAD_INS">
+ PAD_INS
+ </string>
+ <string name="PAD_DEL">
+ PAD_DEL
+ </string>
+ <string name="PAD_Enter">
+ PAD_Enter
+ </string>
+ <string name="PAD_BUTTON0">
+ PAD_BUTTON0
+ </string>
+ <string name="PAD_BUTTON1">
+ PAD_BUTTON1
+ </string>
+ <string name="PAD_BUTTON2">
+ PAD_BUTTON2
+ </string>
+ <string name="PAD_BUTTON3">
+ PAD_BUTTON3
+ </string>
+ <string name="PAD_BUTTON4">
+ PAD_BUTTON4
+ </string>
+ <string name="PAD_BUTTON5">
+ PAD_BUTTON5
+ </string>
+ <string name="PAD_BUTTON6">
+ PAD_BUTTON6
+ </string>
+ <string name="PAD_BUTTON7">
+ PAD_BUTTON7
+ </string>
+ <string name="PAD_BUTTON8">
+ PAD_BUTTON8
+ </string>
+ <string name="PAD_BUTTON9">
+ PAD_BUTTON9
+ </string>
+ <string name="PAD_BUTTON10">
+ PAD_BUTTON10
+ </string>
+ <string name="PAD_BUTTON11">
+ PAD_BUTTON11
+ </string>
+ <string name="PAD_BUTTON12">
+ PAD_BUTTON12
+ </string>
+ <string name="PAD_BUTTON13">
+ PAD_BUTTON13
+ </string>
+ <string name="PAD_BUTTON14">
+ PAD_BUTTON14
+ </string>
+ <string name="PAD_BUTTON15">
+ PAD_BUTTON15
+ </string>
+ <string name="-">
+ -
+ </string>
+ <string name="=">
+ =
+ </string>
+ <string name="`">
+ `
+ </string>
+ <string name=";">
+ ;
+ </string>
+ <string name="[">
+ [
+ </string>
+ <string name="]">
+ ]
+ </string>
+ <string name="\">
+ \
+ </string>
+ <string name="0">
+ 0
+ </string>
+ <string name="1">
+ 1
+ </string>
+ <string name="2">
+ 2
+ </string>
+ <string name="3">
+ 3
+ </string>
+ <string name="4">
+ 4
+ </string>
+ <string name="5">
+ 5
+ </string>
+ <string name="6">
+ 6
+ </string>
+ <string name="7">
+ 7
+ </string>
+ <string name="8">
+ 8
+ </string>
+ <string name="9">
+ 9
+ </string>
+ <string name="A">
+ A
+ </string>
+ <string name="B">
+ B
+ </string>
+ <string name="C">
+ C
+ </string>
+ <string name="D">
+ D
+ </string>
+ <string name="E">
+ E
+ </string>
+ <string name="F">
+ F
+ </string>
+ <string name="G">
+ G
+ </string>
+ <string name="H">
+ H
+ </string>
+ <string name="I">
+ I
+ </string>
+ <string name="J">
+ J
+ </string>
+ <string name="K">
+ K
+ </string>
+ <string name="L">
+ L
+ </string>
+ <string name="M">
+ M
+ </string>
+ <string name="N">
+ N
+ </string>
+ <string name="O">
+ O
+ </string>
+ <string name="P">
+ P
+ </string>
+ <string name="Q">
+ Q
+ </string>
+ <string name="R">
+ R
+ </string>
+ <string name="S">
+ S
+ </string>
+ <string name="T">
+ T
+ </string>
+ <string name="U">
+ U
+ </string>
+ <string name="V">
+ V
+ </string>
+ <string name="W">
+ W
+ </string>
+ <string name="X">
+ X
+ </string>
+ <string name="Y">
+ Y
+ </string>
+ <string name="Z">
+ Z
+ </string>
+ <string name="BeaconParticle">
+ Partikel-Beacons werden angezeigt (blau)
+ </string>
+ <string name="BeaconPhysical">
+ Beacons für physische Objekte werden angezeigt (grün)
+ </string>
+ <string name="BeaconScripted">
+ Beacons für Skriptobjekte werden angezeigt (rot)
+ </string>
+ <string name="BeaconScriptedTouch">
+ Beacons für Skriptobjekte mit Berührungsfunktion werden angezeigt (rot)
+ </string>
+ <string name="BeaconSound">
+ Sound-Beacons werden angezeigt (gelb)
+ </string>
+ <string name="BeaconMedia">
+ Medien-Beacons werden angezeigt (weiß)
+ </string>
+ <string name="ParticleHiding">
+ Partikel werden ausgeblendet
+ </string>
+ <string name="Command_AboutLand_Label">
+ Landinformationen
+ </string>
+ <string name="Command_Appearance_Label">
+ Aussehen
+ </string>
+ <string name="Command_Avatar_Label">
+ Avatar
+ </string>
+ <string name="Command_Build_Label">
+ Bauen
+ </string>
+ <string name="Command_Chat_Label">
+ Chat
+ </string>
+ <string name="Command_Compass_Label">
+ Kompass
+ </string>
+ <string name="Command_Destinations_Label">
+ Ziele
+ </string>
+ <string name="Command_Gestures_Label">
+ Gesten
+ </string>
+ <string name="Command_HowTo_Label">
+ Infos
+ </string>
+ <string name="Command_Inventory_Label">
+ Inventar
+ </string>
+ <string name="Command_Map_Label">
+ Karte
+ </string>
+ <string name="Command_Marketplace_Label">
+ Marktplatz
+ </string>
+ <string name="Command_MiniMap_Label">
+ Minikarte
+ </string>
+ <string name="Command_Move_Label">
+ Gehen / Rennen / Fliegen
+ </string>
+ <string name="Command_Outbox_Label">
+ Händler-Outbox
+ </string>
+ <string name="Command_People_Label">
+ Leute
+ </string>
+ <string name="Command_Picks_Label">
+ Auswahlen
+ </string>
+ <string name="Command_Places_Label">
+ Orte
+ </string>
+ <string name="Command_Preferences_Label">
+ Einstellungen
+ </string>
+ <string name="Command_Profile_Label">
+ Profil
+ </string>
+ <string name="Command_Search_Label">
+ Suchen
+ </string>
+ <string name="Command_Snapshot_Label">
+ Foto
+ </string>
+ <string name="Command_Speak_Label">
+ Sprechen
+ </string>
+ <string name="Command_View_Label">
+ Kamerasteuerungen
+ </string>
+ <string name="Command_Voice_Label">
+ Voice-Einstellungen
+ </string>
+ <string name="Command_AboutLand_Tooltip">
+ Informationen zu dem von Ihnen besuchten Land
+ </string>
+ <string name="Command_Appearance_Tooltip">
+ Avatar ändern
+ </string>
+ <string name="Command_Avatar_Tooltip">
+ Kompletten Avatar auswählen
+ </string>
+ <string name="Command_Build_Tooltip">
+ Objekte bauen und Terrain umformen
+ </string>
+ <string name="Command_Chat_Tooltip">
+ Mit Leuten in der Nähe chatten
+ </string>
+ <string name="Command_Compass_Tooltip">
+ Kompass
+ </string>
+ <string name="Command_Destinations_Tooltip">
+ Ziele von Interesse
+ </string>
+ <string name="Command_Gestures_Tooltip">
+ Gesten für Ihren Avatar
+ </string>
+ <string name="Command_HowTo_Tooltip">
+ Wie führe ich gängige Aufgaben aus?
+ </string>
+ <string name="Command_Inventory_Tooltip">
+ Ihr Eigentum anzeigen und benutzen
+ </string>
+ <string name="Command_Map_Tooltip">
+ Weltkarte
+ </string>
+ <string name="Command_Marketplace_Tooltip">
+ Einkaufen gehen
+ </string>
+ <string name="Command_MiniMap_Tooltip">
+ Leute in der Nähe anzeigen
+ </string>
+ <string name="Command_Move_Tooltip">
+ Ihren Avatar bewegen
+ </string>
+ <string name="Command_Outbox_Tooltip">
+ Artikel zum Verkauf in den Marktplatz übertragen
+ </string>
+ <string name="Command_People_Tooltip">
+ Freunde, Gruppen und Leute in der Nähe
+ </string>
+ <string name="Command_Picks_Tooltip">
+ Orte, die in Ihrem Profil als Favoriten angezeigt werden sollen
+ </string>
+ <string name="Command_Places_Tooltip">
+ Von Ihnen gespeicherte Orte
+ </string>
+ <string name="Command_Preferences_Tooltip">
+ Einstellungen
+ </string>
+ <string name="Command_Profile_Tooltip">
+ Ihr Profil bearbeiten oder anzeigen
+ </string>
+ <string name="Command_Search_Tooltip">
+ Orte, Veranstaltungen, Leute finden
+ </string>
+ <string name="Command_Snapshot_Tooltip">
+ Foto aufnehmen
+ </string>
+ <string name="Command_Speak_Tooltip">
+ Über Ihr Mikrofon mit Leuten in der Nähe sprechen
+ </string>
+ <string name="Command_View_Tooltip">
+ Kamerawinkel ändern
+ </string>
+ <string name="Command_Voice_Tooltip">
+ Lautstärkeregler für Anrufe und Leute in Ihrer Nähe in SL
+ </string>
+ <string name="Toolbar_Bottom_Tooltip">
+ gegenwärtig in der unteren Symbolleiste
+ </string>
+ <string name="Toolbar_Left_Tooltip">
+ gegenwärtig in der linken Symbolleiste
+ </string>
+ <string name="Toolbar_Right_Tooltip">
+ gegenwärtig in der rechten Symbolleiste
+ </string>
+ <string name="Retain%">
+ % zurückbehalten
+ </string>
+ <string name="Detail">
+ Details
+ </string>
+ <string name="Better Detail">
+ Bessere Details
+ </string>
+ <string name="Surface">
+ Oberfläche
+ </string>
+ <string name="Solid">
+ Fest
+ </string>
+ <string name="Wrap">
+ Wickeln
+ </string>
+ <string name="Preview">
+ Vorschau
+ </string>
+ <string name="Normal">
+ Normal
+ </string>
+ <string name="snapshot_quality_very_low">
+ Sehr niedrig
+ </string>
+ <string name="snapshot_quality_low">
+ Niedrig
+ </string>
+ <string name="snapshot_quality_medium">
+ Mittel
+ </string>
+ <string name="snapshot_quality_high">
+ Hoch
+ </string>
+ <string name="snapshot_quality_very_high">
+ Sehr hoch
+ </string>
</strings>
diff --git a/indra/newview/skins/default/xui/de/teleport_strings.xml b/indra/newview/skins/default/xui/de/teleport_strings.xml
index 69c952c532..9cf381bacc 100644
--- a/indra/newview/skins/default/xui/de/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/de/teleport_strings.xml
@@ -20,6 +20,10 @@ Wenn der Teleport dann immer noch nicht funktioniert, melden Sie sich bitte ab u
Das System konnte keine Teleport-Verbindung herstellen.
Versuchen Sie es später noch einmal.
</message>
+ <message name="NoHelpIslandTP">
+ Sie können nicht zurück nach Welcome Island teleportieren.
+Gehen Sie zu „Welcome Island Public“, um das Tutorial zu wiederholen.
+ </message>
<message name="noaccess_tport">
Sie haben leider keinen Zugang zu diesem Teleport-Ziel.
</message>
diff --git a/indra/newview/skins/default/xui/en/floater_aaa.xml b/indra/newview/skins/default/xui/en/floater_aaa.xml
index 930bbaa8cb..d11373ce1d 100644
--- a/indra/newview/skins/default/xui/en/floater_aaa.xml
+++ b/indra/newview/skins/default/xui/en/floater_aaa.xml
@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
- legacy_header_height="18"
can_minimize="false"
can_tear_off="false"
can_resize="true"
@@ -16,67 +15,98 @@
save_dock_state="true"
save_visibility="true"
single_instance="true"
- width="320">
- <string name="nudge_parabuild" translate="false">Nudge 1</string>
- <string name="test_the_vlt">This string CHANGE2 is extracted.</string>
- <string name="testing_eli">Just a test. changes.</string>
- <text_editor
- parse_urls="true"
- bg_readonly_color="ChatHistoryBgColor"
- bg_writeable_color="ChatHistoryBgColor"
- border_visible="false"
- follows="all"
- font="SansSerif"
- left="1"
- top="20"
- layout="topleft"
- height="260"
- name="chat_history"
- max_length="200000"
- parse_highlights="true"
- text_color="ChatHistoryTextColor"
- text_readonly_color="ChatHistoryTextColor"
- translate="false"
- track_end="true"
- wrap="true"
- width="320">
- Really long line that is long enough to wrap once with jyg descenders.
- Really long line that is long enough to wrap once with jyg descenders.
- Really long line that is long enough to wrap once with jyg descenders.
- Really long line that is long enough to wrap once with jyg descenders.
- Really long line that is long enough to wrap once with jyg descenders.
- Really long line that is long enough to wrap once with jyg descenders.
- Really long line that is long enough to wrap once with jyg descenders.
- Really long line that is long enough to wrap once with jyg descenders.
- Really long line that is long enough to wrap once with jyg descenders.
- Really long line that is long enough to wrap once with jyg descenders.
- Really long line that is long enough to wrap once with jyg descenders.
- Really long line that is long enough to wrap once with jyg descenders.
- Really long line that is long enough to wrap once with jyg descenders.
- Really long line that is long enough to wrap once with jyg descenders.
- Really long line that is long enough to wrap once with jyg descenders.
- Really long line that is long enough to wrap once with jyg descenders.
- Really long line that is long enough to wrap once with jyg descenders.
- Really long line that is long enough to wrap once with jyg descenders.
- Really long line that is long enough to wrap once with jyg descenders.
- Really long line that is long enough to wrap once with jyg descenders.
- Really long line that is long enough to wrap once with jyg descenders.
- Really long line that is long enough to wrap once with jyg descenders.
- Really long line that is long enough to wrap once with jyg descenders.
- Really long line that is long enough to wrap once with jyg descenders.
- Really long line that is long enough to wrap once with jyg descenders.
- Really long line that is long enough to wrap once with jyg descenders.
- Really long line that is long enough to wrap once with jyg descenders.
- Really long line that is long enough to wrap once with jyg descenders.
- Really long line that is long enough to wrap once with jyg descenders.
- Really long line that is long enough to wrap once with jyg descenders.
- Really long line that is long enough to wrap once with jyg descenders.
- Really long line that is long enough to wrap once with jyg descenders.
- Really long line that is long enough to wrap once with jyg descenders.
- Really long line that is long enough to wrap once with jyg descenders.
- Really long line that is long enough to wrap once with jyg descenders.
- Really long line that is long enough to wrap once with jyg descenders.
- Really long line that is long enough to wrap once with jyg descenders.
- Really long line that is long enough to wrap once with jyg descenders.
- </text_editor>
+ width="650">
+ <text left="0"
+ follows="left|top|bottom"
+ top="5"
+ clip_partial="true"
+ bottom="-5"
+ width="100"
+ valign="top">
+this
+is
+some
+text
+that
+is
+top
+aligned</text>
+ <text left_pad="5"
+ follows="left|top|bottom"
+ top="5"
+ bottom="-5"
+ clip_partial="true"
+ width="100"
+ valign="center">
+this
+is
+some
+text
+that
+is
+center
+aligned</text>
+ <text left_pad="5"
+ follows="left|top|bottom"
+ top="5"
+ clip_partial="true"
+ bottom="-5"
+ width="100"
+ valign="bottom">
+this
+is
+some
+text
+that
+is
+bottom
+aligned</text>
+ <text_editor left_pad="5"
+ follows="left|top|bottom"
+ top="5"
+ clip_partial="true"
+ bottom="-5"
+ width="100"
+ valign="top">
+this
+is
+some
+text
+that
+is
+top
+aligned
+ </text_editor>
+ <text_editor left_pad="5"
+ follows="left|top|bottom"
+ top="5"
+ bottom="-5"
+ clip_partial="true"
+ width="100"
+ valign="center">
+this
+is
+some
+text
+that
+is
+center
+aligned
+ </text_editor>
+ <text_editor left_pad="5"
+ follows="left|top|bottom"
+ top="5"
+ clip_partial="true"
+ bottom="-5"
+ width="100"
+ valign="bottom">
+this
+is
+some
+text
+that
+is
+bottom
+aligned
+ </text_editor>
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_about.xml b/indra/newview/skins/default/xui/en/floater_about.xml
index f5365be11f..060d889003 100644
--- a/indra/newview/skins/default/xui/en/floater_about.xml
+++ b/indra/newview/skins/default/xui/en/floater_about.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
+ positioning="centered"
legacy_header_height="18"
height="440"
layout="topleft"
@@ -23,7 +24,7 @@ Built with [COMPILER] version [COMPILER_VERSION]
name="AboutPosition">
You are at [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] in [REGION] located at &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ([HOSTIP])
[SERVER_VERSION]
-[[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]]
+[SERVER_RELEASE_NOTES_URL]
</floater.string>
<!-- *NOTE: Do not translate text like GPU, Graphics Card, etc -
@@ -59,6 +60,10 @@ Voice Server Version: [VOICE_VERSION]
name="AboutTraffic">
Packets Lost: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
</floater.string>
+<floater.string
+ name="ErrorFetchingServerReleaseNotesURL">
+Error fetching server release notes URL.
+</floater.string>
<tab_container
follows="all"
top="25"
@@ -98,26 +103,80 @@ Packets Lost: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number
label="Credits"
help_topic="about_credits_tab"
name="credits_panel">
+ <text
+ follows="top|left|right"
+ height="10"
+ layout="topleft"
+ left="5"
+ name="linden_intro"
+ top="10"
+ width="435"
+ wrap="true">
+Second Life is brought to you by the Lindens:
+ </text>
<text_editor
enabled="false"
- follows="left|top"
- height="375"
+ follows="top|left"
+ height="98"
bg_readonly_color="Transparent"
left="5"
text_color="LtGray"
max_length="65536"
- name="credits_editor"
- top="5"
+ name="linden_names"
+ top_pad="10"
width="435"
word_wrap="true">
-Second Life is brought to you by Philip, Tessa, Andrew, Cory, Ian, James, Phoenix, Ryan, Haney, Dan, Char, Ben, John, Tanya, Eddie, Richard, Mitch, Doug, Eric, Frank, Bruce, Aaron, Peter, Alice, Charlie, Debra, Eileen, Helen, Janet, Steffan, Steve, Tom, Mark, Hunter, Xenon, Burgess, Bill, Jim, Lee, Hamlet, Daniel, Jeff, Todd, Sarah, Tim, Stephanie, Colin, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Jack, Vektor, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Jesse, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Yuko, Makiko, Thomas, Harry, Seth, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Brad, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, Beez, Milo, Hermia, Red, Thrax, Gulliver, Joe, Sally, Paul, Jose, Rejean, Dore, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, Dustin, George, Del, Matthew, Cat, Jacqui, Adrian, Viola, Alfred, Noel, Irfan, Yool, Rika, Jane, Frontier, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Jeremy, JP, Jake, Anthony, Maurice, Madhavi, Leopard, Kyle, Joon, Bert, Belinda, Jon, Kristi, Bridie, Pramod, Socrates, Maria, Aric, Adreanne, Jay, Kari, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Colossus, Zen, BigPapi, Pastrami, Kurz, Mani, Neuro, Mel, Sardonyx, MJ, Rowan, Sgt, Elvis, Samuel, Leo, Bryan, Niko, Austin, Soft, Poppy, Rachel, Aki, Banzai, Alexa, Sue, Bender, CG, Angelo, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Rothman, Niall, Marin, Allison, Katie, Dawn, Dusty, Katt, Judy, Andrea, Ambroff, Infinity, Rico, Gail, Kalpana, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Maestro, Simone, Yang, T, Shannon, Nelson, Khanh, Scott, Courtney, Charlene, Quixote, Susan, Zed, Amanda, Katelin, Enkidu, Roxie, Esbee, JoRoan, Scarlet, Tay, Kevin, Wolfgang, Johnny, Ray, Andren, Merov, Bob, Rand, Howard, Callen, Heff, Galen, Newell, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl, Ashley, JessieAnn, Huseby, Karina, Paris, Kurt, Rick, Lis, Kotler, Theeba, Lynx, Murphy, Doten, Taka, Norm, Jillian, Marcus, Mae, Novack, Esther, Perry, Dana, Ducot, Javier, Porter, Madison, Gecko, Dough, JR, Gisele, Crimp, Norie, Arch, Kimi, Fisher, Barbara, Jason, Peggy, Bernard, Jules, Leroy, Eva, Khederian, Campbell, Vogt, Masido, Karel, Torres, Lo, Breezer, Delby, Rountree, Anna, Servus, Rue, Itiaes, Chuck, Luna, Novella, Zaza, Wen, Gino, Lex, Cassandra, Limey, Nancy, Anukul, Silver, Brodesky, Jinsai, Squid, Gez, Rakesh, Ladan, Edelman, Marcet, Squire, Tatem, Tony, Jerm, Tia, Falcon, BK, Tiggs, Driscoll, Bacon, Timothee, Cru, Carmilla, Coyot, Webb, Kazu, Rudas, LJ, Sea, Ali Wallace, Bewest, Pup, Drub, Dragon, Inoshiro, Byron, Rhett, Xandix, Aimee, Fredrik, Thor, Teddy, Baron, Nelly, Ghengis, Epic, Eli, Stone, Grapes, Irie, Prep, Scobu, Valerie, Alain, and many others.
-
-Thank you to the following Residents for helping to ensure that this is the best version yet: Drew Dwi, Zai Lynch, Latif Khalifa, Ellla McMahon, Harleen Gretzky, Squirrel Wood, Malarthi Behemoth, Dante Tucker, Buckaroo Mu, Eddi Decosta, Dirk, Talamasca, Torben Trautman, Irene Muni, Aralara Rajal, Aura Dirval, Cayu Cluny, Eva Rau, FreeSL Aeon, Frontera Thor, Inma Rau, Lunita Savira, Minerva Memel, Polo Gufler, Xiki Luik, Lilly Zenovka, Vick Forcella, Sasy Scarborough, Gentle Welinder, Elric Anatine, Techwolf Lupindo, Dusan Writer, WolfPup Lowenhar, Marianne McCann, Fiachra Lach, Sitearm Madonna, Sudane Erato, Sahkolihaa Contepomi, Sachi Vixen, Questar Utu, Dimitrio Lewis, Matto Destiny, Scrim Pinion, Radio Signals, Psi Merlin, Pixel Gausman, Mel Vanbeeck, Laurent Bechir, Lamorna Proctor, Lares Carter, Gwyneth Llewelyn, Hydra Shaftoe, Holger Gilruth, Gentle Heron, Carla Broek, Boroondas Gupte, Fury Rosewood, Flower Ducatillon, Colpo Wexler, gwampa Lomu, Borg Capalini, Beansy Twine, Ardy Lay, , 45ms Zhong, Adeon Writer, Aeonix Aeon, Ai Austin, Aiko Ying, Alexandrea Fride, Alliez Mysterio, Annie Milestone, Annika Genezzia, Ansariel Hiller, ArminasX Saiman, Arya Braveheart, Asaeda Meltingdots, Asturkon Jua, Avallyn Oakleaf, Avatar Quinzet, BabyA Littlething, Bacchus Ireto, Bazaar, Riva, Benjamin Bigdipper, Beth Walcher, Bezilon Kasei, Biancaluce Robbiani, Bill Walach, blakopal Galicia, Blitzckreed Levenque, Bryn Oh, Callipygian Christensen, Cap Carver, Carr Arbenlow, Chantal Harvey, Charles Courtois, Charlie Sazaland, Cherry Cheevers, ChickyBabes Zuzu, Christopher Organiser, Ciaran Laval, Clara Young, Celierra Darling, Corinne Helendale, Corro Moseley, Coughdrop Littlething, Darien Caldwell, Dartagan Shepherd, Debs Regent, Decro Schmooz, Denim Kamachi, DiJodi Dubratt, Dil Spitz, Edgware Marker, Egehan Dryke, Emma Portilo, Emmie Fairymeadow, Evangelista Emerald, Faelon Swordthain, Frenchimmo Sabra, Gaberoonie Zanzibar, Ganymedes Costagravas, Gene Frostbite, GeneJ Composer, Giggles Littlebird, Grady Echegaray, Guni Greenstein, Gypsy Tripsa, Hackshaven Harford, Ham Rambler, Han Shuffle, Hanglow Short, Hatzfeld Runo, herina Bode, Horatio Freund, Hypatia Callisto, Hypatia Pickens, Identity Euler, Imnotgoing Sideways, Innula Zenovka, Iyoba Tarantal, Jack Abraham, Jagga Meredith, Jennifer Boyle, Jeremy Marquez, Jessica Qin, Jinx Nordberg, Jo Bernandes, Jocial Sonnenkern, Joel Savard, Jondan Lundquist, Josef Munster, Josette Windlow, Juilan Tripsa, Juro Kothari, Justin RiversRunRed, Kagehi Kohn, Kaimen Takahe, Keklily Longfall, Ken Lavender, Kestral Karas, Khisme Nitely, Kimar Coba, Kithrak Kirkorian, Kitty Barnett, Kolor Fall, Komiko Okamoto, Korvel Noh, Larry Pixel, Leal Choche, len Starship, Lenae Munz, Lexi Frua, Lillie Cordeaux, Lizzy Macarthur, LSL Scientist, Luban Yiyuan, Luc Starsider, Maccus McCullough, Madison Blanc, Maggie Darwin, Mallory Destiny, Manx Wharton, Marc Claridge, Marc2 Sands, Matthew Anthony, Maxim RiversRunRed, Medhue Simoni, Melinda Latynina, Mencius Watts, Michi Lumin, Midian Farspire, Miles Glaz, Mindy Mathy, Mitch Wagner, Mo Hax, Mourna Biziou, Nao Noe, naofan Teardrop, Naomah Beaumont, Nathiel Siamendes, Nber Medici, Neko Link, Netpat Igaly, Neutron Chesnokov, Newfie Pendragon, Nicholai Laviscu, Nick Rhodes, Nicoladie Gymnast, Ollie Kubrick, Orenj Marat, Orion Delphis, Oryx Tempel, Parvati Silverweb, PeterPunk Mooney, Pixel Scientist, Pounce Teazle, Professor Noarlunga, Quantum Destiny, Quicksilver Hermes, Ralf Setsuko, RAT Quan, RedMokum Bravin, Revolution Perenti, Rezit Sideways, Rich Grainger, Rosco Teardrop, Rose Evans, Rudee Voom, RufusTT Horsefly, Saii Hallard, SaintLEOlions Zimer, Samm Larkham, Satanello Miami, SexySteven Morrisey, Sheet Spotter, Shnurui Troughton, sicarius Thorne, Sicarius Toxx, Sini Nubalo, SLB Wirefly, snowy Sidran, Soupa Segura, ST Mensing, Starshine Halasy, Stickman Ingmann, Synystyr Texan, Takeda Terrawyng, Tali Rosca, Templar Merlin, Tezcatlipoca Bisiani, Tiel Stonecutter, Tony Kembia, TouchaHoney Perhaps, Trey Reanimator, TriloByte Zanzibar, Trinity Dechou, Trinity Dejavu, Unlikely Quintessa, UsikuFarasi Kanarik, Veritas Raymaker, Vex Streeter, Viaticus Speculaas, Villain Baroque, Vixie Durant, Void Singer, Watty Berkson, Westley Schridde, Westley Streeter, Whimsy Winx, Winter Ventura, Wundur Primbee, xstorm Radek, YongYong Francois, Zak Westminster, Zana Kohime, Zaren Alexander, Zeja Pyle, ZenMondo Wormser, Zoex Flanagan, and many others.
-
-
-
-
-"The work goes on, the cause endures, the hope still lives, and the dreams shall never die" - Edward Kennedy
+Philip, Andrew, Doug, Richard, Phoenix, Ian, Mark, Robin, Dan, Char, Ryan, Eric, Jim, Lee, Jeff, Michael, Kelly, Steve, Catherine, Bub, Ramzi, Jill, Jeska, Don, Kona, Callum, Charity, Jack, Shawn, babbage, James, Lauren, Blue, Brent, Reuben, Pathfinder, Jesse, Patsy, Torley, Bo, Cyn, Jonathan, Gia, Annette, Ginsu, Harry, Lex, Runitai, Guy, Cornelius, Beth, Swiss, Thumper, Wendy, Teeple, Seth, Dee, Mia, Sally, Liana, Aura, Beez, Milo, Red, Gulliver, Marius, Joe, Jose, Dore, Justin, Nora, Morpheus, Lexie, Amber, Chris, Xan, Leyla, Walker, Sabin, Joshua, Hiromi, Tofu, Fritz, June, Jean, Ivy, Dez, Ken, Betsy, Which, Spike, Rob, Zee, Dustin, George, Claudia, del, Matthew, jane, jay, Adrian, Yool, Rika, Yoz, siobhan, Qarl, Benjamin, Beast, Everett, madhavi, Christopher, Izzy, stephany, Jeremy, sean, adreanne, Pramod, Tobin, sejong, Iridium, maurice, kj, Meta, kari, JP, bert, kyle, Jon, Socrates, Bridie, Ivan, maria, Aric, Coco, Periapse, sandy, Storrs, Lotte, Colossus, Brad, Pastrami, Zen, BigPapi, Banzai, Sardonyx, Mani, Garry, Jaime, Neuro, Samuel, Niko, CeeLo, Austin, Soft, Poppy, emma, tessa, angelo, kurz, alexa, Sue, CG, Blake, Erica, Brett, Bevis, kristen, Q, simon, Enus, MJ, laurap, Kip, Scouse, Ron, Ram, kend, Marty, Prospero, melissa, kraft, Nat, Seraph, Hamilton, Lordan, Green, miz, Ashlei, Trinity, Ekim, Echo, Charlie, Rowan, Rome, Jt, Doris, benoc, Christy, Bao, Kate, Tj, Patch, Cheah, Johan, Brandy, Angela, Oreh, Cogsworth, Lan, Mitchell, Space, Bambers, Einstein, Bender, Malbers, Matias, Maggie, Rothman, Milton, Niall, Marin, Allison, Mango, Andrea, Katt, Yi, Ambroff, Rico, Raymond, Gail, Christa, William, Dawn, Usi, Dynamike, M, Corr, Dante, Molly, kaylee, Danica, Kelv, Lil, jacob, Nya, Rodney, elsie, Blondin, Grant, Nyx, Devin, Monty, Minerva, Keira, Katie, Jenn, Makai, Clare, Joy, Cody, Gayathri, FJ, spider, Oskar, Landon, Jarv, Noelle, Al, Doc, Gray, Vir, t, Maestro, Simone, Shannon, yang, Courtney, Scott, charlene, Quixote, Susan, Zed, Amanda, Katelin, Esbee, JoRoan, Enkidu, roxie, Scarlet, Merov, Kevin, Judy, Rand, Newell, Les, Dessie, Galen, Michon, Geo, Siz, Calyle, Pete, Praveen, Callen, Sheldon, Pink, Nelson, jenelle, Terrence, Nathan, Juan, Sascha, Huseby, Karina, Kaye, Kotler, Lis, Darv, Charrell, Dakota, Kimmora, Theeba, Taka, Mae, Perry, Ducot, dana, Esther, Dough, gisele, Doten, Viale, Fisher, jessieann, ashley, Torres, delby, rountree, kurt, Slaton, Madison, Rue, Gino, Wen, Casssandra, Brodesky, Squid, Gez, Rakesh, Gecko, Ladan, Tony, Tatem, Squire, Falcon, BK, Crimp, Tiggs, Bacon, Coyot, Carmilla, Webb, Sea, Arch, Jillian, Jason, Bernard, Vogt, Peggy, dragon, Pup, xandix, Wallace, Bewest, Inoshiro, Rhett, AG, Aimee, Ghengis, Itiaes, Eli, Steffan, Epic, Grapes, Stone, Prep, Scobu, Robert, Alain, Carla, Vicky, Tia, Alec, Taras, Lisa, Oz, Ariane, Log, House, Kazu, Kim, Drofnas, Tyler, Campbell, Michele, Madeline, Nelly, Baron, Thor, Lori, Hele, Fredrik, Teddy, Pixie, Berry, Gabrielle, Alfonso, Brooke, Wolf, Ringo, Cru, Charlar, Rodvik, Gibson, Elise, Bagman, Greger, Leonidas, Jerm, Leslie, CB, Brenda, Durian, Carlo, mm, Zeeshan, Caleb, Max, Elikak, Mercille, Steph, Chase
+ </text_editor>
+ <text
+ follows="top|left"
+ height="10"
+ layout="topleft"
+ left="5"
+ name="contrib_intro"
+ top_pad="10"
+ width="435"
+ wrap="true">
+with open source contributions from:
+ </text>
+ <text_editor
+ enabled="false"
+ follows="top|left"
+ height="98"
+ bg_readonly_color="Transparent"
+ left="5"
+ text_color="LtGray"
+ max_length="65536"
+ name="contrib_names"
+ top_pad="10"
+ width="435"
+ word_wrap="true">
+Dummy Name replaced at run time
+ </text_editor>
+ <text
+ follows="top|left"
+ height="10"
+ layout="topleft"
+ left="5"
+ name="trans_intro"
+ top_pad="10"
+ width="435"
+ wrap="true">
+and translations from:
+ </text>
+ <text_editor
+ enabled="false"
+ follows="top|left"
+ height="98"
+ bg_readonly_color="Transparent"
+ left="5"
+ text_color="LtGray"
+ max_length="65536"
+ name="trans_names"
+ top_pad="10"
+ width="435"
+ word_wrap="true">
+Dummy Name replaced at run time
</text_editor>
</panel>
<panel
@@ -137,29 +196,35 @@ Thank you to the following Residents for helping to ensure that this is the best
top="5"
width="435"
word_wrap="true">
-3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion
-APR Copyright (C) 2000-2004 The Apache Software Foundation
-cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)
-DBus/dbus-glib Copyright (C) 2002, 2003 CodeFactory AB / Copyright (C) 2003, 2004 Red Hat, Inc.
-expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.
-FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org).
-GL Copyright (C) 1999-2004 Brian Paul.
-google-perftools Copyright (c) 2005, Google Inc.
-Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.
-jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)
-jpeglib Copyright (C) 1991-1998, Thomas G. Lane.
-ogg/vorbis Copyright (C) 2001, Xiphophorus
-OpenSSL Copyright (C) 1998-2002 The OpenSSL Project.
-Pth Copyright (C) 1999-2006 Ralf S. Engelschall &lt;rse@gnu.org&gt;
-SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
-SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
-xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
-zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler.
-google-perftools Copyright (c) 2005, Google Inc.
+ 3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion
+ APR Copyright (C) 2000-2004 The Apache Software Foundation
+ Collada DOM Copyright 2005 Sony Computer Entertainment Inc.
+ cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)
+ DBus/dbus-glib Copyright (C) 2002, 2003 CodeFactory AB / Copyright (C) 2003, 2004 Red Hat, Inc.
+ expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.
+ FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org).
+ GL Copyright (C) 1999-2004 Brian Paul.
+ GLOD Copyright (C) 2003-04 Jonathan Cohen, Nat Duca, Chris Niski, Johns Hopkins University and David Luebke, Brenden Schubert, University of Virginia.
+ google-perftools Copyright (c) 2005, Google Inc.
+ Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.
+ jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)
+ jpeglib Copyright (C) 1991-1998, Thomas G. Lane.
+ ogg/vorbis Copyright (C) 2001, Xiphophorus
+ OpenSSL Copyright (C) 1998-2002 The OpenSSL Project.
+ PCRE Copyright (c) 1997-2008 University of Cambridge
+ SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
+ SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+ xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
+ zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler.
+ google-perftools Copyright (c) 2005, Google Inc.
+
+ Second Life Viewer uses Havok (TM) Physics. (c)Copyright 1999-2010 Havok.com Inc. (and its Licensors). All Rights Reserved. See www.havok.com for details.
+
+ This software contains source code provided by NVIDIA Corporation.
-All rights reserved. See licenses.txt for details.
+ All rights reserved. See licenses.txt for details.
-Voice chat Audio coding: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
+ Voice chat Audio coding: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
</text_editor>
</panel>
</tab_container>
diff --git a/indra/newview/skins/default/xui/en/floater_about_land.xml b/indra/newview/skins/default/xui/en/floater_about_land.xml
index 3dd6c60095..fb123ec4d1 100644
--- a/indra/newview/skins/default/xui/en/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/en/floater_about_land.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
+ positioning="cascading"
can_tear_off="false"
height="420"
layout="topleft"
@@ -191,12 +192,12 @@
type="string"
length="1"
follows="left|top"
- height="20"
+ height="18"
layout="topleft"
left_pad="2"
valign="center"
name="ContentRatingText"
- top_delta="0"
+ top_delta="-2"
width="250">
Adult
</text>
@@ -208,7 +209,7 @@
layout="topleft"
left="10"
name="Owner:"
- top_pad="1"
+ top_pad="3"
width="100">
Owner:
</text>
@@ -220,9 +221,10 @@
layout="topleft"
left_pad="2"
name="OwnerText"
+ translate="false"
use_ellipses="true"
width="360">
- Leyla Linden
+ TestString PleaseIgnore
</text>
<button
follows="right"
@@ -260,8 +262,10 @@
left_pad="2"
layout="topleft"
name="GroupText"
+ translate="false"
width="240">
-Leyla Linden </text>
+ TestString PleaseIgnore
+ </text>
<button
follows="right"
height="23"
@@ -411,7 +415,7 @@ Leyla Linden </text>
right="-10"
name="Cancel Land Sale"
left_pad="5"
- top_pad="-15"
+ top_pad="7"
width="180" />
<text
type="string"
@@ -483,8 +487,9 @@ Leyla Linden </text>
name="DwellText"
top_delta="0"
width="186">
- 0
+ Loading...
</text>
+
<button
enabled="false"
follows="left|top"
@@ -492,9 +497,20 @@ Leyla Linden </text>
label="Buy Land"
layout="topleft"
left_delta="52"
+ top_pad="5"
name="Buy Land..."
- top_pad="7"
width="130" />
+ <button
+ enabled="false"
+ follows="left|top"
+ height="23"
+ label="Linden Sale"
+ layout="topleft"
+ left="10"
+ name="Linden Sale..."
+ tool_tip="Land must be owned, set content, and not already for auction."
+ top_pad="-23"
+ width="150" />
<button
enabled="true"
follows="left|top"
@@ -542,18 +558,7 @@ Leyla Linden </text>
layout="topleft"
left_delta="0"
name="Reclaim Land..."
- top_delta="-50"
- width="180" />
- <button
- enabled="false"
- follows="left|top"
- height="23"
- label="Linden Sale"
- layout="topleft"
- left_delta="0"
- name="Linden Sale..."
- tool_tip="Land must be owned, set content, and not already for auction."
- top_pad="2"
+ top_delta="-25"
width="180" />
</panel>
<panel
@@ -731,7 +736,7 @@ Leyla Linden </text>
height="16"
layout="topleft"
left_pad="10"
- top_delta="-3"
+ top_delta="-1"
mouse_opaque="false"
name="region_maturity_text"
valign="center"
@@ -830,7 +835,7 @@ Leyla Linden </text>
name="Simulator primitive usage:"
top_pad="4"
width="364">
- Primitive usage:
+ Region capacity:
</text>
<text
type="string"
@@ -854,7 +859,7 @@ Leyla Linden </text>
name="Primitives parcel supports:"
top="44"
width="152">
- Prims parcel supports:
+ Parcel land capacity:
</text>
<text
type="string"
@@ -878,7 +883,7 @@ Leyla Linden </text>
name="Primitives on parcel:"
top="64"
width="152">
- Prims on parcel:
+ Parcel land impact:
</text>
<text
type="string"
@@ -1205,7 +1210,7 @@ Only large parcels can be listed in search.
type="string"
length="1"
follows="left|top"
- text_color="white"
+ text_color="White"
height="16"
layout="topleft"
left="10"
@@ -1214,30 +1219,33 @@ Only large parcels can be listed in search.
width="278">
Allow other Residents to:
</text>
- <check_box
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="20"
+ name="allow_label0"
+ width="150">
+ Fly:
+ </text>
+
+ <check_box
height="16"
- label="Edit Terrain"
- layout="topleft"
- left="14"
- name="edit land check"
- tool_tip="If checked, anyone can terraform your land. It is best to leave this unchecked, as you can always edit your own land."
- top_pad="4"
- width="147i" />
- <check_box
- height="16"
- label="Fly"
+ label="Everyone"
layout="topleft"
name="check fly"
tool_tip="If checked, Residents can fly on your land. If unchecked, they can only fly into and over your land."
- left_pad="4"
- width="150" />
+ left_pad="2"
+ width="130" />
<text
type="string"
length="1"
follows="left|top"
height="16"
layout="topleft"
- left="14"
+ left="20"
name="allow_label2"
width="150">
Build:
@@ -1262,7 +1270,7 @@ Only large parcels can be listed in search.
follows="left|top"
height="16"
layout="topleft"
- left="14"
+ left="20"
name="allow_label3"
width="150">
Object Entry:
@@ -1289,7 +1297,7 @@ Only large parcels can be listed in search.
follows="left|top"
height="16"
layout="topleft"
- left="14"
+ left="20"
name="allow_label4"
width="150">
Run Scripts:
@@ -1310,49 +1318,47 @@ Only large parcels can be listed in search.
name="check group scripts"
top_delta="0"
width="70" />
- <text
- type="string"
- text_color="white"
- length="1"
- follows="left|top"
- height="16"
- layout="topleft"
- left="10"
- name="land_options_label"
- width="278">
- Land Options:
- </text>
- <check_box
+ <panel
+ bevel_style="none"
+ border="true"
+ top="146"
+ bottom="146"
+ follows="left|bottom|right"
+ left="20"
+ right="-20"/>
+ <check_box
height="16"
label="Safe (no damage)"
layout="topleft"
- left="14"
+ left="18"
name="check safe"
tool_tip="If checked, sets the land to Safe, disabling damage combat. If cleared, damage combat is enabled."
- top_pad="5"
+ top="130"
width="200" />
<check_box
height="16"
label="No Pushing"
layout="topleft"
- left_pad="5"
+ left_pad="35"
name="PushRestrictCheck"
tool_tip="Prevents scripts from pushing. Checking this option may be useful for preventing disruptive behavior on your land."
- top_delta="0"
+ top="130"
width="119" />
<check_box
height="16"
label="Show Place in Search (L$30/week)"
layout="topleft"
- left="14"
+ left="18"
name="ShowDirectoryCheck"
tool_tip="Let people see this parcel in search results"
+ top="150"
width="430" />
<combo_box
enabled="false"
height="23"
layout="topleft"
- left="30"
+ left="20"
+ top="194"
name="land category with adult"
visible="false"
width="140">
@@ -1405,6 +1411,10 @@ Only large parcels can be listed in search.
name="item11"
value="shopping" />
<combo_box.item
+ label="Rental"
+ name="item13"
+ value="rental" />
+ <combo_box.item
label="Other"
name="item12"
value="other" />
@@ -1413,7 +1423,8 @@ Only large parcels can be listed in search.
enabled="false"
height="23"
layout="topleft"
- left="30"
+ left="20"
+ top="194"
name="land category"
visible="false"
width="140">
@@ -1462,6 +1473,10 @@ Only large parcels can be listed in search.
name="item11"
value="shopping" />
<combo_box.item
+ label="Rental"
+ name="item13"
+ value="rental" />
+ <combo_box.item
label="Other"
name="item12"
value="other" />
@@ -1470,11 +1485,11 @@ Only large parcels can be listed in search.
height="16"
label="Moderate Content"
layout="topleft"
- left="14"
+ left="18"
name="MatureCheck"
- top="177"
+ top="170"
label_text.valign="center"
- label_text.v_pad="-5"
+ label_text.v_pad="-1"
tool_tip=" "
width="200" />
<text
@@ -1483,18 +1498,19 @@ Only large parcels can be listed in search.
follows="left|top"
height="16"
layout="topleft"
- left="10"
+ left="20"
name="Snapshot:"
- text_color="white"
- top="220"
+ text_color="White"
+ top="225"
width="200">
Snapshot:
</text>
<texture_picker
follows="left|top"
+ top_pad="0"
height="150"
layout="topleft"
- left="14"
+ left="20"
name="snapshot_ctrl"
fallback_image="default_land_picture.j2c"
tool_tip="Click to choose a picture"
@@ -1503,11 +1519,34 @@ Only large parcels can be listed in search.
type="string"
length="1"
follows="left|top"
+ text_color="LtGray"
+ height="32"
+ layout="topleft"
+ left="274"
+ top="150"
+ name="allow_label5"
+ width="205"
+ wrap="true">
+ Avatars on other parcels can see and chat with avatars on this parcel
+ </text>
+ <check_box
+ height="16"
+ follows="top"
+ layout="topleft"
+ left="253"
+ top="150"
+ name="SeeAvatarsCheck"
+ tool_tip="Allows avatars on other parcels to see and chat with avatars on this parcel, and you to see and chat with them."
+ width="10" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
height="16"
layout="topleft"
- left="220"
- top="180"
- text_color="white"
+ left="255"
+ top="282"
+ text_color="White"
name="landing_point"
word_wrap="true"
width="200">
@@ -1515,12 +1554,13 @@ Only large parcels can be listed in search.
</text>
<button
follows="right|top"
+ top_pad="0"
height="23"
label="Set"
label_selected="Set"
layout="topleft"
name="Set"
- right="-68"
+ left="255"
tool_tip="Sets the landing point where visitors arrive. Sets to your avatar&apos;s location inside this parcel."
width="50" />
<button
@@ -1532,16 +1572,15 @@ Only large parcels can be listed in search.
left_pad="5"
name="Clear"
tool_tip="Clear the landing point"
- right="-10"
width="55" />
<text
type="string"
length="1"
- text_color="white"
+ text_color="White"
follows="left|top"
height="16"
layout="topleft"
- left="220"
+ left="255"
top_pad="10"
name="Teleport Routing: "
width="200">
@@ -1551,7 +1590,7 @@ Only large parcels can be listed in search.
height="23"
layout="topleft"
name="landing type"
- top_pad="3"
+ top_pad="0"
tool_tip="Teleport Routing -- select how to handle teleports onto your land"
width="120">
<combo_box.item
@@ -1638,16 +1677,6 @@ Only large parcels can be listed in search.
name="set_media_url"
width="70"
top_delta="0"/>
- <check_box
- follows="top|left"
- height="16"
- label="Hide URL"
- layout="topleft"
- left="110"
- name="hide_media_url"
- tool_tip="Checking this option will hide the media url to any non-authorized viewers of this parcel information. Note this is not available for HTML types."
- width="50"
- top_pad="5"/>
<text
type="string"
length="1"
@@ -1825,15 +1854,6 @@ Only large parcels can be listed in search.
top_delta="0"
right="-15"
select_on_focus="true" />
- <check_box
- height="16"
- label="Hide URL"
- layout="topleft"
- name="hide_music_url"
- tool_tip="Checking this option will hide the music url to any non-authorized viewers of this parcel information."
- left_delta="10"
- top_pad="5"
- width="292" />
<text
type="string"
length="1"
@@ -1853,6 +1873,34 @@ Only large parcels can be listed in search.
name="check sound local"
left_pad="0"
width="292" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="Avatar Sounds:"
+ top_pad="10"
+ width="100">
+ Avatar Sounds:
+ </text>
+ <check_box
+ height="16"
+ label="Everyone"
+ layout="topleft"
+ left_pad="0"
+ name="all av sound check"
+ top_delta="0"
+ width="130" />
+ <check_box
+ height="16"
+ label="Group"
+ layout="topleft"
+ left_pad="0"
+ name="group av sound check"
+ top_delta="0"
+ width="70" />
<text
type="string"
length="1"
@@ -1904,35 +1952,17 @@ Only large parcels can be listed in search.
(Defined by the Estate)
</panel.string>
<panel.string
- name="allow_public_access">
- Allow Public Access ([MATURITY])
- </panel.string>
- <panel.string
name="estate_override">
One or more of these options is set at the estate level
</panel.string>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="16"
- layout="topleft"
- left="10"
- name="Limit access to this parcel to:"
- text_color="White"
- top="10"
- width="400">
- Access To This Parcel
- </text>
<check_box
follows="top|left"
height="16"
layout="topleft"
- left_delta="0"
+ left="8"
name="public_access"
- top_pad="5"
- label_text.valign="center"
- label_text.v_pad="-7"
+ label="Allow Public Access (Unchecking this will create ban lines)"
+ top_pad="10"
width="278" />
<text
type="string"
@@ -1942,28 +1972,28 @@ Only large parcels can be listed in search.
layout="topleft"
left_delta="20"
name="Only Allow"
- top="49"
+ top="30"
width="325">
- Restrict Access to Residents verified by:
+ Allow access only to Residents who:
</text>
<check_box
follows="top|left"
height="16"
- label="Payment Information on File [ESTATE_PAYMENT_LIMIT]"
+ label="Have payment Information on File [ESTATE_PAYMENT_LIMIT]"
layout="topleft"
left_delta="0"
name="limit_payment"
- tool_tip="Ban unidentified Residents."
+ tool_tip="Residents must have payment information on file to access this parcel. See the [SUPPORT_SITE] for more information."
top_pad="4"
width="278" />
<check_box
follows="top|left"
height="16"
- label="Age Verification [ESTATE_AGE_LIMIT]"
+ label="Have been age-verified [ESTATE_AGE_LIMIT]"
layout="topleft"
left_delta="0"
name="limit_age_verified"
- tool_tip="Ban Residents who have not verified their age. See the [SUPPORT_SITE] for more information."
+ tool_tip="Residents must be age verified to access this parcel. See the [SUPPORT_SITE] for more information."
top_pad="4"
width="278" />
<check_box
@@ -1973,7 +2003,7 @@ Only large parcels can be listed in search.
left="8"
name="GroupCheck"
tool_tip="Set group in the General tab."
- top="109"
+ top="89"
width="278" />
<check_box
enabled="false"
@@ -2055,7 +2085,7 @@ Only large parcels can be listed in search.
column_padding="0"
follows="top|bottom"
heading_height="14"
- height="120"
+ height="125"
layout="topleft"
left="0"
multi_select="true"
@@ -2078,7 +2108,7 @@ Only large parcels can be listed in search.
layout="topleft"
left_pad="10"
name="remove_allowed"
- right="-1"
+ right="-10"
width="100" />
</panel>
<panel
@@ -2104,7 +2134,7 @@ Only large parcels can be listed in search.
column_padding="0"
follows="top|bottom"
heading_height="14"
- height="120"
+ height="125"
layout="topleft"
left="0"
multi_select="true"
@@ -2128,7 +2158,7 @@ Only large parcels can be listed in search.
layout="topleft"
left_pad="10"
name="remove_banned"
- right="-1"
+ right="-10"
width="100" />
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/floater_activeim.xml b/indra/newview/skins/default/xui/en/floater_activeim.xml
index 96fe0aa70c..b79c5d9a19 100644
--- a/indra/newview/skins/default/xui/en/floater_activeim.xml
+++ b/indra/newview/skins/default/xui/en/floater_activeim.xml
@@ -4,11 +4,8 @@
name="floater_activeim"
help_topic="floater_activeim"
title="ACTIVE IM"
- top="26"
- left="0"
height="22"
width="320"
- follows="right|bottom"
background_visible="true"
can_close="true"
can_dock="true"
diff --git a/indra/newview/skins/default/xui/en/floater_animation_anim_preview.xml b/indra/newview/skins/default/xui/en/floater_animation_anim_preview.xml
new file mode 100644
index 0000000000..b5538a511c
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_animation_anim_preview.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ legacy_header_height="18"
+ height="190"
+ layout="topleft"
+ name="Anim Preview"
+ help_topic="animation_anim_preview"
+ title="ANIMATION.ANIM"
+ width="300">
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left="10"
+ mouse_opaque="false"
+ name="name_label"
+ top="20"
+ width="275">
+ Name:
+ </text>
+ <line_editor
+ border_style="line"
+ border_thickness="1"
+ follows="left|top|right"
+ height="19"
+ layout="topleft"
+ left_delta="0"
+ max_length_bytes="63"
+ name="name_form"
+ top_pad="0"
+ width="280" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left_delta="0"
+ mouse_opaque="false"
+ name="description_label"
+ top_pad="10"
+ width="270">
+ Description:
+ </text>
+ <line_editor
+ border_style="line"
+ border_thickness="1"
+ follows="left|top|right"
+ height="19"
+ layout="topleft"
+ left_delta="0"
+ max_length_bytes="127"
+ name="description_form"
+ top_pad="0"
+ width="280" />
+ <button
+ follows="left|bottom"
+ height="22"
+ label="Upload (L$[AMOUNT])"
+ layout="topleft"
+ left="45"
+ name="ok_btn"
+ top_pad="60"
+ width="150" />
+ <button
+ follows="right|bottom"
+ height="22"
+ label="Cancel"
+ label_selected="Cancel"
+ layout="topleft"
+ name="cancel_btn"
+ left_pad="5"
+ width="90" />
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_animation_preview.xml b/indra/newview/skins/default/xui/en/floater_animation_bvh_preview.xml
index cb6b2f6ebc..cb6b2f6ebc 100644
--- a/indra/newview/skins/default/xui/en/floater_animation_preview.xml
+++ b/indra/newview/skins/default/xui/en/floater_animation_bvh_preview.xml
diff --git a/indra/newview/skins/default/xui/en/floater_avatar.xml b/indra/newview/skins/default/xui/en/floater_avatar.xml
new file mode 100644
index 0000000000..cd5cca02bd
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_avatar.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ positioning="cascading"
+ ignore_ui_scale="false"
+ legacy_header_height="225"
+ can_minimize="true"
+ can_close="true"
+ can_resize="true"
+ min_height="230"
+ min_width="515"
+ height="230"
+ layout="topleft"
+ name="Avatar"
+ single_instance="true"
+ help_topic="avatar"
+ save_rect="true"
+ save_visibility="true"
+ title="CHOOSE AN AVATAR"
+ width="700">
+ <web_browser
+ top="25"
+ height="200"
+ width="700"
+ follows="all"
+ name="avatar_picker_contents"
+ trusted_content="true"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_avatar_picker.xml b/indra/newview/skins/default/xui/en/floater_avatar_picker.xml
index a11946d352..1a55dc2e2c 100644
--- a/indra/newview/skins/default/xui/en/floater_avatar_picker.xml
+++ b/indra/newview/skins/default/xui/en/floater_avatar_picker.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
+ positioning="cascading"
legacy_header_height="18"
can_resize="true"
height="350"
diff --git a/indra/newview/skins/default/xui/en/floater_beacons.xml b/indra/newview/skins/default/xui/en/floater_beacons.xml
index 4fc2b698d8..3d29356b22 100644
--- a/indra/newview/skins/default/xui/en/floater_beacons.xml
+++ b/indra/newview/skins/default/xui/en/floater_beacons.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
legacy_header_height="18"
- height="225"
+ height="245"
layout="topleft"
name="beacons"
help_topic="beacons"
@@ -12,7 +12,7 @@
width="240">
<panel
follows="left|top|right|bottom"
- height="200"
+ height="240"
layout="topleft"
left="10"
name="beacons_panel"
@@ -133,6 +133,16 @@
<check_box.commit_callback
function="Beacons.UICheck" />
</check_box>
+ <check_box
+ control_name="moapbeacon"
+ height="16"
+ left="0"
+ label="Media sources"
+ layout="topleft"
+ name="moapbeacon" >
+ <check_box.commit_callback
+ function="Beacons.UICheck" />
+ </check_box>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_build_options.xml b/indra/newview/skins/default/xui/en/floater_build_options.xml
index 56230e912c..38428b36fc 100644
--- a/indra/newview/skins/default/xui/en/floater_build_options.xml
+++ b/indra/newview/skins/default/xui/en/floater_build_options.xml
@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
legacy_header_height="18"
- follows="right"
height="170"
layout="topleft"
name="build options floater"
@@ -14,15 +13,15 @@
follows="left|top"
height="23"
initial_value="1"
- label="Grid Units (meters)"
- label_width="160"
+ label="Units (meters)"
+ label_width="130"
layout="topleft"
left="10"
max_val="5"
min_val="0.01"
name="GridResolution"
- top="25"
- width="230" />
+ top_pad="30"
+ width="200" />
<spinner
control_name="GridDrawSize"
decimal_digits="1"
@@ -30,15 +29,15 @@
height="23"
increment="0.5"
initial_value="5"
- label="Grid Extents (meters)"
- label_width="160"
+ label="Extents (meters)"
+ label_width="130"
layout="topleft"
left_delta="0"
max_val="50"
min_val="1"
name="GridDrawSize"
top_pad="0"
- width="230" />
+ width="200" />
<check_box
control_name="GridSubUnit"
height="16"
diff --git a/indra/newview/skins/default/xui/en/floater_buy_contents.xml b/indra/newview/skins/default/xui/en/floater_buy_contents.xml
index babbf0f5ca..ac96a70805 100644
--- a/indra/newview/skins/default/xui/en/floater_buy_contents.xml
+++ b/indra/newview/skins/default/xui/en/floater_buy_contents.xml
@@ -34,7 +34,7 @@
layout="topleft"
name="contains_text"
width="276">
- [NAME] contains:
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; contains:
</text>
<scroll_list
background_visible="true"
@@ -62,7 +62,7 @@
layout="topleft"
left="10"
name="buy_text"
- text_color="white"
+ text_color="White"
top="220"
use_ellipses="true"
width="260">
diff --git a/indra/newview/skins/default/xui/en/floater_buy_currency.xml b/indra/newview/skins/default/xui/en/floater_buy_currency.xml
index cd5922a9a2..553c5d51d0 100644
--- a/indra/newview/skins/default/xui/en/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/en/floater_buy_currency.xml
@@ -20,6 +20,7 @@
left="0"
name="normal_background"
top="17"
+ use_draw_context_alpha="false"
width="350" />
<text
type="string"
@@ -214,7 +215,7 @@
<text
type="string"
length="1"
- text_color="0.7 0.7 0.7 0.5"
+ text_color="LtGray_50"
follows="top|left"
layout="topleft"
halign="right"
@@ -223,12 +224,12 @@
width="300"
height="30"
name="currency_links">
- [http://www.secondlife.com/my/account/payment_method_management.php payment method] | [http://www.secondlife.com/my/account/currency.php currency] | [http://www.secondlife.com/my/account/exchange_rates.php exchange rate]
+ [http://www.secondlife.com/my/account/payment_method_management.php payment method] | [http://www.secondlife.com/my/account/currency.php currency]
</text>
<text
type="string"
length="1"
- text_color="0.7 0.7 0.7 0.5"
+ text_color="LtGray_50"
follows="top|left"
layout="topleft"
halign="right"
@@ -242,21 +243,21 @@ Re-enter amount to see the latest exchange rate.
<text
type="string"
length="1"
- text_color="0.7 0.7 0.7 0.5"
+ text_color="LtGray_50"
follows="top|left"
layout="topleft"
halign="right"
- top="213"
+ top="208"
left="10"
width="310"
- height="30"
+ height="35"
name="purchase_warning_repurchase">
Confirming this purchase only buys L$, not the object.
</text>
<text
type="string"
length="1"
- text_color="0.7 0.7 0.7 0.5"
+ text_color="LtGray_50"
follows="top|left"
layout="topleft"
halign="right"
@@ -292,12 +293,13 @@ Re-enter amount to see the latest exchange rate.
left="0"
name="error_background"
top="15"
+ use_draw_context_alpha="false"
width="350"/>
<text
type="string"
font="SansSerifHuge"
left="165"
- width="170"
+ width="360"
height="25"
top="25"
name="info_cannot_buy">
diff --git a/indra/newview/skins/default/xui/en/floater_buy_currency_html.xml b/indra/newview/skins/default/xui/en/floater_buy_currency_html.xml
index b9c415633f..0637eedfb2 100644
--- a/indra/newview/skins/default/xui/en/floater_buy_currency_html.xml
+++ b/indra/newview/skins/default/xui/en/floater_buy_currency_html.xml
@@ -23,6 +23,5 @@
right="-1"
top="1"
bottom="-1"
- ignore_ui_scale="false"
name="browser"/>
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_buy_land.xml b/indra/newview/skins/default/xui/en/floater_buy_land.xml
index d5d4565ca1..22cc058e46 100644
--- a/indra/newview/skins/default/xui/en/floater_buy_land.xml
+++ b/indra/newview/skins/default/xui/en/floater_buy_land.xml
@@ -204,11 +204,11 @@ supports [AMOUNT2] objects
follows="left|top"
height="14"
layout="topleft"
- left_delta="110"
+ left_delta="125"
name="region_name_text"
top_delta="0"
use_ellipses="true"
- width="155">
+ width="150">
(unknown)
</text>
<icon
@@ -237,10 +237,11 @@ supports [AMOUNT2] objects
follows="left|top"
height="14"
layout="topleft"
- left_delta="110"
+ left_delta="125"
name="region_type_text"
top_delta="0"
- width="175">
+ use_ellipses="true"
+ width="170">
(unknown)
</text>
<text
@@ -262,10 +263,11 @@ supports [AMOUNT2] objects
follows="left|top"
height="14"
layout="topleft"
- left_delta="110"
+ left_delta="125"
name="estate_name_text"
top_delta="0"
- width="175">
+ use_ellipses="true"
+ width="170">
(unknown)
</text>
<text
@@ -276,8 +278,8 @@ supports [AMOUNT2] objects
layout="topleft"
left="440"
name="estate_owner_label"
- right="550"
- width="100"
+ right="565"
+ width="120"
word_wrap="true">
Estate Owner:
</text>
@@ -287,10 +289,11 @@ supports [AMOUNT2] objects
follows="left|top"
height="20"
layout="topleft"
- left_delta="110"
+ left_delta="125"
name="estate_owner_text"
top_delta="0"
- width="175">
+ use_ellipses="true"
+ width="170">
(unknown)
</text>
<text
@@ -348,11 +351,10 @@ supports [AMOUNT2] objects
follows="left|top"
height="12"
layout="topleft"
- left="500"
name="covenant_timestamp_text"
- right="725"
+ right="-15"
top="175"
- width="275"
+ width="281"
word_wrap="true" />
<text_editor
type="string"
diff --git a/indra/newview/skins/default/xui/en/floater_buy_object.xml b/indra/newview/skins/default/xui/en/floater_buy_object.xml
index 8dfb6ba00c..5fdd4aa49d 100644
--- a/indra/newview/skins/default/xui/en/floater_buy_object.xml
+++ b/indra/newview/skins/default/xui/en/floater_buy_object.xml
@@ -89,7 +89,7 @@
left_delta="0"
line_spacing.pixels="7"
name="buy_text"
- text_color="white"
+ text_color="White"
top_pad="5"
use_ellipses="true"
width="260"
@@ -106,7 +106,7 @@ Buy for L$[AMOUNT] from:
left_delta="0"
line_spacing.pixels="7"
name="buy_name_text"
- text_color="white"
+ text_color="White"
top_pad="5"
use_ellipses="true"
width="260">
diff --git a/indra/newview/skins/default/xui/en/floater_camera.xml b/indra/newview/skins/default/xui/en/floater_camera.xml
index da2be18db6..22bc488a92 100644
--- a/indra/newview/skins/default/xui/en/floater_camera.xml
+++ b/indra/newview/skins/default/xui/en/floater_camera.xml
@@ -1,18 +1,21 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
+ positioning="specified"
+ left="458"
+ bottom="-80"
+ follows="left|bottom"
legacy_header_height="18"
- can_dock="true"
can_minimize="true"
- can_close="false"
- follows="bottom"
+ can_close="true"
height="164"
layout="topleft"
name="camera_floater"
help_topic="camera_floater"
- save_rect="true"
save_visibility="true"
- save_dock_state="true"
single_instance="true"
+ title="CAMERA CONTROLS"
+ chrome="true"
+ save_rect="true"
width="228">
<floater.string
name="rotate_tooltip">
@@ -27,18 +30,6 @@
Move Camera Up and Down, Left and Right
</floater.string>
<floater.string
- name="camera_modes_title">
- Camera modes
- </floater.string>
- <floater.string
- name="pan_mode_title">
- Orbit Zoom Pan
- </floater.string>
- <floater.string
- name="presets_mode_title">
- Preset Views
- </floater.string>
- <floater.string
name="free_mode_title">
View Object
</floater.string>
@@ -164,14 +155,10 @@
<joystick_rotate
follows="top|left"
height="78"
- image_selected="Cam_Rotate_In"
- image_unselected="Cam_Rotate_Out"
layout="topleft"
left="7"
- mouse_opaque="false"
name="cam_rotate_stick"
quadrant="left"
- scale_image="false"
sound_flags="3"
visible="true"
tool_tip="Orbit camera around focus"
diff --git a/indra/newview/skins/default/xui/en/floater_chat_bar.xml b/indra/newview/skins/default/xui/en/floater_chat_bar.xml
new file mode 100644
index 0000000000..688a01ce7b
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_chat_bar.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ positioning="specified"
+ left="10"
+ bottom="-10"
+ height="60"
+ layout="topleft"
+ legacy_header_height="25"
+ single_instance="true"
+ title="NEARBY CHAT"
+ save_rect="true"
+ save_visibility="true"
+ can_close="true"
+ can_minimize="true"
+ help_topic="chat_bar"
+ min_height="60"
+ min_width="150"
+ can_resize="true"
+ default_tab_group="1"
+ name="chat_bar"
+ width="300">
+ <panel
+ top="20"
+ class="panel_nearby_chat"
+ follow="all"
+ width="300"
+ height="0"
+ visible="false"
+ filename="panel_nearby_chat.xml"
+ name="nearby_chat" />
+ <panel width="300"
+ height="31"
+ left="0"
+ name="bottom_panel"
+ bottom="-1"
+ follows="left|right|bottom"
+ tab_group="1">
+ <line_editor
+ border_style="line"
+ border_thickness="1"
+ follows="left|right"
+ height="23"
+ label="Click here to chat."
+ layout="topleft"
+ left_delta="7"
+ left="0"
+ max_length_bytes="1023"
+ name="chat_box"
+ text_pad_left="5"
+ text_pad_right="25"
+ tool_tip="Press Enter to say, Ctrl+Enter to shout"
+ top="2"
+ width="255" />
+ <output_monitor
+ auto_update="true"
+ follows="right"
+ draw_border="false"
+ height="16"
+ layout="topleft"
+ left_pad="-24"
+ mouse_opaque="true"
+ name="chat_zone_indicator"
+ top="6"
+ visible="true"
+ width="20" />
+ <button
+ follows="right"
+ is_toggle="true"
+ width="20"
+ top="2"
+ layout="topleft"
+ left_pad="12"
+ image_disabled="ComboButton_UpOff"
+ image_unselected="ComboButton_UpOff"
+ image_selected="ComboButton_On"
+ image_pressed="ComboButton_UpSelected"
+ image_pressed_selected="ComboButton_Selected"
+ height="23"
+ chrome="true"
+ name="show_nearby_chat"
+ tool_tip="Shows/hides nearby chat log">
+ </button>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_choose_group.xml b/indra/newview/skins/default/xui/en/floater_choose_group.xml
index dc1ee5f24e..2cf6e682fd 100644
--- a/indra/newview/skins/default/xui/en/floater_choose_group.xml
+++ b/indra/newview/skins/default/xui/en/floater_choose_group.xml
@@ -20,7 +20,7 @@
Choose a group:
</text>
<scroll_list
- height="160"
+ height="165"
layout="topleft"
left_delta="0"
name="group list"
diff --git a/indra/newview/skins/default/xui/en/floater_color_picker.xml b/indra/newview/skins/default/xui/en/floater_color_picker.xml
index 421f3a72c6..e06d10606a 100644
--- a/indra/newview/skins/default/xui/en/floater_color_picker.xml
+++ b/indra/newview/skins/default/xui/en/floater_color_picker.xml
@@ -2,7 +2,6 @@
<floater
legacy_header_height="18"
can_minimize="false"
- follows="left|top"
height="380"
layout="topleft"
name="ColorPicker"
diff --git a/indra/newview/skins/default/xui/en/floater_critical.xml b/indra/newview/skins/default/xui/en/floater_critical.xml
index 05c958e051..143bcb4430 100644
--- a/indra/newview/skins/default/xui/en/floater_critical.xml
+++ b/indra/newview/skins/default/xui/en/floater_critical.xml
@@ -6,7 +6,7 @@
height="500"
layout="topleft"
name="modal container"
- open_centered="true"
+ positioning="centered"
width="600">
<button
height="20"
diff --git a/indra/newview/skins/default/xui/en/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/en/floater_day_cycle_options.xml
deleted file mode 100644
index 65e2462ef8..0000000000
--- a/indra/newview/skins/default/xui/en/floater_day_cycle_options.xml
+++ /dev/null
@@ -1,558 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater
- legacy_header_height="18"
- height="275"
- layout="topleft"
- name="Day Cycle Floater"
- help_topic="day_cycle_floater"
- save_rect="true"
- title="DAY CYCLE EDITOR"
- width="658">
- <tab_container
- follows="left|top"
- height="255"
- layout="topleft"
- left="0"
- name="Day Cycle Tabs"
- tab_position="top"
- top="20"
- width="656">
- <panel
- border="true"
- follows="left|top|right|bottom"
- height="255"
- label="Day Cycle"
- layout="topleft"
- left="1"
- mouse_opaque="false"
- name="Day Cycle"
- top="0"
- width="654">
- <multi_slider
- can_edit_text="true"
- control_name="WLTimeSlider"
- decimal_digits="0"
- draw_track="false"
- follows="bottom"
- height="10"
- increment="0.0833333"
- initial_value="0"
- layout="topleft"
- left="20"
- max_sliders="20"
- max_val="24"
- name="WLTimeSlider"
- show_text="false"
- top="25"
- use_triangle="true"
- width="525" />
- <multi_slider
- can_edit_text="true"
- control_name="WLDayCycleKeys"
- decimal_digits="0"
- follows="bottom"
- height="10"
- increment="0.0833333"
- initial_value="0"
- layout="topleft"
- left_delta="0"
- max_sliders="20"
- max_val="24"
- name="WLDayCycleKeys"
- show_text="false"
- top_pad="15"
- width="525" />
- <text
- type="string"
- length="1"
- border_visible="true"
- follows="left|top|right"
- height="16"
- layout="topleft"
- left="8"
- name="WL12am"
- top="74"
- width="55">
- 12am
- </text>
- <text
- type="string"
- length="1"
- border_visible="true"
- follows="left|top|right"
- height="16"
- layout="topleft"
- left_pad="10"
- name="WL3am"
- top_delta="0"
- width="55">
- 3am
- </text>
- <text
- type="string"
- length="1"
- border_visible="true"
- follows="left|top|right"
- height="16"
- layout="topleft"
- left_pad="10"
- name="WL6am"
- top_delta="0"
- width="55">
- 6am
- </text>
- <text
- type="string"
- length="1"
- border_visible="true"
- follows="left|top|right"
- height="16"
- layout="topleft"
- left_pad="10"
- name="WL9amHash"
- top_delta="0"
- width="55">
- 9am
- </text>
- <text
- type="string"
- length="1"
- border_visible="true"
- follows="left|top|right"
- height="16"
- layout="topleft"
- left_pad="10"
- name="WL12pmHash"
- top_delta="0"
- width="55">
- 12pm
- </text>
- <text
- type="string"
- length="1"
- border_visible="true"
- follows="left|top|right"
- height="16"
- layout="topleft"
- left_pad="10"
- name="WL3pm"
- top_delta="0"
- width="55">
- 3pm
- </text>
- <text
- type="string"
- length="1"
- border_visible="true"
- follows="left|top|right"
- height="16"
- layout="topleft"
- left_pad="10"
- name="WL6pm"
- top_delta="0"
- width="55">
- 6pm
- </text>
- <text
- type="string"
- length="1"
- border_visible="true"
- follows="left|top|right"
- height="16"
- layout="topleft"
- left_pad="10"
- name="WL9pm"
- top_delta="0"
- width="55">
- 9pm
- </text>
- <text
- type="string"
- length="1"
- border_visible="true"
- follows="left|top|right"
- height="16"
- layout="topleft"
- left_pad="10"
- name="WL12am2"
- top_delta="0"
- width="55">
- 12am
- </text>
- <text
- type="string"
- length="1"
- border_visible="true"
- follows="left|top|right"
- font="SansSerif"
- height="14"
- layout="topleft"
- left="20"
- name="WL12amHash"
- top="54"
- width="6">
- |
- </text>
- <text
- type="string"
- length="1"
- border_visible="true"
- follows="left|top|right"
- font="SansSerif"
- height="11"
- layout="topleft"
- left_pad="59"
- name="WL3amHash"
- top_delta="3"
- width="6">
- I
- </text>
- <text
- type="string"
- length="1"
- border_visible="true"
- follows="left|top|right"
- font="SansSerif"
- height="14"
- layout="topleft"
- left_pad="59"
- name="WL6amHash"
- top_delta="-3"
- width="6">
- |
- </text>
- <text
- type="string"
- length="1"
- border_visible="true"
- follows="left|top|right"
- font="SansSerif"
- height="11"
- layout="topleft"
- left_pad="59"
- name="WL9amHash2"
- top_delta="3"
- width="6">
- I
- </text>
- <text
- type="string"
- length="1"
- border_visible="true"
- follows="left|top|right"
- font="SansSerif"
- height="14"
- layout="topleft"
- left_pad="59"
- name="WL12pmHash2"
- top_delta="-3"
- width="6">
- |
- </text>
- <text
- type="string"
- length="1"
- border_visible="true"
- follows="left|top|right"
- font="SansSerif"
- height="11"
- layout="topleft"
- left_pad="59"
- name="WL3pmHash"
- top_delta="3"
- width="6">
- I
- </text>
- <text
- type="string"
- length="1"
- border_visible="true"
- follows="left|top|right"
- font="SansSerif"
- height="14"
- layout="topleft"
- left_pad="59"
- name="WL6pmHash"
- top_delta="-3"
- width="6">
- |
- </text>
- <text
- type="string"
- length="1"
- border_visible="true"
- follows="left|top|right"
- font="SansSerif"
- height="11"
- layout="topleft"
- left_pad="59"
- name="WL9pmHash"
- top_delta="3"
- width="6">
- I
- </text>
- <text
- type="string"
- length="1"
- border_visible="true"
- follows="left|top|right"
- font="SansSerif"
- height="14"
- layout="topleft"
- left_pad="59"
- name="WL12amHash2"
- top_delta="-3"
- width="6">
- |
- </text>
- <button
- height="20"
- label="Add Key"
- label_selected="Add Key"
- layout="topleft"
- left="555"
- name="WLAddKey"
- top="30"
- width="96" />
- <button
- height="20"
- label="Delete Key"
- label_selected="Delete Key"
- layout="topleft"
- left_delta="0"
- name="WLDeleteKey"
- top_pad="5"
- width="96" />
- <text
- type="string"
- length="1"
- border_visible="true"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left="20"
- name="WLCurKeyFrameText"
- top="104"
- width="235">
- Key Frame Settings:
- </text>
- <text
- type="string"
- length="1"
- border_visible="true"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left="30"
- name="WLCurKeyTimeText"
- top="124"
- width="105">
- Key Time:
- </text>
- <spinner
- control_name="WLCurKeyHour"
- decimal_digits="0"
- follows="left|top"
- height="16"
- increment="1"
- initial_value="0"
- label="Hour"
- label_width="35"
- layout="topleft"
- left_delta="20"
- max_val="100"
- name="WLCurKeyHour"
- top_pad="4"
- width="74" />
- <spinner
- control_name="WLCurKeyMin"
- decimal_digits="0"
- follows="left|top"
- height="16"
- increment="5"
- initial_value="0"
- label="Min"
- label_width="45"
- layout="topleft"
- left_pad="5"
- max_val="55"
- name="WLCurKeyMin"
- top_delta="0"
- width="85" />
- <text
- type="string"
- length="1"
- border_visible="true"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left="30"
- name="WLCurKeyTimeText2"
- top="169"
- width="185">
- Key Preset:
- </text>
- <combo_box
- height="18"
- label="Preset"
- layout="topleft"
- left_delta="0"
- name="WLKeyPresets"
- top_pad="7"
- width="205" />
- <view_border
- bevel_style="none"
- follows="top|left"
- height="115"
- layout="topleft"
- left="12"
- top="101"
- width="240" />
- <text
- type="string"
- length="1"
- border_visible="true"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left_pad="15"
- name="DayCycleText"
- top="114"
- width="120">
- Snap:
- </text>
- <combo_box
- enabled="false"
- height="18"
- label="5 min"
- layout="topleft"
- left_delta="0"
- name="WLSnapOptions"
- top_pad="7"
- width="70" />
- <text
- type="string"
- length="1"
- border_visible="true"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left_delta="0"
- name="DayCycleText2"
- top_pad="17"
- width="120">
- Length of Cycle:
- </text>
- <spinner
- control_name="WLLengthOfDayHour"
- decimal_digits="0"
- follows="left|top"
- height="16"
- increment="1"
- initial_value="0"
- label="Hour"
- label_width="33"
- layout="topleft"
- left_delta="-3"
- max_val="100"
- name="WLLengthOfDayHour"
- top_pad="4"
- width="74" />
- <spinner
- control_name="WLLengthOfDayMin"
- decimal_digits="0"
- follows="left|top"
- height="16"
- increment="1"
- initial_value="0"
- label="Min"
- label_width="25"
- layout="topleft"
- left_pad="2"
- max_val="59"
- name="WLLengthOfDayMin"
- top_delta="0"
- width="65" />
- <spinner
- control_name="WLLengthOfDaySec"
- decimal_digits="0"
- follows="left|top"
- height="16"
- increment="1"
- initial_value="24"
- label="Sec"
- label_width="25"
- layout="topleft"
- left_pad="2"
- max_val="59"
- name="WLLengthOfDaySec"
- top_delta="0"
- width="65"/>
- <text
- type="string"
- halign="right"
- length="1"
- border_visible="true"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left_delta="-23"
- name="DayCycleText3"
- top="114"
- width="85">
- Preview :
- </text>
- <button
- height="20"
- label="Play"
- label_selected="Play"
- layout="topleft"
- left="480"
- name="WLAnimSky"
- top_pad="5"
- width="83" />
- <button
- height="20"
- label="Stop!"
- label_selected="Stop"
- layout="topleft"
- left_pad="4"
- name="WLStopAnimSky"
- top_delta="0"
- width="83" />
- <button
- height="20"
- label="Use Estate Time"
- label_selected="Go to Estate Time"
- layout="topleft"
- left="480"
- name="WLUseLindenTime"
- top_pad="9"
- width="170" />
- <button
- height="20"
- label="Save Test Day"
- label_selected="Save Test Day"
- layout="topleft"
- left_delta="0"
- name="WLSaveDayCycle"
- top_pad="9"
- width="170" />
- <button
- height="20"
- label="Load Test Day"
- label_selected="Load Test Day"
- layout="topleft"
- left_delta="0"
- name="WLLoadDayCycle"
- top_pad="3"
- width="170" />
- </panel>
- </tab_container>
-</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_delete_env_preset.xml b/indra/newview/skins/default/xui/en/floater_delete_env_preset.xml
new file mode 100644
index 0000000000..b5de4166f6
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_delete_env_preset.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<floater
+ legacy_header_height="18"
+ height="130"
+ help_topic=""
+ layout="topleft"
+ name="Delete Env Preset"
+ save_rect="true"
+ title="DELETE ENV PRESET"
+ width="550">
+
+ <string name="title_water">Delete Water Preset</string>
+ <string name="title_sky">Delete Sky Preset</string>
+ <string name="title_day_cycle">Delete Day Cycle</string>
+
+ <string name="label_water">Preset:</string>
+ <string name="label_sky">Preset:</string>
+ <string name="label_day_cycle">Day cycle:</string>
+
+ <string name="msg_confirm_deletion">Are you sure you want to delete the selected preset?</string>
+ <string name="msg_sky_is_referenced">Cannot remove a preset that is referenced by some day cycle(s).</string>
+
+ <string name="combo_label">-Select a preset-</string>
+
+ <text
+ follows="top|left|right"
+ font="SansSerif"
+ height="10"
+ layout="topleft"
+ left="50"
+ name="label"
+ top="60"
+ width="60">
+ Preset:
+ </text>
+ <combo_box
+ follows="top|left"
+ layout="topleft"
+ left_pad="10"
+ name="preset_combo"
+ top_delta="-5"
+ width="200"/>
+ <button
+ follows="bottom|right"
+ height="23"
+ label="Delete"
+ layout="topleft"
+ left_pad="15"
+ name="delete"
+ width="70"/>
+ <button
+ follows="bottom|right"
+ height="23"
+ label="Cancel"
+ layout="topleft"
+ left_pad="5"
+ name="cancel"
+ width="70"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_destinations.xml b/indra/newview/skins/default/xui/en/floater_destinations.xml
new file mode 100644
index 0000000000..39aa8e07bb
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_destinations.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ positioning="cascading"
+ ignore_ui_scale="false"
+ legacy_header_height="225"
+ can_minimize="true"
+ can_close="true"
+ user_resize="true"
+ can_resize="true"
+ min_height="230"
+ min_width="350"
+ height="230"
+ layout="topleft"
+ name="Destinations"
+ single_instance="true"
+ help_topic="destinations"
+ save_rect="true"
+ save_visibility="true"
+ title="DESTINATIONS"
+ width="840">
+ <web_browser
+ top="25"
+ height="200"
+ width="840"
+ follows="all"
+ name="destination_guide_contents"
+ trusted_content="true"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_edit_day_cycle.xml b/indra/newview/skins/default/xui/en/floater_edit_day_cycle.xml
new file mode 100644
index 0000000000..d9a3ad0c4b
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_edit_day_cycle.xml
@@ -0,0 +1,485 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ legacy_header_height="18"
+ height="381"
+ layout="topleft"
+ name="Edit Day cycle"
+ help_topic="day_presets"
+ save_rect="true"
+ title="Edit Day Cycle"
+ width="705">
+
+ <string name="title_new">Create a New Day Cycle</string>
+ <string name="title_edit">Edit Day Cycle</string>
+ <string name="hint_new">Name your day cycle, adjust the controls to create it, and click "Save".</string>
+ <string name="hint_edit">To edit your day cycle, adjust the controls below and click "Save".</string>
+ <string name="combo_label">-Select a preset-</string>
+
+ <text
+ follows="top|left|right"
+ height="10"
+ layout="topleft"
+ left="10"
+ name="hint"
+ top="25"
+ width="685" />
+ <text
+ follows="top|left|right"
+ font="SansSerif"
+ height="10"
+ layout="topleft"
+ left="10"
+ name="label"
+ top_pad="25"
+ width="120">
+ Preset Name:
+ </text>
+ <combo_box
+ allow_text_entry="true"
+ follows="top|left"
+ layout="topleft"
+ left_pad="10"
+ max_chars="100"
+ name="day_cycle_combo"
+ top_delta="-5"
+ width="200" />
+ <line_editor
+ height="20"
+ left_delta="0"
+ name="day_cycle_name"
+ top_delta="0"
+ visible="true"
+ width="200" />
+ <text
+ follows="top|left|right"
+ height="95"
+ layout="topleft"
+ left_pad="10"
+ name="note"
+ top_delta="0"
+ width="345"
+ wrap="true">
+ Note: if you change the name of your preset, you will be creating a new preset and the existing preset will not be changed.
+ </text>
+ <!--======== Controls panel ========-->
+ <text
+ follows="left|top|right"
+ height="10"
+ layout="topleft"
+ left="10"
+ name="hint_item1"
+ top="100"
+ width="300">
+ - Click on a tab to edit the specific sky settings and time.
+ </text>
+ <text
+ follows="left|top|right"
+ height="10"
+ layout="topleft"
+ name="hint_item2"
+ top_pad="10"
+ width="300">
+ - Click and drag the tabs to set the transition times.
+ </text>
+ <text
+ follows="left|top|right"
+ height="10"
+ layout="topleft"
+ name="hint_item3"
+ top_pad="10"
+ width="300">
+ - Use the scrubber to preview your day cycle.
+ </text>
+ <panel
+ follows="top|left"
+ height="100"
+ name="day_cycle_slider_panel"
+ layout="topleft"
+ left_delta="25"
+ top_pad="15"
+ width="660">
+ <multi_slider
+ can_edit_text="true"
+ control_name="WLTimeSlider"
+ decimal_digits="0"
+ draw_track="false"
+ follows="bottom"
+ height="10"
+ increment="0.0833333"
+ initial_value="0"
+ layout="topleft"
+ left="20"
+ max_sliders="20"
+ max_val="24"
+ name="WLTimeSlider"
+ show_text="false"
+ top_pad="0"
+ use_triangle="true"
+ width="525" />
+ <multi_slider
+ can_edit_text="true"
+ control_name="WLDayCycleKeys"
+ decimal_digits="0"
+ follows="bottom"
+ height="10"
+ increment="0.0833333"
+ initial_value="0"
+ layout="topleft"
+ left_delta="0"
+ max_sliders="20"
+ max_val="24"
+ name="WLDayCycleKeys"
+ show_text="false"
+ top_pad="15"
+ width="525" />
+ <button
+ height="20"
+ label="Add Key"
+ label_selected="Add Key"
+ layout="topleft"
+ left_pad="20"
+ name="WLAddKey"
+ top_delta="-18"
+ width="96" />
+ <button
+ height="20"
+ label="Delete Key"
+ label_selected="Delete Key"
+ layout="topleft"
+ name="WLDeleteKey"
+ top_pad="5"
+ width="96" />
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ height="16"
+ layout="topleft"
+ left="8"
+ name="WL12am"
+ top="74"
+ width="55">
+ 12am
+ </text>
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ height="16"
+ layout="topleft"
+ left_pad="10"
+ name="WL3am"
+ top_delta="0"
+ width="55">
+ 3am
+ </text>
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ height="16"
+ layout="topleft"
+ left_pad="10"
+ name="WL6am"
+ top_delta="0"
+ width="55">
+ 6am
+ </text>
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ height="16"
+ layout="topleft"
+ left_pad="10"
+ name="WL9amHash"
+ top_delta="0"
+ width="55">
+ 9am
+ </text>
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ height="16"
+ layout="topleft"
+ left_pad="10"
+ name="WL12pmHash"
+ top_delta="0"
+ width="55">
+ 12pm
+ </text>
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ height="16"
+ layout="topleft"
+ left_pad="10"
+ name="WL3pm"
+ top_delta="0"
+ width="55">
+ 3pm
+ </text>
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ height="16"
+ layout="topleft"
+ left_pad="10"
+ name="WL6pm"
+ top_delta="0"
+ width="55">
+ 6pm
+ </text>
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ height="16"
+ layout="topleft"
+ left_pad="10"
+ name="WL9pm"
+ top_delta="0"
+ width="55">
+ 9pm
+ </text>
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ height="16"
+ layout="topleft"
+ left_pad="10"
+ name="WL12am2"
+ top_delta="0"
+ width="55">
+ 12am
+ </text>
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ font="SansSerif"
+ height="14"
+ layout="topleft"
+ left="20"
+ name="WL12amHash"
+ top="54"
+ width="6">
+ |
+ </text>
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ font="SansSerif"
+ height="11"
+ layout="topleft"
+ left_pad="59"
+ name="WL3amHash"
+ top_delta="3"
+ width="6">
+ I
+ </text>
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ font="SansSerif"
+ height="14"
+ layout="topleft"
+ left_pad="59"
+ name="WL6amHash"
+ top_delta="-3"
+ width="6">
+ |
+ </text>
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ font="SansSerif"
+ height="11"
+ layout="topleft"
+ left_pad="59"
+ name="WL9amHash2"
+ top_delta="3"
+ width="6">
+ I
+ </text>
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ font="SansSerif"
+ height="14"
+ layout="topleft"
+ left_pad="59"
+ name="WL12pmHash2"
+ top_delta="-3"
+ width="6">
+ |
+ </text>
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ font="SansSerif"
+ height="11"
+ layout="topleft"
+ left_pad="59"
+ name="WL3pmHash"
+ top_delta="3"
+ width="6">
+ I
+ </text>
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ font="SansSerif"
+ height="14"
+ layout="topleft"
+ left_pad="59"
+ name="WL6pmHash"
+ top_delta="-3"
+ width="6">
+ |
+ </text>
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ font="SansSerif"
+ height="11"
+ layout="topleft"
+ left_pad="59"
+ name="WL9pmHash"
+ top_delta="3"
+ width="6">
+ I
+ </text>
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ font="SansSerif"
+ height="14"
+ layout="topleft"
+ left_pad="59"
+ name="WL12amHash2"
+ top_delta="-3"
+ width="6">
+ |
+ </text>
+ </panel>
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left_delta="192"
+ name="WLCurKeyPresetText"
+ top_pad="10"
+ width="80">
+ Sky Setting:
+ </text>
+ <combo_box
+ height="18"
+ label="Preset"
+ layout="topleft"
+ left_pad="5"
+ name="WLSkyPresets"
+ width="205" />
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left_delta="-40"
+ name="WLCurKeyTimeText"
+ top_pad="15"
+ width="35">
+ Time:
+ </text>
+ <time
+ follows="left|top"
+ height="16"
+ label_width="0"
+ layout="topleft"
+ left_pad="3"
+ name="time"
+ top_delta="-1"
+ value="6:00 AM"
+ width="75"/>
+ <view_border
+ bevel_style="none"
+ follows="top|left"
+ height="0"
+ layout="topleft"
+ left="10"
+ name="horiz_separator"
+ top_pad="20"
+ width="685"/>
+ <loading_indicator
+ height="23"
+ layout="topleft"
+ left="25"
+ name="progress_indicator"
+ top="350"
+ visible="false"
+ width="23" />
+ <check_box
+ follows="top|left"
+ height="10"
+ label="Make this my new day cycle"
+ layout="topleft"
+ left="310"
+ name="make_default_cb"
+ top_delta="13"
+ width="230"/>
+ <button
+ follows="bottom|right"
+ height="23"
+ label="Save"
+ layout="topleft"
+ left_pad="0"
+ name="save"
+ top_delta="-13"
+ width="70"/>
+ <button
+ follows="bottom|right"
+ height="23"
+ label="Cancel"
+ layout="topleft"
+ left_pad="15"
+ name="cancel"
+ top_delta="0"
+ width="70"/>
+ </floater>
diff --git a/indra/newview/skins/default/xui/en/floater_edit_sky_preset.xml b/indra/newview/skins/default/xui/en/floater_edit_sky_preset.xml
new file mode 100644
index 0000000000..56233d91ee
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_edit_sky_preset.xml
@@ -0,0 +1,953 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ legacy_header_height="18"
+ height="375"
+ layout="topleft"
+ name="Edit Sky Preset"
+ help_topic="sky_preset"
+ save_rect="true"
+ title="Edit Sky Preset"
+ width="840">
+
+ <string name="title_new">Create a New Sky Preset</string>
+ <string name="title_edit">Edit Sky Preset</string>
+ <string name="hint_new">Name your preset, adjust the controls to create it, and click "Save".</string>
+ <string name="hint_edit">To edit your sky preset, adjust the controls and click "Save".</string>
+ <string name="combo_label">-Select a preset-</string>
+
+ <text
+ follows="top|left|right"
+ height="10"
+ layout="topleft"
+ left="30"
+ name="hint"
+ top="25"
+ width="700">
+ To edit your preset, adjust the controls then click "Save"
+ </text>
+ <text
+ follows="top|left|right"
+ font="SansSerif"
+ height="10"
+ layout="topleft"
+ left="30"
+ name="label"
+ top_pad="25"
+ width="120">
+ Preset Name:
+ </text>
+ <combo_box
+ allow_text_entry="true"
+ follows="top|left"
+ layout="topleft"
+ left_pad="10"
+ max_chars="100"
+ name="sky_preset_combo"
+ top_delta="-5"
+ width="200"/>
+ <line_editor
+ height="20"
+ left_delta="0"
+ name="sky_preset_name"
+ top_delta="0"
+ width="200" />
+ <text
+ follows="top|left|right"
+ height="40"
+ layout="topleft"
+ left_pad="10"
+ name="note"
+ top_delta="0"
+ width="405"
+ wrap="true">
+ Note: if you change the name of your preset, you will be creating a new preset and the existing preset will not be changed.
+ </text>
+ <!--======== Controls panel ========-->
+ <view_border
+ bevel_style="none"
+ follows="top|left"
+ height="203"
+ layout="topleft"
+ left="25"
+ name="panel_water_preset"
+ top="122"
+ visible="true"
+ width="790"/>
+ <tab_container
+ follows="left|top"
+ height="225"
+ halign="center"
+ layout="topleft"
+ left="22"
+ name="WindLight Tabs"
+ tab_position="top"
+ top="101"
+ width="794">
+ <panel
+ border="true"
+ bevel_style="none"
+ follows="left|top|right|bottom"
+ height="196"
+ label="ATMOSPHERE"
+ layout="topleft"
+ left="1"
+ help_topic="sky_preset_atmosphere"
+ mouse_opaque="false"
+ name="Atmosphere"
+ top="60"
+ width="698">
+
+ <!--======== Tab Panel I. I conlumn of controls ========-->
+
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left="40"
+ name="BHText"
+ top="25"
+ width="200">
+ Blue Horizon
+ </text>
+ <color_swatch
+ can_apply_immediately="true"
+ follows="left|top"
+ height="37"
+ label_height="0"
+ layout="topleft"
+ left_delta="0"
+ name="WLBlueHorizon"
+ top_pad="6"
+ width="60" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left_delta="0"
+ top_pad="20"
+ name="BDensText"
+ width="200">
+ Haze Horizon
+ </text>
+ <slider
+ control_name="WLHazeHorizon"
+ decimal_digits="2"
+ follows="left|top"
+ height="10"
+ increment="0.01"
+ initial_value="0.25"
+ layout="topleft"
+ left_delta="0"
+ top_pad="6"
+ name="WLHazeHorizon"
+ width="200" />
+
+ <!--======== Tab Panel I. II conlumn of controls ========-->
+
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left_pad="55"
+ name="BDensText2"
+ top="25"
+ width="200">
+ Blue Density
+ </text>
+ <color_swatch
+ can_apply_immediately="true"
+ follows="left|top"
+ height="37"
+ label_height="0"
+ layout="topleft"
+ left_delta="0"
+ name="WLBlueDensity"
+ top_pad="6"
+ width="60" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left_delta="0"
+ name="HDText"
+ top_pad="20"
+ width="200">
+ Haze Density
+ </text>
+ <slider
+ control_name="WLHazeDensity"
+ decimal_digits="2"
+ follows="left|top"
+ height="10"
+ increment="0.01"
+ initial_value="0.7"
+ layout="topleft"
+ left_delta="0"
+ max_val="4"
+ name="WLHazeDensity"
+ top_pad="6"
+ width="200" />
+
+ <!--======== Tab Panel I. III conlumn of controls ========-->
+
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left_pad="55"
+ name="DensMultText"
+ top="25"
+ width="200">
+ Density Multiplier
+ </text>
+ <slider
+ control_name="WLDensityMult"
+ decimal_digits="2"
+ follows="left|top"
+ height="10"
+ increment="0.01"
+ initial_value="0.1"
+ layout="topleft"
+ left_delta="15"
+ max_val="0.9"
+ name="WLDensityMult"
+ top_pad="6"
+ width="200" />
+
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left_delta="-15"
+ name="WLDistanceMultText"
+ top_pad="20"
+ width="200">
+ Distance Multiplier
+ </text>
+ <slider
+ control_name="WLDistancMult"
+ decimal_digits="1"
+ follows="left|top"
+ height="10"
+ initial_value="1.0"
+ layout="topleft"
+ left_delta="15"
+ max_val="100"
+ name="WLDistanceMult"
+ top_pad="6"
+ width="200" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left_delta="-15"
+ name="MaxAltText"
+ top_pad="20"
+ width="200">
+ Max Altitude
+ </text>
+ <slider
+ control_name="WLMaxAltitude"
+ decimal_digits="0"
+ follows="left|top"
+ height="10"
+ increment="1"
+ initial_value="500"
+ layout="topleft"
+ left_delta="15"
+ max_val="4000"
+ name="WLMaxAltitude"
+ top_pad="6"
+ width="200" />
+ </panel>
+ <panel
+ border="true"
+ bevel_style="none"
+ follows="left|top|right|bottom"
+ height="196"
+ label="LIGHTING"
+ layout="topleft"
+ left_delta="0"
+ help_topic="sky_preset_lighting"
+ name="Lighting"
+ top_delta="4"
+ width="698">
+
+ <!--======== Tab Panel II. I conlumn of controls ========-->
+
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left="20"
+ name="SLCText"
+ top="25"
+ width="150">
+ Sun/Moon Color
+ </text>
+ <color_swatch
+ can_apply_immediately="true"
+ follows="left|top"
+ height="37"
+ label_height="0"
+ layout="topleft"
+ left_delta="10"
+ name="WLSunlight"
+ top_pad="6"
+ width="60" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left_delta="-10"
+ name="WLAmbientText"
+ top_pad="20"
+ width="150">
+ Ambient
+ </text>
+ <color_swatch
+ can_apply_immediately="true"
+ follows="left|top"
+ height="37"
+ label_height="0"
+ layout="topleft"
+ left_delta="10"
+ name="WLAmbient"
+ top_pad="6"
+ width="60" />
+
+ <!--======== Tab Panel II. II conlumn of controls ========-->
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left_pad="100"
+ name="SunGlowText"
+ top="25"
+ width="200">
+ Sun Glow
+ </text>
+ <slider
+ control_name="WLGlowB"
+ decimal_digits="2"
+ follows="left|top"
+ height="10"
+ increment="0.01"
+ initial_value="0.1"
+ label="Focus "
+ layout="topleft"
+ left_delta="10"
+ max_val="0.5"
+ name="WLGlowB"
+ top_pad="6"
+ width="200" />
+ <slider
+ control_name="WLGlowR"
+ decimal_digits="2"
+ follows="top|left"
+ height="10"
+ increment="0.01"
+ initial_value="0.25"
+ label="Size "
+ layout="topleft"
+ left_delta="0"
+ max_val="1.99"
+ min_val="1"
+ name="WLGlowR"
+ top_pad="6"
+ width="200" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left_delta="-10"
+ name="WLStarText"
+ top_pad="20"
+ width="200">
+ Star Brightness
+ </text>
+ <slider
+ control_name="WLStarAlpha"
+ decimal_digits="2"
+ follows="top|left"
+ height="10"
+ increment="0.01"
+ initial_value="0"
+ layout="topleft"
+ left_delta="10"
+ max_val="2"
+ name="WLStarAlpha"
+ top_pad="6"
+ width="200" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left_delta="-10"
+ name="SceneGammaText"
+ top_pad="20"
+ width="200">
+ Scene Gamma
+ </text>
+ <slider
+ control_name="WLGamma"
+ decimal_digits="2"
+ follows="top|left"
+ height="10"
+ increment="0.01"
+ initial_value="2.0"
+ layout="topleft"
+ left_delta="10"
+ max_val="10"
+ name="WLGamma"
+ top_pad="6"
+ width="200" />
+
+ <!--======== Tab Panel II. III conlumn of controls ========-->
+
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left_pad="60"
+ name="TODText"
+ top="25"
+ width="200">
+ Sun/Moon Position
+ </text>
+ <multi_slider
+ can_edit_text="true"
+ control_name="WLSunPos"
+ decimal_digits="0"
+ follows="bottom"
+ height="10"
+ increment="0.0833333"
+ initial_value="0"
+ layout="topleft"
+ left_delta="0"
+ max_sliders="1"
+ max_val="24"
+ name="WLSunPos"
+ show_text="false"
+ top_pad="0"
+ width="300" />
+
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ font="SansSerif"
+ height="14"
+ layout="topleft"
+ left_delta="2"
+ name="WL12amHash"
+ top_pad="6"
+ width="6">
+ |
+ </text>
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ font="SansSerif"
+ height="14"
+ layout="topleft"
+ left_pad="66"
+ name="WL6amHash"
+ top_delta="0"
+ width="6">
+ |
+ </text>
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ font="SansSerif"
+ height="14"
+ layout="topleft"
+ left_pad="67"
+ name="WL12pmHash2"
+ top_delta="0"
+ width="6">
+ |
+ </text>
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ font="SansSerif"
+ height="14"
+ layout="topleft"
+ left_pad="67"
+ name="WL6pmHash"
+ top_delta="0"
+ width="6">
+ |
+ </text>
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ font="SansSerif"
+ height="14"
+ layout="topleft"
+ left_pad="67"
+ name="WL12amHash2"
+ top_delta="0"
+ width="6">
+ |
+ </text>
+
+
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ height="16"
+ layout="topleft"
+ left_delta="-300"
+ name="WL12am"
+ top="74"
+ width="55">
+ 12am
+ </text>
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ height="16"
+ layout="topleft"
+ left_pad="20"
+ name="WL6am"
+ top_delta="0"
+ width="55">
+ 6am
+ </text>
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ height="16"
+ layout="topleft"
+ left_pad="15"
+ name="WL12pmHash"
+ top_delta="0"
+ width="55">
+ 12pm
+ </text>
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ height="16"
+ layout="topleft"
+ left_pad="18"
+ name="WL6pm"
+ top_delta="0"
+ width="55">
+ 6pm
+ </text>
+ <text
+ type="string"
+ length="1"
+ border_visible="true"
+ follows="left|top|right"
+ height="16"
+ layout="topleft"
+ left_pad="15"
+ name="WL12am2"
+ top_delta="0"
+ width="55">
+ 12am
+ </text>
+
+ <time
+ follows="left|top"
+ height="16"
+ label_width="0"
+ layout="topleft"
+ left_delta="-175"
+ name="WLDayTime"
+ top_pad="15"
+ value="6:00 AM"
+ width="75"/>
+
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left_delta="-106"
+ name="WLEastAngleText"
+ top_pad="24"
+ width="200">
+ East Angle
+ </text>
+ <slider
+ control_name="WLEastAngle"
+ decimal_digits="2"
+ follows="left|top"
+ height="10"
+ increment="0.01"
+ initial_value="0.0"
+ layout="topleft"
+ left_delta="10"
+ name="WLEastAngle"
+ top_pad="6"
+ width="200" />
+
+ </panel>
+ <panel
+ border="true"
+ bevel_style="none"
+ follows="left|top|right|bottom"
+ height="196"
+ label="CLOUDS"
+ layout="topleft"
+ left_delta="0"
+ mouse_opaque="false"
+ help_topic="sky_preset_clouds"
+ name="Clouds"
+ top_delta="4"
+ width="698">
+
+ <!--======== Tab Panel III. I conlumn of controls ========-->
+
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left="40"
+ name="WLCloudColorText"
+ top="25"
+ width="200">
+ Cloud Color
+ </text>
+ <color_swatch
+ can_apply_immediately="true"
+ follows="left|top"
+ height="37"
+ label_height="0"
+ layout="topleft"
+ left_delta="0"
+ name="WLCloudColor"
+ top_pad="6"
+ width="60" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left_delta="0"
+ name="WLCloudColorText2"
+ top_pad="20"
+ width="200">
+ Cloud XY/Density
+ </text>
+ <slider
+ control_name="WLCloudX"
+ decimal_digits="2"
+ follows="left|top"
+ height="10"
+ increment="0.01"
+ initial_value="0.5"
+ label="X"
+ layout="topleft"
+ left_delta="0"
+ top_pad="6"
+ name="WLCloudX"
+ width="200" />
+ <slider
+ control_name="WLCloudY"
+ decimal_digits="2"
+ follows="left|top"
+ height="10"
+ increment="0.01"
+ initial_value="0.5"
+ label="Y"
+ layout="topleft"
+ left_delta="0"
+ top_pad="6"
+ name="WLCloudY"
+ width="200" />
+ <slider
+ control_name="WLCloudDensity"
+ decimal_digits="2"
+ follows="left|top"
+ height="10"
+ increment="0.01"
+ initial_value="1.0"
+ label="D"
+ layout="topleft"
+ left_delta="0"
+ name="WLCloudDensity"
+ top_pad="6"
+ width="200" />
+
+ <!--======== Tab Panel III. II conlumn of controls ========-->
+
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left_pad="55"
+ name="WLCloudCoverageText"
+ top="15"
+ width="200">
+ Cloud Coverage
+ </text>
+ <slider
+ control_name="WLCloudCoverage"
+ decimal_digits="2"
+ follows="left|top"
+ height="10"
+ increment="0.01"
+ initial_value="0.5"
+ layout="topleft"
+ left_delta="15"
+ name="WLCloudCoverage"
+ top_pad="6"
+ width="200" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left_delta="-15"
+ name="WLCloudScaleText"
+ top_pad="20"
+ width="200">
+ Cloud Scale
+ </text>
+ <slider
+ control_name="WLCloudScale"
+ decimal_digits="2"
+ follows="left|top"
+ height="10"
+ increment="0.01"
+ initial_value="1.0"
+ layout="topleft"
+ left_delta="15"
+ min_val="0.01"
+ name="WLCloudScale"
+ top_pad="6"
+ width="200" />
+
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left_delta="-13"
+ name="WLCloudDetailText"
+ top_pad="20"
+ width="200">
+ Cloud Detail (XY/Density)
+ </text>
+ <slider
+ control_name="WLCloudDetailX"
+ decimal_digits="2"
+ follows="left|top"
+ height="10"
+ increment="0.01"
+ initial_value="0.5"
+ label="X"
+ layout="topleft"
+ left_delta="0"
+ top_pad="6"
+ name="WLCloudDetailX"
+ width="200" />
+ <slider
+ control_name="WLCloudDetailY"
+ decimal_digits="2"
+ follows="left|top"
+ height="10"
+ increment="0.01"
+ initial_value="0.5"
+ label="Y"
+ layout="topleft"
+ left_delta="0"
+ name="WLCloudDetailY"
+ top_pad="6"
+ width="200" />
+ <slider
+ control_name="WLCloudDetailDensity"
+ decimal_digits="2"
+ follows="left|top"
+ height="10"
+ increment="0.01"
+ initial_value="1.0"
+ label="D"
+ layout="topleft"
+ left_delta="0"
+ name="WLCloudDetailDensity"
+ top_pad="6"
+ width="200" />
+
+ <!--======== Tab Panel III. III conlumn of controls ========-->
+
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left_pad="55"
+ name="WLCloudScrollXText"
+ top="15"
+ width="150">
+ Cloud Scroll X
+ </text>
+ <check_box
+ control_name="WLCloudLockX"
+ follows="left|top"
+ height="16"
+ label="Lock"
+ layout="topleft"
+ left_delta="150"
+ name="WLCloudLockX"
+ top_delta="0"
+ width="200" />
+ <slider
+ control_name="WLCloudScrollX"
+ decimal_digits="2"
+ follows="left|top"
+ height="10"
+ increment="0.01"
+ initial_value="0.5"
+ layout="topleft"
+ left_delta="-135"
+ max_val="10"
+ min_val="-10"
+ name="WLCloudScrollX"
+ top_pad="6"
+ width="200" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left_delta="-15"
+ name="WLCloudScrollYText"
+ top_pad="20"
+ width="150">
+ Cloud Scroll Y
+ </text>
+ <check_box
+ control_name="WLCloudLockY"
+ follows="left|top"
+ height="16"
+ label="Lock"
+ layout="topleft"
+ left_delta="150"
+ name="WLCloudLockY"
+ width="200" />
+ <slider
+ control_name="WLCloudScrollY"
+ decimal_digits="2"
+ follows="left|top"
+ height="10"
+ increment="0.01"
+ initial_value="0.5"
+ layout="topleft"
+ left_delta="-135"
+ max_val="10"
+ min_val="-10"
+ name="WLCloudScrollY"
+ top_pad="6"
+ width="200" />
+ </panel>
+ </tab_container>
+<!--======== End of Controls panel ========-->
+
+ <check_box
+ follows="top|left"
+ height="10"
+ label="Make this preset my new sky setting"
+ layout="topleft"
+ left="380"
+ name="make_default_cb"
+ top_pad="30"
+ width="280"/>
+ <button
+ follows="bottom|right"
+ height="23"
+ label="Save"
+ layout="topleft"
+ left_pad="0"
+ name="save"
+ width="70"/>
+ <button
+ follows="bottom|right"
+ height="23"
+ label="Cancel"
+ layout="topleft"
+ left_pad="15"
+ name="cancel"
+ width="70"/>
+ </floater>
diff --git a/indra/newview/skins/default/xui/en/floater_edit_water_preset.xml b/indra/newview/skins/default/xui/en/floater_edit_water_preset.xml
new file mode 100644
index 0000000000..905983e7fa
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_edit_water_preset.xml
@@ -0,0 +1,448 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ legacy_header_height="18"
+ height="375"
+ layout="topleft"
+ name="Edit Water Preset"
+ help_topic="water_preset"
+ save_rect="true"
+ title="Edit Water Preset"
+ width="725">
+
+ <string name="title_new">Create a New Water Preset</string>
+ <string name="title_edit">Edit a Water Preset</string>
+ <string name="hint_new">Name your preset, adjust the controls to create it, and click "Save".</string>
+ <string name="hint_edit">To edit your water preset, adjust the controls and click "Save".</string>
+ <string name="combo_label">-Select a preset-</string>
+
+ <text
+ follows="top|left|right"
+ height="10"
+ layout="topleft"
+ left="30"
+ name="hint"
+ top="25"
+ width="680">
+ To edit your preset, adjust the controls then click "Save"
+ </text>
+
+ <text
+ follows="top|left|right"
+ font="SansSerif"
+ height="10"
+ layout="topleft"
+ left="30"
+ name="label"
+ top_pad="25"
+ width="120">
+ Preset Name:
+ </text>
+
+ <combo_box
+ allow_text_entry="true"
+ follows="top|left"
+ layout="topleft"
+ left_pad="10"
+ max_chars="100"
+ name="water_preset_combo"
+ top_delta="-5"
+ width="200"/>
+
+ <line_editor
+ height="20"
+ left_delta="0"
+ name="water_preset_name"
+ top_delta="0"
+ width="200" />
+
+ <text
+ follows="top|left|right"
+ height="40"
+ layout="topleft"
+ left_pad="10"
+ name="note"
+ top_delta="0"
+ width="340"
+ wrap="true">
+ Note: if you change the name of your preset, you will be creating a new preset and the existing preset will not be changed.
+ </text>
+
+ <!--======== Controls panel ========-->
+ <panel
+ border="false"
+ bevel_style="none"
+ follows="top|left"
+ height="230"
+ layout="topleft"
+ left="10"
+ name="panel_water_preset"
+ top="100"
+ width="700">
+
+<!--======== I conlumn of controls ========-->
+ <text
+ follows="left|top|right"
+ height="10"
+ font="SansSerif"
+ layout="topleft"
+ left="10"
+ name="water_color_label"
+ top="5"
+ width="215">
+ Water Fog Color
+ </text>
+ <color_swatch
+ can_apply_immediately="true"
+ follows="left|top"
+ height="37"
+ label_height="0"
+ layout="topleft"
+ left_delta="15"
+ name="WaterFogColor"
+ top_pad="8"
+ width="60" />
+
+
+ <text
+ follows="left|top|right"
+ font="SansSerif"
+ layout="topleft"
+ left_delta="-15"
+ top_pad="10"
+ name="water_fog_density_label"
+ width="215">
+ Fog Density Exponent
+ </text>
+ <slider
+ decimal_digits="1"
+ follows="left|top"
+ height="10"
+ initial_value="0"
+ layout="topleft"
+ left_delta="15"
+ max_val="10"
+ name="WaterFogDensity"
+ top_pad="10"
+ width="200"/>
+
+
+ <text
+ follows="left|top|right"
+ font="SansSerif"
+ layout="topleft"
+ left_delta="-15"
+ top_pad="15"
+ name="underwater_fog_modifier_label"
+ width="215">
+ Underwater Fog Modifier
+ </text>
+ <slider
+ decimal_digits="1"
+ follows="left|top"
+ height="10"
+ initial_value="0"
+ layout="topleft"
+ left_delta="15"
+ max_val="10"
+ name="WaterUnderWaterFogMod"
+ top_pad="10"
+ width="200"/>
+
+
+ <text
+ follows="left|top|right"
+ font="SansSerif"
+ layout="topleft"
+ left_delta="-15"
+ name="BHText"
+ top_pad="15"
+ width="215">
+ Big Wave Direction
+ </text>
+ <slider
+ control_name="WaterWave1DirX"
+ decimal_digits="2"
+ follows="left|top"
+ increment="0.01"
+ initial_value="0.7"
+ label="X"
+ layout="topleft"
+ max_val="4"
+ min_val="-4"
+ name="WaterWave1DirX"
+ top_pad="10"
+ width="216"/>
+ <slider
+ control_name="WaterWave1DirY"
+ decimal_digits="2"
+ follows="left|top"
+ increment="0.01"
+ initial_value="0.7"
+ label="Y"
+ layout="topleft"
+ max_val="4"
+ min_val="-4"
+ name="WaterWave1DirY"
+ top_pad="5"
+ width="216"/>
+
+<!--======== II conlumn of controls ========-->
+
+ <text
+ follows="left|top|right"
+ font="SansSerif"
+ height="10"
+ layout="topleft"
+ left_pad="20"
+ name="BDensText"
+ top="5"
+ width="215">
+ Reflection Wavelet Scale
+ </text>
+ <slider
+ control_name="WaterNormalScaleX"
+ decimal_digits="1"
+ follows="left|top"
+ initial_value="0.7"
+ layout="topleft"
+ left_delta="15"
+ max_val="10"
+ name="WaterNormalScaleX"
+ top_pad="10"
+ width="200"/>
+ <slider
+ control_name="WaterNormalScaleY"
+ decimal_digits="1"
+ follows="left|top"
+ initial_value="0.7"
+ layout="topleft"
+ max_val="10"
+ name="WaterNormalScaleY"
+ top_pad="6"
+ width="200"/>
+ <slider
+ control_name="WaterNormalScaleZ"
+ decimal_digits="1"
+ follows="left|top"
+ initial_value="0.7"
+ layout="topleft"
+ max_val="10"
+ name="WaterNormalScaleZ"
+ top_pad="6"
+ width="200"/>
+
+
+ <text
+ follows="left|top|right"
+ font="SansSerif"
+ layout="topleft"
+ left_delta="-15"
+ name="HDText"
+ top_pad="16"
+ width="215">
+ Fresnel Scale
+ </text>
+ <slider
+ control_name="WaterFresnelScale"
+ decimal_digits="2"
+ follows="left|top"
+ height="10"
+ increment="0.01"
+ initial_value="0.7"
+ layout="topleft"
+ left_delta="15"
+ name="WaterFresnelScale"
+ top_pad="10"
+ width="200"/>
+ <text
+ follows="left|top|right"
+ font="SansSerif"
+ layout="topleft"
+ left_delta="-15"
+ name="FresnelOffsetText"
+ top_pad="15"
+ width="215">
+ Fresnel Offset
+ </text>
+ <slider
+ control_name="WaterFresnelOffset"
+ decimal_digits="2"
+ follows="left"
+ increment="0.01"
+ initial_value="0.7"
+ layout="topleft"
+ left_delta="15"
+ name="WaterFresnelOffset"
+ top_pad="10"
+ width="200"/>
+
+
+ <text
+ follows="left|top|right"
+ font="SansSerif"
+ layout="topleft"
+ left_delta="-15"
+ name="BHText2"
+ top_pad="15"
+ width="215">
+ Little Wave Direction
+ </text>
+ <slider
+ control_name="WaterWave2DirX"
+ decimal_digits="2"
+ follows="left|top"
+ increment="0.01"
+ initial_value="0.7"
+ label="X"
+ layout="topleft"
+ max_val="4"
+ min_val="-4"
+ name="WaterWave2DirX"
+ top_pad="10"
+ width="216" />
+ <slider
+ control_name="WaterWave2DirY"
+ decimal_digits="2"
+ follows="left|top"
+ increment="0.01"
+ initial_value="0.7"
+ label="Y"
+ layout="topleft"
+ max_val="4"
+ min_val="-4"
+ name="WaterWave2DirY"
+ top_pad="6"
+ width="216" />
+
+<!--======== III conlumn of contorls ========-->
+
+ <text
+ follows="left|top|right"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left_pad="20"
+ name="DensMultText"
+ top="5"
+ width="215">
+ Refract Scale Above
+ </text>
+ <slider
+ control_name="WaterScaleAbove"
+ decimal_digits="2"
+ follows="left|top"
+ increment="0.01"
+ initial_value="0.1"
+ layout="topleft"
+ left_delta="15"
+ name="WaterScaleAbove"
+ top_pad="5"
+ width="200" />
+
+ <text
+ type="string"
+ length="1"
+ follows="left|top|right"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left_delta="-15"
+ name="WaterScaleBelowText"
+ top_pad="15"
+ width="215">
+ Refract Scale Below
+ </text>
+ <slider
+ control_name="WaterScaleBelow"
+ decimal_digits="2"
+ follows="left|top"
+ height="10"
+ increment="0.01"
+ initial_value="0"
+ layout="topleft"
+ left_delta="15"
+ name="WaterScaleBelow"
+ top_pad="5"
+ width="200"/>
+
+ <text
+ follows="left|top|right"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left_delta="-15"
+ name="MaxAltText"
+ top_pad="15"
+ width="215">
+ Blur Multiplier
+ </text>
+ <slider
+ control_name="WaterBlurMult"
+ follows="left|top"
+ height="10"
+ increment="0.001"
+ initial_value="0"
+ layout="topleft"
+ left_delta="15"
+ max_val="0.16"
+ name="WaterBlurMult"
+ top_pad="5"
+ width="200"/>
+
+ <text
+ follows="left|top|right"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left_delta="-15"
+ name="BHText3"
+ top_pad="15"
+ width="215">
+ Normal Map
+ </text>
+ <texture_picker
+ height="80"
+ layout="topleft"
+ left_delta="15"
+ name="WaterNormalMap"
+ top_pad="5"
+ width="100" />
+ </panel>
+<!--======== End of Controls panel ========-->
+
+ <view_border
+ bevel_style="none"
+ follows="top|left"
+ height="0"
+ layout="topleft"
+ left="10"
+ name="horiz_separator"
+ top_pad="5"
+ width="700"/>
+ <check_box
+ follows="top|left"
+ height="10"
+ label="Make this preset my new water setting"
+ layout="topleft"
+ left="275"
+ name="make_default_cb"
+ top_pad="20"
+ width="280"/>
+ <button
+ follows="bottom|right"
+ height="23"
+ label="Save"
+ layout="topleft"
+ left_pad="0"
+ name="save"
+ width="70"/>
+ <button
+ follows="bottom|right"
+ height="23"
+ label="Cancel"
+ layout="topleft"
+ left_pad="15"
+ name="cancel"
+ width="70"/>
+
+ </floater>
diff --git a/indra/newview/skins/default/xui/en/floater_env_settings.xml b/indra/newview/skins/default/xui/en/floater_env_settings.xml
deleted file mode 100644
index 14f9e2db95..0000000000
--- a/indra/newview/skins/default/xui/en/floater_env_settings.xml
+++ /dev/null
@@ -1,163 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater
- legacy_header_height="18"
- height="150"
- layout="topleft"
- name="Environment Editor Floater"
- help_topic="environment_editor_floater"
- save_rect="true"
- title="ENVIRONMENT EDITOR"
- width="600">
- <floater.string
- name="timeStr">
- [hour12,datetime,utc]:[min,datetime,utc] [ampm,datetime,utc]
- </floater.string>
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left="10"
- name="EnvTimeText"
- top="32"
- width="140">
- Time of Day
- </text>
- <text
- type="string"
- length="1"
- follows="left|top|right"
- height="16"
- layout="topleft"
- left="15"
- name="EnvTimeText2"
- top="62"
- width="140">
- 12:00 PM
- </text>
- <icon
- height="25"
- image_name="icon_diurnal.tga"
- layout="topleft"
- left="85"
- name="EnvDayCycle"
- top="30"
- width="200" />
- <slider
- control_name="EnvTimeSlider"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.0069444"
- initial_value="0.7"
- layout="topleft"
- left_delta="0"
- max_val="0.99"
- name="EnvTimeSlider"
- show_text="false"
- top_pad="10"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left="10"
- name="EnvCloudText"
- top="86"
- width="140">
- Cloud Cover
- </text>
- <slider
- control_name="EnvCloudSlider"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.7"
- layout="topleft"
- left_delta="75"
- name="EnvCloudSlider"
- top_delta="4"
- width="210" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left="310"
- name="EnvWaterColorText"
- top="39"
- width="140">
- Water Color
- </text>
- <color_swatch
- can_apply_immediately="true"
- color="0.5 0.5 0.5 1"
- follows="left|top"
- height="50"
- layout="topleft"
- left="390"
- name="EnvWaterColor"
- tool_tip="Click to open color picker"
- top="30"
- width="40" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left="310"
- name="EnvWaterFogText"
- top="86"
- width="140">
- Water Fog
- </text>
- <slider
- control_name="EnvWaterFogSlider"
- decimal_digits="2"
- follows="left"
- height="10"
- initial_value="0"
- layout="topleft"
- left_delta="75"
- max_val="10"
- name="EnvWaterFogSlider"
- top_delta="4"
- width="210" />
- <button
- follows="left|top"
- height="23"
- label="Use Estate Time"
- layout="topleft"
- left="10"
- name="EnvUseEstateTimeButton"
- top="120"
- width="137" />
- <button
- follows="left|top"
- height="23"
- label="Advanced Sky"
- layout="topleft"
- left_pad="3"
- name="EnvAdvancedSkyButton"
- top_delta="0"
- width="137" />
- <button
- follows="left|top"
- height="23"
- label="Advanced Water"
- layout="topleft"
- left_pad="3"
- name="EnvAdvancedWaterButton"
- top_delta="0"
- width="137" />
-</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_environment_settings.xml b/indra/newview/skins/default/xui/en/floater_environment_settings.xml
new file mode 100644
index 0000000000..1b1cafaca6
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_environment_settings.xml
@@ -0,0 +1,162 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ legacy_header_height="18"
+ height="328"
+ layout="topleft"
+ name="Environment Editor Floater"
+ help_topic="environment_editor_floater"
+ save_rect="true"
+ title="ENVIRONMENT SETTINGS"
+ width="540">
+
+ <text
+ follows="top|left|right"
+ height="15"
+ layout="topleft"
+ left="20"
+ name="note"
+ top="25"
+ width="510"
+ wrap="true">
+ Use the options below to customize the environment settings for your viewer.
+ </text>
+
+ <view_border
+ bevel_style="none"
+ follows="top|left"
+ height="237"
+ layout="topleft"
+ left="20"
+ name="border"
+ top_pad="8"
+ width="500"/>
+ <radio_group
+ follows="top|left"
+ height="45"
+ layout="topleft"
+ left_delta="10"
+ name="region_settings_radio_group"
+ top_delta="20"
+ width="200">
+ <radio_item
+ label="Use region settings"
+ layout="topleft"
+ name="use_region_settings"/>
+ <radio_item
+ label="Customize my environment"
+ layout="topleft"
+ name="use_my_settings"
+ top_pad="20"/>
+ </radio_group>
+
+ <panel
+ height="170"
+ layout="topleft"
+ left="50"
+ name="user_environment_settings"
+ top_pad="0"
+ width="470">
+
+ <text
+ follows="top|left|right"
+ font="SansSerifItalic"
+ height="15"
+ layout="topleft"
+ left_delta="0"
+ name="note"
+ top_pad="0"
+ width="470"
+ wrap="true">
+ Note: your custom settings will not be visible to other users.
+ </text>
+
+ <!-- Water Setting -->
+ <text
+ name="water_settings_title"
+ follows="top|left"
+ height="16"
+ layout="topleft"
+ left="50"
+ top="40"
+ width="200">
+ Water Setting
+ </text>
+ <combo_box
+ follows="top|left"
+ left_pad="2"
+ name="water_settings_preset_combo"
+ top_delta="-5"
+ width="200">
+ <combo_box.item
+ label="-Select a preset-"
+ name="item0"/>
+ </combo_box>
+
+
+ <!-- Sky/Day Cycle Settings -->
+ <text
+ name="sky_dayc_settings_title"
+ follows="top|left"
+ height="16"
+ layout="topleft"
+ left="50"
+ top_pad="20"
+ width="100">
+ Sky / Day Cycle
+ </text>
+ <radio_group
+ layout="topleft"
+ left_delta="50"
+ name="sky_dayc_settings_radio_group"
+ top_pad="10"
+ height="50"
+ width="150">
+ <radio_item
+ layout="topleft"
+ label="Fixed sky"
+ name="my_sky_settings"/>
+ <radio_item
+ layout="topleft"
+ label="Day cycle"
+ name="my_dayc_settings"
+ top_pad="25"/>
+ </radio_group>
+ <combo_box
+ follows="top|left"
+ left_pad="2"
+ name="sky_settings_preset_combo"
+ top_delta="-7"
+ width="200">
+ <combo_box.item
+ label="-Select a preset-"
+ name="item0"/>
+ </combo_box>
+ <combo_box
+ follows="top|left"
+ name="dayc_settings_preset_combo"
+ top_delta="36"
+ width="200">
+ <combo_box.item
+ label="-Select a preset-"
+ name="item0"/>
+ </combo_box>
+ </panel>
+
+ <button
+ follows="left|top"
+ height="23"
+ label="OK"
+ layout="topleft"
+ right="-130"
+ name="ok_btn"
+ top_pad="10"
+ width="100" />
+ <button
+ follows="left|top"
+ height="23"
+ label="Cancel"
+ layout="topleft"
+ left_pad="10"
+ name="cancel_btn"
+ width="100" />
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_event.xml b/indra/newview/skins/default/xui/en/floater_event.xml
index 7ed020f832..cf61b7d24d 100644
--- a/indra/newview/skins/default/xui/en/floater_event.xml
+++ b/indra/newview/skins/default/xui/en/floater_event.xml
@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
- follows="all"
height="400"
can_resize="true"
help_topic="event_details"
diff --git a/indra/newview/skins/default/xui/en/floater_fast_timers.xml b/indra/newview/skins/default/xui/en/floater_fast_timers.xml
new file mode 100644
index 0000000000..77adb5524e
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_fast_timers.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ legacy_header_height="18"
+ can_minimize="false"
+ can_tear_off="false"
+ can_resize="true"
+ can_drag_on_left="false"
+ can_close="true"
+ height="500"
+ layout="topleft"
+ name="fast_timers"
+ save_rect="true"
+ save_visibility="false"
+ single_instance="true"
+ min_width="400"
+ width="700">
+ <string name="pause" >Pause</string>
+ <string name="run">Run</string>
+ <button follows="top|right"
+ name="pause_btn"
+ left="-200"
+ top="5"
+ width="180"
+ height="40"
+ label="Pause"
+ font="SansSerifHuge"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_gesture.xml b/indra/newview/skins/default/xui/en/floater_gesture.xml
index 9f5e6828d2..200e9b9537 100644
--- a/indra/newview/skins/default/xui/en/floater_gesture.xml
+++ b/indra/newview/skins/default/xui/en/floater_gesture.xml
@@ -1,5 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
+ positioning="cascading"
+ save_rect="true"
legacy_header_height="18"
can_resize="true"
height="465"
@@ -7,7 +9,6 @@
help_topic="gestures"
title="GESTURES"
background_visible="true"
- follows="all"
label="Places"
layout="topleft"
min_height="350"
diff --git a/indra/newview/skins/default/xui/en/floater_hardware_settings.xml b/indra/newview/skins/default/xui/en/floater_hardware_settings.xml
index 0ea42f9757..66bb9d3cea 100644
--- a/indra/newview/skins/default/xui/en/floater_hardware_settings.xml
+++ b/indra/newview/skins/default/xui/en/floater_hardware_settings.xml
@@ -35,7 +35,7 @@
height="12"
layout="topleft"
left="10"
- name="Antialiasing:"
+ name="antialiasing label"
top_pad="7"
width="188">
Antialiasing:
@@ -80,7 +80,7 @@
left_pad="10"
name="antialiasing restart"
top_delta="0"
- width="188">
+ width="230">
(requires viewer restart)
</text>
<spinner
@@ -96,7 +96,7 @@
left="10"
max_val="2"
name="gamma"
- top_pad="7"
+ top_pad="11"
width="262" />
<text
type="string"
diff --git a/indra/newview/skins/default/xui/en/floater_help_browser.xml b/indra/newview/skins/default/xui/en/floater_help_browser.xml
index 837923bcf6..c06cb63f8a 100644
--- a/indra/newview/skins/default/xui/en/floater_help_browser.xml
+++ b/indra/newview/skins/default/xui/en/floater_help_browser.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
+ positioning="cascading"
legacy_header_height="18"
can_resize="true"
height="600"
@@ -33,10 +34,10 @@
left_delta="0"
top_delta="0"
name="external_controls"
- user_resize="false"
width="620">
<web_browser
- trusted_content="true"
+ trusted_content="true"
+ initial_mime_type="text/html"
bottom="-25"
follows="left|right|top|bottom"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/floater_how_to.xml b/indra/newview/skins/default/xui/en/floater_how_to.xml
new file mode 100644
index 0000000000..8c0077a8cc
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_how_to.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ legacy_header_height="18"
+ can_resize="true"
+ can_minimize="true"
+ height="775"
+ layout="topleft"
+ min_height="360"
+ left="10000"
+ top="10"
+ min_width="335"
+ name="floater_how_to"
+ help_topic="how_to"
+ single_instance="true"
+ save_rect="true"
+ title="HOW TO"
+ width="780"
+ filename="floater_web_content.xml"/> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/floater_hud.xml b/indra/newview/skins/default/xui/en/floater_hud.xml
index 99a6a95828..e2d860881a 100644
--- a/indra/newview/skins/default/xui/en/floater_hud.xml
+++ b/indra/newview/skins/default/xui/en/floater_hud.xml
@@ -8,6 +8,7 @@
help_topic="floater_hud"
save_rect="true"
save_visibility="true"
+ chrome="true"
title="TUTORIAL"
width="362">
<web_browser
diff --git a/indra/newview/skins/default/xui/en/floater_im_session.xml b/indra/newview/skins/default/xui/en/floater_im_session.xml
index a371e98322..ca73883e53 100644
--- a/indra/newview/skins/default/xui/en/floater_im_session.xml
+++ b/indra/newview/skins/default/xui/en/floater_im_session.xml
@@ -3,12 +3,10 @@
legacy_header_height="18"
background_visible="true"
default_tab_group="1"
- follows="all"
- height="350"
+ height="355"
+ help_topic="floater_im_box"
layout="topleft"
- left="0"
name="panel_im"
- top="0"
can_dock="false"
can_minimize="true"
can_close="true"
@@ -18,7 +16,7 @@
min_width="250"
min_height="190">
<layout_stack
- animate="false"
+ animate="true"
default_tab_group="2"
follows="all"
height="320"
@@ -34,8 +32,7 @@
min_width="115"
width="150"
height="320"
- auto_resize="false"
- user_resize="false">
+ auto_resize="false">
<panel
name="panel_im_control_panel"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/floater_image_preview.xml b/indra/newview/skins/default/xui/en/floater_image_preview.xml
index 86232de1a4..44d2c14cc8 100644
--- a/indra/newview/skins/default/xui/en/floater_image_preview.xml
+++ b/indra/newview/skins/default/xui/en/floater_image_preview.xml
@@ -2,7 +2,7 @@
<floater
legacy_header_height="18"
can_minimize="false"
- height="440"
+ height="460"
layout="topleft"
name="Image Preview"
help_topic="image_preview"
@@ -108,7 +108,7 @@
<text
type="string"
length="1"
- bottom="225"
+ bottom="250"
height="45"
word_wrap="true"
follows="top|left"
@@ -137,7 +137,7 @@ Try saving image as 24 bit Targa (.tga).
layout="topleft"
left="165"
name="cancel_btn"
- top="410"
+ top="430"
width="125" />
<button
follows="bottom|left"
diff --git a/indra/newview/skins/default/xui/en/floater_import_collada.xml b/indra/newview/skins/default/xui/en/floater_import_collada.xml
new file mode 100644
index 0000000000..441ab6a2de
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_import_collada.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater can_close="false" can_drag_on_left="false" can_minimize="false"
+ can_resize="false" height="160" min_height="160" width="300" min_width="300"
+ name="Import Collada" title="Import Scene">
+
+ <text bottom_delta="40" left="20" name="mesh count" height="15" follows="top|left">
+ Meshes: [COUNT]
+ </text>
+
+ <text bottom_delta="20" left="20" name="texture count" height="15" follows="top|left">
+ Textures: [COUNT]
+ </text>
+
+ <text bottom_delta="40" left="10" name="status" height="15" follows="top|left">
+ Status: [STATUS]
+ </text>
+
+ <button
+ bottom_delta="40"
+ name="cancel"
+ label="Cancel"
+ enabled="true"
+ height="20"
+ layout="topleft"
+ left="125"
+ width="75" />
+
+ <button
+ bottom_delta="0"
+ name="ok"
+ label="OK"
+ enabled="true"
+ height="20"
+ layout="topleft"
+ left="210"
+ width="75" />
+
+ <string name="status_idle">Idle</string>
+ <string name="status_uploading">Uploading [NAME]</string>
+ <string name="status_creating">Creating object [NAME]</string>
+
+ </floater>
diff --git a/indra/newview/skins/default/xui/en/floater_inventory.xml b/indra/newview/skins/default/xui/en/floater_inventory.xml
deleted file mode 100644
index ba2e0d3277..0000000000
--- a/indra/newview/skins/default/xui/en/floater_inventory.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater
- legacy_header_height="18"
- auto_tile="true"
- can_resize="true"
- height="563"
- layout="topleft"
- min_height="150"
- min_width="240"
- name="Inventory"
- help_topic="inventory"
- save_rect="true"
- save_visibility="true"
- single_instance="false"
- title="MY INVENTORY"
- width="467">
- <panel
- bottom="560"
- class="panel_main_inventory"
- filename="panel_main_inventory.xml"
- follows="all"
- layout="topleft"
- left="0"
- label="Inventory Panel"
- name="Inventory Panel"
- top="15"
- width="467" />
-</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml
index 29f09dd0b2..adef066aef 100644
--- a/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml
+++ b/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml
@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
legacy_header_height="18"
- auto_tile="true"
height="340"
layout="topleft"
name="item properties"
@@ -106,9 +105,10 @@
left_delta="78"
name="LabelCreatorName"
top_delta="0"
+ translate="false"
use_ellipses="true"
width="170">
- Nicole Linden
+ TestString PleaseIgnore
</text>
<button
follows="top|right"
@@ -140,9 +140,10 @@
left_delta="78"
name="LabelOwnerName"
top_delta="0"
+ translate="false"
use_ellipses="true"
width="170">
- Thrax Linden
+ TestString PleaseIgnore
</text>
<button
follows="top|right"
diff --git a/indra/newview/skins/default/xui/en/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/en/floater_inventory_view_finder.xml
index 90fee857fb..c86ed595a7 100644
--- a/indra/newview/skins/default/xui/en/floater_inventory_view_finder.xml
+++ b/indra/newview/skins/default/xui/en/floater_inventory_view_finder.xml
@@ -95,6 +95,23 @@
width="126" />
<icon
height="16"
+ image_name="Inv_Mesh"
+ layout="topleft"
+ left="8"
+ mouse_opaque="true"
+ name="icon_mesh"
+ top="142"
+ width="16" />
+ <check_box
+ height="16"
+ label="Meshes"
+ layout="topleft"
+ left_pad="2"
+ name="check_mesh"
+ top_delta="0"
+ width="126" />
+ <icon
+ height="16"
image_name="Inv_Notecard"
layout="topleft"
left="8"
@@ -117,7 +134,7 @@
left="8"
mouse_opaque="true"
name="icon_object"
- top="142"
+ top="162"
width="16" />
<check_box
height="16"
@@ -134,7 +151,7 @@
left="8"
mouse_opaque="true"
name="icon_script"
- top="162"
+ top="182"
width="16" />
<check_box
height="16"
@@ -151,7 +168,7 @@
left="8"
mouse_opaque="true"
name="icon_sound"
- top="182"
+ top="202"
width="16" />
<check_box
height="16"
@@ -168,7 +185,7 @@
left="8"
mouse_opaque="true"
name="icon_texture"
- top="202"
+ top="222"
width="16" />
<check_box
height="16"
@@ -185,7 +202,7 @@
left="8"
mouse_opaque="true"
name="icon_snapshot"
- top="222"
+ top="242"
width="16" />
<check_box
height="16"
@@ -203,7 +220,7 @@
layout="topleft"
left="8"
name="All"
- top="242"
+ top="262"
width="100" />
<button
follows="left|top"
diff --git a/indra/newview/skins/default/xui/en/floater_joystick.xml b/indra/newview/skins/default/xui/en/floater_joystick.xml
index 6e1bb8fcd0..59f6a9434c 100644
--- a/indra/newview/skins/default/xui/en/floater_joystick.xml
+++ b/indra/newview/skins/default/xui/en/floater_joystick.xml
@@ -13,6 +13,7 @@
</floater.string>
<check_box
bottom="38"
+ height="10"
control_name="JoystickEnabled"
halign="left"
label="Enable Joystick:"
@@ -28,6 +29,7 @@
width="380" />
<spinner
bottom="48"
+ height="10"
control_name="JoystickAxis1"
decimal_digits="0"
increment="1"
@@ -41,6 +43,7 @@
width="140" />
<spinner
bottom="48"
+ height="10"
control_name="JoystickAxis2"
decimal_digits="0"
increment="1"
@@ -54,6 +57,7 @@
width="140" />
<spinner
bottom="48"
+ height="10"
control_name="JoystickAxis0"
decimal_digits="0"
increment="1"
@@ -67,6 +71,7 @@
width="140" />
<spinner
bottom="68"
+ height="10"
control_name="JoystickAxis4"
decimal_digits="0"
increment="1"
@@ -80,6 +85,7 @@
width="140" />
<spinner
bottom="68"
+ height="10"
control_name="JoystickAxis5"
decimal_digits="0"
increment="1"
@@ -93,6 +99,7 @@
width="140" />
<spinner
bottom="68"
+ height="10"
control_name="JoystickAxis3"
decimal_digits="0"
increment="1"
@@ -106,6 +113,7 @@
width="140" />
<spinner
bottom="88"
+ height="10"
control_name="JoystickAxis6"
decimal_digits="0"
increment="1"
@@ -119,6 +127,7 @@
width="140" />
<check_box
bottom_delta="18"
+ height="10"
control_name="ZoomDirect"
label="Direct Zoom"
layout="topleft"
@@ -127,6 +136,7 @@
width="60" />
<check_box
bottom_delta="0"
+ height="10"
control_name="Cursor3D"
label="3D Cursor"
layout="topleft"
@@ -135,6 +145,7 @@
width="60" />
<check_box
bottom_delta="0"
+ height="10"
control_name="AutoLeveling"
label="Auto Level"
layout="topleft"
@@ -157,6 +168,7 @@
</text>
<check_box
bottom="127"
+ height="10"
control_name="JoystickAvatarEnabled"
halign="center"
label="Avatar"
@@ -166,6 +178,7 @@
width="60" />
<check_box
bottom="127"
+ height="10"
control_name="JoystickBuildEnabled"
halign="center"
label="Build"
@@ -175,6 +188,7 @@
width="60" />
<check_box
bottom="127"
+ height="10"
control_name="JoystickFlycamEnabled"
halign="center"
label="Flycam"
@@ -257,6 +271,7 @@
</text>
<spinner
bottom="144"
+ height="10"
control_name="AvatarAxisScale1"
decimal_digits="2"
label_width="0"
@@ -268,6 +283,7 @@
width="56" />
<spinner
bottom="144"
+ height="10"
control_name="BuildAxisScale1"
decimal_digits="2"
label_width="0"
@@ -279,6 +295,7 @@
width="56" />
<spinner
bottom="144"
+ height="10"
control_name="FlycamAxisScale1"
decimal_digits="2"
label_width="0"
@@ -301,6 +318,7 @@
</text>
<spinner
bottom="164"
+ height="10"
control_name="AvatarAxisScale2"
decimal_digits="2"
label_width="0"
@@ -312,6 +330,7 @@
width="56" />
<spinner
bottom="164"
+ height="10"
control_name="BuildAxisScale2"
decimal_digits="2"
label_width="0"
@@ -323,6 +342,7 @@
width="56" />
<spinner
bottom="164"
+ height="10"
control_name="FlycamAxisScale2"
decimal_digits="2"
label_width="0"
@@ -345,6 +365,7 @@
</text>
<spinner
bottom="184"
+ height="10"
control_name="AvatarAxisScale0"
decimal_digits="2"
label_width="0"
@@ -356,6 +377,7 @@
width="56" />
<spinner
bottom="184"
+ height="10"
control_name="BuildAxisScale0"
decimal_digits="2"
label_width="0"
@@ -367,6 +389,7 @@
width="56" />
<spinner
bottom="184"
+ height="10"
control_name="FlycamAxisScale0"
decimal_digits="2"
label_width="0"
@@ -389,6 +412,7 @@
</text>
<spinner
bottom="204"
+ height="10"
control_name="AvatarAxisScale4"
decimal_digits="2"
label_width="0"
@@ -400,6 +424,7 @@
width="56" />
<spinner
bottom="204"
+ height="10"
control_name="BuildAxisScale4"
decimal_digits="2"
label_width="0"
@@ -411,6 +436,7 @@
width="56" />
<spinner
bottom="204"
+ height="10"
control_name="FlycamAxisScale4"
decimal_digits="2"
label_width="0"
@@ -433,6 +459,7 @@
</text>
<spinner
bottom="224"
+ height="10"
control_name="AvatarAxisScale5"
decimal_digits="2"
label_width="0"
@@ -444,6 +471,7 @@
width="56" />
<spinner
bottom="224"
+ height="10"
control_name="BuildAxisScale5"
decimal_digits="2"
label_width="0"
@@ -455,6 +483,7 @@
width="56" />
<spinner
bottom="224"
+ height="10"
control_name="FlycamAxisScale5"
decimal_digits="2"
label_width="0"
@@ -477,6 +506,7 @@
</text>
<spinner
bottom="244"
+ height="10"
control_name="BuildAxisScale3"
decimal_digits="2"
label_width="0"
@@ -488,6 +518,7 @@
width="56" />
<spinner
bottom="244"
+ height="10"
control_name="FlycamAxisScale3"
decimal_digits="2"
label_width="0"
@@ -510,6 +541,7 @@
</text>
<spinner
bottom="274"
+ height="10"
control_name="AvatarAxisDeadZone1"
decimal_digits="2"
increment="0.01"
@@ -520,6 +552,7 @@
width="56" />
<spinner
bottom="274"
+ height="10"
control_name="BuildAxisDeadZone1"
decimal_digits="2"
increment="0.01"
@@ -530,6 +563,7 @@
width="56" />
<spinner
bottom="274"
+ height="10"
control_name="FlycamAxisDeadZone1"
decimal_digits="2"
increment="0.01"
@@ -551,6 +585,7 @@
</text>
<spinner
bottom="294"
+ height="10"
control_name="AvatarAxisDeadZone2"
decimal_digits="2"
increment="0.01"
@@ -561,6 +596,7 @@
width="56" />
<spinner
bottom="294"
+ height="10"
control_name="BuildAxisDeadZone2"
decimal_digits="2"
increment="0.01"
@@ -571,6 +607,7 @@
width="56" />
<spinner
bottom="294"
+ height="10"
control_name="FlycamAxisDeadZone2"
decimal_digits="2"
increment="0.01"
@@ -592,6 +629,7 @@
</text>
<spinner
bottom="314"
+ height="10"
control_name="AvatarAxisDeadZone0"
decimal_digits="2"
increment="0.01"
@@ -602,6 +640,7 @@
width="56" />
<spinner
bottom="314"
+ height="10"
control_name="BuildAxisDeadZone0"
decimal_digits="2"
increment="0.01"
@@ -612,6 +651,7 @@
width="56" />
<spinner
bottom="314"
+ height="10"
control_name="FlycamAxisDeadZone0"
decimal_digits="2"
increment="0.01"
@@ -633,6 +673,7 @@
</text>
<spinner
bottom="334"
+ height="10"
control_name="AvatarAxisDeadZone4"
decimal_digits="2"
increment="0.01"
@@ -643,6 +684,7 @@
width="56" />
<spinner
bottom="334"
+ height="10"
control_name="BuildAxisDeadZone4"
decimal_digits="2"
increment="0.01"
@@ -653,6 +695,7 @@
width="56" />
<spinner
bottom="334"
+ height="10"
control_name="FlycamAxisDeadZone4"
decimal_digits="2"
increment="0.01"
@@ -674,6 +717,7 @@
</text>
<spinner
bottom="354"
+ height="10"
control_name="AvatarAxisDeadZone5"
decimal_digits="2"
increment="0.01"
@@ -684,6 +728,7 @@
width="56" />
<spinner
bottom="354"
+ height="10"
control_name="BuildAxisDeadZone5"
decimal_digits="2"
increment="0.01"
@@ -694,6 +739,7 @@
width="56" />
<spinner
bottom="354"
+ height="10"
control_name="FlycamAxisDeadZone5"
decimal_digits="2"
increment="0.01"
@@ -715,6 +761,7 @@
</text>
<spinner
bottom="374"
+ height="10"
control_name="BuildAxisDeadZone3"
decimal_digits="2"
increment="0.01"
@@ -725,6 +772,7 @@
width="56" />
<spinner
bottom="374"
+ height="10"
control_name="FlycamAxisDeadZone3"
decimal_digits="2"
increment="0.01"
@@ -802,6 +850,7 @@
</text>
<spinner
bottom="430"
+ height="10"
control_name="FlycamAxisScale6"
decimal_digits="2"
label_width="0"
@@ -824,6 +873,7 @@
</text>
<spinner
bottom="450"
+ height="10"
control_name="FlycamAxisDeadZone6"
decimal_digits="2"
increment="0.01"
diff --git a/indra/newview/skins/default/xui/en/floater_land_holdings.xml b/indra/newview/skins/default/xui/en/floater_land_holdings.xml
index 0b9ae3c9f3..390ec9ab7d 100644
--- a/indra/newview/skins/default/xui/en/floater_land_holdings.xml
+++ b/indra/newview/skins/default/xui/en/floater_land_holdings.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
+ positioning="centered"
legacy_header_height="18"
height="430"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/en/floater_live_lsleditor.xml
index 1f192f9b28..5cd7cd196d 100644
--- a/indra/newview/skins/default/xui/en/floater_live_lsleditor.xml
+++ b/indra/newview/skins/default/xui/en/floater_live_lsleditor.xml
@@ -4,7 +4,6 @@
bevel_style="none"
border_style="line"
can_resize="true"
- follows="left|top"
height="580"
layout="topleft"
min_height="271"
diff --git a/indra/newview/skins/default/xui/en/floater_lsl_guide.xml b/indra/newview/skins/default/xui/en/floater_lsl_guide.xml
index c9d87f158f..e9676777f4 100644
--- a/indra/newview/skins/default/xui/en/floater_lsl_guide.xml
+++ b/indra/newview/skins/default/xui/en/floater_lsl_guide.xml
@@ -2,7 +2,6 @@
<floater
legacy_header_height="18"
can_resize="true"
- follows="left|top"
height="400"
layout="topleft"
min_height="271"
diff --git a/indra/newview/skins/default/xui/en/floater_map.xml b/indra/newview/skins/default/xui/en/floater_map.xml
index 6370ff9243..b8893e11d9 100644
--- a/indra/newview/skins/default/xui/en/floater_map.xml
+++ b/indra/newview/skins/default/xui/en/floater_map.xml
@@ -1,39 +1,38 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
- bg_alpha_image_overlay="DkGray_66"
- legacy_header_height="0"
+ positioning="cascading"
can_minimize="true"
can_resize="true"
- follows="top|right"
- height="174"
+ chrome="true"
+ height="200"
layout="topleft"
min_height="128"
min_width="128"
name="Map"
- title=""
+ title="MINI-MAP"
help_topic="map"
save_rect="true"
save_visibility="true"
- single_instance="true"
- left="0"
- top="0"
width="200">
<floater.string
name="ToolTipMsg">
[REGION](Double-click to open Map, shift-drag to pan)
</floater.string>
- <floater.string name="mini_map_caption">
- MINIMAP
+ <floater.string
+ name="AltToolTipMsg">
+ [REGION](Double-click to teleport, shift-drag to pan)
+ </floater.string>
+ <floater.string name="mini_map_caption">
+ Mini-map
</floater.string>
<net_map
- bg_color="NetMapBackgroundColor"
follows="top|left|bottom|right"
layout="topleft"
left="0"
mouse_opaque="false"
name="Net Map"
width="200"
- height="218"
+ height="200"
top="0"/>
<text
type="string"
@@ -45,7 +44,7 @@
name="floater_map_north"
right="10"
text_color="1 1 1 0.7"
- top="209">
+ top="189">
N
</text>
<text
@@ -58,7 +57,7 @@
name="floater_map_east"
right="10"
text_color="1 1 1 0.7"
- top="209">
+ top="189">
E
</text>
<text
@@ -71,7 +70,7 @@
name="floater_map_west"
right="11"
text_color="1 1 1 0.7"
- top="195">
+ top="175">
W
</text>
<text
@@ -84,7 +83,7 @@
name="floater_map_south"
right="10"
text_color="1 1 1 0.7"
- top="209">
+ top="189">
S
</text>
<text
@@ -97,7 +96,7 @@
name="floater_map_southeast"
right="20"
text_color="1 1 1 0.7"
- top="209">
+ top="189">
SE
</text>
<text
@@ -110,7 +109,7 @@
name="floater_map_northeast"
right="20"
text_color="1 1 1 0.7"
- top="209">
+ top="189">
NE
</text>
<text
@@ -123,7 +122,7 @@
name="floater_map_southwest"
right="20"
text_color="1 1 1 0.7"
- top="209">
+ top="189">
SW
</text>
<text
@@ -136,7 +135,7 @@
name="floater_map_northwest"
right="20"
text_color="1 1 1 0.7"
- top="209">
+ top="189">
NW
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_media_browser.xml b/indra/newview/skins/default/xui/en/floater_media_browser.xml
index 49e835cce4..ce788654aa 100644
--- a/indra/newview/skins/default/xui/en/floater_media_browser.xml
+++ b/indra/newview/skins/default/xui/en/floater_media_browser.xml
@@ -5,11 +5,10 @@
height="440"
layout="topleft"
min_height="140"
- min_width="467"
+ min_width="0"
name="floater_about"
help_topic="floater_about"
save_rect="true"
- auto_tile="true"
title="MEDIA BROWSER"
width="820">
<floater.string
@@ -38,7 +37,6 @@
min_height="20"
name="nav_controls"
top="400"
- user_resize="false"
width="800">
<button
follows="left|top"
@@ -101,7 +99,7 @@
left_pad="5"
name="go"
top_delta="0"
- width="55">
+ width="50">
<button.commit_callback
function="MediaBrowser.Go" />
</button>
@@ -114,7 +112,6 @@
min_height="20"
name="time_controls"
top_delta="0"
- user_resize="false"
width="800">
<button
follows="left|top"
@@ -172,7 +169,6 @@
min_height="20"
name="parcel_owner_controls"
top_delta="0"
- user_resize="false"
width="540">
<button
enabled="false"
@@ -194,7 +190,6 @@
left_delta="0"
name="external_controls"
top_delta="0"
- user_resize="false"
width="540">
<web_browser
bottom="-30"
diff --git a/indra/newview/skins/default/xui/en/floater_media_settings.xml b/indra/newview/skins/default/xui/en/floater_media_settings.xml
index 681731b0da..0e03c0ab6d 100644
--- a/indra/newview/skins/default/xui/en/floater_media_settings.xml
+++ b/indra/newview/skins/default/xui/en/floater_media_settings.xml
@@ -10,7 +10,6 @@
enabled="true"
width="365"
height="535"
- left="330"
min_height="535"
min_width="365"
mouse_opaque="true"
diff --git a/indra/newview/skins/default/xui/en/floater_mem_leaking.xml b/indra/newview/skins/default/xui/en/floater_mem_leaking.xml
index 28a29c42aa..fb7d09a21e 100644
--- a/indra/newview/skins/default/xui/en/floater_mem_leaking.xml
+++ b/indra/newview/skins/default/xui/en/floater_mem_leaking.xml
@@ -2,7 +2,6 @@
<floater
legacy_header_height="18"
can_minimize="false"
- follows="left|top"
height="175"
layout="topleft"
name="MemLeak"
diff --git a/indra/newview/skins/default/xui/en/floater_merchant_outbox.xml b/indra/newview/skins/default/xui/en/floater_merchant_outbox.xml
new file mode 100644
index 0000000000..b98f280b56
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_merchant_outbox.xml
@@ -0,0 +1,152 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<floater
+ positioning="cascading"
+ can_close="true"
+ can_resize="true"
+ height="440"
+ help_topic="floater_merchant_outbox"
+ min_width="300"
+ min_height="200"
+ name="floater_merchant_outbox"
+ save_rect="true"
+ save_visibility="false"
+ reuse_instance="true"
+ title="MERCHANT OUTBOX"
+ width="333">
+ <string name="OutboxFolderCount0"></string>
+ <string name="OutboxFolderCount1">1 folder</string>
+ <string name="OutboxFolderCountN">[NUM] folders</string>
+ <string name="OutboxImporting">Sending folders...</string>
+ <string name="OutboxInitializing">Initializing...</string>
+ <panel
+ follows="all"
+ layout="topleft"
+ left="0"
+ top="0"
+ label=""
+ height="440"
+ width="333">
+ <panel
+ follows="all"
+ left="10"
+ bottom="370"
+ width="313"
+ top="0"
+ bg_opaque_color="InventoryBackgroundColor">
+ <panel
+ name="outbox_inventory_placeholder_panel"
+ follows="all"
+ layout="topleft"
+ top="0"
+ left="0"
+ width="308"
+ height="370"
+ bg_opaque_color="InventoryBackgroundColor">
+ <text
+ name="outbox_inventory_placeholder_title"
+ type="string"
+ follows="top|left|right"
+ layout="topleft"
+ top="10"
+ left="0"
+ width="308"
+ height="25"
+ wrap="true"
+ halign="center"
+ font="SansSerifBold">
+ Loading...
+ </text>
+ <text
+ name="outbox_inventory_placeholder_text"
+ type="string"
+ follows="top|left|right"
+ layout="topleft"
+ top="35"
+ left="0"
+ width="308"
+ height="130"
+ wrap="true"
+ halign="left" />
+ </panel>
+ </panel>
+ <panel
+ follows="bottom|left|right"
+ left="10"
+ bottom="435"
+ width="313"
+ top="370">
+ <panel
+ name="outbox_generic_drag_target"
+ mouse_opaque="false"
+ follows="all"
+ top="5"
+ left="5"
+ width="303"
+ height="25"
+ background_visible="false"
+ bg_alpha_color="EmphasisColor_35"
+ border="true"
+ bevel_style="in"
+ visible="true">
+ <text
+ type="string"
+ follows="all"
+ layout="topleft"
+ top="6"
+ height="20"
+ left="5"
+ width="293"
+ halign="center"
+ font="SansSerifMedium"
+ font_shadow="hard"
+ valign="top">
+ Drag items here to create folders
+ </text>
+ </panel>
+ <text
+ name="outbox_folder_count"
+ type="string"
+ follows="all"
+ layout="topleft"
+ top="40"
+ left="5"
+ width="150"
+ height="20"
+ wrap="true"
+ halign="left"
+ valign="center"
+ font="SansSerif"/>
+ <button
+ label="Send to Marketplace"
+ tool_tip="Push to my Marketplace Storefront"
+ is_toggle="false"
+ name="outbox_import_btn"
+ follows="bottom|right"
+ tab_stop="false"
+ halign="center"
+ top="37"
+ left="160"
+ height="25"
+ width="150"
+ enabled="false" />
+ </panel>
+ <layout_stack name="import_progress_indicator" orientation="vertical" left="0" height="440" top="0" width="333" follows="all" visible="false">
+ <layout_panel />
+ <layout_panel height="24" auto_resize="false">
+ <layout_stack orientation="horizontal" left="0" height="24" top="0" width="333" follows="all">
+ <layout_panel width="0" />
+ <layout_panel width="24" auto_resize="false">
+ <loading_indicator
+ height="24"
+ layout="topleft"
+ left="0"
+ top="0"
+ width="24" />
+ </layout_panel>
+ <layout_panel width="0" />
+ </layout_stack>
+ </layout_panel>
+ <layout_panel />
+ </layout_stack>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_model_preview.xml b/indra/newview/skins/default/xui/en/floater_model_preview.xml
new file mode 100644
index 0000000000..0e211551e6
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_model_preview.xml
@@ -0,0 +1,1430 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater can_close="true" can_drag_on_left="false" can_minimize="false"
+ can_resize="false" height="480" min_height="480" min_width="940"
+ name="Model Preview" title="UPLOAD MODEL" width="940"
+ help_topic="upload_model" >
+
+ <string name="status_idle"></string>
+ <string name="status_parse_error">Error: Dae parsing issue - see log for details.</string>
+ <string name="status_material_mismatch">Error: Material of model is not a subset of reference model.</string>
+ <string name="status_reading_file">Loading...</string>
+ <string name="status_generating_meshes">Generating Meshes...</string>
+ <string name="status_vertex_number_overflow">Error: Vertex number is more than 65534, aborted!</string>
+ <string name="bad_element">Error: element is invalid</string>
+ <string name="high">High</string>
+ <string name="medium">Medium</string>
+ <string name="low">Low</string>
+ <string name="lowest">Lowest</string>
+ <string name="mesh_status_good">Ship it!</string>
+ <string name="mesh_status_na">N/A</string>
+ <string name="mesh_status_none">None</string>
+ <string name="mesh_status_submesh_mismatch">Levels of detail have a different number of textureable faces.</string>
+ <string name="mesh_status_mesh_mismatch">Levels of detail have a different number of mesh instances.</string>
+ <string name="mesh_status_too_many_vertices">Level of detail has too many vertices.</string>
+ <string name="mesh_status_missing_lod">Missing required level of detail.</string>
+ <string name="mesh_status_invalid_material_list">LOD materials are not a subset of reference model.</string>
+ <string name="layer_all">All</string> <!-- Text to display in physics layer combo box for "all layers" -->
+ <string name="decomposing">Analyzing...</string>
+ <string name="simplifying">Simplifying...</string>
+ <string name="tbd">TBD</string>
+
+<panel
+ follows="top|left"
+ height="455"
+ layout="topleft"
+ left="3"
+ name="left_panel"
+ top_pad="10"
+ width="630">
+ <panel
+ follows="all"
+ height="50"
+ layout="top|left"
+ left="3"
+ name="model_name_representation_panel"
+ width="525">
+ <text
+ follows="top|left"
+ layout="topleft"
+ height="15"
+ left="15"
+ name="name_label"
+ text_color="White"
+ top="0"
+ width="290">
+ Model name:
+ </text>
+ <line_editor
+ follows="top|left"
+ layout="topleft"
+ height="19"
+ max_length_bytes="64"
+ name="description_form"
+ prevalidate_callback="ascii"
+ top_pad="5"
+ width="290" />
+ <text
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left_pad="15"
+ name="model_category_label"
+ text_color="White"
+ top="0"
+ width="200">
+ This model represents...
+ </text>
+ <combo_box
+ follows="left|top"
+ height="23"
+ left_pad="10"
+ name="model_category_combo"
+ top_pad="10"
+ width="200">
+ <combo_box.drop_down_button
+ label_color="White"/>
+ <combo_item name="Choose one" label="Choose One..." value="MUT_Unspecified"/>
+ <combo_item name="Avatar shape" label="Avatar shape" value="MUT_AvatarShape"/>
+ <combo_item name="Avatar attachment" label="Avatar attachment" value="MUT_AvatarAttachment"/>
+ <combo_item name="Moving object (vehicle, animal)" label="Moving object (vehicle, animal)" value="MUT_MovingObject"/>
+ <combo_item name="Building Component" label="Building Component" value="MUT_BuildingComponent"/>
+ <combo_item name="Large, non moving etc" label="Large, non moving etc" value="MUT_LargeStationary"/>
+ <combo_item name="Smaller, non-moving etc" label="Smaller, non-moving etc" value="MUT_SmallStationary"/>
+ <combo_item name="Not really any of these" label="Not really any of these" value="MUT_Other"/>
+ </combo_box>
+ </panel>
+ <tab_container
+ follows="top|left"
+ top_pad="15"
+ left="0"
+ height="300"
+ width="625"
+ name="import_tab"
+ tab_position="top">
+ <!-- LOD PANEL -->
+ <panel
+ help_topic="upload_model_lod"
+ label="Level of Detail"
+ layout="topleft"
+ name="lod_panel"
+ title="Level of Detail">
+ <view_border
+ bevel_style="none"
+ follows="top|left"
+ height="275"
+ layout="topleft"
+ left="3"
+ name="lod_tab_border"
+ top_pad="0"
+ width="619" />
+ <text
+ follows="left|top"
+ height="18"
+ initial_value="Source"
+ layout="topleft"
+ left="75"
+ name="source"
+ text_color="ModelUploaderLabels"
+ top="15"
+ valign="center"
+ value="Source"
+ width="335"/>
+ <text
+ follows="left|top"
+ halign="right"
+ height="18"
+ initial_value="Triangles"
+ layout="topleft"
+ left_pad="0"
+ name="triangles"
+ text_color="ModelUploaderLabels"
+ top_delta="0"
+ valign="center"
+ value="Triangles"
+ width="65" />
+ <text
+ follows="left|top"
+ halign="right"
+ height="18"
+ initial_value="Vertices"
+ layout="topleft"
+ left_pad="0"
+ name="vertices"
+ text_color="ModelUploaderLabels"
+ valign="center"
+ value="Vertices"
+ width="65" />
+ <text
+ follows="left|top"
+ height="18"
+ initial_value="High"
+ layout="topleft"
+ left="10"
+ name="high_label"
+ text_color="ModelUploaderLabels"
+ top_pad="10"
+ valign="top"
+ value="High"
+ width="65" />
+ <combo_box
+ follows="top|left"
+ height="20"
+ layout="topleft"
+ left_pad="0"
+ name="lod_source_high"
+ top_delta="-3"
+ width="135">
+ <item
+ id="Load from file"
+ value="Load from file" />
+ <item
+ id="Generate"
+ value="Generate" />
+ </combo_box>
+ <line_editor
+ follows="left|top"
+ height="20"
+ initial_value=""
+ layout="topleft"
+ left_pad="5"
+ name="lod_file_high"
+ top_delta="0"
+ value=""
+ width="120" />
+ <button
+ follows="left|top"
+ height="20"
+ label="Browse..."
+ layout="topleft"
+ left_pad="5"
+ name="lod_browse_high"
+ top_delta="0"
+ width="70" />
+ <combo_box
+ follows="top|left"
+ height="20"
+ layout="topleft"
+ left="215"
+ name="lod_mode_high"
+ top_delta="0"
+ visible="false"
+ width="135">
+ <item
+ id="Triangle Limit"
+ value="Triangle Limit" />
+ <item
+ id="Error Threshold"
+ value="Error Threshold" />
+ </combo_box>
+ <spinner
+ decimal_digits="0"
+ follows="top|left"
+ height="20"
+ increment="10"
+ layout="topleft"
+ left_pad="5"
+ name="lod_triangle_limit_high"
+ visible="false"
+ width="55" />
+ <spinner
+ follows="top|left"
+ height="20"
+ increment="0.01"
+ layout="topleft"
+ left_delta="0"
+ max_val="100"
+ name="lod_error_threshold_high"
+ top_delta="0"
+ visible="false"
+ width="55" />
+ <text
+ follows="left|top"
+ halign="right"
+ height="15"
+ initial_value="0"
+ layout="topleft"
+ left_pad="0"
+ name="high_triangles"
+ valign="top"
+ value="0"
+ width="65" />
+ <text
+ follows="left|top"
+ halign="right"
+ height="15"
+ initial_value="0"
+ layout="topleft"
+ left_pad="0"
+ name="high_vertices"
+ valign="top"
+ value="0"
+ width="65" />
+ <text
+ follows="left|top"
+ halign="center"
+ height="15"
+ initial_value=""
+ layout="topleft"
+ left_pad="0"
+ name="high_status"
+ valign="top"
+ value=""
+ width="65" />
+ <icon
+ height="16"
+ image_name="red_x.png"
+ layout="topleft"
+ left_delta="20"
+ mouse_opaque="true"
+ name="status_icon_high"
+ top_delta="-2"
+ width="16" />
+ <text
+ follows="left|top"
+ height="18"
+ initial_value="Medium"
+ layout="topleft"
+ left="10"
+ name="medium_label"
+ text_color="ModelUploaderLabels"
+ top_pad="15"
+ valign="top"
+ value="Medium"
+ width="65" />
+ <combo_box
+ follows="top|left"
+ height="20"
+ layout="topleft"
+ left_pad="0"
+ name="lod_source_medium"
+ top_delta="-3"
+ width="135">
+ <item
+ id="Load from file"
+ value="Load from file" />
+ <item
+ id="Generate"
+ value="Generate" />
+ <item
+ id="Use LoD above"
+ value="Use LoD above" />
+ </combo_box>
+ <line_editor
+ follows="left|top"
+ height="20"
+ initial_value=""
+ layout="topleft"
+ left_pad="5"
+ name="lod_file_medium"
+ top_delta="0"
+ value=""
+ visible="false"
+ width="120" />
+ <button
+ follows="left|top"
+ height="20"
+ label="Browse..."
+ layout="topleft"
+ left_pad="5"
+ name="lod_browse_medium"
+ top_delta="0"
+ visible="false"
+ width="70" />
+ <combo_box
+ follows="top|left"
+ height="20"
+ layout="topleft"
+ left="215"
+ name="lod_mode_medium"
+ top_delta="0"
+ width="135">
+ <item
+ id="Triangle Limit"
+ value="Triangle Limit" />
+ <item
+ id="Error Threshold"
+ value="Error Threshold" />
+ </combo_box>
+ <spinner
+ decimal_digits="0"
+ follows="top|left"
+ height="20"
+ increment="10"
+ layout="topleft"
+ left_pad="5"
+ name="lod_triangle_limit_medium"
+ width="55" />
+ <spinner
+ follows="top|left"
+ height="20"
+ increment="0.01"
+ layout="topleft"
+ left_delta="0"
+ max_val="100"
+ name="lod_error_threshold_medium"
+ top_delta="0"
+ visible="false"
+ width="55" />
+ <text
+ follows="left|top"
+ halign="right"
+ height="15"
+ initial_value="0"
+ layout="topleft"
+ left_pad="0"
+ name="medium_triangles"
+ valign="top"
+ value="0"
+ width="65" />
+ <text
+ follows="left|top"
+ halign="right"
+ height="15"
+ initial_value="0"
+ layout="topleft"
+ left_pad="0"
+ name="medium_vertices"
+ valign="top"
+ value="0"
+ width="65" />
+ <text
+ follows="left|top"
+ halign="center"
+ height="15"
+ initial_value=""
+ layout="topleft"
+ left_pad="0"
+ name="medium_status"
+ valign="top"
+ value=""
+ width="65" />
+ <icon
+ height="16"
+ image_name="red_x.png"
+ layout="topleft"
+ left_delta="20"
+ mouse_opaque="true"
+ name="status_icon_medium"
+ top_delta="-2"
+ width="16" />
+ <text
+ follows="left|top"
+ height="18"
+ initial_value="Low"
+ layout="topleft"
+ left="10"
+ name="low_label"
+ text_color="ModelUploaderLabels"
+ top_pad="15"
+ valign="top"
+ value="Low"
+ width="65" />
+ <combo_box
+ follows="top|left"
+ height="20"
+ layout="topleft"
+ left_pad="0"
+ name="lod_source_low"
+ top_delta="-3"
+ width="135">
+ <item
+ id="Load from file"
+ value="Load from file" />
+ <item
+ id="Generate"
+ value="Generate" />
+ <item
+ id="Use LoD above"
+ value="Use LoD above" />
+ </combo_box>
+ <line_editor
+ follows="left|top"
+ height="20"
+ initial_value=""
+ layout="topleft"
+ left_pad="5"
+ name="lod_file_low"
+ top_delta="0"
+ value=""
+ visible="false"
+ width="120" />
+ <button
+ follows="left|top"
+ height="20"
+ label="Browse..."
+ layout="topleft"
+ left_pad="5"
+ name="lod_browse_low"
+ top_delta="0"
+ visible="false"
+ width="70" />
+ <combo_box
+ follows="top|left"
+ height="20"
+ layout="topleft"
+ left="215"
+ name="lod_mode_low"
+ top_delta="0"
+ width="135">
+ <item
+ id="Triangle Limit"
+ value="Triangle Limit" />
+ <item
+ id="Error Threshold"
+ value="Error Threshold" />
+ </combo_box>
+ <spinner
+ decimal_digits="0"
+ follows="top|left"
+ height="20"
+ increment="10"
+ layout="topleft"
+ left_pad="5"
+ name="lod_triangle_limit_low"
+ width="55" />
+ <spinner
+ follows="top|left"
+ height="20"
+ increment="0.01"
+ layout="topleft"
+ left_delta="0"
+ max_val="100"
+ name="lod_error_threshold_low"
+ top_delta="0"
+ visible="false"
+ width="55" />
+ <text
+ follows="left|top"
+ halign="right"
+ height="15"
+ initial_value="0"
+ layout="topleft"
+ left_pad="0"
+ name="low_triangles"
+ valign="top"
+ value="0"
+ width="65" />
+ <text
+ follows="left|top"
+ halign="right"
+ height="15"
+ initial_value="0"
+ layout="topleft"
+ left_pad="0"
+ name="low_vertices"
+ valign="top"
+ value="0"
+ width="65" />
+ <text
+ follows="left|top"
+ halign="center"
+ height="15"
+ initial_value=""
+ layout="topleft"
+ left_pad="0"
+ name="low_status"
+ valign="top"
+ value=""
+ width="65" />
+ <icon
+ height="16"
+ image_name="red_x.png"
+ layout="topleft"
+ left_delta="20"
+ mouse_opaque="true"
+ name="status_icon_low"
+ top_delta="-2"
+ width="16" />
+ <text
+ follows="left|top"
+ height="18"
+ initial_value="Lowest"
+ layout="topleft"
+ left="10"
+ name="lowest_label"
+ text_color="ModelUploaderLabels"
+ top_pad="15"
+ valign="top"
+ value="Lowest"
+ width="65" />
+ <combo_box
+ follows="top|left"
+ height="20"
+ layout="topleft"
+ left_pad="0"
+ name="lod_source_lowest"
+ top_delta="-3"
+ width="135">
+ <item
+ id="Load from file"
+ value="Load from file" />
+ <item
+ id="Generate"
+ value="Generate" />
+ <item
+ id="Use LoD above"
+ value="Use LoD above" />
+ </combo_box>
+ <line_editor
+ follows="left|top"
+ height="20"
+ initial_value=""
+ layout="topleft"
+ left_pad="5"
+ name="lod_file_lowest"
+ top_delta="0"
+ value=""
+ visible="false"
+ width="120" />
+ <button
+ follows="left|top"
+ height="20"
+ label="Browse..."
+ layout="topleft"
+ left_pad="5"
+ name="lod_browse_lowest"
+ top_delta="0"
+ visible="false"
+ width="70" />
+ <combo_box
+ follows="top|left"
+ height="20"
+ layout="topleft"
+ left="215"
+ name="lod_mode_lowest"
+ top_delta="0"
+ width="135">
+ <item
+ id="Triangle Limit"
+ value="Triangle Limit" />
+ <item
+ id="Error Threshold"
+ value="Error Threshold" />
+ </combo_box>
+ <spinner
+ decimal_digits="0"
+ follows="top|left"
+ height="20"
+ increment="10"
+ layout="topleft"
+ left_pad="5"
+ name="lod_triangle_limit_lowest"
+ width="55" />
+ <spinner
+ follows="top|left"
+ height="20"
+ increment="0.01"
+ layout="topleft"
+ left_delta="0"
+ max_val="100"
+ name="lod_error_threshold_lowest"
+ top_delta="0"
+ visible="false"
+ width="55" />
+ <text
+ follows="left|top"
+ halign="right"
+ height="15"
+ initial_value="0"
+ layout="topleft"
+ left_pad="0"
+ name="lowest_triangles"
+ valign="top"
+ value="0"
+ width="65" />
+ <text
+ follows="left|top"
+ halign="right"
+ height="15"
+ initial_value="0"
+ layout="topleft"
+ left_pad="0"
+ name="lowest_vertices"
+ valign="top"
+ value="0"
+ width="65" />
+ <text
+ follows="left|top"
+ halign="center"
+ height="15"
+ initial_value=""
+ layout="topleft"
+ left_pad="0"
+ name="lowest_status"
+ valign="top"
+ value=""
+ width="65" />
+ <icon
+ height="16"
+ image_name="red_x.png"
+ layout="topleft"
+ left_delta="20"
+ mouse_opaque="true"
+ name="status_icon_lowest"
+ top_delta="0"
+ width="16" />
+ <icon
+ height="16"
+ layout="topleft"
+ left="10"
+ name="lod_status_message_icon"
+ top_pad="20"
+ width="16" />
+ <text
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left_pad="5"
+ name="lod_status_message_text"
+ top_delta="0"
+ width="584"
+ word_wrap="true"
+ wrap="true" />
+ <view_border
+ bevel_style="none"
+ follows="top|left"
+ height="0"
+ layout="topleft"
+ left="10"
+ name="lod_tab_border"
+ top_pad="20"
+ width="605" />
+ <check_box
+ follows="top|left"
+ height="15"
+ label="Generate Normals"
+ layout="topleft"
+ left="10"
+ name="gen_normals"
+ top_pad="20" />
+ <text
+ enabled="false"
+ follows="top|left"
+ height="15"
+ initial_value="Crease Angle:"
+ layout="topleft"
+ left="200"
+ name="crease_label"
+ top_delta="0"
+ value="Crease Angle:"
+ width="100" />
+ <spinner
+ enabled="false"
+ follows="top|left"
+ height="20"
+ initial_value="75"
+ layout="topleft"
+ left_pad="5"
+ max_val="180"
+ name="crease_angle"
+ value="75"
+ width="60" />
+ </panel>
+ <!-- PHYSYCS PANEL -->
+ <panel
+ help_topic="upload_model_physics"
+ label="Physics"
+ name="physics_panel">
+
+ <!-- ==== STEP 1: Level of Detail ==== -->
+ <view_border
+ bevel_style="none"
+ follows="top|left"
+ height="275"
+ layout="topleft"
+ left="3"
+ name="physics_tab_border"
+ top_pad="0"
+ width="619"/>
+ <panel
+ bg_alpha_color="0 0 0 0"
+ bg_opaque_color="0 0 0 0.3"
+ follows="top|left"
+ height="21"
+ left="18"
+ name="physics geometry"
+ top="15"
+ visible="true"
+ width="589">
+ <text
+ follows="top|left"
+ font="SansSerif"
+ height="20"
+ layout="topleft"
+ left="0"
+ name="first_step_name"
+ text_color="White"
+ top_pad="0"
+ width="210">
+ Step 1: Level of Detail
+ </text>
+ <combo_box
+ follows="left|top"
+ height="18"
+ left_pad="10"
+ name="physics_lod_combo"
+ width="130"
+ tool_tip="LOD to use for physics shape">
+ <combo_item name="choose_one"> Choose one... </combo_item>
+ <combo_item name="physics_high"> High </combo_item>
+ <combo_item name="physics_medium"> Medium </combo_item>
+ <combo_item name="physics_low"> Low </combo_item>
+ <combo_item name="physics_lowest"> Lowest </combo_item>
+ <combo_item name="load_from_file"> From file </combo_item>
+ </combo_box>
+ <line_editor
+ follows="left|top"
+ left_pad="10"
+ value=""
+ name="physics_file"
+ height="20"
+ width="154"/>
+ <button
+ follows="left|top"
+ height="20"
+ left_pad="4"
+ name="physics_browse"
+ label="Browse..."
+ width="70"/>
+ <!-- <check_box name="physics_optimize" follows="left|top" width="130" left="10" top_pad="5" height="20" label="Optimize"/>
+ <check_box name="physics_use_hull" follows="left|top" width="130" left_pad="5" height="20" label="Use Convex Hull"/> -->
+ </panel>
+
+ <!-- ==== STEP 2: Analyze ==== -->
+ <view_border
+ bevel_style="none"
+ follows="top|left"
+ height="0"
+ layout="topleft"
+ left="18"
+ name="physics_tab_border"
+ top_pad="15"
+ width="589"/>
+ <panel
+ bg_alpha_color="0 0 0 0"
+ bg_opaque_color="0 0 0 0.3"
+ height="65"
+ follows="top|left"
+ left="18"
+ name="physics analysis"
+ top_pad="15"
+ visible="true"
+ width="589">
+ <text
+ follows="left|top"
+ font="SansSerif"
+ height="20"
+ layout="topleft"
+ left="0"
+ name="method_label"
+ text_color="White"
+ top_pad="0">
+ Step 2: Analyze
+ </text>
+ <text
+ follows="top|left"
+ height="15"
+ layout="topleft"
+ name="analysis_method_label"
+ top_pad="10"
+ width="100">
+ Method:
+ </text>
+ <text
+ follows="top|left"
+ height="15"
+ name="quality_label"
+ layout="topleft"
+ left_pad="15"
+ width="100">
+ Quality:
+ </text>
+ <text
+ follows="top|left"
+ height="15"
+ name="smooth_method_label"
+ layout="topleft"
+ left_pad="15"
+ width="100">
+ Smooth:
+ </text>
+ <combo_box
+ follows="top|left"
+ layout="topleft"
+ left="0"
+ name="Method"
+ top_pad="0"
+ height="20"
+ width="100"/>
+ <combo_box
+ follows="top|left"
+ layout="topleft"
+ left_pad="15"
+ name="Decompose Quality"
+ height="20"
+ width="100"/>
+ <combo_box
+ height="20"
+ follows="top|left"
+ layout="topleft"
+ left_pad="15"
+ name="Cosine%"
+ width="100"/>
+ <check_box
+ follows="top|left"
+ label="Close Holes"
+ layout="topleft"
+ left_pad="10"
+ name="Close Holes (Slow)"
+ height="15"/>
+ <button
+ bottom="1"
+ follows="top|right"
+ height="20"
+ label="Analyze"
+ layout="bottomleft"
+ name="Decompose"
+ right="-1"
+ width="90"/>
+ <button
+ follows="top|left"
+ height="20"
+ label="Cancel"
+ layout="topleft"
+ left_delta="0"
+ name="decompose_cancel"
+ visible="false"
+ width="90"/>
+ </panel>
+
+ <!-- ==== STEP 3: Simplify ==== -->
+ <view_border
+ bevel_style="none"
+ follows="top|left"
+ height="0"
+ layout="topleft"
+ left="18"
+ name="physics_tab_border"
+ top_pad="15"
+ width="589"/>
+ <panel
+ bg_alpha_color="0 0 0 0"
+ bg_opaque_color="0 0 0 0.3"
+ follows="top|left"
+ height="66"
+ left="18"
+ name="physics simplification"
+ top_pad="15"
+ width="589">
+ <text
+ text_color="White"
+ follows="left|top"
+ height="20"
+ left="0"
+ name="second_step_label"
+ top_pad="0"
+ font="SansSerif">
+ Step 3: Simplify
+ </text>
+ <text
+ name="simp_method_header"
+ top_pad="10"
+ height="15"
+ width="100"
+ follows="top|left">
+ Method:
+ </text>
+ <text
+ follows="top|left"
+ left_pad="40"
+ name="pass_method_header"
+ height="15"
+ width="41">
+ Passes:
+ </text>
+ <text
+ follows="top|left"
+ left_pad="40"
+ name="Detail Scale label"
+ height="15"
+ width="80">
+ Detail scale:
+ </text>
+ <text
+ follows="top|left"
+ left_delta="0"
+ name="Retain%_label"
+ height="15"
+ width="80"
+ visible="false">
+ Retain:
+ </text>
+ <combo_box
+ follows="top|left"
+ height="20"
+ left="0"
+ name="Simplify Method"
+ top_pad="0"
+ width="100"/>
+ <combo_box
+ height="20"
+ follows="top|left"
+ left_pad="40"
+ name="Combine Quality"
+ width="41"
+ value="1">
+ </combo_box>
+ <spinner
+ follows="top|left"
+ name="Detail Scale"
+ height="20"
+ left_pad="40"
+ width="60"/>
+ <spinner
+ name="Retain%"
+ decimal_digits="0"
+ width="60"
+ follows="top|left"
+ height="20"
+ left_delta="0"
+ visible="false"/>
+ <button
+ follows="top|left"
+ height="20"
+ label="Simplify"
+ left_pad="40"
+ name="Simplify"
+ width="90"/>
+ <button
+ follows="top|left"
+ height="20"
+ label="Cancel"
+ layout="topleft"
+ left_delta="0"
+ name="simplify_cancel"
+ width="90"/>
+ </panel>
+
+ <!-- ==== Results ==== -->
+ <view_border
+ bevel_style="none"
+ follows="top|left"
+ height="0"
+ layout="topleft"
+ left="18"
+ name="physics_tab_border"
+ top_pad="15"
+ width="589"/>
+ <panel
+ bg_alpha_color="0 0 0 0"
+ bg_opaque_color="0 0 0 0.3"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="18"
+ name="physics info"
+ top_pad="15"
+ width="589">
+ <text
+ follows="top|left"
+ height="15"
+ layout="topleft"
+ left="0"
+ text_color="White"
+ top_pad="0"
+ name="results_text"
+ width="50">
+ Results:
+ </text>
+ <text
+ follows="top|left"
+ height="15"
+ layout="topleft"
+ left_pad="0"
+ text_color="White"
+ top_delta="0"
+ name="physics_triangles"
+ width="90">
+ Triangles: [TRIANGLES],
+ </text>
+ <text
+ follows="top|left"
+ height="15"
+ layout="topleft"
+ left_pad="0"
+ name="physics_points"
+ top_delta="0"
+ text_color="White"
+ width="85">
+ Vertices: [POINTS],
+ </text>
+ <text
+ follows="top|left"
+ height="15"
+ layout="topleft"
+ left_pad="0"
+ name="physics_hulls"
+ top_delta="0"
+ text_color="White">
+ Hulls: [HULLS]
+ </text>
+ </panel>
+ </panel>
+ <!-- MODIFIERS PANEL -->
+ <panel
+ label="Upload options"
+ name="modifiers_panel"
+ help_topic="upload_model_modifiers">
+ <view_border
+ bevel_style="none"
+ follows="top|left"
+ height="275"
+ layout="topleft"
+ left="3"
+ name="border"
+ top_pad="0"
+ width="619"/>
+ <text
+ follows="top|left"
+ height="16"
+ left="20"
+ name="scale_label"
+ text_color="White"
+ top="15"
+ width="140">
+ Scale (1=no scaling):
+ </text>
+ <spinner
+ height="20"
+ follows="top|left"
+ left_pad="10"
+ max_val="64.0"
+ min_val="0.01"
+ name="import_scale"
+ top_delta="-4"
+ value="1.0"
+ width="80"/>
+ <text
+ follows="top|left"
+ height="15"
+ left_pad="20"
+ name="dimensions_label"
+ text_color="White"
+ width="90">
+ Dimensions:
+ </text>
+ <text
+ follows="top|left"
+ height="15"
+ left_pad="0"
+ name="import_dimensions"
+ text_color="White"
+ width="140">
+ [X] X [Y] X [Z]
+ </text>
+ <check_box
+ height="15"
+ follows="top|left"
+ name="upload_textures"
+ label="Include textures"
+ label_text.text_color="White"
+ left="20"
+ top_pad="20"/>
+ <view_border
+ bevel_style="none"
+ follows="top|left"
+ height="0"
+ layout="topleft"
+ name="border"
+ top_pad="20"
+ width="579"/>
+ <text
+ follows="top|left"
+ height="15"
+ left="20"
+ name="include_label"
+ text_color="White"
+ top_pad="20"
+ width="150">
+ For avatar models only:
+ </text>
+ <check_box
+ follows="top|left"
+ height="15"
+ label="Include skin weight"
+ label_text.text_color="White"
+ name="upload_skin"
+ top_pad="15"/>
+ <check_box
+ follows="top|left"
+ height="15"
+ label="Include joint positions"
+ label_text.text_color="White"
+ name="upload_joints"
+ top_pad="15"/>
+ <text
+ follows="top|left"
+ height="15"
+ layout="topleft"
+ left="220"
+ name="pelvis_offset_label"
+ text_color="White"
+ top="134"
+ width="200">
+ Z offset (raise or lower avatar):
+ </text>
+ <spinner
+ follows="top|left"
+ height="20"
+ min_val="-3.00"
+ max_val="3.0"
+ name="pelvis_offset"
+ top_pad="10"
+ value="0.0"
+ width="80"/>
+ </panel>
+ </tab_container>
+ <panel
+ follows="top|left"
+ height="80"
+ layout="top|left"
+ left="0"
+ name="weights_and_warning_panel"
+ top_pad="3"
+ width="625">
+ <button
+ follows="top|left"
+ label="Calculate weights &amp; fee"
+ label_color="White"
+ layout="topleft"
+ left="3"
+ name="calculate_btn"
+ top="3"
+ height="20"
+ width="150"
+ tool_tip="Calculate weights &amp;fee"/>
+ <button
+ follows="top|left"
+ label="Cancel"
+ label_color="White"
+ layout="topleft"
+ left_pad="6"
+ name="cancel_btn"
+ top="3"
+ height="20"
+ width="80"/>
+ <button
+ follows="top|left"
+ label="Upload"
+ layout="topleft"
+ label_color="White"
+ left="35"
+ name="ok_btn"
+ top="3"
+ height="20"
+ visible="false"
+ width="80"
+ tool_tip="Upload to simulator"/>
+ <button
+ follows="top|right"
+ label="Clear settings &amp; reset form"
+ label_color="White"
+ layout="topleft"
+ name="reset_btn"
+ right="-2"
+ top="3"
+ height="20"
+ width="155"/>
+ <!-- ========== WEIGHTS ==========-->
+ <text
+ follows="top|left"
+ height="15"
+ layout="topleft"
+ left="5"
+ name="upload_fee"
+ top_pad="10"
+ width="130"
+ word_wrap="true">
+ Upload fee: L$ [FEE]
+ </text>
+ <text
+ height="15"
+ layout="topleft"
+ left_pad="0"
+ name="prim_weight"
+ top_delta="0"
+ width="120"
+ word_wrap="true">
+ Land impact: [EQ]
+ </text>
+ <text
+ height="15"
+ layout="topleft"
+ left_pad="0"
+ name="download_weight"
+ top_delta="0"
+ width="100"
+ word_wrap="true">
+ Download: [ST]
+ </text>
+ <text
+ height="15"
+ top_delta="0"
+ layout="topleft"
+ left_pad="0"
+ name="physics_weight"
+ width="90"
+ word_wrap="true">
+ Physics: [PH]
+ </text>
+ <text
+ height="15"
+ top_delta="0"
+ layout="topleft"
+ left_pad="0"
+ name="server_weight"
+ width="83"
+ word_wrap="true">
+ Server: [SIM]
+ </text>
+ <!-- ========== NOTE MESSAGE ========== -->
+ <text
+ font="SansSerif"
+ layout="topleft"
+ left="6"
+ name="warning_title"
+ top_pad="10"
+ text_color="DrYellow"
+ visible="false"
+ width="40">
+ NOTE:
+ </text>
+ <text
+ text_color="White"
+ height="20"
+ layout="topleft"
+ left_pad="1"
+ name="warning_message"
+ parse_urls="true"
+ top_delta="2"
+ wrap="true"
+ width="462"
+ visible="false">
+ You dont have rights to upload mesh models. [[VURL] Find out how] to get certified.
+ </text>
+ <text text_color="Yellow" layout="topleft" top_delta="20" left="6" name="status">[STATUS]</text>
+
+ </panel>
+</panel>
+
+<text
+ follows="left|top"
+ layout="topleft"
+ left="640"
+ name="lod_label"
+ text_color="White"
+ top="13"
+ height="15"
+ width="290">
+ Preview:
+ </text>
+<panel
+ border="true"
+ bevel_style="none"
+ follows="top|left"
+ name="preview_panel"
+ top_pad="4"
+ width="290"
+ height="290"/>
+
+<panel
+ follows="all"
+ height="130"
+ layout="topleft"
+ name="right_panel"
+ top_pad="5"
+ width="290">
+ <combo_box
+ top_pad="3"
+ follows="left|top"
+ height="18"
+ layout="topleft"
+ name="preview_lod_combo"
+ width="150"
+ tool_tip="LOD to view in preview render">
+ <combo_item name="high"> High </combo_item>
+ <combo_item name="medium"> Medium </combo_item>
+ <combo_item name="low"> Low </combo_item>
+ <combo_item name="lowest"> Lowest </combo_item>
+ </combo_box>
+ <text
+ follows="top|left"
+ layout="topleft"
+ text_color="White"
+ top="5"
+ left_pad="20"
+ name="label_display"
+ width="50">
+ Display...
+ </text>
+ <check_box
+ follows="top|left"
+ label="Edges"
+ label_text.text_color="White"
+ layout="topleft"
+ left_delta="0"
+ name="show_edges"
+ top_pad="8">
+ </check_box>
+ <check_box
+ follows="top|left"
+ label="Physics"
+ label_text.text_color="White"
+ layout="topleft"
+ name="show_physics"
+ top_pad="8">
+ </check_box>
+ <check_box
+ follows="top|left"
+ label="Textures"
+ label_text.text_color="White"
+ layout="topleft"
+ name="show_textures"
+ top_pad="8">
+ </check_box>
+ <check_box
+ follows="top|left"
+ label="Skin weights"
+ label_text.text_color="White"
+ layout="topleft"
+ name="show_skin_weight"
+ top_pad="8">
+ </check_box>
+ <check_box
+ follows="top|left"
+ label="Joints"
+ label_text.text_color="White"
+ layout="topleft"
+ name="show_joint_positions"
+ top_pad="8">
+ </check_box>
+ <text
+ follows="top|left"
+ layout="topleft"
+ left="2"
+ name="physics_explode_label"
+ top="85"
+ width="150">
+ Preview Spread:
+ </text>
+ <slider
+ name="physics_explode"
+ follows="top|left"
+ top="100"
+ left="0"
+ min_val="0.0"
+ max_val="3.0"
+ height="20"
+ width="150"/>
+</panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_moveview.xml b/indra/newview/skins/default/xui/en/floater_moveview.xml
index 6f29255a6b..4e7ee7913f 100644
--- a/indra/newview/skins/default/xui/en/floater_moveview.xml
+++ b/indra/newview/skins/default/xui/en/floater_moveview.xml
@@ -1,17 +1,21 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
+ positioning="specified"
+ left="320"
+ bottom="-80"
legacy_header_height="18"
- can_dock="true"
+ can_dock="false"
can_minimize="true"
- can_close="false"
- follows="bottom"
+ can_close="true"
height="110"
layout="topleft"
name="move_floater"
help_topic="move_floater"
save_rect="true"
save_visibility="true"
- save_dock_state="true"
+ single_instance="true"
+ chrome="true"
+ title="WALK / RUN / FLY"
width="133">
<string
name="walk_forward_tooltip">
diff --git a/indra/newview/skins/default/xui/en/floater_my_appearance.xml b/indra/newview/skins/default/xui/en/floater_my_appearance.xml
new file mode 100644
index 0000000000..fdea7a821a
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_my_appearance.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+
+<floater
+ positioning="cascading"
+ legacy_header_height="18"
+ can_resize="true"
+ height="588"
+ layout="topleft"
+ name="floater_my_appearance"
+ help_topic="appearance"
+ save_rect="true"
+ single_instance="true"
+ reuse_instance="true"
+ title="APPEARANCE"
+ min_height="440"
+ min_width="333"
+ width="333">
+ <panel
+ top="18"
+ class="sidepanel_appearance"
+ name="main_panel"
+ filename="sidepanel_appearance.xml"
+ label="Edit Appearance"
+ font="SansSerifBold"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_my_inventory.xml b/indra/newview/skins/default/xui/en/floater_my_inventory.xml
new file mode 100644
index 0000000000..184f296255
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_my_inventory.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<floater
+ positioning="cascading"
+ can_close="true"
+ can_resize="true"
+ height="570"
+ help_topic="sidebar_inventory"
+ min_width="333"
+ min_height="440"
+ name="floater_my_inventory"
+ save_rect="true"
+ save_visibility="true"
+ reuse_instance="true"
+ title="INVENTORY"
+ width="333" >
+ <panel
+ class="sidepanel_inventory"
+ name="main_panel"
+ filename="sidepanel_inventory.xml"
+ follows="all"
+ top="0"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_my_web_profile.xml b/indra/newview/skins/default/xui/en/floater_my_web_profile.xml
new file mode 100644
index 0000000000..df46fc198f
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_my_web_profile.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater name="floater_my_web_profile"
+ help_topic="web_profile"
+ width="780"
+ height="775"
+ save_rect="true"
+ single_instance="true"
+ reuse_instance="false"
+ filename="floater_web_content.xml"/> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/floater_nearby_chat.xml b/indra/newview/skins/default/xui/en/floater_nearby_chat.xml
deleted file mode 100644
index 4c5113aa55..0000000000
--- a/indra/newview/skins/default/xui/en/floater_nearby_chat.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater
- border_visible="false"
- border="false"
- bg_opaque_image="Window_Foreground"
- bg_alpha_image="Window_Background"
- bg_alpha_image_overlay="DkGray_66"
- legacy_header_height="18"
- can_minimize="true"
- can_tear_off="false"
- can_resize="true"
- can_drag_on_left="false"
- can_close="false"
- can_dock="true"
- bevel_style="in"
- height="300"
- min_width="235"
- layout="topleft"
- name="nearby_chat"
- help_topic="nearby_chat"
- save_rect="true"
- title="NEARBY CHAT"
- save_dock_state="true"
- save_visibility="true"
- single_instance="true"
- width="320">
- <check_box
- bottom_delta="36"
- control_name="TranslateChat"
- enabled="true"
- height="16"
- label="Translate chat (powered by Google)"
- layout="topleft"
- left="5"
- name="translate_chat_checkbox"
- width="230" />
- <chat_history
- parse_urls="true"
- bg_readonly_color="ChatHistoryBgColor"
- bg_writeable_color="ChatHistoryBgColor"
- follows="all"
- left="5"
- top_delta="17"
- layout="topleft"
- height="260"
- name="chat_history"
- parse_highlights="true"
- text_color="ChatHistoryTextColor"
- text_readonly_color="ChatHistoryTextColor"
- right_widget_pad="5"
- left_widget_pad="0"
- width="315" />
-</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_object_weights.xml b/indra/newview/skins/default/xui/en/floater_object_weights.xml
new file mode 100644
index 0000000000..eb283a1043
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_object_weights.xml
@@ -0,0 +1,342 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ can_close="true"
+ can_tear_off="false"
+ height="315"
+ help_topic="object_weights"
+ layout="topleft"
+ name="object_weights"
+ save_rect="true"
+ single_instance="true"
+ title="ADVANCED"
+ width="200">
+ <floater.string
+ name="nothing_selected"
+ value="--"/>
+
+ <text
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="selected_text"
+ text_color="EmphasisColor"
+ top="10"
+ value="SELECTED"
+ width="180" />
+ <text
+ follows="left|top"
+ halign="right"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="objects"
+ top_pad="3"
+ value="--"
+ width="40" />
+ <text
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left_pad="10"
+ name="objects_label"
+ top_delta="0"
+ value="Objects"
+ width="130" />
+ <text
+ follows="left|top"
+ halign="right"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="prims"
+ top_pad="3"
+ value="--"
+ width="40" />
+ <text
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left_pad="10"
+ name="prims_label"
+ top_delta="0"
+ value="Prims"
+ width="130" />
+ <view_border
+ bevel_style="none"
+ follows="top|left"
+ height="0"
+ layout="topleft"
+ left="10"
+ name="selected_text_border"
+ top_pad="5"
+ width="180"/>
+
+
+ <text
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="weights_of_selected_text"
+ text_color="EmphasisColor"
+ top_pad="10"
+ value="WEIGHTS OF SELECTED"
+ width="180" />
+ <text
+ follows="left|top"
+ halign="right"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="download"
+ top_pad="3"
+ value="--"
+ width="40" />
+ <loading_indicator
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="34"
+ name="download_loading_indicator"
+ top_delta="0"
+ width="16" />
+ <text
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left_pad="10"
+ name="download_label"
+ top_delta="0"
+ value="Download"
+ width="130" />
+ <text
+ follows="left|top"
+ halign="right"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="physics"
+ top_pad="3"
+ value="--"
+ width="40" />
+ <loading_indicator
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="34"
+ name="physics_loading_indicator"
+ top_delta="0"
+ width="16" />
+ <text
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left_pad="10"
+ name="physics_label"
+ top_delta="0"
+ value="Physics"
+ width="130" />
+ <text
+ follows="left|top"
+ halign="right"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="server"
+ top_pad="3"
+ value="--"
+ width="40" />
+ <loading_indicator
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="34"
+ name="server_loading_indicator"
+ top_delta="0"
+ width="16" />
+ <text
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left_pad="10"
+ name="server_label"
+ top_delta="0"
+ value="Server"
+ width="130" />
+ <text
+ follows="left|top"
+ halign="right"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="display"
+ top_pad="3"
+ value="--"
+ width="40" />
+ <loading_indicator
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="34"
+ name="display_loading_indicator"
+ top_delta="0"
+ width="16" />
+ <text
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left_pad="10"
+ name="display_label"
+ top_delta="0"
+ value="Display"
+ width="130" />
+ <view_border
+ bevel_style="none"
+ follows="top|left"
+ height="0"
+ layout="topleft"
+ left="10"
+ name="weights_text_border"
+ top_pad="5"
+ width="180"/>
+
+
+ <text
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="land_impacts_text"
+ text_color="EmphasisColor"
+ top_pad="10"
+ value="LAND IMPACTS"
+ width="180" />
+ <text
+ follows="left|top"
+ halign="right"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="selected"
+ top_pad="3"
+ value="--"
+ width="40" />
+ <loading_indicator
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="34"
+ name="selected_loading_indicator"
+ top_delta="0"
+ width="16" />
+ <text
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left_pad="10"
+ name="selected_label"
+ top_delta="0"
+ value="Selected"
+ width="130" />
+ <text
+ follows="left|top"
+ halign="right"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="rezzed_on_land"
+ top_pad="3"
+ value="--"
+ width="40" />
+ <loading_indicator
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="34"
+ name="rezzed_on_land_loading_indicator"
+ top_delta="0"
+ width="16" />
+ <text
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left_pad="10"
+ name="rezzed_on_land_label"
+ top_delta="0"
+ value="Rezzed on land"
+ width="130" />
+ <text
+ follows="left|top"
+ halign="right"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="remaining_capacity"
+ top_pad="3"
+ value="--"
+ width="40" />
+ <loading_indicator
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="34"
+ name="remaining_capacity_loading_indicator"
+ top_delta="0"
+ width="16" />
+ <text
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left_pad="10"
+ name="remaining_capacity_label"
+ top_delta="0"
+ value="Remaining capacity"
+ width="130" />
+ <text
+ follows="left|top"
+ halign="right"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="total_capacity"
+ top_pad="3"
+ value="--"
+ width="40" />
+ <loading_indicator
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="34"
+ name="total_capacity_loading_indicator"
+ top_delta="0"
+ width="16" />
+ <text
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left_pad="10"
+ name="total_capacity_label"
+ top_delta="0"
+ value="Total capacity"
+ width="130" />
+ <view_border
+ bevel_style="none"
+ follows="top|left"
+ height="0"
+ layout="topleft"
+ left="10"
+ name="land_impacts_text_border"
+ top_pad="5"
+ width="180"/>
+
+ <text
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="help_SLURL"
+ top_pad="10"
+ value="[secondlife:///app/help/object_weights What is all this?...]"
+ width="180" />
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_openobject.xml b/indra/newview/skins/default/xui/en/floater_openobject.xml
index 41a440aaa0..f526970ad0 100644
--- a/indra/newview/skins/default/xui/en/floater_openobject.xml
+++ b/indra/newview/skins/default/xui/en/floater_openobject.xml
@@ -22,6 +22,7 @@
layout="topleft"
left="10"
name="object_name"
+ parse_urls="false"
top="20"
width="284">
[DESC]:
diff --git a/indra/newview/skins/default/xui/en/floater_outfit_save_as.xml b/indra/newview/skins/default/xui/en/floater_outfit_save_as.xml
index 068737494f..bbe280582b 100644
--- a/indra/newview/skins/default/xui/en/floater_outfit_save_as.xml
+++ b/indra/newview/skins/default/xui/en/floater_outfit_save_as.xml
@@ -4,7 +4,7 @@
can_minimize="false"
height="100"
layout="topleft"
- title="Save Outfit"
+ title="SAVE OUTFIT"
name="modal container"
width="240">
<button
diff --git a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
index 9db6568ee3..ffbb6aa28b 100644
--- a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
+++ b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
@@ -8,6 +8,7 @@
layout="topleft"
name="outgoing call"
help_topic="outgoing_call"
+ save_dock_state="true"
title="CALLING"
width="410">
<floater.string
diff --git a/indra/newview/skins/default/xui/en/floater_people.xml b/indra/newview/skins/default/xui/en/floater_people.xml
new file mode 100644
index 0000000000..08d0b00a83
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_people.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
+
+<floater
+ positioning="cascading"
+ can_close="true"
+ can_resize="true"
+ height="570"
+ help_topic="sidebar_people"
+ min_height="440"
+ min_width="333"
+ layout="topleft"
+ name="floater_people"
+ save_rect="true"
+ single_instance="true"
+ reuse_instance="true"
+ title="PEOPLE"
+ width="333">
+ <panel_container
+ default_panel_name="panel_people"
+ follows="all"
+ height="570"
+ name="main_panel"
+ width="333">
+ <panel
+ class="panel_people"
+ name="panel_people"
+ filename="panel_people.xml"/>
+ <panel
+ class="panel_group_info_sidetray"
+ name="panel_group_info_sidetray"
+ filename="panel_group_info_sidetray.xml"
+ label="Group Profile"
+ font="SansSerifBold"/>
+ <panel
+ class="panel_block_list_sidetray"
+ name="panel_block_list_sidetray"
+ filename="panel_block_list_sidetray.xml"
+ label="Blocked Residents &amp; Objects"
+ font="SansSerifBold"/>
+ </panel_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_picks.xml b/indra/newview/skins/default/xui/en/floater_picks.xml
new file mode 100644
index 0000000000..984894b016
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_picks.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<floater
+ positioning="cascading"
+ can_close="true"
+ can_resize="true"
+ height="572"
+ help_topic="sidebar_me"
+ min_width="333"
+ min_height="440"
+ name="floater_picks"
+ save_rect="true"
+ save_visibility="true"
+ reuse_instance="true"
+ title="Picks"
+ width="333" >
+ <panel
+ class="panel_me"
+ name="main_panel"
+ filename="panel_me.xml"
+ follows="all"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_places.xml b/indra/newview/skins/default/xui/en/floater_places.xml
new file mode 100644
index 0000000000..b241e265a9
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_places.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+
+<floater
+ positioning="cascading"
+ legacy_header_height="18"
+ can_resize="true"
+ height="588"
+ layout="topleft"
+ name="floater_places"
+ help_topic="floater_places"
+ save_rect="true"
+ reuse_instance="true"
+ title="PLACES"
+ min_height="440"
+ min_width="333"
+ width="333">
+ <panel
+ top="18"
+ class="panel_places"
+ name="main_panel"
+ filename="panel_places.xml"
+ label="Places"
+ font="SansSerifBold"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_postcard.xml b/indra/newview/skins/default/xui/en/floater_postcard.xml
deleted file mode 100644
index b4ecedd981..0000000000
--- a/indra/newview/skins/default/xui/en/floater_postcard.xml
+++ /dev/null
@@ -1,149 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater
- legacy_header_height="18"
- auto_tile="true"
- can_minimize="false"
- can_resize="true"
- height="380"
- layout="topleft"
- min_height="380"
- min_width="450"
- name="Postcard"
- help_topic="postcard"
- title="EMAIL SNAPSHOT"
- width="450">
- <floater.string
- name="default_subject">
- Postcard from [SECOND_LIFE].
- </floater.string>
- <floater.string
- name="default_message">
- Check this out!
- </floater.string>
- <floater.string
- name="upload_message">
- Sending...
- </floater.string>
- <text
- type="string"
- length="1"
- bottom="35"
- follows="top|left"
- font="SansSerif"
- layout="topleft"
- left="12"
- name="to_label">
- Recipient&apos;s Email:
- </text>
- <line_editor
- follows="left|top"
- height="20"
- layout="topleft"
- left_delta="108"
- name="to_form"
- top_delta="-4"
- width="150" />
- <text
- type="string"
- length="1"
- bottom_delta="23"
- follows="top|left"
- font="SansSerif"
- layout="topleft"
- left="12"
- name="from_label">
- Your Email:
- </text>
- <line_editor
- follows="left|top"
- height="20"
- layout="topleft"
- left_delta="108"
- name="from_form"
- top_delta="-4"
- width="150" />
- <text
- type="string"
- length="1"
- bottom_delta="23"
- follows="top|left"
- font="SansSerif"
- layout="topleft"
- left="12"
- name="name_label">
- Your Name:
- </text>
- <line_editor
- follows="left|top"
- height="20"
- layout="topleft"
- left_delta="108"
- max_length_bytes="100"
- name="name_form"
- top_delta="-4"
- width="150" />
- <text
- type="string"
- length="1"
- bottom_delta="23"
- follows="top|left"
- font="SansSerif"
- layout="topleft"
- left="12"
- name="subject_label">
- Subject:
- </text>
- <line_editor
- follows="left|top"
- height="20"
- label="Type your subject here."
- layout="topleft"
- left_delta="108"
- max_length_bytes="100"
- name="subject_form"
- top_delta="-4"
- width="150" />
- <text
- type="string"
- length="1"
- bottom_delta="23"
- follows="top|left"
- font="SansSerif"
- layout="topleft"
- left="12"
- name="msg_label">
- Message:
- </text>
- <text_editor
- type="string"
- length="1"
- follows="left|top|right|bottom"
- height="140"
- layout="topleft"
- left_delta="0"
- max_length="700"
- name="msg_form"
- word_wrap="true"
- top_pad="10"
- width="420">
- Type your message here.
- </text_editor>
- <button
- follows="right|bottom"
- height="23"
- label="Cancel"
- layout="topleft"
- name="cancel_btn"
- right="-10"
- top="350"
- width="100" />
- <button
- follows="right|bottom"
- height="23"
- label="Send"
- layout="topleft"
- left_delta="-106"
- name="send_btn"
- top_delta="0"
- width="100" />
-</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_preferences.xml b/indra/newview/skins/default/xui/en/floater_preferences.xml
index 8eee8f44b5..bd6faf4ed8 100644
--- a/indra/newview/skins/default/xui/en/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/en/floater_preferences.xml
@@ -1,12 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
legacy_header_height="18"
- open_centered="true"
+ positioning="centered"
default_tab_group="1"
height="460"
layout="topleft"
name="Preferences"
help_topic="preferences"
+ save_rect="true"
single_instance="true"
title="PREFERENCES"
width="658">
@@ -45,7 +46,7 @@
name="pref core"
tab_group="1"
tab_position="left"
- tab_width="115"
+ tab_width="140"
tab_padding_right="0"
top="21"
width="658">
@@ -96,10 +97,10 @@
filename="panel_preferences_colors.xml"
label="Colors"
layout="topleft"
- help_topic="preferences_im_tab"
+ help_topic="preferences_colors_tab"
name="colors" />
<panel
- class="panel_preference"
+ class="panel_preference_privacy"
filename="panel_preferences_privacy.xml"
label="Privacy"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/floater_preferences_proxy.xml b/indra/newview/skins/default/xui/en/floater_preferences_proxy.xml
new file mode 100644
index 0000000000..93bfe53aae
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_preferences_proxy.xml
@@ -0,0 +1,275 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ legacy_header_height="18"
+ height="500"
+ layout="topleft"
+ name="Proxy Settings Floater"
+ help_topic="proxysettings"
+ title="Proxy Settings"
+ width="500">
+ <check_box
+ control_name="BrowserProxyEnabled"
+ top="38"
+ enabled="true"
+ follows="left|top"
+ height="14"
+ initial_value="false"
+ commit_callback.function="Proxy.Change"
+ label="Use HTTP Proxy for Web pages"
+ left="22"
+ mouse_opaque="true"
+ name="web_proxy_enabled"
+ radio_style="false"
+ width="400"
+ top_pad="5" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ left_delta="23"
+ layout="topleft"
+ name="http_proxy_label"
+ top_pad="10"
+ width="300">
+ HTTP Proxy:
+ </text>
+ <line_editor
+ control_name="BrowserProxyAddress"
+ enabled_control="BrowserProxyEnabled"
+ follows="left|top"
+ font="SansSerif"
+ height="23"
+ layout="topleft"
+ left_delta="0"
+ name="web_proxy_editor"
+ tool_tip="The DNS name or IP address of the HTTP proxy you would like to use."
+ top_pad="4"
+ width="200" />
+ <spinner
+ control_name="BrowserProxyPort"
+ enabled_control="BrowserProxyEnabled"
+ decimal_digits="0"
+ follows="left|top"
+ height="23"
+ increment="1"
+ initial_value="80"
+ label="Port number:"
+ label_width="95"
+ layout="topleft"
+ left_delta="210"
+ max_val="12000"
+ min_val="10"
+ name="web_proxy_port"
+ top_delta="0"
+ tool_tip="The port of the HTTP proxy you would like to use."
+ width="145" />
+ <check_box
+ control_name="Socks5ProxyEnabled"
+ height="16"
+ label="Use SOCKS 5 Proxy for UDP traffic"
+ layout="topleft"
+ left="22"
+ name="socks_proxy_enabled"
+ top_pad="32"
+ width="256"
+ commit_callback.function="Proxy.Change" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left_delta="23"
+ name="socks5_proxy_label"
+ top_pad="10"
+ width="300">
+ SOCKS 5 Proxy:
+ </text>
+ <line_editor
+ control_name="Socks5ProxyHost"
+ enabled_control="Socks5ProxyEnabled"
+ follows="left|top"
+ font="SansSerif"
+ height="23"
+ layout="topleft"
+ left_delta="0"
+ name="socks_proxy_editor"
+ tool_tip="The DNS name or IP address of the SOCKS 5 proxy you would like to use."
+ top_pad="4"
+ width="200"
+ commit_callback.function="Proxy.Change" />
+ <spinner
+ control_name="Socks5ProxyPort"
+ enabled_control="Socks5ProxyEnabled"
+ decimal_digits="0"
+ follows="left|top"
+ height="23"
+ increment="1"
+ initial_value="80"
+ label="Port number:"
+ label_width="95"
+ layout="topleft"
+ left_delta="210"
+ max_val="12000"
+ min_val="10"
+ name="socks_proxy_port"
+ top_delta="0"
+ width="145"
+ tool_tip="The port of the SOCKS 5 proxy you would like to use."
+ commit_callback.function="Proxy.Change" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left="40"
+ name="socks_auth_label"
+ top_pad="15"
+ width="300">
+ SOCKS Authentication:
+ </text>
+ <radio_group
+ control_name="Socks5AuthType"
+ enabled_control="Socks5ProxyEnabled"
+ height="50"
+ layout="topleft"
+ name="socks5_auth_type"
+ top_pad="10"
+ width="120"
+ commit_callback.function="Proxy.Change" >
+ <radio_item
+ height="16"
+ label="No Authentication"
+ layout="topleft"
+ name="Socks5NoAuth"
+ value="None"
+ tool_tip="Socks5 proxy requires no authentication."
+ width="120" />
+ <radio_item
+ height="16"
+ label="Username/Password"
+ layout="topleft"
+ name="Socks5UserPass"
+ value="UserPass"
+ tool_tip="Socks5 proxy requires username/password authentication."
+ width="120" />
+ </radio_group>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left_delta="20"
+ name="socks5_username_label"
+ top_delta="50"
+ width="200">
+ Username:
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ left_pad="15"
+ layout="topleft"
+ name="socks5_password_label"
+ width="200">
+ Password:
+ </text>
+ <line_editor
+ follows="left|top"
+ font="SansSerif"
+ height="23"
+ layout="topleft"
+ left="60"
+ name="socks5_username"
+ tool_tip="The username used to authenticate with your SOCKS 5 server"
+ top_pad="4"
+ width="200"
+ commit_callback.function="Proxy.Change" />
+ <line_editor
+ follows="left|top"
+ font="SansSerif"
+ height="23"
+ layout="topleft"
+ left_pad="15"
+ name="socks5_password"
+ tool_tip="The password used to authenticate with your SOCKS 5 server"
+ top_delta="0"
+ width="200"
+ is_password="true"
+ commit_callback.function="Proxy.Change" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left="25"
+ name="other_proxy_label"
+ top_pad="18"
+ width="300">
+ Other HTTP traffic proxy:
+ </text>
+ <radio_group
+ control_name="HttpProxyType"
+ name="other_http_proxy_type"
+ height="60"
+ layout="topleft"
+ top_pad="9"
+ width="120"
+ left_delta="15"
+ commit_callback.function="Proxy.Change" >
+ <radio_item
+ height="16"
+ label="Do not proxy"
+ layout="topleft"
+ name="OtherNoProxy"
+ value="None"
+ width="120"
+ tool_tip="Non-web HTTP traffic will NOT be sent to any proxy."/>
+ <radio_item
+ height="16"
+ label="Use HTTP Proxy"
+ layout="topleft"
+ name="OtherHTTPProxy"
+ value="Web"
+ width="120"
+ enabled_control="BrowserProxyEnabled"
+ tool_tip="Non-web HTTP will be sent through the configured Web proxy." />
+ <radio_item
+ height="16"
+ label="Use SOCKS 5 Proxy"
+ layout="topleft"
+ name="OtherSocksProxy"
+ value="Socks"
+ width="120"
+ enabled_control="Socks5ProxyEnabled"
+ tool_tip="Non-web HTTP traffic will be sent through the configured Socks 5 proxy."/>
+ </radio_group>
+ <button
+ follows="left|top"
+ height="22"
+ label="OK"
+ label_selected="OK"
+ layout="topleft"
+ left="282"
+ name="OK"
+ top_pad="36"
+ width="90"
+ commit_callback.function="Proxy.OK" />
+ <button
+ follows="left|top"
+ height="22"
+ label="Cancel"
+ label_selected="Cancel"
+ layout="topleft"
+ left_pad="10"
+ name="Cancel"
+ top_delta="0"
+ width="90"
+ commit_callback.function="Proxy.Cancel" />
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_preview_animation.xml b/indra/newview/skins/default/xui/en/floater_preview_animation.xml
index 65efc46c71..3ea5f54f2c 100644
--- a/indra/newview/skins/default/xui/en/floater_preview_animation.xml
+++ b/indra/newview/skins/default/xui/en/floater_preview_animation.xml
@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
legacy_header_height="18"
- auto_tile="true"
height="85"
layout="topleft"
name="preview_anim"
@@ -42,18 +41,26 @@
label_selected="Stop"
layout="topleft"
left="10"
- name="Anim play btn"
+ name="Inworld"
tool_tip="Play this animation so that others can see it"
top="47"
- width="125" />
+ width="125">
+ <button.commit_callback
+ function="PreviewAnim.Play"
+ parameter="Inworld" />
+ </button>
<button
height="20"
label="Play Locally"
label_selected="Stop"
layout="topleft"
left_pad="5"
- name="Anim audition btn"
+ name="Locally"
tool_tip="Play this animation so that only you can see it"
top_delta="0"
- width="125" />
+ width="125">
+ <button.commit_callback
+ function="PreviewAnim.Play"
+ parameter="Locally" />
+ </button>
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_preview_gesture.xml b/indra/newview/skins/default/xui/en/floater_preview_gesture.xml
index a17cf8eea8..8baa0a56f7 100644
--- a/indra/newview/skins/default/xui/en/floater_preview_gesture.xml
+++ b/indra/newview/skins/default/xui/en/floater_preview_gesture.xml
@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
legacy_header_height="18"
- auto_tile="true"
height="460"
layout="topleft"
name="gesture_preview"
@@ -50,17 +49,17 @@
name="desc_label"
top_pad="25"
font.style="BOLD"
- width="100">
+ width="105">
Description:
</text>
<line_editor
follows="left|top"
height="20"
layout="topleft"
- left_delta="89"
+ left_delta="94"
name="desc"
top_delta="-4"
- width="175" />
+ width="170" />
<text
type="string"
length="1"
@@ -96,19 +95,19 @@
name="replace_text"
tool_tip="Replace the trigger word(s) with these words. For example, trigger &apos;hello&apos; replace with &apos;howdy&apos; will turn the chat &apos;I wanted to say hello&apos; into &apos;I wanted to say howdy&apos; as well as playing the gesture!"
top_pad="10"
- width="210">
+ width="215">
Replace with:
</text>
<line_editor
follows="left|top"
height="20"
layout="topleft"
- left_delta="99"
+ left_delta="104"
max_length_bytes="31"
name="replace_editor"
tool_tip="Replace the trigger word(s) with these words. For example, trigger &apos;hello&apos; replace with &apos;howdy&apos; will turn the chat &apos;I wanted to say hello&apos; into &apos;I wanted to say howdy&apos; as well as playing the gesture"
top_delta="-4"
- width="165" />
+ width="160" />
<text
type="string"
length="1"
@@ -120,14 +119,14 @@
font.style="BOLD"
name="key_label"
top_pad="10"
- width="150">
+ width="130">
Shortcut Key:
</text>
<combo_box
height="20"
label="None"
layout="topleft"
- left_delta="154"
+ left_delta="135"
name="modifier_combo"
top_delta="-4"
width="55" />
@@ -362,4 +361,4 @@
name="save_btn"
top_delta="0"
width="80" />
-</floater> \ No newline at end of file
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_preview_notecard.xml b/indra/newview/skins/default/xui/en/floater_preview_notecard.xml
index 8c9e1d52b3..be3b2d179d 100644
--- a/indra/newview/skins/default/xui/en/floater_preview_notecard.xml
+++ b/indra/newview/skins/default/xui/en/floater_preview_notecard.xml
@@ -1,10 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
legacy_header_height="18"
- auto_tile="true"
can_resize="true"
default_tab_group="1"
- follows="left|top"
height="361"
layout="topleft"
min_height="243"
diff --git a/indra/newview/skins/default/xui/en/floater_preview_sound.xml b/indra/newview/skins/default/xui/en/floater_preview_sound.xml
index 62ef4c3097..83a1f5a96f 100644
--- a/indra/newview/skins/default/xui/en/floater_preview_sound.xml
+++ b/indra/newview/skins/default/xui/en/floater_preview_sound.xml
@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
legacy_header_height="18"
- auto_tile="true"
height="85"
layout="topleft"
name="preview_sound"
diff --git a/indra/newview/skins/default/xui/en/floater_preview_texture.xml b/indra/newview/skins/default/xui/en/floater_preview_texture.xml
index a79d2f63cb..137e278ddc 100644
--- a/indra/newview/skins/default/xui/en/floater_preview_texture.xml
+++ b/indra/newview/skins/default/xui/en/floater_preview_texture.xml
@@ -1,9 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
legacy_header_height="18"
- auto_tile="true"
can_resize="true"
- follows="left|top"
height="350"
layout="topleft"
min_height="200"
diff --git a/indra/newview/skins/default/xui/en/floater_price_for_listing.xml b/indra/newview/skins/default/xui/en/floater_price_for_listing.xml
new file mode 100644
index 0000000000..6312366b86
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_price_for_listing.xml
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ legacy_header_height="18"
+ can_minimize="false"
+ height="240"
+ layout="topleft"
+ name="price_for_listing"
+ help_topic="price_for_listing"
+ title="PUBLISH CLASSIFIED AD"
+ width="320">
+ <text
+ type="string"
+ length="1"
+ bottom="200"
+ follows="top|left"
+ font="SansSerif"
+ height="165"
+ layout="topleft"
+ left="15"
+ word_wrap="true"
+ name="explanation_text">
+ Your classified ad will run for one week from the day it is published.
+
+Your ad&apos;s position in the classified listings is determined by how much you choose to pay.
+
+The highest paid ads go to the top of the list, and appear higher in searches.
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="top|right"
+ font="SansSerif"
+ height="20"
+ layout="topleft"
+ left="140"
+ name="price_text"
+ top_delta="135"
+ width="85">
+ Price for Ad:
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="top|right"
+ font="SansSerif"
+ height="20"
+ layout="topleft"
+ left_pad="4"
+ name="price_symbol"
+ top_delta="0"
+ width="20">
+ L$
+ </text>
+ <line_editor
+ follows="top|left"
+ height="20"
+ layout="topleft"
+ left_pad="0"
+ max_length="6"
+ top_delta="-4"
+ name="price_edit"
+ width="60" />
+ <button
+ follows="top|left"
+ height="22"
+ label="OK"
+ layout="topleft"
+ left="105"
+ name="set_price_btn"
+ top_pad="22"
+ width="100" />
+ <button
+ follows="top|left"
+ height="22"
+ label="Cancel"
+ layout="topleft"
+ left_pad="5"
+ name="cancel_btn"
+ width="100" />
+
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_publish_classified.xml b/indra/newview/skins/default/xui/en/floater_publish_classified.xml
index 6ce9ed6e77..322e34272c 100644
--- a/indra/newview/skins/default/xui/en/floater_publish_classified.xml
+++ b/indra/newview/skins/default/xui/en/floater_publish_classified.xml
@@ -36,7 +36,7 @@ Remember, Classified fees are non-refundable.
left="15"
value="50"
min_val="50"
- max_val="99999"
+ max_val="999999"
name="price_for_listing"
top_pad="10"
tool_tip="Price for listing."
diff --git a/indra/newview/skins/default/xui/en/floater_region_debug_console.xml b/indra/newview/skins/default/xui/en/floater_region_debug_console.xml
index cf95257b0a..7c7ee2df4c 100644
--- a/indra/newview/skins/default/xui/en/floater_region_debug_console.xml
+++ b/indra/newview/skins/default/xui/en/floater_region_debug_console.xml
@@ -2,6 +2,7 @@
<floater
name="region_debug_console"
title="Region Debug"
+ can_resize="true"
layout="topleft"
min_height="300"
min_width="300"
@@ -12,7 +13,7 @@
left="10"
type="string"
length="1"
- follows="left|top|right|bottom"
+ follows="left|right|bottom"
font="Monospace"
height="366"
width="576"
diff --git a/indra/newview/skins/default/xui/en/floater_region_info.xml b/indra/newview/skins/default/xui/en/floater_region_info.xml
index 32fb6f97e7..3b58cd08f6 100644
--- a/indra/newview/skins/default/xui/en/floater_region_info.xml
+++ b/indra/newview/skins/default/xui/en/floater_region_info.xml
@@ -16,5 +16,5 @@
name="region_panels"
right="-1"
tab_position="top"
- top="20" />
+ top="20"/>
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_script.xml b/indra/newview/skins/default/xui/en/floater_script.xml
index 12ade86b5f..bd4edb81c8 100644
--- a/indra/newview/skins/default/xui/en/floater_script.xml
+++ b/indra/newview/skins/default/xui/en/floater_script.xml
@@ -2,12 +2,9 @@
<floater
legacy_header_height="18"
background_visible="true"
- follows="left|top|right|bottom"
height="250"
layout="topleft"
- left="0"
name="script_floater"
- top="0"
can_dock="true"
can_minimize="true"
visible="false"
diff --git a/indra/newview/skins/default/xui/en/floater_script_debug_panel.xml b/indra/newview/skins/default/xui/en/floater_script_debug_panel.xml
index d1db5c17ba..b5dd2f97b9 100644
--- a/indra/newview/skins/default/xui/en/floater_script_debug_panel.xml
+++ b/indra/newview/skins/default/xui/en/floater_script_debug_panel.xml
@@ -2,7 +2,6 @@
<floater
legacy_header_height="18"
can_resize="true"
- follows="left|top|right|bottom"
height="200"
layout="topleft"
name="script"
@@ -20,5 +19,6 @@
parse_highlights="true"
read_only="true"
width="420"
+ track_bottom="true"
word_wrap="true" />
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_script_preview.xml b/indra/newview/skins/default/xui/en/floater_script_preview.xml
index 8c03b56040..91a9e67e4c 100644
--- a/indra/newview/skins/default/xui/en/floater_script_preview.xml
+++ b/indra/newview/skins/default/xui/en/floater_script_preview.xml
@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
legacy_header_height="18"
- auto_tile="true"
can_resize="true"
height="570"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/floater_script_queue.xml b/indra/newview/skins/default/xui/en/floater_script_queue.xml
index 60a26fcf1d..f4aca7bb3d 100644
--- a/indra/newview/skins/default/xui/en/floater_script_queue.xml
+++ b/indra/newview/skins/default/xui/en/floater_script_queue.xml
@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
legacy_header_height="18"
- auto_tile="true"
can_resize="true"
height="400"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/floater_search.xml b/indra/newview/skins/default/xui/en/floater_search.xml
index 8770ede7e9..c3e7028dc5 100644
--- a/indra/newview/skins/default/xui/en/floater_search.xml
+++ b/indra/newview/skins/default/xui/en/floater_search.xml
@@ -1,71 +1,18 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
- legacy_header_height="13"
- can_resize="true"
- height="600"
- layout="topleft"
- min_height="400"
- min_width="450"
- name="floater_search"
- help_topic="floater_search"
- save_rect="true"
- save_visibility="true"
- single_instance="true"
- title="FIND"
- width="650">
- <floater.string
- name="loading_text">
- Loading...
- </floater.string>
- <floater.string
- name="done_text">
- Done
- </floater.string>
- <layout_stack
- height="580"
- follows="left|right|top|bottom"
- layout="topleft"
- left="10"
- name="stack1"
- top="20"
- width="630">
- <layout_panel
- height="570"
- layout="topleft"
- left_delta="0"
- top_delta="0"
- name="browser_layout"
- user_resize="false"
- width="630">
- <web_browser
- trusted_content="true"
- follows="left|right|top|bottom"
- layout="topleft"
- left="0"
- name="browser"
- top="0"
- height="540"
- width="630" />
- <text
- follows="bottom|left"
- height="16"
- layout="topleft"
- left_delta="0"
- name="status_text"
- top_pad="10"
- width="150" />
- <text
- visible="false"
- follows="bottom|right"
- height="16"
- left_delta="0"
- name="refresh_search"
- left_pad="0"
- right="-10"
- halign="right"
- width="450">
- Redo search to reflect current God level
- </text>
- </layout_panel>
- </layout_stack>
-</floater>
+ positioning="cascading"
+ legacy_header_height="18"
+ can_resize="true"
+ height="775"
+ layout="topleft"
+ min_height="400"
+ min_width="500"
+ name="floater_search"
+ help_topic="floater_search"
+ save_rect="true"
+ save_visibility="true"
+ title=""
+ initial_mime_type="text/html"
+ width="780"
+ tab_stop="true"
+ filename="floater_web_content.xml"/>
diff --git a/indra/newview/skins/default/xui/en/floater_sell_land.xml b/indra/newview/skins/default/xui/en/floater_sell_land.xml
index 619669d28a..52de9ddd47 100644
--- a/indra/newview/skins/default/xui/en/floater_sell_land.xml
+++ b/indra/newview/skins/default/xui/en/floater_sell_land.xml
@@ -41,14 +41,14 @@
follows="top|left"
left="16"
name="info_parcel_label"
- width="48">
+ width="70">
Parcel:
</text>
<text
top_delta="0"
follows="top|left"
height="16"
- left="56"
+ left="78"
name="info_parcel"
right="-20">
PARCEL NAME
@@ -57,14 +57,14 @@
follows="top|left"
left="16"
name="info_size_label"
- width="48">
+ width="70">
Size:
</text>
<text
follows="top|left"
top_delta="0"
height="32"
- left="56"
+ left="78"
name="info_size"
right="-20">
[AREA] m²
@@ -164,20 +164,21 @@
left_delta="0"
name="sell_to_agent"
top_pad="4"
- width="170" />
+ width="150" />
<button
height="20"
label="Select"
left_pad="5"
name="sell_to_select_agent"
top_delta="0"
- width="60" />
+ width="90" />
<text
follows="top|left"
font="SansSerif"
height="16"
left="30"
- name="sell_objects_label">
+ name="sell_objects_label"
+ width="266">
3. Sell the objects with the land?
</text>
<text
@@ -199,20 +200,20 @@
<radio_item
bottom="40"
height="0"
- left="10"
+ left="2"
name="none"
visible="false" />
<radio_item
top_pad="10"
- height="16"
+ height="18"
label="No, keep ownership of objects"
- left="10"
+ left="2"
name="no" />
<radio_item
top_pad="10"
height="16"
label="Yes, sell objects with land"
- left="10"
+ left="2"
name="yes" />
</radio_group>
<button
@@ -221,7 +222,7 @@
name="show_objects"
left="70"
top_pad="10"
- width="110" />
+ width="140" />
<text
bottom_delta="30"
follows="top|left"
@@ -229,7 +230,7 @@
height="16"
left="16"
name="nag_message_label"
- right="-20">
+ right="-5">
REMEMBER: All sales are final.
</text>
<button
@@ -239,15 +240,15 @@
left_delta="0"
name="sell_btn"
top_pad="10"
- width="130" />
+ width="185" />
<button
follows="bottom|left"
height="20"
label="Cancel"
- left_pad="30"
+ left_pad="5"
name="cancel_btn"
top_delta="0"
- width="90" />
+ width="85" />
</panel>
</scroll_container>
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_snapshot.xml b/indra/newview/skins/default/xui/en/floater_snapshot.xml
index 857932e51a..49d64767cc 100644
--- a/indra/newview/skins/default/xui/en/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/en/floater_snapshot.xml
@@ -1,403 +1,373 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
+ positioning="cascading"
legacy_header_height="18"
- can_minimize="false"
+ can_minimize="true"
can_close="true"
- follows="left|top"
- height="520"
+ height="500"
layout="topleft"
name="Snapshot"
help_topic="snapshot"
save_rect="true"
- save_visibility="true"
+ save_visibility="false"
title="SNAPSHOT PREVIEW"
- width="215">
+ width="470">
<floater.string
name="unknown">
unknown
</floater.string>
- <radio_group
- height="70"
- label="Snapshot type"
- layout="topleft"
- left="10"
- name="snapshot_type_radio"
- top="20"
- width="205">
-<!--
- <radio_item
- height="16"
- label="Share to Web"
- layout="topleft"
- name="share_to_web"
- top_pad="0" />
--->
- <radio_item
- height="16"
- label="Email"
- layout="topleft"
- name="postcard"
- top_pad="2" />
- <radio_item
- height="16"
- label="My inventory (L$[AMOUNT])"
- layout="topleft"
- name="texture"
- top_pad="2" />
- <radio_item
- height="16"
- label="Save to my computer"
- layout="topleft"
- name="local"
- top_pad="2" />
- </radio_group>
- <ui_ctrl
- height="90"
- width="125"
- layout="topleft"
- name="thumbnail_placeholder"
- top_pad="6"
- follows="left|top"
- left="10"
- />
- <text
- type="string"
- font="SansSerifSmall"
- length="1"
- follows="left|top"
- height="14"
- layout="topleft"
- right="-5"
- left_delta="0"
- halign="right"
- name="file_size_label"
- top_pad="8"
- width="195">
- [SIZE] KB
- </text>
- <button
- follows="left|top"
- height="22"
- image_overlay="Refresh_Off"
- layout="topleft"
- left="10"
- name="new_snapshot_btn"
- width="23" />
- <button
- follows="left|top"
- height="23"
- label="Send"
- layout="topleft"
- left_pad="5"
- right="-5"
- name="send_btn"
- width="100" />
+ <string
+ name="postcard_progress_str">
+ Sending Email
+ </string>
+ <string
+ name="profile_progress_str">
+ Posting
+ </string>
+ <string
+ name="inventory_progress_str">
+ Saving to Inventory
+ </string>
+ <string
+ name="local_progress_str">
+ Saving to Computer
+ </string>
+ <string
+ name="profile_succeeded_str">
+ Image uploaded
+ </string>
+ <string
+ name="postcard_succeeded_str">
+ Email Sent!
+ </string>
+ <string
+ name="inventory_succeeded_str">
+ Saved to Inventory!
+ </string>
+ <string
+ name="local_succeeded_str">
+ Saved to Computer!
+ </string>
+ <string
+ name="profile_failed_str">
+ Failed to upload image to your Profile Feed.
+ </string>
+ <string
+ name="postcard_failed_str">
+ Failed to send email.
+ </string>
+ <string
+ name="inventory_failed_str">
+ Failed to save to inventory.
+ </string>
+ <string
+ name="local_failed_str">
+ Failed to save to computer.
+ </string>
<button
follows="left|top"
height="23"
- label="Save (L$[AMOUNT])"
+ image_overlay="TabIcon_Close_Off"
layout="topleft"
- right="-5"
- name="upload_btn"
- top_delta="0"
- width="100" />
- <flyout_button
- follows="left|top"
- height="23"
- label="Save"
- layout="topleft"
- right="-5"
- name="save_btn"
- tool_tip="Save image to a file"
- top_delta="0"
- width="100">
- <flyout_button.item
- label="Save"
- name="save_item"
- value="save" />
- <flyout_button.item
- label="Save As..."
- name="saveas_item"
- value="save as" />
- </flyout_button>
- <button
- follows="left|top"
- height="23"
- label="More"
- layout="topleft"
- left="10"
- name="more_btn"
+ left="236"
+ name="advanced_options_btn"
tool_tip="Advanced options"
- width="80" />
- <button
- follows="left|top"
- height="23"
- label="Less"
- layout="topleft"
- left_delta="0"
- name="less_btn"
- tool_tip="Advanced options"
- top_delta="0"
- width="80" />
- <button
- follows="left|top"
- height="23"
- label="Cancel"
- layout="topleft"
- right="-5"
- left_pad="5"
- name="discard_btn"
- width="100" />
- <text
- type="string"
- length="1"
- follows="top|left"
- height="12"
- layout="topleft"
- left="10"
- name="type_label2"
- top_pad="5"
- width="127">
- Size
- </text>
- <text
- type="string"
- length="1"
- follows="top|left"
- height="12"
- layout="topleft"
- left_pad="5"
- name="format_label"
- top_delta="0"
- width="70">
- Format
- </text>
- <combo_box
- height="23"
- label="Resolution"
- layout="topleft"
- left="10"
- name="postcard_size_combo"
- width="120">
- <combo_box.item
- label="Current Window"
- name="CurrentWindow"
- value="[i0,i0]" />
- <combo_box.item
- label="640x480"
- name="640x480"
- value="[i640,i480]" />
- <combo_box.item
- label="800x600"
- name="800x600"
- value="[i800,i600]" />
- <combo_box.item
- label="1024x768"
- name="1024x768"
- value="[i1024,i768]" />
- <combo_box.item
- label="Custom"
- name="Custom"
- value="[i-1,i-1]" />
- </combo_box>
- <combo_box
- height="23"
- label="Resolution"
- layout="topleft"
- left_delta="0"
- name="texture_size_combo"
- top_delta="0"
- width="127">
- <combo_box.item
- label="Current Window"
- name="CurrentWindow"
- value="[i0,i0]" />
- <combo_box.item
- label="Small (128x128)"
- name="Small(128x128)"
- value="[i128,i128]" />
- <combo_box.item
- label="Medium (256x256)"
- name="Medium(256x256)"
- value="[i256,i256]" />
- <combo_box.item
- label="Large (512x512)"
- name="Large(512x512)"
- value="[i512,i512]" />
- <combo_box.item
- label="Custom"
- name="Custom"
- value="[i-1,i-1]" />
- </combo_box>
- <combo_box
- height="23"
- label="Resolution"
- layout="topleft"
- left_delta="0"
- name="local_size_combo"
- top_delta="0"
- width="127">
- <combo_box.item
- label="Current Window"
- name="CurrentWindow"
- value="[i0,i0]" />
- <combo_box.item
- label="320x240"
- name="320x240"
- value="[i320,i240]" />
- <combo_box.item
- label="640x480"
- name="640x480"
- value="[i640,i480]" />
- <combo_box.item
- label="800x600"
- name="800x600"
- value="[i800,i600]" />
- <combo_box.item
- label="1024x768"
- name="1024x768"
- value="[i1024,i768]" />
- <combo_box.item
- label="1280x1024"
- name="1280x1024"
- value="[i1280,i1024]" />
- <combo_box.item
- label="1600x1200"
- name="1600x1200"
- value="[i1600,i1200]" />
- <combo_box.item
- label="Custom"
- name="Custom"
- value="[i-1,i-1]" />
- </combo_box>
- <combo_box
- height="23"
- label="Format"
- layout="topleft"
- left_pad="5"
- name="local_format_combo"
- width="70">
- <combo_box.item
- label="PNG"
- name="PNG" />
- <combo_box.item
- label="JPEG"
- name="JPEG" />
- <combo_box.item
- label="BMP"
- name="BMP" />
- </combo_box>
- <spinner
- allow_text_entry="false"
- decimal_digits="0"
- follows="left|top"
- height="20"
- increment="32"
- label="Width"
- label_width="40"
- layout="topleft"
- left="10"
- max_val="6016"
- min_val="32"
- name="snapshot_width"
- top_pad="10"
- width="95" />
- <spinner
- allow_text_entry="false"
- decimal_digits="0"
- follows="left|top"
- height="20"
- increment="32"
- label="Height"
- label_width="40"
- layout="topleft"
- left_pad="5"
- max_val="6016"
- min_val="32"
- name="snapshot_height"
- top_delta="0"
- width="95" />
- <check_box
- bottom_delta="20"
- label="Constrain proportions"
- layout="topleft"
- left="10"
- name="keep_aspect_check" />
- <slider
- decimal_digits="0"
- follows="left|top"
- height="15"
- increment="1"
- initial_value="75"
- label="Image quality"
- label_width="100"
- layout="topleft"
- left_delta="0"
- max_val="100"
- name="image_quality_slider"
- top_pad="5"
- width="205" />
- <text
- type="string"
- length="1"
+ top="25"
+ width="23" />
+ <ui_ctrl
+ height="160"
+ width="250"
+ layout="topleft"
+ name="thumbnail_placeholder"
+ top="50"
+ follows="left|top"
+ left="10">
+ <panel
+ background_visible="true"
+ bg_alpha_color="0.9 1 0.9 1"
+ follows="left|top"
+ font="SansSerifLarge"
+ halign="center"
+ height="20"
+ layout="topleft"
+ left="0"
+ length="1"
+ name="succeeded_panel"
+ right="-1"
+ top="0"
+ type="string"
+ visible="false">
+ <text
+ follows="all"
+ font="SansSerif"
+ halign="center"
+ height="18"
+ layout="topleft"
+ left="1"
+ length="1"
+ name="succeeded_lbl"
+ right="-1"
+ text_color="0.2 0.5 0.2 1"
+ top="4"
+ translate="false"
+ type="string">
+ Succeeded
+ </text>
+ </panel>
+ <panel
+ background_visible="true"
+ bg_alpha_color="1 0.9 0.9 1"
+ follows="left|top"
+ font="SansSerifLarge"
+ halign="center"
+ height="20"
+ layout="topleft"
+ left_delta="0"
+ length="1"
+ name="failed_panel"
+ right="-1"
+ top="0"
+ type="string"
+ visible="false">
+ <text
+ follows="all"
+ font="SansSerif"
+ halign="center"
+ height="18"
+ layout="topleft"
+ left="1"
+ length="1"
+ name="failed_lbl"
+ right="-1"
+ text_color="0.5 0.2 0.2 1"
+ top="4"
+ translate="false"
+ type="string">
+ Failed
+ </text>
+ </panel>
+ <loading_indicator
+ follows="left|top"
+ height="48"
+ layout="topleft"
+ name="working_indicator"
+ left="101"
+ top="46"
+ visible="false"
+ width="48" />
+ <text
+ follows="left|top|right"
+ font="SansSerifBold"
+ height="14"
+ layout="topleft"
+ left="5"
+ length="1"
+ halign="center"
+ name="working_lbl"
+ right="-5"
+ top="98"
+ translate="false"
+ type="string"
+ visible="false"
+ width="130">
+ Working
+ </text>
+ <button
+ follows="left|top"
+ height="22"
+ image_overlay="Refresh_Off"
+ layout="topleft"
+ left="20"
+ name="new_snapshot_btn"
+ bottom="-20"
+ visible="false"
+ width="22" />
+ <text
+ follows="left|top"
+ font="SansSerifBold"
+ halign="left"
+ height="18"
+ layout="topleft"
+ left_pad="10"
+ length="1"
+ name="refresh_lbl"
+ right="-5"
+ text_color="red"
+ top_delta="0"
+ translate="false"
+ type="string"
+ visible="false"
+ width="130">
+ Refresh to save.
+ </text>
+ </ui_ctrl>
+ <view_border
+ bevel_style="in"
+ height="21"
+ width="250"
+ layout="topleft"
+ name="img_info_border"
+ top_pad="3"
+ follows="left|top"
+ left_delta="0"
+ />
+ <text
+ type="string"
+ font="SansSerifSmall"
+ length="1"
+ follows="left|top"
+ height="14"
+ layout="topleft"
+ left_delta="5"
+ halign="left"
+ name="image_res_text"
+ top_delta="5"
+ width="100">
+ [WIDTH] x [HEIGHT] px
+ </text>
+ <text
+ follows="left|top"
+ font="SansSerifSmall"
+ height="14"
+ layout="topleft"
+ left="200"
+ length="1"
+ halign="right"
+ name="file_size_label"
+ top_delta="0"
+ type="string"
+ width="50">
+ [SIZE] KB
+ </text>
+ <panel_container
follows="left|top"
- height="13"
- layout="topleft"
- left="10"
- name="layer_type_label"
- top_pad="5"
- width="50">
- Capture:
- </text>
- <combo_box
- height="23"
- label="Image Layers"
+ height="260"
layout="topleft"
- left="30"
- name="layer_types"
- width="145">
- <combo_box.item
- label="Colors"
- name="Colors"
- value="colors" />
- <combo_box.item
- label="Depth"
- name="Depth"
- value="depth" />
- </combo_box>
- <check_box
- label="Interface"
- layout="topleft"
- left="30"
- top_pad="10"
- width="180"
- name="ui_check" />
- <check_box
- label="HUDs"
- layout="topleft"
- left="30"
+ left="0"
+ name="panel_container"
+ default_panel_name="panel_snapshot_options"
top_pad="10"
- width="180"
- name="hud_check" />
- <check_box
- label="Keep open after saving"
- layout="topleft"
- left="10"
- top_pad="8"
- width="180"
- name="keep_open_check" />
- <check_box
- label="Freeze frame (fullscreen)"
- layout="topleft"
- left="10"
- top_pad="8"
- width="180"
- name="freeze_frame_check" />
- <check_box
- label="Auto-refresh"
+ width="270">
+ <panel
+ class="llpanelsnapshotoptions"
+ filename="panel_snapshot_options.xml"
+ follows="all"
+ layout="topleft"
+ left="0"
+ name="panel_snapshot_options"
+ top="0" />
+ <panel
+ class="llpanelsnapshotprofile"
+ follows="all"
+ layout="topleft"
+ name="panel_snapshot_profile"
+ filename="panel_snapshot_profile.xml" />
+ <panel
+ class="llpanelsnapshotpostcard"
+ follows="all"
+ layout="topleft"
+ name="panel_snapshot_postcard"
+ filename="panel_snapshot_postcard.xml" />
+ <panel
+ class="llpanelsnapshotinventory"
+ follows="all"
+ layout="topleft"
+ name="panel_snapshot_inventory"
+ filename="panel_snapshot_inventory.xml" />
+ <panel
+ class="llpanelsnapshotlocal"
+ follows="all"
+ layout="topleft"
+ name="panel_snapshot_local"
+ filename="panel_snapshot_local.xml" />
+ </panel_container>
+ <panel
+ height="295"
layout="topleft"
- left="10"
- top_pad="8"
- width="180"
- name="auto_snapshot_check" />
+ left="270"
+ name="advanced_options_panel"
+ top="20"
+ width="200">
+ <text
+ type="string"
+ font="SansSerifSmall"
+ length="1"
+ follows="left|top"
+ height="14"
+ layout="topleft"
+ left="10"
+ halign="left"
+ name="advanced_options_label"
+ right="-10"
+ top="10">
+ ADVANCED OPTIONS
+ </text>
+ <view_border
+ bevel_style="in"
+ follows="left|top|right"
+ height="1"
+ left="10"
+ layout="topleft"
+ name="advanced_options_hr"
+ right="-10"
+ top_pad="5"
+ />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="13"
+ layout="topleft"
+ left="10"
+ name="layer_type_label"
+ top_pad="10"
+ width="50">
+ Capture:
+ </text>
+ <combo_box
+ follows="left|top|right"
+ height="23"
+ label="Image Layers"
+ layout="topleft"
+ left="30"
+ name="layer_types"
+ right="-10">
+ <combo_box.item
+ label="Colors"
+ name="Colors"
+ value="colors" />
+ <combo_box.item
+ label="Depth"
+ name="Depth"
+ value="depth" />
+ </combo_box>
+ <check_box
+ label="Interface"
+ layout="topleft"
+ left="30"
+ top_pad="10"
+ width="180"
+ name="ui_check" />
+ <check_box
+ label="HUDs"
+ layout="topleft"
+ left="30"
+ top_pad="10"
+ width="180"
+ name="hud_check" />
+ <check_box
+ label="Freeze frame (fullscreen)"
+ layout="topleft"
+ left="10"
+ top_pad="8"
+ width="180"
+ name="freeze_frame_check" />
+ <check_box
+ label="Auto-refresh"
+ layout="topleft"
+ left="10"
+ top_pad="8"
+ width="180"
+ name="auto_snapshot_check" />
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_sound_devices.xml b/indra/newview/skins/default/xui/en/floater_sound_devices.xml
new file mode 100644
index 0000000000..dec0e9b6c6
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_sound_devices.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater
+ border_visible="false"
+ border="false"
+ legacy_header_height="18"
+ can_minimize="true"
+ can_resize="false"
+ can_close="false"
+ chrome="true"
+ save_dock_state="true"
+ save_visibility="true"
+ save_rect="true"
+ single_instance="true"
+ bevel_style="in"
+ height="164"
+ layout="topleft"
+ name="floater_sound_devices"
+ title="SOUND DEVICES"
+ width="490">
+ <panel
+ layout="topleft"
+ follows="all"
+ filename="panel_sound_devices.xml"
+ name="device_settings_panel"
+ width="400"
+ left="10"
+ top="26"
+ class="panel_voice_device_settings"/>
+ <text
+ name="voice_label"
+ top="136"
+ left="12"
+ height="14"
+ width="80"
+ layout="topleft"
+ >Voice Chat</text>
+ <check_box
+ layout="topleft"
+ control_name="EnableVoiceChat"
+ follows="bottom|left"
+ top="138"
+ left="80"
+ name="enable_voice"
+ width="100"
+ height="14"
+ label="Enabled"
+ />
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_stats.xml b/indra/newview/skins/default/xui/en/floater_stats.xml
index b87cb9a433..2fd932786b 100644
--- a/indra/newview/skins/default/xui/en/floater_stats.xml
+++ b/indra/newview/skins/default/xui/en/floater_stats.xml
@@ -2,7 +2,6 @@
<floater
legacy_header_height="18"
can_resize="true"
- follows="top|right"
height="400"
layout="topleft"
name="Statistics"
@@ -10,7 +9,7 @@
save_rect="true"
save_visibility="true"
title="STATISTICS"
- width="250">
+ width="260">
<scroll_container
follows="top|left|bottom|right"
height="380"
@@ -19,15 +18,16 @@
name="statistics_scroll"
reserve_scroll_corner="true"
top="20"
- width="250">
- <container_view
- follows="top|left|bottom|right"
- height="378"
- layout="topleft"
- left="2"
- name="statistics_view"
- top="20"
- width="230" >
+ width="260">
+ <container_view
+ follows="top|left|bottom|right"
+ height="378"
+ layout="topleft"
+ left="2"
+ name="statistics_view"
+ top="20"
+ width="245" >
+ <!--Basic Section-->
<stat_view
name="basic"
label="Basic"
@@ -39,9 +39,9 @@
unit_label="fps"
stat="fpsstat"
bar_min="0"
- bar_max="45"
- tick_spacing="7.5"
- label_spacing="15.0"
+ bar_max="60"
+ tick_spacing="6"
+ label_spacing="12"
precision="1"
show_bar="true"
show_history="true">
@@ -52,9 +52,10 @@
unit_label="kbps"
stat="kbitstat"
bar_min="0"
- bar_max="900"
- tick_spacing="100"
- label_spacing="300"
+ bar_max="5000"
+ tick_spacing="500"
+ label_spacing="1000"
+ precision="0"
show_bar="true"
show_history="false">
</stat_bar>
@@ -65,9 +66,9 @@
stat="packetslostpercentstat"
bar_min="0"
bar_max="5"
- tick_spacing="1"
+ tick_spacing="0.5"
label_spacing="1"
- precision="1"
+ precision="3"
show_per_sec="false"
show_bar="false"
show_mean="true">
@@ -78,15 +79,17 @@
unit_label="msec"
stat="simpingstat"
bar_min="0"
- bar_max="1000"
- tick_spacing="100"
- label_spacing="200"
+ bar_max="5000"
+ tick_spacing="500"
+ label_spacing="1000"
+ precision="0"
show_bar="false"
show_per_sec="false"
show_mean="false">
</stat_bar>
</stat_view>
- <stat_view
+ <!--Advanced Section-->
+ <stat_view
name="advanced"
label="Advanced"
show_label="true"
@@ -98,37 +101,39 @@
setting="OpenDebugStatRender">
<stat_bar
name="ktrisframe"
- label="KTris Drawn"
+ label="KTris Drawn per Frame"
unit_label="/fr"
stat="trianglesdrawnstat"
bar_min="0"
- bar_max="500"
- tick_spacing="100"
- label_spacing="500"
- precision="1"
- show_per_sec="false">
- </stat_bar>
+ bar_max="10000"
+ tick_spacing="1000"
+ label_spacing="2000"
+ precision="0"
+ show_per_sec="false"
+ show_bar="false">
+ </stat_bar>
<stat_bar
name="ktrissec"
- label="KTris Drawn"
+ label="KTris Drawn per Sec"
unit_label="/sec"
stat="trianglesdrawnstat"
bar_min="0"
- bar_max="3000"
- tick_spacing="250"
- label_spacing="1000"
- precision="1">
- </stat_bar>
+ bar_max="200000"
+ tick_spacing="25000"
+ label_spacing="50000"
+ precision="0"
+ show_bar="false">
+ </stat_bar>
<stat_bar
name="objs"
label="Total Objects"
unit_label=""
stat="numobjectsstat"
bar_min="0"
- bar_max="3000"
- tick_spacing="250"
- label_spacing="1000"
- precision="1"
+ bar_max="50000"
+ tick_spacing="5000"
+ label_spacing="10000"
+ precision="0"
show_per_sec="false"
show_bar="false">
</stat_bar>
@@ -138,13 +143,14 @@
unit_label="/sec"
stat="numnewobjectsstat"
bar_min="0"
- bar_max="1000"
- tick_spacing="100"
- label_spacing="500"
+ bar_max="2000"
+ tick_spacing="200"
+ label_spacing="400"
show_per_sec="true"
show_bar="false">
</stat_bar>
</stat_view>
+ <!--Texture Stats-->
<stat_view
name="texture"
label="Texture"
@@ -182,8 +188,9 @@
tick_spacing="100.f"
label_spacing="200.f"
precision="1"
- show_per_sec="false" >
- </stat_bar>
+ show_per_sec="false"
+ show_bar="false">
+ </stat_bar>
<stat_bar
name="formattedmemstat"
@@ -194,8 +201,9 @@
tick_spacing="100.f"
label_spacing="200.f"
precision="1"
- show_per_sec="false" >
- </stat_bar>
+ show_per_sec="false"
+ show_bar="false">
+ </stat_bar>
<stat_bar
name="rawmemstat"
@@ -206,8 +214,9 @@
tick_spacing="100.f"
label_spacing="200.f"
precision="1"
- show_per_sec="false" >
- </stat_bar>
+ show_per_sec="false"
+ show_bar="false">
+ </stat_bar>
<stat_bar
name="glboundmemstat"
@@ -218,10 +227,11 @@
tick_spacing="100.f"
label_spacing="200.f"
precision="1"
- show_per_sec="false" >
- </stat_bar>
+ show_per_sec="false"
+ show_bar="false">
+ </stat_bar>
</stat_view>
-
+ <!--Network Stats-->
<stat_view
name="network"
label="Network"
@@ -232,6 +242,11 @@
label="Packets In"
stat="packetsinstat"
unit_label="/sec"
+ bar_min="0.f"
+ bar_max="1024.f"
+ tick_spacing="128.f"
+ label_spacing="256.f"
+ precision="1"
show_bar="false">
</stat_bar>
@@ -239,7 +254,12 @@
name="packetsoutstat"
label="Packets Out"
stat="packetsoutstat"
- unit_label="/sec"
+ unit_label="/sec"
+ bar_min="0.f"
+ bar_max="1024.f"
+ tick_spacing="128.f"
+ label_spacing="256.f"
+ precision="1"
show_bar="false" >
</stat_bar>
@@ -247,7 +267,12 @@
name="objectkbitstat"
label="Objects"
stat="objectkbitstat"
- unit_label="kbps"
+ unit_label="kbps"
+ bar_min="0.f"
+ bar_max="1024.f"
+ tick_spacing="128.f"
+ label_spacing="256.f"
+ precision="1"
show_bar="false" >
</stat_bar>
@@ -255,7 +280,12 @@
name="texturekbitstat"
label="Texture"
stat="texturekbitstat"
- unit_label="kbps"
+ unit_label="kbps"
+ bar_min="0.f"
+ bar_max="1024.f"
+ tick_spacing="128.f"
+ label_spacing="256.f"
+ precision="1"
show_bar="false" >
</stat_bar>
@@ -263,7 +293,12 @@
name="assetkbitstat"
label="Asset"
stat="assetkbitstat"
- unit_label="kbps"
+ unit_label="kbps"
+ bar_min="0.f"
+ bar_max="1024.f"
+ tick_spacing="128.f"
+ label_spacing="256.f"
+ precision="1"
show_bar="false" >
</stat_bar>
@@ -271,7 +306,12 @@
name="layerskbitstat"
label="Layers"
stat="layerskbitstat"
- unit_label="kbps"
+ unit_label="kbps"
+ bar_min="0.f"
+ bar_max="1024.f"
+ tick_spacing="128.f"
+ label_spacing="256.f"
+ precision="1"
show_bar="false" >
</stat_bar>
@@ -279,12 +319,13 @@
name="actualinkbitstat"
label="Actual In"
stat="actualinkbitstat"
- unit_label="kbps"
- bar_min="0.f"
- bar_max="1024.f"
- tick_spacing="128.f"
- label_spacing="256.f"
- show_bar="true"
+ unit_label="kbps"
+ bar_min="0.f"
+ bar_max="1024.f"
+ tick_spacing="128.f"
+ label_spacing="256.f"
+ precision="1"
+ show_bar="false"
show_history="false" >
</stat_bar>
@@ -292,26 +333,27 @@
name="actualoutkbitstat"
label="Actual Out"
stat="actualoutkbitstat"
- unit_label="kbps"
- bar_min="0.f"
- bar_max="512.f"
- tick_spacing="128.f"
- label_spacing="256.f"
- show_bar="true"
+ unit_label="kbps"
+ bar_min="0.f"
+ bar_max="1024.f"
+ tick_spacing="128.f"
+ label_spacing="256.f"
+ precision="1"
+ show_bar="false"
show_history="false">
</stat_bar>
<stat_bar
name="vfspendingoperations"
- label="VFS Pending Ops"
+ label="VFS Pending Operations"
stat="vfspendingoperations"
- unit_label=" "
+ unit_label=" Ops."
show_per_sec="false"
show_bar="false" >
</stat_bar>
</stat_view>
</stat_view>
-
+ <!--Sim Stats-->
<stat_view
name="sim"
label="Simulator"
@@ -321,11 +363,11 @@
name="simtimedilation"
label="Time Dilation"
stat="simtimedilation"
- precision="2"
+ precision="3"
bar_min="0.f"
bar_max="1.f"
- tick_spacing="0.25f"
- label_spacing="0.5f"
+ tick_spacing="0.16666f"
+ label_spacing="0.33333f"
show_per_sec="false"
show_bar="false"
show_mean="false" >
@@ -335,10 +377,11 @@
name="simfps"
label="Sim FPS"
stat="simfps"
+ precision="1"
bar_min="0.f"
- bar_max="200.f"
- tick_spacing="20.f"
- label_spacing="100.f"
+ bar_max="45.f"
+ tick_spacing="7.5f"
+ label_spacing="15.f"
show_per_sec="false"
show_bar="false"
show_mean="false" >
@@ -350,9 +393,9 @@
stat="simphysicsfps"
precision="1"
bar_min="0.f"
- bar_max="66.f"
- tick_spacing="33.f"
- label_spacing="33.f"
+ bar_max="45.f"
+ tick_spacing="7.5.f"
+ label_spacing="15.f"
show_per_sec="false"
show_bar="false"
show_mean="false" >
@@ -369,8 +412,8 @@
precision="0"
bar_min="0.f"
bar_max="500.f"
- tick_spacing="10.f"
- label_spacing="40.f"
+ tick_spacing="50.f"
+ label_spacing="100.f"
show_per_sec="false"
show_bar="false"
show_mean="false" >
@@ -383,8 +426,8 @@
precision="0"
bar_min="0.f"
bar_max="500.f"
- tick_spacing="10.f"
- label_spacing="40.f"
+ tick_spacing="50.f"
+ label_spacing="100.f"
show_per_sec="false"
show_bar="false"
show_mean="false" >
@@ -395,7 +438,7 @@
label="Memory Allocated"
stat="physicsmemoryallocated"
unit_label="MB"
- precision="0"
+ precision="1"
bar_min="0.f"
bar_max="1024.f"
tick_spacing="128.f"
@@ -468,9 +511,9 @@
stat="simactiveobjects"
precision="0"
bar_min="0.f"
- bar_max="800.f"
- tick_spacing="100.f"
- label_spacing="200.f"
+ bar_max="5000.f"
+ tick_spacing="750.f"
+ label_spacing="1250.f"
show_per_sec="false"
show_bar="false"
show_mean="false" >
@@ -482,9 +525,9 @@
stat="simactivescripts"
precision="0"
bar_min="0.f"
- bar_max="800.f"
- tick_spacing="100.f"
- label_spacing="200.f"
+ bar_max="15000.f"
+ tick_spacing="1875.f"
+ label_spacing="3750.f"
show_per_sec="false"
show_bar="false"
show_mean="false" >
@@ -497,9 +540,9 @@
unit_label="eps"
precision="0"
bar_min="0.f"
- bar_max="20000.f"
- tick_spacing="2500.f"
- label_spacing="5000.f"
+ bar_max="5000.f"
+ tick_spacing="750.f"
+ label_spacing="1250.f"
show_per_sec="false"
show_bar="false"
show_mean="false" >
@@ -568,7 +611,7 @@
label="Total Unacked Bytes"
stat="simtotalunackedbytes"
unit_label="kb"
- precision="0"
+ precision="1"
bar_min="0.f"
bar_max="100000.f"
tick_spacing="25000.f"
@@ -587,7 +630,7 @@
label="Total Frame Time"
stat="simframemsec"
unit_label="ms"
- precision="1"
+ precision="3"
bar_min="0.f"
bar_max="40.f"
tick_spacing="10.f"
@@ -602,7 +645,7 @@
label="Net Time"
stat="simnetmsec"
unit_label="ms"
- precision="1"
+ precision="3"
bar_min="0.f"
bar_max="40.f"
tick_spacing="10.f"
@@ -617,7 +660,7 @@
label="Physics Time"
stat="simsimphysicsmsec"
unit_label="ms"
- precision="1"
+ precision="3"
bar_min="0.f"
bar_max="40.f"
tick_spacing="10.f"
@@ -632,7 +675,7 @@
label="Simulation Time"
stat="simsimothermsec"
unit_label="ms"
- precision="1"
+ precision="3"
bar_min="0.f"
bar_max="40.f"
tick_spacing="10.f"
@@ -647,7 +690,7 @@
label="Agent Time"
stat="simagentmsec"
unit_label="ms"
- precision="1"
+ precision="3"
bar_min="0.f"
bar_max="40.f"
tick_spacing="10.f"
@@ -662,7 +705,7 @@
label="Images Time"
stat="simimagesmsec"
unit_label="ms"
- precision="1"
+ precision="3"
bar_min="0.f"
bar_max="40.f"
tick_spacing="10.f"
@@ -677,7 +720,7 @@
label="Script Time"
stat="simscriptmsec"
unit_label="ms"
- precision="1"
+ precision="3"
bar_min="0.f"
bar_max="40.f"
tick_spacing="10.f"
@@ -686,6 +729,97 @@
show_bar="false"
show_mean="false" >
</stat_bar>
+
+ <stat_bar
+ name="simsparemsec"
+ label="Spare Time"
+ stat="simsparemsec"
+ unit_label="ms"
+ precision="3"
+ bar_min="0.f"
+ bar_max="40.f"
+ tick_spacing="10.f"
+ label_spacing="20.f"
+ show_per_sec="false"
+ show_bar="false"
+ show_mean="false" >
+ </stat_bar>
+ <!--2nd level time blocks under 'Details' second-->
+ <stat_view
+ name="timedetails"
+ label="Time Details (ms)"
+ show_label="true">
+ <stat_bar
+ name="simsimphysicsstepmsec"
+ label=" Physics Step"
+ stat="simsimphysicsstepmsec"
+ unit_label="ms"
+ precision="3"
+ bar_min="0.f"
+ bar_max="40.f"
+ tick_spacing="10.f"
+ label_spacing="20.f"
+ show_per_sec="false"
+ show_bar="false"
+ show_mean="false" >
+ </stat_bar>
+ <stat_bar
+ name="simsimphysicsshapeupdatemsec"
+ label=" Update Phys Shapes"
+ stat="simsimphysicsshapeupdatemsec"
+ unit_label="ms"
+ precision="3"
+ bar_min="0.f"
+ bar_max="40.f"
+ tick_spacing="10.f"
+ label_spacing="20.f"
+ show_per_sec="false"
+ show_bar="false"
+ show_mean="false" >
+ </stat_bar>
+ <stat_bar
+ name="simsimphysicsothermsec"
+ label=" Physics Other"
+ stat="simsimphysicsothermsec"
+ unit_label="ms"
+ precision="3"
+ bar_min="0.f"
+ bar_max="40.f"
+ tick_spacing="10.f"
+ label_spacing="20.f"
+ show_per_sec="false"
+ show_bar="false"
+ show_mean="false" >
+ </stat_bar>
+ <stat_bar
+ name="simsleepmsec"
+ label=" Sleep Time"
+ stat="simsleepmsec"
+ unit_label="ms"
+ precision="3"
+ bar_min="0.f"
+ bar_max="40.f"
+ tick_spacing="10.f"
+ label_spacing="20.f"
+ show_per_sec="false"
+ show_bar="false"
+ show_mean="false" >
+ </stat_bar>
+ <stat_bar
+ name="simpumpiomsec"
+ label=" Pump IO"
+ stat="simpumpiomsec"
+ unit_label="ms"
+ precision="3"
+ bar_min="0.f"
+ bar_max="40.f"
+ tick_spacing="10.f"
+ label_spacing="20.f"
+ show_per_sec="false"
+ show_bar="false"
+ show_mean="false" >
+ </stat_bar>
+ </stat_view>
</stat_view>
</stat_view>
</container_view>
diff --git a/indra/newview/skins/default/xui/en/floater_sys_well.xml b/indra/newview/skins/default/xui/en/floater_sys_well.xml
index 005952f3f2..ecedb27438 100644
--- a/indra/newview/skins/default/xui/en/floater_sys_well.xml
+++ b/indra/newview/skins/default/xui/en/floater_sys_well.xml
@@ -2,9 +2,6 @@
<floater
legacy_header_height="18"
bevel_style="in"
- left="0"
- top="0"
- follows="right|bottom"
layout="topleft"
name="sys_well_window"
help_topic="notification_chiclet"
@@ -18,6 +15,7 @@
can_resize="true"
can_drag_on_left="false"
can_dock="true"
+ save_dock_state="true"
save_visibility="true"
single_instance="true"
>
diff --git a/indra/newview/skins/default/xui/en/floater_telehub.xml b/indra/newview/skins/default/xui/en/floater_telehub.xml
index da412ed8a0..547613fb67 100644
--- a/indra/newview/skins/default/xui/en/floater_telehub.xml
+++ b/indra/newview/skins/default/xui/en/floater_telehub.xml
@@ -4,7 +4,6 @@
legacy_header_height="18"
height="250"
layout="topleft"
- left="300"
name="telehub"
help_topic="telehub"
title="TELEHUB"
diff --git a/indra/newview/skins/default/xui/en/floater_test_button.xml b/indra/newview/skins/default/xui/en/floater_test_button.xml
index bf0a774e76..9bc05107a2 100644
--- a/indra/newview/skins/default/xui/en/floater_test_button.xml
+++ b/indra/newview/skins/default/xui/en/floater_test_button.xml
@@ -78,7 +78,6 @@
<button
bottom_delta="30"
height="23"
- highlight_color="EmphasisColor"
label="Highlight"
layout="topleft"
name="highlight_color_button" />
diff --git a/indra/newview/skins/default/xui/en/floater_test_layout_stacks.xml b/indra/newview/skins/default/xui/en/floater_test_layout_stacks.xml
new file mode 100644
index 0000000000..a04050e7eb
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_test_layout_stacks.xml
@@ -0,0 +1,226 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ can_resize="true"
+ can_close="true"
+ bevel_style="in"
+ height="300"
+ layout="topleft"
+ min_height="40"
+ min_width="420"
+ name="Test Floater"
+ title="LAYOUTSTACK TESTS"
+ width="420">
+ <layout_stack name="test_stack"
+ left="0"
+ top="0"
+ width="100"
+ height="250"
+ follows="left|top|bottom"
+ orientation="vertical">
+ <layout_panel name="flex"
+ auto_resize="true"
+ user_resize="true"
+ bg_alpha_color="blue"
+ height="11"
+ min_height="0"
+ background_visible="true">
+ <text follows="top|left|right" halign="center" text_color="white">flex</text>
+ </layout_panel>
+ <layout_panel name="flex"
+ auto_resize="true"
+ user_resize="true"
+ bg_alpha_color="blue"
+ height="11"
+ min_height="0"
+ visible="false"
+ background_visible="true">
+ <text follows="top|left|right" halign="center" text_color="white">flex</text>
+ </layout_panel>
+ <layout_panel name="flex"
+ auto_resize="true"
+ user_resize="true"
+ bg_alpha_color="blue"
+ height="11"
+ min_height="0"
+ visible="true"
+ background_visible="true">
+ <text follows="top|left|right" halign="center" text_color="white">flex</text>
+ </layout_panel>
+ <layout_panel name="flex"
+ auto_resize="true"
+ user_resize="true"
+ bg_alpha_color="blue"
+ height="11"
+ min_height="0"
+ background_visible="true">
+ <text follows="top|left|right" halign="center" text_color="white">flex</text>
+ </layout_panel>
+ </layout_stack>
+ <layout_stack name="test_stack"
+ left_pad="5"
+ top="0"
+ width="100"
+ height="250"
+ follows="left|top|bottom"
+ orientation="vertical">
+ <layout_panel name="flex"
+ auto_resize="true"
+ user_resize="true"
+ bg_alpha_color="blue"
+ height="100"
+ background_visible="true">
+ <text follows="top|left|right" halign="center" text_color="white">flex</text>
+ </layout_panel>
+ <layout_panel name="flex"
+ auto_resize="true"
+ user_resize="true"
+ visible="false"
+ bg_alpha_color="blue"
+ height="100"
+ background_visible="true">
+ <text follows="top|left|right" halign="center" text_color="white">flex</text>
+ </layout_panel>
+ <layout_panel name="fixed"
+ auto_resize="false"
+ user_resize="true"
+ height="50"
+ min_height="10"
+ bg_alpha_color="green"
+ background_visible="true">
+ <text follows="top|left|right" halign="center" text_color="black">fixed</text>
+ </layout_panel>
+ <layout_panel name="fixed"
+ auto_resize="false"
+ user_resize="true"
+ height="50"
+ min_height="10"
+ bg_alpha_color="green"
+ background_visible="true">
+ <text follows="top|left|right" halign="center" text_color="black">fixed</text>
+ </layout_panel>
+ <layout_panel name="flex"
+ auto_resize="true"
+ user_resize="true"
+ bg_alpha_color="blue"
+ height="100"
+ background_visible="true">
+ <text follows="top|left|right" halign="center" text_color="white">flex</text>
+ </layout_panel>
+ <layout_panel name="flex"
+ auto_resize="true"
+ user_resize="true"
+ bg_alpha_color="blue"
+ height="100"
+ background_visible="true">
+ <text follows="top|left|right" halign="center" text_color="white">flex</text>
+ </layout_panel>
+ <layout_panel name="flex"
+ auto_resize="true"
+ user_resize="true"
+ bg_alpha_color="blue"
+ height="100"
+ background_visible="true">
+ <text follows="top|left|right" halign="center" text_color="white">flex</text>
+ </layout_panel>
+ <layout_panel name="flex"
+ auto_resize="true"
+ user_resize="true"
+ bg_alpha_color="blue"
+ height="100"
+ visible="true"
+ background_visible="true">
+ <text follows="top|left|right" halign="center" text_color="white">flex</text>
+ </layout_panel>
+ </layout_stack>
+ <layout_stack name="test_stack"
+ left_pad="5"
+ top="0"
+ width="100"
+ height="250"
+ follows="left|top|bottom"
+ orientation="vertical">
+ <layout_panel name="flex"
+ auto_resize="true"
+ user_resize="true"
+ height="11"
+ bg_alpha_color="blue"
+ background_visible="true">
+ <text follows="top|left|right" halign="center" text_color="white">flex</text>
+ </layout_panel>
+ <layout_panel name="fixed"
+ auto_resize="false"
+ user_resize="true"
+ height="50"
+ bg_alpha_color="green"
+ background_visible="true">
+ <text follows="top|left|right" halign="center" text_color="black">fixed</text>
+ </layout_panel>
+ <layout_panel name="flex"
+ auto_resize="true"
+ user_resize="true"
+ bg_alpha_color="blue"
+ height="11"
+ background_visible="true">
+ <text follows="top|left|right" halign="center" text_color="white">flex</text>
+ </layout_panel>
+ </layout_stack>
+ <layout_stack name="test_stack"
+ left_pad="5"
+ top="0"
+ width="100"
+ height="250"
+ follows="left|top|bottom"
+ orientation="vertical">
+ <layout_panel name="fixed"
+ auto_resize="false"
+ user_resize="true"
+ height="50"
+ bg_alpha_color="green"
+ background_visible="true">
+ <text follows="top|left|right" halign="center" text_color="black">fixed</text>
+ </layout_panel>
+ <layout_panel name="fixed"
+ auto_resize="false"
+ user_resize="true"
+ height="50"
+ bg_alpha_color="green"
+ background_visible="true">
+ <text follows="top|left|right" halign="center" text_color="black">fixed</text>
+ </layout_panel>
+ <layout_panel name="fixed"
+ auto_resize="false"
+ user_resize="true"
+ height="50"
+ bg_alpha_color="green"
+ background_visible="true">
+ <text follows="top|left|right" halign="center" text_color="black">fixed</text>
+ </layout_panel>
+ <layout_panel name="flex"
+ auto_resize="true"
+ user_resize="true"
+ bg_alpha_color="blue"
+ height="11"
+ min_height="0"
+ background_visible="true">
+ <text follows="top|left|right" halign="center" text_color="white">flex</text>
+ </layout_panel>
+ <layout_panel name="flex"
+ auto_resize="true"
+ user_resize="true"
+ bg_alpha_color="blue"
+ height="11"
+ min_height="0"
+ background_visible="true">
+ <text follows="top|left|right" halign="center" text_color="white">flex</text>
+ </layout_panel>
+ <layout_panel name="flex"
+ auto_resize="true"
+ user_resize="true"
+ bg_alpha_color="blue"
+ height="11"
+ min_height="0"
+ background_visible="true">
+ <text follows="top|left|right" halign="center" text_color="white">flex</text>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_test_text_editor.xml b/indra/newview/skins/default/xui/en/floater_test_text_editor.xml
index 548e24efba..e1fefc3631 100644
--- a/indra/newview/skins/default/xui/en/floater_test_text_editor.xml
+++ b/indra/newview/skins/default/xui/en/floater_test_text_editor.xml
@@ -3,6 +3,7 @@
legacy_header_height="18"
can_resize="true"
height="600"
+ single_instance="false"
layout="topleft"
name="floater_test_text_editor"
translate="false"
diff --git a/indra/newview/skins/default/xui/en/floater_test_text_vertical_aligment.xml b/indra/newview/skins/default/xui/en/floater_test_text_vertical_aligment.xml
new file mode 100644
index 0000000000..d11373ce1d
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_test_text_vertical_aligment.xml
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ can_minimize="false"
+ can_tear_off="false"
+ can_resize="true"
+ can_drag_on_left="false"
+ can_close="true"
+ can_dock="true"
+ bevel_style="in"
+ height="300"
+ layout="topleft"
+ name="Test Floater"
+ save_rect="true"
+ title="TEST FLOATER"
+ save_dock_state="true"
+ save_visibility="true"
+ single_instance="true"
+ width="650">
+ <text left="0"
+ follows="left|top|bottom"
+ top="5"
+ clip_partial="true"
+ bottom="-5"
+ width="100"
+ valign="top">
+this
+is
+some
+text
+that
+is
+top
+aligned</text>
+ <text left_pad="5"
+ follows="left|top|bottom"
+ top="5"
+ bottom="-5"
+ clip_partial="true"
+ width="100"
+ valign="center">
+this
+is
+some
+text
+that
+is
+center
+aligned</text>
+ <text left_pad="5"
+ follows="left|top|bottom"
+ top="5"
+ clip_partial="true"
+ bottom="-5"
+ width="100"
+ valign="bottom">
+this
+is
+some
+text
+that
+is
+bottom
+aligned</text>
+ <text_editor left_pad="5"
+ follows="left|top|bottom"
+ top="5"
+ clip_partial="true"
+ bottom="-5"
+ width="100"
+ valign="top">
+this
+is
+some
+text
+that
+is
+top
+aligned
+ </text_editor>
+ <text_editor left_pad="5"
+ follows="left|top|bottom"
+ top="5"
+ bottom="-5"
+ clip_partial="true"
+ width="100"
+ valign="center">
+this
+is
+some
+text
+that
+is
+center
+aligned
+ </text_editor>
+ <text_editor left_pad="5"
+ follows="left|top|bottom"
+ top="5"
+ clip_partial="true"
+ bottom="-5"
+ width="100"
+ valign="bottom">
+this
+is
+some
+text
+that
+is
+bottom
+aligned
+ </text_editor>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_test_textbox.xml b/indra/newview/skins/default/xui/en/floater_test_textbox.xml
index 2df9bb35fe..1d31fbd6dc 100644
--- a/indra/newview/skins/default/xui/en/floater_test_textbox.xml
+++ b/indra/newview/skins/default/xui/en/floater_test_textbox.xml
@@ -8,21 +8,7 @@
help_topic="floater_test_textbox"
translate="false"
width="800">
- <text
- type="string"
- length="1"
- height="90"
- layout="topleft"
- left="10"
- top_pad="30"
- width="300">
- First line of multiple lines
-Second line of multiple lines
-Third line of multiple lines
-Fourth line of multiple lines
-Fifth line of multiple lines
- </text>
- <text
+ <text
clip_partial="true"
top_pad="10"
left="10"
diff --git a/indra/newview/skins/default/xui/en/floater_test_toolbar.xml b/indra/newview/skins/default/xui/en/floater_test_toolbar.xml
new file mode 100644
index 0000000000..067c1fed82
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_test_toolbar.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ legacy_header_height="18"
+ can_resize="true"
+ height="500"
+ layout="topleft"
+ name="floater_test_toolbar"
+ translate="false"
+ width="500">
+ <toolbar name="test_toolbar_top"
+ button_display_mode="icons_with_text"
+ follows="left|right|top"
+ height="50"
+ width="500"
+ left="0"
+ top="20"
+ min_button_width="0"
+ max_button_width="100"
+ side="top">
+ <command name="avatar"/>
+ <command name="build"/>
+ <command name="chat"/>
+ </toolbar>
+ <toolbar name="test_toolbar_left"
+ button_display_mode="icons_with_text"
+ follows="left|bottom|top"
+ height="380"
+ width="200"
+ left="0"
+ top="70"
+ min_button_width="100"
+ side="left">
+ <command name="avatar"/>
+ <command name="build"/>
+ <command name="chat"/>
+ </toolbar>
+ <toolbar name="test_toolbar_right"
+ button_display_mode="icons_with_text"
+ follows="right|bottom|top"
+ height="380"
+ width="200"
+ right="500"
+ top="70"
+ side="right">
+ <command name="avatar"/>
+ <command name="build"/>
+ <command name="chat"/>
+ </toolbar>
+ <toolbar name="test_toolbar_bottom"
+ button_display_mode="icons_with_text"
+ follows="left|right|bottom"
+ height="50"
+ width="500"
+ left="0"
+ bottom="500"
+ min_button_width="100"
+ side="bottom">
+ <command name="avatar"/>
+ <command name="build"/>
+ <command name="chat"/>
+ </toolbar>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_test_widgets.xml b/indra/newview/skins/default/xui/en/floater_test_widgets.xml
index 13c850c86c..10854f5a49 100644
--- a/indra/newview/skins/default/xui/en/floater_test_widgets.xml
+++ b/indra/newview/skins/default/xui/en/floater_test_widgets.xml
@@ -115,6 +115,7 @@
</flyout_button>
<check_box
bottom_delta="35"
+ height="10"
label="Checkbox"
layout="topleft"
tool_tip="checkbox"
@@ -275,6 +276,7 @@
<!-- "spinner" is a numerical input widget with an up and down arrow to
change the value. -->
<spinner
+ height="10"
bottom_delta="35"
follows="top|left"
label="Spinner"
diff --git a/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml
index cad7d72ed7..ffb8b842f0 100644
--- a/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml
@@ -3,15 +3,17 @@
legacy_header_height="18"
can_minimize="false"
can_resize="true"
- height="290"
+ height="330"
layout="topleft"
- min_height="290"
+ min_height="330"
min_width="410"
name="texture picker"
help_topic="texture_picker"
title="PICK: TEXTURE"
width="410">
- <floater.string
+
+<!-- top static -->
+ <floater.string
name="choose_picture">
Click to choose a picture
</floater.string>
@@ -19,6 +21,16 @@
name="pick title">
Pick:
</floater.string>
+
+ <view
+ left="4"
+ top="20"
+ name="preview_widget"
+ height="165"
+ width="165"
+ follows="left|top"
+ />
+
<text
type="string"
length="1"
@@ -34,70 +46,94 @@
width="163">
Multiple textures
</text>
+
+ <!-- mode selector -->
+ <radio_group
+ control_name="mode_selection"
+ height="20"
+ layout="topleft"
+ left="18"
+ top_pad="80"
+ name="mode_selection"
+ follows="left|top">
+ <radio_item
+ label="Inventory"
+ name="inventory"
+ top_delta="20"
+ layout="topleft"
+ height="16"
+ left="0"
+ value="0"
+ width="80" />
+ <radio_item
+ label="Local"
+ left_pad="0"
+ layout="topleft"
+ top_delta="0"
+ height="16"
+ name="local"
+ value="1"
+ width="75" />
+ </radio_group>
+ <!-- -->
+
<text
type="string"
length="1"
follows="left|top"
height="14"
layout="topleft"
- left_delta="0"
+ left_delta="-12"
name="unknown"
- top_pad="80"
- width="163">
+ top_pad="4"
+ width="">
Size: [DIMENSIONS]
</text>
+
+<!-- middle: inventory mode -->
+
<button
enabled="false"
- follows="left|bottom"
- height="20"
+ follows="left|top"
+ height="18"
label="Default"
label_selected="Default"
layout="topleft"
- left_delta="0"
name="Default"
- top_pad="4"
- width="80" />
+ width="73"
+ left="94"
+ top="215"/>
<button
+ follows="left|top"
+ height="20"
+ label="Blank"
+ label_selected="Blank"
+ layout="topleft"
+ left_delta="0"
+ name="Blank"
+ top_pad="5"
+ width="73" />
+ <button
enabled="false"
- follows="left|bottom"
+ follows="left|top"
height="20"
label="None"
label_selected="None"
layout="topleft"
- left_pad="4"
+ left_delta="0"
name="None"
- top_delta="0"
- width="80" />
- <button
- follows="left|bottom"
- height="20"
- label="Blank"
- label_selected="Blank"
- layout="topleft"
- left="4"
- name="Blank"
top_pad="5"
- width="80" />
- <button
- follows="left|bottom"
+ width="73" />
+ <button
+ follows="left|top"
height="28"
image_selected="eye_button_active.tga"
image_unselected="eye_button_inactive.tga"
layout="topleft"
- left_pad="50"
- top_delta="3"
+ left_delta="-80"
+ top_delta="-25"
name="Pipette"
width="28" />
- <check_box
- follows="left|bottom"
- height="20"
- initial_value="true"
- label="Apply now"
- layout="topleft"
- left="4"
- name="apply_immediate_check"
- top="262"
- width="120" />
<filter_editor
follows="left|top|right"
height="23"
@@ -113,7 +149,7 @@
bg_alpha_color="DkGray2"
border="false"
follows="all"
- height="200"
+ height="233"
layout="topleft"
left_delta="0"
name="inventory panel"
@@ -128,23 +164,89 @@
top_pad="0"
left_delta="-3"
width="200" />
- <button
- follows="right|bottom"
+
+<!-- middle: local mode -->
+ <button
+ follows="left|top"
+ height="18"
+ label="Add"
+ label_selected="Add"
+ layout="topleft"
+ left="94"
+ top="215"
+ name="l_add_btn"
+ width="73"
+ visible="false"/>
+ <button
+ enabled="false"
+ follows="left|top"
+ height="20"
+ label="Remove"
+ label_selected="Remove"
+ layout="topleft"
+ left_delta="0"
+ name="l_rem_btn"
+ top_pad="5"
+ width="73"
+ visible="false"/>
+ <button
+ enabled="false"
+ follows="left|top"
+ height="20"
+ label="Upload"
+ label_selected="Upload"
+ layout="topleft"
+ left_delta="0"
+ name="l_upl_btn"
+ top_pad="5"
+ width="73"
+ visible="false"/>
+ <scroll_list
+ name="l_name_list"
+ left="170"
+ top="22"
+ width="235"
+ height="260"
+ follows="left|top|right|bottom"
+ column_padding="0"
+ can_resize="false"
+ draw_heading="true"
+ multi_select="true"
+ search_column="1"
+ visible="false">
+ <column name="unit_name" label="Name" dynamicwidth="true" />
+ <column name="unit_id_HIDDEN" label="ID" width="0" />
+ </scroll_list>
+
+<!-- bottom static -->
+ <button
+ follows="bottom"
height="20"
label="OK"
label_selected="OK"
layout="topleft"
- right="-120"
+ left="95"
+ top="-30"
name="Select"
width="100" />
<button
- follows="right|bottom"
+ follows="bottom"
height="20"
label="Cancel"
label_selected="Cancel"
layout="topleft"
- right="-10"
- left_pad="5"
+ left_delta="120"
+ top_delta="0"
name="Cancel"
width="100" />
+ <check_box
+ follows="left|bottom"
+ height="20"
+ initial_value="true"
+ label="Apply now"
+ layout="topleft"
+ left="6"
+ name="apply_immediate_check"
+ top_delta="0"
+ width="120" />
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml
index e70e1eb61b..e37740d20c 100644
--- a/indra/newview/skins/default/xui/en/floater_tools.xml
+++ b/indra/newview/skins/default/xui/en/floater_tools.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
+ positioning="cascading"
legacy_header_height="18"
- follows="left|top|right"
height="580"
layout="topleft"
bg_opaque_image="Window_NoTitle_Foreground"
@@ -14,7 +14,27 @@
save_visibility="true"
sound_flags="0"
width="295">
- <floater.string
+ <floater.string
+ name="grid_screen_text">
+ Screen
+ </floater.string>
+ <floater.string
+ name="grid_local_text">
+ Local
+ </floater.string>
+ <floater.string
+ name="grid_world_text">
+ World
+ </floater.string>
+ <floater.string
+ name="grid_reference_text">
+ Reference
+ </floater.string>
+ <floater.string
+ name="grid_attachment_text">
+ Attachment
+ </floater.string>
+ <floater.string
name="status_rotate">
Drag colored bands to rotate object
</floater.string>
@@ -47,24 +67,12 @@
Click and drag to select land
</floater.string>
<floater.string
- name="grid_screen_text">
- Screen
- </floater.string>
- <floater.string
- name="grid_local_text">
- Local
- </floater.string>
- <floater.string
- name="grid_world_text">
- World
+ name="status_selectcount">
+ [OBJ_COUNT] objects selected, land impact [LAND_IMPACT]
</floater.string>
<floater.string
- name="grid_reference_text">
- Reference
- </floater.string>
- <floater.string
- name="grid_attachment_text">
- Attachment
+ name="status_remaining_capacity">
+ Remaining capacity [LAND_CAPACITY].
</floater.string>
<button
follows="left|top"
@@ -221,7 +229,7 @@
<radio_group
follows="left|top"
left="5"
- top="59"
+ top="55"
height="70"
layout="topleft"
name="edit_radio_group">
@@ -248,46 +256,59 @@
function="BuildTool.commitRadioEdit"/>
</radio_group>
<check_box
- left="10"
+ left="5"
follows="left|top"
height="28"
control_name="EditLinkedParts"
label="Edit linked"
layout="topleft"
name="checkbox edit linked parts"
- top_pad="2">
+ top_pad="-18">
<check_box.commit_callback
function="BuildTool.selectComponent"/>
</check_box>
- <text
- text_color="LtGray_50"
- follows="top|left"
- halign="left"
- left="13"
- name="RenderingCost"
- tool_tip="Shows the rendering cost calculated for this object"
- top_pad="0"
- type="string"
- width="100">
- þ: [COUNT]
- </text>
- <check_box
+ <button
+ follows="left|top"
+ height="20"
+ label="Link"
+ top="108"
+ layout="topleft"
+ left="143"
+ name="link_btn"
+ width="50">
+ <button.commit_callback
+ function="BuildTool.LinkObjects"/>
+ </button>
+ <button
+ follows="left|top"
+ height="20"
+ label="Unlink"
+ layout="topleft"
+ left_pad="2"
+ name="unlink_btn"
+ width="90">
+ <button.commit_callback
+ function="BuildTool.UnlinkObjects"/>
+ </button>
+ <check_box
control_name="ScaleUniform"
height="19"
label=""
layout="topleft"
left="143"
name="checkbox uniform"
- top="50"
+ top="48"
width="20" />
<text
height="19"
label="Stretch Both Sides"
- left="163"
+ left_delta="20"
name="checkbox uniform label"
- top="55"
+ top_delta="2"
width="120"
+ layout="topleft"
+ follows="top|left"
wrap="true">
Stretch Both Sides
</text>
@@ -299,54 +320,60 @@
layout="topleft"
left="143"
name="checkbox stretch textures"
- top_pad="7"
+ top_pad="-4"
+ follows="left|top"
width="134" />
<check_box
control_name="SnapEnabled"
height="18"
initial_value="true"
- label="Snap to grid"
+ label="Snap"
layout="topleft"
top_pad="0"
name="checkbox snap to grid"
width="134" />
<combo_box
- height="23"
- layout="topleft"
- follows="left|top"
- name="combobox grid mode"
- tool_tip="Choose the type of grid ruler for positioning the object"
- top_pad="0"
- width="108">
- <combo_box.item
- label="World grid"
- name="World"
- value="World" />
- <combo_box.item
- label="Local grid"
- name="Local"
- value="Local" />
- <combo_box.item
- label="Reference grid"
- name="Reference"
- value="Reference" />
- <combo_box.commit_callback
- function="BuildTool.gridMode"/>
- </combo_box>
- <button
- left_pad="0"
+ height="20"
+ layout="topleft"
+ follows="left|top"
+ name="combobox grid mode"
+ tool_tip="Choose the type of grid ruler for positioning the object"
+ top="83"
+ left="195"
+ top_pad="0"
+ width="60">
+ <combo_box.item
+ label="World"
+ name="World"
+ value="World" />
+ <combo_box.item
+ label="Local"
+ name="Local"
+ value="Local" />
+ <combo_box.item
+ label="Reference"
+ name="Reference"
+ value="Reference" />
+ <combo_box.commit_callback
+ function="BuildTool.gridMode"/>
+ </combo_box>
+
+ <button
+ left="259"
+ label=""
image_selected="ForwardArrow_Press"
image_unselected="ForwardArrow_Off"
layout="topleft"
+ follows="top|left"
name="Options..."
tool_tip="See more grid options"
- top_delta="0"
- right="-10"
- width="18"
- height="23" >
+ top="83"
+ width="25"
+ height="20" >
<button.commit_callback
function="BuildTool.gridOptions"/>
</button>
+
<button
follows="left|top"
height="20"
@@ -358,7 +385,7 @@
left="10"
name="ToolCube"
tool_tip="Cube"
- top="51"
+ top="58"
width="20" />
<button
follows="left|top"
@@ -420,10 +447,10 @@
image_selected="Object_Hemi_Cylinder_Selected"
image_unselected="Object_Hemi_Cylinder"
layout="topleft"
- left_delta="29"
+ left="10"
name="ToolHemiCylinder"
tool_tip="Hemicylinder"
- top_delta="0"
+ top="84"
width="20" />
<button
follows="left|top"
@@ -488,7 +515,7 @@
left="10"
name="ToolTorus"
tool_tip="Torus"
- top="77"
+ top="109"
width="20" />
<button
follows="left|top"
@@ -536,7 +563,8 @@
image_disabled_selected="Object_Grass"
image_selected="Object_Grass_Selected"
image_unselected="Object_Grass"
- image_overlay_color="Red"
+ image_overlay_color="1 0 0 .75"
+ image_overlay_selected_color="1 0 0 1"
layout="topleft"
left_delta="29"
name="ToolGrass"
@@ -548,9 +576,9 @@
height="19"
label="Keep Tool selected"
layout="topleft"
- left="4"
+ left="155"
name="checkbox sticky"
- top="101"
+ top="55"
width="128" />
<check_box
control_name="CreateToolCopySelection"
@@ -569,7 +597,7 @@
layout="topleft"
left_delta="18"
name="checkbox copy centers"
- top="132"
+ top="85"
width="134" />
<check_box
control_name="CreateToolCopyRotates"
@@ -723,31 +751,83 @@
function="BuildTool.applyToSelection"/>
</button>
<text
- text_color="LtGray_50"
- type="string"
- length="1"
- height="10"
- follows="left|top"
- halign="right"
- layout="topleft"
- right="-10"
- name="obj_count"
- top_pad="7"
- width="143">
- Objects: [COUNT]
- </text>
- <text
- text_color="LtGray_50"
- type="string"
- length="1"
- follows="left|top"
- halign="right"
- layout="topleft"
- right="-10"
- name="prim_count"
- width="143">
- Prims: [COUNT]
- </text>
+ text_color="LtGray_50"
+ type="string"
+ length="1"
+ height="16"
+ follows="left|top"
+ font="SansSerifSmall"
+ layout="topleft"
+ left="10"
+ name="selection_empty"
+ top_pad="0"
+ width="100">
+ Nothing selected.
+ </text>
+ <text
+ text_color="LtGray_50"
+ type="string"
+ length="1"
+ height="16"
+ follows="left|top"
+ font="SansSerifSmall"
+ layout="topleft"
+ left="10"
+ name="selection_count"
+ top_delta="0"
+ visible="false"
+ width="280">
+ </text>
+ <text
+ text_color="LtGray_50"
+ type="string"
+ length="1"
+ height="16"
+ follows="left|top"
+ font="SansSerifSmall"
+ layout="topleft"
+ left="10"
+ name="remaining_capacity"
+ top_pad="0"
+ visible="false"
+ width="280">
+ [CAPACITY_STRING] [secondlife:///app/openfloater/object_weights More info]
+ </text>
+ <!-- <text -->
+ <!-- text_color="LtGray_50" -->
+ <!-- type="string" -->
+ <!-- length="1" -->
+ <!-- height="10" -->
+ <!-- follows="left|top" -->
+ <!-- halign="right" -->
+ <!-- layout="topleft" -->
+ <!-- right="-10" -->
+ <!-- name="obj_count" -->
+ <!-- top_pad="5" -->
+ <!-- width="143"> -->
+ <!-- Objects: [COUNT] -->
+ <!-- </text> -->
+ <!-- <text -->
+ <!-- text_color="LtGray_50" -->
+ <!-- type="string" -->
+ <!-- length="1" -->
+ <!-- follows="left|top" -->
+ <!-- halign="right" -->
+ <!-- layout="topleft" -->
+ <!-- right="-10" -->
+ <!-- name="prim_count" -->
+ <!-- width="143"> -->
+ <!-- Prims: [COUNT] -->
+ <!-- </text> -->
+ <view_border
+ bevel_style="none"
+ follows="top|left"
+ height="0"
+ layout="topleft"
+ left="6"
+ name="cost_text_border"
+ top="135"
+ width="282"/>
<tab_container
follows="left|top"
height="410"
@@ -758,9 +838,11 @@
tab_min_width="40"
tab_position="top"
tab_height="25"
+ open_tabs_on_drag_and_drop="true"
top="173"
width="295">
- <panel
+
+<panel
border="false"
follows="all"
label="General"
@@ -872,13 +954,15 @@
length="1"
follows="left|top"
left_pad="0"
- height="30"
+ height="20"
layout="topleft"
name="Creator Name"
top_delta="0"
+ translate="false"
width="190"
- word_wrap="true">
- Mrs. Esbee Linden (esbee.linden)
+ word_wrap="true"
+ use_ellipses="true">
+ TestString PleaseIgnore (please.ignore)
</text>
<text
type="string"
@@ -888,7 +972,7 @@
height="19"
layout="topleft"
name="Owner:"
- top_pad="3"
+ top_pad="13"
width="90">
Owner:
</text>
@@ -897,14 +981,16 @@
type="string"
length="1"
follows="left|top"
- height="30"
+ height="20"
layout="topleft"
name="Owner Name"
left_pad="0"
top_delta="0"
+ translate="false"
width="190"
- word_wrap="true">
- Mrs. Erica "Moose" Linden (erica.linden)
+ word_wrap="true"
+ use_ellipses="true">
+ TestString PleaseIgnore (please.ignore)
</text>
<text
type="string"
@@ -914,7 +1000,7 @@
left="10"
height="18"
name="Group:"
- top_pad="7"
+ top_pad="17"
width="75">
Group:
</text>
@@ -1120,6 +1206,7 @@ even though the user gets a free copy.
label="Modify"
layout="topleft"
left="10"
+ height="10"
name="checkbox next owner can modify"
width="85" />
<check_box
@@ -1226,7 +1313,7 @@ even though the user gets a free copy.
<panel
border="false"
follows="all"
- height="367"
+ height="567"
label="Object"
layout="topleft"
left_delta="0"
@@ -1345,7 +1432,7 @@ even though the user gets a free copy.
label_width="10"
layout="topleft"
left_delta="0"
- max_val="10"
+ max_val="64"
min_val="0.01"
name="Scale X"
text_enabled_color="1 1 1 1"
@@ -1360,7 +1447,7 @@ even though the user gets a free copy.
label_width="10"
layout="topleft"
left_delta="0"
- max_val="10"
+ max_val="64"
min_val="0.01"
name="Scale Y"
text_enabled_color="1 1 1 1"
@@ -1375,7 +1462,7 @@ even though the user gets a free copy.
label_width="10"
layout="topleft"
left_delta="0"
- max_val="10"
+ max_val="64"
min_val="0.01"
name="Scale Z"
text_enabled_color="1 1 1 1"
@@ -1441,7 +1528,6 @@ even though the user gets a free copy.
text_enabled_color="1 1 1 1"
top_pad="3"
width="87" />
-
<!-- <text
type="string"
length="1"
@@ -1494,41 +1580,6 @@ even though the user gets a free copy.
name="Sculpted"
value="Sculpted" />
</combo_box>
- <combo_box
- height="19"
- layout="topleft"
- name="material"
- top_pad="5"
- width="150">
- <combo_box.item
- label="Stone"
- name="Stone"
- value="Stone" />
- <combo_box.item
- label="Metal"
- name="Metal"
- value="Metal" />
- <combo_box.item
- label="Glass"
- name="Glass"
- value="Glass" />
- <combo_box.item
- label="Wood"
- name="Wood"
- value="Wood" />
- <combo_box.item
- label="Flesh"
- name="Flesh"
- value="Flesh" />
- <combo_box.item
- label="Plastic"
- name="Plastic"
- value="Plastic" />
- <combo_box.item
- label="Rubber"
- name="Rubber"
- value="Rubber" />
- </combo_box>
<text
type="string"
length="1"
@@ -1829,26 +1880,26 @@ even though the user gets a free copy.
<spinner
follows="left|top"
height="19"
- increment="0.025"
+ increment="0.02"
initial_value="0"
label="B"
label_width="10"
layout="topleft"
left_delta="0"
- max_val="0.95"
+ max_val="0.98"
name="Path Limit Begin"
top_pad="3"
width="68" />
<spinner
follows="left|top"
height="19"
- increment="0.025"
+ increment="0.02"
initial_value="1"
label="E"
label_width="10"
layout="topleft"
left_pad="10"
- min_val="0.05"
+ min_val="0.02"
name="Path Limit End"
top_delta="0"
width="68" />
@@ -2000,26 +2051,22 @@ even though the user gets a free copy.
visible="false"
width="150">
<combo_box.item
- label="(none)"
- name="None"
- value="None" />
- <combo_box.item
label="Sphere"
name="Sphere"
- value="Sphere" />
+ value="1" />
<combo_box.item
label="Torus"
name="Torus"
- value="Torus" />
+ value="2" />
<combo_box.item
label="Plane"
name="Plane"
- value="Plane" />
+ value="3" />
<combo_box.item
label="Cylinder"
name="Cylinder"
- value="Cylinder" />
- </combo_box>
+ value="4" />
+ </combo_box>
</panel>
<panel
border="false"
@@ -2033,6 +2080,9 @@ even though the user gets a free copy.
name="Features"
top_delta="0"
width="295">
+ <panel.string name="None">None</panel.string>
+ <panel.string name="Prim">Prim</panel.string>
+ <panel.string name="Convex Hull">Convex Hull</panel.string>
<text
type="string"
length="1"
@@ -2175,6 +2225,7 @@ even though the user gets a free copy.
name="FlexForceZ"
top_pad="4"
width="128" />
+
<check_box
height="16"
label="Light"
@@ -2285,6 +2336,120 @@ even though the user gets a free copy.
mouse_opaque="true"
name="Light Ambiance"
width="120" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ name="label physicsshapetype"
+ top="38"
+ width="121">
+ Physics Shape Type:
+ </text>
+ <combo_box
+ height="19"
+ top_delta="15"
+ layout="topleft"
+ follows="left|top"
+ name="Physics Shape Type Combo Ctrl"
+ tool_tip="Choose the physics shape type"
+ width="108"/>
+ <combo_box
+ height="19"
+ layout="topleft"
+ name="material"
+ top_pad="5"
+ width="150">
+ <combo_box.item
+ label="Stone"
+ name="Stone"
+ value="Stone" />
+ <combo_box.item
+ label="Metal"
+ name="Metal"
+ value="Metal" />
+ <combo_box.item
+ label="Glass"
+ name="Glass"
+ value="Glass" />
+ <combo_box.item
+ label="Wood"
+ name="Wood"
+ value="Wood" />
+ <combo_box.item
+ label="Flesh"
+ name="Flesh"
+ value="Flesh" />
+ <combo_box.item
+ label="Plastic"
+ name="Plastic"
+ value="Plastic" />
+ <combo_box.item
+ label="Rubber"
+ name="Rubber"
+ value="Rubber" />
+ </combo_box>
+
+ <spinner
+ follows="left|top"
+ height="19"
+ increment="1"
+ initial_value="1"
+ label="Gravity"
+ label_width="70"
+ layout="topleft"
+ min_val="-1"
+ max_val="28"
+ name="Physics Gravity"
+ top_pad="10"
+ width="132" />
+
+ <spinner
+ follows="left|top"
+ height="19"
+ increment="0.1"
+ initial_value="0"
+ label="Friction"
+ label_width="70"
+ layout="topleft"
+ left_delta="0"
+ max_val="255"
+ min_val="0"
+ name="Physics Friction"
+ top_pad="4"
+ width="132" />
+
+ <spinner
+ follows="left|top"
+ height="19"
+ increment="0.1"
+ initial_value="0"
+ label="Density in 100 kg/m^3"
+ label_width="70"
+ label_wrap="true"
+ layout="topleft"
+ left_delta="0"
+ max_val="22587"
+ min_val="1"
+ name="Physics Density"
+ top_pad="4"
+ width="132" />
+
+ <spinner
+ follows="left|top"
+ height="19"
+ increment="0.01"
+ initial_value="0"
+ label="Restitution"
+ label_width="70"
+ layout="topleft"
+ left_delta="0"
+ max_val="1"
+ min_val="0"
+ name="Physics Restitution"
+ top_pad="8"
+ width="132" />
</panel>
<panel
border="false"
@@ -2351,7 +2516,7 @@ even though the user gets a free copy.
initial_value="0"
layout="topleft"
left_delta="0"
- max_val="90"
+ max_val="100"
name="ColorTrans"
top_pad="4"
width="80" />
diff --git a/indra/newview/skins/default/xui/en/floater_top_objects.xml b/indra/newview/skins/default/xui/en/floater_top_objects.xml
index b06c6dc215..4dfdcd15c7 100644
--- a/indra/newview/skins/default/xui/en/floater_top_objects.xml
+++ b/indra/newview/skins/default/xui/en/floater_top_objects.xml
@@ -105,7 +105,7 @@
left_delta="0"
name="id_text"
top_pad="10"
- width="100">
+ width="107">
Object ID:
</text>
<line_editor
@@ -116,7 +116,7 @@
left_pad="3"
name="id_editor"
top_delta="-3"
- width="575" />
+ width="568" />
<button
follows="bottom|right"
height="23"
@@ -138,7 +138,7 @@
left="10"
top_pad="5"
name="obj_name_text"
- width="100">
+ width="107">
Object name:
</text>
<line_editor
@@ -148,7 +148,7 @@
left_pad="3"
name="object_name_editor"
top_delta="-3"
- width="575" />
+ width="568" />
<button
follows="bottom|right"
height="23"
@@ -170,7 +170,7 @@
left="10"
top_pad="5"
name="owner_name_text"
- width="100">
+ width="107">
Owner:
</text>
<line_editor
@@ -180,7 +180,7 @@
left_pad="3"
name="owner_name_editor"
top_delta="-3"
- width="575" />
+ width="568" />
<button
follows="bottom|right"
height="23"
diff --git a/indra/newview/skins/default/xui/en/floater_toybox.xml b/indra/newview/skins/default/xui/en/floater_toybox.xml
new file mode 100644
index 0000000000..d8211c24a7
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_toybox.xml
@@ -0,0 +1,114 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ can_close="true"
+ can_dock="false"
+ can_minimize="false"
+ can_resize="false"
+ default_tab_group="1"
+ height="375"
+ help_topic="toybox"
+ layout="topleft"
+ legacy_header_height="18"
+ name="Toybox"
+ positioning="centered"
+ save_rect="true"
+ single_instance="true"
+ title="TOOLBAR BUTTONS"
+ width="650">
+ <text
+ follows="left|top"
+ font="SansSerifMedium"
+ valign="top"
+ halign="left"
+ height="20"
+ layout="topleft"
+ left="20"
+ length="1"
+ name="toybox label 1"
+ right="-20"
+ top="35"
+ type="string">
+ Add or remove buttons by dragging them to or from the toolbars.
+ </text>
+ <text
+ follows="left|top"
+ font="SansSerifMedium"
+ valign="top"
+ halign="left"
+ height="20"
+ layout="topleft"
+ left="20"
+ length="1"
+ name="toybox label 2"
+ right="-20"
+ top="55"
+ type="string">
+ Buttons will appear as shown or as icon-only depending on each toolbar's settings.
+ </text>
+ <toolbar
+ bottom="310"
+ button_display_mode="icons_with_text"
+ follows="all"
+ left="20"
+ button_icon_and_text.button_width.max="140"
+ button_icon_and_text.button_width.min="70"
+ name="toybox_toolbar"
+ pad_left="5"
+ pad_right="5"
+ pad_top="5"
+ pad_bottom="5"
+ pad_between="15"
+ read_only="true"
+ right="-20"
+ side="top"
+ top="85">
+ <button_panel background_visible="false" />
+ <button_icon_and_text image_unselected="PushButton_Off"
+ image_selected="PushButton_Off"
+ image_disabled_selected="PushButton_Disabled"
+ image_disabled="PushButton_Disabled"
+ label_color="ButtonLabelColor"
+ label_color_selected="ButtonLabelColor"
+ label_color_disabled="ButtonLabelDisabledColor"
+ label_color_disabled_selected="ButtonLabelDisabledColor"
+ image_color="ButtonImageColor"
+ image_color_disabled="ButtonImageColor"
+ flash_color="ButtonUnselectedFgColor"
+ halign="left"
+ hover_glow_amount="0.15"
+ sound_flags="0"
+ display_pressed_state="false" />
+ </toolbar>
+ <panel
+ bevel_style="none"
+ border="true"
+ bottom="311"
+ follows="left|bottom|right"
+ left="20"
+ right="-20"
+ top="311" />
+ <button
+ follows="left|bottom|right"
+ height="23"
+ label="Clear all toolbars"
+ label_selected="Clear all toolbars"
+ layout="topleft"
+ left="185"
+ name="btn_clear_all"
+ top="330"
+ width="130">
+ <button.commit_callback function="Toybox.ClearAll" />
+ </button>
+ <button
+ follows="left|bottom|right"
+ height="23"
+ label="Restore defaults"
+ label_selected="Restore defaults"
+ layout="topleft"
+ left="335"
+ name="btn_restore_defaults"
+ top="330"
+ width="130">
+ <button.commit_callback function="Toybox.RestoreDefaults" />
+ </button>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_translation_settings.xml b/indra/newview/skins/default/xui/en/floater_translation_settings.xml
new file mode 100644
index 0000000000..a212ce7889
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_translation_settings.xml
@@ -0,0 +1,244 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ legacy_header_height="18"
+ height="310"
+ layout="topleft"
+ name="floater_translation_settings"
+ help_topic="translation_settings"
+ save_rect="true"
+ title="CHAT TRANSLATION SETTINGS"
+ width="485">
+
+ <string name="bing_api_key_not_verified">Bing appID not verified. Please try again.</string>
+ <string name="google_api_key_not_verified">Google API key not verified. Please try again.</string>
+
+ <string name="bing_api_key_verified">Bing appID verified.</string>
+ <string name="google_api_key_verified">Google API key verified.</string>
+
+ <check_box
+ height="16"
+ label="Enable machine translation while chatting"
+ layout="topleft"
+ left="10"
+ name="translate_chat_checkbox"
+ top="30"
+ width="20" />
+ <text
+ height="20"
+ follows="left|top"
+ layout="topleft"
+ left="40"
+ name="translate_language_label"
+ top_pad="20"
+ width="130">
+ Translate chat into:
+ </text>
+ <combo_box
+ allow_text_entry="true"
+ follows="left|top"
+ height="23"
+ left_pad="10"
+ max_chars="135"
+ mouse_opaque="true"
+ name="translate_language_combo"
+ top_delta="-5"
+ width="190">
+ <combo_box.item
+ label="System Default"
+ name="System Default Language"
+ value="default" />
+ <combo_box.item
+ label="English"
+ name="English"
+ value="en" />
+ <!-- After "System Default" and "English", please keep the rest of these combo_box.items in alphabetical order by the first character in the string. -->
+ <combo_box.item
+ label="Dansk (Danish)"
+ name="Danish"
+ value="da" />
+ <combo_box.item
+ label="Deutsch (German)"
+ name="German"
+ value="de" />
+ <combo_box.item
+ label="Español (Spanish)"
+ name="Spanish"
+ value="es" />
+ <combo_box.item
+ label="Français (French)"
+ name="French"
+ value="fr" />
+ <combo_box.item
+ label="Italiano (Italian)"
+ name="Italian"
+ value="it" />
+ <combo_box.item
+ label="Magyar (Hungarian)"
+ name="Hungarian"
+ value="hu" />
+ <combo_box.item
+ label="Nederlands (Dutch)"
+ name="Dutch"
+ value="nl" />
+ <combo_box.item
+ label="Polski (Polish)"
+ name="Polish"
+ value="pl" />
+ <combo_box.item
+ label="Português (Portuguese)"
+ name="Portugese"
+ value="pt" />
+ <combo_box.item
+ label="РуÑÑкий (Russian)"
+ name="Russian"
+ value="ru" />
+ <combo_box.item
+ label="Türkçe (Turkish)"
+ name="Turkish"
+ value="tr" />
+ <combo_box.item
+ label="УкраїнÑька (Ukrainian)"
+ name="Ukrainian"
+ value="uk" />
+ <combo_box.item
+ label="中文 (正體) (Chinese)"
+ name="Chinese"
+ value="zh" />
+ <combo_box.item
+ label="日本語 (Japanese)"
+ name="Japanese"
+ value="ja" />
+ <combo_box.item
+ label="한국어 (Korean)"
+ name="Korean"
+ value="ko" />
+ </combo_box>
+
+ <text
+ follows="top|left|right"
+ height="15"
+ layout="topleft"
+ left="40"
+ name="tip"
+ top_pad="20"
+ width="330"
+ wrap="true">
+ Choose translation service:
+ </text>
+
+ <radio_group
+ follows="top|left"
+ height="80"
+ layout="topleft"
+ left_delta="10"
+ name="translation_service_rg"
+ top_pad="20"
+ width="320">
+ <radio_item
+ initial_value="bing"
+ label="Bing Translator"
+ layout="topleft"
+ name="bing" />
+ <radio_item
+ initial_value="google"
+ label="Google Translate"
+ layout="topleft"
+ name="google"
+ top_pad="55" />
+ </radio_group>
+
+ <text
+ type="string"
+ length="1"
+ follows="top|right"
+ height="20"
+ layout="topleft"
+ left="70"
+ name="bing_api_key_label"
+ top_pad="-55"
+ width="85">
+ Bing [http://www.bing.com/developers/createapp.aspx AppID]:
+ </text>
+ <line_editor
+ default_text="Enter Bing AppID and click &quot;Verify&quot;"
+ follows="top|left"
+ height="20"
+ layout="topleft"
+ left_pad="10"
+ max_length_chars="50"
+ top_delta="-4"
+ name="bing_api_key"
+ width="210" />
+ <button
+ follows="left|top"
+ height="23"
+ label="Verify"
+ layout="topleft"
+ left_pad="10"
+ name="verify_bing_api_key_btn"
+ top_delta="-2"
+ width="90" />
+
+ <text
+ follows="top|right"
+ height="20"
+ layout="topleft"
+ left="70"
+ length="1"
+ name="google_api_key_label"
+ top_pad="50"
+ type="string"
+ width="85">
+ Google [http://code.google.com/apis/language/translate/v2/getting_started.html#auth API key]:
+ </text>
+ <line_editor
+ default_text="Enter Google API key and click &quot;Verify&quot;"
+ follows="top|left"
+ height="20"
+ layout="topleft"
+ left_pad="10"
+ max_length_chars="50"
+ top_delta="-4"
+ name="google_api_key"
+ width="210" />
+ <button
+ follows="left|top"
+ height="23"
+ label="Verify"
+ layout="topleft"
+ left_pad="10"
+ name="verify_google_api_key_btn"
+ top_delta="-2"
+ width="90" />
+
+ <text
+ follows="top|right"
+ height="20"
+ layout="topleft"
+ left="185"
+ length="1"
+ name="google_links_text"
+ top_delta="-23"
+ type="string"
+ width="100">
+ [http://code.google.com/apis/language/translate/v2/pricing.html Pricing] | [https://code.google.com/apis/console Stats]
+ </text>
+
+ <button
+ follows="left|top"
+ height="23"
+ label="OK"
+ layout="topleft"
+ right="-120"
+ name="ok_btn"
+ top="-30"
+ width="100" />
+ <button
+ follows="left|top"
+ height="23"
+ label="Cancel"
+ layout="topleft"
+ left_pad="10"
+ name="cancel_btn"
+ width="100" />
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_ui_preview.xml b/indra/newview/skins/default/xui/en/floater_ui_preview.xml
index 12c4561753..06d4327293 100644
--- a/indra/newview/skins/default/xui/en/floater_ui_preview.xml
+++ b/indra/newview/skins/default/xui/en/floater_ui_preview.xml
@@ -12,12 +12,17 @@
title="XUI PREVIEW TOOL"
translate="false"
width="750">
+ <string name="ExternalEditorNotSet">
+Select an editor by setting the environment variable LL_XUI_EDITOR
+or the ExternalEditor setting
+or specifying its path in the "Editor Path" field.</string>
<panel
bottom="640"
follows="left|top|right|bottom"
layout="topleft"
left="0"
mouse_opaque="false"
+ default_tab_group="1"
name="main_panel"
right="750"
top="0">
@@ -192,6 +197,7 @@
left="10"
name="name_list"
right="-10"
+ tab_group="1"
search_column="1"
top="80">
<scroll_list.columns
diff --git a/indra/newview/skins/default/xui/en/floater_voice_controls.xml b/indra/newview/skins/default/xui/en/floater_voice_controls.xml
index 1432099590..dce2720cf8 100644
--- a/indra/newview/skins/default/xui/en/floater_voice_controls.xml
+++ b/indra/newview/skins/default/xui/en/floater_voice_controls.xml
@@ -1,15 +1,17 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
+ positioning="cascading"
can_resize="true"
can_minimize="true"
- can_close="false"
+ can_close="true"
+ chrome="true"
height="205"
layout="topleft"
min_height="124"
min_width="190"
name="floater_voice_controls"
help_topic="floater_voice_controls"
- title="Voice Controls"
+ title="VOICE CONTROLS"
save_dock_state="true"
save_visibility="true"
save_rect="true"
@@ -17,19 +19,19 @@
width="282">
<string
name="title_nearby">
- NEARBY VOICE
+ VOICE SETTINGS
</string>
<string
name="title_group">
- Group Call with [GROUP]
+ GROUP CALL WITH [GROUP]
</string>
<string
name="title_adhoc">
- Conference Call
+ CONFERENCE CALL
</string>
<string
name="title_peer_2_peer">
- Call with [NAME]
+ CALL WITH [NAME]
</string>
<string
name="no_one_near">
@@ -47,9 +49,9 @@
width="263">
<layout_panel
follows="top|left|right"
- user_resize="false"
auto_resize="false"
layout="topleft"
+ min_height="20"
height="20"
name="my_panel">
<avatar_icon
@@ -69,7 +71,7 @@
layout="topleft"
left_pad="10"
name="user_text"
- text_color="white"
+ text_color="White"
top="4"
use_ellipses="true"
value="My Avatar:"
@@ -86,10 +88,9 @@
visible="true"
width="20" />
</layout_panel>
- <layout_panel name="leave_call_panel" height="26" auto_resize="false">
+ <layout_panel name="leave_call_panel" height="26" min_height="26" auto_resize="false">
<layout_stack
clip="true"
- auto_resize="false"
follows="left|top|right"
height="26"
layout="topleft"
@@ -108,7 +109,6 @@
</layout_panel>
<layout_panel
auto_resize="false"
- user_resize="false"
follows="top|right"
height="23"
visible="true"
@@ -131,7 +131,7 @@
top_pad="0"
height="132"
name="callers_panel"
- user_resize="false"
+ auto_resize="true"
width="280">
<avatar_list
follows="all"
diff --git a/indra/newview/skins/default/xui/en/floater_voice_effect.xml b/indra/newview/skins/default/xui/en/floater_voice_effect.xml
index 9bf9cc6c77..35cb2670d0 100644
--- a/indra/newview/skins/default/xui/en/floater_voice_effect.xml
+++ b/indra/newview/skins/default/xui/en/floater_voice_effect.xml
@@ -7,7 +7,6 @@
help_topic="voice_effects"
title="VOICE MORPHING"
background_visible="true"
- follows="all"
label="Places"
layout="topleft"
min_height="360"
@@ -25,6 +24,53 @@
<string name="new_voice_effect">
(New!)
</string>
+
+ <!-- effect names begin -->
+ <string name="effect_Arena">Arena</string>
+ <string name="effect_Beast">Beast</string>
+ <string name="effect_Buff">Buff</string>
+ <string name="effect_Buzz">Buzz</string>
+ <string name="effect_Camille">Camille</string>
+ <string name="effect_Creepy">Creepy</string>
+ <string name="effect_CreepyBot">CreepyBot</string>
+ <string name="effect_Cyber">Cyber</string>
+ <string name="effect_DeepBot">DeepBot</string>
+ <string name="effect_Demon">Demon</string>
+ <string name="effect_Female Elf">Female Elf</string>
+ <string name="effect_Flirty">Flirty</string>
+ <string name="effect_Foxy">Foxy</string>
+ <string name="effect_Halloween 2010 Bonus">Halloween_2010_Bonus</string>
+ <string name="effect_Helium">Helium</string>
+ <string name="effect_Husky">Husky</string>
+ <string name="effect_Husky Whisper">Husky Whisper</string>
+ <string name="effect_Intercom">Intercom</string>
+ <string name="effect_Julia">Julia</string>
+ <string name="effect_Lo Lilt">Lo Lilt</string>
+ <string name="effect_Macho">Macho</string>
+ <string name="effect_Micro">Micro</string>
+ <string name="effect_Mini">Mini</string>
+ <string name="effect_Model">Model</string>
+ <string name="effect_Nano">Nano</string>
+ <string name="effect_Nightmare">Nightmare</string>
+ <string name="effect_PopBot">PopBot</string>
+ <string name="effect_Rachel">Rachel</string>
+ <string name="effect_Radio">Radio</string>
+ <string name="effect_Robot">Robot</string>
+ <string name="effect_Roxanne">Roxanne</string>
+ <string name="effect_Rumble">Rumble</string>
+ <string name="effect_Sabrina">Sabrina</string>
+ <string name="effect_Samantha">Samantha</string>
+ <string name="effect_Sexy">Sexy</string>
+ <string name="effect_Shorty">Shorty</string>
+ <string name="effect_Smaller">Smaller</string>
+ <string name="effect_Sneaky">Sneaky</string>
+ <string name="effect_Stallion">Stallion</string>
+ <string name="effect_Sultry">Sultry</string>
+ <string name="effect_Thunder">Thunder</string>
+ <string name="effect_Vixen">Vixen</string>
+ <string name="effect_WhinyBot">WhinyBot</string>
+ <!-- effect names end -->
+
<text
height="16"
word_wrap="true"
diff --git a/indra/newview/skins/default/xui/en/floater_water.xml b/indra/newview/skins/default/xui/en/floater_water.xml
deleted file mode 100644
index 3a44ba3763..0000000000
--- a/indra/newview/skins/default/xui/en/floater_water.xml
+++ /dev/null
@@ -1,503 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater
- legacy_header_height="18"
- height="240"
- layout="topleft"
- name="Water Floater"
- help_topic="water_floater"
- save_rect="true"
- title="ADVANCED WATER EDITOR"
- width="700">
- <floater.string
- name="WLDefaultWaterNames">
- Default:Glassy:Pond:Murky:Second Plague:SNAKE!!!:Valdez
- </floater.string>
- <text
- type="string"
- length="1"
- follows="left|top|right"
- height="16"
- layout="topleft"
- left="10"
- name="KeyFramePresetsText"
- top="34"
- font="SansSerif"
- width="85">
- Water Presets:
- </text>
- <combo_box
- height="23"
- layout="topleft"
- left_delta="95"
- name="WaterPresetsCombo"
- top_delta="-4"
- width="150" />
- <button
- height="23"
- label="New"
- label_selected="New"
- layout="topleft"
- left_pad="3"
- name="WaterNewPreset"
- top_delta="0"
- width="70" />
- <button
- height="23"
- label="Save"
- label_selected="Save"
- layout="topleft"
- left_pad="3"
- name="WaterSavePreset"
- top_delta="0"
- width="70" />
- <button
- height="23"
- label="Delete"
- label_selected="Delete"
- layout="topleft"
- left_pad="3"
- name="WaterDeletePreset"
- top_delta="0"
- width="70" />
- <tab_container
- border="false"
- follows="left|top"
- height="180"
- halign="center"
- layout="topleft"
- left="0"
- name="Water Tabs"
- tab_position="top"
- top="60"
- width="700">
- <panel
- border="true"
- follows="all"
- height="180"
- label="SETTINGS"
- layout="topleft"
- left="0"
- mouse_opaque="false"
- help_topic="water_settings_tab"
- name="Settings"
- top="0"
- width="698">
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left="10"
- name="BHText"
- top="4"
- width="200">
- Water Fog Color
- </text>
- <color_swatch
- can_apply_immediately="true"
- color="0.5 0.5 0.5 1"
- follows="left|top"
- height="50"
- layout="topleft"
- left="40"
- name="WaterFogColor"
- tool_tip="Click to open color picker"
- top="30"
- width="40" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left="10"
- name="WaterFogDensText"
- top="84"
- width="200">
- Fog Density Exponent
- </text>
- <slider
- control_name="WaterFogDensity"
- decimal_digits="1"
- follows="left"
- height="10"
- initial_value="16"
- layout="topleft"
- left="24"
- max_val="10"
- name="WaterFogDensity"
- top="124"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left_delta="-14"
- name="WaterUnderWaterFogModText"
- top="124"
- width="200">
- Underwater Fog Modifier
- </text>
- <slider
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="16"
- layout="topleft"
- left="24"
- max_val="2"
- name="WaterUnderWaterFogMod"
- top="164"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left="245"
- name="BDensText"
- top="4"
- width="200">
- Reflection Wavelet Scale
- </text>
- <slider
- control_name="WaterNormalScaleX"
- decimal_digits="1"
- follows="left"
- height="15"
- initial_value="0.7"
- label="1"
- layout="topleft"
- max_val="10"
- name="WaterNormalScaleX"
- top_pad="24"
- width="200" />
- <slider
- control_name="WaterNormalScaleY"
- decimal_digits="1"
- follows="left"
- height="15"
- initial_value="0.7"
- label="2"
- layout="topleft"
- max_val="10"
- name="WaterNormalScaleY"
- top_pad="4"
- width="200" />
- <slider
- control_name="WaterNormalScaleZ"
- decimal_digits="1"
- follows="left"
- height="15"
- initial_value="0.7"
- label="3"
- layout="topleft"
- max_val="10"
- name="WaterNormalScaleZ"
- top_pad="4"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- name="HDText"
- top="84"
- width="200">
- Fresnel Scale
- </text>
- <slider
- control_name="WaterFresnelScale"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.7"
- layout="topleft"
- name="WaterFresnelScale"
- top="124"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- name="FresnelOffsetText"
- top="124"
- width="200">
- Fresnel Offset
- </text>
- <slider
- control_name="WaterFresnelOffset"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.7"
- layout="topleft"
- name="WaterFresnelOffset"
- top="164"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left="480"
- name="DensMultText"
- top="4"
- width="200">
- Refract Scale Above
- </text>
- <slider
- control_name="WaterScaleAbove"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.1"
- layout="topleft"
- left="494"
- name="WaterScaleAbove"
- top="44"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left_delta="-14"
- name="WaterScaleBelowText"
- top="44"
- width="200">
- Refract Scale Below
- </text>
- <slider
- control_name="WaterScaleBelow"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0"
- layout="topleft"
- left="494"
- name="WaterScaleBelow"
- top="84"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left_delta="-14"
- name="MaxAltText"
- top="84"
- width="200">
- Blur Multiplier
- </text>
- <slider
- control_name="WaterBlurMult"
- follows="left"
- height="10"
- increment="0.001"
- initial_value="0"
- layout="topleft"
- left="494"
- max_val="0.16"
- name="WaterBlurMult"
- top="124"
- width="200" />
- </panel>
- <panel
- border="true"
- follows="all"
- height="180"
- label="IMAGE"
- layout="topleft"
- left="0"
- mouse_opaque="false"
- help_topic="water_waves_tab"
- name="Waves"
- top="0"
- width="698">
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left="10"
- name="BHText"
- top="4"
- width="200">
- Big Wave Direction
- </text>
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left="10"
- name="WaterWave1DirXText"
- top_pad="5"
- width="10">
- X
- </text>
- <slider
- control_name="WaterWave1DirX"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.7"
- layout="topleft"
- left="24"
- max_val="4"
- min_val="-4"
- name="WaterWave1DirX"
- left_pad="3"
- top_pad="6"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left_delta="-13"
- name="WaterWave1DirYText"
- top_pad="-15"
- width="10">
- Y
- </text>
- <slider
- control_name="WaterWave1DirY"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.7"
- layout="topleft"
- left_delta="0"
- max_val="4"
- min_val="-4"
- name="WaterWave1DirY"
- left_pad="3"
- top_pad="6"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left_delta="-13"
- name="BHText2"
- top_pad="-10"
- width="355">
- Little Wave Direction
- </text>
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left="10"
- left_delta="0"
- name="WaterWave2DirXText"
- top_pad="5"
- width="10">
- X
- </text>
- <slider
- control_name="WaterWave2DirX"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.7"
- layout="topleft"
- left="24"
- max_val="4"
- min_val="-4"
- name="WaterWave2DirX"
- left_pad="3"
- top_pad="6"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left_delta="-13"
- name="WaterWave2DirYText"
- top_pad="-15"
- width="10">
- Y
- </text>
- <slider
- control_name="WaterWave2DirY"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.7"
- layout="topleft"
- left_delta="0"
- max_val="4"
- min_val="-4"
- name="WaterWave2DirY"
- left_pad="3"
- top_pad="6"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left="240"
- name="BHText3"
- top="4"
- width="200">
- Normal Map
- </text>
- <texture_picker
- height="143"
- layout="topleft"
- left="250"
- name="WaterNormalMap"
- top="22"
- width="128" />
- </panel>
- </tab_container>
-</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_web_content.xml b/indra/newview/skins/default/xui/en/floater_web_content.xml
new file mode 100644
index 0000000000..cea10adca8
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_web_content.xml
@@ -0,0 +1,198 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ legacy_header_height="18"
+ can_resize="true"
+ height="775"
+ layout="topleft"
+ min_height="400"
+ min_width="500"
+ name="floater_web_content"
+ help_topic="floater_web_content"
+ save_rect="true"
+ title=""
+ initial_mime_type="text/html"
+ width="780">
+ <layout_stack
+ bottom="775"
+ follows="left|right|top|bottom"
+ layout="topleft"
+ left="5"
+ animate="false"
+ name="stack1"
+ orientation="vertical"
+ top="20"
+ width="770">
+ <layout_panel
+ auto_resize="false"
+ default_tab_group="1"
+ height="22"
+ layout="topleft"
+ left="0"
+ min_height="20"
+ name="nav_controls"
+ top="400"
+ width="770">
+ <button
+ image_overlay="Arrow_Left_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ chrome="true"
+ hover_glow_amount="0.15"
+ tool_tip="Navigate back"
+ follows="left|top"
+ height="22"
+ layout="topleft"
+ left="1"
+ name="back"
+ top="0"
+ width="22">
+ <button.commit_callback
+ function="WebContent.Back" />
+ </button>
+ <button
+ image_overlay="Arrow_Right_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ chrome="true"
+ tool_tip="Navigate forward"
+ follows="left|top"
+ height="22"
+ layout="topleft"
+ left="27"
+ name="forward"
+ top_delta="0"
+ width="22">
+ <button.commit_callback
+ function="WebContent.Forward" />
+ </button>
+ <button
+ image_overlay="Stop_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ chrome="true"
+ tool_tip="Stop navigation"
+ enabled="true"
+ follows="left|top"
+ height="22"
+ layout="topleft"
+ left="51"
+ name="stop"
+ top_delta="0"
+ width="22">
+ <button.commit_callback
+ function="WebContent.Stop" />
+ </button>
+ <button
+ image_overlay="Refresh_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ chrome="true"
+ tool_tip="Reload page"
+ follows="left|top"
+ height="22"
+ layout="topleft"
+ left="51"
+ name="reload"
+ top_delta="0"
+ width="22">
+ <button.commit_callback
+ function="WebContent.Reload" />
+ </button>
+ <combo_box
+ allow_text_entry="true"
+ follows="left|top|right"
+ tab_group="1"
+ height="22"
+ layout="topleft"
+ left_pad="4"
+ max_chars="1024"
+ name="address"
+ combo_editor.select_on_focus="true"
+ tool_tip="Enter URL here"
+ top_delta="0"
+ width="672">
+ <combo_box.commit_callback
+ function="WebContent.EnterAddress" />
+ </combo_box>
+ <icon
+ name="media_secure_lock_flag"
+ height="16"
+ follows="top|right"
+ image_name="Lock2"
+ layout="topleft"
+ left_delta="620"
+ top_delta="2"
+ visible="false"
+ tool_tip="Secured Browsing"
+ width="16" />
+ <button
+ image_overlay="ExternalBrowser_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ chrome="true"
+ tool_tip="Open current URL in your desktop browser"
+ follows="right|top"
+ enabled="true"
+ height="22"
+ layout="topleft"
+ name="popexternal"
+ right="770"
+ top_delta="-2"
+ width="22">
+ <button.commit_callback
+ function="WebContent.PopExternal" />
+ </button>
+ </layout_panel>
+ <layout_panel
+ height="40"
+ layout="topleft"
+ left_delta="0"
+ name="external_controls"
+ top_delta="0"
+ auto_resize="true"
+ width="585">
+ <web_browser
+ bottom="-2"
+ follows="all"
+ layout="topleft"
+ left="0"
+ name="webbrowser"
+ top="0"/>
+ </layout_panel>
+ <layout_panel name="status_bar"
+ height="23"
+ auto_resize="false">
+ <text
+ type="string"
+ length="200"
+ follows="bottom|left"
+ height="20"
+ layout="topleft"
+ left_delta="0"
+ name="statusbartext"
+ parse_urls="false"
+ text_color="0.4 0.4 0.4 1"
+ top_pad="3"
+ width="495"/>
+ <progress_bar
+ color_bar="0.3 1.0 0.3 1"
+ follows="bottom|right"
+ height="16"
+ top_delta="-1"
+ left_pad="24"
+ layout="topleft"
+ name="statusbarprogress"
+ width="64"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_web_profile.xml b/indra/newview/skins/default/xui/en/floater_web_profile.xml
new file mode 100644
index 0000000000..d0225f78a9
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_web_profile.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater name="floater_web_profile"
+ help_topic="web_profile"
+ width="780"
+ height="775"
+ filename="floater_web_content.xml"/> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/floater_windlight_options.xml b/indra/newview/skins/default/xui/en/floater_windlight_options.xml
deleted file mode 100644
index 85a5be369c..0000000000
--- a/indra/newview/skins/default/xui/en/floater_windlight_options.xml
+++ /dev/null
@@ -1,1287 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater
- legacy_header_height="18"
- height="256"
- layout="topleft"
- name="WindLight floater"
- help_topic="windlight_floater"
- save_rect="true"
- title="ADVANCED SKY EDITOR"
- width="700">
- <floater.string
- name="WLDefaultSkyNames">
- A-12AM:A-12PM:A-3AM:A-3PM:A-4.30PM:A-6AM:A-6PM:A-9AM:A-9PM:Barcelona:Blizzard:Blue Midday:Coastal Afternoon:Coastal Sunset:Default:Desert Sunset:Fine Day:Fluffy Big Clouds:Foggy:Funky Funky:Funky Funky Funky:Gelatto:Ghost:Incongruent Truths:Midday 1:Midday 2:Midday 3:Midday 4:Night:Pirate:Purple:Sailor&apos;s Delight:Sheer Sensuality
- </floater.string>
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left="10"
- name="KeyFramePresetsText"
- top="34"
- width="85">
- Sky Presets:
- </text>
- <combo_box
- height="23"
- layout="topleft"
- left_delta="85"
- name="WLPresetsCombo"
- top_delta="-4"
- width="150" />
- <button
- height="23"
- label="New"
- label_selected="New"
- layout="topleft"
- left_pad="3"
- name="WLNewPreset"
- width="70" />
- <button
- height="23"
- label="Save"
- label_selected="Save"
- layout="topleft"
- left_pad="3"
- name="WLSavePreset"
- width="70" />
- <button
- height="23"
- label="Delete"
- label_selected="Delete"
- layout="topleft"
- left_pad="3"
- name="WLDeletePreset"
- width="70" />
- <button
- height="23"
- label="Day Cycle Editor"
- label_selected="Day Cycle Editor"
- layout="topleft"
- right="-10"
- name="WLDayCycleMenuButton"
- top_pad="-23"
- width="120" />
- <tab_container
- follows="left|top"
- height="196"
- halign="center"
- layout="topleft"
- left="0"
- name="WindLight Tabs"
- tab_position="top"
- top="60"
- width="700">
- <panel
- border="true"
- follows="left|top|right|bottom"
- height="196"
- label="ATMOSPHERE"
- layout="topleft"
- left="1"
- mouse_opaque="false"
- help_topic="windlight_atmosphere_tab"
- name="Atmosphere"
- top="60"
- width="698">
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left="10"
- name="BHText"
- top="4"
- width="355">
- Blue Horizon
- </text>
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left="10"
- name="BHText2"
- top_pad="5"
- width="10">
- R
- </text>
- <slider
- control_name="WLBlueHorizonR"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.7"
- layout="topleft"
- left_pad="3"
- top_pad="6"
- name="WLBlueHorizonR"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left="10"
- top_pad="-15"
- name="BHText3"
- width="10">
- G
- </text>
- <slider
- control_name="WLBlueHorizonG"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.7"
- layout="topleft"
- left_delta="0"
- name="WLBlueHorizonG"
- left_pad="3"
- top_pad="6"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- name="BHText4"
- left="10"
- top_pad="-15"
- width="10">
- B
- </text>
- <slider
- control_name="WLBlueHorizonB"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.7"
- layout="topleft"
- name="WLBlueHorizonB"
- left_pad="3"
- top_pad="6"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- name="BHText5"
- left="10"
- top_pad="-15"
- width="10">
- I
- </text>
- <slider
- control_name="WLBlueHorizonI"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="1.0"
- layout="topleft"
- name="WLBlueHorizonI"
- left_pad="3"
- top_pad="6"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left="10"
- top_pad="-10"
- name="BDensText"
- width="355">
- Haze Horizon
- </text>
- <slider
- control_name="WLHazeHorizon"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.25"
- layout="topleft"
- left="23"
- top_delta="0"
- top_pad="27"
- name="WLHazeHorizon"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left="245"
- name="BDensText2"
- top="4"
- width="355">
- Blue Density
- </text>
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left="245"
- name="BHText6"
- top_pad="5"
- width="10">
- R
- </text>
- <slider
- control_name="WLBlueDensityR"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.7"
- layout="topleft"
- left_pad="3"
- top_pad="6"
- name="WLBlueDensityR"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left="245"
- name="BHText7"
- top_pad="-15"
- width="10">
- G
- </text>
- <slider
- control_name="WLBlueDensityG"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.7"
- layout="topleft"
- left_delta="0"
- name="WLBlueDensityG"
- left_pad="3"
- top_pad="6"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left="245"
- name="BHText8"
- top_pad="-15"
- width="10">
- B
- </text>
- <slider
- control_name="WLBlueDensityB"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.7"
- layout="topleft"
- left_delta="0"
- name="WLBlueDensityB"
- left_pad="3"
- top_pad="6"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left="245"
- name="BHText9"
- top_pad="-15"
- width="10">
- I
- </text>
- <slider
- control_name="WLBlueDensityI"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="1"
- layout="topleft"
- left_delta="0"
- name="WLBlueDensityI"
- left_pad="3"
- top_pad="6"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left="245"
- name="HDText"
- top_pad="-10"
- width="355">
- Haze Density
- </text>
- <slider
- control_name="WLHazeDensity"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.7"
- layout="topleft"
- left="258"
- max_val="4"
- name="WLHazeDensity"
- top_pad="27"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left="480"
- name="DensMultText"
- top="4"
- width="355">
- Density Multiplier
- </text>
- <slider
- control_name="WLDensityMult"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.1"
- layout="topleft"
- left_delta="13"
- max_val="0.9"
- name="WLDensityMult"
- top_pad="27"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left_delta="-13"
- name="WLDistanceMultText"
- top_pad="-10"
- width="355">
- Distance Multiplier
- </text>
- <slider
- control_name="WLDistancMult"
- decimal_digits="1"
- follows="left"
- height="10"
- initial_value="1.0"
- layout="topleft"
- left_delta="13"
- max_val="100"
- name="WLDistanceMult"
- top_pad="27"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left_delta="-13"
- name="MaxAltText"
- top_pad="-15"
- width="355">
- Max Altitude
- </text>
- <slider
- control_name="WLMaxAltitude"
- decimal_digits="0"
- follows="left"
- height="10"
- increment="1"
- initial_value="500"
- layout="topleft"
- left_delta="13"
- max_val="4000"
- name="WLMaxAltitude"
- top_pad="27"
- width="200" />
- </panel>
- <panel
- border="true"
- follows="left|top|right|bottom"
- height="196"
- label="LIGHTING"
- layout="topleft"
- left_delta="0"
- help_topic="windlight_lighting_tab"
- name="Lighting"
- top_delta="4"
- width="698">
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left="10"
- name="SLCText"
- top="4"
- width="355">
- Sun/Moon Color
- </text>
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left_delta="0"
- name="BHText"
- top_pad="5"
- width="10">
- R
- </text>
- <slider
- control_name="WLSunlightR"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.7"
- layout="topleft"
- left_pad="3"
- top_pad="6"
- name="WLSunlightR"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left_delta="-13"
- name="BHText2"
- top_pad="-15"
- width="10">
- G
- </text>
- <slider
- control_name="WLSunlightG"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.7"
- layout="topleft"
- left_delta="0"
- name="WLSunlightG"
- left_pad="3"
- top_pad="6"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left_delta="-13"
- name="BHText3"
- top_pad="-15"
- width="10">
- B
- </text>
- <slider
- control_name="WLSunlightB"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.7"
- layout="topleft"
- left_delta="0"
- name="WLSunlightB"
- left_pad="3"
- top_pad="6"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left_delta="-13"
- name="BHText4"
- top_pad="-15"
- width="10">
- I
- </text>
- <slider
- control_name="WLSunlightI"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="1.0"
- layout="topleft"
- left_delta="0"
- name="WLSunlightI"
- left_pad="3"
- top_pad="6"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left_delta="-13"
- name="TODText"
- top_pad="-10"
- width="355">
- Sun/Moon Position
- </text>
- <icon
- height="20"
- image_name="icon_diurnal.tga"
- layout="topleft"
- left_delta="14"
- top_pad="10"
- name="SkyDayCycle"
- width="148" />
- <slider
- control_name="WLSunAngle"
- follows="left"
- height="10"
- increment="0.001"
- initial_value="0.7"
- layout="topleft"
- left_delta="-8"
- name="WLSunAngle"
- top_pad="20"
- width="207" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left="245"
- name="WLAmbientText"
- top="4"
- width="355">
- Ambient
- </text>
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left_delta="0"
- name="BHText5"
- top_pad="5"
- width="10">
- R
- </text>
- <slider
- control_name="WLAmbientR"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.7"
- layout="topleft"
- left_pad="3"
- top_pad="6"
- name="WLAmbientR"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left_delta="-13"
- name="BHText6"
- top_pad="-15"
- width="10">
- G
- </text>
- <slider
- control_name="WLAmbientG"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.7"
- layout="topleft"
- left_delta="0"
- name="WLAmbientG"
- left_pad="3"
- top_pad="6"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left_delta="-13"
- name="BHText7"
- top_pad="-15"
- width="10">
- B
- </text>
- <slider
- control_name="WLAmbientB"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.7"
- layout="topleft"
- left_delta="0"
- name="WLAmbientB"
- left_pad="3"
- top_pad="6"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left_delta="-13"
- name="BHText8"
- top_pad="-15"
- width="10">
- I
- </text>
- <slider
- control_name="WLAmbientI"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="1"
- layout="topleft"
- left_delta="0"
- name="WLAmbientI"
- left_pad="3"
- top_pad="6"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left_delta="-13"
- name="WLEastAngleText"
- top_pad="-10"
- width="355">
- East Angle
- </text>
- <slider
- control_name="WLEastAngle"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.0"
- layout="topleft"
- left_delta="13"
- name="WLEastAngle"
- top_pad="27"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left="480"
- name="SunGlowText"
- top="4"
- width="355">
- Sun Glow
- </text>
- <slider
- control_name="WLGlowB"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.1"
- label="Focus "
- layout="topleft"
- left_delta="0"
- max_val="0.5"
- name="WLGlowB"
- top_pad="27"
- width="200" />
- <slider
- control_name="WLGlowR"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.25"
- label="Size "
- layout="topleft"
- left_delta="0"
- max_val="1.99"
- min_val="1"
- name="WLGlowR"
- top_pad="6"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left_delta="0"
- name="SceneGammaText"
- top_pad="-10"
- width="200">
- Scene Gamma
- </text>
- <slider
- control_name="WLGamma"
- decimal_digits="2"
- follows="bottom"
- height="10"
- increment="0.01"
- initial_value="2.0"
- layout="topleft"
- left_delta="0"
- max_val="10"
- name="WLGamma"
- top_pad="27"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left_delta="0"
- name="WLStarText"
- top_pad="-10"
- width="355">
- Star Brightness
- </text>
- <slider
- control_name="WLStarAlpha"
- decimal_digits="2"
- follows="bottom"
- height="10"
- increment="0.01"
- initial_value="0"
- layout="topleft"
- left_delta="0"
- max_val="2"
- name="WLStarAlpha"
- top_pad="27"
- width="200" />
- </panel>
- <panel
- border="true"
- follows="left|top|right|bottom"
- height="196"
- label="CLOUDS"
- layout="topleft"
- left_delta="0"
- mouse_opaque="false"
- help_topic="windlight_clouds_tab"
- name="Clouds"
- top_delta="4"
- width="698">
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left="10"
- name="WLCloudColorText"
- top="4"
- width="355">
- Cloud Color
- </text>
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left_delta="0"
- name="BHText"
- top_pad="5"
- width="10">
- R
- </text>
- <slider
- control_name="WLCloudColorR"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.7"
- layout="topleft"
- left_pad="3"
- top_pad="6"
- name="WLCloudColorR"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left_delta="-13"
- name="BHText2"
- top_pad="-15"
- width="10">
- G
- </text>
- <slider
- control_name="WLCloudColorG"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.7"
- layout="topleft"
- left_delta="0"
- name="WLCloudColorG"
- left_pad="3"
- top_pad="6"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left_delta="-13"
- name="BHText3"
- top_pad="-15"
- width="10">
- B
- </text>
- <slider
- control_name="WLCloudColorB"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.7"
- layout="topleft"
- left_delta="0"
- name="WLCloudColorB"
- left_pad="3"
- top_pad="6"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left_delta="-13"
- name="BHText4"
- top_pad="-15"
- width="10">
- I
- </text>
- <slider
- control_name="WLCloudColorI"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="1.0"
- layout="topleft"
- left_delta="0"
- name="WLCloudColorI"
- left_pad="3"
- top_pad="6"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left_delta="-13"
- name="WLCloudColorText2"
- top_pad="-10"
- width="355">
- Cloud XY/Density
- </text>
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left_delta="0"
- name="BHText5"
- top_pad="5"
- width="10">
- X
- </text>
- <slider
- control_name="WLCloudX"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.5"
- layout="topleft"
- left_pad="3"
- top_pad="6"
- name="WLCloudX"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left_delta="-13"
- name="BHText6"
- top_pad="-15"
- width="10">
- Y
- </text>
- <slider
- control_name="WLCloudY"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.5"
- layout="topleft"
- left_pad="3"
- top_pad="6"
- name="WLCloudY"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left_delta="-13"
- name="BHText7"
- top_pad="-15"
- width="10">
- D
- </text>
- <slider
- control_name="WLCloudDensity"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="1.0"
- layout="topleft"
- left_delta="0"
- name="WLCloudDensity"
- left_pad="3"
- top_pad="6"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left="245"
- name="WLCloudCoverageText"
- top="4"
- width="355">
- Cloud Coverage
- </text>
- <slider
- control_name="WLCloudCoverage"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.5"
- layout="topleft"
- left_delta="13"
- name="WLCloudCoverage"
- top_pad="27"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left_delta="-13"
- name="WLCloudScaleText"
- top_pad="-10"
- width="355">
- Cloud Scale
- </text>
- <slider
- control_name="WLCloudScale"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="1.0"
- layout="topleft"
- left_delta="13"
- min_val="0.01"
- name="WLCloudScale"
- top_pad="27"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left_delta="-13"
- name="WLCloudDetailText"
- top_pad="-10"
- width="355">
- Cloud Detail (XY/Density)
- </text>
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left_delta="0"
- name="BHText8"
- top_pad="8"
- width="10">
- X
- </text>
- <slider
- control_name="WLCloudDetailX"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.5"
- layout="topleft"
- left_pad="3"
- top_pad="8"
- name="WLCloudDetailX"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left_delta="-13"
- name="BHText9"
- top_pad="-15"
- width="10">
- Y
- </text>
- <slider
- control_name="WLCloudDetailY"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.5"
- layout="topleft"
- left_delta="0"
- name="WLCloudDetailY"
- left_pad="3"
- top_pad="6"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left_delta="-13"
- name="BHText10"
- top_pad="-15"
- width="10">
- D
- </text>
- <slider
- control_name="WLCloudDetailDensity"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="1.0"
- layout="topleft"
- left_delta="0"
- name="WLCloudDetailDensity"
- left_pad="3"
- top_pad="6"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left="480"
- name="WLCloudScrollXText"
- top="4"
- width="355">
- Cloud Scroll X
- </text>
- <check_box
- control_name="WLCloudLockX"
- follows="left"
- height="16"
- label="Lock"
- layout="topleft"
- left="625"
- name="WLCloudLockX"
- width="200" />
- <slider
- control_name="WLCloudScrollX"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.5"
- layout="topleft"
- left="494"
- max_val="10"
- min_val="-10"
- name="WLCloudScrollX"
- top="45"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top|right"
- font="SansSerif"
- height="16"
- layout="topleft"
- left_delta="-14"
- name="WLCloudScrollYText"
- top_delta="-1"
- width="355">
- Cloud Scroll Y
- </text>
- <check_box
- control_name="WLCloudLockY"
- follows="left"
- height="16"
- label="Lock"
- layout="topleft"
- left="625"
- name="WLCloudLockY"
- width="200" />
- <slider
- control_name="WLCloudScrollY"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.5"
- layout="topleft"
- left="494"
- max_val="10"
- min_val="-10"
- name="WLCloudScrollY"
- top="85"
- width="200" />
- <check_box
- control_name="DrawClassicClouds"
- follows="left"
- height="16"
- label="Draw Classic Clouds"
- layout="topleft"
- left="480"
- name="DrawClassicClouds"
- top="104"
- width="200" />
- </panel>
- </tab_container>
-</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_window_size.xml b/indra/newview/skins/default/xui/en/floater_window_size.xml
index 355d257785..115fe413f3 100644
--- a/indra/newview/skins/default/xui/en/floater_window_size.xml
+++ b/indra/newview/skins/default/xui/en/floater_window_size.xml
@@ -28,22 +28,50 @@
tool_tip="width x height"
top_pad="5"
width="179">
- <combo_box.item
- label="1000 x 700 (default)"
- name="item0"
- value="1000 x 700" />
- <combo_box.item
- label="1024 x 768"
- name="item1"
- value="1024 x 768" />
- <combo_box.item
- label="1280 x 720 (720p)"
- name="item2"
- value="1280 x 720" />
- <combo_box.item
- label="1920 x 1080 (1080p)"
- name="item3"
- value="1920 x 1080" />
+ <combo_box.item
+ label="1000 x 700 (default)"
+ name="item1"
+ value="1000 x 700" />
+ <combo_box.item
+ label="1024 x 768 (4:3 XGA)"
+ name="item2"
+ value="1024 x 768" />
+ <combo_box.item
+ label="1280 x 720 (16:9 HDTV)"
+ name="item3"
+ value="1280 x 720" />
+ <combo_box.item
+ label="1280 x 800 (5:8 WXGA)"
+ name="item4"
+ value="1280 x 800" />
+ <combo_box.item
+ label="1280 x 1024 (5:4 SXGA)"
+ name="item5"
+ value="1280 x 1024" />
+ <combo_box.item
+ label="1440 x 900 (8:5 WSXGA)"
+ name="item7"
+ value="1440 x 900" />
+ <combo_box.item
+ label="1600 x 900 (16:9 HD+)"
+ name="item8"
+ value="1600 x 900" />
+ <combo_box.item
+ label="1600 x 1200 (4:3 UXGA)"
+ name="item9"
+ value="1600 x 1200" />
+ <combo_box.item
+ label="1680 x 1050 (8:5 WSXGA+)"
+ name="item10"
+ value="1680 x 1050" />
+ <combo_box.item
+ label="1920 x 1080 (16:9 HDTV)"
+ name="item11"
+ value="1920 x 1080" />
+ <combo_box.item
+ label="1920 x 1200 (8:5 WUXGA)"
+ name="item12"
+ value="1920 x 1200" />
</combo_box>
<button
follows="right|bottom"
diff --git a/indra/newview/skins/default/xui/en/floater_world_map.xml b/indra/newview/skins/default/xui/en/floater_world_map.xml
index 019e7cd032..83407069d2 100644
--- a/indra/newview/skins/default/xui/en/floater_world_map.xml
+++ b/indra/newview/skins/default/xui/en/floater_world_map.xml
@@ -2,7 +2,7 @@
<floater
legacy_header_height="18"
can_resize="true"
- open_centered="true"
+ positioning="centered"
height="600"
layout="topleft"
min_height="520"
@@ -468,7 +468,7 @@
left="3"
top_pad="7"
mouse_opaque="true"
- name="region_icon"
+ name="location_icon"
width="16" />
<search_editor
follows="top|right"
diff --git a/indra/newview/skins/default/xui/en/inspect_avatar.xml b/indra/newview/skins/default/xui/en/inspect_avatar.xml
index 853d5f8735..bc3bcd331b 100644
--- a/indra/newview/skins/default/xui/en/inspect_avatar.xml
+++ b/indra/newview/skins/default/xui/en/inspect_avatar.xml
@@ -38,12 +38,14 @@
height="20"
left="8"
name="user_name_small"
+ parse_urls="false"
top="7"
text_color="White"
+ translate="false"
use_ellipses="true"
word_wrap="true"
visible="false"
- value="Grumpity ProductEngine with a long name"
+ value="TestString PleaseIgnore"
width="185" />
<text
follows="top|left"
@@ -51,10 +53,12 @@
height="21"
left="8"
name="user_name"
+ parse_urls="false"
top="10"
text_color="White"
+ translate="false"
use_ellipses="true"
- value="Grumpity ProductEngine"
+ value="TestString PleaseIgnore"
width="190" />
<text
follows="top|left"
@@ -62,8 +66,10 @@
left="8"
name="user_slid"
font="SansSerifSmallBold"
+ parse_urls="false"
text_color="EmphasisColor"
- value="james.linden"
+ translate="false"
+ value="teststring.pleaseignore"
width="185"
use_ellipses="true" />
<text
diff --git a/indra/newview/skins/default/xui/en/inspect_group.xml b/indra/newview/skins/default/xui/en/inspect_group.xml
index bcdb63228d..324ff3eabd 100644
--- a/indra/newview/skins/default/xui/en/inspect_group.xml
+++ b/indra/newview/skins/default/xui/en/inspect_group.xml
@@ -28,10 +28,11 @@
name="group_name"
top="10"
text_color="White"
+ translate="false"
use_ellipses="true"
width="175"
word_wrap="false">
- Grumpity&apos;s Grumpy Group of Moose
+ TestString PleaseIgnore
</text>
<text
follows="all"
diff --git a/indra/newview/skins/default/xui/en/inspect_object.xml b/indra/newview/skins/default/xui/en/inspect_object.xml
index eb2e7ea788..bfeb8fc470 100644
--- a/indra/newview/skins/default/xui/en/inspect_object.xml
+++ b/indra/newview/skins/default/xui/en/inspect_object.xml
@@ -56,7 +56,7 @@ owner secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about
halign="right"
right="-5"
name="price_text"
- text_color="white"
+ text_color="White"
top="60"
font_shadow="none"
width="60">
@@ -76,13 +76,25 @@ L$30,000
</text>
<!-- Overlapping buttons for all default actions. Show "Buy" if
for sale, "Sit" if can sit, etc. -->
+ <icon
+ name="secure_browsing"
+ image_name="Lock"
+ left="0"
+ visible="false"
+ width="18"
+ height="18"
+ top="103"
+ tool_tip="Secure Browsing"
+ follows="left|top" />
<text
follows="all"
font="SansSerifSmall"
height="13"
+ clip="false"
name="object_media_url"
- width="220"
- top_pad="0"
+ width="207"
+ left_pad="2"
+ top_delta="0"
max_length = "50"
use_ellipses="true">
http://www.superdupertest.com
@@ -135,16 +147,6 @@ L$30,000
name="open_btn"
top_delta="0"
width="80" />
- <icon
- name="secure_browsing"
- image_name="Lock"
- left_delta="80"
- visible="false"
- width="18"
- height="18"
- top_delta="0"
- tool_tip="Secure Browsing"
- follows="left|top" />
<!-- non-overlapping buttons here -->
<button
@@ -153,7 +155,7 @@ L$30,000
label="More"
layout="topleft"
name="more_info_btn"
- left_delta="10"
+ left_pad="10"
top_delta="0"
tab_stop="false"
width="80" />
diff --git a/indra/newview/skins/default/xui/en/inspect_remote_object.xml b/indra/newview/skins/default/xui/en/inspect_remote_object.xml
index ef3dd844cd..e83257d2a0 100644
--- a/indra/newview/skins/default/xui/en/inspect_remote_object.xml
+++ b/indra/newview/skins/default/xui/en/inspect_remote_object.xml
@@ -36,7 +36,7 @@
height="16"
left="8"
name="object_owner_label"
- width="55"
+ width="65"
top_pad="12">
Owner:
</text>
diff --git a/indra/newview/skins/default/xui/en/language_settings.xml b/indra/newview/skins/default/xui/en/language_settings.xml
index c8a06fe401..51779e4bfd 100644
--- a/indra/newview/skins/default/xui/en/language_settings.xml
+++ b/indra/newview/skins/default/xui/en/language_settings.xml
@@ -4,6 +4,7 @@
<!-- Locale Information -->
<string name="MicrosoftLocale">english</string>
+ <string name="MacLocale">C</string>
<string name="DarwinLocale">C</string>
<string name="LinuxLocale">C</string>
diff --git a/indra/newview/skins/default/xui/en/main_view.xml b/indra/newview/skins/default/xui/en/main_view.xml
index 520a604bde..a87027a113 100644
--- a/indra/newview/skins/default/xui/en/main_view.xml
+++ b/indra/newview/skins/default/xui/en/main_view.xml
@@ -11,135 +11,66 @@
<layout_stack border_size="0"
follows="all"
mouse_opaque="false"
- height="749"
+ height="768"
name="menu_stack"
orientation="vertical"
- top="19">
+ top="0">
+ <layout_panel mouse_opaque="true"
+ follows="left|right|top"
+ name="status_bar_container"
+ tab_stop="false"
+ height="19"
+ left="0"
+ top="0"
+ width="1024"
+ auto_resize="false"
+ visible="true">
+ <view mouse_opaque="false"
+ follows="all"
+ name="menu_bar_holder"
+ left="0"
+ top="0"
+ width="1024"
+ height="19"/>
+ </layout_panel>
<layout_panel auto_resize="false"
- height="60"
+ height="34"
mouse_opaque="false"
name="nav_bar_container"
tab_stop="false"
width="1024"
- user_resize="false"
- visible="false">
- </layout_panel>
- <layout_panel auto_resize="true"
+ visible="false"/>
+ <layout_panel auto_resize="true"
follows="all"
height="500"
layout="topleft"
mouse_opaque="false"
tab_stop="false"
- name="hud"
+ name="world_panel"
width="1024">
- <layout_stack border_size="0"
- follows="all"
- height="500"
- left="0"
- mouse_opaque="false"
- name="hud_stack"
- orientation="horizontal"
- top="0"
- width="1024">
- <layout_panel auto_resize="true"
- follows="all"
- height="500"
- layout="topleft"
- mouse_opaque="false"
- tab_stop="false"
- name="non_side_tray_view"
- user_resize="false"
- width="500">
- <view bottom="500"
- follows="all"
- height="500"
- left="0"
- mouse_opaque="false"
- name="world_view_rect"
- width="500"/>
- <layout_stack border_size="0"
- bottom="500"
- follows="all"
- height="500"
- left="0"
- mouse_opaque="false"
- name="world_stack"
- orientation="vertical">
- <layout_panel auto_resize="true"
- follows="all"
- height="500"
- layout="topleft"
- tab_stop="false"
- mouse_opaque="false"
- user_resize="false"
- name="hud container"
- width="500">
- <panel follows="left|top"
- height="19"
- left="0"
- mouse_opaque="false"
- name="topinfo_bar_container"
- tab_stop="false"
- top="0"
- visible="false"
- width="1024"/>
- <panel follows="right|top|bottom"
- height="500"
- mouse_opaque="false"
- name="side_bar_tabs"
- right="500"
- tab_stop="false"
- top="0"
- width="32"/>
- <panel bottom="500"
- follows="left|right|bottom"
- height="25"
- left="0"
- mouse_opaque="false"
- tab_stop="false"
- name="stand_stop_flying_container"
- visible="false"
- width="500"/>
- </layout_panel>
- <layout_panel auto_resize="false"
- min_height="33"
- height="33"
- mouse_opaque="false"
- name="bottom_tray_container"
- visible="false"/>
- </layout_stack>
- </layout_panel>
- <!-- side tray -->
- <layout_panel auto_resize="false"
- follows="top|bottom"
- height="500"
- min_width="333"
- mouse_opaque="false"
- tab_stop="false"
- name="side_tray_container"
- user_resize="false"
- visible="false"
- width="333"/>
- </layout_stack>
- <panel follows="all"
- height="500"
- left="0"
- mouse_opaque="false"
- name="floater_view_holder"
- tab_group="-1"
- tab_stop="false"
- top="0"
- width="1024">
- <floater_view follows="all"
- height="500"
- left="0"
- mouse_opaque="false"
- name="Floater View"
- tab_group="-1"
- tab_stop="false"
- top="0"
- width="1024"/>
- </panel>
+ <view top="0"
+ follows="all"
+ height="500"
+ left="0"
+ mouse_opaque="false"
+ name="world_view_rect"
+ width="1024"/>
+ <panel follows="left|top|right"
+ height="19"
+ left="0"
+ mouse_opaque="false"
+ name="topinfo_bar_container"
+ tab_stop="false"
+ top="0"
+ visible="false"
+ width="1024"/>
+ <panel top="0"
+ left="0"
+ follows="all"
+ height="500"
+ mouse_opaque="false"
+ name="login_panel_holder"
+ width="1024"/>
<debug_view follows="all"
left="0"
top="0"
@@ -147,24 +78,27 @@
height="500"
name="DebugView"
width="1024"/>
+ <floater_view follows="all"
+ height="500"
+ left="0"
+ mouse_opaque="false"
+ name="Floater View"
+ tab_group="-1"
+ tab_stop="false"
+ top="0"
+ width="1024"/>
+ <panel name="toolbar_view_holder"
+ follows="all"
+ layout="topleft"
+ height="500"
+ width="1024"
+ top="0"
+ left="0"
+ mouse_opaque="false"
+ tab_stop="false"/>
</layout_panel>
</layout_stack>
- <panel mouse_opaque="false"
- follows="left|right|top"
- name="status_bar_container"
- tab_stop="false"
- height="19"
- left="0"
- top="0"
- width="1024"
- visible="false"/>
- <view mouse_opaque="false"
- follows="all"
- name="menu_bar_holder"
- left="0"
- top="0"
- width="1024"
- height="768"/>
+
<panel top="0"
follows="all"
mouse_opaque="false"
diff --git a/indra/newview/skins/default/xui/en/menu_attachment_self.xml b/indra/newview/skins/default/xui/en/menu_attachment_self.xml
index 84e81397be..b8128da358 100644
--- a/indra/newview/skins/default/xui/en/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/en/menu_attachment_self.xml
@@ -68,7 +68,7 @@ name="Stand Up">
function="Self.EnableStandUp" />
</menu_item_call>
<menu_item_call
- label="Change Outfit"
+ label="My Appearance"
name="Change Outfit">
<menu_item_call.on_click
function="CustomizeAvatar" />
diff --git a/indra/newview/skins/default/xui/en/menu_avatar_self.xml b/indra/newview/skins/default/xui/en/menu_avatar_self.xml
index 2afa29ec10..d9bdfece38 100644
--- a/indra/newview/skins/default/xui/en/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/en/menu_avatar_self.xml
@@ -152,6 +152,18 @@
</menu_item_call>
<menu_item_call
enabled="false"
+ label="Physics"
+ layout="topleft"
+ name="Self Physics">
+ <menu_item_call.on_click
+ function="Edit.TakeOff"
+ parameter="physics" />
+ <menu_item_call.on_enable
+ function="Edit.EnableTakeOff"
+ parameter="physics" />
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
label="Alpha"
layout="topleft"
name="Self Alpha">
@@ -193,7 +205,7 @@
</menu_item_call>
</context_menu>
<menu_item_call
- label="Change Outfit"
+ label="My Appearance"
layout="topleft"
name="Chenge Outfit">
<menu_item_call.on_click
diff --git a/indra/newview/skins/default/xui/en/menu_bottomtray.xml b/indra/newview/skins/default/xui/en/menu_bottomtray.xml
deleted file mode 100644
index 5beafef4e4..0000000000
--- a/indra/newview/skins/default/xui/en/menu_bottomtray.xml
+++ /dev/null
@@ -1,152 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<menu
- height="201"
- layout="topleft"
- left="100"
- mouse_opaque="false"
- name="hide_camera_move_controls_menu"
- top="624"
- visible="false"
- width="128">
- <menu_item_check
- label="Gesture button"
- layout="topleft"
- name="ShowGestureButton">
- <menu_item_check.on_click
- function="ToggleControl"
- parameter="ShowGestureButton" />
- <menu_item_check.on_check
- function="CheckControl"
- parameter="ShowGestureButton" />
- </menu_item_check>
- <menu_item_check
- label="Move button"
- layout="topleft"
- name="ShowMoveButton">
- <menu_item_check.on_click
- function="ToggleControl"
- parameter="ShowMoveButton" />
- <menu_item_check.on_check
- function="CheckControl"
- parameter="ShowMoveButton" />
- </menu_item_check>
- <menu_item_check
- label="View button"
- layout="topleft"
- name="ShowCameraButton">
- <menu_item_check.on_click
- function="ToggleControl"
- parameter="ShowCameraButton" />
- <menu_item_check.on_check
- function="CheckControl"
- parameter="ShowCameraButton" />
- </menu_item_check>
- <menu_item_check
- label="Snapshot button"
- layout="topleft"
- name="ShowSnapshotButton">
- <menu_item_check.on_click
- function="ToggleControl"
- parameter="ShowSnapshotButton" />
- <menu_item_check.on_check
- function="CheckControl"
- parameter="ShowSnapshotButton" />
- </menu_item_check>
- <menu_item_check
- label="Build button"
- layout="topleft"
- name="ShowBuildButton">
- <menu_item_check.on_click
- function="ToggleControl"
- parameter="ShowBuildButton" />
- <menu_item_check.on_check
- function="CheckControl"
- parameter="ShowBuildButton" />
- </menu_item_check>
- <menu_item_check
- label="Search button"
- layout="topleft"
- name="ShowSearchButton">
- <menu_item_check.on_click
- function="ToggleControl"
- parameter="ShowSearchButton" />
- <menu_item_check.on_check
- function="CheckControl"
- parameter="ShowSearchButton" />
- </menu_item_check>
- <menu_item_check
- label="Map button"
- layout="topleft"
- name="ShowWorldMapButton">
- <menu_item_check.on_click
- function="ToggleControl"
- parameter="ShowWorldMapButton" />
- <menu_item_check.on_check
- function="CheckControl"
- parameter="ShowWorldMapButton" />
- </menu_item_check>
- <menu_item_check
- label="Mini-Map button"
- layout="topleft"
- name="ShowMiniMapButton">
- <menu_item_check.on_click
- function="ToggleControl"
- parameter="ShowMiniMapButton" />
- <menu_item_check.on_check
- function="CheckControl"
- parameter="ShowMiniMapButton" />
- </menu_item_check>
- <menu_item_separator
- name="Separator" />
- <menu_item_call
- label="Cut"
- name="NearbyChatBar_Cut">
- <menu_item_call.on_click
- function="NearbyChatBar.Action"
- parameter="cut" />
- <menu_item_call.on_enable
- function="NearbyChatBar.EnableMenuItem"
- parameter="can_cut" />
- </menu_item_call>
- <menu_item_call
- label="Copy"
- name="NearbyChatBar_Copy">
- <menu_item_call.on_click
- function="NearbyChatBar.Action"
- parameter="copy" />
- <menu_item_call.on_enable
- function="NearbyChatBar.EnableMenuItem"
- parameter="can_copy" />
- </menu_item_call>
- <menu_item_call
- label="Paste"
- name="NearbyChatBar_Paste">
- <menu_item_call.on_click
- function="NearbyChatBar.Action"
- parameter="paste" />
- <menu_item_call.on_enable
- function="NearbyChatBar.EnableMenuItem"
- parameter="can_paste" />
- </menu_item_call>
- <menu_item_call
- label="Delete"
- name="NearbyChatBar_Delete">
- <menu_item_call.on_click
- function="NearbyChatBar.Action"
- parameter="delete" />
- <menu_item_call.on_enable
- function="NearbyChatBar.EnableMenuItem"
- parameter="can_delete" />
- </menu_item_call>
- <menu_item_call
- label="Select All"
- name="NearbyChatBar_Select_All">
- <menu_item_call.on_click
- function="NearbyChatBar.Action"
- parameter="select_all" />
- <menu_item_call.on_enable
- function="NearbyChatBar.EnableMenuItem"
- parameter="can_select_all" />
- </menu_item_call>
-
-</menu>
diff --git a/indra/newview/skins/default/xui/en/menu_edit.xml b/indra/newview/skins/default/xui/en/menu_edit.xml
index fab76c497c..99061e089a 100644
--- a/indra/newview/skins/default/xui/en/menu_edit.xml
+++ b/indra/newview/skins/default/xui/en/menu_edit.xml
@@ -6,6 +6,7 @@
<menu_item_call
label="Undo"
name="Undo"
+ allow_key_repeat="true"
shortcut="control|Z">
<menu_item_call.on_click
function="Edit.Undo" />
@@ -15,6 +16,7 @@
<menu_item_call
label="Redo"
name="Redo"
+ allow_key_repeat="true"
shortcut="control|Y">
<menu_item_call.on_click
function="Edit.Redo" />
@@ -43,6 +45,7 @@
<menu_item_call
label="Paste"
name="Paste"
+ allow_key_repeat="true"
shortcut="control|V">
<menu_item_call.on_click
function="Edit.Paste" />
diff --git a/indra/newview/skins/default/xui/en/menu_hide_navbar.xml b/indra/newview/skins/default/xui/en/menu_hide_navbar.xml
index 3f38d734b9..b517fd7957 100644
--- a/indra/newview/skins/default/xui/en/menu_hide_navbar.xml
+++ b/indra/newview/skins/default/xui/en/menu_hide_navbar.xml
@@ -9,7 +9,7 @@
visible="false"
width="128">
<menu_item_check
- label="Show Navigation Bar"
+ label="Show Navigation &amp; Favorites Bar"
layout="topleft"
name="ShowNavbarNavigationPanel">
<on_click
@@ -20,17 +20,6 @@
parameter="ShowNavbarNavigationPanel" />
</menu_item_check>
<menu_item_check
- label="Show Favorites Bar"
- layout="topleft"
- name="ShowNavbarFavoritesPanel">
- <on_click
- function="ToggleControl"
- parameter="ShowNavbarFavoritesPanel" />
- <on_check
- function="CheckControl"
- parameter="ShowNavbarFavoritesPanel" />
- </menu_item_check>
- <menu_item_check
label="Show Mini-Location Bar"
layout="topleft"
name="ShowMiniLocationPanel">
diff --git a/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml
index 58d58a6ca9..76b188220d 100644
--- a/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml
+++ b/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml
@@ -78,7 +78,7 @@
<menu_item_call.on_click
function="InspectAvatar.Freeze"/>
<menu_item_call.on_visible
- function="InspectAvatar.VisibleFreezeEject"/>
+ function="InspectAvatar.VisibleFreeze"/>
</menu_item_call>
<menu_item_call
label="Eject"
@@ -86,7 +86,23 @@
<menu_item_call.on_click
function="InspectAvatar.Eject"/>
<menu_item_call.on_visible
- function="InspectAvatar.VisibleFreezeEject"/>
+ function="InspectAvatar.VisibleEject"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Kick"
+ name="kick">
+ <menu_item_call.on_click
+ function="InspectAvatar.Kick"/>
+ <menu_item_call.on_visible
+ function="InspectAvatar.EnableGod"/>
+ </menu_item_call>
+ <menu_item_call
+ label="CSR"
+ name="csr">
+ <menu_item_call.on_click
+ function="InspectAvatar.CSR" />
+ <menu_item_call.on_visible
+ function="InspectAvatar.EnableGod" />
</menu_item_call>
<menu_item_call
label="Debug Textures"
diff --git a/indra/newview/skins/default/xui/en/menu_inspect_object_gear.xml b/indra/newview/skins/default/xui/en/menu_inspect_object_gear.xml
index f818ebe2d7..63e154697b 100644
--- a/indra/newview/skins/default/xui/en/menu_inspect_object_gear.xml
+++ b/indra/newview/skins/default/xui/en/menu_inspect_object_gear.xml
@@ -114,6 +114,15 @@
function="Object.EnableMute" />
</menu_item_call>
<menu_item_call
+ label="Unblock"
+ layout="topleft"
+ name="unblock">
+ <menu_item_call.on_click
+ function="Object.Mute" />
+ <menu_item_call.on_visible
+ function="Object.EnableUnmute" />
+ </menu_item_call>
+ <menu_item_call
label="Zoom In"
layout="topleft"
name="zoom_in">
diff --git a/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml
index 50ad3f834e..5e7b16ed4a 100644
--- a/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml
+++ b/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml
@@ -1,63 +1,249 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<toggleable_menu
- create_jump_keys="true"
- layout="topleft"
- mouse_opaque="false"
- visible="false"
- name="Gear Menu">
+ layout="topleft"
+ name="Self Pie">
<menu_item_call
label="Sit Down"
- enabled="true"
- name="sit_down_here">
+ layout="topleft"
+ name="Sit Down Here">
<menu_item_call.on_click
function="Self.SitDown"
parameter="" />
- <menu_item_call.on_visible
+ <menu_item_call.on_enable
function="Self.EnableSitDown" />
</menu_item_call>
<menu_item_call
label="Stand Up"
- enabled="true"
- name="stand_up">
+ layout="topleft"
+ name="Stand Up">
<menu_item_call.on_click
function="Self.StandUp"
parameter="" />
- <menu_item_call.on_visible
+ <menu_item_call.on_enable
function="Self.EnableStandUp" />
</menu_item_call>
+ <context_menu
+ label="Take Off"
+ layout="topleft"
+ name="Take Off &gt;">
+ <context_menu
+ label="Clothes"
+ layout="topleft"
+ name="Clothes &gt;">
+ <menu_item_call
+ enabled="false"
+ label="Shirt"
+ layout="topleft"
+ name="Shirt">
+ <menu_item_call.on_click
+ function="Edit.TakeOff"
+ parameter="shirt" />
+ <menu_item_call.on_enable
+ function="Edit.EnableTakeOff"
+ parameter="shirt" />
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Pants"
+ layout="topleft"
+ name="Pants">
+ <menu_item_call.on_click
+ function="Edit.TakeOff"
+ parameter="pants" />
+ <menu_item_call.on_enable
+ function="Edit.EnableTakeOff"
+ parameter="pants" />
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Skirt"
+ layout="topleft"
+ name="Skirt">
+ <menu_item_call.on_click
+ function="Edit.TakeOff"
+ parameter="skirt" />
+ <menu_item_call.on_enable
+ function="Edit.EnableTakeOff"
+ parameter="skirt" />
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Shoes"
+ layout="topleft"
+ name="Shoes">
+ <menu_item_call.on_click
+ function="Edit.TakeOff"
+ parameter="shoes" />
+ <menu_item_call.on_enable
+ function="Edit.EnableTakeOff"
+ parameter="shoes" />
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Socks"
+ layout="topleft"
+ name="Socks">
+ <menu_item_call.on_click
+ function="Edit.TakeOff"
+ parameter="socks" />
+ <menu_item_call.on_enable
+ function="Edit.EnableTakeOff"
+ parameter="socks" />
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Jacket"
+ layout="topleft"
+ name="Jacket">
+ <menu_item_call.on_click
+ function="Edit.TakeOff"
+ parameter="jacket" />
+ <menu_item_call.on_enable
+ function="Edit.EnableTakeOff"
+ parameter="jacket" />
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Gloves"
+ layout="topleft"
+ name="Gloves">
+ <menu_item_call.on_click
+ function="Edit.TakeOff"
+ parameter="gloves" />
+ <menu_item_call.on_enable
+ function="Edit.EnableTakeOff"
+ parameter="gloves" />
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Undershirt"
+ layout="topleft"
+ name="Self Undershirt">
+ <menu_item_call.on_click
+ function="Edit.TakeOff"
+ parameter="undershirt" />
+ <menu_item_call.on_enable
+ function="Edit.EnableTakeOff"
+ parameter="undershirt" />
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Underpants"
+ layout="topleft"
+ name="Self Underpants">
+ <menu_item_call.on_click
+ function="Edit.TakeOff"
+ parameter="underpants" />
+ <menu_item_call.on_enable
+ function="Edit.EnableTakeOff"
+ parameter="underpants" />
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Tattoo"
+ layout="topleft"
+ name="Self Tattoo">
+ <menu_item_call.on_click
+ function="Edit.TakeOff"
+ parameter="tattoo" />
+ <menu_item_call.on_enable
+ function="Edit.EnableTakeOff"
+ parameter="tattoo" />
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Alpha"
+ layout="topleft"
+ name="Self Alpha">
+ <menu_item_call.on_click
+ function="Edit.TakeOff"
+ parameter="alpha" />
+ <menu_item_call.on_enable
+ function="Edit.EnableTakeOff"
+ parameter="alpha" />
+ </menu_item_call>
+ <menu_item_separator
+ layout="topleft" />
+ <menu_item_call
+ label="All Clothes"
+ layout="topleft"
+ name="All Clothes">
+ <menu_item_call.on_click
+ function="Edit.TakeOff"
+ parameter="all" />
+ </menu_item_call>
+ </context_menu>
+ <context_menu
+ label="HUD"
+ layout="topleft"
+ name="Object Detach HUD" />
+ <context_menu
+ label="Detach"
+ layout="topleft"
+ name="Object Detach" />
+ <menu_item_call
+ label="Detach All"
+ layout="topleft"
+ name="Detach All">
+ <menu_item_call.on_click
+ function="Self.RemoveAllAttachments"
+ parameter="" />
+ <menu_item_call.on_enable
+ function="Self.EnableRemoveAllAttachments" />
+ </menu_item_call>
+ </context_menu>
<menu_item_call
- label="Change Outfit"
- name="change_outfit">
+ label="Change Outfit"
+ layout="topleft"
+ name="Chenge Outfit">
<menu_item_call.on_click
function="CustomizeAvatar" />
<menu_item_call.on_enable
function="Edit.EnableCustomizeAvatar" />
</menu_item_call>
- <menu_item_call
- label="My Profile"
- enabled="true"
- name="my_profile">
+ <menu_item_call label="Edit My Outfit"
+ layout="topleft"
+ name="Edit Outfit">
<menu_item_call.on_click
- function="ShowAgentProfile"
- parameter="agent" />
+ function="EditOutfit" />
+ <menu_item_call.on_enable
+ function="Edit.EnableCustomizeAvatar" />
+ </menu_item_call>
+ <menu_item_call label="Edit My Shape"
+ layout="topleft"
+ name="Edit My Shape">
+ <menu_item_call.on_click
+ function="EditShape" />
+ <menu_item_call.on_enable
+ function="Edit.EnableEditShape" />
</menu_item_call>
<menu_item_call
- label="My Friends"
- name="my_friends">
+ label="My Friends"
+ layout="topleft"
+ name="Friends...">
<menu_item_call.on_click
- function="SideTray.PanelPeopleTab"
- parameter="friends_panel" />
+ function="SideTray.PanelPeopleTab"
+ parameter="friends_panel" />
</menu_item_call>
<menu_item_call
label="My Groups"
- name="my_groups">
+ layout="topleft"
+ name="Groups...">
<menu_item_call.on_click
function="SideTray.PanelPeopleTab"
parameter="groups_panel" />
</menu_item_call>
<menu_item_call
- label="Debug Textures"
- name="Debug...">
+ label="My Profile"
+ layout="topleft"
+ name="Profile...">
+ <menu_item_call.on_click
+ function="ShowAgentProfile"
+ parameter="agent" />
+ </menu_item_call>
+ <menu_item_call
+ label="Debug Textures"
+ name="Debug...">
<menu_item_call.on_click
function="Avatar.Debug" />
<menu_item_call.on_visible
diff --git a/indra/newview/skins/default/xui/en/menu_inventory.xml b/indra/newview/skins/default/xui/en/menu_inventory.xml
index c0046d8e28..b13bf5b508 100644
--- a/indra/newview/skins/default/xui/en/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/en/menu_inventory.xml
@@ -200,6 +200,14 @@
function="Inventory.DoCreate"
parameter="tattoo" />
</menu_item_call>
+ <menu_item_call
+ label="New Physics"
+ layout="topleft"
+ name="New Physics">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="physics" />
+ </menu_item_call>
</menu>
<menu
label="New Body Parts"
@@ -445,6 +453,14 @@
layout="topleft"
name="Copy Separator" />
<menu_item_call
+ label="Cut"
+ layout="topleft"
+ name="Cut">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="cut" />
+ </menu_item_call>
+ <menu_item_call
label="Copy"
layout="topleft"
name="Copy">
@@ -666,7 +682,26 @@
function="Inventory.DoToSelected"
parameter="take_off" />
</menu_item_call>
- <menu_item_call
+ <menu_item_separator
+ layout="topleft"
+ name="Marketplace Separator" />
+ <menu_item_call
+ label="Copy to Merchant Outbox"
+ layout="topleft"
+ name="Merchant Copy">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="copy_to_outbox" />
+ </menu_item_call>
+ <menu_item_call
+ label="Send to Marketplace"
+ layout="topleft"
+ name="Marketplace Send">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="send_to_marketplace" />
+ </menu_item_call>
+ <menu_item_call
label="--no options--"
layout="topleft"
name="--no options--" />
diff --git a/indra/newview/skins/default/xui/en/menu_inventory_add.xml b/indra/newview/skins/default/xui/en/menu_inventory_add.xml
index ae98abf4fb..e91f5af3d5 100644
--- a/indra/newview/skins/default/xui/en/menu_inventory_add.xml
+++ b/indra/newview/skins/default/xui/en/menu_inventory_add.xml
@@ -3,6 +3,7 @@
layout="topleft"
left="0"
mouse_opaque="false"
+ can_tear_off="true"
name="menu_inventory_add"
visible="false">
<menu
@@ -43,6 +44,18 @@
function="File.EnableUpload" />
</menu_item_call>
<menu_item_call
+ label="Model..."
+ layout="topleft"
+ name="Upload Model">
+ <menu_item_call.on_click
+ function="File.UploadModel"
+ parameter="" />
+ <menu_item_call.on_enable
+ function="File.EnableUploadModel" />
+ <menu_item_call.on_visible
+ function="File.VisibleUploadModel"/>
+ </menu_item_call>
+ <menu_item_call
label="Bulk (L$[COST] per file)..."
layout="topleft"
name="Bulk Upload">
@@ -188,6 +201,14 @@
function="Inventory.DoCreate"
parameter="tattoo" />
</menu_item_call>
+ <menu_item_call
+ label="New Physics"
+ layout="topleft"
+ name="New Physics">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="physics" />
+ </menu_item_call>
</menu>
<menu
height="85"
diff --git a/indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml
index 7fa4cd840a..d2519a5aa4 100644
--- a/indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml
+++ b/indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml
@@ -39,6 +39,17 @@
parameter="sort_by_recent" />
</menu_item_check>
<menu_item_check
+ label="Sort Folders Always by Name"
+ layout="topleft"
+ name="sort_folders_by_name">
+ <on_click
+ function="Inventory.GearDefault.Custom.Action"
+ parameter="sort_folders_by_name" />
+ <on_check
+ function="Inventory.GearDefault.Check"
+ parameter="sort_folders_by_name" />
+ </menu_item_check>
+ <menu_item_check
label="Sort System Folders to Top"
layout="topleft"
name="sort_system_folders_to_top">
diff --git a/indra/newview/skins/default/xui/en/menu_login.xml b/indra/newview/skins/default/xui/en/menu_login.xml
index 4f982cc8e9..101e104eab 100644
--- a/indra/newview/skins/default/xui/en/menu_login.xml
+++ b/indra/newview/skins/default/xui/en/menu_login.xml
@@ -13,7 +13,7 @@
tear_off="true"
name="File">
<menu_item_call
- label="Preferences"
+ label="Preferences..."
name="Preferences..."
shortcut="control|P">
<menu_item_call.on_click
@@ -93,14 +93,6 @@
parameter="ui_preview" />
</menu_item_call>
<menu_item_separator />
- <!-- Broken
- <menu_item_call
- label="Show Side Tray"
- name="Show Side Tray">
- <menu_item_call.on_click
- function="Advanced.ShowSideTray" />
- </menu_item_call>
- -->
<menu
create_jump_keys="true"
label="UI Tests"
@@ -175,15 +167,65 @@
function="Floater.Show"
parameter="message_critical" />
</menu_item_call>
- <menu_item_call
- label="Web Browser Test"
- name="Web Browser Test">
- <menu_item_call.on_click
- function="Advanced.WebBrowserTest"
- parameter="http://join.secondlife.com/"/>
- </menu_item_call>
- <menu_item_separator/>
- <menu_item_check
+ <menu_item_call
+ label="Web Content Floater Debug Test"
+ name="Web Content Floater Debug Test">
+ <menu_item_call.on_click
+ function="Advanced.WebContentTest"
+ parameter="http://google.com"/>
+ </menu_item_call>
+ <menu
+ create_jump_keys="true"
+ label="Set Logging Level"
+ name="Set Logging Level"
+ tear_off="true">
+ <menu_item_check
+ label="Debug">
+ <menu_item_check.on_check
+ function="Develop.CheckLoggingLevel"
+ parameter="0" />
+ <menu_item_check.on_click
+ function="Develop.SetLoggingLevel"
+ parameter="0" />
+ </menu_item_check>
+ <menu_item_check
+ label="Info">
+ <menu_item_check.on_check
+ function="Develop.CheckLoggingLevel"
+ parameter="1" />
+ <menu_item_check.on_click
+ function="Develop.SetLoggingLevel"
+ parameter="1" />
+ </menu_item_check>
+ <menu_item_check
+ label="Warning">
+ <menu_item_check.on_check
+ function="Develop.CheckLoggingLevel"
+ parameter="2" />
+ <menu_item_check.on_click
+ function="Develop.SetLoggingLevel"
+ parameter="2" />
+ </menu_item_check>
+ <menu_item_check
+ label="Error">
+ <menu_item_check.on_check
+ function="Develop.CheckLoggingLevel"
+ parameter="3" />
+ <menu_item_check.on_click
+ function="Develop.SetLoggingLevel"
+ parameter="3" />
+ </menu_item_check>
+ <menu_item_check
+ label="None">
+ <menu_item_check.on_check
+ function="Develop.CheckLoggingLevel"
+ parameter="4" />
+ <menu_item_check.on_click
+ function="Develop.SetLoggingLevel"
+ parameter="4" />
+ </menu_item_check>
+ </menu>
+ <menu_item_check
label="Show Grid Picker"
name="Show Grid Picker"
visible="false"
diff --git a/indra/newview/skins/default/xui/en/menu_media_ctrl.xml b/indra/newview/skins/default/xui/en/menu_media_ctrl.xml
new file mode 100644
index 0000000000..960da4bd7a
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_media_ctrl.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu
+ name="media ctrl context menu">
+ <menu_item_call
+ label="Cut"
+ layout="topleft"
+ name="Cut">
+ <menu_item_call.on_click
+ function="Edit.Cut" />
+ <menu_item_call.on_enable
+ function="Edit.EnableCut" />
+ </menu_item_call>
+ <menu_item_call
+ label="Copy"
+ layout="topleft"
+ name="Copy">
+ <menu_item_call.on_click
+ function="Edit.Copy" />
+ <menu_item_call.on_enable
+ function="Edit.EnableCopy" />
+ </menu_item_call>
+ <menu_item_call
+ label="Paste"
+ layout="topleft"
+ name="Paste">
+ <menu_item_call.on_click
+ function="Edit.Paste" />
+ <menu_item_call.on_enable
+ function="Edit.EnablePaste" />
+ </menu_item_call>
+ <menu_item_separator
+ layout="topleft"
+ name="debug_separator"
+ visible="false" />
+ <menu_item_call
+ label="Open Web Inspector"
+ layout="topleft"
+ name="open_webinspector"
+ visible="false">
+ <menu_item_call.on_click
+ function="Open.WebInspector" />
+ </menu_item_call>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_mini_map.xml b/indra/newview/skins/default/xui/en/menu_mini_map.xml
index 8fe89d3934..ea263d05ce 100644
--- a/indra/newview/skins/default/xui/en/menu_mini_map.xml
+++ b/indra/newview/skins/default/xui/en/menu_mini_map.xml
@@ -8,7 +8,7 @@
top="724"
visible="false"
width="128">
- <menu_item_call
+ <menu_item_call
label="Zoom Close"
name="Zoom Close">
<menu_item_call.on_click
@@ -29,7 +29,14 @@
function="Minimap.Zoom"
parameter="far" />
</menu_item_call>
- <menu_item_separator />
+ <menu_item_call
+ label="Zoom Default"
+ name="Zoom Default">
+ <menu_item_call.on_click
+ function="Minimap.Zoom"
+ parameter="default" />
+ </menu_item_call>
+ <menu_item_separator />
<menu_item_check
label="Rotate Map"
name="Rotate Map">
diff --git a/indra/newview/skins/default/xui/en/menu_model_import_gear_default.xml b/indra/newview/skins/default/xui/en/menu_model_import_gear_default.xml
new file mode 100644
index 0000000000..2650903f88
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_model_import_gear_default.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<toggleable_menu
+ bottom="806"
+ layout="topleft"
+ left="0"
+ mouse_opaque="false"
+ name="model_menu_gear_default"
+ visible="false">
+ <menu_item_check
+ label="Show edges"
+ layout="topleft"
+ name="show_edges">
+ <on_click
+ function="ModelImport.ViewOption.Action"
+ parameter="show_edges" />
+ <on_check
+ function="ModelImport.ViewOption.Check"
+ parameter="show_edges" />
+ <on_enable
+ function="ModelImport.ViewOption.Enabled"
+ parameter="show_edges" />
+ </menu_item_check>
+ <menu_item_check
+ label="Show physics"
+ layout="topleft"
+ name="show_physics">
+ <on_click
+ function="ModelImport.ViewOption.Action"
+ parameter="show_physics" />
+ <on_check
+ function="ModelImport.ViewOption.Check"
+ parameter="show_physics" />
+ <on_enable
+ function="ModelImport.ViewOption.Enabled"
+ parameter="show_physics" />
+ </menu_item_check>
+ <menu_item_check
+ label="Show textures"
+ layout="topleft"
+ name="show_textures">
+ <on_click
+ function="ModelImport.ViewOption.Action"
+ parameter="show_textures" />
+ <on_check
+ function="ModelImport.ViewOption.Check"
+ parameter="show_textures" />
+ <on_enable
+ function="ModelImport.ViewOption.Enabled"
+ parameter="show_textures" />
+ </menu_item_check>
+ <menu_item_check
+ label="Show skin weight"
+ layout="topleft"
+ name="show_skin_weight">
+ <on_click
+ function="ModelImport.ViewOption.Action"
+ parameter="show_skin_weight" />
+ <on_check
+ function="ModelImport.ViewOption.Check"
+ parameter="show_skin_weight" />
+ <on_enable
+ function="ModelImport.ViewOption.Enabled"
+ parameter="show_skin_weight" />
+ </menu_item_check>
+ <menu_item_check
+ label="Show joint positions"
+ layout="topleft"
+ name="show_joint_positions">
+ <on_click
+ function="ModelImport.ViewOption.Action"
+ parameter="show_joint_positions" />
+ <on_check
+ function="ModelImport.ViewOption.Check"
+ parameter="show_joint_positions" />
+ <on_enable
+ function="ModelImport.ViewOption.Enabled"
+ parameter="show_joint_positions" />
+ </menu_item_check>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_object.xml b/indra/newview/skins/default/xui/en/menu_object.xml
index c751aa4e0c..719509301b 100644
--- a/indra/newview/skins/default/xui/en/menu_object.xml
+++ b/indra/newview/skins/default/xui/en/menu_object.xml
@@ -100,7 +100,7 @@
name="Object Attach HUD" />
</context_menu>
<context_menu
- label="Remove"
+ label="Manage"
name="Remove">
<menu_item_call
enabled="false"
@@ -129,15 +129,6 @@
<menu_item_call.on_enable
function="Object.EnableReturn" />
</menu_item_call>
- <menu_item_call
- enabled="false"
- label="Delete"
- name="Delete">
- <menu_item_call.on_click
- function="Object.Delete" />
- <menu_item_call.on_enable
- function="Object.EnableDelete" />
- </menu_item_call>
</context_menu>
<menu_item_separator layout="topleft" />
<menu_item_call
@@ -176,4 +167,13 @@
<menu_item_call.on_enable
function="Object.EnableBuy" />
</menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Delete"
+ name="Delete">
+ <menu_item_call.on_click
+ function="Object.Delete" />
+ <menu_item_call.on_enable
+ function="Object.EnableDelete" />
+ </menu_item_call>
</context_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_outfit_gear.xml b/indra/newview/skins/default/xui/en/menu_outfit_gear.xml
index 5fc25b8f0f..fc7272b904 100644
--- a/indra/newview/skins/default/xui/en/menu_outfit_gear.xml
+++ b/indra/newview/skins/default/xui/en/menu_outfit_gear.xml
@@ -133,6 +133,14 @@
parameter="alpha" />
</menu_item_call>
<menu_item_call
+ label="New Physics"
+ layout="topleft"
+ name="New Physics">
+ <menu_item_call.on_click
+ function="Gear.Create"
+ parameter="physics" />
+ </menu_item_call>
+ <menu_item_call
label="New Tattoo"
layout="topleft"
name="New Tattoo">
diff --git a/indra/newview/skins/default/xui/en/menu_people_friends_view_sort.xml b/indra/newview/skins/default/xui/en/menu_people_friends_view_sort.xml
index 29eeb93ac1..b452f96e7a 100644
--- a/indra/newview/skins/default/xui/en/menu_people_friends_view_sort.xml
+++ b/indra/newview/skins/default/xui/en/menu_people_friends_view_sort.xml
@@ -42,6 +42,6 @@
</menu_item_check>
<menu_item_separator layout="topleft" />
<menu_item_call name="show_blocked_list" label="Show Blocked Residents &amp; Objects">
- <menu_item_call.on_click function="SideTray.ShowPanel" parameter="panel_block_list_sidetray" />
+ <menu_item_call.on_click function="People.Friends.ViewSort.Action" parameter="panel_block_list_sidetray" />
</menu_item_call>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_people_nearby_view_sort.xml b/indra/newview/skins/default/xui/en/menu_people_nearby_view_sort.xml
index f9db64b524..614dd693c5 100644
--- a/indra/newview/skins/default/xui/en/menu_people_nearby_view_sort.xml
+++ b/indra/newview/skins/default/xui/en/menu_people_nearby_view_sort.xml
@@ -42,8 +42,16 @@
function="CheckControl"
parameter="NearbyListShowIcons" />
</menu_item_check>
+ <menu_item_check name ="view_map" label="View Map">
+ <menu_item_check.on_check
+ function="CheckControl"
+ parameter="NearbyListShowMap" />
+ <menu_item_check.on_click
+ function="ToggleControl"
+ parameter="NearbyListShowMap" />
+ </menu_item_check>
<menu_item_separator layout="topleft" />
<menu_item_call name="show_blocked_list" label="Show Blocked Residents &amp; Objects">
- <menu_item_call.on_click function="SideTray.ShowPanel" userdata="panel_block_list_sidetray" />
+ <menu_item_call.on_click function="People.Nearby.ViewSort.Action" userdata="panel_block_list_sidetray" />
</menu_item_call>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_people_recent_view_sort.xml b/indra/newview/skins/default/xui/en/menu_people_recent_view_sort.xml
index 0634e3bd3b..485a5a658c 100644
--- a/indra/newview/skins/default/xui/en/menu_people_recent_view_sort.xml
+++ b/indra/newview/skins/default/xui/en/menu_people_recent_view_sort.xml
@@ -34,6 +34,6 @@
</menu_item_check>
<menu_item_separator layout="topleft" />
<menu_item_call name="show_blocked_list" label="Show Blocked Residents &amp; Objects">
- <menu_item_call.on_click function="SideTray.ShowPanel" userdata="panel_block_list_sidetray" />
+ <menu_item_call.on_click function="People.Recent.ViewSort.Action" userdata="panel_block_list_sidetray" />
</menu_item_call>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_place.xml b/indra/newview/skins/default/xui/en/menu_place.xml
index 1b96eb51f0..288811d2f6 100644
--- a/indra/newview/skins/default/xui/en/menu_place.xml
+++ b/indra/newview/skins/default/xui/en/menu_place.xml
@@ -24,26 +24,4 @@
function="Places.OverflowMenu.Enable"
parameter="can_create_pick" />
</menu_item_call>
- <menu_item_separator
- layout="topleft"/>
- <menu_item_call
- enabled="false"
- label="Buy Pass"
- layout="topleft"
- name="pass">
- <menu_item_call.on_click
- function="Places.OverflowMenu.Action"
- parameter="pass" />
- </menu_item_call>
- <menu_item_separator
- layout="topleft"/>
- <menu_item_call
- enabled="false"
- label="Edit"
- layout="topleft"
- name="edit">
- <menu_item_call.on_click
- function="Places.OverflowMenu.Action"
- parameter="edit" />
- </menu_item_call>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/en/menu_places_gear_folder.xml
index 6f46165883..1aeb166e01 100644
--- a/indra/newview/skins/default/xui/en/menu_places_gear_folder.xml
+++ b/indra/newview/skins/default/xui/en/menu_places_gear_folder.xml
@@ -25,6 +25,14 @@
function="Places.LandmarksGear.Enable"
parameter="category" />
</menu_item_call>
+ <menu_item_call
+ label="Restore Item"
+ layout="topleft"
+ name="restore_item">
+ <menu_item_call.on_click
+ function="Places.LandmarksGear.Custom.Action"
+ parameter="restore" />
+ </menu_item_call>
<menu_item_separator
layout="topleft" />
<menu_item_call
diff --git a/indra/newview/skins/default/xui/en/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/en/menu_places_gear_landmark.xml
index 121e7cc07a..ff5fdd3795 100644
--- a/indra/newview/skins/default/xui/en/menu_places_gear_landmark.xml
+++ b/indra/newview/skins/default/xui/en/menu_places_gear_landmark.xml
@@ -60,6 +60,14 @@
function="Places.LandmarksGear.Enable"
parameter="category" />
</menu_item_call>
+ <menu_item_call
+ label="Restore Item"
+ layout="topleft"
+ name="restore_item">
+ <menu_item_call.on_click
+ function="Places.LandmarksGear.Custom.Action"
+ parameter="restore" />
+ </menu_item_call>
<menu_item_separator
layout="topleft" />
<menu_item_call
diff --git a/indra/newview/skins/default/xui/en/menu_text_editor.xml b/indra/newview/skins/default/xui/en/menu_text_editor.xml
index ecd96088e7..fe8489166b 100644
--- a/indra/newview/skins/default/xui/en/menu_text_editor.xml
+++ b/indra/newview/skins/default/xui/en/menu_text_editor.xml
@@ -4,8 +4,7 @@
<menu_item_call
label="Cut"
layout="topleft"
- name="Cut"
- shortcut="control|X">
+ name="Cut">
<menu_item_call.on_click
function="Edit.Cut" />
<menu_item_call.on_enable
@@ -14,8 +13,7 @@
<menu_item_call
label="Copy"
layout="topleft"
- name="Copy"
- shortcut="control|C">
+ name="Copy">
<menu_item_call.on_click
function="Edit.Copy" />
<menu_item_call.on_enable
@@ -24,8 +22,7 @@
<menu_item_call
label="Paste"
layout="topleft"
- name="Paste"
- shortcut="control|V">
+ name="Paste">
<menu_item_call.on_click
function="Edit.Paste" />
<menu_item_call.on_enable
@@ -34,8 +31,7 @@
<menu_item_call
label="Delete"
layout="topleft"
- name="Delete"
- shortcut="Del">
+ name="Delete">
<menu_item_call.on_click
function="Edit.Delete" />
<menu_item_call.on_enable
@@ -44,8 +40,7 @@
<menu_item_call
label="Select All"
layout="topleft"
- name="Select All"
- shortcut="control|A">
+ name="Select All">
<menu_item_call.on_click
function="Edit.SelectAll" />
<menu_item_call.on_enable
diff --git a/indra/newview/skins/default/xui/en/menu_toolbars.xml b/indra/newview/skins/default/xui/en/menu_toolbars.xml
new file mode 100644
index 0000000000..fbe40a7244
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_toolbars.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu
+ layout="topleft"
+ name="Toolbars Popup"
+ visible="false">
+ <menu_item_call label="Remove this button"
+ layout="topleft"
+ name="Remove button">
+ <menu_item_call.on_click function="Toolbars.RemoveSelectedCommand" />
+ </menu_item_call>
+ <menu_item_separator layout="topleft" />
+ <menu_item_call label="Toolbar buttons..."
+ layout="topleft"
+ name="Choose Buttons">
+ <menu_item_call.on_click function="Floater.Show"
+ parameter="toybox" />
+ </menu_item_call>
+ <menu_item_separator layout="topleft" />
+ <menu_item_check label="Icons and labels"
+ layout="topleft"
+ name="icons_with_text">
+ <on_click function="Toolbars.EnableSetting"
+ parameter="icons_with_text" />
+ <on_check function="Toolbars.CheckSetting"
+ parameter="icons_with_text" />
+ </menu_item_check>
+ <menu_item_check label="Icons only"
+ layout="topleft"
+ name="icons_only">
+ <on_click function="Toolbars.EnableSetting"
+ parameter="icons_only" />
+ <on_check function="Toolbars.CheckSetting"
+ parameter="icons_only" />
+ </menu_item_check>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 27ab7c4fbd..ac018adf02 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -8,8 +8,170 @@
label="Me"
name="Me"
tear_off="true">
+ <menu_item_call
+ label="Profile..."
+ name="Profile">
+ <menu_item_call.on_click
+ function="ShowAgentProfile"
+ parameter="agent" />
+ </menu_item_call>
+ <menu_item_call
+ label="Appearance..."
+ name="ChangeOutfit">
+ <menu_item_call.on_click
+ function="CustomizeAvatar" />
+ <menu_item_call.on_enable
+ function="Edit.EnableCustomizeAvatar" />
+ </menu_item_call>
+ <menu_item_call
+ label="Choose an avatar..."
+ name="Avatar Picker">
+ <menu_item_call.on_click
+ function="Floater.ToggleOrBringToFront"
+ parameter="avatar" />
+ </menu_item_call>
+ <menu_item_separator/>
+ <menu_item_check
+ label="Inventory..."
+ name="Inventory"
+ shortcut="control|I"
+ visible="true">
+ <menu_item_check.on_check
+ function="Floater.Visible"
+ parameter="inventory" />
+ <menu_item_check.on_click
+ function="Floater.Toggle"
+ parameter="inventory" />
+ </menu_item_check>
+ <menu_item_call
+ label="New Inventory Window"
+ name="NewInventoryWindow"
+ shortcut="control|shift|I"
+ visible="false">
+ <menu_item_call.on_click
+ function="Inventory.NewWindow"
+ parameter="" />
+ </menu_item_call>
+ <menu_item_call
+ label="Places..."
+ name="Places">
+ <menu_item_call.on_click
+ function="Floater.ToggleOrBringToFront"
+ parameter="places" />
+ </menu_item_call>
+ <menu_item_call
+ label="Picks..."
+ name="Picks">
+ <menu_item_call.on_click
+ function="Floater.ToggleOrBringToFront"
+ parameter="picks" />
+ </menu_item_call>
+ <menu_item_separator/>
+ <menu_item_call
+ label="Camera Controls..."
+ name="Camera Controls">
+ <menu_item_call.on_click
+ function="Floater.ToggleOrBringToFront"
+ parameter="camera" />
+ </menu_item_call>
+ <menu
+ create_jump_keys="true"
+ label="Movement"
+ name="Movement"
+ tear_off="true">
+ <menu_item_call
+ label="Sit Down"
+ layout="topleft"
+ shortcut="alt|shift|S"
+ name="Sit Down Here">
+ <menu_item_call.on_click
+ function="Self.SitDown"
+ parameter="" />
+ <menu_item_call.on_enable
+ function="Self.EnableSitDown" />
+ </menu_item_call>
+ <menu_item_check
+ label="Fly"
+ name="Fly"
+ shortcut="Home">
+ <menu_item_check.on_check
+ function="Agent.getFlying" />
+ <menu_item_check.on_click
+ function="Agent.toggleFlying" />
+ <menu_item_check.on_enable
+ function="Agent.enableFlying" />
+ </menu_item_check>
+ <menu_item_check
+ label="Always Run"
+ name="Always Run"
+ shortcut="control|R">
+ <menu_item_check.on_check
+ function="World.CheckAlwaysRun" />
+ <menu_item_check.on_click
+ function="World.AlwaysRun" />
+ </menu_item_check>
+ <menu_item_call
+ label="Stop Animating Me"
+ name="Stop Animating My Avatar">
+ <menu_item_call.on_click
+ function="Tools.StopAllAnimations" />
+ </menu_item_call>
+ <menu_item_call
+ label="Walk / run / fly..."
+ name="Walk / run / fly">
+ <menu_item_call.on_click
+ function="Floater.ToggleOrBringToFront"
+ parameter="moveview" />
+ </menu_item_call>
+ </menu>
+
+ <menu
+ create_jump_keys="true"
+ label="Status"
+ name="Status"
+ tear_off="true">
+ <menu_item_call
+ label="Away"
+ name="Set Away">
+ <menu_item_call.on_click
+ function="World.SetAway" />
+ </menu_item_call>
<menu_item_call
- label="Preferences"
+ label="Busy"
+ name="Set Busy">
+ <menu_item_call.on_click
+ function="World.SetBusy"/>
+ </menu_item_call>
+ </menu>
+
+ <menu_item_separator/>
+
+ <menu_item_call
+ label="Buy L$..."
+ name="Buy and Sell L$">
+ <menu_item_call.on_click
+ function="BuyCurrency" />
+ </menu_item_call>
+ <menu_item_call
+ label="Merchant Outbox..."
+ name="MerchantOutbox">
+ <menu_item_call.on_click
+ function="Floater.ToggleOrBringToFront"
+ parameter="outbox" />
+ </menu_item_call>
+ <menu_item_call
+ label="Account dashboard..."
+ name="Manage My Account">
+ <menu_item_call.on_click
+ function="PromptShowURL"
+ name="ManageMyAccount_url"
+ parameter="WebLaunchJoinNow,http://secondlife.com/account/" />
+ </menu_item_call>
+
+ <menu_item_separator/>
+
+ <menu_item_call
+ label="Preferences..."
name="Preferences"
shortcut="control|P">
<menu_item_call.on_click
@@ -17,74 +179,73 @@
parameter="preferences" />
</menu_item_call>
<menu_item_call
- label="My Dashboard"
- name="Manage My Account">
- <menu_item_call.on_click
- function="PromptShowURL"
- name="ManageMyAccount_url"
- parameter="WebLaunchJoinNow,http://secondlife.com/account/" />
- </menu_item_call>
- <menu_item_call
- label="Buy L$"
- name="Buy and Sell L$">
+ label="Toolbar buttons..."
+ name="Toolbars"
+ shortcut="control|T">
<menu_item_call.on_click
- function="BuyCurrency" />
+ function="Floater.Toggle"
+ parameter="toybox" />
</menu_item_call>
+ <menu_item_call
+ label="Hide all controls"
+ name="Hide UI"
+ shortcut="control|shift|U">
+ <menu_item_call.on_click
+ function="View.ToggleUI" />
+ </menu_item_call>
<menu_item_separator/>
<menu_item_call
- label="My Profile"
- name="Profile">
- <menu_item_call.on_click
- function="ShowAgentProfile"
- parameter="agent" />
- </menu_item_call>
- <menu_item_call
- label="Change Outfit"
- name="ChangeOutfit">
+ label="Exit [APP_NAME]"
+ name="Quit"
+ shortcut="control|Q">
<menu_item_call.on_click
- function="CustomizeAvatar" />
- <menu_item_call.on_enable
- function="Edit.EnableCustomizeAvatar" />
+ function="File.Quit" />
</menu_item_call>
+ </menu>
+ <menu
+ create_jump_keys="true"
+ label="Communicate"
+ name="Communicate"
+ tear_off="true">
<menu_item_check
- label="My Inventory"
- name="Inventory"
- shortcut="control|shift|I"
- visible="false">
+ label="Chat..."
+ name="Nearby Chat"
+ shortcut="control|H"
+ use_mac_ctrl="true">
<menu_item_check.on_check
function="Floater.Visible"
- parameter="inventory" />
+ parameter="chat_bar" />
<menu_item_check.on_click
function="Floater.Toggle"
- parameter="inventory" />
+ parameter="chat_bar" />
</menu_item_check>
<menu_item_check
- label="My Inventory"
- name="ShowSidetrayInventory"
- shortcut="control|I"
- visible="true">
+ label="Speak"
+ name="Speak">
<menu_item_check.on_check
- function="SidetrayPanelVisible"
- parameter="sidepanel_inventory" />
+ function="Agent.IsMicrophoneOn"
+ parameter="speak" />
+ <menu_item_check.on_enable
+ function="Agent.IsActionAllowed"
+ parameter="speak" />
<menu_item_check.on_click
- function="ShowSidetrayPanel"
- parameter="sidepanel_inventory" />
+ function="Agent.ToggleMicrophone"
+ parameter="speak" />
</menu_item_check>
<menu_item_check
- label="My Gestures"
- name="Gestures"
- shortcut="control|G">
+ label="Voice settings..."
+ name="Nearby Voice">
<menu_item_check.on_check
function="Floater.Visible"
- parameter="gestures" />
+ parameter="voice_controls" />
<menu_item_check.on_click
function="Floater.Toggle"
- parameter="gestures" />
+ parameter="voice_controls" />
</menu_item_check>
<menu_item_check
- label="My Voice"
+ label="Voice morphing..."
name="ShowVoice"
visibility_control="VoiceMorphingEnabled">
<menu_item_check.on_check
@@ -94,152 +255,83 @@
function="Floater.Toggle"
parameter="voice_effect" />
</menu_item_check>
- <menu
- create_jump_keys="true"
- label="Movement"
- name="Movement"
- tear_off="true">
- <menu_item_call
- label="Sit Down"
- layout="topleft"
- shortcut="alt|shift|S"
- name="Sit Down Here">
- <menu_item_call.on_click
- function="Self.SitDown"
- parameter="" />
- <menu_item_call.on_enable
- function="Self.EnableSitDown" />
- </menu_item_call>
- <menu_item_check
- label="Fly"
- name="Fly"
- shortcut="Home">
- <menu_item_check.on_check
- function="Agent.getFlying" />
- <menu_item_check.on_click
- function="Agent.toggleFlying" />
- <menu_item_check.on_enable
- function="Agent.enableFlying" />
- </menu_item_check>
- <menu_item_check
- label="Always Run"
- name="Always Run"
- shortcut="control|R">
- <menu_item_check.on_check
- function="World.CheckAlwaysRun" />
- <menu_item_check.on_click
- function="World.AlwaysRun" />
- </menu_item_check>
- <menu_item_call
- label="Stop Animating Me"
- name="Stop Animating My Avatar">
- <menu_item_call.on_click
- function="Tools.StopAllAnimations" />
- </menu_item_call>
- </menu>
- <menu
- create_jump_keys="true"
- label="My Status"
- name="Status"
- tear_off="true">
- <menu_item_call
- label="Away"
- name="Set Away">
- <menu_item_call.on_click
- function="World.SetAway" />
- </menu_item_call>
- <menu_item_call
- label="Busy"
- name="Set Busy">
- <menu_item_call.on_click
- function="World.SetBusy"/>
+ <menu_item_check
+ label="Gestures..."
+ name="Gestures"
+ shortcut="control|G">
+ <menu_item_check.on_check
+ function="Floater.Visible"
+ parameter="gestures" />
+ <menu_item_check.on_click
+ function="Floater.Toggle"
+ parameter="gestures" />
+ </menu_item_check>
+ <menu_item_separator/>
+ <menu_item_call
+ label="Friends"
+ name="My Friends"
+ shortcut="control|shift|F">
+ <menu_item_call.on_click
+ function="SideTray.PanelPeopleTab"
+ parameter="friends_panel" />
</menu_item_call>
- </menu>
<menu_item_call
- label="Request Admin Status"
- name="Request Admin Options"
- shortcut="control|alt|G"
- visible="false">
+ label="Groups"
+ name="My Groups"
+ shortcut="control|shift|G">
<menu_item_call.on_click
- function="Advanced.RequestAdminStatus" />
+ function="SideTray.PanelPeopleTab"
+ parameter="groups_panel" />
</menu_item_call>
<menu_item_call
- label="Leave Admin Status"
- name="Leave Admin Options"
- shortcut="control|alt|shift|G"
- visible="false">
+ label="Nearby people"
+ name="Active Speakers"
+ shortcut="control|shift|A">
<menu_item_call.on_click
- function="Advanced.LeaveAdminStatus" />
+ function="SideTray.PanelPeopleTab"
+ parameter="nearby_panel" />
</menu_item_call>
-
- <menu_item_separator/>
-
<menu_item_call
- label="Exit [APP_NAME]"
- name="Quit"
- shortcut="control|Q">
+ label="Block List"
+ name="Block List">
<menu_item_call.on_click
- function="File.Quit" />
+ function="Communicate.BlockList" />
</menu_item_call>
</menu>
<menu
create_jump_keys="true"
- label="Communicate"
- name="Communicate"
+ label="World"
+ name="World"
tear_off="true">
<menu_item_call
- label="My Friends"
- name="My Friends"
- shortcut="control|shift|F">
+ label="Landmark This Place"
+ name="Create Landmark Here">
<menu_item_call.on_click
- function="SideTray.PanelPeopleTab"
- parameter="friends_panel" />
- </menu_item_call>
+ function="World.CreateLandmark" />
+ <menu_item_call.on_enable
+ function="World.EnableCreateLandmark" />
+ </menu_item_call>
<menu_item_call
- label="My Groups"
- name="My Groups"
- shortcut="control|shift|G">
+ label="Destinations..."
+ name="Destinations">
<menu_item_call.on_click
- function="SideTray.PanelPeopleTab"
- parameter="groups_panel" />
+ function="Floater.ToggleOrBringToFront"
+ parameter="destinations" />
</menu_item_call>
-
- <menu_item_separator/>
-
- <!--menu_item_call
- label="Chat"
- name="Chat">
- <menu_item_call.on_click
- function="World.Chat" />
- </menu_item_call-->
<menu_item_check
- label="Nearby Chat"
- name="Nearby Chat"
- shortcut="control|H"
+ label="World map"
+ name="World Map"
+ shortcut="control|M"
use_mac_ctrl="true">
<menu_item_check.on_check
function="Floater.Visible"
- parameter="nearby_chat" />
+ parameter="world_map" />
<menu_item_check.on_click
function="Floater.Toggle"
- parameter="nearby_chat" />
+ parameter="world_map" />
</menu_item_check>
- <menu_item_call
- label="Nearby People"
- name="Active Speakers"
- shortcut="control|shift|A">
- <menu_item_call.on_click
- function="SideTray.PanelPeopleTab"
- parameter="nearby_panel" />
- </menu_item_call>
- </menu>
- <menu
- create_jump_keys="true"
- label="World"
- name="World"
- tear_off="true">
<menu_item_check
- label="Mini-Map"
+ label="Mini-map"
name="Mini-Map"
shortcut="control|shift|M">
<menu_item_check.on_check
@@ -249,18 +341,36 @@
function="Floater.Toggle"
parameter="mini_map" />
</menu_item_check>
- <menu_item_check
- label="World Map"
- name="World Map"
- shortcut="control|M"
- use_mac_ctrl="true">
+ <menu_item_check
+ label="Search"
+ name="Search"
+ shortcut="control|F">
<menu_item_check.on_check
function="Floater.Visible"
- parameter="world_map" />
+ parameter="search" />
<menu_item_check.on_click
function="Floater.Toggle"
- parameter="world_map" />
- </menu_item_check>
+ parameter="search" />
+ </menu_item_check>
+ <menu_item_separator/>
+ <menu_item_call
+ label="Teleport home"
+ name="Teleport Home"
+ shortcut="control|shift|H">
+ <menu_item_call.on_click
+ function="World.TeleportHome" />
+ <menu_item_call.on_enable
+ function="World.EnableTeleportHome" />
+ </menu_item_call>
+ <menu_item_call
+ label="Set home to here"
+ name="Set Home to Here">
+ <menu_item_call.on_click
+ function="World.SetHomeLocation" />
+ <menu_item_call.on_enable
+ function="World.EnableSetHomeLocation" />
+ </menu_item_call>
+ <menu_item_separator/>
<menu_item_call
label="Snapshot"
name="Take Snapshot"
@@ -269,82 +379,51 @@
function="Floater.Show"
parameter="snapshot" />
</menu_item_call>
- <menu_item_call
- label="Landmark This Place"
- name="Create Landmark Here">
- <menu_item_call.on_click
- function="World.CreateLandmark" />
- <menu_item_call.on_enable
- function="World.EnableCreateLandmark" />
- </menu_item_call>
- <menu
- create_jump_keys="true"
- label="Place Profile"
- name="Land"
- tear_off="true">
+ <menu_item_separator/>
<menu_item_call
- label="Place Profile"
+ label="Place profile"
layout="topleft"
name="Place Profile">
<menu_item_call.on_click
function="World.PlaceProfile" />
</menu_item_call>
<menu_item_call
- label="About Land"
+ label="About land"
name="About Land">
<menu_item_call.on_click
function="Floater.Show"
parameter="about_land" />
</menu_item_call>
<menu_item_call
- label="Region/Estate"
+ label="Region / Estate"
name="Region/Estate">
<menu_item_call.on_click
function="Floater.Show"
parameter="region_info" />
</menu_item_call>
- </menu>
+ <menu_item_call
+ label="My land holdings..."
+ name="My Land">
+ <menu_item_call.on_click
+ function="Floater.Show"
+ parameter="land_holdings" />
+ </menu_item_call>
+ <menu_item_call
+ label="Buy this land"
+ name="Buy Land">
+ <menu_item_call.on_click
+ function="Land.Buy" />
+ <menu_item_call.on_enable
+ function="World.EnableBuyLand" />
+ </menu_item_call>
<menu_item_separator/>
- <menu_item_call
- label="Buy This Land"
- name="Buy Land">
- <menu_item_call.on_click
- function="Land.Buy" />
- <menu_item_call.on_enable
- function="World.EnableBuyLand" />
- </menu_item_call>
- <menu_item_call
- label="My Land"
- name="My Land">
- <menu_item_call.on_click
- function="Floater.Show"
- parameter="land_holdings" />
- </menu_item_call>
<menu
create_jump_keys="true"
label="Show"
name="LandShow"
tear_off="true">
- <menu_item_check
- label="Move Controls"
- name="Movement Controls">
- <menu_item_check.on_check
- function="Floater.Visible"
- parameter="moveview" />
- <menu_item_check.on_click
- function="World.Toggle.MovementControls" />
- </menu_item_check>
- <menu_item_check
- label="View Controls"
- name="Camera Controls">
- <menu_item_check.on_check
- function="Floater.Visible"
- parameter="camera" />
- <menu_item_check.on_click
- function="World.Toggle.CameraControls" />
- </menu_item_check>
<menu_item_check
label="Ban Lines"
name="Ban Lines">
@@ -417,24 +496,6 @@
</menu>
<menu_item_separator/>
-
- <menu_item_call
- label="Teleport Home"
- name="Teleport Home"
- shortcut="control|shift|H">
- <menu_item_call.on_click
- function="World.TeleportHome" />
- <menu_item_call.on_enable
- function="World.EnableTeleportHome" />
- </menu_item_call>
- <menu_item_call
- label="Set Home to Here"
- name="Set Home to Here">
- <menu_item_call.on_click
- function="World.SetHomeLocation" />
- <menu_item_call.on_enable
- function="World.EnableSetHomeLocation" />
- </menu_item_call>
<!-- <menu_item_check
label="Show Navigation Bar"
name="ShowNavbarNavigationPanel">
@@ -457,12 +518,10 @@
</menu_item_check>
<menu_item_separator/>-->
- <menu_item_separator/>
-
- <menu
+ <menu
create_jump_keys="true"
label="Sun"
- name="Environment Settings"
+ name="Sun"
tear_off="true">
<menu_item_call
label="Sunrise"
@@ -494,24 +553,122 @@
function="World.EnvSettings"
parameter="midnight" />
</menu_item_call>
- <menu_item_call
- label="Estate Time"
- name="Revert to Region Default">
- <menu_item_call.on_click
- function="World.EnvSettings"
- parameter="default" />
- </menu_item_call>
-
<menu_item_separator/>
-
<menu_item_call
- label="Environment Editor"
- name="Environment Editor">
+ label="Use Region Settings"
+ name="Use Region Settings">
<menu_item_call.on_click
function="World.EnvSettings"
- parameter="editor" />
+ parameter="region" />
</menu_item_call>
</menu>
+
+
+ <menu
+ create_jump_keys="true"
+ label="Environment Editor"
+ name="Environment Editor"
+ tear_off="true">
+
+ <menu_item_call
+ label="Environment Settings..."
+ name="Environment Settings">
+ <menu_item_call.on_click
+ function="World.EnvSettings"
+ parameter="editor"/>
+ </menu_item_call>
+
+ <menu_item_separator/>
+
+ <menu
+ name="Water Presets"
+ label="Water Presets">
+ <menu_item_call
+ label="New preset..."
+ name="new_water_preset">
+ <menu_item_call.on_click
+ function="World.EnvPreset"
+ parameter="new_water"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Edit preset..."
+ name="edit_water_preset">
+ <menu_item_call.on_click
+ function="World.EnvPreset"
+ parameter="edit_water"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Delete preset..."
+ name="delete_water_preset">
+ <menu_item_call.on_click
+ function="World.EnvPreset"
+ parameter="delete_water"/>
+ <menu_item_call.on_enable
+ function="World.EnableEnvPreset"
+ parameter="delete_water"/>
+ </menu_item_call>
+ </menu>
+
+ <menu
+ name="Sky Presets"
+ label="Sky Presets">
+ <menu_item_call
+ label="New preset..."
+ name="new_sky_preset">
+ <menu_item_call.on_click
+ function="World.EnvPreset"
+ parameter="new_sky"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Edit preset..."
+ name="edit_sky_preset">
+ <menu_item_call.on_click
+ function="World.EnvPreset"
+ parameter="edit_sky"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Delete preset..."
+ name="delete_sky_preset">
+ <menu_item_call.on_click
+ function="World.EnvPreset"
+ parameter="delete_sky"/>
+ <menu_item_call.on_enable
+ function="World.EnableEnvPreset"
+ parameter="delete_sky"/>
+ </menu_item_call>
+ </menu>
+
+ <menu
+ name="Day Presets"
+ label="Day Presets">
+ <menu_item_call
+ label="New preset..."
+ name="new_day_preset">
+ <menu_item_call.on_click
+ function="World.EnvPreset"
+ parameter="new_day_cycle"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Edit preset..."
+ name="edit_day_preset">
+ <menu_item_call.on_click
+ function="World.EnvPreset"
+ parameter="edit_day_cycle"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Delete preset..."
+ name="delete_day_preset">
+ <menu_item_call.on_click
+ function="World.EnvPreset"
+ parameter="delete_day_cycle"/>
+ <menu_item_call.on_enable
+ function="World.EnableEnvPreset"
+ parameter="delete_day_cycle"/>
+ </menu_item_call>
+ </menu>
+ </menu>
+
+
</menu>
<menu
create_jump_keys="true"
@@ -961,6 +1118,18 @@
parameter="Upload Animation" />
</menu_item_call>
<menu_item_call
+ label="Model..."
+ layout="topleft"
+ name="Upload Model">
+ <menu_item_call.on_click
+ function="File.UploadModel"
+ parameter="" />
+ <menu_item_call.on_enable
+ function="File.EnableUploadModel" />
+ <menu_item_call.on_visible
+ function="File.VisibleUploadModel"/>
+ </menu_item_call>
+ <menu_item_call
label="Bulk (L$[COST] per file)..."
layout="topleft"
name="Bulk Upload">
@@ -976,6 +1145,31 @@
parameter="perm_prefs" />
</menu_item_call>
</menu>
+ <menu_item_separator/>
+ <menu_item_call
+ enabled="false"
+ label="Undo"
+ name="Undo"
+ allow_key_repeat="true"
+ shortcut="control|Z">
+ <on_click
+ function="Edit.Undo"
+ userdata="" />
+ <on_enable
+ function="Edit.EnableUndo" />
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Redo"
+ name="Redo"
+ allow_key_repeat="true"
+ shortcut="control|Y">
+ <on_click
+ function="Edit.Redo"
+ userdata="" />
+ <on_enable
+ function="Edit.EnableRedo" />
+ </menu_item_call>
</menu>
<menu
create_jump_keys="true"
@@ -983,6 +1177,13 @@
name="Help"
tear_off="true">
<menu_item_call
+ label="How to..."
+ name="How To">
+ <menu_item_call.on_click
+ function="Help.ToggleHowTo"
+ parameter="" />
+ </menu_item_call>
+ <menu_item_call
label="[SECOND_LIFE] Help"
name="Second Life Help"
shortcut="F1">
@@ -1023,14 +1224,6 @@
function="Floater.Show"
parameter="sl_about" />
</menu_item_call>
- <menu_item_check
- label="Enable Hints"
- name="Enable Hints">
- <on_check
- control="EnableUIHints"/>
- <on_click
- function="ToggleUIHints"/>
- </menu_item_check>
</menu>
<menu
create_jump_keys="true"
@@ -1104,16 +1297,6 @@
function="ToggleControl"
parameter="QuietSnapshotsToDisk" />
</menu_item_check>
- <menu_item_check
- label="Compress Snapshots to Disk"
- name="CompressSnapshotsToDisk">
- <menu_item_check.on_check
- function="CheckControl"
- parameter="CompressSnapshotsToDisk" />
- <menu_item_check.on_click
- function="ToggleControl"
- parameter="CompressSnapshotsToDisk" />
- </menu_item_check>
<menu_item_separator/>
@@ -1141,7 +1324,7 @@
parameter="stats" />
</menu_item_check>
<menu_item_check
- label="Show Avatar Rendering Cost"
+ label="Show Draw Weight for Avatars"
name="Avatar Rendering Cost">
<menu_item_check.on_check
function="Advanced.CheckInfoDisplay"
@@ -1265,7 +1448,7 @@
tear_off="true">
<menu_item_check
label="Simple"
- name="Simple"
+ name="Rendering Type Simple"
shortcut="control|alt|shift|1">
<menu_item_check.on_check
function="Advanced.CheckRenderType"
@@ -1276,7 +1459,7 @@
</menu_item_check>
<menu_item_check
label="Alpha"
- name="Alpha"
+ name="Rendering Type Alpha"
shortcut="control|alt|shift|2">
<menu_item_check.on_check
function="Advanced.CheckRenderType"
@@ -1287,7 +1470,7 @@
</menu_item_check>
<menu_item_check
label="Tree"
- name="Tree"
+ name="Rendering Type Tree"
shortcut="control|alt|shift|3">
<menu_item_check.on_check
function="Advanced.CheckRenderType"
@@ -1298,7 +1481,7 @@
</menu_item_check>
<menu_item_check
label="Avatars"
- name="Character"
+ name="Rendering Type Character"
shortcut="control|alt|shift|4">
<menu_item_check.on_check
function="Advanced.CheckRenderType"
@@ -1308,19 +1491,19 @@
parameter="character" />
</menu_item_check>
<menu_item_check
- label="SurfacePath"
- name="SurfacePath"
+ label="Surface Patch"
+ name="Rendering Type Surface Patch"
shortcut="control|alt|shift|5">
<menu_item_check.on_check
function="Advanced.CheckRenderType"
- parameter="surfacePath" />
+ parameter="surfacePatch" />
<menu_item_check.on_click
function="Advanced.ToggleRenderType"
- parameter="surfacePath" />
+ parameter="surfacePatch" />
</menu_item_check>
<menu_item_check
label="Sky"
- name="Sky"
+ name="Rendering Type Sky"
shortcut="control|alt|shift|6">
<menu_item_check.on_check
function="Advanced.CheckRenderType"
@@ -1331,7 +1514,7 @@
</menu_item_check>
<menu_item_check
label="Water"
- name="Water"
+ name="Rendering Type Water"
shortcut="control|alt|shift|7">
<menu_item_check.on_check
function="Advanced.CheckRenderType"
@@ -1342,7 +1525,7 @@
</menu_item_check>
<menu_item_check
label="Ground"
- name="Ground"
+ name="Rendering Type Ground"
shortcut="control|alt|shift|8">
<menu_item_check.on_check
function="Advanced.CheckRenderType"
@@ -1353,7 +1536,7 @@
</menu_item_check>
<menu_item_check
label="Volume"
- name="Volume"
+ name="Rendering Type Volume"
shortcut="control|alt|shift|9">
<menu_item_check.on_check
function="Advanced.CheckRenderType"
@@ -1364,7 +1547,7 @@
</menu_item_check>
<menu_item_check
label="Grass"
- name="Grass"
+ name="Rendering Type Grass"
shortcut="control|alt|shift|0">
<menu_item_check.on_check
function="Advanced.CheckRenderType"
@@ -1375,7 +1558,7 @@
</menu_item_check>
<menu_item_check
label="Clouds"
- name="Clouds"
+ name="Rendering Type Clouds"
shortcut="control|alt|shift|-">
<menu_item_check.on_check
function="Advanced.CheckRenderType"
@@ -1386,7 +1569,7 @@
</menu_item_check>
<menu_item_check
label="Particles"
- name="Particles"
+ name="Rendering Type Particles"
shortcut="control|alt|shift|=">
<menu_item_check.on_check
function="Advanced.CheckRenderType"
@@ -1397,7 +1580,7 @@
</menu_item_check>
<menu_item_check
label="Bump"
- name="Bump"
+ name="Rendering Type Bump"
shortcut="control|alt|shift|\">
<menu_item_check.on_check
function="Advanced.CheckRenderType"
@@ -1414,7 +1597,7 @@
tear_off="true">
<menu_item_check
label="UI"
- name="UI"
+ name="ToggleUI"
shortcut="control|alt|F1">
<menu_item_check.on_check
function="Advanced.CheckFeature"
@@ -1528,36 +1711,6 @@
function="ToggleControl"
parameter="MouseSmooth" />
</menu_item_check>
-
- <menu_item_separator/>
-
- <menu
- create_jump_keys="true"
- label="Shortcuts"
- name="Shortcuts"
- tear_off="true"
- visible="false">
- <menu_item_call
- label="Image (L$[COST])..."
- name="Upload Image"
- shortcut="control|U">
- <menu_item_call.on_click
- function="File.UploadImage"
- parameter="" />
- <menu_item_call.on_enable
- function="File.EnableUpload" />
- </menu_item_call>
- <menu_item_check
- label="Search"
- name="Search"
- shortcut="control|F">
- <menu_item_check.on_check
- function="Floater.Visible"
- parameter="search" />
- <menu_item_check.on_click
- function="Floater.Toggle"
- parameter="search" />
- </menu_item_check>
<menu_item_call
enabled="false"
label="Release Keys"
@@ -1569,12 +1722,14 @@
function="Tools.EnableReleaseKeys"
parameter="" />
</menu_item_call>
- <menu_item_call
- label="Set UI Size to Default"
- name="Set UI Size to Default">
- <menu_item_call.on_click
- function="View.DefaultUISize" />
- </menu_item_call>
+ <menu_item_separator/>
+
+ <menu
+ create_jump_keys="true"
+ label="Shortcuts"
+ name="Shortcuts"
+ tear_off="true"
+ visible="false">
<!-- This second, alternative shortcut for Show Advanced Menu is for backward compatibility. The main shortcut has been changed so it's Linux-friendly, where the old shortcut is typically eaten by the window manager. -->
<menu_item_check
label="Show Advanced Menu - legacy shortcut"
@@ -1661,55 +1816,6 @@
<menu_item_separator/>
- <menu
- create_jump_keys="true"
- label="Select Build Tool"
- name="Select Tool"
- tear_off="true">
- <menu_item_call
- label="Focus Tool"
- name="Focus"
- shortcut="control|1">
- <menu_item_call.on_click
- function="Tools.SelectTool"
- parameter="focus" />
- </menu_item_call>
- <menu_item_call
- label="Move Tool"
- name="Move"
- shortcut="control|2">
- <menu_item_call.on_click
- function="Tools.SelectTool"
- parameter="move" />
- </menu_item_call>
- <menu_item_call
- label="Edit Tool"
- name="Edit"
- shortcut="control|3">
- <menu_item_call.on_click
- function="Tools.SelectTool"
- parameter="edit" />
- </menu_item_call>
- <menu_item_call
- label="Create Tool"
- name="Create"
- shortcut="control|4">
- <menu_item_call.on_click
- function="Tools.SelectTool"
- parameter="create" />
- </menu_item_call>
- <menu_item_call
- label="Land Tool"
- name="Land"
- shortcut="control|5">
- <menu_item_call.on_click
- function="Tools.SelectTool"
- parameter="land" />
- </menu_item_call>
- </menu>
-
- <menu_item_separator/>
-
<menu_item_call
label="Zoom In"
name="Zoom In"
@@ -1843,6 +1949,16 @@
function="Advanced.ToggleConsole"
parameter="memory view" />
</menu_item_check>
+ <menu_item_check
+ label="Scene Statistics"
+ name="Scene Statistics">
+ <menu_item_check.on_check
+ function="Advanced.CheckConsole"
+ parameter="scene view" />
+ <menu_item_check.on_click
+ function="Advanced.ToggleConsole"
+ parameter="scene view" />
+ </menu_item_check>
<menu_item_separator/>
@@ -1927,6 +2043,16 @@
function="ToggleControl"
parameter="DebugShowTime" />
</menu_item_check>
+ <menu_item_check
+ label="Show Upload Cost"
+ name="Show Upload Cost">
+ <menu_item_check.on_check
+ function="CheckControl"
+ parameter="DebugShowUploadCost" />
+ <menu_item_check.on_click
+ function="ToggleControl"
+ parameter="DebugShowUploadCost" />
+ </menu_item_check>
<menu_item_check
label="Show Render Info"
name="Show Render Info">
@@ -1937,6 +2063,16 @@
function="ToggleControl"
parameter="DebugShowRenderInfo" />
</menu_item_check>
+ <menu_item_check
+ label="Show Texture Info"
+ name="Show Texture Info">
+ <menu_item_check.on_check
+ function="CheckControl"
+ parameter="DebugShowTextureInfo" />
+ <menu_item_check.on_click
+ function="ToggleControl"
+ parameter="DebugShowTextureInfo" />
+ </menu_item_check>
<menu_item_check
label="Show Matrices"
name="Show Matrices">
@@ -1957,6 +2093,26 @@
function="ToggleControl"
parameter="DebugShowColor" />
</menu_item_check>
+ <menu_item_check
+ label="Show Memory"
+ name="Show Memory">
+ <menu_item_check.on_check
+ function="CheckControl"
+ parameter="DebugShowMemory" />
+ <menu_item_check.on_click
+ function="ToggleControl"
+ parameter="DebugShowMemory" />
+ </menu_item_check>
+ <menu_item_check
+ label="Show Private Mem Info"
+ name="Show Private Mem Info">
+ <menu_item_check.on_check
+ function="CheckControl"
+ parameter="DebugShowPrivateMem" />
+ <menu_item_check.on_click
+ function="ToggleControl"
+ parameter="DebugShowPrivateMem" />
+ </menu_item_check>
<menu_item_separator/>
@@ -2090,6 +2246,16 @@
parameter="bboxes" />
</menu_item_check>
<menu_item_check
+ label="Normals"
+ name="Normals">
+ <menu_item_check.on_check
+ function="Advanced.CheckInfoDisplay"
+ parameter="normals" />
+ <menu_item_check.on_click
+ function="Advanced.ToggleInfoDisplay"
+ parameter="normals" />
+ </menu_item_check>
+ <menu_item_check
label="Octree"
name="Octree">
<menu_item_check.on_check
@@ -2110,6 +2276,16 @@
parameter="shadow frusta" />
</menu_item_check>
<menu_item_check
+ label="Physics Shapes"
+ name="Physics Shapes">
+ <menu_item_check.on_check
+ function="Advanced.CheckInfoDisplay"
+ parameter="physics shapes" />
+ <menu_item_check.on_click
+ function="Advanced.ToggleInfoDisplay"
+ parameter="physics shapes" />
+ </menu_item_check>
+ <menu_item_check
label="Occlusion"
name="Occlusion">
<menu_item_check.on_check
@@ -2130,6 +2306,16 @@
parameter="render batches" />
</menu_item_check>
<menu_item_check
+ label="Update Type"
+ name="Update Type">
+ <menu_item_check.on_check
+ function="Advanced.CheckInfoDisplay"
+ parameter="update type" />
+ <menu_item_check.on_click
+ function="Advanced.ToggleInfoDisplay"
+ parameter="update type" />
+ </menu_item_check>
+ <menu_item_check
label="Texture Anim"
name="Texture Anim">
<menu_item_check.on_check
@@ -2170,6 +2356,26 @@
parameter="face area" />
</menu_item_check>
<menu_item_check
+ label="LOD Info"
+ name="LOD Info">
+ <menu_item_check.on_check
+ function="Advanced.CheckInfoDisplay"
+ parameter="lod info" />
+ <menu_item_check.on_click
+ function="Advanced.ToggleInfoDisplay"
+ parameter="lod info" />
+ </menu_item_check>
+ <menu_item_check
+ label="Build Queue"
+ name="Build Queue">
+ <menu_item_check.on_check
+ function="Advanced.CheckInfoDisplay"
+ parameter="build queue" />
+ <menu_item_check.on_click
+ function="Advanced.ToggleInfoDisplay"
+ parameter="build queue" />
+ </menu_item_check>
+ <menu_item_check
label="Lights"
name="Lights">
<menu_item_check.on_check
@@ -2199,6 +2405,46 @@
function="Advanced.ToggleInfoDisplay"
parameter="raycast" />
</menu_item_check>
+ <menu_item_check
+ label="Wind Vectors"
+ name="Wind Vectors">
+ <menu_item_check.on_check
+ function="Advanced.CheckInfoDisplay"
+ parameter="wind vectors" />
+ <menu_item_check.on_click
+ function="Advanced.ToggleInfoDisplay"
+ parameter="wind vectors" />
+ </menu_item_check>
+ <menu_item_check
+ label="Render Complexity"
+ name="rendercomplexity">
+ <menu_item_check.on_check
+ function="Advanced.CheckInfoDisplay"
+ parameter="rendercomplexity" />
+ <menu_item_check.on_click
+ function="Advanced.ToggleInfoDisplay"
+ parameter="rendercomplexity" />
+ </menu_item_check>
+ <menu_item_check
+ label="Attachment Bytes"
+ name="attachment bytes">
+ <menu_item_check.on_check
+ function="Advanced.CheckInfoDisplay"
+ parameter="attachment bytes" />
+ <menu_item_check.on_click
+ function="Advanced.ToggleInfoDisplay"
+ parameter="attachment bytes" />
+ </menu_item_check>
+ <menu_item_check
+ label="Sculpt"
+ name="Sculpt">
+ <menu_item_check.on_check
+ function="Advanced.CheckInfoDisplay"
+ parameter="sculpt" />
+ <menu_item_check.on_click
+ function="Advanced.ToggleInfoDisplay"
+ parameter="sculpt" />
+ </menu_item_check>
</menu>
<menu
create_jump_keys="true"
@@ -2255,19 +2501,6 @@
<menu_item_check.on_enable
function="Advanced.EnableObjectObjectOcclusion" />
</menu_item_check>
- <menu_item_check
- label="Framebuffer Objects"
- name="Framebuffer Objects">
- <menu_item_check.on_check
- function="CheckControl"
- parameter="RenderUseFBO" />
- <menu_item_check.on_click
- function="ToggleControl"
- parameter="RenderUseFBO" />
- <menu_item_check.on_enable
- function="Advanced.EnableRenderFBO" />
- </menu_item_check>
-
<menu_item_separator />
<menu_item_check
@@ -2306,19 +2539,6 @@
<menu_item_check.on_enable
function="Advanced.EnableRenderDeferredOptions" />
</menu_item_check>
- <menu_item_check
- label=" Global Illumination (experimental)"
- name="Global Illumination">
- <menu_item_check.on_check
- function="CheckControl"
- parameter="RenderDeferredGI" />
- <menu_item_check.on_click
- function="ToggleControl"
- parameter="RenderDeferredGI" />
- <menu_item_check.on_enable
- function="Advanced.EnableRenderDeferredOptions" />
- </menu_item_check>
-
<menu_item_separator />
<menu_item_check
@@ -2568,7 +2788,7 @@
<menu
create_jump_keys="true"
label="World"
- name="World"
+ name="DevelopWorld"
tear_off="true">
<menu_item_check
label="Sim Sun Override"
@@ -2581,16 +2801,6 @@
parameter="SkyOverrideSimSunPosition" />
</menu_item_check>
<menu_item_check
- label="Cheesy Beacon"
- name="Cheesy Beacon">
- <menu_item_check.on_check
- function="CheckControl"
- parameter="CheesyBeacon" />
- <menu_item_check.on_click
- function="ToggleControl"
- parameter="CheesyBeacon" />
- </menu_item_check>
- <menu_item_check
label="Fixed Weather"
name="Fixed Weather">
<menu_item_check.on_check
@@ -2623,13 +2833,21 @@
parameter="BottomPanelNew" />
</menu_item_check>-->
<menu_item_call
- label="Web Browser Test"
+ label="Media Browser Test"
name="Web Browser Test">
<menu_item_call.on_click
function="Advanced.WebBrowserTest"
parameter="http://secondlife.com/app/search/slurls.html"/>
</menu_item_call>
- <menu_item_call
+ <menu_item_call
+ label="Web Content Browser"
+ name="Web Content Browser"
+ shortcut="control|shift|Z">
+ <menu_item_call.on_click
+ function="Advanced.WebContentTest"
+ parameter="http://google.com"/>
+ </menu_item_call>
+ <menu_item_call
label="Dump SelectMgr"
name="Dump SelectMgr">
<menu_item_call.on_click
@@ -2686,7 +2904,6 @@
function="Floater.Toggle"
parameter="region_debug_console" />
</menu_item_check>
-
<menu_item_separator />
<menu_item_check
@@ -2807,7 +3024,7 @@
tear_off="true">
<menu_item_call
label="Iris"
- name="Iris">
+ name="Grab Iris">
<menu_item_call.on_click
function="Advanced.GrabBakedTexture"
parameter="iris" />
@@ -2817,7 +3034,7 @@
</menu_item_call>
<menu_item_call
label="Head"
- name="Head">
+ name="Grab Head">
<menu_item_call.on_click
function="Advanced.GrabBakedTexture"
parameter="head" />
@@ -2827,7 +3044,7 @@
</menu_item_call>
<menu_item_call
label="Upper Body"
- name="Upper Body">
+ name="Grab Upper Body">
<menu_item_call.on_click
function="Advanced.GrabBakedTexture"
parameter="upper" />
@@ -2837,7 +3054,7 @@
</menu_item_call>
<menu_item_call
label="Lower Body"
- name="Lower Body">
+ name="Grab Lower Body">
<menu_item_call.on_click
function="Advanced.GrabBakedTexture"
parameter="lower" />
@@ -2847,7 +3064,7 @@
</menu_item_call>
<menu_item_call
label="Skirt"
- name="Skirt">
+ name="Grab Skirt">
<menu_item_call.on_click
function="Advanced.GrabBakedTexture"
parameter="skirt" />
@@ -3041,12 +3258,30 @@
function="ToggleControl"
parameter="ImagePipelineUseHTTP" />
</menu_item_check>
+ <menu_item_check
+ label="HTTP Inventory"
+ name="HTTP Inventory">
+ <menu_item_check.on_check
+ function="CheckControl"
+ parameter="UseHTTPInventory" />
+ <menu_item_check.on_click
+ function="ToggleControl"
+ parameter="UseHTTPInventory" />
+ </menu_item_check>
<menu_item_call
label="Compress Images"
name="Compress Images">
<menu_item_call.on_click
function="Advanced.CompressImage" />
</menu_item_call>
+
+ <menu_item_call
+ label="Enable Visual Leak Detector"
+ name="Enable Visual Leak Detector">
+ <menu_item_call.on_click
+ function="Advanced.ToggleVisualLeakDetector" />
+ </menu_item_call>
+
<menu_item_check
label="Output Debug Minidump"
name="Output Debug Minidump">
@@ -3067,6 +3302,62 @@
function="ToggleControl"
parameter="ShowConsoleWindow" />
</menu_item_check>
+ <menu
+ create_jump_keys="true"
+ label="Set Logging Level"
+ name="Set Logging Level"
+ tear_off="true">
+ <menu_item_check
+ name="Debug"
+ label="Debug">
+ <menu_item_check.on_check
+ function="Develop.CheckLoggingLevel"
+ parameter="0" />
+ <menu_item_check.on_click
+ function="Develop.SetLoggingLevel"
+ parameter="0" />
+ </menu_item_check>
+ <menu_item_check
+ name="Info"
+ label="Info">
+ <menu_item_check.on_check
+ function="Develop.CheckLoggingLevel"
+ parameter="1" />
+ <menu_item_check.on_click
+ function="Develop.SetLoggingLevel"
+ parameter="1" />
+ </menu_item_check>
+ <menu_item_check
+ name="Warning"
+ label="Warning">
+ <menu_item_check.on_check
+ function="Develop.CheckLoggingLevel"
+ parameter="2" />
+ <menu_item_check.on_click
+ function="Develop.SetLoggingLevel"
+ parameter="2" />
+ </menu_item_check>
+ <menu_item_check
+ name="Error"
+ label="Error">
+ <menu_item_check.on_check
+ function="Develop.CheckLoggingLevel"
+ parameter="3" />
+ <menu_item_check.on_click
+ function="Develop.SetLoggingLevel"
+ parameter="3" />
+ </menu_item_check>
+ <menu_item_check
+ name="None"
+ label="None">
+ <menu_item_check.on_check
+ function="Develop.CheckLoggingLevel"
+ parameter="4" />
+ <menu_item_check.on_click
+ function="Develop.SetLoggingLevel"
+ parameter="4" />
+ </menu_item_check>
+ </menu>
<menu_item_separator/>
@@ -3084,7 +3375,7 @@
<menu_item_call.on_click
function="Advanced.LeaveAdminStatus" />
</menu_item_call>
- <menu_item_check
+ <menu_item_check
label="Show Admin Menu"
name="View Admin Options">
<menu_item_check.on_enable
@@ -3105,10 +3396,11 @@
<menu
create_jump_keys="true"
label="Object"
+ name="AdminObject"
tear_off="true">
<menu_item_call
label="Take Copy"
- name="Take Copy"
+ name="Admin Take Copy"
shortcut="control|alt|shift|O">
<menu_item_call.on_click
function="Admin.ForceTakeCopy" />
@@ -3357,6 +3649,16 @@
parameter="tattoo" />
</menu_item_call>
<menu_item_call
+ label="Physics"
+ name="Physics">
+ <menu_item_call.on_click
+ function="Edit.TakeOff"
+ parameter="physics" />
+ <menu_item_call.on_enable
+ function="Edit.EnableTakeOff"
+ parameter="physics" />
+ </menu_item_call>
+ <menu_item_call
label="All Clothes"
name="All Clothes">
<menu_item_call.on_click
@@ -3367,7 +3669,7 @@
<menu
create_jump_keys="true"
label="Help"
- name="Help"
+ name="DeprecatedHelp"
tear_off="true">
<menu_item_call
label="Official Linden Blog"
diff --git a/indra/newview/skins/default/xui/en/menu_wearing_gear.xml b/indra/newview/skins/default/xui/en/menu_wearing_gear.xml
index 0ac2c14253..0e858ccf10 100644
--- a/indra/newview/skins/default/xui/en/menu_wearing_gear.xml
+++ b/indra/newview/skins/default/xui/en/menu_wearing_gear.xml
@@ -20,4 +20,11 @@
function="Gear.OnEnable"
parameter="take_off" />
</menu_item_call>
+ <menu_item_call
+ label="Copy outfit list to clipboard"
+ layout="topleft"
+ name="copy">
+ <on_click
+ function="Gear.Copy" />
+ </menu_item_call>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/en/notification_visibility.xml b/indra/newview/skins/default/xui/en/notification_visibility.xml
new file mode 100644
index 0000000000..db292100d7
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/notification_visibility.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" ?>
+<notification_visibility>
+ <hide tag="custom_skin"/>
+ <show/>
+</notification_visibility>
+
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 60b876d163..afc5b916e7 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -104,6 +104,7 @@
Your version of [APP_NAME] does not know how to display the notification it just received. Please verify that you have the latest Viewer installed.
Error details: The notification called &apos;[_NAME]&apos; was not found in notifications.xml.
+ <tag>fail</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
@@ -116,6 +117,7 @@ Error details: The notification called &apos;[_NAME]&apos; was not found in noti
Floater error: Could not find the following controls:
[CONTROLS]
+ <tag>fail</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
@@ -126,6 +128,7 @@ Floater error: Could not find the following controls:
name="TutorialNotFound"
type="alertmodal">
No tutorial is currently available.
+ <tag>fail</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
@@ -154,6 +157,7 @@ No tutorial is currently available.
name="BadInstallation"
type="alertmodal">
An error occurred while updating [APP_NAME]. Please [http://get.secondlife.com download the latest version] of the Viewer.
+ <tag>fail</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
@@ -163,8 +167,9 @@ No tutorial is currently available.
icon="alertmodal.tga"
name="LoginFailedNoNetwork"
type="alertmodal">
-Could not connect to the [SECOND_LIFE_GRID].
-&apos;[DIAGNOSTIC]&apos;
+ <tag>fail</tag>
+ Could not connect to the [SECOND_LIFE_GRID].
+ &apos;[DIAGNOSTIC]&apos;
Make sure your Internet connection is working properly.
<usetemplate
name="okbutton"
@@ -176,6 +181,7 @@ Make sure your Internet connection is working properly.
name="MessageTemplateNotFound"
type="alertmodal">
Message Template [PATH] not found.
+ <tag>fail</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
@@ -195,9 +201,90 @@ Save changes to current clothing/body part?
<notification
icon="alertmodal.tga"
+ name="ConfirmNoCopyToOutbox"
+ type="alertmodal">
+You don't have permission to copy one or more of these items to the Merchant Outbox. You can move them or leave them behind.
+ <usetemplate
+ name="okcancelbuttons"
+ notext="Don't move item(s)"
+ yestext="Move item(s)"/>
+ </notification>
+
+ <notification
+ icon="OutboxStatus_Success"
+ name="OutboxFolderCreated"
+ type="outbox">
+ <unique/>
+A new folder has been created for each item you have transferred into the top level of your Merchant Outbox.
+
+ <usetemplate
+ ignoretext="A new folder was created in the Merchant Outbox"
+ name="okignore"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="OutboxStatus_Success"
+ name="OutboxImportComplete"
+ type="outbox">
+Success
+
+All folders were successfully sent to the Marketplace.
+
+ <usetemplate
+ ignoretext="All folders sent to the Marketplace"
+ name="okignore"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="OutboxStatus_Warning"
+ name="OutboxImportHadErrors"
+ type="outbox">
+Some folders did not transfer
+
+Errors occurred when some folders were sent to the Marketplace. Those folders are still in your Merchant Outbox.
+
+See the [[MARKETPLACE_IMPORTS_URL] error log] for more information.
+
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="OutboxStatus_Error"
+ name="OutboxImportFailed"
+ type="outbox">
+Transfer failed
+
+No folders were sent to the Marketplace because of a system or network error. Try again later.
+
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="OutboxStatus_Error"
+ name="OutboxInitFailed"
+ type="outbox">
+Marketplace initialization failed
+
+Initialization with the Marketplace failed because of a system or network error. Try again later.
+
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
+
+
+ <notification
+ icon="alertmodal.tga"
name="CompileQueueSaveText"
type="alertmodal">
There was a problem uploading the text for a script due to the following reason: [REASON]. Please try again later.
+ <tag>fail</tag>
</notification>
<notification
@@ -205,6 +292,7 @@ There was a problem uploading the text for a script due to the following reason:
name="CompileQueueSaveBytecode"
type="alertmodal">
There was a problem uploading the compiled script due to the following reason: [REASON]. Please try again later.
+ <tag>fail</tag>
</notification>
<notification
@@ -212,6 +300,7 @@ There was a problem uploading the compiled script due to the following reason: [
name="WriteAnimationFail"
type="alertmodal">
There was a problem writing animation data. Please try again later.
+ <tag>fail</tag>
</notification>
<notification
@@ -219,6 +308,7 @@ There was a problem writing animation data. Please try again later.
name="UploadAuctionSnapshotFail"
type="alertmodal">
There was a problem uploading the auction snapshot due to the following reason: [REASON]
+ <tag>fail</tag>
</notification>
<notification
@@ -227,6 +317,7 @@ There was a problem uploading the auction snapshot due to the following reason:
type="alertmodal">
Unable to view the contents of more than one item at a time.
Please select only one object and try again.
+ <tag>fail</tag>
</notification>
<notification
@@ -234,7 +325,8 @@ Please select only one object and try again.
name="SaveClothingBodyChanges"
type="alertmodal">
Save all changes to clothing/body parts?
- <usetemplate
+<tag>confirm</tag>
+<usetemplate
canceltext="Cancel"
name="yesnocancelbuttons"
notext="Don&apos;t Save"
@@ -253,10 +345,21 @@ Save all changes to clothing/body parts?
<notification
icon="alertmodal.tga"
+ name="FavoritesOnLogin"
+ type="alertmodal">
+ Note: When you turn on this option, anyone who uses this computer can see your list of favorite locations.
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
name="GrantModifyRights"
type="alertmodal">
Granting modify rights to another Resident allows them to change, delete or take ANY objects you may have in-world. Be VERY careful when handing out this permission.
Do you want to grant modify rights for [NAME]?
+<tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="No"
@@ -269,6 +372,7 @@ Do you want to grant modify rights for [NAME]?
type="alertmodal">
Granting modify rights to another Resident allows them to change ANY objects you may have in-world. Be VERY careful when handing out this permission.
Do you want to grant modify rights for the selected Residents?
+<tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="No"
@@ -280,6 +384,7 @@ Do you want to grant modify rights for the selected Residents?
name="RevokeModifyRights"
type="alertmodal">
Do you want to revoke modify rights for [NAME]?
+<tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="No"
@@ -291,6 +396,7 @@ Do you want to revoke modify rights for [NAME]?
name="RevokeModifyRightsMultiple"
type="alertmodal">
Do you want to revoke modify rights for the selected Residents?
+<tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="No"
@@ -303,7 +409,9 @@ Do you want to revoke modify rights for the selected Residents?
type="alertmodal">
Unable to create group.
[MESSAGE]
- <usetemplate
+ <tag>group</tag>
+ <tag>fail</tag>
+ <usetemplate
name="okbutton"
yestext="OK"/>
</notification>
@@ -314,7 +422,9 @@ Unable to create group.
type="alertmodal">
[NEEDS_APPLY_MESSAGE]
[WANT_APPLY_MESSAGE]
- <usetemplate
+ <tag>confirm</tag>
+ <tag>group</tag>
+ <usetemplate
canceltext="Cancel"
name="yesnocancelbuttons"
notext="Ignore Changes"
@@ -326,7 +436,9 @@ Unable to create group.
name="MustSpecifyGroupNoticeSubject"
type="alertmodal">
You must specify a subject to send a group notice.
- <usetemplate
+ <tag>group</tag>
+ <tag>fail</tag>
+ <usetemplate
name="okbutton"
yestext="OK"/>
</notification>
@@ -339,6 +451,8 @@ You are about to add group members to the role of [ROLE_NAME].
Members cannot be removed from that role.
The members must resign from the role themselves.
Are you sure you want to continue?
+ <tag>group</tag>
+ <tag>confirm</tag>
<usetemplate
ignoretext="Confirm before I add a new group Owner"
name="okcancelignore"
@@ -384,6 +498,7 @@ Add this Ability to &apos;[ROLE_NAME]&apos;?
type="alertmodal">
You are about to drop your attachment.
Are you sure you want to continue?
+ <tag>confirm</tag>
<usetemplate
ignoretext="Confirm before dropping attachments"
name="okcancelignore"
@@ -396,6 +511,9 @@ Add this Ability to &apos;[ROLE_NAME]&apos;?
type="alertmodal">
Joining this group costs L$[COST].
Do you wish to proceed?
+ <tag>confirm</tag>
+ <tag>funds</tag>
+ <tag>group</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -408,6 +526,8 @@ Do you wish to proceed?
type="alertmodal">
You are joining group [NAME].
Do you wish to proceed?
+ <tag>group</tag>
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -421,6 +541,9 @@ Do you wish to proceed?
type="alertmodal">
Joining this group costs L$[COST].
You do not have enough L$ to join this group.
+ <tag>group</tag>
+ <tag>fail</tag>
+ <tag>funds</tag>
</notification>
<notification
@@ -430,6 +553,8 @@ You do not have enough L$ to join this group.
Creating this group will cost L$100.
Groups need more than one member, or they are deleted forever.
Please invite members within 48 hours.
+ <tag>group</tag>
+ <tag>funds</tag>
<usetemplate
canceltext="Cancel"
name="okcancelbuttons"
@@ -441,7 +566,10 @@ Please invite members within 48 hours.
icon="alertmodal.tga"
name="LandBuyPass"
type="alertmodal">
+ <tag>fail</tag>
For L$[COST] you can enter this land (&apos;[PARCEL_NAME]&apos;) for [TIME] hours. Buy a pass?
+ <tag>funds</tag>
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -454,6 +582,7 @@ For L$[COST] you can enter this land (&apos;[PARCEL_NAME]&apos;) for [TIME] hour
type="alertmodal">
Sale price must be set to more than L$0 if selling to anyone.
Please select an individual to sell to if selling for L$0.
+ <tag>fail</tag>
</notification>
<notification
@@ -463,6 +592,7 @@ Please select an individual to sell to if selling for L$0.
type="alertmodal">
The selected [LAND_SIZE] m² land is being set for sale.
Your selling price will be L$[SALE_PRICE] and will be authorized for sale to [NAME].
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -477,6 +607,7 @@ ATTENTION: Clicking &apos;sell to anyone&apos; makes your land available to the
The selected [LAND_SIZE] m² land is being set for sale.
Your selling price will be L$[SALE_PRICE] and will be authorized for sale to [NAME].
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -492,6 +623,8 @@ Are you sure you want to return all objects shared with the group &apos;[NAME]&a
*WARNING* This will delete the non-transferable objects deeded to the group!
Objects: [N]
+ <tag>confirm</tag>
+ <tag>group</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -505,6 +638,7 @@ Objects: [N]
Are you sure you want to return all objects owned by the Resident &apos;[NAME]&apos; on this parcel of land back to their inventory?
Objects: [N]
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -518,6 +652,7 @@ Objects: [N]
Are you sure you want to return all objects owned by you on this parcel of land back to your inventory?
Objects: [N]
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -534,6 +669,7 @@ Transferable objects deeded to a group will be returned to their previous owners
*WARNING* This will delete the non-transferable objects deeded to the group!
Objects: [N]
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -550,6 +686,7 @@ Transferable objects deeded to a group will be returned to their previous owners
*WARNING* This will delete the non-transferable objects deeded to the group!
Objects: [N]
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -561,6 +698,7 @@ Objects: [N]
name="ReturnAllTopObjects"
type="alertmodal">
Are you sure you want to return all listed objects back to their owner&apos;s inventory?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -572,6 +710,7 @@ Are you sure you want to return all listed objects back to their owner&apos;s in
name="DisableAllTopObjects"
type="alertmodal">
Are you sure you want to disable all objects in this region?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -585,6 +724,8 @@ Are you sure you want to disable all objects in this region?
Return the objects on this parcel of land that are NOT shared with the group [NAME] back to their owners?
Objects: [N]
+ <tag>confirm</tag>
+ <tag>group</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -598,6 +739,7 @@ Objects: [N]
Can not disable scripts.
This entire region is damage enabled.
Scripts must be allowed to run for weapons to work.
+ <tag>fail</tag>
</notification>
<notification
@@ -607,6 +749,7 @@ Scripts must be allowed to run for weapons to work.
Multiple faces are currently selected.
If you continue this action, separate instances of media will be set on multiple faces of the object.
To place the media on only one face, choose Select Face and click on the desired face of that object then click Add.
+ <tag>confirm</tag>
<usetemplate
ignoretext="Media will be set on multiple selected faces"
name="okcancelignore"
@@ -619,6 +762,7 @@ To place the media on only one face, choose Select Face and click on the desired
name="MustBeInParcel"
type="alertmodal">
You must be standing inside the land parcel to set its Landing Point.
+ <tag>fail</tag>
</notification>
<notification
@@ -626,6 +770,7 @@ You must be standing inside the land parcel to set its Landing Point.
name="PromptRecipientEmail"
type="alertmodal">
Please enter a valid email address for the recipient(s).
+ <tag>fail</tag>
</notification>
<notification
@@ -633,6 +778,7 @@ Please enter a valid email address for the recipient(s).
name="PromptSelfEmail"
type="alertmodal">
Please enter your email address.
+ <tag>fail</tag>
</notification>
<notification
@@ -640,6 +786,7 @@ Please enter your email address.
name="PromptMissingSubjMsg"
type="alertmodal">
Email snapshot with the default subject or message?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -651,6 +798,7 @@ Email snapshot with the default subject or message?
name="ErrorProcessingSnapshot"
type="alertmodal">
Error processing snapshot data
+ <tag>fail</tag>
</notification>
<notification
@@ -658,6 +806,7 @@ Error processing snapshot data
name="ErrorEncodingSnapshot"
type="alertmodal">
Error encoding snapshot.
+ <tag>fail</tag>
</notification>
<notification
@@ -665,6 +814,7 @@ Error encoding snapshot.
name="ErrorUploadingPostcard"
type="alertmodal">
There was a problem sending a snapshot due to the following reason: [REASON]
+ <tag>fail</tag>
</notification>
<notification
@@ -672,12 +822,14 @@ There was a problem sending a snapshot due to the following reason: [REASON]
name="ErrorUploadingReportScreenshot"
type="alertmodal">
There was a problem uploading a report screenshot due to the following reason: [REASON]
+ <tag>fail</tag>
</notification>
<notification
icon="alertmodal.tga"
name="MustAgreeToLogIn"
type="alertmodal">
+ <tag>fail</tag>
You must agree to the Terms of Service to continue logging into [SECOND_LIFE].
</notification>
@@ -687,6 +839,7 @@ You must agree to the Terms of Service to continue logging into [SECOND_LIFE].
type="alertmodal">
Could not put on outfit.
The outfit folder contains no clothing, body parts, or attachments.
+ <tag>fail</tag>
</notification>
<notification
@@ -694,6 +847,7 @@ The outfit folder contains no clothing, body parts, or attachments.
name="CannotWearTrash"
type="alertmodal">
You can not wear clothes or body parts that are in the trash
+ <tag>fail</tag>
</notification>
<notification
@@ -702,6 +856,7 @@ You can not wear clothes or body parts that are in the trash
type="alertmodal">
Could not attach object.
Exceeds the attachments limit of [MAX_ATTACHMENTS] objects. Please detach another object first.
+ <tag>fail</tag>
</notification>
<notification
@@ -709,16 +864,19 @@ Exceeds the attachments limit of [MAX_ATTACHMENTS] objects. Please detach anothe
name="CannotWearInfoNotComplete"
type="alertmodal">
You can not wear that item because it has not yet loaded. Please try again in a minute.
+ <tag>fail</tag>
</notification>
<notification
icon="alertmodal.tga"
name="MustHaveAccountToLogIn"
type="alertmodal">
+ <tag>fail</tag>
Oops! Something was left blank.
You need to enter the Username name of your avatar.
You need an account to enter [SECOND_LIFE]. Would you like to create one now?
+ <tag>confirm</tag>
<url
option="0"
name="url"
@@ -736,31 +894,18 @@ You need an account to enter [SECOND_LIFE]. Would you like to create one now?
icon="alertmodal.tga"
name="InvalidCredentialFormat"
type="alertmodal">
+ <tag>fail</tag>
You need to enter either the Username or both the First and Last name of your avatar into the Username field, then login again.
</notification>
<notification
icon="alertmodal.tga"
- name="AddClassified"
- type="alertmodal">
-Classified ads appear in the &apos;Classified&apos; section of the Search directory and on [http://secondlife.com/community/classifieds secondlife.com] for one week.
-Fill out your ad, then click &apos;Publish...&apos; to add it to the directory.
-You&apos;ll be asked for a price to pay when clicking Publish.
-Paying more makes your ad appear higher in the list, and also appear higher when people search for keywords.
- <usetemplate
- ignoretext="How to create a new Classified ad"
- name="okcancelignore"
- notext="Cancel"
- yestext="OK"/>
- </notification>
-
- <notification
- icon="alertmodal.tga"
name="DeleteClassified"
type="alertmodal">
Delete classified &apos;[NAME]&apos;?
There is no reimbursement for fees paid.
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -774,6 +919,7 @@ There is no reimbursement for fees paid.
type="alertmodal">
You have selected to delete the media associated with this face.
Are you sure you want to continue?
+ <tag>confirm</tag>
<usetemplate
ignoretext="Confirm before I delete media from an object"
name="okcancelignore"
@@ -786,6 +932,7 @@ Are you sure you want to continue?
name="ClassifiedSave"
type="alertmodal">
Save changes to classified [NAME]?
+ <tag>confirm</tag>
<usetemplate
canceltext="Cancel"
name="yesnocancelbuttons"
@@ -798,6 +945,7 @@ Save changes to classified [NAME]?
name="ClassifiedInsufficientFunds"
type="alertmodal">
Insufficient funds to create classified.
+ <tag>fail</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
@@ -808,6 +956,7 @@ Insufficient funds to create classified.
name="DeleteAvatarPick"
type="alertmodal">
Delete pick &lt;nolink&gt;[PICK]&lt;/nolink&gt;?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -819,6 +968,7 @@ Delete pick &lt;nolink&gt;[PICK]&lt;/nolink&gt;?
name="DeleteOutfits"
type="alertmodal">
Delete the selected outfit?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -830,6 +980,7 @@ Delete pick &lt;nolink&gt;[PICK]&lt;/nolink&gt;?
name="PromptGoToEventsPage"
type="alertmodal">
Go to the [SECOND_LIFE] events web page?
+ <tag>confirm</tag>
<url option="0" name="url">
http://secondlife.com/events/
@@ -845,6 +996,7 @@ Go to the [SECOND_LIFE] events web page?
name="SelectProposalToView"
type="alertmodal">
Please select a proposal to view.
+ <tag>fail</tag>
</notification>
<notification
@@ -852,6 +1004,7 @@ Please select a proposal to view.
name="SelectHistoryItemToView"
type="alertmodal">
Please select a history item to view.
+ <tag>fail</tag>
</notification>
<!--
@@ -918,9 +1071,9 @@ Changing language will take effect after you restart [APP_NAME].
icon="alertmodal.tga"
name="GoToAuctionPage"
type="alertmodal">
-Go to the [SECOND_LIFE] web page to see auction details or make a bid?
+ Go to the [SECOND_LIFE] web page to see auction details or make a bid?
+ <tag>confirm</tag>
<url option="0" name="url">
-
http://secondlife.com/auctions/auction-detail.php?id=[AUCTION_ID]
</url>
<usetemplate
@@ -934,6 +1087,7 @@ Go to the [SECOND_LIFE] web page to see auction details or make a bid?
name="SaveChanges"
type="alertmodal">
Save Changes?
+ <tag>confirm</tag>
<usetemplate
canceltext="Cancel"
name="yesnocancelbuttons"
@@ -948,6 +1102,7 @@ Save Changes?
Gesture save failed.
This gesture has too many steps.
Try removing some steps, then save again.
+<tag>fail</tag>
</notification>
<notification
@@ -955,6 +1110,7 @@ Try removing some steps, then save again.
name="GestureSaveFailedTryAgain"
type="alertmodal">
Gesture save failed. Please try again in a minute.
+<tag>fail</tag>
</notification>
<notification
@@ -963,6 +1119,7 @@ Gesture save failed. Please try again in a minute.
type="alertmodal">
Could not save gesture because the object or the associated object inventory could not be found.
The object may be out of range or may have been deleted.
+<tag>fail</tag>
</notification>
<notification
@@ -970,6 +1127,7 @@ The object may be out of range or may have been deleted.
name="GestureSaveFailedReason"
type="alertmodal">
There was a problem saving a gesture due to the following reason: [REASON]. Please try resaving the gesture later.
+<tag>fail</tag>
</notification>
<notification
@@ -978,6 +1136,7 @@ There was a problem saving a gesture due to the following reason: [REASON]. Ple
type="alertmodal">
Could not save notecard because the object or the associated object inventory could not be found.
The object may be out of range or may have been deleted.
+<tag>fail</tag>
</notification>
<notification
@@ -985,6 +1144,7 @@ The object may be out of range or may have been deleted.
name="SaveNotecardFailReason"
type="alertmodal">
There was a problem saving a notecard due to the following reason: [REASON]. Please try re-saving the notecard later.
+<tag>fail</tag>
</notification>
<notification
@@ -994,6 +1154,7 @@ There was a problem saving a notecard due to the following reason: [REASON]. Pl
Could not undo all changes in your version of the script.
Would you like to load the server&apos;s last saved version?
(**Warning** This operation cannot be undone.)
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -1005,6 +1166,7 @@ Would you like to load the server&apos;s last saved version?
name="SaveScriptFailReason"
type="alertmodal">
There was a problem saving a script due to the following reason: [REASON]. Please try re-saving the script later.
+<tag>fail</tag>
</notification>
<notification
@@ -1013,6 +1175,7 @@ There was a problem saving a script due to the following reason: [REASON]. Plea
type="alertmodal">
Could not save the script because the object it is in could not be found.
The object may be out of range or may have been deleted.
+<tag>fail</tag>
</notification>
<notification
@@ -1020,6 +1183,7 @@ The object may be out of range or may have been deleted.
name="SaveBytecodeFailReason"
type="alertmodal">
There was a problem saving a compiled script due to the following reason: [REASON]. Please try re-saving the script later.
+<tag>fail</tag>
</notification>
<notification
@@ -1028,6 +1192,7 @@ There was a problem saving a compiled script due to the following reason: [REASO
type="alertmodal">
Oops, Your Start Region is not defined.
Please type the Region name in Start Location box or choose My Last Location or My Home as your Start Location.
+<tag>fail</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
@@ -1039,6 +1204,7 @@ Please type the Region name in Start Location box or choose My Last Location or
type="alertmodal">
Could not start or stop the script because the object it is on could not be found.
The object may be out of range or may have been deleted.
+ <tag>fail</tag>
</notification>
<notification
@@ -1046,6 +1212,7 @@ The object may be out of range or may have been deleted.
name="CannotDownloadFile"
type="alertmodal">
Unable to download file
+ <tag>fail</tag>
</notification>
<notification
@@ -1053,6 +1220,7 @@ Unable to download file
name="CannotWriteFile"
type="alertmodal">
Unable to write file [[FILE]]
+ <tag>fail</tag>
</notification>
<notification
@@ -1062,6 +1230,7 @@ Unable to write file [[FILE]]
Just so you know, your computer does not meet [APP_NAME]&apos;s minimum system requirements. You may experience poor performance. Unfortunately, the [SUPPORT_SITE] can't provide technical support for unsupported system configurations.
Visit [_URL] for more information?
+ <tag>confirm</tag>
<url option="0" name="url">
http://www.secondlife.com/corporate/sysreqs.php
@@ -1071,6 +1240,7 @@ Visit [_URL] for more information?
name="okcancelignore"
notext="No"
yestext="Yes"/>
+ <tag>fail</tag>
</notification>
<notification
@@ -1084,6 +1254,7 @@ This is often the case with new hardware that hasn&apos;t been tested yet with [
<ignore name="ignore"
text="My graphics card could not be identified"/>
</form>
+ <tag>fail</tag>
</notification>
<notification
@@ -1094,6 +1265,7 @@ This is often the case with new hardware that hasn&apos;t been tested yet with [
Graphics Quality will be set to Low to avoid some common driver errors. This will disable some graphics features.
We recommend updating your graphics card drivers.
Graphics Quality can be raised in Preferences &gt; Graphics.
+ <tag>fail</tag>
</notification>
<notification
@@ -1101,6 +1273,7 @@ Graphics Quality can be raised in Preferences &gt; Graphics.
name="RegionNoTerraforming"
type="alertmodal">
The region [REGION] does not allow terraforming.
+ <tag>fail</tag>
</notification>
<notification
@@ -1110,10 +1283,12 @@ The region [REGION] does not allow terraforming.
You do not have permission to copy the following items:
[ITEMS]
and will lose it from your inventory if you give it away. Do you really want to offer these items?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="No"
yestext="Yes"/>
+ <tag>fail</tag>
</notification>
<notification
@@ -1121,6 +1296,7 @@ and will lose it from your inventory if you give it away. Do you really want to
name="CannotGiveItem"
type="alertmodal">
Unable to give inventory item.
+ <tag>fail</tag>
</notification>
<notification
@@ -1135,6 +1311,7 @@ Transaction cancelled.
name="TooManyItems"
type="alertmodal">
Cannot give more than 42 items in a single inventory transfer.
+ <tag>fail</tag>
</notification>
<notification
@@ -1142,6 +1319,7 @@ Cannot give more than 42 items in a single inventory transfer.
name="NoItems"
type="alertmodal">
You do not have permission to transfer the selected items.
+ <tag>fail</tag>
</notification>
<notification
@@ -1150,6 +1328,8 @@ You do not have permission to transfer the selected items.
type="alertmodal">
You do not have permission to copy [COUNT] of the selected items. You will lose these items from your inventory.
Do you really want to give these items?
+ <tag>confirm</tag>
+ <tag>fail</tag>
<usetemplate
name="okcancelbuttons"
notext="No"
@@ -1161,6 +1341,7 @@ Do you really want to give these items?
name="CannotGiveCategory"
type="alertmodal">
You do not have permission to transfer the selected folder.
+ <tag>fail</tag>
</notification>
<notification
@@ -1169,6 +1350,7 @@ You do not have permission to transfer the selected folder.
type="alertmodal">
Freeze this avatar?
He or she will temporarily be unable to move, chat, or interact with the world.
+ <tag>confirm</tag>
<usetemplate
canceltext="Cancel"
name="yesnocancelbuttons"
@@ -1182,6 +1364,7 @@ He or she will temporarily be unable to move, chat, or interact with the world.
type="alertmodal">
Freeze [AVATAR_NAME]?
He or she will temporarily be unable to move, chat, or interact with the world.
+ <tag>confirm</tag>
<usetemplate
canceltext="Cancel"
name="yesnocancelbuttons"
@@ -1194,6 +1377,7 @@ He or she will temporarily be unable to move, chat, or interact with the world.
name="EjectAvatarFullname"
type="alertmodal">
Eject [AVATAR_NAME] from your land?
+ <tag>confirm</tag>
<usetemplate
canceltext="Cancel"
name="yesnocancelbuttons"
@@ -1206,6 +1390,7 @@ Eject [AVATAR_NAME] from your land?
name="EjectAvatarNoBan"
type="alertmodal">
Eject this avatar from your land?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -1217,6 +1402,7 @@ Eject this avatar from your land?
name="EjectAvatarFullnameNoBan"
type="alertmodal">
Eject [AVATAR_NAME] from your land?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -1229,6 +1415,7 @@ Eject [AVATAR_NAME] from your land?
persist="true"
type="notify">
You ejected [AVATAR_NAME] from group [GROUP_NAME]
+ <tag>group</tag>
</notification>
<notification
@@ -1236,6 +1423,7 @@ You ejected [AVATAR_NAME] from group [GROUP_NAME]
name="AcquireErrorTooManyObjects"
type="alertmodal">
ACQUIRE ERROR: Too many objects selected.
+ <tag>fail</tag>
</notification>
<notification
@@ -1244,6 +1432,7 @@ ACQUIRE ERROR: Too many objects selected.
type="alertmodal">
ACQUIRE ERROR: Objects span more than one region.
Please move all objects to be acquired onto the same region.
+ <tag>fail</tag>
</notification>
<notification
@@ -1253,6 +1442,7 @@ Please move all objects to be acquired onto the same region.
[EXTRA]
Go to [_URL] for information on purchasing L$?
+ <tag>confirm</tag>
<url option="0" name="url">
http://secondlife.com/app/currency/
@@ -1269,6 +1459,7 @@ Go to [_URL] for information on purchasing L$?
type="alertmodal">
Unable to link these [COUNT] objects.
You can link a maximum of [MAX] objects.
+ <tag>fail</tag>
</notification>
<notification
@@ -1276,6 +1467,7 @@ You can link a maximum of [MAX] objects.
name="CannotLinkIncompleteSet"
type="alertmodal">
You can only link complete sets of objects, and must select more than one object.
+ <tag>fail</tag>
</notification>
<notification
@@ -1285,6 +1477,7 @@ You can only link complete sets of objects, and must select more than one object
Unable to link because you don&apos;t have modify permission on all the objects.
Please make sure none are locked, and that you own all of them.
+ <tag>fail</tag>
</notification>
<notification
@@ -1294,6 +1487,7 @@ Please make sure none are locked, and that you own all of them.
Unable to link because not all of the objects have the same owner.
Please make sure you own all of the selected objects.
+ <tag>fail</tag>
</notification>
<notification
@@ -1303,6 +1497,7 @@ Please make sure you own all of the selected objects.
No file extension for the file: &apos;[FILE]&apos;
Please make sure the file has a correct file extension.
+ <tag>fail</tag>
</notification>
<notification
@@ -1314,6 +1509,7 @@ Expected [VALIDS]
<usetemplate
name="okbutton"
yestext="OK"/>
+ <tag>fail</tag>
</notification>
<notification
@@ -1322,6 +1518,7 @@ Expected [VALIDS]
type="alertmodal">
Couldn&apos;t open uploaded sound file for reading:
[FILE]
+ <tag>fail</tag>
</notification>
<notification
@@ -1330,6 +1527,7 @@ Couldn&apos;t open uploaded sound file for reading:
type="alertmodal">
File does not appear to be a RIFF WAVE file:
[FILE]
+ <tag>fail</tag>
</notification>
<notification
@@ -1338,6 +1536,7 @@ File does not appear to be a RIFF WAVE file:
type="alertmodal">
File does not appear to be a PCM WAVE audio file:
[FILE]
+ <tag>fail</tag>
</notification>
<notification
@@ -1346,6 +1545,7 @@ File does not appear to be a PCM WAVE audio file:
type="alertmodal">
File has invalid number of channels (must be mono or stereo):
[FILE]
+ <tag>fail</tag>
</notification>
<notification
@@ -1354,6 +1554,7 @@ File has invalid number of channels (must be mono or stereo):
type="alertmodal">
File does not appear to be a supported sample rate (must be 44.1k):
[FILE]
+ <tag>fail</tag>
</notification>
<notification
@@ -1362,6 +1563,7 @@ File does not appear to be a supported sample rate (must be 44.1k):
type="alertmodal">
File does not appear to be a supported word size (must be 8 or 16 bit):
[FILE]
+ <tag>fail</tag>
</notification>
<notification
@@ -1370,6 +1572,7 @@ File does not appear to be a supported word size (must be 8 or 16 bit):
type="alertmodal">
Could not find &apos;data&apos; chunk in WAV header:
[FILE]
+ <tag>fail</tag>
</notification>
<notification
@@ -1378,6 +1581,7 @@ Could not find &apos;data&apos; chunk in WAV header:
type="alertmodal">
Wrong chunk size in WAV file:
[FILE]
+ <tag>fail</tag>
</notification>
<notification
@@ -1386,6 +1590,7 @@ Wrong chunk size in WAV file:
type="alertmodal">
Audio file is too long (10 second maximum):
[FILE]
+ <tag>fail</tag>
</notification>
<notification
@@ -1395,6 +1600,7 @@ Audio file is too long (10 second maximum):
Problem with file [FILE]:
[ERROR]
+ <tag>fail</tag>
</notification>
<notification
@@ -1402,6 +1608,7 @@ Problem with file [FILE]:
name="CannotOpenTemporarySoundFile"
type="alertmodal">
Couldn&apos;t open temporary compressed sound file for writing: [FILE]
+ <tag>fail</tag>
</notification>
<notification
@@ -1409,6 +1616,7 @@ Couldn&apos;t open temporary compressed sound file for writing: [FILE]
name="UnknownVorbisEncodeFailure"
type="alertmodal">
Unknown Vorbis encode failure on: [FILE]
+ <tag>fail</tag>
</notification>
<notification
@@ -1416,6 +1624,7 @@ Unknown Vorbis encode failure on: [FILE]
name="CannotEncodeFile"
type="alertmodal">
Unable to encode file: [FILE]
+ <tag>fail</tag>
</notification>
<notification
@@ -1424,6 +1633,7 @@ Unable to encode file: [FILE]
type="alertmodal">
We can't fill in your username and password. This may happen when you change network setup
+ <tag>fail</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
@@ -1434,6 +1644,7 @@ Unable to encode file: [FILE]
name="CorruptResourceFile"
type="alertmodal">
Corrupt resource file: [FILE]
+ <tag>fail</tag>
</notification>
<notification
@@ -1441,6 +1652,7 @@ Corrupt resource file: [FILE]
name="UnknownResourceFileVersion"
type="alertmodal">
Unknown Linden resource file version in file: [FILE]
+ <tag>fail</tag>
</notification>
<notification
@@ -1448,13 +1660,15 @@ Unknown Linden resource file version in file: [FILE]
name="UnableToCreateOutputFile"
type="alertmodal">
Unable to create output file: [FILE]
+ <tag>fail</tag>
</notification>
<notification
icon="alertmodal.tga"
name="DoNotSupportBulkAnimationUpload"
type="alertmodal">
-[APP_NAME] does not currently support bulk upload of animation files.
+[APP_NAME] does not currently support bulk upload of BVH format animation files.
+ <tag>fail</tag>
</notification>
<notification
@@ -1463,6 +1677,7 @@ Unable to create output file: [FILE]
type="alertmodal">
Unable to upload [FILE] due to the following reason: [REASON]
Please try again later.
+ <tag>fail</tag>
</notification>
<notification
@@ -1480,6 +1695,7 @@ You already have a landmark for this location.
<usetemplate
name="okbutton"
yestext="OK"/>
+ <tag>fail</tag>
</notification>
<notification
@@ -1487,6 +1703,7 @@ You already have a landmark for this location.
name="CannotCreateLandmarkNotOwner"
type="alertmodal">
You cannot create a landmark here because the owner of the land doesn&apos;t allow it.
+ <tag>fail</tag>
</notification>
<notification
@@ -1495,6 +1712,7 @@ You cannot create a landmark here because the owner of the land doesn&apos;t all
type="alertmodal">
Not able to perform &apos;recompilation&apos;.
Select an object with a script.
+ <tag>fail</tag>
</notification>
<notification
@@ -1504,6 +1722,7 @@ Select an object with a script.
Not able to perform &apos;recompilation&apos;.
Select objects with scripts that you have permission to modify.
+ <tag>fail</tag>
</notification>
<notification
@@ -1513,6 +1732,7 @@ Select objects with scripts that you have permission to modify.
Not able to perform &apos;reset&apos;.
Select objects with scripts.
+ <tag>fail</tag>
</notification>
<notification
@@ -1522,6 +1742,7 @@ Select objects with scripts.
Not able to perform &apos;reset&apos;.
Select objects with scripts that you have permission to modify.
+ <tag>fail</tag>
</notification>
<notification
@@ -1529,6 +1750,7 @@ Select objects with scripts that you have permission to modify.
name="CannotOpenScriptObjectNoMod"
type="alertmodal">
Unable to open script in object without modify permissions.
+ <tag>fail</tag>
</notification>
<notification
@@ -1538,6 +1760,7 @@ Select objects with scripts that you have permission to modify.
Not able to set any scripts to &apos;running&apos;.
Select objects with scripts.
+ <tag>fail</tag>
</notification>
<notification
@@ -1547,6 +1770,7 @@ Select objects with scripts.
Unable to set any scripts to &apos;not running&apos;.
Select objects with scripts.
+ <tag>fail</tag>
</notification>
<notification
@@ -1554,6 +1778,7 @@ Select objects with scripts.
name="NoFrontmostFloater"
type="alertmodal">
No frontmost floater to save.
+ <tag>fail</tag>
</notification>
<notification
@@ -1570,6 +1795,7 @@ Searched for: [FINALQUERY]
name="SeachFilteredOnShortWordsEmpty"
type="alertmodal">
Your search terms were too short so no search was performed.
+ <tag>fail</tag>
</notification>
<!-- Generic Teleport failure modes - strings will be inserted from
@@ -1580,6 +1806,7 @@ Your search terms were too short so no search was performed.
type="alertmodal">
Teleport failed.
[REASON]
+ <tag>fail</tag>
</notification>
<!-- Teleport failure modes not delivered via the generic mechanism
@@ -1592,6 +1819,7 @@ Teleport failed.
type="alertmodal">
Problem encountered processing your teleport request. You may need to log back in before you can teleport.
If you continue to get this message, please check the [SUPPORT_SITE].
+ <tag>fail</tag>
</notification>
<notification
icon="alertmodal.tga"
@@ -1599,59 +1827,69 @@ If you continue to get this message, please check the [SUPPORT_SITE].
type="alertmodal">
Problem encountered processing your region crossing. You may need to log back in before you can cross regions.
If you continue to get this message, please check the [SUPPORT_SITE].
+ <tag>fail</tag>
</notification>
<notification
icon="alertmodal.tga"
name="blocked_tport"
type="alertmodal">
Sorry, teleport is currently blocked. Try again in a moment. If you still cannot teleport, please log out and log back in to resolve the problem.
+ <tag>fail</tag>
</notification>
<notification
icon="alertmodal.tga"
name="nolandmark_tport"
type="alertmodal">
Sorry, but system was unable to locate landmark destination.
+ <tag>fail</tag>
</notification>
<notification
icon="alertmodal.tga"
name="timeout_tport"
type="alertmodal">
+ <tag>fail</tag>
Sorry, but system was unable to complete the teleport connection. Try again in a moment.
</notification>
<notification
icon="alertmodal.tga"
name="noaccess_tport"
type="alertmodal">
+ <tag>fail</tag>
Sorry, you do not have access to that teleport destination.
</notification>
<notification
icon="alertmodal.tga"
name="missing_attach_tport"
type="alertmodal">
+ <tag>fail</tag>
Your attachments have not arrived yet. Try waiting for a few more seconds or log out and back in again before attempting to teleport.
</notification>
<notification
icon="alertmodal.tga"
name="too_many_uploads_tport"
type="alertmodal">
+ <tag>fail</tag>
The asset queue in this region is currently clogged so your teleport request will not be able to succeed in a timely manner. Please try again in a few minutes or go to a less busy area.
</notification>
<notification
icon="alertmodal.tga"
name="expired_tport"
type="alertmodal">
+ <tag>fail</tag>
Sorry, but the system was unable to complete your teleport request in a timely fashion. Please try again in a few minutes.
</notification>
<notification
icon="alertmodal.tga"
name="expired_region_handoff"
type="alertmodal">
+ <tag>fail</tag>
Sorry, but the system was unable to complete your region crossing in a timely fashion. Please try again in a few minutes.
</notification>
<notification
icon="alertmodal.tga"
name="no_host"
type="alertmodal">
+ <tag>fail</tag>
Unable to find teleport destination. The destination may be temporarily unavailable or no longer exists. Please try again in a few minutes.
</notification>
<notification
@@ -1659,6 +1897,7 @@ Unable to find teleport destination. The destination may be temporarily unavaila
name="no_inventory_host"
type="alertmodal">
The inventory system is currently unavailable.
+ <tag>fail</tag>
</notification>
<notification
@@ -1667,6 +1906,7 @@ The inventory system is currently unavailable.
type="alertmodal">
Unable to set land owner:
No parcel selected.
+ <tag>fail</tag>
</notification>
<notification
@@ -1674,6 +1914,7 @@ No parcel selected.
name="CannotSetLandOwnerMultipleRegions"
type="alertmodal">
Unable to force land ownership because selection spans multiple regions. Please select a smaller area and try again.
+ <tag>fail</tag>
</notification>
<notification
@@ -1682,6 +1923,7 @@ Unable to force land ownership because selection spans multiple regions. Please
type="alertmodal">
This parcel is up for auction. Forcing ownership will cancel the auction and potentially make some Residents unhappy if bidding has begun.
Force ownership?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -1694,6 +1936,7 @@ Force ownership?
type="alertmodal">
Unable to contentify:
No parcel selected.
+ <tag>fail</tag>
</notification>
<notification
@@ -1702,6 +1945,7 @@ No parcel selected.
type="alertmodal">
Unable to contentify:
No region selected.
+ <tag>fail</tag>
</notification>
<notification
@@ -1710,6 +1954,7 @@ No region selected.
type="alertmodal">
Unable to abandon land:
No parcel selected.
+ <tag>fail</tag>
</notification>
<notification
@@ -1718,6 +1963,7 @@ No parcel selected.
type="alertmodal">
Unable to abandon land:
Cannot find region.
+ <tag>fail</tag>
</notification>
<notification
@@ -1726,6 +1972,7 @@ Cannot find region.
type="alertmodal">
Unable to buy land:
No parcel selected.
+ <tag>fail</tag>
</notification>
<notification
@@ -1734,6 +1981,7 @@ No parcel selected.
type="alertmodal">
Unable to buy land:
Cannot find the region this land is in.
+ <tag>fail</tag>
</notification>
<notification
@@ -1741,6 +1989,7 @@ Cannot find the region this land is in.
name="CannotCloseFloaterBuyLand"
type="alertmodal">
You cannot close the Buy Land window until [APP_NAME] estimates the price of this transaction.
+ <tag>fail</tag>
</notification>
<notification
@@ -1749,6 +1998,7 @@ You cannot close the Buy Land window until [APP_NAME] estimates the price of thi
type="alertmodal">
Unable to deed land:
No parcel selected.
+ <tag>fail</tag>
</notification>
<notification
@@ -1757,6 +2007,8 @@ No parcel selected.
type="alertmodal">
Unable to deed land:
No Group selected.
+ <tag>group</tag>
+ <tag>fail</tag>
</notification>
<notification
@@ -1765,6 +2017,7 @@ No Group selected.
type="alertmodal">
Unable to deed land:
Cannot find the region this land is in.
+ <tag>fail</tag>
</notification>
<notification
@@ -1775,6 +2028,7 @@ Unable to deed land:
Multiple parcels selected.
Try selecting a single parcel.
+ <tag>fail</tag>
</notification>
<notification
@@ -1785,6 +2039,7 @@ Unable to deed land:
Waiting for server to report ownership.
Please try again.
+ <tag>fail</tag>
</notification>
<notification
@@ -1793,6 +2048,7 @@ Please try again.
type="alertmodal">
Unable to deed land:
The region [REGION] does not allow transfer of land.
+ <tag>fail</tag>
</notification>
<notification
@@ -1803,6 +2059,7 @@ Unable to abandon land:
Waiting for server to update parcel information.
Try again in a few seconds.
+ <tag>fail</tag>
</notification>
<notification
@@ -1813,6 +2070,7 @@ Unable to abandon land:
You do not own all the parcels selected.
Please select a single parcel.
+ <tag>fail</tag>
</notification>
<notification
@@ -1822,6 +2080,7 @@ Please select a single parcel.
Unable to abandon land:
You don&apos;t have permission to release this parcel.
Parcels you own appear in green.
+ <tag>fail</tag>
</notification>
<notification
@@ -1830,6 +2089,7 @@ Parcels you own appear in green.
type="alertmodal">
Unable to abandon land:
Cannot find the region this land is in.
+ <tag>fail</tag>
</notification>
<notification
@@ -1838,6 +2098,7 @@ Cannot find the region this land is in.
type="alertmodal">
Unable to abandon land:
The region [REGION] does not allow transfer of land.
+ <tag>fail</tag>
</notification>
<notification
@@ -1848,6 +2109,7 @@ Unable to abandon land:
You must select an entire parcel to release it.
Select an entire parcel, or divide your parcel first.
+ <tag>fail</tag>
</notification>
<notification
@@ -1858,6 +2120,7 @@ You are about to release [AREA] m² of land.
Releasing this parcel will remove it from your land holdings, but will not grant any L$.
Release this land?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -1871,6 +2134,7 @@ Release this land?
Unable to divide land:
No parcels selected.
+ <tag>fail</tag>
</notification>
<notification
@@ -1881,6 +2145,7 @@ Unable to divide land:
You have an entire parcel selected.
Try selecting a part of the parcel.
+ <tag>fail</tag>
</notification>
<notification
@@ -1890,6 +2155,7 @@ Try selecting a part of the parcel.
Dividing this land will split this parcel into two and each parcel can have its own settings. Some settings will be reset to defaults after the operation.
Divide land?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -1902,6 +2168,7 @@ Divide land?
type="alertmodal">
Unable to divide land:
Cannot find the region this land is in.
+ <tag>fail</tag>
</notification>
<notification
@@ -1910,6 +2177,7 @@ Cannot find the region this land is in.
type="alertmodal">
Unable to join land:
Cannot find the region this land is in.
+ <tag>fail</tag>
</notification>
<notification
@@ -1918,6 +2186,7 @@ Cannot find the region this land is in.
type="alertmodal">
Unable to join land:
No parcels selected.
+ <tag>fail</tag>
</notification>
<notification
@@ -1928,6 +2197,7 @@ Unable to join land:
You only have one parcel selected.
Select land across both parcels.
+ <tag>fail</tag>
</notification>
<notification
@@ -1938,6 +2208,7 @@ Unable to join land:
You must select more than one parcel.
Select land across both parcels.
+ <tag>fail</tag>
</notification>
<notification
@@ -1948,6 +2219,7 @@ Joining this land will create one large parcel out of all parcels intersecting t
You will need to reset the name and options of the new parcel.
Join land?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -1959,6 +2231,7 @@ Join land?
name="ConfirmNotecardSave"
type="alertmodal">
This notecard needs to be saved before the item can be copied or viewed. Save notecard?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -1970,6 +2243,7 @@ This notecard needs to be saved before the item can be copied or viewed. Save no
name="ConfirmItemCopy"
type="alertmodal">
Copy this item to your inventory?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -1981,6 +2255,7 @@ Copy this item to your inventory?
name="ResolutionSwitchFail"
type="alertmodal">
Failed to switch resolution to [RESX] by [RESY]
+ <tag>fail</tag>
</notification>
<notification
@@ -1988,6 +2263,7 @@ Failed to switch resolution to [RESX] by [RESY]
name="ErrorUndefinedGrasses"
type="alertmodal">
Error: Undefined grasses: [SPECIES]
+ <tag>fail</tag>
</notification>
<notification
@@ -1995,6 +2271,7 @@ Error: Undefined grasses: [SPECIES]
name="ErrorUndefinedTrees"
type="alertmodal">
Error: Undefined trees: [SPECIES]
+ <tag>fail</tag>
</notification>
<notification
@@ -2002,6 +2279,7 @@ Error: Undefined trees: [SPECIES]
name="CannotSaveWearableOutOfSpace"
type="alertmodal">
Unable to save &apos;[NAME]&apos; to wearable file. You will need to free up some space on your computer and save the wearable again.
+ <tag>fail</tag>
</notification>
<notification
@@ -2010,6 +2288,7 @@ Unable to save &apos;[NAME]&apos; to wearable file. You will need to free up so
type="alertmodal">
Unable to save [NAME] to central asset store.
This is usually a temporary failure. Please customize and save the wearable again in a few minutes.
+ <tag>fail</tag>
</notification>
<notification
@@ -2030,6 +2309,8 @@ Darn. You have been logged out of [SECOND_LIFE]
type="alertmodal">
Unable to buy land for the group:
You do not have permission to buy land for your active group.
+ <tag>group</tag>
+ <tag>fail</tag>
</notification>
<notification
@@ -2037,9 +2318,11 @@ You do not have permission to buy land for your active group.
label="Add Friend"
name="AddFriendWithMessage"
type="alertmodal">
+ <tag>friendship</tag>
Friends can give permissions to track each other on the map and receive online status updates.
Offer friendship to [NAME]?
+ <tag>confirm</tag>
<form name="form">
<input name="message" type="text">
Would you be my friend?
@@ -2060,9 +2343,10 @@ Would you be my friend?
icon="alertmodal.tga"
label="Save Outfit"
name="SaveOutfitAs"
- type="alertmodal"
- unique="true">
+ type="alertmodal">
+ <unique/>
Save what I'm wearing as a new Outfit:
+ <tag>confirm</tag>
<form name="form">
<input name="message" type="text">
[DESC] (new)
@@ -2070,7 +2354,7 @@ Would you be my friend?
<button
default="true"
index="0"
- name="Offer"
+ name="OK"
text="OK"/>
<button
index="1"
@@ -2085,6 +2369,7 @@ Would you be my friend?
name="SaveWearableAs"
type="alertmodal">
Save item to my inventory as:
+ <tag>confirm</tag>
<form name="form">
<input name="message" type="text">
[DESC] (new)
@@ -2092,7 +2377,7 @@ Would you be my friend?
<button
default="true"
index="0"
- name="Offer"
+ name="OK"
text="OK"/>
<button
index="1"
@@ -2108,6 +2393,7 @@ Would you be my friend?
name="RenameOutfit"
type="alertmodal">
New outfit name:
+ <tag>confirm</tag>
<form name="form">
<input name="new_name" type="text" width="300">
[NAME]
@@ -2115,7 +2401,7 @@ Would you be my friend?
<button
default="true"
index="0"
- name="Offer"
+ name="OK"
text="OK"/>
<button
index="1"
@@ -2128,7 +2414,9 @@ Would you be my friend?
icon="alertmodal.tga"
name="RemoveFromFriends"
type="alertmodal">
-Do you want to remove [NAME] from your Friends List?
+ <tag>friendship</tag>
+Do you want to remove &lt;nolink&gt;[NAME]&lt;/nolink&gt; from your Friends List?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -2139,7 +2427,9 @@ Do you want to remove [NAME] from your Friends List?
icon="alertmodal.tga"
name="RemoveMultipleFromFriends"
type="alertmodal">
+ <tag>friendship</tag>
Do you want to remove multiple friends from your Friends list?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -2153,6 +2443,7 @@ Do you want to remove multiple friends from your Friends list?
Are you sure you want to delete all scripted objects owned by
** [AVATAR_NAME] **
on all others land in this sim?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -2166,6 +2457,7 @@ on all others land in this sim?
Are you sure you want to DELETE ALL scripted objects owned by
** [AVATAR_NAME] **
on ALL LAND in this sim?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -2179,6 +2471,7 @@ on ALL LAND in this sim?
Are you sure you want to DELETE ALL objects (scripted or not) owned by
** [AVATAR_NAME] **
on ALL LAND in this sim?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -2190,6 +2483,7 @@ on ALL LAND in this sim?
name="BlankClassifiedName"
type="alertmodal">
You must specify a name for your classified.
+ <tag>fail</tag>
</notification>
<notification
@@ -2199,6 +2493,7 @@ You must specify a name for your classified.
Price to pay for listing must be at least L$[MIN_PRICE].
Please enter a higher price.
+ <tag>fail</tag>
</notification>
<notification
@@ -2208,6 +2503,7 @@ Please enter a higher price.
At least one of the items you has link items that point to it. If you delete this item, its links will permanently stop working. It is strongly advised to delete the links first.
Are you sure you want to delete these items?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -2221,6 +2517,7 @@ Are you sure you want to delete these items?
At least one of the items you have selected is locked.
Are you sure you want to delete these items?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -2234,6 +2531,7 @@ Are you sure you want to delete these items?
At least one of the items you have selected is not copyable.
Are you sure you want to delete these items?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -2247,6 +2545,7 @@ Are you sure you want to delete these items?
You do not own least one of the items you have selected.
Are you sure you want to delete these items?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -2261,6 +2560,7 @@ At least one object is locked.
At least one object is not copyable.
Are you sure you want to delete these items?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -2275,6 +2575,7 @@ At least one object is locked.
You do not own least one object.
Are you sure you want to delete these items?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -2289,6 +2590,7 @@ At least one object is not copyable.
You do not own least one object.
Are you sure you want to delete these items?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -2304,6 +2606,7 @@ At least one object is not copyable.
You do not own least one object.
Are you sure you want to delete these items?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="cancel"
@@ -2317,6 +2620,7 @@ Are you sure you want to delete these items?
At least one object is locked.
Are you sure you want to take these items?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -2331,6 +2635,7 @@ You do not own all of the objects you are taking.
If you continue, next owner permissions will be applied and possibly restrict your ability to modify or copy them.
Are you sure you want to take these items?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -2347,6 +2652,7 @@ If you continue, next owner permissions will be applied and possibly restrict yo
However, you can take the current selection.
Are you sure you want to take these items?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -2360,6 +2666,7 @@ Are you sure you want to take these items?
Unable to buy land because selection spans multiple regions.
Please select a smaller area and try again.
+ <tag>fail</tag>
</notification>
<notification
@@ -2370,6 +2677,8 @@ By deeding this parcel, the group will be required to have and maintain sufficie
The purchase price of the land is not refunded to the owner. If a deeded parcel is sold, the sale price will be divided evenly among group members.
Deed this [AREA] m² of land to the group &apos;[GROUP_NAME]&apos;?
+ <tag>group</tag>
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -2385,6 +2694,8 @@ The deed will include a simultaneous land contribution to the group from &apos;[
The purchase price of the land is not refunded to the owner. If a deeded parcel is sold, the sale price will be divided evenly among group members.
Deed this [AREA] m² of land to the group &apos;[GROUP_NAME]&apos;?
+ <tag>group</tag>
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -2400,9 +2711,18 @@ Display settings have been set to safe levels because you have specified the -sa
<notification
icon="alertmodal.tga"
- name="DisplaySetToRecommended"
+ name="DisplaySetToRecommendedGPUChange"
+ type="alertmodal">
+Display settings have been set to recommended levels because your graphics card changed
+from &apos;[LAST_GPU]&apos;
+to &apos;[THIS_GPU]&apos;
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="DisplaySetToRecommendedFeatureChange"
type="alertmodal">
-Display settings have been set to recommended levels based on your system configuration.
+Display settings have been set to recommended levels because of a change to the rendering subsystem.
</notification>
<notification
@@ -2410,6 +2730,7 @@ Display settings have been set to recommended levels based on your system config
name="ErrorMessage"
type="alertmodal">
[ERROR_MESSAGE]
+ <tag>fail</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
@@ -2419,6 +2740,7 @@ Display settings have been set to recommended levels based on your system config
icon="alertmodal.tga"
name="AvatarMovedDesired"
type="alertmodal">
+ <tag>fail</tag>
Your desired location is not currently available.
You have been moved into a nearby region.
</notification>
@@ -2427,6 +2749,7 @@ You have been moved into a nearby region.
icon="alertmodal.tga"
name="AvatarMovedLast"
type="alertmodal">
+ <tag>fail</tag>
Your last location is not currently available.
You have been moved into a nearby region.
</notification>
@@ -2435,6 +2758,7 @@ You have been moved into a nearby region.
icon="alertmodal.tga"
name="AvatarMovedHome"
type="alertmodal">
+ <tag>fail</tag>
Your home location is not currently available.
You have been moved into a nearby region.
You may want to set a new home location.
@@ -2444,6 +2768,7 @@ You may want to set a new home location.
icon="alertmodal.tga"
name="ClothingLoading"
type="alertmodal">
+ <tag>fail</tag>
Your clothing is still downloading.
You can use [SECOND_LIFE] normally and other people will see you correctly.
<form name="form">
@@ -2461,6 +2786,7 @@ You can use [SECOND_LIFE] normally and other people will see you correctly.
If this is your first time using [SECOND_LIFE], you will need to create an account before you can log in.
Return to [http://join.secondlife.com secondlife.com] to create a new account?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Continue"
@@ -2471,6 +2797,7 @@ Return to [http://join.secondlife.com secondlife.com] to create a new account?
icon="alertmodal.tga"
name="LoginPacketNeverReceived"
type="alertmodal">
+ <tag>fail</tag>
We&apos;re having trouble connecting. There may be a problem with your Internet connection or the [SECOND_LIFE_GRID].
You can either check your Internet connection and try again in a few minutes, click Help to view the [SUPPORT_SITE], or click Teleport to attempt to teleport home.
@@ -2513,6 +2840,7 @@ Please choose the male or female avatar. You can change your mind later.
name="CantTeleportToGrid"
type="alertmodal">
Could not teleport to [SLURL] as it's on a different grid ([GRID]) than the current grid ([CURRENT_GRID]). Please close your viewer and try again.
+ <tag>fail</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
@@ -2533,6 +2861,7 @@ SHA1 Fingerprint: [MD5_DIGEST]
Key Usage: [KEYUSAGE]
Extended Key Usage: [EXTENDEDKEYUSAGE]
Subject Key Identifier: [SUBJECTKEYIDENTIFIER]
+ <tag>fail</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
@@ -2555,6 +2884,7 @@ Extended Key Usage: [EXTENDEDKEYUSAGE]
Subject Key Identifier: [SUBJECTKEYIDENTIFIER]
Would you like to trust this authority?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -2566,6 +2896,8 @@ Would you like to trust this authority?
name="NotEnoughCurrency"
type="alertmodal">
[NAME] L$ [PRICE] You don&apos;t have enough L$ to do that.
+ <tag>fail</tag>
+ <tag>funds</tag>
</notification>
<notification
@@ -2602,6 +2934,7 @@ This is really only useful for debugging.
name="BuyOneObjectOnly"
type="alertmodal">
Unable to buy more than one object at a time. Please select only one object and try again.
+ <tag>fail</tag>
</notification>
<notification
@@ -2610,6 +2943,7 @@ Unable to buy more than one object at a time. Please select only one object and
type="alertmodal">
Unable to copy the contents of more than one item at a time.
Please select only one object and try again.
+ <tag>fail</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -2621,6 +2955,7 @@ Please select only one object and try again.
name="KickUsersFromRegion"
type="alertmodal">
Teleport all Residents in this region home?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -2632,6 +2967,7 @@ Teleport all Residents in this region home?
name="EstateObjectReturn"
type="alertmodal">
Are you sure you want to return objects owned by [USER_NAME]?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -2646,6 +2982,7 @@ Couldn&apos;t set region textures:
Terrain texture [TEXTURE_NUM] has an invalid bit depth of [TEXTURE_BIT_DEPTH].
Replace texture [TEXTURE_NUM] with a 24-bit 512x512 or smaller image then click &quot;Apply&quot; again.
+ <tag>fail</tag>
</notification>
<notification
@@ -2670,6 +3007,7 @@ Upload started. It may take up to two minutes, depending on your connection spee
name="ConfirmBakeTerrain"
type="alertmodal">
Do you really want to bake the current terrain, make it the center for terrain raise/lower limits and the default for the &apos;Revert&apos; tool?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -2703,6 +3041,7 @@ Exceeds the [MAX_AGENTS] [LIST_TYPE] limit by [NUM_EXCESS].
name="MaxAllowedGroupsOnRegion"
type="alertmodal">
You can only have [MAX_GROUPS] Allowed Groups.
+ <tag>group</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -2760,6 +3099,7 @@ Finished download of raw terrain file to:
A new version of [APP_NAME] is available.
[MESSAGE]
You must download this update to use [APP_NAME].
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Quit"
@@ -2773,6 +3113,7 @@ You must download this update to use [APP_NAME].
An updated version of [APP_NAME] is available.
[MESSAGE]
This update is not required, but we suggest you install it to improve performance and stability.
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Continue"
@@ -2786,6 +3127,7 @@ This update is not required, but we suggest you install it to improve performanc
An updated version of [APP_NAME] is available.
[MESSAGE]
This update is not required, but we suggest you install it to improve performance and stability.
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Continue"
@@ -2799,6 +3141,7 @@ This update is not required, but we suggest you install it to improve performanc
A new version of [APP_NAME] is available.
[MESSAGE]
You must download this update to use [APP_NAME].
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Quit"
@@ -2812,6 +3155,7 @@ You must download this update to use [APP_NAME].
An updated version of [APP_NAME] is available.
[MESSAGE]
This update is not required, but we suggest you install it to improve performance and stability.
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Continue"
@@ -2825,6 +3169,7 @@ This update is not required, but we suggest you install it to improve performanc
An updated version of [APP_NAME] is available.
[MESSAGE]
This update is not required, but we suggest you install it to improve performance and stability.
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Continue"
@@ -2840,6 +3185,7 @@ A new version of [APP_NAME] is available.
You must download this update to use [APP_NAME].
Download to your Applications folder?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Quit"
@@ -2855,6 +3201,7 @@ An updated version of [APP_NAME] is available.
This update is not required, but we suggest you install it to improve performance and stability.
Download to your Applications folder?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Continue"
@@ -2870,6 +3217,7 @@ An updated version of [APP_NAME] is available.
This update is not required, but we suggest you install it to improve performance and stability.
Download to your Applications folder?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Continue"
@@ -2887,12 +3235,86 @@ http://secondlife.com/download.
name="okbutton"
yestext="OK"/>
</notification>
+
<notification
- icon="notifytip.tga"
- name="DownloadBackground"
- type="notifytip">
-An updated version of [APP_NAME] has been downloaded.
-It will be applied the next time you restart [APP_NAME]
+ icon="alertmodal.tga"
+ name="FailedRequiredUpdateInstall"
+ type="alertmodal">
+We were unable to install a required update.
+You will be unable to log in until [APP_NAME] has been updated.
+
+Please download and install the latest viewer from
+http://secondlife.com/download.
+ <tag>fail</tag>
+ <usetemplate
+ name="okbutton"
+ yestext="Quit"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="UpdaterServiceNotRunning"
+ type="alertmodal">
+There is a required update for your Second Life Installation.
+
+You may download this update from http://www.secondlife.com/downloads
+or you can install it now.
+ <tag>confirm</tag>
+ <usetemplate
+ name="okcancelbuttons"
+ notext="Quit Second Life"
+ yestext="Download and install now"/>
+ </notification>
+
+ <notification
+ icon="notify.tga"
+ name="DownloadBackgroundTip"
+ type="notify">
+We have downloaded an update to your [APP_NAME] installation.
+Version [VERSION] [[RELEASE_NOTES_FULL_URL] Information about this update]
+ <tag>confirm</tag>
+ <usetemplate
+ name="okcancelbuttons"
+ notext="Later..."
+ yestext="Install now and restart [APP_NAME]"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="DownloadBackgroundDialog"
+ type="alertmodal">
+We have downloaded an update to your [APP_NAME] installation.
+Version [VERSION] [[RELEASE_NOTES_FULL_URL] Information about this update]
+ <tag>confirm</tag>
+ <usetemplate
+ name="okcancelbuttons"
+ notext="Later..."
+ yestext="Install now and restart [APP_NAME]"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="RequiredUpdateDownloadedVerboseDialog"
+ type="alertmodal">
+We have downloaded a required software update.
+Version [VERSION]
+
+We must restart [APP_NAME] to install the update.
+ <tag>confirm</tag>
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="RequiredUpdateDownloadedDialog"
+ type="alertmodal">
+We must restart [APP_NAME] to install the update.
+ <tag>confirm</tag>
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
</notification>
<notification
@@ -2901,6 +3323,8 @@ It will be applied the next time you restart [APP_NAME]
type="alertmodal">
Deeding this object will cause the group to:
* Receive L$ paid into the object
+ <tag>group</tag>
+ <tag>confirm</tag>
<usetemplate
ignoretext="Confirm before I deed an object to a group"
name="okcancelignore"
@@ -2913,6 +3337,7 @@ Deeding this object will cause the group to:
name="WebLaunchExternalTarget"
type="alertmodal">
Do you want to open your Web browser to view this content?
+ <tag>confirm</tag>
<usetemplate
ignoretext="Launch my browser to view a web page"
name="okcancelignore"
@@ -2925,6 +3350,7 @@ Do you want to open your Web browser to view this content?
name="WebLaunchJoinNow"
type="alertmodal">
Go to your [http://secondlife.com/account/ Dashboard] to manage your account?
+ <tag>confirm</tag>
<usetemplate
ignoretext="Launch my browser to manage my account"
name="okcancelignore"
@@ -2937,6 +3363,7 @@ Go to your [http://secondlife.com/account/ Dashboard] to manage your account?
name="WebLaunchSecurityIssues"
type="alertmodal">
Visit the [SECOND_LIFE] Wiki for details of how to report a security issue.
+ <tag>confirm</tag>
<usetemplate
ignoretext="Launch my browser to learn how to report a Security Issue"
name="okcancelignore"
@@ -2949,6 +3376,7 @@ Visit the [SECOND_LIFE] Wiki for details of how to report a security issue.
name="WebLaunchQAWiki"
type="alertmodal">
Visit the [SECOND_LIFE] QA Wiki.
+ <tag>confirm</tag>
<usetemplate
ignoretext="Launch my browser to view the QA Wiki"
name="okcancelignore"
@@ -2961,6 +3389,7 @@ Visit the [SECOND_LIFE] QA Wiki.
name="WebLaunchPublicIssue"
type="alertmodal">
Visit the [SECOND_LIFE] Public Issue Tracker, where you can report bugs and other issues.
+ <tag>confirm</tag>
<usetemplate
ignoretext="Launch my browser to use the Public Issue Tracker"
name="okcancelignore"
@@ -2973,6 +3402,7 @@ Visit the [SECOND_LIFE] Public Issue Tracker, where you can report bugs and othe
name="WebLaunchSupportWiki"
type="alertmodal">
Go to the Official Linden Blog, for the latest news and information.
+ <tag>confirm</tag>
<usetemplate
ignoretext="Launch my browser to view the blog"
name="okcancelignore"
@@ -2985,6 +3415,7 @@ Go to the Official Linden Blog, for the latest news and information.
name="WebLaunchLSLGuide"
type="alertmodal">
Do you want to open the Scripting Guide for help with scripting?
+ <tag>confirm</tag>
<usetemplate
ignoretext="Launch my browser to view the Scripting Guide"
name="okcancelignore"
@@ -2997,6 +3428,7 @@ Do you want to open the Scripting Guide for help with scripting?
name="WebLaunchLSLWiki"
type="alertmodal">
Do you want to visit the LSL Portal for help with scripting?
+ <tag>confirm</tag>
<usetemplate
ignoretext="Launch my browser to view the LSL Portal"
name="okcancelignore"
@@ -3011,6 +3443,7 @@ Do you want to visit the LSL Portal for help with scripting?
Are you sure you want to return the selected objects to their owners? Transferable deeded objects will be returned to their previous owners.
*WARNING* No-transfer deeded objects will be deleted!
+ <tag>confirm</tag>
<usetemplate
ignoretext="Confirm before I return objects to their owners"
name="okcancelignore"
@@ -3022,8 +3455,10 @@ Are you sure you want to return the selected objects to their owners? Transferab
icon="alert.tga"
name="GroupLeaveConfirmMember"
type="alert">
-You are currently a member of the group [GROUP].
+You are currently a member of the group &lt;nolink&gt;[GROUP]&lt;/nolink&gt;.
Leave Group?
+ <tag>group</tag>
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -3035,6 +3470,7 @@ Leave Group?
name="ConfirmKick"
type="alert">
Do you REALLY want to kick all Residents off the grid?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -3046,6 +3482,7 @@ Do you REALLY want to kick all Residents off the grid?
name="MuteLinden"
type="alertmodal">
Sorry, you cannot block a Linden.
+ <tag>fail</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
@@ -3055,7 +3492,8 @@ Sorry, you cannot block a Linden.
icon="alertmodal.tga"
name="CannotStartAuctionAlreadyForSale"
type="alertmodal">
-You cannot start an auction on a parcel which is already set for sale. Disable the land sale if you are sure you want to start an auction.
+ You cannot start an auction on a parcel which is already set for sale. Disable the land sale if you are sure you want to start an auction.
+ <tag>fail</tag>
</notification>
<notification
@@ -3064,6 +3502,7 @@ You cannot start an auction on a parcel which is already set for sale. Disable
name="MuteByNameFailed"
type="alertmodal">
You already have blocked this name.
+ <tag>fail</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
@@ -3074,6 +3513,7 @@ You already have blocked this name.
name="RemoveItemWarn"
type="alert">
Though permitted, deleting contents may damage the object. Do you want to delete that item?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -3085,6 +3525,7 @@ Though permitted, deleting contents may damage the object. Do you want to delete
name="CantOfferCallingCard"
type="alert">
Cannot offer a calling card at this time. Please try again in a moment.
+ <tag>fail</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
@@ -3094,6 +3535,8 @@ Cannot offer a calling card at this time. Please try again in a moment.
icon="alert.tga"
name="CantOfferFriendship"
type="alert">
+ <tag>friendship</tag>
+ <tag>fail</tag>
Cannot offer friendship at this time. Please try again in a moment.
<usetemplate
name="okbutton"
@@ -3118,6 +3561,8 @@ Chat and instant messages will be hidden. Instant messages will get your Busy mo
type="alert">
You have reached your maximum number of groups. Please leave another group before joining this one, or decline the offer.
[NAME] has invited you to join a group as a member.
+ <tag>group</tag>
+ <tag>fail</tag>
<usetemplate
name="okcancelbuttons"
notext="Decline"
@@ -3129,6 +3574,8 @@ You have reached your maximum number of groups. Please leave another group befor
name="JoinedTooManyGroups"
type="alert">
You have reached your maximum number of groups. Please leave some group before joining or creating a new one.
+ <tag>group</tag>
+ <tag>fail</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
@@ -3138,7 +3585,9 @@ You have reached your maximum number of groups. Please leave some group before j
icon="alert.tga"
name="KickUser"
type="alert">
+ <tag>win</tag>
Kick this Resident with what message?
+ <tag>confirm</tag>
<form name="form">
<input name="message" type="text">
An administrator has logged you off.
@@ -3159,7 +3608,9 @@ An administrator has logged you off.
icon="alert.tga"
name="KickAllUsers"
type="alert">
+ <tag>win</tag>
Kick everyone currently on the grid with what message?
+ <tag>confirm</tag>
<form name="form">
<input name="message" type="text">
An administrator has logged you off.
@@ -3180,6 +3631,8 @@ An administrator has logged you off.
icon="alert.tga"
name="FreezeUser"
type="alert">
+ <tag>win</tag>
+ <tag>confirm</tag>
Freeze this Resident with what message?
<form name="form">
<input name="message" type="text">
@@ -3201,6 +3654,8 @@ You have been frozen. You cannot move or chat. An administrator will contact you
icon="alert.tga"
name="UnFreezeUser"
type="alert">
+ <tag>win</tag>
+ <tag>confirm</tag>
Unfreeze this Resident with what message?
<form name="form">
<input name="message" type="text">
@@ -3232,6 +3687,7 @@ Just like in real life, it takes a while for everyone to learn about a new name.
name="SetDisplayNameBlocked"
type="alert">
Sorry, you cannot change your display name. If you feel this is in error, please contact support.
+ <tag>fail</tag>
</notification>
<notification
@@ -3241,6 +3697,7 @@ Sorry, you cannot change your display name. If you feel this is in error, please
Sorry, that name is too long. Display names can have a maximum of [LENGTH] characters.
Please try a shorter name.
+ <tag>fail</tag>
</notification>
<notification
@@ -3248,6 +3705,7 @@ Please try a shorter name.
name="SetDisplayNameFailedGeneric"
type="alertmodal">
Sorry, we could not set your display name. Please try again later.
+ <tag>fail</tag>
</notification>
<notification
@@ -3255,6 +3713,7 @@ Please try a shorter name.
name="SetDisplayNameMismatch"
type="alertmodal">
The display names you entered do not match. Please re-enter.
+ <tag>fail</tag>
</notification>
<!-- *NOTE: This should never happen -->
@@ -3267,6 +3726,7 @@ Sorry, you have to wait longer before you can change your display name.
See http://wiki.secondlife.com/wiki/Setting_your_display_name
Please try again later.
+ <tag>fail</tag>
</notification>
<notification
@@ -3276,6 +3736,7 @@ Please try again later.
Sorry, we could not set your requested name because it contains a banned word.
Please try a different name.
+ <tag>fail</tag>
</notification>
<notification
@@ -3283,6 +3744,7 @@ Please try again later.
name="AgentDisplayNameSetInvalidUnicode"
type="alertmodal">
The display name you wish to set contains invalid characters.
+ <tag>fail</tag>
</notification>
<notification
@@ -3290,6 +3752,7 @@ Please try again later.
name="AgentDisplayNameSetOnlyPunctuation"
type="alertmodal">
Your display name must contain letters other than punctuation.
+ <tag>fail</tag>
</notification>
@@ -3305,6 +3768,7 @@ Please try again later.
name="OfferTeleport"
type="alertmodal">
Offer a teleport to your location with the following message?
+ <tag>confirm</tag>
<form name="form">
<input name="message" type="text">
Join me in [REGION]
@@ -3323,9 +3787,23 @@ Join me in [REGION]
<notification
icon="alertmodal.tga"
+ name="TooManyTeleportOffers"
+ type="alertmodal">
+You attempted to make [OFFERS] teleport offers
+which exceeds the limit of [LIMIT].
+ <tag>group</tag>
+ <tag>fail</tag>
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
name="OfferTeleportFromGod"
type="alertmodal">
God summon Resident to your location?
+ <tag>confirm</tag>
<form name="form">
<input name="message" type="text">
Join me in [REGION]
@@ -3347,6 +3825,7 @@ Join me in [REGION]
name="TeleportFromLandmark"
type="alertmodal">
Are you sure you want to teleport to &lt;nolink&gt;[LOCATION]&lt;/nolink&gt;?
+ <tag>confirm</tag>
<usetemplate
ignoretext="Confirm that I want to teleport to a landmark"
name="okcancelignore"
@@ -3358,7 +3837,8 @@ Are you sure you want to teleport to &lt;nolink&gt;[LOCATION]&lt;/nolink&gt;?
icon="alertmodal.tga"
name="TeleportToPick"
type="alertmodal">
-Teleport to [PICK]?
+ Teleport to [PICK]?
+ <tag>confirm</tag>
<usetemplate
ignoretext="Confirm that I want to teleport to a location in Picks"
name="okcancelignore"
@@ -3371,6 +3851,7 @@ Teleport to [PICK]?
name="TeleportToClassified"
type="alertmodal">
Teleport to [CLASSIFIED]?
+ <tag>confirm</tag>
<usetemplate
ignoretext="Confirm that I want to teleport to a location in Classifieds"
name="okcancelignore"
@@ -3383,6 +3864,7 @@ Teleport to [PICK]?
name="TeleportToHistoryEntry"
type="alertmodal">
Teleport to [HISTORY_ENTRY]?
+ <tag>confirm</tag>
<usetemplate
ignoretext="Confirm that I want to teleport to a history location"
name="okcancelignore"
@@ -3396,6 +3878,7 @@ Teleport to [HISTORY_ENTRY]?
name="MessageEstate"
type="alert">
Type a short announcement which will be sent to everyone currently in your estate.
+ <tag>confirm</tag>
<form name="form">
<input name="message" type="text"/>
<button
@@ -3420,6 +3903,7 @@ You are about to change a Linden owned estate (mainland, teen grid, orientation,
This is EXTREMELY DANGEROUS because it can fundamentally affect the Resident experience. On the mainland, it will change thousands of regions and make the spaceserver hiccup.
Proceed?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -3435,6 +3919,7 @@ You are about to change the access list for a Linden owned estate (mainland, tee
This is DANGEROUS and should only be done to invoke the hack allowing objects/L$ to be transfered in/out of a grid.
It will change thousands of regions and make the spaceserver hiccup.
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -3447,6 +3932,7 @@ It will change thousands of regions and make the spaceserver hiccup.
name="EstateAllowedAgentAdd"
type="alert">
Add to allowed list for this estate only or for [ALL_ESTATES]?
+ <tag>confirm</tag>
<usetemplate
canceltext="Cancel"
name="yesnocancelbuttons"
@@ -3460,6 +3946,7 @@ Add to allowed list for this estate only or for [ALL_ESTATES]?
name="EstateAllowedAgentRemove"
type="alert">
Remove from allowed list for this estate only or for [ALL_ESTATES]?
+ <tag>confirm</tag>
<usetemplate
canceltext="Cancel"
name="yesnocancelbuttons"
@@ -3473,6 +3960,8 @@ Remove from allowed list for this estate only or for [ALL_ESTATES]?
name="EstateAllowedGroupAdd"
type="alert">
Add to group allowed list for this estate only or for [ALL_ESTATES]?
+ <tag>group</tag>
+ <tag>confirm</tag>
<usetemplate
canceltext="Cancel"
name="yesnocancelbuttons"
@@ -3486,6 +3975,8 @@ Add to group allowed list for this estate only or for [ALL_ESTATES]?
name="EstateAllowedGroupRemove"
type="alert">
Remove from group allowed list for this estate only or [ALL_ESTATES]?
+ <tag>group</tag>
+ <tag>confirm</tag>
<usetemplate
canceltext="Cancel"
name="yesnocancelbuttons"
@@ -3499,6 +3990,7 @@ Remove from group allowed list for this estate only or [ALL_ESTATES]?
name="EstateBannedAgentAdd"
type="alert">
Deny access for this estate only or for [ALL_ESTATES]?
+ <tag>confirm</tag>
<usetemplate
canceltext="Cancel"
name="yesnocancelbuttons"
@@ -3512,6 +4004,7 @@ Deny access for this estate only or for [ALL_ESTATES]?
name="EstateBannedAgentRemove"
type="alert">
Remove this Resident from the ban list for access for this estate only or for [ALL_ESTATES]?
+ <tag>confirm</tag>
<usetemplate
canceltext="Cancel"
name="yesnocancelbuttons"
@@ -3525,6 +4018,7 @@ Remove this Resident from the ban list for access for this estate only or for [
name="EstateManagerAdd"
type="alert">
Add estate manager for this estate only or for [ALL_ESTATES]?
+ <tag>confirm</tag>
<usetemplate
canceltext="Cancel"
name="yesnocancelbuttons"
@@ -3538,6 +4032,7 @@ Add estate manager for this estate only or for [ALL_ESTATES]?
name="EstateManagerRemove"
type="alert">
Remove estate manager for this estate only or for [ALL_ESTATES]?
+ <tag>confirm</tag>
<usetemplate
canceltext="Cancel"
name="yesnocancelbuttons"
@@ -3551,6 +4046,7 @@ Remove estate manager for this estate only or for [ALL_ESTATES]?
name="EstateKickUser"
type="alert">
Kick [EVIL_USER] from this estate?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -3562,6 +4058,7 @@ Kick [EVIL_USER] from this estate?
name="EstateChangeCovenant"
type="alertmodal">
Are you sure you want to change the Estate Covenant?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -3572,6 +4069,7 @@ Are you sure you want to change the Estate Covenant?
icon="alertmodal.tga"
name="RegionEntryAccessBlocked"
type="alertmodal">
+ <tag>fail</tag>
You are not allowed in that Region due to your maturity Rating. This may be a result of a lack of information validating your age.
Please verify you have the latest Viewer installed, and go to the Knowledge Base for details on accessing areas with this maturity rating.
@@ -3584,6 +4082,8 @@ Please verify you have the latest Viewer installed, and go to the Knowledge Base
icon="alertmodal.tga"
name="RegionEntryAccessBlocked_KB"
type="alertmodal">
+ <tag>fail</tag>
+ <tag>confirm</tag>
You are not allowed in that region due to your maturity Rating.
Go to the Knowledge Base for more information about maturity Ratings?
@@ -3601,6 +4101,7 @@ Go to the Knowledge Base for more information about maturity Ratings?
icon="notifytip.tga"
name="RegionEntryAccessBlocked_Notify"
type="notifytip">
+ <tag>fail</tag>
You are not allowed in that region due to your maturity Rating.
</notification>
@@ -3608,6 +4109,8 @@ You are not allowed in that region due to your maturity Rating.
icon="alertmodal.tga"
name="RegionEntryAccessBlocked_Change"
type="alertmodal">
+ <tag>fail</tag>
+ <tag>confirm</tag>
You are not allowed in that Region due to your maturity Rating preference.
To enter the desired region, please change your maturity Rating preference. This will allow you to search for and access [REGIONMATURITY] content. To undo any changes, go to Me &gt; Preferences &gt; General.
@@ -3639,6 +4142,7 @@ Your maturity Rating preference is now [RATING].
You cannot claim this land due to your maturity Rating. This may be a result of a lack of information validating your age.
Please verify you have the latest Viewer installed, and go to the Knowledge Base for details on accessing areas with this maturity rating.
+ <tag>fail</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
@@ -3651,6 +4155,8 @@ Please verify you have the latest Viewer installed, and go to the Knowledge Base
You cannot claim this land due to your maturity Rating.
Go to the Knowledge Base for more information about maturity Ratings?
+ <tag>fail</tag>
+ <tag>confirm</tag>
<url option="0" name="url">
http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview
</url>
@@ -3666,6 +4172,7 @@ Go to the Knowledge Base for more information about maturity Ratings?
name="LandClaimAccessBlocked_Notify"
type="notifytip">
You cannot claim this land due to your maturity Rating.
+ <tag>fail</tag>
</notification>
<notification
@@ -3675,6 +4182,8 @@ You cannot claim this land due to your maturity Rating.
You cannot claim this land due to your maturity Rating preference.
You can click &apos;Change Preference&apos; to raise your maturity Rating preference now and allow you to enter. You will be able to search and access [REGIONMATURITY] content from now on. If you later want to change this setting back, go to Me &gt; Preferences &gt; General.
+ <tag>fail</tag>
+ <tag>confirm</tag>
<usetemplate
name="okcancelignore"
yestext="Change Preference"
@@ -3689,6 +4198,7 @@ You can click &apos;Change Preference&apos; to raise your maturity Rating prefer
You cannot buy this land due to your maturity Rating. This may be a result of a lack of information validating your age.
Please verify you have the latest Viewer installed, and go to the Knowledge Base for details on accessing areas with this maturity rating.
+ <tag>fail</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
@@ -3701,6 +4211,8 @@ Please verify you have the latest Viewer installed, and go to the Knowledge Base
You cannot buy this land due to your maturity Rating.
Go to the Knowledge Base for more information about maturity Ratings?
+ <tag>confirm</tag>
+ <tag>fail</tag>
<url option="0" name="url">
http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview
</url>
@@ -3716,6 +4228,7 @@ Go to the Knowledge Base for more information about maturity Ratings?
name="LandBuyAccessBlocked_Notify"
type="notifytip">
You cannot buy this land due to your maturity Rating.
+ <tag>fail</tag>
</notification>
<notification
@@ -3725,6 +4238,8 @@ You cannot buy this land due to your maturity Rating.
You cannot buy this land due to your maturity Rating preference.
You can click &apos;Change Preference&apos; to raise your maturity Rating preference now and allow you to enter. You will be able to search and access [REGIONMATURITY] content from now on. If you later want to change this setting back, go to Me &gt; Preferences &gt; General.
+ <tag>confirm</tag>
+ <tag>fail</tag>
<usetemplate
name="okcancelignore"
yestext="Change Preference"
@@ -3737,6 +4252,7 @@ You can click &apos;Change Preference&apos; to raise your maturity Rating prefer
name="TooManyPrimsSelected"
type="alertmodal">
There are too many prims selected. Please select [MAX_PRIM_COUNT] or fewer prims and try again
+ <tag>fail</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
@@ -3747,6 +4263,7 @@ There are too many prims selected. Please select [MAX_PRIM_COUNT] or fewer prim
name="ProblemImportingEstateCovenant"
type="alertmodal">
Problem importing estate covenant.
+ <tag>fail</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
@@ -3757,6 +4274,7 @@ Problem importing estate covenant.
name="ProblemAddingEstateManager"
type="alertmodal">
Problems adding a new estate manager. One or more estates may have a full manager list.
+ <tag>fail</tag>
</notification>
<notification
@@ -3764,6 +4282,7 @@ Problems adding a new estate manager. One or more estates may have a full manag
name="ProblemAddingEstateGeneric"
type="alertmodal">
Problems adding to this estate list. One or more estates may have a full list.
+ <tag>fail</tag>
</notification>
<notification
@@ -3774,6 +4293,7 @@ Unable to load notecard&apos;s asset at this time.
<usetemplate
name="okbutton"
yestext="OK"/>
+ <tag>fail</tag>
</notification>
<notification
@@ -3784,6 +4304,7 @@ Insufficient permissions to view notecard associated with asset ID requested.
<usetemplate
name="okbutton"
yestext="OK"/>
+ <tag>fail</tag>
</notification>
<notification
@@ -3791,6 +4312,7 @@ Insufficient permissions to view notecard associated with asset ID requested.
name="MissingNotecardAssetID"
type="alertmodal">
Asset ID for notecard is missing from database.
+ <tag>fail</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
@@ -3803,6 +4325,8 @@ Asset ID for notecard is missing from database.
Remember: Classified ad fees are non-refundable.
Publish this classified now for L$[AMOUNT]?
+ <tag>confirm</tag>
+ <tag>funds</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -3814,6 +4338,7 @@ Publish this classified now for L$[AMOUNT]?
name="SetClassifiedMature"
type="alertmodal">
Does this classified contain Moderate content?
+ <tag>confirm</tag>
<usetemplate
canceltext="Cancel"
name="yesnocancelbuttons"
@@ -3826,6 +4351,8 @@ Does this classified contain Moderate content?
name="SetGroupMature"
type="alertmodal">
Does this group contain Moderate content?
+ <tag>group</tag>
+ <tag>confirm</tag>
<usetemplate
canceltext="Cancel"
name="yesnocancelbuttons"
@@ -3839,6 +4366,7 @@ Does this group contain Moderate content?
name="ConfirmRestart"
type="alert">
Do you really want to restart this region in 2 minutes?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -3851,6 +4379,7 @@ Do you really want to restart this region in 2 minutes?
name="MessageRegion"
type="alert">
Type a short announcement which will be sent to everyone in this region.
+ <tag>confirm</tag>
<form name="form">
<input name="message" type="text"/>
<button
@@ -3882,6 +4411,8 @@ To enter Adult regions, Residents must be Account Verified, either by age-verifi
name="VoiceVersionMismatch"
type="alertmodal">
This version of [APP_NAME] is not compatible with the Voice Chat feature in this region. In order for Voice Chat to function correctly you will need to update [APP_NAME].
+ <tag>fail</tag>
+ <tag>voice</tag>
</notification>
<notification
@@ -3891,6 +4422,7 @@ This version of [APP_NAME] is not compatible with the Voice Chat feature in this
type="alertmodal">
Cannot buy objects from different owners at the same time.
Please select only one object and try again.
+ <tag>fail</tag>
</notification>
<notification
@@ -3900,6 +4432,7 @@ Please select only one object and try again.
type="alertmodal">
Unable to buy the contents of more than one object at a time.
Please select only one object and try again.
+ <tag>fail</tag>
</notification>
<notification
@@ -3909,6 +4442,7 @@ Please select only one object and try again.
type="alertmodal">
Cannot buy objects from different owners at the same time.
Please select only one object and try again.
+ <tag>fail</tag>
</notification>
<notification
@@ -3921,6 +4455,8 @@ You will be able to:
Modify: [MODIFYPERM]
Copy: [COPYPERM]
Resell or Give Away: [RESELLPERM]
+ <tag>confirm</tag>
+ <tag>funds</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -3937,6 +4473,8 @@ You will be able to:
Modify: [MODIFYPERM]
Copy: [COPYPERM]
Resell or Give Away: [RESELLPERM]
+ <tag>confirm</tag>
+ <tag>funds</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -3953,6 +4491,8 @@ You will be able to:
Modify: [MODIFYPERM]
Copy: [COPYPERM]
Resell or Give Away: [RESELLPERM]
+ <tag>confirm</tag>
+ <tag>funds</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -3969,6 +4509,8 @@ You will be able to:
Modify: [MODIFYPERM]
Copy: [COPYPERM]
Resell or Give Away: [RESELLPERM]
+ <tag>confirm</tag>
+ <tag>funds</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -3981,6 +4523,8 @@ You will be able to:
type="alertmodal">
Buy contents from [OWNER] for L$[PRICE]?
They will be copied to your inventory.
+ <tag>confirm</tag>
+ <tag>funds</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -3993,6 +4537,8 @@ They will be copied to your inventory.
type="alertmodal">
Buy contents for L$[PRICE]?
They will be copied to your inventory.
+ <tag>confirm</tag>
+ <tag>funds</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -4007,6 +4553,8 @@ This transaction will:
[ACTION]
Are you sure you want to proceed with this purchase?
+ <tag>confirm</tag>
+ <tag>funds</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -4022,6 +4570,8 @@ This transaction will:
Are you sure you want to proceed with this purchase?
Please re-enter your password and click OK.
+ <tag>funds</tag>
+ <tag>confirm</tag>
<form name="form">
<input
name="message"
@@ -4057,6 +4607,7 @@ You have selected &apos;no copy&apos; inventory items.
These items will be moved to your inventory, not copied.
Move the inventory item(s)?
+ <tag>confirm</tag>
<usetemplate
ignoretext="Warn me before I move &apos;no-copy&apos; items from an object"
name="okcancelignore"
@@ -4071,7 +4622,8 @@ Move the inventory item(s)?
You have selected &apos;no copy&apos; inventory items. These items will be moved to your inventory, not copied.
Because this object is scripted, moving these items to your inventory may cause the script to malfunction.
-Move the inventory item(s)?
+Move the inventory item(s)?
+ <tag>confirm</tag>
<usetemplate
ignoretext="Warn me before I move &apos;no-copy&apos; items which might break a scripted object"
name="okcancelignore"
@@ -4095,6 +4647,7 @@ Warning: The &apos;Pay object&apos; click action has been set, but it will only
name="OpenObjectCannotCopy"
type="alertmodal">
There are no items in this object that you are allowed to copy.
+ <tag>fail</tag>
</notification>
<notification
@@ -4102,6 +4655,7 @@ There are no items in this object that you are allowed to copy.
name="WebLaunchAccountHistory"
type="alertmodal">
Go to your [http://secondlife.com/account/ Dashboard] to see your account history?
+ <tag>confirm</tag>
<usetemplate
ignoretext="Launch my browser to see my account history"
name="okcancelignore"
@@ -4112,9 +4666,10 @@ Go to your [http://secondlife.com/account/ Dashboard] to see your account histor
<notification
icon="alertmodal.tga"
name="ConfirmQuit"
- type="alertmodal"
- unique="true">
+ type="alertmodal">
+ <unique/>
Are you sure you want to quit?
+ <tag>confirm</tag>
<usetemplate
ignoretext="Confirm before I quit"
name="okcancelignore"
@@ -4124,10 +4679,39 @@ Are you sure you want to quit?
<notification
icon="alertmodal.tga"
+ name="ConfirmRestoreToybox"
+ type="alertmodal">
+ <unique/>
+This action will restore your default buttons and toolbars.
+
+You cannot undo this action.
+ <usetemplate
+ name="okcancelbuttons"
+ notext="Cancel"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="ConfirmClearAllToybox"
+ type="alertmodal">
+ <unique/>
+This action will return all buttons to the toolbox and your toolbars will be empty.
+
+You cannot undo this action.
+ <usetemplate
+ name="okcancelbuttons"
+ notext="Cancel"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
name="DeleteItems"
- type="alertmodal"
- unique="true">
+ type="alertmodal">
+ <unique/>
[QUESTION]
+ <tag>confirm</tag>
<usetemplate
ignoretext="Confirm before deleting items"
name="okcancelignore"
@@ -4138,8 +4722,9 @@ Are you sure you want to quit?
<notification
icon="alertmodal.tga"
name="HelpReportAbuseEmailLL"
- type="alert"
- unique="true">
+ type="alert">
+ <unique/>
+
Use this tool to report violations of the [http://secondlife.com/corporate/tos.php Terms of Service] and [http://secondlife.com/corporate/cs.php Community Standards].
All reported abuses are investigated and resolved.
@@ -4151,6 +4736,7 @@ All reported abuses are investigated and resolved.
type="alertmodal">
Please select a category for this abuse report.
Selecting a category helps us file and process abuse reports.
+ <tag>fail</tag>
</notification>
<notification
@@ -4159,6 +4745,7 @@ Selecting a category helps us file and process abuse reports.
type="alertmodal">
Please enter the name of the abuser.
Entering an accurate value helps us file and process abuse reports.
+ <tag>fail</tag>
</notification>
<notification
@@ -4167,6 +4754,7 @@ Entering an accurate value helps us file and process abuse reports.
type="alertmodal">
Please enter the location where the abuse took place.
Entering an accurate value helps us file and process abuse reports.
+ <tag>fail</tag>
</notification>
<notification
@@ -4175,6 +4763,7 @@ Entering an accurate value helps us file and process abuse reports.
type="alertmodal">
Please enter a summary of the abuse that took place.
Entering an accurate summary helps us file and process abuse reports.
+ <tag>fail</tag>
</notification>
<notification
@@ -4184,6 +4773,7 @@ Entering an accurate summary helps us file and process abuse reports.
Please enter a detailed description of the abuse that took place.
Be as specific as you can, including names and the details of the incident you are reporting.
Entering an accurate description helps us file and process abuse reports.
+ <tag>fail</tag>
</notification>
<notification
@@ -4211,6 +4801,7 @@ Linden Lab
type="alertmodal">
The following required components are missing from [FLOATER]:
[COMPONENTS]
+ <tag>fail</tag>
</notification>
<notification
@@ -4220,6 +4811,7 @@ The following required components are missing from [FLOATER]:
type="alert">
There is already an object attached to this point on your body.
Do you want to replace it with the selected object?
+ <tag>confirm</tag>
<form name="form">
<ignore name="ignore"
save_option="true"
@@ -4246,6 +4838,7 @@ Do you want to replace it with the selected object?
You are in Busy Mode, which means you will not receive any items offered in exchange for this payment.
Would you like to leave Busy Mode before completing this transaction?
+ <tag>confirm</tag>
<form name="form">
<ignore name="ignore"
save_option="true"
@@ -4269,6 +4862,7 @@ Would you like to leave Busy Mode before completing this transaction?
name="ConfirmDeleteProtectedCategory"
type="alertmodal">
The folder &apos;[FOLDERNAME]&apos; is a system folder. Deleting system folders can cause instability. Are you sure you want to delete it?
+ <tag>confirm</tag>
<usetemplate
ignoretext="Confirm before I delete a system folder"
name="okcancelignore"
@@ -4281,6 +4875,7 @@ The folder &apos;[FOLDERNAME]&apos; is a system folder. Deleting system folders
name="ConfirmEmptyTrash"
type="alertmodal">
Are you sure you want to permanently delete the contents of your Trash?
+ <tag>confirm</tag>
<usetemplate
ignoretext="Confirm before I empty the inventory Trash folder"
name="okcancelignore"
@@ -4293,6 +4888,19 @@ Are you sure you want to permanently delete the contents of your Trash?
name="ConfirmClearBrowserCache"
type="alertmodal">
Are you sure you want to delete your travel, web, and search history?
+ <tag>confirm</tag>
+ <usetemplate
+ name="okcancelbuttons"
+ notext="Cancel"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="ConfirmClearCache"
+ type="alertmodal">
+Are you sure you want to clear your viewer cache?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -4304,6 +4912,7 @@ Are you sure you want to delete your travel, web, and search history?
name="ConfirmClearCookies"
type="alertmodal">
Are you sure you want to clear your cookies?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -4315,6 +4924,7 @@ Are you sure you want to clear your cookies?
name="ConfirmClearMediaUrlList"
type="alertmodal">
Are you sure you want to clear your list of saved URLs?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -4326,6 +4936,7 @@ Are you sure you want to clear your list of saved URLs?
name="ConfirmEmptyLostAndFound"
type="alertmodal">
Are you sure you want to permanently delete the contents of your Lost And Found?
+ <tag>confirm</tag>
<usetemplate
ignoretext="Confirm before I empty the inventory Lost And Found folder"
name="okcancelignore"
@@ -4352,17 +4963,7 @@ Link to this from a web page to give others easy access to this location, or try
name="WLSavePresetAlert"
type="alertmodal">
Do you wish to overwrite the saved preset?
- <usetemplate
- name="okcancelbuttons"
- notext="No"
- yestext="Yes"/>
- </notification>
-
- <notification
- icon="alertmodal.tga"
- name="WLDeletePresetAlert"
- type="alertmodal">
-Do you wish to delete [SKY]?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="No"
@@ -4374,6 +4975,7 @@ Do you wish to delete [SKY]?
name="WLNoEditDefault"
type="alertmodal">
You cannot edit or delete a default preset.
+ <tag>fail</tag>
</notification>
<notification
@@ -4381,80 +4983,58 @@ You cannot edit or delete a default preset.
name="WLMissingSky"
type="alertmodal">
This day cycle file references a missing sky file: [SKY].
+ <tag>fail</tag>
</notification>
<notification
icon="alertmodal.tga"
- name="PPSaveEffectAlert"
+ name="WLRegionApplyFail"
type="alertmodal">
-PostProcess Effect exists. Do you still wish overwrite it?
- <usetemplate
- name="okcancelbuttons"
- notext="No"
- yestext="Yes"/>
- </notification>
-
- <notification
- icon="alert.tga"
- name="NewSkyPreset"
- type="alert">
-Give me a name for the new sky.
- <form name="form">
- <input name="message" type="text">
-New Preset
- </input>
- <button
- default="true"
- index="0"
- name="OK"
- text="OK"/>
- <button
- index="1"
- name="Cancel"
- text="Cancel"/>
- </form>
+Sorry, the settings couldn't be applied to the region. Leaving the region and then returning may help rectify the problem. The reason given was: [FAIL_REASON]
</notification>
<notification
+ functor="GenericAcknowledge"
icon="alertmodal.tga"
- name="ExistsSkyPresetAlert"
+ name="EnvCannotDeleteLastDayCycleKey"
type="alertmodal">
-Preset already exists!
+Unable to delete the last key in this day cycle because you cannot have an empty day cycle. You should modify the last remaining key instead of attempting to delete it and then to create a new one.
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
</notification>
<notification
- icon="alert.tga"
- name="NewWaterPreset"
- type="alert">
-Give me a name for the new water preset.
- <form name="form">
- <input name="message" type="text">
-New Preset
- </input>
- <button
- default="true"
- index="0"
- name="OK"
- text="OK"/>
- <button
- index="1"
- name="Cancel"
- text="Cancel"/>
- </form>
+ functor="GenericAcknowledge"
+ icon="alertmodal.tga"
+ name="DayCycleTooManyKeyframes"
+ type="alertmodal">
+You cannot add any more keyframes to this day cycle. The maximum number of keyframes for day cycles of [SCOPE] scope is [MAX].
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
</notification>
<notification
+ functor="GenericAcknowledge"
icon="alertmodal.tga"
- name="ExistsWaterPresetAlert"
+ name="EnvUpdateRate"
type="alertmodal">
-Preset already exists!
+ You may only update region environmental settings every [WAIT] seconds. Wait at least that long and then try again.
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
</notification>
<notification
icon="alertmodal.tga"
- name="WaterNoEditDefault"
+ name="PPSaveEffectAlert"
type="alertmodal">
-You cannot edit or delete a default preset.
+PostProcess Effect exists. Do you still wish overwrite it?
+ <usetemplate
+ name="okcancelbuttons"
+ notext="No"
+ yestext="Yes"/>
</notification>
<notification
@@ -4463,6 +5043,7 @@ You cannot edit or delete a default preset.
type="alertmodal">
Unable to start a new chat session with [RECIPIENT].
[REASON]
+ <tag>fail</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
@@ -4474,6 +5055,7 @@ Unable to start a new chat session with [RECIPIENT].
type="alertmodal">
[EVENT]
[REASON]
+ <tag>fail</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
@@ -4495,6 +5077,7 @@ Your chat session with [NAME] must close.
name="Cannot_Purchase_an_Attachment"
type="alertmodal">
You can&apos;t buy an object while it is attached.
+ <tag>fail</tag>
</notification>
<notification
@@ -4513,6 +5096,7 @@ Granting this request gives a script ongoing permission to take Linden dollars (
name="AutoWearNewClothing"
type="alertmodal">
Would you like to automatically wear the clothing you are about to create?
+ <tag>confirm</tag>
<usetemplate
ignoretext="Wear the clothing I create while editing My Appearance"
name="okcancelignore"
@@ -4524,18 +5108,20 @@ Would you like to automatically wear the clothing you are about to create?
icon="alertmodal.tga"
name="NotAgeVerified"
type="alertmodal">
-You must be age-verified to visit this area. Do you want to go to the [SECOND_LIFE] website and verify your age?
+ <tag>fail</tag>
+To access adult content and areas in Second Life you must be at least 18 years old. Please visit our age verification page to confirm you are over 18.
+Note this will launch your web browser.
[_URL]
+ <tag>confirm</tag>
<url option="0" name="url">
-
- https://secondlife.com/account/verification.php
+ https://secondlife.com/my/account/verification.php
</url>
<usetemplate
ignoretext="I have not verified my age"
name="okcancelignore"
- notext="No"
- yestext="Yes"/>
+ notext="Cancel"
+ yestext="Go to Age Verification"/>
</notification>
<notification
@@ -4545,6 +5131,7 @@ You must be age-verified to visit this area. Do you want to go to the [SECOND_L
You must have payment information on file to visit this area. Do you want to go to the [SECOND_LIFE] website and set this up?
[_URL]
+ <tag>confirm</tag>
<url option="0" name="url">
https://secondlife.com/account/
@@ -4561,6 +5148,7 @@ You must have payment information on file to visit this area. Do you want to go
name="MissingString"
type="alertmodal">
The string [STRING_NAME] is missing from strings.xml
+ <tag>fail</tag>
</notification>
<notification
@@ -4611,26 +5199,30 @@ Replaced missing clothing/body part with default.
persist="true"
type="groupnotify">
Topic: [SUBJECT], Message: [MESSAGE]
+ <tag>group</tag>
</notification>
<notification
icon="notifytip.tga"
name="FriendOnline"
type="notifytip">
-[NAME] is Online
+ <tag>friendship</tag>
+&lt;nolink&gt;[NAME]&lt;/nolink&gt; is Online
</notification>
<notification
icon="notifytip.tga"
name="FriendOffline"
type="notifytip">
-[NAME] is Offline
+ <tag>friendship</tag>
+&lt;nolink&gt;[NAME]&lt;/nolink&gt; is Offline
</notification>
<notification
icon="notifytip.tga"
name="AddSelfFriend"
type="notifytip">
+ <tag>friendship</tag>
Although you&apos;re very nice, you can&apos;t add yourself as a friend.
</notification>
@@ -4648,6 +5240,7 @@ Uploading in-world and web site snapshots...
persist="true"
type="notify">
You paid L$[AMOUNT] to upload.
+<tag>funds</tag>
</notification>
<notification
@@ -4676,6 +5269,7 @@ Terrain.raw downloaded
name="GestureMissing"
type="notifytip">
Hmm. Gesture [NAME] is missing from the database.
+ <tag>fail</tag>
</notification>
<notification
@@ -4683,6 +5277,7 @@ Hmm. Gesture [NAME] is missing from the database.
name="UnableToLoadGesture"
type="notifytip">
Unable to load gesture [NAME].
+ <tag>fail</tag>
</notification>
<notification
@@ -4690,6 +5285,7 @@ Unable to load gesture [NAME].
name="LandmarkMissing"
type="notifytip">
Landmark is missing from database.
+ <tag>fail</tag>
</notification>
<notification
@@ -4697,6 +5293,7 @@ Landmark is missing from database.
name="UnableToLoadLandmark"
type="notifytip">
Unable to load landmark. Please try again.
+ <tag>fail</tag>
</notification>
<notification
@@ -4712,6 +5309,7 @@ This might affect your password.
name="NotecardMissing"
type="notifytip">
Notecard is missing from database.
+ <tag>fail</tag>
</notification>
<notification
@@ -4719,6 +5317,7 @@ Notecard is missing from database.
name="NotecardNoPermissions"
type="notifytip">
You don&apos;t have permission to view this notecard.
+ <tag>fail</tag>
</notification>
<notification
@@ -4726,6 +5325,21 @@ You don&apos;t have permission to view this notecard.
name="RezItemNoPermissions"
type="notifytip">
Insufficient permissions to rez object.
+ <tag>fail</tag>
+ </notification>
+
+ <notification
+ icon="notifytip.tga"
+ name="IMAcrossParentEstates"
+ type="notifytip">
+Unable to send IM across parent estates.
+ </notification>
+
+ <notification
+ icon="notifytip.tga"
+ name="TransferInventoryAcrossParentEstates"
+ type="notifytip">
+Unable to transfer inventory across parent estates.
</notification>
<notification
@@ -4734,6 +5348,7 @@ Insufficient permissions to rez object.
type="notifytip">
Unable to load notecard.
Please try again.
+ <tag>fail</tag>
</notification>
<notification
@@ -4741,6 +5356,7 @@ Please try again.
name="ScriptMissing"
type="notifytip">
Script is missing from database.
+ <tag>fail</tag>
</notification>
<notification
@@ -4748,6 +5364,7 @@ Script is missing from database.
name="ScriptNoPermissions"
type="notifytip">
Insufficient permissions to view script.
+ <tag>fail</tag>
</notification>
<notification
@@ -4755,6 +5372,7 @@ Insufficient permissions to view script.
name="UnableToLoadScript"
type="notifytip">
Unable to load script. Please try again.
+ <tag>fail</tag>
</notification>
<notification
@@ -4762,6 +5380,7 @@ Unable to load script. Please try again.
name="IncompleteInventory"
type="notifytip">
The complete contents you are offering are not yet locally available. Please try offering those items again in a minute.
+ <tag>fail</tag>
</notification>
<notification
@@ -4769,6 +5388,7 @@ The complete contents you are offering are not yet locally available. Please try
name="CannotModifyProtectedCategories"
type="notifytip">
You cannot modify protected categories.
+ <tag>fail</tag>
</notification>
<notification
@@ -4776,6 +5396,7 @@ You cannot modify protected categories.
name="CannotRemoveProtectedCategories"
type="notifytip">
You cannot remove protected categories.
+ <tag>fail</tag>
</notification>
<notification
@@ -4784,6 +5405,7 @@ You cannot remove protected categories.
type="notifytip">
Unable to buy while downloading object data.
Please try again.
+ <tag>fail</tag>
</notification>
<notification
@@ -4792,6 +5414,7 @@ Please try again.
type="notifytip">
Unable to link while downloading object data.
Please try again.
+ <tag>fail</tag>
</notification>
<notification
@@ -4800,6 +5423,7 @@ Please try again.
type="notifytip">
You can only buy objects from one owner at a time.
Please select a single object.
+ <tag>fail</tag>
</notification>
<notification
@@ -4807,6 +5431,7 @@ Please select a single object.
name="ObjectNotForSale"
type="notifytip">
This object is not for sale.
+ <tag>fail</tag>
</notification>
<notification
@@ -4828,6 +5453,7 @@ Now leaving god mode, level [LEVEL]
name="CopyFailed"
type="notifytip">
You don&apos;t have permission to copy this.
+ <tag>fail</tag>
</notification>
<notification
@@ -4866,21 +5492,23 @@ Your calling card was declined.
</notification>
<notification
- icon="notifytip.tga"
- name="TeleportToLandmark"
- type="notifytip">
-You can teleport to locations like &apos;[NAME]&apos; by opening the Places panel on the right side of your screen, and then select the Landmarks tab.
-Click on any landmark to select it, then click &apos;Teleport&apos; at the bottom of the panel.
-(You can also double-click on the landmark, or right-click it and choose &apos;Teleport&apos;.)
+ icon="notifytip.tga"
+ name="TeleportToLandmark"
+ type="notifytip">
+ To teleport to locations like &apos;[NAME]&apos;, click on the &quot;Places&quot; button,
+ then select the Landmarks tab in the window that opens. Click on any
+ landmark to select it, then click &apos;Teleport&apos; at the bottom of the window.
+ (You can also double-click on the landmark, or right-click it and
+ choose &apos;Teleport&apos;.)
</notification>
<notification
icon="notifytip.tga"
name="TeleportToPerson"
type="notifytip">
-You can contact Residents like &apos;[NAME]&apos; by opening the People panel on the right side of your screen.
-Select the Resident from the list, then click &apos;IM&apos; at the bottom of the panel.
-(You can also double-click on their name in the list, or right-click and choose &apos;IM&apos;).
+ To contact Residents like &apos;[NAME]&apos;, click on the &quot;People&quot; button , select a Resident from the window that opens, then click &apos;IM&apos; at the
+ bottom of the window.
+ (You can also double-click on their name in the list, or right-click and choose &apos;IM&apos;).
</notification>
<notification
@@ -4889,6 +5517,7 @@ Select the Resident from the list, then click &apos;IM&apos; at the bottom of th
type="notifytip">
Can&apos;t select land across server boundaries.
Try selecting a smaller piece of land.
+ <tag>fail</tag>
</notification>
<notification
@@ -4896,6 +5525,7 @@ Try selecting a smaller piece of land.
name="SearchWordBanned"
type="notifytip">
Some terms in your search query were excluded due to content restrictions as clarified in the Community Standards.
+ <tag>fail</tag>
</notification>
<notification
@@ -4903,47 +5533,41 @@ Some terms in your search query were excluded due to content restrictions as cla
name="NoContentToSearch"
type="notifytip">
Please select at least one type of content to search (General, Moderate, or Adult).
+ <tag>fail</tag>
</notification>
<notification
icon="notify.tga"
- name="GroupVote"
+ name="SystemMessage"
+ persist="true"
type="notify">
-[NAME] has proposed to vote on:
[MESSAGE]
- <form name="form">
- <button
- index="0"
- name="VoteNow"
- text="Vote Now"/>
- <button
- index="1"
- name="Later"
- text="Later"/>
- </form>
</notification>
<notification
icon="notify.tga"
- name="SystemMessage"
+ name="PaymentReceived"
persist="true"
type="notify">
+ <tag>funds</tag>
[MESSAGE]
</notification>
<notification
icon="notify.tga"
- name="PaymentReceived"
+ name="PaymentSent"
persist="true"
type="notify">
+ <tag>funds</tag>
[MESSAGE]
</notification>
<notification
icon="notify.tga"
- name="PaymentSent"
+ name="PaymentFailure"
persist="true"
type="notify">
+ <tag>funds</tag>
[MESSAGE]
</notification>
@@ -5001,15 +5625,18 @@ Deactivated gestures with same trigger:
type="notify">
Apple&apos;s QuickTime software does not appear to be installed on your system.
If you want to view streaming media on parcels that support it you should go to the [http://www.apple.com/quicktime QuickTime site] and install the QuickTime Player.
+ <tag>fail</tag>
</notification>
+
<notification
icon="notify.tga"
name="NoPlugin"
persist="true"
type="notify">
No Media Plugin was found to handle the "[MIME_TYPE]" mime type. Media of this type will be unavailable.
+ <tag>fail</tag>
<unique>
- <context key="[MIME_TYPE]"/>
+ <context>MIME_TYPE</context>
</unique>
</notification>
@@ -5021,6 +5648,7 @@ The following Media Plugin has failed:
[PLUGIN]
Please re-install the plugin or contact the vendor if you continue to experience problems.
+ <tag>fail</tag>
<form name="form">
<ignore name="ignore"
text="A Media Plugin fails to run"/>
@@ -5058,6 +5686,7 @@ The objects on the selected parcel of land owned by the Resident &apos;[NAME]&ap
The objects on the selected parcel of land shared with the group [GROUPNAME] have been returned back to their owner&apos;s inventory.
Transferable deeded objects have been returned to their previous owners.
Non-transferable objects that are deeded to the group have been deleted.
+ <tag>group</tag>
</notification>
<notification
@@ -5081,8 +5710,8 @@ Message from [NAME]:
icon="notify.tga"
name="NotSafe"
persist="true"
- type="notify"
- unique="true">
+ type="notify">
+ <unique/>
This land has damage enabled.
You can be hurt here. If you die, you will be teleported to your home location.
</notification>
@@ -5091,8 +5720,9 @@ You can be hurt here. If you die, you will be teleported to your home location.
icon="notify.tga"
name="NoFly"
persist="true"
- type="notify"
- unique="true">
+ type="notify">
+ <unique/>
+ <tag>fail</tag>
This area has flying disabled.
You can&apos;t fly here.
</notification>
@@ -5101,8 +5731,8 @@ You can&apos;t fly here.
icon="notify.tga"
name="PushRestricted"
persist="true"
- type="notify"
- unique="true">
+ type="notify">
+ <unique/>
This area does not allow pushing. You can&apos;t push others here unless you own the land.
</notification>
@@ -5110,22 +5740,32 @@ This area does not allow pushing. You can&apos;t push others here unless you own
icon="notify.tga"
name="NoVoice"
persist="true"
- type="notify"
- unique="true">
+ type="notify">
+ <unique/>
This area has voice chat disabled. You won&apos;t be able to hear anyone talking.
+ <tag>voice</tag>
</notification>
<notification
icon="notify.tga"
name="NoBuild"
persist="true"
- type="notify"
- unique="true">
+ type="notify">
+ <unique/>
This area has building disabled. You can&apos;t build or rez objects here.
</notification>
<notification
icon="notify.tga"
+ name="SeeAvatars"
+ persist="true"
+ type="notify">
+ <unique/>
+This parcel hides avatars and text chat from another parcel. You can&apos;t see other residents outside the parcel, and those outside are not able to see you. Regular text chat on channel 0 is also blocked.
+ </notification>
+
+ <notification
+ icon="notify.tga"
name="ScriptsStopped"
persist="true"
type="notify">
@@ -5145,6 +5785,7 @@ This region is not running any scripts.
name="NoOutsideScripts"
persist="true"
type="notify">
+ <tag>fail</tag>
This land has outside scripts disabled.
No scripts will work here except those belonging to the land owner.
@@ -5156,6 +5797,7 @@ No scripts will work here except those belonging to the land owner.
persist="true"
type="notify">
You can only claim public land in the Region you&apos;re in.
+ <tag>fail</tag>
</notification>
<notification
@@ -5163,6 +5805,7 @@ You can only claim public land in the Region you&apos;re in.
name="RegionTPAccessBlocked"
persist="true"
type="notify">
+ <tag>fail</tag>
You aren&apos;t allowed in that Region due to your maturity Rating. You may need to validate your age and/or install the latest Viewer.
Please go to the Knowledge Base for details on accessing areas with this maturity Rating.
@@ -5173,6 +5816,7 @@ Please go to the Knowledge Base for details on accessing areas with this maturit
name="URBannedFromRegion"
persist="true"
type="notify">
+ <tag>fail</tag>
You are banned from the region.
</notification>
@@ -5181,6 +5825,7 @@ You are banned from the region.
name="NoTeenGridAccess"
persist="true"
type="notify">
+ <tag>fail</tag>
Your account cannot connect to this teen grid region.
</notification>
@@ -5189,6 +5834,7 @@ Your account cannot connect to this teen grid region.
name="ImproperPaymentStatus"
persist="true"
type="notify">
+ <tag>fail</tag>
You do not have proper payment status to enter this region.
</notification>
@@ -5197,6 +5843,7 @@ You do not have proper payment status to enter this region.
name="MustGetAgeRgion"
persist="true"
type="notify">
+ <tag>fail</tag>
You must be age-verified to enter this region.
</notification>
@@ -5205,6 +5852,7 @@ You must be age-verified to enter this region.
name="MustGetAgeParcel"
persist="true"
type="notify">
+ <tag>fail</tag>
You must be age-verified to enter this parcel.
</notification>
@@ -5213,6 +5861,7 @@ You must be age-verified to enter this parcel.
name="NoDestRegion"
persist="true"
type="notify">
+ <tag>fail</tag>
No destination region found.
</notification>
@@ -5221,6 +5870,7 @@ No destination region found.
name="NotAllowedInDest"
persist="true"
type="notify">
+ <tag>fail</tag>
You are not allowed into the destination.
</notification>
@@ -5229,6 +5879,7 @@ You are not allowed into the destination.
name="RegionParcelBan"
persist="true"
type="notify">
+ <tag>fail</tag>
Cannot region cross into banned parcel. Try another way.
</notification>
@@ -5237,6 +5888,7 @@ Cannot region cross into banned parcel. Try another way.
name="TelehubRedirect"
persist="true"
type="notify">
+ <tag>fail</tag>
You have been redirected to a telehub.
</notification>
@@ -5245,6 +5897,7 @@ You have been redirected to a telehub.
name="CouldntTPCloser"
persist="true"
type="notify">
+ <tag>fail</tag>
Could not teleport closer to destination.
</notification>
@@ -5261,6 +5914,7 @@ Teleport cancelled.
name="FullRegionTryAgain"
persist="true"
type="notify">
+ <tag>fail</tag>
The region you are attempting to enter is currently full.
Please try again in a few moments.
</notification>
@@ -5270,6 +5924,7 @@ Please try again in a few moments.
name="GeneralFailure"
persist="true"
type="notify">
+ <tag>fail</tag>
General failure.
</notification>
@@ -5278,6 +5933,7 @@ General failure.
name="RoutedWrongRegion"
persist="true"
type="notify">
+ <tag>fail</tag>
Routed to wrong region. Please try again.
</notification>
@@ -5286,6 +5942,7 @@ Routed to wrong region. Please try again.
name="NoValidAgentID"
persist="true"
type="notify">
+ <tag>fail</tag>
No valid agent id.
</notification>
@@ -5294,6 +5951,7 @@ No valid agent id.
name="NoValidSession"
persist="true"
type="notify">
+ <tag>fail</tag>
No valid session id.
</notification>
@@ -5302,6 +5960,7 @@ No valid session id.
name="NoValidCircuit"
persist="true"
type="notify">
+ <tag>fail</tag>
No valid circuit code.
</notification>
@@ -5310,6 +5969,7 @@ No valid circuit code.
name="NoValidTimestamp"
persist="true"
type="notify">
+ <tag>fail</tag>
No valid timestamp.
</notification>
@@ -5318,6 +5978,7 @@ No valid timestamp.
name="NoPendingConnection"
persist="true"
type="notify">
+ <tag>fail</tag>
Unable to create pending connection.
</notification>
@@ -5326,6 +5987,7 @@ Unable to create pending connection.
name="InternalUsherError"
persist="true"
type="notify">
+ <tag>fail</tag>
Internal error attempting to connect agent usher.
</notification>
@@ -5334,6 +5996,7 @@ Internal error attempting to connect agent usher.
name="NoGoodTPDestination"
persist="true"
type="notify">
+ <tag>fail</tag>
Unable to find a good teleport destination in this region.
</notification>
@@ -5342,6 +6005,7 @@ Unable to find a good teleport destination in this region.
name="InternalErrorRegionResolver"
persist="true"
type="notify">
+ <tag>fail</tag>
Internal error attempting to activate region resolver.
</notification>
@@ -5350,6 +6014,7 @@ Internal error attempting to activate region resolver.
name="NoValidLanding"
persist="true"
type="notify">
+ <tag>fail</tag>
A valid landing point could not be found.
</notification>
@@ -5358,6 +6023,7 @@ A valid landing point could not be found.
name="NoValidParcel"
persist="true"
type="notify">
+ <tag>fail</tag>
No valid parcel could be found.
</notification>
@@ -5366,7 +6032,7 @@ No valid parcel could be found.
name="ObjectGiveItem"
type="offer">
An object named &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; owned by [NAME_SLURL] has given you this [OBJECTTYPE]:
-[ITEM_SLURL]
+&lt;nolink&gt;[ITEM_SLURL]&lt;/nolink&gt;
<form name="form">
<button
index="0"
@@ -5379,7 +6045,25 @@ An object named &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; owned by [NAME_SLU
<button
index="2"
name="Mute"
- text="Block"/>
+ text="Block Owner"/>
+ </form>
+ </notification>
+
+ <notification
+ icon="notify.tga"
+ name="OwnObjectGiveItem"
+ type="offer">
+Your object named &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; has given you this [OBJECTTYPE]:
+&lt;nolink&gt;[ITEM_SLURL]&lt;/nolink&gt;
+ <form name="form">
+ <button
+ index="0"
+ name="Keep"
+ text="Keep"/>
+ <button
+ index="1"
+ name="Discard"
+ text="Discard"/>
</form>
</notification>
@@ -5391,7 +6075,7 @@ An object named &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; owned by [NAME_SLU
[ITEM_SLURL]
<form name="form">
<button
- index="4"
+ index="3"
name="Show"
text="Show"/>
<button
@@ -5420,6 +6104,7 @@ An object named &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; owned by [NAME_SLU
name="JoinGroup"
persist="true"
type="notify">
+ <tag>group</tag>
[MESSAGE]
<form name="form">
<button
@@ -5444,6 +6129,7 @@ An object named &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; owned by [NAME_SLU
[NAME_SLURL] has offered to teleport you to their location:
[MESSAGE] - [MATURITY_STR] &lt;icon&gt;[MATURITY_ICON]&lt;/icon&gt;
+ <tag>confirm</tag>
<form name="form">
<button
index="0"
@@ -5487,6 +6173,8 @@ An object named &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; owned by [NAME_SLU
icon="notify.tga"
name="OfferFriendship"
type="offer">
+ <tag>friendship</tag>
+ <tag>confirm</tag>
[NAME_SLURL] is offering friendship.
[MESSAGE]
@@ -5508,6 +6196,7 @@ An object named &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; owned by [NAME_SLU
icon="notify.tga"
name="FriendshipOffered"
type="offer">
+ <tag>friendship</tag>
You have offered friendship to [TO_NAME]
</notification>
@@ -5516,6 +6205,7 @@ An object named &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; owned by [NAME_SLU
name="OfferFriendshipNoMessage"
persist="true"
type="notify">
+ <tag>friendship</tag>
[NAME_SLURL] is offering friendship.
(By default, you will be able to see each other&apos;s online status.)
@@ -5535,7 +6225,8 @@ An object named &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; owned by [NAME_SLU
icon="notify.tga"
name="FriendshipAccepted"
type="offer">
-[NAME] accepted your friendship offer.
+ <tag>friendship</tag>
+&lt;nolink&gt;[NAME]&lt;/nolink&gt; accepted your friendship offer.
</notification>
<notification
@@ -5543,13 +6234,15 @@ An object named &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; owned by [NAME_SLU
name="FriendshipDeclined"
persist="true"
type="notify">
-[NAME] declined your friendship offer.
+ <tag>friendship</tag>
+&lt;nolink&gt;[NAME]&lt;/nolink&gt; declined your friendship offer.
</notification>
<notification
icon="notify.tga"
name="FriendshipAcceptedByMe"
type="offer">
+ <tag>friendship</tag>
Friendship offer accepted.
</notification>
@@ -5557,6 +6250,7 @@ Friendship offer accepted.
icon="notify.tga"
name="FriendshipDeclinedByMe"
type="offer">
+ <tag>friendship</tag>
Friendship offer declined.
</notification>
@@ -5610,6 +6304,7 @@ Load web page [URL]?
[MESSAGE]
From object: &lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;, owner: [NAME]?
+ <tag>confirm</tag>
<form name="form">
<button
index="0"
@@ -5628,6 +6323,7 @@ From object: &lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;, owner: [NAME]?
persist="true"
type="notify">
Failed to find [TYPE] in database.
+ <tag>fail</tag>
</notification>
<notification
@@ -5636,6 +6332,7 @@ Failed to find [TYPE] in database.
persist="true"
type="notify">
Failed to find [TYPE] named [DESC] in database.
+ <tag>fail</tag>
</notification>
<notification
@@ -5644,6 +6341,7 @@ Failed to find [TYPE] named [DESC] in database.
persist="true"
type="notify">
The item you are trying to wear uses a feature that your Viewer can&apos;t read. Please upgrade your version of [APP_NAME] to wear this item.
+ <tag>fail</tag>
</notification>
<notification
@@ -5655,6 +6353,7 @@ The item you are trying to wear uses a feature that your Viewer can&apos;t read.
[QUESTIONS]
Is this OK?
+ <tag>confirm</tag>
<form name="form">
<button
index="0"
@@ -5683,6 +6382,7 @@ An object named &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos;, owned by
If you do not trust this object and its creator, you should deny the request.
Grant this request?
+ <tag>confirm</tag>
<form name="form">
<button
index="0"
@@ -5708,8 +6408,12 @@ Grant this request?
[MESSAGE]
<form name="form">
<button
+ index="-2"
+ name="Client_Side_Mute"
+ text="Block"/>
+ <button
index="-1"
- name="Ignore"
+ name="Client_Side_Ignore"
text="Ignore"/>
</form>
</notification>
@@ -5718,12 +6422,17 @@ Grant this request?
icon="notify.tga"
name="ScriptDialogGroup"
type="notify">
+ <tag>group</tag>
[GROUPNAME]&apos;s &apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos;
[MESSAGE]
<form name="form">
<button
+ index="-2"
+ name="Client_Side_Mute"
+ text="Block"/>
+ <button
index="-1"
- name="Ignore"
+ name="Client_Side_Ignore"
text="Ignore"/>
</form>
</notification>
@@ -5734,6 +6443,7 @@ Grant this request?
name="FirstBalanceIncrease"
persist="true"
type="notify">
+ <tag>win</tag>
You just received L$[AMOUNT].
Your L$ balance is shown in the upper-right.
</notification>
@@ -5753,6 +6463,7 @@ Your L$ balance is shown in the upper-right.
name="BuyLindenDollarSuccess"
persist="true"
type="notify">
+ <tag>funds</tag>
Thank you for your payment!
Your L$ balance will be updated when processing completes. If processing takes more than 20 mins, your transaction may be cancelled. In that case, the purchase amount will be credited to your US$ balance.
@@ -5760,57 +6471,6 @@ Your L$ balance will be updated when processing completes. If processing takes m
The status of your payment can be checked on your Transaction History page on your [http://secondlife.com/account/ Dashboard]
</notification>
-<!--
- <notification
- icon="notify.tga"
- name="FirstSit"
- persist="true"
- type="notify">
-You are sitting.
-Use your arrow keys (or AWSD) to look around.
-Click the &apos;Stand Up&apos; button to stand.
- </notification>
-
- <notification
- icon="notify.tga"
- name="FirstMap"
- persist="true"
- type="notify">
-Click and drag the map to look around.
-Double-click to teleport.
-Use the controls on the right to find things and display different backgrounds.
- </notification>
-
- <notification
- icon="notify.tga"
- name="FirstBuild"
- persist="true"
- type="notify">
-You have opened the Build Tools. Every object you see around you was created using these tools.
- </notification>
--->
-
-<!--
- <notification
- icon="notify.tga"
- name="FirstLeftClickNoHit"
- persist="true"
- type="notify">
- Left-clicking interacts with special objects.
- If the mouse pointer changes to a hand, you can interact with the object.
- Right-click always shows a menu of things you can do.
- </notification>
-
- <notification
- icon="notify.tga"
- name="FirstTeleport"
- persist="true"
- type="notify">
-You can only teleport to certain areas in this region. The arrow points to your specific destination. Click the arrow to dismiss it.
- </notification>
-
--->
-
<notification
icon="notify.tga"
name="FirstOverrideKeys"
@@ -5822,30 +6482,6 @@ Some objects (like guns) require you to go into mouselook to use them.
Press &apos;M&apos; to do this.
</notification>
-<!--
- <notification
- icon="notify.tga"
- name="FirstAppearance"
- persist="true"
- type="notify">
-You are editing your Appearance.
-Use the arrow keys to look around.
-When you are done, press &apos;Save All&apos;.
- </notification>
-
- <notification
- icon="notify.tga"
- name="FirstInventory"
- persist="true"
- type="notify">
-This is your Inventory, which contains items you own.
-
-* To wear something, drag it onto yourself.
-* To rez something inworld, drag it onto the ground.
-* To read a notecard, double-click it.
- </notification>
--->
-
<notification
icon="notify.tga"
name="FirstSandbox"
@@ -5856,47 +6492,6 @@ This is a sandbox area, and is meant to help Residents learn how to build.
Things you build here will be deleted after you leave, so don&apos;t forget to right-click and choose &apos;Take&apos; to move your creation to your Inventory.
</notification>
-<!--
- <notification
- icon="notify.tga"
- name="FirstFlexible"
- persist="true"
- type="notify">
-This object is flexible. Flexis must be phantom and not physical.
- </notification>
-
- <notification
- icon="notify.tga"
- name="FirstDebugMenus"
- persist="true"
- type="notify">
-You opened the Advanced menu.
-
-To toggle this menu,
- Windows: Ctrl+Alt+D
- Mac: &#8997;&#8984;D
-
- </notification>
-
- <notification
- icon="notify.tga"
- name="FirstSculptedPrim"
- persist="true"
- type="notify">
-You are editing a Sculpted prim. Sculpties require a special texture to define their shape.
- </notification>
--->
-
- <!--
- <notification
- icon="notify.tga"
- name="FirstMedia"
- persist="true"
- type="notify">
- You have begun playing media. Media can set to play automatically in the preferences window under Audio / Video. Note that this can be a security risk for media sites you do not trust.
- </notification>
- -->
-
<notification
icon="notifytip.tga"
name="MaxListSelectMessage"
@@ -5910,8 +6505,10 @@ You may only select up to [MAX_SELECT] items from this list.
type="notify">
[NAME] is inviting you to a Voice Chat call.
Click Accept to join the call or Decline to decline the invitation. Click Block to block this caller.
+ <tag>confirm</tag>
+ <tag>voice</tag>
<unique>
- <context key="NAME"/>
+ <context>NAME</context>
</unique>
<form name="form">
<button
@@ -5959,9 +6556,12 @@ Click Accept to join the call or Decline to decline the invitation. Click Block
type="notify">
[NAME] has joined a Voice Chat call with the group [GROUP].
Click Accept to join the call or Decline to decline the invitation. Click Block to block this caller.
+ <tag>group</tag>
+ <tag>confirm</tag>
+ <tag>voice</tag>
<unique>
- <context key="NAME"/>
- <context key="GROUP"/>
+ <context>NAME</context>
+ <context>GROUP</context>
</unique>
<form name="form">
<button
@@ -5985,8 +6585,10 @@ Click Accept to join the call or Decline to decline the invitation. Click Block
type="notify">
[NAME] has joined a voice chat call with a conference chat.
Click Accept to join the call or Decline to decline the invitation. Click Block to block this caller.
+ <tag>confirm</tag>
+ <tag>voice</tag>
<unique>
- <context key="NAME"/>
+ <context>NAME</context>
</unique>
<form name="form">
<button
@@ -6010,8 +6612,10 @@ Click Accept to join the call or Decline to decline the invitation. Click Block
type="notify">
[NAME] is inviting you to a conference chat.
Click Accept to join the chat or Decline to decline the invitation. Click Block to block this caller.
+ <tag>confirm</tag>
+ <tag>voice</tag>
<unique>
- <context key="NAME"/>
+ <context>NAME</context>
</unique>
<form name="form">
<button
@@ -6034,17 +6638,21 @@ Click Accept to join the chat or Decline to decline the invitation. Click Block
name="VoiceChannelFull"
type="notifytip">
The voice call you are trying to join, [VOICE_CHANNEL_NAME], has reached maximum capacity. Please try again later.
+ <tag>fail</tag>
+ <tag>voice</tag>
<unique>
- <context key="VOICE_CHANNEL_NAME"/>
+ <context>VOICE_CHANNEL_NAME</context>
</unique>
</notification>
<notification
icon="notifytip.tga"
name="ProximalVoiceChannelFull"
- type="notifytip"
- unique="true">
-We&apos;re sorry. This area has reached maximum capacity for voice conversations. Please try to use voice in another area.
+ type="notifytip">
+ <unique/>
+ We&apos;re sorry. This area has reached maximum capacity for voice conversations. Please try to use voice in another area.
+ <tag>fail</tag>
+ <tag>voice</tag>
</notification>
<notification
@@ -6052,8 +6660,9 @@ We&apos;re sorry. This area has reached maximum capacity for voice conversation
name="VoiceChannelDisconnected"
type="notifytip">
You have been disconnected from [VOICE_CHANNEL_NAME]. You will now be reconnected to Nearby Voice Chat.
+ <tag>voice</tag>
<unique>
- <context key="VOICE_CHANNEL_NAME"/>
+ <context>VOICE_CHANNEL_NAME</context>
</unique>
</notification>
@@ -6062,8 +6671,9 @@ You have been disconnected from [VOICE_CHANNEL_NAME]. You will now be reconnect
name="VoiceChannelDisconnectedP2P"
type="notifytip">
[VOICE_CHANNEL_NAME] has ended the call. You will now be reconnected to Nearby Voice Chat.
+ <tag>voice</tag>
<unique>
- <context key="VOICE_CHANNEL_NAME"/>
+ <context>VOICE_CHANNEL_NAME</context>
</unique>
</notification>
@@ -6072,8 +6682,10 @@ You have been disconnected from [VOICE_CHANNEL_NAME]. You will now be reconnect
name="P2PCallDeclined"
type="notifytip">
[VOICE_CHANNEL_NAME] has declined your call. You will now be reconnected to Nearby Voice Chat.
+ <tag>voice</tag>
+ <tag>fail</tag>
<unique>
- <context key="VOICE_CHANNEL_NAME"/>
+ <context>VOICE_CHANNEL_NAME</context>
</unique>
</notification>
@@ -6082,8 +6694,10 @@ You have been disconnected from [VOICE_CHANNEL_NAME]. You will now be reconnect
name="P2PCallNoAnswer"
type="notifytip">
[VOICE_CHANNEL_NAME] is not available to take your call. You will now be reconnected to Nearby Voice Chat.
+ <tag>fail</tag>
+ <tag>voice</tag>
<unique>
- <context key="VOICE_CHANNEL_NAME"/>
+ <context>VOICE_CHANNEL_NAME</context>
</unique>
</notification>
@@ -6092,8 +6706,10 @@ You have been disconnected from [VOICE_CHANNEL_NAME]. You will now be reconnect
name="VoiceChannelJoinFailed"
type="notifytip">
Failed to connect to [VOICE_CHANNEL_NAME], please try again later. You will now be reconnected to Nearby Voice Chat.
+ <tag>fail</tag>
+ <tag>voice</tag>
<unique>
- <context key="VOICE_CHANNEL_NAME"/>
+ <context>VOICE_CHANNEL_NAME</context>
</unique>
</notification>
@@ -6101,9 +6717,11 @@ Failed to connect to [VOICE_CHANNEL_NAME], please try again later. You will now
duration="10"
icon="notifytip.tga"
name="VoiceLoginRetry"
- type="notifytip"
- unique="true">
+ type="notifytip">
+ <unique/>
We are creating a voice channel for you. This may take up to one minute.
+ <tag>status</tag>
+ <tag>voice</tag>
</notification>
<notification
@@ -6111,10 +6729,12 @@ We are creating a voice channel for you. This may take up to one minute.
name="VoiceEffectsExpired"
sound="UISndAlert"
persist="true"
- type="notify"
- unique="true">
+ type="notify">
+ <unique/>
One or more of your subscribed Voice Morphs has expired.
[[URL] Click here] to renew your subscription.
+ <tag>fail</tag>
+ <tag>voice</tag>
</notification>
<notification
@@ -6122,10 +6742,12 @@ One or more of your subscribed Voice Morphs has expired.
name="VoiceEffectsExpiredInUse"
sound="UISndAlert"
persist="true"
- type="notify"
- unique="true">
+ type="notify">
+ <unique/>
The active Voice Morph has expired, your normal voice settings have been applied.
[[URL] Click here] to renew your subscription.
+ <tag>fail</tag>
+ <tag>voice</tag>
</notification>
<notification
@@ -6133,10 +6755,12 @@ The active Voice Morph has expired, your normal voice settings have been applied
name="VoiceEffectsWillExpire"
sound="UISndAlert"
persist="true"
- type="notify"
- unique="true">
+ type="notify">
+ <unique/>
One or more of your Voice Morphs will expire in less than [INTERVAL] days.
[[URL] Click here] to renew your subscription.
+ <tag>fail</tag>
+ <tag>voice</tag>
</notification>
<notification
@@ -6144,15 +6768,18 @@ One or more of your Voice Morphs will expire in less than [INTERVAL] days.
name="VoiceEffectsNew"
sound="UISndAlert"
persist="true"
- type="notify"
- unique="true">
+ type="notify">
+ <unique/>
New Voice Morphs are available!
+ <tag>voice</tag>
</notification>
<notification
icon="notifytip.tga"
name="Cannot enter parcel: not a group member"
type="notifytip">
+ <tag>fail</tag>
+ <tag>group</tag>
Only members of a certain group can visit this area.
</notification>
@@ -6160,6 +6787,7 @@ Only members of a certain group can visit this area.
icon="notifytip.tga"
name="Cannot enter parcel: banned"
type="notifytip">
+ <tag>fail</tag>
Cannot enter parcel, you have been banned.
</notification>
@@ -6167,6 +6795,7 @@ Cannot enter parcel, you have been banned.
icon="notifytip.tga"
name="Cannot enter parcel: not on access list"
type="notifytip">
+ <tag>fail</tag>
Cannot enter parcel, you are not on the access list.
</notification>
@@ -6175,8 +6804,10 @@ Cannot enter parcel, you are not on the access list.
name="VoiceNotAllowed"
type="notifytip">
You do not have permission to connect to voice chat for [VOICE_CHANNEL_NAME].
+ <tag>fail</tag>
+ <tag>voice</tag>
<unique>
- <context key="VOICE_CHANNEL_NAME"/>
+ <context>VOICE_CHANNEL_NAME</context>
</unique>
</notification>
@@ -6185,26 +6816,20 @@ You do not have permission to connect to voice chat for [VOICE_CHANNEL_NAME].
name="VoiceCallGenericError"
type="notifytip">
An error has occurred while trying to connect to voice chat for [VOICE_CHANNEL_NAME]. Please try again later.
+ <tag>fail</tag>
+ <tag>voice</tag>
<unique>
- <context key="VOICE_CHANNEL_NAME"/>
+ <context>VOICE_CHANNEL_NAME</context>
</unique>
</notification>
<notification
- duration="10"
- icon="notifytip.tga"
- name="ServerVersionChanged"
- priority="high"
- type="notifytip">
-You just entered a region using a different server version, which may affect performance. [[URL] View the release notes.]
- </notification>
-
- <notification
icon="notifytip.tga"
name="UnsupportedCommandSLURL"
priority="high"
type="notifytip">
The SLurl you clicked on is not supported.
+ <tag>fail</tag>
</notification>
<notification
@@ -6212,6 +6837,7 @@ The SLurl you clicked on is not supported.
name="BlockedSLURL"
priority="high"
type="notifytip">
+ <tag>security</tag>
A SLurl was received from an untrusted browser and has been blocked for your security.
</notification>
@@ -6220,6 +6846,7 @@ A SLurl was received from an untrusted browser and has been blocked for your sec
name="ThrottledSLURL"
priority="high"
type="notifytip">
+ <tag>security</tag>
Multiple SLurls were received from an untrusted browser within a short period.
They will be blocked for a few seconds for your security.
</notification>
@@ -6236,6 +6863,7 @@ They will be blocked for a few seconds for your security.
name="ConfirmCloseAll"
type="alertmodal">
Are you sure you want to close all IMs?
+ <tag>confirm</tag>
<usetemplate
name="okcancelignore"
notext="Cancel"
@@ -6253,14 +6881,16 @@ Attachment has been saved.
name="UnableToFindHelpTopic"
type="alertmodal">
Unable to find the help topic for this element.
+ <tag>fail</tag>
</notification>
- <notification
+ <notification
icon="alertmodal.tga"
name="ObjectMediaFailure"
type="alertmodal">
Server Error: Media update or get failed.
&apos;[ERROR]&apos;
+ <tag>fail</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
@@ -6281,16 +6911,29 @@ Your text chat has been muted by moderator.
name="VoiceIsMutedByModerator"
type="alertmodal">
Your voice has been muted by moderator.
+ <tag>voice</tag>
<usetemplate
name="okbutton"
yestext="OK"/>
</notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="UploadCostConfirmation"
+ type="alertmodal">
+This upload will cost L$[PRICE], do you wish to continue with the upload?
+ <usetemplate
+ name="okcancelbuttons"
+ notext="Cancel"
+ yestext="Upload"/>
+ </notification>
<notification
icon="alertmodal.tga"
name="ConfirmClearTeleportHistory"
type="alertmodal">
Are you sure you want to delete your teleport history?
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -6303,6 +6946,7 @@ Are you sure you want to delete your teleport history?
type="alert">
Selected button can not be shown right now.
The button will be shown when there is enough space for it.
+ <tag>fail</tag>
</notification>
<notification
@@ -6311,33 +6955,110 @@ The button will be shown when there is enough space for it.
type="notifytip">
Select residents to share with.
</notification>
+
+ <notification
+ name="MeshUploadError"
+ icon="alert.tga"
+ type="alert">
+ [LABEL] failed to upload: [MESSAGE] [IDENTIFIER]
+
+See the log file for details.
+ </notification>
+
+ <notification
+ name="MeshUploadPermError"
+ icon="alert.tga"
+ type="alert">
+ Error while requesting mesh upload permissons.
+ </notification>
+
+ <notification
+ name="RegionCapabilityRequestError"
+ icon="alert.tga"
+ type="alert">
+ Could not get region capability &apos;[CAPABILITY]&apos;.
+ </notification>
+
<notification
icon="notifytip.tga"
name="ShareItemsConfirmation"
type="alertmodal">
Are you sure you want to share the following items:
-[ITEMS]
+&lt;nolink&gt;[ITEMS]&lt;/nolink&gt;
With the following Residents:
[RESIDENTS]
+ <tag>confirm</tag>
+ <usetemplate
+ name="okcancelbuttons"
+ notext="Cancel"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="notifytip.tga"
+ name="ShareFolderConfirmation"
+ type="alertmodal">
+Only one folder at a time can be shared.
+
+Are you sure you want to share the following items:
+
+&lt;nolink&gt;[ITEMS]&lt;/nolink&gt;
+
+With the following Residents:
+
+[RESIDENTS]
+ <tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
yestext="Ok"/>
</notification>
+
<notification
icon="notifytip.tga"
name="ItemsShared"
type="notifytip">
Items successfully shared.
</notification>
+
<notification
icon="notifytip.tga"
name="DeedToGroupFail"
type="notifytip">
Deed to group failed.
+ <tag>group</tag>
+ <tag>fail</tag>
+ </notification>
+
+ <notification
+ icon="notifytip.tga"
+ name="ReleaseLandThrottled"
+ type="notifytip">
+The parcel [PARCEL_NAME] can not be abandoned at this time.
+ <tag>fail</tag>
+ </notification>
+
+ <notification
+ icon="notifytip.tga"
+ name="ReleasedLandWithReclaim"
+ type="notifytip">
+The [AREA] m² parcel &apos;[PARCEL_NAME]&apos; has been released.
+
+You will have [RECLAIM_PERIOD] hours to reclaim for L$0 before it is set for sale to anyone.
+ <tag>fail</tag>
+ </notification>
+
+ <notification
+ icon="notifytip.tga"
+ name="ReleasedLandNoReclaim"
+ type="notifytip">
+The [AREA] m² parcel &apos;[PARCEL_NAME]&apos; has been released.
+
+It is now available for purchase by anyone.
+ <tag>fail</tag>
</notification>
<notification
@@ -6411,13 +7132,10 @@ Avatar '[NAME]' left appearance mode.
type="alertmodal">
We're having trouble connecting using [PROTOCOL] [HOSTID].
Please check your network and firewall setup.
- <form name="form">
- <button
- default="true"
- index="0"
- name="OK"
- text="OK"/>
- </form>
+ <tag>fail</tag>
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
</notification>
<notification
@@ -6430,13 +7148,11 @@ We're having trouble connecting to your voice server:
Voice communications will not be available.
Please check your network and firewall setup.
- <form name="form">
- <button
- default="true"
- index="0"
- name="OK"
- text="OK"/>
- </form>
+ <tag>voice</tag>
+ <tag>fail</tag>
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
</notification>
<notification
@@ -6468,12 +7184,15 @@ You locally updated a [RESOLUTION] baked texture for '[BODYREGION]' after [TIME]
name="ConfirmLeaveCall"
type="alert">
Are you sure you want to leave this call?
+ <tag>confirm</tag>
+ <tag>voice</tag>
<usetemplate
ignoretext="Confirm before I leave call"
name="okcancelignore"
notext="No"
- yestext="Yes"
- unique="true"/>
+ yestext="Yes">
+ <unique/>
+ </usetemplate>
</notification>
<notification
@@ -6485,76 +7204,129 @@ This will also cause all residents that later join the call to be
muted, even after you have left the call.
Mute everyone?
+ <tag>group</tag>
+ <tag>confirm</tag>
+ <tag>voice</tag>
<usetemplate
ignoretext="Confirm before I mute all participants in a group call"
name="okcancelignore"
- yestext="Ok"
- notext="Cancel"
- unique="true"/>
+ yestext="OK"
+ notext="Cancel">
+ <unique/>
+ </usetemplate>
</notification>
-
<notification
name="HintChat"
label="Chat"
- type="hint"
- unique="true">
+ type="hint">
+ <unique/>
To join the conversation, type into the chat field below.
</notification>
<notification
name="HintSit"
label="Stand"
- type="hint"
- unique="true">
+ type="hint">
+ <unique/>
To stand up and exit the sitting position, click the Stand button.
</notification>
<notification
+ name="HintSpeak"
+ label="Speak"
+ type="hint">
+ <unique/>
+Click the Speak button to turn your microphone on and off.
+
+Click on the up arrow to see the voice control panel.
+
+Hiding the Speak button will disable the voice feature.
+ </notification>
+
+ <notification
name="HintDestinationGuide"
label="Explore the World"
- type="hint"
- unique="true">
+ type="hint">
+ <unique/>
The Destination Guide contains thousands of new places to discover. Select a location and choose Teleport to start exploring.
</notification>
<notification
name="HintSidePanel"
label="Side Panel"
- type="hint"
- unique="true">
+ type="hint">
+ <unique/>
Get quick access to your inventory, outfits, profiles and more in the side panel.
</notification>
<notification
name="HintMove"
label="Move"
- type="hint"
- unique="true">
+ type="hint">
+ <unique/>
To walk or run, open the Move Panel and use the directional arrows to navigate. You can also use the directional keys on your keyboard.
</notification>
<notification
+ name="HintMoveClick"
+ label=""
+ type="hint">
+ <unique/>
+1. Click to Walk
+Click anywhere on the ground to walk to that spot.
+
+2. Click and Drag to Rotate View
+Click and drag anywhere on the world to rotate your view
+ <tag>custom_skin</tag>
+ </notification>
+
+ <notification
name="HintDisplayName"
label="Display Name"
- type="hint"
- unique="true">
+ type="hint">
+ <unique/>
Set your customizable display name here. This is in addition to your unique username, which can't be changed. You can change how you see other people's names in your preferences.
</notification>
+
+ <notification
+ name="HintView"
+ label="View"
+ type="hint">
+ <unique/>
+ To change your camera view, use the Orbit and Pan controls. Reset your view by pressing Escape or walking.
+ <tag>custom_skin</tag>
+ </notification>
+
<notification
name="HintInventory"
label="Inventory"
- type="hint"
- unique="true">
+ type="hint">
+ <unique/>
Check your inventory to find items. Newest items can be easily found in the Recent tab.
</notification>
<notification
name="HintLindenDollar"
label="You've got Linden Dollars!"
- type="hint"
- unique="true">
+ type="hint">
+ <unique/>
Here's your current balance of L$. Click Buy L$ to purchase more Linden Dollars.
+ <tag>funds</tag>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="LowMemory"
+ type="alertmodal">
+ Your memory pool is low. Some functions of SL are disabled to avoid crash. Please close other applications. Restart SL if this persists.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="ForceQuitDueToLowMemory"
+ type="alertmodal">
+ SL will quit in 30 seconds due to out of memory.
</notification>
<notification
@@ -6574,11 +7346,324 @@ Mute everyone?
</form>
</notification>
+ <notification
+ icon="alertmodal.tga"
+ name="SOCKS_NOT_PERMITTED"
+ type="alertmodal">
+ The SOCKS 5 proxy "[HOST]:[PORT]" refused the connection, not allowed by rule set.
+ <tag>fail</tag>
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="SOCKS_CONNECT_ERROR"
+ type="alertmodal">
+ The SOCKS 5 proxy "[HOST]:[PORT]" refused the connection, could not open TCP channel.
+ <tag>fail</tag>
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="SOCKS_NOT_ACCEPTABLE"
+ type="alertmodal">
+ The SOCKS 5 proxy "[HOST]:[PORT]" refused the selected authentication system.
+ <tag>fail</tag>
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="SOCKS_AUTH_FAIL"
+ type="alertmodal">
+ The SOCKS 5 proxy "[HOST]:[PORT]" reported your credentials are invalid.
+ <tag>fail</tag>
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="SOCKS_UDP_FWD_NOT_GRANTED"
+ type="alertmodal">
+ The SOCKS 5 proxy "[HOST]:[PORT]" refused the UDP associate request.
+ <tag>fail</tag>
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="SOCKS_HOST_CONNECT_FAILED"
+ type="alertmodal">
+ Could not connect to SOCKS 5 proxy server "[HOST]:[PORT]".
+ <tag>fail</tag>
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="SOCKS_UNKNOWN_STATUS"
+ type="alertmodal">
+ Unknown proxy error with server "[HOST]:[PORT]".
+ <tag>fail</tag>
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="SOCKS_INVALID_HOST"
+ type="alertmodal">
+ Invalid SOCKS proxy address or port "[HOST]:[PORT]".
+ <tag>fail</tag>
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="SOCKS_BAD_CREDS"
+ type="alertmodal">
+ Invalid SOCKS 5 username or password.
+ <tag>fail</tag>
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="PROXY_INVALID_HTTP_HOST"
+ type="alertmodal">
+ Invalid HTTP proxy address or port "[HOST]:[PORT]".
+ <tag>fail</tag>
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="PROXY_INVALID_SOCKS_HOST"
+ type="alertmodal">
+ Invalid SOCKS proxy address or port "[HOST]:[PORT]".
+ <tag>fail</tag>
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="ChangeProxySettings"
+ type="alert">
+ Proxy settings take effect after you restart [APP_NAME].
+ <tag>fail</tag>
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ name="AuthRequest"
+ type="browser">
+The site at &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos; in realm &apos;[REALM]&apos; requires a user name and password.
+ <tag>confirm</tag>
+ <form name="form">
+ <input name="username" type="text" text="User Name"/>
+ <input name="password" type="password" text="Password "/>
+ <button default="true"
+ index="0"
+ name="ok"
+ text="Submit"/>
+ <button index="1"
+ name="cancel"
+ text="Cancel"/>
+ </form>
+ </notification>
+
+ <notification
+ name="NoClassifieds"
+ label=""
+ type="alertmodal">
+ <unique/>
+ <tag>fail</tag>
+ <tag>confirm</tag>
+ Creation and editing of Classifieds is only available in Advanced mode. Would you like to quit and change modes? The mode selector can be found on the login screen.
+ <usetemplate
+ name="okcancelbuttons"
+ yestext="Quit"
+ notext="Don't Quit"/>
+ </notification>
+
+ <notification
+ name="NoGroupInfo"
+ label=""
+ type="alertmodal">
+ <unique/>
+ <tag>fail</tag>
+ <tag>confirm</tag>
+ Creation and editing of Groups is only available in Advanced mode. Would you like to quit and change modes? The mode selector can be found on the login screen.
+ <usetemplate
+ name="okcancelbuttons"
+ yestext="Quit"
+ notext="Don't Quit"/>
+ </notification>
+
+ <notification
+ name="NoPlaceInfo"
+ label=""
+ type="alertmodal">
+ <unique/>
+ <tag>fail</tag>
+ <tag>confirm</tag>
+ Viewing place profile is only available in Advanced mode. Would you like to quit and change modes? The mode selector can be found on the login screen.
+ <usetemplate
+ name="okcancelbuttons"
+ yestext="Quit"
+ notext="Don't Quit"/>
+ </notification>
- <global name="UnsupportedCPU">
-- Your CPU speed does not meet the minimum requirements.
- </global>
+ <notification
+ name="NoPicks"
+ label=""
+ type="alertmodal">
+ <unique/>
+ <tag>fail</tag>
+ <tag>confirm</tag>
+ Creation and editing of Picks is only available in Advanced mode. Would you like to quit and change modes? The mode selector can be found on the login screen.
+ <usetemplate
+ name="okcancelbuttons"
+ yestext="Quit"
+ notext="Don't Quit"/>
+ </notification>
+
+ <notification
+ name="NoWorldMap"
+ label=""
+ type="alertmodal">
+ <unique/>
+ <tag>fail</tag>
+ <tag>confirm</tag>
+ Viewing of the world map is only available in Advanced mode. Would you like to quit and change modes? The mode selector can be found on the login screen.
+ <usetemplate
+ name="okcancelbuttons"
+ yestext="Quit"
+ notext="Don't Quit"/>
+ </notification>
+
+ <notification
+ name="NoVoiceCall"
+ label=""
+ type="alertmodal">
+ <unique/>
+ <tag>fail</tag>
+ <tag>confirm</tag>
+ Voice calls are only available in Advanced mode. Would you like to logout and change modes?
+ <usetemplate
+ name="okcancelbuttons"
+ yestext="Quit"
+ notext="Don't Quit"/>
+ </notification>
+
+ <notification
+ name="NoAvatarShare"
+ label=""
+ type="alertmodal">
+ <unique/>
+ <tag>fail</tag>
+ <tag>confirm</tag>
+ Sharing is only available in Advanced mode. Would you like to logout and change modes?
+ <usetemplate
+ name="okcancelbuttons"
+ yestext="Quit"
+ notext="Don't Quit"/>
+ </notification>
+
+ <notification
+ name="NoAvatarPay"
+ label=""
+ type="alertmodal">
+ <unique/>
+ <tag>fail</tag>
+ <tag>confirm</tag>
+ Paying other residents is only available in Advanced mode. Would you like to logout and change modes?
+ <usetemplate
+ name="okcancelbuttons"
+ yestext="Quit"
+ notext="Don't Quit"/>
+ </notification>
+ <notification
+ name="NoInventory"
+ label=""
+ type="alertmodal">
+ <unique/>
+ <tag>fail</tag>
+ <tag>confirm</tag>
+ Viewing inventory is only available in Advanced mode. Would you like to logout and change modes?
+ <usetemplate
+ name="okcancelbuttons"
+ yestext="Quit"
+ notext="Don't Quit"/>
+ </notification>
+
+ <notification
+ name="NoAppearance"
+ label=""
+ type="alertmodal">
+ <unique/>
+ <tag>fail</tag>
+ <tag>confirm</tag>
+ The appearance editor is only available in Advanced mode. Would you like to logout and change modes?
+ <usetemplate
+ name="okcancelbuttons"
+ yestext="Quit"
+ notext="Don't Quit"/>
+ </notification>
+
+ <notification
+ name="NoSearch"
+ label=""
+ type="alertmodal">
+ <unique/>
+ <tag>fail</tag>
+ <tag>confirm</tag>
+ Search is only available in Advanced mode. Would you like to logout and change modes?
+ <usetemplate
+ name="okcancelbuttons"
+ yestext="Quit"
+ notext="Don't Quit"/>
+ </notification>
+
+ <notification
+ name="ConfirmHideUI"
+ label=""
+ type="alertmodal">
+ <unique/>
+ <tag>confirm</tag>
+ This action will hide all menu items and buttons. To get them back, click [SHORTCUT] again.
+ <usetemplate
+ name="okcancelignore"
+ yestext="OK"
+ notext="Cancel"
+ ignoretext="Confirm before hiding UI"/>
+ </notification>
+
<global name="UnsupportedGLRequirements">
You do not appear to have the proper hardware requirements for [APP_NAME]. [APP_NAME] requires an OpenGL graphics card that has multitexture support. If this is the case, you may want to make sure that you have the latest drivers for your graphics card, and service packs and patches for your operating system.
@@ -6611,4 +7696,31 @@ Otherwise, you can look at the Map and find places marked &quot;Infohub&quot;.
You died and have been teleported to your home location.
</global>
+ <notification
+ icon="alertmodal.tga"
+ name="LocalBitmapsUpdateFileNotFound"
+ persist="true"
+ type="notify">
+[FNAME] could not be updated because the file could no longer be found.
+Disabling future updates for this file.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="LocalBitmapsUpdateFailedFinal"
+ persist="true"
+ type="notify">
+[FNAME] could not be opened or decoded for [NRETRIES] attempts, and is now considered broken.
+Disabling future updates for this file.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="LocalBitmapsVerifyFail"
+ persist="true"
+ type="notify">
+Attempted to add an invalid or unreadable image file [FNAME] which could not be opened or decoded.
+Attempt cancelled.
+ </notification>
+
</notifications>
diff --git a/indra/newview/skins/default/xui/en/outfit_accordion_tab.xml b/indra/newview/skins/default/xui/en/outfit_accordion_tab.xml
index 20ff492c0f..2a24c74feb 100644
--- a/indra/newview/skins/default/xui/en/outfit_accordion_tab.xml
+++ b/indra/newview/skins/default/xui/en/outfit_accordion_tab.xml
@@ -10,7 +10,7 @@
name="Mockup Tab"
selection_enabled="true"
tab_stop="false"
- title="Mockup Tab"
+ title="MOCKUP TAB"
translate="false"
width="0">
<wearable_items_list
diff --git a/indra/newview/skins/default/xui/en/panel_activeim_row.xml b/indra/newview/skins/default/xui/en/panel_activeim_row.xml
index 72f41c62f4..9369d1b5cf 100644
--- a/indra/newview/skins/default/xui/en/panel_activeim_row.xml
+++ b/indra/newview/skins/default/xui/en/panel_activeim_row.xml
@@ -65,6 +65,7 @@
speaker.visible="false">
</chiclet_im_adhoc>
<text
+ translate="false"
type="string"
name="contact_name"
layout="topleft"
@@ -74,9 +75,10 @@
width="250"
length="1"
follows="right|left"
+ parse_urls="false"
use_ellipses="true"
font="SansSerifBold">
- Grumpity ProductEngine
+ TestString PleaseIgnore
</text>
<button
top="10"
diff --git a/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml
index e70abc0975..d68fa6ca6c 100644
--- a/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml
+++ b/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml
@@ -27,8 +27,7 @@
mouse_opaque="false"
width="147"
top="0"
- name="speakers_list_panel"
- user_resize="false">
+ name="speakers_list_panel">
<avatar_list
color="DkGray2"
follows="all"
@@ -50,7 +49,6 @@
min_height="25"
width="130"
name="call_btn_panel"
- user_resize="false"
visible="false">
<button
follows="all"
@@ -58,7 +56,7 @@
label="Call"
name="call_btn"
width="130"
- top="5" />
+ top="0" />
</layout_panel>
<layout_panel
auto_resize="false"
@@ -68,14 +66,13 @@
min_height="25"
width="130"
name="end_call_btn_panel"
- user_resize="false"
visible="false">
<button
follows="all"
height="20"
label="Leave Call"
name="end_call_btn"
- top="5"/>
+ top="0"/>
</layout_panel>
<layout_panel
auto_resize="false"
@@ -85,14 +82,13 @@
min_height="25"
width="130"
name="voice_ctrls_btn_panel"
- user_resize="false"
visible="false">
<button
follows="all"
height="20"
label="Voice Controls"
name="voice_ctrls_btn"
- top="5"
+ top="0"
use_ellipses="true" />
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml
index 4b21ffa1f9..b7c58eb6ab 100644
--- a/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml
@@ -60,6 +60,7 @@
layout="topleft"
left_pad="5"
name="avatar_name"
+ parse_urls="false"
top="6"
use_ellipses="true"
value="(loading)"
@@ -134,7 +135,7 @@
<button
follows="right"
height="20"
- image_overlay="ForwardArrow_Off"
+ image_overlay="Web_Profile_Off"
layout="topleft"
left_pad="5"
right="-28"
diff --git a/indra/newview/skins/default/xui/en/panel_block_list_sidetray.xml b/indra/newview/skins/default/xui/en/panel_block_list_sidetray.xml
index 1e6a31d388..7c67fd7f83 100644
--- a/indra/newview/skins/default/xui/en/panel_block_list_sidetray.xml
+++ b/indra/newview/skins/default/xui/en/panel_block_list_sidetray.xml
@@ -28,7 +28,7 @@
layout="topleft"
left_pad="10"
name="title_text"
- text_color="white"
+ text_color="White"
top="5"
width="250">
Block List
diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
deleted file mode 100644
index 63068a069f..0000000000
--- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml
+++ /dev/null
@@ -1,510 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel
- background_visible="true"
- bg_alpha_color="DkGray"
- bg_opaque_color="DkGray"
- chrome="true"
- follows="left|bottom|right"
- height="33"
- layout="topleft"
- left="0"
- name="bottom_tray"
- top="28"
- width="1310">
- <string
- name="DragIndicationImageName"
- value="Accordion_ArrowOpened_Off" />
- <string
- name="SpeakBtnToolTip"
- value="Turns microphone on/off" />
- <string
- name="VoiceControlBtnToolTip"
- value="Shows/hides voice control panel" />
- <layout_stack
- border_size="0"
- clip="false"
- follows="all"
- height="28"
- layout="topleft"
- left="0"
- mouse_opaque="false"
- name="toolbar_stack"
- orientation="horizontal"
- top="0"
- width="1310">
- <layout_panel
- auto_resize="false"
- user_resize="false"
- min_width="2"
- width="2" />
- <layout_panel
- auto_resize="false"
- layout="topleft"
- max_width="320"
- min_width="214"
- height="28"
- mouse_opaque="false"
- name="chat_bar_layout_panel"
- user_resize="true"
- width="308" >
- <panel
- name="chat_bar"
- filename="panel_nearby_chat_bar.xml"
- left="0"
- height="28"
- width="308"
- top="0"
- mouse_opaque="false"
- follows="left|right"
- />
- </layout_panel>
- <!--
- There is resize bar between chatbar and Speak button. It has 2px width (is is set as 2*UIResizeBarOverlap)
- -->
- <layout_panel
- auto_resize="false"
- follows="right"
- height="28"
- layout="topleft"
- min_height="28"
- min_width="59"
- mouse_opaque="false"
- name="speak_panel"
- top_delta="0"
- user_resize="true"
- width="110">
- <talk_button
- follows="left|right"
- height="23"
- layout="topleft"
- left="2"
- name="talk"
- top="5"
- width="105">
- <show_button
- tab_stop="true">
- <init_callback
- function="Button.SetDockableFloaterToggle"
- parameter="voice_controls" />
- </show_button>
- <!-- do not remove halign attribute with default value. otherwise it can't be overridden in other locales.
- & pad_right is default value for long label which can be right aligned. See EXT-6318 -->
- <speak_button
- halign="center"
- label="Speak"
- label_selected="Speak"
- name="speak_btn"
- pad_right="20"
- tab_stop="true"
- use_ellipses="true" />
- </talk_button>
- </layout_panel>
- <layout_panel
- auto_resize="false"
- follows="right"
- height="28"
- layout="topleft"
- min_height="28"
- min_width="65"
- mouse_opaque="false"
- name="gesture_panel"
- top_delta="0"
- user_resize="false"
- width="85">
- <gesture_combo_list
- follows="left|right"
- height="23"
- label="Gesture"
- layout="topleft"
- left="0"
- name="Gesture"
- tool_tip="Shows/hides gestures"
- top="5"
- width="82">
- <combo_button
- pad_right="10"
- use_ellipses="true" />
- <combo_list
- page_lines="17" />
- </gesture_combo_list>
- </layout_panel>
- <layout_panel
- auto_resize="false"
- follows="right"
- height="28"
- layout="topleft"
- min_height="28"
- min_width="52"
- mouse_opaque="false"
- name="movement_panel"
- user_resize="false"
- width="83">
- <bottomtray_button
- follows="left|right"
- height="23"
- image_pressed="PushButton_Press"
- image_pressed_selected="PushButton_Selected_Press"
- image_selected="PushButton_Selected_Press"
- is_toggle="true"
- label="Move"
- layout="topleft"
- name="movement_btn"
- tool_tip="Shows/hides movement controls"
- top="5"
- use_ellipses="true"
- width="80">
- <init_callback
- function="Button.SetDockableFloaterToggle"
- parameter="moveview" />
- </bottomtray_button>
-
- </layout_panel>
- <layout_panel
- auto_resize="false"
- follows="left|right"
- height="28"
- layout="topleft"
- min_height="28"
- min_width="52"
- mouse_opaque="false"
- name="cam_panel"
- user_resize="false"
- width="83">
- <bottomtray_button
- follows="left|right"
- height="23"
- image_pressed="PushButton_Press"
- image_pressed_selected="PushButton_Selected_Press"
- image_selected="PushButton_Selected_Press"
- is_toggle="true"
- label="View"
- layout="topleft"
- left="0"
- name="camera_btn"
- tool_tip="Shows/hides camera controls"
- top="5"
- use_ellipses="true"
- width="80">
- <init_callback
- function="Button.SetDockableFloaterToggle"
- parameter="camera" />
- </bottomtray_button>
- </layout_panel>
- <layout_panel
- auto_resize="false"
- follows="left|right"
- height="28"
- layout="topleft"
- min_width="40"
- mouse_opaque="false"
- name="snapshot_panel"
- user_resize="false"
- width="39">
- <bottomtray_button
- follows="left|right"
- height="23"
- image_overlay="Snapshot_Off"
- image_pressed="PushButton_Press"
- image_pressed_selected="PushButton_Selected_Press"
- image_selected="PushButton_Selected_Press"
- is_toggle="true"
- layout="topleft"
- left="0"
- name="snapshots"
- tool_tip="Take snapshot"
- top="5"
- width="36">
- <init_callback
- function="Button.SetFloaterToggle"
- parameter="snapshot" />
- </bottomtray_button>
- </layout_panel>
- <layout_panel
- auto_resize="false"
- follows="left|right"
- height="28"
- layout="topleft"
- min_height="28"
- min_width="52"
- mouse_opaque="false"
- name="build_btn_panel"
- user_resize="false"
- width="83">
-<!--*FIX: Build Floater is not opened with default registration. Will be fixed soon.
-Disabled for now.
--->
- <bottomtray_button
- follows="left|right"
- height="23"
- image_pressed="PushButton_Press"
- image_pressed_selected="PushButton_Selected_Press"
- image_selected="PushButton_Selected_Press"
- is_toggle="true"
- label="Build"
- layout="topleft"
- left="0"
- name="build_btn"
- tool_tip="Shows/hides Build Tools"
- top="5"
- use_ellipses="true"
- width="80">
- <commit_callback
- function="Build.Toggle"
- parameter="build" />
- </bottomtray_button>
- </layout_panel>
- <layout_panel
- auto_resize="false"
- follows="left|right"
- height="28"
- layout="topleft"
- min_height="28"
- min_width="52"
- mouse_opaque="false"
- name="search_btn_panel"
- user_resize="false"
- width="83">
- <bottomtray_button
- follows="left|right"
- height="23"
- image_pressed="PushButton_Press"
- image_pressed_selected="PushButton_Selected_Press"
- image_selected="PushButton_Selected_Press"
- is_toggle="true"
- label="Search"
- layout="topleft"
- left="0"
- name="search_btn"
- tool_tip="Shows/hides Search"
- top="5"
- use_ellipses="true"
- width="80">
- <init_callback
- function="Button.SetFloaterToggle"
- parameter="search" />
- </bottomtray_button>
- </layout_panel>
- <layout_panel
- auto_resize="false"
- follows="left|right"
- height="28"
- layout="topleft"
- min_height="28"
- min_width="52"
- mouse_opaque="false"
- name="world_map_btn_panel"
- user_resize="false"
- width="83">
- <bottomtray_button
- follows="left|right"
- height="23"
- image_pressed="PushButton_Press"
- image_pressed_selected="PushButton_Selected_Press"
- image_selected="PushButton_Selected_Press"
- is_toggle="true"
- label="Map"
- layout="topleft"
- left="0"
- name="world_map_btn"
- tool_tip="Shows/hides World Map"
- top="5"
- use_ellipses="true"
- width="80">
- <init_callback
- function="Button.SetFloaterToggle"
- parameter="world_map" />
- </bottomtray_button>
- </layout_panel>
- <layout_panel
- auto_resize="false"
- follows="left|right"
- height="28"
- layout="topleft"
- min_height="28"
- min_width="52"
- mouse_opaque="false"
- name="mini_map_btn_panel"
- user_resize="false"
- width="83">
- <bottomtray_button
- follows="left|right"
- height="23"
- image_pressed="PushButton_Press"
- image_pressed_selected="PushButton_Selected_Press"
- image_selected="PushButton_Selected_Press"
- is_toggle="true"
- label="Mini-Map"
- layout="topleft"
- left="0"
- name="mini_map_btn"
- tool_tip="Shows/hides Mini-Map"
- top="5"
- use_ellipses="true"
- width="80">
- <init_callback
- function="Button.SetFloaterToggle"
- parameter="mini_map" />
- </bottomtray_button>
- </layout_panel>
- <layout_panel
- follows="left|right"
- height="30"
- layout="topleft"
- min_width="95"
- mouse_opaque="false"
- name="chiclet_list_panel"
- top="0"
- user_resize="false"
- width="189">
-<!--*NOTE: min_width of the chiclet_panel (chiclet_list) must be the same
-as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly. EXT-991-->
- <chiclet_panel
- chiclet_padding="4"
- follows="left|right"
- height="24"
- layout="topleft"
- left="1"
- min_width="95"
- mouse_opaque="false"
- name="chiclet_list"
- top="7"
- width="189">
- <button
- auto_resize="true"
- follows="right"
- height="29"
- image_hover_selected="SegmentedBtn_Left_Over"
- image_hover_unselected="SegmentedBtn_Left_Over"
- image_overlay="Arrow_Small_Left"
- image_pressed="SegmentedBtn_Left_Press"
- image_pressed_selected="SegmentedBtn_Left_Press"
- image_selected="SegmentedBtn_Left_Off"
- image_unselected="SegmentedBtn_Left_Off"
- layout="topleft"
- name="chicklet_left_scroll_button"
- tab_stop="false"
- top="-28"
- visible="false"
- width="7" />
- <button
- auto_resize="true"
- follows="right"
- height="29"
- image_hover_selected="SegmentedBtn_Right_Over"
- image_hover_unselected="SegmentedBtn_Right_Over"
- image_overlay="Arrow_Small_Right"
- image_pressed="SegmentedBtn_Right_Press"
- image_pressed_selected="SegmentedBtn_Right_Press"
- image_selected="SegmentedBtn_Right_Off"
- image_unselected="SegmentedBtn_Right_Off"
- layout="topleft"
- name="chicklet_right_scroll_button"
- tab_stop="false"
- top="-28"
- visible="false"
- width="7" />
- </chiclet_panel>
- </layout_panel>
- <layout_panel auto_resize="false"
- user_resize="false"
- width="4"
- min_width="4"/>
- <layout_panel
- auto_resize="false"
- follows="right"
- height="28"
- layout="topleft"
- min_height="28"
- min_width="37"
- name="im_well_panel"
- top="0"
- user_resize="false"
- width="37">
- <chiclet_im_well
- follows="right"
- height="28"
- layout="topleft"
- left="0"
- max_displayed_count="99"
- name="im_well"
- top="0"
- width="35">
- <!--
-Emulate 4 states of button by background images, see details in EXT-3147. The same should be for notification_well button
-xml attribute Description
-image_unselected "Unlit" - there are no new messages
-image_selected "Unlit" + "Selected" - there are no new messages and the Well is open
-image_pressed "Lit" - there are new messages
-image_pressed_selected "Lit" + "Selected" - there are new messages and the Well is open
- -->
- <button
- auto_resize="true"
- follows="right"
- halign="center"
- height="23"
- image_overlay="Unread_IM"
- image_overlay_alignment="center"
- image_pressed="WellButton_Lit"
- image_pressed_selected="WellButton_Lit_Selected"
- image_selected="PushButton_Press"
- label_color="Black"
- left="0"
- name="Unread IM messages"
- tool_tip="Conversations"
- width="34">
- <init_callback
- function="Button.SetDockableFloaterToggle"
- parameter="im_well_window" />
- </button>
- </chiclet_im_well>
- </layout_panel>
- <layout_panel
- auto_resize="false"
- follows="right"
- height="28"
- layout="topleft"
- min_height="28"
- min_width="37"
- name="notification_well_panel"
- top="0"
- user_resize="false"
- width="37">
- <chiclet_notification
- follows="right"
- height="23"
- layout="topleft"
- left="0"
- max_displayed_count="99"
- name="notification_well"
- top="5"
- width="35">
- <button
- auto_resize="true"
- bottom_pad="3"
- follows="right"
- halign="center"
- height="23"
- image_overlay="Notices_Unread"
- image_overlay_alignment="center"
- image_pressed="WellButton_Lit"
- image_pressed_selected="WellButton_Lit_Selected"
- image_selected="PushButton_Press"
- label_color="Black"
- left="0"
- name="Unread"
- tool_tip="Notifications"
- width="34">
- <init_callback
- function="Button.SetDockableFloaterToggle"
- parameter="notification_well_window" />
- </button>
- </chiclet_notification>
- </layout_panel>
- <layout_panel
- auto_resize="false"
- user_resize="false"
- min_width="4"
- name="DUMMY2"
- width="8" />
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray_lite.xml b/indra/newview/skins/default/xui/en/panel_bottomtray_lite.xml
index efb1da4c05..f4722b05d6 100644
--- a/indra/newview/skins/default/xui/en/panel_bottomtray_lite.xml
+++ b/indra/newview/skins/default/xui/en/panel_bottomtray_lite.xml
@@ -10,6 +10,7 @@
layout="topleft"
left="0"
name="bottom_tray_lite"
+ focus_root="true"
tab_stop="true"
top="28"
chrome="true"
@@ -30,7 +31,6 @@
width="1000">
<layout_panel
auto_resize="false"
- user_resize="false"
min_width="2"
width="2" />
<layout_panel
@@ -39,8 +39,7 @@
height="28"
layout="topleft"
width="310"
- min_width="188"
- user_resize="false">
+ min_width="188">
<panel
left="0"
filename="panel_nearby_chat_bar.xml"
@@ -60,8 +59,7 @@
width="82"
top_delta="0"
min_width="52"
- name="gesture_panel"
- user_resize="false">
+ name="gesture_panel">
<gesture_combo_list
follows="left|right"
height="23"
@@ -79,7 +77,6 @@
</layout_panel>
<layout_panel
auto_resize="false"
- user_resize="false"
min_width="3"
name="after_gesture_panel"
width="3"/>
diff --git a/indra/newview/skins/default/xui/en/panel_chat_header.xml b/indra/newview/skins/default/xui/en/panel_chat_header.xml
index 17e8d4d2df..5c5c718bdf 100644
--- a/indra/newview/skins/default/xui/en/panel_chat_header.xml
+++ b/indra/newview/skins/default/xui/en/panel_chat_header.xml
@@ -23,7 +23,7 @@
<text
parse_urls="false"
allow_scroll="false"
- v_pad = "7"
+ v_pad = "6"
read_only = "true"
follows="left|right"
font.style="BOLD"
@@ -35,9 +35,10 @@
text_color="white"
bg_readonly_color="black"
top="0"
+ translate="false"
use_ellipses="true"
- valign="bottom"
- value="Ericag Vader" />
+ valign="top"
+ value="TestString PleaseIgnore" />
<text
allow_scroll="false"
font="SansSerifSmall"
@@ -48,7 +49,7 @@
left_pad="5"
name="time_box"
right="-5"
- top="8"
+ top="7"
value="23:30"
width="110" />
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_chat_item.xml b/indra/newview/skins/default/xui/en/panel_chat_item.xml
index 34c6e02684..1ef99649e6 100644
--- a/indra/newview/skins/default/xui/en/panel_chat_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_chat_item.xml
@@ -2,7 +2,7 @@
<!-- All our XML is utf-8 encoded. -->
<panel
name="instant_message"
- width="315"
+ width="300"
height="180"
follows="all">
<avatar_icon
@@ -16,12 +16,14 @@
top="3"
width="18" />
<text_chat
- top="5"
+ top="3"
left="30"
+ right="-10"
height="120"
text_color="white"
word_wrap="true"
mouse_opaque="true"
+ valign="top"
name="msg_text">
</text_chat>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_chiclet_bar.xml b/indra/newview/skins/default/xui/en/panel_chiclet_bar.xml
new file mode 100644
index 0000000000..ff0146490b
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_chiclet_bar.xml
@@ -0,0 +1,173 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ background_visible="false"
+ chrome="true"
+ follows="left|top|right"
+ height="30"
+ layout="topleft"
+ mouse_opaque="false"
+ name="chiclet_bar"
+ width="1310">
+ <layout_stack
+ border_size="0"
+ clip="false"
+ follows="all"
+ height="30"
+ layout="topleft"
+ left="0"
+ mouse_opaque="false"
+ name="toolbar_stack"
+ orientation="horizontal"
+ top="0"
+ width="1310">
+ <layout_panel
+ follows="left|right"
+ height="30"
+ layout="topleft"
+ min_width="95"
+ mouse_opaque="false"
+ name="chiclet_list_panel"
+ auto_resize="true"
+ top="0"
+ width="189">
+ <chiclet_panel
+ chiclet_padding="4"
+ follows="left|right"
+ height="24"
+ layout="topleft"
+ left="1"
+ min_width="95"
+ mouse_opaque="false"
+ name="chiclet_list"
+ top="7"
+ width="189">
+ <button
+ auto_resize="false"
+ follows="right"
+ height="29"
+ image_hover_selected="SegmentedBtn_Left_Over"
+ image_hover_unselected="SegmentedBtn_Left_Over"
+ image_overlay="Arrow_Small_Left"
+ image_pressed="SegmentedBtn_Left_Press"
+ image_pressed_selected="SegmentedBtn_Left_Press"
+ image_selected="SegmentedBtn_Left_Off"
+ image_unselected="SegmentedBtn_Left_Off"
+ layout="topleft"
+ name="chicklet_left_scroll_button"
+ tab_stop="false"
+ top="-28"
+ visible="false"
+ width="12" />
+ <button
+ auto_resize="false"
+ follows="right"
+ height="29"
+ image_hover_selected="SegmentedBtn_Right_Over"
+ image_hover_unselected="SegmentedBtn_Right_Over"
+ image_overlay="Arrow_Small_Right"
+ image_pressed="SegmentedBtn_Right_Press"
+ image_pressed_selected="SegmentedBtn_Right_Press"
+ image_selected="SegmentedBtn_Right_Off"
+ image_unselected="SegmentedBtn_Right_Off"
+ layout="topleft"
+ name="chicklet_right_scroll_button"
+ tab_stop="false"
+ top="-28"
+ visible="false"
+ width="12" />
+ </chiclet_panel>
+ </layout_panel>
+ <layout_panel auto_resize="false"
+ width="4"
+ min_width="4"/>
+ <layout_panel
+ auto_resize="false"
+ follows="right"
+ height="28"
+ layout="topleft"
+ min_height="28"
+ min_width="37"
+ name="im_well_panel"
+ top="0"
+ width="37">
+ <chiclet_im_well
+ follows="right"
+ height="28"
+ layout="topleft"
+ left="0"
+ max_displayed_count="99"
+ name="im_well"
+ top="0"
+ width="35">
+ <!--
+Emulate 4 states of button by background images, see details in EXT-3147. The same should be for notification_well button
+xml attribute Description
+image_unselected "Unlit" - there are no new messages
+image_selected "Unlit" + "Selected" - there are no new messages and the Well is open
+image_pressed "Lit" - there are new messages
+image_pressed_selected "Lit" + "Selected" - there are new messages and the Well is open
+ -->
+ <button
+ auto_resize="false"
+ follows="right"
+ halign="center"
+ height="23"
+ image_overlay="Unread_IM"
+ image_overlay_alignment="center"
+ image_pressed="WellButton_Lit"
+ image_pressed_selected="WellButton_Lit_Selected"
+ image_selected="PushButton_Press"
+ label_color="Black"
+ left="0"
+ name="Unread IM messages"
+ tool_tip="Conversations"
+ width="34">
+ <init_callback
+ function="Button.SetDockableFloaterToggle"
+ parameter="im_well_window" />
+ </button>
+ </chiclet_im_well>
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ follows="right"
+ height="28"
+ layout="topleft"
+ min_height="28"
+ min_width="37"
+ name="notification_well_panel"
+ top="0"
+ width="37">
+ <chiclet_notification
+ follows="right"
+ height="23"
+ layout="topleft"
+ left="0"
+ max_displayed_count="99"
+ name="notification_well"
+ top="5"
+ width="35">
+ <button
+ auto_resize="false"
+ bottom_pad="3"
+ follows="right"
+ halign="center"
+ height="23"
+ image_overlay="Notices_Unread"
+ image_overlay_alignment="center"
+ image_pressed="WellButton_Lit"
+ image_pressed_selected="WellButton_Lit_Selected"
+ image_selected="PushButton_Press"
+ label_color="Black"
+ left="0"
+ name="Unread"
+ tool_tip="Notifications"
+ width="34">
+ <init_callback
+ function="Button.SetDockableFloaterToggle"
+ parameter="notification_well_window" />
+ </button>
+ </chiclet_notification>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_classified_info.xml b/indra/newview/skins/default/xui/en/panel_classified_info.xml
index 0fb7691ee7..d4a2745d1d 100644
--- a/indra/newview/skins/default/xui/en/panel_classified_info.xml
+++ b/indra/newview/skins/default/xui/en/panel_classified_info.xml
@@ -49,7 +49,8 @@
left="10"
tab_stop="false"
top="2"
- width="30" />
+ width="30"
+ use_draw_context_alpha="false" />
<text
follows="top|left|right"
font="SansSerifHugeBold"
@@ -288,8 +289,7 @@
left="0"
top="0"
width="290"
- height="16"
- user_resize="false">
+ height="16">
<text
follows="left|top"
font.style="BOLD"
@@ -326,8 +326,7 @@
left="0"
top="0"
width="290"
- height="16"
- user_resize="false">
+ height="16">
<text
follows="left|top"
font.style="BOLD"
@@ -356,8 +355,7 @@
left="0"
top="0"
width="290"
- height="215"
- user_resize="false">
+ height="215">
<text
auto_resize="false"
follows="left|top"
@@ -415,7 +413,6 @@
layout="bottomleft"
left="0"
name="layout_panel1"
- user_resize="false"
auto_resize="true"
width="101">
<button
@@ -435,7 +432,6 @@
layout="bottomleft"
left_pad="3"
name="show_on_map_btn_lp"
- user_resize="false"
auto_resize="true"
width="100">
<button
@@ -454,7 +450,6 @@
layout="bottomleft"
left_pad="3"
name="edit_btn_lp"
- user_resize="false"
auto_resize="true"
width="101">
<button
diff --git a/indra/newview/skins/default/xui/en/panel_cof_wearables.xml b/indra/newview/skins/default/xui/en/panel_cof_wearables.xml
index f438e3d42d..aa8e3d07a6 100644
--- a/indra/newview/skins/default/xui/en/panel_cof_wearables.xml
+++ b/indra/newview/skins/default/xui/en/panel_cof_wearables.xml
@@ -37,6 +37,7 @@
top="0"
width="311" />
</accordion_tab>
+ <!-- The Attachments title is overwritten by the definition of "Attachments remain" in strings.xml -->
<accordion_tab
layout="topleft"
name="tab_attachments"
@@ -52,10 +53,7 @@
multi_select="true"
name="list_attachments"
top="0"
- width="311">
- <flat_list_view.no_items_text
- value="No attachments worn" />
- </flat_list_view>
+ width="311" />
</accordion_tab>
<accordion_tab
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/panel_dummy_clothing_list_item.xml b/indra/newview/skins/default/xui/en/panel_dummy_clothing_list_item.xml
index df459b4083..4b05ab27e4 100644
--- a/indra/newview/skins/default/xui/en/panel_dummy_clothing_list_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_dummy_clothing_list_item.xml
@@ -29,7 +29,7 @@
width="380" />
<icon
height="16"
- color="0.75 0.75 0.75 1"
+ color="LtGray"
follows="top|left"
image_name="Inv_Object"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/panel_edit_classified.xml b/indra/newview/skins/default/xui/en/panel_edit_classified.xml
index f60c1e62ac..3509eaa285 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_classified.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_classified.xml
@@ -33,7 +33,8 @@
left="10"
tab_stop="false"
top="2"
- width="30" />
+ width="30"
+ use_draw_context_alpha="false" />
<text
type="string"
length="1"
@@ -318,7 +319,6 @@
layout="bottomleft"
left="0"
name="save_changes_btn_lp"
- user_resize="false"
auto_resize="true"
width="156">
<button
@@ -338,7 +338,6 @@
layout="bottomleft"
left_pad="3"
name="show_on_map_btn_lp"
- user_resize="false"
auto_resize="true"
width="157">
<button
diff --git a/indra/newview/skins/default/xui/en/panel_edit_jacket.xml b/indra/newview/skins/default/xui/en/panel_edit_jacket.xml
index 8e8d8e6505..0f8c37c691 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_jacket.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_jacket.xml
@@ -32,7 +32,7 @@
name="Upper Fabric"
tool_tip="Click to choose a picture"
top="10"
- width="74" >
+ width="75" >
<texture_picker.commit_callback
function="TexturePicker.Commit" />
</texture_picker>
diff --git a/indra/newview/skins/default/xui/en/panel_edit_physics.xml b/indra/newview/skins/default/xui/en/panel_edit_physics.xml
new file mode 100644
index 0000000000..0092ceb0dd
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_edit_physics.xml
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+ <panel
+ background_visible="true"
+ follows="all"
+ height="400"
+ layout="topleft"
+ left="0"
+ name="edit_physics_panel"
+ top_pad="10"
+ width="333" >
+ <panel
+ border="false"
+ bg_alpha_color="DkGray2"
+ bg_opaque_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
+ follows="all"
+ height="388"
+ label=""
+ layout="topleft"
+ left="10"
+ name="accordion_panel"
+ top_pad="0"
+ width="313">
+ <accordion
+ follows="all"
+ height ="388"
+ layout="topleft"
+ left="0"
+ single_expansion="true"
+ fit_parent="true"
+ name="physics_accordion"
+ top="0"
+ width="313">
+ <accordion_tab
+ layout="topleft"
+ fit_panel="false"
+ min_height="50"
+ name="physics_breasts_updown_tab"
+ title="Breasts Bounce">
+ <scrolling_panel_list
+ follows="all"
+ layout="topleft"
+ left="10"
+ name="physics_breasts_updown_param_list"
+ top="10"
+ width="303" />
+ </accordion_tab>
+ <accordion_tab
+ layout="topleft"
+ fit_panel="false"
+ min_height="50"
+ name="physics_breasts_inout_tab"
+ title="Breasts Cleavage">
+ <scrolling_panel_list
+ follows="all"
+ layout="topleft"
+ left="0"
+ name="physics_breasts_inout_param_list"
+ top_pad="50"
+ width="303" />
+ </accordion_tab>
+ <accordion_tab
+ layout="topleft"
+ fit_panel="false"
+ min_height="50"
+ name="physics_breasts_leftright_tab"
+ title="Breasts Sway">
+ <scrolling_panel_list
+ follows="all"
+ layout="topleft"
+ left="0"
+ name="physics_breasts_leftright_param_list"
+ top_pad="50"
+ width="303" />
+ </accordion_tab>
+ <accordion_tab
+ layout="topleft"
+ fit_panel="false"
+ min_height="50"
+ name="physics_belly_tab"
+ title="Belly Bounce">
+ <scrolling_panel_list
+ follows="all"
+ layout="topleft"
+ left="0"
+ name="physics_belly_updown_param_list"
+ top_pad="40"
+ width="303" />
+ </accordion_tab>
+
+ <accordion_tab
+ layout="topleft"
+ fit_panel="false"
+ min_height="50"
+ name="physics_butt_tab"
+ title="Butt Bounce">
+ <scrolling_panel_list
+ follows="all"
+ layout="topleft"
+ left="0"
+ name="physics_butt_updown_param_list"
+ top_pad="30"
+ width="303" />
+ </accordion_tab>
+
+ <accordion_tab
+ layout="topleft"
+ fit_panel="false"
+ min_height="50"
+ name="physics_butt_leftright_tab"
+ title="Butt Sway">
+ <scrolling_panel_list
+ follows="all"
+ layout="topleft"
+ left="0"
+ name="physics_butt_leftright_param_list"
+ top_pad="20"
+ width="303" />
+ </accordion_tab>
+ <accordion_tab
+ layout="topleft"
+ fit_panel="false"
+ min_height="50"
+ name="physics_advanced_tab"
+ title="Advanced Parameters">
+ <scrolling_panel_list
+ follows="all"
+ layout="topleft"
+ left="0"
+ name="physics_advanced_param_list"
+ top_pad="10"
+ width="303" />
+ </accordion_tab>
+ </accordion>
+ </panel>
+</panel>
+
diff --git a/indra/newview/skins/default/xui/en/panel_edit_pick.xml b/indra/newview/skins/default/xui/en/panel_edit_pick.xml
index a284d3ccc0..0faa1598b1 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_pick.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_pick.xml
@@ -27,7 +27,8 @@
left="10"
tab_stop="false"
top="2"
- width="30" />
+ width="30"
+ use_draw_context_alpha="false" />
<text
type="string"
length="1"
@@ -182,17 +183,17 @@
left="8"
name="bottom_panel"
top_pad="5"
- width="303">
+ width="315">
<layout_stack
follows="bottom|left|right"
height="23"
layout="topleft"
name="layout_stack1"
- left="2"
+ left="0"
orientation="horizontal"
top_pad="0"
- width="303">
+ width="313">
<layout_panel
follows="bottom|left|right"
@@ -200,7 +201,6 @@
layout="topleft"
left="0"
name="layout_panel1"
- user_resize="false"
auto_resize="true"
width="150">
<button
@@ -219,10 +219,9 @@
height="23"
layout="topleft"
left_pad="4"
- name="layout_panel1"
- user_resize="false"
+ name="layout_panel2"
auto_resize="true"
- width="150">
+ width="146">
<button
follows="bottom|left|right"
height="23"
@@ -231,7 +230,7 @@
name="cancel_btn"
top="0"
left="1"
- width="149" />
+ width="145" />
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/en/panel_edit_profile.xml b/indra/newview/skins/default/xui/en/panel_edit_profile.xml
index 90dbddaff7..2c7c8133d1 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_profile.xml
@@ -127,7 +127,8 @@
name="solo_user_name"
text_color="white"
top_delta="3"
- value="Hamilton Hitchings"
+ translate="false"
+ value="TestString PleaseIgnore"
use_ellipses="true"
visible="false"
width="275" />
@@ -140,7 +141,8 @@
name="user_name"
text_color="white"
top_delta="0"
- value="Hamilton Hitchings"
+ translate="false"
+ value="TestString PleaseIgnore"
use_ellipses="true"
visible="true"
width="250" />
@@ -153,7 +155,8 @@
name="user_name_small"
text_color="white"
top_delta="-4"
- value="Hamilton Hitchings"
+ translate="false"
+ value="TestString PleaseIgnore"
use_ellipses="true"
visible="false"
wrap="true"
@@ -177,8 +180,9 @@
text_color="EmphasisColor"
font="SansSerifBold"
top_delta="-2"
+ translate="false"
use_ellipses="true"
- value="hamilton.linden"
+ value="teststring.pleaseignore"
wrap="true"
width="205" />
<panel
@@ -328,17 +332,6 @@
name="homepage_edit"
width="272">
</line_editor>
- <check_box
- follows="left|top"
- font="SansSerifSmall"
- label="Show me in Search results"
- layout="topleft"
- left="8"
- name="show_in_search_checkbox"
- height="15"
- label_text.text_color="white"
- top_pad="12"
- width="100" />
<text
follows="left|top"
font="SansSerifSmall"
@@ -442,7 +435,6 @@
layout="bottomleft"
name="save_changes_btn_lp"
top="0"
- user_resize="false"
auto_resize="true"
width="153">
<button
@@ -463,7 +455,6 @@
left_pad="3"
name="show_on_map_btn_lp"
top="0"
- user_resize="false"
auto_resize="true"
width="154">
<button
diff --git a/indra/newview/skins/default/xui/en/panel_edit_skin.xml b/indra/newview/skins/default/xui/en/panel_edit_skin.xml
index 45591ba2ad..b61f65a3d1 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_skin.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_skin.xml
@@ -27,10 +27,10 @@
default_image_name="Default"
follows="left|top"
height="80"
- label="Head Tattoos"
+ label="Head"
layout="topleft"
left="25"
- name="Head Tattoos"
+ name="Head"
tool_tip="Click to choose a picture"
top="10"
width="74" >
@@ -43,10 +43,10 @@
default_image_name="Default"
follows="left|top"
height="80"
- label="Upper Tattoos"
+ label="Upper body"
layout="topleft"
left_pad="20"
- name="Upper Tattoos"
+ name="Upper Body"
tool_tip="Click to choose a picture"
top="10"
width="74" >
@@ -59,10 +59,10 @@
default_image_name="Default"
follows="left|top"
height="80"
- label="Lower Tattoos"
+ label="Lower body"
layout="topleft"
left_pad="20"
- name="Lower Tattoos"
+ name="Lower Body"
tool_tip="Click to choose a picture"
top="10"
width="74" >
diff --git a/indra/newview/skins/default/xui/en/panel_edit_wearable.xml b/indra/newview/skins/default/xui/en/panel_edit_wearable.xml
index b3e9586ee9..f34b913218 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_wearable.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_wearable.xml
@@ -72,6 +72,10 @@
Editing Tattoo
</string>
<string
+ name="edit_physics_title">
+ Editing Physics
+ </string>
+ <string
name="shape_desc_text">
Shape:
</string>
@@ -131,6 +135,10 @@
name="tattoo_desc_text">
Tattoo:
</string>
+ <string
+ name="physics_desc_text">
+ Physics:
+ </string>
<!-- Default width of the button should be to show it without label.
Button will be extedned in code to show whole label when wearable is being changed.
-->
@@ -147,7 +155,8 @@
pad_left="24"
tool_tip="Return to Edit Outfit"
top="3"
- width="30" />
+ width="30"
+ use_draw_context_alpha="false" />
<text
follows="top|left|right"
font="SansSerifHugeBold"
@@ -155,7 +164,7 @@
layout="topleft"
left_pad="8"
name="edit_wearable_title"
- text_color="white"
+ text_color="White"
top="3"
value="Editing Shape"
use_ellipses="true"
@@ -181,7 +190,7 @@
layout="topleft"
left="10"
name="description_text"
- text_color="white"
+ text_color="White"
top="10"
value="Shape:"
width="150" />
@@ -245,7 +254,7 @@
name="description"
prevalidate_callback="ascii"
select_on_focus="true"
- text_color="black"
+ text_color="Black"
top_pad="3"
width="290" />
</panel>
@@ -409,6 +418,16 @@
top="8"
visible="false"
width="333" />
+ <panel
+ filename="panel_edit_physics.xml"
+ follows="all"
+ height="425"
+ layout="topleft"
+ left="0"
+ name="edit_physics_panel"
+ top="8"
+ visible="false"
+ width="333" />
</panel>
<panel
follows="bottom|left|right"
@@ -435,7 +454,6 @@
left="0"
mouse_opaque="false"
name="save_as_btn_lp"
- user_resize="false"
auto_resize="true"
width="154">
<button
@@ -455,7 +473,6 @@
left_pad="3"
mouse_opaque="false"
name="revert_btn_lp"
- user_resize="false"
auto_resize="true"
width="152">
<button
diff --git a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml b/indra/newview/skins/default/xui/en/panel_group_control_panel.xml
index c1dc2aaaf7..ad10e53a4e 100644
--- a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_control_panel.xml
@@ -26,8 +26,7 @@
mouse_opaque="false"
width="145"
top="0"
- name="speakers_list_panel"
- user_resize="false">
+ name="speakers_list_panel">
<avatar_list
color="DkGray2"
follows="all"
@@ -48,8 +47,7 @@
layout="topleft"
min_height="28"
width="130"
- name="group_info_btn_panel"
- user_resize="false">
+ name="group_info_btn_panel">
<button
follows="left|right|bottom"
height="23"
@@ -66,8 +64,7 @@
layout="topleft"
min_height="28"
width="130"
- name="call_btn_panel"
- user_resize="false">
+ name="call_btn_panel">
<button
follows="all"
height="23"
@@ -84,7 +81,6 @@
min_height="28"
width="130"
name="end_call_btn_panel"
- user_resize="false"
visible="false">
<button
follows="all"
@@ -101,7 +97,6 @@
min_height="28"
width="130"
name="voice_ctrls_btn_panel"
- user_resize="false"
visible="false">
<button
follows="all"
diff --git a/indra/newview/skins/default/xui/en/panel_group_general.xml b/indra/newview/skins/default/xui/en/panel_group_general.xml
index 70b96ca5eb..38b680ba86 100644
--- a/indra/newview/skins/default/xui/en/panel_group_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_general.xml
@@ -21,7 +21,7 @@ Hover your mouse over the options for more help.
</panel.string>
<panel
name="group_info_top"
- follows="top|left"
+ follows="top|left|right"
top="0"
left="0"
height="129"
@@ -43,7 +43,7 @@ Hover your mouse over the options for more help.
font="SansSerifSmall"
text_color="White_50"
width="190"
- follows="top|left"
+ follows="top|left|right"
layout="topleft"
mouse_opaque="false"
type="string"
@@ -55,7 +55,7 @@ Hover your mouse over the options for more help.
Founder:
</text>
<text
- follows="left|top"
+ follows="left|top|right"
height="16"
layout="topleft"
left_delta="-2"
diff --git a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml
index 0347d2feec..206496cc0e 100644
--- a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml
@@ -45,7 +45,8 @@ background_visible="true"
left="7"
tab_stop="false"
top="2"
- width="30" />
+ width="30"
+ use_draw_context_alpha="false" />
<text_editor
allow_scroll="false"
bg_visible="false"
@@ -96,6 +97,7 @@ background_visible="true"
follows="all"
layout="topleft"
auto_resize="true"
+ user_resize="true"
height="513"
width="313">
<accordion
@@ -194,7 +196,6 @@ background_visible="true"
layout="bottomleft"
left="0"
name="btn_refresh_lp"
- user_resize="false"
auto_resize="false"
width="24">
<button
@@ -214,7 +215,6 @@ background_visible="true"
layout="bottomleft"
left_pad="3"
name="btn_chat_lp"
- user_resize="false"
auto_resize="true"
width="91">
<button
@@ -233,7 +233,6 @@ background_visible="true"
layout="bottomleft"
left_pad="3"
name="call_btn_lp"
- user_resize="false"
auto_resize="true"
width="91">
<button
@@ -254,7 +253,6 @@ background_visible="true"
layout="bottomleft"
left_pad="3"
name="btn_apply_lp"
- user_resize="false"
auto_resize="true"
width="91">
<button
diff --git a/indra/newview/skins/default/xui/en/panel_group_invite.xml b/indra/newview/skins/default/xui/en/panel_group_invite.xml
index 15a3191bdf..cd834b61ce 100644
--- a/indra/newview/skins/default/xui/en/panel_group_invite.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_invite.xml
@@ -94,7 +94,7 @@
left_pad="2"
name="cancel_button"
top_delta="0"
- width="70" />
+ width="65" />
<string
name="GroupInvitation">
Group Invitation
diff --git a/indra/newview/skins/default/xui/en/panel_group_land_money.xml b/indra/newview/skins/default/xui/en/panel_group_land_money.xml
index 1270a21710..d4da55e32e 100644
--- a/indra/newview/skins/default/xui/en/panel_group_land_money.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_land_money.xml
@@ -67,23 +67,23 @@
<scroll_list.columns
label="Parcel"
name="name"
- width="47" />
+ relative_width="0.2" />
<scroll_list.columns
label="Region"
name="location"
- width="47" />
+ relative_width="0.2" />
<scroll_list.columns
label="Type"
name="type"
- width="47" />
+ relative_width="0.2" />
<scroll_list.columns
label="Area"
name="area"
- width="47" />
+ relative_width="0.2" />
<scroll_list.columns
label="Hidden"
name="hidden"
- width="47" />
+ relative_width="0.2" />
</scroll_list>
<text
type="string"
@@ -117,7 +117,7 @@
name="map_button"
top_delta="-4"
left_pad="0"
- width="60"
+ width="57"
enabled="false" />
<text
type="string"
@@ -272,6 +272,7 @@
top="0"
width="313">
<text_editor
+ font="Monospace"
enabled="false"
type="string"
follows="all"
diff --git a/indra/newview/skins/default/xui/en/panel_group_list_item.xml b/indra/newview/skins/default/xui/en/panel_group_list_item.xml
index 0b84ac03c5..12735026fa 100644
--- a/indra/newview/skins/default/xui/en/panel_group_list_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_list_item.xml
@@ -34,6 +34,7 @@
mouse_opaque="true"
left="5"
top="2"
+ use_draw_context_alpha="false"
width="20" />
<text
parse_urls="false"
@@ -62,7 +63,7 @@
<button
follows="right"
height="20"
- image_overlay="ForwardArrow_Off"
+ image_overlay="Web_Profile_Off"
layout="topleft"
left_pad="5"
right="-3"
diff --git a/indra/newview/skins/default/xui/en/panel_group_notices.xml b/indra/newview/skins/default/xui/en/panel_group_notices.xml
index 600b0e3b71..607e1bb213 100644
--- a/indra/newview/skins/default/xui/en/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_notices.xml
@@ -84,7 +84,7 @@ Maximum 200 per group daily
name="create_new_notice"
tool_tip="Create a new notice"
top_delta="0"
- width="93" />
+ width="127" />
<button
follows="top|left"
height="23"
@@ -128,7 +128,7 @@ Maximum 200 per group daily
layout="topleft"
name="lbl3"
top_pad="10"
- width="60">
+ width="62">
Subject:
</text>
<line_editor
@@ -141,7 +141,7 @@ Maximum 200 per group daily
max_length_bytes="63"
name="create_subject"
prevalidate_callback="ascii"
- width="220" />
+ width="218" />
<text
follows="left|top"
type="string"
@@ -151,7 +151,7 @@ Maximum 200 per group daily
left="10"
name="lbl4"
top_pad="5"
- width="60">
+ width="62">
Message:
</text>
<text_editor
@@ -162,7 +162,7 @@ Maximum 200 per group daily
max_length="511"
name="create_message"
top_delta="0"
- width="220"
+ width="218"
word_wrap="true" />
<text
follows="left|top"
diff --git a/indra/newview/skins/default/xui/en/panel_group_roles.xml b/indra/newview/skins/default/xui/en/panel_group_roles.xml
index a7178dc288..eea2606125 100644
--- a/indra/newview/skins/default/xui/en/panel_group_roles.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_roles.xml
@@ -172,7 +172,7 @@ including the Everyone and Owner Roles.
draw_heading="true"
draw_stripes="false"
heading_height="23"
- height="130"
+ height="132"
layout="topleft"
search_column="1"
left="0"
diff --git a/indra/newview/skins/default/xui/en/panel_hint.xml b/indra/newview/skins/default/xui/en/panel_hint.xml
index e2e9d0aef0..f7434f0330 100644
--- a/indra/newview/skins/default/xui/en/panel_hint.xml
+++ b/indra/newview/skins/default/xui/en/panel_hint.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
width="205"
- height="100">
+ height="34">
<text name="hint_title"
font="SansSerifMedium"
left="8"
@@ -15,8 +15,8 @@
left="8"
right="197"
top="26"
- bottom="92"
- follows="all"
+ bottom="26"
+ follows="left|right|bottom"
text_color="Black"
wrap="true"/>
<button right="197"
diff --git a/indra/newview/skins/default/xui/en/panel_hint_image.xml b/indra/newview/skins/default/xui/en/panel_hint_image.xml
new file mode 100644
index 0000000000..df05d50dc5
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_hint_image.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ width="305"
+ height="40"
+ layout="topleft">
+ <text name="hint_title"
+ font="SansSerifMedium"
+ left="8"
+ right="290"
+ top="8"
+ bottom="20"
+ follows="left|right|top"
+ text_color="Black"
+ wrap="false"/>
+ <layout_stack left="0"
+ top="25"
+ width="305"
+ height="0"
+ follows="left|top|right"
+ orientation="horizontal">
+ <layout_panel auto_resize="true" width="100"/>
+ <layout_panel auto_resize="true" width="0">
+ <icon name="hint_image"
+ top="0"
+ left="0"
+ height="0"
+ width="0"
+ follows="all"/>
+ </layout_panel>
+ <layout_panel auto_resize="true" width="100"/>
+ </layout_stack>
+ <text name="hint_text"
+ left="8"
+ right="297"
+ top="30"
+ bottom="30"
+ follows="left|right|bottom"
+ text_color="Black"
+ wrap="true"/>
+ <button right="297"
+ top="8"
+ width="16"
+ height="16"
+ name="close"
+ follows="right|top"
+ image_color="DkGray"
+ image_unselected="Icon_Close_Foreground"
+ image_selected="Icon_Close_Press"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_im_control_panel.xml b/indra/newview/skins/default/xui/en/panel_im_control_panel.xml
index 9f73b7c540..8fcd6ccbaf 100644
--- a/indra/newview/skins/default/xui/en/panel_im_control_panel.xml
+++ b/indra/newview/skins/default/xui/en/panel_im_control_panel.xml
@@ -32,8 +32,7 @@
min_height="20"
width="140"
name="view_profile_btn_panel"
- top="0"
- user_resize="false">
+ top="0" >
<button
follows="left|top|right"
height="23"
@@ -49,8 +48,7 @@
layout="topleft"
min_height="25"
width="140"
- name="add_friend_btn_panel"
- user_resize="false">
+ name="add_friend_btn_panel">
<button
follows="left|top|right"
height="23"
@@ -66,8 +64,7 @@
layout="topleft"
min_height="25"
width="140"
- name="teleport_btn_panel"
- user_resize="false">
+ name="teleport_btn_panel">
<button
auto_resize="false"
follows="left|top|right"
@@ -84,8 +81,7 @@
layout="topleft"
min_height="25"
width="140"
- name="share_btn_panel"
- user_resize="false">
+ name="share_btn_panel">
<button
auto_resize="true"
follows="left|top|right"
@@ -101,8 +97,7 @@
layout="topleft"
min_height="25"
width="140"
- name="pay_btn_panel"
- user_resize="false">
+ name="pay_btn_panel">
<button
auto_resize="true"
follows="left|top|right"
@@ -118,8 +113,7 @@
layout="topleft"
min_height="25"
width="140"
- name="call_btn_panel"
- user_resize="false">
+ name="call_btn_panel">
<button
follows="left|top|right"
height="23"
@@ -135,7 +129,6 @@
min_height="25"
width="140"
name="end_call_btn_panel"
- user_resize="false"
visible="false">
<button
follows="left|top|right"
@@ -152,7 +145,6 @@
min_height="25"
width="140"
name="voice_ctrls_btn_panel"
- user_resize="false"
visible="false">
<button
follows="left|top|right"
@@ -169,7 +161,6 @@
layout="topleft"
min_height="0"
width="140"
- name="spacer"
- user_resize="false" />
+ name="spacer"/>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_inbox_inventory.xml b/indra/newview/skins/default/xui/en/panel_inbox_inventory.xml
new file mode 100644
index 0000000000..413e22e444
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_inbox_inventory.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<inbox_inventory_panel
+ accepts_drag_and_drop="false"
+ name="inventory_inbox"
+ start_folder="Received Items"
+ follows="all" layout="topleft"
+ top="0" left="0" height="165" width="308"
+ top_pad="0"
+ bg_opaque_color="DkGray2"
+ bg_alpha_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
+ border="false"
+ bevel_style="none"
+ show_item_link_overlays="true"
+ >
+ <scroll reserve_scroll_corner="false" />
+</inbox_inventory_panel>
diff --git a/indra/newview/skins/default/xui/en/panel_instant_message.xml b/indra/newview/skins/default/xui/en/panel_instant_message.xml
index 021cf00d03..2e5d650902 100644
--- a/indra/newview/skins/default/xui/en/panel_instant_message.xml
+++ b/indra/newview/skins/default/xui/en/panel_instant_message.xml
@@ -15,7 +15,7 @@
<panel
background_visible="true"
bevel_style="in"
- bg_alpha_color="black"
+ bg_alpha_color="Black"
follows="top"
height="24"
label="im_header"
@@ -63,10 +63,12 @@
layout="topleft"
left_pad="5"
name="user_name"
- text_color="white"
+ parse_urls="false"
+ text_color="White"
top="8"
+ translate="false"
use_ellipses="true"
- value="Erica Vader"
+ value="TestString PleaseIgnore"
width="205" />
<!-- TIME STAMP -->
<text
@@ -88,7 +90,7 @@
layout="topleft"
left="10"
name="message"
- text_color="white"
+ text_color="White"
top="33"
use_ellipses="true"
value=""
diff --git a/indra/newview/skins/default/xui/en/panel_landmark_info.xml b/indra/newview/skins/default/xui/en/panel_landmark_info.xml
index 6ee2abc70f..fd6e96b9a7 100644
--- a/indra/newview/skins/default/xui/en/panel_landmark_info.xml
+++ b/indra/newview/skins/default/xui/en/panel_landmark_info.xml
@@ -68,7 +68,8 @@
tool_tip="Back"
tab_stop="false"
top="4"
- width="30" />
+ width="30"
+ use_draw_context_alpha="false" />
<text
follows="top|left|right"
font="SansSerifHugeBold"
@@ -270,7 +271,7 @@
<text_editor
bg_readonly_color="DkGray2"
follows="all"
- height="70"
+ height="75"
layout="topleft"
left="0"
max_length="127"
@@ -287,7 +288,7 @@
layout="topleft"
left="0"
name="folder_label"
- top_pad="15"
+ top_pad="10"
value="Landmark location:"
width="290" />
<combo_box
diff --git a/indra/newview/skins/default/xui/en/panel_login.xml b/indra/newview/skins/default/xui/en/panel_login.xml
index b181ca3bba..223326dd06 100644
--- a/indra/newview/skins/default/xui/en/panel_login.xml
+++ b/indra/newview/skins/default/xui/en/panel_login.xml
@@ -5,17 +5,14 @@ height="600"
layout="topleft"
left="0"
name="panel_login"
+focus_root="true"
top="600"
width="996">
<panel.string
name="create_account_url">
http://join.secondlife.com/
</panel.string>
-<panel.string
- name="real_url" translate="false">
- http://secondlife.com/app/login/
-</panel.string>
- <string name="reg_in_client_url" translate="false">
+<string name="reg_in_client_url" translate="false">
http://secondlife.eniac15.lindenlab.com/reg-in-client/
</string>
<panel.string
@@ -25,18 +22,17 @@ top="600"
<!-- *NOTE: Custom resize logic for login_html in llpanellogin.cpp -->
<web_browser
tab_stop="false"
-trusted_content="true"
-bg_opaque_color="Black"
-border_visible="false"
-bottom="600"
-follows="all"
-hide_loading="true"
-left="0"
-name="login_html"
-start_url=""
-top="0"
-height="600"
- width="980" />
+ trusted_content="true"
+ bg_opaque_color="Black"
+ border_visible="false"
+ bottom="600"
+ follows="all"
+ left="0"
+ name="login_html"
+ start_url=""
+ top="0"
+ height="600"
+ width="980"/>
<layout_stack
follows="left|bottom|right"
name="login_widgets"
@@ -50,9 +46,8 @@ auto_resize="false"
follows="left|bottom"
name="login"
layout="topleft"
-width="695"
-min_width="695"
-user_resize="false"
+width="705"
+min_width="705"
height="80">
<text
follows="left|bottom"
@@ -64,23 +59,27 @@ left="20"
width="150">
Username:
</text>
-<line_editor
+<combo_box
+allow_text_entry="true"
follows="left|bottom"
height="22"
-label="bobsmith12 or Steller Sunshine"
left_delta="0"
-max_length_bytes="63"
-name="username_edit"
-prevalidate_callback="ascii"
-select_on_focus="true"
+max_chars="128"
+combo_editor.prevalidate_callback="ascii"
tool_tip="The username you chose when you registered, like bobsmith12 or Steller Sunshine"
top_pad="0"
-width="150" />
+name="username_combo"
+width="178">
+ <combo_box.combo_button
+ visible ="false"/>
+ <combo_box.drop_down_button
+ visible ="false"/>
+</combo_box>
<text
follows="left|bottom"
font="SansSerifSmall"
height="15"
-left_pad="8"
+left_pad="-19"
name="password_text"
top="20"
width="150">
@@ -91,6 +90,7 @@ follows="left|bottom"
height="22"
max_length_bytes="16"
name="password_edit"
+is_password="true"
select_on_focus="true"
top_pad="0"
width="135" />
@@ -119,21 +119,21 @@ label="Remember password"
follows="left|bottom"
font="SansSerifSmall"
height="15"
- left_pad="18"
+ left_pad="8"
name="start_location_text"
-top="20"
+ top="20"
width="130">
Start at:
</text>
<combo_box
allow_text_entry="true"
-control_name="LoginLocation"
+control_name="NextLoginLocation"
follows="left|bottom"
height="23"
max_chars="128"
top_pad="0"
name="start_location_combo"
- width="170">
+ width="165">
<combo_box.item
label="My last location"
name="MyLastLocation"
@@ -164,7 +164,6 @@ follows="right|bottom"
name="links"
width="205"
min_width="205"
-user_resize="false"
height="80">
<text
follows="right|bottom"
diff --git a/indra/newview/skins/default/xui/en/panel_main_inventory.xml b/indra/newview/skins/default/xui/en/panel_main_inventory.xml
index 2b6e082542..1c882bb099 100644
--- a/indra/newview/skins/default/xui/en/panel_main_inventory.xml
+++ b/indra/newview/skins/default/xui/en/panel_main_inventory.xml
@@ -1,12 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
- background_visible="true"
default_tab_group="1"
follows="all"
height="423"
label="Things"
layout="topleft"
- min_height="350"
+ min_height="300"
min_width="240"
name="main inventory panel"
width="330">
@@ -46,15 +45,11 @@
label="Filter Inventory"
layout="topleft"
left="10"
- max_length="300"
+ max_length_chars="300"
name="inventory search editor"
top="18"
width="303" />
<tab_container
- bg_alpha_color="DkGray"
- bg_opaque_color="DkGray"
- background_visible="true"
- background_opaque="true"
follows="all"
halign="center"
height="339"
@@ -71,7 +66,6 @@
bg_opaque_color="DkGray2"
bg_alpha_color="DkGray2"
background_visible="true"
- background_opaque="true"
border="false"
bevel_style="none"
follows="all"
@@ -82,14 +76,13 @@
left="0"
name="All Items"
sort_order_setting="InventorySortOrder"
- show_item_link_overlays="true"
+ show_item_link_overlays="true"
top="16"
width="288" />
<recent_inventory_panel
bg_opaque_color="DkGray2"
bg_alpha_color="DkGray2"
background_visible="true"
- background_opaque="true"
border="false"
bevel_style="none"
follows="all"
@@ -99,7 +92,7 @@
layout="topleft"
left_delta="0"
name="Recent Items"
- show_item_link_overlays="true"
+ show_item_link_overlays="true"
width="290" />
</tab_container>
<layout_stack
diff --git a/indra/newview/skins/default/xui/en/panel_me.xml b/indra/newview/skins/default/xui/en/panel_me.xml
index 84b5d11ba7..23e7814cad 100644
--- a/indra/newview/skins/default/xui/en/panel_me.xml
+++ b/indra/newview/skins/default/xui/en/panel_me.xml
@@ -10,43 +10,10 @@
name="panel_me"
top="0"
width="333">
- <!--<text
- type="string"
- follows="top|left|right"
- font="SansSerifHugeBold"
- height="20"
- layout="topleft"
- left="15"
- name="user_name"
- text_color="white"
- top="0"
- mouse_opaque="true"
- width="280">
- (Loading...)
- </text> -->
- <tab_container
- follows="all"
- height="555"
- halign="center"
- layout="topleft"
- left="5"
- name="tabs"
- tab_min_width="95"
- tab_height="30"
- tab_position="top"
- top_pad="10"
- width="317">
- <panel
- class="panel_my_profile"
- filename="panel_my_profile.xml"
- label="MY PROFILE"
- help_topic="panel_my_profile_tab"
- name="panel_profile" />
- <panel
- class="panel_picks"
- filename="panel_picks.xml"
- label="MY PICKS"
- help_topic="panel_my_picks_tab"
- name="panel_picks" />
- </tab_container>
+ <panel
+ class="panel_picks"
+ filename="panel_picks.xml"
+ label="MY PICKS"
+ help_topic="panel_my_picks_tab"
+ name="panel_picks"/>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_media_settings_general.xml b/indra/newview/skins/default/xui/en/panel_media_settings_general.xml
index 38e8b9844f..cdf14572fe 100644
--- a/indra/newview/skins/default/xui/en/panel_media_settings_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_media_settings_general.xml
@@ -196,7 +196,7 @@
initial_val="256"
label=""
label_width="0"
- left_delta="40"
+ left_delta="68"
max_val="2048"
min_val="0"
mouse_opaque="true"
diff --git a/indra/newview/skins/default/xui/en/panel_my_profile.xml b/indra/newview/skins/default/xui/en/panel_my_profile.xml
deleted file mode 100644
index 1b41f602cd..0000000000
--- a/indra/newview/skins/default/xui/en/panel_my_profile.xml
+++ /dev/null
@@ -1,348 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel
- follows="all"
- height="535"
- label="Profile"
- layout="topleft"
- left="0"
- name="panel_profile"
- top="0"
- width="315">
- <string
- name="CaptionTextAcctInfo">
- [ACCTTYPE]
-[PAYMENTINFO] [AGEVERIFICATION]
- </string>
- <string
- name="payment_update_link_url">
- http://www.secondlife.com/account/billing.php?lang=en
- </string>
- <string
- name="partner_edit_link_url">
- http://www.secondlife.com/account/partners.php?lang=en
- </string>
- <string
- name="my_account_link_url"
- value="http://secondlife.com/account" />
- <string
- name="no_partner_text"
- value="None" />
- <string
- name="no_group_text"
- value="None" />
- <string
- name="RegisterDateFormat">
- [REG_DATE] ([AGE])
- </string>
- <layout_stack
- name="layout"
- orientation="vertical"
- follows="all"
- layout="topleft"
- left="0"
- top="0"
- height="510"
- width="315"
- border_size="0">
- <layout_panel
- name="profile_stack"
- follows="all"
- layout="topleft"
- top="0"
- left="0"
- height="492"
- user_resize="false"
- width="315">
- <scroll_container
- color="DkGray2"
- follows="all"
- layout="topleft"
- left="0"
- name="profile_scroll"
- opaque="true"
- height="488"
- width="315"
- top="0">
- <panel
- layout="topleft"
- follows="left|top|right"
- height="488"
- name="scroll_content_panel"
- top="0"
- left="0"
- width="297">
- <panel
- follows="left|top|right"
- height="117"
- layout="topleft"
- left="10"
- name="second_life_image_panel"
- top="0"
- width="297">
- <texture_picker
- allow_no_texture="true"
- default_image_name="None"
- enabled="false"
- fallback_image="Generic_Person_Large"
- follows="top|left"
- height="124"
- layout="topleft"
- left="3"
- name="2nd_life_pic"
- top="10"
- width="102" />
- <icon
- height="102"
- image_name="Blank"
- layout="topleft"
- name="2nd_life_edit_icon"
- label=""
- left="3"
- tool_tip="Click the Edit Profile button below to change image"
- top="10"
- width="102" />
- <text
- follows="left|top|right"
- font.style="BOLD"
- height="15"
- layout="topleft"
- left_pad="10"
- name="title_sl_descr_text"
- text_color="white"
- top_delta="0"
- value="[SECOND_LIFE]:"
- width="180" />
- <expandable_text
- follows="left|top|right"
- height="95"
- layout="topleft"
- left="107"
- textbox.max_length="512"
- textbox.show_context_menu="true"
- name="sl_description_edit"
- top_pad="-3"
- translate="false"
- width="181"
- expanded_bg_visible="true"
- expanded_bg_color="DkGray">
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet ipsum. adipiscing elit. Aenean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet ipsum. adipiscing elit. Aenean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet ipsum.
- </expandable_text>
- </panel>
- <panel
- follows="left|top|right"
- height="117"
- layout="topleft"
- top_pad="0"
- left="10"
- name="first_life_image_panel"
- width="297">
- <texture_picker
- allow_no_texture="true"
- default_image_name="None"
- enabled="false"
- fallback_image="Generic_Person_Large"
- follows="top|left"
- height="124"
- layout="topleft"
- left="3"
- name="real_world_pic"
- width="102" />
- <icon
- height="102"
- image_name="Blank"
- layout="topleft"
- name="real_world_edit_icon"
- label=""
- left="3"
- tool_tip="Click the Edit Profile button below to change image"
- top="4"
- width="102" />
- <text
- follows="left|top|right"
- font.style="BOLD"
- height="15"
- layout="topleft"
- left_pad="10"
- name="title_rw_descr_text"
- text_color="white"
- top_delta="0"
- value="Real World:"
- width="180" />
- <expandable_text
- follows="left|top|right"
- height="95"
- layout="topleft"
- left="107"
- textbox.max_length="512"
- textbox.show_context_menu="true"
- name="fl_description_edit"
- top_pad="-3"
- translate="false"
- width="181"
- expanded_bg_visible="true"
- expanded_bg_color="DkGray">
- Lorem ipsum dolor sit amet, consectetur adlkjpiscing elit moose moose. Aenean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet. adipiscing elit. Aenean rigviverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet sorbet ipsum. adipiscing elit. Aenean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet ipsum.
- </expandable_text>
- </panel>
- <text
- follows="left|top"
- height="15"
- font.style="BOLD"
- font="SansSerifMedium"
- layout="topleft"
- left="10"
- name="homepage_edit"
- top_pad="0"
- translate="false"
- value="http://librarianavengers.org"
- width="300"
- word_wrap="false"
- use_ellipses="true"
- />
- <text
- follows="left|top"
- font.style="BOLD"
- height="10"
- layout="topleft"
- left="10"
- name="title_member_text"
- text_color="white"
- top_pad="10"
- value="Resident Since:"
- width="300" />
- <text_editor
- allow_scroll="false"
- bg_visible="false"
- follows="left|top"
- h_pad="0"
- height="15"
- layout="topleft"
- left="10"
- name="register_date"
- read_only="true"
- translate="false"
- v_pad="0"
- value="05/31/2376"
- width="300"
- word_wrap="true" />
- <text
- follows="left|top"
- font.style="BOLD"
- height="15"
- layout="topleft"
- left="10"
- name="title_acc_status_text"
- text_color="white"
- top_pad="5"
- value="Account Status:"
- width="300" />
- <!-- <text
- type="string"
- follows="left|top"
- font="SansSerifSmall"
- height="15"
- layout="topleft"
- left_pad="10"
- name="my_account_link"
- top_delta="0"
- value="Go to Dashboard"
- width="100"/> -->
- <text_editor
- allow_scroll="false"
- bg_visible="false"
- follows="left|top"
- h_pad="0"
- height="28"
- layout="topleft"
- left="10"
- name="acc_status_text"
- read_only="true"
- top_pad="0"
- translate="false"
- v_pad="0"
- width="300"
- word_wrap="true">
- Resident. No payment info on file.
- Linden.
- </text_editor>
- <text
- follows="left|top"
- font.style="BOLD"
- height="15"
- layout="topleft"
- left="10"
- name="title_partner_text"
- text_color="white"
- top_pad="3"
- value="Partner:"
- width="300" />
- <panel
- follows="left|top"
- height="15"
- layout="topleft"
- left="10"
- name="partner_data_panel"
- top_pad="0"
- width="300">
- <text
- follows="left|top"
- height="10"
- initial_value="(retrieving)"
- layout="topleft"
- left="0"
- link="true"
- name="partner_text"
- top="0"
- use_ellipses="true"
- width="300" />
- </panel>
- <text
- follows="left|top"
- font.style="BOLD"
- height="13"
- layout="topleft"
- left="10"
- name="title_groups_text"
- text_color="white"
- top_pad="3"
- value="Groups:"
- width="300" />
- <expandable_text
- follows="all"
- height="113"
- layout="topleft"
- left="7"
- name="sl_groups"
- top_pad="0"
- translate="false"
- textbox.show_context_menu="true"
- width="298"
- expanded_bg_visible="true"
- expanded_bg_color="DkGray">
- Lorem ipsum dolor sit amet, consectetur adlkjpiscing elit moose moose. Aenean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet. adipiscing elit. Aenean rigviverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet sorbet ipsum. adipiscing elit. Aenean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet ipsum. Aenean viverra tulip moosetop. Slan de heelish marfnik tooplod. Sum sum to whop de wompam booster copm.
- </expandable_text>
- </panel>
- </scroll_container>
- </layout_panel>
- </layout_stack>
- <panel
- follows="bottom|left|right"
- height="23"
- layout="topleft"
- left="0"
- top_pad="1"
- name="profile_me_buttons_panel"
- visible="false"
- width="315">
- <button
- follows="bottom"
- height="23"
- left="6"
- top="1"
- label="Edit Profile"
- name="edit_profile_btn"
- tool_tip="Edit your personal information"
- width="152" />
- </panel>
-
-</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml
index 082d51ed3c..3edeb9aa36 100644
--- a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml
@@ -4,21 +4,22 @@
background_visible="true"
bg_opaque_color="MouseGray"
follows="left|top|right"
- height="60"
+ focus_root="true"
+ height="34"
layout="topleft"
name="navigation_bar"
chrome="true"
- width="600">
+ width="800">
<icon
follows="all"
image_name="NavBar_BG"
mouse_opaque="false"
name="bg_icon"
scale_image="true"
- visible="true"
+ visible="false"
left="0"
top="0"
- height="60"
+ height="34"
width="600"/>
<icon
follows="all"
@@ -29,7 +30,7 @@
visible="false"
left="0"
top="0"
- height="60"
+ height="34"
width="600"/>
<icon
follows="all"
@@ -40,145 +41,164 @@
visible="false"
left="0"
top="0"
- height="60"
+ height="34"
width="600"/>
- <panel
- background_visible="false"
- follows="left|top|right"
- top="3"
- height="23"
- layout="topleft"
- name="navigation_panel"
- width="600">
- <pull_button
- follows="left|top"
- direction="down"
- height="23"
- image_overlay="Arrow_Left_Off"
- image_bottom_pad="1"
- layout="topleft"
- left="10"
- name="back_btn"
- tool_tip="Go back to previous location"
- top="2"
- width="31" />
- <pull_button
- follows="left|top"
- direction="down"
- height="23"
- image_overlay="Arrow_Right_Off"
- image_bottom_pad="1"
- layout="topleft"
- left_pad="0"
- name="forward_btn"
- tool_tip="Go forward one location"
- top_delta="0"
- width="31" />
- <button
- follows="left|top"
- height="23"
- image_bottom_pad="1"
- image_overlay="Home_Off"
- layout="topleft"
- left_pad="7"
- name="home_btn"
- tool_tip="Teleport to my home location"
- top_delta="0"
- width="32" />
- <location_input
- follows="left|right|top"
- halign="right"
- height="23"
- label="Location"
- layout="topleft"
- left_pad="7"
- max_chars="254"
- mouse_opaque="false"
- name="location_combo"
- top_delta="0"
- width="266">
- <combo_list
- mouse_wheel_opaque="true"/>
- <!-- *TODO: Delete. Let the location_input use the correct art sizes.
- <location_input.add_landmark_button
- height="18"
- name="location_combo_add"
- width="20" />
- <location_input.info_button
- height="18"
- name="location_combo_info"
- width="20" />
- -->
- </location_input>
- <!-- <button -->
- <!-- follows="right|top" -->
- <!-- height="20" -->
- <!-- image_disabled="TextField_Search_Off" -->
- <!-- image_disabled_selected="TextField_Search_Off" -->
- <!-- image_hover_selected="TextField_Search_Off" -->
- <!-- image_hover_unselected="TextField_Search_Off" -->
- <!-- image_selected="TextField_Search_Off" -->
- <!-- image_unselected="TextField_Search_Off" -->
- <!-- layout="topleft" -->
- <!-- left_pad="5" -->
- <!-- mouse_opaque="false" -->
- <!-- name="search_bg" -->
- <!-- top_delta="0" -->
- <!-- width="168" /> -->
- <search_combo_box
- follows="right|top"
- halign="right"
- height="23"
- label="Search"
- layout="topleft"
- right="-10"
- mouse_opaque="false"
- name="search_combo_box"
- tool_tip="Search"
- top_delta="0"
- width="200" >
- <combo_editor
- label="Search [SECOND_LIFE]"
- name="search_combo_editor"/>
- <combo_list
- draw_border="true"
- border.highlight_light_color="FocusColor"
- border.highlight_dark_color="FocusColor"
- border.shadow_light_color="FocusColor"
- border.shadow_dark_color="FocusColor"/>
- </search_combo_box>
- </panel>
- <favorites_bar
- follows="left|right|top"
- font="SansSerifSmall"
- height="15"
- layout="topleft"
- left="0"
- name="favorite"
- image_drag_indication="Accordion_ArrowOpened_Off"
- bottom="55"
- tool_tip="Drag Landmarks here for quick access to your favorite places in Second Life!"
- width="590">
- <label
- follows="left|top"
- height="15"
- layout="topleft"
- left="10"
- name="favorites_bar_label"
- text_color="LtGray"
- tool_tip="Drag Landmarks here for quick access to your favorite places in Second Life!"
- top="12"
- width="102">
- Favorites Bar
- </label>
- <chevron_button name=">>"
- image_unselected="TabIcon_Close_Off"
- image_selected="TabIcon_Close_Off"
- tab_stop="false"
- follows="left|bottom"
- tool_tip="Show more of My Favorites"
- width="15"
- top="15"
- height="15"/>
- </favorites_bar>
+ <icon
+ follows="all"
+ image_name="NavBar Separator"
+ mouse_opaque="false"
+ name="separator_image"
+ scale_image="true"
+ left="0"
+ top="0"
+ width="800"
+ height="2"/>
+ <layout_stack
+ follows="all"
+ height="34"
+ layout="topleft"
+ border_size="0"
+ resize_bar_overlap="3"
+ left="0"
+ mouse_opaque="false"
+ name="nvp_stack"
+ orientation="horizontal"
+ top="0"
+ width="800">
+ <layout_panel
+ follows="top|left"
+ layout="topleft"
+ auto_resize="true"
+ user_resize="true"
+ min_width="410"
+ name="navigation_layout_panel"
+ width="480">
+ <panel
+ background_visible="false"
+ follows="left|top|right"
+ top="3"
+ height="23"
+ layout="topleft"
+ left="0"
+ name="navigation_panel"
+ width="480">
+ <pull_button
+ follows="left|top"
+ direction="down"
+ height="23"
+ image_overlay="Arrow_Left_Off"
+ image_bottom_pad="1"
+ layout="topleft"
+ left="10"
+ name="back_btn"
+ tool_tip="Go back to previous location"
+ top="2"
+ width="31" />
+ <pull_button
+ follows="left|top"
+ direction="down"
+ height="23"
+ image_overlay="Arrow_Right_Off"
+ image_bottom_pad="1"
+ layout="topleft"
+ left_pad="0"
+ name="forward_btn"
+ tool_tip="Go forward one location"
+ top_delta="0"
+ width="31" />
+ <button
+ follows="left|top"
+ height="23"
+ image_bottom_pad="1"
+ image_overlay="Home_Off"
+ layout="topleft"
+ left_pad="7"
+ name="home_btn"
+ tool_tip="Teleport to my home location"
+ top_delta="0"
+ width="32" />
+ <location_input
+ follows="all"
+ halign="right"
+ height="23"
+ label="Location"
+ layout="topleft"
+ left_pad="7"
+ max_chars="254"
+ mouse_opaque="false"
+ name="location_combo"
+ top_delta="0"
+ width="355">
+ <combo_list
+ mouse_wheel_opaque="true"/>
+ </location_input>
+ </panel>
+ <icon
+ follows="top|right"
+ height="25"
+ image_name="ChatBarHandle"
+ layout="topleft"
+ left="-3"
+ name="resize_handle"
+ top="4"
+ width="5" />
+ </layout_panel>
+ <layout_panel
+ follows="top|left"
+ layout="topleft"
+ auto_resize="true"
+ user_resize="true"
+ min_width="185"
+ name="favorites_layout_panel"
+ width="320">
+ <icon
+ follows="top|left"
+ height="25"
+ image_name="ChatBarHandle"
+ layout="topleft"
+ left="-323"
+ name="resize_handle"
+ top="4"
+ width="5" />
+
+ <favorites_bar
+ follows="left|right|top"
+ font="SansSerifSmall"
+ height="20"
+ layout="topleft"
+ left="0"
+ top="4"
+ name="favorite"
+ image_drag_indication="Accordion_ArrowOpened_Off"
+ tool_tip="Drag Landmarks here for quick access to your favorite places in Second Life!"
+ width="320">
+ <label
+ follows="left|top"
+ height="13"
+ layout="topleft"
+ left="10"
+ name="favorites_bar_label"
+ text_color="LtGray"
+ tool_tip="Drag Landmarks here for quick access to your favorite places in Second Life!"
+ top="13"
+ valign="bottom"
+ width="102">
+ Favorites Bar
+ </label>
+ <!-- More button actually is a text box. -->
+ <more_button
+ follows="left|bottom"
+ name=">>"
+ tab_stop="false"
+ tool_tip="Show more of My Favorites"
+ top="13"
+ width="50"
+ bottom="0"
+ valign="bottom">
+ More &#9660;
+ </more_button>
+ </favorites_bar>
+ </layout_panel>
+
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_nearby_chat.xml b/indra/newview/skins/default/xui/en/panel_nearby_chat.xml
new file mode 100644
index 0000000000..d683116eb8
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_nearby_chat.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel
+ follows="all"
+ height="300"
+ help_topic="nearby_chat"
+ layout="topleft"
+ name="nearby_chat"
+ width="320">
+ <layout_stack
+ follows="all"
+ height="295"
+ layout="topleft"
+ left="0"
+ name="stack"
+ top="5"
+ orientation="vertical"
+ width="320">
+ <layout_panel
+ auto_resize="false"
+ height="26"
+ layout="topleft"
+ left_delta="0"
+ name="translate_chat_checkbox_lp"
+ top_delta="0"
+ visible="true"
+ width="313">
+ <check_box
+ top="10"
+ control_name="TranslateChat"
+ enabled="true"
+ height="16"
+ label="Translate chat"
+ layout="topleft"
+ left="5"
+ name="translate_chat_checkbox"
+ width="300" />
+ </layout_panel>
+ <layout_panel
+ auto_resize="true"
+ height="277"
+ left_delta="0"
+ layout="topleft"
+ name="chat_history_lp"
+ width="318">
+ <chat_history
+ bg_readonly_color="ChatHistoryBgColor"
+ bg_writeable_color="ChatHistoryBgColor"
+ follows="all"
+ layout="topleft"
+ left="5"
+ left_widget_pad="0"
+ height="272"
+ name="chat_history"
+ parse_highlights="true"
+ parse_urls="true"
+ right_widget_pad="5"
+ text_color="ChatHistoryTextColor"
+ text_readonly_color="ChatHistoryTextColor"
+ top="0"
+ width="313" />
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml
index 5871eb0654..21c627cdfb 100644
--- a/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml
@@ -45,9 +45,9 @@
left_pad="4"
image_disabled="ComboButton_UpOff"
image_unselected="ComboButton_UpOff"
- image_selected="ComboButton_Up_On_Selected"
+ image_selected="ComboButton_On"
image_pressed="ComboButton_UpSelected"
- image_pressed_selected="ComboButton_Up_On_Selected"
+ image_pressed_selected="ComboButton_Selected"
height="23"
name="show_nearby_chat"
tool_tip="Shows/hides nearby chat log">
diff --git a/indra/newview/skins/default/xui/en/panel_nearby_media.xml b/indra/newview/skins/default/xui/en/panel_nearby_media.xml
index 8c13ced8f3..d1cb64f7ad 100644
--- a/indra/newview/skins/default/xui/en/panel_nearby_media.xml
+++ b/indra/newview/skins/default/xui/en/panel_nearby_media.xml
@@ -68,24 +68,12 @@
right="-8"
width="66"
height="22"
+ is_toggle="true"
label="More &gt;&gt;"
- label_selected="Less &lt;&lt;">
+ label_selected="&lt;&lt; Less">
<button.commit_callback
function="MediaListCtrl.MoreLess" />
</button>
- <button
- name="less_btn"
- follows="right"
- tool_tip="Advanced Controls"
- top_delta="0"
- right="-8"
- width="66"
- height="22"
- label="More &gt;&gt;"
- label_selected="Less &lt;&lt;">
- <button.commit_callback
- function="MediaListCtrl.MoreLess" />
- </button>
</panel>
<panel
name="nearby_media_panel"
@@ -116,12 +104,12 @@
top_pad="15"
left="10"
name="show_text"
- width="40">
+ width="62">
Show:
</text>
<combo_box
height="23"
- left="50"
+ left="72"
width="140"
top_delta="-5"
follows="left|top"
@@ -208,7 +196,6 @@
name="stop"
mouse_opaque="false"
auto_resize="false"
- user_resize="false"
layout="topleft"
top="0"
height="22"
@@ -236,7 +223,6 @@
name="play"
mouse_opaque="false"
auto_resize="false"
- user_resize="false"
layout="topleft"
top="0"
height="22"
@@ -264,7 +250,6 @@
name="pause"
mouse_opaque="false"
auto_resize="false"
- user_resize="false"
layout="topleft"
top="0"
min_width="22"
@@ -291,7 +276,6 @@
name="volume_slider_ctrl"
mouse_opaque="false"
auto_resize="true"
- user_resize="false"
follows="left|right"
layout="topleft"
top="0"
@@ -316,7 +300,6 @@
name="mute"
mouse_opaque="false"
auto_resize="false"
- user_resize="false"
layout="topleft"
top="0"
height="72"
@@ -345,7 +328,6 @@
name="zoom"
mouse_opaque="false"
auto_resize="false"
- user_resize="false"
layout="topleft"
top="0"
height="28"
@@ -373,7 +355,6 @@
name="unzoom"
mouse_opaque="false"
auto_resize="false"
- user_resize="false"
layout="topleft"
top="0"
min_width="21"
@@ -400,8 +381,7 @@
<layout_panel
name="right_bookend"
width="0"
- mouse_opaque="false"
- user_resize="false" />
+ mouse_opaque="false"/>
</layout_stack>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_notes.xml b/indra/newview/skins/default/xui/en/panel_notes.xml
deleted file mode 100644
index 124b1cfc6b..0000000000
--- a/indra/newview/skins/default/xui/en/panel_notes.xml
+++ /dev/null
@@ -1,236 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel
- follows="all"
- height="515"
- label="Notes &amp; Privacy"
- layout="topleft"
- left="0"
- name="panel_notes"
- top="0"
- width="313"
->
- <layout_stack
- name="layout"
- orientation="vertical"
- follows="all"
- layout="topleft"
- left="0"
- top="0"
- height="517"
- width="313"
- border_size="0">
- <layout_panel
- name="notes_stack"
- follows="all"
- layout="topleft"
- top="0"
- left="0"
- height="450"
- width="313">
- <scroll_container
- color="DkGray2"
- follows="all"
- layout="topleft"
- left="0"
- name="profile_scroll"
- opaque="true"
- height="450"
- width="313"
- top="0">
- <panel
- height="450"
- layout="topleft"
- name="profile_scroll_panel"
- top="0"
- left="0"
- width="303">
- <text
- follows="left|top"
- font.style="BOLD"
- height="16"
- layout="topleft"
- left="11"
- name="status_message"
- text_color="white"
- top="10"
- value="My private notes:"
- width="293" />
- <text_editor
- follows="left|top"
- height="120"
- layout="topleft"
- left="12"
- max_length="1000"
- name="notes_edit"
- text_color="DkGray"
- top_pad="3"
- width="288"
- word_wrap="true" />
- <text
- follows="left|top"
- font.style="BOLD"
- height="16"
- layout="topleft"
- left="11"
- name="status_message2"
- text_color="white"
- top_pad="20"
- value="Allow this person to:"
- width="293" />
- <check_box
- enabled="false"
- height="16"
- label="See my online status"
- layout="topleft"
- left="10"
- name="status_check"
- width="293" />
- <check_box
- enabled="false"
- height="16"
- label="See me on the map"
- layout="topleft"
- left="10"
- name="map_check"
- width="293" />
- <check_box
- enabled="false"
- height="16"
- label="Edit, delete or take my objects"
- layout="topleft"
- left="10"
- name="objects_check"
- width="293" />
- </panel>
- </scroll_container>
- </layout_panel>
- <layout_panel
- follows="bottom|left"
- height="30"
- layout="topleft"
- left="0"
- name="notes_buttons_panel"
- auto_resize="false"
- width="313">
-
- <layout_stack
- follows="bottom|left|right"
- height="23"
- layout="topleft"
- name="bottom_bar_ls"
- left="2"
- orientation="horizontal"
- top_pad="5"
- width="309">
-
- <layout_panel
- follows="bottom|left|right"
- height="23"
- layout="bottomleft"
- left="0"
- name="add_friend_btn_lp"
- user_resize="false"
- auto_resize="true"
- width="118">
- <button
- follows="bottom|left|right"
- height="23"
- label="Add Friend"
- layout="topleft"
- left="1"
- mouse_opaque="false"
- name="add_friend"
- tool_tip="Offer friendship to the Resident"
- top="0"
- width="117" />
- </layout_panel>
-
- <layout_panel
- follows="bottom|left|right"
- height="23"
- layout="bottomleft"
- left_pad="3"
- name="im_btn_lp"
- user_resize="false"
- auto_resize="true"
- width="22">
- <button
- follows="bottom|left|right"
- height="23"
- label="IM"
- layout="topleft"
- name="im"
- tool_tip="Open instant message session"
- top="0"
- left="1"
- width="21" />
- </layout_panel>
-
- <layout_panel
- follows="bottom|left|right"
- height="23"
- layout="bottomleft"
- left_pad="3"
- name="call_btn_lp"
- user_resize="false"
- auto_resize="true"
- width="52">
- <button
- follows="bottom|left|right"
- height="23"
- label="Call"
- layout="topleft"
- name="call"
- tool_tip="Call this Resident"
- left="1"
- top="0"
- use_ellipses="true"
- width="51" />
- </layout_panel>
-
- <layout_panel
- follows="bottom|left|right"
- height="23"
- layout="bottomleft"
- left_pad="3"
- name="show_on_map_btn_lp"
- user_resize="false"
- auto_resize="true"
- width="46">
- <button
- enabled="false"
- follows="bottom|left|right"
- height="23"
- label="Map"
- layout="topleft"
- name="show_on_map_btn"
- tool_tip="Show the Resident on the map"
- top="0"
- left="1"
- width="45" />
- </layout_panel>
-
- <layout_panel
- follows="bottom|left|right"
- height="23"
- layout="bottomleft"
- left_pad="3"
- name="teleport_btn_lp"
- user_resize="false"
- auto_resize="true"
- width="81">
- <button
- follows="bottom|left|right"
- height="23"
- label="Teleport"
- layout="topleft"
- name="teleport"
- tool_tip="Offer teleport"
- left="1"
- top="0"
- width="80" />
- </layout_panel>
- </layout_stack>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_notification.xml b/indra/newview/skins/default/xui/en/panel_notification.xml
index 59ead84127..94c468e1bb 100644
--- a/indra/newview/skins/default/xui/en/panel_notification.xml
+++ b/indra/newview/skins/default/xui/en/panel_notification.xml
@@ -3,12 +3,14 @@
background_opaque="false"
border_visible="false"
background_visible="true"
- bg_alpha_color="1 0.3 0.3 0"
- bg_opaque_color="1 0.3 0.3 0"
+ bg_alpha_color="PanelNotificationBackground"
+ bg_opaque_color="PanelNotificationBackground"
label="notification_panel"
layout="topleft"
left="0"
name="notification_panel"
+ chrome="true"
+ show_title="false"
top="0"
height="140"
translate="false"
@@ -18,8 +20,8 @@
border_visible="false"
bevel_style="none"
background_visible="true"
- bg_alpha_color="0.3 0.3 0.3 0"
- bg_opaque_color="0.3 0.3 0.3 0"
+ bg_alpha_color="ToastBackground"
+ bg_opaque_color="ToastBackground"
follows="left|right|top"
height="100"
label="info_panel"
@@ -37,7 +39,7 @@
left="10"
name="text_box"
read_only="true"
- text_color="white"
+ text_color="White"
top="10"
visible="false"
width="285"
@@ -50,7 +52,7 @@
layout="topleft"
left="10"
name="caution_text_box"
- text_color="1 0.82 0.46 1"
+ text_color="NotifyCautionBoxColor"
top="10"
visible="false"
width="285"
@@ -58,7 +60,7 @@
<text_editor
h_pad="0"
v_pad="0"
- bg_readonly_color="0.0 0.0 0.0 0"
+ bg_readonly_color="Transparent"
border_visible="false"
embedded_items="false"
enabled="false"
@@ -71,8 +73,8 @@
name="text_editor_box"
read_only="true"
tab_stop="false"
- text_color="white"
- text_readonly_color="white"
+ text_color="White"
+ text_readonly_color="White"
top="10"
visible="false"
width="285"
diff --git a/indra/newview/skins/default/xui/en/panel_notify_textbox.xml b/indra/newview/skins/default/xui/en/panel_notify_textbox.xml
index 4634eeed46..d5b6057233 100644
--- a/indra/newview/skins/default/xui/en/panel_notify_textbox.xml
+++ b/indra/newview/skins/default/xui/en/panel_notify_textbox.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
background_visible="true"
- height="230"
+ height="220"
label="instant_message"
layout="topleft"
left="0"
@@ -14,55 +14,81 @@
<panel
bevel_style="none"
follows="left|right|top"
- height="150"
+ height="185"
label="info_panel"
layout="topleft"
left="0"
name="info_panel"
top="0"
- width="305">
+ width="305">
+ <text_editor
+ bg_readonly_color="0.0 0.0 0.0 0"
+ enabled="false"
+ follows="left|right|top|bottom"
+ font="SansSerif"
+ height="110"
+ layout="topleft"
+ left="10"
+ mouse_opaque="false"
+ name="text_editor_box"
+ read_only="true"
+ text_color="white"
+ text_readonly_color="white"
+ top="10"
+ width="285"
+ wrap="true"
+ parse_highlights="true"
+ parse_urls="true"/>
<text_editor
parse_urls="true"
enabled="true"
follows="all"
- height="60"
+ height="50"
layout="topleft"
- left="25"
+ left="10"
max_length="250"
name="message"
parse_highlights="true"
read_only="false"
- top="40"
+ top_pad="10"
type="string"
use_ellipses="true"
value="message"
- width="260"
- word_wrap="true" >
+ width="285"
+ word_wrap="true"
+ parse_url="false" >
</text_editor>
- parse_urls="false"
- <button
- top="110"
- follows="top|left"
- height="20"
- label="Submit"
- layout="topleft"
- left="25"
- name="btn_submit"
- width="70" />
</panel>
<panel
background_visible="false"
follows="left|right|bottom"
- height="0"
+ height="25"
width="290"
label="control_panel"
layout="topleft"
left="10"
name="control_panel"
- top_pad="5">
+ top_pad="0">
<!--
Notes:
This panel holds the Ignore button and possibly other buttons of notification.
-->
+ <button
+ top="0"
+ follows="top|left"
+ height="20"
+ label="Submit"
+ layout="topleft"
+ name="btn_submit"
+ width="70" />
+ <button
+ follows="top|right"
+ height="20"
+ label="Ignore"
+ layout="topleft"
+ left="215"
+ name="ignore_btn"
+ top="0"
+ width="70" />
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_online_status_toast.xml b/indra/newview/skins/default/xui/en/panel_online_status_toast.xml
index b1a7697e83..dadbd9c9ab 100644
--- a/indra/newview/skins/default/xui/en/panel_online_status_toast.xml
+++ b/indra/newview/skins/default/xui/en/panel_online_status_toast.xml
@@ -25,7 +25,7 @@
layout="topleft"
left_pad="5"
name="message"
- text_color="white"
+ text_color="White"
top="15"
use_ellipses="true"
value=""
diff --git a/indra/newview/skins/default/xui/en/panel_outbox_inventory.xml b/indra/newview/skins/default/xui/en/panel_outbox_inventory.xml
new file mode 100644
index 0000000000..a3d39e55af
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_outbox_inventory.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<outbox_inventory_panel
+ name="inventory_outbox"
+ start_folder="Outbox"
+ follows="all" layout="topleft"
+ top="0" left="0" height="165" width="308"
+ top_pad="0"
+ bg_opaque_color="DkGray2"
+ bg_alpha_color="DkGray2"
+ background_visible="true"
+ border="false"
+ bevel_style="none"
+ show_item_link_overlays="true"
+ tool_tip="Drag and drop items here to prepare them for sale on your storefront"
+ >
+ <scroll reserve_scroll_corner="false" />
+</outbox_inventory_panel>
diff --git a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml
index f4dee9cd55..b61f110e32 100644
--- a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml
+++ b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml
@@ -70,7 +70,8 @@
left="5"
tab_stop="false"
top="1"
- width="30" />
+ width="30"
+ use_draw_context_alpha="false" />
<text
follows="top|left|right"
font="SansSerifHugeBold"
@@ -197,7 +198,6 @@ It is calculated as border_size + 2*UIResizeBarOverlap
height="154"
name="add_button_and_combobox"
width="311"
- user_resize="false"
visible="true">
<!-- List containing items from the COF and Base outfit -->
@@ -270,8 +270,7 @@ It is calculated as border_size + 2*UIResizeBarOverlap
height="30"
name="filter_panel"
width="311"
- visible="false"
- user_resize="false">
+ visible="false">
<filter_editor
background_image="TextField_Search_Off"
@@ -514,7 +513,6 @@ It is calculated as border_size + 2*UIResizeBarOverlap
left="0"
mouse_opaque="false"
name="save_btn_lp"
- user_resize="false"
auto_resize="true"
width="156">
<button
@@ -549,7 +547,6 @@ It is calculated as border_size + 2*UIResizeBarOverlap
left_pad="3"
mouse_opaque="false"
name="revert_btn_lp"
- user_resize="false"
auto_resize="true"
width="147">
<button
diff --git a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml
index 88c82313dd..405d9513db 100644
--- a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml
+++ b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml
@@ -76,7 +76,7 @@
left="0"
orientation="horizontal"
top="0"
- width="313">
+ width="308">
<layout_panel
follows="bottom|left|right"
height="23"
@@ -84,7 +84,6 @@
left="0"
mouse_opaque="false"
name="save_btn_lp"
- user_resize="false"
auto_resize="true"
width="156">
<button
@@ -118,18 +117,17 @@
left_pad="3"
mouse_opaque="false"
name="wear_btn_lp"
- user_resize="false"
auto_resize="true"
- width="152">
+ width="147">
<button
follows="bottom|left|right"
height="23"
label="Wear"
layout="topleft"
name="wear_btn"
- left="0"
+ left="1"
top="0"
- width="152" />
+ width="146" />
</layout_panel>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_outfits_list.xml b/indra/newview/skins/default/xui/en/panel_outfits_list.xml
index 9f98019c94..a0096adc01 100644
--- a/indra/newview/skins/default/xui/en/panel_outfits_list.xml
+++ b/indra/newview/skins/default/xui/en/panel_outfits_list.xml
@@ -14,9 +14,7 @@
background_visible="true"
bg_alpha_color="DkGray2"
bg_opaque_color="DkGray2"
- no_matched_tabs_text.value="Didn't find what you're looking for? Try [secondlife:///app/search/all/[SEARCH_TERM] Search]."
- no_matched_tabs_text.v_pad="10"
- no_visible_tabs_text.value="You don't have any outfits yet. Try [secondlife:///app/search/all/ Search]"
+
follows="all"
height="400"
layout="topleft"
@@ -24,6 +22,13 @@
name="outfits_accordion"
top="0"
width="309">
+ <no_matched_tabs_text
+ name="no_matched_outfits_msg"
+ value="Didn't find what you're looking for? Try [secondlife:///app/search/all/[SEARCH_TERM] Search]."
+ v_pad="10"/>
+ <no_visible_tabs_text
+ name="no_outfits_msg"
+ value="You don't have any outfits yet. Try [secondlife:///app/search/all/ Search]"/>
</accordion>
<panel
background_visible="true"
diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml
index 6a8bf87bc5..98c7c49ff4 100644
--- a/indra/newview/skins/default/xui/en/panel_people.xml
+++ b/indra/newview/skins/default/xui/en/panel_people.xml
@@ -54,13 +54,19 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
<string
name="no_groups_msg"
value="Looking for Groups to join? Try [secondlife:///app/search/groups Search]." />
- <filter_editor
+ <string
+ name="MiniMapToolTipMsg"
+ value="[REGION](Double-click to open Map, shift-drag to pan)"/>
+ <string
+ name="AltMiniMapToolTipMsg"
+ value="[REGION](Double-click to teleport, shift-drag to pan)"/>
+ <filter_editor
follows="left|top|right"
height="23"
layout="topleft"
left="10"
label="Filter"
- max_length="300"
+ max_length_chars="300"
name="filter_input"
text_color="Black"
text_pad_left="10"
@@ -70,7 +76,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
follows="all"
height="383"
layout="topleft"
- left="5"
+ left="3"
name="tabs"
tab_group="1"
tab_min_width="70"
@@ -78,10 +84,10 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
tab_position="top"
top_pad="10"
halign="center"
- width="317">
+ width="319">
<panel
background_opaque="true"
- background_visible="true"
+ background_visible="true"
bg_alpha_color="DkGray"
bg_opaque_color="DkGray"
follows="all"
@@ -93,18 +99,55 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
name="nearby_panel"
top="0"
width="313">
- <avatar_list
- allow_select="true"
- follows="all"
- height="356"
- ignore_online_status="true"
+ <layout_stack
+ clip="false"
+ follows="all"
+ height="355"
+ layout="topleft"
+ mouse_opaque="false"
+ orientation="vertical"
+ width="313">
+ <layout_panel
+ height="142"
layout="topleft"
- left="3"
- multi_select="true"
- name="avatar_list"
- top="0"
- width="307" />
- <panel
+ min_dim="100"
+ mouse_opaque="false"
+ user_resize="true"
+ visibility_control="NearbyListShowMap"
+ width="313">
+ <net_map
+ bg_color="NetMapBackgroundColor"
+ follows="all"
+ height="140"
+ layout="topleft"
+ left="3"
+ mouse_opaque="false"
+ name="Net Map"
+ top="4"
+ width="305"/>
+ </layout_panel>
+ <layout_panel
+ height="213"
+ layout="topleft"
+ min_dim="100"
+ mouse_opaque="false"
+ user_resize="true"
+ width="313">
+ <avatar_list
+ allow_select="true"
+ follows="all"
+ height="211"
+ ignore_online_status="true"
+ layout="topleft"
+ left="3"
+ keep_one_selected="false"
+ multi_select="true"
+ name="avatar_list"
+ top="2"
+ width="306" />
+ </layout_panel>
+ </layout_stack>
+ <panel
background_visible="true"
follows="left|right|bottom"
height="27"
@@ -149,7 +192,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
layout="topleft"
left_pad="1"
name="dummy_icon"
- width="241"
+ width="243"
/>
</panel>
</panel>
@@ -235,13 +278,12 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
top_pad="1"
left="0"
name="bottom_panel"
- width="305">
+ width="308">
<layout_panel
auto_resize="false"
height="25"
layout="topleft"
name="options_gear_btn_panel"
- user_resize="false"
width="32">
<menu_button
follows="bottom|left"
@@ -262,7 +304,6 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
height="25"
layout="topleft"
name="add_btn_panel"
- user_resize="false"
width="32">
<button
follows="bottom|left"
@@ -283,8 +324,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
height="25"
layout="topleft"
name="dummy_panel"
- user_resize="false"
- width="212">
+ width="210">
<icon
follows="bottom|left|right"
height="25"
@@ -293,14 +333,13 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
left="0"
top="0"
name="dummy_icon"
- width="211" />
+ width="210" />
</layout_panel>
<layout_panel
auto_resize="false"
height="25"
layout="topleft"
name="trash_btn_panel"
- user_resize="false"
width="31">
<dnd_button
follows="bottom|left"
@@ -455,7 +494,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
layout="topleft"
left_pad="1"
name="dummy_icon"
- width="209"
+ width="212"
/>
</panel>
</panel>
@@ -490,7 +529,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
height="27"
label="bottom_panel"
layout="topleft"
- left="0"
+ left="3"
name="bottom_panel"
top_pad="0"
width="313">
@@ -528,7 +567,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
layout="topleft"
left_pad="1"
name="dummy_icon"
- width="241"
+ width="244"
/>
</panel>
</panel>
@@ -559,7 +598,6 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
layout="bottomleft"
left="0"
name="view_profile_btn_lp"
- user_resize="false"
auto_resize="true"
width="68">
<button
@@ -579,8 +617,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
height="23"
layout="bottomleft"
left_pad="3"
- name="chat_btn_lp"
- user_resize="false"
+ name="im_btn_lp"
auto_resize="true"
width="41">
<button
@@ -600,8 +637,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
height="23"
layout="bottomleft"
left_pad="3"
- name="chat_btn_lp"
- user_resize="false"
+ name="call_btn_lp"
auto_resize="true"
width="52">
<button
@@ -621,8 +657,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
height="23"
layout="bottomleft"
left_pad="3"
- name="chat_btn_lp"
- user_resize="false"
+ name="share_btn_lp"
auto_resize="true"
width="66">
<button
@@ -642,8 +677,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
height="23"
layout="bottomleft"
left_pad="3"
- name="chat_btn_lp"
- user_resize="false"
+ name="teleport_btn_lp"
auto_resize="true"
width="77">
<button
@@ -677,7 +711,6 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
left="0"
mouse_opaque="false"
name="group_info_btn_lp"
- user_resize="false"
auto_resize="true"
width="108">
<button
@@ -700,7 +733,6 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
left_pad="3"
mouse_opaque="false"
name="chat_btn_lp"
- user_resize="false"
auto_resize="true"
width="101">
<button
@@ -723,7 +755,6 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
left_pad="3"
mouse_opaque="false"
name="group_call_btn_lp"
- user_resize="false"
auto_resize="true"
width="96">
<button
diff --git a/indra/newview/skins/default/xui/en/panel_pick_info.xml b/indra/newview/skins/default/xui/en/panel_pick_info.xml
index 0496c86215..79d190e1e0 100644
--- a/indra/newview/skins/default/xui/en/panel_pick_info.xml
+++ b/indra/newview/skins/default/xui/en/panel_pick_info.xml
@@ -21,7 +21,8 @@
left="10"
tab_stop="false"
top="2"
- width="30" />
+ width="30"
+ use_draw_context_alpha="false" />
<text
follows="top|left|right"
font="SansSerifHugeBold"
@@ -116,7 +117,7 @@
</scroll_container>
<panel
follows="left|right|bottom"
- height="35"
+ height="23"
layout="topleft"
top_pad="5"
left="8"
@@ -138,7 +139,6 @@
layout="bottomleft"
left="0"
name="layout_panel1"
- user_resize="false"
auto_resize="true"
width="101">
<button
@@ -157,7 +157,6 @@
layout="bottomleft"
left_pad="3"
name="show_on_map_btn_lp"
- user_resize="false"
auto_resize="true"
width="100">
<button
@@ -176,7 +175,6 @@
layout="bottomleft"
left_pad="3"
name="edit_btn_lp"
- user_resize="false"
auto_resize="true"
width="101">
<button
diff --git a/indra/newview/skins/default/xui/en/panel_picks.xml b/indra/newview/skins/default/xui/en/panel_picks.xml
index 978b204df9..8def96cada 100644
--- a/indra/newview/skins/default/xui/en/panel_picks.xml
+++ b/indra/newview/skins/default/xui/en/panel_picks.xml
@@ -4,12 +4,12 @@ bg_opaque_color="DkGray2"
background_visible="true"
background_opaque="true"
follows="all"
- height="548"
+ height="571"
label="Picks"
layout="topleft"
- left="0"
+ left="8"
name="panel_picks"
- top="0"
+ top_pad="0"
width="313">
<string
name="no_picks"
@@ -30,7 +30,7 @@ bg_opaque_color="DkGray2"
<accordion
fit_parent="true"
follows="all"
- height="485"
+ height="514"
layout="topleft"
left="0"
name="accordion"
@@ -72,20 +72,19 @@ bg_opaque_color="DkGray2"
</accordion_tab>
</accordion>
<panel
-bg_opaque_color="DkGray2"
+ bg_opaque_color="DkGray2"
background_visible="true"
background_opaque="true"
- bevel_style="none"
- enabled="false"
- auto_resize="false"
- follows="bottom|left|right"
- left="1"
- height="27"
- label="bottom_panel"
- layout="bottom"
- name="edit_panel"
- top_pad="-2"
- width="313">
+ bevel_style="none"
+ enabled="false"
+ follows="bottom|left|right"
+ left="1"
+ height="27"
+ label="bottom_panel"
+ layout="topleft"
+ name="edit_panel"
+ top_pad="0"
+ width="312">
<layout_stack
follows="bottom|left|right"
@@ -103,7 +102,6 @@ bg_opaque_color="DkGray2"
layout="bottomleft"
left="0"
name="gear_menu_btn"
- user_resize="false"
auto_resize="true"
width="51">
<button
@@ -125,7 +123,6 @@ bg_opaque_color="DkGray2"
height="18"
layout="bottomleft"
name="trash_btn_lp"
- user_resize="false"
auto_resize="true"
width="18">
<button
@@ -150,8 +147,9 @@ bg_opaque_color="DkGray2"
follows="bottom|left|right"
layout="topleft"
left="0"
- height="40"
+ height="30"
name="buttons_cucks"
+ top_pad="0"
width="313">
<layout_stack
@@ -170,7 +168,6 @@ bg_opaque_color="DkGray2"
layout="topleft"
left="0"
name="info_btn_lp"
- user_resize="false"
auto_resize="true"
top="0"
width="95">
@@ -192,7 +189,6 @@ bg_opaque_color="DkGray2"
layout="bottomleft"
left_pad="2"
name="teleport_btn_lp"
- user_resize="false"
auto_resize="true"
width="117">
<button
@@ -212,7 +208,6 @@ bg_opaque_color="DkGray2"
height="28"
layout="bottomleft"
name="show_on_map_btn_lp"
- user_resize="false"
auto_resize="true"
left_pad="2"
width="90">
diff --git a/indra/newview/skins/default/xui/en/panel_place_profile.xml b/indra/newview/skins/default/xui/en/panel_place_profile.xml
index 8036411d2b..308acf0c0c 100644
--- a/indra/newview/skins/default/xui/en/panel_place_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_place_profile.xml
@@ -153,6 +153,14 @@
name="icon_DamageNo"
translate="false"
value="Parcel_DamageNo_Dark" />
+ <string
+ name="icon_SeeAVs_Off"
+ translate="false"
+ value="Parcel_SeeAVsOff_Dark" />
+ <string
+ name="icon_SeeAVs_On"
+ translate="false"
+ value="Parcel_SeeAVsOn_Dark" />
<button
follows="top|left"
height="24"
@@ -165,7 +173,8 @@
tool_tip="Back"
tab_stop="false"
top="4"
- width="30" />
+ width="30"
+ use_draw_context_alpha="false" />
<text
follows="top|left|right"
font="SansSerifHugeBold"
@@ -190,7 +199,7 @@
width="310">
<panel
bg_alpha_color="DkGray2"
- follows="left|top|right"
+ follows="left|top|right|bottom"
height="580"
layout="topleft"
left="0"
@@ -229,7 +238,6 @@
mouse_opaque="false"
name="here_panel"
top="0"
- user_resize="false"
width="60">
<icon
follows="top|left"
@@ -250,7 +258,6 @@
mouse_opaque="false"
name="for_sale_panel"
top="0"
- user_resize="false"
width="60">
<icon
follows="top|left"
@@ -353,7 +360,7 @@
title="Parcel">
<panel
follows="all"
- height="175"
+ height="200"
layout="topleft"
left="0"
name="parcel_characteristics_panel"
@@ -542,6 +549,31 @@
top_delta="0"
value="Off"
width="60" />
+ <icon
+ follows="top|left"
+ height="18"
+ image_name="Parcel_SeeAVsOff_Dark"
+ layout="topleft"
+ left="10"
+ name="see_avatars_icon"
+ top_pad="7"
+ width="22" />
+ <text
+ follows="left|top"
+ height="14"
+ layout="topleft"
+ left_pad="8"
+ name="see_avatars_label"
+ value="See Avatars:"
+ width="90" />
+ <text
+ follows="left|top"
+ height="14"
+ layout="topleft"
+ left_pad="0"
+ name="see_avatars_value"
+ value="Off"
+ width="60" />
<button
follows="bottom|right"
height="23"
diff --git a/indra/newview/skins/default/xui/en/panel_places.xml b/indra/newview/skins/default/xui/en/panel_places.xml
index 21314703b0..f169dbb702 100644
--- a/indra/newview/skins/default/xui/en/panel_places.xml
+++ b/indra/newview/skins/default/xui/en/panel_places.xml
@@ -25,7 +25,7 @@ background_visible="true"
layout="topleft"
left="10"
label="Filter My Places"
- max_length="300"
+ max_length_chars="300"
name="Filter"
top="3"
width="303" />
@@ -92,7 +92,6 @@ background_visible="true"
left="0"
mouse_opaque="false"
name="lp1"
- user_resize="false"
auto_resize="true"
width="193">
@@ -115,7 +114,6 @@ background_visible="true"
left="0"
mouse_opaque="false"
name="teleport_btn_lp"
- user_resize="false"
auto_resize="true"
width="109">
<button
@@ -137,7 +135,6 @@ background_visible="true"
left_pad="3"
mouse_opaque="false"
name="chat_btn_lp"
- user_resize="false"
auto_resize="true"
width="86">
<button
@@ -161,7 +158,6 @@ background_visible="true"
left_pad="0"
mouse_opaque="false"
name="lp2"
- user_resize="false"
auto_resize="true"
width="116">
@@ -176,7 +172,7 @@ background_visible="true"
left="0"
orientation="horizontal"
top="0"
- width="120">
+ width="113">
<layout_panel
follows="bottom|left|right"
@@ -185,7 +181,6 @@ background_visible="true"
left_pad="0"
mouse_opaque="false"
name="edit_btn_lp"
- user_resize="false"
auto_resize="true"
width="84">
<button
@@ -202,19 +197,20 @@ background_visible="true"
</layout_panel>
<layout_panel
- follows="bottom|left|right"
+ follows="bottom|right"
height="23"
layout="bottomleft"
left_pad="0"
mouse_opaque="false"
name="overflow_btn_lp"
- user_resize="false"
auto_resize="true"
width="24">
- <button
- follows="bottom|left|right"
+ <menu_button
+ follows="bottom|right"
height="23"
- label="â–¼"
+ image_disabled="ComboButton_UpOff"
+ image_unselected="ComboButton_UpOff"
+ image_selected="ComboButton_UpSelected"
layout="topleft"
mouse_opaque="false"
name="overflow_btn"
@@ -232,11 +228,11 @@ background_visible="true"
height="23"
layout="topleft"
mouse_opaque="false"
- name="bottom_bar_ls3"
+ name="bottom_bar_profile_ls"
left="0"
orientation="horizontal"
top="0"
- width="120">
+ width="110">
<layout_panel
follows="bottom|left|right"
height="23"
@@ -244,9 +240,8 @@ background_visible="true"
left_pad="3"
mouse_opaque="false"
name="profile_btn_lp"
- user_resize="false"
auto_resize="true"
- width="112">
+ width="102">
<button
follows="bottom|left|right"
height="23"
@@ -257,7 +252,7 @@ background_visible="true"
left="1"
tool_tip="Show place profile"
top="0"
- width="111" />
+ width="101" />
</layout_panel>
</layout_stack>
@@ -272,7 +267,7 @@ background_visible="true"
left="0"
orientation="horizontal"
top="0"
- width="120">
+ width="112">
<layout_panel
follows="bottom|left|right"
height="23"
@@ -281,9 +276,8 @@ background_visible="true"
mouse_opaque="false"
name="close_btn_lp"
top="0"
- user_resize="false"
auto_resize="true"
- width="61">
+ width="51">
<button
follows="bottom|left|right"
height="23"
@@ -293,7 +287,7 @@ background_visible="true"
name="close_btn"
left="1"
top="0"
- width="60" />
+ width="50" />
</layout_panel>
</layout_stack>
@@ -322,7 +316,6 @@ background_visible="true"
mouse_opaque="false"
name="save_btn_lp"
top="0"
- user_resize="false"
auto_resize="true"
width="153">
<button
@@ -345,7 +338,6 @@ background_visible="true"
mouse_opaque="false"
name="cancel_btn_lp"
top="0"
- user_resize="false"
auto_resize="true"
width="154">
<button
diff --git a/indra/newview/skins/default/xui/en/panel_postcard_message.xml b/indra/newview/skins/default/xui/en/panel_postcard_message.xml
new file mode 100644
index 0000000000..ab2a42ea01
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_postcard_message.xml
@@ -0,0 +1,125 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ height="380"
+ layout="topleft"
+ name="panel_postcard_message"
+ width="490">
+ <text
+ type="string"
+ length="1"
+ bottom="35"
+ follows="top|left"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left="12"
+ name="to_label"
+ top="10"
+ width="60">
+ To:
+ </text>
+ <line_editor
+ control_name="LastPostcardRecipient"
+ follows="left|top|right"
+ height="20"
+ layout="topleft"
+ left_pad="10"
+ name="to_form"
+ right="-10"
+ top_delta="-4" />
+ <text
+ type="string"
+ length="1"
+ bottom_delta="23"
+ follows="top|left"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left="12"
+ name="name_label"
+ width="60">
+ From:
+ </text>
+ <line_editor
+ follows="left|top|right"
+ height="20"
+ layout="topleft"
+ left_pad="10"
+ max_length_bytes="100"
+ name="name_form"
+ right="-10"
+ top_delta="-4" />
+ <text
+ type="string"
+ length="1"
+ bottom_delta="23"
+ follows="top|left"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left="12"
+ name="subject_label"
+ width="60">
+ Subject:
+ </text>
+ <line_editor
+ follows="left|top|right"
+ height="20"
+ label="Type your subject here."
+ layout="topleft"
+ left_pad="10"
+ max_length_bytes="100"
+ name="subject_form"
+ right="-10"
+ top_delta="-4" />
+ <text
+ type="string"
+ length="1"
+ bottom_delta="23"
+ follows="top|left|right"
+ font="SansSerif"
+ layout="topleft"
+ left="12"
+ name="msg_label"
+ right="-10">
+ Message:
+ </text>
+ <text_editor
+ type="string"
+ length="1"
+ follows="left|top|right"
+ height="60"
+ layout="topleft"
+ left_delta="0"
+ max_length="700"
+ name="msg_form"
+ right="-10"
+ top_pad="10"
+ word_wrap="true">
+ Type your message here.
+ </text_editor>
+ <button
+ follows="right|bottom"
+ height="23"
+ label="Cancel"
+ layout="topleft"
+ name="cancel_btn"
+ right="-32"
+ top="350"
+ width="100">
+ <button.commit_callback
+ function="Postcard.Cancel" />
+ </button>
+ <button
+ follows="right|bottom"
+ height="23"
+ label="Send"
+ layout="topleft"
+ left_delta="-106"
+ name="send_btn"
+ top_delta="0"
+ width="100">
+ <button.commit_callback
+ function="Postcard.Send" />
+ </button>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_postcard_settings.xml b/indra/newview/skins/default/xui/en/panel_postcard_settings.xml
new file mode 100644
index 0000000000..3f67a48b14
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_postcard_settings.xml
@@ -0,0 +1,136 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ height="380"
+ layout="topleft"
+ name="panel_postcard_settings"
+ width="490">
+ <combo_box
+ follows="left|top|right"
+ height="23"
+ label="Resolution"
+ layout="topleft"
+ left="10"
+ name="postcard_size_combo"
+ right="-10"
+ top_pad="10">
+ <combo_box.item
+ label="Current Window"
+ name="CurrentWindow"
+ value="[i0,i0]" />
+ <combo_box.item
+ label="640x480"
+ name="640x480"
+ value="[i640,i480]" />
+ <combo_box.item
+ label="800x600"
+ name="800x600"
+ value="[i800,i600]" />
+ <combo_box.item
+ label="1024x768"
+ name="1024x768"
+ value="[i1024,i768]" />
+ <combo_box.item
+ label="Custom"
+ name="Custom"
+ value="[i-1,i-1]" />
+ </combo_box>
+ <layout_stack
+ animate="false"
+ follows="all"
+ height="275"
+ layout="bottomleft"
+ name="postcard_image_params_ls"
+ left_delta="0"
+ orientation="vertical"
+ top_pad="10"
+ right="-10">
+ <layout_panel
+ follows="top|left|right"
+ height="60"
+ layout="topleft"
+ left="0"
+ name="postcard_image_size_lp"
+ auto_resize="false"
+ top="0"
+ right="-1"
+ visible="true">
+ <spinner
+ allow_text_entry="false"
+ decimal_digits="0"
+ follows="left|top"
+ height="20"
+ increment="32"
+ label="Width"
+ label_width="40"
+ layout="topleft"
+ left="10"
+ max_val="6016"
+ min_val="32"
+ name="postcard_snapshot_width"
+ top_pad="10"
+ width="95" />
+ <spinner
+ allow_text_entry="false"
+ decimal_digits="0"
+ follows="left|top"
+ height="20"
+ increment="32"
+ label="Height"
+ label_width="40"
+ layout="topleft"
+ left_pad="5"
+ max_val="6016"
+ min_val="32"
+ name="postcard_snapshot_height"
+ top_delta="0"
+ width="95" />
+ <check_box
+ height="10"
+ bottom_delta="20"
+ follows="left|top"
+ label="Constrain proportions"
+ layout="topleft"
+ left="10"
+ name="postcard_keep_aspect_check" />
+ </layout_panel>
+ <layout_panel
+ follows="top|left|right"
+ height="23"
+ layout="topleft"
+ left="0"
+ name="postcard_image_format_quality_lp"
+ auto_resize="true"
+ top="0"
+ right="-1"
+ visible="true">
+ <slider
+ decimal_digits="0"
+ follows="left|top"
+ height="15"
+ increment="1"
+ initial_value="75"
+ label="Image quality"
+ label_width="80"
+ layout="topleft"
+ left="0"
+ max_val="100"
+ name="image_quality_slider"
+ top_pad="7"
+ width="190" />
+ <text
+ type="string"
+ follows="left|top"
+ font="SansSerifSmall"
+ length="1"
+ height="14"
+ layout="topleft"
+ left_pad="-5"
+ halign="left"
+ name="image_quality_level"
+ top_delta="0"
+ width="60">
+ ([QLVL])
+ </text>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
index d6e4c56113..2cc9d9c1b0 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
@@ -20,8 +20,112 @@
height="12"
layout="topleft"
left="33"
+ name="Cache:"
+ top_pad="10"
+ width="100">
+ Cache:
+ </text>
+ <spinner
+ control_name="CacheSize"
+ decimal_digits="0"
+ follows="left|top"
+ height="23"
+ increment="64"
+ initial_value="1024"
+ label="Cache size (64 - 9984MB)"
+ label_width="150"
+ layout="topleft"
+ left="80"
+ max_val="9984"
+ min_val="64"
+ top_pad="10"
+ name="cachesizespinner"
+ width="200" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="23"
+ layout="topleft"
+ left_pad="5"
+ mouse_opaque="false"
+ name="text_box5"
+ width="20">
+ MB
+ </text>
+ <button
+ follows="left|top"
+ height="23"
+ label="Clear Cache"
+ label_selected="Clear Cache"
+ layout="topleft"
+ left_pad="30"
+ name="clear_cache"
+ top_delta="0"
+ width="100">
+ <button.commit_callback
+ function="Pref.ClearCache" />
+ </button>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left="80"
+ name="Cache location"
+ top_pad="5"
+ width="300">
+ Cache location:
+ </text>
+ <line_editor
+ control_name="CacheLocationTopFolder"
+ border_style="line"
+ border_thickness="1"
+ follows="left|top"
+ font="SansSerif"
+ height="23"
+ layout="topleft"
+ left="80"
+ max_length="4096"
+ name="cache_location"
+ top_pad="5"
+ width="205" />
+ <button
+ follows="left|top"
+ height="23"
+ label="Browse"
+ label_selected="Browse"
+ layout="topleft"
+ left_pad="5"
+ name="set_cache"
+ top_delta="0"
+ width="100">
+ <button.commit_callback
+ function="Pref.SetCache" />
+ </button>
+ <button
+ follows="left|top"
+ height="23"
+ label="Default Location"
+ label_selected="Default Location"
+ layout="topleft"
+ left_pad="3"
+ name="default_cache_location"
+ top_delta="0"
+ width="100">
+ <button.commit_callback
+ function="Pref.ResetCache" />
+ </button>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="12"
+ layout="topleft"
+ left="33"
name="UI Size:"
- top_pad="25"
+ top_pad="20"
width="100">
UI size:
</text>
@@ -82,7 +186,7 @@
control_name="AllowMultipleViewers"
follows="top|left"
height="15"
- label="Allow Multiple Viewer"
+ label="Allow Multiple Viewers"
layout="topleft"
left="30"
name="allow_multiple_viewer_check"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml b/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml
index 559df5bec9..714dca7fac 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml
@@ -67,7 +67,7 @@
image_overlay="Arrow_Up"
hover_glow_amount="0.15"
layout="topleft"
- left="180"
+ left="200"
name="enable_this_popup"
top_pad="5"
width="40">
@@ -81,7 +81,7 @@
image_overlay="Arrow_Down"
hover_glow_amount="0.15"
layout="topleft"
- left_pad="40"
+ left_pad="20"
name="disable_this_popup"
top_delta="0"
width="40">
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
index a1082d9c32..caf7fc85f5 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
@@ -150,7 +150,7 @@
top_pad="20"
left="30"
height="10"
- width="180">
+ width="400">
Enable incoming chat popups:
</text>
<check_box
@@ -180,14 +180,14 @@
increment="1"
initial_value="23"
label="Nearby chat toasts life time:"
- label_width="190"
+ label_width="285"
layout="topleft"
left="45"
max_val="60"
min_val="1"
name="nearby_toasts_lifetime"
top_pad="10"
- width="230" />
+ width="325" />
<spinner
control_name="NearbyToastFadingTime"
decimal_digits="0"
@@ -196,115 +196,24 @@
increment="1"
initial_value="3"
label="Nearby chat toasts fading time:"
- label_width="190"
+ label_width="285"
layout="topleft"
left_delta="0"
max_val="60"
min_val="0"
name="nearby_toasts_fadingtime"
top_pad="3"
- width="230" />
-
- <check_box
- control_name="TranslateChat"
- enabled="true"
- height="16"
- label="Use machine translation while chatting (powered by Google)"
- layout="topleft"
- left="30"
- name="translate_chat_checkbox"
- bottom_delta="30"
- width="400" />
- <text
- bottom_delta="30"
- name="translate_language_text"
- follows="left|top"
- layout="topleft"
- left_delta="20"
- height="20"
- width="110">
- Translate chat into:
- </text>
- <combo_box
- allow_text_entry="true"
- bottom_delta="3"
- control_name="TranslateLanguage"
- enabled="true"
- follows="left|top"
- height="23"
- left_delta="110"
- max_chars="135"
- mouse_opaque="true"
- name="translate_language_combobox"
- width="146">
- <combo_box.item
- label="System Default"
- name="System Default Language"
- value="default" />
- <combo_box.item
- label="English"
- name="English"
- value="en" />
- <!-- After "System Default" and "English", please keep the rest of these combo_box.items in alphabetical order by the first character in the string. -->
- <combo_box.item
- label="Dansk (Danish)"
- name="Danish"
- value="da" />
- <combo_box.item
- label="Deutsch (German)"
- name="German"
- value="de" />
- <combo_box.item
- label="Español (Spanish)"
- name="Spanish"
- value="es" />
- <combo_box.item
- label="Français (French)"
- name="French"
- value="fr" />
- <combo_box.item
- label="Italiano (Italian)"
- name="Italian"
- value="it" />
- <combo_box.item
- label="Magyar (Hungarian)"
- name="Hungarian"
- value="hu" />
- <combo_box.item
- label="Nederlands (Dutch)"
- name="Dutch"
- value="nl" />
- <combo_box.item
- label="Polski (Polish)"
- name="Polish"
- value="pl" />
- <combo_box.item
- label="Português (Portuguese)"
- name="Portugese"
- value="pt" />
- <combo_box.item
- label="РуÑÑкий (Russian)"
- name="Russian"
- value="ru" />
- <combo_box.item
- label="Türkçe (Turkish)"
- name="Turkish"
- value="tr" />
- <combo_box.item
- label="УкраїнÑька (Ukrainian)"
- name="Ukrainian"
- value="uk" />
- <combo_box.item
- label="中文 (简体) (Chinese)"
- name="Chinese"
- value="zh" />
- <combo_box.item
- label="日本語 (Japanese)"
- name="Japanese"
- value="ja" />
- <combo_box.item
- label="한국어 (Korean)"
- name="Korean"
- value="ko" />
- </combo_box>
+ width="325" />
+ <button
+ follows="left|top"
+ height="23"
+ label="Chat Translation Settings"
+ layout="topleft"
+ left="30"
+ name="ok_btn"
+ top="-40"
+ width="170">
+ <button.commit_callback
+ function="Pref.TranslationSettings" />
+ </button>
</panel> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_colors.xml b/indra/newview/skins/default/xui/en/panel_preferences_colors.xml
index 0c75399764..2b22f0d6e3 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_colors.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_colors.xml
@@ -47,7 +47,7 @@
height="12"
name="font_colors"
top_pad="20"
- width="120"
+ width="170"
>
Chat font colors:
</text>
@@ -208,6 +208,37 @@
</text>
<color_swatch
can_apply_immediately="true"
+ color="LtOrange"
+ follows="left|top"
+ height="24"
+ label_height="0"
+ layout="topleft"
+ left="360"
+ name="direct"
+ top_pad="-15"
+ width="44" >
+ <color_swatch.init_callback
+ function="Pref.getUIColor"
+ parameter="DirectChatColor" />
+ <color_swatch.commit_callback
+ function="Pref.applyUIColor"
+ parameter="DirectChatColor" />
+ </color_swatch>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left_pad="5"
+ mouse_opaque="false"
+ name="text_box10"
+ top_delta="5"
+ width="95">
+ Direct
+ </text>
+ <color_swatch
+ can_apply_immediately="true"
color="LtYellow"
follows="left|top"
height="24"
@@ -275,14 +306,14 @@
height="12"
name="bubble_chat"
top_pad="20"
- width="120"
+ width="495"
>
- Bubble chat:
+ Name tag background color (also affects Bubble Chat):
</text>
<color_swatch
can_apply_immediately="true"
color="0 0 0 1"
- control_name="BackgroundChatColor"
+ control_name="NameTagBackground"
follows="left|top"
height="24"
label_height="0"
@@ -290,14 +321,14 @@
left_delta="10"
top_pad="5"
name="background"
- tool_tip="Choose color for bubble chat"
+ tool_tip="Choose name tag color"
width="44">
<color_swatch.init_callback
function="Pref.getUIColor"
- parameter="BackgroundChatColor" />
+ parameter="NameTagBackground" />
<color_swatch.commit_callback
function="Pref.applyUIColor"
- parameter="BackgroundChatColor" />
+ parameter="NameTagBackground" />
</color_swatch>
<slider
control_name="ChatBubbleOpacity"
@@ -310,6 +341,7 @@
left_pad="10"
label_width="70"
name="bubble_chat_opacity"
+ tool_tip="Choose name tag opacity"
top_delta = "6"
width="378" />
<text
@@ -319,7 +351,7 @@
height="12"
name="floater_opacity"
top_pad="15"
- width="120"
+ width="200"
>
Floater Opacity:
</text>
@@ -333,7 +365,7 @@
initial_value="0.8"
layout="topleft"
label_width="115"
- label="Active :"
+ label="Active:"
left="50"
max_val="1.00"
min_val="0.00"
@@ -351,7 +383,7 @@
initial_value="0.5"
layout="topleft"
label_width="115"
- label="Inctive :"
+ label="Inactive:"
left="50"
max_val="1.00"
min_val="0.00"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_general.xml b/indra/newview/skins/default/xui/en/panel_preferences_general.xml
index 36f8f99178..24882988b0 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_general.xml
@@ -67,11 +67,6 @@
value="it" />
<combo_box.item
enabled="true"
- label="Nederlands (Dutch) - Beta"
- name="Dutch"
- value="nl" />
- <combo_box.item
- enabled="true"
label="Polski (Polish) - Beta"
name="Polish"
value="pl" />
@@ -82,9 +77,24 @@
value="pt" />
<combo_box.item
enabled="true"
+ label="РуÑÑкий (Russian) - Beta"
+ name="Russian"
+ value="ru" />
+ <combo_box.item
+ enabled="true"
+ label="Türkçe (Turkish) - Beta"
+ name="Turkish"
+ value="tr" />
+ <combo_box.item
+ enabled="true"
label="日本語 (Japanese) - Beta"
name="(Japanese)"
value="ja" />
+ <combo_box.item
+ enabled="true"
+ label="正體中文 (Traditional Chinese) - Beta"
+ name="Traditional Chinese"
+ value="zh" />
</combo_box>
<text
font="SansSerifSmall"
@@ -307,17 +317,6 @@
tool_tip="Check to use display names in chat, IM, name tags, etc."
top_pad="3"/>
- <check_box
- control_name="EnableUIHints"
- follows="top|left"
- height="16"
- label="Enable Viewer UI Hints"
- layout="topleft"
- left="27"
- name="viewer_hints_check"
- top_pad="5"
- width="237"/>
-
<text
type="string"
length="1"
@@ -326,13 +325,13 @@
layout="topleft"
left="30"
name="inworld_typing_rg_label"
- top_pad="6"
+ top_pad="1"
width="400">
Pressing letter keys:
</text>
<radio_group
control_name="LetterKeysFocusChatBar"
- height="20"
+ height="34"
layout="topleft"
left="35"
top_pad="0"
@@ -340,7 +339,7 @@
<radio_item
label="Starts local chat"
name="radio_start_chat"
- top_delta="20"
+ top="0"
layout="topleft"
height="16"
left="0"
@@ -348,9 +347,9 @@
width="150" />
<radio_item
label="Affects movement (i.e. WASD)"
- left_pad="0"
+ left="0"
layout="topleft"
- top_delta="0"
+ top="18"
height="16"
name="radio_move"
value="0"
@@ -365,7 +364,7 @@
layout="topleft"
left="30"
name="title_afk_text"
- top_pad="4"
+ top_pad="5"
width="190">
Away timeout:
</text>
@@ -408,7 +407,7 @@
left="30"
mouse_opaque="false"
name="text_box3"
- top_pad="5"
+ top_pad="3"
width="240">
Busy mode response:
</text>
@@ -421,7 +420,7 @@
follows="left|top"
height="29"
layout="topleft"
- left="50"
+ left="30"
name="busy_response"
width="470"
word_wrap="true">
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
index 3ceee60927..f7666bdc4c 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
@@ -2,7 +2,7 @@
<panel
border="true"
follows="left|top|right|bottom"
- height="408"
+ height="418"
label="Graphics"
layout="topleft"
left="102"
@@ -181,7 +181,7 @@
label="Transparent Water"
layout="topleft"
left_delta="0"
- name="BumpShiny"
+ name="TransparentWater"
top_pad="7"
width="256" />
<check_box
@@ -193,8 +193,18 @@
left_delta="0"
name="BumpShiny"
top_pad="1"
+ width="256" />
+ <check_box
+ control_name="RenderLocalLights"
+ height="16"
+ initial_value="true"
+ label="Local Lights"
+ layout="topleft"
+ left_delta="0"
+ name="LocalLights"
+ top_pad="1"
width="256" />
- <check_box
+ <check_box
control_name="VertexShaderEnable"
height="16"
initial_value="true"
@@ -221,7 +231,6 @@
<check_box.commit_callback
function="Pref.VertexShaderEnable" />
</check_box>
-<!-- DISABLED UNTIL WE REALLY WANT TO SUPPORT THIS
<check_box
control_name="RenderDeferred"
height="16"
@@ -248,6 +257,19 @@
<check_box.commit_callback
function="Pref.VertexShaderEnable" />
</check_box>
+ <check_box
+ control_name="RenderDepthOfField"
+ height="16"
+ initial_value="true"
+ label="Depth of Field"
+ layout="topleft"
+ left_delta="0"
+ name="UseDoF"
+ top_pad="1"
+ width="256">
+ <check_box.commit_callback
+ function="Pref.VertexShaderEnable" />
+ </check_box>
<text
type="string"
@@ -283,7 +305,7 @@
name="2"
value="2"/>
</combo_box>
--->
+
<text
type="string"
length="1"
@@ -327,6 +349,37 @@
value="4"/>
</combo_box>
+ <slider
+ control_name="RenderAvatarPhysicsLODFactor"
+ follows="left|top"
+ height="16"
+ initial_value="100"
+ increment=".05"
+ label=" Avatar Physics:"
+ label_width="85"
+ layout="topleft"
+ left_delta="-16"
+ name="AvatarPhysicsDetail"
+ show_text="false"
+ top_pad="12"
+ width="160">
+ <slider.commit_callback
+ function="Pref.UpdateSliderText"
+ parameter="AvatarPhysicsDetailText" />
+ </slider>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="12"
+ layout="topleft"
+ left_delta="165"
+ name="AvatarPhysicsDetailText"
+ top_pad="-16"
+ width="128">
+ Low
+ </text>
+
<slider
control_name="RenderFarClip"
decimal_digits="0"
@@ -618,6 +671,7 @@
width="128">
Low
</text>
+
<text
type="string"
length="1"
@@ -628,7 +682,7 @@
name="AvatarRenderingText"
top_pad="18"
width="128">
- Avatar rendering:
+ Avatar Rendering:
</text>
<check_box
control_name="RenderUseImpostors"
@@ -669,10 +723,10 @@
follows="left|top"
height="12"
layout="topleft"
- left="358"
+ left="407"
left_pad="-30"
name="TerrainDetailText"
- top="226"
+ top="250"
width="155">
Terrain detail:
</text>
@@ -681,7 +735,7 @@
draw_border="false"
height="38"
layout="topleft"
- left_delta="0"
+ left_delta="5"
name="TerrainDetailRadio"
top_pad="5"
width="70">
@@ -710,7 +764,7 @@
layout="topleft"
left="10"
name="Apply"
- top="383"
+ top="390"
width="115">
<button.commit_callback
function="Pref.Apply" />
@@ -722,7 +776,7 @@
layout="topleft"
left_pad="3"
name="Defaults"
- top="383"
+ top="390"
width="115">
<button.commit_callback
function="Pref.HardwareDefaults" />
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_move.xml b/indra/newview/skins/default/xui/en/panel_preferences_move.xml
index d2fc6ea09a..d9067b41c7 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_move.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_move.xml
@@ -86,16 +86,6 @@
name="appearance_camera_movement"
tool_tip="Use automatic camera positioning while in edit mode"
width="242" />
- <check_box
- control_name="SidebarCameraMovement"
- follows="left|top"
- height="16"
- initial_value="true"
- label="Sidebar"
- layout="topleft"
- name="appearance_sidebar_positioning"
- tool_tip="Use automatic camera positioning for sidebar"
- width="242" />
<icon
follows="left|top"
height="18"
@@ -105,27 +95,73 @@
mouse_opaque="false"
visible="true"
width="18"
- top_pad="2"
+ top_pad="10"
left="30" />
+ <text
+ follows="left|top"
+ type="string"
+ length="1"
+ height="10"
+ layout="topleft"
+ left="78"
+ name="keyboard_lbl"
+ width="270"
+ top_delta="2">
+ Keyboard:
+ </text>
+ <check_box
+ control_name="ArrowKeysAlwaysMove"
+ follows="left|top"
+ height="20"
+ label="Arrow keys always move me"
+ layout="topleft"
+ left_delta="5"
+ name="arrow_keys_move_avatar_check"
+ width="237"
+ top_pad="5"/>
+ <check_box
+ control_name="AllowTapTapHoldRun"
+ follows="left|top"
+ height="20"
+ label="Tap-tap-hold to run"
+ layout="topleft"
+ left_delta="0"
+ name="tap_tap_hold_to_run"
+ width="237"
+ top_pad="0"/>
+ <text
+ follows="left|top"
+ type="string"
+ length="1"
+ height="10"
+ layout="topleft"
+ left="78"
+ name="mouse_lbl"
+ width="270"
+ top_pad="15">
+ Mouse:
+ </text>
<check_box
control_name="FirstPersonAvatarVisible"
follows="left|top"
height="20"
label="Show me in Mouselook"
layout="topleft"
- left_pad="30"
+ left_delta="5"
name="first_person_avatar_visible"
+ top_pad="5"
width="256" />
<text
type="string"
length="1"
follows="left|top"
- height="10"
+ height="15"
layout="topleft"
left_delta="3"
name=" Mouse Sensitivity"
top_pad="10"
- width="160">
+ width="160"
+ wrap="true">
Mouselook mouse sensitivity:
</text>
<slider
@@ -135,11 +171,11 @@
initial_value="2"
layout="topleft"
show_text="false"
- left_pad="5"
+ left_pad="0"
max_val="15"
name="mouse_sensitivity"
top_delta="-1"
- width="145" />
+ width="115" />
<check_box
control_name="InvertMouse"
height="16"
@@ -149,63 +185,70 @@
name="invert_mouse"
top_delta="0"
width="128" />
- <check_box
- control_name="ArrowKeysAlwaysMove"
+ <text
follows="left|top"
- height="20"
- label="Arrow keys always move me"
+ type="string"
+ length="1"
+ height="10"
layout="topleft"
- left="78"
- name="arrow_keys_move_avatar_check"
- width="237"
- top_pad="1"/>
- <check_box
- control_name="AllowTapTapHoldRun"
- follows="left|top"
- height="20"
- label="Tap-tap-hold to run"
+ left="86"
+ name="single_click_action_lbl"
+ width="150"
+ top_pad="20">
+ Single click on land:
+ </text>
+ <combo_box
+ height="23"
layout="topleft"
- left_delta="0"
- name="tap_tap_hold_to_run"
- width="237"
- top_pad="0"/>
- <check_box
+ left_pad="10"
+ top_delta="-6"
+ name="single_click_action_combo"
+ width="200">
+ <combo_box.item
+ label="No action"
+ name="0"
+ value="0"/>
+ <combo_box.item
+ label="Move to clicked point"
+ name="1"
+ value="1"/>
+ <combo_box.commit_callback
+ function="Pref.ClickActionChange"/>
+ </combo_box>
+ <text
follows="left|top"
- height="20"
- label="Double-Click to:"
+ type="string"
+ length="1"
+ height="10"
layout="topleft"
- left_delta="0"
- name="double_click_chkbox"
- width="237"
- top_pad="0">
- <check_box.commit_callback
- function="Pref.CommitDoubleClickChekbox"/>
- </check_box>
- <radio_group
- height="20"
- layout="topleft"
- left_delta="17"
- top_pad="2"
- name="double_click_action">
- <radio_item
- height="16"
- label="Teleport"
- layout="topleft"
- left="0"
- name="radio_teleport"
- top_delta="20"
- width="100" />
- <radio_item
- height="16"
- label="Auto-pilot"
- left_pad="0"
- layout="topleft"
- name="radio_autopilot"
- top_delta="0"
- width="75" />
- <radio_group.commit_callback
- function="Pref.CommitRadioDoubleClick"/>
- </radio_group>
+ left="86"
+ name="double_click_action_lbl"
+ width="150"
+ top_pad="12">
+ Double click on land:
+ </text>
+ <combo_box
+ height="23"
+ layout="topleft"
+ left_pad="10"
+ top_delta="-6"
+ name="double_click_action_combo"
+ width="200">
+ <combo_box.item
+ label="No action"
+ name="0"
+ value="0"/>
+ <combo_box.item
+ label="Move to clicked point"
+ name="1"
+ value="1"/>
+ <combo_box.item
+ label="Teleport to clicked point"
+ name="2"
+ value="2"/>
+ <combo_box.commit_callback
+ function="Pref.ClickActionChange"/>
+ </combo_box>
<button
height="23"
label="Other Devices"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
index 2ddb81559f..587c461bee 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
@@ -42,6 +42,15 @@
</text>
<check_box
height="16"
+ enabled="false"
+ label="Show me in Search results"
+ layout="topleft"
+ left="30"
+ name="online_searchresults"
+ top_pad="20"
+ width="350" />
+ <check_box
+ height="16"
enabled="false"
label="Only friends and groups know I'm online"
layout="topleft"
@@ -50,7 +59,6 @@
top_pad="30"
width="350" />
<check_box
- enabled_control="EnableVoiceChat"
control_name="VoiceCallsFriendsOnly"
height="16"
label="Only friends and groups can call or IM me"
@@ -69,6 +77,16 @@
name="auto_disengage_mic_check"
top_pad="10"
width="350" />
+ <check_box
+ control_name="ShowFavoritesOnLogin"
+ enabled="false"
+ height="16"
+ layout="topleft"
+ label="Show my Favorite Landmarks at Login (via &apos;Start At&apos; drop-down menu)"
+ left="30"
+ name="favorites_on_login_check"
+ top_pad="10"
+ width="350" />
<text
type="string"
length="1"
@@ -78,7 +96,7 @@
left="30"
mouse_opaque="false"
name="Logs:"
- top_pad="30"
+ top_pad="20"
width="350">
Chat Logs:
</text>
@@ -120,7 +138,7 @@
height="16"
label="Add datestamp to log file name."
layout="topleft"
- left_detla="5"
+ left_delta="5"
name="logfile_name_datestamp"
top_pad="10"
width="350"/>
@@ -170,7 +188,7 @@
layout="topleft"
left="30"
name="block_list"
- top_pad="35"
+ top_pad="28"
width="145">
<!--<button.commit_callback
function="SideTray.ShowPanel"-->
@@ -185,7 +203,7 @@
layout="topleft"
left_pad="10"
mouse_opaque="false"
- name="cache_size_label_l"
+ name="block_list_label"
top_delta="3"
text_color="LtGray_50"
width="300">
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml
index 584bd1ea9d..4aeea8823e 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml
@@ -70,7 +70,7 @@
layout="topleft"
left="77"
name="connection_port_enabled"
- top_pad="20"
+ top_pad="10"
width="256">
<check_box.commit_callback
function="Notification.Show"
@@ -79,7 +79,7 @@
<spinner
control_name="ConnectionPort"
enabled_control="ConnectionPortEnabled"
- decimal_digits="0"
+ decimal_digits="0"
follows="left|top"
height="23"
increment="1"
@@ -93,98 +93,6 @@
name="connection_port"
top_delta="3"
width="170" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left="80"
- mouse_opaque="false"
- name="cache_size_label_l"
- top_pad="20"
- width="200">
- Cache size
- </text>
- <slider
- can_edit_text="true"
- control_name="CacheSize"
- decimal_digits="0"
- follows="left|top"
- height="15"
- increment="16"
- initial_value="512"
- layout="topleft"
- left_delta="150"
- max_val="1024"
- min_val="32"
- name="cache_size"
- top_delta="-2"
- width="180" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left_pad="6"
- mouse_opaque="false"
- name="text_box5"
- top_delta="1"
- width="40">
- MB
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left="80"
- name="Cache location"
- top_delta="40"
- width="300">
- Cache location:
- </text>
- <line_editor
- control_name="CacheLocationTopFolder"
- border_style="line"
- border_thickness="1"
- follows="left|top"
- font="SansSerif"
- height="23"
- layout="topleft"
- left="80"
- max_length="4096"
- name="cache_location"
- top_pad="5"
- width="205" />
- <button
- follows="left|top"
- height="23"
- label="Browse"
- label_selected="Browse"
- layout="topleft"
- left_pad="5"
- name="set_cache"
- top_delta="-1"
- width="100">
- <button.commit_callback
- function="Pref.SetCache" />
- </button>
- <button
- follows="left|top"
- height="23"
- label="Reset"
- label_selected="Reset"
- layout="topleft"
- left_pad="3"
- name="reset_cache"
- top_delta="0"
- width="100">
- <button.commit_callback
- function="Pref.ResetCache" />
- </button>
<text
type="string"
@@ -214,7 +122,7 @@
layout="topleft"
left_delta="0"
name="external"
- value="1"
+ value="true"
top="0"
tool_tip="Use the default system web browser for help, web links, etc. Not recommended if running full screen."
width="480" />
@@ -287,74 +195,68 @@
name="media_popup_enabled"
width="400"
top_pad="5"/>
- <check_box
- top_delta="4"
- enabled="true"
- follows="left|top"
- height="14"
- initial_value="false"
- control_name="BrowserProxyEnabled"
- label="Enable Web Proxy"
- left_delta="0"
- mouse_opaque="true"
- name="web_proxy_enabled"
- radio_style="false"
- width="400" top_pad="5"/>
<text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left_delta="20"
- name="Proxy location"
- top_delta="16"
- width="300">
- Proxy location:
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left="30"
+ name="Software updates:"
+ mouse_opaque="false"
+ top_pad="5"
+ width="300">
+ Software updates:
</text>
- <line_editor
- control_name="BrowserProxyAddress"
- enabled_control="BrowserProxyEnabled"
- follows="left|top"
- font="SansSerif"
- height="23"
- layout="topleft"
- left_delta="0"
- name="web_proxy_editor"
- tool_tip="The name or IP address of the proxy you would like to use"
- top_pad="4"
- width="200" />
- <spinner
- control_name="BrowserProxyPort"
- enabled_control="BrowserProxyEnabled"
- decimal_digits="0"
- follows="left|top"
- height="23"
- increment="1"
- initial_value="80"
- label="Port number:"
- label_width="95"
- layout="topleft"
- left_delta="210"
- max_val="12000"
- min_val="10"
- name="web_proxy_port"
- top_delta="0"
- width="145" />
-
- <check_box
- top_delta="2"
- enabled="true"
+ <combo_box
+ control_name="UpdaterServiceSetting"
+ follows="left|top"
+ height="23"
+ layout="topleft"
+ left_delta="50"
+ top_pad="5"
+ name="updater_service_combobox"
+ width="300">
+ <combo_box.item
+ label="Install automatically"
+ name="Install_automatically"
+ value="3" />
+ <!--
+ <combo_box.item
+ label="Ask before installing"
+ name="Install_ask"
+ value="1" />
+ -->
+ <combo_box.item
+ label="Download and install updates manually"
+ name="Install_manual"
+ value="0" />
+ </combo_box>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left="30"
+ name="Proxy Settings:"
+ mouse_opaque="false"
+ top_pad="5"
+ width="300">
+ Proxy Settings:
+ </text>
+ <button
+ label="Adjust proxy settings"
follows="left|top"
- height="18"
- initial_value="true"
- control_name="UpdaterServiceActive"
- label="Automatically download and install [APP_NAME] updates"
- left="30"
- mouse_opaque="true"
- name="updater_service_active"
- radio_style="false"
- width="400"
- top_pad="10"/>
-
+ height="23"
+ width="140"
+ label_selected="Browse"
+ layout="topleft"
+ left_delta="50"
+ name="set_proxy"
+ top_pad="5"
+ >
+ <button.commit_callback
+ function="Pref.Proxy" />
+ </button>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
index da366f30ae..b71586aab1 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
@@ -50,12 +50,24 @@
control_name="MuteWhenMinimized"
height="15"
initial_value="true"
- label="Mute when minimized"
layout="topleft"
name="mute_when_minimized"
top_delta="3"
left_pad="5"
- width="235" />
+ width="20" />
+ <!-- *HACK
+ After storm-1109 will be fixed: instead of using this text_box, word_wrap should be applied for "mute_when_minimized" check_box's label.-->
+ <text
+ follows="top|left"
+ height="15"
+ layout="topleft"
+ left_pad="0"
+ name="mute_chb_label"
+ top_delta="-1"
+ width="150"
+ wrap="true">
+ Mute when minimized
+ </text>
<slider
control_name="AudioLevelUI"
disabled_control="MuteAudio"
@@ -111,8 +123,8 @@
function="Pref.setControlFalse"
parameter="MuteAmbient" />
</slider>
- <button
- control_name="MuteAmbient"
+ <button
+ control_name="MuteAmbient"
disabled_control="MuteAudio"
follows="top|left"
height="16"
@@ -145,7 +157,7 @@
function="Pref.setControlFalse"
parameter="MuteSounds" />
</slider>
- <button
+ <button
control_name="MuteSounds"
disabled_control="MuteAudio"
follows="top|left"
@@ -157,7 +169,10 @@
left_pad="5"
name="mute_audio"
tab_stop="false"
- width="16" />
+ width="16">
+ <button.commit_callback
+ function="Pref.SetSounds"/>
+ </button>
<slider
control_name="AudioLevelMusic"
disabled_control="MuteAudio"
@@ -198,9 +213,12 @@
label="Enabled"
layout="topleft"
left_pad="5"
- name="music_enabled"
+ name="enable_music"
top_delta="2"
- width="350"/>
+ width="350">
+ <check_box.commit_callback
+ function="Pref.updateMediaAutoPlayCheckbox"/>
+ </check_box>
<slider
control_name="AudioLevelMedia"
disabled_control="MuteAudio"
@@ -245,7 +263,10 @@
top_delta="2"
left_pad="5"
name="enable_media"
- width="110"/>
+ width="110">
+ <check_box.commit_callback
+ function="Pref.updateMediaAutoPlayCheckbox"/>
+ </check_box>
<slider
control_name="AudioLevelVoice"
disabled_control="MuteAudio"
@@ -296,6 +317,7 @@
<check_box
name="media_auto_play_btn"
control_name="ParcelMediaAutoPlayEnable"
+ enabled_control="AudioStreamingMedia"
value="true"
follows="left|bottom|right"
height="15"
@@ -313,7 +335,17 @@
label="Play media attached to other avatars"
left="25"
width="230"/>
-
+ <check_box
+ name="gesture_audio_play_btn"
+ control_name="EnableGestureSounds"
+ disabled_control="MuteAudio"
+ value="true"
+ follows="left|bottom|right"
+ height="15"
+ tool_tip="Check this to hear sounds from gestures"
+ label="Play sounds from gestures"
+ top_pad="1"
+ left="25"/>
<text
type="string"
length="1"
@@ -322,7 +354,7 @@
layout="topleft"
left="25"
name="voice_chat_settings"
- width="180"
+ width="200"
top_pad="7">
Voice Chat Settings
</text>
@@ -353,7 +385,7 @@
height="18"
image_name="Move_Walk_Off"
layout="topleft"
- left_pad="170"
+ left_pad="170"
name="avatar_icon"
mouse_opaque="false"
visible="true"
@@ -460,163 +492,12 @@
width="190">
</button>
<panel
- background_visible="false"
- bg_alpha_color="DkGray"
+ layout="topleft"
+ filename="panel_sound_devices.xml"
visiblity_control="ShowDeviceSettings"
- border="false"
- follows="top|left"
- height="100"
- label="Device Settings"
- layout="topleft"
- left_delta="-2"
name="device_settings_panel"
- class="panel_voice_device_settings"
- width="470"
- top_pad="0">
- <panel.string
- name="default_text">
- Default
- </panel.string>
- <panel.string
- name="default system device">
- Default system device
- </panel.string>
- <panel.string
- name="no device">
- No device
- </panel.string>
- <icon
- height="18"
- image_name="Microphone_On"
- left_delta="4"
- name="microphone_icon"
- mouse_opaque="false"
- top="7"
- visible="true"
- width="18" />
- <text
- type="string"
- length="1"
- font.style="BOLD"
- follows="left|top"
- height="16"
- layout="topleft"
- left_pad="3"
- name="Input"
- width="70">
- Input
- </text>
- <combo_box
- height="23"
- control_name="VoiceInputAudioDevice"
- layout="topleft"
- left_pad="0"
- max_chars="128"
- name="voice_input_device"
- top_delta="-5"
- width="200" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="16"
- layout="topleft"
- left_delta="-70"
- name="My volume label"
- top_pad="4"
- width="200">
- My volume:
- </text>
- <slider_bar
- control_name="AudioLevelMic"
- follows="left|top"
- height="17"
- increment="0.025"
- initial_value="1.0"
- layout="topleft"
- left_delta="-6"
- max_val="2"
- name="mic_volume_slider"
- tool_tip="Change the volume using this slider"
- top_pad="-1"
- width="220" />
- <text
- type="string"
- text_color="EmphasisColor"
- length="1"
- follows="left|top"
- height="18"
- layout="topleft"
- left_pad="5"
- name="wait_text"
- top_delta="-1"
- width="110">
- Please wait
- </text>
- <locate
- height="20"
- layout="topleft"
- left_delta="0"
- name="bar0"
- top_delta="-2"
- width="20" />
- <locate
- height="20"
- layout="topleft"
- left_pad="5"
- name="bar1"
- top_delta="0"
- width="20" />
- <locate
- height="20"
- layout="topleft"
- left_pad="5"
- name="bar2"
- top_delta="0"
- width="20" />
- <locate
- height="20"
- layout="topleft"
- left_pad="5"
- name="bar3"
- top_delta="0"
- width="20" />
- <locate
- height="20"
- layout="topleft"
- left_pad="5"
- name="bar4"
- top_delta="0"
- width="20" />
- <icon
- height="18"
- image_name="Parcel_Voice_Light"
- left="5"
- name="speaker_icon"
- mouse_opaque="false"
- top_pad="3"
- visible="true"
- width="22" />
- <text
- font.style="BOLD"
- type="string"
- length="1"
- follows="left|top"
- height="15"
- layout="topleft"
- left_pad="0"
- name="Output"
- width="70">
- Output
- </text>
- <combo_box
- control_name="VoiceOutputAudioDevice"
- height="23"
- layout="topleft"
- left_pad="0"
- max_chars="128"
- name="voice_output_device"
- top_delta="-3"
- width="200" />
- </panel>
+ top_pad="0"
+ width="480"
+ left="18"
+ class="panel_voice_device_settings"/>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml
index 273c252474..198ccd6e2f 100644
--- a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml
+++ b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml
@@ -31,8 +31,7 @@
width="0"
name="left_bookend_bottom"
mouse_opaque="false"
- layout="topleft"
- user_resize="false" />
+ layout="topleft"/>
<layout_panel
name="media_progress_indicator"
mouse_opaque="false"
@@ -41,7 +40,6 @@
left="0"
top="0"
auto_resize="false"
- user_resize="false"
min_width="100"
width="200">
<progress_bar
@@ -59,8 +57,7 @@
name="right_bookend_bottom"
width="0"
mouse_opaque="false"
- layout="topleft"
- user_resize="false" />
+ layout="topleft"/>
</layout_stack>
<layout_stack
name="media_controls"
@@ -79,13 +76,11 @@
top="0"
width="0"
mouse_opaque="false"
- layout="topleft"
- user_resize="false" />
+ layout="topleft"/>
<layout_panel
name="back"
top="0"
auto_resize="false"
- user_resize="false"
layout="topleft"
mouse_opaque="false"
min_width="22"
@@ -114,7 +109,6 @@
name="fwd"
mouse_opaque="false"
auto_resize="false"
- user_resize="false"
layout="topleft"
min_width="22"
top="0"
@@ -142,7 +136,6 @@
name="home"
mouse_opaque="false"
auto_resize="false"
- user_resize="false"
layout="topleft"
top="0"
height="22"
@@ -170,7 +163,6 @@
name="media_stop"
mouse_opaque="false"
auto_resize="false"
- user_resize="false"
layout="topleft"
top="0"
height="22"
@@ -198,7 +190,6 @@
name="reload"
mouse_opaque="false"
auto_resize="false"
- user_resize="false"
layout="topleft"
top="0"
height="22"
@@ -226,7 +217,6 @@
name="stop"
mouse_opaque="false"
auto_resize="false"
- user_resize="false"
layout="topleft"
top="0"
height="22"
@@ -254,7 +244,6 @@
name="play"
mouse_opaque="false"
auto_resize="false"
- user_resize="false"
layout="topleft"
top="0"
height="22"
@@ -282,7 +271,6 @@
name="pause"
mouse_opaque="false"
auto_resize="false"
- user_resize="false"
layout="topleft"
top="0"
min_width="22"
@@ -310,7 +298,6 @@
name="media_address"
mouse_opaque="false"
auto_resize="true"
- user_resize="false"
height="24"
follows="left|right|bottom"
layout="topleft"
@@ -343,8 +330,7 @@
layout="topleft"
width="16"
mouse_opaque="false"
- auto_resize="false"
- user_resize="false">
+ auto_resize="false">
<icon
name="media_whitelist_flag"
follows="top|right"
@@ -358,8 +344,7 @@
layout="topleft"
width="16"
mouse_opaque="false"
- auto_resize="false"
- user_resize="false">
+ auto_resize="false">
<icon
name="media_secure_lock_flag"
height="16"
@@ -374,7 +359,6 @@
name="media_play_position"
mouse_opaque="false"
auto_resize="true"
- user_resize="false"
follows="left|right"
layout="topleft"
top="0"
@@ -399,7 +383,6 @@
name="skip_back"
mouse_opaque="false"
auto_resize="false"
- user_resize="false"
layout="topleft"
top="0"
min_width="22"
@@ -428,7 +411,6 @@
name="skip_forward"
mouse_opaque="false"
auto_resize="false"
- user_resize="false"
layout="topleft"
top="0"
min_width="22"
@@ -455,7 +437,6 @@
name="media_volume"
mouse_opaque="false"
auto_resize="false"
- user_resize="false"
layout="topleft"
top="0"
height="72"
@@ -511,7 +492,6 @@
name="zoom_frame"
mouse_opaque="false"
auto_resize="false"
- user_resize="false"
layout="topleft"
top="0"
height="28"
@@ -539,7 +519,6 @@
name="close"
mouse_opaque="false"
auto_resize="false"
- user_resize="false"
layout="topleft"
top="0"
min_width="21"
@@ -567,7 +546,6 @@
name="new_window"
mouse_opaque="false"
auto_resize="false"
- user_resize="false"
layout="topleft"
top="0"
min_width="22"
@@ -596,8 +574,7 @@
mouse_opaque="false"
top="0"
width="0"
- layout="topleft"
- user_resize="false" />
+ layout="topleft"/>
</layout_stack>
<panel
name="media_region"
diff --git a/indra/newview/skins/default/xui/en/panel_profile.xml b/indra/newview/skins/default/xui/en/panel_profile.xml
deleted file mode 100644
index efc37c2127..0000000000
--- a/indra/newview/skins/default/xui/en/panel_profile.xml
+++ /dev/null
@@ -1,467 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel
- follows="all"
- height="430"
- label="Profile"
- layout="topleft"
- left="0"
- name="panel_profile"
- top="0"
- width="317">
- <string
- name="CaptionTextAcctInfo">
- [ACCTTYPE]
-[PAYMENTINFO] [AGEVERIFICATION]
- </string>
- <string
- name="payment_update_link_url">
- http://www.secondlife.com/account/billing.php?lang=en
- </string>
- <string
- name="partner_edit_link_url">
- http://www.secondlife.com/account/partners.php?lang=en
- </string>
- <string
- name="my_account_link_url"
- value="http://secondlife.com/account" />
- <string
- name="no_partner_text"
- value="None" />
- <string
- name="no_group_text"
- value="None" />
- <string
- name="RegisterDateFormat">
- [REG_DATE] ([AGE])
- </string>
- <layout_stack
- name="layout"
- orientation="vertical"
- follows="all"
- layout="topleft"
- left="0"
- top="0"
- height="400"
- width="317"
- border_size="0">
- <layout_panel
- name="profile_stack"
- follows="all"
- layout="topleft"
- top="0"
- left="0"
- height="400"
- width="317">
- <scroll_container
- color="DkGray2"
- follows="all"
- layout="topleft"
- left="0"
- name="profile_scroll"
- opaque="true"
- height="527"
- width="317"
- top="0">
- <panel
- layout="topleft"
- follows="left|top|right"
- height="505"
- min_height="505"
- name="profile_scroll_panel"
- top="0"
- left="0"
- width="297">
- <panel
- follows="left|top|right"
- height="124"
- layout="topleft"
- left="13"
- name="second_life_image_panel"
- top="0"
- width="297">
- <texture_picker
- allow_no_texture="true"
- default_image_name="None"
- enabled="false"
- fallback_image="Generic_Person_Large"
- follows="top|left"
- height="124"
- layout="topleft"
- left="0"
- name="2nd_life_pic"
- top="10"
- width="102" />
- <text
- follows="left|top|right"
- font.style="BOLD"
- height="15"
- layout="topleft"
- left_pad="10"
- name="title_sl_descr_text"
- text_color="white"
- top_delta="0"
- value="[SECOND_LIFE]:"
- width="180" />
- <expandable_text
- follows="left|top|right"
- height="97"
- layout="topleft"
- left="107"
- textbox.max_length="512"
- textbox.show_context_menu="true"
- name="sl_description_edit"
- top_pad="-3"
- translate="false"
- width="180"
- expanded_bg_visible="true"
- expanded_bg_color="DkGray">
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean viverra orci et justo sagittis aliquet.Nullamma lesuada mauris sit amet ipsum. adipiscing elit. Ae nean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet ipsum. adipiscing elit. Aenean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet ipsum.
- </expandable_text>
- </panel>
- <panel
- follows="left|top|right"
- height="124"
- layout="topleft"
- top_pad="0"
- left="13"
- name="first_life_image_panel"
- width="297">
- <texture_picker
- allow_no_texture="true"
- default_image_name="None"
- enabled="false"
- fallback_image="Generic_Person_Large"
- follows="top|left"
- height="124"
- layout="topleft"
- left="0"
- name="real_world_pic"
- width="102" />
- <text
- follows="left|top|right"
- font.style="BOLD"
- height="15"
- layout="topleft"
- left_pad="10"
- name="title_rw_descr_text"
- text_color="white"
- top_delta="0"
- value="Real World:"
- width="180" />
- <expandable_text
- follows="left|top|right"
- height="97"
- layout="topleft"
- left="107"
- textbox.max_length="512"
- textbox.show_context_menu="true"
- name="fl_description_edit"
- top_pad="-3"
- translate="false"
- width="180"
- expanded_bg_visible="true"
- expanded_bg_color="DkGray">
- Lorem ipsum dolor sit amet, consectetur adlkjpiscing elit moose moose. Aenean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet. adipiscing elit. Aenean rigviverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet sorbet ipsum. adipiscing elit. Aenean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet ipsum.
- </expandable_text>
- </panel>
- <text
- follows="left|top"
- height="15"
- font.style="BOLD"
- font="SansSerifMedium"
- layout="topleft"
- left="10"
- name="homepage_edit"
- top_pad="0"
- translate="false"
- value="http://librarianavengers.org"
- width="300"
- word_wrap="false"
- use_ellipses="true" />
- <text
- follows="left|top"
- font.style="BOLD"
- height="10"
- layout="topleft"
- left="10"
- name="title_member_text"
- text_color="white"
- top_pad="10"
- value="Resident Since:"
- width="300" />
- <text_editor
- allow_scroll="false"
- bg_visible="false"
- follows="left|top"
- h_pad="0"
- height="15"
- layout="topleft"
- left="10"
- name="register_date"
- read_only="true"
- translate="false"
- v_pad="0"
- value="05/31/2376"
- width="300"
- word_wrap="true" />
- <text
- follows="left|top"
- font.style="BOLD"
- height="15"
- layout="topleft"
- left="10"
- name="title_acc_status_text"
- text_color="white"
- top_pad="5"
- value="Account Status:"
- width="300" />
- <!-- <text
- type="string"
- follows="left|top"
- font="SansSerifSmall"
- height="15"
- layout="topleft"
- left_pad="10"
- name="my_account_link"
- top_delta="0"
- value="Go to Dashboard"
- width="100"/> -->
- <text_editor
- allow_scroll="false"
- bg_visible="false"
- follows="left|top"
- h_pad="0"
- height="28"
- layout="topleft"
- left="10"
- name="acc_status_text"
- read_only="true"
- top_pad="0"
- translate="false"
- v_pad="0"
- width="300"
- word_wrap="true">
- Resident. No payment info on file.
- Linden.
- </text_editor>
- <text
- follows="left|top"
- font.style="BOLD"
- height="15"
- layout="topleft"
- left="10"
- name="title_partner_text"
- text_color="white"
- top_pad="3"
- value="Partner:"
- width="300" />
- <panel
- follows="left|top"
- height="15"
- layout="topleft"
- left="10"
- name="partner_data_panel"
- top_pad="0"
- width="300">
- <text
- follows="left|top"
- height="10"
- initial_value="(retrieving)"
- layout="topleft"
- left="0"
- link="true"
- name="partner_text"
- top="0"
- use_ellipses="true"
- width="300" />
- </panel>
- <text
- follows="left|top"
- font.style="BOLD"
- height="13"
- layout="topleft"
- left="10"
- name="title_groups_text"
- text_color="white"
- top_pad="3"
- value="Groups:"
- width="300" />
- <expandable_text
- follows="all"
- height="103"
- layout="topleft"
- left="7"
- name="sl_groups"
- textbox.max_length="512"
- textbox.show_context_menu="true"
- top_pad="0"
- translate="false"
- width="290"
- expanded_bg_visible="true"
- expanded_bg_color="DkGray">
- Lorem ipsum dolor sit amet, consectetur adlkjpiscing elit moose moose. Aenean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet. adipiscing elit. Aenean rigviverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet sorbet ipsum. adipiscing elit. Aenean viverra orci et justo sagittis aliquet. Nullam malesuada mauris sit amet ipsum. Aenean viverra tulip moosetop. Slan de heelish marfnik tooplod. Sum sum to whop de wompam booster copm.
- </expandable_text>
- </panel>
- </scroll_container>
- </layout_panel>
-
-</layout_stack>
-
- <layout_stack
- name="layout_verb_buttons"
- orientation="horizontal"
- follows="bottom|left|right"
- layout="topleft"
- left="2"
- top_pad="1"
- height="30"
- width="315"
- border_size="0">
- <layout_panel
- follows="bottom|left"
- height="30"
- layout="topleft"
- name="profile_buttons_panel"
- top="0"
- auto_resize="false"
- width="317">
-
- <layout_stack
- follows="bottom|left|right"
- height="23"
- layout="topleft"
- name="bottom_bar_ls"
- left="0"
- orientation="horizontal"
- top_pad="5"
- width="317">
-
- <layout_panel
- follows="bottom|left|right"
- height="23"
- layout="bottomleft"
- left="0"
- name="add_friend_btn_lp"
- user_resize="false"
- auto_resize="true"
- width="121">
- <button
- follows="bottom|left|right"
- height="23"
- label="Add Friend"
- layout="topleft"
- left="1"
- mouse_opaque="false"
- name="add_friend"
- tool_tip="Offer friendship to the Resident"
- top="0"
- width="120" />
- </layout_panel>
-
- <layout_panel
- follows="bottom|left|right"
- height="23"
- layout="bottomleft"
- left_pad="3"
- name="im_btn_lp"
- user_resize="false"
- auto_resize="true"
- width="22">
- <button
- follows="bottom|left|right"
- height="23"
- label="IM"
- layout="topleft"
- name="im"
- tool_tip="Open instant message session"
- top="0"
- left="1"
- width="21" />
- </layout_panel>
-
- <layout_panel
- follows="bottom|left|right"
- height="23"
- layout="bottomleft"
- left_pad="3"
- name="call_btn_lp"
- user_resize="false"
- auto_resize="true"
- width="52">
- <button
- follows="bottom|left|right"
- height="23"
- label="Call"
- layout="topleft"
- name="call"
- tool_tip="Call this Resident"
- left="1"
- top="0"
- use_ellipses="true"
- width="51" />
- </layout_panel>
-
- <layout_panel
- follows="bottom|left|right"
- height="23"
- layout="bottomleft"
- left_pad="3"
- name="chat_btn_lp"
- user_resize="false"
- auto_resize="true"
- width="93">
- <button
- follows="bottom|left|right"
- height="23"
- label="Teleport"
- layout="topleft"
- name="teleport"
- tool_tip="Offer teleport"
- left="1"
- top="0"
- use_ellipses="true"
- width="92" />
- </layout_panel>
-
- <layout_panel
- follows="bottom|left|right"
- height="23"
- layout="bottomleft"
- left_pad="3"
- name="overflow_btn_lp"
- user_resize="false"
- auto_resize="false"
- width="24">
- <button
- follows="bottom|left|right"
- height="23"
- label="â–¼"
- layout="topleft"
- name="overflow_btn"
- tool_tip="Pay money to or share inventory with the Resident"
- left="1"
- top="0"
- width="23" />
- </layout_panel>
- </layout_stack>
- </layout_panel>
- <layout_panel
- follows="bottom|left"
- height="30"
- layout="topleft"
- name="profile_me_buttons_panel"
- visible="false"
- width="313">
- <button
- follows="bottom|right"
- height="23"
- left="20"
- top="0"
- label="Edit Profile"
- name="edit_profile_btn"
- tool_tip="Edit your personal information"
- width="130" />
- </layout_panel>
- </layout_stack>
-
-</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_profile_view.xml b/indra/newview/skins/default/xui/en/panel_profile_view.xml
deleted file mode 100644
index 97229c413c..0000000000
--- a/indra/newview/skins/default/xui/en/panel_profile_view.xml
+++ /dev/null
@@ -1,159 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel
- background_visible="true"
- follows="all"
- height="570"
- layout="topleft"
- min_height="350"
- name="panel_target_profile"
- left="0"
- width="333">
- <string
- name="status_online">
- Online
- </string>
- <string
- name="status_offline">
- Offline
- </string>
- <button
- follows="top|left"
- height="24"
- image_hover_unselected="BackButton_Over"
- image_pressed="BackButton_Press"
- image_unselected="BackButton_Off"
- layout="topleft"
- name="back"
- left="10"
- tab_stop="false"
- top="2"
- width="30" />
- <text
- top="10"
- follows="top|left"
- height="13"
- layout="topleft"
- left="45"
- name="display_name_label"
- text_color="LtGray"
- value="Display Name:"
- width="80" />
- <text
- top_delta="0"
- follows="top|left"
- height="13"
- layout="topleft"
- left="45"
- name="solo_username_label"
- text_color="LtGray"
- value="Username:"
- visible="false"
- width="80" />
- <text
- follows="top|right"
- halign="right"
- height="13"
- layout="topleft"
- right="-15"
- name="status"
- text_color="LtGray_50"
- top_delta="0"
- value="Online"
- width="150" />
- <text
- follows="top|left|right"
- font="SansSerifBigBold"
- height="29"
- layout="topleft"
- left="45"
- name="user_name_small"
- text_color="LtGray"
- top="22"
- value="Jack oh look at me this is a super duper long name"
- use_ellipses="true"
- word_wrap="true"
- visible="false"
- width="255" />
- <text
- follows="top|left|right"
- font="SansSerifHugeBold"
- height="27"
- layout="topleft"
- left="45"
- name="user_name"
- text_color="LtGray"
- top="25"
- value="Jack Linden"
- visible="true"
- use_ellipses="true"
- width="258" />
- <button
- name="copy_to_clipboard"
- layout="topleft"
- follows="top|right"
- image_overlay="Copy"
- top_delta="0"
- right="-15"
- height="21"
- width="21"
- tab_stop="false"
- tool_tip="Copy to Clipboard"/>
- <text
- follows="top|left"
- height="13"
- layout="topleft"
- left="45"
- name="user_label"
- text_color="LtGray"
- top_pad="10"
- value="Username:"
- width="70" />
- <text
- follows="top|left"
- height="20"
- layout="topleft"
- left_pad="0"
- name="user_slid"
- text_color="EmphasisColor"
- font="SansSerifBold"
- top_delta="-2"
- use_ellipses="true"
- value="jack.linden"
- width="195"
- wrap="true "/>
- <tab_container
- follows="all"
- height="489"
- halign="center"
- layout="topleft"
- left="5"
- min_width="333"
- name="tabs"
- tab_min_width="80"
- tab_height="30"
- tab_position="top"
- top_pad="5"
- width="317">
- <panel
- class="panel_profile"
- filename="panel_profile.xml"
- label="PROFILE"
- layout="topleft"
- help_topic="profile_profile_tab"
- name="panel_profile" />
- <panel
- class="panel_picks"
- filename="panel_picks.xml"
- label="PICKS"
- layout="topleft"
- help_topic="profile_picks_tab"
- name="panel_picks" />
- <panel
- class="panel_notes"
- filename="panel_notes.xml"
- label="NOTES &amp; PRIVACY"
- layout="topleft"
- help_topic="profile_notes_tab"
- name="panel_notes" />
- </tab_container>
-</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_progress.xml b/indra/newview/skins/default/xui/en/panel_progress.xml
index 2868d91cc7..860caf2d21 100644
--- a/indra/newview/skins/default/xui/en/panel_progress.xml
+++ b/indra/newview/skins/default/xui/en/panel_progress.xml
@@ -12,45 +12,43 @@
height="768"
layout="topleft"
left="0"
- name="stack1"
+ name="horizontal_centering"
orientation="horizontal"
top="0"
width="1024">
<layout_panel
layout="topleft"
min_width="10"
- name="panel1"
- user_resize="false"
+ name="left"
width="150" />
<layout_panel
height="768"
layout="topleft"
- min_width="640"
- name="panel2"
- user_resize="false"
- width="640">
+ min_width="670"
+ name="center"
+ width="670">
<layout_stack
follows="left|right|top|bottom"
height="768"
layout="topleft"
left="0"
orientation="vertical"
- name="stack2"
+ name="vertical_centering"
top="0"
- width="640">
+ width="670">
<layout_panel
height="200"
layout="topleft"
min_height="10"
name="panel3"
- width="640" />
+ width="670" />
<layout_panel
auto_resize="false"
height="250"
layout="topleft"
min_height="250"
name="panel4"
- width="640">
+ width="670">
<icon
color="LoginProgressBoxCenterColor"
follows="left|right|bottom|top"
@@ -59,7 +57,7 @@
layout="topleft"
left="0"
top="0"
- width="640" />
+ width="670" />
<text
follows="left|right|top"
font="SansSerifHuge"
@@ -71,7 +69,7 @@
name="title_text"
text_color="LoginProgressBoxTextColor"
top_delta="50"
- width="593" />
+ right="-47"/>
<text
follows="left|right|top"
font="SansSerif"
@@ -83,7 +81,7 @@
name="progress_text"
text_color="LoginProgressBoxTextColor"
top_pad="5"
- width="593"
+ right="-47"
word_wrap="true"/>
<progress_bar
bottom="115"
@@ -106,7 +104,7 @@
name="message_text"
text_color="LoginProgressBoxTextColor"
top="145"
- width="550"
+ right="-90"
word_wrap="true"/>
</layout_panel>
<layout_panel
@@ -114,14 +112,13 @@
layout="topleft"
min_width="10"
name="panel5"
- width="640" />
+ width="670" />
</layout_stack>
</layout_panel>
<layout_panel
layout="topleft"
min_width="10"
- name="panel6"
- user_resize="false"
+ name="right"
width="150" />
</layout_stack>
<button
@@ -132,4 +129,12 @@
name="cancel_btn"
top="700"
width="90" />
+ <web_browser
+ follows="all"
+ layout="topleft"
+ left="0"
+ name="login_media_panel"
+ width="1024"
+ height="768"
+ top="0"/>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_region_covenant.xml b/indra/newview/skins/default/xui/en/panel_region_covenant.xml
index 2b2ea78fac..112f12500d 100644
--- a/indra/newview/skins/default/xui/en/panel_region_covenant.xml
+++ b/indra/newview/skins/default/xui/en/panel_region_covenant.xml
@@ -57,7 +57,7 @@
mouse_opaque="false"
name="estate_name_text"
top_delta="0"
- width="150">
+ width="350">
mainland
</text>
<text
@@ -79,7 +79,7 @@
mouse_opaque="false"
name="estate_owner_text"
top_delta="0"
- width="150">
+ width="350">
(none)
</text>
<text
@@ -107,13 +107,13 @@
<text_editor
enabled="false"
follows="left|top"
- height="100"
+ height="180"
layout="topleft"
- left="110"
+ left="10"
max_length="65535"
name="covenant_editor"
- top_delta="30"
- width="340"
+ top_delta="20"
+ width="460"
word_wrap="true">
There is no Covenant provided for this Estate.
</text_editor>
diff --git a/indra/newview/skins/default/xui/en/panel_region_debug.xml b/indra/newview/skins/default/xui/en/panel_region_debug.xml
index 15df095efa..4550603134 100644
--- a/indra/newview/skins/default/xui/en/panel_region_debug.xml
+++ b/indra/newview/skins/default/xui/en/panel_region_debug.xml
@@ -174,31 +174,31 @@
<button
follows="left|top"
height="20"
- label="Get Top Scripts..."
+ label="Restart Region"
layout="topleft"
- left="10"
- name="top_scripts_btn"
- tool_tip="List of objects spending the most time running scripts"
- top_pad="5"
+ left_pad="155"
+ name="restart_btn"
+ tool_tip="Give 2 minute countdown and restart region"
+ top_delta="0"
width="150" />
<button
follows="left|top"
height="20"
- label="Restart Region"
+ label="Get Top Scripts..."
layout="topleft"
left="10"
- name="restart_btn"
- tool_tip="Give 2 minute countdown and restart region"
+ name="top_scripts_btn"
+ tool_tip="List of objects spending the most time running scripts"
top_pad="5"
- width="130" />
+ width="150" />
<button
follows="left|top"
height="20"
label="Delay Restart"
layout="topleft"
- left="10"
+ left_pad="155"
name="cancel_restart_btn"
tool_tip="Delay region restart by one hour"
- top_pad="5"
- width="130" />
+ top_delta="0"
+ width="150" />
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_region_environment.xml b/indra/newview/skins/default/xui/en/panel_region_environment.xml
new file mode 100644
index 0000000000..aa38c49fae
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_region_environment.xml
@@ -0,0 +1,149 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+
+<panel
+ border="true"
+ follows="top|left"
+ height="300"
+ label="Environment"
+ layout="topleft"
+ help_topic="panel_region_environment_tab"
+ name="panel_env_info"
+ width="530">
+ <text
+ name="water_settings_title"
+ follows="top|left"
+ height="30"
+ layout="topleft"
+ left="50"
+ top_pad="20"
+ width="430"
+ wrap="true">
+ Select the Water and Sky/Day Cycle Settings you would like all visitors to your region to see. More info
+ </text>
+ <view_border
+ bevel_style="none"
+ follows="top|left"
+ height="237"
+ layout="topleft"
+ left="50"
+ name="border"
+ top="60"
+ width="430"/>
+ <radio_group
+ follows="top|left"
+ height="45"
+ layout="topleft"
+ left_delta="10"
+ name="region_settings_radio_group"
+ top_delta="20"
+ width="200">
+ <radio_item
+ label="Use Second Life default"
+ layout="topleft"
+ name="use_sl_default_settings"/>
+ <radio_item
+ label="Use the following settings"
+ layout="topleft"
+ name="use_my_settings"
+ top_pad="20"/>
+ </radio_group>
+ <panel
+ follows="top|left"
+ height="150"
+ layout="topleft"
+ left="50"
+ name="user_environment_settings"
+ top_pad="20"
+ width="430">
+ <text
+ name="water_settings_title"
+ follows="top|left"
+ height="16"
+ layout="topleft"
+ left="50"
+ top_pad="0"
+ width="160">
+ Water Setting
+ </text>
+ <combo_box
+ follows="top|left"
+ left_pad="2"
+ name="water_settings_preset_combo"
+ top_delta="-7"
+ width="200">
+ <combo_box.item
+ label="-Select a preset-"
+ name="item0"/>
+ </combo_box>
+ <text
+ name="sky_dayc_settings_title"
+ follows="top|left"
+ height="16"
+ layout="topleft"
+ left="50"
+ top_pad="30"
+ width="100">
+ Sky / Day Cycle
+ </text>
+ <radio_group
+ layout="topleft"
+ left_delta="50"
+ name="sky_dayc_settings_radio_group"
+ top_pad="10"
+ height="50"
+ width="110">
+ <radio_item
+ layout="topleft"
+ label="Fixed sky"
+ name="my_sky_settings"/>
+ <radio_item
+ layout="topleft"
+ label="Day cycle"
+ name="my_dayc_settings"
+ top_pad="25"/>
+ </radio_group>
+ <combo_box
+ follows="top|left"
+ left_pad="2"
+ name="sky_settings_preset_combo"
+ top_delta="-7"
+ width="200">
+ <combo_box.item
+ label="-Select a preset-"
+ name="item0"/>
+ </combo_box>
+ <combo_box
+ follows="top|left"
+ name="dayc_settings_preset_combo"
+ top_delta="36"
+ width="200">
+ <combo_box.item
+ label="-Select a preset-"
+ name="item0"/>
+ </combo_box>
+ </panel>
+ <button
+ follows="left|top"
+ height="23"
+ label="Apply"
+ layout="topleft"
+ right="-160"
+ name="apply_btn"
+ top_pad="10"
+ width="100" />
+ <button
+ follows="left|top"
+ height="23"
+ label="Cancel"
+ layout="topleft"
+ left_pad="10"
+ name="cancel_btn"
+ width="100" />
+ <loading_indicator
+ height="23"
+ left="50"
+ name="progress_indicator"
+ top_delta="0"
+ visible="false"
+ width="23" />
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_region_estate.xml b/indra/newview/skins/default/xui/en/panel_region_estate.xml
index 1307d807e2..bfd796a62b 100644
--- a/indra/newview/skins/default/xui/en/panel_region_estate.xml
+++ b/indra/newview/skins/default/xui/en/panel_region_estate.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
- border="false"
+ border="true"
follows="top|left"
height="510"
help_topic="panel_region_estate_tab"
@@ -20,7 +20,7 @@
name="estate_help_text"
top="14"
word_wrap="true"
- width="300">
+ >
Changes to settings on this tab will affect all regions in the estate.
</text>
<text
@@ -30,9 +30,10 @@
font="SansSerif"
height="20"
layout="topleft"
- left_delta="0"
+ right="160"
name="estate_text"
top_pad="2"
+ halign="right"
width="140">
Estate:
</text>
@@ -43,9 +44,9 @@
font="SansSerif"
height="20"
layout="topleft"
- left_delta="0"
+ top_delta="0"
name="estate_name"
- top_delta="16"
+ left_pad="6"
width="150">
(unknown)
</text>
@@ -56,9 +57,10 @@
font="SansSerif"
height="20"
layout="topleft"
- left_delta="0"
+ right="160"
name="owner_text"
- top_pad="2"
+ top_pad="6"
+ halign="right"
width="150">
Estate owner:
</text>
@@ -69,142 +71,91 @@
font="SansSerif"
height="20"
layout="topleft"
- left_delta="0"
+ top_delta="0"
name="estate_owner"
- top_delta="16"
+ left_pad="6"
use_ellipses="true"
width="290">
(unknown)
</text>
+
<view_border
- bevel_style="in"
+ bevel_style="none"
follows="top|left"
- height="270"
+ height="95"
layout="topleft"
- left_delta="-4"
+ left="10"
top_pad="5"
- width="300" />
+ width="470" />
+
<check_box
height="20"
- label="Use Global Time"
+ label="Allow Public Access"
layout="topleft"
- left="12"
- name="use_global_time_check"
- top="132"
+ left="20"
+ name="externally_visible_check"
+ top_delta="5"
width="200" />
+
<check_box
height="20"
- label="Fixed Sun"
- layout="topleft"
- left="12"
- name="fixed_sun_check"
- top="152"
- width="100" />
- <icon
- height="20"
- image_name="icon_day_cycle.tga"
+ label="Allow Voice Chat"
layout="topleft"
- left="47"
- name="daycycle"
- top="177"
- width="165" />
- <slider
- follows="left|top"
- height="20"
- increment="0.001"
- label="Phase"
- layout="topleft"
- left="12"
- max_val="30"
- min_val="6"
- name="sun_hour_slider"
- show_text="false"
- top="202"
+ left="280"
+ name="voice_chat_check"
+ top_delta="0"
width="200" />
<check_box
height="20"
- label="Allow Public Access"
+ label="Allow Direct Teleport"
layout="topleft"
left_delta="0"
- name="externally_visible_check"
- top_pad="6"
- width="200" />
+ name="allow_direct_teleport"
+ top_pad="4"
+ width="80" />
+ <button
+ enabled="false"
+ follows="left|top"
+ height="23"
+ label="Apply"
+ layout="topleft"
+ name="apply_btn"
+ top_pad="15"
+ left_delta="0"
+ width="97" />
+
<text
type="string"
length="1"
follows="top|left"
height="16"
layout="topleft"
- left="32"
+ left="20"
name="Only Allow"
- top="250"
+ top_delta="-30"
width="278">
- Restrict Access to accounts verified by:
+ Allow access only to Residents who:
</text>
<check_box
follows="top|left"
height="16"
- label="Payment Information on File"
+ label="Have payment information on file"
layout="topleft"
left_delta="0"
name="limit_payment"
- tool_tip="Ban unidentified Residents"
+ tool_tip="Residents must have payment information on file to access this estate. See the [SUPPORT_SITE] for more information."
top_pad="2"
width="278" />
<check_box
follows="top|left"
height="16"
- label="Age Verification"
+ label="Have been age-verified"
layout="topleft"
left_delta="0"
name="limit_age_verified"
- tool_tip="Ban Residents who have not verified their age. See the [SUPPORT_SITE] for more information."
+ tool_tip="Residents must be age verified to access this estate. See the [SUPPORT_SITE] for more information."
top_pad="2"
width="278" />
- <check_box
- height="20"
- label="Allow Voice Chat"
- layout="topleft"
- left="12"
- name="voice_chat_check"
- top="304"
- width="200" />
- <check_box
- height="20"
- label="Allow Direct Teleport"
- layout="topleft"
- left="12"
- name="allow_direct_teleport"
- top_pad="4"
- width="80" />
- <button
- enabled="false"
- follows="left|top"
- height="23"
- label="Apply"
- layout="topleft"
- name="apply_btn"
- top_pad="10"
- left="110"
- width="97" />
- <button
- follows="left|top"
- height="23"
- label="Send Message To Estate..."
- layout="topleft"
- left="45"
- name="message_estate_btn"
- top_pad="20"
- width="220" />
- <button
- follows="left|top"
- height="23"
- label="Kick Resident from Estate..."
- layout="topleft"
- left="45"
- name="kick_user_from_estate_btn"
- top_pad="5"
- width="220" />
<text
type="string"
@@ -214,16 +165,31 @@
height="20"
layout="topleft"
name="estate_manager_label"
- right="520"
+ top_pad="30"
+ left="10"
width="200">
Estate Managers:
</text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="20"
+ layout="topleft"
+ left="280"
+ name="allow_resident_label"
+ top_delta="0"
+ width="200">
+ Allowed Residents:
+ </text>
+
+ <!-- Estate Managers box -->
<view_border
bevel_style="none"
follows="top|left"
height="71"
layout="topleft"
- right="520"
+ left="10"
top_pad="-5"
width="200" />
<name_list
@@ -235,43 +201,15 @@
name="estate_manager_name_list"
top_delta="0"
width="200" />
- <button
- follows="left|top"
- height="23"
- label="Remove..."
- layout="topleft"
- name="remove_estate_manager_btn"
- right="520"
- top_pad="5"
- width="97" />
- <button
- follows="left|top"
- height="23"
- label="Add..."
- layout="topleft"
- left_delta="-103"
- name="add_estate_manager_btn"
- top_delta="0"
- width="97" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="20"
- layout="topleft"
- left_delta="0"
- name="allow_resident_label"
- top_pad="10"
- width="200">
- Allowed Residents:
- </text>
+
+ <!-- Allowed Residents box -->
<view_border
bevel_style="none"
follows="top|left"
height="71"
layout="topleft"
- right="520"
- top_pad="-5"
+ left="280"
+ top_delta="0"
width="200" />
<name_list
follows="left|top"
@@ -282,42 +220,78 @@
name="allowed_avatar_name_list"
top_delta="0"
width="200" />
+
+ <!-- Estate Managers buttons -->
+ <button
+ follows="left|top"
+ height="23"
+ label="Add..."
+ layout="topleft"
+ left="10"
+ name="add_estate_manager_btn"
+ top_pad="6"
+ width="97" />
<button
follows="left|top"
height="23"
label="Remove..."
layout="topleft"
- name="remove_allowed_avatar_btn"
- right="520"
- top_pad="5"
+ name="remove_estate_manager_btn"
+ left_pad="6"
width="97" />
+
+ <!-- Allowed Residents buttons -->
<button
follows="left|top"
height="23"
+ left="280"
label="Add..."
layout="topleft"
- left_delta="-103"
name="add_allowed_avatar_btn"
top_delta="0"
width="97" />
+ <button
+ follows="left|top"
+ height="23"
+ label="Remove..."
+ layout="topleft"
+ name="remove_allowed_avatar_btn"
+ left_pad="6"
+ top_delta="0"
+ width="97" />
+
<text
type="string"
length="1"
follows="left|top"
height="20"
layout="topleft"
- left_delta="0"
+ left="10"
name="allow_group_label"
top_pad="10"
width="200">
Allowed Groups:
</text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="20"
+ layout="topleft"
+ left="280"
+ name="ban_resident_label"
+ top_delta="0"
+ width="200">
+ Banned Residents:
+ </text>
+
+ <!-- Allowed Groups box -->
<view_border
bevel_style="none"
follows="top|left"
height="71"
layout="topleft"
- right="520"
+ left="10"
top_pad="-5"
width="200" />
<name_list
@@ -329,43 +303,15 @@
name="allowed_group_name_list"
top_delta="0"
width="200" />
- <button
- follows="left|top"
- height="23"
- label="Remove..."
- layout="topleft"
- name="remove_allowed_group_btn"
- right="520"
- top_pad="5"
- width="97" />
- <button
- follows="left|top"
- height="23"
- label="Add..."
- layout="topleft"
- left_delta="-103"
- name="add_allowed_group_btn"
- top_delta="0"
- width="97" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="20"
- layout="topleft"
- left_delta="0"
- name="ban_resident_label"
- top_pad="10"
- width="200">
- Banned Residents:
- </text>
+
+ <!-- Banned Residents box -->
<view_border
bevel_style="none"
follows="top|left"
height="71"
layout="topleft"
- right="520"
- top_pad="-5"
+ left="280"
+ top_delta="0"
width="200" />
<name_list
follows="left|top"
@@ -376,22 +322,64 @@
name="banned_avatar_name_list"
top_delta="0"
width="200" />
+
+ <!-- Allowed Groups buttons -->
+ <button
+ follows="left|top"
+ height="23"
+ label="Add..."
+ layout="topleft"
+ left="10"
+ name="add_allowed_group_btn"
+ top_pad="6"
+ width="97" />
<button
follows="left|top"
height="23"
label="Remove..."
layout="topleft"
- name="remove_banned_avatar_btn"
- right="520"
- top_pad="5"
+ name="remove_allowed_group_btn"
+ left_pad="6"
+ top_delta="0"
width="97" />
+
+ <!-- Banned Residents buttons -->
<button
follows="left|top"
height="23"
label="Add..."
layout="topleft"
- left_delta="-103"
+ left="280"
name="add_banned_avatar_btn"
top_delta="0"
width="97" />
+ <button
+ follows="left|top"
+ height="23"
+ label="Remove..."
+ layout="topleft"
+ name="remove_banned_avatar_btn"
+ top_delta="0"
+ left_pad="6"
+ width="97" />
+
+ <button
+ follows="left|top"
+ height="23"
+ label="Send Message To Estate..."
+ layout="topleft"
+ left="10"
+ name="message_estate_btn"
+ top_pad="20"
+ width="220" />
+ <button
+ follows="left|top"
+ height="23"
+ label="Kick Resident from Estate..."
+ layout="topleft"
+ left="280"
+ name="kick_user_from_estate_btn"
+ top_delta="0"
+ width="220" />
+
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_region_general.xml b/indra/newview/skins/default/xui/en/panel_region_general.xml
index ca9579284b..44c84e69a1 100644
--- a/indra/newview/skins/default/xui/en/panel_region_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_region_general.xml
@@ -114,7 +114,7 @@
layout="topleft"
left="10"
name="allow_land_resell_check"
- top="160"
+ top="150"
width="80" />
<check_box
height="20"
@@ -122,7 +122,7 @@
layout="topleft"
left="10"
name="allow_parcel_changes_check"
- top="180"
+ top="170"
width="80" />
<check_box
height="20"
@@ -131,9 +131,9 @@
left="10"
name="block_parcel_search_check"
tool_tip="Let people see this region and its parcels in search results"
- top="200"
+ top="190"
width="80" />
- <spinner
+ <spinner
decimal_digits="0"
follows="left|top"
height="20"
diff --git a/indra/newview/skins/default/xui/en/panel_region_terrain.xml b/indra/newview/skins/default/xui/en/panel_region_terrain.xml
index 5093c52129..5d060c0a0d 100644
--- a/indra/newview/skins/default/xui/en/panel_region_terrain.xml
+++ b/indra/newview/skins/default/xui/en/panel_region_terrain.xml
@@ -2,7 +2,7 @@
<panel
border="true"
follows="top|left"
- height="320"
+ height="460"
help_topic="panel_region_terrain_tab"
label="Terrain"
layout="topleft"
@@ -50,10 +50,10 @@
label="Terrain Raise Limit"
label_width="120"
layout="topleft"
- left="15"
+ left="240"
max_val="100"
name="terrain_raise_spin"
- top="60"
+ top="40"
width="180" />
<spinner
follows="left|top"
@@ -62,95 +62,336 @@
label="Terrain Lower Limit"
label_width="120"
layout="topleft"
- left="15"
+ left="240"
max_val="0"
min_val="-100"
name="terrain_lower_spin"
- top="80"
+ top="60"
width="180" />
- <check_box
+ <view_border
+ bevel_style="none"
+ follows="top|left"
+ height="60"
+ layout="topleft"
+ left="8"
+ top="30"
+ width="460" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
height="20"
- label="Use Estate Sun"
layout="topleft"
- left="250"
- name="use_estate_sun_check"
- top="35"
+ left="10"
+ name="detail_texture_text"
+ top="110"
+ width="300">
+ Terrain Textures (requires 512x512, 24 bit .tga files)
+ </text>
+ <texture_picker
+ follows="left|top"
+ height="100"
+ layout="topleft"
+ left_delta="0"
+ name="texture_detail_0"
+ top_delta="20"
width="100" />
- <check_box
- height="20"
- label="Fixed Sun"
+ <texture_picker
+ follows="left|top"
+ height="100"
+ layout="topleft"
+ left_pad="10"
+ name="texture_detail_1"
+ top_delta="0"
+ width="100" />
+ <texture_picker
+ follows="left|top"
+ height="100"
+ layout="topleft"
+ left_pad="10"
+ name="texture_detail_2"
+ top_delta="0"
+ width="100" />
+ <texture_picker
+ follows="left|top"
+ height="100"
layout="topleft"
- left="250"
- name="fixed_sun_check"
- top="55"
+ left_pad="10"
+ name="texture_detail_3"
+ top_delta="0"
width="100" />
- <icon
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
height="20"
- image_name="icon_day_cycle.tga"
layout="topleft"
- left="285"
- name="daycycle"
- top="80"
- width="165" />
- <slider
+ left="10"
+ name="height_text_lbl"
+ top_delta="90"
+ width="65">
+ 1 (Low)
+ </text>
+ <text
+ type="string"
+ length="1"
follows="left|top"
height="20"
- increment="0.001"
- label="Phase"
layout="topleft"
- left="250"
- max_val="30"
- min_val="6"
- name="sun_hour_slider"
- show_text="false"
- top="105"
- width="200" />
- <button
- enabled="false"
+ left_pad="45"
+ name="height_text_lbl2"
+ top_delta="0"
+ width="100">
+ 2
+ </text>
+ <text
+ type="string"
+ length="1"
follows="left|top"
height="20"
- label="Apply"
layout="topleft"
- left="350"
- name="apply_btn"
- top="135"
- width="90" />
- <view_border
- bevel_style="none"
- follows="top|left"
- height="130"
+ left_pad="10"
+ name="height_text_lbl3"
+ top_delta="0"
+ width="100">
+ 3
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="20"
layout="topleft"
- left="8"
- top="30"
- width="460" />
+ left_pad="10"
+ name="height_text_lbl4"
+ top_delta="0"
+ width="100">
+ 4 (High)
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="20"
+ layout="topleft"
+ left="10"
+ name="height_text_lbl5"
+ top_delta="30"
+ width="300">
+ Texture Elevation Ranges
+ </text>
+ <text
+ follows="left|top"
+ height="20"
+ layout="topleft"
+ left="10"
+ name="height_text_lbl10"
+ top_delta="30"
+ width="200"
+ word_wrap="true">
+ These values represent the blend range for the textures above.
+ </text>
+ <text
+ follows="left|top"
+ height="60"
+ layout="topleft"
+ left_delta="0"
+ name="height_text_lbl11"
+ top_delta="32"
+ width="200"
+ word_wrap="true">
+ Measured in meters, the LOW value is the MAXIMUM height of Texture #1, and the HIGH value is the MINIMUM height of Texture #4.
+ </text>
+ <text
+ follows="left|top"
+ height="20"
+ layout="topleft"
+ left="270"
+ name="height_text_lbl6"
+ top="250"
+ width="100">
+ Northwest
+ </text>
+ <text
+ follows="left|top"
+ height="20"
+ layout="topleft"
+ left_pad="10"
+ name="height_text_lbl7"
+ top_delta="0"
+ width="100">
+ Northeast
+ </text>
+<!-- northwest low-->
+ <spinner
+ follows="left|top"
+ height="20"
+ increment="0.5"
+ label="Low"
+ label_width="37"
+ layout="topleft"
+ left="230"
+ max_val="500"
+ min_val="-500"
+ name="height_start_spin_1"
+ top_delta="15"
+ width="100" />
+<!-- northeast low-->
+ <spinner
+ follows="left|top"
+ height="20"
+ increment="0.5"
+ label="Low"
+ label_width="37"
+ layout="topleft"
+ left_pad="10"
+ max_val="500"
+ min_val="-500"
+ name="height_start_spin_3"
+ top_delta="0"
+ width="100" />
+<!-- northwest high-->
+ <spinner
+ follows="left|top"
+ height="20"
+ increment="0.5"
+ label="High"
+ label_width="37"
+ layout="topleft"
+ left="230"
+ max_val="500"
+ min_val="-500"
+ name="height_range_spin_1"
+ top_delta="20"
+ width="100" />
+<!-- northeast high-->
+ <spinner
+ follows="left|top"
+ height="20"
+ increment="0.5"
+ label="High"
+ label_width="37"
+ layout="topleft"
+ left_pad="10"
+ max_val="500"
+ min_val="-500"
+ name="height_range_spin_3"
+ top_delta="0"
+ width="100" />
+ <text
+ follows="left|top"
+ height="20"
+ layout="topleft"
+ left="270"
+ name="height_text_lbl8"
+ top_pad="10"
+ width="100">
+ Southwest
+ </text>
+ <text
+ follows="left|top"
+ height="20"
+ layout="topleft"
+ left_pad="10"
+ name="height_text_lbl9"
+ top_delta="0"
+ width="100">
+ Southeast
+ </text>
+<!-- southwest low-->
+ <spinner
+ follows="left|top"
+ height="20"
+ increment="0.5"
+ label="Low"
+ label_width="37"
+ layout="topleft"
+ left="230"
+ max_val="500"
+ min_val="-500"
+ name="height_start_spin_0"
+ top_delta="15"
+ width="100" />
+<!-- southeast low-->
+ <spinner
+ follows="left|top"
+ height="20"
+ increment="0.5"
+ label="Low"
+ label_width="37"
+ layout="topleft"
+ left_pad="10"
+ max_val="500"
+ min_val="-500"
+ name="height_start_spin_2"
+ top_delta="0"
+ width="100" />
+<!--southwest high-->
+ <spinner
+ follows="left|top"
+ height="20"
+ increment="0.5"
+ label="High"
+ label_width="37"
+ layout="topleft"
+ left="230"
+ max_val="500"
+ min_val="-500"
+ name="height_range_spin_0"
+ top_delta="20"
+ width="100" />
+<!-- southeast high-->
+ <spinner
+ follows="left|top"
+ height="20"
+ increment="0.5"
+ label="High"
+ label_width="37"
+ layout="topleft"
+ left_pad="10"
+ max_val="500"
+ min_val="-500"
+ name="height_range_spin_2"
+ top_delta="0"
+ width="100" />
+<!-- Terrain Download/Upload/Bake buttons -->
<button
follows="left|top"
height="20"
label="Download RAW terrain..."
layout="topleft"
- left_delta="2"
+ left="10"
name="download_raw_btn"
tool_tip="Available only to estate owners, not managers"
- top_pad="60"
- width="170" />
+ top="390"
+ width="160" />
<button
follows="left|top"
height="20"
label="Upload RAW terrain..."
layout="topleft"
- left="10"
+ left_pad="10"
+ top_delta="0"
name="upload_raw_btn"
tool_tip="Available only to estate owners, not managers"
- top="243"
- width="170" />
+ width="160" />
<button
follows="left|top"
height="20"
label="Bake Terrain"
layout="topleft"
- left="10"
+ left_pad="10"
name="bake_terrain_btn"
tool_tip="Set current terrain as mid-point for raise/lower limits"
- top="283"
+ width="100" />
+ <button
+ enabled="true"
+ follows="left|top"
+ height="20"
+ label="Apply"
+ layout="topleft"
+ left_delta="0"
+ name="apply_btn"
+ top="430"
width="100" />
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_region_texture.xml b/indra/newview/skins/default/xui/en/panel_region_texture.xml
deleted file mode 100644
index 5d910ea659..0000000000
--- a/indra/newview/skins/default/xui/en/panel_region_texture.xml
+++ /dev/null
@@ -1,327 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel
- border="true"
- follows="top|left"
- height="320"
- help_topic="panel_region_texture_tab"
- label="Ground Textures"
- layout="topleft"
- left="0"
- name="Textures"
- top="320"
- width="480">
- <text
- type="string"
- length="1"
- follows="left|top"
- font="SansSerif"
- height="20"
- layout="topleft"
- left="10"
- name="region_text_lbl"
- top="10"
- width="100">
- Region:
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- font="SansSerif"
- height="20"
- layout="topleft"
- left_delta="50"
- name="region_text"
- top_delta="0"
- width="400">
- unknown
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="20"
- layout="topleft"
- left="10"
- name="detail_texture_text"
- top="36"
- width="300">
- Terrain Textures (requires 512x512, 24 bit .tga files)
- </text>
- <texture_picker
- follows="left|top"
- height="100"
- layout="topleft"
- left_delta="0"
- name="texture_detail_0"
- top_delta="20"
- width="100" />
- <texture_picker
- follows="left|top"
- height="100"
- layout="topleft"
- left_pad="10"
- name="texture_detail_1"
- top_delta="0"
- width="100" />
- <texture_picker
- follows="left|top"
- height="100"
- layout="topleft"
- left_pad="10"
- name="texture_detail_2"
- top_delta="0"
- width="100" />
- <texture_picker
- follows="left|top"
- height="100"
- layout="topleft"
- left_pad="10"
- name="texture_detail_3"
- top_delta="0"
- width="100" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="20"
- layout="topleft"
- left="10"
- name="height_text_lbl"
- top="146"
- width="65">
- 1 (Low)
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="20"
- layout="topleft"
- left_pad="45"
- name="height_text_lbl2"
- top_delta="0"
- width="100">
- 2
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="20"
- layout="topleft"
- left_pad="10"
- name="height_text_lbl3"
- top_delta="0"
- width="100">
- 3
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="20"
- layout="topleft"
- left_pad="10"
- name="height_text_lbl4"
- top_delta="0"
- width="100">
- 4 (High)
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="20"
- layout="topleft"
- left="10"
- name="height_text_lbl5"
- top="170"
- width="300">
- Texture Elevation Ranges
- </text>
- <text
- follows="left|top"
- height="20"
- layout="topleft"
- left="51"
- name="height_text_lbl6"
- top="185"
- width="100">
- Northwest
- </text>
- <text
- follows="left|top"
- height="20"
- layout="topleft"
- left_pad="10"
- name="height_text_lbl7"
- top_delta="0"
- width="100">
- Northeast
- </text>
-<!-- northwest low-->
- <spinner
- follows="left|top"
- height="20"
- increment="0.5"
- label="Low"
- label_width="37"
- layout="topleft"
- left="10"
- max_val="500"
- min_val="-500"
- name="height_start_spin_1"
- top_delta="15"
- width="100" />
-<!-- northeast low-->
- <spinner
- follows="left|top"
- height="20"
- increment="0.5"
- label="Low"
- label_width="37"
- layout="topleft"
- left_pad="10"
- max_val="500"
- min_val="-500"
- name="height_start_spin_3"
- top_delta="0"
- width="100" />
-<!-- northwest high-->
- <spinner
- follows="left|top"
- height="20"
- increment="0.5"
- label="High"
- label_width="37"
- layout="topleft"
- left="10"
- max_val="500"
- min_val="-500"
- name="height_range_spin_1"
- top_delta="20"
- width="100" />
-<!-- northeast high-->
- <spinner
- follows="left|top"
- height="20"
- increment="0.5"
- label="High"
- label_width="37"
- layout="topleft"
- left_pad="10"
- max_val="500"
- min_val="-500"
- name="height_range_spin_3"
- top_delta="0"
- width="100" />
- <text
- follows="left|top"
- height="20"
- layout="topleft"
- left="51"
- name="height_text_lbl8"
- top_pad="10"
- width="100">
- Southwest
- </text>
- <text
- follows="left|top"
- height="20"
- layout="topleft"
- left_pad="10"
- name="height_text_lbl9"
- top_delta="0"
- width="100">
- Southeast
- </text>
-<!-- southwest low-->
- <spinner
- follows="left|top"
- height="20"
- increment="0.5"
- label="Low"
- label_width="37"
- layout="topleft"
- left="10"
- max_val="500"
- min_val="-500"
- name="height_start_spin_0"
- top_delta="15"
- width="100" />
-<!-- southeast low-->
- <spinner
- follows="left|top"
- height="20"
- increment="0.5"
- label="Low"
- label_width="37"
- layout="topleft"
- left_pad="10"
- max_val="500"
- min_val="-500"
- name="height_start_spin_2"
- top_delta="0"
- width="100" />
-<!--southwest high-->
- <spinner
- follows="left|top"
- height="20"
- increment="0.5"
- label="High"
- label_width="37"
- layout="topleft"
- left="10"
- max_val="500"
- min_val="-500"
- name="height_range_spin_0"
- top_delta="20"
- width="100" />
-<!-- southeast high-->
- <spinner
- follows="left|top"
- height="20"
- increment="0.5"
- label="High"
- label_width="37"
- layout="topleft"
- left_pad="10"
- max_val="500"
- min_val="-500"
- name="height_range_spin_2"
- top_delta="0"
- width="100" />
- <text
- follows="left|top"
- height="20"
- layout="topleft"
- left="10"
- name="height_text_lbl10"
- top_delta="30"
- width="400"
- word_wrap="true">
- These values represent the blend range for the textures above.
- </text>
- <text
- follows="left|top"
- height="20"
- layout="topleft"
- left_delta="0"
- name="height_text_lbl11"
- top_delta="32"
- width="400"
- word_wrap="true">
- Measured in meters, the LOW value is the MAXIMUM height of Texture #1, and the HIGH value is the MINIMUM height of Texture #4.
- </text>
- <button
- enabled="false"
- follows="left|bottom"
- height="20"
- label="Apply"
- layout="topleft"
- left="350"
- name="apply_btn"
- top="290"
- width="100" />
-</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_script_ed.xml b/indra/newview/skins/default/xui/en/panel_script_ed.xml
index a041c9b229..f6a8af0973 100644
--- a/indra/newview/skins/default/xui/en/panel_script_ed.xml
+++ b/indra/newview/skins/default/xui/en/panel_script_ed.xml
@@ -28,6 +28,10 @@
name="Title">
Script: [NAME]
</panel.string>
+ <panel.string
+ name="external_editor_not_set">
+ Select an editor by setting the environment variable LL_SCRIPT_EDITOR or the ExternalEditor setting.
+ </panel.string>
<menu_bar
bg_visible="false"
follows="left|top"
@@ -50,12 +54,22 @@
label="Save"
layout="topleft"
name="Save" />
- <menu_item_separator
- layout="topleft" />
- <menu_item_call
- label="Revert All Changes"
- layout="topleft"
- name="Revert All Changes" />
+ <menu_item_separator
+ layout="topleft" />
+ <menu_item_call
+ label="Revert All Changes"
+ layout="topleft"
+ name="Revert All Changes" />
+ <menu_item_separator
+ layout="topleft" />
+ <menu_item_call
+ label="Load from file..."
+ layout="topleft"
+ name="LoadFromFile" />
+ <menu_item_call
+ label="Save to file..."
+ layout="topleft"
+ name="SaveToFile" />
</menu>
<menu
top="0"
@@ -180,6 +194,7 @@
name="Save_btn"
width="81" />
<button
+ enabled="false"
follows="right|bottom"
height="23"
label="Edit..."
diff --git a/indra/newview/skins/default/xui/en/panel_scrolling_param_base.xml b/indra/newview/skins/default/xui/en/panel_scrolling_param_base.xml
new file mode 100644
index 0000000000..1351f75623
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_scrolling_param_base.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ layout="topleft"
+ left="0"
+ name="LLScrollingPanelParamBase"
+ height="16"
+ width="290">
+ <slider
+ can_edit_text="true"
+ decimal_digits="0"
+ enabled="false"
+ height="12"
+ increment="1"
+ initial_value="0"
+ label="[DESC]"
+ label_width="125"
+ layout="bottom|left"
+ left="16"
+ max_val="100"
+ name="param slider"
+ bottom="0"
+ width="264"
+ />
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_side_tray.xml b/indra/newview/skins/default/xui/en/panel_side_tray.xml
deleted file mode 100644
index 6ef93406ec..0000000000
--- a/indra/newview/skins/default/xui/en/panel_side_tray.xml
+++ /dev/null
@@ -1,173 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<!-- Side tray cannot show background because it is always
- partially on screen to hold tab buttons. -->
-<side_tray
- name="sidebar"
- background_visible="false"
- mouse_opaque="true"
- width="333"
- collapsed="true"
->
- <!-- Individual tabs must show background to have seemless
- appearance up to tray panel header word like "Home".
- Embedded panels are inset by a pixel and so their
- backgrounds will not block the world fully. -->
-
- <sidetray_tab
- name="sidebar_openclose"
- help_topic="sidebar_openclose"
- tab_title="Toggle Sidebar"
- description="Toggle Sidebar."
- image="TabIcon_Open_Off"
- image_selected="TabIcon_Close_Off"
- mouse_opaque="false"
- background_visible="true"
- >
- <panel /> <!-- dummy panel, never to actually be seen -->
- </sidetray_tab>
-
- <sidetray_tab
- name="sidebar_home"
- help_topic="sidebar_home"
- tab_title="Home"
- description="Home."
- image="TabIcon_Home_Off"
- image_selected="TabIcon_Home_Selected"
- mouse_opaque="false"
- background_visible="true"
- >
- <panel
- class="panel_sidetray_home"
- name="panel_home"
- filename="panel_sidetray_home_tab.xml"
- label="home"
- />
- </sidetray_tab>
-
- <sidetray_tab
- name="sidebar_me"
- help_topic="sidebar_me"
- tab_title="My Profile"
- description="Edit your public profile and Picks."
- image="TabIcon_Me_Off"
- image_selected="TabIcon_Me_Selected"
- mouse_opaque="false"
- background_visible="true"
- >
- <panel_container
- name="panel_container"
- default_panel_name="panel_me"
- width="333"
- >
- <panel
- class="panel_me"
- name="panel_me"
- filename="panel_me.xml"
- label="Me"
- />
-
- </panel_container>
- </sidetray_tab>
-
- <sidetray_tab
- name="sidebar_people"
- help_topic="sidebar_people"
- tab_title="People"
- description="Find your friends, contacts and people nearby."
- image="TabIcon_People_Off"
- image_selected="TabIcon_People_Selected"
- mouse_opaque="false"
- background_visible="true"
- >
- <panel_container
- name="panel_container"
- default_panel_name="panel_people"
- width="333"
- >
- <panel
- class="panel_people"
- name="panel_people"
- filename="panel_people.xml"
- />
- <panel
- class="panel_profile_view"
- name="panel_profile_view"
- filename="panel_profile_view.xml"
- />
- <panel
- class="panel_group_info_sidetray"
- name="panel_group_info_sidetray"
- filename="panel_group_info_sidetray.xml"
- label="Group Profile"
- font="SansSerifBold"
- />
- <panel
- class="panel_block_list_sidetray"
- name="panel_block_list_sidetray"
- filename="panel_block_list_sidetray.xml"
- label="Blocked Residents &amp; Objects"
- font="SansSerifBold"
- />
-
- </panel_container>
- </sidetray_tab>
-
- <sidetray_tab
- name="sidebar_places"
- help_topic="sidebar_places"
- tab_title="Places"
- label="Places"
- description="Find places to go and places you&apos;ve visited before."
- image="TabIcon_Places_Off"
- image_selected="TabIcon_Places_Selected"
- mouse_opaque="false"
- background_visible="true"
- >
- <panel
- class="panel_places"
- name="panel_places"
- filename="panel_places.xml"
- label="Places"
- font="SansSerifBold"
- />
- </sidetray_tab>
-
- <sidetray_tab
- name="sidebar_inventory"
- help_topic="sidebar_inventory"
- tab_title="My Inventory"
- description="Browse your inventory."
- image="TabIcon_Things_Off"
- image_selected="TabIcon_Things_Selected"
- mouse_opaque="false"
- background_visible="true"
- >
- <panel
- class="sidepanel_inventory"
- name="sidepanel_inventory"
- filename="sidepanel_inventory.xml"
- label="Edit Inventory"
- font="SansSerifBold"
- />
- </sidetray_tab>
-
- <sidetray_tab
- name="sidebar_appearance"
- help_topic="sidebar_appearance"
- tab_title="My Appearance"
- description="Change your appearance and current look."
- image="TabIcon_Appearance_Off"
- image_selected="TabIcon_Appearance_Selected"
- mouse_opaque="false"
- background_visible="true"
- >
- <panel
- class="sidepanel_appearance"
- name="sidepanel_appearance"
- filename="sidepanel_appearance.xml"
- label="Edit Appearance"
- font="SansSerifBold"
- />
- </sidetray_tab>
-
-</side_tray>
diff --git a/indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml b/indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml
index 72b2f5e84f..912f81f915 100644
--- a/indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml
+++ b/indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml
@@ -24,7 +24,6 @@
layout="topleft"
left_delta="0"
name="browser_layout"
- orientation="vertical"
top_delta="0"
width="313">
<web_browser
diff --git a/indra/newview/skins/default/xui/en/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/en/panel_snapshot_inventory.xml
new file mode 100644
index 0000000000..71d808fa4b
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_snapshot_inventory.xml
@@ -0,0 +1,148 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ height="380"
+ layout="topleft"
+ name="panel_snapshot_inventory"
+ width="490">
+ <icon
+ follows="top|left"
+ height="18"
+ image_name="Snapshot_Inventory"
+ layout="topleft"
+ left="12"
+ mouse_opaque="true"
+ name="title_icon"
+ top="5"
+ width="18" />
+ <text
+ follows="top|left|right"
+ font="SansSerifBold"
+ height="20"
+ layout="topleft"
+ left_pad="12"
+ length="1"
+ name="title"
+ right="-10"
+ text_color="white"
+ type="string"
+ top_delta="5">
+ Save to My Inventory
+ </text>
+ <view_border
+ bevel_style="in"
+ follows="left|top|right"
+ height="1"
+ left="10"
+ layout="topleft"
+ name="hr"
+ right="-10"
+ top_pad="5"
+ />
+ <text
+ bottom="35"
+ follows="top|left|right"
+ font="SansSerif"
+ height="56"
+ layout="topleft"
+ left="12"
+ length="1"
+ name="hint_lbl"
+ top_pad="10"
+ type="string"
+ word_wrap="true">
+ Saving an image to your inventory costs L$[UPLOAD_COST]. To save your image as a texture select one of the square formats.
+ </text>
+ <combo_box
+ follows="top|left|right"
+ height="23"
+ label="Resolution"
+ layout="topleft"
+ left_delta="0"
+ name="texture_size_combo"
+ right="-10"
+ top_pad="10">
+ <combo_box.item
+ label="Current Window"
+ name="CurrentWindow"
+ value="[i0,i0]" />
+ <combo_box.item
+ label="Small (128x128)"
+ name="Small(128x128)"
+ value="[i128,i128]" />
+ <combo_box.item
+ label="Medium (256x256)"
+ name="Medium(256x256)"
+ value="[i256,i256]" />
+ <combo_box.item
+ label="Large (512x512)"
+ name="Large(512x512)"
+ value="[i512,i512]" />
+ <combo_box.item
+ label="Custom"
+ name="Custom"
+ value="[i-1,i-1]" />
+ </combo_box>
+ <spinner
+ allow_text_entry="false"
+ decimal_digits="0"
+ follows="left|top"
+ height="20"
+ increment="32"
+ label="Width"
+ label_width="40"
+ layout="topleft"
+ left="10"
+ max_val="6016"
+ min_val="32"
+ name="inventory_snapshot_width"
+ top_pad="10"
+ width="95" />
+ <spinner
+ allow_text_entry="false"
+ decimal_digits="0"
+ follows="left|top"
+ height="20"
+ increment="32"
+ label="Height"
+ label_width="40"
+ layout="topleft"
+ left_pad="5"
+ max_val="6016"
+ min_val="32"
+ name="inventory_snapshot_height"
+ top_delta="0"
+ width="95" />
+ <check_box
+ bottom_delta="20"
+ height="10"
+ follows="left|top"
+ label="Constrain proportions"
+ layout="topleft"
+ left="10"
+ name="inventory_keep_aspect_check"
+ visible="false" />
+ <button
+ follows="right|bottom"
+ height="23"
+ label="Cancel"
+ layout="topleft"
+ name="cancel_btn"
+ right="-32"
+ top="350"
+ width="100">
+ <button.commit_callback
+ function="Inventory.Cancel" />
+ </button>
+ <button
+ follows="right|bottom"
+ height="23"
+ label="Save"
+ layout="topleft"
+ left_delta="-106"
+ name="save_btn"
+ top_delta="0"
+ width="100">
+ <button.commit_callback
+ function="Inventory.Save" />
+ </button>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_snapshot_local.xml b/indra/newview/skins/default/xui/en/panel_snapshot_local.xml
new file mode 100644
index 0000000000..781ab17403
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_snapshot_local.xml
@@ -0,0 +1,235 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ height="380"
+ layout="topleft"
+ name="panel_snapshot_local"
+ width="490">
+ <icon
+ follows="top|left"
+ height="18"
+ image_name="Snapshot_Download"
+ layout="topleft"
+ left="12"
+ mouse_opaque="true"
+ name="title_icon"
+ top="5"
+ width="18" />
+ <text
+ follows="top|left|right"
+ font="SansSerifBold"
+ height="20"
+ layout="topleft"
+ left_pad="12"
+ length="1"
+ name="title"
+ right="-10"
+ text_color="white"
+ type="string"
+ top_delta="4">
+ Save to My Computer
+ </text>
+ <view_border
+ bevel_style="in"
+ follows="left|top|right"
+ height="1"
+ left="10"
+ layout="topleft"
+ name="hr"
+ right="-10"
+ top_pad="5"
+ />
+ <combo_box
+ follows="left|top|right"
+ height="23"
+ label="Resolution"
+ layout="topleft"
+ left_delta="0"
+ name="local_size_combo"
+ right="-10"
+ top_pad="10">
+ <combo_box.item
+ label="Current Window"
+ name="CurrentWindow"
+ value="[i0,i0]" />
+ <combo_box.item
+ label="320x240"
+ name="320x240"
+ value="[i320,i240]" />
+ <combo_box.item
+ label="640x480"
+ name="640x480"
+ value="[i640,i480]" />
+ <combo_box.item
+ label="800x600"
+ name="800x600"
+ value="[i800,i600]" />
+ <combo_box.item
+ label="1024x768"
+ name="1024x768"
+ value="[i1024,i768]" />
+ <combo_box.item
+ label="1280x1024"
+ name="1280x1024"
+ value="[i1280,i1024]" />
+ <combo_box.item
+ label="1600x1200"
+ name="1600x1200"
+ value="[i1600,i1200]" />
+ <combo_box.item
+ label="Custom"
+ name="Custom"
+ value="[i-1,i-1]" />
+ </combo_box>
+ <layout_stack
+ animate="false"
+ follows="all"
+ height="275"
+ layout="bottomleft"
+ name="local_image_params_ls"
+ left_delta="0"
+ orientation="vertical"
+ top_pad="10"
+ right="-10">
+ <layout_panel
+ follows="top|left|right"
+ height="60"
+ layout="topleft"
+ left="0"
+ name="local_image_size_lp"
+ auto_resize="false"
+ top="0"
+ right="-1"
+ visible="true">
+ <spinner
+ allow_text_entry="false"
+ decimal_digits="0"
+ follows="left|top"
+ height="20"
+ increment="32"
+ label="Width"
+ label_width="40"
+ layout="topleft"
+ left="10"
+ max_val="6016"
+ min_val="32"
+ name="local_snapshot_width"
+ top_pad="10"
+ width="95" />
+ <spinner
+ allow_text_entry="false"
+ decimal_digits="0"
+ follows="left|top"
+ height="20"
+ increment="32"
+ label="Height"
+ label_width="40"
+ layout="topleft"
+ left_pad="5"
+ max_val="6016"
+ min_val="32"
+ name="local_snapshot_height"
+ top_delta="0"
+ width="95" />
+ <check_box
+ bottom_delta="20"
+ height="10"
+ follows="left|top"
+ label="Constrain proportions"
+ layout="topleft"
+ left="10"
+ name="local_keep_aspect_check" />
+ </layout_panel>
+ <layout_panel
+ follows="top|left|right"
+ height="23"
+ layout="topleft"
+ left="0"
+ name="local_image_format_quality_lp"
+ auto_resize="true"
+ top="0"
+ right="-1"
+ visible="true">
+ <combo_box
+ follows="left|top"
+ height="23"
+ label="Format"
+ layout="topleft"
+ left_delta="0"
+ name="local_format_combo"
+ top_pad="0"
+ width="120">
+ <combo_box.item
+ label="PNG (Lossless)"
+ name="PNG"
+ value="PNG" />
+ <combo_box.item
+ label="JPEG"
+ name="JPEG"
+ value="JPEG" />
+ <combo_box.item
+ label="BMP (Lossless)"
+ name="BMP"
+ value="BMP" />
+ </combo_box>
+ <slider
+ decimal_digits="0"
+ follows="left|top"
+ height="15"
+ increment="1"
+ initial_value="75"
+ label="Image quality"
+ label_width="80"
+ layout="topleft"
+ left="10"
+ max_val="100"
+ name="image_quality_slider"
+ top_pad="7"
+ width="200" />
+ <text
+ type="string"
+ follows="left|top"
+ font="SansSerifSmall"
+ length="1"
+ height="14"
+ layout="topleft"
+ left_pad="-5"
+ halign="left"
+ name="image_quality_level"
+ top_delta="0"
+ width="60">
+ ([QLVL])
+ </text>
+ </layout_panel>
+ </layout_stack>
+ <button
+ follows="right|bottom"
+ height="23"
+ label="Cancel"
+ layout="topleft"
+ name="cancel_btn"
+ right="-32"
+ top="350"
+ width="100">
+ <button.commit_callback
+ function="Local.Cancel" />
+ </button>
+ <flyout_button
+ follows="right|bottom"
+ height="23"
+ label="Save"
+ layout="topleft"
+ left_delta="-106"
+ name="save_btn"
+ tool_tip="Save image to a file"
+ top_delta="0"
+ width="100">
+ <flyout_button.item
+ label="Save"
+ name="save_item"
+ value="save" />
+ <flyout_button.item
+ label="Save As..."
+ name="saveas_item"
+ value="save as" />
+ </flyout_button>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_snapshot_options.xml b/indra/newview/skins/default/xui/en/panel_snapshot_options.xml
new file mode 100644
index 0000000000..d2f29ade44
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_snapshot_options.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ follows="all"
+ height="240"
+ layout="topleft"
+ name="panel_snapshot_options"
+ width="490">
+ <button
+ follows="left|top|right"
+ font="SansSerif"
+ halign="left"
+ height="38"
+ image_overlay="Snapshot_Profile"
+ image_overlay_alignment="left"
+ image_top_pad="-2"
+ imgoverlay_label_space="10"
+ label="Post to My Profile Feed"
+ layout="topleft"
+ left="10"
+ name="save_to_profile_btn"
+ pad_left="10"
+ right="-10"
+ top="5">
+ <button.commit_callback
+ function="Snapshot.SaveToProfile" />
+ </button>
+ <button
+ follows="left|top|right"
+ font="SansSerif"
+ halign="left"
+ height="38"
+ image_overlay="Snapshot_Email"
+ image_overlay_alignment="left"
+ image_top_pad="-2"
+ imgoverlay_label_space="10"
+ label="Email"
+ layout="topleft"
+ left_delta="0"
+ name="save_to_email_btn"
+ pad_left="10"
+ right="-10"
+ top_pad="10">
+ <button.commit_callback
+ function="Snapshot.SaveToEmail" />
+ </button>
+ <button
+ follows="left|top|right"
+ font="SansSerif"
+ halign="left"
+ height="38"
+ image_overlay="Snapshot_Inventory"
+ image_overlay_alignment="left"
+ image_top_pad="-2"
+ imgoverlay_label_space="10"
+ label="Save to My Inventory (L$[AMOUNT])"
+ layout="topleft"
+ left_delta="0"
+ name="save_to_inventory_btn"
+ pad_left="10"
+ right="-10"
+ top_pad="10">
+ <button.commit_callback
+ function="Snapshot.SaveToInventory" />
+ </button>
+ <button
+ follows="left|top|right"
+ font="SansSerif"
+ halign="left"
+ height="38"
+ image_overlay="Snapshot_Download"
+ image_overlay_alignment="left"
+ image_top_pad="-2"
+ imgoverlay_label_space="10"
+ label="Save to My Computer"
+ layout="topleft"
+ left_delta="0"
+ name="save_to_computer_btn"
+ pad_left="10"
+ right="-10"
+ top_pad="10">
+ <button.commit_callback
+ function="Snapshot.SaveToComputer" />
+ </button>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_snapshot_postcard.xml b/indra/newview/skins/default/xui/en/panel_snapshot_postcard.xml
new file mode 100644
index 0000000000..ebba292a93
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_snapshot_postcard.xml
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ height="380"
+ layout="topleft"
+ name="panel_snapshot_postcard"
+ width="490">
+ <string
+ name="default_subject">
+ Postcard from [SECOND_LIFE].
+ </string>
+ <string
+ name="default_message">
+ Check this out!
+ </string>
+ <string
+ name="upload_message">
+ Sending...
+ </string>
+ <icon
+ follows="top|left"
+ height="18"
+ image_name="Snapshot_Email"
+ layout="topleft"
+ left="12"
+ mouse_opaque="true"
+ name="title_icon"
+ top="5"
+ width="18" />
+ <text
+ follows="top|left|right"
+ font="SansSerifBold"
+ height="20"
+ layout="topleft"
+ left_pad="12"
+ length="1"
+ name="title"
+ right="-10"
+ text_color="white"
+ type="string"
+ top_delta="3">
+ Email
+ </text>
+ <button
+ follows="right|top"
+ height="23"
+ is_toggle="true"
+ label="Message"
+ layout="topleft"
+ name="message_btn"
+ right="-82"
+ top_delta="-7"
+ width="70">
+ <button.commit_callback
+ function="Postcard.Message" />
+ </button>
+ <button
+ follows="right|top"
+ height="23"
+ is_toggle="true"
+ label="Settings"
+ layout="topleft"
+ name="settings_btn"
+ top_delta="0"
+ right="-10"
+ width="70">
+ <button.commit_callback
+ function="Postcard.Settings" />
+ </button>
+ <view_border
+ bevel_style="in"
+ follows="left|top|right"
+ height="1"
+ left="10"
+ layout="topleft"
+ name="hr"
+ right="-10"
+ top_pad="5"
+ />
+ <panel_container
+ follows="all"
+ height="340"
+ layout="topleft"
+ left="0"
+ name="postcard_panel_container"
+ default_panel_name="panel_postcard_message"
+ top_pad="10"
+ width="490">
+ <panel
+ follows="all"
+ layout="topleft"
+ name="panel_postcard_message"
+ filename="panel_postcard_message.xml" />
+ <panel
+ follows="all"
+ layout="topleft"
+ name="panel_postcard_settings"
+ filename="panel_postcard_settings.xml" />
+ </panel_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_snapshot_profile.xml b/indra/newview/skins/default/xui/en/panel_snapshot_profile.xml
new file mode 100644
index 0000000000..0dd357aa1a
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_snapshot_profile.xml
@@ -0,0 +1,199 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ height="380"
+ layout="topleft"
+ name="panel_snapshot_profile"
+ width="490">
+ <icon
+ follows="top|left"
+ height="18"
+ image_name="Snapshot_Profile"
+ layout="topleft"
+ left="12"
+ mouse_opaque="true"
+ name="title_icon"
+ top="5"
+ width="18" />
+ <text
+ follows="top|left|right"
+ font="SansSerifBold"
+ height="20"
+ layout="topleft"
+ left_pad="12"
+ length="1"
+ name="title"
+ right="-10"
+ text_color="white"
+ type="string"
+ top_delta="4">
+ Post to My Profile Feed
+ </text>
+ <view_border
+ bevel_style="in"
+ follows="left|top|right"
+ height="1"
+ left="10"
+ layout="topleft"
+ name="hr"
+ right="-10"
+ top_pad="5"
+ />
+ <combo_box
+ follows="left|top"
+ height="23"
+ label="Resolution"
+ layout="topleft"
+ left_delta="0"
+ name="profile_size_combo"
+ top_pad="10"
+ width="250">
+ <combo_box.item
+ label="Current Window"
+ name="CurrentWindow"
+ value="[i0,i0]" />
+ <combo_box.item
+ label="640x480"
+ name="640x480"
+ value="[i640,i480]" />
+ <combo_box.item
+ label="800x600"
+ name="800x600"
+ value="[i800,i600]" />
+ <combo_box.item
+ label="1024x768"
+ name="1024x768"
+ value="[i1024,i768]" />
+ <combo_box.item
+ label="Custom"
+ name="Custom"
+ value="[i-1,i-1]" />
+ </combo_box>
+ <layout_stack
+ animate="false"
+ follows="all"
+ height="270"
+ layout="bottomleft"
+ name="profile_image_params_ls"
+ left_delta="0"
+ orientation="vertical"
+ top_pad="10"
+ right="-10">
+ <layout_panel
+ follows="top|left|right"
+ height="55"
+ layout="topleft"
+ left="0"
+ name="profile_image_size_lp"
+ auto_resize="false"
+ top="0"
+ right="-1"
+ visible="true">
+ <spinner
+ allow_text_entry="false"
+ decimal_digits="0"
+ follows="left|top"
+ height="20"
+ increment="32"
+ label="Width"
+ label_width="40"
+ layout="topleft"
+ left="10"
+ max_val="6016"
+ min_val="32"
+ name="profile_snapshot_width"
+ top_pad="10"
+ width="95" />
+ <spinner
+ allow_text_entry="false"
+ decimal_digits="0"
+ follows="left|top"
+ height="20"
+ increment="32"
+ label="Height"
+ label_width="40"
+ layout="topleft"
+ left_pad="5"
+ max_val="6016"
+ min_val="32"
+ name="profile_snapshot_height"
+ top_delta="0"
+ width="95" />
+ <check_box
+ height="10"
+ bottom_delta="20"
+ label="Constrain proportions"
+ layout="topleft"
+ left="10"
+ name="profile_keep_aspect_check" />
+ </layout_panel>
+ <layout_panel
+ follows="top|left|right"
+ height="200"
+ layout="topleft"
+ left="0"
+ name="profile_image_metadata_lp"
+ auto_resize="true"
+ top="0"
+ right="-1"
+ visible="true">
+ <text
+ length="1"
+ follows="top|left|right"
+ font="SansSerif"
+ height="16"
+ layout="topleft"
+ left="0"
+ name="caption_label"
+ right="-10"
+ top_pad="0"
+ type="string">
+ Caption:
+ </text>
+ <text_editor
+ follows="all"
+ height="155"
+ layout="topleft"
+ left_delta="0"
+ length="1"
+ max_length="700"
+ name="caption"
+ right="-10"
+ top_pad="5"
+ type="string"
+ word_wrap="true">
+ </text_editor>
+ <check_box
+ follows="left|bottom"
+ initial_value="true"
+ label="Include location"
+ layout="topleft"
+ left_delta="0"
+ name="add_location_cb"
+ top_pad="15" />
+ </layout_panel>
+ </layout_stack>
+ <button
+ follows="right|bottom"
+ height="23"
+ label="Cancel"
+ layout="topleft"
+ name="cancel_btn"
+ right="-32"
+ top="350"
+ width="100">
+ <button.commit_callback
+ function="PostToProfile.Cancel" />
+ </button>
+ <button
+ follows="right|bottom"
+ height="23"
+ label="Post"
+ layout="topleft"
+ left_delta="-106"
+ name="post_btn"
+ top_delta="0"
+ width="100">
+ <button.commit_callback
+ function="PostToProfile.Send" />
+ </button>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_sound_devices.xml b/indra/newview/skins/default/xui/en/panel_sound_devices.xml
new file mode 100644
index 0000000000..46cbc1e87f
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_sound_devices.xml
@@ -0,0 +1,169 @@
+<panel
+ background_visible="false"
+ bg_alpha_color="DkGray"
+ follows="all"
+ height="200"
+ label="Device Settings"
+ layout="topleft"
+ name="device_settings_panel"
+ width="360">
+ <panel.string
+ name="default_text">
+ Default
+ </panel.string>
+ <string
+ name="name_no_device">
+ No Device
+ </string>
+ <string
+ name="name_default_system_device">
+ Default System Device
+ </string>
+ <icon
+ follows="left|top"
+ height="18"
+ image_name="Microphone_On"
+ left_delta="-5"
+ name="microphone_icon"
+ mouse_opaque="false"
+ top="7"
+ layout="topleft"
+ visible="true"
+ width="18" />
+ <icon
+ follows="left|top"
+ height="18"
+ image_name="Parcel_Voice_Dark"
+ layout="topleft"
+ left_pad="220"
+ name="speaker_icon"
+ mouse_opaque="false"
+ top_delta="0"
+ visible="true"
+ width="22" />
+ <text
+ type="string"
+ length="1"
+ font.style="BOLD"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left_pad="-240"
+ top_delta="5"
+ name="Input"
+ width="60">
+ Input
+ </text>
+ <combo_box
+ height="23"
+ control_name="VoiceInputAudioDevice"
+ follows="left|top"
+ layout="topleft"
+ left_pad="0"
+ max_chars="128"
+ name="voice_input_device"
+ top_delta="-5"
+ width="150" />
+ <text
+ font.style="BOLD"
+ type="string"
+ length="1"
+ follows="left|top"
+ height="15"
+ layout="topleft"
+ left_pad="30"
+ name="Output"
+ top_delta="5"
+ width="60">
+ Output
+ </text>
+ <combo_box
+ control_name="VoiceOutputAudioDevice"
+ height="23"
+ follows="left|top"
+ layout="topleft"
+ left_pad="0"
+ max_chars="128"
+ name="voice_output_device"
+ top_delta="-4"
+ width="150" />
+ <text
+ type="string"
+ halign="left"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left_delta="-300"
+ name="My volume label"
+ top_pad="14"
+ width="200">
+ My volume:
+ </text>
+ <slider_bar
+ control_name="AudioLevelMic"
+ follows="top|right|left"
+ height="17"
+ increment="0.025"
+ initial_value="1.0"
+ layout="topleft"
+ left_delta="95"
+ max_val="2"
+ name="mic_volume_slider"
+ tool_tip="Change the volume using this slider"
+ top_pad="-18"
+ width="110" />
+ <text
+ type="string"
+ text_color="EmphasisColor"
+ length="1"
+ follows="right|top"
+ height="18"
+ layout="topleft"
+ left_pad="5"
+ name="wait_text"
+ top_delta="-1"
+ width="110">
+ Please wait
+ </text>
+ <locate
+ follows="right|top"
+ height="20"
+ layout="topleft"
+ left_delta="0"
+ name="bar0"
+ top_delta="-2"
+ width="20" />
+ <locate
+ follows="right|top"
+ height="20"
+ layout="topleft"
+ left_pad="5"
+ name="bar1"
+ top_delta="0"
+ width="20" />
+ <locate
+ follows="right|top"
+ height="20"
+ layout="topleft"
+ left_pad="5"
+ name="bar2"
+ top_delta="0"
+ width="20" />
+ <locate
+ follows="right|top"
+ height="20"
+ layout="topleft"
+ left_pad="5"
+ name="bar3"
+ top_delta="0"
+ width="20" />
+ <locate
+ follows="right|top"
+ height="20"
+ layout="topleft"
+ left_pad="5"
+ name="bar4"
+ top_delta="0"
+ width="20" />
+</panel> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/panel_status_bar.xml b/indra/newview/skins/default/xui/en/panel_status_bar.xml
index 2f52ca660b..3aa34439f1 100644
--- a/indra/newview/skins/default/xui/en/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_status_bar.xml
@@ -2,7 +2,7 @@
<panel
background_opaque="true"
background_visible="true"
- bg_opaque_color="MouseGray"
+ bg_opaque_color="DkGray"
chrome="true"
follows="top|right"
height="19"
@@ -35,47 +35,60 @@
</panel.string>
<panel
height="18"
- left="-315"
- width="95"
+ left="-395"
+ width="185"
top="1"
follows="right|top"
- name="balance_bg"
- bg_visible="true"
- background_opaque="true"
- bg_opaque_image="bevel_background">
+ name="balance_bg">
<text
- auto_resize="true"
halign="center"
font="SansSerifSmall"
follows="all"
height="18"
left="0"
name="balance"
- tool_tip="My Balance"
+ tool_tip="Click to refresh your L$ balance"
v_pad="4"
top="0"
wrap="false"
value="L$20"
width="40" />
<button
- auto_resize="true"
halign="center"
font="SansSerifSmall"
follows="right|top|bottom"
- image_hover_unselected="buy_over"
- image_unselected="buy_off"
- image_pressed="buy_press"
+ image_hover_unselected="PushButton_Over"
+ image_unselected="PushButton_Off"
+ image_pressed="PushButton_Press"
height="18"
- label="BUY L$"
+ label="Buy L$"
label_color="White"
left_pad="0"
label_shadow="true"
name="buyL"
pad_right="0"
- pad_bottom="2"
tool_tip="Click to buy more L$"
top="0"
- width="55" />
+ width="80" />
+ <button
+ halign="left"
+ font="SansSerifSmall"
+ follows="right|top|bottom"
+ imgoverlay_label_space="7"
+ image_overlay="Command_MiniCart_Icon"
+ image_overlay_alignment="left"
+ image_hover_unselected="PushButton_Over"
+ image_unselected="PushButton_Off"
+ image_pressed="PushButton_Press"
+ height="18"
+ label="Shop"
+ label_color="White"
+ left_pad="0"
+ label_shadow="true"
+ name="goShop"
+ tool_tip="Open Second Life Marketplace"
+ top="0"
+ width="65" />
</panel>
<text
type="string"
diff --git a/indra/newview/skins/default/xui/en/panel_sys_well_item.xml b/indra/newview/skins/default/xui/en/panel_sys_well_item.xml
index 5e74689c5a..007b73a4bc 100644
--- a/indra/newview/skins/default/xui/en/panel_sys_well_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_sys_well_item.xml
@@ -13,7 +13,7 @@
follows="left|right"
background_opaque="false"
background_visible="true"
- bg_alpha_color="0.0 0.0 0.0 0.0" >
+ bg_alpha_color="SysWellItemUnselected" >
<text
clip_partial="true"
top="2"
@@ -22,7 +22,7 @@
height="28"
layout="topleft"
follows="right|left"
- text_color="white"
+ text_color="White"
use_ellipses="true"
word_wrap="true"
mouse_opaque="false"
diff --git a/indra/newview/skins/default/xui/en/panel_teleport_history_item.xml b/indra/newview/skins/default/xui/en/panel_teleport_history_item.xml
index c89e1dc215..c5b0be0616 100644
--- a/indra/newview/skins/default/xui/en/panel_teleport_history_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_teleport_history_item.xml
@@ -44,7 +44,7 @@
parse_urls="false"
use_ellipses="true"
name="region"
- text_color="white"
+ text_color="White"
top="4"
value="..."
width="330" />
diff --git a/indra/newview/skins/default/xui/en/panel_toast.xml b/indra/newview/skins/default/xui/en/panel_toast.xml
index 42f64c3a76..37a904bca8 100644
--- a/indra/newview/skins/default/xui/en/panel_toast.xml
+++ b/indra/newview/skins/default/xui/en/panel_toast.xml
@@ -20,7 +20,6 @@
width="310"
left="0"
top="0"
- follows="right|bottom"
background_visible="false"
bg_opaque_image="Toast_Over"
bg_alpha_image="Toast_Background"
@@ -59,7 +58,7 @@
left="20"
name="toast_text"
word_wrap="true"
- text_color="white"
+ text_color="White"
top="5"
translate="false"
use_ellipses="true"
diff --git a/indra/newview/skins/default/xui/en/panel_toolbar_view.xml b/indra/newview/skins/default/xui/en/panel_toolbar_view.xml
new file mode 100644
index 0000000000..58911bed56
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_toolbar_view.xml
@@ -0,0 +1,159 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<toolbar_view
+ follows="all"
+ layout="topleft"
+ name="toolbar view"
+ height="500"
+ width="1024"
+ left="0"
+ top="0"
+ mouse_opaque="false"
+ tab_stop="false"
+ visible="true">
+ <layout_stack name="bottom_toolbar_stack"
+ orientation="vertical"
+ left="0"
+ top="0"
+ width="1024"
+ height="500"
+ follows="all"
+ mouse_opaque="false">
+ <layout_panel name="vertical_toolbar_panel"
+ auto_resize="true"
+ width="1024"
+ height="500"
+ mouse_opaque="false">
+ <layout_stack name="vertical_toolbar_stack"
+ orientation="horizontal"
+ left="0"
+ top="0"
+ width="1024"
+ height="500"
+ follows="all"
+ mouse_opaque="false">
+ <layout_panel name="left_toolbar_panel"
+ auto_resize="false"
+ height="500"
+ width="30"
+ mouse_opaque="false">
+ <toolbar follows="left|top|bottom"
+ button_panel.bg_opaque_image="Rounded_Rect_Right"
+ name="toolbar_left"
+ width="30"
+ left="0"
+ top="10"
+ bottom="-10"
+ side="left"
+ button_display_mode="icons_only">
+ <icon layout="topleft"
+ height="15"
+ width="28"
+ follows="left|top"
+ top="20"
+ left="10"
+ tab_stop="false"
+ visible="false"
+ image_name="Caret_Left_Icon"
+ name="caret" />
+ </toolbar>
+ </layout_panel>
+ <layout_panel name="non_toolbar_panel"
+ auto_resize="true"
+ mouse_opaque="false"
+ height="100"
+ width="200">
+ <view top="0"
+ follows="all"
+ height="100"
+ left="0"
+ mouse_opaque="false"
+ name="floater_snap_region"
+ width="200"/>
+ <view top="0"
+ follows="left|top|bottom"
+ height="100"
+ left="0"
+ mouse_opaque="false"
+ name="minimized_floaters_region"
+ width="160"/>
+ <panel follows="left|top|right"
+ layout="topleft"
+ height="30"
+ left_pad="10"
+ mouse_opaque="false"
+ name="chiclet_container"
+ tab_stop="false"
+ top="0"
+ bg_visible="false"
+ width="20">
+ </panel>
+ <panel bottom="100"
+ follows="left|right|bottom"
+ height="25"
+ left="0"
+ mouse_opaque="false"
+ tab_stop="false"
+ name="stand_stop_flying_container"
+ visible="false"
+ width="200"/>
+ </layout_panel>
+ <layout_panel name="right_toolbar_panel"
+ auto_resize="false"
+ height="500"
+ width="30"
+ mouse_opaque="false">
+ <toolbar
+ button_panel.bg_opaque_image="Rounded_Rect_Left"
+ follows="right|top|bottom"
+ name="toolbar_right"
+ width="30"
+ left="0"
+ top="10"
+ bottom="-10"
+ side="right"
+ button_display_mode="icons_only">
+ <icon layout="topleft"
+ height="15"
+ width="28"
+ follows="left|top"
+ top="20"
+ left="10"
+ tab_stop="false"
+ visible="false"
+ image_name="Caret_Right_Icon"
+ name="caret" />
+ </toolbar>
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+ <layout_panel name="bottom_toolbar_panel"
+ auto_resize="false"
+ height="30"
+ width="1024"
+ mouse_opaque="false">
+ <toolbar layout="topleft"
+ button_panel.bg_opaque_image="Rounded_Rect_Top"
+ name="toolbar_bottom"
+ height="30"
+ left="40"
+ right="-40"
+ top="0"
+ side="bottom"
+ follows="left|right|bottom"
+ button_display_mode="icons_with_text"
+ visible="true">
+ <icon layout="topleft"
+ height="28"
+ width="15"
+ follows="left|top"
+ top="20"
+ left="10"
+ tab_stop="false"
+ visible="false"
+ use_draw_context_alpha="false"
+ image_name="Caret_Bottom_Icon"
+ name="caret" />
+ </toolbar>
+ </layout_panel>
+ </layout_stack>
+</toolbar_view>
diff --git a/indra/newview/skins/default/xui/en/panel_topinfo_bar.xml b/indra/newview/skins/default/xui/en/panel_topinfo_bar.xml
index 30d3064e14..fc527f5f9d 100644
--- a/indra/newview/skins/default/xui/en/panel_topinfo_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_topinfo_bar.xml
@@ -4,7 +4,7 @@
background_opaque="false"
bg_opaque_color="Black_50"
bg_alpha_color="Black_50"
- follows="left|top|right"
+ follows="left|top"
height="19"
layout="topleft"
name="topinfo_bar"
@@ -88,6 +88,16 @@
visible="false"
width="14"
/>
+ <icon
+ follows="right|top"
+ height="13"
+ image_name="Parcel_SeeAVsOff_Light"
+ left="2"
+ name="see_avatars_icon"
+ top="3"
+ visible="false"
+ width="14"
+ />
<text
follows="right|top"
font="SansSerifSmall"
diff --git a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
index b5839878d5..1d98a84e25 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
@@ -114,7 +114,7 @@ width="333">
layout="topleft"
left="10"
label="Filter Outfits"
- max_length="300"
+ max_length_chars="300"
name="Filter"
search_button_visible="true"
top_pad="10"
diff --git a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
index f3c6895cee..6ecb57b41d 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
- background_visible="true"
follows="all"
height="570"
label="Things"
@@ -9,7 +8,7 @@
min_width="240"
name="objects panel"
width="333">
- <panel
+ <panel
follows="all"
layout="topleft"
left="0"
@@ -19,25 +18,129 @@
height="570"
visible="true"
width="330">
- <panel
- class="panel_main_inventory"
- filename="panel_main_inventory.xml"
- follows="all"
- layout="topleft"
- left="0"
- name="panel_main_inventory"
- top="0"
- label=""
- height="545"
- width="330" />
+ <layout_stack
+ follows="left|right|top|bottom"
+ layout="topleft"
+ left="0"
+ top="0"
+ orientation="vertical"
+ name="inventory_layout_stack"
+ height="535"
+ width="330">
+ <layout_panel
+ name="main_inventory_layout_panel"
+ layout="topleft"
+ auto_resize="true"
+ user_resize="true"
+ min_dim="150"
+ width="330"
+ follows="bottom|left|right"
+ height="300">
+ <panel
+ class="panel_main_inventory"
+ filename="panel_main_inventory.xml"
+ follows="all"
+ layout="topleft"
+ left="0"
+ name="panel_main_inventory"
+ top="0"
+ label=""
+ height="300"
+ width="330" />
+ </layout_panel>
+ <layout_panel
+ width="330"
+ layout="topleft"
+ auto_resize="false"
+ user_resize="true"
+ follows="left|right|top"
+ name="inbox_layout_panel"
+ visible="false"
+ min_dim="35"
+ max_dim="235"
+ expanded_min_dim="90"
+ height="235">
+ <panel
+ follows="all"
+ layout="topleft"
+ left="0"
+ name="marketplace_inbox"
+ class="panel_marketplace_inbox"
+ top="0"
+ label=""
+ height="235"
+ width="330">
+ <string name="InboxLabelWithArg">Received items ([NUM])</string>
+ <string name="InboxLabelNoArg">Received items</string>
+ <button
+ control_name="InventoryInboxToggleState"
+ label="Received items"
+ font="SansSerifMedium"
+ name="inbox_btn"
+ height="35"
+ width="308"
+ image_unselected="MarketplaceBtn_Off"
+ image_selected="MarketplaceBtn_Selected"
+ halign="left"
+ handle_right_mouse="false"
+ follows="top|left|right"
+ is_toggle="true"
+ tab_stop="false"
+ pad_left="35"
+ top="0"
+ left="10" />
+ <text
+ type="string"
+ length="1"
+ follows="right|top"
+ layout="topleft"
+ height="13"
+ top="10"
+ right="-20"
+ name="inbox_fresh_new_count"
+ font="SansSerifMedium"
+ halign="right"
+ top_pad="0"
+ width="300">
+ [NUM] new
+ </text>
+ <panel
+ name="inbox_inventory_placeholder_panel"
+ follows="all"
+ left="10"
+ bottom="235"
+ width="308"
+ top="35"
+ bg_opaque_color="InventoryBackgroundColor"
+ background_visible="true"
+ background_opaque="true"
+ tool_tip="Drag and drop items to your inventory to use them"
+ >
+ <text
+ name="inbox_inventory_placeholder"
+ type="string"
+ follows="all"
+ layout="topleft"
+ top="0"
+ left="0"
+ width="308"
+ height="200"
+ wrap="true"
+ halign="center">
+ Purchases from the marketplace will be delivered here.
+ </text>
+ </panel>
+ </panel>
+ </layout_panel>
+ </layout_stack>
<panel
follows="bottom|left|right"
- height="25"
+ height="30"
layout="topleft"
name="button_panel"
left="9"
- top_pad="-2"
- width="313">
+ top_pad="7"
+ width="308">
<layout_stack
follows="bottom|left|right"
height="23"
@@ -47,7 +150,7 @@
left="0"
orientation="horizontal"
top="0"
- width="313">
+ width="308">
<layout_panel
follows="bottom|left|right"
height="23"
@@ -55,9 +158,8 @@
left="0"
mouse_opaque="false"
name="info_btn_lp"
- user_resize="false"
auto_resize="true"
- width="103">
+ width="101">
<button
enabled="true"
follows="bottom|left|right"
@@ -68,62 +170,60 @@
name="info_btn"
tool_tip="Show object profile"
top="0"
- width="102" />
+ width="100" />
</layout_panel>
<layout_panel
follows="bottom|left|right"
height="23"
layout="bottomleft"
- left_pad="3"
+ left_pad="1"
mouse_opaque="false"
name="share_btn_lp"
- user_resize="false"
auto_resize="true"
- width="102">
+ width="100">
<button
enabled="true"
follows="bottom|left|right"
height="23"
label="Share"
layout="topleft"
- left="0"
+ left="1"
name="share_btn"
tool_tip="Share an inventory item"
top="0"
- width="102" />
+ width="99" />
</layout_panel>
<layout_panel
follows="bottom|left|right"
height="23"
layout="bottomleft"
- left_pad="3"
+ left_pad="1"
mouse_opaque="false"
name="shop_btn_lp"
- user_resize="false"
auto_resize="true"
- width="102">
+ width="100">
<button
enabled="true"
follows="bottom|left|right"
height="23"
label="Shop"
layout="topleft"
- left="0"
+ left="1"
name="shop_btn"
tool_tip="Open Marketplace webpage"
top="0"
- width="102" />
+ width="99" />
<button
enabled="false"
follows="bottom|left|right"
height="23"
label="Wear"
layout="topleft"
- left="0"
+ left="1"
name="wear_btn"
tool_tip="Wear seleceted outfit"
top="0"
- width="102" />
+ width="99" />
<button
enabled="false"
follows="bottom|left|right"
@@ -131,26 +231,25 @@
label="Play"
layout="topleft"
name="play_btn"
- left="0"
+ left="1"
top="0"
- width="102" />
+ width="99" />
<button
enabled="false"
follows="bottom|left|right"
height="23"
label="Teleport"
layout="topleft"
- left="0"
+ left="1"
name="teleport_btn"
tool_tip="Teleport to the selected area"
top="0"
- width="102" />
+ width="99" />
</layout_panel>
</layout_stack>
</panel>
</panel>
-
-<panel
+ <panel
follows="all"
layout="topleft"
left="0"
@@ -163,8 +262,7 @@
visible="false"
width="330">
</panel>
-
-<panel
+ <panel
follows="all"
layout="topleft"
left="0"
diff --git a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
index 6940d1549b..54a312bd59 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
@@ -56,7 +56,8 @@
name="back_btn"
tab_stop="false"
top="2"
- width="30" />
+ width="30"
+ use_draw_context_alpha="false" />
<text
follows="top|left|right"
font="SansSerifHugeBold"
diff --git a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml
index ca63d2df39..6600339ad7 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml
@@ -55,7 +55,7 @@
Mixed Sale
</panel.string>
<button
- follows="top|right"
+ follows="top|left"
height="24"
image_hover_unselected="BackButton_Over"
image_pressed="BackButton_Press"
@@ -65,7 +65,8 @@
name="back_btn"
tab_stop="false"
top="0"
- width="30" />
+ width="30"
+ use_draw_context_alpha="false" />
<text
follows="top|left|right"
font="SansSerifHuge"
@@ -167,9 +168,10 @@
left_pad="0"
name="Creator Name"
top_delta="0"
+ translate="false"
use_ellipses="true"
width="225">
- Erica Linden
+ TestString PleaseIgnore
</text>
<text
type="string"
@@ -192,9 +194,10 @@
left_pad="0"
name="Owner Name"
top_delta="0"
+ translate="false"
use_ellipses="true"
width="225">
- Erica Linden
+ TestString PleaseIgnore
</text>
<text
type="string"
@@ -532,7 +535,7 @@
left="5"
name="open_btn"
top="0"
- width="100" />
+ width="73" />
<button
follows="bottom|left"
height="23"
@@ -541,7 +544,7 @@
left_pad="5"
name="pay_btn"
top="0"
- width="100" />
+ width="73" />
<button
follows="bottom|left"
height="23"
@@ -550,17 +553,16 @@
left_pad="5"
name="buy_btn"
top="0"
- width="100" />
+ width="73" />
<button
follows="bottom|left"
height="23"
label="Details"
layout="topleft"
- left="5"
+ left_pad="5"
name="details_btn"
top="0"
- width="100"
- visible="false" />
+ width="74" />
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 51fba470cb..4ccec4838a 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -16,15 +16,16 @@
<string name="StartupDetectingHardware">Detecting hardware...</string>
<string name="StartupLoading">Loading [APP_NAME]...</string>
<string name="StartupClearingCache">Clearing cache...</string>
- <string name="StartupInitializingTextureCache">Initializing Texture Cache...</string>
+ <string name="StartupInitializingTextureCache">Initializing texture cache...</string>
<string name="StartupInitializingVFS">Initializing VFS...</string>
+ <string name="StartupRequireDriverUpdate">Graphics initialization failed. Please update your graphics driver!</string>
<!-- progress -->
<string name="ProgressRestoring">Restoring...</string>
- <string name="ProgressChangingResolution">Changing Resolution...</string>
+ <string name="ProgressChangingResolution">Changing resolution...</string>
<!-- Legacy strings, almost never used -->
- <string name="Fullbright">Fullbright (Legacy)</string> <!-- used in the Build > materials dropdown-->
+ <string name="Fullbright">Fullbright (legacy)</string> <!-- used in the Build > materials dropdown-->
<!-- Login -->
<string name="LoginInProgress">Logging in. [APP_NAME] may appear frozen. Please wait.</string>
@@ -34,30 +35,109 @@
<string name="LoginAttempt">Previous login attempt failed. Logging in, attempt [NUMBER]</string>
<string name="LoginPrecaching">Loading world...</string>
<string name="LoginInitializingBrowser">Initializing embedded web browser...</string>
- <string name="LoginInitializingMultimedia">Initializing multimedia...</string>
- <string name="LoginInitializingFonts">Loading fonts...</string>
- <string name="LoginVerifyingCache">Verifying cache files (can take 60-90 seconds)...</string>
- <string name="LoginProcessingResponse">Processing Response...</string>
- <string name="LoginInitializingWorld">Initializing World...</string>
+ <string name="LoginInitializingMultimedia">Initializing multimedia...</string>
+ <string name="LoginInitializingFonts">Loading fonts...</string>
+ <string name="LoginVerifyingCache">Verifying cache files (can take 60-90 seconds)...</string>
+ <string name="LoginProcessingResponse">Processing response...</string>
+ <string name="LoginInitializingWorld">Initializing world...</string>
<string name="LoginDecodingImages">Decoding images...</string>
<string name="LoginInitializingQuicktime">Initializing QuickTime...</string>
<string name="LoginQuicktimeNotFound">QuickTime not found - unable to initialize.</string>
<string name="LoginQuicktimeOK">QuickTime initialized successfully.</string>
+ <string name="LoginRequestSeedCapGrant">Requesting region capabilities...</string>
+ <string name="LoginRetrySeedCapGrant">Requesting region capabilities, attempt [NUMBER]...</string>
<string name="LoginWaitingForRegionHandshake">Waiting for region handshake...</string>
<string name="LoginConnectingToRegion">Connecting to region...</string>
<string name="LoginDownloadingClothing">Downloading clothing...</string>
- <string name="InvalidCertificate">The server returned an invalid or corrupt certificate. Please contact the Grid administrator.</string>
- <string name="CertInvalidHostname">An invalid hostname was used to access the server, please check your SLURL or Grid hostname.</string>
- <string name="CertExpired">The certificate returned by the Grid appears to be expired. Please check your system clock, or contact your Grid administrator.</string>
- <string name="CertKeyUsage">The certificate returned by the server could not be used for SSL. Please contact your Grid administrator.</string>
- <string name="CertBasicConstraints">Too many certificates were in the servers Certificate chain. Please contact your Grid administrator.</string>
- <string name="CertInvalidSignature">The certificate signature returned by the Grid server could not be verified. Please contact your Grid administrator.</string>
-
- <string name="LoginFailedNoNetwork">Network Error: Could not establish connection, please check your network connection.</string>
+ <string name="InvalidCertificate">The server returned an invalid or corrupt certificate. Please contact the Grid administrator.</string>
+ <string name="CertInvalidHostname">An invalid hostname was used to access the server, please check your SLURL or Grid hostname.</string>
+ <string name="CertExpired">The certificate returned by the Grid appears to be expired. Please check your system clock, or contact your Grid administrator.</string>
+ <string name="CertKeyUsage">The certificate returned by the server could not be used for SSL. Please contact your Grid administrator.</string>
+ <string name="CertBasicConstraints">Too many certificates were in the servers Certificate chain. Please contact your Grid administrator.</string>
+ <string name="CertInvalidSignature">The certificate signature returned by the Grid server could not be verified. Please contact your Grid administrator.</string>
+
+ <string name="LoginFailedNoNetwork">Network error: Could not establish connection, please check your network connection.</string>
<string name="LoginFailed">Login failed.</string>
<string name="Quit">Quit</string>
<string name="create_account_url">http://join.secondlife.com/</string>
+ <string name="LoginFailedViewerNotPermitted">
+The viewer you are using can no longer access Second Life. Please visit the following page to download a new viewer:
+http://secondlife.com/download
+
+For more information, see our FAQ below:
+http://secondlife.com/viewer-access-faq</string>
+ <string name="LoginIntermediateOptionalUpdateAvailable">Optional viewer update available: [VERSION]</string>
+ <string name="LoginFailedRequiredUpdate">Required viewer update: [VERSION]</string>
+ <string name="LoginFailedAlreadyLoggedIn">This agent is already logged in.
+</string>
+ <string name="LoginFailedAuthenticationFailed">Sorry! We couldn't log you in.
+Please check to make sure you entered the right
+ * Username (like bobsmith12 or steller.sunshine)
+ * Password
+Also, please make sure your Caps Lock key is off.</string>
+ <string name="LoginFailedPasswordChanged">As a security precaution your password has been changed.
+Please go to your account page at http://secondlife.com/password
+and answer the security question to reset your password.
+We are very sorry for the inconvenience.</string>
+ <string name="LoginFailedPasswordReset">We made some changes to our system and you will need to reset your password.
+Please go to your account page at http://secondlife.com/password
+and answer the security question to reset your password.
+We are very sorry for the inconvenience.</string>
+ <string name="LoginFailedEmployeesOnly">Second Life is temporarily closed for maintenance.
+Logins are currently restricted to employees only.
+Check www.secondlife.com/status for updates.</string>
+ <string name="LoginFailedPremiumOnly">Second Life logins are temporarily restricted in order to make sure that those in-world have the best possible experience.
+
+People with free accounts will not be able to access Second Life during this time, to make room for those who have paid for Second Life.</string>
+ <string name="LoginFailedComputerProhibited">Second Life cannot be accessed from this computer.
+If you feel this is an error, please contact
+support@secondlife.com.</string>
+ <string name="LoginFailedAcountSuspended">Your account is not accessible until
+[TIME] Pacific Time.</string>
+ <string name="LoginFailedAccountDisabled">We are unable to complete your request at this time.
+Please contact Second Life support for assistance at http://secondlife.com/support.
+If you are unable to change your password, please call (866) 476-9763.</string>
+ <string name="LoginFailedTransformError">Data inconsistency found during login.
+Please contact support@secondlife.com.</string>
+ <string name="LoginFailedAccountMaintenance">Your account is undergoing minor maintenance.
+Your account is not accessible until
+[TIME] Pacific Time.
+If you feel this is an error, please contact support@secondlife.com.</string>
+ <string name="LoginFailedPendingLogoutFault">Request for logout responded with a fault from simulator.</string>
+ <string name="LoginFailedPendingLogout">The system is logging you out right now.
+Your Account will not be available until
+[TIME] Pacific Time.</string>
+ <string name="LoginFailedUnableToCreateSession">Unable to create valid session.</string>
+ <string name="LoginFailedUnableToConnectToSimulator">Unable to connect to a simulator.</string>
+ <string name="LoginFailedRestrictedHours">Your account can only access Second Life
+between [START] and [END] Pacific Time.
+Please come back during those hours.
+If you feel this is an error, please contact support@secondlife.com.</string>
+ <string name="LoginFailedIncorrectParameters">Incorrect parameters.
+If you feel this is an error, please contact support@secondlife.com.</string>
+ <string name="LoginFailedFirstNameNotAlphanumeric">First name parameter must be alphanumeric.
+If you feel this is an error, please contact support@secondlife.com.</string>
+ <string name="LoginFailedLastNameNotAlphanumeric">Last name parameter must be alphanumeric.
+If you feel this is an error, please contact support@secondlife.com.</string>
+ <string name="LogoutFailedRegionGoingOffline">Region is going offline.
+Please try logging in again in a minute.</string>
+ <string name="LogoutFailedAgentNotInRegion">Agent not in region.
+Please try logging in again in a minute.</string>
+ <string name="LogoutFailedPendingLogin">The region was logging in another session.
+Please try logging in again in a minute.</string>
+ <string name="LogoutFailedLoggingOut">The region was logging out the previous session.
+Please try logging in again in a minute.</string>
+ <string name="LogoutFailedStillLoggingOut">The region is still logging out the previous session.
+Please try logging in again in a minute.</string>
+ <string name="LogoutSucceeded">Region has logged out last session.
+Please try logging in again in a minute.</string>
+ <string name="LogoutFailedLogoutBegun">Region has begun the logout process.
+Please try logging in again in a minute.</string>
+ <string name="LoginFailedLoggingOutSession">The system has begun logging out your last session.
+Please try logging in again in a minute.</string>
+
+
<!-- Disconnection -->
<string name="AgentLostConnection">This region may be experiencing trouble. Please check your connection to the Internet.</string>
<string name="SavingSettings">Saving your settings...</string>
@@ -85,11 +165,23 @@
<string name="TooltipMustSingleDrop">Only a single item can be dragged here</string>
<string name="TooltipPrice" value="L$[AMOUNT]: "/>
+ <string name="TooltipOutboxDragToWorld">You can not rez items in your merchant outbox</string>
+ <string name="TooltipOutboxNoTransfer">One or more of these objects cannot be sold or transferred.</string>
+ <string name="TooltipOutboxNotInInventory">Your merchant outbox can only accept items directly from your inventory</string>
+ <string name="TooltipOutboxWorn">You can not put items you are wearing into your merchant outbox</string>
+ <string name="TooltipOutboxCallingCard">You can not put calling cards into your merchant outbox</string>
+ <string name="TooltipOutboxFolderLevels">Depth of nested folders exceeds 3</string>
+ <string name="TooltipOutboxTooManyFolders">Subfolder count in top-level folder exceeds 20</string>
+ <string name="TooltipOutboxTooManyObjects">Item count in top-level folder exceeds 200</string>
+
+ <string name="TooltipDragOntoOwnChild">You can't move a folder into its child</string>
+ <string name="TooltipDragOntoSelf">You can't move a folder into itself</string>
+
<!-- tooltips for Urls -->
<string name="TooltipHttpUrl">Click to view this web page</string>
<string name="TooltipSLURL">Click to view this location's information</string>
<string name="TooltipAgentUrl">Click to view this Resident's profile</string>
- <string name="TooltipAgentInspect">Learn more about this Resident</string>
+ <string name="TooltipAgentInspect">Learn more about this Resident</string>
<string name="TooltipAgentMute">Click to mute this Resident</string>
<string name="TooltipAgentUnmute">Click to unmute this Resident</string>
<string name="TooltipAgentIM">Click to IM this Resident</string>
@@ -104,7 +196,7 @@
<string name="TooltipObjectIMUrl">Click to view this object's description</string>
<string name="TooltipMapUrl">Click to view this location on a map</string>
<string name="TooltipSLAPP">Click to run the secondlife:// command</string>
- <string name="CurrentURL" value=" CurrentURL: [CurrentURL]" />
+ <string name="CurrentURL" value=" CurrentURL: [CurrentURL]" />
<!-- text for SLURL labels -->
<string name="SLurlLabelTeleport">Teleport to</string>
@@ -198,6 +290,7 @@
<string name="favorite">favorite</string>
<string name="symbolic link">link</string>
<string name="symbolic folder link">folder link</string>
+ <string name="mesh">mesh</string>
<!-- llvoavatar. Displayed in the avatar chat bubble -->
<string name="AvatarEditingAppearance">(Editing Appearance)</string>
@@ -276,6 +369,9 @@
<string name="anim_yes_happy">Yes (Happy)</string>
<string name="anim_yes_head">Yes</string>
+ <!-- build floater -->
+ <string name="multiple_textures">Multiple</string>
+
<!-- world map -->
<string name="texture_loading">Loading...</string>
<string name="worldmap_offline">Offline</string>
@@ -307,8 +403,9 @@
<string name="AddAndRemoveJoints">Add and remove joints with other objects</string>
<string name="ChangePermissions">Change its permissions</string>
<string name="TrackYourCamera">Track your camera</string>
- <string name="ControlYourCamera">Control your camera</string>
- <string name="NotConnected">Not Connected</string>
+ <string name="ControlYourCamera">Control your camera</string>
+ <string name="TeleportYourAgent">Teleport you</string>
+ <string name="NotConnected">Not Connected</string>
<!-- Sim Access labels -->
<string name="SIM_ACCESS_PG">General</string>
@@ -342,9 +439,10 @@
<string name="compressed_image_files">Compressed Images</string>
<string name="load_files">Load Files</string>
<string name="choose_the_directory">Choose Directory</string>
+ <string name="script_files">Scripts</string>
- <!-- LSL Usage Hover Tips -->
- <!-- NOTE: For now these are set as translate="false", until DEV-40761 is implemented (to internationalize the rest of tooltips in the same window).
+ <!-- LSL Usage Hover Tips -->
+ <!-- NOTE: For now these are set as translate="false", until DEV-40761 is implemented (to internationalize the rest of tooltips in the same window).
This has no effect on viewer code, but prevents Linden Lab internal localization tool from scraping these strings. -->
<string name="LSLTipSleepTime" translate="false">
Sleeps script for [SLEEP_TIME] seconds.
@@ -1681,10 +1779,10 @@ integer llGetParcelMaxPrims(vector pos, integer sim_wide)
Returns the maximum number of prims allowed on the parcel at pos
</string>
<string name="LSLTipText_llGetParcelDetails" translate="false">
-list llGetParcelDetails(vector pos, list params)
-Returns the parcel details specified in params for the parcel at pos.
-Params is one or more of: PARCEL_DETAILS_NAME, _DESC, _OWNER, _GROUP, _AREA
- </string>
+ list llGetParcelDetails(vector pos, list params)
+ Returns the parcel details specified in params for the parcel at pos.
+ Params is one or more of: PARCEL_DETAILS_NAME, _DESC, _OWNER, _GROUP, _AREA, _ID, _SEE_AVATARS
+ </string>
<string name="LSLTipText_llSetLinkPrimitiveParams" translate="false">
llSetLinkPrimitiveParams(integer linknumber, list rules)
Sets primitive parameters for linknumber based on rules
@@ -1716,8 +1814,8 @@ integer llGetRegionAgentCount()
Returns the number of avatars in the region
</string>
<string name="LSLTipText_llTextBox" translate="false">
-llTextBox(key avatar, string message, integer chat_channel
-Shows a dialog box on the avatar&apos;s screen with the message.
+llTextBox(key avatar, string message, integer chat_channel)
+Shows a window on the avatar&apos;s screen with the message.
It contains a text box for input, and if entered that text is chatted on chat_channel.
</string>
<string name="LSLTipText_llGetAgentLanguage" translate="false">
@@ -1830,6 +1928,15 @@ Requests single-word username of an avatar. When data is available the dataserv
key llRequestDisplayName(key id)
Requests name of an avatar. When data is available the dataserver event will be raised.
</string>
+<string name="LSLTipText_llRegionSayTo" translate="false">
+llRegionSayTo(key target, integer channel, string msg)
+Sends msg on channel (not DEBUG_CHANNEL) directly to prim or avatar target anywhere within the region
+</string>
+<string name="LSLTipText_llGetEnv" translate="false">
+llGetEnv(string name)
+Returns a string with the requested data about the region
+</string>
+
<!-- Avatar busy/away mode -->
<string name="AvatarSetNotAway">Not Away</string>
@@ -1853,9 +1960,10 @@ Requests name of an avatar. When data is available the dataserver event will be
<string name="skirt">Skirt</string>
<string name="alpha">Alpha</string>
<string name="tattoo">Tattoo</string>
+ <string name="physics">Physics</string>
<string name="invalid">invalid</string>
<string name="none">none</string>
-
+
<!-- Not Worn Wearable Types -->
<string name="shirt_not_worn">Shirt not worn</string>
<string name="pants_not_worn">Pants not worn</string>
@@ -1868,6 +1976,7 @@ Requests name of an avatar. When data is available the dataserver event will be
<string name="skirt_not_worn">Skirt not worn</string>
<string name="alpha_not_worn">Alpha not worn</string>
<string name="tattoo_not_worn">Tattoo not worn</string>
+ <string name="physics_not_worn">Physics not worn</string>
<string name="invalid_not_worn">invalid</string>
<!-- Create new wearable of the specified type -->
@@ -1886,11 +1995,12 @@ Requests name of an avatar. When data is available the dataserver event will be
<string name="create_new_skirt">Create new skirt</string>
<string name="create_new_alpha">Create new alpha</string>
<string name="create_new_tattoo">Create new tattoo</string>
+ <string name="create_new_physics">Create new physics</string>
<string name="create_new_invalid">invalid</string>
<!-- Wearable List-->
<string name="NewWearable">New [WEARABLE_ITEM]</string>
-
+
<!-- LLGroupNotify -->
<!-- used in the construction of a Group Notice blue dialog box, buttons, tooltip etc. Seems to be no longer utilized by code in Viewer 2.0 -->
<string name="next">Next</string>
@@ -1931,7 +2041,36 @@ Requests name of an avatar. When data is available the dataserver event will be
<string name="PlacesNoMatchingItems">Didn't find what you're looking for? Try [secondlife:///app/search/places/[SEARCH_TERM] Search].</string>
<string name="FavoritesNoMatchingItems">Drag a landmark here to add it to your favorites.</string>
<string name="InventoryNoTexture">You do not have a copy of this texture in your inventory</string>
- <!-- use value="" because they have preceding spaces -->
+ <string name="InventoryInboxNoItems">Your Marketplace purchases will appear here. You may then drag them into your inventory to use them.</string>
+ <string name="MarketplaceURL">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/</string>
+ <string name="MarketplaceURL_CreateStore">http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.4</string>
+ <string name="MarketplaceURL_Dashboard">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard</string>
+ <string name="MarketplaceURL_Imports">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports</string>
+ <string name="MarketplaceURL_LearnMore">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more</string>
+ <string name="InventoryOutboxNotMerchantTitle">Anyone can sell items on the Marketplace.</string>
+ <string name="InventoryOutboxNotMerchantTooltip"></string>
+ <string name="InventoryOutboxNotMerchant">
+If you'd like to become a merchant, you'll need to [[MARKETPLACE_CREATE_STORE_URL] create a Marketplace store].
+ </string>
+ <string name="InventoryOutboxNoItemsTitle">Your outbox is empty.</string>
+ <string name="InventoryOutboxNoItemsTooltip"></string>
+ <string name="InventoryOutboxNoItems">
+Drag folders to this area and click "Send to Marketplace" to list them for sale on the [[MARKETPLACE_DASHBOARD_URL] Marketplace].
+ </string>
+
+ <string name="Marketplace Error None">No errors</string>
+ <string name="Marketplace Error Not Merchant">Error: Before sending items to the Marketplace you will need to set yourself up as a merchant (free of charge).</string>
+ <string name="Marketplace Error Empty Folder">Error: This folder has no contents.</string>
+ <string name="Marketplace Error Unassociated Products">Error: This item failed to upload because your merchant account has too many items unassociated with products. To fix this error, log in to the marketplace website and reduce your unassociated item count.</string>
+
+ <string name="Marketplace Error Object Limit">Error: This item contains too many objects. Fix this error by placing objects together in boxes to reduce the total count to less than 200.</string>
+ <string name="Marketplace Error Folder Depth">Error: This item contains too many levels of nested folders. Reorganize it to a maximum of 3 levels of nested folders.</string>
+ <string name="Marketplace Error Unsellable Item">Error: This item can not be sold on the marketplace.</string>
+ <string name="Marketplace Error Internal Import">Error: There was a problem with this item. Try again later.</string>
+
+ <string name="Open landmarks">Open landmarks</string>
+
+ <!-- use value="" because they have preceding spaces -->
<string name="no_transfer" value=" (no transfer)" />
<string name="no_modify" value=" (no modify)" />
<string name="no_copy" value=" (no copy)" />
@@ -1948,7 +2087,7 @@ Requests name of an avatar. When data is available the dataserver event will be
<!-- Gestures labels -->
<!-- use value="" because they have preceding spaces -->
- <string name="Chat" value=" Chat : " />
+ <string name="Chat Message" value=" Chat : " />
<string name="Sound" value=" Sound : " />
<string name="Wait" value=" --- Wait : " />
<string name="AnimFlagStop" value=" Stop Animation : " />
@@ -1977,7 +2116,6 @@ Requests name of an avatar. When data is available the dataserver event will be
<!-- inventory folder -->
<string name="InvFolder My Inventory">My Inventory</string>
- <string name="InvFolder My Favorites">My Favorites</string>
<string name="InvFolder Library">Library</string>
<string name="InvFolder Textures">Textures</string>
<string name="InvFolder Sounds">Sounds</string>
@@ -1997,19 +2135,23 @@ Requests name of an avatar. When data is available the dataserver event will be
<string name="InvFolder Uncompressed Sounds">Uncompressed Sounds</string>
<string name="InvFolder Animations">Animations</string>
<string name="InvFolder Gestures">Gestures</string>
- <string name="InvFolder Favorite">Favorites</string>
+ <string name="InvFolder Favorite">My Favorites</string>
<!-- historically default name of the Favorites folder can start from either "f" or "F" letter.
We should localize both of them with the same value -->
- <string name="InvFolder favorite">Favorites</string>
+ <string name="InvFolder favorite">My Favorites</string>
<string name="InvFolder Current Outfit">Current Outfit</string>
<string name="InvFolder Initial Outfits">Initial Outfits</string>
<string name="InvFolder My Outfits">My Outfits</string>
<string name="InvFolder Accessories">Accessories</string>
+ <string name="InvFolder Meshes">Meshes</string>
<!-- are used for Friends and Friends/All folders in Inventory "Calling cards" folder. See EXT-694-->
<string name="InvFolder Friends">Friends</string>
<string name="InvFolder All">All</string>
+ <string name="no_attachments">No attachments worn</string>
+ <string name="Attachments remain">Attachments ([COUNT] slots remain)</string>
+
<!-- inventory FVBridge -->
<!-- This is used in llpanelinventory.cpp when constructing a context menu for an item for Sale -->
<string name="Buy">Buy</string>
@@ -2059,6 +2201,8 @@ Requests name of an avatar. When data is available the dataserver event will be
<string name="Stomach">Stomach</string>
<string name="Left Pec">Left Pec</string>
<string name="Right Pec">Right Pec</string>
+ <string name="Neck">Neck</string>
+ <string name="Avatar Center">Avatar Center</string>
<string name="Invalid Attachment">Invalid Attachment Point</string>
<!-- Avatar age computation, see LLDateUtil::ageFromDate -->
@@ -2143,6 +2287,7 @@ Requests name of an avatar. When data is available the dataserver event will be
<string name="Unknown">(Unknown)</string>
<string name="SummaryForTheWeek" value="Summary for this week, beginning on " />
<string name="NextStipendDay" value="The next stipend day is " />
+ <string name="GroupPlanningDate">[mthnum,datetime,utc]/[day,datetime,utc]/[year,datetime,utc]</string>
<string name="GroupIndividualShare" value=" Group Individual Share" />
<string name="GroupColumn" value=" Group" />
<string name="Balance">Balance</string>
@@ -2157,6 +2302,9 @@ Requests name of an avatar. When data is available the dataserver event will be
<string name="IMMainland">mainland</string>
<string name="IMTeen">teen</string>
+ <!-- floater about land -->
+ <string name="Anyone">anyone</string>
+
<!-- floater region info -->
<!-- The following will replace variable [ALL_ESTATES] in notifications EstateAllowed*, EstateBanned*, EstateManager* -->
<string name="RegionInfoError">error</string>
@@ -2183,7 +2331,7 @@ Requests name of an avatar. When data is available the dataserver event will be
<string name="ScriptLimitsRequestWrongRegion">Error: script information is only available in your current region</string>
<string name="ScriptLimitsRequestWaiting">Retrieving information...</string>
<string name="ScriptLimitsRequestDontOwnParcel">You do not have permission to examine this parcel</string>
-
+
<string name="SITTING_ON">Sitting On</string>
<string name="ATTACH_CHEST">Chest</string>
<string name="ATTACH_HEAD">Head</string>
@@ -2223,7 +2371,7 @@ Requests name of an avatar. When data is available the dataserver event will be
<string name="ATTACH_HUD_BOTTOM_LEFT">HUD Bottom Left</string>
<string name="ATTACH_HUD_BOTTOM">HUD Bottom</string>
<string name="ATTACH_HUD_BOTTOM_RIGHT">HUD Bottom Right</string>
-
+
<!-- script editor -->
<string name="CursorPos">Line [LINE], Column [COLUMN]</string>
@@ -2236,7 +2384,7 @@ Requests name of an avatar. When data is available the dataserver event will be
<!-- panel contents -->
<string name="PanelContentsTooltip">Content of object</string>
- <string name="PanelContentsNewScript">New Script</string>
+ <string name="PanelContentsNewScript">New Script</string>
<!-- panel preferences general -->
<string name="BusyModeResponseDefault">The Resident you messaged is in &apos;busy mode&apos; which means they have requested not to be disturbed. Your message will still be shown in their IM panel for later viewing.</string>
@@ -2259,10 +2407,14 @@ Requests name of an avatar. When data is available the dataserver event will be
<string name="GroupOwned">Group Owned</string>
<string name="Public">Public</string>
+ <!-- Environment settings -->
+ <string name="LocalSettings">Local Settings</string>
+ <string name="RegionSettings">Region Settings</string>
+
<!-- panel classified -->
<string name="ClassifiedClicksTxt">Clicks: [TELEPORT] teleport, [MAP] map, [PROFILE] profile</string>
<string name="ClassifiedUpdateAfterPublish">(will update after publish)</string>
-
+
<!-- panel picks -->
<string name="NoPicksClassifiedsText">You haven't created any Picks or Classifieds. Click the Plus button below to create a Pick or Classified.</string>
<string name="NoAvatarPicksClassifiedsText">User has no picks or classifieds</string>
@@ -2292,6 +2444,7 @@ Requests name of an avatar. When data is available the dataserver event will be
<string name="GroupMoneyBalance">Balance</string>
<string name="GroupMoneyCredits">Credits</string>
<string name="GroupMoneyDebits">Debits</string>
+ <string name="GroupMoneyDate">[weekday,datetime,utc] [mth,datetime,utc] [day,datetime,utc], [year,datetime,utc]</string>
<!-- viewer object -->
<string name="ViewerObjectContents">Contents</string>
@@ -2321,9 +2474,6 @@ Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
<string name="accel-win-alt">Alt+</string>
<string name="accel-win-shift">Shift+</string>
- <string name="Esc">Esc</string>
- <string name="Home">Home</string>
-
<!-- Previews -->
<string name="FileSaved">File Saved</string>
<string name="Receiving">Receiving</string>
@@ -2335,16 +2485,16 @@ Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
<string name="PDT">PDT</string>
<!-- Directions, HUD -->
- <string name="Forward">Forward</string>
- <string name="Left">Left</string>
- <string name="Right">Right</string>
- <string name="Back">Back</string>
- <string name="North">North</string>
- <string name="South">South</string>
- <string name="West">West</string>
- <string name="East">East</string>
- <string name="Up">Up</string>
- <string name="Down">Down</string>
+ <string name="Direction_Forward">Forward</string>
+ <string name="Direction_Left">Left</string>
+ <string name="Direction_Right">Right</string>
+ <string name="Direction_Back">Back</string>
+ <string name="Direction_North">North</string>
+ <string name="Direction_South">South</string>
+ <string name="Direction_West">West</string>
+ <string name="Direction_East">East</string>
+ <string name="Direction_Up">Up</string>
+ <string name="Direction_Down">Down</string>
<!-- Search Category Strings -->
<string name="Any Category">Any Category</string>
@@ -2373,6 +2523,7 @@ Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
<!--<string name="Shopping">Shopping</string> -->
<string name="Stage">Stage</string>
<string name="Other">Other</string>
+ <string name="Rental">Rental</string>
<string name="Any">Any</string>
<string name="You">You</string>
@@ -2510,10 +2661,55 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="Bulbous">Bulbous</string>
<string name="Bulbous Nose">Bulbous Nose</string>
+<string name="Breast Physics Mass">Breast Mass</string>
+<string name="Breast Physics Smoothing">Breast Smoothing</string>
+<string name="Breast Physics Gravity">Breast Gravity</string>
+<string name="Breast Physics Drag">Breast Drag</string>
+
+<string name="Breast Physics InOut Max Effect">Max Effect</string>
+<string name="Breast Physics InOut Spring">Spring</string>
+<string name="Breast Physics InOut Gain">Gain</string>
+<string name="Breast Physics InOut Damping">Damping</string>
+
+<string name="Breast Physics UpDown Max Effect">Max Effect</string>
+<string name="Breast Physics UpDown Spring">Spring</string>
+<string name="Breast Physics UpDown Gain">Gain</string>
+<string name="Breast Physics UpDown Damping">Damping</string>
+
+<string name="Breast Physics LeftRight Max Effect">Max Effect</string>
+<string name="Breast Physics LeftRight Spring">Spring</string>
+<string name="Breast Physics LeftRight Gain">Gain</string>
+<string name="Breast Physics LeftRight Damping">Damping</string>
+
+<string name="Belly Physics Mass">Belly Mass</string>
+<string name="Belly Physics Smoothing">Belly Smoothing</string>
+<string name="Belly Physics Gravity">Belly Gravity</string>
+<string name="Belly Physics Drag">Belly Drag</string>
+
+<string name="Belly Physics UpDown Max Effect">Max Effect</string>
+<string name="Belly Physics UpDown Spring">Spring</string>
+<string name="Belly Physics UpDown Gain">Gain</string>
+<string name="Belly Physics UpDown Damping">Damping</string>
+
+<string name="Butt Physics Mass">Butt Mass</string>
+<string name="Butt Physics Smoothing">Butt Smoothing</string>
+<string name="Butt Physics Gravity">Butt Gravity</string>
+<string name="Butt Physics Drag">Butt Drag</string>
+
+<string name="Butt Physics UpDown Max Effect">Max Effect</string>
+<string name="Butt Physics UpDown Spring">Spring</string>
+<string name="Butt Physics UpDown Gain">Gain</string>
+<string name="Butt Physics UpDown Damping">Damping</string>
+
+<string name="Butt Physics LeftRight Max Effect">Max Effect</string>
+<string name="Butt Physics LeftRight Spring">Spring</string>
+<string name="Butt Physics LeftRight Gain">Gain</string>
+<string name="Butt Physics LeftRight Damping">Damping</string>
<string name="Bushy Eyebrows">Bushy Eyebrows</string>
<string name="Bushy Hair">Bushy Hair</string>
<string name="Butt Size">Butt Size</string>
+<string name="Butt Gravity">Butt Gravity</string>
<string name="bustle skirt">Bustle Skirt</string>
<string name="no bustle">No Bustle</string>
<string name="more bustle">More Bustle</string>
@@ -2997,6 +3193,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="LocationCtrlAdultIconTooltip">Adult Region</string>
<string name="LocationCtrlModerateIconTooltip">Moderate Region</string>
<string name="LocationCtrlGeneralIconTooltip">General Region</string>
+ <string name="LocationCtrlSeeAVsTooltip">Avatars visible and chat allowed outside of this parcel</string>
<!-- Strings used by the (currently Linux) auto-updater app -->
<string name="UpdaterWindowTitle">
@@ -3045,6 +3242,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="IM_to_label">To</string>
<string name="IM_moderator_label">(Moderator)</string>
<string name="Saved_message">(Saved [LONG_TIMESTAMP])</string>
+ <string name="IM_unblock_only_groups_friends">To see this message, you must uncheck &apos;Only friends and groups can call or IM me&apos; in Preferences/Privacy.</string>
<!-- voice calls -->
<string name="answered_call">Your call has been answered</string>
@@ -3094,7 +3292,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
You have blocked this Resident. Sending a message will automatically unblock them.
</string>
<!--Some times string name is getting from the body of server response.
- For ex.: from gIMMgr::showSessionStartError in the LLViewerChatterBoxSessionStartReply::post.
+ For ex.: from gIMMgr::showSessionStartError in the LLViewerChatterBoxSessionStartReply::post.
In case of the EXT-3115 issue 'generic' is passed into the gIMMgr::showSessionStartError as a string name.
Also there are some other places where "generic" is used.
So, let add string with name="generic" with the same value as "generic_request_error" -->
@@ -3120,7 +3318,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
You are not a session moderator.
</string>
<!--Some times string name is getting from the body of server response.
- For ex.: from gIMMgr::showSessionStartError in the LLViewerChatterBoxSessionStartReply::post.
+ For ex.: from gIMMgr::showSessionStartError in the LLViewerChatterBoxSessionStartReply::post.
In case of the EXT-3562 issue 'muted' is passed into the gIMMgr::showSessionStartError as a string name.
So, let add string with name="muted" with the same value as "muted_error" -->
<string name="muted">
@@ -3133,12 +3331,12 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
Unable to add users to chat session with [RECIPIENT].
</string>
<!--Some times string name is getting from the body of server response.
- For ex.: from gIMMgr::showSessionStartError in the LLViewerChatterBoxSessionStartReply::post.
+ For ex.: from gIMMgr::showSessionStartError in the LLViewerChatterBoxSessionStartReply::post.
In case of the EXT-3562 issue 'message' is passed into the gIMMgr::showSessionStartError as a string name.
So, let add string with name="message" with the same value as "message_session_event" -->
<string name="message">
Unable to send your message to the chat session with [RECIPIENT].
- </string>
+ </string>
<string name="message_session_event">
Unable to send your message to the chat session with [RECIPIENT].
</string>
@@ -3146,7 +3344,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
Error while moderating.
</string>
<!--Some times string name is getting from the body of server response.
- For ex.: from gIMMgr::showSessionStartError in the LLViewerChatterBoxSessionStartReply::post.
+ For ex.: from gIMMgr::showSessionStartError in the LLViewerChatterBoxSessionStartReply::post.
In case of the EXT-3459 issue 'removed' is passed into the gIMMgr::showSessionStartError as a string name.
So, let add string with name="removed" with the same value as "removed_from_group" -->
<string name="removed">
@@ -3167,7 +3365,9 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="session_initialization_timed_out_error">
The session initialization is timed out
</string>
-
+
+ <string name="Home position set.">Home position set.</string>
+
<string name="voice_morphing_url">http://secondlife.com/landing/voicemorphing</string>
<!-- Financial operations strings -->
@@ -3177,6 +3377,10 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="you_paid_ldollars_no_info">You paid L$[AMOUNT].</string>
<string name="you_paid_ldollars_no_reason">You paid [NAME] L$[AMOUNT].</string>
<string name="you_paid_ldollars_no_name">You paid L$[AMOUNT] [REASON].</string>
+ <string name="you_paid_failure_ldollars">You failed to pay [NAME] L$[AMOUNT] [REASON].</string>
+ <string name="you_paid_failure_ldollars_no_info">You failed to pay L$[AMOUNT].</string>
+ <string name="you_paid_failure_ldollars_no_reason">You failed to pay [NAME] L$[AMOUNT].</string>
+ <string name="you_paid_failure_ldollars_no_name">You failed to pay L$[AMOUNT] [REASON].</string>
<string name="for item">for [ITEM]</string>
<string name="for a parcel of land">for a parcel of land</string>
<string name="for a land access pass">for a land access pass</string>
@@ -3185,20 +3389,20 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="to join a group">to join a group</string>
<string name="to upload">to upload</string>
<string name="to publish a classified ad">to publish a classified ad</string>
-
+
<string name="giving">Giving L$ [AMOUNT]</string>
<string name="uploading_costs">Uploading costs L$ [AMOUNT]</string>
<string name="this_costs">This costs L$ [AMOUNT]</string>
<string name="buying_selected_land">Buying selected land for L$ [AMOUNT]</string>
<string name="this_object_costs">This object costs L$ [AMOUNT]</string>
-
+
<string name="group_role_everyone">Everyone</string>
<string name="group_role_officers">Officers</string>
<string name="group_role_owners">Owners</string>
<string name="group_member_status_online">Online</string>
<string name="uploading_abuse_report">Uploading...
-
+
Abuse Report</string>
<!-- names for new inventory items-->
@@ -3217,6 +3421,7 @@ Abuse Report</string>
<string name="New Skirt">New Skirt</string>
<string name="New Alpha">New Alpha</string>
<string name="New Tattoo">New Tattoo</string>
+ <string name="New Physics">New Physics</string>
<string name="Invalid Wearable">Invalid Wearable</string>
<string name="New Gesture">New Gesture</string>
<string name="New Script">New Script</string>
@@ -3261,25 +3466,53 @@ Abuse Report</string>
<string name="Female - Stick tougue out">Female - Stick tougue out</string>
<string name="Female - Wow">Female - Wow</string>
+ <string name="/bow">/bow</string>
+ <string name="/clap">/clap</string>
+ <string name="/count">/count</string>
+ <string name="/extinguish">/extinguish</string>
+ <string name="/kmb">/kmb</string>
+ <string name="/muscle">/muscle</string>
+ <string name="/no">/no</string>
+ <string name="/no!">/no!</string>
+ <string name="/paper">/paper</string>
+ <string name="/pointme">/pointme</string>
+ <string name="/pointyou">/pointyou</string>
+ <string name="/rock">/rock</string>
+ <string name="/scissor">/scissor</string>
+ <string name="/smoke">/smoke</string>
+ <string name="/stretch">/stretch</string>
+ <string name="/whistle">/whistle</string>
+ <string name="/yes">/yes</string>
+ <string name="/yes!">/yes!</string>
+ <string name="afk">afk</string>
+ <string name="dance1">dance1</string>
+ <string name="dance2">dance2</string>
+ <string name="dance3">dance3</string>
+ <string name="dance4">dance4</string>
+ <string name="dance5">dance5</string>
+ <string name="dance6">dance6</string>
+ <string name="dance7">dance7</string>
+ <string name="dance8">dance8</string>
+
<!-- birth date format shared by avatar inspector and profile panels -->
<string name="AvatarBirthDateFormat">[mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt]</string>
-
+
<string name="DefaultMimeType">none/none</string>
<string name="texture_load_dimensions_error">Can't load images larger than [WIDTH]*[HEIGHT]</string>
<!-- language specific white-space characters, delimiters, spacers, item separation symbols -->
<string name="sentences_separator" value=" "></string>
<string name="words_separator" value=", "/>
-
+
<string name="server_is_down">
Despite our best efforts, something unexpected has gone wrong.
- Please check status.secondlifegrid.net to see if there is a known problem with the service.
+ Please check status.secondlifegrid.net to see if there is a known problem with the service.
If you continue to experience problems, please check your network and firewall setup.
</string>
- <!-- overriding datetime formating.
- didn't translate if this is not needed for current localization
+ <!-- overriding datetime formating.
+ didn't translate if this is not needed for current localization
-->
<string name="dateTimeWeekdaysNames">Sunday:Monday:Tuesday:Wednesday:Thursday:Friday:Saturday</string>
<string name="dateTimeWeekdaysShortNames">Sun:Mon:Tue:Wed:Thu:Fri:Sat</string>
@@ -3313,4 +3546,215 @@ Abuse Report</string>
<string name="EmptyOutfitText">There are no items in this outfit</string>
+ <!-- External editor status codes -->
+ <string name="ExternalEditorNotSet">Select an editor using the ExternalEditor setting.</string>
+ <string name="ExternalEditorNotFound">Cannot find the external editor you specified.
+Try enclosing path to the editor with double quotes.
+(e.g. "/path to my/editor" "%s")</string>
+ <string name="ExternalEditorCommandParseError">Error parsing the external editor command.</string>
+ <string name="ExternalEditorFailedToRun">External editor failed to run.</string>
+
+ <!-- Machine translation of chat messahes -->
+ <string name="TranslationFailed">Translation failed: [REASON]</string>
+ <string name="TranslationResponseParseError">Error parsing translation response.</string>
+
+ <!-- Key names begin -->
+ <string name="Esc">Esc</string>
+ <string name="Space">Space</string>
+ <string name="Enter">Enter</string>
+ <string name="Tab">Tab</string>
+ <string name="Ins">Ins</string>
+ <string name="Del">Del</string>
+ <string name="Backsp">Backsp</string>
+ <string name="Shift">Shift</string>
+ <string name="Ctrl">Ctrl</string>
+ <string name="Alt">Alt</string>
+ <string name="CapsLock">CapsLock</string>
+ <string name="Left">Left</string>
+ <string name="Right">Right</string>
+ <string name="Up">Up</string>
+ <string name="Down">Down</string>
+ <string name="Home">Home</string>
+ <string name="End">End</string>
+ <string name="PgUp">PgUp</string>
+ <string name="PgDn">PgDn</string>
+
+ <string name="F1">F1</string>
+ <string name="F2">F2</string>
+ <string name="F3">F3</string>
+ <string name="F4">F4</string>
+ <string name="F5">F5</string>
+ <string name="F6">F6</string>
+ <string name="F7">F7</string>
+ <string name="F8">F8</string>
+ <string name="F9">F9</string>
+ <string name="F10">F10</string>
+ <string name="F11">F11</string>
+ <string name="F12">F12</string>
+
+ <string name="Add">Add</string>
+ <string name="Subtract">Subtract</string>
+ <string name="Multiply">Multiply</string>
+ <string name="Divide">Divide</string>
+ <string name="PAD_DIVIDE">PAD_DIVIDE</string>
+ <string name="PAD_LEFT">PAD_LEFT</string>
+ <string name="PAD_RIGHT">PAD_RIGHT</string>
+ <string name="PAD_DOWN">PAD_DOWN</string>
+ <string name="PAD_UP">PAD_UP</string>
+ <string name="PAD_HOME">PAD_HOME</string>
+ <string name="PAD_END">PAD_END</string>
+ <string name="PAD_PGUP">PAD_PGUP</string>
+ <string name="PAD_PGDN">PAD_PGDN</string>
+ <string name="PAD_CENTER">PAD_CENTER</string>
+ <string name="PAD_INS">PAD_INS</string>
+ <string name="PAD_DEL">PAD_DEL</string>
+ <string name="PAD_Enter">PAD_Enter</string>
+ <string name="PAD_BUTTON0">PAD_BUTTON0</string>
+ <string name="PAD_BUTTON1">PAD_BUTTON1</string>
+ <string name="PAD_BUTTON2">PAD_BUTTON2</string>
+ <string name="PAD_BUTTON3">PAD_BUTTON3</string>
+ <string name="PAD_BUTTON4">PAD_BUTTON4</string>
+ <string name="PAD_BUTTON5">PAD_BUTTON5</string>
+ <string name="PAD_BUTTON6">PAD_BUTTON6</string>
+ <string name="PAD_BUTTON7">PAD_BUTTON7</string>
+ <string name="PAD_BUTTON8">PAD_BUTTON8</string>
+ <string name="PAD_BUTTON9">PAD_BUTTON9</string>
+ <string name="PAD_BUTTON10">PAD_BUTTON10</string>
+ <string name="PAD_BUTTON11">PAD_BUTTON11</string>
+ <string name="PAD_BUTTON12">PAD_BUTTON12</string>
+ <string name="PAD_BUTTON13">PAD_BUTTON13</string>
+ <string name="PAD_BUTTON14">PAD_BUTTON14</string>
+ <string name="PAD_BUTTON15">PAD_BUTTON15</string>
+
+ <string name="-">-</string>
+ <string name="=">=</string>
+ <string name="`">`</string>
+ <string name=";">;</string>
+ <string name="[">[</string>
+ <string name="]">]</string>
+ <string name="\">\</string>
+
+ <string name="0">0</string>
+ <string name="1">1</string>
+ <string name="2">2</string>
+ <string name="3">3</string>
+ <string name="4">4</string>
+ <string name="5">5</string>
+ <string name="6">6</string>
+ <string name="7">7</string>
+ <string name="8">8</string>
+ <string name="9">9</string>
+
+ <string name="A">A</string>
+ <string name="B">B</string>
+ <string name="C">C</string>
+ <string name="D">D</string>
+ <string name="E">E</string>
+ <string name="F">F</string>
+ <string name="G">G</string>
+ <string name="H">H</string>
+ <string name="I">I</string>
+ <string name="J">J</string>
+ <string name="K">K</string>
+ <string name="L">L</string>
+ <string name="M">M</string>
+ <string name="N">N</string>
+ <string name="O">O</string>
+ <string name="P">P</string>
+ <string name="Q">Q</string>
+ <string name="R">R</string>
+ <string name="S">S</string>
+ <string name="T">T</string>
+ <string name="U">U</string>
+ <string name="V">V</string>
+ <string name="W">W</string>
+ <string name="X">X</string>
+ <string name="Y">Y</string>
+ <string name="Z">Z</string>
+ <!-- Key names end -->
+
+ <!-- llviewerwindow -->
+ <string name="BeaconParticle">Viewing particle beacons (blue)</string>
+ <string name="BeaconPhysical">Viewing physical object beacons (green)</string>
+ <string name="BeaconScripted">Viewing scripted object beacons (red)</string>
+ <string name="BeaconScriptedTouch">Viewing scripted object with touch function beacons (red)</string>
+ <string name="BeaconSound">Viewing sound beacons (yellow)</string>
+ <string name="BeaconMedia">Viewing media beacons (white)</string>
+ <string name="ParticleHiding">Hiding Particles</string>
+
+ <!-- commands -->
+
+ <string name="Command_AboutLand_Label">About land</string>
+ <string name="Command_Appearance_Label">Appearance</string>
+ <string name="Command_Avatar_Label">Avatar</string>
+ <string name="Command_Build_Label">Build</string>
+ <string name="Command_Chat_Label">Chat</string>
+ <string name="Command_Compass_Label">Compass</string>
+ <string name="Command_Destinations_Label">Destinations</string>
+ <string name="Command_Gestures_Label">Gestures</string>
+ <string name="Command_HowTo_Label">How to</string>
+ <string name="Command_Inventory_Label">Inventory</string>
+ <string name="Command_Map_Label">Map</string>
+ <string name="Command_Marketplace_Label">Marketplace</string>
+ <string name="Command_MiniMap_Label">Mini-map</string>
+ <string name="Command_Move_Label">Walk / run / fly</string>
+ <string name="Command_Outbox_Label">Merchant outbox</string>
+ <string name="Command_People_Label">People</string>
+ <string name="Command_Picks_Label">Picks</string>
+ <string name="Command_Places_Label">Places</string>
+ <string name="Command_Preferences_Label">Preferences</string>
+ <string name="Command_Profile_Label">Profile</string>
+ <string name="Command_Search_Label">Search</string>
+ <string name="Command_Snapshot_Label">Snapshot</string>
+ <string name="Command_Speak_Label">Speak</string>
+ <string name="Command_View_Label">Camera controls</string>
+ <string name="Command_Voice_Label">Voice settings</string>
+
+ <string name="Command_AboutLand_Tooltip">Information about the land you're visiting</string>
+ <string name="Command_Appearance_Tooltip">Change your avatar</string>
+ <string name="Command_Avatar_Tooltip">Choose a complete avatar</string>
+ <string name="Command_Build_Tooltip">Building objects and reshaping terrain</string>
+ <string name="Command_Chat_Tooltip">Chat with people nearby using text</string>
+ <string name="Command_Compass_Tooltip">Compass</string>
+ <string name="Command_Destinations_Tooltip">Destinations of interest</string>
+ <string name="Command_Gestures_Tooltip">Gestures for your avatar</string>
+ <string name="Command_HowTo_Tooltip">How to do common tasks</string>
+ <string name="Command_Inventory_Tooltip">View and use your belongings</string>
+ <string name="Command_Map_Tooltip">Map of the world</string>
+ <string name="Command_Marketplace_Tooltip">Go shopping</string>
+ <string name="Command_MiniMap_Tooltip">Show nearby people</string>
+ <string name="Command_Move_Tooltip">Moving your avatar</string>
+ <string name="Command_Outbox_Tooltip">Transfer items to your marketplace for sale</string>
+ <string name="Command_People_Tooltip">Friends, groups, and nearby people</string>
+ <string name="Command_Picks_Tooltip">Places to show as favorites in your profile</string>
+ <string name="Command_Places_Tooltip">Places you've saved</string>
+ <string name="Command_Preferences_Tooltip">Preferences</string>
+ <string name="Command_Profile_Tooltip">Edit or view your profile</string>
+ <string name="Command_Search_Tooltip">Find places, events, people</string>
+ <string name="Command_Snapshot_Tooltip">Take a picture</string>
+ <string name="Command_Speak_Tooltip">Speak with people nearby using your microphone</string>
+ <string name="Command_View_Tooltip">Changing camera angle</string>
+ <string name="Command_Voice_Tooltip">Volume controls for calls and people near you in world</string>
+
+ <string name="Toolbar_Bottom_Tooltip">currently in your bottom toolbar</string>
+ <string name="Toolbar_Left_Tooltip" >currently in your left toolbar</string>
+ <string name="Toolbar_Right_Tooltip" >currently in your right toolbar</string>
+
+ <!-- Mesh UI terms -->
+ <string name="Retain%">Retain%</string>
+ <string name="Detail">Detail</string>
+ <string name="Better Detail">Better Detail</string>
+ <string name="Surface">Surface</string>
+ <string name="Solid">Solid</string>
+ <string name="Wrap">Wrap</string>
+ <string name="Preview">Preview</string>
+ <string name="Normal">Normal</string>
+
+ <!-- Snapshot image quality levels -->
+ <string name="snapshot_quality_very_low">Very Low</string>
+ <string name="snapshot_quality_low">Low</string>
+ <string name="snapshot_quality_medium">Medium</string>
+ <string name="snapshot_quality_high">High</string>
+ <string name="snapshot_quality_very_high">Very High</string>
+
</strings>
diff --git a/indra/newview/skins/default/xui/en/teleport_strings.xml b/indra/newview/skins/default/xui/en/teleport_strings.xml
index bae821d3b5..dce6b8dd6d 100644
--- a/indra/newview/skins/default/xui/en/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/en/teleport_strings.xml
@@ -20,6 +20,10 @@ If you still cannot teleport, please log out and log back in to resolve the prob
Sorry, but system was unable to complete the teleport connection.
Try again in a moment.
</message>
+ <message name="NoHelpIslandTP">
+You cannot teleport back to Welcome Island.
+Go to &apos;Welcome Island Public&apos; to repeat the tutorial.
+ </message>
<message name="noaccess_tport">
Sorry, you do not have access to that teleport destination.
</message>
diff --git a/indra/newview/skins/default/xui/en/widgets/accordion.xml b/indra/newview/skins/default/xui/en/widgets/accordion.xml
index 1a66f0f5c5..55dde492ca 100644
--- a/indra/newview/skins/default/xui/en/widgets/accordion.xml
+++ b/indra/newview/skins/default/xui/en/widgets/accordion.xml
@@ -16,7 +16,7 @@
name="no_matched_tabs_msg"
v_pad="15"
width="200"
- wrap="true "/>
+ wrap="true"/>
<!-- This widget will not be created in viewer. Only its value will be used for empty accordion without filter. -->
<no_visible_tabs_text
name="no_visible_tabs_msg"
diff --git a/indra/newview/skins/default/xui/en/widgets/avatar_icon.xml b/indra/newview/skins/default/xui/en/widgets/avatar_icon.xml
index a35e2c3663..4d69dda7eb 100644
--- a/indra/newview/skins/default/xui/en/widgets/avatar_icon.xml
+++ b/indra/newview/skins/default/xui/en/widgets/avatar_icon.xml
@@ -1,4 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<avatar_icon default_icon_name="Generic_Person_Large">
+<avatar_icon
+ name="avatar_icon"
+ default_icon_name="Generic_Person_Large"
+ use_draw_context_alpha="false">
</avatar_icon>
diff --git a/indra/newview/skins/default/xui/en/widgets/avatar_list_item.xml b/indra/newview/skins/default/xui/en/widgets/avatar_list_item.xml
index 1bb3188cc8..8a4ccb19f9 100644
--- a/indra/newview/skins/default/xui/en/widgets/avatar_list_item.xml
+++ b/indra/newview/skins/default/xui/en/widgets/avatar_list_item.xml
@@ -17,13 +17,13 @@
<voice_call_invited_style
font="SansSerifSmall"
font.style="NORMAL"
- color="0.5 0.5 0.5 0.5"/>
+ color="AvatarListItemIconVoiceInvitedColor"/>
<!-- styles for avatar item JOINED to voice call -->
<voice_call_joined_style
font="SansSerifSmall"
font.style="NORMAL"
- color="white"/>
+ color="White"/>
<!-- styles for avatar item which HAS LEFT voice call -->
<voice_call_left_style
@@ -35,11 +35,11 @@
<online_style
font="SansSerifSmall"
font.style="NORMAL"
- color="white"/>
+ color="White"/>
<!-- styles for OFFLINE avatar item -->
<offline_style
font="SansSerifSmall"
font.style="NORMAL"
- color="0.5 0.5 0.5 1.0"/>
+ color="Gray"/>
</avatar_list_item>
diff --git a/indra/newview/skins/default/xui/en/widgets/badge.xml b/indra/newview/skins/default/xui/en/widgets/badge.xml
new file mode 100644
index 0000000000..738d150f64
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/badge.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<!-- Additional attributes:
+ -->
+<badge name="badge"
+ border_image="Badge_Border"
+ border_color="BadgeBorderColor"
+ font="SansSerifSmall"
+ image="Badge_Background"
+ image_color="BadgeImageColor"
+ label_color="BadgeLabelColor"
+ label_offset_horiz="0"
+ label_offset_vert="0"
+ location="top_left"
+ location_percent_hcenter="85"
+ location_percent_vcenter="85"
+ padding_horiz="7"
+ padding_vert="4"
+ requests_front="true"
+ mouse_opaque="false"
+ >
+</badge>
diff --git a/indra/newview/skins/default/xui/en/widgets/bodyparts_list_item.xml b/indra/newview/skins/default/xui/en/widgets/bodyparts_list_item.xml
index 0eec002006..0016a8cf53 100644
--- a/indra/newview/skins/default/xui/en/widgets/bodyparts_list_item.xml
+++ b/indra/newview/skins/default/xui/en/widgets/bodyparts_list_item.xml
@@ -24,7 +24,7 @@
parse_urls="false"
use_ellipses="true"
name="item_name"
- text_color="white"
+ text_color="White"
top="5"
value="..."
width="359" />
diff --git a/indra/newview/skins/default/xui/en/widgets/button.xml b/indra/newview/skins/default/xui/en/widgets/button.xml
index 2d0a1728d5..2b2c3faf91 100644
--- a/indra/newview/skins/default/xui/en/widgets/button.xml
+++ b/indra/newview/skins/default/xui/en/widgets/button.xml
@@ -15,14 +15,20 @@
label_color_selected="ButtonLabelSelectedColor"
label_color_disabled="ButtonLabelDisabledColor"
label_color_disabled_selected="ButtonLabelSelectedDisabledColor"
- highlight_color="ButtonUnselectedFgColor"
image_color="ButtonImageColor"
image_color_disabled="ButtonImageColor"
flash_color="ButtonFlashBgColor"
- font="SansSerifSmall"
+ font="SansSerifSmall"
hover_glow_amount="0.15"
halign="center"
- pad_bottom="3"
+ pad_bottom="1"
height="23"
- scale_image="true">
+ scale_image="true"
+ handle_right_mouse="true"
+ use_draw_context_alpha="true"
+ held_down_delay.seconds="0.5"
+ button_flash_count="8"
+ button_flash_rate="1.25"
+ display_pressed_state="true"
+ >
</button>
diff --git a/indra/newview/skins/default/xui/en/widgets/check_box.xml b/indra/newview/skins/default/xui/en/widgets/check_box.xml
index 7a60bee338..8947024e45 100644
--- a/indra/newview/skins/default/xui/en/widgets/check_box.xml
+++ b/indra/newview/skins/default/xui/en/widgets/check_box.xml
@@ -2,9 +2,17 @@
<check_box font="SansSerifSmall"
follows="left|top">
<check_box.label_text name="checkbox label"
+ left="20"
+ bottom="3"
+ width="0"
+ height="0"
text_color="LabelTextColor"
text_readonly_color="LabelDisabledColor"/>
<check_box.check_button name="CheckboxCtrl Button"
+ left="2"
+ bottom="1"
+ width="13"
+ height="13"
commit_on_return="false"
label=""
is_toggle="true"
diff --git a/indra/newview/skins/default/xui/en/widgets/chiclet_im_adhoc.xml b/indra/newview/skins/default/xui/en/widgets/chiclet_im_adhoc.xml
index 413ca1d1ef..0e29ed0d0b 100644
--- a/indra/newview/skins/default/xui/en/widgets/chiclet_im_adhoc.xml
+++ b/indra/newview/skins/default/xui/en/widgets/chiclet_im_adhoc.xml
@@ -12,13 +12,20 @@
tab_stop="false"
width="25" />
<chiclet_im_adhoc.speaker
- auto_update="true"
- draw_border="false"
- height="23"
- left="25"
- name="speaker"
- visible="false"
- width="20" />
+ image_mute="Parcel_VoiceNo_Light"
+ image_off="VoicePTT_Off_Dark"
+ image_on="VoicePTT_On_Dark"
+ image_level_1="VoicePTT_Lvl1_Dark"
+ image_level_2="VoicePTT_Lvl2_Dark"
+ image_level_3="VoicePTT_Lvl3_Dark"
+ auto_update="true"
+ draw_border="false"
+ height="24"
+ left="25"
+ bottom="1"
+ name="speaker"
+ visible="false"
+ width="20" />
<chiclet_im_adhoc.avatar_icon
bottom="3"
follows="left|top|bottom"
diff --git a/indra/newview/skins/default/xui/en/widgets/chiclet_im_group.xml b/indra/newview/skins/default/xui/en/widgets/chiclet_im_group.xml
index 372a89cbc7..77011139bf 100644
--- a/indra/newview/skins/default/xui/en/widgets/chiclet_im_group.xml
+++ b/indra/newview/skins/default/xui/en/widgets/chiclet_im_group.xml
@@ -12,13 +12,20 @@
tab_stop="false"
width="25" />
<chiclet_im_group.speaker
- auto_update="true"
- draw_border="false"
- height="25"
- left="25"
- name="speaker"
- visible="false"
- width="20" />
+ image_mute="Parcel_VoiceNo_Light"
+ image_off="VoicePTT_Off_Dark"
+ image_on="VoicePTT_On_Dark"
+ image_level_1="VoicePTT_Lvl1_Dark"
+ image_level_2="VoicePTT_Lvl2_Dark"
+ image_level_3="VoicePTT_Lvl3_Dark"
+ auto_update="true"
+ draw_border="false"
+ height="24"
+ left="25"
+ bottom="1"
+ name="speaker"
+ visible="false"
+ width="20" />
<chiclet_im_group.group_icon
bottom="3"
default_icon="Generic_Group"
diff --git a/indra/newview/skins/default/xui/en/widgets/chiclet_im_p2p.xml b/indra/newview/skins/default/xui/en/widgets/chiclet_im_p2p.xml
index 99807d4717..8b56a8f0f6 100644
--- a/indra/newview/skins/default/xui/en/widgets/chiclet_im_p2p.xml
+++ b/indra/newview/skins/default/xui/en/widgets/chiclet_im_p2p.xml
@@ -12,15 +12,23 @@
tab_stop="false"
width="25"/>
<chiclet_im_p2p.speaker
- auto_update="true"
- draw_border="false"
- height="23"
- left="25"
- name="speaker"
- visible="false"
- width="20" />
+ image_mute="Parcel_VoiceNo_Light"
+ image_off="VoicePTT_Off_Dark"
+ image_on="VoicePTT_On_Dark"
+ image_level_1="VoicePTT_Lvl1_Dark"
+ image_level_2="VoicePTT_Lvl2_Dark"
+ image_level_3="VoicePTT_Lvl3_Dark"
+ auto_update="true"
+ draw_border="false"
+ height="24"
+ left="25"
+ bottom="1"
+ name="speaker"
+ visible="false"
+ width="20" />
<chiclet_im_p2p.avatar_icon
bottom="3"
+ color="white"
follows="left|top|bottom"
height="20"
left="2"
diff --git a/indra/newview/skins/default/xui/en/widgets/clothing_list_item.xml b/indra/newview/skins/default/xui/en/widgets/clothing_list_item.xml
index 96d72c78a6..d83f44737e 100644
--- a/indra/newview/skins/default/xui/en/widgets/clothing_list_item.xml
+++ b/indra/newview/skins/default/xui/en/widgets/clothing_list_item.xml
@@ -24,7 +24,7 @@
parse_urls="false"
use_ellipses="true"
name="item_name"
- text_color="white"
+ text_color="White"
top="5"
value="..."
width="359" />
diff --git a/indra/newview/skins/default/xui/en/widgets/color_swatch.xml b/indra/newview/skins/default/xui/en/widgets/color_swatch.xml
index 48b987d7e8..ab3de1eaab 100644
--- a/indra/newview/skins/default/xui/en/widgets/color_swatch.xml
+++ b/indra/newview/skins/default/xui/en/widgets/color_swatch.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<color_swatch alpha_background_image="color_swatch_alpha.tga"
border_color="ColorSwatchBorderColor"
- name="color_swatch">
+ name="colorswatch">
<color_swatch.caption_text name="caption"
halign="center"
follows="left|right|bottom"
diff --git a/indra/newview/skins/default/xui/en/widgets/combo_box.xml b/indra/newview/skins/default/xui/en/widgets/combo_box.xml
index d1f68a9ef9..82d620d1e6 100644
--- a/indra/newview/skins/default/xui/en/widgets/combo_box.xml
+++ b/indra/newview/skins/default/xui/en/widgets/combo_box.xml
@@ -16,6 +16,9 @@
font="SansSerifSmall"
scale_image="true"
pad_right="24"
+ halign="left"
+ tab_stop="true"
+ follows="all"
image_unselected="DropDown_Off"
image_selected="DropDown_On"
image_pressed="DropDown_Press"
diff --git a/indra/newview/skins/default/xui/en/widgets/dummy_clothing_list_item.xml b/indra/newview/skins/default/xui/en/widgets/dummy_clothing_list_item.xml
index 6c60624805..8c805da048 100644
--- a/indra/newview/skins/default/xui/en/widgets/dummy_clothing_list_item.xml
+++ b/indra/newview/skins/default/xui/en/widgets/dummy_clothing_list_item.xml
@@ -9,7 +9,7 @@
width="380">
<item_icon
height="16"
- color="0.75 0.75 0.75 1"
+ color="LtGray"
follows="top|left"
image_name="Inv_Object"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/widgets/filter_editor.xml b/indra/newview/skins/default/xui/en/widgets/filter_editor.xml
index 0720621f0b..2cc4abdd30 100644
--- a/indra/newview/skins/default/xui/en/widgets/filter_editor.xml
+++ b/indra/newview/skins/default/xui/en/widgets/filter_editor.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<filter_editor
+ name="filter_editor"
clear_button_visible="true"
search_button_visible="false"
text_pad_left="7"
diff --git a/indra/newview/skins/default/xui/en/widgets/floater.xml b/indra/newview/skins/default/xui/en/widgets/floater.xml
index 85d0c633af..97a5ae7d4e 100644
--- a/indra/newview/skins/default/xui/en/widgets/floater.xml
+++ b/indra/newview/skins/default/xui/en/widgets/floater.xml
@@ -1,7 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<!-- See also settings.xml UIFloater* settings for configuration -->
-<floater
+<floater
name="floater"
+ positioning="none"
+ layout="topleft"
bg_opaque_color="FloaterFocusBackgroundColor"
bg_alpha_color="FloaterDefaultBackgroundColor"
bg_opaque_image="Window_Foreground"
@@ -21,4 +23,5 @@
tear_off_pressed_image="tearoff_pressed.tga"
dock_pressed_image="Icon_Dock_Press"
help_pressed_image="Icon_Help_Press"
+ focus_root="true"
/>
diff --git a/indra/newview/skins/default/xui/en/widgets/folder_view_item.xml b/indra/newview/skins/default/xui/en/widgets/folder_view_item.xml
index e6bdcccfdf..6fa74f403d 100644
--- a/indra/newview/skins/default/xui/en/widgets/folder_view_item.xml
+++ b/indra/newview/skins/default/xui/en/widgets/folder_view_item.xml
@@ -5,4 +5,6 @@
item_height="20"
item_top_pad="4"
selection_image="Rounded_Square"
+ mouse_opaque="true"
+ follows="left|top|right"
/>
diff --git a/indra/newview/skins/default/xui/en/widgets/group_icon.xml b/indra/newview/skins/default/xui/en/widgets/group_icon.xml
index 58d5e19fcc..36ee6dd7eb 100644
--- a/indra/newview/skins/default/xui/en/widgets/group_icon.xml
+++ b/indra/newview/skins/default/xui/en/widgets/group_icon.xml
@@ -2,4 +2,5 @@
<group_icon
default_icon_name="Generic_Group"
image_name="Generic_Group"
- name="group_icon" />
+ name="group_icon"
+ use_draw_context_alpha="false" />
diff --git a/indra/newview/skins/default/xui/en/widgets/icon.xml b/indra/newview/skins/default/xui/en/widgets/icon.xml
index adb743a628..cf8edfcedb 100644
--- a/indra/newview/skins/default/xui/en/widgets/icon.xml
+++ b/indra/newview/skins/default/xui/en/widgets/icon.xml
@@ -3,5 +3,6 @@
tab_stop="false"
mouse_opaque="false"
name="icon"
+ use_draw_context_alpha="true"
follows="left|top">
</icon>
diff --git a/indra/newview/skins/default/xui/en/widgets/inbox_folder_view_folder.xml b/indra/newview/skins/default/xui/en/widgets/inbox_folder_view_folder.xml
new file mode 100644
index 0000000000..77d8024cb2
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/inbox_folder_view_folder.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<inbox_folder_view_folder
+ folder_arrow_image="Folder_Arrow"
+ folder_indentation="8"
+ item_height="20"
+ item_top_pad="4"
+ selection_image="Rounded_Square"
+ >
+ <new_badge
+ label="New"
+ label_offset_horiz="-1"
+ location="right"
+ padding_horiz="12.5"
+ padding_vert="2"
+ location_offset_hcenter="-23"
+ border_image="New_Tag_Border"
+ border_color="DkGray2"
+ image="New_Tag_Background"
+ image_color="Black"
+ />
+</inbox_folder_view_folder>
diff --git a/indra/newview/skins/default/xui/en/widgets/inbox_folder_view_item.xml b/indra/newview/skins/default/xui/en/widgets/inbox_folder_view_item.xml
new file mode 100644
index 0000000000..7a7a6e9a09
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/inbox_folder_view_item.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<inbox_folder_view_item
+ item_height="20"
+ item_top_pad="4"
+ selection_image="Rounded_Square"
+ >
+ <new_badge
+ label="New"
+ label_offset_horiz="-1"
+ location="right"
+ padding_horiz="12.5"
+ padding_vert="2"
+ location_offset_hcenter="-23"
+ border_image="New_Tag_Border"
+ border_color="DkGray2"
+ image="New_Tag_Background"
+ image_color="Black"
+ />
+</inbox_folder_view_item>
diff --git a/indra/newview/skins/default/xui/en/widgets/inbox_inventory_panel.xml b/indra/newview/skins/default/xui/en/widgets/inbox_inventory_panel.xml
new file mode 100644
index 0000000000..830c27bdac
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/inbox_inventory_panel.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<inbox_inventory_panel show_load_status="false" />
diff --git a/indra/newview/skins/default/xui/en/widgets/inventory_panel.xml b/indra/newview/skins/default/xui/en/widgets/inventory_panel.xml
index 93875d66e6..eaf148c5e4 100644
--- a/indra/newview/skins/default/xui/en/widgets/inventory_panel.xml
+++ b/indra/newview/skins/default/xui/en/widgets/inventory_panel.xml
@@ -3,4 +3,13 @@
bg_opaque_color="InventoryBackgroundColor"
background_visible="true"
background_opaque="true"
- />
+ show_load_status="true"
+ accepts_drag_and_drop="true"
+ >
+ <scroll
+ name="Inventory Scroller"
+ follows="all"
+ reserve_scroll_corner="true"
+ tab_stop="true"
+ />
+</panel>
diff --git a/indra/newview/skins/default/xui/en/widgets/joystick_rotate.xml b/indra/newview/skins/default/xui/en/widgets/joystick_rotate.xml
new file mode 100644
index 0000000000..a190da3909
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/joystick_rotate.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<joystick_rotate
+ image_selected="Cam_Rotate_In"
+ image_unselected="Cam_Rotate_Out"
+ scale_image="false"
+ mouse_opaque="false"
+ held_down_delay.seconds="0"/>
diff --git a/indra/newview/skins/default/xui/en/widgets/layout_stack.xml b/indra/newview/skins/default/xui/en/widgets/layout_stack.xml
new file mode 100644
index 0000000000..48bcb46533
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/layout_stack.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<!-- Global settings for all widgets ("UI Controls") -->
+<!-- The params in this file aren't currently getting loaded in OSX -->
+<layout_stack name="stack"/>
diff --git a/indra/newview/skins/default/xui/en/widgets/loading_indicator.xml b/indra/newview/skins/default/xui/en/widgets/loading_indicator.xml
index 6040d24128..ea1d89c975 100644
--- a/indra/newview/skins/default/xui/en/widgets/loading_indicator.xml
+++ b/indra/newview/skins/default/xui/en/widgets/loading_indicator.xml
@@ -3,6 +3,20 @@
follows="left|top"
mouse_opaque="false"
name="loading_indicator"
- rotations_per_sec="1.0"
- tab_stop="false"
-/>
+ images_per_sec="1.0"
+ tab_stop="false">
+ <images>
+ <image name="Progress_1"/>
+ <image name="Progress_2"/>
+ <image name="Progress_3"/>
+ <image name="Progress_4"/>
+ <image name="Progress_5"/>
+ <image name="Progress_6"/>
+ <image name="Progress_7"/>
+ <image name="Progress_8"/>
+ <image name="Progress_9"/>
+ <image name="Progress_10"/>
+ <image name="Progress_11"/>
+ <image name="Progress_12"/>
+ </images>
+</loading_indicator> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/widgets/location_input.xml b/indra/newview/skins/default/xui/en/widgets/location_input.xml
index 37d60f1671..44436fb6f2 100644
--- a/indra/newview/skins/default/xui/en/widgets/location_input.xml
+++ b/indra/newview/skins/default/xui/en/widgets/location_input.xml
@@ -123,6 +123,14 @@
font="SansSerifSmall"
text_color="TextFgColor"
/>
+ <see_avatars_icon
+ name="see_avatars_icon"
+ width="22"
+ height="18"
+ top="21"
+ follows="right|top"
+ image_name="Parcel_SeeAVsOff_Light"
+ />
<combo_button
name="Location History"
label=""
diff --git a/indra/newview/skins/default/xui/en/widgets/menu.xml b/indra/newview/skins/default/xui/en/widgets/menu.xml
index 58543338f6..13ac84beb2 100644
--- a/indra/newview/skins/default/xui/en/widgets/menu.xml
+++ b/indra/newview/skins/default/xui/en/widgets/menu.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<menu bg_color="MenuDefaultBgColor"
+<menu name="menu"
+ bg_color="MenuDefaultBgColor"
bg_visible="true"
drop_shadow="true"
tear_off="false"
diff --git a/indra/newview/skins/default/xui/en/widgets/menu_bar.xml b/indra/newview/skins/default/xui/en/widgets/menu_bar.xml
new file mode 100644
index 0000000000..27efa72563
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/menu_bar.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<menu_bar
+ tear_off = "false"
+ keep_fixed_size = "true"
+ horizontal_layout = "true"
+ visible = "true"
+ drop_shadow = "false"/>
diff --git a/indra/newview/skins/default/xui/en/widgets/menu_item_separator.xml b/indra/newview/skins/default/xui/en/widgets/menu_item_separator.xml
index e5cea476da..7452d685eb 100644
--- a/indra/newview/skins/default/xui/en/widgets/menu_item_separator.xml
+++ b/indra/newview/skins/default/xui/en/widgets/menu_item_separator.xml
@@ -1,6 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<menu_item_separator enabled_color="MenuItemEnabledColor"
- disabled_color="MenuItemDisabledColor"
- highlight_bg_color="MenuItemHighlightBgColor"
- highlight_fg_color="MenuItemHighlightFgColor">
+ name="separator"
+ disabled_color="MenuItemDisabledColor"
+ highlight_bg_color="MenuItemHighlightBgColor"
+ highlight_fg_color="MenuItemHighlightFgColor"
+ label="-----------">
</menu_item_separator>
diff --git a/indra/newview/skins/default/xui/en/widgets/menu_item_tear_off.xml b/indra/newview/skins/default/xui/en/widgets/menu_item_tear_off.xml
index 185ed6ee3e..72af3924c1 100644
--- a/indra/newview/skins/default/xui/en/widgets/menu_item_tear_off.xml
+++ b/indra/newview/skins/default/xui/en/widgets/menu_item_tear_off.xml
@@ -1,7 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<!-- Use "disabled color" to make it look like menu separators -->
<menu_item_tear_off enabled_color="MenuItemDisabledColor"
- disabled_color="MenuItemDisabledColor"
- highlight_bg_color="MenuItemHighlightBgColor"
- highlight_fg_color="MenuItemHighlightFgColor">
-</menu_item_tear_off>
+ name="tear_off"
+ label = "~~~~~~~~~~~"
+ disabled_color="MenuItemDisabledColor"
+ highlight_bg_color="MenuItemHighlightBgColor"
+ highlight_fg_color="MenuItemHighlightFgColor"/>
diff --git a/indra/newview/skins/default/xui/en/widgets/multi_slider.xml b/indra/newview/skins/default/xui/en/widgets/multi_slider.xml
index e0900b48f3..90b0625982 100644
--- a/indra/newview/skins/default/xui/en/widgets/multi_slider.xml
+++ b/indra/newview/skins/default/xui/en/widgets/multi_slider.xml
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<multi_slider text_color="LabelTextColor"
- text_disabled_color="LabelDisabledColor"
- draw_track="true"
- use_triangle="false"
- font="SansSerifSmall"/>
+ mouse_opaque="true"
+ text_disabled_color="LabelDisabledColor"
+ draw_track="true"
+ use_triangle="false"
+ font="SansSerifSmall"/>
diff --git a/indra/newview/skins/default/xui/en/widgets/multi_slider_bar.xml b/indra/newview/skins/default/xui/en/widgets/multi_slider_bar.xml
index 04a2cd635c..bbcb008df4 100644
--- a/indra/newview/skins/default/xui/en/widgets/multi_slider_bar.xml
+++ b/indra/newview/skins/default/xui/en/widgets/multi_slider_bar.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<multi_slider_bar track_color="MultiSliderTrackColor"
+<multi_slider_bar name="multi_slider_bar"
+ track_color="MultiSliderTrackColor"
thumb_disabled_color="MultiSliderDisabledThumbColor"
thumb_outline_color="MultiSliderThumbOutlineColor"
thumb_center_color="MultiSliderThumbCenterColor"
@@ -7,4 +8,6 @@
triangle_color="MultiSliderTriangleColor"
draw_track="true"
use_triangle="false"
- thumb_width="8"/>
+ thumb_width="8"
+ mouse_opaque="true"
+ follows="left|top"/>
diff --git a/indra/newview/skins/default/xui/en/widgets/name_list.xml b/indra/newview/skins/default/xui/en/widgets/name_list.xml
new file mode 100644
index 0000000000..3ae0f68227
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/name_list.xml
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<name_list name="name_list"
+ />
diff --git a/indra/newview/skins/default/xui/en/widgets/outbox_folder_view_folder.xml b/indra/newview/skins/default/xui/en/widgets/outbox_folder_view_folder.xml
new file mode 100644
index 0000000000..d19c47f54f
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/outbox_folder_view_folder.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<outbox_folder_view_folder
+ folder_arrow_image="Folder_Arrow"
+ folder_indentation="8"
+ item_height="20"
+ item_top_pad="4"
+ selection_image="Rounded_Square"
+ >
+</outbox_folder_view_folder>
diff --git a/indra/newview/skins/default/xui/en/widgets/outbox_inventory_panel.xml b/indra/newview/skins/default/xui/en/widgets/outbox_inventory_panel.xml
new file mode 100644
index 0000000000..3964569da2
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/outbox_inventory_panel.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<outbox_inventory_panel show_empty_message="false" show_load_status="false" />
diff --git a/indra/newview/skins/default/xui/en/widgets/panel.xml b/indra/newview/skins/default/xui/en/widgets/panel.xml
index 9bf99fa363..b36f723831 100644
--- a/indra/newview/skins/default/xui/en/widgets/panel.xml
+++ b/indra/newview/skins/default/xui/en/widgets/panel.xml
@@ -4,10 +4,12 @@
bg_opaque_image - image name for "in-front" panel look
bg_alpha_image - image name for "in-back" or transparent panel look
-->
-<panel bg_opaque_color="PanelFocusBackgroundColor"
+<panel name="panel"
+ bg_opaque_color="PanelFocusBackgroundColor"
bg_alpha_color="PanelDefaultBackgroundColor"
bg_opaque_image_overlay="White"
bg_alpha_image_overlay="White"
background_visible="false"
background_opaque="false"
- chrome="false"/> \ No newline at end of file
+ chrome="false"
+ accepts_badge="true"/> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/widgets/radio_group.xml b/indra/newview/skins/default/xui/en/widgets/radio_group.xml
index ad7ef5bffc..ab3184d34b 100644
--- a/indra/newview/skins/default/xui/en/widgets/radio_group.xml
+++ b/indra/newview/skins/default/xui/en/widgets/radio_group.xml
@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<radio_group draw_border="false"
- name="radio_group"
+<radio_group name="radio_group"
mouse_opaque="false"
follows="left|top"
font="SansSerifSmall"/>
diff --git a/indra/newview/skins/default/xui/en/widgets/scroll_bar.xml b/indra/newview/skins/default/xui/en/widgets/scroll_bar.xml
index 830ea12e41..682dcf40d8 100644
--- a/indra/newview/skins/default/xui/en/widgets/scroll_bar.xml
+++ b/indra/newview/skins/default/xui/en/widgets/scroll_bar.xml
@@ -5,21 +5,26 @@
track_image_horizontal ="ScrollTrack_Horiz"
track_color="ScrollbarTrackColor"
thumb_color="ScrollbarThumbColor"
- thickness="15">
- <up_button image_unselected="ScrollArrow_Up"
+ thickness="15"
+ tab_stop="false">
+ <up_button name="up_button"
+ image_unselected="ScrollArrow_Up"
image_selected="ScrollArrow_Up"
scale_image="true"
hover_glow_amount="0.35"/>
- <down_button image_unselected="ScrollArrow_Down"
+ <down_button name="down_button"
+ image_unselected="ScrollArrow_Down"
image_selected="ScrollArrow_Down"
scale_image="true"
hover_glow_amount="0.35"/>
- <left_button image_unselected="ScrollArrow_Left"
+ <left_button name="left_button"
+ image_unselected="ScrollArrow_Left"
image_selected="ScrollArrow_Left"
scale_image="true"
hover_glow_amount="0.35"/>
- <right_button image_unselected="ScrollArrow_Right"
- image_selected="ScrollArrow_Right"
- scale_image="true"
- hover_glow_amount="0.35"/>
+ <right_button name="right_button"
+ image_unselected="ScrollArrow_Right"
+ image_selected="ScrollArrow_Right"
+ scale_image="true"
+ hover_glow_amount="0.35"/>
</scroll_bar>
diff --git a/indra/newview/skins/default/xui/en/widgets/scroll_column_header.xml b/indra/newview/skins/default/xui/en/widgets/scroll_column_header.xml
index f936a1e208..8a48fcb32d 100644
--- a/indra/newview/skins/default/xui/en/widgets/scroll_column_header.xml
+++ b/indra/newview/skins/default/xui/en/widgets/scroll_column_header.xml
@@ -1,11 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<scroll_column_header
- image_unselected="SegmentedBtn_Middle_Selected"
+<scroll_column_header name="column_header"
+ image_unselected="SegmentedBtn_Middle_Selected"
image_selected="SegmentedBtn_Middle_Selected"
- image_pressed="SegmentedBtn_Middle_Selected_Press"
+ image_pressed="SegmentedBtn_Middle_Selected_Press"
image_disabled="SegmentedBtn_Middle_Disabled"
image_disabled_selected="SegmentedBtn_Middle_Selected_Disabled"
image_overlay="DisclosureArrow_Opened_Off"
image_overlay_alignment="right"
halign="left"
+ tab_stop="false"
scale_image="true" />
diff --git a/indra/newview/skins/default/xui/en/widgets/scroll_container.xml b/indra/newview/skins/default/xui/en/widgets/scroll_container.xml
index 86356ff563..a6d096a964 100644
--- a/indra/newview/skins/default/xui/en/widgets/scroll_container.xml
+++ b/indra/newview/skins/default/xui/en/widgets/scroll_container.xml
@@ -1,5 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<scroll_container color="black"
+<scroll_container name="scroll_container"
+ color="black"
opaque="false"
min_auto_scroll_rate="120"
- max_auto_scroll_rate="500"/>
+ max_auto_scroll_rate="500"
+ tab_stop="false"
+ mouse_opaque="true" />
diff --git a/indra/newview/skins/default/xui/en/widgets/scroll_list.xml b/indra/newview/skins/default/xui/en/widgets/scroll_list.xml
index dd93675807..e43989c6c7 100644
--- a/indra/newview/skins/default/xui/en/widgets/scroll_list.xml
+++ b/indra/newview/skins/default/xui/en/widgets/scroll_list.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<scroll_list fg_unselected_color="ScrollUnselectedColor"
+<scroll_list name="scroll_list"
+ fg_unselected_color="ScrollUnselectedColor"
fg_selected_color="ScrollSelectedFGColor"
bg_selected_color="ScrollSelectedBGColor"
fg_disable_color="ScrollDisabledColor"
@@ -13,6 +14,7 @@
scroll_bar_bg_visible="false"
scroll_bar_bg_color="black"
mouse_wheel_opaque="false"
+ mouse_opaque="true"
background_visible="true"
heading_height="23"
draw_border="false"
diff --git a/indra/newview/skins/default/xui/en/widgets/scrolling_panel_list.xml b/indra/newview/skins/default/xui/en/widgets/scrolling_panel_list.xml
new file mode 100644
index 0000000000..40cbf5977a
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/scrolling_panel_list.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<scrolling_panel_list name="scrolling_panel_list"/> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/widgets/search_editor.xml b/indra/newview/skins/default/xui/en/widgets/search_editor.xml
index 32e443a058..faa0404b35 100644
--- a/indra/newview/skins/default/xui/en/widgets/search_editor.xml
+++ b/indra/newview/skins/default/xui/en/widgets/search_editor.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<search_editor
+ name="search_editor"
clear_button_visible="false"
search_button_visible="true"
text_pad_left="6"
diff --git a/indra/newview/skins/default/xui/en/widgets/sidetray_tab.xml b/indra/newview/skins/default/xui/en/widgets/sidetray_tab.xml
new file mode 100644
index 0000000000..aa8461d367
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/sidetray_tab.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<sidetray_tab
+ focus_root="true"
+ />
diff --git a/indra/newview/skins/default/xui/en/widgets/slider_bar.xml b/indra/newview/skins/default/xui/en/widgets/slider_bar.xml
index ea63cac790..0335213ed6 100644
--- a/indra/newview/skins/default/xui/en/widgets/slider_bar.xml
+++ b/indra/newview/skins/default/xui/en/widgets/slider_bar.xml
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<!--All horizontal sliders are configured to have no highlighted track. See EXT-5939. -->
-<slider_bar track_color="SliderTrackColor"
+<slider_bar follows="left|top"
+ track_color="SliderTrackColor"
thumb_outline_color="SliderThumbOutlineColor"
thumb_center_color="SliderThumbCenterColor"
thumb_image="SliderThumb_Off"
diff --git a/indra/newview/skins/default/xui/en/widgets/tab_container.xml b/indra/newview/skins/default/xui/en/widgets/tab_container.xml
index c37ead0be2..0586119681 100644
--- a/indra/newview/skins/default/xui/en/widgets/tab_container.xml
+++ b/indra/newview/skins/default/xui/en/widgets/tab_container.xml
@@ -3,13 +3,15 @@
label_pad_bottom - vertical padding under tab button labels
label_pad_left - padding to the left of tab button labels
-->
-<tab_container tab_min_width="60"
+<tab_container name="tab_container"
+ mouse_opaque="false"
+ tab_min_width="60"
tab_max_width="150"
use_custom_icon_ctrl="false"
halign="center"
font="SansSerifSmall"
tab_height="21"
- label_pad_bottom="2"
+ label_pad_bottom="1"
label_pad_left="4">
<!--
Possible additional attributes for tabs:
diff --git a/indra/newview/skins/default/xui/en/widgets/talk_button.xml b/indra/newview/skins/default/xui/en/widgets/talk_button.xml
index a7e271a1ff..d792e9f29c 100644
--- a/indra/newview/skins/default/xui/en/widgets/talk_button.xml
+++ b/indra/newview/skins/default/xui/en/widgets/talk_button.xml
@@ -23,11 +23,11 @@
bottom="0"
tab_stop="false"
is_toggle="true"
- image_selected="SegmentedBtn_Right_Selected_Press"
- image_unselected="SegmentedBtn_Right_Off"
- image_pressed="SegmentedBtn_Right_Press"
- image_pressed_selected="SegmentedBtn_Right_Selected_Press"
- image_overlay="Arrow_Small_Up"
+ image_disabled="ComboButton_UpOff"
+ image_unselected="ComboButton_UpOff"
+ image_selected="ComboButton_On"
+ image_pressed="ComboButton_UpSelected"
+ image_pressed_selected="ComboButton_Selected"
/>
<monitor
follows="right"
diff --git a/indra/newview/skins/default/xui/en/widgets/text_editor.xml b/indra/newview/skins/default/xui/en/widgets/text_editor.xml
index 0f7f50b312..100571cc01 100644
--- a/indra/newview/skins/default/xui/en/widgets/text_editor.xml
+++ b/indra/newview/skins/default/xui/en/widgets/text_editor.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<!-- Core parameters are in simple_text_editor.xml -->
<text_editor
+ name="text_editor"
parse_urls="false"
show_context_menu="true"/>
diff --git a/indra/newview/skins/default/xui/en/widgets/texture_picker.xml b/indra/newview/skins/default/xui/en/widgets/texture_picker.xml
index 757f0f49d1..ba2fdf4f1f 100644
--- a/indra/newview/skins/default/xui/en/widgets/texture_picker.xml
+++ b/indra/newview/skins/default/xui/en/widgets/texture_picker.xml
@@ -1,5 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<texture_picker border_color="DefaultHighlightLight">
+<texture_picker border_color="DefaultHighlightLight"
+ name="texture picker"
+ mouse_opaque="true"
+ follows="left|top"
+ >
<multiselect_text font="SansSerifSmall"/>
<caption_text text="Multiple"
halign="center"
diff --git a/indra/newview/skins/default/xui/en/widgets/time.xml b/indra/newview/skins/default/xui/en/widgets/time.xml
new file mode 100644
index 0000000000..b5bdd564a6
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/time.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<time text_enabled_color="LabelTextColor"
+ text_disabled_color="LabelDisabledColor"
+ font="SansSerifSmall"
+ label_width="40" >
+ <time.up_button name="SpinCtrl Up"
+ image_unselected="Stepper_Up_Off"
+ image_selected="Stepper_Up_Press"
+ tab_stop="false"
+ follows="left|bottom" />
+ <time.down_button name="SpinCtrl Down"
+ image_unselected="Stepper_Down_Off"
+ image_selected="Stepper_Down_Press"
+ tab_stop="false"
+ follows="left|bottom" />
+</time>
diff --git a/indra/newview/skins/default/xui/en/widgets/toolbar.xml b/indra/newview/skins/default/xui/en/widgets/toolbar.xml
new file mode 100644
index 0000000000..0aa478ace9
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/toolbar.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<toolbar pad_left="1"
+ pad_right="1"
+ pad_top="1"
+ pad_bottom="1"
+ pad_between="1"
+ min_girth="24"
+ mouse_opaque="false"
+ read_only="false">
+ <button_panel name="button_panel"
+ bg_opaque_image="Rounded_Rect"
+ background_visible="true"
+ bg_opaque_image_overlay="MouseGray"
+ background_opaque="true"/>
+ <button_icon_and_text imgoverlay_label_space="7"
+ label_color_selected="White"
+ halign="left"
+ image_pressed="PushButton_Press"
+ image_pressed_selected="PushButton_Selected_Press"
+ image_selected="PushButton_Selected_Press"
+ image_disabled_selected="PushButton_Selected_Disabled"
+ image_disabled="PushButton_Disabled"
+ button_width.min="70"
+ button_width.max="140"
+ desired_height="24"
+ pad_left="10"
+ pad_right="10"
+ follows="left|top"
+ chrome="true"
+ image_overlay_alignment="left"
+ use_ellipses="true"
+ auto_resize="true"
+ button_flash_count="99999"
+ button_flash_rate="1.0"
+ flash_color="EmphasisColor"/>
+ <button_icon pad_left="10"
+ pad_right="10"
+ image_bottom_pad="10"
+ image_top_pad="10"
+ image_pressed="PushButton_Press"
+ image_pressed_selected="PushButton_Selected_Press"
+ image_selected="PushButton_Selected_Press"
+ image_disabled_selected="PushButton_Selected_Disabled"
+ image_disabled="PushButton_Disabled"
+ desired_height="38"
+ button_width.min="38"
+ button_width.max="38"
+ follows="left|top"
+ label=""
+ halign="left"
+ chrome="true"
+ use_ellipses="true"
+ auto_resize="true"
+ button_flash_count="99999"
+ button_flash_rate="1.0"
+ flash_color="EmphasisColor"/>
+</toolbar>
diff --git a/indra/newview/skins/default/xui/en/widgets/view_border.xml b/indra/newview/skins/default/xui/en/widgets/view_border.xml
index 0b0a9beb95..bf40e3086b 100644
--- a/indra/newview/skins/default/xui/en/widgets/view_border.xml
+++ b/indra/newview/skins/default/xui/en/widgets/view_border.xml
@@ -1,8 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<view_border highlight_light_color="DefaultHighlightLight"
+<view_border name="view_border"
+ highlight_light_color="DefaultHighlightLight"
highlight_dark_color="DefaultHighlightDark"
shadow_light_color="DefaultShadowLight"
shadow_dark_color="DefaultShadowDark"
border_thickness="1"
border_style="line"
- bevel_style="out"/> \ No newline at end of file
+ bevel_style="out"
+ mouse_opaque="false"
+ follows="all"/> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/widgets/web_browser.xml b/indra/newview/skins/default/xui/en/widgets/web_browser.xml
index 118d63bbf0..676fafd828 100644
--- a/indra/newview/skins/default/xui/en/widgets/web_browser.xml
+++ b/indra/newview/skins/default/xui/en/widgets/web_browser.xml
@@ -1,2 +1,4 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<web_browser border_visible="true"/>
+<web_browser border_visible="true"
+ tab_stop="false"
+ />
diff --git a/indra/newview/skins/default/xui/en/widgets/window_shade.xml b/indra/newview/skins/default/xui/en/widgets/window_shade.xml
new file mode 100644
index 0000000000..23eb2f13fb
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/window_shade.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<window_shade shade_color="0 0 0 0.5"/>
diff --git a/indra/newview/skins/default/xui/es/floater_about.xml b/indra/newview/skins/default/xui/es/floater_about.xml
index bb845e1ee0..307b61133f 100644
--- a/indra/newview/skins/default/xui/es/floater_about.xml
+++ b/indra/newview/skins/default/xui/es/floater_about.xml
@@ -10,7 +10,7 @@
<floater.string name="AboutPosition">
Estás en la posición [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1], de [REGION], alojada en &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ([HOSTIP])
[SERVER_VERSION]
-[[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]]
+[SERVER_RELEASE_NOTES_URL]
</floater.string>
<floater.string name="AboutSystem">
CPU: [CPU]
@@ -37,45 +37,64 @@ Versión del servidor de voz: [VOICE_VERSION]
<floater.string name="AboutTraffic">
Paquetes perdidos: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
</floater.string>
+ <floater.string name="ErrorFetchingServerReleaseNotesURL">
+ Error al obtener la URL de las notas de la versión del servidor.
+ </floater.string>
<tab_container name="about_tab">
<panel label="Información" name="support_panel">
<button label="Copiar al portapapeles" name="copy_btn" width="165"/>
</panel>
<panel label="Créditos" name="credits_panel">
- <text_editor name="credits_editor">
- Te ofrecen Second Life Philip, Tessa, Andrew, Cory, Ian, James, Phoenix, Ryan, Haney, Dan, Char, Ben, John, Tanya, Eddie, Richard, Mitch, Doug, Eric, Frank, Bruce, Aaron, Peter, Alice, Charlie, Debra, Eileen, Helen, Janet, Steffan, Steve, Tom, Mark, Hunter, Xenon, Burgess, Bill, Jim, Lee, Hamlet, Daniel, Jeff, Todd, Sarah, Tim, Stephanie, Colin, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Jack, Vektor, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Jesse, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Yuko, Makiko, Thomas, Harry, Seth, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Brad, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, Beez, Milo, Hermia, Red, Thrax, Gulliver, Joe, Sally, Paul, Jose, Rejean, Dore, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, Dustin, George, Del, Matthew, Cat, Jacqui, Adrian, Viola, Alfred, Noel, Irfan, Yool, Rika, Jane, Frontier, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Jeremy, JP, Jake, Anthony, Maurice, Madhavi, Leopard, Kyle, Joon, Bert, Belinda, Jon, Kristi, Bridie, Pramod, Socrates, Maria, Aric, Adreanne, Jay, Kari, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Colossus, Zen, BigPapi, Pastrami, Kurz, Mani, Neuro, Mel, Sardonyx, MJ, Rowan, Sgt, Elvis, Samuel, Leo, Bryan, Niko, Austin, Soft, Poppy, Rachel, Aki, Banzai, Alexa, Sue, Bender, CG, Angelo, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Rothman, Niall, Marin, Allison, Katie, Dawn, Dusty, Katt, Judy, Andrea, Ambroff, Infinity, Rico, Gail, Kalpana, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Maestro, Simone, Yang, T, Shannon, Nelson, Khanh, Scott, Courtney, Charlene, Quixote, Susan, Zed, Amanda, Katelin, Enkidu, Roxie, Esbee, JoRoan, Scarlet, Tay, Kevin, Wolfgang, Johnny, Ray, Andren, Merov, Bob, Rand, Howard, Callen, Heff, Galen, Newell, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl, Ashley, JessieAnn, Huseby, Karina, Paris, Kurt, Rick, Lis, Kotler, Theeba, Lynx, Murphy, Doten, Taka, Norm, Jillian, Marcus, Mae, Novack, Esther, Perry, Dana, Ducot, Javier, Porter, Madison, Gecko, Dough, JR, Gisele, Crimp, Norie, Arch, Kimi, Fisher, Barbara, Jason, Peggy, Bernard, Jules, Leroy, Eva, Khederian, Campbell, Vogt, Masido, Karel, Torres, Lo, Breezer, Delby, Rountree, Anna, Servus, Rue, Itiaes, Chuck, Luna, Novella, Zaza, Wen, Gino, Lex, Cassandra, Limey, Nancy, Anukul, Silver, Brodesky, Jinsai, Squid, Gez, Rakesh, Ladan, Edelman, Marcet, Squire, Tatem, Tony, Jerm, Tia, Falcon, BK, Tiggs, Driscoll, Bacon, Timothee, Cru, Carmilla, Coyot, Webb, Kazu, Rudas, LJ, Sea, Ali Wallace, Bewest, Pup, Drub, Dragon, Inoshiro, Byron, Rhett, Xandix, Aimee, Fredrik, Thor, Teddy, Baron, Nelly, Ghengis, Epic, Eli, Stone, Grapes, Irie, Prep, Scobu, Valerie, Alain, y muchos otros.
-
-Gracias a estos Residentes por ayudarnos a estar seguros de que, con todo, esta es la mejor versión: Drew Dwi, Zai Lynch, Latif Khalifa, Ellla McMahon, Harleen Gretzky, Squirrel Wood, Malarthi Behemoth, Dante Tucker, Buckaroo Mu, Eddi Decosta, Dirk Talamasca, Torben Trautman, Irene Muni, Aralara Rajal, Aura Dirval, Cayu Cluny, Eva Rau, FreeSL Aeon, Frontera Thor, Inma Rau, Lunita Savira, Minerva Memel, Polo Gufler, Xiki Luik, Lilly Zenovka, Vick Forcella, Sasy Scarborough, Gentle Welinder, Elric Anatine, Techwolf Lupindo, Dusan Writer, WolfPup Lowenhar, Marianne McCann, Fiachra Lach, Sitearm Madonna, Sudane Erato, Sahkolihaa Contepomi, Sachi Vixen, Questar Utu, Dimitrio Lewis, Matto Destiny, Scrim Pinion, Radio Signals, Psi Merlin, Pixel Gausman, Mel Vanbeeck, Laurent Bechir, Lamorna Proctor, Lares Carter, Gwyneth Llewelyn, Hydra Shaftoe, Holger Gilruth, Gentle Heron, Carla Broek, Boroondas Gupte, Fury Rosewood, Flower Ducatillon, Colpo Wexler, gwampa Lomu, Borg Capalini, Beansy Twine, Ardy Lay, 45ms Zhong, Adeon Writer, Aeonix Aeon, Ai Austin, Aiko Ying, Alexandrea Fride, Alliez Mysterio, Annie Milestone, Annika Genezzia, Ansariel Hiller, ArminasX Saiman, Arya Braveheart, Asaeda Meltingdots, Asturkon Jua, Avallyn Oakleaf, Avatar Quinzet, BabyA Littlething, Bacchus Ireto, Bazaar, Riva, Benjamin Bigdipper, Beth Walcher, Bezilon Kasei, Biancaluce Robbiani, Bill Walach, blakopal Galicia, Blitzckreed Levenque, Bryn Oh, Callipygian Christensen, Cap Carver, Carr Arbenlow, Chantal Harvey, Charles Courtois, Charlie Sazaland, Cherry Cheevers, ChickyBabes Zuzu, Christopher Organiser, Ciaran Laval, Clara Young, Celierra Darling, Corinne Helendale, Corro Moseley, Coughdrop Littlething, Darien Caldwell, Dartagan Shepherd, Debs Regent, Decro Schmooz, Denim Kamachi, DiJodi Dubratt, Dil Spitz, Edgware Marker, Egehan Dryke, Emma Portilo, Emmie Fairymeadow, Evangelista Emerald, Faelon Swordthain, Frenchimmo Sabra, Gaberoonie Zanzibar, Ganymedes Costagravas, Gene Frostbite, GeneJ Composer, Giggles Littlebird, Grady Echegaray, Guni Greenstein, Gypsy Tripsa, Hackshaven Harford, Ham Rambler, Han Shuffle, Hanglow Short, Hatzfeld Runo, herina Bode, Horatio Freund, Hypatia Callisto, Hypatia Pickens, Identity Euler, Imnotgoing Sideways, Innula Zenovka, Iyoba Tarantal, Jack Abraham, Jagga Meredith, Jennifer Boyle, Jeremy Marquez, Jessica Qin, Jinx Nordberg, Jo Bernandes, Jocial Sonnenkern, Joel Savard, Jondan Lundquist, Josef Munster, Josette Windlow, Juilan Tripsa, Juro Kothari, Justin RiversRunRed, Kagehi Kohn, Kaimen Takahe, Keklily Longfall, Ken Lavender, Kestral Karas, Khisme Nitely, Kimar Coba, Kithrak Kirkorian, Kitty Barnett, Kolor Fall, Komiko Okamoto, Korvel Noh, Larry Pixel, Leal Choche, len Starship, Lenae Munz, Lexi Frua, Lillie Cordeaux, Lizzy Macarthur, LSL Scientist, Luban Yiyuan, Luc Starsider, Maccus McCullough, Madison Blanc, Maggie Darwin, Mallory Destiny, Manx Wharton, Marc Claridge, Marc2 Sands, Matthew Anthony, Maxim RiversRunRed, Medhue Simoni, Melinda Latynina, Mencius Watts, Michi Lumin, Midian Farspire, Miles Glaz, Mindy Mathy, Mitch Wagner, Mo Hax, Mourna Biziou, Nao Noe, naofan Teardrop, Naomah Beaumont, Nathiel Siamendes, Nber Medici, Neko Link, Netpat Igaly, Neutron Chesnokov, Newfie Pendragon, Nicholai Laviscu, Nick Rhodes, Nicoladie Gymnast, Ollie Kubrick, Orenj Marat, Orion Delphis, Oryx Tempel, Parvati Silverweb, PeterPunk Mooney, Pixel Scientist, Pounce Teazle, Professor Noarlunga, Quantum Destiny, Quicksilver Hermes, Ralf Setsuko, RAT Quan, RedMokum Bravin, Revolution Perenti, Rezit Sideways, Rich Grainger, Rosco Teardrop, Rose Evans, Rudee Voom, RufusTT Horsefly, Saii Hallard, SaintLEOlions Zimer, Samm Larkham, Satanello Miami, SexySteven Morrisey, Sheet Spotter, Shnurui Troughton, sicarius Thorne, Sicarius Toxx, Sini Nubalo, SLB Wirefly, snowy Sidran, Soupa Segura, ST Mensing, Starshine Halasy, Stickman Ingmann, Synystyr Texan, Takeda Terrawyng, Tali Rosca, Templar Merlin, Tezcatlipoca Bisiani, Tiel Stonecutter, Tony Kembia, TouchaHoney Perhaps, Trey Reanimator, TriloByte Zanzibar, Trinity Dechou, Trinity Dejavu, Unlikely Quintessa, UsikuFarasi Kanarik, Veritas Raymaker, Vex Streeter, Viaticus Speculaas, Villain Baroque, Vixie Durant, Void Singer, Watty Berkson, Westley Schridde, Westley Streeter, Whimsy Winx, Winter Ventura, Wundur Primbee, xstorm Radek, YongYong Francois, Zak Westminster, Zana Kohime, Zaren Alexander, Zeja Pyle, ZenMondo Wormser, Zoex Flanagan, y muchos otros.
-
-
-
-
-&quot;El trabajo sigue avanzando, la causa perdura, la esperanza aún vive, y los sueños no morirán jamás&quot; - Edward Kennedy
+ <text name="linden_intro">
+ Second Life ofrecido por los Lindens:
+ </text>
+ <text_editor name="linden_names">
+ Philip, Andrew, Doug, Richard, Phoenix, Ian, Mark, Robin, Dan, Char, Ryan, Eric, Jim, Lee, Jeff, Michael, Kelly, Steve, Catherine, Bub, Ramzi, Jill, Jeska, Don, Kona, Callum, Charity, Jack, Shawn, babbage, James, Lauren, Blue, Brent, Reuben, Pathfinder, Jesse, Patsy, Torley, Bo, Cyn, Jonathan, Gia, Annette, Ginsu, Harry, Lex, Runitai, Guy, Cornelius, Beth, Swiss, Thumper, Wendy, Teeple, Seth, Dee, Mia, Sally, Liana, Aura, Beez, Milo, Red, Gulliver, Marius, Joe, Jose, Dore, Justin, Nora, Morpheus, Lexie, Amber, Chris, Xan, Leyla, Walker, Sabin, Joshua, Hiromi, Tofu, Fritz, June, Jean, Ivy, Dez, Ken, Betsy, Which, Spike, Rob, Zee, Dustin, George, Claudia, del, Matthew, jane, jay, Adrian, Yool, Rika, Yoz, siobhan, Qarl, Benjamin, Beast, Everett, madhavi, Christopher, Izzy, stephany, Jeremy, sean, adreanne, Pramod, Tobin, sejong, Iridium, maurice, kj, Meta, kari, JP, bert, kyle, Jon, Socrates, Bridie, Ivan, maria, Aric, Coco, Periapse, sandy, Storrs, Lotte, Colossus, Brad, Pastrami, Zen, BigPapi, Banzai, Sardonyx, Mani, Garry, Jaime, Neuro, Samuel, Niko, CeeLo, Austin, Soft, Poppy, emma, tessa, angelo, kurz, alexa, Sue, CG, Blake, Erica, Brett, Bevis, kristen, Q, simon, Enus, MJ, laurap, Kip, Scouse, Ron, Ram, kend, Marty, Prospero, melissa, kraft, Nat, Seraph, Hamilton, Lordan, Green, miz, Ashlei, Trinity, Ekim, Echo, Charlie, Rowan, Rome, Jt, Doris, benoc, Christy, Bao, Kate, Tj, Patch, Cheah, Johan, Brandy, Angela, Oreh, Cogsworth, Lan, Mitchell, Space, Bambers, Einstein, Bender, Malbers, Matias, Maggie, Rothman, Milton, Niall, Marin, Allison, Mango, Andrea, Katt, Yi, Ambroff, Rico, Raymond, Gail, Christa, William, Dawn, Usi, Dynamike, M, Corr, Dante, Molly, kaylee, Danica, Kelv, Lil, jacob, Nya, Rodney, elsie, Blondin, Grant, Nyx, Devin, Monty, Minerva, Keira, Katie, Jenn, Makai, Clare, Joy, Cody, Gayathri, FJ, spider, Oskar, Landon, Jarv, Noelle, Al, Doc, Gray, Vir, t, Maestro, Simone, Shannon, yang, Courtney, Scott, charlene, Quixote, Susan, Zed, Amanda, Katelin, Esbee, JoRoan, Enkidu, roxie, Scarlet, Merov, Kevin, Judy, Rand, Newell, Les, Dessie, Galen, Michon, Geo, Siz, Calyle, Pete, Praveen, Callen, Sheldon, Pink, Nelson, jenelle, Terrence, Nathan, Juan, Sascha, Huseby, Karina, Kaye, Kotler, Lis, Darv, Charrell, Dakota, Kimmora, Theeba, Taka, Mae, Perry, Ducot, dana, Esther, Dough, gisele, Doten, Viale, Fisher, jessieann, ashley, Torres, delby, rountree, kurt, Slaton, Madison, Rue, Gino, Wen, Casssandra, Brodesky, Squid, Gez, Rakesh, Gecko, Ladan, Tony, Tatem, Squire, Falcon, BK, Crimp, Tiggs, Bacon, Coyot, Carmilla, Webb, Sea, Arch, Jillian, Jason, Bernard, Vogt, Peggy, dragon, Pup, xandix, Wallace, Bewest, Inoshiro, Rhett, AG, Aimee, Ghengis, Itiaes, Eli, Steffan, Epic, Grapes, Stone, Prep, Scobu, Robert, Alain, Carla, Vicky, Tia, Alec, Taras, Lisa, Oz, Ariane, Log, House, Kazu, Kim, Drofnas, Tyler, Campbell, Michele, Madeline, Nelly, Baron, Thor, Lori, Hele, Fredrik, Teddy, Pixie, Berry, Gabrielle, Alfonso, Brooke, Wolf, Ringo, Cru, Charlar, Rodvik, Gibson, Elise, Bagman, Greger, Leonidas, Jerm, Leslie, CB, Brenda, Durian, Carlo, mm, Zeeshan, Caleb, Max, Elikak, Mercille, Steph, Chase
+ </text_editor>
+ <text name="contrib_intro">
+ con contribuciones de código abierto de:
+ </text>
+ <text_editor name="contrib_names">
+ Dummy Name sustituido durante la ejecución
+ </text_editor>
+ <text name="trans_intro">
+ y traducido por:
+ </text>
+ <text_editor name="trans_names">
+ Dummy Name sustituido durante la ejecución
</text_editor>
</panel>
<panel label="Licencias" name="licenses_panel">
<text_editor name="credits_editor">
3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion
- APR Copyright (C) 2000-2004 The Apache Software Foundation
- cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)
- DBus/dbus-glib Copyright (C) 2002, 2003 CodeFactory AB / Copyright (C) 2003, 2004 Red Hat, Inc.
- expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.
- FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org).
- GL Copyright (C) 1999-2004 Brian Paul.
- Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.
- jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)
- jpeglib Copyright (C) 1991-1998, Thomas G. Lane.
- ogg/vorbis Copyright (C) 2001, Xiphophorus
- OpenSSL Copyright (C) 1998-2002 The OpenSSL Project.
- SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
- SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
- xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
- zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler.
- google-perftools Copyright (c) 2005, Google Inc.
-
- All rights reserved. See licenses.txt for details.
+ APR Copyright (C) 2000-2004 The Apache Software Foundation
+ Collada DOM Copyright 2005 Sony Computer Entertainment Inc.
+ cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)
+ DBus/dbus-glib Copyright (C) 2002, 2003 CodeFactory AB / Copyright (C) 2003, 2004 Red Hat, Inc.
+ expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.
+ FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org).
+ GL Copyright (C) 1999-2004 Brian Paul.
+ GLOD Copyright (C) 2003-04 Jonathan Cohen, Nat Duca, Chris Niski, Johns Hopkins University and David Luebke, Brenden Schubert, University of Virginia.
+ google-perftools Copyright (c) 2005, Google Inc.
+ Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.
+ jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)
+ jpeglib Copyright (C) 1991-1998, Thomas G. Lane.
+ ogg/vorbis Copyright (C) 2001, Xiphophorus
+ OpenSSL Copyright (C) 1998-2002 The OpenSSL Project.
+ PCRE Copyright (c) 1997-2008 University of Cambridge
+ SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
+ SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+ xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
+ zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler.
+ google-perftools Copyright (c) 2005, Google Inc.
+
+ El visor de Second Life usa Havok (TM) Physics. (c)Copyright 1999-2010 Havok.com Inc. (y sus licenciadores). Reservados todos los derechos. Vea los detalles en www.havok.com.
+
+ Este software contiene código fuente suministrado por NVIDIA Corporation.
+
+ Reservados todos los derechos. Consulte los detalles en licenses.txt.
- Voice chat Audio coding: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
+ Codificación del audio del chat de voz: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
</text_editor>
</panel>
</tab_container>
diff --git a/indra/newview/skins/default/xui/es/floater_about_land.xml b/indra/newview/skins/default/xui/es/floater_about_land.xml
index be5b5d011c..fd54d74af2 100644
--- a/indra/newview/skins/default/xui/es/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/es/floater_about_land.xml
@@ -82,20 +82,14 @@ Vaya al menú Mundo &gt; Acerca del terreno o seleccione otra parcela para ver s
Calificación:
</text>
<text name="ContentRatingText">
- &apos;Adult&apos;
+ Adulto
</text>
<text name="Owner:">
Propietario:
</text>
- <text name="OwnerText">
- Leyla Linden
- </text>
<text name="Group:">
Grupo:
</text>
- <text name="GroupText">
- Leyla Linden
- </text>
<button label="Configurar" name="Set..."/>
<check_box label="Permitir transferir al grupo" name="check deed" tool_tip="Un oficial del grupo puede transferir este terreno al grupo. El terreno será apoyado por el grupo en sus asignaciones de terreno."/>
<button label="Transferir" name="Deed..." tool_tip="Sólo si es usted un oficial del grupo seleccionado puede transferir terreno."/>
@@ -113,13 +107,13 @@ Vaya al menú Mundo &gt; Acerca del terreno o seleccione otra parcela para ver s
<text name="For sale to">
En venta a: [BUYER]
</text>
- <text name="Sell with landowners objects in parcel." width="216">
- Los objetos se incluyen en la venta.
+ <text name="Sell with landowners objects in parcel.">
+ Objetos incluidos en la venta
</text>
- <text name="Selling with no objects in parcel." width="216">
+ <text name="Selling with no objects in parcel.">
Los objetos no se incluyen en la venta.
</text>
- <button bottom="-245" font="SansSerifSmall" label="Cancelar la venta del terreno" label_selected="Cancelar la venta del terreno" left="275" name="Cancel Land Sale"/>
+ <button label="Cancelar la venta del terreno" label_selected="Cancelar la venta del terreno" name="Cancel Land Sale"/>
<text name="Claimed:">
Reclamada:
</text>
@@ -136,15 +130,15 @@ Vaya al menú Mundo &gt; Acerca del terreno o seleccione otra parcela para ver s
Tráfico:
</text>
<text name="DwellText">
- 0
+ Cargando...
</text>
<button label="Comprar terreno" left="130" name="Buy Land..." width="125"/>
- <button label="Información del script" name="Scripts..."/>
+ <button label="Venta Linden" name="Linden Sale..." tool_tip="El terreno debe estar en propiedad, con contenido, y no estar en subasta."/>
+ <button label="Información de scripts" name="Scripts..."/>
<button label="Comprar para el grupo" name="Buy For Group..."/>
<button label="Comprar un pase" left="130" name="Buy Pass..." tool_tip="Un pase le da acceso temporal a este terreno." width="125"/>
<button label="Abandonar el terreno" name="Abandon Land..."/>
<button label="Reclamar el terreno" name="Reclaim Land..."/>
- <button label="Venta Linden" name="Linden Sale..." tool_tip="El terreno debe estar en propiedad, con contenido, y no estar en subasta."/>
</panel>
<panel label="CONTRATO" name="land_covenant_panel">
<panel.string name="can_resell">
@@ -193,7 +187,7 @@ Vaya al menú Mundo &gt; Acerca del terreno o seleccione otra parcela para ver s
Calificación:
</text>
<text name="region_maturity_text">
- &apos;Adult&apos;
+ Adulto
</text>
<text name="resellable_lbl">
Revender:
@@ -219,19 +213,19 @@ Vaya al menú Mundo &gt; Acerca del terreno o seleccione otra parcela para ver s
Plus de objetos en la región: [BONUS]
</text>
<text name="Simulator primitive usage:">
- Uso de primitivas:
+ Capacidad de la región:
</text>
- <text name="objects_available">
+ <text name="objects_available">
[COUNT] de un máx. de [MAX] ([AVAILABLE] disponibles)
</text>
<text name="Primitives parcel supports:">
- Prims que admite la parcela:
+ Capacidad del terreno de la parcela:
</text>
<text name="object_contrib_text">
[COUNT]
</text>
<text name="Primitives on parcel:">
- Prims en la parcela:
+ Impacto en el terreno de la parcela:
</text>
<text name="total_objects_text">
[COUNT]
@@ -294,16 +288,16 @@ Sólo las parcelas más grandes pueden listarse en la búsqueda.
Esta opción no esta activada porque usted no puede modificar las opciones de la parcela.
</panel.string>
<panel.string name="mature_check_mature">
- Contenido &apos;Mature&apos;
+ Contenido Moderado
</panel.string>
<panel.string name="mature_check_adult">
- Contenido &apos;Adult&apos;
+ Contenido Adulto
</panel.string>
<panel.string name="mature_check_mature_tooltip">
- La información o el contenido de su parcela se considera &apos;Mature&apos;.
+ La información o el contenido de su parcela se considera Moderado.
</panel.string>
<panel.string name="mature_check_adult_tooltip">
- La información o el contenido de su parcela se considera &apos;Adult&apos;.
+ La información o el contenido de su parcela se considera Adulto.
</panel.string>
<panel.string name="landing_point_none">
(ninguno)
@@ -314,11 +308,16 @@ Sólo las parcelas más grandes pueden listarse en la búsqueda.
<panel.string name="push_restrict_region_text">
Sin &apos;empujones&apos; (prevalece lo marcado en la región)
</panel.string>
+ <panel.string name="see_avs_text">
+ Los avatares de otras parcelas pueden ver
+ </panel.string>
<text name="allow_label">
Permitir a otros Residentes:
</text>
- <check_box label="Editar el terreno" name="edit land check" tool_tip="Si se marca, cualquiera podrá modificar su terreno. Mejor dejarlo desmarcado, pues usted siempre puede modificar su terreno."/>
- <check_box label="Volar" name="check fly" tool_tip="Si se marca, los residentes podrán volar en su terreno. Si no, sólo podrán volar al cruzarlo o hasta que aterricen en él."/>
+ <text name="allow_label0">
+ Volar:
+ </text>
+ <check_box label="Todos" name="check fly" tool_tip="Si se marca, los residentes podrán volar en su terreno. Si no, sólo podrán volar al cruzarlo o hasta que aterricen en él."/>
<text name="allow_label2">
Crear objetos:
</text>
@@ -334,16 +333,13 @@ Sólo las parcelas más grandes pueden listarse en la búsqueda.
</text>
<check_box label="Todos los residentes" name="check other scripts"/>
<check_box label="El grupo" name="check group scripts"/>
- <text name="land_options_label">
- Opciones del terreno:
- </text>
<check_box label="Seguro (sin daño)" name="check safe" tool_tip="Si se marca, convierte el terreno en &apos;seguro&apos;, desactivando el daño en combate. Si no, se activa el daño en combate."/>
<check_box label="Sin &apos;empujones&apos;" name="PushRestrictCheck" tool_tip="Previene scripts que empujen. Marcando esta opción prevendrá que en su terreno haya comportamientos destructivos."/>
<check_box label="Mostrar el sitio en la búsqueda (30 L$/semana)" name="ShowDirectoryCheck" tool_tip="Let people see this parcel in search results"/>
<combo_box name="land category with adult">
<combo_box.item label="Cualquier categoría" name="item0"/>
<combo_box.item label="Localización Linden" name="item1"/>
- <combo_box.item label="&apos;Adult&apos;" name="item2"/>
+ <combo_box.item label="Adulto" name="item2"/>
<combo_box.item label="Arte y Cultura" name="item3"/>
<combo_box.item label="Negocios" name="item4"/>
<combo_box.item label="Educativo" name="item5"/>
@@ -353,6 +349,7 @@ Sólo las parcelas más grandes pueden listarse en la búsqueda.
<combo_box.item label="Parques y Naturaleza" name="item9"/>
<combo_box.item label="Residencial" name="item10"/>
<combo_box.item label="Compras" name="item11"/>
+ <combo_box.item label="Terreno en alquiler" name="item13"/>
<combo_box.item label="Otra" name="item12"/>
</combo_box>
<combo_box name="land category">
@@ -367,13 +364,18 @@ Sólo las parcelas más grandes pueden listarse en la búsqueda.
<combo_box.item label="Parques y Naturaleza" name="item9"/>
<combo_box.item label="Residencial" name="item10"/>
<combo_box.item label="Compras" name="item11"/>
+ <combo_box.item label="Terreno en alquiler" name="item13"/>
<combo_box.item label="Otra" name="item12"/>
</combo_box>
- <check_box label="Contenido &apos;Mature&apos;" name="MatureCheck" tool_tip=""/>
+ <check_box label="Contenido Moderado" name="MatureCheck" tool_tip=""/>
<text name="Snapshot:">
Foto:
</text>
<texture_picker label="" name="snapshot_ctrl" tool_tip="Pulse para elegir una imagen"/>
+ <text name="allow_label5">
+ Los avatares de otras parcelas pueden ver a los avatares de esta parcela y chatear con ellos
+ </text>
+ <check_box label="Ver los avatares" name="SeeAvatarsCheck" tool_tip="Permite que los avatares de otras parcelas vean a los avatares de ésta y chateen con ellos, y también que tú puedas verles y chatear con ellos."/>
<text name="landing_point">
Punto de llegada: [LANDING]
</text>
@@ -398,7 +400,6 @@ Sólo las parcelas más grandes pueden listarse en la búsqueda.
</text>
<line_editor left="97" name="media_url"/>
<button label="Definir" name="set_media_url"/>
- <check_box label="Ocultar la URL del media" left="97" name="hide_media_url" tool_tip="Marcando esta opción esconderá en la información de esta parcela -a quien no esté autorizado a verla- la URL del media. Note que esto no está disponible para HTML."/>
<text name="Description:">
Descripción:
</text>
@@ -430,11 +431,15 @@ los media:
<text name="MusicURL:">
URL de música:
</text>
- <check_box label="Ocultar la URL" name="hide_music_url" tool_tip="Al marcar esta opción se ocultará la URL de la música a quien no esté autorizado a ver la información de esta parcela."/>
<text name="Sound:">
Sonido:
</text>
<check_box label="Restringir sonidos de objetos y gestos a esta parcela" name="check sound local"/>
+ <text name="Avatar Sounds:">
+ Sonidos de avatar:
+ </text>
+ <check_box label="Todos" name="all av sound check"/>
+ <check_box label="Grupo" name="group av sound check"/>
<text name="Voice settings:">
Voz:
</text>
@@ -447,7 +452,7 @@ los media:
(Definido por el Estado)
</panel.string>
<panel.string name="allow_public_access">
- Permitir el acceso público ([MATURITY])
+ Permitir el acceso público ([MATURITY]) (Nota: Si no seleccionas esta opción, se crearán líneas de prohibición)
</panel.string>
<panel.string name="estate_override">
Una o más de esta opciones está configurada a nivel del estado
@@ -455,12 +460,12 @@ los media:
<text name="Limit access to this parcel to:">
Acceso a esta parcela
</text>
- <check_box label="Permitir el acceso público [MATURITY]" name="public_access"/>
+ <check_box label="Permitir el acceso público (si no seleccionas esta opción, se crearán líneas de prohibición)" name="public_access"/>
<text name="Only Allow">
- Restringir el acceso a residentes verificados con:
+ Permitir únicamente el acceso a los Residentes que:
</text>
- <check_box label="Información de pago aportada [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Expulsa a los Residentes no identificados."/>
- <check_box label="Verificación de edad [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Expulsa a los Residentes que no hayan verificado su edad. Más información en [SUPPORT_SITE]."/>
+ <check_box label="Han aportado información de pago [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Para poder acceder a esta parcela los Residentes deben haber aportado información de pago en su cuenta. Para más información, ver [SUPPORT_SITE]."/>
+ <check_box label="Han verificado su edad [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Para poder acceder a esta parcela los Residentes deben haber verificado su edad. Para más información, ver [SUPPORT_SITE]."/>
<check_box label="Acceso permitido al grupo: [GROUP]" name="GroupCheck" tool_tip="Elija el grupo en la pestaña General."/>
<check_box label="Vender pases a:" name="PassCheck" tool_tip="Permitir acceso temporal a esta parcela"/>
<combo_box name="pass_combo">
diff --git a/indra/newview/skins/default/xui/es/floater_avatar.xml b/indra/newview/skins/default/xui/es/floater_avatar.xml
new file mode 100644
index 0000000000..21d202309f
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_avatar.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Avatar" title="ELIGE UN AVATAR"/>
diff --git a/indra/newview/skins/default/xui/es/floater_beacons.xml b/indra/newview/skins/default/xui/es/floater_beacons.xml
index b86967755c..49f990c84d 100644
--- a/indra/newview/skins/default/xui/es/floater_beacons.xml
+++ b/indra/newview/skins/default/xui/es/floater_beacons.xml
@@ -17,5 +17,6 @@
<check_box label="Sólo tocar" name="touch_only"/>
<check_box label="Origen de sonidos" name="sounds"/>
<check_box label="Origen de partículas" name="particles"/>
+ <check_box label="Fuentes de media" name="moapbeacon"/>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_build_options.xml b/indra/newview/skins/default/xui/es/floater_build_options.xml
index 9d63abd73c..a3e656cc17 100644
--- a/indra/newview/skins/default/xui/es/floater_build_options.xml
+++ b/indra/newview/skins/default/xui/es/floater_build_options.xml
@@ -1,7 +1,30 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="build options floater" title="OPCIONES DE LA CUADRÃCULA">
- <spinner label="Unidad de la cuadrícula (metros)" label_width="192" name="GridResolution" width="250"/>
- <spinner label="Alcance de la cuadrícula (metros)" label_width="192" name="GridDrawSize" width="250"/>
+ <floater.string name="grid_screen_text">
+ Pantalla
+ </floater.string>
+ <floater.string name="grid_local_text">
+ Local
+ </floater.string>
+ <floater.string name="grid_world_text">
+ Mundo
+ </floater.string>
+ <floater.string name="grid_reference_text">
+ Referencia
+ </floater.string>
+ <floater.string name="grid_attachment_text">
+ Adjunto
+ </floater.string>
+ <text name="grid_mode_label" tool_tip="Opacidad de la cuadrícula">
+ Modo
+ </text>
+ <combo_box name="combobox grid mode" tool_tip="Elige qué cuadricula usar para posicionar el objeto">
+ <combo_box.item label="Mundo" name="World"/>
+ <combo_box.item label="Local" name="Local"/>
+ <combo_box.item label="Referencia" name="Reference"/>
+ </combo_box>
+ <spinner label="Unidades (metros)" label_width="192" name="GridResolution" width="250"/>
+ <spinner label="Extensión (metros)" label_width="192" name="GridDrawSize" width="250"/>
<check_box label="Activar subunidades" name="GridSubUnit"/>
<check_box label="Ver la sección transversal" name="GridCrossSection"/>
<text name="grid_opacity_label" tool_tip="Opacidad de la cuadrícula">
diff --git a/indra/newview/skins/default/xui/es/floater_buy_contents.xml b/indra/newview/skins/default/xui/es/floater_buy_contents.xml
index 98604ad5f4..3563d4bd0f 100644
--- a/indra/newview/skins/default/xui/es/floater_buy_contents.xml
+++ b/indra/newview/skins/default/xui/es/floater_buy_contents.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_buy_contents" title="COMPRAR LOS CONTENIDOS">
<text name="contains_text">
- [NAME] contiene:
+ &lt;nolink&gt;[NOMBRE]&lt;/nolink&gt; contiene:
</text>
<text name="buy_text">
¿Comprar por [AMOUNT] L$ a [NAME]?
diff --git a/indra/newview/skins/default/xui/es/floater_buy_currency.xml b/indra/newview/skins/default/xui/es/floater_buy_currency.xml
index a8fa030846..2c8848265f 100644
--- a/indra/newview/skins/default/xui/es/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/es/floater_buy_currency.xml
@@ -18,7 +18,7 @@
<text name="balance_amount">
[AMT] L$
</text>
- <text name="currency_action" width="50">
+ <text name="currency_action">
Quiero comprar
</text>
<text name="currency_label">
@@ -46,13 +46,14 @@
[AMT] L$
</text>
<text name="currency_links">
- [http://www.secondlife.com/my/account/payment_method_management.php método de pago] | [http://www.secondlife.com/my/account/currency.php moneda] | [http://www.secondlife.com/my/account/exchange_rates.php tipo de cambio]
+ [http://www.secondlife.com/my/account/payment_method_management.php método de pago] | [http://www.secondlife.com/my/account/currency.php moneda]
</text>
<text name="exchange_rate_note">
Vuelve a escribir la cantidad para ver el tipo de cambio más reciente.
</text>
- <text name="purchase_warning_repurchase" right="-10">
- Confirmando que con esta compra sólo se compran L$, no el objeto.
+ <text name="purchase_warning_repurchase">
+ Confirmando que con esta compra sólo se compran L$,
+no el objeto.
</text>
<text name="purchase_warning_notenough">
No estás comprando suficientes L$. Por favor, aumenta la cantidad.
diff --git a/indra/newview/skins/default/xui/es/floater_buy_land.xml b/indra/newview/skins/default/xui/es/floater_buy_land.xml
index 74243a4d06..005fe90318 100644
--- a/indra/newview/skins/default/xui/es/floater_buy_land.xml
+++ b/indra/newview/skins/default/xui/es/floater_buy_land.xml
@@ -129,25 +129,25 @@ para cubrir esta parcela.
<text name="region_name_label">
Región:
</text>
- <text left="565" name="region_name_text">
+ <text name="region_name_text">
(desconocida)
</text>
<text name="region_type_label">
Tipo:
</text>
- <text left="565" name="region_type_text">
+ <text name="region_type_text">
(desconocido)
</text>
<text name="estate_name_label">
Estado:
</text>
- <text left="565" name="estate_name_text">
+ <text name="estate_name_text">
(desconocido)
</text>
- <text name="estate_owner_label" right="565" width="115">
+ <text name="estate_owner_label">
Propietario del estado:
</text>
- <text left="565" name="estate_owner_text">
+ <text name="estate_owner_text">
(desconocido)
</text>
<text name="resellable_changeable_label">
@@ -160,7 +160,7 @@ para cubrir esta parcela.
Podrá o no unirse o dividirse.
</text>
<text name="covenant_text">
- Debes aceptar el Contrato del Estado:
+ Debes aceptar el Contrato del estado:
</text>
<text left="470" name="covenant_timestamp_text"/>
<text_editor name="covenant_editor">
diff --git a/indra/newview/skins/default/xui/es/floater_camera.xml b/indra/newview/skins/default/xui/es/floater_camera.xml
index ccf3d4bf91..b0704ab788 100644
--- a/indra/newview/skins/default/xui/es/floater_camera.xml
+++ b/indra/newview/skins/default/xui/es/floater_camera.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="camera_floater" title="">
+<floater name="camera_floater" title="CONTROLES DE LA CÃMARA">
<floater.string name="rotate_tooltip">
Girar la cámara alrededor de lo enfocado
</floater.string>
@@ -9,15 +9,6 @@
<floater.string name="move_tooltip">
Mover la cámara arriba y abajo, izquierda y derecha
</floater.string>
- <floater.string name="camera_modes_title">
- Modos de cámara
- </floater.string>
- <floater.string name="pan_mode_title">
- Orbital - Zoom - Panóramica
- </floater.string>
- <floater.string name="presets_mode_title">
- Vistas predefinidas
- </floater.string>
<floater.string name="free_mode_title">
Centrar el objeto
</floater.string>
@@ -42,7 +33,7 @@
<panel name="camera_modes_list">
<panel_camera_item name="object_view">
<panel_camera_item.text name="object_view_text">
- Vista de objeto
+ Vista objetiva
</panel_camera_item.text>
</panel_camera_item>
<panel_camera_item name="mouselook_view">
@@ -59,7 +50,7 @@
</panel>
<panel name="buttons">
<button label="" name="presets_btn" tool_tip="Vistas predefinidas"/>
- <button label="" name="pan_btn" tool_tip="Orbital - Zoom - Panóramica"/>
+ <button label="" name="pan_btn" tool_tip="Orbital - Zoom - Panorámica"/>
<button label="" name="avatarview_btn" tool_tip="Modos de cámara"/>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_chat_bar.xml b/indra/newview/skins/default/xui/es/floater_chat_bar.xml
new file mode 100644
index 0000000000..2e94805057
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_chat_bar.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="chat_bar" title="CHAT">
+ <panel name="bottom_panel">
+ <line_editor label="Pulsa aquí para chatear." name="chat_box" tool_tip="Pulsa Enter para decirlo o Ctrl+Enter para gritarlo"/>
+ <button name="show_nearby_chat" tool_tip="Muestra o esconde el registro del chat"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_customize.xml b/indra/newview/skins/default/xui/es/floater_customize.xml
deleted file mode 100644
index 77b670d5f0..0000000000
--- a/indra/newview/skins/default/xui/es/floater_customize.xml
+++ /dev/null
@@ -1,530 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater customize" title="APARIENCIA">
- <tab_container name="customize tab container">
- <text label="Partes del cuerpo" name="body_parts_placeholder">
- Partes del cuerpo
- </text>
- <panel label="Forma" name="Shape">
- <button label="Restablecer" label_selected="Restablecer" name="Revert"/>
- <button label="Cuerpo" label_selected="Cuerpo" name="Body"/>
- <button label="Cabeza" label_selected="Cabeza" name="Head"/>
- <button label="Ojos" label_selected="Ojos" name="Eyes"/>
- <button label="Orejas" label_selected="Orejas" name="Ears"/>
- <button label="Nariz" label_selected="Nariz" name="Nose"/>
- <button label="Boca" label_selected="Boca" name="Mouth"/>
- <button label="Barbilla" label_selected="Barbilla" name="Chin"/>
- <button label="Torso" label_selected="Torso" name="Torso"/>
- <button label="Piernas" label_selected="Piernas" name="Legs"/>
- <radio_group name="sex radio">
- <radio_item label="Mujer" name="radio" value="0"/>
- <radio_item label="Varón" name="radio2" value="1"/>
- </radio_group>
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: no modificable
- </text>
- <text name="title_loading">
- [DESC]: cargando...
- </text>
- <text name="title_not_worn">
- [DESC]: no lleva
- </text>
- <text name="path">
- Situada en [PATH]
- </text>
- <text name="not worn instructions">
- Ponte una anatomía nueva arrastrándola desde tu inventario hasta tu avatar. O bien puedes crear una nueva partiendo de cero.
- </text>
- <text name="no modify instructions">
- No tiene permiso para modificar este ítem.
- </text>
- <text name="Item Action Label">
- Forma:
- </text>
- <button label="Crear una forma nueva" label_selected="Crear una forma nueva" name="Create New"/>
- <button label="Guardar" label_selected="Guardar" name="Save"/>
- <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
- </panel>
- <panel label="Piel" name="Skin">
- <button label="Color de piel" label_selected="Color de piel" name="Skin Color" width="115"/>
- <button label="Detalles faciales" label_selected="Detalles faciales" name="Face Detail" width="115"/>
- <button label="Maquillaje" label_selected="Maquillaje" name="Makeup" width="115"/>
- <button label="Detalles del cuerpo" label_selected="Detalles del cuerpo" name="Body Detail" width="115"/>
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: no modificable
- </text>
- <text name="title_loading">
- [DESC]: cargando...
- </text>
- <text name="title_not_worn">
- [DESC]: no lleva
- </text>
- <text name="path">
- Situada en [PATH]
- </text>
- <text name="not worn instructions">
- Ponte una piel nueva arrastrándola desde tu inventario hasta tu avatar. O bien puedes crear una nueva partiendo de cero.
- </text>
- <text name="no modify instructions">
- No tiene permiso para modificar este ítem.
- </text>
- <text name="Item Action Label" right="107">
- Piel:
- </text>
- <texture_picker label="Tatuaje: cabeza" name="Head Tattoos" tool_tip="Pulse para elegir una imagen" width="90"/>
- <texture_picker label="Tatuaje: superior" name="Upper Tattoos" tool_tip="Pulse para elegir una imagen" width="90"/>
- <texture_picker label="Tatuaje: inferior" name="Lower Tattoos" tool_tip="Pulse para elegir una imagen" width="90"/>
- <button label="Crear una piel nueva" label_selected="Crear una piel nueva" name="Create New"/>
- <button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
- <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
- <button label="Restablecer" label_selected="Restablecer" name="Revert"/>
- </panel>
- <panel label="Pelo" name="Hair">
- <button label="Color" label_selected="Color" name="Color"/>
- <button label="Peinado" label_selected="Peinado" name="Style"/>
- <button label="Cejas" label_selected="Cejas" name="Eyebrows"/>
- <button label="Facial" label_selected="Facial" name="Facial"/>
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: no modificable
- </text>
- <text name="title_loading">
- [DESC]: cargando...
- </text>
- <text name="title_not_worn">
- [DESC]: no lleva
- </text>
- <text name="path">
- Situado en [PATH]
- </text>
- <text name="not worn instructions">
- Ponte un pelo nuevo arrastrándolo desde tu inventario hasta tu avatar. O bien puedes crear uno nuevo partiendo de cero.
- </text>
- <text name="no modify instructions">
- No tiene permiso para modificar este ítem.
- </text>
- <text name="Item Action Label" right="107">
- Pelo:
- </text>
- <texture_picker label="Textura" name="Texture" tool_tip="Pulse para elegir una imagen"/>
- <button label="Crear un pelo nuevo" label_selected="Crear un pelo nuevo" name="Create New"/>
- <button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
- <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
- <button label="Restablecer" label_selected="Restablecer" name="Revert"/>
- </panel>
- <panel label="Ojos" name="Eyes">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: no modificables
- </text>
- <text name="title_loading">
- [DESC]: cargando...
- </text>
- <text name="title_not_worn">
- [DESC]: no lleva
- </text>
- <text name="path">
- Situados en [PATH]
- </text>
- <text name="not worn instructions">
- Ponte unos ojos nuevos arrastrándolos desde tu inventario hasta tu avatar. O bien puedes crear unos nuevos partiendo de cero.
- </text>
- <text name="no modify instructions">
- No tiene permiso para modificar este ítem.
- </text>
- <text name="Item Action Label" right="107">
- Ojos:
- </text>
- <texture_picker label="Iris" name="Iris" tool_tip="Pulse para elegir una imagen"/>
- <button label="Crear unos ojos nuevos" label_selected="Crear unos ojos nuevos" name="Create New"/>
- <button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
- <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
- <button label="Restablecer" label_selected="Restablecer" name="Revert"/>
- </panel>
- <text label="Ropa" name="clothes_placeholder">
- Ropas
- </text>
- <panel label="Camisa" name="Shirt">
- <texture_picker label="Tela" name="Fabric" tool_tip="Pulse para elegir una imagen"/>
- <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
- <button label="Quitarla" label_selected="Quitarla" name="Take Off"/>
- <button label="Crear una falda nueva" label_selected="Crear una falda nueva" name="Create New"/>
- <button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
- <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
- <button label="Restablecer" label_selected="Restablecer" name="Revert"/>
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: no modificable
- </text>
- <text name="title_loading">
- [DESC]: cargando...
- </text>
- <text name="title_not_worn">
- [DESC]: no lleva
- </text>
- <text name="path">
- Situada en [PATH]
- </text>
- <text name="not worn instructions">
- Ponte una camisa nueva arrastrándola desde tu inventario hasta tu avatar. O bien puedes crear una nueva partiendo de cero.
- </text>
- <text name="no modify instructions">
- No tiene permiso para modificar este ítem.
- </text>
- <text name="Item Action Label" right="107">
- Camisa:
- </text>
- </panel>
- <panel label="Pantalones" name="Pants">
- <texture_picker label="Tela" name="Fabric" tool_tip="Pulse para elegir una imagen"/>
- <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
- <button label="Quitarlos" label_selected="Quitarlos" name="Take Off"/>
- <button label="Crear unos pantalones nuevos" label_selected="Crear unos pantalones nuevos" name="Create New" width="185"/>
- <button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
- <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
- <button label="Restablecer" label_selected="Restablecer" name="Revert"/>
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: no modificables
- </text>
- <text name="title_loading">
- [DESC]: cargando...
- </text>
- <text name="title_not_worn">
- [DESC]: no lleva
- </text>
- <text name="path">
- Situados en [PATH]
- </text>
- <text name="not worn instructions">
- Ponte unos pantalones nuevos arrastrándolos desde tu inventario hasta tu avatar. O bien puedes crear unos nuevos partiendo de cero.
- </text>
- <text name="no modify instructions">
- No tiene permiso para modificar este ítem.
- </text>
- <text name="Item Action Label" right="107">
- Pantalones:
- </text>
- </panel>
- <panel label="Zapatos" name="Shoes">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: no modificables
- </text>
- <text name="title_loading">
- [DESC]: cargando...
- </text>
- <text name="title_not_worn">
- [DESC]: no lleva
- </text>
- <text name="path">
- Situados en [PATH]
- </text>
- <text name="not worn instructions">
- Ponte unos zapatos nuevos arrastrándolos desde tu inventario hasta tu avatar. O bien puedes crear unos nuevos partiendo de cero.
- </text>
- <button label="Crear unos zapatos nuevos" label_selected="Crear unos zapatos nuevos" name="Create New"/>
- <text name="no modify instructions">
- No tiene permiso para modificar este ítem.
- </text>
- <text name="Item Action Label" right="107">
- Zapatos:
- </text>
- <texture_picker label="Tela" name="Fabric" tool_tip="Pulse para elegir una imagen"/>
- <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
- <button label="Quitarlos" label_selected="Quitarlos" name="Take Off"/>
- <button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
- <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
- <button label="Restablecer" label_selected="Restablecer" name="Revert"/>
- </panel>
- <panel label="Calcetines" name="Socks">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: no modificables
- </text>
- <text name="title_loading">
- [DESC]: cargando...
- </text>
- <text name="title_not_worn">
- [DESC]: no lleva
- </text>
- <text name="path">
- Situados en [PATH]
- </text>
- <text name="not worn instructions">
- Ponte unos calcetines nuevos arrastrándolos desde tu inventario hasta tu avatar. O bien puedes crear unos nuevos partiendo de cero.
- </text>
- <button label="Crear unos calcetines nuevos" label_selected="Crear unos calcetines nuevos" name="Create New" width="185"/>
- <text name="no modify instructions">
- No tiene permiso para modificar este ítem.
- </text>
- <text name="Item Action Label" right="107">
- Calcetines:
- </text>
- <texture_picker label="Tela" name="Fabric" tool_tip="Pulse para elegir una imagen"/>
- <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
- <button label="Quitarlos" label_selected="Quitarlos" name="Take Off"/>
- <button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
- <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
- <button label="Restablecer" label_selected="Restablecer" name="Revert"/>
- </panel>
- <panel label="Chaqueta" name="Jacket">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: no modificable
- </text>
- <text name="title_loading">
- [DESC]: cargando...
- </text>
- <text name="title_not_worn">
- [DESC]: no lleva
- </text>
- <text name="path">
- Situada en [PATH]
- </text>
- <text name="not worn instructions">
- Ponte una chaqueta nueva arrastrándola desde tu inventario hasta tu avatar. O bien puedes crear una nueva partiendo de cero.
- </text>
- <button label="Crear una chaqueta nueva" label_selected="Crear una chaqueta nueva" name="Create New"/>
- <text name="no modify instructions">
- No tiene permiso para modificar este ítem.
- </text>
- <text name="Item Action Label" right="107">
- Chaqueta:
- </text>
- <texture_picker label="Tela superior" name="Upper Fabric" tool_tip="Pulse para elegir una imagen"/>
- <texture_picker label="Tela inferior" name="Lower Fabric" tool_tip="Pulse para elegir una imagen"/>
- <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
- <button label="Quitarla" label_selected="Quitarla" name="Take Off"/>
- <button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
- <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
- <button label="Restablecer" label_selected="Restablecer" name="Revert"/>
- </panel>
- <panel label="Guantes" name="Gloves">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: no modificables
- </text>
- <text name="title_loading">
- [DESC]: cargando...
- </text>
- <text name="title_not_worn">
- [DESC]: no lleva
- </text>
- <text name="path">
- Situados en [PATH]
- </text>
- <text name="not worn instructions">
- Ponte unos guantes nuevos arrastrándolos desde tu inventario hasta tu avatar. O bien puedes crear unos nuevos partiendo de cero.
- </text>
- <button label="Crear unos guantes nuevos" label_selected="Crear unos guantes nuevos" name="Create New"/>
- <text name="no modify instructions">
- No tiene permiso para modificar este ítem.
- </text>
- <text name="Item Action Label" right="107">
- Guantes:
- </text>
- <texture_picker label="Tela" name="Fabric" tool_tip="Pulse para elegir una imagen"/>
- <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
- <button label="Quitarlos" label_selected="Quitarlos" name="Take Off"/>
- <button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
- <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
- <button label="Restablecer" label_selected="Restablecer" name="Revert"/>
- </panel>
- <panel label="Camiseta" name="Undershirt">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: no modificable
- </text>
- <text name="title_loading">
- [DESC]: cargando...
- </text>
- <text name="title_not_worn">
- [DESC]: no lleva
- </text>
- <text name="path">
- Situada en [PATH]
- </text>
- <text name="not worn instructions">
- Ponte una camiseta nueva arrastrándola desde tu inventario hasta tu avatar. O bien puedes crear una nueva partiendo de cero.
- </text>
- <button label="Crear una camiseta nueva" label_selected="Crear una camiseta nueva" name="Create New"/>
- <text name="no modify instructions">
- No tiene permiso para modificar este ítem.
- </text>
- <text name="Item Action Label" right="107">
- Camiseta:
- </text>
- <texture_picker label="Tela" name="Fabric" tool_tip="Pulse para elegir una imagen"/>
- <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
- <button label="Quitarla" label_selected="Quitarla" name="Take Off"/>
- <button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
- <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
- <button label="Restablecer" label_selected="Restablecer" name="Revert"/>
- </panel>
- <panel label="Ropa interior" name="Underpants">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: no modificable
- </text>
- <text name="title_loading">
- [DESC]: cargando...
- </text>
- <text name="title_not_worn">
- [DESC]: no lleva
- </text>
- <text name="path">
- Situada en [PATH]
- </text>
- <text name="not worn instructions">
- Ponte una ropa interior nueva arrastrándola desde tu inventario hasta tu avatar. O bien puedes crear una nueva partiendo de cero.
- </text>
- <button label="Crear una ropa interior nueva" label_selected="Crear una ropa interior nueva" name="Create New" width="185"/>
- <text name="no modify instructions">
- No tiene permiso para modificar este ítem.
- </text>
- <text name="Item Action Label" right="107">
- Ropa interior:
- </text>
- <texture_picker label="Tela" name="Fabric" tool_tip="Pulse para elegir una imagen"/>
- <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
- <button label="Quitarla" label_selected="Quitarla" name="Take Off"/>
- <button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
- <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
- <button label="Restablecer" label_selected="Restablecer" name="Revert"/>
- </panel>
- <panel label="Falda" name="Skirt">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: no modificable
- </text>
- <text name="title_loading">
- [DESC]: cargando...
- </text>
- <text name="title_not_worn">
- [DESC]: no lleva
- </text>
- <text name="path">
- Situada en [PATH]
- </text>
- <text name="not worn instructions">
- Ponte una falda nueva arrastrándola desde tu inventario hasta tu avatar. O bien puedes crear una nueva partiendo de cero.
- </text>
- <button label="Crear una falda nueva" label_selected="Crear una falda nueva" name="Create New"/>
- <text name="no modify instructions">
- No tiene permiso para modificar este ítem.
- </text>
- <text name="Item Action Label" right="107">
- Falda:
- </text>
- <texture_picker label="Tela" name="Fabric" tool_tip="Pulse para elegir una imagen"/>
- <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
- <button label="Quitarla" label_selected="Quitarla" name="Take Off"/>
- <button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
- <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
- <button label="Restablecer" label_selected="Restablecer" name="Revert"/>
- </panel>
- <panel label="Tatuaje" name="Tattoo">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: no modificable
- </text>
- <text name="title_loading">
- [DESC]: cargando...
- </text>
- <text name="title_not_worn">
- [DESC]: no puesto
- </text>
- <text name="path">
- Situado en [PATH]
- </text>
- <text name="not worn instructions">
- Pon un tatuaje nuevo arrastrándolo desde tu inventario a tu avatar. O bien puedes crear uno nuevo partiendo de cero.
- </text>
- <button label="Crear un tatuaje nuevo" label_selected="Crear un tatuaje nuevo" name="Create New"/>
- <text name="no modify instructions">
- No tienes permiso para modificar este artículo.
- </text>
- <text name="Item Action Label">
- Tatuaje:
- </text>
- <texture_picker label="Tatuaje de la cabeza" name="Head Tattoo" tool_tip="Pulsa para elegir una imagen"/>
- <texture_picker label="Tatuaje superior" name="Upper Tattoo" tool_tip="Pulsa para elegir una imagen"/>
- <texture_picker label="Tatuaje inferior" name="Lower Tattoo" tool_tip="Pulsa para elegir una imagen"/>
- <button label="Quitarme" label_selected="Quitarme" name="Take Off"/>
- <button label="Guardar" label_selected="Guardar" name="Save"/>
- <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
- <button label="Revertir" label_selected="Revertir" name="Revert"/>
- </panel>
- <panel label="Alfa" name="Alpha">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: no modificable
- </text>
- <text name="title_loading">
- [DESC]: cargando...
- </text>
- <text name="title_not_worn">
- [DESC]: no puesto
- </text>
- <text name="path">
- Situado en [PATH]
- </text>
- <text name="not worn instructions">
- Pon una capa Alfa nueva arrastrándola desde tu inventario a tu avatar. O bien puedes crear una nueva partiendo de cero.
- </text>
- <button label="Crear una capa Alfa nueva" label_selected="Crear una capa Alfa nueva" name="Create New"/>
- <text name="no modify instructions">
- No tienes permiso para modificar este artículo.
- </text>
- <text name="Item Action Label">
- Alfa:
- </text>
- <texture_picker label="Alfa inferior" name="Lower Alpha" tool_tip="Pulsa para elegir una imagen"/>
- <texture_picker label="Alfa superior" name="Upper Alpha" tool_tip="Pulsa para elegir una imagen"/>
- <texture_picker label="Alfa de la cabeza" name="Head Alpha" tool_tip="Pulsa para elegir una imagen"/>
- <texture_picker label="Alfa de los ojos" name="Eye Alpha" tool_tip="Pulsa para elegir una imagen"/>
- <texture_picker label="Alfa del pelo" name="Hair Alpha" tool_tip="Pulsa para elegir una imagen"/>
- <button label="Quitarme" label_selected="Quitarme" name="Take Off"/>
- <button label="Guardar" label_selected="Guardar" name="Save"/>
- <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
- <button label="Revertir" label_selected="Revertir" name="Revert"/>
- </panel>
- </tab_container>
- <scroll_container name="panel_container"/>
- <button label="Información del script" label_selected="Información del script" name="script_info" tool_tip="Mostrar los scripts anexados a tu avatar"/>
- <button label="Hacer un vestuario" label_selected="Hacer un vestuario" name="make_outfit_btn"/>
- <button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
- <button label="OK" label_selected="OK" name="Ok"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/es/floater_day_cycle_options.xml
deleted file mode 100644
index 9c3ac1be0e..0000000000
--- a/indra/newview/skins/default/xui/es/floater_day_cycle_options.xml
+++ /dev/null
@@ -1,94 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Day Cycle Floater" title="EDITOR DEL CICLO DE UN DÃA">
- <tab_container name="Day Cycle Tabs">
- <panel label="Ciclo de un día" name="Day Cycle">
- <button label="?" name="WLDayCycleHelp"/>
- <text name="WL12am">
- 12 am
- </text>
- <text name="WL3am">
- 3 am
- </text>
- <text name="WL6am">
- 6 am
- </text>
- <text name="WL9amHash">
- 9 am
- </text>
- <text name="WL12pmHash">
- 12 pm
- </text>
- <text name="WL3pm">
- 3 pm
- </text>
- <text name="WL6pm">
- 6 pm
- </text>
- <text name="WL9pm">
- 9 pm
- </text>
- <text name="WL12am2">
- 12 am
- </text>
- <text name="WL12amHash">
- |
- </text>
- <text name="WL3amHash">
- I
- </text>
- <text name="WL6amHash">
- |
- </text>
- <text name="WL9amHash2">
- I
- </text>
- <text name="WL12pmHash2">
- |
- </text>
- <text name="WL3pmHash">
- I
- </text>
- <text name="WL6pmHash">
- |
- </text>
- <text name="WL9pmHash">
- I
- </text>
- <text name="WL12amHash2">
- |
- </text>
- <button label="Añadir un punto" label_selected="Añadir un punto" name="WLAddKey"/>
- <button label="Quitar un punto" label_selected="Quitar un punto" name="WLDeleteKey"/>
- <text name="WLCurKeyFrameText">
- Configuración del fotograma clave:
- </text>
- <text name="WLCurKeyTimeText">
- Hora clave:
- </text>
- <spinner label="Hora" name="WLCurKeyHour"/>
- <spinner label="Min." name="WLCurKeyMin"/>
- <text name="WLCurKeyTimeText2">
- Modelo predefinido:
- </text>
- <combo_box label="Predefinido" name="WLKeyPresets"/>
- <text name="DayCycleText">
- Intervalo:
- </text>
- <combo_box label="5 min." name="WLSnapOptions"/>
- <text name="DayCycleText2">
- Duración del ciclo:
- </text>
- <spinner label="Hora" name="WLLengthOfDayHour"/>
- <spinner label="Min." name="WLLengthOfDayMin"/>
- <spinner label="Seg." name="WLLengthOfDaySec"/>
- <text name="DayCycleText3">
- Vista previa:
- </text>
- <button label="Probar" label_selected="Probar" name="WLAnimSky"/>
- <button label="Parar" label_selected="Parar" name="WLStopAnimSky"/>
- <button label="Usar el horario del estado" label_selected="Ir al horario del estado" name="WLUseLindenTime"/>
- <button label="Guardar este tipo de día" label_selected="Guardar este tipo de día" name="WLSaveDayCycle"/>
- <button label="Cargar y probar un tipo de día" label_selected="Cargar y probar un tipo de día" name="WLLoadDayCycle"/>
- </panel>
- </tab_container>
-</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_delete_env_preset.xml b/indra/newview/skins/default/xui/es/floater_delete_env_preset.xml
new file mode 100644
index 0000000000..5e7df8530e
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_delete_env_preset.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<floater name="Delete Env Preset" title="ELIMINAR EL ENV PREDEFINIDO">
+ <string name="title_water">
+ Eliminar el agua predefinida
+ </string>
+ <string name="title_sky">
+ Eliminar cielo predefinido
+ </string>
+ <string name="title_day_cycle">
+ Eliminar ciclo del día
+ </string>
+ <string name="label_water">
+ Predefinido:
+ </string>
+ <string name="label_sky">
+ Predefinido:
+ </string>
+ <string name="label_day_cycle">
+ Ciclo del día:
+ </string>
+ <string name="msg_confirm_deletion">
+ ¿Estás seguro de que quieres eliminar el valor predefinido seleccionado?
+ </string>
+ <string name="msg_sky_is_referenced">
+ No se puede quitar un valor predefinido al que se hace referencia en otro u otros ciclos del día.
+ </string>
+ <string name="combo_label">
+ -Selecciona un valor predefinido-
+ </string>
+ <text name="label">
+ Predefinido:
+ </text>
+ <button label="Borrar" name="delete"/>
+ <button label="Cancelar" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_destinations.xml b/indra/newview/skins/default/xui/es/floater_destinations.xml
new file mode 100644
index 0000000000..df18698d2f
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_destinations.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Destinations" title="DESTINOS"/>
diff --git a/indra/newview/skins/default/xui/es/floater_edit_day_cycle.xml b/indra/newview/skins/default/xui/es/floater_edit_day_cycle.xml
new file mode 100644
index 0000000000..6ac46351db
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_edit_day_cycle.xml
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Edit Day cycle" title="Editar ciclo del día">
+ <string name="title_new">
+ Crear un ciclo del día nuevo
+ </string>
+ <string name="title_edit">
+ Editar ciclo del día
+ </string>
+ <string name="hint_new">
+ Asigna un nombre al ciclo del día, ajusta los controles para crearlo y selecciona &quot;Guardar&quot;.
+ </string>
+ <string name="hint_edit">
+ Para editar el ciclo del día, ajusta los controles siguientes y selecciona &quot;Guardar&quot;.
+ </string>
+ <string name="combo_label">
+ -Selecciona un valor predefinido-
+ </string>
+ <text name="label">
+ Nombre predefinido:
+ </text>
+ <text name="note">
+ Nota: Si cambias el nombre del valor predefinido, crearás un predefinido nuevo y el actual no se modificará.
+ </text>
+ <text name="hint_item1">
+ - Pulsa en una pestaña para editar la configuración y el tiempo de un cielo determinado.
+ </text>
+ <text name="hint_item2">
+ - Pulsa y arrastra las pestañas para ajustar los tiempos de transición.
+ </text>
+ <text name="hint_item3">
+ - Usa el depurador para obtener una vista previa del ciclo del día.
+ </text>
+ <panel name="day_cycle_slider_panel">
+ <multi_slider initial_value="0" name="WLTimeSlider"/>
+ <multi_slider initial_value="0" name="WLDayCycleKeys"/>
+ <button label="Añadir clave" label_selected="Añadir clave" name="WLAddKey"/>
+ <button label="Eliminar clave" label_selected="Eliminar clave" name="WLDeleteKey"/>
+ <text name="WL12am">
+ 12 AM
+ </text>
+ <text name="WL3am">
+ 3 AM
+ </text>
+ <text name="WL6am">
+ 6 AM
+ </text>
+ <text name="WL9amHash">
+ 9 AM
+ </text>
+ <text name="WL12pmHash">
+ 12 PM
+ </text>
+ <text name="WL3pm">
+ 3 PM
+ </text>
+ <text name="WL6pm">
+ 6 PM
+ </text>
+ <text name="WL9pm">
+ 9 PM
+ </text>
+ <text name="WL12am2">
+ 12 AM
+ </text>
+ <text name="WL12amHash">
+ |
+ </text>
+ <text name="WL3amHash">
+ I
+ </text>
+ <text name="WL6amHash">
+ |
+ </text>
+ <text name="WL9amHash2">
+ I
+ </text>
+ <text name="WL12pmHash2">
+ |
+ </text>
+ <text name="WL3pmHash">
+ I
+ </text>
+ <text name="WL6pmHash">
+ |
+ </text>
+ <text name="WL9pmHash">
+ I
+ </text>
+ <text name="WL12amHash2">
+ |
+ </text>
+ </panel>
+ <text name="WLCurKeyPresetText">
+ Configuración del cielo:
+ </text>
+ <combo_box label="Predefinido" name="WLSkyPresets"/>
+ <text name="WLCurKeyTimeText">
+ Hora:
+ </text>
+ <time name="time" value="6 AM"/>
+ <check_box label="Convertir en mi nuevo ciclo del día" name="make_default_cb"/>
+ <button label="Guardar" name="save"/>
+ <button label="Cancelar" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_edit_sky_preset.xml b/indra/newview/skins/default/xui/es/floater_edit_sky_preset.xml
new file mode 100644
index 0000000000..d2197b80fa
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_edit_sky_preset.xml
@@ -0,0 +1,143 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Edit Sky Preset" title="Editar cielo predefinido">
+ <string name="title_new">
+ Crear un nuevo cielo predefinido
+ </string>
+ <string name="title_edit">
+ Editar cielo predefinido
+ </string>
+ <string name="hint_new">
+ Asigna un nombre al valor predefinido, ajusta los controles para crearlo y selecciona &quot;Guardar&quot;.
+ </string>
+ <string name="hint_edit">
+ Para editar el cielo predefinido, ajusta los controles y selecciona &quot;Guardar&quot;.
+ </string>
+ <string name="combo_label">
+ -Selecciona un valor predefinido-
+ </string>
+ <text name="hint">
+ Para editar el valor predefinido, ajusta los controles y selecciona &quot;Guardar&quot;.
+ </text>
+ <text name="label">
+ Nombre predefinido:
+ </text>
+ <text name="note">
+ Nota: Si cambias el nombre del valor predefinido, crearás un predefinido nuevo y el actual no se modificará.
+ </text>
+ <tab_container name="WindLight Tabs">
+ <panel label="ATMÓSFERA" name="Atmosphere">
+ <text name="BHText">
+ Horizonte azul
+ </text>
+ <text name="BDensText">
+ Cantidad de bruma
+ </text>
+ <text name="BDensText2">
+ Saturación
+ </text>
+ <text name="HDText">
+ Densidad de la bruma
+ </text>
+ <text name="DensMultText">
+ Densidad
+ </text>
+ <text name="WLDistanceMultText">
+ Distancia
+ </text>
+ <text name="MaxAltText">
+ Altitud máx.
+ </text>
+ </panel>
+ <panel label="LUZ" name="Lighting">
+ <text name="SLCText">
+ Color del sol y de la luna
+ </text>
+ <text name="WLAmbientText">
+ Ambiental
+ </text>
+ <text name="SunGlowText">
+ Resplandor del sol
+ </text>
+ <slider label="Visión" name="WLGlowB"/>
+ <slider label="Tamaño" name="WLGlowR"/>
+ <text name="WLStarText">
+ Brillo de las estrellas
+ </text>
+ <text name="SceneGammaText">
+ Gamma de la escena
+ </text>
+ <text name="TODText">
+ Posición del sol y la luna
+ </text>
+ <multi_slider initial_value="0" name="WLSunPos"/>
+ <text name="WL12amHash">
+ |
+ </text>
+ <text name="WL6amHash">
+ |
+ </text>
+ <text name="WL12pmHash2">
+ |
+ </text>
+ <text name="WL6pmHash">
+ |
+ </text>
+ <text name="WL12amHash2">
+ |
+ </text>
+ <text name="WL12am">
+ 12 AM
+ </text>
+ <text name="WL6am">
+ 6 AM
+ </text>
+ <text name="WL12pmHash">
+ 12 PM
+ </text>
+ <text name="WL6pm">
+ 6 PM
+ </text>
+ <text name="WL12am2">
+ 12 AM
+ </text>
+ <time name="WLDayTime" value="6:00 AM"/>
+ <text name="WLEastAngleText">
+ Ãngulo de elevación
+ </text>
+ </panel>
+ <panel label="NUBES" name="Clouds">
+ <text name="WLCloudColorText">
+ Color de las nubes
+ </text>
+ <text name="WLCloudColorText2">
+ Posición/Densidad de las nubes
+ </text>
+ <slider label="X" name="WLCloudX"/>
+ <slider label="Y" name="WLCloudY"/>
+ <slider label="D" name="WLCloudDensity"/>
+ <text name="WLCloudCoverageText">
+ Nubosidad
+ </text>
+ <text name="WLCloudScaleText">
+ Altitud de las nubes
+ </text>
+ <text name="WLCloudDetailText">
+ Detalle de las nubes (Posición/Densidad)
+ </text>
+ <slider label="X" name="WLCloudDetailX"/>
+ <slider label="Y" name="WLCloudDetailY"/>
+ <slider label="D" name="WLCloudDetailDensity"/>
+ <text name="WLCloudScrollXText">
+ Velocidad de las nubes: X
+ </text>
+ <check_box label="Lock" name="WLCloudLockX"/>
+ <text name="WLCloudScrollYText">
+ Velocidad de las nubes: Y
+ </text>
+ <check_box label="Lock" name="WLCloudLockY"/>
+ </panel>
+ </tab_container>
+ <check_box label="Convertir este valor predefinido en mi nueva configuración de cielo" name="make_default_cb"/>
+ <button label="Guardar" name="save"/>
+ <button label="Cancelar" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_edit_water_preset.xml b/indra/newview/skins/default/xui/es/floater_edit_water_preset.xml
new file mode 100644
index 0000000000..f90ad59f78
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_edit_water_preset.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Edit Water Preset" title="Editar el agua predefinida">
+ <string name="title_new">
+ Crear una nueva agua predefinida
+ </string>
+ <string name="title_edit">
+ Editar el agua predefinida
+ </string>
+ <string name="hint_new">
+ Asigna un nombre al valor predefinido, ajusta los controles para crearlo y selecciona &quot;Guardar&quot;.
+ </string>
+ <string name="hint_edit">
+ Para editar el agua predefinida, ajusta los controles y selecciona &quot;Guardar&quot;.
+ </string>
+ <string name="combo_label">
+ -Selecciona un valor predefinido-
+ </string>
+ <text name="hint">
+ Para editar el valor predefinido, ajusta los controles y selecciona &quot;Guardar&quot;.
+ </text>
+ <text name="label">
+ Nombre predefinido:
+ </text>
+ <text name="note">
+ Nota: Si cambias el nombre del valor predefinido, crearás un predefinido nuevo y el actual no se modificará.
+ </text>
+ <panel name="panel_water_preset">
+ <text name="water_color_label">
+ Color del agua
+ </text>
+ <text name="water_fog_density_label">
+ Transparencia
+ </text>
+ <text name="underwater_fog_modifier_label">
+ Modificar la claridad del agua
+ </text>
+ <text name="BHText">
+ Sentido de las olas grandes
+ </text>
+ <slider label="X" name="WaterWave1DirX"/>
+ <slider label="Y" name="WaterWave1DirY"/>
+ <text name="BDensText">
+ Tamaño de las ondulaciones
+ </text>
+ <text name="HDText">
+ Escala de Fresnel
+ </text>
+ <text name="FresnelOffsetText">
+ Coeficiente de reflexión
+ </text>
+ <text name="BHText2">
+ Sentido de las olas pequeñas
+ </text>
+ <slider label="X" name="WaterWave2DirX"/>
+ <slider label="Y" name="WaterWave2DirY"/>
+ <text name="DensMultText">
+ Refracción de la superficie
+ </text>
+ <text name="WaterScaleBelowText">
+ Refracción bajo la superficie
+ </text>
+ <text name="MaxAltText">
+ Desenfoque
+ </text>
+ <text name="BHText3">
+ Vista Normal
+ </text>
+ </panel>
+ <check_box label="Convertir este valor predefinido en mi nueva configuración de agua" name="make_default_cb"/>
+ <button label="Guardar" name="save"/>
+ <button label="Cancelar" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_env_settings.xml b/indra/newview/skins/default/xui/es/floater_env_settings.xml
deleted file mode 100644
index 195690f546..0000000000
--- a/indra/newview/skins/default/xui/es/floater_env_settings.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Environment Editor Floater" title="EDITOR DEL ENTORNO">
- <floater.string name="timeStr">
- [hour12,datetime,utc]:[min,datetime,utc] [ampm,datetime,utc]
- </floater.string>
- <text name="EnvTimeText">
- Duración de
-un día
- </text>
- <text name="EnvTimeText2">
- 12:00 PM
- </text>
- <text name="EnvCloudText">
- Nubosidad
- </text>
- <text name="EnvWaterColorText">
- Color del
-agua
- </text>
- <color_swatch label="" name="EnvWaterColor" tool_tip="Pulsa para abrir el selector de color"/>
- <text name="EnvWaterFogText">
- Claridad del
-agua
- </text>
- <button bottom="-144" label="Usar el horario del estado" name="EnvUseEstateTimeButton" width="155"/>
- <button label="Cielo avanzado" left="167" name="EnvAdvancedSkyButton" width="155"/>
- <button label="Agua avanzada" left="326" name="EnvAdvancedWaterButton" width="155"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_environment_settings.xml b/indra/newview/skins/default/xui/es/floater_environment_settings.xml
new file mode 100644
index 0000000000..a9c5705d52
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_environment_settings.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Environment Editor Floater" title="CONFIGURACIÓN DE ENTORNO">
+ <text name="note">
+ Puedes personalizar la configuración del entorno de tu visor con las opciones siguientes.
+ </text>
+ <radio_group name="region_settings_radio_group">
+ <radio_item label="Usar configuración de región" name="use_region_settings"/>
+ <radio_item label="Personalizar mi entorno" name="use_my_settings"/>
+ </radio_group>
+ <panel name="user_environment_settings">
+ <text name="note">
+ Nota: La configuración personalizada no estará visible para otros usuarios.
+ </text>
+ <text name="water_settings_title">
+ Configuración de agua
+ </text>
+ <combo_box name="water_settings_preset_combo">
+ <combo_box.item label="-Selecciona un valor predefinido-" name="item0"/>
+ </combo_box>
+ <text name="sky_dayc_settings_title">
+ Cielo/Ciclo del día
+ </text>
+ <radio_group name="sky_dayc_settings_radio_group">
+ <radio_item label="Cielo invariable" name="my_sky_settings"/>
+ <radio_item label="Ciclo del día" name="my_dayc_settings"/>
+ </radio_group>
+ <combo_box name="sky_settings_preset_combo">
+ <combo_box.item label="-Selecciona un valor predefinido-" name="item0"/>
+ </combo_box>
+ <combo_box name="dayc_settings_preset_combo">
+ <combo_box.item label="-Selecciona un valor predefinido-" name="item0"/>
+ </combo_box>
+ </panel>
+ <button label="OK" name="ok_btn"/>
+ <button label="Cancelar" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_fast_timers.xml b/indra/newview/skins/default/xui/es/floater_fast_timers.xml
new file mode 100644
index 0000000000..eeb39583ef
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_fast_timers.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="fast_timers">
+ <string name="pause">
+ Pausa
+ </string>
+ <string name="run">
+ Correr
+ </string>
+ <button label="Pausa" name="pause_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_hardware_settings.xml b/indra/newview/skins/default/xui/es/floater_hardware_settings.xml
index f967d697c5..b96076836b 100644
--- a/indra/newview/skins/default/xui/es/floater_hardware_settings.xml
+++ b/indra/newview/skins/default/xui/es/floater_hardware_settings.xml
@@ -4,7 +4,7 @@
Filtrado:
</text>
<check_box label="Filtrado anisotrópico (más lento si se activa)" name="ani"/>
- <text name="Antialiasing:">
+ <text name="antialiasing label">
Antialiasing:
</text>
<combo_box label="Antialiasing" name="fsaa" width="94">
@@ -14,6 +14,9 @@
<combo_box.item label="8x" name="8x"/>
<combo_box.item label="16x" name="16x"/>
</combo_box>
+ <text name="antialiasing restart">
+ (requiere reiniciar el visor)
+ </text>
<spinner label="Gamma:" name="gamma"/>
<text name="(brightness, lower is brighter)">
(0 = brillo por defecto, más bajo = más brillo)
diff --git a/indra/newview/skins/default/xui/es/floater_help_browser.xml b/indra/newview/skins/default/xui/es/floater_help_browser.xml
index ec3c38e8c7..5ebd7ad6e0 100644
--- a/indra/newview/skins/default/xui/es/floater_help_browser.xml
+++ b/indra/newview/skins/default/xui/es/floater_help_browser.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_help_browser" title="BUSCADOR DE AYUDA">
+<floater name="floater_help_browser" title="BUSCAR EN LA AYUDA">
<floater.string name="loading_text">
Cargando...
</floater.string>
diff --git a/indra/newview/skins/default/xui/es/floater_how_to.xml b/indra/newview/skins/default/xui/es/floater_how_to.xml
new file mode 100644
index 0000000000..4a57dc3643
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_how_to.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_how_to" title="CÓMO"/>
diff --git a/indra/newview/skins/default/xui/es/floater_import_collada.xml b/indra/newview/skins/default/xui/es/floater_import_collada.xml
new file mode 100644
index 0000000000..7e9a00797a
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_import_collada.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Import Collada" title="Importar escena">
+ <text name="mesh count">
+ Redes: [RECUENTO]
+ </text>
+ <text name="texture count">
+ Texturas: [RECUENTO]
+ </text>
+ <text name="status">
+ Estado: [ESTADO]
+ </text>
+ <button label="Cancelar" name="cancel"/>
+ <button label="OK" name="ok"/>
+ <string name="status_idle">
+ Inactivo
+ </string>
+ <string name="status_uploading">
+ Cargando [NOMBRE]
+ </string>
+ <string name="status_creating">
+ Creando objeto [NOMBRE]
+ </string>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/es/floater_inventory_item_properties.xml
index 5746688962..bf84c3d808 100644
--- a/indra/newview/skins/default/xui/es/floater_inventory_item_properties.xml
+++ b/indra/newview/skins/default/xui/es/floater_inventory_item_properties.xml
@@ -24,16 +24,10 @@
<text name="LabelCreatorTitle">
Creador:
</text>
- <text name="LabelCreatorName">
- Nicole Linden
- </text>
<button label="Perfil..." label_selected="" name="BtnCreator"/>
<text name="LabelOwnerTitle">
Propietario:
</text>
- <text name="LabelOwnerName">
- Thrax Linden
- </text>
<button label="Perfil..." label_selected="" name="BtnOwner"/>
<text name="LabelAcquiredTitle">
Adquirido:
diff --git a/indra/newview/skins/default/xui/es/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/es/floater_inventory_view_finder.xml
index c9d639d8cf..6004034504 100644
--- a/indra/newview/skins/default/xui/es/floater_inventory_view_finder.xml
+++ b/indra/newview/skins/default/xui/es/floater_inventory_view_finder.xml
@@ -5,6 +5,7 @@
<check_box label="Ropa" name="check_clothing"/>
<check_box label="Gestos" name="check_gesture"/>
<check_box label="Hitos" name="check_landmark"/>
+ <check_box label="Redes" name="check_mesh"/>
<check_box label="Notas" name="check_notecard"/>
<check_box label="Objetos" name="check_object"/>
<check_box label="Scripts" name="check_script"/>
@@ -14,11 +15,11 @@
<button label="Todos" label_selected="Todo" name="All"/>
<button label="Ninguno" label_selected="Nada" name="None"/>
<check_box label="Mostrar siempre las carpetas" name="check_show_empty"/>
- <check_box label="Desde el fin de sesión" name="check_since_logoff" bottom_delta="-36"/>
+ <check_box bottom_delta="-36" label="Desde el fin de sesión" name="check_since_logoff"/>
<text name="- OR -">
- o -
</text>
<spinner label="horas atrás" name="spin_hours_ago"/>
<spinner label="días atrás" name="spin_days_ago"/>
- <button label="Cerrar" label_selected="Cerrar" name="Close" bottom_delta="-30"/>
+ <button bottom_delta="-30" label="Cerrar" label_selected="Cerrar" name="Close"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_map.xml b/indra/newview/skins/default/xui/es/floater_map.xml
index fa01a4a635..69f638418e 100644
--- a/indra/newview/skins/default/xui/es/floater_map.xml
+++ b/indra/newview/skins/default/xui/es/floater_map.xml
@@ -1,10 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Map" title="">
+<floater name="Map" title="MINIMAPA">
<floater.string name="ToolTipMsg">
[REGIÓN](Haz doble clic para abrir el mapa y pulsa la tecla Mayús y arrastra para obtener una vista panorámica)
</floater.string>
+ <floater.string name="AltToolTipMsg">
+ [REGION](Pulsa dos veces para teleportarte, pulsa mayús y arrastra para obtener una panorámica)
+ </floater.string>
<floater.string name="mini_map_caption">
- MINIMAPA
+ Minimapa
</floater.string>
<text label="N" name="floater_map_north" text="N">
N
diff --git a/indra/newview/skins/default/xui/es/floater_merchant_outbox.xml b/indra/newview/skins/default/xui/es/floater_merchant_outbox.xml
new file mode 100644
index 0000000000..a7c17fc136
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_merchant_outbox.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_merchant_outbox" title="BUZÓN DE SALIDA DE COMERCIANTE">
+ <string name="OutboxFolderCount1">
+ 1 carpeta
+ </string>
+ <string name="OutboxFolderCountN">
+ [NUM] carpetas
+ </string>
+ <string name="OutboxImporting">
+ Enviando carpetas...
+ </string>
+ <string name="OutboxInitializing">
+ Inicializando...
+ </string>
+ <panel label="">
+ <panel>
+ <panel name="outbox_inventory_placeholder_panel">
+ <text name="outbox_inventory_placeholder_title">
+ Cargando...
+ </text>
+ </panel>
+ </panel>
+ <panel>
+ <button label="Enviar al Mercado" name="outbox_import_btn" tool_tip="Poner en el escaparate de Mi Mercado"/>
+ </panel>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_model_preview.xml b/indra/newview/skins/default/xui/es/floater_model_preview.xml
new file mode 100644
index 0000000000..ab3ba5aed7
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_model_preview.xml
@@ -0,0 +1,277 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Model Preview" title="SUBIR MODELO">
+ <string name="status_idle"/>
+ <string name="status_parse_error">
+ Error: Problema de análisis de DAE - consulta los datos en el registro.
+ </string>
+ <string name="status_material_mismatch">
+ Error: el material del modelo no es un subconjunto del modelo de referencia.
+ </string>
+ <string name="status_reading_file">
+ Cargando...
+ </string>
+ <string name="status_generating_meshes">
+ Generando redes...
+ </string>
+ <string name="status_vertex_number_overflow">
+ Error: El número de intersección es superior a 65534. Cancelado.
+ </string>
+ <string name="bad_element">
+ Error: el elemento no es válido
+ </string>
+ <string name="high">
+ Alto
+ </string>
+ <string name="medium">
+ Media
+ </string>
+ <string name="low">
+ Bajo
+ </string>
+ <string name="lowest">
+ Mínimo
+ </string>
+ <string name="mesh_status_good">
+ Factúralo.
+ </string>
+ <string name="mesh_status_na">
+ N/A
+ </string>
+ <string name="mesh_status_none">
+ Ninguno
+ </string>
+ <string name="mesh_status_submesh_mismatch">
+ Los niveles de detalle poseen un número distinto de caras a las que se pueden aplicar texturas.
+ </string>
+ <string name="mesh_status_mesh_mismatch">
+ Los niveles de detalle poseen un número distinto de ejemplos de red.
+ </string>
+ <string name="mesh_status_too_many_vertices">
+ El nivel de detalle posee demasiadas intersecciones.
+ </string>
+ <string name="mesh_status_missing_lod">
+ Falta un nivel de detalle requerido.
+ </string>
+ <string name="mesh_status_invalid_material_list">
+ Los materiales con niveles de detalle no son un subconjunto del modelo de referencia.
+ </string>
+ <string name="layer_all">
+ Todo
+ </string>
+ <string name="decomposing">
+ Analizando...
+ </string>
+ <string name="simplifying">
+ Simplificando...
+ </string>
+ <string name="tbd">
+ TBD
+ </string>
+ <panel name="left_panel">
+ <panel name="model_name_representation_panel">
+ <text name="name_label">
+ Nombre del modelo:
+ </text>
+ <text name="model_category_label">
+ Este modelo representa...
+ </text>
+ <combo_box name="model_category_combo">
+ <combo_item label="Elegir uno..." name="Choose one"/>
+ <combo_item label="Forma del avatar" name="Avatar shape"/>
+ <combo_item label="Anexo del avatar" name="Avatar attachment"/>
+ <combo_item label="Objeto en movimiento (vehículo, animal)" name="Moving object (vehicle, animal)"/>
+ <combo_item label="Componente de construcción" name="Building Component"/>
+ <combo_item label="Grande, sin movimiento, etc." name="Large, non moving etc"/>
+ <combo_item label="Más pequeño, sin movimiento, etc." name="Smaller, non-moving etc"/>
+ <combo_item label="No es exactamente ninguno de estos" name="Not really any of these"/>
+ </combo_box>
+ </panel>
+ <tab_container name="import_tab">
+ <panel label="Nivel de detalle" name="lod_panel" title="Nivel de detalle">
+ <text initial_value="Origen" name="source" value="Origen"/>
+ <text initial_value="Triángulos" name="triangles" value="Triángulos"/>
+ <text initial_value="Vértices" name="vertices" value="Vértices"/>
+ <text initial_value="Alto" name="high_label" value="Alto"/>
+ <button label="Buscar..." name="lod_browse_high"/>
+ <text initial_value="0" name="high_triangles" value="0"/>
+ <text initial_value="0" name="high_vertices" value="0"/>
+ <text initial_value="Medio" name="medium_label" value="Medio"/>
+ <button label="Buscar..." name="lod_browse_medium"/>
+ <text initial_value="0" name="medium_triangles" value="0"/>
+ <text initial_value="0" name="medium_vertices" value="0"/>
+ <text initial_value="Bajo" name="low_label" value="Bajo"/>
+ <button label="Buscar..." name="lod_browse_low"/>
+ <text initial_value="0" name="low_triangles" value="0"/>
+ <text initial_value="0" name="low_vertices" value="0"/>
+ <text initial_value="Mínimo" name="lowest_label" value="Mínimo"/>
+ <button label="Buscar..." name="lod_browse_lowest"/>
+ <text initial_value="0" name="lowest_triangles" value="0"/>
+ <text initial_value="0" name="lowest_vertices" value="0"/>
+ <check_box label="Generar normales" name="gen_normals"/>
+ <text initial_value="Ãngulo de pliegue:" name="crease_label" value="Ãngulo de pliegue:"/>
+ <spinner name="crease_angle" value="75"/>
+ </panel>
+ <panel label="Física" name="physics_panel">
+ <panel name="physics geometry">
+ <text name="first_step_name">
+ Paso 1: Nivel de detalle
+ </text>
+ <combo_box name="physics_lod_combo" tool_tip="Niveles de detalle para utilizar con la forma física">
+ <combo_item name="choose_one">
+ Elegir uno...
+ </combo_item>
+ <combo_item name="physics_high">
+ Alto
+ </combo_item>
+ <combo_item name="physics_medium">
+ Medio
+ </combo_item>
+ <combo_item name="physics_low">
+ Bajo
+ </combo_item>
+ <combo_item name="physics_lowest">
+ Mínimo
+ </combo_item>
+ <combo_item name="load_from_file">
+ De archivo
+ </combo_item>
+ </combo_box>
+ <button label="Buscar..." name="physics_browse"/>
+ </panel>
+ <panel name="physics analysis">
+ <text name="method_label">
+ Paso 2: Analizar
+ </text>
+ <text name="analysis_method_label">
+ Método:
+ </text>
+ <text name="quality_label">
+ Calidad:
+ </text>
+ <text name="smooth_method_label">
+ Leve:
+ </text>
+ <check_box label="Cerrar agujeros" name="Close Holes (Slow)"/>
+ <button label="Analizar" name="Decompose"/>
+ <button label="Cancelar" name="decompose_cancel"/>
+ </panel>
+ <panel name="physics simplification">
+ <text name="second_step_label">
+ Paso 3: Simplificar
+ </text>
+ <text name="simp_method_header">
+ Método:
+ </text>
+ <text name="pass_method_header">
+ Pases:
+ </text>
+ <text name="Detail Scale label">
+ Escala de detalle:
+ </text>
+ <text name="Retain%_label">
+ Retención:
+ </text>
+ <combo_box name="Combine Quality" value="1"/>
+ <button label="Simplificar" name="Simplify"/>
+ <button label="Cancelar" name="simplify_cancel"/>
+ </panel>
+ <panel name="physics info">
+ <text name="results_text">
+ Resultados:
+ </text>
+ <text name="physics_triangles">
+ Triángulos: [TRIANGLES],
+ </text>
+ <text name="physics_points">
+ Vértices: [POINTS],
+ </text>
+ <text name="physics_hulls">
+ Apariencias: [HULLS]
+ </text>
+ </panel>
+ </panel>
+ <panel label="Opciones de subida" name="modifiers_panel">
+ <text name="scale_label">
+ Escala (1=sin ajuste de escala):
+ </text>
+ <spinner name="import_scale" value="1.0"/>
+ <text name="dimensions_label">
+ Dimensiones:
+ </text>
+ <text name="import_dimensions">
+ [X] X [Y] X [Z]
+ </text>
+ <check_box label="Incluir texturas" name="upload_textures"/>
+ <text name="include_label">
+ Solo para modelos de avatar:
+ </text>
+ <check_box label="Incluir el peso de la piel" name="upload_skin"/>
+ <check_box label="Incluir posturas de las articulaciones" name="upload_joints"/>
+ <text name="pelvis_offset_label">
+ Desplazamiento Z (subir o bajar el avatar):
+ </text>
+ <spinner name="pelvis_offset" value="0.0"/>
+ </panel>
+ </tab_container>
+ <panel name="weights_and_warning_panel">
+ <button label="Calcular pesos y precio" name="calculate_btn" tool_tip="Calcular pesos y precio"/>
+ <button label="Cancelar" name="cancel_btn"/>
+ <button label="subir" name="ok_btn" tool_tip="Subir al simulador"/>
+ <button label="Limpiar la configuración y reiniciar el formulario" name="reset_btn"/>
+ <text name="upload_fee">
+ Precio de subida: L$ [FEE]
+ </text>
+ <text name="prim_weight">
+ Impacto en el terreno: [EQ]
+ </text>
+ <text name="download_weight">
+ Descargar: [ST]
+ </text>
+ <text name="physics_weight">
+ Física: [PH]
+ </text>
+ <text name="server_weight">
+ Servidor: [SIM]
+ </text>
+ <text name="warning_title">
+ NOTA:
+ </text>
+ <text name="warning_message">
+ No tienes derechos para subir modelos de malla. [[VURL] Averigua cómo] puedes obtener la autorización.
+ </text>
+ <text name="status">
+ [STATUS]
+ </text>
+ </panel>
+ </panel>
+ <text name="lod_label">
+ Vista previa:
+ </text>
+ <panel name="right_panel">
+ <combo_box name="preview_lod_combo" tool_tip="LOD para ver en renderizado de prueba">
+ <combo_item name="high">
+ Alto
+ </combo_item>
+ <combo_item name="medium">
+ Media
+ </combo_item>
+ <combo_item name="low">
+ Bajo
+ </combo_item>
+ <combo_item name="lowest">
+ Mínimo
+ </combo_item>
+ </combo_box>
+ <text name="label_display">
+ Mostrar...
+ </text>
+ <check_box label="Bordes" name="show_edges"/>
+ <check_box label="Física" name="show_physics"/>
+ <check_box label="Texturas" name="show_textures"/>
+ <check_box label="Pesos de la piel" name="show_skin_weight"/>
+ <check_box label="Articulaciones" name="show_joint_positions"/>
+ <text name="physics_explode_label">
+ Ampliación de vista previa:
+ </text>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_moveview.xml b/indra/newview/skins/default/xui/es/floater_moveview.xml
index 258f84c361..0e7b950bd3 100644
--- a/indra/newview/skins/default/xui/es/floater_moveview.xml
+++ b/indra/newview/skins/default/xui/es/floater_moveview.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="move_floater">
+<floater name="move_floater" title="CAMINAR / CORRER / VOLAR">
<string name="walk_forward_tooltip">
Caminar hacia adelante (cursor arriba o W)
</string>
@@ -58,14 +58,14 @@
Volar
</string>
<panel name="panel_actions">
- <button label="" label_selected="" name="move up btn" tool_tip="Volar (pulsa E para subir)"/>
<button label="" label_selected="" name="turn left btn" tool_tip="Girar a la izq. (cursor izq. o A)"/>
<joystick_slide name="move left btn" tool_tip="Caminar a la izq. (pulsa Mayúsculas + cursor izq. o A)"/>
- <button label="" label_selected="" name="move down btn" tool_tip="Volar (pulsa C para descender)"/>
<button label="" label_selected="" name="turn right btn" tool_tip="Girar a la der. (cursor der. o D)"/>
<joystick_slide name="move right btn" tool_tip="Caminar a la der. (pulsa Mayúsculas + cursor der. o D)"/>
<joystick_turn name="forward btn" tool_tip="Caminar hacia adelante (cursor arriba o W)"/>
<joystick_turn name="backward btn" tool_tip="Caminar de espaldas (cursor abajo o S)"/>
+ <button label="" label_selected="" name="move up btn" tool_tip="Volar (pulsa E para subir)"/>
+ <button label="" label_selected="" name="move down btn" tool_tip="Volar (pulsa C para descender)"/>
</panel>
<panel name="panel_modes">
<button label="" name="mode_walk_btn" tool_tip="Modo de caminar"/>
diff --git a/indra/newview/skins/default/xui/es/floater_my_appearance.xml b/indra/newview/skins/default/xui/es/floater_my_appearance.xml
new file mode 100644
index 0000000000..774babf04e
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_my_appearance.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_my_appearance" title="APARIENCIA">
+ <panel label="Modificar la apariencia" name="main_panel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_my_inventory.xml b/indra/newview/skins/default/xui/es/floater_my_inventory.xml
new file mode 100644
index 0000000000..0efd9f1c6d
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_my_inventory.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_my_inventory" title="INVENTARIO"/>
diff --git a/indra/newview/skins/default/xui/es/floater_nearby_chat.xml b/indra/newview/skins/default/xui/es/floater_nearby_chat.xml
index 1fee9ab056..b3b8cdcfff 100644
--- a/indra/newview/skins/default/xui/es/floater_nearby_chat.xml
+++ b/indra/newview/skins/default/xui/es/floater_nearby_chat.xml
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="nearby_chat" title="CHAT">
- <check_box label="Traducir chat (mediante Google)" name="translate_chat_checkbox"/>
+ <check_box label="Traducir chat" name="translate_chat_checkbox"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_object_weights.xml b/indra/newview/skins/default/xui/es/floater_object_weights.xml
new file mode 100644
index 0000000000..50c4f0518d
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_object_weights.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="object_weights" title="AVANZADAS">
+ <floater.string name="nothing_selected" value="--"/>
+ <text name="selected_text" value="SELECCIONADOS"/>
+ <text name="objects" value="--"/>
+ <text name="objects_label" value="Objetos"/>
+ <text name="prims" value="--"/>
+ <text name="prims_label" value="Primitivas"/>
+ <text name="weights_of_selected_text" value="PESOS DE SELECCIONADOS"/>
+ <text name="download" value="--"/>
+ <text name="download_label" value="Descargar"/>
+ <text name="physics" value="--"/>
+ <text name="physics_label" value="Física"/>
+ <text name="server" value="--"/>
+ <text name="server_label" value="Servidor"/>
+ <text name="display" value="--"/>
+ <text name="display_label" value="Mostrar"/>
+ <text name="land_impacts_text" value="IMPACTOS EN EL TERRENO"/>
+ <text name="selected" value="--"/>
+ <text name="selected_label" value="Seleccionados"/>
+ <text name="rezzed_on_land" value="--"/>
+ <text name="rezzed_on_land_label" value="Colocados en el terreno"/>
+ <text name="remaining_capacity" value="--"/>
+ <text name="remaining_capacity_label" value="Capacidad restante"/>
+ <text name="total_capacity" value="--"/>
+ <text name="total_capacity_label" value="Capacidad total"/>
+ <text name="help_SLURL" value="[secondlife:///app/help/object_weights ¿Qué es todo esto?...]"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_outfit_save_as.xml b/indra/newview/skins/default/xui/es/floater_outfit_save_as.xml
new file mode 100644
index 0000000000..f48d0d2d0c
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_outfit_save_as.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="modal container" title="GUARDAR EL VESTUARIO"/>
diff --git a/indra/newview/skins/default/xui/es/floater_people.xml b/indra/newview/skins/default/xui/es/floater_people.xml
new file mode 100644
index 0000000000..f5a3eab008
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_people.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_people" title="GENTE">
+ <panel_container name="main_panel">
+ <panel label="Perfil del grupo" name="panel_group_info_sidetray"/>
+ <panel label="Residentes y objetos ignorados" name="panel_block_list_sidetray"/>
+ </panel_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_picks.xml b/indra/newview/skins/default/xui/es/floater_picks.xml
new file mode 100644
index 0000000000..255aa5dcdc
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_picks.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_picks" title="Destacados"/>
diff --git a/indra/newview/skins/default/xui/es/floater_places.xml b/indra/newview/skins/default/xui/es/floater_places.xml
new file mode 100644
index 0000000000..12c6548205
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_places.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_places" title="LUGARES">
+ <panel label="Lugares" name="main_panel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_postcard.xml b/indra/newview/skins/default/xui/es/floater_postcard.xml
index df94486c0e..b5b9805fe2 100644
--- a/indra/newview/skins/default/xui/es/floater_postcard.xml
+++ b/indra/newview/skins/default/xui/es/floater_postcard.xml
@@ -1,29 +1,25 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Postcard" title="FOTO POR CORREO">
<text name="to_label">
- Correo electrónico
- del destinatario:
- </text>
- <line_editor bottom_delta="-20" name="to_form"/>
- <text bottom_delta="-12" name="from_label">
- Su correo
- electrónico:
- </text>
- <line_editor bottom_delta="-20" name="from_form"/>
+ Correo del destinatario:
+ </text>
+ <text name="from_label">
+ Su correo:
+ </text>
<text name="name_label">
Su nombre:
- </text>
+ </text>
<text name="subject_label">
Asunto:
</text>
<line_editor label="Escriba aquí el asunto." name="subject_form"/>
- <text bottom_delta="-18" name="msg_label">
+ <text name="msg_label">
Mensaje:
</text>
<text_editor name="msg_form">
Escriba aquí el mensaje.
</text_editor>
- <text bottom_delta="-21" name="fine_print">
+ <text name="fine_print">
Si su destinatario se registra en [SECOND_LIFE],
usted conseguirá un bono de referido.
</text>
diff --git a/indra/newview/skins/default/xui/es/floater_preferences.xml b/indra/newview/skins/default/xui/es/floater_preferences.xml
index 61f12fc0d7..372680f55d 100644
--- a/indra/newview/skins/default/xui/es/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/es/floater_preferences.xml
@@ -5,10 +5,12 @@
<tab_container name="pref core">
<panel label="General" name="general"/>
<panel label="Gráficos" name="display"/>
- <panel label="Privacidad" name="im"/>
<panel label="Sonido y Media" name="audio"/>
<panel label="Chat" name="chat"/>
+ <panel label="Mover y ver" name="move"/>
<panel label="Notificaciones" name="msgs"/>
+ <panel label="Colores" name="colors"/>
+ <panel label="Privacidad" name="im"/>
<panel label="Configurar" name="input"/>
<panel label="Avanzado" name="advanced1"/>
</tab_container>
diff --git a/indra/newview/skins/default/xui/es/floater_preferences_proxy.xml b/indra/newview/skins/default/xui/es/floater_preferences_proxy.xml
new file mode 100644
index 0000000000..f656f5d662
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_preferences_proxy.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Proxy Settings Floater" title="Configuración de proxy">
+ <check_box initial_value="false" label="Usar proxy HTTP para páginas web" name="web_proxy_enabled"/>
+ <text name="http_proxy_label">
+ Proxy HTTP:
+ </text>
+ <line_editor name="web_proxy_editor" tool_tip="El nombre DNS o la dirección IP del proxy HTTP que quieres usar."/>
+ <spinner label="Nº del puerto:" name="web_proxy_port" tool_tip="El puerto del proxy HTTP que quieres usar."/>
+ <check_box label="Usar proxy SOCKS 5 para el tráfico UDP" name="socks_proxy_enabled"/>
+ <text name="socks5_proxy_label">
+ Proxy SOCKS 5:
+ </text>
+ <line_editor name="socks_proxy_editor" tool_tip="El nombre DNS o la dirección IP del proxy SOCKS 5 que quieres usar."/>
+ <spinner label="Nº del puerto:" name="socks_proxy_port" tool_tip="El puerto del proxy SOCKS 5 que quieres usar."/>
+ <text name="socks_auth_label">
+ Autenticación SOCKS:
+ </text>
+ <radio_group name="socks5_auth_type">
+ <radio_item label="Sin autenticación" name="Socks5NoAuth" tool_tip="El proxy Socks5 no necesita autenticación." value="Ninguno"/>
+ <radio_item label="Nombre de usuario/contraseña" name="Socks5UserPass" tool_tip="El proxy Socks5 necesita autenticación con nombre de usuario y contraseña." value="UserPass"/>
+ </radio_group>
+ <text name="socks5_username_label">
+ Nombre de usuario:
+ </text>
+ <text name="socks5_password_label">
+ Contraseña:
+ </text>
+ <line_editor name="socks5_username" tool_tip="El nombre de usuario utilizado para la autenticación con tu servidor SOCKS 5"/>
+ <line_editor name="socks5_password" tool_tip="La contraseña utilizada para la autenticación con tu servidor SOCKS 5"/>
+ <text name="other_proxy_label">
+ Otro proxy de tráfico HTTP:
+ </text>
+ <radio_group name="other_http_proxy_type">
+ <radio_item label="No usar proxy" name="OtherNoProxy" tool_tip="El tráfico HTTP no web NO se enviará a un proxy." value="Ninguno"/>
+ <radio_item label="Usar proxy HTTP" name="OtherHTTPProxy" tool_tip="HTTP no web se transmitirá a través del proxy web configurado." value="Web"/>
+ <radio_item label="Usar Proxy SOCKS 5" name="OtherSocksProxy" tool_tip="El tráfico HTTP no web se transmitirá a través del proxy Socks 5 configurado." value="Socks"/>
+ </radio_group>
+ <button label="OK" label_selected="OK" name="OK"/>
+ <button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_preview_animation.xml b/indra/newview/skins/default/xui/es/floater_preview_animation.xml
index 6b8c8b6ff5..c3f377a71a 100644
--- a/indra/newview/skins/default/xui/es/floater_preview_animation.xml
+++ b/indra/newview/skins/default/xui/es/floater_preview_animation.xml
@@ -6,6 +6,6 @@
<text name="desc txt">
Descripción:
</text>
- <button label="Ver en el mundo" label_selected="Parar" left="12" name="Anim play btn" tool_tip="Ejecutar esta animación de modo que puedan verla los demás" width="142"/>
- <button label="Ejecutarla para usted" label_selected="Parar" left="156" name="Anim audition btn" tool_tip="Ejecutar esta animación de modo que sólo la vea yo" width="136"/>
+ <button label="Ver en el mundo" label_selected="Parar" name="Anim play btn" tool_tip="Ejecutar esta animación de modo que puedan verla los demás" width="130"/>
+ <button label="Ejecutarla para usted" label_selected="Parar" left="135" name="Anim audition btn" tool_tip="Ejecutar esta animación de modo que sólo la vea yo" width="130"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_preview_classified.xml b/indra/newview/skins/default/xui/es/floater_preview_classified.xml
deleted file mode 100644
index d9c9c51ba8..0000000000
--- a/indra/newview/skins/default/xui/es/floater_preview_classified.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="classified_preview" title="INFORMACIÓN DEL CLASIFICADO">
- <floater.string name="Title">
- Clasificado: [NAME]
- </floater.string>
-</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_preview_event.xml b/indra/newview/skins/default/xui/es/floater_preview_event.xml
deleted file mode 100644
index 7edd4f9e3f..0000000000
--- a/indra/newview/skins/default/xui/es/floater_preview_event.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="event_preview" title="INFORMACIÓN DEL EVENTO">
- <floater.string name="Title">
- Evento: [NAME]
- </floater.string>
-</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_preview_gesture.xml b/indra/newview/skins/default/xui/es/floater_preview_gesture.xml
index c58eb227aa..bd13262dcd 100644
--- a/indra/newview/skins/default/xui/es/floater_preview_gesture.xml
+++ b/indra/newview/skins/default/xui/es/floater_preview_gesture.xml
@@ -30,15 +30,15 @@
<text name="trigger_label">
Palabra clave:
</text>
- <text left="208" name="replace_text" tool_tip="Reemplaza la/s palabra/s clave con estas palabras. Por ejemplo, si cambia la palabra clave &apos;hola&apos; por &apos;qué tal&apos;, se cambiará en el chat &apos;Quise decir hola&apos; por &apos;Quise decir qué tal&apos; en cuanto realice el gesto.">
+ <text name="replace_text" tool_tip="Reemplaza la/s palabra/s clave con estas palabras. Por ejemplo, si cambia la palabra clave &apos;hola&apos; por &apos;qué tal&apos;, se cambiará en el chat &apos;Quise decir hola&apos; por &apos;Quise decir qué tal&apos; en cuanto realice el gesto.">
Reemplazar por:
</text>
<line_editor name="replace_editor" tool_tip="Reemplaza la/s palabra/s clave con estas palabras. Por ejemplo, si cambia la palabra clave &apos;hola&apos; por &apos;qué tal&apos;, se cambiará en el chat &apos;Quise decir hola&apos; por &apos;Quise decir qué tal&apos; en cuanto realice el gesto."/>
<text name="key_label">
Atajo de teclado:
</text>
- <combo_box label="Ninguno" left="116" name="modifier_combo" width="76"/>
- <combo_box label="Ninguno" left_delta="80" name="key_combo" width="76"/>
+ <combo_box label="Ninguno" name="modifier_combo" width="76"/>
+ <combo_box label="Ninguno" name="key_combo" width="50"/>
<text name="library_label">
Biblioteca:
</text>
@@ -55,20 +55,20 @@
<button label="Arriba" name="up_btn"/>
<button label="Abajo" name="down_btn"/>
<button label="Quitar" name="delete_btn"/>
- <text left="230" name="options_text" width="200">
+ <text name="options_text" width="200">
(opciones)
</text>
<radio_group name="animation_trigger_type">
<radio_item label="Empezar" name="start"/>
<radio_item label="Parar" name="stop"/>
</radio_group>
- <check_box bottom_delta="34" label="hasta que las animaciones estén hechas" name="wait_anim_check"/>
- <check_box bottom_delta="-30" label="tiempo en segundos:" name="wait_time_check"/>
- <line_editor left_delta="130" name="wait_time_editor"/>
+ <check_box label="hasta que las animaciones estén hechas" name="wait_anim_check"/>
+ <check_box label="tiempo en segundos:" name="wait_time_check"/>
+ <line_editor name="wait_time_editor"/>
<text name="help_label">
Todos los pasos suceden a la vez, a menos que añadas pasos de espera.
</text>
- <check_box label="Disponible" left="130" name="active_check" tool_tip="Los gestos disponibles pueden realizarse escribiendo en el chat su frase clave o pulsando su tecla de acceso rápido. Generalmente, los gestos pasan a no disponibles cuando hay un conflicto de teclas."/>
- <button label="Vista previa" name="preview_btn" width="85"/>
+ <check_box label="Disponible" name="active_check" tool_tip="Los gestos disponibles pueden realizarse escribiendo en el chat su frase clave o pulsando su tecla de acceso rápido. Generalmente, los gestos pasan a no disponibles cuando hay un conflicto de teclas."/>
+ <button label="Vista previa" name="preview_btn" width="82"/>
<button label="Guardar" name="save_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_price_for_listing.xml b/indra/newview/skins/default/xui/es/floater_price_for_listing.xml
new file mode 100644
index 0000000000..8d6cdc86c0
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_price_for_listing.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="price_for_listing" title="PUBLICAR UN ANUNCIO CLASIFICADO">
+ <text name="explanation_text">
+ Tu anuncio clasificado se mostrará durante una semana a partir del día en que se publicó.
+
+La posición de tu anuncio en la lista de clasificados depende de cuánto elijas pagar.
+
+Los anuncios mejor pagados van al principio de la lista, y aparecen más arriba en las búsquedas.
+ </text>
+ <text name="price_text">
+ Precio por el anuncio:
+ </text>
+ <text name="price_symbol">
+ L$
+ </text>
+ <button label="OK" name="set_price_btn"/>
+ <button label="Cancelar" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_region_debug_console.xml b/indra/newview/skins/default/xui/es/floater_region_debug_console.xml
new file mode 100644
index 0000000000..40851f897e
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_region_debug_console.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="region_debug_console" title="Depuración de región"/>
diff --git a/indra/newview/skins/default/xui/es/floater_report_abuse.xml b/indra/newview/skins/default/xui/es/floater_report_abuse.xml
index 760429e73d..dc5d430375 100644
--- a/indra/newview/skins/default/xui/es/floater_report_abuse.xml
+++ b/indra/newview/skins/default/xui/es/floater_report_abuse.xml
@@ -67,8 +67,8 @@
<combo_box.item label="Acoso &gt; Abuso verbal" name="Harassment__Verbal_abuse"/>
<combo_box.item label="Indecencia &gt; En general, contenido o conducta ofensivos" name="Indecency__Broadly_offensive_content_or_conduct"/>
<combo_box.item label="Indecencia &gt; Nombre inapropiado del avatar" name="Indecency__Inappropriate_avatar_name"/>
- <combo_box.item label="Indecencia &gt; Contenido o conducta inapropiada en una región &apos;PG&apos;" name="Indecency__Mature_content_in_PG_region"/>
- <combo_box.item label="Indecencia &gt; Contenido o conducta inapropiada en una región &apos;Mature&apos;" name="Indecency__Inappropriate_content_in_Mature_region"/>
+ <combo_box.item label="Indecencia &gt; Contenido o conducta inapropiada en una región General" name="Indecency__Mature_content_in_PG_region"/>
+ <combo_box.item label="Indecencia &gt; Contenido o conducta inapropiada en una región Moderado" name="Indecency__Inappropriate_content_in_Mature_region"/>
<combo_box.item label="Infracción de la propiedad intelectual &gt; Eliminación de contenidos" name="Intellectual_property_infringement_Content_Removal"/>
<combo_box.item label="Infracción de la propiedad intelectual &gt; CopyBot o Exploit (programa malicioso) de permisos" name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit"/>
<combo_box.item label="Intolerancia" name="Intolerance"/>
diff --git a/indra/newview/skins/default/xui/es/floater_search.xml b/indra/newview/skins/default/xui/es/floater_search.xml
index 377b848530..e24d8064a1 100644
--- a/indra/newview/skins/default/xui/es/floater_search.xml
+++ b/indra/newview/skins/default/xui/es/floater_search.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_search" title="ENCONTRAR">
+<floater name="floater_search" title="">
<floater.string name="loading_text">
Cargando...
</floater.string>
diff --git a/indra/newview/skins/default/xui/es/floater_sell_land.xml b/indra/newview/skins/default/xui/es/floater_sell_land.xml
index efedb5d689..d883683945 100644
--- a/indra/newview/skins/default/xui/es/floater_sell_land.xml
+++ b/indra/newview/skins/default/xui/es/floater_sell_land.xml
@@ -54,8 +54,8 @@
<radio_item label="No, mantener la propiedad de los objetos" name="no"/>
<radio_item label="Sí, vender los objetos con el terreno" name="yes"/>
</radio_group>
- <button label="Mostrar los objetos" name="show_objects" width="120"/>
- <text name="nag_message_label">
+ <button label="Mostrar los objetos" name="show_objects"/>
+ <text name="nag_message_label" font="SansSerifSmallBold" left="10">
RECUERDA: todas las ventas son definitivas.
</text>
<button label="Poner en venta el terreno" name="sell_btn"/>
diff --git a/indra/newview/skins/default/xui/es/floater_settings_debug.xml b/indra/newview/skins/default/xui/es/floater_settings_debug.xml
index bca1839f09..1da2e491e1 100644
--- a/indra/newview/skins/default/xui/es/floater_settings_debug.xml
+++ b/indra/newview/skins/default/xui/es/floater_settings_debug.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="settings_debug" title="CONFIGURACIONES DEL DEPURADOR">
<radio_group name="boolean_combo">
- <radio_item label="VERDADERO" name="TRUE" value="verdadero"/>
- <radio_item label="FALSO" name="FALSE" value=""/>
+ <radio_item label="VERDADERO" name="TRUE" />
+ <radio_item label="FALSO" name="FALSE" />
</radio_group>
<color_swatch label="Color" name="val_color_swatch"/>
<spinner label="x" name="val_spinner_1"/>
diff --git a/indra/newview/skins/default/xui/es/floater_snapshot.xml b/indra/newview/skins/default/xui/es/floater_snapshot.xml
index eafc623ea9..23078b3a55 100644
--- a/indra/newview/skins/default/xui/es/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/es/floater_snapshot.xml
@@ -3,73 +3,63 @@
<floater.string name="unknown">
desconocido
</floater.string>
- <radio_group label="Tipo de foto" name="snapshot_type_radio">
- <radio_item label="Correo-e" name="postcard"/>
- <radio_item label="Mi inventario ([AMOUNT] L$)" name="texture"/>
- <radio_item label="Guardar en mi ordenador" name="local"/>
- </radio_group>
+ <string name="postcard_progress_str">
+ Enviando el correo electrónico
+ </string>
+ <string name="profile_progress_str">
+ Publicando
+ </string>
+ <string name="inventory_progress_str">
+ Guardando en el inventario
+ </string>
+ <string name="local_progress_str">
+ Guardando en el equipo
+ </string>
+ <string name="profile_succeeded_str">
+ Imagen subida
+ </string>
+ <string name="postcard_succeeded_str">
+ Correo electrónico enviado
+ </string>
+ <string name="inventory_succeeded_str">
+ ¡Guardado en el inventario!
+ </string>
+ <string name="local_succeeded_str">
+ ¡Guardado en el equipo!
+ </string>
+ <string name="profile_failed_str">
+ Error al subir la imagen a los comentarios de tu perfil.
+ </string>
+ <string name="postcard_failed_str">
+ Error al enviar el correo electrónico.
+ </string>
+ <string name="inventory_failed_str">
+ Error al guardar en el inventario.
+ </string>
+ <string name="local_failed_str">
+ Error al guardar en el equipo.
+ </string>
+ <button name="advanced_options_btn" tool_tip="Opciones avanzadas"/>
+ <text name="image_res_text">
+ [WIDTH] x [HEIGHT] px
+ </text>
<text name="file_size_label">
[SIZE] kB
</text>
- <button label="Actualizar la foto" name="new_snapshot_btn"/>
- <button label="Enviar" name="send_btn"/>
- <button label="Ahorro ([AMOUNT] L$)" name="upload_btn"/>
- <flyout_button label="Guardar" name="save_btn" tool_tip="Guardar la imagen en un archivo">
- <flyout_button.item label="Guardar" name="save_item"/>
- <flyout_button.item label="Guardar como..." name="saveas_item"/>
- </flyout_button>
- <button label="Más" name="more_btn" tool_tip="Opciones avanzadas"/>
- <button label="Menos" name="less_btn" tool_tip="Opciones avanzadas"/>
- <button label="Cancelar" name="discard_btn"/>
- <text name="type_label2">
- Tamaño
- </text>
- <text name="format_label">
- Formato
- </text>
- <combo_box label="Resolución" name="postcard_size_combo">
- <combo_box.item label="Ventana actual" name="CurrentWindow"/>
- <combo_box.item label="640x480" name="640x480"/>
- <combo_box.item label="800x600" name="800x600"/>
- <combo_box.item label="1024x768" name="1024x768"/>
- <combo_box.item label="Personalizado" name="Custom"/>
- </combo_box>
- <combo_box label="Resolución" name="texture_size_combo">
- <combo_box.item label="Ventana actual" name="CurrentWindow"/>
- <combo_box.item label="Pequeña (128x128)" name="Small(128x128)"/>
- <combo_box.item label="Mediana (256x256)" name="Medium(256x256)"/>
- <combo_box.item label="Grande (512x512)" name="Large(512x512)"/>
- <combo_box.item label="Personalizado" name="Custom"/>
- </combo_box>
- <combo_box label="Resolución" name="local_size_combo">
- <combo_box.item label="Ventana actual" name="CurrentWindow"/>
- <combo_box.item label="320x240" name="320x240"/>
- <combo_box.item label="640x480" name="640x480"/>
- <combo_box.item label="800x600" name="800x600"/>
- <combo_box.item label="1024x768" name="1024x768"/>
- <combo_box.item label="1280x1024" name="1280x1024"/>
- <combo_box.item label="1600x1200" name="1600x1200"/>
- <combo_box.item label="Personalizado" name="Custom"/>
- </combo_box>
- <combo_box label="Formato" name="local_format_combo">
- <combo_box.item label="PNG" name="PNG"/>
- <combo_box.item label="JPEG" name="JPEG"/>
- <combo_box.item label="BMP" name="BMP"/>
- </combo_box>
- <spinner label="Ancho" name="snapshot_width"/>
- <spinner label="Altura" name="snapshot_height"/>
- <check_box label="Mantener las proporciones" name="keep_aspect_check"/>
- <slider label="Calidad de la imagen" name="image_quality_slider"/>
- <text name="layer_type_label">
- Captura:
- </text>
- <combo_box label="Capas de imagen" name="layer_types">
- <combo_box.item label="Colores" name="Colors"/>
- <combo_box.item label="Profundidad" name="Depth"/>
- </combo_box>
- <check_box label="Interfaz" name="ui_check"/>
- <check_box label="HUDs" name="hud_check"/>
- <check_box label="Mantener abierto después de guardar" name="keep_open_check"/>
- <check_box label="Congelar la toma (pantalla completa)" name="freeze_frame_check"/>
- <check_box label="Actualizar automáticamente" name="auto_snapshot_check"/>
+ <panel name="advanced_options_panel">
+ <text name="advanced_options_label">
+ OPCIONES AVANZADAS
+ </text>
+ <text name="layer_type_label">
+ Captura:
+ </text>
+ <combo_box label="Capas de imagen" name="layer_types">
+ <combo_box.item label="Colores" name="Colors"/>
+ <combo_box.item label="Profundidad" name="Depth"/>
+ </combo_box>
+ <check_box label="Interfaz" name="ui_check"/>
+ <check_box label="HUDs" name="hud_check"/>
+ <check_box label="Congelar la toma (pantalla completa)" name="freeze_frame_check"/>
+ <check_box label="Actualizar automáticamente" name="auto_snapshot_check"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_sound_devices.xml b/indra/newview/skins/default/xui/es/floater_sound_devices.xml
new file mode 100644
index 0000000000..0291f9e796
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_sound_devices.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_sound_devices" title="DISPOSITIVOS DE SONIDO">
+ <text name="voice_label">
+ Chat de voz
+ </text>
+ <check_box label="Activados" name="enable_voice"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_stats.xml b/indra/newview/skins/default/xui/es/floater_stats.xml
index 5f4fabf375..ba4af2e866 100644
--- a/indra/newview/skins/default/xui/es/floater_stats.xml
+++ b/indra/newview/skins/default/xui/es/floater_stats.xml
@@ -10,8 +10,8 @@
</stat_view>
<stat_view label="Avanzado" name="advanced">
<stat_view label="Renderización" name="render">
- <stat_bar label="KTris generados" name="ktrisframe"/>
- <stat_bar label="KTris generados" name="ktrissec"/>
+ <stat_bar label="KTris generados por fotograma" name="ktrisframe"/>
+ <stat_bar label="KTris generados por segundo" name="ktrissec"/>
<stat_bar label="Objetos en total" name="objs"/>
<stat_bar label="Objetos nuevos" name="newobjs"/>
</stat_view>
@@ -43,18 +43,6 @@
<stat_bar label="Pin de objetos" name="physicspinnedtasks"/>
<stat_bar label="Objetos con bajo nivel de detalle" name="physicslodtasks"/>
<stat_bar label="Memoria asignada" name="physicsmemoryallocated"/>
- <stat_bar label="Agentes: actual./seg." name="simagentups"/>
- <stat_bar label="Agentes del grid principal" name="simmainagents"/>
- <stat_bar label="Agentes secundarios" name="simchildagents"/>
- <stat_bar label="Objetos" name="simobjects"/>
- <stat_bar label="Objetos activos" name="simactiveobjects"/>
- <stat_bar label="Scripts activos" name="simactivescripts"/>
- <stat_bar label="Eventos de scripts" name="simscripteps"/>
- <stat_bar label="Paquetes salientes" name="siminpps"/>
- <stat_bar label="Paquetes entrantes" name="simoutpps"/>
- <stat_bar label="Descargas pendientes" name="simpendingdownloads"/>
- <stat_bar label="Subidas pendientes" name="simpendinguploads"/>
- <stat_bar label="Total de bytes no reconocidos" name="simtotalunackedbytes"/>
</stat_view>
<stat_view label="Tiempo (ms)" name="simperf">
<stat_bar label="Tiempo total de los frames" name="simframemsec"/>
@@ -64,6 +52,14 @@
<stat_bar label="Tiempo de los agentes" name="simagentmsec"/>
<stat_bar label="Tiempo de las imágenes" name="simimagesmsec"/>
<stat_bar label="Tiempo de los scripts" name="simscriptmsec"/>
+ <stat_bar label="Tiempo libre" name="simsparemsec"/>
+ <stat_view label="Datos de tiempo (ms)" name="timedetails">
+ <stat_bar label="Paso de física" name="simsimphysicsstepmsec"/>
+ <stat_bar label="Actualizar formas físicas" name="simsimphysicsshapeupdatemsec"/>
+ <stat_bar label="Otros (Física)" name="simsimphysicsothermsec"/>
+ <stat_bar label="Tiempo de suspensión" name="simsleepmsec"/>
+ <stat_bar label="E/S bombeo" name="simpumpiomsec"/>
+ </stat_view>
</stat_view>
</stat_view>
</container_view>
diff --git a/indra/newview/skins/default/xui/es/floater_test_layout_stacks.xml b/indra/newview/skins/default/xui/es/floater_test_layout_stacks.xml
new file mode 100644
index 0000000000..b479d5f6d6
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_test_layout_stacks.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Test Floater" title="LAYOUTSTACK TESTS"/>
diff --git a/indra/newview/skins/default/xui/es/floater_tools.xml b/indra/newview/skins/default/xui/es/floater_tools.xml
index d85b43b7e8..650b4b457d 100644
--- a/indra/newview/skins/default/xui/es/floater_tools.xml
+++ b/indra/newview/skins/default/xui/es/floater_tools.xml
@@ -24,20 +24,11 @@
<floater.string name="status_selectland">
Pulsa y arrastra para seleccionar el terreno.
</floater.string>
- <floater.string name="grid_screen_text">
- Pantalla
+ <floater.string name="status_selectcount">
+ [OBJ_COUNT] objetos seleccionados, impacto en el terreno [LAND_IMPACT]
</floater.string>
- <floater.string name="grid_local_text">
- Local
- </floater.string>
- <floater.string name="grid_world_text">
- Mundo
- </floater.string>
- <floater.string name="grid_reference_text">
- Referencia
- </floater.string>
- <floater.string name="grid_attachment_text">
- Añadido
+ <floater.string name="status_remaining_capacity">
+ Capacidad restante [LAND_CAPACITY].
</floater.string>
<button label="" label_selected="" name="button focus" tool_tip="Visión"/>
<button label="" label_selected="" name="button move" tool_tip="Mover"/>
@@ -58,26 +49,20 @@
<radio_item label="Horizontal (Ctrl+Shift)" name="radio spin"/>
</radio_group>
<radio_group name="edit_radio_group">
- <radio_item label="Moverse" name="radio position"/>
+ <radio_item label="Mover" name="radio position"/>
<radio_item label="Girar (Ctrl)" name="radio rotate"/>
<radio_item label="Estirar (Ctrl+Shift)" name="radio stretch"/>
<radio_item label="Elegir la cara" name="radio select face"/>
</radio_group>
<check_box label="Editar las partes enlazadas" name="checkbox edit linked parts"/>
- <text name="RenderingCost" tool_tip="Muestra cuánto se calcula que cuesta renderizar este objeto">
- þ: [COUNT]
- </text>
+ <button label="Enlazar" name="link_btn"/>
+ <button label="Desenlazar" name="unlink_btn" width="95"/>
<check_box label="" name="checkbox uniform"/>
<text label="Estirar ambos lados" name="checkbox uniform label">
Estirar ambos lados
</text>
<check_box initial_value="true" label="Estirar las texturas" name="checkbox stretch textures"/>
- <check_box initial_value="true" label="Usar la cuadrícula" name="checkbox snap to grid"/>
- <combo_box name="combobox grid mode" tool_tip="Elige qué cuadricula usar para posicionar el objeto" width="82">
- <combo_box.item label="Mundo" name="World"/>
- <combo_box.item label="Local" name="Local"/>
- <combo_box.item label="Referencia" name="Reference"/>
- </combo_box>
+ <check_box initial_value="true" label="Intervalo" name="checkbox snap to grid"/>
<button label="Opciones..." label_selected="Opciones..." name="Options..." tool_tip="Ver más opciones de la cuadrícula"/>
<button label="" label_selected="" name="ToolCube" tool_tip="Cubo"/>
<button label="" label_selected="" name="ToolPrism" tool_tip="Prisma"/>
@@ -117,11 +102,11 @@
Fuerza
</text>
<button label="Aplicar" label_selected="Aplicar" left="146" name="button apply to selection" tool_tip="Modificar el terreno seleccionado"/>
- <text left="134" name="obj_count">
- Objetos: [COUNT]
+ <text name="selection_empty">
+ No está seleccionado nada.
</text>
- <text left="134" name="prim_count">
- Primitivas: [COUNT]
+ <text name="remaining_capacity">
+ [CAPACITY_STRING] [secondlife:///app/openfloater/object_weights Más información]
</text>
<tab_container name="Object Info Tabs" tab_max_width="62" tab_min_width="30" width="288">
<panel label="General" name="General">
@@ -170,15 +155,9 @@
<text name="Creator:">
Creador:
</text>
- <text name="Creator Name">
- Dª Esbee Linden (esbee.linden)
- </text>
<text name="Owner:">
Propietario:
</text>
- <text name="Owner Name">
- Dª Erica &quot;Moose&quot; Linden (erica.linden)
- </text>
<text name="Group:">
Grupo:
</text>
@@ -273,15 +252,6 @@
<combo_box.item label="Cono truncado" name="Ring"/>
<combo_box.item label="Sculpted" name="Sculpted"/>
</combo_box>
- <combo_box name="material">
- <combo_box.item label="Piedra" name="Stone"/>
- <combo_box.item label="Metal" name="Metal"/>
- <combo_box.item label="Vidrio" name="Glass"/>
- <combo_box.item label="Madera" name="Wood"/>
- <combo_box.item label="Carne" name="Flesh"/>
- <combo_box.item label="Plástico" name="Plastic"/>
- <combo_box.item label="Goma" name="Rubber"/>
- </combo_box>
<text name="text cut">
Corte (inicio/fin)
</text>
@@ -349,7 +319,6 @@
Tipo de unión
</text>
<combo_box name="sculpt type control">
- <combo_box.item label="(ninguna)" name="None"/>
<combo_box.item label="Esfera" name="Sphere"/>
<combo_box.item label="Toroide" name="Torus"/>
<combo_box.item label="Plano" name="Plane"/>
@@ -357,6 +326,15 @@
</combo_box>
</panel>
<panel label="Caracter." name="Features">
+ <panel.string name="None">
+ Ninguno
+ </panel.string>
+ <panel.string name="Prim">
+ Prim
+ </panel.string>
+ <panel.string name="Convex Hull">
+ Apariencia convexa
+ </panel.string>
<text name="select_single">
Selecciona un sólo prim para editarlo.
</text>
@@ -381,6 +359,23 @@
<spinner label="Visión" name="Light Focus"/>
<spinner label="Atenuación" name="Light Falloff"/>
<spinner label="Ambiental" name="Light Ambiance"/>
+ <text name="label physicsshapetype">
+ Tipo de forma física:
+ </text>
+ <combo_box name="Physics Shape Type Combo Ctrl" tool_tip="Selecciona el tipo de forma física"/>
+ <combo_box name="material">
+ <combo_box.item label="Piedra" name="Stone"/>
+ <combo_box.item label="Metal" name="Metal"/>
+ <combo_box.item label="Cristal" name="Glass"/>
+ <combo_box.item label="Madera" name="Wood"/>
+ <combo_box.item label="Carne" name="Flesh"/>
+ <combo_box.item label="Plástico" name="Plastic"/>
+ <combo_box.item label="Goma" name="Rubber"/>
+ </combo_box>
+ <spinner label="Gravedad" name="Physics Gravity"/>
+ <spinner label="Fricción" name="Physics Friction"/>
+ <spinner label="Densidad en 100 kg/m^3" name="Physics Density"/>
+ <spinner label="Reemplazo" name="Physics Restitution"/>
</panel>
<panel label="Textura" name="Texture">
<panel.string name="string repeats per meter">
@@ -484,7 +479,7 @@
Modificar la parcela
</text>
<button label="Dividir" label_selected="Dividir" name="button subdivide land"/>
- <button label="Inscribirse" label_selected="Inscribirse" name="button join land"/>
+ <button label="Unir" label_selected="Unir" name="button join land"/>
<text name="label_parcel_trans">
Transacciones de terreno
</text>
diff --git a/indra/newview/skins/default/xui/es/floater_top_objects.xml b/indra/newview/skins/default/xui/es/floater_top_objects.xml
index 7c2522e8a9..033633bd22 100644
--- a/indra/newview/skins/default/xui/es/floater_top_objects.xml
+++ b/indra/newview/skins/default/xui/es/floater_top_objects.xml
@@ -39,19 +39,16 @@
<text name="id_text">
ID del objeto:
</text>
- <line_editor font="SansSerifSmall" left="140" name="id_editor" width="280"/>
- <button label="Mostrar la baliza" name="show_beacon_btn" width="115"/>
+ <button label="Mostrar la baliza" name="show_beacon_btn"/>
<text name="obj_name_text">
Nombre del objeto:
</text>
- <line_editor font="SansSerifSmall" left="140" name="object_name_editor" width="280"/>
- <button label="Filtro" name="filter_object_btn" width="115"/>
- <text name="owner_name_text" width="130">
+ <button label="Filtro" name="filter_object_btn"/>
+ <text name="owner_name_text">
Propietario:
</text>
- <line_editor font="SansSerifSmall" left="140" name="owner_name_editor" width="280"/>
- <button label="Filtro" name="filter_owner_btn" width="115"/>
- <button label="Actualizar" name="refresh_btn" width="115"/>
+ <button label="Filtro" name="filter_owner_btn"/>
+ <button label="Actualizar" name="refresh_btn"/>
<button label="Devolver lo seleccionado" name="return_selected_btn" width="170"/>
<button label="Devolver todo" left="190" name="return_all_btn"/>
<button label="Desactivar lo seleccionado" name="disable_selected_btn" width="170"/>
diff --git a/indra/newview/skins/default/xui/es/floater_tos.xml b/indra/newview/skins/default/xui/es/floater_tos.xml
index f4a0897d73..89092201d9 100644
--- a/indra/newview/skins/default/xui/es/floater_tos.xml
+++ b/indra/newview/skins/default/xui/es/floater_tos.xml
@@ -4,7 +4,7 @@
http://secondlife.com/app/tos/
</floater.string>
<floater.string name="loading_url">
- data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Loading %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
+ data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Cargando %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3Elas%20Condiciones%20del%20servicio%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
</floater.string>
<button label="Continuar" label_selected="Continuar" name="Continue"/>
<button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
diff --git a/indra/newview/skins/default/xui/es/floater_toybox.xml b/indra/newview/skins/default/xui/es/floater_toybox.xml
new file mode 100644
index 0000000000..7275b0546b
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_toybox.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Toybox" title="BOTONES DE LA BARRA DE HERRAMIENTAS">
+ <text name="toybox label 1">
+ Puedes agregar o quitar botones arrastrándolos a las barras de herramientas o desde ellas.
+ </text>
+ <text name="toybox label 2">
+ Los botones aparecerán como se muestra o solo como iconos, según la configuración de cada barra de herramientas.
+ </text>
+ <button label="Quitar todas las barras de herramientas" label_selected="Quitar todas las barras de herramientas" name="btn_clear_all"/>
+ <button label="Restaurar valores predeterminados" label_selected="Restaurar valores predeterminados" name="btn_restore_defaults"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_translation_settings.xml b/indra/newview/skins/default/xui/es/floater_translation_settings.xml
new file mode 100644
index 0000000000..765c9a05a2
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_translation_settings.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_translation_settings" title="CONFIGURACIÓN DE LA TRADUCCIÓN DEL CHAT">
+ <string name="bing_api_key_not_verified">
+ appID de Bing no se ha confirmado. Vuelve a intentarlo.
+ </string>
+ <string name="google_api_key_not_verified">
+ La clave de API de Google no se ha confirmado. Vuelve a intentarlo.
+ </string>
+ <string name="bing_api_key_verified">
+ appID de Bing se ha confirmado.
+ </string>
+ <string name="google_api_key_verified">
+ La clave de API de Google se ha confirmado.
+ </string>
+ <check_box label="Activar la traducción automática durante el chat" name="translate_chat_checkbox"/>
+ <text name="translate_language_label">
+ Traducir el chat al:
+ </text>
+ <combo_box name="translate_language_combo">
+ <combo_box.item label="Predeterminado del sistema" name="System Default Language"/>
+ <combo_box.item label="Inglés" name="English"/>
+ <combo_box.item label="Dansk (danés)" name="Danish"/>
+ <combo_box.item label="Deutsch (alemán)" name="German"/>
+ <combo_box.item label="Español (español)" name="Spanish"/>
+ <combo_box.item label="Français (francés)" name="French"/>
+ <combo_box.item label="Italiano (italiano)" name="Italian"/>
+ <combo_box.item label="Magyar (húngaro)" name="Hungarian"/>
+ <combo_box.item label="Nederlands (neerlandés)" name="Dutch"/>
+ <combo_box.item label="Polski (polaco)" name="Polish"/>
+ <combo_box.item label="Português (portugués)" name="Portugese"/>
+ <combo_box.item label="РуÑÑкий (ruso)" name="Russian"/>
+ <combo_box.item label="Türkçe (turco)" name="Turkish"/>
+ <combo_box.item label="УкраїнÑька (ucraniano)" name="Ukrainian"/>
+ <combo_box.item label="中文 (正體) (Chino)" name="Chinese"/>
+ <combo_box.item label="日本語 (japonés)" name="Japanese"/>
+ <combo_box.item label="한국어 (coreano)" name="Korean"/>
+ </combo_box>
+ <text name="tip">
+ Elige el servicio de traducción:
+ </text>
+ <radio_group name="translation_service_rg">
+ <radio_item initial_value="bing" label="Bing Translator" name="bing"/>
+ <radio_item initial_value="google" label="Traductor de Google" name="google"/>
+ </radio_group>
+ <text name="bing_api_key_label">
+ [http://www.bing.com/developers/createapp.aspx AppID] de Bing:
+ </text>
+ <button label="Verificar" name="verify_bing_api_key_btn"/>
+ <text name="google_api_key_label">
+ [http://code.google.com/apis/language/translate/v2/getting_started.html#auth Clave de API] de Google:
+ </text>
+ <button label="Verificar" name="verify_google_api_key_btn"/>
+ <text name="google_links_text">
+ [http://code.google.com/apis/language/translate/v2/pricing.html Precios] | [https://code.google.com/apis/console Estadísticas]
+ </text>
+ <button label="OK" name="ok_btn"/>
+ <button label="Cancelar" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_voice_controls.xml b/indra/newview/skins/default/xui/es/floater_voice_controls.xml
index f02855123c..eff21239be 100644
--- a/indra/newview/skins/default/xui/es/floater_voice_controls.xml
+++ b/indra/newview/skins/default/xui/es/floater_voice_controls.xml
@@ -1,16 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_voice_controls" title="Controles de Voz">
+<floater name="floater_voice_controls" title="CONTROLES DE LA VOZ">
<string name="title_nearby">
- CHAT DE VOZ
+ CONFIGURACIÓN DE VOZ
</string>
<string name="title_group">
- Multiconferencia de voz con [GROUP]
+ MULTICONFERENCIA DE VOZ CON [GROUP]
</string>
<string name="title_adhoc">
- Multiconferencia de voz
+ MULTICONFERENCIA DE VOZ
</string>
<string name="title_peer_2_peer">
- Llamada: [NAME]
+ LLAMADA A [NAME]
</string>
<string name="no_one_near">
Nadie cercano tiene activada la voz
diff --git a/indra/newview/skins/default/xui/es/floater_voice_effect.xml b/indra/newview/skins/default/xui/es/floater_voice_effect.xml
index 5ef4347958..1a265845af 100644
--- a/indra/newview/skins/default/xui/es/floater_voice_effect.xml
+++ b/indra/newview/skins/default/xui/es/floater_voice_effect.xml
@@ -12,6 +12,114 @@
<string name="new_voice_effect">
(¡Nuevo!)
</string>
+ <string name="effect_Arena">
+ Campo
+ </string>
+ <string name="effect_Beast">
+ Bestia
+ </string>
+ <string name="effect_Buff">
+ Musculoso
+ </string>
+ <string name="effect_Buzz">
+ Murmullo
+ </string>
+ <string name="effect_Camille">
+ Camila
+ </string>
+ <string name="effect_Creepy">
+ Aterrador
+ </string>
+ <string name="effect_CreepyBot">
+ Robot aterrador
+ </string>
+ <string name="effect_Cyber">
+ Cyber
+ </string>
+ <string name="effect_DeepBot">
+ Robot profundo
+ </string>
+ <string name="effect_Demon">
+ Diablo
+ </string>
+ <string name="effect_Flirty">
+ Coqueta
+ </string>
+ <string name="effect_Foxy">
+ Astuto
+ </string>
+ <string name="effect_Halloween_2010_Bonus">
+ Halloween_2010_Bonus
+ </string>
+ <string name="effect_Helium">
+ Helio
+ </string>
+ <string name="effect_Husky">
+ Corpulento
+ </string>
+ <string name="effect_Intercom">
+ Intercom
+ </string>
+ <string name="effect_Macho">
+ Macho
+ </string>
+ <string name="effect_Micro">
+ Micro
+ </string>
+ <string name="effect_Mini">
+ Mini
+ </string>
+ <string name="effect_Nano">
+ Nano
+ </string>
+ <string name="effect_Nightmare">
+ Pesadilla
+ </string>
+ <string name="effect_PopBot">
+ Robot pop
+ </string>
+ <string name="effect_Rachel">
+ Raquel
+ </string>
+ <string name="effect_Radio">
+ Radio
+ </string>
+ <string name="effect_Robot">
+ Robot
+ </string>
+ <string name="effect_Roxanne">
+ Roxana
+ </string>
+ <string name="effect_Sabrina">
+ Sabrina
+ </string>
+ <string name="effect_Samantha">
+ Samanta
+ </string>
+ <string name="effect_Sexy">
+ Sexy
+ </string>
+ <string name="effect_Shorty">
+ Bajito
+ </string>
+ <string name="effect_Sneaky">
+ Furtivo
+ </string>
+ <string name="effect_Stallion">
+ Mujeriego
+ </string>
+ <string name="effect_Sultry">
+ Sensual
+ </string>
+ <string name="effect_Thunder">
+ Trueno
+ </string>
+ <string name="effect_Vixen">
+ Tigresa
+ </string>
+ <string name="effect_WhinyBot">
+ Robot llorica
+ </string>
<text name="preview_text">
Para probarla
</text>
diff --git a/indra/newview/skins/default/xui/es/floater_water.xml b/indra/newview/skins/default/xui/es/floater_water.xml
deleted file mode 100644
index 2c1f6cfbfb..0000000000
--- a/indra/newview/skins/default/xui/es/floater_water.xml
+++ /dev/null
@@ -1,88 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Water Floater" title="EDITOR AVANZADO DEL AGUA">
- <text name="KeyFramePresetsText">
- Agua predefinida:
- </text>
- <button label="Nueva" label_selected="Nueva" name="WaterNewPreset"/>
- <button label="Guardar" label_selected="Guardar" name="WaterSavePreset"/>
- <button label="Borrar" label_selected="Borrar" name="WaterDeletePreset"/>
- <tab_container name="Water Tabs">
- <panel label="CONFIGURACIÓN" name="Settings">
- <text name="BHText">
- Color del agua
- </text>
- <button label="?" left="175" name="WaterFogColorHelp"/>
- <color_swatch label="" name="WaterFogColor" tool_tip="Pulsa para abrir el selector de color"/>
- <text name="WaterFogDensText">
- Transparencia
- </text>
- <button label="?" left="175" name="WaterFogDensityHelp"/>
- <text name="WaterUnderWaterFogModText">
- Modificar la claridad del agua
- </text>
- <button label="?" left="175" name="WaterUnderWaterFogModHelp"/>
- <text name="BDensText">
- Tamaño de las ondulaciones
- </text>
- <button label="?" left="405" name="WaterNormalScaleHelp"/>
- <text name="BHText2">
- 1
- </text>
- <text name="BHText3">
- 2
- </text>
- <text name="BHText4">
- 3
- </text>
- <text name="HDText">
- Escala de Fresnel
- </text>
- <button label="?" left="405" name="WaterFresnelScaleHelp"/>
- <text name="FresnelOffsetText">
- Coeficiente de reflexión
- </text>
- <button label="?" left="405" name="WaterFresnelOffsetHelp"/>
- <text name="DensMultText">
- Refracción de la superficie
- </text>
- <button label="?" left="640" name="WaterScaleAboveHelp"/>
- <text name="WaterScaleBelowText">
- Refracción bajo la superficie
- </text>
- <button label="?" left="640" name="WaterScaleBelowHelp"/>
- <text name="MaxAltText">
- Desenfoque
- </text>
- <button label="?" left="640" name="WaterBlurMultiplierHelp"/>
- </panel>
- <panel label="IMAGEN" name="Waves">
- <text name="BHText">
- Sentido de la onda grande
- </text>
- <button label="?" left="170" name="WaterWave1Help"/>
- <text name="WaterWave1DirXText">
- X
- </text>
- <text name="WaterWave1DirYText">
- Y
- </text>
- <text name="BHText2">
- Sentido de la onda pequeña
- </text>
- <button label="?" left="170" name="WaterWave2Help"/>
- <text name="WaterWave2DirXText">
- X
- </text>
- <text name="WaterWave2DirYText">
- Y
- </text>
- <text name="BHText3">
- Vista Normal
- </text>
- <button label="?" name="WaterNormalMapHelp"/>
- </panel>
- </tab_container>
- <string name="WLDefaultWaterNames">
- Default:Glassy:Pond:Murky:Second Plague:SNAKE!!!:Valdez
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_web_content.xml b/indra/newview/skins/default/xui/es/floater_web_content.xml
new file mode 100644
index 0000000000..5e02fad2dd
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_web_content.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_web_content" title="">
+ <layout_stack name="stack1">
+ <layout_panel name="nav_controls">
+ <button name="back" tool_tip="Navegar hacia atrás"/>
+ <button name="forward" tool_tip="Navegar hacia adelante"/>
+ <button name="stop" tool_tip="Detener la navegación"/>
+ <button name="reload" tool_tip="Recargar página"/>
+ <combo_box name="address" tool_tip="Introducir URL aquí"/>
+ <icon name="media_secure_lock_flag" tool_tip="Navegación segura"/>
+ <button name="popexternal" tool_tip="Abrir URL actual en tu navegador de escritorio"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_windlight_options.xml b/indra/newview/skins/default/xui/es/floater_windlight_options.xml
deleted file mode 100644
index 585a42e429..0000000000
--- a/indra/newview/skins/default/xui/es/floater_windlight_options.xml
+++ /dev/null
@@ -1,190 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="WindLight floater" title="EDITOR AVANZADO DEL CIELO">
- <text name="KeyFramePresetsText">
- Cielos definidos:
- </text>
- <button label="Nuevo" label_selected="Nuevo" name="WLNewPreset"/>
- <button label="Guardar" label_selected="Guardar" name="WLSavePreset"/>
- <button label="Borrar" label_selected="Borrar" name="WLDeletePreset"/>
- <button font="SansSerifSmall" label="Editor del ciclo de un día" label_selected="Editor del ciclo de un día" left_delta="90" name="WLDayCycleMenuButton" width="150"/>
- <tab_container name="WindLight Tabs">
- <panel label="ATMÓSFERA" name="Atmosphere">
- <text name="BHText">
- Coloración
- </text>
- <button label="?" name="WLBlueHorizonHelp"/>
- <text name="BHText2">
- R
- </text>
- <text name="BHText3">
- V
- </text>
- <text name="BHText4">
- A
- </text>
- <text name="BHText5">
- I
- </text>
- <text name="BDensText">
- Cantidad de bruma
- </text>
- <button label="?" name="WLHazeHorizonHelp"/>
- <text name="BDensText2">
- Saturación
- </text>
- <button label="?" name="WLBlueDensityHelp"/>
- <text name="BHText6">
- R
- </text>
- <text name="BHText7">
- V
- </text>
- <text name="BHText8">
- A
- </text>
- <text name="BHText9">
- I
- </text>
- <text name="HDText">
- Densidad de la bruma
- </text>
- <button label="?" name="WLHazeDensityHelp"/>
- <text name="DensMultText">
- Densidad
- </text>
- <button label="?" name="WLDensityMultHelp"/>
- <text name="WLDistanceMultText">
- Distancia
- </text>
- <button label="?" name="WLDistanceMultHelp"/>
- <text name="MaxAltText">
- Altitud máx.
- </text>
- <button label="?" name="WLMaxAltitudeHelp"/>
- </panel>
- <panel label="LUZ" name="Lighting">
- <text name="SLCText">
- Color del Sol y de la Luna
- </text>
- <button label="?" name="WLSunlightColorHelp"/>
- <text name="BHText">
- R
- </text>
- <text name="BHText2">
- V
- </text>
- <text name="BHText3">
- A
- </text>
- <text name="BHText4">
- I
- </text>
- <text name="TODText">
- Posición del Sol y la Luna
- </text>
- <button label="?" name="WLTimeOfDayHelp"/>
- <text name="WLAmbientText">
- Ambiental
- </text>
- <button label="?" name="WLAmbientHelp"/>
- <text name="BHText5">
- R
- </text>
- <text name="BHText6">
- V
- </text>
- <text name="BHText7">
- A
- </text>
- <text name="BHText8">
- I
- </text>
- <text name="WLEastAngleText">
- Ãngulo de elevación
- </text>
- <button label="?" name="WLEastAngleHelp"/>
- <text name="SunGlowText">
- Resplandor del Sol
- </text>
- <button label="?" name="WLSunGlowHelp"/>
- <slider label="Visión" name="WLGlowB"/>
- <slider label="Tamaño" name="WLGlowR"/>
- <text name="SceneGammaText">
- Gamma de la escena
- </text>
- <button label="?" name="WLSceneGammaHelp"/>
- <text name="WLStarText">
- Brillo de las estrellas
- </text>
- <button label="?" name="WLStarBrightnessHelp"/>
- </panel>
- <panel label="NUBES" name="Clouds">
- <text name="WLCloudColorText">
- Color de las nubes
- </text>
- <button label="?" left="190" name="WLCloudColorHelp"/>
- <text name="BHText">
- R
- </text>
- <text name="BHText2">
- V
- </text>
- <text name="BHText3">
- A
- </text>
- <text name="BHText4">
- I
- </text>
- <text name="WLCloudColorText2">
- Posición/Densidad de las nubes
- </text>
- <button label="?" left="190" name="WLCloudDensityHelp"/>
- <text name="BHText5">
- X
- </text>
- <text name="BHText6">
- Y
- </text>
- <text name="BHText7">
- D
- </text>
- <text name="WLCloudCoverageText">
- Nubosidad
- </text>
- <button label="?" name="WLCloudCoverageHelp"/>
- <text name="WLCloudScaleText">
- Altitud de las nubes
- </text>
- <button label="?" name="WLCloudScaleHelp"/>
- <text font="SansSerifSmall" name="WLCloudDetailText">
- Detalle de las nubes (Posición/Densidad)
- </text>
- <button label="?" name="WLCloudDetailHelp"/>
- <text bottom="-113" name="BHText8">
- X
- </text>
- <text name="BHText9">
- Y
- </text>
- <text name="BHText10">
- D
- </text>
- <slider bottom="-127" name="WLCloudDetailX"/>
- <text name="WLCloudScrollXText">
- Velocidad de X
- </text>
- <button label="?" name="WLCloudScrollXHelp"/>
- <check_box label="Bloquear" name="WLCloudLockX"/>
- <text name="WLCloudScrollYText">
- Velocidad de Y
- </text>
- <button label="?" name="WLCloudScrollYHelp"/>
- <check_box label="Bloquear" name="WLCloudLockY"/>
- <check_box label="Incluir nubes clásicas" name="DrawClassicClouds"/>
- <button label="?" left="618" name="WLClassicCloudsHelp"/>
- </panel>
- </tab_container>
- <string name="WLDefaultSkyNames">
- A-12AM:A-12PM:A-3AM:A-3PM:A-4.30PM:A-6AM:A-6PM:A-9AM:A-9PM:Barcelona:Blizzard:Blue Midday:Coastal Afternoon:Coastal Sunset:Default:Desert Sunset:Fine Day:Fluffy Big Clouds:Foggy:Funky Funky:Funky Funky Funky:Gelatto:Ghost:Incongruent Truths:Midday 1:Midday 2:Midday 3:Midday 4:Night:Pirate:Purple:Sailor&apos;s Delight:Sheer Sensuality
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/es/inspect_avatar.xml b/indra/newview/skins/default/xui/es/inspect_avatar.xml
index 119f252db2..1d70fa6a90 100644
--- a/indra/newview/skins/default/xui/es/inspect_avatar.xml
+++ b/indra/newview/skins/default/xui/es/inspect_avatar.xml
@@ -10,8 +10,6 @@
<string name="Details">
[SL_PROFILE]
</string>
- <text name="user_name_small" value="Grumpity ProductEngine con un nombre demasiado largo"/>
- <text name="user_slid" value="james.linden"/>
<text name="user_details">
Ésta es mi descripción de Second Life que, por cierto, me encanta. Pero, por lo que sea, me he enrollado más de la cuenta y la descripción es larguísima.
</text>
diff --git a/indra/newview/skins/default/xui/es/language_settings.xml b/indra/newview/skins/default/xui/es/language_settings.xml
index f172994077..997293a741 100644
--- a/indra/newview/skins/default/xui/es/language_settings.xml
+++ b/indra/newview/skins/default/xui/es/language_settings.xml
@@ -4,6 +4,7 @@
<!-- Locale Information -->
<string name="MicrosoftLocale">spanish</string>
+ <string name="MacLocale">es_ES.UTF-8</string>
<string name="DarwinLocale">es_ES.UTF-8</string>
<string name="LinuxLocale">es_ES.UTF-8</string>
diff --git a/indra/newview/skins/default/xui/es/menu_attachment_self.xml b/indra/newview/skins/default/xui/es/menu_attachment_self.xml
index ab76c92d65..0ba39378bb 100644
--- a/indra/newview/skins/default/xui/es/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/es/menu_attachment_self.xml
@@ -5,7 +5,7 @@
<menu_item_call label="Quitar" name="Detach"/>
<menu_item_call label="Sentarte" name="Sit Down Here"/>
<menu_item_call label="Levantarme" name="Stand Up"/>
- <menu_item_call label="Cambiar vestuario" name="Change Outfit"/>
+ <menu_item_call label="Mi apariencia" name="Change Outfit"/>
<menu_item_call label="Editar mi vestuario" name="Edit Outfit"/>
<menu_item_call label="Editar mi anatomía" name="Edit My Shape"/>
<menu_item_call label="Mis amigos" name="Friends..."/>
diff --git a/indra/newview/skins/default/xui/es/menu_avatar_self.xml b/indra/newview/skins/default/xui/es/menu_avatar_self.xml
index 50f8384b0f..268d6f70ab 100644
--- a/indra/newview/skins/default/xui/es/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/es/menu_avatar_self.xml
@@ -14,6 +14,7 @@
<menu_item_call label="Camiseta" name="Self Undershirt"/>
<menu_item_call label="Ropa interior" name="Self Underpants"/>
<menu_item_call label="Tatuaje" name="Self Tattoo"/>
+ <menu_item_call label="Física" name="Self Physics"/>
<menu_item_call label="Alfa" name="Self Alpha"/>
<menu_item_call label="Toda la ropa" name="All Clothes"/>
</context_menu>
@@ -21,7 +22,7 @@
<context_menu label="Quitar" name="Object Detach"/>
<menu_item_call label="Quitarse todo" name="Detach All"/>
</context_menu>
- <menu_item_call label="Cambiar vestuario" name="Chenge Outfit"/>
+ <menu_item_call label="Mi apariencia" name="Chenge Outfit"/>
<menu_item_call label="Editar mi vestuario" name="Edit Outfit"/>
<menu_item_call label="Editar mi anatomía" name="Edit My Shape"/>
<menu_item_call label="Mis amigos" name="Friends..."/>
diff --git a/indra/newview/skins/default/xui/es/menu_bottomtray.xml b/indra/newview/skins/default/xui/es/menu_bottomtray.xml
index 62683f3076..40058a1749 100644
--- a/indra/newview/skins/default/xui/es/menu_bottomtray.xml
+++ b/indra/newview/skins/default/xui/es/menu_bottomtray.xml
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="hide_camera_move_controls_menu">
+ <menu_item_check label="Botón Hablar" name="EnableVoiceChat"/>
<menu_item_check label="Botón Gestos" name="ShowGestureButton"/>
<menu_item_check label="Botón Moverse" name="ShowMoveButton"/>
<menu_item_check label="Botón Vista" name="ShowCameraButton"/>
<menu_item_check label="Botón Foto" name="ShowSnapshotButton"/>
- <menu_item_check label="Botón Barra lateral" name="ShowSidebarButton"/>
<menu_item_check label="Botón Construir" name="ShowBuildButton"/>
<menu_item_check label="Botón Buscar" name="ShowSearchButton"/>
<menu_item_check label="Botón Mapa" name="ShowWorldMapButton"/>
diff --git a/indra/newview/skins/default/xui/es/menu_favorites.xml b/indra/newview/skins/default/xui/es/menu_favorites.xml
index c8a7858ddb..85210d5c49 100644
--- a/indra/newview/skins/default/xui/es/menu_favorites.xml
+++ b/indra/newview/skins/default/xui/es/menu_favorites.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="Popup">
- <menu_item_call label="Teleportarse" name="Teleport To Landmark"/>
+ <menu_item_call label="Teleportar" name="Teleport To Landmark"/>
<menu_item_call label="Ver/Editar el hito" name="Landmark Open"/>
<menu_item_call label="Copiar la SLurl" name="Copy slurl"/>
<menu_item_call label="Mostrar en el mapa" name="Show On Map"/>
diff --git a/indra/newview/skins/default/xui/es/menu_hide_navbar.xml b/indra/newview/skins/default/xui/es/menu_hide_navbar.xml
index 22a1873234..9945908c4f 100644
--- a/indra/newview/skins/default/xui/es/menu_hide_navbar.xml
+++ b/indra/newview/skins/default/xui/es/menu_hide_navbar.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="hide_navbar_menu">
- <menu_item_check label="Mostrar la barra de navegación" name="ShowNavbarNavigationPanel"/>
+ <menu_item_check label="Mostrar la barra de navegación y de favoritos" name="ShowNavbarNavigationPanel"/>
<menu_item_check label="Mostrar la barra de favoritos" name="ShowNavbarFavoritesPanel"/>
<menu_item_check label="Mostrar mini-barra de ubicación" name="ShowMiniLocationPanel"/>
</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/es/menu_inspect_avatar_gear.xml
index 236289f82a..82fc8ddd39 100644
--- a/indra/newview/skins/default/xui/es/menu_inspect_avatar_gear.xml
+++ b/indra/newview/skins/default/xui/es/menu_inspect_avatar_gear.xml
@@ -1,19 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
-<menu name="Gear Menu">
+<toggleable_menu name="Gear Menu">
<menu_item_call label="Ver el perfil" name="view_profile"/>
<menu_item_call label="Añadir como amigo" name="add_friend"/>
<menu_item_call label="MI" name="im"/>
<menu_item_call label="Llamada" name="call"/>
- <menu_item_call label="Teleportarse" name="teleport"/>
+ <menu_item_call label="Teleportar" name="teleport"/>
<menu_item_call label="Invitar al grupo" name="invite_to_group"/>
<menu_item_call label="Ignorar" name="block"/>
<menu_item_call label="Designorar" name="unblock"/>
<menu_item_call label="Denunciar" name="report"/>
<menu_item_call label="Congelar" name="freeze"/>
<menu_item_call label="Expulsar" name="eject"/>
+ <menu_item_call label="Expulsar" name="kick"/>
+ <menu_item_call label="CSR" name="csr"/>
<menu_item_call label="Depurar las texturas" name="debug"/>
<menu_item_call label="Encontrar en el mapa" name="find_on_map"/>
<menu_item_call label="Acercar el zoom" name="zoom_in"/>
<menu_item_call label="Pagar" name="pay"/>
<menu_item_call label="Compartir" name="share"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_inspect_object_gear.xml b/indra/newview/skins/default/xui/es/menu_inspect_object_gear.xml
index bcdc25894f..9d0a8c50ef 100644
--- a/indra/newview/skins/default/xui/es/menu_inspect_object_gear.xml
+++ b/indra/newview/skins/default/xui/es/menu_inspect_object_gear.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<menu name="Gear Menu">
+<toggleable_menu name="Gear Menu">
<menu_item_call label="Tocar" name="touch"/>
<menu_item_call label="Sentarse" name="sit"/>
<menu_item_call label="Pagar" name="pay"/>
@@ -12,7 +12,8 @@
<menu_item_call label="Añadir" name="add"/>
<menu_item_call label="Denunciar" name="report"/>
<menu_item_call label="Ignorar" name="block"/>
+ <menu_item_call label="No ignorar" name="unblock"/>
<menu_item_call label="Acercar el zoom" name="zoom_in"/>
<menu_item_call label="Quitar" name="remove"/>
<menu_item_call label="Más información" name="more_info"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/es/menu_inspect_self_gear.xml
index c8a1e9d9da..29ad718fdd 100644
--- a/indra/newview/skins/default/xui/es/menu_inspect_self_gear.xml
+++ b/indra/newview/skins/default/xui/es/menu_inspect_self_gear.xml
@@ -1,10 +1,31 @@
-<?xml version="1.0" encoding="utf-8"?>
-<menu name="Gear Menu">
- <menu_item_call label="Sentarte" name="sit_down_here"/>
- <menu_item_call label="Levantarme" name="stand_up"/>
- <menu_item_call label="Cambiar vestuario" name="change_outfit"/>
- <menu_item_call label="Mi perfil" name="my_profile"/>
- <menu_item_call label="Mis amigos" name="my_friends"/>
- <menu_item_call label="Mis grupos" name="my_groups"/>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Gear Menu">
+ <menu_item_call label="Sentarme" name="Sit Down Here"/>
+ <menu_item_call label="Levantarme" name="Stand Up"/>
+ <context_menu label="Quitarme" name="Take Off &gt;">
+ <context_menu label="Ropas" name="Clothes &gt;">
+ <menu_item_call label="Camisa" name="Shirt"/>
+ <menu_item_call label="Pantalones" name="Pants"/>
+ <menu_item_call label="Falda" name="Skirt"/>
+ <menu_item_call label="Zapatos" name="Shoes"/>
+ <menu_item_call label="Calcetines" name="Socks"/>
+ <menu_item_call label="Chaqueta" name="Jacket"/>
+ <menu_item_call label="Guantes" name="Gloves"/>
+ <menu_item_call label="Camiseta" name="Self Undershirt"/>
+ <menu_item_call label="Ropa interior" name="Self Underpants"/>
+ <menu_item_call label="Tatuaje" name="Self Tattoo"/>
+ <menu_item_call label="Alfa" name="Self Alpha"/>
+ <menu_item_call label="Toda la ropa" name="All Clothes"/>
+ </context_menu>
+ <context_menu label="HUD" name="Object Detach HUD"/>
+ <context_menu label="Quitar" name="Object Detach"/>
+ <menu_item_call label="Quitarse todo" name="Detach All"/>
+ </context_menu>
+ <menu_item_call label="Cambiar vestuario" name="Chenge Outfit"/>
+ <menu_item_call label="Editar mi vestuario" name="Edit Outfit"/>
+ <menu_item_call label="Editar mi anatomía" name="Edit My Shape"/>
+ <menu_item_call label="Mis amigos" name="Friends..."/>
+ <menu_item_call label="Mis grupos" name="Groups..."/>
+ <menu_item_call label="Mi perfil" name="Profile..."/>
<menu_item_call label="Depurar las texturas" name="Debug..."/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_inventory.xml b/indra/newview/skins/default/xui/es/menu_inventory.xml
index 94ee162bbc..4a8f37dee4 100644
--- a/indra/newview/skins/default/xui/es/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/es/menu_inventory.xml
@@ -25,6 +25,7 @@
<menu_item_call label="Ropa interior nueva" name="New Underpants"/>
<menu_item_call label="Nueva capa Alpha" name="New Alpha Mask"/>
<menu_item_call label="Tatuaje nuevo" name="New Tattoo"/>
+ <menu_item_call label="Nueva física" name="New Physics"/>
</menu>
<menu label="Nuevas partes del cuerpo" name="New Body Parts">
<menu_item_call label="Forma nueva" name="New Shape"/>
@@ -82,5 +83,7 @@
<menu_item_call label="Editar" name="Wearable Edit"/>
<menu_item_call label="Añadir" name="Wearable Add"/>
<menu_item_call label="Quitarse" name="Take Off"/>
+ <menu_item_call label="Copiar al Buzón de salida de comerciante" name="Merchant Copy"/>
+ <menu_item_call label="Enviar al Mercado" name="Marketplace Send"/>
<menu_item_call label="--sin opciones--" name="--no options--"/>
</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_inventory_add.xml b/indra/newview/skins/default/xui/es/menu_inventory_add.xml
index ba106e8335..f17cfe4ceb 100644
--- a/indra/newview/skins/default/xui/es/menu_inventory_add.xml
+++ b/indra/newview/skins/default/xui/es/menu_inventory_add.xml
@@ -4,6 +4,8 @@
<menu_item_call label="Imagen ([COST] L$)..." name="Upload Image"/>
<menu_item_call label="Sonido ([COST] L$)..." name="Upload Sound"/>
<menu_item_call label="Animación ([COST] L$)..." name="Upload Animation"/>
+ <menu_item_call label="Modelo..." name="Upload Model"/>
+ <menu_item_call label="Asistente de modelo..." name="Upload Model Wizard"/>
<menu_item_call label="Masivo ([COST] L$ por archivo)..." name="Bulk Upload"/>
<menu_item_call label="Configurar los permisos por defecto de subida" name="perm prefs"/>
</menu>
@@ -23,6 +25,7 @@
<menu_item_call label="Ropa interior nueva" name="New Underpants"/>
<menu_item_call label="Nueva Alfa" name="New Alpha"/>
<menu_item_call label="Tatuaje nuevo" name="New Tattoo"/>
+ <menu_item_call label="Nueva física" name="New Physics"/>
</menu>
<menu label="Nuevas partes del cuerpo" name="New Body Parts">
<menu_item_call label="Forma nueva" name="New Shape"/>
diff --git a/indra/newview/skins/default/xui/es/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/es/menu_inventory_gear_default.xml
index 8c4488a285..0e9644629e 100644
--- a/indra/newview/skins/default/xui/es/menu_inventory_gear_default.xml
+++ b/indra/newview/skins/default/xui/es/menu_inventory_gear_default.xml
@@ -1,8 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_gear_default">
+<toggleable_menu name="menu_gear_default">
<menu_item_call label="Nueva ventana del inventario" name="new_window"/>
- <menu_item_call label="Ordenar alfabéticamente" name="sort_by_name"/>
- <menu_item_call label="Ordenar por los más recientes" name="sort_by_recent"/>
+ <menu_item_check label="Ordenar alfabéticamente" name="sort_by_name"/>
+ <menu_item_check label="Ordenar por los más recientes" name="sort_by_recent"/>
+ <menu_item_check label="Ordenar las carpetas siempre alfabéticamente" name="sort_folders_by_name"/>
+ <menu_item_check label="Las carpetas del sistema, arriba" name="sort_system_folders_to_top"/>
<menu_item_call label="Ver los filtros" name="show_filters"/>
<menu_item_call label="Restablecer los filtros" name="reset_filters"/>
<menu_item_call label="Cerrar todas las carpetas" name="close_folders"/>
@@ -12,4 +14,4 @@
<menu_item_call label="Encontrar el original" name="Find Original"/>
<menu_item_call label="Encontrar todos los enlazados" name="Find All Links"/>
<menu_item_call label="Vaciar la Papelera" name="empty_trash"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_login.xml b/indra/newview/skins/default/xui/es/menu_login.xml
index 5386f82ee5..289ac3f075 100644
--- a/indra/newview/skins/default/xui/es/menu_login.xml
+++ b/indra/newview/skins/default/xui/es/menu_login.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu_bar name="Login Menu">
<menu label="Yo" name="File">
- <menu_item_call label="Preferencias" name="Preferences..."/>
+ <menu_item_call label="Preferencias..." name="Preferences..."/>
<menu_item_call label="Salir de [APP_NAME]" name="Quit"/>
</menu>
<menu label="Ayuda" name="Help">
@@ -16,7 +16,8 @@
<menu_item_call label="Definir el tamaño de la ventana..." name="Set Window Size..."/>
<menu_item_call label="Mostrar los &apos;TOS&apos;" name="TOS"/>
<menu_item_call label="Mostrar mensaje crítico" name="Critical"/>
- <menu_item_call label="Web Browser Test" name="Web Browser Test"/>
+ <menu_item_call label="Prueba de depuración de ventanas de contenido web" name="Web Content Floater Debug Test"/>
+ <menu label="Configurar el nivel de registro" name="Set Logging Level"/>
<menu_item_check label="Mostrar el selector de Grid" name="Show Grid Picker"/>
<menu_item_call label="Mostrar la consola de notificaciones" name="Show Notifications Console"/>
</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_media_ctrl.xml b/indra/newview/skins/default/xui/es/menu_media_ctrl.xml
new file mode 100644
index 0000000000..b4dfe9907a
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_media_ctrl.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="media ctrl context menu">
+ <menu_item_call label="Cortar" name="Cut"/>
+ <menu_item_call label="Copiar" name="Copy"/>
+ <menu_item_call label="Pegar" name="Paste"/>
+ <menu_item_call label="Abrir el inspector web" name="open_webinspector"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_mini_map.xml b/indra/newview/skins/default/xui/es/menu_mini_map.xml
index 41dc817551..07d1b08572 100644
--- a/indra/newview/skins/default/xui/es/menu_mini_map.xml
+++ b/indra/newview/skins/default/xui/es/menu_mini_map.xml
@@ -3,6 +3,7 @@
<menu_item_call label="Zoom cerca" name="Zoom Close"/>
<menu_item_call label="Zoom medio" name="Zoom Medium"/>
<menu_item_call label="Zoom lejos" name="Zoom Far"/>
+ <menu_item_call label="Zoom por defecto" name="Zoom Default"/>
<menu_item_check label="Girar el mapa" name="Rotate Map"/>
<menu_item_check label="Centrar automáticamente" name="Auto Center"/>
<menu_item_call label="Parar la búsqueda" name="Stop Tracking"/>
diff --git a/indra/newview/skins/default/xui/es/menu_mode_change.xml b/indra/newview/skins/default/xui/es/menu_mode_change.xml
new file mode 100644
index 0000000000..608505d192
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_mode_change.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Mode Change">
+ <menu_item_check label="Básico" name="BasicMode"/>
+ <menu_item_check label="Avanzado" name="AdvancedMode"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_model_import_gear_default.xml b/indra/newview/skins/default/xui/es/menu_model_import_gear_default.xml
new file mode 100644
index 0000000000..0d4f1314c9
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_model_import_gear_default.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="model_menu_gear_default">
+ <menu_item_check label="Mostrar bordes" name="show_edges"/>
+ <menu_item_check label="Mostrar aspectos físicos" name="show_physics"/>
+ <menu_item_check label="Mostrar texturas" name="show_textures"/>
+ <menu_item_check label="Mostrar peso de la piel" name="show_skin_weight"/>
+ <menu_item_check label="Mostrar posturas de las articulaciones" name="show_joint_positions"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_object.xml b/indra/newview/skins/default/xui/es/menu_object.xml
index 06121e0c09..d8c75eaf47 100644
--- a/indra/newview/skins/default/xui/es/menu_object.xml
+++ b/indra/newview/skins/default/xui/es/menu_object.xml
@@ -16,14 +16,14 @@
<context_menu label="Anexar" name="Object Attach"/>
<context_menu label="Anexar el HUD" name="Object Attach HUD"/>
</context_menu>
- <context_menu label="Quitar" name="Remove">
+ <context_menu label="Gestionar" name="Remove">
<menu_item_call label="Denunciar una infracción" name="Report Abuse..."/>
<menu_item_call label="Ignorar" name="Object Mute"/>
<menu_item_call label="Devolver" name="Return..."/>
- <menu_item_call label="Eliminar" name="Delete"/>
</context_menu>
<menu_item_call label="Tomar" name="Pie Object Take"/>
<menu_item_call label="Coger una copia" name="Take Copy"/>
<menu_item_call label="Pagar" name="Pay..."/>
<menu_item_call label="Comprar" name="Buy..."/>
+ <menu_item_call label="Borrar" name="Delete"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_outfit_gear.xml b/indra/newview/skins/default/xui/es/menu_outfit_gear.xml
index 3b11bceecf..558ff6afd3 100644
--- a/indra/newview/skins/default/xui/es/menu_outfit_gear.xml
+++ b/indra/newview/skins/default/xui/es/menu_outfit_gear.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Gear Outfit">
+<toggleable_menu name="Gear Outfit">
<menu_item_call label="Ponerme - Reemplazar el vestuario actual" name="wear"/>
<menu_item_call label="Ponerme - Añadir al vestuario actual" name="wear_add"/>
<menu_item_call label="Quitarme - Quitar del vestuario actual" name="take_off"/>
@@ -14,6 +14,7 @@
<menu_item_call label="Camiseta nueva" name="New Undershirt"/>
<menu_item_call label="Ropa interior nueva" name="New Underpants"/>
<menu_item_call label="Nueva Alfa" name="New Alpha"/>
+ <menu_item_call label="Nueva física" name="New Physics"/>
<menu_item_call label="Tatuaje nuevo" name="New Tattoo"/>
</menu>
<menu label="Nuevas partes del cuerpo" name="New Body Parts">
@@ -24,4 +25,4 @@
</menu>
<menu_item_call label="Renombrar el vestuario" name="rename"/>
<menu_item_call label="Borrar el vestuario" name="delete_outfit"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_people_nearby_view_sort.xml b/indra/newview/skins/default/xui/es/menu_people_nearby_view_sort.xml
index f0fe383c0c..1403e4db01 100644
--- a/indra/newview/skins/default/xui/es/menu_people_nearby_view_sort.xml
+++ b/indra/newview/skins/default/xui/es/menu_people_nearby_view_sort.xml
@@ -1,8 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
+<toggleable_menu name="menu_group_plus">
<menu_item_check label="Ordenar según las intervenciones recientes" name="sort_by_recent_speakers"/>
<menu_item_check label="Ordenar alfabéticamente" name="sort_name"/>
<menu_item_check label="Ordenar según distancia" name="sort_distance"/>
<menu_item_check label="Ver los iconos de la gente" name="view_icons"/>
+ <menu_item_check label="Ver mapa" name="view_map"/>
<menu_item_call label="Ver la lista de Residentes y Objetos ignorados" name="show_blocked_list"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/es/menu_places_gear_folder.xml
index bf46eb58e3..4051ff4075 100644
--- a/indra/newview/skins/default/xui/es/menu_places_gear_folder.xml
+++ b/indra/newview/skins/default/xui/es/menu_places_gear_folder.xml
@@ -1,7 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_folder_gear">
+<toggleable_menu name="menu_folder_gear">
<menu_item_call label="Añadir este hito" name="add_landmark"/>
<menu_item_call label="Añadir una carpeta" name="add_folder"/>
+ <menu_item_call label="Restaurar ítem" name="restore_item"/>
<menu_item_call label="Cortar" name="cut"/>
<menu_item_call label="Copiar" name="copy_folder"/>
<menu_item_call label="Pegar" name="paste"/>
@@ -12,4 +13,4 @@
<menu_item_call label="Abrir todas las carpetas" name="expand_all"/>
<menu_item_call label="Cerrar todas las carpetas" name="collapse_all"/>
<menu_item_check label="Ordenar por fecha" name="sort_by_date"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/es/menu_places_gear_landmark.xml
index eac85de846..c92bd19787 100644
--- a/indra/newview/skins/default/xui/es/menu_places_gear_landmark.xml
+++ b/indra/newview/skins/default/xui/es/menu_places_gear_landmark.xml
@@ -1,10 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_ladmark_gear">
+<toggleable_menu name="menu_ladmark_gear">
<menu_item_call label="Teleportar" name="teleport"/>
<menu_item_call label="Más información" name="more_info"/>
<menu_item_call label="Mostrar en el mapa" name="show_on_map"/>
<menu_item_call label="Añadir un hito" name="add_landmark"/>
<menu_item_call label="Añadir una carpeta" name="add_folder"/>
+ <menu_item_call label="Restaurar ítem" name="restore_item"/>
<menu_item_call label="Cortar" name="cut"/>
<menu_item_call label="Copiar el hito" name="copy_landmark"/>
<menu_item_call label="Copiar la SLurl" name="copy_slurl"/>
@@ -15,4 +16,4 @@
<menu_item_call label="Cerrar todas las carpetas" name="collapse_all"/>
<menu_item_check label="Ordenar por fecha" name="sort_by_date"/>
<menu_item_call label="Crear un Destacado" name="create_pick"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_teleport_history_item.xml b/indra/newview/skins/default/xui/es/menu_teleport_history_item.xml
index ed33c55aca..c482907812 100644
--- a/indra/newview/skins/default/xui/es/menu_teleport_history_item.xml
+++ b/indra/newview/skins/default/xui/es/menu_teleport_history_item.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Teleport History Item Context Menu">
- <menu_item_call label="Teleportarse" name="Teleport"/>
+ <menu_item_call label="Teleportar" name="Teleport"/>
<menu_item_call label="Más información" name="More Information"/>
<menu_item_call label="Copiar al portapapeles" name="CopyToClipboard"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_toolbars.xml b/indra/newview/skins/default/xui/es/menu_toolbars.xml
new file mode 100644
index 0000000000..63f3dc43bd
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_toolbars.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Toolbars Popup">
+ <menu_item_call label="Quitar este botón" name="Remove button"/>
+ <menu_item_call label="Botones de la barra de herramientas..." name="Choose Buttons"/>
+ <menu_item_check label="Iconos y etiquetas" name="icons_with_text"/>
+ <menu_item_check label="Solo iconos" name="icons_only"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_viewer.xml b/indra/newview/skins/default/xui/es/menu_viewer.xml
index 649c0c2043..9522d4eac6 100644
--- a/indra/newview/skins/default/xui/es/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/es/menu_viewer.xml
@@ -1,62 +1,91 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu_bar name="Main Menu">
<menu label="Yo" name="Me">
- <menu_item_call label="Preferencias" name="Preferences"/>
- <menu_item_call label="Mi panel de control" name="Manage My Account">
- <menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=es"/>
- </menu_item_call>
- <menu_item_call label="Comprar L$" name="Buy and Sell L$"/>
- <menu_item_call label="Mi perfil" name="Profile"/>
- <menu_item_call label="Cambiar vestuario" name="ChangeOutfit"/>
- <menu_item_check label="Mi Inventario" name="Inventory"/>
- <menu_item_check label="Mi Inventario" name="ShowSidetrayInventory"/>
- <menu_item_check label="Mis gestos" name="Gestures"/>
- <menu_item_check label="Mi voz" name="ShowVoice"/>
- <menu label="Mi estado" name="Status">
+ <menu_item_call label="Perfil..." name="Profile"/>
+ <menu_item_call label="Apariencia" name="ChangeOutfit"/>
+ <menu_item_call label="Elige un avatar..." name="Avatar Picker"/>
+ <menu_item_check label="Inventario..." name="Inventory"/>
+ <menu_item_call label="Nueva ventana del inventario" name="NewInventoryWindow"/>
+ <menu_item_call label="Lugares..." name="Places"/>
+ <menu_item_call label="Destacados..." name="Picks"/>
+ <menu_item_call label="Controles de la cámara..." name="Camera Controls"/>
+ <menu label="Movimiento" name="Movement">
+ <menu_item_call label="Sentarte" name="Sit Down Here"/>
+ <menu_item_check label="Volar" name="Fly"/>
+ <menu_item_check label="Correr siempre" name="Always Run"/>
+ <menu_item_call label="Parar mis animaciones" name="Stop Animating My Avatar"/>
+ <menu_item_call label="Caminar / Correr / Volar..." name="Walk / run / fly"/>
+ </menu>
+ <menu label="Estado" name="Status">
<menu_item_call label="Ausente" name="Set Away"/>
<menu_item_call label="Ocupado" name="Set Busy"/>
</menu>
- <menu_item_call label="Solicitar estatus de Administrador" name="Request Admin Options"/>
- <menu_item_call label="Dejar el estatus de Administrador" name="Leave Admin Options"/>
+ <menu_item_call label="Comprar L$..." name="Buy and Sell L$"/>
+ <menu_item_call label="Panel de control de la cuenta..." name="Manage My Account">
+ <menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=es"/>
+ </menu_item_call>
+ <menu_item_call label="Preferencias..." name="Preferences"/>
+ <menu_item_call label="Botones de la barra de herramientas..." name="Toolbars"/>
+ <menu_item_call label="Ocultar todos los controles" name="Hide UI"/>
<menu_item_call label="Salir de [APP_NAME]" name="Quit"/>
</menu>
<menu label="Comunicarme" name="Communicate">
- <menu_item_call label="Mis amigos" name="My Friends"/>
- <menu_item_call label="Mis grupos" name="My Groups"/>
- <menu_item_check label="Chat" name="Nearby Chat"/>
+ <menu_item_check label="Chat..." name="Nearby Chat"/>
+ <menu_item_check label="Hablar" name="Speak"/>
+ <menu_item_check label="Configuración de voz..." name="Nearby Voice"/>
+ <menu_item_check label="Transformación de voz..." name="ShowVoice"/>
+ <menu_item_check label="Gestos..." name="Gestures"/>
+ <menu_item_call label="Amigos" name="My Friends"/>
+ <menu_item_call label="Grupos" name="My Groups"/>
<menu_item_call label="Gente cerca" name="Active Speakers"/>
</menu>
<menu label="Mundo" name="World">
- <menu_item_check label="Minimapa" name="Mini-Map"/>
+ <menu_item_call label="Crear un hito de este sitio" name="Create Landmark Here"/>
+ <menu_item_call label="Destinos..." name="Destinations"/>
<menu_item_check label="Mapa del mundo" name="World Map"/>
+ <menu_item_check label="Minimapa" name="Mini-Map"/>
+ <menu_item_check label="Buscar" name="Search"/>
+ <menu_item_call label="Teleportar a la Base" name="Teleport Home"/>
+ <menu_item_call label="Fijar mi Base aquí" name="Set Home to Here"/>
<menu_item_call label="Foto" name="Take Snapshot"/>
- <menu_item_call label="Crear un hito de este sitio" name="Create Landmark Here"/>
- <menu label="Perfil del lugar" name="Land">
- <menu_item_call label="Perfil del lugar" name="Place Profile"/>
- <menu_item_call label="Acerca del terreno" name="About Land"/>
- <menu_item_call label="Región/Estado" name="Region/Estate"/>
- </menu>
+ <menu_item_call label="Perfil del lugar" name="Place Profile"/>
+ <menu_item_call label="Acerca del terreno" name="About Land"/>
+ <menu_item_call label="Región/Estado" name="Region/Estate"/>
+ <menu_item_call label="Mis terrenos..." name="My Land"/>
<menu_item_call label="Comprar este terreno" name="Buy Land"/>
- <menu_item_call label="Mi terreno" name="My Land"/>
<menu label="Mostrar" name="LandShow">
- <menu_item_check label="Controles del movimiento" name="Movement Controls"/>
- <menu_item_check label="Controles de la cámara" name="Camera Controls"/>
<menu_item_check label="Líneas de prohibición" name="Ban Lines"/>
<menu_item_check label="Balizas" name="beacons"/>
<menu_item_check label="Límites de las parcelas" name="Property Lines"/>
<menu_item_check label="Propietarios del terreno" name="Land Owners"/>
<menu_item_check label="Coordenadas" name="Coordinates"/>
<menu_item_check label="Propiedades de la parcela" name="Parcel Properties"/>
+ <menu_item_check label="Menú Avanzado" name="Show Advanced Menu"/>
</menu>
- <menu_item_call label="Teleportar a la Base" name="Teleport Home"/>
- <menu_item_call label="Fijar mi Base aquí" name="Set Home to Here"/>
- <menu label="Sol" name="Environment Settings">
+ <menu label="Sol" name="Sun">
<menu_item_call label="Amanecer" name="Sunrise"/>
<menu_item_call label="Mediodía" name="Noon"/>
<menu_item_call label="Atardecer" name="Sunset"/>
<menu_item_call label="Medianoche" name="Midnight"/>
- <menu_item_call label="Hora del Estado" name="Revert to Region Default"/>
- <menu_item_call label="Editor del entorno" name="Environment Editor"/>
+ <menu_item_call label="Usar configuración de región" name="Use Region Settings"/>
+ </menu>
+ <menu label="Editor de entorno" name="Environment Editor">
+ <menu_item_call label="Configuración del entorno..." name="Environment Settings"/>
+ <menu label="Agua predefinida" name="Water Presets">
+ <menu_item_call label="Nuevo predefinido..." name="new_water_preset"/>
+ <menu_item_call label="Editar predefinido..." name="edit_water_preset"/>
+ <menu_item_call label="Eliminar predefinido..." name="delete_water_preset"/>
+ </menu>
+ <menu label="Cielos predefinidos" name="Sky Presets">
+ <menu_item_call label="Nuevo predefinido..." name="new_sky_preset"/>
+ <menu_item_call label="Editar predefinido..." name="edit_sky_preset"/>
+ <menu_item_call label="Eliminar predefinido..." name="delete_sky_preset"/>
+ </menu>
+ <menu label="Días predefinidos" name="Day Presets">
+ <menu_item_call label="Nuevo predefinido..." name="new_day_preset"/>
+ <menu_item_call label="Editar predefinido..." name="edit_day_preset"/>
+ <menu_item_call label="Eliminar predefinido..." name="delete_day_preset"/>
+ </menu>
</menu>
</menu>
<menu label="Construir" name="BuildTools">
@@ -112,18 +141,21 @@
<menu_item_call label="Imagen ([COST] L$)..." name="Upload Image"/>
<menu_item_call label="Sonido ([COST] L$)..." name="Upload Sound"/>
<menu_item_call label="Animación ([COST] L$)..." name="Upload Animation"/>
+ <menu_item_call label="Modelo..." name="Upload Model"/>
<menu_item_call label="Masivo ([COST] L$ por archivo)..." name="Bulk Upload"/>
+ <menu_item_call label="Configurar los permisos por defecto de subida" name="perm prefs"/>
</menu>
+ <menu_item_call label="Deshacer" name="Undo"/>
+ <menu_item_call label="Rehacer" name="Redo"/>
</menu>
<menu label="Ayuda" name="Help">
+ <menu_item_call label="Cómo..." name="How To"/>
<menu_item_call label="Ayuda de [SECOND_LIFE]" name="Second Life Help"/>
<menu_item_call label="Denunciar una infracción" name="Report Abuse"/>
<menu_item_call label="Informar de un fallo" name="Report Bug"/>
<menu_item_call label="Acerca de [APP_NAME]" name="About Second Life"/>
- <menu_item_check label="Permitir consejos" name="Enable Hints"/>
</menu>
<menu label="Avanzado" name="Advanced">
- <menu_item_call label="Parar mis animaciones" name="Stop Animating My Avatar"/>
<menu_item_call label="Recargar las texturas" name="Rebake Texture"/>
<menu_item_call label="Interfaz en el tamaño predeterminado" name="Set UI Size to Default"/>
<menu_item_call label="Definir el tamaño de la ventana..." name="Set Window Size..."/>
@@ -131,13 +163,12 @@
<menu_item_check label="Desactivar los límites de la cámara" name="Disable Camera Distance"/>
<menu_item_check label="Foto en Alta Resolución" name="HighResSnapshot"/>
<menu_item_check label="Silenciar el Guardar una foto" name="QuietSnapshotsToDisk"/>
- <menu_item_check label="Comprimir las fotos para el disco duro" name="CompressSnapshotsToDisk"/>
<menu label="Herramientas de rendimiento" name="Performance Tools">
<menu_item_call label="Medidor de lag" name="Lag Meter"/>
<menu_item_check label="Estadísticas" name="Statistics Bar"/>
- <menu_item_check label="Mostrar cuánto cuesta renderizar el avatar" name="Avatar Rendering Cost"/>
+ <menu_item_check label="Mostrar el peso del dibujo de los avatares" name="Avatar Rendering Cost"/>
</menu>
- <menu label="Realzando y Visibilidad" name="Highlighting and Visibility">
+ <menu label="Realzado y Visibilidad" name="Highlighting and Visibility">
<menu_item_check label="Baliza con destellos" name="Cheesy Beacon"/>
<menu_item_check label="Ocultar las partículas" name="Hide Particles"/>
<menu_item_check label="Ocultar lo seleccionado" name="Hide Selected"/>
@@ -146,22 +177,22 @@
<menu_item_check label="Mostrar el Punto de Mira en la vista subjetiva" name="ShowCrosshairs"/>
</menu>
<menu label="Objetos representados" name="Rendering Types">
- <menu_item_check label="Simple" name="Simple"/>
- <menu_item_check label="Alfa" name="Alpha"/>
- <menu_item_check label="Ãrbol" name="Tree"/>
- <menu_item_check label="Avatares" name="Character"/>
- <menu_item_check label="Superficie del terreno" name="SurfacePath"/>
- <menu_item_check label="Cielo" name="Sky"/>
- <menu_item_check label="Agua" name="Water"/>
- <menu_item_check label="Terreno" name="Ground"/>
- <menu_item_check label="volumen" name="Volume"/>
- <menu_item_check label="Hierba" name="Grass"/>
- <menu_item_check label="Nubes" name="Clouds"/>
- <menu_item_check label="Partículas" name="Particles"/>
- <menu_item_check label="Efectos de relieve" name="Bump"/>
+ <menu_item_check label="Simple" name="Rendering Type Simple"/>
+ <menu_item_check label="Alfa" name="Rendering Type Alpha"/>
+ <menu_item_check label="Ãrbol" name="Rendering Type Tree"/>
+ <menu_item_check label="Avatares" name="Rendering Type Character"/>
+ <menu_item_check label="Parcela de superficie" name="Rendering Type Surface Patch"/>
+ <menu_item_check label="Cielo" name="Rendering Type Sky"/>
+ <menu_item_check label="Agua" name="Rendering Type Water"/>
+ <menu_item_check label="Terreno" name="Rendering Type Ground"/>
+ <menu_item_check label="Volumen" name="Rendering Type Volume"/>
+ <menu_item_check label="Hierba" name="Rendering Type Grass"/>
+ <menu_item_check label="Nubes" name="Rendering Type Clouds"/>
+ <menu_item_check label="Partículas" name="Rendering Type Particles"/>
+ <menu_item_check label="Efectos de relieve" name="Rendering Type Bump"/>
</menu>
<menu label="Rasgos renderizados" name="Rendering Features">
- <menu_item_check label="UI" name="UI"/>
+ <menu_item_check label="UI" name="ToggleUI"/>
<menu_item_check label="Seleccionado" name="Selected"/>
<menu_item_check label="Realzados" name="Highlighted"/>
<menu_item_check label="Texturas dinámicas" name="Dynamic Textures"/>
@@ -172,13 +203,9 @@
<menu_item_check label="Usar Plugin Read Thread" name="Use Plugin Read Thread"/>
<menu_item_call label="Vaciar la caché de grupo" name="ClearGroupCache"/>
<menu_item_check label="Vista subjetiva suavizada" name="Mouse Smoothing"/>
+ <menu_item_call label="Recuperar las teclas" name="Release Keys"/>
<menu label="Atajos de teclado" name="Shortcuts">
- <menu_item_call label="Imagen ([COST] L$)..." name="Upload Image"/>
- <menu_item_check label="Buscar" name="Search"/>
- <menu_item_call label="Recuperar las teclas" name="Release Keys"/>
- <menu_item_call label="Interfaz en el tamaño predeterminado" name="Set UI Size to Default"/>
- <menu_item_check label="Correr siempre" name="Always Run"/>
- <menu_item_check label="Volar" name="Fly"/>
+ <menu_item_check label="Mostrar el menú Avanzado - acceso directo antiguo" name="Show Advanced Menu - legacy shortcut"/>
<menu_item_call label="Cerrar la ventana" name="Close Window"/>
<menu_item_call label="Cerrar todas las ventanas" name="Close All Windows"/>
<menu_item_call label="Guardar una foto" name="Snapshot to Disk"/>
@@ -186,17 +213,9 @@
<menu_item_check label="Flycam del joystick" name="Joystick Flycam"/>
<menu_item_call label="Volver a la vista por defecto" name="Reset View"/>
<menu_item_call label="Mirar al último que habló" name="Look at Last Chatter"/>
- <menu label="Seleccionar la herramienta de construcción" name="Select Tool">
- <menu_item_call label="Herramienta Visión" name="Focus"/>
- <menu_item_call label="Herramienta Mover" name="Move"/>
- <menu_item_call label="Herramienta Editar" name="Edit"/>
- <menu_item_call label="Herramienta Crear" name="Create"/>
- <menu_item_call label="Herramienta Terreno" name="Land"/>
- </menu>
<menu_item_call label="Acercar el zoom" name="Zoom In"/>
<menu_item_call label="Zoom por defecto" name="Zoom Default"/>
<menu_item_call label="Alejar el zoom" name="Zoom Out"/>
- <menu_item_check label="Mostrar el menú Avanzado" name="Show Advanced Menu"/>
</menu>
<menu_item_call label="Mostrar las configuraciones del depurador" name="Debug Settings"/>
<menu_item_check label="Mostrar el menú &apos;Develop&apos;" name="Debug Mode"/>
@@ -210,6 +229,7 @@
<menu_item_check label="Texture Category Console" name="Texture Category"/>
<menu_item_check label="Fast Timers" name="Fast Timers"/>
<menu_item_check label="Memory" name="Memory"/>
+ <menu_item_check label="Datos de la escena" name="Scene Statistics"/>
<menu_item_call label="Region Info to Debug Console" name="Region Info to Debug Console"/>
<menu_item_check label="Camera" name="Camera"/>
<menu_item_check label="Wind" name="Wind"/>
@@ -217,8 +237,12 @@
</menu>
<menu label="Show Info" name="Display Info">
<menu_item_check label="Show Time" name="Show Time"/>
+ <menu_item_check label="Mostrar coste de carga" name="Show Upload Cost"/>
<menu_item_check label="Show Render Info" name="Show Render Info"/>
+ <menu_item_check label="Mostrar información de textura" name="Show Texture Info"/>
<menu_item_check label="Show Color Under Cursor" name="Show Color Under Cursor"/>
+ <menu_item_check label="Mostrar la memoria" name="Show Memory"/>
+ <menu_item_check label="Mostrar información de memoria privada" name="Show Private Mem Info"/>
<menu_item_check label="Show Updates to Objects" name="Show Updates"/>
</menu>
<menu label="Force an Error" name="Force Errors">
@@ -236,13 +260,23 @@
<menu_item_check label="Randomize Framerate" name="Randomize Framerate"/>
<menu_item_check label="Frame Test" name="Frame Test"/>
</menu>
+ <menu label="Render Metadata" name="Render Metadata">
+ <menu_item_check label="Normales" name="Normals"/>
+ <menu_item_check label="Formas del físico" name="Physics Shapes"/>
+ <menu_item_check label="Actualizar el tipo" name="Update Type"/>
+ <menu_item_check label="Información sobre el nivel de detalle" name="LOD Info"/>
+ <menu_item_check label="Crear cola" name="Build Queue"/>
+ <menu_item_check label="Vectores de viento" name="Wind Vectors"/>
+ <menu_item_check label="Complejidad del renderizado" name="rendercomplexity"/>
+ <menu_item_check label="Bytes de adjunto" name="attachment bytes"/>
+ <menu_item_check label="Esculpir" name="Sculpt"/>
+ </menu>
<menu label="Rendering" name="Rendering">
<menu_item_check label="Axes" name="Axes"/>
<menu_item_check label="Wireframe" name="Wireframe"/>
<menu_item_check label="Luces y sombras" name="Lighting and Shadows"/>
<menu_item_check label="Sombras del sol/la luna/proyectores" name="Shadows from Sun/Moon/Projectors"/>
<menu_item_check label="SSAO y sombras suavizadas" name="SSAO and Shadow Smoothing"/>
- <menu_item_check label="Iluminación global (experimental)" name="Global Illumination"/>
<menu_item_check label="Capas alfa automáticas (deferidas)" name="Automatic Alpha Masks (deferred)"/>
<menu_item_check label="Capas alfa automáticas (no deferidas)" name="Automatic Alpha Masks (non-deferred)"/>
<menu_item_check label="Animation Textures" name="Animation Textures"/>
@@ -257,37 +291,34 @@
<menu_item_call label="Drop a Packet" name="Drop a Packet"/>
</menu>
<menu_item_call label="Bumps, Pushes &amp; Hits" name="Bumps, Pushes &amp;amp; Hits"/>
- <menu label="World" name="World">
- <menu_item_check label="Region Sun Override" name="Sim Sun Override"/>
- <menu_item_check label="Beacon flashing effect" name="Cheesy Beacon"/>
- <menu_item_check label="Fixed Weather" name="Fixed Weather"/>
- <menu_item_call label="Dump Region Object Cache" name="Dump Region Object Cache"/>
+ <menu label="Mundo virtual" name="DevelopWorld">
+ <menu_item_check label="Anular el sol del Sim" name="Sim Sun Override"/>
+ <menu_item_check label="Meteorología fija" name="Fixed Weather"/>
+ <menu_item_call label="Volcar la caché de objetos de la región" name="Dump Region Object Cache"/>
</menu>
<menu label="UI" name="UI">
- <menu_item_call label="Web Browser Test" name="Web Browser Test"/>
+ <menu_item_call label="Prueba de navegadores de medios" name="Web Browser Test"/>
+ <menu_item_call label="Navegador de contenido web" name="Web Content Browser"/>
<menu_item_call label="Print Selected Object Info" name="Print Selected Object Info"/>
<menu_item_call label="Memory Stats" name="Memory Stats"/>
- <menu_item_check label="Haz doble clic en Piloto automático" name="Double-ClickAuto-Pilot"/>
- <menu_item_check label="Teleportar mediante doble clic" name="DoubleClick Teleport"/>
+ <menu_item_check label="Consola de depuración de región" name="Region Debug Console"/>
<menu_item_check label="Debug Clicks" name="Debug Clicks"/>
<menu_item_check label="Debug Mouse Events" name="Debug Mouse Events"/>
</menu>
<menu label="XUI" name="XUI">
<menu_item_call label="Reload Color Settings" name="Reload Color Settings"/>
<menu_item_call label="Show Font Test" name="Show Font Test"/>
- <menu_item_call label="Load from XML" name="Load from XML"/>
- <menu_item_call label="Save to XML" name="Save to XML"/>
<menu_item_check label="Show XUI Names" name="Show XUI Names"/>
<menu_item_call label="Send Test IMs" name="Send Test IMs"/>
<menu_item_call label="Eliminar registros de nombres en caché" name="Flush Names Caches"/>
</menu>
<menu label="Avatar" name="Character">
<menu label="Grab Baked Texture" name="Grab Baked Texture">
- <menu_item_call label="Iris" name="Iris"/>
- <menu_item_call label="Head" name="Head"/>
- <menu_item_call label="Upper Body" name="Upper Body"/>
- <menu_item_call label="Lower Body" name="Lower Body"/>
- <menu_item_call label="Skirt" name="Skirt"/>
+ <menu_item_call label="Iris" name="Grab Iris"/>
+ <menu_item_call label="Cabeza" name="Grab Head"/>
+ <menu_item_call label="Parte superior del cuerpo" name="Grab Upper Body"/>
+ <menu_item_call label="Parte inferior del cuerpo" name="Grab Lower Body"/>
+ <menu_item_call label="Falda" name="Grab Skirt"/>
</menu>
<menu label="Character Tests" name="Character Tests">
<menu_item_call label="Toggle Character Geometry" name="Toggle Character Geometry"/>
@@ -302,18 +333,21 @@
<menu_item_call label="Debug Avatar Textures" name="Debug Avatar Textures"/>
</menu>
<menu_item_check label="HTTP Textures" name="HTTP Textures"/>
+ <menu_item_check label="Inventario HTTP" name="HTTP Inventory"/>
<menu_item_check label="Console Window on next Run" name="Console Window"/>
- <menu_item_check label="Show Admin Menu" name="View Admin Options"/>
+ <menu label="Configurar el nivel de registro" name="Set Logging Level"/>
<menu_item_call label="Request Admin Status" name="Request Admin Options"/>
<menu_item_call label="Leave Admin Status" name="Leave Admin Options"/>
+ <menu_item_check label="Show Admin Menu" name="View Admin Options"/>
</menu>
<menu label="Admin" name="Admin">
- <menu label="Object">
- <menu_item_call label="Coger una copia" name="Take Copy"/>
- <menu_item_call label="Force Owner To Me" name="Force Owner To Me"/>
- <menu_item_call label="Force Owner Permissive" name="Force Owner Permissive"/>
+ <menu label="Objeto" name="AdminObject">
+ <menu_item_call label="Tomar una copia" name="Admin Take Copy"/>
+ <menu_item_call label="Forzar que yo sea el propietario" name="Force Owner To Me"/>
+ <menu_item_call label="Forzar permiso al propietario" name="Force Owner Permissive"/>
<menu_item_call label="Eliminar" name="Delete"/>
- <menu_item_call label="Lock" name="Lock"/>
+ <menu_item_call label="Bloquear" name="Lock"/>
+ <menu_item_call label="Obtener ID de objetos" name="Get Assets IDs"/>
</menu>
<menu label="Parcel" name="Parcel">
<menu_item_call label="Force Owner To Me" name="Owner To Me"/>
@@ -326,4 +360,20 @@
</menu>
<menu_item_call label="God Tools" name="God Tools"/>
</menu>
+ <menu label="Admin" name="Deprecated">
+ <menu label="Take Off Clothing" name="Take Off Clothing">
+ <menu_item_call label="Física" name="Physics"/>
+ </menu>
+ <menu label="Ayuda" name="DeprecatedHelp">
+ <menu_item_call label="Blog oficial" name="Official Linden Blog"/>
+ <menu_item_call label="Portal de programación" name="Scripting Portal"/>
+ <menu label="Informes de fallos" name="Bug Reporting">
+ <menu_item_call label="Public Issue Tracker" name="Public Issue Tracker"/>
+ <menu_item_call label="Ayuda del Public Issue Tracker" name="Publc Issue Tracker Help"/>
+ <menu_item_call label="Informes de fallos - instrucciones" name="Bug Reporing 101"/>
+ <menu_item_call label="Problemas de seguridad" name="Security Issues"/>
+ <menu_item_call label="Wiki QA" name="QA Wiki"/>
+ </menu>
+ </menu>
+ </menu>
</menu_bar>
diff --git a/indra/newview/skins/default/xui/es/menu_wearing_gear.xml b/indra/newview/skins/default/xui/es/menu_wearing_gear.xml
index 9d9ce75e53..ec13f99a01 100644
--- a/indra/newview/skins/default/xui/es/menu_wearing_gear.xml
+++ b/indra/newview/skins/default/xui/es/menu_wearing_gear.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Gear Wearing">
+<toggleable_menu name="Gear Wearing">
<menu_item_call label="Editar el vestuario" name="edit"/>
<menu_item_call label="Quitarme" name="takeoff"/>
-</menu>
+ <menu_item_call label="Copiar la lista del vestuario al portapapeles" name="copy"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/es/notifications.xml b/indra/newview/skins/default/xui/es/notifications.xml
index 6c5fe6a9eb..d47c3d7ad8 100644
--- a/indra/newview/skins/default/xui/es/notifications.xml
+++ b/indra/newview/skins/default/xui/es/notifications.xml
@@ -73,7 +73,7 @@ Detalles del error: la notificación de nombre &apos;[_NAME]&apos; no se ha enco
</notification>
<notification name="LoginFailedNoNetwork">
No se puede conectar con [SECOND_LIFE_GRID].
-&apos;[DIAGNOSTIC]&apos;
+ &apos;[DIAGNOSTIC]&apos;
Asegúrate de que tu conexión a Internet está funcionando adecuadamente.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
@@ -85,6 +85,40 @@ Asegúrate de que tu conexión a Internet está funcionando adecuadamente.
¿Guardar los cambios en las ropas o partes del cuerpo actuales?
<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="No guardarlos" yestext="Guardarlos"/>
</notification>
+ <notification name="ConfirmNoCopyToOutbox">
+ No tienes permiso para copiar uno o varios de estos objetos en el Buzón de salida de comerciante. Puedes moverlos o dejártelos.
+ <usetemplate name="okcancelbuttons" notext="No mover objeto(s)" yestext="Mover objeto(s)"/>
+ </notification>
+ <notification name="OutboxFolderCreated">
+ Se ha creado una carpeta nueva para cada objeto que has transferido al nivel superior de tu Buzón de salida de comerciante.
+ <usetemplate ignoretext="Se ha creado una carpeta nueva en el Buzón de salida de comerciante" name="okignore" yestext="OK"/>
+ </notification>
+ <notification name="OutboxImportComplete">
+ Éxito
+
+Todas las carpetas se han enviado correctamente al Mercado.
+ <usetemplate ignoretext="Todas las carpetas enviadas al Mercado" name="okignore" yestext="OK"/>
+ </notification>
+ <notification name="OutboxImportHadErrors">
+ Algunas carpetas no se han transferido
+
+Han ocurrido errores al enviar algunas carpetas al Mercado. Dichas carpetas todavía están en tu Buzón de salida de comerciante.
+
+Puedes consultar más información en el [[MARKETPLACE_IMPORTS_URL] registro de errores].
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="OutboxImportFailed">
+ Error de transferencia
+
+No se han enviado carpetas al Mercado a causa de un error del sistema o de la red. Vuelve a intentarlo más tarde.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="OutboxInitFailed">
+ Error al inicializar el mercado
+
+La inicialización del mercado ha fallado por un error del sistema o de la red. Vuelve a intentarlo más tarde.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="CompileQueueSaveText">
Hubo un problema al subir el texto de un script por la siguiente razón: [REASON]. Por favor, inténtalo más tarde.
</notification>
@@ -108,6 +142,10 @@ Asegúrate de que tu conexión a Internet está funcionando adecuadamente.
Quienes no sean tus amigos no sabrán que has elegido ignorar sus llamadas y mensajes instantáneos.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="FavoritesOnLogin">
+ Nota: Al activar esta opción, cualquiera que utilice este ordenador podrá ver tu lista de lugares favoritos.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="GrantModifyRights">
Al conceder permisos de modificación a otro Residente, le estás permitiendo cambiar, borrar o tomar CUALQUIER objeto que tengas en el mundo. Sé MUY cuidadoso al conceder este permiso.
¿Quieres conceder permisos de modificación a [NAME]?
@@ -326,13 +364,6 @@ Necesitas una cuenta para acceder a [SECOND_LIFE]. ¿Te gustaría crear una ahor
<notification name="InvalidCredentialFormat">
Escribe el nombre de usuario o el nombre y el apellido de tu avatar en el campo Nombre de usuario e inicia sesión otra vez.
</notification>
- <notification name="AddClassified">
- Los anuncios clasificados aparecen durante una semana en la sección &apos;Clasificados&apos; de la búsqueda y en [http://secondlife.com/community/classifieds secondlife.com].
-Rellena tu anuncio y pulsa &apos;Publicar...&apos; para añadirlo al directorio.
-Cuando pulses Publicar, se te preguntará por un precio a pagar.
-El pagar más hará que tu anuncio aparezca más arriba en la lista, y que también aparezca más arriba en la lista cuando la gente busque por palabras clave.
- <usetemplate ignoretext="Cómo crear un anuncio clasificado nuevo." name="okcancelignore" notext="Cancelar" yestext="OK"/>
- </notification>
<notification name="DeleteClassified">
¿Borrar el clasificado &apos;[NAME]&apos;?
No se reembolsan las cuotas pagadas.
@@ -385,6 +416,9 @@ Nota: esto vaciará la caché.
<notification name="ChangeSkin">
Verás la nueva apariencia cuando reinicies [APP_NAME].
</notification>
+ <notification name="ChangeLanguage">
+ El cambio de idioma tendrá efecto cuando reinicies [APP_NAME].
+ </notification>
<notification name="GoToAuctionPage">
¿Ir a la página web de [SECOND_LIFE] para ver los detalles de la subasta
o hacer una puja?
@@ -599,6 +633,10 @@ Podría ser [VALIDS]
No se encontró el fragmento &apos;data&apos; en la cabecera del WAV:
[FILE]
</notification>
+ <notification name="SoundFileInvalidChunkSize">
+ Tamaño de lote erróneo en el archivo WAV:
+[FILE]
+ </notification>
<notification name="SoundFileInvalidTooLong">
El archivo de audio es demasiado largo (10 segundos como máximo):
[FILE]
@@ -939,7 +977,7 @@ no tienes el permiso de comprar terreno para el grupo que tienes activado actual
<input name="message">
[DESC] (nuevo)
</input>
- <button name="Offer" text="OK"/>
+ <button name="OK" text="OK"/>
<button name="Cancel" text="Cancelar"/>
</form>
</notification>
@@ -949,7 +987,7 @@ no tienes el permiso de comprar terreno para el grupo que tienes activado actual
<input name="message">
[DESC] (nuevo)
</input>
- <button name="Offer" text="OK"/>
+ <button name="OK" text="OK"/>
<button name="Cancel" text="Cancelar"/>
</form>
</notification>
@@ -959,12 +997,12 @@ no tienes el permiso de comprar terreno para el grupo que tienes activado actual
<input name="new_name">
[NAME]
</input>
- <button name="Offer" text="OK"/>
+ <button name="OK" text="OK"/>
<button name="Cancel" text="Cancelar"/>
</form>
</notification>
<notification name="RemoveFromFriends">
- ¿Quieres eliminar a [NAME] de tu lista de amigos?
+ ¿Quieres eliminar a &lt;nolink&gt;[NAME]&lt;/nolink&gt; de tu lista de amigos?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="RemoveMultipleFromFriends">
@@ -1097,8 +1135,13 @@ El precio de compra del terreno no se le devolverá al propietario. Si se vende
<notification name="DisplaySetToSafe">
Las configuraciones que se muestran se han fijado en los niveles guardados, pues especificaste la opción de guardarlos.
</notification>
- <notification name="DisplaySetToRecommended">
- Las configuraciones que se muestran se han fijado en los niveles recomendados para la configuración de tu sistema.
+ <notification name="DisplaySetToRecommendedGPUChange">
+ La configuración de pantalla se ha establecido en los niveles recomendados porque tu tarjeta de gráficos ha cambiado
+de &apos;[LAST_GPU]&apos;
+a &apos;[THIS_GPU]&apos;
+ </notification>
+ <notification name="DisplaySetToRecommendedFeatureChange">
+ La configuración de pantalla se ha establecido en los niveles recomendados a causa de un cambio en el subsistema de renderizado.
</notification>
<notification name="ErrorMessage">
[ERROR_MESSAGE]
@@ -1334,6 +1377,48 @@ Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar
¿Descargarla a tu carpeta de Programas?
<usetemplate name="okcancelbuttons" notext="Continuar" yestext="Descargarla"/>
</notification>
+ <notification name="FailedUpdateInstall">
+ Se ha producido un error al instalar la actualización del visor.
+Descarga e instala el último visor a través de
+http://secondlife.com/download.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="FailedRequiredUpdateInstall">
+ No hemos podido instalar una actualización necesaria.
+No podrás iniciar sesión hasta que [APP_NAME] se haya actualizado.
+
+Descarga e instala el último visor a través de
+http://secondlife.com/download.
+ <usetemplate name="okbutton" yestext="Salir"/>
+ </notification>
+ <notification name="UpdaterServiceNotRunning">
+ Hay una actualización necesaria para la instalación de Second Life.
+
+Puedes descargar esta actualización de http://www.secondlife.com/downloads
+o instalarla ahora.
+ <usetemplate name="okcancelbuttons" notext="Salir de Second Life" yestext="Descargar e instalar ahora"/>
+ </notification>
+ <notification name="DownloadBackgroundTip">
+ Hemos descargado una actualización para la instalación de [APP_NAME].
+Versión [VERSION] [[RELEASE_NOTES_FULL_URL]; información acerca de esta actualización]
+ <usetemplate name="okcancelbuttons" notext="Más tarde..." yestext="Instalar ahora y reiniciar [NOMBRE_APL]"/>
+ </notification>
+ <notification name="DownloadBackgroundDialog">
+ Hemos descargado una actualización para la instalación de [APP_NAME].
+Versión [VERSION] [[RELEASE_NOTES_FULL_URL]; información acerca de esta actualización]
+ <usetemplate name="okcancelbuttons" notext="Más tarde..." yestext="Instalar ahora y reiniciar [APP_NAME]"/>
+ </notification>
+ <notification name="RequiredUpdateDownloadedVerboseDialog">
+ Hemos descargado una actualización de software necesaria.
+Versión [VERSION]
+
+Debemos reiniciar [APP_NAME] para instalar la actualización.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="RequiredUpdateDownloadedDialog">
+ Debemos reiniciar [APP_NAME] para instalar la actualización.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="DeedObjectToGroup">
Transferir este objeto al grupo hará que:
* Reciba los L$ pagados en el objeto
@@ -1378,8 +1463,8 @@ Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar
<usetemplate ignoretext="Confirmar antes de devolver objetos a sus propietarios." name="okcancelignore" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="GroupLeaveConfirmMember">
- Actualmente, eres miembro del grupo [GROUP].
-¿Dejar el grupo?
+ Actualmente perteneces al grupo &lt;nolink&gt;[GROUP]&lt;/nolink&gt;.
+¿Deseas abandonar el grupo?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="ConfirmKick">
@@ -1514,6 +1599,11 @@ Vuelve a intentarlo más tarde.
<button name="Cancel" text="Cancelar"/>
</form>
</notification>
+ <notification name="TooManyTeleportOffers">
+ Has intentado hacer [OFFERS] ofertas de teleporte,
+excediendo el límite de [LIMIT].
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="OfferTeleportFromGod">
¿Obligar a este Residente a ir a tu localización?
<form name="form">
@@ -1715,11 +1805,11 @@ Puedes pulsar &apos;Cambiar las Preferencias&apos; para incrementar las preferen
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="SetClassifiedMature">
- ¿Este anuncio tiene contenido &apos;Moderado&apos;?
+ ¿Este anuncio tiene contenido moderado?
<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="No" yestext="Sí"/>
</notification>
<notification name="SetGroupMature">
- ¿Este grupo tiene contenido &apos;Moderado&apos;?
+ ¿Este grupo tiene contenido moderado?
<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="No" yestext="Sí"/>
</notification>
<notification label="Confirmar el reinicio" name="ConfirmRestart">
@@ -1855,6 +1945,18 @@ Dado que estos objetos tienen scripts, moverlos a tu inventario puede provocar u
¿Estás seguro de que quieres salir?
<usetemplate ignoretext="Confirmar antes de salir" name="okcancelignore" notext="No salir" yestext="Salir"/>
</notification>
+ <notification name="ConfirmRestoreToybox">
+ Esta acción restaurará los botones y barras de herramientas predeterminados.
+
+Esta acción no se puede deshacer.
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmClearAllToybox">
+ Esta acción volverá a colocar todos los botones a la caja de herramientas y las barras de herramientas aparecerán vacías.
+
+Esta acción no se puede deshacer.
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
<notification name="DeleteItems">
[QUESTION]
<usetemplate ignoretext="Confirmar antes de eliminar elementos" name="okcancelignore" notext="Cancelar" yestext="OK"/>
@@ -1934,6 +2036,10 @@ Linden Lab
¿Estás seguro de que quieres borrar tu historial web, de viajes y de búsquedas?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
+ <notification name="ConfirmClearCache">
+ ¿Estás seguro de que quieres vaciar la caché del visor?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
<notification name="ConfirmClearCookies">
¿Estás seguro de que quieres limpiar tus cookies?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Sí"/>
@@ -1959,48 +2065,30 @@ Publícala en una página web para que otros puedan acceder fácilmente a esta p
¿Quieres sobrescribir la preselección guardada?
<usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
</notification>
- <notification name="WLDeletePresetAlert">
- ¿Quieres borrar [SKY]?
- <usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
- </notification>
<notification name="WLNoEditDefault">
No puedes editar ni borrar una preselección por defecto.
</notification>
<notification name="WLMissingSky">
Este archivo del ciclo de un día se refiere a un archivo perdido de cielo: [SKY].
</notification>
- <notification name="PPSaveEffectAlert">
- Ya existe un efecto de procesamiento. ¿Quieres sobreescribirlo?
- <usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
- </notification>
- <notification name="NewSkyPreset">
- Dame un nombre para el cielo nuevo.
- <form name="form">
- <input name="message">
- Preselección nueva
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Cancelar"/>
- </form>
+ <notification name="WLRegionApplyFail">
+ No se pudo aplicar la configuración a la región. El problema podría solucionarse saliendo de la región y regresando a ella. La razón especificada fue: [FAIL_REASON]
</notification>
- <notification name="ExistsSkyPresetAlert">
- ¡Esa preselección ya existe!
+ <notification name="EnvCannotDeleteLastDayCycleKey">
+ No se puede eliminar la última clave de este ciclo del día, ya que no puedes vaciar la caché del día. En lugar de intentar eliminar la última clave restante y después intentar crear una nueva, debes modificarla.
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="NewWaterPreset">
- Dame un nombre para la nueva preselección de agua.
- <form name="form">
- <input name="message">
- Preselección nueva
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Cancelar"/>
- </form>
+ <notification name="DayCycleTooManyKeyframes">
+ No se pueden añadir más fotogramas clave a este ciclo del día. El número máximo de fotogramas clave para ciclos del día de alcance [SCOPE] es [MAX].
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="ExistsWaterPresetAlert">
- ¡Esa preselección ya existe!
+ <notification name="EnvUpdateRate">
+ La configuración de entorno de la región sólo puede actualizarse cada [WAIT] segundos. Espera por lo menos este tiempo y vuelve intentarlo.
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="WaterNoEditDefault">
- No puedes editar o borrar una preselección por defecto.
+ <notification name="PPSaveEffectAlert">
+ Ya existe un efecto de procesamiento. ¿Quieres sobreescribirlo?
+ <usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
</notification>
<notification name="ChatterBoxSessionStartError">
No se puede empezar una nueva sesión de chat con [RECIPIENT].
@@ -2029,13 +2117,14 @@ Publícala en una página web para que otros puedan acceder fácilmente a esta p
<usetemplate ignoretext="Ponerme la ropa que estoy creando mientras modifico mi apariencia" name="okcancelignore" notext="No" yestext="Sí"/>
</notification>
<notification name="NotAgeVerified">
- Debes haber verificado tu edad para visitar este sitio. ¿Quieres ir al sitio web de [SECOND_LIFE] y verificarla?
+ Para acceder al contenido Adulto y los lugares de Second Life con dicho carácter, debes tener por lo menos 18 años. Visita la página de verificación de edad para confirmar que tienes más de 18 años.
+Al hacerlo se iniciará el navegador web.
[_URL]
<url name="url" option="0">
- https://secondlife.com/account/verification.php?lang=es
+ https://secondlife.com/my/account/verification.php
</url>
- <usetemplate ignoretext="No he verificado mi edad" name="okcancelignore" notext="No" yestext="Sí"/>
+ <usetemplate ignoretext="No he verificado mi edad" name="okcancelignore" notext="Cancelar" yestext="Ir a Verificación de la edad"/>
</notification>
<notification name="Cannot enter parcel: no payment info on file">
Para visitar este sitio debes haber aportado información de pago en tu cuenta. ¿Quieres ir al sitio web de [SECOND_LIFE] y configurar esto?
@@ -2071,10 +2160,10 @@ Publícala en una página web para que otros puedan acceder fácilmente a esta p
Asunto: [SUBJECT], Mensaje: [MESSAGE]
</notification>
<notification name="FriendOnline">
- [NAME] está conectado
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; está conectado
</notification>
<notification name="FriendOffline">
- [NAME] está desconectado
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; está desconectado
</notification>
<notification name="AddSelfFriend">
Aunque eres muy agradable, no puedes añadirte como amigo a ti mismo.
@@ -2120,6 +2209,12 @@ Esto puede influir en tu contraseña.
<notification name="RezItemNoPermissions">
No tienes permisos suficientes para renderizar el objeto.
</notification>
+ <notification name="IMAcrossParentEstates">
+ No se pueden enviar mensajes instantáneos entre propiedades principales.
+ </notification>
+ <notification name="TransferInventoryAcrossParentEstates">
+ No se puede transferir el inventario entre propiedades principales.
+ </notification>
<notification name="UnableToLoadNotecard">
En este momento no se puede cargar la nota.
</notification>
@@ -2181,14 +2276,16 @@ Por favor, selecciona un sólo objeto.
Se ha rehusado tu tarjeta de visita.
</notification>
<notification name="TeleportToLandmark">
- Puedes teleportarte a lugares como &apos;[NAME]&apos; abriendo el panel Lugares -a la derecha de tu pantalla- y seleccionando la sección Hitos.
-Pulsa en un hito para seleccionarlo, y, luego, pulsa &apos;Teleportar&apos; en la parte inferior del panel.
-(También puedes pulsar dos veces en el hito o pulsarlo con el botón derecho del ratón y elegir &apos;Teleportar&apos;.)
+ Para teleportarte a lugares como &apos;[NAME]&apos;, pulsa el botón &quot;Lugares&quot;,
+ y selecciona la pestaña Hitos en la ventana que se abre. Pulsa en un
+ hito para seleccionarlo y luego pulsa &apos;Teleportar&apos; en la parte inferior de la ventana.
+ (También puedes pulsar dos veces en el hito o pulsarlo con el botón derecho del ratón y
+ elegir &apos;Teleportar&apos;.)
</notification>
<notification name="TeleportToPerson">
- Puedes contactar con un Residente como &apos;[NAME]&apos; abriendo el panel Gente en el lado derecho de tu pantalla.
-Elige al Residente de la lista y pulsa &apos;MI&apos; en la parte inferior del panel.
-(También puedes pulsar dos veces en su nombre o pulsarlo con el botón derecho y elegir &apos;MI&apos;).
+ Para ponerte en contacto con Residentes como &apos;[NAME]&apos;, pulsa el botón &quot;Gente&quot;, selecciona un Residente en la ventana que se abre y después pulsa en &apos;MI&apos; en
+ la parte inferior de la ventana.
+ (También puedes pulsar dos veces en su nombre o pulsarlo con el botón derecho y elegir &apos;MI&apos;).
</notification>
<notification name="CantSelectLandFromMultipleRegions">
No puedes seleccionar un terreno que cruce las fronteras entre servidores.
@@ -2198,15 +2295,7 @@ Inténtalo seleccionando un trozo más pequeño de terreno.
Se han excluido algunos términos de tu búsqueda debido a restricciones en el contenido, según se especifica en las Normas de la Comunidad.
</notification>
<notification name="NoContentToSearch">
- Por favor, elige al menos un tipo de contenido a buscar (&apos;PG&apos;, &apos;Mature&apos;, o &apos;Adult&apos;).
- </notification>
- <notification name="GroupVote">
- [NAME] ha propuesto votar:
-[MESSAGE]
- <form name="form">
- <button name="VoteNow" text="Votar ahora"/>
- <button name="Later" text="Más tarde"/>
- </form>
+ Por favor, elige al menos un tipo de contenido a buscar (General, Moderado o Adulto;).
</notification>
<notification name="SystemMessage">
[MESSAGE]
@@ -2217,6 +2306,9 @@ Inténtalo seleccionando un trozo más pequeño de terreno.
<notification name="PaymentSent">
[MESSAGE]
</notification>
+ <notification name="PaymentFailure">
+ [MESSAGE]
+ </notification>
<notification name="EventNotification">
Notificación de un evento:
@@ -2293,6 +2385,9 @@ Aquí no puedes volar.
<notification name="NoBuild">
Este terreno tiene desactivado el poder construir. Aquí no puedes ni construir ni crear objetos.
</notification>
+ <notification name="SeeAvatars">
+ Esta parcela oculta los avatares y el chat de texto de otras parcelas. No podrás ver a los residentes que estén fuera la parcela ni ellos podrán verte a ti. El chat de texto regular del canal 0 también está bloqueado.
+ </notification>
<notification name="ScriptsStopped">
Un administrador ha detenido temporalmente los scripts en esta región.
</notification>
@@ -2321,6 +2416,9 @@ Por favor, dirígete a la Base de Conocimientos para más detalles sobre el acce
<notification name="ImproperPaymentStatus">
No tienes el estado de pago adecuado para entrar a esta región.
</notification>
+ <notification name="MustGetAgeRgion">
+ Debes tener verificada la edad para entrar a esta región
+ </notification>
<notification name="MustGetAgeParcel">
Debes haber verificado tu edad para entrar a esta parcela.
</notification>
@@ -2384,11 +2482,19 @@ Por favor, vuelve a intentarlo en unos momentos.
</notification>
<notification name="ObjectGiveItem">
Un objeto de nombre &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt;, propiedad de [NAME_SLURL], te ha dado este [OBJECTTYPE]:
-[ITEM_SLURL]
+&lt;nolink&gt;[ITEM_SLURL]&lt;/nolink&gt;
+ <form name="form">
+ <button name="Keep" text="Guardar"/>
+ <button name="Discard" text="Descartar"/>
+ <button name="Mute" text="Ignorar al propietario"/>
+ </form>
+ </notification>
+ <notification name="OwnObjectGiveItem">
+ Tu objeto de nombre &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; te ha dado este [OBJECTTYPE]:
+&lt;nolink&gt;[ITEM_SLURL]&lt;/nolink&gt;
<form name="form">
<button name="Keep" text="Guardar"/>
<button name="Discard" text="Descartar"/>
- <button name="Mute" text="Ignorar"/>
</form>
</notification>
<notification name="UserGiveItem">
@@ -2457,10 +2563,10 @@ Por favor, vuelve a intentarlo en unos momentos.
</form>
</notification>
<notification name="FriendshipAccepted">
- [NAME] ha aceptado tu oferta de amistad.
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; ha aceptado tu ofrecimiento de amistad.
</notification>
<notification name="FriendshipDeclined">
- [NAME] ha rehusado tu oferta de amistad.
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; ha rechazado tu ofrecimiento de amistad.
</notification>
<notification name="FriendshipAcceptedByMe">
Aceptado el ofrecimiento de amistad.
@@ -2532,6 +2638,7 @@ Si no confias en este objeto y en su creador, deberías rehusar esta petición.
&apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos; de [NAME]
[MESSAGE]
<form name="form">
+ <button name="Mute" text="Ignorar"/>
<button name="Ignore" text="Ignorar"/>
</form>
</notification>
@@ -2539,6 +2646,7 @@ Si no confias en este objeto y en su creador, deberías rehusar esta petición.
&apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos; de [GROUPNAME]
[MESSAGE]
<form name="form">
+ <button name="Mute" text="Ignorar"/>
<button name="Ignore" text="Ignorar"/>
</form>
</notification>
@@ -2661,9 +2769,6 @@ Pulsa Aceptar o Rehusar para coger o no la llamada. Pulsa Ignorar para ignorar a
<notification name="VoiceCallGenericError">
Se ha producido un error al intentar conectarte al [VOICE_CHANNEL_NAME]. Por favor, inténtalo más tarde.
</notification>
- <notification name="ServerVersionChanged">
- Acabas de entrar en una región que usa un servidor con una versión distinta, y esto puede influir en el funcionamiento. [[URL] Ver las notas de desarrollo].
- </notification>
<notification name="UnsupportedCommandSLURL">
No se admite el formato de la SLurl que has pulsado.
</notification>
@@ -2703,6 +2808,10 @@ Por tu seguridad, serán bloqueadas durante unos segundos.
Un moderador ha silenciado tu voz.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="UploadCostConfirmation">
+ Esta carga te costará [PRECIO] L$. ¿Deseas continuar?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Subir"/>
+ </notification>
<notification name="ConfirmClearTeleportHistory">
¿Estás seguro de que quieres borrar tu historial de teleportes?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
@@ -2714,22 +2823,58 @@ Se mostrará cuando haya suficiente espacio.
<notification name="ShareNotification">
Selecciona los residentes con quienes deseas compartir.
</notification>
+ <notification name="MeshUploadError">
+ [LABEL] no se pudo subir: [MESSAGE] [IDENTIFIER]
+
+Consulta los detalles en el archivo de registro.
+ </notification>
+ <notification name="MeshUploadPermError">
+ Error al solicitar los permisos para subir la malla.
+ </notification>
+ <notification name="RegionCapabilityRequestError">
+ No se ha podido obtener la capacidad de la región &apos;[CAPABILITY]&apos;.
+ </notification>
<notification name="ShareItemsConfirmation">
¿Estás seguro de que quieres compartir los elementos siguientes?
-[ITEMS]
+&lt;nolink&gt;[ITEMS]&lt;/nolink&gt;
Con los siguientes residentes:
[RESIDENTS]
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
+ <notification name="ShareFolderConfirmation">
+ Sólo puedes compartir una carpeta en cada momento.
+
+¿Estás seguro de que quieres compartir los elementos siguientes?
+
+&lt;nolink&gt;[ITEMS]&lt;/nolink&gt;
+
+Con los siguientes Residentes:
+
+[RESIDENTS]
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Aceptar"/>
+ </notification>
<notification name="ItemsShared">
Los elementos se han compartido correctamente.
</notification>
<notification name="DeedToGroupFail">
Error de transferencia a grupo.
</notification>
+ <notification name="ReleaseLandThrottled">
+ La parcela [NOMBRE_PARCELA] no se puede abandonar en este momento.
+ </notification>
+ <notification name="ReleasedLandWithReclaim">
+ Ya está disponible la parcela [NOMBRE_PARCELA] de [ÃREA] m².
+
+Dispondrás de [PERÃODO_DE_RECLAMACIÓN] horas para reclamar la cantidad de 0 L$ antes de que se ponga en venta.
+ </notification>
+ <notification name="ReleasedLandNoReclaim">
+ Ya está disponible la parcela [NOMBRE_PARCELA] de [ÃREA] m².
+
+Ya está en venta.
+ </notification>
<notification name="AvatarRezNotification">
( [EXISTENCE] segundos vivo)
El avatar &apos;[NAME]&apos; tardó [TIME] segundos en dejar de aparecer como nube.
@@ -2766,9 +2911,7 @@ El avatar &apos;[NAME]&apos; desactivó el modo de apariencia.
<notification name="NoConnect">
Tenemos problemas de conexión con [PROTOCOL] [HOSTID].
Comprueba la configuración de la red y del servidor de seguridad.
- <form name="form">
- <button name="OK" text="OK"/>
- </form>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="NoVoiceConnect">
Tenemos problemas de conexión con tu servidor de voz:
@@ -2777,9 +2920,7 @@ Comprueba la configuración de la red y del servidor de seguridad.
No podrás establecer comunicaciones de voz.
Comprueba la configuración de la red y del servidor de seguridad.
- <form name="form">
- <button name="OK" text="OK"/>
- </form>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="AvatarRezLeftNotification">
( [EXISTENCE] segundos vivo)
@@ -2810,6 +2951,13 @@ Si lo haces, todos los residentes que se unan posteriormente a la llamada tambiÃ
<notification label="Levantarme" name="HintSit">
Para levantarte y salir de la posición de sentado, haz clic en el botón Levantarme.
</notification>
+ <notification label="Hablar" name="HintSpeak">
+ Pulsa en el botón: Hablar para conectar y desconectar el micrófono.
+
+Pulsa en el cursor arriba para ver el panel de control de voz.
+
+Al ocultar el botón Hablar se desactiva la función de voz.
+ </notification>
<notification label="Explora el mundo" name="HintDestinationGuide">
La Guía de destinos contiene miles de nuevos lugares por descubrir. Selecciona una ubicación y elige Teleportarme para iniciar la exploración.
</notification>
@@ -2819,15 +2967,29 @@ Si lo haces, todos los residentes que se unan posteriormente a la llamada tambiÃ
<notification label="Mover" name="HintMove">
Si deseas caminar o correr, abre el panel Mover y utiliza las flechas de dirección para navegar. También puedes utilizar las flechas de dirección del teclado.
</notification>
+ <notification label="" name="HintMoveClick">
+ 1. Pulsa para caminar: Pulsa en cualquier punto del terreno para ir a él.
+
+2. Pulsa y arrastra para girar la vista: Pulsa y arrastra el cursor a cualquier parte del mundo para girar la vista.
+ </notification>
<notification label="Nombre mostrado" name="HintDisplayName">
Configura y personaliza aquí tu nombre mostrado. Esto se añadirá a tu nombre de usuario personal, que no puedes modificar. Puedes cambiar la manera en que ves los nombres de otras personas en tus preferencias.
</notification>
+ <notification label="Visión" name="HintView">
+ Para cambiar la vista de la cámara, utiliza los controles Orbital y Panorámica. Para restablecer tu vista, pulsa Esc o camina.
+ </notification>
<notification label="Inventario" name="HintInventory">
Accede a tu inventario para buscar ítems. Los ítems más recientes se pueden encontrar fácilmente en la pestaña Recientes.
</notification>
<notification label="¡Tienes dólares Linden!" name="HintLindenDollar">
Éste es tu saldo actual de L$. Haz clic en Comprar L$ para comprar más dólares Linden.
</notification>
+ <notification name="LowMemory">
+ Tu bloque de memoria es insuficiente. Algunas funciones de SL se han desactivado para evitar una caída. Por favor cierra otras aplicaciones. Si el problema continúa, reinicia SL.
+ </notification>
+ <notification name="ForceQuitDueToLowMemory">
+ SL saldrá en 30 segundos porque no hay memoria suficiente.
+ </notification>
<notification name="PopupAttempt">
Se ha impedido que se abriera una ventana emergente.
<form name="form">
@@ -2835,9 +2997,111 @@ Si lo haces, todos los residentes que se unan posteriormente a la llamada tambiÃ
<button name="open" text="Abrir ventana emergente"/>
</form>
</notification>
- <global name="UnsupportedCPU">
- - La velocidad de tu CPU no cumple los requerimientos mínimos.
- </global>
+ <notification name="SOCKS_NOT_PERMITTED">
+ El proxy SOCKS 5 &quot;[HOST]:[PORT]&quot; ha rechazado la conexión, no está permitida por el juego de reglas.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_CONNECT_ERROR">
+ El proxy SOCKS 5 &quot;[HOST]:[PORT]&quot; ha rechazado la conexión, no se ha podido abrir el canal TCP.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_NOT_ACCEPTABLE">
+ El proxy SOCKS 5 &quot;[HOST]:[PORT]&quot; ha rechazado el sistema de autenticación seleccionado.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_AUTH_FAIL">
+ El proxy SOCKS 5 &quot;[HOST]:[PORT]&quot; contestó que tus credenciales no son válidas.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_UDP_FWD_NOT_GRANTED">
+ El proxy SOCKS 5 &quot;[HOST]:[PORT]&quot; ha rechazado la petición asociada de UDP.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_HOST_CONNECT_FAILED">
+ No se pudo establecer una conexión con el servidor proxy SOCKS 5 &quot;[HOST]:[PORT]&quot;.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_UNKNOWN_STATUS">
+ Error de proxy desconocido con el servidor &quot;[HOST]:[PORT]&quot;.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_INVALID_HOST">
+ Dirección o puerto de proxy SOCKS no válidos &quot;[HOST]:[PORT]&quot;.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_BAD_CREDS">
+ Nombre de usuario o contraseña de SOCKS 5 no válidos.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="PROXY_INVALID_HTTP_HOST">
+ Dirección o puerto de proxy HTTP no válidos &quot;[HOST]:[PORT]&quot;.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="PROXY_INVALID_SOCKS_HOST">
+ Dirección o puerto de proxy SOCKS no válidos &quot;[HOST]:[PORT]&quot;.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ChangeProxySettings">
+ La configuración del puerto se activará cuando reinicies [APP_NAME].
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="AuthRequest">
+ El sitio en &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos; de la plataforma &apos;[REALM]&apos; requiere un nombre de usuario y una contraseña.
+ <form name="form">
+ <input name="username" text="Nombre de usuario"/>
+ <input name="password" text="Contraseña"/>
+ <button name="ok" text="Enviar"/>
+ <button name="cancel" text="Cancelar"/>
+ </form>
+ </notification>
+ <notification label="" name="NoClassifieds">
+ La creación y edición de clasificados sólo está disponible en el modo Avanzado. ¿Quieres salir y cambiar de modo? El selector de modo se encuentra en la pantalla de inicio de sesión.
+ <usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
+ </notification>
+ <notification label="" name="NoGroupInfo">
+ La creación y edición de grupos sólo está disponible en el modo Avanzado. ¿Quieres salir y cambiar de modo? El selector de modo se encuentra en la pantalla de inicio de sesión.
+ <usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
+ </notification>
+ <notification label="" name="NoPlaceInfo">
+ La opción de consulta del perfil del lugar solo está disponible en el modo Avanzado. ¿Quieres salir y cambiar de modo? El selector de modo se encuentra en la pantalla de inicio de sesión.
+ <usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
+ </notification>
+ <notification label="" name="NoPicks">
+ La creación y edición de Destacados sólo está disponible en el modo Avanzado. ¿Quieres salir y cambiar de modo? El selector de modo se encuentra en la pantalla de inicio de sesión.
+ <usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
+ </notification>
+ <notification label="" name="NoWorldMap">
+ La visualización del mapa del mundo sólo está disponible en el modo Avanzado. ¿Quieres salir y cambiar de modo? El selector de modo se encuentra en la pantalla de inicio de sesión.
+ <usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
+ </notification>
+ <notification label="" name="NoVoiceCall">
+ Las llamadas de voz sólo están disponibles en el modo Avanzado. ¿Quieres cerrar sesión y cambiar de modo?
+ <usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
+ </notification>
+ <notification label="" name="NoAvatarShare">
+ Compartir sólo está disponible en el modo Avanzado. ¿Quieres cerrar sesión y cambiar de modo?
+ <usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
+ </notification>
+ <notification label="" name="NoAvatarPay">
+ El pago a otros residentes sólo está disponible en el modo Avanzado. ¿Quieres cerrar sesión y cambiar de modo?
+ <usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
+ </notification>
+ <notification label="" name="NoInventory">
+ La opción de consulta del inventario solo está disponible en el modo Avanzado. ¿Quieres cerrar sesión y cambiar de modo?
+ <usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
+ </notification>
+ <notification label="" name="NoAppearance">
+ El editor de apariencia solo está disponible en el modo Avanzado. ¿Quieres cerrar sesión y cambiar de modo?
+ <usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
+ </notification>
+ <notification label="" name="NoSearch">
+ Las búsquedas solo están disponibles en el modo Avanzado. ¿Quieres cerrar sesión y cambiar de modo?
+ <usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
+ </notification>
+ <notification label="" name="ConfirmHideUI">
+ Esta acción ocultará todos los botones y elementos de menú. Para restaurarlos, pulsa otra vez en [SHORTCUT].
+ <usetemplate ignoretext="Confirmar antes de ocultar la IU" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
<global name="UnsupportedGLRequirements">
Parece que no tienes el hardware apropiado para [APP_NAME]. [APP_NAME] requiere una tarjeta gráfica OpenGL que admita texturas múltiples (&apos;multitexture support&apos;). Si la tienes, comprueba que tienes los últimos &apos;drivers&apos; para tu tarjeta gráfica, así como los últimos parches y &apos;service packs&apos; para tu sistema operativo.
diff --git a/indra/newview/skins/default/xui/es/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/es/panel_avatar_list_item.xml
index 09221c5599..5220df5d21 100644
--- a/indra/newview/skins/default/xui/es/panel_avatar_list_item.xml
+++ b/indra/newview/skins/default/xui/es/panel_avatar_list_item.xml
@@ -21,7 +21,7 @@
<string name="FormatYears">
[COUNT] año/s
</string>
- <text name="avatar_name" value="Desconocido"/>
+ <text name="avatar_name" value="(cargando...)"/>
<icon name="permission_edit_theirs_icon" tool_tip="Puedes editar los objetos de este amigo"/>
<icon name="permission_edit_mine_icon" tool_tip="Este amigo puede editar, eliminar o manipular tus objetos"/>
<icon name="permission_map_icon" tool_tip="Este amigo puede encontrarte en el mapa"/>
diff --git a/indra/newview/skins/default/xui/es/panel_chiclet_bar.xml b/indra/newview/skins/default/xui/es/panel_chiclet_bar.xml
new file mode 100644
index 0000000000..eaaa5dbe78
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_chiclet_bar.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="chiclet_bar">
+ <layout_stack name="toolbar_stack">
+ <layout_panel name="im_well_panel">
+ <chiclet_im_well name="im_well">
+ <button name="Unread IM messages" tool_tip="Conversaciones"/>
+ </chiclet_im_well>
+ </layout_panel>
+ <layout_panel name="notification_well_panel">
+ <chiclet_notification name="notification_well">
+ <button name="Unread" tool_tip="Notificaciones"/>
+ </chiclet_notification>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_edit_alpha.xml b/indra/newview/skins/default/xui/es/panel_edit_alpha.xml
index 3f238da9d0..829c206ae1 100644
--- a/indra/newview/skins/default/xui/es/panel_edit_alpha.xml
+++ b/indra/newview/skins/default/xui/es/panel_edit_alpha.xml
@@ -1,10 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_alpha_panel">
- <panel name="avatar_alpha_color_panel">
- <texture_picker label="Alfa inferior" name="Lower Alpha" tool_tip="Pulsa para elegir una imagen"/>
- <texture_picker label="Alfa superior" name="Upper Alpha" tool_tip="Pulsa para elegir una imagen"/>
- <texture_picker label="Alfa de la cabeza" name="Head Alpha" tool_tip="Pulsa para elegir una imagen"/>
- <texture_picker label="Alfa de los ojos" name="Eye Alpha" tool_tip="Pulsa para elegir una imagen"/>
- <texture_picker label="Alfa del pelo" name="Hair Alpha" tool_tip="Pulsa para elegir una imagen"/>
- </panel>
+ <scroll_container name="avatar_alpha_color_panel_scroll">
+ <panel name="avatar_alpha_color_panel">
+ <texture_picker label="Alfa inferior" name="Lower Alpha" tool_tip="Pulsa para elegir una imagen"/>
+ <texture_picker label="Alfa superior" name="Upper Alpha" tool_tip="Pulsa para elegir una imagen"/>
+ <texture_picker label="Alfa de la cabeza" name="Head Alpha" tool_tip="Pulsa para elegir una imagen"/>
+ <texture_picker label="Alfa de los ojos" name="Eye Alpha" tool_tip="Pulsa para elegir una imagen"/>
+ <texture_picker label="Alfa del pelo" name="Hair Alpha" tool_tip="Pulsa para elegir una imagen"/>
+ </panel>
+ </scroll_container>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_edit_gloves.xml b/indra/newview/skins/default/xui/es/panel_edit_gloves.xml
index 684a35a830..d536a862f5 100644
--- a/indra/newview/skins/default/xui/es/panel_edit_gloves.xml
+++ b/indra/newview/skins/default/xui/es/panel_edit_gloves.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_gloves_panel">
<panel name="avatar_gloves_color_panel">
- <texture_picker label="Tela" name="Fabric" tool_tip="Pulsa para elegir una imagen"/>
+ <texture_picker label="Textura" name="Fabric" tool_tip="Pulsa para elegir una imagen"/>
<color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/es/panel_edit_jacket.xml b/indra/newview/skins/default/xui/es/panel_edit_jacket.xml
index 347107d746..22a46a2f75 100644
--- a/indra/newview/skins/default/xui/es/panel_edit_jacket.xml
+++ b/indra/newview/skins/default/xui/es/panel_edit_jacket.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_jacket_panel">
<panel name="avatar_jacket_color_panel">
- <texture_picker label="Tejido superior" name="Upper Fabric" tool_tip="Pulsa para elegir una imagen"/>
- <texture_picker label="Tejido inferior" name="Lower Fabric" tool_tip="Pulsa para elegir una imagen"/>
+ <texture_picker label="Textura superior" name="Upper Fabric" tool_tip="Pulsa para elegir una imagen"/>
+ <texture_picker label="Textura inferior" name="Lower Fabric" tool_tip="Pulsa para elegir una imagen"/>
<color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/es/panel_edit_pants.xml b/indra/newview/skins/default/xui/es/panel_edit_pants.xml
index e765702343..fb35e0953b 100644
--- a/indra/newview/skins/default/xui/es/panel_edit_pants.xml
+++ b/indra/newview/skins/default/xui/es/panel_edit_pants.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_pants_panel">
<panel name="avatar_pants_color_panel">
- <texture_picker label="Tela" name="Fabric" tool_tip="Pulsa para elegir una imagen"/>
+ <texture_picker label="Textura" name="Fabric" tool_tip="Pulsa para elegir una imagen"/>
<color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/es/panel_edit_physics.xml b/indra/newview/skins/default/xui/es/panel_edit_physics.xml
new file mode 100644
index 0000000000..dfb5ab330a
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_edit_physics.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_physics_panel">
+ <panel label="" name="accordion_panel">
+ <accordion name="physics_accordion">
+ <accordion_tab name="physics_breasts_updown_tab" title="Rebote de los senos"/>
+ <accordion_tab name="physics_breasts_inout_tab" title="Canalillo de los senos"/>
+ <accordion_tab name="physics_breasts_leftright_tab" title="Bamboleo de los senos"/>
+ <accordion_tab name="physics_belly_tab" title="Rebote de la barriga"/>
+ <accordion_tab name="physics_butt_tab" title="Rebote del culo"/>
+ <accordion_tab name="physics_butt_leftright_tab" title="Bamboleo del culo"/>
+ <accordion_tab name="physics_advanced_tab" title="Parámetros avanzados"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_edit_pick.xml b/indra/newview/skins/default/xui/es/panel_edit_pick.xml
index 9b101ee4ba..cda465da9c 100644
--- a/indra/newview/skins/default/xui/es/panel_edit_pick.xml
+++ b/indra/newview/skins/default/xui/es/panel_edit_pick.xml
@@ -29,7 +29,7 @@
<layout_panel name="layout_panel1">
<button label="Guardar" name="save_changes_btn"/>
</layout_panel>
- <layout_panel name="layout_panel1">
+ <layout_panel name="layout_panel2">
<button label="Cancelar" name="cancel_btn"/>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/es/panel_edit_profile.xml b/indra/newview/skins/default/xui/es/panel_edit_profile.xml
index 56d03dccc2..8e5e09cfec 100644
--- a/indra/newview/skins/default/xui/es/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/es/panel_edit_profile.xml
@@ -25,11 +25,7 @@
<text name="display_name_label" value="Nombre mostrado:"/>
<text name="solo_username_label" value="Nombre de usuario:"/>
<button name="set_name" tool_tip="Configurar nombre mostrado"/>
- <text name="solo_user_name" value="Hamilton Hitchings"/>
- <text name="user_name" value="Hamilton Hitchings"/>
- <text name="user_name_small" value="Hamilton Hitchings"/>
<text name="user_label" value="Nombre de usuario:"/>
- <text name="user_slid" value="hamilton.linden"/>
<panel name="lifes_images_panel">
<icon label="" name="2nd_life_edit_icon" tool_tip="Pulsa para elegir una imagen"/>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_edit_shirt.xml b/indra/newview/skins/default/xui/es/panel_edit_shirt.xml
index f763e1b18d..73b712374e 100644
--- a/indra/newview/skins/default/xui/es/panel_edit_shirt.xml
+++ b/indra/newview/skins/default/xui/es/panel_edit_shirt.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_shirt_panel">
<panel name="avatar_shirt_color_panel">
- <texture_picker label="Tela" name="Fabric" tool_tip="Pulsa para elegir una imagen"/>
+ <texture_picker label="Textura" name="Fabric" tool_tip="Pulsa para elegir una imagen"/>
<color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/es/panel_edit_shoes.xml b/indra/newview/skins/default/xui/es/panel_edit_shoes.xml
index 70f2027398..5e457612d5 100644
--- a/indra/newview/skins/default/xui/es/panel_edit_shoes.xml
+++ b/indra/newview/skins/default/xui/es/panel_edit_shoes.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_shoes_panel">
<panel name="avatar_shoes_color_panel">
- <texture_picker label="Tela" name="Fabric" tool_tip="Pulsa para elegir una imagen"/>
+ <texture_picker label="Textura" name="Fabric" tool_tip="Pulsa para elegir una imagen"/>
<color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/es/panel_edit_skin.xml b/indra/newview/skins/default/xui/es/panel_edit_skin.xml
index 501ecfb4de..8d895a6152 100644
--- a/indra/newview/skins/default/xui/es/panel_edit_skin.xml
+++ b/indra/newview/skins/default/xui/es/panel_edit_skin.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_skin_panel">
<panel name="avatar_skin_color_panel">
- <texture_picker label="Tatuajes de la cabeza" name="Head Tattoos" tool_tip="Pulsa para elegir una imagen"/>
- <texture_picker label="Tatuajes superiores" name="Upper Tattoos" tool_tip="Pulsa para elegir una imagen"/>
- <texture_picker label="Tatuajes inferiores" name="Lower Tattoos" tool_tip="Pulsa para elegir una imagen"/>
+ <texture_picker label="Cabeza" name="Head" tool_tip="Pulsa para elegir una imagen"/>
+ <texture_picker label="Parte superior del cuerpo" name="Upper Body" tool_tip="Pulsa para elegir una imagen"/>
+ <texture_picker label="Parte inferior del cuerpo" name="Lower Body" tool_tip="Pulsa para elegir una imagen"/>
</panel>
<panel name="accordion_panel">
<accordion name="wearable_accordion">
diff --git a/indra/newview/skins/default/xui/es/panel_edit_skirt.xml b/indra/newview/skins/default/xui/es/panel_edit_skirt.xml
index 2c7196642c..416d174298 100644
--- a/indra/newview/skins/default/xui/es/panel_edit_skirt.xml
+++ b/indra/newview/skins/default/xui/es/panel_edit_skirt.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_skirt_panel">
<panel name="avatar_skirt_color_panel">
- <texture_picker label="Tela" name="Fabric" tool_tip="Pulsa para elegir una imagen"/>
+ <texture_picker label="Textura" name="Fabric" tool_tip="Pulsa para elegir una imagen"/>
<color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/es/panel_edit_socks.xml b/indra/newview/skins/default/xui/es/panel_edit_socks.xml
index 28423eaf61..ac9b2a773e 100644
--- a/indra/newview/skins/default/xui/es/panel_edit_socks.xml
+++ b/indra/newview/skins/default/xui/es/panel_edit_socks.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_socks_panel">
<panel name="avatar_socks_color_panel">
- <texture_picker label="Tela" name="Fabric" tool_tip="Pulsa para elegir una imagen"/>
+ <texture_picker label="Textura" name="Fabric" tool_tip="Pulsa para elegir una imagen"/>
<color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/es/panel_edit_underpants.xml b/indra/newview/skins/default/xui/es/panel_edit_underpants.xml
index 6c82bcfedf..aac8af44b9 100644
--- a/indra/newview/skins/default/xui/es/panel_edit_underpants.xml
+++ b/indra/newview/skins/default/xui/es/panel_edit_underpants.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_underpants_panel">
<panel name="avatar_underpants_color_panel">
- <texture_picker label="Tela" name="Fabric" tool_tip="Pulsa para elegir una imagen"/>
+ <texture_picker label="Textura" name="Fabric" tool_tip="Pulsa para elegir una imagen"/>
<color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/es/panel_edit_undershirt.xml b/indra/newview/skins/default/xui/es/panel_edit_undershirt.xml
index 412bdceddf..c26c554c1a 100644
--- a/indra/newview/skins/default/xui/es/panel_edit_undershirt.xml
+++ b/indra/newview/skins/default/xui/es/panel_edit_undershirt.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_undershirt_panel">
<panel name="avatar_undershirt_color_panel">
- <texture_picker label="Tela" name="Fabric" tool_tip="Pulsa para elegir una imagen"/>
+ <texture_picker label="Textura" name="Fabric" tool_tip="Pulsa para elegir una imagen"/>
<color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/es/panel_edit_wearable.xml b/indra/newview/skins/default/xui/es/panel_edit_wearable.xml
index 15c683f375..799512968d 100644
--- a/indra/newview/skins/default/xui/es/panel_edit_wearable.xml
+++ b/indra/newview/skins/default/xui/es/panel_edit_wearable.xml
@@ -45,6 +45,9 @@
<string name="edit_tattoo_title">
Modificando los tatuajes
</string>
+ <string name="edit_physics_title">
+ Modificar la física
+ </string>
<string name="shape_desc_text">
Anatomía:
</string>
@@ -90,6 +93,9 @@
<string name="tattoo_desc_text">
Tatuaje:
</string>
+ <string name="physics_desc_text">
+ Física:
+ </string>
<labeled_back_button label="Guardar" name="back_btn" tool_tip="Regresar a Editar el vestuario"/>
<text name="edit_wearable_title" value="Modificando la anatomía"/>
<panel label="Camisa" name="wearable_type_panel">
diff --git a/indra/newview/skins/default/xui/es/panel_friends.xml b/indra/newview/skins/default/xui/es/panel_friends.xml
deleted file mode 100644
index e1cac7c2c3..0000000000
--- a/indra/newview/skins/default/xui/es/panel_friends.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="friends">
- <string name="Multiple">
- Varios amigos
- </string>
- <scroll_list name="friend_list" tool_tip="Para seleccionar a varios amigos, mantenga pulsado Ctrl o Mays. mientras les va pulsando.">
- <column name="icon_online_status" tool_tip="Estado de conexión"/>
- <column label="Nombre" name="friend_name" tool_tip="Nombre"/>
- <column name="icon_visible_online" tool_tip="El amigo puede ver cuándo está conectado"/>
- <column name="icon_visible_map" tool_tip="El amigo puede localizarle en el mapa"/>
- <column name="icon_edit_mine" tool_tip="El amigo puede editar, borrar o tomar sus objetos"/>
- <column name="icon_edit_theirs" tool_tip="Puede editar los objetos de este amigo"/>
- </scroll_list>
- <button label="MI/Llamada" name="im_btn" tool_tip="Abrir sesión de mensajes instantáneos"/>
- <button label="Perfil" name="profile_btn" tool_tip="Mostrar la imagen, los grupos, y otra información"/>
- <button label="Teleporte" name="offer_teleport_btn" tool_tip="Ofrecer a este amigo teleportarle hasta su posición"/>
- <button label="Pagar" name="pay_btn" tool_tip="Dar dólares Linden (L$) a este amigo"/>
- <button label="Quitar" name="remove_btn" tool_tip="Quitar a esta persona de su lista de amigos"/>
- <button label="Añadir" name="add_btn" tool_tip="Ofrecer amistad a un Residente"/>
-</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_group_general.xml b/indra/newview/skins/default/xui/es/panel_group_general.xml
index a0f7433d7d..b00c300c85 100644
--- a/indra/newview/skins/default/xui/es/panel_group_general.xml
+++ b/indra/newview/skins/default/xui/es/panel_group_general.xml
@@ -46,12 +46,12 @@ Deja el cursor sobre las opciones para ver más ayuda.
<check_box label="Cualquiera puede entrar" name="open_enrollement" tool_tip="Configura si se permite la entrada de nuevos miembros sin ser invitados."/>
<check_box label="Cuota de entrada" name="check_enrollment_fee" tool_tip="Configura si hay que pagar una cuota para entrar al grupo"/>
<spinner label="L$" left_delta="130" name="spin_enrollment_fee" tool_tip="Si la opción Cuota de entrada está marcada, los nuevos miembros han de pagar esta cuota para entrar al grupo." width="60"/>
- <combo_box bottom_delta="-38" name="group_mature_check" tool_tip="Establece si la información de su grupo es &apos;mature&apos;." width="150">
+ <combo_box bottom_delta="-38" name="group_mature_check" tool_tip="Establece si la información de su grupo es moderado." width="150">
<combo_item name="select_mature">
- Selecciona el nivel de calificación -
</combo_item>
- <combo_box.item label="Contenido &apos;Mature&apos;" name="mature"/>
- <combo_box.item label="Contenido &apos;PG&apos;" name="pg"/>
+ <combo_box.item label="Contenido moderado" name="mature"/>
+ <combo_box.item label="Contenido general" name="pg"/>
</combo_box>
<check_box initial_value="true" label="Mostrar en la búsqueda" name="show_in_group_list" tool_tip="Permite que la gente vea este grupo en los resultados de la búsqueda"/>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_im_control_panel.xml b/indra/newview/skins/default/xui/es/panel_im_control_panel.xml
index 7d4db6a630..f218324d50 100644
--- a/indra/newview/skins/default/xui/es/panel_im_control_panel.xml
+++ b/indra/newview/skins/default/xui/es/panel_im_control_panel.xml
@@ -8,7 +8,7 @@
<button label="Añadir como amigo" name="add_friend_btn"/>
</layout_panel>
<layout_panel name="teleport_btn_panel">
- <button label="Teleportarme" name="teleport_btn" tool_tip="Ofrecer teleporte a esta persona"/>
+ <button label="Teleportar" name="teleport_btn" tool_tip="Ofrecer teleporte a esta persona"/>
</layout_panel>
<layout_panel name="share_btn_panel">
<button label="Compartir" name="share_btn"/>
diff --git a/indra/newview/skins/default/xui/es/panel_landmark_info.xml b/indra/newview/skins/default/xui/es/panel_landmark_info.xml
index 49a9f84cfe..1a0ac3ba79 100644
--- a/indra/newview/skins/default/xui/es/panel_landmark_info.xml
+++ b/indra/newview/skins/default/xui/es/panel_landmark_info.xml
@@ -19,7 +19,7 @@
[wkday,datetime,local][day,datetime,local] [mth,datetime,local] [year,datetime,local][hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
</string>
<button name="back_btn" tool_tip="Atrás"/>
- <text name="title" value="Añadir el perfil"/>
+ <text name="title" value="Perfil del lugar"/>
<scroll_container name="place_scroll">
<panel name="scrolling_panel">
<text name="maturity_value" value="desconocido"/>
diff --git a/indra/newview/skins/default/xui/es/panel_login.xml b/indra/newview/skins/default/xui/es/panel_login.xml
index 49d4881737..0e94cbe70b 100644
--- a/indra/newview/skins/default/xui/es/panel_login.xml
+++ b/indra/newview/skins/default/xui/es/panel_login.xml
@@ -11,18 +11,26 @@
<text name="username_text">
Nombre de usuario:
</text>
- <line_editor label="bobsmith12 o Steller Sunshine" name="username_edit" tool_tip="El nombre de usuario que elegiste al registrarte, como bobsmith12 o Steller Sunshine"/>
+ <combo_box name="username_combo" tool_tip="El nombre de usuario que elegiste al registrarte, como bobsmith12 o Steller Sunshine"/>
<text name="password_text">
Contraseña:
</text>
<check_box label="Recordar la contraseña" name="remember_check"/>
<button label="Iniciar sesión" name="connect_btn"/>
+ <text name="mode_selection_text">
+ Modo:
+ </text>
+ <combo_box name="mode_combo" tool_tip="Selecciona el modo. Elige Básico para una exploración rápida y fácil y para chatear. Elige Avanzado para tener acceso a más funciones.">
+ <combo_box.item label="Básico" name="Basic"/>
+ <combo_box.item label="Avanzado" name="Advanced"/>
+ </combo_box>
<text name="start_location_text">
Empezar en:
</text>
<combo_box name="start_location_combo">
<combo_box.item label="Mi última posición" name="MyLastLocation"/>
<combo_box.item label="Mi Base" name="MyHome"/>
+ <combo_box.item label="&lt;Escribe en qué región&gt;" name="Typeregionname"/>
</combo_box>
</layout_panel>
<layout_panel name="links">
diff --git a/indra/newview/skins/default/xui/es/panel_me.xml b/indra/newview/skins/default/xui/es/panel_me.xml
index ed253904aa..850cd6ec71 100644
--- a/indra/newview/skins/default/xui/es/panel_me.xml
+++ b/indra/newview/skins/default/xui/es/panel_me.xml
@@ -1,7 +1,4 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Mi perfil" name="panel_me">
- <tab_container name="tabs">
- <panel label="MI PERFIL" name="panel_profile"/>
- <panel label="MIS DESTACADOS" name="panel_picks"/>
- </tab_container>
+ <panel label="MIS DESTACADOS" name="panel_picks"/>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_media_settings_general.xml b/indra/newview/skins/default/xui/es/panel_media_settings_general.xml
index 46326d1e8b..afc11a4250 100644
--- a/indra/newview/skins/default/xui/es/panel_media_settings_general.xml
+++ b/indra/newview/skins/default/xui/es/panel_media_settings_general.xml
@@ -20,7 +20,8 @@
<check_box initial_value="false" label="Zoom automático" name="auto_zoom"/>
<check_box initial_value="false" label="Ejecutar automáticamente los media" name="auto_play"/>
<text name="media_setting_note">
- Nota: los residentes pueden elegir una configuración distinta de ésta
+ Nota: los residentes pueden elegir una configuración distinta
+de ésta
</text>
<check_box initial_value="false" label="Ajustar automáticamente los media en la cara del objeto" name="auto_scale"/>
<text name="size_label">
diff --git a/indra/newview/skins/default/xui/es/panel_media_settings_security.xml b/indra/newview/skins/default/xui/es/panel_media_settings_security.xml
index c72f562a68..a1a3ec86cf 100644
--- a/indra/newview/skins/default/xui/es/panel_media_settings_security.xml
+++ b/indra/newview/skins/default/xui/es/panel_media_settings_security.xml
@@ -2,7 +2,8 @@
<panel label="Seguridad" name="Media Settings Security">
<check_box initial_value="false" label="Permitir el acceso sólo a los patrones de URL especificados" name="whitelist_enable"/>
<text name="home_url_fails_some_items_in_whitelist">
- Están marcadas las entradas que la página web no admite:
+ Están marcadas las entradas que la página web no
+admite:
</text>
<button label="Añadir" name="whitelist_add"/>
<button label="Borrar" name="whitelist_del"/>
diff --git a/indra/newview/skins/default/xui/es/panel_my_profile.xml b/indra/newview/skins/default/xui/es/panel_my_profile.xml
deleted file mode 100644
index 14c94acf5b..0000000000
--- a/indra/newview/skins/default/xui/es/panel_my_profile.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Perfil" name="panel_profile">
- <string name="no_partner_text" value="Ninguno/a"/>
- <string name="no_group_text" value="Ninguno"/>
- <string name="RegisterDateFormat">
- [REG_DATE] ([AGE])
- </string>
- <layout_stack name="layout">
- <layout_panel name="profile_stack">
- <scroll_container name="profile_scroll">
- <panel name="scroll_content_panel">
- <panel name="second_life_image_panel">
- <icon label="" name="2nd_life_edit_icon" tool_tip="Pulsa el botón Editar el perfil para cambiar la imagen"/>
- <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/>
- </panel>
- <panel name="first_life_image_panel">
- <icon label="" name="real_world_edit_icon" tool_tip="Pulsa el botón Editar el perfil para cambiar la imagen"/>
- <text name="title_rw_descr_text" value="Mundo real:"/>
- </panel>
- <text name="title_member_text" value="Residente desde:"/>
- <text name="title_acc_status_text" value="Estado de la cuenta:"/>
- <text name="title_partner_text" value="Compañero/a:"/>
- <panel name="partner_data_panel">
- <name_box initial_value="(obteniendo)" name="partner_text"/>
- </panel>
- <text name="title_groups_text" value="Grupos:"/>
- </panel>
- </scroll_container>
- </layout_panel>
- </layout_stack>
- <panel name="profile_me_buttons_panel">
- <button label="Editar el perfil" name="edit_profile_btn" tool_tip="Modificar tu información personal"/>
- </panel>
-</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_navigation_bar.xml b/indra/newview/skins/default/xui/es/panel_navigation_bar.xml
index e8e95c3bac..d36c6283bc 100644
--- a/indra/newview/skins/default/xui/es/panel_navigation_bar.xml
+++ b/indra/newview/skins/default/xui/es/panel_navigation_bar.xml
@@ -1,18 +1,23 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="navigation_bar">
- <panel name="navigation_panel">
- <pull_button name="back_btn" tool_tip="Volver a lo localización anterior"/>
- <pull_button name="forward_btn" tool_tip="Ir una localización adelante"/>
- <button name="home_btn" tool_tip="Teleportar a mi Base"/>
- <location_input label="Localización" name="location_combo"/>
- <search_combo_box label="Buscar" name="search_combo_box" tool_tip="Buscar">
- <combo_editor label="Buscar en [SECOND_LIFE]" name="search_combo_editor"/>
- </search_combo_box>
- </panel>
- <favorites_bar name="favorite" tool_tip="¡Accede rápidamente a tus lugares favoritos de Second Life arrastrando hitos hasta aquí!">
- <label name="favorites_bar_label" tool_tip="¡Accede rápidamente a tus lugares favoritos de Second Life arrastrando hitos hasta aquí!">
- Barra de Favoritos
- </label>
- <chevron_button name="&gt;&gt;" tool_tip="Ver más de Mis favoritos"/>
- </favorites_bar>
+ <layout_stack name="nvp_stack">
+ <layout_panel name="navigation_layout_panel">
+ <panel name="navigation_panel">
+ <pull_button name="back_btn" tool_tip="Volver a la localización anterior"/>
+ <pull_button name="forward_btn" tool_tip="Ir una localización adelante"/>
+ <button name="home_btn" tool_tip="Teleportar a mi Base"/>
+ <location_input label="Lugar" name="location_combo"/>
+ </panel>
+ </layout_panel>
+ <layout_panel name="favorites_layout_panel">
+ <favorites_bar name="favorite" tool_tip="¡Accede rápidamente a tus lugares favoritos de Second Life arrastrando hitos hasta aquí!">
+ <label name="favorites_bar_label" tool_tip="¡Accede rápidamente a tus lugares favoritos de Second Life arrastrando hitos hasta aquí!">
+ Barra de Favoritos
+ </label>
+ <more_button name="&gt;&gt;" tool_tip="Ver más de Mis favoritos">
+ Más ▼
+ </more_button>
+ </favorites_bar>
+ </layout_panel>
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_nearby_chat.xml b/indra/newview/skins/default/xui/es/panel_nearby_chat.xml
new file mode 100644
index 0000000000..4220ab3c9f
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_nearby_chat.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="nearby_chat">
+ <check_box label="Traducir el chat" name="translate_chat_checkbox"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_nearby_media.xml b/indra/newview/skins/default/xui/es/panel_nearby_media.xml
index f65cae6e20..8d4f9eda18 100644
--- a/indra/newview/skins/default/xui/es/panel_nearby_media.xml
+++ b/indra/newview/skins/default/xui/es/panel_nearby_media.xml
@@ -19,7 +19,7 @@
<button label="Parar todo" name="all_nearby_media_disable_btn" tool_tip="Apagar todos los media cercanos"/>
<button label="Iniciar todo" name="all_nearby_media_enable_btn" tool_tip="Encender todos los media cercanos"/>
<button name="open_prefs_btn" tool_tip="Abrir las preferencias de los media"/>
- <button label="Más &gt;&gt;" label_selected="Menos &lt;&lt;" name="more_btn" tool_tip="Controles avanzados"/>
+ <button label="Más &gt;&gt;" label_selected="&lt;&lt; Menos" name="more_btn" tool_tip="Controles avanzados"/>
<button label="Más &gt;&gt;" label_selected="Menos &lt;&lt;" name="less_btn" tool_tip="Controles avanzados"/>
</panel>
<panel name="nearby_media_panel">
diff --git a/indra/newview/skins/default/xui/es/panel_notes.xml b/indra/newview/skins/default/xui/es/panel_notes.xml
deleted file mode 100644
index 00d4caf468..0000000000
--- a/indra/newview/skins/default/xui/es/panel_notes.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Notas y Privacidad" name="panel_notes">
- <layout_stack name="layout">
- <layout_panel name="notes_stack">
- <scroll_container name="profile_scroll">
- <panel name="profile_scroll_panel">
- <text name="status_message" value="Mis notas privadas:"/>
- <text name="status_message2" value="Permitir que esta persona:"/>
- <check_box label="Vea si estoy conectado" name="status_check"/>
- <check_box label="Me vea en el mapa" name="map_check"/>
- <check_box label="Edite, borre o coja mis objetos" name="objects_check"/>
- </panel>
- </scroll_container>
- </layout_panel>
- <layout_panel name="notes_buttons_panel">
- <layout_stack name="bottom_bar_ls">
- <layout_panel name="add_friend_btn_lp">
- <button label="Añadir como amigo" name="add_friend" tool_tip="Ofrecer amistad a este Residente"/>
- </layout_panel>
- <layout_panel name="im_btn_lp">
- <button label="MI" name="im" tool_tip="Abrir una sesión de mensajes instantáneos"/>
- </layout_panel>
- <layout_panel name="call_btn_lp">
- <button label="Llamar" name="call" tool_tip="Llamar a este Residente"/>
- </layout_panel>
- <layout_panel name="show_on_map_btn_lp">
- <button label="Mapa" name="show_on_map_btn" tool_tip="Mostrar al Residente en el mapa"/>
- </layout_panel>
- <layout_panel name="teleport_btn_lp">
- <button label="Teleporte" name="teleport" tool_tip="Ofrecer teleporte"/>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_notify_textbox.xml b/indra/newview/skins/default/xui/es/panel_notify_textbox.xml
new file mode 100644
index 0000000000..dc7c873303
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_notify_textbox.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="instant_message" name="panel_notify_textbox">
+ <string name="message_max_lines_count" value="7"/>
+ <panel label="info_panel" name="info_panel">
+ <text_editor name="message" value="message"/>
+ </panel>
+ <panel label="control_panel" name="control_panel">
+ <button label="Enviar" name="btn_submit"/>
+ <button label="Ignorar" name="ignore_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_outbox_inventory.xml b/indra/newview/skins/default/xui/es/panel_outbox_inventory.xml
new file mode 100644
index 0000000000..9e2f3c3adc
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_outbox_inventory.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<outbox_inventory_panel name="inventory_outbox" tool_tip="Arrastra y coloca aquí los objetos que desees preparar para venderlos en tu tienda"/>
diff --git a/indra/newview/skins/default/xui/es/panel_outfits_list.xml b/indra/newview/skins/default/xui/es/panel_outfits_list.xml
index 661b44e419..3f8057f242 100644
--- a/indra/newview/skins/default/xui/es/panel_outfits_list.xml
+++ b/indra/newview/skins/default/xui/es/panel_outfits_list.xml
@@ -1,7 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="Outfits">
+ <accordion name="outfits_accordion">
+ <no_matched_tabs_text name="no_matched_outfits_msg" value="¿No encuentras lo que buscas? Inténtalo con [secondlife:///app/search/all/[SEARCH_TERM] Buscar]."/>
+ <no_visible_tabs_text name="no_outfits_msg" value="Todavía no tienes vestuario. Inténtalo con [secondlife:///app/search/all/ Buscar]"/>
+ </accordion>
<panel name="bottom_panel">
- <button name="options_gear_btn" tool_tip="Ver más opciones"/>
+ <menu_button name="options_gear_btn" tool_tip="Ver más opciones"/>
<button name="trash_btn" tool_tip="Eliminar el vestuario seleccionado"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_people.xml b/indra/newview/skins/default/xui/es/panel_people.xml
index 1773735598..a9d38dca25 100644
--- a/indra/newview/skins/default/xui/es/panel_people.xml
+++ b/indra/newview/skins/default/xui/es/panel_people.xml
@@ -18,11 +18,13 @@
<string name="groups_filter_label" value="Filtrar a los grupos"/>
<string name="no_filtered_groups_msg" value="¿No encuentras lo que buscas? Prueba con [secondlife:///app/search/groups/[SEARCH_TERM] Buscar]."/>
<string name="no_groups_msg" value="¿Buscas grupos en que participar? Prueba la [secondlife:///app/search/groups Búsqueda]."/>
+ <string name="MiniMapToolTipMsg" value="[REGION](Pulsa dos veces para abrir el mapa, pulsa mayús y arrastra para obtener una panorámica)"/>
+ <string name="AltMiniMapToolTipMsg" value="[REGION](Pulsa dos veces para teleportarte, pulsa mayús y arrastra para obtener una panorámica)"/>
<filter_editor label="Filtrar" name="filter_input"/>
<tab_container name="tabs">
<panel label="CERCANA" name="nearby_panel">
<panel label="bottom_panel" name="bottom_panel">
- <button name="nearby_view_sort_btn" tool_tip="Opciones"/>
+ <menu_button name="nearby_view_sort_btn" tool_tip="Opciones"/>
<button name="add_friend_btn" tool_tip="Añadir al Residente seleccionado a la lista de tus amigos"/>
</panel>
</panel>
@@ -34,27 +36,27 @@
<panel label="bottom_panel" name="bottom_panel">
<layout_stack name="bottom_panel">
<layout_panel name="options_gear_btn_panel">
- <button name="friends_viewsort_btn" tool_tip="Ver más opciones"/>
+ <menu_button name="friends_viewsort_btn" tool_tip="Ver más opciones"/>
</layout_panel>
<layout_panel name="add_btn_panel">
<button name="add_btn" tool_tip="Ofrecer amistad a un Residente"/>
</layout_panel>
<layout_panel name="trash_btn_panel">
- <dnd_button name="trash_btn" tool_tip="Quitar a la persona seleccionada de tu lista de amigos"/>
+ <dnd_button name="del_btn" tool_tip="Quitar a la persona seleccionada de tu lista de amigos"/>
</layout_panel>
</layout_stack>
</panel>
</panel>
<panel label="MIS GRUPOS" name="groups_panel">
<panel label="bottom_panel" name="bottom_panel">
- <button name="groups_viewsort_btn" tool_tip="Opciones"/>
+ <menu_button name="groups_viewsort_btn" tool_tip="Opciones"/>
<button name="plus_btn" tool_tip="Entrar en un grupo o crear uno"/>
<button name="activate_btn" tool_tip="Activar el grupo seleccionado"/>
</panel>
</panel>
<panel label="RECIENTE" name="recent_panel">
<panel label="bottom_panel" name="bottom_panel">
- <button name="recent_viewsort_btn" tool_tip="Opciones"/>
+ <menu_button name="recent_viewsort_btn" tool_tip="Opciones"/>
<button name="add_friend_btn" tool_tip="Añadir al Residente seleccionado a la lista de tus amigos"/>
</panel>
</panel>
@@ -64,16 +66,16 @@
<layout_panel name="view_profile_btn_lp">
<button label="Perfil" name="view_profile_btn" tool_tip="Mostrar imágenes, grupos y otra información del Residente"/>
</layout_panel>
- <layout_panel name="chat_btn_lp">
+ <layout_panel name="im_btn_lp">
<button label="MI" name="im_btn" tool_tip="Abrir una sesión de mensajes instantáneos"/>
</layout_panel>
- <layout_panel name="chat_btn_lp">
+ <layout_panel name="call_btn_lp">
<button label="Llamar" name="call_btn" tool_tip="Llamar a este Residente"/>
</layout_panel>
- <layout_panel name="chat_btn_lp">
+ <layout_panel name="share_btn_lp">
<button label="Compartir" name="share_btn" tool_tip="Compartir un objeto del inventario"/>
</layout_panel>
- <layout_panel name="chat_btn_lp">
+ <layout_panel name="teleport_btn_lp">
<button label="Teleporte" name="teleport_btn" tool_tip="Ofrecer teleporte"/>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/es/panel_pick_info.xml b/indra/newview/skins/default/xui/es/panel_pick_info.xml
index a1259cf483..3450279b4a 100644
--- a/indra/newview/skins/default/xui/es/panel_pick_info.xml
+++ b/indra/newview/skins/default/xui/es/panel_pick_info.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_pick_info">
- <text name="title" value="Información del destacado"/>
+ <text name="title" value="Datos del destacado"/>
<scroll_container name="profile_scroll">
<panel name="scroll_content_panel">
<text_editor name="pick_name" value="[nombre]"/>
diff --git a/indra/newview/skins/default/xui/es/panel_place_profile.xml b/indra/newview/skins/default/xui/es/panel_place_profile.xml
index 524ba2253b..e1cf1332e2 100644
--- a/indra/newview/skins/default/xui/es/panel_place_profile.xml
+++ b/indra/newview/skins/default/xui/es/panel_place_profile.xml
@@ -5,7 +5,7 @@
<string name="anyone" value="Cualquiera"/>
<string name="available" value="disponible"/>
<string name="allocated" value="asignados"/>
- <string name="title_place" value="Añadir el perfil"/>
+ <string name="title_place" value="Perfil del lugar"/>
<string name="title_teleport_history" value="Historial de teleportes"/>
<string name="not_available" value="(No disp.)"/>
<string name="unknown" value="(desconocido)"/>
@@ -42,7 +42,7 @@
[wkday,datetime,local][day,datetime,local] [mth,datetime,local] [year,datetime,local][hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
</string>
<button name="back_btn" tool_tip="Atrás"/>
- <text name="title" value="Añadir el perfil"/>
+ <text name="title" value="Perfil del lugar"/>
<scroll_container name="place_scroll">
<panel name="scrolling_panel">
<text name="owner_label" value="Propietario:"/>
@@ -64,6 +64,8 @@
<text name="scripts_value" value="Sí"/>
<text name="damage_label" value="Daño:"/>
<text name="damage_value" value="No"/>
+ <text name="see_avatars_label" value="Ver los avatares:"/>
+ <text name="see_avatars_value" value="No"/>
<button label="Acerca del terreno" name="about_land_btn"/>
</panel>
</accordion_tab>
diff --git a/indra/newview/skins/default/xui/es/panel_places.xml b/indra/newview/skins/default/xui/es/panel_places.xml
index 2e349c7fe2..e9984b4512 100644
--- a/indra/newview/skins/default/xui/es/panel_places.xml
+++ b/indra/newview/skins/default/xui/es/panel_places.xml
@@ -21,10 +21,10 @@
<button label="Editar" name="edit_btn" tool_tip="Editar la información del hito"/>
</layout_panel>
<layout_panel name="overflow_btn_lp">
- <button label="▼" name="overflow_btn" tool_tip="Ver más opciones"/>
+ <menu_button label="▼" name="overflow_btn" tool_tip="Ver más opciones"/>
</layout_panel>
</layout_stack>
- <layout_stack name="bottom_bar_ls3">
+ <layout_stack name="bottom_bar_profile_ls">
<layout_panel name="profile_btn_lp">
<button label="Perfil" name="profile_btn" tool_tip="Mostrar el perfil del lugar"/>
</layout_panel>
diff --git a/indra/newview/skins/default/xui/es/panel_postcard_message.xml b/indra/newview/skins/default/xui/es/panel_postcard_message.xml
new file mode 100644
index 0000000000..7316d91f5c
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_postcard_message.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_postcard_message">
+ <text name="to_label">
+ Hasta:
+ </text>
+ <text name="name_label">
+ Desde:
+ </text>
+ <text name="subject_label">
+ Asunto:
+ </text>
+ <line_editor label="Escribe aquí el asunto." name="subject_form"/>
+ <text name="msg_label">
+ Mensaje:
+ </text>
+ <text_editor name="msg_form">
+ Escribe aquí tu mensaje.
+ </text_editor>
+ <button label="Cancelar" name="cancel_btn"/>
+ <button label="Enviar" name="send_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_postcard_settings.xml b/indra/newview/skins/default/xui/es/panel_postcard_settings.xml
new file mode 100644
index 0000000000..3931319447
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_postcard_settings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_postcard_settings">
+ <combo_box label="Resolución" name="postcard_size_combo">
+ <combo_box.item label="Ventana actual" name="CurrentWindow"/>
+ <combo_box.item label="640x480" name="640x480"/>
+ <combo_box.item label="800x600" name="800x600"/>
+ <combo_box.item label="1024x768" name="1024x768"/>
+ <combo_box.item label="Personalizado" name="Custom"/>
+ </combo_box>
+ <layout_stack name="postcard_image_params_ls">
+ <layout_panel name="postcard_image_size_lp">
+ <spinner label="Ancho" name="postcard_snapshot_width"/>
+ <spinner label="Altura" name="postcard_snapshot_height"/>
+ <check_box label="Mantener las proporciones" name="postcard_keep_aspect_check"/>
+ </layout_panel>
+ <layout_panel name="postcard_image_format_quality_lp">
+ <slider label="Calidad de la imagen" name="image_quality_slider"/>
+ <text name="image_quality_level">
+ ([QLVL])
+ </text>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/es/panel_preferences_advanced.xml
index d65868c0a8..620a95de4d 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_advanced.xml
@@ -3,35 +3,29 @@
<panel.string name="aspect_ratio_text">
[NUM]:[DEN]
</panel.string>
- <panel.string name="middle_mouse">
- Botón medio del ratón
- </panel.string>
- <slider label="Ãngulo de visión" name="camera_fov"/>
- <slider label="Distancia" name="camera_offset_scale"/>
- <text name="heading2">
- Posición automática para:
+ <text name="Cache:">
+ Caché:
+ </text>
+ <spinner label="Tamaño de la caché (64 - 9984 MB)" name="cachesizespinner"/>
+ <text name="text_box5">
+ MB
+ </text>
+ <button label="Vaciar la caché" label_selected="Vaciar la caché" name="clear_cache"/>
+ <text name="Cache location">
+ Localización de la caché:
</text>
- <check_box label="Construir/Editar" name="edit_camera_movement" tool_tip="Usar el posicionamiento automático de la cámara al entrar en o salir del modo de edición"/>
- <check_box label="Apariencia" name="appearance_camera_movement" tool_tip="Usar el posicionamiento automático de la cámara mientras se está editando"/>
- <check_box initial_value="true" label="Barra lateral" name="appearance_sidebar_positioning" tool_tip="Usar el posicionamiento automático de la cámara para la barra lateral"/>
- <check_box label="Verme en vista subjetiva" name="first_person_avatar_visible"/>
- <check_box label="Las teclas del cursor siempre para moverme" name="arrow_keys_move_avatar_check"/>
- <check_box label="Correr siempre: atajo de teclado" name="tap_tap_hold_to_run"/>
- <check_box label="Al hablar, mover los labios del avatar" name="enable_lip_sync"/>
- <check_box label="Chat en bocadillos" name="bubble_text_chat"/>
- <slider label="Opacidad" name="bubble_chat_opacity"/>
- <color_swatch name="background" tool_tip="Elegir el color de los bocadillos del chat"/>
+ <button label="Elegir" label_selected="Elegir" name="set_cache"/>
+ <button label="Ubicación predeterminada" label_selected="Ubicación predeterminada" name="default_cache_location"/>
<text name="UI Size:">
- Tamaño de la UI
+ Tamaño de la UI:
</text>
<check_box label="Mostrar los errores de los scripts en:" name="show_script_errors"/>
<radio_group name="show_location">
<radio_item label="Chat" name="0"/>
<radio_item label="Ventanas distintas" name="1"/>
</radio_group>
- <check_box label="Cambiar entre hablar on/off cuando pulse:" name="push_to_talk_toggle_check" tool_tip="En el modo &apos;un toque&apos;, pulsa y suelta el botón UNA VEZ para activar o desactivar el micrófono. Si no estás en el modo &apos;un toque&apos;, el micrófono sólo recogerá tu voz mientras mantengas pulsado el botón."/>
- <line_editor label="Botón de Apretar para Hablar" name="modifier_combo"/>
- <button label="Elegir la tecla" name="set_voice_hotkey_button"/>
- <button label="Botón de en medio del ratón" name="set_voice_middlemouse_button" tool_tip="Reconfigurarlo al botón medio del ratón"/>
- <button label="Otros dispositivos" name="joystick_setup_button"/>
+ <check_box label="Permitir el acceso de varios usuarios" name="allow_multiple_viewer_check"/>
+ <check_box label="Mostrar la selección de cuadrícula al iniciar sesión" name="show_grid_selection_check"/>
+ <check_box label="Mostrar el menú Avanzado" name="show_advanced_menu_check"/>
+ <check_box label="Mostrar el menú Develop" name="show_develop_menu_check"/>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_chat.xml b/indra/newview/skins/default/xui/es/panel_preferences_chat.xml
index 05aea82d82..aea9b9ce4a 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_chat.xml
@@ -8,44 +8,10 @@
<radio_item label="Medio" name="radio2" value="1"/>
<radio_item label="Aumentar" name="radio3" value="2"/>
</radio_group>
- <text name="font_colors">
- Colores de la fuente:
- </text>
- <color_swatch label="Usted" name="user"/>
- <text name="text_box1">
- Yo
- </text>
- <color_swatch label="Otros" name="agent"/>
- <text name="text_box2">
- Otros
- </text>
- <color_swatch label="MI" name="im"/>
- <text name="text_box3">
- MI
- </text>
- <color_swatch label="Sistema" name="system"/>
- <text name="text_box4">
- Sistema
- </text>
- <color_swatch label="Errores de script" name="script_error"/>
- <text name="text_box5">
- Errores de script
- </text>
- <color_swatch label="Objetos" name="objects"/>
- <text name="text_box6">
- Objetos
- </text>
- <color_swatch label="Propietario" name="owner"/>
- <text name="text_box7">
- Propietario
- </text>
- <color_swatch label="URL" name="links"/>
- <text name="text_box9">
- URL
- </text>
<check_box initial_value="true" label="Ejecutar la animación de escribir al hacerlo en el chat" name="play_typing_animation"/>
<check_box label="Cuando estoy desconectado, enviarme los MI al correo-e" name="send_im_to_email"/>
<check_box label="Permitir el historial de MI y chat en texto sin formato" name="plain_text_chat_history"/>
+ <check_box label="Bocadillos del chat" name="bubble_text_chat"/>
<text name="show_ims_in_label">
Mostrar los MI en:
</text>
@@ -53,30 +19,15 @@
(requiere reiniciar)
</text>
<radio_group name="chat_window" tool_tip="Muestra tus mensajes instantáneos en varias ventanas flotantes o en una sola con varias pestañas (requiere que reinicies)">
- <radio_item label="Varias ventanas" name="radio" value="0"/>
+ <radio_item label="Ventanas distintas" name="radio" value="0"/>
<radio_item label="Pestañas" name="radio2" value="1"/>
</radio_group>
- <check_box label="Utiliza la herramienta de traducción automática mientras utilizas el chat (mediante Google)" name="translate_chat_checkbox"/>
- <text name="translate_language_text">
- Traducir el chat al:
- </text>
- <combo_box name="translate_language_combobox">
- <combo_box.item label="Predeterminado del sistema" name="System Default Language"/>
- <combo_box.item label="English (inglés)" name="English"/>
- <combo_box.item label="Dansk (danés)" name="Danish"/>
- <combo_box.item label="Deutsch (alemán)" name="German"/>
- <combo_box.item label="Español" name="Spanish"/>
- <combo_box.item label="Français (francés)" name="French"/>
- <combo_box.item label="Italiano (italiano)" name="Italian"/>
- <combo_box.item label="Magyar (húngaro)" name="Hungarian"/>
- <combo_box.item label="Nederlands (neerlandés)" name="Dutch"/>
- <combo_box.item label="Polski (polaco)" name="Polish"/>
- <combo_box.item label="Português (portugués)" name="Portugese"/>
- <combo_box.item label="РуÑÑкий (ruso)" name="Russian"/>
- <combo_box.item label="Türkçe (turco)" name="Turkish"/>
- <combo_box.item label="УкраїнÑька (ucraniano)" name="Ukrainian"/>
- <combo_box.item label="中文 (简体) (chino)" name="Chinese"/>
- <combo_box.item label="日本語 (japonés)" name="Japanese"/>
- <combo_box.item label="한국어 (coreano)" name="Korean"/>
- </combo_box>
+ <text name="disable_toast_label">
+ Permitir ventanas de chat emergentes:
+ </text>
+ <check_box label="Chats de grupo" name="EnableGroupChatPopups" tool_tip="Activa esta casilla para ver una ventana emergente cada vez que recibas un mensaje de un grupo de chat"/>
+ <check_box label="Chats de MI" name="EnableIMChatPopups" tool_tip="Activa esta casilla para ver una ventana emergente cada vez que recibas un mensaje instantáneo"/>
+ <spinner label="Duración de los interlocutores favoritos:" name="nearby_toasts_lifetime"/>
+ <spinner label="Tiempo de los otros interlocutores:" name="nearby_toasts_fadingtime"/>
+ <button label="Configuración de la traducción del chat" name="ok_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_colors.xml b/indra/newview/skins/default/xui/es/panel_preferences_colors.xml
new file mode 100644
index 0000000000..d47a6d718a
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_preferences_colors.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Colores" name="colors_panel">
+ <text name="effects_color_textbox">
+ Mis efectos (rayo indicador):
+ </text>
+ <color_swatch name="effect_color_swatch" tool_tip="Pulsa para abrir el selector de color"/>
+ <text name="font_colors">
+ Colores de fuente del chat:
+ </text>
+ <text name="text_box1">
+ Yo
+ </text>
+ <text name="text_box2">
+ Otros avatares
+ </text>
+ <text name="text_box3">
+ Objetos
+ </text>
+ <text name="text_box4">
+ Sistema
+ </text>
+ <text name="text_box5">
+ Errores
+ </text>
+ <text name="text_box10">
+ Directo
+ </text>
+ <text name="text_box7">
+ Propietario
+ </text>
+ <text name="text_box9">
+ URLs
+ </text>
+ <text name="bubble_chat">
+ Color de fondo de la etiqueta del nombre (afectará también a los bocadillos del chat):
+ </text>
+ <color_swatch name="background" tool_tip="Elige el color de las etiquetas de nombre"/>
+ <slider label="Opacidad:" name="bubble_chat_opacity" tool_tip="Elige la opacidad de las etiquetas de nombre"/>
+ <text name="floater_opacity">
+ Opacidad de la ventana:
+ </text>
+ <slider label="Activa:" name="active"/>
+ <slider label="Inactiva:" name="inactive"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_general.xml b/indra/newview/skins/default/xui/es/panel_preferences_general.xml
index 5b8cb77173..4fc163f5b6 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_general.xml
@@ -11,10 +11,12 @@
<combo_box.item label="Español - Beta" name="Spanish"/>
<combo_box.item label="Français (Francés) - Beta" name="French"/>
<combo_box.item label="Italiano - Beta" name="Italian"/>
- <combo_box.item label="Nederlands (Neerlandés) - Beta" name="Dutch"/>
<combo_box.item label="Polski (Polaco) - Beta" name="Polish"/>
<combo_box.item label="Português (portugués) - Beta" name="Portugese"/>
+ <combo_box.item label="РуÑÑкий (Ruso) - Beta" name="Russian"/>
+ <combo_box.item label="Türkçe (Turco) - Beta" name="Turkish"/>
<combo_box.item label="日本語 (Japonés) - Beta" name="(Japanese)"/>
+ <combo_box.item label="正體中文 (Chino tradicional) - Beta" name="Traditional Chinese"/>
</combo_box>
<text name="language_textbox2">
(requiere reiniciar)
@@ -24,9 +26,9 @@
</text>
<text name="maturity_desired_textbox"/>
<combo_box name="maturity_desired_combobox">
- <combo_box.item label="&apos;PG&apos;, &apos;Mature&apos; y &apos;Adult&apos;" name="Desired_Adult"/>
- <combo_box.item label="&apos;PG&apos; y &apos;Mature&apos;" name="Desired_Mature"/>
- <combo_box.item label="&apos;PG&apos;" name="Desired_PG"/>
+ <combo_box.item label="General, Moderado y Adulto" name="Desired_Adult"/>
+ <combo_box.item label="General y Moderado" name="Desired_Mature"/>
+ <combo_box.item label="General" name="Desired_PG"/>
</combo_box>
<text name="start_location_textbox">
Localización inicial:
@@ -48,13 +50,17 @@
<check_box label="Nombre de usuario" name="show_slids" tool_tip="Mostrar el nombre de usuario, como bobsmith123"/>
<check_box label="Títulos de grupos" name="show_all_title_checkbox1" tool_tip="Mostrar títulos de grupos, como Jefe o Miembro"/>
<check_box label="Realzar amigos" name="show_friends" tool_tip="Realzar las etiquetas de los nombres de tus amigos"/>
- <text name="effects_color_textbox">
- Mis efectos:
+ <check_box label="Ver nombres mostrados" name="display_names_check" tool_tip="Comprobar para utilizar nombres mostrados en chat, MI, etiquetas de nombres, etc."/>
+ <text name="inworld_typing_rg_label">
+ Si pulsas las teclas de letras:
</text>
+ <radio_group name="inworld_typing_preference">
+ <radio_item label="Inicia el chat local" name="radio_start_chat" value="1"/>
+ <radio_item label="Afecta al movimiento (por ejemplo, en las teclas WASD)" name="radio_move" value="0"/>
+ </radio_group>
<text name="title_afk_text">
Ausente tras:
</text>
- <color_swatch label="" name="effect_color_swatch" tool_tip="Pulse para abrir el selector de color"/>
<combo_box label="Ausente tras:" name="afk">
<combo_box.item label="2 minutos" name="item0"/>
<combo_box.item label="5 minutos" name="item1"/>
@@ -62,7 +68,6 @@
<combo_box.item label="30 minutos" name="item3"/>
<combo_box.item label="nunca" name="item4"/>
</combo_box>
- <check_box label="Ver nombres mostrados" name="display_names_check" tool_tip="Comprobar para utilizar nombres mostrados en chat, MI, etiquetas de nombres, etc."/>
<text name="text_box3">
Respuesta cuando estoy en modo ocupado:
</text>
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/es/panel_preferences_graphics1.xml
index 36b6493004..281b871fed 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_graphics1.xml
@@ -25,9 +25,22 @@
<text name="ShadersText">
Shaders:
</text>
+ <check_box initial_value="verdadero" label="Agua transparente" name="TransparentWater"/>
<check_box initial_value="true" label="Efecto de relieve y brillo" name="BumpShiny"/>
+ <check_box initial_value="verdadero" label="Luces locales" name="LocalLights"/>
<check_box initial_value="true" label="Shaders básicos" name="BasicShaders" tool_tip="Desactivando esta opción puede prevenir fallos en algunos controladores de la tarjeta gráfica."/>
<check_box initial_value="true" label="Shaders de la atmósfera" name="WindLightUseAtmosShaders"/>
+ <check_box initial_value="verdadero" label="Luces y sombras" name="UseLightShaders"/>
+ <check_box initial_value="verdadero" label="Oclusión del ambiente" name="UseSSAO"/>
+ <check_box initial_value="verdadero" label="Profundidad del campo" name="UseDoF"/>
+ <text name="shadows_label">
+ Sombras:
+ </text>
+ <combo_box name="ShadowDetail">
+ <combo_box.item label="Ninguno" name="0"/>
+ <combo_box.item label="Sol/luna" name="1"/>
+ <combo_box.item label="Sol/luna + proyectores" name="2"/>
+ </combo_box>
<text name="reflection_label">
Reflejos en el agua:
</text>
@@ -38,12 +51,16 @@
<combo_box.item label="Todos los avatares y objetos" name="3"/>
<combo_box.item label="Todo" name="4"/>
</combo_box>
+ <slider label="Física del avatar:" name="AvatarPhysicsDetail"/>
+ <text name="AvatarPhysicsDetailText">
+ Bajo
+ </text>
<slider label="Distancia de dibujo:" name="DrawDistance"/>
<text name="DrawDistanceMeterText2">
m
</text>
<slider label="Núm. máx. de partículas:" name="MaxParticleCount"/>
- <slider label="N.º máximo de avatares no impostores:" name="MaxNumberAvatarDrawn"/>
+ <slider label="Nº máx. de avats. no impostores:" name="MaxNumberAvatarDrawn"/>
<slider label="Calidad de procesamiento:" name="RenderPostProcess"/>
<text name="MeshDetailText">
Detalle de la malla:
@@ -81,7 +98,7 @@
<check_box initial_value="true" label="Avatares simulados" name="AvatarImpostors"/>
<check_box initial_value="true" label="Renderizado por hardware" name="AvatarVertexProgram"/>
<check_box initial_value="true" label="Ropas del avatar" name="AvatarCloth"/>
- <text name="TerrainDetailText">
+ <text left="402" name="TerrainDetailText">
Detalle del terreno:
</text>
<radio_group name="TerrainDetailRadio">
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_move.xml b/indra/newview/skins/default/xui/es/panel_preferences_move.xml
new file mode 100644
index 0000000000..b2ff6b61c2
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_preferences_move.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Mover" name="move_panel">
+ <slider label="Ãngulo de visión" name="camera_fov"/>
+ <slider label="Distancia" name="camera_offset_scale"/>
+ <text name="heading2">
+ Posición automática para:
+ </text>
+ <check_box label="Construir/Editar" name="edit_camera_movement" tool_tip="Usar el posicionamiento automático de la cámara al entrar en o salir del modo de edición"/>
+ <check_box label="Apariencia" name="appearance_camera_movement" tool_tip="Usar el posicionamiento automático de la cámara mientras se está editando"/>
+ <text name="keyboard_lbl">
+ Teclado:
+ </text>
+ <check_box label="Las teclas del cursor siempre para moverme" name="arrow_keys_move_avatar_check"/>
+ <check_box label="Correr siempre: atajo de teclado" name="tap_tap_hold_to_run"/>
+ <text name="mouse_lbl">
+ Ratón:
+ </text>
+ <check_box label="Verme en vista subjetiva" name="first_person_avatar_visible"/>
+ <text name=" Mouse Sensitivity">
+ Sensibilidad del ratón en la Vista subjetiva:
+ </text>
+ <check_box label="Invertir" name="invert_mouse"/>
+ <text name="single_click_action_lbl">
+ Un clic en el terreno:
+ </text>
+ <combo_box name="single_click_action_combo">
+ <combo_box.item label="Ninguna acción" name="0"/>
+ <combo_box.item label="Ir al punto seleccionado" name="1"/>
+ </combo_box>
+ <text name="double_click_action_lbl">
+ Doble clic en el terreno:
+ </text>
+ <combo_box name="double_click_action_combo">
+ <combo_box.item label="Ninguna acción" name="0"/>
+ <combo_box.item label="Ir al punto seleccionado" name="1"/>
+ <combo_box.item label="Teleportarte al punto seleccionado" name="2"/>
+ </combo_box>
+ <button label="Otros dispositivos" name="joystick_setup_button"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/es/panel_preferences_privacy.xml
index bf2c6b7aa6..c162130af6 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_privacy.xml
@@ -7,20 +7,25 @@
<text name="cache_size_label_l">
(Localizaciones, imágenes, web, historial de búsqueda)
</text>
+ <check_box label="Mostrarme en los resultados de la búsqueda" name="online_searchresults"/>
<check_box label="Sólo saben si estoy conectado mis amigos y grupos" name="online_visibility"/>
<check_box label="Sólo pueden llamarme o mandarme un MI mis amigos y grupos" name="voice_call_friends_only_check"/>
<check_box label="Desconectar el micrófono cuando finalicen las llamadas" name="auto_disengage_mic_check"/>
- <check_box label="Aceptar las &apos;cookies&apos;" name="cookies_enabled"/>
+ <check_box label="Mostrar mis Hitos favoritos al Inicio de sesión (menú desplegable &quot;Empezar &#10;en&quot;)" name="favorites_on_login_check" top_pad="15"/>
<text name="Logs:">
- Registros:
+ Registros de chat:
</text>
<check_box label="Guardar en mi ordenador registros del chat" name="log_nearby_chat"/>
<check_box label="Guardar en mi ordenador registros de los MI" name="log_instant_messages"/>
- <check_box label="Añadir fecha y hora" name="show_timestamps_check_im"/>
+ <check_box label="Añadir fecha y hora a todas las líneas del registro de chat" name="show_timestamps_check_im"/>
+ <check_box label="Añadir la fecha al nombre del archivo del registro." name="logfile_name_datestamp"/>
<text name="log_path_desc">
Ruta de los registros:
</text>
<line_editor left="278" name="log_path_string" right="-20"/>
<button label="Elegir" label_selected="Elegir" name="log_path_button" width="120"/>
<button label="Lista de ignorados" name="block_list"/>
+ <text name="block_list_label">
+ (Gente u objetos que has bloqueado)
+ </text>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_setup.xml b/indra/newview/skins/default/xui/es/panel_preferences_setup.xml
index 100951a51e..81a29dae5a 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_setup.xml
@@ -1,12 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Configurar" name="Input panel">
- <text name="Mouselook:">
- Vista subjetiva:
- </text>
- <text name=" Mouse Sensitivity">
- Sensibilidad del ratón
- </text>
- <check_box label="Invertir" name="invert_mouse"/>
<text name="Network:">
Red:
</text>
@@ -18,32 +11,26 @@
</text>
<check_box label="Personalizar el puerto" name="connection_port_enabled"/>
<spinner label="Nº del puerto:" name="connection_port"/>
- <text name="cache_size_label_l">
- Tamaño de la caché
- </text>
- <text name="text_box5">
- MB
- </text>
- <text name="Cache location">
- Localización de la caché:
- </text>
- <button label="Elegir" label_selected="Elegir" name="set_cache"/>
- <button label="Recuperar" label_selected="Reconfigurar" name="reset_cache"/>
<text name="Web:">
Web:
</text>
<radio_group name="use_external_browser">
- <radio_item label="Usar mi navegador (IE, Firefox, Safari)" name="external" tool_tip="Usa tu navegador por defecto para ayuda, enlaces web, etc. No es aconsejable si estás a pantalla completa." value="1"/>
+ <radio_item label="Usar mi navegador (IE, Firefox, Safari)" name="external" tool_tip="Usa tu navegador por defecto para ayuda, enlaces web, etc. No es aconsejable si estás a pantalla completa." value="true"/>
<radio_item label="Usar el navegador incorporado" name="internal" tool_tip="Usa el navegador incorporado para ayuda, enlaces web, etc. Este navegador se abre en una nueva ventana dentro de [APP_NAME]." value=""/>
</radio_group>
<check_box initial_value="true" label="Activar plugins" name="browser_plugins_enabled"/>
<check_box initial_value="true" label="Aceptar las &apos;cookies&apos;" name="cookies_enabled"/>
<check_box initial_value="true" label="Activar Javascript" name="browser_javascript_enabled"/>
- <check_box initial_value="falso" label="Permitir ventanas emergentes de navegadores de medios" name="media_popup_enabled"/>
- <check_box initial_value="false" label="Activar web proxy" name="web_proxy_enabled"/>
- <text name="Proxy location">
- Localización del proxy:
- </text>
- <line_editor name="web_proxy_editor" tool_tip="Nombre o dirección IP del proxy que quieres usar"/>
- <spinner label="Nº del puerto:" name="web_proxy_port"/>
+ <check_box initial_value="falso" label="Permitir las ventanas emergentes en el navegador" name="media_popup_enabled"/>
+ <text name="Software updates:">
+ Actualizaciones de software:
+ </text>
+ <combo_box name="updater_service_combobox">
+ <combo_box.item label="Instalar automáticamente" name="Install_automatically"/>
+ <combo_box.item label="Descargar e instalar actualizaciones manualmente" name="Install_manual"/>
+ </combo_box>
+ <text name="Proxy Settings:">
+ Configuración de proxy:
+ </text>
+ <button label="Ajustar la configuración de proxy" label_selected="Elegir" name="set_proxy"/>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_sound.xml b/indra/newview/skins/default/xui/es/panel_preferences_sound.xml
index b0088ee1a2..5cb1654c70 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_sound.xml
@@ -1,18 +1,25 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Sonidos" name="Preference Media panel">
+ <panel.string name="middle_mouse">
+ Botón medio del ratón
+ </panel.string>
<slider label="Volumen general" name="System Volume"/>
- <check_box initial_value="true" label="Silenciar cuando minimice" name="mute_when_minimized"/>
+ <check_box initial_value="true" name="mute_when_minimized"/>
+ <text name="mute_chb_label">
+ Silenciar cuando minimice
+ </text>
<slider label="Botones" name="UI Volume"/>
<slider label="Ambiental" name="Wind Volume"/>
<slider label="Efectos de sonido" name="SFX Volume"/>
<slider label="Música en streaming" name="Music Volume"/>
- <check_box label="Activada" name="music_enabled"/>
+ <check_box label="Activada" name="enable_music"/>
<slider label="Multimedia" name="Media Volume"/>
- <check_box label="Activada" name="enable_media"/>
+ <check_box label="Activados" name="enable_media"/>
<slider label="Chat de voz" name="Voice Volume"/>
<check_box label="Activado" name="enable_voice_check"/>
<check_box label="Permitir la ejecución automática de los media" name="media_auto_play_btn" tool_tip="Marcar esto para permitir la ejecución automática de los media" value="true"/>
<check_box label="Ejecutar para otros avatares los media anexados" name="media_show_on_others_btn" tool_tip="Al desmarcar esto se esconderán los media anexados a otros avatares cercanos" value="true"/>
+ <check_box label="Reproducir sonidos de los gestos" name="gesture_audio_play_btn" tool_tip="Selecciona esta opción para escuchar los sonidos de los gestos" value="verdadero"/>
<text name="voice_chat_settings">
Configuración del chat de voz
</text>
@@ -23,29 +30,11 @@
<radio_item label="La posición de la cámara" name="0"/>
<radio_item label="La posición del avatar" name="1"/>
</radio_group>
+ <check_box label="Al hablar, mover los labios del avatar" name="enable_lip_sync"/>
+ <check_box label="Cambiar entre hablar on/off cuando pulse:" name="push_to_talk_toggle_check" tool_tip="En el modo &apos;un toque&apos;, pulsa y suelta el botón UNA VEZ para activar o desactivar el micrófono. Si no estás en el modo &apos;un toque&apos;, el micrófono sólo recogerá tu voz mientras mantengas pulsado el botón."/>
+ <line_editor label="Botón de Apretar para Hablar" name="modifier_combo"/>
+ <button label="Elegir la tecla" name="set_voice_hotkey_button"/>
+ <button name="set_voice_middlemouse_button" tool_tip="Reconfigurarlo al botón medio del ratón"/>
<button label="Dispositivos de entrada y salida" name="device_settings_btn" width="210"/>
- <panel label="Configuración de dispositivos" name="device_settings_panel">
- <panel.string name="default_text">
- Por defecto
- </panel.string>
- <panel.string name="default system device">
- Dispositivo del sistema por defecto
- </panel.string>
- <panel.string name="no device">
- Ningún dispositivo
- </panel.string>
- <text name="Input">
- Entrada
- </text>
- <text name="My volume label">
- Mi volumen:
- </text>
- <slider_bar initial_value="1.0" name="mic_volume_slider" tool_tip="Cambia el volumen usando este deslizable"/>
- <text name="wait_text">
- Por favor, espera
- </text>
- <text name="Output">
- Salida
- </text>
- </panel>
+ <panel label="Configuración de dispositivos" name="device_settings_panel"/>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_profile.xml b/indra/newview/skins/default/xui/es/panel_profile.xml
deleted file mode 100644
index 5cfe83cd61..0000000000
--- a/indra/newview/skins/default/xui/es/panel_profile.xml
+++ /dev/null
@@ -1,64 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Perfil" name="panel_profile">
- <string name="CaptionTextAcctInfo">
- [ACCTTYPE]
-[PAYMENTINFO] [AGEVERIFICATION]
- </string>
- <string name="payment_update_link_url">
- http://www.secondlife.com/account/billing.php?lang=es-ES
- </string>
- <string name="partner_edit_link_url">
- http://www.secondlife.com/account/partners.php?lang=es
- </string>
- <string name="my_account_link_url" value="http://secondlife.com/my/account/index.php?lang=es-ES"/>
- <string name="no_partner_text" value="Ninguno"/>
- <string name="no_group_text" value="Ninguno"/>
- <string name="RegisterDateFormat">
- [REG_DATE] ([AGE])
- </string>
- <layout_stack name="layout">
- <layout_panel name="profile_stack">
- <scroll_container name="profile_scroll">
- <panel name="profile_scroll_panel">
- <panel name="second_life_image_panel">
- <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/>
- </panel>
- <panel name="first_life_image_panel">
- <text name="title_rw_descr_text" value="Mundo real:"/>
- </panel>
- <text name="title_member_text" value="Residente desde:"/>
- <text name="title_acc_status_text" value="Estado de la cuenta:"/>
- <text name="title_partner_text" value="Compañero/a:"/>
- <panel name="partner_data_panel">
- <name_box initial_value="(obteniendo)" name="partner_text"/>
- </panel>
- <text name="title_groups_text" value="Grupos:"/>
- </panel>
- </scroll_container>
- </layout_panel>
- </layout_stack>
- <layout_stack name="layout_verb_buttons">
- <layout_panel name="profile_buttons_panel">
- <layout_stack name="bottom_bar_ls">
- <layout_panel name="add_friend_btn_lp">
- <button label="Añadir como amigo" name="add_friend" tool_tip="Ofrecer amistad a este Residente"/>
- </layout_panel>
- <layout_panel name="im_btn_lp">
- <button label="MI" name="im" tool_tip="Abrir una sesión de mensajes instantáneos"/>
- </layout_panel>
- <layout_panel name="call_btn_lp">
- <button label="Llamar" name="call" tool_tip="Llamar a este Residente"/>
- </layout_panel>
- <layout_panel name="chat_btn_lp">
- <button label="Teleporte" name="teleport" tool_tip="Ofrecer teleporte"/>
- </layout_panel>
- <layout_panel name="overflow_btn_lp">
- <button label="▼" name="overflow_btn" tool_tip="Pagar dinero al Residente o compartir algo del inventario con él"/>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- <layout_panel name="profile_me_buttons_panel">
- <button label="Editar el perfil" name="edit_profile_btn" tool_tip="Modificar tu información personal"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_profile_view.xml b/indra/newview/skins/default/xui/es/panel_profile_view.xml
deleted file mode 100644
index a11fc31607..0000000000
--- a/indra/newview/skins/default/xui/es/panel_profile_view.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_target_profile">
- <string name="status_online">
- Conectado/a
- </string>
- <string name="status_offline">
- Desconectado/a
- </string>
- <text name="display_name_label" value="Nombre mostrado:"/>
- <text name="solo_username_label" value="Nombre de usuario:"/>
- <text name="status" value="Conectado/a"/>
- <text name="user_name_small" value="Jack, ¿has visto esto? Es un nombre larguísimo."/>
- <text name="user_name" value="Jack Linden"/>
- <button name="copy_to_clipboard" tool_tip="Copiar al portapapeles"/>
- <text name="user_label" value="Nombre de usuario:"/>
- <text name="user_slid" value="jack.linden"/>
- <tab_container name="tabs">
- <panel label="PERFIL" name="panel_profile"/>
- <panel label="DESTACADOS" name="panel_picks"/>
- <panel label="NOTAS Y PRIVACIDAD" name="panel_notes"/>
- </tab_container>
-</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_region_covenant.xml b/indra/newview/skins/default/xui/es/panel_region_covenant.xml
index 0a5d7c2786..2beacda235 100644
--- a/indra/newview/skins/default/xui/es/panel_region_covenant.xml
+++ b/indra/newview/skins/default/xui/es/panel_region_covenant.xml
@@ -27,8 +27,8 @@
</text_editor>
<button label="Cambiar" name="reset_covenant"/>
<text name="covenant_help_text">
- Los cambios en el contrato se mostrarán en todas las parcelas
- del estado.
+ Los cambios en el contrato se mostrarán en todas las parcelas
+del estado.
</text>
<text bottom_delta="-31" name="covenant_instructions">
Arrastra y suelta una nota para cambiar el contrato de este estado.
@@ -52,7 +52,7 @@
Calificación:
</text>
<text name="region_maturity_text">
- &apos;Adult&apos;
+ Adulto
</text>
<text name="resellable_lbl">
Revender:
@@ -73,7 +73,8 @@
El terreno comprado en esta región no se podrá revender.
</string>
<string name="can_change">
- El terreno comprado en esta región se podrá unir o subdividir.
+ El terreno comprado en esta región se podrá unir o
+subdividir.
</string>
<string name="can_not_change">
El terreno comprado en esta región no se podrá unir ni
diff --git a/indra/newview/skins/default/xui/es/panel_region_environment.xml b/indra/newview/skins/default/xui/es/panel_region_environment.xml
new file mode 100644
index 0000000000..a73f1deed4
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_region_environment.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Entorno" name="panel_env_info">
+ <text name="water_settings_title">
+ Selecciona la configuración de agua y cielo/ciclo del día que deseas que vean todos los visitantes de tu región. Más información
+ </text>
+ <radio_group name="region_settings_radio_group">
+ <radio_item label="Usar los valores predeterminados de Second Life" name="use_sl_default_settings"/>
+ <radio_item label="Usar la configuración siguiente" name="use_my_settings"/>
+ </radio_group>
+ <panel name="user_environment_settings">
+ <text name="water_settings_title">
+ Configuración de agua
+ </text>
+ <combo_box name="water_settings_preset_combo">
+ <combo_box.item label="-Selecciona un valor predefinido-" name="item0"/>
+ </combo_box>
+ <text name="sky_dayc_settings_title">
+ Cielo/Ciclo del día
+ </text>
+ <radio_group name="sky_dayc_settings_radio_group">
+ <radio_item label="Cielo invariable" name="my_sky_settings"/>
+ <radio_item label="Ciclo del día" name="my_dayc_settings"/>
+ </radio_group>
+ <combo_box name="sky_settings_preset_combo">
+ <combo_box.item label="-Selecciona un valor predefinido-" name="item0"/>
+ </combo_box>
+ <combo_box name="dayc_settings_preset_combo">
+ <combo_box.item label="-Selecciona un valor predefinido-" name="item0"/>
+ </combo_box>
+ </panel>
+ <button label="Aplicar" name="apply_btn"/>
+ <button label="Cancelar" name="cancel_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_region_estate.xml b/indra/newview/skins/default/xui/es/panel_region_estate.xml
index c51c3815d1..84c1ed7686 100644
--- a/indra/newview/skins/default/xui/es/panel_region_estate.xml
+++ b/indra/newview/skins/default/xui/es/panel_region_estate.xml
@@ -10,7 +10,7 @@
(desconocido)
</text>
<text name="owner_text">
- Propietario del Estado:
+ Propietario del estado:
</text>
<text name="estate_owner">
(desconocido)
@@ -23,10 +23,10 @@
<check_box label="Permitir el acceso público" name="externally_visible_check"/>
<button label="?" name="externally_visible_help"/>
<text name="Only Allow">
- Restringir el acceso a cuentas verificadas por:
+ Permitir únicamente el acceso a los Residentes que:
</text>
- <check_box label="Información de pago aportada" name="limit_payment" tool_tip="Expulsa a los Residentes no identificados."/>
- <check_box label="Verificación de la edad" name="limit_age_verified" tool_tip="Expulsa a los Residentes que no hayan verificado su edad. Más información en [SUPPORT_SITE]."/>
+ <check_box label="Han aportado la información de pago." name="limit_payment" tool_tip="Para poder acceder a este estado los Residentes deben haber aportado información de pago en su cuenta. Para más información, ver [SUPPORT_SITE]."/>
+ <check_box label="Han verificado su edad" name="limit_age_verified" tool_tip="Para poder acceder a este estado los Residentes deben haber verificado su edad. Para más información, ver [SUPPORT_SITE]."/>
<check_box label="Permitir el chat de voz" name="voice_chat_check"/>
<button label="?" name="voice_chat_help"/>
<check_box label="Permitir el teleporte a cualquier punto" name="allow_direct_teleport"/>
@@ -39,7 +39,7 @@
</string>
<button label="?" name="abuse_email_address_help"/>
<button label="Aplicar" name="apply_btn"/>
- <button label="Expulsar a un Residente del Estado..." name="kick_user_from_estate_btn"/>
+ <button label="Expulsar a un Residente del estado..." name="kick_user_from_estate_btn"/>
<button label="Enviar un mensaje al estado..." name="message_estate_btn"/>
<text name="estate_manager_label">
Administradores del estado:
diff --git a/indra/newview/skins/default/xui/es/panel_region_general.xml b/indra/newview/skins/default/xui/es/panel_region_general.xml
index fe7f51c74e..453d1fe43c 100644
--- a/indra/newview/skins/default/xui/es/panel_region_general.xml
+++ b/indra/newview/skins/default/xui/es/panel_region_general.xml
@@ -25,6 +25,7 @@
<check_box label="Permitir la reventa del terreno" name="allow_land_resell_check"/>
<check_box label="Permitir unir/dividir el terreno" name="allow_parcel_changes_check"/>
<check_box label="Bloquear el mostrar el terreno en la búsqueda" name="block_parcel_search_check" tool_tip="Permitir que la gente vea esta región y sus parcelas en los resultados de la búsqueda."/>
+ <check_box label="Permitir objetos de red" name="mesh_rez_enabled_check" tool_tip="Permitir que los usuarios creen objetos de red en esta región"/>
<spinner label="Nº máximo de avatares" label_width="120" name="agent_limit_spin" width="180"/>
<spinner label="Plus de objetos" label_width="120" name="object_bonus_spin" width="180"/>
<text label="Calificación" name="access_text">
diff --git a/indra/newview/skins/default/xui/es/panel_region_terrain.xml b/indra/newview/skins/default/xui/es/panel_region_terrain.xml
index 903b826a0b..cb6c03dbb5 100644
--- a/indra/newview/skins/default/xui/es/panel_region_terrain.xml
+++ b/indra/newview/skins/default/xui/es/panel_region_terrain.xml
@@ -7,21 +7,56 @@
desconocida
</text>
<spinner label="Nivel del agua" name="water_height_spin"/>
- <button label="?" name="water_height_help"/>
- <spinner label="Límite de elevación del &#10;terreno" name="terrain_raise_spin"/>
- <button label="?" name="terrain_raise_help"/>
- <spinner label="Límite de bajada del &#10;terreno" name="terrain_lower_spin" bottom_delta="-34"/>
- <button label="?" name="terrain_lower_help"/>
- <check_box label="Usar el Sol del estado" name="use_estate_sun_check"/>
- <button label="?" name="use_estate_sun_help"/>
- <check_box label="Fijar el Sol" name="fixed_sun_check"/>
- <button label="?" name="fixed_sun_help"/>
- <slider label="Fase" name="sun_hour_slider"/>
+ <spinner label="Límite de elevación
+del terreno" name="terrain_raise_spin"/>
+ <spinner bottom_delta="-34" label="Límite de bajada del
+terreno" name="terrain_lower_spin"/>
+ <text name="detail_texture_text">
+ Texturas del terreno (requiere archivos .tga de 512x512, 24 bits)
+ </text>
+ <text name="height_text_lbl">
+ 1 (bajo)
+ </text>
+ <text name="height_text_lbl2">
+ 2
+ </text>
+ <text name="height_text_lbl3">
+ 3
+ </text>
+ <text name="height_text_lbl4">
+ 4 (alto)
+ </text>
+ <text name="height_text_lbl5">
+ Intervalos de elevación de textura
+ </text>
+ <text name="height_text_lbl10">
+ Estos valores representan la gama de mezclas para las texturas anteriores.
+ </text>
+ <text name="height_text_lbl11">
+ El valor BAJA mide en metros la altura MÃXIMA de la textura n.º 1, y el valor ALTA es la altura MÃNIMA de la textura n.º 4.
+ </text>
+ <text name="height_text_lbl6">
+ Noroeste
+ </text>
+ <text name="height_text_lbl7">
+ Noreste
+ </text>
+ <spinner label="Bajo" name="height_start_spin_1"/>
+ <spinner label="Bajo" name="height_start_spin_3"/>
+ <spinner label="Alto" name="height_range_spin_1"/>
+ <spinner label="Alto" name="height_range_spin_3"/>
+ <text name="height_text_lbl8">
+ Suroeste
+ </text>
+ <text name="height_text_lbl9">
+ Sureste
+ </text>
+ <spinner label="Bajo" name="height_start_spin_0"/>
+ <spinner label="Bajo" name="height_start_spin_2"/>
+ <spinner label="Alto" name="height_range_spin_0"/>
+ <spinner label="Alto" name="height_range_spin_2"/>
+ <button label="Descargar el RAW del terreno..." name="download_raw_btn" tool_tip="Disponible sólo para los propietarios del estado, no para los administradores" width="230"/>
+ <button label="Subir un RAW para el terreno..." name="upload_raw_btn" tool_tip="Disponible sólo para los propietarios del estado, no para los administradores" width="230"/>
+ <button label="Predeterminar este terreno" name="bake_terrain_btn" tool_tip="Definir el terreno actual como punto medio para los límites de elevación/bajada" width="230"/>
<button label="Aplicar" name="apply_btn"/>
- <button width="230" label="Descargar el RAW del terreno..." name="download_raw_btn" tool_tip="Disponible sólo para los propietarios del estado, no para los administradores"/>
- <button left="246" label="?" name="download_raw_help"/>
- <button width="230" label="Subir un RAW para el terreno..." name="upload_raw_btn" tool_tip="Disponible sólo para los propietarios del estado, no para los administradores"/>
- <button left="246" label="?" name="upload_raw_help"/>
- <button width="230" label="Predeterminar este terreno" name="bake_terrain_btn" tool_tip="Definir el terreno actual como punto medio para los límites de elevación/bajada"/>
- <button left="246" label="?" name="bake_terrain_help"/>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_script_ed.xml b/indra/newview/skins/default/xui/es/panel_script_ed.xml
index c73db729fe..4c4077b96f 100644
--- a/indra/newview/skins/default/xui/es/panel_script_ed.xml
+++ b/indra/newview/skins/default/xui/es/panel_script_ed.xml
@@ -15,15 +15,15 @@
<panel.string name="Title">
Script: [NAME]
</panel.string>
- <text_editor name="Script Editor">
- Cargando...
- </text_editor>
- <button label="Guardar" label_selected="Guardar" name="Save_btn"/>
- <combo_box label="Insertar..." name="Insert..."/>
+ <panel.string name="external_editor_not_set">
+ Puedes seleccionar un editor configurando la variable de entorno LL_SCRIPT_EDITOR o mediante la configuración de ExternalEditor.
+ </panel.string>
<menu_bar name="script_menu">
<menu label="Archivo" name="File">
<menu_item_call label="Guardar" name="Save"/>
<menu_item_call label="Deshacer todos los cambios" name="Revert All Changes"/>
+ <menu_item_call label="Cargar desde archivo..." name="LoadFromFile"/>
+ <menu_item_call label="Guardar en archivo..." name="SaveToFile"/>
</menu>
<menu label="Editar" name="Edit">
<menu_item_call label="Deshacer" name="Undo"/>
@@ -40,4 +40,10 @@
<menu_item_call label="Ayuda de palabras clave..." name="Keyword Help..."/>
</menu>
</menu_bar>
+ <text_editor name="Script Editor">
+ Cargando...
+ </text_editor>
+ <combo_box label="Insertar..." name="Insert..."/>
+ <button label="Guardar" label_selected="Guardar" name="Save_btn"/>
+ <button label="Editar..." name="Edit_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_scrolling_param_base.xml b/indra/newview/skins/default/xui/es/panel_scrolling_param_base.xml
new file mode 100644
index 0000000000..fa659040ea
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_scrolling_param_base.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="LLScrollingPanelParamBase">
+ <slider label="[DESC]" name="param slider"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/es/panel_snapshot_inventory.xml
new file mode 100644
index 0000000000..12c74b5cd1
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_snapshot_inventory.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_inventory">
+ <text name="title">
+ Guardar en mi inventario
+ </text>
+ <text name="hint_lbl">
+ Guardar una imagen en el inventario cuesta [UPLOAD_COST] L$. Para guardar una imagen como una textura, selecciona uno de los formatos cuadrados.
+ </text>
+ <combo_box label="Resolución" name="texture_size_combo">
+ <combo_box.item label="Ventana actual" name="CurrentWindow"/>
+ <combo_box.item label="Pequeña (128x128)" name="Small(128x128)"/>
+ <combo_box.item label="Mediana (256x256)" name="Medium(256x256)"/>
+ <combo_box.item label="Grande (512x512)" name="Large(512x512)"/>
+ <combo_box.item label="Personalizado" name="Custom"/>
+ </combo_box>
+ <spinner label="Ancho" name="inventory_snapshot_width"/>
+ <spinner label="Altura" name="inventory_snapshot_height"/>
+ <check_box label="Mantener las proporciones" name="inventory_keep_aspect_check"/>
+ <button label="Cancelar" name="cancel_btn"/>
+ <button label="Guardar" name="save_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_snapshot_local.xml b/indra/newview/skins/default/xui/es/panel_snapshot_local.xml
new file mode 100644
index 0000000000..08c45d2e76
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_snapshot_local.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_local">
+ <text name="title">
+ Guardar en mi ordenador
+ </text>
+ <combo_box label="Resolución" name="local_size_combo">
+ <combo_box.item label="Ventana actual" name="CurrentWindow"/>
+ <combo_box.item label="320x240" name="320x240"/>
+ <combo_box.item label="640x480" name="640x480"/>
+ <combo_box.item label="800x600" name="800x600"/>
+ <combo_box.item label="1024x768" name="1024x768"/>
+ <combo_box.item label="1280x1024" name="1280x1024"/>
+ <combo_box.item label="1600x1200" name="1600x1200"/>
+ <combo_box.item label="Personalizado" name="Custom"/>
+ </combo_box>
+ <layout_stack name="local_image_params_ls">
+ <layout_panel name="local_image_size_lp">
+ <spinner label="Ancho" name="local_snapshot_width"/>
+ <spinner label="Altura" name="local_snapshot_height"/>
+ <check_box label="Mantener las proporciones" name="local_keep_aspect_check"/>
+ </layout_panel>
+ <layout_panel name="local_image_format_quality_lp">
+ <combo_box label="Formato" name="local_format_combo">
+ <combo_box.item label="PNG (sin pérdida)" name="PNG"/>
+ <combo_box.item label="JPEG" name="JPEG"/>
+ <combo_box.item label="BMP (sin pérdida)" name="BMP"/>
+ </combo_box>
+ <slider label="Calidad de la imagen" name="image_quality_slider"/>
+ <text name="image_quality_level">
+ ([QLVL])
+ </text>
+ </layout_panel>
+ </layout_stack>
+ <button label="Cancelar" name="cancel_btn"/>
+ <flyout_button label="Guardar" name="save_btn" tool_tip="Guardar la imagen en un archivo">
+ <flyout_button.item label="Guardar" name="save_item"/>
+ <flyout_button.item label="Guardar como..." name="saveas_item"/>
+ </flyout_button>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_snapshot_options.xml b/indra/newview/skins/default/xui/es/panel_snapshot_options.xml
new file mode 100644
index 0000000000..2b2584f66c
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_snapshot_options.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_options">
+ <button label="Publicar en los comentarios de Mi perfil" name="save_to_profile_btn"/>
+ <button label="Correo-e" name="save_to_email_btn"/>
+ <button label="Guardar en Mi inventario ([AMOUNT] L$)" name="save_to_inventory_btn"/>
+ <button label="Guardar en mi ordenador" name="save_to_computer_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_snapshot_postcard.xml b/indra/newview/skins/default/xui/es/panel_snapshot_postcard.xml
new file mode 100644
index 0000000000..649d547ba0
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_snapshot_postcard.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_postcard">
+ <string name="default_subject">
+ Postal desde [SECOND_LIFE].
+ </string>
+ <string name="default_message">
+ ¡Mira esto!
+ </string>
+ <string name="upload_message">
+ Enviando...
+ </string>
+ <text name="title">
+ Correo-e
+ </text>
+ <button label="Mensaje" name="message_btn"/>
+ <button label="Ajustes" name="settings_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_snapshot_profile.xml b/indra/newview/skins/default/xui/es/panel_snapshot_profile.xml
new file mode 100644
index 0000000000..6a0bc22d68
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_snapshot_profile.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_profile">
+ <text name="title">
+ Publicar en los comentarios de Mi perfil
+ </text>
+ <combo_box label="Resolución" name="profile_size_combo">
+ <combo_box.item label="Ventana actual" name="CurrentWindow"/>
+ <combo_box.item label="640x480" name="640x480"/>
+ <combo_box.item label="800x600" name="800x600"/>
+ <combo_box.item label="1024x768" name="1024x768"/>
+ <combo_box.item label="Personalizado" name="Custom"/>
+ </combo_box>
+ <layout_stack name="profile_image_params_ls">
+ <layout_panel name="profile_image_size_lp">
+ <spinner label="Ancho" name="profile_snapshot_width"/>
+ <spinner label="Altura" name="profile_snapshot_height"/>
+ <check_box label="Mantener las proporciones" name="profile_keep_aspect_check"/>
+ </layout_panel>
+ <layout_panel name="profile_image_metadata_lp">
+ <text name="caption_label">
+ Título:
+ </text>
+ <check_box initial_value="true" label="Incluir ubicación" name="add_location_cb"/>
+ </layout_panel>
+ </layout_stack>
+ <button label="Cancelar" name="cancel_btn"/>
+ <button label="Publicar" name="post_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_sound_devices.xml b/indra/newview/skins/default/xui/es/panel_sound_devices.xml
new file mode 100644
index 0000000000..9531b99cc8
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_sound_devices.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<panel label="Configuración del dispositivo" name="device_settings_panel">
+ <panel.string name="default_text">
+ Por defecto
+ </panel.string>
+ <string name="name_no_device">
+ Ningún dispositivo
+ </string>
+ <string name="name_default_system_device">
+ Dispositivo del sistema por defecto
+ </string>
+ <text name="Input">
+ Entrada
+ </text>
+ <text name="Output">
+ Salida
+ </text>
+ <text name="My volume label">
+ Mi volumen:
+ </text>
+ <slider_bar initial_value="1.0" name="mic_volume_slider" tool_tip="Cambia el volumen usando este deslizable"/>
+ <text name="wait_text">
+ Por favor, espera
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_status_bar.xml b/indra/newview/skins/default/xui/es/panel_status_bar.xml
index 13ed1acf0b..7eead3bc18 100644
--- a/indra/newview/skins/default/xui/es/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/es/panel_status_bar.xml
@@ -1,11 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="status">
- <panel.string name="StatBarDaysOfWeek">
- Domingo:Lunes:Martes:Miércoles:Jueves:Viernes:Sábado
- </panel.string>
- <panel.string name="StatBarMonthsOfYear">
- Enero:Febrero:Marzo:Abril:Mayo:Junio:Julio:Agosto:Septiembre:Octubre:Noviembre:Diciembre
- </panel.string>
<panel.string name="packet_loss_tooltip">
Pérdida de paquetes
</panel.string>
@@ -21,9 +15,10 @@
<panel.string name="buycurrencylabel">
[AMT] L$
</panel.string>
- <panel name="balance_bg">
- <text name="balance" tool_tip="Mi saldo" value="20 L$"/>
- <button label="COMPRAR L$" name="buyL" tool_tip="Pulsa para comprar más L$"/>
+ <panel left="-410" name="balance_bg" width="200">
+ <text name="balance" tool_tip="Haz clic para actualizar tu saldo en L$" value="20 L$"/>
+ <button label="Comprar L$" name="buyL" tool_tip="Pulsa para comprar más L$"/>
+ <button label="Comprar" name="goShop" tool_tip="Abrir el mercado de Second Life" width="80"/>
</panel>
<text name="TimeText" tool_tip="Hora actual (Pacífico)">
24:00 AM PST
diff --git a/indra/newview/skins/default/xui/es/sidepanel_inventory.xml b/indra/newview/skins/default/xui/es/sidepanel_inventory.xml
index b233fdd734..f68dcc65e3 100644
--- a/indra/newview/skins/default/xui/es/sidepanel_inventory.xml
+++ b/indra/newview/skins/default/xui/es/sidepanel_inventory.xml
@@ -1,6 +1,27 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Cosas" name="objects panel">
<panel label="" name="sidepanel__inventory_panel">
+ <layout_stack name="inventory_layout_stack">
+ <layout_panel name="inbox_layout_panel">
+ <panel label="" name="marketplace_inbox">
+ <string name="InboxLabelWithArg">
+ Objetos recibidos ([NUM])
+ </string>
+ <string name="InboxLabelNoArg">
+ Objetos recibidos
+ </string>
+ <button label="Objetos recibidos" name="inbox_btn"/>
+ <text name="inbox_fresh_new_count">
+ [NUM] nuevos
+ </text>
+ <panel tool_tip="Drag and drop items to your inventory to manage and use them">
+ <text name="inbox_inventory_placeholder">
+ Aquí se entregarán las compras realizadas en el mercado.
+ </text>
+ </panel>
+ </panel>
+ </layout_panel>
+ </layout_stack>
<panel name="button_panel">
<layout_stack name="button_panel_ls">
<layout_panel name="info_btn_lp">
diff --git a/indra/newview/skins/default/xui/es/sidepanel_task_info.xml b/indra/newview/skins/default/xui/es/sidepanel_task_info.xml
index e6d9e28aff..bd814ecc66 100644
--- a/indra/newview/skins/default/xui/es/sidepanel_task_info.xml
+++ b/indra/newview/skins/default/xui/es/sidepanel_task_info.xml
@@ -48,15 +48,9 @@
<text name="CreatorNameLabel">
Creador:
</text>
- <text name="Creator Name">
- Erica Linden
- </text>
<text name="Owner:">
Propietario:
</text>
- <text name="Owner Name">
- Erica Linden
- </text>
<text name="Group_label">
Grupo:
</text>
diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml
index 0be827f5f7..67c65c6ce9 100644
--- a/indra/newview/skins/default/xui/es/strings.xml
+++ b/indra/newview/skins/default/xui/es/strings.xml
@@ -25,12 +25,18 @@
<string name="StartupInitializingVFS">
Iniciando VFS...
</string>
+ <string name="StartupRequireDriverUpdate">
+ Error de inicialización de gráficos. Actualiza tu controlador de gráficos.
+ </string>
<string name="ProgressRestoring">
Restaurando...
</string>
<string name="ProgressChangingResolution">
Cambiando la resolución...
</string>
+ <string name="Fullbright">
+ Brillo al máximo (antiguo)
+ </string>
<string name="LoginInProgress">
Iniciando la sesión. [APP_NAME] debe de aparecer congelado. Por favor, espere.
</string>
@@ -79,6 +85,12 @@
<string name="LoginQuicktimeOK">
QuickTime se ha iniciado adecuadamente.
</string>
+ <string name="LoginRequestSeedCapGrant">
+ Solicitando capacidades de la región...
+ </string>
+ <string name="LoginRetrySeedCapGrant">
+ Solicitando capacidades de la región, intento [NUMBER]...
+ </string>
<string name="LoginWaitingForRegionHandshake">
Esperando la conexión con la región...
</string>
@@ -107,7 +119,7 @@
No se pudo verificar la firma del certificado devuelta por el servidor de la cuadrícula. Ponte en contacto con el administrador de la cuadrícula.
</string>
<string name="LoginFailedNoNetwork">
- Error de red: no se ha podido conectar; por favor, revisa tu conexión a Internet.
+ Error de red: no se ha podido conectar; por favor, revisa tu conexión a internet.
</string>
<string name="LoginFailed">
Error en el inicio de sesión.
@@ -118,6 +130,139 @@
<string name="create_account_url">
http://join.secondlife.com/index.php?lang=es-ES
</string>
+ <string name="LoginFailedViewerNotPermitted">
+ Ya no puedes acceder a Second Life con el visor que estás utilizando. Visita la siguiente página para descargar un nuevo visor:
+http://secondlife.com/download.
+
+Si deseas obtener más información, consulta las preguntas frecuentes que aparecen a continuación:
+http://secondlife.com/viewer-access-faq
+ </string>
+ <string name="LoginIntermediateOptionalUpdateAvailable">
+ Actualización opcional del visor disponible: [VERSIÓN]
+ </string>
+ <string name="LoginFailedRequiredUpdate">
+ Actualización necesaria del visor: [VERSIÓN]
+ </string>
+ <string name="LoginFailedAlreadyLoggedIn">
+ El agente ya ha iniciado sesión.
+ </string>
+ <string name="LoginFailedAuthenticationFailed">
+ Lo sentimos. No ha sido posible iniciar sesión.
+Comprueba si has introducido correctamente
+ * El nombre de usuario (como juangarcia12 o estrella.polar)
+ * Contraseña
+Asimismo, asegúrate de que la tecla Mayús esté desactivada.
+ </string>
+ <string name="LoginFailedPasswordChanged">
+ Como precaución de seguridad, se ha modificado tu contraseña.
+Dirígete a la página de tu cuenta en http://secondlife.com/password
+y responde a la pregunta de seguridad para restablecer la contraseña.
+Lamentamos las molestias.
+ </string>
+ <string name="LoginFailedPasswordReset">
+ Hemos realizado unos cambios en nuestro sistema, por lo que deberás restablecer la contraseña.
+Dirígete a la página de tu cuenta en http://secondlife.com/password
+y responde a la pregunta de seguridad para restablecer la contraseña.
+Lamentamos las molestias.
+ </string>
+ <string name="LoginFailedEmployeesOnly">
+ Second Life no está disponible temporalmente debido a tareas de mantenimiento.
+Actualmente, solo se permite iniciar sesión a los empleados.
+Consulta www.secondlife.com/status si deseas obtener actualizaciones.
+ </string>
+ <string name="LoginFailedPremiumOnly">
+ Las conexiones a Second Life se han restringido provisionalmente para garantizar que los usuarios que ya están conectados tengan la mejor experiencia posible.
+
+Durante este tiempo, las personas con cuentas gratuitas no podrán acceder a Second Life, ya que tienen prioridad los usuarios con una cuenta de pago.
+ </string>
+ <string name="LoginFailedComputerProhibited">
+ No se puede acceder a Second Life desde este ordenador.
+Si crees que se trata de un error, ponte en contacto con
+support@secondlife.com.
+ </string>
+ <string name="LoginFailedAcountSuspended">
+ No se podrá acceder a tu cuenta hasta las
+[HORA] (horario de la costa del Pacífico).
+ </string>
+ <string name="LoginFailedAccountDisabled">
+ En este momento no podemos completar la solicitud.
+Si deseas obtener asistencia, ponte en contacto con el departamento de soporte de Second Life a través de la página http://secondlife.com/support.
+Si no puedes cambiar la contraseña, llama al número (866) 476-9763.
+ </string>
+ <string name="LoginFailedTransformError">
+ Se han detectado datos incorrectos en el inicio de sesión.
+Ponte en contacto con support@secondlife.com.
+ </string>
+ <string name="LoginFailedAccountMaintenance">
+ Se están realizando tareas rutinarias de mantenimiento en tu cuenta.
+No se podrá acceder a tu cuenta hasta las
+[HORA] (horario de la costa del Pacífico).
+Si crees que se trata de un error, ponte en contacto con support@secondlife.com.
+ </string>
+ <string name="LoginFailedPendingLogoutFault">
+ La solicitud de cierre de sesión ha obtenido como resultado un error del simulador.
+ </string>
+ <string name="LoginFailedPendingLogout">
+ El sistema está cerrando tu sesión en estos momentos.
+Tu cuenta no estará disponible hasta las
+[HORA] (horario de la costa del Pacífico).
+ </string>
+ <string name="LoginFailedUnableToCreateSession">
+ No se ha podido crear una sesión válida.
+ </string>
+ <string name="LoginFailedUnableToConnectToSimulator">
+ No se ha podido establecer la conexión con un simulador.
+ </string>
+ <string name="LoginFailedRestrictedHours">
+ Tu cuenta solo puede acceder a Second Life
+entre las [INICIO] y las [FIN] (horario de la costa del Pacífico).
+Inténtalo de nuevo durante ese horario.
+Si crees que se trata de un error, ponte en contacto con support@secondlife.com.
+ </string>
+ <string name="LoginFailedIncorrectParameters">
+ Parámetros incorrectos.
+Si crees que se trata de un error, ponte en contacto con support@secondlife.com.
+ </string>
+ <string name="LoginFailedFirstNameNotAlphanumeric">
+ El parámetro correspondiente al nombre debe contener caracteres alfanuméricos.
+Si crees que se trata de un error, ponte en contacto con support@secondlife.com.
+ </string>
+ <string name="LoginFailedLastNameNotAlphanumeric">
+ El parámetro correspondiente al apellido debe contener caracteres alfanuméricos.
+Si crees que se trata de un error, ponte en contacto con support@secondlife.com.
+ </string>
+ <string name="LogoutFailedRegionGoingOffline">
+ La región se está desconectando.
+Intenta iniciar sesión de nuevo en unos instantes.
+ </string>
+ <string name="LogoutFailedAgentNotInRegion">
+ El agente no se encuentra en la región.
+Intenta iniciar sesión de nuevo en unos instantes.
+ </string>
+ <string name="LogoutFailedPendingLogin">
+ A esta región ya se ha accedido en otra sesión.
+Intenta iniciar sesión de nuevo en unos instantes.
+ </string>
+ <string name="LogoutFailedLoggingOut">
+ Se ha salido de la región en la sesión anterior.
+Intenta iniciar sesión de nuevo en unos instantes.
+ </string>
+ <string name="LogoutFailedStillLoggingOut">
+ La región aún está cerrando la sesión anterior.
+Intenta iniciar sesión de nuevo en unos instantes.
+ </string>
+ <string name="LogoutSucceeded">
+ Se ha salido de la región en la última sesión.
+Intenta iniciar sesión de nuevo en unos instantes.
+ </string>
+ <string name="LogoutFailedLogoutBegun">
+ La región ha comenzado el proceso de cierre de sesión.
+Intenta iniciar sesión de nuevo en unos instantes.
+ </string>
+ <string name="LoginFailedLoggingOutSession">
+ El sistema ha comenzado a cerrar la última sesión.
+Intenta iniciar sesión de nuevo en unos instantes.
+ </string>
<string name="AgentLostConnection">
Esta región puede estar teniendo problemas. Por favor, comprueba tu conexión a Internet.
</string>
@@ -185,6 +330,36 @@
Aquí se puede arrastrar sólo un ítem
</string>
<string name="TooltipPrice" value="[AMOUNT] L$:"/>
+ <string name="TooltipOutboxDragToWorld">
+ No puedes colocar objetos en tu buzón de salida de comerciante
+ </string>
+ <string name="TooltipOutboxNoTransfer">
+ Uno o varios de estos objetos no se pueden vender o transferir.
+ </string>
+ <string name="TooltipOutboxNotInInventory">
+ Tu buzón de salida de comerciante sólo puede aceptar objetos procedentes directamente de tu inventario
+ </string>
+ <string name="TooltipOutboxWorn">
+ No puedes poner artículos que llevas puestos en el buzón de salida de comerciante
+ </string>
+ <string name="TooltipOutboxCallingCard">
+ No puedes poner tarjetas de visita en tu buzón de salida de comerciante
+ </string>
+ <string name="TooltipOutboxFolderLevels">
+ La profundidad de carpetas anidadas excede de 3
+ </string>
+ <string name="TooltipOutboxTooManyFolders">
+ El número de subcarpetas de la carpeta de nivel superior excede de 20
+ </string>
+ <string name="TooltipOutboxTooManyObjects">
+ El número de elementos de la carpeta de nivel superior excede de 200
+ </string>
+ <string name="TooltipDragOntoOwnChild">
+ No puedes mover una carpeta a su carpeta secundaria
+ </string>
+ <string name="TooltipDragOntoSelf">
+ No puedes mover una carpeta dentro de sí misma
+ </string>
<string name="TooltipHttpUrl">
Pulsa para ver esta página web
</string>
@@ -426,6 +601,12 @@
<string name="symbolic folder link">
enlace de la carpeta
</string>
+ <string name="mesh">
+ red
+ </string>
+ <string name="AvatarEditingAppearance">
+ (Edición de Apariencia)
+ </string>
<string name="AvatarAway">
Ausente
</string>
@@ -724,13 +905,13 @@
Controlar su cámara
</string>
<string name="SIM_ACCESS_PG">
- &apos;PG&apos;
+ General
</string>
<string name="SIM_ACCESS_MATURE">
- &apos;Mature&apos;
+ Moderado
</string>
<string name="SIM_ACCESS_ADULT">
- &apos;Adult&apos;
+ Adulto
</string>
<string name="SIM_ACCESS_DOWN">
Desconectado
@@ -798,6 +979,9 @@
<string name="choose_the_directory">
Elegir directorio
</string>
+ <string name="script_files">
+ Scripts
+ </string>
<string name="AvatarSetNotAway">
Salir del estado ausente
</string>
@@ -855,6 +1039,9 @@
<string name="tattoo">
Tatuaje
</string>
+ <string name="physics">
+ Física
+ </string>
<string name="invalid">
inválido/a
</string>
@@ -894,6 +1081,9 @@
<string name="tattoo_not_worn">
Tatuaje no puesto
</string>
+ <string name="physics_not_worn">
+ Física no puesta
+ </string>
<string name="invalid_not_worn">
no válido/a
</string>
@@ -942,6 +1132,9 @@
<string name="create_new_tattoo">
Crear un tatuaje nuevo
</string>
+ <string name="create_new_physics">
+ Crear nueva física
+ </string>
<string name="create_new_invalid">
no válido/a
</string>
@@ -1026,6 +1219,65 @@
<string name="InventoryNoTexture">
No tienes en tu inventario una copia de esta textura
</string>
+ <string name="InventoryInboxNoItems">
+ Aquí aparecerán algunos de los objetos que recibas, como los regalos Premium. Después puedes arrastrarlos a tu inventario.
+ </string>
+ <string name="MarketplaceURL">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/
+ </string>
+ <string name="MarketplaceURL_CreateStore">
+ http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.4
+ </string>
+ <string name="MarketplaceURL_Dashboard">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard
+ </string>
+ <string name="MarketplaceURL_Imports">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports
+ </string>
+ <string name="MarketplaceURL_LearnMore">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more
+ </string>
+ <string name="InventoryOutboxNotMerchantTitle">
+ Cualquier usuario puede vender objetos en el mercado.
+ </string>
+ <string name="InventoryOutboxNotMerchantTooltip"/>
+ <string name="InventoryOutboxNotMerchant">
+ Para hacerte comerciante debes [[MARKETPLACE_CREATE_STORE_URL] crear una tienda del Mercado].
+ </string>
+ <string name="InventoryOutboxNoItemsTitle">
+ El buzón de salida está vacío.
+ </string>
+ <string name="InventoryOutboxNoItemsTooltip"/>
+ <string name="InventoryOutboxNoItems">
+ Arrastra carpetas a esta sección y pulsa en &quot;Enviar al Mercado&quot; para incluirlas en la lista de venta del [[MARKETPLACE_DASHBOARD_URL] Mercado].
+ </string>
+ <string name="Marketplace Error None">
+ Sin errores
+ </string>
+ <string name="Marketplace Error Not Merchant">
+ Error: Para poder enviar objetos al mercado, debes registrarte como comerciante (es gratis).
+ </string>
+ <string name="Marketplace Error Empty Folder">
+ Error: Esta carpeta está vacía.
+ </string>
+ <string name="Marketplace Error Unassociated Products">
+ Error: Este objeto no se pudo subir porque tu cuenta de comerciante tiene demasiados objetos que no están asociados a productos. Para corregirlo, inicia sesión en la página web del mercado y asocia más objetos.
+ </string>
+ <string name="Marketplace Error Object Limit">
+ Error: Este elemento contiene demasiados objetos. Para corregir el error, guarda objetos en cajas de forma que el total de objetos sea menor que 200.
+ </string>
+ <string name="Marketplace Error Folder Depth">
+ Error: Este objeto contiene demasiados niveles de carpetas anidadas. Reorganízalo de forma que tenga como máximo 3 niveles de carpetas anidadas.
+ </string>
+ <string name="Marketplace Error Unsellable Item">
+ Error: Este objeto no se puede vender en el mercado.
+ </string>
+ <string name="Marketplace Error Internal Import">
+ Error: Este objeto tiene un problema. Vuelve a intentarlo más tarde.
+ </string>
+ <string name="Open landmarks">
+ Abrir hitos
+ </string>
<string name="no_transfer" value="(no transferible)"/>
<string name="no_modify" value="(no modificable)"/>
<string name="no_copy" value="(no copiable)"/>
@@ -1040,7 +1292,7 @@
</string>
<string name="WornOnAttachmentPoint" value="(lo llevas en: [ATTACHMENT_POINT])"/>
<string name="ActiveGesture" value="[GESLABEL] (activo)"/>
- <string name="Chat" value="Chat :"/>
+ <string name="Chat Message" value="Chat:"/>
<string name="Sound" value="Sonido :"/>
<string name="Wait" value="--- Espera :"/>
<string name="AnimFlagStop" value="Parar la animación:"/>
@@ -1066,9 +1318,6 @@
<string name="InvFolder My Inventory">
Mi Inventario
</string>
- <string name="InvFolder My Favorites">
- Mis Favoritos
- </string>
<string name="InvFolder Library">
Biblioteca
</string>
@@ -1127,10 +1376,10 @@
Gestos
</string>
<string name="InvFolder Favorite">
- Favoritos
+ Mis Favoritos
</string>
<string name="InvFolder favorite">
- Favoritos
+ Mis Favoritos
</string>
<string name="InvFolder Current Outfit">
Vestuario actual
@@ -1144,12 +1393,21 @@
<string name="InvFolder Accessories">
Accesorios
</string>
+ <string name="InvFolder Meshes">
+ Redes
+ </string>
<string name="InvFolder Friends">
Amigos
</string>
<string name="InvFolder All">
Todas
</string>
+ <string name="no_attachments">
+ No tienes puestos anexos
+ </string>
+ <string name="Attachments remain">
+ Anexos (quedan [COUNT] ranuras)
+ </string>
<string name="Buy">
Comprar
</string>
@@ -1276,6 +1534,12 @@
<string name="Right Pec">
Pecho derecho
</string>
+ <string name="Neck">
+ Cuello
+ </string>
+ <string name="Avatar Center">
+ Centro del avatar
+ </string>
<string name="Invalid Attachment">
Punto de colocación no válido
</string>
@@ -1457,8 +1721,11 @@
<string name="Unknown">
(Desconocido)
</string>
- <string name="SummaryForTheWeek" value="Resumen de esta semana, empezando el"/>
- <string name="NextStipendDay" value="El próximo día de pago es el"/>
+ <string name="SummaryForTheWeek" value="Resumen de esta semana, empezando el "/>
+ <string name="NextStipendDay" value=". El próximo día de pago es el "/>
+ <string name="GroupPlanningDate">
+ [mthnum,datetime,utc]/[day,datetime,utc]/[year,datetime,utc]
+ </string>
<string name="GroupIndividualShare" value="Grupo Aportaciones individuales"/>
<string name="GroupColumn" value="Grupo"/>
<string name="Balance">
@@ -1485,6 +1752,9 @@
<string name="IMTeen">
teen
</string>
+ <string name="Anyone">
+ cualquiera
+ </string>
<string name="RegionInfoError">
error
</string>
@@ -1692,7 +1962,7 @@
<string name="RegionNoCovenantOtherOwner">
No se ha aportado un contrato para este estado. El terreno de este estado lo vende el propietario del estado, no Linden Lab. Por favor, contacta con ese propietario para informarte sobre la venta.
</string>
- <string name="covenant_last_modified" value="Última modificación:"/>
+ <string name="covenant_last_modified" value="Última modificación: "/>
<string name="none_text" value="(no hay)"/>
<string name="never_text" value=" (nunca)"/>
<string name="GroupOwned">
@@ -1701,6 +1971,12 @@
<string name="Public">
Público
</string>
+ <string name="LocalSettings">
+ Configuración local
+ </string>
+ <string name="RegionSettings">
+ Configuración de la región
+ </string>
<string name="ClassifiedClicksTxt">
Clics: [TELEPORT] teleportes, [MAP] mapa, [PROFILE] perfil
</string>
@@ -1740,11 +2016,8 @@
<string name="InvOfferGaveYou">
te ha dado
</string>
- <string name="InvOfferYouDecline">
- Has rehusado
- </string>
- <string name="InvOfferFrom">
- de
+ <string name="InvOfferDecline">
+ Rechazas [DESC] de &lt;nolink&gt;[NAME]&lt;/nolink&gt;.
</string>
<string name="GroupMoneyTotal">
Total
@@ -1776,6 +2049,9 @@
<string name="GroupMoneyDebits">
Débitos
</string>
+ <string name="GroupMoneyDate">
+ [weekday,datetime,utc] [mth,datetime,utc] [day,datetime,utc], [year,datetime,utc]
+ </string>
<string name="ViewerObjectContents">
Contenidos
</string>
@@ -1825,12 +2101,6 @@ Se esperaba .wav, .tga, .bmp, .jpg, .jpeg, o .bvh
<string name="accel-win-shift">
Mayús+
</string>
- <string name="Esc">
- Esc
- </string>
- <string name="Home">
- Base
- </string>
<string name="FileSaved">
Archivo guardado
</string>
@@ -1849,34 +2119,34 @@ Se esperaba .wav, .tga, .bmp, .jpg, .jpeg, o .bvh
<string name="PDT">
PDT
</string>
- <string name="Forward">
+ <string name="Direction_Forward">
Adelante
</string>
- <string name="Left">
+ <string name="Direction_Left">
Izquierda
</string>
- <string name="Right">
+ <string name="Direction_Right">
Derecha
</string>
- <string name="Back">
+ <string name="Direction_Back">
Atrás
</string>
- <string name="North">
+ <string name="Direction_North">
Norte
</string>
- <string name="South">
+ <string name="Direction_South">
Sur
</string>
- <string name="West">
+ <string name="Direction_West">
Oeste
</string>
- <string name="East">
+ <string name="Direction_East">
Este
</string>
- <string name="Up">
+ <string name="Direction_Up">
Arriba
</string>
- <string name="Down">
+ <string name="Direction_Down">
Abajo
</string>
<string name="Any Category">
@@ -1916,7 +2186,7 @@ Se esperaba .wav, .tga, .bmp, .jpg, .jpeg, o .bvh
Localización Linden
</string>
<string name="Adult">
- &apos;Adult&apos;
+ Adulto
</string>
<string name="Arts&amp;Culture">
Arte y Cultura
@@ -1948,6 +2218,9 @@ Se esperaba .wav, .tga, .bmp, .jpg, .jpeg, o .bvh
<string name="Other">
Otra
</string>
+ <string name="Rental">
+ Terreno en alquiler
+ </string>
<string name="Any">
Cualquiera
</string>
@@ -2184,6 +2457,114 @@ Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE].
<string name="Bulbous Nose">
Nariz de porra
</string>
+ <string name="Breast Physics Mass">
+ Masa del busto
+ </string>
+ <string name="Breast Physics Smoothing">
+ Suavizado del busto
+ </string>
+ <string name="Breast Physics Gravity">
+ Gravedad del busto
+ </string>
+ <string name="Breast Physics Drag">
+ Aerodinámica del busto
+ </string>
+ <string name="Breast Physics InOut Max Effect">
+ Efecto máx.
+ </string>
+ <string name="Breast Physics InOut Spring">
+ Elasticidad
+ </string>
+ <string name="Breast Physics InOut Gain">
+ Ganancia
+ </string>
+ <string name="Breast Physics InOut Damping">
+ Amortiguación
+ </string>
+ <string name="Breast Physics UpDown Max Effect">
+ Efecto máx.
+ </string>
+ <string name="Breast Physics UpDown Spring">
+ Elasticidad
+ </string>
+ <string name="Breast Physics UpDown Gain">
+ Ganancia
+ </string>
+ <string name="Breast Physics UpDown Damping">
+ Amortiguación
+ </string>
+ <string name="Breast Physics LeftRight Max Effect">
+ Efecto máx.
+ </string>
+ <string name="Breast Physics LeftRight Spring">
+ Elasticidad
+ </string>
+ <string name="Breast Physics LeftRight Gain">
+ Ganancia
+ </string>
+ <string name="Breast Physics LeftRight Damping">
+ Amortiguación
+ </string>
+ <string name="Belly Physics Mass">
+ Masa de la barriga
+ </string>
+ <string name="Belly Physics Smoothing">
+ Suavizado de la barriga
+ </string>
+ <string name="Belly Physics Gravity">
+ Gravedad de la barriga
+ </string>
+ <string name="Belly Physics Drag">
+ Aerodinámica de la barriga
+ </string>
+ <string name="Belly Physics UpDown Max Effect">
+ Efecto máx.
+ </string>
+ <string name="Belly Physics UpDown Spring">
+ Elasticidad
+ </string>
+ <string name="Belly Physics UpDown Gain">
+ Ganancia
+ </string>
+ <string name="Belly Physics UpDown Damping">
+ Amortiguación
+ </string>
+ <string name="Butt Physics Mass">
+ Masa del culo
+ </string>
+ <string name="Butt Physics Smoothing">
+ Suavizado del culo
+ </string>
+ <string name="Butt Physics Gravity">
+ Gravedad del culo
+ </string>
+ <string name="Butt Physics Drag">
+ Aerodinámica del culo
+ </string>
+ <string name="Butt Physics UpDown Max Effect">
+ Efecto máx.
+ </string>
+ <string name="Butt Physics UpDown Spring">
+ Elasticidad
+ </string>
+ <string name="Butt Physics UpDown Gain">
+ Ganancia
+ </string>
+ <string name="Butt Physics UpDown Damping">
+ Amortiguación
+ </string>
+ <string name="Butt Physics LeftRight Max Effect">
+ Efecto máx.
+ </string>
+ <string name="Butt Physics LeftRight Spring">
+ Elasticidad
+ </string>
+ <string name="Butt Physics LeftRight Gain">
+ Ganancia
+ </string>
+ <string name="Butt Physics LeftRight Damping">
+ Amortiguación
+ </string>
<string name="Bushy Eyebrows">
Cejijuntas
</string>
@@ -2193,6 +2574,9 @@ Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE].
<string name="Butt Size">
Culo: tamaño
</string>
+ <string name="Butt Gravity">
+ Gravedad del culo
+ </string>
<string name="bustle skirt">
Polisón
</string>
@@ -3375,6 +3759,9 @@ Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE].
<string name="LocationCtrlComboBtnTooltip">
Historial de mis localizaciones
</string>
+ <string name="LocationCtrlForSaleTooltip">
+ Comprar este terreno
+ </string>
<string name="LocationCtrlAdultIconTooltip">
Región Adulta
</string>
@@ -3384,6 +3771,9 @@ Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE].
<string name="LocationCtrlGeneralIconTooltip">
Región General
</string>
+ <string name="LocationCtrlSeeAVsTooltip">
+ Los avatares están visibles y está permitido el chat fuera de esta parcela
+ </string>
<string name="UpdaterWindowTitle">
Actualizar [APP_NAME]
</string>
@@ -3474,6 +3864,12 @@ Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE].
<string name="conference-title-incoming">
Conferencia con [AGENT_NAME]
</string>
+ <string name="inventory_item_offered-im">
+ Ofrecido el item del inventario
+ </string>
+ <string name="share_alert">
+ Arrastra los ítems desde el invenbtario hasta aquí
+ </string>
<string name="no_session_message">
(La sesión de MI no existe)
</string>
@@ -3546,6 +3942,9 @@ Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE].
<string name="session_initialization_timed_out_error">
Se ha agotado el tiempo del inicio de sesión
</string>
+ <string name="Home position set.">
+ Posición inicial establecida.
+ </string>
<string name="voice_morphing_url">
http://secondlife.com/landing/voicemorphing
</string>
@@ -3567,6 +3966,18 @@ Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE].
<string name="you_paid_ldollars_no_name">
Has pagado [AMOUNT] L$ por [REASON].
</string>
+ <string name="you_paid_failure_ldollars">
+ No has pagado a [NAME] [AMOUNT] L$ [REASON].
+ </string>
+ <string name="you_paid_failure_ldollars_no_info">
+ No has pagado [AMOUNT] L$.
+ </string>
+ <string name="you_paid_failure_ldollars_no_reason">
+ No has pagado a [NAME] [AMOUNT] L$.
+ </string>
+ <string name="you_paid_failure_ldollars_no_name">
+ No has pagado [AMOUNT] L$ [REASON].
+ </string>
<string name="for item">
para [ITEM]
</string>
@@ -3620,7 +4031,7 @@ Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE].
</string>
<string name="uploading_abuse_report">
Subiendo...
-
+
Denuncia de infracción
</string>
<string name="New Shape">
@@ -3668,6 +4079,9 @@ Denuncia de infracción
<string name="New Tattoo">
Tatuaje nuevo
</string>
+ <string name="New Physics">
+ Nueva física
+ </string>
<string name="Invalid Wearable">
No se puede poner
</string>
@@ -3791,6 +4205,87 @@ Denuncia de infracción
<string name="Female - Wow">
Mujer - Admiración
</string>
+ <string name="/bow">
+ /reverencia
+ </string>
+ <string name="/clap">
+ /aplaudir
+ </string>
+ <string name="/count">
+ /contar
+ </string>
+ <string name="/extinguish">
+ /apagar
+ </string>
+ <string name="/kmb">
+ /bmc
+ </string>
+ <string name="/muscle">
+ /músculo
+ </string>
+ <string name="/no">
+ /no
+ </string>
+ <string name="/no!">
+ /¡no!
+ </string>
+ <string name="/paper">
+ /papel
+ </string>
+ <string name="/pointme">
+ /señalarme
+ </string>
+ <string name="/pointyou">
+ /señalarte
+ </string>
+ <string name="/rock">
+ /piedra
+ </string>
+ <string name="/scissor">
+ /tijera
+ </string>
+ <string name="/smoke">
+ /fumar
+ </string>
+ <string name="/stretch">
+ /estirar
+ </string>
+ <string name="/whistle">
+ /silbar
+ </string>
+ <string name="/yes">
+ /sí
+ </string>
+ <string name="/yes!">
+ /¡sí!
+ </string>
+ <string name="afk">
+ ausente
+ </string>
+ <string name="dance1">
+ baile1
+ </string>
+ <string name="dance2">
+ baile2
+ </string>
+ <string name="dance3">
+ baile3
+ </string>
+ <string name="dance4">
+ baile4
+ </string>
+ <string name="dance5">
+ baile5
+ </string>
+ <string name="dance6">
+ baile6
+ </string>
+ <string name="dance7">
+ baile7
+ </string>
+ <string name="dance8">
+ baile8
+ </string>
<string name="AvatarBirthDateFormat">
[day,datetime,slt]/[mthnum,datetime,slt]/[year,datetime,slt]
</string>
@@ -3804,7 +4299,7 @@ Denuncia de infracción
<string name="server_is_down">
Parece que hay algún problema que ha escapado a nuestros controles.
- Visita status.secondlifegrid.net para ver si hay alguna incidencia conocida que esté afectando al servicio.
+ Visita status.secondlifegrid.net para ver si hay alguna incidencia conocida que esté afectando al servicio.
Si sigues teniendo problemas, comprueba la configuración de la red y del servidor de seguridad.
</string>
<string name="dateTimeWeekdaysNames">
@@ -3867,7 +4362,7 @@ Denuncia de infracción
<string name="Notices">
Avisos
</string>
- <string name="Chat">
+ <string name="Chat" value="Chat :">
Chat
</string>
<string name="DeleteItems">
@@ -3879,4 +4374,552 @@ Denuncia de infracción
<string name="EmptyOutfitText">
No hay elementos en este vestuario
</string>
+ <string name="ExternalEditorNotSet">
+ Selecciona un editor mediante la configuración de ExternalEditor.
+ </string>
+ <string name="ExternalEditorNotFound">
+ No se encuentra el editor externo especificado.
+Inténtalo incluyendo la ruta de acceso al editor entre comillas
+(por ejemplo, &quot;/ruta a mi/editor&quot; &quot;%s&quot;).
+ </string>
+ <string name="ExternalEditorCommandParseError">
+ Error al analizar el comando de editor externo.
+ </string>
+ <string name="ExternalEditorFailedToRun">
+ Error al ejecutar el editor externo.
+ </string>
+ <string name="TranslationFailed">
+ Error al traducir: [REASON]
+ </string>
+ <string name="TranslationResponseParseError">
+ Error al analizar la respuesta de la traducción.
+ </string>
+ <string name="Esc">
+ Esc
+ </string>
+ <string name="Space">
+ Space
+ </string>
+ <string name="Enter">
+ Enter
+ </string>
+ <string name="Tab">
+ Tab
+ </string>
+ <string name="Ins">
+ Ins
+ </string>
+ <string name="Del">
+ Del
+ </string>
+ <string name="Backsp">
+ Backsp
+ </string>
+ <string name="Shift">
+ Shift
+ </string>
+ <string name="Ctrl">
+ Ctrl
+ </string>
+ <string name="Alt">
+ Alt
+ </string>
+ <string name="CapsLock">
+ CapsLock
+ </string>
+ <string name="Home">
+ Base
+ </string>
+ <string name="End">
+ End
+ </string>
+ <string name="PgUp">
+ PgUp
+ </string>
+ <string name="PgDn">
+ PgDn
+ </string>
+ <string name="F1">
+ F1
+ </string>
+ <string name="F2">
+ F2
+ </string>
+ <string name="F3">
+ F3
+ </string>
+ <string name="F4">
+ F4
+ </string>
+ <string name="F5">
+ F5
+ </string>
+ <string name="F6">
+ F6
+ </string>
+ <string name="F7">
+ F7
+ </string>
+ <string name="F8">
+ F8
+ </string>
+ <string name="F9">
+ F9
+ </string>
+ <string name="F10">
+ F10
+ </string>
+ <string name="F11">
+ F11
+ </string>
+ <string name="F12">
+ F12
+ </string>
+ <string name="Add">
+ Añadir
+ </string>
+ <string name="Subtract">
+ Restar
+ </string>
+ <string name="Multiply">
+ Multiplicar
+ </string>
+ <string name="Divide">
+ Dividir
+ </string>
+ <string name="PAD_DIVIDE">
+ PAD_DIVIDE
+ </string>
+ <string name="PAD_LEFT">
+ PAD_LEFT
+ </string>
+ <string name="PAD_RIGHT">
+ PAD_RIGHT
+ </string>
+ <string name="PAD_DOWN">
+ PAD_DOWN
+ </string>
+ <string name="PAD_UP">
+ PAD_UP
+ </string>
+ <string name="PAD_HOME">
+ PAD_HOME
+ </string>
+ <string name="PAD_END">
+ PAD_END
+ </string>
+ <string name="PAD_PGUP">
+ PAD_PGUP
+ </string>
+ <string name="PAD_PGDN">
+ PAD_PGDN
+ </string>
+ <string name="PAD_CENTER">
+ PAD_CENTER
+ </string>
+ <string name="PAD_INS">
+ PAD_INS
+ </string>
+ <string name="PAD_DEL">
+ PAD_DEL
+ </string>
+ <string name="PAD_Enter">
+ PAD_Enter
+ </string>
+ <string name="PAD_BUTTON0">
+ PAD_BUTTON0
+ </string>
+ <string name="PAD_BUTTON1">
+ PAD_BUTTON1
+ </string>
+ <string name="PAD_BUTTON2">
+ PAD_BUTTON2
+ </string>
+ <string name="PAD_BUTTON3">
+ PAD_BUTTON3
+ </string>
+ <string name="PAD_BUTTON4">
+ PAD_BUTTON4
+ </string>
+ <string name="PAD_BUTTON5">
+ PAD_BUTTON5
+ </string>
+ <string name="PAD_BUTTON6">
+ PAD_BUTTON6
+ </string>
+ <string name="PAD_BUTTON7">
+ PAD_BUTTON7
+ </string>
+ <string name="PAD_BUTTON8">
+ PAD_BUTTON8
+ </string>
+ <string name="PAD_BUTTON9">
+ PAD_BUTTON9
+ </string>
+ <string name="PAD_BUTTON10">
+ PAD_BUTTON10
+ </string>
+ <string name="PAD_BUTTON11">
+ PAD_BUTTON11
+ </string>
+ <string name="PAD_BUTTON12">
+ PAD_BUTTON12
+ </string>
+ <string name="PAD_BUTTON13">
+ PAD_BUTTON13
+ </string>
+ <string name="PAD_BUTTON14">
+ PAD_BUTTON14
+ </string>
+ <string name="PAD_BUTTON15">
+ PAD_BUTTON15
+ </string>
+ <string name="-">
+ -
+ </string>
+ <string name="=">
+ =
+ </string>
+ <string name="`">
+ `
+ </string>
+ <string name=";">
+ ;
+ </string>
+ <string name="[">
+ [
+ </string>
+ <string name="]">
+ ]
+ </string>
+ <string name="\">
+ \
+ </string>
+ <string name="0">
+ 0
+ </string>
+ <string name="1">
+ 1
+ </string>
+ <string name="2">
+ 2
+ </string>
+ <string name="3">
+ 3
+ </string>
+ <string name="4">
+ 4
+ </string>
+ <string name="5">
+ 5
+ </string>
+ <string name="6">
+ 6
+ </string>
+ <string name="7">
+ 7
+ </string>
+ <string name="8">
+ 8
+ </string>
+ <string name="9">
+ 9
+ </string>
+ <string name="A">
+ A
+ </string>
+ <string name="B">
+ B
+ </string>
+ <string name="C">
+ C
+ </string>
+ <string name="D">
+ D
+ </string>
+ <string name="E">
+ E
+ </string>
+ <string name="F">
+ F
+ </string>
+ <string name="G">
+ G
+ </string>
+ <string name="H">
+ H
+ </string>
+ <string name="I">
+ I
+ </string>
+ <string name="J">
+ J
+ </string>
+ <string name="K">
+ K
+ </string>
+ <string name="L">
+ L
+ </string>
+ <string name="M">
+ M
+ </string>
+ <string name="N">
+ N
+ </string>
+ <string name="O">
+ O
+ </string>
+ <string name="P">
+ P
+ </string>
+ <string name="Q">
+ Q
+ </string>
+ <string name="R">
+ R
+ </string>
+ <string name="S">
+ S
+ </string>
+ <string name="T">
+ T
+ </string>
+ <string name="U">
+ U
+ </string>
+ <string name="V">
+ V
+ </string>
+ <string name="W">
+ W
+ </string>
+ <string name="X">
+ X
+ </string>
+ <string name="Y">
+ Y
+ </string>
+ <string name="Z">
+ Z
+ </string>
+ <string name="BeaconParticle">
+ Viendo balizas de partículas (azules)
+ </string>
+ <string name="BeaconPhysical">
+ Viendo balizas de objetos materiales (verdes)
+ </string>
+ <string name="BeaconScripted">
+ Viendo balizas de objetos con script (rojas)
+ </string>
+ <string name="BeaconScriptedTouch">
+ Viendo el objeto con script con balizas de función táctil (rojas)
+ </string>
+ <string name="BeaconSound">
+ Viendo balizas de sonido (amarillas)
+ </string>
+ <string name="BeaconMedia">
+ Viendo balizas de medios (blancas)
+ </string>
+ <string name="ParticleHiding">
+ Ocultando las partículas
+ </string>
+ <string name="Command_AboutLand_Label">
+ Acerca del terreno
+ </string>
+ <string name="Command_Appearance_Label">
+ Apariencia
+ </string>
+ <string name="Command_Avatar_Label">
+ Avatar
+ </string>
+ <string name="Command_Build_Label">
+ Construir
+ </string>
+ <string name="Command_Chat_Label">
+ Chat
+ </string>
+ <string name="Command_Compass_Label">
+ Brújula
+ </string>
+ <string name="Command_Destinations_Label">
+ Destinos
+ </string>
+ <string name="Command_Gestures_Label">
+ Gestos
+ </string>
+ <string name="Command_HowTo_Label">
+ Cómo
+ </string>
+ <string name="Command_Inventory_Label">
+ Inventario
+ </string>
+ <string name="Command_Map_Label">
+ Mapa
+ </string>
+ <string name="Command_Marketplace_Label">
+ Mercado
+ </string>
+ <string name="Command_MiniMap_Label">
+ Minimapa
+ </string>
+ <string name="Command_Move_Label">
+ Caminar / Correr / Volar
+ </string>
+ <string name="Command_Outbox_Label">
+ Buzón de salida de comerciante
+ </string>
+ <string name="Command_People_Label">
+ Gente
+ </string>
+ <string name="Command_Picks_Label">
+ Destacados
+ </string>
+ <string name="Command_Places_Label">
+ Lugares
+ </string>
+ <string name="Command_Preferences_Label">
+ Preferencias
+ </string>
+ <string name="Command_Profile_Label">
+ Perfil
+ </string>
+ <string name="Command_Search_Label">
+ Buscar
+ </string>
+ <string name="Command_Snapshot_Label">
+ Foto
+ </string>
+ <string name="Command_Speak_Label">
+ Hablar
+ </string>
+ <string name="Command_View_Label">
+ Controles de la cámara
+ </string>
+ <string name="Command_Voice_Label">
+ Configuración de voz
+ </string>
+ <string name="Command_AboutLand_Tooltip">
+ Información sobre el terreno que vas a visitar
+ </string>
+ <string name="Command_Appearance_Tooltip">
+ Cambiar tu avatar
+ </string>
+ <string name="Command_Avatar_Tooltip">
+ Elegir un avatar completo
+ </string>
+ <string name="Command_Build_Tooltip">
+ Construir objetos y modificar la forma del terreno
+ </string>
+ <string name="Command_Chat_Tooltip">
+ Habla por chat de texto con las personas próximas
+ </string>
+ <string name="Command_Compass_Tooltip">
+ Brújula
+ </string>
+ <string name="Command_Destinations_Tooltip">
+ Destinos de interés
+ </string>
+ <string name="Command_Gestures_Tooltip">
+ Gestos para tu avatar
+ </string>
+ <string name="Command_HowTo_Tooltip">
+ Cómo hacer las tareas habituales
+ </string>
+ <string name="Command_Inventory_Tooltip">
+ Ver y usar tus pertenencias
+ </string>
+ <string name="Command_Map_Tooltip">
+ Mapa del mundo
+ </string>
+ <string name="Command_Marketplace_Tooltip">
+ Ir de compras
+ </string>
+ <string name="Command_MiniMap_Tooltip">
+ Mostrar la gente que está cerca
+ </string>
+ <string name="Command_Move_Tooltip">
+ Desplazando el avatar
+ </string>
+ <string name="Command_Outbox_Tooltip">
+ Transfiere objetos a tu mercado para venderlos
+ </string>
+ <string name="Command_People_Tooltip">
+ Amigos, grupos y personas próximas
+ </string>
+ <string name="Command_Picks_Tooltip">
+ Lugares que se mostrarán como favoritos en tu perfil
+ </string>
+ <string name="Command_Places_Tooltip">
+ Lugares que has guardado
+ </string>
+ <string name="Command_Preferences_Tooltip">
+ Preferencias
+ </string>
+ <string name="Command_Profile_Tooltip">
+ Consulta o edita tu perfil
+ </string>
+ <string name="Command_Search_Tooltip">
+ Buscar lugares, eventos y personas
+ </string>
+ <string name="Command_Snapshot_Tooltip">
+ Tomar una fotografía
+ </string>
+ <string name="Command_Speak_Tooltip">
+ Utiliza el micrófono para hablar con las personas próximas
+ </string>
+ <string name="Command_View_Tooltip">
+ Cambiando el ángulo de la cámara
+ </string>
+ <string name="Command_Voice_Tooltip">
+ Controles de volumen para las llamadas y la gente que se encuentre cerca de ti en el mundo virtual
+ </string>
+ <string name="Toolbar_Bottom_Tooltip">
+ actualmente en tu barra de herramientas inferior
+ </string>
+ <string name="Toolbar_Left_Tooltip">
+ actualmente en tu barra de herramientas izquierda
+ </string>
+ <string name="Toolbar_Right_Tooltip">
+ actualmente en tu barra de herramientas derecha
+ </string>
+ <string name="Retain%">
+ % retención
+ </string>
+ <string name="Detail">
+ Detalle
+ </string>
+ <string name="Better Detail">
+ Mejor detalle
+ </string>
+ <string name="Surface">
+ Superficie
+ </string>
+ <string name="Solid">
+ Sólido
+ </string>
+ <string name="Wrap">
+ Envoltura
+ </string>
+ <string name="Preview">
+ Vista previa
+ </string>
+ <string name="Normal">
+ Normal
+ </string>
+ <string name="snapshot_quality_very_low">
+ Muy bajo
+ </string>
+ <string name="snapshot_quality_low">
+ Bajo
+ </string>
+ <string name="snapshot_quality_medium">
+ Medio
+ </string>
+ <string name="snapshot_quality_high">
+ Alto
+ </string>
+ <string name="snapshot_quality_very_high">
+ Muy alto
+ </string>
</strings>
diff --git a/indra/newview/skins/default/xui/es/teleport_strings.xml b/indra/newview/skins/default/xui/es/teleport_strings.xml
index e0e0061729..a23d9c43d0 100644
--- a/indra/newview/skins/default/xui/es/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/es/teleport_strings.xml
@@ -19,6 +19,10 @@ Si sigues recibiendo este mensaje, por favor, acude al [SUPPORT_SITE].
Lo sentimos, pero el sistema no ha podido completar el teleporte.
Vuelva a intentarlo en un momento.
</message>
+ <message name="NoHelpIslandTP">
+ No te puedes volver a teleportar a la isla de bienvenida.
+Para repetir el tutorial, visita la isla de bienvenida pública.
+ </message>
<message name="noaccess_tport">
Lo sentimos, pero no tienes acceso al destino de este teleporte.
</message>
diff --git a/indra/newview/skins/default/xui/fr/floater_about.xml b/indra/newview/skins/default/xui/fr/floater_about.xml
index f963a40cd3..4409949584 100644
--- a/indra/newview/skins/default/xui/fr/floater_about.xml
+++ b/indra/newview/skins/default/xui/fr/floater_about.xml
@@ -8,9 +8,9 @@
Compilé avec [COMPILER] version [COMPILER_VERSION]
</floater.string>
<floater.string name="AboutPosition">
- Vous êtes à [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] dans [REGION] se trouvant à &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ([HOSTIP])
+ Vous êtes à [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] dans [REGION], se trouvant à &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ([HOSTIP])
[SERVER_VERSION]
-[[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]]
+[SERVER_RELEASE_NOTES_URL]
</floater.string>
<floater.string name="AboutSystem">
CPU : [CPU]
@@ -37,46 +37,64 @@ Version serveur vocal : [VOICE_VERSION]
<floater.string name="AboutTraffic">
Paquets perdus : [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
</floater.string>
+ <floater.string name="ErrorFetchingServerReleaseNotesURL">
+ Erreur lors de la récupération de l&apos;URL des notes de version du serveur.
+ </floater.string>
<tab_container name="about_tab">
<panel label="Infos" name="support_panel">
<button label="Copier dans le presse-papiers" name="copy_btn"/>
</panel>
<panel label="Remerciements" name="credits_panel">
- <text_editor name="credits_editor">
- Second Life existe grâce aux efforts de Philip, Tessa, Andrew, Cory, Ian, James, Phoenix, Ryan, Haney, Dan, Char, Ben, John, Tanya, Eddie, Richard, Mitch, Doug, Eric, Frank, Bruce, Aaron, Peter, Alice, Charlie, Debra, Eileen, Helen, Janet, Steffan, Steve, Tom, Mark, Hunter, Xenon, Burgess, Bill, Jim, Lee, Hamlet, Daniel, Jeff, Todd, Sarah, Tim, Stephanie, Colin, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Jack, Vektor, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Jesse, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Yuko, Makiko, Thomas, Harry, Seth, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Brad, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, Beez, Milo, Hermia, Red, Thrax, Gulliver, Joe, Sally, Paul, Jose, Rejean, Dore, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, Dustin, George, Del, Matthew, Cat, Jacqui, Adrian, Viola, Alfred, Noel, Irfan, Yool, Rika, Jane, Frontier, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Jeremy, JP, Jake, Anthony, Maurice, Madhavi, Leopard, Kyle, Joon, Bert, Belinda, Jon, Kristi, Bridie, Pramod, Socrates, Maria, Aric, Adreanne, Jay, Kari, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Colossus, Zen, BigPapi, Pastrami, Kurz, Mani, Neuro, Mel, Sardonyx, MJ, Rowan, Sgt, Elvis, Samuel, Leo, Bryan, Niko, Austin, Soft, Poppy, Rachel, Aki, Banzai, Alexa, Sue, Bender, CG, Angelo, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Rothman, Niall, Marin, Allison, Katie, Dawn, Dusty, Katt, Judy, Andrea, Ambroff, Infinity, Rico, Gail, Kalpana, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Maestro, Simone, Yang, T, Shannon, Nelson, Khanh, Scott, Courtney, Charlene, Quixote, Susan, Zed, Amanda, Katelin, Enkidu, Roxie, Esbee, JoRoan, Scarlet, Tay, Kevin, Wolfgang, Johnny, Ray, Andren, Merov, Bob, Rand, Howard, Callen, Heff, Galen, Newell, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl, Ashley, JessieAnn, Huseby, Karina, Paris, Kurt, Rick, Lis, Kotler, Theeba, Lynx, Murphy, Doten, Taka, Norm, Jillian, Marcus, Mae, Novack, Esther, Perry, Dana, Ducot, Javier, Porter, Madison, Gecko, Dough, JR, Gisele, Crimp, Norie, Arch, Kimi, Fisher, Barbara, Jason, Peggy, Bernard, Jules, Leroy, Eva, Khederian, Campbell, Vogt, Masido, Karel, Torres, Lo, Breezer, Delby, Rountree, Anna, Servus, Rue, Itiaes, Chuck, Luna, Novella, Zaza, Wen, Gino, Lex, Cassandra, Limey, Nancy, Anukul, Silver, Brodesky, Jinsai, Squid, Gez, Rakesh, Ladan, Edelman, Marcet, Squire, Tatem, Tony, Jerm, Tia, Falcon, BK, Tiggs, Driscoll, Bacon, Timothee, Cru, Carmilla, Coyot, Webb, Kazu, Rudas, LJ, Sea, Ali Wallace, Bewest, Pup, Drub, Dragon, Inoshiro, Byron, Rhett, Xandix, Aimee, Fredrik, Thor, Teddy, Baron, Nelly, Ghengis, Epic, Eli, Stone, Grapes, Irie, Prep, Scobu, Valerie, Alain et bien d&apos;autres.
-
-Tous nos remerciements aux résidents suivants pour avoir testé cette version (la meilleure qui soit jusqu&apos;à présent) : Drew Dwi, Zai Lynch, Latif Khalifa, Ellla McMahon, Harleen Gretzky, Squirrel Wood, Malarthi Behemoth, Dante Tucker, Buckaroo Mu, Eddi Decosta, Dirk, Talamasca, Torben Trautman, Irene Muni, Aralara Rajal, Aura Dirval, Cayu Cluny, Eva Rau, FreeSL Aeon, Frontera Thor, Inma Rau, Lunita Savira, Minerva Memel, Polo Gufler, Xiki Luik, Lilly Zenovka, Vick Forcella, Sasy Scarborough, Gentle Welinder, Elric Anatine, Techwolf Lupindo, Dusan Writer, WolfPup Lowenhar, Marianne McCann, Fiachra Lach, Sitearm Madonna, Sudane Erato, Sahkolihaa Contepomi, Sachi Vixen, Questar Utu, Dimitrio Lewis, Matto Destiny, Scrim Pinion, Radio Signals, Psi Merlin, Pixel Gausman, Mel Vanbeeck, Laurent Bechir, Lamorna Proctor, Lares Carter, Gwyneth Llewelyn, Hydra Shaftoe, Holger Gilruth, Gentle Heron, Carla Broek, Boroondas Gupte, Fury Rosewood, Flower Ducatillon, Colpo Wexler, gwampa Lomu, Borg Capalini, Beansy Twine, Ardy Lay, , 45ms Zhong, Adeon Writer, Aeonix Aeon, Ai Austin, Aiko Ying, Alexandrea Fride, Alliez Mysterio, Annie Milestone, Annika Genezzia, Ansariel Hiller, ArminasX Saiman, Arya Braveheart, Asaeda Meltingdots, Asturkon Jua, Avallyn Oakleaf, Avatar Quinzet, BabyA Littlething, Bacchus Ireto, Bazaar, Riva, Benjamin Bigdipper, Beth Walcher, Bezilon Kasei, Biancaluce Robbiani, Bill Walach, blakopal Galicia, Blitzckreed Levenque, Bryn Oh, Callipygian Christensen, Cap Carver, Carr Arbenlow, Chantal Harvey, Charles Courtois, Charlie Sazaland, Cherry Cheevers, ChickyBabes Zuzu, Christopher Organiser, Ciaran Laval, Clara Young, Celierra Darling, Corinne Helendale, Corro Moseley, Coughdrop Littlething, Darien Caldwell, Dartagan Shepherd, Debs Regent, Decro Schmooz, Denim Kamachi, DiJodi Dubratt, Dil Spitz, Edgware Marker, Egehan Dryke, Emma Portilo, Emmie Fairymeadow, Evangelista Emerald, Faelon Swordthain, Frenchimmo Sabra, Gaberoonie Zanzibar, Ganymedes Costagravas, Gene Frostbite, GeneJ Composer, Giggles Littlebird, Grady Echegaray, Guni Greenstein, Gypsy Tripsa, Hackshaven Harford, Ham Rambler, Han Shuffle, Hanglow Short, Hatzfeld Runo, herina Bode, Horatio Freund, Hypatia Callisto, Hypatia Pickens, Identity Euler, Imnotgoing Sideways, Innula Zenovka, Iyoba Tarantal, Jack Abraham, Jagga Meredith, Jennifer Boyle, Jeremy Marquez, Jessica Qin, Jinx Nordberg, Jo Bernandes, Jocial Sonnenkern, Joel Savard, Jondan Lundquist, Josef Munster, Josette Windlow, Juilan Tripsa, Juro Kothari, Justin RiversRunRed, Kagehi Kohn, Kaimen Takahe, Keklily Longfall, Ken Lavender, Kestral Karas, Khisme Nitely, Kimar Coba, Kithrak Kirkorian, Kitty Barnett, Kolor Fall, Komiko Okamoto, Korvel Noh, Larry Pixel, Leal Choche, len Starship, Lenae Munz, Lexi Frua, Lillie Cordeaux, Lizzy Macarthur, LSL Scientist, Luban Yiyuan, Luc Starsider, Maccus McCullough, Madison Blanc, Maggie Darwin, Mallory Destiny, Manx Wharton, Marc Claridge, Marc2 Sands, Matthew Anthony, Maxim RiversRunRed, Medhue Simoni, Melinda Latynina, Mencius Watts, Michi Lumin, Midian Farspire, Miles Glaz, Mindy Mathy, Mitch Wagner, Mo Hax, Mourna Biziou, Nao Noe, naofan Teardrop, Naomah Beaumont, Nathiel Siamendes, Nber Medici, Neko Link, Netpat Igaly, Neutron Chesnokov, Newfie Pendragon, Nicholai Laviscu, Nick Rhodes, Nicoladie Gymnast, Ollie Kubrick, Orenj Marat, Orion Delphis, Oryx Tempel, Parvati Silverweb, PeterPunk Mooney, Pixel Scientist, Pounce Teazle, Professor Noarlunga, Quantum Destiny, Quicksilver Hermes, Ralf Setsuko, RAT Quan, RedMokum Bravin, Revolution Perenti, Rezit Sideways, Rich Grainger, Rosco Teardrop, Rose Evans, Rudee Voom, RufusTT Horsefly, Saii Hallard, SaintLEOlions Zimer, Samm Larkham, Satanello Miami, SexySteven Morrisey, Sheet Spotter, Shnurui Troughton, sicarius Thorne, Sicarius Toxx, Sini Nubalo, SLB Wirefly, snowy Sidran, Soupa Segura, ST Mensing, Starshine Halasy, Stickman Ingmann, Synystyr Texan, Takeda Terrawyng, Tali Rosca, Templar Merlin, Tezcatlipoca Bisiani, Tiel Stonecutter, Tony Kembia, TouchaHoney Perhaps, Trey Reanimator, TriloByte Zanzibar, Trinity Dechou, Trinity Dejavu, Unlikely Quintessa, UsikuFarasi Kanarik, Veritas Raymaker, Vex Streeter, Viaticus Speculaas, Villain Baroque, Vixie Durant, Void Singer, Watty Berkson, Westley Schridde, Westley Streeter, Whimsy Winx, Winter Ventura, Wundur Primbee, xstorm Radek, YongYong Francois, Zak Westminster, Zana Kohime, Zaren Alexander, Zeja Pyle, ZenMondo Wormser, Zoex Flanagan et bien d&apos;autres.
-
-
-
-
-« Le travail continue, la cause demeure, l&apos;espoir vit encore et le rêve ne mourra jamais » - Edward Kennedy
+ <text name="linden_intro">
+ Second Life vous est proposé par les Linden :
+ </text>
+ <text_editor name="linden_names">
+ Philip, Andrew, Doug, Richard, Phoenix, Ian, Mark, Robin, Dan, Char, Ryan, Eric, Jim, Lee, Jeff, Michael, Kelly, Steve, Catherine, Bub, Ramzi, Jill, Jeska, Don, Kona, Callum, Charity, Jack, Shawn, babbage, James, Lauren, Blue, Brent, Reuben, Pathfinder, Jesse, Patsy, Torley, Bo, Cyn, Jonathan, Gia, Annette, Ginsu, Harry, Lex, Runitai, Guy, Cornelius, Beth, Swiss, Thumper, Wendy, Teeple, Seth, Dee, Mia, Sally, Liana, Aura, Beez, Milo, Red, Gulliver, Marius, Joe, Jose, Dore, Justin, Nora, Morpheus, Lexie, Amber, Chris, Xan, Leyla, Walker, Sabin, Joshua, Hiromi, Tofu, Fritz, June, Jean, Ivy, Dez, Ken, Betsy, Which, Spike, Rob, Zee, Dustin, George, Claudia, del, Matthew, jane, jay, Adrian, Yool, Rika, Yoz, siobhan, Qarl, Benjamin, Beast, Everett, madhavi, Christopher, Izzy, stephany, Jeremy, sean, adreanne, Pramod, Tobin, sejong, Iridium, maurice, kj, Meta, kari, JP, bert, kyle, Jon, Socrates, Bridie, Ivan, maria, Aric, Coco, Periapse, sandy, Storrs, Lotte, Colossus, Brad, Pastrami, Zen, BigPapi, Banzai, Sardonyx, Mani, Garry, Jaime, Neuro, Samuel, Niko, CeeLo, Austin, Soft, Poppy, emma, tessa, angelo, kurz, alexa, Sue, CG, Blake, Erica, Brett, Bevis, kristen, Q, simon, Enus, MJ, laurap, Kip, Scouse, Ron, Ram, kend, Marty, Prospero, melissa, kraft, Nat, Seraph, Hamilton, Lordan, Green, miz, Ashlei, Trinity, Ekim, Echo, Charlie, Rowan, Rome, Jt, Doris, benoc, Christy, Bao, Kate, Tj, Patch, Cheah, Johan, Brandy, Angela, Oreh, Cogsworth, Lan, Mitchell, Space, Bambers, Einstein, Bender, Malbers, Matias, Maggie, Rothman, Milton, Niall, Marin, Allison, Mango, Andrea, Katt, Yi, Ambroff, Rico, Raymond, Gail, Christa, William, Dawn, Usi, Dynamike, M, Corr, Dante, Molly, kaylee, Danica, Kelv, Lil, jacob, Nya, Rodney, elsie, Blondin, Grant, Nyx, Devin, Monty, Minerva, Keira, Katie, Jenn, Makai, Clare, Joy, Cody, Gayathri, FJ, spider, Oskar, Landon, Jarv, Noelle, Al, Doc, Gray, Vir, t, Maestro, Simone, Shannon, yang, Courtney, Scott, charlene, Quixote, Susan, Zed, Amanda, Katelin, Esbee, JoRoan, Enkidu, roxie, Scarlet, Merov, Kevin, Judy, Rand, Newell, Les, Dessie, Galen, Michon, Geo, Siz, Calyle, Pete, Praveen, Callen, Sheldon, Pink, Nelson, jenelle, Terrence, Nathan, Juan, Sascha, Huseby, Karina, Kaye, Kotler, Lis, Darv, Charrell, Dakota, Kimmora, Theeba, Taka, Mae, Perry, Ducot, dana, Esther, Dough, gisele, Doten, Viale, Fisher, jessieann, ashley, Torres, delby, rountree, kurt, Slaton, Madison, Rue, Gino, Wen, Casssandra, Brodesky, Squid, Gez, Rakesh, Gecko, Ladan, Tony, Tatem, Squire, Falcon, BK, Crimp, Tiggs, Bacon, Coyot, Carmilla, Webb, Sea, Arch, Jillian, Jason, Bernard, Vogt, Peggy, dragon, Pup, xandix, Wallace, Bewest, Inoshiro, Rhett, AG, Aimee, Ghengis, Itiaes, Eli, Steffan, Epic, Grapes, Stone, Prep, Scobu, Robert, Alain, Carla, Vicky, Tia, Alec, Taras, Lisa, Oz, Ariane, Log, House, Kazu, Kim, Drofnas, Tyler, Campbell, Michele, Madeline, Nelly, Baron, Thor, Lori, Hele, Fredrik, Teddy, Pixie, Berry, Gabrielle, Alfonso, Brooke, Wolf, Ringo, Cru, Charlar, Rodvik, Gibson, Elise, Bagman, Greger, Leonidas, Jerm, Leslie, CB, Brenda, Durian, Carlo, mm, Zeeshan, Caleb, Max, Elikak, Mercille, Steph, Chase
+ </text_editor>
+ <text name="contrib_intro">
+ Contributions Open Source :
+ </text>
+ <text_editor name="contrib_names">
+ Dummy Name remplacé au moment de l&apos;exécution
+ </text_editor>
+ <text name="trans_intro">
+ Participation aux traductions :
+ </text>
+ <text_editor name="trans_names">
+ Dummy Name remplacé au moment de l&apos;exécution
</text_editor>
</panel>
<panel label="Licences" name="licenses_panel">
<text_editor name="credits_editor">
3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion
- APR Copyright (C) 2000-2004 The Apache Software Foundation
- cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)
- expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.
- FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org).
- GL Copyright (C) 1999-2004 Brian Paul.
- Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.
- jpeg2000 Copyright (C) 2001, David Taubman, The University of New South
- Wales (UNSW)
- jpeglib Copyright (C) 1991-1998, Thomas G. Lane.
- ogg/vorbis Copyright (C) 2001, Xiphophorus
- OpenSSL Copyright (C) 1998-2002 The OpenSSL Project.
- SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
- SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
- xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
- zlib Copyright (C) 1995-2002 Jean-loup Gailly et Mark Adler.
- google-perftools Copyright (c) 2005, Google Inc.
-
- Tous droits réservés. Voir licenses.txt pour plus de détails.
+ APR Copyright (C) 2000-2004 The Apache Software Foundation
+ Collada DOM Copyright 2005 Sony Computer Entertainment Inc.
+ cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)
+ DBus/dbus-glib Copyright (C) 2002, 2003 CodeFactory AB / Copyright (C) 2003, 2004 Red Hat, Inc.
+ expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.
+ FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org).
+ GL Copyright (C) 1999-2004 Brian Paul.
+ GLOD Copyright (C) 2003-04 Jonathan Cohen, Nat Duca, Chris Niski, Johns Hopkins University et David Luebke, Brenden Schubert, University of Virginia.
+ google-perftools Copyright (c) 2005, Google Inc.
+ Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.
+ jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)
+ jpeglib Copyright (C) 1991-1998, Thomas G. Lane.
+ ogg/vorbis Copyright (C) 2001, Xiphophorus
+ OpenSSL Copyright (C) 1998-2002 The OpenSSL Project.
+ PCRE Copyright (c) 1997-2008 University of Cambridge
+ SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
+ SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+ xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
+ zlib Copyright (C) 1995-2002 Jean-loup Gailly et Mark Adler.
+ google-perftools Copyright (c) 2005, Google Inc.
+
+ Le client Second Life utilise Havok (TM) Physics. (c)Copyright 1999-2010 Havok.com Inc. (et ses concédants de licence). Tous droits réservés. Pour plus de détails, consultez le site Web www.havok.com.
+
+ Ce logiciel contient du code source fourni par NVIDIA Corporation.
+
+ Tous droits réservés. Voir licenses.txt pour plus d&apos;informations.
- Codage Audio du chat vocal : Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1
- Annex C)
+ Codage audio du chat vocal : Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
</text_editor>
</panel>
</tab_container>
diff --git a/indra/newview/skins/default/xui/fr/floater_about_land.xml b/indra/newview/skins/default/xui/fr/floater_about_land.xml
index b0ef1cf8df..6f8885487a 100644
--- a/indra/newview/skins/default/xui/fr/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/fr/floater_about_land.xml
@@ -88,15 +88,9 @@
<text name="Owner:">
Propriétaire :
</text>
- <text name="OwnerText">
- Leyla Linden
- </text>
<text name="Group:">
Groupe :
</text>
- <text name="GroupText">
- Leyla Linden
- </text>
<button label="Choisir" label_selected="Définir..." name="Set..."/>
<check_box label="Autoriser la cession au groupe" name="check deed" tool_tip="Un officier du groupe peut céder ce terrain à ce groupe, afin qu&apos;il soit pris en charge par l&apos;allocation de terrains du groupe."/>
<button label="Céder" label_selected="Céder..." name="Deed..." tool_tip="Vous ne pouvez céder le terrain que si vous avez un rôle d&apos;officier dans le groupe sélectionné."/>
@@ -138,15 +132,15 @@
Trafic :
</text>
<text name="DwellText">
- 0
+ Chargement...
</text>
<button label="Acheter du terrain" label_selected="Acheter le terrain..." left_delta="60" name="Buy Land..." width="125"/>
+ <button label="Vente Linden" label_selected="Vente Linden..." name="Linden Sale..." tool_tip="Le terrain doit être la propriété d&apos;un résident, avoir un contenu défini et ne pas être aux enchères."/>
<button label="Infos sur les scripts" name="Scripts..." width="110"/>
<button label="Acheter pour le groupe" label_selected="Acheter pour le groupe..." name="Buy For Group..."/>
<button label="Acheter un pass" label_selected="Acheter un pass..." left_delta="-127" name="Buy Pass..." tool_tip="Un pass vous donne un accès temporaire à ce terrain." width="125"/>
<button label="Abandonner le terrain" label_selected="Abandonner le terrain..." name="Abandon Land..."/>
<button label="Récupérer le terrain" label_selected="Redemander le terrain…" name="Reclaim Land..."/>
- <button label="Vente Linden" label_selected="Vente Linden..." name="Linden Sale..." tool_tip="Le terrain doit être la propriété d&apos;un résident, avoir un contenu défini et ne pas être aux enchères."/>
</panel>
<panel label="RÈGLEMENT" name="land_covenant_panel">
<panel.string name="can_resell">
@@ -223,19 +217,19 @@ ou divisé.
Facteur Bonus objets : [BONUS]
</text>
<text name="Simulator primitive usage:">
- Utilisation des primitives :
+ Capacité de la région :
</text>
<text name="objects_available">
[COUNT] sur [MAX] ([AVAILABLE] disponibles)
</text>
<text name="Primitives parcel supports:">
- Prims max. sur la parcelle :
+ Capacité de la parcelle :
</text>
<text name="object_contrib_text">
[COUNT]
</text>
<text name="Primitives on parcel:">
- Prims sur la parcelle :
+ Impact sur la parcelle :
</text>
<text name="total_objects_text">
[COUNT]
@@ -254,7 +248,7 @@ ou divisé.
<text name="group_objects_text">
[COUNT]
</text>
- <button label="Afficher" label_selected="Afficher" name="ShowGroup" />
+ <button label="Afficher" label_selected="Afficher" name="ShowGroup"/>
<button label="Retour" label_selected="Renvoyer..." name="ReturnGroup..." tool_tip="Renvoyer les objets à leurs propriétaires."/>
<text name="Owned by others:">
Appartenant à d&apos;autres :
@@ -318,11 +312,16 @@ Seules les parcelles de grande taille peuvent apparaître dans la recherche.
<panel.string name="push_restrict_region_text">
Pas de bousculades (les règles de la région priment)
</panel.string>
+ <panel.string name="see_avs_text">
+ Les avatars sur les autres parcelles peuvent voir
+ </panel.string>
<text name="allow_label">
Autoriser les autres résidents à :
</text>
- <check_box label="Modifier le terrain" name="edit land check" tool_tip="Si cette option est cochée, n&apos;importe qui peut terraformer votre terrain. Il vaut mieux ne pas cocher cette option pour toujours pouvoir modifer votre propre terrain."/>
- <check_box label="Voler" name="check fly" tool_tip="Si cette option est cochée, les résidents peuvent voler sur votre terrain. Si elle n&apos;est pas cochée, ils ne pourront voler que lorsqu&apos;ils arrivent et passent au dessus de votre terrain."/>
+ <text name="allow_label0">
+ Voler :
+ </text>
+ <check_box label="Tous" name="check fly" tool_tip="Si cette option est cochée, les résidents peuvent voler sur votre terrain. Si elle n&apos;est pas cochée, ils ne pourront voler que lorsqu&apos;ils arrivent et passent au dessus de votre terrain."/>
<text name="allow_label2">
Construire :
</text>
@@ -338,11 +337,8 @@ Seules les parcelles de grande taille peuvent apparaître dans la recherche.
</text>
<check_box label="Tous" name="check other scripts"/>
<check_box label="Groupe" name="check group scripts"/>
- <text name="land_options_label">
- Options du terrain :
- </text>
<check_box label="Sécurisé (pas de dégâts)" name="check safe" tool_tip="Si cette option est cochée, le terrain est sécurisé et il n&apos;y pas de risques de dommages causés par des combats. Si elle est décochée, des dommages causés par les combats peuvent avoir lieu."/>
- <check_box label="Pas de bousculades" name="PushRestrictCheck" tool_tip="Empêche l&apos;utilisation de scripts causant des bousculades. Cette option est utile pour empêcher les comportements abusifs sur votre terrain."/>
+ <check_box label="Pas de bousculades" name="PushRestrictCheck" tool_tip="Empêche l&apos;utilisation de scripts causant des bousculades. Cette option est utile pour empêcher les comportements abusifs sur votre terrain."/>
<check_box label="Afficher le lieu dans la recherche (30 L$/semaine)" name="ShowDirectoryCheck" tool_tip="Afficher la parcelle dans les résultats de recherche"/>
<combo_box name="land category with adult">
<combo_box.item label="Toutes catégories" name="item0"/>
@@ -357,6 +353,7 @@ Seules les parcelles de grande taille peuvent apparaître dans la recherche.
<combo_box.item label="Parcs et Nature" name="item9"/>
<combo_box.item label="Résidentiel" name="item10"/>
<combo_box.item label="Shopping" name="item11"/>
+ <combo_box.item label="Location" name="item13"/>
<combo_box.item label="Autre" name="item12"/>
</combo_box>
<combo_box name="land category">
@@ -371,6 +368,7 @@ Seules les parcelles de grande taille peuvent apparaître dans la recherche.
<combo_box.item label="Parcs et Nature" name="item9"/>
<combo_box.item label="Résidentiel" name="item10"/>
<combo_box.item label="Shopping" name="item11"/>
+ <combo_box.item label="Location" name="item13"/>
<combo_box.item label="Autre" name="item12"/>
</combo_box>
<check_box label="Contenu Modéré" name="MatureCheck" tool_tip=""/>
@@ -378,6 +376,10 @@ Seules les parcelles de grande taille peuvent apparaître dans la recherche.
Photo :
</text>
<texture_picker label="" name="snapshot_ctrl" tool_tip="Cliquez pour sélectionner une image"/>
+ <text name="allow_label5">
+ Les avatars présents sur d&apos;autres parcelles peuvent voir et chatter avec les avatars présents sur cette parcelle.
+ </text>
+ <check_box label="Voir les avatars" name="SeeAvatarsCheck" tool_tip="Permettre aux avatars présents sur d&apos;autres parcelles de voir et chatter avec les avatars présents sur cette parcelle et à vous de les voir et de chatter avec eux."/>
<text name="landing_point">
Lieu d&apos;arrivée : [LANDING]
</text>
@@ -403,7 +405,6 @@ Seules les parcelles de grande taille peuvent apparaître dans la recherche.
</text>
<line_editor left="97" name="media_url"/>
<button label="Choisir" name="set_media_url"/>
- <check_box label="Masquer l&apos;URL" left="97" name="hide_media_url" tool_tip="Si vous cochez cette option, les personnes non autorisées à accéder aux infos de cette parcelle ne verront pas l&apos;URL du média. Cette option n&apos;est pas disponible pour les fichiers HTML."/>
<text name="Description:">
Description :
</text>
@@ -416,11 +417,11 @@ texture :
<text name="replace_texture_help">
Les objets avec cette texture affichent le film ou la page web quand vous cliquez sur la flèche Jouer. Sélectionnez l&apos;image miniature pour choisir une texture différente.
</text>
- <check_box label="Échelle automatique" left="97" name="media_auto_scale" tool_tip="Si vous sélectionnez cette option, le contenu de cette parcelle sera automatiquement mis à l&apos;échelle. La qualité visuelle sera peut-être amoindrie mais vous n&apos;aurez à faire aucune autre mise à l&apos;échelle ou alignement."/>
- <text left="102" name="media_size" tool_tip="Taille du média Web, laisser 0 pour la valeur par défaut." width="105">
+ <check_box label="Échelle automatique" name="media_auto_scale" tool_tip="Si vous sélectionnez cette option, le contenu de cette parcelle sera automatiquement mis à l&apos;échelle. La qualité visuelle sera peut-être amoindrie mais vous n&apos;aurez à faire aucune autre mise à l&apos;échelle ou alignement."/>
+ <text name="media_size" tool_tip="Taille du média Web, laisser 0 pour la valeur par défaut.">
Taille :
</text>
- <spinner left_delta="89" name="media_size_width" tool_tip="Taille du média Web, laisser 0 pour la valeur par défaut."/>
+ <spinner name="media_size_width" tool_tip="Taille du média Web, laisser 0 pour la valeur par défaut."/>
<spinner name="media_size_height" tool_tip="Taille du média Web, laisser 0 pour la valeur par défaut."/>
<text name="pixels">
pixels
@@ -435,11 +436,15 @@ texture :
URL de la
musique :
</text>
- <check_box label="Masquer l&apos;URL" name="hide_music_url" tool_tip="Si vous cochez cette option, l&apos;URL de musique sera masquée et invisible pour tous les utilisateurs non autorisés des informations de cette parcelle."/>
<text name="Sound:">
Son :
</text>
<check_box label="Limiter les gestes et sons d&apos;objet à cette parcelle" name="check sound local"/>
+ <text name="Avatar Sounds:">
+ Sons d&apos;avatar :
+ </text>
+ <check_box label="Tout le monde" name="all av sound check"/>
+ <check_box label="Groupe" name="group av sound check"/>
<text name="Voice settings:">
Voix :
</text>
@@ -452,7 +457,7 @@ musique :
(défini par le domaine
</panel.string>
<panel.string name="allow_public_access">
- Autoriser l&apos;accès public ([MATURITY])
+ Autoriser l&apos;accès public ([MATURITY]) (Remarque : des lignes d&apos;interdiction seront créées si cette case n&apos;est pas cochée)
</panel.string>
<panel.string name="estate_override">
Au moins une de ces options est définie au niveau du domaine.
@@ -460,12 +465,12 @@ musique :
<text name="Limit access to this parcel to:">
Accès à cette parcelle
</text>
- <check_box label="Autoriser l&apos;accès public [MATURITY]" name="public_access"/>
+ <check_box label="Autoriser l&apos;accès public (des lignes d&apos;interdiction seront créées si cette case n&apos;est pas cochée)" name="public_access"/>
<text name="Only Allow">
- Limiter l&apos;accès aux résidents vérifiés par :
+ Conditions d&apos;accès des résidents :
</text>
- <check_box label="Informations de paiement enregistrées [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Bannir les résidents non identifiés."/>
- <check_box label="Vérification de l&apos;âge [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Bannir les résidents qui n&apos;ont pas vérifié leur âge. Consultez la page [SUPPORT_SITE] pour plus d&apos;informations."/>
+ <check_box label="Informations de paiement enregistrées [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Pour pouvoir accéder à cette parcelle, les résidents doivent avoir enregistré des informations de paiement. Consultez le [SUPPORT_SITE] pour plus d&apos;informations."/>
+ <check_box label="Âge vérifié [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Pour que les résidents puissent accéder à cette parcelle, leur âge doit avoir fait l&apos;objet d&apos;une vérification. Consultez le [SUPPORT_SITE] pour plus d&apos;informations."/>
<check_box label="Autoriser l&apos;accès au groupe : [GROUP]" name="GroupCheck" tool_tip="Définir le groupe à l&apos;onglet Général."/>
<check_box label="Vendre des pass à :" name="PassCheck" tool_tip="Autoriser un accès temporaire à cette parcelle"/>
<combo_box name="pass_combo" width="110">
diff --git a/indra/newview/skins/default/xui/fr/floater_animation_anim_preview.xml b/indra/newview/skins/default/xui/fr/floater_animation_anim_preview.xml
new file mode 100644
index 0000000000..e82518ce80
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_animation_anim_preview.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Anim Preview" title="ANIMATION.ANIM">
+ <text name="name_label">
+ Nom :
+ </text>
+ <text name="description_label">
+ Description :
+ </text>
+ <button label="Charger ([AMOUNT] L$)" name="ok_btn"/>
+ <button label="Annuler" label_selected="Annuler" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_animation_bvh_preview.xml b/indra/newview/skins/default/xui/fr/floater_animation_bvh_preview.xml
new file mode 100644
index 0000000000..84c40b5987
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_animation_bvh_preview.xml
@@ -0,0 +1,186 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Animation Preview">
+ <floater.string name="failed_to_initialize">
+ Échec de l&apos;initialisation du mouvement
+ </floater.string>
+ <floater.string name="anim_too_long">
+ La durée du fichier d&apos;animation est de [LENGTH] secondes.
+
+La limite maximale est de [MAX_LENGTH] secondes.
+ </floater.string>
+ <floater.string name="failed_file_read">
+ Impossible de lire le fichier d&apos;animation.
+
+[STATUS]
+ </floater.string>
+ <floater.string name="E_ST_OK">
+ Ok
+ </floater.string>
+ <floater.string name="E_ST_EOF">
+ Fin prématurée du fichier.
+ </floater.string>
+ <floater.string name="E_ST_NO_CONSTRAINT">
+ Impossible de lire la définition des contraintes.
+ </floater.string>
+ <floater.string name="E_ST_NO_FILE">
+ Impossible d&apos;ouvrir le fichier BVH.
+ </floater.string>
+ <floater.string name="E_ST_NO_HIER">
+ En-tête HIERARCHY non valide.
+ </floater.string>
+ <floater.string name="E_ST_NO_JOINT">
+ Impossible de trouver ROOT ou JOINT.
+ </floater.string>
+ <floater.string name="E_ST_NO_NAME">
+ Impossible d&apos;obtenir le nom JOINT.
+ </floater.string>
+ <floater.string name="E_ST_NO_OFFSET">
+ Impossible de trouver OFFSET.
+ </floater.string>
+ <floater.string name="E_ST_NO_CHANNELS">
+ CHANNELS introuvables.
+ </floater.string>
+ <floater.string name="E_ST_NO_ROTATION">
+ Impossible d&apos;obtenir l&apos;ordre de rotation.
+ </floater.string>
+ <floater.string name="E_ST_NO_AXIS">
+ Impossible d&apos;obtenir l&apos;axe de rotation.
+ </floater.string>
+ <floater.string name="E_ST_NO_MOTION">
+ Impossible de trouver MOTION.
+ </floater.string>
+ <floater.string name="E_ST_NO_FRAMES">
+ Impossible d&apos;obtenir le nombre d&apos;images.
+ </floater.string>
+ <floater.string name="E_ST_NO_FRAME_TIME">
+ Impossible d&apos;obtenir la durée des images.
+ </floater.string>
+ <floater.string name="E_ST_NO_POS">
+ Impossible d&apos;obtenir les valeurs de position.
+ </floater.string>
+ <floater.string name="E_ST_NO_ROT">
+ Impossible d&apos;obtenir les valeurs de rotation.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_FILE">
+ Impossible d&apos;ouvrir le fichier de traduction.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_HEADER">
+ Impossible de lire l&apos;en-tête de traduction.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_NAME">
+ Impossible de lire les noms de traduction.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_IGNORE">
+ Impossible de lire la valeur ignorant la traduction.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_RELATIVE">
+ Impossible de lire la valeur relative de la traduction.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_OUTNAME">
+ Impossible de lire la valeur outname de la traduction.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MATRIX">
+ Impossible de lire la matrice de traduction.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MERGECHILD">
+ Impossible d&apos;obtenir le nom mergechild.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MERGEPARENT">
+ Impossible d&apos;obtenir le nom mergeparent.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_PRIORITY">
+ Impossible d&apos;obtenir la valeur priority.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_LOOP">
+ Impossible d&apos;obtenir la valeur loop.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EASEIN">
+ Impossible d&apos;obtenir les valeurs easeIn.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EASEOUT">
+ Impossible d&apos;obtenir les valeurs easeOut.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_HAND">
+ Impossible d&apos;obtenir la valeur hand morph.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EMOTE">
+ Impossible de lire le nom emote.
+ </floater.string>
+ <floater.string name="E_ST_BAD_ROOT">
+ Nom root joint incorrect ; utiliser &quot;hip&quot;.
+ </floater.string>
+ <text name="name_label">
+ Nom :
+ </text>
+ <text name="description_label">
+ Description :
+ </text>
+ <spinner label="Priorité" name="priority" tool_tip="Contrôle quelles autres animations peuvent être remplacées par cette animation."/>
+ <check_box label="Boucle" name="loop_check" tool_tip="Entraîne la lecture en boucle de cette animation."/>
+ <spinner label="Début (%)" name="loop_in_point" tool_tip="Définit le point de l&apos;animation auquel retourne la boucle."/>
+ <spinner label="Fin (%)" name="loop_out_point" tool_tip="Définit le point de l&apos;animation auquel se termine la boucle."/>
+ <text name="hand_label">
+ Pose des mains
+ </text>
+ <combo_box name="hand_pose_combo" tool_tip="Contrôle ce que font les mains pendant l&apos;animation.">
+ <combo_box.item label="Écartées" name="Spread"/>
+ <combo_box.item label="Détendues" name="Relaxed"/>
+ <combo_box.item label="Montrer du doigt (les deux)" name="PointBoth"/>
+ <combo_box.item label="Poing" name="Fist"/>
+ <combo_box.item label="Détendue (gauche)" name="RelaxedLeft"/>
+ <combo_box.item label="Montrer du doigt (gauche)" name="PointLeft"/>
+ <combo_box.item label="Poing (gauche)" name="FistLeft"/>
+ <combo_box.item label="Détendue (droite)" name="RelaxedRight"/>
+ <combo_box.item label="Montrer du doigt (droite)" name="PointRight"/>
+ <combo_box.item label="Poing (droite)" name="FistRight"/>
+ <combo_box.item label="Salut (droite)" name="SaluteRight"/>
+ <combo_box.item label="Clavier" name="Typing"/>
+ <combo_box.item label="Paix (droite)" name="PeaceRight"/>
+ </combo_box>
+ <text name="emote_label">
+ Expression
+ </text>
+ <combo_box name="emote_combo" tool_tip="Contrôle ce que fait le visage pendant l&apos;animation.">
+ <item label="(Aucune)" name="[None]" value=""/>
+ <item label="Aaaaah" name="Aaaaah" value="Aaaaah"/>
+ <item label="Effrayé" name="Afraid" value="Effrayé"/>
+ <item label="En colère" name="Angry" value="En colère"/>
+ <item label="Grand sourire" name="BigSmile" value="Grand sourire"/>
+ <item label="Ennui" name="Bored" value="Ennui"/>
+ <item label="Pleurer" name="Cry" value="Pleurer"/>
+ <item label="Mépris" name="Disdain" value="Mépris"/>
+ <item label="Gêne" name="Embarrassed" value="Gêne"/>
+ <item label="Froncer les sourcils" name="Frown" value="Froncer les sourcils"/>
+ <item label="Embrasser" name="Kiss" value="Embrasser"/>
+ <item label="Rire" name="Laugh" value="Rire"/>
+ <item label="Tirer la langue" name="Plllppt" value="Tirer la langue"/>
+ <item label="Dégoût" name="Repulsed" value="Dégoût"/>
+ <item label="Triste" name="Sad" value="Triste"/>
+ <item label="Hausser les épaules" name="Shrug" value="Hausser les épaules"/>
+ <item label="Sourire" name="Smile" value="Sourire"/>
+ <item label="Surprise" name="Surprise" value="Surprise"/>
+ <item label="Clin d&apos;Å“il" name="Wink" value="Clin d&apos;Å“il"/>
+ <item label="Inquiétude" name="Worry" value="Inquiétude"/>
+ </combo_box>
+ <text name="preview_label">
+ Aperçu
+ </text>
+ <combo_box name="preview_base_anim" tool_tip="Permet de tester le comportement de l&apos;animation lorsque votre avatar effectue certaines actions courantes.">
+ <item label="Debout" name="Standing" value="Debout"/>
+ <item label="En marche" name="Walking" value="En marche"/>
+ <item label="Assis" name="Sitting" value="Assis"/>
+ <item label="En vol" name="Flying" value="En vol"/>
+ </combo_box>
+ <spinner label="Transition début (s)" name="ease_in_time" tool_tip="Durée (en secondes) de l&apos;entrée en fondu de l&apos;animation."/>
+ <spinner label="Transition fin (s)" name="ease_out_time" tool_tip="Durée (en secondes) de la sortie en fondu de l&apos;animation."/>
+ <button name="play_btn" tool_tip="Lire l&apos;animation."/>
+ <button name="pause_btn" tool_tip="Suspendre l&apos;animation."/>
+ <button name="stop_btn" tool_tip="Arrêter la lecture de l&apos;animation."/>
+ <text name="bad_animation_text">
+ Impossible de lire le fichier d&apos;animation.
+
+Les fichiers BVH exportés depuis Poser 4 sont recommandés.
+ </text>
+ <button label="Charger ([AMOUNT] L$)" name="ok_btn"/>
+ <button label="Annuler" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_avatar.xml b/indra/newview/skins/default/xui/fr/floater_avatar.xml
new file mode 100644
index 0000000000..7cbb50a3d6
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_avatar.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Avatar" title="CHOISIR UN AVATAR"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_beacons.xml b/indra/newview/skins/default/xui/fr/floater_beacons.xml
index d61115a2db..ebd4dab683 100644
--- a/indra/newview/skins/default/xui/fr/floater_beacons.xml
+++ b/indra/newview/skins/default/xui/fr/floater_beacons.xml
@@ -17,5 +17,6 @@
<check_box label="Toucher uniquement" name="touch_only"/>
<check_box label="Sources sonores" name="sounds"/>
<check_box label="Sources des particules" name="particles"/>
+ <check_box label="Sources des médias" name="moapbeacon"/>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_build_options.xml b/indra/newview/skins/default/xui/fr/floater_build_options.xml
index cad00ea866..a200ed192f 100644
--- a/indra/newview/skins/default/xui/fr/floater_build_options.xml
+++ b/indra/newview/skins/default/xui/fr/floater_build_options.xml
@@ -1,7 +1,30 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="build options floater" title="OPTIONS DE LA GRILLE">
+ <floater.string name="grid_screen_text">
+ Écran
+ </floater.string>
+ <floater.string name="grid_local_text">
+ Locale
+ </floater.string>
+ <floater.string name="grid_world_text">
+ Monde
+ </floater.string>
+ <floater.string name="grid_reference_text">
+ Référence
+ </floater.string>
+ <floater.string name="grid_attachment_text">
+ Élément attaché
+ </floater.string>
+ <text name="grid_mode_label" tool_tip="Opacité de la grille">
+ Mode
+ </text>
+ <combo_box name="combobox grid mode" tool_tip="Choisir le type d&apos;axe de grille pour le positionnement de l&apos;objet.">
+ <combo_box.item label="Grille du monde" name="World"/>
+ <combo_box.item label="Grille locale" name="Local"/>
+ <combo_box.item label="Grille de référence" name="Reference"/>
+ </combo_box>
<spinner label="Unités (mètres)" name="GridResolution"/>
- <spinner label="Mesures (mètres)" name="GridDrawSize"/>
+ <spinner label="Étendue (mètres)" name="GridDrawSize"/>
<check_box label="Fixation des sous-unités" name="GridSubUnit"/>
<check_box label="Afficher les sections transversales" name="GridCrossSection"/>
<text name="grid_opacity_label" tool_tip="Opacité de la grille">
diff --git a/indra/newview/skins/default/xui/fr/floater_buy_contents.xml b/indra/newview/skins/default/xui/fr/floater_buy_contents.xml
index 7aa142b13e..0436dc8a91 100644
--- a/indra/newview/skins/default/xui/fr/floater_buy_contents.xml
+++ b/indra/newview/skins/default/xui/fr/floater_buy_contents.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_buy_contents" title="ACHETER DES CONTENUS">
<text name="contains_text">
- [NAME] contient :
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; contient :
</text>
<text name="buy_text">
Acheter [AMOUNT] L$ à [NAME] ?
diff --git a/indra/newview/skins/default/xui/fr/floater_buy_currency.xml b/indra/newview/skins/default/xui/fr/floater_buy_currency.xml
index b3acc83078..148a5a35d2 100644
--- a/indra/newview/skins/default/xui/fr/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/fr/floater_buy_currency.xml
@@ -22,10 +22,10 @@ le Lindex...
<text name="currency_action">
Je veux acheter
</text>
- <text name="currency_label" left="308">
+ <text left="308" name="currency_label">
L$
</text>
- <line_editor label="L$" name="currency_amt" width="65" left_pad="-85">
+ <line_editor label="L$" left_pad="-85" name="currency_amt" width="65">
1234
</line_editor>
<text name="buying_label">
@@ -47,13 +47,13 @@ le Lindex...
[AMT] L$
</text>
<text name="currency_links">
- [http://www.secondlife.com/my/account/payment_method_management.php?lang=fr-FR mode de paiement] | [http://www.secondlife.com/my/account/currency.php?lang=fr-FR devise] | [http://www.secondlife.com/my/account/exchange_rates.php?lang=fr-FR taux de change]
+ [http://www.secondlife.com/my/account/payment_method_management.php mode de paiement] | [http://www.secondlife.com/my/account/currency.php devise]
</text>
<text name="exchange_rate_note">
Saisissez à nouveau le montant pour voir le taux de change actuel.
</text>
<text name="purchase_warning_repurchase">
- Confirmer cet achat n'achète que des L$, pas l'objet.
+ Confirmer cet achat n&apos;achète que des L$, pas l&apos;objet.
</text>
<text bottom_delta="16" name="purchase_warning_notenough">
Vous n&apos;achetez pas assez de L$. Veuillez augmenter le montant.
diff --git a/indra/newview/skins/default/xui/fr/floater_camera.xml b/indra/newview/skins/default/xui/fr/floater_camera.xml
index 1d62a89ff2..f2b0ee8af3 100644
--- a/indra/newview/skins/default/xui/fr/floater_camera.xml
+++ b/indra/newview/skins/default/xui/fr/floater_camera.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="camera_floater">
+<floater name="camera_floater" title="PARAMÈTRES DE LA CAMÉRA">
<floater.string name="rotate_tooltip">
Faire tourner la caméra autour du point central
</floater.string>
@@ -9,15 +9,6 @@
<floater.string name="move_tooltip">
Déplacer la caméra vers le haut et le bas, la gauche et la droite
</floater.string>
- <floater.string name="camera_modes_title">
- Modes
- </floater.string>
- <floater.string name="pan_mode_title">
- Rotation - Zoom - Panoramique
- </floater.string>
- <floater.string name="presets_mode_title">
- Préréglages
- </floater.string>
<floater.string name="free_mode_title">
Voir l&apos;objet
</floater.string>
diff --git a/indra/newview/skins/default/xui/fr/floater_chat_bar.xml b/indra/newview/skins/default/xui/fr/floater_chat_bar.xml
new file mode 100644
index 0000000000..890411d091
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_chat_bar.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="chat_bar" title="CHAT PRÈS DE MOI">
+ <panel name="bottom_panel">
+ <line_editor label="Cliquer ici pour chatter." name="chat_box" tool_tip="Appuyer sur Entrée pour dire, Ctrl+Entrée pour crier"/>
+ <button name="show_nearby_chat" tool_tip="Afficher/masquer le journal de chat près de vous."/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_customize.xml b/indra/newview/skins/default/xui/fr/floater_customize.xml
deleted file mode 100644
index ff407b25c1..0000000000
--- a/indra/newview/skins/default/xui/fr/floater_customize.xml
+++ /dev/null
@@ -1,530 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater customize" title="APPARENCE">
- <tab_container name="customize tab container" tab_min_width="150">
- <text label="Parties du corps" name="body_parts_placeholder">
- Parties du corps
- </text>
- <panel label="Silhouette" left="154" name="Shape" width="389">
- <button label="Rétablir" label_selected="Rétablir" name="Revert"/>
- <button label="Corps" label_selected="Corps" name="Body"/>
- <button label="Tête" label_selected="Tête" name="Head"/>
- <button label="Yeux" label_selected="Yeux" name="Eyes"/>
- <button label="Oreilles" label_selected="Oreilles" name="Ears"/>
- <button label="Nez" label_selected="Nez" name="Nose"/>
- <button label="Bouche" label_selected="Bouche" name="Mouth"/>
- <button label="Menton" label_selected="Menton" name="Chin"/>
- <button label="Torse" label_selected="Torse" name="Torso"/>
- <button label="Jambes" label_selected="Jambes" name="Legs"/>
- <radio_group name="sex radio">
- <radio_item label="Femme" name="radio" value="0"/>
- <radio_item label="Homme" name="radio2" value="1"/>
- </radio_group>
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: impossible de modifier
- </text>
- <text name="title_loading">
- [DESC]: en cours de chargement...
- </text>
- <text name="title_not_worn">
- [DESC]: non portée
- </text>
- <text name="path">
- Emplacement : [PATH]
- </text>
- <text name="not worn instructions">
- Pour changer de silhouette, faites-en glisser une de votre inventaire à votre avatar. Vous pouvez aussi en créer une nouvelle et la porter.
- </text>
- <text name="no modify instructions">
- Vous n&apos;avez pas la permission de modifier cet objet.
- </text>
- <text name="Item Action Label" right="92">
- Silhouette :
- </text>
- <button label="Créer une silhouette" label_selected="Créer une silhouette" name="Create New"/>
- <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
- <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
- </panel>
- <panel label="Peau" name="Skin">
- <button label="Couleur" label_selected="Couleur" name="Skin Color" width="84"/>
- <button label="Détails visage" label_selected="Détails visage" name="Face Detail" width="84"/>
- <button label="Maquillage" label_selected="Maquillage" name="Makeup" width="84"/>
- <button label="Détails corps" label_selected="Détails corps" name="Body Detail" width="84"/>
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: impossible de modifier
- </text>
- <text name="title_loading">
- [DESC]: en cours de chargement...
- </text>
- <text name="title_not_worn">
- [DESC]: non portée
- </text>
- <text name="path">
- Emplacement : [PATH]
- </text>
- <text name="not worn instructions">
- Pour changer de peau, faites-en glisser une à partir de votre inventaire. Vous pouvez aussi en créer une nouvelle et la porter.
- </text>
- <text name="no modify instructions">
- Vous n&apos;avez pas la permission de modifier cet objet.
- </text>
- <text name="Item Action Label" right="92">
- Peau :
- </text>
- <texture_picker label="Tatouages tête" name="Head Tattoos" tool_tip="Cliquez pour sélectionner une image" width="78"/>
- <texture_picker label="Tatouages haut" name="Upper Tattoos" tool_tip="Cliquez pour sélectionner une image" width="78"/>
- <texture_picker label="Tatouages bas" name="Lower Tattoos" tool_tip="Cliquez pour sélectionner une image" width="78"/>
- <button label="Créer une peau" label_selected="Créer une peau" name="Create New"/>
- <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
- <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
- <button label="Rétablir" label_selected="Rétablir" name="Revert"/>
- </panel>
- <panel label="Cheveux" name="Hair">
- <button label="Couleur" label_selected="Couleur" name="Color"/>
- <button label="Style" label_selected="Style" name="Style"/>
- <button label="Sourcils" label_selected="Sourcils" name="Eyebrows"/>
- <button label="Pilosité" label_selected="Pilosité" name="Facial"/>
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: impossible de modifier
- </text>
- <text name="title_loading">
- [DESC]: en cours de chargement...
- </text>
- <text name="title_not_worn">
- [DESC]: non portés
- </text>
- <text name="path">
- Emplacement : [PATH]
- </text>
- <text name="not worn instructions">
- Pour changer de cheveux, faites-en glisser à partir de votre inventaire. Vous pouvez aussi en créer de nouveaux et les porter.
- </text>
- <text name="no modify instructions">
- Vous n&apos;avez pas la permission de modifier cet objet.
- </text>
- <text name="Item Action Label" right="92">
- Cheveux :
- </text>
- <texture_picker label="Texture" name="Texture" tool_tip="Cliquez pour sélectionner une image"/>
- <button label="Créer des cheveux" label_selected="Créer des cheveux" name="Create New"/>
- <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
- <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
- <button label="Rétablir" label_selected="Rétablir" name="Revert"/>
- </panel>
- <panel label="Yeux" name="Eyes">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: impossible de modifier
- </text>
- <text name="title_loading">
- [DESC]: en cours de chargement...
- </text>
- <text name="title_not_worn">
- [DESC]: non portés
- </text>
- <text name="path">
- Emplacement : [PATH]
- </text>
- <text name="not worn instructions">
- Pour changer d&apos;yeux, faites-en glisser une paire de votre inventaire à votre avatar. Vous pouvez aussi en créer de nouveaux et les porter.
- </text>
- <text name="no modify instructions">
- Vous n&apos;avez pas la permission de modifier cet objet.
- </text>
- <text name="Item Action Label" right="92">
- Yeux :
- </text>
- <texture_picker label="Iris" name="Iris" tool_tip="Cliquez pour sélectionner une image"/>
- <button label="Créer des yeux" label_selected="Créer des yeux" name="Create New"/>
- <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
- <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
- <button label="Rétablir" label_selected="Rétablir" name="Revert"/>
- </panel>
- <text label="Habits" name="clothes_placeholder">
- Habits
- </text>
- <panel label="Chemise" name="Shirt">
- <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>
- <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/>
- <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
- <button label="Créer une chemise" label_selected="Créer une chemise" name="Create New"/>
- <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
- <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
- <button label="Rétablir" label_selected="Rétablir" name="Revert"/>
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: impossible de modifier
- </text>
- <text name="title_loading">
- [DESC]: en cours de chargement...
- </text>
- <text name="title_not_worn">
- [DESC]: non portée
- </text>
- <text name="path">
- Emplacement : [PATH]
- </text>
- <text name="not worn instructions">
- Pour changer de chemise, faites-en glisser une à partir de votre inventaire. Vous pouvez aussi en créer une nouvelle et la porter.
- </text>
- <text name="no modify instructions">
- Vous n&apos;avez pas la permission de modifier cet objet.
- </text>
- <text name="Item Action Label" right="92">
- Chemise :
- </text>
- </panel>
- <panel label="Pantalon" name="Pants">
- <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>
- <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/>
- <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
- <button label="Créer un pantalon" label_selected="Créer un pantalon" name="Create New"/>
- <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
- <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
- <button label="Rétablir" label_selected="Rétablir" name="Revert"/>
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: impossible de modifier
- </text>
- <text name="title_loading">
- [DESC]: en cours de chargement...
- </text>
- <text name="title_not_worn">
- [DESC]: non porté
- </text>
- <text name="path">
- Emplacement : [PATH]
- </text>
- <text name="not worn instructions">
- Pour changer de pantalon, faites-en glisser un à partir de votre inventaire. Vous pouvez aussi en créer un nouveau et le porter.
- </text>
- <text name="no modify instructions">
- Vous n&apos;avez pas la permission de modifier cet objet.
- </text>
- <text name="Item Action Label" right="92">
- Pantalon :
- </text>
- </panel>
- <panel label="Chaussures" name="Shoes">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: impossible de modifier
- </text>
- <text name="title_loading">
- [DESC]: en cours de chargement...
- </text>
- <text name="title_not_worn">
- [DESC]: non portées
- </text>
- <text name="path">
- Emplacement : [PATH]
- </text>
- <text name="not worn instructions">
- Pour changer de chaussures, faites-en glisser une paire de votre inventaire à votre avatar. Vous pouvez aussi en créer des nouvelles et les porter.
- </text>
- <button label="Créer des chaussures" label_selected="Créer des chaussures" name="Create New"/>
- <text name="no modify instructions">
- Vous n&apos;avez pas la permission de modifier cet objet.
- </text>
- <text name="Item Action Label" right="92">
- Chaussures :
- </text>
- <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>
- <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/>
- <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
- <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
- <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
- <button label="Rétablir" label_selected="Rétablir" name="Revert"/>
- </panel>
- <panel label="Chaussettes" name="Socks">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: impossible de modifier
- </text>
- <text name="title_loading">
- [DESC]: en cours de chargement...
- </text>
- <text name="title_not_worn">
- [DESC]: non portées
- </text>
- <text name="path">
- Emplacement : [PATH]
- </text>
- <text name="not worn instructions">
- Pour changer de chaussettes, faites-en glisser une paire à partir de votre inventaire. Vous pouvez aussi en créer des nouvelles et les porter.
- </text>
- <button label="Créer des chaussettes" label_selected="Créer des chaussettes" name="Create New"/>
- <text name="no modify instructions">
- Vous n&apos;avez pas la permission de modifier cet objet.
- </text>
- <text name="Item Action Label" right="92">
- Chaussettes :
- </text>
- <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>
- <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/>
- <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
- <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
- <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
- <button label="Rétablir" label_selected="Rétablir" name="Revert"/>
- </panel>
- <panel label="Veste" name="Jacket">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: impossible de modifier
- </text>
- <text name="title_loading">
- [DESC]: en cours de chargement...
- </text>
- <text name="title_not_worn">
- [DESC]: non portée
- </text>
- <text name="path">
- Emplacement : [PATH]
- </text>
- <text name="not worn instructions">
- Pour changer de veste, faites-en glisser une à partir de votre inventaire. Vous pouvez aussi en créer une nouvelle et la porter.
- </text>
- <button label="Créer une veste" label_selected="Créer une veste" name="Create New"/>
- <text name="no modify instructions">
- Vous n&apos;avez pas la permission de modifier cet objet.
- </text>
- <text name="Item Action Label" right="92">
- Veste :
- </text>
- <texture_picker label="Tissu (dessus)" name="Upper Fabric" tool_tip="Cliquez pour sélectionner une image" width="81"/>
- <texture_picker label="Tissu (dessous)" name="Lower Fabric" tool_tip="Cliquez pour sélectionner une image" width="81"/>
- <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="81"/>
- <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
- <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
- <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
- <button label="Rétablir" label_selected="Rétablir" name="Revert"/>
- </panel>
- <panel label="Gants" name="Gloves">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: impossible de modifier
- </text>
- <text name="title_loading">
- [DESC]: en cours de chargement...
- </text>
- <text name="title_not_worn">
- [DESC]: non portés
- </text>
- <text name="path">
- Emplacement : [PATH]
- </text>
- <text name="not worn instructions">
- Pour changer de gants, faites-en glisser une paire à partir de votre inventaire. Vous pouvez aussi en créer de nouveaux et les porter.
- </text>
- <button label="Créer des gants" label_selected="Créer des gants" name="Create New"/>
- <text name="no modify instructions">
- Vous n&apos;avez pas la permission de modifier cet objet.
- </text>
- <text name="Item Action Label" right="92">
- Gants :
- </text>
- <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>
- <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/>
- <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
- <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
- <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
- <button label="Rétablir" label_selected="Rétablir" name="Revert"/>
- </panel>
- <panel label="Débardeur" name="Undershirt">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: impossible de modifier
- </text>
- <text name="title_loading">
- [DESC]: en cours de chargement...
- </text>
- <text name="title_not_worn">
- [DESC]: non porté
- </text>
- <text name="path">
- Emplacement : [PATH]
- </text>
- <text name="not worn instructions">
- Pour changer de débardeur, faites-en glisser un à partir de votre inventaire. Vous pouvez aussi en créer un nouveau et le porter.
- </text>
- <button label="Créer un débardeur" label_selected="Créer un débardeur" name="Create New"/>
- <text name="no modify instructions">
- Vous n&apos;avez pas la permission de modifier cet objet.
- </text>
- <text name="Item Action Label">
- Débardeur :
- </text>
- <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>
- <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/>
- <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
- <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
- <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
- <button label="Rétablir" label_selected="Rétablir" name="Revert"/>
- </panel>
- <panel label="Caleçon" name="Underpants">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: impossible de modifier
- </text>
- <text name="title_loading">
- [DESC]: en cours de chargement...
- </text>
- <text name="title_not_worn">
- [DESC]: non porté
- </text>
- <text name="path">
- Emplacement : [PATH]
- </text>
- <text name="not worn instructions">
- Pour changer de caleçon, faites-en glisser un à partir de votre inventaire. Vous pouvez aussi en créer un nouveau et le porter.
- </text>
- <button label="Créer un caleçon" label_selected="Créer un caleçon" name="Create New"/>
- <text name="no modify instructions">
- Vous n&apos;avez pas la permission de modifier cet objet.
- </text>
- <text name="Item Action Label">
- Caleçon :
- </text>
- <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>
- <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/>
- <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
- <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
- <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
- <button label="Rétablir" label_selected="Rétablir" name="Revert"/>
- </panel>
- <panel label="Jupe" name="Skirt">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: impossible de modifier
- </text>
- <text name="title_loading">
- [DESC]: en cours de chargement...
- </text>
- <text name="title_not_worn">
- [DESC]: non portée
- </text>
- <text name="path">
- Emplacement : [PATH]
- </text>
- <text name="not worn instructions">
- Pour changer de jupe, faites-en glisser une à partir de votre inventaire. Vous pouvez aussi en créer une nouvelle et la porter.
- </text>
- <button label="Créer une jupe" label_selected="Créer une jupe" name="Create New"/>
- <text name="no modify instructions">
- Vous n&apos;avez pas la permission de modifier cet objet.
- </text>
- <text name="Item Action Label" right="92">
- Jupe :
- </text>
- <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>
- <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/>
- <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
- <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
- <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
- <button label="Rétablir" label_selected="Rétablir" name="Revert"/>
- </panel>
- <panel label="Tatouage" name="Tattoo">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: impossible de modifier
- </text>
- <text name="title_loading">
- [DESC]: en cours de chargement...
- </text>
- <text name="title_not_worn">
- [DESC]: non porté
- </text>
- <text name="path">
- Dans [PATH]
- </text>
- <text name="not worn instructions">
- Pour changer de tatouage, faites-en glisser un de votre inventaire à votre avatar. Vous pouvez aussi en créer un nouveau et le porter.
- </text>
- <button label="Créer un nouveau tatouage" label_selected="Créer un nouveau tatouage" name="Create New"/>
- <text name="no modify instructions">
- Vous n&apos;avez pas le droit de modifier cet objet.
- </text>
- <text name="Item Action Label">
- Tatouage :
- </text>
- <texture_picker label="Tatouage tête" name="Head Tattoo" tool_tip="Cliquez pour sélectionner une image"/>
- <texture_picker label="Tatouage haut" name="Upper Tattoo" tool_tip="Cliquez pour sélectionner une image"/>
- <texture_picker label="Tatouage bas" name="Lower Tattoo" tool_tip="Cliquez pour sélectionner une image"/>
- <button label="Enlever" label_selected="Enlever" name="Take Off"/>
- <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
- <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
- <button label="Rétablir" label_selected="Rétablir" name="Revert"/>
- </panel>
- <panel label="Alpha" name="Alpha">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: impossible de modifier
- </text>
- <text name="title_loading">
- [DESC]: en cours de chargement...
- </text>
- <text name="title_not_worn">
- [DESC]: non porté
- </text>
- <text name="path">
- Dans [PATH]
- </text>
- <text name="not worn instructions">
- Pour changer de masque alpha, faites-en glisser un de votre inventaire à votre avatar. Vous pouvez aussi en créer un nouveau et le porter.
- </text>
- <button label="Créer un nouvel alpha" label_selected="Créer un nouvel alpha" name="Create New"/>
- <text name="no modify instructions">
- Vous n&apos;avez pas le droit de modifier cet objet.
- </text>
- <text name="Item Action Label">
- Alpha :
- </text>
- <texture_picker label="Alpha bas" name="Lower Alpha" tool_tip="Cliquez pour sélectionner une image"/>
- <texture_picker label="Alpha haut" name="Upper Alpha" tool_tip="Cliquez pour sélectionner une image"/>
- <texture_picker label="Alpha tête" name="Head Alpha" tool_tip="Cliquez pour sélectionner une image"/>
- <texture_picker label="Alpha yeux" name="Eye Alpha" tool_tip="Cliquez pour sélectionner une image"/>
- <texture_picker label="Alpha cheveux" name="Hair Alpha" tool_tip="Cliquez pour sélectionner une image"/>
- <button label="Enlever" label_selected="Enlever" name="Take Off"/>
- <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
- <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
- <button label="Rétablir" label_selected="Rétablir" name="Revert"/>
- </panel>
- </tab_container>
- <scroll_container left="251" name="panel_container"/>
- <button label="Infos scripts" label_selected="Infos scripts" name="script_info" tool_tip="Afficher les scripts attachés à votre avatar"/>
- <button label="Créer tenue" label_selected="Créer une tenue..." name="make_outfit_btn"/>
- <button label="Annuler" label_selected="Annuler" name="Cancel"/>
- <button label="OK" label_selected="OK" name="Ok"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/fr/floater_day_cycle_options.xml
deleted file mode 100644
index 0ce17b9dc6..0000000000
--- a/indra/newview/skins/default/xui/fr/floater_day_cycle_options.xml
+++ /dev/null
@@ -1,94 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Day Cycle Floater" title="EDITEUR DU CYCLE DU JOUR">
- <tab_container name="Day Cycle Tabs">
- <panel label="Cycle du jour" name="Day Cycle">
- <button label="?" name="WLDayCycleHelp"/>
- <text name="WL12am">
- Min.
- </text>
- <text name="WL3am">
- 3h
- </text>
- <text name="WL6am">
- 6h
- </text>
- <text name="WL9amHash">
- 9h
- </text>
- <text name="WL12pmHash">
- Midi
- </text>
- <text name="WL3pm">
- 15h
- </text>
- <text name="WL6pm">
- 18h
- </text>
- <text name="WL9pm">
- 21h
- </text>
- <text name="WL12am2">
- Min.
- </text>
- <text name="WL12amHash">
- |
- </text>
- <text name="WL3amHash">
- I
- </text>
- <text name="WL6amHash">
- |
- </text>
- <text name="WL9amHash2">
- I
- </text>
- <text name="WL12pmHash2">
- |
- </text>
- <text name="WL3pmHash">
- I
- </text>
- <text name="WL6pmHash">
- |
- </text>
- <text name="WL9pmHash">
- I
- </text>
- <text name="WL12amHash2">
- |
- </text>
- <button label="Ajouter clé" label_selected="Ajouter clé" name="WLAddKey"/>
- <button label="Supprimer clé" label_selected="Supprimer clé" name="WLDeleteKey"/>
- <text name="WLCurKeyFrameText">
- Réglages des images-clés :
- </text>
- <text name="WLCurKeyTimeText">
- Heure de la clé :
- </text>
- <spinner label="Heure" name="WLCurKeyHour"/>
- <spinner label="Min" name="WLCurKeyMin"/>
- <text name="WLCurKeyTimeText2">
- Préréglages clés :
- </text>
- <combo_box label="Préréglage" name="WLKeyPresets"/>
- <text name="DayCycleText">
- Snap :
- </text>
- <combo_box label="5 min" name="WLSnapOptions"/>
- <text name="DayCycleText2">
- Durée du cycle :
- </text>
- <spinner label="Heure" name="WLLengthOfDayHour"/>
- <spinner label="Min" name="WLLengthOfDayMin"/>
- <spinner label="Sec" name="WLLengthOfDaySec"/>
- <text name="DayCycleText3">
- Aperçu :
- </text>
- <button label="Lire" label_selected="Lire" name="WLAnimSky"/>
- <button label="Arrêter" label_selected="Stop" name="WLStopAnimSky"/>
- <button label="Utiliser heure domaine" label_selected="Aller heure domaine" name="WLUseLindenTime"/>
- <button label="Enregistrer jour test" label_selected="Enregistrer jour test" name="WLSaveDayCycle"/>
- <button label="Charger jour test" label_selected="Charger jour test" name="WLLoadDayCycle"/>
- </panel>
- </tab_container>
-</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_delete_env_preset.xml b/indra/newview/skins/default/xui/fr/floater_delete_env_preset.xml
new file mode 100644
index 0000000000..035bdbe5f3
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_delete_env_preset.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<floater name="Delete Env Preset" title="SUPPRIMER PRÉRÉGLAGE ENV.">
+ <string name="title_water">
+ Supprimer un préréglage de l&apos;eau
+ </string>
+ <string name="title_sky">
+ Supprimer un préréglage du ciel
+ </string>
+ <string name="title_day_cycle">
+ Supprimer un cycle du jour
+ </string>
+ <string name="label_water">
+ Préréglage :
+ </string>
+ <string name="label_sky">
+ Préréglage :
+ </string>
+ <string name="label_day_cycle">
+ Cycle du jour :
+ </string>
+ <string name="msg_confirm_deletion">
+ Voulez-vous vraiment supprimer le préréglage sélectionné ?
+ </string>
+ <string name="msg_sky_is_referenced">
+ Impossible de supprimer un préréglage référencé dans un ou plusieurs cycles du jour.
+ </string>
+ <string name="combo_label">
+ -Effectuer une sélection-
+ </string>
+ <text name="label">
+ Préréglage :
+ </text>
+ <button label="Supprimer" name="delete"/>
+ <button label="Annuler" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_destinations.xml b/indra/newview/skins/default/xui/fr/floater_destinations.xml
new file mode 100644
index 0000000000..25e6c90a8e
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_destinations.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Destinations" title="DESTINATIONS"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_edit_day_cycle.xml b/indra/newview/skins/default/xui/fr/floater_edit_day_cycle.xml
new file mode 100644
index 0000000000..0100419bc5
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_edit_day_cycle.xml
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Edit Day cycle" title="Modifier un cycle du jour">
+ <string name="title_new">
+ Créer un nouveau cycle du jour
+ </string>
+ <string name="title_edit">
+ Modifier un cycle du jour
+ </string>
+ <string name="hint_new">
+ Donnez un nom au cycle du jour, ajustez les contrôles afin de le créer, puis cliquez sur Enregistrer.
+ </string>
+ <string name="hint_edit">
+ Pour modifier le cycle du jour, ajustez les contrôles ci-dessous, puis cliquez sur Enregistrer.
+ </string>
+ <string name="combo_label">
+ -Effectuer une sélection-
+ </string>
+ <text name="label">
+ Nom du préréglage :
+ </text>
+ <text name="note">
+ Remarque : si vous changez votre préréglage de nom, un nouveau préréglage sera créé et celui existant restera tel quel.
+ </text>
+ <text name="hint_item1">
+ - Cliquez sur un repère pour modifier le réglage du ciel et l&apos;heure associés.
+ </text>
+ <text name="hint_item2">
+ - Cliquez sur les repères et faites-les glisser afin de définir les heures de transition.
+ </text>
+ <text name="hint_item3">
+ - Déplacez le marqueur en forme de triangle pour afficher un aperçu du cycle du jour.
+ </text>
+ <panel name="day_cycle_slider_panel">
+ <multi_slider initial_value="0" name="WLTimeSlider"/>
+ <multi_slider initial_value="0" name="WLDayCycleKeys"/>
+ <button label="Ajouter clé" label_selected="Ajouter clé" name="WLAddKey"/>
+ <button label="Supprimer clé" label_selected="Supprimer clé" name="WLDeleteKey"/>
+ <text name="WL12am">
+ Min.
+ </text>
+ <text name="WL3am">
+ 3h
+ </text>
+ <text name="WL6am">
+ 6h
+ </text>
+ <text name="WL9amHash">
+ 9h
+ </text>
+ <text name="WL12pmHash">
+ Midi
+ </text>
+ <text name="WL3pm">
+ 15h
+ </text>
+ <text name="WL6pm">
+ 18h
+ </text>
+ <text name="WL9pm">
+ 21h
+ </text>
+ <text name="WL12am2">
+ Min.
+ </text>
+ <text name="WL12amHash">
+ |
+ </text>
+ <text name="WL3amHash">
+ I
+ </text>
+ <text name="WL6amHash">
+ |
+ </text>
+ <text name="WL9amHash2">
+ I
+ </text>
+ <text name="WL12pmHash2">
+ |
+ </text>
+ <text name="WL3pmHash">
+ I
+ </text>
+ <text name="WL6pmHash">
+ |
+ </text>
+ <text name="WL9pmHash">
+ I
+ </text>
+ <text name="WL12amHash2">
+ |
+ </text>
+ </panel>
+ <text name="WLCurKeyPresetText">
+ Réglage du ciel :
+ </text>
+ <combo_box label="Préréglage" name="WLSkyPresets"/>
+ <text name="WLCurKeyTimeText">
+ Heure :
+ </text>
+ <time name="time" value="6h"/>
+ <check_box label="Appliquer ce nouveau cycle du jour" name="make_default_cb"/>
+ <button label="Enregistrer" name="save"/>
+ <button label="Annuler" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_edit_sky_preset.xml b/indra/newview/skins/default/xui/fr/floater_edit_sky_preset.xml
new file mode 100644
index 0000000000..4ec9bbb3dd
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_edit_sky_preset.xml
@@ -0,0 +1,143 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Edit Sky Preset" title="Modifier un préréglage du ciel">
+ <string name="title_new">
+ Créer un nouveau préréglage du ciel
+ </string>
+ <string name="title_edit">
+ Modifier un préréglage du ciel
+ </string>
+ <string name="hint_new">
+ Donnez un nom à votre préréglage, ajustez les contrôles afin de le créer, puis cliquez sur Enregistrer.
+ </string>
+ <string name="hint_edit">
+ Pour modifier le préréglage du ciel, ajustez les contrôles, puis cliquez sur Enregistrer.
+ </string>
+ <string name="combo_label">
+ -Effectuer une sélection-
+ </string>
+ <text name="hint">
+ Pour modifier le préréglage, ajustez les contrôles, puis cliquez sur Enregistrer.
+ </text>
+ <text name="label">
+ Nom du préréglage :
+ </text>
+ <text name="note">
+ Remarque : si vous changez votre préréglage de nom, un nouveau préréglage sera créé et celui existant restera tel quel.
+ </text>
+ <tab_container name="WindLight Tabs">
+ <panel label="ATMOSPHÈRE" name="Atmosphere">
+ <text name="BHText">
+ Bleu de l&apos;horizon
+ </text>
+ <text name="BDensText">
+ Quantité de brume
+ </text>
+ <text name="BDensText2">
+ Densité du bleu
+ </text>
+ <text name="HDText">
+ Densité de la brume
+ </text>
+ <text name="DensMultText">
+ Multiplicateur de densité
+ </text>
+ <text name="WLDistanceMultText">
+ Multiplicateur de distance
+ </text>
+ <text name="MaxAltText">
+ Altitude maximum
+ </text>
+ </panel>
+ <panel label="LUMIÈRE" name="Lighting">
+ <text name="SLCText">
+ Couleur soleil/lune
+ </text>
+ <text name="WLAmbientText">
+ Éclairage ambiant
+ </text>
+ <text name="SunGlowText">
+ Rayonnement du soleil
+ </text>
+ <slider label="Netteté" name="WLGlowB"/>
+ <slider label="Taille" name="WLGlowR"/>
+ <text name="WLStarText">
+ Éclat des étoiles
+ </text>
+ <text name="SceneGammaText">
+ Gamma de la scène
+ </text>
+ <text name="TODText">
+ Position soleil/lune
+ </text>
+ <multi_slider initial_value="0" name="WLSunPos"/>
+ <text name="WL12amHash">
+ |
+ </text>
+ <text name="WL6amHash">
+ |
+ </text>
+ <text name="WL12pmHash2">
+ |
+ </text>
+ <text name="WL6pmHash">
+ |
+ </text>
+ <text name="WL12amHash2">
+ |
+ </text>
+ <text name="WL12am">
+ Min.
+ </text>
+ <text name="WL6am">
+ 6h
+ </text>
+ <text name="WL12pmHash">
+ Midi
+ </text>
+ <text name="WL6pm">
+ 18h
+ </text>
+ <text name="WL12am2">
+ Min.
+ </text>
+ <time name="WLDayTime" value="6h"/>
+ <text name="WLEastAngleText">
+ Angle du levant
+ </text>
+ </panel>
+ <panel label="NUAGES" name="Clouds">
+ <text name="WLCloudColorText">
+ Couleur des nuages
+ </text>
+ <text name="WLCloudColorText2">
+ Nuages - XY/Densité
+ </text>
+ <slider label="X" name="WLCloudX"/>
+ <slider label="Y" name="WLCloudY"/>
+ <slider label="D" name="WLCloudDensity"/>
+ <text name="WLCloudCoverageText">
+ Couverture nuageuse
+ </text>
+ <text name="WLCloudScaleText">
+ Altitude des nuages
+ </text>
+ <text name="WLCloudDetailText">
+ Détails des nuages - XY/Densité
+ </text>
+ <slider label="X" name="WLCloudDetailX"/>
+ <slider label="Y" name="WLCloudDetailY"/>
+ <slider label="D" name="WLCloudDetailDensity"/>
+ <text name="WLCloudScrollXText">
+ Direction et vitesse X
+ </text>
+ <check_box label="Verrouiller" name="WLCloudLockX"/>
+ <text name="WLCloudScrollYText">
+ Direction et vitesse Y
+ </text>
+ <check_box label="Verrouiller" name="WLCloudLockY"/>
+ </panel>
+ </tab_container>
+ <check_box label="Appliquer ce nouveau préréglage pour le ciel" name="make_default_cb"/>
+ <button label="Enregistrer" name="save"/>
+ <button label="Annuler" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_edit_water_preset.xml b/indra/newview/skins/default/xui/fr/floater_edit_water_preset.xml
new file mode 100644
index 0000000000..81d9d34cfb
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_edit_water_preset.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Edit Water Preset" title="Modifier un préréglage de l&apos;eau">
+ <string name="title_new">
+ Créer un nouveau préréglage de l&apos;eau
+ </string>
+ <string name="title_edit">
+ Modifier un préréglage de l&apos;eau
+ </string>
+ <string name="hint_new">
+ Donnez un nom à votre préréglage, ajustez les contrôles afin de le créer, puis cliquez sur Enregistrer.
+ </string>
+ <string name="hint_edit">
+ Pour modifier le préréglage de l&apos;eau, ajustez les contrôles, puis cliquez sur Enregistrer.
+ </string>
+ <string name="combo_label">
+ -Effectuer une sélection-
+ </string>
+ <text name="hint">
+ Pour modifier le préréglage, ajustez les contrôles, puis cliquez sur Enregistrer.
+ </text>
+ <text name="label">
+ Nom du préréglage :
+ </text>
+ <text name="note">
+ Remarque : si vous changez votre préréglage de nom, un nouveau préréglage sera créé et celui existant restera tel quel.
+ </text>
+ <panel name="panel_water_preset">
+ <text name="water_color_label">
+ Couleur du brouillard dans l&apos;eau
+ </text>
+ <text name="water_fog_density_label">
+ Densité du brouillard
+ </text>
+ <text name="underwater_fog_modifier_label">
+ Brouillard sous-marin
+ </text>
+ <text name="BHText">
+ Direction grande vague
+ </text>
+ <slider label="X" name="WaterWave1DirX"/>
+ <slider label="Y" name="WaterWave1DirY"/>
+ <text name="BDensText">
+ Échelle des vaguelettes
+ </text>
+ <text name="HDText">
+ Échelle Fresnel
+ </text>
+ <text name="FresnelOffsetText">
+ Décalage Fresnel
+ </text>
+ <text name="BHText2">
+ Direction petite vague
+ </text>
+ <slider label="X" name="WaterWave2DirX"/>
+ <slider label="Y" name="WaterWave2DirY"/>
+ <text name="DensMultText">
+ Réfraction au-dessus
+ </text>
+ <text name="WaterScaleBelowText">
+ Réfraction en dessous
+ </text>
+ <text name="MaxAltText">
+ Multiplicateur de flou
+ </text>
+ <text name="BHText3">
+ Normal Map
+ </text>
+ </panel>
+ <check_box label="Appliquer ce nouveau préréglage pour l&apos;eau" name="make_default_cb"/>
+ <button label="Enregistrer" name="save"/>
+ <button label="Annuler" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_env_settings.xml b/indra/newview/skins/default/xui/fr/floater_env_settings.xml
deleted file mode 100644
index dd714e85b6..0000000000
--- a/indra/newview/skins/default/xui/fr/floater_env_settings.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Environment Editor Floater" title="ÉDITEUR D&apos;ENVIRONNEMENT">
- <floater.string name="timeStr">
- [hour12,datetime,utc]:[min,datetime,utc] [ampm,datetime,utc]
- </floater.string>
- <text bottom="-45" name="EnvTimeText" top="29">
- Heure de la
-journée
- </text>
- <text bottom_delta="-36" name="EnvTimeText2">
- Midi
- </text>
- <text name="EnvCloudText">
- Couverture
-nuageuse
- </text>
- <text bottom="-45" name="EnvWaterColorText" top="29">
- Couleur de
-l&apos;eau
- </text>
- <color_swatch name="EnvWaterColor" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/>
- <text name="EnvWaterFogText">
- Brouillard
-dans l&apos;eau
- </text>
- <button bottom="-144" label="Utiliser heure du domaine" name="EnvUseEstateTimeButton" width="152"/>
- <button label="Ciel avancé" left="162" name="EnvAdvancedSkyButton" width="145"/>
- <button label="Eau avancée" left="316" name="EnvAdvancedWaterButton" width="145"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_environment_settings.xml b/indra/newview/skins/default/xui/fr/floater_environment_settings.xml
new file mode 100644
index 0000000000..9ea47a3dd7
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_environment_settings.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Environment Editor Floater" title="PARAMÈTRES D&apos;ENVIRONNEMENT">
+ <text name="note">
+ Utilisez les options ci-dessous pour personnaliser l&apos;environnement de votre client.
+ </text>
+ <radio_group name="region_settings_radio_group">
+ <radio_item label="Utiliser les réglages de la région" name="use_region_settings"/>
+ <radio_item label="Personnaliser mon environnement" name="use_my_settings"/>
+ </radio_group>
+ <panel name="user_environment_settings">
+ <text name="note">
+ Remarque : les autres utilisateurs ne pourront pas voir votre configuration personnalisée.
+ </text>
+ <text name="water_settings_title">
+ Réglage de l&apos;eau
+ </text>
+ <combo_box name="water_settings_preset_combo">
+ <combo_box.item label="-Effectuer une sélection-" name="item0"/>
+ </combo_box>
+ <text name="sky_dayc_settings_title">
+ Ciel / Cycle du jour
+ </text>
+ <radio_group name="sky_dayc_settings_radio_group">
+ <radio_item label="Ciel fixe" name="my_sky_settings"/>
+ <radio_item label="Cycle du jour" name="my_dayc_settings"/>
+ </radio_group>
+ <combo_box name="sky_settings_preset_combo">
+ <combo_box.item label="-Effectuer une sélection-" name="item0"/>
+ </combo_box>
+ <combo_box name="dayc_settings_preset_combo">
+ <combo_box.item label="-Effectuer une sélection-" name="item0"/>
+ </combo_box>
+ </panel>
+ <button label="OK" name="ok_btn"/>
+ <button label="Annuler" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_fast_timers.xml b/indra/newview/skins/default/xui/fr/floater_fast_timers.xml
new file mode 100644
index 0000000000..0100b10557
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_fast_timers.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="fast_timers">
+ <string name="pause">
+ Pauser
+ </string>
+ <string name="run">
+ Courir
+ </string>
+ <button label="Pauser" name="pause_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_hardware_settings.xml b/indra/newview/skins/default/xui/fr/floater_hardware_settings.xml
index e3d604477c..2bc76e0c63 100644
--- a/indra/newview/skins/default/xui/fr/floater_hardware_settings.xml
+++ b/indra/newview/skins/default/xui/fr/floater_hardware_settings.xml
@@ -4,7 +4,7 @@
Filtres :
</text>
<check_box label="Filtre anisotrope (plus lent si activé)" name="ani"/>
- <text name="Antialiasing:">
+ <text name="antialiasing label">
Anti-aliasing :
</text>
<combo_box label="Anti-aliasing" name="fsaa" width="84">
@@ -14,6 +14,9 @@
<combo_box.item label="8x" name="8x"/>
<combo_box.item label="16x" name="16x"/>
</combo_box>
+ <text name="antialiasing restart">
+ (redémarrage du client requis)
+ </text>
<spinner label="Gamma :" name="gamma"/>
<text left="217" name="(brightness, lower is brighter)">
(0 = défaut, valeur faible = plus lumineux)
diff --git a/indra/newview/skins/default/xui/fr/floater_how_to.xml b/indra/newview/skins/default/xui/fr/floater_how_to.xml
new file mode 100644
index 0000000000..a414212ba0
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_how_to.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_how_to" title="AIDE RAPIDE"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_import_collada.xml b/indra/newview/skins/default/xui/fr/floater_import_collada.xml
new file mode 100644
index 0000000000..03804c4bd5
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_import_collada.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Import Collada" title="Importation de scène">
+ <text name="mesh count">
+ Maillages : [COUNT]
+ </text>
+ <text name="texture count">
+ Textures : [COUNT]
+ </text>
+ <text name="status">
+ État : [STATUS]
+ </text>
+ <button label="Annuler" name="cancel"/>
+ <button label="OK" name="ok"/>
+ <string name="status_idle">
+ Inactif
+ </string>
+ <string name="status_uploading">
+ Chargement de [NAME]
+ </string>
+ <string name="status_creating">
+ Création de l&apos;objet [NAME]
+ </string>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/fr/floater_inventory_item_properties.xml
index 29b61fc98d..f2eb3cb6bc 100644
--- a/indra/newview/skins/default/xui/fr/floater_inventory_item_properties.xml
+++ b/indra/newview/skins/default/xui/fr/floater_inventory_item_properties.xml
@@ -24,16 +24,10 @@
<text name="LabelCreatorTitle">
Créateur :
</text>
- <text name="LabelCreatorName">
- Nicole Linden
- </text>
<button label="Profil..." label_selected="" name="BtnCreator"/>
<text name="LabelOwnerTitle">
Propriétaire :
</text>
- <text name="LabelOwnerName">
- Thrax Linden
- </text>
<button label="Profil..." label_selected="" name="BtnOwner"/>
<text name="LabelAcquiredTitle">
Acquis :
diff --git a/indra/newview/skins/default/xui/fr/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/fr/floater_inventory_view_finder.xml
index 1ee85a77ce..7567817f3a 100644
--- a/indra/newview/skins/default/xui/fr/floater_inventory_view_finder.xml
+++ b/indra/newview/skins/default/xui/fr/floater_inventory_view_finder.xml
@@ -5,6 +5,7 @@
<check_box label="Habits" name="check_clothing"/>
<check_box label="Gestes" name="check_gesture"/>
<check_box label="Repères" name="check_landmark"/>
+ <check_box label="Maillages" name="check_mesh"/>
<check_box label="Notes" name="check_notecard"/>
<check_box label="Objets" name="check_object"/>
<check_box label="Scripts" name="check_script"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_map.xml b/indra/newview/skins/default/xui/fr/floater_map.xml
index 04afe89c7b..dbd3dd9406 100644
--- a/indra/newview/skins/default/xui/fr/floater_map.xml
+++ b/indra/newview/skins/default/xui/fr/floater_map.xml
@@ -1,34 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Map" title="">
- <floater.string name="mini_map_north">
- N
- </floater.string>
- <floater.string name="mini_map_east">
- E
- </floater.string>
- <floater.string name="mini_map_west">
- O
- </floater.string>
- <floater.string name="mini_map_south">
- S
- </floater.string>
- <floater.string name="mini_map_southeast">
- SE
- </floater.string>
- <floater.string name="mini_map_northeast">
- NE
- </floater.string>
- <floater.string name="mini_map_southwest">
- SO
- </floater.string>
- <floater.string name="mini_map_northwest">
- NO
- </floater.string>
+<floater name="Map" title="Mini-carte">
<floater.string name="ToolTipMsg">
[REGION](Carte : double-clic ; Panoramique : Maj + faire glisser)
</floater.string>
+ <floater.string name="AltToolTipMsg">
+ [REGION](Téléportation : double-clic ; Panoramique : Maj + faire glisser)
+ </floater.string>
<floater.string name="mini_map_caption">
- MINI-CARTE
+ Mini-carte
</floater.string>
<text label="N" name="floater_map_north" text="N">
N
diff --git a/indra/newview/skins/default/xui/fr/floater_merchant_outbox.xml b/indra/newview/skins/default/xui/fr/floater_merchant_outbox.xml
new file mode 100644
index 0000000000..b491dd6aed
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_merchant_outbox.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_merchant_outbox" title="BOÃŽTE D&apos;ENVOI VENDEUR">
+ <string name="OutboxFolderCount1">
+ 1 dossier
+ </string>
+ <string name="OutboxFolderCountN">
+ [NUM] dossiers
+ </string>
+ <string name="OutboxImporting">
+ Envoi de dossiers...
+ </string>
+ <string name="OutboxInitializing">
+ Initialisation...
+ </string>
+ <panel label="">
+ <panel>
+ <panel name="outbox_inventory_placeholder_panel">
+ <text name="outbox_inventory_placeholder_title">
+ Chargement...
+ </text>
+ </panel>
+ </panel>
+ <panel>
+ <button label="Envoyer vers la Place du marché" name="outbox_import_btn" tool_tip="Vers ma vitrine de la Place du marché"/>
+ </panel>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_model_preview.xml b/indra/newview/skins/default/xui/fr/floater_model_preview.xml
new file mode 100644
index 0000000000..a3b50351ae
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_model_preview.xml
@@ -0,0 +1,277 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Model Preview" title="CHARGEMENT DU MODELE">
+ <string name="status_idle"/>
+ <string name="status_parse_error">
+ Erreur : Problème d&apos;analyse de fichier .dae ; reportez-vous au journal pour plus de détails.
+ </string>
+ <string name="status_material_mismatch">
+ Erreur : le matériau du modèle ne correspond pas à un sous-ensemble du modèle de référence.
+ </string>
+ <string name="status_reading_file">
+ Chargement...
+ </string>
+ <string name="status_generating_meshes">
+ Génération des maillages...
+ </string>
+ <string name="status_vertex_number_overflow">
+ Erreur : valeur de sommet supérieure à 65534. Opération abandonnée.
+ </string>
+ <string name="bad_element">
+ Erreur : élément non valide
+ </string>
+ <string name="high">
+ Élevé
+ </string>
+ <string name="medium">
+ Moyen
+ </string>
+ <string name="low">
+ Faible
+ </string>
+ <string name="lowest">
+ Le plus faible
+ </string>
+ <string name="mesh_status_good">
+ Bon à publier !
+ </string>
+ <string name="mesh_status_na">
+ N/A
+ </string>
+ <string name="mesh_status_none">
+ Aucun
+ </string>
+ <string name="mesh_status_submesh_mismatch">
+ Un nombre différent de faces d&apos;application de texture est associé aux niveaux de détail.
+ </string>
+ <string name="mesh_status_mesh_mismatch">
+ Un nombre différent d&apos;instances de maillage est associé aux niveaux de détail.
+ </string>
+ <string name="mesh_status_too_many_vertices">
+ Trop de sommets pour le niveau de détail.
+ </string>
+ <string name="mesh_status_missing_lod">
+ Niveau de détail requis manquant.
+ </string>
+ <string name="mesh_status_invalid_material_list">
+ Les options du niveau de détail ne sont pas une sous-ensemble d&apos;un modèle de référence.
+ </string>
+ <string name="layer_all">
+ Tout
+ </string>
+ <string name="decomposing">
+ Analyse...
+ </string>
+ <string name="simplifying">
+ Simplification...
+ </string>
+ <string name="tbd">
+ TBD
+ </string>
+ <panel name="left_panel">
+ <panel name="model_name_representation_panel">
+ <text name="name_label">
+ Nom du modèle :
+ </text>
+ <text name="model_category_label">
+ Ce modèle représente...
+ </text>
+ <combo_box name="model_category_combo">
+ <combo_item label="Choisir une option..." name="Choose one"/>
+ <combo_item label="Silhouette de l&apos;avatar" name="Avatar shape"/>
+ <combo_item label="Éléments attachés aux avatars" name="Avatar attachment"/>
+ <combo_item label="Objet mobile (véhicule, animal)" name="Moving object (vehicle, animal)"/>
+ <combo_item label="Éléments pour la construction" name="Building Component"/>
+ <combo_item label="Important, immobile etc." name="Large, non moving etc"/>
+ <combo_item label="Plus petit, immobile etc." name="Smaller, non-moving etc"/>
+ <combo_item label="Aucun" name="Not really any of these"/>
+ </combo_box>
+ </panel>
+ <tab_container name="import_tab">
+ <panel label="Niveau de détail" name="lod_panel" title="Niveau de détail">
+ <text initial_value="Source" name="source" value="Source"/>
+ <text initial_value="Triangles" name="triangles" value="Triangles"/>
+ <text initial_value="Sommets" name="vertices" value="Sommets"/>
+ <text initial_value="Élevé" name="high_label" value="Élevé"/>
+ <button label="Parcourir..." name="lod_browse_high"/>
+ <text initial_value="0" name="high_triangles" value="0"/>
+ <text initial_value="0" name="high_vertices" value="0"/>
+ <text initial_value="Moyen" name="medium_label" value="Moyen"/>
+ <button label="Parcourir..." name="lod_browse_medium"/>
+ <text initial_value="0" name="medium_triangles" value="0"/>
+ <text initial_value="0" name="medium_vertices" value="0"/>
+ <text initial_value="Faible" name="low_label" value="Faible"/>
+ <button label="Parcourir..." name="lod_browse_low"/>
+ <text initial_value="0" name="low_triangles" value="0"/>
+ <text initial_value="0" name="low_vertices" value="0"/>
+ <text initial_value="Le plus faible" name="lowest_label" value="Le plus faible"/>
+ <button label="Parcourir..." name="lod_browse_lowest"/>
+ <text initial_value="0" name="lowest_triangles" value="0"/>
+ <text initial_value="0" name="lowest_vertices" value="0"/>
+ <check_box label="Génération de normales" name="gen_normals"/>
+ <text initial_value="Angle pli :" name="crease_label" value="Angle pli :"/>
+ <spinner name="crease_angle" value="75"/>
+ </panel>
+ <panel label="Propriétés physiques" name="physics_panel">
+ <panel name="physics geometry">
+ <text name="first_step_name">
+ Étape 1 : Niveau de détail
+ </text>
+ <combo_box name="physics_lod_combo" tool_tip="Niveau de détail à utiliser pour la forme des propriétés physiques.">
+ <combo_item name="choose_one">
+ Choisir une option...
+ </combo_item>
+ <combo_item name="physics_high">
+ Élevé
+ </combo_item>
+ <combo_item name="physics_medium">
+ Moyen
+ </combo_item>
+ <combo_item name="physics_low">
+ Faible
+ </combo_item>
+ <combo_item name="physics_lowest">
+ Le plus faible
+ </combo_item>
+ <combo_item name="load_from_file">
+ Du fichier
+ </combo_item>
+ </combo_box>
+ <button label="Parcourir..." name="physics_browse"/>
+ </panel>
+ <panel name="physics analysis">
+ <text name="method_label">
+ Étape 2 : Analyser
+ </text>
+ <text name="analysis_method_label">
+ Moyen :
+ </text>
+ <text name="quality_label">
+ Qualité :
+ </text>
+ <text name="smooth_method_label">
+ Lissage :
+ </text>
+ <check_box label="Fermer les trous" name="Close Holes (Slow)"/>
+ <button label="Analyser" name="Decompose"/>
+ <button label="Annuler" name="decompose_cancel"/>
+ </panel>
+ <panel name="physics simplification">
+ <text name="second_step_label">
+ Étape 3 : Simplifier
+ </text>
+ <text name="simp_method_header">
+ Moyen :
+ </text>
+ <text name="pass_method_header">
+ Passes :
+ </text>
+ <text name="Detail Scale label">
+ Échelle de détail :
+ </text>
+ <text name="Retain%_label">
+ Retenue :
+ </text>
+ <combo_box name="Combine Quality" value="1"/>
+ <button label="Simplifier" name="Simplify"/>
+ <button label="Annuler" name="simplify_cancel"/>
+ </panel>
+ <panel name="physics info">
+ <text name="results_text">
+ Résultats :
+ </text>
+ <text name="physics_triangles">
+ Triangles : [TRIANGLES],
+ </text>
+ <text name="physics_points">
+ Sommets : [POINTS]
+ </text>
+ <text name="physics_hulls">
+ Enveloppes : [HULLS]
+ </text>
+ </panel>
+ </panel>
+ <panel label="Option de chargement" name="modifiers_panel">
+ <text name="scale_label">
+ Echelle (1 = pas d&apos;échelle) :
+ </text>
+ <spinner name="import_scale" value="1.0"/>
+ <text name="dimensions_label">
+ Dimensions :
+ </text>
+ <text name="import_dimensions">
+ [X] X [Y] X [Z]
+ </text>
+ <check_box label="Inclure les textures" name="upload_textures"/>
+ <text name="include_label">
+ Pour les modèles d&apos;avatar uniquement :
+ </text>
+ <check_box label="Inclure la pondération de la peau :" name="upload_skin"/>
+ <check_box label="Inclure la position des articulations :" name="upload_joints"/>
+ <text name="pelvis_offset_label">
+ Décalage Z (élever ou abaisser l&apos;avatar) :
+ </text>
+ <spinner name="pelvis_offset" value="0.0"/>
+ </panel>
+ </tab_container>
+ <panel name="weights_and_warning_panel">
+ <button label="Calculer les poids et les frais." name="calculate_btn" tool_tip="Calculer les poids et les frais."/>
+ <button label="Annuler" name="cancel_btn"/>
+ <button label="Charger le modèle" name="ok_btn" tool_tip="Charger dans le simulateur"/>
+ <button label="Effacer les paramètres et réinitialiser le formulaire" name="reset_btn"/>
+ <text name="upload_fee">
+ Frais de chargement : [FEE] L$
+ </text>
+ <text name="prim_weight">
+ Impact sur le terrain : [EQ]
+ </text>
+ <text name="download_weight">
+ Téléchargement : [ST]
+ </text>
+ <text name="physics_weight">
+ Propriétés physiques : [PH]
+ </text>
+ <text name="server_weight">
+ Serveur : [SIM]
+ </text>
+ <text name="warning_title">
+ Remarque :
+ </text>
+ <text name="warning_message">
+ Vous n&apos;avez pas la permission de charger des modèles de maillage. [[VURL] Savoir comment] obtenir la permission.
+ </text>
+ <text name="status">
+ [STATUS]
+ </text>
+ </panel>
+ </panel>
+ <text name="lod_label">
+ Aperçu :
+ </text>
+ <panel name="right_panel">
+ <combo_box name="preview_lod_combo" tool_tip="Niveau de détail à afficher en rendu d&apos;aperçu.">
+ <combo_item name="high">
+ Élevé
+ </combo_item>
+ <combo_item name="medium">
+ Moyen
+ </combo_item>
+ <combo_item name="low">
+ Faible
+ </combo_item>
+ <combo_item name="lowest">
+ Le plus faible
+ </combo_item>
+ </combo_box>
+ <text name="label_display">
+ Afficher...
+ </text>
+ <check_box label="Coins" name="show_edges"/>
+ <check_box label="Propriétés physiques" name="show_physics"/>
+ <check_box label="Textures" name="show_textures"/>
+ <check_box label="Pondération de la peau" name="show_skin_weight"/>
+ <check_box label="Articulations" name="show_joint_positions"/>
+ <text name="physics_explode_label">
+ Décomposition de l&apos;aperçu :
+ </text>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_moveview.xml b/indra/newview/skins/default/xui/fr/floater_moveview.xml
index c0f3864b81..853af2afdf 100644
--- a/indra/newview/skins/default/xui/fr/floater_moveview.xml
+++ b/indra/newview/skins/default/xui/fr/floater_moveview.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="move_floater">
+<floater name="move_floater" title="MARCHER / COURIR / VOLER">
<string name="walk_forward_tooltip">
Marcher en avant (appuyer sur la flèche vers le haut ou W)
</string>
@@ -58,14 +58,14 @@
Voler
</string>
<panel name="panel_actions">
- <button label="" label_selected="" name="move up btn" tool_tip="Voler vers le haut (touche E)"/>
<button label="" label_selected="" name="turn left btn" tool_tip="Tourner à gauche (appuyer sur la flèche de gauche ou sur A)"/>
<joystick_slide name="move left btn" tool_tip="Marcher vers la gauche (Maj+Flèche gauche ou touche A)"/>
- <button label="" label_selected="" name="move down btn" tool_tip="Voler vers le bas (touche C)"/>
<button label="" label_selected="" name="turn right btn" tool_tip="Tourner à droite (appuyer sur la flèche de droite ou sur D)"/>
<joystick_slide name="move right btn" tool_tip="Marcher vers la droite (Maj+Flèche droite ou touche D)"/>
<joystick_turn name="forward btn" tool_tip="Marcher en avant (appuyer sur la flèche vers le haut ou W)"/>
<joystick_turn name="backward btn" tool_tip="Marcher en arrière (appuyer sur la flèche vers le bas ou S)"/>
+ <button label="" label_selected="" name="move up btn" tool_tip="Voler vers le haut (touche E)"/>
+ <button label="" label_selected="" name="move down btn" tool_tip="Voler vers le bas (touche C)"/>
</panel>
<panel name="panel_modes">
<button label="" name="mode_walk_btn" tool_tip="Mode marche"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_my_appearance.xml b/indra/newview/skins/default/xui/fr/floater_my_appearance.xml
new file mode 100644
index 0000000000..53ff58e307
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_my_appearance.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_my_appearance" title="APPARENCE">
+ <panel label="Changer d&apos;apparence" name="main_panel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_my_inventory.xml b/indra/newview/skins/default/xui/fr/floater_my_inventory.xml
new file mode 100644
index 0000000000..d514d08081
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_my_inventory.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_my_inventory" title="INVENTAIRE"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_nearby_chat.xml b/indra/newview/skins/default/xui/fr/floater_nearby_chat.xml
index 9b1b21c434..8bbd34baae 100644
--- a/indra/newview/skins/default/xui/fr/floater_nearby_chat.xml
+++ b/indra/newview/skins/default/xui/fr/floater_nearby_chat.xml
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="nearby_chat" title="CHAT PRÈS DE MOI">
- <check_box label="Traduction du chat (fournie par Google)" name="translate_chat_checkbox"/>
+ <check_box label="Traduction du chat" name="translate_chat_checkbox"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_object_weights.xml b/indra/newview/skins/default/xui/fr/floater_object_weights.xml
new file mode 100644
index 0000000000..2667188308
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_object_weights.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="object_weights" title="AVANCÉ">
+ <floater.string name="nothing_selected" value="--"/>
+ <text name="selected_text" value="SÉLECTION"/>
+ <text name="objects" value="--"/>
+ <text name="objects_label" value="Objets"/>
+ <text name="prims" value="--"/>
+ <text name="prims_label" value="Prims"/>
+ <text name="weights_of_selected_text" value="POIDS DE LA SÉLECTION"/>
+ <text name="download" value="--"/>
+ <text name="download_label" value="Téléchargement"/>
+ <text name="physics" value="--"/>
+ <text name="physics_label" value="Physique"/>
+ <text name="server" value="--"/>
+ <text name="server_label" value="Serveur"/>
+ <text name="display" value="--"/>
+ <text name="display_label" value="Affichage"/>
+ <text name="land_impacts_text" value="IMPACTS SUR LE TERRAIN"/>
+ <text name="selected" value="--"/>
+ <text name="selected_label" value="Sélection"/>
+ <text name="rezzed_on_land" value="--"/>
+ <text name="rezzed_on_land_label" value="Rezzés sur le terrain"/>
+ <text name="remaining_capacity" value="--"/>
+ <text name="remaining_capacity_label" value="Capacité restante"/>
+ <text name="total_capacity" value="--"/>
+ <text name="total_capacity_label" value="Capacité totale"/>
+ <text name="help_SLURL" value="[secondlife:///app/help/object_weights De quoi s&apos;agit-il ?...]"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_outfit_save_as.xml b/indra/newview/skins/default/xui/fr/floater_outfit_save_as.xml
index d77dfbdf82..72018f5de5 100644
--- a/indra/newview/skins/default/xui/fr/floater_outfit_save_as.xml
+++ b/indra/newview/skins/default/xui/fr/floater_outfit_save_as.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="modal container" title="Enregistrer la tenue">
+<floater name="modal container" title="SAUVEGARDER LA TENUE">
<button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
<button label="Annuler" label_selected="Annuler" name="Cancel"/>
<text name="Save item as:">
diff --git a/indra/newview/skins/default/xui/fr/floater_people.xml b/indra/newview/skins/default/xui/fr/floater_people.xml
new file mode 100644
index 0000000000..58701c06b2
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_people.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_people" title="PERSONNES">
+ <panel_container name="main_panel">
+ <panel label="Profil du groupe" name="panel_group_info_sidetray"/>
+ <panel label="Résidents et objets ignorés" name="panel_block_list_sidetray"/>
+ </panel_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_picks.xml b/indra/newview/skins/default/xui/fr/floater_picks.xml
new file mode 100644
index 0000000000..f058ff668b
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_picks.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_picks" title="Favoris"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_places.xml b/indra/newview/skins/default/xui/fr/floater_places.xml
new file mode 100644
index 0000000000..9e649aca47
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_places.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_places" title="LIEUX">
+ <panel label="Lieux" name="main_panel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_postcard.xml b/indra/newview/skins/default/xui/fr/floater_postcard.xml
index a4b0675fe4..e65dfb09b4 100644
--- a/indra/newview/skins/default/xui/fr/floater_postcard.xml
+++ b/indra/newview/skins/default/xui/fr/floater_postcard.xml
@@ -1,28 +1,21 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Postcard" title="ENVOYER LA PHOTO PAR E-MAIL">
- <text name="to_label" width="135">
+ <text name="to_label">
E-mail du destinataire :
</text>
- <line_editor left="143" name="to_form" width="130" left_delta="146"/>
<text name="from_label">
Votre e-mail :
</text>
- <line_editor left="143" name="from_form" width="130" left_delta="146"/>
<text name="name_label">
Votre nom :
</text>
- <line_editor left="143" name="name_form" width="130" left_delta="146"/>
<text name="subject_label">
Objet :
</text>
- <line_editor left="143" name="subject_form" width="130" left_delta="146"/>
<line_editor label="Saisir ici votre objet" name="subject_form"/>
<text name="msg_label">
Message :
</text>
- <check_box label="Publier sur le web" name="allow_publish_check" tool_tip="Publiez cette carte postale sur le web."/>
- <check_box label="Contenu adulte" name="mature_check" tool_tip="Cette carte postale est à caractère adulte."/>
- <button label="?" name="publish_help_btn"/>
<text_editor name="msg_form">
Saisir ici votre message
</text_editor>
diff --git a/indra/newview/skins/default/xui/fr/floater_preferences.xml b/indra/newview/skins/default/xui/fr/floater_preferences.xml
index 052e43388b..0f9fb1334b 100644
--- a/indra/newview/skins/default/xui/fr/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/fr/floater_preferences.xml
@@ -5,10 +5,12 @@
<tab_container name="pref core">
<panel label="Général" name="general"/>
<panel label="Graphiques" name="display"/>
- <panel label="Confidentialité" name="im"/>
<panel label="Son et Média" name="audio"/>
<panel label="Chat" name="chat"/>
+ <panel label="Affichage/Déplacement" name="move"/>
<panel label="Notifications" name="msgs"/>
+ <panel label="Couleurs" name="colors"/>
+ <panel label="Confidentialité" name="im"/>
<panel label="Configuration" name="input"/>
<panel label="Avancées" name="advanced1"/>
</tab_container>
diff --git a/indra/newview/skins/default/xui/fr/floater_preferences_proxy.xml b/indra/newview/skins/default/xui/fr/floater_preferences_proxy.xml
new file mode 100644
index 0000000000..020bdf928b
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_preferences_proxy.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Proxy Settings Floater" title="Paramètres de proxy">
+ <check_box initial_value="false" label="Utiliser le proxy HTTP pour les pages Web" name="web_proxy_enabled"/>
+ <text name="http_proxy_label">
+ Proxy HTTP :
+ </text>
+ <line_editor name="web_proxy_editor" tool_tip="Nom DNS ou adresse IP du proxy HTTP que vous souhaitez utiliser."/>
+ <spinner label="Numéro de port :" name="web_proxy_port" tool_tip="Port du proxy HTTP que vous souhaitez utiliser."/>
+ <check_box label="Utiliser le proxy SOCKS 5 pour le trafic UDP" name="socks_proxy_enabled"/>
+ <text name="socks5_proxy_label">
+ Proxy SOCKS 5 :
+ </text>
+ <line_editor name="socks_proxy_editor" tool_tip="Nom DNS ou adresse IP du proxy SOCKS 5 que vous souhaitez utiliser."/>
+ <spinner label="Numéro de port :" name="socks_proxy_port" tool_tip="Port du proxy SOCKS 5 que vous souhaitez utiliser."/>
+ <text name="socks_auth_label">
+ Authentification SOCKS :
+ </text>
+ <radio_group name="socks5_auth_type">
+ <radio_item label="Aucune authentification" name="Socks5NoAuth" tool_tip="Aucune authentification requise pour le proxy SOCKS 5." value="Aucune"/>
+ <radio_item label="Nom d&apos;utilisateur/Mot de passe" name="Socks5UserPass" tool_tip="Authentification par nom d&apos;utilisateur/mot de passe requise pour le proxy SOCKS 5." value="UserPass"/>
+ </radio_group>
+ <text name="socks5_username_label">
+ Nom d&apos;utilisateur :
+ </text>
+ <text name="socks5_password_label">
+ Mot de passe :
+ </text>
+ <line_editor name="socks5_username" tool_tip="Nom d&apos;utilisateur d&apos;authentification avec votre serveur SOCKS 5."/>
+ <line_editor name="socks5_password" tool_tip="Mot de passe d&apos;authentification avec votre serveur SOCKS 5."/>
+ <text name="other_proxy_label">
+ Autre proxy de trafic HTTP :
+ </text>
+ <radio_group name="other_http_proxy_type">
+ <radio_item label="Pas de proxy" name="OtherNoProxy" tool_tip="Le trafic HTTP hors Web ne sera PAS envoyé à un proxy." value="Aucun"/>
+ <radio_item label="Utiliser le proxy HTTP" name="OtherHTTPProxy" tool_tip="Le trafic HTTP hors Web sera envoyé via le proxy Web configuré." value="Web"/>
+ <radio_item label="Utiliser le proxy SOCKS 5" name="OtherSocksProxy" tool_tip="Le trafic HTTP hors Web sera envoyé via le proxy SOCKS 5 configuré." value="Socks"/>
+ </radio_group>
+ <button label="OK" label_selected="OK" name="OK"/>
+ <button label="Annuler" label_selected="Annuler" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_preview_animation.xml b/indra/newview/skins/default/xui/fr/floater_preview_animation.xml
index b14aecafbb..f2cb1d5e70 100644
--- a/indra/newview/skins/default/xui/fr/floater_preview_animation.xml
+++ b/indra/newview/skins/default/xui/fr/floater_preview_animation.xml
@@ -6,6 +6,6 @@
<text name="desc txt">
Description :
</text>
- <button label="Jouer dans Second Life" label_selected="Stop" left="20" name="Anim play btn" tool_tip="Lire cette animation de façon à ce que les autres puissent la voir" width="131"/>
- <button label="Jouer localement" label_selected="Stop" left="162" name="Anim audition btn" tool_tip="Lire cette animation de façon à ce que vous soyez la seule personne à pouvoir la voir" width="125"/>
+ <button label="Exécuter dans Second Life" label_selected="Arrêter" name="Inworld" tool_tip="Lire cette animation de façon à ce que les autres la voient."/>
+ <button label="Exécuter localement" label_selected="Arrêter" name="Locally" tool_tip="Lire cette animation de façon à ce que vous soyez la seule personne à la voir."/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_preview_gesture.xml b/indra/newview/skins/default/xui/fr/floater_preview_gesture.xml
index 7828d2df97..6287f10f3e 100644
--- a/indra/newview/skins/default/xui/fr/floater_preview_gesture.xml
+++ b/indra/newview/skins/default/xui/fr/floater_preview_gesture.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="gesture_preview">
<floater.string name="step_anim">
- Animation à jouer :
+ Animation à exécuter :
</floater.string>
<floater.string name="step_sound">
Son à lire :
diff --git a/indra/newview/skins/default/xui/fr/floater_price_for_listing.xml b/indra/newview/skins/default/xui/fr/floater_price_for_listing.xml
new file mode 100644
index 0000000000..a6e598dd2b
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_price_for_listing.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="price_for_listing" title="PUBLIER UNE PETITE ANNONCE">
+ <text name="explanation_text">
+ Votre petite annonce sera visible pendant une semaine à partir du jour de sa publication.
+
+La position de votre annonce dans les listes dépend du montant que vous décidez de payer.
+
+Si vous choisissez de payer plus cher, votre publicité sera plus visible dans les résultats de recherche.
+ </text>
+ <text name="price_text">
+ Coût de l&apos;annonce :
+ </text>
+ <text name="price_symbol">
+ L$
+ </text>
+ <button label="OK" name="set_price_btn"/>
+ <button label="Annuler" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_region_debug_console.xml b/indra/newview/skins/default/xui/fr/floater_region_debug_console.xml
new file mode 100644
index 0000000000..1747155b60
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_region_debug_console.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="region_debug_console" title="Débogage de région"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_search.xml b/indra/newview/skins/default/xui/fr/floater_search.xml
index 672024466a..32800182ea 100644
--- a/indra/newview/skins/default/xui/fr/floater_search.xml
+++ b/indra/newview/skins/default/xui/fr/floater_search.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_search" title="RECHERCHER">
+<floater name="floater_search" title="">
<floater.string name="loading_text">
Chargement...
</floater.string>
diff --git a/indra/newview/skins/default/xui/fr/floater_sell_land.xml b/indra/newview/skins/default/xui/fr/floater_sell_land.xml
index b5ffc8f9c7..c5fb0ea0d4 100644
--- a/indra/newview/skins/default/xui/fr/floater_sell_land.xml
+++ b/indra/newview/skins/default/xui/fr/floater_sell_land.xml
@@ -5,16 +5,16 @@
<text name="info_parcel_label">
Parcelle :
</text>
- <text name="info_parcel" left="70">
+ <text name="info_parcel">
NOM DE LA PARCELLE
</text>
<text name="info_size_label">
Taille :
</text>
- <text name="info_size" left="70">
+ <text name="info_size">
[AREA] m²
</text>
- <text bottom_delta="-60" name="info_action">
+ <text name="info_action">
Pour vendre cette parcelle :
</text>
<text name="price_label">
@@ -38,27 +38,27 @@
<text name="sell_to_text">
Vendez votre terrain à n&apos;importe qui ou uniquement à un acheteur spécifique.
</text>
- <combo_box bottom_delta="-32" name="sell_to">
+ <combo_box name="sell_to">
<combo_box.item label="- Sélectionnez -" name="--selectone--"/>
<combo_box.item label="Tout le monde" name="Anyone"/>
<combo_box.item label="Personne spécifique :" name="Specificuser:"/>
</combo_box>
- <button label="Sélectionner" name="sell_to_select_agent" width="100"/>
+ <button label="Sélectionner" name="sell_to_select_agent"/>
<text name="sell_objects_label">
3. Vendre les objets avec ce terrain ?
</text>
<text name="sell_objects_text">
Les objets transférables se trouvant sur la parcelle changeront de propriétaire.
</text>
- <radio_group bottom_delta="-54" name="sell_objects" right="430">
+ <radio_group name="sell_objects">
<radio_item label="Non, rester le propriétaire des objets" name="no"/>
<radio_item label="Oui, vendre les objets avec le terrain" name="yes"/>
</radio_group>
- <button label="Afficher les objets" name="show_objects" right="420" width="120"/>
- <text bottom_delta="-30" name="nag_message_label">
+ <button label="Afficher les objets" name="show_objects"/>
+ <text name="nag_message_label" font="SansSerif">
Rappel : Toutes les ventes sont définitives.
</text>
- <button label="Indiquer le terrain à vendre" name="sell_btn" width="165"/>
+ <button label="Indiquer le terrain à vendre" name="sell_btn"/>
<button label="Annuler" name="cancel_btn"/>
</panel>
</scroll_container>
diff --git a/indra/newview/skins/default/xui/fr/floater_snapshot.xml b/indra/newview/skins/default/xui/fr/floater_snapshot.xml
index 34d0957b46..9244051edc 100644
--- a/indra/newview/skins/default/xui/fr/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/fr/floater_snapshot.xml
@@ -1,75 +1,65 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Snapshot" title="APERÇU DE LA PHOTO" width="247">
+<floater name="Snapshot" title="APERÇU DE LA PHOTO">
<floater.string name="unknown">
inconnu
</floater.string>
- <radio_group label="Type de photo" name="snapshot_type_radio">
- <radio_item label="E-mail" name="postcard"/>
- <radio_item label="Mon inventaire ([AMOUNT] L$)" name="texture"/>
- <radio_item label="Enregistrer sur mon ordinateur" name="local"/>
- </radio_group>
+ <string name="postcard_progress_str">
+ Envoi par e-mail
+ </string>
+ <string name="profile_progress_str">
+ Publication
+ </string>
+ <string name="inventory_progress_str">
+ Enregistrement dans l&apos;inventaire
+ </string>
+ <string name="local_progress_str">
+ Enregistrement sur l&apos;ordinateur
+ </string>
+ <string name="profile_succeeded_str">
+ Image chargée
+ </string>
+ <string name="postcard_succeeded_str">
+ Envoi par e-mail effectué !
+ </string>
+ <string name="inventory_succeeded_str">
+ Enregistrement dans l&apos;inventaire effectué !
+ </string>
+ <string name="local_succeeded_str">
+ Enregistrement sur l&apos;ordinateur effectué !
+ </string>
+ <string name="profile_failed_str">
+ Échec de chargement de l&apos;image sur le flux de votre profil.
+ </string>
+ <string name="postcard_failed_str">
+ Échec d&apos;envoi par e-mail.
+ </string>
+ <string name="inventory_failed_str">
+ Échec d&apos;enregistrement dans l&apos;inventaire.
+ </string>
+ <string name="local_failed_str">
+ Échec d&apos;enregistrement sur l&apos;ordinateur.
+ </string>
+ <button name="advanced_options_btn" tool_tip="Options avancées"/>
+ <text name="image_res_text">
+ [WIDTH] x [HEIGHT] px
+ </text>
<text name="file_size_label">
[SIZE] Ko
</text>
- <button label="Rafraîchir" name="new_snapshot_btn"/>
- <button label="Envoyer" name="send_btn"/>
- <button label="Enreg. ([AMOUNT] L$)" name="upload_btn"/>
- <flyout_button label="Enregistrer" name="save_btn" tool_tip="Enregistrer l&apos;image sous forme de fichier">
- <flyout_button.item label="Enregistrer" name="save_item"/>
- <flyout_button.item label="Enregistrer sous..." name="saveas_item"/>
- </flyout_button>
- <button label="Plus" name="more_btn" tool_tip="Options avancées"/>
- <button label="Moins" name="less_btn" tool_tip="Options avancées"/>
- <button label="Annuler" name="discard_btn"/>
- <text name="type_label2">
- Taille
- </text>
- <text name="format_label">
- Format
- </text>
- <combo_box label="Résolution" name="postcard_size_combo">
- <combo_box.item label="Fenêtre actuelle" name="CurrentWindow"/>
- <combo_box.item label="640 x 480" name="640x480"/>
- <combo_box.item label="800 x 600" name="800x600"/>
- <combo_box.item label="1 024 x 768" name="1024x768"/>
- <combo_box.item label="Personnalisée" name="Custom"/>
- </combo_box>
- <combo_box label="Résolution" name="texture_size_combo">
- <combo_box.item label="Fenêtre actuelle" name="CurrentWindow"/>
- <combo_box.item label="Petite (128 x 128)" name="Small(128x128)"/>
- <combo_box.item label="Moyenne (256 x 256)" name="Medium(256x256)"/>
- <combo_box.item label="Grande (512 x 512)" name="Large(512x512)"/>
- <combo_box.item label="Personnalisée" name="Custom"/>
- </combo_box>
- <combo_box label="Résolution" name="local_size_combo">
- <combo_box.item label="Fenêtre actuelle" name="CurrentWindow"/>
- <combo_box.item label="320 x 240" name="320x240"/>
- <combo_box.item label="640 x 480" name="640x480"/>
- <combo_box.item label="800 x 600" name="800x600"/>
- <combo_box.item label="1 024 x 768" name="1024x768"/>
- <combo_box.item label="1 280 x 1 024" name="1280x1024"/>
- <combo_box.item label="1 600 x 1 200" name="1600x1200"/>
- <combo_box.item label="Personnalisée" name="Custom"/>
- </combo_box>
- <combo_box label="Format" name="local_format_combo">
- <combo_box.item label="PNG" name="PNG"/>
- <combo_box.item label="JPEG" name="JPEG"/>
- <combo_box.item label="BMP" name="BMP"/>
- </combo_box>
- <spinner label="Larg." name="snapshot_width"/>
- <spinner label="Haut." name="snapshot_height"/>
- <check_box label="Contraindre les proportions" name="keep_aspect_check"/>
- <slider label="Qualité de l&apos;image" name="image_quality_slider"/>
- <text name="layer_type_label">
- Capturer :
- </text>
- <combo_box label="Couches d&apos;images" name="layer_types">
- <combo_box.item label="Couleurs" name="Colors"/>
- <combo_box.item label="Profondeur" name="Depth"/>
- </combo_box>
- <check_box label="Interface" name="ui_check"/>
- <check_box label="HUD" name="hud_check"/>
- <check_box label="Garder ouvert après enregistrement" name="keep_open_check"/>
- <check_box label="Arrêt sur image (plein écran)" name="freeze_frame_check"/>
- <check_box label="Actualisation automatique" name="auto_snapshot_check"/>
+ <panel name="advanced_options_panel">
+ <text name="advanced_options_label">
+ OPTIONS AVANCÉES
+ </text>
+ <text name="layer_type_label">
+ Capturer :
+ </text>
+ <combo_box label="Couches d&apos;images" name="layer_types">
+ <combo_box.item label="Couleurs" name="Colors"/>
+ <combo_box.item label="Profondeur" name="Depth"/>
+ </combo_box>
+ <check_box label="Interface" name="ui_check"/>
+ <check_box label="HUD" name="hud_check"/>
+ <check_box label="Arrêt sur image (plein écran)" name="freeze_frame_check"/>
+ <check_box label="Actualisation automatique" name="auto_snapshot_check"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_sound_devices.xml b/indra/newview/skins/default/xui/fr/floater_sound_devices.xml
new file mode 100644
index 0000000000..080ade9dd4
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_sound_devices.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_sound_devices" title="PERIPHERIQUES AUDIO">
+ <text name="voice_label">
+ Chat vocal
+ </text>
+ <check_box label="Activé" name="enable_voice"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_stats.xml b/indra/newview/skins/default/xui/fr/floater_stats.xml
index 3c19bb2608..2ce2e6dcd5 100644
--- a/indra/newview/skins/default/xui/fr/floater_stats.xml
+++ b/indra/newview/skins/default/xui/fr/floater_stats.xml
@@ -10,8 +10,8 @@
</stat_view>
<stat_view label="Avancées" name="advanced">
<stat_view label="Rendu" name="render">
- <stat_bar label="KTris Drawn" name="ktrisframe"/>
- <stat_bar label="KTris Drawn" name="ktrissec"/>
+ <stat_bar label="KTris par image" name="ktrisframe"/>
+ <stat_bar label="KTris par s" name="ktrissec"/>
<stat_bar label="Objets totaux" name="objs"/>
<stat_bar label="Nouveaux objets" name="newobjs"/>
</stat_view>
@@ -32,13 +32,13 @@
<stat_bar label="Couches" name="layerskbitstat"/>
<stat_bar label="Arrivés" name="actualinkbitstat"/>
<stat_bar label="Sortis" name="actualoutkbitstat"/>
- <stat_bar label="Ops VFS en attente" name="vfspendingoperations"/>
+ <stat_bar label="Opérations VFS en attente" name="vfspendingoperations"/>
</stat_view>
</stat_view>
<stat_view label="Simulateur" name="sim">
<stat_bar label="Dilatation temporelle" name="simtimedilation"/>
<stat_bar label="FPS sim" name="simfps"/>
- <stat_bar label="Propriétés physiques FPS" name="simphysicsfps"/>
+ <stat_bar label="FPS physique" name="simphysicsfps"/>
<stat_view label="Détails des propriétés physiques" name="physicsdetail">
<stat_bar label="Objets fixés" name="physicspinnedtasks"/>
<stat_bar label="Objets LOD faibles" name="physicslodtasks"/>
@@ -53,17 +53,25 @@
<stat_bar label="Événements de scripts" name="simscripteps"/>
<stat_bar label="Paquets en entrée" name="siminpps"/>
<stat_bar label="Paquets en sortie" name="simoutpps"/>
- <stat_bar label="En attente des téléchargements" name="simpendingdownloads"/>
- <stat_bar label="En attente des chargements" name="simpendinguploads"/>
+ <stat_bar label="Téléchargements en attente" name="simpendingdownloads"/>
+ <stat_bar label="Chargements en attente" name="simpendinguploads"/>
<stat_bar label="Total Unacked Bytes" name="simtotalunackedbytes"/>
<stat_view label="Temps (ms)" name="simperf">
- <stat_bar label="Durée du cadre totale" name="simframemsec"/>
+ <stat_bar label="Durée totale de l'image" name="simframemsec"/>
<stat_bar label="Durée nette" name="simnetmsec"/>
- <stat_bar label="Durée physique" name="simsimphysicsmsec"/>
- <stat_bar label="Durée de la simulation" name="simsimothermsec"/>
- <stat_bar label="Durée de l&apos;avatar" name="simagentmsec"/>
+ <stat_bar label="Durée sim (physique)" name="simsimphysicsmsec"/>
+ <stat_bar label="Durée sim (autre)" name="simsimothermsec"/>
+ <stat_bar label="Durée des avatars" name="simagentmsec"/>
<stat_bar label="Durée des images" name="simimagesmsec"/>
- <stat_bar label="Durée du script" name="simscriptmsec"/>
+ <stat_bar label="Durée des scripts" name="simscriptmsec"/>
+ <stat_bar label="Temps d&apos;inactivité" name="simsparemsec"/>
+ <stat_view label="Détails Temps (ms)" name="timedetails">
+ <stat_bar label="Etape propr. physiques" name="simsimphysicsstepmsec"/>
+ <stat_bar label="Mettre à jour les formes phys" name="simsimphysicsshapeupdatemsec"/>
+ <stat_bar label="Propriétés physiques Autre" name="simsimphysicsothermsec"/>
+ <stat_bar label="Temps de sommeil" name="simsleepmsec"/>
+ <stat_bar label="Pump IO" name="simpumpiomsec"/>
+ </stat_view>
</stat_view>
</stat_view>
</container_view>
diff --git a/indra/newview/skins/default/xui/fr/floater_test_layout_stacks.xml b/indra/newview/skins/default/xui/fr/floater_test_layout_stacks.xml
new file mode 100644
index 0000000000..b479d5f6d6
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_test_layout_stacks.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Test Floater" title="LAYOUTSTACK TESTS"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_test_text_vertical_aligment.xml b/indra/newview/skins/default/xui/fr/floater_test_text_vertical_aligment.xml
new file mode 100644
index 0000000000..702170ef52
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_test_text_vertical_aligment.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Test Floater" title="FLOATER TEST"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_tools.xml b/indra/newview/skins/default/xui/fr/floater_tools.xml
index 46a27e960c..e21c6f4c08 100644
--- a/indra/newview/skins/default/xui/fr/floater_tools.xml
+++ b/indra/newview/skins/default/xui/fr/floater_tools.xml
@@ -1,5 +1,20 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="toolbox floater" short_title="OUTILS POUR LA CONSTRUCTION" title="">
+ <floater.string name="grid_screen_text">
+ Écran
+ </floater.string>
+ <floater.string name="grid_local_text">
+ Local
+ </floater.string>
+ <floater.string name="grid_world_text">
+ Monde
+ </floater.string>
+ <floater.string name="grid_reference_text">
+ Référence
+ </floater.string>
+ <floater.string name="grid_attachment_text">
+ Élément attaché
+ </floater.string>
<floater.string name="status_rotate">
Pour faire tourner l&apos;objet, faites glisser les bandes de couleur.
</floater.string>
@@ -24,20 +39,11 @@
<floater.string name="status_selectland">
Cliquez et faites glisser pour sélectionner le terrain.
</floater.string>
- <floater.string name="grid_screen_text">
- Écran
+ <floater.string name="status_selectcount">
+ [OBJ_COUNT] objets sélectionnés, impact sur le terrain [LAND_IMPACT]
</floater.string>
- <floater.string name="grid_local_text">
- Local
- </floater.string>
- <floater.string name="grid_world_text">
- Monde
- </floater.string>
- <floater.string name="grid_reference_text">
- Référence
- </floater.string>
- <floater.string name="grid_attachment_text">
- Pièce jointe
+ <floater.string name="status_remaining_capacity">
+ Capacité restante [LAND_CAPACITY].
</floater.string>
<button label="" label_selected="" name="button focus" tool_tip="Mise au point"/>
<button label="" label_selected="" name="button move" tool_tip="Déplacer"/>
@@ -64,21 +70,20 @@
<radio_item label="Choisir une face" name="radio select face"/>
</radio_group>
<check_box label="Modification liée" name="checkbox edit linked parts"/>
- <text name="RenderingCost" tool_tip="Affiche le coût du rendu calculé pour cet objet">
- þ : [COUNT]
- </text>
+ <button label="Lien" name="link_btn"/>
+ <button label="Annuler le lien" name="unlink_btn"/>
<check_box label="" name="checkbox uniform"/>
<text label="Étirer les deux côtés" name="checkbox uniform label">
Étirer les deux côtés
</text>
<check_box initial_value="true" label="Étirer les textures" name="checkbox stretch textures"/>
- <check_box initial_value="true" label="Fixer sur la grille" name="checkbox snap to grid"/>
- <combo_box name="combobox grid mode" tool_tip="Choisissez le type d&apos;axe de grille pour le positionnement de l&apos;objet">
- <combo_box.item label="Grille du monde" name="World"/>
- <combo_box.item label="Grille locale" name="Local"/>
- <combo_box.item label="Grille de référence" name="Reference"/>
+ <check_box initial_value="true" label="Fixer" name="checkbox snap to grid"/>
+ <combo_box name="combobox grid mode" tool_tip="Choisir le type d&apos;axe de grille pour le positionnement de l&apos;objet.">
+ <combo_box.item label="Monde" name="World"/>
+ <combo_box.item label="Local" name="Local"/>
+ <combo_box.item label="Référence" name="Reference"/>
</combo_box>
- <button label="Options..." label_selected="Options..." name="Options..." tool_tip="Afficher d&apos;autres options de grille"/>
+ <button label="" label_selected="Options..." name="Options..." tool_tip="Afficher d&apos;autres options de grille"/>
<button label="" label_selected="" name="ToolCube" tool_tip="Cube"/>
<button label="" label_selected="" name="ToolPrism" tool_tip="Prisme droit"/>
<button label="" label_selected="" name="ToolPyramid" tool_tip="Pyramide"/>
@@ -117,11 +122,11 @@
Force
</text>
<button label="Appliquer" label_selected="Appliquer" left="176" name="button apply to selection" tool_tip="Modifier le terrain sélectionné"/>
- <text name="obj_count">
- Objets : [COUNT]
+ <text name="selection_empty">
+ Aucune sélection effectuée.
</text>
- <text name="prim_count">
- Prims : [COUNT]
+ <text name="remaining_capacity">
+ [CAPACITY_STRING] [secondlife:///app/openfloater/object_weights Plus d&apos;infos]
</text>
<tab_container name="Object Info Tabs">
<panel label="Général" name="General">
@@ -170,15 +175,9 @@
<text name="Creator:">
Créateur :
</text>
- <text name="Creator Name">
- Mrs. Esbee Linden (esbee.linden)
- </text>
<text name="Owner:">
Propriétaire :
</text>
- <text name="Owner Name">
- Mrs. Erica &quot;Moose&quot; Linden (erica.linden)
- </text>
<text name="Group:">
Groupe :
</text>
@@ -273,15 +272,6 @@
<combo_box.item label="Anneau" name="Ring"/>
<combo_box.item label="Sculptie" name="Sculpted"/>
</combo_box>
- <combo_box name="material">
- <combo_box.item label="Pierre" name="Stone"/>
- <combo_box.item label="Métal" name="Metal"/>
- <combo_box.item label="Verre" name="Glass"/>
- <combo_box.item label="Bois" name="Wood"/>
- <combo_box.item label="Chair" name="Flesh"/>
- <combo_box.item label="Plastique" name="Plastic"/>
- <combo_box.item label="Caoutchouc" name="Rubber"/>
- </combo_box>
<text name="text cut">
Découpe du tracé (déb./fin)
</text>
@@ -349,7 +339,6 @@
Type de raccord
</text>
<combo_box name="sculpt type control">
- <combo_box.item label="(aucun)" name="None"/>
<combo_box.item label="Sphère" name="Sphere"/>
<combo_box.item label="Tore" name="Torus"/>
<combo_box.item label="Plan" name="Plane"/>
@@ -357,6 +346,15 @@
</combo_box>
</panel>
<panel label="Attributs" name="Features">
+ <panel.string name="None">
+ Aucun
+ </panel.string>
+ <panel.string name="Prim">
+ Prim
+ </panel.string>
+ <panel.string name="Convex Hull">
+ Enveloppe convexe
+ </panel.string>
<text name="select_single">
Choisir une prim pour changer les attributs.
</text>
@@ -381,6 +379,23 @@
<spinner label="Point central" name="Light Focus"/>
<spinner label="Atténuation" name="Light Falloff"/>
<spinner label="Ambiance" name="Light Ambiance"/>
+ <text name="label physicsshapetype">
+ Type de forme physique :
+ </text>
+ <combo_box name="Physics Shape Type Combo Ctrl" tool_tip="Choisir un type de forme physique."/>
+ <combo_box name="material">
+ <combo_box.item label="Pierre" name="Stone"/>
+ <combo_box.item label="Métal" name="Metal"/>
+ <combo_box.item label="Verre" name="Glass"/>
+ <combo_box.item label="Bois" name="Wood"/>
+ <combo_box.item label="Chair" name="Flesh"/>
+ <combo_box.item label="Plastique" name="Plastic"/>
+ <combo_box.item label="Caoutchouc" name="Rubber"/>
+ </combo_box>
+ <spinner label="Gravité" name="Physics Gravity"/>
+ <spinner label="Friction" name="Physics Friction"/>
+ <spinner label="Densité en 100 kg/m^3" name="Physics Density"/>
+ <spinner label="Restitution" name="Physics Restitution"/>
</panel>
<panel label="Texture" name="Texture">
<panel.string name="string repeats per meter">
diff --git a/indra/newview/skins/default/xui/fr/floater_tos.xml b/indra/newview/skins/default/xui/fr/floater_tos.xml
index 8a2a1e1d25..6d58cf77ca 100644
--- a/indra/newview/skins/default/xui/fr/floater_tos.xml
+++ b/indra/newview/skins/default/xui/fr/floater_tos.xml
@@ -4,7 +4,7 @@
http://secondlife.com/app/tos/
</floater.string>
<floater.string name="loading_url">
- data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Loading %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
+ data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Chargement %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3Eles%20Conditions%20d%27utilisation%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
</floater.string>
<button label="Continuer" label_selected="Continuer" name="Continue"/>
<button label="Annuler" label_selected="Annuler" name="Cancel"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_toybox.xml b/indra/newview/skins/default/xui/fr/floater_toybox.xml
new file mode 100644
index 0000000000..f99d3d30b5
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_toybox.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Toybox" title="BOUTONS DES BARRES D&apos;OUTILS">
+ <text name="toybox label 1">
+ Ajouter ou supprimer des boutons : les faire glisser vers ou depuis les barres d&apos;outils.
+ </text>
+ <text name="toybox label 2">
+ Ils s&apos;afficheront comme indiqué ou comme des icônes, selon les paramètres de barre d&apos;outils.
+ </text>
+ <button label="Effacer tout" label_selected="Effacer tout" name="btn_clear_all"/>
+ <button label="Valeurs par défaut" label_selected="Valeurs par défaut" name="btn_restore_defaults"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_translation_settings.xml b/indra/newview/skins/default/xui/fr/floater_translation_settings.xml
new file mode 100644
index 0000000000..c7582f110f
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_translation_settings.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_translation_settings" title="TRADUCTION AUTOMATIQUE">
+ <string name="bing_api_key_not_verified">
+ ID d&apos;application Bing non vérifié. Veuillez réessayer.
+ </string>
+ <string name="google_api_key_not_verified">
+ Clé d&apos;API Google non vérifiée. Veuillez réessayer.
+ </string>
+ <string name="bing_api_key_verified">
+ ID d&apos;application Bing vérifié.
+ </string>
+ <string name="google_api_key_verified">
+ Clé d&apos;API Google vérifiée.
+ </string>
+ <check_box label="Activer la traduction automatique lors des chats" name="translate_chat_checkbox"/>
+ <text name="translate_language_label">
+ Traduire les chats en :
+ </text>
+ <combo_box name="translate_language_combo">
+ <combo_box.item label="Langue système par défaut" name="System Default Language"/>
+ <combo_box.item label="English (Anglais)" name="English"/>
+ <combo_box.item label="Dansk (Danois)" name="Danish"/>
+ <combo_box.item label="Deutsch (Allemand)" name="German"/>
+ <combo_box.item label="Español (Espagnol)" name="Spanish"/>
+ <combo_box.item label="Français" name="French"/>
+ <combo_box.item label="Italiano (Italien)" name="Italian"/>
+ <combo_box.item label="Magyar (Hongrois)" name="Hungarian"/>
+ <combo_box.item label="Nederlands (Néerlandais)" name="Dutch"/>
+ <combo_box.item label="Polski (Polonais)" name="Polish"/>
+ <combo_box.item label="Português (Portugais)" name="Portugese"/>
+ <combo_box.item label="РуÑÑкий (Russe)" name="Russian"/>
+ <combo_box.item label="Türkçe (Turc)" name="Turkish"/>
+ <combo_box.item label="УкраїнÑька (Ukrainien)" name="Ukrainian"/>
+ <combo_box.item label="中文 (正體) (Chinois)" name="Chinese"/>
+ <combo_box.item label="日本語 (Japonais)" name="Japanese"/>
+ <combo_box.item label="한국어 (Coréen)" name="Korean"/>
+ </combo_box>
+ <text name="tip">
+ Choisir le service à utiliser :
+ </text>
+ <radio_group name="translation_service_rg">
+ <radio_item initial_value="bing" label="Bing Translator" name="bing"/>
+ <radio_item initial_value="google" label="Google Translate" name="google"/>
+ </radio_group>
+ <text name="bing_api_key_label">
+ [http://www.bing.com/developers/createapp.aspx ID d&apos;application] Bing :
+ </text>
+ <button label="Vérifier" name="verify_bing_api_key_btn"/>
+ <text name="google_api_key_label">
+ [http://code.google.com/apis/language/translate/v2/getting_started.html#auth Clé d&apos;API] Google :
+ </text>
+ <button label="Vérifier" name="verify_google_api_key_btn"/>
+ <text name="google_links_text">
+ [http://code.google.com/apis/language/translate/v2/pricing.html Tarification] | [https://code.google.com/apis/console Statistiques]
+ </text>
+ <button label="OK" name="ok_btn"/>
+ <button label="Annuler" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_voice_controls.xml b/indra/newview/skins/default/xui/fr/floater_voice_controls.xml
index d4f07a0a25..fc4de4a5a6 100644
--- a/indra/newview/skins/default/xui/fr/floater_voice_controls.xml
+++ b/indra/newview/skins/default/xui/fr/floater_voice_controls.xml
@@ -1,16 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_voice_controls" title="Contrôles vocaux">
+<floater name="floater_voice_controls" title="CONTROLES DE LA VOIX">
<string name="title_nearby">
- CHAT VOCAL PRÈS DE VOUS
+ PARAMÈTRES VOCAUX
</string>
<string name="title_group">
- Appel de groupe avec [GROUP]
+ APPEL DE GROUPE AVEC [GROUP]
</string>
<string name="title_adhoc">
- Téléconférence
+ CONFÉRENCE
</string>
<string name="title_peer_2_peer">
- Appel avec [NAME]
+ APPEL AVEC [NAME]
</string>
<string name="no_one_near">
Il n&apos;y a personne près de vous avec le chat vocal activé
diff --git a/indra/newview/skins/default/xui/fr/floater_voice_effect.xml b/indra/newview/skins/default/xui/fr/floater_voice_effect.xml
index 56cb654440..671fb5c14d 100644
--- a/indra/newview/skins/default/xui/fr/floater_voice_effect.xml
+++ b/indra/newview/skins/default/xui/fr/floater_voice_effect.xml
@@ -12,6 +12,135 @@
<string name="new_voice_effect">
(Nouveau !)
</string>
+ <string name="effect_Arena">
+ Stade
+ </string>
+ <string name="effect_Beast">
+ Brute
+ </string>
+ <string name="effect_Buff">
+ Nasal
+ </string>
+ <string name="effect_Buzz">
+ Friture
+ </string>
+ <string name="effect_Camille">
+ Camille
+ </string>
+ <string name="effect_Creepy">
+ Effrayant
+ </string>
+ <string name="effect_CreepyBot">
+ BotEffrayant
+ </string>
+ <string name="effect_Cyber">
+ Cyber
+ </string>
+ <string name="effect_DeepBot">
+ BotGrave
+ </string>
+ <string name="effect_Demon">
+ Démon
+ </string>
+ <string name="effect_Female Elf">
+ Femme elfe
+ </string>
+ <string name="effect_Flirty">
+ Flirt
+ </string>
+ <string name="effect_Foxy">
+ Séduction
+ </string>
+ <string name="effect_Halloween 2010 Bonus">
+ Halloween_2010_Bonus
+ </string>
+ <string name="effect_Helium">
+ Hélium
+ </string>
+ <string name="effect_Husky">
+ Rauque
+ </string>
+ <string name="effect_Husky Whisper">
+ Murmure rauque
+ </string>
+ <string name="effect_Intercom">
+ Interphone
+ </string>
+ <string name="effect_Julia">
+ Julia
+ </string>
+ <string name="effect_Lo Lilt">
+ Mélodieux
+ </string>
+ <string name="effect_Macho">
+ Macho
+ </string>
+ <string name="effect_Micro">
+ Micro
+ </string>
+ <string name="effect_Mini">
+ Mini
+ </string>
+ <string name="effect_Model">
+ Modèle
+ </string>
+ <string name="effect_Nano">
+ Nano
+ </string>
+ <string name="effect_Nightmare">
+ Cauchemar
+ </string>
+ <string name="effect_PopBot">
+ BotPop
+ </string>
+ <string name="effect_Rachel">
+ Rachel
+ </string>
+ <string name="effect_Radio">
+ Radio
+ </string>
+ <string name="effect_Robot">
+ Robot
+ </string>
+ <string name="effect_Roxanne">
+ Roxanne
+ </string>
+ <string name="effect_Rumble">
+ Grondement
+ </string>
+ <string name="effect_Sabrina">
+ Sabrina
+ </string>
+ <string name="effect_Samantha">
+ Samantha
+ </string>
+ <string name="effect_Sexy">
+ Sexy
+ </string>
+ <string name="effect_Shorty">
+ Petite voix
+ </string>
+ <string name="effect_Smaller">
+ Plus faible
+ </string>
+ <string name="effect_Sneaky">
+ Sournois
+ </string>
+ <string name="effect_Stallion">
+ Étalon
+ </string>
+ <string name="effect_Sultry">
+ Sensuel
+ </string>
+ <string name="effect_Thunder">
+ Tonnerre
+ </string>
+ <string name="effect_Vixen">
+ Mégère
+ </string>
+ <string name="effect_WhinyBot">
+ BotPleurnichard
+ </string>
<text name="preview_text">
Aperçu
</text>
diff --git a/indra/newview/skins/default/xui/fr/floater_water.xml b/indra/newview/skins/default/xui/fr/floater_water.xml
deleted file mode 100644
index 7d1e3cd65c..0000000000
--- a/indra/newview/skins/default/xui/fr/floater_water.xml
+++ /dev/null
@@ -1,70 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Water Floater" title="ÉDITEUR D&apos;EAU AVANCÉ">
- <floater.string name="WLDefaultWaterNames">
- Valeur par défaut:Transparente:Bassin:Trouble:Première plaie:SERPENT !!!:Valdez
- </floater.string>
- <text name="KeyFramePresetsText" width="120">
- Préréglages :
- </text>
- <button label="Nouveau" label_selected="Nouveau" name="WaterNewPreset"/>
- <button label="Enregistrer" label_selected="Enregistrer" left_delta="75" name="WaterSavePreset" width="75"/>
- <button label="Supprimer" label_selected="Supprimer" left_delta="80" name="WaterDeletePreset"/>
- <tab_container name="Water Tabs">
- <panel label="PARAMÈTRES" name="Settings">
- <text name="BHText">
- Couleur du brouillard dans l&apos;eau
- </text>
- <color_swatch left="75" name="WaterFogColor" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/>
- <text name="WaterFogDensText">
- Densité du brouillard
- </text>
- <text name="WaterUnderWaterFogModText">
- Brouillard sous-marin
- </text>
- <text name="BDensText">
- Échelle des vaguelettes
- </text>
- <slider label="1" name="WaterNormalScaleX"/>
- <slider label="2" name="WaterNormalScaleY"/>
- <slider label="3" name="WaterNormalScaleZ"/>
- <text name="HDText">
- Échelle Fresnel
- </text>
- <text name="FresnelOffsetText">
- Décalage Fresnel
- </text>
- <text name="DensMultText">
- Réfraction au-dessus
- </text>
- <text name="WaterScaleBelowText">
- Réfraction en dessous
- </text>
- <text name="MaxAltText">
- Multiplicateur de flou
- </text>
- </panel>
- <panel label="IMAGE" name="Waves">
- <text name="BHText">
- Direction grande vague
- </text>
- <text name="WaterWave1DirXText">
- X
- </text>
- <text name="WaterWave1DirYText">
- Y
- </text>
- <text name="BHText2">
- Direction petite vague
- </text>
- <text name="WaterWave2DirXText">
- X
- </text>
- <text name="WaterWave2DirYText">
- Y
- </text>
- <text name="BHText3">
- Normal Map
- </text>
- </panel>
- </tab_container>
-</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_wearable_save_as.xml b/indra/newview/skins/default/xui/fr/floater_wearable_save_as.xml
deleted file mode 100644
index 5dda347fcf..0000000000
--- a/indra/newview/skins/default/xui/fr/floater_wearable_save_as.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="modal container">
- <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
- <button label="Annuler" label_selected="Annuler" name="Cancel"/>
- <text name="Save item as:">
- Enregistrer l&apos;objet dans mon inventaire comme :
- </text>
- <line_editor name="name ed">
- Nouveau [DESC]
- </line_editor>
-</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_web_content.xml b/indra/newview/skins/default/xui/fr/floater_web_content.xml
new file mode 100644
index 0000000000..65dfafe760
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_web_content.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_web_content" title="">
+ <layout_stack name="stack1">
+ <layout_panel name="nav_controls">
+ <button name="back" tool_tip="Précédente"/>
+ <button name="forward" tool_tip="Suivante"/>
+ <button name="stop" tool_tip="Arrêt de la navigation"/>
+ <button name="reload" tool_tip="Recharger la page"/>
+ <combo_box name="address" tool_tip="Entrer une URL ici"/>
+ <icon name="media_secure_lock_flag" tool_tip="Navigation sécurisée"/>
+ <button name="popexternal" tool_tip="Ouvrir l&apos;URL actuelle dans votre navigateur de bureau"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_windlight_options.xml b/indra/newview/skins/default/xui/fr/floater_windlight_options.xml
deleted file mode 100644
index 657e5f5051..0000000000
--- a/indra/newview/skins/default/xui/fr/floater_windlight_options.xml
+++ /dev/null
@@ -1,189 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="WindLight floater" title="ÉDITEUR DE CIEL AVANCÉ" width="706">
- <text name="KeyFramePresetsText">
- Préréglages :
- </text>
- <button label="Nouveau" label_selected="Nouveau" name="WLNewPreset"/>
- <button label="Enregistrer" label_selected="Enregistrer" left_delta="75" name="WLSavePreset" width="75"/>
- <button label="Supprimer" label_selected="Supprimer" left_delta="80" name="WLDeletePreset"/>
- <button label="Éditeur du cycle du jour" label_selected="Éditeur du cycle du jour" left_delta="95" left_pad="20" name="WLDayCycleMenuButton" width="150"/>
- <tab_container name="WindLight Tabs" width="706">
- <panel label="ATMOSPHÈRE" name="Atmosphere">
- <text name="BHText">
- Bleu de l&apos;horizon
- </text>
- <button label="?" name="WLBlueHorizonHelp"/>
- <text name="BHText2">
- R
- </text>
- <text name="BHText3">
- V
- </text>
- <text name="BHText4">
- B
- </text>
- <text name="BHText5">
- I
- </text>
- <text name="BDensText">
- Quantité de brume
- </text>
- <button label="?" name="WLHazeHorizonHelp"/>
- <text name="BDensText2">
- Densité du bleu
- </text>
- <button label="?" name="WLBlueDensityHelp"/>
- <text name="BHText6">
- R
- </text>
- <text name="BHText7">
- V
- </text>
- <text name="BHText8">
- B
- </text>
- <text name="BHText9">
- I
- </text>
- <text name="HDText">
- Densité de la brume
- </text>
- <button label="?" name="WLHazeDensityHelp"/>
- <text name="DensMultText">
- Multiplicateur de densité
- </text>
- <button label="?" name="WLDensityMultHelp"/>
- <text name="WLDistanceMultText">
- Multiplicateur de distance
- </text>
- <button label="?" name="WLDistanceMultHelp"/>
- <text name="MaxAltText">
- Altitude maximum
- </text>
- <button label="?" name="WLMaxAltitudeHelp"/>
- </panel>
- <panel label="LUMIÈRE" name="Lighting">
- <text name="SLCText">
- Couleur soleil/lune
- </text>
- <button label="?" name="WLSunlightColorHelp"/>
- <text name="BHText">
- R
- </text>
- <text name="BHText2">
- V
- </text>
- <text name="BHText3">
- B
- </text>
- <text name="BHText4">
- I
- </text>
- <text name="TODText">
- Position soleil/lune
- </text>
- <button label="?" name="WLTimeOfDayHelp"/>
- <text name="WLAmbientText">
- Éclairage ambiant
- </text>
- <button label="?" name="WLAmbientHelp"/>
- <text name="BHText5">
- R
- </text>
- <text name="BHText6">
- V
- </text>
- <text name="BHText7">
- B
- </text>
- <text name="BHText8">
- I
- </text>
- <text name="WLEastAngleText">
- Angle du levant
- </text>
- <button label="?" name="WLEastAngleHelp"/>
- <text name="SunGlowText">
- Rayonnement du soleil
- </text>
- <button label="?" name="WLSunGlowHelp"/>
- <slider label="Netteté " name="WLGlowB"/>
- <slider label="Taille " name="WLGlowR"/>
- <text name="SceneGammaText">
- Gamma de la scène
- </text>
- <button label="?" name="WLSceneGammaHelp"/>
- <text name="WLStarText">
- Éclat des étoiles
- </text>
- <button label="?" name="WLStarBrightnessHelp"/>
- </panel>
- <panel label="NUAGES" name="Clouds">
- <text name="WLCloudColorText">
- Couleur des nuages
- </text>
- <button label="?" name="WLCloudColorHelp"/>
- <text name="BHText">
- R
- </text>
- <text name="BHText2">
- V
- </text>
- <text name="BHText3">
- B
- </text>
- <text name="BHText4">
- I
- </text>
- <text name="WLCloudColorText2">
- Nuages XY/densité
- </text>
- <button label="?" name="WLCloudDensityHelp"/>
- <text name="BHText5">
- X
- </text>
- <text name="BHText6">
- Y
- </text>
- <text name="BHText7">
- D
- </text>
- <text name="WLCloudCoverageText">
- Couverture nuageuse
- </text>
- <button label="?" left="407" name="WLCloudCoverageHelp"/>
- <text name="WLCloudScaleText">
- Altitude des nuages
- </text>
- <button label="?" left="407" name="WLCloudScaleHelp"/>
- <text name="WLCloudDetailText">
- Détails nuages (XY/densité)
- </text>
- <button bottom_delta="-2" label="?" left="407" name="WLCloudDetailHelp"/>
- <text name="BHText8">
- X
- </text>
- <text name="BHText9">
- Y
- </text>
- <text name="BHText10">
- D
- </text>
- <text name="WLCloudScrollXText">
- Direction et vitesse X
- </text>
- <button label="?" name="WLCloudScrollXHelp"/>
- <check_box label="Verrouiller" name="WLCloudLockX"/>
- <text name="WLCloudScrollYText">
- Direction et vitesse Y
- </text>
- <button label="?" name="WLCloudScrollYHelp"/>
- <check_box label="Verrouiller" name="WLCloudLockY"/>
- <check_box label="Nuages classiques" name="DrawClassicClouds"/>
- <button label="?" name="WLClassicCloudsHelp"/>
- </panel>
- </tab_container>
- <string name="WLDefaultSkyNames">
- A-Minuit:A-Midi:A-3h:A-15h:A-16h30:A-6h:A-18h:A-9h:A-21h:Barcelone:Blizzard:Bleu mi-journée:Après-midi sur la côte:Coucher de soleil (côte):Valeur par défaut:Coucher de soleil (désert):Belle journée:Gros nuages floconneux:Brumeux:Funky Funky:Funky Funky Funky:Gelatto:Fantôme:Vérités incohérentes:Mi-journée 1:Mi-journée 2:Mi-journée 3:Mi-journée 4:Nuit:Pirate:Mauve:Rêve de navigateur:Sensualité pure
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/fr/inspect_avatar.xml b/indra/newview/skins/default/xui/fr/inspect_avatar.xml
index f34ca1f8dd..553646f8e9 100644
--- a/indra/newview/skins/default/xui/fr/inspect_avatar.xml
+++ b/indra/newview/skins/default/xui/fr/inspect_avatar.xml
@@ -10,9 +10,6 @@
<string name="Details">
[SL_PROFILE]
</string>
- <text name="user_name_small" value="Grumpity ProductEngine with a long name"/>
- <text name="user_name" value="Grumpity ProductEngine"/>
- <text name="user_slid" value="james.linden"/>
<text name="user_subtitle" value="11 mois, 3 jours"/>
<text name="user_details">
This is my second life description and I really think it is great. But for some reason my description is super extra long because I like to talk a whole lot
diff --git a/indra/newview/skins/default/xui/fr/inspect_group.xml b/indra/newview/skins/default/xui/fr/inspect_group.xml
index 4519c380c5..e8c528c1ac 100644
--- a/indra/newview/skins/default/xui/fr/inspect_group.xml
+++ b/indra/newview/skins/default/xui/fr/inspect_group.xml
@@ -16,9 +16,6 @@
<string name="YouAreMember">
Vous êtes membre
</string>
- <text name="group_name">
- Groupe grognon des Orignaux Grumpity
- </text>
<text name="group_subtitle">
123 membres
</text>
diff --git a/indra/newview/skins/default/xui/fr/language_settings.xml b/indra/newview/skins/default/xui/fr/language_settings.xml
index bd272e1f28..fdac9d65a7 100644
--- a/indra/newview/skins/default/xui/fr/language_settings.xml
+++ b/indra/newview/skins/default/xui/fr/language_settings.xml
@@ -4,6 +4,7 @@
<!-- Locale Information -->
<string name="MicrosoftLocale">french</string>
+ <string name="MacLocale">fr_FR.UTF-8</string>
<string name="DarwinLocale">fr_FR.UTF-8</string>
<string name="LinuxLocale">fr_FR.UTF-8</string>
diff --git a/indra/newview/skins/default/xui/fr/menu_attachment_self.xml b/indra/newview/skins/default/xui/fr/menu_attachment_self.xml
index 78198fb5a8..6af2064e44 100644
--- a/indra/newview/skins/default/xui/fr/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/fr/menu_attachment_self.xml
@@ -5,7 +5,7 @@
<menu_item_call label="Détacher" name="Detach"/>
<menu_item_call label="M&apos;asseoir" name="Sit Down Here"/>
<menu_item_call label="Me lever" name="Stand Up"/>
- <menu_item_call label="Changer de tenue" name="Change Outfit"/>
+ <menu_item_call label="Mon apparence" name="Change Outfit"/>
<menu_item_call label="Modifier ma tenue" name="Edit Outfit"/>
<menu_item_call label="Modifier ma silhouette" name="Edit My Shape"/>
<menu_item_call label="Mes amis" name="Friends..."/>
diff --git a/indra/newview/skins/default/xui/fr/menu_avatar_self.xml b/indra/newview/skins/default/xui/fr/menu_avatar_self.xml
index c7ee2e9f88..6310a2177a 100644
--- a/indra/newview/skins/default/xui/fr/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/fr/menu_avatar_self.xml
@@ -14,6 +14,7 @@
<menu_item_call label="Débardeur" name="Self Undershirt"/>
<menu_item_call label="Caleçon" name="Self Underpants"/>
<menu_item_call label="Tatouage" name="Self Tattoo"/>
+ <menu_item_call label="Propriétés physiques" name="Self Physics"/>
<menu_item_call label="Alpha" name="Self Alpha"/>
<menu_item_call label="Tous les habits" name="All Clothes"/>
</context_menu>
@@ -21,7 +22,7 @@
<context_menu label="Détacher" name="Object Detach"/>
<menu_item_call label="Tout détacher" name="Detach All"/>
</context_menu>
- <menu_item_call label="Changer de tenue" name="Chenge Outfit"/>
+ <menu_item_call label="Mon apparence" name="Chenge Outfit"/>
<menu_item_call label="Modifier ma tenue" name="Edit Outfit"/>
<menu_item_call label="Modifier ma silhouette" name="Edit My Shape"/>
<menu_item_call label="Mes amis" name="Friends..."/>
diff --git a/indra/newview/skins/default/xui/fr/menu_bottomtray.xml b/indra/newview/skins/default/xui/fr/menu_bottomtray.xml
index bfdc89c5bb..d0d245b286 100644
--- a/indra/newview/skins/default/xui/fr/menu_bottomtray.xml
+++ b/indra/newview/skins/default/xui/fr/menu_bottomtray.xml
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="hide_camera_move_controls_menu">
+ <menu_item_check label="Bouton Parler" name="EnableVoiceChat"/>
<menu_item_check label="Bouton Geste" name="ShowGestureButton"/>
<menu_item_check label="Bouton Bouger" name="ShowMoveButton"/>
<menu_item_check label="Bouton Affichage" name="ShowCameraButton"/>
<menu_item_check label="Bouton Photo" name="ShowSnapshotButton"/>
- <menu_item_check label="Bouton Panneau latéral" name="ShowSidebarButton"/>
<menu_item_check label="Bouton Construire" name="ShowBuildButton"/>
<menu_item_check label="Bouton Rechercher" name="ShowSearchButton"/>
<menu_item_check label="Bouton Carte" name="ShowWorldMapButton"/>
diff --git a/indra/newview/skins/default/xui/fr/menu_group_plus.xml b/indra/newview/skins/default/xui/fr/menu_group_plus.xml
index 0db5afedc7..ad76f11d79 100644
--- a/indra/newview/skins/default/xui/fr/menu_group_plus.xml
+++ b/indra/newview/skins/default/xui/fr/menu_group_plus.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="menu_group_plus">
- <menu_item_call label="Rejoindre des groupes..." name="item_join"/>
+ <menu_item_call label="Rejoindre un groupe..." name="item_join"/>
<menu_item_call label="Nouveau groupe..." name="item_new"/>
</menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_hide_navbar.xml b/indra/newview/skins/default/xui/fr/menu_hide_navbar.xml
index 86a2ddd185..09c9f5084a 100644
--- a/indra/newview/skins/default/xui/fr/menu_hide_navbar.xml
+++ b/indra/newview/skins/default/xui/fr/menu_hide_navbar.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="hide_navbar_menu">
- <menu_item_check label="Afficher la barre de navigation" name="ShowNavbarNavigationPanel"/>
- <menu_item_check label="Afficher la barre des Favoris" name="ShowNavbarFavoritesPanel"/>
+ <menu_item_check label="Afficher la barre de navigation &amp; favoris" name="ShowNavbarNavigationPanel"/>
+ <menu_item_check label="Afficher la barre des favoris" name="ShowNavbarFavoritesPanel"/>
<menu_item_check label="Afficher la mini-barre d&apos;emplacement" name="ShowMiniLocationPanel"/>
</menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/fr/menu_inspect_avatar_gear.xml
index 17254ff325..53f22bb44a 100644
--- a/indra/newview/skins/default/xui/fr/menu_inspect_avatar_gear.xml
+++ b/indra/newview/skins/default/xui/fr/menu_inspect_avatar_gear.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<menu name="Gear Menu">
+<toggleable_menu name="Gear Menu">
<menu_item_call label="Voir le profil" name="view_profile"/>
<menu_item_call label="Devenir amis" name="add_friend"/>
<menu_item_call label="IM" name="im"/>
@@ -11,9 +11,11 @@
<menu_item_call label="Signaler" name="report"/>
<menu_item_call label="Figer" name="freeze"/>
<menu_item_call label="Expulser" name="eject"/>
+ <menu_item_call label="Éjecter" name="kick"/>
+ <menu_item_call label="Représentant de l&apos;Assistance client" name="csr"/>
<menu_item_call label="Déboguer les textures" name="debug"/>
<menu_item_call label="Situer sur la carte" name="find_on_map"/>
<menu_item_call label="Zoomer en avant" name="zoom_in"/>
<menu_item_call label="Payer" name="pay"/>
<menu_item_call label="Partager" name="share"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_inspect_object_gear.xml b/indra/newview/skins/default/xui/fr/menu_inspect_object_gear.xml
index 074bb54cdc..f3b974aba5 100644
--- a/indra/newview/skins/default/xui/fr/menu_inspect_object_gear.xml
+++ b/indra/newview/skins/default/xui/fr/menu_inspect_object_gear.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<menu name="Gear Menu">
+<toggleable_menu name="Gear Menu">
<menu_item_call label="Toucher" name="touch"/>
<menu_item_call label="M&apos;asseoir" name="sit"/>
<menu_item_call label="Payer" name="pay"/>
@@ -12,7 +12,8 @@
<menu_item_call label="Ajouter" name="add"/>
<menu_item_call label="Signaler" name="report"/>
<menu_item_call label="Ignorer" name="block"/>
+ <menu_item_call label="Ne plus ignorer" name="unblock"/>
<menu_item_call label="Zoomer en avant" name="zoom_in"/>
<menu_item_call label="Supprimer" name="remove"/>
<menu_item_call label="En savoir plus" name="more_info"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/fr/menu_inspect_self_gear.xml
index 3bc164788a..ac70df472d 100644
--- a/indra/newview/skins/default/xui/fr/menu_inspect_self_gear.xml
+++ b/indra/newview/skins/default/xui/fr/menu_inspect_self_gear.xml
@@ -1,10 +1,31 @@
-<?xml version="1.0" encoding="utf-8"?>
-<menu name="Gear Menu">
- <menu_item_call label="M&apos;asseoir" name="sit_down_here"/>
- <menu_item_call label="Me lever" name="stand_up"/>
- <menu_item_call label="Changer de tenue" name="change_outfit"/>
- <menu_item_call label="Mon profil" name="my_profile"/>
- <menu_item_call label="Mes amis" name="my_friends"/>
- <menu_item_call label="Mes groupes" name="my_groups"/>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Gear Menu">
+ <menu_item_call label="M&apos;asseoir" name="Sit Down Here"/>
+ <menu_item_call label="Me lever" name="Stand Up"/>
+ <context_menu label="Enlever" name="Take Off &gt;">
+ <context_menu label="Habits" name="Clothes &gt;">
+ <menu_item_call label="Chemise" name="Shirt"/>
+ <menu_item_call label="Pantalon" name="Pants"/>
+ <menu_item_call label="Jupe" name="Skirt"/>
+ <menu_item_call label="Chaussures" name="Shoes"/>
+ <menu_item_call label="Chaussettes" name="Socks"/>
+ <menu_item_call label="Veste" name="Jacket"/>
+ <menu_item_call label="Gants" name="Gloves"/>
+ <menu_item_call label="Débardeur" name="Self Undershirt"/>
+ <menu_item_call label="Caleçon" name="Self Underpants"/>
+ <menu_item_call label="Tatouage" name="Self Tattoo"/>
+ <menu_item_call label="Alpha" name="Self Alpha"/>
+ <menu_item_call label="Tous les habits" name="All Clothes"/>
+ </context_menu>
+ <context_menu label="HUD" name="Object Detach HUD"/>
+ <context_menu label="Détacher" name="Object Detach"/>
+ <menu_item_call label="Tout détacher" name="Detach All"/>
+ </context_menu>
+ <menu_item_call label="Changer de tenue" name="Chenge Outfit"/>
+ <menu_item_call label="Modifier ma tenue" name="Edit Outfit"/>
+ <menu_item_call label="Modifier ma silhouette" name="Edit My Shape"/>
+ <menu_item_call label="Mes amis" name="Friends..."/>
+ <menu_item_call label="Mes groupes" name="Groups..."/>
+ <menu_item_call label="Mon profil" name="Profile..."/>
<menu_item_call label="Déboguer les textures" name="Debug..."/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_inventory.xml b/indra/newview/skins/default/xui/fr/menu_inventory.xml
index a2279cf0ac..59dcff9075 100644
--- a/indra/newview/skins/default/xui/fr/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/fr/menu_inventory.xml
@@ -25,6 +25,7 @@
<menu_item_call label="Nouveau caleçon" name="New Underpants"/>
<menu_item_call label="Nouveau masque alpha" name="New Alpha Mask"/>
<menu_item_call label="Nouveau tatouage" name="New Tattoo"/>
+ <menu_item_call label="Nouvelles propriétés physiques" name="New Physics"/>
</menu>
<menu label="Nouvelles parties du corps" name="New Body Parts">
<menu_item_call label="Nouvelle silhouette" name="New Shape"/>
@@ -58,6 +59,7 @@
<menu_item_call label="Propriétés" name="Properties"/>
<menu_item_call label="Renommer" name="Rename"/>
<menu_item_call label="Copier l&apos;UUID (identifiant universel unique)" name="Copy Asset UUID"/>
+ <menu_item_call label="Couper" name="Cut"/>
<menu_item_call label="Copier" name="Copy"/>
<menu_item_call label="Coller" name="Paste"/>
<menu_item_call label="Coller comme lien" name="Paste As Link"/>
@@ -70,7 +72,7 @@
<menu_item_call label="Jouer dans Second Life" name="Animation Play"/>
<menu_item_call label="Jouer localement" name="Animation Audition"/>
<menu_item_call label="Envoyer un message instantané" name="Send Instant Message"/>
- <menu_item_call label="Offrir de téléporter..." name="Offer Teleport..."/>
+ <menu_item_call label="Proposer une téléportation..." name="Offer Teleport..."/>
<menu_item_call label="Démarrer le chat conférence" name="Conference Chat"/>
<menu_item_call label="Activer" name="Activate"/>
<menu_item_call label="Désactiver" name="Deactivate"/>
@@ -82,5 +84,7 @@
<menu_item_call label="Modifier" name="Wearable Edit"/>
<menu_item_call label="Ajouter" name="Wearable Add"/>
<menu_item_call label="Enlever" name="Take Off"/>
+ <menu_item_call label="Copier vers la boîte d&apos;envoi vendeur" name="Merchant Copy"/>
+ <menu_item_call label="Envoyer vers la Place du marché" name="Marketplace Send"/>
<menu_item_call label="--aucune option--" name="--no options--"/>
</menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_inventory_add.xml b/indra/newview/skins/default/xui/fr/menu_inventory_add.xml
index fe096b4a7e..1076af44d9 100644
--- a/indra/newview/skins/default/xui/fr/menu_inventory_add.xml
+++ b/indra/newview/skins/default/xui/fr/menu_inventory_add.xml
@@ -4,6 +4,8 @@
<menu_item_call label="Image ([COST] L$)..." name="Upload Image"/>
<menu_item_call label="Son ([COST] L$)..." name="Upload Sound"/>
<menu_item_call label="Animation ([COST] L$)..." name="Upload Animation"/>
+ <menu_item_call label="Modèle..." name="Upload Model"/>
+ <menu_item_call label="Assistant Modèle..." name="Upload Model Wizard"/>
<menu_item_call label="Lot ([COST] L$ par fichier)..." name="Bulk Upload"/>
<menu_item_call label="Définir les droits de chargement par défaut" name="perm prefs"/>
</menu>
@@ -23,6 +25,7 @@
<menu_item_call label="Nouveau caleçon" name="New Underpants"/>
<menu_item_call label="Nouvel alpha" name="New Alpha"/>
<menu_item_call label="Nouveau tatouage" name="New Tattoo"/>
+ <menu_item_call label="Nouvelles propriétés physiques" name="New Physics"/>
</menu>
<menu label="Nouvelles parties du corps" name="New Body Parts">
<menu_item_call label="Nouvelle silhouette" name="New Shape"/>
diff --git a/indra/newview/skins/default/xui/fr/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/fr/menu_inventory_gear_default.xml
index 73770dce5f..364872c875 100644
--- a/indra/newview/skins/default/xui/fr/menu_inventory_gear_default.xml
+++ b/indra/newview/skins/default/xui/fr/menu_inventory_gear_default.xml
@@ -1,8 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_gear_default">
+<toggleable_menu name="menu_gear_default">
<menu_item_call label="Nouvelle fenêtre d&apos;inventaire" name="new_window"/>
- <menu_item_call label="Trier par nom" name="sort_by_name"/>
- <menu_item_call label="Trier en commençant par le plus récent" name="sort_by_recent"/>
+ <menu_item_check label="Trier par nom" name="sort_by_name"/>
+ <menu_item_check label="Trier en commençant par le plus récent" name="sort_by_recent"/>
+ <menu_item_check label="Toujours trier les dossiers par nom" name="sort_folders_by_name"/>
+ <menu_item_check label="Dossiers système en premier" name="sort_system_folders_to_top"/>
<menu_item_call label="Afficher les filtres" name="show_filters"/>
<menu_item_call label="Réinitialiser les filtres" name="reset_filters"/>
<menu_item_call label="Fermer tous les dossiers" name="close_folders"/>
@@ -12,4 +14,4 @@
<menu_item_call label="Trouver l&apos;original" name="Find Original"/>
<menu_item_call label="Trouver tous les liens" name="Find All Links"/>
<menu_item_call label="Vider la corbeille" name="empty_trash"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_login.xml b/indra/newview/skins/default/xui/fr/menu_login.xml
index b712c008cd..dc6b2793ca 100644
--- a/indra/newview/skins/default/xui/fr/menu_login.xml
+++ b/indra/newview/skins/default/xui/fr/menu_login.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu_bar name="Login Menu">
<menu label="Moi" name="File">
- <menu_item_call label="Préférences" name="Preferences..."/>
+ <menu_item_call label="Préférences..." name="Preferences..."/>
<menu_item_call label="Quitter [APP_NAME]" name="Quit"/>
</menu>
<menu label="Aide" name="Help">
@@ -17,7 +17,8 @@
<menu_item_call label="Définir la taille de la fenêtre..." name="Set Window Size..."/>
<menu_item_call label="Afficher les conditions d&apos;utilisation" name="TOS"/>
<menu_item_call label="Afficher le message critique" name="Critical"/>
- <menu_item_call label="Test du navigateur Web" name="Web Browser Test"/>
+ <menu_item_call label="Test de débogage de la fenêtre flottante du contenu Web" name="Web Content Floater Debug Test"/>
+ <menu label="Définir le niveau de connexion" name="Set Logging Level"/>
<menu_item_check label="Afficher le sélecteur de grille" name="Show Grid Picker"/>
<menu_item_call label="Afficher la console des notifications" name="Show Notifications Console"/>
</menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_media_ctrl.xml b/indra/newview/skins/default/xui/fr/menu_media_ctrl.xml
new file mode 100644
index 0000000000..1941ad2cbf
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_media_ctrl.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="media ctrl context menu">
+ <menu_item_call label="Couper" name="Cut"/>
+ <menu_item_call label="Copier" name="Copy"/>
+ <menu_item_call label="Coller" name="Paste"/>
+ <menu_item_call label="Ouvrir l&apos;inspecteur Web" name="open_webinspector"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_mini_map.xml b/indra/newview/skins/default/xui/fr/menu_mini_map.xml
index 7530f31d4e..b9d0a70383 100644
--- a/indra/newview/skins/default/xui/fr/menu_mini_map.xml
+++ b/indra/newview/skins/default/xui/fr/menu_mini_map.xml
@@ -3,6 +3,7 @@
<menu_item_call label="Zoom rapproché" name="Zoom Close"/>
<menu_item_call label="Zoom moyen" name="Zoom Medium"/>
<menu_item_call label="Zoom éloigné" name="Zoom Far"/>
+ <menu_item_call label="Zoom par défaut" name="Zoom Default"/>
<menu_item_check label="Faire pivoter la carte" name="Rotate Map"/>
<menu_item_check label="Centrage auto" name="Auto Center"/>
<menu_item_call label="Arrêter de suivre" name="Stop Tracking"/>
diff --git a/indra/newview/skins/default/xui/fr/menu_mode_change.xml b/indra/newview/skins/default/xui/fr/menu_mode_change.xml
new file mode 100644
index 0000000000..982a331c5b
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_mode_change.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Mode Change">
+ <menu_item_check label="Basique" name="BasicMode"/>
+ <menu_item_check label="Avancé" name="AdvancedMode"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_model_import_gear_default.xml b/indra/newview/skins/default/xui/fr/menu_model_import_gear_default.xml
new file mode 100644
index 0000000000..af6bfcd028
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_model_import_gear_default.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="model_menu_gear_default">
+ <menu_item_check label="Afficher les arêtes" name="show_edges"/>
+ <menu_item_check label="Afficher les propriétés physiques" name="show_physics"/>
+ <menu_item_check label="Afficher les textures" name="show_textures"/>
+ <menu_item_check label="Afficher la pondération de la peau" name="show_skin_weight"/>
+ <menu_item_check label="Afficher la position des articulations" name="show_joint_positions"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_object.xml b/indra/newview/skins/default/xui/fr/menu_object.xml
index a50a9df4b1..c6db48a31c 100644
--- a/indra/newview/skins/default/xui/fr/menu_object.xml
+++ b/indra/newview/skins/default/xui/fr/menu_object.xml
@@ -16,14 +16,14 @@
<context_menu label="Attacher" name="Object Attach"/>
<context_menu label="Attacher HUD" name="Object Attach HUD"/>
</context_menu>
- <context_menu label="Supprimer" name="Remove">
+ <context_menu label="Gérer" name="Remove">
<menu_item_call label="Signaler une infraction" name="Report Abuse..."/>
<menu_item_call label="Ignorer" name="Object Mute"/>
<menu_item_call label="Retour" name="Return..."/>
- <menu_item_call label="Supprimer" name="Delete"/>
</context_menu>
<menu_item_call label="Prendre" name="Pie Object Take"/>
<menu_item_call label="Prendre une copie" name="Take Copy"/>
<menu_item_call label="Payer" name="Pay..."/>
<menu_item_call label="Acheter" name="Buy..."/>
+ <menu_item_call label="Supprimer" name="Delete"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_outfit_gear.xml b/indra/newview/skins/default/xui/fr/menu_outfit_gear.xml
index 5db7f176b5..b5181f4f82 100644
--- a/indra/newview/skins/default/xui/fr/menu_outfit_gear.xml
+++ b/indra/newview/skins/default/xui/fr/menu_outfit_gear.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Gear Outfit">
+<toggleable_menu name="Gear Outfit">
<menu_item_call label="Porter - Remplacer la tenue actuelle" name="wear"/>
<menu_item_call label="Porter - Ajouter à la tenue actuelle" name="wear_add"/>
<menu_item_call label="Enlever - Supprimer de la tenue actuelle" name="take_off"/>
@@ -14,6 +14,7 @@
<menu_item_call label="Nouveau débardeur" name="New Undershirt"/>
<menu_item_call label="Nouveau caleçon" name="New Underpants"/>
<menu_item_call label="Nouvel alpha" name="New Alpha"/>
+ <menu_item_call label="Nouvelles propriétés physiques" name="New Physics"/>
<menu_item_call label="Nouveau tatouage" name="New Tattoo"/>
</menu>
<menu label="Nouvelles parties du corps" name="New Body Parts">
@@ -24,4 +25,4 @@
</menu>
<menu_item_call label="Renommer la tenue" name="rename"/>
<menu_item_call label="Supprimer la tenue" name="delete_outfit"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_people_nearby_view_sort.xml b/indra/newview/skins/default/xui/fr/menu_people_nearby_view_sort.xml
index 45f97e062e..8bb466b8d6 100644
--- a/indra/newview/skins/default/xui/fr/menu_people_nearby_view_sort.xml
+++ b/indra/newview/skins/default/xui/fr/menu_people_nearby_view_sort.xml
@@ -1,8 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
+<toggleable_menu name="menu_group_plus">
<menu_item_check label="Trier par intervenants récents" name="sort_by_recent_speakers"/>
<menu_item_check label="Trier par nom" name="sort_name"/>
<menu_item_check label="Trier par distance" name="sort_distance"/>
<menu_item_check label="Afficher les icônes des résidents" name="view_icons"/>
- <menu_item_call label="Afficher les résidents et les objets interdits" name="show_blocked_list"/>
-</menu>
+ <menu_item_check label="Afficher la carte" name="view_map"/>
+ <menu_item_call label="Afficher les résidents et les objets ignorés" name="show_blocked_list"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/fr/menu_places_gear_folder.xml
index 3570bdec7f..3fdf3bf3c4 100644
--- a/indra/newview/skins/default/xui/fr/menu_places_gear_folder.xml
+++ b/indra/newview/skins/default/xui/fr/menu_places_gear_folder.xml
@@ -1,7 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_folder_gear">
+<toggleable_menu name="menu_folder_gear">
<menu_item_call label="Ajouter un repère" name="add_landmark"/>
<menu_item_call label="Ajouter un dossier" name="add_folder"/>
+ <menu_item_call label="Restaurer l&apos;article" name="restore_item"/>
<menu_item_call label="Couper" name="cut"/>
<menu_item_call label="Copier" name="copy_folder"/>
<menu_item_call label="Coller" name="paste"/>
@@ -12,4 +13,4 @@
<menu_item_call label="Développer tous les dossiers" name="expand_all"/>
<menu_item_call label="Réduire tous les dossiers" name="collapse_all"/>
<menu_item_check label="Trier par date" name="sort_by_date"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/fr/menu_places_gear_landmark.xml
index 5491c1b3fc..b48f6ea693 100644
--- a/indra/newview/skins/default/xui/fr/menu_places_gear_landmark.xml
+++ b/indra/newview/skins/default/xui/fr/menu_places_gear_landmark.xml
@@ -1,10 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_ladmark_gear">
+<toggleable_menu name="menu_ladmark_gear">
<menu_item_call label="Téléporter" name="teleport"/>
<menu_item_call label="Plus d&apos;informations" name="more_info"/>
<menu_item_call label="Voir sur la carte" name="show_on_map"/>
<menu_item_call label="Ajouter un repère" name="add_landmark"/>
<menu_item_call label="Ajouter un dossier" name="add_folder"/>
+ <menu_item_call label="Restaurer l&apos;article" name="restore_item"/>
<menu_item_call label="Couper" name="cut"/>
<menu_item_call label="Copier le repère" name="copy_landmark"/>
<menu_item_call label="Copier la SLurl" name="copy_slurl"/>
@@ -15,4 +16,4 @@
<menu_item_call label="Réduire tous les dossiers" name="collapse_all"/>
<menu_item_check label="Trier par date" name="sort_by_date"/>
<menu_item_call label="Créer un favori" name="create_pick"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_toolbars.xml b/indra/newview/skins/default/xui/fr/menu_toolbars.xml
new file mode 100644
index 0000000000..f74d206d56
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_toolbars.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Toolbars Popup">
+ <menu_item_call label="Supprimer ce bouton" name="Remove button"/>
+ <menu_item_call label="Boutons des barres d&apos;outils..." name="Choose Buttons"/>
+ <menu_item_check label="Icônes et libellés" name="icons_with_text"/>
+ <menu_item_check label="Icônes uniquement" name="icons_only"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_viewer.xml b/indra/newview/skins/default/xui/fr/menu_viewer.xml
index 4e09a9bec3..3c3d4f5f69 100644
--- a/indra/newview/skins/default/xui/fr/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/fr/menu_viewer.xml
@@ -1,62 +1,92 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu_bar name="Main Menu">
<menu label="Moi" name="Me">
- <menu_item_call label="Préférences" name="Preferences"/>
- <menu_item_call label="Ma Page d&apos;accueil" name="Manage My Account">
- <menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=fr"/>
- </menu_item_call>
- <menu_item_call label="Acheter des L$" name="Buy and Sell L$"/>
- <menu_item_call label="Mon profil" name="Profile"/>
- <menu_item_call label="Changer de tenue" name="ChangeOutfit"/>
- <menu_item_check label="Mon inventaire" name="Inventory"/>
- <menu_item_check label="Mon inventaire" name="ShowSidetrayInventory"/>
- <menu_item_check label="Mes gestes" name="Gestures"/>
- <menu_item_check label="Ma voix" name="ShowVoice"/>
- <menu label="Mon statut" name="Status">
+ <menu_item_call label="Profil..." name="Profile"/>
+ <menu_item_call label="Apparence..." name="ChangeOutfit"/>
+ <menu_item_call label="Choisir un avatar..." name="Avatar Picker"/>
+ <menu_item_check label="Inventaire..." name="Inventory"/>
+ <menu_item_call label="Nouvelle fenêtre d&apos;inventaire" name="NewInventoryWindow"/>
+ <menu_item_call label="Endroits..." name="Places"/>
+ <menu_item_call label="Favoris..." name="Picks"/>
+ <menu_item_call label="Paramètres de la caméra..." name="Camera Controls"/>
+ <menu label="Déplacement" name="Movement">
+ <menu_item_call label="M&apos;asseoir" name="Sit Down Here"/>
+ <menu_item_check label="Voler" name="Fly"/>
+ <menu_item_check label="Toujours courir" name="Always Run"/>
+ <menu_item_call label="Arrêter mon animation" name="Stop Animating My Avatar"/>
+ <menu_item_call label="Marcher / Courir / Voler..." name="Walk / run / fly"/>
+ </menu>
+ <menu label="Statut" name="Status">
<menu_item_call label="Absent" name="Set Away"/>
<menu_item_call label="Occupé" name="Set Busy"/>
</menu>
- <menu_item_call label="Demander le statut Admin" name="Request Admin Options"/>
- <menu_item_call label="Quitter le statut Admin" name="Leave Admin Options"/>
+ <menu_item_call label="Acheter des L$..." name="Buy and Sell L$"/>
+ <menu_item_call label="Boîte d&apos;envoi vendeur..." name="MerchantOutbox"/>
+ <menu_item_call label="Page d&apos;accueil du compte..." name="Manage My Account">
+ <menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=fr"/>
+ </menu_item_call>
+ <menu_item_call label="Préférences..." name="Preferences"/>
+ <menu_item_call label="Boutons des barres d&apos;outils..." name="Toolbars"/>
+ <menu_item_call label="Masquer tous les contrôles" name="Hide UI"/>
<menu_item_call label="Quitter [APP_NAME]" name="Quit"/>
</menu>
<menu label="Communiquer" name="Communicate">
- <menu_item_call label="Mes amis" name="My Friends"/>
- <menu_item_call label="Mes groupes" name="My Groups"/>
- <menu_item_check label="Chat près de moi" name="Nearby Chat"/>
- <menu_item_call label="Personnes près de moi" name="Active Speakers"/>
+ <menu_item_check label="Chat..." name="Nearby Chat"/>
+ <menu_item_check label="Parler" name="Speak"/>
+ <menu_item_check label="Paramètres vocaux..." name="Nearby Voice"/>
+ <menu_item_check label="Effet de voix..." name="ShowVoice"/>
+ <menu_item_check label="Gestes..." name="Gestures"/>
+ <menu_item_call label="Amis" name="My Friends"/>
+ <menu_item_call label="Groupes" name="My Groups"/>
+ <menu_item_call label="Personnes près de vous" name="Active Speakers"/>
</menu>
<menu label="Monde" name="World">
- <menu_item_check label="Mini-carte" name="Mini-Map"/>
+ <menu_item_call label="Créer un repère pour ce lieu" name="Create Landmark Here"/>
+ <menu_item_call label="Destinations..." name="Destinations"/>
<menu_item_check label="Carte du monde" name="World Map"/>
+ <menu_item_check label="Mini-carte" name="Mini-Map"/>
+ <menu_item_check label="Rechercher" name="Search"/>
+ <menu_item_call label="Me téléporter chez moi" name="Teleport Home"/>
+ <menu_item_call label="Définir le domicile ici" name="Set Home to Here"/>
<menu_item_call label="Photo" name="Take Snapshot"/>
- <menu_item_call label="Créer un repère pour ce lieu" name="Create Landmark Here"/>
- <menu label="Profil du lieu" name="Land">
- <menu_item_call label="Profil du lieu" name="Place Profile"/>
- <menu_item_call label="À propos du terrain" name="About Land"/>
- <menu_item_call label="Région/Domaine" name="Region/Estate"/>
- </menu>
+ <menu_item_call label="Profil du lieu" name="Place Profile"/>
+ <menu_item_call label="À propos du terrain" name="About Land"/>
+ <menu_item_call label="Région/Domaine" name="Region/Estate"/>
+ <menu_item_call label="Mes terrains..." name="My Land"/>
<menu_item_call label="Acheter ce terrain" name="Buy Land"/>
- <menu_item_call label="Mes terrains" name="My Land"/>
<menu label="Afficher" name="LandShow">
- <menu_item_check label="Contrôles de mouvement" name="Movement Controls"/>
- <menu_item_check label="Contrôles d’affichage" name="Camera Controls"/>
<menu_item_check label="Lignes d&apos;interdiction" name="Ban Lines"/>
<menu_item_check label="Balises" name="beacons"/>
<menu_item_check label="Limites du terrain" name="Property Lines"/>
<menu_item_check label="Propriétaires de terrains" name="Land Owners"/>
<menu_item_check label="Coordonnées" name="Coordinates"/>
<menu_item_check label="Propriétés de la parcelle" name="Parcel Properties"/>
+ <menu_item_check label="Menu Avancé" name="Show Advanced Menu"/>
</menu>
- <menu_item_call label="Me téléporter chez moi" name="Teleport Home"/>
- <menu_item_call label="Définir le domicile ici" name="Set Home to Here"/>
- <menu label="Luminosité" name="Environment Settings">
+ <menu label="Luminosité" name="Sun">
<menu_item_call label="Aube" name="Sunrise"/>
<menu_item_call label="Milieu de journée" name="Noon"/>
<menu_item_call label="Coucher de soleil" name="Sunset"/>
<menu_item_call label="Minuit" name="Midnight"/>
- <menu_item_call label="Heure du domaine" name="Revert to Region Default"/>
- <menu_item_call label="Éditeur d&apos;environnement" name="Environment Editor"/>
+ <menu_item_call label="Utiliser les réglages de la région" name="Use Region Settings"/>
+ </menu>
+ <menu label="Éditeur d&apos;environnement" name="Environment Editor">
+ <menu_item_call label="Paramètres d&apos;environnement..." name="Environment Settings"/>
+ <menu label="Préréglages de l&apos;eau" name="Water Presets">
+ <menu_item_call label="Nouveau préréglage..." name="new_water_preset"/>
+ <menu_item_call label="Modifier un préréglage..." name="edit_water_preset"/>
+ <menu_item_call label="Supprimer un préréglage..." name="delete_water_preset"/>
+ </menu>
+ <menu label="Préréglages du ciel" name="Sky Presets">
+ <menu_item_call label="Nouveau préréglage..." name="new_sky_preset"/>
+ <menu_item_call label="Modifier un préréglage..." name="edit_sky_preset"/>
+ <menu_item_call label="Supprimer un préréglage..." name="delete_sky_preset"/>
+ </menu>
+ <menu label="Préréglages du jour" name="Day Presets">
+ <menu_item_call label="Nouveau préréglage..." name="new_day_preset"/>
+ <menu_item_call label="Modifier un préréglage..." name="edit_day_preset"/>
+ <menu_item_call label="Supprimer un préréglage..." name="delete_day_preset"/>
+ </menu>
</menu>
</menu>
<menu label="Construire" name="BuildTools">
@@ -112,18 +142,21 @@
<menu_item_call label="Image ([COST] L$)..." name="Upload Image"/>
<menu_item_call label="Son ([COST] L$)..." name="Upload Sound"/>
<menu_item_call label="Animation ([COST] L$)..." name="Upload Animation"/>
+ <menu_item_call label="Modèle..." name="Upload Model"/>
<menu_item_call label="Lot ([COST] L$ par fichier)..." name="Bulk Upload"/>
+ <menu_item_call label="Définir les droits de chargement par défaut" name="perm prefs"/>
</menu>
+ <menu_item_call label="Annuler" name="Undo"/>
+ <menu_item_call label="Refaire" name="Redo"/>
</menu>
<menu label="Aide" name="Help">
+ <menu_item_call label="Aide rapide..." name="How To"/>
<menu_item_call label="Aide de [SECOND_LIFE]" name="Second Life Help"/>
<menu_item_call label="Signaler une infraction" name="Report Abuse"/>
<menu_item_call label="Signaler un bug" name="Report Bug"/>
<menu_item_call label="À propos de [APP_NAME]" name="About Second Life"/>
- <menu_item_check label="Activer les astuces" name="Enable Hints"/>
</menu>
<menu label="Avancé" name="Advanced">
- <menu_item_call label="Arrêter mon animation" name="Stop Animating My Avatar"/>
<menu_item_call label="Refixer les textures" name="Rebake Texture"/>
<menu_item_call label="Taille de l&apos;interface par défaut" name="Set UI Size to Default"/>
<menu_item_call label="Définir la taille de la fenêtre…" name="Set Window Size..."/>
@@ -131,11 +164,10 @@
<menu_item_check label="Désactiver les contraintes de la caméra" name="Disable Camera Distance"/>
<menu_item_check label="Photo haute résolution" name="HighResSnapshot"/>
<menu_item_check label="Photos discrètes sur disque" name="QuietSnapshotsToDisk"/>
- <menu_item_check label="Compresser les photos sur disque" name="CompressSnapshotsToDisk"/>
<menu label="Outils de performance" name="Performance Tools">
<menu_item_call label="Mesure du lag" name="Lag Meter"/>
<menu_item_check label="Barre de statistiques" name="Statistics Bar"/>
- <menu_item_check label="Afficher le coût de rendu de l&apos;avatar" name="Avatar Rendering Cost"/>
+ <menu_item_check label="Afficher le poids de dessin pour les avatars" name="Avatar Rendering Cost"/>
</menu>
<menu label="Surbrillance et visibilité" name="Highlighting and Visibility">
<menu_item_check label="Balise animée" name="Cheesy Beacon"/>
@@ -146,21 +178,22 @@
<menu_item_check label="Afficher le réticule de la vue subjective" name="ShowCrosshairs"/>
</menu>
<menu label="Types de rendu" name="Rendering Types">
- <menu_item_check label="Simple" name="Simple"/>
- <menu_item_check label="Alpha" name="Alpha"/>
- <menu_item_check label="Arbre" name="Tree"/>
- <menu_item_check label="Avatars" name="Character"/>
- <menu_item_check label="Ciel" name="Sky"/>
- <menu_item_check label="Eau" name="Water"/>
- <menu_item_check label="Sol" name="Ground"/>
- <menu_item_check label="Volume" name="Volume"/>
- <menu_item_check label="Herbe" name="Grass"/>
- <menu_item_check label="Nuages" name="Clouds"/>
- <menu_item_check label="Particules" name="Particles"/>
- <menu_item_check label="Placage de relief" name="Bump"/>
+ <menu_item_check label="Simple" name="Rendering Type Simple"/>
+ <menu_item_check label="Alpha" name="Rendering Type Alpha"/>
+ <menu_item_check label="Arbre" name="Rendering Type Tree"/>
+ <menu_item_check label="Avatars" name="Rendering Type Character"/>
+ <menu_item_check label="Patch de surface" name="Rendering Type Surface Patch"/>
+ <menu_item_check label="Ciel" name="Rendering Type Sky"/>
+ <menu_item_check label="Eau" name="Rendering Type Water"/>
+ <menu_item_check label="Sol" name="Rendering Type Ground"/>
+ <menu_item_check label="Volume" name="Rendering Type Volume"/>
+ <menu_item_check label="Herbe" name="Rendering Type Grass"/>
+ <menu_item_check label="Nuages" name="Rendering Type Clouds"/>
+ <menu_item_check label="Particules" name="Rendering Type Particles"/>
+ <menu_item_check label="Placage de relief" name="Rendering Type Bump"/>
</menu>
<menu label="Fonctionnalités de rendu" name="Rendering Features">
- <menu_item_check label="Interface" name="UI"/>
+ <menu_item_check label="Interface" name="ToggleUI"/>
<menu_item_check label="Sélection" name="Selected"/>
<menu_item_check label="En surbrillance" name="Highlighted"/>
<menu_item_check label="Textures dynamiques" name="Dynamic Textures"/>
@@ -172,13 +205,9 @@
<menu_item_check label="Utiliser le thread de lecture de plug-in" name="Use Plugin Read Thread"/>
<menu_item_call label="Effacer le cache du groupe" name="ClearGroupCache"/>
<menu_item_check label="Effet de lissage de la souris" name="Mouse Smoothing"/>
+ <menu_item_call label="Libérer les touches" name="Release Keys"/>
<menu label="Raccourcis" name="Shortcuts">
- <menu_item_call label="Image ([COST] L$)..." name="Upload Image"/>
- <menu_item_check label="Rechercher" name="Search"/>
- <menu_item_call label="Relâcher les touches" name="Release Keys"/>
- <menu_item_call label="Taille de l&apos;interface par défaut" name="Set UI Size to Default"/>
- <menu_item_check label="Toujours courir" name="Always Run"/>
- <menu_item_check label="Voler" name="Fly"/>
+ <menu_item_check label="Afficher le menu Avancé - raccourci existant" name="Show Advanced Menu - legacy shortcut"/>
<menu_item_call label="Fermer la fenêtre" name="Close Window"/>
<menu_item_call label="Fermer toutes les fenêtres" name="Close All Windows"/>
<menu_item_call label="Photo sur disque" name="Snapshot to Disk"/>
@@ -186,17 +215,9 @@
<menu_item_check label="Joystick Flycam" name="Joystick Flycam"/>
<menu_item_call label="Réinitialiser la vue" name="Reset View"/>
<menu_item_call label="Regarder la dernière conversation" name="Look at Last Chatter"/>
- <menu label="Sélectionner un outil de construction" name="Select Tool">
- <menu_item_call label="Outil de mise au point" name="Focus"/>
- <menu_item_call label="Outil de déplacement" name="Move"/>
- <menu_item_call label="Outil de modification" name="Edit"/>
- <menu_item_call label="Outil de création" name="Create"/>
- <menu_item_call label="Outil Terrain" name="Land"/>
- </menu>
<menu_item_call label="Zoomer en avant" name="Zoom In"/>
<menu_item_call label="Zoom par défaut" name="Zoom Default"/>
<menu_item_call label="Zoomer en arrière" name="Zoom Out"/>
- <menu_item_check label="Afficher le menu Avancé" name="Show Advanced Menu"/>
</menu>
<menu_item_call label="Afficher les paramètres de débogage" name="Debug Settings"/>
<menu_item_check label="Afficher le menu Développeurs" name="Debug Mode"/>
@@ -210,6 +231,7 @@
<menu_item_check label="Console des catégories de textures" name="Texture Category"/>
<menu_item_check label="Chronos" name="Fast Timers"/>
<menu_item_check label="Mémoire" name="Memory"/>
+ <menu_item_check label="Statistiques de la scène" name="Scene Statistics"/>
<menu_item_call label="Infos de région vers la console de débogage" name="Region Info to Debug Console"/>
<menu_item_call label="Infos de groupe vers la console de débogage" name="Group Info to Debug Console"/>
<menu_item_call label="Infos de capacités vers la console de débogage" name="Capabilities Info to Debug Console"/>
@@ -220,9 +242,13 @@
</menu>
<menu label="Afficher les infos" name="Display Info">
<menu_item_check label="Afficher l&apos;heure" name="Show Time"/>
+ <menu_item_check label="Afficher le coût du chargement" name="Show Upload Cost"/>
<menu_item_check label="Afficher les infos de rendu" name="Show Render Info"/>
+ <menu_item_check label="Afficher les infos de texture" name="Show Texture Info"/>
<menu_item_check label="Afficher les matrices" name="Show Matrices"/>
<menu_item_check label="Afficher la couleur sous le curseur" name="Show Color Under Cursor"/>
+ <menu_item_check label="Afficher la mémoire" name="Show Memory"/>
+ <menu_item_check label="Afficher les infos de mémoire privées" name="Show Private Mem Info"/>
<menu_item_check label="Afficher les mises à jour des objets" name="Show Updates"/>
</menu>
<menu label="Forcer une erreur" name="Force Errors">
@@ -243,17 +269,26 @@
</menu>
<menu label="Métadonnées de rendu" name="Render Metadata">
<menu_item_check label="Cadres" name="Bounding Boxes"/>
+ <menu_item_check label="Normales" name="Normals"/>
<menu_item_check label="Octree" name="Octree"/>
<menu_item_check label="Shadow Frusta" name="Shadow Frusta"/>
+ <menu_item_check label="Formes physiques" name="Physics Shapes"/>
<menu_item_check label="Occlusion" name="Occlusion"/>
<menu_item_check label="Lots de rendu" name="Render Batches"/>
+ <menu_item_check label="Type de mise à jour" name="Update Type"/>
<menu_item_check label="Texture Anim" name="Texture Anim"/>
<menu_item_check label="Priorité de la texture" name="Texture Priority"/>
<menu_item_check label="Zone de texture" name="Texture Area"/>
<menu_item_check label="Zone de face" name="Face Area"/>
+ <menu_item_check label="Infos sur le niveau de détail" name="LOD Info"/>
+ <menu_item_check label="File d&apos;attente pour la construction" name="Build Queue"/>
<menu_item_check label="Lumières" name="Lights"/>
<menu_item_check label="Squelette de collision" name="Collision Skeleton"/>
<menu_item_check label="Rayons" name="Raycast"/>
+ <menu_item_check label="Vecteurs de vent" name="Wind Vectors"/>
+ <menu_item_check label="Complexité du rendu" name="rendercomplexity"/>
+ <menu_item_check label="Octets d&apos;éléments attachés" name="attachment bytes"/>
+ <menu_item_check label="Sculpture" name="Sculpt"/>
</menu>
<menu label="Rendu" name="Rendering">
<menu_item_check label="Axes" name="Axes"/>
@@ -261,11 +296,9 @@
<menu_item_call label="Base des infos de la texture sélectionnée" name="Selected Texture Info Basis"/>
<menu_item_check label="Filaire" name="Wireframe"/>
<menu_item_check label="Occlusion objet-objet" name="Object-Object Occlusion"/>
- <menu_item_check label="Objets de mémoire vidéo" name="Framebuffer Objects"/>
<menu_item_check label="Éclairage et ombres" name="Lighting and Shadows"/>
<menu_item_check label="Ombres du soleil/de la lune/des projecteurs" name="Shadows from Sun/Moon/Projectors"/>
<menu_item_check label="SSAO et lissage des ombres" name="SSAO and Shadow Smoothing"/>
- <menu_item_check label="Illumination globale (expérimental)" name="Global Illumination"/>
<menu_item_check label="Débogage GL" name="Debug GL"/>
<menu_item_check label="Débogage pipeline" name="Debug Pipeline"/>
<menu_item_check label="Masques alpha automatiques (différés)" name="Automatic Alpha Masks (deferred)"/>
@@ -283,7 +316,7 @@
<menu_item_check label="Pauser l&apos;avatar" name="AgentPause"/>
<menu_item_call label="Activer le journal des messages" name="Enable Message Log"/>
<menu_item_call label="Désactiver le journal des messages" name="Disable Message Log"/>
- <menu_item_check label="Velocity Interpolate Objects" name="Velocity Interpolate Objects"/>
+ <menu_item_check label="Objets d&apos;interpolation de vitesse" name="Velocity Interpolate Objects"/>
<menu_item_check label="Interpolation ping des positions des objets" name="Ping Interpolate Object Positions"/>
<menu_item_call label="Abandonner un paquet" name="Drop a Packet"/>
</menu>
@@ -296,14 +329,14 @@
<menu_item_call label="Commencer l&apos;enregistrement" name="Start Record"/>
<menu_item_call label="Arrêter l&apos;enregistrement" name="Stop Record"/>
</menu>
- <menu label="Monde" name="World">
+ <menu label="Monde" name="DevelopWorld">
<menu_item_check label="Ignorer les paramètres du soleil de la sim" name="Sim Sun Override"/>
- <menu_item_check label="Balise animée" name="Cheesy Beacon"/>
<menu_item_check label="Météo fixe" name="Fixed Weather"/>
- <menu_item_call label="Dump Region Object Cache" name="Dump Region Object Cache"/>
+ <menu_item_call label="Vidage de cache d&apos;objet de la région" name="Dump Region Object Cache"/>
</menu>
<menu label="Interface" name="UI">
- <menu_item_call label="Test du navigateur Web" name="Web Browser Test"/>
+ <menu_item_call label="Test du navigateur de médias" name="Web Browser Test"/>
+ <menu_item_call label="Navigateur du contenu Web" name="Web Content Browser"/>
<menu_item_call label="Dump SelectMgr" name="Dump SelectMgr"/>
<menu_item_call label="Dump inventaire" name="Dump Inventory"/>
<menu_item_call label="Dump Timers" name="Dump Timers"/>
@@ -311,8 +344,7 @@
<menu_item_call label="Imprimer les infos sur l&apos;objet sélectionné" name="Print Selected Object Info"/>
<menu_item_call label="Imprimer les infos sur l&apos;avatar" name="Print Agent Info"/>
<menu_item_call label="Statistiques de mémoire" name="Memory Stats"/>
- <menu_item_check label="Pilotage auto par double-clic" name="Double-ClickAuto-Pilot"/>
- <menu_item_check label="Téléportation par double-clic" name="DoubleClick Teleport"/>
+ <menu_item_check label="Console de débogage de région" name="Region Debug Console"/>
<menu_item_check label="Débogage SelectMgr" name="Debug SelectMgr"/>
<menu_item_check label="Débogage clics" name="Debug Clicks"/>
<menu_item_check label="Débogage des vues" name="Debug Views"/>
@@ -324,19 +356,17 @@
<menu label="XUI" name="XUI">
<menu_item_call label="Recharger les paramètres de couleurs" name="Reload Color Settings"/>
<menu_item_call label="Afficher le test de police" name="Show Font Test"/>
- <menu_item_call label="Charger à partir de XML" name="Load from XML"/>
- <menu_item_call label="Enregistrer en XML" name="Save to XML"/>
<menu_item_check label="Afficher les noms XUI" name="Show XUI Names"/>
<menu_item_call label="Envoyer des IM tests" name="Send Test IMs"/>
<menu_item_call label="Vider les caches de noms" name="Flush Names Caches"/>
</menu>
<menu label="Avatar" name="Character">
<menu label="Récupérer la texture fixée" name="Grab Baked Texture">
- <menu_item_call label="Iris" name="Iris"/>
- <menu_item_call label="Tête" name="Head"/>
- <menu_item_call label="Haut du corps" name="Upper Body"/>
- <menu_item_call label="Bas du corps" name="Lower Body"/>
- <menu_item_call label="Jupe" name="Skirt"/>
+ <menu_item_call label="Iris" name="Grab Iris"/>
+ <menu_item_call label="Tête" name="Grab Head"/>
+ <menu_item_call label="Haut du corps" name="Grab Upper Body"/>
+ <menu_item_call label="Bas du corps" name="Grab Lower Body"/>
+ <menu_item_call label="Jupe" name="Grab Skirt"/>
</menu>
<menu label="Tests personnages" name="Character Tests">
<menu_item_call label="Apparence dans XML" name="Appearance To XML"/>
@@ -362,21 +392,30 @@
<menu_item_call label="Dump Local Textures" name="Dump Local Textures"/>
</menu>
<menu_item_check label="Textures HTTP" name="HTTP Textures"/>
+ <menu_item_check label="Inventaire HTTP" name="HTTP Inventory"/>
<menu_item_call label="Compresser les images" name="Compress Images"/>
+ <menu_item_call label="Activer Visual Leak Detector" name="Enable Visual Leak Detector"/>
<menu_item_check label="Output Debug Minidump" name="Output Debug Minidump"/>
<menu_item_check label="Console Window on next Run" name="Console Window"/>
- <menu_item_check label="Afficher le menu Admin" name="View Admin Options"/>
+ <menu label="Définir le niveau de connexion" name="Set Logging Level">
+ <menu_item_check label="Débogage" name="Debug"/>
+ <menu_item_check label="Infos" name="Info"/>
+ <menu_item_check label="Avertissement" name="Warning"/>
+ <menu_item_check label="Erreur" name="Error"/>
+ <menu_item_check label="Aucun" name="None"/>
+ </menu>
<menu_item_call label="Demander le statut Admin" name="Request Admin Options"/>
<menu_item_call label="Quitter le statut Admin" name="Leave Admin Options"/>
+ <menu_item_check label="Afficher le menu Admin" name="View Admin Options"/>
</menu>
<menu label="Admin" name="Admin">
- <menu label="Object">
- <menu_item_call label="Prendre une copie" name="Take Copy"/>
- <menu_item_call label="Téléporter le propriétaire" name="Force Owner To Me"/>
+ <menu label="Objet" name="AdminObject">
+ <menu_item_call label="Prendre une copie" name="Admin Take Copy"/>
+ <menu_item_call label="Me faire devenir propriétaire" name="Force Owner To Me"/>
<menu_item_call label="Forcer la permission du propriétaire" name="Force Owner Permissive"/>
<menu_item_call label="Supprimer" name="Delete"/>
<menu_item_call label="Verrouiller" name="Lock"/>
- <menu_item_call label="Obtenir les ID d&apos;actifs" name="Get Assets IDs"/>
+ <menu_item_call label="Obtenir les ID des actifs" name="Get Assets IDs"/>
</menu>
<menu label="Parcelle" name="Parcel">
<menu_item_call label="Téléporter le propriétaire" name="Owner To Me"/>
@@ -404,12 +443,13 @@
<menu_item_call label="Jupe" name="Skirt"/>
<menu_item_call label="Alpha" name="Alpha"/>
<menu_item_call label="Tatouage" name="Tattoo"/>
+ <menu_item_call label="Propriétés physiques" name="Physics"/>
<menu_item_call label="Tous les habits" name="All Clothes"/>
</menu>
- <menu label="Aide" name="Help">
+ <menu label="Aide" name="DeprecatedHelp">
<menu_item_call label="Blog officiel des Linden" name="Official Linden Blog"/>
<menu_item_call label="Portail d&apos;écriture de scripts" name="Scripting Portal"/>
- <menu label="Signaler des bugs" name="Bug Reporting">
+ <menu label="Signaler un bug" name="Bug Reporting">
<menu_item_call label="JIRA" name="Public Issue Tracker"/>
<menu_item_call label="Aide du JIRA" name="Publc Issue Tracker Help"/>
<menu_item_call label="Comment signaler des bugs" name="Bug Reporing 101"/>
diff --git a/indra/newview/skins/default/xui/fr/menu_wearing_gear.xml b/indra/newview/skins/default/xui/fr/menu_wearing_gear.xml
index 0ca9fe1879..c3d9d908b0 100644
--- a/indra/newview/skins/default/xui/fr/menu_wearing_gear.xml
+++ b/indra/newview/skins/default/xui/fr/menu_wearing_gear.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Gear Wearing">
+<toggleable_menu name="Gear Wearing">
<menu_item_call label="Modifier la tenue" name="edit"/>
<menu_item_call label="Enlever" name="takeoff"/>
-</menu>
+ <menu_item_call label="Copier la liste de la tenue dans le presse-papiers" name="copy"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/fr/notifications.xml b/indra/newview/skins/default/xui/fr/notifications.xml
index 341cc9830d..746a4b1d55 100644
--- a/indra/newview/skins/default/xui/fr/notifications.xml
+++ b/indra/newview/skins/default/xui/fr/notifications.xml
@@ -73,7 +73,7 @@ Détails de l&apos;erreur : La notification, appelée &apos;[_NAME]&apos;, est i
</notification>
<notification name="LoginFailedNoNetwork">
Connexion à [SECOND_LIFE_GRID] impossible.
-&apos;[DIAGNOSTIC]&apos;
+ &apos;[DIAGNOSTIC]&apos;
Veuillez vérifier votre connexion Internet.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
@@ -85,6 +85,40 @@ Veuillez vérifier votre connexion Internet.
Enregistrer les changements dans la partie du corps/les habits actuels ?
<usetemplate canceltext="Cancel" name="yesnocancelbuttons" notext="Ne pas enregistrer" yestext="Enregistrer"/>
</notification>
+ <notification name="ConfirmNoCopyToOutbox">
+ Vous n&apos;êtes pas autorisé à copier un ou plusieurs de ces articles dans la boîte d&apos;envoi vendeur. Vous pouvez les déplacer ou les laisser.
+ <usetemplate name="okcancelbuttons" notext="Ne pas déplacer les articles" yestext="Déplacer les articles"/>
+ </notification>
+ <notification name="OutboxFolderCreated">
+ Un nouveau dossier a été créé pour chaque article que vous avez transféré vers le niveau supérieur de votre boîte d&apos;envoi vendeur.
+ <usetemplate ignoretext="Un nouveau dossier a été créé dans la boîte d&apos;envoi vendeur." name="okignore" yestext="OK"/>
+ </notification>
+ <notification name="OutboxImportComplete">
+ Transfert réussi
+
+Tous les dossiers ont été envoyés vers la Place du marché.
+ <usetemplate ignoretext="Tous les dossiers envoyés vers la Place du marché" name="okignore" yestext="OK"/>
+ </notification>
+ <notification name="OutboxImportHadErrors">
+ Impossible de transférer certains dossiers
+
+Des erreurs se sont produites lors de l&apos;envoi de certains dossiers vers la Place du marché. Ces dossiers sont toujours disponibles dans votre boîte d&apos;envoi vendeur.
+
+Pour plus d&apos;informations, consultez le [[MARKETPLACE_IMPORTS_URL] journal des erreurs].
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="OutboxImportFailed">
+ Échec de transfert
+
+Aucun dossier n&apos;a été envoyé vers la Place du marché en raison d&apos;une erreur système ou réseau. Veuillez réessayer ultérieurement.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="OutboxInitFailed">
+ Échec d&apos;initialisation de la Place du marché
+
+L&apos;initialisation de la Place du marché a échoué en raison d&apos;une erreur système ou réseau. Veuillez réessayer ultérieurement.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="CompileQueueSaveText">
Une erreur est survenue lors du chargement du texte pour un script, suite au problème suivant : [REASON]. Veuillez réessayer ultérieurement.
</notification>
@@ -109,6 +143,10 @@ Veuillez ne sélectionner qu&apos;un seul objet.
Les résidents qui ne sont pas vos amis ne sauront pas que vous avez choisi d&apos;ignorer leurs appels et leurs messages instantanés.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="FavoritesOnLogin">
+ Remarque : si vous activez cette option, toutes les personnes utilisant cet ordinateur pourront voir votre liste d&apos;endroits favoris.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="GrantModifyRights">
Lorsque vous accordez des droits de modification à un autre résident, vous lui permettez de changer, supprimer ou prendre n&apos;importe lequel de vos objets dans Second Life. Réfléchissez bien avant d&apos;accorder ces droits.
Voulez-vous vraiment accorder des droits de modification à [NAME] ?
@@ -328,13 +366,6 @@ Pour entrer dans [SECOND_LIFE], vous devez disposer d&apos;un compte. Voulez-vou
<notification name="InvalidCredentialFormat">
Saisissez soit le nom d&apos;utilisateur soit à la fois le prénom et le nom de votre avatar dans le champ Nom d&apos;utilisateur, puis connectez-vous.
</notification>
- <notification name="AddClassified">
- Les petites annonces sont publiées à l&apos;onglet Petites annonces de la section Recherche et sur [http://secondlife.com/community/classifieds secondlife.com] pendant une semaine.
-Rédigez votre annonce, puis cliquez sur Publier pour l&apos;ajouter à la liste des annonces.
-Au moment de cliquer sur Publier, vous serez invité à payer des frais.
-Plus vous payez cher, plus votre annonce est visible dans la liste ainsi que dans les résultats de recherche de mots-clés.
- <usetemplate ignoretext="Comment ajouter une nouvelle petite annonce" name="okcancelignore" notext="Annuler" yestext="OK"/>
- </notification>
<notification name="DeleteClassified">
Supprimer l&apos;annonce [NAME] ?
Une fois payés, les frais ne sont pas remboursables.
@@ -387,6 +418,9 @@ Remarque : cela videra le cache.
<notification name="ChangeSkin">
Le nouveau thème apparaîtra après le redémarrage de [APP_NAME].
</notification>
+ <notification name="ChangeLanguage">
+ Le changement de langue sera effectué au redémarrage de [APP_NAME].
+ </notification>
<notification name="GoToAuctionPage">
Aller à la page web de [SECOND_LIFE] pour voir le détail des enchères ou enchérir ?
<url name="url">
@@ -599,6 +633,10 @@ Assurez-vous que le fichier a l&apos;extension correcte.
Impossible de trouver les données dans l&apos;en-tête WAV :
[FILE]
</notification>
+ <notification name="SoundFileInvalidChunkSize">
+ Taille de fragment incorrecte dans le fichier WAV :
+[FILE]
+ </notification>
<notification name="SoundFileInvalidTooLong">
Le fichier audio est trop long (10 secondes maximum) :
[FILE]
@@ -631,7 +669,7 @@ Assurez-vous que le fichier a l&apos;extension correcte.
Impossible de créer le fichier de sortie : [FILE]
</notification>
<notification name="DoNotSupportBulkAnimationUpload">
- Actuellement, [APP_NAME] ne prend pas en charge le chargement de lots de fichiers d&apos;animation.
+ Actuellement, [APP_NAME] ne prend pas en charge le chargement par lot de fichiers d&apos;animation au format BVH.
</notification>
<notification name="CannotUploadReason">
Impossible de charger [FILE] suite au problème suivant : [REASON]
@@ -938,7 +976,7 @@ Proposer à [NAME] de devenir votre ami(e) ?
<input name="message">
[DESC] (nouv.)
</input>
- <button name="Offer" text="OK"/>
+ <button name="OK" text="OK"/>
<button name="Cancel" text="Annuler"/>
</form>
</notification>
@@ -948,7 +986,7 @@ Proposer à [NAME] de devenir votre ami(e) ?
<input name="message">
[DESC] (nouv.)
</input>
- <button name="Offer" text="OK"/>
+ <button name="OK" text="OK"/>
<button name="Cancel" text="Annuler"/>
</form>
</notification>
@@ -958,12 +996,12 @@ Proposer à [NAME] de devenir votre ami(e) ?
<input name="new_name">
[NAME]
</input>
- <button name="Offer" text="OK"/>
+ <button name="OK" text="OK"/>
<button name="Cancel" text="Annuler"/>
</form>
</notification>
<notification name="RemoveFromFriends">
- Voulez-vous supprimer [NAME] de votre liste d&apos;amis ?
+ Voulez-vous supprimer &lt;nolink&gt;[NAME]&lt;/nolink&gt; de votre liste d&apos;amis ?
<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
</notification>
<notification name="RemoveMultipleFromFriends">
@@ -1088,8 +1126,13 @@ Céder ces [AREA] m² de terrain au groupe [GROUP_NAME] ?
<notification name="DisplaySetToSafe">
Les paramètres d&apos;affichage sont au niveau le plus sûr, comme vous l&apos;aviez indiqué.
</notification>
- <notification name="DisplaySetToRecommended">
- Vos paramètres d&apos;affichage ont été réglés avec une marge de sécurité en fonction de votre configuration système.
+ <notification name="DisplaySetToRecommendedGPUChange">
+ Les paramètres d&apos;affichage ont été modifiés selon les niveaux recommandés car votre carte graphique
+[LAST_GPU] a été remplacée
+par une carte [THIS_GPU].
+ </notification>
+ <notification name="DisplaySetToRecommendedFeatureChange">
+ Les paramètres d&apos;affichage ont été modifiés selon les niveaux recommandés en raison d&apos;un changement relatif au sous-système de rendu.
</notification>
<notification name="ErrorMessage">
[ERROR_MESSAGE]
@@ -1325,6 +1368,48 @@ Cette mise à jour n&apos;est pas requise mais si vous voulez une meilleure perf
Télécharger vers le dossier Applications ?
<usetemplate name="okcancelbuttons" notext="Continuer" yestext="Télécharger"/>
</notification>
+ <notification name="FailedUpdateInstall">
+ Une erreur est survenue lors de l&apos;installation de la mise à jour du client.
+Veuillez télécharger et installer la dernière version du client à la page Web
+http://secondlife.com/download.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="FailedRequiredUpdateInstall">
+ Impossible d&apos;installer une mise à jour requise.
+Vous ne pourrez pas vous connecter tant que [APP_NAME] ne sera pas mis à jour.
+
+Veuillez télécharger et installer la dernière version du client à la page Web
+http://secondlife.com/download.
+ <usetemplate name="okbutton" yestext="Quitter"/>
+ </notification>
+ <notification name="UpdaterServiceNotRunning">
+ Une mise à jour requise pour votre installation Second Life existe.
+
+Pour la télécharger, accédez à http://www.secondlife.com/downloads.
+Vous pouvez également l&apos;installer dès maintenant.
+ <usetemplate name="okcancelbuttons" notext="Quitter Second Life" yestext="Télécharger et installer maintenant"/>
+ </notification>
+ <notification name="DownloadBackgroundTip">
+ Nous avons téléchargé une mise à jour de votre installation [APP_NAME].
+Version [VERSION] [[RELEASE_NOTES_FULL_URL] Informations relatives à cette mise à jour]
+ <usetemplate name="okcancelbuttons" notext="Ultérieurement..." yestext="Installer maintenant et redémarrer [APP_NAME]"/>
+ </notification>
+ <notification name="DownloadBackgroundDialog">
+ Nous avons téléchargé une mise à jour de votre installation [APP_NAME].
+Version [VERSION] [[RELEASE_NOTES_FULL_URL] Informations relatives à cette mise à jour]
+ <usetemplate name="okcancelbuttons" notext="Ultérieurement..." yestext="Installer maintenant et redémarrer [APP_NAME]"/>
+ </notification>
+ <notification name="RequiredUpdateDownloadedVerboseDialog">
+ Nous avons téléchargé une mise à jour logicielle requise.
+Version [VERSION]
+
+[APP_NAME] doit être redémarré pour que la mise à jour soit installée.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="RequiredUpdateDownloadedDialog">
+ [APP_NAME] doit être redémarré pour que la mise à jour soit installée.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="DeedObjectToGroup">
Si vous cédez cet objet, le groupe :
* recevra les L$ versés pour l&apos;objet ;
@@ -1369,8 +1454,8 @@ Télécharger vers le dossier Applications ?
<usetemplate ignoretext="Confirmer avant de rendre les objets à leurs propriétaires" name="okcancelignore" notext="Annuler" yestext="OK"/>
</notification>
<notification name="GroupLeaveConfirmMember">
- Vous êtes actuellement membre du groupe [GROUP].
-Quitter le groupe ?
+ Vous êtes actuellement membre du groupe &lt;nolink&gt;[GROUP]&lt;/nolink&gt;.
+Quitter le groupe ?
<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
</notification>
<notification name="ConfirmKick">
@@ -1504,6 +1589,11 @@ Veuillez réessayer ultérieurement.
<button name="Cancel" text="Annuler"/>
</form>
</notification>
+ <notification name="TooManyTeleportOffers">
+ Vous avez essayé d&apos;effectuer [OFFERS] offres de téléportation,
+or ce nombre dépasse la limite autorisée fixée à [LIMIT].
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="OfferTeleportFromGod">
Exiger du résident qu&apos;il vienne vous rejoindre ?
<form name="form">
@@ -1845,6 +1935,18 @@ Déplacer les objets de l&apos;inventaire ?
Êtes-vous certain de vouloir quitter ?
<usetemplate ignoretext="Confirmer avant de quitter" name="okcancelignore" notext="Ne pas quitter" yestext="Quitter"/>
</notification>
+ <notification name="ConfirmRestoreToybox">
+ Cette action rétablira vos boutons et barres d&apos;outils par défaut.
+
+Vous ne pouvez pas l&apos;annuler.
+ <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmClearAllToybox">
+ Cette action replacera tous les boutons dans la boîte à outils de sorte que vos barres d&apos;outils seront vides.
+
+Vous ne pouvez pas l&apos;annuler.
+ <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+ </notification>
<notification name="DeleteItems">
[QUESTION]
<usetemplate ignoretext="Confirmer avant de supprimer des articles" name="okcancelignore" notext="Annuler" yestext="OK"/>
@@ -1925,6 +2027,10 @@ Souhaitez-vous quitter le mode occupé avant de terminer cette transaction ?
Êtes-vous certain de vouloir supprimer l&apos;historique de vos visites et recherches ?
<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
</notification>
+ <notification name="ConfirmClearCache">
+ Voulez-vous vraiment vider le cache de votre client ?
+ <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+ </notification>
<notification name="ConfirmClearCookies">
Êtes-vous certain de vouloir supprimer vos cookies ?
<usetemplate name="okcancelbuttons" notext="Annuler" yestext="Oui"/>
@@ -1950,48 +2056,30 @@ Liez-la à partir d&apos;une page web pour permettre aux autres résidents d&apo
Voulez-vous écraser l&apos;option précédemment enregistrée ?
<usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/>
</notification>
- <notification name="WLDeletePresetAlert">
- Voulez-vous supprimer [SKY] ?
- <usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/>
- </notification>
<notification name="WLNoEditDefault">
Vous ne pouvez pas modifier ou supprimer un préréglage par défaut.
</notification>
<notification name="WLMissingSky">
Une dossier semble manquer au Cycle du jour : [SKY].
</notification>
- <notification name="PPSaveEffectAlert">
- Certains effets post-traitement existent. Voulez-vous quand même écraser ce fichier ?
- <usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/>
- </notification>
- <notification name="NewSkyPreset">
- Nommez le nouveau ciel.
- <form name="form">
- <input name="message">
- Nouveau préréglage
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Annuler"/>
- </form>
+ <notification name="WLRegionApplyFail">
+ Impossible d&apos;appliquer les réglages à la région. Le problème est parfois résolu en quittant la région puis en y revenant. Motif fourni : [FAIL_REASON]
</notification>
- <notification name="ExistsSkyPresetAlert">
- Ce préréglage existe déjà !
+ <notification name="EnvCannotDeleteLastDayCycleKey">
+ Impossible de supprimer la dernière clé de ce cycle du jour car ce dernier ne peut pas être vide. Modifiez la dernière clé restante au lieu d&apos;essayer de la supprimer puis d&apos;en créer une nouvelle.
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="NewWaterPreset">
- Nommez ce nouveau préréglage d&apos;eau.
- <form name="form">
- <input name="message">
- Nouveau préréglage
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Annuler"/>
- </form>
+ <notification name="DayCycleTooManyKeyframes">
+ Impossible d&apos;ajouter plus d&apos;images-clés à ce cycle du jour. Un maximum de [MAX] images-clés peut être associé aux cycles du jour de type [SCOPE].
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="ExistsWaterPresetAlert">
- Ce préréglage existe déjà !
+ <notification name="EnvUpdateRate">
+ Vous ne pouvez mettre à jour les paramètres d&apos;environnement d&apos;une région que toutes les [WAIT] secondes. Veuillez patienter pendant au moins ce délai avant de réessayer.
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="WaterNoEditDefault">
- Vous ne pouvez pas modifier ou supprimer un préréglage par défaut.
+ <notification name="PPSaveEffectAlert">
+ Certains effets post-traitement existent. Voulez-vous quand même écraser ce fichier ?
+ <usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/>
</notification>
<notification name="ChatterBoxSessionStartError">
Impossible de démarrer une nouvelle session de chat avec [RECIPIENT].
@@ -2020,13 +2108,14 @@ Liez-la à partir d&apos;une page web pour permettre aux autres résidents d&apo
<usetemplate ignoretext="Porter automatiquement tout en modifiant mon apparence" name="okcancelignore" notext="Non" yestext="Oui"/>
</notification>
<notification name="NotAgeVerified">
- Pour pouvoir pénétrer dans cette zone, vous devez avoir procédé à la vérification de votre âge. Souhaitez-vous aller sur [SECOND_LIFE] et procéder à la vérification de votre âge ?
+ Vous devez avoir au moins 18 ans pour accéder au contenu et aux zones Adulte dans Second Life. Visitez la page de vérification de l&apos;âge afin de confirmer que vous avez plus de 18 ans.
+Cette opération lancera votre navigateur Web.
[_URL]
<url name="url" option="0">
- https://secondlife.com/account/verification.php?lang=fr
+ https://secondlife.com/my/account/verification.php
</url>
- <usetemplate ignoretext="Je n&apos;ai pas procédé à la vérification de mon âge" name="okcancelignore" notext="Non" yestext="Oui"/>
+ <usetemplate ignoretext="Je n&apos;ai pas procédé à la vérification de mon âge" name="okcancelignore" notext="Annuler" yestext="Accéder à la page de vérification de l&apos;âge"/>
</notification>
<notification name="Cannot enter parcel: no payment info on file">
Pour pouvoir pénétrer dans cette zone, vous devez avoir enregistré vos informations de paiement. Souhaitez-vous aller sur [SECOND_LIFE] et enregistrer vos informations de paiement ?
@@ -2062,10 +2151,10 @@ Liez-la à partir d&apos;une page web pour permettre aux autres résidents d&apo
Sujet : [SUBJECT], Message : [MESSAGE]
</notification>
<notification name="FriendOnline">
- [NAME] est en ligne
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; est en ligne
</notification>
<notification name="FriendOffline">
- [NAME] est hors ligne
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; est hors ligne
</notification>
<notification name="AddSelfFriend">
Même si vous êtes extrêmement sympathique, vous ne pouvez pas devenir ami avec vous-même.
@@ -2111,6 +2200,12 @@ Cela risque d&apos;impacter votre mot de passe.
<notification name="RezItemNoPermissions">
Droits insuffisants pour rezzer l&apos;objet.
</notification>
+ <notification name="IMAcrossParentEstates">
+ Impossible d&apos;envoyer d&apos;IM entre domaines parents.
+ </notification>
+ <notification name="TransferInventoryAcrossParentEstates">
+ Impossible de transférer l&apos;inventaire entre domaines parents.
+ </notification>
<notification name="UnableToLoadNotecard">
Impossible de lire les données de la note actuellement.
</notification>
@@ -2173,14 +2268,16 @@ Veuillez sélectionner un seul objet.
Votre carte de visite a été refusée.
</notification>
<notification name="TeleportToLandmark">
- Vous pouvez vous téléporter vers des endroits comme [NAME] en ouvrant le panneau Lieux sur le côté droit de votre écran, puis en sélectionnant l&apos;onglet Repères.
-Cliquez sur le repère de votre choix pour le sélectionner, puis sur Téléporter en bas du panneau.
-(Vous pouvez aussi double-cliquer sur le repère ou cliquer dessus avec le bouton droit de la souris et sélectionner Téléporter.)
+ Pour vous téléporter vers un lieu tel que [NAME], cliquez sur le bouton Endroits,
+ puis sélectionnez l&apos;onglet Repères dans la fenêtre qui s&apos;ouvre. Cliquez sur n&apos;importe quel
+ repère pour le sélectionner, puis sur Téléportation en bas de la fenêtre.
+ (Vous pouvez aussi double-cliquer sur le repère ou cliquer-droit dessus et
+ choisir Téléportation).
</notification>
<notification name="TeleportToPerson">
- Vous pouvez contacter des résidents comme [NAME] en ouvrant le panneau Résidents sur le côté droit de votre écran.
-Sélectionnez le résident de votre choix dans la liste, puis cliquez sur IM en bas du panneau.
-(Vous pouvez aussi double-cliquer sur le nom du résident dans la liste ou cliquer dessus avec le bouton droit de la souris et sélectionner IM.)
+ Pour contacter un résident tel que [NAME], cliquez sur le bouton Personnes, sélectionnez le résident dans la fenêtre qui s&apos;ouvre, puis cliquez sur IM en
+ bas de la fenêtre.
+ (Vous pouvez aussi double-cliquer sur le nom du résident dans la liste ou cliquer-droit dessus et choisir IM.)
</notification>
<notification name="CantSelectLandFromMultipleRegions">
Vous ne pouvez pas sélectionner de terrain en dehors des limites du serveur.
@@ -2192,14 +2289,6 @@ Veuillez sélectionner un terrain plus petit.
<notification name="NoContentToSearch">
Veuillez sélectionner au moins un type de contenu à rechercher (Général, Modéré ou Adulte)
</notification>
- <notification name="GroupVote">
- [NAME] a proposé un vote pour :
-[MESSAGE]
- <form name="form">
- <button name="VoteNow" text="Voter"/>
- <button name="Later" text="Plus tard"/>
- </form>
- </notification>
<notification name="SystemMessage">
[MESSAGE]
</notification>
@@ -2209,6 +2298,9 @@ Veuillez sélectionner un terrain plus petit.
<notification name="PaymentSent">
[MESSAGE]
</notification>
+ <notification name="PaymentFailure">
+ [MESSAGE]
+ </notification>
<notification name="EventNotification">
Avis d&apos;événement :
@@ -2285,6 +2377,9 @@ Vous ne pouvez pas voler ici.
<notification name="NoBuild">
La construction est interdite dans cette zone. Vous ne pouvez pas construite ou rezzer d&apos;objets ici.
</notification>
+ <notification name="SeeAvatars">
+ Cette parcelle masque les avatars et le chat écrit des autres parcelles. Vous ne pouvez pas voir les résidents qui se trouvent en dehors, et ceux qui se trouvent en dehors ne peuvent pas vous voir. Le chat écrit habituel sur le canal 0 est également bloqué.
+ </notification>
<notification name="ScriptsStopped">
Un administrateur a temporairement stoppé les scripts dans cette région.
</notification>
@@ -2379,11 +2474,19 @@ Veuillez réessayer dans quelques minutes.
</notification>
<notification name="ObjectGiveItem">
Un objet nommé &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; appartenant à [NAME_SLURL] vous a donné un objet de type [OBJECTTYPE] :
-[ITEM_SLURL]
+&lt;nolink&gt;[ITEM_SLURL]&lt;/nolink&gt;
+ <form name="form">
+ <button name="Keep" text="Garder"/>
+ <button name="Discard" text="Jeter"/>
+ <button name="Mute" text="Ignorer le propriétaire"/>
+ </form>
+ </notification>
+ <notification name="OwnObjectGiveItem">
+ Votre objet nommé &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; vous a donné un objet de type [OBJECTTYPE] :
+&lt;nolink&gt;[ITEM_SLURL]&lt;/nolink&gt;
<form name="form">
<button name="Keep" text="Garder"/>
<button name="Discard" text="Jeter"/>
- <button name="Mute" text="Ignorer"/>
</form>
</notification>
<notification name="UserGiveItem">
@@ -2452,10 +2555,10 @@ Veuillez réessayer dans quelques minutes.
</form>
</notification>
<notification name="FriendshipAccepted">
- [NAME] a accepté votre amitié.
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; a accepté votre amitié.
</notification>
<notification name="FriendshipDeclined">
- [NAME] a refusé votre amitié.
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; a refusé votre amitié.
</notification>
<notification name="FriendshipAcceptedByMe">
Amitié acceptée.
@@ -2465,7 +2568,7 @@ Veuillez réessayer dans quelques minutes.
</notification>
<notification name="OfferCallingCard">
[NAME] vous offre sa carte de visite.
-Cela ajoute un marque-page dans votre inventaire, ce qui vous permet d&apos;envoyer rapidement un IM à ce résident.
+Un signet sera ajouté dans votre inventaire afin que vous puissiez envoyer rapidement un IM à ce résident.
<form name="form">
<button name="Accept" text="Accepter"/>
<button name="Decline" text="Refuser"/>
@@ -2527,14 +2630,16 @@ Accepter cette requête ?
&lt;nolink&gt;[TITLE]&lt;/nolink&gt; de [NAME]
[MESSAGE]
<form name="form">
- <button name="Ignore" text="Ignorer"/>
+ <button name="Client_Side_Mute" text="Bloquer"/>
+ <button name="Client_Side_Ignore" text="Ignorer"/>
</form>
</notification>
<notification name="ScriptDialogGroup">
&lt;nolink&gt;[TITLE]&lt;/nolink&gt; de [GROUPNAME]
[MESSAGE]
<form name="form">
- <button name="Ignore" text="Ignorer"/>
+ <button name="Client_Side_Mute" text="Bloquer"/>
+ <button name="Client_Side_Ignore" text="Ignorer"/>
</form>
</notification>
<notification name="BuyLindenDollarSuccess">
@@ -2657,9 +2762,6 @@ Pour y participer, cliquez sur Accepter. Sinon, cliquez sur Refuser. Pour ignore
<notification name="VoiceCallGenericError">
Une erreur est survenue pendant la connexion au chat vocal pour [VOICE_CHANNEL_NAME]. Veuillez réessayer ultérieurement.
</notification>
- <notification name="ServerVersionChanged">
- La région dans laquelle vous avez pénétré utilise une version de serveur différente, ce qui peut avoir un impact sur votre performance. [[URL] Consultez les notes de version.]
- </notification>
<notification name="UnsupportedCommandSLURL">
La SLurl que vous avez saisie n&apos;est pas prise en charge.
</notification>
@@ -2699,6 +2801,10 @@ Elles vont être bloquées pendant quelques secondes pour votre sécurité.
Le modérateur ignore vos paroles.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="UploadCostConfirmation">
+ Ce chargement coûtera [PRICE] L$. Continuer ?
+ <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Charger"/>
+ </notification>
<notification name="ConfirmClearTeleportHistory">
Voulez-vous vraiment supprimer votre historique des téléportations ?
<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
@@ -2710,10 +2816,33 @@ Le bouton sera affiché quand il y aura suffisamment de place.
<notification name="ShareNotification">
Sélectionnez les résidents avec lesquels partager l&apos;élément.
</notification>
+ <notification name="MeshUploadError">
+ Échec de chargement de [LABEL] : [MESSAGE] [IDENTIFIER]
+
+Voir le fichier journal pour plus de détails.
+ </notification>
+ <notification name="MeshUploadPermError">
+ Erreur lors de la demande des autorisations de chargement de maillage.
+ </notification>
+ <notification name="RegionCapabilityRequestError">
+ Impossible d&apos;obtenir la capacité de région : [CAPABILITY].
+ </notification>
<notification name="ShareItemsConfirmation">
Voulez-vous vraiment partager les articles suivants :
-[ITEMS]
+&lt;nolink&gt;[ITEMS]&lt;/nolink&gt;
+
+avec les résidents suivants :
+
+[RESIDENTS] ?
+ <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+ </notification>
+ <notification name="ShareFolderConfirmation">
+ Vous ne pouvez partager qu&apos;un dossier à la fois.
+
+Voulez-vous vraiment partager les articles suivants :
+
+&lt;nolink&gt;[ITEMS]&lt;/nolink&gt;
avec les résidents suivants :
@@ -2726,6 +2855,19 @@ avec les résidents suivants :
<notification name="DeedToGroupFail">
Échec de cession au groupe.
</notification>
+ <notification name="ReleaseLandThrottled">
+ Impossible d&apos;abandonner la parcelle [PARCEL_NAME] actuellement.
+ </notification>
+ <notification name="ReleasedLandWithReclaim">
+ La parcelle [PARCEL_NAME] de [AREA] m² a été libérée.
+
+Vous disposerez d&apos;un délai de récupération à 0 L$ de [RECLAIM_PERIOD] heures avant qu&apos;elle soit mise en vente pour tous.
+ </notification>
+ <notification name="ReleasedLandNoReclaim">
+ La parcelle [PARCEL_NAME] de [AREA] m² a été libérée.
+
+Elle est désormais disponible à l&apos;achat auprès de tous.
+ </notification>
<notification name="AvatarRezNotification">
([EXISTENCE] secondes d&apos;existence)
Nuage de l&apos;avatar [NAME] disparu au bout de [TIME] secondes.
@@ -2762,9 +2904,7 @@ L&apos;avatar [NAME] a quitté le mode Apparence.
<notification name="NoConnect">
Problèmes de connexion via [PROTOCOL] [HOSTID].
Veuillez vérifier la configuration de votre réseau et de votre pare-feu.
- <form name="form">
- <button name="OK" text="OK"/>
- </form>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="NoVoiceConnect">
Problèmes de connexion à votre serveur vocal :
@@ -2773,9 +2913,7 @@ Veuillez vérifier la configuration de votre réseau et de votre pare-feu.
Aucune communication vocale n&apos;est disponible.
Veuillez vérifier la configuration de votre réseau et de votre pare-feu.
- <form name="form">
- <button name="OK" text="OK"/>
- </form>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="AvatarRezLeftNotification">
([EXISTENCE] secondes d&apos;existence)
@@ -2799,7 +2937,7 @@ Les résidents rejoignant l&apos;appel ultérieurement seront également
ignorés, même si vous quittez l&apos;appel.
Ignorer les autres ?
- <usetemplate ignoretext="Confirmer avant d&apos;ignorer les autres lors d&apos;un appel de groupe" name="okcancelignore" notext="Annuler" yestext="Ok"/>
+ <usetemplate ignoretext="Confirmer avant d&apos;ignorer les autres lors d&apos;un appel de groupe" name="okcancelignore" notext="Annuler" yestext="OK"/>
</notification>
<notification label="Chat" name="HintChat">
Pour participer à la conversation, saisissez du texte dans le champ de chat situé en dessous.
@@ -2807,6 +2945,13 @@ Ignorer les autres ?
<notification label="Se lever" name="HintSit">
Pour passer d&apos;une position assise à une position debout, cliquez sur le bouton Me lever.
</notification>
+ <notification label="Parler" name="HintSpeak">
+ Cliquez sur le bouton Parler pour activer/désactiver le micro.
+
+Cliquez sur la flèche vers le haut pour afficher le panneau de contrôle de la voix.
+
+Si vous masquez le bouton Parler, la fonction Voix sera désactivée.
+ </notification>
<notification label="Explorer le monde" name="HintDestinationGuide">
Le Guide des destinations comprend des milliers d&apos;endroits nouveaux à découvrir. Sélectionnez-en un, puis cliquez sur Téléporter pour commencer à l&apos;explorer.
</notification>
@@ -2816,15 +2961,31 @@ Ignorer les autres ?
<notification label="Bouger" name="HintMove">
Pour marcher ou courir, cliquez sur le bouton Bouger, puis naviguez à l&apos;aide des flèches directionnelles. Vous pouvez également utiliser les touches fléchées de votre clavier.
</notification>
+ <notification label="" name="HintMoveClick">
+ 1. Cliquer pour marcher
+Cliquez n&apos;importe où sur le sol pour vous diriger vers ce point en marchant.
+
+2. Cliquer et faire glisser pour faire pivoter la vue
+Cliquez sur un point dans le monde et faites glisser votre souris pour faire tourner la caméra.
+ </notification>
<notification label="Nom d&apos;affichage" name="HintDisplayName">
Définissez ici votre nom d&apos;affichage personnalisable. Cette fonctionnalité vous est fournie en plus de votre nom d&apos;utilisateur unique qui, lui, ne peut être changé. Vous pouvez modifier l&apos;apparence des noms des autres résidents dans vos préférences.
</notification>
+ <notification label="Affichage" name="HintView">
+ Pour changer d&apos;angle de vision, utilisez les contrôles Faire tourner et Faire un panoramique. Pour réinitialiser la vue, appuyez sur Échap ou marchez.
+ </notification>
<notification label="Inventaire" name="HintInventory">
Permet de rechercher des articles dans l&apos;inventaire. Pour accéder aux derniers articles ajoutés, cliquez sur l&apos;onglet Récent.
</notification>
<notification label="Vous possédez des Linden dollars !" name="HintLindenDollar">
Votre solde actuel en L$ est celui-ci. Pour y ajouter d&apos;autres Linden dollars, cliquez sur Acheter L$.
</notification>
+ <notification name="LowMemory">
+ Pool de mémoire faible. Certaines fonctions de SL ont été désactivées afin d&apos;éviter un plantage. Veuillez fermer les autres applications. Si le problème persiste, redémarrez SL.
+ </notification>
+ <notification name="ForceQuitDueToLowMemory">
+ Mémoire insuffisante : fermeture de SL dans 30 secondes.
+ </notification>
<notification name="PopupAttempt">
Impossible d&apos;ouvrir une fenêtre popup.
<form name="form">
@@ -2832,9 +2993,111 @@ Ignorer les autres ?
<button name="open" text="Ouvrir la fenêtre popup"/>
</form>
</notification>
- <global name="UnsupportedCPU">
- - Votre processeur ne remplit pas les conditions minimum requises.
- </global>
+ <notification name="SOCKS_NOT_PERMITTED">
+ Le proxy SOCKS 5 &quot;[HOST]:[PORT]&quot; a refusé la connexion, non autorisée par le jeu de règles défini.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_CONNECT_ERROR">
+ Le proxy SOCKS 5 &quot;[HOST]:[PORT]&quot; a refusé la connexion. Impossible d&apos;ouvrir le canal TCP.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_NOT_ACCEPTABLE">
+ Le proxy SOCKS 5 &quot;[HOST]:[PORT]&quot; a refusé le système d&apos;authentification sélectionné.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_AUTH_FAIL">
+ Le proxy SOCKS 5 &quot;[HOST]:[PORT]&quot; indique que vos identifiants ne sont pas valides.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_UDP_FWD_NOT_GRANTED">
+ Le proxy SOCKS 5 &quot;[HOST]:[PORT]&quot; a refusé la demande d&apos;association UDP (UDP ASSOCIATE).
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_HOST_CONNECT_FAILED">
+ Connexion au serveur de proxy SOCKS 5 &quot;[HOST]:[PORT]&quot; impossible.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_UNKNOWN_STATUS">
+ Erreur de proxy inconnue avec le serveur &quot;[HOST]:[PORT]&quot;.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_INVALID_HOST">
+ Adresse ou port &quot;[HOST]:[PORT]&quot; de proxy SOCKS non valide.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_BAD_CREDS">
+ Nom d&apos;utilisateur ou mot de passe SOCKS 5 non valide.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="PROXY_INVALID_HTTP_HOST">
+ Adresse ou port &quot;[HOST]:[PORT]&quot; de proxy HTTP non valide.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="PROXY_INVALID_SOCKS_HOST">
+ Adresse ou port &quot;[HOST]:[PORT]&quot; de proxy SOCKS non valide.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ChangeProxySettings">
+ Les paramètres de proxy seront appliqués au redémarrage de [APP_NAME].
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="AuthRequest">
+ Nom d&apos;utilisateur et mot de passe requis pour le site se trouvant à l&apos;emplacement suivant : &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos;, domaine &apos;[REALM]&apos;.
+ <form name="form">
+ <input name="username" text="Nom d&apos;utilisateur"/>
+ <input name="password" text="Mot de passe"/>
+ <button name="ok" text="Soumettre"/>
+ <button name="cancel" text="Annuler"/>
+ </form>
+ </notification>
+ <notification label="" name="NoClassifieds">
+ Pour créer et modifier des petites annonces, vous devez utiliser le mode Avancé. Voulez-vous quitter l&apos;application afin de changer de mode ? Le sélecteur de mode se trouve sur l&apos;écran de connexion.
+ <usetemplate name="okcancelbuttons" notext="Ne pas quitter" yestext="Quitter"/>
+ </notification>
+ <notification label="" name="NoGroupInfo">
+ Pour créer et modifier des groupes, vous devez utiliser le mode Avancé. Voulez-vous quitter l&apos;application afin de changer de mode ? Le sélecteur de mode se trouve sur l&apos;écran de connexion.
+ <usetemplate name="okcancelbuttons" notext="Ne pas quitter" yestext="Quitter"/>
+ </notification>
+ <notification label="" name="NoPlaceInfo">
+ L&apos;affichage du profil du lieu est uniquement disponible en mode Avancé. Voulez-vous quitter l&apos;application afin de changer de mode ? Le sélecteur de mode se trouve sur l&apos;écran de connexion.
+ <usetemplate name="okcancelbuttons" notext="Ne pas quitter" yestext="Quitter"/>
+ </notification>
+ <notification label="" name="NoPicks">
+ Pour créer et modifier des favoris, vous devez utiliser le mode Avancé. Voulez-vous quitter l&apos;application afin de changer de mode ? Le sélecteur de mode se trouve sur l&apos;écran de connexion.
+ <usetemplate name="okcancelbuttons" notext="Ne pas quitter" yestext="Quitter"/>
+ </notification>
+ <notification label="" name="NoWorldMap">
+ Pour afficher la carte du monde, vous devez utiliser le mode Avancé. Voulez-vous quitter l&apos;application afin de changer de mode ? Le sélecteur de mode se trouve sur l&apos;écran de connexion.
+ <usetemplate name="okcancelbuttons" notext="Ne pas quitter" yestext="Quitter"/>
+ </notification>
+ <notification label="" name="NoVoiceCall">
+ Les appels vocaux sont uniquement disponibles en mode Avancé. Voulez-vous quitter l&apos;application afin de changer de mode ?
+ <usetemplate name="okcancelbuttons" notext="Ne pas quitter" yestext="Quitter"/>
+ </notification>
+ <notification label="" name="NoAvatarShare">
+ Le partage est uniquement disponible en mode Avancé. Voulez-vous quitter l&apos;application afin de changer de mode ?
+ <usetemplate name="okcancelbuttons" notext="Ne pas quitter" yestext="Quitter"/>
+ </notification>
+ <notification label="" name="NoAvatarPay">
+ Pour pouvoir payer d&apos;autres résidents, vous devez utiliser le mode Avancé. Voulez-vous quitter l&apos;application afin de changer de mode ?
+ <usetemplate name="okcancelbuttons" notext="Ne pas quitter" yestext="Quitter"/>
+ </notification>
+ <notification label="" name="NoInventory">
+ L&apos;affichage de l&apos;inventaire est uniquement disponible en mode Avancé. Voulez-vous quitter l&apos;application afin de changer de mode ?
+ <usetemplate name="okcancelbuttons" notext="Ne pas quitter" yestext="Quitter"/>
+ </notification>
+ <notification label="" name="NoAppearance">
+ L&apos;Éditeur d&apos;apparence est uniquement disponible en mode Avancé. Voulez-vous quitter l&apos;application afin de changer de mode ?
+ <usetemplate name="okcancelbuttons" notext="Ne pas quitter" yestext="Quitter"/>
+ </notification>
+ <notification label="" name="NoSearch">
+ La recherche est uniquement disponible en mode Avancé. Voulez-vous quitter l&apos;application afin de changer de mode ?
+ <usetemplate name="okcancelbuttons" notext="Ne pas quitter" yestext="Quitter"/>
+ </notification>
+ <notification label="" name="ConfirmHideUI">
+ Cette action masquera tous les boutons et articles de menu. Pour les récupérer, cliquez de nouveau sur [SHORTCUT].
+ <usetemplate ignoretext="Confirmer avant de masquer l&apos;interface" name="okcancelignore" notext="Annuler" yestext="OK"/>
+ </notification>
<global name="UnsupportedGLRequirements">
Vous semblez ne pas avoir le matériel requis pour utiliser [APP_NAME]. [APP_NAME] requiert une carte graphique OpenGL avec une prise en charge du multitexturing. Si vous avez une telle carte, assurez-vous que vous avez aussi les pilotes les plus récents pour la carte, ainsi que les service packs et les patchs pour votre système d&apos;exploitation.
diff --git a/indra/newview/skins/default/xui/fr/panel_activeim_row.xml b/indra/newview/skins/default/xui/fr/panel_activeim_row.xml
deleted file mode 100644
index 84272752cf..0000000000
--- a/indra/newview/skins/default/xui/fr/panel_activeim_row.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_activeim_row">
- <text name="contact_name">
- Grumpity ProductEngine
- </text>
-</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/fr/panel_avatar_list_item.xml
index 607665ddd8..54b8f53e59 100644
--- a/indra/newview/skins/default/xui/fr/panel_avatar_list_item.xml
+++ b/indra/newview/skins/default/xui/fr/panel_avatar_list_item.xml
@@ -21,7 +21,7 @@
<string name="FormatYears">
[COUNT] a
</string>
- <text name="avatar_name" value="Inconnu"/>
+ <text name="avatar_name" value="(chargement)"/>
<text name="last_interaction" value="0s"/>
<icon name="permission_edit_theirs_icon" tool_tip="Vous pouvez modifier les objets de cet(te) ami(e)."/>
<icon name="permission_edit_mine_icon" tool_tip="Cet(te) ami(e) peut modifier, supprimer ou prendre vos objets."/>
diff --git a/indra/newview/skins/default/xui/fr/panel_chat_header.xml b/indra/newview/skins/default/xui/fr/panel_chat_header.xml
index babbff3132..7916bf5155 100644
--- a/indra/newview/skins/default/xui/fr/panel_chat_header.xml
+++ b/indra/newview/skins/default/xui/fr/panel_chat_header.xml
@@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="im_header" name="im_header">
- <text_editor name="user_name" value="Ericag Vader"/>
<text name="time_box" value="23:30"/>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_chiclet_bar.xml b/indra/newview/skins/default/xui/fr/panel_chiclet_bar.xml
new file mode 100644
index 0000000000..de21996404
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_chiclet_bar.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="chiclet_bar">
+ <layout_stack name="toolbar_stack">
+ <layout_panel name="im_well_panel">
+ <chiclet_im_well name="im_well">
+ <button name="Unread IM messages" tool_tip="Conversations"/>
+ </chiclet_im_well>
+ </layout_panel>
+ <layout_panel name="notification_well_panel">
+ <chiclet_notification name="notification_well">
+ <button name="Unread" tool_tip="Notifications"/>
+ </chiclet_notification>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_alpha.xml b/indra/newview/skins/default/xui/fr/panel_edit_alpha.xml
index 3b81ef2a5f..a8b95c66fb 100644
--- a/indra/newview/skins/default/xui/fr/panel_edit_alpha.xml
+++ b/indra/newview/skins/default/xui/fr/panel_edit_alpha.xml
@@ -1,10 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_alpha_panel">
- <panel name="avatar_alpha_color_panel">
- <texture_picker label="Alpha bas" name="Lower Alpha" tool_tip="Cliquez pour sélectionner une image"/>
- <texture_picker label="Alpha haut" name="Upper Alpha" tool_tip="Cliquez pour sélectionner une image"/>
- <texture_picker label="Alpha tête" name="Head Alpha" tool_tip="Cliquez pour sélectionner une image"/>
- <texture_picker label="Alpha yeux" name="Eye Alpha" tool_tip="Cliquez pour sélectionner une image"/>
- <texture_picker label="Alpha cheveux" width="80" name="Hair Alpha" tool_tip="Cliquez pour sélectionner une image"/>
- </panel>
+ <scroll_container name="avatar_alpha_color_panel_scroll">
+ <panel name="avatar_alpha_color_panel">
+ <texture_picker label="Alpha bas" name="Lower Alpha" tool_tip="Cliquer pour sélectionner une image."/>
+ <texture_picker label="Alpha haut" name="Upper Alpha" tool_tip="Cliquer pour sélectionner une image."/>
+ <texture_picker label="Alpha tête" name="Head Alpha" tool_tip="Cliquer pour sélectionner une image."/>
+ <texture_picker label="Alpha yeux" name="Eye Alpha" tool_tip="Cliquer pour sélectionner une image."/>
+ <texture_picker label="Alpha cheveux" name="Hair Alpha" tool_tip="Cliquer pour sélectionner une image."/>
+ </panel>
+ </scroll_container>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_gloves.xml b/indra/newview/skins/default/xui/fr/panel_edit_gloves.xml
index 7f02222bef..68a7ac54e2 100644
--- a/indra/newview/skins/default/xui/fr/panel_edit_gloves.xml
+++ b/indra/newview/skins/default/xui/fr/panel_edit_gloves.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_gloves_panel">
<panel name="avatar_gloves_color_panel">
- <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/>
+ <texture_picker label="Texture" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/>
<color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="80"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_jacket.xml b/indra/newview/skins/default/xui/fr/panel_edit_jacket.xml
index 0a87471db8..7e467b130c 100644
--- a/indra/newview/skins/default/xui/fr/panel_edit_jacket.xml
+++ b/indra/newview/skins/default/xui/fr/panel_edit_jacket.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_jacket_panel">
<panel name="avatar_jacket_color_panel">
- <texture_picker label="Tissu (haut)" name="Upper Fabric" tool_tip="Cliquez pour sélectionner une image"/>
- <texture_picker label="Tissu (bas)" name="Lower Fabric" tool_tip="Cliquez pour sélectionner une image"/>
+ <texture_picker label="Texture (haut)" name="Upper Fabric" tool_tip="Cliquez pour sélectionner une image"/>
+ <texture_picker label="Texture (bas)" name="Lower Fabric" tool_tip="Cliquez pour sélectionner une image"/>
<color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="80"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_pants.xml b/indra/newview/skins/default/xui/fr/panel_edit_pants.xml
index b9f81278e2..60d8e947f8 100644
--- a/indra/newview/skins/default/xui/fr/panel_edit_pants.xml
+++ b/indra/newview/skins/default/xui/fr/panel_edit_pants.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_pants_panel">
<panel name="avatar_pants_color_panel">
- <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/>
+ <texture_picker label="Texture" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/>
<color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="80"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_physics.xml b/indra/newview/skins/default/xui/fr/panel_edit_physics.xml
new file mode 100644
index 0000000000..d79f7df90a
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_edit_physics.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_physics_panel">
+ <panel label="" name="accordion_panel">
+ <accordion name="physics_accordion">
+ <accordion_tab name="physics_breasts_updown_tab" title="Rebond des seins"/>
+ <accordion_tab name="physics_breasts_inout_tab" title="Décolleté"/>
+ <accordion_tab name="physics_breasts_leftright_tab" title="Balancement des seins"/>
+ <accordion_tab name="physics_belly_tab" title="Rebond du ventre"/>
+ <accordion_tab name="physics_butt_tab" title="Rebond des fesses"/>
+ <accordion_tab name="physics_butt_leftright_tab" title="Balancement des fesses"/>
+ <accordion_tab name="physics_advanced_tab" title="Paramètres avancés"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_pick.xml b/indra/newview/skins/default/xui/fr/panel_edit_pick.xml
index 2364d9bbb2..247e18da82 100644
--- a/indra/newview/skins/default/xui/fr/panel_edit_pick.xml
+++ b/indra/newview/skins/default/xui/fr/panel_edit_pick.xml
@@ -29,7 +29,7 @@
<layout_panel name="layout_panel1">
<button label="Enregistrer" name="save_changes_btn"/>
</layout_panel>
- <layout_panel name="layout_panel1">
+ <layout_panel name="layout_panel2">
<button label="Annuler" name="cancel_btn"/>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_profile.xml b/indra/newview/skins/default/xui/fr/panel_edit_profile.xml
index ef65d2fe24..9e63c88221 100644
--- a/indra/newview/skins/default/xui/fr/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/fr/panel_edit_profile.xml
@@ -29,11 +29,7 @@
<text name="display_name_label" value="Nom d&apos;affichage :"/>
<text name="solo_username_label" value="Nom d&apos;utilisateur :"/>
<button name="set_name" tool_tip="Définir un nom d&apos;affichage"/>
- <text name="solo_user_name" value="Hamilton Hitchings"/>
- <text name="user_name" value="Hamilton Hitchings"/>
- <text name="user_name_small" value="Hamilton Hitchings"/>
<text name="user_label" value="Nom d&apos;utilisateur :"/>
- <text name="user_slid" value="hamilton.linden"/>
<panel name="lifes_images_panel">
<panel name="second_life_image_panel">
<text name="second_life_photo_title_text" value="[SECOND_LIFE]:"/>
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_shirt.xml b/indra/newview/skins/default/xui/fr/panel_edit_shirt.xml
index e4e66db2ed..9a263f6148 100644
--- a/indra/newview/skins/default/xui/fr/panel_edit_shirt.xml
+++ b/indra/newview/skins/default/xui/fr/panel_edit_shirt.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_shirt_panel">
<panel name="avatar_shirt_color_panel">
- <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/>
+ <texture_picker label="Texture" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/>
<color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="80"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_shoes.xml b/indra/newview/skins/default/xui/fr/panel_edit_shoes.xml
index 6fca0fe121..3eb70923ef 100644
--- a/indra/newview/skins/default/xui/fr/panel_edit_shoes.xml
+++ b/indra/newview/skins/default/xui/fr/panel_edit_shoes.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_shoes_panel">
<panel name="avatar_shoes_color_panel">
- <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/>
+ <texture_picker label="Texture" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/>
<color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="80"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_skin.xml b/indra/newview/skins/default/xui/fr/panel_edit_skin.xml
index 9640adcdf8..f5f2738319 100644
--- a/indra/newview/skins/default/xui/fr/panel_edit_skin.xml
+++ b/indra/newview/skins/default/xui/fr/panel_edit_skin.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_skin_panel">
<panel name="avatar_skin_color_panel">
- <texture_picker label="Tatouage tête" name="Head Tattoos" tool_tip="Cliquez pour sélectionner une image" width="76"/>
- <texture_picker label="Tatouage haut" name="Upper Tattoos" tool_tip="Cliquez pour sélectionner une image" width="80"/>
- <texture_picker label="Tatouage bas" name="Lower Tattoos" tool_tip="Cliquez pour sélectionner une image"/>
+ <texture_picker label="Tête" name="Head" tool_tip="Cliquer pour sélectionner une image."/>
+ <texture_picker label="Haut du corps" name="Upper Body" tool_tip="Cliquer pour sélectionner une image."/>
+ <texture_picker label="Bas du corps" name="Lower Body" tool_tip="Cliquer pour sélectionner une image."/>
</panel>
<panel name="accordion_panel">
<accordion name="wearable_accordion">
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_skirt.xml b/indra/newview/skins/default/xui/fr/panel_edit_skirt.xml
index 65fed2fbf4..f562d67937 100644
--- a/indra/newview/skins/default/xui/fr/panel_edit_skirt.xml
+++ b/indra/newview/skins/default/xui/fr/panel_edit_skirt.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_skirt_panel">
<panel name="avatar_skirt_color_panel">
- <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/>
+ <texture_picker label="Texture" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/>
<color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="80"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_socks.xml b/indra/newview/skins/default/xui/fr/panel_edit_socks.xml
index b9e9a07b8c..f97047ae28 100644
--- a/indra/newview/skins/default/xui/fr/panel_edit_socks.xml
+++ b/indra/newview/skins/default/xui/fr/panel_edit_socks.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_socks_panel">
<panel name="avatar_socks_color_panel">
- <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/>
+ <texture_picker label="Texture" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/>
<color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="80"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_underpants.xml b/indra/newview/skins/default/xui/fr/panel_edit_underpants.xml
index 7eddbd93f6..c83ce04885 100644
--- a/indra/newview/skins/default/xui/fr/panel_edit_underpants.xml
+++ b/indra/newview/skins/default/xui/fr/panel_edit_underpants.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_underpants_panel">
<panel name="avatar_underpants_color_panel">
- <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/>
+ <texture_picker label="Texture" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/>
<color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="80"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_undershirt.xml b/indra/newview/skins/default/xui/fr/panel_edit_undershirt.xml
index e6bac22c23..689b7b81f4 100644
--- a/indra/newview/skins/default/xui/fr/panel_edit_undershirt.xml
+++ b/indra/newview/skins/default/xui/fr/panel_edit_undershirt.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_undershirt_panel">
<panel name="avatar_undershirt_color_panel">
- <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/>
+ <texture_picker label="Texture" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/>
<color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="80"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_wearable.xml b/indra/newview/skins/default/xui/fr/panel_edit_wearable.xml
index d7a3d3bd85..def158cf68 100644
--- a/indra/newview/skins/default/xui/fr/panel_edit_wearable.xml
+++ b/indra/newview/skins/default/xui/fr/panel_edit_wearable.xml
@@ -45,6 +45,9 @@
<string name="edit_tattoo_title">
Modification du tatouage
</string>
+ <string name="edit_physics_title">
+ Modification des propriétés physiques
+ </string>
<string name="shape_desc_text">
Silhouette :
</string>
@@ -90,6 +93,9 @@
<string name="tattoo_desc_text">
Tatouage :
</string>
+ <string name="physics_desc_text">
+ Propriétés physiques :
+ </string>
<labeled_back_button label="Enregistrer" name="back_btn" tool_tip="Revenir à Modifier la tenue"/>
<text name="edit_wearable_title" value="Modification de la silhouette"/>
<panel label="Chemise" name="wearable_type_panel">
diff --git a/indra/newview/skins/default/xui/fr/panel_instant_message.xml b/indra/newview/skins/default/xui/fr/panel_instant_message.xml
index bf3720f411..305d2d853c 100644
--- a/indra/newview/skins/default/xui/fr/panel_instant_message.xml
+++ b/indra/newview/skins/default/xui/fr/panel_instant_message.xml
@@ -4,7 +4,6 @@
6
</string>
<panel label="im_header" name="im_header">
- <text name="user_name" value="Erica Vader"/>
<text name="time_box" value="23:30"/>
</panel>
<button label="Répondre" name="reply"/>
diff --git a/indra/newview/skins/default/xui/fr/panel_login.xml b/indra/newview/skins/default/xui/fr/panel_login.xml
index b667780180..e54b36644c 100644
--- a/indra/newview/skins/default/xui/fr/panel_login.xml
+++ b/indra/newview/skins/default/xui/fr/panel_login.xml
@@ -11,12 +11,19 @@
<text name="username_text">
Nom d&apos;utilisateur :
</text>
- <line_editor label="bobsmith12 ou Steller Sunshine" name="username_edit" tool_tip="Nom d&apos;utilisateur que vous avez choisi lors de votre inscription (par exemple, bobsmith12 ou Steller Sunshine)."/>
+ <combo_box name="username_combo" tool_tip="Nom d&apos;utilisateur que vous avez choisi lors de votre inscription (par exemple, bobsmith12 ou Steller Sunshine)."/>
<text name="password_text">
Mot de passe :
</text>
<check_box label="Enregistrer" name="remember_check"/>
<button label="Connexion" name="connect_btn"/>
+ <text name="mode_selection_text">
+ Mode :
+ </text>
+ <combo_box name="mode_combo" tool_tip="Sélectionnez un mode. Pour une exploration facile et rapide avec chat, choisissez Basique. Pour accéder à plus de fonctionnalités, choisissez Avancé.">
+ <combo_box.item label="Basique" name="Basic"/>
+ <combo_box.item label="Avancé" name="Advanced"/>
+ </combo_box>
<text name="start_location_text">
Lieu de départ :
</text>
diff --git a/indra/newview/skins/default/xui/fr/panel_main_inventory.xml b/indra/newview/skins/default/xui/fr/panel_main_inventory.xml
index 3e7225d8ac..db7d254b7a 100644
--- a/indra/newview/skins/default/xui/fr/panel_main_inventory.xml
+++ b/indra/newview/skins/default/xui/fr/panel_main_inventory.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Choses" name="main inventory panel">
<panel.string name="ItemcountFetching">
- Récupération : [ITEM_COUNT] articles... [FILTER]
+ [ITEM_COUNT] articles récupérés... [FILTER]
</panel.string>
<panel.string name="ItemcountCompleted">
[ITEM_COUNT] articles [FILTER]
diff --git a/indra/newview/skins/default/xui/fr/panel_me.xml b/indra/newview/skins/default/xui/fr/panel_me.xml
index 219e5801f2..5676986228 100644
--- a/indra/newview/skins/default/xui/fr/panel_me.xml
+++ b/indra/newview/skins/default/xui/fr/panel_me.xml
@@ -1,7 +1,4 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Mon profil" name="panel_me">
- <tab_container name="tabs">
- <panel label="MON PROFIL" name="panel_profile"/>
- <panel label="MES FAVORIS" name="panel_picks"/>
- </tab_container>
+ <panel label="MES FAVORIS" name="panel_picks"/>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_my_profile.xml b/indra/newview/skins/default/xui/fr/panel_my_profile.xml
deleted file mode 100644
index 8dbc22d3c7..0000000000
--- a/indra/newview/skins/default/xui/fr/panel_my_profile.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Profil" name="panel_profile">
- <string name="CaptionTextAcctInfo">
- [ACCTTYPE]
-[PAYMENTINFO] [AGEVERIFICATION]
- </string>
- <string name="payment_update_link_url">
- http://www.secondlife.com/account/billing.php?lang=en
- </string>
- <string name="partner_edit_link_url">
- http://www.secondlife.com/account/partners.php?lang=en
- </string>
- <string name="my_account_link_url" value="http://secondlife.com/account"/>
- <string name="no_partner_text" value="Aucun"/>
- <string name="no_group_text" value="Aucun"/>
- <string name="RegisterDateFormat">
- [REG_DATE] ([AGE])
- </string>
- <layout_stack name="layout">
- <layout_panel name="profile_stack">
- <scroll_container name="profile_scroll">
- <panel name="scroll_content_panel">
- <panel name="second_life_image_panel">
- <icon label="" name="2nd_life_edit_icon" tool_tip="Cliquez sur le bouton Modifier le profil ci-dessous pour changer d&apos;image"/>
- <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/>
- </panel>
- <panel name="first_life_image_panel">
- <icon label="" name="real_world_edit_icon" tool_tip="Cliquez sur le bouton Modifier le profil ci-dessous pour changer d&apos;image"/>
- <text name="title_rw_descr_text" value="Vie réelle :"/>
- </panel>
- <text name="title_member_text" value="Résident depuis :"/>
- <text name="title_acc_status_text" value="Statut du compte :"/>
- <text_editor name="acc_status_text">
- Résident. Aucune info de paiement enregistrée.
- Linden.
- </text_editor>
- <text name="title_partner_text" value="Partenaire :"/>
- <panel name="partner_data_panel">
- <name_box initial_value="(récupération en cours)" name="partner_text"/>
- </panel>
- <text name="title_groups_text" value="Groupes :"/>
- </panel>
- </scroll_container>
- </layout_panel>
- </layout_stack>
- <panel name="profile_me_buttons_panel">
- <button label="Modifier le profil" name="edit_profile_btn" tool_tip="Modifier vos informations personnelles"/>
- </panel>
-</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_navigation_bar.xml b/indra/newview/skins/default/xui/fr/panel_navigation_bar.xml
index 45caf2323d..ecb1e9813a 100644
--- a/indra/newview/skins/default/xui/fr/panel_navigation_bar.xml
+++ b/indra/newview/skins/default/xui/fr/panel_navigation_bar.xml
@@ -1,18 +1,23 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="navigation_bar">
- <panel name="navigation_panel">
- <pull_button name="back_btn" tool_tip="Revenir à l&apos;emplacement précédent"/>
- <pull_button name="forward_btn" tool_tip="Avancer d&apos;un emplacement"/>
- <button name="home_btn" tool_tip="Me téléporter jusqu&apos;à mon domicile"/>
- <location_input label="Emplacement" name="location_combo"/>
- <search_combo_box label="Rechercher" name="search_combo_box" tool_tip="Rechercher">
- <combo_editor label="Rechercher dans [SECOND_LIFE]" name="search_combo_editor"/>
- </search_combo_box>
- </panel>
- <favorites_bar name="favorite" tool_tip="Faites glisser des repères ici pour un accès rapide à vos lieux favoris dans Second Life.">
- <label name="favorites_bar_label" tool_tip="Faites glisser des repères ici pour un accès rapide à vos lieux favoris dans Second Life.">
- Favoris
- </label>
- <chevron_button name="&gt;&gt;" tool_tip="Afficher d&apos;avantage de Favoris"/>
- </favorites_bar>
+ <layout_stack name="nvp_stack">
+ <layout_panel name="navigation_layout_panel">
+ <panel name="navigation_panel">
+ <pull_button name="back_btn" tool_tip="Revenir à l’emplacement précédent"/>
+ <pull_button name="forward_btn" tool_tip="Avancer d’un emplacement"/>
+ <button name="home_btn" tool_tip="Me téléporter jusqu’à mon domicile"/>
+ <location_input label="Endroit" name="location_combo"/>
+ </panel>
+ </layout_panel>
+ <layout_panel name="favorites_layout_panel">
+ <favorites_bar name="favorite" tool_tip="Faites glisser des repères ici pour un accès rapide à vos lieux favoris dans Second Life.">
+ <label name="favorites_bar_label" tool_tip="Faites glisser des repères ici pour un accès rapide à vos endroits favoris dans Second Life.">
+ Barre des Favoris
+ </label>
+ <more_button name="&gt;&gt;" tool_tip="Afficher d&apos;avantage de Favoris">
+ Plus â–¼
+ </more_button>
+ </favorites_bar>
+ </layout_panel>
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_nearby_chat.xml b/indra/newview/skins/default/xui/fr/panel_nearby_chat.xml
new file mode 100644
index 0000000000..b02e53269b
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_nearby_chat.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="nearby_chat">
+ <layout_stack name="stack">
+ <layout_panel name="translate_chat_checkbox_lp">
+ <check_box label="Traduire le chat" name="translate_chat_checkbox"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_nearby_media.xml b/indra/newview/skins/default/xui/fr/panel_nearby_media.xml
index 66bfd01a2a..7b7b67041a 100644
--- a/indra/newview/skins/default/xui/fr/panel_nearby_media.xml
+++ b/indra/newview/skins/default/xui/fr/panel_nearby_media.xml
@@ -19,7 +19,7 @@
<button label="Arrêter" name="all_nearby_media_disable_btn" tool_tip="Désactiver tous les médias près de vous"/>
<button label="Lire" name="all_nearby_media_enable_btn" tool_tip="Activer tous les médias près de vous"/>
<button name="open_prefs_btn" tool_tip="Ouvrir les préférences de média"/>
- <button label="Plus &gt;&gt;" label_selected="Moins &lt;&lt;" name="more_btn" tool_tip="Options avancées"/>
+ <button label="Plus &gt;&gt;" label_selected="&lt;&lt; Moins" name="more_btn" tool_tip="Options avancées"/>
<button label="Plus &gt;&gt;" label_selected="Moins &lt;&lt;" name="less_btn" tool_tip="Options avancées"/>
</panel>
<panel name="nearby_media_panel">
diff --git a/indra/newview/skins/default/xui/fr/panel_notes.xml b/indra/newview/skins/default/xui/fr/panel_notes.xml
deleted file mode 100644
index 1b44bc4b73..0000000000
--- a/indra/newview/skins/default/xui/fr/panel_notes.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Notes/Perso" name="panel_notes">
- <layout_stack name="layout">
- <layout_panel name="notes_stack">
- <scroll_container name="profile_scroll">
- <panel name="profile_scroll_panel">
- <text name="status_message" value="Mes notes perso :"/>
- <text name="status_message2" value="Autoriser cette personne à :"/>
- <check_box label="Afficher mon statut en ligne" name="status_check"/>
- <check_box label="Me situer sur la carte" name="map_check"/>
- <check_box label="Modifier, supprimer ou prendre mes objets" name="objects_check"/>
- </panel>
- </scroll_container>
- </layout_panel>
- <layout_panel name="notes_buttons_panel">
- <layout_stack name="bottom_bar_ls">
- <layout_panel name="add_friend_btn_lp">
- <button label="Devenir amis" name="add_friend" tool_tip="Proposer à ce résident de devenir votre ami"/>
- </layout_panel>
- <layout_panel name="im_btn_lp">
- <button label="IM" name="im" tool_tip="Ouvrir une session IM"/>
- </layout_panel>
- <layout_panel name="call_btn_lp">
- <button label="Appeler" name="call" tool_tip="Appeler ce résident"/>
- </layout_panel>
- <layout_panel name="show_on_map_btn_lp">
- <button label="Carte" name="show_on_map_btn" tool_tip="Afficher le résident sur la carte"/>
- </layout_panel>
- <layout_panel name="teleport_btn_lp">
- <button label="Téléporter" name="teleport" tool_tip="Proposer une téléportation"/>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_notify_textbox.xml b/indra/newview/skins/default/xui/fr/panel_notify_textbox.xml
new file mode 100644
index 0000000000..6ce09cde4b
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_notify_textbox.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="instant_message" name="panel_notify_textbox">
+ <string name="message_max_lines_count" value="7"/>
+ <panel label="info_panel" name="info_panel">
+ <text_editor name="message" value="message"/>
+ </panel>
+ <panel label="control_panel" name="control_panel">
+ <button label="Soumettre" name="btn_submit"/>
+ <button label="Ignorer" name="ignore_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_outbox_inventory.xml b/indra/newview/skins/default/xui/fr/panel_outbox_inventory.xml
new file mode 100644
index 0000000000..d947dbceb8
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_outbox_inventory.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<outbox_inventory_panel name="inventory_outbox" tool_tip="Glisser-déposer des articles ici afin de les préparer à la vente sur votre vitrine."/>
diff --git a/indra/newview/skins/default/xui/fr/panel_outfits_list.xml b/indra/newview/skins/default/xui/fr/panel_outfits_list.xml
index ab352deec4..416353e1d4 100644
--- a/indra/newview/skins/default/xui/fr/panel_outfits_list.xml
+++ b/indra/newview/skins/default/xui/fr/panel_outfits_list.xml
@@ -1,7 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="Outfits">
+ <accordion name="outfits_accordion">
+ <no_matched_tabs_text name="no_matched_outfits_msg" value="Vous n&apos;avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/all/[SEARCH_TERM] Rechercher]."/>
+ <no_visible_tabs_text name="no_outfits_msg" value="Aucune tenue n&apos;est actuellement en votre possession. Essayez [secondlife:///app/search/all Rechercher]."/>
+ </accordion>
<panel name="bottom_panel">
- <button name="options_gear_btn" tool_tip="Afficher d&apos;autres options"/>
+ <menu_button name="options_gear_btn" tool_tip="Afficher d&apos;autres options"/>
<button name="trash_btn" tool_tip="Supprimer la tenue sélectionnée"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_people.xml b/indra/newview/skins/default/xui/fr/panel_people.xml
index 0ca4208282..f035853efc 100644
--- a/indra/newview/skins/default/xui/fr/panel_people.xml
+++ b/indra/newview/skins/default/xui/fr/panel_people.xml
@@ -2,9 +2,9 @@
<!-- Side tray panel -->
<panel label="Résidents" name="people_panel">
<string name="no_recent_people" value="Personne de récent. Pour rechercher des résidents avec qui passer du temps, voir [secondlife:///app/search/people Rechercher] ou [secondlife:///app/worldmap Carte du monde]."/>
- <string name="no_filtered_recent_people" value="Vous n&apos;avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/people/Rechercher [SEARCH_TERM]]."/>
+ <string name="no_filtered_recent_people" value="Vous n&apos;avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/people/[SEARCH_TERM] Rechercher]."/>
<string name="no_one_near" value="Personne près de vous. Pour rechercher des résidents avec qui passer du temps, voir [secondlife:///app/search/people Rechercher] ou [secondlife:///app/worldmap Carte du monde]."/>
- <string name="no_one_filtered_near" value="Vous n&apos;avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/people/Rechercher [SEARCH_TERM]]."/>
+ <string name="no_one_filtered_near" value="Vous n&apos;avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/people/[SEARCH_TERM] Rechercher]."/>
<string name="no_friends_online" value="Pas d&apos;amis connectés"/>
<string name="no_friends" value="Pas d&apos;amis"/>
<string name="no_friends_msg">
@@ -12,17 +12,19 @@
Pour rechercher des résidents avec qui passer du temps, utilisez [secondlife:///app/worldmap Carte du monde].
</string>
<string name="no_filtered_friends_msg">
- Vous n&apos;avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/people/Rechercher [SEARCH_TERM]].
+ Vous n&apos;avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/people/[SEARCH_TERM] Rechercher].
</string>
<string name="people_filter_label" value="Filtrer les personnes"/>
<string name="groups_filter_label" value="Filtrer les groupes"/>
- <string name="no_filtered_groups_msg" value="Vous n&apos;avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/groups/Rechercher [SEARCH_TERM]]."/>
+ <string name="no_filtered_groups_msg" value="Vous n&apos;avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/groups/[SEARCH_TERM] Rechercher]."/>
<string name="no_groups_msg" value="Vous souhaitez trouver des groupes à rejoindre ? Utilisez [secondlife:///app/search/groups Rechercher]."/>
+ <string name="MiniMapToolTipMsg" value="[REGION](Carte : double-clic ; Panoramique : Maj + faire glisser)"/>
+ <string name="AltMiniMapToolTipMsg" value="[REGION](Téléportation : double-clic ; Panoramique : Maj + faire glisser)"/>
<filter_editor label="Filtre" name="filter_input"/>
<tab_container name="tabs">
<panel label="PRÈS DE VOUS" name="nearby_panel">
<panel label="bottom_panel" name="bottom_panel">
- <button name="nearby_view_sort_btn" tool_tip="Options"/>
+ <menu_button name="nearby_view_sort_btn" tool_tip="Options"/>
<button name="add_friend_btn" tool_tip="Ajouter le résident sélectionné à votre liste d&apos;amis"/>
</panel>
</panel>
@@ -34,27 +36,27 @@ Pour rechercher des résidents avec qui passer du temps, utilisez [secondlife://
<panel label="bottom_panel" name="bottom_panel">
<layout_stack name="bottom_panel">
<layout_panel name="options_gear_btn_panel">
- <button name="friends_viewsort_btn" tool_tip="Afficher d&apos;autres options"/>
+ <menu_button name="friends_viewsort_btn" tool_tip="Afficher d&apos;autres options"/>
</layout_panel>
<layout_panel name="add_btn_panel">
<button name="add_btn" tool_tip="Proposer à un résident de devenir votre ami"/>
</layout_panel>
<layout_panel name="trash_btn_panel">
- <dnd_button name="trash_btn" tool_tip="Supprimer le résident sélectionné de votre liste d&apos;amis"/>
+ <dnd_button name="del_btn" tool_tip="Supprimer le résident sélectionné de votre liste d&apos;amis."/>
</layout_panel>
</layout_stack>
</panel>
</panel>
<panel label="MES GROUPES" name="groups_panel">
<panel label="bottom_panel" name="bottom_panel">
- <button name="groups_viewsort_btn" tool_tip="Options"/>
+ <menu_button name="groups_viewsort_btn" tool_tip="Options"/>
<button name="plus_btn" tool_tip="Rejoindre/créer un nouveau groupe"/>
<button name="activate_btn" tool_tip="Activer le groupe sélectionné"/>
</panel>
</panel>
<panel label="RÉCENT" name="recent_panel">
<panel label="bottom_panel" name="bottom_panel">
- <button name="recent_viewsort_btn" tool_tip="Options"/>
+ <menu_button name="recent_viewsort_btn" tool_tip="Options"/>
<button name="add_friend_btn" tool_tip="Ajouter le résident sélectionné à votre liste d&apos;amis"/>
</panel>
</panel>
@@ -64,17 +66,17 @@ Pour rechercher des résidents avec qui passer du temps, utilisez [secondlife://
<layout_panel name="view_profile_btn_lp">
<button label="Profil" name="view_profile_btn" tool_tip="Afficher la photo, les groupes et autres infos des résidents"/>
</layout_panel>
- <layout_panel name="chat_btn_lp">
- <button label="IM" name="im_btn" tool_tip="Ouvrir une session IM"/>
+ <layout_panel name="im_btn_lp">
+ <button label="IM" name="im_btn" tool_tip="Ouvrir une session IM."/>
</layout_panel>
- <layout_panel name="chat_btn_lp">
- <button label="Appel" name="call_btn" tool_tip="Appeler ce résident"/>
+ <layout_panel name="call_btn_lp">
+ <button label="Appel" name="call_btn" tool_tip="Appeler ce résident."/>
</layout_panel>
- <layout_panel name="chat_btn_lp">
- <button label="Partager" name="share_btn" tool_tip="Partager un article de l&apos;inventaire"/>
+ <layout_panel name="share_btn_lp">
+ <button label="Partager" name="share_btn" tool_tip="Partager un article de l&apos;inventaire."/>
</layout_panel>
- <layout_panel name="chat_btn_lp">
- <button label="Téléporter" name="teleport_btn" tool_tip="Proposer une téléportation"/>
+ <layout_panel name="teleport_btn_lp">
+ <button label="Téléporter" name="teleport_btn" tool_tip="Proposer une téléportation."/>
</layout_panel>
</layout_stack>
<layout_stack name="bottom_bar_ls1">
diff --git a/indra/newview/skins/default/xui/fr/panel_place_profile.xml b/indra/newview/skins/default/xui/fr/panel_place_profile.xml
index 3c2c1b9d37..30be838896 100644
--- a/indra/newview/skins/default/xui/fr/panel_place_profile.xml
+++ b/indra/newview/skins/default/xui/fr/panel_place_profile.xml
@@ -68,6 +68,8 @@
<text name="scripts_value" value="Activé"/>
<text name="damage_label" value="Dégâts :"/>
<text name="damage_value" value="Désactivé"/>
+ <text name="see_avatars_label" value="Voir les avatars :"/>
+ <text name="see_avatars_value" value="Désactivé"/>
<button label="À propos du terrain" name="about_land_btn"/>
</panel>
</accordion_tab>
diff --git a/indra/newview/skins/default/xui/fr/panel_places.xml b/indra/newview/skins/default/xui/fr/panel_places.xml
index 7f3601b90d..5ec48c44c7 100644
--- a/indra/newview/skins/default/xui/fr/panel_places.xml
+++ b/indra/newview/skins/default/xui/fr/panel_places.xml
@@ -21,12 +21,12 @@
<button label="Modifier" name="edit_btn" tool_tip="Modifier les informations du repère"/>
</layout_panel>
<layout_panel name="overflow_btn_lp">
- <button label="â–¼" name="overflow_btn" tool_tip="Afficher d&apos;autres options"/>
+ <menu_button label="â–¼" name="overflow_btn" tool_tip="Afficher d&apos;autres options"/>
</layout_panel>
</layout_stack>
- <layout_stack name="bottom_bar_ls3">
+ <layout_stack name="bottom_bar_profile_ls">
<layout_panel name="profile_btn_lp">
- <button label="Profil" name="profile_btn" tool_tip="Afficher le profil de l&apos;endroit"/>
+ <button label="Profil" name="profile_btn" tool_tip="Afficher le profil de l&apos;endroit."/>
</layout_panel>
</layout_stack>
<layout_stack name="bottom_bar_close_ls3">
diff --git a/indra/newview/skins/default/xui/fr/panel_postcard_message.xml b/indra/newview/skins/default/xui/fr/panel_postcard_message.xml
new file mode 100644
index 0000000000..0f8397cfb4
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_postcard_message.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_postcard_message">
+ <text name="to_label">
+ À :
+ </text>
+ <text name="name_label">
+ De :
+ </text>
+ <text name="subject_label">
+ Objet :
+ </text>
+ <line_editor label="Saisir ici votre objet" name="subject_form"/>
+ <text name="msg_label">
+ Message :
+ </text>
+ <text_editor name="msg_form">
+ Saisir ici votre message
+ </text_editor>
+ <button label="Annuler" name="cancel_btn"/>
+ <button label="Envoyer" name="send_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_postcard_settings.xml b/indra/newview/skins/default/xui/fr/panel_postcard_settings.xml
new file mode 100644
index 0000000000..6f4e9c23f9
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_postcard_settings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_postcard_settings">
+ <combo_box label="Résolution" name="postcard_size_combo">
+ <combo_box.item label="Fenêtre actuelle" name="CurrentWindow"/>
+ <combo_box.item label="640 x 480" name="640x480"/>
+ <combo_box.item label="800 x 600" name="800x600"/>
+ <combo_box.item label="1 024 x 768" name="1024x768"/>
+ <combo_box.item label="Personnalisée" name="Custom"/>
+ </combo_box>
+ <layout_stack name="postcard_image_params_ls">
+ <layout_panel name="postcard_image_size_lp">
+ <spinner label="Largeur" name="postcard_snapshot_width"/>
+ <spinner label="Hauteur" name="postcard_snapshot_height"/>
+ <check_box label="Conserver les proportions" name="postcard_keep_aspect_check"/>
+ </layout_panel>
+ <layout_panel name="postcard_image_format_quality_lp">
+ <slider label="Qualité de l&apos;image" name="image_quality_slider"/>
+ <text name="image_quality_level">
+ ([QLVL])
+ </text>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/fr/panel_preferences_advanced.xml
index 9af3a8a5d8..3f3d0f51f4 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_advanced.xml
@@ -3,35 +3,29 @@
<panel.string name="aspect_ratio_text">
[NUM]:[DEN]
</panel.string>
- <panel.string name="middle_mouse">
- Bouton central de la souris
- </panel.string>
- <slider label="Angle de vue" name="camera_fov"/>
- <slider label="Distance" name="camera_offset_scale"/>
- <text name="heading2">
- Positionnement automatique pour :
+ <text name="Cache:">
+ Cache :
+ </text>
+ <spinner label="Taille du cache (64 - 9984 Mo)" name="cachesizespinner"/>
+ <text name="text_box5">
+ Mo
+ </text>
+ <button label="Vider le cache" label_selected="Vider le cache" name="clear_cache"/>
+ <text name="Cache location">
+ Emplacement du cache :
</text>
- <check_box label="Construire/Modifier" name="edit_camera_movement" tool_tip="Utilisez le positionnement automatique de la caméra quand vous accédez au mode de modification et quand vous le quittez"/>
- <check_box label="Apparence" name="appearance_camera_movement" tool_tip="Utiliser le positionnement automatique de la caméra quand je suis en mode Édition"/>
- <check_box initial_value="true" label="Panneau latéral" name="appearance_sidebar_positioning" tool_tip="Positionnement auto de la caméra pour le panneau latéral"/>
- <check_box label="Afficher en vue subjective" name="first_person_avatar_visible"/>
- <check_box label="Les touches de direction me font toujours me déplacer" name="arrow_keys_move_avatar_check"/>
- <check_box label="Appuyer deux fois et maintenir enfoncé pour courir" name="tap_tap_hold_to_run"/>
- <check_box label="Faire bouger les lèvres de l&apos;avatar quand il parle" name="enable_lip_sync"/>
- <check_box label="Bulles de chat" name="bubble_text_chat"/>
- <slider label="Opacité" name="bubble_chat_opacity"/>
- <color_swatch name="background" tool_tip="Choisir la couleur des bulles de chat"/>
+ <button label="Parcourir" label_selected="Parcourir" name="set_cache"/>
+ <button label="Par défaut" label_selected="Par défaut" name="default_cache_location"/>
<text name="UI Size:">
- Taille de l&apos;interface
+ Taille d&apos;interface :
</text>
<check_box label="Afficher les erreurs de script dans :" name="show_script_errors"/>
<radio_group name="show_location">
<radio_item label="Chat près de moi" name="0"/>
<radio_item label="Autre fenêtre" name="1"/>
</radio_group>
- <check_box label="Activer/désactiver la fonction Parler quand j&apos;appuie sur :" name="push_to_talk_toggle_check" tool_tip="En mode bascule, appuyez une fois sur la touche de contrôle de la fonction, puis relâchez-la pour activer/désactiver votre micro. Si vous n&apos;êtes pas en mode bascule, le micro ne diffuse votre voix que quand vous maintenez la touche de contrôle de la fonction enfoncée."/>
- <line_editor label="Touche de contrôle de la fonction Appuyer pour parler" name="modifier_combo"/>
- <button label="Définir la touche" name="set_voice_hotkey_button"/>
- <button label="Bouton central de la souris" name="set_voice_middlemouse_button" tool_tip="Réinitialiser sur le bouton central de la souris"/>
- <button label="Autres accessoires" name="joystick_setup_button"/>
+ <check_box label="Clients multiples autorisés" name="allow_multiple_viewer_check"/>
+ <check_box label="Liste de sélection de grille affichée à la connexion" name="show_grid_selection_check"/>
+ <check_box label="Menu Avancé affiché" name="show_advanced_menu_check"/>
+ <check_box label="Menu Développeurs affiché" name="show_develop_menu_check"/>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml b/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml
index a482fa99d0..76ed237451 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml
@@ -8,44 +8,10 @@
<radio_item label="Moyenne" name="radio2" value="1"/>
<radio_item label="Grande" name="radio3" value="2"/>
</radio_group>
- <text name="font_colors">
- Couleurs de police :
- </text>
- <color_swatch label="Vous" name="user"/>
- <text name="text_box1">
- Moi
- </text>
- <color_swatch label="Avatars" name="agent"/>
- <text name="text_box2">
- Avatars
- </text>
- <color_swatch label="IM" name="im"/>
- <text name="text_box3">
- IM
- </text>
- <color_swatch label="Système" name="system"/>
- <text name="text_box4">
- Système
- </text>
- <color_swatch label="Erreurs de script" name="script_error"/>
- <text name="text_box5">
- Erreurs de script
- </text>
- <color_swatch label="Objets" name="objects"/>
- <text name="text_box6">
- Objets
- </text>
- <color_swatch label="Propriétaire" name="owner"/>
- <text name="text_box7">
- Propriétaire
- </text>
- <color_swatch label="URL" name="links"/>
- <text name="text_box9">
- URL
- </text>
- <check_box initial_value="true" label="Jouer l&apos;animation clavier quand vous écrivez" name="play_typing_animation"/>
+ <check_box initial_value="true" label="Exécuter l&apos;animation clavier quand vous écrivez" name="play_typing_animation"/>
<check_box label="M&apos;envoyer les IM par e-mail une fois déconnecté" name="send_im_to_email"/>
<check_box label="Activer l&apos;historique des chats et des IM en texte brut" name="plain_text_chat_history"/>
+ <check_box label="Bulles de chat" name="bubble_text_chat"/>
<text name="show_ims_in_label">
Afficher les IM dans :
</text>
@@ -56,27 +22,12 @@
<radio_item label="Plusieurs fenêtres" name="radio" value="0"/>
<radio_item label="Onglets" name="radio2" value="1"/>
</radio_group>
- <check_box label="Utiliser la traduction automatique lors des chats (fournie par Google)" name="translate_chat_checkbox"/>
- <text name="translate_language_text">
- Traduire le chat en :
- </text>
- <combo_box name="translate_language_combobox">
- <combo_box.item label="Choix par défaut" name="System Default Language"/>
- <combo_box.item label="English (Anglais)" name="English"/>
- <combo_box.item label="Dansk (Danois)" name="Danish"/>
- <combo_box.item label="Deutsch (Allemand)" name="German"/>
- <combo_box.item label="Español (Espagnol)" name="Spanish"/>
- <combo_box.item label="Français" name="French"/>
- <combo_box.item label="Italiano (Italien)" name="Italian"/>
- <combo_box.item label="Magyar (Hongrois)" name="Hungarian"/>
- <combo_box.item label="Nederlands (Néerlandais)" name="Dutch"/>
- <combo_box.item label="Polski (Polonais)" name="Polish"/>
- <combo_box.item label="Português (Portugais)" name="Portugese"/>
- <combo_box.item label="РуÑÑкий (Russe)" name="Russian"/>
- <combo_box.item label="Türkçe (Turc)" name="Turkish"/>
- <combo_box.item label="УкраїнÑька (Ukrainien)" name="Ukrainian"/>
- <combo_box.item label="中文 (简体) (Chinois)" name="Chinese"/>
- <combo_box.item label="日本語 (Japonais)" name="Japanese"/>
- <combo_box.item label="한국어 (Coréen)" name="Korean"/>
- </combo_box>
+ <text name="disable_toast_label">
+ Activer les popups de chat entrant :
+ </text>
+ <check_box label="Chats de groupe" name="EnableGroupChatPopups" tool_tip="Cocher cette case pour qu&apos;un popup s&apos;affiche à réception d&apos;un message de chat de groupe."/>
+ <check_box label="Chats IM" name="EnableIMChatPopups" tool_tip="Cocher cette case pour qu&apos;un popup s&apos;affiche à réception d&apos;un message instantané."/>
+ <spinner label="Durée de vie du popup Chat près de moi :" name="nearby_toasts_lifetime"/>
+ <spinner label="Disparition progressive du popup Chat près de moi :" name="nearby_toasts_fadingtime"/>
+ <button label="Traduction automatique" name="ok_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_colors.xml b/indra/newview/skins/default/xui/fr/panel_preferences_colors.xml
new file mode 100644
index 0000000000..e50fd2b6f3
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_colors.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Couleurs" name="colors_panel">
+ <text name="effects_color_textbox">
+ Mes effets (faisceau de sélection) :
+ </text>
+ <color_swatch name="effect_color_swatch" tool_tip="Cliquer pour ouvrir le sélecteur de couleurs."/>
+ <text name="font_colors">
+ Couleurs pour le chat :
+ </text>
+ <text name="text_box1">
+ Moi
+ </text>
+ <text name="text_box2">
+ Autres résidents
+ </text>
+ <text name="text_box3">
+ Objets
+ </text>
+ <text name="text_box4">
+ Système
+ </text>
+ <text name="text_box5">
+ Erreurs
+ </text>
+ <text name="text_box10">
+ Direct
+ </text>
+ <text name="text_box7">
+ Propriétaire
+ </text>
+ <text name="text_box9">
+ URL
+ </text>
+ <text name="bubble_chat">
+ Couleur de fond des noms (bulles de chat comprises) :
+ </text>
+ <color_swatch name="background" tool_tip="Choisir une couleur pour les noms."/>
+ <slider label="Opacité :" name="bubble_chat_opacity" tool_tip="Choisir une opacité pour les noms."/>
+ <text name="floater_opacity">
+ Opacité des fenêtres flottantes :
+ </text>
+ <slider label="Actives :" name="active"/>
+ <slider label="Inactives :" name="inactive"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_general.xml b/indra/newview/skins/default/xui/fr/panel_preferences_general.xml
index 30389a0ef9..66b84af3aa 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_general.xml
@@ -11,10 +11,12 @@
<combo_box.item label="Español (Espagnol) - Bêta" name="Spanish"/>
<combo_box.item label="Français - Bêta" name="French"/>
<combo_box.item label="Italiano (Italien) - Bêta" name="Italian"/>
- <combo_box.item label="Nederlands (Néerlandais) - Bêta" name="Dutch"/>
<combo_box.item label="Polski (Polonais) - Bêta" name="Polish"/>
<combo_box.item label="Português (Portugais) - Bêta" name="Portugese"/>
+ <combo_box.item label="РуÑÑкий (Russe) - Bêta" name="Russian"/>
+ <combo_box.item label="Türkçe (Turc) - Bêta" name="Turkish"/>
<combo_box.item label="日本語 (Japonais) - Bêta" name="(Japanese)"/>
+ <combo_box.item label="正體中文 (Chinois traditionnel) - Bêta" name="Traditional Chinese"/>
</combo_box>
<text name="language_textbox2">
(redémarrage requis)
@@ -48,13 +50,17 @@
<check_box label="Noms d&apos;utilisateur" name="show_slids" tool_tip="Afficher le nom d&apos;utilisateur, comme bobsmith123."/>
<check_box label="Titres de groupe" name="show_all_title_checkbox1" tool_tip="Afficher les titres de groupe, comme Officier ou Membre."/>
<check_box label="Mettre mes amis en surbrillance" name="show_friends" tool_tip="Mettre en surbrillance l&apos;affichage des noms de vos amis."/>
- <text name="effects_color_textbox">
- Mes effets :
+ <check_box label="Voir les noms d&apos;affichage" name="display_names_check" tool_tip="Cocher pour utiliser les noms d&apos;affichage dans les chats, les IM, l&apos;affichage des noms, etc."/>
+ <text name="inworld_typing_rg_label">
+ Appuyer sur les touches lettre :
</text>
+ <radio_group name="inworld_typing_preference">
+ <radio_item label="Lance le chat local" name="radio_start_chat" value="1"/>
+ <radio_item label="Affecte le déplacement (ZQSD/WASD)" name="radio_move" value="0"/>
+ </radio_group>
<text name="title_afk_text">
Me montrer absent après :
</text>
- <color_swatch label="" name="effect_color_swatch" tool_tip="Cliquer pour ouvrir le sélecteur de couleurs"/>
<combo_box label="Me montrer absent après :" name="afk">
<combo_box.item label="2 minutes" name="item0"/>
<combo_box.item label="5 minutes" name="item1"/>
@@ -62,7 +68,6 @@
<combo_box.item label="30 minutes" name="item3"/>
<combo_box.item label="Jamais" name="item4"/>
</combo_box>
- <check_box label="Voir les noms d&apos;affichage" name="display_names_check" tool_tip="Cocher pour utiliser les noms d&apos;affichage dans les chats, les IM, l&apos;affichage des noms, etc."/>
<text name="text_box3">
Réponse si occupé(e) :
</text>
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml
index 0c8d957f5b..a738b2d43f 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml
@@ -25,9 +25,22 @@
<text name="ShadersText">
Effets :
</text>
+ <check_box initial_value="true" label="Eau transparente" name="TransparentWater"/>
<check_box initial_value="true" label="Placage de relief et brillance" name="BumpShiny"/>
+ <check_box initial_value="true" label="Lumières locales" name="LocalLights"/>
<check_box initial_value="true" label="Effets de base" name="BasicShaders" tool_tip="La désactivation de cette option peut éviter le plantage de certains pilotes de cartes graphiques"/>
<check_box initial_value="true" label="Effets atmosphériques" name="WindLightUseAtmosShaders"/>
+ <check_box initial_value="true" label="Éclairage et ombres" name="UseLightShaders"/>
+ <check_box initial_value="true" label="Occlusion ambiante" name="UseSSAO"/>
+ <check_box initial_value="true" label="Profondeur de champ" name="UseDoF"/>
+ <text name="shadows_label">
+ Ombres :
+ </text>
+ <combo_box name="ShadowDetail">
+ <combo_box.item label="Aucune" name="0"/>
+ <combo_box.item label="Soleil/Lune" name="1"/>
+ <combo_box.item label="Soleil/Lune + Projecteurs" name="2"/>
+ </combo_box>
<text name="reflection_label">
Reflets dans l&apos;eau :
</text>
@@ -38,12 +51,16 @@
<combo_box.item label="Tous les objets et avatars" name="3"/>
<combo_box.item label="Tout" name="4"/>
</combo_box>
+ <slider label="Prop. physiques avatar :" name="AvatarPhysicsDetail"/>
+ <text name="AvatarPhysicsDetailText">
+ Faible
+ </text>
<slider label="Limite d&apos;affichage :" name="DrawDistance"/>
<text name="DrawDistanceMeterText2">
m
</text>
- <slider label="Nombre de particules max. :" label_width="147" name="MaxParticleCount"/>
- <slider label="Nb max d&apos;avatars non éloignés en 2D :" name="MaxNumberAvatarDrawn"/>
+ <slider label="Nb max. de particules :" label_width="147" name="MaxParticleCount"/>
+ <slider label="Avatars max. non éloignés en 2D :" name="MaxNumberAvatarDrawn"/>
<slider label="Qualité post-traitement :" name="RenderPostProcess"/>
<text name="MeshDetailText">
Détails des rendus :
@@ -76,7 +93,7 @@
Faible
</text>
<text name="AvatarRenderingText">
- Rendu de l&apos;avatar :
+ Rendu de l&apos;avatar :
</text>
<check_box initial_value="true" label="Avatars éloignés en 2D" name="AvatarImpostors"/>
<check_box initial_value="true" label="Accélération du rendu" name="AvatarVertexProgram"/>
@@ -85,8 +102,8 @@
Rendu du terrain :
</text>
<radio_group name="TerrainDetailRadio">
- <radio_item label="Bas" name="0"/>
- <radio_item label="Haut" name="2"/>
+ <radio_item label="Faible" name="0"/>
+ <radio_item label="Élevé" name="2"/>
</radio_group>
--&gt;
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_move.xml b/indra/newview/skins/default/xui/fr/panel_preferences_move.xml
new file mode 100644
index 0000000000..94d7322b22
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_move.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Déplacement" name="move_panel">
+ <slider label="Angle de vue" name="camera_fov"/>
+ <slider label="Distance" name="camera_offset_scale"/>
+ <text name="heading2">
+ Positionnement automatique pour :
+ </text>
+ <check_box label="Construire/Modifier" name="edit_camera_movement" tool_tip="Utiliser le positionnement automatique de la caméra lorsque vous entrez en mode de modification et le quittez."/>
+ <check_box label="Apparence" name="appearance_camera_movement" tool_tip="Utiliser le positionnement automatique de la caméra en mode de modification."/>
+ <text name="keyboard_lbl">
+ Clavier :
+ </text>
+ <check_box label="Les touches de direction me font toujours me déplacer" name="arrow_keys_move_avatar_check"/>
+ <check_box label="Appuyer deux fois et maintenir enfoncé pour courir" name="tap_tap_hold_to_run"/>
+ <text name="mouse_lbl">
+ Souris :
+ </text>
+ <check_box label="Afficher en vue subjective" name="first_person_avatar_visible"/>
+ <text name=" Mouse Sensitivity">
+ Sensibilité de la souris en vue subjective :
+ </text>
+ <check_box label="Inverser" name="invert_mouse"/>
+ <text name="single_click_action_lbl">
+ Clic simple sur le terrain :
+ </text>
+ <combo_box name="single_click_action_combo">
+ <combo_box.item label="Aucune action" name="0"/>
+ <combo_box.item label="Déplacement vers le clic" name="1"/>
+ </combo_box>
+ <text name="double_click_action_lbl">
+ Double-clic sur le terrain :
+ </text>
+ <combo_box name="double_click_action_combo">
+ <combo_box.item label="Aucune action" name="0"/>
+ <combo_box.item label="Déplacement vers le double clic" name="1"/>
+ <combo_box.item label="Téléportation vers le double clic" name="2"/>
+ </combo_box>
+ <button label="Autres accessoires" name="joystick_setup_button"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/fr/panel_preferences_privacy.xml
index f14ccc3a8e..cf1a374da6 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_privacy.xml
@@ -3,24 +3,29 @@
<panel.string name="log_in_to_change">
se connecter pour changer
</panel.string>
- <button label="Vider le cache" name="clear_cache" tool_tip="Effacer l&apos;image de connexion, le dernier lieu, l&apos;historique des téléportations et la texture du cache."/>
+ <button label="Vider l'historique" name="clear_cache" tool_tip="Effacer le cache de l&apos;image de connexion, du dernier lieu, de l&apos;historique des téléportations, Web et de texture."/>
<text name="cache_size_label_l">
- (Endroits, images, web, historique des recherches)
+ (endroits, images, web, historique des recherches)
</text>
+ <check_box label="M&apos;afficher dans les résultats de recherche" name="online_searchresults"/>
<check_box label="Seuls mes amis et groupes voient quand je suis en ligne" name="online_visibility"/>
<check_box label="Seuls mes amis et groupes peuvent m&apos;appeler ou m&apos;envoyer un IM" name="voice_call_friends_only_check"/>
<check_box label="Fermer le micro à la fin d&apos;un appel" name="auto_disengage_mic_check"/>
- <check_box label="Accepter les cookies" name="cookies_enabled"/>
+ <check_box label="Afficher mes repères favoris à la connexion (liste déroulante Lieu de départ)" name="favorites_on_login_check"/>
<text name="Logs:">
- Journaux :
+ Journaux de chat :
</text>
<check_box label="Sauvegarder les chats près de moi sur mon ordinateur" name="log_nearby_chat"/>
<check_box label="Sauvegarder les IM sur mon ordinateur" name="log_instant_messages"/>
- <check_box label="Inclure les dates et heures" name="show_timestamps_check_im"/>
+ <check_box label="Inclure la date et l&apos;heure pour chaque ligne du journal de chat" name="show_timestamps_check_im"/>
+ <check_box label="Inclure la date dans le nom du fichier journal" name="logfile_name_datestamp"/>
<text name="log_path_desc">
- Emplacement :
+ Emplacement journaux :
</text>
<line_editor left="308" name="log_path_string" right="-20"/>
<button label="Parcourir" label_selected="Parcourir" name="log_path_button" width="150"/>
<button label="Liste des ignorés" name="block_list"/>
+ <text name="block_list_label">
+ (personnes et/ou objets que vous avez ignorés)
+ </text>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml b/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml
index c1cec7537e..83303950dc 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml
@@ -1,12 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Configuration" name="Input panel">
- <text name="Mouselook:">
- Vue subjective :
- </text>
- <text name=" Mouse Sensitivity">
- Sensibilité de la souris
- </text>
- <check_box label="Inverser" name="invert_mouse"/>
<text name="Network:">
Réseau :
</text>
@@ -18,32 +11,26 @@
</text>
<check_box label="Port de connexion" name="connection_port_enabled"/>
<spinner label="Numéro :" name="connection_port"/>
- <text name="cache_size_label_l">
- Taille de la mémoire
- </text>
- <text name="text_box5">
- Mo
- </text>
- <text name="Cache location">
- Emplacement du cache :
- </text>
- <button label="Parcourir" label_selected="Parcourir" name="set_cache"/>
- <button label="Réinitialiser" label_selected="Réinitialiser" name="reset_cache"/>
<text name="Web:">
Web :
</text>
<radio_group name="use_external_browser">
- <radio_item label="Utiliser mon navigateur (IE, Firefox, Safari)" name="external" tool_tip="Utiliser le navigateur web système par défaut pour l&apos;aide, les liens etc. Non recommandé en mode plein écran." value="1"/>
+ <radio_item label="Utiliser mon navigateur (IE, Firefox, Safari)" name="external" tool_tip="Utiliser le navigateur web système par défaut pour l&apos;aide, les liens etc. Non recommandé en mode plein écran." value="true"/>
<radio_item label="Utiliser le navigateur intégré" name="internal" tool_tip="Utilisez le navigateur intégré pour obtenir de l&apos;aide, ouvrir des liens, etc. Ce navigateur s&apos;ouvre dans [APP_NAME]." value=""/>
</radio_group>
<check_box initial_value="true" label="Activer les plugins" name="browser_plugins_enabled"/>
<check_box initial_value="true" label="Accepter les cookies" name="cookies_enabled"/>
<check_box initial_value="true" label="Activer Javascript" name="browser_javascript_enabled"/>
<check_box initial_value="false" label="Activer les fenêtres popup de navigateur de médias" name="media_popup_enabled"/>
- <check_box initial_value="false" label="Activer le proxy Web" name="web_proxy_enabled"/>
- <text name="Proxy location">
- Emplacement du proxy :
+ <text name="Software updates:">
+ Mises à jour logicielles :
+ </text>
+ <combo_box name="updater_service_combobox">
+ <combo_box.item label="Installation automatique" name="Install_automatically"/>
+ <combo_box.item label="Téléchargement et installation manuels" name="Install_manual"/>
+ </combo_box>
+ <text name="Proxy Settings:">
+ Paramètres de proxy :
</text>
- <line_editor name="web_proxy_editor" tool_tip="Le nom ou adresse IP du proxy que vous souhaitez utiliser"/>
- <spinner label="Numéro de port :" label_width="95" name="web_proxy_port" width="170"/>
+ <button label="Définir" label_selected="Parcourir" name="set_proxy"/>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml b/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml
index b82d8bcd18..37eb6bbeb0 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml
@@ -1,18 +1,25 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Sons" name="Preference Media panel">
+ <panel.string name="middle_mouse">
+ Bouton central de la souris
+ </panel.string>
<slider label="Volume principal" name="System Volume"/>
- <check_box initial_value="true" label="Couper quand minimisé" name="mute_when_minimized"/>
+ <check_box initial_value="true" name="mute_when_minimized"/>
+ <text name="mute_chb_label">
+ Couper lorsque minimisé
+ </text>
<slider label="Boutons" name="UI Volume"/>
<slider label="Ambiant" name="Wind Volume"/>
<slider label="Effets sonores" name="SFX Volume"/>
<slider label="Flux musical" name="Music Volume"/>
- <check_box label="Activé" name="music_enabled"/>
+ <check_box label="Activé" name="enable_music"/>
<slider label="Média" name="Media Volume"/>
<check_box label="Activé" name="enable_media"/>
<slider label="Chat vocal" name="Voice Volume"/>
<check_box label="Activé" name="enable_voice_check"/>
- <check_box label="Autoriser la lecture automatique du média" name="media_auto_play_btn" tool_tip="Cochez pour autoriser la lecture automatique du média" value="true"/>
- <check_box label="Jouer le média aux autres avatars" name="media_show_on_others_btn" tool_tip="Décochez pour masquer le média aux autres avatars près de vous" value="true"/>
+ <check_box label="Autoriser la lecture automatique du média" name="media_auto_play_btn" tool_tip="Cocher pour autoriser la lecture automatique du média." value="true"/>
+ <check_box label="Lire le média attaché aux autres avatars" name="media_show_on_others_btn" tool_tip="Décocher pour masquer le média attaché aux autres avatars près de vous." value="true"/>
+ <check_box label="Lire les sons des gestes" name="gesture_audio_play_btn" tool_tip="Cocher cette case pour entendre les sons associés aux gestes." value="true"/>
<text name="voice_chat_settings">
Paramètres du chat vocal
</text>
@@ -23,29 +30,11 @@
<radio_item label="Position de la caméra" name="0"/>
<radio_item label="Position de l&apos;avatar" name="1"/>
</radio_group>
+ <check_box label="Faire bouger les lèvres de l&apos;avatar lorsqu&apos;il parle" name="enable_lip_sync"/>
+ <check_box label="Activer/désactiver la fonction Parler quand j&apos;appuie sur :" name="push_to_talk_toggle_check" tool_tip="En mode bascule, appuyez une fois sur la touche de contrôle de la fonction, puis relâchez-la pour activer/désactiver votre micro. Si vous n&apos;êtes pas en mode bascule, le micro ne diffuse votre voix que lorsque vous maintenez la touche de contrôle de la fonction enfoncée."/>
+ <line_editor label="Touche de contrôle de la fonction Appuyer pour parler" name="modifier_combo"/>
+ <button label="Définir la touche" name="set_voice_hotkey_button"/>
+ <button name="set_voice_middlemouse_button" tool_tip="Réinitialiser sur le bouton central de la souris"/>
<button label="Périphériques d&apos;entrée/de sortie" name="device_settings_btn"/>
- <panel label="Paramètres du matériel" name="device_settings_panel">
- <panel.string name="default_text">
- Défaut
- </panel.string>
- <panel.string name="default system device">
- Périphérique système par défaut
- </panel.string>
- <panel.string name="no device">
- Aucun périphérique
- </panel.string>
- <text name="Input">
- Entrée
- </text>
- <text name="My volume label">
- Mon volume :
- </text>
- <slider_bar initial_value="1.0" name="mic_volume_slider" tool_tip="Régler le volume avec le curseur"/>
- <text name="wait_text">
- Veuillez patienter
- </text>
- <text name="Output">
- Sortie
- </text>
- </panel>
+ <panel label="Paramètres du matériel" name="device_settings_panel"/>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/fr/panel_prim_media_controls.xml
index f16fcebd02..ad744b7760 100644
--- a/indra/newview/skins/default/xui/fr/panel_prim_media_controls.xml
+++ b/indra/newview/skins/default/xui/fr/panel_prim_media_controls.xml
@@ -13,10 +13,10 @@
</layout_stack>
<layout_stack name="media_controls">
<layout_panel name="back">
- <button name="back_btn" tool_tip="Naviguer en arrière"/>
+ <button name="back_btn" tool_tip="Précédente"/>
</layout_panel>
<layout_panel name="fwd">
- <button name="fwd_btn" tool_tip="Naviguer vers l&apos;avant"/>
+ <button name="fwd_btn" tool_tip="Suivante"/>
</layout_panel>
<layout_panel name="home">
<button name="home_btn" tool_tip="Page d&apos;accueil"/>
@@ -34,7 +34,7 @@
<button name="play_btn" tool_tip="Lire le média"/>
</layout_panel>
<layout_panel name="pause">
- <button name="pause_btn" tool_tip="Pauser le média"/>
+ <button name="pause_btn" tool_tip="Mettre le média sur pause"/>
</layout_panel>
<layout_panel name="media_address">
<line_editor name="media_address_url" tool_tip="URL du média"/>
@@ -48,7 +48,7 @@
</layout_stack>
</layout_panel>
<layout_panel name="media_play_position">
- <slider_bar initial_value="0.5" name="media_play_slider" tool_tip="Progrès de la lecture du film"/>
+ <slider_bar initial_value="0.5" name="media_play_slider" tool_tip="Progression de la lecture du film"/>
</layout_panel>
<layout_panel name="skip_back">
<button name="skip_back_btn" tool_tip="Reculer"/>
diff --git a/indra/newview/skins/default/xui/fr/panel_profile.xml b/indra/newview/skins/default/xui/fr/panel_profile.xml
deleted file mode 100644
index 4606f5a0c6..0000000000
--- a/indra/newview/skins/default/xui/fr/panel_profile.xml
+++ /dev/null
@@ -1,68 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Profil" name="panel_profile">
- <string name="CaptionTextAcctInfo">
- [ACCTTYPE]
-[PAYMENTINFO] [AGEVERIFICATION]
- </string>
- <string name="payment_update_link_url">
- http://www.secondlife.com/account/billing.php?lang=fr-FR
- </string>
- <string name="partner_edit_link_url">
- http://www.secondlife.com/account/partners.php?lang=fr
- </string>
- <string name="my_account_link_url" value="http://secondlife.com/my/account/index.php?lang=fr-FR"/>
- <string name="no_partner_text" value="Aucun"/>
- <string name="no_group_text" value="Aucun"/>
- <string name="RegisterDateFormat">
- [REG_DATE] ([AGE])
- </string>
- <layout_stack name="layout">
- <layout_panel name="profile_stack">
- <scroll_container name="profile_scroll">
- <panel name="profile_scroll_panel">
- <panel name="second_life_image_panel">
- <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/>
- </panel>
- <panel name="first_life_image_panel">
- <text name="title_rw_descr_text" value="Vie réelle :"/>
- </panel>
- <text name="title_member_text" value="Résident depuis :"/>
- <text name="title_acc_status_text" value="Statut du compte :"/>
- <text_editor name="acc_status_text">
- Résident. Aucune info de paiement enregistrée.
- Linden.
- </text_editor>
- <text name="title_partner_text" value="Partenaire :"/>
- <panel name="partner_data_panel">
- <name_box initial_value="(récupération en cours)" name="partner_text"/>
- </panel>
- <text name="title_groups_text" value="Groupes :"/>
- </panel>
- </scroll_container>
- </layout_panel>
- </layout_stack>
- <layout_stack name="layout_verb_buttons">
- <layout_panel name="profile_buttons_panel">
- <layout_stack name="bottom_bar_ls">
- <layout_panel name="add_friend_btn_lp">
- <button label="Devenir amis" name="add_friend" tool_tip="Proposer à ce résident de devenir votre ami"/>
- </layout_panel>
- <layout_panel name="im_btn_lp">
- <button label="IM" name="im" tool_tip="Ouvrir une session IM"/>
- </layout_panel>
- <layout_panel name="call_btn_lp">
- <button label="Appeler" name="call" tool_tip="Appeler ce résident"/>
- </layout_panel>
- <layout_panel name="chat_btn_lp">
- <button label="Téléporter" name="teleport" tool_tip="Proposer une téléportation"/>
- </layout_panel>
- <layout_panel name="overflow_btn_lp">
- <button label="▼" name="overflow_btn" tool_tip="Payer le résident ou partager l&apos;inventaire avec lui"/>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- <layout_panel name="profile_me_buttons_panel">
- <button label="Modifier le profil" name="edit_profile_btn" tool_tip="Modifier vos informations personnelles"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_profile_view.xml b/indra/newview/skins/default/xui/fr/panel_profile_view.xml
deleted file mode 100644
index 0447618420..0000000000
--- a/indra/newview/skins/default/xui/fr/panel_profile_view.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_target_profile">
- <string name="status_online">
- En ligne
- </string>
- <string name="status_offline">
- Hors ligne
- </string>
- <text name="display_name_label" value="Nom d&apos;affichage :"/>
- <text name="solo_username_label" value="Nom d&apos;utilisateur :"/>
- <text name="status" value="En ligne"/>
- <text name="user_name_small" value="Jack oh look at me this is a super duper long name"/>
- <text name="user_name" value="Jack Linden"/>
- <button name="copy_to_clipboard" tool_tip="Copier dans le presse-papiers"/>
- <text name="user_label" value="Nom d&apos;utilisateur :"/>
- <text name="user_slid" value="jack.linden"/>
- <tab_container name="tabs">
- <panel label="PROFIL" name="panel_profile"/>
- <panel label="FAVORIS" name="panel_picks"/>
- <panel label="NOTES/PERSO" name="panel_notes"/>
- </tab_container>
-</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_region_debug.xml b/indra/newview/skins/default/xui/fr/panel_region_debug.xml
index cb4a74e142..733c3f9a22 100644
--- a/indra/newview/skins/default/xui/fr/panel_region_debug.xml
+++ b/indra/newview/skins/default/xui/fr/panel_region_debug.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Débugger" name="Debug">
+<panel label="Débogage" name="Debug">
<text name="region_text_lbl">
Région :
</text>
diff --git a/indra/newview/skins/default/xui/fr/panel_region_environment.xml b/indra/newview/skins/default/xui/fr/panel_region_environment.xml
new file mode 100644
index 0000000000..d18503db86
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_region_environment.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Environnement" name="panel_env_info">
+ <text name="water_settings_title">
+ Sélectionnez les réglages d&apos;eau et de ciel/cycle du jour que vous souhaitez afficher pour tous les résidents visitant votre région. En savoir plus
+ </text>
+ <radio_group name="region_settings_radio_group">
+ <radio_item label="Utiliser les réglages par défaut de Second Life" name="use_sl_default_settings"/>
+ <radio_item label="Utiliser les réglages suivants" name="use_my_settings"/>
+ </radio_group>
+ <panel name="user_environment_settings">
+ <text name="water_settings_title">
+ Réglage de l&apos;eau
+ </text>
+ <combo_box name="water_settings_preset_combo">
+ <combo_box.item label="-Effectuer une sélection-" name="item0"/>
+ </combo_box>
+ <text name="sky_dayc_settings_title">
+ Ciel / Cycle du jour
+ </text>
+ <radio_group name="sky_dayc_settings_radio_group">
+ <radio_item label="Ciel fixe" name="my_sky_settings"/>
+ <radio_item label="Cycle du jour" name="my_dayc_settings"/>
+ </radio_group>
+ <combo_box name="sky_settings_preset_combo">
+ <combo_box.item label="-Effectuer une sélection-" name="item0"/>
+ </combo_box>
+ <combo_box name="dayc_settings_preset_combo">
+ <combo_box.item label="-Effectuer une sélection-" name="item0"/>
+ </combo_box>
+ </panel>
+ <button label="Appliquer" name="apply_btn"/>
+ <button label="Annuler" name="cancel_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_region_estate.xml b/indra/newview/skins/default/xui/fr/panel_region_estate.xml
index fb650ff646..9d97d1bf29 100644
--- a/indra/newview/skins/default/xui/fr/panel_region_estate.xml
+++ b/indra/newview/skins/default/xui/fr/panel_region_estate.xml
@@ -18,10 +18,10 @@ domaine.
(inconnu)
</text>
<text name="Only Allow">
- Limiter l&apos;accès aux comptes vérifiés par :
+ Conditions d&apos;accès des résidents :
</text>
- <check_box label="Infos de paiement enregistrées" name="limit_payment" tool_tip="Bannir les résidents non identifiés"/>
- <check_box label="Vérification de l&apos;âge" name="limit_age_verified" tool_tip="Bannir les résidents qui n&apos;ont pas vérifié leur âge. Consultez la page [SUPPORT_SITE] pour plus d&apos;informations."/>
+ <check_box label="Informations de paiement enregistrées" name="limit_payment" tool_tip="Pour pouvoir accéder à ce domaine, les résidents doivent avoir enregistré des informations de paiement. Consultez le [SUPPORT_SITE] pour plus d&apos;informations."/>
+ <check_box label="Âge vérifié" name="limit_age_verified" tool_tip="Pour que les résidents puissent accéder à ce domaine, leur âge doit avoir fait l&apos;objet d&apos;une vérification. Consultez le [SUPPORT_SITE] pour plus d&apos;informations."/>
<check_box label="Autoriser les chats vocaux" name="voice_chat_check"/>
<button label="?" name="voice_chat_help"/>
<text name="abuse_email_text">
diff --git a/indra/newview/skins/default/xui/fr/panel_region_general.xml b/indra/newview/skins/default/xui/fr/panel_region_general.xml
index ada4583648..b5795bebe2 100644
--- a/indra/newview/skins/default/xui/fr/panel_region_general.xml
+++ b/indra/newview/skins/default/xui/fr/panel_region_general.xml
@@ -25,6 +25,7 @@
<check_box label="Autoriser la revente" name="allow_land_resell_check"/>
<check_box label="Autoriser la fusion/division" name="allow_parcel_changes_check"/>
<check_box label="Ne pas afficher dans la recherche" name="block_parcel_search_check" tool_tip="Afficher cette région et ses parcelles dans les résultats de recherche"/>
+ <check_box label="Autoriser les objets de maillage" name="mesh_rez_enabled_check" tool_tip="Laisser les gens rezzer des objets de maillage dans cette région."/>
<spinner label="Nombre maximum d&apos;avatars" label_width="160" name="agent_limit_spin" width="240"/>
<spinner label="Bonus objet" label_width="160" name="object_bonus_spin" width="240"/>
<text label="Maturité" name="access_text">
diff --git a/indra/newview/skins/default/xui/fr/panel_region_terrain.xml b/indra/newview/skins/default/xui/fr/panel_region_terrain.xml
index 4d7652eb6f..d7e321d06d 100644
--- a/indra/newview/skins/default/xui/fr/panel_region_terrain.xml
+++ b/indra/newview/skins/default/xui/fr/panel_region_terrain.xml
@@ -7,21 +7,56 @@
(inconnue)
</text>
<spinner label="Niveau de l&apos;eau" name="water_height_spin"/>
- <button label="?" name="water_height_help"/>
- <spinner label="Limite d&apos;élévation du &#10;terrain" name="terrain_raise_spin"/>
- <button label="?" name="terrain_raise_help"/>
- <spinner label="Limite d&apos;abaissement &#10;du terrain" name="terrain_lower_spin" bottom_delta="-34"/>
- <button label="?" name="terrain_lower_help"/>
- <check_box label="Utiliser le soleil du domaine" name="use_estate_sun_check"/>
- <button label="?" name="use_estate_sun_help"/>
- <check_box label="Soleil fixe" name="fixed_sun_check"/>
- <button label="?" name="fixed_sun_help"/>
- <slider label="Phase" name="sun_hour_slider"/>
- <button label="Appliquer" name="apply_btn"/>
+ <spinner label="Limite d&apos;élévation du
+terrain" name="terrain_raise_spin"/>
+ <spinner bottom_delta="-34" label="Limite d&apos;abaissement
+du terrain" name="terrain_lower_spin"/>
+ <text name="detail_texture_text">
+ Textures du terrain (fichiers .tga 512 x 512, 24 bit requis)
+ </text>
+ <text name="height_text_lbl">
+ 1 (Bas)
+ </text>
+ <text name="height_text_lbl2">
+ 2
+ </text>
+ <text name="height_text_lbl3">
+ 3
+ </text>
+ <text name="height_text_lbl4">
+ 4 (Haut)
+ </text>
+ <text name="height_text_lbl5">
+ Limites d&apos;élévation de texture
+ </text>
+ <text name="height_text_lbl10">
+ Ces valeurs représentent les limites de mélange pour les textures ci-dessus.
+ </text>
+ <text name="height_text_lbl11">
+ En mètres, la valeur BAS correspond à la hauteur MAXIMUM de la texture n°1 et la valeur HAUT à la hauteur MINIMUM de la texture n°4.
+ </text>
+ <text name="height_text_lbl6">
+ Nord-ouest
+ </text>
+ <text name="height_text_lbl7">
+ Nord-est
+ </text>
+ <spinner label="Bas" name="height_start_spin_1"/>
+ <spinner label="Bas" name="height_start_spin_3"/>
+ <spinner label="Haut" name="height_range_spin_1"/>
+ <spinner label="Haut" name="height_range_spin_3"/>
+ <text name="height_text_lbl8">
+ Sud-ouest
+ </text>
+ <text name="height_text_lbl9">
+ Sud-est
+ </text>
+ <spinner label="Bas" name="height_start_spin_0"/>
+ <spinner label="Bas" name="height_start_spin_2"/>
+ <spinner label="Haut" name="height_range_spin_0"/>
+ <spinner label="Haut" name="height_range_spin_2"/>
<button label="Télécharger le terrain au format RAW..." name="download_raw_btn" tool_tip="Réservé aux propriétaires de domaine, pas aux gérants" width="230"/>
- <button label="?" name="download_raw_help" left="246" />
<button label="Charger le terrain au format RAW..." name="upload_raw_btn" tool_tip="Réservé aux propriétaires de domaine, pas aux gérants" width="230"/>
- <button label="?" name="upload_raw_help" left="246" />
<button label="Figer le terrain" name="bake_terrain_btn" tool_tip="Définir le terrain actuel comme point central pour les limites d&apos;élévation/abaissement"/>
- <button label="?" name="bake_terrain_help"/>
+ <button label="Appliquer" name="apply_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_script_ed.xml b/indra/newview/skins/default/xui/fr/panel_script_ed.xml
index 3b3b676aa1..29fbe3c7e7 100644
--- a/indra/newview/skins/default/xui/fr/panel_script_ed.xml
+++ b/indra/newview/skins/default/xui/fr/panel_script_ed.xml
@@ -15,15 +15,15 @@
<panel.string name="Title">
Script : [NAME]
</panel.string>
- <text_editor name="Script Editor">
- Chargement...
- </text_editor>
- <button label="Enregistrer" label_selected="Enregistrer" name="Save_btn"/>
- <combo_box label="Insérer..." name="Insert..."/>
+ <panel.string name="external_editor_not_set">
+ Sélectionnez un éditeur en définissant la variable d&apos;environnement LL_SCRIPT_EDITOR ou le paramètre ExternalEditor.
+ </panel.string>
<menu_bar name="script_menu">
<menu label="Fichier" name="File">
<menu_item_call label="Enregistrer" name="Save"/>
<menu_item_call label="Annuler tous les changements" name="Revert All Changes"/>
+ <menu_item_call label="Charger depuis un fichier..." name="LoadFromFile"/>
+ <menu_item_call label="Enregistrer sous..." name="SaveToFile"/>
</menu>
<menu label="Modifier" name="Edit">
<menu_item_call label="Annuler" name="Undo"/>
@@ -40,4 +40,10 @@
<menu_item_call label="Aide par mots-clés..." name="Keyword Help..."/>
</menu>
</menu_bar>
+ <text_editor name="Script Editor">
+ Chargement...
+ </text_editor>
+ <combo_box label="Insérer..." name="Insert..."/>
+ <button label="Enregistrer" label_selected="Enregistrer" name="Save_btn"/>
+ <button label="Modifier..." name="Edit_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_scrolling_param_base.xml b/indra/newview/skins/default/xui/fr/panel_scrolling_param_base.xml
new file mode 100644
index 0000000000..fa659040ea
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_scrolling_param_base.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="LLScrollingPanelParamBase">
+ <slider label="[DESC]" name="param slider"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/fr/panel_snapshot_inventory.xml
new file mode 100644
index 0000000000..4454d2475e
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_snapshot_inventory.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_inventory">
+ <text name="title">
+ Enregistrer dans mon inventaire
+ </text>
+ <text name="hint_lbl">
+ L&apos;enregistrement d&apos;une image dans votre inventaire coûte [UPLOAD_COST] L$. Pour enregistrer votre image sous forme de texture, sélectionnez l&apos;un des formats carrés.
+ </text>
+ <combo_box label="Résolution" name="texture_size_combo">
+ <combo_box.item label="Fenêtre actuelle" name="CurrentWindow"/>
+ <combo_box.item label="Petite (128 x 128)" name="Small(128x128)"/>
+ <combo_box.item label="Moyenne (256 x 256)" name="Medium(256x256)"/>
+ <combo_box.item label="Grande (512 x 512)" name="Large(512x512)"/>
+ <combo_box.item label="Personnalisée" name="Custom"/>
+ </combo_box>
+ <spinner label="Largeur" name="inventory_snapshot_width"/>
+ <spinner label="Hauteur" name="inventory_snapshot_height"/>
+ <check_box label="Conserver les proportions" name="inventory_keep_aspect_check"/>
+ <button label="Annuler" name="cancel_btn"/>
+ <button label="Enregistrer" name="save_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_snapshot_local.xml b/indra/newview/skins/default/xui/fr/panel_snapshot_local.xml
new file mode 100644
index 0000000000..41264521fd
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_snapshot_local.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_local">
+ <text name="title">
+ Enregistrer sur mon ordinateur
+ </text>
+ <combo_box label="Résolution" name="local_size_combo">
+ <combo_box.item label="Fenêtre actuelle" name="CurrentWindow"/>
+ <combo_box.item label="320 x 240" name="320x240"/>
+ <combo_box.item label="640 x 480" name="640x480"/>
+ <combo_box.item label="800 x 600" name="800x600"/>
+ <combo_box.item label="1 024 x 768" name="1024x768"/>
+ <combo_box.item label="1 280 x 1 024" name="1280x1024"/>
+ <combo_box.item label="1 600 x 1 200" name="1600x1200"/>
+ <combo_box.item label="Personnalisée" name="Custom"/>
+ </combo_box>
+ <layout_stack name="local_image_params_ls">
+ <layout_panel name="local_image_size_lp">
+ <spinner label="Largeur" name="local_snapshot_width"/>
+ <spinner label="Hauteur" name="local_snapshot_height"/>
+ <check_box label="Conserver les proportions" name="local_keep_aspect_check"/>
+ </layout_panel>
+ <layout_panel name="local_image_format_quality_lp">
+ <combo_box label="Format" name="local_format_combo">
+ <combo_box.item label="PNG (sans perte)" name="PNG"/>
+ <combo_box.item label="JPEG" name="JPEG"/>
+ <combo_box.item label="BMP (sans perte)" name="BMP"/>
+ </combo_box>
+ <slider label="Qualité de l&apos;image" name="image_quality_slider"/>
+ <text name="image_quality_level">
+ ([QLVL])
+ </text>
+ </layout_panel>
+ </layout_stack>
+ <button label="Annuler" name="cancel_btn"/>
+ <flyout_button label="Enregistrer" name="save_btn" tool_tip="Enregistrer l&apos;image dans un fichier.">
+ <flyout_button.item label="Enregistrer" name="save_item"/>
+ <flyout_button.item label="Enregistrer sous..." name="saveas_item"/>
+ </flyout_button>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_snapshot_options.xml b/indra/newview/skins/default/xui/fr/panel_snapshot_options.xml
new file mode 100644
index 0000000000..db3fcbeac9
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_snapshot_options.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_options">
+ <button label="Publier sur le flux de mon profil" name="save_to_profile_btn"/>
+ <button label="Envoyer par e-mail" name="save_to_email_btn"/>
+ <button label="Enregistrer dans mon inventaire ([AMOUNT] L$)" name="save_to_inventory_btn"/>
+ <button label="Enregistrer sur mon ordinateur" name="save_to_computer_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_snapshot_postcard.xml b/indra/newview/skins/default/xui/fr/panel_snapshot_postcard.xml
new file mode 100644
index 0000000000..bb23b52850
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_snapshot_postcard.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_postcard">
+ <string name="default_subject">
+ Carte postale de [SECOND_LIFE].
+ </string>
+ <string name="default_message">
+ Ouvrez-moi !
+ </string>
+ <string name="upload_message">
+ Envoi en cours...
+ </string>
+ <text name="title">
+ Envoyer par e-mail
+ </text>
+ <button label="Message" name="message_btn"/>
+ <button label="Paramètres" name="settings_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_snapshot_profile.xml b/indra/newview/skins/default/xui/fr/panel_snapshot_profile.xml
new file mode 100644
index 0000000000..427ffe2113
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_snapshot_profile.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_profile">
+ <text name="title">
+ Publier sur le flux de mon profil
+ </text>
+ <combo_box label="Résolution" name="profile_size_combo">
+ <combo_box.item label="Fenêtre actuelle" name="CurrentWindow"/>
+ <combo_box.item label="640 x 480" name="640x480"/>
+ <combo_box.item label="800 x 600" name="800x600"/>
+ <combo_box.item label="1 024 x 768" name="1024x768"/>
+ <combo_box.item label="Personnalisée" name="Custom"/>
+ </combo_box>
+ <layout_stack name="profile_image_params_ls">
+ <layout_panel name="profile_image_size_lp">
+ <spinner label="Largeur" name="profile_snapshot_width"/>
+ <spinner label="Hauteur" name="profile_snapshot_height"/>
+ <check_box label="Conserver les proportions" name="profile_keep_aspect_check"/>
+ </layout_panel>
+ <layout_panel name="profile_image_metadata_lp">
+ <text name="caption_label">
+ Légende :
+ </text>
+ <check_box initial_value="true" label="Inclure l&apos;endroit" name="add_location_cb"/>
+ </layout_panel>
+ </layout_stack>
+ <button label="Annuler" name="cancel_btn"/>
+ <button label="Publier" name="post_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_sound_devices.xml b/indra/newview/skins/default/xui/fr/panel_sound_devices.xml
new file mode 100644
index 0000000000..460b269f7c
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_sound_devices.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<panel label="Paramètres du périphérique" name="device_settings_panel">
+ <panel.string name="default_text">
+ Valeur par défaut
+ </panel.string>
+ <string name="name_no_device">
+ Aucun périphérique
+ </string>
+ <string name="name_default_system_device">
+ Périphérique système par défaut
+ </string>
+ <text name="Input">
+ Entrée
+ </text>
+ <text name="Output">
+ Sortie
+ </text>
+ <text name="My volume label">
+ Mon volume :
+ </text>
+ <slider_bar initial_value="1.0" name="mic_volume_slider" tool_tip="Régler le volume avec le curseur."/>
+ <text name="wait_text">
+ Veuillez patienter
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_status_bar.xml b/indra/newview/skins/default/xui/fr/panel_status_bar.xml
index 85429a18c7..ba36a7d299 100644
--- a/indra/newview/skins/default/xui/fr/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/fr/panel_status_bar.xml
@@ -1,11 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="status">
- <panel.string name="StatBarDaysOfWeek">
- Sunday:Monday:Tuesday:Wednesday:Thursday:Friday:Saturday
- </panel.string>
- <panel.string name="StatBarMonthsOfYear">
- January:February:March:April:May:June:July:August:September:October:November:December
- </panel.string>
<panel.string name="packet_loss_tooltip">
Perte de paquets
</panel.string>
@@ -21,13 +15,14 @@
<panel.string name="buycurrencylabel">
[AMT] L$
</panel.string>
- <panel name="balance_bg">
- <text name="balance" tool_tip="Mon solde" value="20 L$"/>
- <button label="ACHETER L$" name="buyL" tool_tip="Cliquer pour acheter plus de L$"/>
+ <panel left="-405" name="balance_bg" width="195">
+ <text name="balance" tool_tip="Cliquer sur ce bouton pour actualiser votre solde en L$." value="20 L$"/>
+ <button label="Acheter L$" name="buyL" tool_tip="Cliquer pour acheter plus de L$."/>
+ <button label="Achats" name="goShop" tool_tip="Ouvrir la Place du marché Second Life." width="75"/>
</panel>
<text name="TimeText" tool_tip="Heure actuelle (Pacifique)">
00h00 PST
</text>
- <button name="media_toggle_btn" tool_tip="Arrêter tous les médias (musique, vidéo, pages web)"/>
- <button name="volume_btn" tool_tip="Contrôle du volume global"/>
+ <button name="media_toggle_btn" tool_tip="Arrêter tous les médias (musique, vidéo, pages web)."/>
+ <button name="volume_btn" tool_tip="Régler le volume global."/>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_teleport_history.xml b/indra/newview/skins/default/xui/fr/panel_teleport_history.xml
index 1586c201da..cf1266a460 100644
--- a/indra/newview/skins/default/xui/fr/panel_teleport_history.xml
+++ b/indra/newview/skins/default/xui/fr/panel_teleport_history.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="Teleport History">
<accordion name="history_accordion">
- <no_matched_tabs_text name="no_matched_teleports_msg" value="Vous n&apos;avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/places/Rechercher [SEARCH_TERM]]."/>
+ <no_matched_tabs_text name="no_matched_teleports_msg" value="Vous n&apos;avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/places/[SEARCH_TERM] Rechercher]."/>
<no_visible_tabs_text name="no_teleports_msg" value="L&apos;historique des téléportations est vide. Essayez [secondlife:///app/search/places/ Rechercher]."/>
<accordion_tab name="today" title="Aujourd&apos;hui"/>
<accordion_tab name="yesterday" title="Hier"/>
diff --git a/indra/newview/skins/default/xui/fr/sidepanel_inventory.xml b/indra/newview/skins/default/xui/fr/sidepanel_inventory.xml
index 3c4d2626c1..1b9c832679 100644
--- a/indra/newview/skins/default/xui/fr/sidepanel_inventory.xml
+++ b/indra/newview/skins/default/xui/fr/sidepanel_inventory.xml
@@ -1,6 +1,27 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Choses" name="objects panel">
<panel label="" name="sidepanel__inventory_panel">
+ <layout_stack name="inventory_layout_stack">
+ <layout_panel name="inbox_layout_panel">
+ <panel label="" name="marketplace_inbox">
+ <string name="InboxLabelWithArg">
+ Articles reçus ([NUM])
+ </string>
+ <string name="InboxLabelNoArg">
+ Articles reçus
+ </string>
+ <button label="Articles reçus" name="inbox_btn"/>
+ <text name="inbox_fresh_new_count">
+ [NUM] nouv.
+ </text>
+ <panel name="inbox_inventory_placeholder_panel" tool_tip="Glisser-déposer des articles dans votre inventaire pour les utiliser.">
+ <text name="inbox_inventory_placeholder">
+ Ici seront livrés les achats effectués sur la Place du marché.
+ </text>
+ </panel>
+ </panel>
+ </layout_panel>
+ </layout_stack>
<panel name="button_panel">
<layout_stack name="button_panel_ls">
<layout_panel name="info_btn_lp">
diff --git a/indra/newview/skins/default/xui/fr/sidepanel_task_info.xml b/indra/newview/skins/default/xui/fr/sidepanel_task_info.xml
index c8e76118a1..bd8a39fe16 100644
--- a/indra/newview/skins/default/xui/fr/sidepanel_task_info.xml
+++ b/indra/newview/skins/default/xui/fr/sidepanel_task_info.xml
@@ -48,15 +48,9 @@
<text name="CreatorNameLabel">
Créateur :
</text>
- <text name="Creator Name">
- Erica Linden
- </text>
<text name="Owner:">
Propriétaire :
</text>
- <text name="Owner Name">
- Erica Linden
- </text>
<text name="Group_label">
Groupe :
</text>
diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml
index 8b958119eb..3eebed450f 100644
--- a/indra/newview/skins/default/xui/fr/strings.xml
+++ b/indra/newview/skins/default/xui/fr/strings.xml
@@ -34,6 +34,9 @@
<string name="StartupInitializingVFS">
Initialisation VFS...
</string>
+ <string name="StartupRequireDriverUpdate">
+ Échec d&apos;initialisation des graphiques. Veuillez mettre votre pilote graphique à jour.
+ </string>
<string name="ProgressRestoring">
Restauration...
</string>
@@ -91,6 +94,12 @@
<string name="LoginQuicktimeOK">
Initialisation de Quicktime réussie.
</string>
+ <string name="LoginRequestSeedCapGrant">
+ Capacités de la région demandées...
+ </string>
+ <string name="LoginRetrySeedCapGrant">
+ Capacités de la région demandées... Tentative n° [NUMBER].
+ </string>
<string name="LoginWaitingForRegionHandshake">
Liaison avec la région en cours de création...
</string>
@@ -130,6 +139,139 @@
<string name="create_account_url">
http://join.secondlife.com/index.php?lang=fr-FR
</string>
+ <string name="LoginFailedViewerNotPermitted">
+ Le client que vous utilisez ne permet plus d&apos;accéder à Second Life. Téléchargez un nouveau client à la page suivante :
+http://secondlife.com/download
+
+Pour plus d&apos;informations, consultez la page FAQ ci-dessous :
+http://secondlife.com/viewer-access-faq
+ </string>
+ <string name="LoginIntermediateOptionalUpdateAvailable">
+ Mise à jour facultative du client disponible : [VERSION]
+ </string>
+ <string name="LoginFailedRequiredUpdate">
+ Mise à jour du client requise : [VERSION]
+ </string>
+ <string name="LoginFailedAlreadyLoggedIn">
+ L&apos;agent est déjà connecté.
+ </string>
+ <string name="LoginFailedAuthenticationFailed">
+ Désolé ! La connexion a échoué.
+Veuillez vérifier que les éléments ci-dessous ont été correctement saisis :
+ * Nom d&apos;utilisateur (par exemple, bobsmith12 ou steller.sunshine)
+ * Mot de passe
+Assurez-vous également que la touche Verr. maj n&apos;est pas activée.
+ </string>
+ <string name="LoginFailedPasswordChanged">
+ Votre mot de passe a été modifié pour des raisons de sécurité.
+Veuillez accéder à votre compte à la page http://secondlife.com/password
+et répondre à la question de sécurité afin de réinitialiser votre mot de passe.
+Nous vous prions de nous excuser pour la gêne occasionnée.
+ </string>
+ <string name="LoginFailedPasswordReset">
+ Vous allez devoir réinitialiser votre mot de passe suite à quelques changements effectués sur notre système.
+Pour cela, accédez à votre compte à la page http://secondlife.com/password
+et répondez à la question de sécurité. Votre mot de passe sera réinitialisé.
+Nous vous prions de nous excuser pour la gêne occasionnée.
+ </string>
+ <string name="LoginFailedEmployeesOnly">
+ Second Life est temporairement fermé pour des raisons de maintenance.
+Seuls les employés peuvent actuellement y accéder.
+Consultez la page www.secondlife.com/status pour plus d&apos;informations.
+ </string>
+ <string name="LoginFailedPremiumOnly">
+ Les connexions à Second Life sont temporairement limitées afin de s&apos;assurer que l&apos;expérience des utilisateurs présents dans le monde virtuel soit optimale.
+
+Les personnes disposant de comptes gratuits ne pourront pas accéder à Second Life pendant ce temps afin de permettre à celles qui ont payé pour pouvoir utiliser Second Life de le faire.
+ </string>
+ <string name="LoginFailedComputerProhibited">
+ Impossible d&apos;accéder à Second Life depuis cet ordinateur.
+Si vous pensez qu&apos;il s&apos;agit d&apos;une erreur, contactez
+l&apos;Assistance à l&apos;adresse suivante : support@secondlife.com.
+ </string>
+ <string name="LoginFailedAcountSuspended">
+ Votre compte est inaccessible jusqu&apos;à
+[TIME], heure du Pacifique.
+ </string>
+ <string name="LoginFailedAccountDisabled">
+ Nous n&apos;avons pas réussi à traiter votre demande.
+Pour obtenir de l&apos;aide, veuillez contacter l&apos;Assistance Second Life à la page suivante : http://secondlife.com/support.
+Si vous ne parvenez pas à changer de mot de passe, veuillez appeler le (866) 476-9763.
+ </string>
+ <string name="LoginFailedTransformError">
+ Incohérence des données lors de la connexion.
+Veuillez contacter support@secondlife.com.
+ </string>
+ <string name="LoginFailedAccountMaintenance">
+ Des opérations de maintenance mineures sont actuellement effectuées sur votre compte.
+Votre compte est inaccessible jusqu&apos;à
+[TIME], heure du Pacifique.
+Si vous pensez qu&apos;il s&apos;agit d&apos;une erreur, contactez l&apos;Assistance à l&apos;adresse suivante : support@secondlife.com
+ </string>
+ <string name="LoginFailedPendingLogoutFault">
+ Le simulateur a renvoyé une erreur en réponse à la demande de déconnexion.
+ </string>
+ <string name="LoginFailedPendingLogout">
+ Le système est en train de vous déconnecter.
+Votre compte sera indisponible jusqu&apos;à
+[TIME], heure du Pacifique.
+ </string>
+ <string name="LoginFailedUnableToCreateSession">
+ Impossible de créer de session valide.
+ </string>
+ <string name="LoginFailedUnableToConnectToSimulator">
+ Impossible de se connecter à un simulateur.
+ </string>
+ <string name="LoginFailedRestrictedHours">
+ Votre compte permet uniquement d&apos;accéder à Second Life
+entre [START] et [END], heure du Pacifique.
+Veuillez réessayer au cours de la période indiquée.
+Si vous pensez qu&apos;il s&apos;agit d&apos;une erreur, contactez l&apos;Assistance à l&apos;adresse suivante : support@secondlife.com
+ </string>
+ <string name="LoginFailedIncorrectParameters">
+ Paramètres incorrects.
+Si vous pensez qu&apos;il s&apos;agit d&apos;une erreur, contactez l&apos;Assistance à l&apos;adresse suivante : support@secondlife.com
+ </string>
+ <string name="LoginFailedFirstNameNotAlphanumeric">
+ Le paramètre Prénom doit être alphanumérique.
+Si vous pensez qu&apos;il s&apos;agit d&apos;une erreur, contactez l&apos;Assistance à l&apos;adresse suivante : support@secondlife.com
+ </string>
+ <string name="LoginFailedLastNameNotAlphanumeric">
+ Le paramètre Nom doit être alphanumérique.
+Si vous pensez qu&apos;il s&apos;agit d&apos;une erreur, contactez l&apos;Assistance à l&apos;adresse suivante : support@secondlife.com
+ </string>
+ <string name="LogoutFailedRegionGoingOffline">
+ La région est en train d&apos;être mise hors ligne.
+Veuillez réessayer de vous connecter dans une minute.
+ </string>
+ <string name="LogoutFailedAgentNotInRegion">
+ Agent absent de la région.
+Veuillez réessayer de vous connecter dans une minute.
+ </string>
+ <string name="LogoutFailedPendingLogin">
+ Une autre session était en cours d&apos;ouverture au sein de la région.
+Veuillez réessayer de vous connecter dans une minute.
+ </string>
+ <string name="LogoutFailedLoggingOut">
+ La session précédente était en cours de fermeture au sein de la région.
+Veuillez réessayer de vous connecter dans une minute.
+ </string>
+ <string name="LogoutFailedStillLoggingOut">
+ Fermeture de la session précédente toujours en cours pour la région.
+Veuillez réessayer de vous connecter dans une minute.
+ </string>
+ <string name="LogoutSucceeded">
+ Dernière session fermée au sein de la région.
+Veuillez réessayer de vous connecter dans une minute.
+ </string>
+ <string name="LogoutFailedLogoutBegun">
+ Processus de déconnexion commencé pour la région.
+Veuillez réessayer de vous connecter dans une minute.
+ </string>
+ <string name="LoginFailedLoggingOutSession">
+ Le système a commencé à fermer votre dernière session.
+Veuillez réessayer de vous connecter dans une minute.
+ </string>
<string name="AgentLostConnection">
Il y a peut-être des problèmes techniques dans cette région. Veuillez vérifier votre connexion Internet.
</string>
@@ -197,6 +339,36 @@
Impossible de faire glisser plus d&apos;un objet ici
</string>
<string name="TooltipPrice" value="[AMOUNT] L$ :"/>
+ <string name="TooltipOutboxDragToWorld">
+ Impossible de rezzer des articles dans la boîte d&apos;envoi vendeur
+ </string>
+ <string name="TooltipOutboxNoTransfer">
+ Impossible de vendre ou de transférer un ou plusieurs de ces objets.
+ </string>
+ <string name="TooltipOutboxNotInInventory">
+ La boîte d&apos;envoi vendeur n&apos;accepte que les articles directement issus de votre inventaire.
+ </string>
+ <string name="TooltipOutboxWorn">
+ Impossible de placer des articles que vous portez dans votre boîte d&apos;envoi vendeur
+ </string>
+ <string name="TooltipOutboxCallingCard">
+ Impossible de placer des cartes de visite dans votre boîte d&apos;envoi vendeur
+ </string>
+ <string name="TooltipOutboxFolderLevels">
+ Il existe plus de 3 niveaux de dossiers imbriqués.
+ </string>
+ <string name="TooltipOutboxTooManyFolders">
+ Le dossier de niveau supérieur contient plus de 20 sous-dossiers.
+ </string>
+ <string name="TooltipOutboxTooManyObjects">
+ Le dossier de niveau supérieur contient plus de 200 articles.
+ </string>
+ <string name="TooltipDragOntoOwnChild">
+ Impossible de déplacer un dossier vers son enfant
+ </string>
+ <string name="TooltipDragOntoSelf">
+ Impossible de déplacer un dossier vers lui-même
+ </string>
<string name="TooltipHttpUrl">
Cliquez pour afficher cette page web
</string>
@@ -441,6 +613,9 @@
<string name="symbolic folder link">
lien du dossier
</string>
+ <string name="mesh">
+ maillage
+ </string>
<string name="AvatarEditingAppearance">
(Apparence en cours de modification)
</string>
@@ -660,6 +835,9 @@
<string name="anim_yes_head">
Oui
</string>
+ <string name="multiple_textures">
+ Multiples
+ </string>
<string name="texture_loading">
Chargement...
</string>
@@ -819,6 +997,9 @@
<string name="choose_the_directory">
Choisir le répertoire
</string>
+ <string name="script_files">
+ Scripts
+ </string>
<string name="AvatarSetNotAway">
Présent
</string>
@@ -876,6 +1057,9 @@
<string name="tattoo">
Tatouage
</string>
+ <string name="physics">
+ Propriétés physiques
+ </string>
<string name="invalid">
non valide
</string>
@@ -915,6 +1099,9 @@
<string name="tattoo_not_worn">
Tatouage non porté
</string>
+ <string name="physics_not_worn">
+ Propriétés physiques non portées
+ </string>
<string name="invalid_not_worn">
non valide
</string>
@@ -963,6 +1150,9 @@
<string name="create_new_tattoo">
Créer un nouveau tatouage
</string>
+ <string name="create_new_physics">
+ Créer de nouvelles propriétés physiques
+ </string>
<string name="create_new_invalid">
non valide
</string>
@@ -1036,10 +1226,10 @@
Appuyez sur ESC pour quitter la vue subjective
</string>
<string name="InventoryNoMatchingItems">
- Vous n&apos;avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/all/ Rechercher [SEARCH_TERM]].
+ Vous n&apos;avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/all/[SEARCH_TERM] Rechercher].
</string>
<string name="PlacesNoMatchingItems">
- Vous n&apos;avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/places/ Rechercher [SEARCH_TERM]].
+ Vous n&apos;avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/places/[SEARCH_TERM] Rechercher].
</string>
<string name="FavoritesNoMatchingItems">
Faites glisser un repère ici pour l&apos;ajouter à vos Favoris.
@@ -1047,6 +1237,65 @@
<string name="InventoryNoTexture">
Vous n&apos;avez pas de copie de cette texture dans votre inventaire
</string>
+ <string name="InventoryInboxNoItems">
+ Les achats que vous avez effectués sur la Place du marché s&apos;affichent ici. Vous pouvez alors les faire glisser vers votre inventaire afin de les utiliser.
+ </string>
+ <string name="MarketplaceURL">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/
+ </string>
+ <string name="MarketplaceURL_CreateStore">
+ http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.4
+ </string>
+ <string name="MarketplaceURL_Dashboard">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard
+ </string>
+ <string name="MarketplaceURL_Imports">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports
+ </string>
+ <string name="MarketplaceURL_LearnMore">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more
+ </string>
+ <string name="InventoryOutboxNotMerchantTitle">
+ Tout le monde peut vendre des articles sur la Place du marché.
+ </string>
+ <string name="InventoryOutboxNotMerchantTooltip"/>
+ <string name="InventoryOutboxNotMerchant">
+ Pour devenir vendeur, vous devez [[MARKETPLACE_CREATE_STORE_URL] créer une boutique sur la Place du marché].
+ </string>
+ <string name="InventoryOutboxNoItemsTitle">
+ Votre boîte d&apos;envoi est vide.
+ </string>
+ <string name="InventoryOutboxNoItemsTooltip"/>
+ <string name="InventoryOutboxNoItems">
+ Pour mettre des dossiers en vente sur la [[MARKETPLACE_DASHBOARD_URL] Place du marché], faites-les glisser vers cette zone et cliquez sur &quot;Envoyer vers la Place du marché&quot;.
+ </string>
+ <string name="Marketplace Error None">
+ Aucune erreur
+ </string>
+ <string name="Marketplace Error Not Merchant">
+ Erreur : avant d&apos;envoyer des articles vers la Place du marché, vous devez vous configurer comme vendeur (gratuit).
+ </string>
+ <string name="Marketplace Error Empty Folder">
+ Erreur : ce dossier est vide.
+ </string>
+ <string name="Marketplace Error Unassociated Products">
+ Erreur : le chargement de cet article a échoué en raison d&apos;un nombre trop important d&apos;articles non associés à des produits au niveau de votre compte de vendeur. Pour résoudre ce problème, connectez-vous au site Web de la Place du marché et réduisez le nombre d&apos;articles non associés.
+ </string>
+ <string name="Marketplace Error Object Limit">
+ Erreur : cet article contient trop d&apos;objets. Pour résoudre le problème, regroupez des objets dans des paquets afin de réduire le nombre total à moins de 200.
+ </string>
+ <string name="Marketplace Error Folder Depth">
+ Erreur : trop de niveaux de dossiers imbriqués concernant cet article. Réorganisez le tout afin qu&apos;un maximum de 3 niveaux soit utilisé.
+ </string>
+ <string name="Marketplace Error Unsellable Item">
+ Erreur : cet article ne peut pas être vendu sur la Place du marché.
+ </string>
+ <string name="Marketplace Error Internal Import">
+ Erreur : un problème est survenu concernant cet article. Veuillez réessayer ultérieurement.
+ </string>
+ <string name="Open landmarks">
+ Ouvrir les repères
+ </string>
<string name="no_transfer" value=" (pas de transfert)"/>
<string name="no_modify" value=" (pas de modification)"/>
<string name="no_copy" value=" (pas de copie)"/>
@@ -1067,7 +1316,7 @@
<string name="PermNo">
Non
</string>
- <string name="Chat" value=" Chat :"/>
+ <string name="Chat Message" value="Chat :"/>
<string name="Sound" value=" Son :"/>
<string name="Wait" value=" --- Attendre :"/>
<string name="AnimFlagStop" value=" Arrêter l&apos;animation :"/>
@@ -1089,13 +1338,10 @@
<string name="Textures" value=" Textures,"/>
<string name="Snapshots" value=" Photos,"/>
<string name="No Filters" value="Non "/>
- <string name="Since Logoff" value=" depuis la déconnexion"/>
+ <string name="Since Logoff" value="depuis la déconnexion"/>
<string name="InvFolder My Inventory">
Mon inventaire
</string>
- <string name="InvFolder My Favorites">
- Mes Favoris
- </string>
<string name="InvFolder Library">
Bibliothèque
</string>
@@ -1154,10 +1400,10 @@
Gestes
</string>
<string name="InvFolder Favorite">
- Favoris
+ Mes Favoris
</string>
<string name="InvFolder favorite">
- Favoris
+ Mes Favoris
</string>
<string name="InvFolder Current Outfit">
Tenue actuelle
@@ -1171,12 +1417,21 @@
<string name="InvFolder Accessories">
Accessoires
</string>
+ <string name="InvFolder Meshes">
+ Maillages
+ </string>
<string name="InvFolder Friends">
Amis
</string>
<string name="InvFolder All">
Tout
</string>
+ <string name="no_attachments">
+ Aucun élément attaché porté
+ </string>
+ <string name="Attachments remain">
+ Éléments attachés ([COUNT] emplacements restants)
+ </string>
<string name="Buy">
Acheter
</string>
@@ -1303,6 +1558,12 @@
<string name="Right Pec">
Pectoral droit
</string>
+ <string name="Neck">
+ Cou
+ </string>
+ <string name="Avatar Center">
+ Centre de l&apos;avatar
+ </string>
<string name="Invalid Attachment">
Point d&apos;attache non valide
</string>
@@ -1485,7 +1746,10 @@
(Inconnu)
</string>
<string name="SummaryForTheWeek" value="Récapitulatif de la semaine, début le "/>
- <string name="NextStipendDay" value="Prochaine prime le "/>
+ <string name="NextStipendDay" value=". Prochaine prime le "/>
+ <string name="GroupPlanningDate">
+ [day,datetime,utc]/[mthnum,datetime,utc]/[year,datetime,utc]
+ </string>
<string name="GroupIndividualShare" value=" Groupe Part individuelle"/>
<string name="GroupColumn" value="Groupe"/>
<string name="Balance">
@@ -1512,6 +1776,9 @@
<string name="IMTeen">
teen
</string>
+ <string name="Anyone">
+ n&apos;importe qui
+ </string>
<string name="RegionInfoError">
erreur
</string>
@@ -1734,6 +2001,12 @@
<string name="Public">
Public
</string>
+ <string name="LocalSettings">
+ Réglages locaux
+ </string>
+ <string name="RegionSettings">
+ Réglages de la région
+ </string>
<string name="ClassifiedClicksTxt">
Clics : [TELEPORT] téléportation, [MAP] carte, [PROFILE] profil
</string>
@@ -1773,11 +2046,8 @@
<string name="InvOfferGaveYou">
vous a donné
</string>
- <string name="InvOfferYouDecline">
- Vous avez refusé
- </string>
- <string name="InvOfferFrom">
- de la part de
+ <string name="InvOfferDecline">
+ Vous refusez l&apos;offre [DESC] de &lt;nolink&gt;[NAME]&lt;/nolink&gt;.
</string>
<string name="GroupMoneyTotal">
Total
@@ -1809,6 +2079,9 @@
<string name="GroupMoneyDebits">
Débits
</string>
+ <string name="GroupMoneyDate">
+ [weekday,datetime,utc] [day,datetime,utc] [mth,datetime,utc] [year,datetime,utc]
+ </string>
<string name="ViewerObjectContents">
Contenus
</string>
@@ -1867,12 +2140,6 @@
<string name="accel-win-shift">
Maj+
</string>
- <string name="Esc">
- Échap
- </string>
- <string name="Home">
- Début
- </string>
<string name="FileSaved">
Fichier enregistré
</string>
@@ -1891,34 +2158,34 @@
<string name="PDT">
PDT
</string>
- <string name="Forward">
- Vers l&apos;avant
+ <string name="Direction_Forward">
+ Avant
</string>
- <string name="Left">
+ <string name="Direction_Left">
Gauche
</string>
- <string name="Right">
+ <string name="Direction_Right">
Droite
</string>
- <string name="Back">
+ <string name="Direction_Back">
Arrière
</string>
- <string name="North">
+ <string name="Direction_North">
Nord
</string>
- <string name="South">
+ <string name="Direction_South">
Sud
</string>
- <string name="West">
+ <string name="Direction_West">
Ouest
</string>
- <string name="East">
+ <string name="Direction_East">
Est
</string>
- <string name="Up">
+ <string name="Direction_Up">
Haut
</string>
- <string name="Down">
+ <string name="Direction_Down">
Bas
</string>
<string name="Any Category">
@@ -1990,6 +2257,9 @@
<string name="Other">
Autre
</string>
+ <string name="Rental">
+ Location
+ </string>
<string name="Any">
Aucun
</string>
@@ -2253,6 +2523,114 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
<string name="Bulbous Nose">
Nez en bulbe
</string>
+ <string name="Breast Physics Mass">
+ Masse des seins
+ </string>
+ <string name="Breast Physics Smoothing">
+ Lissage des seins
+ </string>
+ <string name="Breast Physics Gravity">
+ Gravité des seins
+ </string>
+ <string name="Breast Physics Drag">
+ Résistance de l&apos;air sur les seins
+ </string>
+ <string name="Breast Physics InOut Max Effect">
+ Effet max.
+ </string>
+ <string name="Breast Physics InOut Spring">
+ Élasticité
+ </string>
+ <string name="Breast Physics InOut Gain">
+ Amplification
+ </string>
+ <string name="Breast Physics InOut Damping">
+ Amortissement
+ </string>
+ <string name="Breast Physics UpDown Max Effect">
+ Effet max.
+ </string>
+ <string name="Breast Physics UpDown Spring">
+ Élasticité
+ </string>
+ <string name="Breast Physics UpDown Gain">
+ Amplification
+ </string>
+ <string name="Breast Physics UpDown Damping">
+ Amortissement
+ </string>
+ <string name="Breast Physics LeftRight Max Effect">
+ Effet max.
+ </string>
+ <string name="Breast Physics LeftRight Spring">
+ Élasticité
+ </string>
+ <string name="Breast Physics LeftRight Gain">
+ Amplification
+ </string>
+ <string name="Breast Physics LeftRight Damping">
+ Amortissement
+ </string>
+ <string name="Belly Physics Mass">
+ Masse du ventre
+ </string>
+ <string name="Belly Physics Smoothing">
+ Lissage du ventre
+ </string>
+ <string name="Belly Physics Gravity">
+ Gravité du ventre
+ </string>
+ <string name="Belly Physics Drag">
+ Résistance de l&apos;air sur le ventre
+ </string>
+ <string name="Belly Physics UpDown Max Effect">
+ Effet max.
+ </string>
+ <string name="Belly Physics UpDown Spring">
+ Élasticité
+ </string>
+ <string name="Belly Physics UpDown Gain">
+ Amplification
+ </string>
+ <string name="Belly Physics UpDown Damping">
+ Amortissement
+ </string>
+ <string name="Butt Physics Mass">
+ Masse des fesses
+ </string>
+ <string name="Butt Physics Smoothing">
+ Lissage des fesses
+ </string>
+ <string name="Butt Physics Gravity">
+ Gravité des fesses
+ </string>
+ <string name="Butt Physics Drag">
+ Résistance de l&apos;air sur les fesses
+ </string>
+ <string name="Butt Physics UpDown Max Effect">
+ Effet max.
+ </string>
+ <string name="Butt Physics UpDown Spring">
+ Élasticité
+ </string>
+ <string name="Butt Physics UpDown Gain">
+ Amplification
+ </string>
+ <string name="Butt Physics UpDown Damping">
+ Amortissement
+ </string>
+ <string name="Butt Physics LeftRight Max Effect">
+ Effet max.
+ </string>
+ <string name="Butt Physics LeftRight Spring">
+ Élasticité
+ </string>
+ <string name="Butt Physics LeftRight Gain">
+ Amplification
+ </string>
+ <string name="Butt Physics LeftRight Damping">
+ Amortissement
+ </string>
<string name="Bushy Eyebrows">
Sourcils touffus
</string>
@@ -2262,6 +2640,9 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
<string name="Butt Size">
Taille des fesses
</string>
+ <string name="Butt Gravity">
+ Gravité des fesses
+ </string>
<string name="bustle skirt">
Jupe gonflante
</string>
@@ -3474,6 +3855,9 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
<string name="LocationCtrlGeneralIconTooltip">
Région de type Général
</string>
+ <string name="LocationCtrlSeeAVsTooltip">
+ Avatars visibles et chat autorisé en dehors de cette parcelle
+ </string>
<string name="UpdaterWindowTitle">
[APP_NAME] - Mise à jour
</string>
@@ -3540,6 +3924,9 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
<string name="Saved_message">
(Enregistrement : [LONG_TIMESTAMP])
</string>
+ <string name="IM_unblock_only_groups_friends">
+ Pour afficher ce message, vous devez désactiver la case Seuls mes amis et groupes peuvent m&apos;appeler ou m&apos;envoyer un IM, sous Préférences/Confidentialité.
+ </string>
<string name="answered_call">
Votre appel a fait l&apos;objet d&apos;une réponse
</string>
@@ -3648,6 +4035,9 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
<string name="session_initialization_timed_out_error">
Expiration du délai d&apos;initialisation de la session
</string>
+ <string name="Home position set.">
+ Emplacement du domicile défini.
+ </string>
<string name="voice_morphing_url">
http://secondlife.com/landing/voicemorphing
</string>
@@ -3669,6 +4059,18 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
<string name="you_paid_ldollars_no_name">
Vous avez payé à [AMOUNT] L$ [REASON].
</string>
+ <string name="you_paid_failure_ldollars">
+ Votre paiement de [AMOUNT] L$ à [NAME] [REASON] a échoué.
+ </string>
+ <string name="you_paid_failure_ldollars_no_info">
+ Votre paiement de [AMOUNT] L$ a échoué.
+ </string>
+ <string name="you_paid_failure_ldollars_no_reason">
+ Votre paiement de [AMOUNT] L$ à [NAME] a échoué.
+ </string>
+ <string name="you_paid_failure_ldollars_no_name">
+ Votre paiement de [AMOUNT] L$ [REASON] a échoué.
+ </string>
<string name="for item">
pour l&apos;article suivant : [ITEM]
</string>
@@ -3721,9 +4123,9 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
En ligne
</string>
<string name="uploading_abuse_report">
- Chargement en cours...
+ Chargement...
-de l&apos;infraction signalée
+du rapport d&apos;infraction
</string>
<string name="New Shape">
Nouvelle silhouette
@@ -3770,6 +4172,9 @@ de l&apos;infraction signalée
<string name="New Tattoo">
Nouveau tatouage
</string>
+ <string name="New Physics">
+ Nouvelles propriétés physiques
+ </string>
<string name="Invalid Wearable">
Objet à porter non valide
</string>
@@ -3893,6 +4298,87 @@ de l&apos;infraction signalée
<string name="Female - Wow">
Femme - Ouah !
</string>
+ <string name="/bow">
+ /s&apos;incliner
+ </string>
+ <string name="/clap">
+ /applaudir
+ </string>
+ <string name="/count">
+ /compter
+ </string>
+ <string name="/extinguish">
+ /éteindre
+ </string>
+ <string name="/kmb">
+ /vatefairevoir
+ </string>
+ <string name="/muscle">
+ /montrersesmuscles
+ </string>
+ <string name="/no">
+ /non
+ </string>
+ <string name="/no!">
+ /non !
+ </string>
+ <string name="/paper">
+ /papier
+ </string>
+ <string name="/pointme">
+ /memontrerdudoigt
+ </string>
+ <string name="/pointyou">
+ /montrerl&apos;autredudoigt
+ </string>
+ <string name="/rock">
+ /pierre
+ </string>
+ <string name="/scissor">
+ /ciseaux
+ </string>
+ <string name="/smoke">
+ /fumer
+ </string>
+ <string name="/stretch">
+ /bailler
+ </string>
+ <string name="/whistle">
+ /siffler
+ </string>
+ <string name="/yes">
+ /oui
+ </string>
+ <string name="/yes!">
+ /oui !
+ </string>
+ <string name="afk">
+ absent
+ </string>
+ <string name="dance1">
+ danse1
+ </string>
+ <string name="dance2">
+ danse2
+ </string>
+ <string name="dance3">
+ danse3
+ </string>
+ <string name="dance4">
+ danse4
+ </string>
+ <string name="dance5">
+ danse5
+ </string>
+ <string name="dance6">
+ danse6
+ </string>
+ <string name="dance7">
+ danse7
+ </string>
+ <string name="dance8">
+ danse8
+ </string>
<string name="AvatarBirthDateFormat">
[day,datetime,slt]/[mthnum,datetime,slt]/[year,datetime,slt]
</string>
@@ -3906,7 +4392,7 @@ de l&apos;infraction signalée
<string name="server_is_down">
Malgré nos efforts, une erreur inattendue s&apos;est produite.
- Veuillez vous reporter à status.secondlifegrid.net afin de déterminer si un problème connu existe avec ce service.
+ Veuillez vous reporter à status.secondlifegrid.net afin de déterminer si un problème connu existe avec ce service.
Si le problème persiste, vérifiez la configuration de votre réseau et de votre pare-feu.
</string>
<string name="dateTimeWeekdaysNames">
@@ -3969,7 +4455,7 @@ de l&apos;infraction signalée
<string name="Notices">
Notices
</string>
- <string name="Chat">
+ <string name="Chat" value=" Chat :">
Chat
</string>
<string name="DeleteItems">
@@ -3981,4 +4467,552 @@ de l&apos;infraction signalée
<string name="EmptyOutfitText">
Cette tenue ne contient aucun article.
</string>
+ <string name="ExternalEditorNotSet">
+ Sélectionnez un éditeur à l&apos;aide du paramètre ExternalEditor.
+ </string>
+ <string name="ExternalEditorNotFound">
+ Éditeur externe spécifié introuvable.
+Essayez avec le chemin d&apos;accès à l&apos;éditeur entre guillemets doubles
+(par ex. : &quot;/chemin_accès/editor&quot; &quot;%s&quot;).
+ </string>
+ <string name="ExternalEditorCommandParseError">
+ Erreur lors de l&apos;analyse de la commande d&apos;éditeur externe.
+ </string>
+ <string name="ExternalEditorFailedToRun">
+ Échec d&apos;exécution de l&apos;éditeur externe.
+ </string>
+ <string name="TranslationFailed">
+ Échec de traduction : [REASON]
+ </string>
+ <string name="TranslationResponseParseError">
+ Erreur lors de l&apos;analyse de la réponse relative à la traduction.
+ </string>
+ <string name="Esc">
+ Échap
+ </string>
+ <string name="Space">
+ Space
+ </string>
+ <string name="Enter">
+ Enter
+ </string>
+ <string name="Tab">
+ Tab
+ </string>
+ <string name="Ins">
+ Ins
+ </string>
+ <string name="Del">
+ Del
+ </string>
+ <string name="Backsp">
+ Backsp
+ </string>
+ <string name="Shift">
+ Shift
+ </string>
+ <string name="Ctrl">
+ Ctrl
+ </string>
+ <string name="Alt">
+ Alt
+ </string>
+ <string name="CapsLock">
+ CapsLock
+ </string>
+ <string name="Home">
+ Début
+ </string>
+ <string name="End">
+ End
+ </string>
+ <string name="PgUp">
+ PgUp
+ </string>
+ <string name="PgDn">
+ PgDn
+ </string>
+ <string name="F1">
+ F1
+ </string>
+ <string name="F2">
+ F2
+ </string>
+ <string name="F3">
+ F3
+ </string>
+ <string name="F4">
+ F4
+ </string>
+ <string name="F5">
+ F5
+ </string>
+ <string name="F6">
+ F6
+ </string>
+ <string name="F7">
+ F7
+ </string>
+ <string name="F8">
+ F8
+ </string>
+ <string name="F9">
+ F9
+ </string>
+ <string name="F10">
+ F10
+ </string>
+ <string name="F11">
+ F11
+ </string>
+ <string name="F12">
+ F12
+ </string>
+ <string name="Add">
+ Ajouter
+ </string>
+ <string name="Subtract">
+ Soustraire
+ </string>
+ <string name="Multiply">
+ Multiplier
+ </string>
+ <string name="Divide">
+ Diviser
+ </string>
+ <string name="PAD_DIVIDE">
+ PAD_DIVIDE
+ </string>
+ <string name="PAD_LEFT">
+ PAD_LEFT
+ </string>
+ <string name="PAD_RIGHT">
+ PAD_RIGHT
+ </string>
+ <string name="PAD_DOWN">
+ PAD_DOWN
+ </string>
+ <string name="PAD_UP">
+ PAD_UP
+ </string>
+ <string name="PAD_HOME">
+ PAD_HOME
+ </string>
+ <string name="PAD_END">
+ PAD_END
+ </string>
+ <string name="PAD_PGUP">
+ PAD_PGUP
+ </string>
+ <string name="PAD_PGDN">
+ PAD_PGDN
+ </string>
+ <string name="PAD_CENTER">
+ PAD_CENTER
+ </string>
+ <string name="PAD_INS">
+ PAD_INS
+ </string>
+ <string name="PAD_DEL">
+ PAD_DEL
+ </string>
+ <string name="PAD_Enter">
+ PAD_Enter
+ </string>
+ <string name="PAD_BUTTON0">
+ PAD_BUTTON0
+ </string>
+ <string name="PAD_BUTTON1">
+ PAD_BUTTON1
+ </string>
+ <string name="PAD_BUTTON2">
+ PAD_BUTTON2
+ </string>
+ <string name="PAD_BUTTON3">
+ PAD_BUTTON3
+ </string>
+ <string name="PAD_BUTTON4">
+ PAD_BUTTON4
+ </string>
+ <string name="PAD_BUTTON5">
+ PAD_BUTTON5
+ </string>
+ <string name="PAD_BUTTON6">
+ PAD_BUTTON6
+ </string>
+ <string name="PAD_BUTTON7">
+ PAD_BUTTON7
+ </string>
+ <string name="PAD_BUTTON8">
+ PAD_BUTTON8
+ </string>
+ <string name="PAD_BUTTON9">
+ PAD_BUTTON9
+ </string>
+ <string name="PAD_BUTTON10">
+ PAD_BUTTON10
+ </string>
+ <string name="PAD_BUTTON11">
+ PAD_BUTTON11
+ </string>
+ <string name="PAD_BUTTON12">
+ PAD_BUTTON12
+ </string>
+ <string name="PAD_BUTTON13">
+ PAD_BUTTON13
+ </string>
+ <string name="PAD_BUTTON14">
+ PAD_BUTTON14
+ </string>
+ <string name="PAD_BUTTON15">
+ PAD_BUTTON15
+ </string>
+ <string name="-">
+ -
+ </string>
+ <string name="=">
+ =
+ </string>
+ <string name="`">
+ `
+ </string>
+ <string name=";">
+ ;
+ </string>
+ <string name="[">
+ [
+ </string>
+ <string name="]">
+ ]
+ </string>
+ <string name="\">
+ \
+ </string>
+ <string name="0">
+ 0
+ </string>
+ <string name="1">
+ 1
+ </string>
+ <string name="2">
+ 2
+ </string>
+ <string name="3">
+ 3
+ </string>
+ <string name="4">
+ 4
+ </string>
+ <string name="5">
+ 5
+ </string>
+ <string name="6">
+ 6
+ </string>
+ <string name="7">
+ 7
+ </string>
+ <string name="8">
+ 8
+ </string>
+ <string name="9">
+ 9
+ </string>
+ <string name="A">
+ A
+ </string>
+ <string name="B">
+ B
+ </string>
+ <string name="C">
+ C
+ </string>
+ <string name="D">
+ D
+ </string>
+ <string name="E">
+ E
+ </string>
+ <string name="F">
+ F
+ </string>
+ <string name="G">
+ G
+ </string>
+ <string name="H">
+ H
+ </string>
+ <string name="I">
+ I
+ </string>
+ <string name="J">
+ J
+ </string>
+ <string name="K">
+ K
+ </string>
+ <string name="L">
+ L
+ </string>
+ <string name="M">
+ M
+ </string>
+ <string name="N">
+ N
+ </string>
+ <string name="O">
+ O
+ </string>
+ <string name="P">
+ P
+ </string>
+ <string name="Q">
+ Q
+ </string>
+ <string name="R">
+ R
+ </string>
+ <string name="S">
+ S
+ </string>
+ <string name="T">
+ T
+ </string>
+ <string name="U">
+ U
+ </string>
+ <string name="V">
+ V
+ </string>
+ <string name="W">
+ W
+ </string>
+ <string name="X">
+ X
+ </string>
+ <string name="Y">
+ Y
+ </string>
+ <string name="Z">
+ Z
+ </string>
+ <string name="BeaconParticle">
+ Affichage des balises de particule (bleu)
+ </string>
+ <string name="BeaconPhysical">
+ Affichage des balises d&apos;objet physique (vert)
+ </string>
+ <string name="BeaconScripted">
+ Affichage des balises d&apos;objet scripté (rouge)
+ </string>
+ <string name="BeaconScriptedTouch">
+ Affichage des balises d&apos;objet scripté avec fonction de toucher (rouge)
+ </string>
+ <string name="BeaconSound">
+ Affichage des balises de son (jaune)
+ </string>
+ <string name="BeaconMedia">
+ Affichage des balises de média (blanc)
+ </string>
+ <string name="ParticleHiding">
+ Masquage des particules
+ </string>
+ <string name="Command_AboutLand_Label">
+ À propos du terrain
+ </string>
+ <string name="Command_Appearance_Label">
+ Apparence
+ </string>
+ <string name="Command_Avatar_Label">
+ Avatar
+ </string>
+ <string name="Command_Build_Label">
+ Construire
+ </string>
+ <string name="Command_Chat_Label">
+ Chat
+ </string>
+ <string name="Command_Compass_Label">
+ Boussole
+ </string>
+ <string name="Command_Destinations_Label">
+ Destinations
+ </string>
+ <string name="Command_Gestures_Label">
+ Gestes
+ </string>
+ <string name="Command_HowTo_Label">
+ Aide rapide
+ </string>
+ <string name="Command_Inventory_Label">
+ Inventaire
+ </string>
+ <string name="Command_Map_Label">
+ Carte
+ </string>
+ <string name="Command_Marketplace_Label">
+ Place du marché
+ </string>
+ <string name="Command_MiniMap_Label">
+ Mini-carte
+ </string>
+ <string name="Command_Move_Label">
+ Marcher / Courir / Voler
+ </string>
+ <string name="Command_Outbox_Label">
+ Boîte d&apos;envoi vendeur
+ </string>
+ <string name="Command_People_Label">
+ Personnes
+ </string>
+ <string name="Command_Picks_Label">
+ Favoris
+ </string>
+ <string name="Command_Places_Label">
+ Lieux
+ </string>
+ <string name="Command_Preferences_Label">
+ Préférences
+ </string>
+ <string name="Command_Profile_Label">
+ Profil
+ </string>
+ <string name="Command_Search_Label">
+ Recherche
+ </string>
+ <string name="Command_Snapshot_Label">
+ Photo
+ </string>
+ <string name="Command_Speak_Label">
+ Parler
+ </string>
+ <string name="Command_View_Label">
+ Paramètres de la caméra
+ </string>
+ <string name="Command_Voice_Label">
+ Paramètres vocaux
+ </string>
+ <string name="Command_AboutLand_Tooltip">
+ Information sur le terrain que vous visitez
+ </string>
+ <string name="Command_Appearance_Tooltip">
+ Modifier votre avatar
+ </string>
+ <string name="Command_Avatar_Tooltip">
+ Choisir un avatar complet
+ </string>
+ <string name="Command_Build_Tooltip">
+ Construction d&apos;objets et remodelage du terrain
+ </string>
+ <string name="Command_Chat_Tooltip">
+ Parler aux personnes près de vous par chat écrit
+ </string>
+ <string name="Command_Compass_Tooltip">
+ Boussole
+ </string>
+ <string name="Command_Destinations_Tooltip">
+ Destinations intéressantes
+ </string>
+ <string name="Command_Gestures_Tooltip">
+ Gestes de votre avatar
+ </string>
+ <string name="Command_HowTo_Tooltip">
+ Comment effectuer les opérations courantes
+ </string>
+ <string name="Command_Inventory_Tooltip">
+ Afficher et utiliser vos possessions
+ </string>
+ <string name="Command_Map_Tooltip">
+ Carte du monde
+ </string>
+ <string name="Command_Marketplace_Tooltip">
+ Faire du shopping
+ </string>
+ <string name="Command_MiniMap_Tooltip">
+ Afficher les personnes près de vous
+ </string>
+ <string name="Command_Move_Tooltip">
+ Faire bouger votre avatar
+ </string>
+ <string name="Command_Outbox_Tooltip">
+ Transférer des articles vers votre place de marché afin de les vendre.
+ </string>
+ <string name="Command_People_Tooltip">
+ Amis, groupes et personnes près de vous
+ </string>
+ <string name="Command_Picks_Tooltip">
+ Lieux à afficher comme favoris dans votre profil
+ </string>
+ <string name="Command_Places_Tooltip">
+ Lieux enregistrés
+ </string>
+ <string name="Command_Preferences_Tooltip">
+ Préférences
+ </string>
+ <string name="Command_Profile_Tooltip">
+ Modifier ou afficher votre profil
+ </string>
+ <string name="Command_Search_Tooltip">
+ Trouver des lieux, personnes, événements
+ </string>
+ <string name="Command_Snapshot_Tooltip">
+ Prendre une photo
+ </string>
+ <string name="Command_Speak_Tooltip">
+ Parler aux personnes près de vous en utilisant votre micro
+ </string>
+ <string name="Command_View_Tooltip">
+ Changer l&apos;angle de la caméra
+ </string>
+ <string name="Command_Voice_Tooltip">
+ Commandes de réglage du volume des appels et des personnes près de vous dans Second Life.
+ </string>
+ <string name="Toolbar_Bottom_Tooltip">
+ actuellement dans la barre d&apos;outils du bas
+ </string>
+ <string name="Toolbar_Left_Tooltip">
+ actuellement dans la barre d&apos;outils de gauche
+ </string>
+ <string name="Toolbar_Right_Tooltip">
+ actuellement dans la barre d&apos;outils de droite
+ </string>
+ <string name="Retain%">
+ Garder%
+ </string>
+ <string name="Detail">
+ Détail
+ </string>
+ <string name="Better Detail">
+ Meilleur détail
+ </string>
+ <string name="Surface">
+ Surface
+ </string>
+ <string name="Solid">
+ Solide
+ </string>
+ <string name="Wrap">
+ Wrap
+ </string>
+ <string name="Preview">
+ Aperçu
+ </string>
+ <string name="Normal">
+ Normal
+ </string>
+ <string name="snapshot_quality_very_low">
+ Très faible
+ </string>
+ <string name="snapshot_quality_low">
+ Faible
+ </string>
+ <string name="snapshot_quality_medium">
+ Moyenne
+ </string>
+ <string name="snapshot_quality_high">
+ Élevée
+ </string>
+ <string name="snapshot_quality_very_high">
+ Très élevée
+ </string>
</strings>
diff --git a/indra/newview/skins/default/xui/fr/teleport_strings.xml b/indra/newview/skins/default/xui/fr/teleport_strings.xml
index 7c291c0984..d0c74ff353 100644
--- a/indra/newview/skins/default/xui/fr/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/fr/teleport_strings.xml
@@ -20,6 +20,10 @@ Si vous ne parvenez toujours pas à être téléporté, déconnectez-vous puis r
Désolé, la connexion vers votre lieu de téléportation n&apos;a pas abouti.
Veuillez réessayer dans un moment.
</message>
+ <message name="NoHelpIslandTP">
+ Vous ne pouvez pas vous téléporter à nouveau vers Welcome Island.
+Pour recommencer le didacticiel, accédez à Welcome Island Public.
+ </message>
<message name="noaccess_tport">
Désolé, vous n&apos;avez pas accès à cette destination.
</message>
diff --git a/indra/newview/skins/default/xui/it/floater_about.xml b/indra/newview/skins/default/xui/it/floater_about.xml
index 140f7bdc14..39114b7bf7 100644
--- a/indra/newview/skins/default/xui/it/floater_about.xml
+++ b/indra/newview/skins/default/xui/it/floater_about.xml
@@ -8,9 +8,9 @@
Generato con [COMPILER] versione [COMPILER_VERSION]
</floater.string>
<floater.string name="AboutPosition">
- Tu sei [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] in [REGION] located at &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ([HOSTIP])
+ Tu sei [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] in [REGION] che si trova a &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ([HOSTIP])
[SERVER_VERSION]
-[[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]]
+[SERVER_RELEASE_NOTES_URL]
</floater.string>
<floater.string name="AboutSystem">
CPU: [CPU]
@@ -37,45 +37,64 @@ Versione Server voice: [VOICE_VERSION]
<floater.string name="AboutTraffic">
Pacchetti perduti: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%) Informazioni
</floater.string>
+ <floater.string name="ErrorFetchingServerReleaseNotesURL">
+ Errore nel recupero URL note rilascio versione
+ </floater.string>
<tab_container name="about_tab">
<panel label="Informazioni" name="support_panel">
<button label="Copia negli appunti" name="copy_btn"/>
</panel>
<panel label="Ringraziamenti" name="credits_panel">
- <text_editor name="credits_editor">
- Second Life ti è offerto da Philip, Tessa, Andrew, Cory, Ian, James, Phoenix, Ryan, Haney, Dan, Char, Ben, John, Tanya, Eddie, Richard, Mitch, Doug, Eric, Frank, Bruce, Aaron, Peter, Alice, Charlie, Debra, Eileen, Helen, Janet, Steffan, Steve, Tom, Mark, Hunter, Xenon, Burgess, Bill, Jim, Lee, Hamlet, Daniel, Jeff, Todd, Sarah, Tim, Stephanie, Colin, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Jack, Vektor, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Jesse, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Yuko, Makiko, Thomas, Harry, Seth, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Brad, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, Beez, Milo, Hermia, Red, Thrax, Gulliver, Joe, Sally, Paul, Jose, Rejean, Dore, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, Dustin, George, Del, Matthew, Cat, Jacqui, Adrian, Viola, Alfred, Noel, Irfan, Yool, Rika, Jane, Frontier, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Jeremy, JP, Jake, Anthony, Maurice, Madhavi, Leopard, Kyle, Joon, Bert, Belinda, Jon, Kristi, Bridie, Pramod, Socrates, Maria, Aric, Adreanne, Jay, Kari, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Colossus, Zen, BigPapi, Pastrami, Kurz, Mani, Neuro, Mel, Sardonyx, MJ, Rowan, Sgt, Elvis, Samuel, Leo, Bryan, Niko, Austin, Soft, Poppy, Rachel, Aki, Banzai, Alexa, Sue, Bender, CG, Angelo, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Rothman, Niall, Marin, Allison, Katie, Dawn, Dusty, Katt, Judy, Andrea, Ambroff, Infinity, Rico, Gail, Kalpana, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Maestro, Simone, Yang, T, Shannon, Nelson, Khanh, Scott, Courtney, Charlene, Quixote, Susan, Zed, Amanda, Katelin, Enkidu, Roxie, Esbee, JoRoan, Scarlet, Tay, Kevin, Wolfgang, Johnny, Ray, Andren, Merov, Bob, Rand, Howard, Callen, Heff, Galen, Newell, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl, Ashley, JessieAnn, Huseby, Karina, Paris, Kurt, Rick, Lis, Kotler, Theeba, Lynx, Murphy, Doten, Taka, Norm, Jillian, Marcus, Mae, Novack, Esther, Perry, Dana, Ducot, Javier, Porter, Madison, Gecko, Dough, JR, Gisele, Crimp, Norie, Arch, Kimi, Fisher, Barbara, Jason, Peggy, Bernard, Jules, Leroy, Eva, Khederian, Campbell, Vogt, Masido, Karel, Torres, Lo, Breezer, Delby, Rountree, Anna, Servus, Rue, Itiaes, Chuck, Luna, Novella, Zaza, Wen, Gino, Lex, Cassandra, Limey, Nancy, Anukul, Silver, Brodesky, Jinsai, Squid, Gez, Rakesh, Ladan, Edelman, Marcet, Squire, Tatem, Tony, Jerm, Tia, Falcon, BK, Tiggs, Driscoll, Bacon, Timothee, Cru, Carmilla, Coyot, Webb, Kazu, Rudas, LJ, Sea, Ali Wallace, Bewest, Pup, Drub, Dragon, Inoshiro, Byron, Rhett, Xandix, Aimee, Fredrik, Thor, Teddy, Baron, Nelly, Ghengis, Epic, Eli, Stone, Grapes, Irie, Prep, Scobu, Valerie, Alain e molti altri ancora.
-
-Si ringraziano i seguenti residenti per aver contribuito a rendere questa versione la migliore possibile: Drew Dwi, Zai Lynch, Latif Khalifa, Ellla McMahon, Harleen Gretzky, Squirrel Wood, Malarthi Behemoth, Dante Tucker, Buckaroo Mu, Eddi Decosta, Dirk, Talamasca, Torben Trautman, Irene Muni, Aralara Rajal, Aura Dirval, Cayu Cluny, Eva Rau, FreeSL Aeon, Frontera Thor, Inma Rau, Lunita Savira, Minerva Memel, Polo Gufler, Xiki Luik, Lilly Zenovka, Vick Forcella, Sasy Scarborough, Gentle Welinder, Elric Anatine, Techwolf Lupindo, Dusan Writer, WolfPup Lowenhar, Marianne McCann, Fiachra Lach, Sitearm Madonna, Sudane Erato, Sahkolihaa Contepomi, Sachi Vixen, Questar Utu, Dimitrio Lewis, Matto Destiny, Scrim Pinion, Radio Signals, Psi Merlin, Pixel Gausman, Mel Vanbeeck, Laurent Bechir, Lamorna Proctor, Lares Carter, Gwyneth Llewelyn, Hydra Shaftoe, Holger Gilruth, Gentle Heron, Carla Broek, Boroondas Gupte, Fury Rosewood, Flower Ducatillon, Colpo Wexler, gwampa Lomu, Borg Capalini, Beansy Twine, Ardy Lay, , 45ms Zhong, Adeon Writer, Aeonix Aeon, Ai Austin, Aiko Ying, Alexandrea Fride, Alliez Mysterio, Annie Milestone, Annika Genezzia, Ansariel Hiller, ArminasX Saiman, Arya Braveheart, Asaeda Meltingdots, Asturkon Jua, Avallyn Oakleaf, Avatar Quinzet, BabyA Littlething, Bacchus Ireto, Bazaar, Riva, Benjamin Bigdipper, Beth Walcher, Bezilon Kasei, Biancaluce Robbiani, Bill Walach, blakopal Galicia, Blitzckreed Levenque, Bryn Oh, Callipygian Christensen, Cap Carver, Carr Arbenlow, Chantal Harvey, Charles Courtois, Charlie Sazaland, Cherry Cheevers, ChickyBabes Zuzu, Christopher Organiser, Ciaran Laval, Clara Young, Celierra Darling, Corinne Helendale, Corro Moseley, Coughdrop Littlething, Darien Caldwell, Dartagan Shepherd, Debs Regent, Decro Schmooz, Denim Kamachi, DiJodi Dubratt, Dil Spitz, Edgware Marker, Egehan Dryke, Emma Portilo, Emmie Fairymeadow, Evangelista Emerald, Faelon Swordthain, Frenchimmo Sabra, Gaberoonie Zanzibar, Ganymedes Costagravas, Gene Frostbite, GeneJ Composer, Giggles Littlebird, Grady Echegaray, Guni Greenstein, Gypsy Tripsa, Hackshaven Harford, Ham Rambler, Han Shuffle, Hanglow Short, Hatzfeld Runo, herina Bode, Horatio Freund, Hypatia Callisto, Hypatia Pickens, Identity Euler, Imnotgoing Sideways, Innula Zenovka, Iyoba Tarantal, Jack Abraham, Jagga Meredith, Jennifer Boyle, Jeremy Marquez, Jessica Qin, Jinx Nordberg, Jo Bernandes, Jocial Sonnenkern, Joel Savard, Jondan Lundquist, Josef Munster, Josette Windlow, Juilan Tripsa, Juro Kothari, Justin RiversRunRed, Kagehi Kohn, Kaimen Takahe, Keklily Longfall, Ken Lavender, Kestral Karas, Khisme Nitely, Kimar Coba, Kithrak Kirkorian, Kitty Barnett, Kolor Fall, Komiko Okamoto, Korvel Noh, Larry Pixel, Leal Choche, len Starship, Lenae Munz, Lexi Frua, Lillie Cordeaux, Lizzy Macarthur, LSL Scientist, Luban Yiyuan, Luc Starsider, Maccus McCullough, Madison Blanc, Maggie Darwin, Mallory Destiny, Manx Wharton, Marc Claridge, Marc2 Sands, Matthew Anthony, Maxim RiversRunRed, Medhue Simoni, Melinda Latynina, Mencius Watts, Michi Lumin, Midian Farspire, Miles Glaz, Mindy Mathy, Mitch Wagner, Mo Hax, Mourna Biziou, Nao Noe, naofan Teardrop, Naomah Beaumont, Nathiel Siamendes, Nber Medici, Neko Link, Netpat Igaly, Neutron Chesnokov, Newfie Pendragon, Nicholai Laviscu, Nick Rhodes, Nicoladie Gymnast, Ollie Kubrick, Orenj Marat, Orion Delphis, Oryx Tempel, Parvati Silverweb, PeterPunk Mooney, Pixel Scientist, Pounce Teazle, Professor Noarlunga, Quantum Destiny, Quicksilver Hermes, Ralf Setsuko, RAT Quan, RedMokum Bravin, Revolution Perenti, Rezit Sideways, Rich Grainger, Rosco Teardrop, Rose Evans, Rudee Voom, RufusTT Horsefly, Saii Hallard, SaintLEOlions Zimer, Samm Larkham, Satanello Miami, SexySteven Morrisey, Sheet Spotter, Shnurui Troughton, sicarius Thorne, Sicarius Toxx, Sini Nubalo, SLB Wirefly, snowy Sidran, Soupa Segura, ST Mensing, Starshine Halasy, Stickman Ingmann, Synystyr Texan, Takeda Terrawyng, Tali Rosca, Templar Merlin, Tezcatlipoca Bisiani, Tiel Stonecutter, Tony Kembia, TouchaHoney Perhaps, Trey Reanimator, TriloByte Zanzibar, Trinity Dechou, Trinity Dejavu, Unlikely Quintessa, UsikuFarasi Kanarik, Veritas Raymaker, Vex Streeter, Viaticus Speculaas, Villain Baroque, Vixie Durant, Void Singer, Watty Berkson, Westley Schridde, Westley Streeter, Whimsy Winx, Winter Ventura, Wundur Primbee, xstorm Radek, YongYong Francois, Zak Westminster, Zana Kohime, Zaren Alexander, Zeja Pyle, ZenMondo Wormser, Zoex Flanagan e molti altri ancora.
-
-
-
-
-&quot;Il lavoro continua, la causa sussiste, la speranza vive ancora e i sogni non svaniranno mai&quot; - Edward Kennedy
+ <text name="linden_intro">
+ Second Life vi è offerto dai Linden:
+ </text>
+ <text_editor name="linden_names">
+ Philip, Andrew, Doug, Richard, Phoenix, Ian, Mark, Robin, Dan, Char, Ryan, Eric, Jim, Lee, Jeff, Michael, Kelly, Steve, Catherine, Bub, Ramzi, Jill, Jeska, Don, Kona, Callum, Charity, Jack, Shawn, babbage, James, Lauren, Blue, Brent, Reuben, Pathfinder, Jesse, Patsy, Torley, Bo, Cyn, Jonathan, Gia, Annette, Ginsu, Harry, Lex, Runitai, Guy, Cornelius, Beth, Swiss, Thumper, Wendy, Teeple, Seth, Dee, Mia, Sally, Liana, Aura, Beez, Milo, Red, Gulliver, Marius, Joe, Jose, Dore, Justin, Nora, Morpheus, Lexie, Amber, Chris, Xan, Leyla, Walker, Sabin, Joshua, Hiromi, Tofu, Fritz, June, Jean, Ivy, Dez, Ken, Betsy, Which, Spike, Rob, Zee, Dustin, George, Claudia, del, Matthew, jane, jay, Adrian, Yool, Rika, Yoz, siobhan, Qarl, Benjamin, Beast, Everett, madhavi, Christopher, Izzy, stephany, Jeremy, sean, adreanne, Pramod, Tobin, sejong, Iridium, maurice, kj, Meta, kari, JP, bert, kyle, Jon, Socrates, Bridie, Ivan, maria, Aric, Coco, Periapse, sandy, Storrs, Lotte, Colossus, Brad, Pastrami, Zen, BigPapi, Banzai, Sardonyx, Mani, Garry, Jaime, Neuro, Samuel, Niko, CeeLo, Austin, Soft, Poppy, emma, tessa, angelo, kurz, alexa, Sue, CG, Blake, Erica, Brett, Bevis, kristen, Q, simon, Enus, MJ, laurap, Kip, Scouse, Ron, Ram, kend, Marty, Prospero, melissa, kraft, Nat, Seraph, Hamilton, Lordan, Green, miz, Ashlei, Trinity, Ekim, Echo, Charlie, Rowan, Rome, Jt, Doris, benoc, Christy, Bao, Kate, Tj, Patch, Cheah, Johan, Brandy, Angela, Oreh, Cogsworth, Lan, Mitchell, Space, Bambers, Einstein, Bender, Malbers, Matias, Maggie, Rothman, Milton, Niall, Marin, Allison, Mango, Andrea, Katt, Yi, Ambroff, Rico, Raymond, Gail, Christa, William, Dawn, Usi, Dynamike, M, Corr, Dante, Molly, kaylee, Danica, Kelv, Lil, jacob, Nya, Rodney, elsie, Blondin, Grant, Nyx, Devin, Monty, Minerva, Keira, Katie, Jenn, Makai, Clare, Joy, Cody, Gayathri, FJ, spider, Oskar, Landon, Jarv, Noelle, Al, Doc, Gray, Vir, t, Maestro, Simone, Shannon, yang, Courtney, Scott, charlene, Quixote, Susan, Zed, Amanda, Katelin, Esbee, JoRoan, Enkidu, roxie, Scarlet, Merov, Kevin, Judy, Rand, Newell, Les, Dessie, Galen, Michon, Geo, Siz, Calyle, Pete, Praveen, Callen, Sheldon, Pink, Nelson, jenelle, Terrence, Nathan, Juan, Sascha, Huseby, Karina, Kaye, Kotler, Lis, Darv, Charrell, Dakota, Kimmora, Theeba, Taka, Mae, Perry, Ducot, dana, Esther, Dough, gisele, Doten, Viale, Fisher, jessieann, ashley, Torres, delby, rountree, kurt, Slaton, Madison, Rue, Gino, Wen, Casssandra, Brodesky, Squid, Gez, Rakesh, Gecko, Ladan, Tony, Tatem, Squire, Falcon, BK, Crimp, Tiggs, Bacon, Coyot, Carmilla, Webb, Sea, Arch, Jillian, Jason, Bernard, Vogt, Peggy, dragon, Pup, xandix, Wallace, Bewest, Inoshiro, Rhett, AG, Aimee, Ghengis, Itiaes, Eli, Steffan, Epic, Grapes, Stone, Prep, Scobu, Robert, Alain, Carla, Vicky, Tia, Alec, Taras, Lisa, Oz, Ariane, Log, House, Kazu, Kim, Drofnas, Tyler, Campbell, Michele, Madeline, Nelly, Baron, Thor, Lori, Hele, Fredrik, Teddy, Pixie, Berry, Gabrielle, Alfonso, Brooke, Wolf, Ringo, Cru, Charlar, Rodvik, Gibson, Elise, Bagman, Greger, Leonidas, Jerm, Leslie, CB, Brenda, Durian, Carlo, mm, Zeeshan, Caleb, Max, Elikak, Mercille, Steph, Chase
+ </text_editor>
+ <text name="contrib_intro">
+ con contributi open source da:
+ </text>
+ <text_editor name="contrib_names">
+ Dummy Name sostituito all&apos;avvio
+ </text_editor>
+ <text name="trans_intro">
+ e le traduzioni da:
+ </text>
+ <text_editor name="trans_names">
+ Dummy Name sostituito all&apos;avvio
</text_editor>
</panel>
<panel label="Licenze" name="licenses_panel">
<text_editor name="credits_editor">
3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion
- APR Copyright (C) 2000-2004 The Apache Software Foundation
- cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)
- DBus/dbus-glib Copyright (C) 2002, 2003 CodeFactory AB / Copyright (C) 2003, 2004 Red Hat, Inc.
- expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.
- FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org).
- GL Copyright (C) 1999-2004 Brian Paul.
- Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.
- jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)
- jpeglib Copyright (C) 1991-1998, Thomas G. Lane.
- ogg/vorbis Copyright (C) 2001, Xiphophorus
- OpenSSL Copyright (C) 1998-2002 The OpenSSL Project.
- SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
- SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
- xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
- zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler.
- google-perftools Copyright (c) 2005, Google Inc.
-
- Tutti i diritti riservati. Leggi licenses.txt per maggiori dettagli.
+ APR Copyright (C) 2000-2004 The Apache Software Foundation
+ Collada DOM Copyright 2005 Sony Computer Entertainment Inc.
+ cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)
+ DBus/dbus-glib Copyright (C) 2002, 2003 CodeFactory AB / Copyright (C) 2003, 2004 Red Hat, Inc.
+ expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.
+ FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org).
+ GL Copyright (C) 1999-2004 Brian Paul.
+ GLOD Copyright (C) 2003-04 Jonathan Cohen, Nat Duca, Chris Niski, Johns Hopkins University and David Luebke, Brenden Schubert, University of Virginia.
+ google-perftools Copyright (c) 2005, Google Inc.
+ Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.
+ jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)
+ jpeglib Copyright (C) 1991-1998, Thomas G. Lane.
+ ogg/vorbis Copyright (C) 2001, Xiphophorus
+ OpenSSL Copyright (C) 1998-2002 The OpenSSL Project.
+ PCRE Copyright (c) 1997-2008 University of Cambridge
+ SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
+ SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+ xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
+ zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler.
+ google-perftools Copyright (c) 2005, Google Inc.
+
+ Il Viewer Second Life utilizza Havok (TM) Physics. (c)Copyright 1999-2010 Havok.com Inc. (e licenziatari). Tutti i diritti riservati. Per informazioni dettagliate, vedere www.havok.com.
+
+ Questo software contiene codice sorgente fornito da NVIDIA Corporation.
+
+ Tutti i diritti riservati. Per informazioni dettagliate, vedere licenses.txt.
- Chat vocale Codifica audio: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
+ Codifica audio chat vocale: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
</text_editor>
</panel>
</tab_container>
diff --git a/indra/newview/skins/default/xui/it/floater_about_land.xml b/indra/newview/skins/default/xui/it/floater_about_land.xml
index d6834fa70a..cfc3ad8fdb 100644
--- a/indra/newview/skins/default/xui/it/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/it/floater_about_land.xml
@@ -75,77 +75,73 @@ Vai al menu Mondo &gt; Informazioni sul terreno oppure seleziona un altro appezz
<text name="LandType">
Tipo:
</text>
- <text left="119" name="LandTypeText">
+ <text name="LandTypeText">
Mainland / Homestead
</text>
<text name="ContentRating" width="115">
Categoria di accesso:
</text>
- <text left="119" name="ContentRatingText">
+ <text name="ContentRatingText">
Adulti
</text>
<text name="Owner:">
Proprietario:
</text>
- <text left="119" name="OwnerText" width="227">
- Leyla Linden
- </text>
+ <text name="OwnerText" width="227"/>
<text name="Group:">
Gruppo:
</text>
- <text left="119" name="GroupText" width="227">
- Leyla Linden
- </text>
+ <text name="GroupText" width="227"/>
<button label="Imposta" name="Set..."/>
- <check_box label="Permetti cessione al gruppo" left="119" name="check deed" tool_tip="Un funzionario del gruppo può cedere questa terra al gruppo stesso cosicchè essa sarà  supportata dalle terre del gruppo."/>
+ <check_box label="Permetti cessione al gruppo" name="check deed" tool_tip="Un funzionario del gruppo può cedere questa terra al gruppo stesso cosicchè essa sarà  supportata dalle terre del gruppo."/>
<button label="Cedi" name="Deed..." tool_tip="Puoi solo offrire terra se sei un funzionario del gruppo selezionato."/>
- <check_box label="Il proprietario fa un contributo con la cessione" left="119" name="check contrib" tool_tip="Quando la terra è ceduta al gruppo, il proprietario precedente contribuisce con abbastanza allocazione di terra per supportarlo."/>
+ <check_box label="Il proprietario fa un contributo con la cessione" name="check contrib" tool_tip="Quando la terra è ceduta al gruppo, il proprietario precedente contribuisce con abbastanza allocazione di terra per supportarlo."/>
<text name="For Sale:">
In vendita:
</text>
- <text left="119" name="Not for sale.">
+ <text name="Not for sale.">
Non in vendita.
</text>
- <text left="119" name="For Sale: Price L$[PRICE].">
+ <text name="For Sale: Price L$[PRICE].">
Prezzo: [PRICE]L$ ([PRICE_PER_SQM]L$/m²).
</text>
- <text left="119" name="SalePending" width="321"/>
+ <text name="SalePending" width="321"/>
<button bottom="-242" label="Vendi la terra..." label_selected="Vendi la terra..." name="Sell Land..."/>
- <text left="119" name="For sale to">
+ <text name="For sale to">
In vendita a: [BUYER]
</text>
- <text left="119" name="Sell with landowners objects in parcel." width="240">
+ <text name="Sell with landowners objects in parcel.">
Gli oggetti sono inclusi nella vendita.
</text>
- <text left="119" name="Selling with no objects in parcel." width="240">
+ <text name="Selling with no objects in parcel.">
Gli oggetti non sono inclusi nella vendita.
</text>
- <button bottom="-242" font="SansSerifSmall" label="Annulla la vendita del terreno" label_selected="Annulla la vendita del terreno" left="275" name="Cancel Land Sale" width="165"/>
+ <button font="SansSerifSmall" label="Annulla la vendita del terreno" label_selected="Annulla la vendita del terreno" name="Cancel Land Sale"/>
<text name="Claimed:" width="115">
Presa in possesso il:
</text>
- <text left="119" name="DateClaimText">
+ <text name="DateClaimText">
Tue Aug 15 13:47:25 2006
</text>
<text name="PriceLabel">
Area:
</text>
- <text left="119" name="PriceText" width="140">
+ <text name="PriceText" width="140">
4048 m²
</text>
<text name="Traffic:">
Traffico:
</text>
- <text left="119" name="DwellText" width="140">
- 0
+ <text name="DwellText" width="140">
+ Caricamento in corso...
</text>
<button label="Acquista il terreno..." label_selected="Acquista il terreno..." left="130" name="Buy Land..." width="125"/>
+ <button label="Vendita Linden" name="Linden Sale..." tool_tip="La terra deve essere di proprietà, con contenuto impostato, e non già messa all&apos;asta."/>
<button label="Informazioni script" name="Scripts..."/>
<button label="Acquista per il gruppo" name="Buy For Group..."/>
<button label="Compra Pass..." label_selected="Compra Pass..." left="130" name="Buy Pass..." tool_tip="Un pass ti da un accesso temporaneo in questo territorio." width="125"/>
<button label="Abbandona la terra" name="Abandon Land..."/>
<button label="Reclama la terra" name="Reclaim Land..."/>
- <button label="Vendita Linden" name="Linden Sale..." tool_tip="La terra deve essere di proprietà, con contenuto impostato, e non già messa all&apos;asta."/>
</panel>
<panel label="REGOLAMENTO" name="land_covenant_panel">
<panel.string name="can_resell">
@@ -222,19 +218,19 @@ o suddivisa.
Fattore bonus degli oggetti della regione: [BONUS]
</text>
<text name="Simulator primitive usage:">
- Uso delle primitive:
+ Capacità regione:
</text>
<text name="objects_available">
[COUNT] dei [MAX] ([AVAILABLE] dsponibili)
</text>
<text name="Primitives parcel supports:">
- Oggetti che il terreno supporta:
+ Capacità lotto di terreno:
</text>
<text name="object_contrib_text">
[COUNT]
</text>
<text name="Primitives on parcel:">
- Oggetti sul terreno:
+ Impatto lotto di terreno:
</text>
<text name="total_objects_text">
[COUNT]
@@ -317,11 +313,16 @@ Solamente terreni più grandi possono essere abilitati nella ricerca.
<panel.string name="push_restrict_region_text">
Nessuna spinta (Impostazione regionale)
</panel.string>
+ <panel.string name="see_avs_text">
+ Gli avatar in altri lotti possono vedere
+ </panel.string>
<text name="allow_label">
Permetti ad altri residenti di:
</text>
- <check_box label="Modificare il terreno" name="edit land check" tool_tip="Se spuntata, chiunque può terraformare il tuo terreno. È preferibile lasciare questa opzione non spuntata, dato che sarai comunque in grado di modificare il tuo terreno."/>
- <check_box label="Permetti il volo" name="check fly" tool_tip="Se spuntato, gli altri residenti potranno volare sul tuo terreno. Se non spuntato, potranno solamente arrivare in volo o sorvolare il terreno."/>
+ <text name="allow_label0">
+ Vola:
+ </text>
+ <check_box label="Tutti" name="check fly" tool_tip="Se spuntato, gli altri residenti potranno volare sul tuo terreno. Se non spuntato, potranno solamente arrivare in volo o sorvolare il terreno."/>
<text name="allow_label2">
Creare oggetti:
</text>
@@ -337,9 +338,6 @@ Solamente terreni più grandi possono essere abilitati nella ricerca.
</text>
<check_box label="Tutti i residenti" name="check other scripts"/>
<check_box label="Gruppo" name="check group scripts"/>
- <text name="land_options_label">
- Opzioni per il terreno:
- </text>
<check_box label="Sicuro (senza danno)" name="check safe" tool_tip="Se spuntato, imposta il terreno su &apos;sicuro&apos;, disabilitando i danni da combattimento. Se non spuntato, viene abilitato il combattimento con danni."/>
<check_box label="Nessuna spinta" name="PushRestrictCheck" tool_tip="Previeni i colpi. Selezionare questa opzione può essere utile per prevenire comportamenti dannosi sul tuo terreno."/>
<check_box label="Mostra luogo nella ricerca (30 L$/settimana)" name="ShowDirectoryCheck" tool_tip="Consenti che il lotto sia visto nei risultati di ricerca"/>
@@ -356,6 +354,7 @@ Solamente terreni più grandi possono essere abilitati nella ricerca.
<combo_box.item label="Parchi &amp; Natura" name="item9"/>
<combo_box.item label="Residenziale" name="item10"/>
<combo_box.item label="Shopping" name="item11"/>
+ <combo_box.item label="Affitto" name="item13"/>
<combo_box.item label="Altro" name="item12"/>
</combo_box>
<combo_box name="land category">
@@ -370,6 +369,7 @@ Solamente terreni più grandi possono essere abilitati nella ricerca.
<combo_box.item label="Parchi &amp; Natura" name="item9"/>
<combo_box.item label="Residenziale" name="item10"/>
<combo_box.item label="Shopping" name="item11"/>
+ <combo_box.item label="Affitto" name="item13"/>
<combo_box.item label="Altro" name="item12"/>
</combo_box>
<check_box label="Contenuti di tipo Moderato" name="MatureCheck" tool_tip=" "/>
@@ -377,6 +377,10 @@ Solamente terreni più grandi possono essere abilitati nella ricerca.
Fotografia:
</text>
<texture_picker label="" name="snapshot_ctrl" tool_tip="Clicca per scegliere una immagine"/>
+ <text name="allow_label5">
+ Gli avatar su altri lotti possono vedere gli avatar su questo lotto e chattare con loro
+ </text>
+ <check_box label="Vedi avatar" name="SeeAvatarsCheck" tool_tip="Consente ad avatar in altri lotti di vedere e chattare con avatar in questo lotto e viceversa."/>
<text name="landing_point">
Punto di atterraggio: [LANDING]
</text>
@@ -401,7 +405,6 @@ Solamente terreni più grandi possono essere abilitati nella ricerca.
</text>
<line_editor left="97" name="media_url"/>
<button label="Imposta" name="set_media_url"/>
- <check_box label="Nascondi indirizzo URL Media" left="94" name="hide_media_url" tool_tip="Abilitando questa opzione nasconderai l&apos;indirizzo url dei media a tutte le persone non autorizzate a vedere le informazioni del terreno. Nota che questo non è disponibile per contenuto di tipo HTML."/>
<text name="Description:">
Descrizione:
</text>
@@ -433,11 +436,15 @@ Media:
<text name="MusicURL:">
URL musica:
</text>
- <check_box label="Nascondi URL" name="hide_music_url" tool_tip="Questa opzione consente di nascondere l&apos;url della musica a chi non è autorizzato a visionare le informazioni di questo parcel."/>
<text name="Sound:">
Audio:
</text>
<check_box label="Limita l&apos;audio per oggetti e gesture a questo lotto" name="check sound local"/>
+ <text name="Avatar Sounds:">
+ Suoni avatar:
+ </text>
+ <check_box label="Tutti" name="all av sound check"/>
+ <check_box label="Gruppo" name="group av sound check"/>
<text name="Voice settings:">
Voce:
</text>
@@ -450,7 +457,7 @@ Media:
(Definito dalla proprietà)
</panel.string>
<panel.string name="allow_public_access">
- Consenti accesso pubblico ([MATURITY])
+ Consenti accesso pubblico ([MATURITY]) (Nota: se si rimuove la selezione vengono create linee di espulsione)
</panel.string>
<panel.string name="estate_override">
Una o più di queste impostazioni sono già impostate a livello regionale
@@ -458,12 +465,12 @@ Media:
<text name="Limit access to this parcel to:">
Accesso a questo terreno
</text>
- <check_box label="Consenti l&apos;accesso pubblico [MATURITY]" name="public_access"/>
+ <check_box label="Consenti l&apos;accesso pubblico (se si rimuove la selezione vengono create linee di espulsione)" name="public_access"/>
<text name="Only Allow">
- Consenti l&apos;accesso soltanto ai residenti verificati tramite:
+ Consenti l&apos;accesso solo ai Residenti che:
</text>
- <check_box label="Informazioni di pagamento in archivio [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Espelli i residenti non identificati."/>
- <check_box label="Verifica dell&apos;età [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Espelli i residenti che non hanno la loro età verificata. Vedi [SUPPORT_SITE] per maggiori informazioni."/>
+ <check_box label="Hanno informazioni di pagamento in archivio [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Per poter visitare questo lotto i Residenti devono aver fornito informazioni di pagamento a Linden Lab. Vedi [SUPPORT_SITE] per maggiori informazioni."/>
+ <check_box label="Hanno verificato l&apos;età [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Per poter visitare questo lotto i Residenti devono aver verificato la propria età. Vedi [SUPPORT_SITE] per maggiori informazioni."/>
<check_box label="Permetti accesso al gruppo: [GROUP]" name="GroupCheck" tool_tip="Imposta il gruppo nel pannello generale."/>
<check_box label="Vendi pass a:" name="PassCheck" tool_tip="Permetti in questo terreno l&apos;accesso temporaneo"/>
<combo_box name="pass_combo">
diff --git a/indra/newview/skins/default/xui/it/floater_animation_anim_preview.xml b/indra/newview/skins/default/xui/it/floater_animation_anim_preview.xml
new file mode 100644
index 0000000000..a2bce00141
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_animation_anim_preview.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Anim Preview" title="ANIMATION.ANIM">
+ <text name="name_label">
+ Nome:
+ </text>
+ <text name="description_label">
+ Descrizione:
+ </text>
+ <button label="Carica ([AMOUNT] L$)" name="ok_btn"/>
+ <button label="Annulla" label_selected="Annulla" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_animation_bvh_preview.xml b/indra/newview/skins/default/xui/it/floater_animation_bvh_preview.xml
new file mode 100644
index 0000000000..a4319f2e77
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_animation_bvh_preview.xml
@@ -0,0 +1,186 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Animation Preview">
+ <floater.string name="failed_to_initialize">
+ Movimento non inizializzato
+ </floater.string>
+ <floater.string name="anim_too_long">
+ La lunghezza del file di animazione è di [LENGTH] secondi.
+
+La lunghezza massima dell&apos;animazione è [MAX_LENGTH] secondi.
+ </floater.string>
+ <floater.string name="failed_file_read">
+ Impossibile leggere il file di animazione.
+
+[STATUS]
+ </floater.string>
+ <floater.string name="E_ST_OK">
+ Ok
+ </floater.string>
+ <floater.string name="E_ST_EOF">
+ Fine prematura del file.
+ </floater.string>
+ <floater.string name="E_ST_NO_CONSTRAINT">
+ Impossibile leggere la definizione del vincolo.
+ </floater.string>
+ <floater.string name="E_ST_NO_FILE">
+ Impossibile aprire il file BVH.
+ </floater.string>
+ <floater.string name="E_ST_NO_HIER">
+ Intestazione HIERARCHY non valida.
+ </floater.string>
+ <floater.string name="E_ST_NO_JOINT">
+ Impossibile trovare la ROOT o JOINT.
+ </floater.string>
+ <floater.string name="E_ST_NO_NAME">
+ Impossibile trovare il nome JOINT.
+ </floater.string>
+ <floater.string name="E_ST_NO_OFFSET">
+ Impossibile trovare OFFSET.
+ </floater.string>
+ <floater.string name="E_ST_NO_CHANNELS">
+ Impossibile trovare CHANNELS.
+ </floater.string>
+ <floater.string name="E_ST_NO_ROTATION">
+ Impossibile ottenere un ordine di rotazione.
+ </floater.string>
+ <floater.string name="E_ST_NO_AXIS">
+ Rotazione dell&apos;asse non disponibile.
+ </floater.string>
+ <floater.string name="E_ST_NO_MOTION">
+ Impossibile trovare MOTION.
+ </floater.string>
+ <floater.string name="E_ST_NO_FRAMES">
+ Impossibile ottenere il numero dei frame.
+ </floater.string>
+ <floater.string name="E_ST_NO_FRAME_TIME">
+ Impossibile ottenere il tempo del frame.
+ </floater.string>
+ <floater.string name="E_ST_NO_POS">
+ Impossibile ottenere i valori della posizione.
+ </floater.string>
+ <floater.string name="E_ST_NO_ROT">
+ Impossibile ottenere i valori di rotazione.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_FILE">
+ Impossibile aprire il file di traduzione.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_HEADER">
+ Impossibile leggere l&apos;intestazione della traduzione.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_NAME">
+ Impossibile leggere i nomi della traduzione.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_IGNORE">
+ Impossibile leggere la traduzione, ignora il valore.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_RELATIVE">
+ Impossibile leggere la traduzione del valore relativo.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_OUTNAME">
+ Valore non trovato.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MATRIX">
+ Impossibile leggere la matrice di traduzione.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MERGECHILD">
+ Impossibile trovare il nome mergechild.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MERGEPARENT">
+ Impossibile ottenere il nome mergeparent.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_PRIORITY">
+ Impossibile ottenere il valore di priorità.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_LOOP">
+ Impossibile ottenere il valore di ripetizione.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EASEIN">
+ Impossibile ottenere i valori easeIn.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EASEOUT">
+ Cannot get ease Out values.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_HAND">
+ Impossibile ottenere il valore morph della mano.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EMOTE">
+ Impossibile leggere il nome emote.
+ </floater.string>
+ <floater.string name="E_ST_BAD_ROOT">
+ Nome non corretto del root joint, usa &quot;hip&quot;.
+ </floater.string>
+ <text name="name_label">
+ Nome:
+ </text>
+ <text name="description_label">
+ Descrizione:
+ </text>
+ <spinner label="Priorità" name="priority" tool_tip="Definisce quali altre animazioni possono essere sostituite da questa animazione"/>
+ <check_box label="Ripetizione" name="loop_check" tool_tip="Riproduce questa animazione in ripetizione"/>
+ <spinner label="Dentro(%)" name="loop_in_point" tool_tip="Imposta il punto sul quale ritorna l&apos;animazione"/>
+ <spinner label="Fuori(%)" name="loop_out_point" tool_tip="Imposta il punto sul quale termina l&apos;animazione"/>
+ <text name="hand_label">
+ Posa delle mani
+ </text>
+ <combo_box name="hand_pose_combo" tool_tip="Definisce ciò che fanno le mani durante l&apos;animazione">
+ <combo_box.item label="Estese" name="Spread"/>
+ <combo_box.item label="Rilassate" name="Relaxed"/>
+ <combo_box.item label="Indicano entrambe" name="PointBoth"/>
+ <combo_box.item label="Pugno" name="Fist"/>
+ <combo_box.item label="Sinistra rilassata" name="RelaxedLeft"/>
+ <combo_box.item label="Indica sinistra" name="PointLeft"/>
+ <combo_box.item label="Pugno con la sinistra" name="FistLeft"/>
+ <combo_box.item label="Destra rilassata" name="RelaxedRight"/>
+ <combo_box.item label="Indica destra" name="PointRight"/>
+ <combo_box.item label="Pugno destro" name="FistRight"/>
+ <combo_box.item label="Saluta a destra" name="SaluteRight"/>
+ <combo_box.item label="Battitura" name="Typing"/>
+ <combo_box.item label="Pace a destra" name="PeaceRight"/>
+ </combo_box>
+ <text name="emote_label">
+ Espressione
+ </text>
+ <combo_box name="emote_combo" tool_tip="Definisce ciò che fa il viso durante l&apos;animazione">
+ <item label="(Nulla)" name="[None]" value=""/>
+ <item label="Aaaaah" name="Aaaaah" value="Aaaaah"/>
+ <item label="Spavento" name="Afraid" value="Spavento"/>
+ <item label="Arrabbiato" name="Angry" value="Arrabbiato"/>
+ <item label="Grande sorriso" name="BigSmile" value="Grande sorriso"/>
+ <item label="Annoiato" name="Bored" value="Annoiato"/>
+ <item label="Pianto" name="Cry" value="Pianto"/>
+ <item label="Disdegno" name="Disdain" value="Disdegno"/>
+ <item label="Imbarazzato" name="Embarrassed" value="Imbarazzato"/>
+ <item label="Accigliato" name="Frown" value="Accigliato"/>
+ <item label="Bacio" name="Kiss" value="Bacio"/>
+ <item label="Risata" name="Laugh" value="Risata"/>
+ <item label="Linguaccia" name="Plllppt" value="Linguaccia"/>
+ <item label="Repulsione" name="Repulsed" value="Repulsione"/>
+ <item label="Triste" name="Sad" value="Triste"/>
+ <item label="Scrollata di spalle" name="Shrug" value="Scrollata di spalle"/>
+ <item label="Sorriso" name="Smile" value="Sorriso"/>
+ <item label="Stupore" name="Surprise" value="Stupore"/>
+ <item label="Occhiolino" name="Wink" value="Occhiolino"/>
+ <item label="Preoccupato" name="Worry" value="Preoccupato"/>
+ </combo_box>
+ <text name="preview_label">
+ Anteprima mentre
+ </text>
+ <combo_box name="preview_base_anim" tool_tip="Prova il comportamento dell&apos;animazione mentre l&apos;avatar esegue attività comuni.">
+ <item label="In piedi" name="Standing" value="In piedi"/>
+ <item label="Camminare" name="Walking" value="Camminare"/>
+ <item label="Seduto" name="Sitting" value="Seduto"/>
+ <item label="Volare" name="Flying" value="Volare"/>
+ </combo_box>
+ <spinner label="Transizione in ingresso (sec)" name="ease_in_time" tool_tip="Durata (in secondi) della fusione in entrata delle animazioni"/>
+ <spinner label="Transizione in uscita (sec)" name="ease_out_time" tool_tip="Durata (in secondi) della fusione in uscita delle animazioni"/>
+ <button name="play_btn" tool_tip="Riproduci la tua animazione"/>
+ <button name="pause_btn" tool_tip="Metti in pausa la tua animazione"/>
+ <button name="stop_btn" tool_tip="Interrompi la riproduzione dell&apos;animazione"/>
+ <text name="bad_animation_text">
+ Impossibile leggere il file di animazione.
+
+Consigliamo file BVH esportati da Poser 4.
+ </text>
+ <button label="Carica ([AMOUNT] L$)" name="ok_btn"/>
+ <button label="Annulla" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_animation_preview.xml b/indra/newview/skins/default/xui/it/floater_animation_preview.xml
index 77341cad63..dc99d287b9 100644
--- a/indra/newview/skins/default/xui/it/floater_animation_preview.xml
+++ b/indra/newview/skins/default/xui/it/floater_animation_preview.xml
@@ -115,14 +115,14 @@ La lunghezza massima è [MAX_LENGTH] secondi.
<text name="description_label">
Descrizione:
</text>
- <spinner label="Priorità" label_width="72" name="priority" tool_tip="Definisce quali altre animazioni possono essere sostituite da questa animazione" width="110"/>
+ <spinner label="Priorità" name="priority" tool_tip="Definisce quali altre animazioni possono essere sostituite da questa animazione"/>
<check_box label="Ciclica" name="loop_check" tool_tip="Riproduce questa animazione in ripetizione"/>
<spinner label="In(%)" name="loop_in_point" tool_tip="Imposta il punto sul quale ritorna l&apos;animazione"/>
<spinner label="Out(%)" name="loop_out_point" tool_tip="Imposta il punto sul quale termina l&apos;animazione"/>
<text name="hand_label">
Postura della mano
</text>
- <combo_box left_delta="100" name="hand_pose_combo" tool_tip="Definisce ciò che fanno le mani durante l&apos;animazione" width="184">
+ <combo_box name="hand_pose_combo" tool_tip="Definisce ciò che fanno le mani durante l&apos;animazione">
<combo_box.item label="Stendi" name="Spread"/>
<combo_box.item label="Rilassato" name="Relaxed"/>
<combo_box.item label="Indica entrambi" name="PointBoth"/>
@@ -140,7 +140,7 @@ La lunghezza massima è [MAX_LENGTH] secondi.
<text name="emote_label">
Espressione
</text>
- <combo_box left_delta="100" name="emote_combo" tool_tip="Definisce ciò che fa il viso durante l&apos;animazione" width="184">
+ <combo_box name="emote_combo" tool_tip="Definisce ciò che fa il viso durante l&apos;animazione">
<item label="(Nessuno)" name="[None]" value=""/>
<item label="Aaaaah" name="Aaaaah" value="Aaaaah"/>
<item label="Spavento" name="Afraid" value="Spavento"/>
@@ -162,18 +162,18 @@ La lunghezza massima è [MAX_LENGTH] secondi.
<item label="Occhiolino" name="Wink" value="Occhiolino"/>
<item label="Preoccupato" name="Worry" value="Preoccupato"/>
</combo_box>
- <text name="preview_label" width="250">
+ <text name="preview_label">
Vedi anteprima mentre
</text>
- <combo_box left_delta="154" name="preview_base_anim" tool_tip="Da usarsi per controllare il comportamento dell&apos;animazione mentre l&apos;avatar svolge azioni abituali." width="130">
+ <combo_box name="preview_base_anim" tool_tip="Da usarsi per controllare il comportamento dell&apos;animazione mentre l&apos;avatar svolge azioni abituali.">
<item label="In piedi" name="Standing" value="In piedi"/>
<item label="Camminando" name="Walking" value="Cammina"/>
<item label="Seduto" name="Sitting" value="Seduto"/>
<item label="Volo" name="Flying" value="Volo"/>
</combo_box>
- <spinner label="Avvio lento (sec)" label_width="125" name="ease_in_time" tool_tip="Durata (in secondi) della fusione in entrata delle animazioni" width="192"/>
- <spinner bottom_delta="-20" label="Arresto lento (sec)" label_width="125" left="10" name="ease_out_time" tool_tip="Durata (in secondi) della fusione in uscita delle animazioni" width="192"/>
- <button bottom_delta="-32" name="play_btn" tool_tip="Riproduci la tua animazione"/>
+ <spinner label="Avvio lento (sec)" name="ease_in_time" tool_tip="Durata (in secondi) della fusione in entrata delle animazioni"/>
+ <spinner label="Arresto lento (sec)" name="ease_out_time" tool_tip="Durata (in secondi) della fusione in uscita delle animazioni"/>
+ <button name="play_btn" tool_tip="Riproduci la tua animazione"/>
<button name="pause_btn" tool_tip="Metti in pausa la tua animazione"/>
<button label="" name="stop_btn" tool_tip="Ferma la riproduzione dell&apos;animazione"/>
<text name="bad_animation_text">
diff --git a/indra/newview/skins/default/xui/it/floater_avatar.xml b/indra/newview/skins/default/xui/it/floater_avatar.xml
new file mode 100644
index 0000000000..d7445cfb2b
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_avatar.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Avatar" title="SELEZIONA UN AVATAR"/>
diff --git a/indra/newview/skins/default/xui/it/floater_avatar_picker.xml b/indra/newview/skins/default/xui/it/floater_avatar_picker.xml
index 7c037801e9..5a542d6a27 100644
--- a/indra/newview/skins/default/xui/it/floater_avatar_picker.xml
+++ b/indra/newview/skins/default/xui/it/floater_avatar_picker.xml
@@ -24,6 +24,10 @@
Comincia a digitare il nome della persona:
</text>
<button label="Vai" label_selected="Vai" name="Find"/>
+ <scroll_list name="SearchResults">
+ <columns label="Nome" name="name"/>
+ <columns label="Nome utente" name="username"/>
+ </scroll_list>
</panel>
<panel label="Amici" name="FriendsPanel">
<text name="InstructSelectFriend">
@@ -39,7 +43,10 @@
Metri
</text>
<button font="SansSerifSmall" label="Aggiorna la lista" label_selected="Aggiorna l&apos;elenco" left_delta="6" name="Refresh" width="110"/>
- <scroll_list bottom_delta="-169" height="159" name="NearMe"/>
+ <scroll_list bottom_delta="-169" height="159" name="NearMe">
+ <columns label="Nome" name="name"/>
+ <columns label="Nome utente" name="username"/>
+ </scroll_list>
</panel>
</tab_container>
<button label="OK" label_selected="OK" name="ok_btn"/>
diff --git a/indra/newview/skins/default/xui/it/floater_beacons.xml b/indra/newview/skins/default/xui/it/floater_beacons.xml
index ca6711468d..b7ab265cc2 100644
--- a/indra/newview/skins/default/xui/it/floater_beacons.xml
+++ b/indra/newview/skins/default/xui/it/floater_beacons.xml
@@ -17,5 +17,6 @@
<check_box label="Tocca solo" name="touch_only"/>
<check_box label="Fonti sonore" name="sounds"/>
<check_box label="Fonti delle particelle" name="particles"/>
+ <check_box label="Fonti multimedia" name="moapbeacon"/>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_build_options.xml b/indra/newview/skins/default/xui/it/floater_build_options.xml
index 326aab1a31..080e396642 100644
--- a/indra/newview/skins/default/xui/it/floater_build_options.xml
+++ b/indra/newview/skins/default/xui/it/floater_build_options.xml
@@ -1,7 +1,30 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="build options floater" title="OPZIONI DELLA GRIGLIA">
- <spinner label="Unità griglia (metri)" label_width="192" name="GridResolution" width="250"/>
- <spinner label="Estensione della griglia (metri)" label_width="192" name="GridDrawSize" width="250"/>
+ <floater.string name="grid_screen_text">
+ Schermo
+ </floater.string>
+ <floater.string name="grid_local_text">
+ Locale
+ </floater.string>
+ <floater.string name="grid_world_text">
+ Mondo
+ </floater.string>
+ <floater.string name="grid_reference_text">
+ Riferimento
+ </floater.string>
+ <floater.string name="grid_attachment_text">
+ Allegato
+ </floater.string>
+ <text name="grid_mode_label" tool_tip="Opacità della griglia">
+ Modalità
+ </text>
+ <combo_box name="combobox grid mode" tool_tip="Scegli il tipo di righello per posizionare l&apos;oggetto">
+ <combo_box.item label="Griglia del mondo" name="World"/>
+ <combo_box.item label="Griglia locale" name="Local"/>
+ <combo_box.item label="Griglia di riferimento" name="Reference"/>
+ </combo_box>
+ <spinner label="Unità (metri)" label_width="192" name="GridResolution" width="250"/>
+ <spinner label="Ampiezza (metri)" label_width="192" name="GridDrawSize" width="250"/>
<check_box label="Usa sottounità" name="GridSubUnit"/>
<check_box label="Guarda le sezioni trasversali" name="GridCrossSection"/>
<text name="grid_opacity_label" tool_tip="Opacità della griglia">
diff --git a/indra/newview/skins/default/xui/it/floater_bumps.xml b/indra/newview/skins/default/xui/it/floater_bumps.xml
index 6de2fea67f..ae66148659 100644
--- a/indra/newview/skins/default/xui/it/floater_bumps.xml
+++ b/indra/newview/skins/default/xui/it/floater_bumps.xml
@@ -7,7 +7,7 @@
[TIME] [NAME] ti ha urtato
</floater.string>
<floater.string name="llpushobject">
- [TIME] [NAME] ti ha spinto per mezzo di uno script
+ [TIME] [NAME] ti ha spinto con uno script
</floater.string>
<floater.string name="selected_object_collide">
[TIME] [NAME] ti ha colpito con un oggetto
diff --git a/indra/newview/skins/default/xui/it/floater_buy_contents.xml b/indra/newview/skins/default/xui/it/floater_buy_contents.xml
index a54751e629..84ed85e362 100644
--- a/indra/newview/skins/default/xui/it/floater_buy_contents.xml
+++ b/indra/newview/skins/default/xui/it/floater_buy_contents.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_buy_contents" title="COMPRA I CONTENUTI">
<text name="contains_text">
- [NAME] contiene:
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; contiene:
</text>
<text name="buy_text">
Compra per [AMOUNT]L$ da [NAME]?
diff --git a/indra/newview/skins/default/xui/it/floater_buy_currency.xml b/indra/newview/skins/default/xui/it/floater_buy_currency.xml
index 0a499a6c44..743969f557 100644
--- a/indra/newview/skins/default/xui/it/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/it/floater_buy_currency.xml
@@ -46,13 +46,14 @@
[AMT]L$
</text>
<text name="currency_links">
- [http://www.secondlife.com/my/account/payment_method_management.php payment method] | [http://www.secondlife.com/my/account/currency.php currency] | [http://www.secondlife.com/my/account/exchange_rates.php exchange rate]
+ [http://www.secondlife.com/my/account/payment_method_management.php metodo di pagamento] | [http://www.secondlife.com/my/account/currency.php valuta]
</text>
<text name="exchange_rate_note">
Riscrivi l&apos;importo per vedere l&apos;ultimo tasso al cambio.
</text>
<text name="purchase_warning_repurchase">
- La conferma di questo acquisto compra solo L$, non l&apos;oggetto.
+ La conferma di questo acquisto compra solo L$, non
+l&apos;oggetto.
</text>
<text bottom_delta="16" name="purchase_warning_notenough">
Non stai acquistando abbastanza L$. Aumenta l&apos;importo.
diff --git a/indra/newview/skins/default/xui/it/floater_buy_land.xml b/indra/newview/skins/default/xui/it/floater_buy_land.xml
index f3b30f7048..3940c43a3d 100644
--- a/indra/newview/skins/default/xui/it/floater_buy_land.xml
+++ b/indra/newview/skins/default/xui/it/floater_buy_land.xml
@@ -142,10 +142,10 @@ consente [AMOUNT2] oggetti
<text name="estate_name_text">
(sconosciuto)
</text>
- <text name="estate_owner_label" right="575" width="120">
+ <text name="estate_owner_label">
Proprietario della regione:
</text>
- <text left="580" name="estate_owner_text" width="155">
+ <text name="estate_owner_text">
(sconosciuto)
</text>
<text name="resellable_changeable_label">
diff --git a/indra/newview/skins/default/xui/it/floater_buy_object.xml b/indra/newview/skins/default/xui/it/floater_buy_object.xml
index 895d8aa746..e7cbd68b38 100644
--- a/indra/newview/skins/default/xui/it/floater_buy_object.xml
+++ b/indra/newview/skins/default/xui/it/floater_buy_object.xml
@@ -1,26 +1,29 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="contents" title="ACQUISTA COPIA DELL&apos;OGGETTO">
+ <floater.string name="title_buy_text">
+ Compra
+ </floater.string>
+ <floater.string name="title_buy_copy_text">
+ Compra un copia di
+ </floater.string>
+ <floater.string name="no_copy_text">
+ (non copiabile)
+ </floater.string>
+ <floater.string name="no_modify_text">
+ (non modificabile)
+ </floater.string>
+ <floater.string name="no_transfer_text">
+ (non trasferibile)
+ </floater.string>
<text name="contents_text">
Contiene:
</text>
<text name="buy_text">
- Compra per [AMOUNT]L$ da [NAME]?
+ Acquista per L$[AMOUNT] da:
+ </text>
+ <text name="buy_name_text">
+ [NAME]?
</text>
- <button label="Annulla" label_selected="Annulla" name="cancel_btn"/>
<button label="Compra" label_selected="Compra" name="buy_btn"/>
- <string name="title_buy_text">
- Compra
- </string>
- <string name="title_buy_copy_text">
- Compra un copia di
- </string>
- <string name="no_copy_text">
- (non copiabile)
- </string>
- <string name="no_modify_text">
- (non modificabile)
- </string>
- <string name="no_transfer_text">
- (non trasferibile)
- </string>
+ <button label="Annulla" label_selected="Annulla" name="cancel_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_camera.xml b/indra/newview/skins/default/xui/it/floater_camera.xml
index 3fdf4f48a2..be03857bc9 100644
--- a/indra/newview/skins/default/xui/it/floater_camera.xml
+++ b/indra/newview/skins/default/xui/it/floater_camera.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="camera_floater" title="">
+<floater name="camera_floater" title="CONTROLLI FOTOCAMERA">
<floater.string name="rotate_tooltip">
Ruota la telecamera Intorno all&apos;Inquadratura
</floater.string>
@@ -9,15 +9,6 @@
<floater.string name="move_tooltip">
Muovi la telecamera su e giù e a sinistra e destra
</floater.string>
- <floater.string name="camera_modes_title">
- Modalità della fotocamera
- </floater.string>
- <floater.string name="pan_mode_title">
- Ruota visuale - Ingrandisci - Panoramica
- </floater.string>
- <floater.string name="presets_mode_title">
- Visuali predefinite
- </floater.string>
<floater.string name="free_mode_title">
Vedi oggetto
</floater.string>
diff --git a/indra/newview/skins/default/xui/it/floater_chat_bar.xml b/indra/newview/skins/default/xui/it/floater_chat_bar.xml
new file mode 100644
index 0000000000..94c85b50c8
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_chat_bar.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="chat_bar" title="CHAT NEI DINTORNI">
+ <panel name="bottom_panel">
+ <line_editor label="Clicca qui per la chat." name="chat_box" tool_tip="Premi Invio per parlare, Ctrl+Invio per gridare"/>
+ <button name="show_nearby_chat" tool_tip="Mostra/Nasconde il registro della chat nei dintorni"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/it/floater_day_cycle_options.xml
deleted file mode 100644
index 98c385d29f..0000000000
--- a/indra/newview/skins/default/xui/it/floater_day_cycle_options.xml
+++ /dev/null
@@ -1,94 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Day Cycle Floater" title="EDITOR DELLE CICLO GIORNO/NOTTE">
- <tab_container name="Day Cycle Tabs">
- <panel label="Ciclo giorno/notte" name="Day Cycle">
- <button label="?" name="WLDayCycleHelp"/>
- <text name="WL12am">
- 0:00
- </text>
- <text name="WL3am">
- 3:00
- </text>
- <text name="WL6am">
- 6:00
- </text>
- <text name="WL9amHash">
- 9:00
- </text>
- <text name="WL12pmHash">
- 12:00
- </text>
- <text name="WL3pm">
- 15:00
- </text>
- <text name="WL6pm">
- 18:00
- </text>
- <text name="WL9pm">
- 21:00
- </text>
- <text name="WL12am2">
- 24:00
- </text>
- <text name="WL12amHash">
- |
- </text>
- <text name="WL3amHash">
- I
- </text>
- <text name="WL6amHash">
- |
- </text>
- <text name="WL9amHash2">
- I
- </text>
- <text name="WL12pmHash2">
- |
- </text>
- <text name="WL3pmHash">
- I
- </text>
- <text name="WL6pmHash">
- |
- </text>
- <text name="WL9pmHash">
- I
- </text>
- <text name="WL12amHash2">
- |
- </text>
- <button label="Aggiungi voce" label_selected="Aggiungi voce" name="WLAddKey"/>
- <button label_selected="Cancella voce" name="WLDeleteKey"/>
- <text name="WLCurKeyFrameText">
- Impostazioni del fotogramma chiave:
- </text>
- <text name="WLCurKeyTimeText">
- Tempo:
- </text>
- <spinner label="Ora" name="WLCurKeyHour"/>
- <spinner label="Min" name="WLCurKeyMin"/>
- <text name="WLCurKeyTimeText2">
- Impostazione chiave:
- </text>
- <combo_box label="Programma:" name="WLKeyPresets"/>
- <text name="DayCycleText">
- Raggruppa:
- </text>
- <combo_box label="5 min" name="WLSnapOptions"/>
- <text name="DayCycleText2">
- Lunghezza del ciclo:
- </text>
- <spinner label="Ore" name="WLLengthOfDayHour"/>
- <spinner label="Min" name="WLLengthOfDayMin"/>
- <spinner label="Sec" name="WLLengthOfDaySec"/>
- <text name="DayCycleText3">
- Anteprima:
- </text>
- <button label="Avvia" label_selected="Avvia" name="WLAnimSky"/>
- <button label="Arresta!" label_selected="Arresta" name="WLStopAnimSky"/>
- <button label="Usa l&apos;ora della proprietà" label_selected="Vai all&apos;ora della proprietà" name="WLUseLindenTime"/>
- <button label="Salva il test del giorno" label_selected="Salva il test del giorno" name="WLSaveDayCycle"/>
- <button label="Carica il test del giorno" label_selected="Carica il test del giorno" name="WLLoadDayCycle"/>
- </panel>
- </tab_container>
-</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_delete_env_preset.xml b/indra/newview/skins/default/xui/it/floater_delete_env_preset.xml
new file mode 100644
index 0000000000..71071825af
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_delete_env_preset.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<floater name="Delete Env Preset" title="CANCELLA PREDEFINITO AMB">
+ <string name="title_water">
+ Cancella valore predefinito acqua
+ </string>
+ <string name="title_sky">
+ Cancella valore predefinito cielo
+ </string>
+ <string name="title_day_cycle">
+ Cancella ciclo giornata
+ </string>
+ <string name="label_water">
+ Valori predefiniti:
+ </string>
+ <string name="label_sky">
+ Valori predefiniti:
+ </string>
+ <string name="label_day_cycle">
+ Ciclo giornata:
+ </string>
+ <string name="msg_confirm_deletion">
+ Sei sicuro di volere eliminare il valore predefinito selezionato?
+ </string>
+ <string name="msg_sky_is_referenced">
+ Impossibile rimuovere un valore predefinito che viene utilizzato in uno o più cicli di giornata.
+ </string>
+ <string name="combo_label">
+ -Seleziona un valore predefinito-
+ </string>
+ <text name="label">
+ Valori predefiniti:
+ </text>
+ <button label="Elimina" name="delete"/>
+ <button label="Annulla" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_destinations.xml b/indra/newview/skins/default/xui/it/floater_destinations.xml
new file mode 100644
index 0000000000..242403e431
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_destinations.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Destinations" title="DESTINAZIONI"/>
diff --git a/indra/newview/skins/default/xui/it/floater_display_name.xml b/indra/newview/skins/default/xui/it/floater_display_name.xml
new file mode 100644
index 0000000000..3e0c43e741
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_display_name.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Display Name" title="CAMBIA NOME VISUALIZZATO">
+ <text name="info_text">
+ Il nome che assegni al tuo avatar è il Nome visualizzato. Puoi cambiarlo una volta alla settimana.
+ </text>
+ <text name="lockout_text">
+ Non puoi cambiare il Nome visualizzato fino a: [TIME].
+ </text>
+ <text name="set_name_label">
+ Nuovo Nome visualizzato:
+ </text>
+ <text name="name_confirm_label">
+ Digita nuovamente il nuovo nome per confermare:
+ </text>
+ <button label="Salva" name="save_btn" tool_tip="Salva il tuo nuovo Nome visualizzato"/>
+ <button label="Reimposta" name="reset_btn" tool_tip="Fai corrispondere Nome visualizzato e Nome utente"/>
+ <button label="Annulla" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_edit_day_cycle.xml b/indra/newview/skins/default/xui/it/floater_edit_day_cycle.xml
new file mode 100644
index 0000000000..c922b2e4f7
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_edit_day_cycle.xml
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Edit Day cycle" title="Modifica ciclo giornata">
+ <string name="title_new">
+ Crea un nuovo ciclo giornata
+ </string>
+ <string name="title_edit">
+ Modifica ciclo giornata
+ </string>
+ <string name="hint_new">
+ Dai un nome al ciclo della giornata, modifica i controlli per crearlo e fai clic su &quot;Salva&quot;.
+ </string>
+ <string name="hint_edit">
+ Per modificare il ciclo della giornata, modifica i controlli seguenti e fai clic su &quot;Salva&quot;.
+ </string>
+ <string name="combo_label">
+ -Seleziona un valore predefinito-
+ </string>
+ <text name="label">
+ Nome predefinito:
+ </text>
+ <text name="note">
+ Nota: se cambi il nome del valore predefinito, in realtà ne crei uno nuovo e quello esistente non viene cambiato.
+ </text>
+ <text name="hint_item1">
+ - Fai clic su una scheda per modificare gli orari e le impostazioni cielo specifiche.
+ </text>
+ <text name="hint_item2">
+ - Fai clic e trascina le schede per impostare i tempi di transizione.
+ </text>
+ <text name="hint_item3">
+ - Usa lo scrubber per visualizzare in anteprima il ciclo giornata.
+ </text>
+ <panel name="day_cycle_slider_panel">
+ <multi_slider initial_value="0" name="WLTimeSlider"/>
+ <multi_slider initial_value="0" name="WLDayCycleKeys"/>
+ <button label="Aggiungi chiave" label_selected="Aggiungi chiave" name="WLAddKey"/>
+ <button label="Tasto cancella" label_selected="Tasto cancella" name="WLDeleteKey"/>
+ <text name="WL12am">
+ 00:00
+ </text>
+ <text name="WL3am">
+ 03:00:00
+ </text>
+ <text name="WL6am">
+ 06:00:00
+ </text>
+ <text name="WL9amHash">
+ 09:00:00
+ </text>
+ <text name="WL12pmHash">
+ 12:00:00
+ </text>
+ <text name="WL3pm">
+ 15:00:00
+ </text>
+ <text name="WL6pm">
+ 18:00:00
+ </text>
+ <text name="WL9pm">
+ 21:00:00
+ </text>
+ <text name="WL12am2">
+ 00:00
+ </text>
+ <text name="WL12amHash">
+ |
+ </text>
+ <text name="WL3amHash">
+ I
+ </text>
+ <text name="WL6amHash">
+ |
+ </text>
+ <text name="WL9amHash2">
+ I
+ </text>
+ <text name="WL12pmHash2">
+ |
+ </text>
+ <text name="WL3pmHash">
+ I
+ </text>
+ <text name="WL6pmHash">
+ |
+ </text>
+ <text name="WL9pmHash">
+ I
+ </text>
+ <text name="WL12amHash2">
+ |
+ </text>
+ </panel>
+ <text name="WLCurKeyPresetText">
+ Impostazioni cielo:
+ </text>
+ <combo_box label="Valori predefiniti" name="WLSkyPresets"/>
+ <text name="WLCurKeyTimeText">
+ Giorno/ora:
+ </text>
+ <time name="time" value="06:00:00"/>
+ <check_box label="Usa come nuovo ciclo giornata" name="make_default_cb"/>
+ <button label="Salva" name="save"/>
+ <button label="Annulla" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_edit_sky_preset.xml b/indra/newview/skins/default/xui/it/floater_edit_sky_preset.xml
new file mode 100644
index 0000000000..571027fd29
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_edit_sky_preset.xml
@@ -0,0 +1,143 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Edit Sky Preset" title="Modifica predefiniti cielo">
+ <string name="title_new">
+ Crea un nuovo valore predefinito per il cielo
+ </string>
+ <string name="title_edit">
+ Modifica predefiniti cielo
+ </string>
+ <string name="hint_new">
+ Dai un nome al valore predefinito, modifica i controlli per crearlo e fai clic su &quot;Salva&quot;.
+ </string>
+ <string name="hint_edit">
+ Per modificare il valore predefinito per il cielo, modifica i controlli e fai clic su &quot;Salva&quot;.
+ </string>
+ <string name="combo_label">
+ -Seleziona un valore predefinito-
+ </string>
+ <text name="hint">
+ Per modificare i valori predefiniti, modifica i controlli e quindi fai clic su &quot;Salva&quot;
+ </text>
+ <text name="label">
+ Nome predefinito:
+ </text>
+ <text name="note">
+ Nota: se cambi il nome del valore predefinito, in realtà ne crei uno nuovo e quello esistente non viene cambiato.
+ </text>
+ <tab_container name="WindLight Tabs">
+ <panel label="ATMOSFERA" name="Atmosphere">
+ <text name="BHText">
+ Orizzonte blu
+ </text>
+ <text name="BDensText">
+ Orizzonte foschia
+ </text>
+ <text name="BDensText2">
+ Densità blu
+ </text>
+ <text name="HDText">
+ Densità foschia
+ </text>
+ <text name="DensMultText">
+ Fattore moltiplicativo densità
+ </text>
+ <text name="WLDistanceMultText">
+ Fattore moltiplicativo distanza
+ </text>
+ <text name="MaxAltText">
+ Altitudine massima
+ </text>
+ </panel>
+ <panel label="ILLUMINAZIONE" name="Lighting">
+ <text name="SLCText">
+ Colore sole/luna
+ </text>
+ <text name="WLAmbientText">
+ Ambiente
+ </text>
+ <text name="SunGlowText">
+ Bagliore sole
+ </text>
+ <slider label="Centro focale" name="WLGlowB"/>
+ <slider label="Dimensioni" name="WLGlowR"/>
+ <text name="WLStarText">
+ Luminosità cielo
+ </text>
+ <text name="SceneGammaText">
+ Gamma scena
+ </text>
+ <text name="TODText">
+ Posizione sole/luna
+ </text>
+ <multi_slider initial_value="0" name="WLSunPos"/>
+ <text name="WL12amHash">
+ |
+ </text>
+ <text name="WL6amHash">
+ |
+ </text>
+ <text name="WL12pmHash2">
+ |
+ </text>
+ <text name="WL6pmHash">
+ |
+ </text>
+ <text name="WL12amHash2">
+ |
+ </text>
+ <text name="WL12am">
+ 00:00
+ </text>
+ <text name="WL6am">
+ 06:00:00
+ </text>
+ <text name="WL12pmHash">
+ 12:00:00
+ </text>
+ <text name="WL6pm">
+ 18:00:00
+ </text>
+ <text name="WL12am2">
+ 00:00
+ </text>
+ <time name="WLDayTime" value="06:00:00"/>
+ <text name="WLEastAngleText">
+ Angolo est
+ </text>
+ </panel>
+ <panel label="NUVOLE" name="Clouds">
+ <text name="WLCloudColorText">
+ Colore nuvole
+ </text>
+ <text name="WLCloudColorText2">
+ XY/Densità nuvole
+ </text>
+ <slider label="X" name="WLCloudX"/>
+ <slider label="Y" name="WLCloudY"/>
+ <slider label="D" name="WLCloudDensity"/>
+ <text name="WLCloudCoverageText">
+ Copertura nuvole
+ </text>
+ <text name="WLCloudScaleText">
+ Scala nuvole
+ </text>
+ <text name="WLCloudDetailText">
+ Dettaglio nuvole (XY/Densità)
+ </text>
+ <slider label="X" name="WLCloudDetailX"/>
+ <slider label="Y" name="WLCloudDetailY"/>
+ <slider label="D" name="WLCloudDetailDensity"/>
+ <text name="WLCloudScrollXText">
+ Scorrimento nuvole X
+ </text>
+ <check_box label="Blocca" name="WLCloudLockX"/>
+ <text name="WLCloudScrollYText">
+ Scorrimento nuvole Y
+ </text>
+ <check_box label="Blocca" name="WLCloudLockY"/>
+ </panel>
+ </tab_container>
+ <check_box label="Usa questo valore predefinito come nuova impostazione per il cielo" name="make_default_cb"/>
+ <button label="Salva" name="save"/>
+ <button label="Annulla" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_edit_water_preset.xml b/indra/newview/skins/default/xui/it/floater_edit_water_preset.xml
new file mode 100644
index 0000000000..7bffc60ba2
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_edit_water_preset.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Edit Water Preset" title="Modifica un valore predefinito acqua">
+ <string name="title_new">
+ Crea un nuovo valore predefinito per l&apos;acqua
+ </string>
+ <string name="title_edit">
+ Modifica un valore predefinito per l&apos;acqua
+ </string>
+ <string name="hint_new">
+ Dai un nome al valore predefinito, modifica i controlli per crearlo e fai clic su &quot;Salva&quot;.
+ </string>
+ <string name="hint_edit">
+ Per modificare il valore predefinito per l&apos;acqua, modifica i controlli e fai clic su &quot;Salva&quot;.
+ </string>
+ <string name="combo_label">
+ -Seleziona un valore predefinito-
+ </string>
+ <text name="hint">
+ Per modificare i valori predefiniti, modifica i controlli e quindi fai clic su &quot;Salva&quot;
+ </text>
+ <text name="label">
+ Nome predefinito:
+ </text>
+ <text name="note">
+ Nota: se cambi il nome del valore predefinito, in realtà ne crei uno nuovo e quello esistente non viene cambiato.
+ </text>
+ <panel name="panel_water_preset">
+ <text name="water_color_label">
+ Colore nebbia acqua
+ </text>
+ <text name="water_fog_density_label">
+ Esponente densità nebbia
+ </text>
+ <text name="underwater_fog_modifier_label">
+ Modificatore nebbia sott&apos;acqua
+ </text>
+ <text name="BHText">
+ Direzione onda grande
+ </text>
+ <slider label="X" name="WaterWave1DirX"/>
+ <slider label="Y" name="WaterWave1DirY"/>
+ <text name="BDensText">
+ Scala wavelet riflesso
+ </text>
+ <text name="HDText">
+ Scala Fresnel
+ </text>
+ <text name="FresnelOffsetText">
+ Spostamento Fresnel
+ </text>
+ <text name="BHText2">
+ Direzione onda piccola
+ </text>
+ <slider label="X" name="WaterWave2DirX"/>
+ <slider label="Y" name="WaterWave2DirY"/>
+ <text name="DensMultText">
+ Scala wavelet sopra
+ </text>
+ <text name="WaterScaleBelowText">
+ Scala wavelet sotto
+ </text>
+ <text name="MaxAltText">
+ Fattore moltiplicativo blu
+ </text>
+ <text name="BHText3">
+ Mappa normale
+ </text>
+ </panel>
+ <check_box label="Usa questo valore predefinito come nuova impostazione per l&apos;acqua" name="make_default_cb"/>
+ <button label="Salva" name="save"/>
+ <button label="Annulla" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_env_settings.xml b/indra/newview/skins/default/xui/it/floater_env_settings.xml
deleted file mode 100644
index 1c17c18e84..0000000000
--- a/indra/newview/skins/default/xui/it/floater_env_settings.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Environment Editor Floater" title="EDITOR DELL&apos;AMBIENTE">
- <floater.string name="timeStr">
- [hour12,datetime,utc]:[min,datetime,utc] [ampm,datetime,utc]
- </floater.string>
- <text name="EnvTimeText">
- Ora del
-giorno
- </text>
- <text name="EnvTimeText2">
- 12:00 PM
- </text>
- <text name="EnvCloudText">
- Intensità delle
-Nuvole
- </text>
- <text name="EnvWaterColorText">
- Colore
-dell&apos;Acqua
- </text>
- <color_swatch label="" name="EnvWaterColor" tool_tip="Clicca per aprire il selettore dei colori"/>
- <text name="EnvWaterFogText">
- Nebbiosità
-dell&apos;acqua
- </text>
- <button bottom="-144" label="Usa orario della regione" name="EnvUseEstateTimeButton" width="145"/>
- <button label="Cielo avanzato" name="EnvAdvancedSkyButton"/>
- <button label="Acqua avanzata" name="EnvAdvancedWaterButton"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_environment_settings.xml b/indra/newview/skins/default/xui/it/floater_environment_settings.xml
new file mode 100644
index 0000000000..f191078fad
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_environment_settings.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Environment Editor Floater" title="IMPOSTAZIONI AMBIENTE">
+ <text name="note">
+ Usa le opzioni seguenti per personalizzare le impostazioni dell&apos;ambiente per il tuo viewer.
+ </text>
+ <radio_group name="region_settings_radio_group">
+ <radio_item label="Usa impostazioni regione" name="use_region_settings"/>
+ <radio_item label="Personalizza il mio ambiente" name="use_my_settings"/>
+ </radio_group>
+ <panel name="user_environment_settings">
+ <text name="note">
+ Nota: gli altri utenti non vedranno le tue impostazioni personalizzate.
+ </text>
+ <text name="water_settings_title">
+ Impostazione Acqua
+ </text>
+ <combo_box name="water_settings_preset_combo">
+ <combo_box.item label="-Seleziona un valore predefinito-" name="item0"/>
+ </combo_box>
+ <text name="sky_dayc_settings_title">
+ Ciclo giornata / cielo
+ </text>
+ <radio_group name="sky_dayc_settings_radio_group">
+ <radio_item label="Cielo fisso" name="my_sky_settings"/>
+ <radio_item label="Ciclo giornata" name="my_dayc_settings"/>
+ </radio_group>
+ <combo_box name="sky_settings_preset_combo">
+ <combo_box.item label="-Seleziona un valore predefinito-" name="item0"/>
+ </combo_box>
+ <combo_box name="dayc_settings_preset_combo">
+ <combo_box.item label="-Seleziona un valore predefinito-" name="item0"/>
+ </combo_box>
+ </panel>
+ <button label="OK" name="ok_btn"/>
+ <button label="Annulla" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_event.xml b/indra/newview/skins/default/xui/it/floater_event.xml
index 9a0105a589..b64f429870 100644
--- a/indra/newview/skins/default/xui/it/floater_event.xml
+++ b/indra/newview/skins/default/xui/it/floater_event.xml
@@ -1,40 +1,11 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater
- follows="all"
- height="400"
- can_resize="true"
- help_topic="event_details"
- label="Event"
- layout="topleft"
- name="Event"
- save_rect="true"
- save_visibility="false"
- title="EVENT DETAILS"
- width="600">
- <floater.string
- name="loading_text">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater can_resize="true" follows="all" height="400" help_topic="event_details" label="Event" layout="topleft" name="Event" save_rect="true" save_visibility="false" title="EVENT DETAILS" width="600">
+ <floater.string name="loading_text">
Caricamento in corso...
</floater.string>
- <floater.string
- name="done_text">
- Done
- </floater.string>
- <web_browser
- trusted_content="true"
- follows="left|right|top|bottom"
- layout="topleft"
- left="10"
- name="browser"
- height="365"
- width="580"
- top="0"/>
- <text
- follows="bottom|left"
- height="16"
- layout="topleft"
- left_delta="0"
- name="status_text"
- top_pad="10"
- width="150" />
+ <floater.string name="done_text">
+ Fine
+ </floater.string>
+ <web_browser follows="left|right|top|bottom" height="365" layout="topleft" left="10" name="browser" top="0" trusted_content="true" width="580"/>
+ <text follows="bottom|left" height="16" layout="topleft" left_delta="0" name="status_text" top_pad="10" width="150"/>
</floater>
-
diff --git a/indra/newview/skins/default/xui/it/floater_fast_timers.xml b/indra/newview/skins/default/xui/it/floater_fast_timers.xml
new file mode 100644
index 0000000000..52ab6b0c3d
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_fast_timers.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="fast_timers">
+ <string name="pause">
+ Pausa
+ </string>
+ <string name="run">
+ Correre
+ </string>
+ <button label="Pausa" name="pause_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_hardware_settings.xml b/indra/newview/skins/default/xui/it/floater_hardware_settings.xml
index 384e7c1272..5d3ae04a4d 100644
--- a/indra/newview/skins/default/xui/it/floater_hardware_settings.xml
+++ b/indra/newview/skins/default/xui/it/floater_hardware_settings.xml
@@ -4,7 +4,7 @@
Filtraggio:
</text>
<check_box label="Filtraggio Anisotropico (rallenta se attivato)" name="ani"/>
- <text name="Antialiasing:">
+ <text name="antialiasing label">
Antialiasing:
</text>
<combo_box label="Antialiasing" name="fsaa" width="94">
@@ -14,6 +14,9 @@
<combo_box.item label="8x" name="8x"/>
<combo_box.item label="16x" name="16x"/>
</combo_box>
+ <text name="antialiasing restart">
+ (richiede il riavvio del viewer)
+ </text>
<spinner label="Gamma:" name="gamma"/>
<text name="(brightness, lower is brighter)">
(0 = luminosità default, più basso = più luminoso)
diff --git a/indra/newview/skins/default/xui/it/floater_how_to.xml b/indra/newview/skins/default/xui/it/floater_how_to.xml
new file mode 100644
index 0000000000..8f0e210571
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_how_to.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_how_to" title="ISTRUZIONI"/>
diff --git a/indra/newview/skins/default/xui/it/floater_import_collada.xml b/indra/newview/skins/default/xui/it/floater_import_collada.xml
new file mode 100644
index 0000000000..eb4d0c0fdb
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_import_collada.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Import Collada" title="Importa scena">
+ <text name="mesh count">
+ Reticoli: [COUNT]
+ </text>
+ <text name="texture count">
+ Texture: [COUNT]
+ </text>
+ <text name="status">
+ Stato: [STATUS]
+ </text>
+ <button label="Annulla" name="cancel"/>
+ <button label="OK" name="ok"/>
+ <string name="status_idle">
+ Pausa
+ </string>
+ <string name="status_uploading">
+ Caricamento in corso [NAME]
+ </string>
+ <string name="status_creating">
+ Creazione oggetto [NAME]
+ </string>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_incoming_call.xml b/indra/newview/skins/default/xui/it/floater_incoming_call.xml
index 4d9c1b98dd..a95ed44662 100644
--- a/indra/newview/skins/default/xui/it/floater_incoming_call.xml
+++ b/indra/newview/skins/default/xui/it/floater_incoming_call.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="incoming call" title="UNA PERSONA SCONOSCIUTA STA CHIAMANDO">
+<floater name="incoming call" title="Chiamata in arrivo">
<floater.string name="lifetime">
5
</floater.string>
diff --git a/indra/newview/skins/default/xui/it/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/it/floater_inventory_item_properties.xml
index d3dc4d7eae..7ed3486b9b 100644
--- a/indra/newview/skins/default/xui/it/floater_inventory_item_properties.xml
+++ b/indra/newview/skins/default/xui/it/floater_inventory_item_properties.xml
@@ -24,16 +24,10 @@
<text name="LabelCreatorTitle">
Creatore:
</text>
- <text name="LabelCreatorName">
- Nicole Linden
- </text>
<button label="Profilo..." label_selected="" name="BtnCreator"/>
<text name="LabelOwnerTitle">
proprietario:
</text>
- <text name="LabelOwnerName">
- Thrax Linden
- </text>
<button label="Profilo..." label_selected="" name="BtnOwner"/>
<text name="LabelAcquiredTitle">
Acquisito:
diff --git a/indra/newview/skins/default/xui/it/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/it/floater_inventory_view_finder.xml
index 49130285f2..cf790ee62e 100644
--- a/indra/newview/skins/default/xui/it/floater_inventory_view_finder.xml
+++ b/indra/newview/skins/default/xui/it/floater_inventory_view_finder.xml
@@ -5,6 +5,7 @@
<check_box label="Abiti" name="check_clothing"/>
<check_box label="Gesture" name="check_gesture"/>
<check_box label="Landmark" name="check_landmark"/>
+ <check_box label="Reticoli" name="check_mesh"/>
<check_box label="Notecard" name="check_notecard"/>
<check_box label="Oggetti" name="check_object"/>
<check_box label="Script" name="check_script"/>
diff --git a/indra/newview/skins/default/xui/it/floater_map.xml b/indra/newview/skins/default/xui/it/floater_map.xml
index 3dcfdd4662..5e4e4abca4 100644
--- a/indra/newview/skins/default/xui/it/floater_map.xml
+++ b/indra/newview/skins/default/xui/it/floater_map.xml
@@ -1,10 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Map" title="">
+<floater name="Map" title="MINI MAPPA">
<floater.string name="ToolTipMsg">
[REGION](Fai doppio clic per aprire la Mappa, premi il tasto Maiusc e trascina per la panoramica)
</floater.string>
+ <floater.string name="AltToolTipMsg">
+ [REGION](Fai doppio clic per teleportarti, premi il tasto Maiusc e trascina per la panoramica)
+ </floater.string>
<floater.string name="mini_map_caption">
- MINI MAPPA
+ Mini mappa
</floater.string>
<text label="N" name="floater_map_north" text="N">
N
diff --git a/indra/newview/skins/default/xui/it/floater_merchant_outbox.xml b/indra/newview/skins/default/xui/it/floater_merchant_outbox.xml
new file mode 100644
index 0000000000..02f257d466
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_merchant_outbox.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_merchant_outbox" title="CASELLA IN USCITA DEL RIVENDITORE">
+ <string name="OutboxFolderCount1">
+ 1 cartella
+ </string>
+ <string name="OutboxFolderCountN">
+ [NUM] cartelle
+ </string>
+ <string name="OutboxImporting">
+ Invio cartelle...
+ </string>
+ <string name="OutboxInitializing">
+ Inizializzazione...
+ </string>
+ <panel label="">
+ <panel>
+ <panel name="outbox_inventory_placeholder_panel">
+ <text name="outbox_inventory_placeholder_title">
+ Caricamento...
+ </text>
+ </panel>
+ </panel>
+ <panel>
+ <button label="Invia a Marketplace" name="outbox_import_btn" tool_tip="Push su negozio Marketplace"/>
+ </panel>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_model_preview.xml b/indra/newview/skins/default/xui/it/floater_model_preview.xml
new file mode 100644
index 0000000000..ca36fd2def
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_model_preview.xml
@@ -0,0 +1,277 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Model Preview" title="CARICAMENTO MODELLO">
+ <string name="status_idle"/>
+ <string name="status_parse_error">
+ Errore: Errore elaborazione Dae - vedere il registro per informazioni dettagliate.
+ </string>
+ <string name="status_material_mismatch">
+ Errore: il materiale del modello non è un sottoinsieme del modello di riferimento.
+ </string>
+ <string name="status_reading_file">
+ Caricamento in corso...
+ </string>
+ <string name="status_generating_meshes">
+ Generazione reticoli...
+ </string>
+ <string name="status_vertex_number_overflow">
+ Errore: numero di vertici maggiore di 65534, annullato.
+ </string>
+ <string name="bad_element">
+ Errore: elemento non valido
+ </string>
+ <string name="high">
+ Alto
+ </string>
+ <string name="medium">
+ Medio
+ </string>
+ <string name="low">
+ Basso
+ </string>
+ <string name="lowest">
+ Bassissimo
+ </string>
+ <string name="mesh_status_good">
+ Invia!
+ </string>
+ <string name="mesh_status_na">
+ N/D
+ </string>
+ <string name="mesh_status_none">
+ Nessuno
+ </string>
+ <string name="mesh_status_submesh_mismatch">
+ Ai vari livelli del dettaglio corrispondono numeri diversi di faccette con texture.
+ </string>
+ <string name="mesh_status_mesh_mismatch">
+ Ai vari livelli del dettaglio corrispondono numeri diversi istanze di reticoli.
+ </string>
+ <string name="mesh_status_too_many_vertices">
+ Troppi vertici per il livello di dettaglio.
+ </string>
+ <string name="mesh_status_missing_lod">
+ Livello di dettaglio minimo mancante.
+ </string>
+ <string name="mesh_status_invalid_material_list">
+ I materiali per il livello di dettaglio non sono un sottoinsieme del modello di riferimento.
+ </string>
+ <string name="layer_all">
+ Tutto
+ </string>
+ <string name="decomposing">
+ Analisi in corso...
+ </string>
+ <string name="simplifying">
+ Semplificazione in corso...
+ </string>
+ <string name="tbd">
+ Da definire
+ </string>
+ <panel name="left_panel">
+ <panel name="model_name_representation_panel">
+ <text name="name_label">
+ Nome modello:
+ </text>
+ <text name="model_category_label">
+ Questo modello rappresenta...
+ </text>
+ <combo_box name="model_category_combo">
+ <combo_item label="Seleziona uno..." name="Choose one"/>
+ <combo_item label="Forma avatar" name="Avatar shape"/>
+ <combo_item label="Elemento collegato all&apos;avatar" name="Avatar attachment"/>
+ <combo_item label="Oggetto mobile (veicolo, animale)" name="Moving object (vehicle, animal)"/>
+ <combo_item label="Componente edificio" name="Building Component"/>
+ <combo_item label="Grande, immobile, ecc." name="Large, non moving etc"/>
+ <combo_item label="Piccolo, immobile, ecc." name="Smaller, non-moving etc"/>
+ <combo_item label="Nessuno di questi" name="Not really any of these"/>
+ </combo_box>
+ </panel>
+ <tab_container name="import_tab">
+ <panel label="Livello di dettaglio" name="lod_panel" title="Livello di dettaglio">
+ <text initial_value="Fonte" name="source" value="Fonte"/>
+ <text initial_value="Triangoli" name="triangles" value="Triangoli"/>
+ <text initial_value="Vertici" name="vertices" value="Vertici"/>
+ <text initial_value="Alto" name="high_label" value="Alto"/>
+ <button label="Sfoglia..." name="lod_browse_high"/>
+ <text initial_value="0" name="high_triangles" value="0"/>
+ <text initial_value="0" name="high_vertices" value="0"/>
+ <text initial_value="Medio" name="medium_label" value="Medio"/>
+ <button label="Sfoglia..." name="lod_browse_medium"/>
+ <text initial_value="0" name="medium_triangles" value="0"/>
+ <text initial_value="0" name="medium_vertices" value="0"/>
+ <text initial_value="Basso" name="low_label" value="Basso"/>
+ <button label="Sfoglia..." name="lod_browse_low"/>
+ <text initial_value="0" name="low_triangles" value="0"/>
+ <text initial_value="0" name="low_vertices" value="0"/>
+ <text initial_value="Bassissimo" name="lowest_label" value="Bassissimo"/>
+ <button label="Sfoglia..." name="lod_browse_lowest"/>
+ <text initial_value="0" name="lowest_triangles" value="0"/>
+ <text initial_value="0" name="lowest_vertices" value="0"/>
+ <check_box label="Genera normali" name="gen_normals"/>
+ <text initial_value="Angolo piega:" name="crease_label" value="Angolo piega:"/>
+ <spinner name="crease_angle" value="75"/>
+ </panel>
+ <panel label="Fisica" name="physics_panel">
+ <panel name="physics geometry">
+ <text name="first_step_name">
+ Passaggio 1: Livello di dettaglio
+ </text>
+ <combo_box name="physics_lod_combo" tool_tip="Livello di dettaglio per forma fisica">
+ <combo_item name="choose_one">
+ Seleziona uno...
+ </combo_item>
+ <combo_item name="physics_high">
+ Alto
+ </combo_item>
+ <combo_item name="physics_medium">
+ Medio
+ </combo_item>
+ <combo_item name="physics_low">
+ Basso
+ </combo_item>
+ <combo_item name="physics_lowest">
+ Bassissimo
+ </combo_item>
+ <combo_item name="load_from_file">
+ Da file
+ </combo_item>
+ </combo_box>
+ <button label="Sfoglia..." name="physics_browse"/>
+ </panel>
+ <panel name="physics analysis">
+ <text name="method_label">
+ Passaggio 2: Analizza
+ </text>
+ <text name="analysis_method_label">
+ Metodo:
+ </text>
+ <text name="quality_label">
+ Qualità:
+ </text>
+ <text name="smooth_method_label">
+ Liscia:
+ </text>
+ <check_box label="Chiudi fori" name="Close Holes (Slow)"/>
+ <button label="Analizza" name="Decompose"/>
+ <button label="Annulla" name="decompose_cancel"/>
+ </panel>
+ <panel name="physics simplification">
+ <text name="second_step_label">
+ Passaggio 3: Semplifica
+ </text>
+ <text name="simp_method_header">
+ Metodo:
+ </text>
+ <text name="pass_method_header">
+ Passaggi:
+ </text>
+ <text name="Detail Scale label">
+ Scala dettagli:
+ </text>
+ <text name="Retain%_label">
+ Mantieni:
+ </text>
+ <combo_box name="Combine Quality" value="1"/>
+ <button label="Semplifica" name="Simplify"/>
+ <button label="Annulla" name="simplify_cancel"/>
+ </panel>
+ <panel name="physics info">
+ <text name="results_text">
+ Risultati:
+ </text>
+ <text name="physics_triangles">
+ Triangoli: [TRIANGLES],
+ </text>
+ <text name="physics_points">
+ Vertici: [POINTS],
+ </text>
+ <text name="physics_hulls">
+ Scafi: [HULLS]
+ </text>
+ </panel>
+ </panel>
+ <panel label="Carica opzioni" name="modifiers_panel">
+ <text name="scale_label">
+ Scala (1=nessuna scala):
+ </text>
+ <spinner name="import_scale" value="1.0"/>
+ <text name="dimensions_label">
+ Dimensioni:
+ </text>
+ <text name="import_dimensions">
+ [X] X [Y] X [Z]
+ </text>
+ <check_box label="Includi texture" name="upload_textures"/>
+ <text name="include_label">
+ Solo per modelli avatar:
+ </text>
+ <check_box label="Includi peso pelle" name="upload_skin"/>
+ <check_box label="Includi posizioni giunti" name="upload_joints"/>
+ <text name="pelvis_offset_label">
+ Spostamento Z (sposta l&apos;avatar in alto o in basso):
+ </text>
+ <spinner name="pelvis_offset" value="0.0"/>
+ </panel>
+ </tab_container>
+ <panel name="weights_and_warning_panel">
+ <button label="Calcolare pesi e tariffa" name="calculate_btn" tool_tip="Calcolare pesi e tariffa"/>
+ <button label="Annulla" name="cancel_btn"/>
+ <button label="Carica" name="ok_btn" tool_tip="Carica al simulatore"/>
+ <button label="Annulla impostazioni e ripristina modulo" name="reset_btn"/>
+ <text name="upload_fee">
+ Costo caricamento: L$ [FEE]
+ </text>
+ <text name="prim_weight">
+ Impatto sul terreno: [EQ]
+ </text>
+ <text name="download_weight">
+ Download: [ST]
+ </text>
+ <text name="physics_weight">
+ Fisica: [PH]
+ </text>
+ <text name="server_weight">
+ Server: [SIM]
+ </text>
+ <text name="warning_title">
+ NOTA:
+ </text>
+ <text name="warning_message">
+ Non hai l&apos;autorizzazione per caricare i modelli di reticolo. [[VURL] Scopri come] ottenere la certificazione.
+ </text>
+ <text name="status">
+ [STATUS]
+ </text>
+ </panel>
+ </panel>
+ <text name="lod_label">
+ Anteprima:
+ </text>
+ <panel name="right_panel">
+ <combo_box name="preview_lod_combo" tool_tip="Livello di dettaglio per anteprima rendering">
+ <combo_item name="high">
+ Alto
+ </combo_item>
+ <combo_item name="medium">
+ Medio
+ </combo_item>
+ <combo_item name="low">
+ Basso
+ </combo_item>
+ <combo_item name="lowest">
+ Bassissimo
+ </combo_item>
+ </combo_box>
+ <text name="label_display">
+ Visualizzazione...
+ </text>
+ <check_box label="Bordi" name="show_edges"/>
+ <check_box label="Fisica" name="show_physics"/>
+ <check_box label="Texture" name="show_textures"/>
+ <check_box label="Pesi pelle" name="show_skin_weight"/>
+ <check_box label="Giunti" name="show_joint_positions"/>
+ <text name="physics_explode_label">
+ Anteprima spaziatura:
+ </text>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_moveview.xml b/indra/newview/skins/default/xui/it/floater_moveview.xml
index cdafdb0089..1237bd06a9 100644
--- a/indra/newview/skins/default/xui/it/floater_moveview.xml
+++ b/indra/newview/skins/default/xui/it/floater_moveview.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="move_floater">
+<floater name="move_floater" title="CAMMINA / CORRI / VOLA">
<string name="walk_forward_tooltip">
Cammina in avanti (premi freccia su o W)
</string>
@@ -58,14 +58,14 @@
Vola
</string>
<panel name="panel_actions">
- <button label="" label_selected="" name="move up btn" tool_tip="Vola in alto (premi E)"/>
<button label="" label_selected="" name="turn left btn" tool_tip="Gira a sinistra (premi freccia sinistra o A)"/>
<joystick_slide name="move left btn" tool_tip="Cammina a sinistra (premi Maiusc + freccia sinistra o A)"/>
- <button label="" label_selected="" name="move down btn" tool_tip="Vola in basso (premi C)"/>
<button label="" label_selected="" name="turn right btn" tool_tip="Gira a destra (premi freccia destra o D)"/>
<joystick_slide name="move right btn" tool_tip="Cammina a destra (premi Maiusc + freccia destra o D)"/>
<joystick_turn name="forward btn" tool_tip="Cammina in avanti (premi freccia su o W)"/>
<joystick_turn name="backward btn" tool_tip="Cammina indietro (premi freccia giù o S)"/>
+ <button label="" label_selected="" name="move up btn" tool_tip="Vola in alto (premi E)"/>
+ <button label="" label_selected="" name="move down btn" tool_tip="Vola in basso (premi C)"/>
</panel>
<panel name="panel_modes">
<button label="" name="mode_walk_btn" tool_tip="Modalità cammina"/>
diff --git a/indra/newview/skins/default/xui/it/floater_my_appearance.xml b/indra/newview/skins/default/xui/it/floater_my_appearance.xml
new file mode 100644
index 0000000000..39ddd6186a
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_my_appearance.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_my_appearance" title="ASPETTO">
+ <panel label="Modifica aspetto" name="main_panel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_my_inventory.xml b/indra/newview/skins/default/xui/it/floater_my_inventory.xml
new file mode 100644
index 0000000000..0efd9f1c6d
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_my_inventory.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_my_inventory" title="INVENTARIO"/>
diff --git a/indra/newview/skins/default/xui/it/floater_nearby_chat.xml b/indra/newview/skins/default/xui/it/floater_nearby_chat.xml
index 4c41df8a62..9e81899880 100644
--- a/indra/newview/skins/default/xui/it/floater_nearby_chat.xml
+++ b/indra/newview/skins/default/xui/it/floater_nearby_chat.xml
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="nearby_chat" title="CHAT NEI DINTORNI">
- <check_box label="Traduci chat (tecnologia Google)" name="translate_chat_checkbox"/>
+ <check_box label="Traduci chat" name="translate_chat_checkbox"/>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_object_weights.xml b/indra/newview/skins/default/xui/it/floater_object_weights.xml
new file mode 100644
index 0000000000..fdcb732dee
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_object_weights.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="object_weights" title="AVANZATE">
+ <floater.string name="nothing_selected" value="--"/>
+ <text name="selected_text" value="SELEZIONATI"/>
+ <text name="objects" value="--"/>
+ <text name="objects_label" value="Oggetti"/>
+ <text name="prims" value="--"/>
+ <text name="prims_label" value="Prim"/>
+ <text name="weights_of_selected_text" value="PESO ELEMENTI SELEZIONATI"/>
+ <text name="download" value="--"/>
+ <text name="download_label" value="Scarica"/>
+ <text name="physics" value="--"/>
+ <text name="physics_label" value="Fisica"/>
+ <text name="server" value="--"/>
+ <text name="server_label" value="Server"/>
+ <text name="display" value="--"/>
+ <text name="display_label" value="Visualizzazione"/>
+ <text name="land_impacts_text" value="IMPATTO TERRENO"/>
+ <text name="selected" value="--"/>
+ <text name="selected_label" value="Selezionati"/>
+ <text name="rezzed_on_land" value="--"/>
+ <text name="rezzed_on_land_label" value="Rezzati sul terreno"/>
+ <text name="remaining_capacity" value="--"/>
+ <text name="remaining_capacity_label" value="Capacità restante"/>
+ <text name="total_capacity" value="--"/>
+ <text name="total_capacity_label" value="Capacità totale"/>
+ <text name="help_SLURL" value="[secondlife:///app/help/object_weights Di cosa si tratta?...]"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_outfit_save_as.xml b/indra/newview/skins/default/xui/it/floater_outfit_save_as.xml
new file mode 100644
index 0000000000..55bb5adb1e
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_outfit_save_as.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="modal container" title="SALVA ABITO"/>
diff --git a/indra/newview/skins/default/xui/it/floater_pay.xml b/indra/newview/skins/default/xui/it/floater_pay.xml
index 6389cbfbf7..5753c8c765 100644
--- a/indra/newview/skins/default/xui/it/floater_pay.xml
+++ b/indra/newview/skins/default/xui/it/floater_pay.xml
@@ -11,7 +11,7 @@
</text>
<icon name="icon_person" tool_tip="Persona"/>
<text left="115" name="payee_name">
- Test Name That Is Extremely Long To Check Clipping
+ Nome di test che è troppo lungo per controllare il taglio
</text>
<button label="1 L$" label_selected="1 L$" left="118" name="fastpay 1" width="80"/>
<button label="5 L$" label_selected="5 L$" left="210" name="fastpay 5"/>
diff --git a/indra/newview/skins/default/xui/it/floater_people.xml b/indra/newview/skins/default/xui/it/floater_people.xml
new file mode 100644
index 0000000000..1acc3cbf19
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_people.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_people" title="PERSONE">
+ <panel_container name="main_panel">
+ <panel label="Profilo del gruppo" name="panel_group_info_sidetray"/>
+ <panel label="Residenti e oggetti bloccati" name="panel_block_list_sidetray"/>
+ </panel_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_picks.xml b/indra/newview/skins/default/xui/it/floater_picks.xml
new file mode 100644
index 0000000000..dfc539da66
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_picks.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_picks" title="Preferiti"/>
diff --git a/indra/newview/skins/default/xui/it/floater_places.xml b/indra/newview/skins/default/xui/it/floater_places.xml
new file mode 100644
index 0000000000..cd46cf8b59
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_places.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_places" title="LUOGHI">
+ <panel label="Luoghi" name="main_panel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_preferences.xml b/indra/newview/skins/default/xui/it/floater_preferences.xml
index c5b6654a69..7a1d2966ed 100644
--- a/indra/newview/skins/default/xui/it/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/it/floater_preferences.xml
@@ -5,10 +5,12 @@
<tab_container name="pref core" tab_width="100">
<panel label="Generale" name="general"/>
<panel label="Grafica" name="display"/>
- <panel label="Riservatezza" name="im"/>
<panel label="Audio e media" name="audio"/>
<panel label="Chat" name="chat"/>
+ <panel label="Sposta e visualizza" name="move"/>
<panel label="Notifiche" name="msgs"/>
+ <panel label="Colori" name="colors"/>
+ <panel label="Riservatezza" name="im"/>
<panel label="Impostazione" name="input"/>
<panel label="Avanzate" name="advanced1"/>
</tab_container>
diff --git a/indra/newview/skins/default/xui/it/floater_preferences_proxy.xml b/indra/newview/skins/default/xui/it/floater_preferences_proxy.xml
new file mode 100644
index 0000000000..86ea8064b1
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_preferences_proxy.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Proxy Settings Floater" title="Impostazioni proxy">
+ <check_box initial_value="false" label="Usa proxy HTTP per le pagine Web" name="web_proxy_enabled"/>
+ <text name="http_proxy_label">
+ Proxy HTTP:
+ </text>
+ <line_editor name="web_proxy_editor" tool_tip="Il nome DNS o l&apos;indirizzo IP del proxy HTTP che preferisci usare."/>
+ <spinner label="Numero porta:" name="web_proxy_port" tool_tip="La porta del proxy HTTP che preferisci usare."/>
+ <check_box label="Usa Proxy SOCKS 5 per il traffico UDP" name="socks_proxy_enabled"/>
+ <text name="socks5_proxy_label">
+ Proxy SOCKS 5:
+ </text>
+ <line_editor name="socks_proxy_editor" tool_tip="Il nome DNS o l&apos;indirizzo IP del proxy SOCKS 5 che preferisci usare."/>
+ <spinner label="Numero porta:" name="socks_proxy_port" tool_tip="La porta del proxy SOCKS 5 che preferisci usare."/>
+ <text name="socks_auth_label">
+ Autenticazione SOCKS:
+ </text>
+ <radio_group name="socks5_auth_type">
+ <radio_item label="Nessuna autenticazione" name="Socks5NoAuth" tool_tip="Il proxy Socks5 non richiede autenticazione." value="Nessuna"/>
+ <radio_item label="Nome utente e password" name="Socks5UserPass" tool_tip="Il proxy Socks5 richiede autenticazione con nome utente e password." value="NomePassword"/>
+ </radio_group>
+ <text name="socks5_username_label">
+ Nome utente:
+ </text>
+ <text name="socks5_password_label">
+ Password:
+ </text>
+ <line_editor name="socks5_username" tool_tip="Il nome utente usato per l&apos;autenticazione con il server SOCKS 5"/>
+ <line_editor name="socks5_password" tool_tip="La password usata per l&apos;autenticazione con il server SOCKS 5"/>
+ <text name="other_proxy_label">
+ Altro traffico proxy HTTP:
+ </text>
+ <radio_group name="other_http_proxy_type">
+ <radio_item label="Senza proxy" name="OtherNoProxy" tool_tip="Il traffico HTTP non Web NON verrà inviato ad alcun proxy." value="Nessuna"/>
+ <radio_item label="Usa proxy HTTP" name="OtherHTTPProxy" tool_tip="Il traffico HTTP non Web verrà inviato attraverso un proxy Web configurato." value="Web"/>
+ <radio_item label="Usa proxy SOCKS 5:" name="OtherSocksProxy" tool_tip="Il traffico HTTP non Web verrà inviato attraverso il proxy Socks 5 configurato." value="Socks"/>
+ </radio_group>
+ <button label="OK" label_selected="OK" name="OK"/>
+ <button label="Annulla" label_selected="Annulla" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_preview_animation.xml b/indra/newview/skins/default/xui/it/floater_preview_animation.xml
index 73082c9526..ed609c70fa 100644
--- a/indra/newview/skins/default/xui/it/floater_preview_animation.xml
+++ b/indra/newview/skins/default/xui/it/floater_preview_animation.xml
@@ -6,6 +6,6 @@
<text name="desc txt">
Descrizione:
</text>
- <button label="Riproduci in Second Life" label_selected="Ferma" left="20" name="Anim play btn" tool_tip="Riproduci questa animazione così che gli altri possano vederla" width="131"/>
- <button label="Esegui localmente" label_selected="Ferma" left="162" name="Anim audition btn" tool_tip="Riproduci questa animazione così che solo tu possa vederla" width="125"/>
+ <button label="Riproduci in Second Life" label_selected="Ferma" name="Inworld" tool_tip="Riproduci questa animazione così che gli altri possano vederla"/>
+ <button label="Riproduci localmente" label_selected="Ferma" name="Locally" tool_tip="Riproduci questa animazione così che solo tu possa vederla"/>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_preview_gesture.xml b/indra/newview/skins/default/xui/it/floater_preview_gesture.xml
index 7e29db6336..2172b9848b 100644
--- a/indra/newview/skins/default/xui/it/floater_preview_gesture.xml
+++ b/indra/newview/skins/default/xui/it/floater_preview_gesture.xml
@@ -34,10 +34,10 @@
Sostituisci con:
</text>
<line_editor name="replace_editor" tool_tip="Sostituisci le parole chiave con questi termini. Per esempio, sostituire la parola chiave &apos;salve&apos; con &apos;ciao&apos; modificherà la chat &apos;Volevo solo dire salve&apos; in &apos;Volevo solo dire ciao&apos; e avvierà la gesture!"/>
- <text name="key_label">
+ <text name="key_label" width="147">
Scorciatoia da tastiera:
</text>
- <combo_box label="Nessuno" name="modifier_combo" />
+ <combo_box left_delta="150" label="Nessuno" name="modifier_combo" />
<combo_box label="Nessuno" name="key_combo" />
<text name="library_label">
Libreria:
diff --git a/indra/newview/skins/default/xui/it/floater_price_for_listing.xml b/indra/newview/skins/default/xui/it/floater_price_for_listing.xml
new file mode 100644
index 0000000000..06c838a981
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_price_for_listing.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="price_for_listing" title="PUBBLICA L&apos;ANNUNCIO PUBBLICITARIO">
+ <text name="explanation_text">
+ La tua inserzione sarà visibile per una settimana dal giorno della sua pubblicazione.
+
+La posizione del tuo annuncio nella lista delle inserzioni è determinata dalla somma pagata.
+
+Le inserzioni con un pagamento più alto saranno più visibili nella lista dei risultati della ricerca.
+ </text>
+ <text name="price_text">
+ Prezzo per inserzione:
+ </text>
+ <text name="price_symbol">
+ L$
+ </text>
+ <button label="OK" name="set_price_btn"/>
+ <button label="Annulla" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_region_debug_console.xml b/indra/newview/skins/default/xui/it/floater_region_debug_console.xml
new file mode 100644
index 0000000000..6efa10290b
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_region_debug_console.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="region_debug_console" title="Debug regione"/>
diff --git a/indra/newview/skins/default/xui/it/floater_search.xml b/indra/newview/skins/default/xui/it/floater_search.xml
index 05f5dfe719..ac3dc17aa3 100644
--- a/indra/newview/skins/default/xui/it/floater_search.xml
+++ b/indra/newview/skins/default/xui/it/floater_search.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_search" title="TROVA">
+<floater name="floater_search" title="">
<floater.string name="loading_text">
Caricamento in corso...
</floater.string>
diff --git a/indra/newview/skins/default/xui/it/floater_sell_land.xml b/indra/newview/skins/default/xui/it/floater_sell_land.xml
index 0f8d24ebbd..106ae0373c 100644
--- a/indra/newview/skins/default/xui/it/floater_sell_land.xml
+++ b/indra/newview/skins/default/xui/it/floater_sell_land.xml
@@ -55,7 +55,7 @@
<radio_item label="Si, vendi gli oggetti con la terra" name="yes"/>
</radio_group>
<button label="Mostra oggetti" name="show_objects"/>
- <text name="nag_message_label">
+ <text name="nag_message_label" font="SansSerifSmallBold" left="9">
RICORDA: Tutte le vendite sono definitive.
</text>
<button label="Imposta terreno come in vendita" name="sell_btn"/>
diff --git a/indra/newview/skins/default/xui/it/floater_settings_debug.xml b/indra/newview/skins/default/xui/it/floater_settings_debug.xml
index aab00a26ce..489d52d3b8 100644
--- a/indra/newview/skins/default/xui/it/floater_settings_debug.xml
+++ b/indra/newview/skins/default/xui/it/floater_settings_debug.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="settings_debug" title="PARAMETRI DI DEBUG">
<radio_group name="boolean_combo">
- <radio_item label="VERO" name="TRUE" value="vero"/>
- <radio_item label="FALSO" name="FALSE" value=""/>
+ <radio_item label="VERO" name="TRUE" />
+ <radio_item label="FALSO" name="FALSE" />
</radio_group>
<color_swatch label="Colore" name="val_color_swatch"/>
<spinner label="x" name="val_spinner_1"/>
diff --git a/indra/newview/skins/default/xui/it/floater_snapshot.xml b/indra/newview/skins/default/xui/it/floater_snapshot.xml
index 5bff19e8d7..bff6081bdf 100644
--- a/indra/newview/skins/default/xui/it/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/it/floater_snapshot.xml
@@ -1,75 +1,65 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Snapshot" title="ANTEPRIMA FOTOGRAFIA" width="247">
+<floater name="Snapshot" title="ANTEPRIMA FOTOGRAFIA">
<floater.string name="unknown">
sconosciuto
</floater.string>
- <radio_group label="Tipo di fotografia" name="snapshot_type_radio">
- <radio_item label="E-mail" name="postcard"/>
- <radio_item label="Il mio inventario (L$[AMOUNT])" name="texture"/>
- <radio_item label="Salva sul mio computer" name="local"/>
- </radio_group>
+ <string name="postcard_progress_str">
+ Invio e-mail in corso
+ </string>
+ <string name="profile_progress_str">
+ Caricamento post
+ </string>
+ <string name="inventory_progress_str">
+ Salva nell&apos;inventario
+ </string>
+ <string name="local_progress_str">
+ Salvataggio sul computer in corso
+ </string>
+ <string name="profile_succeeded_str">
+ Immagine caricata
+ </string>
+ <string name="postcard_succeeded_str">
+ E-mail inviata.
+ </string>
+ <string name="inventory_succeeded_str">
+ Salvato nell&apos;inventario.
+ </string>
+ <string name="local_succeeded_str">
+ Salvato sul computer.
+ </string>
+ <string name="profile_failed_str">
+ Caricamento immagine sul feed del profilo non riuscito.
+ </string>
+ <string name="postcard_failed_str">
+ Invio e-mail non riuscito.
+ </string>
+ <string name="inventory_failed_str">
+ Non salvato nell&apos;inventario.
+ </string>
+ <string name="local_failed_str">
+ Non salvato sul computer.
+ </string>
+ <button name="advanced_options_btn" tool_tip="Opzioni Avanzate"/>
+ <text name="image_res_text">
+ [WIDTH] x [HEIGHT] px
+ </text>
<text name="file_size_label">
[SIZE] KB
</text>
- <button label="Aggiorna la fotografia" name="new_snapshot_btn"/>
- <button label="Invia" name="send_btn"/>
- <button label="Salva ([AMOUNT] L$)" name="upload_btn"/>
- <flyout_button label="Salva" name="save_btn" tool_tip="Salva immagine come file">
- <flyout_button.item label="Salva" name="save_item"/>
- <flyout_button.item label="Salva con nome..." name="saveas_item"/>
- </flyout_button>
- <button label="Altro" name="more_btn" tool_tip="Opzioni Avanzate"/>
- <button label="Meno" name="less_btn" tool_tip="Opzioni Avanzate"/>
- <button label="Annulla" name="discard_btn"/>
- <text name="type_label2">
- Dimensioni
- </text>
- <text name="format_label">
- Formato
- </text>
- <combo_box label="Risoluzione" name="postcard_size_combo">
- <combo_box.item label="Finestra attuale" name="CurrentWindow"/>
- <combo_box.item label="640x480" name="640x480"/>
- <combo_box.item label="800x600" name="800x600"/>
- <combo_box.item label="1024x768" name="1024x768"/>
- <combo_box.item label="Personalizza" name="Custom"/>
- </combo_box>
- <combo_box label="Risoluzione" name="texture_size_combo">
- <combo_box.item label="Finestra attuale" name="CurrentWindow"/>
- <combo_box.item label="Piccola (128x128)" name="Small(128x128)"/>
- <combo_box.item label="Media (256x256)" name="Medium(256x256)"/>
- <combo_box.item label="Grande (512x512)" name="Large(512x512)"/>
- <combo_box.item label="Personalizza" name="Custom"/>
- </combo_box>
- <combo_box label="Risoluzione" name="local_size_combo">
- <combo_box.item label="Finestra attuale" name="CurrentWindow"/>
- <combo_box.item label="320x240" name="320x240"/>
- <combo_box.item label="640x480" name="640x480"/>
- <combo_box.item label="800x600" name="800x600"/>
- <combo_box.item label="1024x768" name="1024x768"/>
- <combo_box.item label="1280x1024" name="1280x1024"/>
- <combo_box.item label="1600x1200" name="1600x1200"/>
- <combo_box.item label="Personalizza" name="Custom"/>
- </combo_box>
- <combo_box label="Formato" name="local_format_combo">
- <combo_box.item label="PNG" name="PNG"/>
- <combo_box.item label="JPEG" name="JPEG"/>
- <combo_box.item label="BMP" name="BMP"/>
- </combo_box>
- <spinner label="Larghezza" name="snapshot_width"/>
- <spinner label="Altezza" name="snapshot_height"/>
- <check_box label="Mantieni le proporzioni" name="keep_aspect_check"/>
- <slider label="Qualità dell&apos;immagine" name="image_quality_slider"/>
- <text name="layer_type_label">
- Cattura:
- </text>
- <combo_box label="Layer dell&apos;immagine" name="layer_types">
- <combo_box.item label="Colori" name="Colors"/>
- <combo_box.item label="Profondità" name="Depth"/>
- </combo_box>
- <check_box label="Interfaccia" name="ui_check"/>
- <check_box label="HUD" name="hud_check"/>
- <check_box label="Tieni aperta dopo il salvataggio" name="keep_open_check"/>
- <check_box label="Congela il frame (tutto schermo)" name="freeze_frame_check"/>
- <check_box label="Aggiornamento automatico" name="auto_snapshot_check"/>
+ <panel name="advanced_options_panel">
+ <text name="advanced_options_label">
+ OPZIONI AVANZATE
+ </text>
+ <text name="layer_type_label">
+ Cattura:
+ </text>
+ <combo_box label="Layer dell&apos;immagine" name="layer_types">
+ <combo_box.item label="Colori" name="Colors"/>
+ <combo_box.item label="Profondità" name="Depth"/>
+ </combo_box>
+ <check_box label="Interfaccia" name="ui_check"/>
+ <check_box label="HUD" name="hud_check"/>
+ <check_box label="Congela il frame (tutto schermo)" name="freeze_frame_check"/>
+ <check_box label="Aggiornamento automatico" name="auto_snapshot_check"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_sound_devices.xml b/indra/newview/skins/default/xui/it/floater_sound_devices.xml
new file mode 100644
index 0000000000..9799b48d89
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_sound_devices.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_sound_devices" title="DISPOSITIVI AUDIO">
+ <text name="voice_label">
+ Chat vocale
+ </text>
+ <check_box label="Abilitato" name="enable_voice"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_stats.xml b/indra/newview/skins/default/xui/it/floater_stats.xml
index aed2a03a21..ad6ef6b54b 100644
--- a/indra/newview/skins/default/xui/it/floater_stats.xml
+++ b/indra/newview/skins/default/xui/it/floater_stats.xml
@@ -10,8 +10,8 @@
</stat_view>
<stat_view label="Avanzata" name="advanced">
<stat_view label="Render" name="render">
- <stat_bar label="KTris disegnate" name="ktrisframe"/>
- <stat_bar label="KTris disegnate" name="ktrissec"/>
+ <stat_bar label="KTris disegnato per fotogramma" name="ktrisframe"/>
+ <stat_bar label="KTris disegnato per secondo" name="ktrissec"/>
<stat_bar label="Totale oggetti" name="objs"/>
<stat_bar label="Nuovi oggetti" name="newobjs"/>
</stat_view>
@@ -32,7 +32,7 @@
<stat_bar label="Layer" name="layerskbitstat"/>
<stat_bar label="Effettivi in ingresso" name="actualinkbitstat"/>
<stat_bar label="Effettivi in uscita" name="actualoutkbitstat"/>
- <stat_bar label="Operazioni pendenti VFS" name="vfspendingoperations"/>
+ <stat_bar label="Operazioni VFS in sospeso" name="vfspendingoperations"/>
</stat_view>
</stat_view>
<stat_view label="Simulatore" name="sim">
@@ -43,18 +43,6 @@
<stat_bar label="Oggetti pinzati" name="physicspinnedtasks"/>
<stat_bar label="Oggetti a basso LOD" name="physicslodtasks"/>
<stat_bar label="Memoria allocata" name="physicsmemoryallocated"/>
- <stat_bar label="Aggiornamenti agenti al sec" name="simagentups"/>
- <stat_bar label="Avatar principali" name="simmainagents"/>
- <stat_bar label="Avatar secondari" name="simchildagents"/>
- <stat_bar label="Oggetti" name="simobjects"/>
- <stat_bar label="Oggetti attivi" name="simactiveobjects"/>
- <stat_bar label="Script attivi" name="simactivescripts"/>
- <stat_bar label="Eventi di script" name="simscripteps"/>
- <stat_bar label="Pacchetti in ingresso" name="siminpps"/>
- <stat_bar label="Pacchetti in uscita" name="simoutpps"/>
- <stat_bar label="Download in attesa" name="simpendingdownloads"/>
- <stat_bar label="Caricamenti in attesa" name="simpendinguploads"/>
- <stat_bar label="Numero totale byte non confermati (Unacked)" name="simtotalunackedbytes"/>
</stat_view>
<stat_view label="Tempo (ms)" name="simperf">
<stat_bar label="Tempo totale Frame" name="simframemsec"/>
@@ -64,6 +52,14 @@
<stat_bar label="Tempo avatar" name="simagentmsec"/>
<stat_bar label="Tempo immagini" name="simimagesmsec"/>
<stat_bar label="Tempo script" name="simscriptmsec"/>
+ <stat_bar label="Tempo libero" name="simsparemsec"/>
+ <stat_view label="Dettagli tempo (ms)" name="timedetails">
+ <stat_bar label="Passaggio fisica" name="simsimphysicsstepmsec"/>
+ <stat_bar label="Aggiorna forme fisica" name="simsimphysicsshapeupdatemsec"/>
+ <stat_bar label="Altro fisica" name="simsimphysicsothermsec"/>
+ <stat_bar label="Tempo pausa" name="simsleepmsec"/>
+ <stat_bar label="IO pompa" name="simpumpiomsec"/>
+ </stat_view>
</stat_view>
</stat_view>
</container_view>
diff --git a/indra/newview/skins/default/xui/it/floater_test_layout_stacks.xml b/indra/newview/skins/default/xui/it/floater_test_layout_stacks.xml
new file mode 100644
index 0000000000..b479d5f6d6
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_test_layout_stacks.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Test Floater" title="LAYOUTSTACK TESTS"/>
diff --git a/indra/newview/skins/default/xui/it/floater_test_text_vertical_aligment.xml b/indra/newview/skins/default/xui/it/floater_test_text_vertical_aligment.xml
new file mode 100644
index 0000000000..23da6f7588
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_test_text_vertical_aligment.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Test Floater" title="FINESTRA DI TEST"/>
diff --git a/indra/newview/skins/default/xui/it/floater_tools.xml b/indra/newview/skins/default/xui/it/floater_tools.xml
index a8c985cb12..c963ac72e6 100644
--- a/indra/newview/skins/default/xui/it/floater_tools.xml
+++ b/indra/newview/skins/default/xui/it/floater_tools.xml
@@ -1,5 +1,20 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="toolbox floater" short_title="STRUMENTI PER COSTRUZIONE">
+ <floater.string name="grid_screen_text">
+ Schermo
+ </floater.string>
+ <floater.string name="grid_local_text">
+ Locale
+ </floater.string>
+ <floater.string name="grid_world_text">
+ Mondo
+ </floater.string>
+ <floater.string name="grid_reference_text">
+ Riferimento
+ </floater.string>
+ <floater.string name="grid_attachment_text">
+ Allegato
+ </floater.string>
<floater.string name="status_rotate">
Sposta le fasce colorate per ruotare l&apos;oggetto
</floater.string>
@@ -24,20 +39,11 @@
<floater.string name="status_selectland">
Clicca e trascina per selezionare il terreno
</floater.string>
- <floater.string name="grid_screen_text">
- Schermo
- </floater.string>
- <floater.string name="grid_local_text">
- Locale
- </floater.string>
- <floater.string name="grid_world_text">
- Globale
- </floater.string>
- <floater.string name="grid_reference_text">
- Riferimento
+ <floater.string name="status_selectcount">
+ [OBJ_COUNT] oggetti selezionati, impatto terreno [LAND_IMPACT]
</floater.string>
- <floater.string name="grid_attachment_text">
- Accessorio
+ <floater.string name="status_remaining_capacity">
+ Capacità restante [LAND_CAPACITY].
</floater.string>
<button label="" label_selected="" name="button focus" tool_tip="Ingrandisci"/>
<button label="" label_selected="" name="button move" tool_tip="Sposta"/>
@@ -64,21 +70,20 @@
<radio_item label="Seleziona faccia" name="radio select face"/>
</radio_group>
<check_box label="Modifica parti collegate" name="checkbox edit linked parts"/>
- <text name="RenderingCost" tool_tip="Mostra il costo di rendering calcolato per questo oggetto">
- þ: [COUNT]
- </text>
+ <button label="Collegamento" name="link_btn"/>
+ <button label="Scollega" name="unlink_btn"/>
<check_box label="" name="checkbox uniform"/>
<text label="Allunga entrambi i lati" name="checkbox uniform label">
Allunga entrambi i lati
</text>
<check_box initial_value="true" label="Ridimensiona le texture" name="checkbox stretch textures"/>
- <check_box initial_value="true" label="Posiziona nella griglia" name="checkbox snap to grid"/>
+ <check_box initial_value="true" label="Scatto" name="checkbox snap to grid"/>
<combo_box name="combobox grid mode" tool_tip="Scegli il tipo di righello per posizionare l&apos;oggetto">
- <combo_box.item label="Rete del mondo" name="World"/>
- <combo_box.item label="Rete locale" name="Local"/>
- <combo_box.item label="Griglia di riferimento" name="Reference"/>
+ <combo_box.item label="Mondo" name="World"/>
+ <combo_box.item label="Locale" name="Local"/>
+ <combo_box.item label="Riferimento" name="Reference"/>
</combo_box>
- <button label="Opzioni..." label_selected="Opzioni..." name="Options..." tool_tip="Vedi più opzioni della griglia"/>
+ <button label="" label_selected="Opzioni..." name="Options..." tool_tip="Vedi più opzioni della griglia"/>
<button label="" label_selected="" name="ToolCube" tool_tip="Cubo"/>
<button label="" label_selected="" name="ToolPrism" tool_tip="Prisma"/>
<button label="" label_selected="" name="ToolPyramid" tool_tip="Piramide"/>
@@ -118,11 +123,11 @@
Potenza
</text>
<button label="Applica" label_selected="Applica" name="button apply to selection" tool_tip="Modifica il terreno selezionato"/>
- <text name="obj_count">
- Oggetti: [COUNT]
+ <text name="selection_empty">
+ Nessuna selezione.
</text>
- <text name="prim_count">
- Prim: [COUNT]
+ <text name="remaining_capacity">
+ [CAPACITY_STRING] [secondlife:///app/openfloater/object_weights Maggiori informazioni]
</text>
<tab_container name="Object Info Tabs">
<panel label="Generale" name="General">
@@ -172,13 +177,13 @@
Creatore:
</text>
<text name="Creator Name">
- Thrax Linden
+ Sig.ra Esbee Linden (esbee.linden)
</text>
<text name="Owner:">
Proprietario:
</text>
<text name="Owner Name">
- Thrax Linden
+ Sig.ra Erica &quot;Moose&quot; Linden (erica.linden)
</text>
<text name="Group:">
Gruppo:
@@ -274,16 +279,7 @@
<combo_box.item label="Anello" name="Ring"/>
<combo_box.item label="Sculpted" name="Sculpted"/>
</combo_box>
- <combo_box name="material">
- <combo_box.item label="Pietra" name="Stone"/>
- <combo_box.item label="Metallo" name="Metal"/>
- <combo_box.item label="Vetro" name="Glass"/>
- <combo_box.item label="Legno" name="Wood"/>
- <combo_box.item label="Carne" name="Flesh"/>
- <combo_box.item label="Plastica" name="Plastic"/>
- <combo_box.item label="Gomma" name="Rubber"/>
- </combo_box>
- <text name="text cut" left_delta="-10" width="170">
+ <text left_delta="-10" name="text cut" width="170">
Riduci una sezione (inizio/fine)
</text>
<spinner label="I" name="cut begin"/>
@@ -350,7 +346,6 @@
Tipo di congiunzione
</text>
<combo_box name="sculpt type control">
- <combo_box.item label="(nessuna)" name="None"/>
<combo_box.item label="Sferica" name="Sphere"/>
<combo_box.item label="Toroidale" name="Torus"/>
<combo_box.item label="Piana" name="Plane"/>
@@ -358,6 +353,15 @@
</combo_box>
</panel>
<panel label="Caratteristiche" name="Features">
+ <panel.string name="None">
+ Nessuno
+ </panel.string>
+ <panel.string name="Prim">
+ Prim
+ </panel.string>
+ <panel.string name="Convex Hull">
+ Inviluppo convesso
+ </panel.string>
<text name="select_single">
Seleziona solo un prim per modificarne le caratteristiche.
</text>
@@ -382,6 +386,23 @@
<spinner label="Centro focale" name="Light Focus"/>
<spinner label="Attenuazione" name="Light Falloff"/>
<spinner label="Atmosfera" name="Light Ambiance"/>
+ <text name="label physicsshapetype">
+ Tipo di forma fisica:
+ </text>
+ <combo_box name="Physics Shape Type Combo Ctrl" tool_tip="Selezionare il tipo di forma fisica"/>
+ <combo_box name="material">
+ <combo_box.item label="Pietra" name="Stone"/>
+ <combo_box.item label="Metallo" name="Metal"/>
+ <combo_box.item label="Vetro" name="Glass"/>
+ <combo_box.item label="Legno" name="Wood"/>
+ <combo_box.item label="Carne" name="Flesh"/>
+ <combo_box.item label="Plastica" name="Plastic"/>
+ <combo_box.item label="Gomma" name="Rubber"/>
+ </combo_box>
+ <spinner label="Gravità" name="Physics Gravity"/>
+ <spinner label="Frizione" name="Physics Friction"/>
+ <spinner label="Densità in 100 kg/m^3" name="Physics Density"/>
+ <spinner label="Restituzione" name="Physics Restitution"/>
</panel>
<panel label="Texture" name="Texture">
<panel.string name="string repeats per meter">
diff --git a/indra/newview/skins/default/xui/it/floater_top_objects.xml b/indra/newview/skins/default/xui/it/floater_top_objects.xml
index 939c5e83a0..7d062db23b 100644
--- a/indra/newview/skins/default/xui/it/floater_top_objects.xml
+++ b/indra/newview/skins/default/xui/it/floater_top_objects.xml
@@ -39,13 +39,13 @@
<text name="id_text">
ID oggetto:
</text>
- <line_editor font="SansSerifSmall" left="90" name="id_editor" width="280"/>
- <button label="Mostra segnali luminosi" name="show_beacon_btn" width="150"/>
+ <line_editor font="SansSerifSmall" name="id_editor"/>
+ <button label="Mostra segnali luminosi" name="show_beacon_btn"/>
<text name="obj_name_text">
Nome dell&apos;oggetto:
</text>
- <line_editor font="SansSerifSmall" left="90" name="object_name_editor" width="280"/>
- <button label="Filtro" name="filter_object_btn" width="150"/>
+ <line_editor font="SansSerifSmall" name="object_name_editor"/>
+ <button label="Filtro" name="filter_object_btn"/>
<text name="owner_name_text">
Proprietario:
</text>
diff --git a/indra/newview/skins/default/xui/it/floater_toybox.xml b/indra/newview/skins/default/xui/it/floater_toybox.xml
new file mode 100644
index 0000000000..269e2831d0
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_toybox.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Toybox" title="PULSANTI BARRA STRUMENTI">
+ <text name="toybox label 1">
+ Aggiungere o rimuovere pulsanti trascinandoli dentro o fuori dalle barre strumenti.
+ </text>
+ <text name="toybox label 2">
+ I pulsanti verranno visualizzati come mostrato o solo come icone, a seconda delle impostazioni della singola barra degli strumenti.
+ </text>
+ <button label="Cancella tutte le barre strumenti" label_selected="Cancella tutte le barre strumenti" name="btn_clear_all"/>
+ <button label="Ripristina predefiniti" label_selected="Ripristina predefiniti" name="btn_restore_defaults"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_translation_settings.xml b/indra/newview/skins/default/xui/it/floater_translation_settings.xml
new file mode 100644
index 0000000000..a0a34da723
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_translation_settings.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_translation_settings" title="IMPOSTAZIONI TRADUZIONE CHAT">
+ <string name="bing_api_key_not_verified">
+ appID Bing non verificato. Riprova.
+ </string>
+ <string name="google_api_key_not_verified">
+ Chiave API Google non verificata. Riprova.
+ </string>
+ <string name="bing_api_key_verified">
+ appID Bing verificato.
+ </string>
+ <string name="google_api_key_verified">
+ Chiave API Google verificata.
+ </string>
+ <check_box label="Usa la traduzione meccanica durante le chat" name="translate_chat_checkbox"/>
+ <text name="translate_language_label">
+ Traduci chat in:
+ </text>
+ <combo_box name="translate_language_combo">
+ <combo_box.item label="Predefinito di sistema" name="System Default Language"/>
+ <combo_box.item label="English (Inglese)" name="English"/>
+ <combo_box.item label="Dansk (Danese)" name="Danish"/>
+ <combo_box.item label="Deutsch (Tedesco)" name="German"/>
+ <combo_box.item label="Español (Spagnolo)" name="Spanish"/>
+ <combo_box.item label="Français (Francese)" name="French"/>
+ <combo_box.item label="Italiano" name="Italian"/>
+ <combo_box.item label="Magyar (Ungherese)" name="Hungarian"/>
+ <combo_box.item label="Nederlands (Olandese)" name="Dutch"/>
+ <combo_box.item label="Polski (Polacco)" name="Polish"/>
+ <combo_box.item label="Português (Portoghese)" name="Portugese"/>
+ <combo_box.item label="РуÑÑкий (Russo)" name="Russian"/>
+ <combo_box.item label="Türkçe (Turco)" name="Turkish"/>
+ <combo_box.item label="УкраїнÑька (Ucraino)" name="Ukrainian"/>
+ <combo_box.item label="中文 (正體) (Cinese)" name="Chinese"/>
+ <combo_box.item label="日本語 (Giapponese)" name="Japanese"/>
+ <combo_box.item label="한국어 (Coreano)" name="Korean"/>
+ </combo_box>
+ <text name="tip">
+ Seleziona il servizio di traduzione:
+ </text>
+ <radio_group name="translation_service_rg">
+ <radio_item initial_value="bing" label="Bing Translator" name="bing"/>
+ <radio_item initial_value="google" label="Google Translate" name="google"/>
+ </radio_group>
+ <text name="bing_api_key_label">
+ Bing [http://www.bing.com/developers/createapp.aspx AppID]:
+ </text>
+ <button label="Verifica" name="verify_bing_api_key_btn"/>
+ <text name="google_api_key_label">
+ Google [http://code.google.com/apis/language/translate/v2/getting_started.html#auth API key]:
+ </text>
+ <button label="Verifica" name="verify_google_api_key_btn"/>
+ <text name="google_links_text">
+ [http://code.google.com/apis/language/translate/v2/pricing.html Prezzi] | [https://code.google.com/apis/console Statistiche]
+ </text>
+ <button label="OK" name="ok_btn"/>
+ <button label="Annulla" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_voice_controls.xml b/indra/newview/skins/default/xui/it/floater_voice_controls.xml
index 4741d8d32f..77973eef1e 100644
--- a/indra/newview/skins/default/xui/it/floater_voice_controls.xml
+++ b/indra/newview/skins/default/xui/it/floater_voice_controls.xml
@@ -1,16 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_voice_controls" title="Regolazione voce">
+<floater name="floater_voice_controls" title="CONTROLLI VOCE">
<string name="title_nearby">
- VOCE NEI DINTORNI
+ IMPOSTAZIONI VOCE
</string>
<string name="title_group">
- Chiamata di gruppo con [GROUP]
+ CHIAMATA DI GRUPPO CON [GROUP]
</string>
<string name="title_adhoc">
- Chiamata in conferenza
+ CHIAMATA IN CONFERENZA
</string>
<string name="title_peer_2_peer">
- Chiamata con [NAME]
+ CHIAMATA CON [NAME]
</string>
<string name="no_one_near">
Nessuno nei dintorni ha attivato la funzione voce
@@ -19,12 +19,12 @@
<layout_panel name="my_panel">
<text name="user_text" value="Il mio avatar:"/>
</layout_panel>
- <layout_panel name="leave_call_panel">
- <layout_stack name="voice_effect_and_leave_call_stack">
+ <layout_panel name="leave_call_panel">
+ <layout_stack name="voice_effect_and_leave_call_stack">
<layout_panel name="leave_call_btn_panel">
<button label="Abbandona chiamata" name="leave_call_btn"/>
</layout_panel>
</layout_stack>
- </layout_panel>
+ </layout_panel>
</layout_stack>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_voice_effect.xml b/indra/newview/skins/default/xui/it/floater_voice_effect.xml
index 4c440c45b6..c83b11f698 100644
--- a/indra/newview/skins/default/xui/it/floater_voice_effect.xml
+++ b/indra/newview/skins/default/xui/it/floater_voice_effect.xml
@@ -12,6 +12,135 @@
<string name="new_voice_effect">
(Nuovo!)
</string>
+ <string name="effect_Arena">
+ Arena
+ </string>
+ <string name="effect_Beast">
+ Bestia
+ </string>
+ <string name="effect_Buff">
+ Appassionato
+ </string>
+ <string name="effect_Buzz">
+ Euforia
+ </string>
+ <string name="effect_Camille">
+ Camilla
+ </string>
+ <string name="effect_Creepy">
+ Terrificante
+ </string>
+ <string name="effect_CreepyBot">
+ TerrificanteBot
+ </string>
+ <string name="effect_Cyber">
+ Cyber
+ </string>
+ <string name="effect_DeepBot">
+ ProfondoBot
+ </string>
+ <string name="effect_Demon">
+ Demonio
+ </string>
+ <string name="effect_Female Elf">
+ Elfo donna
+ </string>
+ <string name="effect_Flirty">
+ Civettuolo
+ </string>
+ <string name="effect_Foxy">
+ Scaltro
+ </string>
+ <string name="effect_Halloween 2010 Bonus">
+ Halloween_2010_Bonus
+ </string>
+ <string name="effect_Helium">
+ Elio
+ </string>
+ <string name="effect_Husky">
+ Fusto
+ </string>
+ <string name="effect_Husky Whisper">
+ Sospiro rauco
+ </string>
+ <string name="effect_Intercom">
+ Interfono
+ </string>
+ <string name="effect_Julia">
+ Julia
+ </string>
+ <string name="effect_Lo Lilt">
+ Inflessione bassa
+ </string>
+ <string name="effect_Macho">
+ Macho
+ </string>
+ <string name="effect_Micro">
+ Micro
+ </string>
+ <string name="effect_Mini">
+ Mini
+ </string>
+ <string name="effect_Model">
+ Modella
+ </string>
+ <string name="effect_Nano">
+ Nano
+ </string>
+ <string name="effect_Nightmare">
+ Incubo
+ </string>
+ <string name="effect_PopBot">
+ PopBot
+ </string>
+ <string name="effect_Rachel">
+ Rachele
+ </string>
+ <string name="effect_Radio">
+ Radio
+ </string>
+ <string name="effect_Robot">
+ Robot
+ </string>
+ <string name="effect_Roxanne">
+ Rosanna
+ </string>
+ <string name="effect_Rumble">
+ Rombo
+ </string>
+ <string name="effect_Sabrina">
+ Sabrina
+ </string>
+ <string name="effect_Samantha">
+ Samanta
+ </string>
+ <string name="effect_Sexy">
+ Sexy
+ </string>
+ <string name="effect_Shorty">
+ Bassotto
+ </string>
+ <string name="effect_Smaller">
+ Più piccolo
+ </string>
+ <string name="effect_Sneaky">
+ Vile
+ </string>
+ <string name="effect_Stallion">
+ Stallone
+ </string>
+ <string name="effect_Sultry">
+ Focoso
+ </string>
+ <string name="effect_Thunder">
+ Tuono
+ </string>
+ <string name="effect_Vixen">
+ Maliziosa
+ </string>
+ <string name="effect_WhinyBot">
+ PiangiBot
+ </string>
<text name="preview_text">
Per l&apos;anteprima
</text>
diff --git a/indra/newview/skins/default/xui/it/floater_water.xml b/indra/newview/skins/default/xui/it/floater_water.xml
deleted file mode 100644
index c6ab646fbf..0000000000
--- a/indra/newview/skins/default/xui/it/floater_water.xml
+++ /dev/null
@@ -1,95 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Water Floater" title="EDITOR AVANZATO DELL&apos;ACQUA">
- <text name="KeyFramePresetsText" width="224">
- Impostazioni predeterminate dell&apos;acqua:
- </text>
- <combo_box left_delta="230" name="WaterPresetsCombo" width="150"/>
- <button label="Nuovo" label_selected="Nuovo" name="WaterNewPreset"/>
- <button label="Salva" label_selected="Salva" name="WaterSavePreset"/>
- <button label="Cancella" label_selected="Cancella" name="WaterDeletePreset"/>
- <tab_container name="Water Tabs">
- <panel label="IMPOSTAZIONI" name="Settings">
- <text name="BHText">
- Colore della nebbiosità dell&apos;acqua
- </text>
- <button label="?" left="209" name="WaterFogColorHelp"/>
- <color_swatch label="" name="WaterFogColor" tool_tip="Clicca per aprire il selettore dei colori"/>
- <text font="SansSerifSmall" name="WaterFogDensText">
- Esponente di densità della nebbia
- dell&apos;acqua
- </text>
- <slider bottom_delta="-40" name="WaterFogDensity"/>
- <button label="?" left="209" name="WaterFogDensityHelp"/>
- <text bottom="-140" font="SansSerifSmall" name="WaterUnderWaterFogModText">
- Regolatore effetto nebbia subacquea
- </text>
- <button label="?" left="209" name="WaterUnderWaterFogModHelp"/>
- <text name="BDensText">
- Scala di riflessione delle onde
- </text>
- <button label="?" left="415" name="WaterNormalScaleHelp"/>
- <text name="BHText2">
- 1
- </text>
- <text name="BHText3">
- 2
- </text>
- <text name="BHText4">
- 3
- </text>
- <text name="HDText">
- Scala Fresnel
- </text>
- <button label="?" left="415" name="WaterFresnelScaleHelp"/>
- <text name="FresnelOffsetText">
- Offset Fresnel
- </text>
- <button label="?" left="415" name="WaterFresnelOffsetHelp"/>
- <text font="SansSerifSmall" name="DensMultText">
- Scala di rifrazione nell&apos;acqua
- dall&apos;alto
- </text>
- <slider bottom_delta="-40" name="WaterScaleAbove"/>
- <button label="?" left="650" name="WaterScaleAboveHelp"/>
- <text bottom="-70" font="SansSerifSmall" name="WaterScaleBelowText">
- Scala di rifrazione nell&apos;acqua
- dal basso
- </text>
- <slider bottom_delta="-40" name="WaterScaleBelow"/>
- <button label="?" left="650" name="WaterScaleBelowHelp"/>
- <text bottom="-122" name="MaxAltText">
- Moltiplicatore della sfocatura
- </text>
- <button label="?" left="650" name="WaterBlurMultiplierHelp"/>
- </panel>
- <panel label="IMMAGINE" name="Waves">
- <text name="BHText">
- Direzione della grande onda
- </text>
- <button label="?" left="170" name="WaterWave1Help"/>
- <text name="WaterWave1DirXText">
- X
- </text>
- <text name="WaterWave1DirYText">
- Y
- </text>
- <text name="BHText2">
- Direzione della piccola onda
- </text>
- <button label="?" left="170" name="WaterWave2Help"/>
- <text name="WaterWave2DirXText">
- X
- </text>
- <text name="WaterWave2DirYText">
- Y
- </text>
- <text name="BHText3">
- Mappatura normale
- </text>
- <button label="?" name="WaterNormalMapHelp"/>
- </panel>
- </tab_container>
- <string name="WLDefaultWaterNames">
- Default:Glassy:Pond:Murky:Second Plague:SNAKE!!!:Valdez
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_web_content.xml b/indra/newview/skins/default/xui/it/floater_web_content.xml
new file mode 100644
index 0000000000..5603e85417
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_web_content.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_web_content" title="">
+ <layout_stack name="stack1">
+ <layout_panel name="nav_controls">
+ <button name="back" tool_tip="Naviga indietro"/>
+ <button name="forward" tool_tip="Naviga avanti"/>
+ <button name="stop" tool_tip="Interrompi navigazione"/>
+ <button name="reload" tool_tip="Ricarica pagina"/>
+ <combo_box name="address" tool_tip="Inserisci URL qui"/>
+ <icon name="media_secure_lock_flag" tool_tip="Navigazione sicura"/>
+ <button name="popexternal" tool_tip="Apri URL corrente nel browser del computer"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_windlight_options.xml b/indra/newview/skins/default/xui/it/floater_windlight_options.xml
deleted file mode 100644
index 1f6f0fab58..0000000000
--- a/indra/newview/skins/default/xui/it/floater_windlight_options.xml
+++ /dev/null
@@ -1,189 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="WindLight floater" title="EDITOR AVANZATO DEL CIELO">
- <text name="KeyFramePresetsText">
- Cieli predefiniti:
- </text>
- <button label="Nuovo" label_selected="Nuovo" name="WLNewPreset"/>
- <button label="Salva" label_selected="Salva" left_delta="72" name="WLSavePreset"/>
- <button label="Elimina" label_selected="Elimina" left_delta="72" name="WLDeletePreset"/>
- <button font="SansSerifSmall" label="Editor del ciclo giorno/notte" label_selected="Editor del ciclo giorno/notte" left_delta="85" name="WLDayCycleMenuButton" width="165"/>
- <tab_container name="WindLight Tabs">
- <panel label="ATMOSFERA" name="Atmosphere">
- <text name="BHText">
- Blu dell&apos;Orizzonte
- </text>
- <button label="?" left="189" name="WLBlueHorizonHelp"/>
- <text name="BHText2">
- R
- </text>
- <text name="BHText3">
- G
- </text>
- <text name="BHText4">
- B
- </text>
- <text name="BHText5">
- I
- </text>
- <text font="SansSerifSmall" name="BDensText">
- Altezza della Foschia all&apos;Orizzonte
- </text>
- <button label="?" left="189" name="WLHazeHorizonHelp"/>
- <text name="BDensText2">
- Densità del Blu
- </text>
- <button label="?" name="WLBlueDensityHelp"/>
- <text name="BHText6">
- R
- </text>
- <text name="BHText7">
- G
- </text>
- <text name="BHText8">
- B
- </text>
- <text name="BHText9">
- I
- </text>
- <text name="HDText">
- Densità  della Foschia
- </text>
- <button label="?" name="WLHazeDensityHelp"/>
- <text name="DensMultText">
- Moltiplicatore di Densità
- </text>
- <button label="?" left="645" name="WLDensityMultHelp"/>
- <text name="WLDistanceMultText">
- Moltiplicatore della Distanza
- </text>
- <button label="?" left="645" name="WLDistanceMultHelp"/>
- <text name="MaxAltText">
- Altitudine Massima
- </text>
- <button label="?" left="645" name="WLMaxAltitudeHelp"/>
- </panel>
- <panel label="ILLUMINAZIONE" name="Lighting">
- <text name="SLCText">
- Colore Sole/Luna
- </text>
- <button label="?" name="WLSunlightColorHelp"/>
- <text name="BHText">
- R
- </text>
- <text name="BHText2">
- G
- </text>
- <text name="BHText3">
- B
- </text>
- <text name="BHText4">
- I
- </text>
- <text name="TODText">
- Posizione Sole/Luna
- </text>
- <button label="?" name="WLTimeOfDayHelp"/>
- <text name="WLAmbientText">
- Ambiente
- </text>
- <button label="?" name="WLAmbientHelp"/>
- <text name="BHText5">
- R
- </text>
- <text name="BHText6">
- G
- </text>
- <text name="BHText7">
- B
- </text>
- <text name="BHText8">
- I
- </text>
- <text name="WLEastAngleText">
- Angolo Est
- </text>
- <button label="?" name="WLEastAngleHelp"/>
- <text name="SunGlowText">
- Corona intorno al sole
- </text>
- <button label="?" name="WLSunGlowHelp"/>
- <slider label="Focus" name="WLGlowB"/>
- <slider label="Grandezza" name="WLGlowR"/>
- <text name="SceneGammaText">
- Gamma della Scena
- </text>
- <button label="?" name="WLSceneGammaHelp"/>
- <text name="WLStarText">
- Luminosità  delle stelle
- </text>
- <button label="?" name="WLStarBrightnessHelp"/>
- </panel>
- <panel label="NUVOLE" name="Clouds">
- <text name="WLCloudColorText">
- Colore delle Nuvole
- </text>
- <button label="?" name="WLCloudColorHelp"/>
- <text name="BHText">
- R
- </text>
- <text name="BHText2">
- G
- </text>
- <text name="BHText3">
- B
- </text>
- <text name="BHText4">
- I
- </text>
- <text name="WLCloudColorText2">
- Nuvole XY/Densità
- </text>
- <button label="?" name="WLCloudDensityHelp"/>
- <text name="BHText5">
- X
- </text>
- <text name="BHText6">
- Y
- </text>
- <text name="BHText7">
- D
- </text>
- <text name="WLCloudCoverageText">
- Copertura delle Nuvole
- </text>
- <button label="?" left="415" name="WLCloudCoverageHelp"/>
- <text name="WLCloudScaleText">
- Altitudine delle Nuvole
- </text>
- <button label="?" left="415" name="WLCloudScaleHelp"/>
- <text name="WLCloudDetailText">
- Dettagli Nuvole (XY/ Densità)
- </text>
- <button label="?" left="415" name="WLCloudDetailHelp"/>
- <text name="BHText8">
- X
- </text>
- <text name="BHText9">
- Y
- </text>
- <text name="BHText10">
- D
- </text>
- <text name="WLCloudScrollXText">
- Scorrimento delle X
- </text>
- <button label="?" name="WLCloudScrollXHelp"/>
- <check_box label="Blocca" name="WLCloudLockX"/>
- <text name="WLCloudScrollYText">
- Scorrimento delle Y
- </text>
- <button label="?" name="WLCloudScrollYHelp"/>
- <check_box label="Blocca" name="WLCloudLockY"/>
- <check_box label="Mostra le Nuvole Classiche" name="DrawClassicClouds"/>
- <button label="?" left="645" name="WLClassicCloudsHelp"/>
- </panel>
- </tab_container>
- <string name="WLDefaultSkyNames">
- A-12AM:A-12PM:A-3AM:A-3PM:A-4.30PM:A-6AM:A-6PM:A-9AM:A-9PM:Barcelona:Blizzard:Blue Midday:Coastal Afternoon:Coastal Sunset:Default:Desert Sunset:Fine Day:Fluffy Big Clouds:Foggy:Funky Funky:Funky Funky Funky:Gelatto:Ghost:Incongruent Truths:Midday 1:Midday 2:Midday 3:Midday 4:Night:Pirate:Purple:Sailor&apos;s Delight:Sheer Sensuality
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/it/inspect_avatar.xml b/indra/newview/skins/default/xui/it/inspect_avatar.xml
index ec5561a5b2..6f52aaef74 100644
--- a/indra/newview/skins/default/xui/it/inspect_avatar.xml
+++ b/indra/newview/skins/default/xui/it/inspect_avatar.xml
@@ -10,6 +10,11 @@
<string name="Details">
[SL_PROFILE]
</string>
+ <text name="user_name_small" value="Grumpity ProductEngine con un nome lungo"/>
+ <text name="user_slid" value="james.linden"/>
+ <text name="user_details">
+ Questa è la mia descrizione in second life e penso che sia perfetta. Ma per qualche motivo la mia descrizione è davvero molto lunga, perché mi piace parlare a lungo
+ </text>
<slider name="volume_slider" tool_tip="Volume voce" value="0.5"/>
<button label="Aggiungi amico" name="add_friend_btn"/>
<button label="IM" name="im_btn"/>
diff --git a/indra/newview/skins/default/xui/it/language_settings.xml b/indra/newview/skins/default/xui/it/language_settings.xml
index 312b8e21aa..5f448fa828 100644
--- a/indra/newview/skins/default/xui/it/language_settings.xml
+++ b/indra/newview/skins/default/xui/it/language_settings.xml
@@ -4,6 +4,7 @@
<!-- Locale Information -->
<string name="MicrosoftLocale">italian</string>
+ <string name="MacLocale">it_IT.UTF-8</string>
<string name="DarwinLocale">it_IT.UTF-8</string>
<string name="LinuxLocale">it_IT.UTF-8</string>
diff --git a/indra/newview/skins/default/xui/it/menu_attachment_self.xml b/indra/newview/skins/default/xui/it/menu_attachment_self.xml
index 489d6af1d7..0b841d591f 100644
--- a/indra/newview/skins/default/xui/it/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/it/menu_attachment_self.xml
@@ -5,7 +5,7 @@
<menu_item_call label="Stacca" name="Detach"/>
<menu_item_call label="Siedi" name="Sit Down Here"/>
<menu_item_call label="Alzati" name="Stand Up"/>
- <menu_item_call label="Cambia vestiario" name="Change Outfit"/>
+ <menu_item_call label="Il mio aspetto" name="Change Outfit"/>
<menu_item_call label="Modifica il mio vestiario" name="Edit Outfit"/>
<menu_item_call label="Modifica la figura corporea" name="Edit My Shape"/>
<menu_item_call label="I miei amici..." name="Friends..."/>
diff --git a/indra/newview/skins/default/xui/it/menu_avatar_self.xml b/indra/newview/skins/default/xui/it/menu_avatar_self.xml
index 977503dace..a4dafd7b5f 100644
--- a/indra/newview/skins/default/xui/it/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/it/menu_avatar_self.xml
@@ -14,6 +14,7 @@
<menu_item_call label="Maglietta intima" name="Self Undershirt"/>
<menu_item_call label="Slip" name="Self Underpants"/>
<menu_item_call label="Tatuaggio" name="Self Tattoo"/>
+ <menu_item_call label="Fisica" name="Self Physics"/>
<menu_item_call label="Alpha (Trasparenza)" name="Self Alpha"/>
<menu_item_call label="Tutti gli abiti" name="All Clothes"/>
</context_menu>
@@ -21,7 +22,7 @@
<context_menu label="Stacca" name="Object Detach"/>
<menu_item_call label="Stacca tutto" name="Detach All"/>
</context_menu>
- <menu_item_call label="Cambia vestiario" name="Chenge Outfit"/>
+ <menu_item_call label="Il mio aspetto" name="Chenge Outfit"/>
<menu_item_call label="Modifica il mio vestiario" name="Edit Outfit"/>
<menu_item_call label="Modifica la figura corporea" name="Edit My Shape"/>
<menu_item_call label="I miei amici..." name="Friends..."/>
diff --git a/indra/newview/skins/default/xui/it/menu_bottomtray.xml b/indra/newview/skins/default/xui/it/menu_bottomtray.xml
index 8ca5b24b48..ddd6909136 100644
--- a/indra/newview/skins/default/xui/it/menu_bottomtray.xml
+++ b/indra/newview/skins/default/xui/it/menu_bottomtray.xml
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="hide_camera_move_controls_menu">
+ <menu_item_check label="Pulsante Parla" name="EnableVoiceChat"/>
<menu_item_check label="Tasto Gesture" name="ShowGestureButton"/>
<menu_item_check label="Tasto Movimento" name="ShowMoveButton"/>
<menu_item_check label="Tasto Visuale" name="ShowCameraButton"/>
<menu_item_check label="Tasto Foto" name="ShowSnapshotButton"/>
- <menu_item_check label="Pulsante barra laterale" name="ShowSidebarButton"/>
<menu_item_check label="Pulsante Costruisci" name="ShowBuildButton"/>
<menu_item_check label="Pulsante Cerca" name="ShowSearchButton"/>
<menu_item_check label="Pulsante Mappa" name="ShowWorldMapButton"/>
diff --git a/indra/newview/skins/default/xui/it/menu_hide_navbar.xml b/indra/newview/skins/default/xui/it/menu_hide_navbar.xml
index 2c2c6c4bc5..48f6691fd8 100644
--- a/indra/newview/skins/default/xui/it/menu_hide_navbar.xml
+++ b/indra/newview/skins/default/xui/it/menu_hide_navbar.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="hide_navbar_menu">
- <menu_item_check label="Mostra la barra di navigazione" name="ShowNavbarNavigationPanel"/>
+ <menu_item_check label="Mostra navigazione e barra dei Preferiti" name="ShowNavbarNavigationPanel"/>
<menu_item_check label="Mostra la barra dei Preferiti" name="ShowNavbarFavoritesPanel"/>
<menu_item_check label="Mostra mini barra del luogo" name="ShowMiniLocationPanel"/>
</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/it/menu_inspect_avatar_gear.xml
index 22a37d7095..1f10734c4a 100644
--- a/indra/newview/skins/default/xui/it/menu_inspect_avatar_gear.xml
+++ b/indra/newview/skins/default/xui/it/menu_inspect_avatar_gear.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<menu name="Gear Menu">
+<toggleable_menu name="Gear Menu">
<menu_item_call label="Vedi profilo" name="view_profile"/>
<menu_item_call label="Aggiungi amico" name="add_friend"/>
<menu_item_call label="IM" name="im"/>
@@ -11,9 +11,11 @@
<menu_item_call label="Segnala" name="report"/>
<menu_item_call label="Congela" name="freeze"/>
<menu_item_call label="Espelli" name="eject"/>
+ <menu_item_call label="Espelli" name="kick"/>
+ <menu_item_call label="CSR" name="csr"/>
<menu_item_call label="Debug delle texture" name="debug"/>
<menu_item_call label="Trova sulla mappa" name="find_on_map"/>
<menu_item_call label="Zoom avanti" name="zoom_in"/>
<menu_item_call label="Paga" name="pay"/>
<menu_item_call label="Condividi" name="share"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_inspect_object_gear.xml b/indra/newview/skins/default/xui/it/menu_inspect_object_gear.xml
index ede4a507c0..4740c9bf67 100644
--- a/indra/newview/skins/default/xui/it/menu_inspect_object_gear.xml
+++ b/indra/newview/skins/default/xui/it/menu_inspect_object_gear.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<menu name="Gear Menu">
+<toggleable_menu name="Gear Menu">
<menu_item_call label="Tocca" name="touch"/>
<menu_item_call label="Siediti" name="sit"/>
<menu_item_call label="Paga" name="pay"/>
@@ -12,7 +12,8 @@
<menu_item_call label="Aggiungi" name="add"/>
<menu_item_call label="Segnala" name="report"/>
<menu_item_call label="Blocca" name="block"/>
+ <menu_item_call label="Sblocca" name="unblock"/>
<menu_item_call label="Zoom avanti" name="zoom_in"/>
<menu_item_call label="Rimuovi" name="remove"/>
<menu_item_call label="Maggiori informazioni" name="more_info"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/it/menu_inspect_self_gear.xml
index 8b4ed607e7..4f62ccaa9c 100644
--- a/indra/newview/skins/default/xui/it/menu_inspect_self_gear.xml
+++ b/indra/newview/skins/default/xui/it/menu_inspect_self_gear.xml
@@ -1,10 +1,31 @@
-<?xml version="1.0" encoding="utf-8"?>
-<menu name="Gear Menu">
- <menu_item_call label="Siedi" name="sit_down_here"/>
- <menu_item_call label="Alzati" name="stand_up"/>
- <menu_item_call label="Cambia vestiario" name="change_outfit"/>
- <menu_item_call label="Il mio profilo" name="my_profile"/>
- <menu_item_call label="I miei amici..." name="my_friends"/>
- <menu_item_call label="I miei gruppi" name="my_groups"/>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Gear Menu">
+ <menu_item_call label="Siedi" name="Sit Down Here"/>
+ <menu_item_call label="Alzati" name="Stand Up"/>
+ <context_menu label="Togli" name="Take Off &gt;">
+ <context_menu label="Abiti" name="Clothes &gt;">
+ <menu_item_call label="Camicia" name="Shirt"/>
+ <menu_item_call label="Pantaloni" name="Pants"/>
+ <menu_item_call label="Gonna" name="Skirt"/>
+ <menu_item_call label="Scarpe" name="Shoes"/>
+ <menu_item_call label="Calzini" name="Socks"/>
+ <menu_item_call label="Giacca" name="Jacket"/>
+ <menu_item_call label="Guanti" name="Gloves"/>
+ <menu_item_call label="Maglietta intima" name="Self Undershirt"/>
+ <menu_item_call label="Slip" name="Self Underpants"/>
+ <menu_item_call label="Tatuaggio" name="Self Tattoo"/>
+ <menu_item_call label="Alpha (Trasparenza)" name="Self Alpha"/>
+ <menu_item_call label="Tutti gli abiti" name="All Clothes"/>
+ </context_menu>
+ <context_menu label="HUD" name="Object Detach HUD"/>
+ <context_menu label="Stacca" name="Object Detach"/>
+ <menu_item_call label="Stacca tutto" name="Detach All"/>
+ </context_menu>
+ <menu_item_call label="Cambia vestiario" name="Chenge Outfit"/>
+ <menu_item_call label="Modifica il mio vestiario" name="Edit Outfit"/>
+ <menu_item_call label="Modifica la figura corporea" name="Edit My Shape"/>
+ <menu_item_call label="I miei amici" name="Friends..."/>
+ <menu_item_call label="I miei gruppi" name="Groups..."/>
+ <menu_item_call label="Il mio profilo" name="Profile..."/>
<menu_item_call label="Debug delle texture" name="Debug..."/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_inventory.xml b/indra/newview/skins/default/xui/it/menu_inventory.xml
index f2eb8b1bf7..4bf6be82fd 100644
--- a/indra/newview/skins/default/xui/it/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/it/menu_inventory.xml
@@ -25,6 +25,7 @@
<menu_item_call label="Nuove mutande" name="New Underpants"/>
<menu_item_call label="Nuovo Alfa Mask" name="New Alpha Mask"/>
<menu_item_call label="Nuovo tatuaggio" name="New Tattoo"/>
+ <menu_item_call label="Nuova fisica" name="New Physics"/>
</menu>
<menu label="Nuove parti del corpo" name="New Body Parts">
<menu_item_call label="Nuova forma del corpo" name="New Shape"/>
@@ -58,6 +59,7 @@
<menu_item_call label="Proprietà" name="Properties"/>
<menu_item_call label="Rinomina" name="Rename"/>
<menu_item_call label="Copia UUID dell&apos;oggetto" name="Copy Asset UUID"/>
+ <menu_item_call label="Taglia" name="Cut"/>
<menu_item_call label="Copia" name="Copy"/>
<menu_item_call label="Incolla" name="Paste"/>
<menu_item_call label="Incolla come link" name="Paste As Link"/>
@@ -82,5 +84,7 @@
<menu_item_call label="Modifica" name="Wearable Edit"/>
<menu_item_call label="Aggiungi" name="Wearable Add"/>
<menu_item_call label="Togli" name="Take Off"/>
+ <menu_item_call label="Copia nella casella venditore in uscita" name="Merchant Copy"/>
+ <menu_item_call label="Invia a Marketplace" name="Marketplace Send"/>
<menu_item_call label="--nessuna opzione--" name="--no options--"/>
</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_inventory_add.xml b/indra/newview/skins/default/xui/it/menu_inventory_add.xml
index 5e61625f84..62da61cd6b 100644
--- a/indra/newview/skins/default/xui/it/menu_inventory_add.xml
+++ b/indra/newview/skins/default/xui/it/menu_inventory_add.xml
@@ -4,6 +4,8 @@
<menu_item_call label="Immagine ([COST]L$)..." name="Upload Image"/>
<menu_item_call label="Suono ([COST]L$)..." name="Upload Sound"/>
<menu_item_call label="Animazione ([COST]L$)..." name="Upload Animation"/>
+ <menu_item_call label="Modella..." name="Upload Model"/>
+ <menu_item_call label="Procedura guidata modellazione..." name="Upload Model Wizard"/>
<menu_item_call label="In blocco ([COST]L$ per file)..." name="Bulk Upload"/>
<menu_item_call label="Definisci diritti di caricamento predefiniti" name="perm prefs"/>
</menu>
@@ -23,6 +25,7 @@
<menu_item_call label="Nuovi slip" name="New Underpants"/>
<menu_item_call label="Nuovo Alfa (trasparenza)" name="New Alpha"/>
<menu_item_call label="Nuovo tatuaggio" name="New Tattoo"/>
+ <menu_item_call label="Nuova fisica" name="New Physics"/>
</menu>
<menu label="Nuove parti del corpo" name="New Body Parts">
<menu_item_call label="Nuova figura corporea" name="New Shape"/>
diff --git a/indra/newview/skins/default/xui/it/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/it/menu_inventory_gear_default.xml
index 9f1b413276..3d64e4da4e 100644
--- a/indra/newview/skins/default/xui/it/menu_inventory_gear_default.xml
+++ b/indra/newview/skins/default/xui/it/menu_inventory_gear_default.xml
@@ -1,8 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_gear_default">
+<toggleable_menu name="menu_gear_default">
<menu_item_call label="Nuova finestra inventario" name="new_window"/>
- <menu_item_call label="Ordina in base al nome" name="sort_by_name"/>
- <menu_item_call label="Mostra prima i più recenti" name="sort_by_recent"/>
+ <menu_item_check label="Ordina in base al nome" name="sort_by_name"/>
+ <menu_item_check label="Mostra prima i più recenti" name="sort_by_recent"/>
+ <menu_item_check label="Ordina le cartelle sempre in base al nome" name="sort_folders_by_name"/>
+ <menu_item_check label="Ordina cartelle di sistema all&apos;inizio" name="sort_system_folders_to_top"/>
<menu_item_call label="Mostra filtri" name="show_filters"/>
<menu_item_call label="Ripristina filtri" name="reset_filters"/>
<menu_item_call label="Chiudi tutte le cartelle" name="close_folders"/>
@@ -12,4 +14,4 @@
<menu_item_call label="Trova originale" name="Find Original"/>
<menu_item_call label="Trova tutti i link" name="Find All Links"/>
<menu_item_call label="Svuota cestino" name="empty_trash"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_login.xml b/indra/newview/skins/default/xui/it/menu_login.xml
index 0a6d803058..7b060e6565 100644
--- a/indra/newview/skins/default/xui/it/menu_login.xml
+++ b/indra/newview/skins/default/xui/it/menu_login.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu_bar name="Login Menu">
<menu label="Io" name="File">
- <menu_item_call label="Preferenze" name="Preferences..."/>
+ <menu_item_call label="Preferenze..." name="Preferences..."/>
<menu_item_call label="Esci da [APP_NAME]" name="Quit"/>
</menu>
<menu label="Aiuto" name="Help">
@@ -16,7 +16,8 @@
<menu_item_call label="Imposta dimensioni della finestra..." name="Set Window Size..."/>
<menu_item_call label="Mostra i Termini del servizio (TOS)" name="TOS"/>
<menu_item_call label="Mostra messaggio critico" name="Critical"/>
- <menu_item_call label="Test browser Web" name="Web Browser Test"/>
+ <menu_item_call label="Test debug finestra contenuti Web" name="Web Content Floater Debug Test"/>
+ <menu label="Imposta livello di registrazione" name="Set Logging Level"/>
<menu_item_check label="Mostra selettore griglia" name="Show Grid Picker"/>
<menu_item_call label="Mostra Console notifiche" name="Show Notifications Console"/>
</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_media_ctrl.xml b/indra/newview/skins/default/xui/it/menu_media_ctrl.xml
new file mode 100644
index 0000000000..aa9e583f8e
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_media_ctrl.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="media ctrl context menu">
+ <menu_item_call label="Taglia" name="Cut"/>
+ <menu_item_call label="Copia" name="Copy"/>
+ <menu_item_call label="Incolla" name="Paste"/>
+ <menu_item_call label="Strumento ispezione Web aperto" name="open_webinspector"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_mini_map.xml b/indra/newview/skins/default/xui/it/menu_mini_map.xml
index ecc2bef06a..561b80e046 100644
--- a/indra/newview/skins/default/xui/it/menu_mini_map.xml
+++ b/indra/newview/skins/default/xui/it/menu_mini_map.xml
@@ -3,6 +3,7 @@
<menu_item_call label="Zoom ravvicinato" name="Zoom Close"/>
<menu_item_call label="Zoom Medio" name="Zoom Medium"/>
<menu_item_call label="Zoom Distante" name="Zoom Far"/>
+ <menu_item_call label="Zoom predefinito" name="Zoom Default"/>
<menu_item_check label="Ruota la mappa" name="Rotate Map"/>
<menu_item_check label="Centra automaticamente" name="Auto Center"/>
<menu_item_call label="Ferma il puntamento" name="Stop Tracking"/>
diff --git a/indra/newview/skins/default/xui/it/menu_mode_change.xml b/indra/newview/skins/default/xui/it/menu_mode_change.xml
new file mode 100644
index 0000000000..499dcf1873
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_mode_change.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Mode Change">
+ <menu_item_check label="Di base" name="BasicMode"/>
+ <menu_item_check label="Avanzata" name="AdvancedMode"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_model_import_gear_default.xml b/indra/newview/skins/default/xui/it/menu_model_import_gear_default.xml
new file mode 100644
index 0000000000..5012e6450f
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_model_import_gear_default.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="model_menu_gear_default">
+ <menu_item_check label="Mostra bordi" name="show_edges"/>
+ <menu_item_check label="Mostra fisica" name="show_physics"/>
+ <menu_item_check label="Mostra texture" name="show_textures"/>
+ <menu_item_check label="Mostra peso pelle" name="show_skin_weight"/>
+ <menu_item_check label="Mostra posizioni giunti" name="show_joint_positions"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_object.xml b/indra/newview/skins/default/xui/it/menu_object.xml
index 4c7402ea08..a172cf3b26 100644
--- a/indra/newview/skins/default/xui/it/menu_object.xml
+++ b/indra/newview/skins/default/xui/it/menu_object.xml
@@ -16,14 +16,14 @@
<context_menu label="Attacca" name="Object Attach"/>
<context_menu label="Attacca HUD" name="Object Attach HUD"/>
</context_menu>
- <context_menu label="Rimuovi" name="Remove">
+ <context_menu label="Gestisci" name="Remove">
<menu_item_call label="Segnala abuso" name="Report Abuse..."/>
<menu_item_call label="Blocca" name="Object Mute"/>
<menu_item_call label="Restituisci" name="Return..."/>
- <menu_item_call label="Elimina" name="Delete"/>
</context_menu>
<menu_item_call label="Prendi" name="Pie Object Take"/>
<menu_item_call label="Prendi copia" name="Take Copy"/>
<menu_item_call label="Paga" name="Pay..."/>
<menu_item_call label="Acquista" name="Buy..."/>
+ <menu_item_call label="Elimina" name="Delete"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_outfit_gear.xml b/indra/newview/skins/default/xui/it/menu_outfit_gear.xml
index a02d4ad429..09fc867d7c 100644
--- a/indra/newview/skins/default/xui/it/menu_outfit_gear.xml
+++ b/indra/newview/skins/default/xui/it/menu_outfit_gear.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Gear Outfit">
+<toggleable_menu name="Gear Outfit">
<menu_item_call label="Indossa - Sostituisci vestiario attuale" name="wear"/>
<menu_item_call label="Indossa - Aggiungi al vestiario attuale" name="wear_add"/>
<menu_item_call label="Togli - Rimuovi dal vestiario attuale" name="take_off"/>
@@ -14,6 +14,7 @@
<menu_item_call label="Nuova maglietta intima" name="New Undershirt"/>
<menu_item_call label="Nuovi slip" name="New Underpants"/>
<menu_item_call label="Nuovo Alpha (trasparenza)" name="New Alpha"/>
+ <menu_item_call label="Nuova fisica" name="New Physics"/>
<menu_item_call label="Nuovo tatuaggio" name="New Tattoo"/>
</menu>
<menu label="Nuove parti del corpo" name="New Body Parts">
@@ -24,4 +25,4 @@
</menu>
<menu_item_call label="Cambia nome del vestiario" name="rename"/>
<menu_item_call label="Elimina vestito" name="delete_outfit"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_people_nearby_view_sort.xml b/indra/newview/skins/default/xui/it/menu_people_nearby_view_sort.xml
index aae2313702..2b5c235706 100644
--- a/indra/newview/skins/default/xui/it/menu_people_nearby_view_sort.xml
+++ b/indra/newview/skins/default/xui/it/menu_people_nearby_view_sort.xml
@@ -1,8 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
+<toggleable_menu name="menu_group_plus">
<menu_item_check label="Ordina in base a intervenuti recenti" name="sort_by_recent_speakers"/>
<menu_item_check label="Ordina in base al nome" name="sort_name"/>
<menu_item_check label="Ordina in base alla distanza" name="sort_distance"/>
<menu_item_check label="Icone persone" name="view_icons"/>
+ <menu_item_check label="Visualizza mappa" name="view_map"/>
<menu_item_call label="Mostra oggetti e residenti bloccati" name="show_blocked_list"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/it/menu_places_gear_folder.xml
index 59fbb86ddc..23757d47e0 100644
--- a/indra/newview/skins/default/xui/it/menu_places_gear_folder.xml
+++ b/indra/newview/skins/default/xui/it/menu_places_gear_folder.xml
@@ -1,7 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_folder_gear">
+<toggleable_menu name="menu_folder_gear">
<menu_item_call label="Aggiungi punto di riferimento" name="add_landmark"/>
<menu_item_call label="Aggiungi cartella" name="add_folder"/>
+ <menu_item_call label="Ripristina oggetto" name="restore_item"/>
<menu_item_call label="Taglia" name="cut"/>
<menu_item_call label="Copia" name="copy_folder"/>
<menu_item_call label="Incolla" name="paste"/>
@@ -12,4 +13,4 @@
<menu_item_call label="Apri tutte le cartelle" name="expand_all"/>
<menu_item_call label="Chiudi tutte le cartelle" name="collapse_all"/>
<menu_item_check label="Ordina in base alla data" name="sort_by_date"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/it/menu_places_gear_landmark.xml
index 32d7abc259..a458b1a768 100644
--- a/indra/newview/skins/default/xui/it/menu_places_gear_landmark.xml
+++ b/indra/newview/skins/default/xui/it/menu_places_gear_landmark.xml
@@ -1,10 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_ladmark_gear">
+<toggleable_menu name="menu_ladmark_gear">
<menu_item_call label="Teleport" name="teleport"/>
<menu_item_call label="Maggiori informazioni" name="more_info"/>
<menu_item_call label="Mostra sulla mappa" name="show_on_map"/>
<menu_item_call label="Aggiungi Punto di riferimento" name="add_landmark"/>
<menu_item_call label="Aggiungi cartella" name="add_folder"/>
+ <menu_item_call label="Ripristina oggetto" name="restore_item"/>
<menu_item_call label="Taglia" name="cut"/>
<menu_item_call label="Copia punto di riferimento" name="copy_landmark"/>
<menu_item_call label="Copia SLurl" name="copy_slurl"/>
@@ -15,4 +16,4 @@
<menu_item_call label="Chiudi tutte le cartelle" name="collapse_all"/>
<menu_item_check label="Ordina in base alla data" name="sort_by_date"/>
<menu_item_call label="Crea Luogo consigliato" name="create_pick"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_toolbars.xml b/indra/newview/skins/default/xui/it/menu_toolbars.xml
new file mode 100644
index 0000000000..604ca763d1
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_toolbars.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Toolbars Popup">
+ <menu_item_call label="Rimuovi questo pulsante" name="Remove button"/>
+ <menu_item_call label="Pulsanti barra strumenti..." name="Choose Buttons"/>
+ <menu_item_check label="Icone ed etichette" name="icons_with_text"/>
+ <menu_item_check label="Solo icone" name="icons_only"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_viewer.xml b/indra/newview/skins/default/xui/it/menu_viewer.xml
index 72dfbeecb6..99b7e3c4e6 100644
--- a/indra/newview/skins/default/xui/it/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/it/menu_viewer.xml
@@ -1,62 +1,92 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu_bar name="Main Menu">
<menu label="Io" name="Me">
- <menu_item_call label="Preferenze" name="Preferences"/>
- <menu_item_call label="Il mio Dashboard" name="Manage My Account">
- <menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=it"/>
- </menu_item_call>
- <menu_item_call label="Compra L$" name="Buy and Sell L$"/>
- <menu_item_call label="Il mio profilo" name="Profile"/>
- <menu_item_call label="Cambia vestiario" name="ChangeOutfit"/>
- <menu_item_check label="Il mio inventario" name="Inventory"/>
- <menu_item_check label="Il mio inventario" name="ShowSidetrayInventory"/>
- <menu_item_check label="Le mie gesture" name="Gestures"/>
- <menu_item_check label="La mia voce" name="ShowVoice"/>
- <menu label="Il mio stato" name="Status">
+ <menu_item_call label="Profilo..." name="Profile"/>
+ <menu_item_call label="Aspetto fisico..." name="ChangeOutfit"/>
+ <menu_item_call label="Scegli un avatar..." name="Avatar Picker"/>
+ <menu_item_check label="Inventario..." name="Inventory"/>
+ <menu_item_call label="Nuova finestra inventario" name="NewInventoryWindow"/>
+ <menu_item_call label="Luoghi..." name="Places"/>
+ <menu_item_call label="Preferiti..." name="Picks"/>
+ <menu_item_call label="Controlli fotocamera..." name="Camera Controls"/>
+ <menu label="Spostamento" name="Movement">
+ <menu_item_call label="Siedi" name="Sit Down Here"/>
+ <menu_item_check label="Vola" name="Fly"/>
+ <menu_item_check label="Corri sempre" name="Always Run"/>
+ <menu_item_call label="Ferma animazione" name="Stop Animating My Avatar"/>
+ <menu_item_call label="Cammina / corri / vola..." name="Walk / run / fly"/>
+ </menu>
+ <menu label="Stato" name="Status">
<menu_item_call label="Assente" name="Set Away"/>
<menu_item_call label="Non disponibile" name="Set Busy"/>
</menu>
- <menu_item_call label="Richiedi diritti Admin" name="Request Admin Options"/>
- <menu_item_call label="Lascia stato Admin" name="Leave Admin Options"/>
+ <menu_item_call label="Acquista L$..." name="Buy and Sell L$"/>
+ <menu_item_call label="Casella venditore in uscita..." name="MerchantOutbox"/>
+ <menu_item_call label="Dashboard dell&apos;account..." name="Manage My Account">
+ <menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=it"/>
+ </menu_item_call>
+ <menu_item_call label="Preferenze..." name="Preferences"/>
+ <menu_item_call label="Pulsanti barra strumenti..." name="Toolbars"/>
+ <menu_item_call label="Nascondi tutti i controlli" name="Hide UI"/>
<menu_item_call label="Esci da [APP_NAME]" name="Quit"/>
</menu>
<menu label="Comunica" name="Communicate">
- <menu_item_call label="I miei amici..." name="My Friends"/>
- <menu_item_call label="I miei gruppi" name="My Groups"/>
- <menu_item_check label="Chat nei dintorni" name="Nearby Chat"/>
+ <menu_item_check label="Chat..." name="Nearby Chat"/>
+ <menu_item_check label="Parla" name="Speak"/>
+ <menu_item_check label="Impostazioni voce..." name="Nearby Voice"/>
+ <menu_item_check label="Manipolazione voce..." name="ShowVoice"/>
+ <menu_item_check label="Gesture..." name="Gestures"/>
+ <menu_item_call label="Amici" name="My Friends"/>
+ <menu_item_call label="Gruppi" name="My Groups"/>
<menu_item_call label="Persone vicine" name="Active Speakers"/>
</menu>
<menu label="Mondo" name="World">
+ <menu_item_call label="Crea punto di riferimento per questo luogo" name="Create Landmark Here"/>
+ <menu_item_call label="Destinazioni..." name="Destinations"/>
+ <menu_item_check label="Mappamondo" name="World Map"/>
<menu_item_check label="Mini mappa" name="Mini-Map"/>
- <menu_item_check label="Mappa del mondo" name="World Map"/>
+ <menu_item_check label="Cerca" name="Search"/>
+ <menu_item_call label="Teleport a Casa" name="Teleport Home"/>
+ <menu_item_call label="Imposta come Casa mia" name="Set Home to Here"/>
<menu_item_call label="Istantanea" name="Take Snapshot"/>
- <menu_item_call label="Crea punto di riferimento per questo luogo" name="Create Landmark Here"/>
- <menu label="Profilo del luogo" name="Land">
- <menu_item_call label="Profilo del luogo" name="Place Profile"/>
- <menu_item_call label="Informazioni sui terreni" name="About Land"/>
- <menu_item_call label="Regione/proprietà immobiliare" name="Region/Estate"/>
- </menu>
+ <menu_item_call label="Profilo del luogo" name="Place Profile"/>
+ <menu_item_call label="Informazioni sul terreno" name="About Land"/>
+ <menu_item_call label="Regione/proprietà immobiliare" name="Region/Estate"/>
+ <menu_item_call label="Terreni posseduti..." name="My Land"/>
<menu_item_call label="Acquista questo terreno" name="Buy Land"/>
- <menu_item_call label="Il mio terreno" name="My Land"/>
<menu label="Mostra" name="LandShow">
- <menu_item_check label="Comandi del movimento" name="Movement Controls"/>
- <menu_item_check label="Comandi visualizzazione" name="Camera Controls"/>
<menu_item_check label="Linee di divieto" name="Ban Lines"/>
<menu_item_check label="Marcatori" name="beacons"/>
<menu_item_check label="Linee di confine" name="Property Lines"/>
<menu_item_check label="Proprietari di terreno" name="Land Owners"/>
<menu_item_check label="Coordinate" name="Coordinates"/>
<menu_item_check label="Proprietà del lotto" name="Parcel Properties"/>
+ <menu_item_check label="Menu Avanzato" name="Show Advanced Menu"/>
</menu>
- <menu_item_call label="Teleport a Casa" name="Teleport Home"/>
- <menu_item_call label="Imposta come Casa mia" name="Set Home to Here"/>
- <menu label="Sole" name="Environment Settings">
+ <menu label="Sole" name="Sun">
<menu_item_call label="Alba" name="Sunrise"/>
<menu_item_call label="Mezzogiorno" name="Noon"/>
<menu_item_call label="Tramonto" name="Sunset"/>
<menu_item_call label="Mezzanotte" name="Midnight"/>
- <menu_item_call label="Orario della proprietà" name="Revert to Region Default"/>
- <menu_item_call label="Editor dell&apos;ambiente" name="Environment Editor"/>
+ <menu_item_call label="Usa impostazioni regione" name="Use Region Settings"/>
+ </menu>
+ <menu label="Editor ambiente" name="Environment Editor">
+ <menu_item_call label="Impostazioni ambiente..." name="Environment Settings"/>
+ <menu label="Valori predefiniti acqua" name="Water Presets">
+ <menu_item_call label="Nuovo valore predefinito..." name="new_water_preset"/>
+ <menu_item_call label="Modifica valore predefinito..." name="edit_water_preset"/>
+ <menu_item_call label="Cancella valore predefinito..." name="delete_water_preset"/>
+ </menu>
+ <menu label="Valori predefiniti cielo" name="Sky Presets">
+ <menu_item_call label="Nuovo valore predefinito..." name="new_sky_preset"/>
+ <menu_item_call label="Modifica valore predefinito..." name="edit_sky_preset"/>
+ <menu_item_call label="Cancella valore predefinito..." name="delete_sky_preset"/>
+ </menu>
+ <menu label="Valori predefiniti giorno" name="Day Presets">
+ <menu_item_call label="Nuovo valore predefinito..." name="new_day_preset"/>
+ <menu_item_call label="Modifica valore predefinito..." name="edit_day_preset"/>
+ <menu_item_call label="Cancella valore predefinito..." name="delete_day_preset"/>
+ </menu>
</menu>
</menu>
<menu label="Costruisci" name="BuildTools">
@@ -85,6 +115,7 @@
<menu_item_call label="Prendi copia" name="Take Copy"/>
<menu_item_call label="Salva nell&apos;inventario" name="Save Object Back to My Inventory"/>
<menu_item_call label="Salva nei contenuti oggetto" name="Save Object Back to Object Contents"/>
+ <menu_item_call label="Restituisci oggetto" name="Return Object back to Owner"/>
</menu>
<menu label="Script" name="Scripts">
<menu_item_call label="Ricompila script (Mono)" name="Mono"/>
@@ -98,6 +129,7 @@
<menu_item_check label="Seleziona solo i miei oggetti" name="Select Only My Objects"/>
<menu_item_check label="Seleziona solo gli oggetti spostabili" name="Select Only Movable Objects"/>
<menu_item_check label="Seleziona circostante" name="Select By Surrounding"/>
+ <menu_item_check label="Mostra contorni selezione" name="Show Selection Outlines"/>
<menu_item_check label="Seleziona mostra nascosti" name="Show Hidden Selection"/>
<menu_item_check label="Seleziona mostra il raggio luminoso per la selezione" name="Show Light Radius for Selection"/>
<menu_item_check label="Mostra il raggio indicatore" name="Show Selection Beam"/>
@@ -110,17 +142,21 @@
<menu_item_call label="Immagine ([COST] L$)..." name="Upload Image"/>
<menu_item_call label="Suono ([COST] L$)..." name="Upload Sound"/>
<menu_item_call label="Animazione ([COST] L$)..." name="Upload Animation"/>
+ <menu_item_call label="Modella..." name="Upload Model"/>
<menu_item_call label="In blocco ([COST] L$ per file)..." name="Bulk Upload"/>
+ <menu_item_call label="Definisci diritti di caricamento predefiniti" name="perm prefs"/>
</menu>
+ <menu_item_call label="Annulla" name="Undo"/>
+ <menu_item_call label="Ripeti" name="Redo"/>
</menu>
<menu label="Aiuto" name="Help">
+ <menu_item_call label="Istruzioni..." name="How To"/>
<menu_item_call label="Aiuto di [SECOND_LIFE]" name="Second Life Help"/>
<menu_item_call label="Segnala abuso" name="Report Abuse"/>
<menu_item_call label="Segnala bug" name="Report Bug"/>
<menu_item_call label="Informazioni su [APP_NAME]" name="About Second Life"/>
</menu>
<menu label="Avanzate" name="Advanced">
- <menu_item_call label="Ferma animazione" name="Stop Animating My Avatar"/>
<menu_item_call label="Ridisegna le texture" name="Rebake Texture"/>
<menu_item_call label="Imposta dimensioni dell&apos;interfaccia sui valori predefiniti" name="Set UI Size to Default"/>
<menu_item_call label="Imposta dimensioni della finestra..." name="Set Window Size..."/>
@@ -128,11 +164,10 @@
<menu_item_check label="Disabilita vincoli fotocamera" name="Disable Camera Distance"/>
<menu_item_check label="Foto ad alta risoluzione" name="HighResSnapshot"/>
<menu_item_check label="Manda foto su disco senza avvisi" name="QuietSnapshotsToDisk"/>
- <menu_item_check label="Comprimi le foto su disco" name="CompressSnapshotsToDisk"/>
<menu label="Strumenti di performance" name="Performance Tools">
<menu_item_call label="Misuratore lag" name="Lag Meter"/>
<menu_item_check label="Barra statistiche" name="Statistics Bar"/>
- <menu_item_check label="Mostra costo di rendering dell&apos;avatar" name="Avatar Rendering Cost"/>
+ <menu_item_check label="Mostra peso visualizzazione per avatar" name="Avatar Rendering Cost"/>
</menu>
<menu label="Evidenziazione e visibilità" name="Highlighting and Visibility">
<menu_item_check label="Effetto marcatore lampeggiante" name="Cheesy Beacon"/>
@@ -143,22 +178,22 @@
<menu_item_check label="Mostra mirino visuale soggettiva" name="ShowCrosshairs"/>
</menu>
<menu label="Modalità di rendering" name="Rendering Types">
- <menu_item_check label="Semplice" name="Simple"/>
- <menu_item_check label="Alpha (Trasparenza)" name="Alpha"/>
- <menu_item_check label="Albero" name="Tree"/>
- <menu_item_check label="Avatar" name="Character"/>
- <menu_item_check label="Superficie" name="SurfacePath"/>
- <menu_item_check label="Cielo" name="Sky"/>
- <menu_item_check label="Acqua" name="Water"/>
- <menu_item_check label="Suolo" name="Ground"/>
- <menu_item_check label="Volume" name="Volume"/>
- <menu_item_check label="Erba" name="Grass"/>
- <menu_item_check label="Nuvole" name="Clouds"/>
- <menu_item_check label="Particelle" name="Particles"/>
- <menu_item_check label="Urti" name="Bump"/>
+ <menu_item_check label="Semplice" name="Rendering Type Simple"/>
+ <menu_item_check label="Alpha (Trasparenza)" name="Rendering Type Alpha"/>
+ <menu_item_check label="Albero" name="Rendering Type Tree"/>
+ <menu_item_check label="Avatar" name="Rendering Type Character"/>
+ <menu_item_check label="Toppa superficie" name="Rendering Type Surface Patch"/>
+ <menu_item_check label="Cielo" name="Rendering Type Sky"/>
+ <menu_item_check label="Acqua" name="Rendering Type Water"/>
+ <menu_item_check label="Suolo" name="Rendering Type Ground"/>
+ <menu_item_check label="Volume" name="Rendering Type Volume"/>
+ <menu_item_check label="Erba" name="Rendering Type Grass"/>
+ <menu_item_check label="Nuvole" name="Rendering Type Clouds"/>
+ <menu_item_check label="Particelle" name="Rendering Type Particles"/>
+ <menu_item_check label="Urto" name="Rendering Type Bump"/>
</menu>
<menu label="Caratteristiche di rendering" name="Rendering Features">
- <menu_item_check label="Interfaccia utente" name="UI"/>
+ <menu_item_check label="Interfaccia utente" name="ToggleUI"/>
<menu_item_check label="Selezionati" name="Selected"/>
<menu_item_check label="Evidenziato" name="Highlighted"/>
<menu_item_check label="Texture dinamiche" name="Dynamic Textures"/>
@@ -169,13 +204,9 @@
<menu_item_check label="Usa thread lettura plugin" name="Use Plugin Read Thread"/>
<menu_item_call label="Pulisci cache di gruppo" name="ClearGroupCache"/>
<menu_item_check label="Fluidità mouse" name="Mouse Smoothing"/>
+ <menu_item_call label="Rilascia tasti" name="Release Keys"/>
<menu label="Scorciatoie" name="Shortcuts">
- <menu_item_call label="Immagine ([COST]L$)..." name="Upload Image"/>
- <menu_item_check label="Cerca" name="Search"/>
- <menu_item_call label="Rilascia tasti" name="Release Keys"/>
- <menu_item_call label="Imposta dimensioni dell&apos;interfaccia sui valori predefiniti" name="Set UI Size to Default"/>
- <menu_item_check label="Corri sempre" name="Always Run"/>
- <menu_item_check label="Vola" name="Fly"/>
+ <menu_item_check label="Mostra menu Avanzato - tasti di scelta rapida esistenti" name="Show Advanced Menu - legacy shortcut"/>
<menu_item_call label="Chiudi finestra" name="Close Window"/>
<menu_item_call label="Chiudi tutte le finestre" name="Close All Windows"/>
<menu_item_call label="Foto su disco" name="Snapshot to Disk"/>
@@ -183,17 +214,9 @@
<menu_item_check label="Joystick Flycam" name="Joystick Flycam"/>
<menu_item_call label="Reimposta vista" name="Reset View"/>
<menu_item_call label="Guarda l&apos;ultima conversazione" name="Look at Last Chatter"/>
- <menu label="Seleziona strumento di costruzione" name="Select Tool">
- <menu_item_call label="Strumento Ingrandisci" name="Focus"/>
- <menu_item_call label="Strumento Movimento" name="Move"/>
- <menu_item_call label="Strumento Modifica" name="Edit"/>
- <menu_item_call label="Strumento Crea" name="Create"/>
- <menu_item_call label="Strumento Terreno" name="Land"/>
- </menu>
<menu_item_call label="Zoom avanti" name="Zoom In"/>
<menu_item_call label="Zoom predefinito" name="Zoom Default"/>
<menu_item_call label="Zoom indietro" name="Zoom Out"/>
- <menu_item_check label="Mostra menu Avanzato" name="Show Advanced Menu"/>
</menu>
<menu_item_call label="Mostra impostazioni di debug" name="Debug Settings"/>
<menu_item_check label="Mostra menu sviluppo" name="Debug Mode"/>
@@ -207,6 +230,7 @@
<menu_item_check label="Console categoria texture" name="Texture Category"/>
<menu_item_check label="Timer veloci" name="Fast Timers"/>
<menu_item_check label="Memoria" name="Memory"/>
+ <menu_item_check label="Statistiche scena" name="Scene Statistics"/>
<menu_item_call label="Informazioni regione sulla console di debug" name="Region Info to Debug Console"/>
<menu_item_check label="Fotocamera" name="Camera"/>
<menu_item_check label="Vento" name="Wind"/>
@@ -214,8 +238,12 @@
</menu>
<menu label="Mostra informazioni" name="Display Info">
<menu_item_check label="Mostra orario" name="Show Time"/>
+ <menu_item_check label="Mostra costo di caricamento" name="Show Upload Cost"/>
<menu_item_check label="Mostra informazioni di rendering" name="Show Render Info"/>
+ <menu_item_check label="Mostra info sulla texture" name="Show Texture Info"/>
<menu_item_check label="Mostra colore sotto il cursore" name="Show Color Under Cursor"/>
+ <menu_item_check label="Mostra memoria" name="Show Memory"/>
+ <menu_item_check label="Mostra info mem privata" name="Show Private Mem Info"/>
<menu_item_check label="Mostra aggiornamenti agli oggetti" name="Show Updates"/>
</menu>
<menu label="Forza un errore" name="Force Errors">
@@ -233,13 +261,23 @@
<menu_item_check label="Veloc. di visualizzazione casuale" name="Randomize Framerate"/>
<menu_item_check label="Test frame" name="Frame Test"/>
</menu>
+ <menu label="Render Metadata" name="Render Metadata">
+ <menu_item_check label="Normali" name="Normals"/>
+ <menu_item_check label="Forme fisica" name="Physics Shapes"/>
+ <menu_item_check label="Aggiorna tipo" name="Update Type"/>
+ <menu_item_check label="Info livello dettaglio" name="LOD Info"/>
+ <menu_item_check label="Crea coda" name="Build Queue"/>
+ <menu_item_check label="Vettori vento" name="Wind Vectors"/>
+ <menu_item_check label="Complessità rendering" name="rendercomplexity"/>
+ <menu_item_check label="Byte collegamento" name="attachment bytes"/>
+ <menu_item_check label="Scolpisci" name="Sculpt"/>
+ </menu>
<menu label="Rendering" name="Rendering">
<menu_item_check label="Assi" name="Axes"/>
<menu_item_check label="Wireframe" name="Wireframe"/>
<menu_item_check label="Luci e ombre" name="Lighting and Shadows"/>
<menu_item_check label="Ombra dal sole, dalla luna e dai proiettori" name="Shadows from Sun/Moon/Projectors"/>
<menu_item_check label="SSAO e ombre fluide" name="SSAO and Shadow Smoothing"/>
- <menu_item_check label="Illuminazione globale (sperimentale)" name="Global Illumination"/>
<menu_item_check label="Maschera alfa automatica (differita)" name="Automatic Alpha Masks (deferred)"/>
<menu_item_check label="Maschera alfa automatica (non differita)" name="Automatic Alpha Masks (non-deferred)"/>
<menu_item_check label="Texture delle animazioni" name="Animation Textures"/>
@@ -254,36 +292,34 @@
<menu_item_call label="Lascia un pacchetto" name="Drop a Packet"/>
</menu>
<menu_item_call label="Urti, spinte e contatti" name="Bumps, Pushes &amp;amp; Hits"/>
- <menu label="Mondo" name="World">
- <menu_item_check label="Esclusione al sole della regione" name="Sim Sun Override"/>
- <menu_item_check label="Effetto marcatore lampeggiante" name="Cheesy Beacon"/>
+ <menu label="Mondo" name="DevelopWorld">
+ <menu_item_check label="Esclusione al sole della simulazione" name="Sim Sun Override"/>
<menu_item_check label="Clima fisso" name="Fixed Weather"/>
<menu_item_call label="Dump della cache oggetti regione" name="Dump Region Object Cache"/>
</menu>
<menu label="Interfaccia utente" name="UI">
- <menu_item_call label="Test browser Web" name="Web Browser Test"/>
+ <menu_item_call label="Test browser multimedia" name="Web Browser Test"/>
+ <menu_item_call label="Browser contenuto Web" name="Web Content Browser"/>
<menu_item_call label="Stampa informazioni oggetto selezionato" name="Print Selected Object Info"/>
<menu_item_call label="Statistiche memoria" name="Memory Stats"/>
- <menu_item_check label="Doppio clic pilota automatico" name="Double-Click Auto-Pilot"/>
- <menu_item_check label="Doppio clic per teleport" name="DoubleClick Teleport"/>
+ <menu_item_check label="Console di debug regione" name="Region Debug Console"/>
<menu_item_check label="Debug clic" name="Debug Clicks"/>
<menu_item_check label="Debug eventi mouse" name="Debug Mouse Events"/>
</menu>
<menu label="XUI" name="XUI">
<menu_item_call label="Ricarica impostazioni colori" name="Reload Color Settings"/>
<menu_item_call label="Test Mostra Font" name="Show Font Test"/>
- <menu_item_call label="Carica da XML" name="Load from XML"/>
- <menu_item_call label="Salva in XML" name="Save to XML"/>
<menu_item_check label="Mostra nomi XUI" name="Show XUI Names"/>
<menu_item_call label="Manda IM di prova" name="Send Test IMs"/>
+ <menu_item_call label="Svuota cache nomi" name="Flush Names Caches"/>
</menu>
<menu label="Avatar" name="Character">
<menu label="Grab Baked Texture" name="Grab Baked Texture">
- <menu_item_call label="Iride" name="Iris"/>
- <menu_item_call label="Testa" name="Head"/>
- <menu_item_call label="Parte superiore del corpo" name="Upper Body"/>
- <menu_item_call label="Parte inferiore del corpo" name="Lower Body"/>
- <menu_item_call label="Gonna" name="Skirt"/>
+ <menu_item_call label="Iride" name="Grab Iris"/>
+ <menu_item_call label="Testa" name="Grab Head"/>
+ <menu_item_call label="Parte superiore del corpo" name="Grab Upper Body"/>
+ <menu_item_call label="Parte inferiore del corpo" name="Grab Lower Body"/>
+ <menu_item_call label="Gonna" name="Grab Skirt"/>
</menu>
<menu label="Test personaggio" name="Character Tests">
<menu_item_call label="Alterna la geometria dei personaggi" name="Toggle Character Geometry"/>
@@ -298,18 +334,28 @@
<menu_item_call label="Debug texture dell&apos;avatar" name="Debug Avatar Textures"/>
</menu>
<menu_item_check label="Texture HTTP" name="HTTP Textures"/>
+ <menu_item_check label="Inventario HTTP" name="HTTP Inventory"/>
+ <menu_item_call label="Attiva Visual Leak Detector" name="Enable Visual Leak Detector"/>
<menu_item_check label="Finestra Console al prossimo lancio" name="Console Window"/>
- <menu_item_check label="Mostra menu Admin" name="View Admin Options"/>
+ <menu label="Imposta livello di registrazione" name="Set Logging Level">
+ <menu_item_check label="Debug" name="Debug"/>
+ <menu_item_check label="Informazioni" name="Info"/>
+ <menu_item_check label="Attenzione" name="Warning"/>
+ <menu_item_check label="Errore" name="Error"/>
+ <menu_item_check label="Nessuno" name="None"/>
+ </menu>
<menu_item_call label="Richiedi diritti Admin" name="Request Admin Options"/>
<menu_item_call label="Lascia stato Admin" name="Leave Admin Options"/>
+ <menu_item_check label="Mostra menu Admin" name="View Admin Options"/>
</menu>
<menu label="Admin" name="Admin">
- <menu label="Object">
- <menu_item_call label="Prendi copia" name="Take Copy"/>
+ <menu label="Oggetto" name="AdminObject">
+ <menu_item_call label="Prendi copia" name="Admin Take Copy"/>
<menu_item_call label="Rendimi proprietario" name="Force Owner To Me"/>
<menu_item_call label="Forza permesso proprietario" name="Force Owner Permissive"/>
<menu_item_call label="Elimina" name="Delete"/>
<menu_item_call label="Blocca" name="Lock"/>
+ <menu_item_call label="Ottieni ID asset" name="Get Assets IDs"/>
</menu>
<menu label="Lotto" name="Parcel">
<menu_item_call label="Rendimi proprietario" name="Owner To Me"/>
@@ -322,4 +368,20 @@
</menu>
<menu_item_call label="Strumenti Admin" name="God Tools"/>
</menu>
+ <menu label="Admin" name="Deprecated">
+ <menu label="Take Off Clothing" name="Take Off Clothing">
+ <menu_item_call label="Fisica" name="Physics"/>
+ </menu>
+ <menu label="Guida" name="DeprecatedHelp">
+ <menu_item_call label="Blog ufficiale Linden" name="Official Linden Blog"/>
+ <menu_item_call label="Portale script" name="Scripting Portal"/>
+ <menu label="Segnalazione bug" name="Bug Reporting">
+ <menu_item_call label="Monitoraggio problemi pubblici" name="Public Issue Tracker"/>
+ <menu_item_call label="Guida Monitoraggio problemi pubblici" name="Publc Issue Tracker Help"/>
+ <menu_item_call label="Guida alla segnalazione di bug" name="Bug Reporing 101"/>
+ <menu_item_call label="Problemi sicurezza" name="Security Issues"/>
+ <menu_item_call label="Wiki domande e risposte" name="QA Wiki"/>
+ </menu>
+ </menu>
+ </menu>
</menu_bar>
diff --git a/indra/newview/skins/default/xui/it/menu_wearing_gear.xml b/indra/newview/skins/default/xui/it/menu_wearing_gear.xml
index 7c8eef64e5..de25f88aca 100644
--- a/indra/newview/skins/default/xui/it/menu_wearing_gear.xml
+++ b/indra/newview/skins/default/xui/it/menu_wearing_gear.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Gear Wearing">
+<toggleable_menu name="Gear Wearing">
<menu_item_call label="Modifica vestiario" name="edit"/>
<menu_item_call label="Togli" name="takeoff"/>
-</menu>
+ <menu_item_call label="Copia gruppo vestiti negli Appunti" name="copy"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/it/notifications.xml b/indra/newview/skins/default/xui/it/notifications.xml
index 32483881b2..0e6fee60d1 100644
--- a/indra/newview/skins/default/xui/it/notifications.xml
+++ b/indra/newview/skins/default/xui/it/notifications.xml
@@ -73,7 +73,7 @@ Dettagli errore: La notifica denominata &apos;[_NAME]&apos; non è stata trovata
</notification>
<notification name="LoginFailedNoNetwork">
Non è possibile collegarsi alla [SECOND_LIFE_GRID].
-&apos;[DIAGNOSTIC]&apos;
+ &apos;[DIAGNOSTIC]&apos;
Accertati che la tua connessione Internet stia funzionando correttamente.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
@@ -85,6 +85,40 @@ Accertati che la tua connessione Internet stia funzionando correttamente.
Salva i cambiamenti all&apos;attuale parte del corpo/abito?
<usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="Non salvare" yestext="Salva"/>
</notification>
+ <notification name="ConfirmNoCopyToOutbox">
+ Non hai l&apos;autorizzazione necessaria per copiare almeno uno di questi elementi nella casella in uscita del rivenditore. Puoi spostarli o lasciarli indietro.
+ <usetemplate name="okcancelbuttons" notext="Non spostare gli oggetti" yestext="Sposta oggetti"/>
+ </notification>
+ <notification name="OutboxFolderCreated">
+ Una nuova cartella è stata creata per ciascun elemento trasferito nel livello superiore della casella in uscita del rivenditore.
+ <usetemplate ignoretext="Una nuova cartella è stata creata nella casella in uscita del rivenditore" name="okignore" yestext="OK"/>
+ </notification>
+ <notification name="OutboxImportComplete">
+ Successo
+
+Tutte le cartelle sono state inviate a Marketplace correttamente.
+ <usetemplate ignoretext="Tutte le cartelle inviate a Marketplace" name="okignore" yestext="OK"/>
+ </notification>
+ <notification name="OutboxImportHadErrors">
+ Alcune cartelle non sono state trasferite
+
+Si sono verificati degli errori durante l&apos;invio di alcune cartelle a Marketplace. Tali cartelle sono ancora nella casella in uscita del rivenditore.
+
+Per ulteriori informazioni consulta il [[MARKETPLACE_IMPORTS_URL] registro errori].
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="OutboxImportFailed">
+ Trasferimento non riuscito
+
+Nessuna cartella è stata inviata a Marketplace, a causa di un errore di sistema o di rete. Riprova più tardi.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="OutboxInitFailed">
+ Inizializzazione Marketplace non riuscita
+
+L&apos;inizializzazione con il Marketplace non ha avuto successo a causa di un errore di sistema o di rete. Riprova più tardi.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="CompileQueueSaveText">
C&apos;è stato un problema importando il testo di uno script per la seguente ragione: [REASON]. Riprova più tardi.
</notification>
@@ -109,9 +143,13 @@ Scegli solo un oggetto e riprova.
Chi non è tuo amico non saprà che hai scelto di ignorare le loro chiamate e IM.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="FavoritesOnLogin">
+ Nota: Se attivi questa opzione, chiunque usa questo computer può vedere l&apos;elenco di luoghi preferiti.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="GrantModifyRights">
Quando concedi i diritti di modifica ad un altro residente, gli permetti di modificare, eliminare o prendere QUALSIASI oggetto che possiedi in Second Life. Pertanto ti consigliamo di essere ben sicuro quando concedi questo diritto.
-Vuoi concedere i diritti di modifica a [FIRST_NAME] [LAST_NAME]?
+Vuoi concedere i diritti di modifica a [NAME]?
<usetemplate name="okcancelbuttons" notext="No" yestext="Si"/>
</notification>
<notification name="GrantModifyRightsMultiple">
@@ -120,7 +158,7 @@ Vuoi concedere i diritti di modifica ai residenti selezionati?
<usetemplate name="okcancelbuttons" notext="No" yestext="Si"/>
</notification>
<notification name="RevokeModifyRights">
- Vuoi revocare i diritti di modifica dati a [FIRST_NAME] [LAST_NAME]?
+ Vuoi revocare i diritti di modifica di [NAME]?
<usetemplate name="okcancelbuttons" notext="No" yestext="Si"/>
</notification>
<notification name="RevokeModifyRightsMultiple">
@@ -317,24 +355,17 @@ Superato il limite di oggetti collegati [MAX_ATTACHMENTS]. Per favore prima stac
Non puoi indossare quell&apos;elemento perchè non è ancora stato caricato. Riprova fra un minuto.
</notification>
<notification name="MustHaveAccountToLogIn">
- Qualcosa è rimasto vuoto.
-Devi inserire sia il nome che il cognome del tuo avatar.
+ Spiacenti. Un campo è vuoto.
+Inserisci il Nome utente del tuo avatar.
-Hai bisogno di un account per entrare in [SECOND_LIFE]. Ne vuoi creare uno adesso?
+Devi avere un account per entrare in [SECOND_LIFE]. Vuoi crearne uno adesso?
<url name="url">
https://join.secondlife.com/index.php?lang=it-IT
</url>
<usetemplate name="okcancelbuttons" notext="Riprova" yestext="Crea un nuovo account"/>
</notification>
<notification name="InvalidCredentialFormat">
- Immetti sia il nome che il cognome del tuo avatar nel campo del nome utente, quindi effettua l&apos;accesso.
- </notification>
- <notification name="AddClassified">
- L&apos;inserzione comparirà nella sezione &apos;Annunci&apos; della Ricerca e su [http://secondlife.com/community/classifieds secondlife.com] per una settimana.
-Compila la tua inserzione, quindi clicca &apos;Pubblica...&apos; per aggiungerla all&apos;elenco degli annunci.
-Quando clicchi su Pubblica, ti verrà chiesto di indicare quale prezzo vuoi pagare.
-Pagando di più, il tuo annuncio comparirà più in alto nella lista delle inserzioni, nonché nei risultati delle ricerche in base a parole chiave.
- <usetemplate ignoretext="Come creare una nuova inserzione" name="okcancelignore" notext="Annulla" yestext="OK"/>
+ Immetti il nome utente oppure sia il nome che il cognome del tuo avatar nel campo del nome utente, quindi effettua nuovamente l&apos;accesso.
</notification>
<notification name="DeleteClassified">
Cancella annuncio &apos;[NAME]&apos;?
@@ -388,6 +419,9 @@ Nota: questa operazione cancellerà la cache.
<notification name="ChangeSkin">
La nuova pelle comparirà dopo il riavvio di [APP_NAME].
</notification>
+ <notification name="ChangeLanguage">
+ La modifica della lingua avrà effetto dopo il riavvio di [APP_NAME].
+ </notification>
<notification name="GoToAuctionPage">
Vai alla pagina web [SECOND_LIFE] per vedere i dettagli dell&apos;asta oppure fai un&apos;offerta?
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
@@ -598,6 +632,10 @@ Attese [VALIDS]
Impossibile trovare il frammento &apos;data&apos; nell&apos;intestazione WAV:
[FILE]
</notification>
+ <notification name="SoundFileInvalidChunkSize">
+ Dimensione chunk nel file WAV:
+[FILE]
+ </notification>
<notification name="SoundFileInvalidTooLong">
Il file audio è troppo lungo (deve essere al massimo 10 secondi):
[FILE]
@@ -630,7 +668,7 @@ Attese [VALIDS]
Impossibile creare il file in uscita: [FILE]
</notification>
<notification name="DoNotSupportBulkAnimationUpload">
- [APP_NAME] non supporta ancora il caricamento in blocco di file di animazione.
+ [APP_NAME] non supporta ancora il caricamento in blocco di file di animazione in formato BVH.
</notification>
<notification name="CannotUploadReason">
Impossibile importare il file [FILE] a causa del seguente motivo: [REASON]
@@ -918,12 +956,6 @@ In genere si tratta di un problema temporaneo. Attendi alcuni minuti per modific
Impossibile comprare terreno per il gruppo:
Non hai i permessi per comprare il terreno per il tuo gruppo attivo.
</notification>
- <notification label="Aggiungi Amico" name="AddFriend">
- Gli amici possono autorizzarsi a vedersi l&apos;un l&apos;altro sulla mappa e sapere quando sono collegati.
-
-Offri l&apos;amicizia a [NAME]?
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
<notification label="Aggiungi Amico" name="AddFriendWithMessage">
Gli amici possono autorizzarsi a vedersi l&apos;un l&apos;altro sulla mappa e sapere quando sono collegati.
@@ -942,7 +974,7 @@ Offri l&apos;amicizia a [NAME]?
<input name="message">
[DESC] (nuovo)
</input>
- <button name="Offer" text="OK"/>
+ <button name="OK" text="OK"/>
<button name="Cancel" text="Annulla"/>
</form>
</notification>
@@ -952,7 +984,7 @@ Offri l&apos;amicizia a [NAME]?
<input name="message">
[DESC] (nuovo)
</input>
- <button name="Offer" text="OK"/>
+ <button name="OK" text="OK"/>
<button name="Cancel" text="Annulla"/>
</form>
</notification>
@@ -962,12 +994,12 @@ Offri l&apos;amicizia a [NAME]?
<input name="new_name">
[NAME]
</input>
- <button name="Offer" text="OK"/>
+ <button name="OK" text="OK"/>
<button name="Cancel" text="Annulla"/>
</form>
</notification>
<notification name="RemoveFromFriends">
- Vuoi rimuovere remove [FIRST_NAME] [LAST_NAME] dalla lista dei tuoi amici?
+ Vuoi rimuovere &lt;nolink&gt;[NAME]&lt;/nolink&gt; dalla lista dei tuoi amici?
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
</notification>
<notification name="RemoveMultipleFromFriends">
@@ -1089,19 +1121,23 @@ Cedi questo terreno di [AREA] m² al gruppo &apos;[GROUP_NAME]&apos;?
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
</notification>
<notification name="DeedLandToGroupWithContribution">
- Cedendo questo terreno al gruppo sara richiesto hai componenti di avere e di mantenere il terreno con un credito sufficiente.
-La cessione include un contributo simultaneo di terreno al gruppo da &apos;[FIRST_NAME] [LAST_NAME]&apos;.
-Il prezzo di acquisto del terreno non è rifondibile al proprietario.
-Se una terreno ceduto al gruppo viene venduto, il prezzo di vendita viene diviso in parti uguali fra i membri del gruppo.
+ Completando la cessione del lotto, il gruppo dovrà avere e mantenere crediti sufficienti per l&apos;uso del terreno.
+La cessione includerà un contributo contemporaneo di terreno al gruppo da &apos;[NAME]&apos;.
+Il prezzo di acquisto del terreno non viene rimborsato al proprietario. Se un lotto ceduto viene venduto, il prezzo di vendita viene distribuito in maniera paritetica tra i membri del gruppo.
-Cedi questo terreno di [AREA] m² al gruppo &apos;[GROUP_NAME]&apos;?
+Cedere questi [AREA] m² di terreno al gruppo &apos;[GROUP_NAME]&apos;?
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
</notification>
<notification name="DisplaySetToSafe">
Le impostazioni dello schermo sono state impostate a valori di sicurezza perchè hai specificato l&apos;opzione -safe.
</notification>
- <notification name="DisplaySetToRecommended">
- Le impostazioni dello schermo sono state impostate a valori ottimali basati sulla tua configurazione di sistema.
+ <notification name="DisplaySetToRecommendedGPUChange">
+ Le impostazioni di visualizzazione sono ai livelli consigliati a causa di un cambiamento nella scheda grafica
+da &apos;[LAST_GPU]&apos;
+a &apos;[THIS_GPU]&apos;
+ </notification>
+ <notification name="DisplaySetToRecommendedFeatureChange">
+ Le impostazioni di visualizzazione sono ai livelli consigliati a causa di un cambiamento nel sottosistema di rendering.
</notification>
<notification name="ErrorMessage">
[ERROR_MESSAGE]
@@ -1336,6 +1372,48 @@ Questo aggiornamento non è necessario, ma ti consigliamo di installarlo per mig
Scaricare nella cartella Applicazioni?
<usetemplate name="okcancelbuttons" notext="Continua" yestext="Scarica l&apos;aggiornamento"/>
</notification>
+ <notification name="FailedUpdateInstall">
+ Si è verificato un errore durante l&apos;aggiornamento del viewer.
+Scarica e installa la versione più recente del viewer da
+http://secondlife.com/download.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="FailedRequiredUpdateInstall">
+ Non è stato possibile installare un aggiornamento richiesto.
+Non potrai accedere fino a quando non verrà aggiornato [APP_NAME].
+
+Scarica e installa la versione più recente del viewer da
+http://secondlife.com/download.
+ <usetemplate name="okbutton" yestext="Esci"/>
+ </notification>
+ <notification name="UpdaterServiceNotRunning">
+ È disponibile un aggiornamento obbligatorio per l&apos;installazione di Second Life.
+
+Puoi scaricare questo aggiornamento da http://www.secondlife.com/downloads
+oppure puoi installarlo adesso.
+ <usetemplate name="okcancelbuttons" notext="Esci da Second Life" yestext="Scarica e aggiorna adesso"/>
+ </notification>
+ <notification name="DownloadBackgroundTip">
+ È stato scaricato un aggiornamento dell&apos;installazione di [APP_NAME].
+Versione [VERSION] [[RELEASE_NOTES_FULL_URL] Informazioni su questo aggiornamento]
+ <usetemplate name="okcancelbuttons" notext="Più tardi..." yestext="Installa ora e riavvia [APP_NAME]"/>
+ </notification>
+ <notification name="DownloadBackgroundDialog">
+ È stato scaricato un aggiornamento dell&apos;installazione di [APP_NAME].
+Versione [VERSION] [[RELEASE_NOTES_FULL_URL] Informazioni su questo aggiornamento]
+ <usetemplate name="okcancelbuttons" notext="Più tardi..." yestext="Installa ora e riavvia [APP_NAME]"/>
+ </notification>
+ <notification name="RequiredUpdateDownloadedVerboseDialog">
+ È stato scaricato un aggiornamento obbligatorio del software.
+Versione [VERSION]
+
+Per installare l&apos;aggiornamento è necessario riavviare [APP_NAME].
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="RequiredUpdateDownloadedDialog">
+ Per installare l&apos;aggiornamento è necessario riavviare [APP_NAME].
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="DeedObjectToGroup">
La cessione di questo oggetto farà in modo che il gruppo:
* Riceva i L$ pagati all&apos;oggetto
@@ -1380,8 +1458,8 @@ Scaricare nella cartella Applicazioni?
<usetemplate ignoretext="Conferma prima di restituire gli oggetti ai relativi proprietari" name="okcancelignore" notext="Annulla" yestext="OK"/>
</notification>
<notification name="GroupLeaveConfirmMember">
- Sei attualmente un membro del gruppo [GROUP].
-Vuoi lasciare il gruppo?
+ Attualmente sei un membro del gruppo &lt;nolink&gt;[GROUP]&lt;/nolink&gt;.
+Lasciare il gruppo?
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
</notification>
<notification name="ConfirmKick">
@@ -1466,6 +1544,46 @@ La chat e gli IM verranno nascosti. Gli IM riceveranno la tua risposta di Non di
<button name="Cancel" text="Annulla"/>
</form>
</notification>
+ <notification name="SetDisplayNameSuccess">
+ Ciao [DISPLAY_NAME]!
+
+Come nel modo reale, prima che tutti conoscano il tuo nuovo nome ci vorrà del tempo. Saranno necessari alcuni giorni per [http://wiki.secondlife.com/wiki/Setting_your_display_name l&apos;aggiornamento del nome] in oggetti, script, ricerca, ecc.
+ </notification>
+ <notification name="SetDisplayNameBlocked">
+ Non puoi cambiare il tuo nome visualizzato. Se ritieni che si tratta di un errore, contatta l&apos;assistenza.
+ </notification>
+ <notification name="SetDisplayNameFailedLength">
+ Il nome è troppo lungo. La lunghezza massima dei nomi visualizzati è di [LENGTH] caratteri.
+
+Riprova con un nome più corto.
+ </notification>
+ <notification name="SetDisplayNameFailedGeneric">
+ Non è possibile impostare il tuo nome visualizzato. Riprova più tardi.
+ </notification>
+ <notification name="SetDisplayNameMismatch">
+ I nomi visualizzati inseriti non corrispondono. Inseriscili nuovamente.
+ </notification>
+ <notification name="AgentDisplayNameUpdateThresholdExceeded">
+ Devi aspettare prima di cambiare il nome visualizzato.
+
+Vedi http://wiki.secondlife.com/wiki/Setting_your_display_name
+
+Riprova più tardi.
+ </notification>
+ <notification name="AgentDisplayNameSetBlocked">
+ Non è possibile impostare il nome richiesto perché contiene una parola vietata.
+
+ Riprova con un altro nome.
+ </notification>
+ <notification name="AgentDisplayNameSetInvalidUnicode">
+ Il nome visualizzato scelto contiene caratteri non validi.
+ </notification>
+ <notification name="AgentDisplayNameSetOnlyPunctuation">
+ Il nome visualizzato deve contenere lettere, non solo segni di punteggiatura.
+ </notification>
+ <notification name="DisplayNameUpdate">
+ [OLD_NAME] ([SLID]) ha il nuovo nome [NEW_NAME].
+ </notification>
<notification name="OfferTeleport">
Offri un teleport nel posto dove sei con il seguente messaggio?
<form name="form">
@@ -1476,6 +1594,11 @@ La chat e gli IM verranno nascosti. Gli IM riceveranno la tua risposta di Non di
<button name="Cancel" text="Annulla"/>
</form>
</notification>
+ <notification name="TooManyTeleportOffers">
+ Hai cercato di fare [OFFERS] offerte di teleport,
+più del limite [LIMIT].
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="OfferTeleportFromGod">
Chiedere, in qualità di Admin, al residente di raggiungerti?
<form name="form">
@@ -1818,6 +1941,18 @@ Trasferisci gli elementi nell&apos;inventario?
Confermi di voler uscire?
<usetemplate ignoretext="Conferma prima di uscire" name="okcancelignore" notext="Non uscire" yestext="Esci"/>
</notification>
+ <notification name="ConfirmRestoreToybox">
+ Questa azione ripristina pulsanti e barre degli strumenti predefinite.
+
+Questa azione non può essere ripristinata
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmClearAllToybox">
+ Questa azione riporterà tutti i pulsanti nella casella strumenti. Le barre degli strumenti saranno vuote.
+
+Questa azione non può essere ripristinata
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
<notification name="DeleteItems">
[QUESTION]
<usetemplate ignoretext="Conferma prima di cancellare gli elementi" name="okcancelignore" notext="Annulla" yestext="OK"/>
@@ -1898,6 +2033,10 @@ Desideri abbandonare la modalità &apos;Occupato&apos; prima di completare quest
Vuoi veramente eliminare la cronologia viaggi, web e ricerche fatte?
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
</notification>
+ <notification name="ConfirmClearCache">
+ Sei sicuro di volere cancellare la cache del viewer?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
<notification name="ConfirmClearCookies">
Confermi di volere cancellare i tuoi cookie?
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="Si"/>
@@ -1923,48 +2062,30 @@ Inseriscilo in una pagina web per dare ad altri un accesso facile a questa ubica
Vuoi sovrascrivere le preimpostazioni salvate?
<usetemplate name="okcancelbuttons" notext="No" yestext="Si"/>
</notification>
- <notification name="WLDeletePresetAlert">
- Vuoi cancellare [SKY]?
- <usetemplate name="okcancelbuttons" notext="No" yestext="Si"/>
- </notification>
<notification name="WLNoEditDefault">
Non puoi modificare o cancellare una preimpostazione di fabbrica.
</notification>
<notification name="WLMissingSky">
Questo file di ciclo giornaliero fa riferimento ad un file di cielo mancante: [SKY].
</notification>
- <notification name="PPSaveEffectAlert">
- Effetto di post elaborazione già presente. Vuoi sovrascrivere?
- <usetemplate name="okcancelbuttons" notext="No" yestext="Si"/>
- </notification>
- <notification name="NewSkyPreset">
- Fornisci il nome per il nuovo cielo.
- <form name="form">
- <input name="message">
- Nuova preimpostazione
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Annulla"/>
- </form>
+ <notification name="WLRegionApplyFail">
+ Queste impostazioni non possono essere applicare alla regione. Uscendo dalla regione e ritornandoci potrebbe risolvere il problema. Il motivo fornito: [FAIL_REASON]
</notification>
- <notification name="ExistsSkyPresetAlert">
- La preimpostazione esiste già!
+ <notification name="EnvCannotDeleteLastDayCycleKey">
+ Impossibile cancellare l&apos;ultima chiave in questo ciclo giornata. Il ciclo giornata non può essere vuoto. Invece di cancellare la chiave restante, modificala e quindi creane una nuova.
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="NewWaterPreset">
- Fornisci il nome per la nuova preregolazione del livello dell&apos;acqua.
- <form name="form">
- <input name="message">
- Nuova preimpostazione
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Annulla"/>
- </form>
+ <notification name="DayCycleTooManyKeyframes">
+ Non puoi aggiungere altri frame chiave a questo ciclo giornata. Il numero massimo di frame chiave per i cicli giornata nell&apos;ambito [SCOPE] è [MAX].
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="ExistsWaterPresetAlert">
- La preimpostazione esiste già!
+ <notification name="EnvUpdateRate">
+ Puoi aggiornare le impostazioni dell&apos;ambiente della regione ogni [WAIT] secondi. Attendi e riprova.
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="WaterNoEditDefault">
- Non puoi modificare o cancellare una preimpostazione.
+ <notification name="PPSaveEffectAlert">
+ Effetto di post elaborazione già presente. Vuoi sovrascrivere?
+ <usetemplate name="okcancelbuttons" notext="No" yestext="Si"/>
</notification>
<notification name="ChatterBoxSessionStartError">
Impossibile iniziare una nuova sessione di chat con [RECIPIENT].
@@ -1993,13 +2114,14 @@ Inseriscilo in una pagina web per dare ad altri un accesso facile a questa ubica
<usetemplate ignoretext="Indossare gli abiti che creo mentre modifico il mio aspetto" name="okcancelignore" notext="No" yestext="Si"/>
</notification>
<notification name="NotAgeVerified">
- Per entrare in questa zona, devi avere eseguito la verifica dell&apos;età. Vuoi andare sul sito di [SECOND_LIFE] per verificare la tua età?
+ Per accedere ai contenuti e alle aree per adulti in Second Life devi avere almeno 18 anni. Visita la pagina di verifica dell&apos;età per confermare di avere almeno 18 anni.
+Verrà avviato il browser Web.
[_URL]
<url name="url" option="0">
- https://secondlife.com/account/verification.php?lang=it
+ https://secondlife.com/my/account/verification.php
</url>
- <usetemplate ignoretext="Non ho verificato la mia età" name="okcancelignore" notext="No" yestext="Si"/>
+ <usetemplate ignoretext="Non ho verificato la mia età" name="okcancelignore" notext="Annulla" yestext="Passa alla verifica dell&apos;età"/>
</notification>
<notification name="Cannot enter parcel: no payment info on file">
Per poter visitare questa zona devi avere devi aver fornito informazioni di pagamento a Linden Lab. Vuoi andare sul sito di [SECOND_LIFE] ed impostarle?
@@ -2035,10 +2157,10 @@ Inseriscilo in una pagina web per dare ad altri un accesso facile a questa ubica
Oggetto: [SUBJECT], Messaggio: [MESSAGE]
</notification>
<notification name="FriendOnline">
- [NAME] è Online
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; è online
</notification>
<notification name="FriendOffline">
- [NAME] è Offline
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; è offline
</notification>
<notification name="AddSelfFriend">
Anche se sei molto simpatico, non puoi aggiungere te stesso all&apos;elenco degli amici.
@@ -2084,6 +2206,12 @@ Questo potrebbe incidere sulla tua password.
<notification name="RezItemNoPermissions">
Permessi insufficienti per creare un oggetto.
</notification>
+ <notification name="IMAcrossParentEstates">
+ Impossibile inviare IM tra proprietà principali diverse.
+ </notification>
+ <notification name="TransferInventoryAcrossParentEstates">
+ Impossibile trasferire l&apos;inventario tra proprietà principali diverse.
+ </notification>
<notification name="UnableToLoadNotecard">
Impossibile caricare la notecard in questo momento.
</notification>
@@ -2145,14 +2273,16 @@ Seleziona solo un oggetto.
Il tuo biglietto da visita non è stato accettato.
</notification>
<notification name="TeleportToLandmark">
- Puoi teleportarti alle ubicazioni come &apos;[NAME]&apos; aprendo il pannello Luoghi sul lato destro dello schermo, quindi selezionare la scheda Punti di riferimento.
-Clicca su un punto di riferimento per selezionarlo, quindi clicca su Teleport sul lato inferiore del pannello.
-(Puoi anche fare doppio clic sul punto di riferimento oppure cliccare su di esso con il tasto destro del mouse e scegliere Teleport.)
+ Per teleportarti a luoghi come &apos;[NAME]&apos;, clicca sul pulsante &quot;Luoghi&quot;,
+ quindi seleziona la scheda Punti di riferimento nel pannello che viene aperto. Clicca su qualsiasi
+ unto di riferimento per selezionarlo, quindi clicca su Teleport sul lato inferiore del pannello.
+ (Puoi anche fare doppio clic sul punto di riferimento oppure cliccare su di esso con il tasto destro del mouse e
+ scegliere Teleport.)
</notification>
<notification name="TeleportToPerson">
- Puoi contattare il residente &apos;[NAME]&apos; aprendo il pannello Persone nel lato destro del tuo schermo.
-Seleziona il residente dall&apos;elenco, clicca su &apos;IM&apos; in basso nel pannello.
-(Puoi anche fare doppio clic sul nome nell&apos;elenco oppure fare clic con il pulsante destro del mouse e selezionare &apos;IM&apos;).
+ Per contattare Residenti come &apos;[NAME]&apos;, clicca sul pulsante &quot;Persone&quot;, seleziona un Residente nel pannello che viene aperto, quindi clicca su &apos;IM&apos; in
+ basso nel pannello.
+ (Puoi anche fare doppio clic sul nome nell&apos;elenco oppure fare clic con il pulsante destro del mouse e selezionare &apos;IM&apos;).
</notification>
<notification name="CantSelectLandFromMultipleRegions">
Non è possibile selezionare il terreno attraverso i confini del server.
@@ -2164,18 +2294,16 @@ Prova a selezionare una parte di terreno più piccola.
<notification name="NoContentToSearch">
Seleziona almeno un tipo di contenuto per la ricerca (Generale, Moderato o Adulti).
</notification>
- <notification name="GroupVote">
- [NAME] ha proposto di votare su:
-[MESSAGE]
- <form name="form">
- <button name="VoteNow" text="Vota ora"/>
- <button name="Later" text="Successivo"/>
- </form>
- </notification>
<notification name="SystemMessage">
[MESSAGE]
</notification>
- <notification name="PaymentRecived">
+ <notification name="PaymentReceived">
+ [MESSAGE]
+ </notification>
+ <notification name="PaymentSent">
+ [MESSAGE]
+ </notification>
+ <notification name="PaymentFailure">
[MESSAGE]
</notification>
<notification name="EventNotification">
@@ -2184,7 +2312,7 @@ Prova a selezionare una parte di terreno più piccola.
[NAME]
[DATE]
<form name="form">
- <button name="Details" text="Descrizione"/>
+ <button name="Details" text="Dettagli"/>
<button name="Cancel" text="Cancella"/>
</form>
</notification>
@@ -2220,7 +2348,7 @@ Reinstalla il plugin o contatta il venditore se continui ad avere questi problem
Gli oggetti che possiedi sul terreno selezionato ti sono stati restituiti nell&apos;inventario.
</notification>
<notification name="OtherObjectsReturned">
- Gli oggetti selezionati sul terreno che è di proprietà di [NAME] sono stati restituiti nel suo inventario.
+ Sono stati restituiti all&apos;inventario di &apos;[NAME]&apos; gli oggetti sul lotto di terreno selezionato di sua proprietà.
</notification>
<notification name="OtherObjectsReturned2">
Sono stati restituiti al proprietario gli oggetti selezionati sul lotto nella terra di proprietà del residente &apos;[NAME]&apos;.
@@ -2254,6 +2382,9 @@ Qui non puoi volare.
<notification name="NoBuild">
In questa zona è proibita la costruzione. Qui non puoi costruire né rezzare oggetti.
</notification>
+ <notification name="SeeAvatars">
+ In questo lotto non si possono vedere avatar e chat di testo presenti in altri lotti. Non puoi vedere altri residenti fuori dal lotto e loro non possono vederti. Viene bloccata anche la normale chat di testo sul canale 0.
+ </notification>
<notification name="ScriptsStopped">
Un amministratore ha temporaneamente disabilitato gli script in questa regione.
</notification>
@@ -2344,12 +2475,20 @@ Riprova tra qualche istante.
Non è stato trovato nessun territorio valido.
</notification>
<notification name="ObjectGiveItem">
- Un oggetto denominato [OBJECTFROMNAME] di proprietà di [NAME_SLURL] ti ha dato questo [OBJECTTYPE]:
-[ITEM_SLURL]
+ Un oggetto denominato &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; di proprietà di [NAME_SLURL] ti ha dato questo [OBJECTTYPE]:
+&lt;nolink&gt;[ITEM_SLURL]&lt;/nolink&gt;
<form name="form">
<button name="Keep" text="Prendi"/>
<button name="Discard" text="Rifiuta"/>
- <button name="Mute" text="Blocca"/>
+ <button name="Mute" text="Blocca Proprietario"/>
+ </form>
+ </notification>
+ <notification name="OwnObjectGiveItem">
+ L&apos;oggetto denominato &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; ti ha dato questo [OBJECTTYPE]:
+&lt;nolink&gt;[ITEM_SLURL]&lt;/nolink&gt;
+ <form name="form">
+ <button name="Keep" text="Mantieni"/>
+ <button name="Discard" text="Elimina"/>
</form>
</notification>
<notification name="UserGiveItem">
@@ -2409,19 +2548,19 @@ Riprova tra qualche istante.
Hai offerto l&apos;amicizia a [TO_NAME]
</notification>
<notification name="OfferFriendshipNoMessage">
- [NAME] ti ha offerto la sua amicizia.
+ [NAME_SLURL] ti ha offerto di diventare amici.
-(Di default, potrete vedervi reciprocamente online.)
+(L&apos;impostazione predefinita consente a ciascuno di vedere se l&apos;altro è online.)
<form name="form">
<button name="Accept" text="Accetta"/>
<button name="Decline" text="Rifiuta"/>
</form>
</notification>
<notification name="FriendshipAccepted">
- [NAME] ha accettato la tua offerta di amicizia.
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; ha accettato la tua richiesta di amicizia.
</notification>
<notification name="FriendshipDeclined">
- [NAME] ha rifiutato la tua offerta di amicizia.
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; ha rifiutato la tua richiesta di amicizia.
</notification>
<notification name="FriendshipAcceptedByMe">
Offerta di amicizia accettata.
@@ -2430,7 +2569,7 @@ Riprova tra qualche istante.
Offerta di amicizia rifiutata.
</notification>
<notification name="OfferCallingCard">
- [NAME] ti offre il suo biglietto da visita.
+ [NOME] ti offre il suo biglietto da visita.
Questo sarà aggiunto nel tuo inventario come segnalibro per consentirti di inviare rapidamente messaggi IM a questo residente.
<form name="form">
<button name="Accept" text="Accetta"/>
@@ -2446,11 +2585,11 @@ Se rimani qui verrai scollegato da Second Life.
Se rimani qui verrai scollegato da Second Life.
</notification>
<notification name="LoadWebPage">
- Caricare pagina web [URL]?
+ Caricare la pagina Web [URL]?
[MESSAGE]
-Dall&apos;oggetto: [OBJECTNAME], di: [NAME]?
+Dall&apos;oggetto: &lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;, proprietario: [NAME]?
<form name="form">
<button name="Gotopage" text="Caricare"/>
<button name="Cancel" text="Annulla"/>
@@ -2466,10 +2605,10 @@ Dall&apos;oggetto: [OBJECTNAME], di: [NAME]?
L&apos;elemento che stai tentando di indossare usa delle caratteristiche che il tuo viewer non può leggere. Aggiorna la versione di [APP_NAME] per poterlo indossare.
</notification>
<notification name="ScriptQuestion">
- &apos;[OBJECTNAME]&apos;, un oggetto di proprietà di &apos;[NAME]&apos;, vorrebbe:
+ &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos;, un oggetto posseduto da &apos;[NAME]&apos; vorrebbe:
[QUESTIONS]
-Va bene?
+OK?
<form name="form">
<button name="Yes" text="Si"/>
<button name="No" text="No"/>
@@ -2477,7 +2616,7 @@ Va bene?
</form>
</notification>
<notification name="ScriptQuestionCaution">
- Un oggetto di nome &apos;[OBJECTNAME]&apos;, posseduto da &apos;[NAME]&apos; vorrebbe:
+ Un oggetto di nome &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos;, posseduto da &apos;[NAME]&apos; vorrebbe:
[QUESTIONS]
Se non ti fidi di questo oggetto e del suo ideatore, dovresti rifiutare la richiesta.
@@ -2490,17 +2629,19 @@ Concedi questa richiesta?
</form>
</notification>
<notification name="ScriptDialog">
- [NAME] &apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos;
+ &apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos; di [NAME]
[MESSAGE]
<form name="form">
- <button name="Ignore" text="Ignora"/>
+ <button name="Client_Side_Mute" text="Blocca"/>
+ <button name="Client_Side_Ignore" text="Ignora"/>
</form>
</notification>
<notification name="ScriptDialogGroup">
- [GROUPNAME] &apos;[TITLE]&apos;
+ &apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos; di [GROUPNAME]
[MESSAGE]
<form name="form">
- <button name="Ignore" text="Ignora"/>
+ <button name="Client_Side_Mute" text="Blocca"/>
+ <button name="Client_Side_Ignore" text="Ignora"/>
</form>
</notification>
<notification name="BuyLindenDollarSuccess">
@@ -2537,10 +2678,10 @@ Clicca su Accetta per unirti alla chiamata oppure su Declina to declinare l&apos
[NAME] ha ricevuto un IM ed è stato automaticamente sbloccato.
</notification>
<notification name="AutoUnmuteByMoney">
- [NAME] ha ricevuto del denaro e pertanto è stato automaticamente sbloccato.
+ [NAME] ha ricevuto del denaro ed è stato automaticamente sbloccato.
</notification>
<notification name="AutoUnmuteByInventory">
- A [NAME] è stato offerto un elemento dell&apos;Inventario e pertanto è stato automaticamente sbloccato.
+ [NAME] ha ricevuto un&apos;offerta di inventario ed è stato automaticamente sbloccato.
</notification>
<notification name="VoiceInviteGroup">
[NAME] si è aggiunto alla chiamata in chat vocale con il gruppo [GROUP].
@@ -2623,9 +2764,6 @@ Clicca su Accetta per unirti alla chat oppure su Declina per declinare l&apos;in
<notification name="VoiceCallGenericError">
Si è verificato un errore durante il tentativo di collegarti a una voice chat con [VOICE_CHANNEL_NAME]. Riprova più tardi.
</notification>
- <notification name="ServerVersionChanged">
- Sei appena entrato in una regione che usa una versione differente del server: ciò potrebbe incidere sule prestazioni. [[URL] Visualizza le note sulla versione.]
- </notification>
<notification name="UnsupportedCommandSLURL">
Lo SLurl su cui hai cliccato non è valido.
</notification>
@@ -2665,6 +2803,10 @@ Per sicurezza, verranno bloccati per alcuni secondi.
La tua voce è stata interrotta dal moderatore.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="UploadCostConfirmation">
+ Questo caricamento costerà L$[PRICE]. Continuare con il caricamento?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="Carica"/>
+ </notification>
<notification name="ConfirmClearTeleportHistory">
Sei sicuro di volere cancellare la cronologia dei tuoi teleport?
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
@@ -2676,14 +2818,37 @@ Il pulsante verrà visualizzato quando lo spazio sarà sufficiente.
<notification name="ShareNotification">
Scegli i residenti con i quali condividere.
</notification>
+ <notification name="MeshUploadError">
+ [LABEL] non è stato caricato: [MESSAGE] [IDENTIFIER]
+
+Per informazioni dettagliate, vedi il file del registro.
+ </notification>
+ <notification name="MeshUploadPermError">
+ Errore durante la richiesta di autorizzazione al caricamento del reticolo.
+ </notification>
+ <notification name="RegionCapabilityRequestError">
+ Non è stata ottenuta la capacità della regione &apos;[CAPABILITY]&apos;.
+ </notification>
<notification name="ShareItemsConfirmation">
Sei sicuro di volere condividere gli oggetti
-[ITEMS]
+&lt;nolink&gt;[MSG]&lt;/nolink&gt;
Con i seguenti residenti?
[RESIDENTS]
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="ShareFolderConfirmation">
+ Si può condividere solo una cartella alla volta.
+
+Sei sicuro di volere condividere gli oggetti seguenti:
+
+&lt;nolink&gt;[ITEMS]&lt;/nolink&gt;
+
+Con i seguenti residenti:
+
+[RESIDENTS]
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="Ok"/>
</notification>
<notification name="ItemsShared">
@@ -2692,6 +2857,19 @@ Con i seguenti residenti?
<notification name="DeedToGroupFail">
Cessione al gruppo non riuscita.
</notification>
+ <notification name="ReleaseLandThrottled">
+ Il lotto [PARCEL_NAME] non può essere abbandonato in questo momento.
+ </notification>
+ <notification name="ReleasedLandWithReclaim">
+ Il lotto di [AREA] m² &apos;[PARCEL_NAME]&apos; è stato rilasciato.
+
+Hai [RECLAIM_PERIOD] ore per riprendere possesso per L$0 prima che venga messo in vendita a chiunque altro.
+ </notification>
+ <notification name="ReleasedLandNoReclaim">
+ Il lotto di [AREA] m² &apos;[PARCEL_NAME]&apos; è stato rilasciato.
+
+Ora è disponibile per l&apos;acquisto da parte di chiunque.
+ </notification>
<notification name="AvatarRezNotification">
( in esistenza da [EXISTENCE] secondi )
Nuvola avatar &apos;[NAME]&apos; dileguata dopo [TIME] secondi.
@@ -2728,9 +2906,7 @@ Avatar &apos;[NAME]&apos; ha lasciato la modalità aspetto.
<notification name="NoConnect">
Ci sono problemi di connessione tramite [PROTOCOL] [HOSTID].
Ti consigliamo di controllare le tue impostazioni di rete e della firewall.
- <form name="form">
- <button name="OK" text="OK"/>
- </form>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="NoVoiceConnect">
A causa di problemi di connessione al server vocale
@@ -2739,9 +2915,7 @@ Ti consigliamo di controllare le tue impostazioni di rete e della firewall.
le comunicazioni tramite voce non saranno disponibili.
Ti consigliamo di controllare le tue impostazioni di rete e della firewall.
- <form name="form">
- <button name="OK" text="OK"/>
- </form>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="AvatarRezLeftNotification">
( presente da [EXISTENCE] secondi )
@@ -2765,11 +2939,167 @@ In questo modo verrà disattivato l&apos;audio anche di tutti i residenti che si
uniscono alla chiamata in un secondo momento, anche dopo che tu ti fossi scollegato.
Disattiva audio di tutti?
- <usetemplate ignoretext="Conferma prima di disattivare l&apos;audio di tutti i partecipanti alla chiamata di gruppo" name="okcancelignore" notext="Annulla" yestext="Ok"/>
+ <usetemplate ignoretext="Conferma prima di disattivare l&apos;audio di tutti i partecipanti alla chiamata di gruppo" name="okcancelignore" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification label="Chat" name="HintChat">
+ Per partecipare alla conversazione, digita nel campo chat in basso.
+ </notification>
+ <notification label="Alzati" name="HintSit">
+ Per alzarti ed uscire dalla posizione seduta, clicca sul pulsante Alzati.
+ </notification>
+ <notification label="Parla" name="HintSpeak">
+ Clicca sul pulsante Parla per attivare o disattivare il microfono.
+
+Clicca sul tasto freccia su per visualizzare il pannello di controllo voce.
+
+Se nascondi il tasto Parla viene disattivata la funzione voce.
+ </notification>
+ <notification label="Esplora il mondo" name="HintDestinationGuide">
+ La Guida alle destinazioni contiene migliaia di nuovi luoghi da scoprire. Seleziona una destinazione e scegli Teleport per iniziare a esplorare.
+ </notification>
+ <notification label="Pannello laterale" name="HintSidePanel">
+ Nel pannello laterale puoi acccedere rapidamente all&apos;inventario, ai vestiti, ai profili e ad altro ancora.
+ </notification>
+ <notification label="Movimento" name="HintMove">
+ Per camminare o correre, apri il pannello Sposta e usa le frecce direzionali per spostarti. Puoi anche usare le frecce direzionali sulla tastiera del computer.
+ </notification>
+ <notification label="" name="HintMoveClick">
+ 1. Clicca per camminare
+Clicca dovunque sul terreno per camminare verso quella posizione.
+
+2. Clicca e trascina per ruotare la visuale
+Clicca e trascina dovunque nel mondo per ruotare la visuale
+ </notification>
+ <notification label="Nome visualizzato" name="HintDisplayName">
+ Imposta qui il tuo nome visualizzato personalizzabile. È in aggiunta al tuo nome utente, che non può essere cambiato. Nelle preferenze puoi anche cambiare il modo in cui vedi i nomi degli altri.
+ </notification>
+ <notification label="Visuale" name="HintView">
+ Per cambiare la visuale della fotocamera, usa i controlli Ruota visuale e Panoramica. Ripristina la visuale premendo il tasto Esc o camminando.
+ </notification>
+ <notification label="Inventario" name="HintInventory">
+ Trova oggetti nel tuo inventario. I più recenti si trovano nella scheda Elementi recenti.
+ </notification>
+ <notification label="Hai dollari Linden!" name="HintLindenDollar">
+ Ecco il saldo attuale in L$. Clicca su Acquista L$ per acquistare altri dollari Linden.
+ </notification>
+ <notification name="LowMemory">
+ L&apos;allocazione di memoria è quasi esaurita. Alcune funzioni di SL sono state disattivate per evitare un crash. Chiudi le altre applicazioni. Se il problema persiste, riavvia SL.
+ </notification>
+ <notification name="ForceQuitDueToLowMemory">
+ SL verrà interrotto tra 30 secondi a causa di spazio di memoria insufficiente.
+ </notification>
+ <notification name="PopupAttempt">
+ Non è stato possibile aprire una finestra pop-up.
+ <form name="form">
+ <ignore name="ignore" text="Attiva tutti i pop-up"/>
+ <button name="open" text="Apri finestra pop-up"/>
+ </form>
+ </notification>
+ <notification name="SOCKS_NOT_PERMITTED">
+ Il proxy SOCKS 5 &quot;[HOST]:[PORT]&quot; ha rifiutato il collegamento, che non è consentito dalle regole.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_CONNECT_ERROR">
+ Il proxy SOCKS 5 &quot;[HOST]:[PORT]&quot; ha rifiutato il collegamento. Non è stato possibile aprire il canale TCP.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_NOT_ACCEPTABLE">
+ Il proxy SOCKS 5 &quot;[HOST]:[PORT]&quot; ha rifiutato il sistema di autenticazione selezionato.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_AUTH_FAIL">
+ Il proxy SOCKS 5 &quot;[HOST]:[PORT]&quot; ha indicato che le credenziali non sono valide.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_UDP_FWD_NOT_GRANTED">
+ Il proxy SOCKS 5 &quot;[HOST]:[PORT]&quot; ha rifiutato la richiesta associata UDP.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_HOST_CONNECT_FAILED">
+ Collegamento non riuscito al server proxy SOCKS 5 &quot;[HOST]:[PORT]&quot;.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_UNKNOWN_STATUS">
+ Errore proxy sconosciuto per il server &quot;[HOST]:[PORT]&quot;.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_INVALID_HOST">
+ Indirizzo proxy SOCKS o porta &quot;[HOST]:[PORT]&quot; non validi.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_BAD_CREDS">
+ Nome utente o password SOCKS 5 non validi.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="PROXY_INVALID_HTTP_HOST">
+ Indirizzo proxy HTTP o porta &quot;[HOST]:[PORT]&quot; non validi.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="PROXY_INVALID_SOCKS_HOST">
+ Indirizzo proxy SOCKS o porta &quot;[HOST]:[PORT]&quot; non validi.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ChangeProxySettings">
+ Le impostazioni proxy avranno effetto dopo il riavvio di [APP_NAME].
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="AuthRequest">
+ Il sito &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos; nel reame &apos;[REALM]&apos; richiede un nome utente e una password.
+ <form name="form">
+ <input name="username" text="Nome utente"/>
+ <input name="password" text="Password"/>
+ <button name="ok" text="Invia"/>
+ <button name="cancel" text="Annulla"/>
+ </form>
+ </notification>
+ <notification label="" name="NoClassifieds">
+ La creazione e la modifica degli annunci sono disponibili solo in modalità Avanzata. Uscire e cambiare la modalità? Sulla schermata di accesso si può selezionare la modalità.
+ <usetemplate name="okcancelbuttons" notext="Non uscire" yestext="Esci"/>
+ </notification>
+ <notification label="" name="NoGroupInfo">
+ La creazione e la modifica dei gruppi sono disponibili solo in modalità Avanzata. Uscire e cambiare la modalità? Sulla schermata di accesso si può selezionare la modalità.
+ <usetemplate name="okcancelbuttons" notext="Non uscire" yestext="Esci"/>
+ </notification>
+ <notification label="" name="NoPlaceInfo">
+ La visualizzazione del profilo del luogo è disponibile solo in modalità Avanzata. Uscire e cambiare la modalità? Sulla schermata di accesso si può selezionare la modalità.
+ <usetemplate name="okcancelbuttons" notext="Non uscire" yestext="Esci"/>
+ </notification>
+ <notification label="" name="NoPicks">
+ La creazione e la modifica dei luoghi preferiti sono disponibili solo in modalità Avanzata. Uscire e cambiare la modalità? Sulla schermata di accesso si può selezionare la modalità.
+ <usetemplate name="okcancelbuttons" notext="Non uscire" yestext="Esci"/>
+ </notification>
+ <notification label="" name="NoWorldMap">
+ La visualizzazione della mappa del mondo è disponibile solo in modalità Avanzata. Uscire e cambiare la modalità? Sulla schermata di accesso si può selezionare la modalità.
+ <usetemplate name="okcancelbuttons" notext="Non uscire" yestext="Esci"/>
+ </notification>
+ <notification label="" name="NoVoiceCall">
+ Le chiamate Voce sono disponibili solo in modalità Avanzata. Eseguire il logout e cambiare la modalità?
+ <usetemplate name="okcancelbuttons" notext="Non uscire" yestext="Esci"/>
+ </notification>
+ <notification label="" name="NoAvatarShare">
+ La condivisione è disponibile solo in modalità Avanzata. Eseguire il logout e cambiare la modalità?
+ <usetemplate name="okcancelbuttons" notext="Non uscire" yestext="Esci"/>
+ </notification>
+ <notification label="" name="NoAvatarPay">
+ Il pagamento ad altri residenti è disponibile solo in modalità Avanzata. Eseguire il logout e cambiare la modalità?
+ <usetemplate name="okcancelbuttons" notext="Non uscire" yestext="Esci"/>
+ </notification>
+ <notification label="" name="NoInventory">
+ La visualizzazione dell&apos;inventario è disponibile solo in modalità Avanzata. Eseguire il logout e cambiare la modalità?
+ <usetemplate name="okcancelbuttons" notext="Non uscire" yestext="Esci"/>
+ </notification>
+ <notification label="" name="NoAppearance">
+ L&apos;editor dell&apos;aspetto è disponibile solo in modalità Avanzata. Eseguire il logout e cambiare la modalità?
+ <usetemplate name="okcancelbuttons" notext="Non uscire" yestext="Esci"/>
+ </notification>
+ <notification label="" name="NoSearch">
+ La ricerca è disponibile solo in modalità Avanzata. Eseguire il logout e cambiare la modalità?
+ <usetemplate name="okcancelbuttons" notext="Non uscire" yestext="Esci"/>
+ </notification>
+ <notification label="" name="ConfirmHideUI">
+ Questa azione cancellerà tutte le voci di menu e i pulsanti. Per visualizzarli nuovamente cliccare ancora [SHORTCUT].
+ <usetemplate ignoretext="Conferma prima di nascondere l&apos;interfaccia" name="okcancelignore" notext="Annulla" yestext="OK"/>
</notification>
- <global name="UnsupportedCPU">
- - La velocità della tua CPU non soddisfa i requisiti minimi.
- </global>
<global name="UnsupportedGLRequirements">
Non sembra che tu abbia i requisiti hardware adeguati per [APP_NAME]. [APP_NAME] richiede una scheda grafica OpenGL con supporto multitexture. Se ne hai una in dotazione, accertati di avere i driver, i service pack e i patch più recenti per la scheda grafica e per il sistema operativo.
diff --git a/indra/newview/skins/default/xui/it/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/it/panel_avatar_list_item.xml
index 3e604ca775..ede19b9e5a 100644
--- a/indra/newview/skins/default/xui/it/panel_avatar_list_item.xml
+++ b/indra/newview/skins/default/xui/it/panel_avatar_list_item.xml
@@ -21,7 +21,7 @@
<string name="FormatYears">
[COUNT] a
</string>
- <text name="avatar_name" value="Sconosciuto"/>
+ <text name="avatar_name" value="(caricamento in corso)"/>
<icon name="permission_edit_theirs_icon" tool_tip="Puoi modificare gli oggetti di questo amico"/>
<icon name="permission_edit_mine_icon" tool_tip="Questo amico può modificare, cancellare o prendere i tuoi oggetti"/>
<icon name="permission_map_icon" tool_tip="Questo amico può identificarti sulla mappa"/>
diff --git a/indra/newview/skins/default/xui/it/panel_chiclet_bar.xml b/indra/newview/skins/default/xui/it/panel_chiclet_bar.xml
new file mode 100644
index 0000000000..66bf3f140f
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_chiclet_bar.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="chiclet_bar">
+ <layout_stack name="toolbar_stack">
+ <layout_panel name="im_well_panel">
+ <chiclet_im_well name="im_well">
+ <button name="Unread IM messages" tool_tip="Conversazioni"/>
+ </chiclet_im_well>
+ </layout_panel>
+ <layout_panel name="notification_well_panel">
+ <chiclet_notification name="notification_well">
+ <button name="Unread" tool_tip="Notifiche"/>
+ </chiclet_notification>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_edit_alpha.xml b/indra/newview/skins/default/xui/it/panel_edit_alpha.xml
index 286ee626cf..6daa0cf8fd 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_alpha.xml
+++ b/indra/newview/skins/default/xui/it/panel_edit_alpha.xml
@@ -1,10 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_alpha_panel">
- <panel name="avatar_alpha_color_panel">
- <texture_picker label="Alpha inferiore" name="Lower Alpha" tool_tip="Clicca per scegliere una fotografia"/>
- <texture_picker label="Alpha superiore" name="Upper Alpha" tool_tip="Clicca per scegliere una fotografia"/>
- <texture_picker label="Alpha della testa" name="Head Alpha" tool_tip="Clicca per scegliere una fotografia"/>
- <texture_picker label="Alpha dell&apos;occhio" name="Eye Alpha" tool_tip="Clicca per scegliere una fotografia"/>
- <texture_picker label="Alpha dei capelli" name="Hair Alpha" tool_tip="Clicca per scegliere una fotografia"/>
- </panel>
+ <scroll_container name="avatar_alpha_color_panel_scroll">
+ <panel name="avatar_alpha_color_panel">
+ <texture_picker label="Alpha inferiore" name="Lower Alpha" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Alpha superiore" name="Upper Alpha" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Alpha della testa" name="Head Alpha" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Alpha dell&apos;occhio" name="Eye Alpha" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Alpha dei capelli" name="Hair Alpha" tool_tip="Clicca per scegliere una fotografia"/>
+ </panel>
+ </scroll_container>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_edit_gloves.xml b/indra/newview/skins/default/xui/it/panel_edit_gloves.xml
index 48024b8095..366a82f7aa 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_gloves.xml
+++ b/indra/newview/skins/default/xui/it/panel_edit_gloves.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_gloves_panel">
<panel name="avatar_gloves_color_panel">
- <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Texture" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/it/panel_edit_jacket.xml b/indra/newview/skins/default/xui/it/panel_edit_jacket.xml
index d77c1ec763..337720d068 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_jacket.xml
+++ b/indra/newview/skins/default/xui/it/panel_edit_jacket.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_jacket_panel">
<panel name="avatar_jacket_color_panel">
- <texture_picker label="Tessuto superiore" name="Upper Fabric" tool_tip="Clicca per scegliere una fotografia"/>
- <texture_picker label="Tessuto inferiore" name="Lower Fabric" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Texture superiore" name="Upper Fabric" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Texture inferiore" name="Lower Fabric" tool_tip="Clicca per scegliere una fotografia"/>
<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/it/panel_edit_pants.xml b/indra/newview/skins/default/xui/it/panel_edit_pants.xml
index 83ef274877..21b5b7c026 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_pants.xml
+++ b/indra/newview/skins/default/xui/it/panel_edit_pants.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_pants_panel">
<panel name="avatar_pants_color_panel">
- <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Texture" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/it/panel_edit_physics.xml b/indra/newview/skins/default/xui/it/panel_edit_physics.xml
new file mode 100644
index 0000000000..669a2c0eab
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_edit_physics.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_physics_panel">
+ <panel label="" name="accordion_panel">
+ <accordion name="physics_accordion">
+ <accordion_tab name="physics_breasts_updown_tab" title="Rimbalzo seno"/>
+ <accordion_tab name="physics_breasts_inout_tab" title="Décolleté"/>
+ <accordion_tab name="physics_breasts_leftright_tab" title="Ondeggiamento seno"/>
+ <accordion_tab name="physics_belly_tab" title="Rimbalzo pancia"/>
+ <accordion_tab name="physics_butt_tab" title="Rimbalzo natiche"/>
+ <accordion_tab name="physics_butt_leftright_tab" title="Ondeggiamento natiche"/>
+ <accordion_tab name="physics_advanced_tab" title="Parametri avanzati"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_edit_pick.xml b/indra/newview/skins/default/xui/it/panel_edit_pick.xml
index 8e464ca037..145b8cf4e3 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_pick.xml
+++ b/indra/newview/skins/default/xui/it/panel_edit_pick.xml
@@ -29,7 +29,7 @@
<layout_panel name="layout_panel1">
<button label="Salva luogo preferito" name="save_changes_btn"/>
</layout_panel>
- <layout_panel name="layout_panel1">
+ <layout_panel name="layout_panel2">
<button label="Annulla" name="cancel_btn"/>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/it/panel_edit_profile.xml b/indra/newview/skins/default/xui/it/panel_edit_profile.xml
index 263ae105dc..545e96a8f1 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/it/panel_edit_profile.xml
@@ -22,6 +22,14 @@
<scroll_container name="profile_scroll">
<panel name="scroll_content_panel">
<panel name="data_panel">
+ <text name="display_name_label" value="Nome visualizzato:"/>
+ <text name="solo_username_label" value="Nome utente:"/>
+ <button name="set_name" tool_tip="Imposta nome visualizzato"/>
+ <text name="solo_user_name" value="Hamilton Hitchings"/>
+ <text name="user_name" value="Hamilton Hitchings"/>
+ <text name="user_name_small" value="Hamilton Hitchings"/>
+ <text name="user_label" value="Nome utente:"/>
+ <text name="user_slid" value="hamilton.linden"/>
<panel name="lifes_images_panel">
<icon label="" name="2nd_life_edit_icon" tool_tip="Clicca per selezionare un&apos;immagine"/>
</panel>
@@ -38,7 +46,7 @@
<text name="my_account_link" value="[[URL] Go to My Dashboard]"/>
<text name="title_partner_text" value="Il mio partner:"/>
<panel name="partner_data_panel">
- <name_box initial_value="(recupero)" name="partner_text"/>
+ <text initial_value="(recupero)" name="partner_text"/>
</panel>
<text name="partner_edit_link" value="[[URL] Edit]"/>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_edit_shirt.xml b/indra/newview/skins/default/xui/it/panel_edit_shirt.xml
index 1f41b28348..1777c0147f 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_shirt.xml
+++ b/indra/newview/skins/default/xui/it/panel_edit_shirt.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_shirt_panel">
<panel name="avatar_shirt_color_panel">
- <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Texture" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/it/panel_edit_shoes.xml b/indra/newview/skins/default/xui/it/panel_edit_shoes.xml
index 7a82c8e99d..c79408b94a 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_shoes.xml
+++ b/indra/newview/skins/default/xui/it/panel_edit_shoes.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_shoes_panel">
<panel name="avatar_shoes_color_panel">
- <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Texture" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/it/panel_edit_skin.xml b/indra/newview/skins/default/xui/it/panel_edit_skin.xml
index a15489b333..466eff2708 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_skin.xml
+++ b/indra/newview/skins/default/xui/it/panel_edit_skin.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_skin_panel">
<panel name="avatar_skin_color_panel">
- <texture_picker label="Tatuaggi testa" name="Head Tattoos" tool_tip="Clicca per scegliere una fotografia"/>
- <texture_picker label="Tatuaggi superiori" name="Upper Tattoos" tool_tip="Clicca per scegliere una fotografia"/>
- <texture_picker label="Tatuaggi inferiori" name="Lower Tattoos" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Testa" name="Head" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Parte superiore del corpo" name="Upper Body" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Parte inferiore del corpo" name="Lower Body" tool_tip="Clicca per scegliere una fotografia"/>
</panel>
<panel name="accordion_panel">
<accordion name="wearable_accordion">
diff --git a/indra/newview/skins/default/xui/it/panel_edit_skirt.xml b/indra/newview/skins/default/xui/it/panel_edit_skirt.xml
index 7080b65737..87cdd16676 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_skirt.xml
+++ b/indra/newview/skins/default/xui/it/panel_edit_skirt.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_skirt_panel">
<panel name="avatar_skirt_color_panel">
- <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Texture" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/it/panel_edit_socks.xml b/indra/newview/skins/default/xui/it/panel_edit_socks.xml
index 6731511282..f61a72ed76 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_socks.xml
+++ b/indra/newview/skins/default/xui/it/panel_edit_socks.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_socks_panel">
<panel name="avatar_socks_color_panel">
- <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Texture" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/it/panel_edit_underpants.xml b/indra/newview/skins/default/xui/it/panel_edit_underpants.xml
index 671eb57551..924344e3c0 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_underpants.xml
+++ b/indra/newview/skins/default/xui/it/panel_edit_underpants.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_underpants_panel">
<panel name="avatar_underpants_color_panel">
- <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Texture" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/it/panel_edit_undershirt.xml b/indra/newview/skins/default/xui/it/panel_edit_undershirt.xml
index fccc86f8fc..2f22c03294 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_undershirt.xml
+++ b/indra/newview/skins/default/xui/it/panel_edit_undershirt.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_undershirt_panel">
<panel name="avatar_undershirt_color_panel">
- <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Texture" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/it/panel_edit_wearable.xml b/indra/newview/skins/default/xui/it/panel_edit_wearable.xml
index 94bda7b2a6..e54dc26d05 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_wearable.xml
+++ b/indra/newview/skins/default/xui/it/panel_edit_wearable.xml
@@ -45,6 +45,9 @@
<string name="edit_tattoo_title">
Modifica del tatuaggio
</string>
+ <string name="edit_physics_title">
+ Modifica fisica
+ </string>
<string name="shape_desc_text">
Figura corporea:
</string>
@@ -90,6 +93,9 @@
<string name="tattoo_desc_text">
Tatuaggio:
</string>
+ <string name="physics_desc_text">
+ Fisica:
+ </string>
<labeled_back_button label="Salva" name="back_btn" tool_tip="Torna alla modifica del vestiario"/>
<text name="edit_wearable_title" value="Modifica della figura corporea"/>
<panel label="Camicia" name="wearable_type_panel">
diff --git a/indra/newview/skins/default/xui/it/panel_group_land_money.xml b/indra/newview/skins/default/xui/it/panel_group_land_money.xml
index 16cc91cd9d..27675a18f5 100644
--- a/indra/newview/skins/default/xui/it/panel_group_land_money.xml
+++ b/indra/newview/skins/default/xui/it/panel_group_land_money.xml
@@ -24,6 +24,7 @@
<scroll_list.columns label="Regione" name="location"/>
<scroll_list.columns label="Tipo" name="type"/>
<scroll_list.columns label="Superficie" name="area"/>
+ <scroll_list.columns label="Nascosto" name="hidden"/>
</scroll_list>
<text name="total_contributed_land_label">
Contributo totale:
diff --git a/indra/newview/skins/default/xui/it/panel_group_notices.xml b/indra/newview/skins/default/xui/it/panel_group_notices.xml
index 2e2f0dc7b0..524f7d2822 100644
--- a/indra/newview/skins/default/xui/it/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/it/panel_group_notices.xml
@@ -25,18 +25,15 @@ Massimo 200 per gruppo al giorno
<text name="lbl">
Crea una notice
</text>
- <text left="20" name="lbl3">
+ <text name="lbl3">
Oggetto:
</text>
- <line_editor left_delta="61" name="create_subject" width="251"/>
- <text left="15" name="lbl4" width="60">
+ <text name="lbl4">
Messaggio:
</text>
- <text_editor left_delta="66" name="create_message" width="330"/>
- <text name="lbl5" width="68">
+ <text name="lbl5">
Allega:
</text>
- <line_editor left_delta="74" name="create_inventory_name" width="190"/>
<text name="string">
Trascina e rilascia qui l&apos;oggetto da allegare:
</text>
diff --git a/indra/newview/skins/default/xui/it/panel_login.xml b/indra/newview/skins/default/xui/it/panel_login.xml
index 473bcfa88d..f88230ed11 100644
--- a/indra/newview/skins/default/xui/it/panel_login.xml
+++ b/indra/newview/skins/default/xui/it/panel_login.xml
@@ -11,12 +11,19 @@
<text name="username_text">
Nome utente:
</text>
- <line_editor label="Nome utente" name="username_edit" tool_tip="Nome utente [SECOND_LIFE]"/>
+ <combo_box name="username_combo" tool_tip="Il nome utente che hai scelto durante la registrazione, come robby12 o Stella Soleggiato"/>
<text name="password_text">
Password:
</text>
<check_box label="Ricorda password" name="remember_check"/>
<button label="Accedi" name="connect_btn"/>
+ <text name="mode_selection_text">
+ Modalità:
+ </text>
+ <combo_box name="mode_combo" tool_tip="Seleziona la modalità. Seleziona Di base per esplorare facilmente e rapidamente e per la chat. Seleziona Avanzata per accedere ad altre funzionalità.">
+ <combo_box.item label="Di base" name="Basic"/>
+ <combo_box.item label="Avanzate" name="Advanced"/>
+ </combo_box>
<text name="start_location_text">
Inizia da:
</text>
@@ -31,7 +38,7 @@
Iscriviti
</text>
<text name="forgot_password_text">
- Hai dimenticato il nome o la password?
+ Hai dimenticato il nome utente o la password?
</text>
<text name="login_help">
Ti serve aiuto con la fase di accesso?
diff --git a/indra/newview/skins/default/xui/it/panel_me.xml b/indra/newview/skins/default/xui/it/panel_me.xml
index 66601aa165..a134f6f1de 100644
--- a/indra/newview/skins/default/xui/it/panel_me.xml
+++ b/indra/newview/skins/default/xui/it/panel_me.xml
@@ -1,7 +1,4 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Il mio profilo" name="panel_me">
- <tab_container name="tabs">
- <panel label="IL MIO PROFILO" name="panel_profile"/>
- <panel label="I MIEI PREFERITI" name="panel_picks"/>
- </tab_container>
+ <panel label="I MIEI PREFERITI" name="panel_picks"/>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_media_settings_general.xml b/indra/newview/skins/default/xui/it/panel_media_settings_general.xml
index 5ed7b23679..f11b2415ee 100644
--- a/indra/newview/skins/default/xui/it/panel_media_settings_general.xml
+++ b/indra/newview/skins/default/xui/it/panel_media_settings_general.xml
@@ -22,7 +22,7 @@
<text name="media_setting_note">
Nota: I residenti possono annullare questa impostazione
</text>
- <check_box initial_value="false" label="Messa in scala automatica dell&apos;elemento multimediale sulla faccia dell&apos;oggetto" name="auto_scale"/>
+ <check_box initial_value="false" label="Messa in scala automatica dell&apos;elemento multimediale sulla &#10;faccia dell&apos;oggetto" name="auto_scale"/>
<text name="size_label">
Dimensioni:
</text>
diff --git a/indra/newview/skins/default/xui/it/panel_my_profile.xml b/indra/newview/skins/default/xui/it/panel_my_profile.xml
deleted file mode 100644
index 3e6683beb8..0000000000
--- a/indra/newview/skins/default/xui/it/panel_my_profile.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Profilo" name="panel_profile">
- <string name="no_partner_text" value="Nessuno"/>
- <string name="no_group_text" value="Nessuno"/>
- <string name="RegisterDateFormat">
- [REG_DATE] ([AGE])
- </string>
- <layout_stack name="layout">
- <layout_panel name="profile_stack">
- <scroll_container name="profile_scroll">
- <panel name="scroll_content_panel">
- <panel name="second_life_image_panel">
- <icon label="" name="2nd_life_edit_icon" tool_tip="Clicca sul pulsante Modifica profilo per cambiare l&apos;immagine"/>
- <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/>
- </panel>
- <panel name="first_life_image_panel">
- <icon label="" name="real_world_edit_icon" tool_tip="Clicca sul pulsante Modifica profilo per cambiare l&apos;immagine"/>
- <text name="title_rw_descr_text" value="Mondo reale:"/>
- </panel>
- <text name="title_member_text" value="Residente dal:"/>
- <text name="title_acc_status_text" value="Stato account:"/>
- <text name="title_partner_text" value="Partner:"/>
- <panel name="partner_data_panel">
- <name_box initial_value="(recupero)" name="partner_text"/>
- </panel>
- <text name="title_groups_text" value="Gruppi:"/>
- </panel>
- </scroll_container>
- </layout_panel>
- </layout_stack>
- <panel name="profile_me_buttons_panel">
- <button label="Modifica profilo" name="edit_profile_btn" tool_tip="Modifica le tue informazioni personali"/>
- </panel>
-</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_navigation_bar.xml b/indra/newview/skins/default/xui/it/panel_navigation_bar.xml
index 8e72167759..0299e2a532 100644
--- a/indra/newview/skins/default/xui/it/panel_navigation_bar.xml
+++ b/indra/newview/skins/default/xui/it/panel_navigation_bar.xml
@@ -1,18 +1,23 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="navigation_bar">
- <panel name="navigation_panel">
- <pull_button name="back_btn" tool_tip="Torna al luogo precedente"/>
- <pull_button name="forward_btn" tool_tip="Procedi un luogo in avanti"/>
- <button name="home_btn" tool_tip="Teleport a casa"/>
- <location_input label="Posizione" name="location_combo"/>
- <search_combo_box label="Cerca" name="search_combo_box" tool_tip="Cerca">
- <combo_editor label="Cerca [SECOND_LIFE]" name="search_combo_editor"/>
- </search_combo_box>
- </panel>
- <favorites_bar name="favorite" tool_tip="Trascina qui i punti di riferimento per un accesso rapido ai tuoi posti preferiti in Second Life.">
- <label name="favorites_bar_label" tool_tip="Trascina qui i punti di riferimento per un accesso rapido ai tuoi posti preferiti in Second Life.">
- Barra dei Preferiti
- </label>
- <chevron_button name="&gt;&gt;" tool_tip="Mostra altri Preferiti"/>
- </favorites_bar>
+ <layout_stack name="nvp_stack">
+ <layout_panel name="navigation_layout_panel">
+ <panel name="navigation_panel">
+ <pull_button name="back_btn" tool_tip="Torna al luogo precedente"/>
+ <pull_button name="forward_btn" tool_tip="Procedi un luogo in avanti"/>
+ <button name="home_btn" tool_tip="Teleport a casa"/>
+ <location_input label="Posizione" name="location_combo"/>
+ </panel>
+ </layout_panel>
+ <layout_panel name="favorites_layout_panel">
+ <favorites_bar name="favorite" tool_tip="Trascina qui i punti di riferimento per un accesso rapido ai tuoi posti preferiti in Second Life.">
+ <label name="favorites_bar_label" tool_tip="Trascina qui i punti di riferimento per un accesso rapido ai tuoi posti preferiti in Second Life.">
+ Barra dei Preferiti
+ </label>
+ <more_button name="&gt;&gt;" tool_tip="Mostra altri Preferiti">
+ Altro â–¼
+ </more_button>
+ </favorites_bar>
+ </layout_panel>
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_nearby_chat.xml b/indra/newview/skins/default/xui/it/panel_nearby_chat.xml
new file mode 100644
index 0000000000..d46a15c735
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_nearby_chat.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="nearby_chat">
+ <layout_stack name="stack">
+ <layout_panel name="translate_chat_checkbox_lp">
+ <check_box label="Traduci chat" name="translate_chat_checkbox"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_nearby_media.xml b/indra/newview/skins/default/xui/it/panel_nearby_media.xml
index 40312f76b4..03421456f9 100644
--- a/indra/newview/skins/default/xui/it/panel_nearby_media.xml
+++ b/indra/newview/skins/default/xui/it/panel_nearby_media.xml
@@ -19,7 +19,7 @@
<button label="Spegni" name="all_nearby_media_disable_btn" tool_tip="Spegni tutti i media nei dintorni"/>
<button label="Accendi tutto" name="all_nearby_media_enable_btn" tool_tip="Accendi tutti i media nei dintorni"/>
<button name="open_prefs_btn" tool_tip="Accedi alle preferenze del media"/>
- <button label="Più &gt;&gt;" label_selected="Meno &lt;&lt;" name="more_btn" tool_tip="Opzioni avanzate"/>
+ <button label="Più &gt;&gt;" label_selected="&lt;&lt; Meno" name="more_btn" tool_tip="Opzioni avanzate"/>
<button label="Più &gt;&gt;" label_selected="Meno &lt;&lt;" name="less_btn" tool_tip="Opzioni avanzate"/>
</panel>
<panel name="nearby_media_panel">
diff --git a/indra/newview/skins/default/xui/it/panel_notes.xml b/indra/newview/skins/default/xui/it/panel_notes.xml
deleted file mode 100644
index e127138277..0000000000
--- a/indra/newview/skins/default/xui/it/panel_notes.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Note e Privacy" name="panel_notes">
- <layout_stack name="layout">
- <layout_panel name="notes_stack">
- <scroll_container name="profile_scroll">
- <panel name="profile_scroll_panel">
- <text name="status_message" value="Le mie note private:"/>
- <text name="status_message2" value="Consenti a questa persona di:"/>
- <check_box label="Vedere se sono online" name="status_check"/>
- <check_box label="Vedermi sulla mappa" name="map_check"/>
- <check_box label="Modificare, eliminare o prendere i miei oggetti" name="objects_check"/>
- </panel>
- </scroll_container>
- </layout_panel>
- <layout_panel name="notes_buttons_panel">
- <layout_stack name="bottom_bar_ls">
- <layout_panel name="add_friend_btn_lp">
- <button label="Aggiungi come amico" name="add_friend" tool_tip="Offri amicizia a questo residente"/>
- </layout_panel>
- <layout_panel name="im_btn_lp">
- <button label="IM" name="im" tool_tip="Apri una sessione messaggio istantaneo"/>
- </layout_panel>
- <layout_panel name="call_btn_lp">
- <button label="Chiama" name="call" tool_tip="Chiama questo residente"/>
- </layout_panel>
- <layout_panel name="show_on_map_btn_lp">
- <button label="Mappa" name="show_on_map_btn" tool_tip="Mostra il residente sulla mappa"/>
- </layout_panel>
- <layout_panel name="teleport_btn_lp">
- <button label="Teleport" name="teleport" tool_tip="Offri teleport"/>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_notify_textbox.xml b/indra/newview/skins/default/xui/it/panel_notify_textbox.xml
new file mode 100644
index 0000000000..ef27262010
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_notify_textbox.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="instant_message" name="panel_notify_textbox">
+ <string name="message_max_lines_count" value="7"/>
+ <panel label="info_panel" name="info_panel">
+ <text_editor name="message" value="messaggio"/>
+ </panel>
+ <panel label="control_panel" name="control_panel">
+ <button label="Invia" name="btn_submit"/>
+ <button label="Ignora" name="ignore_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_outbox_inventory.xml b/indra/newview/skins/default/xui/it/panel_outbox_inventory.xml
new file mode 100644
index 0000000000..af5e05336e
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_outbox_inventory.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<outbox_inventory_panel name="inventory_outbox" tool_tip="Trascina gli oggetti qui per prepararli per la vendita nel tuo negozio"/>
diff --git a/indra/newview/skins/default/xui/it/panel_outfits_list.xml b/indra/newview/skins/default/xui/it/panel_outfits_list.xml
index e5194e95d7..d0c275e29f 100644
--- a/indra/newview/skins/default/xui/it/panel_outfits_list.xml
+++ b/indra/newview/skins/default/xui/it/panel_outfits_list.xml
@@ -1,7 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="Outfits">
+ <accordion name="outfits_accordion">
+ <no_matched_tabs_text name="no_matched_outfits_msg" value="Non riesci a trovare quello che cerchi? Prova [secondlife:///app/search/all/[SEARCH_TERM] Cerca]."/>
+ <no_visible_tabs_text name="no_outfits_msg" value="Non hai ancora vestiario da indossare. Prova [secondlife:///app/search/all Cerca]."/>
+ </accordion>
<panel name="bottom_panel">
- <button name="options_gear_btn" tool_tip="Mostra ulteriori opzioni"/>
+ <menu_button name="options_gear_btn" tool_tip="Mostra ulteriori opzioni"/>
<button name="trash_btn" tool_tip="Elimina il vestiario selezionato"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_people.xml b/indra/newview/skins/default/xui/it/panel_people.xml
index a8f60e556e..f903ae6e2c 100644
--- a/indra/newview/skins/default/xui/it/panel_people.xml
+++ b/indra/newview/skins/default/xui/it/panel_people.xml
@@ -18,11 +18,13 @@ Stai cercando persone da frequentare? Prova la [secondlife:///app/worldmap Mappa
<string name="groups_filter_label" value="Filtro gruppi"/>
<string name="no_filtered_groups_msg" value="Non riesci a trovare quello che cerchi? Prova [secondlife:///app/search/groups/[SEARCH_TERM] Cerca]."/>
<string name="no_groups_msg" value="Stai cercando gruppi di cui far parte? Prova [secondlife:///app/search/groups Cerca]."/>
+ <string name="MiniMapToolTipMsg" value="[REGION](Fai doppio clic per aprire la Mappa, premi il tasto Maiusc e trascina per la panoramica)"/>
+ <string name="AltMiniMapToolTipMsg" value="[REGION](Fai doppio clic per teleportarti, premi il tasto Maiusc e trascina per la panoramica)"/>
<filter_editor label="Filtro" name="filter_input"/>
<tab_container name="tabs">
<panel label="NELLE VICINANZE" name="nearby_panel">
<panel label="bottom_panel" name="bottom_panel">
- <button name="nearby_view_sort_btn" tool_tip="Opzioni"/>
+ <menu_button name="nearby_view_sort_btn" tool_tip="Opzioni"/>
<button name="add_friend_btn" tool_tip="Aggiungi il residente selezionato alla tua lista degli amici"/>
</panel>
</panel>
@@ -34,27 +36,27 @@ Stai cercando persone da frequentare? Prova la [secondlife:///app/worldmap Mappa
<panel label="bottom_panel" name="bottom_panel">
<layout_stack name="bottom_panel">
<layout_panel name="options_gear_btn_panel">
- <button name="friends_viewsort_btn" tool_tip="Mostra ulteriori opzioni"/>
+ <menu_button name="friends_viewsort_btn" tool_tip="Mostra ulteriori opzioni"/>
</layout_panel>
<layout_panel name="add_btn_panel">
<button name="add_btn" tool_tip="Offri amicizia a un residente"/>
</layout_panel>
<layout_panel name="trash_btn_panel">
- <dnd_button name="trash_btn" tool_tip="Rimuovi la persona selezionata dalla lista degli amici"/>
+ <dnd_button name="del_btn" tool_tip="Rimuovi la persona selezionata dalla lista degli amici"/>
</layout_panel>
</layout_stack>
</panel>
</panel>
<panel label="I MIEI GRUPPI" name="groups_panel">
<panel label="bottom_panel" name="bottom_panel">
- <button name="groups_viewsort_btn" tool_tip="Opzioni"/>
+ <menu_button name="groups_viewsort_btn" tool_tip="Opzioni"/>
<button name="plus_btn" tool_tip="Aderisci al gruppo/Crea nuovo gruppo"/>
<button name="activate_btn" tool_tip="Attiva il gruppo selezionato"/>
</panel>
</panel>
<panel label="RECENTE" name="recent_panel">
<panel label="bottom_panel" name="bottom_panel">
- <button name="recent_viewsort_btn" tool_tip="Opzioni"/>
+ <menu_button name="recent_viewsort_btn" tool_tip="Opzioni"/>
<button name="add_friend_btn" tool_tip="Aggiungi il residente selezionato alla tua lista degli amici"/>
</panel>
</panel>
@@ -64,16 +66,16 @@ Stai cercando persone da frequentare? Prova la [secondlife:///app/worldmap Mappa
<layout_panel name="view_profile_btn_lp">
<button label="Profilo" name="view_profile_btn" tool_tip="Mostra immagine, gruppi e altre informazioni del residente"/>
</layout_panel>
- <layout_panel name="chat_btn_lp">
+ <layout_panel name="im_btn_lp">
<button label="IM" name="im_btn" tool_tip="Apri una sessione messaggio istantaneo"/>
</layout_panel>
- <layout_panel name="chat_btn_lp">
+ <layout_panel name="call_btn_lp">
<button label="Chiama" name="call_btn" tool_tip="Chiama questo residente"/>
</layout_panel>
- <layout_panel name="chat_btn_lp">
+ <layout_panel name="share_btn_lp">
<button label="Condividi" name="share_btn" tool_tip="Condividi un oggetto dell&apos;inventario"/>
</layout_panel>
- <layout_panel name="chat_btn_lp">
+ <layout_panel name="teleport_btn_lp">
<button label="Teleport" name="teleport_btn" tool_tip="Offri teleport"/>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/it/panel_place_profile.xml b/indra/newview/skins/default/xui/it/panel_place_profile.xml
index eace6c89ce..890dfc2458 100644
--- a/indra/newview/skins/default/xui/it/panel_place_profile.xml
+++ b/indra/newview/skins/default/xui/it/panel_place_profile.xml
@@ -64,6 +64,8 @@
<text name="scripts_value" value="Attivo"/>
<text name="damage_label" value="Danni:"/>
<text name="damage_value" value="Disattivato"/>
+ <text name="see_avatars_label" value="Vedi avatar:"/>
+ <text name="see_avatars_value" value="Disattiva"/>
<button label="Informazioni sui terreni" name="about_land_btn"/>
</panel>
</accordion_tab>
@@ -76,7 +78,7 @@
<text name="region_rating_label" value="Categoria:"/>
<text name="region_rating" value="Adulti"/>
<text name="region_owner_label" value="Proprietario:"/>
- <text name="region_owner" value="moose Van Moose"/>
+ <text name="region_owner" value="moose Van Moose nome lunghissimo moose"/>
<text name="region_group_label" value="Gruppo:"/>
<text name="region_group">
The Mighty Moose of mooseville soundvillemoose
@@ -89,6 +91,7 @@
<text name="estate_name_label" value="Proprietà immobiliare:"/>
<text name="estate_rating_label" value="Categoria:"/>
<text name="estate_owner_label" value="Proprietario:"/>
+ <text name="estate_owner" value="Test nome proprietario con nome molto lungo"/>
<text name="covenant_label" value="Regolamento:"/>
</panel>
</accordion_tab>
diff --git a/indra/newview/skins/default/xui/it/panel_places.xml b/indra/newview/skins/default/xui/it/panel_places.xml
index e33f8190eb..69995fb5de 100644
--- a/indra/newview/skins/default/xui/it/panel_places.xml
+++ b/indra/newview/skins/default/xui/it/panel_places.xml
@@ -21,10 +21,10 @@
<button label="Modifica" name="edit_btn" tool_tip="Modifica le informazioni del punto di riferimento"/>
</layout_panel>
<layout_panel name="overflow_btn_lp">
- <button label="â–¼" name="overflow_btn" tool_tip="Mostra ulteriori opzioni"/>
+ <menu_button label="â–¼" name="overflow_btn" tool_tip="Mostra ulteriori opzioni"/>
</layout_panel>
</layout_stack>
- <layout_stack name="bottom_bar_ls3">
+ <layout_stack name="bottom_bar_profile_ls">
<layout_panel name="profile_btn_lp">
<button label="Profilo" name="profile_btn" tool_tip="Mostra il profilo del luogo"/>
</layout_panel>
diff --git a/indra/newview/skins/default/xui/it/panel_postcard_message.xml b/indra/newview/skins/default/xui/it/panel_postcard_message.xml
new file mode 100644
index 0000000000..c720f4822d
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_postcard_message.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_postcard_message">
+ <text name="to_label">
+ A:
+ </text>
+ <text name="name_label">
+ Da:
+ </text>
+ <text name="subject_label">
+ Oggetto:
+ </text>
+ <line_editor label="Digita qui l&apos;oggetto." name="subject_form"/>
+ <text name="msg_label">
+ Messaggio:
+ </text>
+ <text_editor name="msg_form">
+ Digita qui il messaggio.
+ </text_editor>
+ <button label="Annulla" name="cancel_btn"/>
+ <button label="Invia" name="send_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_postcard_settings.xml b/indra/newview/skins/default/xui/it/panel_postcard_settings.xml
new file mode 100644
index 0000000000..6a586c4415
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_postcard_settings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_postcard_settings">
+ <combo_box label="Risoluzione" name="postcard_size_combo">
+ <combo_box.item label="Finestra attuale" name="CurrentWindow"/>
+ <combo_box.item label="640x480" name="640x480"/>
+ <combo_box.item label="800x600" name="800x600"/>
+ <combo_box.item label="1024x768" name="1024x768"/>
+ <combo_box.item label="Personalizza" name="Custom"/>
+ </combo_box>
+ <layout_stack name="postcard_image_params_ls">
+ <layout_panel name="postcard_image_size_lp">
+ <spinner label="Larghezza" name="postcard_snapshot_width"/>
+ <spinner label="Altezza" name="postcard_snapshot_height"/>
+ <check_box label="Mantieni le proporzioni" name="postcard_keep_aspect_check"/>
+ </layout_panel>
+ <layout_panel name="postcard_image_format_quality_lp">
+ <slider label="Qualità dell&apos;immagine" name="image_quality_slider"/>
+ <text name="image_quality_level">
+ ([QLVL])
+ </text>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/it/panel_preferences_advanced.xml
index 842daaa331..224780f234 100644
--- a/indra/newview/skins/default/xui/it/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_advanced.xml
@@ -3,35 +3,29 @@
<panel.string name="aspect_ratio_text">
[NUM]:[DEN]
</panel.string>
- <panel.string name="middle_mouse">
- Pulsante centrale del mouse
- </panel.string>
- <slider label="Angolo di visuale" name="camera_fov"/>
- <slider label="Distanza" name="camera_offset_scale"/>
- <text name="heading2">
- Posizione automatica per:
+ <text name="Cache:">
+ Cache:
+ </text>
+ <spinner label="Dimensione cache (64 - 9984 MB)" name="cachesizespinner"/>
+ <text name="text_box5">
+ MB
+ </text>
+ <button label="Pulizia della cache" label_selected="Pulizia della cache" name="clear_cache"/>
+ <text name="Cache location">
+ Ubicazione della cache:
</text>
- <check_box label="Costruire/Modificare" name="edit_camera_movement" tool_tip="Utilizza il posizionamento automatico della fotocamera entrando o uscendo dalla modalità modifica"/>
- <check_box label="Aspetto fisico" name="appearance_camera_movement" tool_tip="Utilizza il posizionamento automatico della camera in modalità modifica"/>
- <check_box initial_value="vero" label="Barra laterale" name="appearance_sidebar_positioning" tool_tip="Utilizza il posizionamento automatico della fotocamera per la barra laterale"/>
- <check_box label="Visualizzami in modalità soggettiva" name="first_person_avatar_visible"/>
- <check_box label="Le frecce di direzione mi fanno sempre spostare" name="arrow_keys_move_avatar_check"/>
- <check_box label="Doppio click e tieni premuto per correre" name="tap_tap_hold_to_run"/>
- <check_box label="Movimento delle labbra dell&apos;avatar quando parla" name="enable_lip_sync"/>
- <check_box label="Chat a bolla" name="bubble_text_chat"/>
- <slider label="Opacità" name="bubble_chat_opacity"/>
- <color_swatch name="background" tool_tip="Scegli il colore delle vignette della chat"/>
+ <button label="Sfoglia" label_selected="Sfoglia" name="set_cache"/>
+ <button label="Posizione predefinita" label_selected="Posizione predefinita" name="default_cache_location"/>
<text name="UI Size:">
- Dimensioni interfaccia utente
+ Dimensioni UI:
</text>
<check_box label="Mostra errori dello script in:" name="show_script_errors"/>
<radio_group name="show_location">
<radio_item label="Chat nei dintorni" name="0"/>
<radio_item label="Finestra separata" name="1"/>
</radio_group>
- <check_box label="Attiva/disattiva la funzione parla quando premo:" name="push_to_talk_toggle_check" tool_tip="In modalità &quot;interruttore ON/OFF&quot; premi il tasto una volta per attivare o disattivare il microfono. Quando non usi questa modalità, il microfono è attivo solo se tieni premuto il tasto di comando."/>
- <line_editor label="Pulsante di comando della funzione Premi per parlare" name="modifier_combo"/>
- <button label="Imposta tasto" name="set_voice_hotkey_button"/>
- <button label="Pulsante centrale del mouse" name="set_voice_middlemouse_button" tool_tip="Reimposta sul pulsante centrale del mouse"/>
- <button label="Altri dispositivi" name="joystick_setup_button"/>
+ <check_box label="Consenti più Viewer" name="allow_multiple_viewer_check"/>
+ <check_box label="Mostra selezione griglia all&apos;accesso" name="show_grid_selection_check"/>
+ <check_box label="Mostra menu Avanzato" name="show_advanced_menu_check"/>
+ <check_box label="Mostra menu Sviluppatore" name="show_develop_menu_check"/>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_chat.xml b/indra/newview/skins/default/xui/it/panel_preferences_chat.xml
index 4a1bbdf64a..7f5992b584 100644
--- a/indra/newview/skins/default/xui/it/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_chat.xml
@@ -8,44 +8,10 @@
<radio_item label="Media" name="radio2" value="1"/>
<radio_item label="Grande" name="radio3" value="2"/>
</radio_group>
- <text name="font_colors">
- Colori caratteri:
- </text>
- <color_swatch label="Tuo" name="user"/>
- <text name="text_box1">
- Io
- </text>
- <color_swatch label="Altri" name="agent"/>
- <text name="text_box2">
- Altri
- </text>
- <color_swatch label="IM" name="im"/>
- <text name="text_box3">
- IM
- </text>
- <color_swatch label="Sistema" name="system"/>
- <text name="text_box4">
- Sistema
- </text>
- <color_swatch label="Errori script" name="script_error"/>
- <text name="text_box5">
- Errori script
- </text>
- <color_swatch label="Oggetti" name="objects"/>
- <text name="text_box6">
- Oggetti
- </text>
- <color_swatch label="Proprietario" name="owner"/>
- <text name="text_box7">
- Proprietario
- </text>
- <color_swatch label="URLs" name="links"/>
- <text name="text_box9">
- URLs
- </text>
<check_box initial_value="true" label="Simula la battitura tasti quando scrivi" name="play_typing_animation"/>
<check_box label="Quando sono OFF-LINE, spediscimi gli IM in una e-mail" name="send_im_to_email"/>
<check_box label="Attiva IM in testo semplice e cronologia chat" name="plain_text_chat_history"/>
+ <check_box label="Chat a vignetta" name="bubble_text_chat"/>
<text name="show_ims_in_label">
Mostra gli IM in:
</text>
@@ -56,27 +22,12 @@
<radio_item label="Finestre separate" name="radio" value="0"/>
<radio_item label="Schede" name="radio2" value="1"/>
</radio_group>
- <check_box label="Usa la traduzione meccanica durante le chat (tecnologia Google)" name="translate_chat_checkbox"/>
- <text name="translate_language_text" width="110">
- Traduci chat in:
- </text>
- <combo_box name="translate_language_combobox" width="146">
- <combo_box.item label="Default di sistema" name="System Default Language"/>
- <combo_box.item label="English (Inglese)" name="English"/>
- <combo_box.item label="Dansk (Danese)" name="Danish"/>
- <combo_box.item label="Deutsch (Tedesco)" name="German"/>
- <combo_box.item label="Español (Spagnolo)" name="Spanish"/>
- <combo_box.item label="Français (Francese)" name="French"/>
- <combo_box.item label="Italiano" name="Italian"/>
- <combo_box.item label="Magyar (Ungherese)" name="Hungarian"/>
- <combo_box.item label="Nederlands (Olandese)" name="Dutch"/>
- <combo_box.item label="Polski (Polacco)" name="Polish"/>
- <combo_box.item label="Português (Portoghese)" name="Portugese"/>
- <combo_box.item label="РуÑÑкий (Russo)" name="Russian"/>
- <combo_box.item label="Türkçe (Turco)" name="Turkish"/>
- <combo_box.item label="УкраїнÑька (Ucraino)" name="Ukrainian"/>
- <combo_box.item label="中文 (简体) (Cinese)" name="Chinese"/>
- <combo_box.item label="日本語 (Giapponese)" name="Japanese"/>
- <combo_box.item label="한국어 (Coreano)" name="Korean"/>
- </combo_box>
+ <text name="disable_toast_label">
+ Attiva popup per chat in arrivo:
+ </text>
+ <check_box label="Chat di gruppo" name="EnableGroupChatPopups" tool_tip="Seleziona per vedere una finestra popup quando arriva una chat di gruppo"/>
+ <check_box label="Chat IM" name="EnableIMChatPopups" tool_tip="Seleziona per vedere una finestra popup quando arriva un messaggio IM"/>
+ <spinner label="Durata chat vicine:" name="nearby_toasts_lifetime"/>
+ <spinner label="Durata dissolvenza chat vicine:" name="nearby_toasts_fadingtime"/>
+ <button label="Impostazioni traduzione chat" name="ok_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_colors.xml b/indra/newview/skins/default/xui/it/panel_preferences_colors.xml
new file mode 100644
index 0000000000..016970d9a3
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_preferences_colors.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Colori" name="colors_panel">
+ <text name="effects_color_textbox">
+ I miei effetti (raggio indicatore):
+ </text>
+ <color_swatch name="effect_color_swatch" tool_tip="Clicca per aprire il selettore dei colori"/>
+ <text name="font_colors">
+ Colori font della chat:
+ </text>
+ <text name="text_box1">
+ Io
+ </text>
+ <text name="text_box2">
+ Altri
+ </text>
+ <text name="text_box3">
+ Oggetti
+ </text>
+ <text name="text_box4">
+ Sistema
+ </text>
+ <text name="text_box5">
+ Errori
+ </text>
+ <text name="text_box10">
+ Diretto
+ </text>
+ <text name="text_box7">
+ Proprietario
+ </text>
+ <text name="text_box9">
+ URL
+ </text>
+ <text name="bubble_chat">
+ Colore sfondo etichetta nome (influenza anche Chat a vignetta):
+ </text>
+ <color_swatch name="background" tool_tip="Seleziona colore etichetta nome"/>
+ <slider label="Opacità:" name="bubble_chat_opacity" tool_tip="Seleziona opacità etichetta nome"/>
+ <text name="floater_opacity">
+ Opacità finestra:
+ </text>
+ <slider label="Attiva:" name="active"/>
+ <slider label="Disattivata:" name="inactive"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_general.xml b/indra/newview/skins/default/xui/it/panel_preferences_general.xml
index 95c73f482d..90a833471c 100644
--- a/indra/newview/skins/default/xui/it/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_general.xml
@@ -11,10 +11,12 @@
<combo_box.item label="Español (Spagnolo) - Beta" name="Spanish"/>
<combo_box.item label="Français (Francese) - Beta" name="French"/>
<combo_box.item label="Italiano - Beta" name="Italian"/>
- <combo_box.item label="Nederlands (Olandese) - Beta" name="Dutch"/>
<combo_box.item label="Polski (Polacco) - Beta" name="Polish"/>
<combo_box.item label="Português (Portoghese) - Beta" name="Portugese"/>
+ <combo_box.item label="РуÑÑкий (Russo) - Beta" name="Russian"/>
+ <combo_box.item label="Türkçe (Turco) - Beta" name="Turkish"/>
<combo_box.item label="日本語 (Giapponese) - Beta" name="(Japanese)"/>
+ <combo_box.item label="正體中文 (Cinese tradizionale) - Beta" name="Traditional Chinese"/>
</combo_box>
<text name="language_textbox2">
(Richiede il riavvio)
@@ -44,16 +46,21 @@
<radio_item label="On" name="radio2" value="1"/>
<radio_item label="Mostra brevemente" name="radio3" value="2"/>
</radio_group>
- <check_box label="Mostra il mio nome" name="show_my_name_checkbox1"/>
- <check_box initial_value="true" label="Nome in piccolo" name="small_avatar_names_checkbox"/>
- <check_box label="Mostra titoli del gruppo" name="show_all_title_checkbox1"/>
- <text name="effects_color_textbox">
- I miei effetti:
+ <check_box label="Il mio nome" name="show_my_name_checkbox1"/>
+ <check_box label="Nomi utente" name="show_slids" tool_tip="Mostra il nome utente, come bobsmith123"/>
+ <check_box label="TItoli gruppo" name="show_all_title_checkbox1" tool_tip="Mostra titoli di gruppo, come Funzionario o Membro"/>
+ <check_box label="Evidenzia amici" name="show_friends" tool_tip="Evidenzia le etichette dei nomi dei tuoi amici"/>
+ <check_box label="Mostra nomi visualizzati" name="display_names_check" tool_tip="Seleziona per visualizzare i nomi in chat, IM, etichette, ecc."/>
+ <text name="inworld_typing_rg_label">
+ Premere i tasti lettera:
</text>
+ <radio_group name="inworld_typing_preference">
+ <radio_item label="Avvia chat locale" name="radio_start_chat" value="1"/>
+ <radio_item label="Influenza il movimento (per es. WASD)" name="radio_move" value="0"/>
+ </radio_group>
<text name="title_afk_text">
Pausa assenza:
</text>
- <color_swatch label="" name="effect_color_swatch" tool_tip="Clicca per aprire la tavolozza dei colori"/>
<combo_box label="Pausa assenza:" name="afk">
<combo_box.item label="2 minuti" name="item0"/>
<combo_box.item label="5 minuti" name="item1"/>
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/it/panel_preferences_graphics1.xml
index 67b3c61a47..1f2b97af45 100644
--- a/indra/newview/skins/default/xui/it/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_graphics1.xml
@@ -25,9 +25,22 @@
<text name="ShadersText">
Effetti grafici:
</text>
+ <check_box initial_value="vero" label="Acqua trasparente" name="TransparentWater"/>
<check_box initial_value="true" label="Piccoli rilievi e scintillii" name="BumpShiny"/>
+ <check_box initial_value="true" label="Luci locali" name="LocalLights"/>
<check_box initial_value="true" label="Effetti grafici base" name="BasicShaders" tool_tip="Disabilitare questa opzione può evitare che qualche scheda grafica vada in crash."/>
<check_box initial_value="true" label="Effetti grafici atmosferici" name="WindLightUseAtmosShaders"/>
+ <check_box initial_value="true" label="Luci e ombre" name="UseLightShaders"/>
+ <check_box initial_value="true" label="Occlusione ambientale" name="UseSSAO"/>
+ <check_box initial_value="true" label="Profondità di campo" name="UseDoF"/>
+ <text name="shadows_label">
+ Ombre:
+ </text>
+ <combo_box name="ShadowDetail">
+ <combo_box.item label="Nessuno" name="0"/>
+ <combo_box.item label="Sole/Luna" name="1"/>
+ <combo_box.item label="Sole/Luna + Proiettori" name="2"/>
+ </combo_box>
<text name="reflection_label">
Riflessi nell’acqua:
</text>
@@ -38,6 +51,10 @@
<combo_box.item label="Tutti gli avatar e gli oggetti" name="3"/>
<combo_box.item label="Tutto" name="4"/>
</combo_box>
+ <slider label="Fisica avatar:" name="AvatarPhysicsDetail"/>
+ <text name="AvatarPhysicsDetailText">
+ Basso
+ </text>
<slider label="Distanza di disegno:" name="DrawDistance"/>
<text name="DrawDistanceMeterText2">
m
@@ -76,7 +93,7 @@
Basso
</text>
<text name="AvatarRenderingText">
- Rendering dell&apos;avatar:
+ Rendering avatar :
</text>
<check_box initial_value="true" label="Avatar bidimensionali (Impostor)" name="AvatarImpostors"/>
<check_box initial_value="true" label="Hardware Skinning" name="AvatarVertexProgram"/>
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_move.xml b/indra/newview/skins/default/xui/it/panel_preferences_move.xml
new file mode 100644
index 0000000000..8d172bb8bb
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_preferences_move.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Movimento" name="move_panel">
+ <slider label="Angolo di visuale" name="camera_fov"/>
+ <slider label="Distanza" name="camera_offset_scale"/>
+ <text name="heading2">
+ Posizione automatica per:
+ </text>
+ <check_box label="Costruire/Modificare" name="edit_camera_movement" tool_tip="Utilizza il posizionamento automatico della fotocamera entrando o uscendo dalla modalità modifica"/>
+ <check_box label="Aspetto fisico" name="appearance_camera_movement" tool_tip="Utilizza il posizionamento automatico della camera in modalità modifica"/>
+ <text name="keyboard_lbl">
+ Tastiera:
+ </text>
+ <check_box label="Le frecce di direzione mi fanno sempre spostare" name="arrow_keys_move_avatar_check"/>
+ <check_box label="Doppio click e tieni premuto per correre" name="tap_tap_hold_to_run"/>
+ <text name="mouse_lbl">
+ Mouse:
+ </text>
+ <check_box label="Mostra in modalità Mouselook" name="first_person_avatar_visible"/>
+ <text name=" Mouse Sensitivity">
+ Sensibilità mouse visuale soggettiva:
+ </text>
+ <check_box label="Inverti" name="invert_mouse"/>
+ <text name="single_click_action_lbl">
+ Un solo clic sul terreno:
+ </text>
+ <combo_box name="single_click_action_combo">
+ <combo_box.item label="Nessuna azione" name="0"/>
+ <combo_box.item label="Passa al punto cliccato" name="1"/>
+ </combo_box>
+ <text name="double_click_action_lbl">
+ Doppio clic sul terreno:
+ </text>
+ <combo_box name="double_click_action_combo">
+ <combo_box.item label="Nessuna azione" name="0"/>
+ <combo_box.item label="Passa al punto cliccato" name="1"/>
+ <combo_box.item label="Teleport al punto cliccato" name="2"/>
+ </combo_box>
+ <button label="Altri dispositivi" name="joystick_setup_button"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/it/panel_preferences_privacy.xml
index 1002195baf..41e7a59139 100644
--- a/indra/newview/skins/default/xui/it/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_privacy.xml
@@ -7,21 +7,25 @@
<text name="cache_size_label_l">
(Luoghi, immagini, web, cronologia ricerche)
</text>
+ <check_box label="Mostrami nei risultati della ricerca" name="online_searchresults"/>
<check_box label="Solo amici e gruppi mi vedono online" name="online_visibility"/>
<check_box label="Solo amici e gruppi possono chiamarmi o mandarmi IM" name="voice_call_friends_only_check"/>
<check_box label="Spegnere il microfono alla chiusura delle chiamate" name="auto_disengage_mic_check"/>
- <check_box label="Accetta cookie" name="cookies_enabled"/>
- <check_box label="Consenti riproduzione multimediale automatica" name="autoplay_enabled"/>
+ <check_box label="Mostra i miei punti di riferimento preferiti all&apos;accesso (nel menu a discesa &apos;Inizia da&apos;)" name="favorites_on_login_check"/>
<text name="Logs:">
- Registri:
+ Registri chat:
</text>
<check_box label="Salva i registri delle conversazioni sul mio computer" name="log_nearby_chat"/>
<check_box label="Salva i registri degli IM nel mio computer" name="log_instant_messages"/>
- <check_box label="Riporta data e ora" name="show_timestamps_check_im"/>
- <line_editor left="288" name="log_path_string" right="-20"/>
+ <check_box label="Aggiungi l&apos;orario a ogni riga nel registro chat" name="show_timestamps_check_im"/>
+ <check_box label="Aggiungi la data al nome del file del registro." name="logfile_name_datestamp"/>
<text name="log_path_desc">
Ubicazione dei registri
</text>
+ <line_editor left="288" name="log_path_string" right="-20"/>
<button label="Sfoglia" label_selected="Sfoglia" name="log_path_button" width="130"/>
<button label="Lista dei bloccati" name="block_list"/>
+ <text name="block_list_label">
+ (Persone e/o Oggetti bloccati)
+ </text>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_setup.xml b/indra/newview/skins/default/xui/it/panel_preferences_setup.xml
index 29618485c2..0189d47f45 100644
--- a/indra/newview/skins/default/xui/it/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_setup.xml
@@ -1,13 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Impostazione" name="Input panel">
- <button bottom_delta="-40" label="Altri dispositivi" name="joystick_setup_button" width="165"/>
- <text name="Mouselook:">
- Soggettiva:
- </text>
- <text name=" Mouse Sensitivity">
- Sensibilità mouse
- </text>
- <check_box label="Inverti" name="invert_mouse"/>
<text name="Network:">
Rete:
</text>
@@ -19,31 +11,26 @@
</text>
<check_box label="Porta personalizzata" name="connection_port_enabled"/>
<spinner label="Numero porta:" name="connection_port"/>
- <text name="cache_size_label_l">
- Dimensioni cache
- </text>
- <text name="text_box5">
- MB
- </text>
- <text name="Cache location">
- Ubicazione della cache:
- </text>
- <button label="Sfoglia" label_selected="Sfoglia" name="set_cache"/>
- <button label="Reimposta" label_selected="Reimposta" name="reset_cache"/>
<text name="Web:">
Web:
</text>
<radio_group name="use_external_browser">
- <radio_item label="Usa il mio browser (IE, Firefox, Safari)" name="external" tool_tip="Utilizza il browser Web predefinito di sistema per l&apos;aiuto, per i link Web e così via. Sconsigliato durante l&apos;esecuzione a tutto schermo." value="1"/>
+ <radio_item label="Usa il mio browser (IE, Firefox, Safari)" name="external" tool_tip="Utilizza il browser Web predefinito di sistema per l&apos;aiuto, per i link Web e così via. Sconsigliato durante l&apos;esecuzione a tutto schermo." value="true"/>
<radio_item label="Utilizza il browser Web integrato" name="internal" tool_tip="Utilizza il browser Web integrato per l&apos;aiuto, per i link Web e così via. Questo browser si apre in una nuova finestra in [APP_NAME]." value=""/>
</radio_group>
- <check_box label="Abilita plugin" name="browser_plugins_enabled"/>
- <check_box label="Accetta cookie" name="cookies_enabled"/>
- <check_box label="Abilita Javascript" name="browser_javascript_enabled"/>
- <check_box label="Abilita proxy Web" name="web_proxy_enabled"/>
- <text name="Proxy location">
- Ubicazione proxy:
- </text>
- <line_editor name="web_proxy_editor" tool_tip="Il nome o l&apos;indirizzo IP del proxy che preferisci usare"/>
- <spinner label="Numero porta:" name="web_proxy_port"/>
+ <check_box initial_value="true" label="Abilita plugin" name="browser_plugins_enabled"/>
+ <check_box initial_value="true" label="Accetta cookie" name="cookies_enabled"/>
+ <check_box initial_value="true" label="Abilita Javascript" name="browser_javascript_enabled"/>
+ <check_box initial_value="falso" label="Consenti pop-up nel browser media" name="media_popup_enabled"/>
+ <text name="Software updates:">
+ Aggiornamenti software:
+ </text>
+ <combo_box name="updater_service_combobox">
+ <combo_box.item label="Installa automaticamente" name="Install_automatically"/>
+ <combo_box.item label="Scarica e installa manualmente gli aggiornamenti" name="Install_manual"/>
+ </combo_box>
+ <text name="Proxy Settings:">
+ Impostazioni proxy:
+ </text>
+ <button label="Regola impostazioni proxy" label_selected="Sfoglia" name="set_proxy"/>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_sound.xml b/indra/newview/skins/default/xui/it/panel_preferences_sound.xml
index 2ddb226020..d00512aaf7 100644
--- a/indra/newview/skins/default/xui/it/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_sound.xml
@@ -1,18 +1,25 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Suoni" name="Preference Media panel">
+ <panel.string name="middle_mouse">
+ Pulsante centrale del mouse
+ </panel.string>
<slider label="Vol. principale" name="System Volume"/>
- <check_box initial_value="true" label="Disatt. se a icona" name="mute_when_minimized"/>
+ <check_box initial_value="true" label="" name="mute_when_minimized"/>
+ <text name="mute_chb_label">
+ Disatt. audio se minimizzato
+ </text>
<slider label="Pulsanti" name="UI Volume"/>
<slider label="Ambiente" name="Wind Volume"/>
<slider label="Effetti sonori" name="SFX Volume"/>
<slider label="Musica in streaming" name="Music Volume"/>
- <check_box label="Abilitato" name="music_enabled"/>
+ <check_box label="Abilitato" name="enable_music"/>
<slider label="Multimediale" name="Media Volume"/>
<check_box label="Abilitato" name="enable_media"/>
<slider label="Chat vocale" name="Voice Volume"/>
<check_box label="Abilitato" name="enable_voice_check"/>
<check_box label="Consenti riproduzione multimediale automatica" name="media_auto_play_btn" tool_tip="Seleziona qui per consentire la riproduzione multimediale automatica" value="true"/>
<check_box label="Riproduci media in uso da altri avatar" name="media_show_on_others_btn" tool_tip="Deseleziona qui per nascondere i media in uso dagli altri avatar nei dintorni" value="true"/>
+ <check_box label="Riproduci suoni dai gesti" name="gesture_audio_play_btn" tool_tip="Seleziona per ascoltare i suoni dai gesti" value="true"/>
<text name="voice_chat_settings">
Impostazioni Chat vocale
</text>
@@ -23,29 +30,11 @@
<radio_item label="Posizione della fotocamera" name="0"/>
<radio_item label="Posizione dell&apos;avatar" name="1"/>
</radio_group>
+ <check_box label="Muovi le labbra dell&apos;avatar quando parla" name="enable_lip_sync"/>
+ <check_box label="Attiva/disattiva la funzione parla quando premo:" name="push_to_talk_toggle_check" tool_tip="In modalità &quot;interruttore ON/OFF&quot; premi il tasto una volta per attivare o disattivare il microfono. Quando non usi questa modalità, il microfono è attivo solo se tieni premuto il tasto di comando."/>
+ <line_editor label="Pulsante di comando della funzione Premi per parlare" name="modifier_combo"/>
+ <button label="Imposta tasto" name="set_voice_hotkey_button"/>
+ <button name="set_voice_middlemouse_button" tool_tip="Reimposta sul pulsante centrale del mouse"/>
<button label="Dispositivi di Input/Output" name="device_settings_btn" width="165"/>
- <panel label="Impostazioni del dispositivo" name="device_settings_panel">
- <panel.string name="default_text">
- Predefinito
- </panel.string>
- <panel.string name="default system device">
- Dispositivo di sistema predefinito
- </panel.string>
- <panel.string name="no device">
- Nessun dispositivo
- </panel.string>
- <text name="Input">
- Input
- </text>
- <text name="My volume label">
- Il mio volume:
- </text>
- <slider_bar initial_value="1.0" name="mic_volume_slider" tool_tip="Cambia il volume utilizzando questa barra"/>
- <text name="wait_text">
- Attendi
- </text>
- <text name="Output">
- Output
- </text>
- </panel>
+ <panel label="Impostazioni del dispositivo" name="device_settings_panel"/>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_profile.xml b/indra/newview/skins/default/xui/it/panel_profile.xml
deleted file mode 100644
index 8a8d8f5846..0000000000
--- a/indra/newview/skins/default/xui/it/panel_profile.xml
+++ /dev/null
@@ -1,64 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Profilo" name="panel_profile">
- <string name="CaptionTextAcctInfo">
- [ACCTTYPE]
-[PAYMENTINFO] [AGEVERIFICATION]
- </string>
- <string name="payment_update_link_url">
- http://www.secondlife.com/account/billing.php?lang=it-IT
- </string>
- <string name="partner_edit_link_url">
- http://www.secondlife.com/account/partners.php?lang=it
- </string>
- <string name="my_account_link_url" value="http://secondlife.com/my/account/index.php?lang=it-IT"/>
- <string name="no_partner_text" value="Nessuno"/>
- <string name="no_group_text" value="Nessuno"/>
- <string name="RegisterDateFormat">
- [REG_DATE] ([AGE])
- </string>
- <layout_stack name="layout">
- <layout_panel name="profile_stack">
- <scroll_container name="profile_scroll">
- <panel name="profile_scroll_panel">
- <panel name="second_life_image_panel">
- <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/>
- </panel>
- <panel name="first_life_image_panel">
- <text name="title_rw_descr_text" value="Mondo reale:"/>
- </panel>
- <text name="title_member_text" value="Residente dal:"/>
- <text name="title_acc_status_text" value="Stato account:"/>
- <text name="title_partner_text" value="Partner:"/>
- <panel name="partner_data_panel">
- <name_box initial_value="(recupero)" name="partner_text"/>
- </panel>
- <text name="title_groups_text" value="Gruppi:"/>
- </panel>
- </scroll_container>
- </layout_panel>
- </layout_stack>
- <layout_stack name="layout_verb_buttons">
- <layout_panel name="profile_buttons_panel">
- <layout_stack name="bottom_bar_ls">
- <layout_panel name="add_friend_btn_lp">
- <button label="Aggiungi come amico" name="add_friend" tool_tip="Offri amicizia a questo residente"/>
- </layout_panel>
- <layout_panel name="im_btn_lp">
- <button label="IM" name="im" tool_tip="Apri una sessione messaggio istantaneo"/>
- </layout_panel>
- <layout_panel name="call_btn_lp">
- <button label="Chiama" name="call" tool_tip="Chiama questo residente"/>
- </layout_panel>
- <layout_panel name="chat_btn_lp">
- <button label="Teleport" name="teleport" tool_tip="Offri teleport"/>
- </layout_panel>
- <layout_panel name="overflow_btn_lp">
- <button label="â–¼" name="overflow_btn" tool_tip="Paga del denaro o condividi qualcosa dall&apos;inventario con il residente"/>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- <layout_panel name="profile_me_buttons_panel">
- <button label="Modifica profilo" name="edit_profile_btn" tool_tip="Modifica le tue informazioni personali"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_profile_view.xml b/indra/newview/skins/default/xui/it/panel_profile_view.xml
deleted file mode 100644
index 20c62d4ceb..0000000000
--- a/indra/newview/skins/default/xui/it/panel_profile_view.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_target_profile">
- <string name="status_online">
- Online
- </string>
- <string name="status_offline">
- Offline
- </string>
- <text_editor name="user_name" value="(Caricamento in corso...)"/>
- <text name="status" value="Online"/>
- <tab_container name="tabs">
- <panel label="PROFILO" name="panel_profile"/>
- <panel label="LUOGHI CONSIGLIATI" name="panel_picks"/>
- <panel label="NOTE E PRIVACY" name="panel_notes"/>
- </tab_container>
-</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_region_environment.xml b/indra/newview/skins/default/xui/it/panel_region_environment.xml
new file mode 100644
index 0000000000..81bc8253f4
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_region_environment.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Ambiente" name="panel_env_info">
+ <text name="water_settings_title">
+ Seleziona le impostazioni del ciclo dell&apos;acqua e del cielo/giornata che vuoi che vedano tutti coloro che visitano la tua regione. Maggiori informazioni
+ </text>
+ <radio_group name="region_settings_radio_group">
+ <radio_item label="Usa valori predefiniti di Second Life" name="use_sl_default_settings"/>
+ <radio_item label="Usa le impostazioni seguenti" name="use_my_settings"/>
+ </radio_group>
+ <panel name="user_environment_settings">
+ <text name="water_settings_title">
+ Impostazione Acqua
+ </text>
+ <combo_box name="water_settings_preset_combo">
+ <combo_box.item label="-Seleziona un valore predefinito-" name="item0"/>
+ </combo_box>
+ <text name="sky_dayc_settings_title">
+ Ciclo cielo / giornata
+ </text>
+ <radio_group name="sky_dayc_settings_radio_group">
+ <radio_item label="Cielo fisso" name="my_sky_settings"/>
+ <radio_item label="Ciclo giornata" name="my_dayc_settings"/>
+ </radio_group>
+ <combo_box name="sky_settings_preset_combo">
+ <combo_box.item label="-Seleziona un valore predefinito-" name="item0"/>
+ </combo_box>
+ <combo_box name="dayc_settings_preset_combo">
+ <combo_box.item label="-Seleziona un valore predefinito-" name="item0"/>
+ </combo_box>
+ </panel>
+ <button label="Applica" name="apply_btn"/>
+ <button label="Annulla" name="cancel_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_region_estate.xml b/indra/newview/skins/default/xui/it/panel_region_estate.xml
index 61e3f31024..da6b6b277f 100644
--- a/indra/newview/skins/default/xui/it/panel_region_estate.xml
+++ b/indra/newview/skins/default/xui/it/panel_region_estate.xml
@@ -23,10 +23,10 @@
<check_box label="Permetti accesso pubblico" name="externally_visible_check"/>
<button label="?" name="externally_visible_help"/>
<text name="Only Allow">
- Limita l&apos;accesso agli account verificati con:
+ Consenti l&apos;accesso solo ai Residenti che:
</text>
- <check_box label="Informazioni di pagamento in archivio" name="limit_payment" tool_tip="Espelli i residenti non identificati"/>
- <check_box label="Verifica età" name="limit_age_verified" tool_tip="Espelli i residenti che non hanno la loro età verificata. Vedi [SUPPORT_SITE] per maggiori informazioni."/>
+ <check_box label="Hanno memorizzato le informazioni per l&apos;addebito" name="limit_payment" tool_tip="Per poter visitare questa proprietà immobiliare i Residenti devono aver fornito informazioni di pagamento a Linden Lab. Vedi [SUPPORT_SITE] per maggiori informazioni."/>
+ <check_box label="Hanno verificato l&apos;età" name="limit_age_verified" tool_tip="Per poter visitare questa proprietà immobiliare i Residenti devono aver verificato la propria età. Vedi [SUPPORT_SITE] per maggiori informazioni."/>
<check_box label="Permetti la chat voice" name="voice_chat_check"/>
<button label="?" name="voice_chat_help"/>
<check_box label="Permetti teleport diretto" name="allow_direct_teleport"/>
diff --git a/indra/newview/skins/default/xui/it/panel_region_general.xml b/indra/newview/skins/default/xui/it/panel_region_general.xml
index 6ca5dd878e..c550e005ae 100644
--- a/indra/newview/skins/default/xui/it/panel_region_general.xml
+++ b/indra/newview/skins/default/xui/it/panel_region_general.xml
@@ -25,6 +25,7 @@
<check_box label="Abilita la rivendita del terreno" name="allow_land_resell_check"/>
<check_box label="Abilita unione/suddivisione del terreno" name="allow_parcel_changes_check"/>
<check_box label="Proibisci che il terreno appaia nelle ricerche" name="block_parcel_search_check" tool_tip="Permetti che le persone vedano questa regione e le sue suddivisioni nei risultati delle ricerche"/>
+ <check_box label="Consenti oggetti con reticolo" name="mesh_rez_enabled_check" tool_tip="Permetti alle persone di rezzare oggetti con reticolo su questa regione"/>
<spinner label="Limite massimo di avatar" label_width="135" name="agent_limit_spin" width="190"/>
<spinner label="Bonus di oggetti" label_width="135" name="object_bonus_spin" width="190"/>
<text label="Maturità" name="access_text" width="120">
diff --git a/indra/newview/skins/default/xui/it/panel_region_terrain.xml b/indra/newview/skins/default/xui/it/panel_region_terrain.xml
index 92044bae11..c61ac3ecce 100644
--- a/indra/newview/skins/default/xui/it/panel_region_terrain.xml
+++ b/indra/newview/skins/default/xui/it/panel_region_terrain.xml
@@ -7,21 +7,56 @@
sconosciuto
</text>
<spinner label="Altezza dell&apos;acqua" name="water_height_spin"/>
- <button label="?" name="water_height_help"/>
- <spinner label="Limite di altezza del &#10;terreno" name="terrain_raise_spin"/>
- <button label="?" name="terrain_raise_help"/>
- <spinner label="Limite di abbassamento &#10;del terreno" name="terrain_lower_spin" bottom_delta="-34"/>
- <button label="?" name="terrain_lower_help"/>
- <check_box label="Usa il sole della regione" name="use_estate_sun_check"/>
- <button label="?" name="use_estate_sun_help"/>
- <check_box label="Sole fisso" name="fixed_sun_check"/>
- <button label="?" name="fixed_sun_help"/>
- <slider label="Fase" name="sun_hour_slider"/>
- <button label="Applica" name="apply_btn"/>
+ <spinner label="Limite di altezza del
+terreno" name="terrain_raise_spin"/>
+ <spinner bottom_delta="-34" label="Limite di abbassamento
+del terreno" name="terrain_lower_spin"/>
+ <text name="detail_texture_text">
+ Texture terreno (richiede file 512x512, 24 bit .tga)
+ </text>
+ <text name="height_text_lbl">
+ 1 (basso)
+ </text>
+ <text name="height_text_lbl2">
+ 2
+ </text>
+ <text name="height_text_lbl3">
+ 3
+ </text>
+ <text name="height_text_lbl4">
+ 4 (Alto)
+ </text>
+ <text name="height_text_lbl5">
+ Intervalli altitudine texture
+ </text>
+ <text name="height_text_lbl10">
+ Questi valori indicano la gamma di miscele per le texture di cui sopra.
+ </text>
+ <text name="height_text_lbl11">
+ Misurato in metri, il valore BASSO è la MASSIMA altezza della texture n. 1, e il valore ALTO è l&apos;altezza MINIMA della texture n. 4.
+ </text>
+ <text name="height_text_lbl6">
+ Nordovest
+ </text>
+ <text name="height_text_lbl7">
+ Nordest
+ </text>
+ <spinner label="Basso" name="height_start_spin_1"/>
+ <spinner label="Basso" name="height_start_spin_3"/>
+ <spinner label="Alto" name="height_range_spin_1"/>
+ <spinner label="Alto" name="height_range_spin_3"/>
+ <text name="height_text_lbl8">
+ Sudovest
+ </text>
+ <text name="height_text_lbl9">
+ Sudest
+ </text>
+ <spinner label="Basso" name="height_start_spin_0"/>
+ <spinner label="Basso" name="height_start_spin_2"/>
+ <spinner label="Alto" name="height_range_spin_0"/>
+ <spinner label="Alto" name="height_range_spin_2"/>
<button label="Scarica terreno RAW..." name="download_raw_btn" tool_tip="Disponibile solo per i proprietari del terreno, non per i manager"/>
- <button label="?" name="download_raw_help"/>
<button label="Carica terreno RAW..." name="upload_raw_btn" tool_tip="Disponibile solo per i proprietari del terreno, non per i manager"/>
- <button label="?" name="upload_raw_help"/>
- <button width="170" label="Trasforma il terreno" name="bake_terrain_btn" tool_tip="Imposta il terreno corrente come punto medio per i limiti di innalzamento/abbassamento"/>
- <button left="190" label="?" name="bake_terrain_help"/>
+ <button label="Trasforma il terreno" name="bake_terrain_btn" tool_tip="Imposta il terreno corrente come punto medio per i limiti di innalzamento/abbassamento" width="170"/>
+ <button label="Applica" name="apply_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_script_ed.xml b/indra/newview/skins/default/xui/it/panel_script_ed.xml
index f550aee98e..d7ee8230b3 100644
--- a/indra/newview/skins/default/xui/it/panel_script_ed.xml
+++ b/indra/newview/skins/default/xui/it/panel_script_ed.xml
@@ -15,15 +15,15 @@
<panel.string name="Title">
Script: [NAME]
</panel.string>
- <text_editor name="Script Editor">
- Caricamento in corso...
- </text_editor>
- <button label="Salva" label_selected="Salva" name="Save_btn"/>
- <combo_box label="Inserisci..." name="Insert..."/>
+ <panel.string name="external_editor_not_set">
+ Seleziona un editor impostando la variabile di ambiente LL_SCRIPT_EDITOR o l&apos;impostazione ExternalEditor.
+ </panel.string>
<menu_bar name="script_menu">
<menu label="File" name="File">
<menu_item_call label="Salva" name="Save"/>
<menu_item_call label="Annulla tutte le modifiche" name="Revert All Changes"/>
+ <menu_item_call label="Carica da file..." name="LoadFromFile"/>
+ <menu_item_call label="Salva su file..." name="SaveToFile"/>
</menu>
<menu label="Modifica" name="Edit">
<menu_item_call label="Annulla" name="Undo"/>
@@ -40,4 +40,10 @@
<menu_item_call label="Aiuto con parole chiave..." name="Keyword Help..."/>
</menu>
</menu_bar>
+ <text_editor name="Script Editor">
+ Caricamento in corso...
+ </text_editor>
+ <combo_box label="Inserisci..." name="Insert..."/>
+ <button label="Salva" label_selected="Salva" name="Save_btn"/>
+ <button label="Modifica..." name="Edit_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_scrolling_param_base.xml b/indra/newview/skins/default/xui/it/panel_scrolling_param_base.xml
new file mode 100644
index 0000000000..fa659040ea
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_scrolling_param_base.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="LLScrollingPanelParamBase">
+ <slider label="[DESC]" name="param slider"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/it/panel_snapshot_inventory.xml
new file mode 100644
index 0000000000..c9245029b7
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_snapshot_inventory.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_inventory">
+ <text name="title">
+ Salva nell&apos;inventario
+ </text>
+ <text name="hint_lbl">
+ Salvare un&apos;immagine nell&apos;inventario costa L$[UPLOAD_COST]. Per salvare l&apos;immagine come texture, selezionare uno dei formati quadrati.
+ </text>
+ <combo_box label="Risoluzione" name="texture_size_combo">
+ <combo_box.item label="Finestra attuale" name="CurrentWindow"/>
+ <combo_box.item label="Piccola (128x128)" name="Small(128x128)"/>
+ <combo_box.item label="Media (256x256)" name="Medium(256x256)"/>
+ <combo_box.item label="Grande (512x512)" name="Large(512x512)"/>
+ <combo_box.item label="Personalizza" name="Custom"/>
+ </combo_box>
+ <spinner label="Larghezza" name="inventory_snapshot_width"/>
+ <spinner label="Altezza" name="inventory_snapshot_height"/>
+ <check_box label="Mantieni le proporzioni" name="inventory_keep_aspect_check"/>
+ <button label="Annulla" name="cancel_btn"/>
+ <button label="Salva" name="save_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_snapshot_local.xml b/indra/newview/skins/default/xui/it/panel_snapshot_local.xml
new file mode 100644
index 0000000000..4b725b68f9
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_snapshot_local.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_local">
+ <text name="title">
+ Salva sul mio computer
+ </text>
+ <combo_box label="Risoluzione" name="local_size_combo">
+ <combo_box.item label="Finestra attuale" name="CurrentWindow"/>
+ <combo_box.item label="320x240" name="320x240"/>
+ <combo_box.item label="640x480" name="640x480"/>
+ <combo_box.item label="800x600" name="800x600"/>
+ <combo_box.item label="1024x768" name="1024x768"/>
+ <combo_box.item label="1280x1024" name="1280x1024"/>
+ <combo_box.item label="1600x1200" name="1600x1200"/>
+ <combo_box.item label="Personalizza" name="Custom"/>
+ </combo_box>
+ <layout_stack name="local_image_params_ls">
+ <layout_panel name="local_image_size_lp">
+ <spinner label="Larghezza" name="local_snapshot_width"/>
+ <spinner label="Altezza" name="local_snapshot_height"/>
+ <check_box label="Mantieni le proporzioni" name="local_keep_aspect_check"/>
+ </layout_panel>
+ <layout_panel name="local_image_format_quality_lp">
+ <combo_box label="Formato" name="local_format_combo">
+ <combo_box.item label="PNG (senza perdite)" name="PNG"/>
+ <combo_box.item label="JPEG" name="JPEG"/>
+ <combo_box.item label="BMP (senza perdite)" name="BMP"/>
+ </combo_box>
+ <slider label="Qualità dell&apos;immagine" name="image_quality_slider"/>
+ <text name="image_quality_level">
+ ([QLVL])
+ </text>
+ </layout_panel>
+ </layout_stack>
+ <button label="Annulla" name="cancel_btn"/>
+ <flyout_button label="Salva" name="save_btn" tool_tip="Salva immagine come file">
+ <flyout_button.item label="Salva" name="save_item"/>
+ <flyout_button.item label="Salva con nome..." name="saveas_item"/>
+ </flyout_button>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_snapshot_options.xml b/indra/newview/skins/default/xui/it/panel_snapshot_options.xml
new file mode 100644
index 0000000000..f2d42c5197
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_snapshot_options.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_options">
+ <button label="Invia post al feed del mio profilo" name="save_to_profile_btn"/>
+ <button label="E-mail" name="save_to_email_btn"/>
+ <button label="Salva nell&apos;inventario (L$[AMOUNT])" name="save_to_inventory_btn"/>
+ <button label="Salva sul mio computer" name="save_to_computer_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_snapshot_postcard.xml b/indra/newview/skins/default/xui/it/panel_snapshot_postcard.xml
new file mode 100644
index 0000000000..3703b97e6c
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_snapshot_postcard.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_postcard">
+ <string name="default_subject">
+ Cartolina da [SECOND_LIFE].
+ </string>
+ <string name="default_message">
+ Dai un&apos;occhiata!
+ </string>
+ <string name="upload_message">
+ Invio...
+ </string>
+ <text name="title">
+ E-mail
+ </text>
+ <button label="Messaggio" name="message_btn"/>
+ <button label="Impostazioni" name="settings_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_snapshot_profile.xml b/indra/newview/skins/default/xui/it/panel_snapshot_profile.xml
new file mode 100644
index 0000000000..2cdbf97049
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_snapshot_profile.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_profile">
+ <text name="title">
+ Invia post al feed del mio profilo
+ </text>
+ <combo_box label="Risoluzione" name="profile_size_combo">
+ <combo_box.item label="Finestra attuale" name="CurrentWindow"/>
+ <combo_box.item label="640x480" name="640x480"/>
+ <combo_box.item label="800x600" name="800x600"/>
+ <combo_box.item label="1024x768" name="1024x768"/>
+ <combo_box.item label="Personalizza" name="Custom"/>
+ </combo_box>
+ <layout_stack name="profile_image_params_ls">
+ <layout_panel name="profile_image_size_lp">
+ <spinner label="Larghezza" name="profile_snapshot_width"/>
+ <spinner label="Altezza" name="profile_snapshot_height"/>
+ <check_box label="Mantieni le proporzioni" name="profile_keep_aspect_check"/>
+ </layout_panel>
+ <layout_panel name="profile_image_metadata_lp">
+ <text name="caption_label">
+ Didascalia:
+ </text>
+ <check_box initial_value="true" label="Includi luogo" name="add_location_cb"/>
+ </layout_panel>
+ </layout_stack>
+ <button label="Annulla" name="cancel_btn"/>
+ <button label="Post" name="post_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_sound_devices.xml b/indra/newview/skins/default/xui/it/panel_sound_devices.xml
new file mode 100644
index 0000000000..b1934fd515
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_sound_devices.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<panel label="Impostazioni dispositivo" name="device_settings_panel">
+ <panel.string name="default_text">
+ Predefinito
+ </panel.string>
+ <string name="name_no_device">
+ Nessun dispositivo
+ </string>
+ <string name="name_default_system_device">
+ Dispositivo di sistema predefinito
+ </string>
+ <text name="Input">
+ Input
+ </text>
+ <text name="Output">
+ Output
+ </text>
+ <text name="My volume label">
+ Il mio volume:
+ </text>
+ <slider_bar initial_value="1.0" name="mic_volume_slider" tool_tip="Cambia il volume utilizzando questa barra"/>
+ <text name="wait_text">
+ Attendi
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_status_bar.xml b/indra/newview/skins/default/xui/it/panel_status_bar.xml
index 6b1a8aa71b..0aaf89d8c8 100644
--- a/indra/newview/skins/default/xui/it/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/it/panel_status_bar.xml
@@ -1,11 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="status">
- <panel.string name="StatBarDaysOfWeek">
- Domenica:Lunedì:Martedì:Mercoledì:Giovedì:Venerdì:Sabato
- </panel.string>
- <panel.string name="StatBarMonthsOfYear">
- Gennaio:Febbraio:Marzo:Aprile:Maggio:Giugno:Luglio:Agosto:Settembre:Ottobre:Novembre:Dicembre
- </panel.string>
<panel.string name="packet_loss_tooltip">
Perdita di pacchetti
</panel.string>
@@ -21,9 +15,10 @@
<panel.string name="buycurrencylabel">
L$ [AMT]
</panel.string>
- <panel name="balance_bg">
- <text name="balance" tool_tip="Il mio saldo" value="L$ 20"/>
- <button label="ACQUISTA L$" name="buyL" tool_tip="Clicca per acquistare più L$"/>
+ <panel left="-405" name="balance_bg" width="195">
+ <text name="balance" tool_tip="Clicca per aggiornare il tuo saldo in L$" value="L$ 20"/>
+ <button label="Acquista L$" name="buyL" tool_tip="Clicca per acquistare più L$"/>
+ <button label="Acquisti" name="goShop" tool_tip="Apri Mercato Second Life" width="75"/>
</panel>
<text name="TimeText" tool_tip="Orario attuale (Pacifico)">
24:00, ora del Pacifico
diff --git a/indra/newview/skins/default/xui/it/role_actions.xml b/indra/newview/skins/default/xui/it/role_actions.xml
index e3f95f7f86..300e6cf721 100644
--- a/indra/newview/skins/default/xui/it/role_actions.xml
+++ b/indra/newview/skins/default/xui/it/role_actions.xml
@@ -1,72 +1,73 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<role_actions>
<action_set description="Queste abilità permettono di aggiungere e rimuovere membri dal gruppo e consentono ai nuovi membri di aderire al gruppo senza invito." name="Membership">
- <action description="Invita persone in questo gruppo" longdescription="Invita persone in questo gruppo usando il pulsante Invita nella sezione Ruoli &gt; scheda membri." name="member invite"/>
- <action description="Espelli membri da questo gruppo" longdescription="Espelli membri dal gruppo usando il pulsante Espelli nella sezione Ruoli &gt; scheda membri. Un proprietario può espellere chiunque tranne un altro proprietario. Se non sei un proprietario, un membro può essere espulso da un gruppo soltanto qualora abbia soltanto il ruolo Tutti, e nessun altro ruolo. Per rimuovere membri dai ruoli, devi avere l&apos;Abilità corrispondente." name="member eject"/>
- <action description="Seleziona Iscrizione libera e modifica la Quota d&apos;iscrizione" longdescription="Seleziona Iscrizione libera per permettere ai nuovi membri di aderire senza invito e modifica la quota d&apos;iscrizione nella scheda Generale." name="member options"/>
+ <action description="Invita persone in questo gruppo" longdescription="Invita persone in questo gruppo usando il pulsante Invita nella sezione Ruoli &gt; scheda membri." name="member invite" value="1"/>
+ <action description="Espelli membri da questo gruppo" longdescription="Espelli membri dal gruppo usando il pulsante Espelli nella sezione Ruoli &gt; scheda membri. Un proprietario può espellere chiunque tranne un altro proprietario. Se non sei un proprietario, un membro può essere espulso da un gruppo soltanto qualora abbia soltanto il ruolo Tutti, e nessun altro ruolo. Per rimuovere membri dai ruoli, devi avere l&apos;Abilità corrispondente." name="member eject" value="2"/>
+ <action description="Seleziona Iscrizione libera e modifica la Quota d&apos;iscrizione" longdescription="Seleziona Iscrizione libera per permettere ai nuovi membri di aderire senza invito e modifica la quota d&apos;iscrizione nella scheda Generale." name="member options" value="3"/>
</action_set>
<action_set description="Queste Abilità permettono di aggiungere, rimuovere, cambiare i ruoli del gruppo, aggiungere e rimuovere membri dai ruoli, nonché assegnare abilità ai ruoli." name="Roles">
- <action description="Creare nuovi ruoli" longdescription="Crea nuovi ruoli nella sezione Ruoli &gt; scheda ruoli." name="role create"/>
- <action description="Eliminare ruoli" longdescription="Elimina ruoli nella sezione Ruoli &gt; scheda ruoli." name="role delete"/>
- <action description="Cambia i nomi di ruoli, i titoli, le descrizioni e definisci se i membri in quel ruolo sono resi pubblici" longdescription="Cambia i nomi di ruoli, i titoli, le descrizioni e definisci se i membri in quel ruolo sono resi pubblici Viene fatto nella parte inferiore della sezione Ruoli &gt; scheda Ruoli, dopo avere selezionato un ruolo." name="role properties"/>
- <action description="Assegnare membri a ruoli del responsabile" longdescription="Assegna un ruolo a membri nella lista dei ruoli assegnati (sezione Ruoli &gt; scheda membri). Un utente con questa Abilità può aggiungere membri ad un ruolo nel quale il responsabile è già presente." name="role assign member limited"/>
- <action description="Assegnare membri a qualsiasi ruolo" longdescription="Assegna i membri a qualsiasi ruolo nell&apos;elenco dei ruoli assegnati (sezione Ruoli &gt; scheda membri). *ATTENZIONE* Ogni membro con questo Ruolo e Abilità può assegnarsi -- e assegnare ad altri membri non proprietari -- ruoli con poteri maggiori di quelli normalmente concessi, potenzialmente con poteri analoghi a quelli di proprietario. Sii sicuro della scelta prima di assegnare questa Abilità." name="role assign member"/>
- <action description="Rimuovere membri dai ruoli" longdescription="Rimuovi dai ruoli i membri nell&apos;elenco dei ruoli assegnati (sezione Ruoli &gt; scheda membri). Il proprietario non può essere rimosso." name="role remove member"/>
- <action description="Assegnare e rimuovere abilità nei ruoli" longdescription="Assegna e Rimuovi Abilità per ogni ruolo nell&apos;elenco dei ruoli assegnati (sezione Ruoli &gt; scheda Ruoli). *ATTENZIONE* Ogni membro con questo ruolo e Abilità può assegnarsi -- ed assegnare ad altri membri non proprietari -- tutte le Abilità, che potenzialmente con poteri analoghi a quelli di proprietario. Sii sicuro della scelta prima di assegnare questa Abilità." name="role change actions"/>
+ <action description="Creare nuovi ruoli" longdescription="Crea nuovi ruoli nella sezione Ruoli &gt; scheda ruoli." name="role create" value="4"/>
+ <action description="Eliminare ruoli" longdescription="Elimina ruoli nella sezione Ruoli &gt; scheda ruoli." name="role delete" value="5"/>
+ <action description="Cambia i nomi di ruoli, i titoli, le descrizioni e definisci se i membri in quel ruolo sono resi pubblici" longdescription="Cambia i nomi di ruoli, i titoli, le descrizioni e definisci se i membri in quel ruolo sono resi pubblici Viene fatto nella parte inferiore della sezione Ruoli &gt; scheda Ruoli, dopo avere selezionato un ruolo." name="role properties" value="6"/>
+ <action description="Assegnare membri a ruoli del responsabile" longdescription="Assegna un ruolo a membri nella lista dei ruoli assegnati (sezione Ruoli &gt; scheda membri). Un utente con questa Abilità può aggiungere membri ad un ruolo nel quale il responsabile è già presente." name="role assign member limited" value="7"/>
+ <action description="Assegnare membri a qualsiasi ruolo" longdescription="Assegna i membri a qualsiasi ruolo nell&apos;elenco dei ruoli assegnati (sezione Ruoli &gt; scheda membri). *ATTENZIONE* Ogni membro con questo Ruolo e Abilità può assegnarsi -- e assegnare ad altri membri non proprietari -- ruoli con poteri maggiori di quelli normalmente concessi, potenzialmente con poteri analoghi a quelli di proprietario. Sii sicuro della scelta prima di assegnare questa Abilità." name="role assign member" value="8"/>
+ <action description="Rimuovere membri dai ruoli" longdescription="Rimuovi dai ruoli i membri nell&apos;elenco dei ruoli assegnati (sezione Ruoli &gt; scheda membri). Il proprietario non può essere rimosso." name="role remove member" value="9"/>
+ <action description="Assegnare e rimuovere abilità nei ruoli" longdescription="Assegna e Rimuovi Abilità per ogni ruolo nell&apos;elenco dei ruoli assegnati (sezione Ruoli &gt; scheda Ruoli). *ATTENZIONE* Ogni membro con questo ruolo e Abilità può assegnarsi -- ed assegnare ad altri membri non proprietari -- tutte le Abilità, che potenzialmente con poteri analoghi a quelli di proprietario. Sii sicuro della scelta prima di assegnare questa Abilità." name="role change actions" value="10"/>
</action_set>
<action_set description="Queste abilità autorizzano a modificare l&apos;identità di questo gruppo, come ad esempio la modifica della visibilità pubblica, lo statuto e il logo." name="Group Identity">
- <action description="Cambiare lo statuto, il logo, e &apos;Mostra nella ricerca&apos;" longdescription="Cambia statuto, logo e &apos;Mostra nella ricerca&apos;. Viene fatto nella sezione Generale." name="group change identity"/>
+ <action description="Cambiare lo statuto, il logo, e &apos;Mostra nella ricerca&apos;" longdescription="Cambia statuto, logo e &apos;Mostra nella ricerca&apos;. Viene fatto nella sezione Generale." name="group change identity" value="11"/>
</action_set>
<action_set description="Queste Abilità comprendono il potere di intestare, modificare e vendere terreni di proprietà del gruppo. Per aprire la finestra Informazioni sul terreno, fai clic con il pulsante destro del mouse sul terreno e seleziona Informazioni sul terreno, o clicca sull&apos;icona &apos;i&apos; nella Barra di Navigazione." name="Parcel Management">
- <action description="Cessione di terreno e acquisto di terreno per il gruppo" longdescription="Intesta terreno e acquista terreno per il gruppo. Ciò viene fatto in Informazioni sul terreno &gt; scheda Generale." name="land deed"/>
- <action description="Abbandonare il terreno in favore di Governor Linden" longdescription="Abbandona il terreno in favore di Governor Linden. *ATTENZIONE* Ogni membro con questo ruolo e abilità può abbandonare il terreno di proprietà del gruppo in Informazioni sul terreno &gt; scheda Generale, restituendolo alla proprietà Linden senza effettuare una vendita. Sii sicuro della scelta prima di assegnare questa Abilità." name="land release"/>
- <action description="Informazioni su come impostare il terreno come in vendita" longdescription="Imposta le informazioni per la vendita del terreno. *ATTENZIONE* Ogni Membro con questo ruolo e abilità può vendere il terreno di proprietà del gruppo nella scheda Informazioni sul terreno &gt; scheda Generale. Pertanto sii sicuro della scelta prima di assegnare questa Abilità." name="land set sale info"/>
- <action description="Suddividere e unire lotti" longdescription="Suddividi e unisci lotti. Viene fatto cliccando con il pulsante destro del mouse sul terreno, selezionando Modifica terreno e trascinando il mouse sul terreno per creare una selezione. Per suddividere, seleziona quale parte vuoi dividere e clicca su Suddividi. Per unire, seleziona due o più lotti confinanti e clicca su Unisci." name="land divide join"/>
+ <action description="Cessione di terreno e acquisto di terreno per il gruppo" longdescription="Intesta terreno e acquista terreno per il gruppo. Ciò viene fatto in Informazioni sul terreno &gt; scheda Generale." name="land deed" value="12"/>
+ <action description="Abbandonare il terreno in favore di Governor Linden" longdescription="Abbandona il terreno in favore di Governor Linden. *ATTENZIONE* Ogni membro con questo ruolo e abilità può abbandonare il terreno di proprietà del gruppo in Informazioni sul terreno &gt; scheda Generale, restituendolo alla proprietà Linden senza effettuare una vendita. Sii sicuro della scelta prima di assegnare questa Abilità." name="land release" value="13"/>
+ <action description="Informazioni su come impostare il terreno come in vendita" longdescription="Imposta le informazioni per la vendita del terreno. *ATTENZIONE* Ogni Membro con questo ruolo e abilità può vendere il terreno di proprietà del gruppo nella scheda Informazioni sul terreno &gt; scheda Generale. Pertanto sii sicuro della scelta prima di assegnare questa Abilità." name="land set sale info" value="14"/>
+ <action description="Suddividere e unire lotti" longdescription="Suddividi e unisci lotti. Viene fatto cliccando con il pulsante destro del mouse sul terreno, selezionando Modifica terreno e trascinando il mouse sul terreno per creare una selezione. Per suddividere, seleziona quale parte vuoi dividere e clicca su Suddividi. Per unire, seleziona due o più lotti confinanti e clicca su Unisci." name="land divide join" value="15"/>
</action_set>
<action_set description="Queste abilità permettono di cambiare il nome del lotto, le impostazioni di pubblicazione, la visibilità negli elenchi e il punto di arrivo, nonché opzioni di indirizzamento del Teleport." name="Parcel Identity">
- <action description="Premi Mostra luogo nella ricerca e seleziona una categoria" longdescription="Premi Mostra luogo nella ricerca e seleziona una categoria di lotto in Informazioni sul terreno &gt; scheda Opzioni." name="land find places"/>
- <action description="Cambia il nome del lotto, la descrizione e le impostazioni di Mostra luogo nella ricerca" longdescription="Cambia il nome del lotto, la descrizione e le impostazioni di Mostra luogo nella ricerca. Ciò viene fatto in Informazioni sul terreno &gt; scheda Opzioni." name="land change identity"/>
- <action description="Impostare il punto di arrivo e l&apos;indirizzamento del Teleport" longdescription="In un lotto di proprietà di un gruppo, i membri con questo ruolo e abilità possono impostare un punto di arrivo per i teleport entranti e impostare anche l&apos;indirizzamento del teleport per ulteriore precisione. Viene fatto in Informazioni sul terreno &gt; Opzioni." name="land set landing point"/>
+ <action description="Premi Mostra luogo nella ricerca e seleziona una categoria" longdescription="Premi Mostra luogo nella ricerca e seleziona una categoria di lotto in Informazioni sul terreno &gt; scheda Opzioni." name="land find places" value="17"/>
+ <action description="Cambia il nome del lotto, la descrizione e le impostazioni di Mostra luogo nella ricerca" longdescription="Cambia il nome del lotto, la descrizione e le impostazioni di Mostra luogo nella ricerca. Ciò viene fatto in Informazioni sul terreno &gt; scheda Opzioni." name="land change identity" value="18"/>
+ <action description="Impostare il punto di arrivo e l&apos;indirizzamento del Teleport" longdescription="In un lotto di proprietà di un gruppo, i membri con questo ruolo e abilità possono impostare un punto di arrivo per i teleport entranti e impostare anche l&apos;indirizzamento del teleport per ulteriore precisione. Viene fatto in Informazioni sul terreno &gt; Opzioni." name="land set landing point" value="19"/>
</action_set>
<action_set description="Queste abilità hanno poteri relativi alle opzioni dei lotti, come la creazione di oggetti, la modifica del terreno e le impostazioni per la musica e gli elementi multimediali." name="Parcel Settings">
- <action description="Cambiare impostazioni musica e multimediali" longdescription="Cambia le impostazioni per lo streaming della musica e dei video in Informazioni sul terreno &gt; Media." name="land change media"/>
- <action description="Attiva &apos;Modifica terreno&apos;" longdescription="Attiva &apos;Modifica terreno&apos;. *ATTENZIONE* Informazioni sul terreno &gt; Opzioni &gt; Modifica terreno consente a chiunque di modificare la forma del tuo terreno e di collocare e spostare le piante Linden. Pertanto sii sicuro della scelta prima di assegnare questa Abilità. La funzione di modifica del terreno è attivata in Informazioni sul terreno &gt; Opzioni." name="land edit"/>
- <action description="Attivazione di parametri per Informazioni sul terreno &gt; Opzioni" longdescription="Premi Sicuro (nessun danno), Vola e consenti agli altri residenti di: modificare il terreno, costruire, creare punti di riferimento ed eseguire script nel terreno appartenente ad un gruppo in Informazioni sul terreno &gt; scheda Opzioni." name="land options"/>
+ <action description="Cambiare impostazioni musica e multimediali" longdescription="Cambia le impostazioni per lo streaming della musica e dei video in Informazioni sul terreno &gt; Media." name="land change media" value="20"/>
+ <action description="Attiva &apos;Modifica terreno&apos;" longdescription="Attiva &apos;Modifica terreno&apos;. *ATTENZIONE* Informazioni sul terreno &gt; Opzioni &gt; Modifica terreno consente a chiunque di modificare la forma del tuo terreno e di collocare e spostare le piante Linden. Pertanto sii sicuro della scelta prima di assegnare questa Abilità. La funzione di modifica del terreno è attivata in Informazioni sul terreno &gt; Opzioni." name="land edit" value="21"/>
+ <action description="Attivazione di parametri per Informazioni sul terreno &gt; Opzioni" longdescription="Premi Sicuro (nessun danno), Vola e consenti agli altri residenti di: modificare il terreno, costruire, creare punti di riferimento ed eseguire script nel terreno appartenente ad un gruppo in Informazioni sul terreno &gt; scheda Opzioni." name="land options" value="22"/>
</action_set>
<action_set description="Queste abilità permettono ai membri di non avere restrizioni in un lotto appartenente ad un gruppo." name="Parcel Powers">
- <action description="Consenti sempre la modifica del terreno" longdescription="I membri con questo ruolo e abilità possono modificare il terreno appartenente ad un gruppo, anche se la funzionalità è disattivata in Informazioni sul terreno &gt; Opzioni." name="land allow edit land"/>
- <action description="Consenti sempre il volo" longdescription=" I membri con questo ruolo e abilità possono volare in un terreno appartenente ad un gruppo, anche se la funzionalità è disattivata in Informazioni sul terreno &gt; Opzioni." name="land allow fly"/>
- <action description="Consenti sempre la creazione di oggetti" longdescription="I membri con questo ruolo e abilità possono creare oggetti in un lotto appartenente ad un gruppo, anche se la funzionalità è disattivata in Informazioni sul terreno &gt; Opzioni." name="land allow create"/>
- <action description="Consenti sempre la creazione di punti di riferimento" longdescription="I membri con questo ruolo e abilità possono creare punti di riferimento in un lotto appartenente ad un gruppo, anche se la funzionalità è disattivata in Informazioni sul terreno &gt; Opzioni." name="land allow landmark"/>
- <action description="Consenti la funzione &apos;Imposta come Casa mia&apos; in un lotto di gruppo" longdescription="I membri in un ruolo con questa Abilità possono usare il menu Mondo &gt; Punti di riferimento &gt; Imposta come Casa su un lotto ceduto a questo gruppo." name="land allow set home"/>
+ <action description="Consenti sempre la modifica del terreno" longdescription="I membri con questo ruolo e abilità possono modificare il terreno appartenente ad un gruppo, anche se la funzionalità è disattivata in Informazioni sul terreno &gt; Opzioni." name="land allow edit land" value="23"/>
+ <action description="Consenti sempre il volo" longdescription=" I membri con questo ruolo e abilità possono volare in un terreno appartenente ad un gruppo, anche se la funzionalità è disattivata in Informazioni sul terreno &gt; Opzioni." name="land allow fly" value="24"/>
+ <action description="Consenti sempre la creazione di oggetti" longdescription="I membri con questo ruolo e abilità possono creare oggetti in un lotto appartenente ad un gruppo, anche se la funzionalità è disattivata in Informazioni sul terreno &gt; Opzioni." name="land allow create" value="25"/>
+ <action description="Consenti sempre la creazione di punti di riferimento" longdescription="I membri con questo ruolo e abilità possono creare punti di riferimento in un lotto appartenente ad un gruppo, anche se la funzionalità è disattivata in Informazioni sul terreno &gt; Opzioni." name="land allow landmark" value="26"/>
+ <action description="Consenti la funzione &apos;Imposta come Casa mia&apos; in un lotto di gruppo" longdescription="I membri in un ruolo con questa Abilità possono usare il menu Mondo &gt; Punti di riferimento &gt; Imposta come Casa su un lotto ceduto a questo gruppo." name="land allow set home" value="28"/>
+ <action description="Consentire &apos;Ospitare un evento&apos; su lotti di gruppo" longdescription="Membri in un ruolo con questa Abilità possono selezionare lotti posseduti da un gruppo come sedi in cui ospitare un evento." name="land allow host event" value="41"/>
</action_set>
<action_set description="Queste Abilità consentono di concedere o limitare l&apos;accesso ad un lotto di un gruppo da parte di residenti, con le azioni Congela ed Espelli." name="Parcel Access">
- <action description="Gestire la lista di accesso al lotto" longdescription="Gestisci la lista di accesso al lotto in Informazioni sul terreno &gt; Accesso." name="land manage allowed"/>
- <action description="Gestire la lista dei residenti espulsi dal lotto" longdescription="Gestisci la lista Espulsi dal lotto in Informazioni sul terreno &gt; scheda Accesso." name="land manage banned"/>
- <action description="Cambia le impostazioni del lotto in Vendi pass a" longdescription="Cambia le impostazioni Vendi pass a in Informazioni sul terreno &gt; scheda Accesso." name="land manage passes"/>
- <action description="Espellere e Congelare i Residenti in un lotto" longdescription="Membri in un ruolo con questa Abilità possono occuparsi di un residente indesiderato in un lotto posseduto da un gruppo, facendo clic sul residente con il pulsante destro del mouse e selezionando Espelli o Congela." name="land admin"/>
+ <action description="Gestire la lista di accesso al lotto" longdescription="Gestisci la lista di accesso al lotto in Informazioni sul terreno &gt; Accesso." name="land manage allowed" value="29"/>
+ <action description="Gestire la lista dei residenti espulsi dal lotto" longdescription="Gestisci la lista Espulsi dal lotto in Informazioni sul terreno &gt; scheda Accesso." name="land manage banned" value="30"/>
+ <action description="Cambia le impostazioni del lotto in Vendi pass a" longdescription="Cambia le impostazioni Vendi pass a in Informazioni sul terreno &gt; scheda Accesso." name="land manage passes" value="31"/>
+ <action description="Espellere e Congelare i Residenti in un lotto" longdescription="Membri in un ruolo con questa Abilità possono occuparsi di un residente indesiderato in un lotto posseduto da un gruppo, facendo clic sul residente con il pulsante destro del mouse e selezionando Espelli o Congela." name="land admin" value="32"/>
</action_set>
<action_set description="Queste abilità consentono ai membri di restituire oggetti, collocare e spostare piante Linden. Questo è utile ai membri per ripulire da oggetti indesiderati e creare paesaggi, ma deve essere utilizzato con cura, perchè la restituzione degli oggetti non può essere annullata." name="Parcel Content">
- <action description="Restituire oggetti di proprietà di un gruppo" longdescription="Restituisci gli oggetti di proprietà di un gruppo in un appezzamento di un gruppo in Informazioni sul terreno &gt; Oggetti." name="land return group owned"/>
- <action description="Restituire oggetti assegnati ad un gruppo" longdescription="Restituisci oggetti assegnati ad un gruppo in un lotto di un gruppo in Informazioni sul terreno &gt; Oggetti." name="land return group set"/>
- <action description="Restituire oggetti estranei al gruppo" longdescription="Restituire oggetti estranei al gruppo in un appezzamento di un gruppo in Informazioni sul terreno &gt; Oggetti." name="land return non group"/>
- <action description="Creare un paesaggio utilizzando le piante Linden" longdescription="Abilità di creare paesaggi e posizionare e spostare alberi, piante, erba Linden. Questi oggetti sono presenti nella Libreria del tuo Inventario &gt; cartella Oggetti, o possono essere creati con il menu Crea." name="land gardening"/>
+ <action description="Restituire oggetti di proprietà di un gruppo" longdescription="Restituisci gli oggetti di proprietà di un gruppo in un appezzamento di un gruppo in Informazioni sul terreno &gt; Oggetti." name="land return group owned" value="48"/>
+ <action description="Restituire oggetti assegnati ad un gruppo" longdescription="Restituisci oggetti assegnati ad un gruppo in un lotto di un gruppo in Informazioni sul terreno &gt; Oggetti." name="land return group set" value="33"/>
+ <action description="Restituire oggetti estranei al gruppo" longdescription="Restituire oggetti estranei al gruppo in un appezzamento di un gruppo in Informazioni sul terreno &gt; Oggetti." name="land return non group" value="34"/>
+ <action description="Creare un paesaggio utilizzando le piante Linden" longdescription="Abilità di creare paesaggi e posizionare e spostare alberi, piante, erba Linden. Questi oggetti sono presenti nella Libreria del tuo Inventario &gt; cartella Oggetti, o possono essere creati con il menu Crea." name="land gardening" value="35"/>
</action_set>
<action_set description="Queste Abilità includono il potere di cedere, modificare e vendere oggetti posseduti dal gruppo. Viene fatto negli strumenti Costruisci &gt; scheda Generale. Clic con il pulsante destro del mouse su un oggetto e Modifica per vedere le impostazioni." name="Object Management">
- <action description="Intestare oggetti ad un gruppo" longdescription="Intesta oggetti ad un gruppo in Strumenti per costruzione &gt; scheda Generale." name="object deed"/>
- <action description="Modificare (sposta, copia, modifica) oggetti di un gruppo" longdescription="Gestisci (sposta, copia, modifica) gli oggetti appartenenti ad un gruppo in Build Tools &gt; tabella Generale." name="object manipulate"/>
- <action description="Mettere in vendita oggetti di un gruppo" longdescription="Metti in vendita oggetti posseduti da un Gruppo in Strumenti per costruzione &gt; scheda Generale." name="object set sale"/>
+ <action description="Intestare oggetti ad un gruppo" longdescription="Intesta oggetti ad un gruppo in Strumenti per costruzione &gt; scheda Generale." name="object deed" value="36"/>
+ <action description="Modificare (sposta, copia, modifica) oggetti di un gruppo" longdescription="Gestisci (sposta, copia, modifica) gli oggetti appartenenti ad un gruppo in Build Tools &gt; tabella Generale." name="object manipulate" value="38"/>
+ <action description="Mettere in vendita oggetti di un gruppo" longdescription="Metti in vendita oggetti posseduti da un Gruppo in Strumenti per costruzione &gt; scheda Generale." name="object set sale" value="39"/>
</action_set>
<action_set description="Queste abilità consentono di richiedere ai membri di pagare le passività del gruppo e di ricevere i dividendi del gruppo, nonché di limitare l&apos;accesso alla cronologia finanziaria del gruppo." name="Accounting">
- <action description="Pagare le passività del gruppo e ricevere i dividendi del gruppo" longdescription="I membri con questo ruolo e abilità pagheranno automaticamente le passività del gruppo e riceveranno i dividendi del gruppo. Questo significa che riceveranno una porzione delle vendite di terreni appartenenti al gruppo (che sono distribuite giornalmente) e contribuiranno fondi a spese come le quote di inserzione del lotto. " name="accounting accountable"/>
+ <action description="Pagare le passività del gruppo e ricevere i dividendi del gruppo" longdescription="I membri con questo ruolo e abilità pagheranno automaticamente le passività del gruppo e riceveranno i dividendi del gruppo. Questo significa che riceveranno una porzione delle vendite di terreni appartenenti al gruppo (che sono distribuite giornalmente) e contribuiranno fondi a spese come le quote di inserzione del lotto. " name="accounting accountable" value="40"/>
</action_set>
<action_set description="Queste abilità consentono ai membri di inviare, ricevere e vedere gli avvisi del gruppo." name="Notices">
- <action description="Invia avvisi" longdescription="Membri in un ruolo con questa Abilità possono inviare avvisi tramite la sezione Gruppo &gt; Avvisi." name="notices send"/>
- <action description="Ricevere avvisi e vedere avvisi precedenti" longdescription="Membri in un ruolo con questa Abilità possono ricevere avvisi e vedere avvisi precedenti nella sezione Gruppo &gt; Avvisi." name="notices receive"/>
+ <action description="Invia avvisi" longdescription="Membri in un ruolo con questa Abilità possono inviare avvisi tramite la sezione Gruppo &gt; Avvisi." name="notices send" value="42"/>
+ <action description="Ricevere avvisi e vedere avvisi precedenti" longdescription="Membri in un ruolo con questa Abilità possono ricevere avvisi e vedere avvisi precedenti nella sezione Gruppo &gt; Avvisi." name="notices receive" value="43"/>
</action_set>
<action_set description="Queste Abilità permettono di concedere o limitare l&apos;accesso alle sessioni di chat e di chat vocale nel gruppo." name="Chat">
- <action description="Partecipare alla Chat di gruppo" longdescription="I membri con questo ruolo e abilità possono partecipare alle sessioni di chat, sia scritte che vocale." name="join group chat"/>
- <action description="Partecipa alla Chat vocale di gruppo" longdescription=" I membri con questo ruolo e abilità possono partecipare alle sessioni di Chat vocale nel gruppo. NOTA: per poter partecipare alla Chat di gruppo è necessario accedere alla sessione di chat vocale." name="join voice chat"/>
- <action description="Moderare la Chat di gruppo" longdescription="I membri con questo ruolo e abilità possono gestire l&apos;accesso e la partecipazione alle sessioni di chat scritta e di chat vocale nel gruppo." name="moderate group chat"/>
+ <action description="Partecipare alla Chat di gruppo" longdescription="I membri con questo ruolo e abilità possono partecipare alle sessioni di chat, sia scritte che vocale." name="join group chat" value="16"/>
+ <action description="Partecipa alla Chat vocale di gruppo" longdescription=" I membri con questo ruolo e abilità possono partecipare alle sessioni di Chat vocale nel gruppo. NOTA: per poter partecipare alla Chat di gruppo è necessario accedere alla sessione di chat vocale." name="join voice chat" value="27"/>
+ <action description="Moderare la Chat di gruppo" longdescription="I membri con questo ruolo e abilità possono gestire l&apos;accesso e la partecipazione alle sessioni di chat scritta e di chat vocale nel gruppo." name="moderate group chat" value="37"/>
</action_set>
</role_actions>
diff --git a/indra/newview/skins/default/xui/it/sidepanel_inventory.xml b/indra/newview/skins/default/xui/it/sidepanel_inventory.xml
index 1c1744d94b..5ac0961bd7 100644
--- a/indra/newview/skins/default/xui/it/sidepanel_inventory.xml
+++ b/indra/newview/skins/default/xui/it/sidepanel_inventory.xml
@@ -1,6 +1,27 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Cose" name="objects panel">
<panel label="" name="sidepanel__inventory_panel">
+ <layout_stack name="inventory_layout_stack">
+ <layout_panel name="inbox_layout_panel">
+ <panel label="" name="marketplace_inbox">
+ <string name="InboxLabelWithArg">
+ Oggetti ricevuti ([NUM])
+ </string>
+ <string name="InboxLabelNoArg">
+ Oggetti ricevuti
+ </string>
+ <button label="Oggetti ricevuti" name="inbox_btn"/>
+ <text name="inbox_fresh_new_count">
+ [NUM] nuovi
+ </text>
+ <panel name="inbox_inventory_placeholder_panel" tool_tip="Trascina gli elementi nell&apos;inventario per usarli">
+ <text name="inbox_inventory_placeholder">
+ Gli acquisti dal mercato verranno consegnati qui.
+ </text>
+ </panel>
+ </panel>
+ </layout_panel>
+ </layout_stack>
<panel name="button_panel">
<layout_stack name="button_panel_ls">
<layout_panel name="info_btn_lp">
diff --git a/indra/newview/skins/default/xui/it/sidepanel_task_info.xml b/indra/newview/skins/default/xui/it/sidepanel_task_info.xml
index 67870d9b76..cfabdc81b0 100644
--- a/indra/newview/skins/default/xui/it/sidepanel_task_info.xml
+++ b/indra/newview/skins/default/xui/it/sidepanel_task_info.xml
@@ -48,15 +48,9 @@
<text name="CreatorNameLabel">
Ideatore:
</text>
- <text name="Creator Name">
- Erica Linden
- </text>
<text name="Owner:">
Proprietario:
</text>
- <text name="Owner Name">
- Erica Linden
- </text>
<text name="Group_label">
Gruppo:
</text>
diff --git a/indra/newview/skins/default/xui/it/strings.xml b/indra/newview/skins/default/xui/it/strings.xml
index dfe635182e..8529fadd7d 100644
--- a/indra/newview/skins/default/xui/it/strings.xml
+++ b/indra/newview/skins/default/xui/it/strings.xml
@@ -31,12 +31,18 @@
<string name="StartupInitializingVFS">
Inizializzazione VFS...
</string>
+ <string name="StartupRequireDriverUpdate">
+ Inizializzazione grafica non riuscita. Aggiorna il driver della scheda grafica!
+ </string>
<string name="ProgressRestoring">
Ripristino in corso...
</string>
<string name="ProgressChangingResolution">
Modifica della risoluzione...
</string>
+ <string name="Fullbright">
+ Luminosità massima (vers. precedente)
+ </string>
<string name="LoginInProgress">
In connessione. [APP_NAME] può sembrare rallentata. Attendi.
</string>
@@ -71,7 +77,7 @@
Elaborazione risposta...
</string>
<string name="LoginInitializingWorld">
- Inizializzazione...
+ Inizializzazione mondo...
</string>
<string name="LoginDecodingImages">
Decodifica immagini...
@@ -85,6 +91,12 @@
<string name="LoginQuicktimeOK">
QuickTime configurato con successo.
</string>
+ <string name="LoginRequestSeedCapGrant">
+ Richiesta capacità regione...
+ </string>
+ <string name="LoginRetrySeedCapGrant">
+ Richiesta capacità regione, tentativo [NUMBER]...
+ </string>
<string name="LoginWaitingForRegionHandshake">
In attesa della risposta della regione...
</string>
@@ -124,6 +136,139 @@
<string name="create_account_url">
http://join.secondlife.com/index.php?lang=it-IT
</string>
+ <string name="LoginFailedViewerNotPermitted">
+ Il viewer utilizzato non è più in grado di accedere a Second Life. Visita la parina seguente per scaricare un nuovo viewer:
+http://secondlife.com/download.
+
+Per maggiori informazioni, consulta le domande frequenti alla pagina seguente:
+http://secondlife.com/viewer-access-faq
+ </string>
+ <string name="LoginIntermediateOptionalUpdateAvailable">
+ Disponibile aggiornamento facoltativo viewer: [VERSION]
+ </string>
+ <string name="LoginFailedRequiredUpdate">
+ Aggernamento viewer richiesto: [VERSION]
+ </string>
+ <string name="LoginFailedAlreadyLoggedIn">
+ Questo agente ha già eseguito il login.
+ </string>
+ <string name="LoginFailedAuthenticationFailed">
+ Siamo spiacenti. Il tentativo di accesso non è riuscito.
+Verifica di avere inserito correttamente
+ * Nome utente (come robby12 o Stella Soleggiato)
+ * Password
+Verifica anche che il blocco delle maiuscole non sia attivato.
+ </string>
+ <string name="LoginFailedPasswordChanged">
+ Come misura precauzionale, la tua password è stata cambiata.
+Visita la pagina del tuo account a http://secondlife.com/password
+e rispondi alla domanda di sicurezza per reimpostare la password.
+Ci scusiamo per l&apos;inconveniente.
+ </string>
+ <string name="LoginFailedPasswordReset">
+ Abbiamo effettuato delle modifiche al sistema che richiedono di reimpostare la password.
+Visita la pagina del tuo account a http://secondlife.com/password
+e rispondi alla domanda di sicurezza per reimpostare la password.
+Ci scusiamo per l&apos;inconveniente.
+ </string>
+ <string name="LoginFailedEmployeesOnly">
+ Second Life è chiuso temporaneamente per manutenzione.
+Al momento, solo i dipendenti possono eseguire l&apos;accesso.
+Visita www.secondlife.com/status per aggiornamenti.
+ </string>
+ <string name="LoginFailedPremiumOnly">
+ L&apos;accesso a Second Life è temporaneamente limitato per garantire che chi è nel mondo virtuale abbia la migliore esperienza possibile.
+
+Le persone con account gratuiti non potranno accedere a Second Life durante questo periodo, per lasciare spazio alle persone che hanno pagato per Second Life.
+ </string>
+ <string name="LoginFailedComputerProhibited">
+ Non si può accedere a Second Life da questo computer.
+Se ritieni che si tratta di un errore, contatta
+support@secondlife.com.
+ </string>
+ <string name="LoginFailedAcountSuspended">
+ Il tuo account non è accessibile fino alle
+[TIME] fuso orario del Pacifico.
+ </string>
+ <string name="LoginFailedAccountDisabled">
+ Non siamo attualmente in grado di completare la tua richiesta.
+Contatta l&apos;assistenza Second Life alla pagina http://secondlife.com/support.
+Se non sei in grado di cambiare la password, chiama (866) 476-9763.
+ </string>
+ <string name="LoginFailedTransformError">
+ Dati incompatibili rilevati durante l&apos;accesso.
+Contattare support@secondlife.com.
+ </string>
+ <string name="LoginFailedAccountMaintenance">
+ Il tuo account è in fase di leggera manutenzione.
+Il tuo account non è accessibile fino alle
+[TIME] fuso orario del Pacifico.
+Se ritieni che si tratta di un errore, contatta support@secondlife.com.
+ </string>
+ <string name="LoginFailedPendingLogoutFault">
+ Errore del simulatore in seguito alla richiesta di logout.
+ </string>
+ <string name="LoginFailedPendingLogout">
+ Il sistema sta eseguendo il logout in questo momento.
+Il tuo account non sarà disponibile fino alle
+[TIME] fuso orario del Pacifico.
+ </string>
+ <string name="LoginFailedUnableToCreateSession">
+ Non è possibile creare una sessione valida.
+ </string>
+ <string name="LoginFailedUnableToConnectToSimulator">
+ Non è possibile collegarsi a un simulatore.
+ </string>
+ <string name="LoginFailedRestrictedHours">
+ Il tuo account può accedere a Second Life solo
+tra le [START] e le [END] fuso orario del Pacifico.
+Torna durante quell&apos;orario.
+Se ritieni che si tratta di un errore, contatta support@secondlife.com.
+ </string>
+ <string name="LoginFailedIncorrectParameters">
+ Parametri errati.
+Se ritieni che si tratta di un errore, contatta support@secondlife.com.
+ </string>
+ <string name="LoginFailedFirstNameNotAlphanumeric">
+ Il parametro Nome deve includere solo caratteri alfanumerici.
+Se ritieni che si tratta di un errore, contatta support@secondlife.com.
+ </string>
+ <string name="LoginFailedLastNameNotAlphanumeric">
+ Il parametro Cognome deve includere solo caratteri alfanumerici.
+Se ritieni che si tratta di un errore, contatta support@secondlife.com.
+ </string>
+ <string name="LogoutFailedRegionGoingOffline">
+ La regione sta passando allo stato non in linea.
+Prova ad accedere nuovamente tra un minuto.
+ </string>
+ <string name="LogoutFailedAgentNotInRegion">
+ L&apos;agente non è nella regione.
+Prova ad accedere nuovamente tra un minuto.
+ </string>
+ <string name="LogoutFailedPendingLogin">
+ La regione ha eseguito l&apos;accesso in un&apos;altre sessione.
+Prova ad accedere nuovamente tra un minuto.
+ </string>
+ <string name="LogoutFailedLoggingOut">
+ La regione stava eseguendo il logout della sessione precedente.
+Prova ad accedere nuovamente tra un minuto.
+ </string>
+ <string name="LogoutFailedStillLoggingOut">
+ La regione sta ancora eseguendo il logout della sessione precedente.
+Prova ad accedere nuovamente tra un minuto.
+ </string>
+ <string name="LogoutSucceeded">
+ La regione ha eseguito il logout dell&apos;ultima sessione.
+Prova ad accedere nuovamente tra un minuto.
+ </string>
+ <string name="LogoutFailedLogoutBegun">
+ La regione ha iniziato la procedura di logout.
+Prova ad accedere nuovamente tra un minuto.
+ </string>
+ <string name="LoginFailedLoggingOutSession">
+ Il sistema ha iniziato il logout dell&apos;ultima sessione.
+Prova ad accedere nuovamente tra un minuto.
+ </string>
<string name="AgentLostConnection">
Questa regione sta avendo problemi. Verifica la tua connessione a Internet.
</string>
@@ -191,6 +336,36 @@
Solo un singolo oggetto può essere creato qui
</string>
<string name="TooltipPrice" value="L$ [AMOUNT]:"/>
+ <string name="TooltipOutboxDragToWorld">
+ Non puoi rezzare elementi nella tua casella in uscita del rivenditore
+ </string>
+ <string name="TooltipOutboxNoTransfer">
+ Almeno uno di questi oggetti non può essere venduto o trasferito.
+ </string>
+ <string name="TooltipOutboxNotInInventory">
+ La tua casella in uscita del rivenditore può accettare solo elementi provenienti dal tuo inventario
+ </string>
+ <string name="TooltipOutboxWorn">
+ Non puoi mettere gli elementi che indossi nella casella in uscita del rivenditore
+ </string>
+ <string name="TooltipOutboxCallingCard">
+ Non puoi inserire il tuo biglietto da visita nella tua casella in uscita del rivenditore
+ </string>
+ <string name="TooltipOutboxFolderLevels">
+ La profondità delle caselle nidificate è maggiore di 3
+ </string>
+ <string name="TooltipOutboxTooManyFolders">
+ Il numero di sottocartelle nella cartella al livello più alto è maggiore di 20
+ </string>
+ <string name="TooltipOutboxTooManyObjects">
+ Il numero di elementi nella cartella al livello più alto è maggiore di 200
+ </string>
+ <string name="TooltipDragOntoOwnChild">
+ Non puoi spostare una cartella nella relativa cartella secondaria
+ </string>
+ <string name="TooltipDragOntoSelf">
+ Non puoi spostare una cartella in se stessa
+ </string>
<string name="TooltipHttpUrl">
Clicca per visitare questa pagina web
</string>
@@ -200,6 +375,9 @@
<string name="TooltipAgentUrl">
Clicca per vedere il profilo di questo residente
</string>
+ <string name="TooltipAgentInspect">
+ Ulteriori informazioni su questo Residente
+ </string>
<string name="TooltipAgentMute">
Clicca per disattivare l&apos;audio di questo residente
</string>
@@ -429,6 +607,12 @@
<string name="symbolic folder link">
link alla cartella
</string>
+ <string name="mesh">
+ reticolo
+ </string>
+ <string name="AvatarEditingAppearance">
+ (Modifica Aspetto)
+ </string>
<string name="AvatarAway">
Assente
</string>
@@ -645,6 +829,9 @@
<string name="anim_yes_head">
Si
</string>
+ <string name="multiple_textures">
+ Multiple
+ </string>
<string name="texture_loading">
Caricamento in corso...
</string>
@@ -747,6 +934,12 @@
<string name="Estate / Full Region">
Proprietà immobiliare / Regione completa
</string>
+ <string name="Estate / Homestead">
+ Proprietà immobiliare / Homestead
+ </string>
+ <string name="Mainland / Homestead">
+ Continente / Homestead
+ </string>
<string name="Mainland / Full Region">
Continente / Regione completa
</string>
@@ -795,6 +988,9 @@
<string name="choose_the_directory">
Scegli la cartella
</string>
+ <string name="script_files">
+ Script
+ </string>
<string name="AvatarSetNotAway">
Imposta come non assente
</string>
@@ -852,6 +1048,9 @@
<string name="tattoo">
Tatuaggio
</string>
+ <string name="physics">
+ Fisica
+ </string>
<string name="invalid">
non valido
</string>
@@ -891,6 +1090,9 @@
<string name="tattoo_not_worn">
Tatuaggio non portato
</string>
+ <string name="physics_not_worn">
+ Fisica non indossata
+ </string>
<string name="invalid_not_worn">
non valido
</string>
@@ -939,6 +1141,9 @@
<string name="create_new_tattoo">
Crea un nuovo tatuaggio
</string>
+ <string name="create_new_physics">
+ Crea nuova fisica
+ </string>
<string name="create_new_invalid">
non valido
</string>
@@ -1023,6 +1228,65 @@
<string name="InventoryNoTexture">
Non hai una copia di questa texture nel tuo inventario
</string>
+ <string name="InventoryInboxNoItems">
+ Gli acquissti dal mercato verranno mostrati qui. Potrai quindi trascinarli nel tuo inventario per usarli.
+ </string>
+ <string name="MarketplaceURL">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/
+ </string>
+ <string name="MarketplaceURL_CreateStore">
+ http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.4
+ </string>
+ <string name="MarketplaceURL_Dashboard">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard
+ </string>
+ <string name="MarketplaceURL_Imports">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports
+ </string>
+ <string name="MarketplaceURL_LearnMore">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more
+ </string>
+ <string name="InventoryOutboxNotMerchantTitle">
+ Chiunque può vendere oggetti nel Marketplace.
+ </string>
+ <string name="InventoryOutboxNotMerchantTooltip"/>
+ <string name="InventoryOutboxNotMerchant">
+ Per diventare un venditore, devi [[MARKETPLACE_CREATE_STORE_URL] creare un negozio nel Marketplace].
+ </string>
+ <string name="InventoryOutboxNoItemsTitle">
+ La tua casella in uscita è vuota.
+ </string>
+ <string name="InventoryOutboxNoItemsTooltip"/>
+ <string name="InventoryOutboxNoItems">
+ Trascina le cartelle in questa area e clicca su &quot;Invia a Marketplace&quot; per metterle in vendita su [[MARKETPLACE_DASHBOARD_URL] Marketplace].
+ </string>
+ <string name="Marketplace Error None">
+ Nessun errore
+ </string>
+ <string name="Marketplace Error Not Merchant">
+ Errore: Prima di inviare elementi al Marketplace devi essere impostato come rivenditore (gratis).
+ </string>
+ <string name="Marketplace Error Empty Folder">
+ Errore: questa cartella non include alcun contenuto.
+ </string>
+ <string name="Marketplace Error Unassociated Products">
+ Errore: Oggetto non caricato perché il tuo account venditore ha troppi oggetti che non sono associati con dei prodotti. Per risolvere questo errore, esegui l&apos;accesso al sito di Marketplace e riduci il numero di oggetti non associati.
+ </string>
+ <string name="Marketplace Error Object Limit">
+ Errore: questo elemento contiene troppi oggetti. Per risolvere questo problema, inserisci più oggetti insieme in una scatola per ridurre a meno di 200 il numero totale di oggetti.
+ </string>
+ <string name="Marketplace Error Folder Depth">
+ Errore: questo elemento contiene troppi livelli di cartelle nidificate. Riorganizzalo per ottenere un massimo di 3 livelli di cartelle nidificate.
+ </string>
+ <string name="Marketplace Error Unsellable Item">
+ Errore: Questo elemento non può essere venduto nel Marketplace.
+ </string>
+ <string name="Marketplace Error Internal Import">
+ Errore: problema con questo elemento. Riprova più tardi.
+ </string>
+ <string name="Open landmarks">
+ Apri luoghi di riferimento
+ </string>
<string name="no_transfer" value="(nessun trasferimento)"/>
<string name="no_modify" value="(nessuna modifica)"/>
<string name="no_copy" value="(nessuna copia)"/>
@@ -1037,7 +1301,7 @@
</string>
<string name="WornOnAttachmentPoint" value="(indossato su [ATTACHMENT_POINT])"/>
<string name="ActiveGesture" value="[GESLABEL] (attivo)"/>
- <string name="Chat" value="Chat :"/>
+ <string name="Chat Message" value="Chat:"/>
<string name="Sound" value="Suono :"/>
<string name="Wait" value="--- Attendi :"/>
<string name="AnimFlagStop" value="Ferma l&apos;animazione :"/>
@@ -1063,9 +1327,6 @@
<string name="InvFolder My Inventory">
Il mio inventario
</string>
- <string name="InvFolder My Favorites">
- I miei preferiti
- </string>
<string name="InvFolder Library">
Libreria
</string>
@@ -1124,10 +1385,10 @@
Gesture
</string>
<string name="InvFolder Favorite">
- Preferiti
+ I miei preferiti
</string>
<string name="InvFolder favorite">
- Preferiti
+ I miei preferiti
</string>
<string name="InvFolder Current Outfit">
Abbigliamento attuale
@@ -1141,12 +1402,21 @@
<string name="InvFolder Accessories">
Accessori
</string>
+ <string name="InvFolder Meshes">
+ Reticoli
+ </string>
<string name="InvFolder Friends">
Amici
</string>
<string name="InvFolder All">
Tutto
</string>
+ <string name="no_attachments">
+ Nessun allegato indossato
+ </string>
+ <string name="Attachments remain">
+ Allegati ([COUNT] spazi restanti)
+ </string>
<string name="Buy">
Acquista
</string>
@@ -1273,6 +1543,12 @@
<string name="Right Pec">
Petto destro
</string>
+ <string name="Neck">
+ Collo
+ </string>
+ <string name="Avatar Center">
+ Centro avatar
+ </string>
<string name="Invalid Attachment">
Punto di collegamento non valido
</string>
@@ -1454,8 +1730,11 @@
<string name="Unknown">
(Sconosciuto)
</string>
- <string name="SummaryForTheWeek" value="Riassunto della settimana, partendo dal"/>
- <string name="NextStipendDay" value="Il prossimo giorno di stipendio è"/>
+ <string name="SummaryForTheWeek" value="Riassunto della settimana, partendo dal "/>
+ <string name="NextStipendDay" value=". Il prossimo giorno di stipendio è "/>
+ <string name="GroupPlanningDate">
+ [mthnum,datetime,utc]/[day,datetime,utc]/[year,datetime,utc]
+ </string>
<string name="GroupIndividualShare" value="Gruppo Dividendi individuali"/>
<string name="GroupColumn" value="Gruppo"/>
<string name="Balance">
@@ -1482,6 +1761,9 @@
<string name="IMTeen">
teen
</string>
+ <string name="Anyone">
+ chiunque
+ </string>
<string name="RegionInfoError">
errore
</string>
@@ -1689,7 +1971,7 @@
<string name="RegionNoCovenantOtherOwner">
Non esiste alcun regolamento per questa proprietà. Il terreno di questa proprietà è messo in vendita dal proprietario, non dalla Linden Lab. Contatta il proprietario del terreno per i dettagli della vendita.
</string>
- <string name="covenant_last_modified" value="Ultima modifica:"/>
+ <string name="covenant_last_modified" value="Ultima modifica: "/>
<string name="none_text" value="(nessuno)"/>
<string name="never_text" value="(mai)"/>
<string name="GroupOwned">
@@ -1698,6 +1980,12 @@
<string name="Public">
Pubblica
</string>
+ <string name="LocalSettings">
+ Impostazioni locali
+ </string>
+ <string name="RegionSettings">
+ Impostazioni regione
+ </string>
<string name="ClassifiedClicksTxt">
Clicca: [TELEPORT] teleport, [MAP] mappa, [PROFILE] profilo
</string>
@@ -1737,11 +2025,8 @@
<string name="InvOfferGaveYou">
Ti ha offerto
</string>
- <string name="InvOfferYouDecline">
- Rifiuta
- </string>
- <string name="InvOfferFrom">
- da
+ <string name="InvOfferDecline">
+ Non hai accettato [DESC] da &lt;nolink&gt;[NAME]&lt;/nolink&gt;.
</string>
<string name="GroupMoneyTotal">
Totale
@@ -1773,6 +2058,9 @@
<string name="GroupMoneyDebits">
Debiti
</string>
+ <string name="GroupMoneyDate">
+ [weekday,datetime,utc] [mth,datetime,utc] [day,datetime,utc], [year,datetime,utc]
+ </string>
<string name="ViewerObjectContents">
Contenuto
</string>
@@ -1822,12 +2110,6 @@ Tipi conosciuti .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
<string name="accel-win-shift">
Shift+
</string>
- <string name="Esc">
- Esc
- </string>
- <string name="Home">
- Home
- </string>
<string name="FileSaved">
File salvato
</string>
@@ -1846,34 +2128,34 @@ Tipi conosciuti .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
<string name="PDT">
Ora legale Pacifico
</string>
- <string name="Forward">
+ <string name="Direction_Forward">
Avanti
</string>
- <string name="Left">
+ <string name="Direction_Left">
Sinistra
</string>
- <string name="Right">
+ <string name="Direction_Right">
Destra
</string>
- <string name="Back">
+ <string name="Direction_Back">
Indietro
</string>
- <string name="North">
+ <string name="Direction_North">
Nord
</string>
- <string name="South">
+ <string name="Direction_South">
Sud
</string>
- <string name="West">
+ <string name="Direction_West">
Ovest
</string>
- <string name="East">
+ <string name="Direction_East">
Est
</string>
- <string name="Up">
+ <string name="Direction_Up">
Su
</string>
- <string name="Down">
+ <string name="Direction_Down">
Giù
</string>
<string name="Any Category">
@@ -1945,6 +2227,9 @@ Tipi conosciuti .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
<string name="Other">
Altro
</string>
+ <string name="Rental">
+ Affitto
+ </string>
<string name="Any">
Tutti
</string>
@@ -2181,6 +2466,114 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
<string name="Bulbous Nose">
Naso bulboso
</string>
+ <string name="Breast Physics Mass">
+ Massa seno
+ </string>
+ <string name="Breast Physics Smoothing">
+ Lisciatura seno
+ </string>
+ <string name="Breast Physics Gravity">
+ Gravità seno
+ </string>
+ <string name="Breast Physics Drag">
+ Resistenza seno
+ </string>
+ <string name="Breast Physics InOut Max Effect">
+ Massimo effetto
+ </string>
+ <string name="Breast Physics InOut Spring">
+ Elasticità
+ </string>
+ <string name="Breast Physics InOut Gain">
+ Guadagno
+ </string>
+ <string name="Breast Physics InOut Damping">
+ Attenuazione
+ </string>
+ <string name="Breast Physics UpDown Max Effect">
+ Massimo effetto
+ </string>
+ <string name="Breast Physics UpDown Spring">
+ Elasticità
+ </string>
+ <string name="Breast Physics UpDown Gain">
+ Guadagno
+ </string>
+ <string name="Breast Physics UpDown Damping">
+ Attenuazione
+ </string>
+ <string name="Breast Physics LeftRight Max Effect">
+ Massimo effetto
+ </string>
+ <string name="Breast Physics LeftRight Spring">
+ Elasticità
+ </string>
+ <string name="Breast Physics LeftRight Gain">
+ Guadagno
+ </string>
+ <string name="Breast Physics LeftRight Damping">
+ Attenuazione
+ </string>
+ <string name="Belly Physics Mass">
+ Massa pancia
+ </string>
+ <string name="Belly Physics Smoothing">
+ Lisciatura pancia
+ </string>
+ <string name="Belly Physics Gravity">
+ Gravità pancia
+ </string>
+ <string name="Belly Physics Drag">
+ Resistenza pancia
+ </string>
+ <string name="Belly Physics UpDown Max Effect">
+ Massimo effetto
+ </string>
+ <string name="Belly Physics UpDown Spring">
+ Elasticità
+ </string>
+ <string name="Belly Physics UpDown Gain">
+ Guadagno
+ </string>
+ <string name="Belly Physics UpDown Damping">
+ Attenuazione
+ </string>
+ <string name="Butt Physics Mass">
+ Massa natiche
+ </string>
+ <string name="Butt Physics Smoothing">
+ Lisciatura natiche
+ </string>
+ <string name="Butt Physics Gravity">
+ Gravità natiche
+ </string>
+ <string name="Butt Physics Drag">
+ Resistenza natiche
+ </string>
+ <string name="Butt Physics UpDown Max Effect">
+ Massimo effetto
+ </string>
+ <string name="Butt Physics UpDown Spring">
+ Elasticità
+ </string>
+ <string name="Butt Physics UpDown Gain">
+ Guadagno
+ </string>
+ <string name="Butt Physics UpDown Damping">
+ Attenuazione
+ </string>
+ <string name="Butt Physics LeftRight Max Effect">
+ Massimo effetto
+ </string>
+ <string name="Butt Physics LeftRight Spring">
+ Elasticità
+ </string>
+ <string name="Butt Physics LeftRight Gain">
+ Guadagno
+ </string>
+ <string name="Butt Physics LeftRight Damping">
+ Attenuazione
+ </string>
<string name="Bushy Eyebrows">
Sopracciglia cespugliose
</string>
@@ -2190,6 +2583,9 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
<string name="Butt Size">
Grandezza del sedere
</string>
+ <string name="Butt Gravity">
+ Gravità natiche
+ </string>
<string name="bustle skirt">
Crinolina
</string>
@@ -3381,6 +3777,9 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
<string name="LocationCtrlGeneralIconTooltip">
Regione generale
</string>
+ <string name="LocationCtrlSeeAVsTooltip">
+ Avatar visibili e chat consentita fuori di questo lotto
+ </string>
<string name="UpdaterWindowTitle">
Aggiornamento [APP_NAME]
</string>
@@ -3447,6 +3846,9 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
<string name="Saved_message">
(Salvato [LONG_TIMESTAMP])
</string>
+ <string name="IM_unblock_only_groups_friends">
+ Per vedere questo messaggio, devi deselezionare &apos;Solo amici e gruppi possono chiamarmi o mandarmi IM&apos; in Preferenze/Privacy.
+ </string>
<string name="answered_call">
Risposto alla chiamata
</string>
@@ -3478,7 +3880,7 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
Sei l&apos;unico utente di questa sessione.
</string>
<string name="offline_message">
- [NAME] è offline.
+ [NAME] è offline
</string>
<string name="invite_message">
Clicca il tasto [BUTTON NAME] per accettare/connetterti a questa voice chat.
@@ -3543,10 +3945,16 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
<string name="session_initialization_timed_out_error">
Sessione di inizializzazione scaduta
</string>
+ <string name="Home position set.">
+ Posizione di base impostata.
+ </string>
<string name="voice_morphing_url">
http://secondlife.com/landing/voicemorphing
</string>
<string name="paid_you_ldollars">
+ [NAME] ti ha inviato un pagamento di L$[AMOUNT] [REASON].
+ </string>
+ <string name="paid_you_ldollars_no_reason">
[NAME] ti ha inviato un pagamento di L$[AMOUNT].
</string>
<string name="you_paid_ldollars">
@@ -3561,6 +3969,21 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
<string name="you_paid_ldollars_no_name">
Hai pagato L$ [AMOUNT] [REASON].
</string>
+ <string name="you_paid_failure_ldollars">
+ Non hai pagato [NAME] L$[AMOUNT] [REASON].
+ </string>
+ <string name="you_paid_failure_ldollars_no_info">
+ Non hai pagato L$ [AMOUNT].
+ </string>
+ <string name="you_paid_failure_ldollars_no_reason">
+ Non hai pagato [NAME] L$[AMOUNT].
+ </string>
+ <string name="you_paid_failure_ldollars_no_name">
+ Non hai pagato L$ [AMOUNT] [REASON].
+ </string>
+ <string name="for item">
+ per [ITEM]
+ </string>
<string name="for a parcel of land">
per un lotto di terreno
</string>
@@ -3579,6 +4002,9 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
<string name="to upload">
per caricare
</string>
+ <string name="to publish a classified ad">
+ per pubblicare un annuncio
+ </string>
<string name="giving">
Contributo di L$ [AMOUNT]
</string>
@@ -3608,7 +4034,7 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
</string>
<string name="uploading_abuse_report">
Caricamento in corso...
-
+
Segnala abuso
</string>
<string name="New Shape">
@@ -3656,6 +4082,9 @@ Segnala abuso
<string name="New Tattoo">
Nuovo tatuaggio
</string>
+ <string name="New Physics">
+ Nuova fisica
+ </string>
<string name="Invalid Wearable">
Capo da indossare non valido
</string>
@@ -3779,6 +4208,87 @@ Segnala abuso
<string name="Female - Wow">
Femmina - Accipicchia
</string>
+ <string name="/bow">
+ /inchino
+ </string>
+ <string name="/clap">
+ /applausi
+ </string>
+ <string name="/count">
+ /numero
+ </string>
+ <string name="/extinguish">
+ /estingui
+ </string>
+ <string name="/kmb">
+ /chissene
+ </string>
+ <string name="/muscle">
+ /muscolo
+ </string>
+ <string name="/no">
+ /no
+ </string>
+ <string name="/no!">
+ /no!
+ </string>
+ <string name="/paper">
+ /carta
+ </string>
+ <string name="/pointme">
+ /indicome
+ </string>
+ <string name="/pointyou">
+ /indicotu
+ </string>
+ <string name="/rock">
+ /sasso
+ </string>
+ <string name="/scissor">
+ /forbici
+ </string>
+ <string name="/smoke">
+ /fumo
+ </string>
+ <string name="/stretch">
+ /stiracchiata
+ </string>
+ <string name="/whistle">
+ /fischietto
+ </string>
+ <string name="/yes">
+ /si
+ </string>
+ <string name="/yes!">
+ /si!
+ </string>
+ <string name="afk">
+ non alla tastiera
+ </string>
+ <string name="dance1">
+ danza1
+ </string>
+ <string name="dance2">
+ danza2
+ </string>
+ <string name="dance3">
+ danza3
+ </string>
+ <string name="dance4">
+ danza4
+ </string>
+ <string name="dance5">
+ danza5
+ </string>
+ <string name="dance6">
+ danza6
+ </string>
+ <string name="dance7">
+ danza7
+ </string>
+ <string name="dance8">
+ danza8
+ </string>
<string name="AvatarBirthDateFormat">
[day,datetime,slt]/[mthnum,datetime,slt]/[year,datetime,slt]
</string>
@@ -3792,7 +4302,7 @@ Segnala abuso
<string name="server_is_down">
Nonostante i nostri tentativi, si è verificato un errore imprevisto.
- Consulta la pagina status.secondlifegrid.net per determinare se si sia verificato un problema noto con il servizio.
+ Consulta la pagina status.secondlifegrid.net per determinare se si sia verificato un problema noto con il servizio.
Se il problema continua, ti consigliamo di controllare le tue impostazioni di rete e della firewall.
</string>
<string name="dateTimeWeekdaysNames">
@@ -3855,7 +4365,7 @@ Segnala abuso
<string name="Notices">
Avvisi
</string>
- <string name="Chat">
+ <string name="Chat" value="Chat :">
Chat
</string>
<string name="DeleteItems">
@@ -3867,4 +4377,552 @@ Segnala abuso
<string name="EmptyOutfitText">
Questo vestiario non contiene alcun elemento
</string>
+ <string name="ExternalEditorNotSet">
+ Seleziona un editor usando le impostazioni ExternalEditor.
+ </string>
+ <string name="ExternalEditorNotFound">
+ L&apos;editor esterno specificato non è stato trovato.
+Prova a racchiudere il percorso dell&apos;editor in doppie virgolette.
+(per es. &quot;/percorso per il mio/editor&quot; &quot;%s&quot;)
+ </string>
+ <string name="ExternalEditorCommandParseError">
+ Errore nell&apos;elaborazione del comando dell&apos;editor esterno.
+ </string>
+ <string name="ExternalEditorFailedToRun">
+ L&apos;editor esterno non è stato avviato.
+ </string>
+ <string name="TranslationFailed">
+ Traduzione non riuscita: [REASON]
+ </string>
+ <string name="TranslationResponseParseError">
+ Errore di elaborazione della risposta della traduzione.
+ </string>
+ <string name="Esc">
+ Esc
+ </string>
+ <string name="Space">
+ Space
+ </string>
+ <string name="Enter">
+ Enter
+ </string>
+ <string name="Tab">
+ Tab
+ </string>
+ <string name="Ins">
+ Ins
+ </string>
+ <string name="Del">
+ Del
+ </string>
+ <string name="Backsp">
+ Backsp
+ </string>
+ <string name="Shift">
+ Shift
+ </string>
+ <string name="Ctrl">
+ Ctrl
+ </string>
+ <string name="Alt">
+ Alt
+ </string>
+ <string name="CapsLock">
+ CapsLock
+ </string>
+ <string name="Home">
+ Home
+ </string>
+ <string name="End">
+ End
+ </string>
+ <string name="PgUp">
+ PgUp
+ </string>
+ <string name="PgDn">
+ PgDn
+ </string>
+ <string name="F1">
+ F1
+ </string>
+ <string name="F2">
+ F2
+ </string>
+ <string name="F3">
+ F3
+ </string>
+ <string name="F4">
+ F4
+ </string>
+ <string name="F5">
+ F5
+ </string>
+ <string name="F6">
+ F6
+ </string>
+ <string name="F7">
+ F7
+ </string>
+ <string name="F8">
+ F8
+ </string>
+ <string name="F9">
+ F9
+ </string>
+ <string name="F10">
+ F10
+ </string>
+ <string name="F11">
+ F11
+ </string>
+ <string name="F12">
+ F12
+ </string>
+ <string name="Add">
+ Aggiungi
+ </string>
+ <string name="Subtract">
+ Sottrai
+ </string>
+ <string name="Multiply">
+ Moltiplica
+ </string>
+ <string name="Divide">
+ Dividi
+ </string>
+ <string name="PAD_DIVIDE">
+ PAD_DIVIDE
+ </string>
+ <string name="PAD_LEFT">
+ PAD_LEFT
+ </string>
+ <string name="PAD_RIGHT">
+ PAD_RIGHT
+ </string>
+ <string name="PAD_DOWN">
+ PAD_DOWN
+ </string>
+ <string name="PAD_UP">
+ PAD_UP
+ </string>
+ <string name="PAD_HOME">
+ PAD_HOME
+ </string>
+ <string name="PAD_END">
+ PAD_END
+ </string>
+ <string name="PAD_PGUP">
+ PAD_PGUP
+ </string>
+ <string name="PAD_PGDN">
+ PAD_PGDN
+ </string>
+ <string name="PAD_CENTER">
+ PAD_CENTER
+ </string>
+ <string name="PAD_INS">
+ PAD_INS
+ </string>
+ <string name="PAD_DEL">
+ PAD_DEL
+ </string>
+ <string name="PAD_Enter">
+ PAD_Enter
+ </string>
+ <string name="PAD_BUTTON0">
+ PAD_BUTTON0
+ </string>
+ <string name="PAD_BUTTON1">
+ PAD_BUTTON1
+ </string>
+ <string name="PAD_BUTTON2">
+ PAD_BUTTON2
+ </string>
+ <string name="PAD_BUTTON3">
+ PAD_BUTTON3
+ </string>
+ <string name="PAD_BUTTON4">
+ PAD_BUTTON4
+ </string>
+ <string name="PAD_BUTTON5">
+ PAD_BUTTON5
+ </string>
+ <string name="PAD_BUTTON6">
+ PAD_BUTTON6
+ </string>
+ <string name="PAD_BUTTON7">
+ PAD_BUTTON7
+ </string>
+ <string name="PAD_BUTTON8">
+ PAD_BUTTON8
+ </string>
+ <string name="PAD_BUTTON9">
+ PAD_BUTTON9
+ </string>
+ <string name="PAD_BUTTON10">
+ PAD_BUTTON10
+ </string>
+ <string name="PAD_BUTTON11">
+ PAD_BUTTON11
+ </string>
+ <string name="PAD_BUTTON12">
+ PAD_BUTTON12
+ </string>
+ <string name="PAD_BUTTON13">
+ PAD_BUTTON13
+ </string>
+ <string name="PAD_BUTTON14">
+ PAD_BUTTON14
+ </string>
+ <string name="PAD_BUTTON15">
+ PAD_BUTTON15
+ </string>
+ <string name="-">
+ -
+ </string>
+ <string name="=">
+ =
+ </string>
+ <string name="`">
+ `
+ </string>
+ <string name=";">
+ ;
+ </string>
+ <string name="[">
+ [
+ </string>
+ <string name="]">
+ ]
+ </string>
+ <string name="\">
+ \
+ </string>
+ <string name="0">
+ 0
+ </string>
+ <string name="1">
+ 1
+ </string>
+ <string name="2">
+ 2
+ </string>
+ <string name="3">
+ 3
+ </string>
+ <string name="4">
+ 4
+ </string>
+ <string name="5">
+ 5
+ </string>
+ <string name="6">
+ 6
+ </string>
+ <string name="7">
+ 7
+ </string>
+ <string name="8">
+ 8
+ </string>
+ <string name="9">
+ 9
+ </string>
+ <string name="A">
+ A
+ </string>
+ <string name="B">
+ B
+ </string>
+ <string name="C">
+ C
+ </string>
+ <string name="D">
+ D
+ </string>
+ <string name="E">
+ E
+ </string>
+ <string name="F">
+ F
+ </string>
+ <string name="G">
+ G
+ </string>
+ <string name="H">
+ H
+ </string>
+ <string name="I">
+ I
+ </string>
+ <string name="J">
+ J
+ </string>
+ <string name="K">
+ K
+ </string>
+ <string name="L">
+ L
+ </string>
+ <string name="M">
+ M
+ </string>
+ <string name="N">
+ N
+ </string>
+ <string name="O">
+ O
+ </string>
+ <string name="P">
+ P
+ </string>
+ <string name="Q">
+ Q
+ </string>
+ <string name="R">
+ R
+ </string>
+ <string name="S">
+ S
+ </string>
+ <string name="T">
+ T
+ </string>
+ <string name="U">
+ U
+ </string>
+ <string name="V">
+ V
+ </string>
+ <string name="W">
+ W
+ </string>
+ <string name="X">
+ X
+ </string>
+ <string name="Y">
+ Y
+ </string>
+ <string name="Z">
+ Z
+ </string>
+ <string name="BeaconParticle">
+ Visualizzazione marcatori particelle (blu)
+ </string>
+ <string name="BeaconPhysical">
+ Visualizzazione marcatori oggetti fisici (verde)
+ </string>
+ <string name="BeaconScripted">
+ Visualizzazione marcatori oggetti scriptati (rosso)
+ </string>
+ <string name="BeaconScriptedTouch">
+ Visualizzazione marcatori oggetti scriptati con funzione tocco (rosso)
+ </string>
+ <string name="BeaconSound">
+ Visualizzazione marcatori suoni (giallo)
+ </string>
+ <string name="BeaconMedia">
+ Visualizzazione marcatori multimedia (bianco)
+ </string>
+ <string name="ParticleHiding">
+ Particelle nascoste
+ </string>
+ <string name="Command_AboutLand_Label">
+ Informazioni sul terreno
+ </string>
+ <string name="Command_Appearance_Label">
+ Aspetto fisico
+ </string>
+ <string name="Command_Avatar_Label">
+ Avatar
+ </string>
+ <string name="Command_Build_Label">
+ Costruisci
+ </string>
+ <string name="Command_Chat_Label">
+ Chat
+ </string>
+ <string name="Command_Compass_Label">
+ Bussola
+ </string>
+ <string name="Command_Destinations_Label">
+ Destinazioni
+ </string>
+ <string name="Command_Gestures_Label">
+ Gesture
+ </string>
+ <string name="Command_HowTo_Label">
+ Istruzioni
+ </string>
+ <string name="Command_Inventory_Label">
+ Inventario
+ </string>
+ <string name="Command_Map_Label">
+ Mappa
+ </string>
+ <string name="Command_Marketplace_Label">
+ Mercato
+ </string>
+ <string name="Command_MiniMap_Label">
+ Mini mappa
+ </string>
+ <string name="Command_Move_Label">
+ Cammina / corri / vola
+ </string>
+ <string name="Command_Outbox_Label">
+ Casella in uscita del rivenditore
+ </string>
+ <string name="Command_People_Label">
+ Persone
+ </string>
+ <string name="Command_Picks_Label">
+ Preferiti
+ </string>
+ <string name="Command_Places_Label">
+ Luoghi
+ </string>
+ <string name="Command_Preferences_Label">
+ Preferenze
+ </string>
+ <string name="Command_Profile_Label">
+ Profilo
+ </string>
+ <string name="Command_Search_Label">
+ Ricerca
+ </string>
+ <string name="Command_Snapshot_Label">
+ Istantanea
+ </string>
+ <string name="Command_Speak_Label">
+ Parla
+ </string>
+ <string name="Command_View_Label">
+ Controlli fotocamera
+ </string>
+ <string name="Command_Voice_Label">
+ Impostazioni voce
+ </string>
+ <string name="Command_AboutLand_Tooltip">
+ Informazioni sul terreno che visiti
+ </string>
+ <string name="Command_Appearance_Tooltip">
+ Cambia l&apos;avatar
+ </string>
+ <string name="Command_Avatar_Tooltip">
+ Seleziona un avatar completo
+ </string>
+ <string name="Command_Build_Tooltip">
+ Costruzione oggetti e modifica terreno
+ </string>
+ <string name="Command_Chat_Tooltip">
+ Chatta con persone vicine usando il testo
+ </string>
+ <string name="Command_Compass_Tooltip">
+ Bussola
+ </string>
+ <string name="Command_Destinations_Tooltip">
+ Destinazioni interessanti
+ </string>
+ <string name="Command_Gestures_Tooltip">
+ Gesti per il tuo avatar
+ </string>
+ <string name="Command_HowTo_Tooltip">
+ Come eseguire le attività più comuni
+ </string>
+ <string name="Command_Inventory_Tooltip">
+ Visualizza e usa le tue cose
+ </string>
+ <string name="Command_Map_Tooltip">
+ Mappa del mondo
+ </string>
+ <string name="Command_Marketplace_Tooltip">
+ Vai allo shopping
+ </string>
+ <string name="Command_MiniMap_Tooltip">
+ Mostra le persone vicine
+ </string>
+ <string name="Command_Move_Tooltip">
+ Movimento avatar
+ </string>
+ <string name="Command_Outbox_Tooltip">
+ Trasferisci elementi al tuo mercato per la vendita
+ </string>
+ <string name="Command_People_Tooltip">
+ Amici, gruppi e persone vicine
+ </string>
+ <string name="Command_Picks_Tooltip">
+ Luoghi da mostrare come preferiti nel profilo
+ </string>
+ <string name="Command_Places_Tooltip">
+ Luoghi salvati
+ </string>
+ <string name="Command_Preferences_Tooltip">
+ Preferenze
+ </string>
+ <string name="Command_Profile_Tooltip">
+ Modifica o visualizza il tuo profilo
+ </string>
+ <string name="Command_Search_Tooltip">
+ Trova luoghi, eventi, persone
+ </string>
+ <string name="Command_Snapshot_Tooltip">
+ Scatta una foto
+ </string>
+ <string name="Command_Speak_Tooltip">
+ Parla con persone vicine usando il microfono
+ </string>
+ <string name="Command_View_Tooltip">
+ Modifica angolo fotocamera
+ </string>
+ <string name="Command_Voice_Tooltip">
+ I controlli per il volume per le chiamate e per le persone nelle vicinanze nel mondo virtuale
+ </string>
+ <string name="Toolbar_Bottom_Tooltip">
+ attualmente nella barra degli strumenti in basso
+ </string>
+ <string name="Toolbar_Left_Tooltip">
+ attualmente nella barra degli strumenti a sinistra
+ </string>
+ <string name="Toolbar_Right_Tooltip">
+ attualmente nella barra degli strumenti a destra
+ </string>
+ <string name="Retain%">
+ Mantieni%
+ </string>
+ <string name="Detail">
+ Dettagli
+ </string>
+ <string name="Better Detail">
+ Migliori dettagli
+ </string>
+ <string name="Surface">
+ Superficie
+ </string>
+ <string name="Solid">
+ Solido
+ </string>
+ <string name="Wrap">
+ Involucro
+ </string>
+ <string name="Preview">
+ Anteprima
+ </string>
+ <string name="Normal">
+ Normale
+ </string>
+ <string name="snapshot_quality_very_low">
+ Molto basso
+ </string>
+ <string name="snapshot_quality_low">
+ Basso
+ </string>
+ <string name="snapshot_quality_medium">
+ Medio
+ </string>
+ <string name="snapshot_quality_high">
+ Alto
+ </string>
+ <string name="snapshot_quality_very_high">
+ Molto alto
+ </string>
</strings>
diff --git a/indra/newview/skins/default/xui/it/teleport_strings.xml b/indra/newview/skins/default/xui/it/teleport_strings.xml
index 7a1046abd3..f485212290 100644
--- a/indra/newview/skins/default/xui/it/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/it/teleport_strings.xml
@@ -18,6 +18,10 @@ Se si continua a visualizzare questo messaggio, consulta la pagina [SUPPORT_SITE
<message name="timeout_tport">
Spiacenti, il sistema non riesce a completare il teletrasporto. Riprova tra un attimo.
</message>
+ <message name="NoHelpIslandTP">
+ Non puoi teleportarti nuovamente a Welcome Island.
+Per ripetere l&apos;esercitazione, visita &apos;Welcome Island Public&apos;.
+ </message>
<message name="noaccess_tport">
Spiacenti, ma non hai accesso nel luogo di destinazione richiesto.
</message>
diff --git a/indra/newview/skins/default/xui/ja/floater_about.xml b/indra/newview/skins/default/xui/ja/floater_about.xml
index 61fedede35..3c7a210a22 100644
--- a/indra/newview/skins/default/xui/ja/floater_about.xml
+++ b/indra/newview/skins/default/xui/ja/floater_about.xml
@@ -10,7 +10,7 @@
<floater.string name="AboutPosition">
ã‚ãªãŸã®ç¾åœ¨åœ°ã¯ã€[POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] ã® [REGION] ã§ã™ã€‚ä½ç½®ã¯ &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ã§ã™ã€‚([HOSTIP])
[SERVER_VERSION]
-[[SERVER_RELEASE_NOTES_URL] [リリースノート]]
+[SERVER_RELEASE_NOTES_URL]
</floater.string>
<floater.string name="AboutSystem">
CPU: [CPU]
@@ -37,45 +37,64 @@ Qt Webkit ãƒãƒ¼ã‚¸ãƒ§ãƒ³ï¼š [QT_WEBKIT_VERSION]
<floater.string name="AboutTraffic">
パケットロス: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
</floater.string>
+ <floater.string name="ErrorFetchingServerReleaseNotesURL">
+ サーãƒãƒ¼ã®ãƒªãƒªãƒ¼ã‚¹ãƒŽãƒ¼ãƒˆã® URL ã‚’å–得中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚
+ </floater.string>
<tab_container name="about_tab">
<panel label="情報" name="support_panel">
<button label="クリップボードã«ã‚³ãƒ”ー" name="copy_btn"/>
</panel>
<panel label="クレジット" name="credits_panel">
- <text_editor name="credits_editor">
- Second Life ã¯ã€Philip, Tessa, Andrew, Cory, Ian, James, Phoenix, Ryan, Haney, Dan, Char, Ben, John, Tanya, Eddie, Richard, Mitch, Doug, Eric, Frank, Bruce, Aaron, Peter, Alice, Charlie, Debra, Eileen, Helen, Janet, Steffan, Steve, Tom, Mark, Hunter, Xenon, Burgess, Bill, Jim, Lee, Hamlet, Daniel, Jeff, Todd, Sarah, Tim, Stephanie, Colin, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Jack, Vektor, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Jesse, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Yuko, Makiko, Thomas, Harry, Seth, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Brad, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, Beez, Milo, Hermia, Red, Thrax, Gulliver, Joe, Sally, Paul, Jose, Rejean, Dore, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, Dustin, George, Del, Matthew, Cat, Jacqui, Adrian, Viola, Alfred, Noel, Irfan, Yool, Rika, Jane, Frontier, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Jeremy, JP, Jake, Anthony, Maurice, Madhavi, Leopard, Kyle, Joon, Bert, Belinda, Jon, Kristi, Bridie, Pramod, Socrates, Maria, Aric, Adreanne, Jay, Kari, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Colossus, Zen, BigPapi, Pastrami, Kurz, Mani, Neuro, Mel, Sardonyx, MJ, Rowan, Sgt, Elvis, Samuel, Leo, Bryan, Niko, Austin, Soft, Poppy, Rachel, Aki, Banzai, Alexa, Sue, Bender, CG, Angelo, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Rothman, Niall, Marin, Allison, Katie, Dawn, Dusty, Katt, Judy, Andrea, Ambroff, Infinity, Rico, Gail, Kalpana, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Maestro, Simone, Yang, T, Shannon, Nelson, Khanh, Scott, Courtney, Charlene, Quixote, Susan, Zed, Amanda, Katelin, Enkidu, Roxie, Esbee, JoRoan, Scarlet, Tay, Kevin, Wolfgang, Johnny, Ray, Andren, Merov, Bob, Rand, Howard, Callen, Heff, Galen, Newell, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl, Ashley, JessieAnn, Huseby, Karina, Paris, Kurt, Rick, Lis, Kotler, Theeba, Lynx, Murphy, Doten, Taka, Norm, Jillian, Marcus, Mae, Novack, Esther, Perry, Dana, Ducot, Javier, Porter, Madison, Gecko, Dough, JR, Gisele, Crimp, Norie, Arch, Kimi, Fisher, Barbara, Jason, Peggy, Bernard, Jules, Leroy, Eva, Khederian, Campbell, Vogt, Masido, Karel, Torres, Lo, Breezer, Delby, Rountree, Anna, Servus, Rue, Itiaes, Chuck, Luna, Novella, Zaza, Wen, Gino, Lex, Cassandra, Limey, Nancy, Anukul, Silver, Brodesky, Jinsai, Squid, Gez, Rakesh, Ladan, Edelman, Marcet, Squire, Tatem, Tony, Jerm, Tia, Falcon, BK, Tiggs, Driscoll, Bacon, Timothee, Cru, Carmilla, Coyot, Webb, Kazu, Rudas, LJ, Sea, Ali Wallace, Bewest, Pup, Drub, Dragon, Inoshiro, Byron, Rhett, Xandix, Aimee, Fredrik, Thor, Teddy, Baron, Nelly, Ghengis, Epic, Eli, Stone, Grapes, Irie, Prep, Scobu, Valerie, Alain ãã®ä»–大勢ã®æ–¹ã€…ã«ã‚ˆã£ã¦æä¾›ã•ã‚Œã¦ã„ã¾ã™ã€‚
-
-ç¾åœ¨æœ€ã‚‚優れãŸãƒãƒ¼ã‚¸ãƒ§ãƒ³ã¨ãªã‚‹ã‚ˆã†ã”å”力ã„ãŸã ã„ãŸæ¬¡ã®ä½äººã®çš†æ§˜ã«æ·±ãæ„Ÿè¬ã„ãŸã—ã¾ã™ã€‚ Drew Dwi, Zai Lynch, Latif Khalifa, Ellla McMahon, Harleen Gretzky, Squirrel Wood, Malarthi Behemoth, Dante Tucker, Buckaroo Mu, Eddi Decosta, Dirk, Talamasca, Torben Trautman, Irene Muni, Aralara Rajal, Aura Dirval, Cayu Cluny, Eva Rau, FreeSL Aeon, Frontera Thor, Inma Rau, Lunita Savira, Minerva Memel, Polo Gufler, Xiki Luik, Lilly Zenovka, Vick Forcella, Sasy Scarborough, Gentle Welinder, Elric Anatine, Techwolf Lupindo, Dusan Writer, WolfPup Lowenhar, Marianne McCann, Fiachra Lach, Sitearm Madonna, Sudane Erato, Sahkolihaa Contepomi, Sachi Vixen, Questar Utu, Dimitrio Lewis, Matto Destiny, Scrim Pinion, Radio Signals, Psi Merlin, Pixel Gausman, Mel Vanbeeck, Laurent Bechir, Lamorna Proctor, Lares Carter, Gwyneth Llewelyn, Hydra Shaftoe, Holger Gilruth, Gentle Heron, Carla Broek, Boroondas Gupte, Fury Rosewood, Flower Ducatillon, Colpo Wexler, gwampa Lomu, Borg Capalini, Beansy Twine, Ardy Lay, , 45ms Zhong, Adeon Writer, Aeonix Aeon, Ai Austin, Aiko Ying, Alexandrea Fride, Alliez Mysterio, Annie Milestone, Annika Genezzia, Ansariel Hiller, ArminasX Saiman, Arya Braveheart, Asaeda Meltingdots, Asturkon Jua, Avallyn Oakleaf, Avatar Quinzet, BabyA Littlething, Bacchus Ireto, Bazaar, Riva, Benjamin Bigdipper, Beth Walcher, Bezilon Kasei, Biancaluce Robbiani, Bill Walach, blakopal Galicia, Blitzckreed Levenque, Bryn Oh, Callipygian Christensen, Cap Carver, Carr Arbenlow, Chantal Harvey, Charles Courtois, Charlie Sazaland, Cherry Cheevers, ChickyBabes Zuzu, Christopher Organiser, Ciaran Laval, Clara Young, Celierra Darling, Corinne Helendale, Corro Moseley, Coughdrop Littlething, Darien Caldwell, Dartagan Shepherd, Debs Regent, Decro Schmooz, Denim Kamachi, DiJodi Dubratt, Dil Spitz, Edgware Marker, Egehan Dryke, Emma Portilo, Emmie Fairymeadow, Evangelista Emerald, Faelon Swordthain, Frenchimmo Sabra, Gaberoonie Zanzibar, Ganymedes Costagravas, Gene Frostbite, GeneJ Composer, Giggles Littlebird, Grady Echegaray, Guni Greenstein, Gypsy Tripsa, Hackshaven Harford, Ham Rambler, Han Shuffle, Hanglow Short, Hatzfeld Runo, herina Bode, Horatio Freund, Hypatia Callisto, Hypatia Pickens, Identity Euler, Imnotgoing Sideways, Innula Zenovka, Iyoba Tarantal, Jack Abraham, Jagga Meredith, Jennifer Boyle, Jeremy Marquez, Jessica Qin, Jinx Nordberg, Jo Bernandes, Jocial Sonnenkern, Joel Savard, Jondan Lundquist, Josef Munster, Josette Windlow, Juilan Tripsa, Juro Kothari, Justin RiversRunRed, Kagehi Kohn, Kaimen Takahe, Keklily Longfall, Ken Lavender, Kestral Karas, Khisme Nitely, Kimar Coba, Kithrak Kirkorian, Kitty Barnett, Kolor Fall, Komiko Okamoto, Korvel Noh, Larry Pixel, Leal Choche, len Starship, Lenae Munz, Lexi Frua, Lillie Cordeaux, Lizzy Macarthur, LSL Scientist, Luban Yiyuan, Luc Starsider, Maccus McCullough, Madison Blanc, Maggie Darwin, Mallory Destiny, Manx Wharton, Marc Claridge, Marc2 Sands, Matthew Anthony, Maxim RiversRunRed, Medhue Simoni, Melinda Latynina, Mencius Watts, Michi Lumin, Midian Farspire, Miles Glaz, Mindy Mathy, Mitch Wagner, Mo Hax, Mourna Biziou, Nao Noe, naofan Teardrop, Naomah Beaumont, Nathiel Siamendes, Nber Medici, Neko Link, Netpat Igaly, Neutron Chesnokov, Newfie Pendragon, Nicholai Laviscu, Nick Rhodes, Nicoladie Gymnast, Ollie Kubrick, Orenj Marat, Orion Delphis, Oryx Tempel, Parvati Silverweb, PeterPunk Mooney, Pixel Scientist, Pounce Teazle, Professor Noarlunga, Quantum Destiny, Quicksilver Hermes, Ralf Setsuko, RAT Quan, RedMokum Bravin, Revolution Perenti, Rezit Sideways, Rich Grainger, Rosco Teardrop, Rose Evans, Rudee Voom, RufusTT Horsefly, Saii Hallard, SaintLEOlions Zimer, Samm Larkham, Satanello Miami, SexySteven Morrisey, Sheet Spotter, Shnurui Troughton, sicarius Thorne, Sicarius Toxx, Sini Nubalo, SLB Wirefly, snowy Sidran, Soupa Segura, ST Mensing, Starshine Halasy, Stickman Ingmann, Synystyr Texan, Takeda Terrawyng, Tali Rosca, Templar Merlin, Tezcatlipoca Bisiani, Tiel Stonecutter, Tony Kembia, TouchaHoney Perhaps, Trey Reanimator, TriloByte Zanzibar, Trinity Dechou, Trinity Dejavu, Unlikely Quintessa, UsikuFarasi Kanarik, Veritas Raymaker, Vex Streeter, Viaticus Speculaas, Villain Baroque, Vixie Durant, Void Singer, Watty Berkson, Westley Schridde, Westley Streeter, Whimsy Winx, Winter Ventura, Wundur Primbee, xstorm Radek, YongYong Francois, Zak Westminster, Zana Kohime, Zaren Alexander, Zeja Pyle, ZenMondo Wormser, Zoex Flanagan ãã®ä»–大勢ã®æ–¹ã€…。
-
-
-
-
-「努力ã¯ç¶šã。目標ã¯æŒç¶šã™ã‚‹ã€‚希望ã¯æ®‹ã•ã‚Œã¦ã„る。夢ã¯æ±ºã—ã¦æ¶ˆãˆãªã„。〠- エドワード・ケãƒãƒ‡ã‚£
+ <text name="linden_intro">
+ Second Life ã®æ供元: Lindens ã®ï¼š
+ </text>
+ <text_editor name="linden_names">
+ Philip, Andrew, Doug, Richard, Phoenix, Ian, Mark, Robin, Dan, Char, Ryan, Eric, Jim, Lee, Jeff, Michael, Kelly, Steve, Catherine, Bub, Ramzi, Jill, Jeska, Don, Kona, Callum, Charity, Jack, Shawn, babbage, James, Lauren, Blue, Brent, Reuben, Pathfinder, Jesse, Patsy, Torley, Bo, Cyn, Jonathan, Gia, Annette, Ginsu, Harry, Lex, Runitai, Guy, Cornelius, Beth, Swiss, Thumper, Wendy, Teeple, Seth, Dee, Mia, Sally, Liana, Aura, Beez, Milo, Red, Gulliver, Marius, Joe, Jose, Dore, Justin, Nora, Morpheus, Lexie, Amber, Chris, Xan, Leyla, Walker, Sabin, Joshua, Hiromi, Tofu, Fritz, June, Jean, Ivy, Dez, Ken, Betsy, Which, Spike, Rob, Zee, Dustin, George, Claudia, del, Matthew, jane, jay, Adrian, Yool, Rika, Yoz, siobhan, Qarl, Benjamin, Beast, Everett, madhavi, Christopher, Izzy, stephany, Jeremy, sean, adreanne, Pramod, Tobin, sejong, Iridium, maurice, kj, Meta, kari, JP, bert, kyle, Jon, Socrates, Bridie, Ivan, maria, Aric, Coco, Periapse, sandy, Storrs, Lotte, Colossus, Brad, Pastrami, Zen, BigPapi, Banzai, Sardonyx, Mani, Garry, Jaime, Neuro, Samuel, Niko, CeeLo, Austin, Soft, Poppy, emma, tessa, angelo, kurz, alexa, Sue, CG, Blake, Erica, Brett, Bevis, kristen, Q, simon, Enus, MJ, laurap, Kip, Scouse, Ron, Ram, kend, Marty, Prospero, melissa, kraft, Nat, Seraph, Hamilton, Lordan, Green, miz, Ashlei, Trinity, Ekim, Echo, Charlie, Rowan, Rome, Jt, Doris, benoc, Christy, Bao, Kate, Tj, Patch, Cheah, Johan, Brandy, Angela, Oreh, Cogsworth, Lan, Mitchell, Space, Bambers, Einstein, Bender, Malbers, Matias, Maggie, Rothman, Milton, Niall, Marin, Allison, Mango, Andrea, Katt, Yi, Ambroff, Rico, Raymond, Gail, Christa, William, Dawn, Usi, Dynamike, M, Corr, Dante, Molly, kaylee, Danica, Kelv, Lil, jacob, Nya, Rodney, elsie, Blondin, Grant, Nyx, Devin, Monty, Minerva, Keira, Katie, Jenn, Makai, Clare, Joy, Cody, Gayathri, FJ, spider, Oskar, Landon, Jarv, Noelle, Al, Doc, Gray, Vir, t, Maestro, Simone, Shannon, yang, Courtney, Scott, charlene, Quixote, Susan, Zed, Amanda, Katelin, Esbee, JoRoan, Enkidu, roxie, Scarlet, Merov, Kevin, Judy, Rand, Newell, Les, Dessie, Galen, Michon, Geo, Siz, Calyle, Pete, Praveen, Callen, Sheldon, Pink, Nelson, jenelle, Terrence, Nathan, Juan, Sascha, Huseby, Karina, Kaye, Kotler, Lis, Darv, Charrell, Dakota, Kimmora, Theeba, Taka, Mae, Perry, Ducot, dana, Esther, Dough, gisele, Doten, Viale, Fisher, jessieann, ashley, Torres, delby, rountree, kurt, Slaton, Madison, Rue, Gino, Wen, Casssandra, Brodesky, Squid, Gez, Rakesh, Gecko, Ladan, Tony, Tatem, Squire, Falcon, BK, Crimp, Tiggs, Bacon, Coyot, Carmilla, Webb, Sea, Arch, Jillian, Jason, Bernard, Vogt, Peggy, dragon, Pup, xandix, Wallace, Bewest, Inoshiro, Rhett, AG, Aimee, Ghengis, Itiaes, Eli, Steffan, Epic, Grapes, Stone, Prep, Scobu, Robert, Alain, Carla, Vicky, Tia, Alec, Taras, Lisa, Oz, Ariane, Log, House, Kazu, Kim, Drofnas, Tyler, Campbell, Michele, Madeline, Nelly, Baron, Thor, Lori, Hele, Fredrik, Teddy, Pixie, Berry, Gabrielle, Alfonso, Brooke, Wolf, Ringo, Cru, Charlar, Rodvik, Gibson, Elise, Bagman, Greger, Leonidas, Jerm, Leslie, CB, Brenda, Durian, Carlo, mm, Zeeshan, Caleb, Max, Elikak, Mercille, Steph, Chase
+ </text_editor>
+ <text name="contrib_intro">
+ オープンソースã®æ供:
+ </text>
+ <text_editor name="contrib_names">
+ Dummy Name ã¯å®Ÿè¡Œæ™‚é–“ã«ç½®ãæ›ãˆ
+ </text_editor>
+ <text name="trans_intro">
+ 翻訳会社:
+ </text>
+ <text_editor name="trans_names">
+ Dummy Name ã¯å®Ÿè¡Œæ™‚é–“ã«ç½®ãæ›ãˆ
</text_editor>
</panel>
<panel label="ライセンス" name="licenses_panel">
<text_editor name="credits_editor">
3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion
- APR Copyright (C) 2000-2004 The Apache Software Foundation
- cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)
- expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.
- FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org).
- GL Copyright (C) 1999-2004 Brian Paul.
- Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.
- jpeg2000 Copyright (C) 2001, David Taubman, The University of New South
- Wales (UNSW)
- jpeglib Copyright (C) 1991-1998, Thomas G. Lane.
- ogg/vorbis Copyright (C) 2001, Xiphophorus
- OpenSSL Copyright (C) 1998-2002 The OpenSSL Project.
- SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
- SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
- xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
- zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler.
- google-perftools Copyright (c) 2005, Google Inc.
-
- 無断転写ã€è¤‡è£½ã€è»¢è¼‰ã‚’ç¦ã˜ã¾ã™ã€‚ 詳細ã¯licenses.txtã‚’å‚ç…§ã—ã¦ãã ã•ã„。
+APR Copyright (C) 2000-2004 The Apache Software Foundation
+Collada DOM Copyright 2005 Sony Computer Entertainment Inc.
+cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)
+DBus/dbus-glib Copyright (C) 2002, 2003 CodeFactory AB / Copyright (C) 2003, 2004 Red Hat, Inc.
+expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.
+FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org).
+GL Copyright (C) 1999-2004 Brian Paul.
+GLOD Copyright (C) 2003-04 Jonathan Cohen, Nat Duca, Chris Niski, Johns Hopkins University and David Luebke, Brenden Schubert, University of Virginia.
+google-perftools Copyright (c) 2005, Google Inc.
+Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.
+jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)
+jpeglib Copyright (C) 1991-1998, Thomas G. Lane.
+ogg/vorbis Copyright (C) 2001, Xiphophorus
+OpenSSL Copyright (C) 1998-2002 The OpenSSL Project.
+PCRE Copyright (c) 1997-2008 University of Cambridge
+SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
+SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
+zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler.
+google-perftools Copyright (c) 2005, Google Inc.
+
+Second Life ビューワã§ã¯ Havok (TM) Physics ãŒä½¿ç”¨ã•ã‚Œã¦ã„ã¾ã™ã€‚(c)Copyright 1999-2010 Havok.com Inc. (and its Licensors).無断複写・複製・転載をç¦ã˜ã¾ã™ã€‚詳細ã«ã¤ã„ã¦ã¯ www.havok.com ã‚’ã”å‚ç…§ãã ã•ã„。
+
+ã“ã®ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã«ã¯ã€NVIDIA Corporation ã«ã‚ˆã‚‹ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ãŒå«ã¾ã‚Œã¾ã™ã€‚
+
+無断複写・複製・転載をç¦ã˜ã¾ã™ã€‚詳細ã«ã¤ã„ã¦ã¯ licenses.txt ã‚’ã”å‚ç…§ãã ã•ã„。
- Voice chat Audio coding: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
+ボイスãƒãƒ£ãƒƒãƒˆã®ã‚ªãƒ¼ãƒ‡ã‚£ã‚ªã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ï¼šPolycom(R) Siren14(TM) (ITU-T Rec.G.722.1 Annex C)
</text_editor>
</panel>
</tab_container>
diff --git a/indra/newview/skins/default/xui/ja/floater_about_land.xml b/indra/newview/skins/default/xui/ja/floater_about_land.xml
index 2de9e781d4..7c87bad5a3 100644
--- a/indra/newview/skins/default/xui/ja/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/ja/floater_about_land.xml
@@ -87,15 +87,9 @@
<text name="Owner:">
所有者:
</text>
- <text name="OwnerText">
- Leyla Linden
- </text>
<text name="Group:">
グループ:
</text>
- <text name="GroupText">
- Leyla Linden
- </text>
<button label="設定" label_selected="設定..." name="Set..."/>
<check_box label="グループã¸ã®è­²æ¸¡ã‚’許å¯" name="check deed" tool_tip="グループã®ã‚ªãƒ•ã‚£ã‚µãƒ¼ã¯ã“ã®åœŸåœ°ã‚’グループã«è­²æ¸¡ã§ãã¾ã™ã€‚グループã®åœŸåœ°å‰²ã‚Šå½“ã¦ã«ã‚ˆã£ã¦ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¾ã™ã€‚"/>
<button label="譲渡" label_selected="譲渡..." name="Deed..." tool_tip="é¸æŠžã—ãŸã‚°ãƒ«ãƒ¼ãƒ—ã®ã‚ªãƒ•ã‚£ã‚µãƒ¼ã®ã¿ã€åœŸåœ°ã‚’譲渡ã§ãã¾ã™ã€‚"/>
@@ -136,15 +130,15 @@
交通é‡:
</text>
<text name="DwellText">
- 誤
+ ローディング...
</text>
<button label="土地ã®è³¼å…¥" label_selected="土地を購入..." left="130" name="Buy Land..." width="100"/>
+ <button label="リンデンセール" label_selected="Linden セール..." name="Linden Sale..." tool_tip="土地ãŒæ‰€æœ‰ã•ã‚Œã¦ãŠã‚Šã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ãŒè¨­å®šã•ã‚Œã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚オークションã®å¯¾è±¡ã«ãªã£ã¦ã„ãªã„ã“ã¨ã‚‚å¿…è¦æ¡ä»¶ã§ã™ã€‚"/>
<button label="スクリプト情報" name="Scripts..." width="100"/>
<button label="グループã«è³¼å…¥" label_selected="グループ用ã«è³¼å…¥..." name="Buy For Group..."/>
<button label="入場許å¯ã‚’購入" label_selected="入場許å¯ã‚’購入..." left="130" name="Buy Pass..." tool_tip="ã“ã®åœŸåœ°ã¸ã®ä¸€æ™‚çš„ãªã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ã—ã¾ã™ã€‚" width="100"/>
<button label="土地ã®æ”¾æ£„" label_selected="土地を放棄..." name="Abandon Land..."/>
<button label="土地をå–り戻ã™" label_selected="土地ã®è¿”é‚„ã‚’è¦æ±‚..." name="Reclaim Land..."/>
- <button label="リンデンセール" label_selected="Linden セール..." name="Linden Sale..." tool_tip="土地ãŒæ‰€æœ‰ã•ã‚Œã¦ãŠã‚Šã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ãŒè¨­å®šã•ã‚Œã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚オークションã®å¯¾è±¡ã«ãªã£ã¦ã„ãªã„ã“ã¨ã‚‚å¿…è¦æ¡ä»¶ã§ã™ã€‚"/>
</panel>
<panel label="約款" name="land_covenant_panel">
<panel.string name="can_resell">
@@ -220,19 +214,19 @@
オブジェクトボーナス: [BONUS]
</text>
<text name="Simulator primitive usage:">
- プリム使用状æ³ï¼š
+ リージョン(地域)ã®è¨±å®¹æ•°ï¼š
</text>
<text name="objects_available">
[MAX] ã®å†… [COUNT] ([AVAILABLE] 利用å¯èƒ½ï¼‰
</text>
<text name="Primitives parcel supports:">
- 区画ã§ã‚µãƒãƒ¼ãƒˆã•ã‚Œã‚‹ãƒ—リム数:
+ 区画ã®è¨±å®¹æ•°ï¼š
</text>
<text name="object_contrib_text">
[COUNT]
</text>
<text name="Primitives on parcel:">
- 区画上ã®ãƒ—リム数:
+ 区画ã®è² è·ï¼š
</text>
<text name="total_objects_text">
[COUNT]
@@ -316,11 +310,16 @@
<panel.string name="push_restrict_region_text">
プッシュç¦æ­¢ (地域設定優先)
</panel.string>
+ <panel.string name="see_avs_text">
+ ä»–ã®åŒºç”»ã«ã„ã‚‹ã‚¢ãƒã‚¿ãƒ¼ã¯ã€
+ </panel.string>
<text name="allow_label">
ä»–ã®ä½äººã¸ã®è¨±å¯ï¼š
</text>
- <check_box label="地形を編集" name="edit land check" tool_tip="ãƒã‚§ãƒƒã‚¯ã‚’入れるã¨ã€ä»–人ãŒã‚ãªãŸã®åœŸåœ°ã®åœ°å½¢ç·¨é›†ã‚’è¡Œã†ã“ã¨ãŒå¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚ã“ã®ã‚ªãƒ—ションã®ãƒã‚§ãƒƒã‚¯ã‚’外ã—ã¦ãŠãã“ã¨ã‚’ãŠã™ã™ã‚ã—ã¾ã™ã€‚外ã—ãŸçŠ¶æ…‹ã§ã‚ãªãŸã®åœŸåœ°ã®åœ°å½¢ç·¨é›†ãŒå¯èƒ½ã§ã™ã€‚"/>
- <check_box label="飛行" name="check fly" tool_tip="ãƒã‚§ãƒƒã‚¯ã‚’入れるã¨ã“ã®åœŸåœ°ã§ã®é£›è¡ŒãŒå¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚ãƒã‚§ãƒƒã‚¯ã‚’外ã™ã¨åœŸåœ°ã«å…¥ã‚‹éš›ã¨é€šã‚ŠéŽãŽã‚‹ã¨ãã®ã¿é£›è¡Œå¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚"/>
+ <text name="allow_label0">
+ 飛行:
+ </text>
+ <check_box label="全員" name="check fly" tool_tip="ãƒã‚§ãƒƒã‚¯ã‚’入れるã¨ã“ã®åœŸåœ°ã§ã®é£›è¡ŒãŒå¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚ãƒã‚§ãƒƒã‚¯ã‚’外ã™ã¨åœŸåœ°ã«å…¥ã‚‹éš›ã¨é€šã‚ŠéŽãŽã‚‹ã¨ãã®ã¿é£›è¡Œå¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚"/>
<text name="allow_label2">
制作:
</text>
@@ -336,9 +335,6 @@
</text>
<check_box label="全員" name="check other scripts"/>
<check_box label="グループ" name="check group scripts"/>
- <text name="land_options_label">
- 土地オプション:
- </text>
<check_box label="安全(ダメージãªã—)" name="check safe" tool_tip="ãƒã‚§ãƒƒã‚¯ã‚’入れるã¨ã“ã®åœŸåœ°ã§ã®ãƒ€ãƒ¡ãƒ¼ã‚¸ã‚³ãƒ³ãƒãƒƒãƒˆãŒç„¡åŠ¹ã«ãªã‚Šã€ã€Œå®‰å…¨ã€ã«è¨­å®šã•ã‚Œã¾ã™ã€‚ ãƒã‚§ãƒƒã‚¯ã‚’外ã™ã¨ãƒ€ãƒ¡ãƒ¼ã‚¸ã‚³ãƒ³ãƒãƒƒãƒˆãŒæœ‰åŠ¹ã«ãªã‚Šã¾ã™ã€‚"/>
<check_box label="プッシュç¦æ­¢" name="PushRestrictCheck" tool_tip="スクリプトã«ã‚ˆã‚‹ãƒ—ッシュをç¦æ­¢ã—ã¾ã™ã€‚ ã“ã®ã‚ªãƒ—ションをé¸æŠžã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šã€ã‚ãªãŸã®åœŸåœ°ã§ã®ç ´å£Šçš„行動を防ãã“ã¨ãŒã§ãã¾ã™ã€‚"/>
<check_box label="検索ã«åŒºç”»ã‚’表示(週 L$ 30)" name="ShowDirectoryCheck" tool_tip="ã“ã®åŒºç”»ã‚’検索çµæžœã«è¡¨ç¤ºã—ã¾ã™"/>
@@ -355,6 +351,7 @@
<combo_box.item label="公園ã¨è‡ªç„¶" name="item9"/>
<combo_box.item label="ä½å®…用" name="item10"/>
<combo_box.item label="ショッピング" name="item11"/>
+ <combo_box.item label="レンタル" name="item13"/>
<combo_box.item label="ãã®ä»–" name="item12"/>
</combo_box>
<combo_box name="land category">
@@ -369,6 +366,7 @@
<combo_box.item label="公園ã¨è‡ªç„¶" name="item9"/>
<combo_box.item label="ä½å®…用" name="item10"/>
<combo_box.item label="ショッピング" name="item11"/>
+ <combo_box.item label="レンタル" name="item13"/>
<combo_box.item label="ãã®ä»–" name="item12"/>
</combo_box>
<check_box label="「Moderateã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„" name="MatureCheck" tool_tip=""/>
@@ -376,6 +374,10 @@
スナップショット:
</text>
<texture_picker label="" name="snapshot_ctrl" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
+ <text name="allow_label5">
+ ä»–ã®åŒºç”»ã«ã„ã‚‹ã‚¢ãƒã‚¿ãƒ¼ãŒã“ã®åŒºç”»ã«ã„ã‚‹ã‚¢ãƒã‚¿ãƒ¼ã«ä¼šã£ã¦ãƒãƒ£ãƒƒãƒˆã§ãã‚‹
+ </text>
+ <check_box label="ã‚¢ãƒã‚¿ãƒ¼ã‚’表示" name="SeeAvatarsCheck" tool_tip="ä»–ã®åŒºç”»ã®ã‚¢ãƒã‚¿ãƒ¼ãŒã€ã“ã®åŒºç”»ã«ã„ã‚‹ã‚¢ãƒã‚¿ãƒ¼ã«ä¼šã£ã¦ãƒãƒ£ãƒƒãƒˆã™ã‚‹ã“ã¨ã‚’許å¯ã—ã€ã‚ãªãŸã‚‚ãれらアãƒã‚¿ãƒ¼ã«ä¼šã£ã¦ãƒãƒ£ãƒƒãƒˆã§ãるよã†ã«ã—ã¾ã™ã€‚"/>
<text name="landing_point">
ç€åœ°ç‚¹: [LANDING]
</text>
@@ -399,7 +401,6 @@
ホームページ:
</text>
<button label="設定" name="set_media_url"/>
- <check_box label="URL ã‚’éžè¡¨ç¤º" name="hide_media_url" tool_tip="ã“ã®ã‚ªãƒ—ションをオンã«ã™ã‚‹ã¨ã€è¨±å¯ãªã—ã§ã“ã®åŒºç”»æƒ…å ±ã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ã„るユーザーã«ã¯ãƒ¡ãƒ‡ã‚£ã‚¢ URL ãŒè¡¨ç¤ºã•ã‚Œã¾ã›ã‚“。 ã“れ㯠HTML タイプã«ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“ã®ã§ã”注æ„ãã ã•ã„。"/>
<text name="Description:">
説明:
</text>
@@ -429,11 +430,15 @@
<text name="MusicURL:">
音楽 URL:
</text>
- <check_box label="URL ã‚’éžè¡¨ç¤ºã«ã™ã‚‹" name="hide_music_url" tool_tip="ã“ã®ã‚ªãƒ—ションã«ãƒã‚§ãƒƒã‚¯ã‚’入れるã¨ã€æ¨©é™ã®ãªã„人ãŒåŒºç”»æƒ…報を見ãŸã¨ãã«éŸ³æ¥½ã® URL ãŒéš ã‚Œã¾ã™ã€‚"/>
<text name="Sound:">
サウンド:
</text>
<check_box label="ジェスãƒãƒ£ãƒ¼ã¨ã‚ªãƒ–ジェクトã®éŸ³ã‚’ã“ã®åŒºç”»ã ã‘ã«é™å®šã™ã‚‹" name="check sound local"/>
+ <text name="Avatar Sounds:">
+ ã‚¢ãƒã‚¿ãƒ¼ã®ã‚µã‚¦ãƒ³ãƒ‰ï¼š
+ </text>
+ <check_box label="全員" name="all av sound check"/>
+ <check_box label="グループ" name="group av sound check"/>
<text name="Voice settings:">
ボイス:
</text>
@@ -446,7 +451,7 @@
(エステートã«é™å®šï¼‰
</panel.string>
<panel.string name="allow_public_access">
- ãƒ‘ãƒ–ãƒªãƒƒã‚¯ã‚¢ã‚¯ã‚»ã‚¹ã‚’è¨±å¯ ï¼ˆ[MATURITY])
+ ãƒ‘ãƒ–ãƒªãƒƒã‚¯ã‚¢ã‚¯ã‚»ã‚¹ã‚’è¨±å¯ ï¼ˆ[MATURITY])(注æ„:ã“ã®ã‚ªãƒ—ションをオフã«ã™ã‚‹ã¨ç«‹å…¥ç¦æ­¢ãƒ©ã‚¤ãƒ³ãŒä½œæˆã•ã‚Œã¾ã™ï¼‰
</panel.string>
<panel.string name="estate_override">
1 ã¤ä»¥ä¸Šã®ã‚ªãƒ—ションãŒã€ä¸å‹•ç”£ãƒ¬ãƒ™ãƒ«ã§è¨­å®šã•ã‚Œã¦ã„ã¾ã™ã€‚
@@ -454,12 +459,12 @@
<text name="Limit access to this parcel to:">
ã“ã®åŒºç”»ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹
</text>
- <check_box label="パブリックアクセスを許å¯ã™ã‚‹ [MATURITY]" name="public_access"/>
+ <check_box label="パブリックアクセスを許å¯ï¼ˆã“ã®ã‚ªãƒ—ションをオフã«ã™ã‚‹ã¨ç«‹å…¥ç¦æ­¢ãƒ©ã‚¤ãƒ³ãŒä½œæˆã•ã‚Œã¾ã™ï¼‰" name="public_access"/>
<text name="Only Allow">
- 次ã®ä½äººã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ï¼š
+ 次ã®ä½äººã«ã®ã¿ã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ï¼š
</text>
- <check_box label="支払情報登録済 [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="未確èªã®ä½äººã®ç«‹å…¥ã‚’ç¦æ­¢ã—ã¾ã™ã€‚"/>
- <check_box label="å¹´é½¢ç¢ºèª [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="年齢確èªã‚’済ã¾ã›ã¦ã„ãªã„ä½äººã®ç«‹å…¥ã‚’ç¦æ­¢ã—ã¾ã™ã€‚ 詳ã—ã„情報㯠[SUPPORT_SITE] ã‚’ã”覧下ã•ã„。"/>
+ <check_box label="支払情情報ãŒç™»éŒ²ã•ã‚Œã¦ã„ã‚‹ [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="支払情報ãŒç™»éŒ²ã•ã‚Œã¦ã„ãªã„ã¨ã€ã“ã®åŒºç”»ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。詳細ã«ã¤ã„ã¦ã¯ã€[SUPPORT_SITE] ã‚’ã”覧ãã ã•ã„。"/>
+ <check_box label="年齢確èªãŒæ¸ˆã‚“ã§ã„ã‚‹ [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="ã“ã®åŒºç”»ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã«ã¯ã€å¹´é½¢ç¢ºèªã‚’済ã¾ã›ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚詳細ã«ã¤ã„ã¦ã¯ã€[SUPPORT_SITE] ã‚’ã”覧ãã ã•ã„。"/>
<check_box label="グループã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ï¼š[GROUP]" name="GroupCheck" tool_tip="「一般ã€ã‚¿ãƒ–ã§ã€ã‚°ãƒ«ãƒ¼ãƒ—ã‚’é¸æŠžã—ã¦ãã ã•ã„。"/>
<check_box label="入場許å¯ã‚’販売:" name="PassCheck" tool_tip="ã“ã®åŒºç”»ã¸ã®ä¸€æ™‚çš„ãªã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ã—ã¾ã™ã€‚"/>
<combo_box name="pass_combo">
diff --git a/indra/newview/skins/default/xui/ja/floater_animation_anim_preview.xml b/indra/newview/skins/default/xui/ja/floater_animation_anim_preview.xml
new file mode 100644
index 0000000000..2bada303ae
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_animation_anim_preview.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Anim Preview" title="ANIMATION.ANIM">
+ <text name="name_label">
+ åå‰ï¼š
+ </text>
+ <text name="description_label">
+ 説明:
+ </text>
+ <button label="アップロード(L$[AMOUNT])" name="ok_btn"/>
+ <button label="å–り消ã—" label_selected="å–り消ã—" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_animation_bvh_preview.xml b/indra/newview/skins/default/xui/ja/floater_animation_bvh_preview.xml
new file mode 100644
index 0000000000..f74bab3598
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_animation_bvh_preview.xml
@@ -0,0 +1,186 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Animation Preview">
+ <floater.string name="failed_to_initialize">
+ å‹•ãã‚’åˆæœŸåŒ–ã§ãã¾ã›ã‚“ã§ã—ãŸ
+ </floater.string>
+ <floater.string name="anim_too_long">
+ アニメーションファイルã®é•·ã•ã¯ [LENGTH] 秒ã§ã™ã€‚
+
+アニメーションã®æœ€å¤§é•·ã¯ [MAX_LENGTH] 秒ã§ã™ã€‚
+ </floater.string>
+ <floater.string name="failed_file_read">
+ アニメーションファイルを読ã¿å–ã‚Œã¾ã›ã‚“。
+
+[STATUS]
+ </floater.string>
+ <floater.string name="E_ST_OK">
+ Ok
+ </floater.string>
+ <floater.string name="E_ST_EOF">
+ ファイルã®çµ‚端ãŒä¸å®Œå…¨ã§ã™ã€‚
+ </floater.string>
+ <floater.string name="E_ST_NO_CONSTRAINT">
+ 制約定義を読ã¿å–ã‚Œã¾ã›ã‚“。
+ </floater.string>
+ <floater.string name="E_ST_NO_FILE">
+ BVH ファイルを開ã‘ã¾ã›ã‚“。
+ </floater.string>
+ <floater.string name="E_ST_NO_HIER">
+ HIERARCHY ヘッダーãŒç„¡åŠ¹ã§ã™ã€‚
+ </floater.string>
+ <floater.string name="E_ST_NO_JOINT">
+ ROOT ã¾ãŸã¯ JOINT ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。
+ </floater.string>
+ <floater.string name="E_ST_NO_NAME">
+ JOINT åã‚’å–å¾—ã§ãã¾ã›ã‚“。
+ </floater.string>
+ <floater.string name="E_ST_NO_OFFSET">
+ OFFSET ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。
+ </floater.string>
+ <floater.string name="E_ST_NO_CHANNELS">
+ CHANNELS ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。
+ </floater.string>
+ <floater.string name="E_ST_NO_ROTATION">
+ 回転順åºã‚’å–å¾—ã§ãã¾ã›ã‚“。
+ </floater.string>
+ <floater.string name="E_ST_NO_AXIS">
+ 回転軸をå–å¾—ã§ãã¾ã›ã‚“。
+ </floater.string>
+ <floater.string name="E_ST_NO_MOTION">
+ MOTION ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。
+ </floater.string>
+ <floater.string name="E_ST_NO_FRAMES">
+ フレーム数をå–å¾—ã§ãã¾ã›ã‚“。
+ </floater.string>
+ <floater.string name="E_ST_NO_FRAME_TIME">
+ フレーム時間をå–å¾—ã§ãã¾ã›ã‚“。
+ </floater.string>
+ <floater.string name="E_ST_NO_POS">
+ ä½ç½®ã®å€¤ã‚’å–å¾—ã§ãã¾ã›ã‚“。
+ </floater.string>
+ <floater.string name="E_ST_NO_ROT">
+ 回転値をå–å¾—ã§ãã¾ã›ã‚“。
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_FILE">
+ 変æ›ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é–‹ã‘ã¾ã›ã‚“。
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_HEADER">
+ 変æ›ãƒ˜ãƒƒãƒ€ãƒ¼ã‚’読ã¿å–ã‚Œã¾ã›ã‚“。
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_NAME">
+ 変æ›åを読ã¿å–ã‚Œã¾ã›ã‚“。
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_IGNORE">
+ 変æ›ç„¡è¦–値を読ã¿å–ã‚Œã¾ã›ã‚“。
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_RELATIVE">
+ 変æ›ç›¸å¯¾å€¤ã‚’読ã¿å–ã‚Œã¾ã›ã‚“。
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_OUTNAME">
+ å¤‰æ› outname 値を読ã¿å–ã‚Œã¾ã›ã‚“。
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MATRIX">
+ 変æ›è¡Œåˆ—を読ã¿å–ã‚Œã¾ã›ã‚“。
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MERGECHILD">
+ Mergechild åã‚’å–å¾—ã§ãã¾ã›ã‚“。
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MERGEPARENT">
+ Mergeparent åã‚’å–å¾—ã§ãã¾ã›ã‚“。
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_PRIORITY">
+ priority 値をå–å¾—ã§ãã¾ã›ã‚“。
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_LOOP">
+ loop 値をå–å¾—ã§ãã¾ã›ã‚“。
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EASEIN">
+ easeln 値をå–å¾—ã§ãã¾ã›ã‚“。
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EASEOUT">
+ easeOut 値をå–å¾—ã§ãã¾ã›ã‚“。
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_HAND">
+ Hand morph 値をå–å¾—ã§ãã¾ã›ã‚“。
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EMOTE">
+ emote åを読ã¿ã¨ã‚Œã¾ã›ã‚“。
+ </floater.string>
+ <floater.string name="E_ST_BAD_ROOT">
+ ルートジョイントåãŒä¸æ­£ã§ã™ã€‚「hipã€ã‚’使用ã—ã¦ãã ã•ã„。
+ </floater.string>
+ <text name="name_label">
+ åå‰ï¼š
+ </text>
+ <text name="description_label">
+ 説明:
+ </text>
+ <spinner label="優先度" name="priority" tool_tip="ã“ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã§ã©ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’上書ãã§ãã‚‹ã‹ã‚’決ã‚ã¾ã™"/>
+ <check_box label="ループ" name="loop_check" tool_tip="ã“ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’ループå†ç”Ÿã«ã—ã¾ã™"/>
+ <spinner label="イン(%)" name="loop_in_point" tool_tip="アニメーションã®ãƒ«ãƒ¼ãƒ—復帰点を設定ã—ã¾ã™"/>
+ <spinner label="アウト(%)" name="loop_out_point" tool_tip="アニメーションã®ãƒ«ãƒ¼ãƒ—終了点を設定ã—ã¾ã™"/>
+ <text name="hand_label">
+ 手ã®ãƒãƒ¼ã‚º
+ </text>
+ <combo_box name="hand_pose_combo" tool_tip="アニメーションå†ç”Ÿä¸­ã®æ‰‹ã®å‹•ãを決ã‚ã¾ã™">
+ <combo_box.item label="広ã’ã‚‹" name="Spread"/>
+ <combo_box.item label="リラックス" name="Relaxed"/>
+ <combo_box.item label="指を指ã™ãƒ»ä¸¡æ‰‹" name="PointBoth"/>
+ <combo_box.item label="拳" name="Fist"/>
+ <combo_box.item label="リラックス・左" name="RelaxedLeft"/>
+ <combo_box.item label="指を指ã™ãƒ»å·¦" name="PointLeft"/>
+ <combo_box.item label="拳を上ã’る・左" name="FistLeft"/>
+ <combo_box.item label="リラックス・å³" name="RelaxedRight"/>
+ <combo_box.item label="指を指ã™ãƒ»å³" name="PointRight"/>
+ <combo_box.item label="拳を上ã’る・å³" name="FistRight"/>
+ <combo_box.item label="敬礼・å³" name="SaluteRight"/>
+ <combo_box.item label="タイピング" name="Typing"/>
+ <combo_box.item label="ピース・å³" name="PeaceRight"/>
+ </combo_box>
+ <text name="emote_label">
+ 表情
+ </text>
+ <combo_box name="emote_combo" tool_tip="アニメーションå†ç”Ÿä¸­ã®é¡”ã®è¡¨æƒ…を決ã‚ã¾ã™">
+ <item label="(ãªã—)" name="[None]" value=""/>
+ <item label="アーーーーー" name="Aaaaah" value="アーーーーー"/>
+ <item label="æれる" name="Afraid" value="æれる"/>
+ <item label="怒る" name="Angry" value="怒る"/>
+ <item label="満é¢ã®ç¬‘ã¿" name="BigSmile" value="満é¢ã®ç¬‘ã¿"/>
+ <item label="退屈" name="Bored" value="退屈"/>
+ <item label="æ³£ã" name="Cry" value="æ³£ã"/>
+ <item label="軽蔑" name="Disdain" value="軽蔑"/>
+ <item label="æ¥ãšã‹ã—ãŒã‚‹" name="Embarrassed" value="æ¥ãšã‹ã—ãŒã‚‹"/>
+ <item label="ã—ã‹ã‚ã£é¢" name="Frown" value="ã—ã‹ã‚ã£é¢"/>
+ <item label="キス" name="Kiss" value="キス"/>
+ <item label="笑ã†" name="Laugh" value="笑ã†"/>
+ <item label="ã‚€ã‹ã¤ã" name="Plllppt" value="ã‚€ã‹ã¤ã"/>
+ <item label="嫌悪感" name="Repulsed" value="嫌悪感"/>
+ <item label="悲ã—ã„" name="Sad" value="悲ã—ã„"/>
+ <item label="è‚©ã‚’ã™ãã‚ã‚‹" name="Shrug" value="è‚©ã‚’ã™ãã‚ã‚‹"/>
+ <item label="微笑む" name="Smile" value="微笑む"/>
+ <item label="é©šã" name="Surprise" value="é©šã"/>
+ <item label="ウィンク" name="Wink" value="ウィンク"/>
+ <item label="心é…ã™ã‚‹" name="Worry" value="心é…ã™ã‚‹"/>
+ </combo_box>
+ <text name="preview_label">
+ プレビュー中ã®å‹•ä½œ
+ </text>
+ <combo_box name="preview_base_anim" tool_tip="ã“れを使用ã—ã¦ã€ã‚¢ãƒã‚¿ãƒ¼ãŒä¸€èˆ¬çš„ãªã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã‚’実行ã—ã¦ã„ã‚‹é–“ã«ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã®å‹•ä½œã‚’テストã—ã¾ã™ã€‚">
+ <item label="ç«‹ã¤" name="Standing" value="ç«‹ã¤"/>
+ <item label="æ­©ã" name="Walking" value="æ­©ã"/>
+ <item label="座る" name="Sitting" value="座る"/>
+ <item label="飛ã¶" name="Flying" value="飛ã¶"/>
+ </combo_box>
+ <spinner label="イーズイン(秒)" name="ease_in_time" tool_tip="アニメーションã®ãƒ–レンドイン時間(秒)"/>
+ <spinner label="イーズアウト(秒)" name="ease_out_time" tool_tip="アニメーションã®ãƒ–レンドアウト時間(秒)"/>
+ <button name="play_btn" tool_tip="アニメーションをå†ç”Ÿã™ã‚‹"/>
+ <button name="pause_btn" tool_tip="アニメーションを一時åœæ­¢ã™ã‚‹"/>
+ <button name="stop_btn" tool_tip="アニメーションã®å†ç”Ÿã‚’åœæ­¢ã™ã‚‹"/>
+ <text name="bad_animation_text">
+ アニメーションファイルを読ã¿å–ã‚Œã¾ã›ã‚“。
+
+Poser 4 ã‹ã‚‰ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã—㟠BVH ファイルをãŠå‹§ã‚ã—ã¾ã™ã€‚
+ </text>
+ <button label="アップロード(L$[AMOUNT])" name="ok_btn"/>
+ <button label="å–り消ã—" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_avatar.xml b/indra/newview/skins/default/xui/ja/floater_avatar.xml
new file mode 100644
index 0000000000..d289580506
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_avatar.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Avatar" title="ã‚¢ãƒã‚¿ãƒ¼ã‚’é¸æŠž"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_avatar_picker.xml b/indra/newview/skins/default/xui/ja/floater_avatar_picker.xml
index 7f965e490d..4bd6b4e053 100644
--- a/indra/newview/skins/default/xui/ja/floater_avatar_picker.xml
+++ b/indra/newview/skins/default/xui/ja/floater_avatar_picker.xml
@@ -24,6 +24,10 @@
åå‰ã®ä¸€éƒ¨ã‚’入力:
</text>
<button label="検索" label_selected="検索" name="Find"/>
+ <scroll_list name="SearchResults">
+ <columns label="åå‰" name="name"/>
+ <columns label="ユーザーå" name="username"/>
+ </scroll_list>
</panel>
<panel label="フレンド" name="FriendsPanel">
<text name="InstructSelectFriend">
@@ -39,6 +43,10 @@
メートル
</text>
<button label="リスト更新" label_selected="リスト更新" name="Refresh"/>
+ <scroll_list name="NearMe">
+ <columns label="åå‰" name="name"/>
+ <columns label="ユーザーå" name="username"/>
+ </scroll_list>
</panel>
</tab_container>
<button label="OK" label_selected="OK" name="ok_btn"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_beacons.xml b/indra/newview/skins/default/xui/ja/floater_beacons.xml
index d2f4798949..a55698e3d0 100644
--- a/indra/newview/skins/default/xui/ja/floater_beacons.xml
+++ b/indra/newview/skins/default/xui/ja/floater_beacons.xml
@@ -17,5 +17,6 @@
<check_box label="触れる" name="touch_only"/>
<check_box label="音æº" name="sounds"/>
<check_box label="パーティクルæº" name="particles"/>
+ <check_box label="メディアæº" name="moapbeacon"/>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_build_options.xml b/indra/newview/skins/default/xui/ja/floater_build_options.xml
index 8cb67ca521..6865409e7a 100644
--- a/indra/newview/skins/default/xui/ja/floater_build_options.xml
+++ b/indra/newview/skins/default/xui/ja/floater_build_options.xml
@@ -1,7 +1,30 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="build options floater" title="グリッドオプション">
- <spinner label="グリッドå˜ä½ï¼ˆãƒ¡ãƒ¼ãƒˆãƒ«ï¼‰" name="GridResolution"/>
- <spinner label="グリッド゙範囲(メートル)" name="GridDrawSize"/>
+ <floater.string name="grid_screen_text">
+ ç”»é¢
+ </floater.string>
+ <floater.string name="grid_local_text">
+ ローカル
+ </floater.string>
+ <floater.string name="grid_world_text">
+ 世界
+ </floater.string>
+ <floater.string name="grid_reference_text">
+ リファレンス
+ </floater.string>
+ <floater.string name="grid_attachment_text">
+ アタッãƒãƒ¡ãƒ³ãƒˆ
+ </floater.string>
+ <text name="grid_mode_label" tool_tip="グリッドã®ä¸é€æ˜Žåº¦">
+ モード
+ </text>
+ <combo_box name="combobox grid mode" tool_tip="オブジェクトã®é…ç½®ã«ä½¿ã†ã‚°ãƒªãƒƒãƒ‰ãƒ«ãƒ¼ãƒ©ã‚’é¸æŠž">
+ <combo_box.item label="インワールドグリッド" name="World"/>
+ <combo_box.item label="ローカルグリッド" name="Local"/>
+ <combo_box.item label="リファレンスグリッド" name="Reference"/>
+ </combo_box>
+ <spinner label="å˜ä½ï¼ˆãƒ¡ãƒ¼ãƒˆãƒ«ï¼‰" name="GridResolution"/>
+ <spinner label="範囲(メートル)" name="GridDrawSize"/>
<check_box label="より細ã‹ã„å˜ä½ã§ã‚¹ãƒŠãƒƒãƒ—フィット" name="GridSubUnit"/>
<check_box label="横断é¢ã‚’表示" name="GridCrossSection"/>
<text name="grid_opacity_label" tool_tip="グリッドã®ä¸é€æ˜Žåº¦">
diff --git a/indra/newview/skins/default/xui/ja/floater_bumps.xml b/indra/newview/skins/default/xui/ja/floater_bumps.xml
index c7e4dd348f..fd12a9e69a 100644
--- a/indra/newview/skins/default/xui/ja/floater_bumps.xml
+++ b/indra/newview/skins/default/xui/ja/floater_bumps.xml
@@ -4,19 +4,19 @@
検出ãªã—
</floater.string>
<floater.string name="bump">
- [TIME] [NAME]ãŒã€ã‚ãªãŸã«ã¶ã¤ã‹ã‚Šã¾ã—ãŸã€‚
+ [TIME] [NAME] ãŒã‚ãªãŸã«è¡çªã—ã¾ã—ãŸ
</floater.string>
<floater.string name="llpushobject">
- [TIME] [NAME]ãŒã€ã‚¹ã‚¯ãƒªãƒ—トã§ã‚ãªãŸã‚’プッシュã—ã¾ã—ãŸã€‚
+ [TIME] [NAME] ãŒã‚¹ã‚¯ãƒªãƒ—トã§ã‚ãªãŸã‚’押ã—ã¾ã—ãŸ
</floater.string>
<floater.string name="selected_object_collide">
- [TIME] [NAME]ãŒã€ã‚ªãƒ–ジェクトをã‚ãªãŸã«å½“ã¦ã¾ã—ãŸã€‚
+ [TIME] [NAME] ãŒã‚ªãƒ–ジェクトã§ã‚ãªãŸã‚’ãŸãŸãã¾ã—ãŸ
</floater.string>
<floater.string name="scripted_object_collide">
- [TIME] [NAME]ãŒã€ã‚¹ã‚¯ãƒªãƒ—ト・オブジェクトをã‚ãªãŸã«å½“ã¦ã¾ã—ãŸã€‚
+ [TIME] [NAME] ãŒã‚¹ã‚¯ãƒªãƒ—トã®ã‚ªãƒ–ジェクトã§ã‚ãªãŸã‚’ãŸãŸãã¾ã—ãŸ
</floater.string>
<floater.string name="physical_object_collide">
- [TIME] [NAME]ãŒã€ç‰©ç†ã‚ªãƒ–ジェクトをã‚ãªãŸã«å½“ã¦ã¾ã—ãŸã€‚
+ [TIME] [NAME] ãŒç‰©ç†çš„オブジェクトã§ã‚ãªãŸã‚’ãŸãŸãã¾ã—ãŸ
</floater.string>
<floater.string name="timeStr">
[[hour,datetime,slt]:[min,datetime,slt]]
diff --git a/indra/newview/skins/default/xui/ja/floater_buy_contents.xml b/indra/newview/skins/default/xui/ja/floater_buy_contents.xml
index ed17736eb3..7e4932c78f 100644
--- a/indra/newview/skins/default/xui/ja/floater_buy_contents.xml
+++ b/indra/newview/skins/default/xui/ja/floater_buy_contents.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater min_width="340" name="floater_buy_contents" title="中身ã®è³¼å…¥" width="340">
<text name="contains_text" width="320">
- [NAME] ã®ä¸­èº«ï¼š
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; ã«å«ã¾ã‚Œã‚‹ã‚‚ã®ï¼š
</text>
<scroll_list name="item_list" width="310"/>
<text name="buy_text" width="320">
diff --git a/indra/newview/skins/default/xui/ja/floater_buy_currency.xml b/indra/newview/skins/default/xui/ja/floater_buy_currency.xml
index 22af6e0ea2..a472f163e3 100644
--- a/indra/newview/skins/default/xui/ja/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/ja/floater_buy_currency.xml
@@ -46,7 +46,7 @@
L$ [AMT]
</text>
<text name="currency_links">
- [http://www.secondlife.com/my/account/payment_method_management.php?lang=ja-JP 支払方法] | [http://www.secondlife.com/my/account/currency.php?lang=ja-JP 通貨] | [http://www.secondlife.com/my/account/exchange_rates.php?lang=ja-JP æ›ç®—レート]
+ [http://www.secondlife.com/my/account/payment_method_management.php 支払方法] | [http://www.secondlife.com/my/account/currency.php 通貨]
</text>
<text name="exchange_rate_note">
金é¡ã‚’å†å…¥åŠ›ã—ã¦æœ€æ–°æ›ç®—レートを確èªã—ã¾ã™ã€‚
diff --git a/indra/newview/skins/default/xui/ja/floater_buy_object.xml b/indra/newview/skins/default/xui/ja/floater_buy_object.xml
index f323263699..ce269df6da 100644
--- a/indra/newview/skins/default/xui/ja/floater_buy_object.xml
+++ b/indra/newview/skins/default/xui/ja/floater_buy_object.xml
@@ -1,26 +1,29 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="contents" title="オブジェクトã®ã‚³ãƒ”ーを購入">
- <text name="contents_text">
- 中身:
- </text>
- <text name="buy_text">
- [NAME] ã‹ã‚‰ L$[AMOUNT] ã§è³¼å…¥ã—ã¾ã™ã‹ï¼Ÿ
- </text>
- <button label="å–消" label_selected="å–消" name="cancel_btn"/>
- <button label="購入" label_selected="購入" name="buy_btn"/>
- <text name="title_buy_text">
+ <floater.string name="title_buy_text">
購入
- </text>
- <string name="title_buy_copy_text">
+ </floater.string>
+ <floater.string name="title_buy_copy_text">
次ã®ã‚‚ã®ã‚’購入
- </string>
- <text name="no_copy_text">
+ </floater.string>
+ <floater.string name="no_copy_text">
(コピーä¸å¯ï¼‰
- </text>
- <text name="no_modify_text">
+ </floater.string>
+ <floater.string name="no_modify_text">
(修正ä¸å¯ï¼‰
- </text>
- <text name="no_transfer_text">
+ </floater.string>
+ <floater.string name="no_transfer_text">
(å†è²©ãƒ»ãƒ—レゼントä¸å¯ï¼‰
+ </floater.string>
+ <text name="contents_text">
+ 中身:
+ </text>
+ <text name="buy_text">
+ 次ã®å£²ã‚Šæ‰‹ã‹ã‚‰ L$[AMOUNT] ã§è³¼å…¥ï¼š
+ </text>
+ <text name="buy_name_text">
+ [NAME]?
</text>
+ <button label="購入" label_selected="購入" name="buy_btn"/>
+ <button label="å–消" label_selected="å–消" name="cancel_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_camera.xml b/indra/newview/skins/default/xui/ja/floater_camera.xml
index 71a20c8e18..982e5ce42b 100644
--- a/indra/newview/skins/default/xui/ja/floater_camera.xml
+++ b/indra/newview/skins/default/xui/ja/floater_camera.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="camera_floater">
+<floater name="camera_floater" title="カメラã®ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«">
<floater.string name="rotate_tooltip">
フォーカスを中心ã«ã‚«ãƒ¡ãƒ©ã‚’回転
</floater.string>
@@ -9,15 +9,6 @@
<floater.string name="move_tooltip">
カメラを上下左å³ã«ç§»å‹•
</floater.string>
- <floater.string name="camera_modes_title">
- カメラモード
- </floater.string>
- <floater.string name="pan_mode_title">
- 旋回 - ズーム - 水平・垂直移動
- </floater.string>
- <floater.string name="presets_mode_title">
- 事å‰è¨­å®šã®è¦–野
- </floater.string>
<floater.string name="free_mode_title">
オブジェクトを見る
</floater.string>
diff --git a/indra/newview/skins/default/xui/ja/floater_chat_bar.xml b/indra/newview/skins/default/xui/ja/floater_chat_bar.xml
new file mode 100644
index 0000000000..11f223ade6
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_chat_bar.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="chat_bar" title="è¿‘ãã®ãƒãƒ£ãƒƒãƒˆ">
+ <panel name="bottom_panel">
+ <line_editor label="ã“ã“をクリックã—ã¦ãƒãƒ£ãƒƒãƒˆã‚’開始ã—ã¾ã™ã€‚" name="chat_box" tool_tip="Enter キーを押ã—ã¦è©±ã—ã€Ctrl + Enter キーã§å«ã³ã¾ã™ã€‚"/>
+ <button name="show_nearby_chat" tool_tip="è¿‘ãã®ãƒãƒ£ãƒƒãƒˆãƒ­ã‚°ã‚’表示ï¼éžè¡¨ç¤º"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_customize.xml b/indra/newview/skins/default/xui/ja/floater_customize.xml
deleted file mode 100644
index cc0032e1ab..0000000000
--- a/indra/newview/skins/default/xui/ja/floater_customize.xml
+++ /dev/null
@@ -1,529 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater customize" title="容姿">
- <tab_container name="customize tab container">
- <text label="身体部ä½" name="body_parts_placeholder">
- 身体部ä½
- </text>
- <panel label="シェイプ" name="Shape">
- <button label="戻ã™" label_selected="戻ã™" name="Revert"/>
- <button label="身体" label_selected="身体" name="Body"/>
- <button label="é ­" label_selected="é ­" name="Head"/>
- <button label="眼" label_selected="眼" name="Eyes"/>
- <button label="耳" label_selected="耳" name="Ears"/>
- <button label="é¼»" label_selected="é¼»" name="Nose"/>
- <button label="å£" label_selected="å£" name="Mouth"/>
- <button label="ã‚ã”" label_selected="ã‚ã”" name="Chin"/>
- <button label="胴体" label_selected="胴体" name="Torso"/>
- <button label="両脚" label_selected="両脚" name="Legs"/>
- <radio_group name="sex radio">
- <radio_item label="女性" name="radio" value="0"/>
- <radio_item label="男性" name="radio2" value="1"/>
- </radio_group>
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: 修正ã§ãã¾ã›ã‚“。
- </text>
- <text name="title_loading">
- [DESC]: ロード中...
- </text>
- <text name="title_not_worn">
- [DESC]: 未装ç€ã€‚
- </text>
- <text name="path">
- [PATH] ã«æ‰€åœ¨
- </text>
- <text name="not worn instructions">
- æŒã¡ç‰©ã‹ã‚‰ã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ã« 1 ã¤ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„シェイプをã¤ã‘ã¾ã™ã€‚ 代ã‚ã‚Šã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
- </text>
- <text name="no modify instructions">
- ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ­£ã‚’許ã•ã‚Œã¦ã„ã¾ã›ã‚“。
- </text>
- <text name="Item Action Label">
- シェイプ:
- </text>
- <button label="æ–°ã—ã„シェイプ(体型)を作æˆ" label_selected="æ–°ã—ã„シェイプ(体型)を作æˆ" name="Create New"/>
- <button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
- <button label="別åã§ä¿å­˜..." label_selected="別åã§ä¿å­˜..." name="Save As"/>
- </panel>
- <panel label="スキン" name="Skin">
- <button label="スキンã®è‰²" label_selected="スキンã®è‰²" name="Skin Color"/>
- <button label="é¡”ã®ç´°éƒ¨" label_selected="é¡”ã®ç´°éƒ¨" name="Face Detail"/>
- <button label="メイク" label_selected="メイク" name="Makeup"/>
- <button label="身体細部" label_selected="身体細部" name="Body Detail"/>
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: 修正ã§ãã¾ã›ã‚“。
- </text>
- <text name="title_loading">
- [DESC]: ロード中...
- </text>
- <text name="title_not_worn">
- [DESC]: 未装ç€ã€‚
- </text>
- <text name="path">
- [PATH] ã«æ‰€åœ¨
- </text>
- <text name="not worn instructions">
- æŒã¡ç‰©ã‹ã‚‰ã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ã« 1 ã¤ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„スキンをã¤ã‘ã¾ã™ã€‚ 代ã‚ã‚Šã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
- </text>
- <text name="no modify instructions">
- ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ­£ã‚’許ã•ã‚Œã¦ã„ã¾ã›ã‚“。
- </text>
- <text name="Item Action Label">
- スキン:
- </text>
- <texture_picker label="頭部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Head Tattoos" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
- <texture_picker label="上åŠèº«ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Upper Tattoos" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
- <texture_picker label="下部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Lower Tattoos" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
- <button label="æ–°ã—ã„スキンを作æˆ" label_selected="æ–°ã—ã„スキンを作æˆ" name="Create New"/>
- <button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
- <button label="別åã§ä¿å­˜..." label_selected="別åã§ä¿å­˜..." name="Save As"/>
- <button label="戻ã™" label_selected="戻ã™" name="Revert"/>
- </panel>
- <panel label="髪" name="Hair">
- <button label="色" label_selected="色" name="Color"/>
- <button label="スタイル" label_selected="スタイル" name="Style"/>
- <button label="眉毛" label_selected="眉毛" name="Eyebrows"/>
- <button label="é¡”" label_selected="é¡”" name="Facial"/>
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: 修正ã§ãã¾ã›ã‚“。
- </text>
- <text name="title_loading">
- [DESC]: ロード中...
- </text>
- <text name="title_not_worn">
- [DESC]: 未装ç€ã€‚
- </text>
- <text name="path">
- [PATH] ã«æ‰€åœ¨
- </text>
- <text name="not worn instructions">
- æŒã¡ç‰©ã‹ã‚‰ã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ã« 1 ã¤ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„髪をã¤ã‘ã¾ã™ã€‚ 代ã‚ã‚Šã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
- </text>
- <text name="no modify instructions">
- ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ­£ã‚’許ã•ã‚Œã¦ã„ã¾ã›ã‚“。
- </text>
- <text name="Item Action Label">
- 髪型:
- </text>
- <texture_picker label="テクスãƒãƒ£" name="Texture" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
- <button label="æ–°ã—ã„髪を作æˆ" label_selected="æ–°ã—ã„髪を作æˆ" name="Create New"/>
- <button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
- <button label="別åã§ä¿å­˜..." label_selected="別åã§ä¿å­˜..." name="Save As"/>
- <button label="戻ã™" label_selected="戻ã™" name="Revert"/>
- </panel>
- <panel label="眼" name="Eyes">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: 修正ã§ãã¾ã›ã‚“。
- </text>
- <text name="title_loading">
- [DESC]: ロード中...
- </text>
- <text name="title_not_worn">
- [DESC]: 未装ç€ã€‚
- </text>
- <text name="path">
- [PATH] ã«æ‰€åœ¨
- </text>
- <text name="not worn instructions">
- ã‚ãªãŸã®æŒã¡ç‰©ã‹ã‚‰ã‚¢ãƒã‚¿ãƒ¼ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„目をã¤ã‘ã¾ã™ã€‚ 代ã‚ã‚Šã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
- </text>
- <text name="no modify instructions">
- ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ­£ã‚’許ã•ã‚Œã¦ã„ã¾ã›ã‚“。
- </text>
- <text name="Item Action Label">
- 目:
- </text>
- <texture_picker label="虹彩" name="Iris" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
- <button label="æ–°ã—ã„眼を作æˆ" label_selected="æ–°ã—ã„眼を作æˆ" name="Create New"/>
- <button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
- <button label="別åã§ä¿å­˜..." label_selected="別åã§ä¿å­˜..." name="Save As"/>
- <button label="戻ã™" label_selected="戻ã™" name="Revert"/>
- </panel>
- <text label="æœ" name="clothes_placeholder">
- 衣類
- </text>
- <panel label="シャツ" name="Shirt">
- <texture_picker label="生地" name="Fabric" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
- <color_swatch label="色ï¼æ˜Žæš—" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
- <button label="å–り外ã™" label_selected="å–り外ã™" name="Take Off"/>
- <button label="æ–°ã—ã„シャツを作æˆ" label_selected="æ–°ã—ã„シャツを作æˆ" name="Create New"/>
- <button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
- <button label="別åã§ä¿å­˜..." label_selected="別åã§ä¿å­˜..." name="Save As"/>
- <button label="戻ã™" label_selected="戻ã™" name="Revert"/>
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: 修正ã§ãã¾ã›ã‚“。
- </text>
- <text name="title_loading">
- [DESC]: ロード中...
- </text>
- <text name="title_not_worn">
- [DESC]: 未装ç€ã€‚
- </text>
- <text name="path">
- [PATH] ã«æ‰€åœ¨
- </text>
- <text name="not worn instructions">
- æŒã¡ç‰©ã‹ã‚‰ã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ã« 1 ã¤ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„シャツをç€ã¾ã™ã€‚ 代ã‚ã‚Šã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
- </text>
- <text name="no modify instructions">
- ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ­£ã‚’許ã•ã‚Œã¦ã„ã¾ã›ã‚“。
- </text>
- <text name="Item Action Label">
- シャツ:
- </text>
- </panel>
- <panel label="パンツ" name="Pants">
- <texture_picker label="生地" name="Fabric" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
- <color_swatch label="色ï¼æ˜Žæš—" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
- <button label="å–り外ã™" label_selected="å–り外ã™" name="Take Off"/>
- <button label="æ–°ã—ã„パンツを作æˆ" label_selected="æ–°ã—ã„パンツを作æˆ" name="Create New"/>
- <button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
- <button label="別åã§ä¿å­˜..." label_selected="別åã§ä¿å­˜..." name="Save As"/>
- <button label="戻ã™" label_selected="戻ã™" name="Revert"/>
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: 修正ã§ãã¾ã›ã‚“。
- </text>
- <text name="title_loading">
- [DESC]: ロード中...
- </text>
- <text name="title_not_worn">
- [DESC]: 未装ç€ã€‚
- </text>
- <text name="path">
- [PATH] ã«æ‰€åœ¨
- </text>
- <text name="not worn instructions">
- ã‚ãªãŸã®æŒã¡ç‰©ã‹ã‚‰ã‚¢ãƒã‚¿ãƒ¼ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„パンツを履ãã¾ã™ã€‚ 代ã‚ã‚Šã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
- </text>
- <text name="no modify instructions">
- ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ­£ã‚’許ã•ã‚Œã¦ã„ã¾ã›ã‚“。
- </text>
- <text name="Item Action Label">
- パンツ:
- </text>
- </panel>
- <panel label="é´" name="Shoes">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: 修正ã§ãã¾ã›ã‚“。
- </text>
- <text name="title_loading">
- [DESC]: ロード中...
- </text>
- <text name="title_not_worn">
- [DESC]: 未装ç€ã€‚
- </text>
- <text name="path">
- [PATH] ã«æ‰€åœ¨
- </text>
- <text name="not worn instructions">
- ã‚ãªãŸã®æŒã¡ç‰©ã‹ã‚‰ã‚¢ãƒã‚¿ãƒ¼ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„é´ã‚’å±¥ãã¾ã™ã€‚ 代ã‚ã‚Šã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
- </text>
- <button label="æ–°ã—ã„é´ã‚’作æˆ" label_selected="æ–°ã—ã„é´ã‚’作æˆ" name="Create New"/>
- <text name="no modify instructions">
- ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ­£ã‚’許ã•ã‚Œã¦ã„ã¾ã›ã‚“。
- </text>
- <text name="Item Action Label">
- é´ï¼š
- </text>
- <texture_picker label="生地" name="Fabric" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
- <color_swatch label="色ï¼æ˜Žæš—" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
- <button label="å–り外ã™" label_selected="å–り外ã™" name="Take Off"/>
- <button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
- <button label="別åã§ä¿å­˜..." label_selected="別åã§ä¿å­˜..." name="Save As"/>
- <button label="戻ã™" label_selected="戻ã™" name="Revert"/>
- </panel>
- <panel label="é´ä¸‹" name="Socks">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: 修正ã§ãã¾ã›ã‚“。
- </text>
- <text name="title_loading">
- [DESC]: ロード中...
- </text>
- <text name="title_not_worn">
- [DESC]: 未装ç€ã€‚
- </text>
- <text name="path">
- [PATH] ã«æ‰€åœ¨
- </text>
- <text name="not worn instructions">
- ã‚ãªãŸã®æŒã¡ç‰©ã‹ã‚‰ã‚¢ãƒã‚¿ãƒ¼ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„é´ä¸‹ã‚’å±¥ãã¾ã™ã€‚ 代ã‚ã‚Šã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
- </text>
- <button label="æ–°ã—ã„é´ä¸‹ã‚’作æˆ" label_selected="æ–°ã—ã„é´ä¸‹ã‚’作æˆ" name="Create New"/>
- <text name="no modify instructions">
- ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ­£ã‚’許ã•ã‚Œã¦ã„ã¾ã›ã‚“。
- </text>
- <text name="Item Action Label">
- é´ä¸‹ï¼š
- </text>
- <texture_picker label="生地" name="Fabric" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
- <color_swatch label="色ï¼æ˜Žæš—" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
- <button label="å–り外ã™" label_selected="å–り外ã™" name="Take Off"/>
- <button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
- <button label="別åã§ä¿å­˜..." label_selected="別åã§ä¿å­˜..." name="Save As"/>
- <button label="戻ã™" label_selected="戻ã™" name="Revert"/>
- </panel>
- <panel label="上ç€" name="Jacket">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: 修正ã§ãã¾ã›ã‚“。
- </text>
- <text name="title_loading">
- [DESC]: ロード中...
- </text>
- <text name="title_not_worn">
- [DESC]: 未装ç€ã€‚
- </text>
- <text name="path">
- [PATH] ã«æ‰€åœ¨
- </text>
- <text name="not worn instructions">
- æŒã¡ç‰©ã‹ã‚‰ã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ã« 1 ã¤ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„ジャケットをç€ã¾ã™ã€‚ 代ã‚ã‚Šã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
- </text>
- <button label="æ–°ã—ã„上ç€ã‚’作æˆ" label_selected="æ–°ã—ã„上ç€ã‚’作æˆ" name="Create New"/>
- <text name="no modify instructions">
- ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ­£ã‚’許ã•ã‚Œã¦ã„ã¾ã›ã‚“。
- </text>
- <text name="Item Action Label">
- 上ç€ï¼š
- </text>
- <texture_picker label="上åŠèº«ã®ç”Ÿåœ°" name="Upper Fabric" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
- <texture_picker label="下層生地" name="Lower Fabric" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
- <color_swatch label="色ï¼æ˜Žæš—" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
- <button label="å–り外ã™" label_selected="å–り外ã™" name="Take Off"/>
- <button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
- <button label="別åã§ä¿å­˜..." label_selected="別åã§ä¿å­˜..." name="Save As"/>
- <button label="戻ã™" label_selected="戻ã™" name="Revert"/>
- </panel>
- <panel label="手袋" name="Gloves">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: 修正ã§ãã¾ã›ã‚“。
- </text>
- <text name="title_loading">
- [DESC]: ロード中...
- </text>
- <text name="title_not_worn">
- [DESC]: 未装ç€ã€‚
- </text>
- <text name="path">
- [PATH] ã«æ‰€åœ¨
- </text>
- <text name="not worn instructions">
- ã‚ãªãŸã®æŒã¡ç‰©ã‹ã‚‰ã‚¢ãƒã‚¿ãƒ¼ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„手袋をã¤ã‘ã¾ã™ã€‚ 代ã‚ã‚Šã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
- </text>
- <button label="æ–°ã—ã„手袋を作æˆ" label_selected="æ–°ã—ã„手袋を作æˆ" name="Create New"/>
- <text name="no modify instructions">
- ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ­£ã‚’許ã•ã‚Œã¦ã„ã¾ã›ã‚“。
- </text>
- <text name="Item Action Label">
- 手袋:
- </text>
- <texture_picker label="生地" name="Fabric" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
- <color_swatch label="色ï¼æ˜Žæš—" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
- <button label="å–り外ã™" label_selected="å–り外ã™" name="Take Off"/>
- <button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
- <button label="別åã§ä¿å­˜..." label_selected="別åã§ä¿å­˜..." name="Save As"/>
- <button label="戻ã™" label_selected="戻ã™" name="Revert"/>
- </panel>
- <panel label="下ç€ã‚·ãƒ£ãƒ„" name="Undershirt">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: 修正ã§ãã¾ã›ã‚“。
- </text>
- <text name="title_loading">
- [DESC]: ロード中...
- </text>
- <text name="title_not_worn">
- [DESC]: 未装ç€ã€‚
- </text>
- <text name="path">
- [PATH] ã«æ‰€åœ¨
- </text>
- <text name="not worn instructions">
- æŒã¡ç‰©ã‹ã‚‰ã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ã«1ã¤ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„下ç€ï¼ˆä¸Šï¼‰ã‚’ç€ã¾ã™ã€‚ 代ã‚ã‚Šã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
- </text>
- <button label="æ–°ã—ã„下ç€ã‚·ãƒ£ãƒ„を作æˆ" label_selected="æ–°ã—ã„下ç€ã‚·ãƒ£ãƒ„を作æˆ" name="Create New"/>
- <text name="no modify instructions">
- ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ­£ã‚’許ã•ã‚Œã¦ã„ã¾ã›ã‚“。
- </text>
- <text name="Item Action Label">
- 下ç€ã‚·ãƒ£ãƒ„:
- </text>
- <texture_picker label="生地" name="Fabric" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
- <color_swatch label="色ï¼æ˜Žæš—" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
- <button label="å–り外ã™" label_selected="å–り外ã™" name="Take Off"/>
- <button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
- <button label="別åã§ä¿å­˜..." label_selected="別åã§ä¿å­˜..." name="Save As"/>
- <button label="戻ã™" label_selected="戻ã™" name="Revert"/>
- </panel>
- <panel label="下ç€ãƒ‘ンツ" name="Underpants">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: 修正ã§ãã¾ã›ã‚“。
- </text>
- <text name="title_loading">
- [DESC]: ロード中...
- </text>
- <text name="title_not_worn">
- [DESC]: 未装ç€ã€‚
- </text>
- <text name="path">
- [PATH] ã«æ‰€åœ¨
- </text>
- <text name="not worn instructions">
- ã‚ãªãŸã®æŒã¡ç‰©ã‹ã‚‰ã‚¢ãƒã‚¿ãƒ¼ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„下ç€ï¼ˆä¸‹ï¼‰ã‚’å±¥ãã¾ã™ã€‚ 代ã‚ã‚Šã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
- </text>
- <button label="æ–°ã—ã„パンツを作æˆ" label_selected="æ–°ã—ã„パンツを作æˆ" name="Create New"/>
- <text name="no modify instructions">
- ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ­£ã‚’許ã•ã‚Œã¦ã„ã¾ã›ã‚“。
- </text>
- <text name="Item Action Label">
- 下ç€ãƒ‘ンツ:
- </text>
- <texture_picker label="生地" name="Fabric" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
- <color_swatch label="色ï¼æ˜Žæš—" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
- <button label="å–り外ã™" label_selected="å–り外ã™" name="Take Off"/>
- <button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
- <button label="別åã§ä¿å­˜..." label_selected="別åã§ä¿å­˜..." name="Save As"/>
- <button label="戻ã™" label_selected="戻ã™" name="Revert"/>
- </panel>
- <panel label="スカート" name="Skirt">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: 修正ã§ãã¾ã›ã‚“。
- </text>
- <text name="title_loading">
- [DESC]: ロード中...
- </text>
- <text name="title_not_worn">
- [DESC]: 未装ç€ã€‚
- </text>
- <text name="path">
- [PATH] ã«æ‰€åœ¨
- </text>
- <text name="not worn instructions">
- æŒã¡ç‰©ã‹ã‚‰ã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ã« 1 ã¤ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„スカートを履ãã¾ã™ã€‚ 代ã‚ã‚Šã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
- </text>
- <button label="スカートを作æˆ" label_selected="スカートを作æˆ" name="Create New"/>
- <text name="no modify instructions">
- ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ­£ã‚’許ã•ã‚Œã¦ã„ã¾ã›ã‚“。
- </text>
- <text name="Item Action Label">
- スカート:
- </text>
- <texture_picker label="生地" name="Fabric" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
- <color_swatch label="色ï¼æ˜Žæš—" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
- <button label="å–り外ã™" label_selected="å–り外ã™" name="Take Off"/>
- <button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
- <button label="別åã§ä¿å­˜..." label_selected="別åã§ä¿å­˜..." name="Save As"/>
- <button label="戻ã™" label_selected="戻ã™" name="Revert"/>
- </panel>
- <panel label="タトゥ" name="Tattoo">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: 修正ä¸å¯
- </text>
- <text name="title_loading">
- [DESC]: ローディング...
- </text>
- <text name="title_not_worn">
- [DESC]: 未ç€ç”¨
- </text>
- <text name="path">
- å‚ç…§ [PATH]
- </text>
- <text name="not worn instructions">
- ã‚ãªãŸã®æŒã¡ç‰©ã‹ã‚‰ã‚¢ãƒã‚¿ãƒ¼ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„タトゥをã¤ã‘ã¾ã™ã€‚ 代ã‚ã‚Šã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
- </text>
- <button label="æ–°ã—ã„タトゥを作æˆ" label_selected="æ–°ã—ã„タトゥを作æˆ" name="Create New"/>
- <text name="no modify instructions">
- ã“ã®ç€ç”¨ç‰©ã‚’修正ã™ã‚‹æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“。
- </text>
- <text name="Item Action Label">
- タトゥ:
- </text>
- <texture_picker label="頭部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Head Tattoo" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
- <texture_picker label="上部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Upper Tattoo" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
- <texture_picker label="下部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Lower Tattoo" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
- <button label="å–り外ã™" label_selected="å–り外ã™" name="Take Off"/>
- <button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
- <button label="別åã§ä¿å­˜..." label_selected="別åã§ä¿å­˜..." name="Save As"/>
- <button label="å…ƒã«æˆ»ã™" label_selected="å…ƒã«æˆ»ã™" name="Revert"/>
- </panel>
- <panel label="アルファ" name="Alpha">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: 修正ä¸å¯
- </text>
- <text name="title_loading">
- [DESC]: ローディング...
- </text>
- <text name="title_not_worn">
- [DESC]: 未ç€ç”¨
- </text>
- <text name="path">
- å‚ç…§ [PATH]
- </text>
- <text name="not worn instructions">
- ã‚ãªãŸã®æŒã¡ç‰©ã‹ã‚‰ã‚¢ãƒã‚¿ãƒ¼ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„アルファマスクをã¤ã‘ã¾ã™ã€‚ 代ã‚ã‚Šã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
- </text>
- <button label="æ–°ã—ã„アルファを作æˆ" label_selected="æ–°ã—ã„アルファを作æˆ" name="Create New"/>
- <text name="no modify instructions">
- ã“ã®ç€ç”¨ç‰©ã‚’修正ã™ã‚‹æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“。
- </text>
- <text name="Item Action Label">
- アルファ:
- </text>
- <texture_picker label="アルファ(下)" name="Lower Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
- <texture_picker label="アルファ(上)" name="Upper Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
- <texture_picker label="頭部ã®ã‚¢ãƒ«ãƒ•ã‚¡" name="Head Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
- <texture_picker label="ç›®ã®ã‚¢ãƒ«ãƒ•ã‚¡" name="Eye Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
- <texture_picker label="髪ã®ã‚¢ãƒ«ãƒ•ã‚¡" name="Hair Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
- <button label="å–り外ã™" label_selected="å–り外ã™" name="Take Off"/>
- <button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
- <button label="別åã§ä¿å­˜..." label_selected="別åã§ä¿å­˜..." name="Save As"/>
- <button label="å…ƒã«æˆ»ã™" label_selected="å…ƒã«æˆ»ã™" name="Revert"/>
- </panel>
- </tab_container>
- <button label="スクリプト情報" label_selected="スクリプト情報" name="script_info" tool_tip="ã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ã«ä»˜ã„ã¦ã„るスクリプトを表示ã—ã¾ã™"/>
- <button label="アウトフィット作æˆ" label_selected="アウトフィット作æˆ" name="make_outfit_btn"/>
- <button label="キャンセル" label_selected="キャンセル" name="Cancel"/>
- <button label="OK" label_selected="OK" name="Ok"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/ja/floater_day_cycle_options.xml
deleted file mode 100644
index b0949cd4e0..0000000000
--- a/indra/newview/skins/default/xui/ja/floater_day_cycle_options.xml
+++ /dev/null
@@ -1,94 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Day Cycle Floater" title="デイサイクル編集">
- <tab_container name="Day Cycle Tabs">
- <panel label="デイサイクル" name="Day Cycle">
- <button label="?" name="WLDayCycleHelp"/>
- <text name="WL12am">
- 深夜 12時
- </text>
- <text name="WL3am">
- åˆå‰ 3時
- </text>
- <text name="WL6am">
- åˆå‰ 6時
- </text>
- <text name="WL9amHash">
- åˆå‰ 9時
- </text>
- <text name="WL12pmHash">
- æ­£åˆ 12時
- </text>
- <text name="WL3pm">
- åˆå¾Œ 3時
- </text>
- <text name="WL6pm">
- åˆå¾Œ 6時
- </text>
- <text name="WL9pm">
- åˆå¾Œ 9時
- </text>
- <text name="WL12am2">
- 深夜 12時
- </text>
- <text name="WL12amHash">
- |
- </text>
- <text name="WL3amHash">
- I
- </text>
- <text name="WL6amHash">
- |
- </text>
- <text name="WL9amHash2">
- I
- </text>
- <text name="WL12pmHash2">
- |
- </text>
- <text name="WL3pmHash">
- I
- </text>
- <text name="WL6pmHash">
- |
- </text>
- <text name="WL9pmHash">
- I
- </text>
- <text name="WL12amHash2">
- |
- </text>
- <button label="キーã®è¿½åŠ " label_selected="キーã®è¿½åŠ " name="WLAddKey"/>
- <button label="キーã®å‰Šé™¤" label_selected="キーã®å‰Šé™¤" name="WLDeleteKey"/>
- <text name="WLCurKeyFrameText">
- キーフレームã®è¨­å®šï¼š
- </text>
- <text name="WLCurKeyTimeText">
- キータイム:
- </text>
- <spinner label="時間" name="WLCurKeyHour"/>
- <spinner label="分" name="WLCurKeyMin"/>
- <text name="WLCurKeyTimeText2">
- キーã®äº‹å‰è¨­å®šï¼š
- </text>
- <combo_box label="事å‰è¨­å®š" name="WLKeyPresets"/>
- <text name="DayCycleText">
- スナップ:
- </text>
- <combo_box label="5 分" name="WLSnapOptions"/>
- <text name="DayCycleText2">
- サイクルã®é•·ã•ï¼š
- </text>
- <spinner label="時間" name="WLLengthOfDayHour"/>
- <spinner label="分" name="WLLengthOfDayMin"/>
- <spinner label="秒" name="WLLengthOfDaySec"/>
- <text name="DayCycleText3">
- プレビュー:
- </text>
- <button label="å†ç”Ÿ" label_selected="å†ç”Ÿ" name="WLAnimSky"/>
- <button label="åœæ­¢" label_selected="åœæ­¢" name="WLStopAnimSky"/>
- <button label="ä¸å‹•ç”£ã®æ™‚刻を使用" label_selected="ä¸å‹•ç”£ã®æ™‚刻ã«å¤‰æ›´" name="WLUseLindenTime"/>
- <button label="デイテストをä¿å­˜" label_selected="デイテストをä¿å­˜" name="WLSaveDayCycle"/>
- <button label="デイテストをロード" label_selected="デイテストをロード" name="WLLoadDayCycle"/>
- </panel>
- </tab_container>
-</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_delete_env_preset.xml b/indra/newview/skins/default/xui/ja/floater_delete_env_preset.xml
new file mode 100644
index 0000000000..eb39d1b336
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_delete_env_preset.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<floater name="Delete Env Preset" title="環境ã®äº‹å‰è¨­å®šã‚’削除">
+ <string name="title_water">
+ æ°´ã®äº‹å‰è¨­å®šã‚’削除
+ </string>
+ <string name="title_sky">
+ 空ã®äº‹å‰è¨­å®šã‚’削除
+ </string>
+ <string name="title_day_cycle">
+ デイサイクルを削除
+ </string>
+ <string name="label_water">
+ 事å‰è¨­å®šï¼š
+ </string>
+ <string name="label_sky">
+ 事å‰è¨­å®šï¼š
+ </string>
+ <string name="label_day_cycle">
+ デイサイクル:
+ </string>
+ <string name="msg_confirm_deletion">
+ é¸æŠžã•ã‚ŒãŸäº‹å‰è¨­å®šã‚’削除ã—ã¾ã™ã‹ï¼Ÿ
+ </string>
+ <string name="msg_sky_is_referenced">
+ デイサイクルã®å‚照先ã¨ã—ã¦ä½¿ã‚ã‚Œã¦ã„る事å‰è¨­å®šã¯å‰Šé™¤ã§ãã¾ã›ã‚“。
+ </string>
+ <string name="combo_label">
+ - 事å‰è¨­å®šã‚’é¸æŠž -
+ </string>
+ <text name="label">
+ 事å‰è¨­å®šï¼š
+ </text>
+ <button label="削除" name="delete"/>
+ <button label="å–り消ã—" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_destinations.xml b/indra/newview/skins/default/xui/ja/floater_destinations.xml
new file mode 100644
index 0000000000..b7f6ad4d4e
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_destinations.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Destinations" title="è¡Œãå…ˆ"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_display_name.xml b/indra/newview/skins/default/xui/ja/floater_display_name.xml
new file mode 100644
index 0000000000..cc71b1cd9f
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_display_name.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Display Name" title="表示åを変更">
+ <text name="info_text">
+ ã‚¢ãƒã‚¿ãƒ¼ã«ã¤ã‘ãŸåå‰ãŒã‚ãªãŸã®è¡¨ç¤ºåã¨ãªã‚Šã¾ã™ã€‚表示åã¯é€±ä¸€å›žã®é »åº¦ã§å¤‰æ›´ã™ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™ã€‚
+ </text>
+ <text name="lockout_text">
+ 表示åã¯æ¬¡ã®æ—¥ä»˜ã¾ã§å¤‰æ›´ã§ãã¾ã›ã‚“:[TIME]。
+ </text>
+ <text name="set_name_label">
+ æ–°ã—ã„表示å:
+ </text>
+ <text name="name_confirm_label">
+ æ–°ã—ã„表示åã‚’å†å…¥åŠ›ã—ã¦ç¢ºèªï¼š
+ </text>
+ <button label="ä¿å­˜" name="save_btn" tool_tip="æ–°ã—ã„表示åã‚’ä¿å­˜"/>
+ <button label="リセット" name="reset_btn" tool_tip="表示åã¨ãƒ¦ãƒ¼ã‚¶ãƒ¼åを統一"/>
+ <button label="å–り消ã—" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_edit_day_cycle.xml b/indra/newview/skins/default/xui/ja/floater_edit_day_cycle.xml
new file mode 100644
index 0000000000..fd601672b6
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_edit_day_cycle.xml
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Edit Day cycle" title="デイサイクルを編集">
+ <string name="title_new">
+ æ–°ãŸãªãƒ‡ã‚¤ã‚µã‚¤ã‚¯ãƒ«ã‚’作æˆ
+ </string>
+ <string name="title_edit">
+ デイサイクルを編集
+ </string>
+ <string name="hint_new">
+ æ–°ã—ã„デイサイクルã«åå‰ã‚’ã¤ã‘ã€å¸Œæœ›ã®è¨­å®šã«èª¿ç¯€ã—ã¦ã€ã€Œä¿å­˜ã€ã‚’クリックã—ã¾ã™ã€‚
+ </string>
+ <string name="hint_edit">
+ 自分ã§ä½œæˆã—ãŸãƒ‡ã‚¤ã‚µã‚¤ã‚¯ãƒ«ã‚’編集ã™ã‚‹ã«ã¯ã€å¸Œæœ›ã®è¨­å®šã«èª¿ç¯€ã—ã¦ã€ã€Œä¿å­˜ã€ã‚’クリックã—ã¾ã™ã€‚
+ </string>
+ <string name="combo_label">
+ - 事å‰è¨­å®šã‚’é¸æŠž -
+ </string>
+ <text name="label">
+ 事å‰è¨­å®šã®åå‰ï¼š
+ </text>
+ <text name="note">
+ 注æ„:自分ã§ä½œæˆã—ãŸäº‹å‰è¨­å®šã®åå‰ã‚’変更ã™ã‚‹ã¨ã€æ–°ã—ã„事å‰è¨­å®šãŒåˆ¥ã«ä½œæˆã•ã‚Œã‚‹ã ã‘ã§ã€å…ƒã®äº‹å‰è¨­å®šã¯å¤‰æ›´ã•ã‚Œã¾ã›ã‚“。
+ </text>
+ <text name="hint_item1">
+ - 特定ã®ç©ºã®è¨­å®šã‚„時間を編集ã™ã‚‹ã«ã¯ã‚¿ãƒ–ã‚’1ã¤ã‚¯ãƒªãƒƒã‚¯ã—ã¾ã™ã€‚
+ </text>
+ <text name="hint_item2">
+ - 移行時間を設定ã™ã‚‹ã«ã¯ã‚¿ãƒ–をクリックã—ã¦ãƒ‰ãƒ©ãƒƒã‚°ã—ã¾ã™ã€‚
+ </text>
+ <text name="hint_item3">
+ - デイサイクルをプレビューã™ã‚‹ã«ã¯ã‚¹ã‚¯ãƒ©ãƒãƒ¼ã‚’使ã„ã¾ã™ã€‚
+ </text>
+ <panel name="day_cycle_slider_panel">
+ <multi_slider initial_value="0" name="WLTimeSlider"/>
+ <multi_slider initial_value="0" name="WLDayCycleKeys"/>
+ <button label="キーã®è¿½åŠ " label_selected="キーã®è¿½åŠ " name="WLAddKey"/>
+ <button label="キーã®å‰Šé™¤" label_selected="キーã®å‰Šé™¤" name="WLDeleteKey"/>
+ <text name="WL12am">
+ 12am
+ </text>
+ <text name="WL3am">
+ 3am
+ </text>
+ <text name="WL6am">
+ 6am
+ </text>
+ <text name="WL9amHash">
+ 9am
+ </text>
+ <text name="WL12pmHash">
+ 12pm
+ </text>
+ <text name="WL3pm">
+ 3pm
+ </text>
+ <text name="WL6pm">
+ 6pm
+ </text>
+ <text name="WL9pm">
+ 9pm
+ </text>
+ <text name="WL12am2">
+ 12am
+ </text>
+ <text name="WL12amHash">
+ |
+ </text>
+ <text name="WL3amHash">
+ I
+ </text>
+ <text name="WL6amHash">
+ |
+ </text>
+ <text name="WL9amHash2">
+ I
+ </text>
+ <text name="WL12pmHash2">
+ |
+ </text>
+ <text name="WL3pmHash">
+ I
+ </text>
+ <text name="WL6pmHash">
+ |
+ </text>
+ <text name="WL9pmHash">
+ I
+ </text>
+ <text name="WL12amHash2">
+ |
+ </text>
+ </panel>
+ <text name="WLCurKeyPresetText">
+ 空ã®è¨­å®šï¼š
+ </text>
+ <combo_box label="事å‰è¨­å®š" name="WLSkyPresets"/>
+ <text name="WLCurKeyTimeText">
+ 時間:
+ </text>
+ <time name="time" value="6:00 AM"/>
+ <check_box label="ã“れを新ã—ã„デイサイクルã«ã™ã‚‹" name="make_default_cb"/>
+ <button label="ä¿å­˜" name="save"/>
+ <button label="å–り消ã—" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_edit_sky_preset.xml b/indra/newview/skins/default/xui/ja/floater_edit_sky_preset.xml
new file mode 100644
index 0000000000..68d0c70baa
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_edit_sky_preset.xml
@@ -0,0 +1,143 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Edit Sky Preset" title="空ã®äº‹å‰è¨­å®šã‚’編集">
+ <string name="title_new">
+ æ–°ã—ã„空ã®äº‹å‰è¨­å®šã‚’作æˆ
+ </string>
+ <string name="title_edit">
+ 空ã®äº‹å‰è¨­å®šã‚’編集
+ </string>
+ <string name="hint_new">
+ æ–°ã—ã„事å‰è¨­å®šã«åå‰ã‚’ã¤ã‘ã€å¸Œæœ›ã®è¨­å®šã«èª¿ç¯€ã—ã¦ã€ã€Œä¿å­˜ã€ã‚’クリックã—ã¾ã™ã€‚
+ </string>
+ <string name="hint_edit">
+ 空ã®äº‹å‰è¨­å®šã‚’編集ã™ã‚‹ã«ã¯ã€å¸Œæœ›ã®è¨­å®šã«èª¿ç¯€ã—ã¦ã€ã€Œä¿å­˜ã€ã‚’クリックã—ã¾ã™ã€‚
+ </string>
+ <string name="combo_label">
+ - 事å‰è¨­å®šã‚’é¸æŠž -
+ </string>
+ <text name="hint">
+ 事å‰è¨­å®šã‚’編集ã™ã‚‹ã«ã¯ã€å¸Œæœ›ã®è¨­å®šã«èª¿ç¯€ã—ã¦ã€ã€Œä¿å­˜ã€ã‚’クリックã—ã¾ã™ã€‚
+ </text>
+ <text name="label">
+ 事å‰è¨­å®šã®åå‰ï¼š
+ </text>
+ <text name="note">
+ 注æ„:自分ã§ä½œæˆã—ãŸäº‹å‰è¨­å®šã®åå‰ã‚’変更ã™ã‚‹ã¨ã€æ–°ã—ã„事å‰è¨­å®šãŒåˆ¥ã«ä½œæˆã•ã‚Œã‚‹ã ã‘ã§ã€å…ƒã®äº‹å‰è¨­å®šã¯å¤‰æ›´ã•ã‚Œã¾ã›ã‚“。
+ </text>
+ <tab_container name="WindLight Tabs">
+ <panel label="大気" name="Atmosphere">
+ <text name="BHText">
+ 空ã®é…色
+ </text>
+ <text name="BDensText">
+ 空ã¨é æ™¯ã®éœ²å…‰
+ </text>
+ <text name="BDensText2">
+ 空ã®é…色ã¨æ¿ƒåº¦
+ </text>
+ <text name="HDText">
+ 大気ã®ä¸é€æ˜Žåº¦
+ </text>
+ <text name="DensMultText">
+ 大気ã®ä¸é€æ˜Žåº¦ã®å¢—å¹…
+ </text>
+ <text name="WLDistanceMultText">
+ 視界ã®å¢—å¹…
+ </text>
+ <text name="MaxAltText">
+ 最大高度
+ </text>
+ </panel>
+ <panel label="ライティング" name="Lighting">
+ <text name="SLCText">
+ 太陽/月ã®è‰²
+ </text>
+ <text name="WLAmbientText">
+ 風
+ </text>
+ <text name="SunGlowText">
+ 太陽ã®è¼ã
+ </text>
+ <slider label="焦点" name="WLGlowB"/>
+ <slider label="サイズ" name="WLGlowR"/>
+ <text name="WLStarText">
+ 星ã®è¼ã
+ </text>
+ <text name="SceneGammaText">
+ 風景ガンマ
+ </text>
+ <text name="TODText">
+ 太陽/月ã®ä½ç½®
+ </text>
+ <multi_slider initial_value="0" name="WLSunPos"/>
+ <text name="WL12amHash">
+ |
+ </text>
+ <text name="WL6amHash">
+ |
+ </text>
+ <text name="WL12pmHash2">
+ |
+ </text>
+ <text name="WL6pmHash">
+ |
+ </text>
+ <text name="WL12amHash2">
+ |
+ </text>
+ <text name="WL12am">
+ 12am
+ </text>
+ <text name="WL6am">
+ 6am
+ </text>
+ <text name="WL12pmHash">
+ 12pm
+ </text>
+ <text name="WL6pm">
+ 6pm
+ </text>
+ <text name="WL12am2">
+ 12am
+ </text>
+ <time name="WLDayTime" value="6:00 AM"/>
+ <text name="WLEastAngleText">
+ æ±ã®è§’度
+ </text>
+ </panel>
+ <panel label="雲" name="Clouds">
+ <text name="WLCloudColorText">
+ 雲ã®è‰²
+ </text>
+ <text name="WLCloudColorText2">
+ 雲ã®XY/密度
+ </text>
+ <slider label="X" name="WLCloudX"/>
+ <slider label="Y" name="WLCloudY"/>
+ <slider label="D" name="WLCloudDensity"/>
+ <text name="WLCloudCoverageText">
+ 雲ã®é‡
+ </text>
+ <text name="WLCloudScaleText">
+ 雲ã®ã‚¹ã‚±ãƒ¼ãƒ«
+ </text>
+ <text name="WLCloudDetailText">
+ 雲ã®è©³ç´°ï¼ˆXY/密度)
+ </text>
+ <slider label="X" name="WLCloudDetailX"/>
+ <slider label="Y" name="WLCloudDetailY"/>
+ <slider label="D" name="WLCloudDetailDensity"/>
+ <text name="WLCloudScrollXText">
+ 雲ã®ç§»å‹•é€Ÿåº¦ï¼ˆXæ–¹å‘)
+ </text>
+ <check_box label="ロック" name="WLCloudLockX"/>
+ <text name="WLCloudScrollYText">
+ 雲ã®ç§»å‹•é€Ÿåº¦ï¼ˆY æ–¹å‘)
+ </text>
+ <check_box label="ロック" name="WLCloudLockY"/>
+ </panel>
+ </tab_container>
+ <check_box label="ã“ã®äº‹å‰è¨­å®šã‚’æ–°ã—ã„空ã®è¨­å®šã«ã™ã‚‹" name="make_default_cb"/>
+ <button label="ä¿å­˜" name="save"/>
+ <button label="å–り消ã—" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_edit_water_preset.xml b/indra/newview/skins/default/xui/ja/floater_edit_water_preset.xml
new file mode 100644
index 0000000000..eddfbd4298
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_edit_water_preset.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Edit Water Preset" title="æ°´ã®äº‹å‰è¨­å®šã‚’編集">
+ <string name="title_new">
+ æ–°ã—ã„æ°´ã®äº‹å‰è¨­å®šã‚’作æˆ
+ </string>
+ <string name="title_edit">
+ æ°´ã®äº‹å‰è¨­å®šã‚’編集
+ </string>
+ <string name="hint_new">
+ æ–°ã—ã„事å‰è¨­å®šã«åå‰ã‚’ã¤ã‘ã€å¸Œæœ›ã®è¨­å®šã«èª¿ç¯€ã—ã¦ã€ã€Œä¿å­˜ã€ã‚’クリックã—ã¾ã™ã€‚
+ </string>
+ <string name="hint_edit">
+ æ°´ã®äº‹å‰è¨­å®šã‚’編集ã™ã‚‹ã«ã¯ã€å¸Œæœ›ã®è¨­å®šã«èª¿ç¯€ã—ã¦ã€ã€Œä¿å­˜ã€ã‚’クリックã—ã¾ã™ã€‚
+ </string>
+ <string name="combo_label">
+ - 事å‰è¨­å®šã‚’é¸æŠž -
+ </string>
+ <text name="hint">
+ 事å‰è¨­å®šã‚’編集ã™ã‚‹ã«ã¯ã€å¸Œæœ›ã®è¨­å®šã«èª¿ç¯€ã—ã¦ã€ã€Œä¿å­˜ã€ã‚’クリックã—ã¾ã™ã€‚
+ </text>
+ <text name="label">
+ 事å‰è¨­å®šã®åå‰ï¼š
+ </text>
+ <text name="note">
+ 注æ„:自分ã§ä½œæˆã—ãŸäº‹å‰è¨­å®šã®åå‰ã‚’変更ã™ã‚‹ã¨ã€æ–°ã—ã„事å‰è¨­å®šãŒåˆ¥ã«ä½œæˆã•ã‚Œã‚‹ã ã‘ã§ã€å…ƒã®äº‹å‰è¨­å®šã¯å¤‰æ›´ã•ã‚Œã¾ã›ã‚“。
+ </text>
+ <panel name="panel_water_preset">
+ <text name="water_color_label">
+ 水中ã®ãƒ•ã‚©ã‚°åŠ¹æžœã®è‰²
+ </text>
+ <text name="water_fog_density_label">
+ 水中ã®é€æ˜Žåº¦æŒ‡æ•°
+ </text>
+ <text name="underwater_fog_modifier_label">
+ 水中ã®ãƒ•ã‚©ã‚°åŠ¹æžœåŠ æ¸›
+ </text>
+ <text name="BHText">
+ 大波ã®æ–¹å‘
+ </text>
+ <slider label="X" name="WaterWave1DirX"/>
+ <slider label="Y" name="WaterWave1DirY"/>
+ <text name="BDensText">
+ ã•ã–æ³¢ã®å射スケール
+ </text>
+ <text name="HDText">
+ フレãƒãƒ«ãƒ»ã‚¹ã‚±ãƒ¼ãƒ«
+ </text>
+ <text name="FresnelOffsetText">
+ フレãƒãƒ«ãƒ»ã‚ªãƒ•ã‚»ãƒƒãƒˆ
+ </text>
+ <text name="BHText2">
+ å°æ³¢ã®æ–¹å‘
+ </text>
+ <slider label="X" name="WaterWave2DirX"/>
+ <slider label="Y" name="WaterWave2DirY"/>
+ <text name="DensMultText">
+ æ°´é¢ã®å±ˆæŠ˜ã‚¹ã‚±ãƒ¼ãƒ«
+ </text>
+ <text name="WaterScaleBelowText">
+ 水中ã®å±ˆæŠ˜ã‚¹ã‚±ãƒ¼ãƒ«
+ </text>
+ <text name="MaxAltText">
+ ä¸é€æ˜Žåº¦ã®å¢—å¹…
+ </text>
+ <text name="BHText3">
+ ノーマル・マップ
+ </text>
+ </panel>
+ <check_box label="ã“ã®äº‹å‰è¨­å®šã‚’æ–°ã—ã„æ°´ã®è¨­å®šã«ã™ã‚‹" name="make_default_cb"/>
+ <button label="ä¿å­˜" name="save"/>
+ <button label="å–り消ã—" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_env_settings.xml b/indra/newview/skins/default/xui/ja/floater_env_settings.xml
deleted file mode 100644
index 1d5f26a6eb..0000000000
--- a/indra/newview/skins/default/xui/ja/floater_env_settings.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Environment Editor Floater" title="自然環境エディター">
- <floater.string name="timeStr">
- [hour12,datetime,utc]:[min,datetime,utc] [ampm,datetime,utc]
- </floater.string>
- <text name="EnvTimeText">
- 時刻
- </text>
- <text name="EnvTimeText2">
- æ­£åˆ 12:00
- </text>
- <text name="EnvCloudText">
- 雲ã®é‡
- </text>
- <text name="EnvWaterColorText">
- æ°´ã®è‰²
- </text>
- <color_swatch name="EnvWaterColor" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
- <text name="EnvWaterFogText">
- 水中照度
- </text>
- <button label="ä¸å‹•ç”£ã®æ™‚刻を使用" name="EnvUseEstateTimeButton"/>
- <button label="空ã®é«˜åº¦ãªè¨­å®š" name="EnvAdvancedSkyButton"/>
- <button label="æ°´ã®é«˜åº¦ãªè¨­å®š" name="EnvAdvancedWaterButton"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_environment_settings.xml b/indra/newview/skins/default/xui/ja/floater_environment_settings.xml
new file mode 100644
index 0000000000..0e3803119f
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_environment_settings.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Environment Editor Floater" title="自然環境ã®è¨­å®š">
+ <text name="note">
+ ビューワã®è‡ªç„¶ç’°å¢ƒã®è¨­å®šã¯ä»¥ä¸‹ã®ã‚ªãƒ—ションを使ã£ã¦ã‚«ã‚¹ã‚¿ãƒžã‚¤ã‚ºã§ãã¾ã™ã€‚
+ </text>
+ <radio_group name="region_settings_radio_group">
+ <radio_item label="リージョンã®è¨­å®šã‚’使用" name="use_region_settings"/>
+ <radio_item label="自然環境をカスタマイズ" name="use_my_settings"/>
+ </radio_group>
+ <panel name="user_environment_settings">
+ <text name="note">
+ 注æ„:カスタム設定ã¯ä»–ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«ã¯è¦‹ãˆã¾ã›ã‚“。
+ </text>
+ <text name="water_settings_title">
+ æ°´ã®è¨­å®š
+ </text>
+ <combo_box name="water_settings_preset_combo">
+ <combo_box.item label="- 事å‰è¨­å®šã‚’é¸æŠž -" name="item0"/>
+ </combo_box>
+ <text name="sky_dayc_settings_title">
+ 空 / デイサイクル
+ </text>
+ <radio_group name="sky_dayc_settings_radio_group">
+ <radio_item label="空ã®å›ºå®š" name="my_sky_settings"/>
+ <radio_item label="デイサイクル" name="my_dayc_settings"/>
+ </radio_group>
+ <combo_box name="sky_settings_preset_combo">
+ <combo_box.item label="- 事å‰è¨­å®šã‚’é¸æŠž -" name="item0"/>
+ </combo_box>
+ <combo_box name="dayc_settings_preset_combo">
+ <combo_box.item label="- 事å‰è¨­å®šã‚’é¸æŠž -" name="item0"/>
+ </combo_box>
+ </panel>
+ <button label="OK" name="ok_btn"/>
+ <button label="å–り消ã—" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_event.xml b/indra/newview/skins/default/xui/ja/floater_event.xml
index 9e99c4a931..ca50ba8ef8 100644
--- a/indra/newview/skins/default/xui/ja/floater_event.xml
+++ b/indra/newview/skins/default/xui/ja/floater_event.xml
@@ -1,40 +1,11 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater
- follows="all"
- height="400"
- can_resize="true"
- help_topic="event_details"
- label="Event"
- layout="topleft"
- name="Event"
- save_rect="true"
- save_visibility="false"
- title="EVENT DETAILS"
- width="600">
- <floater.string
- name="loading_text">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater can_resize="true" follows="all" height="400" help_topic="event_details" label="Event" layout="topleft" name="Event" save_rect="true" save_visibility="false" title="EVENT DETAILS" width="600">
+ <floater.string name="loading_text">
ローディング...
</floater.string>
- <floater.string
- name="done_text">
- Done
- </floater.string>
- <web_browser
- trusted_content="true"
- follows="left|right|top|bottom"
- layout="topleft"
- left="10"
- name="browser"
- height="365"
- width="580"
- top="0"/>
- <text
- follows="bottom|left"
- height="16"
- layout="topleft"
- left_delta="0"
- name="status_text"
- top_pad="10"
- width="150" />
+ <floater.string name="done_text">
+ 完了
+ </floater.string>
+ <web_browser follows="left|right|top|bottom" height="365" layout="topleft" left="10" name="browser" top="0" trusted_content="true" width="580"/>
+ <text follows="bottom|left" height="16" layout="topleft" left_delta="0" name="status_text" top_pad="10" width="150"/>
</floater>
-
diff --git a/indra/newview/skins/default/xui/ja/floater_fast_timers.xml b/indra/newview/skins/default/xui/ja/floater_fast_timers.xml
new file mode 100644
index 0000000000..5f538ecdb0
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_fast_timers.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="fast_timers">
+ <string name="pause">
+ 一時åœæ­¢
+ </string>
+ <string name="run">
+ èµ°ã‚‹
+ </string>
+ <button label="一時åœæ­¢" name="pause_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_hardware_settings.xml b/indra/newview/skins/default/xui/ja/floater_hardware_settings.xml
index c5a2800e0e..1b6558a9eb 100644
--- a/indra/newview/skins/default/xui/ja/floater_hardware_settings.xml
+++ b/indra/newview/skins/default/xui/ja/floater_hardware_settings.xml
@@ -4,8 +4,8 @@
フィルタリング:
</text>
<check_box label="異方的フィルタリング(有効ã«ã™ã‚‹ã¨é€Ÿåº¦ãŒä½Žä¸‹ã—ã¾ã™ï¼‰" name="ani"/>
- <text name="Antialiasing:">
- アンãƒã‚¨ã‚¤ãƒªã‚¢ã‚·ãƒ³ã‚°:
+ <text name="antialiasing label">
+ アンãƒã‚¨ã‚¤ãƒªã‚¢ã‚·ãƒ³ã‚°ï¼š
</text>
<combo_box label="アンãƒã‚¨ã‚¤ãƒªã‚¢ã‚·ãƒ³ã‚°" name="fsaa">
<combo_box.item label="無効" name="FSAADisabled"/>
@@ -14,6 +14,9 @@
<combo_box.item label="8x" name="8x"/>
<combo_box.item label="16x" name="16x"/>
</combo_box>
+ <text name="antialiasing restart">
+ (ビューワã®å†èµ·å‹•ãŒå¿…è¦ï¼‰
+ </text>
<spinner label="ガンマ:" name="gamma"/>
<text name="(brightness, lower is brighter)">
(0 ã§ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã€ä½Žã„ã»ã©æ˜Žã‚‹ã„)
diff --git a/indra/newview/skins/default/xui/ja/floater_how_to.xml b/indra/newview/skins/default/xui/ja/floater_how_to.xml
new file mode 100644
index 0000000000..4cebe27226
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_how_to.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_how_to" title="ãƒã‚¦ãƒ„ー"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_import_collada.xml b/indra/newview/skins/default/xui/ja/floater_import_collada.xml
new file mode 100644
index 0000000000..65edafb169
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_import_collada.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Import Collada" title="風景ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆ">
+ <text name="mesh count">
+ メッシュ: [COUNT]
+ </text>
+ <text name="texture count">
+ テクスãƒãƒ£ï¼š [COUNT]
+ </text>
+ <text name="status">
+ ステータス: [STATUS]
+ </text>
+ <button label="å–り消ã—" name="cancel"/>
+ <button label="OK" name="ok"/>
+ <string name="status_idle">
+ 待機状態
+ </string>
+ <string name="status_uploading">
+ [NAME]をアップロード中
+ </string>
+ <string name="status_creating">
+ オブジェクト[NAME]を作æˆä¸­
+ </string>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_incoming_call.xml b/indra/newview/skins/default/xui/ja/floater_incoming_call.xml
index 8e5177d6fe..f152fcd738 100644
--- a/indra/newview/skins/default/xui/ja/floater_incoming_call.xml
+++ b/indra/newview/skins/default/xui/ja/floater_incoming_call.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="incoming call" title="ä¸æ˜Žã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‹ã‚‰ã®ã‚³ãƒ¼ãƒ«">
+<floater name="incoming call" title="ç€ä¿¡">
<floater.string name="lifetime">
5
</floater.string>
diff --git a/indra/newview/skins/default/xui/ja/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/ja/floater_inventory_item_properties.xml
index 7480b04856..c01c46211e 100644
--- a/indra/newview/skins/default/xui/ja/floater_inventory_item_properties.xml
+++ b/indra/newview/skins/default/xui/ja/floater_inventory_item_properties.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="item properties" title="æŒã¡ç‰©ã‚¢ã‚¤ãƒ†ãƒ ã®ãƒ—ロパティ">
+<floater name="item properties" title="インベントリアイテムã®ãƒ—ロパティ">
<floater.string name="unknown">
(ä¸æ˜Žï¼‰
</floater.string>
@@ -24,17 +24,11 @@
<text name="LabelCreatorTitle">
クリエーター
</text>
- <text name="LabelCreatorName">
- Nicole Linden
- </text>
- <button label="情報" label_selected="" name="BtnCreator"/>
+ <button label="プロフィール..." label_selected="" name="BtnCreator"/>
<text name="LabelOwnerTitle">
オーナー:
</text>
- <text name="LabelOwnerName">
- Thrax Linden
- </text>
- <button label="情報" label_selected="" name="BtnOwner"/>
+ <button label="プロフィール..." label_selected="" name="BtnOwner"/>
<text name="LabelAcquiredTitle">
入手日時:
</text>
diff --git a/indra/newview/skins/default/xui/ja/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/ja/floater_inventory_view_finder.xml
index 47a63e5e20..af96edda79 100644
--- a/indra/newview/skins/default/xui/ja/floater_inventory_view_finder.xml
+++ b/indra/newview/skins/default/xui/ja/floater_inventory_view_finder.xml
@@ -1,10 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Inventory Finder" title="最近å–å¾—ã—ãŸæŒã¡ç‰©ã‚¢ã‚¤ãƒ†ãƒ ">
+<floater name="Inventory Finder" title="インベントリ最近å–å¾—ã—ãŸã‚¢ã‚¤ãƒ†ãƒ ">
<check_box label="アニメーション" name="check_animation"/>
<check_box label="コーリング・カード" name="check_calling_card"/>
<check_box label="æœ" name="check_clothing"/>
<check_box label="ジェスãƒãƒ£ãƒ¼" name="check_gesture"/>
<check_box label="ランドマーク" name="check_landmark"/>
+ <check_box label="メッシュ" name="check_mesh"/>
<check_box label="ノートカード" name="check_notecard"/>
<check_box label="オブジェクト" name="check_object"/>
<check_box label="スクリプト" name="check_script"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_map.xml b/indra/newview/skins/default/xui/ja/floater_map.xml
index 82b49df221..1122203446 100644
--- a/indra/newview/skins/default/xui/ja/floater_map.xml
+++ b/indra/newview/skins/default/xui/ja/floater_map.xml
@@ -1,32 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Map" title="">
- <floater.string name="mini_map_north">
- 北
- </floater.string>
- <floater.string name="mini_map_east">
- æ±
- </floater.string>
- <floater.string name="mini_map_west">
- 西
- </floater.string>
- <floater.string name="mini_map_south">
- å—
- </floater.string>
- <floater.string name="mini_map_southeast">
- å—æ±
- </floater.string>
- <floater.string name="mini_map_northeast">
- 北æ±
- </floater.string>
- <floater.string name="mini_map_southwest">
- å—西
- </floater.string>
- <floater.string name="mini_map_northwest">
- 北西
- </floater.string>
+<floater name="Map" title="ミニマップ">
<floater.string name="ToolTipMsg">
[REGION](ダブルクリックã§åœ°å›³ã‚’é–‹ã。Shiftâ€ãƒ‰ãƒ©ãƒƒã‚°ã§æ°´å¹³ãƒ»åž‚直移動)
</floater.string>
+ <floater.string name="AltToolTipMsg">
+ [地域](ダブルクリックã§ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã€‚Shiftâ€ãƒ‰ãƒ©ãƒƒã‚°ã§æ°´å¹³ãƒ»åž‚直移動)
+ </floater.string>
<floater.string name="mini_map_caption">
ミニマップ
</floater.string>
diff --git a/indra/newview/skins/default/xui/ja/floater_merchant_outbox.xml b/indra/newview/skins/default/xui/ja/floater_merchant_outbox.xml
new file mode 100644
index 0000000000..c59a3dc0ab
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_merchant_outbox.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_merchant_outbox" title="マーãƒãƒ£ãƒ³ãƒˆã‚¢ã‚¦ãƒˆãƒœãƒƒã‚¯ã‚¹">
+ <string name="OutboxFolderCount1">
+ 1 個ã®ãƒ•ã‚©ãƒ«ãƒ€
+ </string>
+ <string name="OutboxFolderCountN">
+ [NUM] 個ã®ãƒ•ã‚©ãƒ«ãƒ€
+ </string>
+ <string name="OutboxImporting">
+ フォルダをé€ä¿¡ä¸­...
+ </string>
+ <string name="OutboxInitializing">
+ åˆæœŸåŒ–中...
+ </string>
+ <panel label="">
+ <panel>
+ <panel name="outbox_inventory_placeholder_panel">
+ <text name="outbox_inventory_placeholder_title">
+ ロード中...
+ </text>
+ </panel>
+ </panel>
+ <panel>
+ <button label="マーケットプレイスã«é€ä¿¡" name="outbox_import_btn" tool_tip="自分ã®ãƒžãƒ¼ã‚±ãƒƒãƒˆãƒ—レイス店頭ã«ç§»å‹•"/>
+ </panel>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_model_preview.xml b/indra/newview/skins/default/xui/ja/floater_model_preview.xml
new file mode 100644
index 0000000000..c9ff0e29cb
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_model_preview.xml
@@ -0,0 +1,277 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Model Preview" title="モデルウィザード">
+ <string name="status_idle"/>
+ <string name="status_parse_error">
+ エラー:Dae ã«å•é¡ŒãŒè¦‹ã¤ã‹ã‚Šã¾ã—㟠- 詳細ã«ã¤ã„ã¦ã¯ãƒ­ã‚°ã‚’ã”å‚ç…§ãã ã•ã„。
+ </string>
+ <string name="status_material_mismatch">
+ エラー:モデルã®ææ–™ã¯å‚考モデルã®ã‚µãƒ–セットã§ã¯ã‚ã‚Šã¾ã›ã‚“。
+ </string>
+ <string name="status_reading_file">
+ ローディング...
+ </string>
+ <string name="status_generating_meshes">
+ メッシュを作æˆä¸­
+ </string>
+ <string name="status_vertex_number_overflow">
+ エラー:頂点ã®æ•°ãŒ65534を超éŽã—ãŸã®ã§ä¸­æ­¢ã•ã‚Œã¾ã—ãŸã€‚
+ </string>
+ <string name="bad_element">
+ エラー:è¦ç´ ãŒç„¡åŠ¹ã§ã™
+ </string>
+ <string name="high">
+ 高
+ </string>
+ <string name="medium">
+ 中
+ </string>
+ <string name="low">
+ 低
+ </string>
+ <string name="lowest">
+ 最低
+ </string>
+ <string name="mesh_status_good">
+ 発é€
+ </string>
+ <string name="mesh_status_na">
+ 該当ãªã—
+ </string>
+ <string name="mesh_status_none">
+ ãªã—
+ </string>
+ <string name="mesh_status_submesh_mismatch">
+ テクスãƒãƒ£ç·¨é›†å¯èƒ½ãªé¢ã®æ•°ã¯æ画詳細度ã«å¿œã˜ã¦ç•°ãªã‚Šã¾ã™ã€‚
+ </string>
+ <string name="mesh_status_mesh_mismatch">
+ メッシュインスタンスã®æ•°ã¯æ画詳細度ã«å¿œã˜ã¦ç•°ãªã‚Šã¾ã™ã€‚
+ </string>
+ <string name="mesh_status_too_many_vertices">
+ æ画詳細度ã«å¯¾ã—ã¦é ‚点ã®æ•°ãŒå¤šã™ãŽã¾ã™ã€‚
+ </string>
+ <string name="mesh_status_missing_lod">
+ å¿…è¦ãªæ画詳細度ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。
+ </string>
+ <string name="mesh_status_invalid_material_list">
+ LOD 付ãã®ææ–™ã¯å‚考モデルã®ã‚µãƒ–セットã§ã¯ã‚ã‚Šã¾ã›ã‚“。
+ </string>
+ <string name="layer_all">
+ å…¨ã¦
+ </string>
+ <string name="decomposing">
+ 分æžä¸­
+ </string>
+ <string name="simplifying">
+ å˜ç´”化
+ </string>
+ <string name="tbd">
+ 未定
+ </string>
+ <panel name="left_panel">
+ <panel name="model_name_representation_panel">
+ <text name="name_label">
+ モデルå:
+ </text>
+ <text name="model_category_label">
+ ã“ã®ãƒ¢ãƒ‡ãƒ«ã¯...
+ </text>
+ <combo_box name="model_category_combo">
+ <combo_item label="1ã¤ã‚’é¸æŠž..." name="Choose one"/>
+ <combo_item label="ã‚¢ãƒã‚¿ãƒ¼ã®å½¢" name="Avatar shape"/>
+ <combo_item label="ã‚¢ãƒã‚¿ãƒ¼ã®ã‚¢ã‚¿ãƒƒãƒãƒ¡ãƒ³ãƒˆ" name="Avatar attachment"/>
+ <combo_item label="å‹•ãオブジェクト(車ã€å‹•ç‰©ï¼‰" name="Moving object (vehicle, animal)"/>
+ <combo_item label="制作用コンãƒãƒ¼ãƒãƒ³ãƒˆ" name="Building Component"/>
+ <combo_item label="大型ã€ä¸å‹•ã€ç­‰" name="Large, non moving etc"/>
+ <combo_item label="ã‚„ã‚„å°åž‹ã€ä¸å‹•ã€ç­‰" name="Smaller, non-moving etc"/>
+ <combo_item label="ã„ãšã‚Œã«ã‚‚該当ã—ãªã„" name="Not really any of these"/>
+ </combo_box>
+ </panel>
+ <tab_container name="import_tab">
+ <panel label="æ画詳細度" name="lod_panel" title="æ画詳細度">
+ <text initial_value="データæº" name="source" value="データæº"/>
+ <text initial_value="三角形" name="triangles" value="三角形"/>
+ <text initial_value="頂点" name="vertices" value="頂点"/>
+ <text initial_value="高" name="high_label" value="高"/>
+ <button label="å‚ç…§" name="lod_browse_high"/>
+ <text initial_value="0" name="high_triangles" value="0"/>
+ <text initial_value="0" name="high_vertices" value="0"/>
+ <text initial_value="中" name="medium_label" value="中"/>
+ <button label="å‚ç…§" name="lod_browse_medium"/>
+ <text initial_value="0" name="medium_triangles" value="0"/>
+ <text initial_value="0" name="medium_vertices" value="0"/>
+ <text initial_value="低" name="low_label" value="低"/>
+ <button label="å‚ç…§" name="lod_browse_low"/>
+ <text initial_value="0" name="low_triangles" value="0"/>
+ <text initial_value="0" name="low_vertices" value="0"/>
+ <text initial_value="最低" name="lowest_label" value="最低"/>
+ <button label="å‚ç…§" name="lod_browse_lowest"/>
+ <text initial_value="0" name="lowest_triangles" value="0"/>
+ <text initial_value="0" name="lowest_vertices" value="0"/>
+ <check_box label="ノーマルã®ä½œæˆ" name="gen_normals"/>
+ <text initial_value="折れ角度:" name="crease_label" value="折れ角度:"/>
+ <spinner name="crease_angle" value="75"/>
+ </panel>
+ <panel label="物ç†åŠ¹æžœ" name="physics_panel">
+ <panel name="physics geometry">
+ <text name="first_step_name">
+ 手順1:æ画詳細度
+ </text>
+ <combo_box name="physics_lod_combo" tool_tip="実åƒã«é©ç”¨ã™ã‚‹LOD">
+ <combo_item name="choose_one">
+ 1ã¤ã‚’é¸æŠž...
+ </combo_item>
+ <combo_item name="physics_high">
+ 高
+ </combo_item>
+ <combo_item name="physics_medium">
+ 中
+ </combo_item>
+ <combo_item name="physics_low">
+ 低
+ </combo_item>
+ <combo_item name="physics_lowest">
+ 最低
+ </combo_item>
+ <combo_item name="load_from_file">
+ ファイルã‹ã‚‰
+ </combo_item>
+ </combo_box>
+ <button label="å‚ç…§" name="physics_browse"/>
+ </panel>
+ <panel name="physics analysis">
+ <text name="method_label">
+ 手順2:分æž
+ </text>
+ <text name="analysis_method_label">
+ 方法:
+ </text>
+ <text name="quality_label">
+ å“質:
+ </text>
+ <text name="smooth_method_label">
+ 滑らã‹ã•ï¼š
+ </text>
+ <check_box label="ç©´ã‚’é–‰ã˜ã‚‹" name="Close Holes (Slow)"/>
+ <button label="分æž" name="Decompose"/>
+ <button label="å–り消ã—" name="decompose_cancel"/>
+ </panel>
+ <panel name="physics simplification">
+ <text name="second_step_label">
+ 手順3:å˜ç´”化
+ </text>
+ <text name="simp_method_header">
+ 方法:
+ </text>
+ <text name="pass_method_header">
+ パス:
+ </text>
+ <text name="Detail Scale label">
+ 詳細度:
+ </text>
+ <text name="Retain%_label">
+ 維æŒçŽ‡ï¼š
+ </text>
+ <combo_box name="Combine Quality" value="1"/>
+ <button label="å˜ç´”化" name="Simplify"/>
+ <button label="å–り消ã—" name="simplify_cancel"/>
+ </panel>
+ <panel name="physics info">
+ <text name="results_text">
+ çµæžœï¼š
+ </text>
+ <text name="physics_triangles">
+ 三角形:[TRIANGLES],
+ </text>
+ <text name="physics_points">
+ 頂点:[POINTS],
+ </text>
+ <text name="physics_hulls">
+ 外殻構造:[HULLS]
+ </text>
+ </panel>
+ </panel>
+ <panel label="アップロードã®ã‚ªãƒ—ション" name="modifiers_panel">
+ <text name="scale_label">
+ スケール(1=増減ãªã—):
+ </text>
+ <spinner name="import_scale" value="1.0"/>
+ <text name="dimensions_label">
+ サイズ:
+ </text>
+ <text name="import_dimensions">
+ [X] X [Y] X [Z]
+ </text>
+ <check_box label="テクスãƒãƒ£ã‚’å«ã‚€" name="upload_textures"/>
+ <text name="include_label">
+ ã‚¢ãƒã‚¿ãƒ¼ãƒ¢ãƒ‡ãƒ«å°‚用:
+ </text>
+ <check_box label="スキンã®é‡ã•ã‚’å«ã‚€" name="upload_skin"/>
+ <check_box label="ジョイントãƒã‚¸ã‚·ãƒ§ãƒ³ã‚’å«ã‚€" name="upload_joints"/>
+ <text name="pelvis_offset_label">
+ Z オフセット(アãƒã‚¿ãƒ¼ã‚’上下調整):
+ </text>
+ <spinner name="pelvis_offset" value="0.0"/>
+ </panel>
+ </tab_container>
+ <panel name="weights_and_warning_panel">
+ <button label="ウェイトã¨æ–™é‡‘ã®è¨ˆç®—" name="calculate_btn" tool_tip="ウェイトã¨æ–™é‡‘ã®è¨ˆç®—"/>
+ <button label="å–り消ã—" name="cancel_btn"/>
+ <button label="アップロード" name="ok_btn" tool_tip="シミュレーターã«ã‚¢ãƒƒãƒ—ロード"/>
+ <button label="設定をクリアã—ã¦ãƒ•ã‚©ãƒ¼ãƒ ã‚’リセット" name="reset_btn"/>
+ <text name="upload_fee">
+ アップロード料金:L$ [FEE]
+ </text>
+ <text name="prim_weight">
+ 土地ã®è² è·ï¼š[EQ]
+ </text>
+ <text name="download_weight">
+ ダウンロード:[ST]
+ </text>
+ <text name="physics_weight">
+ 物ç†æ¼”算:[PH]
+ </text>
+ <text name="server_weight">
+ サーãƒãƒ¼è² è·ï¼š[SIM]
+ </text>
+ <text name="warning_title">
+ ã”注æ„:
+ </text>
+ <text name="warning_message">
+ メッシュモデルをアップロードã™ã‚‹æ¨©åˆ©ãŒã‚ã‚Šã¾ã›ã‚“。権利ã®å–得方法ã«ã¤ã„ã¦ã¯ [[VURL]] ã“ã¡ã‚‰ã‚’å‚ç…§ã—ã¦ãã ã•ã„。
+ </text>
+ <text name="status">
+ [STATUS]
+ </text>
+ </panel>
+ </panel>
+ <text name="lod_label">
+ プレビュー:
+ </text>
+ <panel name="right_panel">
+ <combo_box name="preview_lod_combo" tool_tip="プレビュー表示㮠LOD 設定">
+ <combo_item name="high">
+ 高
+ </combo_item>
+ <combo_item name="medium">
+ 中
+ </combo_item>
+ <combo_item name="low">
+ 低
+ </combo_item>
+ <combo_item name="lowest">
+ 最低
+ </combo_item>
+ </combo_box>
+ <text name="label_display">
+ ディスプレイ...
+ </text>
+ <check_box label="稜" name="show_edges"/>
+ <check_box label="物ç†åŠ¹æžœ" name="show_physics"/>
+ <check_box label="テクスãƒãƒ£" name="show_textures"/>
+ <check_box label="スキンã®é‡ã•" name="show_skin_weight"/>
+ <check_box label="ジョイント" name="show_joint_positions"/>
+ <text name="physics_explode_label">
+ プレビュースプレッド:
+ </text>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_moveview.xml b/indra/newview/skins/default/xui/ja/floater_moveview.xml
index 57ab32f486..aed3b78a14 100644
--- a/indra/newview/skins/default/xui/ja/floater_moveview.xml
+++ b/indra/newview/skins/default/xui/ja/floater_moveview.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="move_floater">
+<floater name="move_floater" title="歩行 / 走行 / 飛行">
<string name="walk_forward_tooltip">
å‰ã«é€²ã‚€ï¼ˆä¸ŠçŸ¢å°ã‹ W を押ã™ï¼‰
</string>
@@ -58,14 +58,14 @@
飛ã¶
</string>
<panel name="panel_actions">
- <button label="" label_selected="" name="move up btn" tool_tip="上ã«ç§»å‹•ï¼ˆE を押ã™ï¼‰"/>
<button label="" label_selected="" name="turn left btn" tool_tip="左をå‘ã(左矢å°ã‹ A を押ã™ï¼‰"/>
<joystick_slide name="move left btn" tool_tip="å·¦ã«æ­©ã(Shift + 左矢å°ã‹ A を押ã™ï¼‰"/>
- <button label="" label_selected="" name="move down btn" tool_tip="下ã«ç§»å‹•ï¼ˆC を押ã™ï¼‰"/>
<button label="" label_selected="" name="turn right btn" tool_tip="å³ã‚’å‘ã(å³çŸ¢å°ã‹ D を押ã™ï¼‰"/>
<joystick_slide name="move right btn" tool_tip="å³ã«æ­©ã(Shift + å³çŸ¢å°ã‹ D を押ã™ï¼‰"/>
<joystick_turn name="forward btn" tool_tip="å‰ã«é€²ã‚€ï¼ˆä¸ŠçŸ¢å°ã‹ W を押ã™ï¼‰"/>
<joystick_turn name="backward btn" tool_tip="後ã‚ã«æ­©ã(下矢å°ã‹ S を押ã™ï¼‰"/>
+ <button label="" label_selected="" name="move up btn" tool_tip="上ã«ç§»å‹•ï¼ˆE を押ã™ï¼‰"/>
+ <button label="" label_selected="" name="move down btn" tool_tip="下ã«ç§»å‹•ï¼ˆC を押ã™ï¼‰"/>
</panel>
<panel name="panel_modes">
<button label="" name="mode_walk_btn" tool_tip="歩行モード"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_my_appearance.xml b/indra/newview/skins/default/xui/ja/floater_my_appearance.xml
new file mode 100644
index 0000000000..c9a0ecefd7
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_my_appearance.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_my_appearance" title="容姿">
+ <panel label="容姿ã®ç·¨é›†" name="main_panel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_my_inventory.xml b/indra/newview/skins/default/xui/ja/floater_my_inventory.xml
new file mode 100644
index 0000000000..d708fc3dec
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_my_inventory.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_my_inventory" title="インベントリ"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_nearby_chat.xml b/indra/newview/skins/default/xui/ja/floater_nearby_chat.xml
index a29c6a0630..bcddcc6907 100644
--- a/indra/newview/skins/default/xui/ja/floater_nearby_chat.xml
+++ b/indra/newview/skins/default/xui/ja/floater_nearby_chat.xml
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="nearby_chat" title="è¿‘ãã®ãƒãƒ£ãƒƒãƒˆ">
- <check_box label="ãƒãƒ£ãƒƒãƒˆã‚’翻訳(Google翻訳)" name="translate_chat_checkbox"/>
+ <check_box label="ãƒãƒ£ãƒƒãƒˆã‚’翻訳" name="translate_chat_checkbox"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_object_weights.xml b/indra/newview/skins/default/xui/ja/floater_object_weights.xml
new file mode 100644
index 0000000000..d727a268fb
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_object_weights.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="object_weights" title="詳ã—ã„設定">
+ <floater.string name="nothing_selected" value="--"/>
+ <text name="selected_text" value="é¸æŠžæ¸ˆ"/>
+ <text name="objects" value="--"/>
+ <text name="objects_label" value="オブジェクト"/>
+ <text name="prims" value="--"/>
+ <text name="prims_label" value="プリム"/>
+ <text name="weights_of_selected_text" value="é¸æŠžæ¸ˆã¿ã‚¢ã‚¤ãƒ†ãƒ ã®ã‚¦ã‚¨ã‚¤ãƒˆ"/>
+ <text name="download" value="--"/>
+ <text name="download_label" value="ダウンロード"/>
+ <text name="physics" value="--"/>
+ <text name="physics_label" value="物ç†åŠ¹æžœ"/>
+ <text name="server" value="--"/>
+ <text name="server_label" value="サーãƒãƒ¼"/>
+ <text name="display" value="--"/>
+ <text name="display_label" value="ディスプレイ"/>
+ <text name="land_impacts_text" value="土地ã®è² è·"/>
+ <text name="selected" value="--"/>
+ <text name="selected_label" value="é¸æŠžæ¸ˆ"/>
+ <text name="rezzed_on_land" value="--"/>
+ <text name="rezzed_on_land_label" value="土地㫠Rez 済ã¿"/>
+ <text name="remaining_capacity" value="--"/>
+ <text name="remaining_capacity_label" value="残りã®è¨±å®¹æ•°"/>
+ <text name="total_capacity" value="--"/>
+ <text name="total_capacity_label" value="許容åˆè¨ˆ"/>
+ <text name="help_SLURL" value="[secondlife:///app/help/object_weights オブジェクトã®ã‚¦ã‚§ã‚¤ãƒˆã¨ã¯ï¼Ÿ]"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_openobject.xml b/indra/newview/skins/default/xui/ja/floater_openobject.xml
index bd1b650f98..af02ffedda 100644
--- a/indra/newview/skins/default/xui/ja/floater_openobject.xml
+++ b/indra/newview/skins/default/xui/ja/floater_openobject.xml
@@ -3,6 +3,6 @@
<text name="object_name">
[DESC]:
</text>
- <button label="æŒã¡ç‰©ã«ã‚³ãƒ”ー" label_selected="æŒã¡ç‰©ã«ã‚³ãƒ”ー" name="copy_to_inventory_button"/>
+ <button label="インベントリã«ã‚³ãƒ”ー" label_selected="インベントリã«ã‚³ãƒ”ー" name="copy_to_inventory_button"/>
<button label="コピーã—ã¦è£…ç€" label_selected="コピーã—ã¦è£…ç€" name="copy_and_wear_button"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_pay.xml b/indra/newview/skins/default/xui/ja/floater_pay.xml
index 83a3c641f9..17965fb60a 100644
--- a/indra/newview/skins/default/xui/ja/floater_pay.xml
+++ b/indra/newview/skins/default/xui/ja/floater_pay.xml
@@ -11,7 +11,7 @@
</text>
<icon name="icon_person" tool_tip="ä½äºº"/>
<text name="payee_name">
- Test Name That Is Extremely Long To Check Clipping
+ éžå¸¸ã«é•·ã„åå‰ãŒé€”中ã§åˆ‡ã‚Œã¦ã„ãªã„ã‹ã‚’テストã—ã¦ç¢ºèª
</text>
<button label="L$1" label_selected="L$1" name="fastpay 1"/>
<button label="L$5" label_selected="L$5" name="fastpay 5"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_people.xml b/indra/newview/skins/default/xui/ja/floater_people.xml
new file mode 100644
index 0000000000..b180658ab7
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_people.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_people" title="人">
+ <panel_container name="main_panel">
+ <panel label="グループプロフィール" name="panel_group_info_sidetray"/>
+ <panel label="ブロックã•ã‚ŒãŸä½äººã¨ã‚ªãƒ–ジェクト" name="panel_block_list_sidetray"/>
+ </panel_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_picks.xml b/indra/newview/skins/default/xui/ja/floater_picks.xml
new file mode 100644
index 0000000000..359585eb86
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_picks.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_picks" title="ピック"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_places.xml b/indra/newview/skins/default/xui/ja/floater_places.xml
new file mode 100644
index 0000000000..0d167444db
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_places.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_places" title="場所">
+ <panel label="場所" name="main_panel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_preferences.xml b/indra/newview/skins/default/xui/ja/floater_preferences.xml
index 6ba27b71a6..d48a8241ec 100644
--- a/indra/newview/skins/default/xui/ja/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/ja/floater_preferences.xml
@@ -5,10 +5,12 @@
<tab_container name="pref core">
<panel label="一般" name="general"/>
<panel label="グラフィック" name="display"/>
- <panel label="プライãƒã‚·ãƒ¼" name="im"/>
<panel label="サウンドã¨ãƒ¡ãƒ‡ã‚£ã‚¢" name="audio"/>
<panel label="ãƒãƒ£ãƒƒãƒˆ" name="chat"/>
+ <panel label="移動 &amp; 表示" name="move"/>
<panel label="メッセージ" name="msgs"/>
+ <panel label="色" name="colors"/>
+ <panel label="プライãƒã‚·ãƒ¼" name="im"/>
<panel label="セットアップ" name="input"/>
<panel label="詳細" name="advanced1"/>
</tab_container>
diff --git a/indra/newview/skins/default/xui/ja/floater_preferences_proxy.xml b/indra/newview/skins/default/xui/ja/floater_preferences_proxy.xml
new file mode 100644
index 0000000000..4638fd002e
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_preferences_proxy.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Proxy Settings Floater" title="プロキシ設定">
+ <check_box initial_value="false" label="ウェブページ㫠HTTP プロキシを使ã†" name="web_proxy_enabled"/>
+ <text name="http_proxy_label">
+ HTTP プロキシ:
+ </text>
+ <line_editor name="web_proxy_editor" tool_tip="使用ã™ã‚‹ HTTP プロキシ㮠DNS åã¾ãŸã¯ IP アドレス。"/>
+ <spinner label="ãƒãƒ¼ãƒˆç•ªå·ï¼š" name="web_proxy_port" tool_tip="使用ã™ã‚‹ HTTP プロキシãƒãƒ¼ãƒˆã€‚"/>
+ <check_box label="UDP トラフィック㫠SOCKS 5 プロキシを使ã†" name="socks_proxy_enabled"/>
+ <text name="socks5_proxy_label">
+ SOCKS 5 プロキシ:
+ </text>
+ <line_editor name="socks_proxy_editor" tool_tip="使用ã™ã‚‹ SOCKS 5 プロキシ㮠DNS åã¾ãŸã¯ IP アドレス。"/>
+ <spinner label="ãƒãƒ¼ãƒˆç•ªå·ï¼š" name="socks_proxy_port" tool_tip="使用ã™ã‚‹ SOCKS 5 プロキシãƒãƒ¼ãƒˆã€‚"/>
+ <text name="socks_auth_label">
+ SOCKS èªè¨¼ï¼š
+ </text>
+ <radio_group name="socks5_auth_type">
+ <radio_item label="èªè¨¼ãªã—" name="Socks5NoAuth" tool_tip="Socks 5 プロキシã¯èªè¨¼ã®å¿…è¦ãŒã‚ã‚Šã¾ã›ã‚“。" value="ãªã—"/>
+ <radio_item label="ユーザーå/パスワード" name="Socks5UserPass" tool_tip="Socks5 プロキシã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼å/パスワードã®èªè¨¼ãŒå¿…è¦ã§ã™ã€‚" value="UserPass"/>
+ </radio_group>
+ <text name="socks5_username_label">
+ ユーザーå:
+ </text>
+ <text name="socks5_password_label">
+ パスワード:
+ </text>
+ <line_editor name="socks5_username" tool_tip="SOCKS 5 サーãƒãƒ¼ã®èªè¨¼ã«ä½¿ç”¨ã•ã‚ŒãŸãƒ¦ãƒ¼ã‚¶ãƒ¼å"/>
+ <line_editor name="socks5_password" tool_tip="SOCKS 5 サーãƒãƒ¼ã®èªè¨¼ã«ä½¿ç”¨ã•ã‚ŒãŸãƒ‘スワード"/>
+ <text name="other_proxy_label">
+ 他㮠HTTP トラフィックプロキシ:
+ </text>
+ <radio_group name="other_http_proxy_type">
+ <radio_item label="プロキシã—ãªã„" name="OtherNoProxy" tool_tip="ウェブ以外㮠HTTP トラフィックã¯ã„ãšã‚Œã®ãƒ—ロキシã«ã‚‚ルーティングã•ã‚Œã¾ã›ã‚“。" value="ãªã—"/>
+ <radio_item label="HTTP プロキシを使ã†" name="OtherHTTPProxy" tool_tip="ウェブ以外㮠HTTP ã¯è¨­å®šæ¸ˆã¿ã‚¦ã‚§ãƒ–プロキシを通ã—ã¦ãƒ«ãƒ¼ãƒ†ã‚£ãƒ³ã‚°ã•ã‚Œã¾ã™ã€‚" value="Web"/>
+ <radio_item label="SOCKS 5 プロキシを使ã†" name="OtherSocksProxy" tool_tip="ウェブ以外㮠HTTP トラフィックã¯è¨­å®šæ¸ˆã¿ã® Socks 5 プロキシを通ã—ã¦ãƒ«ãƒ¼ãƒ†ã‚£ãƒ³ã‚°ã•ã‚Œã¾ã™ã€‚" value="Socks"/>
+ </radio_group>
+ <button label="OK" label_selected="OK" name="OK"/>
+ <button label="å–り消ã—" label_selected="å–り消ã—" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_preview_animation.xml b/indra/newview/skins/default/xui/ja/floater_preview_animation.xml
index 4fc59e16d3..a3042f66ea 100644
--- a/indra/newview/skins/default/xui/ja/floater_preview_animation.xml
+++ b/indra/newview/skins/default/xui/ja/floater_preview_animation.xml
@@ -6,6 +6,6 @@
<text name="desc txt">
説明:
</text>
- <button label="インワールドã§å†ç”Ÿ" label_selected="åœæ­¢" name="Anim play btn" tool_tip="他人ã«ã‚‚見ãˆã‚‹ã‚ˆã†ã«å†ç”Ÿã—ã¾ã™"/>
- <button label="ローカルå†ç”Ÿ" label_selected="åœæ­¢" name="Anim audition btn" tool_tip="自分ã ã‘ãŒè¦‹ãˆã‚‹ã‚ˆã†ã«å†ç”Ÿã—ã¾ã™"/>
+ <button label="インワールドã§å†ç”Ÿ" label_selected="åœæ­¢" name="Inworld" tool_tip="他人ã«è¦‹ãˆã‚‹ã‚ˆã†ã«å†ç”Ÿ"/>
+ <button label="ローカルå†ç”Ÿ" label_selected="åœæ­¢" name="Locally" tool_tip="自分ã ã‘ãŒè¦‹ãˆã‚‹ã‚ˆã†ã«å†ç”Ÿ"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_preview_texture.xml b/indra/newview/skins/default/xui/ja/floater_preview_texture.xml
index 6ea1d79cfc..4617fd1d92 100644
--- a/indra/newview/skins/default/xui/ja/floater_preview_texture.xml
+++ b/indra/newview/skins/default/xui/ja/floater_preview_texture.xml
@@ -4,7 +4,7 @@
テクスãƒãƒ£ï¼š [NAME]
</floater.string>
<floater.string name="Copy">
- æŒã¡ç‰©ã«ã‚³ãƒ”ー
+ インベントリã«ã‚³ãƒ”ー
</floater.string>
<text name="desc txt">
説明:
diff --git a/indra/newview/skins/default/xui/ja/floater_price_for_listing.xml b/indra/newview/skins/default/xui/ja/floater_price_for_listing.xml
new file mode 100644
index 0000000000..10a46247a7
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_price_for_listing.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="price_for_listing" title="クラシファイド広告ã®æŽ²è¼‰">
+ <text name="explanation_text">
+ ã‚ãªãŸã®ã‚¯ãƒ©ã‚·ãƒ•ã‚¡ã‚¤ãƒ‰åºƒå‘Šã¯ã€å…¬é–‹ã•ã‚ŒãŸæ—¥ã‹ã‚‰1週間有効ã§ã™ã€‚
+
+クラシファイドリストã®ã‚ãªãŸã®åºƒå‘Šã®ä½ç½®ã¯ã€åºƒå‘Šè²»ã‚’ã„ãら支払ã†ã‹ã§æ±ºã¾ã‚Šã¾ã™ã€‚
+
+最高金é¡ã‚’支払ã£ãŸåºƒå‘ŠãŒãƒªã‚¹ãƒˆã®ãƒˆãƒƒãƒ—ã«è¼‰ã‚Šã€æ¤œç´¢ã§ä¸Šä½ã«è¡¨ç¤ºã•ã‚Œã¾ã™ã€‚
+ </text>
+ <text name="price_text">
+ 広告費:
+ </text>
+ <text name="price_symbol">
+ L$
+ </text>
+ <button label="OK" name="set_price_btn"/>
+ <button label="å–り消ã—" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_region_debug_console.xml b/indra/newview/skins/default/xui/ja/floater_region_debug_console.xml
new file mode 100644
index 0000000000..4edb4972e4
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_region_debug_console.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="region_debug_console" title="地域デãƒãƒƒã‚°"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_search.xml b/indra/newview/skins/default/xui/ja/floater_search.xml
index 289098a343..0723be0068 100644
--- a/indra/newview/skins/default/xui/ja/floater_search.xml
+++ b/indra/newview/skins/default/xui/ja/floater_search.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_search" title="検索">
+<floater name="floater_search" title="">
<floater.string name="loading_text">
ローディング...
</floater.string>
diff --git a/indra/newview/skins/default/xui/ja/floater_sell_land.xml b/indra/newview/skins/default/xui/ja/floater_sell_land.xml
index 1e884af5f2..aa368eef11 100644
--- a/indra/newview/skins/default/xui/ja/floater_sell_land.xml
+++ b/indra/newview/skins/default/xui/ja/floater_sell_land.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater height="496" min_height="496" name="sell land" title="土地ã®è²©å£²">
+<floater name="sell land" title="土地ã®è²©å£²">
<scroll_container name="profile_scroll">
<panel name="scroll_content_panel">
<text name="info_parcel_label">
@@ -14,7 +14,7 @@
<text name="info_size">
[AREA] 平方メートル
</text>
- <text bottom_delta="-57" name="info_action">
+ <text name="info_action">
ã“ã®åŒºç”»ã‚’販売:
</text>
<text name="price_label">
@@ -29,13 +29,13 @@
<line_editor name="price">
0
</line_editor>
- <text left_delta="106" name="price_per_m" width="230">
+ <text name="price_per_m">
(1平方メートルã‚ãŸã‚Š L$[PER_METER])
</text>
<text name="sell_to_label">
2. 特定ã®äººã«è²©å£²ï¼š
</text>
- <text name="sell_to_text" right="-6">
+ <text name="sell_to_text">
販売先ã®æŒ‡å®šãªã—ã‹ã€ç‰¹å®šã®äººã«è²©å£²ã™ã‚‹ã‹ã‚’é¸æŠžã—ã¦ãã ã•ã„。
</text>
<combo_box name="sell_to">
@@ -50,15 +50,15 @@
<text name="sell_objects_text">
区画上ã«ã‚ã‚‹ã€åœŸåœ°æ‰€æœ‰è€…ã®è­²æ¸¡å¯èƒ½ãªã‚ªãƒ–ジェクトã¯ã€æ‰€æœ‰æ¨©ãŒå¤‰æ›´ã•ã‚Œã¾ã™ã€‚
</text>
- <radio_group bottom_delta="-76" height="72" name="sell_objects">
+ <radio_group name="sell_objects">
<radio_item label="ã„ã„ãˆã€ã‚ªãƒ–ジェクトã®æ‰€æœ‰æ¨©ã‚’ä¿æŒã—ã¾ã™" name="no"/>
- <radio_item bottom="-56" label="ã¯ã„ã€ã‚ªãƒ–ジェクトã¨åœŸåœ°ã‚’一緒ã«è²©å£²ã—ã¾ã™" name="yes"/>
+ <radio_item label="ã¯ã„ã€ã‚ªãƒ–ジェクトã¨åœŸåœ°ã‚’一緒ã«è²©å£²ã—ã¾ã™" name="yes"/>
</radio_group>
- <button label="オブジェクトを表示" name="show_objects" width="138"/>
+ <button label="オブジェクトを表示" name="show_objects"/>
<text name="nag_message_label">
注æ„: è¿”å“・交æ›ã¯ã§ãã¾ã›ã‚“。
</text>
- <button bottom="-489" label="土地を販売" name="sell_btn"/>
+ <button label="土地を販売" name="sell_btn"/>
<button label="キャンセル" name="cancel_btn"/>
</panel>
</scroll_container>
diff --git a/indra/newview/skins/default/xui/ja/floater_snapshot.xml b/indra/newview/skins/default/xui/ja/floater_snapshot.xml
index 05a10f9f6d..f145a2e8b8 100644
--- a/indra/newview/skins/default/xui/ja/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/ja/floater_snapshot.xml
@@ -3,73 +3,63 @@
<floater.string name="unknown">
ä¸æ˜Ž
</floater.string>
- <radio_group label="スナップショットã®ç¨®é¡ž" name="snapshot_type_radio">
- <radio_item label="メール" name="postcard"/>
- <radio_item label="æŒã¡ç‰©ï¼ˆL$[AMOUNT])" name="texture"/>
- <radio_item label="コンピューターã«ä¿å­˜" name="local"/>
- </radio_group>
+ <string name="postcard_progress_str">
+ メールã®é€ä¿¡
+ </string>
+ <string name="profile_progress_str">
+ 投稿
+ </string>
+ <string name="inventory_progress_str">
+ インベントリã«ä¿å­˜
+ </string>
+ <string name="local_progress_str">
+ コンピュータã«ä¿å­˜
+ </string>
+ <string name="profile_succeeded_str">
+ ç”»åƒãŒã‚¢ãƒƒãƒ—ロードã•ã‚Œã¾ã—ãŸ
+ </string>
+ <string name="postcard_succeeded_str">
+ メールãŒé€ä¿¡ã•ã‚Œã¾ã—ãŸ
+ </string>
+ <string name="inventory_succeeded_str">
+ インベントリã«ä¿å­˜ã•ã‚Œã¾ã—ãŸ
+ </string>
+ <string name="local_succeeded_str">
+ コンピュータã«ä¿å­˜ã•ã‚Œã¾ã—ãŸ
+ </string>
+ <string name="profile_failed_str">
+ プロフィールフィードã«ç”»åƒã‚’アップロードã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
+ </string>
+ <string name="postcard_failed_str">
+ メールをé€ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
+ </string>
+ <string name="inventory_failed_str">
+ インベントリã«ä¿å­˜ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
+ </string>
+ <string name="local_failed_str">
+ コンピュータã«ä¿å­˜ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
+ </string>
+ <button name="advanced_options_btn" tool_tip="詳ã—ã„設定"/>
+ <text name="image_res_text">
+ [WIDTH] x [HEIGHT] px
+ </text>
<text name="file_size_label">
[SIZE] キロãƒã‚¤ãƒˆ
</text>
- <button label="スナップショットを更新" name="new_snapshot_btn"/>
- <button label="é€ä¿¡" name="send_btn"/>
- <button label="ä¿å­˜ï¼ˆL$[AMOUNT])" name="upload_btn"/>
- <flyout_button label="ä¿å­˜" name="save_btn" tool_tip="ç”»åƒã‚’ファイルã«ä¿å­˜">
- <flyout_button.item label="ä¿å­˜" name="save_item"/>
- <flyout_button.item label="別åã§ä¿å­˜..." name="saveas_item"/>
- </flyout_button>
- <button label="詳細" name="more_btn" tool_tip="詳ã—ã„設定"/>
- <button label="簡易" name="less_btn" tool_tip="詳ã—ã„設定"/>
- <button label="å–り消ã—" name="discard_btn"/>
- <text name="type_label2">
- サイズ
- </text>
- <text name="format_label">
- 書å¼
- </text>
- <combo_box label="解åƒåº¦" name="postcard_size_combo">
- <combo_box.item label="ç¾åœ¨ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" name="CurrentWindow"/>
- <combo_box.item label="640x480" name="640x480"/>
- <combo_box.item label="800x600" name="800x600"/>
- <combo_box.item label="1024x768" name="1024x768"/>
- <combo_box.item label="カスタム" name="Custom"/>
- </combo_box>
- <combo_box label="解åƒåº¦" name="texture_size_combo">
- <combo_box.item label="ç¾åœ¨ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" name="CurrentWindow"/>
- <combo_box.item label="å°ï¼ˆ128x128)" name="Small(128x128)"/>
- <combo_box.item label="中(256x256)" name="Medium(256x256)"/>
- <combo_box.item label="大(512x512)" name="Large(512x512)"/>
- <combo_box.item label="カスタム" name="Custom"/>
- </combo_box>
- <combo_box label="解åƒåº¦" name="local_size_combo">
- <combo_box.item label="ç¾åœ¨ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" name="CurrentWindow"/>
- <combo_box.item label="320x240" name="320x240"/>
- <combo_box.item label="640x480" name="640x480"/>
- <combo_box.item label="800x600" name="800x600"/>
- <combo_box.item label="1024x768" name="1024x768"/>
- <combo_box.item label="1280x1024" name="1280x1024"/>
- <combo_box.item label="1600x1200" name="1600x1200"/>
- <combo_box.item label="カスタム" name="Custom"/>
- </combo_box>
- <combo_box label="書å¼" name="local_format_combo">
- <combo_box.item label="PNG" name="PNG"/>
- <combo_box.item label="JPEG" name="JPEG"/>
- <combo_box.item label="BMP" name="BMP"/>
- </combo_box>
- <spinner label="å¹…" name="snapshot_width"/>
- <spinner label="高ã•" name="snapshot_height"/>
- <check_box label="縦横比ã®å›ºå®š" name="keep_aspect_check"/>
- <slider label="画質" name="image_quality_slider"/>
- <text name="layer_type_label">
- キャプãƒãƒ£ï¼š
- </text>
- <combo_box label="ç”»åƒãƒ¬ã‚¤ãƒ¤ãƒ¼" name="layer_types">
- <combo_box.item label="色" name="Colors"/>
- <combo_box.item label="深度" name="Depth"/>
- </combo_box>
- <check_box label="インターフェース" name="ui_check"/>
- <check_box label="HUD" name="hud_check"/>
- <check_box label="ä¿å­˜å¾Œã‚‚ã“ã®ã¾ã¾" name="keep_open_check"/>
- <check_box label="ç”»é¢å…¨ä½“ã‚’é™æ­¢" name="freeze_frame_check"/>
- <check_box label="自動更新" name="auto_snapshot_check"/>
+ <panel name="advanced_options_panel">
+ <text name="advanced_options_label">
+ 詳ã—ã„設定
+ </text>
+ <text name="layer_type_label">
+ キャプãƒãƒ£ï¼š
+ </text>
+ <combo_box label="ç”»åƒãƒ¬ã‚¤ãƒ¤ãƒ¼" name="layer_types">
+ <combo_box.item label="色" name="Colors"/>
+ <combo_box.item label="深度" name="Depth"/>
+ </combo_box>
+ <check_box label="インターフェース" name="ui_check"/>
+ <check_box label="HUD" name="hud_check"/>
+ <check_box label="ç”»é¢å…¨ä½“ã‚’é™æ­¢" name="freeze_frame_check"/>
+ <check_box label="自動更新" name="auto_snapshot_check"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_sound_devices.xml b/indra/newview/skins/default/xui/ja/floater_sound_devices.xml
new file mode 100644
index 0000000000..28d2388bed
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_sound_devices.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_sound_devices" title="サウンドデãƒã‚¤ã‚¹">
+ <text name="voice_label">
+ ボイスãƒãƒ£ãƒƒãƒˆ
+ </text>
+ <check_box label="有効" name="enable_voice"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_stats.xml b/indra/newview/skins/default/xui/ja/floater_stats.xml
index 97927776c7..6a1f34cfd8 100644
--- a/indra/newview/skins/default/xui/ja/floater_stats.xml
+++ b/indra/newview/skins/default/xui/ja/floater_stats.xml
@@ -10,8 +10,8 @@
</stat_view>
<stat_view label="アドãƒãƒ³ã‚¹" name="advanced">
<stat_view label="æç”»" name="render">
- <stat_bar label="KTris æç”»" name="ktrisframe"/>
- <stat_bar label="KTris æç”»" name="ktrissec"/>
+ <stat_bar label="フレームã”ã¨ã® KTris æç”»" name="ktrisframe"/>
+ <stat_bar label="秒ã”ã¨ã® KTris æç”»" name="ktrissec"/>
<stat_bar label="オブジェクトåˆè¨ˆ" name="objs"/>
<stat_bar label="æ–°è¦ã‚ªãƒ–ジェクト" name="newobjs"/>
</stat_view>
@@ -64,6 +64,14 @@
<stat_bar label="エージェント時間" name="simagentmsec"/>
<stat_bar label="イメージ時間" name="simimagesmsec"/>
<stat_bar label="スクリプト時間" name="simscriptmsec"/>
+ <stat_bar label="余暇" name="simsparemsec"/>
+ <stat_view label="時間ã®è©³ç´°ï¼ˆms)" name="timedetails">
+ <stat_bar label="物ç†åŠ¹æžœã®å˜ä½" name="simsimphysicsstepmsec"/>
+ <stat_bar label="物ç†å½¢çŠ¶ã‚’æ›´æ–°" name="simsimphysicsshapeupdatemsec"/>
+ <stat_bar label="ä»–ã®ç‰©ç†åŠ¹æžœ" name="simsimphysicsothermsec"/>
+ <stat_bar label="スリープ時間" name="simsleepmsec"/>
+ <stat_bar label="ãƒãƒ³ãƒ— I/O" name="simpumpiomsec"/>
+ </stat_view>
</stat_view>
</stat_view>
</container_view>
diff --git a/indra/newview/skins/default/xui/ja/floater_test_layout_stacks.xml b/indra/newview/skins/default/xui/ja/floater_test_layout_stacks.xml
new file mode 100644
index 0000000000..31b5bbd3bf
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_test_layout_stacks.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Test Floater" title="レイアウトスタックテスト"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_test_text_vertical_aligment.xml b/indra/newview/skins/default/xui/ja/floater_test_text_vertical_aligment.xml
new file mode 100644
index 0000000000..40fd8e9f93
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_test_text_vertical_aligment.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Test Floater" title="テスト用ウィンドウ"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_tools.xml b/indra/newview/skins/default/xui/ja/floater_tools.xml
index bbd78fb818..2d12a5e56a 100644
--- a/indra/newview/skins/default/xui/ja/floater_tools.xml
+++ b/indra/newview/skins/default/xui/ja/floater_tools.xml
@@ -1,5 +1,20 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="toolbox floater" short_title="制作ツール" title="">
+ <floater.string name="grid_screen_text">
+ ç”»é¢
+ </floater.string>
+ <floater.string name="grid_local_text">
+ ローカル
+ </floater.string>
+ <floater.string name="grid_world_text">
+ 世界
+ </floater.string>
+ <floater.string name="grid_reference_text">
+ リファレンス
+ </floater.string>
+ <floater.string name="grid_attachment_text">
+ アタッãƒãƒ¡ãƒ³ãƒˆ
+ </floater.string>
<floater.string name="status_rotate">
色ã®ä»˜ã„ãŸãƒãƒ³ãƒ‰ã‚’ドラッグã—ã¦ã‚ªãƒ–ジェクトを回転
</floater.string>
@@ -24,20 +39,11 @@
<floater.string name="status_selectland">
土地をクリックã—ã€ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦é¸æŠž
</floater.string>
- <floater.string name="grid_screen_text">
- ç”»é¢
+ <floater.string name="status_selectcount">
+ é¸æŠžã•ã‚Œã¦ã„るオブジェクト㯠[OBJ_COUNT] 個ã€åœŸåœ°ã®è² è·ã¯ [LAND_IMPACT]
</floater.string>
- <floater.string name="grid_local_text">
- ローカル
- </floater.string>
- <floater.string name="grid_world_text">
- インワールド
- </floater.string>
- <floater.string name="grid_reference_text">
- レファレンス
- </floater.string>
- <floater.string name="grid_attachment_text">
- アタッãƒãƒ¡ãƒ³ãƒˆ
+ <floater.string name="status_remaining_capacity">
+ 残りã®è¨±å®¹æ•° [LAND_CAPACITY]。
</floater.string>
<button label="" label_selected="" name="button focus" tool_tip="フォーカス"/>
<button label="" label_selected="" name="button move" tool_tip="å‹•ã‹ã™"/>
@@ -64,21 +70,20 @@
<radio_item label="é¢ã‚’é¸æŠž" name="radio select face"/>
</radio_group>
<check_box label="リンク部分を編集" name="checkbox edit linked parts"/>
- <text name="RenderingCost" tool_tip="ã“ã®ã‚ªãƒ–ジェクトã«ã‹ã‹ã‚‹ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ã‚³ã‚¹ãƒˆã‚’表示">
- þ: [COUNT]
- </text>
- <check_box label="" left="116" name="checkbox uniform"/>
+ <button label="リンク" name="link_btn"/>
+ <button label="リンクを外ã™" name="unlink_btn"/>
+ <check_box label="" name="checkbox uniform"/>
<text label="両å´ã‚’延ã°ã™" name="checkbox uniform label">
両å´ã‚’延ã°ã™
</text>
<check_box initial_value="true" label="テクスãƒãƒ£ã‚’引ã延ã°ã™" name="checkbox stretch textures"/>
- <check_box initial_value="true" label="グリッドã«ã‚¹ãƒŠãƒƒãƒ—" left_delta="27" name="checkbox snap to grid"/>
- <combo_box left_delta="60" name="combobox grid mode" tool_tip="オブジェクトã®é…ç½®ã«ä½¿ã†ã‚°ãƒªãƒƒãƒ‰ãƒ«ãƒ¼ãƒ©ã‚’é¸æŠžã—ã¾ã™" width="76">
- <combo_box.item label="インワールドグリッド" name="World"/>
- <combo_box.item label="ローカルグリッド" name="Local"/>
- <combo_box.item label="リファレンスグリッド" name="Reference"/>
+ <check_box initial_value="true" label="スナップ" name="checkbox snap to grid"/>
+ <combo_box name="combobox grid mode" tool_tip="オブジェクトã®é…ç½®ã«ä½¿ã†ã‚°ãƒªãƒƒãƒ‰ãƒ«ãƒ¼ãƒ©ã®ç¨®é¡žã‚’é¸æŠž">
+ <combo_box.item label="世界" name="World"/>
+ <combo_box.item label="ローカル" name="Local"/>
+ <combo_box.item label="リファレンス" name="Reference"/>
</combo_box>
- <button label="オプション" label_selected="オプション" name="Options..." tool_tip="グリッドオプションを表示ã—ã¾ã™"/>
+ <button label="" label_selected="オプション" name="Options..." tool_tip="グリッドオプションを表示ã—ã¾ã™"/>
<button label="" label_selected="" name="ToolCube" tool_tip="キューブ"/>
<button label="" label_selected="" name="ToolPrism" tool_tip="プリズム"/>
<button label="" label_selected="" name="ToolPyramid" tool_tip="ピラミッド"/>
@@ -117,13 +122,13 @@
強度
</text>
<button label="é©ç”¨" label_selected="é©ç”¨" name="button apply to selection" tool_tip="é¸æŠžã—ãŸåœŸåœ°ã‚’修正ã—ã¾ã™"/>
- <text name="obj_count">
- オブジェクト: [COUNT]
+ <text name="selection_empty">
+ 何もé¸æŠžã•ã‚Œã¦ã„ã¾ã›ã‚“。
</text>
- <text name="prim_count">
- プリム: [COUNT]
+ <text name="remaining_capacity">
+ [CAPACITY_STRING] [secondlife:///app/openfloater/object_weights 詳細]
</text>
- <tab_container name="Object Info Tabs" tab_max_width="150" tab_min_width="30">
+ <tab_container name="Object Info Tabs">
<panel label="一般" name="General">
<panel.string name="text deed continued">
譲渡
@@ -171,13 +176,13 @@
制作者:
</text>
<text name="Creator Name">
- Esbee Linden
+ Mrs. Esbee Linden (esbee.linden)
</text>
<text name="Owner:">
所有者:
</text>
<text name="Owner Name">
- Erica Linden
+ Mrs. Erica &quot;Moose&quot; Linden (erica.linden)
</text>
<text name="Group:">
グループ:
@@ -273,15 +278,6 @@
<combo_box.item label="リング" name="Ring"/>
<combo_box.item label="スカルプト" name="Sculpted"/>
</combo_box>
- <combo_box name="material">
- <combo_box.item label="石æ" name="Stone"/>
- <combo_box.item label="金属" name="Metal"/>
- <combo_box.item label="ガラス" name="Glass"/>
- <combo_box.item label="木æ" name="Wood"/>
- <combo_box.item label="肌" name="Flesh"/>
- <combo_box.item label="プラスãƒãƒƒã‚¯" name="Plastic"/>
- <combo_box.item label="ゴム" name="Rubber"/>
- </combo_box>
<text name="text cut">
パスカット(始点ã¨çµ‚点)
</text>
@@ -349,7 +345,6 @@
縫ã„ç›®ã®ã‚¿ã‚¤ãƒ—
</text>
<combo_box name="sculpt type control">
- <combo_box.item label="(ãªã—)" name="None"/>
<combo_box.item label="çƒä½“" name="Sphere"/>
<combo_box.item label="トーラス" name="Torus"/>
<combo_box.item label="å¹³é¢" name="Plane"/>
@@ -357,6 +352,15 @@
</combo_box>
</panel>
<panel label="特徴" name="Features">
+ <panel.string name="None">
+ ãªã—
+ </panel.string>
+ <panel.string name="Prim">
+ プリム
+ </panel.string>
+ <panel.string name="Convex Hull">
+ 凸状ã®å¤–殻構造
+ </panel.string>
<text name="select_single">
プリムを 1 ã¤ã ã‘é¸æŠžã—ã¦ç·¨é›†ã—ã¦ãã ã•ã„
</text>
@@ -364,23 +368,40 @@
オブジェクトã®ç‰¹å¾´ã‚’編集:
</text>
<check_box label="フレキシブルパス" name="Flexible1D Checkbox Ctrl" tool_tip="Z 軸を中心ã«ã‚ªãƒ–ジェクトã®å±ˆæ›²ã‚’有効ã«ã—ã¾ã™ï¼ˆã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆå´ã®ã¿ï¼‰"/>
- <spinner label="柔軟性" label_width="72" name="FlexNumSections" width="135"/>
- <spinner label="é‡åŠ›" label_width="72" name="FlexGravity" width="135"/>
- <spinner label="ドラッグ" label_width="72" name="FlexFriction" width="135"/>
- <spinner label="風" label_width="72" name="FlexWind" width="135"/>
- <spinner label="ç·Šå¼µ" label_width="72" name="FlexTension" width="135"/>
- <spinner label="X 軸方å‘ã®åŠ›" label_width="72" name="FlexForceX" width="135"/>
- <spinner label="Y 軸方å‘ã®åŠ›" label_width="72" name="FlexForceY" width="135"/>
- <spinner label="Z 軸方å‘ã®åŠ›" label_width="72" name="FlexForceZ" width="135"/>
+ <spinner label="柔軟性" name="FlexNumSections"/>
+ <spinner label="é‡åŠ›" name="FlexGravity"/>
+ <spinner label="ドラッグ" name="FlexFriction"/>
+ <spinner label="風" name="FlexWind"/>
+ <spinner label="ç·Šå¼µ" name="FlexTension"/>
+ <spinner label="X 軸方å‘ã®åŠ›" name="FlexForceX"/>
+ <spinner label="Y 軸方å‘ã®åŠ›" name="FlexForceY"/>
+ <spinner label="Z 軸方å‘ã®åŠ›" name="FlexForceZ"/>
<check_box label="å…‰" name="Light Checkbox Ctrl" tool_tip="オブジェクトãŒç™ºå…‰ã—ã¾ã™"/>
- <color_swatch label="" left_delta="74" name="colorswatch" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
+ <color_swatch label="" name="colorswatch" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
<texture_picker label="" name="light texture control" tool_tip="クリックã§æŠ•å½±ç”»ã‚’é¸æŠžã—ã¾ã™ï¼ˆé…延レンダリング有効時ã®ã¿ï¼‰"/>
- <spinner label="è¼åº¦" label_width="72" name="Light Intensity" width="135"/>
+ <spinner label="è¼åº¦" name="Light Intensity"/>
<spinner label="FOV" name="Light FOV"/>
- <spinner label="åŠå¾„" label_width="72" name="Light Radius" width="135"/>
+ <spinner label="åŠå¾„" name="Light Radius"/>
<spinner label="焦点" name="Light Focus"/>
- <spinner label="å¼±ã¾ã‚‹" label_width="72" name="Light Falloff" width="135"/>
+ <spinner label="å¼±ã¾ã‚‹" name="Light Falloff"/>
<spinner label="環境" name="Light Ambiance"/>
+ <text name="label physicsshapetype">
+ 実åƒã®ç¨®é¡žï¼š
+ </text>
+ <combo_box name="Physics Shape Type Combo Ctrl" tool_tip="実åƒã®ç¨®é¡žã‚’é¸æŠž"/>
+ <combo_box name="material">
+ <combo_box.item label="石" name="Stone"/>
+ <combo_box.item label="金属" name="Metal"/>
+ <combo_box.item label="ガラス" name="Glass"/>
+ <combo_box.item label="木" name="Wood"/>
+ <combo_box.item label="肌" name="Flesh"/>
+ <combo_box.item label="プラスãƒãƒƒã‚¯" name="Plastic"/>
+ <combo_box.item label="ゴム" name="Rubber"/>
+ </combo_box>
+ <spinner label="é‡åŠ›" name="Physics Gravity"/>
+ <spinner label="摩擦" name="Physics Friction"/>
+ <spinner label="密度(100 kg/m^3)" name="Physics Density"/>
+ <spinner label="復元" name="Physics Restitution"/>
</panel>
<panel label="æ質" name="Texture">
<panel.string name="string repeats per meter">
@@ -464,18 +485,18 @@
</panel>
</panel>
<panel label="中身" name="Contents">
- <button label="æ–°ã—ã„スクリプト" label_selected="æ–°è¦ã‚¹ã‚¯ãƒªãƒ—ト" name="button new script" width="120"/>
- <button label="権é™" left_delta="130" name="button permissions" width="80"/>
+ <button label="æ–°ã—ã„スクリプト" label_selected="æ–°è¦ã‚¹ã‚¯ãƒªãƒ—ト" name="button new script"/>
+ <button label="権é™" name="button permissions"/>
</panel>
</tab_container>
<panel name="land info panel">
<text name="label_parcel_info">
区画情報
</text>
- <text name="label_area_price" width="200">
+ <text name="label_area_price">
価格: [AREA] 平方メートル L$ [PRICE]
</text>
- <text name="label_area" width="200">
+ <text name="label_area">
é¢ç©ï¼š [AREA] 平方メートル
</text>
<button label="土地情報" label_selected="土地情報" name="button about land"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_toybox.xml b/indra/newview/skins/default/xui/ja/floater_toybox.xml
new file mode 100644
index 0000000000..682352ec82
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_toybox.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Toybox" title="ツールãƒãƒ¼ã®ãƒœã‚¿ãƒ³">
+ <text name="toybox label 1">
+ ボタンをツールãƒãƒ¼ã«è¿½åŠ ã¾ãŸã¯å‰Šé™¤ã™ã‚‹ã«ã¯ãƒœã‚¿ãƒ³ã‚’ドラッグã—ã¾ã™ã€‚
+ </text>
+ <text name="toybox label 2">
+ å„ツールãƒãƒ¼ã®è¨­å®šã«å¿œã˜ã¦ã€ãƒœã‚¿ãƒ³ã¯ä»¥ä¸‹ã®ã‚ˆã†ã«è¡¨ç¤ºã•ã‚ŒãŸã‚Šã€ã‚¢ã‚¤ã‚³ãƒ³ã®ã¿ã§è¡¨ç¤ºã•ã‚Œã¾ã™ã€‚
+ </text>
+ <button label="ツールãƒãƒ¼ã‚’å…¨ã¦ã‚¯ãƒªã‚¢" label_selected="ツールãƒãƒ¼ã‚’å…¨ã¦ã‚¯ãƒªã‚¢" name="btn_clear_all"/>
+ <button label="デフォルト設定を復元" label_selected="デフォルト設定を復元" name="btn_restore_defaults"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_translation_settings.xml b/indra/newview/skins/default/xui/ja/floater_translation_settings.xml
new file mode 100644
index 0000000000..27143086ac
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_translation_settings.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_translation_settings" title="ãƒãƒ£ãƒƒãƒˆã®ç¿»è¨³è¨­å®š">
+ <string name="bing_api_key_not_verified">
+ Bing appID ã‚’èªè¨¼ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
+ </string>
+ <string name="google_api_key_not_verified">
+ Google API キーをèªè¨¼ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
+ </string>
+ <string name="bing_api_key_verified">
+ Bing appID ãŒèªè¨¼ã•ã‚Œã¾ã—ãŸã€‚
+ </string>
+ <string name="google_api_key_verified">
+ Google API キーãŒèªè¨¼ã•ã‚Œã¾ã—ãŸã€‚
+ </string>
+ <check_box label="ãƒãƒ£ãƒƒãƒˆä¸­ã®æ©Ÿæ¢°ç¿»è¨³æ©Ÿèƒ½ã‚’有効ã«ã™ã‚‹" name="translate_chat_checkbox"/>
+ <text name="translate_language_label">
+ 翻訳ã™ã‚‹è¨€èªžï¼š
+ </text>
+ <combo_box name="translate_language_combo">
+ <combo_box.item label="システム標準" name="System Default Language"/>
+ <combo_box.item label="英語" name="English"/>
+ <combo_box.item label="Dansk(デンマーク語)" name="Danish"/>
+ <combo_box.item label="Deutsch(ドイツ語)" name="German"/>
+ <combo_box.item label="Español(スペイン語)" name="Spanish"/>
+ <combo_box.item label="Français(フランス語)" name="French"/>
+ <combo_box.item label="Italiano(イタリア語)" name="Italian"/>
+ <combo_box.item label="Magyar(ãƒãƒ³ã‚¬ãƒªãƒ¼èªžï¼‰" name="Hungarian"/>
+ <combo_box.item label="Nederlands(オランダ語)" name="Dutch"/>
+ <combo_box.item label="Polski(ãƒãƒ¼ãƒ©ãƒ³ãƒ‰èªžï¼‰" name="Polish"/>
+ <combo_box.item label="Português(ãƒãƒ«ãƒˆã‚¬ãƒ«èªžï¼‰" name="Portugese"/>
+ <combo_box.item label="РуÑÑкий(ロシア語)" name="Russian"/>
+ <combo_box.item label="Türkçe(トルコ語)" name="Turkish"/>
+ <combo_box.item label="УкраїнÑька (ウクライナ語)" name="Ukrainian"/>
+ <combo_box.item label="中文 (正體) (中国語)" name="Chinese"/>
+ <combo_box.item label="日本語(日本語)" name="Japanese"/>
+ <combo_box.item label="한국어(韓国語)" name="Korean"/>
+ </combo_box>
+ <text name="tip">
+ 翻訳サービスをé¸æŠžã—ã¦ãã ã•ã„:
+ </text>
+ <radio_group name="translation_service_rg">
+ <radio_item initial_value="bing" label="Bing Translator" name="bing"/>
+ <radio_item initial_value="google" label="Google Translate" name="google"/>
+ </radio_group>
+ <text name="bing_api_key_label">
+ Bing AppID [http://www.bing.com/developers/createapp.aspx AppID]:
+ </text>
+ <button label="èªè¨¼" name="verify_bing_api_key_btn"/>
+ <text name="google_api_key_label">
+ Google API key [http://code.google.com/apis/language/translate/v2/getting_started.html#auth API key]:
+ </text>
+ <button label="èªè¨¼" name="verify_google_api_key_btn"/>
+ <text name="google_links_text">
+ [http://code.google.com/apis/language/translate/v2/pricing.html 価格] | [https://code.google.com/apis/console 統計]
+ </text>
+ <button label="OK" name="ok_btn"/>
+ <button label="å–り消ã—" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_voice_controls.xml b/indra/newview/skins/default/xui/ja/floater_voice_controls.xml
index 0caca22bc1..f7d3fd11e0 100644
--- a/indra/newview/skins/default/xui/ja/floater_voice_controls.xml
+++ b/indra/newview/skins/default/xui/ja/floater_voice_controls.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_voice_controls" title="ボイスコントロール">
<string name="title_nearby">
- è¿‘ãã®ãƒœã‚¤ã‚¹
+ ボイス設定
</string>
<string name="title_group">
[GROUP] ã¨ã‚°ãƒ«ãƒ¼ãƒ—コール
@@ -10,7 +10,7 @@
コンファレンスコール
</string>
<string name="title_peer_2_peer">
- [NAME] ã§ã‚³ãƒ¼ãƒ«
+ [NAME] ã¨ã‚³ãƒ¼ãƒ«
</string>
<string name="no_one_near">
è¿‘ãã«ãƒœã‚¤ã‚¹ã‚’有効ã«ã—ã¦ã„る人ã¯ã„ã¾ã›ã‚“。
@@ -19,7 +19,7 @@
<layout_panel name="my_panel">
<text name="user_text" value="マイ ã‚¢ãƒã‚¿ãƒ¼ï¼š"/>
</layout_panel>
- <layout_panel name="leave_call_panel">
+ <layout_panel name="leave_call_panel">
<layout_stack name="voice_effect_and_leave_call_stack">
<layout_panel name="leave_call_btn_panel">
<button label="コール終了" name="leave_call_btn"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_voice_effect.xml b/indra/newview/skins/default/xui/ja/floater_voice_effect.xml
index 4557815129..ee675e143b 100644
--- a/indra/newview/skins/default/xui/ja/floater_voice_effect.xml
+++ b/indra/newview/skins/default/xui/ja/floater_voice_effect.xml
@@ -12,6 +12,135 @@
<string name="new_voice_effect">
(新登場ï¼ï¼‰
</string>
+ <string name="effect_Arena">
+ アリーナ
+ </string>
+ <string name="effect_Beast">
+ 野ç£
+ </string>
+ <string name="effect_Buff">
+ ãŒã£ã—ã‚Š
+ </string>
+ <string name="effect_Buzz">
+ ブザー
+ </string>
+ <string name="effect_Camille">
+ カミール
+ </string>
+ <string name="effect_Creepy">
+ 気味ã®æ‚ªã„
+ </string>
+ <string name="effect_CreepyBot">
+ 気味ã‚るボット
+ </string>
+ <string name="effect_Cyber">
+ サイãƒãƒ¼
+ </string>
+ <string name="effect_DeepBot">
+ ディープボット
+ </string>
+ <string name="effect_Demon">
+ デーモン
+ </string>
+ <string name="effect_Female Elf">
+ 女性ã®ã‚¨ãƒ«ãƒ•
+ </string>
+ <string name="effect_Flirty">
+ æ°—ã®ã‚ã‚Šãã†ãª
+ </string>
+ <string name="effect_Foxy">
+ 魅惑的
+ </string>
+ <string name="effect_Halloween 2010 Bonus">
+ ãƒãƒ­ã‚¦ã‚£ãƒ³_2010_ボーナス
+ </string>
+ <string name="effect_Helium">
+ ヘリウム
+ </string>
+ <string name="effect_Husky">
+ ãƒã‚¹ã‚­ãƒ¼
+ </string>
+ <string name="effect_Husky Whisper">
+ スモーキーウィスパー
+ </string>
+ <string name="effect_Intercom">
+ インターホン
+ </string>
+ <string name="effect_Julia">
+ ジュリア
+ </string>
+ <string name="effect_Lo Lilt">
+ 軽快
+ </string>
+ <string name="effect_Macho">
+ マッãƒãƒ§
+ </string>
+ <string name="effect_Micro">
+ ミクロ
+ </string>
+ <string name="effect_Mini">
+ ミニ
+ </string>
+ <string name="effect_Model">
+ モデル
+ </string>
+ <string name="effect_Nano">
+ ナノ
+ </string>
+ <string name="effect_Nightmare">
+ 悪夢
+ </string>
+ <string name="effect_PopBot">
+ ãƒãƒƒãƒ—ボット
+ </string>
+ <string name="effect_Rachel">
+ レイãƒã‚§ãƒ«
+ </string>
+ <string name="effect_Radio">
+ ラジオ
+ </string>
+ <string name="effect_Robot">
+ ロボット
+ </string>
+ <string name="effect_Roxanne">
+ ロクサン
+ </string>
+ <string name="effect_Rumble">
+ ランブル
+ </string>
+ <string name="effect_Sabrina">
+ サブリナ
+ </string>
+ <string name="effect_Samantha">
+ サマンサ
+ </string>
+ <string name="effect_Sexy">
+ セクシー
+ </string>
+ <string name="effect_Shorty">
+ ãƒãƒ“
+ </string>
+ <string name="effect_Smaller">
+ å°ã•ã‚
+ </string>
+ <string name="effect_Sneaky">
+ コソコソ
+ </string>
+ <string name="effect_Stallion">
+ 雄馬
+ </string>
+ <string name="effect_Sultry">
+ 艶ã‹ã—ã„
+ </string>
+ <string name="effect_Thunder">
+ サンダー
+ </string>
+ <string name="effect_Vixen">
+ 性悪ãª
+ </string>
+ <string name="effect_WhinyBot">
+ ä¸æ©Ÿå«Œãƒœãƒƒãƒˆ
+ </string>
<text name="preview_text">
プレビュー
</text>
diff --git a/indra/newview/skins/default/xui/ja/floater_water.xml b/indra/newview/skins/default/xui/ja/floater_water.xml
deleted file mode 100644
index fb64332e79..0000000000
--- a/indra/newview/skins/default/xui/ja/floater_water.xml
+++ /dev/null
@@ -1,70 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Water Floater" title="æ°´ã®é«˜åº¦ãªç·¨é›†">
- <floater.string name="WLDefaultWaterNames">
- Default:Glassy:Pond:Murky:Second Plague:SNAKE!!!:Valdez
- </floater.string>
- <text name="KeyFramePresetsText">
- æ°´ã®äº‹å‰è¨­å®šï¼š
- </text>
- <button label="æ–°è¦" label_selected="æ–°è¦" name="WaterNewPreset"/>
- <button label="ä¿å­˜" label_selected="ä¿å­˜" name="WaterSavePreset"/>
- <button label="削除" label_selected="削除" name="WaterDeletePreset"/>
- <tab_container name="Water Tabs">
- <panel label="設定" name="Settings">
- <text name="BHText">
- 水中ã®ãƒ•ã‚©ã‚°åŠ¹æžœã®è‰²
- </text>
- <color_swatch name="WaterFogColor" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
- <text name="WaterFogDensText">
- 水中ã®é€æ˜Žåº¦æŒ‡æ•°
- </text>
- <text name="WaterUnderWaterFogModText">
- 水中ã®ãƒ•ã‚©ã‚°åŠ¹æžœåŠ æ¸›
- </text>
- <text name="BDensText">
- ã•ã–æ³¢ã®å射スケール
- </text>
- <slider label="1" name="WaterNormalScaleX"/>
- <slider label="2" name="WaterNormalScaleY"/>
- <slider label="3" name="WaterNormalScaleZ"/>
- <text name="HDText">
- フレãƒãƒ«ã®ã‚¹ã‚±ãƒ¼ãƒ«
- </text>
- <text name="FresnelOffsetText">
- フレãƒãƒ«ã®ã‚ªãƒ•ã‚»ãƒƒãƒˆ
- </text>
- <text name="DensMultText">
- æ°´é¢ã®å±ˆæŠ˜ã‚¹ã‚±ãƒ¼ãƒ«
- </text>
- <text name="WaterScaleBelowText">
- 水中ã®å±ˆæŠ˜ã‚¹ã‚±ãƒ¼ãƒ«
- </text>
- <text name="MaxAltText">
- ä¸é€æ˜Žåº¦ã®å¢—å¹…
- </text>
- </panel>
- <panel label="ç”»åƒ" name="Waves">
- <text name="BHText">
- 大波ã®æ–¹å‘
- </text>
- <text name="WaterWave1DirXText">
- X
- </text>
- <text name="WaterWave1DirYText">
- Y
- </text>
- <text name="BHText2">
- å°æ³¢ã®æ–¹å‘
- </text>
- <text name="WaterWave2DirXText">
- X
- </text>
- <text name="WaterWave2DirYText">
- Y
- </text>
- <text name="BHText3">
- ノーマルマップ
- </text>
- </panel>
- </tab_container>
-</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_wearable_save_as.xml b/indra/newview/skins/default/xui/ja/floater_wearable_save_as.xml
deleted file mode 100644
index de8b590a80..0000000000
--- a/indra/newview/skins/default/xui/ja/floater_wearable_save_as.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="modal container" title=" ">
- <button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
- <button label="å–り消ã—" label_selected="å–り消ã—" name="Cancel"/>
- <text name="Save item as:">
- アイテムを別åã§æŒã¡ç‰©ã«ä¿å­˜ï¼š
- </text>
- <line_editor name="name ed">
- New [DESC]
- </line_editor>
-</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_web_content.xml b/indra/newview/skins/default/xui/ja/floater_web_content.xml
new file mode 100644
index 0000000000..48fe8aee78
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_web_content.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_web_content" title="">
+ <layout_stack name="stack1">
+ <layout_panel name="nav_controls">
+ <button name="back" tool_tip="å‰ã¸"/>
+ <button name="forward" tool_tip="次ã¸"/>
+ <button name="stop" tool_tip="ナビゲーションをåœæ­¢"/>
+ <button name="reload" tool_tip="ページを更新"/>
+ <combo_box name="address" tool_tip="ã“ã“ã« URL を入力"/>
+ <icon name="media_secure_lock_flag" tool_tip="安全ãªé–²è¦§"/>
+ <button name="popexternal" tool_tip="ã“ã® URL をブラウザã§é–‹ã"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_windlight_options.xml b/indra/newview/skins/default/xui/ja/floater_windlight_options.xml
deleted file mode 100644
index feb94ef73e..0000000000
--- a/indra/newview/skins/default/xui/ja/floater_windlight_options.xml
+++ /dev/null
@@ -1,189 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="WindLight floater" title="空ã®é«˜åº¦ãªç·¨é›†">
- <text name="KeyFramePresetsText">
- 空ã®äº‹å‰è¨­å®šï¼š
- </text>
- <button label="æ–°è¦" label_selected="æ–°è¦" name="WLNewPreset"/>
- <button label="ä¿å­˜" label_selected="ä¿å­˜" name="WLSavePreset"/>
- <button label="削除" label_selected="削除" name="WLDeletePreset"/>
- <button label="デイサイクル編集" label_selected="デイサイクル編集" name="WLDayCycleMenuButton"/>
- <tab_container name="WindLight Tabs">
- <panel label="大気" name="Atmosphere">
- <text name="BHText">
- 空ã®é…色
- </text>
- <button label="?" name="WLBlueHorizonHelp"/>
- <text name="BHText2">
- R
- </text>
- <text name="BHText3">
- G
- </text>
- <text name="BHText4">
- B
- </text>
- <text name="BHText5">
- I
- </text>
- <text name="BDensText">
- 空ã¨é æ™¯ã®éœ²å…‰
- </text>
- <button label="?" name="WLHazeHorizonHelp"/>
- <text name="BDensText2">
- 空ã®é…色ã¨æ¿ƒåº¦
- </text>
- <button label="?" name="WLBlueDensityHelp"/>
- <text name="BHText6">
- R
- </text>
- <text name="BHText7">
- G
- </text>
- <text name="BHText8">
- B
- </text>
- <text name="BHText9">
- I
- </text>
- <text name="HDText">
- 大気ã®ä¸é€æ˜Žåº¦
- </text>
- <button label="?" name="WLHazeDensityHelp"/>
- <text name="DensMultText">
- 大気ã®ä¸é€æ˜Žåº¦ã®å¢—å¹…
- </text>
- <button label="?" name="WLDensityMultHelp"/>
- <text name="WLDistanceMultText">
- 視界ã®å¢—å¹…
- </text>
- <button label="?" name="WLDistanceMultHelp"/>
- <text name="MaxAltText">
- 最大高度
- </text>
- <button label="?" name="WLMaxAltitudeHelp"/>
- </panel>
- <panel label="ライティング" name="Lighting">
- <text name="SLCText">
- 太陽/月ã®è‰²
- </text>
- <button label="?" name="WLSunlightColorHelp"/>
- <text name="BHText">
- R
- </text>
- <text name="BHText2">
- G
- </text>
- <text name="BHText3">
- B
- </text>
- <text name="BHText4">
- I
- </text>
- <text name="TODText">
- 太陽/月ã®ä½ç½®
- </text>
- <button label="?" name="WLTimeOfDayHelp"/>
- <text name="WLAmbientText">
- アンビエント
- </text>
- <button label="?" name="WLAmbientHelp"/>
- <text name="BHText5">
- R
- </text>
- <text name="BHText6">
- G
- </text>
- <text name="BHText7">
- B
- </text>
- <text name="BHText8">
- I
- </text>
- <text name="WLEastAngleText">
- æ±ã®è§’度
- </text>
- <button label="?" name="WLEastAngleHelp"/>
- <text name="SunGlowText">
- 太陽ã®è¼ã
- </text>
- <button label="?" name="WLSunGlowHelp"/>
- <slider label="フォーカス " name="WLGlowB"/>
- <slider label="サイズ " name="WLGlowR"/>
- <text name="SceneGammaText">
- 風景ガンマ
- </text>
- <button label="?" name="WLSceneGammaHelp"/>
- <text name="WLStarText">
- 星ã®è¼ã
- </text>
- <button label="?" name="WLStarBrightnessHelp"/>
- </panel>
- <panel label="雲" name="Clouds">
- <text name="WLCloudColorText">
- 雲ã®è‰²
- </text>
- <button label="?" name="WLCloudColorHelp"/>
- <text name="BHText">
- R
- </text>
- <text name="BHText2">
- G
- </text>
- <text name="BHText3">
- B
- </text>
- <text name="BHText4">
- I
- </text>
- <text name="WLCloudColorText2">
- 雲㮠XY/密度
- </text>
- <button label="?" name="WLCloudDensityHelp"/>
- <text name="BHText5">
- X
- </text>
- <text name="BHText6">
- Y
- </text>
- <text name="BHText7">
- D
- </text>
- <text name="WLCloudCoverageText">
- 雲ã®é‡
- </text>
- <button label="?" name="WLCloudCoverageHelp"/>
- <text name="WLCloudScaleText">
- 雲ã®ã‚¹ã‚±ãƒ¼ãƒ«
- </text>
- <button label="?" name="WLCloudScaleHelp"/>
- <text name="WLCloudDetailText">
- 雲ã®è©³ç´° (XY/密度)
- </text>
- <button label="?" name="WLCloudDetailHelp"/>
- <text name="BHText8">
- X
- </text>
- <text name="BHText9">
- Y
- </text>
- <text name="BHText10">
- D
- </text>
- <text name="WLCloudScrollXText">
- 雲ã®ç§»å‹•é€Ÿåº¦ (X æ–¹å‘)
- </text>
- <button label="?" name="WLCloudScrollXHelp"/>
- <check_box label="ロック" name="WLCloudLockX"/>
- <text name="WLCloudScrollYText">
- 雲ã®ç§»å‹•é€Ÿåº¦ (Y æ–¹å‘)
- </text>
- <button label="?" name="WLCloudScrollYHelp"/>
- <check_box label="ロック" name="WLCloudLockY"/>
- <check_box label="従æ¥ã®é›²ã‚’æç”»" name="DrawClassicClouds"/>
- <button label="?" name="WLClassicCloudsHelp"/>
- </panel>
- </tab_container>
- <string name="WLDefaultSkyNames">
- A-12AM:A-12PM:A-3AM:A-3PM:A-4.30PM:A-6AM:A-6PM:A-9AM:A-9PM:Barcelona:Blizzard:Blue Midday:Coastal Afternoon:Coastal Sunset:Default:Desert Sunset:Fine Day:Fluffy Big Clouds:Foggy:Funky Funky:Funky Funky Funky:Gelatto:Ghost:Incongruent Truths:Midday 1:Midday 2:Midday 3:Midday 4:Night:Pirate:Purple:Sailor&apos;s Delight:Sheer Sensuality
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/ja/inspect_avatar.xml b/indra/newview/skins/default/xui/ja/inspect_avatar.xml
index fb4937242b..42b67cd333 100644
--- a/indra/newview/skins/default/xui/ja/inspect_avatar.xml
+++ b/indra/newview/skins/default/xui/ja/inspect_avatar.xml
@@ -10,10 +10,11 @@
<string name="Details">
[SL_PROFILE]
</string>
- <text name="user_name" value="Grumpity ProductEngine"/>
+ <text name="user_name_small" value="Grumpity ProductEngine with a long name"/>
+ <text name="user_slid" value="james.linden"/>
<text name="user_subtitle" value="11 Months, 3 days old"/>
<text name="user_details">
- This is my second life description and I really think it is great.
+ This is my second life description and I really think it is great.But for some reason my description is super extra long because I like to talk a whole lot
</text>
<slider name="volume_slider" tool_tip="ボイス音é‡" value="0.5"/>
<button label="フレンド登録" name="add_friend_btn"/>
diff --git a/indra/newview/skins/default/xui/ja/inspect_group.xml b/indra/newview/skins/default/xui/ja/inspect_group.xml
index b461b93f65..be628befdf 100644
--- a/indra/newview/skins/default/xui/ja/inspect_group.xml
+++ b/indra/newview/skins/default/xui/ja/inspect_group.xml
@@ -16,9 +16,6 @@
<string name="YouAreMember">
ã‚ãªãŸã¯ãƒ¡ãƒ³ãƒãƒ¼ã§ã™
</string>
- <text name="group_name">
- Grumpity&apos;s Grumpy Group of Moose
- </text>
<text name="group_subtitle">
123 メートル
</text>
diff --git a/indra/newview/skins/default/xui/ja/language_settings.xml b/indra/newview/skins/default/xui/ja/language_settings.xml
index a6023f9b56..91e8f4be7c 100644
--- a/indra/newview/skins/default/xui/ja/language_settings.xml
+++ b/indra/newview/skins/default/xui/ja/language_settings.xml
@@ -4,6 +4,7 @@
<!-- Locale Information -->
<string name="MicrosoftLocale">japanese</string>
+ <string name="MacLocale">ja_JP.UTF-8</string>
<string name="DarwinLocale">ja_JP.UTF-8</string>
<string name="LinuxLocale">ja_JP.UTF-8</string>
diff --git a/indra/newview/skins/default/xui/ja/menu_attachment_self.xml b/indra/newview/skins/default/xui/ja/menu_attachment_self.xml
index 5d95949189..6036e1075e 100644
--- a/indra/newview/skins/default/xui/ja/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/ja/menu_attachment_self.xml
@@ -5,7 +5,7 @@
<menu_item_call label="å–り外ã™" name="Detach"/>
<menu_item_call label="座る" name="Sit Down Here"/>
<menu_item_call label="ç«‹ã¡ä¸ŠãŒã‚‹" name="Stand Up"/>
- <menu_item_call label="アウトフィットを変更" name="Change Outfit"/>
+ <menu_item_call label="容姿" name="Change Outfit"/>
<menu_item_call label="アウトフィットã®ç·¨é›†" name="Edit Outfit"/>
<menu_item_call label="シェイプã®ç·¨é›†" name="Edit My Shape"/>
<menu_item_call label="フレンド" name="Friends..."/>
diff --git a/indra/newview/skins/default/xui/ja/menu_avatar_self.xml b/indra/newview/skins/default/xui/ja/menu_avatar_self.xml
index fc9c8caf51..4709522665 100644
--- a/indra/newview/skins/default/xui/ja/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/ja/menu_avatar_self.xml
@@ -14,6 +14,7 @@
<menu_item_call label="下ç€ã‚·ãƒ£ãƒ„" name="Self Undershirt"/>
<menu_item_call label="下ç€ãƒ‘ンツ" name="Self Underpants"/>
<menu_item_call label="タトゥ" name="Self Tattoo"/>
+ <menu_item_call label="物ç†ä½œç”¨" name="Self Physics"/>
<menu_item_call label="アルファ" name="Self Alpha"/>
<menu_item_call label="ã™ã¹ã¦ã®è¡£é¡ž" name="All Clothes"/>
</context_menu>
@@ -21,7 +22,7 @@
<context_menu label="å–り外ã™" name="Object Detach"/>
<menu_item_call label="ã™ã¹ã¦å–り外ã™" name="Detach All"/>
</context_menu>
- <menu_item_call label="アウトフィットを変更" name="Chenge Outfit"/>
+ <menu_item_call label="容姿" name="Chenge Outfit"/>
<menu_item_call label="アウトフィットを編集" name="Edit Outfit"/>
<menu_item_call label="シェイプを編集" name="Edit My Shape"/>
<menu_item_call label="フレンド" name="Friends..."/>
diff --git a/indra/newview/skins/default/xui/ja/menu_bottomtray.xml b/indra/newview/skins/default/xui/ja/menu_bottomtray.xml
index e5703c559b..7f106c1ab5 100644
--- a/indra/newview/skins/default/xui/ja/menu_bottomtray.xml
+++ b/indra/newview/skins/default/xui/ja/menu_bottomtray.xml
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="hide_camera_move_controls_menu">
+ <menu_item_check label="スピーカーボタン" name="EnableVoiceChat"/>
<menu_item_check label="ジェスãƒãƒ£ãƒ¼ãƒœã‚¿ãƒ³" name="ShowGestureButton"/>
<menu_item_check label="移動ボタン" name="ShowMoveButton"/>
<menu_item_check label="視界ボタン" name="ShowCameraButton"/>
<menu_item_check label="スナップショットボタン" name="ShowSnapshotButton"/>
- <menu_item_check label="サイドãƒãƒ¼ãƒœã‚¿ãƒ³" name="ShowSidebarButton"/>
<menu_item_check label="制作ボタン" name="ShowBuildButton"/>
<menu_item_check label="検索ボタン" name="ShowSearchButton"/>
<menu_item_check label="地図ボタン" name="ShowWorldMapButton"/>
diff --git a/indra/newview/skins/default/xui/ja/menu_hide_navbar.xml b/indra/newview/skins/default/xui/ja/menu_hide_navbar.xml
index 3a1ae49700..2e633ae1b2 100644
--- a/indra/newview/skins/default/xui/ja/menu_hide_navbar.xml
+++ b/indra/newview/skins/default/xui/ja/menu_hide_navbar.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="hide_navbar_menu">
- <menu_item_check label="ナビゲーションãƒãƒ¼ã‚’表示" name="ShowNavbarNavigationPanel"/>
+ <menu_item_check label="ナビゲーションãƒãƒ¼ã¨ãŠæ°—ã«å…¥ã‚Šãƒãƒ¼ã‚’表示" name="ShowNavbarNavigationPanel"/>
<menu_item_check label="ãŠæ°—ã«å…¥ã‚Šãƒãƒ¼ã‚’表示" name="ShowNavbarFavoritesPanel"/>
<menu_item_check label="「場所ã€ã®ãƒŸãƒ‹ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã‚’表示" name="ShowMiniLocationPanel"/>
</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/ja/menu_inspect_avatar_gear.xml
index 5fdaa9ae6b..9d0d0f10a6 100644
--- a/indra/newview/skins/default/xui/ja/menu_inspect_avatar_gear.xml
+++ b/indra/newview/skins/default/xui/ja/menu_inspect_avatar_gear.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<menu name="Gear Menu">
+<toggleable_menu name="Gear Menu">
<menu_item_call label="プロフィールã®è¡¨ç¤º" name="view_profile"/>
<menu_item_call label="フレンド登録" name="add_friend"/>
<menu_item_call label="IM" name="im"/>
@@ -11,9 +11,11 @@
<menu_item_call label="報告" name="report"/>
<menu_item_call label="フリーズ" name="freeze"/>
<menu_item_call label="追放" name="eject"/>
+ <menu_item_call label="追放" name="kick"/>
+ <menu_item_call label="CSR" name="csr"/>
<menu_item_call label="テクスãƒãƒ£ã®ãƒ‡ãƒãƒƒã‚°" name="debug"/>
<menu_item_call label="地図ã§æŽ¢ã™" name="find_on_map"/>
<menu_item_call label="ズームイン" name="zoom_in"/>
<menu_item_call label="支払ã†" name="pay"/>
<menu_item_call label="共有" name="share"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_inspect_object_gear.xml b/indra/newview/skins/default/xui/ja/menu_inspect_object_gear.xml
index 2edade70bf..5a0519ba19 100644
--- a/indra/newview/skins/default/xui/ja/menu_inspect_object_gear.xml
+++ b/indra/newview/skins/default/xui/ja/menu_inspect_object_gear.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<menu name="Gear Menu">
+<toggleable_menu name="Gear Menu">
<menu_item_call label="触る" name="touch"/>
<menu_item_call label="座る" name="sit"/>
<menu_item_call label="支払ã†" name="pay"/>
@@ -12,7 +12,8 @@
<menu_item_call label="追加" name="add"/>
<menu_item_call label="報告" name="report"/>
<menu_item_call label="ブロック" name="block"/>
+ <menu_item_call label="ブロック解除" name="unblock"/>
<menu_item_call label="ズームイン" name="zoom_in"/>
<menu_item_call label="削除" name="remove"/>
<menu_item_call label="詳細" name="more_info"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/ja/menu_inspect_self_gear.xml
index 90b3efd144..e3e206f3aa 100644
--- a/indra/newview/skins/default/xui/ja/menu_inspect_self_gear.xml
+++ b/indra/newview/skins/default/xui/ja/menu_inspect_self_gear.xml
@@ -1,10 +1,31 @@
-<?xml version="1.0" encoding="utf-8"?>
-<menu name="Gear Menu">
- <menu_item_call label="座る" name="sit_down_here"/>
- <menu_item_call label="ç«‹ã¡ä¸ŠãŒã‚‹" name="stand_up"/>
- <menu_item_call label="アウトフィットを変更" name="change_outfit"/>
- <menu_item_call label="プロフィール" name="my_profile"/>
- <menu_item_call label="フレンド" name="my_friends"/>
- <menu_item_call label="グループ" name="my_groups"/>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Gear Menu">
+ <menu_item_call label="座る" name="Sit Down Here"/>
+ <menu_item_call label="ç«‹ã¡ä¸ŠãŒã‚‹" name="Stand Up"/>
+ <context_menu label="å–り外ã™" name="Take Off &gt;">
+ <context_menu label="衣類" name="Clothes &gt;">
+ <menu_item_call label="シャツ" name="Shirt"/>
+ <menu_item_call label="パンツ" name="Pants"/>
+ <menu_item_call label="スカート" name="Skirt"/>
+ <menu_item_call label="é´" name="Shoes"/>
+ <menu_item_call label="é´ä¸‹" name="Socks"/>
+ <menu_item_call label="ジャケット" name="Jacket"/>
+ <menu_item_call label="手袋" name="Gloves"/>
+ <menu_item_call label="下ç€ã‚·ãƒ£ãƒ„" name="Self Undershirt"/>
+ <menu_item_call label="下ç€ãƒ‘ンツ" name="Self Underpants"/>
+ <menu_item_call label="タトゥ" name="Self Tattoo"/>
+ <menu_item_call label="アルファ" name="Self Alpha"/>
+ <menu_item_call label="ã™ã¹ã¦ã®è¡£é¡ž" name="All Clothes"/>
+ </context_menu>
+ <context_menu label="HUD" name="Object Detach HUD"/>
+ <context_menu label="å–り外ã™" name="Object Detach"/>
+ <menu_item_call label="ã™ã¹ã¦å–り外ã™" name="Detach All"/>
+ </context_menu>
+ <menu_item_call label="アウトフィットã®å¤‰æ›´" name="Chenge Outfit"/>
+ <menu_item_call label="アウトフィットã®ç·¨é›†" name="Edit Outfit"/>
+ <menu_item_call label="シェイプã®ç·¨é›†" name="Edit My Shape"/>
+ <menu_item_call label="フレンド" name="Friends..."/>
+ <menu_item_call label="グループ" name="Groups..."/>
+ <menu_item_call label="プロフィール" name="Profile..."/>
<menu_item_call label="テクスãƒãƒ£ã®ãƒ‡ãƒãƒƒã‚°" name="Debug..."/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_inventory.xml b/indra/newview/skins/default/xui/ja/menu_inventory.xml
index 6999f9a3f3..d1893a0fc8 100644
--- a/indra/newview/skins/default/xui/ja/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/ja/menu_inventory.xml
@@ -25,6 +25,7 @@
<menu_item_call label="æ–°ã—ã„パンツ" name="New Underpants"/>
<menu_item_call label="æ–°ã—ã„アルファマスク" name="New Alpha Mask"/>
<menu_item_call label="æ–°ã—ã„タトゥ" name="New Tattoo"/>
+ <menu_item_call label="æ–°è¦ã®ç‰©ç†ä½œç”¨" name="New Physics"/>
</menu>
<menu label="æ–°ã—ã„身体部ä½" name="New Body Parts">
<menu_item_call label="æ–°ã—ã„シェイプ(体型)" name="New Shape"/>
@@ -58,6 +59,7 @@
<menu_item_call label="プロパティ" name="Properties"/>
<menu_item_call label="åå‰ã‚’変更ã™ã‚‹" name="Rename"/>
<menu_item_call label="UUID をコピーã™ã‚‹" name="Copy Asset UUID"/>
+ <menu_item_call label="カット" name="Cut"/>
<menu_item_call label="コピー" name="Copy"/>
<menu_item_call label="貼り付ã‘" name="Paste"/>
<menu_item_call label="リンクを貼り付ã‘ã‚‹" name="Paste As Link"/>
@@ -82,5 +84,7 @@
<menu_item_call label="編集" name="Wearable Edit"/>
<menu_item_call label="追加" name="Wearable Add"/>
<menu_item_call label="å–り外ã™" name="Take Off"/>
+ <menu_item_call label="マーãƒãƒ£ãƒ³ãƒˆã®ã‚¢ã‚¦ãƒˆãƒœãƒƒã‚¯ã‚¹ã«ã‚³ãƒ”ー" name="Merchant Copy"/>
+ <menu_item_call label="マーケットプレイスã«é€ä¿¡" name="Marketplace Send"/>
<menu_item_call label="ï¼ï¼ã‚ªãƒ—ションãªã—ï¼ï¼" name="--no options--"/>
</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_inventory_add.xml b/indra/newview/skins/default/xui/ja/menu_inventory_add.xml
index 42dcd06a07..ae5ddbb78f 100644
--- a/indra/newview/skins/default/xui/ja/menu_inventory_add.xml
+++ b/indra/newview/skins/default/xui/ja/menu_inventory_add.xml
@@ -4,6 +4,8 @@
<menu_item_call label="ç”»åƒ ï¼ˆL$ [COST] )..." name="Upload Image"/>
<menu_item_call label="サウンド (L$[COST] )..." name="Upload Sound"/>
<menu_item_call label="アニメーション (L$ [COST] )..." name="Upload Animation"/>
+ <menu_item_call label="モデル" name="Upload Model"/>
+ <menu_item_call label="モデルウィザード" name="Upload Model Wizard"/>
<menu_item_call label="一括 (ファイルã«ã¤ã L$[COST] )..." name="Bulk Upload"/>
<menu_item_call label="デフォルトã®ã‚¢ãƒƒãƒ—ロード権é™ã‚’設定" name="perm prefs"/>
</menu>
@@ -23,6 +25,7 @@
<menu_item_call label="æ–°ã—ã„下ç€ï¼ˆä¸‹ï¼‰" name="New Underpants"/>
<menu_item_call label="æ–°ã—ã„アルファ" name="New Alpha"/>
<menu_item_call label="æ–°ã—ã„タトゥー" name="New Tattoo"/>
+ <menu_item_call label="æ–°è¦ã®ç‰©ç†ä½œç”¨" name="New Physics"/>
</menu>
<menu label="æ–°ã—ã„身体部ä½" name="New Body Parts">
<menu_item_call label="æ–°ã—ã„シェイプ(体型)" name="New Shape"/>
diff --git a/indra/newview/skins/default/xui/ja/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/ja/menu_inventory_gear_default.xml
index f0e5e936ca..f38dbc71a8 100644
--- a/indra/newview/skins/default/xui/ja/menu_inventory_gear_default.xml
+++ b/indra/newview/skins/default/xui/ja/menu_inventory_gear_default.xml
@@ -1,8 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_gear_default">
- <menu_item_call label="æ–°ã—ã„æŒã¡ç‰©ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" name="new_window"/>
- <menu_item_call label="åå‰ã§ä¸¦ã¹æ›¿ãˆ" name="sort_by_name"/>
- <menu_item_call label="æ–°ã—ã„é †ã«ä¸¦ã¹æ›¿ãˆ" name="sort_by_recent"/>
+<toggleable_menu name="menu_gear_default">
+ <menu_item_call label="æ–°ã—ã„インベントリウィンドウ" name="new_window"/>
+ <menu_item_check label="åå‰ã§ä¸¦ã¹æ›¿ãˆ" name="sort_by_name"/>
+ <menu_item_check label="æ–°ã—ã„é †ã«ä¸¦ã¹æ›¿ãˆ" name="sort_by_recent"/>
+ <menu_item_check label="フォルダを常ã«åå‰é †ã«ä¸¦ã¹ã‚‹" name="sort_folders_by_name"/>
+ <menu_item_check label="システムフォルダを上ã«ã‚½ãƒ¼ãƒˆã™ã‚‹" name="sort_system_folders_to_top"/>
<menu_item_call label="フィルターを表示" name="show_filters"/>
<menu_item_call label="フィルターをリセット" name="reset_filters"/>
<menu_item_call label="ã™ã¹ã¦ã®ãƒ•ã‚©ãƒ«ãƒ€ã‚’é–‰ã˜ã‚‹" name="close_folders"/>
@@ -12,4 +14,4 @@
<menu_item_call label="オリジナルを表示" name="Find Original"/>
<menu_item_call label="ã™ã¹ã¦ã®ãƒªãƒ³ã‚¯ã‚’表示" name="Find All Links"/>
<menu_item_call label="ã”ã¿ç®±ã‚’空ã«ã™ã‚‹" name="empty_trash"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_login.xml b/indra/newview/skins/default/xui/ja/menu_login.xml
index e2a7f39dfd..ab6d9e3546 100644
--- a/indra/newview/skins/default/xui/ja/menu_login.xml
+++ b/indra/newview/skins/default/xui/ja/menu_login.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu_bar name="Login Menu">
<menu label="ミー" name="File">
- <menu_item_call label="環境設定" name="Preferences..."/>
+ <menu_item_call label="環境設定..." name="Preferences..."/>
<menu_item_call label="[APP_NAME] を終了" name="Quit"/>
</menu>
<menu label="ヘルプ" name="Help">
@@ -17,7 +17,8 @@
<menu_item_call label="ウィンドウã®ã‚µã‚¤ã‚ºã‚’設定..." name="Set Window Size..."/>
<menu_item_call label="利用è¦ç´„を表示" name="TOS"/>
<menu_item_call label="クリティカルメッセージを表示" name="Critical"/>
- <menu_item_call label="Web ブラウザã®ãƒ†ã‚¹ãƒˆ" name="Web Browser Test"/>
+ <menu_item_call label="Web コンテンツフローターã®ãƒ‡ãƒãƒƒã‚°ãƒ†ã‚¹ãƒˆ" name="Web Content Floater Debug Test"/>
+ <menu label="ログレベルを設定" name="Set Logging Level"/>
<menu_item_check label="グリッドピッカーを表示ã™ã‚‹" name="Show Grid Picker"/>
<menu_item_call label="通知コンソールを表示ã™ã‚‹" name="Show Notifications Console"/>
</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_media_ctrl.xml b/indra/newview/skins/default/xui/ja/menu_media_ctrl.xml
new file mode 100644
index 0000000000..faae4ef717
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_media_ctrl.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="media ctrl context menu">
+ <menu_item_call label="カット" name="Cut"/>
+ <menu_item_call label="コピー" name="Copy"/>
+ <menu_item_call label="貼り付ã‘" name="Paste"/>
+ <menu_item_call label="ウェブインスペクターを開ã" name="open_webinspector"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_mini_map.xml b/indra/newview/skins/default/xui/ja/menu_mini_map.xml
index 12ea6e2299..2e733ee24b 100644
--- a/indra/newview/skins/default/xui/ja/menu_mini_map.xml
+++ b/indra/newview/skins/default/xui/ja/menu_mini_map.xml
@@ -3,6 +3,7 @@
<menu_item_call label="ズーム(近)" name="Zoom Close"/>
<menu_item_call label="ズーム(中)" name="Zoom Medium"/>
<menu_item_call label="ズーム(é ï¼‰" name="Zoom Far"/>
+ <menu_item_call label="ズーム(デフォルト)" name="Zoom Default"/>
<menu_item_check label="地図を回転" name="Rotate Map"/>
<menu_item_check label="中央ã¸è‡ªå‹•ç§»å‹•" name="Auto Center"/>
<menu_item_call label="追跡をやã‚ã‚‹" name="Stop Tracking"/>
diff --git a/indra/newview/skins/default/xui/ja/menu_mode_change.xml b/indra/newview/skins/default/xui/ja/menu_mode_change.xml
new file mode 100644
index 0000000000..dff3392bd5
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_mode_change.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Mode Change">
+ <menu_item_check label="ベーシック" name="BasicMode"/>
+ <menu_item_check label="アドãƒãƒ³ã‚¹" name="AdvancedMode"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_model_import_gear_default.xml b/indra/newview/skins/default/xui/ja/menu_model_import_gear_default.xml
new file mode 100644
index 0000000000..43f86e84bf
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_model_import_gear_default.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="model_menu_gear_default">
+ <menu_item_check label="稜を表示" name="show_edges"/>
+ <menu_item_check label="物ç†åŠ¹æžœã‚’表示" name="show_physics"/>
+ <menu_item_check label="テクスãƒãƒ£ã‚’表示" name="show_textures"/>
+ <menu_item_check label="スキンã®é‡ã•ã‚’表示" name="show_skin_weight"/>
+ <menu_item_check label="ジョイントãƒã‚¸ã‚·ãƒ§ãƒ³ã‚’表示" name="show_joint_positions"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_object.xml b/indra/newview/skins/default/xui/ja/menu_object.xml
index c11dc9bb3e..4cee8089ee 100644
--- a/indra/newview/skins/default/xui/ja/menu_object.xml
+++ b/indra/newview/skins/default/xui/ja/menu_object.xml
@@ -16,14 +16,14 @@
<context_menu label="å–り付ã‘ã‚‹" name="Object Attach"/>
<context_menu label="HUD ã‚’å–り付ã‘ã‚‹" name="Object Attach HUD"/>
</context_menu>
- <context_menu label="å–り外ã™" name="Remove">
+ <context_menu label="管ç†" name="Remove">
<menu_item_call label="å«ŒãŒã‚‰ã›ã®å ±å‘Š" name="Report Abuse..."/>
<menu_item_call label="ブロック" name="Object Mute"/>
<menu_item_call label="è¿”å´" name="Return..."/>
- <menu_item_call label="削除" name="Delete"/>
</context_menu>
<menu_item_call label="å–ã‚‹" name="Pie Object Take"/>
<menu_item_call label="コピーをå–ã‚‹" name="Take Copy"/>
<menu_item_call label="支払ã†" name="Pay..."/>
<menu_item_call label="è²·ã†" name="Buy..."/>
+ <menu_item_call label="削除" name="Delete"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_outfit_gear.xml b/indra/newview/skins/default/xui/ja/menu_outfit_gear.xml
index d31b34deeb..2bcbe1915b 100644
--- a/indra/newview/skins/default/xui/ja/menu_outfit_gear.xml
+++ b/indra/newview/skins/default/xui/ja/menu_outfit_gear.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Gear Outfit">
+<toggleable_menu name="Gear Outfit">
<menu_item_call label="ç€ã‚‹ - ç€ç”¨ä¸­ã®ã‚¢ã‚¦ãƒˆãƒ•ã‚£ãƒƒãƒˆã‚’入れ替ãˆã‚‹" name="wear"/>
<menu_item_call label="ç€ã‚‹ - ç€ç”¨ä¸­ã®ã‚¢ã‚¦ãƒˆãƒ•ã‚£ãƒƒãƒˆã«è¿½åŠ ã™ã‚‹" name="wear_add"/>
<menu_item_call label="å–り外㙠- ç€ç”¨ä¸­ã®ã‚¢ã‚¦ãƒˆãƒ•ã‚£ãƒƒãƒˆã‹ã‚‰å–り除ã" name="take_off"/>
@@ -14,6 +14,7 @@
<menu_item_call label="下ç€ï¼ˆä¸Šï¼‰" name="New Undershirt"/>
<menu_item_call label="下ç€ï¼ˆä¸‹ï¼‰" name="New Underpants"/>
<menu_item_call label="アルファ" name="New Alpha"/>
+ <menu_item_call label="æ–°è¦ã®ç‰©ç†ä½œç”¨" name="New Physics"/>
<menu_item_call label="æ–°ã—ã„タトゥ" name="New Tattoo"/>
</menu>
<menu label="æ–°ã—ã„身体部ä½" name="New Body Parts">
@@ -24,4 +25,4 @@
</menu>
<menu_item_call label="アウトフィットã®åå‰ã‚’変更ã™ã‚‹" name="rename"/>
<menu_item_call label="アウトフィットを削除ã™ã‚‹" name="delete_outfit"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_people_nearby_view_sort.xml b/indra/newview/skins/default/xui/ja/menu_people_nearby_view_sort.xml
index a31480158a..44c5438509 100644
--- a/indra/newview/skins/default/xui/ja/menu_people_nearby_view_sort.xml
+++ b/indra/newview/skins/default/xui/ja/menu_people_nearby_view_sort.xml
@@ -1,8 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
+<toggleable_menu name="menu_group_plus">
<menu_item_check label="最近ã®ç™ºè¨€è€…ã§ä¸¦ã¹æ›¿ãˆ" name="sort_by_recent_speakers"/>
<menu_item_check label="åå‰ã§ä¸¦ã¹æ›¿ãˆ" name="sort_name"/>
<menu_item_check label="è·é›¢ã§ä¸¦ã¹æ›¿ãˆ" name="sort_distance"/>
<menu_item_check label="人ã®ã‚¢ã‚¤ã‚³ãƒ³è¡¨ç¤º" name="view_icons"/>
+ <menu_item_check label="地図を表示" name="view_map"/>
<menu_item_call label="ブロックã•ã‚ŒãŸä½äººã¨ã‚ªãƒ–ジェクトを表示" name="show_blocked_list"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/ja/menu_places_gear_folder.xml
index 6f91a3ebf9..c455204722 100644
--- a/indra/newview/skins/default/xui/ja/menu_places_gear_folder.xml
+++ b/indra/newview/skins/default/xui/ja/menu_places_gear_folder.xml
@@ -1,7 +1,8 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_folder_gear">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_folder_gear">
<menu_item_call label="ランドマークを追加" name="add_landmark"/>
<menu_item_call label="フォルダを追加" name="add_folder"/>
+ <menu_item_call label="アイテムを復元" name="restore_item"/>
<menu_item_call label="切りå–ã‚Š" name="cut"/>
<menu_item_call label="コピー" name="copy_folder"/>
<menu_item_call label="貼り付ã‘" name="paste"/>
@@ -12,4 +13,4 @@
<menu_item_call label="フォルダをã™ã¹ã¦é–‹ã" name="expand_all"/>
<menu_item_call label="フォルダをã™ã¹ã¦é–‰ã˜ã‚‹" name="collapse_all"/>
<menu_item_check label="日付ã§ä¸¦ã¹æ›¿ãˆ" name="sort_by_date"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/ja/menu_places_gear_landmark.xml
index 5a135e5f56..579f2c2cbd 100644
--- a/indra/newview/skins/default/xui/ja/menu_places_gear_landmark.xml
+++ b/indra/newview/skins/default/xui/ja/menu_places_gear_landmark.xml
@@ -1,10 +1,11 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_ladmark_gear">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_ladmark_gear">
<menu_item_call label="テレãƒãƒ¼ãƒˆ" name="teleport"/>
<menu_item_call label="ã‚‚ã£ã¨è©³ã—ã" name="more_info"/>
<menu_item_call label="地図ã«è¡¨ç¤º" name="show_on_map"/>
<menu_item_call label="ランドマークを追加" name="add_landmark"/>
<menu_item_call label="フォルダを追加" name="add_folder"/>
+ <menu_item_call label="アイテムを復元" name="restore_item"/>
<menu_item_call label="切りå–ã‚Š" name="cut"/>
<menu_item_call label="ランドマークをコピー" name="copy_landmark"/>
<menu_item_call label="SLurl をコピー" name="copy_slurl"/>
@@ -15,4 +16,4 @@
<menu_item_call label="フォルダをã™ã¹ã¦é–‰ã˜ã‚‹" name="collapse_all"/>
<menu_item_check label="日付ã§ä¸¦ã¹æ›¿ãˆ" name="sort_by_date"/>
<menu_item_call label="ピックを作æˆ" name="create_pick"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_toolbars.xml b/indra/newview/skins/default/xui/ja/menu_toolbars.xml
new file mode 100644
index 0000000000..d5363a5131
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_toolbars.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Toolbars Popup">
+ <menu_item_call label="ã“ã®ãƒœã‚¿ãƒ³ã‚’削除" name="Remove button"/>
+ <menu_item_call label="ツールãƒãƒ¼ã®ãƒœã‚¿ãƒ³..." name="Choose Buttons"/>
+ <menu_item_check label="アイコンã¨ãƒ©ãƒ™ãƒ«" name="icons_with_text"/>
+ <menu_item_check label="アイコンã®ã¿" name="icons_only"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_url_inventory.xml b/indra/newview/skins/default/xui/ja/menu_url_inventory.xml
index 7af2f9e2cd..147ab44a1b 100644
--- a/indra/newview/skins/default/xui/ja/menu_url_inventory.xml
+++ b/indra/newview/skins/default/xui/ja/menu_url_inventory.xml
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Url Popup">
- <menu_item_call label="æŒã¡ç‰©ã‚¢ã‚¤ãƒ†ãƒ ã‚’表示" name="show_item"/>
+ <menu_item_call label="インベントリアイテムを表示" name="show_item"/>
<menu_item_call label="åå‰ã‚’クリップボードã«ã‚³ãƒ”ー" name="url_copy_label"/>
<menu_item_call label="SLurl をクリップボードã«ã‚³ãƒ”ー" name="url_copy"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_viewer.xml b/indra/newview/skins/default/xui/ja/menu_viewer.xml
index 85aaf17256..8496dfb1db 100644
--- a/indra/newview/skins/default/xui/ja/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/ja/menu_viewer.xml
@@ -1,62 +1,92 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu_bar name="Main Menu">
<menu label="ミー" name="Me">
- <menu_item_call label="環境設定" name="Preferences"/>
- <menu_item_call label="マイアカウント" name="Manage My Account">
- <menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=ja"/>
- </menu_item_call>
- <menu_item_call label="L$ ã®è³¼å…¥" name="Buy and Sell L$"/>
- <menu_item_call label="プロフィール" name="Profile"/>
- <menu_item_call label="アウトフィットを変更" name="ChangeOutfit"/>
- <menu_item_check label="æŒã¡ç‰©" name="Inventory"/>
- <menu_item_check label="æŒã¡ç‰©" name="ShowSidetrayInventory"/>
- <menu_item_check label="ジェスãƒãƒ£ãƒ¼" name="Gestures"/>
- <menu_item_check label="マイボイス" name="ShowVoice"/>
- <menu label="ログイン状態" name="Status">
+ <menu_item_call label="プロフィール..." name="Profile"/>
+ <menu_item_call label="容姿..." name="ChangeOutfit"/>
+ <menu_item_call label="ã‚¢ãƒã‚¿ãƒ¼ã‚’é¸æŠž..." name="Avatar Picker"/>
+ <menu_item_check label="インベントリ..." name="Inventory"/>
+ <menu_item_call label="æ–°ã—ã„インベントリウィンドウ" name="NewInventoryWindow"/>
+ <menu_item_call label="場所..." name="Places"/>
+ <menu_item_call label="ピック..." name="Picks"/>
+ <menu_item_call label="カメラコントロール..." name="Camera Controls"/>
+ <menu label="ムーブメント" name="Movement">
+ <menu_item_call label="座る" name="Sit Down Here"/>
+ <menu_item_check label="飛ã¶" name="Fly"/>
+ <menu_item_check label="常ã«èµ°ã‚‹" name="Always Run"/>
+ <menu_item_call label="ç§ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’åœæ­¢ã™ã‚‹" name="Stop Animating My Avatar"/>
+ <menu_item_call label="æ­©è¡Œï¼èµ°è¡Œï¼é£›è¡Œ..." name="Walk / run / fly"/>
+ </menu>
+ <menu label="ログイン" name="Status">
<menu_item_call label="一時退席中" name="Set Away"/>
<menu_item_call label="å–ã‚Šè¾¼ã¿ä¸­" name="Set Busy"/>
</menu>
- <menu_item_call label="管ç†è€…権é™ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆ" name="Request Admin Options"/>
- <menu_item_call label="管ç†è€…ステータス解除" name="Leave Admin Options"/>
+ <menu_item_call label="L$ ã®è³¼å…¥..." name="Buy and Sell L$"/>
+ <menu_item_call label="マーãƒãƒ£ãƒ³ãƒˆã‚¢ã‚¦ãƒˆãƒœãƒƒã‚¯ã‚¹..." name="MerchantOutbox"/>
+ <menu_item_call label="マイアカウント..." name="Manage My Account">
+ <menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=ja"/>
+ </menu_item_call>
+ <menu_item_call label="環境設定..." name="Preferences"/>
+ <menu_item_call label="ツールãƒãƒ¼ã®ãƒœã‚¿ãƒ³..." name="Toolbars"/>
+ <menu_item_call label="å…¨ã¦ã®ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«ã‚’éžè¡¨ç¤ºã«ã™ã‚‹" name="Hide UI"/>
<menu_item_call label="[APP_NAME] を終了" name="Quit"/>
</menu>
<menu label="コミュニケーション" name="Communicate">
+ <menu_item_check label="ãƒãƒ£ãƒƒãƒˆ..." name="Nearby Chat"/>
+ <menu_item_check label="話ã™" name="Speak"/>
+ <menu_item_check label="ボイス設定..." name="Nearby Voice"/>
+ <menu_item_check label="ボイスモーフィング..." name="ShowVoice"/>
+ <menu_item_check label="ジェスãƒãƒ£ãƒ¼..." name="Gestures"/>
<menu_item_call label="フレンド" name="My Friends"/>
- <menu_item_call label="所属グループ" name="My Groups"/>
- <menu_item_check label="è¿‘ãã®ãƒãƒ£ãƒƒãƒˆ" name="Nearby Chat"/>
+ <menu_item_call label="グループ" name="My Groups"/>
<menu_item_call label="è¿‘ãã«ã„る人" name="Active Speakers"/>
</menu>
<menu label="世界" name="World">
- <menu_item_check label="ミニマップ" name="Mini-Map"/>
+ <menu_item_call label="ç¾åœ¨åœ°ã‚’ランドマーク" name="Create Landmark Here"/>
+ <menu_item_call label="è¡Œãå…ˆ..." name="Destinations"/>
<menu_item_check label="世界地図" name="World Map"/>
+ <menu_item_check label="ミニマップ" name="Mini-Map"/>
+ <menu_item_check label="検索" name="Search"/>
+ <menu_item_call label="ホームã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ" name="Teleport Home"/>
+ <menu_item_call label="ç¾åœ¨åœ°ã‚’ホームã«è¨­å®š" name="Set Home to Here"/>
<menu_item_call label="スナップショット" name="Take Snapshot"/>
- <menu_item_call label="ç¾åœ¨åœ°ã‚’ランドマーク" name="Create Landmark Here"/>
- <menu label="場所ã®ãƒ—ロフィール" name="Land">
- <menu_item_call label="場所ã®ãƒ—ロフィール" name="Place Profile"/>
- <menu_item_call label="土地情報" name="About Land"/>
- <menu_item_call label="地域 / ä¸å‹•ç”£" name="Region/Estate"/>
- </menu>
+ <menu_item_call label="場所ã®ãƒ—ロフィール" name="Place Profile"/>
+ <menu_item_call label="土地情報" name="About Land"/>
+ <menu_item_call label="地域 / ä¸å‹•ç”£" name="Region/Estate"/>
+ <menu_item_call label="ä¿æœ‰åœ°..." name="My Land"/>
<menu_item_call label="ã“ã®åœŸåœ°ã‚’購入" name="Buy Land"/>
- <menu_item_call label="自分ã®åœŸåœ°" name="My Land"/>
<menu label="表示" name="LandShow">
- <menu_item_check label="移動コントロール" name="Movement Controls"/>
- <menu_item_check label="カメラコントロール" name="Camera Controls"/>
<menu_item_check label="ç«‹å…¥ç¦æ­¢ãƒ©ã‚¤ãƒ³" name="Ban Lines"/>
<menu_item_check label="ビーコン(標識)" name="beacons"/>
<menu_item_check label="プロパティ境界線" name="Property Lines"/>
<menu_item_check label="土地所有者" name="Land Owners"/>
<menu_item_check label="座標" name="Coordinates"/>
<menu_item_check label="区画プロパティ" name="Parcel Properties"/>
+ <menu_item_check label="アドãƒãƒ³ã‚¹ãƒ¡ãƒ‹ãƒ¥ãƒ¼" name="Show Advanced Menu"/>
</menu>
- <menu_item_call label="ホームã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ" name="Teleport Home"/>
- <menu_item_call label="ç¾åœ¨åœ°ã‚’ホームã«è¨­å®š" name="Set Home to Here"/>
- <menu label="太陽" name="Environment Settings">
+ <menu label="太陽" name="Sun">
<menu_item_call label="æ—¥ã®å‡º" name="Sunrise"/>
<menu_item_call label="æ­£åˆ" name="Noon"/>
<menu_item_call label="日没" name="Sunset"/>
- <menu_item_call label="深夜" name="Midnight"/>
- <menu_item_call label="エステートタイム" name="Revert to Region Default"/>
- <menu_item_call label="自然環境エディター" name="Environment Editor"/>
+ <menu_item_call label="真夜中" name="Midnight"/>
+ <menu_item_call label="リージョンã®è¨­å®šã‚’使用" name="Use Region Settings"/>
+ </menu>
+ <menu label="自然環境エディター" name="Environment Editor">
+ <menu_item_call label="自然環境ã®è¨­å®š..." name="Environment Settings"/>
+ <menu label="æ°´ã®äº‹å‰è¨­å®š" name="Water Presets">
+ <menu_item_call label="æ–°ã—ã„事å‰è¨­å®š..." name="new_water_preset"/>
+ <menu_item_call label="事å‰è¨­å®šã‚’編集..." name="edit_water_preset"/>
+ <menu_item_call label="事å‰è¨­å®šã‚’削除..." name="delete_water_preset"/>
+ </menu>
+ <menu label="空ã®äº‹å‰è¨­å®š" name="Sky Presets">
+ <menu_item_call label="æ–°ã—ã„事å‰è¨­å®š..." name="new_sky_preset"/>
+ <menu_item_call label="事å‰è¨­å®šã‚’編集..." name="edit_sky_preset"/>
+ <menu_item_call label="事å‰è¨­å®šã‚’削除..." name="delete_sky_preset"/>
+ </menu>
+ <menu label="デイã®äº‹å‰è¨­å®š" name="Day Presets">
+ <menu_item_call label="æ–°ã—ã„事å‰è¨­å®š..." name="new_day_preset"/>
+ <menu_item_call label="事å‰è¨­å®šã‚’編集..." name="edit_day_preset"/>
+ <menu_item_call label="事å‰è¨­å®šã‚’削除..." name="delete_day_preset"/>
+ </menu>
</menu>
</menu>
<menu label="制作" name="BuildTools">
@@ -83,8 +113,9 @@
<menu_item_call label="è²·ã†" name="Menu Object Buy"/>
<menu_item_call label="å–ã‚‹" name="Menu Object Take"/>
<menu_item_call label="コピーをå–ã‚‹" name="Take Copy"/>
- <menu_item_call label="「æŒã¡ç‰©ã€ã«ä¿å­˜" name="Save Object Back to My Inventory"/>
+ <menu_item_call label="マイインベントリã«ä¿å­˜" name="Save Object Back to My Inventory"/>
<menu_item_call label="オブジェクトã®ä¸­èº«ã«ä¿å­˜" name="Save Object Back to Object Contents"/>
+ <menu_item_call label="オブジェクトを返å´ã™ã‚‹" name="Return Object back to Owner"/>
</menu>
<menu label="スクリプト" name="Scripts">
<menu_item_call label="スクリプトã®ãƒªã‚³ãƒ³ãƒ‘イル(Mono)" name="Mono"/>
@@ -98,6 +129,7 @@
<menu_item_check label="ç§ã®ã‚ªãƒ–ジェクトã ã‘ã‚’é¸æŠžã™ã‚‹" name="Select Only My Objects"/>
<menu_item_check label="動的オブジェクトã ã‘ã‚’é¸æŠžã™ã‚‹" name="Select Only Movable Objects"/>
<menu_item_check label="範囲内をé¸æŠžã™ã‚‹" name="Select By Surrounding"/>
+ <menu_item_check label="é¸æŠžå¤–形を表示" name="Show Selection Outlines"/>
<menu_item_check label="éš ã‚ŒãŸä½ç½®ã®é¸æŠžã‚‚表示ã™ã‚‹" name="Show Hidden Selection"/>
<menu_item_check label="é¸æŠžã—ãŸå…‰ã®åŠå¾„範囲を表示ã™ã‚‹" name="Show Light Radius for Selection"/>
<menu_item_check label="é¸æŠžãƒ“ームを表示ã™ã‚‹" name="Show Selection Beam"/>
@@ -110,17 +142,21 @@
<menu_item_call label="ç”»åƒï¼ˆL$[COST])..." name="Upload Image"/>
<menu_item_call label="サウンド(L$[COST])..." name="Upload Sound"/>
<menu_item_call label="アニメーション(L$[COST])..." name="Upload Animation"/>
+ <menu_item_call label="モデル" name="Upload Model"/>
<menu_item_call label="一括 (ファイルã«ã¤ãL$[COST])..." name="Bulk Upload"/>
+ <menu_item_call label="デフォルトã®ã‚¢ãƒƒãƒ—ロード権é™ã‚’設定" name="perm prefs"/>
</menu>
+ <menu_item_call label="å…ƒã«æˆ»ã™" name="Undo"/>
+ <menu_item_call label="ã‚„ã‚Šç›´ã—" name="Redo"/>
</menu>
<menu label="ヘルプ" name="Help">
+ <menu_item_call label="ãƒã‚¦ãƒ„ー..." name="How To"/>
<menu_item_call label="[SECOND_LIFE] ヘルプ" name="Second Life Help"/>
<menu_item_call label="å«ŒãŒã‚‰ã›ã‚’報告ã™ã‚‹" name="Report Abuse"/>
<menu_item_call label="ãƒã‚°ã‚’報告ã™ã‚‹" name="Report Bug"/>
<menu_item_call label="[APP_NAME] ã«ã¤ã„ã¦" name="About Second Life"/>
</menu>
<menu label="アドãƒãƒ³ã‚¹" name="Advanced">
- <menu_item_call label="自分ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’åœæ­¢ã™ã‚‹" name="Stop Animating My Avatar"/>
<menu_item_call label="テクスãƒãƒ£ã®ãƒªãƒ™ãƒ¼ã‚¯ã‚’ã™ã‚‹" name="Rebake Texture"/>
<menu_item_call label="UI ã®ã‚µã‚¤ã‚ºã‚’デフォルトã«è¨­å®šã™ã‚‹" name="Set UI Size to Default"/>
<menu_item_call label="ウィンドウã®ã‚µã‚¤ã‚ºã‚’設定ã™ã‚‹" name="Set Window Size..."/>
@@ -128,11 +164,10 @@
<menu_item_check label="カメラã®è·é›¢ç§»å‹•ã‚’制é™ã—ãªã„" name="Disable Camera Distance"/>
<menu_item_check label="高解åƒåº¦ã‚¹ãƒŠãƒƒãƒ—ショット" name="HighResSnapshot"/>
<menu_item_check label="シャッター音ã¨ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ãªã—ã§ã‚¹ãƒŠãƒƒãƒ—ショットをディスクã«ä¿å­˜ã™ã‚‹" name="QuietSnapshotsToDisk"/>
- <menu_item_check label="圧縮ã—ã¦ã‚¹ãƒŠãƒƒãƒ—ショットをディスクã«ä¿å­˜ã™ã‚‹" name="CompressSnapshotsToDisk"/>
<menu label="パフォーマンスツール" name="Performance Tools">
<menu_item_call label="ラグ計測器" name="Lag Meter"/>
<menu_item_check label="統計ãƒãƒ¼" name="Statistics Bar"/>
- <menu_item_check label="ã‚¢ãƒã‚¿ãƒ¼ã®ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ã‚³ã‚¹ãƒˆã‚’表示ã™ã‚‹" name="Avatar Rendering Cost"/>
+ <menu_item_check label="ã‚¢ãƒã‚¿ãƒ¼ã®æ画ウェイトを表示" name="Avatar Rendering Cost"/>
</menu>
<menu label="ãƒã‚¤ãƒ©ã‚¤ãƒˆã¨ç›®ã«è¦‹ãˆã‚‹ã‚‚ã®" name="Highlighting and Visibility">
<menu_item_check label="ãƒãƒ¼ã‚¸ãƒ¼ãƒ“ーコン" name="Cheesy Beacon"/>
@@ -143,22 +178,22 @@
<menu_item_check label="一人称視点ã®ã¨ãã«å字線を表示ã™ã‚‹" name="ShowCrosshairs"/>
</menu>
<menu label="レンダリング(種類)" name="Rendering Types">
- <menu_item_check label="シンプル" name="Simple"/>
- <menu_item_check label="アルファ" name="Alpha"/>
- <menu_item_check label="木" name="Tree"/>
- <menu_item_check label="ã‚¢ãƒã‚¿ãƒ¼" name="Character"/>
- <menu_item_check label="地表" name="SurfacePath"/>
- <menu_item_check label="空" name="Sky"/>
- <menu_item_check label="æ°´" name="Water"/>
- <menu_item_check label="地é¢" name="Ground"/>
- <menu_item_check label="ボリューム" name="Volume"/>
- <menu_item_check label="è‰" name="Grass"/>
- <menu_item_check label="雲" name="Clouds"/>
- <menu_item_check label="パーティクル" name="Particles"/>
- <menu_item_check label="è¡çª" name="Bump"/>
+ <menu_item_check label="シンプル" name="Rendering Type Simple"/>
+ <menu_item_check label="アルファ" name="Rendering Type Alpha"/>
+ <menu_item_check label="木" name="Rendering Type Tree"/>
+ <menu_item_check label="ã‚¢ãƒã‚¿ãƒ¼" name="Rendering Type Character"/>
+ <menu_item_check label="サーフェスパッãƒ" name="Rendering Type Surface Patch"/>
+ <menu_item_check label="空" name="Rendering Type Sky"/>
+ <menu_item_check label="æ°´" name="Rendering Type Water"/>
+ <menu_item_check label="地é¢" name="Rendering Type Ground"/>
+ <menu_item_check label="å–引高" name="Rendering Type Volume"/>
+ <menu_item_check label="è‰" name="Rendering Type Grass"/>
+ <menu_item_check label="雲" name="Rendering Type Clouds"/>
+ <menu_item_check label="パーティクル" name="Rendering Type Particles"/>
+ <menu_item_check label="è¡çª" name="Rendering Type Bump"/>
</menu>
<menu label="レンダリング(機能)" name="Rendering Features">
- <menu_item_check label="UI" name="UI"/>
+ <menu_item_check label="UI" name="ToggleUI"/>
<menu_item_check label="é¸æŠžæ¸ˆ" name="Selected"/>
<menu_item_check label="ãƒã‚¤ãƒ©ã‚¤ãƒˆ" name="Highlighted"/>
<menu_item_check label="ダイナミックテクスãƒãƒ£" name="Dynamic Textures"/>
@@ -170,13 +205,9 @@
<menu_item_check label="Use Plugin Read Thread" name="Use Plugin Read Thread"/>
<menu_item_call label="グループキャッシュã®ã‚¯ãƒªã‚¢" name="ClearGroupCache"/>
<menu_item_check label="マウスã®å¹³æ»‘化" name="Mouse Smoothing"/>
+ <menu_item_call label="リリースキー" name="Release Keys"/>
<menu label="ショートカット" name="Shortcuts">
- <menu_item_call label="ç”»åƒ ï¼ˆL$ [COST] )..." name="Upload Image"/>
- <menu_item_check label="検索" name="Search"/>
- <menu_item_call label="キーをリリース" name="Release Keys"/>
- <menu_item_call label="UI ã®ã‚µã‚¤ã‚ºã‚’デフォルトã«è¨­å®šã™ã‚‹" name="Set UI Size to Default"/>
- <menu_item_check label="常ã«èµ°ã‚‹" name="Always Run"/>
- <menu_item_check label="飛行ã™ã‚‹" name="Fly"/>
+ <menu_item_check label="アドãƒãƒ³ã‚¹ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã‚’表示 - レガシーã®ã‚·ãƒ§ãƒ¼ãƒˆã‚«ãƒƒãƒˆ" name="Show Advanced Menu - legacy shortcut"/>
<menu_item_call label="ウィンドウを閉ã˜ã‚‹" name="Close Window"/>
<menu_item_call label="å…¨ã¦ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’é–‰ã˜ã‚‹" name="Close All Windows"/>
<menu_item_call label="スナップショットをディスクã«ä¿å­˜ã™ã‚‹" name="Snapshot to Disk"/>
@@ -184,17 +215,9 @@
<menu_item_check label="ジョイスティックフライカム" name="Joystick Flycam"/>
<menu_item_call label="表示をリセットã™ã‚‹" name="Reset View"/>
<menu_item_call label="最後ã®ç™ºè¨€è€…を見る" name="Look at Last Chatter"/>
- <menu label="制作ツールをé¸æŠžã™ã‚‹" name="Select Tool">
- <menu_item_call label="焦点ツール" name="Focus"/>
- <menu_item_call label="移動ツール" name="Move"/>
- <menu_item_call label="編集ツール" name="Edit"/>
- <menu_item_call label="作æˆãƒ„ール" name="Create"/>
- <menu_item_call label="土地ツール" name="Land"/>
- </menu>
<menu_item_call label="ズームイン" name="Zoom In"/>
<menu_item_call label="ズーム(デフォルト)" name="Zoom Default"/>
<menu_item_call label="ズームアウト" name="Zoom Out"/>
- <menu_item_check label="アドãƒãƒ³ã‚¹ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã‚’表示ã™ã‚‹" name="Show Advanced Menu"/>
</menu>
<menu_item_call label="デãƒãƒƒã‚°è¨­å®šã‚’表示ã™ã‚‹" name="Debug Settings"/>
<menu_item_check label="開発メニューを表示ã™ã‚‹" name="Debug Mode"/>
@@ -208,6 +231,7 @@
<menu_item_check label="テクスãƒãƒ£ã‚«ãƒ†ã‚´ãƒªã®ã‚³ãƒ³ã‚½ãƒ¼ãƒ«" name="Texture Category"/>
<menu_item_check label="ファーストタイマー" name="Fast Timers"/>
<menu_item_check label="メモリ" name="Memory"/>
+ <menu_item_check label="風景ã®çµ±è¨ˆ" name="Scene Statistics"/>
<menu_item_call label="リージョン情報をデãƒãƒƒã‚°ã‚³ãƒ³ã‚½ãƒ¼ãƒ«ã¸" name="Region Info to Debug Console"/>
<menu_item_call label="グループ情報をデãƒãƒƒã‚°ã‚³ãƒ³ã‚½ãƒ¼ãƒ«ã¸" name="Group Info to Debug Console"/>
<menu_item_call label="性能情報をデãƒãƒƒã‚°ã‚³ãƒ³ã‚½ãƒ¼ãƒ«ã¸" name="Capabilities Info to Debug Console"/>
@@ -218,9 +242,13 @@
</menu>
<menu label="情報を表示" name="Display Info">
<menu_item_check label="時間を表示ã™ã‚‹" name="Show Time"/>
+ <menu_item_check label="アップロード代金を表示" name="Show Upload Cost"/>
<menu_item_check label="æ画情報を表示ã™ã‚‹" name="Show Render Info"/>
+ <menu_item_check label="テクスãƒãƒ£æƒ…報を表示" name="Show Texture Info"/>
<menu_item_check label="マトリックスを表示ã™ã‚‹" name="Show Matrices"/>
<menu_item_check label="カーソルを乗ã›ãŸå ´æ‰€ã®è‰²ã‚’表示ã™ã‚‹" name="Show Color Under Cursor"/>
+ <menu_item_check label="メモリを表示:" name="Show Memory"/>
+ <menu_item_check label="プライベートメモリ情報を表示" name="Show Private Mem Info"/>
<menu_item_check label="オブジェクトã®ã‚¢ãƒƒãƒ—デートを表示ã™ã‚‹" name="Show Updates"/>
</menu>
<menu label="エラー実行" name="Force Errors">
@@ -241,17 +269,26 @@
</menu>
<menu label="メタデータã®ãƒ¬ãƒ³ãƒ€ãƒ¼" name="Render Metadata">
<menu_item_check label="ãƒã‚¦ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ãƒœãƒƒã‚¯ã‚¹" name="Bounding Boxes"/>
+ <menu_item_check label="普通" name="Normals"/>
<menu_item_check label="オクトリー" name="Octree"/>
<menu_item_check label="シャドウ円éŒ" name="Shadow Frusta"/>
+ <menu_item_check label="実åƒ" name="Physics Shapes"/>
<menu_item_check label="オクルージョン" name="Occlusion"/>
<menu_item_check label="ãƒãƒƒãƒã®æç”»" name="Render Batches"/>
+ <menu_item_check label="タイプを更新" name="Update Type"/>
<menu_item_check label="アニメーション部分をテクスãƒãƒ£ã§è¡¨ç¤º" name="Texture Anim"/>
<menu_item_check label="テクスãƒãƒ£å„ªå…ˆåº¦" name="Texture Priority"/>
<menu_item_check label="テクスãƒãƒ£ã®ç¯„囲" name="Texture Area"/>
<menu_item_check label="å´é¢" name="Face Area"/>
+ <menu_item_check label="LOD 情報" name="LOD Info"/>
+ <menu_item_check label="制作キュー" name="Build Queue"/>
<menu_item_check label="å…‰" name="Lights"/>
<menu_item_check label="骨組ã¿ã®è¡çªåˆ¤å®š" name="Collision Skeleton"/>
<menu_item_check label="レイキャスト" name="Raycast"/>
+ <menu_item_check label="風ã®ãƒ™ã‚¯ãƒˆãƒ«" name="Wind Vectors"/>
+ <menu_item_check label="æç”»ã®è©³ç´°åº¦" name="rendercomplexity"/>
+ <menu_item_check label="添付アイテムã®ãƒã‚¤ãƒˆæ•°" name="attachment bytes"/>
+ <menu_item_check label="スカルプト" name="Sculpt"/>
</menu>
<menu label="レンダリング" name="Rendering">
<menu_item_check label="軸" name="Axes"/>
@@ -259,11 +296,9 @@
<menu_item_call label="é¸æŠžã—ãŸãƒ†ã‚¯ã‚¹ãƒãƒ£æƒ…報基底" name="Selected Texture Info Basis"/>
<menu_item_check label="ワイヤーフレーム" name="Wireframe"/>
<menu_item_check label="オブジェクト間オクルージョン" name="Object-Object Occlusion"/>
- <menu_item_check label="フレームãƒãƒƒãƒ•ã‚¡ã‚ªãƒ–ジェクト" name="Framebuffer Objects"/>
<menu_item_check label="å…‰ã¨å½±" name="Lighting and Shadows"/>
<menu_item_check label="太陽・月・プロジェクタã‹ã‚‰ã®å½±" name="Shadows from Sun/Moon/Projectors"/>
<menu_item_check label="SSAO ã¨å½±ã®å¹³æ»‘化" name="SSAO and Shadow Smoothing"/>
- <menu_item_check label="グローãƒãƒ«ã‚¤ãƒ«ãƒŸãƒãƒ¼ã‚·ãƒ§ãƒ³ï¼ˆè©¦é¨“段階)" name="Global Illumination"/>
<menu_item_check label="GL デãƒãƒƒã‚°" name="Debug GL"/>
<menu_item_check label="経路をデãƒãƒƒã‚°" name="Debug Pipeline"/>
<menu_item_check label="自動アルファマスク(é…延)" name="Automatic Alpha Masks (deferred)"/>
@@ -294,23 +329,22 @@
<menu_item_call label="記録開始" name="Start Record"/>
<menu_item_call label="記録åœæ­¢" name="Stop Record"/>
</menu>
- <menu label="世界" name="World">
+ <menu label="世界" name="DevelopWorld">
<menu_item_check label="シムã®å¤ªé™½ã®è¨­å®šã‚’無視ã™ã‚‹" name="Sim Sun Override"/>
- <menu_item_check label="ビーコンを強調表示ã™ã‚‹" name="Cheesy Beacon"/>
<menu_item_check label="固定ã•ã‚ŒãŸå¤©æ°—" name="Fixed Weather"/>
- <menu_item_call label="リージョンオブジェクトã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’ダンプã™ã‚‹" name="Dump Region Object Cache"/>
+ <menu_item_call label="リージョンオブジェクトã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’ダンプ" name="Dump Region Object Cache"/>
</menu>
<menu label="UI" name="UI">
- <menu_item_call label="Web ブラウザã®ãƒ†ã‚¹ãƒˆ" name="Web Browser Test"/>
+ <menu_item_call label="メディアブラウザã®ãƒ†ã‚¹ãƒˆ" name="Web Browser Test"/>
+ <menu_item_call label="Web コンテンツブラウザ" name="Web Content Browser"/>
<menu_item_call label="SelectMgr をダンプ" name="Dump SelectMgr"/>
- <menu_item_call label="æŒã¡ç‰©ã®å‡ºåŠ›" name="Dump Inventory"/>
+ <menu_item_call label="インベントリã®å‡ºåŠ›" name="Dump Inventory"/>
<menu_item_call label="タイマーをダンプ" name="Dump Timers"/>
<menu_item_call label="フォーカスホールダーをダンプ" name="Dump Focus Holder"/>
<menu_item_call label="é¸æŠžã—ãŸã‚ªãƒ–ジェクト情報をプリント" name="Print Selected Object Info"/>
<menu_item_call label="エージェント情報をプリント" name="Print Agent Info"/>
<menu_item_call label="メモリ使用状æ³" name="Memory Stats"/>
- <menu_item_check label="ダブルクリックã§è‡ªå‹•è¿½è·¡ã‚’è¡Œã†" name="Double-Click Auto-Pilot"/>
- <menu_item_check label="ダブルクリックã§ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ" name="DoubleClick Teleport"/>
+ <menu_item_check label="地域デãƒãƒƒã‚°ã‚³ãƒ³ã‚½ãƒ¼ãƒ«" name="Region Debug Console"/>
<menu_item_check label="SelectMgr ã®ãƒ‡ãƒãƒƒã‚°" name="Debug SelectMgr"/>
<menu_item_check label="ダブルクリック" name="Debug Clicks"/>
<menu_item_check label="デãƒãƒƒã‚°è¡¨ç¤º" name="Debug Views"/>
@@ -322,18 +356,17 @@
<menu label="XUI" name="XUI">
<menu_item_call label="色ã®è¨­å®šã‚’æ›´æ–°ã™ã‚‹" name="Reload Color Settings"/>
<menu_item_call label="フォントテストを表示ã™ã‚‹" name="Show Font Test"/>
- <menu_item_call label="XML ã‹ã‚‰èª­ã¿è¾¼ã‚€" name="Load from XML"/>
- <menu_item_call label="XML ã§ä¿å­˜ã™ã‚‹" name="Save to XML"/>
<menu_item_check label="XUI ãƒãƒ¼ãƒ ã‚’表示ã™ã‚‹" name="Show XUI Names"/>
<menu_item_call label="テスト用 IM ã‚’é€ä¿¡ã™ã‚‹" name="Send Test IMs"/>
+ <menu_item_call label="åå‰ã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’フラッシュ" name="Flush Names Caches"/>
</menu>
<menu label="ã‚¢ãƒã‚¿ãƒ¼" name="Character">
<menu label="ベークドテクスãƒãƒ£ã‚’å–å¾—ã™ã‚‹" name="Grab Baked Texture">
- <menu_item_call label="çž³" name="Iris"/>
- <menu_item_call label="é ­" name="Head"/>
- <menu_item_call label="上åŠèº«" name="Upper Body"/>
- <menu_item_call label="下åŠèº«" name="Lower Body"/>
- <menu_item_call label="スカート" name="Skirt"/>
+ <menu_item_call label="çž³" name="Grab Iris"/>
+ <menu_item_call label="é ­" name="Grab Head"/>
+ <menu_item_call label="上åŠèº«" name="Grab Upper Body"/>
+ <menu_item_call label="下åŠèº«" name="Grab Lower Body"/>
+ <menu_item_call label="スカート" name="Grab Skirt"/>
</menu>
<menu label="キャラクターテスト" name="Character Tests">
<menu_item_call label="容姿を XML ã«ä¿å­˜ã™ã‚‹" name="Appearance To XML"/>
@@ -359,21 +392,30 @@
<menu_item_call label="ローカルテクスãƒãƒ£ã‚’ダンプ" name="Dump Local Textures"/>
</menu>
<menu_item_check label="HTTP Texture" name="HTTP Textures"/>
+ <menu_item_check label="HTTP インベントリ" name="HTTP Inventory"/>
<menu_item_call label="圧縮画åƒ" name="Compress Images"/>
+ <menu_item_call label="Visual Leak Detector を有効ã«ã™ã‚‹" name="Enable Visual Leak Detector"/>
<menu_item_check label="デãƒãƒƒã‚°ç”¨ã®ãƒŸãƒ‹ãƒ€ãƒ³ãƒ—を出力ã™ã‚‹" name="Output Debug Minidump"/>
<menu_item_check label="次回ã®èµ·å‹•æ™‚ã«ã‚³ãƒ³ã‚½ãƒ¼ãƒ«ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’表示ã™ã‚‹" name="Console Window"/>
- <menu_item_check label="管ç†è€…メニューを表示ã™ã‚‹" name="View Admin Options"/>
+ <menu label="ログレベルを設定" name="Set Logging Level">
+ <menu_item_check label="デãƒãƒƒã‚°" name="Debug"/>
+ <menu_item_check label="情報" name="Info"/>
+ <menu_item_check label="警告" name="Warning"/>
+ <menu_item_check label="エラー" name="Error"/>
+ <menu_item_check label="ãªã—" name="None"/>
+ </menu>
<menu_item_call label="管ç†è€…ステータスã®å‘¼ã³å‡ºã—" name="Request Admin Options"/>
<menu_item_call label="管ç†è€…ステータス解除" name="Leave Admin Options"/>
+ <menu_item_check label="管ç†è€…メニューを表示ã™ã‚‹" name="View Admin Options"/>
</menu>
<menu label="管ç†è€…" name="Admin">
- <menu label="Object">
- <menu_item_call label="コピーをå–ã‚‹" name="Take Copy"/>
+ <menu label="オブジェクト" name="AdminObject">
+ <menu_item_call label="コピーをå–ã‚‹" name="Admin Take Copy"/>
<menu_item_call label="ç§ã‚’所有者ã«ã™ã‚‹" name="Force Owner To Me"/>
- <menu_item_call label="所有者権é™ã‚’実行ã™ã‚‹" name="Force Owner Permissive"/>
+ <menu_item_call label="所有者権é™ã®å®Ÿè¡Œ" name="Force Owner Permissive"/>
<menu_item_call label="削除" name="Delete"/>
<menu_item_call label="ロック" name="Lock"/>
- <menu_item_call label="アセット ID ã‚’å–å¾—ã™ã‚‹" name="Get Assets IDs"/>
+ <menu_item_call label="アセット ID ã‚’å–å¾—" name="Get Assets IDs"/>
</menu>
<menu label="区画" name="Parcel">
<menu_item_call label="ç§ã‚’所有者ã«ã™ã‚‹" name="Owner To Me"/>
@@ -401,9 +443,10 @@
<menu_item_call label="スカート" name="Skirt"/>
<menu_item_call label="アルファ" name="Alpha"/>
<menu_item_call label="タトゥ" name="Tattoo"/>
+ <menu_item_call label="物ç†ä½œç”¨" name="Physics"/>
<menu_item_call label="ã™ã¹ã¦ã®è¡£é¡ž" name="All Clothes"/>
</menu>
- <menu label="ヘルプ" name="Help">
+ <menu label="ヘルプ" name="DeprecatedHelp">
<menu_item_call label="リンデン公å¼ãƒ–ログ" name="Official Linden Blog"/>
<menu_item_call label="スクリプトãƒãƒ¼ã‚¿ãƒ«" name="Scripting Portal"/>
<menu label="ãƒã‚°ã®å ±å‘Š" name="Bug Reporting">
diff --git a/indra/newview/skins/default/xui/ja/menu_wearing_gear.xml b/indra/newview/skins/default/xui/ja/menu_wearing_gear.xml
index 7a97538117..5334042dc9 100644
--- a/indra/newview/skins/default/xui/ja/menu_wearing_gear.xml
+++ b/indra/newview/skins/default/xui/ja/menu_wearing_gear.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Gear Wearing">
+<toggleable_menu name="Gear Wearing">
<menu_item_call label="アウトフットã®ç·¨é›†" name="edit"/>
<menu_item_call label="å–り外ã™" name="takeoff"/>
-</menu>
+ <menu_item_call label="アウトフィットã®ãƒªã‚¹ãƒˆã‚’クリップボードã«ã‚³ãƒ”ー" name="copy"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/notifications.xml b/indra/newview/skins/default/xui/ja/notifications.xml
index c0af0e03ff..54031ccf12 100644
--- a/indra/newview/skins/default/xui/ja/notifications.xml
+++ b/indra/newview/skins/default/xui/ja/notifications.xml
@@ -84,6 +84,40 @@
ç¾åœ¨ã®è¡£é¡žã€èº«ä½“部ä½ã®å¤‰æ›´ã‚’ä¿å­˜ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="ä¿å­˜ã—ãªã„" yestext="ä¿å­˜"/>
</notification>
+ <notification name="ConfirmNoCopyToOutbox">
+ ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã® 1 ã¤ã¾ãŸã¯è¤‡æ•°ã‚’マーãƒãƒ£ãƒ³ãƒˆã‚¢ã‚¦ãƒˆãƒœãƒƒã‚¯ã‚¹ã«ã‚³ãƒ”ーã™ã‚‹è¨±å¯ãŒã‚ã‚Šã¾ã›ã‚“。移動ã™ã‚‹ã‹ã€ç½®ã去りã«ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã™ã€‚
+ <usetemplate name="okcancelbuttons" notext="アイテムを移動ã—ãªã„" yestext="アイテムを移動"/>
+ </notification>
+ <notification name="OutboxFolderCreated">
+ マーãƒãƒ£ãƒ³ãƒˆã‚¢ã‚¦ãƒˆãƒœãƒƒã‚¯ã‚¹ã®æœ€ä¸Šä½ã«è»¢é€ã—ãŸå„アイテムã«ã¤ãã€ãã‚Œãžã‚Œ 1 ã¤ã®æ–°ã—ã„フォルダãŒä½œæˆã•ã‚Œã¾ã—ãŸã€‚
+ <usetemplate ignoretext="æ–°ã—ã„フォルダãŒãƒžãƒ¼ãƒãƒ£ãƒ³ãƒˆã‚¢ã‚¦ãƒˆãƒœãƒƒã‚¯ã‚¹å†…ã«ä½œæˆã•ã‚Œã¾ã—ãŸ" name="okignore" yestext="OK"/>
+ </notification>
+ <notification name="OutboxImportComplete">
+ æˆåŠŸ
+
+マーケットプレイスã«æ­£å¸¸ã«é€ä¿¡ã•ã‚ŒãŸã™ã¹ã¦ã®ãƒ•ã‚©ãƒ«ãƒ€
+ <usetemplate ignoretext="マーケットプレイスã«é€ä¿¡ã•ã‚ŒãŸã™ã¹ã¦ã®ãƒ•ã‚©ãƒ«ãƒ€" name="okignore" yestext="OK"/>
+ </notification>
+ <notification name="OutboxImportHadErrors">
+ 一部ã®ãƒ•ã‚©ãƒ«ãƒ€ã¯è»¢é€ã•ã‚Œã¾ã›ã‚“ã§ã—ãŸ
+
+一部ã®ãƒ•ã‚©ãƒ«ãƒ€ãŒãƒžãƒ¼ã‚±ãƒƒãƒˆãƒ—レイスã«é€ä¿¡ã•ã‚ŒãŸã¨ãã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã“れらã®ãƒ•ã‚©ãƒ«ãƒ€ã¯ã¾ã ãƒžãƒ¼ãƒãƒ£ãƒ³ãƒˆã‚¢ã‚¦ãƒˆãƒœãƒƒã‚¯ã‚¹å†…ã«ã‚ã‚Šã¾ã™ã€‚
+
+詳細ã«ã¤ã„ã¦ã¯ã€[[MARKETPLACE_IMPORTS_URL] エラーログ]ã‚’ã”覧ãã ã•ã„。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="OutboxImportFailed">
+ 転é€ã«å¤±æ•—
+
+システムã¾ãŸã¯ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã®ã‚¨ãƒ©ãƒ¼ã®ãŸã‚ã€ãƒ•ã‚©ãƒ«ãƒ€ã¯ãƒžãƒ¼ã‚±ãƒƒãƒˆãƒ—レイスã«é€ä¿¡ã•ã‚Œã¾ã›ã‚“ã§ã—ãŸã€‚後ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="OutboxInitFailed">
+ マーケットプレイスã®åˆæœŸåŒ–ã«å¤±æ•—
+
+システムã¾ãŸã¯ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã®ã‚¨ãƒ©ãƒ¼ã®ãŸã‚ã€ãƒžãƒ¼ã‚±ãƒƒãƒˆãƒ—レイスã®åˆæœŸåŒ–ã«å¤±æ•—ã—ã¾ã—ãŸã€‚後ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="CompileQueueSaveText">
次ã®ç†ç”±ã§ã€ã‚¹ã‚¯ãƒªãƒ—ト用テキストã®ã‚¢ãƒƒãƒ—ロード時ã«å•é¡ŒãŒèµ·ã“ã‚Šã¾ã—ãŸã€‚
[REASON]
@@ -113,9 +147,13 @@
フレンド以外ã‹ã‚‰ã®ã‚³ãƒ¼ãƒ«ã‚„インスタントメッセージを無視ã™ã‚‹è¨­å®šã«ã—ãŸã“ã¨ã‚’ã€ç›¸æ‰‹ã«çŸ¥ã‚‰ã‚Œã‚‹ã“ã¨ã¯ã‚ã‚Šã¾ã›ã‚“。
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="FavoritesOnLogin">
+ 注æ„:ã“ã®ã‚ªãƒ—ションを有効ã«ã™ã‚‹ã¨ã€ã“ã®ãƒ‘ソコンを使ã†ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯èª°ã§ã‚‚ã€ã‚ãªãŸã®ãŠæ°—ã«å…¥ã‚Šã®å ´æ‰€ã‚’見るã“ã¨ãŒã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="GrantModifyRights">
- 他人ã«ä¿®æ­£æ¨©é™ã‚’与ãˆã‚‹ã¨ã€æ¨©é™ã‚’与ãˆã‚‰ã‚ŒãŸäººã¯ã‚ãªãŸãŒæ‰€æœ‰ã™ã‚‹ã‚¤ãƒ³ãƒ¯ãƒ¼ãƒ«ãƒ‰ã®ã‚ªãƒ–ジェクトを変更ã€å‰Šé™¤ã€æŒã¡å¸°ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ ã“ã®æ¨©é™ã‚’与ãˆã‚‹éš›ã«ã¯å分ã«æ³¨æ„ã—ã¦ãã ã•ã„。
-[FIRST_NAME] [LAST_NAME] ã«ä¿®æ­£æ¨©é™ã‚’与ãˆã¾ã™ã‹ï¼Ÿ
+ 他人ã«ä¿®æ­£æ¨©é™ã‚’与ãˆã‚‹ã¨ã€æ¨©é™ã‚’与ãˆã‚‰ã‚ŒãŸäººã¯ã‚ãªãŸãŒæ‰€æœ‰ã™ã‚‹ã‚¤ãƒ³ãƒ¯ãƒ¼ãƒ«ãƒ‰ã®ã‚ªãƒ–ジェクトを変更ã€å‰Šé™¤ã€æŒã¡å¸°ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã“ã®æ¨©é™ã‚’与ãˆã‚‹éš›ã«ã¯å分ã«æ³¨æ„ã—ã¦ãã ã•ã„。
+[NAME] ã«ä¿®æ­£æ¨©é™ã‚’与ãˆã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
</notification>
<notification name="GrantModifyRightsMultiple">
@@ -124,7 +162,7 @@
<usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
</notification>
<notification name="RevokeModifyRights">
- [FIRST_NAME] [LAST_NAME] ã«å¯¾ã—ã¦å¤‰æ›´æ¨©é™ã‚’å–り消ã—ã¾ã™ã‹ï¼Ÿ
+ [NAME] ã®ä¿®æ­£æ¨©é™ã‚’解約ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
</notification>
<notification name="RevokeModifyRightsMultiple">
@@ -226,7 +264,7 @@ L$ ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã
<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
<notification name="ReturnObjectsDeededToGroup">
- ã“ã®åŒºç”»ã®ã‚°ãƒ«ãƒ¼ãƒ— [NAME] 共有ã®ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトをã€ä»¥å‰ã®æ‰€æœ‰è€…ã®ã€ŒæŒã¡ç‰©ã€ã«æˆ»ãã†ã¨ã—ã¦ã„ã¾ã™ã€‚
+ ã“ã®åŒºç”»ã®ã‚°ãƒ«ãƒ¼ãƒ— [NAME] 共有ã®ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトをã€ä»¥å‰ã®æ‰€æœ‰è€…ã®ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã«æˆ»ãã†ã¨ã—ã¦ã„ã¾ã™ã€‚
æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ
*警告* ã“ã‚Œã«ã‚ˆã‚Šã€
@@ -237,21 +275,21 @@ L$ ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã
<notification name="ReturnObjectsOwnedByUser">
ã“ã®åŒºç”»ã§ã€
ä½äºº [NAME] ãŒæ‰€æœ‰ã™ã‚‹å…¨ã¦ã®ã‚ªãƒ–ジェクトを
-本人ã®ã€ŒæŒã¡ç‰©ã€ã«æœ¬å½“ã«è¿”å´ã—ã¦ã‚‚よã„ã§ã™ã‹ï¼Ÿ
+本人ã®ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã«æœ¬å½“ã«è¿”å´ã—ã¦ã‚‚よã„ã§ã™ã‹ï¼Ÿ
オブジェクト: [N]
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="ReturnObjectsOwnedBySelf">
ã“ã®åœŸåœ°åŒºç”»å†…ã«ã‚ã‚‹ã€ã‚ãªãŸãŒæ‰€æœ‰ã™ã‚‹ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトをã€
-ã‚ãªãŸã®ã€ŒæŒã¡ç‰©ã€ã«æˆ»ãã†ã¨ã—ã¦ã„ã¾ã™ã€‚続ã‘ã¾ã™ã‹ï¼Ÿ
+ã‚ãªãŸã®ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã«æˆ»ãã†ã¨ã—ã¦ã„ã¾ã™ã€‚続ã‘ã¾ã™ã‹ï¼Ÿ
オブジェクト: [N]
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="ReturnObjectsNotOwnedBySelf">
ã“ã®åœŸåœ°åŒºç”»å†…ã«ã‚ã‚‹ã€ã‚ãªãŸä»¥å¤–ãŒæ‰€æœ‰ã™ã‚‹ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトをã€
-ãã‚Œãžã‚Œã®æ‰€æœ‰è€…ã®ã€ŒæŒã¡ç‰©ã€ã«æˆ»ãã†ã¨ã—ã¦ã„ã¾ã™ã€‚
+ãã‚Œãžã‚Œã®æ‰€æœ‰è€…ã®ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã«æˆ»ãã†ã¨ã—ã¦ã„ã¾ã™ã€‚
æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ
グループã«è­²æ¸¡ã•ã‚ŒãŸã€Œå†è²©ãƒ»ãƒ—レゼントå¯ã€ã®ã‚ªãƒ–ジェクトã¯ã€ä»¥å‰ã®æ‰€æœ‰è€…ã«è¿”å´ã•ã‚Œã¾ã™ã€‚
@@ -262,7 +300,7 @@ L$ ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã
</notification>
<notification name="ReturnObjectsNotOwnedByUser">
ã“ã®åœŸåœ°åŒºç”»å†…ã«ã‚ã‚‹ã€
-[NAME]以外ã«ã‚ˆã‚‹æ‰€æœ‰ã®ã‚ªãƒ–ジェクトをã™ã¹ã¦ãã‚Œãžã‚Œã®æ‰€æœ‰è€…ã®ã€ŒæŒã¡ç‰©ã€ã«è¿”å´ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚
+[NAME]以外ã«ã‚ˆã‚‹æ‰€æœ‰ã®ã‚ªãƒ–ジェクトをã™ã¹ã¦ãã‚Œãžã‚Œã®æ‰€æœ‰è€…ã®ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã«è¿”å´ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚
æ“作を続行ã—ã¾ã™ã‹ï¼Ÿã‚°ãƒ«ãƒ¼ãƒ—ã«è­²æ¸¡ã•ã‚ŒãŸã€Œå†è²©ãƒ»ãƒ—レゼントå¯ã€ã®ã‚ªãƒ–ジェクトã¯ã€ä»¥å‰ã®æ‰€æœ‰è€…ã«è¿”å´ã•ã‚Œã¾ã™ã€‚
*警告* ã“ã‚Œã«ã‚ˆã‚Šã€
@@ -339,24 +377,17 @@ L$ ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã
ã¾ã èª­ã¿è¾¼ã¾ã‚Œã¦ã„ãªã„ãŸã‚ã€ãã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’装ç€ã§ãã¾ã›ã‚“。後ã§ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。
</notification>
<notification name="MustHaveAccountToLogIn">
- ãŠã£ã¨ï¼è¨˜å…¥æ¼ã‚ŒãŒã‚ã‚Šã¾ã™ã‚ˆã€‚
-ã‚¢ãƒã‚¿ãƒ¼ã®ãƒ•ã‚¡ãƒ¼ã‚¹ãƒˆãƒãƒ¼ãƒ ã¨ãƒ©ã‚¹ãƒˆãƒãƒ¼ãƒ ã®ä¸¡æ–¹ã‚’入力ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚
+ 注æ„:記入æ¼ã‚Œã®ç®‡æ‰€ãŒã‚ã‚Šã¾ã™ã€‚
+ã‚¢ãƒã‚¿ãƒ¼ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼åを入力ã—ã¦ãã ã•ã„。
-[SECOND_LIFE] ã«å…¥ã‚‹ã«ã¯ã€ã‚¢ã‚«ã‚¦ãƒ³ãƒˆãŒå¿…è¦ã§ã™ã€‚ アカウントを作æˆã—ã¾ã™ã‹ï¼Ÿ
+[SECOND_LIFE] ã«å…¥ã‚‹ã«ã¯ã‚¢ã‚«ã‚¦ãƒ³ãƒˆãŒå¿…è¦ã§ã™ã€‚今ã™ãアカウントを作æˆã—ã¾ã™ã‹ï¼Ÿ
<url name="url">
https://join.secondlife.com/index.php?lang=ja-JP
</url>
<usetemplate name="okcancelbuttons" notext="ã‚‚ã†ä¸€åº¦è©¦ã™" yestext="æ–°ã—ã„アカウントを作æˆ"/>
</notification>
<notification name="InvalidCredentialFormat">
- 「ユーザーãƒãƒ¼ãƒ ã€æ¬„ã«ã‚¢ãƒã‚¿ãƒ¼ã®ãƒ•ã‚¡ãƒ¼ã‚¹ãƒˆãƒãƒ¼ãƒ ã¨ãƒ©ã‚¹ãƒˆãƒãƒ¼ãƒ ä¸¡æ–¹ã‚’入力ã—ã¦ã‹ã‚‰ãƒ­ã‚°ã‚¤ãƒ³ã—ã¦ãã ã•ã„。
- </notification>
- <notification name="AddClassified">
- クラシファイド広告ã¯ã€æ¤œç´¢ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¨ [http://secondlife.com/community/classifieds secondlife.com] ã®ã€Œã‚¯ãƒ©ã‚·ãƒ•ã‚¡ã‚¤ãƒ‰åºƒå‘Šã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã«ä¸€é€±é–“掲載ã•ã‚Œã¾ã™ã€‚
-広告を記入ã—ãŸã‚‰ã€ã€ŒæŽ²è¼‰...ã€ã‚’クリックã—ã¦ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«è¿½åŠ ã—ã¦ãã ã•ã„。
-「掲載ã€ã‚’クリックã™ã‚‹ã¨ã€æ”¯æ‰•ã„ãŸã„金é¡ã‚’å°‹ã­ã‚‰ã‚Œã¾ã™ã€‚
-支払金é¡ãŒå¤šã„ã»ã©ã‚ãªãŸã®åºƒå‘Šã¯ä¸€è¦§ã¨ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰æ¤œç´¢ã§ä¸Šä½ã«è¡¨ç¤ºã•ã‚Œã¾ã™ã€‚
- <usetemplate ignoretext="æ–°è¦ã‚¯ãƒ©ã‚·ãƒ•ã‚¡ã‚¤ãƒ‰åºƒå‘Šä½œæˆæ–¹æ³•" name="okcancelignore" notext="å–り消ã—" yestext="OK"/>
+ ユーザーåã®ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã«ã‚¢ãƒã‚¿ãƒ¼ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼åã‚‚ã—ãã¯æ°åを入力ã—ã¦ã‹ã‚‰ã€å†åº¦ãƒ­ã‚°ã‚¤ãƒ³ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚
</notification>
<notification name="DeleteClassified">
クラシファイド広告 [NAME] を削除ã—ã¾ã™ã‹ï¼Ÿ
@@ -410,6 +441,9 @@ L$ ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã
<notification name="ChangeSkin">
æ–°ã—ã„スキン㯠[APP_NAME] ã‚’å†èµ·å‹•å¾Œã«è¡¨ç¤ºã•ã‚Œã¾ã™ã€‚
</notification>
+ <notification name="ChangeLanguage">
+ 言語ã®å¤‰æ›´ã¯ [APP_NAME] ã‚’å†èµ·å‹•å¾Œã«å映ã•ã‚Œã¾ã™ã€‚
+ </notification>
<notification name="GoToAuctionPage">
[SECOND_LIFE]ã® Web ページã«ç§»å‹•ã—ã€å…¥æœ­ã‚ã‚‹ã„ã¯ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ã®è©³ç´°ã‚’確èªã—ã¾ã™ã‹ï¼Ÿ
<url name="url">
@@ -430,14 +464,14 @@ L$ ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã
ジェスãƒãƒ£ãƒ¼ã®ä¿å­˜ã«å¤±æ•—ã—ã¾ã—ãŸã€‚å°‘ã—å¾…ã£ã¦ã‹ã‚‰ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。
</notification>
<notification name="GestureSaveFailedObjectNotFound">
- ジェスãƒãƒ£ãƒ¼ã®ä¿å­˜ã«å¤±æ•—ã—ã¾ã—ãŸã€‚オブジェクトã€ã¾ãŸã¯é–¢é€£ã™ã‚‹ã‚ªãƒ–ジェクトæŒã¡ç‰©ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。
+ ジェスãƒãƒ£ãƒ¼ã®ä¿å­˜ã«å¤±æ•—ã—ã¾ã—ãŸã€‚オブジェクトã€ã¾ãŸã¯é–¢é€£ã™ã‚‹ã‚ªãƒ–ジェクトインベントリãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。
オブジェクトãŒç¯„囲内ã«å­˜åœ¨ã—ãªã„ã‹ã€ã¾ãŸã¯å‰Šé™¤ã•ã‚ŒãŸå¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚
</notification>
<notification name="GestureSaveFailedReason">
次ã®ç†ç”±ã§ã€ã‚¸ã‚§ã‚¹ãƒãƒ£ãƒ¼ã®ä¿å­˜æ™‚ã«å•é¡ŒãŒèµ·ã“ã‚Šã¾ã—ãŸã€‚ [REASON]。 後ã§ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。
</notification>
<notification name="SaveNotecardFailObjectNotFound">
- ノートカードã®ä¿å­˜ã«å¤±æ•—ã—ã¾ã—ãŸã€‚オブジェクトã€ã¾ãŸã¯é–¢é€£ã™ã‚‹ã‚ªãƒ–ジェクトæŒã¡ç‰©ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。
+ ノートカードã®ä¿å­˜ã«å¤±æ•—ã—ã¾ã—ãŸã€‚オブジェクトã€ã¾ãŸã¯é–¢é€£ã™ã‚‹ã‚ªãƒ–ジェクトインベントリãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。
オブジェクトãŒç¯„囲内ã«å­˜åœ¨ã—ãªã„ã‹ã€ã¾ãŸã¯å‰Šé™¤ã•ã‚ŒãŸå¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚
</notification>
<notification name="SaveNotecardFailReason">
@@ -501,11 +535,11 @@ L$ ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã
[REGION] ã§ã¯ã€åœ°å½¢ã®å¤‰æ›´ãŒã§ãã¾ã›ã‚“。
</notification>
<notification name="CannotCopyWarning">
- ã‚ãªãŸã«ã¯[ITEMS]ã¨ã„ã†ã‚¢ã‚¤ãƒ†ãƒ ã‚’コピーã™ã‚‹è¨±å¯ãŒã‚ã‚Šã¾ã›ã‚“。他ã®ä½äººã«æä¾›ã™ã‚‹ã¨ã€ãã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ã‚ãªãŸã®ã€ŒæŒã¡ç‰©ã€ã‹ã‚‰å‰Šé™¤ã•ã‚Œã¾ã™ã€‚本当ã«ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’譲りã¾ã™ã‹ï¼Ÿ
+ ã‚ãªãŸã«ã¯[ITEMS]ã¨ã„ã†ã‚¢ã‚¤ãƒ†ãƒ ã‚’コピーã™ã‚‹è¨±å¯ãŒã‚ã‚Šã¾ã›ã‚“。他ã®ä½äººã«æä¾›ã™ã‚‹ã¨ã€ãã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ã‚ãªãŸã®ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã‹ã‚‰å‰Šé™¤ã•ã‚Œã¾ã™ã€‚本当ã«ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’譲りã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
</notification>
<notification name="CannotGiveItem">
- æŒã¡ç‰©ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’渡ã›ã¾ã›ã‚“。
+ インベントリã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’渡ã›ã¾ã›ã‚“。
</notification>
<notification name="TransactionCancelled">
å–引ãŒã‚­ãƒ£ãƒ³ã‚»ãƒ«ã•ã‚Œã¾ã—ãŸã€‚
@@ -518,7 +552,7 @@ L$ ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã
</notification>
<notification name="CannotCopyCountItems">
ã‚ãªãŸã¯é¸æŠžã—㟠[COUNT] 個ã®ã‚¢ã‚¤ãƒ†ãƒ ã®ã®ã‚³ãƒ”ーを許ã•ã‚Œã¦ã„ã¾ã›ã‚“。
-ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ã‚ãªãŸã®ã€ŒæŒã¡ç‰©ã€ã‹ã‚‰å¤±ã‚ã‚Œã¾ã™ã€‚
+ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ã‚ãªãŸã®ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã‹ã‚‰å¤±ã‚ã‚Œã¾ã™ã€‚
本当ã«ã‚¢ã‚¤ãƒ†ãƒ ã‚’渡ã—ãŸã„ã§ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
</notification>
@@ -623,6 +657,10 @@ L$ ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã
WAV ヘッダーã«ãƒ‡ãƒ¼ã‚¿ãƒãƒ£ãƒ³ã‚¯ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“:
[FILE]
</notification>
+ <notification name="SoundFileInvalidChunkSize">
+ WAV ファイルã®ãƒãƒ£ãƒ³ã‚¯ã‚µã‚¤ã‚ºãŒé–“é•ã£ã¦ã„ã¾ã™ï¼š
+[FILE]
+ </notification>
<notification name="SoundFileInvalidTooLong">
オーディオファイルãŒé•·ã™ãŽã¾ã™ã€‚(最大 10 秒):
[FILE]
@@ -655,7 +693,7 @@ L$ ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã
出力ファイルを作æˆã§ãã¾ã›ã‚“: [FILE]
</notification>
<notification name="DoNotSupportBulkAnimationUpload">
- ç¾åœ¨ [APP_NAME] ã§ã¯ã€ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã®ä¸€æ‹¬ã‚¢ãƒƒãƒ—ロードã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“。
+ ç¾åœ¨ [APP_NAME] ã§ã¯ã€BVH å½¢å¼ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ãƒ•ã‚¡ã‚¤ãƒ«ã®ä¸€æ‹¬ã‚¢ãƒƒãƒ—ロードã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“。
</notification>
<notification name="CannotUploadReason">
次ã®ç†ç”±ã§ã€ã€Œ [FILE] ã€ã‚’アップロードã§ãã¾ã›ã‚“: [REASON]
@@ -758,7 +796,7 @@ L$ ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã
テレãƒãƒ¼ãƒˆç›®çš„地を見ã¤ã‘られã¾ã›ã‚“。目的地ãŒä¸€æ™‚çš„ã«åˆ©ç”¨ã§ããªã„状態ã‹ã€ã™ã§ã«æ¶ˆæ»…ã—ã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚数分後ã«ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。
</notification>
<notification name="no_inventory_host">
- æŒã¡ç‰©ã‚·ã‚¹ãƒ†ãƒ ã¯ç¾åœ¨åˆ©ç”¨ã§ãã¾ã›ã‚“。
+ インベントリシステムã¯ç¾åœ¨åˆ©ç”¨ã§ãã¾ã›ã‚“。
</notification>
<notification name="CannotSetLandOwnerNothingSelected">
土地所有者設定ãŒã§ãã¾ã›ã‚“:
@@ -921,7 +959,7 @@ L$ ã¯è¿”金ã•ã‚Œã¾ã›ã‚“。
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="ConfirmItemCopy">
- ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’ã‚ãªãŸã®æŒã¡ç‰©ã«ã‚³ãƒ”ーã—ã¾ã™ã‹ï¼Ÿ
+ ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’ã‚ãªãŸã®ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã«ã‚³ãƒ”ーã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="コピー"/>
</notification>
<notification name="ResolutionSwitchFail">
@@ -950,12 +988,6 @@ L$ ã¯è¿”金ã•ã‚Œã¾ã›ã‚“。
グループ用ã®åœŸåœ°ã®è³¼å…¥ãŒã§ãã¾ã›ã‚“:
ã‚ãªãŸã«ã¯ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªã‚°ãƒ«ãƒ¼ãƒ—ã®ãŸã‚ã«åœŸåœ°ã‚’購入ã™ã‚‹æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“。
</notification>
- <notification label="フレンド登録" name="AddFriend">
- フレンド登録ã™ã‚‹ã¨ã€ãŠäº’ã„ã®ç¾åœ¨åœ°ã®åœ°å›³ã¸ã®è¡¨ç¤ºè¨±å¯ã€ã‚ªãƒ³ãƒ©ã‚¤ãƒ³çŠ¶æ…‹ã®è¡¨ç¤ºè¨­å®šãŒã§ãã¾ã™ã€‚
-
-[NAME] ã«ãƒ•ãƒ¬ãƒ³ãƒ‰ã‚·ãƒƒãƒ—ã‚’é€ã‚Šã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
- </notification>
<notification label="フレンド登録" name="AddFriendWithMessage">
フレンド登録ã™ã‚‹ã¨ã€ãŠäº’ã„ã®ç¾åœ¨åœ°ã®åœ°å›³ã¸ã®è¡¨ç¤ºè¨±å¯ã€ã‚ªãƒ³ãƒ©ã‚¤ãƒ³çŠ¶æ…‹ã®è¡¨ç¤ºè¨­å®šãŒã§ãã¾ã™ã€‚
@@ -974,17 +1006,17 @@ L$ ã¯è¿”金ã•ã‚Œã¾ã›ã‚“。
<input name="message">
[DESC] (新)
</input>
- <button name="Offer" text="OK"/>
+ <button name="OK" text="OK"/>
<button name="Cancel" text="キャンセル"/>
</form>
</notification>
<notification label="ç€ç”¨ç‰©ã‚’ä¿å­˜" name="SaveWearableAs">
- アイテムを別åã§æŒã¡ç‰©ã«ä¿å­˜ï¼š
+ アイテムを別åã§ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã«ä¿å­˜ï¼š
<form name="form">
<input name="message">
[DESC](新è¦ï¼‰
</input>
- <button name="Offer" text="OK"/>
+ <button name="OK" text="OK"/>
<button name="Cancel" text="å–り消ã—"/>
</form>
</notification>
@@ -994,12 +1026,12 @@ L$ ã¯è¿”金ã•ã‚Œã¾ã›ã‚“。
<input name="new_name">
[NAME]
</input>
- <button name="Offer" text="OK"/>
+ <button name="OK" text="OK"/>
<button name="Cancel" text="å–り消ã—"/>
</form>
</notification>
<notification name="RemoveFromFriends">
- [FIRST_NAME] [LAST_NAME] をフレンドリストã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ
+ フレンドリストã‹ã‚‰ &lt;nolink&gt;[NAME]&lt;/nolink&gt; を削除ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="RemoveMultipleFromFriends">
@@ -1122,22 +1154,24 @@ L$ ã¯è¿”金ã•ã‚Œã¾ã›ã‚“。
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="DeedLandToGroupWithContribution">
- ã“ã®åŒºç”»ã®è­²æ¸¡ã«éš›ã—ã¦ã¯ã€ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ãŒå分ãªåœŸåœ°ã‚¯ãƒ¬ã‚¸ãƒƒãƒˆã‚’ä¿æœ‰ãŠã‚ˆã³ç¶­æŒã—ã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚
-ã“ã®è­²æ¸¡ã«ã‚ˆã‚Šã€
-「 [FIRST_NAME] [LAST_NAME] ã€ã‹ã‚‰
-グループã«å¯¾ã—ã¦åœŸåœ°ãŒåŒæ™‚ã«æä¾›ã•ã‚Œã¾ã™ã€‚
-土地ã®è³¼å…¥ä¾¡æ ¼ã¯ã€æ‰€æœ‰è€…ã«ã¯è¿”金ã•ã‚Œã¾ã›ã‚“。
-譲渡ã•ã‚ŒãŸåŒºç”»ãŒå£²ã‚Œã‚‹ã¨ã€å£²ä¸Šé‡‘é¡ã¯ã‚°ãƒ«ãƒ¼ãƒ—メンãƒãƒ¼ã«å‡ç­‰ã«åˆ†é…ã•ã‚Œã¾ã™ã€‚
-
-ã“ã® [AREA] 平方メートルã®åœŸåœ°ã‚’ã€ã€Œ [GROUP_NAME] ã€ã«è­²æ¸¡ã—ã¾ã™ã‹ï¼Ÿ
+ ã“ã®åŒºç”»ãŒè­²æ¸¡ã•ã‚Œã‚‹ã¨ã€ã‚°ãƒ«ãƒ¼ãƒ—ã¯ãã®åœŸåœ°åˆ©ç”¨æ–™ã¨ã—ã¦å分ãªæ®‹é«˜ã‚’維æŒã—ã¦ã„ãå¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚
+譲渡ã«ã¯åŒæ™‚ã« [NAME] ã‹ã‚‰ã‚°ãƒ«ãƒ¼ãƒ—ã¸ã®åœŸåœ°ã®è²¢çŒ®ãŒå«ã¾ã‚Œã¾ã™ã€‚
+土地ã®è³¼å…¥ä¾¡æ ¼ã¯æ‰€æœ‰è€…ã«è¿”金ã•ã‚Œã¾ã›ã‚“。譲渡ã•ã‚ŒãŸåŒºç”»ãŒå£²å´ã•ã‚Œã‚‹ã¨ã€è²©å£²ä¾¡æ ¼ã¯ã‚°ãƒ«ãƒ¼ãƒ—メンãƒãƒ¼ã®é–“ã§å‡ç­‰ã«åˆ†é…ã•ã‚Œã¾ã™ã€‚
+
+ã“ã® [AREA] m² ã®åœŸåœ°ã‚’ [GROUP_NAME] ã¨ã„ã†ã‚°ãƒ«ãƒ¼ãƒ—ã«è­²æ¸¡ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="DisplaySetToSafe">
-safe オプションを指定ã—ãŸã®ã§ã€
表示設定ã¯ã‚»ãƒ¼ãƒ•ãƒ¬ãƒ™ãƒ«ã«è¨­å®šã•ã‚Œã¦ã„ã¾ã™ã€‚
</notification>
- <notification name="DisplaySetToRecommended">
- 表示設定ã¯ã€ã‚ãªãŸã®ã‚·ã‚¹ãƒ†ãƒ æ§‹æˆã«åŸºã¥ã„ã¦æŽ¨å¥¨ã•ã‚ŒãŸãƒ¬ãƒ™ãƒ«ã«è¨­å®šã•ã‚Œã¦ã„ã¾ã™ã€‚
+ <notification name="DisplaySetToRecommendedGPUChange">
+ グラフィックã®å¤‰æ›´ã«ã‚ˆã‚Šã€ç”»é¢è¨­å®šã¯æŽ¨å¥¨ãƒ¬ãƒ™ãƒ«ã«è¨­å®šã•ã‚Œã¾ã—ãŸã€‚
+&apos;[LAST_GPU]&apos; ã‹ã‚‰
+&apos;[THIS_GPU]&apos; ã¾ã§
+ </notification>
+ <notification name="DisplaySetToRecommendedFeatureChange">
+ レンダリングサブシステムã®å¤‰æ›´ã«ã‚ˆã‚Šã€ç”»é¢è¨­å®šã¯æŽ¨å¥¨ãƒ¬ãƒ™ãƒ«ã«è¨­å®šã•ã‚Œã¾ã—ãŸã€‚
</notification>
<notification name="ErrorMessage">
[ERROR_MESSAGE]
@@ -1374,6 +1408,45 @@ SHA1 フィンガープリント: [MD5_DIGEST]
ã‚ãªãŸã®ã‚¢ãƒ—リケーションフォルダã«ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="続行" yestext="ダウンロード"/>
</notification>
+ <notification name="FailedUpdateInstall">
+ ビューワã®ã‚¢ãƒƒãƒ—デートをインストール中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚
+http://secondlife.com/download ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã—ã¦ãã ã•ã„。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="FailedRequiredUpdateInstall">
+ å¿…è¦ãªã‚¢ãƒƒãƒ—デートをインストールã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
+[APP_NAME] ãŒã‚¢ãƒƒãƒ—デートã•ã‚Œã‚‹ã¾ã§ãƒ­ã‚°ã‚¤ãƒ³ã§ãã¾ã›ã‚“。
+
+http://secondlife.com/download ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã—ã¦ãã ã•ã„。
+ <usetemplate name="okbutton" yestext="終了"/>
+ </notification>
+ <notification name="UpdaterServiceNotRunning">
+ ãŠä½¿ã„ã® Second Life ã«å¿…è¦ãªã‚¢ãƒƒãƒ—デートãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•ã‚Œã¦ã„ã¾ã›ã‚“。
+
+ã“ã®ã‚¢ãƒƒãƒ—デートã¯ã€http://www.secondlife.com/downloads ã‹ã‚‰ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã—ã¦ã€ä»Šã™ãインストールã§ãã¾ã™ã€‚
+ <usetemplate name="okcancelbuttons" notext="終了" yestext="今ã™ãダウンロードã—ã¦ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«"/>
+ </notification>
+ <notification name="DownloadBackgroundTip">
+ ãŠä½¿ã„ã® [APP_NAME] ã«å¿…è¦ãªã‚¢ãƒƒãƒ—デートをダウンロードã—ã¾ã—ãŸã€‚
+ãƒãƒ¼ã‚¸ãƒ§ãƒ³ [VERSION] [[RELEASE_NOTES_FULL_URL] ã“ã®ã‚¢ãƒƒãƒ—デートã«é–¢ã™ã‚‹æƒ…å ±]
+ <usetemplate name="okcancelbuttons" notext="後ã§å®Ÿè¡Œ" yestext="今ã™ãインストールã—㦠[APP_NAME] ã‚’å†èµ·å‹•"/>
+ </notification>
+ <notification name="DownloadBackgroundDialog">
+ ãŠä½¿ã„ã® [APP_NAME] ã«å¿…è¦ãªã‚¢ãƒƒãƒ—デートをダウンロードã—ã¾ã—ãŸã€‚
+ãƒãƒ¼ã‚¸ãƒ§ãƒ³ [VERSION] [[RELEASE_NOTES_FULL_URL] ã“ã®ã‚¢ãƒƒãƒ—デートã«é–¢ã™ã‚‹æƒ…å ±]
+ <usetemplate name="okcancelbuttons" notext="後ã§å®Ÿè¡Œ" yestext="今ã™ãインストールã—㦠[APP_NAME] ã‚’å†èµ·å‹•"/>
+ </notification>
+ <notification name="RequiredUpdateDownloadedVerboseDialog">
+ å¿…è¦ãªã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã®ã‚¢ãƒƒãƒ—デートをダウンロードã—ã¾ã—ãŸã€‚
+ãƒãƒ¼ã‚¸ãƒ§ãƒ³ [VERSION]
+
+アップデートをインストールã™ã‚‹ã«ã¯ [APP_NAME] ã‚’å†èµ·å‹•ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="RequiredUpdateDownloadedDialog">
+ アップデートをインストールã™ã‚‹ã«ã¯ [APP_NAME] ã‚’å†èµ·å‹•ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="DeedObjectToGroup">
ã“ã®ã‚ªãƒ–ジェクトを譲渡ã™ã‚‹ã¨ã‚°ãƒ«ãƒ¼ãƒ—ã¯ä»¥ä¸‹ã®ã“ã¨ãŒå¯èƒ½ã§ã™ï¼š
* オブジェクトã«æ”¯æ‰•ã‚れ㟠L$ ã‚’å—é ˜ã—ã¾ã™ã€‚
@@ -1420,8 +1493,8 @@ SHA1 フィンガープリント: [MD5_DIGEST]
<usetemplate ignoretext="オブジェクトを所有者ã«è¿”å´ã™ã‚‹å‰ã®ç¢ºèª" name="okcancelignore" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="GroupLeaveConfirmMember">
- ç¾åœ¨ã‚ãªãŸã¯ [GROUP] ã®ãƒ¡ãƒ³ãƒãƒ¼ã§ã™ã€‚
-ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—を抜ã‘ã¾ã™ã‹ï¼Ÿ
+ ç¾åœ¨ã€ã‚ãªãŸã¯ &lt;nolink&gt;[GROUP]&lt;/nolink&gt; グループã®ãƒ¡ãƒ³ãƒãƒ¼ã§ã™ã€‚
+グループã‹ã‚‰è„±é€€ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="ConfirmKick">
@@ -1506,6 +1579,46 @@ SHA1 フィンガープリント: [MD5_DIGEST]
<button name="Cancel" text="å–り消ã—"/>
</form>
</notification>
+ <notification name="SetDisplayNameSuccess">
+ [DISPLAY_NAME] ã•ã‚“ã€
+
+ç¾å®Ÿã®ä¸–ç•Œã¨åŒã˜ãã€Second Life ã§ã‚‚æ–°ã—ã„åå‰ãŒæµ¸é€ã™ã‚‹ã«ã¯æ™‚é–“ãŒã‹ã‹ã‚Šã¾ã™ã€‚オブジェクトã€ã‚¹ã‚¯ãƒªãƒ—トã€æ¤œç´¢ãªã©ã§åå‰ãŒæ›´æ–°ã•ã‚Œã‚‹ã¾ã§ã«ï¼ˆ[http://wiki.secondlife.com/wiki/Setting_your_display_name your name to update])数日ã‹ã‹ã‚Šã¾ã™ã®ã§ã”了承ãã ã•ã„。
+ </notification>
+ <notification name="SetDisplayNameBlocked">
+ 申ã—訳ã‚ã‚Šã¾ã›ã‚“ãŒã€ç¾åœ¨è¡¨ç¤ºåã¯å¤‰æ›´ã§ãã¾ã›ã‚“。システムã®ã‚¨ãƒ©ãƒ¼ã ã¨æ€ã‚れる場åˆã¯ã€ã‚µãƒãƒ¼ãƒˆã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。
+ </notification>
+ <notification name="SetDisplayNameFailedLength">
+ 申ã—訳ã‚ã‚Šã¾ã›ã‚“ãŒã€ãã®åå‰ã¯é•·ã™ãŽã¾ã™ã€‚表示åã¯æœ€é•· [LENGTH] 文字ã¾ã§ã§ã™ã€‚
+
+ã‚‚ã†å°‘ã—短ã„åå‰ã‚’ãŠè©¦ã—ãã ã•ã„。
+ </notification>
+ <notification name="SetDisplayNameFailedGeneric">
+ 申ã—訳ã‚ã‚Šã¾ã›ã‚“ãŒã€è¡¨ç¤ºåを設定ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ã‚ã¨ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
+ </notification>
+ <notification name="SetDisplayNameMismatch">
+ 入力ã—ãŸè¡¨ç¤ºåãŒä¸€è‡´ã—ã¾ã›ã‚“。もã†ä¸€åº¦å…¥åŠ›ã—ã¦ãã ã•ã„。
+ </notification>
+ <notification name="AgentDisplayNameUpdateThresholdExceeded">
+ ã—ã°ã‚‰ãã¯è¡¨ç¤ºåを変更ã§ãã¾ã›ã‚“。
+
+http://wiki.secondlife.com/wiki/Setting_your_display_name ã‚’å‚ç…§ã—ã¦ãã ã•ã„。
+
+ã‚ã¨ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
+ </notification>
+ <notification name="AgentDisplayNameSetBlocked">
+ 申ã—訳ã‚ã‚Šã¾ã›ã‚“ãŒã€ãƒªã‚¯ã‚¨ã‚¹ãƒˆã•ã‚ŒãŸåå‰ã¯ç¦å¥ã‚’å«ã‚€ãŸã‚ã«è¨­å®šã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
+
+別ã®åå‰ã‚’ãŠè©¦ã—ãã ã•ã„。
+ </notification>
+ <notification name="AgentDisplayNameSetInvalidUnicode">
+ 設定ã—よã†ã¨ã™ã‚‹è¡¨ç¤ºåã«ã¯ä½¿ãˆãªã„文字ãŒå«ã¾ã‚Œã¾ã™ã€‚
+ </notification>
+ <notification name="AgentDisplayNameSetOnlyPunctuation">
+ 表示åã«ã¯å¥èª­ç‚¹ä»¥å¤–ã®æ–‡å­—ã‚’å«ã‚€å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚
+ </notification>
+ <notification name="DisplayNameUpdate">
+ [OLD_NAME] ([SLID]) 㯠[NEW_NAME] ã«å¤‰æ›´ã•ã‚Œã¾ã—ãŸã€‚
+ </notification>
<notification name="OfferTeleport">
次ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’æ·»ãˆã¦ç¾åœ¨åœ°ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã‚’é€ã‚Šã¾ã™ã‹ï¼Ÿ
<form name="form">
@@ -1516,6 +1629,11 @@ SHA1 フィンガープリント: [MD5_DIGEST]
<button name="Cancel" text="å–り消ã—"/>
</form>
</notification>
+ <notification name="TooManyTeleportOffers">
+ [OFFERS] 回ã«ã‚ãŸã£ã¦ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã‚’é€ã‚ã†ã¨ã—ã¾ã—ãŸãŒã€
+ãã‚Œã¯é™åº¦æ•° [LIMIT] を超ãˆã¦ã„ã¾ã™ã€‚
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="OfferTeleportFromGod">
ç¾åœ¨åœ°ã«ä½äººã‚’ゴッドサモンã—ã¾ã™ã‹ï¼Ÿ
<form name="form">
@@ -1778,7 +1896,7 @@ Adult 専用リージョンã«å…¥ã‚‹ã«ã¯ã€ä½äººã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆãŒå¹´é½¢ç¢
</notification>
<notification name="BuyCopy">
コピーを [OWNER] ã‹ã‚‰ L$ [PRICE] ã§è³¼å…¥ã—ã¾ã™ã‹ï¼Ÿ
-購入ã—ãŸã‚ªãƒ–ジェクトã¯ã€ã‚ãªãŸã®ã€ŒæŒã¡ç‰©ã€ã«ã‚³ãƒ”ーã•ã‚Œã¾ã™ã€‚
+購入ã—ãŸã‚ªãƒ–ジェクトã¯ã€ã‚ãªãŸã®ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã«ã‚³ãƒ”ーã•ã‚Œã¾ã™ã€‚
å¯èƒ½ãªæ“作ã¯ã€
修正:[MODIFYPERM]ã€ã‚³ãƒ”ー:[COPYPERM]ã€
å†è²©ãƒ»ãƒ—レゼント:[RESELLPERM] ã§ã™ã€‚
@@ -1786,7 +1904,7 @@ Adult 専用リージョンã«å…¥ã‚‹ã«ã¯ã€ä½äººã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆãŒå¹´é½¢ç¢
</notification>
<notification name="BuyCopyNoOwner">
L$ [PRICE] ã§ã‚³ãƒ”ーを購入ã—ã¾ã™ã‹ï¼Ÿ
-購入ã—ãŸã‚ªãƒ–ジェクトã¯ã€ã‚ãªãŸã®ã€ŒæŒã¡ç‰©ã€ã«ã‚³ãƒ”ーã•ã‚Œã¾ã™ã€‚
+購入ã—ãŸã‚ªãƒ–ジェクトã¯ã€ã‚ãªãŸã®ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã«ã‚³ãƒ”ーã•ã‚Œã¾ã™ã€‚
å¯èƒ½ãªæ“作ã¯ã€
修正:[MODIFYPERM]ã€ã‚³ãƒ”ー:[COPYPERM]ã€
å†è²©ãƒ»ãƒ—レゼント:[RESELLPERM] ã§ã™ã€‚
@@ -1794,12 +1912,12 @@ Adult 専用リージョンã«å…¥ã‚‹ã«ã¯ã€ä½äººã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆãŒå¹´é½¢ç¢
</notification>
<notification name="BuyContents">
中身を [OWNER] ã‹ã‚‰ L$ [PRICE] ã§è³¼å…¥ã—ã¾ã™ã‹ï¼Ÿ
-購入ã—ãŸä¸­èº«ã¯ã€ã‚ãªãŸã®ã€ŒæŒã¡ç‰©ã€ã«ã‚³ãƒ”ーã•ã‚Œã¾ã™ã€‚
+購入ã—ãŸä¸­èº«ã¯ã€ã‚ãªãŸã®ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã«ã‚³ãƒ”ーã•ã‚Œã¾ã™ã€‚
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="BuyContentsNoOwner">
L$ [PRICE] ã§ä¸­èº«ã‚’購入ã—ã¾ã™ã‹ï¼Ÿ
-購入ã—ãŸä¸­èº«ã¯ã€ã‚ãªãŸã®ã€ŒæŒã¡ç‰©ã€ã«ã‚³ãƒ”ーã•ã‚Œã¾ã™ã€‚
+購入ã—ãŸä¸­èº«ã¯ã€ã‚ãªãŸã®ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã«ã‚³ãƒ”ーã•ã‚Œã¾ã™ã€‚
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="ConfirmPurchase">
@@ -1828,20 +1946,20 @@ Adult 専用リージョンã«å…¥ã‚‹ã«ã¯ã€ä½äººã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆãŒå¹´é½¢ç¢
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="MoveInventoryFromObject">
- 「コピーä¸å¯ã€ã®æŒã¡ç‰©ã‚¢ã‚¤ãƒ†ãƒ ã‚’é¸æŠžã—ã¾ã—ãŸã€‚
-ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ã‚³ãƒ”ーã•ã‚Œãªã„ã¾ã¾ã€ã‚ãªãŸã®ã€ŒæŒã¡ç‰©ã€ã«ç§»å‹•ã•ã‚Œã¾ã™ã€‚
+ 「コピーä¸å¯ã€ã®ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã‚¢ã‚¤ãƒ†ãƒ ã‚’é¸æŠžã—ã¾ã—ãŸã€‚
+ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ã‚³ãƒ”ーã•ã‚Œãªã„ã¾ã¾ã€ã‚ãªãŸã®ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã«ç§»å‹•ã•ã‚Œã¾ã™ã€‚
アイテムを動ã‹ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate ignoretext="「コピーä¸å¯ã€ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’オブジェクトã‹ã‚‰å‹•ã‹ã™å‰ã®è­¦å‘Š" name="okcancelignore" notext="キャンセル" yestext="OK"/>
</notification>
<notification name="MoveInventoryFromScriptedObject">
- 「コピーä¸å¯ã€ã®æŒã¡ç‰©ã‚¢ã‚¤ãƒ†ãƒ ã‚’é¸æŠžã—ã¾ã—ãŸã€‚
-ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ã‚³ãƒ”ーã•ã‚Œãšã«ã€ã‚ãªãŸã®ã€ŒæŒã¡ç‰©ã€ã«ç§»å‹•ã•ã‚Œã¾ã™ã€‚
-ã“ã®ã‚ªãƒ–ジェクトã¯ã‚¹ã‚¯ãƒªãƒ—ト付ããªã®ã§ã€ã€ŒæŒã¡ç‰©ã€ã«ç§»å‹•ã•ã›ã‚‹ã¨
+ 「コピーä¸å¯ã€ã®ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã‚¢ã‚¤ãƒ†ãƒ ã‚’é¸æŠžã—ã¾ã—ãŸã€‚
+ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ã‚³ãƒ”ーã•ã‚Œãšã«ã€ã‚ãªãŸã®ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã«ç§»å‹•ã•ã‚Œã¾ã™ã€‚
+ã“ã®ã‚ªãƒ–ジェクトã¯ã‚¹ã‚¯ãƒªãƒ—ト付ããªã®ã§ã€ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã«ç§»å‹•ã•ã›ã‚‹ã¨
スクリプトã«èª¤å‹•ä½œãŒèµ·ãã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚
-æŒã¡ç‰©ã‚¢ã‚¤ãƒ†ãƒ ã‚’移動ã—ã¾ã™ã‹ï¼Ÿ
+インベントリアイテムを移動ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate ignoretext="スクリプト入りã®ã‚ªãƒ–ジェクトを壊ã™æã‚Œã®ã‚る「コピーä¸å¯ã€ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’å‹•ã‹ã™å‰ã®è­¦å‘Š" name="okcancelignore" notext="キャンセル" yestext="OK"/>
</notification>
<notification name="ClickActionNotPayable">
@@ -1861,6 +1979,18 @@ Adult 専用リージョンã«å…¥ã‚‹ã«ã¯ã€ä½äººã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆãŒå¹´é½¢ç¢
終了ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚続ã‘ã¾ã™ã‹ï¼Ÿ
<usetemplate ignoretext="終了時ã®ç¢ºèª" name="okcancelignore" notext="終了ã—ãªã„" yestext="終了"/>
</notification>
+ <notification name="ConfirmRestoreToybox">
+ ã“ã®æ“作を実行ã™ã‚‹ã¨ã€ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆè¨­å®šã®ãƒœã‚¿ãƒ³ã¨ãƒ„ールãƒãƒ¼ãŒå¾©å…ƒã•ã‚Œã¾ã™ã€‚
+
+ã“ã®æ“作ã¯å…ƒã«æˆ»ã›ã¾ã›ã‚“。
+ <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmClearAllToybox">
+ ã“ã®æ“作ã«ã‚ˆã‚Šã€å…¨ã¦ã®ãƒœã‚¿ãƒ³ã¯ãƒ„ールボックスã«æˆ»ã‚Šã€ãƒ„ールãƒãƒ¼ã¯ç©ºã«ãªã‚Šã¾ã™ã€‚
+
+ã“ã®æ“作ã¯å…ƒã«æˆ»ã›ã¾ã›ã‚“。
+ <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
+ </notification>
<notification name="DeleteItems">
[QUESTION]
<usetemplate ignoretext="アイテムを削除ã™ã‚‹å‰ã®ç¢ºèª" name="okcancelignore" notext="å–り消ã—" yestext="OK"/>
@@ -1938,12 +2068,16 @@ Linden Lab
</notification>
<notification name="ConfirmEmptyTrash">
ã”ã¿ç®±ã®ä¸­èº«ã‚’ã™ã¹ã¦å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate ignoretext="æŒã¡ç‰©ã®ã”ã¿ç®±ãƒ•ã‚©ãƒ«ãƒ€ã‚’空ã«ã™ã‚‹å‰ã®ç¢ºèª" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+ <usetemplate ignoretext="インベントリã®ã”ã¿ç®±ãƒ•ã‚©ãƒ«ãƒ€ã‚’空ã«ã™ã‚‹å‰ã®ç¢ºèª" name="okcancelignore" notext="キャンセル" yestext="OK"/>
</notification>
<notification name="ConfirmClearBrowserCache">
トラベルã€Webã€æ¤œç´¢ã®å±¥æ­´ã‚’ã™ã¹ã¦å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
+ <notification name="ConfirmClearCache">
+ ビューワã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’クリアã—ã¾ã™ã‹ï¼Ÿ
+ <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
+ </notification>
<notification name="ConfirmClearCookies">
本当ã«ã‚¯ãƒƒã‚­ãƒ¼ã‚’クリアã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="ã¯ã„"/>
@@ -1969,48 +2103,30 @@ Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã
ä¿å­˜ã•ã‚ŒãŸäº‹å‰è¨­å®šã‚’上書ãã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
</notification>
- <notification name="WLDeletePresetAlert">
- 「 [SKY] ã€ã‚’削除ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
- </notification>
<notification name="WLNoEditDefault">
デフォルトã®è¨­å®šã‚’編集ã—ãŸã‚Šå‰Šé™¤ã—ãŸã‚Šã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
</notification>
<notification name="WLMissingSky">
ã“ã®ãƒ‡ã‚¤ã‚µã‚¤ã‚¯ãƒ«ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯æ¬¡ã®å­˜åœ¨ã—ãªã„「空ã€ãƒ•ã‚¡ã‚¤ãƒ«ã‚’å‚ç…§ã—ã¦ã„ã¾ã™ï¼š [SKY]。
</notification>
- <notification name="PPSaveEffectAlert">
- ãƒã‚¹ãƒˆãƒ—ロセス効果ãŒå­˜åœ¨ã—ã¾ã™ã€‚ 上書ãã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
+ <notification name="WLRegionApplyFail">
+ 申ã—訳ã”ã–ã„ã¾ã›ã‚“ãŒã€è¨­å®šã‚’リージョンã«é©ç”¨ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚一度リージョンを出ã¦ã‹ã‚‰æˆ»ã‚‹ã¨ã€å•é¡ŒãŒè§£æ±ºã•ã‚Œã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。å•é¡Œã®ç™ºç”Ÿã—ãŸç†ç”±ï¼š[FAIL_REASON]
</notification>
- <notification name="NewSkyPreset">
- æ–°ã—ã„空ã®åå‰ã‚’指定ã—ã¦ãã ã•ã„。
- <form name="form">
- <input name="message">
- æ–°ã—ã„事å‰è¨­å®š
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="キャンセル"/>
- </form>
- </notification>
- <notification name="ExistsSkyPresetAlert">
- 事å‰è¨­å®šãŒã™ã§ã«å­˜åœ¨ã—ã¾ã™ï¼
+ <notification name="EnvCannotDeleteLastDayCycleKey">
+ デイサイクルを空ã«ã¯ã§ããªã„ã®ã§ã€ã“ã®ãƒ‡ã‚¤ã‚µã‚¤ã‚¯ãƒ«ã®æœ€å¾Œã®ã‚­ãƒ¼ã‚’削除ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。最後ã®ã‚­ãƒ¼ã‚’削除ã—ã¦æ–°ã—ã„キーを作æˆã™ã‚‹ã®ã§ã¯ãªãã€æœ€å¾Œã®ã‚­ãƒ¼ã‚’変更ã—ã¦ãã ã•ã„。
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="NewWaterPreset">
- æ–°ã—ã„æ°´ã®äº‹å‰è¨­å®šã®åå‰ã‚’指定ã—ã¦ãã ã•ã„。
- <form name="form">
- <input name="message">
- æ–°ã—ã„事å‰è¨­å®š
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="キャンセル"/>
- </form>
+ <notification name="DayCycleTooManyKeyframes">
+ ã“ã®ãƒ‡ã‚¤ã‚µã‚¤ã‚¯ãƒ«ã«ã¯ã“れ以上キーフレームを追加ã§ãã¾ã›ã‚“。[SCOPE] ã®ç¯„囲ã®ãƒ‡ã‚¤ã‚µã‚¤ã‚¯ãƒ«ã«è¿½åŠ ã§ãるキーフレーム数ã¯æœ€é«˜ [MAX] ã§ã™ã€‚
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="ExistsWaterPresetAlert">
- 事å‰è¨­å®šãŒã™ã§ã«å­˜åœ¨ã—ã¾ã™ï¼
+ <notification name="EnvUpdateRate">
+ リージョンã®è‡ªç„¶ç’°å¢ƒã®è¨­å®šã¯ [WAIT] 秒ã”ã¨ã«ã—ã‹æ›´æ–°ã§ãã¾ã›ã‚“。ãã®é–“隔を置ã„ã¦ã‹ã‚‰ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="WaterNoEditDefault">
- デフォルトã®è¨­å®šã‚’編集ã—ãŸã‚Šå‰Šé™¤ã—ãŸã‚Šã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
+ <notification name="PPSaveEffectAlert">
+ ãƒã‚¹ãƒˆãƒ—ロセス効果ãŒå­˜åœ¨ã—ã¾ã™ã€‚ 上書ãã—ã¾ã™ã‹ï¼Ÿ
+ <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
</notification>
<notification name="ChatterBoxSessionStartError">
[RECIPIENT] ã¨æ–°ã—ã„ãƒãƒ£ãƒƒãƒˆã‚’開始ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。
@@ -2040,13 +2156,14 @@ Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã
<usetemplate ignoretext="「容姿ã€ã‚’編集中ã«ã€ä½œæˆã™ã‚‹è¡£é¡žã‚’装ç€ã™ã‚‹ã¨ã" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
</notification>
<notification name="NotAgeVerified">
- 年齢確èªã‚’済ã¾ã›ã¦ã„ãªã„ã¨ã“ã®åŒºç”»ã‚’訪れるã“ã¨ãŒã§ãã¾ã›ã‚“。 [SECOND_LIFE] サイトã§å¹´é½¢ã®ç¢ºèªã‚’è¡Œã„ã¾ã™ã‹ï¼Ÿ
+ Second Life 㧠Adult 指定ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„や領域ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã‚‹ã®ã¯ 18 歳以上ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ã¿ã§ã™ã€‚年齢確èªãƒšãƒ¼ã‚¸ã§ 18 歳以上ã§ã‚ã‚‹ã“ã¨ã‚’証明ã—ã¦ãã ã•ã„。
+ã“れをクリックã™ã‚‹ã¨ã‚¦ã‚§ãƒ–ブラウザãŒé–‹ãã¾ã™ã€‚
[_URL]
<url name="url" option="0">
- https://secondlife.com/account/verification.php?lang=ja
+ https://secondlife.com/my/account/verification.php
</url>
- <usetemplate ignoretext="å¹´é½¢ã®ç¢ºèªã‚’済ã¾ã›ã¦ã„ãªã„ã¨ã" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
+ <usetemplate ignoretext="å¹´é½¢ã®ç¢ºèªã‚’済ã¾ã›ã¦ã„ãªã„ã¨ã" name="okcancelignore" notext="å–り消ã—" yestext="年齢確èªãƒšãƒ¼ã‚¸ã‚’é–‹ã"/>
</notification>
<notification name="Cannot enter parcel: no payment info on file">
支払情報ãŒç™»éŒ²ã•ã‚Œã¦ã„ãªã„ã¨ã“ã®ã‚¨ãƒªã‚¢ã‚’訪れるã“ã¨ãŒã§ãã¾ã›ã‚“。 [SECOND_LIFE] サイトã§ç™»éŒ²ã‚’è¡Œã„ã¾ã™ã‹ï¼Ÿ
@@ -2082,10 +2199,10 @@ Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã
件å: [SUBJECT]ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ï¼š [MESSAGE]
</notification>
<notification name="FriendOnline">
- [NAME] ã¯ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ã§ã™
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; ã¯ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ã§ã™
</notification>
<notification name="FriendOffline">
- [NAME] ã¯ã‚ªãƒ•ãƒ©ã‚¤ãƒ³ã§ã™
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; ã¯ã‚ªãƒ•ãƒ©ã‚¤ãƒ³ã§ã™
</notification>
<notification name="AddSelfFriend">
残念ãªãŒã‚‰è‡ªåˆ†è‡ªèº«ã‚’フレンド登録ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
@@ -2131,6 +2248,12 @@ Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã
<notification name="RezItemNoPermissions">
オブジェクトを Rez ã™ã‚‹ã«ã¯æ¨©é™ãŒä¸è¶³ã—ã¦ã„ã¾ã™ã€‚
</notification>
+ <notification name="IMAcrossParentEstates">
+ 親エステート間ã§ã¯ IM ã‚’é€ä¿¡ã§ãã¾ã›ã‚“。
+ </notification>
+ <notification name="TransferInventoryAcrossParentEstates">
+ 親エステート間ã§ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã‚’移動ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
+ </notification>
<notification name="UnableToLoadNotecard">
ノートカードを読ã¿è¾¼ã‚ã¾ã›ã‚“。ã‚ã¨ã§å†åº¦ãŠè©¦ã—ãã ã•ã„。
</notification>
@@ -2181,7 +2304,7 @@ Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã
[NAME] ã¯ã€ã‚ãªãŸãŒæ¸¡ã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’å—ã‘å–ã‚Šã¾ã—ãŸã€‚
</notification>
<notification name="InventoryDeclined">
- [NAME] ã¯ã€æŒã¡ç‰©ã®æ供を断りã¾ã—ãŸã€‚
+ [NAME] ã¯ã€ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã®æ供を断りã¾ã—ãŸã€‚
</notification>
<notification name="ObjectMessage">
[NAME]: [MESSAGE]
@@ -2193,13 +2316,15 @@ Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã
コーリングカードãŒæ‹’å¦ã•ã‚Œã¾ã—ãŸã€‚
</notification>
<notification name="TeleportToLandmark">
- ç”»é¢å³ã®ã€Œå ´æ‰€ã€ãƒ‘ãƒãƒ«ã‚’é–‹ã„ã¦ã€ã€Œãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã€ã‚¿ãƒ–ã‚’é¸ã¶ã¨ã€[NAME] ã¨ã„ã£ãŸå ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã§ãã¾ã™ã€‚
-好ããªãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã‚’クリックã—ã¦é¸ã³ã€æ¬¡ã«ãƒ‘ãƒãƒ«ä¸‹ã®ã€Œãƒ†ãƒ¬ãƒãƒ¼ãƒˆã€ã‚’クリックã—ã¾ã™ã€‚
-(ランドマークをダブルクリックã€ã¾ãŸã¯å³ã‚¯ãƒªãƒƒã‚¯ã—ã¦ã€Œãƒ†ãƒ¬ãƒãƒ¼ãƒˆã€ã‚’é¸ã‚“ã§ã‚‚åŒã˜ã§ã™ã€‚)
+ [NAME] ãªã©ã®å ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã™ã‚‹ã«ã¯ã€ã€Œå ´æ‰€ã€ãƒœã‚¿ãƒ³ã‚’クリックã—ã¦ã‹ã‚‰ã€
+表示ã•ã‚ŒãŸã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã§ã€Œãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã€ã‚¿ãƒ–ã‚’é¸æŠžã—ã¾ã™ã€‚ランドマークを
+ã„ãšã‚Œã‹ 1 ã¤é¸æŠžã—ã¦ã‹ã‚‰ã€ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ä¸‹éƒ¨ã«ã‚る「テレãƒãƒ¼ãƒˆã€ã‚’クリックã—ã¾ã™ã€‚
+(ã“ã®æ“作ã¯ã€ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã‚’ダブルクリックã™ã‚‹ã‹ã€å³ã‚¯ãƒªãƒƒã‚¯ã—ã¦
+「テレãƒãƒ¼ãƒˆã€ã‚’é¸æŠžã—ã¦å®Ÿè¡Œã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚)
</notification>
<notification name="TeleportToPerson">
- ç”»é¢å³ã®ã€Œäººã€ãƒ‘ãƒãƒ«ã‚’é–‹ã„ã¦ã€[NAME] ã¨ã„ã£ãŸä½äººã«é€£çµ¡ã‚’å–ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
-リストã‹ã‚‰ä½äººã‚’é¸æŠžã—ã¦ã€ãƒ‘ãƒãƒ«ä¸‹ã®ã€ŒIMã€ã‚’クリックã—ã¾ã™ã€‚
+ [NAME] ã®ã‚ˆã†ãªä½äººã«é€£çµ¡ã‚’ã¨ã‚‹ã«ã¯ã€ã€Œäººã€ãƒœã‚¿ãƒ³ã‚’クリックã—ã€è¡¨ç¤ºã•ã‚Œã‚‹ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã§ã€Œä½äººã€ã‚’é¸æŠžã—ã¦ã‹ã‚‰ã€
+ウィンドウ下部ã«ã‚る「IMã€ã‚’クリックã—ã¾ã™ã€‚
(リストã®åå‰ã‚’ダブルクリックã€ã¾ãŸã¯å³ã‚¯ãƒªãƒƒã‚¯ã—ã¦ã€ŒIMã€ã‚’é¸ã‚“ã§ã‚‚åŒã˜ã§ã™ã€‚)
</notification>
<notification name="CantSelectLandFromMultipleRegions">
@@ -2212,18 +2337,16 @@ Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã
<notification name="NoContentToSearch">
å°‘ãªãã¨ã‚‚ã©ã‚Œã‹ä¸€ã¤ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®ç¨®é¡žã‚’é¸æŠžã—ã¦æ¤œç´¢ã‚’è¡Œã£ã¦ãã ã•ã„。(Generalã€Moderateã€Adult)
</notification>
- <notification name="GroupVote">
- [NAME] ã¯æŠ•ç¥¨ã®ç”³è«‹ã‚’ã—ã¦ã„ã¾ã™ï¼š
-[MESSAGE]
- <form name="form">
- <button name="VoteNow" text="今ã™ã投票ã™ã‚‹"/>
- <button name="Later" text="ã‚ã¨ã§"/>
- </form>
- </notification>
<notification name="SystemMessage">
[MESSAGE]
</notification>
- <notification name="PaymentRecived">
+ <notification name="PaymentReceived">
+ [MESSAGE]
+ </notification>
+ <notification name="PaymentSent">
+ [MESSAGE]
+ </notification>
+ <notification name="PaymentFailure">
[MESSAGE]
</notification>
<notification name="EventNotification">
@@ -2232,7 +2355,7 @@ Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã
[NAME]
[DATE]
<form name="form">
- <button name="Details" text="説明"/>
+ <button name="Details" text="詳細"/>
<button name="Cancel" text="å–り消ã—"/>
</form>
</notification>
@@ -2266,18 +2389,16 @@ Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã
</form>
</notification>
<notification name="OwnedObjectsReturned">
- é¸æŠžã—ãŸåœŸåœ°ã®åŒºç”»ä¸Šã«ã‚ã£ãŸã‚ãªãŸã®ã‚ªãƒ–ジェクトã¯ã€ã™ã¹ã¦ã‚ãªãŸã®ã€ŒæŒã¡ç‰©ã€ã«è¿”å´ã•ã‚Œã¾ã—ãŸã€‚
+ é¸æŠžã—ãŸåœŸåœ°ã®åŒºç”»ä¸Šã«ã‚ã£ãŸã‚ãªãŸã®ã‚ªãƒ–ジェクトã¯ã€ã™ã¹ã¦ã‚ãªãŸã®ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã«è¿”å´ã•ã‚Œã¾ã—ãŸã€‚
</notification>
<notification name="OtherObjectsReturned">
- é¸æŠžã—ãŸåœŸåœ°ã®åŒºç”»ä¸Šã«ã‚ã£ãŸ
- [NAME]
- ãŒæ‰€æœ‰ã™ã‚‹ã‚ªãƒ–ジェクトã¯ã€ã™ã¹ã¦æ‰€æœ‰è€…ã®ã€ŒæŒã¡ç‰©ã€ã«è¿”å´ã•ã‚Œã¾ã—ãŸã€‚
+ [NAME] ãŒæ‰€æœ‰ã™ã‚‹ã€é¸æŠžã—ãŸåŒºç”»ã«ã‚るオブジェクトã¯ã€æ‰€æœ‰è€…ã®ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã«è¿”å´ã•ã‚Œã¾ã—ãŸã€‚
</notification>
<notification name="OtherObjectsReturned2">
「 [NAME] ã€ã¨ã„ã†åå‰ã®ä½äººãŒæ‰€æœ‰ã™ã‚‹ã€é¸æŠžã—ãŸåŒºç”»ä¸Šã®ã‚ªãƒ–ジェクトã¯ã€æœ¬äººã«è¿”å´ã•ã‚Œã¾ã—ãŸã€‚
</notification>
<notification name="GroupObjectsReturned">
- é¸æŠžã—ãŸåŒºç”»ä¸Šã®ã€[GROUPNAME] ã¨ã„ã†ã‚°ãƒ«ãƒ¼ãƒ—ã¨å…±æœ‰ã—ã¦ã„ãŸã‚ªãƒ–ジェクトã¯ã€ãã‚Œãžã‚Œã®æ‰€æœ‰è€…ã®ã€ŒæŒã¡ç‰©ã€ã«è¿”å´ã•ã‚Œã¾ã—ãŸã€‚
+ é¸æŠžã—ãŸåŒºç”»ä¸Šã®ã€[GROUPNAME] ã¨ã„ã†ã‚°ãƒ«ãƒ¼ãƒ—ã¨å…±æœ‰ã—ã¦ã„ãŸã‚ªãƒ–ジェクトã¯ã€ãã‚Œãžã‚Œã®æ‰€æœ‰è€…ã®ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã«è¿”å´ã•ã‚Œã¾ã—ãŸã€‚
譲渡ã•ã‚Œã¦ã„ãŸã€Œå†è²©ãƒ»ãƒ—レゼントå¯ã€ã®ã‚ªãƒ–ジェクトã¯ã€ä»¥å‰ã®æ‰€æœ‰è€…ã«è¿”å´ã•ã‚Œã¾ã—ãŸã€‚
グループã«è­²æ¸¡ã•ã‚Œã¦ã„ãŸã€Œå†è²©ãƒ»ãƒ—レゼントä¸å¯ã€ã®ã‚ªãƒ–ジェクトã¯ã€å‰Šé™¤ã•ã‚Œã¾ã—ãŸã€‚
</notification>
@@ -2305,6 +2426,9 @@ Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã
<notification name="NoBuild">
ã“ã®ã‚¨ãƒªã‚¢ã§ã¯åˆ¶ä½œãŒç¦æ­¢ã•ã‚Œã¦ã„ã¾ã™ã€‚ オブジェクトを制作ã—ãŸã‚Š Rez ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
</notification>
+ <notification name="SeeAvatars">
+ ã“ã®åŒºç”»ã«ã„ã‚‹ã‚¢ãƒã‚¿ãƒ¼ã‚„ã“ã®åŒºç”»å†…ã§è¡Œã‚れる文字ãƒãƒ£ãƒƒãƒˆã¯ã€ä»–ã®åŒºç”»ã‹ã‚‰è¦‹ãˆã¾ã›ã‚“。ã‚ãªãŸã«ã¯ã€ã“ã®åŒºç”»å¤–ã«ã„ã‚‹ä½äººãŒè¦‹ãˆãšã€å¤–ã®ä½äººã«ã¯ã‚ãªãŸã®å§¿ãŒè¦‹ãˆã¾ã›ã‚“。ãƒãƒ£ãƒ³ãƒãƒ« 0 ã§ã®é€šå¸¸ã®æ–‡å­—ãƒãƒ£ãƒƒãƒˆã‚‚ブロックã•ã‚Œã¾ã™ã€‚
+ </notification>
<notification name="ScriptsStopped">
管ç†è€…ãŒã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã®ã‚¹ã‚¯ãƒªãƒ—トを一時åœæ­¢ã—ã¾ã—ãŸã€‚
</notification>
@@ -2398,12 +2522,20 @@ Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã
有効ãªåŒºç”»ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚
</notification>
<notification name="ObjectGiveItem">
- [NAME_SLURL] ãŒæ‰€æœ‰ã™ã‚‹ [OBJECTFROMNAME] ã¨ã„ã†åå‰ã®ã‚ªãƒ–ジェクトãŒã€ã‚ãªãŸã« [OBJECTTYPE] を渡ã—ã¾ã—ãŸï¼š
-[ITEM_SLURL]
+ [NAME_SLURL] ãŒæ‰€æœ‰ã™ã‚‹ &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; ã¨ã„ã†åå‰ã®ã‚ªãƒ–ジェクトãŒã€ã‚ãªãŸã« [OBJECTTYPE] を渡ã—ã¾ã—ãŸï¼š
+&lt;nolink&gt;[ITEM_SLURL]&lt;/nolink&gt;
<form name="form">
<button name="Keep" text="å—ã‘å–ã‚‹"/>
<button name="Discard" text="破棄"/>
- <button name="Mute" text="ブロック"/>
+ <button name="Mute" text="所有者をブロック"/>
+ </form>
+ </notification>
+ <notification name="OwnObjectGiveItem">
+ &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; ã¨ã„ã†åå‰ã®ã‚ªãƒ–ジェクトãŒã€ã‚ãªãŸã« [OBJECTTYPE] を渡ã—ã¾ã—ãŸï¼š
+&lt;nolink&gt;[ITEM_SLURL]&lt;/nolink&gt;
+ <form name="form">
+ <button name="Keep" text="キープ"/>
+ <button name="Discard" text="処分ã™ã‚‹"/>
</form>
</notification>
<notification name="UserGiveItem">
@@ -2463,20 +2595,19 @@ Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã
[TO_NAME] ã«ãƒ•ãƒ¬ãƒ³ãƒ‰ç™»éŒ²ã‚’申ã—出ã¾ã—ãŸã€‚
</notification>
<notification name="OfferFriendshipNoMessage">
- [NAME] ã¯ã€
-フレンド登録を申ã—込んã§ã„ã¾ã™ã€‚
+ [NAME_SLURL] ã¯ãƒ•ãƒ¬ãƒ³ãƒ‰ç™»éŒ²ã‚’申ã—込んã§ã„ã¾ã™ã€‚
-(デフォルトã§ãŠäº’ã„ã®ã‚ªãƒ³ãƒ©ã‚¤ãƒ³çŠ¶æ…‹ã‚’見るã“ã¨ãŒã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚)
+(デフォルト設定ã ã¨ãŠäº’ã„ã®ã‚ªãƒ³ãƒ©ã‚¤ãƒ³çŠ¶æ…‹ã‚’見るã“ã¨ãŒã§ãã¾ã™ï¼‰
<form name="form">
<button name="Accept" text="å—ã‘入れる"/>
<button name="Decline" text="æ‹’å¦"/>
</form>
</notification>
<notification name="FriendshipAccepted">
- [NAME]ã¯ã€ãƒ•ãƒ¬ãƒ³ãƒ‰ç™»éŒ²ã‚’å—ã‘入れã¾ã—ãŸã€‚
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; ã¯ã‚ãªãŸã‹ã‚‰ã®å‹äººç™»éŒ²ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’å—諾ã—ã¾ã—ãŸã€‚
</notification>
<notification name="FriendshipDeclined">
- [NAME]ã¯ã€ãƒ•ãƒ¬ãƒ³ãƒ‰ç™»éŒ²ã‚’æ–­ã‚Šã¾ã—ãŸã€‚
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; ã¯ã‚ãªãŸã‹ã‚‰ã®å‹äººç™»éŒ²ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’æ‹’å¦ã—ã¾ã—ãŸã€‚
</notification>
<notification name="FriendshipAcceptedByMe">
フレンドã®ç™»éŒ²ä¾é ¼ãŒæ‰¿èªã•ã‚Œã¾ã—ãŸã€‚
@@ -2486,7 +2617,7 @@ Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã
</notification>
<notification name="OfferCallingCard">
[NAME] ãŒã‚³ãƒ¼ãƒªãƒ³ã‚°ã‚«ãƒ¼ãƒ‰ã‚’渡ãã†ã¨ã—ã¦ã„ã¾ã™ã€‚
-ã‚ãªãŸã®ã€ŒæŒã¡ç‰©ã€ã«ãƒ–ックマークãŒè¿½åŠ ã•ã‚Œã€ã“ã®ä½äººã«ç´ æ—©ã IM ã‚’é€ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
+ã‚ãªãŸã®ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã«ãƒ–ックマークãŒè¿½åŠ ã•ã‚Œã€ã“ã®ä½äººã«ç´ æ—©ã IM ã‚’é€ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
<form name="form">
<button name="Accept" text="å—ã‘入れる"/>
<button name="Decline" text="辞退"/>
@@ -2501,11 +2632,11 @@ Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã
ã“ã®ã¾ã¾ã“ã“ã«ã„ã‚‹ã¨ãƒ­ã‚°ã‚¢ã‚¦ãƒˆã•ã‚Œã¾ã™ã€‚
</notification>
<notification name="LoadWebPage">
- Web ページ [URL] を読ã¿è¾¼ã¿ã¾ã™ã‹ï¼Ÿ
+ Web ページ [URL] をロードã—ã¾ã™ã‹ï¼Ÿ
[MESSAGE]
-読ã¿è¾¼ã¿å…ƒã®ã‚ªãƒ–ジェクト:[OBJECTNAME]ã€æ‰€æœ‰è€…:[NAME]
+é€ä¿¡å…ƒã®ã‚ªãƒ–ジェクト:&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;ã€æ‰€æœ‰è€…:[NAME]?
<form name="form">
<button name="Gotopage" text="ページã«ç§»å‹•"/>
<button name="Cancel" text="å–り消ã—"/>
@@ -2521,7 +2652,7 @@ Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã
ç€ç”¨ã—よã†ã¨ã—ã¦ã„るアイテムã¯ã‚ãªãŸã®ãƒ“ューワã§ã¯èª­ã¿è¾¼ã‚€ã“ã¨ãŒã§ãã¾ã›ã‚“。 [APP_NAME] ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’アップグレードã—ã¦ã‹ã‚‰ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’ç€ç”¨ã—ã¦ãã ã•ã„。
</notification>
<notification name="ScriptQuestion">
- [NAME] ãŒæ‰€æœ‰ã™ã‚‹ã‚ªãƒ–ジェクト「 [OBJECTNAME] ã€ã‚’:
+ [NAME] ãŒæ‰€æœ‰ã™ã‚‹ã€Œ&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;〠ã¨ã„ã†ã‚ªãƒ–ジェクトãŒã€æ¬¡ã®ã“ã¨ã‚’ã—よã†ã¨ã—ã¦ã„ã¾ã™ï¼š
[QUESTIONS]
よã‚ã—ã„ã§ã™ã‹ï¼Ÿ
@@ -2532,7 +2663,7 @@ Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã
</form>
</notification>
<notification name="ScriptQuestionCaution">
- [NAME] ãŒæ‰€æœ‰ã™ã‚‹ã€Œ [OBJECTNAME] 〠ã¨ã„ã†ã‚ªãƒ–ジェクトãŒã€æ¬¡ã®ã“ã¨ã‚’ã—よã†ã¨ã—ã¦ã„ã¾ã™ï¼š
+ [NAME] ãŒæ‰€æœ‰ã™ã‚‹ã€Œ&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;〠ã¨ã„ã†ã‚ªãƒ–ジェクトãŒã€æ¬¡ã®ã“ã¨ã‚’ã—よã†ã¨ã—ã¦ã„ã¾ã™ï¼š
[QUESTIONS]
ã“ã®ã‚ªãƒ–ジェクトや制作者を信用ã§ããªã„å ´åˆã¯ã€ã“ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’æ‹’å¦ã—ã¦ãã ã•ã„。
@@ -2545,17 +2676,19 @@ Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã
</form>
</notification>
<notification name="ScriptDialog">
- [NAME] ã®ã€Œ &lt;nolink&gt;[TITLE]&lt;/nolink&gt; ã€
+ [NAME] ã®ã€Œ&lt;nolink&gt;[TITLE]&lt;/nolink&gt;ã€
[MESSAGE]
<form name="form">
- <button name="Ignore" text="無視ã™ã‚‹"/>
+ <button name="Client_Side_Mute" text="ブロック"/>
+ <button name="Client_Side_Ignore" text="無視"/>
</form>
</notification>
<notification name="ScriptDialogGroup">
- [GROUPNAME] ã®ã€Œ [TITLE] ã€
+ [GROUPNAME] ã®ã€Œ&lt;nolink&gt;[TITLE]&lt;/nolink&gt;ã€
[MESSAGE]
<form name="form">
- <button name="Ignore" text="無視ã™ã‚‹"/>
+ <button name="Client_Side_Mute" text="ブロック"/>
+ <button name="Client_Side_Ignore" text="無視"/>
</form>
</notification>
<notification name="BuyLindenDollarSuccess">
@@ -2574,7 +2707,7 @@ M キーを押ã—ã¦å¤‰æ›´ã—ã¾ã™ã€‚
<notification name="FirstSandbox">
ã“ã“ã¯ã‚µãƒ³ãƒ‰ãƒœãƒƒã‚¯ã‚¹ã‚¨ãƒªã‚¢ã§ã™ã€‚ä½äººãŒåˆ¶ä½œã‚’å­¦ã¶ã“ã¨ãŒã§ãã¾ã™ã€‚
-ã“ã“ã§åˆ¶ä½œã•ã‚ŒãŸã‚‚ã®ã¯æ™‚é–“ãŒçµŒã¤ã¨å‰Šé™¤ã•ã‚Œã¾ã™ã€‚制作ã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’å³ã‚¯ãƒªãƒƒã‚¯ã—ã¦ã€Œå–ã‚‹ã€ã‚’é¸ã³ã€æŒã¡ç‰©ã«å…¥ã‚Œã¦ãŠæŒã¡å¸°ã‚Šã™ã‚‹ã®ã‚’ãŠå¿˜ã‚Œãªã。
+ã“ã“ã§åˆ¶ä½œã•ã‚ŒãŸã‚‚ã®ã¯æ™‚é–“ãŒçµŒã¤ã¨å‰Šé™¤ã•ã‚Œã¾ã™ã€‚制作ã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’å³ã‚¯ãƒªãƒƒã‚¯ã—ã¦ã€Œå–ã‚‹ã€ã‚’é¸ã³ã€ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã«å…¥ã‚Œã¦ãŠæŒã¡å¸°ã‚Šã™ã‚‹ã®ã‚’ãŠå¿˜ã‚Œãªã。
</notification>
<notification name="MaxListSelectMessage">
ã“ã®ãƒªã‚¹ãƒˆã‹ã‚‰ [MAX_SELECT] 個ã¾ã§ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’é¸æŠžã§ãã¾ã™ã€‚
@@ -2595,7 +2728,7 @@ M キーを押ã—ã¦å¤‰æ›´ã—ã¾ã™ã€‚
[NAME] ã¯ãŠé‡‘ã‚’å—ã‘å–ã‚Šã€è‡ªå‹•çš„ã«ãƒ–ロックãŒè§£é™¤ã•ã‚Œã¾ã—ãŸã€‚
</notification>
<notification name="AutoUnmuteByInventory">
- [NAME] ã¯ã‚¢ã‚¤ãƒ†ãƒ ã‚’å—ã‘å–ã‚Šã€è‡ªå‹•çš„ã«ãƒ–ロックãŒè§£é™¤ã•ã‚Œã¾ã—ãŸã€‚
+ [NAME] ã¯ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã‚’å—ã‘å–ã‚Šã€è‡ªå‹•çš„ã«ãƒ–ロックãŒè§£é™¤ã•ã‚Œã¾ã—ãŸã€‚
</notification>
<notification name="VoiceInviteGroup">
[NAME] 㯠[GROUP] ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã‚³ãƒ¼ãƒ«ã«å‚加ã—ã¾ã—ãŸã€‚
@@ -2675,9 +2808,6 @@ M キーを押ã—ã¦å¤‰æ›´ã—ã¾ã™ã€‚
<notification name="VoiceCallGenericError">
[VOICE_CHANNEL_NAME] ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã«æŽ¥ç¶šä¸­ã«ã€ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚後ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
</notification>
- <notification name="ServerVersionChanged">
- サーãƒãƒ¼ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒç•°ãªã‚‹ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«æ¥ã¾ã—ãŸã€‚パフォーマンスã«å½±éŸ¿ã™ã‚‹ã“ã¨ãŒã‚ã‚Šã¾ã™ã€‚ [[URL] リリースノートを確èª]
- </notification>
<notification name="UnsupportedCommandSLURL">
クリックã—㟠SLurl ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“。
</notification>
@@ -2717,6 +2847,10 @@ M キーを押ã—ã¦å¤‰æ›´ã—ã¾ã™ã€‚
モデレーターãŒã‚ãªãŸã®ãƒœã‚¤ã‚¹ã‚’ミュートã—ã¾ã—ãŸã€‚
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="UploadCostConfirmation">
+ ã“ã®ã‚¢ãƒƒãƒ—ロード㯠L$[PRICE] ã®ã‚³ã‚¹ãƒˆãŒã‹ã‹ã‚Šã¾ã™ã€‚アップロードを続ã‘ã¾ã™ã‹ï¼Ÿ
+ <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="アップロード"/>
+ </notification>
<notification name="ConfirmClearTeleportHistory">
テレãƒãƒ¼ãƒˆå±¥æ­´ã‚’削除ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
@@ -2728,22 +2862,58 @@ M キーを押ã—ã¦å¤‰æ›´ã—ã¾ã™ã€‚
<notification name="ShareNotification">
共有ã™ã‚‹ä½äººã‚’é¸æŠžã—ã¾ã™ã€‚
</notification>
+ <notification name="MeshUploadError">
+ [LABEL] をアップロードã§ãã¾ã›ã‚“ã§ã—ãŸï¼š[MESSAGE] [IDENTIFIER]
+
+詳細ã«ã¤ã„ã¦ã¯ãƒ­ã‚°ã‚’ã”覧ãã ã•ã„。
+ </notification>
+ <notification name="MeshUploadPermError">
+ メッシュã®ã‚¢ãƒƒãƒ—ロード許å¯ã‚’リクエスト中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚
+ </notification>
+ <notification name="RegionCapabilityRequestError">
+ リージョン㮠&apos;[CAPABILITY]&apos; ã¨ã„ã†æ©Ÿèƒ½ã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
+ </notification>
<notification name="ShareItemsConfirmation">
- 次ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’共有ã—ã¾ã™ã‹ï¼š
+ 次ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’共有ã—ã¾ã™ã‹ï¼Ÿ
-[ITEMS]
+&lt;nolink&gt;[ITEMS]&lt;/nolink&gt;
-次ã®ä½äººã¨å…±æœ‰ã—ã¾ã™ã‹ï¼š
+次ã®ä½äººã¨å…±æœ‰ã—ã¾ã™ã‹ï¼Ÿ
[RESIDENTS]
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
+ <notification name="ShareFolderConfirmation">
+ フォルダã¯ä¸€åº¦ã« 1 ã¤ã—ã‹å…±æœ‰ã§ãã¾ã›ã‚“。
+
+次ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’共有ã—ã¾ã™ã‹ï¼Ÿ
+
+&lt;nolink&gt;[ITEMS]&lt;/nolink&gt;
+
+次ã®ä½äººã¨å…±æœ‰ï¼š
+
+[RESIDENTS]
+ <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="Ok"/>
+ </notification>
<notification name="ItemsShared">
アイテムãŒå…±æœ‰ã•ã‚Œã¾ã—ãŸã€‚
</notification>
<notification name="DeedToGroupFail">
グループã¸ã®è­²æ¸¡ã«å¤±æ•—ã—ã¾ã—ãŸã€‚
</notification>
+ <notification name="ReleaseLandThrottled">
+ 区画「[PARCEL_NAME]ã€ã¯ç¾åœ¨æ”¾æ£„ã§ãã¾ã›ã‚“。
+ </notification>
+ <notification name="ReleasedLandWithReclaim">
+ [AREA] m² ã®åŒºç”»ã€Œ[PARCEL_NAME]ã€ãŒå…¬é–‹ã•ã‚Œã¾ã—ãŸã€‚
+
+åŒåŒºç”»ãŒä»–ã®ä½äººã«å£²ã‚Šå‡ºã•ã‚Œã‚‹å‰ã® [RECLAIM_PERIOD] 時間内ã§ã‚ã‚Œã°ç„¡å„Ÿã§åœŸåœ°ã‚’å–り戻ã™ã“ã¨ãŒã§ãã¾ã™ã€‚
+ </notification>
+ <notification name="ReleasedLandNoReclaim">
+ [AREA] m² ã®åŒºç”»ã€Œ[PARCEL_NAME]ã€ãŒå…¬é–‹ã•ã‚Œã¾ã—ãŸã€‚
+
+一般ã«å…¬é–‹ã•ã‚ŒãŸã®ã§ã€ä»Šãªã‚‰èª°ã§ã‚‚購入å¯èƒ½ã§ã™ã€‚
+ </notification>
<notification name="AvatarRezNotification">
(作æˆå¾Œ[EXISTENCE]秒経éŽï¼‰
&apos;[NAME]&apos;ã¨ã„ã†ã‚¢ãƒã‚¿ãƒ¼ã¯[TIME]秒後ã«å§¿ã‚’ç¾ã‚ã—ã¾ã—ãŸã€‚
@@ -2780,9 +2950,7 @@ M キーを押ã—ã¦å¤‰æ›´ã—ã¾ã™ã€‚
<notification name="NoConnect">
[PROTOCOL] [HOSTID]を使ã£ã¦æŽ¥ç¶šã§ãã¾ã›ã‚“。
ãŠä½¿ã„ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚„ファイアウォールã®è¨­å®šã‚’確èªã—ã¦ãã ã•ã„。
- <form name="form">
- <button name="OK" text="OK"/>
- </form>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="NoVoiceConnect">
ボイスサーãƒãƒ¼ã«æŽ¥ç¶šã§ãã¾ã›ã‚“:
@@ -2791,9 +2959,7 @@ M キーを押ã—ã¦å¤‰æ›´ã—ã¾ã™ã€‚
ボイスãƒãƒ£ãƒƒãƒˆã«ã‚ˆã‚‹ã‚³ãƒŸãƒ¥ãƒ‹ã‚±ãƒ¼ã‚·ãƒ§ãƒ³ãŒåˆ©ç”¨ã§ãã¾ã›ã‚“。
ãŠä½¿ã„ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚„ファイアウォールã®è¨­å®šã‚’確èªã—ã¦ãã ã•ã„。
- <form name="form">
- <button name="OK" text="OK"/>
- </form>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="AvatarRezLeftNotification">
( [EXISTENCE] 秒)
@@ -2819,9 +2985,165 @@ M キーを押ã—ã¦å¤‰æ›´ã—ã¾ã™ã€‚
全員をミュートã—ã¾ã™ã‹ï¼Ÿ
<usetemplate ignoretext="グループコールã®å‚加者全員をミュートã™ã‚‹å‰ã®ç¢ºèª" name="okcancelignore" notext="å–り消ã—" yestext="OK"/>
</notification>
- <global name="UnsupportedCPU">
- - ã‚ãªãŸã® CPU ã®é€Ÿåº¦ã¯å¿…須動作環境ã®æ¡ä»¶ã‚’満ãŸã—ã¦ã„ã¾ã›ã‚“。
- </global>
+ <notification label="ãƒãƒ£ãƒƒãƒˆ" name="HintChat">
+ ãƒãƒ£ãƒƒãƒˆã«å‚加ã™ã‚‹ã«ã¯ã€ç”»é¢ä¸‹ã®ãƒãƒ£ãƒƒãƒˆãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã«ãƒ†ã‚­ã‚¹ãƒˆã‚’入力ã—ã¾ã™ã€‚
+ </notification>
+ <notification label="ç«‹ã¡ä¸ŠãŒã‚‹" name="HintSit">
+ 座る姿勢ã‹ã‚‰ç«‹ã¡ä¸ŠãŒã‚‹ã«ã¯ã€ã€Œç«‹ã¡ä¸ŠãŒã‚‹ã€ãƒœã‚¿ãƒ³ã‚’クリックã—ã¾ã™ã€‚
+ </notification>
+ <notification label="話ã™" name="HintSpeak">
+ 「スピーカーã€ãƒœã‚¿ãƒ³ã‚’クリックã™ã‚‹ã¨ã€ãƒžã‚¤ã‚¯ã®ã‚ªãƒ³ãƒ»ã‚ªãƒ•ãŒåˆ‡ã‚Šæ›¿ã‚ã‚Šã¾ã™ã€‚
+
+上矢å°ã‚’クリックã™ã‚‹ã¨ã€ãƒœã‚¤ã‚¹ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«ãƒ‘ãƒãƒ«ãŒè¡¨ç¤ºã•ã‚Œã¾ã™ã€‚
+
+「スピーカーã€ãƒœã‚¿ãƒ³ã‚’éžè¡¨ç¤ºã«ã™ã‚‹ã¨ã€ãƒœã‚¤ã‚¹æ©Ÿèƒ½ã‚‚無効ã«ãªã‚Šã¾ã™ã€‚
+ </notification>
+ <notification label="世界を探検" name="HintDestinationGuide">
+ è¡Œã先ガイドã«ã¯æ•°å¤šãã®æŽ¢ç´¢å ´æ‰€ãŒå«ã¾ã‚Œã¾ã™ã€‚ã©ã“ã‹è¡Œã先を決ã‚ãŸã‚‰ã€ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¦æŽ¢ç´¢ã«å‡ºã‹ã‘ã¾ã—ょã†ã€‚
+ </notification>
+ <notification label="サイドパãƒãƒ«" name="HintSidePanel">
+ サイドパãƒãƒ«ã§ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã€æœã€ãƒ—ロフィールãªã©ã«ã™ã°ã‚„ãアクセスã§ãã¾ã™ã€‚
+ </notification>
+ <notification label="移動" name="HintMove">
+ 歩行や走行ã¯ã€ã€Œç§»å‹•ã€ãƒ‘ãƒãƒ«ã‚’é–‹ãã€çŸ¢å°ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«ã«ã‚ˆã£ã¦æ“作ã—ã¾ã™ã€‚ã“ã®æ“作ã¯ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã®çŸ¢å°ã‚­ãƒ¼ã§å®Ÿè¡Œã™ã‚‹ã“ã¨ã‚‚å¯èƒ½ã§ã™ã€‚
+ </notification>
+ <notification label="" name="HintMoveClick">
+ 1. クリックã—ã¦æ­©è¡Œ
+地é¢ã®ä¸€ç®‡æ‰€ã‚’クリックã™ã‚‹ã¨ã€ãã®å ´æ‰€ã¾ã§æ­©ãã¾ã™ã€‚
+
+2. クリック・ドラッグã§è¦–界を回転
+世界ã®ä¸€ç®‡æ‰€ã‚’クリックã—ã¦ãƒ‰ãƒ©ãƒƒã‚°ã™ã‚‹ã¨ã€è¦–ç•Œã®å‘ããŒå¤‰ã‚ã‚Šã¾ã™ã€‚
+ </notification>
+ <notification label="表示å" name="HintDisplayName">
+ 表示å(カスタマイズå¯èƒ½ï¼‰ã‚’設定ã—ã¾ã™ã€‚ユーザーåã¯å›ºæœ‰ã§å¤‰æ›´ã§ãã¾ã›ã‚“ãŒã€ã“ã“ã§è¿½åŠ ã™ã‚‹è¡¨ç¤ºåã¯å¤‰æ›´å¯èƒ½ã§ã™ã€‚ä»–ã®ä½äººã®åå‰ã®è¡¨ç¤ºæ–¹æ³•ã¯ç’°å¢ƒè¨­å®šã§å¤‰æ›´ã—ã¦ãã ã•ã„。
+ </notification>
+ <notification label="表示" name="HintView">
+ カメラã®è¦–点を変更ã™ã‚‹ã«ã¯ã€æ°´å¹³ãƒ»åž‚直コントロールを使ã„ã¾ã™ã€‚Escape を押ã™ã‹ã€ã¾ãŸã¯æ­©è¡Œã™ã‚‹ã¨ã€è¦–点ãŒãƒªã‚»ãƒƒãƒˆã•ã‚Œã¾ã™ã€‚
+ </notification>
+ <notification label="インベントリ" name="HintInventory">
+ インベントリã«ã¯ã‚ãªãŸã®ã‚¢ã‚¤ãƒ†ãƒ ãŒã™ã¹ã¦å«ã¾ã‚Œã¾ã™ã€‚æ–°ã—ã追加ã•ã‚ŒãŸã‚¢ã‚¤ãƒ†ãƒ ã¯ã€Œæœ€æ–°ã€ã‚¿ãƒ–ã«ä¸€è¦§è¡¨ç¤ºã•ã‚Œã¦ã„ã¾ã™ã€‚
+ </notification>
+ <notification label="ã‚ãªãŸã®ãƒªãƒ³ãƒ‡ãƒ³ãƒ‰ãƒ«" name="HintLindenDollar">
+ ã“ã‚ŒãŒã‚ãªãŸã® L$ 残高ã§ã™ã€‚リンデンドルを購入ã™ã‚‹ã«ã¯ã€ŒL$ ã®è³¼å…¥ã€ã‚’クリックã—ã¾ã™ã€‚
+ </notification>
+ <notification name="LowMemory">
+ メモリプール残é‡ãŒå°‘ãªããªã£ã¦ã„ã¾ã™ã€‚クラッシュをé¿ã‘ã‚‹ãŸã‚ SL ã®æ©Ÿèƒ½ã®ä¸€éƒ¨ã¯ç„¡åŠ¹ã«ãªã‚Šã¾ã—ãŸã€‚ä»–ã®ã‚¢ãƒ—リケーションを終了ã—ã€çŠ¶æ³ãŒç¶™ç¶šã¾ãŸã¯å†ç™ºã™ã‚‹å ´åˆã«ã¯ SL ã‚’å†èµ·å‹•ã—ã¦ãã ã•ã„。
+ </notification>
+ <notification name="ForceQuitDueToLowMemory">
+ メモリä¸è¶³ã®ãŸã‚ 30 秒以内㫠SL ã¯çµ‚了ã—ã¾ã™ã€‚
+ </notification>
+ <notification name="PopupAttempt">
+ ãƒãƒƒãƒ—アップãŒãƒ–ロックã•ã‚Œã¾ã—ãŸã€‚
+ <form name="form">
+ <ignore name="ignore" text="å…¨ã¦ã®ãƒãƒƒãƒ—アップを有効ã«ã™ã‚‹"/>
+ <button name="open" text="ãƒãƒƒãƒ—アップウィンドウを開ã"/>
+ </form>
+ </notification>
+ <notification name="SOCKS_NOT_PERMITTED">
+ ルールセットã«ã‚ˆã£ã¦è¨±å¯ã•ã‚Œã¦ã„ãªã„ãŸã‚ã€SOCKS 5 プロキシ &quot;[HOST]:[PORT]&quot; ãŒæŽ¥ç¶šã‚’拒絶ã—ã¾ã—ãŸã€‚
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_CONNECT_ERROR">
+ SOCKS 5 プロキシ &quot;[HOST]:[PORT]&quot; ãŒæŽ¥ç¶šã‚’拒絶ã—ãŸãŸã‚ã€TCP ãƒãƒ£ãƒ³ãƒãƒ«ã‚’é–‹ãã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_NOT_ACCEPTABLE">
+ SOCKS 5 プロキシ &quot;[HOST]:[PORT]&quot; ã¯é¸æŠžã•ã‚ŒãŸèªè¨¼ã‚·ã‚¹ãƒ†ãƒ ã‚’拒絶ã—ã¾ã—ãŸã€‚
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_AUTH_FAIL">
+ SOCKS 5 プロキシ &quot;[HOST]:[PORT]&quot; ã¯ã‚ãªãŸã®è³‡æ ¼ãŒç„¡åŠ¹ã ã¨å ±å‘Šã—ã¾ã—ãŸã€‚
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_UDP_FWD_NOT_GRANTED">
+ SOCKS 5 プロキシ &quot;[HOST]:[PORT]&quot; 㯠UDP アソシエートã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’拒絶ã—ã¾ã—ãŸã€‚
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_HOST_CONNECT_FAILED">
+ SOCKS 5 プロキシサーãƒãƒ¼ &quot;[HOST]:[PORT]&quot; ã«æŽ¥ç¶šã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_UNKNOWN_STATUS">
+ ä¸æ˜Žã®ãƒ—ロキシエラーãŒã‚µãƒ¼ãƒãƒ¼ &quot;[HOST]:[PORT]&quot; ã§ç™ºç”Ÿã—ã¾ã—ãŸã€‚
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_INVALID_HOST">
+ SOCKS プロキシã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã¾ãŸã¯ãƒãƒ¼ãƒˆ &quot;[HOST]:[PORT]&quot;ãŒç„¡åŠ¹ã§ã™ã€‚
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_BAD_CREDS">
+ SOCKS 5 ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼åã¾ãŸã¯ãƒ‘スワードãŒæ­£ã—ãã‚ã‚Šã¾ã›ã‚“。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="PROXY_INVALID_HTTP_HOST">
+ HTTP プロキシã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã¾ãŸã¯ãƒãƒ¼ãƒˆ &quot;[HOST]:[PORT]&quot;ãŒç„¡åŠ¹ã§ã™ã€‚
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="PROXY_INVALID_SOCKS_HOST">
+ SOCKS プロキシã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã¾ãŸã¯ãƒãƒ¼ãƒˆ &quot;[HOST]:[PORT]&quot;ãŒç„¡åŠ¹ã§ã™ã€‚
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ChangeProxySettings">
+ プロキシã®è¨­å®šã¯ [APP_NAME] ã‚’å†èµ·å‹•å¾Œã«å映ã•ã‚Œã¾ã™ã€‚
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="AuthRequest">
+ 「[REALM]ã€ã«ã‚る「&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;ã€ã®ã‚µã‚¤ãƒˆã«ã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼åã¨ãƒ‘スワードãŒå¿…è¦ã§ã™ã€‚
+ <form name="form">
+ <input name="username" text="ユーザーå"/>
+ <input name="password" text="パスワード"/>
+ <button name="ok" text="é€ä¿¡"/>
+ <button name="cancel" text="å–り消ã—"/>
+ </form>
+ </notification>
+ <notification label="" name="NoClassifieds">
+ クラシファイド広告ã®ä½œæˆã¨ç·¨é›†ã¯ã‚¢ãƒ‰ãƒãƒ³ã‚¹ãƒ¢ãƒ¼ãƒ‰ã§ã®ã¿åˆ©ç”¨ã§ãã¾ã™ã€‚終了ã—ã¦ãƒ¢ãƒ¼ãƒ‰ã‚’変更ã—ã¾ã™ã‹ï¼Ÿãƒ¢ãƒ¼ãƒ‰ã¯ãƒ­ã‚°ã‚¤ãƒ³ç”»é¢ã§é¸æŠžã§ãã¾ã™ã€‚
+ <usetemplate name="okcancelbuttons" notext="終了ã—ãªã„" yestext="終了"/>
+ </notification>
+ <notification label="" name="NoGroupInfo">
+ グループã®ä½œæˆã¨ç·¨é›†ã¯ã‚¢ãƒ‰ãƒãƒ³ã‚¹ãƒ¢ãƒ¼ãƒ‰ã§ã®ã¿åˆ©ç”¨ã§ãã¾ã™ã€‚終了ã—ã¦ãƒ¢ãƒ¼ãƒ‰ã‚’変更ã—ã¾ã™ã‹ï¼Ÿãƒ¢ãƒ¼ãƒ‰ã¯ãƒ­ã‚°ã‚¤ãƒ³ç”»é¢ã§é¸æŠžã§ãã¾ã™ã€‚
+ <usetemplate name="okcancelbuttons" notext="終了ã—ãªã„" yestext="終了"/>
+ </notification>
+ <notification label="" name="NoPlaceInfo">
+ 場所ã®ãƒ—ロフィールã®è¡¨ç¤ºã¯ã‚¢ãƒ‰ãƒãƒ³ã‚¹ãƒ¢ãƒ¼ãƒ‰ã§ã®ã¿åˆ©ç”¨ã§ãã¾ã™ã€‚終了ã—ã¦ãƒ¢ãƒ¼ãƒ‰ã‚’変更ã—ã¾ã™ã‹ï¼Ÿãƒ¢ãƒ¼ãƒ‰ã¯ãƒ­ã‚°ã‚¤ãƒ³ç”»é¢ã§é¸æŠžã§ãã¾ã™ã€‚
+ <usetemplate name="okcancelbuttons" notext="終了ã—ãªã„" yestext="終了"/>
+ </notification>
+ <notification label="" name="NoPicks">
+ ピックã®ä½œæˆã¨ç·¨é›†ã¯ã‚¢ãƒ‰ãƒãƒ³ã‚¹ãƒ¢ãƒ¼ãƒ‰ã§ã®ã¿åˆ©ç”¨ã§ãã¾ã™ã€‚終了ã—ã¦ãƒ¢ãƒ¼ãƒ‰ã‚’変更ã—ã¾ã™ã‹ï¼Ÿãƒ¢ãƒ¼ãƒ‰ã¯ãƒ­ã‚°ã‚¤ãƒ³ç”»é¢ã§é¸æŠžã§ãã¾ã™ã€‚
+ <usetemplate name="okcancelbuttons" notext="終了ã—ãªã„" yestext="終了"/>
+ </notification>
+ <notification label="" name="NoWorldMap">
+ 世界地図ã®è¡¨ç¤ºã¯ã‚¢ãƒ‰ãƒãƒ³ã‚¹ãƒ¢ãƒ¼ãƒ‰ã§ã®ã¿åˆ©ç”¨ã§ãã¾ã™ã€‚終了ã—ã¦ãƒ¢ãƒ¼ãƒ‰ã‚’変更ã—ã¾ã™ã‹ï¼Ÿãƒ¢ãƒ¼ãƒ‰ã¯ãƒ­ã‚°ã‚¤ãƒ³ç”»é¢ã§é¸æŠžã§ãã¾ã™ã€‚
+ <usetemplate name="okcancelbuttons" notext="終了ã—ãªã„" yestext="終了"/>
+ </notification>
+ <notification label="" name="NoVoiceCall">
+ ボイスコールã¯ã‚¢ãƒ‰ãƒãƒ³ã‚¹ãƒ¢ãƒ¼ãƒ‰ã§ã®ã¿åˆ©ç”¨ã§ãã¾ã™ã€‚ログアウトã—ã¦ãƒ¢ãƒ¼ãƒ‰ã‚’変更ã—ã¾ã™ã‹ï¼Ÿ
+ <usetemplate name="okcancelbuttons" notext="終了ã—ãªã„" yestext="終了"/>
+ </notification>
+ <notification label="" name="NoAvatarShare">
+ 共有ã¯ã‚¢ãƒ‰ãƒãƒ³ã‚¹ãƒ¢ãƒ¼ãƒ‰ã§ã®ã¿åˆ©ç”¨ã§ãã¾ã™ã€‚ログアウトã—ã¦ãƒ¢ãƒ¼ãƒ‰ã‚’変更ã—ã¾ã™ã‹ï¼Ÿ
+ <usetemplate name="okcancelbuttons" notext="終了ã—ãªã„" yestext="終了"/>
+ </notification>
+ <notification label="" name="NoAvatarPay">
+ ä»–ã®ä½äººã¸ã®æ”¯æ‰•ã„ã¯ã‚¢ãƒ‰ãƒãƒ³ã‚¹ãƒ¢ãƒ¼ãƒ‰ã§ã®ã¿åˆ©ç”¨ã§ãã¾ã™ã€‚ログアウトã—ã¦ãƒ¢ãƒ¼ãƒ‰ã‚’変更ã—ã¾ã™ã‹ï¼Ÿ
+ <usetemplate name="okcancelbuttons" notext="終了ã—ãªã„" yestext="終了"/>
+ </notification>
+ <notification label="" name="NoInventory">
+ インベントリã®è¡¨ç¤ºã¯ã‚¢ãƒ‰ãƒãƒ³ã‚¹ãƒ¢ãƒ¼ãƒ‰ã§ã®ã¿åˆ©ç”¨ã§ãã¾ã™ã€‚ログアウトã—ã¦ãƒ¢ãƒ¼ãƒ‰ã‚’変更ã—ã¾ã™ã‹ï¼Ÿ
+ <usetemplate name="okcancelbuttons" notext="終了ã—ãªã„" yestext="終了"/>
+ </notification>
+ <notification label="" name="NoAppearance">
+ 容姿エディターã¯ã‚¢ãƒ‰ãƒãƒ³ã‚¹ãƒ¢ãƒ¼ãƒ‰ã§ã®ã¿åˆ©ç”¨ã§ãã¾ã™ã€‚ログアウトã—ã¦ãƒ¢ãƒ¼ãƒ‰ã‚’変更ã—ã¾ã™ã‹ï¼Ÿ
+ <usetemplate name="okcancelbuttons" notext="終了ã—ãªã„" yestext="終了"/>
+ </notification>
+ <notification label="" name="NoSearch">
+ 検索ã¯ã‚¢ãƒ‰ãƒãƒ³ã‚¹ãƒ¢ãƒ¼ãƒ‰ã§ã®ã¿åˆ©ç”¨ã§ãã¾ã™ã€‚ログアウトã—ã¦ãƒ¢ãƒ¼ãƒ‰ã‚’変更ã—ã¾ã™ã‹ï¼Ÿ
+ <usetemplate name="okcancelbuttons" notext="終了ã—ãªã„" yestext="終了"/>
+ </notification>
+ <notification label="" name="ConfirmHideUI">
+ ã“ã®æ“作ã«ã‚ˆã‚Šã€å…¨ã¦ã®ãƒ¡ãƒ‹ãƒ¥ãƒ¼é …ç›®ã¨ãƒœã‚¿ãƒ³ãŒéžè¡¨ç¤ºã«ãªã‚Šã¾ã™ã€‚å†ã³è¡¨ç¤ºã™ã‚‹ã«ã¯ [SHORTCUT] ã‚’ã‚‚ã†ä¸€åº¦ã‚¯ãƒªãƒƒã‚¯ã—ã¦ãã ã•ã„。
+ <usetemplate ignoretext="UI ã‚’éžè¡¨ç¤ºã«ã™ã‚‹å‰ã«ç¢ºèª" name="okcancelignore" notext="å–り消ã—" yestext="OK"/>
+ </notification>
<global name="UnsupportedGLRequirements">
[APP_NAME] ã«å¿…è¦ãªãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ãŒãªã„よã†ã§ã™ã€‚ [APP_NAME] ã«ã¯ãƒžãƒ«ãƒãƒ†ã‚¯ã‚¹ãƒãƒ£ã‚’サãƒãƒ¼ãƒˆã™ã‚‹ OpenGL グラフィックカードãŒå¿…è¦ã§ã™ã€‚ ãŠä½¿ã„ã®ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ã‚«ãƒ¼ãƒ‰ã®æœ€æ–°ãƒ‰ãƒ©ã‚¤ãƒãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•ã‚Œã¦ã„ã‚‹ã‹ã©ã†ã‹ã€ã‚ªãƒšãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°ã‚·ã‚¹ãƒ†ãƒ ã®ã‚µãƒ¼ãƒ“スパックã¨ãƒ‘ッãƒãŒå…¥ã£ã¦ã„ã‚‹ã‹ã‚’ã”確èªãã ã•ã„。
diff --git a/indra/newview/skins/default/xui/ja/panel_activeim_row.xml b/indra/newview/skins/default/xui/ja/panel_activeim_row.xml
deleted file mode 100644
index 84272752cf..0000000000
--- a/indra/newview/skins/default/xui/ja/panel_activeim_row.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_activeim_row">
- <text name="contact_name">
- Grumpity ProductEngine
- </text>
-</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/ja/panel_avatar_list_item.xml
index 25864ec629..70d37c3bad 100644
--- a/indra/newview/skins/default/xui/ja/panel_avatar_list_item.xml
+++ b/indra/newview/skins/default/xui/ja/panel_avatar_list_item.xml
@@ -21,7 +21,7 @@
<string name="FormatYears">
[COUNT] å¹´
</string>
- <text name="avatar_name" value="ä¸æ˜Ž"/>
+ <text name="avatar_name" value="(ローディング)"/>
<text name="last_interaction" value="0 秒"/>
<icon name="permission_edit_theirs_icon" tool_tip="ã“ã®ãƒ•ãƒ¬ãƒ³ãƒ‰ã®ã‚ªãƒ–ジェクトを編集ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™"/>
<icon name="permission_edit_mine_icon" tool_tip="ã“ã®ãƒ•ãƒ¬ãƒ³ãƒ‰ã¯ã€ã‚ãªãŸã®ã‚ªãƒ–ジェクトを編集・削除・å–å¾—ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_chat_header.xml b/indra/newview/skins/default/xui/ja/panel_chat_header.xml
index babbff3132..7916bf5155 100644
--- a/indra/newview/skins/default/xui/ja/panel_chat_header.xml
+++ b/indra/newview/skins/default/xui/ja/panel_chat_header.xml
@@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="im_header" name="im_header">
- <text_editor name="user_name" value="Ericag Vader"/>
<text name="time_box" value="23:30"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_chiclet_bar.xml b/indra/newview/skins/default/xui/ja/panel_chiclet_bar.xml
new file mode 100644
index 0000000000..6717ba9ba3
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_chiclet_bar.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="chiclet_bar">
+ <layout_stack name="toolbar_stack">
+ <layout_panel name="im_well_panel">
+ <chiclet_im_well name="im_well">
+ <button name="Unread IM messages" tool_tip="会話"/>
+ </chiclet_im_well>
+ </layout_panel>
+ <layout_panel name="notification_well_panel">
+ <chiclet_notification name="notification_well">
+ <button name="Unread" tool_tip="通知"/>
+ </chiclet_notification>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_alpha.xml b/indra/newview/skins/default/xui/ja/panel_edit_alpha.xml
index f2e3e6e993..7250da69a4 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_alpha.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_alpha.xml
@@ -1,10 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_alpha_panel">
- <panel name="avatar_alpha_color_panel">
- <texture_picker label="アルファ&#10;(下)" name="Lower Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
- <texture_picker label="アルファ&#10;(上)" name="Upper Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
- <texture_picker label="頭部ã®ã‚¢&#10;ルファ" name="Head Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
- <texture_picker label="ç›®ã®ã‚¢ãƒ«ãƒ•ã‚¡" name="Eye Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
- <texture_picker label="髪ã®ã‚¢ãƒ«ãƒ•ã‚¡" name="Hair Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
- </panel>
+ <scroll_container name="avatar_alpha_color_panel_scroll">
+ <panel name="avatar_alpha_color_panel">
+ <texture_picker label="アルファ(下)" name="Lower Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
+ <texture_picker label="アルファ(上)" name="Upper Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
+ <texture_picker label="頭部ã®ã‚¢ãƒ«ãƒ•ã‚¡" name="Head Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
+ <texture_picker label="ç›®ã®ã‚¢ãƒ«ãƒ•ã‚¡" name="Eye Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
+ <texture_picker label="髪ã®ã‚¢ãƒ«ãƒ•ã‚¡" name="Hair Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
+ </panel>
+ </scroll_container>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_gloves.xml b/indra/newview/skins/default/xui/ja/panel_edit_gloves.xml
index 83e9abca85..72eb120c3d 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_gloves.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_gloves.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_gloves_panel">
<panel name="avatar_gloves_color_panel">
- <texture_picker label="生地" name="Fabric" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
+ <texture_picker label="テクスãƒãƒ£" name="Fabric" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
<color_swatch label="色・色彩é…åˆ" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_jacket.xml b/indra/newview/skins/default/xui/ja/panel_edit_jacket.xml
index fe95061e57..ee39e9435c 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_jacket.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_jacket.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_jacket_panel">
<panel name="avatar_jacket_color_panel">
- <texture_picker label="生地・上" name="Upper Fabric" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
- <texture_picker label="生地・下" name="Lower Fabric" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
+ <texture_picker label="上åŠèº«ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£" name="Upper Fabric" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
+ <texture_picker label="下åŠèº«ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£" name="Lower Fabric" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
<color_swatch label="色・色彩é…åˆ" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_pants.xml b/indra/newview/skins/default/xui/ja/panel_edit_pants.xml
index 9f672337aa..6a1789c9f4 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_pants.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_pants.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_pants_panel">
<panel name="avatar_pants_color_panel">
- <texture_picker label="生地" name="Fabric" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
+ <texture_picker label="テクスãƒãƒ£" name="Fabric" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
<color_swatch label="色・色彩é…åˆ" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_physics.xml b/indra/newview/skins/default/xui/ja/panel_edit_physics.xml
new file mode 100644
index 0000000000..6ebf0062dc
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_edit_physics.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_physics_panel">
+ <panel label="" name="accordion_panel">
+ <accordion name="physics_accordion">
+ <accordion_tab name="physics_breasts_updown_tab" title="胸ã®å¼¾ã¿"/>
+ <accordion_tab name="physics_breasts_inout_tab" title="胸ã®è°·é–“"/>
+ <accordion_tab name="physics_breasts_leftright_tab" title="胸ã®æºã‚Œ"/>
+ <accordion_tab name="physics_belly_tab" title="ãŠè…¹ã®å¼¾ã¿"/>
+ <accordion_tab name="physics_butt_tab" title="ãŠå°»ã®å¼¾ã¿"/>
+ <accordion_tab name="physics_butt_leftright_tab" title="ãŠå°»ã®æºã‚Œ"/>
+ <accordion_tab name="physics_advanced_tab" title="高度ãªãƒ‘ラメーター"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_pick.xml b/indra/newview/skins/default/xui/ja/panel_edit_pick.xml
index 4fb031b677..39ea1df1e3 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_pick.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_pick.xml
@@ -29,7 +29,7 @@
<layout_panel name="layout_panel1">
<button label="ピックをä¿å­˜" name="save_changes_btn"/>
</layout_panel>
- <layout_panel name="layout_panel1">
+ <layout_panel name="layout_panel2">
<button label="å–り消ã—" name="cancel_btn"/>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_profile.xml b/indra/newview/skins/default/xui/ja/panel_edit_profile.xml
index 334cf54a4d..4cbd7f793b 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_profile.xml
@@ -26,6 +26,14 @@
<scroll_container name="profile_scroll">
<panel name="scroll_content_panel">
<panel name="data_panel">
+ <text name="display_name_label" value="表示å:"/>
+ <text name="solo_username_label" value="ユーザーå:"/>
+ <button name="set_name" tool_tip="表示åを設定"/>
+ <text name="solo_user_name" value="Hamilton Hitchings"/>
+ <text name="user_name" value="Hamilton Hitchings"/>
+ <text name="user_name_small" value="Hamilton Hitchings"/>
+ <text name="user_label" value="ユーザーå:"/>
+ <text name="user_slid" value="hamilton.linden"/>
<panel name="lifes_images_panel">
<panel name="second_life_image_panel">
<text name="second_life_photo_title_text" value="[SECOND_LIFE]:"/>
@@ -46,7 +54,7 @@
<text name="my_account_link" value="[[URL] マイアカウントã«ç§»å‹•]"/>
<text name="title_partner_text" value="マイパートナー:"/>
<panel name="partner_data_panel">
- <name_box initial_value="(å–得中)" name="partner_text"/>
+ <text initial_value="(å–得中)" name="partner_text"/>
</panel>
<text name="partner_edit_link" value="[[URL] 編集]" width="100"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_shirt.xml b/indra/newview/skins/default/xui/ja/panel_edit_shirt.xml
index 457c0bceb8..f33daa4eba 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_shirt.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_shirt.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_shirt_panel">
<panel name="avatar_shirt_color_panel">
- <texture_picker label="生地" name="Fabric" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠž"/>
+ <texture_picker label="テクスãƒãƒ£" name="Fabric" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠž"/>
<color_swatch label="色・色彩é…åˆ" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_shoes.xml b/indra/newview/skins/default/xui/ja/panel_edit_shoes.xml
index 98b4c57fc7..c7626189af 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_shoes.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_shoes.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_shoes_panel">
<panel name="avatar_shoes_color_panel">
- <texture_picker label="生地" name="Fabric" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
+ <texture_picker label="テクスãƒãƒ£" name="Fabric" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
<color_swatch label="色・色彩é…åˆ" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_skin.xml b/indra/newview/skins/default/xui/ja/panel_edit_skin.xml
index 2c554dad94..7573132576 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_skin.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_skin.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_skin_panel">
<panel name="avatar_skin_color_panel">
- <texture_picker label="頭部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Head Tattoos" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠž"/>
- <texture_picker label="上部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Upper Tattoos" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠž"/>
- <texture_picker label="下部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Lower Tattoos" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠž"/>
+ <texture_picker label="é ­" name="Head" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
+ <texture_picker label="上åŠèº«" name="Upper Body" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
+ <texture_picker label="下åŠèº«" name="Lower Body" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
</panel>
<panel name="accordion_panel">
<accordion name="wearable_accordion">
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_skirt.xml b/indra/newview/skins/default/xui/ja/panel_edit_skirt.xml
index b169bab591..6efc4ce99a 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_skirt.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_skirt.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_skirt_panel">
<panel name="avatar_skirt_color_panel">
- <texture_picker label="生地" name="Fabric" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠž"/>
+ <texture_picker label="テクスãƒãƒ£" name="Fabric" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠž"/>
<color_swatch label="色・色彩é…åˆ" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_socks.xml b/indra/newview/skins/default/xui/ja/panel_edit_socks.xml
index b095257a56..71fc7c5682 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_socks.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_socks.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_socks_panel">
<panel name="avatar_socks_color_panel">
- <texture_picker label="生地" name="Fabric" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
+ <texture_picker label="テクスãƒãƒ£" name="Fabric" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
<color_swatch label="色・色彩é…åˆ" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_underpants.xml b/indra/newview/skins/default/xui/ja/panel_edit_underpants.xml
index fec34479c3..f345a81922 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_underpants.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_underpants.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_underpants_panel">
<panel name="avatar_underpants_color_panel">
- <texture_picker label="生地" name="Fabric" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
+ <texture_picker label="テクスãƒãƒ£" name="Fabric" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
<color_swatch label="色・色彩é…åˆ" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_undershirt.xml b/indra/newview/skins/default/xui/ja/panel_edit_undershirt.xml
index bd47d89947..66b2ffa8ba 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_undershirt.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_undershirt.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_undershirt_panel">
<panel name="avatar_undershirt_color_panel">
- <texture_picker label="生地" name="Fabric" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
+ <texture_picker label="テクスãƒãƒ£" name="Fabric" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
<color_swatch label="色・色彩é…åˆ" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_wearable.xml b/indra/newview/skins/default/xui/ja/panel_edit_wearable.xml
index 6cbed88ebc..000dac7b5b 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_wearable.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_wearable.xml
@@ -45,6 +45,9 @@
<string name="edit_tattoo_title">
タトゥーを編集中
</string>
+ <string name="edit_physics_title">
+ 物ç†ä½œç”¨ã®ç·¨é›†ä¸­
+ </string>
<string name="shape_desc_text">
シェイプ:
</string>
@@ -90,6 +93,9 @@
<string name="tattoo_desc_text">
タトゥ:
</string>
+ <string name="physics_desc_text">
+ 物ç†ä½œç”¨ï¼š
+ </string>
<labeled_back_button label="ä¿å­˜" name="back_btn" tool_tip="アウトフィットã®ç·¨é›†ã«æˆ»ã‚‹"/>
<text name="edit_wearable_title" value="シェイプを編集中"/>
<panel label="シャツ" name="wearable_type_panel">
diff --git a/indra/newview/skins/default/xui/ja/panel_group_control_panel.xml b/indra/newview/skins/default/xui/ja/panel_group_control_panel.xml
index f7f575206a..49749732c9 100644
--- a/indra/newview/skins/default/xui/ja/panel_group_control_panel.xml
+++ b/indra/newview/skins/default/xui/ja/panel_group_control_panel.xml
@@ -1,8 +1,8 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_im_control_panel">
<layout_stack name="vertical_stack">
<layout_panel name="group_info_btn_panel">
- <button label="グループ情報" name="group_info_btn"/>
+ <button label="グループプロフィール" name="group_info_btn"/>
</layout_panel>
<layout_panel name="call_btn_panel">
<button label="グループコール" name="call_btn"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/ja/panel_group_info_sidetray.xml
index 85406702bc..7aa1aec6d0 100644
--- a/indra/newview/skins/default/xui/ja/panel_group_info_sidetray.xml
+++ b/indra/newview/skins/default/xui/ja/panel_group_info_sidetray.xml
@@ -1,5 +1,5 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="グループ情報" name="GroupInfo">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="グループインベントリ" name="GroupInfo">
<panel.string name="default_needs_apply_text">
ä¿å­˜ã—ã¦ã„ãªã„変更ãŒã‚ã‚Šã¾ã™
</panel.string>
diff --git a/indra/newview/skins/default/xui/ja/panel_group_land_money.xml b/indra/newview/skins/default/xui/ja/panel_group_land_money.xml
index 016dc97ab6..82be58a0fb 100644
--- a/indra/newview/skins/default/xui/ja/panel_group_land_money.xml
+++ b/indra/newview/skins/default/xui/ja/panel_group_land_money.xml
@@ -24,6 +24,7 @@
<scroll_list.columns label="地域" name="location"/>
<scroll_list.columns label="種類" name="type"/>
<scroll_list.columns label="é¢ç©" name="area"/>
+ <scroll_list.columns label="éžè¡¨ç¤º" name="hidden"/>
</scroll_list>
<text name="total_contributed_land_label">
寄付åˆè¨ˆï¼š
diff --git a/indra/newview/skins/default/xui/ja/panel_group_notices.xml b/indra/newview/skins/default/xui/ja/panel_group_notices.xml
index 96e0382975..ddad6c1f9b 100644
--- a/indra/newview/skins/default/xui/ja/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/ja/panel_group_notices.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="通知" name="notices_tab">
<panel.string name="help_text">
通知ã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ã‚‹ã“ã¨ãŒã§ãã€é€šçŸ¥ã«ã‚¢ã‚¤ãƒ†ãƒ ã‚’添付ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
@@ -39,10 +39,10 @@
<text name="string">
ã“ã“ã«ã‚¢ã‚¤ãƒ†ãƒ ã‚’ドラッグ&ドロップã—ã¦æ·»ä»˜ã—ã¦ãã ã•ã„:
</text>
- <button label="æŒã¡ç‰©" name="open_inventory" tool_tip="æŒã¡ç‰©ã‚’é–‹ãã¾ã™"/>
+ <button label="インベントリ" name="open_inventory" tool_tip="インベントリを開ãã¾ã™"/>
<button label="å–り外ã™" label_selected="添付物を削除" name="remove_attachment" tool_tip="ã‚ãªãŸã®é€šçŸ¥ã‹ã‚‰æ·»ä»˜ã•ã‚ŒãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’削除ã—ã¾ã™"/>
<button label="é€ä¿¡" label_selected="é€ä¿¡" name="send_notice"/>
- <group_drop_target name="drop_target" tool_tip="æŒã¡ç‰©ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’ã“ã®ãƒœãƒƒã‚¯ã‚¹ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€é€šçŸ¥ã¨ä¸€ç·’ã«é€ã‚Šã¾ã™ã€‚ 添付ã™ã‚‹ã«ã¯ã€ãã®ã‚¢ã‚¤ãƒ†ãƒ ã®ã‚³ãƒ”ーã¨å†è²©ãƒ»ãƒ—レゼントã®æ¨©é™ãŒã‚ãªãŸã«ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"/>
+ <group_drop_target name="drop_target" tool_tip="インベントリã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’ã“ã®ãƒœãƒƒã‚¯ã‚¹ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€é€šçŸ¥ã¨ä¸€ç·’ã«é€ã‚Šã¾ã™ã€‚ 添付ã™ã‚‹ã«ã¯ã€ãã®ã‚¢ã‚¤ãƒ†ãƒ ã®ã‚³ãƒ”ーã¨å†è²©ãƒ»ãƒ—レゼントã®æ¨©é™ãŒã‚ãªãŸã«ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"/>
</panel>
<panel label="éŽåŽ»ã®é€šçŸ¥ã‚’表示" name="panel_view_past_notice">
<text name="lbl">
diff --git a/indra/newview/skins/default/xui/ja/panel_instant_message.xml b/indra/newview/skins/default/xui/ja/panel_instant_message.xml
index 9fd0cb3b0d..bf4cbcdc46 100644
--- a/indra/newview/skins/default/xui/ja/panel_instant_message.xml
+++ b/indra/newview/skins/default/xui/ja/panel_instant_message.xml
@@ -4,7 +4,6 @@
6
</string>
<panel label="im_header" name="im_header">
- <text name="user_name" value="Erica Vader"/>
<text name="time_box" value="23:30"/>
</panel>
<button label="返信" name="reply"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_landmarks.xml b/indra/newview/skins/default/xui/ja/panel_landmarks.xml
index e3b716c35b..24d6ff23ae 100644
--- a/indra/newview/skins/default/xui/ja/panel_landmarks.xml
+++ b/indra/newview/skins/default/xui/ja/panel_landmarks.xml
@@ -1,9 +1,9 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="Landmarks">
<accordion name="landmarks_accordion">
<accordion_tab name="tab_favorites" title="ãŠæ°—ã«å…¥ã‚Šãƒãƒ¼"/>
<accordion_tab name="tab_landmarks" title="マイ ランドマーク"/>
- <accordion_tab name="tab_inventory" title="æŒã¡ç‰©"/>
+ <accordion_tab name="tab_inventory" title="インベントリ"/>
<accordion_tab name="tab_library" title="ライブラリ"/>
</accordion>
<panel name="bottom_panel">
diff --git a/indra/newview/skins/default/xui/ja/panel_login.xml b/indra/newview/skins/default/xui/ja/panel_login.xml
index 808f19a16d..ac1fe455c7 100644
--- a/indra/newview/skins/default/xui/ja/panel_login.xml
+++ b/indra/newview/skins/default/xui/ja/panel_login.xml
@@ -11,12 +11,19 @@
<text name="username_text">
ユーザーãƒãƒ¼ãƒ ï¼š
</text>
- <line_editor label="ユーザーãƒãƒ¼ãƒ " name="username_edit" tool_tip="[SECOND_LIFE] ユーザーãƒãƒ¼ãƒ "/>
+ <combo_box name="username_combo" tool_tip="登録時ã«è‡ªåˆ†ã§é¸ã‚“ã ãƒ¦ãƒ¼ã‚¶ãƒ¼å(例:bobsmith12ã€Steller Sunshineãªã©ï¼‰"/>
<text name="password_text">
パスワード:
</text>
<check_box label="パスワードを記憶" name="remember_check"/>
<button label="ログイン" left_pad="30" name="connect_btn" width="60"/>
+ <text name="mode_selection_text">
+ モード:
+ </text>
+ <combo_box name="mode_combo" tool_tip="モードをé¸æŠžã—ã¾ã™ã€‚ベーシックモードã§ã¯æŽ¢ç´¢ã‚„ãƒãƒ£ãƒƒãƒˆã‚’ã™ã°ã‚„ãç°¡å˜ã«å®Ÿè¡Œã§ãã€ã‚¢ãƒ‰ãƒãƒ³ã‚¹ãƒ¢ãƒ¼ãƒ‰ã§ã¯ã€ã‚ˆã‚Šå¤šãã®æ©Ÿèƒ½ãŒåˆ©ç”¨ã§ãã¾ã™ã€‚">
+ <combo_box.item label="ベーシック" name="Basic"/>
+ <combo_box.item label="アドãƒãƒ³ã‚¹" name="Advanced"/>
+ </combo_box>
<text name="start_location_text">
開始地点:
</text>
@@ -31,7 +38,7 @@
ãŠç”³ã—è¾¼ã¿
</text>
<text name="forgot_password_text">
- åå‰ã¾ãŸã¯ãƒ‘スワードをãŠå¿˜ã‚Œã§ã™ã‹ï¼Ÿ
+ ユーザーåã¾ãŸã¯ãƒ‘スワードをãŠå¿˜ã‚Œã§ã™ã‹ï¼Ÿ
</text>
<text name="login_help">
ログインã®æ–¹æ³•
diff --git a/indra/newview/skins/default/xui/ja/panel_main_inventory.xml b/indra/newview/skins/default/xui/ja/panel_main_inventory.xml
index ff968696b7..f908262f4f 100644
--- a/indra/newview/skins/default/xui/ja/panel_main_inventory.xml
+++ b/indra/newview/skins/default/xui/ja/panel_main_inventory.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="ã‚‚ã®" name="main inventory panel">
<panel.string name="ItemcountFetching">
[ITEM_COUNT] 個ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’å–得中ã§ã™... [FILTER]
@@ -9,9 +9,9 @@
<text name="ItemcountText">
アイテム:
</text>
- <filter_editor label="æŒã¡ç‰©ã‚’フィルター" name="inventory search editor"/>
+ <filter_editor label="インベントリをフィルター" name="inventory search editor"/>
<tab_container name="inventory filter tabs">
- <inventory_panel label="æŒã¡ç‰©" name="All Items"/>
+ <inventory_panel label="インベントリ" name="All Items"/>
<recent_inventory_panel label="最新" name="Recent Items"/>
</tab_container>
<layout_stack name="bottom_panel">
diff --git a/indra/newview/skins/default/xui/ja/panel_me.xml b/indra/newview/skins/default/xui/ja/panel_me.xml
index dda5bc0009..3df1ae8048 100644
--- a/indra/newview/skins/default/xui/ja/panel_me.xml
+++ b/indra/newview/skins/default/xui/ja/panel_me.xml
@@ -1,7 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="マイ プロフィール" name="panel_me">
- <tab_container name="tabs">
- <panel label="マイ プロフィール" name="panel_profile"/>
- <panel label="マイ ピック" name="panel_picks"/>
- </tab_container>
+ <panel label="マイ-ピック" name="panel_picks"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_my_profile.xml b/indra/newview/skins/default/xui/ja/panel_my_profile.xml
deleted file mode 100644
index 94c5a6a4b7..0000000000
--- a/indra/newview/skins/default/xui/ja/panel_my_profile.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="プロフィール" name="panel_profile">
- <string name="CaptionTextAcctInfo">
- [ACCTTYPE]
-[PAYMENTINFO] [AGEVERIFICATION]
- </string>
- <string name="payment_update_link_url">
- http://www.secondlife.com/account/billing.php?lang=ja
- </string>
- <string name="partner_edit_link_url">
- http://www.secondlife.com/account/billing.php?lang=ja
- </string>
- <string name="my_account_link_url" value="http://secondlife.com/account"/>
- <string name="no_partner_text" value="ãªã—"/>
- <string name="no_group_text" value="ãªã—"/>
- <string name="RegisterDateFormat">
- [REG_DATE] ([AGE])
- </string>
- <layout_stack name="layout">
- <layout_panel name="profile_stack">
- <scroll_container name="profile_scroll">
- <panel name="scroll_content_panel">
- <panel name="second_life_image_panel">
- <icon label="" name="2nd_life_edit_icon" tool_tip="下ã®ã€Œãƒ—ロフィールã®ç·¨é›†ã€ãƒœã‚¿ãƒ³ã‚’押ã—ã¦ç”»åƒã‚’変更ã—ã¾ã™"/>
- <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/>
- </panel>
- <panel name="first_life_image_panel">
- <icon label="" name="real_world_edit_icon" tool_tip="下ã®ã€Œãƒ—ロフィールã®ç·¨é›†ã€ãƒœã‚¿ãƒ³ã‚’押ã—ã¦ç”»åƒã‚’変更ã—ã¾ã™"/>
- <text name="title_rw_descr_text" value="ç¾å®Ÿä¸–界:"/>
- </panel>
- <text name="title_member_text" value="メンãƒãƒ¼ç™»éŒ²ï¼š"/>
- <text name="title_acc_status_text" value="アカウントã®çŠ¶æ…‹ï¼š"/>
- <text_editor name="acc_status_text">
- ä½äººã€‚ 支払情報未登録。
- リンデン。
- </text_editor>
- <text name="title_partner_text" value="パートナー:"/>
- <panel name="partner_data_panel">
- <name_box initial_value="(å–得中)" name="partner_text"/>
- </panel>
- <text name="title_groups_text" value="グループ:"/>
- </panel>
- </scroll_container>
- </layout_panel>
- </layout_stack>
- <panel name="profile_me_buttons_panel">
- <button label="プロフィールã®ç·¨é›†" name="edit_profile_btn" tool_tip="個人的ãªæƒ…報を編集ã—ã¾ã™"/>
- </panel>
-</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_navigation_bar.xml b/indra/newview/skins/default/xui/ja/panel_navigation_bar.xml
index 0426c4fe9a..51402b2e00 100644
--- a/indra/newview/skins/default/xui/ja/panel_navigation_bar.xml
+++ b/indra/newview/skins/default/xui/ja/panel_navigation_bar.xml
@@ -1,18 +1,23 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="navigation_bar">
- <panel name="navigation_panel">
- <pull_button name="back_btn" tool_tip="å‰ã®å ´æ‰€ã¸æˆ»ã‚Šã¾ã™"/>
- <pull_button name="forward_btn" tool_tip="次ã®å ´æ‰€ã¸é€²ã¿ã¾ã™"/>
- <button name="home_btn" tool_tip="「ホームã€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ"/>
- <location_input label="場所" name="location_combo"/>
- <search_combo_box label="検索" name="search_combo_box" tool_tip="検索">
- <combo_editor label="[SECOND_LIFE] を検索:" name="search_combo_editor"/>
- </search_combo_box>
- </panel>
- <favorites_bar name="favorite" tool_tip="ランドマークをã“ã“ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€Second Lifeã®ãŠæ°—ã«å…¥ã‚Šã®å ´æ‰€ã«ç´ æ—©ãアクセスï¼">
- <label name="favorites_bar_label" tool_tip="ランドマークをã“ã“ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€Second Lifeã®ãŠæ°—ã«å…¥ã‚Šã®å ´æ‰€ã«ç´ æ—©ãアクセスï¼">
- ãŠæ°—ã«å…¥ã‚Šãƒãƒ¼
- </label>
- <chevron_button name="&gt;&gt;" tool_tip="ãŠæ°—ã«å…¥ã‚Šã‚’ã‚‚ã£ã¨è¡¨ç¤º"/>
- </favorites_bar>
+ <layout_stack name="nvp_stack">
+ <layout_panel name="navigation_layout_panel">
+ <panel name="navigation_panel">
+ <pull_button name="back_btn" tool_tip="å‰ã®å ´æ‰€"/>
+ <pull_button name="forward_btn" tool_tip="次ã®å ´æ‰€"/>
+ <button name="home_btn" tool_tip="「ホームã€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™"/>
+ <location_input label="所在地" name="location_combo"/>
+ </panel>
+ </layout_panel>
+ <layout_panel name="favorites_layout_panel">
+ <favorites_bar name="favorite" tool_tip="ランドマークをã“ã“ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€Second Lifeã®ãŠæ°—ã«å…¥ã‚Šã®å ´æ‰€ã«ç´ æ—©ãアクセスï¼">
+ <label name="favorites_bar_label" tool_tip="ランドマークをã“ã“ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€Second Lifeã®ãŠæ°—ã«å…¥ã‚Šã®å ´æ‰€ã«ç´ æ—©ãアクセスï¼">
+ ãŠæ°—ã«å…¥ã‚Šãƒãƒ¼
+ </label>
+ <more_button name="&gt;&gt;" tool_tip="ãŠæ°—ã«å…¥ã‚Šã‚’ã‚‚ã£ã¨è¡¨ç¤º">
+ 詳細 ▼
+ </more_button>
+ </favorites_bar>
+ </layout_panel>
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_nearby_chat.xml b/indra/newview/skins/default/xui/ja/panel_nearby_chat.xml
new file mode 100644
index 0000000000..4048b48d3a
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_nearby_chat.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="nearby_chat">
+ <layout_stack name="stack">
+ <layout_panel name="translate_chat_checkbox_lp">
+ <check_box label="ãƒãƒ£ãƒƒãƒˆã‚’翻訳" name="translate_chat_checkbox"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_nearby_media.xml b/indra/newview/skins/default/xui/ja/panel_nearby_media.xml
index 07293e6c79..c29ec64304 100644
--- a/indra/newview/skins/default/xui/ja/panel_nearby_media.xml
+++ b/indra/newview/skins/default/xui/ja/panel_nearby_media.xml
@@ -19,7 +19,7 @@
<button label="ã™ã¹ã¦åœæ­¢" name="all_nearby_media_disable_btn" tool_tip="è¿‘ãã®ãƒ¡ãƒ‡ã‚£ã‚¢ã‚’ã™ã¹ã¦ã‚ªãƒ•ã«ã—ã¾ã™"/>
<button label="ã™ã¹ã¦é–‹å§‹" name="all_nearby_media_enable_btn" tool_tip="è¿‘ãã®ãƒ¡ãƒ‡ã‚£ã‚¢ã‚’ã™ã¹ã¦ã‚ªãƒ³ã«ã—ã¾ã™"/>
<button name="open_prefs_btn" tool_tip="メディアã®è¨­å®šã‚’é–‹ãã¾ã™"/>
- <button label="詳細 &gt;&gt;" label_selected="簡易 &lt;&lt;" name="more_btn" tool_tip="アドãƒãƒ³ã‚¹ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«"/>
+ <button label="詳細 &gt;&gt;" label_selected="&lt;&lt; 簡易" name="more_btn" tool_tip="アドãƒãƒ³ã‚¹ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«"/>
<button label="詳細 &gt;&gt;" label_selected="簡易 &lt;&lt;" name="less_btn" tool_tip="アドãƒãƒ³ã‚¹ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«"/>
</panel>
<panel name="nearby_media_panel">
diff --git a/indra/newview/skins/default/xui/ja/panel_notes.xml b/indra/newview/skins/default/xui/ja/panel_notes.xml
deleted file mode 100644
index aa6d823c59..0000000000
--- a/indra/newview/skins/default/xui/ja/panel_notes.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="メモã¨ãƒ—ライãƒã‚·ãƒ¼" name="panel_notes">
- <layout_stack name="layout">
- <layout_panel name="notes_stack">
- <scroll_container name="profile_scroll">
- <panel name="profile_scroll_panel">
- <text name="status_message" value="個人的メモ:"/>
- <text name="status_message2" value="ã“ã®äººã«è¨±å¯ï¼š"/>
- <check_box label="オンライン状態ã®ç¢ºèª" name="status_check"/>
- <check_box label="地図ã§å±…場所を確èª" name="map_check"/>
- <check_box label="ç§ã®ã‚ªãƒ–ジェクトã®ç·¨é›†ãƒ»å‰Šé™¤ãƒ»å–å¾—" name="objects_check"/>
- </panel>
- </scroll_container>
- </layout_panel>
- <layout_panel name="notes_buttons_panel">
- <layout_stack name="bottom_bar_ls">
- <layout_panel name="add_friend_btn_lp">
- <button label="フレンド登録" name="add_friend" tool_tip="フレンド登録を申ã—出ã¾ã™"/>
- </layout_panel>
- <layout_panel name="im_btn_lp">
- <button label="IM" name="im" tool_tip="インスタントメッセージを開ãã¾ã™"/>
- </layout_panel>
- <layout_panel name="call_btn_lp">
- <button label="コール" name="call" tool_tip="ã“ã®ä½äººã«ã‚³ãƒ¼ãƒ«ã™ã‚‹"/>
- </layout_panel>
- <layout_panel name="show_on_map_btn_lp">
- <button label="地図" name="show_on_map_btn" tool_tip="ä½äººã‚’地図上ã§è¡¨ç¤ºã™ã‚‹"/>
- </layout_panel>
- <layout_panel name="teleport_btn_lp">
- <button label="テレãƒãƒ¼ãƒˆ" name="teleport" tool_tip="テレãƒãƒ¼ãƒˆã‚’é€ã‚Šã¾ã™"/>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_notify_textbox.xml b/indra/newview/skins/default/xui/ja/panel_notify_textbox.xml
new file mode 100644
index 0000000000..8e0cf4bc9d
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_notify_textbox.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="instant_message" name="panel_notify_textbox">
+ <string name="message_max_lines_count" value="7"/>
+ <panel label="info_panel" name="info_panel">
+ <text_editor name="message" value="メッセージ"/>
+ </panel>
+ <panel label="control_panel" name="control_panel">
+ <button label="é€ä¿¡" name="btn_submit"/>
+ <button label="無視" name="ignore_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_outbox_inventory.xml b/indra/newview/skins/default/xui/ja/panel_outbox_inventory.xml
new file mode 100644
index 0000000000..1a14283113
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_outbox_inventory.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<outbox_inventory_panel name="inventory_outbox" tool_tip="アイテムをã“ã“ã«ãƒ‰ãƒ©ãƒƒã‚°ã‚¢ãƒ³ãƒ‰ãƒ‰ãƒ­ãƒƒãƒ—ã™ã‚‹ã¨ã€ã‚ãªãŸã®åº—é ­ã«ä¸¦ã³ã¾ã™"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_outfit_edit.xml b/indra/newview/skins/default/xui/ja/panel_outfit_edit.xml
index 6897660214..e89ce0c479 100644
--- a/indra/newview/skins/default/xui/ja/panel_outfit_edit.xml
+++ b/indra/newview/skins/default/xui/ja/panel_outfit_edit.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Side tray Outfit Edit panel -->
<panel label="アウトフットã®ç·¨é›†" name="outfit_edit">
<string name="No Outfit" value="アウトフィットãªã—"/>
@@ -30,7 +30,7 @@
<button label="ã•ã‚‰ã«è¿½åŠ ..." name="show_add_wearables_btn" tool_tip="é–‹ãï¼é–‰ã˜ã‚‹"/>
</layout_panel>
<layout_panel name="filter_panel">
- <filter_editor label="æŒã¡ç‰©ã®ç€ç”¨ç‰©ã‚’フィルター" name="look_item_filter"/>
+ <filter_editor label="インベントリã®ç€ç”¨ç‰©ã‚’フィルター" name="look_item_filter"/>
</layout_panel>
</layout_stack>
</layout_panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/ja/panel_outfits_inventory.xml
index 2a0647653d..93df0ba2bd 100644
--- a/indra/newview/skins/default/xui/ja/panel_outfits_inventory.xml
+++ b/indra/newview/skins/default/xui/ja/panel_outfits_inventory.xml
@@ -1,10 +1,10 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="ã‚‚ã®" name="Outfits">
<panel.string name="wear_outfit_tooltip">
é¸æŠžã—ãŸã‚¢ã‚¦ãƒˆãƒ•ã‚£ãƒƒãƒˆã‚’ç€ç”¨ã™ã‚‹
</panel.string>
<panel.string name="wear_items_tooltip">
- é¸æŠžã—ãŸå•†å“ã‚’ç€ç”¨
+ é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’ç€ç”¨
</panel.string>
<tab_container name="appearance_tabs">
<panel label="マイ アウトフィット" name="outfitslist_tab"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_outfits_list.xml b/indra/newview/skins/default/xui/ja/panel_outfits_list.xml
index e9e36e4842..df9ef40113 100644
--- a/indra/newview/skins/default/xui/ja/panel_outfits_list.xml
+++ b/indra/newview/skins/default/xui/ja/panel_outfits_list.xml
@@ -1,7 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="Outfits">
+ <accordion name="outfits_accordion">
+ <no_matched_tabs_text name="no_matched_outfits_msg" value="ãŠæŽ¢ã—ã®ã‚‚ã®ã¯è¦‹ã¤ã‹ã‚Šã¾ã—ãŸã‹ï¼Ÿ[secondlife:///app/search/all/[SEARCH_TERM] 検索] ã‚’ãŠè©¦ã—ãã ã•ã„。"/>
+ <no_visible_tabs_text name="no_outfits_msg" value="アウトフィットãŒã¾ã ã‚ã‚Šã¾ã›ã‚“。[secondlife:///app/search/all 検索] ã‚’ãŠè©¦ã—ãã ã•ã„。"/>
+ </accordion>
<panel name="bottom_panel">
- <button name="options_gear_btn" tool_tip="オプションを表示ã—ã¾ã™"/>
+ <menu_button name="options_gear_btn" tool_tip="オプションを表示ã—ã¾ã™"/>
<button name="trash_btn" tool_tip="é¸æŠžã—ãŸã‚¢ã‚¦ãƒˆãƒ•ã‚£ãƒƒãƒˆã‚’削除ã™ã‚‹"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_people.xml b/indra/newview/skins/default/xui/ja/panel_people.xml
index f2ccddc9de..88c31451b5 100644
--- a/indra/newview/skins/default/xui/ja/panel_people.xml
+++ b/indra/newview/skins/default/xui/ja/panel_people.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Side tray panel -->
<panel label="人" name="people_panel">
<string name="no_recent_people" value="最近交æµã—ãŸäººã¯ã„ã¾ã›ã‚“。 一緒ã«ä½•ã‹ã™ã‚‹ä»²é–“ã‚’ãŠæŽ¢ã—ã§ã™ã‹ï¼Ÿ [secondlife:///app/search/people 検索] ã‹ [secondlife:///app/worldmap 世界地図] ã‚’ãŠè©¦ã—ãã ã•ã„。"/>
@@ -18,11 +18,13 @@
<string name="groups_filter_label" value="グループをフィルター"/>
<string name="no_filtered_groups_msg" value="ãŠæŽ¢ã—ã®ã‚‚ã®ã¯è¦‹ã¤ã‹ã‚Šã¾ã—ãŸã‹ï¼Ÿ [secondlife:///app/search/groups/[SEARCH_TERM] 検索] ã‚’ãŠè©¦ã—ãã ã•ã„。"/>
<string name="no_groups_msg" value="グループをãŠæŽ¢ã—ã§ã™ã‹ï¼Ÿ [secondlife:///app/search/groups 検索] ã‚’ãŠè©¦ã—ãã ã•ã„。"/>
+ <string name="MiniMapToolTipMsg" value="[地域](ダブルクリックã§åœ°å›³ã‚’é–‹ã。Shiftâ€ãƒ‰ãƒ©ãƒƒã‚°ã§æ°´å¹³ãƒ»åž‚直移動)"/>
+ <string name="AltMiniMapToolTipMsg" value="[地域](ダブルクリックã§ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã€‚Shiftâ€ãƒ‰ãƒ©ãƒƒã‚°ã§æ°´å¹³ãƒ»åž‚直移動)"/>
<filter_editor label="フィルター" name="filter_input"/>
<tab_container name="tabs">
<panel label="è¿‘ã" name="nearby_panel">
<panel label="bottom_panel" name="bottom_panel">
- <button name="nearby_view_sort_btn" tool_tip="オプション"/>
+ <menu_button name="nearby_view_sort_btn" tool_tip="オプション"/>
<button name="add_friend_btn" tool_tip="é¸æŠžã—ãŸä½äººã‚’フレンドリストã«ç™»éŒ²"/>
</panel>
</panel>
@@ -34,27 +36,27 @@
<panel label="bottom_panel" name="bottom_panel">
<layout_stack name="bottom_panel">
<layout_panel name="options_gear_btn_panel">
- <button name="friends_viewsort_btn" tool_tip="オプションを表示ã—ã¾ã™"/>
+ <menu_button name="friends_viewsort_btn" tool_tip="オプションを表示ã—ã¾ã™"/>
</layout_panel>
<layout_panel name="add_btn_panel">
<button name="add_btn" tool_tip="フレンド登録を申ã—出る"/>
</layout_panel>
<layout_panel name="trash_btn_panel">
- <dnd_button name="trash_btn" tool_tip="é¸æŠžã—ãŸäººã‚’フレンドリストã‹ã‚‰å‰Šé™¤"/>
+ <dnd_button name="del_btn" tool_tip="é¸æŠžã—ãŸäººã‚’フレンドリストã‹ã‚‰å‰Šé™¤"/>
</layout_panel>
</layout_stack>
</panel>
</panel>
<panel label="マイ グループ" name="groups_panel">
<panel label="bottom_panel" name="bottom_panel">
- <button name="groups_viewsort_btn" tool_tip="オプション"/>
+ <menu_button name="groups_viewsort_btn" tool_tip="オプション"/>
<button name="plus_btn" tool_tip="グループã«å‚加 / æ–°è¦ã‚°ãƒ«ãƒ¼ãƒ—を作æˆã—ã¾ã™"/>
<button name="activate_btn" tool_tip="é¸æŠžã—ãŸã‚°ãƒ«ãƒ¼ãƒ—をアクティブã«ã—ã¾ã™"/>
</panel>
</panel>
<panel label="最新" name="recent_panel">
<panel label="bottom_panel" name="bottom_panel">
- <button name="recent_viewsort_btn" tool_tip="オプション"/>
+ <menu_button name="recent_viewsort_btn" tool_tip="オプション"/>
<button name="add_friend_btn" tool_tip="é¸æŠžã—ãŸä½äººã‚’フレンドリストã«ç™»éŒ²"/>
</panel>
</panel>
@@ -64,22 +66,22 @@
<layout_panel name="view_profile_btn_lp">
<button label="プロフィール" name="view_profile_btn" tool_tip="写真ã€ã‚°ãƒ«ãƒ¼ãƒ—ã€ãã®ä»–ä½äººæƒ…報を表示"/>
</layout_panel>
- <layout_panel name="chat_btn_lp">
+ <layout_panel name="im_btn_lp">
<button label="IM" name="im_btn" tool_tip="インスタントメッセージを開ãã¾ã™"/>
</layout_panel>
- <layout_panel name="chat_btn_lp">
+ <layout_panel name="call_btn_lp">
<button label="コール" name="call_btn" tool_tip="ã“ã®ä½äººã«ã‚³ãƒ¼ãƒ«ã™ã‚‹"/>
</layout_panel>
- <layout_panel name="chat_btn_lp">
- <button label="共有" name="share_btn" tool_tip="「æŒã¡ç‰©ã€ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’共有ã™ã‚‹"/>
+ <layout_panel name="share_btn_lp">
+ <button label="共有" name="share_btn" tool_tip="インベントリã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’共有ã™ã‚‹"/>
</layout_panel>
- <layout_panel name="chat_btn_lp">
+ <layout_panel name="teleport_btn_lp">
<button label="テレãƒãƒ¼ãƒˆ" name="teleport_btn" tool_tip="テレãƒãƒ¼ãƒˆã‚’é€ã‚Šã¾ã™"/>
</layout_panel>
</layout_stack>
<layout_stack name="bottom_bar_ls1">
<layout_panel name="group_info_btn_lp">
- <button label="グループ情報" name="group_info_btn" tool_tip="グループ情報を表示ã—ã¾ã™"/>
+ <button label="グループプロフィール" name="group_info_btn" tool_tip="グループプロフィールを表示ã—ã¾ã™"/>
</layout_panel>
<layout_panel name="chat_btn_lp">
<button label="グループãƒãƒ£ãƒƒãƒˆ" name="chat_btn" tool_tip="ãƒãƒ£ãƒƒãƒˆã‚’開始ã—ã¾ã™"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_place_profile.xml b/indra/newview/skins/default/xui/ja/panel_place_profile.xml
index b897e1d748..7235bc0f18 100644
--- a/indra/newview/skins/default/xui/ja/panel_place_profile.xml
+++ b/indra/newview/skins/default/xui/ja/panel_place_profile.xml
@@ -68,6 +68,8 @@
<text name="scripts_value" value="オン"/>
<text name="damage_label" value="ダメージ:"/>
<text name="damage_value" value="オフ"/>
+ <text name="see_avatars_label" value="ã‚¢ãƒã‚¿ãƒ¼ã‚’表示:"/>
+ <text name="see_avatars_value" value="オフ"/>
<button label="土地情報" name="about_land_btn"/>
</panel>
</accordion_tab>
@@ -80,7 +82,7 @@
<text name="region_rating_label" value="レーティング:"/>
<text name="region_rating" value="Adult"/>
<text name="region_owner_label" value="所有者:"/>
- <text name="region_owner" value="moose Van Moose"/>
+ <text name="region_owner" value="moose Van Moose extra long name moose"/>
<text name="region_group_label" value="グループ:"/>
<text name="region_group">
The Mighty Moose of mooseville soundvillemoose
@@ -93,6 +95,7 @@
<text name="estate_name_label" value="エステート:"/>
<text name="estate_rating_label" value="レーティング:"/>
<text name="estate_owner_label" value="所有者:"/>
+ <text name="estate_owner" value="é•·ã„所有者ã®åå‰ã‚’テスト"/>
<text name="covenant_label" value="約款:"/>
</panel>
</accordion_tab>
diff --git a/indra/newview/skins/default/xui/ja/panel_places.xml b/indra/newview/skins/default/xui/ja/panel_places.xml
index 3e364c9b3a..9d3925afdc 100644
--- a/indra/newview/skins/default/xui/ja/panel_places.xml
+++ b/indra/newview/skins/default/xui/ja/panel_places.xml
@@ -21,10 +21,10 @@
<button label="編集" name="edit_btn" tool_tip="ランドマークã®æƒ…報を編集ã—ã¾ã™"/>
</layout_panel>
<layout_panel name="overflow_btn_lp">
- <button label="â–¼" name="overflow_btn" tool_tip="オプションを表示ã—ã¾ã™"/>
+ <menu_button label="â–¼" name="overflow_btn" tool_tip="オプションを表示ã—ã¾ã™"/>
</layout_panel>
</layout_stack>
- <layout_stack name="bottom_bar_ls3">
+ <layout_stack name="bottom_bar_profile_ls">
<layout_panel name="profile_btn_lp">
<button label="プロフィール" name="profile_btn" tool_tip="場所ã®ãƒ—ロフィールを表示"/>
</layout_panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_postcard_message.xml b/indra/newview/skins/default/xui/ja/panel_postcard_message.xml
new file mode 100644
index 0000000000..b7c3f48557
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_postcard_message.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_postcard_message">
+ <text name="to_label">
+ 終:
+ </text>
+ <text name="name_label">
+ 始:
+ </text>
+ <text name="subject_label">
+ 件å:
+ </text>
+ <line_editor label="件åã‚’ã“ã“ã«å…¥åŠ›ã—ã¦ãã ã•ã„。" name="subject_form"/>
+ <text name="msg_label">
+ メッセージ:
+ </text>
+ <text_editor name="msg_form">
+ メッセージをã“ã“ã«å…¥åŠ›ã—ã¦ãã ã•ã„。
+ </text_editor>
+ <button label="å–り消ã—" name="cancel_btn"/>
+ <button label="é€ä¿¡" name="send_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_postcard_settings.xml b/indra/newview/skins/default/xui/ja/panel_postcard_settings.xml
new file mode 100644
index 0000000000..314aaef7fd
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_postcard_settings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_postcard_settings">
+ <combo_box label="解åƒåº¦" name="postcard_size_combo">
+ <combo_box.item label="ç¾åœ¨ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" name="CurrentWindow"/>
+ <combo_box.item label="640x480" name="640x480"/>
+ <combo_box.item label="800x600" name="800x600"/>
+ <combo_box.item label="1024x768" name="1024x768"/>
+ <combo_box.item label="カスタム" name="Custom"/>
+ </combo_box>
+ <layout_stack name="postcard_image_params_ls">
+ <layout_panel name="postcard_image_size_lp">
+ <spinner label="å¹…" name="postcard_snapshot_width"/>
+ <spinner label="高ã•" name="postcard_snapshot_height"/>
+ <check_box label="縦横比ã®å›ºå®š" name="postcard_keep_aspect_check"/>
+ </layout_panel>
+ <layout_panel name="postcard_image_format_quality_lp">
+ <slider label="画質" name="image_quality_slider"/>
+ <text name="image_quality_level">
+ ([QLVL])
+ </text>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml
index fdf33b5402..dcaa23fee5 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml
@@ -3,35 +3,29 @@
<panel.string name="aspect_ratio_text">
[NUM]:[DEN]
</panel.string>
- <panel.string name="middle_mouse">
- マウスã®ä¸­å¤®
- </panel.string>
- <slider label="視界角" name="camera_fov"/>
- <slider label="è·é›¢" name="camera_offset_scale"/>
- <text name="heading2">
- 自動ãƒã‚¸ã‚·ãƒ§ãƒ³ï¼š
+ <text name="Cache:">
+ キャッシュ:
+ </text>
+ <spinner label="キャッシュサイズ(64~9,984MB)" name="cachesizespinner"/>
+ <text name="text_box5">
+ MB
+ </text>
+ <button label="キャッシュをクリア" label_selected="キャッシュをクリア" name="clear_cache"/>
+ <text name="Cache location">
+ キャッシュã®ä¿å­˜å ´æ‰€ï¼š
</text>
- <check_box label="制作・編集" name="edit_camera_movement" tool_tip="編集モードã®ã‚ªãƒ³ãƒ»ã‚ªãƒ•ã®åˆ‡ã‚Šæ›¿ãˆã«ã€è‡ªå‹•ã‚«ãƒ¡ãƒ©ãƒã‚¸ã‚·ãƒ§ãƒ³ã‚’使ã„ã¾ã™"/>
- <check_box label="容姿" name="appearance_camera_movement" tool_tip="編集モードã«å…¥ã£ãŸã¨ãã«ã€è‡ªå‹•ã‚«ãƒ¡ãƒ©ãƒã‚¸ã‚·ãƒ§ãƒ³ã‚’使ã„ã¾ã™"/>
- <check_box initial_value="true" label="サイドãƒãƒ¼" name="appearance_sidebar_positioning" tool_tip="サイドãƒãƒ¼ã®åˆ‡ã‚Šæ›¿ãˆæ™‚ã«è‡ªå‹•ã‚«ãƒ¡ãƒ©ãƒã‚¸ã‚·ãƒ§ãƒ³ã‚’使ã„ã¾ã™"/>
- <check_box label="一人称視点ã§è¡¨ç¤ºã™ã‚‹" name="first_person_avatar_visible"/>
- <check_box label="常ã«ã‚­ãƒ¼æ“作ã§å‹•ãよã†ã«ã™ã‚‹" name="arrow_keys_move_avatar_check"/>
- <check_box label="上矢å°ã‚­ãƒ¼2度押ã—+長押ã—ã§èµ°ã‚‹" name="tap_tap_hold_to_run"/>
- <check_box label="話ã™ã¨ãã«ã‚¢ãƒã‚¿ãƒ¼ã®å£ã‚’å‹•ã‹ã™" name="enable_lip_sync"/>
- <check_box label="å¹ã出ã—ãƒãƒ£ãƒƒãƒˆ" name="bubble_text_chat"/>
- <slider label="é€æ˜Žåº¦" name="bubble_chat_opacity"/>
- <color_swatch name="background" tool_tip="å¹ã出ã—ãƒãƒ£ãƒƒãƒˆã®è‰²ã‚’é¸æŠžã—ã¾ã™"/>
+ <button label="å‚ç…§" label_selected="å‚ç…§" name="set_cache"/>
+ <button label="デフォルトã®å ´æ‰€" label_selected="デフォルトã®å ´æ‰€" name="default_cache_location"/>
<text name="UI Size:">
- UI サイズ
+ UI サイズ:
</text>
<check_box label="スクリプトã®ã‚¨ãƒ©ãƒ¼ã‚’表示:" name="show_script_errors"/>
<radio_group name="show_location">
<radio_item label="è¿‘ãã®ãƒãƒ£ãƒƒãƒˆ" name="0"/>
<radio_item label="別々ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" name="1"/>
</radio_group>
- <check_box label="ボイスã®ã‚ªãƒ³ãƒ»ã‚ªãƒ•åˆ‡ã‚Šæ›¿ãˆã«ä½¿ç”¨ã™ã‚‹ãƒˆãƒªã‚¬ãƒ¼ã‚­ãƒ¼ï¼š" name="push_to_talk_toggle_check" tool_tip="トグルモードã®æ™‚ã«ãƒˆãƒªã‚¬ãƒ¼ã‚­ãƒ¼ã‚’ 1 度押ã—ã¦æ”¾ã™ã¨ã€ãƒžã‚¤ã‚¯ã®ã‚ªãƒ³ãƒ»ã‚ªãƒ•è¨­å®šã‚’切り替ãˆã¾ã™ã€‚ トグルモードã§ã¯ãªã„ã¨ãã¯ã€ãƒˆãƒªã‚¬ãƒ¼ã‚­ãƒ¼ã‚’押ã—ãŸçŠ¶æ…‹ã®æ™‚ã®ã¿ã‚ãªãŸã®å£°ãŒç›¸æ‰‹ã«èžã“ãˆã¾ã™ã€‚"/>
- <line_editor label="プッシュ・トゥ・スピークã®ãƒˆãƒªã‚¬ãƒ¼" name="modifier_combo"/>
- <button label="キー設定" name="set_voice_hotkey_button"/>
- <button label="マウスã®ä¸­å¤®ãƒœã‚¿ãƒ³" name="set_voice_middlemouse_button" tool_tip="マウスã®ä¸­å¤®ãƒœã‚¿ãƒ³ã«ãƒªã‚»ãƒƒãƒˆã—ã¾ã™"/>
- <button label="ãã®ä»–ã®ãƒ‡ã‚£ãƒã‚¤ã‚¹" name="joystick_setup_button"/>
+ <check_box label="複数ã®ãƒ“ューワを許å¯" name="allow_multiple_viewer_check"/>
+ <check_box label="ログイン時ã«ã‚°ãƒªãƒƒãƒ‰é¸æŠžã‚’表示" name="show_grid_selection_check"/>
+ <check_box label="アドãƒãƒ³ã‚¹ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã‚’表示" name="show_advanced_menu_check"/>
+ <check_box label="デベロッパーメニューを表示" name="show_develop_menu_check"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml b/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml
index c260cebef8..75bf28a3c8 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml
@@ -8,44 +8,10 @@
<radio_item label="中" name="radio2" value="1"/>
<radio_item label="大" name="radio3" value="2"/>
</radio_group>
- <text name="font_colors">
- 文字ã®è‰²ï¼š
- </text>
- <color_swatch label="自分" name="user"/>
- <text name="text_box1">
- 自分
- </text>
- <color_swatch label="ãã®ä»–" name="agent"/>
- <text name="text_box2">
- 他人
- </text>
- <color_swatch label="IM" name="im"/>
- <text name="text_box3">
- IM
- </text>
- <color_swatch label="システム" name="system"/>
- <text name="text_box4">
- システム
- </text>
- <color_swatch label="エラー" name="script_error"/>
- <text name="text_box5">
- エラー
- </text>
- <color_swatch label="オブジェクト" name="objects"/>
- <text name="text_box6">
- オブジェクト
- </text>
- <color_swatch label="所有者" name="owner"/>
- <text name="text_box7">
- 所有者
- </text>
- <color_swatch label="URL" name="links"/>
- <text name="text_box9">
- URL
- </text>
<check_box initial_value="true" label="ãƒãƒ£ãƒƒãƒˆä¸­ã«ã‚¿ã‚¤ãƒ”ング動作ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’å†ç”Ÿ" name="play_typing_animation"/>
<check_box label="オフライン時ã«å—ã‘å–ã£ãŸ IM をメールã§å—ä¿¡" name="send_im_to_email"/>
<check_box label="IM ã¨ãƒãƒ£ãƒƒãƒˆå±¥æ­´ã«æ–‡å­—ã ã‘表示ã™ã‚‹" name="plain_text_chat_history"/>
+ <check_box label="å¹ã出ã—ãƒãƒ£ãƒƒãƒˆ" name="bubble_text_chat"/>
<text name="show_ims_in_label">
IM ã®è¡¨ç¤ºæ–¹æ³•ï¼š
</text>
@@ -56,27 +22,12 @@
<radio_item label="別々ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" name="radio" value="0"/>
<radio_item label="タブ" name="radio2" value="1"/>
</radio_group>
- <check_box label="ãƒãƒ£ãƒƒãƒˆä¸­ã«å†…容を機械翻訳ã™ã‚‹ï¼ˆGoogle翻訳)" name="translate_chat_checkbox"/>
- <text name="translate_language_text">
- 翻訳ã™ã‚‹è¨€èªžï¼š
- </text>
- <combo_box name="translate_language_combobox">
- <combo_box.item label="システム標準" name="System Default Language"/>
- <combo_box.item label="English(英語)" name="English"/>
- <combo_box.item label="Dansk(デンマーク語)" name="Danish"/>
- <combo_box.item label="Deutsch(ドイツ語)" name="German"/>
- <combo_box.item label="Español(スペイン語)" name="Spanish"/>
- <combo_box.item label="Français(フランス語)" name="French"/>
- <combo_box.item label="Italiano(イタリア語)" name="Italian"/>
- <combo_box.item label="Magyar(ãƒãƒ³ã‚¬ãƒªãƒ¼èªžï¼‰" name="Hungarian"/>
- <combo_box.item label="Nederlands(オランダ語)" name="Dutch"/>
- <combo_box.item label="Polski(ãƒãƒ¼ãƒ©ãƒ³ãƒ‰èªžï¼‰" name="Polish"/>
- <combo_box.item label="Português(ãƒãƒ«ãƒˆã‚¬ãƒ«èªžï¼‰" name="Portugese"/>
- <combo_box.item label="РуÑÑкий(ロシア語)" name="Russian"/>
- <combo_box.item label="Türkçe(トルコ語)" name="Turkish"/>
- <combo_box.item label="УкраїнÑька(ウクライナ語)" name="Ukrainian"/>
- <combo_box.item label="中文 (简体)(中国語)" name="Chinese"/>
- <combo_box.item label="日本語" name="Japanese"/>
- <combo_box.item label="한국어(韓国語)" name="Korean"/>
- </combo_box>
+ <text name="disable_toast_label">
+ å—ä¿¡ãƒãƒ£ãƒƒãƒˆã®ãƒãƒƒãƒ—アップを有効ã«ã™ã‚‹
+ </text>
+ <check_box label="グループãƒãƒ£ãƒƒãƒˆ" name="EnableGroupChatPopups" tool_tip="ã“れをé¸æŠžã™ã‚‹ã¨ã€ã‚°ãƒ«ãƒ¼ãƒ—ãƒãƒ£ãƒƒãƒˆãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å—ä¿¡ã—ãŸéš›ã«ãƒãƒƒãƒ—アップãŒè¡¨ç¤ºã•ã‚Œã¾ã™"/>
+ <check_box label="IM ãƒãƒ£ãƒƒãƒˆ" name="EnableIMChatPopups" tool_tip="ã“れをé¸æŠžã™ã‚‹ã¨ã€ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ãƒˆãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å—ä¿¡ã—ãŸéš›ã«ãƒãƒƒãƒ—アップãŒè¡¨ç¤ºã•ã‚Œã¾ã™"/>
+ <spinner label="è¿‘ãã®ãƒãƒ£ãƒƒãƒˆãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒè¡¨ç¤ºã•ã‚Œã‚‹é•·ã•ï¼š" name="nearby_toasts_lifetime"/>
+ <spinner label="è¿‘ãã®ãƒãƒ£ãƒƒãƒˆãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒæ¶ˆãˆã‚‹ã¾ã§ã®é•·ã•ï¼š" name="nearby_toasts_fadingtime"/>
+ <button label="ãƒãƒ£ãƒƒãƒˆã®ç¿»è¨³è¨­å®š" name="ok_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_colors.xml b/indra/newview/skins/default/xui/ja/panel_preferences_colors.xml
new file mode 100644
index 0000000000..9f6abf8fcb
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_colors.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="色" name="colors_panel">
+ <text name="effects_color_textbox">
+ ビームã®è‰²ï¼ˆé¸æŠžãƒ“ーム):
+ </text>
+ <color_swatch name="effect_color_swatch" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
+ <text name="font_colors">
+ ãƒãƒ£ãƒƒãƒˆã®æ–‡å­—ã®è‰²
+ </text>
+ <text name="text_box1">
+ 自分
+ </text>
+ <text name="text_box2">
+ ä»–ã®ä½äºº
+ </text>
+ <text name="text_box3">
+ オブジェクト
+ </text>
+ <text name="text_box4">
+ システム
+ </text>
+ <text name="text_box5">
+ エラー
+ </text>
+ <text name="text_box10">
+ ダイレクト
+ </text>
+ <text name="text_box7">
+ 所有者
+ </text>
+ <text name="text_box9">
+ URL
+ </text>
+ <text name="bubble_chat">
+ åå‰ã®è¡¨ç¤ºã®èƒŒæ™¯è‰²ï¼ˆå¹ã出ã—ãƒãƒ£ãƒƒãƒˆã«ã‚‚é©ç”¨ï¼‰ï¼š
+ </text>
+ <color_swatch name="background" tool_tip="åå‰ã®è¡¨ç¤ºè‰²ã‚’é¸æŠž"/>
+ <slider label="ä¸é€æ˜Žåº¦ï¼š" name="bubble_chat_opacity" tool_tip="åå‰ã®è¡¨ç¤ºã®ä¸é€æ˜Žåº¦ã‚’é¸æŠž"/>
+ <text name="floater_opacity">
+ フローターã®ä¸é€æ˜Žåº¦ï¼š
+ </text>
+ <slider label="有効:" name="active"/>
+ <slider label="無効:" name="inactive"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_general.xml b/indra/newview/skins/default/xui/ja/panel_preferences_general.xml
index 751faff1d8..91e1514e49 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_general.xml
@@ -11,10 +11,12 @@
<combo_box.item label="Español (スペイン語) – ベータ" name="Spanish"/>
<combo_box.item label="Français (フランス語) – ベータ" name="French"/>
<combo_box.item label="Italiano (イタリア語) - ベータ" name="Italian"/>
- <combo_box.item label="Nederlands (オランダ語) - ベータ" name="Dutch"/>
<combo_box.item label="Polski (ãƒãƒ¼ãƒ©ãƒ³ãƒ‰èªžï¼‰ - ベータ" name="Polish"/>
<combo_box.item label="Português(ãƒãƒ«ãƒˆã‚¬ãƒ«èªžï¼‰ - ベータ" name="Portugese"/>
+ <combo_box.item label="РуÑÑкий (ロシア語) - ベータ" name="Russian"/>
+ <combo_box.item label="Türkçe (トルコ語) - ベータ" name="Turkish"/>
<combo_box.item label="日本語 – ベータ" name="(Japanese)"/>
+ <combo_box.item label="正體中文(簡体字中国語)- ベータ版" name="Traditional Chinese"/>
</combo_box>
<text name="language_textbox2">
(å†èµ·å‹•å¾Œã«å映)
@@ -44,16 +46,21 @@
<radio_item label="オン" name="radio2" value="1"/>
<radio_item label="一時的ã«è¡¨ç¤º" name="radio3" value="2"/>
</radio_group>
- <check_box label="自分ã®åå‰ã‚’表示" name="show_my_name_checkbox1"/>
- <check_box initial_value="true" label="å°ã•ã„ã‚¢ãƒã‚¿ãƒ¼å" name="small_avatar_names_checkbox"/>
- <check_box label="グループタイトルを表示" name="show_all_title_checkbox1"/>
- <text name="effects_color_textbox">
- ビームã®è‰²ï¼š
+ <check_box label="マイãƒãƒ¼ãƒ " name="show_my_name_checkbox1"/>
+ <check_box label="ユーザーå" name="show_slids" tool_tip="bobsmith123 ãªã©ãƒ¦ãƒ¼ã‚¶ãƒ¼åを表示"/>
+ <check_box label="グループタイトル" name="show_all_title_checkbox1" tool_tip="オフィサーã¾ãŸã¯ãƒ¡ãƒ³ãƒãƒ¼ãªã©ã€ã‚°ãƒ«ãƒ¼ãƒ—タイトルを表示"/>
+ <check_box label="フレンドをãƒã‚¤ãƒ©ã‚¤ãƒˆè¡¨ç¤º" name="show_friends" tool_tip="フレンドã®åå‰ã‚’ãƒã‚¤ãƒ©ã‚¤ãƒˆè¡¨ç¤º"/>
+ <check_box label="表示åを表示" name="display_names_check" tool_tip="ã“れをé¸æŠžã™ã‚‹ã¨ã€ãƒãƒ£ãƒƒãƒˆã€IM ãªã©ã§è¡¨ç¤ºåãŒè¡¨ç¤ºã•ã‚Œã¾ã™ã€‚"/>
+ <text name="inworld_typing_rg_label">
+ 文字キーを押ã—ã¦æ¬¡ã®æ“作:
</text>
+ <radio_group name="inworld_typing_preference">
+ <radio_item label="ローカル・ãƒãƒ£ãƒƒãƒˆã‚’始ã‚ã‚‹" name="radio_start_chat" value="1"/>
+ <radio_item label="ムーブメントã«å½±éŸ¿ï¼ˆWASD ãªã©ï¼‰" name="radio_move" value="0"/>
+ </radio_group>
<text name="title_afk_text">
一時退席ã¾ã§ã®æ™‚間:
</text>
- <color_swatch label="" name="effect_color_swatch" tool_tip="クリックã§ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
<combo_box label="一時退席ã¾ã§ã®æ™‚間:" name="afk">
<combo_box.item label="2 分" name="item0"/>
<combo_box.item label="5 分" name="item1"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml
index 92635182c8..1786b4befc 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml
@@ -25,9 +25,22 @@
<text name="ShadersText">
シェーダー:
</text>
+ <check_box initial_value="true" label="é€æ˜Žãªæ°´" name="TransparentWater"/>
<check_box initial_value="true" label="ãƒãƒ³ãƒ—マッピングã¨å…‰æ²¢" name="BumpShiny"/>
+ <check_box initial_value="true" label="è¿‘ãã®å…‰" name="LocalLights"/>
<check_box initial_value="true" label="基本シェーダー" name="BasicShaders" tool_tip="ã“ã®ã‚ªãƒ—ションを無効ã«ã™ã‚‹ã¨ã€ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ã‚«ãƒ¼ãƒ‰ã®ãƒ‰ãƒ©ã‚¤ãƒã®ç¨®é¡žã«ã‚ˆã£ã¦ã¯ã€ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ã™ã‚‹ã®ã‚’防ãŽã¾ã™ã€‚"/>
<check_box initial_value="true" label="周囲(大気)シェーダー" name="WindLightUseAtmosShaders"/>
+ <check_box initial_value="true" label="å…‰ã¨å½±" name="UseLightShaders"/>
+ <check_box initial_value="true" label="アンビエントオクルージョン" name="UseSSAO"/>
+ <check_box initial_value="true" label="フィールドã®é è¿‘æ„Ÿ" name="UseDoF"/>
+ <text name="shadows_label">
+ 影:
+ </text>
+ <combo_box name="ShadowDetail">
+ <combo_box.item label="ãªã—" name="0"/>
+ <combo_box.item label="太陽/月" name="1"/>
+ <combo_box.item label="太陽/月・プロジェクタ" name="2"/>
+ </combo_box>
<text name="reflection_label">
æ°´ã®å射:
</text>
@@ -38,6 +51,10 @@
<combo_box.item label="ã™ã¹ã¦ã®ã‚¢ãƒã‚¿ãƒ¼ã¨ã‚ªãƒ–ジェクト" name="3"/>
<combo_box.item label="ã™ã¹ã¦" name="4"/>
</combo_box>
+ <slider label="ã‚¢ãƒã‚¿ãƒ¼ã®ç‰©ç†ä½œç”¨ï¼š" name="AvatarPhysicsDetail"/>
+ <text name="AvatarPhysicsDetailText">
+ 低
+ </text>
<slider label="æç”»è·é›¢ï¼š" name="DrawDistance"/>
<text name="DrawDistanceMeterText2">
m
@@ -76,7 +93,7 @@
低
</text>
<text name="AvatarRenderingText">
- ã‚¢ãƒã‚¿ãƒ¼è¡¨ç¤ºï¼š
+ ã‚¢ãƒã‚¿ãƒ¼ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ï¼š
</text>
<check_box initial_value="true" label="ã‚¢ãƒã‚¿ãƒ¼ã®æ画を簡略化" name="AvatarImpostors"/>
<check_box initial_value="true" label="ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã‚¹ã‚­ãƒ‹ãƒ³ã‚°" name="AvatarVertexProgram"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_move.xml b/indra/newview/skins/default/xui/ja/panel_preferences_move.xml
new file mode 100644
index 0000000000..121bebfd52
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_move.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="移動" name="move_panel">
+ <slider label="視界角" name="camera_fov"/>
+ <slider label="è·é›¢" name="camera_offset_scale"/>
+ <text name="heading2">
+ 自動ãƒã‚¸ã‚·ãƒ§ãƒ³ï¼š
+ </text>
+ <check_box label="制作・編集" name="edit_camera_movement" tool_tip="編集モードã®ã‚ªãƒ³ãƒ»ã‚ªãƒ•ã®åˆ‡ã‚Šæ›¿ãˆã«ã€è‡ªå‹•ã‚«ãƒ¡ãƒ©ãƒã‚¸ã‚·ãƒ§ãƒ³ã‚’使ã„ã¾ã™"/>
+ <check_box label="容姿" name="appearance_camera_movement" tool_tip="編集モードã«å…¥ã£ãŸã¨ãã«ã€è‡ªå‹•ã‚«ãƒ¡ãƒ©ãƒã‚¸ã‚·ãƒ§ãƒ³ã‚’使ã„ã¾ã™"/>
+ <text name="keyboard_lbl">
+ キーボード:
+ </text>
+ <check_box label="常ã«ã‚­ãƒ¼æ“作ã§å‹•ãよã†ã«ã™ã‚‹" name="arrow_keys_move_avatar_check"/>
+ <check_box label="上矢å°ã‚­ãƒ¼2度押ã—+長押ã—ã§èµ°ã‚‹" name="tap_tap_hold_to_run"/>
+ <text name="mouse_lbl">
+ マウス:
+ </text>
+ <check_box label="一人称視点ã§è¡¨ç¤ºã™ã‚‹" name="first_person_avatar_visible"/>
+ <text name=" Mouse Sensitivity">
+ 一人称視点ã®ãƒžã‚¦ã‚¹ã®æ„Ÿåº¦ï¼š
+ </text>
+ <check_box label="切り替ãˆ" name="invert_mouse"/>
+ <text name="single_click_action_lbl">
+ 土地をシングルクリック:
+ </text>
+ <combo_box name="single_click_action_combo">
+ <combo_box.item label="動作ãªã—" name="0"/>
+ <combo_box.item label="クリックã•ã‚ŒãŸåœ°ç‚¹ã«ç§»å‹•" name="1"/>
+ </combo_box>
+ <text name="double_click_action_lbl">
+ 土地をダブルクリック:
+ </text>
+ <combo_box name="double_click_action_combo">
+ <combo_box.item label="動作ãªã—" name="0"/>
+ <combo_box.item label="クリックã•ã‚ŒãŸåœ°ç‚¹ã«ç§»å‹•" name="1"/>
+ <combo_box.item label="クリックã•ã‚ŒãŸåœ°ç‚¹ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ" name="2"/>
+ </combo_box>
+ <button label="ãã®ä»–ã®ãƒ‡ã‚£ãƒã‚¤ã‚¹" name="joystick_setup_button"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/ja/panel_preferences_privacy.xml
index b81889b412..420bbed572 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_privacy.xml
@@ -7,19 +7,24 @@
<text name="cache_size_label_l">
(ä½ç½®ã€ç”»åƒã€webã€æ¤œç´¢å±¥æ­´ï¼‰
</text>
+ <check_box label="検索çµæžœã«è¡¨ç¤º" name="online_searchresults"/>
<check_box label="ç§ã®ã‚ªãƒ³ãƒ©ã‚¤ãƒ³çŠ¶æ…‹ã‚’確èªã§ãã‚‹ã®ã¯ã€ãƒ•ãƒ¬ãƒ³ãƒ‰ã¨ã‚°ãƒ«ãƒ¼ãƒ—ã ã‘" name="online_visibility"/>
<check_box label="フレンドã¨ã‚°ãƒ«ãƒ¼ãƒ—以外ã‹ã‚‰ã¯ã‚³ãƒ¼ãƒ«ã¨ IM ã‚’å—ä¿¡ã—ãªã„" name="voice_call_friends_only_check"/>
<check_box label="コールãŒçµ‚了ã—ãŸã‚‰è‡ªå‹•çš„ã«ãƒžã‚¤ã‚¯ã®ã‚¹ã‚¤ãƒƒãƒã‚’切る" name="auto_disengage_mic_check"/>
- <check_box label="Cookie ã‚’å—ã‘入れる" name="cookies_enabled"/>
+ <check_box label="ログイン時ã«ãŠæ°—ã«å…¥ã‚Šã®ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã‚’表示(「開始地点ã€ãƒ‰ãƒ­ãƒƒãƒ—ダウンメニュー経由)" name="favorites_on_login_check"/>
<text name="Logs:">
- ログ:
+ ãƒãƒ£ãƒƒãƒˆãƒ­ã‚°ï¼š
</text>
<check_box label="è¿‘ãã®ãƒãƒ£ãƒƒãƒˆãƒ­ã‚°ã‚’コンピューターã«ä¿å­˜ã™ã‚‹" name="log_nearby_chat"/>
<check_box label="IM ログをコンピューターã«ä¿å­˜ã™ã‚‹" name="log_instant_messages"/>
- <check_box label="日時を入れる" name="show_timestamps_check_im"/>
+ <check_box label="ãƒãƒ£ãƒƒãƒˆãƒ­ã‚°ã§ãƒ©ã‚¤ãƒ³ã”ã¨ã«æ™‚間を入れる" name="show_timestamps_check_im"/>
+ <check_box label="ログファイルåã«æ—¥ä»˜ã‚’入れる。" name="logfile_name_datestamp"/>
<text name="log_path_desc">
ログã®ä¿å­˜å ´æ‰€ï¼š
</text>
<button label="å‚ç…§" label_selected="å‚ç…§" name="log_path_button"/>
<button label="ブロックリスト" name="block_list"/>
+ <text name="block_list_label">
+ (ã‚ãªãŸãŒãƒ–ロックã—ãŸä½äºº/オブジェクト)
+ </text>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml b/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml
index 653d9fd3b3..d90a1632ab 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml
@@ -1,13 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="セットアップ" name="Input panel">
- <button label="ãã®ä»–ã®ãƒ‡ã‚£ãƒã‚¤ã‚¹" name="joystick_setup_button"/>
- <text name="Mouselook:">
- 一人称視点:
- </text>
- <text name=" Mouse Sensitivity">
- マウスã®æ„Ÿåº¦
- </text>
- <check_box label="切り替ãˆ" name="invert_mouse"/>
<text name="Network:">
ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ï¼š
</text>
@@ -19,31 +11,26 @@
</text>
<check_box label="カスタムãƒãƒ¼ãƒˆ" name="connection_port_enabled"/>
<spinner label="ãƒãƒ¼ãƒˆç•ªå·ï¼š" name="connection_port"/>
- <text name="cache_size_label_l">
- キャッシュサイズ
- </text>
- <text name="text_box5">
- MB
- </text>
- <text name="Cache location">
- キャッシュã®ä¿å­˜å ´æ‰€ï¼š
- </text>
- <button label="å‚ç…§" label_selected="å‚ç…§" name="set_cache"/>
- <button label="リセット" label_selected="リセット" name="reset_cache"/>
<text name="Web:">
Web:
</text>
<radio_group name="use_external_browser">
- <radio_item label="指定ã®ãƒ–ラウザ(IE ã‚„ Firefox)を使用" name="external" tool_tip="デフォルトã®ã‚·ã‚¹ãƒ†ãƒ  Web ブラウザã§ãƒ˜ãƒ«ãƒ—ã‚„ Web リンク先ãªã©ã‚’見ã¾ã™ã€‚全画é¢ã§èµ·å‹•ä¸­ã«ã¯ãŠã™ã™ã‚ã—ã¾ã›ã‚“。" value="1"/>
+ <radio_item label="指定ã®ãƒ–ラウザ(IE ã‚„ Firefox)を使用" name="external" tool_tip="デフォルトã®ã‚·ã‚¹ãƒ†ãƒ  Web ブラウザã§ãƒ˜ãƒ«ãƒ—ã‚„ Web リンク先ãªã©ã‚’見ã¾ã™ã€‚全画é¢ã§èµ·å‹•ä¸­ã«ã¯ãŠã™ã™ã‚ã—ã¾ã›ã‚“。" value="true"/>
<radio_item label="内蔵ブラウザを使用" name="internal" tool_tip="内蔵ブラウザã§ãƒ˜ãƒ«ãƒ—ã‚„ Web リンクãªã©ã‚’見ã¾ã™ã€‚[APP_NAME] 内ã«æ–°ã—ã„ウィンドウã§ã“ã®ãƒ–ラウザãŒé–‹ãã¾ã™ã€‚" value=""/>
</radio_group>
<check_box initial_value="true" label="プラグインを有効ã«ã™ã‚‹" name="browser_plugins_enabled"/>
<check_box initial_value="true" label="Cookie ã‚’å—ã‘入れる" name="cookies_enabled"/>
<check_box initial_value="true" label="Javascript を有効ã«ã™ã‚‹" name="browser_javascript_enabled"/>
- <check_box initial_value="false" label="Web プロキシを有効ã«ã™ã‚‹" name="web_proxy_enabled"/>
- <text name="Proxy location">
- プロキシ:
- </text>
- <line_editor name="web_proxy_editor" tool_tip="使用ã™ã‚‹ãƒ—ロキシã®ãƒ›ã‚¹ãƒˆåã¾ãŸã¯ IP アドレス"/>
- <spinner label="ãƒãƒ¼ãƒˆç•ªå·ï¼š" name="web_proxy_port"/>
+ <check_box initial_value="false" label="メディアブラウザã®ãƒãƒƒãƒ—アップを有効ã«ã™ã‚‹" name="media_popup_enabled"/>
+ <text name="Software updates:">
+ ソフトウェアアップデート:
+ </text>
+ <combo_box name="updater_service_combobox">
+ <combo_box.item label="自動的ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«" name="Install_automatically"/>
+ <combo_box.item label="手動ã§ã‚¢ãƒƒãƒ—デートをダウンロード&amp;インストール" name="Install_manual"/>
+ </combo_box>
+ <text name="Proxy Settings:">
+ プロキシ設定:
+ </text>
+ <button label="プロキシ設定を調整" label_selected="å‚ç…§" name="set_proxy"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml b/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml
index 4f29ae7b44..3a4c360ccc 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml
@@ -1,18 +1,25 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="サウンド" name="Preference Media panel">
+ <panel.string name="middle_mouse">
+ マウスã®ä¸­å¤®
+ </panel.string>
<slider label="全体ã®éŸ³é‡" name="System Volume"/>
- <check_box initial_value="true" label="最å°åŒ–ã§ãƒŸãƒ¥ãƒ¼ãƒˆ" name="mute_when_minimized"/>
+ <check_box initial_value="true" label="Mute when minimized" name="mute_when_minimized"/>
+ <text name="mute_chb_label">
+ 最å°åŒ–ã§ãƒŸãƒ¥ãƒ¼ãƒˆ
+ </text>
<slider label="ボタン" name="UI Volume"/>
<slider label="風" name="Wind Volume"/>
<slider label="効果音" name="SFX Volume"/>
<slider label="ストリーミング音楽" name="Music Volume"/>
- <check_box label="有効" name="music_enabled"/>
+ <check_box label="有効" name="enable_music"/>
<slider label="メディア" name="Media Volume"/>
<check_box label="有効" name="enable_media"/>
<slider label="ボイスãƒãƒ£ãƒƒãƒˆ" name="Voice Volume"/>
<check_box label="有効" name="enable_voice_check"/>
<check_box label="メディアを自動å†ç”Ÿã™ã‚‹" name="media_auto_play_btn" tool_tip="ã“ã“ã«ãƒã‚§ãƒƒã‚¯ã‚’入れã¦ãƒ¡ãƒ‡ã‚£ã‚¢ã®è‡ªå‹•å†ç”Ÿã‚’許å¯ã—ã¾ã™" value="true"/>
<check_box label="ä»–ã®ã‚¢ãƒã‚¿ãƒ¼ã«å–り付ã‘られãŸãƒ¡ãƒ‡ã‚£ã‚¢ã‚’å†ç”Ÿã™ã‚‹" name="media_show_on_others_btn" tool_tip="ã“ã®ãƒã‚§ãƒƒã‚¯ã‚’外ã™ã¨ã€è¿‘ãã«ã„ã‚‹ä»–ã®ã‚¢ãƒã‚¿ãƒ¼ã«å–り付ã‘られãŸãƒ¡ãƒ‡ã‚£ã‚¢ã‚’éžè¡¨ç¤ºã«ã—ã¾ã™" value="true"/>
+ <check_box label="ジェスãƒãƒ£ãƒ¼ã®éŸ³ã‚’å†ç”Ÿ" name="gesture_audio_play_btn" tool_tip="ジェスãƒãƒ£ãƒ¼ã®éŸ³ã‚’èžãã«ã¯ã“れをé¸æŠž" value="true"/>
<text name="voice_chat_settings">
ボイスãƒãƒ£ãƒƒãƒˆã®è¨­å®š
</text>
@@ -23,29 +30,11 @@
<radio_item label="カメラã®ä½ç½®ã‹ã‚‰èžã" name="0"/>
<radio_item label="ã‚¢ãƒã‚¿ãƒ¼ã®ä½ç½®ã‹ã‚‰èžã" name="1"/>
</radio_group>
+ <check_box label="話ã™ã¨ãã«ã‚¢ãƒã‚¿ãƒ¼ã®å£ã‚’å‹•ã‹ã™" name="enable_lip_sync"/>
+ <check_box label="ボイスã®ã‚ªãƒ³ãƒ»ã‚ªãƒ•åˆ‡ã‚Šæ›¿ãˆã«ä½¿ç”¨ã™ã‚‹ãƒˆãƒªã‚¬ãƒ¼ã‚­ãƒ¼ï¼š" name="push_to_talk_toggle_check" tool_tip="トグルモードã®æ™‚ã«ãƒˆãƒªã‚¬ãƒ¼ã‚­ãƒ¼ã‚’1度押ã—ã¦æ”¾ã™ã¨ã€ãƒžã‚¤ã‚¯ã®ã‚ªãƒ³ãƒ»ã‚ªãƒ•è¨­å®šã‚’切り替ãˆã¾ã™ã€‚トグルモードã§ã¯ãªã„ã¨ãã¯ã€ãƒˆãƒªã‚¬ãƒ¼ã‚­ãƒ¼ã‚’押ã—ãŸçŠ¶æ…‹ã®æ™‚ã®ã¿ã‚ãªãŸã®å£°ãŒç›¸æ‰‹ã«èžã“ãˆã¾ã™ã€‚"/>
+ <line_editor label="プッシュ・トゥ・スピークã®ãƒˆãƒªã‚¬ãƒ¼" name="modifier_combo"/>
+ <button label="キー設定" name="set_voice_hotkey_button"/>
+ <button name="set_voice_middlemouse_button" tool_tip="マウスã®ä¸­å¤®ãƒœã‚¿ãƒ³ã«ãƒªã‚»ãƒƒãƒˆ"/>
<button label="入力・出力機器" name="device_settings_btn"/>
- <panel label="機器ã®è¨­å®š" name="device_settings_panel">
- <panel.string name="default_text">
- デフォルト
- </panel.string>
- <panel.string name="default system device">
- デフォルトã®ã‚·ã‚¹ãƒ†ãƒ æ©Ÿå™¨
- </panel.string>
- <panel.string name="no device">
- 機器ãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“
- </panel.string>
- <text name="Input">
- 入力
- </text>
- <text name="My volume label">
- ç§ã®éŸ³é‡ï¼š
- </text>
- <slider_bar initial_value="1.0" name="mic_volume_slider" tool_tip="スライダーを使ã£ã¦éŸ³é‡ã‚’調節ã—ã¾ã™"/>
- <text name="wait_text">
- ã—ã°ã‚‰ããŠå¾…ã¡ãã ã•ã„。
- </text>
- <text name="Output">
- 出力
- </text>
- </panel>
+ <panel label="機器ã®è¨­å®š" name="device_settings_panel"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_profile.xml b/indra/newview/skins/default/xui/ja/panel_profile.xml
deleted file mode 100644
index 860020c87c..0000000000
--- a/indra/newview/skins/default/xui/ja/panel_profile.xml
+++ /dev/null
@@ -1,68 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="プロフィール" name="panel_profile">
- <string name="CaptionTextAcctInfo">
- [ACCTTYPE]
-[PAYMENTINFO] [AGEVERIFICATION]
- </string>
- <string name="payment_update_link_url">
- http://www.secondlife.com/account/billing.php?lang=ja-JP
- </string>
- <string name="partner_edit_link_url">
- http://www.secondlife.com/account/partners.php?lang=ja
- </string>
- <string name="my_account_link_url" value="http://secondlife.com/my/account/index.php?lang=ja-JP"/>
- <string name="no_partner_text" value="ãªã—"/>
- <string name="no_group_text" value="ãªã—"/>
- <string name="RegisterDateFormat">
- [REG_DATE] ([AGE])
- </string>
- <layout_stack name="layout">
- <layout_panel name="profile_stack">
- <scroll_container name="profile_scroll">
- <panel name="profile_scroll_panel">
- <panel name="second_life_image_panel">
- <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/>
- </panel>
- <panel name="first_life_image_panel">
- <text name="title_rw_descr_text" value="ç¾å®Ÿä¸–界:"/>
- </panel>
- <text name="title_member_text" value="ä½äººç™»éŒ²ï¼š"/>
- <text name="title_acc_status_text" value="アカウントã®çŠ¶æ…‹ï¼š"/>
- <text_editor name="acc_status_text">
- ä½äººã€‚ 支払情報未登録。
- リンデン。
- </text_editor>
- <text name="title_partner_text" value="パートナー:"/>
- <panel name="partner_data_panel">
- <name_box initial_value="(å–得中)" name="partner_text"/>
- </panel>
- <text name="title_groups_text" value="グループ:"/>
- </panel>
- </scroll_container>
- </layout_panel>
- </layout_stack>
- <layout_stack name="layout_verb_buttons">
- <layout_panel name="profile_buttons_panel">
- <layout_stack name="bottom_bar_ls">
- <layout_panel name="add_friend_btn_lp">
- <button label="フレンド登録" name="add_friend" tool_tip="フレンド登録を申ã—出ã¾ã™"/>
- </layout_panel>
- <layout_panel name="im_btn_lp">
- <button label="IM" name="im" tool_tip="インスタントメッセージを開ãã¾ã™"/>
- </layout_panel>
- <layout_panel name="call_btn_lp">
- <button label="コール" name="call" tool_tip="ã“ã®ä½äººã«ã‚³ãƒ¼ãƒ«ã™ã‚‹"/>
- </layout_panel>
- <layout_panel name="chat_btn_lp">
- <button label="テレãƒãƒ¼ãƒˆ" name="teleport" tool_tip="テレãƒãƒ¼ãƒˆã‚’é€ã‚Šã¾ã™"/>
- </layout_panel>
- <layout_panel name="overflow_btn_lp">
- <button label="â–¼" name="overflow_btn" tool_tip="ä½äººã«ãŠé‡‘を渡ã™ã‹æŒã¡ç‰©ã‚’共有ã—ã¾ã™"/>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- <layout_panel name="profile_me_buttons_panel">
- <button label="プロフィールã®ç·¨é›†" name="edit_profile_btn" tool_tip="個人的ãªæƒ…報を編集ã—ã¾ã™"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_profile_view.xml b/indra/newview/skins/default/xui/ja/panel_profile_view.xml
deleted file mode 100644
index 5666a93cf0..0000000000
--- a/indra/newview/skins/default/xui/ja/panel_profile_view.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_target_profile">
- <string name="status_online">
- オンライン
- </string>
- <string name="status_offline">
- オフライン
- </string>
- <text_editor name="user_name" value="(ローディング...)"/>
- <text name="status" value="オンライン"/>
- <tab_container name="tabs">
- <panel label="プロフィール" name="panel_profile"/>
- <panel label="ピック" name="panel_picks"/>
- <panel label="メモã¨ãƒ—ライãƒã‚·ãƒ¼" name="panel_notes"/>
- </tab_container>
-</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_region_environment.xml b/indra/newview/skins/default/xui/ja/panel_region_environment.xml
new file mode 100644
index 0000000000..f6ef3f0934
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_region_environment.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="環境" name="panel_env_info">
+ <text name="water_settings_title">
+ ã‚ãªãŸã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã‚’訪れるユーザーã«è¦‹ã›ãŸã„ã€æ°´ã¨ç©º/デイサイクルã®è¨­å®šã‚’é¸æŠžã—ã¾ã™ã€‚詳細
+ </text>
+ <radio_group name="region_settings_radio_group">
+ <radio_item label="Second Life ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆè¨­å®šã‚’使用" name="use_sl_default_settings"/>
+ <radio_item label="次ã®è¨­å®šã‚’使用" name="use_my_settings"/>
+ </radio_group>
+ <panel name="user_environment_settings">
+ <text name="water_settings_title">
+ æ°´ã®è¨­å®š
+ </text>
+ <combo_box name="water_settings_preset_combo">
+ <combo_box.item label="- 事å‰è¨­å®šã‚’é¸æŠž -" name="item0"/>
+ </combo_box>
+ <text name="sky_dayc_settings_title">
+ 空 / デイサイクル
+ </text>
+ <radio_group name="sky_dayc_settings_radio_group">
+ <radio_item label="空ã®å›ºå®š" name="my_sky_settings"/>
+ <radio_item label="デイサイクル" name="my_dayc_settings"/>
+ </radio_group>
+ <combo_box name="sky_settings_preset_combo">
+ <combo_box.item label="- 事å‰è¨­å®šã‚’é¸æŠž -" name="item0"/>
+ </combo_box>
+ <combo_box name="dayc_settings_preset_combo">
+ <combo_box.item label="- 事å‰è¨­å®šã‚’é¸æŠž -" name="item0"/>
+ </combo_box>
+ </panel>
+ <button label="é©ç”¨" name="apply_btn"/>
+ <button label="å–り消ã—" name="cancel_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_region_estate.xml b/indra/newview/skins/default/xui/ja/panel_region_estate.xml
index 5b2ef36045..2e58c5a8f1 100644
--- a/indra/newview/skins/default/xui/ja/panel_region_estate.xml
+++ b/indra/newview/skins/default/xui/ja/panel_region_estate.xml
@@ -16,10 +16,10 @@
(ä¸æ˜Žï¼‰
</text>
<text name="Only Allow">
- 次ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®ã¿ã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ï¼š
+ 次ã®ä½äººã«ã®ã¿ã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ï¼š
</text>
- <check_box label="支払情報登録済" name="limit_payment" tool_tip="未確èªã®ä½äººã®ç«‹å…¥ã‚’ç¦æ­¢ã—ã¾ã™"/>
- <check_box label="年齢確èªæ¸ˆ" name="limit_age_verified" tool_tip="年齢確èªã‚’済ã¾ã›ã¦ã„ãªã„ä½äººã®ç«‹å…¥ã‚’ç¦æ­¢ã—ã¾ã™ã€‚ 詳ã—ã„情報㯠[SUPPORT_SITE] ã‚’ã”覧下ã•ã„。"/>
+ <check_box label="支払情情報ãŒç™»éŒ²ã•ã‚Œã¦ã„ã‚‹" name="limit_payment" tool_tip="支払情報ãŒç™»éŒ²ã•ã‚Œã¦ã„ãªã„ã¨ã€ã“ã®ä¸å‹•ç”£ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。詳細ã«ã¤ã„ã¦ã¯ã€[SUPPORT_SITE] ã‚’ã”覧ãã ã•ã„。"/>
+ <check_box label="年齢確èªãŒæ¸ˆã‚“ã§ã„ã‚‹" name="limit_age_verified" tool_tip="ã“ã®ä¸å‹•ç”£ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã«ã¯ã€å¹´é½¢ç¢ºèªã‚’済ã¾ã›ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚詳細ã«ã¤ã„ã¦ã¯ã€[SUPPORT_SITE] ã‚’ã”覧ãã ã•ã„。"/>
<check_box label="ボイスãƒãƒ£ãƒƒãƒˆã‚’許å¯" name="voice_chat_check"/>
<button label="?" name="voice_chat_help"/>
<text name="abuse_email_text">
diff --git a/indra/newview/skins/default/xui/ja/panel_region_general.xml b/indra/newview/skins/default/xui/ja/panel_region_general.xml
index 54ec24773f..65148cf1ee 100644
--- a/indra/newview/skins/default/xui/ja/panel_region_general.xml
+++ b/indra/newview/skins/default/xui/ja/panel_region_general.xml
@@ -25,6 +25,7 @@
<check_box label="土地ã®å†è²©ã‚’許å¯" name="allow_land_resell_check"/>
<check_box label="土地ã®çµ±åˆãƒ»åˆ†å‰²ã‚’許å¯" name="allow_parcel_changes_check"/>
<check_box label="土地ã®æ¤œç´¢è¡¨ç¤ºã‚’ブロック" name="block_parcel_search_check" tool_tip="検索çµæžœã§ã€ã“ã®åœ°åŸŸã¨åŒºç”»ã‚’表示ã™ã‚‹ã‹ã©ã†ã‹ã®è¨­å®šã§ã™"/>
+ <check_box label="メッシュオブジェクトを許å¯" name="mesh_rez_enabled_check" tool_tip="ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã§ãƒ¡ãƒƒã‚·ãƒ¥ã‚ªãƒ–ジェクト㮠Rez を許å¯ã™ã‚‹"/>
<spinner label="ã‚¢ãƒã‚¿ãƒ¼æ•°ä¸Šé™" name="agent_limit_spin"/>
<spinner label="物体ボーナス" name="object_bonus_spin"/>
<text label="æˆäººæŒ‡å®š" name="access_text">
diff --git a/indra/newview/skins/default/xui/ja/panel_region_terrain.xml b/indra/newview/skins/default/xui/ja/panel_region_terrain.xml
index 8df803b2dc..fb853c1925 100644
--- a/indra/newview/skins/default/xui/ja/panel_region_terrain.xml
+++ b/indra/newview/skins/default/xui/ja/panel_region_terrain.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="地形" name="Terrain">
<text name="region_text_lbl">
地域:
@@ -6,25 +6,55 @@
<text name="region_text">
未知
</text>
- <spinner label="æ°´é¢ã®é«˜ã•" name="water_height_spin" />
- <button label="?" name="water_height_help" />
- <spinner label="地形ã®ä¸Šæ˜‡é™åº¦" name="terrain_raise_spin" />
- <button label="?" name="terrain_raise_help" />
- <spinner label="地形ã®ä¸‹é™é™åº¦" name="terrain_lower_spin" />
- <button label="?" name="terrain_lower_help" />
- <check_box label="ä¸å‹•ç”£å¤ªé™½ä½¿ç”¨" name="use_estate_sun_check" />
- <button label="?" name="use_estate_sun_help" />
- <check_box label="太陽固定" name="fixed_sun_check" />
- <button label="?" name="fixed_sun_help" />
- <slider label="段階" name="sun_hour_slider" />
- <button label="é©ç”¨" name="apply_btn" />
- <button label="RAW 地形ダウンロード..." name="download_raw_btn"
- tool_tip="ä¸å‹•ç”£ã‚ªãƒ¼ãƒŠãƒ¼ã®ã¿åˆ©ç”¨å¯èƒ½ã€ç®¡ç†è€…ã¯åˆ©ç”¨ä¸å¯ã§ã™" />
- <button label="?" name="download_raw_help" />
- <button label="RAW 地形アップロード..." name="upload_raw_btn"
- tool_tip="ä¸å‹•ç”£ã‚ªãƒ¼ãƒŠãƒ¼ã®ã¿åˆ©ç”¨å¯èƒ½ã€ç®¡ç†è€…ã¯åˆ©ç”¨ä¸å¯ã§ã™" />
- <button label="?" name="upload_raw_help" />
- <button label="地形ã®æ§‹ç¯‰" name="bake_terrain_btn"
- tool_tip="ç¾åœ¨ã®åœ°å½¢ã‚’上昇・下é™ç¯„囲ã®ä¸­é–“点ã¨ã—ã¦è¨­å®šã—ã¾ã™" />
- <button label="?" name="bake_terrain_help" />
+ <spinner label="æ°´é¢ã®é«˜ã•" name="water_height_spin"/>
+ <spinner label="地形ã®ä¸Šæ˜‡é™åº¦" name="terrain_raise_spin"/>
+ <spinner label="地形ã®ä¸‹é™é™åº¦" name="terrain_lower_spin"/>
+ <text name="detail_texture_text">
+ 地形テクスãƒãƒ£ï¼ˆ512x512 ã® 24 bit .tga ファイル)
+ </text>
+ <text name="height_text_lbl">
+ 1(低)
+ </text>
+ <text name="height_text_lbl2">
+ 2
+ </text>
+ <text name="height_text_lbl3">
+ 3
+ </text>
+ <text name="height_text_lbl4">
+ 4(高)
+ </text>
+ <text name="height_text_lbl5">
+ 地形ã®éš†èµ·ç¯„囲
+ </text>
+ <text name="height_text_lbl10">
+ 数値ã¯ä¸Šã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã®ãƒ–レンド範囲を示ã—ã¾ã™ã€‚
+ </text>
+ <text name="height_text_lbl11">
+ 計測å˜ä½ã¯ãƒ¡ãƒ¼ãƒˆãƒ«ã§ã€ã€Œä½Žã€ã®å€¤ã¯ã€1番ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã®é«˜ã•ã®ã€Œæœ€å¤§å€¤ã€ã§ã™ã€‚「高ã€ã®å€¤ã¯ã€4番ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã®é«˜ã•ã®ã€Œæœ€ä½Žå€¤ã€ã§ã™ã€‚
+ </text>
+ <text name="height_text_lbl6">
+ 北西
+ </text>
+ <text name="height_text_lbl7">
+ 北æ±
+ </text>
+ <spinner label="低" name="height_start_spin_1"/>
+ <spinner label="低" name="height_start_spin_3"/>
+ <spinner label="高" name="height_range_spin_1"/>
+ <spinner label="高" name="height_range_spin_3"/>
+ <text name="height_text_lbl8">
+ å—西
+ </text>
+ <text name="height_text_lbl9">
+ å—æ±
+ </text>
+ <spinner label="低" name="height_start_spin_0"/>
+ <spinner label="低" name="height_start_spin_2"/>
+ <spinner label="高" name="height_range_spin_0"/>
+ <spinner label="高" name="height_range_spin_2"/>
+ <button label="RAW 地形ダウンロード..." name="download_raw_btn" tool_tip="ä¸å‹•ç”£ã‚ªãƒ¼ãƒŠãƒ¼ã®ã¿åˆ©ç”¨å¯èƒ½ã€ç®¡ç†è€…ã¯åˆ©ç”¨ä¸å¯ã§ã™"/>
+ <button label="RAW 地形アップロード..." name="upload_raw_btn" tool_tip="ä¸å‹•ç”£ã‚ªãƒ¼ãƒŠãƒ¼ã®ã¿åˆ©ç”¨å¯èƒ½ã€ç®¡ç†è€…ã¯åˆ©ç”¨ä¸å¯ã§ã™"/>
+ <button label="地形ã®æ§‹ç¯‰" name="bake_terrain_btn" tool_tip="ç¾åœ¨ã®åœ°å½¢ã‚’上昇・下é™ç¯„囲ã®ä¸­é–“点ã¨ã—ã¦è¨­å®šã—ã¾ã™"/>
+ <button label="é©ç”¨" name="apply_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_script_ed.xml b/indra/newview/skins/default/xui/ja/panel_script_ed.xml
index a7305fa763..14d55002a3 100644
--- a/indra/newview/skins/default/xui/ja/panel_script_ed.xml
+++ b/indra/newview/skins/default/xui/ja/panel_script_ed.xml
@@ -15,15 +15,15 @@
<panel.string name="Title">
スクリプト: [NAME]
</panel.string>
- <text_editor name="Script Editor">
- ローディング...
- </text_editor>
- <button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save_btn"/>
- <combo_box label="挿入..." name="Insert..."/>
+ <panel.string name="external_editor_not_set">
+ 環境変数 LL_SCRIPT_EDITOR ã¾ãŸã¯ ExternalEditor を設定ã—ã¦ã‚¨ãƒ‡ã‚£ã‚¿ãƒ¼ã‚’é¸æŠžã—ã¾ã™ã€‚
+ </panel.string>
<menu_bar name="script_menu">
<menu label="ファイル" name="File">
<menu_item_call label="ä¿å­˜" name="Save"/>
<menu_item_call label="変更を元ã«æˆ»ã™" name="Revert All Changes"/>
+ <menu_item_call label="ファイルã‹ã‚‰ãƒ­ãƒ¼ãƒ‰..." name="LoadFromFile"/>
+ <menu_item_call label="ファイルã«ä¿å­˜..." name="SaveToFile"/>
</menu>
<menu label="編集" name="Edit">
<menu_item_call label="å…ƒã«æˆ»ã™" name="Undo"/>
@@ -40,4 +40,10 @@
<menu_item_call label="キーワードヘルプ..." name="Keyword Help..."/>
</menu>
</menu_bar>
+ <text_editor name="Script Editor">
+ ローディング...
+ </text_editor>
+ <combo_box label="挿入..." name="Insert..."/>
+ <button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save_btn"/>
+ <button label="編集..." name="Edit_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_scrolling_param_base.xml b/indra/newview/skins/default/xui/ja/panel_scrolling_param_base.xml
new file mode 100644
index 0000000000..fa659040ea
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_scrolling_param_base.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="LLScrollingPanelParamBase">
+ <slider label="[DESC]" name="param slider"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/ja/panel_snapshot_inventory.xml
new file mode 100644
index 0000000000..e496e6602b
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_snapshot_inventory.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_inventory">
+ <text name="title">
+ インベントリã«ä¿å­˜
+ </text>
+ <text name="hint_lbl">
+ ç”»åƒã‚’インベントリã«ä¿å­˜ã™ã‚‹ã«ã¯ L$[UPLOAD_COST] ã®è²»ç”¨ãŒã‹ã‹ã‚Šã¾ã™ã€‚ç”»åƒã‚’テクスãƒãƒ£ã¨ã—ã¦ä¿å­˜ã™ã‚‹ã«ã¯å¹³æ–¹å½¢å¼ã® 1 ã¤ã‚’é¸æŠžã—ã¦ãã ã•ã„。
+ </text>
+ <combo_box label="解åƒåº¦" name="texture_size_combo">
+ <combo_box.item label="ç¾åœ¨ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" name="CurrentWindow"/>
+ <combo_box.item label="å°ï¼ˆ128x128)" name="Small(128x128)"/>
+ <combo_box.item label="中(256x256)" name="Medium(256x256)"/>
+ <combo_box.item label="大(512x512)" name="Large(512x512)"/>
+ <combo_box.item label="カスタム" name="Custom"/>
+ </combo_box>
+ <spinner label="å¹…" name="inventory_snapshot_width"/>
+ <spinner label="高ã•" name="inventory_snapshot_height"/>
+ <check_box label="縦横比ã®å›ºå®š" name="inventory_keep_aspect_check"/>
+ <button label="å–り消ã—" name="cancel_btn"/>
+ <button label="ä¿å­˜" name="save_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_snapshot_local.xml b/indra/newview/skins/default/xui/ja/panel_snapshot_local.xml
new file mode 100644
index 0000000000..cb658fb6c9
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_snapshot_local.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_local">
+ <text name="title">
+ コンピューターã«ä¿å­˜
+ </text>
+ <combo_box label="解åƒåº¦" name="local_size_combo">
+ <combo_box.item label="ç¾åœ¨ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" name="CurrentWindow"/>
+ <combo_box.item label="320x240" name="320x240"/>
+ <combo_box.item label="640x480" name="640x480"/>
+ <combo_box.item label="800x600" name="800x600"/>
+ <combo_box.item label="1024x768" name="1024x768"/>
+ <combo_box.item label="1280x1024" name="1280x1024"/>
+ <combo_box.item label="1600x1200" name="1600x1200"/>
+ <combo_box.item label="カスタム" name="Custom"/>
+ </combo_box>
+ <layout_stack name="local_image_params_ls">
+ <layout_panel name="local_image_size_lp">
+ <spinner label="å¹…" name="local_snapshot_width"/>
+ <spinner label="高ã•" name="local_snapshot_height"/>
+ <check_box label="縦横比ã®å›ºå®š" name="local_keep_aspect_check"/>
+ </layout_panel>
+ <layout_panel name="local_image_format_quality_lp">
+ <combo_box label="書å¼" name="local_format_combo">
+ <combo_box.item label="PNG(å¯é€†åœ§ç¸®ï¼‰" name="PNG"/>
+ <combo_box.item label="JPEG" name="JPEG"/>
+ <combo_box.item label="BMP(å¯é€†åœ§ç¸®ï¼‰" name="BMP"/>
+ </combo_box>
+ <slider label="画質" name="image_quality_slider"/>
+ <text name="image_quality_level">
+ ([QLVL])
+ </text>
+ </layout_panel>
+ </layout_stack>
+ <button label="å–り消ã—" name="cancel_btn"/>
+ <flyout_button label="ä¿å­˜" name="save_btn" tool_tip="ç”»åƒã‚’ファイルã«ä¿å­˜">
+ <flyout_button.item label="ä¿å­˜" name="save_item"/>
+ <flyout_button.item label="別åã§ä¿å­˜..." name="saveas_item"/>
+ </flyout_button>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_snapshot_options.xml b/indra/newview/skins/default/xui/ja/panel_snapshot_options.xml
new file mode 100644
index 0000000000..c3b1cd91e7
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_snapshot_options.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_options">
+ <button label="プロフィールフィードã«æŠ•ç¨¿ã™ã‚‹" name="save_to_profile_btn"/>
+ <button label="メール" name="save_to_email_btn"/>
+ <button label="インベントリã«ä¿å­˜ï¼ˆL$[Amount])" name="save_to_inventory_btn"/>
+ <button label="コンピューターã«ä¿å­˜" name="save_to_computer_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_snapshot_postcard.xml b/indra/newview/skins/default/xui/ja/panel_snapshot_postcard.xml
new file mode 100644
index 0000000000..1ddd723840
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_snapshot_postcard.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_postcard">
+ <string name="default_subject">
+ [SECOND_LIFE] ã‹ã‚‰ã®ãƒã‚¹ãƒˆã‚«ãƒ¼ãƒ‰ã§ã™ã€‚
+ </string>
+ <string name="default_message">
+ ãœã²ã”覧ãã ã•ã„ï¼
+ </string>
+ <string name="upload_message">
+ é€ä¿¡ä¸­...
+ </string>
+ <text name="title">
+ メール
+ </text>
+ <button label="メッセージ" name="message_btn"/>
+ <button label="設定" name="settings_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_snapshot_profile.xml b/indra/newview/skins/default/xui/ja/panel_snapshot_profile.xml
new file mode 100644
index 0000000000..b860a6afe9
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_snapshot_profile.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_profile">
+ <text name="title">
+ プロフィールフィードã«æŠ•ç¨¿ã™ã‚‹
+ </text>
+ <combo_box label="解åƒåº¦" name="profile_size_combo">
+ <combo_box.item label="ç¾åœ¨ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" name="CurrentWindow"/>
+ <combo_box.item label="640x480" name="640x480"/>
+ <combo_box.item label="800x600" name="800x600"/>
+ <combo_box.item label="1024x768" name="1024x768"/>
+ <combo_box.item label="カスタム" name="Custom"/>
+ </combo_box>
+ <layout_stack name="profile_image_params_ls">
+ <layout_panel name="profile_image_size_lp">
+ <spinner label="å¹…" name="profile_snapshot_width"/>
+ <spinner label="高ã•" name="profile_snapshot_height"/>
+ <check_box label="縦横比ã®å›ºå®š" name="profile_keep_aspect_check"/>
+ </layout_panel>
+ <layout_panel name="profile_image_metadata_lp">
+ <text name="caption_label">
+ キャプション:
+ </text>
+ <check_box initial_value="true" label="場所をå«ã‚€" name="add_location_cb"/>
+ </layout_panel>
+ </layout_stack>
+ <button label="å–り消ã—" name="cancel_btn"/>
+ <button label="投稿" name="post_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_sound_devices.xml b/indra/newview/skins/default/xui/ja/panel_sound_devices.xml
new file mode 100644
index 0000000000..0824504235
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_sound_devices.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<panel label="機器ã®è¨­å®š" name="device_settings_panel">
+ <panel.string name="default_text">
+ デフォルト
+ </panel.string>
+ <string name="name_no_device">
+ 機器ãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“
+ </string>
+ <string name="name_default_system_device">
+ デフォルトã®ã‚·ã‚¹ãƒ†ãƒ æ©Ÿå™¨
+ </string>
+ <text name="Input">
+ 入力
+ </text>
+ <text name="Output">
+ 出力
+ </text>
+ <text name="My volume label">
+ ç§ã®éŸ³é‡ï¼š
+ </text>
+ <slider_bar initial_value="1.0" name="mic_volume_slider" tool_tip="スライダーを使ã£ã¦éŸ³é‡ã‚’調節ã—ã¾ã™"/>
+ <text name="wait_text">
+ ã—ã°ã‚‰ããŠå¾…ã¡ãã ã•ã„。
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_status_bar.xml b/indra/newview/skins/default/xui/ja/panel_status_bar.xml
index c3a5127981..f09643d562 100644
--- a/indra/newview/skins/default/xui/ja/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/ja/panel_status_bar.xml
@@ -1,11 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="status">
- <panel.string name="StatBarDaysOfWeek">
- 日曜日:月曜日:ç«æ›œæ—¥:水曜日:木曜日:金曜日:土曜日
- </panel.string>
- <panel.string name="StatBarMonthsOfYear">
- 1月:2月:3月:4月:5月:6月:7月:8月:9月:10月:11月:12月
- </panel.string>
<panel.string name="packet_loss_tooltip">
パケットæ失
</panel.string>
@@ -21,9 +15,10 @@
<panel.string name="buycurrencylabel">
L$ [AMT]
</panel.string>
- <panel name="balance_bg">
- <text name="balance" tool_tip="残高" value="L$20"/>
+ <panel left="-370" name="balance_bg" width="160">
+ <text name="balance" tool_tip="クリックã—㦠L$ 残高を更新" value="L$20"/>
<button label="L$ ã®è³¼å…¥" name="buyL" tool_tip="クリックã—㦠L$ を購入ã—ã¾ã™"/>
+ <button label="店" name="goShop" tool_tip="Second Life マーケットプレイスを開ã" width="40"/>
</panel>
<text name="TimeText" tool_tip="ç¾åœ¨æ™‚刻(太平洋)">
24:00 AM PST
diff --git a/indra/newview/skins/default/xui/ja/role_actions.xml b/indra/newview/skins/default/xui/ja/role_actions.xml
index 0a63cedf10..896ed556ae 100644
--- a/indra/newview/skins/default/xui/ja/role_actions.xml
+++ b/indra/newview/skins/default/xui/ja/role_actions.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<role_actions>
<action_set description="ã“れらã®èƒ½åŠ›ã«ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—メンãƒãƒ¼ã‚’追加ã€æŽ’除ã—ã€æ‹›å¾…状ãªã—ã«æ–°ãƒ¡ãƒ³ãƒãƒ¼ã®å‚加をèªã‚る権é™ãŒå«ã¾ã‚Œã¾ã™ã€‚" name="Membership">
<action description="ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«äººã‚’招待" longdescription="「役割ã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã®ã€Œãƒ¡ãƒ³ãƒãƒ¼ã€ã‚¿ãƒ–内ã«ã‚る「招待ã€ãƒœã‚¿ãƒ³ã‚’押ã—ã¦ã€ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«ãƒ¡ãƒ³ãƒãƒ¼ã‚’招待ã—ã¾ã™ã€‚" name="member invite" value="1"/>
@@ -39,6 +39,7 @@
<action description="常ã«ã€Œã‚ªãƒ–ジェクト作æˆã€ã‚’許å¯" longdescription="ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—所有ã®åŒºç”»ä¸Šã«ã‚ªãƒ–ジェクトを作æˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ãã®åŒºç”»ãŒã€ŒåœŸåœ°æƒ…å ±ã€ï¼žã€Œã‚ªãƒ—ションã€ã‚¿ãƒ–ã§ã‚ªãƒ•ã«ãªã£ã¦ã„ã¦ã‚‚ã€ã‚ªãƒ–ジェクトã®ä½œæˆãŒå¯èƒ½ã§ã™ã€‚" name="land allow create" value="25"/>
<action description="常ã«ã€Œãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã‚’作æˆã€ã‚’許å¯" longdescription="ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—所有ã®åŒºç”»ä¸Šã«ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã‚’作æˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ãã®åŒºç”»ãŒã€ŒåœŸåœ°æƒ…å ±ã€ï¼žã€Œã‚ªãƒ—ションã€ã‚¿ãƒ–ã§ã‚ªãƒ•ã«ãªã£ã¦ã„ã¦ã‚‚ã€ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã®ä½œæˆãŒå¯èƒ½ã§ã™ã€‚" name="land allow landmark" value="26"/>
<action description="グループã®åœŸåœ°ã¸ã®ã€Œãƒ›ãƒ¼ãƒ è¨­å®šã€ã‚’許å¯" longdescription="ã“ã®ã€Œå½¹å‰²ã€ã‚’æŒã¤ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«è­²æ¸¡ã•ã‚ŒãŸåŒºç”»ä¸Šã§ã€Œä¸–ç•Œã€ãƒ¡ãƒ‹ãƒ¥ãƒ¼ &gt; ランドマーク &gt; ç¾åœ¨åœ°ã‚’ホームã«è¨­å®š を使用ã—ã¦ã€ãƒ›ãƒ¼ãƒ ã®è¨­å®šã‚’è¡Œã†ã“ã¨ãŒã§ãã¾ã™ã€‚" name="land allow set home" value="28"/>
+ <action description="グループ所有地ã§ã®ã€Œã‚¤ãƒ™ãƒ³ãƒˆä¸»å‚¬ã€ã‚’許å¯" longdescription="ã“ã®ã€Œèƒ½åŠ›ã€ã‚’æŒã¤ã€Œå½¹å‰²ã€ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—所有区画を利用ã—ã¦ã‚¤ãƒ™ãƒ³ãƒˆã‚’開催ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" name="land allow host event" value="41"/>
</action_set>
<action_set description="ã“れらã®èƒ½åŠ›ã«ã¯ã€ä½äººã®å‡çµã‚„追放をå«ã‚€ã€ã‚°ãƒ«ãƒ¼ãƒ—所有ã®åŒºç”»ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ã€åˆ¶é™ã™ã‚‹æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚" name="Parcel Access">
<action description="区画アクセスリストã®ç®¡ç†" longdescription="区画アクセス・リストã®ç®¡ç†ã¯ã€ã€ŒåœŸåœ°æƒ…å ±ã€ï¼žã€Œã‚¢ã‚¯ã‚»ã‚¹ã€ã‚¿ãƒ–ã§è¡Œã„ã¾ã™ã€‚" name="land manage allowed" value="29"/>
@@ -50,27 +51,23 @@
<action description="グループ所有オブジェクトã®è¿”å´" longdescription="グループ所有ã®åŒºç”»ä¸Šã®ã‚ªãƒ–ジェクトã®ã†ã¡ã€ã‚°ãƒ«ãƒ¼ãƒ—所有ã®ã‚ªãƒ–ジェクトを返å´ã™ã‚‹ã«ã¯ã€ã€ŒåœŸåœ°æƒ…å ±ã€ï¼žã€Œã‚ªãƒ–ジェクトã€ã‚¿ãƒ–を使ã„ã¾ã™ã€‚" name="land return group owned" value="48"/>
<action description="グループã«è¨­å®šã•ã‚Œã¦ã„るオブジェクトを返å´" longdescription="グループ所有ã®åŒºç”»ä¸Šã®ã‚ªãƒ–ジェクトã®ã†ã¡ã€ã‚°ãƒ«ãƒ¼ãƒ—ã«è¨­å®šã•ã‚Œã¦ã„るオブジェクトを返å´ã™ã‚‹ã«ã¯ã€ã€ŒåœŸåœ°æƒ…å ±ã€ï¼žã€Œã‚ªãƒ–ジェクトã€ã‚¿ãƒ–を使ã„ã¾ã™ã€‚" name="land return group set" value="33"/>
<action description="éžã‚°ãƒ«ãƒ¼ãƒ—オブジェクトã®è¿”å´" longdescription="グループ所有ã®åŒºç”»ä¸Šã®ã‚ªãƒ–ジェクトã®ã†ã¡ã€ã‚°ãƒ«ãƒ¼ãƒ—以外ã®ã‚ªãƒ–ジェクトを返å´ã™ã‚‹ã«ã¯ã€ã€ŒåœŸåœ°æƒ…å ±ã€ï¼žã€Œã‚ªãƒ–ジェクトã€ã‚¿ãƒ–を使ã„ã¾ã™ã€‚" name="land return non group" value="34"/>
- <action description="リンデン製ã®æ¤ç‰©ã‚’使用ã—ã¦æ™¯è¦³ä½œæˆ" longdescription="リンデン製ã®æ¨¹æœ¨ã€æ¤ç‰©ã€è‰ã‚’æ¤ãˆã‚‹ã€æ™¯è¦³ã¥ãã‚Šã®èƒ½åŠ›ã§ã™ã€‚ ã“れらã®æ¤ç‰©ã¯ã‚ãªãŸã®æŒã¡ç‰©å†…ã®ã€Œãƒ©ã‚¤ãƒ–ラリ〠&gt; 「オブジェクトã€ãƒ•ã‚©ãƒ«ãƒ€ã«ã‚ã‚Šã¾ã™ã€‚「制作ã€ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã§ä½œæˆã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚" name="land gardening" value="35"/>
+ <action description="リンデン製ã®æ¤ç‰©ã‚’使用ã—ã¦æ™¯è¦³ä½œæˆ" longdescription="リンデン製ã®æ¨¹æœ¨ã€æ¤ç‰©ã€è‰ã‚’æ¤ãˆã‚‹ã€æ™¯è¦³ã¥ãã‚Šã®èƒ½åŠ›ã§ã™ã€‚ ã“れらã®æ¤ç‰©ã¯ã‚ãªãŸã®ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªå†…ã®ã€Œãƒ©ã‚¤ãƒ–ラリ〠&gt; 「オブジェクトã€ãƒ•ã‚©ãƒ«ãƒ€ã«ã‚ã‚Šã¾ã™ã€‚「制作ã€ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã§ä½œæˆã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚" name="land gardening" value="35"/>
</action_set>
<action_set description="ã“れらã®ã€Œèƒ½åŠ›ã€ã«ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—所有ã®ã‚ªãƒ–ジェクトを譲渡ã€ä¿®æ­£ã€è²©å£²ã™ã‚‹æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚ 変更ã¯ã€Œåˆ¶ä½œãƒ„ール〠&gt; 「一般ã€ã‚¿ãƒ–ã§è¡Œã„ã¾ã™ã€‚ オブジェクトをå³ã‚¯ãƒªãƒƒã‚¯ã—ã¦ã€Œç·¨é›†ã€ã‚’é–‹ãã¨è¨­å®šå†…容を確èªã§ãã¾ã™ã€‚" name="Object Management">
<action description="グループã«ã‚ªãƒ–ジェクトを譲渡" longdescription="「制作ツール〠&gt; 「一般ã€ã‚¿ãƒ–ã§ã€ã‚ªãƒ–ジェクトをグループã«è­²æ¸¡ã—ã¾ã™ã€‚" name="object deed" value="36"/>
<action description="グループ所有オブジェクトã®æ“作(移動ã€ã‚³ãƒ”ーã€ä¿®æ­£ï¼‰" longdescription="「制作ツール〠&gt; 「一般ã€ã‚¿ãƒ–ã§ã€ã‚°ãƒ«ãƒ¼ãƒ—所有ã®ã‚ªãƒ–ジェクトをæ“作(移動ã€ã‚³ãƒ”ーã€ä¿®æ­£ï¼‰ã—ã¾ã™ã€‚" name="object manipulate" value="38"/>
<action description="グループ所有オブジェクトを販売å¯èƒ½ã«è¨­å®š" longdescription="「制作ツール〠&gt; 「一般ã€ã‚¿ãƒ–ã§ã€ã‚°ãƒ«ãƒ¼ãƒ—所有ã®ã‚ªãƒ–ジェクトを販売対象ã«è¨­å®šã—ã¾ã™ã€‚" name="object set sale" value="39"/>
</action_set>
- <action_set description="ã“れらã®èƒ½åŠ›ã«ã¯ã€ãƒ¡ãƒ³ãƒãƒ¼ã«ã€ã‚°ãƒ«ãƒ¼ãƒ—ã®è² å‚µã®æ”¯æ‰•ã„ã¨åˆ©å­å—ã‘å–ã‚Šã‚’è¦æ±‚ã™ã‚‹æ¨©é™ã€ã‚°ãƒ«ãƒ¼ãƒ—å£åº§å±¥æ­´ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’制é™ã™ã‚‹æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚" name="Accounting"><action description="グループ負債ã®è¿”済ã¨ã‚°ãƒ«ãƒ¼ãƒ—é…当ã®å—é ˜" longdescription="ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã«ã¤ã„ã¦ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—負債ã®æ”¯æ‰•ã„ã¨ã‚°ãƒ«ãƒ¼ãƒ—é…当ã®å—ã‘å–ã‚ŠãŒè‡ªå‹•çš„ã«è¡Œã‚ã‚Œã¾ã™ã€‚
- ã¤ã¾ã‚Šã€ã“れらã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€æ¯Žæ—¥é…当ã•ã‚Œã‚‹ã‚°ãƒ«ãƒ¼ãƒ—所有地ã®å£²ã‚Šä¸Šã’金ã®ä¸€éƒ¨ã‚’å—ã‘å–ã‚‹ã¨å…±ã«ã€åŒºç”»ã®åºƒå‘Šè²»ãªã©ã‚’è² æ‹…ã™ã‚‹ã“ã¨ã«ãªã‚Šã¾ã™ã€‚" name="accounting accountable" value="40"/>
+ <action_set description="ã“れらã®èƒ½åŠ›ã«ã¯ã€ãƒ¡ãƒ³ãƒãƒ¼ã«ã€ã‚°ãƒ«ãƒ¼ãƒ—ã®è² å‚µã®æ”¯æ‰•ã„ã¨åˆ©å­å—ã‘å–ã‚Šã‚’è¦æ±‚ã™ã‚‹æ¨©é™ã€ã‚°ãƒ«ãƒ¼ãƒ—å£åº§å±¥æ­´ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’制é™ã™ã‚‹æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚" name="Accounting">
+ <action description="グループ負債ã®è¿”済ã¨ã‚°ãƒ«ãƒ¼ãƒ—é…当ã®å—é ˜" longdescription="ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã«ã¤ã„ã¦ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—負債ã®æ”¯æ‰•ã„ã¨ã‚°ãƒ«ãƒ¼ãƒ—é…当ã®å—ã‘å–ã‚ŠãŒè‡ªå‹•çš„ã«è¡Œã‚ã‚Œã¾ã™ã€‚ ã¤ã¾ã‚Šã€ã“れらã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€æ¯Žæ—¥é…当ã•ã‚Œã‚‹ã‚°ãƒ«ãƒ¼ãƒ—所有地ã®å£²ã‚Šä¸Šã’金ã®ä¸€éƒ¨ã‚’å—ã‘å–ã‚‹ã¨å…±ã«ã€åŒºç”»ã®åºƒå‘Šè²»ãªã©ã‚’è² æ‹…ã™ã‚‹ã“ã¨ã«ãªã‚Šã¾ã™ã€‚" name="accounting accountable" value="40"/>
</action_set>
<action_set description="ã“れらã®èƒ½åŠ›ã«ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—通知ã®é€ä¿¡ã€å—ä¿¡ã€è¡¨ç¤ºã‚’メンãƒãƒ¼ã«è¨±å¯ã™ã‚‹æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚" name="Notices">
<action description="通知をé€ä¿¡" longdescription="ã“ã®ã€Œèƒ½åŠ›ã€ã‚’æŒã¤ã€Œå½¹å‰²ã€ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã€Œã‚°ãƒ«ãƒ¼ãƒ—〠&gt; 「通知ã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã‹ã‚‰é€šçŸ¥ã‚’é€ä¿¡ã§ãã¾ã™ã€‚" name="notices send" value="42"/>
<action description="通知ã®å—ä¿¡ã¨éŽåŽ»ã®é€šçŸ¥ã®é–²è¦§" longdescription="ã“ã®ã€Œèƒ½åŠ›ã€ã‚’æŒã¤ã€Œå½¹å‰²ã€ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã€Œã‚°ãƒ«ãƒ¼ãƒ—〠&gt; 「通知ã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã§é€šçŸ¥ã‚’å—ä¿¡ã—ãŸã‚ŠéŽåŽ»ã®é€šçŸ¥ã‚’見るã“ã¨ãŒã§ãã¾ã™ã€‚" name="notices receive" value="43"/>
</action_set>
- <action_set description="ã“れらã®èƒ½åŠ›ã«ã¯ã€æ案ã®ä½œæˆã¨æŠ•ç¥¨ã€æŠ•ç¥¨å±¥æ­´ã®è¡¨ç¤ºã‚’メンãƒãƒ¼ã«è¨±å¯ã™ã‚‹æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚" name="Proposals">
- <action description="æ案を作æˆ" longdescription="ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€æŠ•ç¥¨ã®å¯¾è±¡ã¨ãªã‚‹å•é¡Œæ起を「グループ情報ã€ï¼žã€Œå•é¡Œæèµ·ã€ã‚¿ãƒ–上ã§ä½œæˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" name="proposal start" value="44"/>
- <action description="å•é¡Œæèµ·ã«æŠ•ç¥¨ã™ã‚‹" longdescription="ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—情報>æ案タブã§æ案ã«æŠ•ç¥¨ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" name="proposal vote" value="45"/>
- </action_set>
<action_set description=" ã“れらã®èƒ½åŠ›ã«ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—ãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚„グループボイスãƒãƒ£ãƒƒãƒˆã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã®è¨±å¯ã‚„制é™ã®æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚ " name="Chat">
- <action description="グループãƒãƒ£ãƒƒãƒˆã«å‚加ã™ã‚‹" longdescription=" ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—ãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ãƒ†ã‚­ã‚¹ãƒˆãŠã‚ˆã³ãƒœã‚¤ã‚¹ã§å‚加ã§ãã¾ã™ã€‚ " name="join group chat"/>
- <action description="グループボイスãƒãƒ£ãƒƒãƒˆã«å‚加ã™ã‚‹" longdescription=" ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—ボイスãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã«å‚加ã§ãã¾ã™ã€‚ 注: ボイスãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã«ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—ãƒãƒ£ãƒƒãƒˆã«å‚加ã™ã‚‹èƒ½åŠ›ãŒå¿…è¦ã§ã™ã€‚ " name="join voice chat"/>
- <action description="グループãƒãƒ£ãƒƒãƒˆã‚’管ç†ã™ã‚‹" longdescription=" ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—ボイスãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ãŠã‚ˆã³ã‚°ãƒ«ãƒ¼ãƒ—テキストãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚„å‚加をコントロールã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ " name="moderate group chat"/>
+ <action description="グループãƒãƒ£ãƒƒãƒˆã«å‚加ã™ã‚‹" longdescription=" ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—ãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ãƒ†ã‚­ã‚¹ãƒˆãŠã‚ˆã³ãƒœã‚¤ã‚¹ã§å‚加ã§ãã¾ã™ã€‚ " name="join group chat" value="16"/>
+ <action description="グループボイスãƒãƒ£ãƒƒãƒˆã«å‚加ã™ã‚‹" longdescription=" ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—ボイスãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã«å‚加ã§ãã¾ã™ã€‚ 注: ボイスãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã«ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—ãƒãƒ£ãƒƒãƒˆã«å‚加ã™ã‚‹èƒ½åŠ›ãŒå¿…è¦ã§ã™ã€‚ " name="join voice chat" value="27"/>
+ <action description="グループãƒãƒ£ãƒƒãƒˆã‚’管ç†ã™ã‚‹" longdescription=" ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—ボイスãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ãŠã‚ˆã³ã‚°ãƒ«ãƒ¼ãƒ—テキストãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚„å‚加をコントロールã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ " name="moderate group chat" value="37"/>
</action_set>
</role_actions>
diff --git a/indra/newview/skins/default/xui/ja/sidepanel_inventory.xml b/indra/newview/skins/default/xui/ja/sidepanel_inventory.xml
index e26d8717d1..51d6d48f90 100644
--- a/indra/newview/skins/default/xui/ja/sidepanel_inventory.xml
+++ b/indra/newview/skins/default/xui/ja/sidepanel_inventory.xml
@@ -1,13 +1,34 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="ã‚‚ã®" name="objects panel">
<panel label="" name="sidepanel__inventory_panel">
+ <layout_stack name="inventory_layout_stack">
+ <layout_panel name="inbox_layout_panel">
+ <panel label="" name="marketplace_inbox">
+ <string name="InboxLabelWithArg">
+ å—ã‘å–ã£ãŸã‚¢ã‚¤ãƒ†ãƒ ï¼ˆ[NUM])
+ </string>
+ <string name="InboxLabelNoArg">
+ å—ã‘å–ã£ãŸã‚¢ã‚¤ãƒ†ãƒ 
+ </string>
+ <button label="å—ã‘å–ã£ãŸã‚¢ã‚¤ãƒ†ãƒ " name="inbox_btn"/>
+ <text name="inbox_fresh_new_count">
+ [NUM] 個ã®æ–°ã‚¢ã‚¤ãƒ†ãƒ 
+ </text>
+ <panel name="inbox_inventory_placeholder_panel" tool_tip="アイテムを使用ã™ã‚‹ã«ã¯ã€ãã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’インベントリã«ãƒ‰ãƒ©ãƒƒã‚°ã‚¢ãƒ³ãƒ‰ãƒ‰ãƒ­ãƒƒãƒ—">
+ <text name="inbox_inventory_placeholder">
+ マーケットプレイスã‹ã‚‰è³¼å…¥ã—ãŸå•†å“ã¯ã“ã“ã«é…é”ã•ã‚Œã¾ã™ã€‚
+ </text>
+ </panel>
+ </panel>
+ </layout_panel>
+ </layout_stack>
<panel name="button_panel">
<layout_stack name="button_panel_ls">
<layout_panel name="info_btn_lp">
<button label="プロフィール" name="info_btn" tool_tip="オブジェクトã®ãƒ—ロフィールを表示ã™ã‚‹"/>
</layout_panel>
<layout_panel name="share_btn_lp">
- <button label="共有" name="share_btn" tool_tip="「æŒã¡ç‰©ã€ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’共有ã™ã‚‹"/>
+ <button label="共有" name="share_btn" tool_tip="インベントリã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’共有ã™ã‚‹"/>
</layout_panel>
<layout_panel name="shop_btn_lp">
<button label="店" name="shop_btn" tool_tip="マーケットプレイスã®ã‚µã‚¤ãƒˆã‚’é–‹ã"/>
diff --git a/indra/newview/skins/default/xui/ja/sidepanel_item_info.xml b/indra/newview/skins/default/xui/ja/sidepanel_item_info.xml
index d820994b59..6931e448b3 100644
--- a/indra/newview/skins/default/xui/ja/sidepanel_item_info.xml
+++ b/indra/newview/skins/default/xui/ja/sidepanel_item_info.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="item properties" title="アイテムã®ãƒ—ロフィール">
<panel.string name="unknown">
(ä¸æ˜Žï¼‰
@@ -16,13 +16,13 @@
[year,datetime,local] [mth,datetime,local] [day,datetime,local] [wkday,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
</panel.string>
<panel.string name="origin_inventory">
- (æŒã¡ç‰©ï¼‰
+ (インベントリ)
</panel.string>
<panel.string name="origin_inworld">
(インワールド)
</panel.string>
<text name="title" value="アイテムã®ãƒ—ロフィール"/>
- <text name="origin" value="(æŒã¡ç‰©ï¼‰"/>
+ <text name="origin" value="(インベントリ)"/>
<scroll_container name="item_profile_scroll">
<panel label="" name="item_profile">
<text name="LabelItemNameTitle">
diff --git a/indra/newview/skins/default/xui/ja/sidepanel_task_info.xml b/indra/newview/skins/default/xui/ja/sidepanel_task_info.xml
index ff9b5dc6aa..eb2bfa993b 100644
--- a/indra/newview/skins/default/xui/ja/sidepanel_task_info.xml
+++ b/indra/newview/skins/default/xui/ja/sidepanel_task_info.xml
@@ -48,15 +48,9 @@
<text name="CreatorNameLabel">
制作者:
</text>
- <text name="Creator Name">
- Erica Linden
- </text>
<text name="Owner:">
所有者:
</text>
- <text name="Owner Name">
- Erica Linden
- </text>
<text name="Group_label">
グループ:
</text>
diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml
index 187f21257a..680ef60890 100644
--- a/indra/newview/skins/default/xui/ja/strings.xml
+++ b/indra/newview/skins/default/xui/ja/strings.xml
@@ -34,6 +34,9 @@
<string name="StartupInitializingVFS">
VFS ã‚’åˆæœŸåŒ–中ã§ã™...
</string>
+ <string name="StartupRequireDriverUpdate">
+ グラフィックをåˆæœŸåŒ–ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚グラフィックドライãƒã‚’æ›´æ–°ã—ã¦ãã ã•ã„。
+ </string>
<string name="ProgressRestoring">
復元中ã§ã™...
</string>
@@ -74,10 +77,10 @@
キャッシュファイルを検証ã—ã¦ã„ã¾ã™ï¼ˆæ‰€è¦æ™‚間㯠60 ~ 90 秒)...
</string>
<string name="LoginProcessingResponse">
- 応答を処ç†ã—ã¦ã„ã¾ã™...
+ 対応を処ç†ä¸­ã§ã™...
</string>
<string name="LoginInitializingWorld">
- ワールドをåˆæœŸåŒ–ã—ã¦ã„ã¾ã™...
+ ワールドをåˆæœŸåŒ–中ã§ã™...
</string>
<string name="LoginDecodingImages">
ç”»åƒã‚’デコードã—ã¦ã„ã¾ã™...
@@ -91,6 +94,12 @@
<string name="LoginQuicktimeOK">
QuickTime ãŒæ­£å¸¸ã«åˆæœŸåŒ–ã•ã‚Œã¾ã—ãŸã€‚
</string>
+ <string name="LoginRequestSeedCapGrant">
+ リージョンã®æ©Ÿèƒ½ã‚’リクエストã—ã¦ã„ã¾ã™...
+ </string>
+ <string name="LoginRetrySeedCapGrant">
+ リージョンã®æ©Ÿèƒ½ã‚’リクエストã€è©¦è¡Œ [NUMBER] 回....
+ </string>
<string name="LoginWaitingForRegionHandshake">
リージョンã®ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã‚’å¾…ã£ã¦ã„ã¾ã™...
</string>
@@ -119,7 +128,7 @@
グリッドサーãƒãƒ¼ãŒè¿”ã—ãŸè¨¼æ˜Žæ›¸ã®ç½²åã‚’èªè¨¼ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚グリッドã®ç®¡ç†è€…ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。
</string>
<string name="LoginFailedNoNetwork">
- ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¨ãƒ©ãƒ¼ï¼š 接続を確立ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ãŠä½¿ã„ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯æŽ¥ç¶šã‚’ã”確èªãã ã•ã„。
+ ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¨ãƒ©ãƒ¼ï¼šæŽ¥ç¶šã‚’確立ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ãŠä½¿ã„ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯æŽ¥ç¶šã‚’ã”確èªãã ã•ã„。
</string>
<string name="LoginFailed">
ログインã«å¤±æ•—ã—ã¾ã—ãŸã€‚
@@ -130,6 +139,139 @@
<string name="create_account_url">
http://join.secondlife.com/index.php?lang=ja-JP
</string>
+ <string name="LoginFailedViewerNotPermitted">
+ ãŠä½¿ã„ã®å¤ã„ビューワã§ã¯ Second Life ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã›ã‚“。以下ã®ãƒšãƒ¼ã‚¸ã‹ã‚‰æ–°ã—ã„ビューワをダウンロードã—ã¦ãã ã•ã„:
+http://secondlife.com/download
+
+詳細ã«ã¤ã„ã¦ã¯ã€FAQ ã‚’å‚ç…§ã—ã¦ãã ã•ã„:
+http://secondlife.com/viewer-access-faq
+ </string>
+ <string name="LoginIntermediateOptionalUpdateAvailable">
+ ビューワアップデート(オプション)ãŒã‚ã‚Šã¾ã™ï¼š [VERSION]
+ </string>
+ <string name="LoginFailedRequiredUpdate">
+ ビューワアップデート(必須): [VERSION]
+ </string>
+ <string name="LoginFailedAlreadyLoggedIn">
+ ã“ã®ã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆã¯æ—¢ã«ãƒ­ã‚°ã‚¤ãƒ³ã•ã‚Œã¦ã„ã¾ã™ã€‚
+ </string>
+ <string name="LoginFailedAuthenticationFailed">
+ 申ã—訳ã‚ã‚Šã¾ã›ã‚“ãŒã€ãƒ­ã‚°ã‚¤ãƒ³ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
+以下ã®æƒ…å ±ãŒæ­£ã—ã入力ã•ã‚ŒãŸã“ã¨ã‚’確èªã—ã¦ãã ã•ã„:
+* ユーザーå(bobsmith12 ã¾ãŸã¯ steller.sunshine ãªã©ï¼‰
+* パスワード
+ã¾ãŸã€Caps Lock キーãŒæœ‰åŠ¹ã«ãªã£ã¦ã„ãªã„ã“ã¨ã‚‚ãŠç¢ºã‹ã‚ãã ã•ã„。
+ </string>
+ <string name="LoginFailedPasswordChanged">
+ セキュリティ上ã®ç†ç”±ã«ã‚ˆã‚Šã€ã‚ãªãŸã®ãƒ‘スワードã¯å¤‰æ›´ã•ã‚Œã¾ã—ãŸã€‚
+アカウントページ(http://secondlife.com/password)ã«ç§»å‹•ã—ã€
+秘密ã®è³ªå•ã«ç­”ãˆã¦ã€ãƒ‘スワードをリセットã—ã¦ãã ã•ã„。
+ã”迷惑をãŠã‹ã‘ã—ã¦ç”³ã—訳ã”ã–ã„ã¾ã›ã‚“。
+ </string>
+ <string name="LoginFailedPasswordReset">
+ 弊社ã¯ã‚·ã‚¹ãƒ†ãƒ ã‚’若干変更ã—ã¾ã—ãŸã€‚ãŠæ‰‹æ•°ã§ã™ãŒã€ãƒ‘スワードã®ãƒªã‚»ãƒƒãƒˆã‚’ãŠé¡˜ã„ã—ã¾ã™ã€‚
+アカウントページ(http://secondlife.com/password)ã«ç§»å‹•ã—ã€
+秘密ã®è³ªå•ã«ç­”ãˆã¦ã€ãƒ‘スワードをリセットã—ã¦ãã ã•ã„。
+ã”迷惑をãŠã‹ã‘ã—ã¦ç”³ã—訳ã”ã–ã„ã¾ã›ã‚“。
+ </string>
+ <string name="LoginFailedEmployeesOnly">
+ Second Life ã¯ãƒ¡ãƒ³ãƒ†ãƒŠãƒ³ã‚¹ã®ãŸã‚ã€ä¸€æ™‚çš„ã«ã”利用ã„ãŸã ã‘ã¾ã›ã‚“。
+従業員以外ã«ã¯ãƒ­ã‚°ã‚¤ãƒ³ã‚’ã”é æ…®ã„ãŸã ã„ã¦ã„ã¾ã™ã€‚
+最新ã®çŠ¶æ³ã«ã¤ã„ã¦ã¯ www.secondlife.com/status ã§ãŠç¢ºã‹ã‚ãã ã•ã„。
+ </string>
+ <string name="LoginFailedPremiumOnly">
+ æ—¢ã«ãƒ­ã‚°ã‚¤ãƒ³ã—ã¦ã„るユーザーã«æœ€ä¸Šã®ã‚¤ãƒ³ãƒ¯ãƒ¼ãƒ«ãƒ‰ä½“験をæä¾›ã™ã‚‹ãŸã‚ã€Second Life ã¸ã®ãƒ­ã‚°ã‚¤ãƒ³ã¯ä¸€æ™‚çš„ã«åˆ¶é™ã•ã‚Œã¦ã„ã¾ã™ã€‚
+
+申ã—訳ã”ã–ã„ã¾ã›ã‚“ãŒã€æœ‰æ–™ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’優先ã™ã‚‹ãŸã‚ã€ç¾åœ¨ã®ã¨ã“ã‚無料アカウントã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«ã¯ Second Life ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’ã”é æ…®ã„ãŸã ã„ã¦ã„ã¾ã™ã€‚
+ </string>
+ <string name="LoginFailedComputerProhibited">
+ ã“ã®ãƒ‘ソコンã‹ã‚‰ã¯ Second Life ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã›ã‚“。
+システムã®ã‚¨ãƒ©ãƒ¼ã ã¨æ€ã‚れる場åˆã¯ã€
+support@secondlife.com ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。
+ </string>
+ <string name="LoginFailedAcountSuspended">
+ ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã¯
+太平洋時間㮠[TIME] ã¾ã§ã”利用ã„ãŸã ã‘ã¾ã›ã‚“。
+ </string>
+ <string name="LoginFailedAccountDisabled">
+ ç¾åœ¨ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’完了ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。
+Second Life ã®ã‚µãƒãƒ¼ãƒˆï¼ˆhttp://secondlife.com/support)ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。
+パスワードを変更ã§ããªã„å ´åˆã«ã¯ã€(866) 476-9763 ã«é›»è©±ã§ãŠå•ã„åˆã‚ã›ãã ã•ã„。
+ </string>
+ <string name="LoginFailedTransformError">
+ ログイン時ã«ãƒ‡ãƒ¼ã‚¿ã®ä¸ä¸€è‡´ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸã€‚
+support@secondlife.com ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。
+ </string>
+ <string name="LoginFailedAccountMaintenance">
+ ç¾åœ¨ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®ãƒ¡ã‚¤ãƒ³ãƒ†ãƒŠãƒ³ã‚¹ãŒè¡Œã‚ã‚Œã¦ã„ã¾ã™ã€‚
+ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã¯
+太平洋時間㮠[TIME] ã¾ã§ã”利用ã„ãŸã ã‘ã¾ã›ã‚“。
+システムã®ã‚¨ãƒ©ãƒ¼ã ã¨æ€ã‚れる場åˆã¯ã€support@secondlife.com ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。
+ </string>
+ <string name="LoginFailedPendingLogoutFault">
+ ログアウトをリスクエストã—ãŸã‚‰ã€ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚¿ãƒ¼ã‹ã‚‰ã€Œfaultã€ãŒè¿”ã•ã‚Œã¾ã—ãŸã€‚
+ </string>
+ <string name="LoginFailedPendingLogout">
+ システムã«ã‚ˆã‚‹ãƒ­ã‚°ã‚¢ã‚¦ãƒˆãŒå®Ÿè¡Œã•ã‚Œã¾ã—ãŸã€‚
+ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã¯
+太平洋時間㮠[TIME] ã¾ã§ã”利用ã„ãŸã ã‘ã¾ã›ã‚“。
+ </string>
+ <string name="LoginFailedUnableToCreateSession">
+ 有効ãªã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’生æˆã§ãã¾ã›ã‚“。
+ </string>
+ <string name="LoginFailedUnableToConnectToSimulator">
+ シミュレーターã«æŽ¥ç¶šã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
+ </string>
+ <string name="LoginFailedRestrictedHours">
+ ã‚ãªãŸã® Second Life アカウントã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã‚‹ã®ã¯ã€
+太平洋時間㮠[START] ~ [END] ã®é–“ã«é™ã‚‰ã‚Œã¾ã™ã€‚
+有効ãªæ™‚間帯ã«å†åº¦ãŠè©¦ã—ãã ã•ã„。
+システムã®ã‚¨ãƒ©ãƒ¼ã ã¨æ€ã‚れる場åˆã¯ã€support@secondlife.com ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。
+ </string>
+ <string name="LoginFailedIncorrectParameters">
+ パラメーターãŒæ­£ã—ãã‚ã‚Šã¾ã›ã‚“。
+システムã®ã‚¨ãƒ©ãƒ¼ã ã¨æ€ã‚れる場åˆã¯ã€support@secondlife.com ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。
+ </string>
+ <string name="LoginFailedFirstNameNotAlphanumeric">
+ ファーストãƒãƒ¼ãƒ ã®ãƒ‘ラメーターã¯è‹±æ•°å­—ã§ã™ã€‚
+システムã®ã‚¨ãƒ©ãƒ¼ã ã¨æ€ã‚れる場åˆã¯ã€support@secondlife.com ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。
+ </string>
+ <string name="LoginFailedLastNameNotAlphanumeric">
+ ラストãƒãƒ¼ãƒ ã®ãƒ‘ラメーターã¯è‹±æ•°å­—ã§ã™ã€‚
+システムã®ã‚¨ãƒ©ãƒ¼ã ã¨æ€ã‚れる場åˆã¯ã€support@secondlife.com ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。
+ </string>
+ <string name="LogoutFailedRegionGoingOffline">
+ リージョンã¯ã‚ªãƒ•ãƒ©ã‚¤ãƒ³ä¸­ã§ã™ã€‚
+ã—ã°ã‚‰ãã—ã¦ã‹ã‚‰å†åº¦ãŠè©¦ã—ãã ã•ã„。
+ </string>
+ <string name="LogoutFailedAgentNotInRegion">
+ エージェントãŒãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«ä¸åœ¨ã§ã™ã€‚
+ã—ã°ã‚‰ãã—ã¦ã‹ã‚‰å†åº¦ãŠè©¦ã—ãã ã•ã„。
+ </string>
+ <string name="LogoutFailedPendingLogin">
+ ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯åˆ¥ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ãŒãƒ­ã‚°ã‚¤ãƒ³ã•ã‚Œã¦ã„ã¾ã—ãŸã€‚
+ã—ã°ã‚‰ãã—ã¦ã‹ã‚‰å†åº¦ãŠè©¦ã—ãã ã•ã„。
+ </string>
+ <string name="LogoutFailedLoggingOut">
+ ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯å‰ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ãŒãƒ­ã‚°ã‚¢ã‚¦ãƒˆã•ã‚Œã¾ã—ãŸã€‚
+ã—ã°ã‚‰ãã—ã¦ã‹ã‚‰å†åº¦ãŠè©¦ã—ãã ã•ã„。
+ </string>
+ <string name="LogoutFailedStillLoggingOut">
+ ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ç¾åœ¨ã‚‚å‰ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã®ãƒ­ã‚°ã‚¢ã‚¦ãƒˆãŒå‡¦ç†ã•ã‚Œã¦ã„ã¾ã™ã€‚
+ã—ã°ã‚‰ãã—ã¦ã‹ã‚‰å†åº¦ãŠè©¦ã—ãã ã•ã„。
+ </string>
+ <string name="LogoutSucceeded">
+ リージョンã§ã¯å‰ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ãŒãƒ­ã‚°ã‚¢ã‚¦ãƒˆã•ã‚Œã¾ã—ãŸã€‚
+ã—ã°ã‚‰ãã—ã¦ã‹ã‚‰å†åº¦ãŠè©¦ã—ãã ã•ã„。
+ </string>
+ <string name="LogoutFailedLogoutBegun">
+ リージョンã§ã¯ãƒ­ã‚°ã‚¢ã‚¦ãƒˆãƒ—ロセスãŒé–‹å§‹ã•ã‚Œã¾ã—ãŸã€‚
+ã—ã°ã‚‰ãã—ã¦ã‹ã‚‰å†åº¦ãŠè©¦ã—ãã ã•ã„。
+ </string>
+ <string name="LoginFailedLoggingOutSession">
+ ã‚ãªãŸã®å‰ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã¯ã‚·ã‚¹ãƒ†ãƒ ã«ã‚ˆã£ã¦ãƒ­ã‚°ã‚¢ã‚¦ãƒˆã•ã‚Œã¦ã„ã¾ã™ã€‚
+ã—ã°ã‚‰ãã—ã¦ã‹ã‚‰å†åº¦ãŠè©¦ã—ãã ã•ã„。
+ </string>
<string name="AgentLostConnection">
ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«ä¸éƒ½åˆãŒç™ºç”Ÿã—ã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ ã”使用ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆæŽ¥ç¶šã‚’ã”確èªãã ã•ã„。
</string>
@@ -197,6 +339,36 @@
アイテム㯠1 ã¤ã ã‘ã“ã“ã«ãƒ‰ãƒ©ãƒƒã‚°ã§ãã¾ã™
</string>
<string name="TooltipPrice" value="L$[AMOUNT]:"/>
+ <string name="TooltipOutboxDragToWorld">
+ マーãƒãƒ£ãƒ³ãƒˆãƒœãƒƒã‚¯ã‚¹å†…ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’ Rez ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“
+ </string>
+ <string name="TooltipOutboxNoTransfer">
+ ã“れらオブジェクト㮠1 ã¤ã¾ãŸã¯è¤‡æ•°ã¯å£²ã‚Šæ¸¡ã—ãŸã‚Šè­²æ¸¡ã—ãŸã‚Šã§ããªã„ã‚‚ã®ã§ã™ã€‚
+ </string>
+ <string name="TooltipOutboxNotInInventory">
+ マーãƒãƒ£ãƒ³ãƒˆã‚¢ã‚¦ãƒˆãƒœãƒƒã‚¯ã‚¹ã§ã¯ã€ã”自分ã®ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã‹ã‚‰ã®ã‚¢ã‚¤ãƒ†ãƒ ã—ã‹å—ã‘入れるã“ã¨ãŒã§ãã¾ã›ã‚“
+ </string>
+ <string name="TooltipOutboxWorn">
+ ç€ç”¨ã—ã¦ã„るアイテムをマーãƒãƒ£ãƒ³ãƒˆã‚¢ã‚¦ãƒˆãƒœãƒƒã‚¯ã‚¹ã«å…¥ã‚Œã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“
+ </string>
+ <string name="TooltipOutboxCallingCard">
+ コーリングカードをマーãƒãƒ£ãƒ³ãƒˆã‚¢ã‚¦ãƒˆãƒœãƒƒã‚¯ã‚¹ã«å…¥ã‚Œã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“
+ </string>
+ <string name="TooltipOutboxFolderLevels">
+ ãƒã‚¹ãƒˆå…¥ã‚Šãƒ•ã‚©ãƒ«ãƒ€ã®æ·±ã•ãŒ 3 を超ãˆã¦ã„ã¾ã™
+ </string>
+ <string name="TooltipOutboxTooManyFolders">
+ 最上ä½ãƒ•ã‚©ãƒ«ãƒ€å†…ã®ã‚µãƒ–フォルダ数㌠20 を超ãˆã¦ã„ã¾ã™
+ </string>
+ <string name="TooltipOutboxTooManyObjects">
+ 最上ä½ãƒ•ã‚©ãƒ«ãƒ€å†…ã®ã‚¢ã‚¤ãƒ†ãƒ æ•°ãŒ 200 を超ãˆã¦ã„ã¾ã™
+ </string>
+ <string name="TooltipDragOntoOwnChild">
+ フォルダをãã®å­ãƒ•ã‚©ãƒ«ãƒ€ã«ç§»å‹•ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“
+ </string>
+ <string name="TooltipDragOntoSelf">
+ フォルダをãã®ãƒ•ã‚©ãƒ«ãƒ€è‡ªèº«ã«ç§»å‹•ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“
+ </string>
<string name="TooltipHttpUrl">
クリックã—ã¦ã“ã® Web ページを見ã¾ã™
</string>
@@ -206,6 +378,9 @@
<string name="TooltipAgentUrl">
クリックã—ã¦ã“ã®ä½äººã®ãƒ—ロフィールを見ã¾ã™
</string>
+ <string name="TooltipAgentInspect">
+ ã“ã®ä½äººã®è©³ç´°ã‚’å‚ç…§
+ </string>
<string name="TooltipAgentMute">
クリックã—ã¦ã“ã®ä½äººã«å¯¾ã—ã¦ç„¡è¦–設定をã—ã¾ã™
</string>
@@ -438,6 +613,9 @@
<string name="symbolic folder link">
フォルダã®ãƒªãƒ³ã‚¯
</string>
+ <string name="mesh">
+ メッシュ
+ </string>
<string name="AvatarEditingAppearance">
(容姿ã®ç·¨é›†ä¸­ï¼‰
</string>
@@ -657,6 +835,9 @@
<string name="anim_yes_head">
é ·ã
</string>
+ <string name="multiple_textures">
+ 複数
+ </string>
<string name="texture_loading">
ローディング...
</string>
@@ -762,6 +943,12 @@
<string name="Estate / Full Region">
ä¸å‹•ç”£ / フルリージョン
</string>
+ <string name="Estate / Homestead">
+ エステート/ホームステッド
+ </string>
+ <string name="Mainland / Homestead">
+ メインランド/ホームステッド
+ </string>
<string name="Mainland / Full Region">
メインランド / フルリージョン
</string>
@@ -810,6 +997,9 @@
<string name="choose_the_directory">
å‚ç…§
</string>
+ <string name="script_files">
+ スクリプト
+ </string>
<string name="AvatarSetNotAway">
一時退席中解除
</string>
@@ -867,6 +1057,9 @@
<string name="tattoo">
タトゥ
</string>
+ <string name="physics">
+ 物ç†ä½œç”¨
+ </string>
<string name="invalid">
無効
</string>
@@ -906,6 +1099,9 @@
<string name="tattoo_not_worn">
タトゥー未ç€ç”¨
</string>
+ <string name="physics_not_worn">
+ 物ç†ä½œç”¨ãªã—
+ </string>
<string name="invalid_not_worn">
無効
</string>
@@ -954,6 +1150,9 @@
<string name="create_new_tattoo">
æ–°ã—ã„タトゥを作æˆ
</string>
+ <string name="create_new_physics">
+ æ–°ã—ã„物ç†ä½œç”¨ã‚’作æˆ
+ </string>
<string name="create_new_invalid">
無効
</string>
@@ -1036,7 +1235,66 @@
ã“ã“ã«ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã‚’ドラッグã—ã¦ãŠæ°—ã«å…¥ã‚Šã«è¿½åŠ ã—ã¾ã™ã€‚
</string>
<string name="InventoryNoTexture">
- 「æŒã¡ç‰©ã€å†…ã«ã“ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã®ã‚³ãƒ”ーãŒã‚ã‚Šã¾ã›ã‚“
+ インベントリ内ã«ã“ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã®ã‚³ãƒ”ーãŒã‚ã‚Šã¾ã›ã‚“
+ </string>
+ <string name="InventoryInboxNoItems">
+ マーケットプレイスã§è³¼å…¥ã—ãŸå•†å“ã¯ã“ã“ã«è¡¨ç¤ºã•ã‚Œã¾ã™ã€‚ãã®å¾Œã€ã‚¢ã‚¤ãƒ†ãƒ ã‚’インベントリã«ãƒ‰ãƒ©ãƒƒã‚°ã™ã‚Œã°ã€ãれらã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’使用ã§ãã¾ã™ã€‚
+ </string>
+ <string name="MarketplaceURL">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/
+ </string>
+ <string name="MarketplaceURL_CreateStore">
+ http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.4
+ </string>
+ <string name="MarketplaceURL_Dashboard">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard
+ </string>
+ <string name="MarketplaceURL_Imports">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports
+ </string>
+ <string name="MarketplaceURL_LearnMore">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more
+ </string>
+ <string name="InventoryOutboxNotMerchantTitle">
+ マーケットプレイスã§ã¯èª°ã§ã‚‚アイテムを売るã“ã¨ãŒã§ãã¾ã™ã€‚
+ </string>
+ <string name="InventoryOutboxNotMerchantTooltip"/>
+ <string name="InventoryOutboxNotMerchant">
+ マーãƒãƒ£ãƒ³ãƒˆã«ãªã‚ŠãŸã„æ–¹ã¯ã€[[MARKETPLACE_CREATE_STORE_URL] マーケットプレイスストアを作æˆ]ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚
+ </string>
+ <string name="InventoryOutboxNoItemsTitle">
+ アウトボックスã¯ç©ºã§ã™ã€‚
+ </string>
+ <string name="InventoryOutboxNoItemsTooltip"/>
+ <string name="InventoryOutboxNoItems">
+ [[MARKETPLACE_DASHBOARD_URL] マーケットプレイス]ã«è²©å£²ã™ã‚‹ã‚¢ã‚¤ãƒ†ãƒ ã‚’一覧ã™ã‚‹ã«ã¯ã€ãƒ•ã‚©ãƒ«ãƒ€ã‚’ã“ã®ã‚¨ãƒªã‚¢ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã€ã€Œãƒžãƒ¼ã‚±ãƒƒãƒˆãƒ—レイスã«é€ä¿¡ã€ã‚’クリックã—ã¾ã™ã€‚
+ </string>
+ <string name="Marketplace Error None">
+ エラーãªã—
+ </string>
+ <string name="Marketplace Error Not Merchant">
+ エラー:マーケットプレイスã«ã‚¢ã‚¤ãƒ†ãƒ ã‚’é€ã‚‹å‰ã«ã€ã‚ãªãŸè‡ªèº«ã‚’マーãƒãƒ£ãƒ³ãƒˆç™»éŒ²ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ï¼ˆç™»éŒ²ã¯ç„¡æ–™ã§ã™ï¼‰ã€‚
+ </string>
+ <string name="Marketplace Error Empty Folder">
+ エラー:ã“ã®ãƒ•ã‚©ãƒ«ãƒ€ã¯ç©ºã§ã™ã€‚
+ </string>
+ <string name="Marketplace Error Unassociated Products">
+ エラー:ã‚ãªãŸã®ãƒžãƒ¼ãƒãƒ£ãƒ³ãƒˆã‚¢ã‚«ã‚¦ãƒ³ãƒˆã«ã¯ã€å•†å“ã«é–¢é€£ä»˜ã‘られã¦ã„ãªã„アイテムãŒå¤šã™ãŽã‚‹ãŸã‚ã€ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’アップロードã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ã“ã®ã‚¨ãƒ©ãƒ¼ã‚’解消ã™ã‚‹ã«ã¯ã€ãƒžãƒ¼ã‚±ãƒƒãƒˆãƒ—レイス㮠Web サイトã«ãƒ­ã‚°ã‚¤ãƒ³ã—ã€é–¢é€£ä»˜ã‘られã¦ã„ãªã„アイテムã®æ•°ã‚’減らã—ã¦ãã ã•ã„。
+ </string>
+ <string name="Marketplace Error Object Limit">
+ エラー:ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã«å«ã¾ã‚Œã‚‹ã‚ªãƒ–ジェクトãŒå¤šã™ãŽã¾ã™ã€‚オブジェクトをã„ãã¤ã‹ãƒœãƒƒã‚¯ã‚¹ã«ã¾ã¨ã‚ã€ã‚ªãƒ–ジェクト数を200以下ã«æ¸›ã‚‰ã—ã¦ãã ã•ã„。
+ </string>
+ <string name="Marketplace Error Folder Depth">
+ エラー:ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ãƒã‚¹ãƒˆå…¥ã‚Šãƒ•ã‚©ãƒ«ãƒ€ã®éšŽå±¤ãŒå¤šã™ãŽã¾ã™ã€‚ãƒã‚¹ãƒˆå…¥ã‚Šãƒ•ã‚©ãƒ«ãƒ€ã‚’ 3 階層以内ã«ã¾ã¨ã‚ç›´ã—ã¦ãã ã•ã„。
+ </string>
+ <string name="Marketplace Error Unsellable Item">
+ エラー:ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’マーケットプレイスã§è²©å£²ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
+ </string>
+ <string name="Marketplace Error Internal Import">
+ エラー:ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã«é–¢ã—ã¦å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã—ã°ã‚‰ãã—ã¦ã‹ã‚‰ãŠè©¦ã—ãã ã•ã„。
+ </string>
+ <string name="Open landmarks">
+ ランドマークを開ã
</string>
<string name="no_transfer" value=" (å†è²©ãƒ»ãƒ—レゼントä¸å¯ï¼‰"/>
<string name="no_modify" value=" (編集ä¸å¯ï¼‰"/>
@@ -1058,7 +1316,7 @@
<string name="PermNo">
ã„ã„ãˆ
</string>
- <string name="Chat" value=" ãƒãƒ£ãƒƒãƒˆï¼š"/>
+ <string name="Chat Message" value="ãƒãƒ£ãƒƒãƒˆï¼š"/>
<string name="Sound" value=" サウンド:"/>
<string name="Wait" value=" --- 待機::"/>
<string name="AnimFlagStop" value=" アニメーションをåœæ­¢ï¼š"/>
@@ -1082,10 +1340,7 @@
<string name="No Filters" value="ã„ã„㈠"/>
<string name="Since Logoff" value=" - ログオフ以æ¥"/>
<string name="InvFolder My Inventory">
- æŒã¡ç‰©
- </string>
- <string name="InvFolder My Favorites">
- ãŠæ°—ã«å…¥ã‚Š
+ インベントリ
</string>
<string name="InvFolder Library">
ライブラリ
@@ -1118,7 +1373,7 @@
æ–°è¦ãƒ•ã‚©ãƒ«ãƒ€
</string>
<string name="InvFolder Inventory">
- æŒã¡ç‰©
+ インベントリ
</string>
<string name="InvFolder Uncompressed Images">
圧縮ã•ã‚Œã¦ã„ãªã„ç”»åƒ
@@ -1162,12 +1417,21 @@
<string name="InvFolder Accessories">
アクセサリ
</string>
+ <string name="InvFolder Meshes">
+ メッシュ
+ </string>
<string name="InvFolder Friends">
フレンド
</string>
<string name="InvFolder All">
全員
</string>
+ <string name="no_attachments">
+ ç€ç”¨ã—ã¦ã„るアタッãƒãƒ¡ãƒ³ãƒˆã¯ã‚ã‚Šã¾ã›ã‚“
+ </string>
+ <string name="Attachments remain">
+ アタッãƒãƒ¡ãƒ³ãƒˆï¼ˆæ®‹ã‚Šã®ã‚¹ãƒ­ãƒƒãƒˆæ•°ï¼š[COUNT])
+ </string>
<string name="Buy">
è²·ã†
</string>
@@ -1294,6 +1558,12 @@
<string name="Right Pec">
å³èƒ¸ç­‹
</string>
+ <string name="Neck">
+ 首
+ </string>
+ <string name="Avatar Center">
+ ã‚¢ãƒã‚¿ãƒ¼ã®ä¸­å¤®
+ </string>
<string name="Invalid Attachment">
装ç€å…ˆãŒæ­£ã—ãã‚ã‚Šã¾ã›ã‚“
</string>
@@ -1477,6 +1747,9 @@
</string>
<string name="SummaryForTheWeek" value="今週ã®ã¾ã¨ã‚。開始日ã¯"/>
<string name="NextStipendDay" value="ã§ã™ã€‚次回ã®ãŠå°é£ã„支給日:"/>
+ <string name="GroupPlanningDate">
+ [year,datetime,utc]/[mthnum,datetime,utc]/[day,datetime,utc]
+ </string>
<string name="GroupIndividualShare" value=" グループ 個人ã®å‰²ã‚Šå½“ã¦"/>
<string name="GroupColumn" value="グループã®è¨­å®š"/>
<string name="Balance">
@@ -1503,6 +1776,9 @@
<string name="IMTeen">
ティーン
</string>
+ <string name="Anyone">
+ 全員
+ </string>
<string name="RegionInfoError">
エラー
</string>
@@ -1725,6 +2001,12 @@
<string name="Public">
パブリック
</string>
+ <string name="LocalSettings">
+ ローカル設定
+ </string>
+ <string name="RegionSettings">
+ リージョン(地域)ã®è¨­å®š
+ </string>
<string name="ClassifiedClicksTxt">
クリック数: [TELEPORT] テレãƒãƒ¼ãƒˆã€ [MAP] 地図〠[PROFILE] プロフィール
</string>
@@ -1764,11 +2046,8 @@
<string name="InvOfferGaveYou">
ãŒæ¸¡ã—ã¾ã—ãŸ
</string>
- <string name="InvOfferYouDecline">
- æ‹’å¦ï¼š
- </string>
- <string name="InvOfferFrom">
- é€ä¿¡å…ƒï¼š
+ <string name="InvOfferDecline">
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; ã‹ã‚‰ã® [DESC] ã‚’æ‹’å¦ã—ã¾ã—ãŸã€‚
</string>
<string name="GroupMoneyTotal">
åˆè¨ˆ
@@ -1800,6 +2079,9 @@
<string name="GroupMoneyDebits">
支出
</string>
+ <string name="GroupMoneyDate">
+ [year,datetime,utc]年[mth,datetime,utc]月[day,datetime,utc]日[weekday,datetime,utc]
+ </string>
<string name="ViewerObjectContents">
内容
</string>
@@ -1858,12 +2140,6 @@
<string name="accel-win-shift">
Shift+
</string>
- <string name="Esc">
- Esc
- </string>
- <string name="Home">
- ホーム
- </string>
<string name="FileSaved">
ファイルãŒä¿å­˜ã•ã‚Œã¾ã—ãŸ
</string>
@@ -1882,34 +2158,34 @@
<string name="PDT">
太平洋å¤æ™‚é–“
</string>
- <string name="Forward">
+ <string name="Direction_Forward">
å‰
</string>
- <string name="Left">
+ <string name="Direction_Left">
å·¦
</string>
- <string name="Right">
+ <string name="Direction_Right">
å³
</string>
- <string name="Back">
- 後ã‚
+ <string name="Direction_Back">
+ 戻る
</string>
- <string name="North">
+ <string name="Direction_North">
北
</string>
- <string name="South">
+ <string name="Direction_South">
å—
</string>
- <string name="West">
+ <string name="Direction_West">
西
</string>
- <string name="East">
+ <string name="Direction_East">
æ±
</string>
- <string name="Up">
+ <string name="Direction_Up">
上
</string>
- <string name="Down">
+ <string name="Direction_Down">
下
</string>
<string name="Any Category">
@@ -1981,6 +2257,9 @@
<string name="Other">
ãã®ä»–
</string>
+ <string name="Rental">
+ レンタル
+ </string>
<string name="Any">
全員
</string>
@@ -2244,6 +2523,114 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
<string name="Bulbous Nose">
ã ã‚“ã”é¼»
</string>
+ <string name="Breast Physics Mass">
+ 胸ã®è±Šã‹ã•
+ </string>
+ <string name="Breast Physics Smoothing">
+ 胸ã®å¹³æ»‘化
+ </string>
+ <string name="Breast Physics Gravity">
+ 胸ã®åž‚れ具åˆ
+ </string>
+ <string name="Breast Physics Drag">
+ 胸ã®ç©ºæ°—抵抗
+ </string>
+ <string name="Breast Physics InOut Max Effect">
+ 最大エフェクト数
+ </string>
+ <string name="Breast Physics InOut Spring">
+ 振動速度
+ </string>
+ <string name="Breast Physics InOut Gain">
+ 増加率
+ </string>
+ <string name="Breast Physics InOut Damping">
+ 減衰
+ </string>
+ <string name="Breast Physics UpDown Max Effect">
+ 最大エフェクト数
+ </string>
+ <string name="Breast Physics UpDown Spring">
+ 振動速度
+ </string>
+ <string name="Breast Physics UpDown Gain">
+ 増加率
+ </string>
+ <string name="Breast Physics UpDown Damping">
+ 減衰
+ </string>
+ <string name="Breast Physics LeftRight Max Effect">
+ 最大エフェクト数
+ </string>
+ <string name="Breast Physics LeftRight Spring">
+ 振動速度
+ </string>
+ <string name="Breast Physics LeftRight Gain">
+ 増加率
+ </string>
+ <string name="Breast Physics LeftRight Damping">
+ 減衰
+ </string>
+ <string name="Belly Physics Mass">
+ ãŠè…¹ã®è±Šã‹ã•
+ </string>
+ <string name="Belly Physics Smoothing">
+ ãŠè…¹ã®å¹³æ»‘化
+ </string>
+ <string name="Belly Physics Gravity">
+ ãŠè…¹ã®åž‚れ具åˆ
+ </string>
+ <string name="Belly Physics Drag">
+ ãŠè…¹ã®ç©ºæ°—抵抗
+ </string>
+ <string name="Belly Physics UpDown Max Effect">
+ 最大エフェクト数
+ </string>
+ <string name="Belly Physics UpDown Spring">
+ 振動速度
+ </string>
+ <string name="Belly Physics UpDown Gain">
+ 増加率
+ </string>
+ <string name="Belly Physics UpDown Damping">
+ 減衰
+ </string>
+ <string name="Butt Physics Mass">
+ ãŠå°»ã®è±Šã‹ã•
+ </string>
+ <string name="Butt Physics Smoothing">
+ ãŠå°»ã®å¹³æ»‘化
+ </string>
+ <string name="Butt Physics Gravity">
+ ãŠå°»ã®åž‚れ具åˆ
+ </string>
+ <string name="Butt Physics Drag">
+ ãŠå°»ã®ç©ºæ°—抵抗
+ </string>
+ <string name="Butt Physics UpDown Max Effect">
+ 最大エフェクト数
+ </string>
+ <string name="Butt Physics UpDown Spring">
+ 振動速度
+ </string>
+ <string name="Butt Physics UpDown Gain">
+ 増加率
+ </string>
+ <string name="Butt Physics UpDown Damping">
+ 減衰
+ </string>
+ <string name="Butt Physics LeftRight Max Effect">
+ 最大エフェクト数
+ </string>
+ <string name="Butt Physics LeftRight Spring">
+ 振動速度
+ </string>
+ <string name="Butt Physics LeftRight Gain">
+ 増加率
+ </string>
+ <string name="Butt Physics LeftRight Damping">
+ 減衰
+ </string>
<string name="Bushy Eyebrows">
太
</string>
@@ -2253,6 +2640,9 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
<string name="Butt Size">
ãŠå°»ã®å¤§ãã•
</string>
+ <string name="Butt Gravity">
+ ãŠå°»ã®åž‚れ具åˆ
+ </string>
<string name="bustle skirt">
後ã‚ã®è†¨ã‚‰ã¿
</string>
@@ -3465,6 +3855,9 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
<string name="LocationCtrlGeneralIconTooltip">
General リージョン
</string>
+ <string name="LocationCtrlSeeAVsTooltip">
+ ã“ã®åŒºç”»å¤–ã«ã‚¢ãƒã‚¿ãƒ¼ã‚’見ãˆã‚‹ã‚ˆã†ã«ã—ã¦ã€ãƒãƒ£ãƒƒãƒˆã‚‚許å¯
+ </string>
<string name="UpdaterWindowTitle">
[APP_NAME] アップデート
</string>
@@ -3531,6 +3924,9 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
<string name="Saved_message">
(ä¿å­˜æ—¥æ™‚:[LONG_TIMESTAMP])
</string>
+ <string name="IM_unblock_only_groups_friends">
+ ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã™ã‚‹ã«ã¯ã€ã€Œç’°å¢ƒè¨­å®šã€ã®ã€Œãƒ—ライãƒã‚·ãƒ¼ã€ã§ã€Œãƒ•ãƒ¬ãƒ³ãƒ‰ã¨ã‚°ãƒ«ãƒ¼ãƒ—以外ã‹ã‚‰ã¯ã‚³ãƒ¼ãƒ«ã¨ IM ã‚’å—ä¿¡ã—ãªã„ã€ãƒã‚§ãƒƒã‚¯ãƒœãƒƒã‚¯ã‚¹ã‚’オフã«ã—ã¾ã™ã€‚
+ </string>
<string name="answered_call">
相手ãŒã‚³ãƒ¼ãƒ«ã‚’å—ã‘ã¾ã—ãŸ
</string>
@@ -3559,13 +3955,13 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
アドホックコンファレンス
</string>
<string name="conference-title-incoming">
- [AGENT_NAME]ã¨ã‚³ãƒ³ãƒ•ã‚¡ãƒ¬ãƒ³ã‚¹ã™ã‚‹
+ [AGENT_NAME] ã¨ã‚³ãƒ³ãƒ•ã‚¡ãƒ¬ãƒ³ã‚¹ã™ã‚‹
</string>
<string name="inventory_item_offered-im">
- æŒã¡ç‰©ã‚¢ã‚¤ãƒ†ãƒ ã‚’é€ã‚Šã¾ã—ãŸ
+ インベントリアイテムをé€ã‚Šã¾ã—ãŸ
</string>
<string name="share_alert">
- æŒã¡ç‰©ã‹ã‚‰ã“ã“ã«ã‚¢ã‚¤ãƒ†ãƒ ã‚’ドラッグã—ã¾ã™
+ インベントリã‹ã‚‰ã“ã“ã«ã‚¢ã‚¤ãƒ†ãƒ ã‚’ドラッグã—ã¾ã™
</string>
<string name="no_session_message">
(IM セッションãŒå­˜åœ¨ã—ã¾ã›ã‚“)
@@ -3574,7 +3970,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
ã“ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ã„るユーザーã¯ã‚ãªãŸã ã‘ã§ã™ã€‚
</string>
<string name="offline_message">
- [NAME] ã¯ã‚ªãƒ•ãƒ©ã‚¤ãƒ³ã§ã™ã€‚
+ [NAME] ã¯ã‚ªãƒ•ãƒ©ã‚¤ãƒ³ä¸­ã§ã™ã€‚
</string>
<string name="invite_message">
ã“ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã«å¿œç­”・接続ã™ã‚‹å ´åˆã¯ã€[BUTTON NAME] をクリックã—ã¦ãã ã•ã„。
@@ -3639,11 +4035,17 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
<string name="session_initialization_timed_out_error">
セッションã®åˆæœŸåŒ–ãŒã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã—ã¾ã—ãŸ
</string>
+ <string name="Home position set.">
+ 家ã®é…ç½®ã®è¨­å®šã€‚
+ </string>
<string name="voice_morphing_url">
http://secondlife.com/landing/voicemorphing
</string>
<string name="paid_you_ldollars">
- [NAME] 㯠L$[AMOUNT] 支払ã„ã¾ã—ãŸ
+ [NAME] 㯠[REASON] ã®ãŸã‚ã« L$[AMOUNT] を支払ã„ã¾ã—ãŸã€‚
+ </string>
+ <string name="paid_you_ldollars_no_reason">
+ [NAME] 㯠L$[AMOUNT] を支払ã„ã¾ã—ãŸã€‚
</string>
<string name="you_paid_ldollars">
[NAME] ã« L$ [AMOUNT] を支払ã„ã¾ã—ãŸï¼š[REASON]
@@ -3657,6 +4059,21 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
<string name="you_paid_ldollars_no_name">
L$ [AMOUNT] を支払ã„ã¾ã—ãŸï¼š[REASON]
</string>
+ <string name="you_paid_failure_ldollars">
+ [NAME] ã« [REASON] ã®ä»£é‡‘ L$ [AMOUNT] を支払ãˆã¾ã›ã‚“ã§ã—ãŸã€‚
+ </string>
+ <string name="you_paid_failure_ldollars_no_info">
+ L$ [AMOUNT] を支払ãˆã¾ã›ã‚“ã§ã—ãŸã€‚
+ </string>
+ <string name="you_paid_failure_ldollars_no_reason">
+ [NAME] ã« L$ [AMOUNT] を支払ãˆã¾ã›ã‚“ã§ã—ãŸã€‚
+ </string>
+ <string name="you_paid_failure_ldollars_no_name">
+ [REASON] 㮠代金 L$ [AMOUNT] を支払ãˆã¾ã›ã‚“ã§ã—ãŸã€‚
+ </string>
+ <string name="for item">
+ [ITEM] å‘ã‘
+ </string>
<string name="for a parcel of land">
土地区画ã®ãŸã‚
</string>
@@ -3675,6 +4092,9 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
<string name="to upload">
アップロードã™ã‚‹ãŸã‚
</string>
+ <string name="to publish a classified ad">
+ クラシファイド広告を掲載ã™ã‚‹
+ </string>
<string name="giving">
L$[AMOUNT] を渡ã—ã¾ã™
</string>
@@ -3704,7 +4124,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
</string>
<string name="uploading_abuse_report">
アップロード中...
-
+
å«ŒãŒã‚‰ã›ã®å ±å‘Š
</string>
<string name="New Shape">
@@ -3752,6 +4172,9 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
<string name="New Tattoo">
æ–°ã—ã„タトゥ
</string>
+ <string name="New Physics">
+ æ–°è¦ã®ç‰©ç†ä½œç”¨
+ </string>
<string name="Invalid Wearable">
無効ãªç€ç”¨ç‰©
</string>
@@ -3875,6 +4298,87 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
<string name="Female - Wow">
女性 - Wow
</string>
+ <string name="/bow">
+ /ãŠã˜ãŽã™ã‚‹
+ </string>
+ <string name="/clap">
+ /æ‹æ‰‹
+ </string>
+ <string name="/count">
+ /æ•°ãˆã‚‹
+ </string>
+ <string name="/extinguish">
+ /消ã™
+ </string>
+ <string name="/kmb">
+ /ãããらãˆ
+ </string>
+ <string name="/muscle">
+ /筋肉もりもり
+ </string>
+ <string name="/no">
+ /ã„ã„ãˆ
+ </string>
+ <string name="/no!">
+ /ã ã‚ï¼
+ </string>
+ <string name="/paper">
+ /パー
+ </string>
+ <string name="/pointme">
+ /自分を指差ã™
+ </string>
+ <string name="/pointyou">
+ /相手を指差ã™
+ </string>
+ <string name="/rock">
+ /グー
+ </string>
+ <string name="/scissor">
+ /ãƒãƒ§ã‚­
+ </string>
+ <string name="/smoke">
+ /ã‚¿ãƒã‚³ã‚’å¸ã†
+ </string>
+ <string name="/stretch">
+ /伸ã³ã‚’ã™ã‚‹
+ </string>
+ <string name="/whistle">
+ /å£ç¬›ã‚’å¹ã
+ </string>
+ <string name="/yes">
+ /ã¯ã„
+ </string>
+ <string name="/yes!">
+ /イエスï¼
+ </string>
+ <string name="afk">
+ 一時退席中
+ </string>
+ <string name="dance1">
+ ダンス1
+ </string>
+ <string name="dance2">
+ ダンス2
+ </string>
+ <string name="dance3">
+ ダンス3
+ </string>
+ <string name="dance4">
+ ダンス4
+ </string>
+ <string name="dance5">
+ ダンス5
+ </string>
+ <string name="dance6">
+ ダンス6
+ </string>
+ <string name="dance7">
+ ダンス7
+ </string>
+ <string name="dance8">
+ ダンス8
+ </string>
<string name="AvatarBirthDateFormat">
[year,datetime,slt]/[mthnum,datetime,slt]/[day,datetime,slt]
</string>
@@ -3886,10 +4390,10 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
</string>
<string name="words_separator" value=","/>
<string name="server_is_down">
- 大変申ã—訳ã”ã–ã„ã¾ã›ã‚“ãŒã€äºˆæœŸã›ã¬å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚
+ 大変申ã—訳ã”ã–ã„ã¾ã›ã‚“ãŒã€äºˆæœŸã—ãªã„å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚
- status.secondlifegrid.netã§ã€ã‚µãƒ¼ãƒ“スã«é–¢ã™ã‚‹æ—¢çŸ¥ã®å•é¡Œã«ã¤ã„ã¦ãŠèª¿ã¹ãã ã•ã„。
- å•é¡ŒãŒå¼•ã続ã発生ã™ã‚‹å ´åˆã¯ã€ãŠä½¿ã„ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚„ファイアウォールã®è¨­å®šã‚’確èªã—ã¦ãã ã•ã„。
+ サービスã«é–¢ã™ã‚‹æ—¢çŸ¥ã®å•é¡Œã«ã¤ã„ã¦ã¯ã€status.secondlifegrid.net ã‚’ã”覧ãã ã•ã„。
+å•é¡ŒãŒå¼•ã続ã発生ã™ã‚‹å ´åˆã¯ã€ãŠä½¿ã„ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚„ファイアウォールã®è¨­å®šã‚’調ã¹ã¦ãã ã•ã„。
</string>
<string name="dateTimeWeekdaysNames">
日曜日:月曜日:ç«æ›œæ—¥:水曜日:木曜日:金曜日:土曜日
@@ -3951,7 +4455,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
<string name="Notices">
通知
</string>
- <string name="Chat">
+ <string name="Chat" value=" ãƒãƒ£ãƒƒãƒˆï¼š">
ãƒãƒ£ãƒƒãƒˆ
</string>
<string name="DeleteItems">
@@ -3963,4 +4467,552 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
<string name="EmptyOutfitText">
ã“ã®ã‚¢ã‚¦ãƒˆãƒ•ã‚£ãƒƒãƒˆã«ã¯ã‚¢ã‚¤ãƒ†ãƒ ãŒã‚ã‚Šã¾ã›ã‚“
</string>
+ <string name="ExternalEditorNotSet">
+ ExternalEditor 設定を使ã£ã¦ã‚¨ãƒ‡ã‚£ã‚¿ãƒ¼ã‚’é¸æŠžã—ã¾ã™ã€‚
+ </string>
+ <string name="ExternalEditorNotFound">
+ 指定ã•ã‚ŒãŸå¤–部エディターãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。
+エディターã¸ã®ãƒ‘スを二é‡å¼•ç”¨ç¬¦ã§å›²ã‚“ã§ã¿ã¦ãã ã•ã„。
+(例:&quot;/path to my/editor&quot; &quot;%s&quot;)
+ </string>
+ <string name="ExternalEditorCommandParseError">
+ 外部エディターã®ã‚³ãƒžãƒ³ãƒ‰ã®è§£æžä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸã€‚
+ </string>
+ <string name="ExternalEditorFailedToRun">
+ 外部エディターを実行ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
+ </string>
+ <string name="TranslationFailed">
+ 翻訳ã§ãã¾ã›ã‚“ã§ã—ãŸï¼š[REASON]
+ </string>
+ <string name="TranslationResponseParseError">
+ 翻訳ã®å¿œç­”ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚
+ </string>
+ <string name="Esc">
+ Esc
+ </string>
+ <string name="Space">
+ Space
+ </string>
+ <string name="Enter">
+ Enter
+ </string>
+ <string name="Tab">
+ Tab
+ </string>
+ <string name="Ins">
+ Ins
+ </string>
+ <string name="Del">
+ Del
+ </string>
+ <string name="Backsp">
+ Backsp
+ </string>
+ <string name="Shift">
+ Shift
+ </string>
+ <string name="Ctrl">
+ Ctrl
+ </string>
+ <string name="Alt">
+ Alt
+ </string>
+ <string name="CapsLock">
+ CapsLock
+ </string>
+ <string name="Home">
+ ホーム
+ </string>
+ <string name="End">
+ End
+ </string>
+ <string name="PgUp">
+ PgUp
+ </string>
+ <string name="PgDn">
+ PgDn
+ </string>
+ <string name="F1">
+ F1
+ </string>
+ <string name="F2">
+ F2
+ </string>
+ <string name="F3">
+ F3
+ </string>
+ <string name="F4">
+ F4
+ </string>
+ <string name="F5">
+ F5
+ </string>
+ <string name="F6">
+ F6
+ </string>
+ <string name="F7">
+ F7
+ </string>
+ <string name="F8">
+ F8
+ </string>
+ <string name="F9">
+ F9
+ </string>
+ <string name="F10">
+ F10
+ </string>
+ <string name="F11">
+ F11
+ </string>
+ <string name="F12">
+ F12
+ </string>
+ <string name="Add">
+ 追加
+ </string>
+ <string name="Subtract">
+ 減算
+ </string>
+ <string name="Multiply">
+ ä¹—ç®—
+ </string>
+ <string name="Divide">
+ 除算
+ </string>
+ <string name="PAD_DIVIDE">
+ PAD_DIVIDE
+ </string>
+ <string name="PAD_LEFT">
+ PAD_LEFT
+ </string>
+ <string name="PAD_RIGHT">
+ PAD_RIGHT
+ </string>
+ <string name="PAD_DOWN">
+ PAD_DOWN
+ </string>
+ <string name="PAD_UP">
+ PAD_UP
+ </string>
+ <string name="PAD_HOME">
+ PAD_HOME
+ </string>
+ <string name="PAD_END">
+ PAD_END
+ </string>
+ <string name="PAD_PGUP">
+ PAD_PGUP
+ </string>
+ <string name="PAD_PGDN">
+ PAD_PGDN
+ </string>
+ <string name="PAD_CENTER">
+ PAD_CENTER
+ </string>
+ <string name="PAD_INS">
+ PAD_INS
+ </string>
+ <string name="PAD_DEL">
+ PAD_DEL
+ </string>
+ <string name="PAD_Enter">
+ PAD_Enter
+ </string>
+ <string name="PAD_BUTTON0">
+ PAD_BUTTON0
+ </string>
+ <string name="PAD_BUTTON1">
+ PAD_BUTTON1
+ </string>
+ <string name="PAD_BUTTON2">
+ PAD_BUTTON2
+ </string>
+ <string name="PAD_BUTTON3">
+ PAD_BUTTON3
+ </string>
+ <string name="PAD_BUTTON4">
+ PAD_BUTTON4
+ </string>
+ <string name="PAD_BUTTON5">
+ PAD_BUTTON5
+ </string>
+ <string name="PAD_BUTTON6">
+ PAD_BUTTON6
+ </string>
+ <string name="PAD_BUTTON7">
+ PAD_BUTTON7
+ </string>
+ <string name="PAD_BUTTON8">
+ PAD_BUTTON8
+ </string>
+ <string name="PAD_BUTTON9">
+ PAD_BUTTON9
+ </string>
+ <string name="PAD_BUTTON10">
+ PAD_BUTTON10
+ </string>
+ <string name="PAD_BUTTON11">
+ PAD_BUTTON11
+ </string>
+ <string name="PAD_BUTTON12">
+ PAD_BUTTON12
+ </string>
+ <string name="PAD_BUTTON13">
+ PAD_BUTTON13
+ </string>
+ <string name="PAD_BUTTON14">
+ PAD_BUTTON14
+ </string>
+ <string name="PAD_BUTTON15">
+ PAD_BUTTON15
+ </string>
+ <string name="-">
+ -
+ </string>
+ <string name="=">
+ =
+ </string>
+ <string name="`">
+ `
+ </string>
+ <string name=";">
+ ;
+ </string>
+ <string name="[">
+ [
+ </string>
+ <string name="]">
+ ]
+ </string>
+ <string name="\">
+ \
+ </string>
+ <string name="0">
+ 0
+ </string>
+ <string name="1">
+ 1
+ </string>
+ <string name="2">
+ 2
+ </string>
+ <string name="3">
+ 3
+ </string>
+ <string name="4">
+ 4
+ </string>
+ <string name="5">
+ 5
+ </string>
+ <string name="6">
+ 6
+ </string>
+ <string name="7">
+ 7
+ </string>
+ <string name="8">
+ 8
+ </string>
+ <string name="9">
+ 9
+ </string>
+ <string name="A">
+ A
+ </string>
+ <string name="B">
+ B
+ </string>
+ <string name="C">
+ C
+ </string>
+ <string name="D">
+ D
+ </string>
+ <string name="E">
+ E
+ </string>
+ <string name="F">
+ F
+ </string>
+ <string name="G">
+ G
+ </string>
+ <string name="H">
+ H
+ </string>
+ <string name="I">
+ I
+ </string>
+ <string name="J">
+ J
+ </string>
+ <string name="K">
+ K
+ </string>
+ <string name="L">
+ L
+ </string>
+ <string name="M">
+ M
+ </string>
+ <string name="N">
+ N
+ </string>
+ <string name="O">
+ O
+ </string>
+ <string name="P">
+ P
+ </string>
+ <string name="Q">
+ Q
+ </string>
+ <string name="R">
+ R
+ </string>
+ <string name="S">
+ S
+ </string>
+ <string name="T">
+ T
+ </string>
+ <string name="U">
+ U
+ </string>
+ <string name="V">
+ V
+ </string>
+ <string name="W">
+ W
+ </string>
+ <string name="X">
+ X
+ </string>
+ <string name="Y">
+ Y
+ </string>
+ <string name="Z">
+ Z
+ </string>
+ <string name="BeaconParticle">
+ パーティクルæºãƒ“ーコン(é’)を表示中
+ </string>
+ <string name="BeaconPhysical">
+ 物ç†çš„オブジェクトã®ãƒ“ーコン(緑)を表示中
+ </string>
+ <string name="BeaconScripted">
+ スクリプトã®ã‚ªãƒ–ジェクトã®ãƒ“ーコン(赤)を表示中
+ </string>
+ <string name="BeaconScriptedTouch">
+ タッãƒæ©Ÿèƒ½ã®ãƒ“ーコンãŒä»˜ã„ãŸã‚¹ã‚¯ãƒªãƒ—トã®ã‚ªãƒ–ジェクト(赤)を表示中
+ </string>
+ <string name="BeaconSound">
+ サウンドビーコン(黄)を表示中
+ </string>
+ <string name="BeaconMedia">
+ メディアビーコン(白)を表示中
+ </string>
+ <string name="ParticleHiding">
+ パーティクルをéžè¡¨ç¤º
+ </string>
+ <string name="Command_AboutLand_Label">
+ 土地情報
+ </string>
+ <string name="Command_Appearance_Label">
+ 容姿
+ </string>
+ <string name="Command_Avatar_Label">
+ ã‚¢ãƒã‚¿ãƒ¼
+ </string>
+ <string name="Command_Build_Label">
+ 制作
+ </string>
+ <string name="Command_Chat_Label">
+ ãƒãƒ£ãƒƒãƒˆ
+ </string>
+ <string name="Command_Compass_Label">
+ コンパス
+ </string>
+ <string name="Command_Destinations_Label">
+ è¡Œãå…ˆ
+ </string>
+ <string name="Command_Gestures_Label">
+ ジェスãƒãƒ£ãƒ¼
+ </string>
+ <string name="Command_HowTo_Label">
+ ãƒã‚¦ãƒ„ー
+ </string>
+ <string name="Command_Inventory_Label">
+ インベントリ
+ </string>
+ <string name="Command_Map_Label">
+ 地図
+ </string>
+ <string name="Command_Marketplace_Label">
+ マーケットプレイス
+ </string>
+ <string name="Command_MiniMap_Label">
+ ミニマップ
+ </string>
+ <string name="Command_Move_Label">
+ 歩行 / 走行 / 飛行
+ </string>
+ <string name="Command_Outbox_Label">
+ マーãƒãƒ£ãƒ³ãƒˆã‚¢ã‚¦ãƒˆãƒœãƒƒã‚¯ã‚¹
+ </string>
+ <string name="Command_People_Label">
+ 人
+ </string>
+ <string name="Command_Picks_Label">
+ ピック
+ </string>
+ <string name="Command_Places_Label">
+ 場所
+ </string>
+ <string name="Command_Preferences_Label">
+ 環境設定
+ </string>
+ <string name="Command_Profile_Label">
+ プロフィール
+ </string>
+ <string name="Command_Search_Label">
+ 検索
+ </string>
+ <string name="Command_Snapshot_Label">
+ スナップショット
+ </string>
+ <string name="Command_Speak_Label">
+ 話ã™
+ </string>
+ <string name="Command_View_Label">
+ カメラコントロール
+ </string>
+ <string name="Command_Voice_Label">
+ ボイス設定
+ </string>
+ <string name="Command_AboutLand_Tooltip">
+ 訪å•å…ˆã«é–¢ã™ã‚‹æƒ…å ±
+ </string>
+ <string name="Command_Appearance_Tooltip">
+ ã‚¢ãƒã‚¿ãƒ¼ã‚’変更
+ </string>
+ <string name="Command_Avatar_Tooltip">
+ ã‚¢ãƒã‚¿ãƒ¼ä¸€å¼ã‚’é¸æŠž
+ </string>
+ <string name="Command_Build_Tooltip">
+ オブジェクトã®åˆ¶ä½œã¨åœ°å½¢ã®å¤‰å½¢
+ </string>
+ <string name="Command_Chat_Tooltip">
+ è¿‘ãã®äººã¨æ–‡å­—ãƒãƒ£ãƒƒãƒˆã™ã‚‹
+ </string>
+ <string name="Command_Compass_Tooltip">
+ コンパス
+ </string>
+ <string name="Command_Destinations_Tooltip">
+ è¡Œã£ã¦ã¿ãŸã„場所
+ </string>
+ <string name="Command_Gestures_Tooltip">
+ ã‚¢ãƒã‚¿ãƒ¼ã®ã‚¸ã‚§ã‚¹ãƒãƒ£ãƒ¼
+ </string>
+ <string name="Command_HowTo_Tooltip">
+ 一般的タスクã®å®Ÿè¡Œæ–¹æ³•
+ </string>
+ <string name="Command_Inventory_Tooltip">
+ インベントリを表示・使用
+ </string>
+ <string name="Command_Map_Tooltip">
+ 世界地図
+ </string>
+ <string name="Command_Marketplace_Tooltip">
+ ショッピングã«å‡ºæŽ›ã‘ã‚‹
+ </string>
+ <string name="Command_MiniMap_Tooltip">
+ è¿‘ãã®äººã‚’表示ã™ã‚‹
+ </string>
+ <string name="Command_Move_Tooltip">
+ ã‚¢ãƒã‚¿ãƒ¼ã®ç§»å‹•
+ </string>
+ <string name="Command_Outbox_Tooltip">
+ 販売用ã«ã‚¢ã‚¤ãƒ†ãƒ ã‚’マーケットプレイスã«è»¢é€
+ </string>
+ <string name="Command_People_Tooltip">
+ フレンドã€ã‚°ãƒ«ãƒ¼ãƒ—ã€è¿‘ãã®äºº
+ </string>
+ <string name="Command_Picks_Tooltip">
+ プロフィールã§ç´¹ä»‹ã™ã‚‹ãŠæ°—ã«å…¥ã‚Šã®å ´æ‰€
+ </string>
+ <string name="Command_Places_Tooltip">
+ ä¿å­˜æ¸ˆã¿ã®å ´æ‰€
+ </string>
+ <string name="Command_Preferences_Tooltip">
+ 環境設定
+ </string>
+ <string name="Command_Profile_Tooltip">
+ プロフィールを編集・表示
+ </string>
+ <string name="Command_Search_Tooltip">
+ 場所ã€ã‚¤ãƒ™ãƒ³ãƒˆã€äººã‚’検索
+ </string>
+ <string name="Command_Snapshot_Tooltip">
+ ピクãƒãƒ£ã‚’撮る
+ </string>
+ <string name="Command_Speak_Tooltip">
+ マイクを使ã£ã¦è¿‘ãã®äººã¨è©±ã™
+ </string>
+ <string name="Command_View_Tooltip">
+ カメラã®è§’度を変更
+ </string>
+ <string name="Command_Voice_Tooltip">
+ インワールドã§ã®ã‚³ãƒ¼ãƒ«ã‚„è¿‘ãã«ã„る人ã®éŸ³é‡èª¿æ•´
+ </string>
+ <string name="Toolbar_Bottom_Tooltip">
+ ç¾åœ¨ã€ä¸‹ã®ãƒ„ールãƒãƒ¼ã«ã‚ã‚Šã¾ã™
+ </string>
+ <string name="Toolbar_Left_Tooltip">
+ ç¾åœ¨ã€å·¦ã®ãƒ„ールãƒãƒ¼ã«ã‚ã‚Šã¾ã™
+ </string>
+ <string name="Toolbar_Right_Tooltip">
+ ç¾åœ¨ã€å³ã®ãƒ„ールãƒãƒ¼ã«ã‚ã‚Šã¾ã™
+ </string>
+ <string name="Retain%">
+ 維æŒçŽ‡
+ </string>
+ <string name="Detail">
+ 詳細
+ </string>
+ <string name="Better Detail">
+ ã‚‚ã£ã¨è©³ã—ã
+ </string>
+ <string name="Surface">
+ 表é¢
+ </string>
+ <string name="Solid">
+ ソリッド
+ </string>
+ <string name="Wrap">
+ ラップ
+ </string>
+ <string name="Preview">
+ プレビュー
+ </string>
+ <string name="Normal">
+ 普通
+ </string>
+ <string name="snapshot_quality_very_low">
+ éžå¸¸ã«ä½Žã„
+ </string>
+ <string name="snapshot_quality_low">
+ 低
+ </string>
+ <string name="snapshot_quality_medium">
+ 中
+ </string>
+ <string name="snapshot_quality_high">
+ 高
+ </string>
+ <string name="snapshot_quality_very_high">
+ éžå¸¸ã«é«˜ã„
+ </string>
</strings>
diff --git a/indra/newview/skins/default/xui/ja/teleport_strings.xml b/indra/newview/skins/default/xui/ja/teleport_strings.xml
index 2f67d43707..64f01f4030 100644
--- a/indra/newview/skins/default/xui/ja/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/ja/teleport_strings.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<teleport_messages>
<message_set name="errors">
<message name="invalid_tport">
@@ -20,6 +20,10 @@
申ã—訳ã”ã–ã„ã¾ã›ã‚“ãŒã€ã‚·ã‚¹ãƒ†ãƒ ã¯ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã®æŽ¥ç¶šã‚’完了ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
ã‚‚ã†å°‘ã—後ã§ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。
</message>
+ <message name="NoHelpIslandTP">
+ ウェルカムアイランドã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã§æˆ»ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
+「Welcome Island Publicã€ã«è¡Œãå†åº¦ãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«ã‚’è¡Œã£ã¦ãã ã•ã„。
+ </message>
<message name="noaccess_tport">
残念ãªãŒã‚‰ã€ãã®ãƒ†ãƒ¬ãƒãƒ¼ãƒˆç›®çš„地ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒã‚ã‚Šã¾ã›ã‚“。
</message>
@@ -41,7 +45,7 @@
テレãƒãƒ¼ãƒˆã®ç›®çš„地を見ã¤ã‘られã¾ã›ã‚“。目的地ãŒä¸€æ™‚çš„ã«åˆ©ç”¨ã§ããªã„状態ã‹ã€ã¾ãŸã¯ã™ã§ã«æ¶ˆæ»…ã—ã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚数分後ã«ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。
</message>
<message name="no_inventory_host">
- æŒã¡ç‰©ã‚·ã‚¹ãƒ†ãƒ ã¯ç¾åœ¨åˆ©ç”¨ã§ãã¾ã›ã‚“。
+ インベントリシステムã¯ç¾åœ¨åˆ©ç”¨ã§ãã¾ã›ã‚“。
</message>
</message_set>
<message_set name="progress">
diff --git a/indra/newview/skins/default/xui/nl/floater_about.xml b/indra/newview/skins/default/xui/nl/floater_about.xml
deleted file mode 100644
index f543ebbbe3..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_about.xml
+++ /dev/null
@@ -1,81 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_about" title="OVER [CAPITALIZED_APP_NAME]">
- <floater.string name="AboutHeader">
- [APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2] ([VIEWER_VERSION_3]) [BUILD_DATE] [BUILD_TIME] ([CHANNEL])
-[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]
- </floater.string>
- <floater.string name="AboutCompiler">
- Gemaakt met [COMPILER] versie [COMPILER_VERSION]
- </floater.string>
- <floater.string name="AboutPosition">
- U bent op [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] in [REGION] gelegen op [HOSTNAME] ([HOSTIP])
-[SERVER_VERSION]
-[[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]]
- </floater.string>
- <floater.string name="AboutSystem">
- CPU: [CPU]
-Geheugen: [MEMORY_MB] MB
-OS Versie: [OS_VERSION]
-Grafische Kaard Vendor: [GRAPHICS_CARD_VENDOR]
-Grafische Kaard: [GRAPHICS_CARD]
- </floater.string>
- <floater.string name="AboutDriver">
- Windows Grafische Driver Versie: [GRAPHICS_DRIVER_VERSION]
- </floater.string>
- <floater.string name="AboutLibs">
- OpenGL Versie: [OPENGL_VERSION]
-
-libcurl Versie: [LIBCURL_VERSION]
-J2C Decoder Versie: [J2C_VERSION]
-Audio Driver Versie: [AUDIO_DRIVER_VERSION]
-Qt Webkit Versie: [QT_WEBKIT_VERSION]
-Vivox Versie: [VIVOX_VERSION]
- </floater.string>
- <floater.string name="none">
- (none)
- </floater.string>
- <floater.string name="AboutTraffic">
- Pakketten Verloren: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
- </floater.string>
- <tab_container name="about_tab">
- <panel label="Info" name="support_panel">
- <button label="Kopiëren naar Klembord" name="copy_btn"/>
- </panel>
- <panel label="Credits" name="credits_panel">
- <text_editor name="credits_editor">
- Second Life wordt u aangeboden door Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl and many others.
-
-Een &apos;Dank u&apos; voor de volgende bewoners voor het helpen zorgdragen dat dit de beste versie tot nu toe is: able whitman, Adeon Writer, adonaira aabye, Aeron Kohime, Agathos Frascati, Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Aminom Marvin, Angela Talamasca, Aralara Rajal, Armin Weatherwax, Ashrilyn Hayashida, Athanasius Skytower, Aura Dirval, Barney Boomslang, Biancaluce Robbiani, Biker Offcourse, Borg Capalini, Bulli Schumann, catherine pfeffer, Chalice Yao, Corre Porta, Court Goodman, Cummere Mayo, Dale Innis, Darien Caldwell, Darjeeling Schoonhoven, Daten Thielt, dimentox travanti, Dirk Talamasca, Drew Dwi, Duckless Vandyke, Elanthius Flagstaff, Electro Burnstein, emiley tomsen, Escort DeFarge, Eva Rau, Ezian Ecksol, Fire Centaur, Fluf Fredriksson, Francisco Koolhoven, Frontera Thor, Frungi Stastny, Gally Young, gearsawe stonecutter, Gigs Taggart, Gordon Wendt, Gudmund Shepherd, Gypsy Paz, Harleen Gretzky, Henri Beauchamp, Inma Rau, Irene Muni, Aralara Rajal, Aura Dirval, Cayu Cluny, Eva Rau, FreeSL Aeon, Frontera Thor, Inma Rau, Lunita Savira, Minerva Memel, Polo Gufler, Xiki Luik, Iskar Ariantho, Jacek Antonelli, JB Kraft, Jessicka Graves, Joeseph Albanese, Joshua Philgarlic, Khyota Wulluf, kirstenlee Cinquetti, Latif Khalifa, Lex Neva, Lilibeth Andree, Lisa Lowe, Lunita Savira, Loosey Demonia, lum pfohl, Marcos Fonzarelli, MartinRJ Fayray, Marusame Arai, Matthew Dowd, Maya Remblai, McCabe Maxsted, Meghan Dench, Melchoir Tokhes, Menos Short, Michelle2 Zenovka, Mimika Oh, Minerva Memel, Mm Alder, Ochi Wolfe, Omei Turnbull, Pesho Replacement, Phantom Ninetails, phoenixflames kukulcan, Polo Gufler, prez pessoa, princess niven, Prokofy Neva, Qie Niangao, Rem Beattie, RodneyLee Jessop, Saijanai Kuhn, Seg Baphomet, Sergen Davies, Shirley Marquez, SignpostMarv Martin, Sindy Tsure, Sira Arbizu, Skips Jigsaw, Sougent Harrop, Spritely Pixel, Squirrel Wood, StarSong Bright, Subversive Writer, Sugarcult Dagger, Sylumm Grigorovich, Tammy Nowotny, Tanooki Darkes, Tayra Dagostino, Theoretical Chemistry, Thickbrick Sleaford, valerie rosewood, Vex Streeter, Vixen Heron, Whoops Babii, Winter Ventura, Xiki Luik, Yann Dufaux, Yina Yao, Yukinoroh Kamachi, Zolute Infinity, Zwagoth Klaar
-
-
-
-To be a success in business, be daring, be first, be different. --Henry Marchant
- </text_editor>
- </panel>
- <panel label="Licenties" name="licenses_panel">
- <text_editor name="credits_editor">
- 3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion
-APR Copyright (C) 2000-2004 The Apache Software Foundation
-cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)
-DBus/dbus-glib Copyright (C) 2002, 2003 CodeFactory AB / Copyright (C) 2003, 2004
-Red Hat, Inc. expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.
-FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org).
-GL Copyright (C) 1999-2004 Brian Paul.
-Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.
-jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)
-jpeglib Copyright (C) 1991-1998, Thomas G. Lane.
-ogg/vorbis Copyright (C) 2001, Xiphophorus
-OpenSSL Copyright (C) 1998-2002 The OpenSSL Project.
-SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
-SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
-xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
-zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler.
-google-perftools Copyright (c) 2005, Google Inc.
-
-All rights reserved. See licenses.txt for details.
-
-Voice chat Audio coding: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
- </text_editor>
- </panel>
- </tab_container>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_about_land.xml b/indra/newview/skins/default/xui/nl/floater_about_land.xml
deleted file mode 100644
index 4271ad5b82..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_about_land.xml
+++ /dev/null
@@ -1,492 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floaterland" title="OVER LAND">
- <tab_container name="landtab">
- <panel label="Algemeen" name="land_general_panel">
- <text name="Name:">
- Naam:
- </text>
- <text name="Description:">
- Omschrijving:
- </text>
- <text name="LandType">
- Type:
- </text>
- <text name="LandTypeText" left="102">
- Mainland / Homestead
- </text>
- <text name="ContentRating" width="98">
- Inhoudscategorie:
- </text>
- <text name="ContentRatingText" left="102">
- Adult
- </text>
- <text name="Owner:">
- Eigenaar:
- </text>
- <text name="OwnerText" left="102" width="242">
- Leyla Linden
- </text>
- <button label="Profiel" name="Profile..."/>
- <text name="Group:">
- Groep:
- </text>
- <text left="102" name="GroupText" width="242"/>
- <button label="Instellen" name="Set..."/>
- <check_box label="Overdracht aan groep toestaan" name="check deed" tool_tip="Een groepofficier kan dit land aan de groep overdragen, zodat het ondersteund wordt door de landallocatie van de groep."/>
- <button label="Overdragen" name="Deed..." tool_tip="U mag alleen land overdragen indien u een officier bent in de geselecteerde groep."/>
- <check_box label="Eigenaar maakt bijdrage met overdracht" name="check contrib" tool_tip="Wanneer het land is overgedragen aan de groep, draagt de voormalig eigenaar voldoende landtoewijzing bij om het te ondersteunen."/>
- <text name="For Sale:">
- Te koop:
- </text>
- <text name="Not for sale.">
- Niet te koop.
- </text>
- <text name="For Sale: Price L$[PRICE].">
- Prijs: L$[PRICE] (L$[PRICE_PER_SQM]/m²).
- </text>
- <button label="Verkoop land" name="Sell Land..."/>
- <text name="For sale to">
- Te koop voor: [BUYER]
- </text>
- <text name="Sell with landowners objects in parcel.">
- Objecten opgenomen in verkoop
- </text>
- <text name="Selling with no objects in parcel." width="196">
- Objecten niet opgenomen in verkoop
- </text>
- <button label="Annuleer landverkoop" label_selected="Annuleer landverkoop" name="Cancel Land Sale"/>
- <text name="Claimed:">
- Geclaimd:
- </text>
- <text name="DateClaimText">
- Tue Aug 15 13:47:25 2006
- </text>
- <text name="PriceLabel">
- Gebied:
- </text>
- <text name="PriceText">
- 4048 m²
- </text>
- <text name="Traffic:">
- Verkeer:
- </text>
- <text name="DwellText">
- 0
- </text>
- <button left="130" width="125" label="Koop land..." label_selected="Koop land..." name="Buy Land..."/>
- <button label="Koop voor groep" name="Buy For Group..."/>
- <button left="130" width="125" label="Koop toegangspas..." label_selected="Koop toegangspas..." name="Buy Pass..." tool_tip="Een toegangspas geeft u tijdelijk toegang tot dit land."/>
- <button label="Land Afstaan" name="Abandon Land..."/>
- <button label="Land terugvorderen" name="Reclaim Land..."/>
- <button label="Lindenverkoop" name="Linden Sale..." tool_tip="Land moet in bezit zijn, de inhoud moet ingesteld zijn en niet al ter veiling zijn aangeboden."/>
- <panel.string name="new users only">
- Alleen nieuwe gebruikers
- </panel.string>
- <panel.string name="anyone">
- Iedereen
- </panel.string>
- <panel.string name="area_text">
- Gebied
- </panel.string>
- <panel.string name="area_size_text">
- [AREA] m²
- </panel.string>
- <panel.string name="auction_id_text">
- Veiling ID: [ID]
- </panel.string>
- <panel.string name="need_tier_to_modify">
- U dient uw aankoop te goedkeuren voor u dit land kunt wijzigen.
- </panel.string>
- <panel.string name="group_owned_text">
- (Groepseigendom)
- </panel.string>
- <panel.string name="profile_text">
- Profiel...
- </panel.string>
- <panel.string name="info_text">
- Informatie...
- </panel.string>
- <panel.string name="public_text">
- (public)
- </panel.string>
- <panel.string name="none_text">
- (none)
- </panel.string>
- <panel.string name="sale_pending_text">
- (Verkoop bezig)
- </panel.string>
- <panel.string name="no_selection_text">
- Geen perceel geselecteerd. Ga naar Wereld menu &gt; Over land of selecteer een ander perceel om zijn details te tonen.
- </panel.string>
- </panel>
- <panel label="Convenant" name="land_covenant_panel">
- <text name="estate_section_lbl">
- Estate:
- </text>
- <text name="estate_name_lbl">
- Naam:
- </text>
- <text name="estate_name_text">
- mainland
- </text>
- <text name="estate_owner_lbl">
- Eigenaar:
- </text>
- <text name="estate_owner_text">
- (none)
- </text>
- <text_editor name="covenant_editor">
- Er is geen convenant voorzien voor dit estate.
- </text_editor>
- <text name="covenant_timestamp_text">
- Laatst gewijzigd Wed Dec 31 16:00:00 1969
- </text>
- <text name="region_section_lbl">
- Regio:
- </text>
- <text name="region_name_lbl">
- Naam:
- </text>
- <text name="region_name_text">
- leyla
- </text>
- <text name="region_landtype_lbl">
- Type:
- </text>
- <text name="region_landtype_text">
- Mainland / Homestead
- </text>
- <text name="region_maturity_lbl">
- Inhoudscategorie:
- </text>
- <text name="region_maturity_text">
- Adult
- </text>
- <text name="resellable_lbl">
- Doorverkopen:
- </text>
- <text name="resellable_clause">
- Land in deze regio mag niet worden doorverkocht.
- </text>
- <text name="changeable_lbl">
- Opsplitsen:
- </text>
- <text name="changeable_clause">
- Land in deze regio mag niet worden samengevoegd/opgesplitst.
- </text>
- <panel.string name="can_resell">
- Aangekocht land in deze regio mag worden doorverkocht.
- </panel.string>
- <panel.string name="can_not_resell">
- Aangekocht land in deze regio mag niet worden doorverkocht.
- </panel.string>
- <panel.string name="can_change">
- Aangekocht land in deze regio mag worden samengevoegd of
-opgedeeld.
- </panel.string>
- <panel.string name="can_not_change">
- Aangekocht land in deze regio mag niet worden samengevoegd
-of opgedeeld.
- </panel.string>
- </panel>
- <panel label="Objecten" name="land_objects_panel">
- <text name="parcel_object_bonus">
- Regio object bonus factor: [BONUS]
- </text>
- <text name="Simulator primitive usage:">
- Simulator primitieven gebruik:
- </text>
- <text name="objects_available">
- [COUNT] van [MAX] ([AVAILABLE] beschikbaar)
- </text>
- <panel.string name="objects_available_text">
- [COUNT] van [MAX] ([AVAILABLE] beschikbaar)
- </panel.string>
- <panel.string name="objects_deleted_text">
- [COUNT] van [MAX] ([DELETED] zullen worden verwijderd)
- </panel.string>
- <text name="Primitives parcel supports:">
- Primitieven ondersteund door perceel:
- </text>
- <text name="object_contrib_text">
- [COUNT]
- </text>
- <text name="Primitives on parcel:">
- Primitieven op perceel:
- </text>
- <text name="total_objects_text" >
- [COUNT]
- </text>
- <text name="Owned by parcel owner:" >
- Eigendom van perceeleigenaar:
- </text>
- <text name="owner_objects_text" >
- [COUNT]
- </text>
- <button label="Toon" label_selected="Toon" name="ShowOwner"/>
- <button label="Retourneren" name="ReturnOwner..." tool_tip="Retourneer objecten naar hun eigenaren."/>
- <text name="Set to group:" >
- Groep toewijzen:
- </text>
- <text name="group_objects_text" >
- [COUNT]
- </text>
- <button label="Toon" label_selected="Toon" name="ShowGroup"/>
- <button label="Retourneren" name="ReturnGroup..." tool_tip="Retourneer objecten naar hun eigenaren."/>
- <text name="Owned by others:">
- Eigendom van anderen:
- </text>
- <text name="other_objects_text" >
- [COUNT]
- </text>
- <button label="Toon" label_selected="Toon" name="ShowOther"/>
- <button label="Retourneren" name="ReturnOther..." tool_tip="Retourneer objecten naar hun eigenaren."/>
- <text name="Selected / sat upon:">
- Geselecteerd/Er op gezeten
- </text>
- <text name="selected_objects_text" >
- [COUNT]
- </text>
- <text name="Autoreturn">
- Objecten van andere inwoners automatisch retourneren (minuten):
- (0 om uit te schakelen)
- </text>
- <line_editor name="clean other time"/>
- <text name="Object Owners:">
- Objecteigenaren:
- </text>
- <button label="Ververs lijst" label_selected="Ververs lijst" name="Refresh List"/>
- <button label="Retourneer objecten" name="Return objects..."/>
- <name_list name="owner list">
- <column label="Type" name="type"/>
- <column label="Naam" name="name"/>
- <column label="Aantal" name="count"/>
- <column label="Meest recent" name="mostrecent"/>
- </name_list>
- </panel>
- <panel label="Opties" name="land_options_panel">
- <text name="allow_label">
- Andere inwoners toestaan te:
- </text>
- <check_box label="Terrein bewerken" name="edit land check" tool_tip="Indien aangevinkt, kan iedereen uw terrein bewerken. Het is het beste om dit uit te laten staan, omdat u zelf altijd uw eigen land kunt bewerken."/>
- <check_box label="Maak landmarkering" name="check landmark"/>
- <check_box label="Vliegen" name="check fly" tool_tip="Indien aangevinkt, kunnen inwoners op uw land vliegen. Indien niet aangevinkt, kunnen ze alleen het land binnenvliegen of eroverheen vliegen."/>
- <text name="allow_label2">
- Maak objecten:
- </text>
- <check_box label="Alle inwoners" name="edit objects check"/>
- <check_box label="Groep" name="edit group objects check"/>
- <text name="allow_label3">
- Objecten binnenlaten:
- </text>
- <check_box label="Alle inwoners" name="all object entry check"/>
- <check_box label="Groep" name="group object entry check"/>
- <text name="allow_label4">
- Scripts uitvoeren:
- </text>
- <check_box label="Alle inwoners" name="check other scripts"/>
- <check_box label="Groep" name="check group scripts"/>
- <text name="land_options_label">
- Landopties:
- </text>
- <check_box label="Veilig (geen letsel)" name="check safe" tool_tip="Indien aangevinkt, wordt het land op Veilig ingesteld, waarmee letselgevechten worden uitgeschakeld. Indien niet aangevinkt, is letsel ingeschakeld."/>
- <check_box label="Niet duwen" name="PushRestrictCheck" tool_tip="Weerhoudt scripts van duwen. Het aanvinken van deze optie kan handig zijn om storend gedrag op uw land te voorkomen."/>
- <check_box label="Toon plaats in Zoeken (L$30/week) onder" name="ShowDirectoryCheck" tool_tip="Laat mensen dit perceel zien in zoekresultaten."/>
- <panel.string name="search_enabled_tooltip">
- Laat mensen dit perceel zien in zoekresultaten
- </panel.string>
- <panel.string name="search_disabled_small_tooltip">
- Deze optie is uitgeschakeld, omdat dit gebied 128 m² of kleiner is. Alleen grote percelen kunnen worden opgenomen in Zoeken.
- </panel.string>
- <panel.string name="search_disabled_permissions_tooltip">
- Deze optie is uitgeschakeld omdat u de opties van dit perceel niet kunt wijzigen.
- </panel.string>
- <combo_box name="land category with adult">
- <combo_box.item name="item0" label="Alle Categorieën"
- />
- <combo_box.item name="item1" label="Linden locatie"
- />
- <combo_box.item name="item2" label="Adult"
- />
- <combo_box.item name="item3" label="Kunst &amp; Cultuur"
- />
- <combo_box.item name="item4" label="Zakelijk"
- />
- <combo_box.item name="item5" label="Educatief"
- />
- <combo_box.item name="item6" label="Spelen"
- />
- <combo_box.item name="item7" label="Ontmoetingsplaats"
- />
- <combo_box.item name="item8" label="Nieuwkomervriendelijk"
- />
- <combo_box.item name="item9" label="Parken &amp; natuur"
- />
- <combo_box.item name="item10" label="Woongebied"
- />
- <combo_box.item name="item11" label="Winkelen"
- />
- <combo_box.item name="item12" label="Anders"
- />
- </combo_box>
- <combo_box name="land category">
- <combo_box.item name="item0" label="Alle categorieën"
- />
- <combo_box.item name="item1" label="Linden Locatie"
- />
- <combo_box.item name="item3" label="Kunst &amp; Cultuur"
- />
- <combo_box.item name="item4" label="Zakelijk"
- />
- <combo_box.item name="item5" label="Educatief"
- />
- <combo_box.item name="item6" label="Spelen"
- />
- <combo_box.item name="item7" label="Ontmoetingsplaats"
- />
- <combo_box.item name="item8" label="Nieuwkomervriendelijk"
- />
- <combo_box.item name="item9" label="Parken &amp; Natuur"
- />
- <combo_box.item name="item10" label="Woongebied"
- />
- <combo_box.item name="item11" label="Winkelen"
- />
- <combo_box.item name="item12" label="Anders"
- />
- </combo_box>
- <button label="?" label_selected="?" name="?"/>
- <check_box label="Mature inhoud" name="MatureCheck" tool_tip=" "/>
- <panel.string name="mature_check_mature">
- Mature inhoud
- </panel.string>
- <panel.string name="mature_check_adult">
- Adult inhoud
- </panel.string>
- <panel.string name="mature_check_mature_tooltip">
- Uw perceelinformatie of -inhoud wordt beschouwd als mature.
- </panel.string>
- <panel.string name="mature_check_adult_tooltip">
- Uw perceelinformatie of -inhoud wordt beschouwd als adult.
- </panel.string>
- <text name="Snapshot:">
- Foto:
- </text>
- <texture_picker label="" name="snapshot_ctrl" tool_tip="Klik om een afbeelding te kiezen"/>
- <text name="landing_point">
- Landingsplaats: [LANDING]
- </text>
- <panel.string name="landing_point_none">
- (none)
- </panel.string>
- <button label="Instellen" label_selected="Instellen" name="Set" tool_tip="Stelt het landingspunt in waar bezoekers arriveren. Wordt ingesteld op uw avatar&apos;s positie binnen dit perceel."/>
- <button label="Opschonen" label_selected="Opschonen" name="Clear" tool_tip="Landingspunt leegmaken"/>
- <text name="Teleport Routing: ">
- Teleport routering:
- </text>
- <combo_box name="landing type" tool_tip="Teleport routering -- selecteer hoe teleports naar uw land moeten worden afgehandeld.">
- <combo_box.item name="Blocked" label="Geblokkeerd"
- />
- <combo_box.item name="LandingPoint" label="Landingsplaats"
- />
- <combo_box.item name="Anywhere" label="Overal"
- />
- </combo_box>
- <panel.string name="push_restrict_text">
- Niet duwen
- </panel.string>
- <panel.string name="push_restrict_region_text">
- Niet duwen (ingesteld op regio)
- </panel.string>
- </panel>
- <panel label="Media" name="land_media_panel">
- <text name="with media:">
- Media type:
- </text>
- <combo_box name="media type" tool_tip="Specificeer of de URL een film, webpagina of andere media is"/>
- <text name="at URL:">
- Media URL:
- </text>
- <button label="Instellen" name="set_media_url"/>
- <text name="Description:">
- Omschrijving:
- </text>
- <line_editor name="url_description" tool_tip="Tekst wordt naast afspelen/laden knop weergegeven"/>
- <text name="Media texture:">
- Vervang
-textuur:
- </text>
- <texture_picker label="" name="media texture" tool_tip="Klik om een afbeelding te kiezen"/>
- <text name="replace_texture_help">
- (Objecten die deze textuur gebruiken zullen de film
-of de webpagina tonen nadat u het afspelen-pijltje
-hebt geklikt.)
- </text>
- <text name="Options:">
- Media opties:
- </text>
- <check_box label="Automatisch schalen" name="media_auto_scale" tool_tip="Het aanvinken van deze optie zal de inhoud voor dit perceel automatisch schalen. Het kan enigszins trager zijn en de visuele kwaliteit kan iets lager zijn, maar er zal geen andere textuurschaling of uitlijning nodig zijn."/>
- <check_box label="Herhaal media" name="media_loop" tool_tip="Speel media af in een lus. Wanneer de media klaar is met afspelen zal het herstarten vanaf het begin."/>
- <check_box label="Verberg media URL" name="hide_media_url" tool_tip="Het aanvinken van deze optie zal de media URL verbergen voor alle niet-geautoriseerde bekijkers van de perceelinformatie. Let op: dit is niet beschikbaar voor HTML types."/>
- <check_box label="Verberg muziek URL" name="hide_music_url" tool_tip="Het aanvinken van deze optie zal de muziek URL verbergen voor alle niet-geautoriseerde bekijkers van de perceelinformatie."/>
- <text name="media_size" tool_tip="Grootte om webmedia weer te geven, laat op 0 staan voor standaard." width="120">
- Media grootte:
- </text>
- <spinner left_delta="90" name="media_size_width" tool_tip="Grootte om webmedia weer te geven, laat op 0 staan voor standaard."/>
- <spinner name="media_size_height" tool_tip="Grootte om webmedia weer te geven, laat op 0 staan voor standaard."/>
- <text name="pixels">
- pixels
- </text>
- <text name="MusicURL:">
- Muziek URL:
- </text>
- <text name="Sound:">
- Geluid:
- </text>
- <check_box label="Beperk gebaar- en objectgeluiden tot dit perceel" name="check sound local"/>
- <button label="?" label_selected="?" name="?"/>
- <text name="Voice settings:">
- Voice:
- </text>
- <check_box label="Voice inschakelen" name="parcel_enable_voice_channel"/>
- <check_box label="Voice inschakelen (ingesteld in Estate)" name="parcel_enable_voice_channel_is_estate_disabled"/>
- <check_box label="Beperk voice tot dit perceel" name="parcel_enable_voice_channel_parcel"/>
- </panel>
- <panel label="Toegang" name="land_access_panel">
- <text name="Limit access to this parcel to:">
- Toegang tot dit perceel
- </text>
- <check_box label="Publieke toegang toestaan" name="public_access"/>
- <text name="Only Allow">
- Blokkeer toegang door:
- </text>
- <check_box label="Inwoners die geen betalingsinformatie hebben gegeven aan Linden Lab" name="limit_payment" tool_tip="Verban ongeïdentificeerde inwoners."/>
- <check_box label="Inwoners die geen leeftijdgeverifieerde volwassenen zijn" name="limit_age_verified" tool_tip="Verban inwoners die hun leeftijd niet geverifieerd hebben. Zie support.secondlife.com voor meer informatie."/>
- <panel.string name="estate_override">
- Een of meer van deze opties is op estate-niveau ingesteld
- </panel.string>
- <check_box label="Groepstoegang toestaan: [GROUP]" name="GroupCheck" tool_tip="Stel de groep in op het tabblad Algemeen"/>
- <check_box label="Verkoop toegangspassen aan:" name="PassCheck" tool_tip="Tijdelijke toegang tot dit perceel toestaan"/>
- <combo_box name="pass_combo" left_delta="190">
- <combo_box.item name="Anyone" label="Iedereen"
- />
- <combo_box.item name="Group" label="Groep"
- />
- </combo_box>
- <spinner label="Prijs in L$:" name="PriceSpin" label_width="168" />
- <spinner label="Toegangsuren" name="HoursSpin" label_width="168" />
- <text label="Altijd toestaan" name="AllowedText">
- Toegestane inwoners
- </text>
- <name_list name="AccessList" tool_tip="([LISTED] vermeld, [MAX] max)"/>
- <button label="Toevoegen..." label_selected="Toevoegen..." name="add_allowed"/>
- <button label="Verwijderen" label_selected="Verwijderen" name="remove_allowed"/>
- <text label="Verbannen" name="BanCheck">
- Verbannen inwoners
- </text>
- <name_list name="BannedList" tool_tip="([LISTED] vermeld, [MAX] max)"/>
- <button label="Toevoegen..." label_selected="Toevoegen..." name="add_banned"/>
- <button label="Verwijderen" label_selected="Verwijderen" name="remove_banned"/>
- </panel>
- </tab_container>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_animation_preview.xml b/indra/newview/skins/default/xui/nl/floater_animation_preview.xml
deleted file mode 100644
index f4e9908150..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_animation_preview.xml
+++ /dev/null
@@ -1,85 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Animation Preview" title="">
- <text name="name_label">
- Naam:
- </text>
- <text name="description_label">
- Omschrijving:
- </text>
- <spinner label="Prioriteit" name="priority" tool_tip="Bepaalt welke andere animaties kunnen worden overschaduwd door deze animatie."/>
- <check_box label="Herhalen" name="loop_check" tool_tip="Laat deze animatie herhalen."/>
- <spinner label="In(%)" name="loop_in_point" tool_tip="Instellen punt in de animatie waar de herhaling begint."/>
- <spinner label="Uit(%)" name="loop_out_point" tool_tip="Instellen punt in in de animatie waar de herhaling eindigt."/>
- <text name="hand_label">
- Houding van Hand
- </text>
- <combo_box label="" left_delta="100" width="176" name="hand_pose_combo" tool_tip="Bepaalt wat handen doen tijdens een animatie." left="300">
- <combo_box.item name="Spread" label="Gespreid"/>
- <combo_box.item name="Relaxed" label="Ontspannen"/>
- <combo_box.item name="PointBoth" label="Wijzen Beide"/>
- <combo_box.item name="Fist" label="Vuist"/>
- <combo_box.item name="RelaxedLeft" label="Ontspannen Links"/>
- <combo_box.item name="PointLeft" label="Wijzen Links"/>
- <combo_box.item name="FistLeft" label="Vuist Links"/>
- <combo_box.item name="RelaxedRight" label="Ontspannen Rechts"/>
- <combo_box.item name="PointRight" label="Wijzen Rechts"/>
- <combo_box.item name="FistRight" label="Vuist Rechts"/>
- <combo_box.item name="SaluteRight" label="Salueren Rechts"/>
- <combo_box.item name="Typing" label="Typen"/>
- <combo_box.item name="PeaceRight" label="Peace Rechts"/>
- </combo_box>
- <text name="emote_label">
- Expressie
- </text>
- <combo_box label="" left_delta="100" width="176" name="emote_combo" tool_tip="Bepaalt wat het gezicht doet tijdens de animatie.">
- <combo_box.item name="[None]" label="Geen]"/>
- <combo_box.item name="Aaaaah" label="Aaaaah"/>
- <combo_box.item name="Afraid" label="Bang"/>
- <combo_box.item name="Angry" label="Boos"/>
- <combo_box.item name="BigSmile" label="Brede Lach"/>
- <combo_box.item name="Bored" label="Verveeld"/>
- <combo_box.item name="Cry" label="Huilen"/>
- <combo_box.item name="Disdain" label="Minachting"/>
- <combo_box.item name="Embarrassed" label="Beschaamd"/>
- <combo_box.item name="Frown" label="Frons"/>
- <combo_box.item name="Kiss" label="Kus"/>
- <combo_box.item name="Laugh" label="Lachen"/>
- <combo_box.item name="Plllppt" label="Plllppt"/>
- <combo_box.item name="Repulsed" label="Afkeer"/>
- <combo_box.item name="Sad" label="Verdrietig"/>
- <combo_box.item name="Shrug" label="Onverschillig"/>
- <combo_box.item name="Smile" label="Glimlach"/>
- <combo_box.item name="Surprise" label="Verrassing"/>
- <combo_box.item name="Wink" label="Knipoog"/>
- <combo_box.item name="Worry" label="Bezorgd"/>
- </combo_box>
- <text name="preview_label">
- Voorvertoning
- </text>
- <combo_box label="" left_delta="100" width="176" name="preview_base_anim" tool_tip="Gebruik dit om het gedrag van uw animatie te testen terwijl uw avatar veelvoorkomende acties uitvoert.">
- <combo_box.item name="Standing" label="Staand"/>
- <combo_box.item name="Walking" label="Lopend"/>
- <combo_box.item name="Sitting" label="Zittend"/>
- <combo_box.item name="Flying" label="Vliegend"/>
- </combo_box>
- <spinner label="Invloeitijd (sec)" label_width="125" name="ease_in_time" tool_tip="Hoeveelheid tijd (in seconden) waarover animaties invloeien." width="192"/>
- <spinner bottom_delta="-20" label="Uitvloeitijd (sec)" label_width="125" left="10" name="ease_out_time" tool_tip="Hoeveelheid tijd (in seconden) waarover animaties uitvloeien." width="192"/>
- <button bottom_delta="-32" label="" name="play_btn" tool_tip="Start/pauzeer uw animatie."/>
- <button label="" name="stop_btn" tool_tip="Stop het afspelen van Uw animatie"/>
- <text name="bad_animation_text">
- Niet in staat om het animatiebestand te lezen. Wij
-raden u aan bestanden te gebruiken die vanuit
-Poser 4 zijn geëxporteerd.
- </text>
- <button label="Annuleren" name="cancel_btn"/>
- <button label="Upload (L$[AMOUNT])" name="ok_btn" width="140" left_delta="-155"/>
- <string name="failed_to_initialize">
- Het initialiseren van de beweging is mislukt.
- </string>
- <string name="anim_too_long">
- het animatiebestand heeft een lengte van [LENGTH] seconden. De maximale lengte van een animatie is [MAX_LENGTH] seconden.
- </string>
- <string name="failed_file_read">
- Kan animatiebestand niet lezen. [STATUS]
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_auction.xml b/indra/newview/skins/default/xui/nl/floater_auction.xml
deleted file mode 100644
index 611024699b..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_auction.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_auction" title="START LINDEN LAND VERKOOP">
- <check_box label="Voeg geel selectie kader toe" name="fence_check"/>
- <button label="Foto" label_selected="Foto" name="snapshot_btn"/>
- <button label="OK" label_selected="OK" name="ok_btn"/>
- <string name="already for sale">
- U kunt geen percelen veilen die al te koop staan.
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_avatar_picker.xml b/indra/newview/skins/default/xui/nl/floater_avatar_picker.xml
deleted file mode 100644
index 260cc8e98f..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_avatar_picker.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="avatarpicker" title="KIES INWONER">
- <tab_container name="ResidentChooserTabs">
- <panel label="Zoeken" name="SearchPanel">
- <text name="InstructSearchResidentName">
- Type een deel van de naam van de inwoner:
- </text>
- <button label="Zoek" label_selected="Zoek" name="Find"/>
- </panel>
- <panel label="Visitekaartjes" name="CallingCardsPanel">
- <text name="InstructSelectCallingCard">
- Selecteer een visitekaartje:
- </text>
- </panel>
- <panel label="In mijn buurt" name="NearMePanel">
- <text name="InstructSelectResident">
- Selecteer een inwoner
-in de buurt:
- </text>
- <button label="Vernieuw lijst" label_selected="Ververs lijst" name="Refresh"/>
- <slider label="Afstand" name="near_me_range" bottom_delta="-36"/>
- <text name="meters">
- Meters
- </text>
- <scroll_list bottom_delta="-169" height="159" name="NearMe" />
- </panel>
- </tab_container>
- <button label="Selecteer" label_selected="Selecteer" name="Select"/>
- <button label="Annuleren" label_selected="Annuleren" name="Cancel"/>
- <string name="not_found">
- &apos;[TEXT]&apos; niet gevonden
- </string>
- <string name="no_one_near">
- Niemand in de buurt
- </string>
- <string name="no_results">
- Geen resultaten
- </string>
- <string name="searching">
- Zoeken...
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_avatar_textures.xml b/indra/newview/skins/default/xui/nl/floater_avatar_textures.xml
deleted file mode 100644
index a44db95b5b..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_avatar_textures.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="avatar_texture_debug" title="AVATAR TEXTUREN">
- <text name="baked_label">
- Baked texturen
- </text>
- <text name="composite_label">
- Samengestelde texturen
- </text>
- <texture_picker label="Hoofd" name="baked_head"/>
- <texture_picker label="Make-up" name="head_bodypaint"/>
- <texture_picker label="Haar" name="hair"/>
- <button label="Dump" label_selected="Dump" name="Dump"/>
- <texture_picker label="Ogen" name="baked_eyes"/>
- <texture_picker label="Oog" name="eye_texture"/>
- <texture_picker label="Bovenlichaam" name="baked_upper_body"/>
- <texture_picker label="Bovenlichaam tatoeage" name="upper_bodypaint"/>
- <texture_picker label="Onderhemd" name="undershirt"/>
- <texture_picker label="Handschoenen" name="gloves"/>
- <texture_picker label="Hemd" name="shirt"/>
- <texture_picker label="Bovenkant jas" name="upper_jacket"/>
- <texture_picker label="Onderlichaam" name="baked_lower_body"/>
- <texture_picker label="Onderlichaam tatoeage" name="lower_bodypaint"/>
- <texture_picker label="Onderbroek" name="underpants"/>
- <texture_picker label="Sokken" name="socks"/>
- <texture_picker label="Schoenen" name="shoes"/>
- <texture_picker label="Broek" name="pants"/>
- <texture_picker label="Jas" name="jacket"/>
- <texture_picker label="Rok" name="baked_skirt"/>
- <texture_picker label="Rok" name="skirt_texture"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_beacons.xml b/indra/newview/skins/default/xui/nl/floater_beacons.xml
deleted file mode 100644
index ecc485e354..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_beacons.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="beacons" title="BAKENS">
- <panel name="beacons_panel">
- <check_box label="Gescripte objecten met alleen Aanraken" name="touch_only"/>
- <check_box label="Gescripte objecten" name="scripted"/>
- <check_box label="Fysieke objecten" name="physical"/>
- <check_box label="Geluidsbronnen" name="sounds"/>
- <check_box label="Particlebronnen" name="particles"/>
- <check_box label="Markeringen weergeven" name="highlights"/>
- <check_box label="Bakens weergeven" name="beacons"/>
- <text name="beacon_width_label">
- Bakenbreedte:
- </text>
- </panel>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_build_options.xml b/indra/newview/skins/default/xui/nl/floater_build_options.xml
deleted file mode 100644
index 53b60167bb..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_build_options.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="build options floater" title="GRID OPTIES">
- <spinner label="Grid eenheid (meters)" name="GridResolution" width="180" label_width="122"/>
- <spinner label="Grid extensies (meters)" name="GridDrawSize" width="180" label_width="122"/>
- <check_box label="Sub-eenheid snap Inschakelen" name="GridSubUnit"/>
- <check_box label="Toon dwarsdoorsnede" name="GridCrossSection"/>
- <slider label="Grid opaakheid" name="GridOpacity"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_bulk_perms.xml b/indra/newview/skins/default/xui/nl/floater_bulk_perms.xml
deleted file mode 100644
index 5374ffc26a..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_bulk_perms.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floaterbulkperms" title="BULK WIJZIGEN INHOUD PERMISSIES">
- <text name="applyto">
- Inhoud Typen
- </text>
- <check_box label="Animatie" name="check_animation"/>
- <check_box label="Lichaamsdelen" name="check_bodypart"/>
- <check_box label="Kleding" name="check_clothing"/>
- <check_box label="Gebaren" name="check_gesture"/>
- <check_box label="Landmarkeringen" name="check_landmark"/>
- <check_box label="Notitiekaarten" name="check_notecard"/>
- <check_box label="Objecten" name="check_object"/>
- <check_box label="Scripts" name="check_script"/>
- <check_box label="Geluiden" name="check_sound"/>
- <check_box label="Texturen" name="check_texture"/>
- <button label="Alles aanvinken" label_selected="Alles" name="check_all"/>
- <button label="Alles ontvinken" label_selected="Geen" name="check_none"/>
- <text name="newperms">
- Nieuwe permissies
- </text>
- <check_box label="Delen met groep" name="share_with_group"/>
- <check_box label="Iedereen mag kopiëren" name="everyone_copy"/>
- <text name="NextOwnerLabel">
- Volgende eigenaar kan:
- </text>
- <check_box label="Wijzigen" name="next_owner_modify"/>
- <check_box label="Kopiëren" name="next_owner_copy"/>
- <check_box label="Verkopen/Weggeven" name="next_owner_transfer"/>
- <button label="Help" name="help"/>
- <button label="Toepassen" name="apply"/>
- <button label="Sluiten" name="close"/>
- <string name="nothing_to_modify_text">
- Selectie bevat geen bewerkbare inhoud.
- </string>
- <string name="status_text">
- Permissies instellen op [NAME]
- </string>
- <string name="start_text">
- Starten permissie wijzigings verzoeken...
- </string>
- <string name="done_text">
- Beïndigd permissie wijzigings verzoeken.
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_bumps.xml b/indra/newview/skins/default/xui/nl/floater_bumps.xml
deleted file mode 100644
index 516b59658d..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_bumps.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_bumps" title="BOTSINGEN, DUWEN &amp; SLAAN">
- <string name="none_detected">
- Geen gedetecteerd
- </string>
- <string name="bump">
- [TIME] [NAME] botste tegen u aan
- </string>
- <string name="llpushobject">
- [TIME] [NAME] duwde u met een script
- </string>
- <string name="selected_object_collide">
- [TIME] [NAME] raakte u met een object
- </string>
- <string name="scripted_object_collide">
- [TIME] [NAME] raakte u met een gescript object
- </string>
- <string name="physical_object_collide">
- [TIME] [NAME] raakte u met een fysiek object
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_buy_contents.xml b/indra/newview/skins/default/xui/nl/floater_buy_contents.xml
deleted file mode 100644
index 4c0ff7d04a..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_buy_contents.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_buy_contents" title="KOOP INHOUD">
- <text name="contains_text">
- [NAME] bevat:
- </text>
- <text name="buy_text">
- Koop voor L$[AMOUNT] van [NAME]?
- </text>
- <button label="Annuleren" label_selected="Annuleren" name="cancel_btn" width="73"/>
- <button label="Koop" label_selected="Koop" name="buy_btn"/>
- <check_box label="Draag kleding nu" name="wear_check"/>
- <string name="no_copy_text">
- (niet kopiëren)
- </string>
- <string name="no_modify_text">
- (niet wijzigen)
- </string>
- <string name="no_transfer_text">
- (niet overdragen)
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_buy_currency.xml b/indra/newview/skins/default/xui/nl/floater_buy_currency.xml
deleted file mode 100644
index 6ee5cc5341..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_buy_currency.xml
+++ /dev/null
@@ -1,68 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="buy currency" title="KOOP VALUTA">
- <text name="info_buying">
- Valuta kopen
- </text>
- <text name="info_cannot_buy">
- Kan nu niet kopen
- </text>
- <text name="info_need_more">
- U heeft meer valuta nodig:
- </text>
- <text name="error_message">
- Er klopt iets niet.
- </text>
- <button label="Ga naar website" name="error_web"/>
- <text name="contacting">
- Contact maken met Lindex…
- </text>
- <text name="buy_action_unknown">
- Koop L$ op de LindeX valutabeurs
- </text>
- <text name="buy_action">
- [NAME] L$ [PRICE]
- </text>
- <text name="currency_action" width="48">
- Koop L$
- </text>
- <line_editor name="currency_amt" left_delta="53" width="75">
- 1234
- </line_editor>
- <text name="currency_est" left_delta="80">
- voor ong. [LOCALAMOUNT]
- </text>
- <text name="getting_data">
- Data ophalen…
- </text>
- <text name="balance_label">
- U heeft momenteel
- </text>
- <text name="balance_amount">
- L$ [AMT]
- </text>
- <text name="buying_label">
- U koopt
- </text>
- <text name="buying_amount">
- L$ [AMT]
- </text>
- <text name="total_label">
- Uw saldo zal zijn:
- </text>
- <text name="total_amount">
- L$ [AMT]
- </text>
- <text name="purchase_warning_repurchase" right="-8">
- Het bevestigen van deze aankoop zal alleen de valuta
-kopen. U dient de bewerking opnieuw uit te voeren.
- </text>
- <text name="purchase_warning_notenough" right="-8">
- U koopt niet voldoende valuta.
-Verhoog de hoeveelheid die gekocht moet worden.
- </text>
- <button label="Annuleren" name="cancel_btn"/>
- <button label="Kopen" name="buy_btn"/>
- <string name="buy_currency">
- Koop L$ [LINDENS] voor ong. [LOCALAMOUNT]
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_buy_land.xml b/indra/newview/skins/default/xui/nl/floater_buy_land.xml
deleted file mode 100644
index 04990e78db..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_buy_land.xml
+++ /dev/null
@@ -1,235 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="buy land" title="KOOP LAND">
- <text name="region_name_label">
- Regio:
- </text>
- <text name="region_name_text">
- (onbekend)
- </text>
- <text name="region_type_label">
- Type:
- </text>
- <text name="region_type_text">
- (onbekend)
- </text>
- <text name="estate_name_label">
- Estate:
- </text>
- <text name="estate_name_text">
- (onbekend)
- </text>
- <text name="estate_owner_label">
- Estate eigenaar:
- </text>
- <text name="estate_owner_text">
- (onbekend)
- </text>
- <text name="resellable_changeable_label">
- Aangekocht land in deze regio:
- </text>
- <text name="resellable_clause">
- Mag niet worden doorverkocht
- </text>
- <text name="changeable_clause">
- Mag niet worden samengevoegd/opgesplitst
- </text>
- <text name="covenant_text">
- U moet instemmen met het estate convenant:
- </text>
- <text left="470" name="covenant_timestamp_text"/>
- <text_editor name="covenant_editor">
- Laden...
- </text_editor>
- <check_box label="Ik ga akkoord met het hierboven &#10;beschreven convenant." name="agree_covenant"/>
- <text name="info_parcel_label">
- Perceel:
- </text>
- <text name="info_parcel">
- Scotopteryx 138,204
- </text>
- <text name="info_size_label">
- Grootte:
- </text>
- <text name="info_size">
- 1024 m²
- </text>
- <text name="info_price_label">
- Prijs:
- </text>
- <text name="info_price">
- L$ 1500
-(L$ 1.1/m²)
-verkocht met objecten
- </text>
- <text name="info_action">
- Het kopen van dit land zal:
- </text>
- <text name="error_message">
- Er is iets niet in orde.
- </text>
- <button label="Ga naar website" name="error_web"/>
- <text name="account_action">
- U upgraden naar een premium lidmaatschap
- </text>
- <text name="account_reason">
- Alleen premiumleden kunnen land bezitten.
- </text>
- <combo_box name="account_level">
- <combo_box.item name="US$9.95/month,billedmonthly" label="US$9.95/maand, gefactureerd per maand"/>
- <combo_box.item name="US$7.50/month,billedquarterly" label="US$7.50/maand, gefactureerd per kwartaal"/>
- <combo_box.item name="US$6.00/month,billedannually" label="US$6.00/maand, gefactureerd per jaar"/>
- </combo_box>
- <text name="land_use_action">
- Verhoog uw maandelijkse landgebruikskosten tot US$ 40/maand
- </text>
- <text name="land_use_reason">
- U bezit 1309 m² land.
-Dit perceel omvat 512 m² land.
- </text>
- <text name="purchase_action">
- Betaal Joe Resident L$4000 voor het land
- </text>
- <text name="currency_reason">
- U heeft L$2,100.
- </text>
- <text name="currency_action">
- Koop extra L$
- </text>
- <line_editor name="currency_amt">
- 1000
- </line_editor>
- <text name="currency_est">
- voor ong. US$ [AMOUNT2]
- </text>
- <text name="currency_balance">
- U heeft L$2,100.
- </text>
- <check_box label="Verwijder [AMOUNT] vierkante meters van uw groepsbijdrage." name="remove_contribution"/>
- <button label="Aankopen" name="buy_btn"/>
- <button label="Annuleren" name="cancel_btn"/>
- <string name="can_resell">
- Mag worden doorverkocht.
- </string>
- <string name="can_not_resell">
- Mag niet worden doorverkocht.
- </string>
- <string name="can_change">
- Mag worden samengevoegd of opgedeeld.
- </string>
- <string name="can_not_change">
- Mag niet worden samengevoegd of opgedeeld.
- </string>
- <string name="cant_buy_for_group">
- U heeft geen permissie om land te kopen voor uw actieve groep.
- </string>
- <string name="no_land_selected">
- Geen land geselecteerd
- </string>
- <string name="multiple_parcels_selected">
- Meerdere verschillende percelen geselecteerd. Probeer een kleiner gebied te selecteren.
- </string>
- <string name="no_permission">
- U heeft geen permissie om land te kopen voor uw actieve groep.
- </string>
- <string name="parcel_not_for_sale">
- Het geselecteerde perceel is niet te koop.
- </string>
- <string name="group_already_owns">
- De groep is al eigenaar van het perceel.
- </string>
- <string name="you_already_own">
- U bent al eigenaar van het perceel
- </string>
- <string name="set_to_sell_to_other">
- Het geselecteerde perceel staat te koop voor een andere partij.
- </string>
- <string name="no_public_land">
- Het geselecteerde gebied heeft geen publiek land.
- </string>
- <string name="not_owned_by_you">
- Land dat het eigendom is van een andere gebruiker is geselecteerd. Probeer een kleiner gebied te selecteren.
- </string>
- <string name="processing">
- Uw aankoop wordt verwerkt...
-
-(Dit kan een minuut of twee duren.)
- </string>
- <string name="fetching_error">
- Er is een fout opgetreden tijdens het ophalen van informatie over het kopen van het land.
- </string>
- <string name="buying_will">
- Het kopen van dit land zal:
- </string>
- <string name="buying_for_group">
- Land voor groep kopen zal:
- </string>
- <string name="cannot_buy_now">
- Kan nu niet kopen:
- </string>
- <string name="not_for_sale">
- Niet te koop:
- </string>
- <string name="none_needed">
- geen benodigd
- </string>
- <string name="must_upgrade">
- Uw account moet geüpgrade worden om land te bezitten.
- </string>
- <string name="cant_own_land">
- Uw account kan land bezitten.
- </string>
- <string name="land_holdings">
- U bezit [BUYER] vierkante meters land.
- </string>
- <string name="pay_to_for_land">
- Betaal L$ [AMOUNT] aan [SELLER] voor dit land
- </string>
- <string name="buy_for_US">
- Koop L$ [AMOUNT] voor ong. US$ [AMOUNT2],
- </string>
- <string name="parcel_meters">
- Dit perceel is [AMOUNT] vierkante meters.
- </string>
- <string name="premium_land">
- Dit land is premium, en zal worden belast als [AMOUNT] vierkante meters.
- </string>
- <string name="discounted_land">
- Dit land is gedisconteerd, en zal worden belast als [AMOUNT] vierkante meters.
- </string>
- <string name="meters_supports_object">
- [AMOUNT] vierkante meter
-ondersteunt [AMOUNT2] objecten
- </string>
- <string name="sold_with_objects">
- verkocht met objecten
- </string>
- <string name="sold_without_objects">
- objecten niet inbegrepen
- </string>
- <string name="info_price_string">
- L$ [PRICE]
-(L$ [PRICE_PER_SQM]/m²)
-[SOLD_WITH_OBJECTS]
- </string>
- <string name="insufficient_land_credits">
- De groep [GROUP] heeft voldoende bijdrage van landgebruikcredits nodig om dit perceel te dekken voordat de aankoop kan worden afgerond.
- </string>
- <string name="have_enough_lindens">
- U heeft L$ [AMOUNT], wat genoeg is om dit land te kopen.
- </string>
- <string name="not_enough_lindens">
- U heeft slechts L$ [AMOUNT], en hebt L$ [AMOUNT2] meer nodig.
- </string>
- <string name="balance_left">
- Na de aankoop zult u nog L$ [AMOUNT] over hebben.
- </string>
- <string name="balance_needed">
- U dient minstens L$ [AMOUNT] te kopen om dit land te kunnen veroorloven.
- </string>
- <string name="no_parcel_selected">
- (geen perceel geselecteerd)
- </string>
- <string name="buy_currency">
- Koop L$ [AMOUNT] voor ong. US$ [USD]
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_buy_object.xml b/indra/newview/skins/default/xui/nl/floater_buy_object.xml
deleted file mode 100644
index 5d2d9dd3d0..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_buy_object.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="contents" title="KOOP EEN KOPIE VAN OBJECT">
- <text name="contents_text">
- en zijn inhoud:
- </text>
- <text name="buy_text">
- Koop voor L$[AMOUNT] van [NAME]?
- </text>
- <button label="Annuleren" label_selected="Annuleren" name="cancel_btn"/>
- <button label="Koop" label_selected="Koop" name="buy_btn"/>
- <string name="title_buy_text">
- Koop
- </string>
- <string name="title_buy_copy_text">
- Koop een kopie van
- </string>
- <string name="no_copy_text">
- (niet kopiëren)
- </string>
- <string name="no_modify_text">
- (niet wijzigen)
- </string>
- <string name="no_transfer_text">
- (niet overdragen)
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_camera.xml b/indra/newview/skins/default/xui/nl/floater_camera.xml
deleted file mode 100644
index 81a3ed8a58..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_camera.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="camera_floater" title="">
- <floater.string name="rotate_tooltip">
- Roteer camera rond focus
- </floater.string>
- <floater.string name="zoom_tooltip">
- Zoom camera naar focus
- </floater.string>
- <floater.string name="move_tooltip">
- Beweeg camera omhoog en omlaag, links en rechts
- </floater.string>
- <panel name="controls">
- <joystick_track name="cam_track_stick" tool_tip="Beweeg camera omhoog en omlaag, links en rechts"/>
- <joystick_zoom name="zoom" tool_tip="Zoom camera naar focus"/>
- </panel>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_choose_group.xml b/indra/newview/skins/default/xui/nl/floater_choose_group.xml
deleted file mode 100644
index 8d54d62d2d..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_choose_group.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="groups" title="GROEPEN">
- <text name="groupdesc">
- Kies een groep:
- </text>
- <button label="OK" label_selected="OK" name="OK"/>
- <button label="Annuleren" label_selected="Annuleren" name="Cancel"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_color_picker.xml b/indra/newview/skins/default/xui/nl/floater_color_picker.xml
deleted file mode 100644
index 9b61af0710..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_color_picker.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="ColorPicker" title="KLEURKIEZER">
- <text name="r_val_text">
- Rood:
- </text>
- <text name="g_val_text">
- Groen:
- </text>
- <text name="b_val_text">
- Blauw:
- </text>
- <text name="h_val_text">
- Hue:
- </text>
- <text name="s_val_text">
- Sat:
- </text>
- <text name="l_val_text">
- Lum:
- </text>
- <check_box label="Direct toepassen" name="apply_immediate"/>
- <button label="Annuleren" label_selected="Annuleren" name="cancel_btn"/>
- <button label="Selecteer" label_selected="Selecteer" name="select_btn"/>
- <text name="Current color:">
- Huidige kleur:
- </text>
- <text name="(Drag below to save.)">
- (Sleep naar beneden
- om op te slaan)
- </text>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_critical.xml b/indra/newview/skins/default/xui/nl/floater_critical.xml
deleted file mode 100644
index 90790fe108..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_critical.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="modal container" title="">
- <button label="Doorgaan" label_selected="Doorgaan" name="Continue"/>
- <button label="Annuleren" label_selected="Annuleren" name="Cancel"/>
- <text name="tos_heading">
- Leest u alstublieft het volgende bericht zorgvuldig door.
- </text>
- <text_editor name="tos_text">
- TOS_TEXT
- </text_editor>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/nl/floater_day_cycle_options.xml
deleted file mode 100644
index 1f3e045a75..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_day_cycle_options.xml
+++ /dev/null
@@ -1,94 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Day Cycle Floater" title="DAGCYCLUS EDITOR">
- <tab_container name="Day Cycle Tabs">
- <panel label="Dagcyclus" name="Day Cycle">
- <button label="?" name="WLDayCycleHelp"/>
- <text name="WL12am">
- 0:00
- </text>
- <text name="WL3am">
- 3:00
- </text>
- <text name="WL6am">
- 6:00
- </text>
- <text name="WL9amHash">
- 9:00
- </text>
- <text name="WL12pmHash">
- 12:00
- </text>
- <text name="WL3pm">
- 15:00
- </text>
- <text name="WL6pm">
- 18:00
- </text>
- <text name="WL9pm">
- 21:00
- </text>
- <text name="WL12am2">
- 0:00
- </text>
- <text name="WL12amHash">
- |
- </text>
- <text name="WL3amHash">
- I
- </text>
- <text name="WL6amHash">
- |
- </text>
- <text name="WL9amHash2">
- I
- </text>
- <text name="WL12pmHash2">
- |
- </text>
- <text name="WL3pmHash">
- I
- </text>
- <text name="WL6pmHash">
- |
- </text>
- <text name="WL9pmHash">
- I
- </text>
- <text name="WL12amHash2">
- |
- </text>
- <button label="Key toevoegen" label_selected="Key toevoegen" name="WLAddKey"/>
- <button label="Key verwijderen" label_selected="Key verwijderen" name="WLDeleteKey"/>
- <text name="WLCurKeyFrameText">
- Gemarkeerde frame instelling:
- </text>
- <text name="WLCurKeyTimeText">
- Markering tijd:
- </text>
- <spinner label="Uur" name="WLCurKeyHour"/>
- <spinner label="Min" name="WLCurKeyMin"/>
- <text name="WLCurKeyTimeText2">
- Markering voorinstelling:
- </text>
- <combo_box label="Voorinstelling" name="WLKeyPresets"/>
- <text name="DayCycleText">
- Snap:
- </text>
- <combo_box label="5 min" name="WLSnapOptions"/>
- <text name="DayCycleText2">
- Lengte van cyclus:
- </text>
- <spinner label="Uur" name="WLLengthOfDayHour"/>
- <spinner label="Min" name="WLLengthOfDayMin"/>
- <spinner label="Sec" name="WLLengthOfDaySec"/>
- <text name="DayCycleText3">
- Voorbeeld:
- </text>
- <button label="Afspelen" label_selected="Afspelen" name="WLAnimSky"/>
- <button label="Stop!" label_selected="Stop" name="WLStopAnimSky"/>
- <button label="Gebruik estatetijd" label_selected="Ga naar Estate tijd" name="WLUseLindenTime"/>
- <button label="Opslaan testdag" label_selected="Opslaan testdag" name="WLSaveDayCycle"/>
- <button label="Laad testdag" label_selected="Laad testdag" name="WLLoadDayCycle"/>
- </panel>
- </tab_container>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_env_settings.xml b/indra/newview/skins/default/xui/nl/floater_env_settings.xml
deleted file mode 100644
index 3c207040d2..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_env_settings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Environment Editor Floater" title="OMGEVING EDITOR">
- <text bottom="-42" name="EnvTimeText">
- Tijd van de
-dag
- </text>
- <text bottom_delta="-36" name="EnvTimeText2">
- 0:00
- </text>
- <text name="EnvCloudText">
- Wolkendek
- </text>
- <text name="EnvWaterColorText">
- Waterkleur
- </text>
- <color_swatch label="" name="EnvWaterColor" tool_tip="Klik om de kleurkiezer te openen"/>
- <text name="EnvWaterFogText">
- Watermist
- </text>
- <button label="Gebruik estate tijd" name="EnvUseEstateTimeButton"/>
- <button label="Geavanceerde lucht" name="EnvAdvancedSkyButton"/>
- <button label="Geavanceerd water" name="EnvAdvancedWaterButton"/>
- <button label="?" name="EnvSettingsHelpButton"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_event.xml b/indra/newview/skins/default/xui/nl/floater_event.xml
deleted file mode 100644
index 45ec58abdf..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_event.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater
- follows="all"
- height="400"
- can_resize="true"
- help_topic="event_details"
- label="Event"
- layout="topleft"
- name="Event"
- save_rect="true"
- save_visibility="false"
- title="EVENT DETAILS"
- width="600">
- <floater.string
- name="loading_text">
- Laden...
- </floater.string>
- <floater.string
- name="done_text">
- Done
- </floater.string>
- <web_browser
- trusted_content="true"
- follows="left|right|top|bottom"
- layout="topleft"
- left="10"
- name="browser"
- height="365"
- width="580"
- top="0"/>
- <text
- follows="bottom|left"
- height="16"
- layout="topleft"
- left_delta="0"
- name="status_text"
- top_pad="10"
- width="150" />
-</floater>
-
diff --git a/indra/newview/skins/default/xui/nl/floater_font_test.xml b/indra/newview/skins/default/xui/nl/floater_font_test.xml
deleted file mode 100644
index 31e53e7fba..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_font_test.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="contents" title="LETTERTYPETEST">
- <text name="linea">
- Overschrijf test, zou hier moeten verschijnen als Times (vanuit default/xui/en-us).
- </text>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_gesture.xml b/indra/newview/skins/default/xui/nl/floater_gesture.xml
deleted file mode 100644
index 4fa994c69e..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_gesture.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="gestures" title="ACTIEVE GEBAREN">
- <text name="help_label">
- Dubbelklik een gebaar om animaties en geluiden af te spelen
- </text>
- <scroll_list name="gesture_list">
- <column label="Trigger" name="trigger"/>
- <column label="Toets" name="shortcut"/>
- <column label="Naam" name="name"/>
- </scroll_list>
- <button label="Nieuw" name="new_gesture_btn"/>
- <button label="Bewerken" name="edit_btn"/>
- <button label="Afspelen" name="play_btn"/>
- <button label="Stop" name="stop_btn"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_hardware_settings.xml b/indra/newview/skins/default/xui/nl/floater_hardware_settings.xml
deleted file mode 100644
index b27a96f15c..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_hardware_settings.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Hardware Settings Floater" title="HARDWARE INSTELLINGEN">
- <text name="Filtering:">
- Filtering:
- </text>
- <check_box label="Anisotropische filtering (langzamer indien ingeschakeld)" name="ani" left="100"/>
- <text name="Antialiasing:">
- Anti-alias:
- </text>
- <combo_box label="Anti-alias" name="fsaa" width="120" left="100">
- <combo_box.item name="FSAADisabled" label="Uitgeschakeld"/>
- <combo_box.item name="2x" label="2x"/>
- <combo_box.item name="4x" label="4x"/>
- <combo_box.item name="8x" label="8x"/>
- <combo_box.item name="16x" label="16x"/>
- </combo_box>
- <spinner label="Gamma:" name="gamma" label_width="88" width="170"/>
- <text name="(brightness, lower is brighter)" left="182">
- (helderheid, lager is helderder, 0=gebruik standaardwaarde)
- </text>
- <text name="Enable VBO:">
- VBO inschakelen:
- </text>
- <check_box label="OpenGL Vertex Buffer Objects inschakelen" name="vbo" tool_tip="Dit inschakelen op moderne hardware geeft een prestatiewinst. Oudere hardware heeft echter vaak een slechte implementatie van VBO&apos;s en u kunt crashes ondervinden wanneer dit is ingeschakeld."/>
- <slider label="Textuurgeheugen (MB):" name="GrapicsCardTextureMemory" tool_tip="Hoeveelheid geheugen dat voor texturen toegewezen wordt. Standaard wordt de hoeveelheid geheugen van de videokaart gebruikt. Het verminderen van deze waarde kan de prestaties verbeteren, maar kan ook texturen wazig maken."/>
- <spinner label="Mistafstandsratio:" name="fog"/>
- <button label="OK" label_selected="OK" name="OK"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_hud.xml b/indra/newview/skins/default/xui/nl/floater_hud.xml
deleted file mode 100644
index 8ef7de1b02..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_hud.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_hud" title="HANDLEIDING"/>
diff --git a/indra/newview/skins/default/xui/nl/floater_image_preview.xml b/indra/newview/skins/default/xui/nl/floater_image_preview.xml
deleted file mode 100644
index 06596c20aa..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_image_preview.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Image Preview" title="">
- <text name="name_label">
- Naam:
- </text>
- <text name="description_label">
- Omschrijving:
- </text>
- <text name="preview_label">
- Toon voorbeeld van
-afbeelding als:
- </text>
- <combo_box label="Kledingtype" name="clothing_type_combo">
- <combo_box.item name="Image" label="Afbeelding"/>
- <combo_box.item name="Hair" label="Haar"/>
- <combo_box.item name="FemaleHead" label="Vrouwelijk hoofd"/>
- <combo_box.item name="FemaleUpperBody" label="Vrouwelijk bovenlichaam"/>
- <combo_box.item name="FemaleLowerBody" label="Vrouwelijk onderlichaam"/>
- <combo_box.item name="MaleHead" label="Mannelijk hoofd"/>
- <combo_box.item name="MaleUpperBody" label="Mannelijk onderlichaam"/>
- <combo_box.item name="MaleLowerBody" label="Mannelijk bovenlichaam"/>
- <combo_box.item name="Skirt" label="Rok"/>
- <combo_box.item name="SculptedPrim" label="Sculpted prim"/>
- </combo_box>
- <text name="bad_image_text">
- Kan afbeelding niet lezen.
-
-Probeer het op te slaan als een 24 bit Targa (.tga).
- </text>
- <check_box label="Gebruik verliesloze compressie" name="lossless_check"/>
- <button label="Annuleren" name="cancel_btn"/>
- <button label="Upload (L$[AMOUNT])" name="ok_btn" width="140"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_inspect.xml b/indra/newview/skins/default/xui/nl/floater_inspect.xml
deleted file mode 100644
index 6a0885b57f..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_inspect.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="inspect" title="OBJECTEN INSPECTEREN">
- <scroll_list name="object_list" tool_tip="Selecteer een object van deze lijst om het in-wereld te markeren">
- <column label="Objectnaam" name="object_name"/>
- <column label="Eigenaar" name="owner_name"/>
- <column label="Maker" name="creator_name"/>
- <column label="Aanmaakdatum" name="creation_date"/>
- </scroll_list>
- <button label="Toon profiel eigenaar..." label_selected="" name="button owner" tool_tip="Bekijk het profiel van de eigenaar van het gemarkeerde object"/>
- <button label="Toon profiel maker..." label_selected="" name="button creator" tool_tip="Bekijk het profiel van de originele maker van het gemarkeerde object"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_inventory.xml b/indra/newview/skins/default/xui/nl/floater_inventory.xml
deleted file mode 100644
index a69039d811..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_inventory.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Inventory" title="INVENTARIS">
- <search_editor label="Typ hier om te zoeken" name="inventory search editor"/>
- <tab_container name="inventory filter tabs">
- <inventory_panel label="Alle items" name="All Items"/>
- <inventory_panel label="Recente items" name="Recent Items"/>
- </tab_container>
- <menu_bar name="Inventory Menu">
- <menu label="Bestand" name="File">
- <menu_item_call label="Open" name="Open"/>
- <menu_item_call label="Nieuw venster" name="New Window"/>
- <menu_item_call label="Toon filters" name="Show Filters"/>
- <menu_item_call label="Filters opnieuw instellen" name="Reset Current"/>
- <menu_item_call label="Alle mappen sluiten" name="Close All Folders"/>
- <menu_item_call label="Prullenbak legen" name="Empty Trash"/>
- </menu>
- <menu label="Maak" name="Create">
- <menu_item_call label="Nieuwe map" name="New Folder"/>
- <menu_item_call label="Nieuw script" name="New Script"/>
- <menu_item_call label="Nieuwe notitie" name="New Note"/>
- <menu_item_call label="Nieuw gebaar" name="New Gesture"/>
- <menu name="New Clothes">
- <menu_item_call label="Nieuw hemd" name="New Shirt"/>
- <menu_item_call label="Nieuwe broek" name="New Pants"/>
- <menu_item_call label="Nieuwe schoenen" name="New Shoes"/>
- <menu_item_call label="Nieuwe sokken" name="New Socks"/>
- <menu_item_call label="Nieuwe jas" name="New Jacket"/>
- <menu_item_call label="Nieuwe rok" name="New Skirt"/>
- <menu_item_call label="Nieuwe handschoenen" name="New Gloves"/>
- <menu_item_call label="Nieuw onderhemd" name="New Undershirt"/>
- <menu_item_call label="Nieuwe onderbroek" name="New Underpants"/>
- </menu>
- <menu name="New Body Parts">
- <menu_item_call label="Nieuwe postuur" name="New Shape"/>
- <menu_item_call label="Nieuwe huid" name="New Skin"/>
- <menu_item_call label="Nieuw haar" name="New Hair"/>
- <menu_item_call label="Nieuwe ogen" name="New Eyes"/>
- </menu>
- </menu>
- <menu label="Sorteren" name="Sort">
- <menu_item_check label="Op naam" name="By Name"/>
- <menu_item_check label="Op datum" name="By Date"/>
- <menu_item_check label="Mappen altijd op naam" name="Folders Always By Name"/>
- <menu_item_check label="Systeemmappen naar de bovenkant" name="System Folders To Top"/>
- </menu>
- </menu_bar>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/nl/floater_inventory_item_properties.xml
deleted file mode 100644
index 63cfafab81..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_inventory_item_properties.xml
+++ /dev/null
@@ -1,81 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="item properties" title="INVENTARISITEM EIGENSCHAPPEN">
- <text name="LabelItemNameTitle">
- Naam:
- </text>
- <text name="LabelItemDescTitle">
- Omschrijving:
- </text>
- <text name="LabelCreatorTitle">
- Maker:
- </text>
- <text name="LabelCreatorName">
- Nicole Linden
- </text>
- <button label="Profiel..." label_selected="" name="BtnCreator"/>
- <text name="LabelOwnerTitle">
- Eigenaar
- </text>
- <text name="LabelOwnerName">
- Thrax Linden
- </text>
- <button label="Profiel..." label_selected="" name="BtnOwner"/>
- <text name="LabelAcquiredTitle">
- Verworven:
- </text>
- <text name="LabelAcquiredDate">
- Wed May 24 12:50:46 2006
- </text>
- <text name="OwnerLabel">
- U kunt:
- </text>
- <check_box label="Wijzigen" name="CheckOwnerModify"/>
- <check_box label="Kopiëren" name="CheckOwnerCopy"/>
- <check_box label="Doorverkopen/weggeven" name="CheckOwnerTransfer"/>
- <text name="BaseMaskDebug">
- B:
- </text>
- <text name="OwnerMaskDebug">
- E:
- </text>
- <text name="GroupMaskDebug">
- G:
- </text>
- <text name="EveryoneMaskDebug">
- I:
- </text>
- <text name="NextMaskDebug">
- V:
- </text>
- <check_box label="Delen met groep" name="CheckShareWithGroup"/>
- <check_box label="Iedereen mag kopiëren" name="CheckEveryoneCopy"/>
- <text name="NextOwnerLabel" width="130">
- Volgende eigenaar kan:
- </text>
- <check_box label="Wijzigen" name="CheckNextOwnerModify"/>
- <check_box label="Kopiëren" name="CheckNextOwnerCopy"/>
- <check_box label="Doorverkopen/weggeven" name="CheckNextOwnerTransfer"/>
- <text name="SaleLabel">
- Markeer item:
- </text>
- <check_box label="Te koop" name="CheckPurchase"/>
- <radio_group name="RadioSaleType">
- <radio_item name="radio" label="Origineel" />
- <radio_item name="radio2" label="Kopiëren" />
- </radio_group>
- <text name="TextPrice">
- Prijs: L$
- </text>
- <string name="unknown">
- (onbekend)
- </string>
- <string name="public">
- (public)
- </string>
- <string name="you_can">
- U kunt:
- </string>
- <string name="owner_can">
- Eigenaar kan:
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/nl/floater_inventory_view_finder.xml
deleted file mode 100644
index 097ebda8b7..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_inventory_view_finder.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Inventory Finder" title="INVENTORY_RECENT_ITEMS">
- <check_box label="Animatie" name="check_animation"/>
- <check_box label="Visitekaartjes" name="check_calling_card"/>
- <check_box label="Kleding" name="check_clothing"/>
- <check_box label="Gebaren" name="check_gesture"/>
- <check_box label="Landmarkeringen" name="check_landmark"/>
- <check_box label="Notitiekaarten" name="check_notecard"/>
- <check_box label="Objecten" name="check_object"/>
- <check_box label="Scripts" name="check_script"/>
- <check_box label="Geluiden" name="check_sound"/>
- <check_box label="Texturen" name="check_texture"/>
- <check_box label="Foto&apos;s" name="check_snapshot"/>
- <button label="Alles" label_selected="Alles" name="All"/>
- <button label="Geen" label_selected="Geen" name="None"/>
- <check_box label="Altijd mappen tonen" name="check_show_empty"/>
- <check_box label="Sinds logoff" name="check_since_logoff"/>
- <text name="- OR -">
- - OF -
- </text>
- <spinner label="Uren geleden" name="spin_hours_ago" width="144" label_width="80"/>
- <spinner label="Dagen geleden" name="spin_days_ago" width="144" label_width="80"/>
- <button label="Sluiten" label_selected="Sluiten" name="Close"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_joystick.xml b/indra/newview/skins/default/xui/nl/floater_joystick.xml
deleted file mode 100644
index 1d590dc1f3..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_joystick.xml
+++ /dev/null
@@ -1,80 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Joystick" title="JOYSTICK CONFIGURATIE">
- <check_box name="enable_joystick" width="80" label="Joystick inschakelen:"/>
- <text left="146" name="joystick_type" width="360"/>
- <spinner label="X-as mapping" name="JoystickAxis1"/>
- <spinner label="Y-as mapping" name="JoystickAxis2"/>
- <spinner label="Z-as mapping" name="JoystickAxis0"/>
- <spinner label="Stampen mapping" name="JoystickAxis4"/>
- <spinner label="Gieren mapping" name="JoystickAxis5"/>
- <spinner label="Rollen mapping" name="JoystickAxis3"/>
- <spinner label="Zoom mapping" name="JoystickAxis6"/>
- <check_box label="Directe zoom" name="ZoomDirect"/>
- <check_box label="3D Cursor" name="Cursor3D"/>
- <check_box label="Automatisch niveau" name="AutoLeveling"/>
- <text name="Control Modes:">
- Besturingsmodi:
- </text>
- <check_box name="JoystickAvatarEnabled" label="Avatar"/>
- <check_box name="JoystickBuildEnabled" label="Bouwen"/>
- <check_box name="JoystickFlycamEnabled" label="Vliegcamera"/>
- <text name="XScale">
- X schaal
- </text>
- <text name="YScale">
- Y schaal
- </text>
- <text name="ZScale">
- Z schaal
- </text>
- <text name="PitchScale">
- Stampen schaal
- </text>
- <text name="YawScale">
- Gieren schaal
- </text>
- <text name="RollScale">
- Rollen schaal
- </text>
- <text name="XDeadZone">
- X dode zone
- </text>
- <text name="YDeadZone">
- Y dode zone
- </text>
- <text name="ZDeadZone">
- Z dode zone
- </text>
- <text name="PitchDeadZone">
- Stampen dode zone
- </text>
- <text name="YawDeadZone">
- Gieren dode zone
- </text>
- <text name="RollDeadZone">
- Rollen dode zone
- </text>
- <text name="Feathering">
- Feathering
- </text>
- <text name="ZoomScale2">
- Zoomschaal
- </text>
- <text name="ZoomDeadZone">
- Zoom dode zone
- </text>
- <button label="SpaceNavigator standaardwaarden" name="SpaceNavigatorDefaults" width="200" font="SansSerifSmall"/>
- <button label="OK" label_selected="OK" name="ok_btn"/>
- <button label="Annuleren" label_selected="Annuleren" name="cancel_btn" left_delta="110"/>
- <stat_view label="Joystick monitor" name="axis_view">
- <stat_bar label="As 0" name="axis0"/>
- <stat_bar label="As 1" name="axis1"/>
- <stat_bar label="As 2" name="axis2"/>
- <stat_bar label="As 3" name="axis3"/>
- <stat_bar label="As 4" name="axis4"/>
- <stat_bar label="As 5" name="axis5"/>
- </stat_view>
- <string name="NoDevice">
- Geen apparaat gedetecteerd
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_lagmeter.xml b/indra/newview/skins/default/xui/nl/floater_lagmeter.xml
deleted file mode 100644
index e3943c2470..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_lagmeter.xml
+++ /dev/null
@@ -1,152 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_lagmeter" title="LAG METER">
- <button label="" label_selected="" name="client_lagmeter" tool_tip="Client lag status"/>
- <text name="client">
- Client:
- </text>
- <text name="client_text">
- Normaal
- </text>
- <button label="" label_selected="" name="network_lagmeter" tool_tip="Netwerklag status"/>
- <text name="network">
- Netwerk:
- </text>
- <text name="network_text">
- Normaal
- </text>
- <button label="" label_selected="" name="server_lagmeter" tool_tip="Serverlag status"/>
- <text name="server">
- Server:
- </text>
- <text name="server_text">
- Normaal
- </text>
- <button label="?" name="server_help"/>
- <button label="&gt;&gt;" name="minimize"/>
- <string name="max_title_msg">
- Lag meter
- </string>
- <string name="max_width_px">
- 360
- </string>
- <string name="min_title_msg">
- Lag
- </string>
- <string name="min_width_px">
- 90
- </string>
- <string name="client_text_msg">
- Client
- </string>
- <string name="client_frame_rate_critical_fps">
- 10
- </string>
- <string name="client_frame_rate_warning_fps">
- 15
- </string>
- <string name="client_frame_time_window_bg_msg">
- Normaal, venster op achtergrond
- </string>
- <string name="client_frame_time_critical_msg">
- Client framerate onder [CLIENT_FRAME_RATE_CRITICAL]
- </string>
- <string name="client_frame_time_warning_msg">
- Client framerate tussen [CLIENT_FRAME_RATE_CRITICAL] en [CLIENT_FRAME_RATE_WARNING]
- </string>
- <string name="client_frame_time_normal_msg">
- Normaal
- </string>
- <string name="client_draw_distance_cause_msg">
- Mogelijke oorzaak: Zichtbereik te hoog ingesteld
- </string>
- <string name="client_texture_loading_cause_msg">
- Mogelijke oorzaak: Afbeeldingen worden geladen
- </string>
- <string name="client_texture_memory_cause_msg">
- Mogelijke oorzaak: Teveel afbeeldingen in geheugen
- </string>
- <string name="client_complex_objects_cause_msg">
- Mogelijke oorzaak: Teveel complexe objecten in de scene
- </string>
- <string name="network_text_msg">
- Netwerk
- </string>
- <string name="network_packet_loss_critical_pct">
- 10
- </string>
- <string name="network_packet_loss_warning_pct">
- 5
- </string>
- <string name="network_packet_loss_critical_msg">
- Verbinding verliest meer dan [NETWORK_PACKET_LOSS_CRITICAL]% van de pakketten
- </string>
- <string name="network_packet_loss_warning_msg">
- Verbinding verliest [NETWORK_PACKET_LOSS_WARNING]%-[NETWORK_PACKET_LOSS_CRITICAL]% van de pakketten
- </string>
- <string name="network_performance_normal_msg">
- Normaal
- </string>
- <string name="network_ping_critical_ms">
- 600
- </string>
- <string name="network_ping_warning_ms">
- 300
- </string>
- <string name="network_ping_critical_msg">
- Verbinding pingtijd is meer dan [NETWORK_PING_CRITICAL] ms
- </string>
- <string name="network_ping_warning_msg">
- Verbinding pingtijd is [NETWORK_PING_WARNING]-[NETWORK_PING_CRITICAL] ms
- </string>
- <string name="network_packet_loss_cause_msg">
- Mogelijk slechte verbinding of &apos;Bandbreedte&apos; voorkeur te hoog.
- </string>
- <string name="network_ping_cause_msg">
- Mogelijk slechte verbinding of applicatie voor bestandsdeling.
- </string>
- <string name="server_text_msg">
- Server
- </string>
- <string name="server_frame_rate_critical_fps">
- 20
- </string>
- <string name="server_frame_rate_warning_fps">
- 30
- </string>
- <string name="server_single_process_max_time_ms">
- 20
- </string>
- <string name="server_frame_time_critical_msg">
- Simulator framerate onder [SERVER_FRAME_RATE_CRITICAL]
- </string>
- <string name="server_frame_time_warning_msg">
- Simulator framerate tussen [SERVER_FRAME_RATE_CRITICAL] en [SERVER_FRAME_RATE_WARNING]
- </string>
- <string name="server_frame_time_normal_msg">
- Normaal
- </string>
- <string name="server_physics_cause_msg">
- Mogelijke oorzaak: Teveel fysieke objecten
- </string>
- <string name="server_scripts_cause_msg">
- Mogelijke oorzaak: Teveel gescripte objecten
- </string>
- <string name="server_net_cause_msg">
- Mogelijke oorzaak: Teveel netwerkverkeer
- </string>
- <string name="server_agent_cause_msg">
- Mogelijke oorzaak: Teveel mensen verplaatsen zich in de regio
- </string>
- <string name="server_images_cause_msg">
- Mogelijke oorzaak: Teveel afbeeldingberekeningen
- </string>
- <string name="server_generic_cause_msg">
- Mogelijke oorzaak: Simulatorbelasting is te hoog
- </string>
- <string name="smaller_label">
- &gt;&gt;
- </string>
- <string name="bigger_label">
- &lt;&lt;
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_land_holdings.xml b/indra/newview/skins/default/xui/nl/floater_land_holdings.xml
deleted file mode 100644
index 5cf66ed0c4..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_land_holdings.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="land holdings floater" title="MIJN LAND">
- <scroll_list name="parcel list">
- <column label="Perceelnaam" name="name"/>
- <column label="Regio" name="location"/>
- <column label="Type" name="type"/>
- <column label="Gebied" name="area"/>
- </scroll_list>
- <button label="Teleport" label_selected="Teleport" name="Teleport" tool_tip="Teleport naar het centrum van dit land."/>
- <button label="Toon op kaart" label_selected="Toon op kaart" name="Show on Map" tool_tip="Toon dit land op de wereldkaart"/>
- <text name="contrib_label">
- Bijdragen aan uw groepen:
- </text>
- <scroll_list name="grant list">
- <column label="Groep" name="group"/>
- <column label="Gebied" name="area"/>
- </scroll_list>
- <text name="allowed_label">
- Toegestane landbezittingen in het huidige betaalschema:
- </text>
- <text name="allowed_text">
- [AREA] m²
- </text>
- <text name="current_label">
- Huidige landbezittingen:
- </text>
- <text name="current_text">
- [AREA] m²
- </text>
- <text name="available_label">
- Beschikbaar voor landaankopen:
- </text>
- <text name="available_text">
- [AREA] m²
- </text>
- <string name="area_string">
- [AREA] m²
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/nl/floater_live_lsleditor.xml
deleted file mode 100644
index 98a0362ce1..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_live_lsleditor.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="script ed float" title="SCRIPT: NIEUW SCRIPT">
- <button label="Herstarten" label_selected="Herstarten" name="Reset"/>
- <check_box label="Uitvoeren" name="running" left="4"/>
- <check_box label="Mono" name="mono"/>
- <string name="not_allowed">
- U bent niet bevoegd om dit script in te zien
- </string>
- <string name="script_running">
- Uitvoeren
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_lsl_guide.xml b/indra/newview/skins/default/xui/nl/floater_lsl_guide.xml
deleted file mode 100644
index 27b3ff834e..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_lsl_guide.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="script ed float" title="LSL WIKI">
- <check_box label="Volg cursor" name="lock_check"/>
- <combo_box label="Vergrendelen" name="history_combo"/>
- <button label="Terug" name="back_btn"/>
- <button label="Vooruit" name="fwd_btn"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_map.xml b/indra/newview/skins/default/xui/nl/floater_map.xml
deleted file mode 100644
index 29af36e50c..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_map.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Map">
- <floater.string name="mini_map_north">
- N
- </floater.string>
- <floater.string name="mini_map_east">
- O
- </floater.string>
- <floater.string name="mini_map_west">
- W
- </floater.string>
- <floater.string name="mini_map_south">
- Z
- </floater.string>
- <floater.string name="mini_map_southeast">
- ZO
- </floater.string>
- <floater.string name="mini_map_northeast">
- NO
- </floater.string>
- <floater.string name="mini_map_southwest">
- ZW
- </floater.string>
- <floater.string name="mini_map_northwest">
- NW
- </floater.string>
- <text label="N" name="floater_map_north" text="N">
- N
- </text>
- <text label="O" name="floater_map_east" text="O">
- O
- </text>
- <text label="W" name="floater_map_west" text="W">
- W
- </text>
- <text label="Z" name="floater_map_south" text="Z">
- Z
- </text>
- <text label="ZO" name="floater_map_southeast" text="ZO">
- ZO
- </text>
- <text label="NO" name="floater_map_northeast" text="NO">
- NO
- </text>
- <text label="ZW" name="floater_map_southwest" text="ZW">
- ZW
- </text>
- <text label="NW" name="floater_map_northwest" text="NW">
- NW
- </text>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_media_browser.xml b/indra/newview/skins/default/xui/nl/floater_media_browser.xml
deleted file mode 100644
index 12f693bf33..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_media_browser.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_about" title="MEDIA VERKENNER">
- <layout_stack name="stack1">
- <layout_panel name="nav_controls">
- <button label="Terug" name="back"/>
- <button label="Vooruit" name="forward"/>
- <button label="Herladen" name="reload"/>
- <button label="Ga" name="go"/>
- </layout_panel>
- <layout_panel name="parcel_owner_controls">
- <button label="Stuur huidige URL naar perceel" name="assign"/>
- </layout_panel>
- <layout_panel name="external_controls">
- <button label="Open in mijn webbrowser" name="open_browser"/>
- <check_box label="Altijd in mijn webbrowser openen" name="open_always"/>
- <button label="Sluiten" name="close"/>
- </layout_panel>
- </layout_stack>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_mem_leaking.xml b/indra/newview/skins/default/xui/nl/floater_mem_leaking.xml
deleted file mode 100644
index d0b25587b6..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_mem_leaking.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="MemLeak" title="GEHEUGENLEK SIMULATIE">
- <spinner label="Leksnelheid (bytes per frame):" name="leak_speed"/>
- <spinner label="Max gelekt geheugen (MB):" name="max_leak"/>
- <text name="total_leaked_label">
- Huidig gelekt geheugen: [SIZE] KB
- </text>
- <text name="note_label_1">
- [NOTE1]
- </text>
- <text name="note_label_2">
- [NOTE2]
- </text>
- <button label="Start" name="start_btn"/>
- <button label="Stop" name="stop_btn"/>
- <button label="Vrijgeven" name="release_btn"/>
- <button label="Sluiten" name="close_btn"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_moveview.xml b/indra/newview/skins/default/xui/nl/floater_moveview.xml
deleted file mode 100644
index 8a6a874e49..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_moveview.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="move_floater">
-<panel name="panel_actions">
- <button label="" label_selected="" name="turn left btn" tool_tip="Draai links"/>
- <button label="" label_selected="" name="turn right btn" tool_tip="Draai rechts"/>
- <button label="" label_selected="" name="move up btn" tool_tip="Spring of vlieg omhoog"/>
- <button label="" label_selected="" name="move down btn" tool_tip="Kruip of vlieg omlaag"/>
- <joystick_slide name="slide left btn" tool_tip="Verplaats links"/>
- <joystick_slide name="slide right btn" tool_tip="Verplaats rechts"/>
- <joystick_turn name="forward btn" tool_tip="Verplaats vooruit"/>
- <joystick_turn name="backward btn" tool_tip="Verplaats achteruit"/>
-</panel>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_mute_object.xml b/indra/newview/skins/default/xui/nl/floater_mute_object.xml
deleted file mode 100644
index edea63b42c..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_mute_object.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="mute by name" title="BLOKKEER VOORWERP BIJ NAAM">
- <text bottom_delta="-40" name="message">
- Blokkeer een Voorwerp:
- </text>
- <line_editor bottom_delta="-58" name="object_name">
- Object naam
- </line_editor>
- <text name="note">
- * Blokkeerd alleen object tekst, niet de geluiden
- </text>
- <button label="Ok" name="OK"/>
- <button label="Annuleren" name="Cancel"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_openobject.xml b/indra/newview/skins/default/xui/nl/floater_openobject.xml
deleted file mode 100644
index 832c63403d..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_openobject.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="objectcontents" title="OBJECT INHOUD">
- <text name="object_name">
- [DESC]:
- </text>
- <button label="Kopiëren naar inventaris" label_selected="Kopiëren naar inventaris" name="copy_to_inventory_button" width="140"/>
- <button label="Kopiëren en dragen" label_selected="Kopiëren en dragen" name="copy_and_wear_button" left="164"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_pay.xml b/indra/newview/skins/default/xui/nl/floater_pay.xml
deleted file mode 100644
index f2b34d78d7..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_pay.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Give Money" title="">
- <button label="L$1" label_selected="L$1" name="fastpay 1"/>
- <button label="L$5" label_selected="L$5" name="fastpay 5"/>
- <button label="L$10" label_selected="L$10" name="fastpay 10"/>
- <button label="L$20" label_selected="L$20" name="fastpay 20"/>
- <button label="Betaal" label_selected="Betaal" name="pay btn"/>
- <button label="Annuleren" label_selected="Annuleren" name="cancel btn"/>
- <text name="payee_label" width="100">
- Betaal inwoner:
- </text>
- <text name="payee_name" left="110">
- Test Name That Is Extremely Long To Check Clipping
- </text>
- <text name="fastpay text">
- Snel betalen:
- </text>
- <text name="amount text">
- Bedrag:
- </text>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_pay_object.xml b/indra/newview/skins/default/xui/nl/floater_pay_object.xml
deleted file mode 100644
index 11fa6d4a44..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_pay_object.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Give Money" title="">
- <text name="payee_group" left="5" width="90" halign="left">
- Betaal groep:
- </text>
- <text name="payee_resident" left="5" width="90" halign="left">
- Betaal inwoner:
- </text>
- <text name="payee_name" left="100" width="200">
- Ericacita Moostopolison
- </text>
- <text name="object_name_label" left="5" width="90" halign="left">
- Via object:
- </text>
- <text name="object_name_text" left="100" width="200">
- ...
- </text>
- <text name="fastpay text" halign="left">
- Snel betalen:
- </text>
- <text name="amount text">
- Bedrag:
- </text>
- <button label="L$1" label_selected="L$1" name="fastpay 1"/>
- <button label="L$5" label_selected="L$5" name="fastpay 5"/>
- <button label="L$10" label_selected="L$10" name="fastpay 10"/>
- <button label="L$20" label_selected="L$20" name="fastpay 20"/>
- <button label="Betaal" label_selected="Betaal" name="pay btn"/>
- <button label="Annuleren" label_selected="Annuleren" name="cancel btn"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_perm_prefs.xml b/indra/newview/skins/default/xui/nl/floater_perm_prefs.xml
deleted file mode 100644
index f946c42678..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_perm_prefs.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="perm prefs" title="STANDAARD UPLOAD PERMISSIES">
- <panel label="Permissies" name="permissions">
- <button label="?" label_selected="?" name="help"/>
- <check_box label="Delen met groep" name="share_with_group"/>
- <check_box label="Iedereen mag kopiëren" name="everyone_copy"/>
- <text name="NextOwnerLabel">
- Volgende eigenaar kan:
- </text>
- <check_box label="Wijzigen" name="next_owner_modify"/>
- <check_box label="Kopiëren" name="next_owner_copy"/>
- <check_box label="Verkopen/weggeven" name="next_owner_transfer" left_delta="80"/>
- </panel>
- <button label="OK" label_selected="OK" name="ok"/>
- <button label="Annuleren" label_selected="Annuleren" name="cancel"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_post_process.xml b/indra/newview/skins/default/xui/nl/floater_post_process.xml
deleted file mode 100644
index e627f81a70..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_post_process.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Post-Process Floater" title="NABEWERKINGINSTELLINGEN">
- <tab_container name="Post-Process Tabs">
- <panel label="Kleurfilter" name="wmiColorFilterPanel">
- <check_box label="Inschakelen" name="wmiColorFilterToggle"/>
- <text name="wmiColorFilterBrightnessText">
- Helderheid
- </text>
- <text name="wmiColorFilterSaturationText">
- Verzadiging
- </text>
- <text name="wmiColorFilterContrastText">
- Contrast
- </text>
- <text name="wmiColorFilterBaseText">
- Contrastbasiskleur
- </text>
- <slider label="R" name="wmiColorFilterBaseR"/>
- <slider label="G" name="wmiColorFilterBaseG"/>
- <slider label="B" name="wmiColorFilterBaseB"/>
- <slider label="I" name="wmiColorFilterBaseI"/>
- </panel>
- <panel label="Nachtvisie" name="wmiNightVisionPanel">
- <check_box label="Inschakelen" name="wmiNightVisionToggle"/>
- <text name="wmiNightVisionBrightMultText">
- Lichtversterking
- </text>
- <text name="wmiNightVisionNoiseSizeText">
- Ruisgrootte
- </text>
- <text name="wmiNightVisionNoiseStrengthText">
- Ruissterkte
- </text>
- </panel>
- <panel label="Bloom" name="wmiBloomPanel">
- <check_box label="Inschakelen" name="wmiBloomToggle"/>
- <text name="wmiBloomExtractText">
- Lichtsterkte extractie
- </text>
- <text name="wmiBloomSizeText">
- Bloom-grootte
- </text>
- <text name="wmiBloomStrengthText">
- Bloom-sterkte
- </text>
- </panel>
- <panel label="Extra&apos;s" name="Extras">
- <button label="LaadEffect" label_selected="LaadEffect" name="PPLoadEffect"/>
- <button label="Effect opslaan" label_selected="Effect opslaan" name="PPSaveEffect"/>
- <line_editor label="Effectnaam" name="PPEffectNameEditor"/>
- </panel>
- </tab_container>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_postcard.xml b/indra/newview/skins/default/xui/nl/floater_postcard.xml
deleted file mode 100644
index c2d092fdd4..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_postcard.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Postcard" title="EMAIL FOTO">
- <text name="to_label">
- Ontvanger e-mail:
- </text>
- <text name="from_label">
- Uw e-mail:
- </text>
- <text name="name_label">
- Uw naam:
- </text>
- <text name="subject_label">
- Onderwerp:
- </text>
- <line_editor label="Type hier uw onderwerp." name="subject_form"/>
- <text name="msg_label">
- Bericht:
- </text>
- <text_editor name="msg_form">
- Type hier uw bericht.
- </text_editor>
- <text name="fine_print">
- Indien uw ontvanger deelneemt aan SL, zult u een verwijzingsbonus ontvangen.
- </text>
- <button label="Annuleren" name="cancel_btn"/>
- <button label="Verzenden" name="send_btn"/>
- <string name="default_subject">
- Ansichtkaart uit [SECOND_LIFE]
- </string>
- <string name="default_message">
- Kom dit zien!
- </string>
- <string name="upload_message">
- Verzenden...
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_preferences.xml b/indra/newview/skins/default/xui/nl/floater_preferences.xml
deleted file mode 100644
index 6fc8005fd2..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_preferences.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Preferences" title="VOORKEUREN">
- <button label="OK" label_selected="OK" name="OK"/>
- <button label="Annuleren" label_selected="Annuleren" name="Cancel"/>
- <button label="Toepassen" label_selected="Toepassen" name="Apply"/>
- <button label="Over" label_selected="Over" name="About..."/>
- <button label="Help" label_selected="Help" name="Help"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_preview_animation.xml b/indra/newview/skins/default/xui/nl/floater_preview_animation.xml
deleted file mode 100644
index 0634452d96..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_preview_animation.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="preview_anim">
- <text name="desc txt">
- Omschrijving:
- </text>
- <button label="Afspelen in wereld" label_selected="Stop" name="Anim play btn" tool_tip="Speel deze animatie af, zodat anderen hem kunnen zien." width="120"/>
- <button label="Lokaal afspelen" label_selected="Stop" name="Anim audition btn" tool_tip="Speel deze animatie af, zodat alleen u hem kunt zien." width="110"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_preview_gesture.xml b/indra/newview/skins/default/xui/nl/floater_preview_gesture.xml
deleted file mode 100644
index 7dd85460a2..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_preview_gesture.xml
+++ /dev/null
@@ -1,58 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="gesture_preview">
- <string name="stop_txt">
- Stop
- </string>
- <string name="preview_txt">
- Voorbeeld
- </string>
- <string name="none_text">
- -- Geen --
- </string>
- <text name="desc_label">
- Omschrijving:
- </text>
- <text name="trigger_label">
- Trigger:
- </text>
- <text name="replace_text" tool_tip="Vervang de startseinwoorden door deze woorden. Bijvoorbeeld, startsein &apos;hallo&apos; vervang door &apos;hoi&apos; zal de chat &apos;Ik wilde hallo zeggen&apos; veranderen in &apos;Ik wilde hoi zeggen&apos;, waarbij tevens het gebaar afgespeeld zal worden!" left="208">
- Vervangen door:
- </text>
- <line_editor name="replace_editor" tool_tip="Vervang de startseinwoorden door deze woorden. Bijvoorbeeld, startsein &apos;hallo&apos; vervang door &apos;hoi&apos; zal de chat &apos;Ik wilde hallo zeggen&apos; veranderen in &apos;Ik wilde hoi zeggen&apos;, waarbij tevens het gebaar afgespeeld zal worden."/>
- <text name="key_label">
- Snelkoppeling toets:
- </text>
- <combo_box label="Geen" name="modifier_combo" left="136" width="56"/>
- <combo_box label="Geen" name="key_combo" width="56"/>
- <text name="library_label">
- Bibliotheek:
- </text>
- <text name="steps_label">
- Stappen:
- </text>
- <scroll_list name="library_list" width="94">
- Animatie
-Geluid
-Chat
-Wacht
- </scroll_list>
- <button label="Toevoegen &gt;&gt;" name="add_btn" left="124" width="87"/>
- <button label="Beweeg omhoog" name="up_btn" width="106" left_delta="-9"/>
- <button label="Beweeg omlaag" name="down_btn" width="106"/>
- <button label="Verwijderen" name="delete_btn" width="84" left_delta="9"/>
- <scroll_list left="226" name="step_list" width="205" />
- <text name="help_label">
- Alle stappen gebeuren tegelijkertijd,
-tenzij u wachtstappen toevoegt.
- </text>
- <text left="230" name="options_text" width="200" />
- <radio_group name="animation_trigger_type">
- <radio_item name="start" label="Start" />
- <radio_item name="stop" label="Stop" />
- </radio_group>
- <check_box label="tot alle animaties zijn afgelopen" name="wait_anim_check"/>
- <check_box label="tijd in seconden" name="wait_time_check"/>
- <check_box label="Actief" name="active_check" tool_tip="Actieve gebaren kunnen worden gestart door het zeggen van hun startseinwoorden of door het indrukken van hun sneltoetsen. Gebaren worden gewoonlijk inactief wanneer er een conflict is in de koppeling van de sneltoetsen"/>
- <button label="Voorbeeld" name="preview_btn"/>
- <button label="Opslaan" name="save_btn"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_preview_notecard.xml b/indra/newview/skins/default/xui/nl/floater_preview_notecard.xml
deleted file mode 100644
index f97d1fe6ba..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_preview_notecard.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="preview notecard" title="NEUS">
- <button label="Opslaan" label_selected="Opslaan" name="Save"/>
- <text name="desc txt">
- Omschrijving:
- </text>
- <text_editor name="Notecard Editor">
- Laden…
- </text_editor>
- <string name="no_object">
- Kan object dat deze notitie bevat niet vinden.
- </string>
- <string name="not_allowed">
- U heeft geen toestemming om deze notitie te bekijken
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_preview_sound.xml b/indra/newview/skins/default/xui/nl/floater_preview_sound.xml
deleted file mode 100644
index f168f3ed32..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_preview_sound.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="preview_sound">
- <text name="desc txt">
- Omschrijving:
- </text>
- <button label="Lokaal afspelen" label_selected="Lokaal afspelen" name="Sound audition btn" tool_tip="Speel dit geluid of zodat alleen u het kunt horen."/>
- <button label="In wereld afspelen" label_selected="In wereld afspelen" name="Sound play btn" tool_tip="Speel dit geluid of zodat anderen het kunnen horen."/>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_preview_texture.xml b/indra/newview/skins/default/xui/nl/floater_preview_texture.xml
deleted file mode 100644
index c4a06b7b6f..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_preview_texture.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="preview_texture">
- <text name="desc txt">
- Omschrijving:
- </text>
- <text name="dimensions">
- Afmetingen: [WIDTH] x [HEIGHT]
- </text>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_region_info.xml b/indra/newview/skins/default/xui/nl/floater_region_info.xml
deleted file mode 100644
index 0a98da3b4e..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_region_info.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="regioninfo" title="REGIO/ESTATE"/>
diff --git a/indra/newview/skins/default/xui/nl/floater_report_abuse.xml b/indra/newview/skins/default/xui/nl/floater_report_abuse.xml
deleted file mode 100644
index a50773c2b3..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_report_abuse.xml
+++ /dev/null
@@ -1,103 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_report_abuse" title="MISBRUIK RAPPORTEREN">
- <floater.string name="Screenshot">
- Schermafbeelding
- </floater.string>
- <check_box label="Gebruik deze schermafbeelding" name="screen_check"/>
- <text name="reporter_title" width="110">
- Rapporteur:
- </text>
- <text left_delta="70" name="reporter_field">
- Loremipsum Dolorsitamut Longnamez
- </text>
- <text name="sim_title">
- Regio:
- </text>
- <text left_delta="70" name="sim_field">
- Regionaam
- </text>
- <text name="pos_title">
- Positie:
- </text>
- <text left_delta="70" name="pos_field">
- {128.1, 128.1, 15.4}
- </text>
- <text name="select_object_label">
- Klik de knop, vervolgens het misbruik voorwerp:
- </text>
- <button label="" label_selected="" name="pick_btn" tool_tip="Objectkiezer - Identificeer een object als het onderwerp van dit rapport"/>
- <text name="object_name_label">
- voorwerp:
- </text>
- <text name="object_name" width="120">
- Consetetur Sadipscing
- </text>
- <text name="owner_name_label">
- Eigenaar:
- </text>
- <text name="owner_name">
- Hendrerit Vulputate Kamawashi Longname
- </text>
- <combo_box name="category_combo" tool_tip="Categorie -- selecteer de categorie die dit rapport het best beschrijft">
- <combo_box.item label="Selecteer categorie" name="Select_category"/>
- <combo_box.item label="Leeftijd &gt; Leeftijd spelen" name="Age__Age_play"/>
- <combo_box.item label="Leeftijd &gt; Volwassen inwoner in Teen Second Life" name="Age__Adult_resident_on_Teen_Second_Life"/>
- <combo_box.item label="Leeftijd &gt; Minderjarige inwoner buiten Teen Second Life" name="Age__Underage_resident_outside_of_Teen_Second_Life"/>
- <combo_box.item label="Aanval &gt; Gevechtszandbak / onveilig gebied" name="Assault__Combat_sandbox___unsafe_area"/>
- <combo_box.item label="Aanval &gt; Veilig gebied" name="Assault__Safe_area"/>
- <combo_box.item label="Aanval &gt; Zandbak voor het testen van wapens" name="Assault__Weapons_testing_sandbox"/>
- <combo_box.item label="Handel &gt; Product of dienst is niet geleverd" name="Commerce__Failure_to_deliver_product_or_service"/>
- <combo_box.item label="Openbaring &gt; Echte wereld informatie" name="Disclosure__Real_world_information"/>
- <combo_box.item label="Openbaring &gt; Op afstand chat afluisteren" name="Disclosure__Remotely_monitoring chat"/>
- <combo_box.item label="Openbaring &gt; Second Life informatie/chat/IMs" name="Disclosure__Second_Life_information_chat_IMs"/>
- <combo_box.item label="Vredebreuk &gt; Oneerlijk gebruik van regiomiddelen" name="Disturbing_the_peace__Unfair_use_of_region_resources"/>
- <combo_box.item label="Vredebreuk &gt; Excessieve gescripte objecten" name="Disturbing_the_peace__Excessive_scripted_objects"/>
- <combo_box.item label="Vredebreuk &gt; Objecten laten rondslingeren" name="Disturbing_the_peace__Object_littering"/>
- <combo_box.item label="Vredebreuk &gt; Herhaalde spam" name="Disturbing_the_peace__Repetitive_spam"/>
- <combo_box.item label="Vredebreuk &gt; Ongewenste reclame-spam" name="Disturbing_the_peace__Unwanted_advert_spam"/>
- <combo_box.item label="Fraude &gt; L$" name="Fraud__L$"/>
- <combo_box.item label="Fraude &gt; Land" name="Fraud__Land"/>
- <combo_box.item label="Fraude &gt; Piramideschema of kettingbrief" name="Fraud__Pyramid_scheme_or_chain_letter"/>
- <combo_box.item label="Fraude &gt; US$" name="Fraud__US$"/>
- <combo_box.item label="Intimidatie &gt; Reclameverzamelingen / visuele spam" name="Harassment__Advert_farms___visual_spam"/>
- <combo_box.item label="Intimidatie &gt; Individuen of groepen in diskrediet brengen" name="Harassment__Defaming_individuals_or_groups"/>
- <combo_box.item label="Intimidatie &gt; Beweging verhinderen" name="Harassment__Impeding_movement"/>
- <combo_box.item label="Intimidatie &gt; Seksuele intimidatie" name="Harassment__Sexual_harassment"/>
- <combo_box.item label="Intimidatie &gt; Anderen uitnodigen/aanzetten tot het schenden van de ToS" name="Harassment__Solicting_inciting_others_to_violate_ToS"/>
- <combo_box.item label="Intimidatie &gt; Verbaal misbruik" name="Harassment__Verbal_abuse"/>
- <combo_box.item label="Onfatsoenlijkheid &gt; Globaal beledigende inhoud of gedrag" name="Indecency__Broadly_offensive_content_or_conduct"/>
- <combo_box.item label="Onfatsoenlijkheid &gt; Ongepaste avatar naam" name="Indecency__Inappropriate_avatar_name"/>
- <combo_box.item label="Onfatsoenlijkheid &gt; Ongepaste inhoud of gedrag in een PG regio" name="Indecency__Mature_content_in_PG_region"/>
- <combo_box.item label="Onfatsoenlijkheid &gt; Ongepaste inhoud of gedrag in een Mature regio" name="Indecency__Inappropriate_content_in_Mature_region"/>
- <combo_box.item label="Inbreuk op intellectueel eigendom &gt; Verwijderen van inhoud" name="Intellectual_property_infringement_Content_Removal"/>
- <combo_box.item label="Inbreuk op intellectueel eigendom &gt; CopyBot of misbruik van permissies" name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit"/>
- <combo_box.item label="Intolerantie" name="Intolerance"/>
- <combo_box.item label="Land &gt; Misbruik van zandbakmiddelen" name="Land__Abuse_of_sandbox_resources"/>
- <combo_box.item label="Land &gt; Indringing &gt; Objecten/texturen" name="Land__Encroachment__Objects_textures"/>
- <combo_box.item label="Land &gt; Indringing &gt; Particles" name="Land__Encroachment__Particles"/>
- <combo_box.item label="Land &gt; Indringing &gt; Bomen/planten" name="Land__Encroachment__Trees_plants"/>
- <combo_box.item label="Weddenschappen/gokken" name="Wagering_gambling"/>
- <combo_box.item label="Anders" name="Other"/>
- </combo_box>
- <text name="abuser_name_title">
- Misbruikernaam:
- </text>
- <button label="Kies inwoner" label_selected="" name="select_abuser" tool_tip="Selecteer de naam van de misbruiker uit een lijst"/>
- <text name="abuser_name_title2">
- Locatie van misbruik:
- </text>
- <text name="sum_title">
- Samenvatting:
- </text>
- <text name="dscr_title">
- Details:
- </text>
- <text name="bug_aviso">
- Wees zo specifiek mogelijk
- </text>
- <text name="incomplete_title">
- Let Op: Onvolledige verslagen zullen niet worden onderzocht
- </text>
- <button label="Misbruik rapporteren" label_selected="Misbruik rapporteren" name="send_btn"/>
- <button label="Annuleren" label_selected="Annuleren" name="cancel_btn"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_script_debug.xml b/indra/newview/skins/default/xui/nl/floater_script_debug.xml
deleted file mode 100644
index 15e57f30d6..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_script_debug.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<multi_floater name="script debug floater" title="Script waarschuwing/fout">
- <tab_container name="Preview Tabs">
- <floater label="Script" name="all_scripts" title="[ALL SCRIPTS]"/>
- </tab_container>
-</multi_floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_script_preview.xml b/indra/newview/skins/default/xui/nl/floater_script_preview.xml
deleted file mode 100644
index bd57e27b77..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_script_preview.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="preview lsl text" title="SCRIPT: ROTATIESCRIPT">
- <text name="desc txt">
- Omschrijving:
- </text>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_script_queue.xml b/indra/newview/skins/default/xui/nl/floater_script_queue.xml
deleted file mode 100644
index f79ad8faf3..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_script_queue.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="queue" title="VOORTGANG OPNIEUW INSTELLEN">
- <button label="Sluiten" label_selected="Sluiten" name="close"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_script_search.xml b/indra/newview/skins/default/xui/nl/floater_script_search.xml
deleted file mode 100644
index cf502c6f4d..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_script_search.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="script search" title="SCRIPT ZOEKEN">
- <check_box label="Niet hoofdlettergevoelig" name="case_text"/>
- <button label="Zoeken" label_selected="Zoeken" name="search_btn" left="4"/>
- <button label="Vervangen" label_selected="Vervangen" name="replace_btn" left="100"/>
- <button label="Alles vervangen" label_selected="Alles vervangen" name="replace_all_btn" width="100" left="196"/>
- <text name="txt">
- Zoeken
- </text>
- <text name="txt2" width="130">
- Vervangen
- </text>
- <line_editor left="65" name="search_text" width="230" />
- <line_editor left="65" name="replace_text" width="230" />
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_select_key.xml b/indra/newview/skins/default/xui/nl/floater_select_key.xml
deleted file mode 100644
index c8daa10ab6..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_select_key.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="modal container" title="">
- <button label="Annuleren" label_selected="Annuleren" name="Cancel"/>
- <text name="Save item as:" left="12" width="220">
- Druk op een toets om die te selecteren
- </text>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_sell_land.xml b/indra/newview/skins/default/xui/nl/floater_sell_land.xml
deleted file mode 100644
index 468a383cfc..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_sell_land.xml
+++ /dev/null
@@ -1,65 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="sell land" title="VERKOOP LAND">
- <scroll_container name="profile_scroll">
- <panel name="scroll_content_panel">
- <text name="info_parcel_label">
- Perceel:
- </text>
- <text name="info_parcel">
- PERCEEL NAAM
- </text>
- <text name="info_size_label">
- Grootte:
- </text>
- <text name="info_size">
- [AREA] m²
- </text>
- <text height="28" name="info_action" bottom_delta="-57">
- Om dit perceel te
-verkopen:
- </text>
- <icon bottom_delta="-86" name="step_price" />
- <text name="price_label">
- Stel een prijs in:
- </text>
- <text name="price_text">
- Kies een geschikte prijs voor dit land.
- </text>
- <text name="price_ld">
- L$
- </text>
- <text name="price_per_m">
- (L$[PER_METER] per vierkante meter)
- </text>
- <text name="sell_to_label">
- Verkoop het land aan:
- </text>
- <text name="sell_to_text">
- Kies of u aan iedereen wil verkopen of een specifieke koper.
- </text>
- <combo_box name="sell_to">
- <combo_box.item name="--selectone--" label="selecteer een --"/>
- <combo_box.item name="Anyone" label="Iedereen"/>
- <combo_box.item name="Specificuser:" label="Specifieke gebruiker:"/>
- </combo_box>
- <button label="Selecteren..." name="sell_to_select_agent"/>
- <text name="sell_objects_label">
- Verkoop de objecten samen met het land?
- </text>
- <text name="sell_objects_text">
- Overdraagbare objecten die eigendom zijn van de landeigenaar
-zullen van eigenaar veranderen.
- </text>
- <radio_group name="sell_objects" bottom_delta="-58">
- <radio_item name="no" label="Nee, behoud het eigendom van objecten" />
- <radio_item name="yes" label="Ja, verkoop objecten met het land" />
- </radio_group>
- <button label="Toon objecten" name="show_objects"/>
- <text name="nag_message_label">
- ONTHOUD: Alle verkopen zijn definitief.
- </text>
- <button label="Zet het land te koop" name="sell_btn"/>
- <button label="Annuleren" name="cancel_btn"/>
- </panel>
- </scroll_container>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_settings_debug.xml b/indra/newview/skins/default/xui/nl/floater_settings_debug.xml
deleted file mode 100644
index 4d95f0a828..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_settings_debug.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="settings_debug" title="DEBUG INSTELLINGEN">
- <combo_box name="boolean_combo">
- <combo_box.item name="TRUE" label="TRUE"/>
- <combo_box.item name="FALSE" label="FALSE"/>
- </combo_box>
- <color_swatch label="Kleur" name="color_swatch"/>
- <spinner label="x" name="val_spinner_1"/>
- <spinner label="x" name="val_spinner_2"/>
- <spinner label="x" name="val_spinner_3"/>
- <spinner label="x" name="val_spinner_4"/>
- <button label="Opnieuw instellen naar standaard" name="default_btn" width="210"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_snapshot.xml b/indra/newview/skins/default/xui/nl/floater_snapshot.xml
deleted file mode 100644
index 251f3690da..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_snapshot.xml
+++ /dev/null
@@ -1,79 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Snapshot" title="FOTOVOORBEELD">
- <text name="type_label">
- Fotobestemming
- </text>
- <radio_group label="Fototype" name="snapshot_type_radio">
- <radio_item name="postcard" label="Verzend via e-mail" />
- <radio_item name="texture" label="Opslaan in uw inventaris (L$[AMOUNT])" />
- <radio_item name="local" label="Opslaan op uw harde schijf" />
- </radio_group>
- <text name="file_size_label">
- Bestandsgrootte: [SIZE] KB
- </text>
- <button label="Ververs foto" name="new_snapshot_btn"/>
- <button label="Verzenden" name="send_btn"/>
- <button label="Opslaan (L$[AMOUNT])" name="upload_btn"/>
- <flyout_button label="Opslaan" name="save_btn" tool_tip="Afbeelding in een bestand opslaan">
- <flyout_button_item name="save_item" label="Opslaan"/>
- <flyout_button_item name="saveas_item" label="Opslaan als..."/>
- </flyout_button>
- <button label="Annuleren" name="discard_btn"/>
- <button label="Meer &gt;&gt;" name="more_btn" tool_tip="Geavanceerde opties"/>
- <button label="&lt;&lt; Minder" name="less_btn" tool_tip="Geavanceerde opties"/>
- <text name="type_label2">
- Grootte
- </text>
- <text name="format_label">
- Formaat
- </text>
- <combo_box label="Resolutie" name="postcard_size_combo">
- <combo_box.item name="CurrentWindow" label="Huidig venster"/>
- <combo_box.item name="640x480" label="640x480"/>
- <combo_box.item name="800x600" label="800x600"/>
- <combo_box.item name="1024x768" label="1024x768"/>
- <combo_box.item name="Custom" label="Aangepast"/>
- </combo_box>
- <combo_box label="Resolutie" name="texture_size_combo">
- <combo_box.item name="CurrentWindow" label="Huidig venster"/>
- <combo_box.item name="Small(128x128)" label="Klein (128x128)"/>
- <combo_box.item name="Medium(256x256)" label="Middel (256x256)"/>
- <combo_box.item name="Large(512x512)" label="Groot (512x512)"/>
- <combo_box.item name="Custom" label="Aangepast"/>
- </combo_box>
- <combo_box label="Resolutie" name="local_size_combo">
- <combo_box.item name="CurrentWindow" label="Huidig venster"/>
- <combo_box.item name="320x240" label="320x240"/>
- <combo_box.item name="640x480" label="640x480"/>
- <combo_box.item name="800x600" label="800x600"/>
- <combo_box.item name="1024x768" label="1024x768"/>
- <combo_box.item name="1280x1024" label="1280x1024"/>
- <combo_box.item name="1600x1200" label="1600x1200"/>
- <combo_box.item name="Custom" label="Aangepast"/>
- </combo_box>
- <combo_box label="Formaat" name="local_format_combo">
- <combo_box.item name="PNG" label="PNG"/>
- <combo_box.item name="JPEG" label="JPEG"/>
- <combo_box.item name="BMP" label="BMP"/>
- </combo_box>
- <spinner label="Breedte" name="snapshot_width" label_width="48" width="100"/>
- <spinner label="Hoogte" name="snapshot_height" label_width="41" width="95" left="114"/>
- <check_box label="Beperk verhoudingen" name="keep_aspect_check"/>
- <slider label="Afbeeldingkwaliteit" name="image_quality_slider"/>
- <text name="layer_type_label" width="100">
- Vastleggen:
- </text>
- <combo_box label="Afbeeldingslagen" name="layer_types" width="130" left="76">
- <combo_box.item name="Colors" label="Kleuren"/>
- <combo_box.item name="Depth" label="Diepte"/>
- <combo_box.item name="ObjectMattes" label="Object matheid"/>
- </combo_box>
- <check_box label="Toon interface in foto" name="ui_check"/>
- <check_box label="Toon HUD objecten in foto" name="hud_check"/>
- <check_box label="Open houden na opslaan" name="keep_open_check"/>
- <check_box label="Frame bevriezen" name="freeze_frame_check"/>
- <check_box label="Automatisch verversen" name="auto_snapshot_check"/>
- <string name="unknown">
- onbekend
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_sound_preview.xml b/indra/newview/skins/default/xui/nl/floater_sound_preview.xml
deleted file mode 100644
index 13cb832d57..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_sound_preview.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Sound Preview" title="SOUND.WAV">
- <text name="name_label">
- Naam:
- </text>
- <text name="description_label">
- Omschrijving:
- </text>
- <button label="Annuleren" label_selected="Annuleren" name="cancel_btn"/>
- <button label="Upload (L$[AMOUNT])" label_selected="Upload (L$[AMOUNT])" name="ok_btn"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_stats.xml b/indra/newview/skins/default/xui/nl/floater_stats.xml
deleted file mode 100644
index 0db3f76735..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_stats.xml
+++ /dev/null
@@ -1,71 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Statistics" title="STATISTIEKEN">
- <scroll_container name="statistics_scroll">
- <container_view name="statistics_view">
- <stat_view label="Basis" name="basic">
- <stat_bar label="FPS" name="fps"/>
- <stat_bar label="Bandbreedte" name="bandwidth"/>
- <stat_bar label="Pakket Verlies" name="packet_loss"/>
- <stat_bar label="Ping Sim" name="ping"/>
- </stat_view>
- <stat_view label="Geavanceerd" name="advanced">
- <stat_view label="Weergeven" name="render">
- <stat_bar label="KTris Tekenen" name="ktrisframe"/>
- <stat_bar label="KTris Tekenen" name="ktrissec"/>
- <stat_bar label="Totaal Voorwerpen" name="objs"/>
- <stat_bar label="Nieuwe Voorwerpen" name="newobjs"/>
- </stat_view>
- <stat_view label="Textuur" name="texture">
- <stat_bar label="Count" name="numimagesstat"/>
- <stat_bar label="Raw Count" name="numrawimagesstat"/>
- <stat_bar label="GL Mem" name="gltexmemstat"/>
- <stat_bar label="Formatted Mem" name="formattedmemstat"/>
- <stat_bar label="Raw Mem" name="rawmemstat"/>
- <stat_bar label="Bound Mem" name="glboundmemstat"/>
- </stat_view>
- <stat_view label="Netwerk" name="network">
- <stat_bar label="Pakketten In" name="packetsinstat"/>
- <stat_bar label="Pakketten Uit" name="packetsoutstat"/>
- <stat_bar label="Voorwerpen" name="objectkbitstat"/>
- <stat_bar label="Textuur" name="texturekbitstat"/>
- <stat_bar label="Bezit" name="assetkbitstat"/>
- <stat_bar label="Lagen" name="layerskbitstat"/>
- <stat_bar label="Daadwerkelijk In" name="actualinkbitstat"/>
- <stat_bar label="Daadwerkelijk Out" name="actualoutkbitstat"/>
- <stat_bar label="VFS Pending Ops" name="vfspendingoperations"/>
- </stat_view>
- </stat_view>
- <stat_view label="Simulator" name="sim">
- <stat_bar label="Tijd Dilatatie" name="simtimedilation"/>
- <stat_bar label="Sim FPS" name="simfps"/>
- <stat_bar label="Physics FPS" name="simphysicsfps"/>
- <stat_view label="Physics Details" name="physicsdetail">
- <stat_bar label="Pinned Objects" name="physicspinnedtasks"/>
- <stat_bar label="Low LOD Objects" name="physicslodtasks"/>
- <stat_bar label="Memory Allocated" name="physicsmemoryallocated"/>
- <stat_bar label="Agent Updates/Sec" name="simagentups"/>
- <stat_bar label="Main Agents" name="simmainagents"/>
- <stat_bar label="Child Agents" name="simchildagents"/>
- <stat_bar label="Voorwerpen" name="simobjects"/>
- <stat_bar label="Actieve Voorwerpen" name="simactiveobjects"/>
- <stat_bar label="Actieve Scripts" name="simactivescripts"/>
- <stat_bar label="Actieve Evenementen" name="simscripteps"/>
- <stat_bar label="Pakketten In" name="siminpps"/>
- <stat_bar label="Pakketten Uit" name="simoutpps"/>
- <stat_bar label="Wachtende Downloads" name="simpendingdownloads"/>
- <stat_bar label="Wachtende Uploads" name="simpendinguploads"/>
- <stat_bar label="Total Unacked Bytes" name="simtotalunackedbytes"/>
- </stat_view>
- <stat_view label="Tijd (ms)" name="simperf">
- <stat_bar label="Totale Frame Tijd" name="simframemsec"/>
- <stat_bar label="Net Time" name="simnetmsec"/>
- <stat_bar label="Physics Time" name="simsimphysicsmsec"/>
- <stat_bar label="Simulatie Tijd" name="simsimothermsec"/>
- <stat_bar label="Agent Tijd" name="simagentmsec"/>
- <stat_bar label="Plaatjes Tijd" name="simimagesmsec"/>
- <stat_bar label="Script Tijd" name="simscriptmsec"/>
- </stat_view>
- </stat_view>
- </container_view>
- </scroll_container>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_telehub.xml b/indra/newview/skins/default/xui/nl/floater_telehub.xml
deleted file mode 100644
index 7b745d967c..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_telehub.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="telehub" title="TELEHUB" width="292">
- <text name="status_text_connected">
- Telehub verbonden met object [OBJECT]
- </text>
- <text name="status_text_not_connected">
- Geen telehub verbonden.
- </text>
- <text name="help_text_connected">
- Om te verwijderen, klik Verbinding verbreken
- </text>
- <text name="help_text_not_connected">
- Selecteer objecten klik Verbind telehub
- </text>
- <button label="Verbind telehub" name="connect_btn"/>
- <button label="Verbinding verbreken" name="disconnect_btn" width="128"/>
- <text name="spawn_points_text">
- Spawnpunten (posities, niet objecten):
- </text>
- <scroll_list bottom_delta="-44" draw_border="true" follows="left|top"
- height="40" left="10" multi_select="false" name="spawn_points_list"
- width="230" />
-
- <button label="Spawn toevoegen" name="add_spawn_point_btn"/>
- <button label="Verwijder Spawn" name="remove_spawn_point_btn"/>
- <text name="spawn_point_help" width="290">
- Selecteer object en klik Toevoegen om positie
-te specificeren. U kunt het object daarna verplaatsen
-of verwijderen. Posities zijn relatief ten opzichte
-van het middelpunt van de telehub. Selecteer een
-item in de lijst om de positie in de wereld te tonen.
- </text>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/nl/floater_texture_ctrl.xml
deleted file mode 100644
index c8caa8caf4..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_texture_ctrl.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="texture picker" title="KIES: TEXTUUR">
- <string name="choose_picture">
- Klik om een afbeelding te kiezen
- </string>
- <text name="Multiple">
- Meerdere
- </text>
- <text name="unknown">
- Afmetingen: [DIMENSIONS]
- </text>
- <button label="Standaard" label_selected="Standaard" name="Default" width="70"/>
- <button label="Geen" label_selected="Geen" name="None" left="80"/>
- <button label="Blanco" label_selected="Blanco" name="Blank"/>
- <check_box label="Toon mappen" name="show_folders_check"/>
- <search_editor label="Type hier om te zoeken" name="inventory search editor"/>
- <check_box label="Direct toepassen" name="apply_immediate_check"/>
- <button label="Annuleren" label_selected="Annuleren" name="Cancel"/>
- <button label="Selecteren" label_selected="Selecteren" name="Select"/>
- <string name="pick title">
- Kies:
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_tools.xml b/indra/newview/skins/default/xui/nl/floater_tools.xml
deleted file mode 100644
index 4ffe675831..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_tools.xml
+++ /dev/null
@@ -1,573 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="toolbox floater" title="" short_title="BOUWEN" height="592">
- <button label="" label_selected="" name="button focus" tool_tip="Focus"/>
- <button label="" label_selected="" name="button move" tool_tip="Verplaats"/>
- <button label="" label_selected="" name="button edit" tool_tip="Bewerk"/>
- <button label="" label_selected="" name="button create" tool_tip="Maak"/>
- <button label="" label_selected="" name="button land" tool_tip="Land"/>
- <radio_group name="focus_radio_group">
- <radio_item label="Zoom" name="radio zoom"/>
- <radio_item label="Roteren (Ctrl)" name="radio orbit"/>
- <radio_item label="Verplaatsen (Ctrl-Shift)" name="radio pan"/>
- </radio_group>
- <radio_group name="move_radio_group">
- <radio_item label="Verplaatsen" name="radio move"/>
- <radio_item label="Optillen (Ctrl)" name="radio lift"/>
- <radio_item label="Roteren (Ctrl-Shift)" name="radio spin"/>
- </radio_group>
- <radio_group name="edit_radio_group">
- <radio_item label="Positie" name="radio position"/>
- <radio_item label="Roteren (Ctrl)" name="radio rotate"/>
- <radio_item label="Uitrekken (Ctrl-Shift)" name="radio stretch"/>
- <radio_item label="Selecteer textuur" name="radio select face"/>
- </radio_group>
- <check_box label="Bewerk gekoppelde onderdelen" name="checkbox edit linked parts"/>
- <text name="text ruler mode">
- Liniaal:
- </text>
- <combo_box name="combobox grid mode">
- <combo_box.item name="World" label="Wereld"
- />
- <combo_box.item name="Local" label="Lokaal"
- />
- <combo_box.item name="Reference" label="Referentie"
- />
- </combo_box>
- <check_box left="136" name="checkbox uniform"/>
- <text name="checkbox uniform label">
- Beide zijden uitrekken
- </text>
- <check_box left="136" label="Texturen uitrekken" name="checkbox stretch textures"/>
- <check_box left="136" label="Gebruik grid" name="checkbox snap to grid"/>
- <button label="Opties..." label_selected="Opties..." name="Options..." height="18" bottom_delta="-15"/>
- <text name="text status" width="280">
- Sleep om te verplaatsen, Shift-slepen om te kopiëren
- </text>
- <button label="" label_selected="" name="ToolCube" tool_tip="Kubus"/>
- <button label="" label_selected="" name="ToolPrism" tool_tip="Prisma"/>
- <button label="" label_selected="" name="ToolPyramid" tool_tip="Piramide"/>
- <button label="" label_selected="" name="ToolTetrahedron" tool_tip="Tetrahedron"/>
- <button label="" label_selected="" name="ToolCylinder" tool_tip="Cilinder"/>
- <button label="" label_selected="" name="ToolHemiCylinder" tool_tip="Halve cilinder"/>
- <button label="" label_selected="" name="ToolCone" tool_tip="Kegel"/>
- <button label="" label_selected="" name="ToolHemiCone" tool_tip="Halve kegel"/>
- <button label="" label_selected="" name="ToolSphere" tool_tip="Bol"/>
- <button label="" label_selected="" name="ToolHemiSphere" tool_tip="Halve bol"/>
- <button label="" label_selected="" name="ToolTorus" tool_tip="Torus"/>
- <button label="" label_selected="" name="ToolTube" tool_tip="Buis"/>
- <button label="" label_selected="" name="ToolRing" tool_tip="Ring"/>
- <button label="" label_selected="" name="ToolTree" tool_tip="Boom"/>
- <button label="" label_selected="" name="ToolGrass" tool_tip="Gras"/>
- <check_box label="Behoud geselecteerd" name="checkbox sticky"/>
- <check_box label="Kopiëer Selectie" name="checkbox copy selection"/>
- <check_box label="Middelpunt" name="checkbox copy centers"/>
- <check_box label="Roteer" name="checkbox copy rotates"/>
- <radio_group name="land_radio_group">
- <radio_item label="Selecteer land" name="radio select land"/>
- <radio_item label="Vlak maken" name="radio flatten"/>
- <radio_item label="Verhogen" name="radio raise"/>
- <radio_item label="Verlagen" name="radio lower"/>
- <radio_item label="Egaliseren" name="radio smooth"/>
- <radio_item label="Opruwen" name="radio noise"/>
- <radio_item label="Herstellen" name="radio revert"/>
- </radio_group>
- <button label="Toepassen" label_selected="Toepassen" name="button apply to selection" tool_tip="Wijzig geselecteerd land"/>
- <text name="Bulldozer:">
- Bulldozer:
- </text>
- <text name="Dozer Size:">
- Grootte
- </text>
- <text name="Strength:">
- Sterkte
- </text>
- <text name="obj_count" top_pad="20">
- Geselecteerde objecten: [COUNT]
- </text>
- <text name="prim_count">
- primitieven: [COUNT]
- </text>
- <tab_container name="Object Info Tabs" tab_max_width="62" tab_min_width="30" top="185">
- <panel label="Algemeen" name="General">
- <text name="Name:">
- Naam:
- </text>
- <text name="Description:">
- Omschrijving:
- </text>
- <text name="Creator:">
- Maker:
- </text>
- <text name="Creator Name">
- Thrax Linden
- </text>
- <button label="Profiel..." label_selected="Profiel..." name="button creator profile"/>
- <text name="Owner:">
- Eigenaar:
- </text>
- <text name="Owner Name">
- Thrax Linden
- </text>
- <button label="Profiel..." label_selected="Profiel..." name="button owner profile"/>
- <text name="Group:">
- Groep:
- </text>
- <text name="Group Name Proxy">
- De Lindens
- </text>
- <button label="Instellen..." label_selected="Instellen..." name="button set group"/>
- <text name="Permissions:">
- Permissies:
- </text>
-
- <check_box label="Deel met groep" name="checkbox share with group" tool_tip="Alle leden van de ingestelde groep toestaan om te delen en uw permissies voor dit object te gebruiken. U moet &apos;Overdragen&apos; om rolbeperkingen in te schakelen."/>
- <string name="text deed continued">
- Overdragen...
- </string>
- <string name="text deed">
- Overdragen
- </string>
- <button label="Overdragen..." label_selected="Overdragen..." name="button deed" tool_tip="Groepgedeelde objecten kunnen door een groepofficier worden overgedragen"/>
- <check_box label="Iedereen mag verplaatsen" name="checkbox allow everyone move"/>
- <check_box label="Iedereen mag kopiëren" name="checkbox allow everyone copy"/>
- <check_box label="Toon in zoeken" name="search_check" tool_tip="Laat mensen dit object zien in zoekresultaten"/>
- <check_box label="Te koop" name="checkbox for sale"/>
- <text name="Cost">
- Prijs: L$
- </text>
- <combo_box name="sale type">
- <combo_box.item label="Kopie" name="Copy"/>
- <combo_box.item label="Inhoud" name="Contents"/>
- <combo_box.item label="Origineel" name="Original"/>
- </combo_box>
-
- <text name="label click action">
- Wanneer links-geklikt:
- </text>
- <combo_box name="clickaction">
- <combo_box.item name="Touch/grab(default)" label="Aanraken/pakken (standaard)"
- />
- <combo_box.item name="Sitonobject" label="Zit op object"
- />
- <combo_box.item name="Buyobject" label="Koop object"
- />
- <combo_box.item name="Payobject" label="Betaal object"
- />
- <combo_box.item name="Open" label="Open"
- />
- <combo_box.item name="Play" label="Perceelmedia afspelen"
- />
- <combo_box.item name="Opemmedia" label="Perceelmedia openen"
- />
- </combo_box>
- <panel name="perms_build">
- <text name="perm_modify">
- U kunt dit object wijzigen
- </text>
- <text name="B:">
- B:
- </text>
- <text name="O:">
- O:
- </text>
- <text name="G:">
- G:
- </text>
- <text name="E:">
- E:
- </text>
- <text name="N:">
- N:
- </text>
- <text name="F:">
- F:
- </text>
- <text name="Next owner can:">
- Volgende eigenaar kan:
- </text>
- <check_box label="Wijzigen" name="checkbox next owner can modify"/>
- <check_box label="Kopiëren" name="checkbox next owner can copy" left_delta="80"/>
- <check_box name="checkbox next owner can transfer" left_delta="67"/>
- </panel>
- <string name="text modify info 1">
- U kunt dit object wijzigen
- </string>
- <string name="text modify info 2">
- U kunt deze objecten wijzigen
- </string>
- <string name="text modify info 3">
- U kunt dit object niet wijzigen
- </string>
- <string name="text modify info 4">
- U kunt deze objecten niet wijzigen
- </string>
- <string name="text modify warning">
- U moet het hele object selecteren om permissies in te stellen
- </string>
- <string name="Cost Default">
- Prijs: L$
- </string>
- <string name="Cost Total">
- Totale Prijs: L$
- </string>
- <string name="Cost Per Unit">
- Prijs per: L$
- </string>
- <string name="Cost Mixed">
- Gemengde prijs
- </string>
- <string name="Sale Mixed">
- Gemengde verkoop
- </string>
- </panel>
- <panel label="Object" name="Object">
- <text name="select_single">
- Selecteer slechts één primitief om parameters te bewerken
- </text>
- <text name="edit_object">
- Bewerk object parameters:
- </text>
- <check_box label="Vergrendeld" name="checkbox locked" tool_tip="Voorkomt het verplaatsen of verwijderen van objecten. Regelmatig handig tijdens het bouwen om onbedoelde bewerkingen te voorkomen."/>
- <check_box label="Fysiek" name="Physical Checkbox Ctrl" tool_tip="Staat toe dat objecten geduwd worden en worden beïnvloed door de zwaartekracht"/>
- <check_box label="Tijdelijk" name="Temporary Checkbox Ctrl" tool_tip="Zorgt ervoor dat het object 1 minuut na creatie wordt verwijderd."/>
- <check_box label="Fantoom" name="Phantom Checkbox Ctrl" tool_tip="Zorgt ervoor dat objecten niet kunnen botsen met andere objecten of avatars"/>
- <text name="label position">
- Positie (meters)
- </text>
- <spinner label="X" name="Pos X"/>
- <spinner label="Y" name="Pos Y"/>
- <spinner label="Z" name="Pos Z"/>
- <text name="label size">
- Grootte (meters)
- </text>
- <spinner label="X" name="Scale X"/>
- <spinner label="Y" name="Scale Y"/>
- <spinner label="Z" name="Scale Z"/>
- <text name="label rotation">
- Rotatie (graden)
- </text>
- <spinner label="X" name="Rot X"/>
- <spinner label="Y" name="Rot Y"/>
- <spinner label="Z" name="Rot Z"/>
- <text name="label material">
- Materiaal
- </text>
- <combo_box name="material">
- <combo_box.item name="Stone" label="Steen"
- />
- <combo_box.item name="Metal" label="Metaal"
- />
- <combo_box.item name="Glass" label="Glas"
- />
- <combo_box.item name="Wood" label="Hout"
- />
- <combo_box.item name="Flesh" label="Vlees"
- />
- <combo_box.item name="Plastic" label="Plastic"
- />
- <combo_box.item name="Rubber" label="Rubber"
- />
- </combo_box>
- <text name="label basetype">
- Bouwbloktype
- </text>
- <combo_box name="comboBaseType">
- <combo_box.item name="Box" label="Kubus"
- />
- <combo_box.item name="Cylinder" label="Cilinder"
- />
- <combo_box.item name="Prism" label="Prisma"
- />
- <combo_box.item name="Sphere" label="Bol"
- />
- <combo_box.item name="Torus" label="Torus"
- />
- <combo_box.item name="Tube" label="Buis"
- />
- <combo_box.item name="Ring" label="Ring"
- />
- <combo_box.item name="Sculpted" label="Sculpted"
- />
- </combo_box>
- <text name="text cut">
- Uitsnede begin en einde
- </text>
- <spinner label="B" name="cut begin"/>
- <spinner label="E" name="cut end"/>
- <text name="text hollow">
- Hol
- </text>
- <text name="text skew">
- Verschuiven
- </text>
- <text name="Hollow Shape">
- Holtevorm
- </text>
- <combo_box name="hole">
- <combo_box.item name="Default" label="Standaard"
- />
- <combo_box.item name="Circle" label="Cirkel"
- />
- <combo_box.item name="Square" label="Vierkant"
- />
- <combo_box.item name="Triangle" label="Driehoek"
- />
- </combo_box>
- <text name="text twist">
- Verdraai begin en einde
- </text>
- <spinner label="B" name="Twist Begin"/>
- <spinner label="E" name="Twist End"/>
- <text name="scale_taper">
- Knijpen
- </text>
- <text name="scale_hole">
- Gatgrootte
- </text>
- <spinner label="X" name="Taper Scale X"/>
- <spinner label="Y" name="Taper Scale Y"/>
- <text name="text topshear">
- Bovenkant verschuiven
- </text>
- <spinner label="X" name="Shear X"/>
- <spinner label="Y" name="Shear Y"/>
- <text name="advanced_cut">
- Profielsnede begin en einde
- </text>
- <text name="advanced_dimple">
- Deuk begin en einde
- </text>
- <text name="advanced_slice">
- Uitsnede begin en einde
- </text>
- <spinner label="B" name="Path Limit Begin"/>
- <spinner label="E" name="Path Limit End"/>
- <text name="text taper2">
- Knijpen
- </text>
- <spinner label="X" name="Taper X"/>
- <spinner label="Y" name="Taper Y"/>
- <text name="text radius delta">
- Straal
- </text>
- <text name="text revolutions" width="84">
- Omwentelingen
- </text>
- <texture_picker label="Sculpt textuur" name="sculpt texture control" tool_tip="Klik om een afbeelding te kiezen"/>
- <check_box label="Spiegelen" name="sculpt mirror control" tool_tip="Spiegelt de sculpted prim om de X-as"/>
- <check_box label="Binnenstebuiten" name="sculpt invert control" tool_tip="Inverteert de normalen van de sculpted prim, zodat deze binnenstebuiten verschijnt."/>
- <text name="label sculpt type">
- Hechtingstype
- </text>
- <combo_box name="sculpt type control">
- <combo_box.item name="None" label="(geen)"
- />
- <combo_box.item name="Sphere" label="Bol"
- />
- <combo_box.item name="Torus" label="Torus"
- />
- <combo_box.item name="Plane" label="Vlak"
- />
- <combo_box.item name="Cylinder" label="Cilinder"
- />
- </combo_box>
- </panel>
- <panel label="Kenmerken" name="Features">
- <text name="select_single">
- Selecteer slechts één primitief om kenmerken te bewerken
- </text>
- <text name="edit_object">
- Bewerk objectkenmerken:
- </text>
- <check_box label="Flexibiliteit" name="Flexible1D Checkbox Ctrl" tool_tip="Staat toe dat objecten kunnen buigen om de Z-as. (alleen aan de client kant)"/>
- <spinner label="Zachtheid" name="FlexNumSections" width="143" label_width="80"/>
- <spinner label="Zwaartekracht" name="FlexGravity" width="143" label_width="80"/>
- <spinner label="Slepen" name="FlexFriction" width="143" label_width="80"/>
- <spinner label="Wind" name="FlexWind" width="143" label_width="80"/>
- <spinner label="Spanning" name="FlexTension" width="143" label_width="80"/>
- <spinner label="Kracht X" name="FlexForceX" width="143" label_width="80"/>
- <spinner label="Kracht Y" name="FlexForceY" width="143" label_width="80"/>
- <spinner label="Kracht Z" name="FlexForceZ" width="143" label_width="80"/>
- <check_box label="Licht" name="Light Checkbox Ctrl" tool_tip="Zorgt dat het object licht uitstraalt"/>
- <text name="label color">
- Kleur
- </text>
- <color_swatch label="" name="colorswatch" tool_tip="Klik om kleurkiezer to openen"/>
- <spinner label="Intensiteit" name="Light Intensity"/>
- <spinner label="Straal" name="Light Radius"/>
- <spinner label="Uitstraling" name="Light Falloff"/>
- </panel>
- <panel label="Textuur" name="Texture">
- <texture_picker label="Textuur" name="texture control" tool_tip="Klik om een afbeelding te kiezen"/>
- <color_swatch label="Kleur" name="colorswatch" tool_tip="Klik om kleurkiezer to openen"/>
- <text name="color trans" width="100">
- Transparantie %
- </text>
- <text name="glow label">
- Gloed
- </text>
- <check_box label="Volledige helderheid" name="checkbox fullbright" left_delta="-10"/>
- <text name="tex gen">
- Mapping
- </text>
- <combo_box name="combobox texgen">
- <combo_box.item name="Default" label="Standaard"
- />
- <combo_box.item name="Planar" label="Vlak"
- />
- </combo_box>
- <text name="label shininess">
- Glans
- </text>
- <combo_box name="combobox shininess">
- <combo_box.item name="None" label="Geen"
- />
- <combo_box.item name="Low" label="Laag"
- />
- <combo_box.item name="Medium" label="Middel"
- />
- <combo_box.item name="High" label="Hoog"
- />
- </combo_box>
- <text name="label bumpiness">
- Bumpiness
- </text>
- <combo_box name="combobox bumpiness">
- <combo_box.item name="None" label="Geen"
- />
- <combo_box.item name="Brightness" label="Helderheid"
- />
- <combo_box.item name="Darkness" label="Donkerheid"
- />
- <combo_box.item name="woodgrain" label="Houtnerf"
- />
- <combo_box.item name="bark" label="Schors"
- />
- <combo_box.item name="bricks" label="Stenen"
- />
- <combo_box.item name="checker" label="Dambord"
- />
- <combo_box.item name="concrete" label="Beton"
- />
- <combo_box.item name="crustytile" label="gebarsten tegels"
- />
- <combo_box.item name="cutstone" label="natuursteen"
- />
- <combo_box.item name="discs" label="schijven"
- />
- <combo_box.item name="gravel" label="grind"
- />
- <combo_box.item name="petridish" label="petrischaal"
- />
- <combo_box.item name="siding" label="wandpaneel"
- />
- <combo_box.item name="stonetile" label="plavuizen"
- />
- <combo_box.item name="stucco" label="stucwerk"
- />
- <combo_box.item name="suction" label="zuignappen"
- />
- <combo_box.item name="weave" label="weven"
- />
- </combo_box>
- <text name="tex scale">
- Herhalingen per zijde
- </text>
- <spinner label="Horizontaal (U)" name="TexScaleU"/>
- <check_box label="Omkeren" name="checkbox flip s"/>
- <spinner label="Verticaal (V)" name="TexScaleV"/>
- <check_box label="Omkeren" name="checkbox flip t"/>
- <text name="tex rotate">
- Rotatie (graden)
- </text>
- <string name="string repeats per meter">
- Herhalingen per meter
- </string>
- <string name="string repeats per face">
- Herhalingen per zijde
- </string>
- <text name="rpt">
- Herhalingen per m
- </text>
- <button label="Toepassen" label_selected="Toepassen" name="button apply"/>
- <text name="tex offset">
- Verplaatsing
- </text>
- <spinner label="Horizontaal (U)" name="TexOffsetU"/>
- <spinner label="Verticaal (V)" name="TexOffsetV"/>
- <text name="textbox autofix">
- Mediatextuur uitlijnen
-(moet eerst laden)
- </text>
- <button label="Uitlijnen" label_selected="Uitlijnen" name="button align" left="155" />
- </panel>
- <panel label="Inhoud" name="Contents">
- <button label="Nieuw script" label_selected="Nieuw script" name="button new script"/>
- <button label="Permissies" name="button permissions"/>
- <panel name="ContentsInventory" width="272" />
- </panel>
- </tab_container>
- <panel name="land info panel">
- <text name="label_parcel_info">
- Perceel Informatie
- </text>
- <text name="label_area_price">
- Prijs: L$[PRICE] voor [AREA] m².
- </text>
- <text name="label_area">
- Gebied: [AREA] m².
- </text>
- <button label="Over land..." label_selected="Over land..." name="button about land"/>
- <check_box label="Toon Eigenaren" name="checkbox show owners" tool_tip="Kleur percelen op basis van hun eigendom: &#10;&#10;Groen = Uw land &#10;Aqua = Land van uw groep &#10;Rood = Eigendom van anderen &#10;Geel = Te koop &#10;Paars = Ter veiling &#10;Grijs = Openbaar"/>
- <button label="?" label_selected="?" name="button show owners help" left_delta="105"/>
- <text name="label_parcel_modify">
- Wijzig Perceel
- </text>
- <button label="Opdelen" label_selected="Opdelen" name="button subdivide land"/>
- <button label="Samenvoegen" label_selected="Samenvoegen" name="button join land"/>
- <text name="label_parcel_trans">
- Landtransacties
- </text>
- <button label="Koop land" label_selected="Koop land" name="button buy land"/>
- <button label="Land Afstaan" label_selected="Land Afstaan" name="button abandon land"/>
- </panel>
- <floater.string name="status_rotate">
- Sleep de gekleurde banden om het object te roteren
- </floater.string>
- <floater.string name="status_scale">
- Klik en sleep om de geselecteerde zijde uit te rekken.
- </floater.string>
- <floater.string name="status_move">
- Sleep om te verplaatsen, Shift-slepen om te kopiëren
- </floater.string>
- <floater.string name="status_modifyland">
- Klik en houd vast om land te wijzigen
- </floater.string>
- <floater.string name="status_camera">
- Klik en sleep om beeld te wijzigen
- </floater.string>
- <floater.string name="status_grab">
- Sleep om te verplaatsen, Ctrl om op te tillen, Ctrl-Shift om te roteren.
- </floater.string>
- <floater.string name="status_place">
- Klik in-wereld om te bouwen
- </floater.string>
- <floater.string name="status_selectland">
- Klik en sleep om land te selecteren
- </floater.string>
- <floater.string name="grid_screen_text">
- Scherm
- </floater.string>
- <floater.string name="grid_local_text">
- Lokaal
- </floater.string>
- <floater.string name="grid_world_text">
- Wereld
- </floater.string>
- <floater.string name="grid_reference_text">
- Referentie
- </floater.string>
- <floater.string name="grid_attachment_text">
- Bevestiging
- </floater.string>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_top_objects.xml b/indra/newview/skins/default/xui/nl/floater_top_objects.xml
deleted file mode 100644
index 2bbb701df8..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_top_objects.xml
+++ /dev/null
@@ -1,55 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="top_objects" title="LADEN…">
- <text name="title_text">
- Laden…
- </text>
- <scroll_list name="objects_list">
- <column label="Score" name="score" width="84"/>
- <column label="Naam" name="name" width="84"/>
- <column label="Eigenaar" name="owner" width="84"/>
- <column label="Locatie" name="location" width="84"/>
- <column label="Tijd" name="time" width="84"/>
- <column label="Mono tijd" name="mono_time" width="84"/>
- </scroll_list>
- <text name="id_text" left="2">
- Object ID:
- </text>
- <button label="Toon baken" name="show_beacon_btn"/>
- <text name="obj_name_text" left="2">
- Object naam:
- </text>
- <button label="Filter" name="filter_object_btn"/>
- <text name="owner_name_text" left="2">
- Eigenaar naam:
- </text>
- <button label="Filter" name="filter_owner_btn"/>
- <button label="Geselecteerde retourneren" name="return_selected_btn" width="170"/>
- <button label="Alles retourneren" name="return_all_btn" left="190"/>
- <button label="Geselecteerde uitschakelen" name="disable_selected_btn" width="170"/>
- <button label="Alles uitschakelen" name="disable_all_btn" left="190"/>
- <button label="Verversen" name="refresh_btn"/>
- <string name="top_scripts_title">
- Top scripts
- </string>
- <string name="top_scripts_text">
- [COUNT] scripts besteden in totaal [TIME] ms
- </string>
- <string name="scripts_score_label">
- Tijd
- </string>
- <string name="scripts_mono_time_label">
- Mono tijd
- </string>
- <string name="top_colliders_title">
- Top botsingen
- </string>
- <string name="top_colliders_text">
- Top [COUNT] objecten die veel mogelijke botsingen ervaren.
- </string>
- <string name="colliders_score_label">
- Score
- </string>
- <string name="none_descriptor">
- Geen gevonden.
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_tos.xml b/indra/newview/skins/default/xui/nl/floater_tos.xml
deleted file mode 100644
index d71412664c..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_tos.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="modal container" title="">
- <button label="Doorgaan" label_selected="Doorgaan" name="Continue"/>
- <button label="Annuleren" label_selected="Annuleren" name="Cancel"/>
- <check_box label="Ik ga akkoord met de voorwaarden van service" name="agree_chk"/>
- <text name="tos_heading">
- Leest u alstublieft de volgende voorwaarden van service door. Om door te gaan met inloggen in
-[SECOND_LIFE] dient u de overeenkomst te accepteren.
- </text>
- <text_editor name="tos_text">
- TOS_TEXT
- </text_editor>
- <string name="real_url">
- http://secondlife.com/app/tos/
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_url_entry.xml b/indra/newview/skins/default/xui/nl/floater_url_entry.xml
deleted file mode 100644
index 6926f09390..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_url_entry.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="url_entry" title="">
- <text name="media_label">
- Media URL:
- </text>
- <button label="OK" name="ok_btn"/>
- <button label="Annuleren" name="cancel_btn" width="80"/>
- <button label="Leegmaken" name="clear_btn" width="80"/>
- <text name="loading_label">
- Laden…
- </text>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_water.xml b/indra/newview/skins/default/xui/nl/floater_water.xml
deleted file mode 100644
index 1fb1ca241b..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_water.xml
+++ /dev/null
@@ -1,89 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Water Floater" title="GEAVANCEERDE WATER EDITOR">
- <combo_box bottom="-50" height="18" left_delta="116" name="WaterPresetsCombo" width="150" />
- <text name="KeyFramePresetsText">
- Watervoorinstellingen
- </text>
- <button label="Nieuw" label_selected="Nieuw" name="WaterNewPreset" left_delta="190"/>
- <button label="Opslaan" label_selected="Opslaan" name="WaterSavePreset"/>
- <button label="Verwijderen" label_selected="Verwijderen" name="WaterDeletePreset" width="80"/>
- <tab_container name="Water Tabs">
- <panel label="Instellingen" name="Settings">
- <text name="BHText">
- Watermistkleur
- </text>
- <button label="?" name="WaterFogColorHelp"/>
- <color_swatch label="" name="WaterFogColor" tool_tip="Klik om de kleurkiezer te openen"/>
- <text name="WaterFogDensText">
- Mistdichtheidsexponent
- </text>
- <button label="?" name="WaterFogDensityHelp"/>
- <text name="WaterUnderWaterFogModText">
- Onderwatermist wijziger
- </text>
- <button label="?" name="WaterUnderWaterFogModHelp"/>
- <text name="BDensText">
- Reflectie wavelet schaal
- </text>
- <button label="?" name="WaterNormalScaleHelp"/>
- <text name="BHText2">
- 1
- </text>
- <text name="BHText3">
- 2
- </text>
- <text name="BHText4">
- 3
- </text>
- <text name="HDText">
- Fresnelschaal
- </text>
- <button label="?" name="WaterFresnelScaleHelp"/>
- <text name="FresnelOffsetText">
- Fresnelverplaatsing
- </text>
- <button label="?" name="WaterFresnelOffsetHelp"/>
- <text name="DensMultText">
- Refractieschaal boven
- </text>
- <button label="?" name="WaterScaleAboveHelp"/>
- <text name="WaterScaleBelowText">
- Refractieschaal onder
- </text>
- <button label="?" name="WaterScaleBelowHelp"/>
- <text name="MaxAltText">
- Wazigheidvermeerderaar
- </text>
- <button label="?" name="WaterBlurMultiplierHelp"/>
- </panel>
- <panel label="Afbeelding" name="Waves">
- <text name="BHText">
- Grote golven richting
- </text>
- <button label="?" name="WaterWave1Help"/>
- <text name="WaterWave1DirXText">
- X
- </text>
- <text name="WaterWave1DirYText">
- Y
- </text>
- <text name="BHText2">
- Kleine golf richting
- </text>
- <button label="?" name="WaterWave2Help"/>
- <text name="WaterWave2DirXText">
- X
- </text>
- <text name="WaterWave2DirYText">
- Y
- </text>
- <text name="BHText3">
- Normaalmap
- </text>
- <button label="?" name="WaterNormalMapHelp"/>
- </panel>
- </tab_container>
- <string name="WLDefaultWaterNames">
- Default:Glassy:Pond:Murky:Second Plague:SNAKE!!!:Valdez
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_windlight_options.xml b/indra/newview/skins/default/xui/nl/floater_windlight_options.xml
deleted file mode 100644
index d97c9679a9..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_windlight_options.xml
+++ /dev/null
@@ -1,192 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="WindLight floater" title="GEAVANCEERDE LUCHT EDITOR">
- <combo_box allow_text_entry="false" bottom="-50" follows="left|top" height="18"
- left_delta="116" max_chars="20" mouse_opaque="true" name="WLPresetsCombo"
- width="150" />
- <text name="KeyFramePresetsText">
- Lucht voorinstellingen
- </text>
- <button label="Nieuw" label_selected="Nieuw" name="WLNewPreset"/>
- <button label="Opslaan" label_selected="Opslaan" name="WLSavePreset"/>
- <button label="Verwijderen" label_selected="Verwijderen" name="WLDeletePreset" width="80"/>
- <button label="Dag cyclus editor" label_selected="Dag cyclus editor" name="WLDayCycleMenuButton"/>
- <tab_container name="WindLight Tabs">
- <panel label="Atmosfeer" name="Atmosphere">
- <text name="BHText">
- Blauw Horizon
- </text>
- <button label="?" name="WLBlueHorizonHelp"/>
- <text name="BHText2">
- R
- </text>
- <text name="BHText3">
- G
- </text>
- <text name="BHText4">
- B
- </text>
- <text name="BHText5">
- I
- </text>
- <text name="BDensText">
- Nevel horizon
- </text>
- <button label="?" name="WLHazeHorizonHelp"/>
- <text name="BDensText2">
- Blauw dichtheid
- </text>
- <button label="?" name="WLBlueDensityHelp"/>
- <text name="BHText6">
- R
- </text>
- <text name="BHText7">
- G
- </text>
- <text name="BHText8">
- B
- </text>
- <text name="BHText9">
- I
- </text>
- <text name="HDText">
- Nevel dichtheid
- </text>
- <button label="?" name="WLHazeDensityHelp"/>
- <text name="DensMultText">
- Dichtheidsfactor
- </text>
- <button label="?" name="WLDensityMultHelp"/>
- <text name="WLDistanceMultText">
- Afstandsfactor
- </text>
- <button label="?" name="WLDistanceMultHelp"/>
- <text name="MaxAltText">
- Max hoogte
- </text>
- <button label="?" name="WLMaxAltitudeHelp"/>
- </panel>
- <panel label="Licht" name="Lighting">
- <text name="SLCText">
- Zon/maan kleur
- </text>
- <button label="?" name="WLSunlightColorHelp"/>
- <text name="BHText">
- R
- </text>
- <text name="BHText2">
- G
- </text>
- <text name="BHText3">
- B
- </text>
- <text name="BHText4">
- I
- </text>
- <text name="TODText">
- Zon/maan positie
- </text>
- <button label="?" name="WLTimeOfDayHelp"/>
- <text name="WLAmbientText">
- Omgeving
- </text>
- <button label="?" name="WLAmbientHelp"/>
- <text name="BHText5">
- R
- </text>
- <text name="BHText6">
- G
- </text>
- <text name="BHText7">
- B
- </text>
- <text name="BHText8">
- I
- </text>
- <text name="WLEastAngleText">
- Oosthoek
- </text>
- <button label="?" name="WLEastAngleHelp"/>
- <text name="SunGlowText">
- Zonnegloed
- </text>
- <button label="?" name="WLSunGlowHelp"/>
- <slider label="Focus " name="WLGlowB"/>
- <slider label="Grootte" name="WLGlowR"/>
- <text name="SceneGammaText">
- Scenegamma
- </text>
- <button label="?" name="WLSceneGammaHelp"/>
- <text name="WLStarText">
- Ster helderheid
- </text>
- <button label="?" name="WLStarBrightnessHelp"/>
- </panel>
- <panel label="Wolken" name="Clouds">
- <text name="WLCloudColorText">
- Wolkenkleur
- </text>
- <button label="?" name="WLCloudColorHelp"/>
- <text name="BHText">
- R
- </text>
- <text name="BHText2">
- G
- </text>
- <text name="BHText3">
- B
- </text>
- <text name="BHText4">
- I
- </text>
- <text name="WLCloudColorText2">
- Wolken (XY/Dichtheid)
- </text>
- <button label="?" name="WLCloudDensityHelp"/>
- <text name="BHText5">
- X
- </text>
- <text name="BHText6">
- Y
- </text>
- <text name="BHText7">
- D
- </text>
- <text name="WLCloudCoverageText">
- Wolkenbedekking
- </text>
- <button label="?" name="WLCloudCoverageHelp"/>
- <text name="WLCloudScaleText">
- Wolkenschaal
- </text>
- <button label="?" name="WLCloudScaleHelp"/>
- <text name="WLCloudDetailText">
- Wolkendetail (XY/Dichtheid)
- </text>
- <button label="?" name="WLCloudDetailHelp" left="404"/>
- <text name="BHText8">
- X
- </text>
- <text name="BHText9">
- Y
- </text>
- <text name="BHText10">
- D
- </text>
- <text name="WLCloudScrollXText">
- Wolk verplaatsing X
- </text>
- <button label="?" name="WLCloudScrollXHelp" left="600"/>
- <check_box label="Vastzetten" name="WLCloudLockX" left="622"/>
- <text name="WLCloudScrollYText">
- Wolk verplaatsing Y
- </text>
- <button label="?" name="WLCloudScrollYHelp" left="600"/>
- <check_box label="Vastzetten" name="WLCloudLockY" left="622"/>
- <check_box label="Teken klassieke wolken" name="DrawClassicClouds"/>
- <button label="?" name="WLClassicCloudsHelp" left="620"/>
- </panel>
- </tab_container>
- <string name="WLDefaultSkyNames">
- A-12AM:A-12PM:A-3AM:A-3PM:A-4.30PM:A-6AM:A-6PM:A-9AM:A-9PM:Barcelona:Blizzard:Blue Midday:Coastal Afternoon:Coastal Sunset:Default:Desert Sunset:Fine Day:Fluffy Big Clouds:Foggy:Funky Funky:Funky Funky Funky:Gelatto:Ghost:Incongruent Truths:Midday 1:Midday 2:Midday 3:Midday 4:Night:Pirate:Purple:Sailor&apos;s Delight:Sheer Sensuality
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_world_map.xml b/indra/newview/skins/default/xui/nl/floater_world_map.xml
deleted file mode 100644
index 2fee2ecf05..0000000000
--- a/indra/newview/skins/default/xui/nl/floater_world_map.xml
+++ /dev/null
@@ -1,54 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="worldmap" title="WERELDKAART">
- <tab_container name="maptab">
- <panel label="Objecten" name="objects_mapview"/>
- <panel label="Terrein" name="terrain_mapview"/>
- </tab_container>
- <text name="you_label">
- U
- </text>
- <icon left="1058" name="home"/>
- <text name="home_label">
- Thuis
- </text>
- <text name="auction_label">
- Veiling
- </text>
- <text name="land_for_sale_label">
- Land te koop
- </text>
- <button width="122" left="1116" label="Ga naar Thuislocatie" label_selected="Ga naar Thuislocatie" name="Go Home" tool_tip="Teleport naar uw thuislocatie"/>
- <check_box label="Inwoner" name="people_chk"/>
- <check_box label="Infohub" name="infohub_chk"/>
- <check_box label="Telehub" name="telehubchk"/>
- <check_box label="Land te koop" name="land_for_sale_chk"/>
- <text name="events_label">
- Evenementen:
- </text>
- <check_box label="PG" name="event_chk"/>
- <check_box label="Mature" name="events_mature_chk"/>
- <check_box label="Adult" name="events_adult_chk"/>
- <combo_box label="Online vrienden" name="friend combo" tool_tip="Vriend die op kaart getoond wordt">
- <combo_box.item name="item1" label="Online vrienden"/>
- </combo_box>
- <combo_box label="Landmarkeringen" name="landmark combo" tool_tip="Landmarkering die op kaart getoond wordt">
- <combo_box.item name="item1" label="Landmarkeringen"/>
- </combo_box>
- <line_editor label="Zoek op regionaam" name="location" tool_tip="Type de naam van een regio"/>
- <button label="Zoeken" name="DoSearch" tool_tip="Zoek naar regio"/>
- <text name="search_label">
- Zoekresultaten
- </text>
- <text name="location_label">
- Locatie:
- </text>
- <spinner name="spin x" tool_tip="X coördinaat van de locatie die op de kaart getoond wordt"/>
- <spinner name="spin y" tool_tip="Y coördinaat van de locatie die op de kaart getoond wordt"/>
- <spinner name="spin z" tool_tip="Z coördinaat van de locatie die op de kaart getoond wordt"/>
- <button label="Teleport" label_selected="Teleport" name="Teleport" tool_tip="Teleport naar geselecteerde locatie"/>
- <button label="Toon bestemming" label_selected="Toon bestemming" name="Show Destination" tool_tip="Centreer kaart op geselecteerde locatie"/>
- <button label="Verwijder" label_selected="Verwijder" name="Clear" tool_tip="Stop volgen"/>
- <button label="Toon mijn locatie" label_selected="Toon mijn locatie" name="Show My Location" tool_tip="Centreer kaart op de locatie van uw avatar"/>
- <button label="Kopieer SLurl naar klembord" name="copy_slurl" tool_tip="Kopieert huidige locatie als SLurl, zodat deze op het web gebruikt kan worden."/>
- <slider label="Zoom" name="zoom slider"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/nl/language_settings.xml b/indra/newview/skins/default/xui/nl/language_settings.xml
deleted file mode 100644
index 53501d5dcb..0000000000
--- a/indra/newview/skins/default/xui/nl/language_settings.xml
+++ /dev/null
@@ -1,56 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<!-- This file contains strings that used to be hardcoded in the source.-->
-<strings>
-
- <!-- Locale Information -->
- <string name="MicrosoftLocale">dutch</string>
- <string name="DarwinLocale">nl_NL.UTF-8</string>
- <string name="LinuxLocale">nl_NL.UTF-8</string>
-
- <!--
- datetimeToCodes["wkday"] = "%a"; // Thu
- datetimeToCodes["weekday"] = "%A"; // Thursday
- datetimeToCodes["year4"] = "%Y"; // 2009
- datetimeToCodes["year"] = "%Y"; // 2009
- datetimeToCodes["year2"] = "%y"; // 09
- datetimeToCodes["mth"] = "%b"; // Aug
- datetimeToCodes["month"] = "%B"; // August
- datetimeToCodes["mthnum"] = "%m"; // 08
- datetimeToCodes["day"] = "%d"; // 31
- datetimeToCodes["sday"] = "%-d"; // 9
- datetimeToCodes["hour24"] = "%H"; // 14
- datetimeToCodes["hour"] = "%H"; // 14
- datetimeToCodes["hour12"] = "%I"; // 02
- datetimeToCodes["min"] = "%M"; // 59
- datetimeToCodes["ampm"] = "%p"; // AM
- datetimeToCodes["second"] = "%S"; // 59
- datetimeToCodes["timezone"] = "%Z"; // PST
- -->
-
- <string name="TimeHour">hour,datetime,slt</string>
- <string name="TimeMin">min,datetime,slt</string>
- <string name="TimeYear">year,datetime,slt</string>
- <string name="TimeDay">day,datetime,slt</string>
- <string name="TimeMonth">mthnum,datetime,slt</string>
- <string name="TimeWeek">wkday,datetime,slt</string>
- <string name="TimeAMPM">ampm,datetime,slt</string>
- <string name="TimeHour12">hour12,datetime,slt</string>
-
- <string name="LTimeMthNum">mthnum,datetime,local</string>
- <string name="LTimeWeek">wkday,datetime,local</string>
- <string name="LTimeMonth">mth,datetime,local</string>
- <string name="LTimeDay">day,datetime,local</string>
- <string name="LTimeSec">second,datetime,local</string>
- <string name="LTimeHour">hour,datetime,local</string>
- <string name="LTimeMin">min,datetime,local</string>
- <string name="LTimeYear">year,datetime,local</string>
-
- <string name="UTCTimeWeek">weekday,datetime,utc</string>
- <string name="UTCTimeDay">day,datetime,utc</string>
- <string name="UTCTimeMth">mth,datetime,utc</string>
- <string name="UTCTimeYr">year,datetime,utc</string>
- <string name="UTCTimeHr">hour,datetime,utc</string>
- <string name="UTCTimeMin">min,datetime,utc</string>
- <string name="UTCTimeSec">second,datetime,utc</string>
- <string name="UTCTimeTimezone">timezone,datetime,utc</string>
-</strings>
diff --git a/indra/newview/skins/default/xui/nl/menu_inventory.xml b/indra/newview/skins/default/xui/nl/menu_inventory.xml
deleted file mode 100644
index c3b47cbddb..0000000000
--- a/indra/newview/skins/default/xui/nl/menu_inventory.xml
+++ /dev/null
@@ -1,82 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Popup">
- <menu_item_call label="Koop" name="Task Buy"/>
- <menu_item_call label="Open" name="Task Open"/>
- <menu_item_call label="Afspelen" name="Task Play"/>
- <menu_item_call label="Eigenschappen" name="Task Properties"/>
- <menu_item_call label="Hernoemen" name="Task Rename"/>
- <menu_item_call label="Verwijderen" name="Task Remove"/>
- <menu_item_call label="Prullenbak legen" name="Empty Trash"/>
- <menu_item_call label="Verloren en gevonden leegmaken" name="Empty Lost And Found"/>
- <menu_item_call label="Nieuwe map" name="New Folder"/>
- <menu_item_call label="Nieuw script" name="New Script"/>
- <menu_item_call label="Nieuwe notitie" name="New Note"/>
- <menu_item_call label="Nieuw gebaar" name="New Gesture"/>
- <menu label="Nieuwe Kleding" name="New Clothes">
- <menu_item_call label="Nieuw shirt" name="New Shirt"/>
- <menu_item_call label="Nieuwe broek" name="New Pants"/>
- <menu_item_call label="Nieuwe schoenen" name="New Shoes"/>
- <menu_item_call label="Nieuwe sokken" name="New Socks"/>
- <menu_item_call label="Nieuwe jas" name="New Jacket"/>
- <menu_item_call label="Nieuwe rok" name="New Skirt"/>
- <menu_item_call label="Nieuwe handschoenen" name="New Gloves"/>
- <menu_item_call label="Nieuw onderhemd" name="New Undershirt"/>
- <menu_item_call label="Nieuwe onderbroek" name="New Underpants"/>
- <menu_item_call label="Nieuw Alpha Masker" name="New Alpha Mask"/>
- <menu_item_call label="Nieuwe Tattoo" name="New Tattoo"/>
- </menu>
- <menu label="Nieuwe Lichaamsdelen" name="New Body Parts">
- <menu_item_call label="Nieuwe postuur" name="New Shape"/>
- <menu_item_call label="Nieuwe huid" name="New Skin"/>
- <menu_item_call label="Nieuw haar" name="New Hair"/>
- <menu_item_call label="Nieuwe ogen" name="New Eyes"/>
- </menu>
- <menu label="Change Type" name="Change Type">
- <menu_item_call label="Standaard" name="Default"/>
- <menu_item_call label="Handschoenen" name="Gloves"/>
- <menu_item_call label="Jas" name="Jacket"/>
- <menu_item_call label="Broek" name="Pants"/>
- <menu_item_call label="Vorm" name="Shape"/>
- <menu_item_call label="Schoenen" name="Shoes"/>
- <menu_item_call label="Overhemd" name="Shirt"/>
- <menu_item_call label="Rok" name="Skirt"/>
- <menu_item_call label="Onderbroek" name="Underpants"/>
- <menu_item_call label="Onderhemd" name="Undershirt"/>
- </menu>
- <menu_item_call label="Teleport" name="Landmark Open"/>
- <menu_item_call label="Open" name="Animation Open"/>
- <menu_item_call label="Open" name="Sound Open"/>
- <menu_item_call label="Verwijderen item" name="Purge Item"/>
- <menu_item_call label="Herstellen item" name="Restore Item"/>
- <menu_item_call label="Ga Naar Link" name="Goto Link"/>
- <menu_item_call label="Open" name="Open"/>
- <menu_item_call label="Eigenschappen" name="Properties"/>
- <menu_item_call label="Hernoemen" name="Rename"/>
- <menu_item_call label="Kopieer asset UUID" name="Copy Asset UUID"/>
- <menu_item_call label="Kopiëren" name="Copy"/>
- <menu_item_call label="Plakken" name="Paste"/>
- <menu_item_call label="Plak Als Link" name="Paste As Link"/>
- <menu_item_call label="Verwijderen" name="Delete"/>
- <menu_item_call label="Items uitdoen" name="Take Off Items"/>
- <menu_item_call label="Voeg toe aan kleding" name="Add To Outfit"/>
- <menu_item_call label="Vervang kleding" name="Replace Outfit"/>
- <menu_item_call label="Start conferentie chat" name="Conference Chat Folder"/>
- <menu_item_call label="Afspelen" name="Sound Play"/>
- <menu_item_call label="Over Landmark" name="About Landmark"/>
- <menu_item_call label="In wereld afspelen" name="Animation Play"/>
- <menu_item_call label="Lokaal afspelen" name="Animation Audition"/>
- <menu_item_call label="Stuur instant message" name="Send Instant Message"/>
- <menu_item_call label="Bied teleport aan…" name="Offer Teleport..."/>
- <menu_item_call label="Start conferentie chat" name="Conference Chat"/>
- <menu_item_call label="Activeren" name="Activate"/>
- <menu_item_call label="Deactiveren" name="Deactivate"/>
- <menu_item_call label="Opslaan Als" name="Save As"/>
- <menu_item_call label="Losmaken van jezelf" name="Detach From Yourself"/>
- <menu_item_call label="Dragen" name="Object Wear"/>
- <menu label="Bevestigen aan" name="Attach To"/>
- <menu label="Bevestigen aan HUD" name="Attach To HUD"/>
- <menu_item_call label="Bewerken" name="Wearable Edit"/>
- <menu_item_call label="Dragen" name="Wearable Wear"/>
- <menu_item_call label="Uitdoen" name="Take Off"/>
- <menu_item_call label="--geen opties--" name="--no options--"/>
-</menu>
diff --git a/indra/newview/skins/default/xui/nl/menu_inventory_add.xml b/indra/newview/skins/default/xui/nl/menu_inventory_add.xml
deleted file mode 100644
index 09330b9597..0000000000
--- a/indra/newview/skins/default/xui/nl/menu_inventory_add.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_inventory_add">
- <menu label="Upload" name="upload">
- <menu_item_call label="Plaatje (L$[COST])..." name="Upload Image"/>
- <menu_item_call label="Geluid (L$[COST])..." name="Upload Sound"/>
- <menu_item_call label="Animatie (L$[COST])..." name="Upload Animation"/>
- <menu_item_call label="Bulk (L$[COST] per bestand)..." name="Bulk Upload"/>
- </menu>
- <menu_item_call label="Nieuwe Map" name="New Folder"/>
- <menu_item_call label="Nieuw Script" name="New Script"/>
- <menu_item_call label="Nieuw Notitie" name="New Note"/>
- <menu_item_call label="Nieuw Gebaar" name="New Gesture"/>
- <menu label="Nieuwe Kleding" name="New Clothes">
- <menu_item_call label="Nieuw Overhemd" name="New Shirt"/>
- <menu_item_call label="Nieuwe Broek" name="New Pants"/>
- <menu_item_call label="Nieuwe Schoenen" name="New Shoes"/>
- <menu_item_call label="Nieuwe Sokken" name="New Socks"/>
- <menu_item_call label="Nieuw Jas" name="New Jacket"/>
- <menu_item_call label="Nieuw Rok" name="New Skirt"/>
- <menu_item_call label="Nieuwe Handschoenen" name="New Gloves"/>
- <menu_item_call label="Nieuw Hemd" name="New Undershirt"/>
- <menu_item_call label="Nieuwe Onderbroek" name="New Underpants"/>
- <menu_item_call label="Nieuwe Alpha" name="New Alpha"/>
- <menu_item_call label="Nieuwe Tattoo" name="New Tattoo"/>
- </menu>
- <menu label="Nieuwe Lichaamsdelen" name="New Body Parts">
- <menu_item_call label="Nieuwe Vorm" name="New Shape"/>
- <menu_item_call label="Nieuwe Huid" name="New Skin"/>
- <menu_item_call label="Nieuw Haar" name="New Hair"/>
- <menu_item_call label="Nieuwe Ogen" name="New Eyes"/>
- </menu>
-</menu>
diff --git a/indra/newview/skins/default/xui/nl/menu_login.xml b/indra/newview/skins/default/xui/nl/menu_login.xml
deleted file mode 100644
index 987b82b128..0000000000
--- a/indra/newview/skins/default/xui/nl/menu_login.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu_bar name="Login Menu">
- <menu label="Bestand" name="File">
- <menu_item_call label="Afsluiten" name="Quit"/>
- </menu>
- <menu label="Bewerken" name="Edit">
- <menu_item_call label="Voorkeuren..." name="Preferences..."/>
- </menu>
- <menu label="Help" name="Help">
- <menu_item_call label="[SECOND_LIFE] Help" name="Second Life Help"/>
- <menu_item_call label="Over [APP_NAME]..." name="About Second Life..."/>
- </menu>
-</menu_bar>
diff --git a/indra/newview/skins/default/xui/nl/menu_mini_map.xml b/indra/newview/skins/default/xui/nl/menu_mini_map.xml
deleted file mode 100644
index f7c09660ea..0000000000
--- a/indra/newview/skins/default/xui/nl/menu_mini_map.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Popup">
- <menu_item_call label="Zoom dichtbij" name="Zoom Close"/>
- <menu_item_call label="Zoom gemiddeld" name="Zoom Medium"/>
- <menu_item_call label="Zoom veraf" name="Zoom Far"/>
- <menu_item_call label="Stop volgen" name="Stop Tracking"/>
- <menu_item_call label="Profiel..." name="Profile"/>
-</menu>
diff --git a/indra/newview/skins/default/xui/nl/menu_picks.xml b/indra/newview/skins/default/xui/nl/menu_picks.xml
deleted file mode 100644
index 2e53dbda58..0000000000
--- a/indra/newview/skins/default/xui/nl/menu_picks.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<context_menu name="Picks">
- <menu_item_call label="Info" name="pick_info"/>
- <menu_item_call label="Bewerken" name="pick_edit"/>
- <menu_item_call label="Teleport" name="pick_teleport"/>
- <menu_item_call label="Kaart" name="pick_map"/>
- <menu_item_call label="Verweideren" name="pick_delete"/>
-</context_menu>
diff --git a/indra/newview/skins/default/xui/nl/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/nl/menu_places_gear_landmark.xml
deleted file mode 100644
index dab5a388d7..0000000000
--- a/indra/newview/skins/default/xui/nl/menu_places_gear_landmark.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_ladmark_gear">
- <menu_item_call label="Teleport" name="teleport"/>
- <menu_item_call label="Meer Informatie" name="more_info"/>
- <menu_item_call label="Toon op Kaart" name="show_on_map"/>
- <menu_item_call label="Voeg Landmark Toe" name="add_landmark"/>
- <menu_item_call label="Voeg Map Toe" name="add_folder"/>
- <menu_item_call label="Knippen" name="cut"/>
- <menu_item_call label="Kopieër Landmark" name="copy_landmark"/>
- <menu_item_call label="Kopieër SLurl" name="copy_slurl"/>
- <menu_item_call label="Plakken" name="paste"/>
- <menu_item_call label="Hernoemen" name="rename"/>
- <menu_item_call label="Verweideren" name="delete"/>
- <menu_item_call label="Alle mappen uitvouwen" name="expand_all"/>
- <menu_item_call label="Alle mappen samenvouwen" name="collapse_all"/>
- <menu_item_check label="Sorteer bij Datum" name="sort_by_date"/>
- <menu_item_call label="Maak Favoriet" name="create_pick"/>
-</menu>
diff --git a/indra/newview/skins/default/xui/nl/menu_slurl.xml b/indra/newview/skins/default/xui/nl/menu_slurl.xml
deleted file mode 100644
index 48a4698d0c..0000000000
--- a/indra/newview/skins/default/xui/nl/menu_slurl.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Popup">
- <menu_item_call label="Over URL" name="about_url"/>
- <menu_item_call label="Teleport naar URL" name="teleport_to_url"/>
- <menu_item_call label="Toon op kaart" name="show_on_map"/>
-</menu>
diff --git a/indra/newview/skins/default/xui/nl/menu_viewer.xml b/indra/newview/skins/default/xui/nl/menu_viewer.xml
deleted file mode 100644
index 6d5c833610..0000000000
--- a/indra/newview/skins/default/xui/nl/menu_viewer.xml
+++ /dev/null
@@ -1,207 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu_bar name="Main Menu">
- <menu label="Bestand" name="File">
- <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
- <menu label="Upload" name="upload">
- <menu_item_call label="Afbeelding (L$[COST])..." name="Upload Image"/>
- <menu_item_call label="Geluid (L$[COST])..." name="Upload Sound"/>
- <menu_item_call label="Animatie (L$[COST])..." name="Upload Animation"/>
- <menu_item_call label="Bulk (L$[COST] per bestand)..." name="Bulk Upload"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="Standaard permissies instellen..." name="perm prefs"/>
- </menu>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="Sluit venster" name="Close Window"/>
- <menu_item_call label="Sluit alle vensters" name="Close All Windows"/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_call label="Textuur opslaan als..." name="Save Texture As..."/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_call label="Maak foto" name="Take Snapshot"/>
- <menu_item_call label="Foto naar harde schijf" name="Snapshot to Disk"/>
- <menu_item_separator label="-----------" name="separator4"/>
- <menu_item_call label="Afsluiten" name="Quit"/>
- </menu>
- <menu label="Bewerken" name="Edit">
- <menu_item_call label="Ongedaan maken" name="Undo"/>
- <menu_item_call label="Herhalen" name="Redo"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="Knippen" name="Cut"/>
- <menu_item_call label="Kopiëren" name="Copy"/>
- <menu_item_call label="Plakken" name="Paste"/>
- <menu_item_call label="Verwijderen" name="Delete"/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_call label="Zoeken..." name="Search..."/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_call label="Alles selecteren" name="Select All"/>
- <menu_item_call label="Deselecteren" name="Deselect"/>
- <menu_item_separator label="-----------" name="separator4"/>
- <menu_item_call label="Dupliceren" name="Duplicate"/>
- <menu_item_separator label="-----------" name="separator5"/>
- <menu label="Bevestig object" name="Attach Object"/>
- <menu label="Object losmaken" name="Detach Object"/>
- <menu label="Kleding uitdoen" name="Take Off Clothing">
- <menu_item_call label="Hemd" name="Shirt"/>
- <menu_item_call label="Broek" name="Pants"/>
- <menu_item_call label="Schoenen" name="Shoes"/>
- <menu_item_call label="Sokken" name="Socks"/>
- <menu_item_call label="Jas" name="Jacket"/>
- <menu_item_call label="Handschoenen" name="Gloves"/>
- <menu_item_call label="Onderhemd" name="Menu Undershirt"/>
- <menu_item_call label="Onderbroek" name="Menu Underpants"/>
- <menu_item_call label="Rok" name="Skirt"/>
- <menu_item_call label="Alle kleding" name="All Clothes"/>
- </menu>
- <menu_item_separator label="-----------" name="separator6"/>
- <menu_item_call label="Gebaren..." name="Gestures..."/>
- <menu_item_call label="Profiel..." name="Profile..."/>
- <menu_item_call label="Uiterlijk..." name="Appearance..."/>
- <menu_item_separator label="-----------" name="separator7"/>
- <menu_item_check label="Vrienden..." name="Friends..."/>
- <menu_item_call label="Groepen..." name="Groups..."/>
- <menu_item_separator label="-----------" name="separator8"/>
- <menu_item_call label="Voorkeuren..." name="Preferences..."/>
- </menu>
- <menu label="Weergave" name="View">
- <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
- <menu_item_call label="Mouselook" name="Mouselook"/>
- <menu_item_check label="Bouwen" name="Build"/>
- <menu_item_check label="Joystick vliegcamera" name="Joystick Flycam"/>
- <menu_item_call label="Weergave opnieuw instellen" name="Reset View"/>
- <menu_item_call label="Kijk naar laatste geklets" name="Look at Last Chatter"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_check label="Werkbalk" name="Toolbar"/>
- <menu_item_check label="Lokale chat" name="Chat History"/>
- <menu_item_check label="Communiceren" name="Instant Message"/>
- <menu_item_check label="Inventaris" name="Inventory"/>
- <menu_item_check label="Actieve sprekers" name="Active Speakers"/>
- <menu_item_check label="Negeerlijst" name="Mute List"/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_check label="Camerabediening" name="Camera Controls"/>
- <menu_item_check label="Bewegingsbediening" name="Movement Controls"/>
- <menu_item_check label="Wereldkaart" name="World Map"/>
- <menu_item_check label="Mini-kaart" name="Mini-Map"/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_check label="Statistiekenbalk" name="Statistics Bar"/>
- <menu_item_check label="Eigendomlijnen" name="Property Lines"/>
- <menu_item_check label="Banlijnen" name="Banlines"/>
- <menu_item_check label="Landeigenaren" name="Land Owners"/>
- <menu_item_separator label="-----------" name="separator4"/>
- <menu label="Tooltips" name="Hover Tips">
- <menu_item_check label="Toon tips" name="Show Tips"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_check label="Land tips" name="Land Tips"/>
- <menu_item_check label="Tips voor alle objecten" name="Tips On All Objects"/>
- </menu>
- <menu_item_check label="Markeer transparant" name="Highlight Transparent"/>
- <menu_item_check label="Bakens" name="beacons"/>
- <menu_item_check label="Verberg particles" name="Hide Particles"/>
- <menu_item_check label="Toon HUD bevestigingen" name="Show HUD Attachments"/>
- <menu_item_separator label="-----------" name="separator5"/>
- <menu_item_call label="Inzoomen" name="Zoom In"/>
- <menu_item_call label="Zoom standaard" name="Zoom Default"/>
- <menu_item_call label="Uitzoomen" name="Zoom Out"/>
- <menu_item_separator label="-----------" name="separator6"/>
- <menu_item_call label="Schakelen naar volledig scherm" name="Toggle Fullscreen"/>
- <menu_item_call label="UI grootte naar standaard instellen" name="Set UI Size to Default"/>
- </menu>
- <menu label="Wereld" name="World">
- <menu_item_call label="Chat" name="Chat"/>
- <menu_item_check label="Altijd rennen" name="Always Run"/>
- <menu_item_check label="Vliegen" name="Fly"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="Maak hier landmarkering" name="Create Landmark Here"/>
- <menu_item_call label="Thuis hier instellen" name="Set Home to Here"/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_call label="Teleport naar huis" name="Teleport Home"/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_call label="Afwezig instellen" name="Set Away"/>
- <menu_item_call label="Niet-storen instellen" name="Set Busy"/>
- <menu_item_call label="Stop het animeren van mijn avatar" name="Stop Animating My Avatar"/>
- <menu_item_call label="Toetsen vrijgeven" name="Release Keys"/>
- <menu_item_separator label="-----------" name="separator4"/>
- <menu_item_call label="Account geschiedenis..." name="Account History..."/>
- <menu_item_call label="Beheer mijn account" name="Manage My Account..."/>
- <menu_item_call label="Koop L$..." name="Buy and Sell L$..."/>
- <menu_item_separator label="-----------" name="separator5"/>
- <menu_item_call label="Mijn land..." name="My Land..."/>
- <menu_item_call label="Over land..." name="About Land..."/>
- <menu_item_call label="Koop land..." name="Buy Land..."/>
- <menu_item_call label="Regio/Estate..." name="Region/Estate..."/>
- <menu_item_separator label="-----------" name="separator6"/>
- <menu label="Omgeving instellingen" name="Environment Settings">
- <menu_item_call label="Zonsopgang" name="Sunrise"/>
- <menu_item_call label="Middag" name="Noon"/>
- <menu_item_call label="Zonsondergang" name="Sunset"/>
- <menu_item_call label="Middernacht" name="Midnight"/>
- <menu_item_call label="Herstel naar regiostandaard" name="Revert to Region Default"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="Omgeving editor" name="Environment Editor"/>
- </menu>
- </menu>
- <menu label="Gereedschappen" name="Tools">
- <menu label="Selecteergereedschap" name="Select Tool">
- <menu_item_call label="Focus" name="Focus"/>
- <menu_item_call label="Verplaatsen" name="Move"/>
- <menu_item_call label="Bewerken" name="Edit"/>
- <menu_item_call label="Maak" name="Create"/>
- <menu_item_call label="Land" name="Land"/>
- </menu>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_check label="Selecteer alleen mijn objecten" name="Select Only My Objects"/>
- <menu_item_check label="Selecteer alleen verplaatsbare objecten" name="Select Only Movable Objects"/>
- <menu_item_check label="Selecteer op omgeving" name="Select By Surrounding"/>
- <menu_item_check label="Toon verborgen selectie" name="Show Hidden Selection"/>
- <menu_item_check label="Toon lichtradius voor selectie" name="Show Light Radius for Selection"/>
- <menu_item_check label="Toon selectiestraal" name="Show Selection Beam"/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_check label="Snap aan grid" name="Snap to Grid"/>
- <menu_item_call label="Snap object XY aan grid" name="Snap Object XY to Grid"/>
- <menu_item_call label="Gebruik selectie voor grid" name="Use Selection for Grid"/>
- <menu_item_call label="Gridopties..." name="Grid Options..."/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_check label="Bewerk gekoppelde delen" name="Edit Linked Parts"/>
- <menu_item_call label="Koppel" name="Link"/>
- <menu_item_call label="Ontkoppel" name="Unlink"/>
- <menu_item_separator label="-----------" name="separator4"/>
- <menu_item_call label="Focus op selectie" name="Focus on Selection"/>
- <menu_item_call label="Zoom naar selectie" name="Zoom to Selection"/>
- <menu_item_call label="Koop object" name="Menu Object Take">
- <on_enable userdata="Koop,Neem" name="EnableBuyOrTake"/>
- </menu_item_call>
- <menu_item_call label="Neem kopie" name="Take Copy"/>
- <menu_item_call label="Object terug opslaan in objectinhoud" name="Save Object Back to Object Contents"/>
- <menu_item_separator label="-----------" name="separator6"/>
- <menu_item_call label="Toon script waarschuwing/fout venster" name="Show Script Warning/Error Window"/>
- <menu label="Hercompileer scripts in selectie" name="Recompile Scripts in Selection">
- <menu_item_call label="Mono" name="Mono"/>
- <menu_item_call label="LSL" name="LSL"/>
- </menu>
- <menu_item_call label="Scripts in selectie opnieuw instellen" name="Reset Scripts in Selection"/>
- <menu_item_call label="Scripts in selectie instellen op uitvoeren" name="Set Scripts to Running in Selection"/>
- <menu_item_call label="Scripts in selectie instellen op niet uitvoeren" name="Set Scripts to Not Running in Selection"/>
- </menu>
- <menu label="Help" name="Help">
- <menu_item_call label="[SECOND_LIFE] Help" name="Second Life Help"/>
- <menu_item_call label="Handleiding" name="Tutorial"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="Officiële Linden blog..." name="Official Linden Blog..."/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_call label="Scripting portaal..." name="Scripting Portal..."/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_call label="Rapporteer misbruik..." name="Report Abuse..."/>
- <menu_item_call label="Botsingen, duwen &amp; slaan" name="Bumps, Pushes &amp;amp; Hits..."/>
- <menu_item_call label="Lag Meter" name="Lag Meter"/>
- <menu_item_separator label="-----------" name="separator7"/>
- <menu label="Bug rapporteren" name="Bug Reporting">
- <menu_item_call label="Publieke problemenlijst..." name="Public Issue Tracker..."/>
- <menu_item_call label="Publieke problemenlijst help" name="Publc Issue Tracker Help..."/>
- <menu_item_separator label="-----------" name="separator7"/>
- <menu_item_call label="Bug rapporteren 101" name="Bug Reporing 101..."/>
- <menu_item_call label="Beveiligingsbevindingen..." name="Security Issues..."/>
- <menu_item_call label="Kwaliteitsbeheersing Wiki..." name="QA Wiki..."/>
- <menu_item_separator label="-----------" name="separator9"/>
- <menu_item_call label="Rapporteer bug..." name="Report Bug..."/>
- </menu>
- <menu_item_call label="Over [APP_NAME]..." name="About Second Life..."/>
- </menu>
-</menu_bar>
diff --git a/indra/newview/skins/default/xui/nl/mime_types.xml b/indra/newview/skins/default/xui/nl/mime_types.xml
deleted file mode 100644
index ba5de136a0..0000000000
--- a/indra/newview/skins/default/xui/nl/mime_types.xml
+++ /dev/null
@@ -1,230 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<mimetypes name="default">
- <widgetset name="web">
- <label name="web_label">
- Web Inhoud
- </label>
- <tooltip name="web_tooltip">
- Deze locatie bevat Web inhoud
- </tooltip>
- <playtip name="web_playtip">
- Toon Web inhoud
- </playtip>
- </widgetset>
- <widgetset name="movie">
- <label name="movie_label">
- Film
- </label>
- <tooltip name="movie_tooltip">
- Hier kan een film afgespeeld worden
- </tooltip>
- <playtip name="movie_playtip">
- Afspelen film
- </playtip>
- </widgetset>
- <widgetset name="none">
- <label name="none_label">
- Geen Inhoud
- </label>
- <tooltip name="none_tooltip">
- Geen media hier
- </tooltip>
- </widgetset>
- <widgetset name="image">
- <label name="image_label">
- Afbeelding
- </label>
- <tooltip name="image_tooltip">
- Er is een afbeelding op deze locatie
- </tooltip>
- <playtip name="image_playtip">
- Bekijk de afbeelding van deze locatie
- </playtip>
- </widgetset>
- <widgetset name="audio">
- <label name="audio_label">
- Audio
- </label>
- <tooltip name="audio_tooltip">
- Er is audio op deze locatie
- </tooltip>
- <playtip name="audio_playtip">
- Speel de audio van deze locatie af
- </playtip>
- </widgetset>
- <scheme name="rtsp">
- <label name="rtsp_label">
- Real Time Streaming
- </label>
- </scheme>
- <mimetype name="blank">
- <label name="blank_label">
- - Geen -
- </label>
- </mimetype>
- <mimetype name="none/none">
- <label name="none/none_label">
- - Geen -
- </label>
- </mimetype>
- <mimetype name="audio/*">
- <label name="audio2_label">
- Audio
- </label>
- </mimetype>
- <mimetype name="video/*">
- <label name="video2_label">
- Video
- </label>
- </mimetype>
- <mimetype name="image/*">
- <label name="image2_label">
- Afbeelding
- </label>
- </mimetype>
- <mimetype name="video/vnd.secondlife.qt.legacy">
- <label name="vnd.secondlife.qt.legacy_label">
- Film (QuickTime)
- </label>
- </mimetype>
- <mimetype name="application/javascript">
- <label name="application/javascript_label">
- Javascript
- </label>
- </mimetype>
- <mimetype name="application/ogg">
- <label name="application/ogg_label">
- Ogg Audio/Video
- </label>
- </mimetype>
- <mimetype name="application/pdf">
- <label name="application/pdf_label">
- PDF Document
- </label>
- </mimetype>
- <mimetype name="application/postscript">
- <label name="application/postscript_label">
- Postscript Document
- </label>
- </mimetype>
- <mimetype name="application/rtf">
- <label name="application/rtf_label">
- Rich Text (RTF)
- </label>
- </mimetype>
- <mimetype name="application/smil">
- <label name="application/smil_label">
- Synchronized Multimedia Integration Language (SMIL)
- </label>
- </mimetype>
- <mimetype name="application/xhtml+xml">
- <label name="application/xhtml+xml_label">
- Web Pagina (XHTML)
- </label>
- </mimetype>
- <mimetype name="application/x-director">
- <label name="application/x-director_label">
- Macromedia Director
- </label>
- </mimetype>
- <mimetype name="application/x-shockwave-flash">
- <label name="application/x-shockwave-flash_label">
- Flash
- </label>
- </mimetype>
- <mimetype name="audio/mid">
- <label name="audio/mid_label">
- Audio (MIDI)
- </label>
- </mimetype>
- <mimetype name="audio/mpeg">
- <label name="audio/mpeg_label">
- Audio (MP3)
- </label>
- </mimetype>
- <mimetype name="audio/x-aiff">
- <label name="audio/x-aiff_label">
- Audio (AIFF)
- </label>
- </mimetype>
- <mimetype name="audio/x-wav">
- <label name="audio/x-wav_label">
- Audio (WAV)
- </label>
- </mimetype>
- <mimetype name="image/bmp">
- <label name="image/bmp_label">
- Afbeelding (BMP)
- </label>
- </mimetype>
- <mimetype name="image/gif">
- <label name="image/gif_label">
- Afbeelding (GIF)
- </label>
- </mimetype>
- <mimetype name="image/jpeg">
- <label name="image/jpeg_label">
- Afbeelding (JPEG)
- </label>
- </mimetype>
- <mimetype name="image/png">
- <label name="image/png_label">
- Afbeelding (PNG)
- </label>
- </mimetype>
- <mimetype name="image/svg+xml">
- <label name="image/svg+xml_label">
- Afbeelding (SVG)
- </label>
- </mimetype>
- <mimetype name="image/tiff">
- <label name="image/tiff_label">
- Afbeelding (TIFF)
- </label>
- </mimetype>
- <mimetype name="text/html">
- <label name="text/html_label">
- Web Pagina
- </label>
- </mimetype>
- <mimetype name="text/plain">
- <label name="text/plain_label">
- Tekst
- </label>
- </mimetype>
- <mimetype name="text/xml">
- <label name="text/xml_label">
- XML
- </label>
- </mimetype>
- <mimetype name="video/mpeg">
- <label name="video/mpeg_label">
- Film (MPEG)
- </label>
- </mimetype>
- <mimetype name="video/mp4">
- <label name="video/mp4_label">
- Film (MP4)
- </label>
- </mimetype>
- <mimetype name="video/quicktime">
- <label name="video/quicktime_label">
- Film (QuickTime)
- </label>
- </mimetype>
- <mimetype name="video/x-ms-asf">
- <label name="video/x-ms-asf_label">
- Film (Windows Media ASF)
- </label>
- </mimetype>
- <mimetype name="video/x-ms-wmv">
- <label name="video/x-ms-wmv_label">
- Film (Windows Media WMV)
- </label>
- </mimetype>
- <mimetype name="video/x-msvideo">
- <label name="video/x-msvideo_label">
- Film (AVI)
- </label>
- </mimetype>
-</mimetypes>
diff --git a/indra/newview/skins/default/xui/nl/notifications.xml b/indra/newview/skins/default/xui/nl/notifications.xml
deleted file mode 100644
index be0c17d2ff..0000000000
--- a/indra/newview/skins/default/xui/nl/notifications.xml
+++ /dev/null
@@ -1,3047 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<notifications>
- <global name="skipnexttime">
- Toon mij dit niet meer.
- </global>
- <global name="alwayschoose">
- Kies altijd deze optie
- </global>
- <global name="implicitclosebutton">
- Sluiten
- </global>
- <template name="okbutton">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- </form>
- </template>
-
- <template name="okignore">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- <ignore text="$ignoretext"/>
- </form>
- </template>
-
- <template name="okcancelbuttons">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- <button
- name="Cancel"
- text="$notext"/>
- </form>
- </template>
-
- <template name="okcancelignore">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- <button
- name="Cancel"
- text="$notext"/>
- <ignore text="$ignoretext"/>
- </form>
- </template>
-
- <template name="okhelpbuttons">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- <button
- name="Help"
- text="$helptext"/>
- </form>
- </template>
-
- <template name="yesnocancelbuttons">
- <form>
- <button
- name="Yes"
- text="$yestext"/>
- <button
- name="No"
- text="$notext"/>
- <button
- name="Cancel"
- text="$canceltext"/>
- </form>
- </template>
- <notification functor="GenericAcknowledge" label="Onbekende waarschuwingsboodschap" name="MissingAlert">
- Uw versie van [APP_NAME] weet niet hoe het de waarschuwingsboodschap die zojuist ontvangen is moet weergeven.
-
-Foutdetails: De waarschuwing genaamd &apos;[_NAME]&apos; is niet gevonden in notifications.xml.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="FloaterNotFound">
- Reële waarde fout: Kon de volgende controllers niet vinden:
-
-[CONTROLS]
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="TutorialNotFound">
- Er is momenteel geen handleiding beschikbaar.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="GenericAlert">
- [MESSAGE]
- </notification>
- <notification name="GenericAlertYesCancel">
- [MESSAGE]
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="Ja"/>
- </notification>
- <notification name="BadInstallation">
- Er is een fout opgetreden tijdens het bijwerken van [APP_NAME]. Download alstublieft de meest recente versie van secondlife.com
- <usetemplate
- name="okbutton"
- yestext="OK"/>
- </notification>
- <notification name="LoginFailedNoNetwork">
- Netwerkfout: Kan geen verbinding opzetten.
-&apos;[DIAGNOSTIC]&apos;
-Controleer alstublieft uw netwerkverbinding.
- <usetemplate
- name="okbutton"
- yestext="OK"/>
- </notification>
- <notification name="MessageTemplateNotFound">
- Berichtsjabloon [PATH] niet gevonden.
- <usetemplate
- name="okbutton"
- yestext="OK"/>
- </notification>
- <notification name="WearableSave">
- Wijzigingen aan huidig kledingstuk/lichaamsdeel opslaan?
- <usetemplate canceltext="Annuleren" name="yesnocancelbuttons" notext="Niet Opslaan" yestext="Opslaan"/>
- </notification>
- <notification name="CompileQueueSaveText">
- Er was een probleem met het uploaden van de tekst van een script vanwege de volgende reden: [REASON]. Probeer het alstublieft later nog eens.
- </notification>
- <notification name="CompileQueueSaveBytecode">
- Er was een probleem met het uploaden van het gecompileerde script vanwege de volgende reden: [REASON]. Probeer het alstublieft later nog eens.
- </notification>
- <notification name="WriteAnimationFail">
- Er was een probleem met het wegschrijven van animatie gegevens. Probeer het alstublieft later nog eens.
- </notification>
- <notification name="UploadAuctionSnapshotFail">
- Er was een probleem met het uploaden van de veiling foto vanwege de volgende reden: [REASON]
- </notification>
- <notification name="UnableToViewContentsMoreThanOne">
- Het is niet mogelijk om de inhoud van meer dan één item tegelijk te zien.
-Kies alstublieft slechts één item en probeer het opnieuw.
- </notification>
- <notification name="SaveClothingBodyChanges">
- Wijzigingen aan kledingstuk/lichaamsdeel opslaan?
- <usetemplate canceltext="Annuleren" name="yesnocancelbuttons" notext="Niet Opslaan" yestext="Alles Opslaan"/>
- </notification>
- <notification name="GrantModifyRights">
- Het geven van wijzigingsrechten aan een andere inwoner, maakt het voor hun mogelijk om elk willekeurig object te wijzigen, te verwijderen of om WILLEKEURIGE objecten die u in wereld heeft terug te nemen. Wees HEEL voorzichtig met het uitgeven van dit recht.
-Wilt u wijzigingsrechten aan [FIRST_NAME] [LAST_NAME] geven?
- <usetemplate name="okcancelbuttons" notext="Nee" yestext="Ja"/>
- </notification>
- <notification name="GrantModifyRightsMultiple">
- Het geven van wijzigingsrechten aan een andere inwoner, maakt het voor hun mogelijk elk WILLEKEURIG object te wijzigen die u in wereld heeft. Wees HEEL voorzichtig met het uitgeven van dit recht.
-Wilt u wijzigingsrechten aan de geselecteerde inwoners geven?
- <usetemplate name="okcancelbuttons" notext="Nee" yestext="Ja"/>
- </notification>
- <notification name="RevokeModifyRights">
- Wilt u de wijzigingsrechten voor [FIRST_NAME] [LAST_NAME] terugnemen?
- <usetemplate name="okcancelbuttons" notext="Nee" yestext="Ja"/>
- </notification>
- <notification name="RevokeModifyRightsMultiple">
- Wilt u de wijzigingsrechten voor de geselecteerde inwoners terugnemen?
- <usetemplate name="okcancelbuttons" notext="Nee" yestext="Ja"/>
- </notification>
- <notification name="UnableToCreateGroup">
- Kan geen groep aanmaken.
-[MESSAGE]
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="PanelGroupApply">
- [NEEDS_APPLY_MESSAGE]
-[WANT_APPLY_MESSAGE]
- <usetemplate canceltext="Annuleren" name="yesnocancelbuttons" notext="Wijzigingen Negeren" yestext="Wijzigingen Toepassen"/>
- </notification>
- <notification name="MustSpecifyGroupNoticeSubject">
- U moet een onderwerp opgeven om dit bericht te kunnen versturen.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="AddGroupOwnerWarning">
- U staat op het punt groepsleden de rol [ROLE_NAME] te geven.
-Leden kunnen niet van die groep worden verwijderd.
-De leden moeten zichzelf ontheffen uit deze rol.
-Weet u zeker dat u door wilt gaan?
- <usetemplate ignoretext="Wanneer u groepsleden toevoegt aan de eigenaren rol" name="okcancelignore" notext="Nee" yestext="Ja"/>
- </notification>
- <notification name="AssignDangerousActionWarning">
- U staat op het punt de Bekwaamheid &apos;[ACTION_NAME]&apos; aan de Rol &apos;[ROLE_NAME]&apos; toe te voegen.
-
- *WAARSCHUWING*
- Elk lid in de Rol met deze Bekwaamheid kan zichzelf - en elk ander lid - Rollen geven die meer mogelijkheden hebben dan waar zij nu over beschikken, zichzelf daarmee verheffend tot bijna eigenaar mogelijkheden. Weet zeker waar u mee bezig bent alvorens deze Bekwaamheid toe te kennen.
-
-Deze Bekwaamheid toevoegen aan &apos;[ROLE_NAME]&apos;?
- <usetemplate name="okcancelbuttons" notext="Nee" yestext="Ja"/>
- </notification>
- <notification name="AssignDangerousAbilityWarning">
- U staat op het punt de Bekwaamheid &apos;[ACTION_NAME]&apos; aan de Rol &apos;[ROLE_NAME]&apos; toe te voegen.
-
- *WAARSCHUWING*
- Elk lid in de Rol met deze Bekwaamheid kan zichzelf - en elk ander lid - alle Bekwaamheden geven, zich daarmee verheffend tot bijna Eigenaar mogelijkheden.
-
-Deze Bekwaamheid toevoegen aan &apos;[ROLE_NAME]&apos;?
- <usetemplate name="okcancelbuttons" notext="Nee" yestext="Ja"/>
- </notification>
- <notification name="ClickPublishHelpLand">
- Het selecteren van de &quot;Publiceer in Zoeken&quot; optie
-Het aan vinken van deze optie zal:
-- dit perceel weergeven in de zoek resultaten
-- de publieke objecten van dit perceel weergeven
-- dit perceel in web zoeken weergeven
- </notification>
- <notification name="ClickSoundHelpLand">
- Media en muziek kunnen alleen binnen het perceel ervaren worden. Geluid- en voice-opties kunnen worden beperkt tot het perceel of zullen worden gehoord door inwoners buiten het perceel, gebaseerd op hun inhoudscategorie. Ga naar de kennisbank om meer te leren over hoe deze opties ingesteld kunnen worden.
- <url name="url">
- https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=5046
- </url>
- <usetemplate
- name="okcancelbuttons"
- yestext="Ga naar kennisbank"
- notext="Sluiten" />
- </notification>
- <notification name="ClickSearchHelpAll">
- Zoekresultaten zijn georganiseerd op basis van het tabblad waar u zich in bevindt, uw inhoudscategorie, de gekozen categorie en andere factoren. Kijk alstublieft in de kennisbank voor meer details.
- <url name="url">
- https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=4722
- </url>
- <usetemplate
- name="okcancelbuttons"
- yestext="Ga naar kennisbank"
- notext="Sluiten" />
- </notification>
- <notification name="ClickPublishHelpLandDisabled">
- U kunt dit perceel niet zichtbaar maken in zoeken omdat het zich in een regio bevindt dat dit niet toelaat
- </notification>
- <notification name="ClickPublishHelpAvatar">
- Het selecteren van &quot;Weergeven in Zoeken&quot; zal weergeven:
-- mijn profiel in de zoek resultaten
-- een link naar mijn profiel in de publieke groep pagina&apos;s
- </notification>
- <notification name="ClickPartnerHelpAvatar">
- U kunt een andere Inwoner ten huwelijk vragen of een bestaand partner schap verbreken via de [SECOND_LIFE] website.
-
-Naar de [SECOND_LIFE] website gaan voor meer informatie over partner schap?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="Ga naar Pagina"/>
- </notification>
- <notification name="ClickUploadHelpPermissions">
- Uw standaard permissies werken mogelijk niet in oudere regio&apos;s.
- </notification>
- <notification name="ClickWebProfileHelpAvatar">
- Als een Inwoner een web profiel URL heeft ingesteld:
-* Klik op &apos;Laden&apos; om de pagina in deze web tab te zien.
-* Klik op Laden &gt; &apos;In externe browser&apos; om de pagina in uw standaard browser te zien
-* Klik op Laden &gt; &apos;Thuis pagina URL&apos; om terug te keren naar het web profiel van deze Inwoner indien U verder genavigeerd bent.
-
-Indien u uw eigen profiel bekijkt, kunt U elke willekeurige URL opgeven als uw web profiel en op OK klikken om het in te stellen.
-Andere Inwoners kunnen de door U opgegeven URL bezoeken indien zij uw profiel bekijken.
- </notification>
- <notification name="JoinGroupCanAfford">
- Deelname aan deze groep kost L$[COST].
-Wilt u doorgaan?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="Deelnemen"/>
- </notification>
- <notification name="JoinGroupCannotAfford">
- Deelname aan deze groep kost L$[COST].
-U heeft niet genoeg L$ om deel te kunnen nemen aan deze groep.
- </notification>
- <notification name="LandBuyPass">
- Voor L$[COST] krijgt u toegang tot het land (&apos;[PARCEL_NAME]&apos;) voor de duur van [TIME] uur.
-
-Een pas kopen?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="SalePriceRestriction">
- De verkoopprijs moet ingesteld staan op meer dan L$0 indien u aan iemand verkoopt.
-Kies een individu indien u het voor L$0 verkoopt.
- </notification>
- <notification name="ConfirmLandSaleChange">
- De geselecteerde [LAND_SIZE] m² land is te koop gezet.
-Uw verkoopprijs is L$[SALE_PRICE] en zal geautoriseerd worden voor verkoop door [NAME].
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="ConfirmLandSaleToAnyoneChange">
- ATTENTIE: Het aanklikken van &apos;verkoop aan iedereen&apos; zal uw land beschikbaar maken aan de gehele [SECOND_LIFE] gemeenschap, zo ook diegenen niet in deze regio!
-
-De geselecteerde [LAND_SIZE] m² land is te koop gezet.
-Uw verkoopprijs is L$[SALE_PRICE] en zal geautoriseerd worden voor verkoop door [NAME].
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="ReturnObjectsDeededToGroup">
- Weet u zeker dat u alle met de groep &apos;[NAME]&apos; gedeelde objecten van dit perceel wilt retourneren naar de inventaris van hun vorige eigenaren?
-
-*WAARSCHUWING* Dit zal alle niet-overdraagbare aan de groep toegekende objecten verwijderen!
-
-Objecten: [N]
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="ReturnObjectsOwnedByUser">
- Weet u zeker dat u alle objecten van Inwoner &apos;[NAME]&apos; op dit perceel wilt retourneren naar hun inventaris?
-
-Objecten: [N]
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="ReturnObjectsOwnedBySelf">
- Weet u zeker dat u al uw eigen objecten op dit perceel wilt retourneren naar uw inventaris?
-
-Objecten: [N]
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="ReturnObjectsNotOwnedBySelf">
- Weet u zeker dat u alle objecten op dit perceel die geen eigendom van u zijn wilt retourneren naar de inventaris van hun eigenaren?
-Overdraagbare objecten toegekend aan de groep zullen worden geretourneerd naar de oorspronkelijke eigenaren.
-
-*WAARSCHUWING* Dit zal alle niet-overdraagbare aan de groep toegekende objecten verwijderen!
-
-Objecten: [N]
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="ReturnObjectsNotOwnedByUser">
- Weet u zeker dat u alle objecten op dit perceel die GEEN eigendom zijn van [NAME] wilt retourneren naar de inventaris van hun eigenaar? Overdraagbare objecten toegekend aan de groep zullen worden geretourneerd naar de oorspronkelijke eigenaren.
-
-*WAARSCHUWING* Dit zal alle niet-overdraagbare aan de groep toegekende objecten verwijderen!
-
-Objecten: [N]
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="ReturnAllTopObjects">
- Weet u zeker dat u alle weergegeven objecten wilt retourneren naar de inventaris van hun eigenaar?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="DisableAllTopObjects">
- Weet u zeker dat u alle objecten in deze regio uit wilt schakelen?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="ReturnObjectsNotOwnedByGroup">
- Alle objecten op dit perceel die NIET gedeeld worden met de groep [NAME] retourneren naar hun eigenaren?
-
-Objecten: [N]
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="UnableToDisableOutsideScripts">
- Kan scripts niet uitschakelen.
-Voor de hele regio is letsel ingeschakeld.
-Scripts moeten toegestaan worden om wapens te kunnen laten werken.
- </notification>
- <notification name="MustBeInParcel">
- U moet binnen een perceel staan om het Landings Punt in te stellen.
- </notification>
- <notification name="PromptRecipientEmail">
- Geef alstublieft een geldig email adres op van de ontvanger(s).
- </notification>
- <notification name="PromptSelfEmail">
- Voer uw email adres in.
- </notification>
- <notification name="PromptMissingSubjMsg">
- Foto e-mailen met het standaard onderwerp of bericht?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="ErrorProcessingSnapshot">
- Fout opgetreden met het verwerken van de foto gegevens
- </notification>
- <notification name="ErrorEncodingSnapshot">
- Fout opgetreden met het coderen van de foto.
- </notification>
- <notification name="ErrorUploadingPostcard">
- Er is een probleem met het verzenden van de foto vanwege de volgende reden: [REASON]
- </notification>
- <notification name="ErrorUploadingReportScreenshot">
- Er is een probleem met het uploaden van de rapport foto vanwege de volgende reden: [REASON]
- </notification>
- <notification name="MustAgreeToLogIn">
- U moet akkoord gaan met de Voorwaarden van Dienstverlening (Terms of Service) om in te kunnen loggen in [SECOND_LIFE].
- </notification>
- <notification name="CouldNotPutOnOutfit">
- Kon de outfit niet aan doen.
-De outfit folder bevat geen kleding, lichaamsdelen of externe bevestigingen.
- </notification>
- <notification name="CannotWearTrash">
- U kunt geen kleding of lichaamsdelen aan trekken die zich in de vuilnisbak bevinden.
- </notification>
- <notification name="CannotWearInfoNotComplete">
- U kunt dat item niet aantrekken omdat het nog niet geladen is. Probeer het over een minuut opnieuw.
- </notification>
- <notification name="MustHaveAccountToLogIn">
- Oeps! Iets is nog leeg.
-U moet zowel de voornaam als de achternaam van uw avatar opgeven.
-
-U heeft een account nodig om [SECOND_LIFE] binnen te gaan. Wilt u er nu een maken?
- <url name="url">
- https://join.secondlife.com/index.php?lang=nl-NL
- </url>
- <usetemplate name="okcancelbuttons" notext="Probeer het opnieuw" yestext="Maak een nieuw account"/>
- </notification>
- <notification name="AddClassified">
- Geclassificeerde advertenties verschijnen een week lang in de &apos;Advertentie&apos; sectie van de Zoek gids en op www.secondlife.com.
-Vul uw advertentie in en klik op &apos;Publiceer...&apos; om het toe te voegen aan de gids.
-Er zal u om een prijs worden gevraagd als u deze gaat publiceren.
-Indien u meer betaald zal uw advertentie hoger in de lijst verschijnen en ook hoger als men op sleutelwoorden zoekt.
- <usetemplate ignoretext="Indien u een advertentie toevoegt" name="okcancelignore" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="DeleteClassified">
- Advertentie &apos;[NAME]&apos; verwijderen?
-Betaalde advertentiekosten zullen niet worden terug gestort.
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="ClassifiedSave">
- Wijzigingen in advertentie [NAME] opslaan?
- <usetemplate canceltext="Annuleren" name="yesnocancelbuttons" notext="Niet Opslaan" yestext="Opslaan"/>
- </notification>
- <notification name="DeleteAvatarPick">
- Favoriet [PICK] verwijderen?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="PromptGoToEventsPage">
- Naar de [SECOND_LIFE] evenementen web pagina gaan?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="SelectProposalToView">
- Kies alstublieft een voorstel om in te zien.
- </notification>
- <notification name="SelectHistoryItemToView">
- Kies alstublieft een geschiedenis item om in te zien.
- </notification>
- <notification name="ResetShowNextTimeDialogs">
- Wilt u alle Pop-Up&apos;s opnieuw inschakelen die u eerder aanmerkte als &apos;Laat mij niet opnieuw zien&apos;?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="SkipShowNextTimeDialogs">
- Wilt u alle Pop-Up&apos;s uitschakelen die overgeslagen kunnen worden?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="CacheWillClear">
- De cache zal geleegd worden als u [APP_NAME] opnieuw start.
- </notification>
- <notification name="CacheWillBeMoved">
- De cache zal verplaatst worden als u [APP_NAME] opnieuw start.
-Opmerking: Dit zal de Cache legen.
- </notification>
- <notification name="ChangeConnectionPort">
- Poort instelling zullen effect hebben nadat u [APP_NAME] opnieuw start.
- </notification>
- <notification name="ChangeSkin">
- De nieuwe skin zal verschijnen nadat u [APP_NAME] opnieuw start.
- </notification>
- <notification name="GoToAuctionPage">
- Ga naar de [SECOND_LIFE] web pagina om de veiling details te zien of een bod uit te brengen.
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="SaveChanges">
- Wijzigingen Opslaan?
- <usetemplate canceltext="Annuleren" name="yesnocancelbuttons" notext="Niet Opslaan" yestext="Opslaan"/>
- </notification>
- <notification name="GestureSaveFailedTooManySteps">
- Gebaar opslaan is niet gelukt.
-Dit gebaar heeft te veel stappen.
-Probeer enkele stappen te verwijderen en opnieuw op te slaan.
- </notification>
- <notification name="GestureSaveFailedTryAgain">
- Gebaar opslaan is niet gelukt. Probeer het over enkele ogenblikken opnieuw.
- </notification>
- <notification name="GestureSaveFailedObjectNotFound">
- Kon het gebaar niet opslaan omdat het object of bijbehorende object niet in de inventaris kon worden gevonden.
-
-Het object kan buiten bereik of mogelijk verwijderd zijn.
- </notification>
- <notification name="GestureSaveFailedReason">
- Er was een probleem met het opslaan van het gebaar vanwege de volgende reden: [REASON]. Probeert u het gebaar later nogmaals op te slaan.
- </notification>
- <notification name="SaveNotecardFailObjectNotFound">
- Kon de notitiekaart niet opslaan omdat het object of bijbehorende object niet in de inventaris kon worden gevonden.
-
-Het object kan buiten bereik of mogelijk verwijderd zijn.
- </notification>
- <notification name="SaveNotecardFailReason">
- Er was een probleem met het opslaan van de notitiekaart vanwege de volgende reden: [REASON]. Probeert u de notitiekaart later nogmaals op te slaan.
- </notification>
- <notification name="ScriptCannotUndo">
- Kon niet alle wijzigingen ongedaan maken in uw versie van het script.
-Wilt u de laatst op de server opgeslagen versie laden?
-(**Waarschuwing** Deze operatie kan niet ongedaan gemaakt worden.)
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="SaveScriptFailReason">
- Er was een probleem met het opslaan van een script vanwege de volgende reden: [REASON]. Probeert u het script later nogmaals op te slaan.
- </notification>
- <notification name="SaveScriptFailObjectNotFound">
- Kon het script niet opslaan omdat het object waar het in zit niet gevonden kon worden.
-Het object kan buiten bereik of mogelijk verwijderd zijn.
- </notification>
- <notification name="SaveBytecodeFailReason">
- Er was een probleem met het opslaan van een gecompileerd script vanwege de volgende reden: [REASON]. Probeert u het script later nogmaals op te slaan.
- </notification>
- <notification name="CouldNotStartStopScript">
- Kon het script niet starten of stoppen omdat het object wat het in zit niet gevonden kon worden.
-Het object kan buiten bereik of mogelijk verwijderd zijn.
- </notification>
- <notification name="CannotDownloadFile">
- Kon het bestand niet downloaden
- </notification>
- <notification name="CannotWriteFile">
- Kan niet naar bestand [[FILE]] schrijven
- </notification>
- <notification name="UnsupportedHardware">
- Waarschuwing: Uw systeem voldoet niet aan de [APP_NAME] minimum systeem eisen. Indien u [APP_NAME] gebruikt, ervaart u mogelijk slechte prestaties. Helaas kunnen we geen technische ondersteuning geven voor niet ondersteunde configuraties.
-
-MINSPECS
-Wilt u [_URL] bezoeken voor meer informatie?
- <url name="url" option="0">
- http://secondlife.com/support/sysreqs.php?lang=nl
- </url>
- <usetemplate ignoretext="Indien niet ondersteunde hardware gedetecteerd" name="okcancelignore" notext="Nee" yestext="Ja"/>
- </notification>
- <notification name="UnknownGPU">
- Uw systeem heeft een grafische kaart die bij ons nog niet bekend is op dit moment.
-
-Dit is vaak het geval met nieuwe hardware waarbij wij nog niet de kans gehad hebben om het te testen. [APP_NAME] zal mogelijk naar behoren functioneren, doch het kan zijn dat u uw grafische instellingen naar geschiktere waarden zult moeten instellen.
-(Bewerken menu &gt; Voorkeuren &gt; Grafisch).
- <form name="form">
- <ignore name="ignore" text="Indien een onbekende grafische kaart gedetecteerd"/>
- </form>
- </notification>
- <notification name="DisplaySettingsNoShaders">
- [APP_NAME] is gestopt bij het initialiseren van de grafische stuurprogramma&apos;s.
-Grafische kwaliteit zal op zijn laagst worden ingesteld om veel voorkomende fouten met stuurprogramma&apos;s te vermijden.
-Dit zal sommige grafische opties uitschakelen.
-Wij adviseren u de stuurprogramma&apos;s van uw grafische kaart bij te werken.
-Grafische kwaliteit kan verhoogd worden in Voorkeuren &gt; Grafisch.
- </notification>
- <notification name="RegionNoTerraforming">
- De regio [REGION] staat geen land aanpassingen toe.
- </notification>
- <notification name="CannotCopyWarning">
- U heeft geen permissie dit item te kopiëren en zult het kwijtraken als u het weg geeft. Wilt u dit item echt aanbieden?
- <usetemplate name="okcancelbuttons" notext="Nee" yestext="Ja"/>
- </notification>
- <notification name="CannotGiveItem">
- Kan inventaris item niet geven.
- </notification>
- <notification name="TransactionCancelled">
- Transactie afgebroken.
- </notification>
- <notification name="TooManyItems">
- Kan niet meer dan 42 items in één enkele inventaris overdracht geven.
- </notification>
- <notification name="NoItems">
- U heeft geen permissie de geselecteerde items over te dragen.
- </notification>
- <notification name="CannotCopyCountItems">
- U heeft geen permissie om [COUNT] geselecteerde items te kopiëren. U zult deze items uit uw inventaris kwijtraken.
-Weet u zeker dat u deze items wilt geven?
- <usetemplate name="okcancelbuttons" notext="Nee" yestext="Ja"/>
- </notification>
- <notification name="CannotGiveCategory">
- U heeft geen permissie de geselecteerde map over te dragen.
- </notification>
- <notification name="FreezeAvatar">
- Avatar bevriezen?
-Hij of zij zal zich tijdelijk niet kunnen bewegen, praten of interactie kunnen hebben met de wereld.
- <usetemplate canceltext="Annuleren" name="yesnocancelbuttons" notext="Ontdooien" yestext="Bevriezen"/>
- </notification>
- <notification name="FreezeAvatarFullname">
- Bevries [AVATAR_NAME]?
-Hij of zij zal zich tijdelijk niet kunnen bewegen, praten of interactie kunnen hebben met de wereld.
- <usetemplate canceltext="Annuleren" name="yesnocancelbuttons" notext="Ontdooien" yestext="Bevriezen"/>
- </notification>
- <notification name="EjectAvatarFullname">
- [AVATAR_NAME] van uw land verwijderen?
- <usetemplate canceltext="Annuleren" name="yesnocancelbuttons" notext="Verwijderen en Bannen" yestext="Verwijderen"/>
- </notification>
- <notification name="EjectAvatarNoBan">
- Deze avatar van u land verwijderen?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="Verwijder"/>
- </notification>
- <notification name="EjectAvatarFullnameNoBan">
- [AVATAR_NAME] van uw land verwijderen?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="Verwijder"/>
- </notification>
- <notification name="AcquireErrorTooManyObjects">
- VERWERVINGS FOUT: Te veel objecten geselecteerd
- </notification>
- <notification name="AcquireErrorObjectSpan">
- VERWERVINGS FOUT: Objecten beslaan meer dan één regio.
-Verplaats alstublieft alle objecten die u wilt verwerven naar dezelfde regio.
- </notification>
- <notification name="PromptGoToCurrencyPage">
- [EXTRA]
-
-Naar [_URL] gaan voor informatie over de aankoop L$?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="UnableToLinkObjects">
- Kon deze [COUNT] objecten niet linken.
-U kunt maximaal [MAX] objecten linken.
- </notification>
- <notification name="CannotLinkIncompleteSet">
- U kunt alleen complete sets van objecten linken en moet meer dan één object selecteren.
- </notification>
- <notification name="CannotLinkModify">
- Kon niet linken omdat u geen wijziging permissies heeft op alle objecten.
-
-Wees er van overtuigd dat er geen enkele geblokkeerd is en dat ze allen uw eigendom zijn.
- </notification>
- <notification name="CannotLinkDifferentOwners">
- Kon niet linken omdat niet alle objecten dezelfde eigenaar hebben.
-
-Wees er van overtuigd dat alle objecten uw eigendom zijn.
- </notification>
- <notification name="NoFileExtension">
- Geen bestandsextensie voor het bestand: &apos;[FILE]&apos;
-
-Zorg dat het bestand de juiste bestandsextensie heeft.
- </notification>
- <notification name="InvalidFileExtension">
- Ongeldige bestandsextensie [EXTENSION]
-Verwacht [VALIDS]
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="CannotUploadSoundFile">
- Kon het geüploade geluidsbestand niet openen om te lezen:
-[FILE]
- </notification>
- <notification name="SoundFileNotRIFF">
- Het bestand lijkt geen RIFF WAVE bestand te zijn:
-[FILE]
- </notification>
- <notification name="SoundFileNotPCM">
- Het bestand lijkt geen PCM WAVE audio bestand te zijn:
-[FILE]
- </notification>
- <notification name="SoundFileInvalidChannelCount">
- Het bestand heeft een ongeldig aantal kanalen (moet mono of stereo zijn):
-[FILE]
- </notification>
- <notification name="SoundFileInvalidSampleRate">
- Het bestand lijkt geen ondersteund sample rate te hebben (moet 44.1k zijn):
-[FILE]
- </notification>
- <notification name="SoundFileInvalidWordSize">
- Het bestand lijkt geen ondersteund word size te hebben (moet 8 of 16 bit zijn):
-[FILE]
- </notification>
- <notification name="SoundFileInvalidHeader">
- Kon geen &apos;data&apos; chunk in WAV header vinden:
-[FILE]
- </notification>
- <notification name="SoundFileInvalidTooLong">
- Audio bestand is te lang (10 seconden maximum):
-[FILE]
- </notification>
- <notification name="ProblemWithFile">
- Probleem met bestand [FILE]:
-
-[ERROR]
- </notification>
- <notification name="CannotOpenTemporarySoundFile">
- Kon geen tijdelijk gecomprimeerd geluidsbestand openen om naar toe te schrijven: [FILE]
- </notification>
- <notification name="UnknownVorbisEncodeFailure">
- Onbekende Vorbis codeer fout in: [FILE]
- </notification>
- <notification name="CannotEncodeFile">
- Kan bestand niet coderen: [FILE]
- </notification>
- <notification name="CorruptResourceFile">
- Beschadigd bron bestand: [FILE]
- </notification>
- <notification name="UnknownResourceFileVersion">
- Onbekende Linden bronbestandsversie in bestand: [FILE]
- </notification>
- <notification name="UnableToCreateOutputFile">
- Niet mogelijk om uitvoerbestand te maken: [FILE]
- </notification>
- <notification name="DoNotSupportBulkAnimationUpload">
- Wij ondersteunen momenteel geen bulk upload van animatie bestanden.
- </notification>
- <notification name="CannotUploadReason">
- Niet mogelijk om bestand [FILE] te uploaden vanwege de volgende reden: [REASON]
-Probeer het later opnieuw.
- </notification>
- <notification name="CannotCreateLandmarkNotOwner">
- U kunt hier geen land markering maken omdat de eigenaar van het land dit niet toestaat.
- </notification>
- <notification name="CannotRecompileSelectObjectsNoScripts">
- Niet mogelijk om te &apos;her compileren&apos;.
-Selecteer een object met een script.
- </notification>
- <notification name="CannotRecompileSelectObjectsNoPermission">
- Niet mogelijk om te &apos;hercompileren&apos;.
-
-Selecteer objecten met scripts waarvan u permissie heeft deze aan te passen.
- </notification>
- <notification name="CannotResetSelectObjectsNoScripts">
- Kan geen &apos;Opnieuw instellen&apos; uitvoeren.
-
-Selecteer objecten met scripts.
- </notification>
- <notification name="CannotResetSelectObjectsNoPermission">
- Kan geen &apos;Opnieuw instellen&apos; uitvoeren.
-
-Selecte objecten met scripts waarvan u permissie heeft deze aan te passen.
- </notification>
- <notification name="CannotSetRunningSelectObjectsNoScripts">
- Kan geen enkele scripts instellen op &apos;Uitvoeren&apos;.
-
-Selecteer objecten met scripts.
- </notification>
- <notification name="CannotSetRunningNotSelectObjectsNoScripts">
- Kan geen enkele scripts instellen op &apos;Niet uitvoeren&apos;.
-
-Selecteer objecten met scripts.
- </notification>
- <notification name="NoFrontmostFloater">
- Geen voorgaande floating waarde om op te slaan.
- </notification>
- <notification name="SeachFilteredOnShortWords">
- Uw zoek opdracht was aangepast en de woorden die te kort waren zijn verwijderd.
-
-Gezocht naar: [FINALQUERY]
- </notification>
- <notification name="SeachFilteredOnShortWordsEmpty">
- Uw zoek termen waren te kort en er is geen zoekopdracht uitgevoerd.
- </notification>
- <notification name="CouldNotTeleportReason">
- Kon niet Teleporteren.
-[REASON]
- </notification>
-
- <notification name="invalid_tport">
-Er is een probleem opgetreden bij het verwerken van uw verzoek voor een teleport. U dient wellicht opnieuw in te loggen voor uw kunt teleporteren. Wanneer u deze boodschap blijft ontvangen, controleert u dan alstublieft de Tech Support FAQ op:
-www.secondlife.com/support
- </notification>
- <notification name="invalid_region_handoff">
-Er is een probleem opgetreden bij het oversteken naar een andere regio. U dient wellicht opnieuw in te loggen voor uw kunt oversteken naar andere regio&apos;s. Wanneer u deze boodschap blijft ontvangen, controleert u dan alstublieft de Tech Support FAQ op:
-www.secondlife.com/support
- </notification>
- <notification name="blocked_tport">
-Sorry, teleport is momenteel geblokkeerd. Probeer het zo meteen opnieuw. Indien u nog steeds niet kunt teleporteren, log dan alstublieft uit en weer in om het probleem te verhelpen.
- </notification>
- <notification name="nolandmark_tport">
-Sorry, het systeem was niet in staat de bestemming van de landmarkering te vinden.
- </notification>
- <notification name="timeout_tport">
-Sorry, het systeem was niet in staat om de teleport verbinding af te ronden. Probeer het zo meteen nog een keer.
- </notification>
- <notification name="noaccess_tport">
-Sorry, u heeft geen toegang tot die teleportbestemming.
- </notification>
- <notification name="missing_attach_tport">
-Uw bevestigingen zijn nog niet gearriveerd. Probeer nog een aantal seconden te wachten of log uit en weer in voor u probeert te teleporteren.
- </notification>
- <notification name="too_many_uploads_tport">
-De assetwachtrij in deze regio is momenteel volgelopen, dus uw teleportverzoek zal niet tijdig afgerond kunnen worden. Probeer het alstublieft opnieuw over een aantal minuten of ga naar een minder druk gebied.
- </notification>
- <notification name="expired_tport">
-Sorry, het systeem was niet in staat uw teleportverzoek tijdig af te ronden. Probeer het alstublieft opnieuw over een aantal minuten.
- </notification>
- <notification name="expired_region_handoff">
-Sorry, het systeem was niet in staat om het oversteken naar een andere regio tijdig af te ronden. Probeer het alstublieft opnieuw over een aantal minuten.
- </notification>
- <notification name="no_host">
-Kan teleportbestemming niet vinden. De bestemming is mogelijk tijdelijk niet beschikbaar of bestaat niet meer. Probeer het alstublieft opnieuw over een aantal minuten.
- </notification>
- <notification name="no_inventory_host">
-Het inventarissysteem is momenteel niet beschikbaar.
- </notification>
-
- <notification name="CannotSetLandOwnerNothingSelected">
- Kan landeigenaar niet instellen:
-Geen perceel geselecteerd.
- </notification>
- <notification name="CannotSetLandOwnerMultipleRegions">
- Kon geen land eigendom forceren omdat de selectie meerder regio&apos;s omvat.
-Selecteer alstublieft een kleiner gebied en probeer het opnieuw.
- </notification>
- <notification name="ForceOwnerAuctionWarning">
- Dit perceel staat voor veiling aangemerkt. Eigendom forceren zal de veiling afbreking en kan potentieel een aantal inwoners niet erg blij maken als het bieden al is begonnen. Eigendom forceren?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="CannotContentifyNothingSelected">
- Unable to contentify:
-Geen perceel geselecteerd.
- </notification>
- <notification name="CannotContentifyNoRegion">
- Unable to contentify:
-Geen regio geselecteerd.
- </notification>
- <notification name="CannotReleaseLandNothingSelected">
- Kan land niet afstaan:
-Geen perceel geselecteerd.
- </notification>
- <notification name="CannotReleaseLandNoRegion">
- Kan land niet afstaan:
-kan de regio niet vinden.
- </notification>
- <notification name="CannotBuyLandNothingSelected">
- Kan land niet kopen:
-Geen perceel geselecteerd.
- </notification>
- <notification name="CannotBuyLandNoRegion">
- Kan land niet kopen:
-Kan de regio niet vinden waar dit land zich bevind.
- </notification>
- <notification name="CannotCloseFloaterBuyLand">
- U kunt het Koop Land venster niet sluiten totdat [APP_NAME] de prijs van de transactie geschat heeft.
- </notification>
- <notification name="CannotDeedLandNothingSelected">
- Kan land niet toekennen:
-Geen perceel geselecteerd.
- </notification>
- <notification name="CannotDeedLandNoGroup">
- Kan land niet toekennen:
-Geen groep geselecteerd.
- </notification>
- <notification name="CannotDeedLandNoRegion">
- Kan land niet toekennen:
-Kan de regio niet vinden waar dit land zich bevind.
- </notification>
- <notification name="CannotDeedLandMultipleSelected">
- Kan land niet toekennen:
-Meerder percelen geselecteerd.
-
-Probeer één enkel perceel te selecteren.
- </notification>
- <notification name="ParcelCanPlayMedia">
- Deze locatie van streaming media afspelen.
-
-Streaming media vereisen een snelle internet verbinding.
-
-Streaming media afspelen wanneer beschikbaar?
-(U kunt deze optie later wijzigen onder Preferenties &gt; Audio &amp; Video.)
- <usetemplate name="okcancelbuttons" notext="Uitschakelen" yestext="Media Afspelen"/>
- </notification>
- <notification name="CannotDeedLandWaitingForServer">
- Kan land niet toekennen:
-Wacht op de server om eigendom te rapporteren.
-
-Probeer het alstublieft opnieuw.
- </notification>
- <notification name="CannotDeedLandNoTransfer">
- Kan land niet toekennen:
-De regio [REGION] staat geen overdracht van land toe.
- </notification>
- <notification name="CannotReleaseLandWatingForServer">
- Kan land niet afstaan:
-Wacht op server om de perceel informatie bij te werken.
-
-Probeer het over enkele ogenblikken opnieuw.
- </notification>
- <notification name="CannotReleaseLandSelected">
- Kan land niet afstaan:
-Niet alle geselecteerde percelen zijn uw eigendom.
-
-Kies alstublieft één perceel.
- </notification>
- <notification name="CannotReleaseLandDontOwn">
- Kan land niet afstaan:
-U heeft geen permissie dit perceel vrij te geven.
-Percelen in uw eigendom verschijnen in groen.
- </notification>
- <notification name="CannotReleaseLandRegionNotFound">
- Kan land niet afstaan:
-Kan de regio niet vinden waar dit land zich bevind.
- </notification>
- <notification name="CannotReleaseLandNoTransfer">
- Kan land niet afstaan:
-De regio [REGION] staat geen overdracht van land toe.
- </notification>
- <notification name="CannotReleaseLandPartialSelection">
- Kan land niet afstaan:
-U moet het gehele perceel selecteren om het vrij te kunnen geven.
-
-Selecteer het gehele perceel of deel het eerst op.
- </notification>
- <notification name="ReleaseLandWarning">
- U staat op het punt om [AREA] m² land af te staan.
-Met het afstaan van dit perceel zal het uit uw land houderschapsoverzicht verdwijnen, maar zal u geen L$ toekennen.
-
-Dit land afstaan?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="CannotDivideLandNothingSelected">
- Kan land niet opdelen:
-
-Geen percelen geselecteerd.
- </notification>
- <notification name="CannotDivideLandPartialSelection">
- Kan land niet opdelen:
-
-U heeft het gehele perceel geselecteerd.
-Probeer een deel van het perceel te selecteren.
- </notification>
- <notification name="LandDivideWarning">
- Opdelen zal het perceel in twee delen verdelen en elk perceel kan zijn eigen instellingen hebben. Sommige instellingen zullen naar de standaard waarden terugkeren als de operatie voltooid is.
-
-Land opdelen?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="CannotDivideLandNoRegion">
- Kan het land niet opdelen:
-Kan de regio niet vinden waar dit land zich bevind.
- </notification>
- <notification name="CannotJoinLandNoRegion">
- Kan land niet verbinden:
-Kan de regio niet vinden waar dit land zich bevind.
- </notification>
- <notification name="CannotJoinLandNothingSelected">
- Kan land niet verbinden:
-Geen perceel geselecteerd.
- </notification>
- <notification name="CannotJoinLandEntireParcelSelected">
- Kan land niet verbinden:
-U heeft slechts één perceel geselecteerd.
-
-Selecteer land over beide percelen.
- </notification>
- <notification name="CannotJoinLandSelection">
- Kan land niet verbinden:
-U moet meer dan één perceel selecteren.
-
-Selecteer land over beide percelen.
- </notification>
- <notification name="JoinLandWarning">
- Het verbinding van dit land zal één groot perceel opleveren uit alle percelen die de rechthoek doorkruisen.
-U zult de naam en opties van het nieuwe perceel opnieuw in moeten stellen.
-
-Land verbinden?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="ShowOwnersHelp">
- Toon eigenaren:
-Kleur percelen om het eigenaarstype te tonen.
-
-Groen = Uw land
-Aqua = Land van uw groep
-Rood = Eigendom van anderen
-Geel = Te koop
-Paars = Ter veiling
-Grijs = Openbaar
- </notification>
- <notification name="ConfirmNotecardSave">
- Deze notitiekaart zal moet worden opgeslagen voordat het item kan worden gekopieerd of bekeken. Notitiekaart opslaan?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="ConfirmItemCopy">
- Dit item naar uw inventaris kopiëren?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="Kopiëren"/>
- </notification>
- <notification name="ResolutionSwitchFail">
- Mislukt om resolutie te verwisselen van [RESX] naar [RESY]
- </notification>
- <notification name="ErrorUndefinedGrasses">
- Fout: Onbekend gras: [SPECIES]
- </notification>
- <notification name="ErrorUndefinedTrees">
- Fout: Onbekende bomen: [SPECIES]
- </notification>
- <notification name="CannotSaveWearableOutOfSpace">
- Kon &apos;[NAME]&apos; niet opslaan voor draagbaar item. U zult wat ruimte moeten maken op uw computer en het draagbare item opnieuw op moeten slaan.
- </notification>
- <notification name="CannotSaveToAssetStore">
- Kon [NAME] niet opslaan in centrale (asset) opslag.
-Meestal is dit een tijdelijk probleem.
-Wijzig en sla het draagbaar item over een paar minuten opnieuw op.
- </notification>
- <notification name="YouHaveBeenLoggedOut">
- U bent uitgelogd uit [SECOND_LIFE]:
-[MESSAGE]
-U kunt uw bestaande IM en chat bekijken door te klikken op &apos;Toon IM &amp; Chat&apos;. Anders, klik op Afsluiten om [APP_NAME] direct te verlaten.
- <usetemplate name="okcancelbuttons" notext="Afsluiten" yestext="Toon IM &amp; Chat"/>
- </notification>
- <notification name="OnlyOfficerCanBuyLand">
- Kan land niet voor de groep kopen:
-U heeft geen permissie land te kopen voor de actieve groep.
- </notification>
- <notification label="Vriend Toevoegen" name="AddFriend">
- Vrienden kunnen elkaar permissie geven om elkaar te volgen op de Kaart en om Online status updates te verkrijgen.
-
-Vriendschap aanbieden aan [NAME]?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification label="Vriend Toevoegen" name="AddFriendWithMessage">
- Vrienden kunnen elkaar permissie geven om elkaar te volgen op de Kaart en om Online status updates te verkrijgen.
-
-Vriendschap aanbieden aan [NAME]?
- <form name="form">
- <input name="message">
- Wilt U mijn vriend zijn?
- </input>
- <button name="Offer" text="OK"/>
- <button name="Cancel" text="Annuleren"/>
- </form>
- </notification>
- <notification name="RemoveFromFriends">
- Wilt u [FIRST_NAME] [LAST_NAME] van uw Vriend lijst verwijderen?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="RemoveMultipleFromFriends">
- Wilt u meerder vrienden van uw Vrienden lijst verwijderen?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="GodDeleteAllScriptedPublicObjectsByUser">
- Weet u zeker dat u alle gescripte objecten wilt verwijderen eigendom van
-** [AVATAR_NAME] **
-op allen hun land in deze sim?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="GodDeleteAllScriptedObjectsByUser">
- Weet u zeker dat u ALLE gescripte objecten wilt VERWIJDEREN eigendom van
-** [AVATAR_NAME] **
-op AL het land in deze sim?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="GodDeleteAllObjectsByUser">
- Weet u zeker, dat u ALLE objecten (gescript of niet) wilt VERWIJDEREN eigendom van
-** [AVATAR_NAME] **
-op AL het LAND in deze sim?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="BlankClassifiedName">
- U moet een naam opgeven voor uw advertentie.
- </notification>
- <notification name="MinClassifiedPrice">
- De prijs voor weergave moet minimaal L$[MIN_PRICE] zijn.
-
-Voor alstublieft een hoger bedrag in.
- </notification>
- <notification name="ConfirmObjectDeleteLock">
- Ten minste één van de geselecteerde items is geblokkeerd.
-
-Weet u zeker dat u deze items wilt verwijderen?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectDeleteNoCopy">
- Ten minste één van de geselecteerde items is niet kopieerbaar.
-
-Weet u zeker dat u deze items wilt verwijderen?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectDeleteNoOwn">
- Tenminste één van de geselecteerde items is niet uw eigendom.
-
-Weet u zeker dat u deze items wilt verwijderen?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectDeleteLockNoCopy">
- Ten minste één item is geblokkeerd.
-Ten minste één item is niet kopieerbaar.
-
-Weet u zeker dat u deze items wilt verwijderen?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectDeleteLockNoOwn">
- Ten minste één item is geblokkeerd.
-Tenminste één object is niet uw eigendom.
-
-Weet u zeker dat u deze items wilt verwijderen?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectDeleteNoCopyNoOwn">
- Ten minste één object is niet kopieerbaar.
-Tenminste één object is niet uw eigendom.
-
-Weet u zeker dat u deze items wilt verwijderen?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectDeleteLockNoCopyNoOwn">
- Ten minste één item is geblokkeerd.
-Ten minste één item is niet kopieerbaar.
-Tenminste één object is niet uw eigendom.
-
-Weet u zeker dat u deze items wilt verwijderen?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectTakeLock">
- Ten minste één object is geblokkeerd.
-
-Weet u zeker dat u deze items terug wilt nemen?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectTakeNoOwn">
- Niet alle objecten die u terug neemt zijn uw eigendom.
-Indien u verder gaat, worden de permissies van de volgende eigenaar er op toegepast en beperkt het u mogelijk het aan te passen of te kopiëren.
-
-Weet u zeker dat u deze items terug wilt nemen?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectTakeLockNoOwn">
- Ten minste één object is geblokkeerd.
-Niet alle objecten die u terug neemt zijn uw eigendom.
-Indien u verder gaat, worden de permissies van de volgende eigenaar er op toegepast en beperkt het u mogelijk het aan te passen of te kopiëren.
-Echter, U kunt de huidige selectie wel terugnemen.
-
-Weet u zeker dat u deze items terug wilt nemen?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="CantBuyLandAcrossMultipleRegions">
- Kan het land niet kopen omdat het meerder regio&apos;s omvat.
-
-Kiest u alstublieft een kleiner gebied en probeer het opnieuw.
- </notification>
- <notification name="DeedLandToGroup">
- Voor het overdragen van dit perceel zal de groep voldoen land gebruikscredit moeten hebben en onderhouden.
-Het aankoop bedrag zal niet naar de eigenaar worden terug gestort.
-Indien een overgedragen perceel wordt verkocht, zal het verkoop bedrag gelijkmatig over de groepsleden worden verdeeld.
-
-Deze [AREA] m² land overdragen aan de groep &apos;[GROUP_NAME]&apos;?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="DeedLandToGroupWithContribution">
- Voor het overdragen van dit perceel zal de groep voldoen land gebruikscredit moeten hebben en onderhouden.
-De overdracht zal een simultane land contributie verlangen van de groep van &apos;[FIRST_NAME] [LAST_NAME]&apos;.
-Het aankoop bedrag zal niet naar de eigenaar worden terug gestort.
-Indien een overgedragen perceel wordt verkocht, zal het verkoop bedrag gelijkmatig over de groepsleden worden verdeeld.
-
-Deze [AREA] m² land overdragen aan de groep &apos;[GROUP_NAME]&apos;?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="DisplaySetToSafe">
- Weergave instellingen zijn op veilige waarden ingesteld omdat u de -save optie op heeft gegeven.
- </notification>
- <notification name="DisplaySetToRecommended">
- Weergave instellingen zijn ingesteld op geadviseerde waarden, gebaseerd op uw systeem configuratie.
- </notification>
- <notification name="ErrorMessage">
- [ERROR_MESSAGE]
- </notification>
- <notification name="AvatarMoved">
- Uw [TYPE] locatie is momenteel niet beschikbaar.
-[HELP]
-U bent naar een nabij gelegen regio verplaatst.
- </notification>
- <notification name="ClothingLoading">
- Uw kleding wordt nog steeds geladen.
-U kunt [SECOND_LIFE] normaal gebruiken en anderen zullen u correct zien.
- <form name="form">
- <ignore name="ignore" text="Indien kleding een erg lange tijd in beslag neemt om de laden"/>
- </form>
- </notification>
- <notification name="FirstRun">
- [APP_NAME] installatie compleet.
-
-Als dit de eerste keer is dat u [SECOND_LIFE] gebruikt, zult u een account aan moeten maken voordat u in kan loggen.
-Terugkeren naar [https://join.secondlife.com/index.php?lang=nl-NL secondlife.com] om een nieuw account aan te maken?
- <usetemplate name="okcancelbuttons" notext="Doorgaan" yestext="Nieuw Account..."/>
- </notification>
- <notification name="LoginPacketNeverReceived">
- Wij hebben problemen verbinding te maken. Er zou een probleem kunnen zijn met uw internet verbinding of met de [SECOND_LIFE] servers.
-
-U kunt uw internet verbinding controleren en het over een paar minuten opnieuw proberen, op Help klikken om verbinding te maken met onze support website, of klik op Teleporteren om een poging te doen naar uw thuis locatie te teleporteren.
- <form name="form">
- <button name="OK" text="OK"/>
- <button name="Help" text="Help"/>
- <button name="Teleport" text="Teleport"/>
- </form>
- </notification>
- <notification name="WelcomeChooseSex">
- Uw avatar zal over enkele ogenblikken verschijnen.
-
-Gebruik de pijltjestoetsen om te lopen.
-Druk op elk gewenst moment op F1 voor Help en om meer te leren over [SECOND_LIFE].
-Kies alstublieft een mannelijk of vrouwelijke avatar. U kunt later nog van gedachten veranderen.
- <usetemplate name="okcancelbuttons" notext="Vrouw" yestext="Man"/>
- </notification>
- <notification name="NotEnoughCurrency">
- [NAME] L$ [PRICE] U heeft niet genoeg L$ om dit te doen.
- </notification>
- <notification name="GrantedModifyRights">
- U heeft het recht verkregen om objecten van [FIRST_NAME] [LAST_NAME] te wijzigen.
- </notification>
- <notification name="RevokedModifyRights">
- Uw recht om objecten van [FIRST_NAME] [LAST_NAME] is ingetrokken.
- </notification>
- <notification name="FlushMapVisibilityCaches">
- Dit zal de Kaart cache van deze regio opschonen.
-
-Dit is eigenlijk alleen nuttig voor debugging.
-(In productie, wacht 5 minuten, dan zal de Kaart van iedereen bijgewerkt worden als ze opnieuw verbinden.)
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="BuyOneObjectOnly">
- Kan niet meer dan één object tegelijkertijd kopen. Selecteer alstublieft slechts één object en probeer opnieuw.
- </notification>
- <notification name="OnlyCopyContentsOfSingleItem">
- Kan niet de inhoud van meer dan één item per keer kopiëren.
-Kies alstublieft slechts één object en probeer het opnieuw.
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="KickUsersFromRegion">
- Alle Inwoners in deze regio naar de thuis locatie Teleporteren?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="EstateObjectReturn">
- Weet u zeker dat u alle objecten wilt retourneren eigendom van [USER_NAME] ?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="InvalidTerrainBitDepth">
- Kon de regio textuur niet plaatsen:
-Terrein textuur [TEXTURE_NUM] heeft een ongeldige bit diepte van [TEXTURE_BIT_DEPTH].
-
-Vervang de textuur [TEXTURE_NUM] met een 24-bit 512x512 of een kleinere afbeelding, klik dan op opnieuw op &quot;Toepassen&quot;.
- </notification>
- <notification name="InvalidTerrainSize">
- Kon de regio textuur niet plaatsen:
-Terrein textuur [TEXTURE_NUM] is te groot met [TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y].
-
-Vervang de textuur [TEXTURE_NUM] met een 24-bit 512x512 of een kleinere afbeelding, klik dan op opnieuw op &quot;Toepassen&quot;.
- </notification>
- <notification name="RawUploadStarted">
- Upload gestart. Het kan tot twee minuten duren, afhankelijk van u verbindings snelheid.
- </notification>
- <notification name="ConfirmBakeTerrain">
- Wilt u werkelijk het huidige terrein &apos;baken&apos;, dit als middelpunt voor de verhoog/verlaag limieten instellen en als standaard instellen voor het &apos;Herstel&apos; gereedschap?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="MaxAllowedAgentOnRegion">
- U kunt slechts [MAX_AGENTS] Toegestane Inwoners hebben.
- </notification>
- <notification name="MaxBannedAgentsOnRegion">
- U kunt slechts [MAX_BANNED] Verbannen Inwoners hebben.
- </notification>
- <notification name="MaxAgentOnRegionBatch">
- Een poging [NUM_ADDED] agents toe te voegen is mislukt:
-Overstijgt de [MAX_AGENTS] [LIST_TYPE] limiet met [NUM_EXCESS].
- </notification>
- <notification name="MaxAllowedGroupsOnRegion">
- U kunt slechts [MAX_GROUPS] Toegestane Groepen hebben.
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="Bake"/>
- </notification>
- <notification name="MaxManagersOnRegion">
- U kunt slechts [MAX_MANAGER] Estate Beheerders hebben.
- </notification>
- <notification name="OwnerCanNotBeDenied">
- Kan de estate eigenaar niet aan de Verbannen lijst van het estate toe voegen.
- </notification>
- <notification name="CanNotChangeAppearanceUntilLoaded">
- Kan het Uiterlijk niet veranderen totdat kleding en Postuur geladen zijn.
- </notification>
- <notification name="ClassifiedMustBeAlphanumeric">
- De naam van uw advertentie moet beginnen met een letter van A tot Z of een nummer.
-Leestekens zijn niet toegestaan.
- </notification>
- <notification name="CantSetBuyObject">
- Kan Koop Object niet instellen omdat het object niet te koop is.
-Zet het object alstublieft te koop en probeer het opnieuw.
- </notification>
- <notification name="FinishedRawDownload">
- Download van raw terrein bestand geëindigd naar:
-[DOWNLOAD_PATH].
- </notification>
- <notification name="DownloadWindowsMandatory">
- Een nieuwe versie van [APP_NAME] is beschikbaar.
-[MESSAGE]
-U moet deze update downloaden om [APP_NAME] te kunnen gebruiken.
- <usetemplate name="okcancelbuttons" notext="Afsluiten" yestext="Download"/>
- </notification>
- <notification name="DownloadWindows">
- Een bijgewerkte versie van [APP_NAME] is beschikbaar.
-[MESSAGE]
-Deze update is niet vereist, maar wij raden aan dat u het installeert om de prestaties en stabiliteit te verbeteren.
- <usetemplate name="okcancelbuttons" notext="Doorgaan" yestext="Download"/>
- </notification>
- <notification name="DownloadWindowsReleaseForDownload">
- Een bijgewerkte versie van [APP_NAME] is beschikbaar.
-[MESSAGE]
-Deze update is niet vereist, maar wij raden aan dat u het installeert om de prestaties en stabiliteit te verbeteren.
- <usetemplate name="okcancelbuttons" notext="Doorgaan" yestext="Download"/>
- </notification>
- <notification name="DownloadMacMandatory">
- Een nieuwe versie van [APP_NAME] is beschikbaar.
-[MESSAGE]
-U moet deze update downloaden om [APP_NAME] te kunnen gebruiken.
-
-Downloaden naar uw Applicatie Data map?
- <usetemplate name="okcancelbuttons" notext="Afsluiten" yestext="Download"/>
- </notification>
- <notification name="DownloadMac">
- Een bijgewerkte versie van [APP_NAME] is beschikbaar.
-[MESSAGE]
-Deze update is niet vereist, maar wij raden aan dat u het installeert om de prestaties en stabiliteit te verbeteren.
-
-Downloaden naar uw Applicatie Data map?
- <usetemplate name="okcancelbuttons" notext="Doorgaan" yestext="Download"/>
- </notification>
- <notification name="DownloadMacReleaseForDownload">
- Een bijgewerkte versie van [APP_NAME] is beschikbaar.
-[MESSAGE]
-Deze update is niet vereist, maar wij raden aan dat u het installeert om de prestaties en stabiliteit te verbeteren.
-
-Downloaden naar uw Applicatie Data map?
- <usetemplate name="okcancelbuttons" notext="Doorgaan" yestext="Download"/>
- </notification>
- <notification name="DeedObjectToGroup">
- Dit object overdragen aan de groep zal de groep:
-* L$ ontvangen als betaald in het object
- <usetemplate ignoretext="Bij objecten die overgedragen worden aan groepen" name="okcancelignore" notext="Annuleren" yestext="Overdragen"/>
- </notification>
- <notification name="WebLaunchExternalTarget">
- Uw systeem browser openen om deze inhoud te bekijken?
- <usetemplate ignoretext="Bij openen van systeem browser om de webpagina te bekijken" name="okcancelignore" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="WebLaunchJoinNow">
- Naar www.secondlife.com gaan om uw account te beheren?
- <usetemplate ignoretext="Bij openen van webbrowser om uw account te beheren" name="okcancelignore" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="WebLaunchSecurityIssues">
- Bezoek de [SECOND_LIFE] Wiki voor details over hoe een Veiligheids Probleem (Security Issue) te rapporteren.
- <usetemplate ignoretext="Bij openen webbrowser om de Veiligheids Problemen Wiki (Security Issues Wiki) te bekijken" name="okcancelignore" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="WebLaunchQAWiki">
- Bezoek de [SECOND_LIFE] QA Wiki (Kwaliteitsbeheersing Wiki).
- <usetemplate ignoretext="Bij openen webbrowser om de QA Wiki (Kwaliteitsbeheersing Wiki) te bekijken" name="okcancelignore" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="WebLaunchPublicIssue">
- Bezoek de [SECOND_LIFE] Publieke problemenlijst, waar u Bugs en andere Problemen kunt rapporteren.
- <usetemplate ignoretext="Bij openen webbrowser om de Publieke problemenlijst te bekijken" name="okcancelignore" notext="Annuleren" yestext="Ga naar pagina"/>
- </notification>
- <notification name="WebLaunchPublicIssueHelp">
- Bezoek de [SECOND_LIFE] Wiki voor informatie over het gebruik van de Publieke problemenlijst.
- <usetemplate ignoretext="Bij openen webbrowser om de Publieke problemenlijst Wiki te bekijken" name="okcancelignore" notext="Annuleren" yestext="Ga naar pagina"/>
- </notification>
- <notification name="WebLaunchSupportWiki">
- Ga naar de Officiële Linden Blog voor het laatste Nieuws en Informatie.
- <usetemplate ignoretext="Bij openen webbrowser om de blog te bekijken" name="okcancelignore" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="WebLaunchLSLGuide">
- Naar de Script Gids gaan voor hulp met scripten?
- <usetemplate ignoretext="Bij openen webbrowser om de Script Gids te bekijken" name="okcancelignore" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="WebLaunchLSLWiki">
- Naar de LSL Portaal gaan voor hulp met scripten?
- <usetemplate ignoretext="Bij openen webbrowser om de LSL Portal te bekijken" name="okcancelignore" notext="Annuleren" yestext="Ga naar pagina"/>
- </notification>
- <notification name="ReturnToOwner">
- Weet u zeker dat u de geselecteerde objecten wilt retourneren naar de eigenaren?
-Overdraagbare toegekende objecten zullen naar de oorspronkelijke eigenaren worden geretourneerd.
-
-*WAARSCHUWING* Niet overdraagbare toegekende objecten zullen worden verwijderd!
- <usetemplate ignoretext="Bij retourneren objecten naar de eigenaren" name="okcancelignore" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="GroupLeaveConfirmMember">
- U bent momenteel een lid van de groep [GROUP].
-Groep Verlaten?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="ConfirmKick">
- Weet u HEEL ZEKER dat u alle gebruikers uit het grid wilt verwijderen?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="Verwijder Alle Gebruikers"/>
- </notification>
- <notification name="MuteLinden">
- Sorry, u kunt geen Linden Negeren
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="CannotStartAuctionAlreadyForSale">
- U kunt geen veiling starten op een perceel dat al te koop is gezet. Schakel de landverkoop uit wanneer u zeker bent dat u een veiling wil starten.
- </notification>
- <notification label="Negeren van object mislukt" name="MuteByNameFailed">
- U heeft deze naam al genegeerd.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="RemoveItemWarn">
- Alhoewel toegestaan, verwijderen van de inhoud kan het object beschadigen. Wilt u dit item verwijderen?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="CantOfferCallingCard">
- Kan op dit moment geen visitekaart aanbieden. Probeer het alstublieft later opnieuw.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="CantOfferFriendship">
- Kan op dit moment geen vriendschap aanbieden. Probeer het alstublieft later opnieuw.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="BusyModeSet">
- Niet Storen modus ingesteld.
-
-Chat and instant messages zullen verborgen blijven. Instant messages zullen uw Niet Storen melding krijgen. Alle teleport aanbiedingen zullen worden afgewezen. Alle inventaris aanbiedingen zullen in uw Vuilnisbak terecht komen.
- <usetemplate ignoretext="Bij instellen Niet Storen modus" name="okignore" yestext="OK"/>
- </notification>
- <notification name="JoinedTooManyGroupsMember">
- U ben lid van teveel groepen om lid te worden van een andere. Verlaat op zijn minst één groep alvorens lid te worden van een andere of weiger de lidmaatschap aanbieding.
-Om een groep te verlaten, selecteer de &apos;Groep..&apos; optie via het &apos;Bewerken&apos; menu.
-
-[NAME] heeft u uitgenodigd om lid te worden van de groep als algemeen lid.
-
-[INVITE]
- <usetemplate name="okcancelbuttons" notext="Afslaan" yestext="Lid worden"/>
- </notification>
- <notification name="KickUser">
- Verwijder deze gebruiker met welk bericht?
- <form name="form">
- <input name="message">
- Een administrator heeft u uitgelogd.
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Annuleren"/>
- </form>
- </notification>
- <notification name="KickAllUsers">
- Verwijder iedereen momenteel op het grid met welk bericht?
- <form name="form">
- <input name="message">
- Een administrator heeft u uitgelogd.
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Annuleren"/>
- </form>
- </notification>
- <notification name="FreezeUser">
- Bevries deze gebruiker met welk bericht?
- <form name="form">
- <input name="message">
- U bent bevroren. U kunt zich niet verplaatsen of praten. Een administrator zal contact met u opnemen via instant message (IM).
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Annuleren"/>
- </form>
- </notification>
- <notification name="UnFreezeUser">
- Ontdooi deze gebruiker met welk bericht?
- <form name="form">
- <input name="message">
- U bent niet langer bevroren.
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Annuleren"/>
- </form>
- </notification>
- <notification name="OfferTeleport">
- Een Teleport aanbieden naar uw locatie met welk bericht?
- <form name="form">
- <input name="message">
- Voeg u bij mij in [REGION]
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Annuleren"/>
- </form>
- </notification>
- <notification name="OfferTeleportFromGod">
- God beveel gebruiker naar uw locatie?
- <form name="form">
- <input name="message">
- Voeg u bij mij in [REGION]
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Annuleren"/>
- </form>
- </notification>
- <notification name="TeleportFromLandmark">
- Weet u zeker dat u wilt teleporteren?
- <usetemplate ignoretext="Bij teleporteren via een landmarkering in inventaris" name="okcancelignore" notext="Annuleren" yestext="Teleporteren"/>
- </notification>
- <notification label="Bericht iedereen in uw Estate" name="MessageEstate">
- Type een kort bericht om naar iedereen sturen die momenteel in uw Estate aanwezig is.
- <form name="form">
- <input name="message"/>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Annuleren"/>
- </form>
- </notification>
- <notification label="Wijzig Linden Estate" name="ChangeLindenEstate">
- U staat op het punt een Linden beheerde Estate te wijzigen mainland, teen grid, orientation, etc.).
-
-Dit is EXTREEM GEVAARLIJK om het fundamenteel de gebruikers ervaring kan aantasten.
-Op het mainland zal het duizenden regionen wijzigen en de spaceserver kan storingen vertonen.
-
-Doorgaan?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification label="Wijzig Linden Estate Toegang" name="ChangeLindenAccess">
- U staat op het punt de toegangslijst van een Linden Estate eigendom aan te passen (mainland, teen grid, orientation, etc.).
-
-Dit is GEVAARLIJK en zou alleen gedaan moeten worden om de hack toe te staan om objecten/L$ over te dragen in/uit het grid.
-Het zal het duizenden regionen wijzigen en de spaceserver kan storingen vertonen.
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification label="Selecteer Estate" name="EstateAllowedAgentAdd">
- Alleen aan toegangslijst voor dit Estate toevoegen of voor [ALL_ESTATES]?
- <usetemplate canceltext="Annuleren" name="yesnocancelbuttons" notext="Alle Estates" yestext="Dit Estate"/>
- </notification>
- <notification label="Selecteer Estate" name="EstateAllowedAgentRemove">
- Verwijderen van toegangslijst voor alleen dit Estate of voor [ALL_ESTATES]?
- <usetemplate canceltext="Annuleren" name="yesnocancelbuttons" notext="Alle Estates" yestext="Dit Estate"/>
- </notification>
- <notification label="Selecteer Estate" name="EstateAllowedGroupAdd">
- Alleen aan groeps toegangslijst voor dit Estate toevoegen of voor [ALL_ESTATES]?
- <usetemplate canceltext="Annuleren" name="yesnocancelbuttons" notext="Alle Estates" yestext="Dit Estate"/>
- </notification>
- <notification label="Selecteer Estate" name="EstateAllowedGroupRemove">
- Verwijderen van groeps toegangslijst voor alleen dit Estate of voor [ALL_ESTATES]?
- <usetemplate canceltext="Annuleren" name="yesnocancelbuttons" notext="Alle Estates" yestext="Dit Estate"/>
- </notification>
- <notification label="Selecteer Estate" name="EstateBannedAgentAdd">
- Weiger toegang voor alleen dit Estate of voor [ALL_ESTATES]?
- <usetemplate canceltext="Annuleren" name="yesnocancelbuttons" notext="Alle Estates" yestext="Dit Estate"/>
- </notification>
- <notification label="Selecteer Estate" name="EstateBannedAgentRemove">
- Deze Inwoner van de ban lijst voor toegang voor alleen dit Estate verwijderen of voor [ALL_ESTATES]?
- <usetemplate canceltext="Annuleren" name="yesnocancelbuttons" notext="Alle Estates" yestext="Dit Estate"/>
- </notification>
- <notification label="Selecteer Estate" name="EstateManagerAdd">
- Estate beheerder toevoegen voor alleen dit Estate of voor [ALL_ESTATES]?
- <usetemplate canceltext="Annuleren" name="yesnocancelbuttons" notext="Alle Estates" yestext="Dit Estate"/>
- </notification>
- <notification label="Selecteer Estate" name="EstateManagerRemove">
- Estate beheerder verwijderen voor alleen dit Estate of voor [ALL_ESTATES]?
- <usetemplate canceltext="Annuleren" name="yesnocancelbuttons" notext="Alle Estates" yestext="Dit Estate"/>
- </notification>
- <notification label="Bevestig Verwijderen" name="EstateKickUser">
- Verwijder [EVIL_USER] van deze Estate?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="EstateChangeCovenant">
- Weet u zeker dat u de Estate Convenant wilt wijzigen?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="RegionEntryAccessBlocked">
- U wordt niet in die regio toegelaten vanwege uw inhoudscategorie. Dit kan het gevolg zijn van een gebrek aan informatie die uw leeftijd valideert.
-
-Verifieer alstublieft dat u de nieuwste viewer heeft geïnstalleerd en ga naar de kennisbank voor details over het betreden van gebieden met deze inhoudscategorie.
- <usetemplate
- name="okbutton"
- yestext="OK"/>
- </notification>
- <notification name="RegionEntryAccessBlocked_KB">
- U wordt niet in die regio toegelaten vanwege uw inhoudscategorie.
-
-Ga naar de kennisbank voor meer informatie over inhoudscategorieën?
- <url name="url">
- https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
- </url>
- <usetemplate
- name="okcancelignore"
- yestext="Ga naar kennisbank"
- notext="Sluiten"
- ignoretext="Wanneer regiotoegang wordt geblokkeerd vanwege de inhoudscategorie"/>
- </notification>
- <notification name="RegionEntryAccessBlocked_Notify">
- U wordt niet in die regio toegelaten vanwege uw inhoudscategorie.
- </notification>
- <notification name="RegionEntryAccessBlocked_Change">
- U wordt niet in die regio toegelaten vanwege uw inhoudscategorie.
-
-U kunt klikken op &apos;Wijzig voorkeur&apos; om uw inhoudscategorie voorkeur nu te verhogen en toegelaten te worden. U zult in staat zijn om [REGIONMATURITY] inhoud te zoeken en benaderen vanaf dit moment. Wanneer u later deze instelling wilt wijzigen, ga dan naar Bewerken &gt; Voorkeuren... &gt; Algemeen.
- <form name="form">
- <button
- name="OK"
- text="Wijzig voorkeur"/>
- <button
- default="true"
- name="Cancel"
- text="Sluiten"/>
- <ignore name="ignore" text="Wanneer regiotoegang wordt geblokkeerd vanwege de inhoudscategorie voorkeur"/>
- </form>
- </notification>
- <notification name="LandClaimAccessBlocked">
- U kunt dit land niet opeisen vanwege uw inhoudscategorie. Dit kan het gevolg zijn van een gebrek aan informatie die uw leeftijd valideert.
-
-Verifieer alstublieft dat u de nieuwste viewer heeft geïnstalleerd en ga naar de kennisbank voor details over het betreden van gebieden met deze inhoudscategorie.
- <usetemplate
- name="okbutton"
- yestext="OK"/>
- </notification>
- <notification name="LandClaimAccessBlocked_KB">
- U kunt dit land niet opeisen vanwege uw inhoudscategorie.
-
-Ga naar de kennisbank voor meer informatie over inhoudscategorieën?
- <url name="url">
- https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
- </url>
- <usetemplate
- name="okcancelignore"
- yestext="Ga naar kennisbank"
- notext="Sluiten"
- ignoretext="Wanneer het opeisen van land wordt geblokkeerd vanwege de inhoudscategorie"/>
- </notification>
- <notification name="LandClaimAccessBlocked_Notify">
- U kunt dit land niet opeisen vanwege uw inhoudscategorie.
- </notification>
- <notification name="LandClaimAccessBlocked_Change">
- U kunt dit land niet opeisen vanwege uw inhoudscategorie voorkeur.
-
-U kunt klikken op &apos;Wijzig voorkeur&apos; om uw inhoudscategorie voorkeur nu te verhogen en toegang te krijgen om binnen te treden. U zult in staat zijn om [REGIONMATURITY] inhoud vanaf nu te zoeken en benaderen. Wanneer u deze instelling later terug wilt zetten, gaat u naar Bewerken &gt; Voorkeuren... &gt; Algemeen.
- <usetemplate
- name="okcancelignore"
- yestext="Wijzig voorkeur"
- notext="Sluiten"
- ignoretext="Wanneer het opeisen van land wordt geblokkeerd vanwege de inhoudscategorie voorkeur"/>
- </notification>
- <notification name="LandBuyAccessBlocked">
- U kunt dit land niet kopen vanwege uw inhoudscategorie. Dit kan het gevolg zijn van een gebrek aan informatie die uw leeftijd valideert.
-
-Verifieer alstublieft of u de nieuwste viewer heeft geïnstalleerd en ga naar de kennisbank voor details over het betreden van gebieden met deze inhoudscategorie.
- <usetemplate
- name="okbutton"
- yestext="OK"/>
- </notification>
- <notification name="LandBuyAccessBlocked_KB">
- U kunt dit land niet kopen vanwege uw inhoudscategorie.
-
-Ga naar de kennisbank voor meer informatie over inhoudscategorieën?
- <url name="url">
- https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
- </url>
- <usetemplate
- name="okcancelignore"
- yestext="Ga naar kennisbank"
- notext="Sluiten"
- ignoretext="Wanneer een landaankoop wordt geblokkeerd vanwege de inhoudscategorie"/>
- </notification>
- <notification name="LandBuyAccessBlocked_Notify">
- U kunt dit land niet kopen vanwege uw inhoudscategorie.
- </notification>
- <notification name="LandBuyAccessBlocked_Change">
- U kunt dit land niet kopen vanwege uw inhoudscategorie voorkeur.
-
-U kunt klikken op &apos;Wijzig voorkeur&apos; om uw inhoudscategorie voorkeur nu te verhogen en toegang te krijgen om binnen te treden. U zult in staat zijn om [REGIONMATURITY] inhoud vanaf nu te zoeken en benaderen. Wanneer u deze instelling later terug wilt zetten, gaat u naar Bewerken &gt; Voorkeuren... &gt; Algemeen.
- <usetemplate
- name="okcancelignore"
- yestext="Wijzig voorkeur"
- notext="Sluiten"
- ignoretext="Wanneer een landaankoop wordt geblokkeerd vanwege de inhoudscategorie voorkeur"/>
- </notification>
- <notification name="TooManyPrimsSelected">
- &quot;Er zijn teveel prims geselecteerd. Selecteer alstublieft [MAX_PRIM_COUNT] of minder prims en probeer opnieuw.&quot;
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="ProblemImportingEstateCovenant">
- Probleem met importeren Estate Convenant.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="ProblemAddingEstateManager">
- Problemen met het toevoegen van een Estate beheerder. Eén of meer Estates kunnen een volle beheerders lijst hebben.
- </notification>
- <notification name="ProblemAddingEstateGeneric">
- Problemen met toevoegen aan deze Estate lijst. Eén of meer Estates kunnen een volle lijst hebben.
- </notification>
- <notification name="UnableToLoadNotecardAsset">
- Kan de asset van de notitiekaart op dit moment niet laden.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="NotAllowedToViewNotecard">
- Onvoldoende rechten om de notitiekaart in te zien geassocieerd met het opgevraagde asset ID.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="MissingNotecardAssetID">
- Asset ID voor de notitiekaart ontbreekt in de database.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="PublishClassified">
- Bedenk: kosten voor advertenties worden niet terugbetaald.
-
-Advertentie nu Publiceren voor L$[AMOUNT]?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="SetClassifiedMature">
- Bevat deze advertentie Mature inhoud?
- <usetemplate
- canceltext="Annuleren"
- name="yesnocancelbuttons"
- notext="Nee"
- yestext="Ja"/>
- </notification>
- <notification name="SetGroupMature">
- Bevat deze groep Mature inhoud?
- <usetemplate
- canceltext="Annuleren"
- name="yesnocancelbuttons"
- notext="Nee"
- yestext="Ja"/>
- </notification>
- <notification label="Bevestig herstart" name="ConfirmRestart">
- Wilt u deze regio echt binnen 2 minuten herstarten?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification label="Bericht iedereen in deze regio" name="MessageRegion">
- Type een kort bericht om naar iedereen sturen die momenteel in regio aanwezig is.
- <form name="form">
- <input name="message"/>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Annuleren"/>
- </form>
- </notification>
- <notification label="Weiger Land aanpassingen" name="HelpRegionBlockTerraform">
- Indien dit aan gevinkt kunnen landeigenaren geen terrein bewerkingen doen op hun land, ongeacht de per perceel ingestelde waarde voor &apos;Wijzig Terrein&apos;
-
-Standaard: uitgeschakeld
- </notification>
- <notification label="Blokkeer Vliegen" name="HelpRegionBlockFly">
- Indien dit is aan gevinkt kunnen personen niet vliegen in deze regio ongeacht de per perceel ingestelde waarde &apos;Vliegen&apos;
-
-Standaard: uitgeschakeld
- </notification>
- <notification label="Bulkwijzigen Inhoudpermissies" name="HelpBulkPermission">
- Het Bulkpermissiesgereedschap helpt u om snel de permissies op meerdere items in de inhoud van het geselecteerde object te wijzigen. Let echter op dat u alleen de permissies op de items in de Inhoud van de geselecteerde objecten instelt -- niet de permissies van het containerobject zelf.
-
-Merk ook op dat de permissies niet worden toegepast op de geneste inhoud van de items in Inhoud. Uw verzoek werkt alleen op items precies één niveau diep.
-
-U kunt selectief kiezen welke soorten objecten te wijzigen door gebruik te maken van de checklist onder &apos;Inhoud Types&apos; hier. Foto&apos;s worden opgenomen wanneer u Texturen selecteert.
-
-* Dit gereedschap is alleen succesvol in het wijzigen van permissies op objecten die u mag wijzigen.
-* U kunt geen &apos;Volgende Eigenaar&apos; permissies toekennen die u niet al bezit.
-* De &apos;Volgende Eigenaar&apos; permissies zijn slechts verzoeken. Indien een item niet alle nieuwe permissies kan overnemen, zal geen van zijn permissies wijzigen.
-
-Wanneer u klaar bent om de permissies in bulk te wijzigen, klik dan &apos;Toepassen&apos; en wacht tot de resultaten worden weergegeven.
-
-Indien u het Bulkpermissies venster sluit terwijl permissies gewijzigd worden, zal de verwerking gestopt worden.
- </notification>
- <notification label="Sta Letsel Toe" name="HelpRegionAllowDamage">
- Indien dit is aan gevinkt stelt het Letsel systeem in voor alle percelen, ongeacht de individuele instellingen op de percelen. Indien uitgeschakeld, kunnen perceel eigenaren het Letsel systeem op hun perceel activeren.
-
-Standaard: uitgeschakeld
- </notification>
- <notification label="Agent Limiet" name="HelpRegionAgentLimit">
- Stelt het maximale aantal toegestane avatars in voor deze regio.
-De prestaties kunnen variëren afhankelijk van het aantal aanwezige avatars.
-
-Standaard: 40
- </notification>
- <notification label="Object Bonus" name="HelpRegionObjectBonus">
- De Object Bonus is een vermeerderaar voor primitieven op een willekeurig perceel.
-Het bereik is van 1 tot 10. Ingesteld op &apos;1&apos; kan elk 512m² perceel 117 objecten bevatten. Ingesteld op &apos;2&apos; kan elk 512m² perceel 234 objecten bevatten, enzovoort. Het maximale aantal objecten blijft 15.000, ongeacht wat de Object Bonus is. Denk er aan, dat eenmaal ingesteld, het verlagen van de Object Bonus het retourneren of verwijderen van objecten tot gevolg kan hebben.
-
-Standaard: 1.0
- </notification>
- <notification label="Inhoudscategorie:" name="HelpRegionMaturity">
- Stelt de inhoudscategorie van de regio in, zoals getoond in de menubalk bovenaan de viewer van elke inwoner en in tooltips op de wereldkaart wanneer de aanwijzer boven deze regio zweeft. Deze instelling heeft ook invloed op de toegang tot deze regio en zoekresultaten. Andere inwoners kunnen alleen regio&apos;s binnengaan of zoekresultaten zien met dezelfde inhoudscategorie als die zij zelf hebben gekozen in hun voorkeuren.
-
-Het kan enige tijd duren voordat deze wijziging zichtbaar is op de wereldkaart.
- </notification>
- <notification label="Beperk Duwen" name="HelpRegionRestrictPushObject">
- Deze instelling stelt de hele regio in op beperkte duwen permissies.
-Indien aan gevinkt kunnen Inwoners alleen door hun zelf geduwd worden of door de perceel eigenaar.
-
-(Push (Duwen) verwijst naar de llPushObject() LSL functie)
-
-Standaard: Uitgeschakeld
- </notification>
- <notification label="Perceel Samenvoegen/Opsplitsen" name="HelpParcelChanges">
- Deze instelling stel in of percelen die niet van de estate eigenaar zijn kunnen worden samengevoegd of opgesplitst.
-
-Indien niet aan gevinkt:
- * Alleen Estate eigenaren of beheerders kunnen percelen samenvoegen op opsplitsen.
- * Zij kunnen alleen percelen samenvoegen of opsplitsen die eigendom zijn van de eigenaar of van een groep met de juiste bevoegdheden.
-
-Indien aan gevinkt:
- * Alle perceel eigenaren kunnen percelen samenvoegen of opsplitsen die zij bezitten.
- * Voor percelen in Groep eigendom, kunnen alleen zij met de juiste rechten percelen samenvoegen of opsplitsen.
-
-Standaard: Ingeschakeld
- </notification>
- <notification label="Niet in Zoeken tonen" name="HelpRegionSearch">
- Deze optie aan vinken zal perceel eigenaren blokkeren hun perceel in Zoeken te tonen.
-
-Standaard: Uitgeschakeld
- </notification>
- <notification label="Regio Volwassenen Gewijzigd" name="RegionMaturityChange">
- De Volwassen instelling voor deze regio is bijgewerkt.
-Het kan enige tijd duren voordat de wijziging zichtbaar is op de Kaart.
- </notification>
- <notification label="Land Herverkoop" name="HelpRegionLandResell">
- Estate eigenaren en beheerders kunnen elk stuk land verkopen in eigendom van de Estate eigenaar.
-
-Indien deze optie niet is aan gevinkt, kunnen kopers hun land in deze regio niet verkopen.
-Indien deze optie is aan gevinkt, kunnen kopers hun land in deze regio verkopen.
-
-Standaard: Niet toestaan
- </notification>
- <notification label="Scripts Uitschakelen" name="HelpRegionDisableScripts">
- Indien de sim prestaties slecht zijn, kan een script de oorzaak zijn. Open de Statistieken balk (Ctrl+Shift+1). Kijk naar de Simulator Fysieke FPS. Indien het lager is dan 45, open dan het Tijd paneel onderaan de Statistieken balk. Indien de Script Tijd 25 ms of hoger is, klik dan op de Top Scripts knop. U krijgt dan een naam en lokatie van scripts die mogelijk de slechte prestaties veroorzaken.
-
-Het aan vinken van Scripts Uitschakelen en vervolgens op de Toepassen knop drukken, zal tijdelijk alle scripts in deze regio uitschakelen. U zult dit mogelijk moeten doen om naar de lokatie te gaan van het &apos;top script&apos;. Eenmaal aangekomen, onderzoek dan of het script het probleem veroorzaakt. U zult mogelijk de eigenaar willen contacteren of het object willen retourneren c.q. verwijderen.
-Verwijder het vinkje van Scripts Uitschakelen en klik op Toepassen om scripts weer te reactiveren in de regio.
-
-Standaard: Uitgeschakeld
- </notification>
- <notification label="Botsingen Uitschakelen" name="HelpRegionDisableCollisions">
- Indien de sim prestaties slecht zijn, kunnen fysieke objecten de oorzaak zijn. Open de Statistieken balk (Ctrl+Shift+1). Kijk naar de Simulator Fysieke FPS. Indien het lager is dan 45, open dan het Tijd paneel onderaan de Statistieken balk. Indien de Sim Tijd (Fysiek) 20 ms of hoger is, klik dan op de Toon Top Botsingen knop. U krijgt dan een naam en lokatie van de fysieke objecten die mogelijk de slecht prestaties veroorzaken.
-
-Het aan vinken van de Botsingen Uitschakelen knop en vervolgens op de Toepassen knop drukken, zal tijdelijk object-object botsingen uitschakelen. U zult dit mogelijk moeten doen om naar de lokatie te gaan van de &apos;top botsingen&apos;. Eenmaal aangekomen, onderzoek dan het object. Botst het constant met andere objecten? U zult mogelijk de eigenaar willen contacteren of het object willen retourneren c.q. verwijderen.
-Verwijder het vinkje van Botsingen Uitschakelen en klik op Toepassen om botsingen weer te reactiveren in de regio.
-
-Standaard: Uitgeschakeld
- </notification>
- <notification label="Fysiek Uitschakelen" name="HelpRegionDisablePhysics">
- Fysiek Uitschakelen is gelijkwaardig aan Botsingen Uitschakelen, alleen alle fysieke simulatie is uitgeschakeld. Dit betekend dat niet alleen alle objecten zullen stoppen met botsen, maar ook dat avatars zich niet meer kunnen bewegen.
-
-Dit zou alleen gebruikt moeten worden als het uitschakelen van Botsingen niet genoeg prestatie winst geeft om een fysiek probleem of top botsingen te onderzoeken.
-
-Indien u klaar bent, wees er dan zeker van Fysiek weer in te schakelen, anders kunnen avatars zich niet meer bewegen.
-
-Standaard: Uitgeschakeld
- </notification>
- <notification label="Top Botsingen" name="HelpRegionTopColliders">
- Toon een lijst van objecten van het grootste aantal potentiële object-object botsingen.
-Deze objecten kunnen een trage prestatie veroorzaken. Selecteer Beeld &gt; Statistieken Balk en kijk onder Simulator &gt; Tijd &gt; Sim Tijd (Fysiek) om te zien of meer dan 20 ms wordt gespendeerd aan fysiek.
- </notification>
- <notification label="Top Scripts" name="HelpRegionTopScripts">
- Toon een lijst van objecten die de meeste tijd besteden aan het uitvoeren van LSL scripts.
-Deze objecten kunnen een trage prestatie veroorzaken. Selecteer Beeld &gt; Statistieken Balk en kijk onder Simulator &gt; Tijd &gt; Script Tijd om te zien of meer dan 25 ms wordt gespendeerd aan scripts.
- </notification>
- <notification label="Herstart Regio" name="HelpRegionRestart">
- Herstart het server proces van de regio na een twee minuten waarschuwing.
-Alle Inwoners van de regio zullen de verbinding kwijt raken. De regio zal alle gegevens bewaren en zou binnen 90 seconden weer operabel moeten zijn.
-
-De regio herstarten zou de meeste prestatie problemen moeten verhelpen en zou normaal gesproken alleen gebruikt moeten worden indien aangegeven.
- </notification>
- <notification label="Water Hoogte" name="HelpRegionWaterHeight">
- Dit is de hoogte in meters waarop het water verschijnt.
-Als deze instelling anders is dan 20 en u heeft water aan de rand van de wereld of u heeft &apos;ontbrekend&apos; water, zal er een gat zichtbaar zijn.
-
-Standaard: 20
- </notification>
- <notification label="Terrein Ophogen" name="HelpRegionTerrainRaise">
- Dit is de hoogte in meters dat perceel eigenaren hun terrein kunnen verhogen boven de standaard &apos;baked&apos; terrein hoogte.
-
-Standaard: 4
- </notification>
- <notification label="Terrein Verlagen" name="HelpRegionTerrainLower">
- Dit is de hoogte in meters dat perceel eigenaren hun terrein kunnen verlagen onder de standaard &apos;baked&apos; terrein hoogte.
-
-Standaard: -4
- </notification>
- <notification label="Upload RAW Terrein" name="HelpRegionUploadRaw">
- Deze knop upload een .RAW bestand naar de regio waar u zich bevindt.
-Het bestand moet de juiste afmetingen hebben (RGB, 256x256) en 13 kanalen.
-De beste manier om een terrein bestand te maken is het downloaden van een bestaand RAW bestand. Een goede eerste stap is om het rode kanaal (land hoogte) aan te passen en dat te uploaden.
-
-De upload kan tot 45 seconden in beslag nemen. Bedenk dat het uploaden van een terrein bestand de objecten reeds aanwezig op het land *niet* zal verplaatsen, alleen het terrein zelf en de permissies geassocieerd met de percelen. Dit kan resulteren in objecten die ondergronds gaan.
-
-Voor meer informatie over het wijzigen van de hoogte velden, raadpleeg F1 Help.
- </notification>
- <notification label="Download RAW Terrein" name="HelpRegionDownloadRaw">
- Deze knop download een bestand welke de hoogte veld gegevens, perceel afmetingen, perceel te koop status en sommige perceel permissies bevat voor deze regio.
-Indien u het bestand opent in een programma als Photoshop, moet u de document afmetingen opgeven, welk RGB, 256x256 met 13 kanalen is. Dit terrein bestand kan op geen enkele andere manier worden geopend.
-
-Voor meer informatie over het wijzigen van de hoogte velden, raadpleeg F1 Help.
- </notification>
- <notification label="Gebruik Estate Zon" name="HelpRegionUseEstateSun">
- Dit aan vinken zorgt er voor dat de zon positie overeen komt met de zon positie in de rest van het Estate.
-
-Standaard: Ingeschakeld
- </notification>
- <notification label="Vaste Zon" name="HelpRegionFixedSun">
- Dit aan vinken stelt de zon in op de positie van de Fase schuif knop en stopt het verder bewegen van de zon.
-
-Standaard: Uitgeschakeld
- </notification>
- <notification label="Bake Terrein" name="HelpRegionBakeTerrain">
- Deze knop slaat de huidige vorm van het terrein op als nieuwe standaard voor de regio. Eenmaal baked, kan het land terugkeren naar de opgeslagen vorm wanneer u of anderen gebruik maken van de Wijzig Terrein &apos;Terugkeer&apos; optie. Het baked terrein is ook het uitgangspunt voor de terrein verhogings- en verlagingslimieten.
- </notification>
- <notification label="Estate Beheerders" name="HelpEstateEstateManager">
- Een Estate Beheerder is een Inwoner aan wie u de controle over de regio en estate instellingen heeft uitbesteed. De Estate Beheerder kan de instellingen wijzigen in deze panels, behalve het uploaden, downloaden en terrein bakken. In bijzonder kunnen zij Inwoners toestaan of verbannen van het Estate.
-
-Estate Beheerders kunnen alleen toegevoegd of verwijderd worden door de eigenaar van het Estate, niet door elkaar. Gebruik alstublieft alleen Inwoners die u kunt vertrouwen als Estate Beheerders, omdat uiteindelijk u verantwoordelijk bent voor hun acties.
- </notification>
- <notification label="Gebruik Globale Tijd" name="HelpEstateUseGlobalTime">
- Dit aan vinken zorgt ervoor dat de zon in uw estate dezelfde positie volgt als in Linden-eigendom &apos;mainland&apos; Estates.
-
-Standaard: aan
- </notification>
- <notification label="Vaste Zon" name="HelpEstateFixedSun">
- Dit aan vinken stelt de zon in op de positie van de Fase schuif knop en stopt het verder bewegen van de zon.
- </notification>
- <notification label="Publieke Toegang" name="HelpEstateExternallyVisible">
- Dit aan vinken geeft aan dat Inwoners die in andere Estates zijn, deze Estate kunnen bezoeken zonder op de Toegangs lijst te staan.
-
-Standaard: Ingeschakeld
- </notification>
- <notification label="Direct Teleporteren Toestaan" name="HelpEstateAllowDirectTeleport">
- Indien aan gevinkt staat het Inwoners toe om direct te Teleporteren naar elke plek in uw Estate. Indien niet aan gevinkt kunnen Inwoners Teleporteren naar de dichtstbijzijnde telehub.
-
-Standaard: Uitgeschakeld
- </notification>
- <notification label="Toegang Toestaan" name="HelpEstateAllowResident">
- Toegang tot dit Estate zal gelimiteerd zijn tot Inwoners in deze lijst en onderstaande groepen. Deze instelling is allen beschikbaar indien Publieke Toegang niet is aan gevinkt.
- </notification>
- <notification label="Groeps Toegang Toestaan" name="HelpEstateAllowGroup">
- Toegang tot dit Estate zal gelimiteerd worden tot groepen in deze lijst en elke Inwoner bovenaan. Deze Instelling is alleen beschikbaar als Publieke Toegang niet is aan gevinkt.
- </notification>
- <notification label="Misbruik Email Adres" name="HelpEstateAbuseEmailAddress">
- Dit instellen met een geldig email adres zal misbruik rapporten op dit Estate doen versturen naar dat adres.
-Indien u het leeg laat, zullen misbruik rapporten alleen verzonden worden naar Linden Lab.
- </notification>
- <notification label="Toegang Weigeren" name="HelpEstateBanResident">
- Inwoners in deze lijst zijn de toegang geweigerd in uw Estate, ongeacht elke andere instelling.
- </notification>
- <notification label="Voice Chat Toestaan" name="HelpEstateVoiceChat">
- Percelen in dit Estate kunnen hun eigen Voice kanalen hebben waarin Inwoners die in de buurt van elkaar zijn, elkaar kunnen horen en met elkaar kunnen praten.
-
-Standaard: Uitgeschakeld
- </notification>
- <notification label="Voice Versie Ongelijkheid" name="VoiceVersionMismatch">
- Deze versie van [APP_NAME] is niet compatibel met de Voice spraak optie in deze regio. Om Voice Chat goed te laten functioneren, moet u [APP_NAME] bijwerken.
- </notification>
- <notification label="Estate Convenant" name="HelpEstateCovenant">
- Het instellen van een Estate Convenant maakt het u mogelijk om percelen in het Estate te verkopen. Indien de Convenant niet is ingesteld kunt u het niet verkopen. Een notitiekaart voor uw Convenant kan leeg zijn indien u geen regels wilt instellen, advies aan kopers wilt geven of iets anders in relatie tot het land wilt mededelen voor als men het koopt.
-
-Een Convenant kan gebruikt worden als u regels wilt mededelen, richtlijnen, culturele informatie of simpelweg uw eigen verwachtingen aan prospect kopers.
-Dit kan zoneren bevatten, bouw reglementen, betaal opties of elke andere vorm van informatie waarvan u het belangrijk vind dat de nieuwe eigenaar het heeft gezien en mee akkoord is gegaan alvorens het te kopen.
-
-De koper moet instemmen met de Convenant middels het aan vinken van het kadertje alvorens zij de aankoop af kunnen ronden. Estate Overeenkomsten zijn altijd zichtbaar in het Over Land dialoog venster voor elk perceel dat er eentje ingesteld heeft staan.
- </notification>
- <notification label="Kan Geen Objecten Kopen" name="BuyObjectOneOwner">
- Kan geen objecten van verschillende eigenaren tegelijk kopen.
-
-Kies alstublieft slechts één object en probeer het opnieuw.
- </notification>
- <notification label="Kan Inhoud Niet Kopen" name="BuyContentsOneOnly">
- Kan geen inhoud kopen van meer dan één object tegelijk.
-
-Kies alstublieft slechts één object en probeer het opnieuw.
- </notification>
- <notification label="Kan Inhoud Niet Kopen" name="BuyContentsOneOwner">
- Kan geen inhoud kopen van verschillende eigenaren tegelijk.
-
-Kies alstublieft slechts één object en probeer het opnieuw.
- </notification>
- <notification name="BuyOriginal">
- Koop originele object van [OWNER] voor L$[PRICE]?
-U zult de eigenaar worden van dit object.
-U kunt het dan:
- Wijzigen: [MODIFYPERM]
- Kopiëren: [COPYPERM]
- Verkopen of Weggeven: [RESELLPERM]
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="BuyOriginalNoOwner">
- Koop originele object voor L$[PRICE]?
-U zult de eigenaar worden van dit object.
-U kunt het dan:
- Wijzigen: [MODIFYPERM]
- Kopiëren: [COPYPERM]
- Verkopen of Weggeven: [RESELLPERM]
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="BuyCopy">
- Koop een kopie van [OWNER] voor L$[PRICE]?
-Het object zal gekopieerd worden naar uw inventaris.
-U kunt het dan:
- Wijzigen: [MODIFYPERM]
- Kopiëren: [COPYPERM]
- Verkopen of Weggeven: [RESELLPERM]
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="BuyCopyNoOwner">
- Koop een kopie voor L$[PRICE]?
-Het object zal gekopieerd worden naar uw inventaris.
-U kunt het dan:
- Wijzigen: [MODIFYPERM]
- Kopiëren: [COPYPERM]
- Verkopen of Weggeven: [RESELLPERM]
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="BuyContents">
- Koop de inhoud van [OWNER] voor L$[PRICE]?
-De inhoud zal naar uw inventaris gekopieerd worden.
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="BuyContentsNoOwner">
- Koop de inhoud voor L$[PRICE]?
-De inhoud zal naar uw inventaris gekopieerd worden.
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="ConfirmPurchase">
- Deze transactie zal:
-[ACTION]
-
-Weet u zeker dat u verder wilt gaan met deze aankoop?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="ConfirmPurchasePassword">
- Deze transactie zal:
-[ACTION]
-
-Weet u zeker dat u verder wilt gaan met deze aankoop?
-Voer alstublieft opnieuw uw wachtwoord in en klik op OK.
- <form name="form">
- <input name="message"/>
- <button name="ConfirmPurchase" text="OK"/>
- <button name="Cancel" text="Annuleren"/>
- </form>
- </notification>
- <notification name="SetPickLocation">
- Opmerking:
-
-U heeft de locatie van deze Favoriet bijgewerkt, maar andere details blijven ongewijzigd.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="MoveInventoryFromObject">
- U heeft &apos;niet kopieerbare&apos; items geselecteerd.
-Deze items zullen worden verplaatst naar uw inventaris, niet gekopieerd.
-
-Verplaats de inventaris item(s)?
- <usetemplate ignoretext="Wanneer niet kopieerbare inventaris uit objecten verplaatst wordt" name="okcancelignore" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="MoveInventoryFromScriptedObject">
- U heeft &apos;niet kopieerbare&apos; inventaris items geselecteerd.
-Deze items zullen verplaatst worden naar uw inventaris, niet gekopieerd.
-Omdat deze objecten scripts bevatten, kan het verplaatsen naar uw inventaris er voor zorgen dat het object niet meer werkt.
-inventaris item(s) verplaatsen?
- <usetemplate ignoretext="Indien verplaatsen &apos;niet kopieerbare&apos; inventaris van gescripte objecten" name="okcancelignore" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="ClickActionNotPayable">
- Waarschuwing: Het &apos;Betaal object&apos; aan klik actie is ingesteld, maar het zal alleen werken als er een script is toegevoegd met een money() event.
- <form name="form">
- <ignore name="ignore" text="Indien instellen &apos;Betaal&apos; op objecten zonder money() events"/>
- </form>
- </notification>
- <notification name="OpenObjectCannotCopy">
- Er zitten geen items in dit object die u kunt kopiëren.
- </notification>
- <notification name="WebLaunchAccountHistory">
- Naar de [SECOND_LIFE] web site gaan om uw account geschiedenis te bekijken?
- <usetemplate ignoretext="Bij laden van de account geschiedenis webpagina" name="okcancelignore" notext="Annuleren" yestext="Ga naar pagina"/>
- </notification>
- <notification name="ClickOpenF1Help">
- De [SECOND_LIFE] Support Web site bezoeken?
- <usetemplate ignoretext="Bij bezoeken van de [SECOND_LIFE] Support Website." name="okcancelignore" notext="Annuleren" yestext="Ga"/>
- </notification>
- <notification name="ConfirmQuit">
- Weet u zeker dat u wilt afsluiten?
- <usetemplate ignoretext="Bij afsluiten [APP_NAME]." name="okcancelignore" notext="Doorgaan" yestext="Afsluiten"/>
- </notification>
- <notification name="HelpReportAbuseEmailLL">
- Gebruik dit gereedschap om overtredingen van de Voorwaarden voor Service (Terms of Service) en Gemeenschaps Standaarden (Community Standards)te rapporteren. Zie:
-
-http://secondlife.com/corporate/tos.php
-http://secondlife.com/corporate/cs.php
-
-Alle gerapporteerde misbruiken van de Voorwaarden voor Service en Gemeenschaps Standaarden zullen worden onderzocht en opgelost. U kunt de incident oplossing in de Incidenten Rapportage zien op:
-
-http://secondlife.com/support/incidentreport.php
- </notification>
- <notification name="HelpReportAbuseEmailEO">
- BELANGRIJK: Dit rapport zal naar de eigenaar van deze regio gaan en niet naar Linden Lab!
-
-Als een service aan Inwoners en bezoekers heeft de eigenaar van deze regio er voor gekozen om rapporten vanuit deze regio zelf te ontvangen en af te handelen. Linden Lab zal geen onderzoek doen naar rapporten die u indient vanaf deze locatie.
-
-De regio eigenaar zal de rapporten afhandelen op basis van de regels geldend voor deze regio zoals weergegeven in het Estate Convenant (Bekijk Convenants door naar Wereld te gaan in het menu en te kiezen voor Over Land).
-
-De afhandeling van dit rapport is alleen van toepassing op deze regio.
-Toegang van Inwoners tot andere gebieden van [SECOND_LIFE] zullen niet beïnvloed worden door de uitkomst van dit rapport. Alleen Linden Lab kan de toegang tot geheel [SECOND_LIFE] beperken.
- </notification>
- <notification name="HelpReportAbuseSelectCategory">
- Selecteer alstublieft een categorie voor dit misbruik rapport.
-
-Het selecteren van een categorie helpt ons met het archiveren en verwerken van misbruik rapporten.
- </notification>
- <notification name="HelpReportAbuseAbuserNameEmpty">
- Geef alstublieft een naam op van de misbruiker.
-
-Een accurate waarde opgeven helpt ons met het archiveren en verwerken van misbruik rapporten.
- </notification>
- <notification name="HelpReportAbuseAbuserLocationEmpty">
- Geef alstublieft een locatie op waar het misbruik plaats vond.
-
-Een accurate waarde opgeven helpt ons met het archiveren en verwerken van misbruik rapporten.
- </notification>
- <notification name="HelpReportAbuseSummaryEmpty">
- Geef alstublieft een korte samenvatting op van het misbruik dat plaats vond.
-
-Een accurate waarde opgeven helpt ons met het archiveren en verwerken van misbruik rapporten.
- </notification>
- <notification name="HelpReportAbuseDetailsEmpty">
- Geef alstublieft een gedetailleerde omschrijving van het misbruik dat plaats vond.
-
-Wees zo specifiek als mogelijk, inclusief namen en details van het incident waarover u rapporteert.
-
-Het opgeven van een accurate omschrijving helpt ons met het archiveren en verwerken van misbruik rapporten.
- </notification>
- <notification name="HelpReportAbuseContainsCopyright">
- Beste Inwoner,
-
-Het lijkt er op dat u intellectueel eigendoms misbruik rapporteert. Wees er alstublieft van overtuigd dat u dit correct rapporteert:
-
-(1) Het Misbruik Proces. U kunt een misbruik rapport indienen als u er van overtuigd bent dat een Inwoner het [SECOND_LIFE] permissie systeem uitbuit, bijvoorbeeld door gebruik van CopyBot of soortgelijke gereedschappen, daarmee de intellectuele eigendoms rechten overtredend. Het Abuse Team onderzoekt en zal passende maatregelen uitvaardigen tegen gedrag dat de [SECOND_LIFE] Gemeenschaps Standaarden overtreedt. Echter, het Abuse Team zal geen actie ondernemen en niet reageren op verzoeken om inhoud te verwijderen uit de [SECOND_LIFE] wereld.
-
-(2) Het DMCA of Inhoud Verwijder Proces. Voor een verzoek tot verwijdering van inhoud in [SECOND_LIFE], MOET u een geldige berichtgeving van misbruik indienen zoals voorzien in onze DMCA beleid op http://secondlife.com/corporate/dmca.php.
-
-Indien u nog steeds door wilt gaan met het misbruik proces, sluit dan alstublieft dit venster en maak het indienen van uw rapport af. U zult mogelijk een specifieke catagorie moeten kiezen &apos;CopyBot of Permissie Uitbuiting&apos;.
-
-Dank U,
-Linden Lab
- </notification>
- <notification name="FailedRequirementsCheck">
- De volgende vereiste componenten ontbreken van [FLOATER]:
-[COMPONENTS]
- </notification>
- <notification label="Vervang Bestaande Bevestiging" name="ReplaceAttachment">
- Er is al een object bevestigd op dit punt aan uw lichaam.
-Wilt u dit vervangen met het geselecteerde object?
- <form name="form">
- <ignore name="ignore" save_option="true" text="Bij vervangen van bestaande bevestigingen"/>
- <button name="Yes" text="OK"/>
- <button name="No" text="Annuleren"/>
- </form>
- </notification>
- <notification label="Niet Storen Modus Waarschuwing" name="BusyModePay">
- U bevind zich in Niet Storen Modus, hetgeen inhoudt dat u geen enkele items kunt ontvangen voor deze betaling.
-
-Wilt u de Niet Storen Modus verlaten voordat u deze transactie completeert?
- <form name="form">
- <ignore name="ignore" save_option="true" text="Bij betalen van een persoon of object in Niet Storen modus"/>
- <button name="Yes" text="OK"/>
- <button name="No" text="Annuleren"/>
- </form>
- </notification>
- <notification name="ConfirmEmptyTrash">
- Weet u zeker dat u de inhoud van uw vuilnisbak map permanent wilt verwijderen?
- <usetemplate ignoretext="Bij verwijderen van de inhoud uit de inventaris vuilnisbak map" name="okcancelignore" notext="Annuleren" yestext="OK"/>
- </notification>
- <notification name="ConfirmClearBrowserCache">
- Weet u zeker dat u uw browsercache wilt legen?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="Ja"/>
- </notification>
- <notification name="ConfirmClearCookies">
- Weet u zeker dat u al uw cookies wilt verwijderen?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="Ja"/>
- </notification>
- <notification name="ConfirmClearMediaUrlList">
- Weet u zeker dat u uw lijst met al de opgeslagen URL&apos;s wilt verwijderen?
- <usetemplate name="okcancelbuttons" notext="Annuleren" yestext="Ja"/>
- </notification>
- <notification name="ConfirmEmptyLostAndFound">
- Weet u zeker dat u de inhoud van de Verloren en Gevonden map permanent wilt verwijderen?
- <usetemplate ignoretext="Bij legen van uw inventaris Verloren en Gevonden map" name="okcancelignore" notext="Nee" yestext="Ja"/>
- </notification>
- <notification name="CopySLURL">
- De volgende SLurl is gekopieerd naar uw klem bord:
-[SLURL]
-
-Plaats het in een web pagina om anderen eenvoudig toegang te verschaffen naar de locatie of test het zelf door het te plakken in de adres balk van uw web browser.
- <form name="form">
- <ignore name="ignore" text="Bij kopiëren van een SLurl naar het klem bord"/>
- </form>
- </notification>
- <notification name="GraphicsPreferencesHelp">
- Dit venster bepaald de venster afmetingen, resolutie en kwaliteit van de client&apos;s grafische weergave. De Voorkeuren &gt; Grafische interface laat u kiezen uit vier grafische niveaus: Laag, Middel, Hoog en Ultra. U kunt ook uw grafische instellingen aanpassen met het aan vinken van het Aangepast vakje en de volgende instellingen manipuleren:
-
-Shaders: In of uitschakelen van de verschillende typen pixel shaders.
-
-Reflectiedetail: Stelt het type objecten in hetgeen water kan reflecteren.
-
-Avatarweergave: Stelt de opties in die van invloed zijn op hoe de client een avatar zal renderen.
-
-Zichtbereik: Beïnvloed tot hoe ver objecten vanaf uw zichtpunt worden weergegeven in de scène.
-
-Maximaal Aantal Particles: Stelt het maximaal aantal particles in die u tegelijk kunt zien op uw scherm.
-
-Nabewerkingskwaliteit: Stelt de resolutie in waarmee Gloei wordt weergegeven.
-
-Maasdetail: Stelt de hoeveelheid detail of het aantal driehoeken in gebruikt voor de weergave van bepaalde objecten. Een hogere waarde zal langer nemen om weer te gegeven, maar zorgen voor objecten met meer detail.
-
-Lichtdetail: Bepaald welke typen lichten u wenst weer te geven.
-
-Terreindetail: Stelt de hoeveelheid detail in die u wilt zien voor het terrein textuur.
- </notification>
- <notification name="WLSavePresetAlert">
- Wilt u de opgeslagen voor instellingen overschrijven?
- <usetemplate name="okcancelbuttons" notext="Nee" yestext="Ja"/>
- </notification>
- <notification name="WLDeletePresetAlert">
- Wilt u [SKY] verwijderen?
- <usetemplate name="okcancelbuttons" notext="Nee" yestext="Ja"/>
- </notification>
- <notification name="WLNoEditDefault">
- U kunt de standaard instellingen niet wijzigen of verwijderen.
- </notification>
- <notification name="WLMissingSky">
- Dit dag cyclus bestand heeft een ontbrekend lucht bestand: [SKY].
- </notification>
- <notification name="PPSaveEffectAlert">
- Voorbewerkingeffecten bestaan. Wilt u ze alsnog overschrijven?
- <usetemplate name="okcancelbuttons" notext="Nee" yestext="Ja"/>
- </notification>
- <notification name="HelpEditSky">
- Wijzig de WindLight schuif knoppen en maak en sla een set van luchten op.
- </notification>
- <notification name="HelpEditDayCycle">
- Bepaald de luchten te gebruiken gedurende de dag.
- </notification>
- <notification name="EnvSettingsHelpButton">
- Deze instelling bepalen hoe de omgeving er uit ziet op uw computer. Uw grafische kaart zal grafische shaders moeten ondersteunen om toegang te krijgen tot alle instellingen.
-
-Wijzig de &quot;Tijd van de Dag&quot; schuif knop om de fase van de dag lokaal in de viewer aan te passen.
-
-Wijzig de &quot;Wolken Dichtheid&quot; schuif knop om de hoeveelheid wolken die de lucht bedekken in te stellen.
-
-Kies een kleur in de &quot;Water Kleur&quot; kleuren kiezer om de kleur van het water aan te passen.
-
-Wijzig de &quot;Water Mist&quot; schuif knop om de dichtheid van de mist onder water in te stellen.
-
-Klik op &quot;Gebruik Estate Tijd&quot; om de tijd van de dag te herstellen naar de huidige tijd en die te volgen.
-
-Klik op &quot;Geavanceerde Lucht&quot; om de editor op te roepen voor geavanceerde instellingen voor de lucht.
-
-Klik op &quot;Geavanceerd Water&quot; om de editor op te roepen voor geavanceerde instellingen voor water.
- </notification>
- <notification name="HelpDayCycle">
- De Dag Cyclus Editor geeft u controle over de lucht gedurende de [SECOND_LIFE]&apos;s dag/nacht cyclus. Dit is de cyclus die gebruikt wordt in de Basis Omgeving Editor&apos;s Tijd van de Dag schuif knop.
-
-De Dag Cyclus Editor werkt beter met het instellen van gemarkeerde frames. Dit zijn nodes (weergegeven als grijze blips in de tijd weergave) die Hemel voorinstelling met zich geassocieerd hebben. Als de Tijd van de Dag voortschrijdt, &quot;animeert&quot; de WindLight Hemel als het interpoleert tussen de gemarkeerde frames.
-
-De gele pijlen boven de tijdlijn representeert uw huidige zicht, gebaseerd op de Tijd van de Dag. Klik en sleep deze om te zien hoe uw dag zal animeren. U kunt gemarkeerde frames toe voegen of verwijderen middels het indrukken van de Frame Toevoegen of Frame Verwijderen knoppen, rechts van de tijdlijn.
-
-U kunt de tijds positie van een gemarkeerd frame instellen door het te slepen over de tijdlijn of middels het handmatig invullen van de Gemarkeerde Frame Instellingen. Binnen de Gemarkeerde Frame Instellingen krijgt u de mogelijkheid het gemarkeerde frame te associëren met de respectievelijke WindLight voorinstelling.
-
-De lengte van de Cyclus bepaald de totale tijdsduur van een &quot;dag&quot;. Stelt u dit in op een lage waarde (bijv. twee minuten) betekend dat uw volledig 24 uurs tijdlijn zal animeren in slechts twee minuten! Als u tevreden bent met uw tijdlijn en gemarkeerde frame cyclus, gebruik dan de Start en Stop knoppen om het resultaat voor te beschouwen. Onthoud dat u ook de gele tijd indicator pijl boven de tijdlijn kunt bewegen om de animatie cyclus interactief te bekijken. Het gebruik van de Estate Tijd knop zal de lengte en tijd van uw dag synchroniseren met de Estate&apos;s dag cyclus.
-
-Als u tevreden bent met uw Dag Cyclus, kunt het opslaan en laden met de Test Dag Opslaan en Laad Test Dag knoppen. Merk op, dat wij momenteel slechts één Dag Cyclus toestaan.
- </notification>
- <notification name="HelpBlueHorizon">
- Gebruik de Rood/Groen/Blauw schuif knoppen om de kleur van de hemel aan te passen. U kunt de Intensiteit (I) schuif knop gebruiken om alle drie de schuif knoppen tegelijk te bewegen.
- </notification>
- <notification name="HelpHazeHorizon">
- Nevel Horizon is één van de meest handige parameters voor de algehele belichting in de scène. Het is effectief om de vele belichting instellingen te simuleren, zoals wit-vlakken van de zon en donkere gesloten iris instellingen.
- </notification>
- <notification name="HelpBlueDensity">
- Blauw Dichtheid beïnvloed de algehele kleur verzadiging van de hemel en mist. Indien u de Intensiteit (I) schuif knop naar rechts schuift, zullen de kleuren lichter en sprekender worden. Indien u het geheel naar links schuift, worden de kleuren doffer, uiteindelijk vervagend naar zwart en wit. Als u de hemel kleur nauwkeurig wilt uitbalanceren, kunt u de individuele elementen van verzadiging instellen door gebruik van de Rood/Groen/Blauw (RGB) schuif knoppen.
- </notification>
- <notification name="HelpHazeDensity">
- Nevel Dichtheid bepaald de hoeveelheid dofheid, grijze nevel in de atmosfeer. Het is effectief om scènes met veel rook of zelf gemaakte vervuiling te simuleren. Het is ook effectief voor het simuleren van nevel en mist.
- </notification>
- <notification name="HelpDensityMult">
- De Dichtheid Vermeerderaar kan gebruikt worden om de algehele dichtheid van de atmosfeer te beïnvloeden.
-Bij lagere instelling creëert het een gevoel van &quot;dunne lucht&quot; en met hogere instellingen een dik zwaar smog effect.
- </notification>
- <notification name="HelpDistanceMult">
- Stelt de WindLight&apos;s waargenomen afstand in. Een waarde van nul stopt de invloed van WindLight op terrein en objecten. Waarden groter dan 1 simuleren grotere afstanden voor dikkere atmosferische effecten.
- </notification>
- <notification name="HelpMaxAltitude">
- Maximale Hoogte bepaald de hoogte calculaties die WindLight uitvoert bij het berekenen van de atmosferische belichting. Later op de dag is het handig om de &quot;diepte&quot; van de zonsondergang weergave in te stellen.
- </notification>
- <notification name="HelpSunlightColor">
- Stelt de kleur en intensiteit in van direct licht in de scène.
- </notification>
- <notification name="HelpSunAmbient">
- Stelt de kleur en intensiteit in van het omgevings atmosferische licht in de scène.
- </notification>
- <notification name="HelpSunGlow">
- De Afmeting schuif knop stelt de afmeting van de zon in.
-De Focus schuif knop bepaald de wazigheid van de zon aan de hemel.
- </notification>
- <notification name="HelpSceneGamma">
- Wijzigt de verdeling van licht op het scherm in licht of donker.
- </notification>
- <notification name="HelpStarBrightness">
- Wijzigt de helderheid van sterren aan de hemel.
- </notification>
- <notification name="HelpTimeOfDay">
- Bepaald de locatie van de zon aan de hemel.
-Gelijkwaardig aan elevatie.
- </notification>
- <notification name="HelpEastAngle">
- Bepaald de locatie van de zon aan de hemel.
-Gelijkwaardig aan azimut.
- </notification>
- <notification name="HelpCloudColor">
- Wijzigt de kleur van de wolken. Het is algemeen aanbevolen deze wit-achtig te houden, maar hé, heb plezier als u dit wilt.
- </notification>
- <notification name="HelpCloudDetail">
- Bepaald het detail plaatje als laag bovenop het basis wolken plaatje. X en Y bepalen de positie. D (Dichtheid) bepaald hoe wollig of verspreid de wolken verschijnen.
- </notification>
- <notification name="HelpCloudDensity">
- Geeft u de mogelijkheid de positie van wolken met de X en Y schuif knoppen in te stellen en hoe dicht ze zijn met de D schuif knop.
- </notification>
- <notification name="HelpCloudCoverage">
- Bepaald hoeveel de wolken de hemel bedekken.
- </notification>
- <notification name="HelpCloudScale">
- Bepaald de schaal van het wolken plaatje op de hemelboog.
- </notification>
- <notification name="HelpCloudScrollX">
- Bepaald de snelheid van de wolken terwijl zij in X richting bewegen.
- </notification>
- <notification name="HelpCloudScrollY">
- Bepaald de snelheid van de wolken terwijl zij in Y richting bewegen.
- </notification>
- <notification name="HelpClassicClouds">
- Vink dit aan voor weergave van [SECOND_LIFE]&apos;s oudere klassieke wolken als toevoeging op WindLight&apos;s wolken.
- </notification>
- <notification name="HelpWaterFogColor">
- Kiest de kleur van de onder water nevel.
- </notification>
- <notification name="HelpWaterFogDensity">
- Bepaald hoe dicht de water nevel is en hoe ver u kunt zien onder water.
- </notification>
- <notification name="HelpUnderWaterFogMod">
- Past het effect aan van de Nevel Dichtheid Exponent om zo te bepalen hoe ver uw avatar onder water kan zien.
- </notification>
- <notification name="HelpWaterGlow">
- Bepaald hoeveel het oppervlak van het water gloeit.
- </notification>
- <notification name="HelpWaterNormalScale">
- Bepaald de schaling van de drie wavelets (golf patronen) die samen water vormen.
- </notification>
- <notification name="HelpWaterFresnelScale">
- Bepaald hoeveel licht er wordt gereflecteerd onder verschillende hoeken.
- </notification>
- <notification name="HelpWaterFresnelOffset">
- Bepaald de hoeveelheid licht intensiteit welke wordt gereflecteerd.
- </notification>
- <notification name="HelpWaterScaleAbove">
- Bepaald hoeveel licht er wordt weerkaatst wanneer van bovenop het water oppervlak gezien.
- </notification>
- <notification name="HelpWaterScaleBelow">
- Bepaald hoeveel licht er wordt weerkaatst wanneer van onder het water oppervlak gezien.
- </notification>
- <notification name="HelpWaterBlurMultiplier">
- Bepaald hoe golven en reflectie worden ge mixed.
- </notification>
- <notification name="HelpWaterNormalMap">
- Bepaald welke Normaal map gelaagd is over het water om de reflectie/weerkaatsing te bepalen.
- </notification>
- <notification name="HelpWaterWave1">
- Bepaald waar en hoe snel de grote schaal versie van de Normaal map beweegt in X en Y richting.
- </notification>
- <notification name="HelpWaterWave2">
- Bepaald waar en hoe snel de kleine schaal versie van de Normaal map beweegt in X en Y richting.
- </notification>
- <notification name="NewSkyPreset">
- Geef een naam op voor de nieuwe lucht.
- <form name="form">
- <input name="message">
- Nieuwe Voorinstelling
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Annuleren"/>
- </form>
- </notification>
- <notification name="ExistsSkyPresetAlert">
- Voorinstelling bestaat al!
- </notification>
- <notification name="NewWaterPreset">
- Geef een naam voor de nieuwe voorinstelling van water.
- <form name="form">
- <input name="message">
- Nieuwe Voorinstelling
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Annuleren"/>
- </form>
- </notification>
- <notification name="ExistsWaterPresetAlert">
- Voorinstelling bestaat al!
- </notification>
- <notification name="WaterNoEditDefault">
- u kunt de standaard voorinstelling niet wijzigen of verwijderen.
- </notification>
- <notification name="ChatterBoxSessionStartError">
- Kan geen nieuwe chat sessie starten met [RECIPIENT].
-[REASON]
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="ChatterBoxSessionEventError">
- [EVENT]
-[REASON]
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="ForceCloseChatterBoxSession">
- Uw chat sessie met [NAME] zal moeten worden gesloten.
-[REASON]
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="Cannot_Purchase_an_Attachment">
- Items kunnen niet worden gekocht indien ze deel uit maken van een Bevestiging.
- </notification>
- <notification label="Over verzoeken voor debet permissies" name="DebitPermissionDetails">
- Toestemming geven aan dit script geeft het object een onbeperkte permissie om Linden dollars (L$) uit uw account te nemen!
-Om dit recht in te trekken, moet de object eigenaar het object verwijderen of de scripts in het object opnieuw instellen.
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="AutoWearNewClothing">
- Wilt u de kleding items die u maakt automatisch aantrekken?
- <usetemplate ignoretext="Automatisch nieuwe kleding aantrekken" name="okcancelignore" notext="Nee" yestext="Ja"/>
- </notification>
- <notification name="NotAgeVerified">
- U moet leeftijd geverifieerd zijn om toegang te verkrijgen tot dit perceel.
-Wilt u de [SECOND_LIFE] website bezoeken om uw leeftijd te verifiëren?
-
-[_URL]
- <url name="url" option="0">
- https://secondlife.com/account/verification.php
- </url>
- <usetemplate ignoretext="Waarschuw voor gebrek aan leeftijd verificatie" name="okcancelignore" notext="Nee" yestext="Ja"/>
- </notification>
- <notification name="Cannot enter parcel: no payment info on file">
- Dit perceel verlangd dat u betaal informatie geregistreerd hebt staan alvorens toegang te verkrijgen.
-Wilt u de [SECOND_LIFE] website bezoeken om dit in te stellen?
-
-[_URL]
- <url name="url" option="0">
- https://secondlife.com/account/index.php?lang=nl
- </url>
- <usetemplate ignoretext="Waarschuw voor gebrek aan betaal informatie" name="okcancelignore" notext="Nee" yestext="Ja"/>
- </notification>
- <notification name="MissingString">
- De tekst [STRING_NAME] ontbreekt in strings.xml
- </notification>
- <notification name="SystemMessageTip">
- [MESSAGE]
- </notification>
- <notification name="Cancelled">
- Geannuleerd
- </notification>
- <notification name="CancelledSit">
- Zitten geannuleerd
- </notification>
- <notification name="CancelledAttach">
- Bevestigen geannuleerd
- </notification>
- <notification name="ReplacedMissingWearable">
- Missend kleding/lichaamsdeel is vervangen door standaard.
- </notification>
- <notification name="GroupNotice">
- Onderwerp: [SUBJECT], Bericht: [MESSAGE]
- </notification>
- <notification name="FriendOnline">
- [NAME] is Online
- </notification>
- <notification name="FriendOffline">
- [NAME] is Offline
- </notification>
- <notification name="AddSelfFriend">
- U kunt uzelf niet als vriend toevoegen.
- </notification>
- <notification name="UploadingAuctionSnapshot">
- In-wereld en website foto&apos;s worden geüpload...
-(Duurt ongeveer 5 minuten.)
- </notification>
- <notification name="UploadPayment">
- U heeft L$[AMOUNT] betaald om te uploaden.
- </notification>
- <notification name="UploadWebSnapshotDone">
- Upload van website foto is gereed.
- </notification>
- <notification name="UploadSnapshotDone">
- Upload van in-wereld foto is gereed.
- </notification>
- <notification name="TerrainDownloaded">
- Terrain.raw gedownload
- </notification>
- <notification name="GestureMissing">
- Gebaar [NAME] mist in de database.
- </notification>
- <notification name="UnableToLoadGesture">
- Kan gebaar [NAME] niet laden. Probeer het a.u.b. opnieuw.
- </notification>
- <notification name="LandmarkMissing">
- Landmarkering mist in de database.
- </notification>
- <notification name="UnableToLoadLandmark">
- Kan landmarkering niet laden. Probeer het a.u.b. opnieuw.
- </notification>
- <notification name="CapsKeyOn">
- Uw Caps Lock toets staat aan. Aangezien dit effect heeft op het wachtwoord dat u intypt, zult u het wellicht willen uitzetten.
- </notification>
- <notification name="NotecardMissing">
- Notitiekaart mist in de database.
- </notification>
- <notification name="NotecardNoPermissions">
- Onvoldoende permissies om de notitiekaart te bekijken.
- </notification>
- <notification name="RezItemNoPermissions">
- Onvoldoende permissies om het object te rezzen.
- </notification>
- <notification name="UnableToLoadNotecard">
- Kan op dit moment notitiekaart inhoud niet laden.
- </notification>
- <notification name="ScriptMissing">
- Script mist in de database.
- </notification>
- <notification name="ScriptNoPermissions">
- Onvoldoende permissies om het script te bekijken.
- </notification>
- <notification name="UnableToLoadScript">
- Kan script niet laden. Probeer het a.u.b. opnieuw.
- </notification>
- <notification name="IncompleteInventory">
- De complete inhoud die u aanbiedt is nog niet lokaal beschikbaar. Probeer die items over een minuut nogmaals aan te bieden.
- </notification>
- <notification name="CannotModifyProtectedCategories">
- U kunt geen beschermde categorieën wijzigen.
- </notification>
- <notification name="CannotRemoveProtectedCategories">
- U kunt geen beschermde categorieën verwijderen.
- </notification>
- <notification name="UnableToBuyWhileDownloading">
- Niet mogelijk te kopen terwijl objectdata wordt gedownload. Probeer het alstublieft opnieuw.
- </notification>
- <notification name="UnableToLinkWhileDownloading">
- Niet mogelijk om te koppelen terwijl objectdata wordt gedownload. Probeer het alstublieft opnieuw.
- </notification>
- <notification name="CannotBuyObjectsFromDifferentOwners">
- Kan geen objecten van meerdere eigenaren op hetzelfde moment kopen. Selecteer alstublieft een enkel object.
- </notification>
- <notification name="ObjectNotForSale">
- Object lijkt niet te koop.
- </notification>
- <notification name="EnteringGodMode">
- God modus binnengaan, niveau [LEVEL]
- </notification>
- <notification name="LeavingGodMode">
- God modus verlaten, niveau [LEVEL]
- </notification>
- <notification name="CopyFailed">
- Kopiëren mislukt omdat u geen kopieerpermissie bezit.
- </notification>
- <notification name="InventoryAccepted">
- [NAME] heeft uw inventarisaanbod geaccepteerd.
- </notification>
- <notification name="InventoryDeclined">
- [NAME] heeft uw inventarisaanbod afgewezen.
- </notification>
- <notification name="ObjectMessage">
- [NAME]: [MESSAGE]
- </notification>
- <notification name="CallingCardAccepted">
- Uw visitekaartje is geaccepteerd.
- </notification>
- <notification name="CallingCardDeclined">
- Uw visite kaart is afgewezen.
- </notification>
- <notification name="TeleportToLandmark">
- Nu u het mainland bereikt heeft, kunt u teleporteren naar locaties als &apos;[NAME]&apos; door op de Inventaris knop rechtsonder in uw scherm te klikken en dan de Landmarkeringen map te selecteren. Dubbelklik op de landmarkering en klik op Teleport om ernaartoe te reizen.
- </notification>
- <notification name="TeleportToPerson">
- Nu u het mainland bereikt heeft, kunt u contact opnemen met inwoners als &apos;[NAME]&apos; door op de Inventaris knop rechtsonder in uw scherm te klikken en dan de Visitekaartjes map te selecteren. Dubbelklik op het visitekaartje, klik op Instant Message en type een bericht.
- </notification>
- <notification name="CantSelectLandFromMultipleRegions">
- Kan geen land selecteren over servergrenzen.
-Probeer een kleiner stuk land te selecteren.
- </notification>
- <notification name="SearchWordBanned">
- Sommige termen in uw zoekopdracht werden uitgesloten vanwege inhoudbeperkingen zoals beschreven in de Gemeenschap Standaarden.
- </notification>
- <notification name="NoContentToSearch">
- Selecteer alstublieft minstens een type inhoud om te zoeken (PG, Mature of Adult).
- </notification>
- <notification name="GroupVote">
- [NAME] heeft voorgesteld om te stemmen over:
-[MESSAGE]
- <form name="form">
- <button name="VoteNow" text="Stem Nu"/>
- <button name="Later" text="Later"/>
- </form>
- </notification>
- <notification name="SystemMessage">
- [MESSAGE]
- </notification>
- <notification name="EventNotification">
- Evenement Bericht:
-
-[NAME]
-[DATE]
- <form name="form">
- <button name="Details" text="Omschrijving"/>
- <button name="Cancel" text="Annuleren"/>
- </form>
- </notification>
- <notification name="TransferObjectsHighlighted">
- Alle objecten op dit perceel die zullen worden overgedragen aan de koper van dit perceel zijn nu opgelicht.
-
-* Bomen en grassen die worden overgedragen zijn niet opgelicht.
- <form name="form">
- <button name="Done" text="Gereed"/>
- </form>
- </notification>
- <notification name="DeactivatedGesturesTrigger">
- Deactiveren van gebaren met dezelfde trigger:
-[NAMES]
- </notification>
- <notification name="NoQuickTime">
- De QuickTime software van Apple schijnt niet op uw systeem geïnstalleerd te zijn.
-Indien u streaming media wilt zien op percelen die dit ondersteunen, dient u naar de QuickTime webpagina te gaan (http://www.apple.com/QuickTime) en de QuickTime Player te installeren.
- </notification>
- <notification name="OwnedObjectsReturned">
- De objecten die uw eigendom zijn op het geselecteerde perceel zijn geretourneerd naar uw inventaris.
- </notification>
- <notification name="OtherObjectsReturned">
- De objecten op het geselecteerde perceel dat het eigendom is van [NAME], zijn geretourneerd naar zijn of haar inventaris.
- </notification>
- <notification name="OtherObjectsReturned2">
- De objecten op het geselecteerde perceel dat het eigendom is van inwoner &apos;[NAME]&apos;, zijn geretourneerd naar hun eigenaar.
- </notification>
- <notification name="GroupObjectsReturned">
- De objecten op het geselecteerde perceel dat gedeeld is met de groep [GROUPNAME] zijn geretourneerd naar de inventaris van hun eigenaar.
-Overdraagbare objecten die eigendom zijn van de groep zijn geretourneerd naar hun voormalige eigenaren.
-Niet-overdraagbare objecten die eigendom zijn van de groep zijn verwijderd.
- </notification>
- <notification name="UnOwnedObjectsReturned">
- De objecten op het geselecteerde perceel die NIET uw eigendom zijn, zijn geretourneerd naar hun eigenaren.
- </notification>
- <notification name="NotSafe">
- Op dit land is letsel ingeschakeld (&apos;niet veilig&apos;).
-U kunt hier letsel oplopen. Indien u sterft, zult u naar uw thuis locatie worden geteleporteerd.
- </notification>
- <notification name="NoFly">
- Op dit land is vliegen uitgeschakeld (&apos;niet vliegen&apos;).
-U kunt hier niet vliegen.
- </notification>
- <notification name="PushRestricted">
- Dit land is &apos;Niet Duwen&apos;.
-U kunt geen anderen duwen, tenzij u het land bezit.
- </notification>
- <notification name="NoVoice">
- Op dit land is voice uitgeschakeld.
- </notification>
- <notification name="NoBuild">
- Op dit land is bouwen uitgeschakeld (&apos;niet bouwen&apos;).
-U kunt hier geen objecten creëren.
- </notification>
- <notification name="ScriptsStopped">
- Een beheerder heeft scripts in deze regio tijdelijk gestopt.
- </notification>
- <notification name="ScriptsNotRunning">
- In deze regio worden geen scripts uitgevoerd.
- </notification>
- <notification name="NoOutsideScripts">
- Op dit land zijn externe scripts uitgeschakeld (geen externe scripts).
-Geen scripts zullen worden uitgevoerd, behalve scripts die toebehoren aan de landeigenaar.
- </notification>
- <notification name="ClaimPublicLand">
- Kan alleen publiek land claimen in de regio waar u aanwezig bent.
- </notification>
- <notification name="RegionTPAccessBlocked">
- U bent niet toegestaan in die regio vanwege uw inhoudscategorie. Wellicht dient u uw leeftijd te valideren en/of de nieuwste viewer te installeren.
-
-Gaat u alstublieft naar de kennisbank voor details over het betreden van gebieden met deze inhoudscategorie.
- </notification>
- <notification name="URBannedFromRegion">
- U bent uit deze regio verbannen.
- </notification>
- <notification name="NoTeenGridAccess">
- Uw account kan geen verbinding maken met deze teen grid regio.
- </notification>
- <notification name="NoHelpIslandTP">
- U kunt niet terug teleporteren naar Help Island. Ga naar &apos;Help Island Public&apos; om de handleiding te herhalen.
- </notification>
- <notification name="ImproperPaymentStatus">
- U heeft niet de juiste betalingstatus om deze regio binnen te gaan.
- </notification>
- <notification name="MustGetAgeRegion">
- U moet leeftijd geverifieerd zijn om deze regio binnen te gaan.
- </notification>
- <notification name="MustGetAgeParcel">
- U moet leeftijd geverifieerd zijn om dit perceel binnen te gaan.
- </notification>
- <notification name="NoDestRegion">
- Geen bestemmingsregio gevonden.
- </notification>
- <notification name="NotAllowedInDest">
- U wordt niet op de bestemming toegelaten.
- </notification>
- <notification name="RegionParcelBan">
- Kan niet naar de regio oversteken in een verbannen perceel. Probeer het op een andere manier.
- </notification>
- <notification name="TelehubRedirect">
- U bent doorverwezen naar een telehub.
- </notification>
- <notification name="CouldntTPCloser">
- Kan niet dichter bij bestemming teleporteren.
- </notification>
- <notification name="TPCancelled">
- Teleport geannuleerd.
- </notification>
- <notification name="FullRegionTryAgain">
- De regio die u probeert binnen te gaan is momenteel vol.
-Probeer het alstublieft opnieuw over enkele ogenblikken.
- </notification>
- <notification name="GeneralFailure">
- Algemene fout.
- </notification>
- <notification name="RoutedWrongRegion">
- Gerouteerd naar de verkeerde regio. Probeer het alstublieft opnieuw.
- </notification>
- <notification name="NoValidAgentID">
- Geen geldige agent ID.
- </notification>
- <notification name="NoValidSession">
- Geen geldige sessie ID.
- </notification>
- <notification name="NoValidCircuit">
- Geen geldige circuit code.
- </notification>
- <notification name="NoValidTimestamp">
- Geen geldige tijdstempel.
- </notification>
- <notification name="NoPendingConnection">
- Kan wachtende verbinding niet maken.
- </notification>
- <notification name="InternalUsherError">
- Er is een interne fout opgetreden terwijl geprobeerd werd u naar uw teleportbestemming te begeleiden. [SECOND_LIFE] heeft op dit moment mogelijk problemen met de dienstverlening.
- </notification>
- <notification name="NoGoodTPDestination">
- Kan geen goede teleportbestemming vinden in deze regio.
- </notification>
- <notification name="InternalErrorRegionResolver">
- Er is een interne fout opgetreden terwijl de globale coördinaten voor uw teleportverzoek werden bepaald. [SECOND_LIFE] heeft op dit moment mogelijk problemen met de dienstverlening.
- </notification>
- <notification name="NoValidLanding">
- Er kon geen geldig landingspunt worden gevonden.
- </notification>
- <notification name="NoValidParcel">
- Geen geldig perceel kon gevonden worden.
- </notification>
- <notification name="ObjectGiveItem">
- Een object genaamd &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt;, eigendom van [NAME_SLURL], heeft u een [OBJECTTYPE] genaamd [ITEM_SLURL] gegeven.
- <form name="form">
- <button name="Keep" text="Behouden"/>
- <button name="Discard" text="Afwijzen"/>
- <button name="Mute" text="Negeren"/>
- </form>
- </notification>
- <notification name="ObjectGiveItemUnknownUser">
- Een object genaamd [OBJECTFROMNAME], eigendom van (een onbekende gebruiker), heeft u een [OBJECTTYPE] genaamd [OBJECTNAME] gegeven.
- <form name="form">
- <button name="Keep" text="Behouden"/>
- <button name="Discard" text="Afwijzen"/>
- <button name="Mute" text="Negeren"/>
- </form>
- </notification>
- <notification name="UserGiveItem">
- [NAME] heeft u een [OBJECTTYPE] genaamd &apos;[OBJECTNAME]&apos; gegeven.
- <form name="form">
- <button name="Keep" text="Behouden"/>
- <button name="Discard" text="Afwijzen"/>
- <button name="Mute" text="Negeren"/>
- </form>
- </notification>
- <notification name="GodMessage">
- [NAME]
-[MESSAGE]
- </notification>
- <notification name="JoinGroup">
- [MESSAGE]
- <form name="form">
- <button name="Join" text="Deelnemen"/>
- <button name="Decline" text="Afwijzen"/>
- <button name="Info" text="Info"/>
- </form>
- </notification>
- <notification name="TeleportOffered">
- [NAME] heeft aangeboden u te teleporteren naar zijn of haar locatie:
-
-[MESSAGE]
- <form name="form">
- <button name="Teleport" text="Teleport"/>
- <button name="Cancel" text="Annuleren"/>
- </form>
- </notification>
- <notification name="GotoURL">
- [MESSAGE]
-[URL]
- <form name="form">
- <button name="Later" text="Later"/>
- <button name="GoNow..." text="Ga Nu..."/>
- </form>
- </notification>
- <notification name="OfferFriendship">
- [NAME] biedt vriendschap aan.
-
-[MESSAGE]
-
-(Standaard zult u in staat zijn om elkaars online status te zien.)
- <form name="form">
- <button name="Accept" text="Accepteren"/>
- <button name="Decline" text="Afwijzen"/>
- </form>
- </notification>
- <notification name="OfferFriendshipNoMessage">
- [NAME] biedt vriendschap aan.
-
-(Standaard zult u in staat zijn om elkaars online status te zien.)
- <form name="form">
- <button name="Accept" text="Accepteren"/>
- <button name="Decline" text="Afwijzen"/>
- </form>
- </notification>
- <notification name="FriendshipAccepted">
- [NAME] heeft uw vriendschapsaanbod geaccepteerd.
- </notification>
- <notification name="FriendshipDeclined">
- [NAME] heeft uw vriendschapsaanbod afgewezen.
- </notification>
- <notification name="OfferCallingCard">
- [NAME] biedt zijn/haar visitekaartje aan.
-Dit zal een bladwijzer in uw inventaris toevoegen zodat u deze inwoner snel kunt een IM kunt sturen.
- <form name="form">
- <button name="Accept" text="Accepteren"/>
- <button name="Decline" text="Afwijzen"/>
- </form>
- </notification>
- <notification name="RegionRestartMinutes">
- De regio zal over [MINUTES] minuten herstarten.
-Indien u in deze regio blijft, zult u worden uitgelogd.
- </notification>
- <notification name="RegionRestartSeconds">
- De regio zal over [SECONDS] seconden herstarten.
-Indien u in deze regio blijft, zult u worden uitgelogd.
- </notification>
- <notification name="LoadWebPage">
- Laad webpagina [URL]?
-
-[MESSAGE]
-
-Van object: [OBJECTNAME], eigenaar: [NAME]?
- <form name="form">
- <button name="Gotopage" text="Laden"/>
- <button name="Cancel" text="Annuleren"/>
- </form>
- </notification>
- <notification name="FailedToFindWearableUnnamed">
- Kon [TYPE] niet in de database vinden.
- </notification>
- <notification name="FailedToFindWearable">
- Kon [TYPE] genaamd [DESC] niet in de database vinden.
- </notification>
- <notification name="InvalidWearable">
- Het item dat u probeert te dragen gebruikt een kenmerk dat uw viewer niet kan lezen. Upgrade u alstublieft uw versie van [APP_NAME] om dit item te dragen.
- </notification>
- <notification name="ScriptQuestion">
- [OBJECTNAME]&apos;, een object van &apos;[NAME]&apos;, wil graag:
-
-[QUESTIONS]
-Is dit OK?
- <form name="form">
- <button name="Yes" text="Ja"/>
- <button name="No" text="Nee"/>
- <button name="Mute" text="Negeren"/>
- </form>
- </notification>
- <notification name="ScriptQuestionCaution">
- [OBJECTNAME]&apos;, een object van &apos;[NAME]&apos;, wil graag
-
-[QUESTIONS]
-Indien u dit object en zijn maker niet vertrouwt, zou u het verzoek moeten weigeren. Klik de Details knop voor additionele informatie.
-
-Dit verzoek inwilligen?
- <form name="form">
- <button name="Grant" text="Inwilligen"/>
- <button name="Deny" text="Weigeren"/>
- <button name="Details" text="Details..."/>
- </form>
- </notification>
- <notification name="ScriptDialog">
- [NAME]&apos;s &apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos;
-[MESSAGE]
- <form name="form">
- <button name="Ignore" text="Negeren"/>
- </form>
- </notification>
- <notification name="ScriptDialogGroup">
- [GROUPNAME]&apos;s &apos;[TITLE]&apos;
-[MESSAGE]
- <form name="form">
- <button name="Ignore" text="Negeren"/>
- </form>
- </notification>
- <notification name="FirstBalanceIncrease">
- U heeft zojuist L$[AMOUNT] ontvangen.
-Objecten en andere gebruikers kunnen u L$ geven.
-Uw saldo wordt in de rechterbovenhoek van het scherm getoond.
- </notification>
- <notification name="FirstBalanceDecrease">
- U heeft zojuist L$[AMOUNT] betaald.
-Uw saldo wordt in de rechterbovenhoek van het scherm getoond.
- </notification>
- <notification name="FirstSit">
- U zit.
-Gebruik de pijltjestoetsen (of AWSD) of uw gezichtsveld te wijzigen.
-Klik de &apos;Sta Op&apos; knop om op te staan.
- </notification>
- <notification name="FirstMap">
- Klik en sleep om de kaart te verplaatsen.
-Dubbelklik om te teleporteren.
-Gebruik de bedieningselementen aan de rechterkant om dingen te vinden en verschillende achtergronden te tonen.
- </notification>
- <notification name="FirstBuild">
- U kunt nieuwe objecten bouwen in sommige gebieden van [SECOND_LIFE].
-Gebruik de gereedschappen in de linkerbovenhoek om te bouwen en probeer Ctrl en Alt ingedrukt te houden om snel tussen gereedschappen te wisselen.
-Druk Esc om te stoppen met bouwen.
- </notification>
- <notification name="FirstLeftClickNoHit">
- Links-klikken werkt in op speciale objecten.
-Indien de muisaanwijzer verandert in een hand, kunt u interacteren met het object.
-Rechts-klikken toont altijd een menu van dingen die u kunt doen.
- </notification>
- <notification name="FirstTeleport">
- Deze regio staat geen point-to-point teleport toe, dus u bent naar de dichtstbijzijnde telehub getransporteerd.
-Uw bestemming is gemarkeerd met een groot baken.
-Volg de rode pijl naar het baken, of klik de pijl om het baken te verwijderen.
- </notification>
- <notification name="FirstOverrideKeys">
- Uw bewegingstoetsen worden nu door een object afgehandeld.
-Probeer de pijltjestoetsen of AWSD om te zien wat ze doen.
-Sommige objecten (zoals geweren) vereisen dat u in mouselook gaat om ze te gebruiken.
-Druk &apos;M&apos; om dit te doen.
- </notification>
- <notification name="FirstAppearance">
- U bent uw uiterlijk aan het bewerken.
-Gebruik de pijltjestoetsen om uw gezichtsveld te draaien en te zoomen.
-Druk &apos;Alles Opslaan&apos; om uw uiterlijk op te slaan wanneer u klaar bent.
-U kunt uw uiterlijk zo vaak als u wil bewerken.
- </notification>
- <notification name="FirstInventory">
- Dit is uw inventaris, die objecten, notitiekaarten, kleding en andere eigendommen bevat.
-* Om een object of een kleding-map te dragen, sleep het op uzelf.
-* Om een object in de wereld te brengen, sleep het op de grond.
-* Om een notitiekaart te lezen, dubbelklik erop.
- </notification>
- <notification name="FirstSandbox">
- Dit is een zandbak regio.
-Objecten die u hier bouwt, kunnen worden verwijderd nadat u het gebied verlaat. Zandbakken schonen op regelmatige basis, kijk alstublieft naar de informatie aan de bovenkant van het scherm, naast de regionaam.
-
-Zandbak regio&apos;s zijn ongewoon en gemarkeerd met borden.
- </notification>
- <notification name="FirstFlexible">
- Dit object is flexibel.
-Flexibele objecten mogen niet fysiek zijn en moeten fantoom zijn tot de &apos;flexibel&apos; checkbox wordt uitgezet.
- </notification>
- <notification name="FirstDebugMenus">
- U heeft het menu Geavanceerd geactiveerd.
-Dit menu bevat opties die handig zijn voor ontwikkelaars tijdens het debuggen van [SECOND_LIFE].
-Om dit menu in en uit te schakelen drukt u binnen Windows Ctrl+Alt+D. Met een Mac drukt u &#8997;&#8984;D.
- </notification>
- <notification name="FirstSculptedPrim">
- U bent een sculpted prim aan het bewerken.
-Sculpted prims vereisen een speciaal textuur om hun vorm te bepalen.
-U kunt voorbeelden van sculpt-texturen in de inventaris bibliotheek vinden.
- </notification>
- <notification name="FirstMedia">
- U bent begonnen met het afspelen van media. In het Voorkeurenvenster, onder Audio / Video, kan media worden ingesteld om automatisch te beginnen met afspelen. Let op dat dit een beveiligingsrisico kan zijn voor media sites die u niet vertrouwt.
- </notification>
- <notification name="MaxListSelectMessage">
- U mag slecht maximaal [MAX_SELECT] items van deze lijst kiezen.
- </notification>
- <notification name="VoiceInviteP2P">
- [NAME] nodigt u uit voor een Voice chat gesprek.
-Klik Accepteren om deel te nemen aan dit gesprek of Afwijzen om de uitnodiging af te wijzen. Klik Negeren om deze persoon te negeren.
- <form name="form">
- <button name="Accept" text="Accepteren"/>
- <button name="Decline" text="Afwijzen"/>
- <button name="Mute" text="Negeren"/>
- </form>
- </notification>
- <notification name="AutoUnmuteByIM">
- Er is een instant message naar [NAME] gestuurd, waardoor deze automatisch van de negeerlijst is gehaald.
- </notification>
- <notification name="AutoUnmuteByMoney">
- Er is geld gegeven aan [NAME], waardoor deze automatisch van de negeerlijst is gehaald.
- </notification>
- <notification name="AutoUnmuteByInventory">
- Er is inventaris aangeboden aan [NAME], waardoor deze automatisch van de negeerlijst is gehaald.
- </notification>
- <notification name="VoiceInviteGroup">
- [NAME] doet nu mee met een Voice chat gesprek binnen de groep [GROUP].
-Klik Accepteren om deel te nemen aan het gesprek of Afwijzen om de uitnodiging af te wijzen. Klik Negeren om deze persoon te negeren.
- <form name="form">
- <button name="Accept" text="Accepteren"/>
- <button name="Decline" text="Afwijzen"/>
- <button name="Mute" text="Negeren"/>
- </form>
- </notification>
- <notification name="VoiceInviteAdHoc">
- [NAME] doet nu mee met een Voice chat gesprek binnen een conferentie chat.
-Klik Accepteren om deel te nemen aan het gesprek of Afwijzen om de uitnodiging af te wijzen. Klik Negeren om deze persoon te negeren.
- <form name="form">
- <button name="Accept" text="Accepteren"/>
- <button name="Decline" text="Afwijzen"/>
- <button name="Mute" text="Negeren"/>
- </form>
- </notification>
- <notification name="InviteAdHoc">
- [NAME] nodigt u uit voor een conferentie chat.
-Klik Accepteren om deel te nemen aan de chat of Afwijzen om de uitnodiging af te wijzen. Klik Negeren om deze persoon te negeren.
- <form name="form">
- <button name="Accept" text="Accepteren"/>
- <button name="Decline" text="Afwijzen"/>
- <button name="Mute" text="Negeren"/>
- </form>
- </notification>
- <notification name="VoiceChannelFull">
- Het voice gesprek waaraan u probeert deel te nemen, [VOICE_CHANNEL_NAME], heeft zijn maximale capaciteit bereikt. Probeert u het alstublieft later nog een keer.
- </notification>
- <notification name="ProximalVoiceChannelFull">
- Onze excuses. Dit gebied heeft zijn maximale capaciteit voor voice conversaties bereikt. Probeert u alstublieft voice te gebruiken in een ander gebied.
- </notification>
- <notification name="VoiceChannelDisconnected">
- U bent niet meer verbonden met [VOICE_CHANNEL_NAME]. U zult weer worden verbonden met spatiale voice chat.
- </notification>
- <notification name="VoiceChannelDisconnectedP2P">
- [VOICE_CHANNEL_NAME] heeft het gesprek beëindigd. U zult weer worden verbonden met spatiale voice chat.
- </notification>
- <notification name="P2PCallDeclined">
- [VOICE_CHANNEL_NAME] heeft uw oproep afgewezen. U zult weer worden verbonden met spatiale voice chat.
- </notification>
- <notification name="P2PCallNoAnswer">
- [VOICE_CHANNEL_NAME] is niet beschikbaar om uw oproep aan te nemen. U zult weer worden verbonden met spatiale voice chat.
- </notification>
- <notification name="VoiceChannelJoinFailed">
- Verbinden met [VOICE_CHANNEL_NAME] is mislukt, probeert u het later alstublieft nog een keer. U zult weer worden verbonden met spatiale voice chat.
- </notification>
- <notification name="VoiceLoginRetry">
- We zijn bezig om een voice kanaal voor u te maken. Dit kan tot een minuut duren.
- </notification>
- <notification name="Cannot enter parcel: not a group member">
- Kan het perceel niet betreden, u bent geen lid van de juiste groep.
- </notification>
- <notification name="Cannot enter parcel: banned">
- Kan het perceel niet betreden, u bent verbannen.
- </notification>
- <notification name="Cannot enter parcel: not on access list">
- Kan het perceel niet betreden, u staat niet op de toegangslijst.
- </notification>
- <notification name="VoiceNotAllowed">
- U heeft geen permissie om met voice chat te verbinden voor [VOICE_CHANNEL_NAME].
- </notification>
- <notification name="VoiceCallGenericError">
- Er is een fout opgetreden tijdens het verbinden met voice chat voor [VOICE_CHANNEL_NAME]. Probeert u het later alstublieft opnieuw.
- </notification>
- <notification name="ServerVersionChanged">
- De regio die u bent binnengetreden wordt onder een andere simulatorversie uitgevoerd. Klik dit bericht voor meer details.
- </notification>
- <notification name="UnableToOpenCommandURL">
- De URL die u heeft geklikt kan niet binnen deze webbrowser worden geopend.
- </notification>
- <global name="UnsupportedCPU">
- - Uw Processor snelheid (CPU) voldoet niet aan de minimale eisen.
- </global>
- <global name="UnsupportedGLRequirements">
- U heeft mogelijk niet de vereiste hardware voor [APP_NAME]. [APP_NAME] verlangd een OpenGL grafische kaart die multi-texture ondersteund. Indien dat het geval is, overtuig u er dan van dat u de laatste stuurprogramma&apos;s voor uw grafische kaart, service packs en patches voor uw Operating systeem heeft.
-
-Indien u problemen blijft houden, bezoek dan: http://www.secondlife.com/support
- </global>
- <global name="UnsupportedCPUAmount">
- 796
- </global>
- <global name="UnsupportedRAMAmount">
- 510
- </global>
- <global name="UnsupportedGPU">
- - Uw grafische kaart voldoet niet aan de minimale eisen.
- </global>
- <global name="UnsupportedRAM">
- - Uw systeem geheugen voldoet niet aan de minimale eisen.
- </global>
- <global name="PermYes">
- Ja
- </global>
- <global name="PermNo">
- Nee
- </global>
-</notifications>
diff --git a/indra/newview/skins/default/xui/nl/panel_block_list_sidetray.xml b/indra/newview/skins/default/xui/nl/panel_block_list_sidetray.xml
deleted file mode 100644
index 38018a3626..0000000000
--- a/indra/newview/skins/default/xui/nl/panel_block_list_sidetray.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="block_list_panel">
- <text name="title_text">
- Blokkeer Lijst
- </text>
- <scroll_list name="blocked" tool_tip="Lijst van momenteel geblokkeerde bewoners"/>
- <button label="Blokkeer Bewoner..." label_selected="Blokkeer Bewoner..." name="Block resident..." tool_tip="Kies een bewoner om te blokkeren"/>
- <button label="Blokkeer object bij naam..." label_selected="Blokkeer object bij naam..." name="Block object by name..."/>
- <button label="Deblokkeren" label_selected="Deblokkeren" name="Unblock" tool_tip="Verweider bewoner of object uit blokkeer lijst"/>
-</panel>
diff --git a/indra/newview/skins/default/xui/nl/panel_edit_profile.xml b/indra/newview/skins/default/xui/nl/panel_edit_profile.xml
deleted file mode 100644
index fffdb9e8df..0000000000
--- a/indra/newview/skins/default/xui/nl/panel_edit_profile.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel name="edit_profile_panel">
- <string name="CaptionTextAcctInfo">
- [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
- </string>
- <string name="AcctTypeResident"
- value="Inwoner" />
- <string name="AcctTypeTrial"
- value="Proef" />
- <string name="AcctTypeCharterMember"
- value="Charter lid" />
- <string name="AcctTypeEmployee"
- value="Linden Lab werknemer" />
- <string name="PaymentInfoUsed"
- value="Betalingsinformatie gebruikt" />
- <string name="PaymentInfoOnFile"
- value="Betalingsinformatie aanwezig" />
- <string name="NoPaymentInfoOnFile"
- value="Geen betalingsinfo aanwezig" />
- <string name="AgeVerified"
- value="Leeftijd geverifieerd" />
- <string name="NotAgeVerified"
- value="Leeftijd niet geverifieerd" />
- <string name="partner_edit_link_url">
- http://www.secondlife.com/account/partners.php?lang=nl
- </string>
- <panel name="scroll_content_panel">
- <panel name="data_panel" >
- <panel name="lifes_images_panel">
- <panel name="second_life_image_panel">
- <text name="second_life_photo_title_text">
- [SECOND_LIFE]:
- </text>
- </panel>
- </panel>
- <text name="title_partner_text" value="Partner:"/>
- <panel name="partner_data_panel">
- <text name="partner_text"/>
- </panel>
- <text name="text_box3">
- Antwoord bij Niet Storen:
- </text>
- </panel>
- </panel>
-</panel>
diff --git a/indra/newview/skins/default/xui/nl/panel_group_general.xml b/indra/newview/skins/default/xui/nl/panel_group_general.xml
deleted file mode 100644
index 2a0fe03232..0000000000
--- a/indra/newview/skins/default/xui/nl/panel_group_general.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Algemeen" name="general_tab">
- <string name="help_text">
- Het tabblad Algemeen bevat algemene informatie over deze groep, een lijst met eigenaren en zichtbare leden, algemene groepsvoorkeuren en ledenopties.
-
-Laat uw muis boven de opties zweven voor meer help.
- </string>
- <string name="group_info_unchanged">
- Algemene groepsinformatie is gewijzigd.
- </string>
- <button label="?" label_selected="?" name="help_button"/>
- <line_editor label="Typ uw nieuwe groepsnaam hier" name="group_name_editor"/>
- <text name="group_name">
- Typ uw nieuwe groepsnaam hier
- </text>
- <text name="prepend_founded_by">
- Opgericht door
- </text>
- <text name="founder_name" left_delta="84">
- (wachten)
- </text>
- <text name="group_charter_label" width="244">
- Groepcharter
- </text>
- <texture_picker label="Groepinsigne" name="insignia" tool_tip="Klik om een afbeelding te kiezen"/>
- <text_editor name="charter" width="244">
- Groepcharter
- </text_editor>
- <button label="Deelnemen (L$0)" label_selected="Deelnemen (L$0)" name="join_button"/>
- <button label="Gedetailleerde weergave" label_selected="Gedetailleerde weergave" name="info_button" width="154"/>
- <text name="text_owners_and_visible_members">
- Eigenaren en zichtbare leden
- </text>
- <text name="text_owners_are_shown_in_bold">
- (Eigenaren worden vet getoond)
- </text>
- <name_list name="visible_members">
- <name_list.columns label="Lidnaam" name="name"/>
- <name_list.columns label="Titel" name="title"/>
- <name_list.columns label="Laatste login" name="online"/>
- </name_list>
- <text name="text_group_preferences">
- Groepvoorkeuren
- </text>
- <panel name="preferences_container">
- <check_box label="Toon in zoeken" name="show_in_group_list" tool_tip="Stelt in of deze groep zichtbaar is in de zoekresultaten."/>
- <check_box label="Vrije toegang" name="open_enrollement" tool_tip="Stelt in of deze groep toestaat dat nieuwe leden lid kunnen worden zonder uitgenodigd te zijn."/>
- <check_box label="Contributiebijdrage:" name="check_enrollment_fee" tool_tip="Stelt in of er een contributiebijdrage vereist is om lid te worden van de groep."/>
- <spinner name="spin_enrollment_fee" tool_tip="Nieuwe leden moeten deze bijdrage betalen om deel te nemen aan de groep wanneer &quot;Contributie bijdrage&quot; is aangevinkt." width="58" left_delta="142"/>
- <combo_box name="group_mature_check" tool_tip="Stelt in of uw groepsinformatie als mature beschouwd wordt.">
- <combo_box.item name="select_mature" label="- Selecteer -"/>
- <combo_box.item name="mature" label="Mature inhoud"/>
- <combo_box.item name="pg" label="PG inhoud"/>
- </combo_box>
- <panel name="title_container">
- <text name="active_title_label">
- Mijn actieve titel
- </text>
- <combo_box name="active_title" tool_tip="Stelt de titel in die in uw avatar&apos;s naamlabel verschijnt wanneer deze groep actief is."/>
- </panel>
- <check_box label="Ontvang groepsberichten" name="receive_notices" tool_tip="Stelt in of u berichten van deze groep wilt ontvangen. Verwijder het vinkje wanneer u spam ontvangt van deze groep." left_delta="-4"/>
- <check_box label="Toon deze groep in mijn profiel" name="list_groups_in_profile" tool_tip="Stelt in of u deze groep in uw profiel wil laten zien"/>
- </panel>
- <string name="incomplete_member_data_str">
- Ledendata ophalen
- </string>
- <string name="confirm_group_create_str">
- Het maken van deze groep zal u L$ 100 kosten. Weet u ECHT héél zeker dat u L$ 100 wilt betalen om deze groep te maken?
-
-WEES U ER VAN BEWUST, dat als er niemand binnen 48 uur lid wordt van deze groep, deze weer ontmanteld zal worden. Hierbij zal ook de groepsnaam onbeschikbaar blijven voor toekomstig gebruik!
- </string>
-</panel>
diff --git a/indra/newview/skins/default/xui/nl/panel_group_invite.xml b/indra/newview/skins/default/xui/nl/panel_group_invite.xml
deleted file mode 100644
index e012d88ff5..0000000000
--- a/indra/newview/skins/default/xui/nl/panel_group_invite.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Nodig een lid uit" name="invite_panel">
- <text name="help_text">
- U kunt meerdere inwoners selecteren
-om voor uw groep uit te nodigen. Klik
-&apos;Open inwonerkiezer&apos; om te starten.
- </text>
- <button label="Open inwonerkiezer" name="add_button" tool_tip=""/>
- <name_list name="invitee_list" tool_tip="Houd de Ctrl-toets vast en klik de namen van de inwoners om meerdere te selecteren."/>
- <button label="Verwijder geselecteerden van lijst" name="remove_button" tool_tip="Verwijderd hierboven geselecteerde inwoners van de uitnodigingslijst."/>
- <text name="role_text">
- Kies welke rol aan hen wordt
-toegewezen:
- </text>
- <combo_box name="role_name" tool_tip="Kies uit de lijst met rollen waarvoor u toestemming heeft om leden toe te wijzen." bottom_delta="-30"/>
- <button label="Verzend uitnodigingen" name="ok_button"/>
- <button label="Annuleren" name="cancel_button"/>
- <string name="confirm_invite_owner_str">
- Weet u zeker dat u een (een) nieuwe eigenaar(s) wilt uitnodigen? Deze actie is permanent!
- </string>
- <string name="loading">
- (laden...)
- </string>
-</panel>
diff --git a/indra/newview/skins/default/xui/nl/panel_group_land_money.xml b/indra/newview/skins/default/xui/nl/panel_group_land_money.xml
deleted file mode 100644
index 43babafdf8..0000000000
--- a/indra/newview/skins/default/xui/nl/panel_group_land_money.xml
+++ /dev/null
@@ -1,84 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Land &amp; L$" name="land_money_tab">
- <string name="help_text">
- Percelen in groepseigendom worden getoond, samen met bijdragedetails. Een waarschuwing verschijnt totdat Totaal Land In Gebruik minder dan of gelijk aan de totale bijdrage is. De Planning, Details en Verkopen tabbladen verschaffen meer informatie over de financiën van de groep.
- </string>
- <button label="?" name="help_button"/>
- <string name="cant_view_group_land_text">
- U heeft geen permissie om land te bekijken dat eigendom van de groep is.
- </string>
- <string name="cant_view_group_accounting_text">
- U heeft geen permissie om accounting informatie van de groep te bekijken.
- </string>
- <string name="loading_txt">
- Laden...
- </string>
- <text name="group_land_heading" width="260">
- Land in eigendom van groep
- </text>
- <scroll_list name="group_parcel_list">
- <column label="Perceelnaam" name="name"/>
- <column label="Regio" name="location"/>
- <column label="Type" name="type"/>
- <column label="Gebied" name="area"/>
- </scroll_list>
- <button label="Toon op kaart" label_selected="Toon op kaart" name="map_button"/>
- <text name="total_contributed_land_label">
- Totale bijdrage:
- </text>
- <text name="total_contributed_land_value" width="200">
- [AREA] m²
- </text>
- <text name="total_land_in_use_label">
- Totaal land in gebruik:
- </text>
- <text name="total_land_in_use_value">
- [AREA] m²
- </text>
- <text name="land_available_label">
- Land beschikbaar:
- </text>
- <text name="land_available_value">
- [AREA] m²
- </text>
- <text name="your_contribution_label">
- Uw bijdrage:
- </text>
- <string name="land_contrib_error">
- Niet in staat uw landbijdrage in te stellen.
- </string>
- <text name="your_contribution_units">
- ( m² )
- </text>
- <text name="your_contribution_max_value">
- ([AMOUNT] max)
- </text>
- <text name="group_over_limit_text">
- Groepsleden moeten landcredits bijdragen om het gebruikte land
-te ondersteunen.
- </text>
- <text name="group_money_heading">
- Groep L$
- </text>
- <tab_container name="group_money_tab_container">
- <panel label="Planning" name="group_money_planning_tab">
- <text_editor name="group_money_planning_text">
- Berekenen...
- </text_editor>
- </panel>
- <panel label="Details" name="group_money_details_tab">
- <text_editor name="group_money_details_text">
- Berekenen...
- </text_editor>
- <button label="&lt; Eerder" label_selected="&lt; Eerder" name="earlier_details_button" tool_tip="Ga terug in de tijd"/>
- <button label="Later &gt;" label_selected="Later &gt;" name="later_details_button" tool_tip="Ga vooruit in de tijd"/>
- </panel>
- <panel label="Verkopen" name="group_money_sales_tab">
- <text_editor name="group_money_sales_text">
- Berekenen...
- </text_editor>
- <button label="&lt; Eerder" label_selected="&lt; Eerder" name="earlier_sales_button" tool_tip="Ga terug in de tijd"/>
- <button label="Later &gt;" label_selected="Later &gt;" name="later_sales_button" tool_tip="Ga vooruit in de tijd"/>
- </panel>
- </tab_container>
-</panel>
diff --git a/indra/newview/skins/default/xui/nl/panel_group_notices.xml b/indra/newview/skins/default/xui/nl/panel_group_notices.xml
deleted file mode 100644
index 134261197a..0000000000
--- a/indra/newview/skins/default/xui/nl/panel_group_notices.xml
+++ /dev/null
@@ -1,65 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Berichten" name="notices_tab">
- <string name="help_text">
- Berichten vormen een snelle manier om met een groep te communiceren door een bericht en optioneel een bevestigd item af te leveren. Berichten gaan alleen naar groepsleden in rollen die de mogelijkheid hebben om berichten te ontvangen. U kunt berichten uitzetten in de tab Algemeen.
- </string>
- <string name="no_notices_text">
- Er zijn geen oude berichten.
- </string>
- <button label="?" label_selected="?" name="help_button"/>
- <text name="lbl">
- Groepsberichtenarchief
- </text>
- <text name="lbl2">
- Berichten worden 14 dagen bewaard. Berichtenlijsten zijn gelimiteerd tot 200 berichten groep per dag.
- </text>
- <scroll_list name="notice_list">
- <column label="Onderwerp" name="subject"/>
- <column label="Van" name="from"/>
- <column label="Datum" name="date"/>
- </scroll_list>
- <text name="notice_list_none_found">
- Geen gevonden.
- </text>
- <button label="Maak nieuw bericht" label_selected="Maak nieuw bericht" name="create_new_notice"/>
- <button label="Verversen" label_selected="Ververs lijst" name="refresh_notices"/>
- <panel label="Maak nieuw bericht" name="panel_create_new_notice">
- <text name="lbl">
- Maak een bericht
- </text>
- <text name="lbl2">
- U kunt een enkel item aan een bericht toevoegen door het van uw inventaris naar dit paneel te slepen. Bevestigde items moeten kopieerbaar en overdraagbaar zijn en u kunt geen mappen versturen.
- </text>
- <text bottom_delta="-79" halign="right" left="10" name="lbl3" width="60">
- Onderwerp:
- </text>
- <line_editor name="create_subject" width="331" left_delta="71"/>
- <text bottom_delta="-18" halign="right" left="10" name="lbl4" width="60">
- Bericht:
- </text>
- <text_editor name="create_message" bottom_delta="-90" height="104" left_delta="71" width="330"/>
- <line_editor name="create_inventory_name" width="190" left_delta="71"/>
- <text name="lbl5" left="10">
- Bevestig:
- </text>
- <button label="Verwijder bevestiging" label_selected="Verwijder bevestiging" name="remove_attachment"/>
- <button label="Verzend bericht" label_selected="Verzend bericht" name="send_notice"/>
- <panel name="drop_target" tool_tip="Sleep een inventarisitem op het berichtvenster om het met het bericht mee te sturen. U dient permissie te hebben om het object te kopiëren en over te dragen wilt u het met het bericht mee kunnen sturen."/>
- </panel>
- <panel label="Bekijk oud bericht" name="panel_view_past_notice">
- <text name="lbl">
- Gearchiveerd bericht
- </text>
- <text name="lbl2">
- Om een nieuw bericht te sturen, klik de &apos;Maak nieuw bericht&apos; knop hierboven.
- </text>
- <text name="lbl3">
- Onderwerp:
- </text>
- <text name="lbl4">
- Bericht:
- </text>
- <button label="Open bevestiging" label_selected="Open bevestiging" name="open_attachment" width="118"/>
- <line_editor left="128" name="view_inventory_name" width="256"/>
- </panel>
-</panel>
diff --git a/indra/newview/skins/default/xui/nl/panel_group_roles.xml b/indra/newview/skins/default/xui/nl/panel_group_roles.xml
deleted file mode 100644
index 507906c0d7..0000000000
--- a/indra/newview/skins/default/xui/nl/panel_group_roles.xml
+++ /dev/null
@@ -1,101 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Leden &amp; Rollen" name="roles_tab">
- <panel.string name="default_needs_apply_text">
- Er zijn niet opgeslagen veranderingen op de huidige tab
- </panel.string>
- <panel.string name="want_apply_text">
- Wilt u deze wijzigingen opslaan?
- </panel.string>
- <tab_container height="164" name="roles_tab_container">
- <panel height="148" label="LEDEN" name="members_sub_tab" tool_tip="Leden">
- <panel.string name="help_text">
- U kunt Rollen aan Leden toewijzen of van Leden afnemen. Selecteer meerdere Leden door de Ctrl toets ingedrukt te houden en op hun namen te klikken.
- </panel.string>
- <filter_editor label="Filter Leden" name="filter_input"/>
- <name_list bottom_delta="-105" height="104" name="member_list">
- <name_list.columns label="Lid Naam" name="name"/>
- <name_list.columns label="Donaties" name="donated"/>
- <name_list.columns label="Laatste Login" name="online"/>
- </name_list>
- <button label="Uitnodigen" name="member_invite"/>
- <button label="Uitwerpen" name="member_eject"/>
- </panel>
- <panel height="148" label="ROLLEN" name="roles_sub_tab">
- <panel.string name="help_text">
- Rollen hebben een titel en een toegestane lijst met Vaardigheden die Leden kunnen uitvoeren. Leden kunnen tot 1 of meer Rollen behoren. Een groep kan tot 10 Rollen bevatten, inclusief de Iedereen en Eigenaren Rollen.
- </panel.string>
- <panel.string name="cant_delete_role">
- De &apos;Iedereen&apos; en &apos;Eigenaren&apos; Rollen zijn speciaal en kunnen niet verwijderd worden.
- </panel.string>
- <panel.string name="power_folder_icon">
- Inv_FolderClosed
- </panel.string>
- <filter_editor label="Filter Rollen" name="filter_input"/>
- <scroll_list bottom_delta="-104" height="104" name="role_list">
- <scroll_list.columns label="Rol" name="name"/>
- <scroll_list.columns label="Titel" name="title"/>
- <scroll_list.columns label="Leden" name="members"/>
- </scroll_list>
- <button label="Nieuwe Rol..." name="role_create"/>
- <button label="Rol Verwijderen" name="role_delete"/>
- </panel>
- <panel height="148" label="VAARDIGHEDEN" name="actions_sub_tab" tool_tip="Je kan een vaardigheid&apos;s beschrijving en welke Rollen en Leden kunnen uitvoeren van de Vaardigheid.">
- <panel.string name="help_text">
- Mogelijkheden stellen leden in staat om specifieke dingen in een groep te doen. Er is een brede variëteit aan Mogelijkheden.
- </panel.string>
- <filter_editor label="Filter Vaardigheden" name="filter_input"/>
- <scroll_list bottom_delta="-120" height="118" name="action_list" tool_tip="Selecteer een Vaardigheid om meer details te bekijken"/>
- </panel>
- </tab_container>
- <panel name="members_footer">
- <text name="static">
- Toegekende Rollen
- </text>
- <text name="static2">
- Toegestane Mogelijkheden
- </text>
- <scroll_list name="member_allowed_actions" tool_tip="Voor details van elke Toegestane Vaardigheid in de Mogelijkheden tab"/>
- </panel>
- <panel name="roles_footer">
- <text name="static">
- Naam
- </text>
- <line_editor name="role_name">
- Werknemers
- </line_editor>
- <text name="static3">
- Titel
- </text>
- <line_editor name="role_title">
- (wachten)
- </line_editor>
- <text name="static2">
- Omschrijving
- </text>
- <text_editor name="role_description">
- (wachten)
- </text_editor>
- <text name="static4">
- Toegewezen Rollen
- </text>
- <check_box label="Leden Onthullen" name="role_visible_in_list" tool_tip="Bepaalt of leden van deze rol zichtbaar zijn in de Algemeen tab voor mensen buiten de groep."/>
- <text name="static5" tool_tip="Een lijst met Mogelijkheden die de geselecteerd rol kan uitvoeren.">
- Toegestane Mogelijkheden
- </text>
- <scroll_list name="role_allowed_actions" tool_tip="For details of each allowed ability see the abilities tab"/>
- </panel>
- <panel name="actions_footer">
- <text name="static">
- Vaardigheid omschrijving
- </text>
- <text_editor name="action_description">
- Dit is de Mogelijkheid &apos;Werp Leden uit deze Groep&apos;. Alleen een Eigenaar kan een andere Eigenaar uitwerpen.
- </text_editor>
- <text name="static2">
- Rollen met deze vaardigheid
- </text>
- <text name="static3">
- Leden met deze vaardigheid
- </text>
- </panel>
-</panel>
diff --git a/indra/newview/skins/default/xui/nl/panel_login.xml b/indra/newview/skins/default/xui/nl/panel_login.xml
deleted file mode 100644
index bcc888061f..0000000000
--- a/indra/newview/skins/default/xui/nl/panel_login.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_login">
- <panel.string name="create_account_url">
- http://join.secondlife.com/index.php?lang=nl-NL
- </panel.string>
- <panel.string name="forgot_password_url">
- http://secondlife.com/account/request.php?lang=nl-NL
- </panel.string>
- <panel name="login_widgets">
- <text name="first_name_text">
- Voornaam:
- </text>
- <line_editor name="first_name_edit" tool_tip="[SECOND_LIFE] Voornaam"/>
- <text name="last_name_text">
- Achternaam:
- </text>
- <line_editor name="last_name_edit" tool_tip="[SECOND_LIFE] Achternaam"/>
- <text name="password_text">
- Paswoord:
- </text>
- <button label="Inloggen" label_selected="Inloggen" name="connect_btn"/>
- <text name="start_location_text">
- Start locatie:
- </text>
- <combo_box name="start_location_combo">
- <combo_box.item label="Mijn Laatste Locatie" name="MyLastLocation"/>
- <combo_box.item label="Mijn Thuis" name="MyHome"/>
- <combo_box.item label="&lt;Tik regio naam&gt;" name="Typeregionname"/>
- </combo_box>
- <check_box label="Onthoud paswoord" name="remember_check"/>
- <text name="create_new_account_text">
- Maak een nieuwe account
- </text>
- <text name="forgot_password_text">
- Naam of paswoord vergeten?
- </text>
- <text name="channel_text">
- [VERSION]
- </text>
- </panel>
-</panel>
diff --git a/indra/newview/skins/default/xui/nl/panel_main_inventory.xml b/indra/newview/skins/default/xui/nl/panel_main_inventory.xml
deleted file mode 100644
index c533cc20c0..0000000000
--- a/indra/newview/skins/default/xui/nl/panel_main_inventory.xml
+++ /dev/null
@@ -1,64 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Dingen" name="main inventory panel">
- <panel.string name="Title">
- Dingen
- </panel.string>
- <filter_editor label="Filter" name="inventory search editor"/>
- <tab_container name="inventory filter tabs">
- <inventory_panel label="Alle Voorwerpen" name="All Items"/>
- <inventory_panel label="Recente Voorwerpen" name="Recent Items"/>
- </tab_container>
- <panel name="bottom_panel">
- <button name="options_gear_btn" tool_tip="Toon extra opties"/>
- <button name="add_btn" tool_tip="Voeg nieuw voorwerp toe"/>
- <dnd_button name="trash_btn" tool_tip="Remove selected item"/>
- </panel>
- <menu_bar name="Inventory Menu">
- <menu label="Bestand" name="File">
- <menu_item_call label="Open" name="Open"/>
- <menu label="Upload" name="upload">
- <menu_item_call label="Plaatje (L$[COST])..." name="Upload Image"/>
- <menu_item_call label="Geluid (L$[COST])..." name="Upload Sound"/>
- <menu_item_call label="Animatie (L$[COST])..." name="Upload Animation"/>
- <menu_item_call label="Bulk (L$[COST] per bestand)..." name="Bulk Upload"/>
- </menu>
- <menu_item_call label="Nieuw Venster" name="New Window"/>
- <menu_item_call label="Toon Filters" name="Show Filters"/>
- <menu_item_call label="Reset Filters" name="Reset Current"/>
- <menu_item_call label="Sluit Alle Mappen" name="Close All Folders"/>
- <menu_item_call label="Prullenbak Leegmaken" name="Empty Trash"/>
- <menu_item_call label="Leeg Verloren En Gevonden" name="Empty Lost And Found"/>
- </menu>
- <menu label="Maken" name="Create">
- <menu_item_call label="Nieuwe Map" name="New Folder"/>
- <menu_item_call label="Nieuw Script" name="New Script"/>
- <menu_item_call label="Nieuwe Notitie" name="New Note"/>
- <menu_item_call label="Nieuw Gebaar" name="New Gesture"/>
- <menu label="Nieuwe Kleding" name="New Clothes">
- <menu_item_call label="Nieuw Overhemd" name="New Shirt"/>
- <menu_item_call label="Nieuwe Broek" name="New Pants"/>
- <menu_item_call label="Nieuwe Schoenen" name="New Shoes"/>
- <menu_item_call label="Nieuwe Sokken" name="New Socks"/>
- <menu_item_call label="Nieuwe Jas" name="New Jacket"/>
- <menu_item_call label="Nieuwe Rok" name="New Skirt"/>
- <menu_item_call label="Nieuwe Handschoenen" name="New Gloves"/>
- <menu_item_call label="Nieuw Hemd" name="New Undershirt"/>
- <menu_item_call label="Nieuwe Onderbroek" name="New Underpants"/>
- <menu_item_call label="Nieuwe Alpha" name="New Alpha"/>
- <menu_item_call label="Nieuwe Tattoo" name="New Tattoo"/>
- </menu>
- <menu label="Nieuwe Lichaamsdelen" name="New Body Parts">
- <menu_item_call label="Nieuwe Vorm" name="New Shape"/>
- <menu_item_call label="Nieuwe Huid" name="New Skin"/>
- <menu_item_call label="Nieuw Haar" name="New Hair"/>
- <menu_item_call label="Nieuwe Ogen" name="New Eyes"/>
- </menu>
- </menu>
- <menu label="Sorteer" name="Sort">
- <menu_item_check label="Bij Naam" name="By Name"/>
- <menu_item_check label="Bij Datum" name="By Date"/>
- <menu_item_check label="Mappen Altijd Op Naam" name="Folders Always By Name"/>
- <menu_item_check label="Syteemmappen Naar Boven" name="System Folders To Top"/>
- </menu>
- </menu_bar>
-</panel>
diff --git a/indra/newview/skins/default/xui/nl/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/nl/panel_preferences_advanced.xml
deleted file mode 100644
index 6626c57472..0000000000
--- a/indra/newview/skins/default/xui/nl/panel_preferences_advanced.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<panel name="advanced">
- <panel.string name="resolution_format">
- [RES_X] x [RES_Y]
- </panel.string>
- <panel.string name="aspect_ratio_text">
- [NUM]:[DEN]
- </panel.string>
- <check_box label="Bubble chat" name="bubble_text_chat"/>
- <color_swatch name="background" tool_tip="Kies kleur voor bubble chat"/>
- <slider label="Opaciteit" name="bubble_chat_opacity"/>
- <text name="AspectRatioLabel1" tool_tip="breedte / hoogte">
- Beeldverhouding
- </text>
- <combo_box name="aspect_ratio" tool_tip="breedte / hoogte">
- <combo_box.item label="4:3 (Standaard beeldbuis)" name="item1"/>
- <combo_box.item label="5:4 (1280x1024 LCD)" name="item2"/>
- <combo_box.item label="8:5 (Breedbeeld)" name="item3"/>
- <combo_box.item label="16:9 (Breedbeeld)" name="item4"/>
- </combo_box>
- <check_box label="Automatisch detecteren" name="aspect_auto_detect"/>
- <text name="heading1">
- Camera:
- </text>
- <slider label="Kijkhoek" name="camera_fov"/>
- <slider label="Afstand" name="camera_offset_scale"/>
- <text name="heading2">
- Automatisch positionering voor:
- </text>
- <check_box label="Maken/Bewerken" name="edit_camera_movement" tool_tip="Gebruik automatische camera positionering bij ingaan en verlaten van Bewerk modus."/>
- <check_box label="Uiterlijk" name="appearance_camera_movement" tool_tip="Gebruik automatische camera positionering wanneer in bewerk modus"/>
- <text name="heading3">
- Avatars:
- </text>
- <check_box label="Toon mij in Muis Modus" name="first_person_avatar_visible"/>
- <check_box label="Pijltjestoetsen bewegen mij altijd" name="arrow_keys_move_avatar_check"/>
- <check_box label="Tik-tik-vasthouden om te rennen" name="tap_tap_hold_to_run"/>
- <check_box label="Beweeg avatar lippen tijdens het praten" name="enable_lip_sync"/>
- <check_box label="Toon script fouten" name="show_script_errors"/>
- <radio_group name="show_location">
- <radio_item label="In chat" name="0"/>
- <radio_item label="In een venster" name="1"/>
- </radio_group>
- <check_box label="Toggle modus voor microfoon wanneer ik de spreek toets indruk:" name="push_to_talk_toggle_check" tool_tip="Wanneer in toggle mode, drukt u éénmaal op de ontspanner toets om de microfoon in-of uitschakelen. Wanneer niet in toggle mode, kan de microfoon uitzendingen uw stem alleen tijdens de ontspanner wordt ingedrukt."/>
- <line_editor label="Push-to-Speak trigger" name="modifier_combo"/>
- <button label="Plaats Toets" name="set_voice_hotkey_button"/>
- <button label="Middelste Muis Knop" name="set_voice_middlemouse_button"/>
-</panel>
diff --git a/indra/newview/skins/default/xui/nl/panel_preferences_alerts.xml b/indra/newview/skins/default/xui/nl/panel_preferences_alerts.xml
deleted file mode 100644
index d3174a703d..0000000000
--- a/indra/newview/skins/default/xui/nl/panel_preferences_alerts.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Pop-ups" name="popups" title="Pop-ups">
- <text name="tell_me_label">
- Vertel mij:
- </text>
- <check_box label="Wanneer ik L$ spendeer of krijg" name="notify_money_change_checkbox"/>
- <check_box label="Wanneer mijn vrienden in- of uit-loggen" name="friends_online_notify_checkbox"/>
- <text name="show_label">
- Toon altijd deze waarschuwingen:
- </text>
- <text name="dont_show_label">
- Toon nooit deze waarschuwingen:
- </text>
-</panel>
diff --git a/indra/newview/skins/default/xui/nl/panel_preferences_chat.xml b/indra/newview/skins/default/xui/nl/panel_preferences_chat.xml
deleted file mode 100644
index 84f385c86b..0000000000
--- a/indra/newview/skins/default/xui/nl/panel_preferences_chat.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Tekst chat" name="chat">
- <radio_group name="chat_font_size">
- <radio_item label="Klein" name="radio"/>
- <radio_item label="Middel" name="radio2"/>
- <radio_item label="Groot" name="radio3"/>
- </radio_group>
- <color_swatch label="U" name="user"/>
- <text name="text_box1">
- U
- </text>
- <color_swatch label="Anderen" name="agent"/>
- <text name="text_box2">
- Anderen
- </text>
- <color_swatch label="IM" name="im"/>
- <text name="text_box3">
- IM
- </text>
- <color_swatch label="Systeem" name="system"/>
- <text name="text_box4">
- Systeem
- </text>
- <color_swatch label="Fouten" name="script_error"/>
- <text name="text_box5">
- Fouten
- </text>
- <color_swatch label="Objecten" name="objects"/>
- <text name="text_box6">
- Objecten
- </text>
- <color_swatch label="Eigenaar" name="owner"/>
- <text name="text_box7">
- Eigenaar
- </text>
- <color_swatch label="URL&apos;s" name="links"/>
- <text name="text_box9">
- URL&apos;s
- </text>
- <check_box initial_value="true" label="Speel typeanimatie tijdens chat" name="play_typing_animation"/>
- <check_box label="Email mij IMs wanneer ik offline ben" name="send_im_to_email"/>
-</panel>
diff --git a/indra/newview/skins/default/xui/nl/panel_preferences_general.xml b/indra/newview/skins/default/xui/nl/panel_preferences_general.xml
deleted file mode 100644
index 7be570b27f..0000000000
--- a/indra/newview/skins/default/xui/nl/panel_preferences_general.xml
+++ /dev/null
@@ -1,90 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Algemeen" name="general_panel">
- <combo_box name="start_location_combo">
- <combo_box.item name="MyHome" tool_tip="Log standaard in op mijn thuislocatie." label="Mijn thuis"/>
- <combo_box.item name="MyLastLocation" tool_tip="Log standaard in op mijn laatste locatie." label="Mijn laatste locatie"/>
- </combo_box>
- <check_box label="Toon startlocatie op loginscherm" name="show_location_checkbox"/>
- <combo_box name="fade_out_combobox">
- <combo_box.item name="Never" label="Nooit"/>
- <combo_box.item name="Show Temporarily" label="Toon tijdelijk"/>
- <combo_box.item name="Always" label="Altijd"/>
- </combo_box>
- <check_box label="Kleine avatarnamen" name="small_avatar_names_checkbox"/>
- <check_box label="Verberg mijn naam op mijn scherm" name="show_my_name_checkbox"/>
- <text name="group_titles_textbox">
- Groepstitels:
- </text>
- <check_box label="Verberg alle groepstitels" name="show_all_title_checkbox"/>
- <check_box label="Verberg mijn groepstitel" name="show_my_title_checkbox"/>
- <color_swatch label="" name="effect_color_swatch" tool_tip="Klik om de kleurkiezer te openen"/>
- <text name="UI Size:">
- UI grootte:
- </text>
- <check_box label="Gebruik resolutie onafhankelijke schaal" name="ui_auto_scale"/>
- <spinner label="Afwezigheidtijdsduur:" name="afk_timeout_spinner"/>
- <check_box label="Waarschuwen wanneer L$ worden uitgegeven of ontvangen" name="notify_money_change_checkbox"/>
- <text name="maturity_desired_label">
- Inhoudscategorie:
- </text>
- <text name="maturity_desired_prompt">
- Ik wil toegang tot inhoud die is beoordeeld als:
- </text>
- <combo_box name="maturity_desired_combobox">
- <combo_box.item name="Desired_Adult" label="PG, Mature en Adult"/>
- <combo_box.item name="Desired_Mature" label="PG en Mature"/>
- <combo_box.item name="Desired_PG" label="PG"/>
- </combo_box>
- <text name="maturity_desired_textbox">
- PG
- </text>
- <text name="start_location_textbox">
- Startlocatie:
- </text>
- <text name="show_names_textbox">
- Toon namen:
- </text>
- <text name="effects_color_textbox">
- Kleur voor mijn effecten:
- </text>
- <text name="seconds_textbox">
- seconden
- </text>
- <text name="crash_report_textbox">
- Crash rapporten:
- </text>
- <text name="language_textbox">
- Taal:
- </text>
- <text name="language_textbox2">
- (Vereist herstart)
- </text>
- <string name="region_name_prompt">
- &lt; Type regionaam &gt;
- </string>
- <combo_box name="crash_behavior_combobox">
- <combo_box.item name="Askbeforesending" label="Vraag voor verzenden"/>
- <combo_box.item name="Alwayssend" label="Altijd verzenden"/>
- <combo_box.item name="Neversend" label="Nooit verzenden"/>
- </combo_box>
- <combo_box name="language_combobox">
- <combo_box.item name="System Default Language" label="Systeemstandaard"/>
- <combo_box.item name="English" label="Engels (English)"/>
- <combo_box.item name="Danish" label="Dansk (Deens) - Bèta"/>
- <combo_box.item name="Deutsch(German)" label="Deutsch (Duits) - Bèta"/>
- <combo_box.item name="Spanish" label="Español (Spaans) - Bèta"/>
- <combo_box.item name="French" label="Français (Frans) - Bèta"/>
- <combo_box.item name="Italian" label="Italiano (Italiaans) - Bèta"/>
- <combo_box.item name="Hungarian" label="Magyar (Hongaars) - Bèta"/>
- <combo_box.item name="Dutch" label="Nederlands - Bèta"/>
- <combo_box.item name="Polish" label="Polski (Pools) - Bèta"/>
- <combo_box.item name="Portugese" label="Português (Portugees) - Bèta"/>
- <combo_box.item name="Russian" label="РуÑÑкий (Russisch) - Bèta"/>
- <combo_box.item name="Turkish" label="Türkçe (Turks) - Bèta"/>
- <combo_box.item name="Ukrainian" label="УкраїнÑька (Oekraïens) - Bèta"/>
- <combo_box.item name="Chinese" label="中文 (简体) (Chinees) - Bèta"/>
- <combo_box.item name="(Japanese)" label="日本語 (Japans) - Bèta"/>
- <combo_box.item name="(Korean)" label="한국어 (Koreaans) - Bèta"/>
- </combo_box>
- <check_box label="Deel taal met objecten" name="language_is_public" tool_tip="Dit laat in-wereld objecten uw voorkeurstaal weten."/>
-</panel>
diff --git a/indra/newview/skins/default/xui/nl/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/nl/panel_preferences_graphics1.xml
deleted file mode 100644
index 8f4244e222..0000000000
--- a/indra/newview/skins/default/xui/nl/panel_preferences_graphics1.xml
+++ /dev/null
@@ -1,145 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Grafisch" name="Display panel">
- <button label="?" name="GraphicsPreferencesHelpButton"/>
- <check_box label="Voer Second Life uit in een venster" name="windowed mode"/>
- <text_editor name="FullScreenInfo" bottom="-56" height="40" width="480">
- Wanneer niet aangevinkt, zal de viewer in volledig-scherm modus getoond worden wanneer u inlogt.
- </text_editor>
- <text name="WindowSizeLabel">
- Venstergrootte:
- </text>
- <combo_box name="windowsize combo" left="115" >
- <combo_box.item name="640x480" label="640x480"/>
- <combo_box.item name="800x600" label="800x600"/>
- <combo_box.item name="720x480" label="720x480 (NTSC)"/>
- <combo_box.item name="768x576" label="768x576 (PAL)"/>
- <combo_box.item name="1024x768" label="1024x768"/>
- </combo_box>
- <text name="DisplayResLabel" width="100">
- Weergaveresolutie:
- </text>
- <combo_box left="115" name="fullscreen combo" />
- <text name="AspectRatioLabel1" tool_tip="breedte / hoogte" width="100">
- Beeldverhouding:
- </text>
- <combo_box name="aspect_ratio" tool_tip="breedte / hoogte" left="115" >
- <combo_box.item name="4:3(StandardCRT)" label="4:3 (Standaard beeldbuis)"/>
- <combo_box.item name="5:4(1280x1024LCD)" label="5:4 (1280x1024 LCD)"/>
- <combo_box.item name="8:5(Widescreen)" label="8:5 (Breedbeeld)"/>
- <combo_box.item name="16:9(Widescreen)" label="16:9 (Breedbeeld)"/>
- </combo_box>
- <check_box label="Verhouding automatisch detecteren" name="aspect_auto_detect" left="275" />
- <text name="HigherText">
- Kwaliteit en
- </text>
- <text name="QualityText">
- Prestatie:
- </text>
- <text name="FasterText">
- Sneller
- </text>
- <text name="ShadersPrefText">
- Laag
- </text>
- <text name="ShadersPrefText2">
- Middel
- </text>
- <text name="ShadersPrefText3">
- Hoog
- </text>
- <text name="ShadersPrefText4">
- Ultra
- </text>
- <text name="HigherText2">
- Hogere
- </text>
- <text name="QualityText2">
- Kwaliteit
- </text>
- <check_box label="Aangepast" name="CustomSettings"/>
- <panel name="CustomGraphics Panel">
- <text name="ShadersText">
- Shaders:
- </text>
- <check_box label="Bump mapping en glans" name="BumpShiny"/>
- <check_box label="Basis shaders" name="BasicShaders" tool_tip="Het uitschakelen van deze optie kan voorkomen dat sommige drivers voor grafische kaarten crashen."/>
- <check_box label="Atmosferische shaders" name="WindLightUseAtmosShaders"/>
- <check_box label="Waterreflecties" name="Reflections"/>
- <text name="ReflectionDetailText">
- Reflectiedetail:
- </text>
- <radio_group name="ReflectionDetailRadio">
- <radio_item name="0" label="Terrein en bomen" />
- <radio_item name="1" label="Alle statische objecten" />
- <radio_item name="2" label="Alle avatars en objecten" />
- <radio_item name="3" label="Alles" />
- </radio_group>
- <text name="AvatarRenderingText">
- Avatarweergave:
- </text>
- <check_box label="Avatar schimmen" name="AvatarImpostors"/>
- <check_box label="Hardware Skinning" name="AvatarVertexProgram"/>
- <check_box label="Avatar kleding" name="AvatarCloth"/>
- <text name="DrawDistanceMeterText1">
- m
- </text>
- <text name="DrawDistanceMeterText2">
- m
- </text>
- <slider label="Zichtbereik:" name="DrawDistance"/>
- <slider label="Max. aantal particles:" name="MaxParticleCount"/>
- <slider label="Nabewerkingskwaliteit:" name="RenderPostProcess"/>
- <text name="MeshDetailText">
- Maasdetail:
- </text>
- <slider label=" Objecten:" name="ObjectMeshDetail"/>
- <slider label=" Flexibele prims:" name="FlexibleMeshDetail"/>
- <slider label=" Bomen:" name="TreeMeshDetail"/>
- <slider label=" Avatars:" name="AvatarMeshDetail"/>
- <slider label=" Terrein:" name="TerrainMeshDetail"/>
- <slider label=" Lucht:" name="SkyMeshDetail"/>
- <text name="PostProcessText">
- Laag
- </text>
- <text name="ObjectMeshDetailText">
- Laag
- </text>
- <text name="FlexibleMeshDetailText">
- Laag
- </text>
- <text name="TreeMeshDetailText">
- Laag
- </text>
- <text name="AvatarMeshDetailText">
- Laag
- </text>
- <text name="TerrainMeshDetailText">
- Laag
- </text>
- <text name="SkyMeshDetailText">
- Laag
- </text>
- <text name="LightingDetailText">
- Lichtdetail:
- </text>
- <radio_group name="LightingDetailRadio">
- <radio_item name="SunMoon" label="Alleen zon en maan" />
- <radio_item name="LocalLights" label="Lokale lichten in de buurt" />
- </radio_group>
- <text name="TerrainDetailText">
- Terreindetail:
- </text>
- <radio_group name="TerrainDetailRadio">
- <radio_item name="0" label="Laag" />
- <radio_item name="2" label="Hoog" />
- </radio_group>
- </panel>
- <button label="Aanbevolen instellingen" name="Defaults"/>
- <button label="Hardware opties" label_selected="Hardware opties" name="GraphicsHardwareButton"/>
- <panel.string name="resolution_format">
- [RES_X] x [RES_Y]
- </panel.string>
- <panel.string name="aspect_ratio_text">
- [NUM]:[DEN]
- </panel.string>
-</panel>
diff --git a/indra/newview/skins/default/xui/nl/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/nl/panel_preferences_privacy.xml
deleted file mode 100644
index c2014bf0cb..0000000000
--- a/indra/newview/skins/default/xui/nl/panel_preferences_privacy.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Communicatie" name="im">
- <text name="text_box">
- Mijn online status:
- </text>
- <check_box left="140" label="Allen mijn vrienden en groepen kunnen zien wanneer ik online ben" name="online_visibility"/>
- <text name="text_box2">
- IM opties:
- </text>
- <string name="log_in_to_change">
- log in om te wijzigen
- </string>
- <check_box left="140" label="Stuur IM naar Email ([EMAIL])" name="send_im_to_email"/>
- <check_box left="140" label="Voeg IM toe in chatconsole" name="include_im_in_chat_console"/>
- <check_box left="140" label="Toon tijdstempels in IM" name="show_timestamps_check"/>
- <check_box left="140" label="Toon melding bij vriend online" name="friends_online_notify_checkbox"/>
- <text name="text_box3">
- Antwoord bij
-Niet Storen:
- </text>
- <text name="text_box4">
- Log opties:
- </text>
- <check_box label="Bewaar een log van IM op mijn computer" name="log_instant_messages"/>
- <check_box label="Toon tijdstempels in IM-log" name="log_instant_messages_timestamp"/>
- <check_box label="Toon het einde van de laatste IM conversatie" name="log_show_history"/>
- <check_box label="Bewaar een log van lokale chat op mijn computer" name="log_chat"/>
- <check_box label="Toon tijdstempels in lokale chatlog" name="log_chat_timestamp"/>
- <check_box label="Toon binnenkomende IM in lokale chatlog" name="log_chat_IM"/>
- <check_box label="Voeg datum toe aan tijdstempels" name="log_date_timestamp"/>
- <button label="Wijzig pad" label_selected="Wijzig pad" name="log_path_button"/>
-</panel>
diff --git a/indra/newview/skins/default/xui/nl/panel_preferences_setup.xml b/indra/newview/skins/default/xui/nl/panel_preferences_setup.xml
deleted file mode 100644
index f9f58befe8..0000000000
--- a/indra/newview/skins/default/xui/nl/panel_preferences_setup.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Invoer &amp; Camera" name="Input panel">
- <text name=" Mouselook Options:">
- Mouselook opties:
- </text>
- <text name=" Mouse Sensitivity:">
- Muis gevoeligheid:
- </text>
- <check_box label="Muisbeweging omkeren" name="invert_mouse"/>
- <text name=" Auto Fly Options:">
- Automatisch vliegen
-opties:
- </text>
- <check_box label="Vlieg/Land bij indrukken Page Up/Page Down" name="automatic_fly"/>
- <text name=" Camera Options:">
- Camera opties:
- </text>
- <text name="camera_fov_label">
- Camera Zichthoek
- </text>
- <text name="Camera Follow Distance:">
- Camera volgafstand:
- </text>
- <check_box label="Automatische camerabeweging bij bewerken" name="edit_camera_movement" tool_tip="Gebruik automatische camerapositionering bij het betreden en verlaten van de bewerken modus"/>
- <check_box label="Automatische camerabeweging bij uiterlijk bewerken" name="appearance_camera_movement" tool_tip="Gebruik automatische camerapositionering in de bewerken modus"/>
- <text name="text2">
- Avatar weergave opties:
- </text>
- <check_box label="Toon avatar in mouselook" name="first_person_avatar_visible"/>
- <button label="Joystick instellingen" name="joystick_setup_button"/>
-</panel>
diff --git a/indra/newview/skins/default/xui/nl/panel_preferences_sound.xml b/indra/newview/skins/default/xui/nl/panel_preferences_sound.xml
deleted file mode 100644
index 2b709bde40..0000000000
--- a/indra/newview/skins/default/xui/nl/panel_preferences_sound.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Geluid" name="Preference Media panel">
- <slider label="Hoofd volume" name="System Volume"/>
- <check_box initial_value="true" label="Dempen indien geminimaliseerd" name="mute_when_minimized"/>
- <slider label="Omliggend" name="Wind Volume"/>
- <slider label="Knoppen" name="UI Volume"/>
- <slider label="Media" name="Media Volume"/>
- <slider label="Geluids effecten" name="SFX Volume"/>
- <slider label="Streamen van muziek" name="Music Volume"/>
- <check_box label="Voice" name="enable_voice_check"/>
- <slider label="Voice" name="Voice Volume"/>
- <text name="Listen from">
- Luisteren vanuit:
- </text>
- <radio_group name="ear_location">
- <radio_item label="Camera positie" name="0"/>
- <radio_item label="Avatar positie" name="1"/>
- </radio_group>
- <button label="Input/Output Apparaten" name="device_settings_btn"/>
- <panel label="Apparaat Instellingen" name="device_settings_panel">
- <panel.string name="default_text">
- Standaard
- </panel.string>
- <text name="Input">
- Input
- </text>
- <text name="My volume label">
- Mijn volume:
- </text>
- <slider_bar initial_value="1.0" name="mic_volume_slider" tool_tip="Verander de volume door gebruik te nemen van deze schuifknop"/>
- <text name="wait_text">
- Even geduld
- </text>
- <text name="Output">
- Output
- </text>
- </panel>
-</panel>
diff --git a/indra/newview/skins/default/xui/nl/panel_region_covenant.xml b/indra/newview/skins/default/xui/nl/panel_region_covenant.xml
deleted file mode 100644
index adfc62dd22..0000000000
--- a/indra/newview/skins/default/xui/nl/panel_region_covenant.xml
+++ /dev/null
@@ -1,84 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Convenant" name="Covenant">
- <text name="estate_section_lbl">
- Estate:
- </text>
- <text name="estate_name_lbl">
- Naam:
- </text>
- <text name="estate_name_text">
- mainland
- </text>
- <text name="estate_owner_lbl">
- Eigenaar:
- </text>
- <text name="estate_owner_text">
- (geen)
- </text>
- <text name="estate_cov_lbl">
- Convenant:
- </text>
- <text name="covenant_timestamp_text">
- Laatst gewijzigd Wed Dec 31 16:00:00 1969
- </text>
- <button label="?" name="covenant_help"/>
- <text_editor name="covenant_editor" bottom="-247" height="162">
- Er is geen convenant voor deze estate.
- </text_editor>
- <button label="Opnieuw instellen" name="reset_covenant" right="460" width="110"/>
- <text name="covenant_help_text" bottom="-25">
- Wijzigingen in het convenant zullen in alle percelen van het estate
- zichtbaar zijn.
- </text>
- <text name="covenant_instructions" bottom_delta="-36" >
- Sleep en deponeer een notitiekaart om het convenant voor deze
- estate te wijzigen.
- </text>
- <text name="region_section_lbl" bottom_delta="-36" >
- Regio:
- </text>
- <text name="region_name_lbl">
- Naam:
- </text>
- <text name="region_name_text">
- leyla
- </text>
- <text name="region_landtype_lbl">
- Type:
- </text>
- <text name="region_landtype_text">
- Mainland / Homestead
- </text>
- <text name="region_maturity_lbl">
- Inhoudscategorie:
- </text>
- <text name="region_maturity_text">
- Adult
- </text>
- <text name="resellable_lbl">
- Doorverkopen:
- </text>
- <text name="resellable_clause">
- Land in deze regio mag niet worden doorverkocht.
- </text>
- <text name="changeable_lbl">
- Opsplitsen:
- </text>
- <text name="changeable_clause">
- Land in deze regio mag niet worden samengevoegd/opgesplitst.
- </text>
- <string name="can_resell">
- Aangekocht land in deze regio mag worden doorverkocht.
- </string>
- <string name="can_not_resell">
- Aangekocht land in deze regio mag niet worden doorverkocht.
- </string>
- <string name="can_change">
- Aangekocht land in deze regio mag worden gecombineerd of
-opgedeeld.
- </string>
- <string name="can_not_change">
- Aangekocht land in deze regio mag niet worden gecombineerd
-of opgedeeld.
- </string>
-</panel>
diff --git a/indra/newview/skins/default/xui/nl/panel_region_debug.xml b/indra/newview/skins/default/xui/nl/panel_region_debug.xml
deleted file mode 100644
index 9fad8e478a..0000000000
--- a/indra/newview/skins/default/xui/nl/panel_region_debug.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Debug" name="Debug">
- <text name="region_text_lbl">
- Regio:
- </text>
- <text name="region_text">
- onbekend
- </text>
- <check_box label="Schakel scripts uit" name="disable_scripts_check" tool_tip="Schakel alle scripts in deze regio uit"/>
- <button label="?" name="disable_scripts_help"/>
- <check_box label="Schakel botsingen uit" name="disable_collisions_check" tool_tip="Schakel alle niet-avatar botsingen in deze regio uit"/>
- <button label="?" name="disable_collisions_help"/>
- <check_box label="Fysiek uitschakelen" name="disable_physics_check" tool_tip="Alle fysiek in deze regio uitschakelen"/>
- <button label="?" name="disable_physics_help"/>
- <button label="Toepassen" name="apply_btn"/>
- <text name="objret_text_lbl">
- Object retourneren
- </text>
- <text name="resident_text_lbl">
- Inwoner:
- </text>
- <line_editor name="target_avatar_name">
- (none)
- </line_editor>
- <button label="Kies..." name="choose_avatar_btn"/>
- <text name="options_text_lbl">
- Opties:
- </text>
- <check_box label="Retourneer alleen objecten die scripts bevatten." name="return_scripts" tool_tip="Retourneer alleen objecten met scripts."/>
- <check_box label="Retourneer alleen die objecten op het land van iemand anders" name="return_other_land" tool_tip="Retourneer alleen objecten die zich op land bevinden dat aan iemand anders toebehoort"/>
- <check_box label="Retourneer objecten in alle regio&apos;s van dit estate" name="return_estate_wide" tool_tip="Retourneer objecten in alle regio&apos;s van dit estate"/>
- <button label="Retourneren" name="return_btn"/>
- <button label="Toon top botsingen..." name="top_colliders_btn" tool_tip="Lijst met objecten die de meeste mogelijke botsingen ondergaan"/>
- <button label="?" name="top_colliders_help"/>
- <button label="Toon top scripts..." name="top_scripts_btn" tool_tip="Lijst met objecten die de meeste tijd besteden met het uitvoeren van scripts"/>
- <button label="?" name="top_scripts_help"/>
- <button label="Herstart regio" name="restart_btn" tool_tip="Geef een 2 minuten afteltijd en herstart de regio."/>
- <button label="?" name="restart_help"/>
- <button label="Vertraag herstart" name="cancel_restart_btn" tool_tip="Vertraag herstart met een uur"/>
-</panel>
diff --git a/indra/newview/skins/default/xui/nl/panel_region_estate.xml b/indra/newview/skins/default/xui/nl/panel_region_estate.xml
deleted file mode 100644
index 08b68c8d30..0000000000
--- a/indra/newview/skins/default/xui/nl/panel_region_estate.xml
+++ /dev/null
@@ -1,70 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Estate" name="Estate">
- <text name="estate_help_text">
- Wijzigingen van instellingen op dit tabblad
-zullen alle regio&apos;s in de estate beïnvloeden.
- </text>
- <text name="estate_text">
- Estate:
- </text>
- <text name="estate_name">
- (onbekend)
- </text>
- <text name="owner_text">
- Eigenaar:
- </text>
- <text name="estate_owner">
- (onbekend)
- </text>
- <check_box label="Gebruik globale tijd" name="use_global_time_check"/>
- <button label="?" name="use_global_time_help"/>
- <check_box label="Vaste zon" name="fixed_sun_check"/>
- <button label="?" name="fixed_sun_help"/>
- <slider label="Fase" name="sun_hour_slider"/>
- <check_box label="Publieke toegang toestaan" name="externally_visible_check"/>
- <button label="?" name="externally_visible_help"/>
- <text name="Only Allow">
- Beperk toegang tot:
- </text>
- <check_box label="Inwoners met betalingsinformatie opgeslagen" name="limit_payment" tool_tip="Verban ongeïdentificeerde inwoners."/>
- <check_box label="Leeftijdgeverifieerde volwassenen" name="limit_age_verified" tool_tip="Verban inwoners die hun leeftijd niet geverifieerd hebben. Zie support.secondlife.com voor meer informatie." bottom_delta="-30"/>
- <check_box label="Voice chat toestaan" name="voice_chat_check"/>
- <button label="?" name="voice_chat_help"/>
- <check_box label="Directe teleport toestaan" name="allow_direct_teleport"/>
- <button label="?" name="allow_direct_teleport_help"/>
- <text name="abuse_email_text" bottom_delta="-23">
- Misbruik e-mail adres:
- </text>
- <line_editor bottom_delta="-14" name="abuse_email_address" />
- <string name="email_unsupported">
- Optie niet ondersteund
- </string>
- <button label="?" name="abuse_email_address_help"/>
- <button label="Toepassen" name="apply_btn" bottom_delta="-22"/>
- <button label="Gebruiker verwijderen van estate..." name="kick_user_from_estate_btn"/>
- <button label="Zend bericht naar estate..." name="message_estate_btn"/>
- <text name="estate_manager_label">
- Estate beheerders:
- </text>
- <button label="?" name="estate_manager_help"/>
- <button label="Verwijderen..." name="remove_estate_manager_btn"/>
- <button label="Toevoegen..." name="add_estate_manager_btn"/>
- <text name="allow_resident_label">
- Toegestane inwoners:
- </text>
- <button label="?" name="allow_resident_help"/>
- <button label="Verwijderen..." name="remove_allowed_avatar_btn"/>
- <button label="Toevoegen..." name="add_allowed_avatar_btn"/>
- <text name="allow_group_label">
- Toegestane groepen
- </text>
- <button label="?" name="allow_group_help"/>
- <button label="Verwijderen..." name="remove_allowed_group_btn"/>
- <button label="Toevoegen..." name="add_allowed_group_btn"/>
- <text name="ban_resident_label">
- Verbannen inwoners:
- </text>
- <button label="?" name="ban_resident_help"/>
- <button label="Verwijderen..." name="remove_banned_avatar_btn"/>
- <button label="Toevoegen..." name="add_banned_avatar_btn"/>
-</panel>
diff --git a/indra/newview/skins/default/xui/nl/panel_region_general.xml b/indra/newview/skins/default/xui/nl/panel_region_general.xml
deleted file mode 100644
index 74480ed0a4..0000000000
--- a/indra/newview/skins/default/xui/nl/panel_region_general.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Regio" name="General">
- <text name="region_text_lbl">
- Regio:
- </text>
- <text name="region_text">
- onbekend
- </text>
- <text name="version_channel_text_lbl">
- Versie:
- </text>
- <text name="version_channel_text">
- onbekend
- </text>
- <text name="region_type_lbl">
- Type:
- </text>
- <text name="region_type">
- onbekend
- </text>
- <check_box label="Blokkeer terreinbewerking" name="block_terraform_check"/>
- <button label="?" name="terraform_help"/>
- <check_box label="Blokkeer vliegen" name="block_fly_check"/>
- <button label="?" name="fly_help"/>
- <check_box label="Letsel toestaan" name="allow_damage_check"/>
- <button label="?" name="damage_help"/>
- <check_box label="Duwen Uitschakelen" name="restrict_pushobject"/>
- <button label="?" name="restrict_pushobject_help"/>
- <check_box label="Landverkoop toestaan" name="allow_land_resell_check"/>
- <button label="?" name="land_resell_help"/>
- <check_box label="Samenvoegen/opsplitsen land toestaan" name="allow_parcel_changes_check"/>
- <button label="?" name="parcel_changes_help" left="240"/>
- <check_box label="Blokkeer zichtbaarheid land in zoeken" name="block_parcel_search_check" tool_tip="Laat mensen deze regio en zijn percelen in zoekresultaten zien"/>
- <button label="?" name="parcel_search_help" left="240"/>
- <spinner label="Agent limiet" name="agent_limit_spin"/>
- <button label="?" name="agent_limit_help"/>
- <spinner label="Object bonus" name="object_bonus_spin"/>
- <button label="?" name="object_bonus_help"/>
- <text label="Volwassenheid" name="access_text">
- Inhoudscategorie:
- </text>
- <combo_box label="Mature" name="access_combo">
- <combo_box.item label="Adult" name="Adult"/>
- <combo_box.item label="Mature" name="Mature"/>
- <combo_box.item label="PG" name="PG"/>
- </combo_box>
- <button label="?" name="access_help"/>
- <button label="Toepassen" name="apply_btn"/>
- <button label="Teleport één gebruiker naar thuislocatie…" name="kick_btn"/>
- <button label="Teleport alle gebruikers naar thuislocatie…" name="kick_all_btn"/>
- <button label="Zend bericht naar regio…" name="im_btn"/>
- <button label="Beheer telehub…" name="manage_telehub_btn"/>
-</panel>
diff --git a/indra/newview/skins/default/xui/nl/panel_region_terrain.xml b/indra/newview/skins/default/xui/nl/panel_region_terrain.xml
deleted file mode 100644
index a79bcc0eb5..0000000000
--- a/indra/newview/skins/default/xui/nl/panel_region_terrain.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Terrein" name="Terrain">
- <text name="region_text_lbl">
- Regio:
- </text>
- <text name="region_text">
- onbekend
- </text>
- <spinner label="Waterhoogte" name="water_height_spin"/>
- <button label="?" name="water_height_help"/>
- <spinner label="Terrein verhooglimiet" name="terrain_raise_spin"/>
- <button label="?" name="terrain_raise_help"/>
- <spinner label="Terrein verlaaglimiet" name="terrain_lower_spin"/>
- <button label="?" name="terrain_lower_help"/>
- <check_box label="Gebruik estate zon" name="use_estate_sun_check"/>
- <button label="?" name="use_estate_sun_help"/>
- <check_box label="Vaste zon" name="fixed_sun_check"/>
- <button label="?" name="fixed_sun_help"/>
- <slider label="Fase" name="sun_hour_slider"/>
- <button label="Toepassen" name="apply_btn"/>
- <button label="Download RAW terrein..." name="download_raw_btn" tool_tip="Alleen beschikbaar voor estate-eigenaren, niet beheerders"/>
- <button label="?" name="download_raw_help"/>
- <button label="Upload RAW terrein..." name="upload_raw_btn" tool_tip="Alleen beschikbaar voor estate-eigenaren, niet beheerders"/>
- <button label="?" name="upload_raw_help"/>
- <button label="Bake terrein" name="bake_terrain_btn" tool_tip="Huidig terrein instellen als middelpunt voor verhoog/verlaag limieten"/>
- <button label="?" name="bake_terrain_help"/>
-</panel>
diff --git a/indra/newview/skins/default/xui/nl/panel_region_texture.xml b/indra/newview/skins/default/xui/nl/panel_region_texture.xml
deleted file mode 100644
index ff10e20b7c..0000000000
--- a/indra/newview/skins/default/xui/nl/panel_region_texture.xml
+++ /dev/null
@@ -1,57 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Grond texturen" name="Textures">
- <text name="region_text_lbl">
- Regio:
- </text>
- <text name="region_text">
- onbekend
- </text>
- <text name="detail_texture_text">
- Terreintexturen (vereist 512x512, 24 bit .tga bestanden)
- </text>
- <text name="height_text_lbl">
- 1 (Laag)
- </text>
- <text name="height_text_lbl2">
- 2
- </text>
- <text name="height_text_lbl3">
- 3
- </text>
- <text name="height_text_lbl4">
- 4 (Hoog)
- </text>
- <text name="height_text_lbl5">
- Textuur hoogtebereiken
- </text>
- <text name="height_text_lbl6">
- Zuidwest
- </text>
- <text name="height_text_lbl7">
- Noordwest
- </text>
- <text name="height_text_lbl8">
- Zuidoost
- </text>
- <text name="height_text_lbl9">
- Noordoost
- </text>
- <spinner label="Laag" name="height_start_spin_0"/>
- <spinner label="Laag" name="height_start_spin_1"/>
- <spinner label="Laag" name="height_start_spin_2"/>
- <spinner label="Laag" name="height_start_spin_3"/>
- <spinner label="Hoog" name="height_range_spin_0"/>
- <spinner label="Hoog" name="height_range_spin_1"/>
- <spinner label="Hoog" name="height_range_spin_2"/>
- <spinner label="Hoog" name="height_range_spin_3"/>
- <text name="height_text_lbl10">
- Deze waardes vertegenwoordigen het mengbereik voor bovenstaande texturen.
- </text>
- <text name="height_text_lbl11">
- Gemeten in meters, is de LOW waarde de MAXIMUM hoogte van textuur #1,
- </text>
- <text name="height_text_lbl12">
- en de HIGH waarde is de MINIMUM hoogte van textuur #4.
- </text>
- <button label="Toepassen" name="apply_btn"/>
-</panel>
diff --git a/indra/newview/skins/default/xui/nl/panel_scrolling_param.xml b/indra/newview/skins/default/xui/nl/panel_scrolling_param.xml
deleted file mode 100644
index 8487ff999a..0000000000
--- a/indra/newview/skins/default/xui/nl/panel_scrolling_param.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="LLScrollingPanelParam">
- <text name="Loading...">
- Laden...
- </text>
- <text name="Loading...2">
- Laden...
- </text>
- <slider label="[DESC]" name="param slider"/>
-</panel>
diff --git a/indra/newview/skins/default/xui/nl/panel_status_bar.xml b/indra/newview/skins/default/xui/nl/panel_status_bar.xml
deleted file mode 100644
index 1d68d25f66..0000000000
--- a/indra/newview/skins/default/xui/nl/panel_status_bar.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="status">
- <text name="ParcelNameText" tool_tip="Naam van het landperceel waar u staat. Klik voor &apos;Over land&apos;.">
- Hier komt de naam van het perceel
- </text>
- <text name="BalanceText" tool_tip="Account saldo">
- Laden...
- </text>
- <button label="" label_selected="" name="buycurrency" tool_tip="Koop valuta"/>
- <text name="TimeText" tool_tip="Huidige tijd (Pacifisch)">
- -3
- </text>
- <string name="StatBarDaysOfWeek">
- Zondag:Maandag:Dinsdag:Woensdag:Donderdag:Vrijdag:Zaterdag
- </string>
- <string name="StatBarMonthsOfYear">
- Januari:Februari:Maart:April:Mei:Juni:Juli:Augustus:September:Oktober:November:December
- </string>
- <button label="" label_selected="" name="scriptout" tool_tip="Script waarschuwingen en fouten"/>
- <button label="" label_selected="" name="health" tool_tip="Letsel"/>
- <text name="HealthText" tool_tip="Letsel">
- 1
- </text>
- <button label="" label_selected="" name="no_fly" tool_tip="Vliegen niet toegestaan"/>
- <button label="" label_selected="" name="no_build" tool_tip="Bouwen/rezzen niet toegestaan"/>
- <button label="" label_selected="" name="no_scripts" tool_tip="Scripts niet toegestaan"/>
- <button label="" label_selected="" name="restrictpush" tool_tip="Niet duwen"/>
- <button label="" label_selected="" name="status_no_voice" tool_tip="Voice is niet beschikbaar hier"/>
- <button label="" label_selected="" name="buyland" tool_tip="Koop dit perceel"/>
- <line_editor label="Zoeken" name="search_editor" tool_tip="Doorzoek [SECOND_LIFE]"/>
- <button label="" label_selected="" name="search_btn" tool_tip="Doorzoek [SECOND_LIFE]"/>
- <string name="packet_loss_tooltip">
- Pakketten verlies
- </string>
- <string name="bandwidth_tooltip">
- Bandbreedte
- </string>
-</panel>
diff --git a/indra/newview/skins/default/xui/nl/panel_world_map.xml b/indra/newview/skins/default/xui/nl/panel_world_map.xml
deleted file mode 100644
index d9a0b66fbc..0000000000
--- a/indra/newview/skins/default/xui/nl/panel_world_map.xml
+++ /dev/null
@@ -1,57 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="world_map">
- <panel.string name="Loading">
- Laden...
- </panel.string>
- <panel.string name="InvalidLocation">
- Ongeldige Locatie
- </panel.string>
- <panel.string name="world_map_north">
- N
- </panel.string>
- <panel.string name="world_map_east">
- O
- </panel.string>
- <panel.string name="world_map_west">
- W
- </panel.string>
- <panel.string name="world_map_south">
- Z
- </panel.string>
- <panel.string name="world_map_southeast">
- ZO
- </panel.string>
- <panel.string name="world_map_northeast">
- NO
- </panel.string>
- <panel.string name="world_map_southwest">
- ZW
- </panel.string>
- <panel.string name="world_map_northwest">
- NW
- </panel.string>
- <text label="N" name="floater_map_north" text="N">
- N
- </text>
- <text label="O" name="floater_map_east" text="O">
- O
- </text>
- <text label="W" name="floater_map_west" text="W">
- W
- </text>
- <text label="Z" name="floater_map_south" text="Z">
- Z
- </text>
- <text label="ZO" name="floater_map_southeast" text="ZO">
- ZO
- </text>
- <text label="NO" name="floater_map_northeast" text="NO">
- NO
- </text>
- <text label="ZW" name="floater_map_southwest" text="ZW">
- ZW
- </text>
- <text label="NW" name="floater_map_northwest" text="NW">
- NW
- </text>
-</panel>
diff --git a/indra/newview/skins/default/xui/nl/role_actions.xml b/indra/newview/skins/default/xui/nl/role_actions.xml
deleted file mode 100644
index 1f0a6e4235..0000000000
--- a/indra/newview/skins/default/xui/nl/role_actions.xml
+++ /dev/null
@@ -1,76 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<role_actions>
- <action_set description="Deze Mogelijkheden regelen het toevoegen en verwijderen van Groepsleden, en om aan te geven dat nieuwe Leden lid kunnen worden zonder uitnodiging." name="Membership">
- <action description="Personen uitnodigen voor deze Groep" longdescription="Personen uitnodigen voor deze Groep door de 'Uitnodigen Nieuwe Leden...' knop in de leden &amp; Rollen tab &gt; Leden sub-tab." name="member invite"/>
- <action description="Leden uit deze Groep zetten" longdescription="Leden uit deze Groep zetten door de 'Uit Groep Zetten' knop in de leden tab &amp; Rollen tab &gt; Leden sub-tab. Een Eigenaar kan iedereen uit de groep zetten behalve een andere Eigenaar. Als je geen Eigenaar bent, kan een Lid worden uitgezet als, en alleen als, het Lid deel uitmaakt van de Iedereen Rol, en NIET van andere Rollen. Om Leden uit Rollen te verwijderen, moet je de 'Leden uit Rollen Verwijderen' mogelijkheid hebben." name="member eject"/>
- <action description="Selecteer 'Vrije Toegang' en wijzig 'Contibutie Bijdrage'" longdescription="Selecteer 'Vrije Toegang' zodat nieuwe Leden lid kunnen worden zonder uitnodiging, en wijzig 'Contributie Bijdrage' in de Groep Voorkeuren sectie van de Algemene tab." name="member options"/>
- </action_set>
- <action_set description="Deze Mogelijkheden regelen het toevoegen, verwijderen, en wijzigen van Groepsrollen, toevoegen en verwijderen van Leden in Rollen, en toewijzen van Mogelijkheden aan Rollen." name="Roles">
- <action description="Creëren nieuwe Rollen" longdescription="Creëren nieuwe Rollen in de Leden &amp; Rollen tab &gt; Rollen sub-tab." name="role create"/>
- <action description="Verwijderen Rollen" longdescription="Verwijderen Rollen in de Leden &amp; Rollen tab &gt; Rollen sub-tab." name="role delete"/>
- <action description="Wijzigen Rol-naam, titel, beschrijving, en of de Rol leden publiekelijk zichtbaar zijn" longdescription="Wijzigen Rol-naam, titel, beschrijving, en of de Rol leden publiekelijk zichtbaar zijn. Dit kan worden gedaan onderaan de de Leden &amp; Rollen tab &gt; Rollen sub-tab na de selectie van een rol." name="role properties"/>
- <action description="Toewijzen Leden aan Toewijzers Rollen" longdescription="Toewijzen Leden aan Rollen in de Toegewezen Rollen sectie van de Leden &amp; Rol tab &gt; Leden sub-tab. Een Lid met deze Mogelijkheid kan alleen Leden toevoegen aan een Rol waartoe men zelf al behoort." name="role assign member limited"/>
- <action description="Toewijzen Leden aan Alle Rollen" longdescription="Toewijzen van Leden aan Alle Rollen in the Toegewezen Rollen sectie van de Leden &amp; Rollen tab &gt; Leden sub-tab. *WAARSCHUWING* Ieder Lid in een Rol met deze Mogelijkheid kan zichzelf--en ieder ander niet-Eigenaar Lid--toewijzen aan rollen met meer rechten dan zijzelf op dat moment hebben, hierdoor ontstaat de mogelijkheid om zichzelf bijna-Eigenaar rechten toewijzen. Wees er zeker van en controleer voordat deze Mogelijkheid wordt toegekend." name="role assign member"/>
- <action description="Verwijderen Leden uit Rollen" longdescription="Verwijderen Leden uit Rollen in the Toegewezen Rollen sectie van de Leden &amp; Rollen tab &gt; Leden sub-tab. Eigenaars kunnen niet worcen verwijderd." name="role remove member"/>
- <action description="Toewijzen en Verwijderen Mogelijkheden in Rollen" longdescription="Toewijzen en Verwijderen Mogelijkheden in Rollen in de Toegestane Mogelijkheden van de Leden &amp; Rollen tab &gt; Leden sub-tab. *WAARSCHUWING* Ieder Lid in een Rol met deze Mogelijkheid kan kan zichzelf--en ieder ander niet-Eigenaar Lid--toewijzen aan rollen met meer rechten dan zijzelf op dat moment hebben, hierdoor ontstaat de mogelijkheid om zichzelf bijna-Eigenaar rechten toewijzen. Wees er zeker van en controleer voordat deze Mogelijkheid wordt toegekend." name="role change actions"/>
- </action_set>
- <action_set description="Deze Mogelijkheden regelen het wijzigen van de Groepsidentiteit, zoals het veranderen van publieke zichtbaarheid, charter en insigne." name="Group Identity">
- <action description="Wijzigen Charter, Insigne, en 'Toon in zoeken'" longdescription="Wijzigen Charter, Insigne, en 'Toon in zoeken'. Dit kan worden gedaan in de Algemeen tab." name="group change identity"/>
- </action_set>
- <action_set description="Deze Mogelijkheden regelen het overdragen, wijzigen, en verkopen van land dat in bezit is van deze groep. Om naar het Over Land venster te gaan, rechts-klik de grond selecteer 'Over Land...', of klik op de perceel info in de menubalk." name="Parcel Management">
- <action description="Land overdragen en land kopen voor groep" longdescription="Land overdragen en land kopen voor groep. Dit kan worden gedaan in Over Land &gt; Algemeen tab." name="land deed"/>
- <action description="Land overdragen aan Govenor Linden" longdescription="Land overdragen aan Govenor Linden. *WAARSCHUWING* Ieder Lid in een Rol met deze Mogelijkheid kan land in eigendom van de groep laten vervallen in Over Land &gt; Algemeen tab, teruggeven in Linden eigendom zonder verkoop! Wees er zeker van en controleer voordat deze Mogelijkheid wordt toegekend." name="land release"/>
- <action description="Activeer land te koop info" longdescription="Activeer land te koop info. *WAARSCHUWING* Ieder Lid in een Rol met deze Mogelijkheid kan land in eigendom van de groep verkopen in Over Land &gt; Algemeen tab als ze dat willen! Wees er zeker van en controleer voordat deze Mogelijkheid wordt toegekend." name="land set sale info"/>
- <action description="Opdelen en samenvoegen van percelen" longdescription="Opdelen en samenvoegen van percelen. Dit kan worden gedaan door rechts klikken op de grond, 'Terrein Bewerken, en de muis te slepen naar het land om een selectie te maken. Om te verdelen, selecteer wat je wil splitsen en klik 'Opdelen...'. Om samen te voegen, selecteer twee of meer aaneengesloten percelen en klik 'Samenvoegen...'." name="land divide join"/>
- </action_set>
- <action_set description="Deze Mogelijkheden regelen het veranderen van de perceelnaam en publicatie instelling, zichtbaarheid in 'Tonen in zoeken', en landingspunt &amp; TP routering." name="Parcel Identity">
- <action description="Selecteer 'Tonen in zoeken' en instellen categorie" longdescription="Selecteer 'Tonen in zoeken' en instellen van de categorie voor een perceel in Over Land &gt; Opties tab." name="land find places"/>
- <action description="Veranderen perceel naam, omschrijving, en 'Tonen in zoeken' instellingen" longdescription="Veranderen perceel naam, omschrijving en 'Tonen in zoeken' instellingen. Dit kan worden gedaan in Overland &gt; Opties tab." name="land change identity"/>
- <action description="Instellen landingsplaats en instellen teleport routering" longdescription="Op een perceel in groepseigendom, Leden in een Rol met die mogelijkheid kunnen een landingsplaats instellen om te bepalen waar inkomende teleports aankomen, en ook een teleport routering instelling voor meer controle. Dit kan worden gedaan in About Land &gt; Opties tab." name="land set landing point"/>
- </action_set>
- <action_set description="Deze Mogelijkheden regelen het aanpassen van perceel opties, zoals 'Maak Objecten', 'Bewerken Terrein', en muziek &amp; media instellingen." name="Parcel Settings">
- <action description="Veranderen muziek &amp; media instellingen" longdescription="Veranderen streaming muziek en film instellingen in Over Land&gt; Media tab." name="land change media"/>
- <action description="Instellen 'Bewerken Terrein'" longdescription="Instellen 'Bewerken Terrein'. *WAARSCHUWING* Over Land &gt; Opties tab &gt; Bewerken Terrein staat toe dat iedereen de vorm van het terrein kan aanpassen, en Linden planten kan plaatsen en verplaatsen. Wees er zeker van en controleer voordat deze Mogelijkheid wordt toegekend. Bewerken terrein kan worden aangezet in Over Land&gt; Opties tab." name="land edit"/>
- <action description="Instellen diversen Over Land &gt; Optie instellingen" longdescription="Instellen 'Veilig (geen letsel)', 'Vliegen' and andere Inwoners toestaan om: 'Objecten te maken', 'Terrein te bewerken', en 'Scripts uit te voeren' op land in groepseigendom in Over Land &gt; Opties tab." name="land options"/>
- </action_set>
- <action_set description="Deze Mogelijkheden regelend de toestemming voor leden om beperkingen te omzeilen op percelen in groepseigendom." name="Parcel Powers">
- <action description="'Bewerken Terrein' altijd toestaan" longdescription="Leden in een Rol met deze Mogelijkheid kunnen terrein bewerken op een perceel in groepseigendom, zelfs als de optie uitstaat in Over Land &gt; Opties tab." name="land allow edit land"/>
- <action description="'Vliegen' altijd toestaan" longdescription="Leden in een Rol met deze Mogelijkheid kunnen vliegen op een perceel in groepseigendom, zelfs als de optie uitstaat in Over Land &gt; Opties tab." name="land allow fly"/>
- <action description="'Maak Objecten' altijd toestaan" longdescription="Leden in een Rol met deze Mogelijkheid kunnen objecten maken op een perceel in groepseigendom, zelfs als de optie uitstaat in Over Land &gt; Opties tab." name="land allow create"/>
- <action description="'Maak Landmarkering' altijd toestaan" longdescription="Leden in een Rol met deze Mogelijkheid kunnen een landmarkering maken op een perceel in groepseigendom, zelfs als de optie uitstaat in Over Land &gt; Opties tab." name="land allow landmark"/>
- <action description="Toestaan 'Thuis hier Instellen' op land in groepseigendom" longdescription="Leden in een Rol met deze Mogelijkheid kunnen gebruik maken van Wereld menu &gt; Thuis hier Instellen op een perceel afgestaan aan deze groep." name="land allow set home"/>
- </action_set>
- <action_set description="Deze Mogelijkheden regelen het toestaan of beperken van toegang van percelen in groepseigendom, inclusief het bevriezen en verbannen van Inwoners." name="Parcel Access">
- <action description="Beheren perceel Toegang lijsten" longdescription="Beheren perceel Toegang lijsten in Over Land &gt; Toegang tab." name="land manage allowed"/>
- <action description="Beheren perceel Verbannen lijst" longdescription="Beheren perceel Verbannen lijst in Over Land &gt; Verbannen tab." name="land manage banned"/>
- <action description="Veranderen perceel 'Verkoop toegangspassen...' instellingen" longdescription="Verandere perceel 'Verkoop toegangspassen...'instellingen" name="land manage passes"/>
- <action description="Uitwerpen en bevriezen Inwoners op percelen" longdescription="Leden in een Rol met deze mogelijkheid kunnen een onwelkome Inwoners aanpakken op een perceel in groepseigendom door een rechter-klik op deze inwoner &gt; en 'Uitwerpen...'of 'Bevriezen...'te selecteren." name="land admin"/>
- </action_set>
- <action_set description="Deze Mogelijkheden regelen de toestemming voor leden om objecten te retourneren en Linden planten te plaatsen en te verplaatsen. Dit is nuttig voor Leden om rommel op te ruimen en landschappen te maken, echter het moet ook met omzichtigheid worden gebruikt, omdat er geen herstelfunktie is voor retourneren objecten." name="Parcel Content">
- <action description="Retourneren objecten in groepseigendom" longdescription="Retourneren van objecten die in eigendom zijn van de groep op percelen in groepseigendom in Over Land &gt; Objecten tab." name="land return group owned"/>
- <action description="Retourneren objecten toegewezen aan de groep" longdescriotion="Retourneren van objecten die aan de groep zijn toegewezen op percelen in groepseigendom in Over Land &gt; Objecten tab." name="land return group set"/>
- <action description="Retourneren objecten die niet van de groep zijn" longdescription="Retourneren objecten die niet van de groep zijn op percelen in groepeigendom in Over Land &gt; Objecten tab." name="land return non group"/>
- <action description="Landschappen maken met Linden planten" longdescription="Landschappen maken om Linden bomen, planten en grassen te plaatsen en te verplaatsen. Deze opties zijn te vinden in de inventaris Library &gt; Objects folder of ze kunnen worden gemaakt via de Bouwen knop." name="land gardening"/>
- </action_set>
- <action_set description="Deze Mogelijkheden regelen het afstaan, wijzigen, en verkopen van objecten in groepseigendom. Deze veranderingen worden gedaan in Bewerken Gereedschap &gt; Algemeen tab. Rechts-klik een object en selecteer Bewerken om de instellingen ervan te bekijken." name="Object Management">
- <action description="Overdragen objecten aan groep" longdescription="Overdragen objecten aan groep in de Bewerkings Hulpmiddelen &gt; Algemeen tab." name="object deed"/>
- <action description="Manipuleren (verplaatsen, copieren, wijzigen) van objecten in groepseigendom" longdescription="Manipuleren (verplaatsen, copieren, wijzigen) van objecten in groepseigendom in de Bewerkings Hulpmiddelen &gt; Algemeen tab." name="object manipulate"/>
- <action description="Te koop zetten van objecten in groepseigendom" longdescription="Te koop zetten van objecten in groepseigendom in de Bewerkings Hulpmiddelen &gt; Algemeen tab." name="object set sale"/>
- </action_set>
- <action_set description="Deze Mogelijkheden regelen dat Leden groepsverplichtingen betalen en groepsdividenden ontvangen, en toegang beperken tot de financiele historie van de groep." name="Accounting">
- <action description="Betalen groepsverplichtingen en ontvangen van groepsdividenden" longdescription="Leden in een Rol met deze mogelijkheid betalen groepsverplichtingen en ontvangen groepsdividenden automatisch. Dit betekent dat ze een deel ontvangen van de verkoop van land in groepseigendom die dagelijks worden verdeeld, maar ook dat ze bijdragen aan zaken zoals lijstbijdrage voor het perceel." name="accounting accountable"/>
- </action_set>
- <action_set description="Deze Mogelijkheden regelen de toestemming dat Leden Groepsberichten kunnen versturen, ontvangen en inzien." name="Notices">
- <action description="Versturen Berichten" longdescription="Leden in een Rol met deze Mogelijkheid kunnen Berichten versturen in Groep Informatie &gt; Berichten tab." name="notices send"/>
- <action description="Ontvangen Berichten en inzien van oude Berichten" longdescription="Leden in een Rol met deze Mogelijkheid kunnen Berichten ontvangen en oude Berichten inzien in Groep Informatie &gt; Berichten tab." name="notices receive"/>
- </action_set>
- <action_set description="Deze Mogelijkheden regelen de toestemming dat Leden Voorstellen kunnen maken, Voorstellen kunnen inzien, en het stemverloop kunnen bekijken." name="Proposals">
- <action description="Maken Voorstellen" longdescription="Leden in een Rol met deze Mogelijkheid kunnen Voorstellen maken waarop kan worden gestemd in Groep Informatie &gt; Voorstellen tab." name="proposal start"/>
- <action description="Stemmen op Voorstellen" longdescription="Leden in een Rol met deze Mogelijkheid kunnen stemmen op Voorstellen in Groep Informatie &gt; Voorstellen tab." name="proposal vote"/>
- </action_set>
- <action_set description="Deze Mogelijkheden regelen de toegang (en de beperking ervan) tot groep chat sessies en groep voice chat." name="Chat">
- <action description="Deelname aan Groep Chat" longdescription="Leden in een Rol met deze Mogelijkheid kunnen deelnemen aan groep chat sessies, zowel voor tekst als voice." name="join group chat"/>
- <action description="Deelname aan Groep Voice Chat" longdescription="Leden in een Rol met deze Mogelijkheid kunnen deelnemen aan groep voice chat sessies. OPMERKING: De Deelname Group Chat is vereist om toegang te krijgen to de voice chat sessie." name="join voice chat"/>
- <action description="Modereren Groep Chat" longdescription="Leden in een Rol met deze Mogelijkheid kunnen toegang en deelname controleren in groep voice en tekst chat sessies." name="moderate group chat"/>
- </action_set>
-</role_actions> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/nl/strings.xml b/indra/newview/skins/default/xui/nl/strings.xml
deleted file mode 100644
index 07265d2716..0000000000
--- a/indra/newview/skins/default/xui/nl/strings.xml
+++ /dev/null
@@ -1,3252 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!-- This file contains strings that used to be hardcoded in the source.
- It is only for those strings which do not belong in a floater.
- For example, the strings used in avatar chat bubbles, and strings
- that are returned from one component and may appear in many places-->
-<strings>
- <string name="SUPPORT_SITE">
- Second Life Ondersteunings Portaal
- </string>
- <string name="StartupDetectingHardware">
- Detecteert hardware...
- </string>
- <string name="StartupLoading">
- Laden
- </string>
- <string name="LoginInProgress">
- Inloggen. Het kan lijken dat [APP_NAME] is vastgelopen. Wacht u alstublieft... .
- </string>
- <string name="LoginInProgressNoFrozen">
- Inloggen...
- </string>
- <string name="LoginAuthenticating">
- Authenticeren
- </string>
- <string name="LoginMaintenance">
- Account onderhoud wordt uitgevoerd...
- </string>
- <string name="LoginAttempt">
- Vorige loginpoging is mislukt. Inloggen, poging [NUMBER]
- </string>
- <string name="LoginPrecaching">
- Wereld laden...
- </string>
- <string name="LoginInitializingBrowser">
- Geïntegreerde web browser initialiseren...
- </string>
- <string name="LoginInitializingMultimedia">
- Multimedia initialiseren...
- </string>
- <string name="LoginInitializingFonts">
- Lettertypen laden...
- </string>
- <string name="LoginVerifyingCache">
- Veriveren cache bestanden (kan 60-90 seconden duren)...
- </string>
- <string name="LoginProcessingResponse">
- Reactie Verwerken...
- </string>
- <string name="LoginInitializingWorld">
- Wereld initialiseren...
- </string>
- <string name="LoginDecodingImages">
- Afbeeldingen decoderen...
- </string>
- <string name="LoginInitializingQuicktime">
- QuickTime initialiseren...
- </string>
- <string name="LoginQuicktimeNotFound">
- QuickTime niet gevonden - kan niet initialiseren.
- </string>
- <string name="LoginQuicktimeOK">
- QuickTime succesvol geïnitialiseerd.
- </string>
- <string name="LoginWaitingForRegionHandshake">
- Wachten op overeenstemming met regio...
- </string>
- <string name="LoginConnectingToRegion">
- Verbinden met regio...
- </string>
- <string name="LoginDownloadingClothing">
- Kleding downloaden...
- </string>
- <string name="LoginFailedNoNetwork">
- Netwerk Fout: Kon geen verbinding maken, kijk uw nerwerk connectie na alstublieft.
- </string>
- <string name="Quit">
- Afsluiten
- </string>
- <string name="create_account_url">
- http://join.secondlife.com/index.php?lang=nl-NL
- </string>
- <string name="AgentLostConnection">
- Deze regio kan problemen ondervinden. Controleer alstublieft uw verbinding met het internet.
- </string>
- <string name="TooltipPerson">
- Persoon
- </string>
- <string name="TooltipNoName">
- (geen naam)
- </string>
- <string name="TooltipOwner">
- Eigenaar:
- </string>
- <string name="TooltipPublic">
- Openbaar
- </string>
- <string name="TooltipIsGroup">
- (Groep)
- </string>
- <string name="TooltipForSaleL$">
- Te koop: L$[AMOUNT]
- </string>
- <string name="TooltipFlagGroupBuild">
- Groep bouwen
- </string>
- <string name="TooltipFlagNoBuild">
- Niet bouwen
- </string>
- <string name="TooltipFlagNoEdit">
- Groep bouwen
- </string>
- <string name="TooltipFlagNotSafe">
- Niet veilig
- </string>
- <string name="TooltipFlagNoFly">
- Niet vliegen
- </string>
- <string name="TooltipFlagGroupScripts">
- Groep scripts
- </string>
- <string name="TooltipFlagNoScripts">
- Geen scripts
- </string>
- <string name="TooltipLand">
- Land:
- </string>
- <string name="TooltipMustSingleDrop">
- Slechts een enkel item kan hier naartoe gesleept worden
- </string>
- <string name="TooltipHttpUrl">
- Klik om deze web pagina te bekijken
- </string>
- <string name="TooltipSLURL">
- Klik om deze locatie informatie te bekijken
- </string>
- <string name="TooltipAgentUrl">
- Klik om deze inwoner zijn profiel te bekijken
- </string>
- <string name="TooltipGroupUrl">
- Klik om deze groeps informatie te bekijken
- </string>
- <string name="TooltipEventUrl">
- Klik om deze evenement informatie te bekijken
- </string>
- <string name="TooltipClassifiedUrl">
- Klik om deze advertentie te bekijken
- </string>
- <string name="TooltipParcelUrl">
- Klik om deze perceel informatie te bekijken
- </string>
- <string name="TooltipTeleportUrl">
- Klik om naar deze lokatie te teleporteren
- </string>
- <string name="TooltipObjectIMUrl">
- Klik om deze object informatie te bekijken
- </string>
- <string name="TooltipMapUrl">
- Klik om deze locatie op een map te bekijken
- </string>
- <string name="TooltipSLAPP">
- Klik om het secondlife:// commando te starten
- </string>
- <string name="CurrentURL" value="HuidigeURL: [HuidigeURL]"/>
- <string name="SLurlLabelTeleport">
- Teleporteer naar
- </string>
- <string name="SLurlLabelShowOnMap">
- Toon Map voor
- </string>
- <string name="BUTTON_CLOSE_DARWIN">
- Sluiten (⌘W)
- </string>
- <string name="BUTTON_CLOSE_WIN">
- Sluiten (Ctrl+W)
- </string>
- <string name="BUTTON_RESTORE">
- Restore
- </string>
- <string name="BUTTON_MINIMIZE">
- Minimaliseren
- </string>
- <string name="BUTTON_TEAR_OFF">
- Afscheuren
- </string>
- <string name="BUTTON_DOCK">
- Koppelen
- </string>
- <string name="BUTTON_UNDOCK">
- Loskoppelen
- </string>
- <string name="BUTTON_HELP">
- Toon Help
- </string>
- <string name="Searching">
- Zoeken...
- </string>
- <string name="NoneFound">
- Geen gevonden.
- </string>
- <string name="RetrievingData">
- Ophalen...
- </string>
- <string name="ReleaseNotes">
- Release Notes
- </string>
- <string name="LoadingData">
- Laden...
- </string>
- <string name="AvatarNameNobody">
- (niemand)
- </string>
- <string name="AvatarNameWaiting">
- (wachten)
- </string>
- <string name="AvatarNameHippos">
- (hippos)
- </string>
- <string name="GroupNameNone">
- (geen)
- </string>
- <string name="AssetErrorNone">
- Geen fout
- </string>
- <string name="AssetErrorRequestFailed">
- Asset verzoek: mislukt
- </string>
- <string name="AssetErrorNonexistentFile">
- Asset verzoek: niet-bestaand bestand
- </string>
- <string name="AssetErrorNotInDatabase">
- Asset verzoek: asset niet gevonden in de database
- </string>
- <string name="AssetErrorEOF">
- Einde van bestand
- </string>
- <string name="AssetErrorCannotOpenFile">
- Kan bestand niet openen
- </string>
- <string name="AssetErrorFileNotFound">
- Bestand niet gevonden
- </string>
- <string name="AssetErrorTCPTimeout">
- Bestandsoverdracht time-out
- </string>
- <string name="AssetErrorCircuitGone">
- Circuit verdwenen
- </string>
- <string name="AssetErrorPriceMismatch">
- Viewer en server zijn het niet eens over de prijs.
- </string>
- <string name="AssetErrorUnknownStatus">
- Onbekende status
- </string>
- <string name="texture">
- textuur
- </string>
- <string name="sound">
- geluid
- </string>
- <string name="calling card">
- visitekaart
- </string>
- <string name="landmark">
- landmarkering
- </string>
- <string name="legacy script">
- legacy script
- </string>
- <string name="clothing">
- kleding
- </string>
- <string name="object">
- object
- </string>
- <string name="note card">
- notecard
- </string>
- <string name="folder">
- map
- </string>
- <string name="root">
- root
- </string>
- <string name="lsl2 script">
- LSL2 script
- </string>
- <string name="lsl bytecode">
- LSL bytecode
- </string>
- <string name="tga texture">
- tga textuur
- </string>
- <string name="body part">
- lichaamsdeel
- </string>
- <string name="snapshot">
- foto
- </string>
- <string name="lost and found">
- Verloren en Gevonden
- </string>
- <string name="targa image">
- targa plaatje
- </string>
- <string name="trash">
- Prullenbak
- </string>
- <string name="jpeg image">
- jpeg plaatje
- </string>
- <string name="animation">
- animatie
- </string>
- <string name="gesture">
- gebaar
- </string>
- <string name="simstate">
- simstate
- </string>
- <string name="favorite">
- favorieten
- </string>
- <string name="symbolic link">
- link
- </string>
- <string name="AvatarAway">
- Afwezig
- </string>
- <string name="AvatarBusy">
- Bezet
- </string>
- <string name="AvatarMuted">
- Genegeerd
- </string>
- <string name="anim_express_afraid">
- Bang
- </string>
- <string name="anim_express_anger">
- Boos
- </string>
- <string name="anim_away">
- Afwezig
- </string>
- <string name="anim_backflip">
- Salto achterwaarts
- </string>
- <string name="anim_express_laugh">
- Daverende lach
- </string>
- <string name="anim_express_toothsmile">
- Grote lach
- </string>
- <string name="anim_blowkiss">
- Blaas kus
- </string>
- <string name="anim_express_bored">
- Verveeld
- </string>
- <string name="anim_bow">
- Buigen
- </string>
- <string name="anim_clap">
- Klappen
- </string>
- <string name="anim_courtbow">
- Hof buiging
- </string>
- <string name="anim_express_cry">
- Huilen
- </string>
- <string name="anim_dance1">
- Dansen 1
- </string>
- <string name="anim_dance2">
- Dansen 2
- </string>
- <string name="anim_dance3">
- Dansen 3
- </string>
- <string name="anim_dance4">
- Dansen 4
- </string>
- <string name="anim_dance5">
- Dansen 5
- </string>
- <string name="anim_dance6">
- Dansen 6
- </string>
- <string name="anim_dance7">
- Dansen 7
- </string>
- <string name="anim_dance8">
- Dansen 8
- </string>
- <string name="anim_express_disdain">
- Minachting
- </string>
- <string name="anim_drink">
- Drinken
- </string>
- <string name="anim_express_embarrased">
- Beschaamd
- </string>
- <string name="anim_angry_fingerwag">
- Vinger opsteken
- </string>
- <string name="anim_fist_pump">
- Vuist pompen
- </string>
- <string name="anim_yoga_float">
- Zwevende Yoga
- </string>
- <string name="anim_express_frown">
- Fronsen
- </string>
- <string name="anim_impatient">
- Ongeduldig
- </string>
- <string name="anim_jumpforjoy">
- Vreugdesprong
- </string>
- <string name="anim_kissmybutt">
- Kus mijn reet
- </string>
- <string name="anim_express_kiss">
- Kussen
- </string>
- <string name="anim_laugh_short">
- Lachen
- </string>
- <string name="anim_musclebeach">
- Spieren tonen
- </string>
- <string name="anim_no_unhappy">
- Nee (ongelukkig)
- </string>
- <string name="anim_no_head">
- Nee
- </string>
- <string name="anim_nyanya">
- Nya-nya-nya
- </string>
- <string name="anim_punch_onetwo">
- Een-twee stomp
- </string>
- <string name="anim_express_open_mouth">
- Open mond
- </string>
- <string name="anim_peace">
- Vrede
- </string>
- <string name="anim_point_you">
- Wijzen naar ander
- </string>
- <string name="anim_point_me">
- Wijzen naar jezelf
- </string>
- <string name="anim_punch_l">
- Stomp links
- </string>
- <string name="anim_punch_r">
- Stomp rechts
- </string>
- <string name="anim_rps_countdown">
- SPS tellen
- </string>
- <string name="anim_rps_paper">
- SPS papier
- </string>
- <string name="anim_rps_rock">
- SPS steen
- </string>
- <string name="anim_rps_scissors">
- SPS schaar
- </string>
- <string name="anim_express_repulsed">
- Afkeer
- </string>
- <string name="anim_kick_roundhouse_r">
- Ronddraaiende trap
- </string>
- <string name="anim_express_sad">
- Droevig
- </string>
- <string name="anim_salute">
- Groet
- </string>
- <string name="anim_shout">
- Roepen
- </string>
- <string name="anim_express_shrug">
- Schouders ophalen
- </string>
- <string name="anim_express_smile">
- Glimlachen
- </string>
- <string name="anim_smoke_idle">
- Roken inactief
- </string>
- <string name="anim_smoke_inhale">
- Roken inhaleren
- </string>
- <string name="anim_smoke_throw_down">
- Roken neergooien
- </string>
- <string name="anim_express_surprise">
- Verrassing
- </string>
- <string name="anim_sword_strike_r">
- Zwaardslag
- </string>
- <string name="anim_angry_tantrum">
- Woedeaanval
- </string>
- <string name="anim_express_tongue_out">
- Tong uitsteken
- </string>
- <string name="anim_hello">
- Zwaaien
- </string>
- <string name="anim_whisper">
- Fluisteren
- </string>
- <string name="anim_whistle">
- Fluiten
- </string>
- <string name="anim_express_wink">
- Knipogen
- </string>
- <string name="anim_wink_hollywood">
- Knipogen (Hollywood)
- </string>
- <string name="anim_express_worry">
- Bezorgd
- </string>
- <string name="anim_yes_happy">
- Ja (vrolijk)
- </string>
- <string name="anim_yes_head">
- Ja
- </string>
- <string name="texture_loading">
- Laden...
- </string>
- <string name="worldmap_offline">
- Off line
- </string>
- <string name="worldmap_results_none_found">
- Geen gevonden.
- </string>
- <string name="Ok">
- OK
- </string>
- <string name="Premature end of file">
- Vroegtijdig eind van bestand
- </string>
- <string name="ST_NO_JOINT">
- Kan niet ROOT of JOINT vinden.
- </string>
- <string name="whisper">
- fluistert:
- </string>
- <string name="shout">
- schreeuwt:
- </string>
- <string name="ringing">
- Verbinden met in-wereld voice chat...
- </string>
- <string name="connected">
- Verbonden
- </string>
- <string name="unavailable">
- Voice is niet beschikbaar op uw huidige locatie
- </string>
- <string name="hang_up">
- Verbinding met in-wereld voicechat verbroken
- </string>
- <string name="ScriptQuestionCautionChatGranted">
- &apos;[OBJECTNAME]&apos;, een object van &apos;[OWNERNAME]&apos;, gevestigd in [REGIONNAME] op [REGIONPOS], is toestemming verleend om te: [PERMISSIONS].
- </string>
- <string name="ScriptQuestionCautionChatDenied">
- &apos;[OBJECTNAME]&apos;, een object van &apos;[OWNERNAME]&apos;, gevestigd in [REGIONNAME] op [REGIONPOS], is toestemming geweigerd om te: [PERMISSIONS].
- </string>
- <string name="ScriptTakeMoney">
- Linden dollars (L$) van u wegnemen
- </string>
- <string name="ActOnControlInputs">
- Acteren op uw bedieningsinvoer
- </string>
- <string name="RemapControlInputs">
- Uw bedieningsinvoer herdefiniëren
- </string>
- <string name="AnimateYourAvatar">
- Animeer uw avatar
- </string>
- <string name="AttachToYourAvatar">
- Bevestig aan uw avatar
- </string>
- <string name="ReleaseOwnership">
- Eigendom vrijgeven en openbaar worden
- </string>
- <string name="LinkAndDelink">
- Koppelen met en ontkoppelen van andere objecten
- </string>
- <string name="AddAndRemoveJoints">
- Toevoegen en verwijderen koppelingen met andere objecten
- </string>
- <string name="ChangePermissions">
- Wijzig zijn permissies
- </string>
- <string name="TrackYourCamera">
- Volg uw camera
- </string>
- <string name="ControlYourCamera">
- Bedien uw camera
- </string>
- <string name="SIM_ACCESS_PG">
- PG
- </string>
- <string name="SIM_ACCESS_MATURE">
- Mature
- </string>
- <string name="SIM_ACCESS_ADULT">
- Adult
- </string>
- <string name="SIM_ACCESS_DOWN">
- Offline
- </string>
- <string name="SIM_ACCESS_MIN">
- Onbekend
- </string>
- <string name="land_type_unknown">
- (onbekend)
- </string>
- <string name="all_files">
- Alle bestanden
- </string>
- <string name="sound_files">
- Geluiden
- </string>
- <string name="animation_files">
- Animaties
- </string>
- <string name="image_files">
- Afbeeldingen
- </string>
- <string name="save_file_verb">
- Opslaan
- </string>
- <string name="load_file_verb">
- Laden
- </string>
- <string name="targa_image_files">
- Targa afbeeldingen
- </string>
- <string name="bitmap_image_files">
- Bitmap afbeeldingen
- </string>
- <string name="avi_movie_file">
- AVI Film bestand
- </string>
- <string name="xaf_animation_file">
- XAF Anim bestand
- </string>
- <string name="xml_file">
- XML bestand
- </string>
- <string name="raw_file">
- RAW bestand
- </string>
- <string name="compressed_image_files">
- Gecomprimeerde afbeeldingen
- </string>
- <string name="load_files">
- Laad bestanden
- </string>
- <string name="choose_the_directory">
- Kies folder
- </string>
- <string name="AvatarSetNotAway">
- Niet Afwezig Instellen
- </string>
- <string name="AvatarSetAway">
- Afwezig Instellen
- </string>
- <string name="AvatarSetNotBusy">
- Niet Bezig Instellen
- </string>
- <string name="AvatarSetBusy">
- Bezig Instellen
- </string>
- <string name="shape">
- Postuur
- </string>
- <string name="skin">
- Huid
- </string>
- <string name="hair">
- Haar
- </string>
- <string name="eyes">
- Ogen
- </string>
- <string name="shirt">
- Hemd
- </string>
- <string name="pants">
- Broek
- </string>
- <string name="shoes">
- Schoenen
- </string>
- <string name="socks">
- Sokken
- </string>
- <string name="jacket">
- Jas
- </string>
- <string name="gloves">
- Handschoenen
- </string>
- <string name="undershirt">
- onderhemd
- </string>
- <string name="underpants">
- Onderbroek
- </string>
- <string name="skirt">
- Rok
- </string>
- <string name="alpha">
- Alpha
- </string>
- <string name="tattoo">
- Tattoo
- </string>
- <string name="invalid">
- ongeldig
- </string>
- <string name="next">
- Volgende
- </string>
- <string name="ok">
- OK
- </string>
- <string name="GroupNotifyGroupNotice">
- Groep Mededeling
- </string>
- <string name="GroupNotifyGroupNotices">
- Groep Mededelingen
- </string>
- <string name="GroupNotifySentBy">
- Verzonden Door:
- </string>
- <string name="GroupNotifyAttached">
- Bijgevoegt:
- </string>
- <string name="GroupNotifyViewPastNotices">
- Bekijk alle mededelingen en bijlages van verzonden Mededelingen in het verleden
- </string>
- <string name="GroupNotifyOpenAttachment">
- Open Bijlage
- </string>
- <string name="GroupNotifySaveAttachment">
- Sla Bijlage Op
- </string>
- <string name="TeleportOffer">
- Teleporteer Aanbieding
- </string>
- <string name="StartUpNotification">
- [%d] Nieuwe mededelingen aangekomen terwijl u weg was ...
- </string>
- <string name="StartUpNotifications">
- [%d] Nieuwe mededelingen aangekomen terwijl u weg was ...
- </string>
- <string name="OverflowInfoChannelString">
- U heeft [%d] meer mededelingen
- </string>
- <string name="BodyPartsRightArm">
- Rechter Arm
- </string>
- <string name="BodyPartsHead">
- Hoofd
- </string>
- <string name="BodyPartsLeftArm">
- Linker Arm
- </string>
- <string name="BodyPartsLeftLeg">
- Linker Been
- </string>
- <string name="BodyPartsTorso">
- Torso
- </string>
- <string name="BodyPartsRightLeg">
- Rechter Been
- </string>
- <string name="GraphicsQualityLow">
- Laag
- </string>
- <string name="GraphicsQualityMid">
- Middel
- </string>
- <string name="GraphicsQualityHigh">
- Hoog
- </string>
- <string name="LeaveMouselook">
- Druk op ESC om terug te keren naar Wereld Zicht
- </string>
- <string name="InventoryNoMatchingItems">
- Geen overeenkomende objecten gevonden in de voorraad.
- </string>
- <string name="InventoryNoTexture">
- Je hebt geen kopie van deze texture in je inventaris
- </string>
- <string name="no_transfer" value="(no transfer)"/>
- <string name="no_modify" value="(no modify)"/>
- <string name="no_copy" value="(no copy)"/>
- <string name="worn" value="(worn)"/>
- <string name="link" value="(link)"/>
- <string name="broken_link" value="(broken_link)&quot;"/>
- <string name="LoadingContents">
- Loading contents...
- </string>
- <string name="NoContents">
- No contents
- </string>
- <string name="WornOnAttachmentPoint" value="(worn on [ATTACHMENT_POINT])"/>
- <string name="Chat" value="Chat :"/>
- <string name="Sound" value="Geluid :"/>
- <string name="Wait" value="--- Wachten :"/>
- <string name="AnimFlagStop" value="Stop Animatie :"/>
- <string name="AnimFlagStart" value="Start Animatie :"/>
- <string name="Wave" value="Wave"/>
- <string name="HelloAvatar" value="Hallo, avatar!"/>
- <string name="ViewAllGestures" value="Bekijk alles &gt;"/>
- <string name="Animations" value="Animaties,"/>
- <string name="Calling Cards" value="Calling Cards,"/>
- <string name="Clothing" value="Kleding,"/>
- <string name="Gestures" value="Gestures,"/>
- <string name="Landmarks" value="Landmarks,"/>
- <string name="Notecards" value="Notecards,"/>
- <string name="Objects" value="Objecten,"/>
- <string name="Scripts" value="Scripts,"/>
- <string name="Sounds" value="Geluiden,"/>
- <string name="Textures" value="Textures,"/>
- <string name="Snapshots" value="Snapshots,"/>
- <string name="No Filters" value="Nee"/>
- <string name="Since Logoff" value="- Sinds Afmelden"/>
- <string name="InvFolder My Inventory">
- Mijn Inventaris
- </string>
- <string name="InvFolder My Favorites">
- Mijn Favorieten
- </string>
- <string name="InvFolder Library">
- Bibliotheek
- </string>
- <string name="InvFolder Textures">
- Textures
- </string>
- <string name="InvFolder Sounds">
- Geluiden
- </string>
- <string name="InvFolder Calling Cards">
- Calling Cards
- </string>
- <string name="InvFolder Landmarks">
- Landmarks
- </string>
- <string name="InvFolder Scripts">
- Scripts
- </string>
- <string name="InvFolder Clothing">
- Kleding
- </string>
- <string name="InvFolder Objects">
- Objecten
- </string>
- <string name="InvFolder Notecards">
- Notecards
- </string>
- <string name="InvFolder New Folder">
- Nieuwe Map
- </string>
- <string name="InvFolder Inventory">
- Inventaris
- </string>
- <string name="InvFolder Uncompressed Images">
- Ongecomprimeerde Afbeeldingen
- </string>
- <string name="InvFolder Body Parts">
- Lichaams Delen
- </string>
- <string name="InvFolder Trash">
- Afval
- </string>
- <string name="InvFolder Photo Album">
- Foto Album
- </string>
- <string name="InvFolder Lost And Found">
- Verloren en Gevonden
- </string>
- <string name="InvFolder Uncompressed Sounds">
- Ongecomprimeerde Geluiden
- </string>
- <string name="InvFolder Animations">
- Animaties
- </string>
- <string name="InvFolder Gestures">
- Gebaren
- </string>
- <string name="InvFolder Favorite">
- Favoriten
- </string>
- <string name="InvFolder favorite">
- Favoriten
- </string>
- <string name="InvFolder Current Outfit">
- Huidige Uitrusting
- </string>
- <string name="InvFolder My Outfits">
- Mijn Uitrustingen
- </string>
- <string name="InvFolder Friends">
- Vrienden
- </string>
- <string name="InvFolder All">
- Alles
- </string>
- <string name="Buy">
- Koop
- </string>
- <string name="BuyforL$">
- Koop voor L$
- </string>
- <string name="Stone">
- Steen
- </string>
- <string name="Metal">
- Metaal
- </string>
- <string name="Glass">
- Glas
- </string>
- <string name="Wood">
- Hout
- </string>
- <string name="Flesh">
- Vlees
- </string>
- <string name="Plastic">
- Plastic
- </string>
- <string name="Rubber">
- Rubber
- </string>
- <string name="Light">
- Licht
- </string>
- <string name="KBShift">
- Shift
- </string>
- <string name="KBCtrl">
- Ctrl
- </string>
- <string name="Chest">
- Borstkas
- </string>
- <string name="Skull">
- Schedel
- </string>
- <string name="Left Shoulder">
- Linker Schouder
- </string>
- <string name="Right Shoulder">
- Rechter Schouder
- </string>
- <string name="Left Hand">
- Linker Hand
- </string>
- <string name="Right Hand">
- Rechter Hand
- </string>
- <string name="Left Foot">
- Linker Voet
- </string>
- <string name="Right Foot">
- Rechter Voet
- </string>
- <string name="Spine">
- Ruggegraat
- </string>
- <string name="Pelvis">
- Bekken
- </string>
- <string name="Mouth">
- Mond
- </string>
- <string name="Chin">
- Kin
- </string>
- <string name="Left Ear">
- Linker Oor
- </string>
- <string name="Right Ear">
- Rechter Oor
- </string>
- <string name="Left Eyeball">
- Linker Oogbal
- </string>
- <string name="Right Eyeball">
- Rechter Oogbal
- </string>
- <string name="Nose">
- Neus
- </string>
- <string name="R Upper Arm">
- R Boven Arm
- </string>
- <string name="R Forearm">
- R Onder Arm
- </string>
- <string name="L Upper Arm">
- L Boven Arm
- </string>
- <string name="L Forearm">
- L Onder Arm
- </string>
- <string name="Right Hip">
- Rechter Heup
- </string>
- <string name="R Upper Leg">
- R Boven Been
- </string>
- <string name="R Lower Leg">
- R Onder Been
- </string>
- <string name="Left Hip">
- Linker Heub
- </string>
- <string name="L Upper Leg">
- L Boven Been
- </string>
- <string name="L Lower Leg">
- L Onder Been
- </string>
- <string name="Stomach">
- Maag
- </string>
- <string name="Left Pec">
- Left Pec
- </string>
- <string name="Right Pec">
- Right Pec
- </string>
- <string name="YearsMonthsOld">
- [AGEYEARS] [AGEMONTHS] oud
- </string>
- <string name="YearsOld">
- [AGEYEARS] oud
- </string>
- <string name="MonthsOld">
- [AGEMONTHS] oud
- </string>
- <string name="WeeksOld">
- [AGEWEEKS] oud
- </string>
- <string name="DaysOld">
- [AGEDAYS] oud
- </string>
- <string name="TodayOld">
- Vandaag toegetreden
- </string>
- <string name="AgeYearsA">
- [COUNT] jaar
- </string>
- <string name="AgeYearsB">
- [COUNT] jaar
- </string>
- <string name="AgeYearsC">
- [COUNT] jaar
- </string>
- <string name="AgeMonthsA">
- [COUNT] maand
- </string>
- <string name="AgeMonthsB">
- [COUNT] maanden
- </string>
- <string name="AgeMonthsC">
- [COUNT] maanden
- </string>
- <string name="AgeWeeksA">
- [COUNT] week
- </string>
- <string name="AgeWeeksB">
- [COUNT] weken
- </string>
- <string name="AgeWeeksC">
- [COUNT] weken
- </string>
- <string name="AgeDaysA">
- [COUNT] dag
- </string>
- <string name="AgeDaysB">
- [COUNT] dagen
- </string>
- <string name="AgeDaysC">
- [COUNT] dagen
- </string>
- <string name="GroupMembersA">
- [COUNT] lid
- </string>
- <string name="GroupMembersB">
- [COUNT] leden
- </string>
- <string name="GroupMembersC">
- [COUNT] leden
- </string>
- <string name="AcctTypeResident">
- bewoner
- </string>
- <string name="AcctTypeTrial">
- Trial
- </string>
- <string name="AcctTypeCharterMember">
- Charter Member
- </string>
- <string name="AcctTypeEmployee">
- Linden Lab Werknemer
- </string>
- <string name="PaymentInfoUsed">
- Betalings info gebruikt
- </string>
- <string name="PaymentInfoOnFile">
- Betalings info op bestand
- </string>
- <string name="NoPaymentInfoOnFile">
- Geen betalings info op bestand
- </string>
- <string name="AgeVerified">
- Leeftijd gecontroleerd
- </string>
- <string name="NotAgeVerified">
- Niet leeftijd gecontroleerd
- </string>
- <string name="Center 2">
- Centrum 2
- </string>
- <string name="Top Right">
- Rechts Boven
- </string>
- <string name="Top">
- Boven
- </string>
- <string name="Top Left">
- Links Boven
- </string>
- <string name="Center">
- Centrum
- </string>
- <string name="Bottom Left">
- Links beneden
- </string>
- <string name="Bottom">
- Beneden
- </string>
- <string name="Bottom Right">
- Rechts beneden
- </string>
- <string name="CompileQueueDownloadedCompiling">
- Dedownload, nu samenstellen
- </string>
- <string name="CompileQueueScriptNotFound">
- Script niet gevonden op server.
- </string>
- <string name="CompileQueueProblemDownloading">
- Problem downloading
- </string>
- <string name="CompileQueueInsufficientPermDownload">
- Onvoldoende rechten om een script te downloaden.
- </string>
- <string name="CompileQueueInsufficientPermFor">
- Onvoldoende rechten voor
- </string>
- <string name="CompileQueueUnknownFailure">
- Onbekende fout te downloaden
- </string>
- <string name="CompileQueueTitle">
- Hercompilatie vooruitgang
- </string>
- <string name="CompileQueueStart">
- Hercompilatie
- </string>
- <string name="ResetQueueTitle">
- Reset Vooruitgang
- </string>
- <string name="ResetQueueStart">
- reset
- </string>
- <string name="RunQueueTitle">
- Set Running Progress
- </string>
- <string name="RunQueueStart">
- set running
- </string>
- <string name="NotRunQueueTitle">
- Set Not Running Progress
- </string>
- <string name="NotRunQueueStart">
- set not running
- </string>
- <string name="CompileSuccessful">
- Compileren succesvol!
- </string>
- <string name="CompileSuccessfulSaving">
- Compileren succesvol, opslaan...
- </string>
- <string name="SaveComplete">
- Opslaan gereed.
- </string>
- <string name="ObjectOutOfRange">
- Script (object buiten het bereik)
- </string>
- <string name="GodToolsObjectOwnedBy">
- Object [OBJECT] eigendom van [OWNER]
- </string>
- <string name="GroupsNone">
- geen
- </string>
- <string name="Group" value="(group)"/>
- <string name="Unknown">
- (Unknown)
- </string>
- <string name="SummaryForTheWeek" value="Samenvatting voor deze week, vanaf"/>
- <string name="NextStipendDay" value="The next stipend day is"/>
- <string name="GroupIndividualShare" value="Groep Individueel Aandeel"/>
- <string name="Balance">
- Banksaldo
- </string>
- <string name="Credits">
- Credits
- </string>
- <string name="Debits">
- Debiteert
- </string>
- <string name="Total">
- Totaal
- </string>
- <string name="NoGroupDataFound">
- Geen groep gegevens gevonden voor groep
- </string>
- <string name="IMParentEstate">
- parent estate
- </string>
- <string name="IMMainland">
- mainland
- </string>
- <string name="IMTeen">
- tiener
- </string>
- <string name="RegionInfoError">
- fout
- </string>
- <string name="RegionInfoAllEstatesOwnedBy">
- all estates owned by [OWNER]
- </string>
- <string name="RegionInfoAllEstatesYouOwn">
- all estates that you own
- </string>
- <string name="RegionInfoAllEstatesYouManage">
- all estates that you manage for [OWNER]
- </string>
- <string name="RegionInfoAllowedResidents">
- Toegestane bewoners: ([ALLOWEDAGENTS], max [MAXACCESS])
- </string>
- <string name="RegionInfoAllowedGroups">
- Toegestane groepen: ([ALLOWEDGROUPS], max [MAXACCESS])
- </string>
- <string name="CursorPos">
- Lijn [LINE], Column [COLUMN]
- </string>
- <string name="PanelDirCountFound">
- [COUNT] gevonden
- </string>
- <string name="PanelContentsNewScript">
- Nieuw Script
- </string>
- <string name="MuteByName">
- (by name)
- </string>
- <string name="MuteAgent">
- (resident)
- </string>
- <string name="MuteObject">
- (object)
- </string>
- <string name="MuteGroup">
- (group)
- </string>
- <string name="RegionNoCovenant">
- There is no Covenant provided for this Estate.
- </string>
- <string name="RegionNoCovenantOtherOwner">
- There is no Covenant provided for this Estate. The land on this estate is being sold by the Estate owner, not Linden Lab. Please contact the Estate Owner for sales details.
- </string>
- <string name="covenant_last_modified">
- Laatst bewerkt:
- </string>
- <string name="none_text" value="(none)"/>
- <string name="never_text" value="(never)"/>
- <string name="GroupOwned">
- Groep Eigendom
- </string>
- <string name="Public">
- Openbaar
- </string>
- <string name="ClassifiedClicksTxt">
- Klikken: [TELEPORT] teleport, [MAP] map, [PROFILE] profiel
- </string>
- <string name="ClassifiedUpdateAfterPublish">
- (zal bijwerken na publiceren)
- </string>
- <string name="MultiPreviewTitle">
- Preview
- </string>
- <string name="MultiPropertiesTitle">
- Eigenschappen
- </string>
- <string name="InvOfferAnObjectNamed">
- Een object genaamd
- </string>
- <string name="InvOfferOwnedByGroup">
- Eigendom van groep
- </string>
- <string name="InvOfferOwnedByUnknownGroup">
- Eigendom van een onbekende groep
- </string>
- <string name="InvOfferOwnedBy">
- Eigendom van
- </string>
- <string name="InvOfferOwnedByUnknownUser">
- Eigendom van onbekende gebruiker
- </string>
- <string name="InvOfferGaveYou">
- gaf je
- </string>
- <string name="InvOfferYouDecline">
- You decline
- </string>
- <string name="InvOfferFrom">
- van
- </string>
- <string name="GroupMoneyTotal">
- Totaal
- </string>
- <string name="GroupMoneyBought">
- kocht
- </string>
- <string name="GroupMoneyPaidYou">
- betaald u
- </string>
- <string name="GroupMoneyPaidInto">
- gestort
- </string>
- <string name="GroupMoneyBoughtPassTo">
- bought pass to
- </string>
- <string name="GroupMoneyPaidFeeForEvent">
- betaalde vergoeding voor evenement
- </string>
- <string name="GroupMoneyPaidPrizeForEvent">
- betaalde prijs voor evenement
- </string>
- <string name="GroupMoneyBalance">
- Banksaldo
- </string>
- <string name="GroupMoneyCredits">
- Credits
- </string>
- <string name="GroupMoneyDebits">
- Debiteert
- </string>
- <string name="ViewerObjectContents">
- Inhoud
- </string>
- <string name="AcquiredItems">
- Verworven objecten
- </string>
- <string name="Cancel">
- Annuleren
- </string>
- <string name="UploadingCosts">
- Uploading [%s] kosten
- </string>
- <string name="UnknownFileExtension">
- Onbekende extensie [.%s]
-Verwacht .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
- </string>
- <string name="AddLandmarkNavBarMenu">
- Voeg Landmark toe...
- </string>
- <string name="EditLandmarkNavBarMenu">
- Bewerk Landmark...
- </string>
- <string name="accel-mac-control">
- ⌃
- </string>
- <string name="accel-mac-command">
- ⌘
- </string>
- <string name="accel-mac-option">
- ⌥
- </string>
- <string name="accel-mac-shift">
- ⇧
- </string>
- <string name="accel-win-control">
- Ctrl+
- </string>
- <string name="accel-win-alt">
- Alt+
- </string>
- <string name="accel-win-shift">
- Shift+
- </string>
- <string name="FileSaved">
- Bestand Opgeslagen
- </string>
- <string name="Receiving">
- Ontvangen
- </string>
- <string name="AM">
- AM
- </string>
- <string name="PM">
- PM
- </string>
- <string name="PST">
- PST
- </string>
- <string name="PDT">
- PDT
- </string>
- <string name="Forward">
- Vooruit
- </string>
- <string name="Left">
- Links
- </string>
- <string name="Right">
- Rechts
- </string>
- <string name="Back">
- Achteruit
- </string>
- <string name="North">
- Noord
- </string>
- <string name="South">
- Zuid
- </string>
- <string name="West">
- West
- </string>
- <string name="East">
- Oost
- </string>
- <string name="Up">
- Omhoog
- </string>
- <string name="Down">
- Omlaag
- </string>
- <string name="Any Category">
- Elke Categorie
- </string>
- <string name="Shopping">
- Boodschappen
- </string>
- <string name="Land Rental">
- Land Verhuur
- </string>
- <string name="Property Rental">
- Verhuur van onroerend goed
- </string>
- <string name="Special Attraction">
- Speciale Attractie
- </string>
- <string name="New Products">
- Nieuwe Producten
- </string>
- <string name="Employment">
- Employment
- </string>
- <string name="Wanted">
- Gezocht
- </string>
- <string name="Service">
- Service
- </string>
- <string name="Personal">
- Personal
- </string>
- <string name="None">
- Geen
- </string>
- <string name="Linden Location">
- Linden locatie
- </string>
- <string name="Adult">
- Adult
- </string>
- <string name="Arts&amp;Culture">
- Kunst &amp; Cultuur
- </string>
- <string name="Business">
- Zakelijk
- </string>
- <string name="Educational">
- Educatief
- </string>
- <string name="Gaming">
- Spelen
- </string>
- <string name="Hangout">
- Ontmoetingsplaats
- </string>
- <string name="Newcomer Friendly">
- Nieuwkomervriendelijk
- </string>
- <string name="Parks&amp;Nature">
- Parken &amp; natuur
- </string>
- <string name="Residential">
- Woongebied
- </string>
- <string name="Stage">
- Stage
- </string>
- <string name="Other">
- Anders
- </string>
- <string name="Any">
- Any
- </string>
- <string name="You">
- Jij
- </string>
- <string name="Multiple Media">
- Meerdere Media
- </string>
- <string name="Play Media">
- Play/Pause Media
- </string>
- <string name="MBCmdLineError">
- An error was found parsing the command line.
-Please see: http://wiki.secondlife.com/wiki/Client_parameters
-Error:
- </string>
- <string name="MBCmdLineUsg">
- [APP_NAME] Command line usage:
- </string>
- <string name="MBUnableToAccessFile">
- [APP_NAME] is unable to access a file that it needs.
-
-This can be because you somehow have multiple copies running, or your system incorrectly thinks a file is open.
-If this message persists, restart your computer and try again.
-If it continues to persist, you may need to completely uninstall [APP_NAME] and reinstall it.
- </string>
- <string name="MBFatalError">
- Fatal Error
- </string>
- <string name="MBRequiresAltiVec">
- [APP_NAME] requires a processor with AltiVec (G4 or later).
- </string>
- <string name="MBAlreadyRunning">
- [APP_NAME] is already running.
-Check your task bar for a minimized copy of the program.
-If this message persists, restart your computer.
- </string>
- <string name="MBFrozenCrashed">
- [APP_NAME] appears to have frozen or crashed on the previous run.
-Would you like to send a crash report?
- </string>
- <string name="MBAlert">
- Alert
- </string>
- <string name="MBNoDirectX">
- [APP_NAME] is unable to detect DirectX 9.0b or greater.
-[APP_NAME] uses DirectX to detect hardware and/or outdated drivers that can cause stability problems, poor performance and crashes. While you can run [APP_NAME] without it, we highly recommend running with DirectX 9.0b.
-
-Do you wish to continue?
- </string>
- <string name="MBWarning">
- Warning
- </string>
- <string name="MBNoAutoUpdate">
- Automatic updating is not yet implemented for Linux.
-Please download the latest version from www.secondlife.com.
- </string>
- <string name="MBRegClassFailed">
- RegisterClass failed
- </string>
- <string name="MBError">
- Error
- </string>
- <string name="MBFullScreenErr">
- Unable to run fullscreen at [WIDTH] x [HEIGHT].
-Running in window.
- </string>
- <string name="MBDestroyWinFailed">
- Shutdown Error while destroying window (DestroyWindow() failed)
- </string>
- <string name="MBShutdownErr">
- Shutdown Error
- </string>
- <string name="MBDevContextErr">
- Can&apos;t make GL device context
- </string>
- <string name="MBPixelFmtErr">
- Can&apos;t find suitable pixel format
- </string>
- <string name="MBPixelFmtDescErr">
- Can&apos;t get pixel format description
- </string>
- <string name="MBTrueColorWindow">
- [APP_NAME] requires True Color (32-bit) to run.
-Please go to your computer&apos;s display settings and set the color mode to 32-bit.
- </string>
- <string name="MBAlpha">
- [APP_NAME] is unable to run because it can&apos;t get an 8 bit alpha channel. Usually this is due to video card driver issues.
-Please make sure you have the latest video card drivers installed.
-Also be sure your monitor is set to True Color (32-bit) in Control Panels &gt; Display &gt; Settings.
-If you continue to receive this message, contact the [SUPPORT_SITE].
- </string>
- <string name="MBPixelFmtSetErr">
- Can&apos;t set pixel format
- </string>
- <string name="MBGLContextErr">
- Can&apos;t create GL rendering context
- </string>
- <string name="MBGLContextActErr">
- Can&apos;t activate GL rendering context
- </string>
- <string name="MBVideoDrvErr">
- [APP_NAME] is unable to run because your video card drivers did not install properly, are out of date, or are for unsupported hardware. Please make sure you have the latest video card drivers and even if you do have the latest, try reinstalling them.
-
-If you continue to receive this message, contact the [SUPPORT_SITE].
- </string>
- <string name="5 O&apos;Clock Shadow">
- Stoppels
- </string>
- <string name="All White">
- Alles Wit
- </string>
- <string name="Anime Eyes">
- Ogen Animeren
- </string>
- <string name="Arced">
- Gebogen
- </string>
- <string name="Arm Length">
- Arm Lengte
- </string>
- <string name="Attached">
- Bijgevoegt
- </string>
- <string name="Attached Earlobes">
- Bijgevoegde Oorlellen
- </string>
- <string name="Back Bangs">
- Achterkant Pony
- </string>
- <string name="Back Bangs Down">
- Achterkant Pony Neer
- </string>
- <string name="Back Bangs Up">
- Achterkant Pony Omhoog
- </string>
- <string name="Back Fringe">
- Achterkant Franje
- </string>
- <string name="Back Hair">
- Achterkant Haar
- </string>
- <string name="Back Hair Down">
- Achterkant Haar Neer
- </string>
- <string name="Back Hair Up">
- Achterkant Haar Omhoog
- </string>
- <string name="Baggy">
- Oogwallen
- </string>
- <string name="Bangs">
- Pony
- </string>
- <string name="Bangs Down">
- Pony Neer
- </string>
- <string name="Bangs Up">
- Pony Omhoog
- </string>
- <string name="Beady Eyes">
- Kraaloogjes
- </string>
- <string name="Belly Size">
- Buik Grootte
- </string>
- <string name="Big">
- Groot
- </string>
- <string name="Big Butt">
- Grote Kont
- </string>
- <string name="Big Eyeball">
- Grote Oogbol
- </string>
- <string name="Big Hair Back">
- Haar Volume Achter
- </string>
- <string name="Big Hair Front">
- Haar Volume Voor
- </string>
- <string name="Big Hair Top">
- Haar Volume Boven
- </string>
- <string name="Big Head">
- Groot Hoofd
- </string>
- <string name="Big Pectorals">
- Groote Borstspieren
- </string>
- <string name="Big Spikes">
- Grote Stekels
- </string>
- <string name="Black">
- Zwart
- </string>
- <string name="Blonde">
- Blond
- </string>
- <string name="Blonde Hair">
- Blond Haar
- </string>
- <string name="Blush">
- Blozen
- </string>
- <string name="Blush Color">
- Bloos Kleur
- </string>
- <string name="Blush Opacity">
- Bloos Opaciteit
- </string>
- <string name="Body Definition">
- Lichaam Definitie
- </string>
- <string name="Body Fat">
- Lichaam vet
- </string>
- <string name="Body Freckles">
- Lichaam Sproeten
- </string>
- <string name="Body Thick">
- Lichaam Dik
- </string>
- <string name="Body Thickness">
- Lichaam Dikte
- </string>
- <string name="Body Thin">
- Lichaam Dun
- </string>
- <string name="Bow Legged">
- Boog Benen
- </string>
- <string name="Breast Buoyancy">
- Borst Drijfvermogen
- </string>
- <string name="Breast Cleavage">
- Borst Splijting
- </string>
- <string name="Breast Size">
- Borst Grootte
- </string>
- <string name="Bridge Width">
- Brug Breedte
- </string>
- <string name="Broad">
- Breed
- </string>
- <string name="Brow Size">
- Wenkbrauw Grootte
- </string>
- <string name="Bug Eyes">
- Insect Ogen
- </string>
- <string name="Bugged Eyes">
- Insect Ogen
- </string>
- <string name="Bulbous">
- Bolle
- </string>
- <string name="Bulbous Nose">
- Bolle Neus
- </string>
- <string name="Bushy Eyebrows">
- Borstelige Wenkbrauwen
- </string>
- <string name="Bushy Hair">
- Borstelig Haar
- </string>
- <string name="Butt Size">
- Kont Grootte
- </string>
- <string name="bustle skirt">
- Bustle Skirt
- </string>
- <string name="no bustle">
- No Bustle
- </string>
- <string name="more bustle">
- More Bustle
- </string>
- <string name="Chaplin">
- Smalle Snor
- </string>
- <string name="Cheek Bones">
- Jukbeenderen
- </string>
- <string name="Chest Size">
- Borst Grootte
- </string>
- <string name="Chin Angle">
- Kin Hoek
- </string>
- <string name="Chin Cleft">
- Gespleten Kin
- </string>
- <string name="Chin Curtains">
- Kin Gordijnen
- </string>
- <string name="Chin Depth">
- Kin Diepte
- </string>
- <string name="Chin Heavy">
- Kin Zware
- </string>
- <string name="Chin In">
- Kin In
- </string>
- <string name="Chin Out">
- Kin uit
- </string>
- <string name="Chin-Neck">
- Kin-Nek
- </string>
- <string name="Clear">
- Opschonen
- </string>
- <string name="Cleft">
- Gespleten
- </string>
- <string name="Close Set Eyes">
- Close Set Eyes
- </string>
- <string name="Closed">
- Gesloten
- </string>
- <string name="Closed Back">
- Gesloten Achterkant
- </string>
- <string name="Closed Front">
- Gesloten Voorkant
- </string>
- <string name="Closed Left">
- Gesloten Links
- </string>
- <string name="Closed Right">
- Gesloten Rechts
- </string>
- <string name="Coin Purse">
- Verminder Grootte
- </string>
- <string name="Collar Back">
- Kraag Achterkant
- </string>
- <string name="Collar Front">
- Kraag Voorkant
- </string>
- <string name="Corner Down">
- Hoek Omlaag
- </string>
- <string name="Corner Normal">
- Hoek Normaal
- </string>
- <string name="Corner Up">
- Hoek Omhoog
- </string>
- <string name="Creased">
- Gevouwen
- </string>
- <string name="Crooked Nose">
- Kromte Neus
- </string>
- <string name="Cropped Hair">
- Bijgesneden Haar
- </string>
- <string name="Cuff Flare">
- Cuff Flare
- </string>
- <string name="Dark">
- Donker
- </string>
- <string name="Dark Green">
- Donker Groen
- </string>
- <string name="Darker">
- Donkerder
- </string>
- <string name="Deep">
- Diep
- </string>
- <string name="Default Heels">
- Standaard Hielen
- </string>
- <string name="Default Toe">
- Standaard Teen
- </string>
- <string name="Dense">
- Dicht
- </string>
- <string name="Dense hair">
- Dicht haar
- </string>
- <string name="Double Chin">
- Dubbele Kin
- </string>
- <string name="Downturned">
- Downturned
- </string>
- <string name="Duffle Bag">
- Vergroot Grootte
- </string>
- <string name="Ear Angle">
- Oor Hoek
- </string>
- <string name="Ear Size">
- Oor Grootte
- </string>
- <string name="Ear Tips">
- Oor Punten
- </string>
- <string name="Egg Head">
- Ei Hoofd
- </string>
- <string name="Eye Bags">
- Oog Zakken
- </string>
- <string name="Eye Color">
- Oog Kleur
- </string>
- <string name="Eye Depth">
- Oog Diepte
- </string>
- <string name="Eye Lightness">
- Oog Lichtheid
- </string>
- <string name="Eye Opening">
- Oog Opening
- </string>
- <string name="Eye Pop">
- Asymmetrisch
- </string>
- <string name="Eye Size">
- Oog Grootte
- </string>
- <string name="Eye Spacing">
- Oog Afstand
- </string>
- <string name="Eyeball Size">
- Oogbal Grootte
- </string>
- <string name="Eyebrow Arc">
- Wenkbrauw Boog
- </string>
- <string name="Eyebrow Density">
- Wenkbrauw Dichtheid
- </string>
- <string name="Eyebrow Height">
- Wenkbrauw Hoogte
- </string>
- <string name="Eyebrow Points">
- Wenkbrauw Punten
- </string>
- <string name="Eyebrow Size">
- Eyebrow Grootte
- </string>
- <string name="Eyelash Length">
- Eyelash Lengte
- </string>
- <string name="Eyeliner">
- Eyeliner
- </string>
- <string name="Eyeliner Color">
- Eyeliner Kleur
- </string>
- <string name="Eyes Back">
- Ogen Achteruit
- </string>
- <string name="Eyes Bugged">
- Insect Ogen
- </string>
- <string name="Eyes Forward">
- Ogen Vooruit
- </string>
- <string name="Eyes Long Head">
- Eyes Long Head
- </string>
- <string name="Eyes Shear Left Up">
- Eyes Shear Left Up
- </string>
- <string name="Eyes Shear Right Up">
- Eyes Shear Right Up
- </string>
- <string name="Eyes Short Head">
- Eyes Short Head
- </string>
- <string name="Eyes Spread">
- Eyes Spread
- </string>
- <string name="Eyes Sunken">
- Ingevallen Ogen
- </string>
- <string name="Eyes Together">
- Ogen Bij Elkaar
- </string>
- <string name="Face Shear">
- Gezicht Gelijkheid
- </string>
- <string name="Facial Definition">
- Gezichts Definitie
- </string>
- <string name="Far Set Eyes">
- Ogen Uit Elkaar
- </string>
- <string name="Fat">
- Dik
- </string>
- <string name="Fat Head">
- Dik Hoofd
- </string>
- <string name="Fat Lips">
- Dikke Lippen
- </string>
- <string name="Fat Lower">
- Fat Lower
- </string>
- <string name="Fat Lower Lip">
- Fat Lower Lip
- </string>
- <string name="Fat Torso">
- Fat Torso
- </string>
- <string name="Fat Upper">
- Fat Upper
- </string>
- <string name="Fat Upper Lip">
- Dikke Boven Lip
- </string>
- <string name="Female">
- Vrouw
- </string>
- <string name="Fingerless">
- Vingerloos
- </string>
- <string name="Fingers">
- Vingers
- </string>
- <string name="Flared Cuffs">
- Verbrede Vorm
- </string>
- <string name="Flat">
- Plat
- </string>
- <string name="Flat Butt">
- Platte Kont
- </string>
- <string name="Flat Head">
- Plat Hoofd
- </string>
- <string name="Flat Toe">
- Platte Teen
- </string>
- <string name="Foot Size">
- Voet Grootte
- </string>
- <string name="Forehead Angle">
- Voorhoofd Hoek
- </string>
- <string name="Forehead Heavy">
- Zwaar Voorhoofd
- </string>
- <string name="Freckles">
- Sproeten
- </string>
- <string name="Front Bangs Down">
- Voorkant Pony Omlaag
- </string>
- <string name="Front Bangs Up">
- Voorkant Pony Omhoog
- </string>
- <string name="Front Fringe">
- Voorste Rand
- </string>
- <string name="Front Hair">
- Gezichtshaar
- </string>
- <string name="Front Hair Down">
- Gezichtshaar Omlaag
- </string>
- <string name="Front Hair Up">
- Gezichtshaar Omhoog
- </string>
- <string name="Full Back">
- Volle Achterkant
- </string>
- <string name="Full Eyeliner">
- Volle Eyeliner
- </string>
- <string name="Full Front">
- Volle Voorkant
- </string>
- <string name="Full Hair Sides">
- Full Hair Sides
- </string>
- <string name="Full Sides">
- Volle Zijkanten
- </string>
- <string name="Glossy">
- Glanzend
- </string>
- <string name="Glove Fingers">
- Vinger Handschoenen
- </string>
- <string name="Glove Length">
- Handschoen Lengte
- </string>
- <string name="Hair">
- Haar
- </string>
- <string name="Hair Back">
- Haar: Zwart
- </string>
- <string name="Hair Front">
- Haar: Voorkant
- </string>
- <string name="Hair Sides">
- Haar: Zijkant
- </string>
- <string name="Hair Sweep">
- Hair Sweep
- </string>
- <string name="Hair Thickess">
- Haar Dikheid
- </string>
- <string name="Hair Thickness">
- Hair Dikheid
- </string>
- <string name="Hair Tilt">
- Hair Tilt
- </string>
- <string name="Hair Tilted Left">
- Hair Tilted Left
- </string>
- <string name="Hair Tilted Right">
- Hair Tilted Right
- </string>
- <string name="Hair Volume">
- Haar: Volume
- </string>
- <string name="Hand Size">
- Hand Grootte
- </string>
- <string name="Handlebars">
- Handlebars
- </string>
- <string name="Head Length">
- Hoofd Lengte
- </string>
- <string name="Head Shape">
- Hoofd Vorm
- </string>
- <string name="Head Size">
- Hooft Grootte
- </string>
- <string name="Head Stretch">
- Hoofd Uitrekken
- </string>
- <string name="Heel Height">
- Hiel Hoogte
- </string>
- <string name="Heel Shape">
- Hiel Vorm
- </string>
- <string name="Height">
- Hoogte
- </string>
- <string name="High">
- Hoog
- </string>
- <string name="High Heels">
- Hoge Hielen
- </string>
- <string name="High Jaw">
- Hoge Kaak
- </string>
- <string name="High Platforms">
- High Platforms
- </string>
- <string name="High and Tight">
- Hoog en Strak
- </string>
- <string name="Higher">
- Hoger
- </string>
- <string name="Hip Length">
- Heup Lengte
- </string>
- <string name="Hip Width">
- Heup Breedte
- </string>
- <string name="In">
- Naar Binnen
- </string>
- <string name="In Shdw Color">
- Binnenste Schaduw Kleur
- </string>
- <string name="In Shdw Opacity">
- Binnenste Schaduw Opaciteit
- </string>
- <string name="Inner Eye Corner">
- Binnenste Oog Hoek
- </string>
- <string name="Inner Eye Shadow">
- Binnenste Oog Schaduw
- </string>
- <string name="Inner Shadow">
- Binnenste Schaduw
- </string>
- <string name="Jacket Length">
- Jas Lengte
- </string>
- <string name="Jacket Wrinkles">
- Jas Rimpels
- </string>
- <string name="Jaw Angle">
- Kaak Hoek
- </string>
- <string name="Jaw Jut">
- Jaw Jut
- </string>
- <string name="Jaw Shape">
- Kaak Vorm
- </string>
- <string name="Join">
- Samenvoegen
- </string>
- <string name="Jowls">
- Kaken
- </string>
- <string name="Knee Angle">
- Knie Hoek
- </string>
- <string name="Knock Kneed">
- Knieën Naar binnen
- </string>
- <string name="Large">
- Fors
- </string>
- <string name="Large Hands">
- Grote Handen
- </string>
- <string name="Left Part">
- Linker Deel
- </string>
- <string name="Leg Length">
- Been Lengte
- </string>
- <string name="Leg Muscles">
- Been Spieren
- </string>
- <string name="Less">
- Minder
- </string>
- <string name="Less Body Fat">
- Minder Lichaams Vet
- </string>
- <string name="Less Curtains">
- Less Curtains
- </string>
- <string name="Less Freckles">
- Minder Sproeten
- </string>
- <string name="Less Full">
- Minder Vol
- </string>
- <string name="Less Gravity">
- Minder Zwaartekracht
- </string>
- <string name="Less Love">
- Less Love
- </string>
- <string name="Less Muscles">
- Minder Spieren
- </string>
- <string name="Less Muscular">
- Minder Spieren
- </string>
- <string name="Less Rosy">
- Minder Rooskleurig
- </string>
- <string name="Less Round">
- Minder Rond
- </string>
- <string name="Less Saddle">
- Minder Heupen
- </string>
- <string name="Less Square">
- Minder Vierkant
- </string>
- <string name="Less Volume">
- Minder Volume
- </string>
- <string name="Less soul">
- Minder Ziel
- </string>
- <string name="Lighter">
- Lichter
- </string>
- <string name="Lip Cleft">
- Gespleten Lip
- </string>
- <string name="Lip Cleft Depth">
- Gespleten Lip Diepte
- </string>
- <string name="Lip Fullness">
- Lip Volheid
- </string>
- <string name="Lip Pinkness">
- Rozeheid Lippen
- </string>
- <string name="Lip Ratio">
- Lip Ratio
- </string>
- <string name="Lip Thickness">
- Lip Dikheid
- </string>
- <string name="Lip Width">
- Lip Breedte
- </string>
- <string name="Lipgloss">
- Lipgloss
- </string>
- <string name="Lipstick">
- Lipstick
- </string>
- <string name="Lipstick Color">
- Lipstick Kleur
- </string>
- <string name="Long">
- Lang
- </string>
- <string name="Long Head">
- Lang Hoofd
- </string>
- <string name="Long Hips">
- Lange Heupen
- </string>
- <string name="Long Legs">
- Lange Benen
- </string>
- <string name="Long Neck">
- Lange Nek
- </string>
- <string name="Long Pigtails">
- Long Pigtails
- </string>
- <string name="Long Ponytail">
- Lange Paardenstaart
- </string>
- <string name="Long Torso">
- Lang Torso
- </string>
- <string name="Long arms">
- Lange Armen
- </string>
- <string name="Longcuffs">
- Longcuffs
- </string>
- <string name="Loose Pants">
- Losse Broek
- </string>
- <string name="Loose Shirt">
- Los Shirt
- </string>
- <string name="Loose Sleeves">
- Losse Mouwen
- </string>
- <string name="Love Handles">
- Love Handles
- </string>
- <string name="Low">
- Laag
- </string>
- <string name="Low Heels">
- Lage Hielen
- </string>
- <string name="Low Jaw">
- Lage Kaak
- </string>
- <string name="Low Platforms">
- Lage Platforms
- </string>
- <string name="Low and Loose">
- Laag en Los
- </string>
- <string name="Lower">
- Lager
- </string>
- <string name="Lower Bridge">
- Lagere Brug
- </string>
- <string name="Lower Cheeks">
- Lagere Wangen
- </string>
- <string name="Male">
- Man
- </string>
- <string name="Middle Part">
- Middelste Deel
- </string>
- <string name="More">
- Meer
- </string>
- <string name="More Blush">
- Meer Blozen
- </string>
- <string name="More Body Fat">
- Meer Lichaams Vet
- </string>
- <string name="More Curtains">
- More Curtains
- </string>
- <string name="More Eyeshadow">
- Meer Oogshadow
- </string>
- <string name="More Freckles">
- Meer Sproeten
- </string>
- <string name="More Full">
- Meer Vol
- </string>
- <string name="More Gravity">
- Meer Zwaartekracht
- </string>
- <string name="More Lipstick">
- Meer Lippenstift
- </string>
- <string name="More Love">
- Meer Lovehandels
- </string>
- <string name="More Lower Lip">
- Meer Onder Lip
- </string>
- <string name="More Muscles">
- Meer Spieren
- </string>
- <string name="More Muscular">
- Meer Spieren
- </string>
- <string name="More Rosy">
- More Rosy
- </string>
- <string name="More Round">
- Meer Rond
- </string>
- <string name="More Saddle">
- Meer Heupen
- </string>
- <string name="More Sloped">
- Meer Hellend
- </string>
- <string name="More Square">
- Meer Vierkant
- </string>
- <string name="More Upper Lip">
- Meer Boven Lip
- </string>
- <string name="More Vertical">
- Meer Verticaal
- </string>
- <string name="More Volume">
- Meer Volume
- </string>
- <string name="More soul">
- Meer ziel
- </string>
- <string name="Moustache">
- Snor
- </string>
- <string name="Mouth Corner">
- Mond Hoek
- </string>
- <string name="Mouth Position">
- Mond Positie
- </string>
- <string name="Mowhawk">
- Hanekam
- </string>
- <string name="Muscular">
- Gespiert
- </string>
- <string name="Mutton Chops">
- Mutton Chops
- </string>
- <string name="Nail Polish">
- Nagel Lak
- </string>
- <string name="Nail Polish Color">
- Nagel Lak Kleur
- </string>
- <string name="Narrow">
- Smal
- </string>
- <string name="Narrow Back">
- Smalle Achterkant
- </string>
- <string name="Narrow Front">
- Smalle Voorkant
- </string>
- <string name="Narrow Lips">
- Smalle Lippen
- </string>
- <string name="Natural">
- Natural
- </string>
- <string name="Neck Length">
- Nek Lengte
- </string>
- <string name="Neck Thickness">
- Nek Dikheid
- </string>
- <string name="No Blush">
- Geen Bloos
- </string>
- <string name="No Eyeliner">
- Geen Eyeliner
- </string>
- <string name="No Eyeshadow">
- Geen Oogschaduw
- </string>
- <string name="No Heels">
- Geen Hakken
- </string>
- <string name="No Lipgloss">
- Geen Lipgloss
- </string>
- <string name="No Lipstick">
- Geen Lippenstift
- </string>
- <string name="No Part">
- Geen Deel
- </string>
- <string name="No Polish">
- Geen Glans
- </string>
- <string name="No Red">
- Geen Rood
- </string>
- <string name="No Spikes">
- Geen Stekels
- </string>
- <string name="No White">
- Geen Wit
- </string>
- <string name="No Wrinkles">
- Geen Rimpels
- </string>
- <string name="Normal Lower">
- Normaal Onder
- </string>
- <string name="Normal Upper">
- Normaal Boven
- </string>
- <string name="Nose Left">
- Neus Links
- </string>
- <string name="Nose Right">
- Neus Rechts
- </string>
- <string name="Nose Size">
- Neus Grootte
- </string>
- <string name="Nose Thickness">
- Neus Dickheid
- </string>
- <string name="Nose Tip Angle">
- Neus Top Hoek
- </string>
- <string name="Nose Tip Shape">
- Neus Top Vorm
- </string>
- <string name="Nose Width">
- Neus Breedte
- </string>
- <string name="Nostril Division">
- Nostril Division
- </string>
- <string name="Nostril Width">
- Neusgat Breedte
- </string>
- <string name="Old">
- Oud
- </string>
- <string name="Opaque">
- Ondoorzichtig
- </string>
- <string name="Open">
- Open
- </string>
- <string name="Open Back">
- Open Achterkant
- </string>
- <string name="Open Front">
- Open Voorkant
- </string>
- <string name="Open Left">
- Open Links
- </string>
- <string name="Open Right">
- Open Rechts
- </string>
- <string name="Orange">
- Oranje
- </string>
- <string name="Out">
- Uit
- </string>
- <string name="Out Shdw Color">
- Buitenste Schaduw Kleur
- </string>
- <string name="Out Shdw Opacity">
- Buitenste Schaduw Opaciteit
- </string>
- <string name="Outer Eye Corner">
- Buitenste Oog Hoek
- </string>
- <string name="Outer Eye Shadow">
- Buitenste Oog Schaduw
- </string>
- <string name="Outer Shadow">
- Buitenste Schaduw
- </string>
- <string name="Overbite">
- Overbeet
- </string>
- <string name="Package">
- Genitaliën
- </string>
- <string name="Painted Nails">
- Gelakte Nagels
- </string>
- <string name="Pale">
- Dof
- </string>
- <string name="Pants Crotch">
- Broek Kruis
- </string>
- <string name="Pants Fit">
- Broek Passend
- </string>
- <string name="Pants Length">
- Broek Lengte
- </string>
- <string name="Pants Waist">
- Broek Teille
- </string>
- <string name="Pants Wrinkles">
- Broek Rimpels
- </string>
- <string name="Part">
- Deel
- </string>
- <string name="Part Bangs">
- Part Bangs
- </string>
- <string name="Pectorals">
- Borstspieren
- </string>
- <string name="Pigment">
- Pigment
- </string>
- <string name="Pigtails">
- Pigtails
- </string>
- <string name="Pink">
- Roze
- </string>
- <string name="Pinker">
- Rozer
- </string>
- <string name="Platform Height">
- Platform Hoogte
- </string>
- <string name="Platform Width">
- Platform Breedte
- </string>
- <string name="Pointy">
- Puntig
- </string>
- <string name="Pointy Heels">
- Puntige Hielen
- </string>
- <string name="Pointy Toe">
- Puntige Tenen
- </string>
- <string name="Ponytail">
- Paardenstaard
- </string>
- <string name="Poofy Skirt">
- Poofy Skirt
- </string>
- <string name="Pop Left Eye">
- Asymmetrisch Links
- </string>
- <string name="Pop Right Eye">
- Asymmetrisch Rechts
- </string>
- <string name="Puffy">
- Opgezwollen
- </string>
- <string name="Puffy Eyelids">
- Opgezwollen Oogleden
- </string>
- <string name="Rainbow Color">
- Regenboog Kleur
- </string>
- <string name="Red Hair">
- Rood Haar
- </string>
- <string name="Red Skin">
- Rode Huid
- </string>
- <string name="Regular">
- Normaal
- </string>
- <string name="Regular Muscles">
- Normale Spieren
- </string>
- <string name="Right Part">
- Rechter Deel
- </string>
- <string name="Rosy Complexion">
- Rosy Complexion
- </string>
- <string name="Round">
- Rond
- </string>
- <string name="Round Forehead">
- Rond Voorhoofd
- </string>
- <string name="Ruddiness">
- Rossige kleur
- </string>
- <string name="Ruddy">
- Rossig
- </string>
- <string name="Rumpled Hair">
- Rumpled Hair
- </string>
- <string name="Saddle Bags">
- Saddle Bags
- </string>
- <string name="Saddlebags">
- Saddlebags
- </string>
- <string name="Scrawny">
- Magere
- </string>
- <string name="Scrawny Leg">
- Mager Been
- </string>
- <string name="Separate">
- Scheiden
- </string>
- <string name="Shading">
- Shading
- </string>
- <string name="Shadow hair">
- Schaduw Haar
- </string>
- <string name="Shallow">
- Ondiep
- </string>
- <string name="Shear Back">
- Shear Back
- </string>
- <string name="Shear Face">
- Shear Face
- </string>
- <string name="Shear Front">
- Shear Front
- </string>
- <string name="Shear Left">
- Shear Left
- </string>
- <string name="Shear Left Up">
- Shear Left Up
- </string>
- <string name="Shear Right">
- Shear Right
- </string>
- <string name="Shear Right Up">
- Shear Right Up
- </string>
- <string name="Sheared Back">
- Sheared Back
- </string>
- <string name="Sheared Front">
- Sheared Front
- </string>
- <string name="Shift Left">
- Verplaats Links
- </string>
- <string name="Shift Mouth">
- Verplaats Mond
- </string>
- <string name="Shift Right">
- Verplaats Rechts
- </string>
- <string name="Shirt Bottom">
- Hemd Onderkant
- </string>
- <string name="Shirt Fit">
- Hemd Passend
- </string>
- <string name="Shirt Wrinkles">
- Hemd Rimpels
- </string>
- <string name="Shoe Height">
- Schoen Hoogte
- </string>
- <string name="Short">
- Kort
- </string>
- <string name="Short Arms">
- Korte Armen
- </string>
- <string name="Short Legs">
- Korte Benen
- </string>
- <string name="Short Neck">
- Korte Nek
- </string>
- <string name="Short Pigtails">
- Short Pigtails
- </string>
- <string name="Short Ponytail">
- Korte Paardenstaart
- </string>
- <string name="Short Sideburns">
- Korte Bakkebaarden
- </string>
- <string name="Short Torso">
- Korte Torso
- </string>
- <string name="Short hips">
- Korte Heupen
- </string>
- <string name="Shoulders">
- Shouders
- </string>
- <string name="Side Bangs">
- Side Bangs
- </string>
- <string name="Side Bangs Down">
- Side Bangs Down
- </string>
- <string name="Side Bangs Up">
- Side Bangs Up
- </string>
- <string name="Side Fringe">
- Side Fringe
- </string>
- <string name="Sideburns">
- Bakkebaarden
- </string>
- <string name="Sides Hair">
- Sides Hair
- </string>
- <string name="Sides Hair Down">
- Sides Hair Down
- </string>
- <string name="Sides Hair Up">
- Sides Hair Up
- </string>
- <string name="Skinny">
- Broodmager
- </string>
- <string name="Skinny Neck">
- Smalle Nek
- </string>
- <string name="Skirt Fit">
- Skirt Fit
- </string>
- <string name="Skirt Length">
- Rok Lengte
- </string>
- <string name="Slanted Forehead">
- Schuin voorhoofd
- </string>
- <string name="Sleeve Length">
- Mouw Lengte
- </string>
- <string name="Sleeve Looseness">
- Mouw Losheid
- </string>
- <string name="Slit Back">
- Spleet: Achter
- </string>
- <string name="Slit Front">
- Spleet: Voor
- </string>
- <string name="Slit Left">
- Spleet: Links
- </string>
- <string name="Slit Right">
- Spleet: Rechts
- </string>
- <string name="Small">
- Klein
- </string>
- <string name="Small Hands">
- Kleine Handen
- </string>
- <string name="Small Head">
- Klein Hoofd
- </string>
- <string name="Smooth">
- Glad
- </string>
- <string name="Smooth Hair">
- Glad Haar
- </string>
- <string name="Socks Length">
- Sok Lengte
- </string>
- <string name="Some">
- enkele
- </string>
- <string name="Soulpatch">
- Soulpatch
- </string>
- <string name="Sparse">
- Schaars
- </string>
- <string name="Spiked Hair">
- Puntig Haar
- </string>
- <string name="Square">
- Vierkant
- </string>
- <string name="Square Toe">
- Vierkante Teen
- </string>
- <string name="Squash Head">
- Squash Head
- </string>
- <string name="Squash/Stretch Head">
- Squash/Stretch Head
- </string>
- <string name="Stretch Head">
- Uitgerekt Hoofd
- </string>
- <string name="Sunken">
- Verzonken
- </string>
- <string name="Sunken Chest">
- Verzonken Borstkas
- </string>
- <string name="Sunken Eyes">
- Verzonken Ogen
- </string>
- <string name="Sweep Back">
- Sweep Back
- </string>
- <string name="Sweep Forward">
- Sweep Forward
- </string>
- <string name="Swept Back">
- Swept Back
- </string>
- <string name="Swept Back Hair">
- Swept Back Hair
- </string>
- <string name="Swept Forward">
- Swept Forward
- </string>
- <string name="Swept Forward Hair">
- Swept Forward Hair
- </string>
- <string name="Tall">
- Lang
- </string>
- <string name="Taper Back">
- Spits Achter
- </string>
- <string name="Taper Front">
- Spits Voor
- </string>
- <string name="Thick Heels">
- Dikke Hielen
- </string>
- <string name="Thick Neck">
- Dikke Nek
- </string>
- <string name="Thick Toe">
- Dikke Teen
- </string>
- <string name="Thickness">
- Dikheid
- </string>
- <string name="Thin">
- Dun
- </string>
- <string name="Thin Eyebrows">
- Dunne Wenkbrouwen
- </string>
- <string name="Thin Lips">
- Dunne Lippen
- </string>
- <string name="Thin Nose">
- Dunne Neus
- </string>
- <string name="Tight Chin">
- Strakke Kin
- </string>
- <string name="Tight Cuffs">
- Strakke Manchetten
- </string>
- <string name="Tight Pants">
- Strakke Broek
- </string>
- <string name="Tight Shirt">
- Strak Hemd
- </string>
- <string name="Tight Skirt">
- Strakke Rok
- </string>
- <string name="Tight Sleeves">
- Strakke Mouwen
- </string>
- <string name="Tilt Left">
- Tilt Left
- </string>
- <string name="Tilt Right">
- Tilt Right
- </string>
- <string name="Toe Shape">
- Teen Vorm
- </string>
- <string name="Toe Thickness">
- Teen Dikheid
- </string>
- <string name="Torso Length">
- Borstkas Lengte
- </string>
- <string name="Torso Muscles">
- Borstkas Spieren
- </string>
- <string name="Torso Scrawny">
- Magere Borstkas
- </string>
- <string name="Unattached">
- Niet Verbonden
- </string>
- <string name="Uncreased">
- Uncreased
- </string>
- <string name="Underbite">
- onderbeet
- </string>
- <string name="Unnatural">
- Onnatuurlijk
- </string>
- <string name="Upper Bridge">
- Boven Brug
- </string>
- <string name="Upper Cheeks">
- Bovenste Wangen
- </string>
- <string name="Upper Chin Cleft">
- Bovenste Kin Gespleten
- </string>
- <string name="Upper Eyelid Fold">
- Bovenste Ooglid Gevouwen
- </string>
- <string name="Upturned">
- Omgekeerde
- </string>
- <string name="Very Red">
- Erg Rood
- </string>
- <string name="Waist Height">
- Taille Hoogte
- </string>
- <string name="Well-Fed">
- Goed Gevoed
- </string>
- <string name="White Hair">
- Wit Haar
- </string>
- <string name="Wide">
- Breed
- </string>
- <string name="Wide Back">
- Breede Achterkant
- </string>
- <string name="Wide Front">
- Breed Voorkant
- </string>
- <string name="Wide Lips">
- Breed Lippen
- </string>
- <string name="Wild">
- Wild
- </string>
- <string name="Wrinkles">
- Rimpels
- </string>
- <string name="LocationCtrlAddLandmarkTooltip">
- Add to My Landmarks
- </string>
- <string name="LocationCtrlEditLandmarkTooltip">
- Edit My Landmark
- </string>
- <string name="LocationCtrlInfoBtnTooltip">
- See more info about the current location
- </string>
- <string name="LocationCtrlComboBtnTooltip">
- My location history
- </string>
- <string name="UpdaterWindowTitle">
- [APP_NAME] Update
- </string>
- <string name="UpdaterNowUpdating">
- Now updating [APP_NAME]...
- </string>
- <string name="UpdaterNowInstalling">
- Installing [APP_NAME]...
- </string>
- <string name="UpdaterUpdatingDescriptive">
- Your [APP_NAME] Viewer is being updated to the latest release. This may take some time, so please be patient.
- </string>
- <string name="UpdaterProgressBarTextWithEllipses">
- Downloading update...
- </string>
- <string name="UpdaterProgressBarText">
- Downloading update
- </string>
- <string name="UpdaterFailDownloadTitle">
- Failed to download update
- </string>
- <string name="UpdaterFailUpdateDescriptive">
- An error occurred while updating [APP_NAME]. Please download the latest version from www.secondlife.com.
- </string>
- <string name="UpdaterFailInstallTitle">
- Failed to install update
- </string>
- <string name="UpdaterFailStartTitle">
- Failed to start viewer
- </string>
- <string name="IM_logging_string">
- -- Instant message logging enabled --
- </string>
- <string name="IM_typing_start_string">
- [NAME] is typing...
- </string>
- <string name="Unnamed">
- (Unnamed)
- </string>
- <string name="IM_moderated_chat_label">
- (Moderated: Voices off by default)
- </string>
- <string name="IM_unavailable_text_label">
- Text chat is not available for this call.
- </string>
- <string name="IM_muted_text_label">
- Your text chat has been disabled by a Group Moderator.
- </string>
- <string name="IM_default_text_label">
- Click here to instant message.
- </string>
- <string name="IM_to_label">
- To
- </string>
- <string name="IM_moderator_label">
- (Moderator)
- </string>
- <string name="only_user_message">
- U bent de enige gebruiker in deze sessie.
- </string>
- <string name="offline_message">
- [NAME] is offline.
- </string>
- <string name="invite_message">
- Klik de [BUTTON NAME] knop om deze voicechat te accepteren/verbinden.
- </string>
- <string name="generic_request_error">
- Fout tijdens het maken van het verzoek, probeer het later nog een keer.
- </string>
- <string name="insufficient_perms_error">
- U heeft niet voldoende permissies.
- </string>
- <string name="session_does_not_exist_error">
- De sessie bestaat niet meer
- </string>
- <string name="no_ability_error">
- U beschikt niet over die mogelijkheid.
- </string>
- <string name="no_ability">
- U beschikt niet over die mogelijkheid.
- </string>
- <string name="not_a_mod_error">
- U bent geen sessie moderateur
- </string>
- <string name="muted_error">
- Een groepsmoderator heeft uw textchat uitgeschakeld.
- </string>
- <string name="add_session_event">
- Kan geen gebruikers toevoegen aan chatsessie met [RECIPIENT].
- </string>
- <string name="message_session_event">
- Kan uw bericht niet versturen naar de chatsessie met [RECIPIENT].
- </string>
- <string name="removed_from_group">
- U bent verwijderd uit de groep.
- </string>
- <string name="close_on_no_ability">
- U heeft niet langer de mogelijkheid om in deze chatsessie te zijn.
- </string>
-</strings>
diff --git a/indra/newview/skins/default/xui/nl/teleport_strings.xml b/indra/newview/skins/default/xui/nl/teleport_strings.xml
deleted file mode 100644
index 12a81447c0..0000000000
--- a/indra/newview/skins/default/xui/nl/teleport_strings.xml
+++ /dev/null
@@ -1,75 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<teleport_messages>
- <message_set name="errors">
- <message name="invalid_tport">
- Probleem ondervonden bij het verwerken van uw verzoek voor een teleport. Het kan nodig zijn om opnieuw in te loggen voordat u kunt teleporteren.
-Als u dit bericht blijft krijgen, controleert u dan alstublieft [SUPPORT_SITE].
- </message>
- <message name="invalid_region_handoff">
- Er is een probleem opgetreden bij het oversteken naar een andere regio. U dient wellicht opnieuw in te loggen voor uw kunt oversteken naar andere regio&apos;s.
-Als u dit bericht blijft krijgen, controleert u dan alstublieft [SUPPORT_SITE].
- </message>
- <message name="blocked_tport">
- Sorry, teleport is momenteel geblokkeerd. Probeer het zo meteen opnieuw. Indien u nog steeds niet kunt teleporteren, log dan alstublieft uit en weer in om het probleem te verhelpen.
- </message>
- <message name="nolandmark_tport">
- Sorry, het systeem was niet in staat de bestemming van de landmarkering te vinden.
- </message>
- <message name="timeout_tport">
- Sorry, het systeem was niet in staat om de teleport verbinding af te ronden. Probeer het zo meteen nog een keer.
- </message>
- <message name="noaccess_tport">
- Sorry, u heeft geen toegang tot die teleportbestemming.
- </message>
- <message name="missing_attach_tport">
- Uw bevestigingen zijn nog niet gearriveerd. Probeer nog een aantal seconden te wachten of log uit en weer in voor u probeert te teleporteren.
- </message>
- <message name="too_many_uploads_tport">
- De assetwachtrij in deze regio is momenteel volgelopen, dus uw teleportverzoek zal niet tijdig afgerond kunnen worden. Probeer het alstublieft opnieuw over een aantal minuten of ga naar een minder druk gebied.
- </message>
- <message name="expired_tport">
- Sorry, het systeem was niet in staat uw teleportverzoek tijdig af te ronden. Probeer het alstublieft opnieuw over een aantal minuten.
- </message>
- <message name="expired_region_handoff">
- Sorry, het systeem was niet in staat om het oversteken naar een andere regio tijdig af te ronden. Probeer het alstublieft opnieuw over een aantal minuten.
- </message>
- <message name="no_host">
- Kan teleportbestemming niet vinden. De bestemming is mogelijk tijdelijk niet beschikbaar of bestaat niet meer. Probeer het alstublieft opnieuw over een aantal minuten.
- </message>
- <message name="no_inventory_host">
- Het inventarissysteem is momenteel niet beschikbaar.
- </message>
- </message_set>
- <message_set name="progress">
- <message name="sending_dest">
- Verzenden naar bestemming
- </message>
- <message name="redirecting">
- U wordt doorverwezen naar andere locatie.
- </message>
- <message name="relaying">
- Omschakelen naar bestemming.
- </message>
- <message name="sending_home">
- Thuislocatieverzoek verzenden
- </message>
- <message name="sending_landmark">
- Landmarkeringlocatieverzoek verzenden
- </message>
- <message name="completing">
- Teleport voltooien
- </message>
- <message name="resolving">
- Bestemming bepalen.
- </message>
- <message name="contacting">
- Contact maken met nieuwe regio.
- </message>
- <message name="arriving">
- Arriveren…
- </message>
- <message name="requesting">
- Teleport aanvragen…
- </message>
- </message_set>
-</teleport_messages>
diff --git a/indra/newview/skins/default/xui/pl/floater_about.xml b/indra/newview/skins/default/xui/pl/floater_about.xml
index 637325ddd0..409429ffaa 100644
--- a/indra/newview/skins/default/xui/pl/floater_about.xml
+++ b/indra/newview/skins/default/xui/pl/floater_about.xml
@@ -10,7 +10,7 @@
<floater.string name="AboutPosition">
Położenie [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] w [REGION] zlokalizowanym w &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ([HOSTIP])
[SERVER_VERSION]
-[[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]]
+[SERVER_RELEASE_NOTES_URL]
</floater.string>
<floater.string name="AboutSystem">
Procesor: [CPU]
diff --git a/indra/newview/skins/default/xui/pl/floater_about_land.xml b/indra/newview/skins/default/xui/pl/floater_about_land.xml
index 0974518a1f..badff11a59 100644
--- a/indra/newview/skins/default/xui/pl/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/pl/floater_about_land.xml
@@ -87,15 +87,9 @@ Idź do Świat &gt; O Posiadłości albo wybierz inną posiadłość żeby pokaz
<text name="Owner:">
Właściciel:
</text>
- <text name="OwnerText">
- Leyla Linden
- </text>
<text name="Group:">
Grupa:
</text>
- <text name="GroupText">
- Leyla Linden
- </text>
<button label="Ustaw" name="Set..."/>
<check_box label="Udostępnij przypisywanie na Grupę" name="check deed" tool_tip="Oficer Grupy ma prawo przepisać prawo własności Posiadłości na Grupę. Posiadłość wspierana jest przez przydziały pochodzące od członków Grupy."/>
<button label="Przypisz" name="Deed..." tool_tip="Prawo przypisania Posiadłości na Grupę może dokonać jedynie oficer Grupy."/>
@@ -355,6 +349,7 @@ Jedynie większe posiadłości mogą być umieszczone w bazie wyszukiwarki.
<combo_box.item label="Park i natura" name="item9"/>
<combo_box.item label="Mieszkalna" name="item10"/>
<combo_box.item label="Zakupy" name="item11"/>
+ <combo_box.item label="Opłata za wynajęcie" name="item13"/>
<combo_box.item label="Inna" name="item12"/>
</combo_box>
<combo_box name="land category">
@@ -369,6 +364,7 @@ Jedynie większe posiadłości mogą być umieszczone w bazie wyszukiwarki.
<combo_box.item label="Parki i natura" name="item9"/>
<combo_box.item label="Mieszkalna" name="item10"/>
<combo_box.item label="Zakupy" name="item11"/>
+ <combo_box.item label="Opłata za wynajęcie" name="item13"/>
<combo_box.item label="Inna" name="item12"/>
</combo_box>
<check_box label="Treść &apos;Mature&apos;" name="MatureCheck" tool_tip=""/>
@@ -399,7 +395,6 @@ Jedynie większe posiadłości mogą być umieszczone w bazie wyszukiwarki.
URL mediów:
</text>
<button label="Ustaw" name="set_media_url"/>
- <check_box label="Ukryj URL mediów" name="hide_media_url" tool_tip="Wybranie tej opcji, zablokuje widok adresu do medów wszystkim nieautoryzowanym Rezydentom. Nie dotyczy to jednak typów HTML."/>
<text name="Description:">
Opis:
</text>
@@ -428,7 +423,6 @@ Mediów:
<check_box label="Powtórka Odtwarzania" name="media_loop" tool_tip="Odtwarzaj media z powtórką. Po wyświetleniu materialu, rozpocznie się odtwarzanie od początku."/>
</panel>
<panel label="DŹWIĘK" name="land_audio_panel">
- <check_box label="Ukryj URL muzyki" name="hide_music_url" tool_tip="Wybranie tej opcji, zablokuje widok adresu do medów muzycznych w posiadłości wszystkim nieautoryzowanym Użytkownikom"/>
<check_box label="Rozmowy dozwolone" name="parcel_enable_voice_channel"/>
<check_box label="Rozmowy dozwolone (ustawione przez MajÄ…tek)" name="parcel_enable_voice_channel_is_estate_disabled"/>
<check_box label="Ogranicz komunikację głosową w tej Posiadłości." name="parcel_enable_voice_channel_local"/>
@@ -438,7 +432,7 @@ Mediów:
(Zdefiniowane przez MajÄ…tek)
</panel.string>
<panel.string name="allow_public_access">
- Udostępnij publicznie ([MATURITY])
+ Udostępniaj publicznie ([MATURITY]) (Pamiętaj: w przypadku braku zaznaczenia tej opcji widoczne będą linie bana.)
</panel.string>
<panel.string name="estate_override">
Jedna lub więcej z tych opcji ustawiona jest z poziomu Posiadłości
diff --git a/indra/newview/skins/default/xui/pl/floater_beacons.xml b/indra/newview/skins/default/xui/pl/floater_beacons.xml
index 547db2b351..e6286a6ac1 100644
--- a/indra/newview/skins/default/xui/pl/floater_beacons.xml
+++ b/indra/newview/skins/default/xui/pl/floater_beacons.xml
@@ -17,5 +17,6 @@
<check_box label="Obiekty dotykalne" name="touch_only"/>
<check_box label="Źródła dźwięku" name="sounds"/>
<check_box label="Źródła cząsteczek" name="particles"/>
+ <check_box label="Źródła mediów" name="moapbeacon"/>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_buy_currency.xml b/indra/newview/skins/default/xui/pl/floater_buy_currency.xml
index f2a6579dc3..3e51761b37 100644
--- a/indra/newview/skins/default/xui/pl/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/pl/floater_buy_currency.xml
@@ -46,7 +46,7 @@
[AMT]L$
</text>
<text name="currency_links">
- [http://www.secondlife.com/my/account/payment_method_management.php metoda płatności] | [http://www.secondlife.com/my/account/currency.php waluta] | [http://www.secondlife.com/my/account/exchange_rates.php kurs wymiany]
+ [http://www.secondlife.com/my/account/payment_method_management.php metoda płatności] | [http://www.secondlife.com/my/account/currency.php waluta]
</text>
<text name="exchange_rate_note">
Wpisz ponownie kwotę aby zobaczyć ostatni kurs wymiany.
diff --git a/indra/newview/skins/default/xui/pl/floater_camera.xml b/indra/newview/skins/default/xui/pl/floater_camera.xml
index 5b9dd47616..60f3cd0fff 100644
--- a/indra/newview/skins/default/xui/pl/floater_camera.xml
+++ b/indra/newview/skins/default/xui/pl/floater_camera.xml
@@ -9,15 +9,6 @@
<floater.string name="move_tooltip">
Poruszaj kamerą w dół/górę oraz w prawo/lewo
</floater.string>
- <floater.string name="camera_modes_title">
- Ustawienia
- </floater.string>
- <floater.string name="pan_mode_title">
- W prawo lub w lewo
- </floater.string>
- <floater.string name="presets_mode_title">
- Ustaw widok
- </floater.string>
<floater.string name="free_mode_title">
Zobacz obiekt
</floater.string>
diff --git a/indra/newview/skins/default/xui/pl/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/pl/floater_day_cycle_options.xml
deleted file mode 100644
index f3929df3e3..0000000000
--- a/indra/newview/skins/default/xui/pl/floater_day_cycle_options.xml
+++ /dev/null
@@ -1,96 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Day Cycle Floater" title="EDYTOR CYKLU DNIA">
- <tab_container name="Day Cycle Tabs">
- <panel label="Cykl dnia" name="Day Cycle">
- <button label="?" name="WLDayCycleHelp"/>
- <multi_slider label="" name="WLTimeSlider"/>
- <multi_slider label="" name="WLDayCycleKeys"/>
- <text name="WL12am">
- 12am
- </text>
- <text name="WL3am">
- 3am
- </text>
- <text name="WL6am">
- 6am
- </text>
- <text name="WL9amHash">
- 9am
- </text>
- <text name="WL12pmHash">
- 12pm
- </text>
- <text name="WL3pm">
- 3pm
- </text>
- <text name="WL6pm">
- 6pm
- </text>
- <text name="WL9pm">
- 9pm
- </text>
- <text name="WL12am2">
- 12am
- </text>
- <text name="WL12amHash">
- |
- </text>
- <text name="WL3amHash">
- I
- </text>
- <text name="WL6amHash">
- |
- </text>
- <text name="WL9amHash2">
- I
- </text>
- <text name="WL12pmHash2">
- |
- </text>
- <text name="WL3pmHash">
- I
- </text>
- <text name="WL6pmHash">
- |
- </text>
- <text name="WL9pmHash">
- I
- </text>
- <text name="WL12amHash2">
- |
- </text>
- <button label="Dodaj" label_selected="Dodaj" name="WLAddKey"/>
- <button label="Usuń" label_selected="Usuń" name="WLDeleteKey"/>
- <text name="WLCurKeyFrameText">
- Preferencje czasu:
- </text>
- <text name="WLCurKeyTimeText">
- Czas:
- </text>
- <spinner label="Godz" name="WLCurKeyHour"/>
- <spinner label="Min" name="WLCurKeyMin"/>
- <text name="WLCurKeyTimeText2">
- Ustawienia:
- </text>
- <combo_box label="Preset" name="WLKeyPresets"/>
- <text name="DayCycleText">
- Przerwij:
- </text>
- <combo_box label="5 min" name="WLSnapOptions"/>
- <text name="DayCycleText2">
- Długość cyklu:
- </text>
- <spinner label="Godz" name="WLLengthOfDayHour"/>
- <spinner label="Min" name="WLLengthOfDayMin"/>
- <spinner label="Sek" name="WLLengthOfDaySec"/>
- <text name="DayCycleText3">
- PrzeglÄ…daj:
- </text>
- <button label="Start" label_selected="Start" name="WLAnimSky"/>
- <button label="Stop" label_selected="Stop" name="WLStopAnimSky"/>
- <button label="Używaj czasu regionu" label_selected="Używaj czasu regionu" name="WLUseLindenTime"/>
- <button label="Zapisz test dnia" label_selected="Zapisz test dnia" name="WLSaveDayCycle"/>
- <button label="Załaduj test dnia" label_selected="Załaduj test dnia" name="WLLoadDayCycle"/>
- </panel>
- </tab_container>
-</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_env_settings.xml b/indra/newview/skins/default/xui/pl/floater_env_settings.xml
deleted file mode 100644
index 3ab854fbbb..0000000000
--- a/indra/newview/skins/default/xui/pl/floater_env_settings.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Environment Editor Floater" title="EDYTOR ÅšRODOWISKA">
- <floater.string name="timeStr">
- [hour12,datetime,utc]:[min,datetime,utc] [ampm,datetime,utc]
- </floater.string>
- <text name="EnvTimeText">
- Czas
- </text>
- <text name="EnvTimeText2">
- 12:00 PM
- </text>
- <slider label="" name="EnvTimeSlider"/>
- <text name="EnvCloudText">
- Chmury:
- </text>
- <slider label="" name="EnvCloudSlider"/>
- <text name="EnvWaterColorText">
- Kolor wody
- </text>
- <color_swatch label="" name="EnvWaterColor" tool_tip="Kliknij aby wybrać kolor"/>
- <text name="EnvWaterFogText">
- Zamglenie:
- </text>
- <slider label="" name="EnvWaterFogSlider"/>
- <button label="Używaj czasu regionu" name="EnvUseEstateTimeButton"/>
- <button label="Zaawansowane niebo" name="EnvAdvancedSkyButton"/>
- <button label="Zaawansowana woda" name="EnvAdvancedWaterButton"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_hardware_settings.xml b/indra/newview/skins/default/xui/pl/floater_hardware_settings.xml
index bd5dd7e7d2..471d2c39ba 100644
--- a/indra/newview/skins/default/xui/pl/floater_hardware_settings.xml
+++ b/indra/newview/skins/default/xui/pl/floater_hardware_settings.xml
@@ -14,6 +14,9 @@
<combo_box.item label="8x" name="8x"/>
<combo_box.item label="16x" name="16x"/>
</combo_box>
+ <text name="antialiasing restart">
+ (Restart wymagany)
+ </text>
<spinner label="Gamma:" name="gamma"/>
<text name="(brightness, lower is brighter)">
(0=domyślna jaskrawość, niższa wartość=jaśniej)
diff --git a/indra/newview/skins/default/xui/pl/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/pl/floater_inventory_item_properties.xml
index 1e63987585..054d74b234 100644
--- a/indra/newview/skins/default/xui/pl/floater_inventory_item_properties.xml
+++ b/indra/newview/skins/default/xui/pl/floater_inventory_item_properties.xml
@@ -24,16 +24,10 @@
<text name="LabelCreatorTitle">
Twórca:
</text>
- <text name="LabelCreatorName">
- Nicole Linden
- </text>
<button label="Profil..." label_selected="" name="BtnCreator"/>
<text name="LabelOwnerTitle">
Właściciel:
</text>
- <text name="LabelOwnerName">
- Thrax Linden
- </text>
<button label="Profil..." label_selected="" name="BtnOwner"/>
<text name="LabelAcquiredTitle">
Nabyte:
diff --git a/indra/newview/skins/default/xui/pl/floater_map.xml b/indra/newview/skins/default/xui/pl/floater_map.xml
index fd151e91ad..e01c4c8a82 100644
--- a/indra/newview/skins/default/xui/pl/floater_map.xml
+++ b/indra/newview/skins/default/xui/pl/floater_map.xml
@@ -3,6 +3,9 @@
<floater.string name="ToolTipMsg">
[REGION](Podwójne kliknięcie otwiera Mapę, Shift i przeciągnięcie kursorem zmienia skalę)
</floater.string>
+ <floater.string name="AltToolTipMsg">
+ [REGION](Podwójne kliknięcie aktywuje teleportację, wciśnij Shift i przeciągnij aby przesunąć)
+ </floater.string>
<floater.string name="mini_map_caption">
MINIMAPA
</floater.string>
diff --git a/indra/newview/skins/default/xui/pl/floater_nearby_chat.xml b/indra/newview/skins/default/xui/pl/floater_nearby_chat.xml
index 7dc3e1f22e..214d465f1c 100644
--- a/indra/newview/skins/default/xui/pl/floater_nearby_chat.xml
+++ b/indra/newview/skins/default/xui/pl/floater_nearby_chat.xml
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="nearby_chat" title="CZAT LOKALNY">
- <check_box label="TÅ‚umaczenie czatu (wspierane przez Google)" name="translate_chat_checkbox"/>
+ <check_box label="TÅ‚umaczenie czatu" name="translate_chat_checkbox"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_preferences.xml b/indra/newview/skins/default/xui/pl/floater_preferences.xml
index 3f62d764c6..930a5c76b0 100644
--- a/indra/newview/skins/default/xui/pl/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/pl/floater_preferences.xml
@@ -5,10 +5,12 @@
<tab_container name="pref core">
<panel label="Ogólne" name="general"/>
<panel label="Grafika" name="display"/>
- <panel label="Prywatność" name="im"/>
<panel label="Dźwięk &amp; Media" name="audio"/>
<panel label="Czat" name="chat"/>
+ <panel label="Ruch &amp; Widok" name="move"/>
<panel label="Powiadomienia" name="msgs"/>
+ <panel label="Kolory" name="colors"/>
+ <panel label="Prywatność" name="im"/>
<panel label="Ustawienie" name="input"/>
<panel label="Zaawansowane" name="advanced1"/>
</tab_container>
diff --git a/indra/newview/skins/default/xui/pl/floater_preview_animation.xml b/indra/newview/skins/default/xui/pl/floater_preview_animation.xml
index 6ce6914771..d276b1f63a 100644
--- a/indra/newview/skins/default/xui/pl/floater_preview_animation.xml
+++ b/indra/newview/skins/default/xui/pl/floater_preview_animation.xml
@@ -6,6 +6,6 @@
<text name="desc txt">
Opis:
</text>
- <button label="Uruchom in-world" label_selected="Stop" left="20" name="Anim play btn" tool_tip="Uruchom animacjÄ™ by widzieli jÄ… pozostali Rezydenci" width="131"/>
- <button label="Używaj lokalnie" label_selected="Stop" left="162" name="Anim audition btn" tool_tip="Uruchom animację widoczną tylko przez Ciebie" width="125"/>
+ <button label="Uruchom in-world" label_selected="Stop" name="Anim play btn" tool_tip="Uruchom animacjÄ™ by widzieli jÄ… pozostali Rezydenci" width="131"/>
+ <button label="Używaj lokalnie" label_selected="Stop" left="162" name="Anim audition btn" tool_tip="Uruchom animację widoczną tylko przez Ciebie" width="120"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_region_debug_console.xml b/indra/newview/skins/default/xui/pl/floater_region_debug_console.xml
new file mode 100644
index 0000000000..ce1f3c0ac7
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/floater_region_debug_console.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="region_debug_console" title="Debugowanie regionu"/>
diff --git a/indra/newview/skins/default/xui/pl/floater_sell_land.xml b/indra/newview/skins/default/xui/pl/floater_sell_land.xml
index 528e5a416b..2201c4b0ad 100644
--- a/indra/newview/skins/default/xui/pl/floater_sell_land.xml
+++ b/indra/newview/skins/default/xui/pl/floater_sell_land.xml
@@ -44,7 +44,7 @@
<combo_box.item label="Wybrany Kupiec:" name="Specificuser:"/>
</combo_box>
<button label="Wybierz" name="sell_to_select_agent"/>
- <text name="sell_objects_label">
+ <text name="sell_objects_label" font="SansSerifSmall">
3. Obiekty sprzedawane razem z posiadłością?
</text>
<text name="sell_objects_text">
diff --git a/indra/newview/skins/default/xui/pl/floater_settings_debug.xml b/indra/newview/skins/default/xui/pl/floater_settings_debug.xml
index 7c29d52e7b..131f92d56f 100644
--- a/indra/newview/skins/default/xui/pl/floater_settings_debug.xml
+++ b/indra/newview/skins/default/xui/pl/floater_settings_debug.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="settings_debug" title="USTAWIENIA DEBUGOWANIA">
<radio_group name="boolean_combo">
- <radio_item label="PRAWDA" name="TRUE" value="prawda"/>
- <radio_item label="NIEPRAWDA" name="FALSE" value=""/>
+ <radio_item label="PRAWDA" name="TRUE" />
+ <radio_item label="NIEPRAWDA" name="FALSE" />
</radio_group>
<color_swatch label="Kolor" name="val_color_swatch"/>
<spinner label="x" name="val_spinner_1"/>
diff --git a/indra/newview/skins/default/xui/pl/floater_tools.xml b/indra/newview/skins/default/xui/pl/floater_tools.xml
index 7c1ced0eae..9e6fed8387 100644
--- a/indra/newview/skins/default/xui/pl/floater_tools.xml
+++ b/indra/newview/skins/default/xui/pl/floater_tools.xml
@@ -64,6 +64,8 @@
<radio_item label="Wybierz teksturÄ™" name="radio select face"/>
</radio_group>
<check_box label="Edytuj połączone części" name="checkbox edit linked parts"/>
+ <button label="Linkuj" name="link_btn"/>
+ <button label="Rozlinkuj" name="unlink_btn"/>
<text name="RenderingCost" tool_tip="Pokazuje koszt renderowania tego obiektu">
þ: [COUNT]
</text>
@@ -173,15 +175,9 @@
<text name="Creator:">
Twórca:
</text>
- <text name="Creator Name">
- Pani Esbee Linden (esbee.linden)
- </text>
<text name="Owner:">
Właściciel:
</text>
- <text name="Owner Name">
- Pani Erica &quot;Moose&quot; Linden (erica.linden)
- </text>
<text name="Group:">
Grupa:
</text>
@@ -307,7 +303,7 @@
<combo_box.item label="Kwadrat" name="Square"/>
<combo_box.item label="Trójkąt" name="Triangle"/>
</combo_box>
- <text name="text twist" left_delta="-5" width="160">
+ <text left_delta="-5" name="text twist" width="160">
Skręcenie (początek/koniec)
</text>
<spinner label="P" name="Twist Begin"/>
diff --git a/indra/newview/skins/default/xui/pl/floater_tos.xml b/indra/newview/skins/default/xui/pl/floater_tos.xml
index bb2de773f0..8cdf267f4b 100644
--- a/indra/newview/skins/default/xui/pl/floater_tos.xml
+++ b/indra/newview/skins/default/xui/pl/floater_tos.xml
@@ -4,7 +4,7 @@
http://secondlife.com/app/tos/
</floater.string>
<floater.string name="loading_url">
- data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Loading %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
+ data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Åadowanie %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3EWarunki%20Serwisu%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
</floater.string>
<button label="Kontynuuj" label_selected="Kontynuuj" name="Continue"/>
<button label="Anuluj" label_selected="Anuluj" name="Cancel"/>
diff --git a/indra/newview/skins/default/xui/pl/floater_water.xml b/indra/newview/skins/default/xui/pl/floater_water.xml
deleted file mode 100644
index 9720dae516..0000000000
--- a/indra/newview/skins/default/xui/pl/floater_water.xml
+++ /dev/null
@@ -1,103 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Water Floater" title="ZAAWANSOWANY EDYTOR WODY">
- <text name="KeyFramePresetsText">
- Ustawienia wody:
- </text>
- <button label="Nowe" label_selected="Nowe" name="WaterNewPreset"/>
- <button label="Zapisz" label_selected="Zapisz" name="WaterSavePreset"/>
- <button label="Usuń" label_selected="Usuń" name="WaterDeletePreset"/>
- <tab_container name="Water Tabs">
- <panel label="USTAWIENIA" name="Settings">
- <text name="BHText">
- Kolor podwodnej mgły
- </text>
- <button label="?" name="WaterFogColorHelp"/>
- <color_swatch label="" name="WaterFogColor" tool_tip="Kliknij aby wybrać kolor"/>
- <text name="WaterFogDensText">
- Wykładnik gęstości mgły
- </text>
- <button label="?" name="WaterFogDensityHelp"/>
- <slider label="" name="WaterFogDensity"/>
- <text name="WaterUnderWaterFogModText">
- Modyfikator mgły
- </text>
- <button label="?" name="WaterUnderWaterFogModHelp"/>
- <slider label="" name="WaterUnderWaterFogMod"/>
- <text name="BDensText">
- Skala zmarszczeń
- </text>
- <button label="?" name="WaterNormalScaleHelp"/>
- <text name="BHText2">
- 1
- </text>
- <text name="BHText3">
- 2
- </text>
- <text name="BHText4">
- 3
- </text>
- <slider label="" name="WaterNormalScaleX"/>
- <slider label="" name="WaterNormalScaleY"/>
- <slider label="" name="WaterNormalScaleZ"/>
- <text name="HDText">
- Skala Fresnela
- </text>
- <button label="?" name="WaterFresnelScaleHelp"/>
- <slider label="" name="WaterFresnelScale"/>
- <text name="FresnelOffsetText">
- Przesunięcie Fresnela
- </text>
- <button label="?" name="WaterFresnelOffsetHelp"/>
- <slider label="" name="WaterFresnelOffset"/>
- <text name="DensMultText">
- Górna refrakcja
- </text>
- <button label="?" name="WaterScaleAboveHelp"/>
- <slider label="" name="WaterScaleAbove"/>
- <text name="WaterScaleBelowText">
- Dolna refrakcja
- </text>
- <button label="?" name="WaterScaleBelowHelp"/>
- <slider label="" name="WaterScaleBelow"/>
- <text name="MaxAltText">
- Mnożnik rozmycia
- </text>
- <button label="?" name="WaterBlurMultiplierHelp"/>
- <slider label="" name="WaterBlurMult"/>
- </panel>
- <panel label="OBRAZ" name="Waves">
- <text name="BHText">
- Kierunek dużych fal
- </text>
- <button label="?" name="WaterWave1Help"/>
- <text name="WaterWave1DirXText">
- X
- </text>
- <text name="WaterWave1DirYText">
- Y
- </text>
- <slider label="" name="WaterWave1DirX"/>
- <slider label="" name="WaterWave1DirY"/>
- <text name="BHText2">
- Kierunek małych fal
- </text>
- <button label="?" name="WaterWave2Help"/>
- <text name="WaterWave2DirXText">
- X
- </text>
- <text name="WaterWave2DirYText">
- Y
- </text>
- <slider label="" name="WaterWave2DirX"/>
- <slider label="" name="WaterWave2DirY"/>
- <text name="BHText3">
- Mapa normalnych
- </text>
- <button label="?" name="WaterNormalMapHelp"/>
- <texture_picker label="" name="WaterNormalMap"/>
- </panel>
- </tab_container>
- <string name="WLDefaultWaterNames">
- Default:Glassy:Pond:Murky:Second Plague:SNAKE!!!:Valdez
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_web_content.xml b/indra/newview/skins/default/xui/pl/floater_web_content.xml
new file mode 100644
index 0000000000..4cc8d0b27b
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/floater_web_content.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_web_content" title="">
+ <layout_stack name="stack1">
+ <layout_panel name="nav_controls">
+ <button name="back" tool_tip="Do tyłu"/>
+ <button name="forward" tool_tip="Do przodu"/>
+ <button name="stop" tool_tip="Zatrzymaj"/>
+ <button name="reload" tool_tip="Odśwież stronę"/>
+ <combo_box name="address" tool_tip="Wprowadź URL tutaj"/>
+ <icon name="media_secure_lock_flag" tool_tip="Funkcja bezpiecznego przeglÄ…dania (Secured Browsing)"/>
+ <button name="popexternal" tool_tip="Otwórz bieżący URL w zewnętrznej przeglądarce"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_windlight_options.xml b/indra/newview/skins/default/xui/pl/floater_windlight_options.xml
deleted file mode 100644
index 930e904464..0000000000
--- a/indra/newview/skins/default/xui/pl/floater_windlight_options.xml
+++ /dev/null
@@ -1,228 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="WindLight floater" title="ZAAWANSOWANY EDYTOR NIEBA">
- <text name="KeyFramePresetsText">
- Ustawienia nieba:
- </text>
- <button label="Nowe" label_selected="Nowe" name="WLNewPreset"/>
- <button label="Zapisz" label_selected="Zapisz" name="WLSavePreset"/>
- <button label="Usuń" label_selected="Usuń" name="WLDeletePreset"/>
- <button label="Edytor cyklu dnia" label_selected="Edytor cyklu dnia" name="WLDayCycleMenuButton"/>
- <tab_container name="WindLight Tabs">
- <panel label="ATMOSFERA" name="Atmosphere">
- <text name="BHText">
- Horyzont błękitu
- </text>
- <button label="?" name="WLBlueHorizonHelp"/>
- <text name="BHText2">
- R
- </text>
- <text name="BHText3">
- G
- </text>
- <text name="BHText4">
- B
- </text>
- <text name="BHText5">
- I
- </text>
- <slider label="" name="WLBlueHorizonR"/>
- <slider label="" name="WLBlueHorizonG"/>
- <slider label="" name="WLBlueHorizonB"/>
- <slider label="" name="WLBlueHorizonI"/>
- <text name="BDensText">
- Horyzont zamglenia
- </text>
- <button label="?" name="WLHazeHorizonHelp"/>
- <slider label="" name="WLHazeHorizon"/>
- <text name="BDensText2">
- Gęstość błękitu
- </text>
- <button label="?" name="WLBlueDensityHelp"/>
- <text name="BHText6">
- R
- </text>
- <text name="BHText7">
- G
- </text>
- <text name="BHText8">
- B
- </text>
- <text name="BHText9">
- I
- </text>
- <slider label="" name="WLBlueDensityR"/>
- <slider label="" name="WLBlueDensityG"/>
- <slider label="" name="WLBlueDensityB"/>
- <slider label="" name="WLBlueDensityI"/>
- <text name="HDText">
- Gęstość zamglenia
- </text>
- <button label="?" name="WLHazeDensityHelp"/>
- <slider label="" name="WLHazeDensity"/>
- <text name="DensMultText">
- Mnożnik gęsości
- </text>
- <button label="?" name="WLDensityMultHelp"/>
- <slider label="" name="WLDensityMult"/>
- <text name="WLDistanceMultText">
- Mnożnik dystansu
- </text>
- <button label="?" name="WLDistanceMultHelp"/>
- <slider label="" name="WLDistanceMult"/>
- <text name="MaxAltText">
- Max wysokość
- </text>
- <button label="?" name="WLMaxAltitudeHelp"/>
- <slider label="" name="WLMaxAltitude"/>
- </panel>
- <panel label="ÅšWIATÅO" name="Lighting">
- <text name="SLCText">
- Kolor Słońca/Księżyca
- </text>
- <button label="?" name="WLSunlightColorHelp"/>
- <text name="BHText">
- R
- </text>
- <text name="BHText2">
- G
- </text>
- <text name="BHText3">
- B
- </text>
- <text name="BHText4">
- I
- </text>
- <slider label="" name="WLSunlightR"/>
- <slider label="" name="WLSunlightG"/>
- <slider label="" name="WLSunlightB"/>
- <slider label="" name="WLSunlightI"/>
- <text name="TODText">
- Pozycja Słońca/Księżyca
- </text>
- <button label="?" name="WLTimeOfDayHelp"/>
- <slider label="" name="WLSunAngle"/>
- <text name="WLAmbientText">
- Otoczenie
- </text>
- <button label="?" name="WLAmbientHelp"/>
- <text name="BHText5">
- R
- </text>
- <text name="BHText6">
- G
- </text>
- <text name="BHText7">
- B
- </text>
- <text name="BHText8">
- I
- </text>
- <slider label="" name="WLAmbientR"/>
- <slider label="" name="WLAmbientG"/>
- <slider label="" name="WLAmbientB"/>
- <slider label="" name="WLAmbientI"/>
- <text name="WLEastAngleText">
- Pozycja wschodu
- </text>
- <button label="?" name="WLEastAngleHelp"/>
- <slider label="" name="WLEastAngle"/>
- <text name="SunGlowText">
- Blask Słońca
- </text>
- <button label="?" name="WLSunGlowHelp"/>
- <slider label="Ostrość" name="WLGlowB"/>
- <slider label="Rozmiar" name="WLGlowR"/>
- <text name="SceneGammaText">
- Jasność obrazu
- </text>
- <button label="?" name="WLSceneGammaHelp"/>
- <slider label="" name="WLGamma"/>
- <text name="WLStarText">
- Blask gwiazd
- </text>
- <button label="?" name="WLStarBrightnessHelp"/>
- <slider label="" name="WLStarAlpha"/>
- </panel>
- <panel label="CHMURY" name="Clouds">
- <text name="WLCloudColorText">
- Kolor chmur
- </text>
- <button label="?" name="WLCloudColorHelp"/>
- <text name="BHText">
- R
- </text>
- <text name="BHText2">
- G
- </text>
- <text name="BHText3">
- B
- </text>
- <text name="BHText4">
- I
- </text>
- <slider label="" name="WLCloudColorR"/>
- <slider label="" name="WLCloudColorG"/>
- <slider label="" name="WLCloudColorB"/>
- <slider label="" name="WLCloudColorI"/>
- <text name="WLCloudColorText2">
- Chmury (XY/Gęstość)
- </text>
- <button label="?" name="WLCloudDensityHelp"/>
- <text name="BHText5">
- X
- </text>
- <text name="BHText6">
- Y
- </text>
- <text name="BHText7">
- G
- </text>
- <slider label="" name="WLCloudX"/>
- <slider label="" name="WLCloudY"/>
- <slider label="" name="WLCloudDensity"/>
- <text name="WLCloudCoverageText">
- Pokrycie chmur
- </text>
- <button label="?" name="WLCloudCoverageHelp"/>
- <slider label="" name="WLCloudCoverage"/>
- <text name="WLCloudScaleText">
- Skala chmur
- </text>
- <button label="?" name="WLCloudScaleHelp"/>
- <slider label="" name="WLCloudScale"/>
- <text name="WLCloudDetailText">
- Szczegóły (XY/gęstość)
- </text>
- <button label="?" name="WLCloudDetailHelp"/>
- <text name="BHText8">
- X
- </text>
- <text name="BHText9">
- Y
- </text>
- <text name="BHText10">
- G
- </text>
- <slider label="" name="WLCloudDetailX"/>
- <slider label="" name="WLCloudDetailY"/>
- <slider label="" name="WLCloudDetailDensity"/>
- <text name="WLCloudScrollXText">
- Przewijanie chmur X
- </text>
- <button label="?" name="WLCloudScrollXHelp"/>
- <check_box label="Zablokuj" name="WLCloudLockX"/>
- <slider label="" name="WLCloudScrollX"/>
- <text name="WLCloudScrollYText">
- Przewijanie chmur Y
- </text>
- <button label="?" name="WLCloudScrollYHelp"/>
- <check_box label="Zablokuj" name="WLCloudLockY"/>
- <slider label="" name="WLCloudScrollY"/>
- <check_box label="Klasyczne chmury" name="DrawClassicClouds"/>
- <button label="?" name="WLClassicCloudsHelp"/>
- </panel>
- </tab_container>
- <string name="WLDefaultSkyNames">
- A-12AM:A-12PM:A-3AM:A-3PM:A-4.30PM:A-6AM:A-6PM:A-9AM:A-9PM:Barcelona:Blizzard:Blue Midday:Coastal Afternoon:Coastal Sunset:Default:Desert Sunset:Fine Day:Fluffy Big Clouds:Foggy:Funky Funky:Funky Funky Funky:Gelatto:Ghost:Incongruent Truths:Midday 1:Midday 2:Midday 3:Midday 4:Night:Pirate:Purple:Sailor&apos;s Delight:Sheer Sensuality
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/pl/inspect_avatar.xml b/indra/newview/skins/default/xui/pl/inspect_avatar.xml
index 1db3339352..5e982c0185 100644
--- a/indra/newview/skins/default/xui/pl/inspect_avatar.xml
+++ b/indra/newview/skins/default/xui/pl/inspect_avatar.xml
@@ -10,8 +10,6 @@
<string name="Details">
[SL_PROFILE]
</string>
- <text name="user_name_small" value="Grumpity ProductEngine with a long name"/>
- <text name="user_slid" value="james.linden"/>
<text name="user_details">
To jest mój opis w Second Life.
</text>
diff --git a/indra/newview/skins/default/xui/pl/language_settings.xml b/indra/newview/skins/default/xui/pl/language_settings.xml
index 681b38e9cf..93051d1317 100644
--- a/indra/newview/skins/default/xui/pl/language_settings.xml
+++ b/indra/newview/skins/default/xui/pl/language_settings.xml
@@ -4,6 +4,7 @@
<!-- Locale Information -->
<string name="MicrosoftLocale">polish</string>
+ <string name="MacLocale">pl_PL.UTF-8</string>
<string name="DarwinLocale">pl_PL.UTF-8</string>
<string name="LinuxLocale">pl_PL.UTF-8</string>
diff --git a/indra/newview/skins/default/xui/pl/menu_attachment_self.xml b/indra/newview/skins/default/xui/pl/menu_attachment_self.xml
index c19b0a1c2e..163b3a231e 100644
--- a/indra/newview/skins/default/xui/pl/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/pl/menu_attachment_self.xml
@@ -5,7 +5,7 @@
<menu_item_call label="Odłącz" name="Detach"/>
<menu_item_call label="Usiądź tutaj" name="Sit Down Here"/>
<menu_item_call label="Wstań" name="Stand Up"/>
- <menu_item_call label="Zmień strój" name="Change Outfit"/>
+ <menu_item_call label="Mój wygląd" name="Change Outfit"/>
<menu_item_call label="Edytuj mój strój" name="Edit Outfit"/>
<menu_item_call label="Edytuj mój kształt" name="Edit My Shape"/>
<menu_item_call label="Moi znajomi" name="Friends..."/>
diff --git a/indra/newview/skins/default/xui/pl/menu_avatar_self.xml b/indra/newview/skins/default/xui/pl/menu_avatar_self.xml
index ea151788c6..8eb501c5b8 100644
--- a/indra/newview/skins/default/xui/pl/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/pl/menu_avatar_self.xml
@@ -14,6 +14,7 @@
<menu_item_call label="Podkoszulek" name="Self Undershirt"/>
<menu_item_call label="BieliznÄ™" name="Self Underpants"/>
<menu_item_call label="Tatuaż" name="Self Tattoo"/>
+ <menu_item_call label="Fizyka" name="Self Physics"/>
<menu_item_call label="Ubranie alpha" name="Self Alpha"/>
<menu_item_call label="Wszystko" name="All Clothes"/>
</context_menu>
@@ -21,7 +22,7 @@
<context_menu label="Odłącz" name="Object Detach"/>
<menu_item_call label="Odłącz wszystko" name="Detach All"/>
</context_menu>
- <menu_item_call label="Zmień strój" name="Chenge Outfit"/>
+ <menu_item_call label="Mój wygląd" name="Chenge Outfit"/>
<menu_item_call label="Edytuj mój strój" name="Edit Outfit"/>
<menu_item_call label="Edytuj mój kształt" name="Edit My Shape"/>
<menu_item_call label="Moi znajomi" name="Friends..."/>
diff --git a/indra/newview/skins/default/xui/pl/menu_bottomtray.xml b/indra/newview/skins/default/xui/pl/menu_bottomtray.xml
index a4a6ea484d..1ec5883cfe 100644
--- a/indra/newview/skins/default/xui/pl/menu_bottomtray.xml
+++ b/indra/newview/skins/default/xui/pl/menu_bottomtray.xml
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="hide_camera_move_controls_menu">
+ <menu_item_check label="Rozpocznij rozmowę głosową" name="EnableVoiceChat"/>
<menu_item_check label="Przycisk gesturki" name="ShowGestureButton"/>
<menu_item_check label="Przycisk ruchu" name="ShowMoveButton"/>
<menu_item_check label="Przycisk widoku" name="ShowCameraButton"/>
<menu_item_check label="Przycisk zdjęć" name="ShowSnapshotButton"/>
- <menu_item_check label="Schowek" name="ShowSidebarButton"/>
<menu_item_check label="Buduj" name="ShowBuildButton"/>
<menu_item_check label="Szukaj" name="ShowSearchButton"/>
<menu_item_check label="Mapa" name="ShowWorldMapButton"/>
diff --git a/indra/newview/skins/default/xui/pl/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/pl/menu_inspect_avatar_gear.xml
index 5c27d53d90..59560f236c 100644
--- a/indra/newview/skins/default/xui/pl/menu_inspect_avatar_gear.xml
+++ b/indra/newview/skins/default/xui/pl/menu_inspect_avatar_gear.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<menu name="Gear Menu">
+<toggleable_menu name="Gear Menu">
<menu_item_call label="Zobacz profil" name="view_profile"/>
<menu_item_call label="Dodaj znajomość" name="add_friend"/>
<menu_item_call label="IM" name="im"/>
@@ -11,9 +11,11 @@
<menu_item_call label="Raport" name="report"/>
<menu_item_call label="Unieruchom" name="freeze"/>
<menu_item_call label="Wyrzuć" name="eject"/>
+ <menu_item_call label="Kopnij" name="kick"/>
+ <menu_item_call label="CSR" name="csr"/>
<menu_item_call label="Debugowanie tekstur" name="debug"/>
<menu_item_call label="Znajdź na mapie" name="find_on_map"/>
<menu_item_call label="Przybliż" name="zoom_in"/>
<menu_item_call label="Zapłać" name="pay"/>
<menu_item_call label="Udostępnij" name="share"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/pl/menu_inspect_self_gear.xml
index 90d71371e8..c4ef9761d9 100644
--- a/indra/newview/skins/default/xui/pl/menu_inspect_self_gear.xml
+++ b/indra/newview/skins/default/xui/pl/menu_inspect_self_gear.xml
@@ -1,10 +1,31 @@
-<?xml version="1.0" encoding="utf-8"?>
-<menu name="Gear Menu">
- <menu_item_call label="Usiądź tutaj" name="sit_down_here"/>
- <menu_item_call label="Wstań" name="stand_up"/>
- <menu_item_call label="Zmień strój" name="change_outfit"/>
- <menu_item_call label="Mój profil" name="my_profile"/>
- <menu_item_call label="Moi znajomi" name="my_friends"/>
- <menu_item_call label="Moje grupy" name="my_groups"/>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Gear Menu">
+ <menu_item_call label="Usiądź tutaj" name="Sit Down Here"/>
+ <menu_item_call label="Wstań" name="Stand Up"/>
+ <context_menu label="Zdejmij" name="Take Off &gt;">
+ <context_menu label="Ubranie" name="Clothes &gt;">
+ <menu_item_call label="Bluzka" name="Shirt"/>
+ <menu_item_call label="Spodnie" name="Pants"/>
+ <menu_item_call label="Spódnica" name="Skirt"/>
+ <menu_item_call label="Buty" name="Shoes"/>
+ <menu_item_call label="Skarpetki" name="Socks"/>
+ <menu_item_call label="Kurtka" name="Jacket"/>
+ <menu_item_call label="Rękawiczki" name="Gloves"/>
+ <menu_item_call label="Podkoszulek" name="Self Undershirt"/>
+ <menu_item_call label="Bielizna" name="Self Underpants"/>
+ <menu_item_call label="Tatuaż" name="Self Tattoo"/>
+ <menu_item_call label="Alpha" name="Self Alpha"/>
+ <menu_item_call label="Ubranie" name="All Clothes"/>
+ </context_menu>
+ <context_menu label="HUD" name="Object Detach HUD"/>
+ <context_menu label="Odłącz" name="Object Detach"/>
+ <menu_item_call label="Odłącz wszystko" name="Detach All"/>
+ </context_menu>
+ <menu_item_call label="Zmień strój" name="Chenge Outfit"/>
+ <menu_item_call label="Edytuj mój strój" name="Edit Outfit"/>
+ <menu_item_call label="Edytuj mój kształt" name="Edit My Shape"/>
+ <menu_item_call label="Znajomi" name="Friends..."/>
+ <menu_item_call label="Moje grupy" name="Groups..."/>
+ <menu_item_call label="Mój profil" name="Profile..."/>
<menu_item_call label="Debugowanie tekstur" name="Debug..."/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_inventory.xml b/indra/newview/skins/default/xui/pl/menu_inventory.xml
index e47ffa0e18..5492f78b26 100644
--- a/indra/newview/skins/default/xui/pl/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/pl/menu_inventory.xml
@@ -25,6 +25,7 @@
<menu_item_call label="Nowa bielizna" name="New Underpants"/>
<menu_item_call label="Nowa maska alpha" name="New Alpha Mask"/>
<menu_item_call label="Nowy tatuaż" name="New Tattoo"/>
+ <menu_item_call label="Nowa fizyka" name="New Physics"/>
</menu>
<menu label="Nowa Część Ciała" name="New Body Parts">
<menu_item_call label="Nowy kształt" name="New Shape"/>
diff --git a/indra/newview/skins/default/xui/pl/menu_inventory_add.xml b/indra/newview/skins/default/xui/pl/menu_inventory_add.xml
index 4a56586aaf..04f9b94f7c 100644
--- a/indra/newview/skins/default/xui/pl/menu_inventory_add.xml
+++ b/indra/newview/skins/default/xui/pl/menu_inventory_add.xml
@@ -23,6 +23,7 @@
<menu_item_call label="Nowa bielizna" name="New Underpants"/>
<menu_item_call label="Nowa maska alpha" name="New Alpha"/>
<menu_item_call label="Nowy tatuaż" name="New Tattoo"/>
+ <menu_item_call label="Nowa fizyka" name="New Physics"/>
</menu>
<menu label="Nowa Część Ciała" name="New Body Parts">
<menu_item_call label="Nowy kształt" name="New Shape"/>
diff --git a/indra/newview/skins/default/xui/pl/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/pl/menu_inventory_gear_default.xml
index d110a2f02e..591c3a81d5 100644
--- a/indra/newview/skins/default/xui/pl/menu_inventory_gear_default.xml
+++ b/indra/newview/skins/default/xui/pl/menu_inventory_gear_default.xml
@@ -1,8 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_gear_default">
+<toggleable_menu name="menu_gear_default">
<menu_item_call label="Nowe okno Szafy" name="new_window"/>
- <menu_item_call label="Porządkuj według nazwy" name="sort_by_name"/>
- <menu_item_call label="Porządkuj według daty" name="sort_by_recent"/>
+ <menu_item_check label="Porządkuj według nazwy" name="sort_by_name"/>
+ <menu_item_check label="Porządkuj według daty" name="sort_by_recent"/>
+ <menu_item_check label="Sortuj foldery zawsze według nazwy" name="sort_folders_by_name"/>
+ <menu_item_check label="Posortuj foldery systemowe od góry" name="sort_system_folders_to_top"/>
<menu_item_call label="Pokaż filtry" name="show_filters"/>
<menu_item_call label="Zresetuj filtry" name="reset_filters"/>
<menu_item_call label="Zamknij wszystkie foldery" name="close_folders"/>
@@ -12,4 +14,4 @@
<menu_item_call label="Znajdź oryginał" name="Find Original"/>
<menu_item_call label="Znajdź wszystkie linki" name="Find All Links"/>
<menu_item_call label="Opróżnij Kosz" name="empty_trash"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_login.xml b/indra/newview/skins/default/xui/pl/menu_login.xml
index 0dd6117b85..e50b694641 100644
--- a/indra/newview/skins/default/xui/pl/menu_login.xml
+++ b/indra/newview/skins/default/xui/pl/menu_login.xml
@@ -16,7 +16,8 @@
<menu_item_call label="Ustaw rozmiar interfejsu..." name="Set Window Size..."/>
<menu_item_call label="Wyświetl TOS" name="TOS"/>
<menu_item_call label="Wyświetl wiadomość krytyczną" name="Critical"/>
- <menu_item_call label="Test przeglÄ…darki internetowej" name="Web Browser Test"/>
+ <menu_item_call label="Test przeglądarki mediów" name="Web Browser Test"/>
+ <menu_item_call label="Test zawartości strony" name="Web Content Floater Test"/>
<menu_item_check label="Pokaż siatkę" name="Show Grid Picker"/>
<menu_item_call label="Pokaż konsolę Zawiadomień" name="Show Notifications Console"/>
</menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_media_ctrl.xml b/indra/newview/skins/default/xui/pl/menu_media_ctrl.xml
new file mode 100644
index 0000000000..60dc3673a9
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/menu_media_ctrl.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="media ctrl context menu">
+ <menu_item_call label="Wytnij" name="Cut"/>
+ <menu_item_call label="Kopiuj" name="Copy"/>
+ <menu_item_call label="Wklej" name="Paste"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_mini_map.xml b/indra/newview/skins/default/xui/pl/menu_mini_map.xml
index 148adfba0d..8f86965416 100644
--- a/indra/newview/skins/default/xui/pl/menu_mini_map.xml
+++ b/indra/newview/skins/default/xui/pl/menu_mini_map.xml
@@ -3,6 +3,7 @@
<menu_item_call label="Zoom blisko" name="Zoom Close"/>
<menu_item_call label="Zoom średnio" name="Zoom Medium"/>
<menu_item_call label="Zoom daleko" name="Zoom Far"/>
+ <menu_item_call label="Zoom domyślny" name="Zoom Default"/>
<menu_item_check label="Obróć mapę" name="Rotate Map"/>
<menu_item_check label="Autocentrowanie" name="Auto Center"/>
<menu_item_call label="Zatrzymaj" name="Stop Tracking"/>
diff --git a/indra/newview/skins/default/xui/pl/menu_object.xml b/indra/newview/skins/default/xui/pl/menu_object.xml
index 2173401dd2..3da6c5c890 100644
--- a/indra/newview/skins/default/xui/pl/menu_object.xml
+++ b/indra/newview/skins/default/xui/pl/menu_object.xml
@@ -16,14 +16,14 @@
<context_menu label="Dołącz" name="Object Attach"/>
<context_menu label="Dołącz HUD" name="Object Attach HUD"/>
</context_menu>
- <context_menu label="Usuń" name="Remove">
+ <context_menu label="ZarzÄ…dzaj" name="Remove">
<menu_item_call label="Raport" name="Report Abuse..."/>
<menu_item_call label="Zablokuj" name="Object Mute"/>
<menu_item_call label="Zwróć" name="Return..."/>
- <menu_item_call label="Usuń" name="Delete"/>
</context_menu>
<menu_item_call label="Weź" name="Pie Object Take"/>
<menu_item_call label="Weź kopię" name="Take Copy"/>
<menu_item_call label="Zapłać" name="Pay..."/>
<menu_item_call label="Kup" name="Buy..."/>
+ <menu_item_call label="Skasuj" name="Delete"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_outfit_gear.xml b/indra/newview/skins/default/xui/pl/menu_outfit_gear.xml
index 1a70e76ec7..c093557e86 100644
--- a/indra/newview/skins/default/xui/pl/menu_outfit_gear.xml
+++ b/indra/newview/skins/default/xui/pl/menu_outfit_gear.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Gear Outfit">
+<toggleable_menu name="Gear Outfit">
<menu_item_call label="Załóż - Zastąp obecny strój" name="wear"/>
<menu_item_call label="Załóż - Dodaj do bieżącego stroju" name="wear_add"/>
<menu_item_call label="Zdejmij - Usuń z obecnego stroju" name="take_off"/>
@@ -14,6 +14,7 @@
<menu_item_call label="Nowa podkoszulka" name="New Undershirt"/>
<menu_item_call label="Nowa bielizna" name="New Underpants"/>
<menu_item_call label="Nowa maska alpha" name="New Alpha"/>
+ <menu_item_call label="Nowa fizyka" name="New Physics"/>
<menu_item_call label="Nowy tatuaż" name="New Tattoo"/>
</menu>
<menu label="Nowe części ciała" name="New Body Parts">
@@ -24,4 +25,4 @@
</menu>
<menu_item_call label="Zmień nazwę stroju" name="rename"/>
<menu_item_call label="Usuń strój" name="delete_outfit"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/pl/menu_places_gear_folder.xml
index 65417cef22..d1f283b7aa 100644
--- a/indra/newview/skins/default/xui/pl/menu_places_gear_folder.xml
+++ b/indra/newview/skins/default/xui/pl/menu_places_gear_folder.xml
@@ -1,7 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_folder_gear">
+<toggleable_menu name="menu_folder_gear">
<menu_item_call label="Dodaj do landmarków" name="add_landmark"/>
<menu_item_call label="Dodaj folder" name="add_folder"/>
+ <menu_item_call label="Przywróć obiekt" name="restore_item"/>
<menu_item_call label="Wytnij" name="cut"/>
<menu_item_call label="Kopiuj" name="copy_folder"/>
<menu_item_call label="Wklej" name="paste"/>
@@ -12,4 +13,4 @@
<menu_item_call label="Rozwiń wszystkie foldery" name="expand_all"/>
<menu_item_call label="Schowaj wszystkie foldery" name="collapse_all"/>
<menu_item_check label="Sortuj według daty" name="sort_by_date"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/pl/menu_places_gear_landmark.xml
index 36787dd0aa..0139d3a987 100644
--- a/indra/newview/skins/default/xui/pl/menu_places_gear_landmark.xml
+++ b/indra/newview/skins/default/xui/pl/menu_places_gear_landmark.xml
@@ -1,10 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_ladmark_gear">
+<toggleable_menu name="menu_ladmark_gear">
<menu_item_call label="Teleportuj" name="teleport"/>
<menu_item_call label="Więcej informacji" name="more_info"/>
<menu_item_call label="Pokaż na mapie" name="show_on_map"/>
<menu_item_call label="Dodaj do landmarków" name="add_landmark"/>
<menu_item_call label="Dodaj folder" name="add_folder"/>
+ <menu_item_call label="Przywróć obiekt" name="restore_item"/>
<menu_item_call label="Wytnij" name="cut"/>
<menu_item_call label="Kopiuj landmark" name="copy_landmark"/>
<menu_item_call label="Kopiuj SLurl" name="copy_slurl"/>
@@ -15,4 +16,4 @@
<menu_item_call label="Schowaj wszystkie foldery" name="collapse_all"/>
<menu_item_check label="Sortuj według daty" name="sort_by_date"/>
<menu_item_call label="Stwórz Ulubione" name="create_pick"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_viewer.xml b/indra/newview/skins/default/xui/pl/menu_viewer.xml
index a359180ffb..24c961fa26 100644
--- a/indra/newview/skins/default/xui/pl/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/pl/menu_viewer.xml
@@ -5,17 +5,21 @@
<menu_item_call label="Dashboard" name="Manage My Account"/>
<menu_item_call label="Kup L$" name="Buy and Sell L$"/>
<menu_item_call label="Mój Profil" name="Profile"/>
- <menu_item_call label="Zmień strój" name="ChangeOutfit"/>
+ <menu_item_call label="Mój wygląd" name="ChangeOutfit"/>
<menu_item_check label="Moja Szafa" name="Inventory"/>
<menu_item_check label="Moja Szafa" name="ShowSidetrayInventory"/>
<menu_item_check label="Moje gesturki" name="Gestures"/>
<menu_item_check label="Mój głos" name="ShowVoice"/>
+ <menu label="Ruch" name="Movement">
+ <menu_item_call label="Usiądź" name="Sit Down Here"/>
+ <menu_item_check label="Zacznij latać" name="Fly"/>
+ <menu_item_check label="Zawsze biegnij" name="Always Run"/>
+ <menu_item_call label="Zatrzymaj animacje" name="Stop Animating My Avatar"/>
+ </menu>
<menu label="Mój Status" name="Status">
<menu_item_call label="Tryb oddalenia" name="Set Away"/>
<menu_item_call label="Tryb pracy" name="Set Busy"/>
</menu>
- <menu_item_call label="Zażądaj statusu administratora" name="Request Admin Options"/>
- <menu_item_call label="Wyłącz atatus administratora" name="Leave Admin Options"/>
<menu_item_call label="Wyłącz [APP_NAME]" name="Quit"/>
</menu>
<menu label="Komunikacja" name="Communicate">
@@ -27,13 +31,13 @@
<menu label="Åšwiat" name="World">
<menu_item_check label="Mini-Mapa" name="Mini-Map"/>
<menu_item_check label="Mapa Åšwiata" name="World Map"/>
+ <menu_item_check label="Szukaj" name="Search"/>
<menu_item_call label="Zrób zdjęcie" name="Take Snapshot"/>
<menu_item_call label="Zapamiętaj to miejsce (LM)" name="Create Landmark Here"/>
- <menu label="Miejsce" name="Land">
- <menu_item_call label="Profil miejsca" name="Place Profile"/>
- <menu_item_call label="O posiadłości" name="About Land"/>
- <menu_item_call label="Region/MajÄ…tek" name="Region/Estate"/>
- </menu>
+ <menu_item_separator/>
+ <menu_item_call label="Profil miejsca" name="Place Profile"/>
+ <menu_item_call label="O posiadłości" name="About Land"/>
+ <menu_item_call label="Region/MajÄ…tek" name="Region/Estate"/>
<menu_item_call label="Kup posiadłość" name="Buy Land"/>
<menu_item_call label="Moje posiadłości" name="My Land"/>
<menu label="Pokaż" name="LandShow">
@@ -45,10 +49,11 @@
<menu_item_check label="Właściciele posiadłości" name="Land Owners"/>
<menu_item_check label="Współrzędne" name="Coordinates"/>
<menu_item_check label="Właściwości posiadłości" name="Parcel Properties"/>
+ <menu_item_check label="Menu Zaawansowane" name="Show Advanced Menu"/>
</menu>
<menu_item_call label="Teleportuj do Miejsca Startu" name="Teleport Home"/>
<menu_item_call label="Ustaw Miejsce Startu" name="Set Home to Here"/>
- <menu label="Słońce" name="Environment Settings">
+ <menu label="Słońce" name="Sun">
<menu_item_call label="Wschód Słońca" name="Sunrise"/>
<menu_item_call label="Południe" name="Noon"/>
<menu_item_call label="Zachód Słońca" name="Sunset"/>
@@ -111,17 +116,19 @@
<menu_item_call label="dźwięk (L$[COST])..." name="Upload Sound"/>
<menu_item_call label="animacjÄ™ (L$[COST])..." name="Upload Animation"/>
<menu_item_call label="zbiór plików (L$[COST] za jeden plik)..." name="Bulk Upload"/>
+ <menu_item_call label="Ustaw domyślne pozwolenia ładowania" name="perm prefs"/>
</menu>
+ <menu_item_call label="Cofnij" name="Undo"/>
+ <menu_item_call label="Ponów" name="Redo"/>
</menu>
<menu label="Pomoc" name="Help">
<menu_item_call label="[SECOND_LIFE] Portal Pomocy" name="Second Life Help"/>
+ <menu_item_check label="WÅ‚Ä…cz podpowiedzi" name="Enable Hints"/>
<menu_item_call label="Złóż Raport o Nadużyciu" name="Report Abuse"/>
<menu_item_call label="Zgłoś błędy klienta" name="Report Bug"/>
<menu_item_call label="O [APP_NAME]" name="About Second Life"/>
- <menu_item_check label="WÅ‚Ä…cz podpowiedzi" name="Enable Hints"/>
</menu>
<menu label="Zaawansowane" name="Advanced">
- <menu_item_call label="Zatrzymaj wszystkie animacje" name="Stop Animating My Avatar"/>
<menu_item_call label="Odswież wyświetlanie tekstur" name="Rebake Texture"/>
<menu_item_call label="Domyślne ustawienia rozmiaru interfejsu" name="Set UI Size to Default"/>
<menu_item_call label="Ustaw rozmiar interfejsu..." name="Set Window Size..."/>
@@ -129,7 +136,6 @@
<menu_item_check label="Wyłącz ograniczenia zasięgu kamery" name="Disable Camera Distance"/>
<menu_item_check label="Wysoka rozdzielczość zdjęć" name="HighResSnapshot"/>
<menu_item_check label="Zapisuj zdjęcia na dysk twardy bez efektu dźwiękowego" name="QuietSnapshotsToDisk"/>
- <menu_item_check label="Skompresuj zdjęcie na dysk twardy" name="CompressSnapshotsToDisk"/>
<menu label="Narzędzia" name="Performance Tools">
<menu_item_call label="Pomiar lagów" name="Lag Meter"/>
<menu_item_check label="Statystyki" name="Statistics Bar"/>
@@ -144,22 +150,22 @@
<menu_item_check label="Pokaż celownik myszki" name="ShowCrosshairs"/>
</menu>
<menu label="Rodzaje renderowania" name="Rendering Types">
- <menu_item_check label="Podstawowe" name="Simple"/>
- <menu_item_check label="Maska alpha" name="Alpha"/>
- <menu_item_check label="Drzewo" name="Tree"/>
- <menu_item_check label="Awatary" name="Character"/>
- <menu_item_check label="PÅ‚aszczyzna powierzchni" name="SurfacePath"/>
- <menu_item_check label="Niebo" name="Sky"/>
- <menu_item_check label="Woda" name="Water"/>
- <menu_item_check label="Ziemia" name="Ground"/>
- <menu_item_check label="Głośność" name="Volume"/>
- <menu_item_check label="Trawa" name="Grass"/>
- <menu_item_check label="Chmury" name="Clouds"/>
- <menu_item_check label="CzÄ…steczki" name="Particles"/>
- <menu_item_check label="Zderzenie" name="Bump"/>
+ <menu_item_check label="Podstawowe" name="Rendering Type Simple"/>
+ <menu_item_check label="Maska alpha" name="Rendering Type Alpha"/>
+ <menu_item_check label="Drzewo" name="Rendering Type Tree"/>
+ <menu_item_check label="Awatary" name="Rendering Type Character"/>
+ <menu_item_check label="PÅ‚aszczyzna powierzchni" name="Rendering Type Surface Patch"/>
+ <menu_item_check label="Niebo" name="Rendering Type Sky"/>
+ <menu_item_check label="Woda" name="Rendering Type Water"/>
+ <menu_item_check label="Ziemia" name="Rendering Type Ground"/>
+ <menu_item_check label="Głośność" name="Rendering Type Volume"/>
+ <menu_item_check label="Trawa" name="Rendering Type Grass"/>
+ <menu_item_check label="Chmury" name="Rendering Type Clouds"/>
+ <menu_item_check label="CzÄ…steczki" name="Rendering Type Particles"/>
+ <menu_item_check label="Zderzenie" name="Rendering Type Bump"/>
</menu>
<menu label="Opcje renderowania" name="Rendering Features">
- <menu_item_check label="UI" name="UI"/>
+ <menu_item_check label="UI" name="ToggleUI"/>
<menu_item_check label="Zaznaczone" name="Selected"/>
<menu_item_check label="Podświetlenie" name="Highlighted"/>
<menu_item_check label="Tekstury dynamiczne" name="Dynamic Textures"/>
@@ -171,12 +177,8 @@
<menu_item_call label="Wyczyść bufor danych grupy" name="ClearGroupCache"/>
<menu_item_check label="Wygładzanie ruchu myszki" name="Mouse Smoothing"/>
<menu label="Skróty" name="Shortcuts">
- <menu_item_call label="Obraz (L$[COST])..." name="Upload Image"/>
- <menu_item_check label="Szukaj" name="Search"/>
<menu_item_call label="Zwolnij klawisze" name="Release Keys"/>
- <menu_item_call label="Domyślne ustawienia rozmiaru interfejsu" name="Set UI Size to Default"/>
- <menu_item_check label="Biegnij" name="Always Run"/>
- <menu_item_check label="Zacznij latać" name="Fly"/>
+ <menu_item_check label="Pokaż menu Zaawansowane - skrót" name="Show Advanced Menu - legacy shortcut"/>
<menu_item_call label="Zamknij okno" name="Close Window"/>
<menu_item_call label="Zamknij wszystkie okna" name="Close All Windows"/>
<menu_item_call label="Zapisz zdjęcie na dysk twardy" name="Snapshot to Disk"/>
@@ -184,17 +186,9 @@
<menu_item_check label="Wolna kamera" name="Joystick Flycam"/>
<menu_item_call label="Reset widoku" name="Reset View"/>
<menu_item_call label="Zobacz ostatniego rozmówcę" name="Look at Last Chatter"/>
- <menu label="Wybierz narzędzie budowania" name="Select Tool">
- <menu_item_call label="Narzędzie ogniskowej" name="Focus"/>
- <menu_item_call label="Narzędzie ruchu" name="Move"/>
- <menu_item_call label="Narzędzie edycji" name="Edit"/>
- <menu_item_call label="Stwórz narzędzie" name="Create"/>
- <menu_item_call label="Narzędzia posiadłości" name="Land"/>
- </menu>
<menu_item_call label="Przybliż" name="Zoom In"/>
<menu_item_call label="Domyślne przybliżenie" name="Zoom Default"/>
<menu_item_call label="Oddal" name="Zoom Out"/>
- <menu_item_check label="Pokaż menu Zaawansowane" name="Show Advanced Menu"/>
</menu>
<menu_item_call label="Pokaż ustawienia debugowania" name="Debug Settings"/>
<menu_item_check label="Pokaż menu progresu" name="Debug Mode"/>
@@ -216,7 +210,9 @@
<menu label="Pokaż informacje" name="Display Info">
<menu_item_check label="Pokaż czas" name="Show Time"/>
<menu_item_check label="Pokaż informacje o renderowaniu" name="Show Render Info"/>
+ <menu_item_check label="Pokaż informację o teksturze" name="Show Texture Info"/>
<menu_item_check label="Pokaż kolor pod kursorem" name="Show Color Under Cursor"/>
+ <menu_item_check label="Pokaż pamięć" name="Show Memory"/>
<menu_item_check label="Pokaż aktualizacje obiektów" name="Show Updates"/>
</menu>
<menu label="Reset błędu" name="Force Errors">
@@ -234,6 +230,9 @@
<menu_item_check label="Losowa ilość klatek" name="Randomize Framerate"/>
<menu_item_check label="Test klatki obrazu" name="Frame Test"/>
</menu>
+ <menu label="Render Metadata" name="Render Metadata">
+ <menu_item_check label="Aktualizuj typ" name="Update Type"/>
+ </menu>
<menu label="Renderowanie" name="Rendering">
<menu_item_check label="Osie" name="Axes"/>
<menu_item_check label="Tryb obrazu szkieletowego" name="Wireframe"/>
@@ -255,37 +254,34 @@
<menu_item_call label="Upuść pakiet pamięci" name="Drop a Packet"/>
</menu>
<menu_item_call label="Zderzenia, popchnięcia &amp; uderzenia" name="Bumps, Pushes &amp;amp; Hits"/>
- <menu label="Åšwiat" name="World">
+ <menu label="Åšwiat" name="DevelopWorld">
<menu_item_check label="Domyślne ustawienia środowiska Regionu" name="Sim Sun Override"/>
- <menu_item_check label="Efekty emiterów" name="Cheesy Beacon"/>
<menu_item_check label="Ustalona pogoda" name="Fixed Weather"/>
<menu_item_call label="Zachowaj bufor pamięci obiektów regionu" name="Dump Region Object Cache"/>
</menu>
<menu label="UI" name="UI">
- <menu_item_call label="Test przeglÄ…darki internetowej" name="Web Browser Test"/>
+ <menu_item_call label="Test przeglądarki mediów" name="Web Browser Test"/>
+ <menu_item_call label="Przeglądarka zawartości strony" name="Web Content Browser"/>
<menu_item_call label="Drukuj zaznaczone informacje o obiekcie" name="Print Selected Object Info"/>
<menu_item_call label="Statystyki pamięci" name="Memory Stats"/>
- <menu_item_check label="Auto-pilot na podwójne kliknięcie" name="Double-ClickAuto-Pilot"/>
- <menu_item_check label="Podwójne kliknięcie - Teleportuj" name="DoubleClick Teleport"/>
+ <menu_item_check label="Konsola debugowania regionu" name="Region Debug Console"/>
<menu_item_check label="Debugowanie zdarzeń klikania" name="Debug Clicks"/>
<menu_item_check label="Debugowanie zdarzeń myszy" name="Debug Mouse Events"/>
</menu>
<menu label="XUI" name="XUI">
<menu_item_call label="Załaduj ustawienia koloru" name="Reload Color Settings"/>
<menu_item_call label="Pokaż test czcionki" name="Show Font Test"/>
- <menu_item_call label="Załaduj z XML" name="Load from XML"/>
- <menu_item_call label="Zapisz jako XML" name="Save to XML"/>
<menu_item_check label="Pokaż nazwy XUI" name="Show XUI Names"/>
<menu_item_call label="Wyślij wiadomość (IM) testową" name="Send Test IMs"/>
<menu_item_call label="Wyczyść bufor pamięci nazw" name="Flush Names Caches"/>
</menu>
<menu label="Awatar" name="Character">
<menu label="Przesuń bakowaną teksturę" name="Grab Baked Texture">
- <menu_item_call label="Tęczówka oka" name="Iris"/>
- <menu_item_call label="GÅ‚owa" name="Head"/>
- <menu_item_call label="Górna część ciała" name="Upper Body"/>
- <menu_item_call label="Dolna część ciała" name="Lower Body"/>
- <menu_item_call label="Spódnica" name="Skirt"/>
+ <menu_item_call label="Tęczówka oka" name="Grab Iris"/>
+ <menu_item_call label="GÅ‚owa" name="Grab Head"/>
+ <menu_item_call label="Górna część ciała" name="Grab Upper Body"/>
+ <menu_item_call label="Dolna część ciała" name="Grab Lower Body"/>
+ <menu_item_call label="Spódnica" name="Grab Skirt"/>
</menu>
<menu label="Testy postaci" name="Character Tests">
<menu_item_call label="Przesuń geometrię postaci" name="Toggle Character Geometry"/>
@@ -301,13 +297,13 @@
</menu>
<menu_item_check label="Tekstury HTTP" name="HTTP Textures"/>
<menu_item_check label="Aktywacja okna konsoli podczas następnego uruchomienia" name="Console Window"/>
- <menu_item_check label="Pokaż menu administratora" name="View Admin Options"/>
<menu_item_call label="Uzyskaj status administratora" name="Request Admin Options"/>
<menu_item_call label="Opuść status administratora" name="Leave Admin Options"/>
+ <menu_item_check label="Pokaż menu administratora" name="View Admin Options"/>
</menu>
<menu label="Administrator" name="Admin">
- <menu label="Object">
- <menu_item_call label="Weź kopię" name="Take Copy"/>
+ <menu label="Object" name="AdminObject">
+ <menu_item_call label="Weź kopię" name="Admin Take Copy"/>
<menu_item_call label="Reset właściciela" name="Force Owner To Me"/>
<menu_item_call label="Reset przyzwolenia właściciela" name="Force Owner Permissive"/>
<menu_item_call label="Usuń" name="Delete"/>
@@ -324,4 +320,9 @@
</menu>
<menu_item_call label="Boskie narzędzia" name="God Tools"/>
</menu>
+ <menu label="Admin" name="Deprecated">
+ <menu label="Take Off Clothing" name="Take Off Clothing">
+ <menu_item_call label="Fizyka" name="Physics"/>
+ </menu>
+ </menu>
</menu_bar>
diff --git a/indra/newview/skins/default/xui/pl/notifications.xml b/indra/newview/skins/default/xui/pl/notifications.xml
index 8151c7eb93..0194293642 100644
--- a/indra/newview/skins/default/xui/pl/notifications.xml
+++ b/indra/newview/skins/default/xui/pl/notifications.xml
@@ -72,9 +72,9 @@ Szczegóły błędu: Błąd o nazwie &apos;[_NAME]&apos; nie został odnaleziony
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="LoginFailedNoNetwork">
- Brak połączenia z [SECOND_LIFE_GRID].
-&apos;[DIAGNOSTIC]&apos;
-Sprawdź stan swojego połączenia sieciowego.
+ Nie można połączyć z [SECOND_LIFE_GRID].
+ &apos;[DIAGNOSTIC]&apos;
+Upewnij się, że Twoje połączenie z internetem działa.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="MessageTemplateNotFound">
@@ -109,6 +109,10 @@ Wybierz pojedynczy obiekt i spróbuj jeszcze raz.
Osoby spoza listy znajomych, których rozmowy głosowe i IM są ignorowane, nie wiedzą o tym.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="FavoritesOnLogin">
+ Pamiętaj: kiedy wyłączysz tą opcję, każdy kto używa tego komputera, może zobaczyć Twoją listę ulubionych miejsc.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="GrantModifyRights">
Udzielenie praw modyfikacji innemu Rezydentowi umożliwia modyfikację, usuwanie lub wzięcie JAKIEGOKOLWIEK z Twoich obiektów. Używaj tej opcji z rozwagą!
Czy chcesz udzielić prawa do modyfikacji [NAME]?
@@ -327,13 +331,6 @@ Potrzebujesz konta aby się zalogować do [SECOND_LIFE]. Czy chcesz utworzyć je
<notification name="InvalidCredentialFormat">
Należy wprowadzić nazwę użytkownika lub imię oraz nazwisko Twojego awatara w pole nazwy użytkownika a następnie ponownie się zalogować.
</notification>
- <notification name="AddClassified">
- Ogłoszenia reklamowe ukazują się w zakładce Reklama w wyszukiwarce (Szukaj) oraz na [http://secondlife.com/community/classifieds secondlife.com] przez tydzień.
-Napisz treść swojej reklamy, kliknij Zamieść by dodać katalogu ogłoszeń.
-Po zamieszczeniu reklamy zostaniesz poproszony o sprecyzowanie opłaty za Reklamę.
-Im wyższa opłata tym wyżej Twoja reklama wyświetla się w katalogu i wyszukiwarce po wpisaniu słów kluczowych.
- <usetemplate ignoretext="Jak stworzyć nową reklamę?" name="okcancelignore" notext="Anuluj" yestext="OK"/>
- </notification>
<notification name="DeleteClassified">
Usunąć reklamę &apos;[NAME]&apos;?
Pamiętaj! Nie ma rekompensaty za poniesione koszta.
@@ -383,6 +380,9 @@ Pamiętaj: Opcja ta wyczyszcza bufor danych.
<notification name="ChangeSkin">
Nowa skórka zostanie wczytana po restarcie aplikacji [APP_NAME].
</notification>
+ <notification name="ChangeLanguage">
+ Zmiana języka zadziała po restarcie [APP_NAME].
+ </notification>
<notification name="GoToAuctionPage">
Odwiedzić stronę internetową [SECOND_LIFE] żeby zobaczyć szczgóły aukcji lub zrobić ofertę?
<usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
@@ -580,6 +580,10 @@ Oczekiwana - [VALIDS]
Brak bloku &apos;data&apos; w nagłówku pliku WAV:
[FILE]
</notification>
+ <notification name="SoundFileInvalidChunkSize">
+ Niewłaściwy rozmiar &quot;chunk&quot; w pliku WAV:
+[FILE]
+ </notification>
<notification name="SoundFileInvalidTooLong">
Plik audio jest zbyt długi (10 sekund maksimum):
[FILE]
@@ -917,7 +921,7 @@ Zaproponować znajomość [NAME]?
<input name="message">
[DESC] (nowe)
</input>
- <button name="Offer" text="OK"/>
+ <button name="OK" text="OK"/>
<button name="Cancel" text="Anuluj"/>
</form>
</notification>
@@ -927,7 +931,7 @@ Zaproponować znajomość [NAME]?
<input name="message">
[DESC] (nowy)
</input>
- <button name="Offer" text="OK"/>
+ <button name="OK" text="OK"/>
<button name="Cancel" text="Anuluj"/>
</form>
</notification>
@@ -937,12 +941,12 @@ Zaproponować znajomość [NAME]?
<input name="new_name">
[NAME]
</input>
- <button name="Offer" text="OK"/>
+ <button name="OK" text="OK"/>
<button name="Cancel" text="Anuluj"/>
</form>
</notification>
<notification name="RemoveFromFriends">
- Czy chcesz usunąć [NAME] z listy znajomych?
+ Czy chcesz usunąć &lt;nolink&gt;[NAME]&lt;/nolink&gt; z listy znajomych?
<usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
</notification>
<notification name="RemoveMultipleFromFriends">
@@ -1303,6 +1307,40 @@ Aktualizacja nie jest wymagana ale jest zalecana w celu poprawy prędkości i st
Pobrać i zapisać w folderze Aplikacji?
<usetemplate name="okcancelbuttons" notext="Kontynuuj" yestext="Załaduj"/>
</notification>
+ <notification name="FailedUpdateInstall">
+ Podczas aktualizacji pojawił się błąd. Proszę pobrać i zainstalować najnowszego klienta z http://secondlife.com/download.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="FailedRequiredUpdateInstall">
+ Nie można zainstalować wymaganej aktualizacji. Nie będzie można zalogować się dopóki [APP_NAME] nie zostanie zaktualizowana.
+ Proszę pobrać i zainstalować najnowszą wersję z http://secondlife.com/download.
+ <usetemplate name="okbutton" yestext="Rezygnuj"/>
+ </notification>
+ <notification name="UpdaterServiceNotRunning">
+ Istnieje obowiązkowa aktualizacja dla Second Life. Możesz ją pobrać z http://www.secondlife.com/downloads lub zainstalować teraz.
+ <usetemplate name="okcancelbuttons" notext="Opuść Second Life" yestext="Pobierz i zainstaluj teraz"/>
+ </notification>
+ <notification name="DownloadBackgroundTip">
+ Aktualizacja dla [APP_NAME] została pobrana.
+Wersja [VERSION] [[RELEASE_NOTES_FULL_URL] Informacja o tej aktualizacji]
+ <usetemplate name="okcancelbuttons" notext="Później..." yestext="Zainstaluj teraz i restartuj [APP_NAME]"/>
+ </notification>
+ <notification name="DownloadBackgroundDialog">
+ Aktualizacja [APP_NAME] została pobrana.
+Wersja [VERSION] [[RELEASE_NOTES_FULL_URL] Informacja o aktualizacji]
+ <usetemplate name="okcancelbuttons" notext="Później..." yestext="Zainstaluj teraz i restartuj [APP_NAME]"/>
+ </notification>
+ <notification name="RequiredUpdateDownloadedVerboseDialog">
+ Pobrano wymaganÄ… aktualizacjÄ™.
+Wersja [VERSION]
+
+W celu instalacji aktualizacji musi zostać wykonany restart [APP_NAME].
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="RequiredUpdateDownloadedDialog">
+ W celu instalacji aktualizacji musi zostać wykonany restart [APP_NAME].
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="DeedObjectToGroup">
Przekazanie tego obiektu spowoduje, że grupa:
* Otrzyma L$ zapłacone temu obiektowi
@@ -1347,7 +1385,7 @@ Pobrać i zapisać w folderze Aplikacji?
<usetemplate ignoretext="Potwierdź zanim zwrócisz obiekty do ich właścicieli" name="okcancelignore" notext="Anuluj" yestext="OK"/>
</notification>
<notification name="GroupLeaveConfirmMember">
- Jesteś członkiem grupy [GROUP].
+ Jesteś członkiem grupy &lt;nolink&gt;[GROUP]&lt;/nolink&gt;.
Chcesz opuścić grupę?
<usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
</notification>
@@ -2040,10 +2078,10 @@ Zamieść go na stronie internetowej żeby umożliwić innym łatwy dostęp do t
Temat: [SUBJECT], Treść: [MESSAGE]
</notification>
<notification name="FriendOnline">
- [NAME] jest w Second Life
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; jest w Second Life
</notification>
<notification name="FriendOffline">
- [NAME] opuszcza Second Life
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; opuszcza Second Life
</notification>
<notification name="AddSelfFriend">
Nie możesz dodać siebie do listy znajomych.
@@ -2171,14 +2209,6 @@ Spróbuj wybrać mniejszy obszar.
<notification name="NoContentToSearch">
Proszę wybrać przynajmiej jeden z podanych rodzajów treści jaką zawiera region podczas wyszukiwania (&apos;General&apos;, &apos;Moderate&apos;, lub &apos;Adult&apos;).
</notification>
- <notification name="GroupVote">
- [NAME] zaprasza do głosowania nad propozycją:
-[MESSAGE]
- <form name="form">
- <button name="VoteNow" text="GÅ‚osuj Teraz"/>
- <button name="Later" text="Później"/>
- </form>
- </notification>
<notification name="SystemMessage">
[MESSAGE]
</notification>
@@ -2355,7 +2385,7 @@ Spróbuj ponowanie za kilka minut.
</notification>
<notification name="ObjectGiveItem">
Obiekt o nazwie &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt;, należący do [NAME_SLURL] dał Tobie [OBJECTTYPE]:
-[ITEM_SLURL]
+&lt;nolink&gt;[ITEM_SLURL]&lt;/nolink&gt;
<form name="form">
<button name="Keep" text="Zachowaj"/>
<button name="Discard" text="Wyrzuć"/>
@@ -2428,10 +2458,10 @@ Spróbuj ponowanie za kilka minut.
</form>
</notification>
<notification name="FriendshipAccepted">
- Twoja propozycja znajomości została przyjęta przez [NAME].
+ Twoja propozycja znajomości została przyjęta przez &lt;nolink&gt;[NAME]&lt;/nolink&gt;.
</notification>
<notification name="FriendshipDeclined">
- Twoja propozycja znajomości została odrzucona przez [NAME].
+ Twoja propozycja znajomości została odrzucona przez &lt;nolink&gt;[NAME]&lt;/nolink&gt;.
</notification>
<notification name="FriendshipAcceptedByMe">
Propozycja znajomości została zaakceptowana.
@@ -2440,8 +2470,8 @@ Spróbuj ponowanie za kilka minut.
Propozycja znajomości została odrzucona.
</notification>
<notification name="OfferCallingCard">
- [NAME] daje Tobie swoją wizytówkę.
-Wizytówka będzie znajdowała się w Szafie i umożliwi szybkie wysłanie IM do tego Rezydenta.
+ [NAME] oferuje swoją wizytówkę.
+Wizytówka w Twojej Szafie umożliwi szybki kontakt IM z tym Rezydentem.
<form name="form">
<button name="Accept" text="Zaakceptuj"/>
<button name="Decline" text="Odmów"/>
@@ -2635,9 +2665,6 @@ Wybierz Zaakceptuj żeby zacząć czat albo Odmów żeby nie przyjąć zaproszen
<notification name="VoiceCallGenericError">
Błąd podczas łączenia z rozmową [VOICE_CHANNEL_NAME]. Spróbuj póżniej.
</notification>
- <notification name="ServerVersionChanged">
- Ten region używa innej wersji symulatora. Kliknij na tą wiadomość żeby uzyskać więcej informacji: [[URL] View the release notes.]
- </notification>
<notification name="UnsupportedCommandSLURL">
Nie można otworzyć wybranego SLurl.
</notification>
@@ -2689,9 +2716,9 @@ Przycisk zostanie wyświetlony w przypadku dostatecznej ilości przestrzeni.
Zaznacz Rezydentów, z którymi chcesz się podzielić.
</notification>
<notification name="ShareItemsConfirmation">
- Jesteś pewien/pewna, że chcesz udostępnić następujące obiekty:
+ Czy na pewno chcesz udostępnić następujące obiekty:
-[ITEMS]
+&lt;nolink&gt;[ITEMS]&lt;/nolink&gt;
następującym Rezydentom:
@@ -2740,9 +2767,7 @@ Awatar &apos;[NAME]&apos; opuścił edycję wyglądu.
<notification name="NoConnect">
Występuje problem z połączeniem [PROTOCOL] [HOSTID].
Proszę sprawdź swoją sieć i ustawienia firewall.
- <form name="form">
- <button name="OK" text="OK"/>
- </form>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="NoVoiceConnect">
Występuje problem z Twoim połączniem głosowym:
@@ -2751,9 +2776,7 @@ Proszę sprawdź swoją sieć i ustawienia firewall.
Komunikacja głosowa nie będzie dostępna.
Proszę sprawdź swoją sieć i ustawienia firewall.
- <form name="form">
- <button name="OK" text="OK"/>
- </form>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="AvatarRezLeftNotification">
( [EXISTENCE] sekund w Second Life)
@@ -2784,6 +2807,13 @@ Wyciszyć wszystkich?
<notification label="Wstań" name="HintSit">
Aby wstać i opuścić pozycję siedzącą, kliknij przycisk Wstań.
</notification>
+ <notification label="Mów" name="HintSpeak">
+ Kliknij przycisk &quot;Mów&quot; aby włączyć i wyłączyć Twój mikrofon.
+
+Kliknij w strzałkę aby zobaczyć panel kontroli głosu.
+
+Ukrycie przycisku &quot;Mów&quot; zdezaktywuje głos.
+ </notification>
<notification label="Odkrywaj Åšwiat" name="HintDestinationGuide">
Destination Guide zawiera tysiące nowych miejsc do odkrycia. Wybierz lokalizację i teleportuj się aby rozpocząć zwiedzanie.
</notification>
@@ -2793,9 +2823,19 @@ Wyciszyć wszystkich?
<notification label="Ruch" name="HintMove">
Aby chodzić lub biegać, otwórz panel ruchu i użyj strzałek do nawigacji. Możesz także używać strzałek z klawiatury.
</notification>
+ <notification label="" name="HintMoveClick">
+ 1. Kliknij aby chodzić.
+Kliknij gdziekolwiek na ziemi aby przejść do wskazanego miejsca.
+
+2. Kliknij i przeciągnij aby zmienić widok.
+Kliknij i przeciągnij gdziekolwiek aby obrócić widok.
+ </notification>
<notification label="Wyświetlana nazwa" name="HintDisplayName">
Ustaw wyświetlaną nazwę, którą możesz zmieniać tutaj. Jest ona dodatkiem do unikatowej nazwy użytkownika, która nie może być zmieniona. Możesz zmienić sposób w jaki widzisz nazwy innych osób w Twoich Ustawieniach.
</notification>
+ <notification label="Widok" name="HintView">
+ To change your camera view, use the Orbit and Pan controls. Zresetuj widok poprzez wciśnięcie klawisza Esc lub chodzenie.
+ </notification>
<notification label="Szafa" name="HintInventory">
Sprawdź swoją Szafę aby znaleźć obiekty. Najnowsze obiekty mogą być łatwo odnalezione w zakładce Nowe obiekty.
</notification>
@@ -2809,6 +2849,47 @@ Wyciszyć wszystkich?
<button name="open" text="Otwórz wyskakujące okno."/>
</form>
</notification>
+ <notification name="AuthRequest">
+ Strpna &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos; w domenie &apos;[REALM]&apos; wymaga nazwy użytkownika i hasła.
+ <form name="form">
+ <input name="username" text="Nazwa użytkownika"/>
+ <input name="password" text="Hasło"/>
+ <button name="ok" text="Wyślij"/>
+ <button name="cancel" text="Anuluj"/>
+ </form>
+ </notification>
+ <notification label="" name="ModeChange">
+ Zmiana trybu wymaga restartu.
+ <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/>
+ </notification>
+ <notification label="" name="NoClassifieds">
+ Tworzenie i edycja reklam jest możliwa tylko w trybie zaawansowanym. Czy chcesz wylogować się i zmienić tryb? Opcja wyboru trybu życia jest widoczna na ekranie logowania.
+ <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/>
+ </notification>
+ <notification label="" name="NoGroupInfo">
+ Tworzenie i edycja grup jest możliwa tylko w trybie zaawansowanym. Czy chcesz wylogować się i zmienić tryb? Opcja wyboru trybu życia jest widoczna na ekranie logowania.
+ <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/>
+ </notification>
+ <notification label="" name="NoPicks">
+ Tworzenie i edycja Ulubionych jest możliwa jedynie w trybie zaawansowanym. Czy chcesz się wylogować i zmienić tryb? Opcja wyboru trybu życia jest widoczna na ekranie logowania.
+ <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/>
+ </notification>
+ <notification label="" name="NoWorldMap">
+ Oglądanie mapy świata jest możliwe tylko w trybie zaawansowanym. Czy chcesz się wylogować i zmienić tryb? Opcja wyboru trybu życia jest widoczna na ekranie logowania.
+ <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/>
+ </notification>
+ <notification label="" name="NoVoiceCall">
+ Rozmowy głosowe są możliwe tylko w trybie zaawansowanym. Czy chcesz wylogować się i zmienić tryb?
+ <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/>
+ </notification>
+ <notification label="" name="NoAvatarShare">
+ Udostępnienie jest możliwe tylko w trybie zaawansowanym. Czy chcesz wylogować się i zmienić tryb? Opcja wyboru trybu życia jest widoczna na ekranie logowania.
+ <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/>
+ </notification>
+ <notification label="" name="NoAvatarPay">
+ Płacenie innym Rezydentom jest możliwe tylko w trybie zaawansowanym. Czy chcesz się wylogować i zmienić tryb? Opcja wyboru trybu życia jest widoczna na ekranie logowania.
+ <usetemplate name="okcancelbuttons" notext="Nie zamykaj" yestext="Zamknij"/>
+ </notification>
<global name="UnsupportedCPU">
- Prędkość Twojego CPU nie spełnia minimalnych wymagań.
</global>
diff --git a/indra/newview/skins/default/xui/pl/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/pl/panel_avatar_list_item.xml
index 1ab95eec00..c43a9bed81 100644
--- a/indra/newview/skins/default/xui/pl/panel_avatar_list_item.xml
+++ b/indra/newview/skins/default/xui/pl/panel_avatar_list_item.xml
@@ -21,7 +21,7 @@
<string name="FormatYears">
[COUNT]lat
</string>
- <text name="avatar_name" value="Nieznane"/>
+ <text name="avatar_name" value="(Å‚adowanie)"/>
<icon name="permission_edit_theirs_icon" tool_tip="Możesz edytować obiekty tego Znajomego"/>
<icon name="permission_edit_mine_icon" tool_tip="Ten Znajomy może edytować, kasować lub wziąć Twoje obiekty"/>
<icon name="permission_map_icon" tool_tip="Ten Znajomy może zlokalizować Ciebie na mapie"/>
diff --git a/indra/newview/skins/default/xui/pl/panel_edit_alpha.xml b/indra/newview/skins/default/xui/pl/panel_edit_alpha.xml
index a22d4b0482..51ee3af00d 100644
--- a/indra/newview/skins/default/xui/pl/panel_edit_alpha.xml
+++ b/indra/newview/skins/default/xui/pl/panel_edit_alpha.xml
@@ -1,10 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_alpha_panel">
- <panel name="avatar_alpha_color_panel">
- <texture_picker label="Alpha dolnej części ciała" name="Lower Alpha" tool_tip="Kliknij aby wybrać teksturę"/>
- <texture_picker label="Alpha górnej części ciała" name="Upper Alpha" tool_tip="Kliknij aby wybrać teksturę"/>
- <texture_picker label="Alpha głowy" name="Head Alpha" tool_tip="Kliknij aby wybrać teksturę"/>
- <texture_picker label="Alpha oka" name="Eye Alpha" tool_tip="Kliknij aby wybrać teksturę"/>
- <texture_picker label="Alpha włosów" name="Hair Alpha" tool_tip="Kliknij aby wybrać teksturę"/>
- </panel>
+ <scroll_container name="avatar_alpha_color_panel_scroll">
+ <panel name="avatar_alpha_color_panel">
+ <texture_picker label="Alpha dolnej części ciała" name="Lower Alpha" tool_tip="Kliknij aby wybrać teksturę"/>
+ <texture_picker label="Alpha górnej części ciała" name="Upper Alpha" tool_tip="Kliknij aby wybrać teksturę"/>
+ <texture_picker label="Alpha głowy" name="Head Alpha" tool_tip="Kliknij aby wybrać teksturę"/>
+ <texture_picker label="Alpha oka" name="Eye Alpha" tool_tip="Kliknij aby wybrać teksturę"/>
+ <texture_picker label="Alpha włosów" name="Hair Alpha" tool_tip="Kliknij aby wybrać teksturę"/>
+ </panel>
+ </scroll_container>
</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_edit_gloves.xml b/indra/newview/skins/default/xui/pl/panel_edit_gloves.xml
index 166e3c4551..d32646d1a3 100644
--- a/indra/newview/skins/default/xui/pl/panel_edit_gloves.xml
+++ b/indra/newview/skins/default/xui/pl/panel_edit_gloves.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_gloves_panel">
<panel name="avatar_gloves_color_panel">
- <texture_picker label="Materiał" name="Fabric" tool_tip="Kliknij aby wybrać teksturę"/>
+ <texture_picker label="Tekstura" name="Fabric" tool_tip="Kliknij aby wybrać teksturę"/>
<color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij aby wybrać teksturę"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/pl/panel_edit_jacket.xml b/indra/newview/skins/default/xui/pl/panel_edit_jacket.xml
index ba0b908394..7653e84cc0 100644
--- a/indra/newview/skins/default/xui/pl/panel_edit_jacket.xml
+++ b/indra/newview/skins/default/xui/pl/panel_edit_jacket.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_jacket_panel">
<panel name="avatar_jacket_color_panel">
- <texture_picker label="Górny materiał" name="Upper Fabric" tool_tip="Kliknij aby wybrać teksturę"/>
- <texture_picker label="Dolny materiał" name="Lower Fabric" tool_tip="Kliknij aby wybrać teksturę"/>
+ <texture_picker label="Górna tekstura" name="Upper Fabric" tool_tip="Kliknij aby wybrać teksturę"/>
+ <texture_picker label="Dolna tekstura" name="Lower Fabric" tool_tip="Kliknij aby wybrać teksturę"/>
<color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij aby wybrać kolor"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/pl/panel_edit_pants.xml b/indra/newview/skins/default/xui/pl/panel_edit_pants.xml
index 4adac604f4..7975e55746 100644
--- a/indra/newview/skins/default/xui/pl/panel_edit_pants.xml
+++ b/indra/newview/skins/default/xui/pl/panel_edit_pants.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_pants_panel">
<panel name="avatar_pants_color_panel">
- <texture_picker label="Materiał" name="Fabric" tool_tip="Kliknij aby wybrać teksturę"/>
+ <texture_picker label="Tekstura" name="Fabric" tool_tip="Kliknij aby wybrać teksturę"/>
<color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij aby wybrać kolor"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/pl/panel_edit_physics.xml b/indra/newview/skins/default/xui/pl/panel_edit_physics.xml
new file mode 100644
index 0000000000..a773a52a59
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_edit_physics.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_physics_panel">
+ <panel label="" name="accordion_panel">
+ <accordion name="physics_accordion">
+ <accordion_tab name="physics_breasts_updown_tab" title="Podskakiwanie piersi"/>
+ <accordion_tab name="physics_breasts_inout_tab" title="Rowek między piersiami"/>
+ <accordion_tab name="physics_breasts_leftright_tab" title="Kołysanie piersi"/>
+ <accordion_tab name="physics_belly_tab" title="Poskakiwanie brzucha"/>
+ <accordion_tab name="physics_butt_tab" title="Podksakiwanie pośladków"/>
+ <accordion_tab name="physics_butt_leftright_tab" title="Kołysanie pośladków"/>
+ <accordion_tab name="physics_advanced_tab" title="Zaawansowane parametry"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_edit_pick.xml b/indra/newview/skins/default/xui/pl/panel_edit_pick.xml
index 8a183c00cf..72c162f63d 100644
--- a/indra/newview/skins/default/xui/pl/panel_edit_pick.xml
+++ b/indra/newview/skins/default/xui/pl/panel_edit_pick.xml
@@ -29,7 +29,7 @@
<layout_panel name="layout_panel1">
<button label="Zapisz obrazek" name="save_changes_btn"/>
</layout_panel>
- <layout_panel name="layout_panel1">
+ <layout_panel name="layout_panel2">
<button label="Cofnij" name="cancel_btn"/>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/pl/panel_edit_profile.xml b/indra/newview/skins/default/xui/pl/panel_edit_profile.xml
index c409666ec9..e6fd8b18f8 100644
--- a/indra/newview/skins/default/xui/pl/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/pl/panel_edit_profile.xml
@@ -25,11 +25,7 @@
<text name="display_name_label" value="Wyświetlana nazwa:"/>
<text name="solo_username_label" value="Nazwa użytkownika:"/>
<button name="set_name" tool_tip="Ustaw wyświetlanią nazwę."/>
- <text name="solo_user_name" value="Hamilton Hitchings"/>
- <text name="user_name" value="Hamilton Hitchings"/>
- <text name="user_name_small" value="Hamilton Hitchings"/>
<text name="user_label" value="Nazwa użytkownika:"/>
- <text name="user_slid" value="hamilton.linden"/>
<panel name="lifes_images_panel">
<icon label="" name="2nd_life_edit_icon" tool_tip="Kliknij aby wybrać teksturę"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_edit_shirt.xml b/indra/newview/skins/default/xui/pl/panel_edit_shirt.xml
index 3bcf992d4d..9530c781ab 100644
--- a/indra/newview/skins/default/xui/pl/panel_edit_shirt.xml
+++ b/indra/newview/skins/default/xui/pl/panel_edit_shirt.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_shirt_panel">
<panel name="avatar_shirt_color_panel">
- <texture_picker label="Materiał" name="Fabric" tool_tip="Kliknij by wybrać grafikę"/>
+ <texture_picker label="Tekstura" name="Fabric" tool_tip="Kliknij by wybrać grafikę"/>
<color_swatch label="Kolor/Odcień" name="Color/Tint" tool_tip="Kliknij by wybrać kolor"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/pl/panel_edit_shoes.xml b/indra/newview/skins/default/xui/pl/panel_edit_shoes.xml
index e2c00c0506..d90a6d8726 100644
--- a/indra/newview/skins/default/xui/pl/panel_edit_shoes.xml
+++ b/indra/newview/skins/default/xui/pl/panel_edit_shoes.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_shoes_panel">
<panel name="avatar_shoes_color_panel">
- <texture_picker label="Materiał" name="Fabric" tool_tip="Kliknij aby wybrać teksturę"/>
+ <texture_picker label="Tekstura" name="Fabric" tool_tip="Kliknij aby wybrać teksturę"/>
<color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij aby wybrać kolor"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/pl/panel_edit_skirt.xml b/indra/newview/skins/default/xui/pl/panel_edit_skirt.xml
index 3fa9cefeb6..f74ad916cd 100644
--- a/indra/newview/skins/default/xui/pl/panel_edit_skirt.xml
+++ b/indra/newview/skins/default/xui/pl/panel_edit_skirt.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_skirt_panel">
<panel name="avatar_skirt_color_panel">
- <texture_picker label="Materiał" name="Fabric" tool_tip="Kliknij aby wybrać teksturę"/>
+ <texture_picker label="Tekstura" name="Fabric" tool_tip="Kliknij aby wybrać teksturę"/>
<color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij aby wybrać kolor"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/pl/panel_edit_socks.xml b/indra/newview/skins/default/xui/pl/panel_edit_socks.xml
index bb2cd637b5..b41069e8d7 100644
--- a/indra/newview/skins/default/xui/pl/panel_edit_socks.xml
+++ b/indra/newview/skins/default/xui/pl/panel_edit_socks.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_socks_panel">
<panel name="avatar_socks_color_panel">
- <texture_picker label="Materiał" name="Fabric" tool_tip="Kliknij aby wybrać teksturę"/>
+ <texture_picker label="Tekstura" name="Fabric" tool_tip="Kliknij aby wybrać teksturę"/>
<color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij aby wybrać kolor"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/pl/panel_edit_underpants.xml b/indra/newview/skins/default/xui/pl/panel_edit_underpants.xml
index 010d9b53d9..f2a9b10f17 100644
--- a/indra/newview/skins/default/xui/pl/panel_edit_underpants.xml
+++ b/indra/newview/skins/default/xui/pl/panel_edit_underpants.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_underpants_panel">
<panel name="avatar_underpants_color_panel">
- <texture_picker label="Materiał" name="Fabric" tool_tip="Kliknij aby wybrać kolor"/>
+ <texture_picker label="Tekstura" name="Fabric" tool_tip="Kliknij aby wybrać kolor"/>
<color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij aby wybrać kolor"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/pl/panel_edit_undershirt.xml b/indra/newview/skins/default/xui/pl/panel_edit_undershirt.xml
index 63ae1215e0..7da1341e96 100644
--- a/indra/newview/skins/default/xui/pl/panel_edit_undershirt.xml
+++ b/indra/newview/skins/default/xui/pl/panel_edit_undershirt.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_undershirt_panel">
<panel name="avatar_undershirt_color_panel">
- <texture_picker label="Materiał" name="Fabric" tool_tip="Kliknij aby wybrać teksturę"/>
+ <texture_picker label="Tekstura" name="Fabric" tool_tip="Kliknij aby wybrać teksturę"/>
<color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij aby wybrać kolor"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/pl/panel_edit_wearable.xml b/indra/newview/skins/default/xui/pl/panel_edit_wearable.xml
index d1157b910d..2027b8715b 100644
--- a/indra/newview/skins/default/xui/pl/panel_edit_wearable.xml
+++ b/indra/newview/skins/default/xui/pl/panel_edit_wearable.xml
@@ -45,6 +45,9 @@
<string name="edit_tattoo_title">
Edycja tatuażu
</string>
+ <string name="edit_physics_title">
+ Edycja fizyki
+ </string>
<string name="shape_desc_text">
Kształt:
</string>
@@ -90,6 +93,9 @@
<string name="tattoo_desc_text">
Tatuaż:
</string>
+ <string name="physics_desc_text">
+ Fizyka:
+ </string>
<labeled_back_button label="Zapisz" name="back_btn" tool_tip="Powrót do edycji stroju"/>
<text name="edit_wearable_title" value="Edycja kształtu"/>
<panel label="Koszula" name="wearable_type_panel">
diff --git a/indra/newview/skins/default/xui/pl/panel_group_notices.xml b/indra/newview/skins/default/xui/pl/panel_group_notices.xml
index 5b62d13880..a3b0998de3 100644
--- a/indra/newview/skins/default/xui/pl/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/pl/panel_group_notices.xml
@@ -47,7 +47,7 @@ Limit dzienny ogłoszeń dla grupy wynosi 200.
Ogłoszenia zachowane
</text>
<text name="lbl2">
- W celu wysłania nowego ogłoszenia kliknij przycisk +
+ W celu wysłania nowego ogłoszenia kliknij + Stwórz ogłoszenie
</text>
<text name="lbl3">
Temat:
diff --git a/indra/newview/skins/default/xui/pl/panel_login.xml b/indra/newview/skins/default/xui/pl/panel_login.xml
index 30432c509d..dc8e7399af 100644
--- a/indra/newview/skins/default/xui/pl/panel_login.xml
+++ b/indra/newview/skins/default/xui/pl/panel_login.xml
@@ -1,8 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_login">
- <panel.string name="real_url">
- http://secondlife.com/app/login/
- </panel.string>
<panel.string name="forgot_password_url">
http://secondlife.com/account/request.php
</panel.string>
@@ -11,12 +8,19 @@
<text name="username_text">
Użytkownik:
</text>
- <line_editor label="bobsmith12 lub Steller Sunshine" name="username_edit" tool_tip="Nazwę użytkownika wybierasz podczas rejestracji, np: like bobsmith12 lub Steller Sunshine"/>
+ <combo_box name="username_combo" tool_tip="Nazwę użytkownika wybierasz przy rejestracji, np. bobsmith12 lub Steller Sunshine"/>
<text name="password_text">
Hasło:
</text>
<check_box label="Zapamiętaj hasło" name="remember_check"/>
<button label="Połącz" name="connect_btn"/>
+ <text name="mode_selection_text">
+ Tryb życia:
+ </text>
+ <combo_box name="mode_combo" tool_tip="Wybierz tryb życia. Wybierz tryb turystyczny dla łatwego zwiedzania i czatowania. Wybierz tryb zaawansowany aby mieć dostęp do większej ilości opcji.">
+ <combo_box.item label="Turystyczny" name="Basic"/>
+ <combo_box.item label="Zaawansowany" name="Advanced"/>
+ </combo_box>
<text name="start_location_text">
Rozpocznij w:
</text>
diff --git a/indra/newview/skins/default/xui/pl/panel_media_settings_security.xml b/indra/newview/skins/default/xui/pl/panel_media_settings_security.xml
index da3142b54e..7e95c4942f 100644
--- a/indra/newview/skins/default/xui/pl/panel_media_settings_security.xml
+++ b/indra/newview/skins/default/xui/pl/panel_media_settings_security.xml
@@ -2,7 +2,8 @@
<panel label="Ochrona" name="Media Settings Security">
<check_box initial_value="false" label="Dostęp dozwolony tylko dla wybranych URL" name="whitelist_enable"/>
<text name="home_url_fails_some_items_in_whitelist">
- Wejścia na stronę WWW, które się nie powiodły są zaznaczone:
+ Wejścia na stronę WWW, które się nie powiodły są
+zaznaczone:
</text>
<button label="Dodaj" name="whitelist_add"/>
<button label="Usuń" name="whitelist_del"/>
diff --git a/indra/newview/skins/default/xui/pl/panel_my_profile.xml b/indra/newview/skins/default/xui/pl/panel_my_profile.xml
deleted file mode 100644
index 6b0ba44bb4..0000000000
--- a/indra/newview/skins/default/xui/pl/panel_my_profile.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Profil" name="panel_profile">
- <string name="no_partner_text" value="Żadne"/>
- <string name="no_group_text" value="Żadne"/>
- <string name="RegisterDateFormat">
- [REG_DATE] ([AGE])
- </string>
- <layout_stack name="layout">
- <layout_panel name="profile_stack">
- <scroll_container name="profile_scroll">
- <panel name="scroll_content_panel">
- <panel name="second_life_image_panel">
- <icon label="" name="2nd_life_edit_icon" tool_tip="Kliknij przycisk Edytuj profil by zmienić zdjęcie"/>
- <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/>
- </panel>
- <panel name="first_life_image_panel">
- <icon label="" name="real_world_edit_icon" tool_tip="Kliknij przycisk Edytuj profil by zmienić zdjęcie"/>
- <text name="title_rw_descr_text" value="Życie#1:"/>
- </panel>
- <text name="title_member_text" value="Urodziny:"/>
- <text name="title_acc_status_text" value="Konto:"/>
- <text name="title_partner_text" value="Partner:"/>
- <panel name="partner_data_panel">
- <name_box initial_value="(przetwarzanie)" name="partner_text"/>
- </panel>
- <text name="title_groups_text" value="Grupy:"/>
- </panel>
- </scroll_container>
- </layout_panel>
- </layout_stack>
- <panel name="profile_me_buttons_panel">
- <button label="Edytuj profil" name="edit_profile_btn" tool_tip="Edytuj informacje o sobie"/>
- </panel>
-</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_nearby_media.xml b/indra/newview/skins/default/xui/pl/panel_nearby_media.xml
index c9f951f7c6..d77c6d7852 100644
--- a/indra/newview/skins/default/xui/pl/panel_nearby_media.xml
+++ b/indra/newview/skins/default/xui/pl/panel_nearby_media.xml
@@ -19,7 +19,7 @@
<button label="Zatrzymaj" name="all_nearby_media_disable_btn" tool_tip="Wyłącz wszystkie media w pobliżu"/>
<button label="Włącz" name="all_nearby_media_enable_btn" tool_tip="Włącz wszystkie media w pobliżu"/>
<button name="open_prefs_btn" tool_tip="Uruchom preferencje medialne"/>
- <button label="Więcej &gt;&gt;" label_selected="Mniej &lt;&lt;" name="more_btn" tool_tip="Zaawansowane"/>
+ <button label="Więcej &gt;&gt;" label_selected="&lt;&lt; Mniej" name="more_btn" tool_tip="Zaawansowane"/>
<button label="Więcej &gt;&gt;" label_selected="Mniej &lt;&lt;" name="less_btn" tool_tip="Zaawansowane"/>
</panel>
<panel name="nearby_media_panel">
diff --git a/indra/newview/skins/default/xui/pl/panel_notes.xml b/indra/newview/skins/default/xui/pl/panel_notes.xml
deleted file mode 100644
index 571171d64c..0000000000
--- a/indra/newview/skins/default/xui/pl/panel_notes.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Notatki &amp; Prywatność" name="panel_notes">
- <layout_stack name="layout">
- <layout_panel name="notes_stack">
- <scroll_container name="profile_scroll">
- <panel name="profile_scroll_panel">
- <text name="status_message" value="Notatki:"/>
- <text name="status_message2" value="Pozwól tej osobie na:"/>
- <check_box label="Widzenie mojego statusu" name="status_check"/>
- <check_box label="Lokalizowanie mnie na mapie" name="map_check"/>
- <check_box label="Edytowanie, kasowanie lub zabieranie moich obiektów" name="objects_check"/>
- </panel>
- </scroll_container>
- </layout_panel>
- <layout_panel name="notes_buttons_panel">
- <layout_stack name="bottom_bar_ls">
- <layout_panel name="add_friend_btn_lp">
- <button label="Dodaj do Znajomych" name="add_friend" tool_tip="Zaoferuj znajomość Rezydentowi"/>
- </layout_panel>
- <layout_panel name="im_btn_lp">
- <button label="IM" name="im" tool_tip="Otwórz wiadomości IM"/>
- </layout_panel>
- <layout_panel name="call_btn_lp">
- <button label="Dzwoń" name="call" tool_tip="Zadzwoń do Rezydenta"/>
- </layout_panel>
- <layout_panel name="show_on_map_btn_lp">
- <button label="Mapa" name="show_on_map_btn" tool_tip="Pokaż Rezydenta na mapie"/>
- </layout_panel>
- <layout_panel name="teleport_btn_lp">
- <button label="Teleportuj" name="teleport" tool_tip="Teleportuj"/>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_notify_textbox.xml b/indra/newview/skins/default/xui/pl/panel_notify_textbox.xml
new file mode 100644
index 0000000000..e1668e1ef1
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_notify_textbox.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="instant_message" name="panel_notify_textbox">
+ <string name="message_max_lines_count" value="7"/>
+ <panel label="info_panel" name="info_panel">
+ <text_editor name="message" value="wiadomość"/>
+ </panel>
+ <panel label="control_panel" name="control_panel">
+ <button label="Wyślij" name="btn_submit"/>
+ <button label="Ignoruj" name="ignore_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_people.xml b/indra/newview/skins/default/xui/pl/panel_people.xml
index fcb6b19635..ef52e2148b 100644
--- a/indra/newview/skins/default/xui/pl/panel_people.xml
+++ b/indra/newview/skins/default/xui/pl/panel_people.xml
@@ -18,11 +18,13 @@ Chcesz spotkać ludzi? Spróbuj [secondlife:///app/worldmap Mapa Świata].
<string name="groups_filter_label" value="Filtruj grupy"/>
<string name="no_filtered_groups_msg" value="Nie znaleziono tego czego szukasz? Spróbuj [secondlife:///app/search/groups/[SEARCH_TERM] Szukaj]."/>
<string name="no_groups_msg" value="Chcesz dołączyć do grup? Spróbuj [secondlife:///app/search/groups Szukaj]."/>
+ <string name="MiniMapToolTipMsg" value="[REGION](Podwójne kliknięcie otwiera mapę, wciśnij Shift i przeciągnij aby przesunąć)"/>
+ <string name="AltMiniMapToolTipMsg" value="[REGION](Podwójne kliknięcie aktywuje teleport, wciśnij Shift i przeciągnij aby przesunąć)"/>
<filter_editor label="Filtr" name="filter_input"/>
<tab_container name="tabs">
<panel label="W POBLIŻU" name="nearby_panel">
<panel label="bottom_panel" name="bottom_panel">
- <button name="nearby_view_sort_btn" tool_tip="Opcje"/>
+ <menu_button name="nearby_view_sort_btn" tool_tip="Opcje"/>
<button name="add_friend_btn" tool_tip="Dodaj wybranego Rezydenta do znajomych"/>
</panel>
</panel>
@@ -34,27 +36,27 @@ Chcesz spotkać ludzi? Spróbuj [secondlife:///app/worldmap Mapa Świata].
<panel label="bottom_panel" name="bottom_panel">
<layout_stack name="bottom_panel">
<layout_panel name="options_gear_btn_panel">
- <button name="friends_viewsort_btn" tool_tip="Pokaż opcje dodatkowe"/>
+ <menu_button name="friends_viewsort_btn" tool_tip="Pokaż opcje dodatkowe"/>
</layout_panel>
<layout_panel name="add_btn_panel">
<button name="add_btn" tool_tip="Dodaj wybranego Rezydenta do znajomych"/>
</layout_panel>
<layout_panel name="trash_btn_panel">
- <dnd_button name="trash_btn" tool_tip="Usuń wybraną osobę ze swojej listy znajomych"/>
+ <dnd_button name="del_btn" tool_tip="Usuń zaznaczoną osobę ze swojej listy znajomych"/>
</layout_panel>
</layout_stack>
</panel>
</panel>
<panel label="GRUPY" name="groups_panel">
<panel label="bottom_panel" name="bottom_panel">
- <button name="groups_viewsort_btn" tool_tip="Opcje"/>
+ <menu_button name="groups_viewsort_btn" tool_tip="Opcje"/>
<button name="plus_btn" tool_tip="Dołącz do grupy/Stwórz nową grupę"/>
<button name="activate_btn" tool_tip="Aktywuj wybranÄ… grupÄ™"/>
</panel>
</panel>
<panel label="OSTATNIE" name="recent_panel">
<panel label="bottom_panel" name="bottom_panel">
- <button name="recent_viewsort_btn" tool_tip="Opcje"/>
+ <menu_button name="recent_viewsort_btn" tool_tip="Opcje"/>
<button name="add_friend_btn" tool_tip="Dodaj wybranego Rezydenta do znajomych"/>
</panel>
</panel>
@@ -64,16 +66,16 @@ Chcesz spotkać ludzi? Spróbuj [secondlife:///app/worldmap Mapa Świata].
<layout_panel name="view_profile_btn_lp">
<button label="Profil" name="view_profile_btn" tool_tip="Pokaż zdjęcie, grupy i inne informacje o Rezydencie"/>
</layout_panel>
- <layout_panel name="chat_btn_lp">
+ <layout_panel name="im_btn_lp">
<button label="IM" name="im_btn" tool_tip="Otwórz wiadomości IM"/>
</layout_panel>
- <layout_panel name="chat_btn_lp">
+ <layout_panel name="call_btn_lp">
<button label="Dzwoń" name="call_btn" tool_tip="Zadzwoń do tego Rezydenta"/>
</layout_panel>
- <layout_panel name="chat_btn_lp">
+ <layout_panel name="share_btn_lp">
<button label="Udostępnij" name="share_btn" tool_tip="Udostępnij obiekt z Szafy"/>
</layout_panel>
- <layout_panel name="chat_btn_lp">
+ <layout_panel name="teleport_btn_lp">
<button label="Teleportuj" name="teleport_btn" tool_tip="Zaproponuj teleport"/>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/pl/panel_places.xml b/indra/newview/skins/default/xui/pl/panel_places.xml
index e0a0cfd96a..d69d137d23 100644
--- a/indra/newview/skins/default/xui/pl/panel_places.xml
+++ b/indra/newview/skins/default/xui/pl/panel_places.xml
@@ -21,10 +21,10 @@
<button label="Edytuj" name="edit_btn" tool_tip="Edytuj informacje landmarka"/>
</layout_panel>
<layout_panel name="overflow_btn_lp">
- <button label="▼" name="overflow_btn" tool_tip="Pokaż opcje dodatkowe"/>
+ <menu_button label="▼" name="overflow_btn" tool_tip="Pokaż opcje dodatkowe"/>
</layout_panel>
</layout_stack>
- <layout_stack name="bottom_bar_ls3">
+ <layout_stack name="bottom_bar_profile_ls">
<layout_panel name="profile_btn_lp">
<button label="Profil" name="profile_btn" tool_tip="Pokaż profil miejsca"/>
</layout_panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/pl/panel_preferences_advanced.xml
index b267610d33..5e61f62691 100644
--- a/indra/newview/skins/default/xui/pl/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_advanced.xml
@@ -3,35 +3,16 @@
<panel.string name="aspect_ratio_text">
[NUM]:[DEN]
</panel.string>
- <panel.string name="middle_mouse">
- Åšrodkowy klawisz myszki
- </panel.string>
- <slider label="KÄ…t widoku" name="camera_fov"/>
- <slider label="Odległość" name="camera_offset_scale"/>
- <text name="heading2">
- Automatyczna pozycja dla:
- </text>
- <check_box label="Buduj/Edytuj" name="edit_camera_movement" tool_tip="Używaj automatycznego pozycjonowania kamery aktywując i deaktywując tryb edycji"/>
- <check_box label="Wygląd" name="appearance_camera_movement" tool_tip="Używaj automatycznego pozycjonowania kamery podczas trybu edycji"/>
- <check_box initial_value="prawda" label="Schowek" name="appearance_sidebar_positioning" tool_tip="Użyj automatycznego pozycjonowania kamery dla schowka"/>
- <check_box label="Pokaż w trybie widoku panoramicznego" name="first_person_avatar_visible"/>
- <check_box label="Aktywacja klawiszy strzałek do poruszania awatarem" name="arrow_keys_move_avatar_check"/>
- <check_box label="Kliknij-kliknij-przytrzymaj, aby uruchomić" name="tap_tap_hold_to_run"/>
- <check_box label="Poruszaj ustami awatara kiedy używana jest komunikacja głosowa" name="enable_lip_sync"/>
- <check_box label="Czat chmurkowy" name="bubble_text_chat"/>
- <slider label="Intensywność" name="bubble_chat_opacity"/>
- <color_swatch name="background" tool_tip="Wybierz kolor czatu w chmurce"/>
<text name="UI Size:">
- Rozmiar UI
+ rozmiar UI:
</text>
<check_box label="Pokaż błędy skryptu w:" name="show_script_errors"/>
<radio_group name="show_location">
<radio_item label="Czat Lokalny" name="0"/>
<radio_item label="Osobne okno:" name="1"/>
</radio_group>
- <check_box label="Włącz/Wyłącz głos:" name="push_to_talk_toggle_check" tool_tip="Jeżeli jesteś w trybie mówienia, w celu aktywacji lub deaktywacji swojego mikrofonu wybierz i wyłącz przycisk Mów tylko raz. Jeżeli nie jesteś w trybie mówienia, mikrofon przesyła Twój głos tylko w momencie aktywacji pełnej przycisku Mów."/>
- <line_editor label="Naciśnij Mów by rozpocząć komunikację głosową" name="modifier_combo"/>
- <button label="Wybierz klawisz" name="set_voice_hotkey_button"/>
- <button label="Środkowy przycisk myszki" name="set_voice_middlemouse_button" tool_tip="Zresetuj do środkowego przycisku myszy"/>
- <button label="Inne urzÄ…dzenia" name="joystick_setup_button"/>
+ <check_box label="Pozwól na wiele przeglądarek" name="allow_multiple_viewer_check"/>
+ <check_box label="Pokaż selekcję siatki przy logowaniu" name="show_grid_selection_check"/>
+ <check_box label="Pokaz menu Zaawansowane" name="show_advanced_menu_check"/>
+ <check_box label="Pokaz menu Rozwinięcie" name="show_develop_menu_check"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml b/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml
index 87894bb358..7fd1029e6a 100644
--- a/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml
@@ -8,44 +8,10 @@
<radio_item label="Åšrednia" name="radio2" value="1"/>
<radio_item label="Duża" name="radio3" value="2"/>
</radio_group>
- <text name="font_colors">
- Kolor czcionki:
- </text>
- <color_swatch label="Ty" name="user"/>
- <text name="text_box1">
- Ja
- </text>
- <color_swatch label="Inni" name="agent"/>
- <text name="text_box2">
- Inni
- </text>
- <color_swatch label="IM" name="im"/>
- <text name="text_box3">
- IM
- </text>
- <color_swatch label="System" name="system"/>
- <text name="text_box4">
- System
- </text>
- <color_swatch label="Błędy" name="script_error"/>
- <text name="text_box5">
- Błędy
- </text>
- <color_swatch label="Obiekty" name="objects"/>
- <text name="text_box6">
- Obiekty
- </text>
- <color_swatch label="Właściciel" name="owner"/>
- <text name="text_box7">
- Właściciel
- </text>
- <color_swatch label="Linki" name="links"/>
- <text name="text_box9">
- Linki
- </text>
<check_box initial_value="true" label="Używaj animacji podczas pisania" name="play_typing_animation"/>
<check_box label="Wysyłaj wszystkie wiadomości (IM) na moją skrzynkę pocztową kiedy jestem niedostępny" name="send_im_to_email"/>
<check_box label="Zwykły tekst IM i historia czatu" name="plain_text_chat_history"/>
+ <check_box label="Czat chmurkowy" name="bubble_text_chat"/>
<text name="show_ims_in_label">
Pokaż wiadomości (IM) w:
</text>
@@ -56,7 +22,17 @@
<radio_item label="Osobne okna" name="radio" value="0"/>
<radio_item label="Etykiety" name="radio2" value="1"/>
</radio_group>
- <check_box label="Używaj translatora podczas rozmowy (wspierany przez Google)" name="translate_chat_checkbox"/>
+ <text name="disable_toast_label">
+ Uaktywnij wyskakujące okienka rozpoczynających się rozmów:
+ </text>
+ <check_box label="Czat grupy" name="EnableGroupChatPopups" tool_tip="Zaznacz aby widzieć wyskakuące okienka kiedy czat grupy się pojawia"/>
+ <check_box label="Czat IM" name="EnableIMChatPopups" tool_tip="Zaznacz aby widzieć wyskakujące okienka kiedy IM się pojawia"/>
+ <spinner label="Czas widoczności czatu w pobliżu:" name="nearby_toasts_lifetime"/>
+ <spinner label="Czas znikania czatu w pobliżu:" name="nearby_toasts_fadingtime"/>
+ <check_box name="translate_chat_checkbox"/>
+ <text name="translate_chb_label">
+ Użyj translatora podczas rozmowy
+ </text>
<text name="translate_language_text">
Przetłumacz czat na:
</text>
@@ -75,7 +51,7 @@
<combo_box.item label="РуÑÑкий (Rosyjski)" name="Russian"/>
<combo_box.item label="Türkçe (Turecki)" name="Turkish"/>
<combo_box.item label="УкраїнÑька (UkraiÅ„ski)" name="Ukrainian"/>
- <combo_box.item label="中文 (简体) (Chiński)" name="Chinese"/>
+ <combo_box.item label="中文 (正體) (Chiński)" name="Chinese"/>
<combo_box.item label="日本語 (Japoński)" name="Japanese"/>
<combo_box.item label="한국어 (Koreański)" name="Korean"/>
</combo_box>
diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_colors.xml b/indra/newview/skins/default/xui/pl/panel_preferences_colors.xml
new file mode 100644
index 0000000000..3affda57bf
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_colors.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Kolory" name="colors_panel">
+ <text name="effects_color_textbox">
+ Moje efekty (opcje wyboru):
+ </text>
+ <color_swatch name="effect_color_swatch" tool_tip="Kliknij aby wybrać kolor"/>
+ <text name="font_colors">
+ Kolory czcionki czatu:
+ </text>
+ <text name="text_box1">
+ Ja
+ </text>
+ <text name="text_box2">
+ Inni
+ </text>
+ <text name="text_box3">
+ Obiekty
+ </text>
+ <text name="text_box4">
+ System
+ </text>
+ <text name="text_box5">
+ Błędy
+ </text>
+ <text name="text_box7">
+ Właściciel
+ </text>
+ <text name="text_box9">
+ URL
+ </text>
+ <text name="bubble_chat">
+ Kolor tła taga (dotyczy również czatu chmurkowego):
+ </text>
+ <color_swatch name="background" tool_tip="Wybierz kolor taga"/>
+ <slider label="Przeźroczystość:" name="bubble_chat_opacity" tool_tip="Wybierz przeźroczystość taga"/>
+ <text name="floater_opacity">
+ Floater Opacity:
+ </text>
+ <slider label="Aktywne:" name="active"/>
+ <slider label="Nieaktywne:" name="inactive"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_general.xml b/indra/newview/skins/default/xui/pl/panel_preferences_general.xml
index 00dc84dd7a..fff56eab6e 100644
--- a/indra/newview/skins/default/xui/pl/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_general.xml
@@ -11,7 +11,6 @@
<combo_box.item label="Español (Hiszpański) - Beta" name="Spanish"/>
<combo_box.item label="Français (Francuski) - Beta" name="French"/>
<combo_box.item label="Italiano (WÅ‚oski) - Beta" name="Italian"/>
- <combo_box.item label="Nederlands (Niderlandzki) - Beta" name="Dutch"/>
<combo_box.item label="Polski - Beta" name="Polish"/>
<combo_box.item label="Português (Portugalski) - Beta" name="Portugese"/>
<combo_box.item label="日本語 (Japoński) - Beta" name="(Japanese)"/>
@@ -48,13 +47,18 @@
<check_box label="Nazwy użytkowników" name="show_slids" tool_tip="Pokaż nazwy użytkowników, np. bobsmith123"/>
<check_box label="Wyświetl tytuł grupowy" name="show_all_title_checkbox1" tool_tip="Wyświetl tytuł grupowy np. oficer"/>
<check_box label="Zaznacz znajomych" name="show_friends" tool_tip="Zaznacz imiona swoich znajomych"/>
- <text name="effects_color_textbox">
- Kolor moich efektów:
+ <check_box label="Pokaż wyświetlane nazwy" name="display_names_check" tool_tip="Pokaż wyświetlane nazwy w czacie, IM, imionach, etc."/>
+ <check_box label="Uaktywnij wskazówki UI" name="viewer_hints_check"/>
+ <text name="inworld_typing_rg_label">
+ Wciśnięcie klawiszy liter:
</text>
+ <radio_group name="inworld_typing_preference">
+ <radio_item label="WÅ‚Ä…cza czat lokalny" name="radio_start_chat" value="1"/>
+ <radio_item label="Wpływ na ruch (WASD)" name="radio_move" value="0"/>
+ </radio_group>
<text name="title_afk_text">
Zasypiaj w czasie:
</text>
- <color_swatch label="" name="effect_color_swatch" tool_tip="Selekcja koloru"/>
<combo_box label="Czas Trybu Oddalenia:" name="afk">
<combo_box.item label="2 minuty" name="item0"/>
<combo_box.item label="5 minut" name="item1"/>
@@ -62,7 +66,6 @@
<combo_box.item label="30 minut" name="item3"/>
<combo_box.item label="nigdy" name="item4"/>
</combo_box>
- <check_box label="Pokaż wyświetlane nazwy" name="display_names_check" tool_tip="Pokaż wyświetlane nazwy w czacie, IM, imionach, etc."/>
<text name="text_box3">
Odpowiedź w trybie pracy:
</text>
diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/pl/panel_preferences_graphics1.xml
index 1a9f59bbff..f2beef091a 100644
--- a/indra/newview/skins/default/xui/pl/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_graphics1.xml
@@ -26,6 +26,7 @@
<text name="ShadersText">
Cieniowanie pixeli (shadery):
</text>
+ <check_box initial_value="prawda" label="Przeźroczystość wody" name="TransparentWater"/>
<check_box initial_value="true" label="Mapowanie wypukłości i połysk" name="BumpShiny"/>
<check_box initial_value="true" label="Podstawowe shadery" name="BasicShaders" tool_tip="Wyłączenie tej opcji może naprawić błędy niektórych sterowników graficznych."/>
<check_box initial_value="true" label="Shadery atmosfery" name="WindLightUseAtmosShaders"/>
@@ -39,6 +40,10 @@
<combo_box.item label="Awatary i obiekty" name="3"/>
<combo_box.item label="Wszystko" name="4"/>
</combo_box>
+ <slider label="Fizyka awatara:" name="AvatarPhysicsDetail"/>
+ <text name="AvatarPhysicsDetailText">
+ Niska
+ </text>
<slider label="Pole widzenia:" name="DrawDistance"/>
<text name="DrawDistanceMeterText2">
m
@@ -77,7 +82,7 @@
Mało
</text>
<text name="AvatarRenderingText">
- Rendering awatarów
+ Rendering awatara:
</text>
<check_box initial_value="true" label="Impostoryzacja awatarowa" name="AvatarImpostors"/>
<check_box initial_value="true" label="Rendering awatara przez GPU" name="AvatarVertexProgram"/>
diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_move.xml b/indra/newview/skins/default/xui/pl/panel_preferences_move.xml
new file mode 100644
index 0000000000..4c2df2c1f3
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_move.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Ruch" name="move_panel">
+ <slider label="KÄ…t widoku kamery" name="camera_fov"/>
+ <slider label="Dystans kamery" name="camera_offset_scale"/>
+ <text name="heading2">
+ Automatyczna pozycja dla:
+ </text>
+ <check_box label="Budowanie/Edycja" name="edit_camera_movement" tool_tip="Używaj automatycznego pozycjonowania kamery podczas włączania i wyłączania trybu edycji."/>
+ <check_box label="Wygląd" name="appearance_camera_movement" tool_tip="Używaj automatycznego pozycjonowania kamery podczas trybu edycji"/>
+ <check_box initial_value="prawda" label="Schowek" name="appearance_sidebar_positioning" tool_tip="Używaj automatycznego pozycjonowania kamery dla panelu bocznego"/>
+ <check_box label="Awatar widoczny w trybie panoramicznym" name="first_person_avatar_visible"/>
+ <text name=" Mouse Sensitivity">
+ Czułość myszki w widoku panoramicznym:
+ </text>
+ <check_box label="Zmień klawisze myszki" name="invert_mouse"/>
+ <check_box label="Przyciski ze strzałkami zawsze poruszają awatarem" name="arrow_keys_move_avatar_check"/>
+ <check_box label="Wciśnij-wciśnij-przytrzymaj aby biec" name="tap_tap_hold_to_run"/>
+ <check_box label="Podwójnie kliknij aby:" name="double_click_chkbox"/>
+ <radio_group name="double_click_action">
+ <radio_item label="teleportować się" name="radio_teleport"/>
+ <radio_item label="włączyć auto-pilota" name="radio_autopilot"/>
+ </radio_group>
+ <button label="Inne urzÄ…dzenia" name="joystick_setup_button"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/pl/panel_preferences_privacy.xml
index fd9cdd6ff0..5af2fed142 100644
--- a/indra/newview/skins/default/xui/pl/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_privacy.xml
@@ -7,19 +7,24 @@
<text name="cache_size_label_l">
(Miejsca, obrazy, przeglÄ…darka internetowa, wyszukiwarka historii)
</text>
+ <check_box label="Pokaż mój profil w wynikach wyszukiwarki" name="online_searchresults"/>
<check_box label="Mój status online jest dostępny tylko dla znajomych i grup do których należę" name="online_visibility"/>
- <check_box label="Możliwość wysyłania wiadomości prywatnej (IM) oraz rozmowy głosowej tylko dla znajomych i grup do których należę" name="voice_call_friends_only_check"/>
+ <check_box label="Możliwość wysyłania wiadomości prywatnej (IM) oraz rozmowy głosowej tylko dla &#10;znajomych i grup do których należę" name="voice_call_friends_only_check" top_pad="15"/>
<check_box label="Wyłącz mikrofon po zakończeniu rozmowy głosowej" name="auto_disengage_mic_check"/>
- <check_box label="Akceptuj ciasteczka" name="cookies_enabled"/>
+ <check_box label="Pokaż moje ulubione landmarki przy logowaniu (w rozwijanym menu &apos;Rozpocznij w&apos;)" name="favorites_on_login_check"/>
<text name="Logs:">
- Logi:
+ Logi rozmów:
</text>
<check_box label="Zapisz logi rozmów ogólnych na moim komputerze" name="log_nearby_chat"/>
<check_box label="Zapisuj logi wiadomości prywatnych (IM) na moim komputerze" name="log_instant_messages"/>
- <check_box label="Pokazuj czas" name="show_timestamps_check_im"/>
+ <check_box label="Dodaj znacznik czasu do każdej linii w logu rozmów." name="show_timestamps_check_im"/>
+ <check_box label="Dodaj znacznik czasu do nazwy pliku z zapisem rozmów." name="logfile_name_datestamp"/>
<text name="log_path_desc">
Lokalizacja zapisu:
</text>
<button label="PrzeglÄ…daj" label_selected="PrzeglÄ…daj" name="log_path_button"/>
<button label="Lista zablokowanych" name="block_list"/>
+ <text name="block_list_label">
+ (Ludzie i/lub obiekty zablokowane)
+ </text>
</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_setup.xml b/indra/newview/skins/default/xui/pl/panel_preferences_setup.xml
index 24e5c2b824..fa0a5981a8 100644
--- a/indra/newview/skins/default/xui/pl/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_setup.xml
@@ -1,13 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Ustawienia" name="Input panel">
- <text name="Mouselook:">
- Widok panoramiczny:
- </text>
- <text name=" Mouse Sensitivity">
- Czułość myszki
- </text>
- <slider name="mouse_sensitivity"/>
- <check_box label="Zmień klawisze myszki" name="invert_mouse"/>
<text name="Network:">
Sieć:
</text>
@@ -47,4 +39,11 @@
</text>
<line_editor name="web_proxy_editor" tool_tip="Nazwa lub IP proxy, którego chcesz użyć"/>
<spinner label="Numer portu:" name="web_proxy_port"/>
+ <text name="Software updates:">
+ Aktualizaje oprogramowania:
+ </text>
+ <combo_box name="updater_service_combobox">
+ <combo_box.item label="Zainstauj automatycznie" name="Install_automatically"/>
+ <combo_box.item label="Pobierz i zainstaluj aktualizacje ręcznie" name="Install_manual"/>
+ </combo_box>
</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_sound.xml b/indra/newview/skins/default/xui/pl/panel_preferences_sound.xml
index eaf9ae809b..46f5ebb8e2 100644
--- a/indra/newview/skins/default/xui/pl/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_sound.xml
@@ -1,12 +1,18 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Dźwięki" name="Preference Media panel">
+ <panel.string name="middle_mouse">
+ Åšrodkowy przycisk myszy
+ </panel.string>
<slider label="Główny" name="System Volume"/>
- <check_box initial_value="true" label="Wycisz podczas minimalizacji" name="mute_when_minimized"/>
+ <check_box initial_value="true" name="mute_when_minimized"/>
+ <text name="mute_chb_label">
+ Wycisz podczas minimalizacji
+ </text>
<slider label="Interfejs" name="UI Volume"/>
<slider label="Otoczenie" name="Wind Volume"/>
<slider label="Efekty dźwiękowe" name="SFX Volume"/>
<slider label="Muzyka strumieniowa" name="Music Volume"/>
- <check_box label="Odtwarzaj media audio" name="music_enabled"/>
+ <check_box label="Aktywny" name="enable_music"/>
<slider label="Media" name="Media Volume"/>
<check_box label="Odtwarzaj media" name="enable_media"/>
<slider label="Komunikacja głosowa" name="Voice Volume"/>
@@ -23,6 +29,11 @@
<radio_item label="pozycji kamery" name="0"/>
<radio_item label="pozycji awatara" name="1"/>
</radio_group>
+ <check_box label="Poruszaj ustami awatara podczas mówienia" name="enable_lip_sync"/>
+ <check_box label="Włącz/wyłącz mikrofon kiedy naciskam:" name="push_to_talk_toggle_check" tool_tip="Kiedy aktywny jest tryb przełączania wciśnij i zwolnij przełącznik RAZ aby włączyć lub wyłączyć mikrofon. Kiedy tryb przełączania nie jest aktywny mikrofon nadaje głos tylko kiedy przełącznik jest wciśnięty."/>
+ <line_editor label="Przełącznik kliknij-aby-mówić" name="modifier_combo"/>
+ <button label="Ustaw klawisz" name="set_voice_hotkey_button"/>
+ <button name="set_voice_middlemouse_button" tool_tip="Zresetuj do środkowego przycisku myszy"/>
<button label="Wejściowe/Wyjściowe urządzenia" name="device_settings_btn"/>
<panel label="Ustawienia sprzętowe" name="device_settings_panel">
<panel.string name="default_text">
diff --git a/indra/newview/skins/default/xui/pl/panel_profile.xml b/indra/newview/skins/default/xui/pl/panel_profile.xml
deleted file mode 100644
index f4a5699f8d..0000000000
--- a/indra/newview/skins/default/xui/pl/panel_profile.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Profil" name="panel_profile">
- <string name="no_partner_text" value="Brak"/>
- <string name="no_group_text" value="Żadne"/>
- <string name="RegisterDateFormat">
- [REG_DATE] ([AGE])
- </string>
- <layout_stack name="layout">
- <layout_panel name="profile_stack">
- <scroll_container name="profile_scroll">
- <panel name="profile_scroll_panel">
- <panel name="second_life_image_panel">
- <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/>
- </panel>
- <panel name="first_life_image_panel">
- <text name="title_rw_descr_text" value="Życie#1:"/>
- </panel>
- <text name="title_member_text" value="Urodziny:"/>
- <text name="title_acc_status_text" value="Konto:"/>
- <text name="title_partner_text" value="Partner:"/>
- <panel name="partner_data_panel">
- <name_box initial_value="(przetwarzanie)" name="partner_text"/>
- </panel>
- <text name="title_groups_text" value="Grupy:"/>
- </panel>
- </scroll_container>
- </layout_panel>
- </layout_stack>
- <layout_stack name="layout_verb_buttons">
- <layout_panel name="profile_buttons_panel">
- <layout_stack name="bottom_bar_ls">
- <layout_panel name="add_friend_btn_lp">
- <button label="Poznaj" name="add_friend" tool_tip="Zaproponuj znajomość Rezydentowi"/>
- </layout_panel>
- <layout_panel name="im_btn_lp">
- <button label="IM" name="im" tool_tip="Otwórz wiadomości IM"/>
- </layout_panel>
- <layout_panel name="call_btn_lp">
- <button label="Dzwoń" name="call" tool_tip="Zadzwoń do tego Rezydenta"/>
- </layout_panel>
- <layout_panel name="chat_btn_lp">
- <button label="Teleportuj" name="teleport" tool_tip="Teleportuj"/>
- </layout_panel>
- <layout_panel name="overflow_btn_lp">
- <button label="▼" name="overflow_btn" tool_tip="Zapłać lub udostępnij obiekt Rezydentowi"/>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- <layout_panel name="profile_me_buttons_panel">
- <button label="Edytuj profil" name="edit_profile_btn" tool_tip="Edytuj informacje o sobie"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_profile_view.xml b/indra/newview/skins/default/xui/pl/panel_profile_view.xml
deleted file mode 100644
index 3590e9222e..0000000000
--- a/indra/newview/skins/default/xui/pl/panel_profile_view.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_target_profile">
- <string name="status_online">
- Obecnie w SL
- </string>
- <string name="status_offline">
- Nieaktywny
- </string>
- <text name="display_name_label" value="Wyświetlana nazwa:"/>
- <text name="solo_username_label" value="Nazwa użytkownika:"/>
- <text name="status" value="Obecnie w SL"/>
- <text name="user_name_small" value="Jack oh look at me this is a super duper long name"/>
- <text name="user_name" value="Jack Linden"/>
- <button name="copy_to_clipboard" tool_tip="Kopiuj do schowka"/>
- <text name="user_label" value="Nazwa użytkownika:"/>
- <text name="user_slid" value="jack.linden"/>
- <tab_container name="tabs">
- <panel label="PROFIL" name="panel_profile"/>
- <panel label="ULUBIONE" name="panel_picks"/>
- <panel label="NOTATKI &amp; PRYWATNOŚĆ" name="panel_notes"/>
- </tab_container>
-</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_script_ed.xml b/indra/newview/skins/default/xui/pl/panel_script_ed.xml
index fa89a3f727..b05223aa0f 100644
--- a/indra/newview/skins/default/xui/pl/panel_script_ed.xml
+++ b/indra/newview/skins/default/xui/pl/panel_script_ed.xml
@@ -15,11 +15,9 @@
<panel.string name="Title">
Skrypt: [NAME]
</panel.string>
- <text_editor name="Script Editor">
- Åadowanie...
- </text_editor>
- <button label="Zapisz" label_selected="Zapisz" name="Save_btn"/>
- <combo_box label="Wklej..." name="Insert..."/>
+ <panel.string name="external_editor_not_set">
+ Wybierz edytor poprzez ustawienie zmiennej środowiska LL_SCRIPT_EDITOR lub ustawienie ExternalEditor.
+ </panel.string>
<menu_bar name="script_menu">
<menu label="Plik" name="File">
<menu_item_call label="Zapisz" name="Save"/>
@@ -40,4 +38,10 @@
<menu_item_call label="Pomoc..." name="Keyword Help..."/>
</menu>
</menu_bar>
+ <text_editor name="Script Editor">
+ Åadowanie...
+ </text_editor>
+ <combo_box label="Wklej..." name="Insert..."/>
+ <button label="Zapisz" label_selected="Zapisz" name="Save_btn"/>
+ <button label="Edytuj..." name="Edit_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_scrolling_param_base.xml b/indra/newview/skins/default/xui/pl/panel_scrolling_param_base.xml
new file mode 100644
index 0000000000..fa659040ea
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_scrolling_param_base.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="LLScrollingPanelParamBase">
+ <slider label="[DESC]" name="param slider"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_status_bar.xml b/indra/newview/skins/default/xui/pl/panel_status_bar.xml
index 5e97dd8961..6aa0d27bb8 100644
--- a/indra/newview/skins/default/xui/pl/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/pl/panel_status_bar.xml
@@ -22,7 +22,7 @@
L$ [AMT]
</panel.string>
<panel name="balance_bg">
- <text name="balance" tool_tip="Mój bilans" value="L$20"/>
+ <text name="balance" tool_tip="Kliknij aby odświeżyć bilans L$" value="L$20"/>
<button label="Kup L$" name="buyL" tool_tip="Kliknij aby kupić więcej L$"/>
</panel>
<text name="TimeText" tool_tip="Obecny czas (Pacyficzny)">
diff --git a/indra/newview/skins/default/xui/pl/sidepanel_item_info.xml b/indra/newview/skins/default/xui/pl/sidepanel_item_info.xml
index 0c285e6546..9ec3c480b7 100644
--- a/indra/newview/skins/default/xui/pl/sidepanel_item_info.xml
+++ b/indra/newview/skins/default/xui/pl/sidepanel_item_info.xml
@@ -46,7 +46,7 @@
</text>
<check_box label="Modyfikuje" name="CheckOwnerModify"/>
<check_box label="Kopiuje" name="CheckOwnerCopy"/>
- <check_box label="Oddaje/Sprzedaje" name="CheckOwnerTransfer"/>
+ <check_box label="Oddaje/&#10;Sprzedaje" name="CheckOwnerTransfer"/>
<text name="AnyoneLabel">
Każdy:
</text>
@@ -60,7 +60,7 @@
</text>
<check_box label="Modyfikuje" name="CheckNextOwnerModify"/>
<check_box label="Kopiuje" name="CheckNextOwnerCopy"/>
- <check_box label="Sprzedaje/Oddaje" name="CheckNextOwnerTransfer" tool_tip="Następny właściciel może oddawać lub sprzedawać ten obiekt"/>
+ <check_box label="Sprzedaje/&#10;Oddaje" name="CheckNextOwnerTransfer" tool_tip="Następny właściciel może oddawać lub sprzedawać ten obiekt"/>
</panel>
<check_box label="Na sprzedaż" name="CheckPurchase"/>
<combo_box name="combobox sale copy">
diff --git a/indra/newview/skins/default/xui/pl/sidepanel_task_info.xml b/indra/newview/skins/default/xui/pl/sidepanel_task_info.xml
index d8cf456c64..eb8c9cdbbb 100644
--- a/indra/newview/skins/default/xui/pl/sidepanel_task_info.xml
+++ b/indra/newview/skins/default/xui/pl/sidepanel_task_info.xml
@@ -48,15 +48,9 @@
<text name="CreatorNameLabel">
Twórca:
</text>
- <text name="Creator Name">
- Erica Linden
- </text>
<text name="Owner:">
Właściciel:
</text>
- <text name="Owner Name">
- Erica Linden
- </text>
<text name="Group_label">
Grupa:
</text>
diff --git a/indra/newview/skins/default/xui/pl/strings.xml b/indra/newview/skins/default/xui/pl/strings.xml
index ea8bdd75b9..f6dec8536b 100644
--- a/indra/newview/skins/default/xui/pl/strings.xml
+++ b/indra/newview/skins/default/xui/pl/strings.xml
@@ -423,6 +423,9 @@
<string name="symbolic folder link">
link folderu
</string>
+ <string name="AvatarEditingAppearance">
+ (Edycja WyglÄ…d)
+ </string>
<string name="AvatarAway">
Åšpi
</string>
@@ -852,6 +855,9 @@
<string name="tattoo">
Tatuaż
</string>
+ <string name="physics">
+ Fizyka
+ </string>
<string name="invalid">
niewłaściwa funkcja
</string>
@@ -891,6 +897,9 @@
<string name="tattoo_not_worn">
Tatuaż nie jest założony
</string>
+ <string name="physics_not_worn">
+ Fizyka niezałożona
+ </string>
<string name="invalid_not_worn">
nieważny
</string>
@@ -939,6 +948,9 @@
<string name="create_new_tattoo">
Nowy tatuaż
</string>
+ <string name="create_new_physics">
+ Stwórz nową fizykę
+ </string>
<string name="create_new_invalid">
nieważny
</string>
@@ -1037,7 +1049,7 @@
</string>
<string name="WornOnAttachmentPoint" value=" (założony na [ATTACHMENT_POINT])"/>
<string name="ActiveGesture" value="[GESLABEL] (aktywne)"/>
- <string name="Chat" value=" Czat :"/>
+ <string name="Chat Message" value="Czat:"/>
<string name="Sound" value=" Dźwięk :"/>
<string name="Wait" value=" --- Zaczekaj :"/>
<string name="AnimFlagStop" value=" Zatrzymaj animacjÄ™ :"/>
@@ -1063,9 +1075,6 @@
<string name="InvFolder My Inventory">
Moja Szafa
</string>
- <string name="InvFolder My Favorites">
- Moje ulubione
- </string>
<string name="InvFolder Library">
Biblioteka
</string>
@@ -1124,10 +1133,10 @@
Gesturki
</string>
<string name="InvFolder Favorite">
- Ulubione
+ Moje ulubione
</string>
<string name="InvFolder favorite">
- Ulubione
+ Moje ulubione
</string>
<string name="InvFolder Current Outfit">
Obecny strój
@@ -1455,7 +1464,7 @@
(nieznane)
</string>
<string name="SummaryForTheWeek" value="Podsumowanie dla tego tygodnia, poczÄ…wszy od "/>
- <string name="NextStipendDay" value="Następna wypłata będzie w "/>
+ <string name="NextStipendDay" value=". Następna wypłata będzie w "/>
<string name="GroupIndividualShare" value=" Groupa Udziały Indywidualne"/>
<string name="GroupColumn" value="Grupa"/>
<string name="Balance">
@@ -1689,7 +1698,7 @@
<string name="RegionNoCovenantOtherOwner">
Brak umowy dla tego majątku. Każda posiadłość w tym majątku została sprzedana przez właściciela majątku nie Linden Lab. Skontaktuj się z właścicielem majątku w celu uzuskania szczegółów sprzedaży.
</string>
- <string name="covenant_last_modified" value="Ostatnio modyfikowano:"/>
+ <string name="covenant_last_modified" value="Ostatnio modyfikowano: "/>
<string name="none_text" value=" (żadne) "/>
<string name="never_text" value=" (nigdy) "/>
<string name="GroupOwned">
@@ -1737,11 +1746,8 @@
<string name="InvOfferGaveYou">
oddany Tobie
</string>
- <string name="InvOfferYouDecline">
- Odrzucony przez Ciebie
- </string>
- <string name="InvOfferFrom">
- od
+ <string name="InvOfferDecline">
+ Odrzucono [DESC] od &lt;nolink&gt;[NAME]&lt;/nolink&gt;.
</string>
<string name="GroupMoneyTotal">
Suma
@@ -1822,12 +1828,6 @@ Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
<string name="accel-win-shift">
Shift+
</string>
- <string name="Esc">
- Esc
- </string>
- <string name="Home">
- Miejsce Startu
- </string>
<string name="FileSaved">
Zapisane pliki
</string>
@@ -1846,34 +1846,34 @@ Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
<string name="PDT">
PDT
</string>
- <string name="Forward">
+ <string name="Direction_Forward">
Do przodu
</string>
- <string name="Left">
- W lewo
+ <string name="Direction_Left">
+ Lewo
</string>
- <string name="Right">
- W prawo
+ <string name="Direction_Right">
+ Prawo
</string>
- <string name="Back">
- Wróć
+ <string name="Direction_Back">
+ Wstecz
</string>
- <string name="North">
+ <string name="Direction_North">
Północ
</string>
- <string name="South">
+ <string name="Direction_South">
Południe
</string>
- <string name="West">
+ <string name="Direction_West">
Zachód
</string>
- <string name="East">
+ <string name="Direction_East">
Wschód
</string>
- <string name="Up">
+ <string name="Direction_Up">
W górę
</string>
- <string name="Down">
+ <string name="Direction_Down">
W dół
</string>
<string name="Any Category">
@@ -1945,6 +1945,9 @@ Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
<string name="Other">
Inna
</string>
+ <string name="Rental">
+ Wynajem
+ </string>
<string name="Any">
Jakiekolwiek
</string>
@@ -2181,6 +2184,114 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
<string name="Bulbous Nose">
Bulwiasty nos
</string>
+ <string name="Breast Physics Mass">
+ Masa piersi
+ </string>
+ <string name="Breast Physics Smoothing">
+ Wygładzanie piersi
+ </string>
+ <string name="Breast Physics Gravity">
+ Grawitacja piersi
+ </string>
+ <string name="Breast Physics Drag">
+ Ściśnięcie piersi
+ </string>
+ <string name="Breast Physics InOut Max Effect">
+ Efekt max
+ </string>
+ <string name="Breast Physics InOut Spring">
+ Sprężystość
+ </string>
+ <string name="Breast Physics InOut Gain">
+ Wzmocnienie
+ </string>
+ <string name="Breast Physics InOut Damping">
+ TÅ‚umienie
+ </string>
+ <string name="Breast Physics UpDown Max Effect">
+ Efekt max
+ </string>
+ <string name="Breast Physics UpDown Spring">
+ Sprężystość
+ </string>
+ <string name="Breast Physics UpDown Gain">
+ Wzmocnienie
+ </string>
+ <string name="Breast Physics UpDown Damping">
+ TÅ‚umienie
+ </string>
+ <string name="Breast Physics LeftRight Max Effect">
+ Efekt max
+ </string>
+ <string name="Breast Physics LeftRight Spring">
+ Sprężystość
+ </string>
+ <string name="Breast Physics LeftRight Gain">
+ Wzmocnienie
+ </string>
+ <string name="Breast Physics LeftRight Damping">
+ TÅ‚umienie
+ </string>
+ <string name="Belly Physics Mass">
+ Masa brzucha
+ </string>
+ <string name="Belly Physics Smoothing">
+ Wygładzanie brzucha
+ </string>
+ <string name="Belly Physics Gravity">
+ Grawitacja brzucha
+ </string>
+ <string name="Belly Physics Drag">
+ Ściśnięcie brzucha
+ </string>
+ <string name="Belly Physics UpDown Max Effect">
+ Efekt max
+ </string>
+ <string name="Belly Physics UpDown Spring">
+ Sprężystość
+ </string>
+ <string name="Belly Physics UpDown Gain">
+ Wzmocnienie
+ </string>
+ <string name="Belly Physics UpDown Damping">
+ TÅ‚umienie
+ </string>
+ <string name="Butt Physics Mass">
+ Masa pośladków
+ </string>
+ <string name="Butt Physics Smoothing">
+ Wygładzanie pośladków
+ </string>
+ <string name="Butt Physics Gravity">
+ Grawitacja pośladków
+ </string>
+ <string name="Butt Physics Drag">
+ Ściśnięcie pośladków
+ </string>
+ <string name="Butt Physics UpDown Max Effect">
+ Efekt max
+ </string>
+ <string name="Butt Physics UpDown Spring">
+ Sprężystość
+ </string>
+ <string name="Butt Physics UpDown Gain">
+ Wzmocnienie
+ </string>
+ <string name="Butt Physics UpDown Damping">
+ TÅ‚umienie
+ </string>
+ <string name="Butt Physics LeftRight Max Effect">
+ Efekt max
+ </string>
+ <string name="Butt Physics LeftRight Spring">
+ Sprężystość
+ </string>
+ <string name="Butt Physics LeftRight Gain">
+ Wzmocnienie
+ </string>
+ <string name="Butt Physics LeftRight Damping">
+ TÅ‚umienie
+ </string>
<string name="Bushy Eyebrows">
Bujne brwi
</string>
@@ -2190,6 +2301,9 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
<string name="Butt Size">
Rozmiar pośladków
</string>
+ <string name="Butt Gravity">
+ Grawitacja pośladków
+ </string>
<string name="bustle skirt">
Bustle Skirt
</string>
@@ -3665,6 +3779,9 @@ Raport o Nadużyciu
<string name="New Tattoo">
Nowy tatuaż
</string>
+ <string name="New Physics">
+ Nowa fizyka
+ </string>
<string name="Invalid Wearable">
Nieaktualne ubranie/część ciała
</string>
@@ -3864,7 +3981,7 @@ Raport o Nadużyciu
<string name="Notices">
Ogłoszenia
</string>
- <string name="Chat">
+ <string name="Chat" value=" Czat :">
Czat
</string>
<string name="DeleteItems">
@@ -3876,4 +3993,348 @@ Raport o Nadużyciu
<string name="EmptyOutfitText">
W tym stroju nie ma elementów
</string>
+ <string name="ExternalEditorNotSet">
+ Wybierz edytor używając ustawień ExternalEditor.
+ </string>
+ <string name="ExternalEditorNotFound">
+ Nie odnaleziono zewnętrzego edytora wskazanego przez Ciebie.
+Spróbuj załączyć ścieżkę do edytora w cytowaniu.
+(np. &quot;/ścieżka do mojego/edytora&quot; &quot;%s&quot;)
+ </string>
+ <string name="ExternalEditorCommandParseError">
+ Błąd w składni komendy zewnętrznego edytora.
+ </string>
+ <string name="ExternalEditorFailedToRun">
+ Uruchomienie zewnętrznego edytora nie powiodło się.
+ </string>
+ <string name="Esc">
+ Esc
+ </string>
+ <string name="Space">
+ Space
+ </string>
+ <string name="Enter">
+ Enter
+ </string>
+ <string name="Tab">
+ Tab
+ </string>
+ <string name="Ins">
+ Ins
+ </string>
+ <string name="Del">
+ Del
+ </string>
+ <string name="Backsp">
+ Backsp
+ </string>
+ <string name="Shift">
+ Shift
+ </string>
+ <string name="Ctrl">
+ Ctrl
+ </string>
+ <string name="Alt">
+ Alt
+ </string>
+ <string name="CapsLock">
+ CapsLock
+ </string>
+ <string name="Home">
+ Miejsce Startu
+ </string>
+ <string name="End">
+ End
+ </string>
+ <string name="PgUp">
+ PgUp
+ </string>
+ <string name="PgDn">
+ PgDn
+ </string>
+ <string name="F1">
+ F1
+ </string>
+ <string name="F2">
+ F2
+ </string>
+ <string name="F3">
+ F3
+ </string>
+ <string name="F4">
+ F4
+ </string>
+ <string name="F5">
+ F5
+ </string>
+ <string name="F6">
+ F6
+ </string>
+ <string name="F7">
+ F7
+ </string>
+ <string name="F8">
+ F8
+ </string>
+ <string name="F9">
+ F9
+ </string>
+ <string name="F10">
+ F10
+ </string>
+ <string name="F11">
+ F11
+ </string>
+ <string name="F12">
+ F12
+ </string>
+ <string name="Add">
+ Dodaj
+ </string>
+ <string name="Subtract">
+ Odejmij
+ </string>
+ <string name="Multiply">
+ Mnożenie
+ </string>
+ <string name="Divide">
+ Podziel
+ </string>
+ <string name="PAD_DIVIDE">
+ PAD_DIVIDE
+ </string>
+ <string name="PAD_LEFT">
+ PAD_LEFT
+ </string>
+ <string name="PAD_RIGHT">
+ PAD_RIGHT
+ </string>
+ <string name="PAD_DOWN">
+ PAD_DOWN
+ </string>
+ <string name="PAD_UP">
+ PAD_UP
+ </string>
+ <string name="PAD_HOME">
+ PAD_HOME
+ </string>
+ <string name="PAD_END">
+ PAD_END
+ </string>
+ <string name="PAD_PGUP">
+ PAD_PGUP
+ </string>
+ <string name="PAD_PGDN">
+ PAD_PGDN
+ </string>
+ <string name="PAD_CENTER">
+ PAD_CENTER
+ </string>
+ <string name="PAD_INS">
+ PAD_INS
+ </string>
+ <string name="PAD_DEL">
+ PAD_DEL
+ </string>
+ <string name="PAD_Enter">
+ PAD_Enter
+ </string>
+ <string name="PAD_BUTTON0">
+ PAD_BUTTON0
+ </string>
+ <string name="PAD_BUTTON1">
+ PAD_BUTTON1
+ </string>
+ <string name="PAD_BUTTON2">
+ PAD_BUTTON2
+ </string>
+ <string name="PAD_BUTTON3">
+ PAD_BUTTON3
+ </string>
+ <string name="PAD_BUTTON4">
+ PAD_BUTTON4
+ </string>
+ <string name="PAD_BUTTON5">
+ PAD_BUTTON5
+ </string>
+ <string name="PAD_BUTTON6">
+ PAD_BUTTON6
+ </string>
+ <string name="PAD_BUTTON7">
+ PAD_BUTTON7
+ </string>
+ <string name="PAD_BUTTON8">
+ PAD_BUTTON8
+ </string>
+ <string name="PAD_BUTTON9">
+ PAD_BUTTON9
+ </string>
+ <string name="PAD_BUTTON10">
+ PAD_BUTTON10
+ </string>
+ <string name="PAD_BUTTON11">
+ PAD_BUTTON11
+ </string>
+ <string name="PAD_BUTTON12">
+ PAD_BUTTON12
+ </string>
+ <string name="PAD_BUTTON13">
+ PAD_BUTTON13
+ </string>
+ <string name="PAD_BUTTON14">
+ PAD_BUTTON14
+ </string>
+ <string name="PAD_BUTTON15">
+ PAD_BUTTON15
+ </string>
+ <string name="-">
+ -
+ </string>
+ <string name="=">
+ =
+ </string>
+ <string name="`">
+ `
+ </string>
+ <string name=";">
+ ;
+ </string>
+ <string name="[">
+ [
+ </string>
+ <string name="]">
+ ]
+ </string>
+ <string name="\">
+ \
+ </string>
+ <string name="0">
+ 0
+ </string>
+ <string name="1">
+ 1
+ </string>
+ <string name="2">
+ 2
+ </string>
+ <string name="3">
+ 3
+ </string>
+ <string name="4">
+ 4
+ </string>
+ <string name="5">
+ 5
+ </string>
+ <string name="6">
+ 6
+ </string>
+ <string name="7">
+ 7
+ </string>
+ <string name="8">
+ 8
+ </string>
+ <string name="9">
+ 9
+ </string>
+ <string name="A">
+ A
+ </string>
+ <string name="B">
+ B
+ </string>
+ <string name="C">
+ C
+ </string>
+ <string name="D">
+ D
+ </string>
+ <string name="E">
+ E
+ </string>
+ <string name="F">
+ F
+ </string>
+ <string name="G">
+ G
+ </string>
+ <string name="H">
+ H
+ </string>
+ <string name="I">
+ I
+ </string>
+ <string name="J">
+ J
+ </string>
+ <string name="K">
+ K
+ </string>
+ <string name="L">
+ L
+ </string>
+ <string name="M">
+ M
+ </string>
+ <string name="N">
+ N
+ </string>
+ <string name="O">
+ O
+ </string>
+ <string name="P">
+ P
+ </string>
+ <string name="Q">
+ Q
+ </string>
+ <string name="R">
+ R
+ </string>
+ <string name="S">
+ S
+ </string>
+ <string name="T">
+ T
+ </string>
+ <string name="U">
+ U
+ </string>
+ <string name="V">
+ V
+ </string>
+ <string name="W">
+ W
+ </string>
+ <string name="X">
+ X
+ </string>
+ <string name="Y">
+ Y
+ </string>
+ <string name="Z">
+ Z
+ </string>
+ <string name="BeaconParticle">
+ Podgląd lokalizatorów cząsteczek (niebieski)
+ </string>
+ <string name="BeaconPhysical">
+ Podgląd lokalizatorów fizycznych obiektów (zielony)
+ </string>
+ <string name="BeaconScripted">
+ Podgląd lokalizatorów obiektów skryptowanych (czerwony)
+ </string>
+ <string name="BeaconScriptedTouch">
+ Podgląd lokalizatorów obiektów skryptowanych z opcją dotyku (czerwony)
+ </string>
+ <string name="BeaconSound">
+ Podgląd lokalizatorów dźwięków (żółty)
+ </string>
+ <string name="BeaconMedia">
+ Podgląd lokalizatorów mediów (biały)
+ </string>
+ <string name="ParticleHiding">
+ Ukryj czÄ…steczki
+ </string>
</strings>
diff --git a/indra/newview/skins/default/xui/pl/teleport_strings.xml b/indra/newview/skins/default/xui/pl/teleport_strings.xml
index 57fb55bf4c..0366c3fdbc 100644
--- a/indra/newview/skins/default/xui/pl/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/pl/teleport_strings.xml
@@ -19,6 +19,10 @@ Jeśli nadal nie możesz się teleportować wyloguj się i ponownie zaloguj.
<message name="timeout_tport">
Przepraszamy, ale nie udało się przeprowadzić teleportacji. Spróbuj jeszcze raz.
</message>
+ <message name="NoHelpIslandTP">
+ Brak możliwości ponownej teleportacji do Welcome Island.
+Odwiedź &apos;Welcome Island Public&apos; by powtórzyć szkolenie.
+ </message>
<message name="noaccess_tport">
Przepraszamy, ale nie masz dostępu do miejsca docelowego.
</message>
diff --git a/indra/newview/skins/default/xui/pt/floater_about.xml b/indra/newview/skins/default/xui/pt/floater_about.xml
index ac365f1702..e843e56090 100644
--- a/indra/newview/skins/default/xui/pt/floater_about.xml
+++ b/indra/newview/skins/default/xui/pt/floater_about.xml
@@ -9,7 +9,7 @@
<floater.string name="AboutPosition">
Você está em [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] em [REGION] localizado em [HOSTNAME]&lt;/nolink&gt;([HOSTIP])
[SERVER_VERSION]
-[[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]]
+[SERVER_RELEASE_NOTES_URL]
</floater.string>
<floater.string name="AboutSystem">
CPU: [CPU]
@@ -36,45 +36,64 @@ Versão do servidor de voz: [VOICE_VERSION]
<floater.string name="AboutTraffic">
Packets Lost: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
</floater.string>
+ <floater.string name="ErrorFetchingServerReleaseNotesURL">
+ Erro ao obter URL de notas de versão do servidor.
+ </floater.string>
<tab_container name="about_tab">
<panel label="Info" name="support_panel">
<button label="Copiar" name="copy_btn"/>
</panel>
<panel label="Créditos" name="credits_panel">
- <text_editor name="credits_editor">
- O Second Life é o resultado do trabalho de Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les e muitos mais.
-
-Agradecemos também aos seguintes residentes por sua colaboração na mais nova versão do Second Life: Drew Dwi, Zai Lynch, Latif Khalifa, Ellla McMahon, Harleen Gretzky, Squirrel Wood, Malarthi Behemoth, Dante Tucker, Buckaroo Mu, Eddi Decosta, Dirk, Talamasca, Torben Trautman, Irene Muni, Aralara Rajal, Aura Dirval, Cayu Cluny, Eva Rau, FreeSL Aeon, Frontera Thor, Inma Rau, Lunita Savira, Minerva Memel, Polo Gufler, Xiki Luik, Lilly Zenovka, Vick Forcella, Sasy Scarborough, Gentle Welinder, Elric Anatine, Techwolf Lupindo, Dusan Writer, WolfPup Lowenhar, Marianne McCann, Fiachra Lach, Sitearm Madonna, Sudane Erato, Sahkolihaa Contepomi, Sachi Vixen, Questar Utu, Dimitrio Lewis, Matto Destiny, Scrim Pinion, Radio Signals, Psi Merlin, Pixel Gausman, Mel Vanbeeck, Laurent Bechir, Lamorna Proctor, Lares Carter, Gwyneth Llewelyn, Hydra Shaftoe, Holger Gilruth, Gentle Heron, Carla Broek, Boroondas Gupte, Fury Rosewood, Flower Ducatillon, Colpo Wexler, gwampa Lomu, Borg Capalini, Beansy Twine, Ardy Lay, , 45ms Zhong, Adeon Writer, Aeonix Aeon, Ai Austin, Aiko Ying, Alexandrea Fride, Alliez Mysterio, Annie Milestone, Annika Genezzia, Ansariel Hiller, ArminasX Saiman, Arya Braveheart, Asaeda Meltingdots, Asturkon Jua, Avallyn Oakleaf, Avatar Quinzet, BabyA Littlething, Bacchus Ireto, Bazaar, Riva, Benjamin Bigdipper, Beth Walcher, Bezilon Kasei, Biancaluce Robbiani, Bill Walach, blakopal Galicia, Blitzckreed Levenque, Bryn Oh, Callipygian Christensen, Cap Carver, Carr Arbenlow, Chantal Harvey, Charles Courtois, Charlie Sazaland, Cherry Cheevers, ChickyBabes Zuzu, Christopher Organiser, Ciaran Laval, Clara Young, Celierra Darling, Corinne Helendale, Corro Moseley, Coughdrop Littlething, Darien Caldwell, Dartagan Shepherd, Debs Regent, Decro Schmooz, Denim Kamachi, DiJodi Dubratt, Dil Spitz, Edgware Marker, Egehan Dryke, Emma Portilo, Emmie Fairymeadow, Evangelista Emerald, Faelon Swordthain, Frenchimmo Sabra, Gaberoonie Zanzibar, Ganymedes Costagravas, Gene Frostbite, GeneJ Composer, Giggles Littlebird, Grady Echegaray, Guni Greenstein, Gypsy Tripsa, Hackshaven Harford, Ham Rambler, Han Shuffle, Hanglow Short, Hatzfeld Runo, herina Bode, Horatio Freund, Hypatia Callisto, Hypatia Pickens, Identity Euler, Imnotgoing Sideways, Innula Zenovka, Iyoba Tarantal, Jack Abraham, Jagga Meredith, Jennifer Boyle, Jeremy Marquez, Jessica Qin, Jinx Nordberg, Jo Bernandes, Jocial Sonnenkern, Joel Savard, Jondan Lundquist, Josef Munster, Josette Windlow, Juilan Tripsa, Juro Kothari, Justin RiversRunRed, Kagehi Kohn, Kaimen Takahe, Keklily Longfall, Ken Lavender, Kestral Karas, Khisme Nitely, Kimar Coba, Kithrak Kirkorian, Kitty Barnett, Kolor Fall, Komiko Okamoto, Korvel Noh, Larry Pixel, Leal Choche, len Starship, Lenae Munz, Lexi Frua, Lillie Cordeaux, Lizzy Macarthur, LSL Scientist, Luban Yiyuan, Luc Starsider, Maccus McCullough, Madison Blanc, Maggie Darwin, Mallory Destiny, Manx Wharton, Marc Claridge, Marc2 Sands, Matthew Anthony, Maxim RiversRunRed, Medhue Simoni, Melinda Latynina, Mencius Watts, Michi Lumin, Midian Farspire, Miles Glaz, Mindy Mathy, Mitch Wagner, Mo Hax, Mourna Biziou, Nao Noe, naofan Teardrop, Naomah Beaumont, Nathiel Siamendes, Nber Medici, Neko Link, Netpat Igaly, Neutron Chesnokov, Newfie Pendragon, Nicholai Laviscu, Nick Rhodes, Nicoladie Gymnast, Ollie Kubrick, Orenj Marat, Orion Delphis, Oryx Tempel, Parvati Silverweb, PeterPunk Mooney, Pixel Scientist, Pounce Teazle, Professor Noarlunga, Quantum Destiny, Quicksilver Hermes, Ralf Setsuko, RAT Quan, RedMokum Bravin, Revolution Perenti, Rezit Sideways, Rich Grainger, Rosco Teardrop, Rose Evans, Rudee Voom, RufusTT Horsefly, Saii Hallard, SaintLEOlions Zimer, Samm Larkham, Satanello Miami, SexySteven Morrisey, Sheet Spotter, Shnurui Troughton, sicarius Thorne, Sicarius Toxx, Sini Nubalo, SLB Wirefly, snowy Sidran, Soupa Segura, ST Mensing, Starshine Halasy, Stickman Ingmann, Synystyr Texan, Takeda Terrawyng, Tali Rosca, Templar Merlin, Tezcatlipoca Bisiani, Tiel Stonecutter, Tony Kembia, TouchaHoney Perhaps, Trey Reanimator, TriloByte Zanzibar, Trinity Dechou, Trinity Dejavu, Unlikely Quintessa, UsikuFarasi Kanarik, Veritas Raymaker, Vex Streeter, Viaticus Speculaas, Villain Baroque, Vixie Durant, Void Singer, Watty Berkson, Westley Schridde, Westley Streeter, Whimsy Winx, Winter Ventura, Wundur Primbee, xstorm Radek, YongYong Francois, Zak Westminster, Zana Kohime, Zaren Alexander, Zeja Pyle, ZenMondo Wormser, Zoex Flanagan e muitos mais.
-
-
-
-
-&quot;O trabalho continua, a causa vive, a esperança persiste, e os sonhos nunca morrem&quot; - Edward Kennedy
+ <text name="linden_intro">
+ O Second Life é trazido a você pela Lindens:
+ </text>
+ <text_editor name="linden_names">
+ Philip, Andrew, Doug, Richard, Phoenix, Ian, Mark, Robin, Dan, Char, Ryan, Eric, Jim, Lee, Jeff, Michael, Kelly, Steve, Catherine, Bub, Ramzi, Jill, Jeska, Don, Kona, Callum, Charity, Jack, Shawn, babbage, James, Lauren, Blue, Brent, Reuben, Pathfinder, Jesse, Patsy, Torley, Bo, Cyn, Jonathan, Gia, Annette, Ginsu, Harry, Lex, Runitai, Guy, Cornelius, Beth, Swiss, Thumper, Wendy, Teeple, Seth, Dee, Mia, Sally, Liana, Aura, Beez, Milo, Red, Gulliver, Marius, Joe, Jose, Dore, Justin, Nora, Morpheus, Lexie, Amber, Chris, Xan, Leyla, Walker, Sabin, Joshua, Hiromi, Tofu, Fritz, June, Jean, Ivy, Dez, Ken, Betsy, Which, Spike, Rob, Zee, Dustin, George, Claudia, del, Matthew, jane, jay, Adrian, Yool, Rika, Yoz, siobhan, Qarl, Benjamin, Beast, Everett, madhavi, Christopher, Izzy, stephany, Jeremy, sean, adreanne, Pramod, Tobin, sejong, Iridium, maurice, kj, Meta, kari, JP, bert, kyle, Jon, Socrates, Bridie, Ivan, maria, Aric, Coco, Periapse, sandy, Storrs, Lotte, Colossus, Brad, Pastrami, Zen, BigPapi, Banzai, Sardonyx, Mani, Garry, Jaime, Neuro, Samuel, Niko, CeeLo, Austin, Soft, Poppy, emma, tessa, angelo, kurz, alexa, Sue, CG, Blake, Erica, Brett, Bevis, kristen, Q, simon, Enus, MJ, laurap, Kip, Scouse, Ron, Ram, kend, Marty, Prospero, melissa, kraft, Nat, Seraph, Hamilton, Lordan, Green, miz, Ashlei, Trinity, Ekim, Echo, Charlie, Rowan, Rome, Jt, Doris, benoc, Christy, Bao, Kate, Tj, Patch, Cheah, Johan, Brandy, Angela, Oreh, Cogsworth, Lan, Mitchell, Space, Bambers, Einstein, Bender, Malbers, Matias, Maggie, Rothman, Milton, Niall, Marin, Allison, Mango, Andrea, Katt, Yi, Ambroff, Rico, Raymond, Gail, Christa, William, Dawn, Usi, Dynamike, M, Corr, Dante, Molly, kaylee, Danica, Kelv, Lil, jacob, Nya, Rodney, elsie, Blondin, Grant, Nyx, Devin, Monty, Minerva, Keira, Katie, Jenn, Makai, Clare, Joy, Cody, Gayathri, FJ, spider, Oskar, Landon, Jarv, Noelle, Al, Doc, Gray, Vir, t, Maestro, Simone, Shannon, yang, Courtney, Scott, charlene, Quixote, Susan, Zed, Amanda, Katelin, Esbee, JoRoan, Enkidu, roxie, Scarlet, Merov, Kevin, Judy, Rand, Newell, Les, Dessie, Galen, Michon, Geo, Siz, Calyle, Pete, Praveen, Callen, Sheldon, Pink, Nelson, jenelle, Terrence, Nathan, Juan, Sascha, Huseby, Karina, Kaye, Kotler, Lis, Darv, Charrell, Dakota, Kimmora, Theeba, Taka, Mae, Perry, Ducot, dana, Esther, Dough, gisele, Doten, Viale, Fisher, jessieann, ashley, Torres, delby, rountree, kurt, Slaton, Madison, Rue, Gino, Wen, Casssandra, Brodesky, Squid, Gez, Rakesh, Gecko, Ladan, Tony, Tatem, Squire, Falcon, BK, Crimp, Tiggs, Bacon, Coyot, Carmilla, Webb, Sea, Arch, Jillian, Jason, Bernard, Vogt, Peggy, dragon, Pup, xandix, Wallace, Bewest, Inoshiro, Rhett, AG, Aimee, Ghengis, Itiaes, Eli, Steffan, Epic, Grapes, Stone, Prep, Scobu, Robert, Alain, Carla, Vicky, Tia, Alec, Taras, Lisa, Oz, Ariane, Log, House, Kazu, Kim, Drofnas, Tyler, Campbell, Michele, Madeline, Nelly, Baron, Thor, Lori, Hele, Fredrik, Teddy, Pixie, Berry, Gabrielle, Alfonso, Brooke, Wolf, Ringo, Cru, Charlar, Rodvik, Gibson, Elise, Bagman, Greger, Leonidas, Jerm, Leslie, CB, Brenda, Durian, Carlo, mm, Zeeshan, Caleb, Max, Elikak, Mercille, Steph, Chase
+ </text_editor>
+ <text name="contrib_intro">
+ com contribuições de código aberto de:
+ </text>
+ <text_editor name="contrib_names">
+ Dummy Name substituído durante a execução
+ </text_editor>
+ <text name="trans_intro">
+ e traduções de:
+ </text>
+ <text_editor name="trans_names">
+ Dummy Name substituído durante a execução
</text_editor>
</panel>
<panel label="Licenças" name="licenses_panel">
<text_editor name="credits_editor">
3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion
- APR Copyright (C) 2000-2004 The Apache Software Foundation
- cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)
- DBus/dbus-glib Copyright (C) 2002, 2003 CodeFactory AB / Copyright (C) 2003, 2004 Red Hat, Inc.
- expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.
- FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org).
- GL Copyright (C) 1999-2004 Brian Paul.
- Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.
- jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)
- jpeglib Copyright (C) 1991-1998, Thomas G. Lane.
- ogg/vorbis Copyright (C) 2001, Xiphophorus
- OpenSSL Copyright (C) 1998-2002 The OpenSSL Project.
- SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
- SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
- xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
- zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler.
- google-perftools Copyright (c) 2005, Google Inc.
-
- Todos os direitos reservados. Veja licenças.txt para detalhes.
+ APR Copyright (C) 2000-2004 The Apache Software Foundation
+ Collada DOM Copyright 2005 Sony Computer Entertainment Inc.
+ cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)
+ DBus/dbus-glib Copyright (C) 2002, 2003 CodeFactory AB / Copyright (C) 2003, 2004 Red Hat, Inc.
+ expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.
+ FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org).
+ GL Copyright (C) 1999-2004 Brian Paul.
+ GLOD Copyright (C) 2003-04 Jonathan Cohen, Nat Duca, Chris Niski, Johns Hopkins University e David Luebke, Brenden Schubert, University of Virginia.
+ google-perftools Copyright (c) 2005, Google Inc.
+ Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.
+ jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)
+ jpeglib Copyright (C) 1991-1998, Thomas G. Lane.
+ ogg/vorbis Copyright (C) 2001, Xiphophorus
+ OpenSSL Copyright (C) 1998-2002 The OpenSSL Project.
+ PCRE Copyright (c) 1997-2008 University of Cambridge
+ SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
+ SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+ xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
+ zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler.
+ google-perftools Copyright (c) 2005, Google Inc.
+
+ O Visualizador do Second Life usa Havok (TM) Physics. (c)Copyright 1999-2010 Havok.com Inc. (e seus Licenciantes). Todos os direitos reservados. Consulte www.havok.com para obter detalhes.
+
+ Este software contém código fonte fornecido pela NVIDIA Corporation.
+
+ Todos os direitos reservados. Consulte licenses.txt para obter detalhes.
- Voice chat Audio coding: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
+ Codificação de áudio da conversa com voz: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
</text_editor>
</panel>
</tab_container>
diff --git a/indra/newview/skins/default/xui/pt/floater_about_land.xml b/indra/newview/skins/default/xui/pt/floater_about_land.xml
index 3fb4bc272e..cd0fb4c41b 100644
--- a/indra/newview/skins/default/xui/pt/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/pt/floater_about_land.xml
@@ -87,15 +87,9 @@ Vá para o menu Mundo &gt; Sobre o terreno ou selecione outro lote para mostrar
<text name="Owner:">
Proprietário:
</text>
- <text name="OwnerText">
- Leyla Linden
- </text>
<text name="Group:">
Grupo:
</text>
- <text name="GroupText">
- Leyla Linden
- </text>
<button label="Ajustar" name="Set..."/>
<check_box label="Permitir doação para o grupo" name="check deed" tool_tip="Oficiais do grupo podem doar esse terreno ao grupo, passando a administração para o gestor da ilha"/>
<button label="Passar" name="Deed..." tool_tip="Você só pode doar o terreno se você for um dos oficiais do grupo selecionado."/>
@@ -119,7 +113,7 @@ Vá para o menu Mundo &gt; Sobre o terreno ou selecione outro lote para mostrar
<text name="Selling with no objects in parcel.">
À venda (objetos não incluídos).
</text>
- <button label="Cancelar venda do terreno" label_selected="Cancelar venda do terreno" left="275" name="Cancel Land Sale" width="165"/>
+ <button label="Cancelar venda do terreno" label_selected="Cancelar venda do terreno" name="Cancel Land Sale"/>
<text name="Claimed:">
Posse em:
</text>
@@ -136,15 +130,15 @@ Vá para o menu Mundo &gt; Sobre o terreno ou selecione outro lote para mostrar
Tráfego:
</text>
<text name="DwellText">
- 0
+ Carregando...
</text>
<button label="Comprar terreno..." label_selected="Comprar terreno..." left="130" name="Buy Land..." width="125"/>
+ <button label="Venda Linden" name="Linden Sale..." tool_tip="O terreno precisa ser possuído, estar com o conteúdo configurado e não estar pronto para leilão."/>
<button label="Dados do script" name="Scripts..."/>
<button label="Comprar para o grupo" name="Buy For Group..."/>
<button label="Comprar passe..." label_selected="Comprar passe..." left="130" name="Buy Pass..." tool_tip="Um passe concede a você acesso temporário a este terreno." width="125"/>
<button label="Abandonar terreno..." label_selected="Abandonar terreno..." name="Abandon Land..."/>
<button label="Pedir terreno" name="Reclaim Land..."/>
- <button label="Venda Linden" name="Linden Sale..." tool_tip="O terreno precisa ser possuído, estar com o conteúdo configurado e não estar pronto para leilão."/>
</panel>
<panel label="CONTRATO" name="land_covenant_panel">
<panel.string name="can_resell">
@@ -219,19 +213,19 @@ Vá para o menu Mundo &gt; Sobre o terreno ou selecione outro lote para mostrar
Fator de bônus para objetos na região: [BONUS]
</text>
<text name="Simulator primitive usage:">
- Uso de prims:
+ Capacidade da região:
</text>
<text name="objects_available">
[COUNT] de [MAX] ([AVAILABLE] disponíveis)
</text>
<text name="Primitives parcel supports:">
- Prims suportados pelo lote:
+ Capacidade do lote do terreno:
</text>
<text name="object_contrib_text">
[COUNT]
</text>
<text name="Primitives on parcel:">
- Prims no lote:
+ Impacto no lote do terreno:
</text>
<text name="total_objects_text">
[COUNT]
@@ -314,11 +308,16 @@ Apenas lotes maiores podem ser listados na busca.
<panel.string name="push_restrict_region_text">
Proibido empurrar (regulamento da região)
</panel.string>
+ <panel.string name="see_avs_text">
+ Avatares em outros lotes podem ver
+ </panel.string>
<text name="allow_label">
Autorizar outros residentes a:
</text>
- <check_box label="Editar terreno" name="edit land check" tool_tip="Se ativado, qualquer um pode modificar o terreno. É melhor deixar esta opção desativada, uma vez que você sempre pode editar seu próprio terreno."/>
- <check_box label="Voar" name="check fly" tool_tip="Se ativado, residentes podem voar sobre seu terreno. Se desativado, eles podem voar apenas até chegar ou sobrevoar o seu terreno."/>
+ <text name="allow_label0">
+ Voar:
+ </text>
+ <check_box label="Todos" name="check fly" tool_tip="Se ativado, residentes podem voar sobre seu terreno. Se desativado, eles podem voar apenas até chegar ou sobrevoar o seu terreno."/>
<text name="allow_label2">
Criar objetos:
</text>
@@ -334,9 +333,6 @@ Apenas lotes maiores podem ser listados na busca.
</text>
<check_box label="Residentes" name="check other scripts"/>
<check_box label="Grupo" name="check group scripts"/>
- <text name="land_options_label">
- Opções do terreno:
- </text>
<check_box label="Seguro (sem danos)" name="check safe" tool_tip="Se ativado, ajusta o terreno para Seguro, impedindo lutas com danos. Se não ativado, lutas com danos é habilitado."/>
<check_box label="Proibido empurrar" name="PushRestrictCheck" tool_tip="Evita scripts que empurram. Ativar essa opção ajuda a prevenir comportamentos desordeiros no seu terreno."/>
<check_box label="Mostrar terreno nos resultados de busca (L$30/semana)" name="ShowDirectoryCheck" tool_tip="Permitir que as pessoas vejam este terreno nos resultados de busca"/>
@@ -353,6 +349,7 @@ Apenas lotes maiores podem ser listados na busca.
<combo_box.item label="Parques &amp; Natureza" name="item9"/>
<combo_box.item label="Residencial" name="item10"/>
<combo_box.item label="Compras" name="item11"/>
+ <combo_box.item label="Aluguel" name="item13"/>
<combo_box.item label="Outros" name="item12"/>
</combo_box>
<combo_box name="land category">
@@ -367,6 +364,7 @@ Apenas lotes maiores podem ser listados na busca.
<combo_box.item label="Parques e Natureza" name="item9"/>
<combo_box.item label="Residencial" name="item10"/>
<combo_box.item label="Compras" name="item11"/>
+ <combo_box.item label="Aluguel" name="item13"/>
<combo_box.item label="Outros" name="item12"/>
</combo_box>
<check_box label="Conteúdo adulto" name="MatureCheck" tool_tip=""/>
@@ -374,6 +372,10 @@ Apenas lotes maiores podem ser listados na busca.
Foto:
</text>
<texture_picker label="" name="snapshot_ctrl" tool_tip="Clique para escolher uma imagem"/>
+ <text name="allow_label5">
+ Avatares em outros lotes podem ver e conversar com avatares neste lote
+ </text>
+ <check_box label="Ver avatares" name="SeeAvatarsCheck" tool_tip="Permite que os avatares em outros lotes vejam e batam papo com avatares neste lote. Você poderá vê-los e conversar com eles."/>
<text name="landing_point">
Ponto de Aterrissagem: [LANDING]
</text>
@@ -398,7 +400,6 @@ Apenas lotes maiores podem ser listados na busca.
</text>
<line_editor left="97" name="media_url"/>
<button label="Definir..." label_selected="Definir..." name="set_media_url"/>
- <check_box label="Esconder a URL da mídia" left="97" name="hide_media_url" tool_tip="Ativando esta opção, a URL da mídia se ocultará para quaisquer visualizadores não autorizados a ver esta informação do lote. Notar que isto não está disponível para tipos HTML."/>
<text name="Description:">
Descrição:
</text>
@@ -430,11 +431,15 @@ Mídia:
<text name="MusicURL:">
URL de música:
</text>
- <check_box label="Ocultar URL" name="hide_music_url" tool_tip="Selecionar esta opção oculta o URL de música a visitantes não autorizados aos dados do terreno."/>
<text name="Sound:">
Som:
</text>
<check_box label="Limitar sons de gestos e objetos a esta parcela" name="check sound local"/>
+ <text name="Avatar Sounds:">
+ Ãudio de avatares:
+ </text>
+ <check_box label="Todos" name="all av sound check"/>
+ <check_box label="Grupo" name="group av sound check"/>
<text name="Voice settings:">
Voz:
</text>
@@ -447,7 +452,7 @@ Mídia:
(Definições do terreno)
</panel.string>
<panel.string name="allow_public_access">
- Acesso para público: [MATURITY]
+ Acesso para público: [MATURITY]) (Desmarcar esse item cria limites)
</panel.string>
<panel.string name="estate_override">
Uma ou mais destas opções está definida no nível de propriedade.
@@ -455,12 +460,12 @@ Mídia:
<text name="Limit access to this parcel to:">
Acesso a este lote
</text>
- <check_box label="Acesso para público categoria [MATURITY]" name="public_access"/>
+ <check_box label="Permitir acesso público (Desmarcar esse item cria limites)" name="public_access"/>
<text name="Only Allow">
- Restringir acesso a contas confirmardas por:
+ Permitir acesso apenas para residentes que:
</text>
- <check_box label="Dados de pagamento fornecidos [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Banir residentes sem identificação."/>
- <check_box label="Idade comprovada: [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Banir residentes que não comprovaram a idade. Consulte o [SUPPORT_SITE] para saber mais."/>
+ <check_box label="Possuam Dados de pagamento fornecidos [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Os residentes devem ter seus dados de pagamento cadastrados para acessar este lote. Consulte o [SUPPORT_SITE] para saber mais."/>
+ <check_box label="Tiveram sua idade verificada [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Os residentes devem ter a idade verificada para acessar este lote. Consulte o [SUPPORT_SITE] para saber mais."/>
<check_box label="Permitir acesso do grupo: [GROUP]" name="GroupCheck" tool_tip="Definir grupo na aba Geral."/>
<check_box label="Vender passes para:" name="PassCheck" tool_tip="Permite acesso temporário a este terreno"/>
<combo_box name="pass_combo">
diff --git a/indra/newview/skins/default/xui/pt/floater_animation_anim_preview.xml b/indra/newview/skins/default/xui/pt/floater_animation_anim_preview.xml
new file mode 100644
index 0000000000..05326d8594
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_animation_anim_preview.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Anim Preview" title="ANIMATION.ANIM">
+ <text name="name_label">
+ Nome:
+ </text>
+ <text name="description_label">
+ Descrição:
+ </text>
+ <button label="Envio (L$[AMOUNT])" name="ok_btn"/>
+ <button label="Cancelar" label_selected="Cancelar" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_animation_bvh_preview.xml b/indra/newview/skins/default/xui/pt/floater_animation_bvh_preview.xml
new file mode 100644
index 0000000000..5cae581045
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_animation_bvh_preview.xml
@@ -0,0 +1,186 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Animation Preview">
+ <floater.string name="failed_to_initialize">
+ Falha ao iniciar animação
+ </floater.string>
+ <floater.string name="anim_too_long">
+ O arquivo de animação possui [LENGTH] segundos de duração.
+
+A duração máxima da animação é de [MAX_LENGTH] segundos.
+ </floater.string>
+ <floater.string name="failed_file_read">
+ Não foi possível ler o arquivo de animação.
+
+[STATUS]
+ </floater.string>
+ <floater.string name="E_ST_OK">
+ Ok
+ </floater.string>
+ <floater.string name="E_ST_EOF">
+ Fim de arquivo prematuro.
+ </floater.string>
+ <floater.string name="E_ST_NO_CONSTRAINT">
+ Impossível ler definição constraint.
+ </floater.string>
+ <floater.string name="E_ST_NO_FILE">
+ Impossível abrir arquivo BVH.
+ </floater.string>
+ <floater.string name="E_ST_NO_HIER">
+ Invalid HIERARCHY header.
+ </floater.string>
+ <floater.string name="E_ST_NO_JOINT">
+ RAIZ ou JUNTA não encontrados.
+ </floater.string>
+ <floater.string name="E_ST_NO_NAME">
+ Impossível obter nome JOINT.
+ </floater.string>
+ <floater.string name="E_ST_NO_OFFSET">
+ Impossível localizar OFFSET.
+ </floater.string>
+ <floater.string name="E_ST_NO_CHANNELS">
+ Impossível localizar CHANNELS.
+ </floater.string>
+ <floater.string name="E_ST_NO_ROTATION">
+ Impossível obter ordem de rotação.
+ </floater.string>
+ <floater.string name="E_ST_NO_AXIS">
+ Impossível obter eixo de rotação.
+ </floater.string>
+ <floater.string name="E_ST_NO_MOTION">
+ Impossível localizar MOTION.
+ </floater.string>
+ <floater.string name="E_ST_NO_FRAMES">
+ Impossível determinar número de quadros.
+ </floater.string>
+ <floater.string name="E_ST_NO_FRAME_TIME">
+ Impossível determinar tempo dos quadros.
+ </floater.string>
+ <floater.string name="E_ST_NO_POS">
+ Impossível definir posicionamento.
+ </floater.string>
+ <floater.string name="E_ST_NO_ROT">
+ Impossível definir valores da rotação.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_FILE">
+ Impossível abrir arquivo de tradução.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_HEADER">
+ Impossível ler cabeçalho de tradução.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_NAME">
+ Impossível ler nomes traduzidos.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_IGNORE">
+ Impossível obter valor traduzido a ignorar.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_RELATIVE">
+ Impossível obter valor traduzido relativo.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_OUTNAME">
+ Impossível obter valor traduzido.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MATRIX">
+ Impossível ler matriz de tradução.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MERGECHILD">
+ Impossível obter nome mergechild.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MERGEPARENT">
+ Impossível obter nome mergeparent.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_PRIORITY">
+ Impossível obter valor prioritário.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_LOOP">
+ Impossível obter valor do loop.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EASEIN">
+ Impossível obter valor easeIn.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EASEOUT">
+ Impossível obter valor easeOut.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_HAND">
+ Impossível obter valor de morph da mão.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EMOTE">
+ Impossível ler nome do emote.
+ </floater.string>
+ <floater.string name="E_ST_BAD_ROOT">
+ Nome da junta incorreto, use &quot;quadril&quot;.
+ </floater.string>
+ <text name="name_label">
+ Nome:
+ </text>
+ <text name="description_label">
+ Descrição:
+ </text>
+ <spinner label="Prioridade" name="priority" tool_tip="Controla quais animações podem ser interrompidas por esta animação"/>
+ <check_box label="Loop" name="loop_check" tool_tip="Executa esta animação sem parar"/>
+ <spinner label="Dentro(%)" name="loop_in_point" tool_tip="Define o ponto em que a animação em loop reinicia"/>
+ <spinner label="Fora(%)" name="loop_out_point" tool_tip="Define o ponto em que a animação em loop acaba"/>
+ <text name="hand_label">
+ Pose das mãos
+ </text>
+ <combo_box name="hand_pose_combo" tool_tip="Controla os gestos das mãos durante a animação">
+ <combo_box.item label="Abrir" name="Spread"/>
+ <combo_box.item label="Relaxado" name="Relaxed"/>
+ <combo_box.item label="Apontar ambas" name="PointBoth"/>
+ <combo_box.item label="Punho" name="Fist"/>
+ <combo_box.item label="E relaxada" name="RelaxedLeft"/>
+ <combo_box.item label="Apontar E" name="PointLeft"/>
+ <combo_box.item label="Punho E" name="FistLeft"/>
+ <combo_box.item label="D relaxada" name="RelaxedRight"/>
+ <combo_box.item label="Apontar D" name="PointRight"/>
+ <combo_box.item label="Punho D" name="FistRight"/>
+ <combo_box.item label="Saudação D" name="SaluteRight"/>
+ <combo_box.item label="Escrevendo" name="Typing"/>
+ <combo_box.item label="Paz D" name="PeaceRight"/>
+ </combo_box>
+ <text name="emote_label">
+ Expressão
+ </text>
+ <combo_box name="emote_combo" tool_tip="Controla as expressões faciais durante a animação">
+ <item label="(nenhum)" name="[None]" value=""/>
+ <item label="Aaaaah" name="Aaaaah" value="Aaaaah"/>
+ <item label="Com medo" name="Afraid" value="Com medo"/>
+ <item label="Bravo" name="Angry" value="Bravo"/>
+ <item label="Sorriso contagiante" name="BigSmile" value="Sorriso contagiante"/>
+ <item label="À toa" name="Bored" value="À toa"/>
+ <item label="Chorar" name="Cry" value="Chorar"/>
+ <item label="Desdenho" name="Disdain" value="Desdenho"/>
+ <item label="Com vergonha" name="Embarrassed" value="Com vergonha"/>
+ <item label="Franzir testa" name="Frown" value="Franzir testa"/>
+ <item label="Beijo" name="Kiss" value="Beijo"/>
+ <item label="Rir" name="Laugh" value="Rir"/>
+ <item label="Mostrar a língua" name="Plllppt" value="Mostrar a língua"/>
+ <item label="Asco" name="Repulsed" value="Asco"/>
+ <item label="Triste" name="Sad" value="Triste"/>
+ <item label="Encolher os ombros" name="Shrug" value="Encolher os ombros"/>
+ <item label="Sorriso" name="Smile" value="Sorriso"/>
+ <item label="Surpresa" name="Surprise" value="Surpresa"/>
+ <item label="Piscar" name="Wink" value="Piscar"/>
+ <item label="Preocupado" name="Worry" value="Preocupado"/>
+ </combo_box>
+ <text name="preview_label">
+ Visualizar enquanto
+ </text>
+ <combo_box name="preview_base_anim" tool_tip="Use para testar o comportamento de sua animação enquanto seu avatar executa ações comuns.">
+ <item label="Em pé" name="Standing" value="Em pé"/>
+ <item label="Andar" name="Walking" value="Andar"/>
+ <item label="Sentado" name="Sitting" value="Sentado"/>
+ <item label="Voar" name="Flying" value="Voar"/>
+ </combo_box>
+ <spinner label="Aproximação (seg)" name="ease_in_time" tool_tip="Tempo (em segundos) da transição inicial da animação"/>
+ <spinner label="Afastamento (seg)" name="ease_out_time" tool_tip="Tempo (em segundos) da transição de saída da animação"/>
+ <button name="play_btn" tool_tip="Executar animação"/>
+ <button name="pause_btn" tool_tip="Pausar a animação"/>
+ <button name="stop_btn" tool_tip="Interromper a execução da animação"/>
+ <text name="bad_animation_text">
+ Não foi possível ler o arquivo de animação.
+
+Recomendamos que os arquivos BVH sejam exportados do Poser 4.
+ </text>
+ <button label="Envio (L$[AMOUNT])" name="ok_btn"/>
+ <button label="Cancelar" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_avatar.xml b/indra/newview/skins/default/xui/pt/floater_avatar.xml
new file mode 100644
index 0000000000..168cdacae1
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_avatar.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Avatar" title="ESCOLHA UM AVATAR"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_beacons.xml b/indra/newview/skins/default/xui/pt/floater_beacons.xml
index b16ff6003e..f8ae3cd2d8 100644
--- a/indra/newview/skins/default/xui/pt/floater_beacons.xml
+++ b/indra/newview/skins/default/xui/pt/floater_beacons.xml
@@ -17,5 +17,6 @@
<check_box label="Só tocar" name="touch_only"/>
<check_box label="Fontes de som" name="sounds"/>
<check_box label="Fontes de partículas" name="particles"/>
+ <check_box label="Fontes de mídia" name="moapbeacon"/>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_build_options.xml b/indra/newview/skins/default/xui/pt/floater_build_options.xml
index 71a1483dde..acc462ea94 100644
--- a/indra/newview/skins/default/xui/pt/floater_build_options.xml
+++ b/indra/newview/skins/default/xui/pt/floater_build_options.xml
@@ -1,11 +1,34 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="build options floater" title="OPÇÕES DE GRADE">
- <spinner label="Unidade da grade (metros)" label_width="122" name="GridResolution" width="180"/>
- <spinner label="Ext. da Grade (metros)" label_width="122" name="GridDrawSize" width="180"/>
+ <floater.string name="grid_screen_text">
+ Tela
+ </floater.string>
+ <floater.string name="grid_local_text">
+ Local
+ </floater.string>
+ <floater.string name="grid_world_text">
+ Mundo
+ </floater.string>
+ <floater.string name="grid_reference_text">
+ Referência
+ </floater.string>
+ <floater.string name="grid_attachment_text">
+ Anexo
+ </floater.string>
+ <text name="grid_mode_label" tool_tip="Opacidade da grade">
+ Modo
+ </text>
+ <combo_box name="combobox grid mode" tool_tip="Selecione o tipo de régua da grade onde o objeto será colocado">
+ <combo_box.item label="Grid SL" name="World"/>
+ <combo_box.item label="Grid local" name="Local"/>
+ <combo_box.item label="Grid de referência" name="Reference"/>
+ </combo_box>
+ <spinner label="Unidades (metros):" name="GridResolution"/>
+ <spinner label="Extensões (metros)" name="GridDrawSize"/>
<check_box label="Encaixar em sub-unidades" name="GridSubUnit"/>
<check_box label="Ver corte transversal" name="GridCrossSection"/>
<text name="grid_opacity_label" tool_tip="Opacidade da grade">
Opacidade:
</text>
- <slider label="Opacidade da grade" name="GridOpacity" width="220"/>
+ <slider label="Opacidade da grade" name="GridOpacity"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_buy_contents.xml b/indra/newview/skins/default/xui/pt/floater_buy_contents.xml
index c64523ceb3..b9e7a04412 100644
--- a/indra/newview/skins/default/xui/pt/floater_buy_contents.xml
+++ b/indra/newview/skins/default/xui/pt/floater_buy_contents.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_buy_contents" title="COMPRAR CONTEÚDO">
<text name="contains_text">
- [NAME] contém:
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; contains:
</text>
<text name="buy_text">
Comprar por L$[AMOUNT] de(a) [NAME]?
diff --git a/indra/newview/skins/default/xui/pt/floater_buy_currency.xml b/indra/newview/skins/default/xui/pt/floater_buy_currency.xml
index a737212b50..2845a29e1d 100644
--- a/indra/newview/skins/default/xui/pt/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/pt/floater_buy_currency.xml
@@ -46,7 +46,7 @@
L$ [AMT]
</text>
<text name="currency_links">
- [http://www.secondlife.com/my/account/payment_method_management.php payment method] | [http://www.secondlife.com/my/account/currency.php currency] | [http://www.secondlife.com/my/account/exchange_rates.php exchange rate]
+ [http://www.secondlife.com/my/account/payment_method_management.php método de pagamento] | [http://www.secondlife.com/my/account/currency.php moeda]
</text>
<text name="exchange_rate_note">
Digite o valor novamente para ver o câmbio atual.
diff --git a/indra/newview/skins/default/xui/pt/floater_buy_land.xml b/indra/newview/skins/default/xui/pt/floater_buy_land.xml
index 5c5ee3b7a0..258c95cc7d 100644
--- a/indra/newview/skins/default/xui/pt/floater_buy_land.xml
+++ b/indra/newview/skins/default/xui/pt/floater_buy_land.xml
@@ -127,25 +127,25 @@ contribuídas para cobrir este lote antes da aquisição se completar.
<text name="region_name_label">
Região:
</text>
- <text left="560" name="region_name_text">
+ <text name="region_name_text">
(desconhecido)
</text>
<text name="region_type_label">
Tipo:
</text>
- <text left="560" name="region_type_text">
+ <text name="region_type_text">
(desconhecido)
</text>
<text name="estate_name_label">
Propriedade:
</text>
- <text left="560" name="estate_name_text">
+ <text name="estate_name_text">
(desconhecido)
</text>
- <text name="estate_owner_label" right="565" width="105">
+ <text name="estate_owner_label">
Dono da propriedade:
</text>
- <text left="560" name="estate_owner_text">
+ <text name="estate_owner_text">
(desconhecido)
</text>
<text name="resellable_changeable_label">
@@ -160,11 +160,11 @@ contribuídas para cobrir este lote antes da aquisição se completar.
<text name="covenant_text">
Você deve concordar com o Corretor da Propriedade:
</text>
- <text left="470" name="covenant_timestamp_text"/>
+ <text name="covenant_timestamp_text"/>
<text_editor name="covenant_editor">
Carregando...
</text_editor>
- <check_box label="Eu concordo com as definições do Corretor feitas acima." name="agree_covenant"/>
+ <check_box label="Eu concordo com as definições do Corretor feitas acima." name="agree_covenant" left="-330"/>
<text name="info_parcel_label">
Lote:
</text>
diff --git a/indra/newview/skins/default/xui/pt/floater_camera.xml b/indra/newview/skins/default/xui/pt/floater_camera.xml
index 4f3729c623..9cda01c187 100644
--- a/indra/newview/skins/default/xui/pt/floater_camera.xml
+++ b/indra/newview/skins/default/xui/pt/floater_camera.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="camera_floater" title="">
+<floater name="camera_floater" title="CONTROLES DA CÂMERA">
<floater.string name="rotate_tooltip">
Girar a Câmera ao redor do Foco
</floater.string>
@@ -9,15 +9,6 @@
<floater.string name="move_tooltip">
Mover a Câmera para Cima e para Baixo, para a Esquerda e para a Direita
</floater.string>
- <floater.string name="camera_modes_title">
- Modos de câmera
- </floater.string>
- <floater.string name="pan_mode_title">
- Pan zoom orbital
- </floater.string>
- <floater.string name="presets_mode_title">
- Ângulos predefinidos
- </floater.string>
<floater.string name="free_mode_title">
Visualizar objeto
</floater.string>
diff --git a/indra/newview/skins/default/xui/pt/floater_chat_bar.xml b/indra/newview/skins/default/xui/pt/floater_chat_bar.xml
new file mode 100644
index 0000000000..72016c6b40
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_chat_bar.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="chat_bar" title="BATE-PAPO LOCAL">
+ <panel name="bottom_panel">
+ <line_editor label="Clique aqui para bater papo." name="chat_box" tool_tip="Tecle Enter para falar, Ctrl+Enter para gritar"/>
+ <button name="show_nearby_chat" tool_tip="Mostra/oculta o histórico do bate-papo local"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_customize.xml b/indra/newview/skins/default/xui/pt/floater_customize.xml
deleted file mode 100644
index a9ec0b9b1f..0000000000
--- a/indra/newview/skins/default/xui/pt/floater_customize.xml
+++ /dev/null
@@ -1,530 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater customize" title="APARÊNCIA">
- <tab_container name="customize tab container" tab_min_width="115">
- <text label="Corpo" name="body_parts_placeholder">
- Partes do corpo
- </text>
- <panel label="Forma" name="Shape">
- <button label="Reverter" label_selected="Reverter" name="Revert"/>
- <button label="Corpo" label_selected="Corpo" name="Body"/>
- <button label="Cabeça" label_selected="Cabeça" name="Head"/>
- <button label="Olhos" label_selected="Olhos" name="Eyes"/>
- <button label="Orelhas" label_selected="Orelhas" name="Ears"/>
- <button label="Nariz" label_selected="Nariz" name="Nose"/>
- <button label="Boca" label_selected="Boca" name="Mouth"/>
- <button label="Queixo" label_selected="Queixo" name="Chin"/>
- <button label="Tórax" label_selected="Tórax" name="Torso"/>
- <button label="Pernas" label_selected="Pernas" name="Legs"/>
- <radio_group name="sex radio">
- <radio_item label="Feminino" name="radio" value="0"/>
- <radio_item label="Masculino" name="radio2" value="1"/>
- </radio_group>
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: não foi possível modificar
- </text>
- <text name="title_loading">
- [DESC]: carregando...
- </text>
- <text name="title_not_worn">
- [DESC]: não vestido
- </text>
- <text name="path">
- Localizado em [PATH]
- </text>
- <text name="not worn instructions">
- Para obter um físico novo, arraste um do inventário para o seu avatar. Ou crie um novo.
- </text>
- <text name="no modify instructions">
- Você não tem permissão para modificar esta vestimenta.
- </text>
- <text name="Item Action Label">
- Forma:
- </text>
- <button label="Nova" label_selected="Nova" name="Create New"/>
- <button label="Salvar" label_selected="Salvar" name="Save"/>
- <button label="Salvar como..." label_selected="Salvar como..." name="Save As"/>
- </panel>
- <panel label="Pele" name="Skin">
- <button label="Cor de pele" label_selected="Cor de pele" name="Skin Color" width="115"/>
- <button label="Detalhes faciais" label_selected="Detalhes faciais" name="Face Detail" width="115"/>
- <button label="Maquilagem" label_selected="Maquilagem" name="Makeup" width="115"/>
- <button label="Detalhes do corpo" label_selected="Detalhes do corpo" name="Body Detail" width="115"/>
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: não foi possível modificar
- </text>
- <text name="title_loading">
- [DESC]: carregando..
- </text>
- <text name="title_not_worn">
- [DESC]: não vestido
- </text>
- <text name="path">
- Localizada em [PATH]
- </text>
- <text name="not worn instructions">
- Para obter uma pele nova, arraste uma do inventário para o seu avatar. Ou crie uma pele nova.
- </text>
- <text name="no modify instructions">
- Você não tem permissão para modificar esta vestimenta.
- </text>
- <text name="Item Action Label">
- Pele:
- </text>
- <texture_picker label="Tattoo: cabeça" name="Head Tattoos" tool_tip="Clique para escolher um desenho" width="86"/>
- <texture_picker label="Tattoo: superior" name="Upper Tattoos" tool_tip="Clique para escolher um desenho" width="86"/>
- <texture_picker label="Tattoo: inferior" name="Lower Tattoos" tool_tip="Clique para escolher um desenho" width="86"/>
- <button label="Novo" label_selected="Novo" name="Create New"/>
- <button label="Salvar" label_selected="Salvar" name="Save"/>
- <button label="Salvar como..." label_selected="Salvar como..." name="Save As"/>
- <button label="Reverter" label_selected="Reverter" name="Revert"/>
- </panel>
- <panel label="Cabelo" name="Hair">
- <button label="Cor" label_selected="Cor" name="Color" width="115"/>
- <button label="Estilo" label_selected="Estilo" name="Style" width="115"/>
- <button label="Sombrancelhas" label_selected="Sombrancelhas" name="Eyebrows" width="115"/>
- <button label="Rosto" label_selected="Rosto" name="Facial" width="115"/>
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: não foi possível modificar
- </text>
- <text name="title_loading">
- [DESC]: carregando...
- </text>
- <text name="title_not_worn">
- [DESC]: não vestido
- </text>
- <text name="path">
- Localizado em [PATH]
- </text>
- <text name="not worn instructions">
- Para obter um cabelo novo, arraste um tipo de cabelo do inventário para o seu avatar. Ou crie um cabelo novo.
- </text>
- <text name="no modify instructions">
- Você não ter permissão para modificar essa vestimenta.
- </text>
- <text name="Item Action Label">
- Cabelo:
- </text>
- <texture_picker label="Texture" name="Texture" tool_tip="Clique para escolher uma imagem"/>
- <button label="Criar novo cabelo" label_selected="Criar novo cabelo" name="Create New"/>
- <button label="Salvar" label_selected="Salvar" name="Save"/>
- <button label="Salvar como..." label_selected="Salvar como..." name="Save As"/>
- <button label="Reverter" label_selected="Reverter" name="Revert"/>
- </panel>
- <panel label="Olhos" name="Eyes">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: não foi possível modificar
- </text>
- <text name="title_loading">
- [DESC]: carregando...
- </text>
- <text name="title_not_worn">
- [DESC]: não vestido
- </text>
- <text name="path">
- Localizado em [PATH]
- </text>
- <text name="not worn instructions">
- Para obter novos olhos, arraste um tipo de olhos do inventário para o seu avatar. Ou crie olhos novos.
- </text>
- <text name="no modify instructions">
- Você não tem permissão para alterar esta vestimenta.
- </text>
- <text name="Item Action Label">
- Olhos:
- </text>
- <texture_picker label="Ãris" name="Iris" tool_tip="Clique para escolher uma imagem"/>
- <button label="Criar novos olhos" label_selected="Criar novos olhos" name="Create New"/>
- <button label="Salvar" label_selected="Salvar" name="Save"/>
- <button label="Salvar como..." label_selected="Salvar como..." name="Save As"/>
- <button label="Reverter" label_selected="Reverter" name="Revert"/>
- </panel>
- <text label="Roupas" name="clothes_placeholder">
- Roupa
- </text>
- <panel label="Camisa" name="Shirt">
- <texture_picker label="Tecido" name="Fabric" tool_tip="Clique para escolher uma imagem"/>
- <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Selecionar a cor"/>
- <button label="Remover" label_selected="Remover" name="Take Off"/>
- <button label="Criar nova camisa" label_selected="Criar nova camisa" name="Create New"/>
- <button label="Salvar" label_selected="Salvar" name="Save"/>
- <button label="Salvar como..." label_selected="Salvar como..." name="Save As"/>
- <button label="Reverter" label_selected="Reverter" name="Revert"/>
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: não foi possível modificar
- </text>
- <text name="title_loading">
- [DESC]: carregando...
- </text>
- <text name="title_not_worn">
- [DESC]: não vestido
- </text>
- <text name="path">
- Localizado em [PATH]
- </text>
- <text name="not worn instructions">
- Para obter uma camisa nova, arraste uma do inventário para o seu avatar. Ou crie uma camisa nova.
- </text>
- <text name="no modify instructions">
- Você não ter permissão para modificar esta vestimenta.
- </text>
- <text name="Item Action Label">
- Camisa:
- </text>
- </panel>
- <panel label="Calças" name="Pants">
- <texture_picker label="Tecido" name="Fabric" tool_tip="Clique para escolher uma imagem"/>
- <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Selecionar a cor"/>
- <button label="Remover" label_selected="Remover" name="Take Off"/>
- <button label="Criar novas calças" label_selected="Criar novas calças" name="Create New"/>
- <button label="Salvar" label_selected="Salvar" name="Save"/>
- <button label="Salvar como..." label_selected="Salvar como..." name="Save As"/>
- <button label="Reverter" label_selected="Reverter" name="Revert"/>
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: não foi possível modificar
- </text>
- <text name="title_loading">
- [DESC]: carregando...
- </text>
- <text name="title_not_worn">
- [DESC]: não vestindo
- </text>
- <text name="path">
- Localizado em [PATH]
- </text>
- <text name="not worn instructions">
- Para obter calças novas, arraste uma do inventário para o seu avatar. Ou crie calças novas.
- </text>
- <text name="no modify instructions">
- Você não tem permissão para modificar esta vestimenta.
- </text>
- <text name="Item Action Label">
- Calças:
- </text>
- </panel>
- <panel label="Sapatos" name="Shoes">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: não foi possível modificar
- </text>
- <text name="title_loading">
- [DESC]: carregando...
- </text>
- <text name="title_not_worn">
- [DESC]: não vestido
- </text>
- <text name="path">
- Localizado em [PATH]
- </text>
- <text name="not worn instructions">
- Para obter novos olhos, arraste um tipo de olhos do inventário para o seu avatar. Ou crie olhos novos.
- </text>
- <button label="Criar novos sapatos" label_selected="Criar novos sapatos" name="Create New" width="166"/>
- <text name="no modify instructions">
- Você não tem permissão para modificar esta vestimenta.
- </text>
- <text name="Item Action Label">
- Sapatos:
- </text>
- <texture_picker label="Tecido" name="Fabric" tool_tip="Clique para escolher uma imagem"/>
- <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Selecionar a cor"/>
- <button label="Remover" label_selected="Remover" name="Take Off"/>
- <button label="Salvar" label_selected="Salvar" name="Save"/>
- <button label="Salvar como..." label_selected="Salvar como..." name="Save As"/>
- <button label="Reverter" label_selected="Reverter" name="Revert"/>
- </panel>
- <panel label="Meias" name="Socks">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: não foi possível modificar
- </text>
- <text name="title_loading">
- [DESC]: carregando...
- </text>
- <text name="title_not_worn">
- [DESC]: não vestido.
- </text>
- <text name="path">
- Localizado em [PATH]
- </text>
- <text name="not worn instructions">
- Para obter meias novas, arraste um par do inventário para o seu avatar. Ou crie meias novas.
- </text>
- <button label="Criar novas meias" label_selected="Criar novas meias" name="Create New"/>
- <text name="no modify instructions">
- Você não tem permissão para modificar essa vestimenta.
- </text>
- <text name="Item Action Label">
- Meias:
- </text>
- <texture_picker label="Tecido" name="Fabric" tool_tip="Clique para escolher uma imagem"/>
- <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Selecionar a cor"/>
- <button label="Remover" label_selected="Remover" name="Take Off"/>
- <button label="Salvar" label_selected="Salvar" name="Save"/>
- <button label="Salvar como..." label_selected="Salvar como..." name="Save As"/>
- <button label="Reverter" label_selected="Reverter" name="Revert"/>
- </panel>
- <panel label="Jaqueta" name="Jacket">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: Não foi possível modificar
- </text>
- <text name="title_loading">
- [DESC]: carregando...
- </text>
- <text name="title_not_worn">
- [DESC]: não vestido
- </text>
- <text name="path">
- Localizado em [PATH]
- </text>
- <text name="not worn instructions">
- Para por uma jaqueta nova, arraste uma do inventário para o seu avatar. Ou crie uma jaqueta nova.
- </text>
- <button label="Criar nova jaqueta" label_selected="Criar nova jaqueta" name="Create New"/>
- <text name="no modify instructions">
- Você não tem permissão para modificar esta vestimenta.
- </text>
- <text name="Item Action Label">
- Jaqueta:
- </text>
- <texture_picker label="Tecido superior" name="Upper Fabric" tool_tip="Clique para escolher uma imagem." width="84"/>
- <texture_picker label="Tecido Inferior" name="Lower Fabric" tool_tip="Clique para escolher uma imagem." width="84"/>
- <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Selecionar a cor"/>
- <button label="Remover" label_selected="Remover" name="Take Off"/>
- <button label="Salvar" label_selected="Salvar" name="Save"/>
- <button label="Salvar como..." label_selected="Salvar como..." name="Save As"/>
- <button label="Reverter" label_selected="Reverter" name="Revert"/>
- </panel>
- <panel label="Luvas" name="Gloves">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: não foi possível modificar
- </text>
- <text name="title_loading">
- [DESC]: carregando....
- </text>
- <text name="title_not_worn">
- [DESC]: não vestido
- </text>
- <text name="path">
- Localizado em [PATH]
- </text>
- <text name="not worn instructions">
- Para obter luvas novas, arraste um par do inventário para o seu avatar. Ou crie luvas novas.
- </text>
- <button label="Criar novas luvas" label_selected="Criar novas luvas" name="Create New"/>
- <text name="no modify instructions">
- Você não tem permissão para modificar essa vestimenta.
- </text>
- <text name="Item Action Label">
- Luvas:
- </text>
- <texture_picker label="Tecido" name="Fabric" tool_tip="Clique para escolher uma imagem"/>
- <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Selecionar a cor"/>
- <button label="Remover" label_selected="Remover" name="Take Off"/>
- <button label="Salvar" label_selected="Salvar" name="Save"/>
- <button label="Salvar como..." label_selected="Salvar como..." name="Save As"/>
- <button label="Reverter" label_selected="Reverter" name="Revert"/>
- </panel>
- <panel label="Camiseta" name="Undershirt">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: não foi possível modificar
- </text>
- <text name="title_loading">
- [DESC]: carregando...
- </text>
- <text name="title_not_worn">
- [DESC]: não vestido
- </text>
- <text name="path">
- Localizado em [PATH]
- </text>
- <text name="not worn instructions">
- Para obter uma camiseta nova, arraste uma do inventário para o seu avatar. Ou crie uma camiseta nova.
- </text>
- <button label="Criar nova camiseta" label_selected="Criar nova camiseta" name="Create New"/>
- <text name="no modify instructions">
- Você não ter permissão para modificar essa vestimenta.
- </text>
- <text name="Item Action Label">
- Camiseta:
- </text>
- <texture_picker label="Tecido" name="Fabric" tool_tip="Clique para escolher uma imagem"/>
- <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Selecionar a cor"/>
- <button label="Remover" label_selected="Remover" name="Take Off"/>
- <button label="Salvar" label_selected="Salvar" name="Save"/>
- <button label="Salvar como..." label_selected="Salvar como..." name="Save As"/>
- <button label="Reverter" label_selected="Reverter" name="Revert"/>
- </panel>
- <panel label="Roupas de Baixo" name="Underpants">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: não foi possível modificar
- </text>
- <text name="title_loading">
- [DESC]: carregando...
- </text>
- <text name="title_not_worn">
- [DESC]: não vestido
- </text>
- <text name="path">
- Localizado em [PATH]
- </text>
- <text name="not worn instructions">
- Para obter roupa de baixo nova, arraste um modelo do inventário para o seu avatar. Ou crie uma roupa de baixo nova.
- </text>
- <button label="Criar novas" label_selected="Criar novas" name="Create New" width="180"/>
- <text name="no modify instructions">
- Você não tem permissão para modificar essa vestimenta.
- </text>
- <text name="Item Action Label">
- Roupas de baixo:
- </text>
- <texture_picker label="Tecido" name="Fabric" tool_tip="Clique para escolher uma imagem"/>
- <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Selecionar a cor"/>
- <button label="Remover" label_selected="Remover" name="Take Off"/>
- <button label="Salvar" label_selected="Salvar" name="Save"/>
- <button label="Salvar como..." label_selected="Salvar como..." name="Save As"/>
- <button label="Reverter" label_selected="Reverter" name="Revert"/>
- </panel>
- <panel label="Saia" name="Skirt">
- <text name="title">
- [DESC]
- </text>
- <text name="title_no_modify">
- [DESC]: não foi possível modificar
- </text>
- <text name="title_loading">
- [DESC]: carregando...
- </text>
- <text name="title_not_worn">
- [DESC]: não vestido
- </text>
- <text name="path">
- Localizado em [PATH]
- </text>
- <text name="not worn instructions">
- Para obter um saia nova, arraste uma saia do inventário para o seu avatar. Ou crie uma saia nova.
- </text>
- <button label="Criar nova saia" label_selected="Criar nova saia" name="Create New"/>
- <text name="no modify instructions">
- Você não tem permissão para modificar esta vestimenta.
- </text>
- <text name="Item Action Label">
- Saia:
- </text>
- <texture_picker label="Tecido" name="Fabric" tool_tip="Clique para escolher uma imagem"/>
- <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Selecionar a cor"/>
- <button label="Remover" label_selected="Remover" name="Take Off"/>
- <button label="Salvar" label_selected="Salvar" name="Save"/>
- <button label="Salvar como..." label_selected="Salvar como..." name="Save As"/>
- <button label="Reverter" label_selected="Reverter" name="Revert"/>
- </panel>
- <panel label="Tatuagem" name="Tattoo">
- <text name="title">
- [DESC]:
- </text>
- <text name="title_no_modify">
- [DESC]: não pode ser modificado
- </text>
- <text name="title_loading">
- [DESC]: Carregando...
- </text>
- <text name="title_not_worn">
- [DESC]: não vestido
- </text>
- <text name="path">
- Localização: [PATH]
- </text>
- <text name="not worn instructions">
- Para por uma tatuagem nova, arraste uma tatuagem do inventário para o seu avatar. Ou crie uma tatuagem nova.
- </text>
- <button label="Criar tatuagem" label_selected="Criar tatuagem" name="Create New"/>
- <text name="no modify instructions">
- Você não está autorizado a modificar este acessório.
- </text>
- <text name="Item Action Label">
- Tatuagem:
- </text>
- <texture_picker label="Tatuagem na cabeça" name="Head Tattoo" tool_tip="Selecionar imagem"/>
- <texture_picker label="Tatuagem parte de cima" name="Upper Tattoo" tool_tip="Selecionar imagem"/>
- <texture_picker label="Tatuagem de baixo" name="Lower Tattoo" tool_tip="Selecionar imagem"/>
- <button label="Tirar" label_selected="Tirar" name="Take Off"/>
- <button label="Salvar" label_selected="Salvar" name="Save"/>
- <button label="Salvar como..." label_selected="Salvar como..." name="Save As"/>
- <button label="Reverter" label_selected="Reverter" name="Revert"/>
- </panel>
- <panel label="Alpha" name="Alpha">
- <text name="title">
- [DESC]:
- </text>
- <text name="title_no_modify">
- [DESC]: não pode ser modificado
- </text>
- <text name="title_loading">
- [DESC]: Carregando...
- </text>
- <text name="title_not_worn">
- [DESC]: não vestido
- </text>
- <text name="path">
- Localização: [PATH]
- </text>
- <text name="not worn instructions">
- Para por uma máscara alpha nova, arraste a máscara do inventário para o seu avatar. Ou crie uma máscara nova.
- </text>
- <button label="Criar Alpha novo" label_selected="Criar Alpha novo" name="Create New"/>
- <text name="no modify instructions">
- Você não está autorizado a modificar este acessório.
- </text>
- <text name="Item Action Label">
- Alpha:
- </text>
- <texture_picker label="Alpha inferior" name="Lower Alpha" tool_tip="Selecionar imagem"/>
- <texture_picker label="Alpha de cima" name="Upper Alpha" tool_tip="Selecionar imagem"/>
- <texture_picker label="Cabeça Alpha" name="Head Alpha" tool_tip="Selecionar imagem"/>
- <texture_picker label="Olhos Alpha" name="Eye Alpha" tool_tip="Selecionar imagem"/>
- <texture_picker label="Cabelo alpha" name="Hair Alpha" tool_tip="Selecionar imagem"/>
- <button label="Tirar" label_selected="Tirar" name="Take Off"/>
- <button label="Salvar" label_selected="Salvar" name="Save"/>
- <button label="Salvar como..." label_selected="Salvar como..." name="Save As"/>
- <button label="Reverter" label_selected="Reverter" name="Revert"/>
- </panel>
- </tab_container>
- <scroll_container left="249" name="panel_container"/>
- <button label="Dados do script" label_selected="Dados do script" name="script_info" tool_tip="Mostrar scripts anexados ao seu avatar"/>
- <button label="Criar look" label_selected="Criar look" name="make_outfit_btn"/>
- <button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
- <button label="OK" label_selected="OK" name="Ok"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/pt/floater_day_cycle_options.xml
deleted file mode 100644
index 9560a3b418..0000000000
--- a/indra/newview/skins/default/xui/pt/floater_day_cycle_options.xml
+++ /dev/null
@@ -1,67 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Day Cycle Floater" title="EDITOR DE CICLO DE DIA">
- <tab_container name="Day Cycle Tabs">
- <panel label="Ciclo do dia" name="Day Cycle">
- <button label="?" name="WLDayCycleHelp"/>
- <text name="WL12am">
- 0:00
- </text>
- <text name="WL3am">
- 3:00
- </text>
- <text name="WL6am">
- 6:00
- </text>
- <text name="WL9amHash">
- 9:00
- </text>
- <text name="WL12pmHash">
- 12:00
- </text>
- <text name="WL3pm">
- 15:00
- </text>
- <text name="WL6pm">
- 18:00
- </text>
- <text name="WL9pm">
- 21:00
- </text>
- <text name="WL12am2">
- 24:00
- </text>
- <button label="Adicionar chave" label_selected="Adicionar chave" name="WLAddKey"/>
- <button label="Apagar chave" label_selected="Apagar chave" name="WLDeleteKey"/>
- <text name="WLCurKeyFrameText">
- Configurações de Quadro-chave:
- </text>
- <text name="WLCurKeyTimeText">
- Tempo-chave:
- </text>
- <spinner label="Hora" name="WLCurKeyHour"/>
- <spinner label="Minutos" name="WLCurKeyMin"/>
- <text name="WLCurKeyTimeText2">
- Ajuste-chave:
- </text>
- <combo_box label="Ajuste" name="WLKeyPresets"/>
- <text name="DayCycleText">
- Grudar:
- </text>
- <combo_box label="5 minutos" name="WLSnapOptions"/>
- <text name="DayCycleText2">
- Duração do Ciclo:
- </text>
- <spinner label="Hora" name="WLLengthOfDayHour"/>
- <spinner label="Min." name="WLLengthOfDayMin"/>
- <spinner label="Seg." name="WLLengthOfDaySec"/>
- <text name="DayCycleText3">
- Visualizar
- </text>
- <button label="Tocar" label_selected="Tocar" name="WLAnimSky"/>
- <button label="Pare!" label_selected="Pare" name="WLStopAnimSky"/>
- <button label="Usar o horário da Propriedade" label_selected="Ir para o horário da Propriedade" name="WLUseLindenTime"/>
- <button label="Salvar o Dia teste" label_selected="Salvar o Dia teste" name="WLSaveDayCycle"/>
- <button label="Carregar o Dia teste" label_selected="Carregar o Dia teste" name="WLLoadDayCycle"/>
- </panel>
- </tab_container>
-</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_delete_env_preset.xml b/indra/newview/skins/default/xui/pt/floater_delete_env_preset.xml
new file mode 100644
index 0000000000..a8b5d8f67d
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_delete_env_preset.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<floater name="Delete Env Preset" title="EXCLUIR CONF AMBIENTE">
+ <string name="title_water">
+ Excluir pré-configuração da água
+ </string>
+ <string name="title_sky">
+ Excluir pré-configuração de céu
+ </string>
+ <string name="title_day_cycle">
+ Excluir pré-configuração dos dias
+ </string>
+ <string name="label_water">
+ Pré-configuração:
+ </string>
+ <string name="label_sky">
+ Pré-configuração:
+ </string>
+ <string name="label_day_cycle">
+ Ciclo dia:
+ </string>
+ <string name="msg_confirm_deletion">
+ Tem certeza de que quer excluir esta pré-configuração?
+ </string>
+ <string name="msg_sky_is_referenced">
+ Impossível excluir pré-configuração utilizada por um ou mais ciclos de dia .
+ </string>
+ <string name="combo_label">
+ -Selecione uma pré-configuração-
+ </string>
+ <text name="label">
+ Pré-configuração:
+ </text>
+ <button label="Excluir" name="delete"/>
+ <button label="Cancelar" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_destinations.xml b/indra/newview/skins/default/xui/pt/floater_destinations.xml
new file mode 100644
index 0000000000..df18698d2f
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_destinations.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Destinations" title="DESTINOS"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_device_settings.xml b/indra/newview/skins/default/xui/pt/floater_device_settings.xml
deleted file mode 100644
index 48a4a6ef6f..0000000000
--- a/indra/newview/skins/default/xui/pt/floater_device_settings.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_device_settings" title="CONFIGURAÇÃO DE DISPOSITIVO DE VOZ"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_edit_day_cycle.xml b/indra/newview/skins/default/xui/pt/floater_edit_day_cycle.xml
new file mode 100644
index 0000000000..9e25938986
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_edit_day_cycle.xml
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Edit Day cycle" title="Editar ciclo dos dias">
+ <string name="title_new">
+ Criar novo ciclo de dias
+ </string>
+ <string name="title_edit">
+ Editar ciclo dos dias
+ </string>
+ <string name="hint_new">
+ Dê um nome ao seu ciclo dos dias, ajuste os controles para criá-lo e clique em &quot;Salvar&quot;.
+ </string>
+ <string name="hint_edit">
+ Para editar sua configuração do dia, ajuste os controles e clique em &quot;Salvar&quot;.
+ </string>
+ <string name="combo_label">
+ -Selecione uma pré-configuração-
+ </string>
+ <text name="label">
+ Nome:
+ </text>
+ <text name="note">
+ Observação: trocar o nome de uma pré-configuração criará uma nova sem modificar a uma pré-configuração atual.
+ </text>
+ <text name="hint_item1">
+ - Clique em uma guia para editar as configurações e horário de um céu.
+ </text>
+ <text name="hint_item2">
+ - Clique e arraste as guias para definir as transições.
+ </text>
+ <text name="hint_item3">
+ - Use a seta para rever o ciclo dos dias.
+ </text>
+ <panel name="day_cycle_slider_panel">
+ <multi_slider initial_value="0" name="WLTimeSlider"/>
+ <multi_slider initial_value="0" name="WLDayCycleKeys"/>
+ <button label="Adicionar chave" label_selected="Adicionar chave" name="WLAddKey"/>
+ <button label="Excluir chave" label_selected="Excluir chave" name="WLDeleteKey"/>
+ <text name="WL12am">
+ 24:00
+ </text>
+ <text name="WL3am">
+ 03:00
+ </text>
+ <text name="WL6am">
+ 06:00
+ </text>
+ <text name="WL9amHash">
+ 09:00
+ </text>
+ <text name="WL12pmHash">
+ 12:00
+ </text>
+ <text name="WL3pm">
+ 15:00
+ </text>
+ <text name="WL6pm">
+ 18:00
+ </text>
+ <text name="WL9pm">
+ 21:00
+ </text>
+ <text name="WL12am2">
+ 24:00
+ </text>
+ <text name="WL12amHash">
+ |
+ </text>
+ <text name="WL3amHash">
+ I
+ </text>
+ <text name="WL6amHash">
+ |
+ </text>
+ <text name="WL9amHash2">
+ I
+ </text>
+ <text name="WL12pmHash2">
+ |
+ </text>
+ <text name="WL3pmHash">
+ I
+ </text>
+ <text name="WL6pmHash">
+ |
+ </text>
+ <text name="WL9pmHash">
+ I
+ </text>
+ <text name="WL12amHash2">
+ |
+ </text>
+ </panel>
+ <text name="WLCurKeyPresetText">
+ Configuração do céu:
+ </text>
+ <combo_box label="Pré-configuração" name="WLSkyPresets"/>
+ <text name="WLCurKeyTimeText">
+ Hora:
+ </text>
+ <time name="time" value="06:00"/>
+ <check_box label="Usar como novo ciclo de dias" name="make_default_cb"/>
+ <button label="Salvar" name="save"/>
+ <button label="Cancelar" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_edit_sky_preset.xml b/indra/newview/skins/default/xui/pt/floater_edit_sky_preset.xml
new file mode 100644
index 0000000000..1f1fbcce7e
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_edit_sky_preset.xml
@@ -0,0 +1,143 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Edit Sky Preset" title="Editar pré-configuração do céu">
+ <string name="title_new">
+ Criar nova pré-configuração de céu
+ </string>
+ <string name="title_edit">
+ Editar pré-configuração do céu
+ </string>
+ <string name="hint_new">
+ Dê um nome à sua pré-configuração, ajuste os controles para criá-la e clique em &quot;Salvar&quot;.
+ </string>
+ <string name="hint_edit">
+ Para editar sua pré-configuração do céu, ajuste os controles e clique em &quot;Salvar&quot;.
+ </string>
+ <string name="combo_label">
+ -Selecione uma pré-configuração-
+ </string>
+ <text name="hint">
+ Para editar sua pré-configuração do céu, ajuste os controles e clique em &quot;Salvar&quot;.
+ </text>
+ <text name="label">
+ Nome:
+ </text>
+ <text name="note">
+ Observação: trocar o nome de uma pré-configuração criará uma nova sem modificar a pré-configuração atual.
+ </text>
+ <tab_container name="WindLight Tabs">
+ <panel label="ATMOSFERA" name="Atmosphere">
+ <text name="BHText">
+ Horizonte azul
+ </text>
+ <text name="BDensText">
+ Horizonte com névoa
+ </text>
+ <text name="BDensText2">
+ Densidade azul
+ </text>
+ <text name="HDText">
+ Densidade da névoa
+ </text>
+ <text name="DensMultText">
+ Multiplicador de densidade
+ </text>
+ <text name="WLDistanceMultText">
+ Multiplicador de distância
+ </text>
+ <text name="MaxAltText">
+ Altitude máxima
+ </text>
+ </panel>
+ <panel label="ILUMINAÇÃO" name="Lighting">
+ <text name="SLCText">
+ Cor do sol/lua
+ </text>
+ <text name="WLAmbientText">
+ Ambiente
+ </text>
+ <text name="SunGlowText">
+ Brilho do sol
+ </text>
+ <slider label="Foco" name="WLGlowB"/>
+ <slider label="Tamanho" name="WLGlowR"/>
+ <text name="WLStarText">
+ Brilho das estrelas
+ </text>
+ <text name="SceneGammaText">
+ Raios gama
+ </text>
+ <text name="TODText">
+ Posição do sol/lua
+ </text>
+ <multi_slider initial_value="0" name="WLSunPos"/>
+ <text name="WL12amHash">
+ |
+ </text>
+ <text name="WL6amHash">
+ |
+ </text>
+ <text name="WL12pmHash2">
+ |
+ </text>
+ <text name="WL6pmHash">
+ |
+ </text>
+ <text name="WL12amHash2">
+ |
+ </text>
+ <text name="WL12am">
+ 24:00
+ </text>
+ <text name="WL6am">
+ 06:00
+ </text>
+ <text name="WL12pmHash">
+ 12:00
+ </text>
+ <text name="WL6pm">
+ 18:00
+ </text>
+ <text name="WL12am2">
+ 24:00
+ </text>
+ <time name="WLDayTime" value="06:00"/>
+ <text name="WLEastAngleText">
+ Ângulo leste
+ </text>
+ </panel>
+ <panel label="NUVENS" name="Clouds">
+ <text name="WLCloudColorText">
+ Cor das nuvens
+ </text>
+ <text name="WLCloudColorText2">
+ XY / densidade das nuvens
+ </text>
+ <slider label="X" name="WLCloudX"/>
+ <slider label="Y" name="WLCloudY"/>
+ <slider label="D" name="WLCloudDensity"/>
+ <text name="WLCloudCoverageText">
+ Cobertura das nuvens
+ </text>
+ <text name="WLCloudScaleText">
+ Escala das nuvens
+ </text>
+ <text name="WLCloudDetailText">
+ Detalhe das nuvens (XY / densidade)
+ </text>
+ <slider label="X" name="WLCloudDetailX"/>
+ <slider label="Y" name="WLCloudDetailY"/>
+ <slider label="D" name="WLCloudDetailDensity"/>
+ <text name="WLCloudScrollXText">
+ Passagem das nuvens X
+ </text>
+ <check_box label="Fixar" name="WLCloudLockX"/>
+ <text name="WLCloudScrollYText">
+ Passagem das nuvens Y
+ </text>
+ <check_box label="Fixar" name="WLCloudLockY"/>
+ </panel>
+ </tab_container>
+ <check_box label="Usar esta pré-configuração como meu novo céu" name="make_default_cb"/>
+ <button label="Salvar" name="save"/>
+ <button label="Cancelar" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_edit_water_preset.xml b/indra/newview/skins/default/xui/pt/floater_edit_water_preset.xml
new file mode 100644
index 0000000000..7bde22851e
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_edit_water_preset.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Edit Water Preset" title="Editar pré-configuração da água">
+ <string name="title_new">
+ Criar nova pré-configuração de água
+ </string>
+ <string name="title_edit">
+ Editar pré-configuração da água
+ </string>
+ <string name="hint_new">
+ Dê um nome à sua pré-configuração, ajuste os controles para criá-la e clique em &quot;Salvar&quot;.
+ </string>
+ <string name="hint_edit">
+ Para editar sua pré-configuração de água, ajuste os controles e clique em &quot;Salvar&quot;.
+ </string>
+ <string name="combo_label">
+ -Selecione uma pré-configuração-
+ </string>
+ <text name="hint">
+ Para editar sua pré-configuração, ajuste os controles e clique em &quot;Salvar&quot;.
+ </text>
+ <text name="label">
+ Nome da pré-configuração:
+ </text>
+ <text name="note">
+ Observação: trocar o nome de uma pré-configuração criará uma nova sem modificar a configuração atual.
+ </text>
+ <panel name="panel_water_preset">
+ <text name="water_color_label">
+ Cor da névoa da água
+ </text>
+ <text name="water_fog_density_label">
+ Expoente da densidade da névoa
+ </text>
+ <text name="underwater_fog_modifier_label">
+ Modificador de névoa submerso
+ </text>
+ <text name="BHText">
+ Direção de onda grande
+ </text>
+ <slider label="X" name="WaterWave1DirX"/>
+ <slider label="Y" name="WaterWave1DirY"/>
+ <text name="BDensText">
+ Escala de ondas de reflexo
+ </text>
+ <text name="HDText">
+ Escala de Fresnel
+ </text>
+ <text name="FresnelOffsetText">
+ Recuo de Fresnel
+ </text>
+ <text name="BHText2">
+ Direção de onda pequena
+ </text>
+ <slider label="X" name="WaterWave2DirX"/>
+ <slider label="Y" name="WaterWave2DirY"/>
+ <text name="DensMultText">
+ Escala de refração acima
+ </text>
+ <text name="WaterScaleBelowText">
+ Escala de refração abaixo
+ </text>
+ <text name="MaxAltText">
+ Multiplicador de distorção
+ </text>
+ <text name="BHText3">
+ Mapa normal
+ </text>
+ </panel>
+ <check_box label="Usar esta pré-configuração na minha água" name="make_default_cb"/>
+ <button label="Salvar" name="save"/>
+ <button label="Cancelar" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_env_settings.xml b/indra/newview/skins/default/xui/pt/floater_env_settings.xml
deleted file mode 100644
index 3ca8d934c9..0000000000
--- a/indra/newview/skins/default/xui/pt/floater_env_settings.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Environment Editor Floater" title="EDITOR DO AMBIENTE">
- <floater.string name="timeStr">
- [hour12,datetime,utc]:[min,datetime,utc] [ampm,datetime,utc]
- </floater.string>
- <text name="EnvTimeText">
- Hora do Dia
- </text>
- <text name="EnvTimeText2">
- 12:00 PM
- </text>
- <text name="EnvCloudText">
- Cobertura de
-Nuvens
- </text>
- <text name="EnvWaterColorText">
- Cor da água
- </text>
- <color_swatch label="" name="EnvWaterColor" tool_tip="Selecionar a cor"/>
- <text name="EnvWaterFogText">
- Névoa da
-água
- </text>
- <button bottom="-144" label="Usar hora da propriedade" name="EnvUseEstateTimeButton" width="155"/>
- <button label="Céu Avançado" left="167" name="EnvAdvancedSkyButton" width="155"/>
- <button label="Ãgua Avançada" left="326" name="EnvAdvancedWaterButton" width="155"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_environment_settings.xml b/indra/newview/skins/default/xui/pt/floater_environment_settings.xml
new file mode 100644
index 0000000000..4055ba97ef
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_environment_settings.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Environment Editor Floater" title="AMBIENTE">
+ <text name="note">
+ Use as opções abaixo para personalizar as configurações de ambiente no visualizador.
+ </text>
+ <radio_group name="region_settings_radio_group">
+ <radio_item label="Usar configurações da região" name="use_region_settings"/>
+ <radio_item label="Personalizar meu ambiente" name="use_my_settings"/>
+ </radio_group>
+ <panel name="user_environment_settings">
+ <text name="note">
+ Observação: suas configurações não se aplicam aos outros usuários.
+ </text>
+ <text name="water_settings_title">
+ Configuração de água
+ </text>
+ <combo_box name="water_settings_preset_combo">
+ <combo_box.item label="-Selecione uma pré-configuração-" name="item0"/>
+ </combo_box>
+ <text name="sky_dayc_settings_title">
+ Ciclo céu / dia
+ </text>
+ <radio_group name="sky_dayc_settings_radio_group">
+ <radio_item label="Céu fixo" name="my_sky_settings"/>
+ <radio_item label="Ciclo dia" name="my_dayc_settings"/>
+ </radio_group>
+ <combo_box name="sky_settings_preset_combo">
+ <combo_box.item label="-Selecione uma pré-configuração-" name="item0"/>
+ </combo_box>
+ <combo_box name="dayc_settings_preset_combo">
+ <combo_box.item label="-Selecione uma pré-configuração-" name="item0"/>
+ </combo_box>
+ </panel>
+ <button label="OK" name="ok_btn"/>
+ <button label="Cancelar" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_fast_timers.xml b/indra/newview/skins/default/xui/pt/floater_fast_timers.xml
new file mode 100644
index 0000000000..eeb39583ef
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_fast_timers.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="fast_timers">
+ <string name="pause">
+ Pausa
+ </string>
+ <string name="run">
+ Correr
+ </string>
+ <button label="Pausa" name="pause_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_hardware_settings.xml b/indra/newview/skins/default/xui/pt/floater_hardware_settings.xml
index c666a941fe..1bc2bce768 100644
--- a/indra/newview/skins/default/xui/pt/floater_hardware_settings.xml
+++ b/indra/newview/skins/default/xui/pt/floater_hardware_settings.xml
@@ -4,7 +4,7 @@
Filtragem:
</text>
<check_box label="Filtragem Anisotrópica (mais lento quando habilitada)" name="ani"/>
- <text name="Antialiasing:">
+ <text name="antialiasing label">
Suavização:
</text>
<combo_box label="Suavização" name="fsaa" width="94">
@@ -14,6 +14,9 @@
<combo_box.item label="8x" name="8x"/>
<combo_box.item label="16x" name="16x"/>
</combo_box>
+ <text name="antialiasing restart">
+ (Reinicie para ativar)
+ </text>
<spinner label="Gama:" name="gamma"/>
<text name="(brightness, lower is brighter)">
(0 = brilho padrão, menor = mais brilho)
diff --git a/indra/newview/skins/default/xui/pt/floater_how_to.xml b/indra/newview/skins/default/xui/pt/floater_how_to.xml
new file mode 100644
index 0000000000..15c4946cb0
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_how_to.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_how_to" title="COMO"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_image_preview.xml b/indra/newview/skins/default/xui/pt/floater_image_preview.xml
index 3582923ed0..362a553d64 100644
--- a/indra/newview/skins/default/xui/pt/floater_image_preview.xml
+++ b/indra/newview/skins/default/xui/pt/floater_image_preview.xml
@@ -10,7 +10,7 @@
Prévia da
imagem como:
</text>
- <combo_box label="Tipo de Roupas" left="100" name="clothing_type_combo" width="186">
+ <combo_box label="Tipo de Roupas" name="clothing_type_combo">
<item label="Imagem" name="Image" value="Imagem"/>
<item label="Cabelo" name="Hair" value="Cabelo"/>
<item label="Cabeça de mulher" name="FemaleHead" value="Cabeça de mulher"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_import_collada.xml b/indra/newview/skins/default/xui/pt/floater_import_collada.xml
new file mode 100644
index 0000000000..ad55d416c3
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_import_collada.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Import Collada" title="Importar cena">
+ <text name="mesh count">
+ Meshes: [COUNT]
+ </text>
+ <text name="texture count">
+ Texturas: [COUNT]
+ </text>
+ <text name="status">
+ Status: [STATUS]
+ </text>
+ <button label="Cancelar" name="cancel"/>
+ <button label="OK" name="ok"/>
+ <string name="status_idle">
+ Inativo
+ </string>
+ <string name="status_uploading">
+ Carregando [NAME]
+ </string>
+ <string name="status_creating">
+ Criando objeto [NAME]
+ </string>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/pt/floater_inventory_item_properties.xml
index 8fe69c097d..8a8f1f5b34 100644
--- a/indra/newview/skins/default/xui/pt/floater_inventory_item_properties.xml
+++ b/indra/newview/skins/default/xui/pt/floater_inventory_item_properties.xml
@@ -24,16 +24,10 @@
<text name="LabelCreatorTitle">
Criador:
</text>
- <text name="LabelCreatorName">
- Nicole Linden
- </text>
<button label="Perfil..." label_selected="" name="BtnCreator"/>
<text name="LabelOwnerTitle">
Dono:
</text>
- <text name="LabelOwnerName">
- Thrax Linden
- </text>
<button label="Perfil..." label_selected="" name="BtnOwner"/>
<text name="LabelAcquiredTitle">
Adquirido:
diff --git a/indra/newview/skins/default/xui/pt/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/pt/floater_inventory_view_finder.xml
index d21e574011..71759abdc2 100644
--- a/indra/newview/skins/default/xui/pt/floater_inventory_view_finder.xml
+++ b/indra/newview/skins/default/xui/pt/floater_inventory_view_finder.xml
@@ -5,6 +5,7 @@
<check_box label="Roupas" name="check_clothing"/>
<check_box label="Gestos" name="check_gesture"/>
<check_box label="Landmarks" name="check_landmark"/>
+ <check_box label="Meshes:" name="check_mesh"/>
<check_box label="Anotações" name="check_notecard"/>
<check_box label="Objetos" name="check_object"/>
<check_box label="Scripts" name="check_script"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_map.xml b/indra/newview/skins/default/xui/pt/floater_map.xml
index 38c2647199..8233f2a43f 100644
--- a/indra/newview/skins/default/xui/pt/floater_map.xml
+++ b/indra/newview/skins/default/xui/pt/floater_map.xml
@@ -1,10 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Map" title="">
+<floater name="Map" title="MINI MAPA">
<floater.string name="ToolTipMsg">
[REGION](Clique duas vezes para abrir o mapa, shift+arraste para a visão pan)
</floater.string>
+ <floater.string name="AltToolTipMsg">
+ [REGION](Clique duas vezes para teletransportar, shift+arraste para a visão pan)
+ </floater.string>
<floater.string name="mini_map_caption">
- MINIMAPA
+ Mini Mapa
</floater.string>
<text label="N" name="floater_map_north" text="N">
N
diff --git a/indra/newview/skins/default/xui/pt/floater_merchant_outbox.xml b/indra/newview/skins/default/xui/pt/floater_merchant_outbox.xml
new file mode 100644
index 0000000000..bb6113671b
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_merchant_outbox.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_merchant_outbox" title="CAIXA DE SAÃDA DO LOJISTA">
+ <string name="OutboxFolderCount1">
+ 1 pasta
+ </string>
+ <string name="OutboxFolderCountN">
+ [NUM] pasta(s)
+ </string>
+ <string name="OutboxImporting">
+ Enviando pastas...
+ </string>
+ <string name="OutboxInitializing">
+ Iniciando...
+ </string>
+ <panel label="">
+ <panel>
+ <panel name="outbox_inventory_placeholder_panel">
+ <text name="outbox_inventory_placeholder_title">
+ Carregando...
+ </text>
+ </panel>
+ </panel>
+ <panel>
+ <button label="Enviar para Mercado" name="outbox_import_btn" tool_tip="Enviar para a Frente da loja do meu Mercado"/>
+ </panel>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_model_preview.xml b/indra/newview/skins/default/xui/pt/floater_model_preview.xml
new file mode 100644
index 0000000000..8960500831
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_model_preview.xml
@@ -0,0 +1,277 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Model Preview" title="CARREGAR MODELO">
+ <string name="status_idle"/>
+ <string name="status_parse_error">
+ Erro: Problema ao analisar .dae - consulte log para obter detalhes.
+ </string>
+ <string name="status_material_mismatch">
+ Erro: o material do modelo não é um subconjunto do modelo de referência.
+ </string>
+ <string name="status_reading_file">
+ Carregando...
+ </string>
+ <string name="status_generating_meshes">
+ Gerando meshes...
+ </string>
+ <string name="status_vertex_number_overflow">
+ Erro: Número de Vertex acima de 65534. Abortado.
+ </string>
+ <string name="bad_element">
+ Erro: elemento inválido
+ </string>
+ <string name="high">
+ Alto
+ </string>
+ <string name="medium">
+ Média
+ </string>
+ <string name="low">
+ Baixo
+ </string>
+ <string name="lowest">
+ Mais baixo
+ </string>
+ <string name="mesh_status_good">
+ Entregar!
+ </string>
+ <string name="mesh_status_na">
+ N/D
+ </string>
+ <string name="mesh_status_none">
+ Nenhum
+ </string>
+ <string name="mesh_status_submesh_mismatch">
+ Cada nível de detalhamento têm um número de faces para textura.
+ </string>
+ <string name="mesh_status_mesh_mismatch">
+ Cada nível de detalhamento têm um número de faces para textura.
+ </string>
+ <string name="mesh_status_too_many_vertices">
+ O nível de detalhamento possui vértices demais.
+ </string>
+ <string name="mesh_status_missing_lod">
+ Falta o nível de detalhamento necessário.
+ </string>
+ <string name="mesh_status_invalid_material_list">
+ Materiais LOD não são um subconjunto de modelo de referência.
+ </string>
+ <string name="layer_all">
+ Tudo
+ </string>
+ <string name="decomposing">
+ Analisando...
+ </string>
+ <string name="simplifying">
+ Simplificando...
+ </string>
+ <string name="tbd">
+ A ser definido
+ </string>
+ <panel name="left_panel">
+ <panel name="model_name_representation_panel">
+ <text name="name_label">
+ Nome do modelo:
+ </text>
+ <text name="model_category_label">
+ Esse modelo representa...
+ </text>
+ <combo_box name="model_category_combo">
+ <combo_item label="Escolher uma..." name="Choose one"/>
+ <combo_item label="Forma do avatar" name="Avatar shape"/>
+ <combo_item label="Anexo de avatar" name="Avatar attachment"/>
+ <combo_item label="Objeto em movimento (veículo, animal)" name="Moving object (vehicle, animal)"/>
+ <combo_item label="Material de construção" name="Building Component"/>
+ <combo_item label="Grande, sem movimentação etc" name="Large, non moving etc"/>
+ <combo_item label="Menor, sem movimentação etc" name="Smaller, non-moving etc"/>
+ <combo_item label="Nenhuma dessas, na verdade" name="Not really any of these"/>
+ </combo_box>
+ </panel>
+ <tab_container name="import_tab">
+ <panel label="Nível de detalhe" name="lod_panel" title="Nível de detalhe">
+ <text initial_value="Origem" name="source" value="Origem"/>
+ <text initial_value="Triângulos" name="triangles" value="Triângulos"/>
+ <text initial_value="Vértices" name="vertices" value="Vértices"/>
+ <text initial_value="Alto" name="high_label" value="Alto"/>
+ <button label="Procurar..." name="lod_browse_high"/>
+ <text initial_value="0" name="high_triangles" value="0"/>
+ <text initial_value="0" name="high_vertices" value="0"/>
+ <text initial_value="Médio" name="medium_label" value="Médio"/>
+ <button label="Procurar..." name="lod_browse_medium"/>
+ <text initial_value="0" name="medium_triangles" value="0"/>
+ <text initial_value="0" name="medium_vertices" value="0"/>
+ <text initial_value="Baixo" name="low_label" value="Baixo"/>
+ <button label="Procurar..." name="lod_browse_low"/>
+ <text initial_value="0" name="low_triangles" value="0"/>
+ <text initial_value="0" name="low_vertices" value="0"/>
+ <text initial_value="Mais baixo" name="lowest_label" value="Mais baixo"/>
+ <button label="Procurar..." name="lod_browse_lowest"/>
+ <text initial_value="0" name="lowest_triangles" value="0"/>
+ <text initial_value="0" name="lowest_vertices" value="0"/>
+ <check_box label="Gerar normais" name="gen_normals"/>
+ <text initial_value="Ângulo de dobra:" name="crease_label" value="Ângulo de dobra:"/>
+ <spinner name="crease_angle" value="75"/>
+ </panel>
+ <panel label="Físico" name="physics_panel">
+ <panel name="physics geometry">
+ <text name="first_step_name">
+ Etapa 1: Nível de detalhe
+ </text>
+ <combo_box name="physics_lod_combo" tool_tip="LOD a ser usada para forma física">
+ <combo_item name="choose_one">
+ Escolher uma...
+ </combo_item>
+ <combo_item name="physics_high">
+ Alto
+ </combo_item>
+ <combo_item name="physics_medium">
+ Médio
+ </combo_item>
+ <combo_item name="physics_low">
+ Baixo
+ </combo_item>
+ <combo_item name="physics_lowest">
+ Mais baixo
+ </combo_item>
+ <combo_item name="load_from_file">
+ Do arquivo
+ </combo_item>
+ </combo_box>
+ <button label="Procurar..." name="physics_browse"/>
+ </panel>
+ <panel name="physics analysis">
+ <text name="method_label">
+ Etapa 2: Analisar
+ </text>
+ <text name="analysis_method_label">
+ Método:
+ </text>
+ <text name="quality_label">
+ Qualidade:
+ </text>
+ <text name="smooth_method_label">
+ Liso:
+ </text>
+ <check_box label="Fechar orifícios" name="Close Holes (Slow)"/>
+ <button label="Analisar" name="Decompose"/>
+ <button label="Cancelar" name="decompose_cancel"/>
+ </panel>
+ <panel name="physics simplification">
+ <text name="second_step_label">
+ Etapa 3: Simplificar
+ </text>
+ <text name="simp_method_header">
+ Método:
+ </text>
+ <text name="pass_method_header">
+ Passes:
+ </text>
+ <text name="Detail Scale label">
+ Escala de detalhes:
+ </text>
+ <text name="Retain%_label">
+ Reter:
+ </text>
+ <combo_box name="Combine Quality" value="1"/>
+ <button label="Simplificar" name="Simplify"/>
+ <button label="Cancelar" name="simplify_cancel"/>
+ </panel>
+ <panel name="physics info">
+ <text name="results_text">
+ Resultados:
+ </text>
+ <text name="physics_triangles">
+ Triângulos: [TRIANGLES],
+ </text>
+ <text name="physics_points">
+ Vértices: [POINTS],
+ </text>
+ <text name="physics_hulls">
+ Corpos: [HULLS]
+ </text>
+ </panel>
+ </panel>
+ <panel label="Carregar opções" name="modifiers_panel">
+ <text name="scale_label">
+ Escala (1=sem escala):
+ </text>
+ <spinner name="import_scale" value="1.0"/>
+ <text name="dimensions_label">
+ Dimensões:
+ </text>
+ <text name="import_dimensions">
+ [X] X [Y] X [Z]
+ </text>
+ <check_box label="Incluir texturas" name="upload_textures"/>
+ <text name="include_label">
+ Somente para modelos de avatar:
+ </text>
+ <check_box label="Incluir peso da pele" name="upload_skin"/>
+ <check_box label="Incluir posições de junções" name="upload_joints"/>
+ <text name="pelvis_offset_label">
+ Desvio Z (subir ou baixar avatar):
+ </text>
+ <spinner name="pelvis_offset" value="0.0"/>
+ </panel>
+ </tab_container>
+ <panel name="weights_and_warning_panel">
+ <button label="Calcular pesos e tarifa" name="calculate_btn" tool_tip="Calcular pesos e tarifa"/>
+ <button label="Cancelar" name="cancel_btn"/>
+ <button label="Upload" name="ok_btn" tool_tip="Carregar no simulador"/>
+ <button label="Limpar configurações e redefinir formulário" name="reset_btn"/>
+ <text name="upload_fee">
+ Tarifa de upload: L$ [FEE]
+ </text>
+ <text name="prim_weight">
+ Impacto no terreno: [EQ]
+ </text>
+ <text name="download_weight">
+ Download: [ST]
+ </text>
+ <text name="physics_weight">
+ Físico: [PH]
+ </text>
+ <text name="server_weight">
+ Servidor: [SIM]
+ </text>
+ <text name="warning_title">
+ NOTA:
+ </text>
+ <text name="warning_message">
+ Você não tem direito para fazer upload de modelos mesh. [[VURL] Saiba como] obter certificado.
+ </text>
+ <text name="status">
+ [STATUS]
+ </text>
+ </panel>
+ </panel>
+ <text name="lod_label">
+ Visualizar
+ </text>
+ <panel name="right_panel">
+ <combo_box name="preview_lod_combo" tool_tip="LOD para exibir na renderização de visualização">
+ <combo_item name="high">
+ Alto
+ </combo_item>
+ <combo_item name="medium">
+ Médio
+ </combo_item>
+ <combo_item name="low">
+ Baixo
+ </combo_item>
+ <combo_item name="lowest">
+ Mais baixo
+ </combo_item>
+ </combo_box>
+ <text name="label_display">
+ Visualização...
+ </text>
+ <check_box label="Limites" name="show_edges"/>
+ <check_box label="Físico" name="show_physics"/>
+ <check_box label="Texturas" name="show_textures"/>
+ <check_box label="Pesos de pele" name="show_skin_weight"/>
+ <check_box label="Junções" name="show_joint_positions"/>
+ <text name="physics_explode_label">
+ Visualizar extensão:
+ </text>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_moveview.xml b/indra/newview/skins/default/xui/pt/floater_moveview.xml
index b1dc65e3af..728357a400 100644
--- a/indra/newview/skins/default/xui/pt/floater_moveview.xml
+++ b/indra/newview/skins/default/xui/pt/floater_moveview.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="move_floater">
+<floater name="move_floater" title="ANDAR/CORRER/VOAR">
<string name="walk_forward_tooltip">
Andar para frente (flecha para cima ou W)
</string>
@@ -58,14 +58,14 @@
Voar
</string>
<panel name="panel_actions">
- <button label="" label_selected="" name="move up btn" tool_tip="Voar para cima (tecla E)"/>
<button label="" label_selected="" name="turn left btn" tool_tip="Virar à esquerda (flecha ESQ ou A)"/>
<joystick_slide name="move left btn" tool_tip="Andar para a esquerda (Shift + Seta esquerda ou A)"/>
- <button label="" label_selected="" name="move down btn" tool_tip="Voar para baixo (tecla C)"/>
<button label="" label_selected="" name="turn right btn" tool_tip="Virar à direita (flecha DIR ou D)"/>
<joystick_slide name="move right btn" tool_tip="Andar para a direita (Shift + Seta direita ou D)"/>
<joystick_turn name="forward btn" tool_tip="Andar para frente (flecha para cima ou W)"/>
<joystick_turn name="backward btn" tool_tip="Andar para trás (flecha para baixo ou S)"/>
+ <button label="" label_selected="" name="move up btn" tool_tip="Voar para cima (tecla E)"/>
+ <button label="" label_selected="" name="move down btn" tool_tip="Voar para baixo (tecla C)"/>
</panel>
<panel name="panel_modes">
<button label="" name="mode_walk_btn" tool_tip="Modo caminhar"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_my_appearance.xml b/indra/newview/skins/default/xui/pt/floater_my_appearance.xml
new file mode 100644
index 0000000000..38e06d2aed
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_my_appearance.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_my_appearance" title="APARÊNCIA">
+ <panel label="Editar aparência" name="main_panel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_my_inventory.xml b/indra/newview/skins/default/xui/pt/floater_my_inventory.xml
new file mode 100644
index 0000000000..71d8682758
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_my_inventory.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_my_inventory" title="INVENTÃRIO"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_nearby_chat.xml b/indra/newview/skins/default/xui/pt/floater_nearby_chat.xml
index 60edfa505f..653861f7d8 100644
--- a/indra/newview/skins/default/xui/pt/floater_nearby_chat.xml
+++ b/indra/newview/skins/default/xui/pt/floater_nearby_chat.xml
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="nearby_chat" title="Bate-papo local">
- <check_box label="Traduzir bate-papo (via Google)" name="translate_chat_checkbox"/>
+ <check_box label="Traduzir bate-papo" name="translate_chat_checkbox"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_object_weights.xml b/indra/newview/skins/default/xui/pt/floater_object_weights.xml
new file mode 100644
index 0000000000..45bd1c7127
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_object_weights.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="object_weights" title="AVANÇADO">
+ <floater.string name="nothing_selected" value="--"/>
+ <text name="selected_text" value="SELECIONADO"/>
+ <text name="objects" value="--"/>
+ <text name="objects_label" value="Objetos"/>
+ <text name="prims" value="--"/>
+ <text name="prims_label" value="Prims"/>
+ <text name="weights_of_selected_text" value="PESOS DOS SELECIONADOS"/>
+ <text name="download" value="--"/>
+ <text name="download_label" value="Baixar"/>
+ <text name="physics" value="--"/>
+ <text name="physics_label" value="Físico"/>
+ <text name="server" value="--"/>
+ <text name="server_label" value="Servidor"/>
+ <text name="display" value="--"/>
+ <text name="display_label" value="Visualização"/>
+ <text name="land_impacts_text" value="IMPACTOS NO TERRENO"/>
+ <text name="selected" value="--"/>
+ <text name="selected_label" value="Selecionado"/>
+ <text name="rezzed_on_land" value="--"/>
+ <text name="rezzed_on_land_label" value="Resolução no terreno"/>
+ <text name="remaining_capacity" value="--"/>
+ <text name="remaining_capacity_label" value="Capacidade restante"/>
+ <text name="total_capacity" value="--"/>
+ <text name="total_capacity_label" value="Capacidade total"/>
+ <text name="help_SLURL" value="[secondlife:///app/help/object_weights What is all this?...]"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_outfit_save_as.xml b/indra/newview/skins/default/xui/pt/floater_outfit_save_as.xml
new file mode 100644
index 0000000000..60d4d3dc5c
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_outfit_save_as.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="modal container" title="SALVAR LOOK"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_pay.xml b/indra/newview/skins/default/xui/pt/floater_pay.xml
index 26d5710c4a..8094ad376c 100644
--- a/indra/newview/skins/default/xui/pt/floater_pay.xml
+++ b/indra/newview/skins/default/xui/pt/floater_pay.xml
@@ -6,18 +6,18 @@
<string name="payee_resident">
Pagar residente
</string>
- <text left="5" name="payee_label" width="110">
+ <text left="5" name="payee_label">
Pagar:
</text>
<icon name="icon_person" tool_tip="Pessoa"/>
- <text left="115" name="payee_name">
+ <text name="payee_name">
Test Name That Is Extremely Long To Check Clipping
</text>
- <button label="L$1" label_selected="L$1" left="112" name="fastpay 1"/>
+ <button label="L$1" label_selected="L$1" name="fastpay 1"/>
<button label="L$5" label_selected="L$5" name="fastpay 5"/>
- <button label="L$10" label_selected="L$10" left="112" name="fastpay 10"/>
+ <button label="L$10" label_selected="L$10" name="fastpay 10"/>
<button label="L$20" label_selected="L$20" name="fastpay 20"/>
- <text left="4" name="amount text">
+ <text name="amount text">
Outro valor:
</text>
<button label="Pagar" label_selected="Pagar" name="pay btn"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_people.xml b/indra/newview/skins/default/xui/pt/floater_people.xml
new file mode 100644
index 0000000000..10a516ee36
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_people.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_people" title="PESSOAS">
+ <panel_container name="main_panel">
+ <panel label="Perfil do grupo" name="panel_group_info_sidetray"/>
+ <panel label="Residentes e objetos bloqueados" name="panel_block_list_sidetray"/>
+ </panel_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_picks.xml b/indra/newview/skins/default/xui/pt/floater_picks.xml
new file mode 100644
index 0000000000..9766196319
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_picks.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_picks" title="Destaques"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_places.xml b/indra/newview/skins/default/xui/pt/floater_places.xml
new file mode 100644
index 0000000000..12c6548205
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_places.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_places" title="LUGARES">
+ <panel label="Lugares" name="main_panel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_preferences.xml b/indra/newview/skins/default/xui/pt/floater_preferences.xml
index 2c76a72ca8..c89a61d9b1 100644
--- a/indra/newview/skins/default/xui/pt/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/pt/floater_preferences.xml
@@ -5,10 +5,12 @@
<tab_container name="pref core">
<panel label="Geral" name="general"/>
<panel label="Vídeo" name="display"/>
- <panel label="Privacidade" name="im"/>
<panel label="Som e mídia" name="audio"/>
<panel label="Bate-papo" name="chat"/>
+ <panel label="Mover e ver" name="move"/>
<panel label="Notificações" name="msgs"/>
+ <panel label="Cores" name="colors"/>
+ <panel label="Privacidade" name="im"/>
<panel label="Configurações" name="input"/>
<panel label="Avançado" name="advanced1"/>
</tab_container>
diff --git a/indra/newview/skins/default/xui/pt/floater_preferences_proxy.xml b/indra/newview/skins/default/xui/pt/floater_preferences_proxy.xml
new file mode 100644
index 0000000000..3aaee2d4a7
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_preferences_proxy.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Proxy Settings Floater" title="Configurações de proxy">
+ <check_box initial_value="false" label="Use proxy HTTP para páginas da Web" name="web_proxy_enabled"/>
+ <text name="http_proxy_label">
+ Proxy HTTP:
+ </text>
+ <line_editor name="web_proxy_editor" tool_tip="O nome DNS ou endereço IP do proxy HTTP que você deseja usar."/>
+ <spinner label="Porta:" name="web_proxy_port" tool_tip="A porta do proxy HTTP que você deseja usar."/>
+ <check_box label="Use o proxy SOCKS 5 para tráfego de UDP" name="socks_proxy_enabled"/>
+ <text name="socks5_proxy_label">
+ Proxy SOCKS 5:
+ </text>
+ <line_editor name="socks_proxy_editor" tool_tip="O nome DNS ou endereço IP do proxy SOCKS 5 que você deseja usar."/>
+ <spinner label="Porta:" name="socks_proxy_port" tool_tip="A porta do proxy SOCKS 5 que você deseja usar."/>
+ <text name="socks_auth_label">
+ Autenticação SOCKS:
+ </text>
+ <radio_group name="socks5_auth_type">
+ <radio_item label="Sem autenticação" name="Socks5NoAuth" tool_tip="O proxy Socks5 não requer autenticação." value="Nenhum"/>
+ <radio_item label="Nome de usuário/senha" name="Socks5UserPass" tool_tip="O proxy Socks5 requer autenticação de nome de usuário/senha." value="UserPass"/>
+ </radio_group>
+ <text name="socks5_username_label">
+ Nome de usuário:
+ </text>
+ <text name="socks5_password_label">
+ Senha:
+ </text>
+ <line_editor name="socks5_username" tool_tip="O nome de usuário usado para autenticar seu servidor SOCKS 5"/>
+ <line_editor name="socks5_password" tool_tip="A senha usada para autenticar seu servidor SOCKS 5"/>
+ <text name="other_proxy_label">
+ Outro proxy de tráfego HTTP:
+ </text>
+ <radio_group name="other_http_proxy_type">
+ <radio_item label="Não enviar para proxy" name="OtherNoProxy" tool_tip="O tráfego HTTP que não seja da Web NÃO será enviado a qualquer proxy." value="Nenhum"/>
+ <radio_item label="Usar proxy HTTP" name="OtherHTTPProxy" tool_tip="O HTTP que não seja da Web será enviado por meio do proxy da Web configurado." value="Web"/>
+ <radio_item label="Usar proxy SOCKS 5" name="OtherSocksProxy" tool_tip="O HTTP que não seja da Web será enviado por meio do proxy Socks 5 configurado." value="Socks"/>
+ </radio_group>
+ <button label="OK" label_selected="OK" name="OK"/>
+ <button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_preview_animation.xml b/indra/newview/skins/default/xui/pt/floater_preview_animation.xml
index b66159354f..19474d8099 100644
--- a/indra/newview/skins/default/xui/pt/floater_preview_animation.xml
+++ b/indra/newview/skins/default/xui/pt/floater_preview_animation.xml
@@ -6,6 +6,6 @@
<text name="desc txt">
Descrição:
</text>
- <button label="Tocar inworld" label_selected="Parar" left="20" name="Anim play btn" tool_tip="Tocar essa animação de forma que outros possam ver" width="131"/>
- <button label="Executar localmente" label_selected="Parar" left="162" name="Anim audition btn" tool_tip="Tocar essa animação de forma que apenas você possa ver" width="125"/>
+ <button label="Tocar inworld" label_selected="Parar" name="Inworld" tool_tip="Executar essa animação de forma que outros possam ver"/>
+ <button label="Tocar localmente" label_selected="Parar" name="Locally" tool_tip="Executar animação de forma que apenas você possa ver"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_preview_classified.xml b/indra/newview/skins/default/xui/pt/floater_preview_classified.xml
deleted file mode 100644
index bb626430ed..0000000000
--- a/indra/newview/skins/default/xui/pt/floater_preview_classified.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="classified_preview" title="INFORMAÇÕES CLASSIFICADAS">
- <floater.string name="Title">
- Classificados: [NAME]
- </floater.string>
-</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_preview_event.xml b/indra/newview/skins/default/xui/pt/floater_preview_event.xml
deleted file mode 100644
index b422580f3b..0000000000
--- a/indra/newview/skins/default/xui/pt/floater_preview_event.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="event_preview" title="DADOS DO EVENTO">
- <floater.string name="Title">
- Evento: [NAME]
- </floater.string>
-</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_preview_gesture.xml b/indra/newview/skins/default/xui/pt/floater_preview_gesture.xml
index 80bdbb0fb4..089694608b 100644
--- a/indra/newview/skins/default/xui/pt/floater_preview_gesture.xml
+++ b/indra/newview/skins/default/xui/pt/floater_preview_gesture.xml
@@ -37,25 +37,24 @@
<text name="key_label">
Atalho:
</text>
- <combo_box label="Nenhum" left="116" name="modifier_combo" width="76"/>
- <combo_box label="Nenhum" left_delta="80" name="key_combo" width="76"/>
+ <combo_box label="Nenhum" name="modifier_combo" width="68"/>
+ <combo_box label="Nenhum" name="key_combo" width="48"/>
<text name="library_label">
Biblioteca:
</text>
- <scroll_list name="library_list" width="84">
+ <scroll_list name="library_list">
<scroll_list.rows name="action_animation" value="Animação"/>
<scroll_list.rows name="action_sound" value="Som"/>
<scroll_list.rows name="action_chat" value="Bate-papo"/>
<scroll_list.rows name="action_wait" value="Espere"/>
</scroll_list>
- <button label="Incluir" left="118" name="add_btn" width="87"/>
+ <button label="Incluir" name="add_btn"/>
<text name="steps_label">
Passos:
- </text>
- <scroll_list left="226" name="step_list" width="205"/>
- <button label="P/ cima" left_delta="-13" name="up_btn" width="114"/>
- <button label="P/ baixo" name="down_btn" width="114"/>
- <button label="Remover" left_delta="13" name="delete_btn" width="84"/>
+ </text>
+ <button label="P/ cima" name="up_btn" />
+ <button label="P/ baixo" name="down_btn"/>
+ <button label="Remover" name="delete_btn"/>
<text name="options_text">
(opções)
</text>
@@ -63,9 +62,9 @@
<radio_item label="Iniciar" name="start"/>
<radio_item label="Parar" name="stop"/>
</radio_group>
- <check_box bottom_delta="34" label="até que as animações estejam concluídas" name="wait_anim_check"/>
- <check_box bottom_delta="-30" label="segundos:" name="wait_time_check"/>
- <line_editor left_delta="130" name="wait_time_editor"/>
+ <check_box label="até que as animações estejam concluídas" name="wait_anim_check"/>
+ <check_box label="segundos:" name="wait_time_check"/>
+ <line_editor name="wait_time_editor"/>
<text name="help_label">
Se não incluir uma pausa, todas as etapas ocorrem ao mesmo tempo.
</text>
diff --git a/indra/newview/skins/default/xui/pt/floater_price_for_listing.xml b/indra/newview/skins/default/xui/pt/floater_price_for_listing.xml
new file mode 100644
index 0000000000..b078962feb
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_price_for_listing.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="price_for_listing" title="PUBLICAR ANÚNCIO">
+ <text name="explanation_text">
+ Seu anúncio será publicado por uma semana a partir da data de publicação.
+
+A posição do seu anúncio nos classificados depende de quanto você paga.
+
+Os anúncios de maior valor vão para o topo da lista e aparecem mais no topo dos resultados de busca.
+ </text>
+ <text name="price_text">
+ Preço do anúncio:
+ </text>
+ <text name="price_symbol">
+ L$
+ </text>
+ <button label="OK" name="set_price_btn"/>
+ <button label="Cancelar" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_region_debug_console.xml b/indra/newview/skins/default/xui/pt/floater_region_debug_console.xml
new file mode 100644
index 0000000000..d3b5df2d74
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_region_debug_console.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="region_debug_console" title="Depuração de região"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_search.xml b/indra/newview/skins/default/xui/pt/floater_search.xml
index 4bf7181180..3509cb786d 100644
--- a/indra/newview/skins/default/xui/pt/floater_search.xml
+++ b/indra/newview/skins/default/xui/pt/floater_search.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_search" title="BUSCAR">
+<floater name="floater_search" title="">
<floater.string name="loading_text">
Carregando...
</floater.string>
diff --git a/indra/newview/skins/default/xui/pt/floater_sell_land.xml b/indra/newview/skins/default/xui/pt/floater_sell_land.xml
index e6d4dc7ed6..014ae0845e 100644
--- a/indra/newview/skins/default/xui/pt/floater_sell_land.xml
+++ b/indra/newview/skins/default/xui/pt/floater_sell_land.xml
@@ -55,8 +55,9 @@
<radio_item label="Sim, vender o terreno com os objetos" name="yes"/>
</radio_group>
<button label="Mostrar objetos" name="show_objects"/>
- <text name="nag_message_label">
- LEMBRE-SE: Qualquer transação de compra e venda é irreversível.
+ <text name="nag_message_label" font="SansSerifSmallBold">
+ LEMBRE-SE: Qualquer transação de compra
+e venda é irreversível.
</text>
<button label="Colocar terreno à venda" name="sell_btn"/>
<button label="Cancelar" name="cancel_btn"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_settings_debug.xml b/indra/newview/skins/default/xui/pt/floater_settings_debug.xml
index c6694d13b2..83f7b24572 100644
--- a/indra/newview/skins/default/xui/pt/floater_settings_debug.xml
+++ b/indra/newview/skins/default/xui/pt/floater_settings_debug.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="settings_debug" title="DEBUG SETTINGS">
<radio_group name="boolean_combo">
- <radio_item label="TRUE" name="TRUE" value="verdadeiro"/>
- <radio_item label="FALSE" name="FALSE" value=""/>
+ <radio_item label="TRUE" name="TRUE" />
+ <radio_item label="FALSE" name="FALSE" />
</radio_group>
<color_swatch label="Cor" name="val_color_swatch"/>
<spinner label="x" name="val_spinner_1"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_snapshot.xml b/indra/newview/skins/default/xui/pt/floater_snapshot.xml
index d62fe3dd20..4110e69068 100644
--- a/indra/newview/skins/default/xui/pt/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/pt/floater_snapshot.xml
@@ -3,73 +3,63 @@
<floater.string name="unknown">
desconhecido
</floater.string>
- <radio_group label="Tipo de foto" name="snapshot_type_radio">
- <radio_item label="Email" name="postcard"/>
- <radio_item label="Meu inventário (L$[AMOUNT])" name="texture"/>
- <radio_item label="Salvar no meu PC" name="local"/>
- </radio_group>
+ <string name="postcard_progress_str">
+ Enviando e-mail
+ </string>
+ <string name="profile_progress_str">
+ Postando
+ </string>
+ <string name="inventory_progress_str">
+ Salvando no inventário
+ </string>
+ <string name="local_progress_str">
+ Salvo no computador
+ </string>
+ <string name="profile_succeeded_str">
+ Imagem carregada
+ </string>
+ <string name="postcard_succeeded_str">
+ E-mail enviado!
+ </string>
+ <string name="inventory_succeeded_str">
+ Salvo no inventário!
+ </string>
+ <string name="local_succeeded_str">
+ Salvo no computador!
+ </string>
+ <string name="profile_failed_str">
+ Falha ao carregar a imagem no feed do seu perfil.
+ </string>
+ <string name="postcard_failed_str">
+ Falha ao enviar e-mail.
+ </string>
+ <string name="inventory_failed_str">
+ Falha ao salvar no inventário.
+ </string>
+ <string name="local_failed_str">
+ Falha ao salvar no computador.
+ </string>
+ <button name="advanced_options_btn" tool_tip="Opções avançadas"/>
+ <text name="image_res_text">
+ [WIDTH] x [HEIGHT] px
+ </text>
<text name="file_size_label">
[TAMANHO] KB
</text>
- <button label="Atualizar a foto" name="new_snapshot_btn"/>
- <button label="Enviar" name="send_btn"/>
- <button label="Economize (L$[AMOUNT])" name="upload_btn"/>
- <flyout_button label="Salvar" name="save_btn" tool_tip="Salvar imagem em um arquivo">
- <flyout_button.item label="Salvar" name="save_item"/>
- <flyout_button.item label="Salvar como..." name="saveas_item"/>
- </flyout_button>
- <button label="Mais" name="more_btn" tool_tip="Opções avançadas"/>
- <button label="Menos" name="less_btn" tool_tip="Opções avançadas"/>
- <button label="Cancelar" name="discard_btn"/>
- <text name="type_label2">
- Tamanho
- </text>
- <text name="format_label">
- Formato
- </text>
- <combo_box label="Resolução" name="postcard_size_combo">
- <combo_box.item label="Janela atual" name="CurrentWindow"/>
- <combo_box.item label="640x480" name="640x480"/>
- <combo_box.item label="800x600" name="800x600"/>
- <combo_box.item label="1024x768" name="1024x768"/>
- <combo_box.item label="Customizado" name="Custom"/>
- </combo_box>
- <combo_box label="Resolução" name="texture_size_combo">
- <combo_box.item label="Janela atual" name="CurrentWindow"/>
- <combo_box.item label="Pequeno (128x128)" name="Small(128x128)"/>
- <combo_box.item label="Médio (256x256)" name="Medium(256x256)"/>
- <combo_box.item label="Grande (512x512)" name="Large(512x512)"/>
- <combo_box.item label="Customizado" name="Custom"/>
- </combo_box>
- <combo_box label="Resolução" name="local_size_combo">
- <combo_box.item label="Janela atual" name="CurrentWindow"/>
- <combo_box.item label="320x240" name="320x240"/>
- <combo_box.item label="640x480" name="640x480"/>
- <combo_box.item label="800x600" name="800x600"/>
- <combo_box.item label="1024x768" name="1024x768"/>
- <combo_box.item label="1280x1024" name="1280x1024"/>
- <combo_box.item label="1600x1200" name="1600x1200"/>
- <combo_box.item label="Customizado" name="Custom"/>
- </combo_box>
- <combo_box label="Formato" name="local_format_combo">
- <combo_box.item label="PNG" name="PNG"/>
- <combo_box.item label="JPEG" name="JPEG"/>
- <combo_box.item label="BMP" name="BMP"/>
- </combo_box>
- <spinner label="Largura" name="snapshot_width"/>
- <spinner label="Altura" name="snapshot_height"/>
- <check_box label="Limitar proproções" name="keep_aspect_check"/>
- <slider label="Qualidade da imagem" name="image_quality_slider"/>
- <text name="layer_type_label">
- Capturar:
- </text>
- <combo_box label="Camadas da imagem" name="layer_types">
- <combo_box.item label="Cores" name="Colors"/>
- <combo_box.item label="Profundidade" name="Depth"/>
- </combo_box>
- <check_box label="Interface" name="ui_check"/>
- <check_box label="HUDs" name="hud_check"/>
- <check_box label="Deixar aberto depois de salvo" name="keep_open_check"/>
- <check_box label="Gerar quadro (tela inteira)" name="freeze_frame_check"/>
- <check_box label="Atualizar" name="auto_snapshot_check"/>
+ <panel name="advanced_options_panel">
+ <text name="advanced_options_label">
+ OPÇÕES AVANÇADAS
+ </text>
+ <text name="layer_type_label">
+ Capturar:
+ </text>
+ <combo_box label="Camadas da imagem" name="layer_types">
+ <combo_box.item label="Cores" name="Colors"/>
+ <combo_box.item label="Profundidade" name="Depth"/>
+ </combo_box>
+ <check_box label="Interface" name="ui_check"/>
+ <check_box label="HUDs" name="hud_check"/>
+ <check_box label="Gerar quadro (tela inteira)" name="freeze_frame_check"/>
+ <check_box label="Atualização automática" name="auto_snapshot_check"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_sound_devices.xml b/indra/newview/skins/default/xui/pt/floater_sound_devices.xml
new file mode 100644
index 0000000000..948d727540
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_sound_devices.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_sound_devices" title="DISPOSITIVOS DE SOM">
+ <text name="voice_label">
+ Bate-papo de voz
+ </text>
+ <check_box label="Ativado" name="enable_voice"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_statistics.xml b/indra/newview/skins/default/xui/pt/floater_statistics.xml
deleted file mode 100644
index ecbf638157..0000000000
--- a/indra/newview/skins/default/xui/pt/floater_statistics.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="stats floater" title="ESTATÃSTICAS"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_stats.xml b/indra/newview/skins/default/xui/pt/floater_stats.xml
index 11589b31b6..f0a053ebe3 100644
--- a/indra/newview/skins/default/xui/pt/floater_stats.xml
+++ b/indra/newview/skins/default/xui/pt/floater_stats.xml
@@ -10,8 +10,8 @@
</stat_view>
<stat_view label="Avançado" name="advanced">
<stat_view label="Render" name="render">
- <stat_bar label="KTris Drawn" name="ktrisframe"/>
- <stat_bar label="KTris Drawn" name="ktrissec"/>
+ <stat_bar label="KTris desenhados por quadro" name="ktrisframe"/>
+ <stat_bar label="KTris desenhados por segundo" name="ktrissec"/>
<stat_bar label="Total Objects" name="objs"/>
<stat_bar label="New Objects" name="newobjs"/>
</stat_view>
@@ -32,7 +32,7 @@
<stat_bar label="Layers" name="layerskbitstat"/>
<stat_bar label="Actual In" name="actualinkbitstat"/>
<stat_bar label="Actual Out" name="actualoutkbitstat"/>
- <stat_bar label="VFS Pending Ops" name="vfspendingoperations"/>
+ <stat_bar label="Operações pendentes do VFS" name="vfspendingoperations"/>
</stat_view>
</stat_view>
<stat_view label="Simulator" name="sim">
@@ -43,18 +43,6 @@
<stat_bar label="Pinned Objects" name="physicspinnedtasks"/>
<stat_bar label="Low LOD Objects" name="physicslodtasks"/>
<stat_bar label="Memory Allocated" name="physicsmemoryallocated"/>
- <stat_bar label="Agent Updates/Sec" name="simagentups"/>
- <stat_bar label="Main Agents" name="simmainagents"/>
- <stat_bar label="Child Agents" name="simchildagents"/>
- <stat_bar label="Objects" name="simobjects"/>
- <stat_bar label="Active Objects" name="simactiveobjects"/>
- <stat_bar label="Active Scripts" name="simactivescripts"/>
- <stat_bar label="Script Events" name="simscripteps"/>
- <stat_bar label="Packets In" name="siminpps"/>
- <stat_bar label="Packets Out" name="simoutpps"/>
- <stat_bar label="Pending Downloads" name="simpendingdownloads"/>
- <stat_bar label="Pending Uploads" name="simpendinguploads"/>
- <stat_bar label="Total Unacked Bytes" name="simtotalunackedbytes"/>
</stat_view>
<stat_view label="Time (ms)" name="simperf">
<stat_bar label="Total Frame Time" name="simframemsec"/>
@@ -64,6 +52,14 @@
<stat_bar label="Agent Time" name="simagentmsec"/>
<stat_bar label="Images Time" name="simimagesmsec"/>
<stat_bar label="Script Time" name="simscriptmsec"/>
+ <stat_bar label="Tempo restante" name="simsparemsec"/>
+ <stat_view label="Detalhes de tempo (ms)" name="timedetails">
+ <stat_bar label="Etapa física" name="simsimphysicsstepmsec"/>
+ <stat_bar label="Atualizar formas físicas" name="simsimphysicsshapeupdatemsec"/>
+ <stat_bar label="Física - outros" name="simsimphysicsothermsec"/>
+ <stat_bar label="Tempo de espera" name="simsleepmsec"/>
+ <stat_bar label="Bombear ES" name="simpumpiomsec"/>
+ </stat_view>
</stat_view>
</stat_view>
</container_view>
diff --git a/indra/newview/skins/default/xui/pt/floater_test_layout_stacks.xml b/indra/newview/skins/default/xui/pt/floater_test_layout_stacks.xml
new file mode 100644
index 0000000000..b479d5f6d6
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_test_layout_stacks.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Test Floater" title="LAYOUTSTACK TESTS"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_test_text_vertical_aligment.xml b/indra/newview/skins/default/xui/pt/floater_test_text_vertical_aligment.xml
new file mode 100644
index 0000000000..dd282bf1fc
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_test_text_vertical_aligment.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Test Floater" title="JANELA DE TESTE"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_tools.xml b/indra/newview/skins/default/xui/pt/floater_tools.xml
index bd5fbf80d1..4b31833602 100644
--- a/indra/newview/skins/default/xui/pt/floater_tools.xml
+++ b/indra/newview/skins/default/xui/pt/floater_tools.xml
@@ -1,5 +1,20 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="toolbox floater" short_title="BUILD TOOLS" title="">
+ <floater.string name="grid_screen_text">
+ Tela
+ </floater.string>
+ <floater.string name="grid_local_text">
+ Local
+ </floater.string>
+ <floater.string name="grid_world_text">
+ Mundo
+ </floater.string>
+ <floater.string name="grid_reference_text">
+ Referência
+ </floater.string>
+ <floater.string name="grid_attachment_text">
+ Anexo
+ </floater.string>
<floater.string name="status_rotate">
Arrastar as faixas coloridas para girar o objeto
</floater.string>
@@ -24,20 +39,11 @@
<floater.string name="status_selectland">
Clicar e arrastar para selecionar a terra
</floater.string>
- <floater.string name="grid_screen_text">
- Tela
+ <floater.string name="status_selectcount">
+ [OBJ_COUNT] objetos selecionados, impacto no terreno [LAND_IMPACT]
</floater.string>
- <floater.string name="grid_local_text">
- Local
- </floater.string>
- <floater.string name="grid_world_text">
- Mundo
- </floater.string>
- <floater.string name="grid_reference_text">
- Referência
- </floater.string>
- <floater.string name="grid_attachment_text">
- Anexo
+ <floater.string name="status_remaining_capacity">
+ Capacidade restante [LAND_CAPACITY].
</floater.string>
<button label="" label_selected="" name="button focus" tool_tip="Foco"/>
<button label="" label_selected="" name="button move" tool_tip="Mover"/>
@@ -64,21 +70,20 @@
<radio_item label="Selecionar face" name="radio select face"/>
</radio_group>
<check_box label="Editar partes linkadas" name="checkbox edit linked parts"/>
- <text name="RenderingCost" tool_tip="Mostra o cálculo do custo de renderização do objeto">
- þ: [COUNT]
- </text>
+ <button label="Link" name="link_btn"/>
+ <button label="Desconectar links" name="unlink_btn"/>
<check_box label="" name="checkbox uniform"/>
<text label="Esticar ambos lados" name="checkbox uniform label">
Esticar ambos lados
</text>
<check_box initial_value="true" label="Esticar texturas" name="checkbox stretch textures"/>
- <check_box initial_value="true" label="Mostrar na grade" name="checkbox snap to grid"/>
- <combo_box name="combobox grid mode" tool_tip="Selecione a régua da grade onde o objeto será colocado">
- <combo_box.item label="Grade SL" name="World"/>
+ <check_box initial_value="true" label="Ajustar" name="checkbox snap to grid"/>
+ <combo_box name="combobox grid mode" tool_tip="Selecione o tipo de régua da grade onde o objeto será colocado">
+ <combo_box.item label="Mundo" name="World"/>
<combo_box.item label="Local" name="Local"/>
<combo_box.item label="Referência" name="Reference"/>
</combo_box>
- <button label="Opções..." label_selected="Opções..." name="Options..." tool_tip="Mais opções de grade"/>
+ <button label="" label_selected="Opções..." name="Options..." tool_tip="Mais opções de grade"/>
<button label="" label_selected="" name="ToolCube" tool_tip="Cubo"/>
<button label="" label_selected="" name="ToolPrism" tool_tip="Prisma"/>
<button label="" label_selected="" name="ToolPyramid" tool_tip="Pirâmide"/>
@@ -117,11 +122,11 @@
Força
</text>
<button label="Aplicar" label_selected="Aplicar" name="button apply to selection" tool_tip="Modificar a terra selecionada"/>
- <text left="134" name="obj_count">
- Objetos: [COUNT]
+ <text name="selection_empty">
+ Nada selecionado.
</text>
- <text left="134" name="prim_count">
- Prims: [COUNT]
+ <text name="remaining_capacity">
+ [CAPACITY_STRING] [secondlife:///app/openfloater/object_weights More info]
</text>
<tab_container name="Object Info Tabs" tab_max_width="60" tab_min_width="30" width="288">
<panel label="Comum" name="General">
@@ -170,15 +175,9 @@
<text name="Creator:">
Criador:
</text>
- <text name="Creator Name">
- Mrs. Esbee Linden (esbee.linden)
- </text>
<text name="Owner:">
Proprietário:
</text>
- <text name="Owner Name">
- Mrs. Erica &quot;Moose&quot; Linden (erica.linden)
- </text>
<text name="Group:">
Grupo:
</text>
@@ -273,15 +272,6 @@
<combo_box.item label="Anel" name="Ring"/>
<combo_box.item label="Esculpida" name="Sculpted"/>
</combo_box>
- <combo_box name="material">
- <combo_box.item label="Pedra" name="Stone"/>
- <combo_box.item label="Metal" name="Metal"/>
- <combo_box.item label="Vidro" name="Glass"/>
- <combo_box.item label="Madeira" name="Wood"/>
- <combo_box.item label="Carne" name="Flesh"/>
- <combo_box.item label="Plástico" name="Plastic"/>
- <combo_box.item label="Couro" name="Rubber"/>
- </combo_box>
<text name="text cut">
Path Cut (begin/end)
</text>
@@ -349,7 +339,6 @@
Tipo costura
</text>
<combo_box name="sculpt type control">
- <combo_box.item label="(nenhum)" name="None"/>
<combo_box.item label="Esfera" name="Sphere"/>
<combo_box.item label="Toróide" name="Torus"/>
<combo_box.item label="Plano" name="Plane"/>
@@ -357,6 +346,15 @@
</combo_box>
</panel>
<panel label="Recursos" name="Features">
+ <panel.string name="None">
+ Nenhum
+ </panel.string>
+ <panel.string name="Prim">
+ Prim
+ </panel.string>
+ <panel.string name="Convex Hull">
+ Hull convexo
+ </panel.string>
<text name="select_single" width="272">
Selecione apenas um prim para editar suas características.
</text>
@@ -381,6 +379,23 @@
<spinner label="Enfocar" name="Light Focus"/>
<spinner label="Queda" name="Light Falloff"/>
<spinner label="Ambiente" name="Light Ambiance"/>
+ <text name="label physicsshapetype">
+ Tipo de formato físico:
+ </text>
+ <combo_box name="Physics Shape Type Combo Ctrl" tool_tip="Selecione o tipo de formato físico"/>
+ <combo_box name="material">
+ <combo_box.item label="Pedra" name="Stone"/>
+ <combo_box.item label="Metal" name="Metal"/>
+ <combo_box.item label="Vidro" name="Glass"/>
+ <combo_box.item label="Madeira" name="Wood"/>
+ <combo_box.item label="Carne" name="Flesh"/>
+ <combo_box.item label="Plástico" name="Plastic"/>
+ <combo_box.item label="Borrracha" name="Rubber"/>
+ </combo_box>
+ <spinner label="Gravidade" name="Physics Gravity"/>
+ <spinner label="Fricção" name="Physics Friction"/>
+ <spinner label="Densidade em 100 kg/m^3" name="Physics Density"/>
+ <spinner label="Restituição" name="Physics Restitution"/>
</panel>
<panel label="Textura" name="Texture">
<panel.string name="string repeats per meter">
diff --git a/indra/newview/skins/default/xui/pt/floater_top_objects.xml b/indra/newview/skins/default/xui/pt/floater_top_objects.xml
index dc3bf73818..c3d5820616 100644
--- a/indra/newview/skins/default/xui/pt/floater_top_objects.xml
+++ b/indra/newview/skins/default/xui/pt/floater_top_objects.xml
@@ -39,14 +39,14 @@
<text name="id_text">
ID do Objeto:
</text>
- <line_editor font="SansSerifSmall" left="140" name="id_editor" width="280"/>
+ <line_editor font="SansSerifSmall" name="id_editor"/>
<button label="Mostrar Avisos" name="show_beacon_btn"/>
<text name="obj_name_text">
Nome do objeto:
</text>
- <line_editor font="SansSerifSmall" left="140" name="object_name_editor" width="280"/>
+ <line_editor font="SansSerifSmall" name="object_name_editor"/>
<button label="Filtro" name="filter_object_btn"/>
- <text name="owner_name_text" width="130">
+ <text name="owner_name_text">
Proprietário:
</text>
<line_editor font="SansSerifSmall" left="140" name="owner_name_editor" width="280"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_tos.xml b/indra/newview/skins/default/xui/pt/floater_tos.xml
index 2675979783..c4954cb61f 100644
--- a/indra/newview/skins/default/xui/pt/floater_tos.xml
+++ b/indra/newview/skins/default/xui/pt/floater_tos.xml
@@ -4,7 +4,7 @@
http://secondlife.com/app/tos/
</floater.string>
<floater.string name="loading_url">
- data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Carregando %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
+ data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Carregando %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETermos%20de%20Serviço%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
</floater.string>
<button label="Continuar" label_selected="Continuar" name="Continue"/>
<button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_toybox.xml b/indra/newview/skins/default/xui/pt/floater_toybox.xml
new file mode 100644
index 0000000000..3677c3b1f5
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_toybox.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Toybox" title="BOTÕES DA BARRA DE FERRAMENTAS">
+ <text name="toybox label 1">
+ Adicione ou remova botões arrastando-os para dentro ou para fora das barras de ferramentas.
+ </text>
+ <text name="toybox label 2">
+ Os botões aparecerão como mostrado ou somente como ícone, dependendo das configurações de cada barra de ferramentas.
+ </text>
+ <button label="Limpar todas as barras de ferramentas" label_selected="Limpar todas as barras de ferramentas" name="btn_clear_all"/>
+ <button label="Restaurar padrão" label_selected="Restaurar padrão" name="btn_restore_defaults"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_translation_settings.xml b/indra/newview/skins/default/xui/pt/floater_translation_settings.xml
new file mode 100644
index 0000000000..1955599a81
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_translation_settings.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_translation_settings" title="CONFIGURAÇÕES DE TRADUÇÃO DE BATE-PAPO">
+ <string name="bing_api_key_not_verified">
+ appID do Bing não verificada. Tente novamente.
+ </string>
+ <string name="google_api_key_not_verified">
+ Chave do API do Google não verificada. Tente novamente.
+ </string>
+ <string name="bing_api_key_verified">
+ appID do Bing verificada.
+ </string>
+ <string name="google_api_key_verified">
+ Chave do API do Google verificada.
+ </string>
+ <check_box label="Permitir a tradução de máquina durante o bate-papo" name="translate_chat_checkbox"/>
+ <text name="translate_language_label">
+ Traduzir bate-papo para:
+ </text>
+ <combo_box name="translate_language_combo">
+ <combo_box.item label="Padrão" name="System Default Language"/>
+ <combo_box.item label="Inglês" name="English"/>
+ <combo_box.item label="Dansk (Dinamarquês)" name="Danish"/>
+ <combo_box.item label="Deutsch (Alemão)" name="German"/>
+ <combo_box.item label="Español (Espanhol)" name="Spanish"/>
+ <combo_box.item label="Français (Francês)" name="French"/>
+ <combo_box.item label="Italiano (Italiano)" name="Italian"/>
+ <combo_box.item label="Magyar (Húngaro)" name="Hungarian"/>
+ <combo_box.item label="Nederlands (Holandês)" name="Dutch"/>
+ <combo_box.item label="Polski (Polonês)" name="Polish"/>
+ <combo_box.item label="Português (Português)" name="Portugese"/>
+ <combo_box.item label="РуÑÑкий (Russo)" name="Russian"/>
+ <combo_box.item label="Türkçe (Turco)" name="Turkish"/>
+ <combo_box.item label="УкраїнÑька (Ucraniano)" name="Ukrainian"/>
+ <combo_box.item label="中文 (简体) (Chinês)" name="Chinese"/>
+ <combo_box.item label="日本語 (Japonês)" name="Japanese"/>
+ <combo_box.item label="한국어 (Coreano)" name="Korean"/>
+ </combo_box>
+ <text name="tip">
+ Escolha o serviço de tradução:
+ </text>
+ <radio_group name="translation_service_rg">
+ <radio_item initial_value="bing" label="Bing Translator" name="bing"/>
+ <radio_item initial_value="google" label="Google Translate" name="google"/>
+ </radio_group>
+ <text name="bing_api_key_label">
+ [http://www.bing.com/developers/createapp.aspx AppID] do Bing:
+ </text>
+ <button label="Verificar" name="verify_bing_api_key_btn"/>
+ <text name="google_api_key_label">
+ [http://code.google.com/apis/language/translate/v2/getting_started.html#auth Chave API] do Google:
+ </text>
+ <button label="Verificar" name="verify_google_api_key_btn"/>
+ <text name="google_links_text">
+ [http://code.google.com/apis/language/translate/v2/pricing.html Preços] | [https://code.google.com/apis/console Estatísticas]
+ </text>
+ <button label="OK" name="ok_btn"/>
+ <button label="Cancelar" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_voice_controls.xml b/indra/newview/skins/default/xui/pt/floater_voice_controls.xml
index fed60c9afa..745a7d0e00 100644
--- a/indra/newview/skins/default/xui/pt/floater_voice_controls.xml
+++ b/indra/newview/skins/default/xui/pt/floater_voice_controls.xml
@@ -1,16 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_voice_controls" title="Controles de voz">
+<floater name="floater_voice_controls" title="CONTROLES DE VOZ">
<string name="title_nearby">
- VOZ LOCAL
+ CONFIGURAÇÕES DE VOZ
</string>
<string name="title_group">
- Ligação de grupo com [GROUP]
+ LIGAÇÃO DE GRUPO COM [GROUP]
</string>
<string name="title_adhoc">
- Teleconferência
+ TELECONFERÊNCIA
</string>
<string name="title_peer_2_peer">
- Ligação para [NAME]
+ LIGAÇÃO PARA [NAME]
</string>
<string name="no_one_near">
Ninguém por perto ativou a voz
diff --git a/indra/newview/skins/default/xui/pt/floater_voice_effect.xml b/indra/newview/skins/default/xui/pt/floater_voice_effect.xml
index cb9b3c8c0d..b29ca3d699 100644
--- a/indra/newview/skins/default/xui/pt/floater_voice_effect.xml
+++ b/indra/newview/skins/default/xui/pt/floater_voice_effect.xml
@@ -12,6 +12,135 @@
<string name="new_voice_effect">
(Novo!)
</string>
+ <string name="effect_Arena">
+ Arena
+ </string>
+ <string name="effect_Beast">
+ Fera
+ </string>
+ <string name="effect_Buff">
+ Entusiasmado
+ </string>
+ <string name="effect_Buzz">
+ Zumbido
+ </string>
+ <string name="effect_Camille">
+ Camille
+ </string>
+ <string name="effect_Creepy">
+ Assustador
+ </string>
+ <string name="effect_CreepyBot">
+ RobôAssustador
+ </string>
+ <string name="effect_Cyber">
+ Cyber
+ </string>
+ <string name="effect_DeepBot">
+ RobôVozGrossa
+ </string>
+ <string name="effect_Demon">
+ Demônio
+ </string>
+ <string name="effect_Female Elf">
+ Elfa
+ </string>
+ <string name="effect_Flirty">
+ Paquerador
+ </string>
+ <string name="effect_Foxy">
+ Sensual
+ </string>
+ <string name="effect_Halloween 2010 Bonus">
+ Bônus_Halloween_2010
+ </string>
+ <string name="effect_Helium">
+ Hélio
+ </string>
+ <string name="effect_Husky">
+ Rouco
+ </string>
+ <string name="effect_Husky Whisper">
+ Sussurro rouco
+ </string>
+ <string name="effect_Intercom">
+ Interfone
+ </string>
+ <string name="effect_Julia">
+ Julia
+ </string>
+ <string name="effect_Lo Lilt">
+ Cantarolado baixo
+ </string>
+ <string name="effect_Macho">
+ Macho
+ </string>
+ <string name="effect_Micro">
+ Micro
+ </string>
+ <string name="effect_Mini">
+ Mini
+ </string>
+ <string name="effect_Model">
+ Modelo
+ </string>
+ <string name="effect_Nano">
+ Nano
+ </string>
+ <string name="effect_Nightmare">
+ Pesadelo
+ </string>
+ <string name="effect_PopBot">
+ RobôPop
+ </string>
+ <string name="effect_Rachel">
+ Rachel
+ </string>
+ <string name="effect_Radio">
+ Rádio
+ </string>
+ <string name="effect_Robot">
+ Robô
+ </string>
+ <string name="effect_Roxanne">
+ Roxanne
+ </string>
+ <string name="effect_Rumble">
+ Ronco
+ </string>
+ <string name="effect_Sabrina">
+ Sabrina
+ </string>
+ <string name="effect_Samantha">
+ Samantha
+ </string>
+ <string name="effect_Sexy">
+ Sexy
+ </string>
+ <string name="effect_Shorty">
+ Baixinho
+ </string>
+ <string name="effect_Smaller">
+ Menor
+ </string>
+ <string name="effect_Sneaky">
+ Sorrateiro
+ </string>
+ <string name="effect_Stallion">
+ Garanhão
+ </string>
+ <string name="effect_Sultry">
+ Ardente
+ </string>
+ <string name="effect_Thunder">
+ Trovão
+ </string>
+ <string name="effect_Vixen">
+ Maliciosa
+ </string>
+ <string name="effect_WhinyBot">
+ RobôReclamão
+ </string>
<text name="preview_text">
Visualizar
</text>
diff --git a/indra/newview/skins/default/xui/pt/floater_water.xml b/indra/newview/skins/default/xui/pt/floater_water.xml
deleted file mode 100644
index b4613e0890..0000000000
--- a/indra/newview/skins/default/xui/pt/floater_water.xml
+++ /dev/null
@@ -1,86 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Water Floater" title="EDITOR DE ÃGUA AVANÇADO">
- <text name="KeyFramePresetsText" width="154">
- Pré-configurações da Ãgua:
- </text>
- <combo_box left_delta="160" name="WaterPresetsCombo" width="150"/>
- <button label="Novo" label_selected="Novo" name="WaterNewPreset"/>
- <button label="Salvar" label_selected="Salvar" name="WaterSavePreset"/>
- <button label="Deletar" label_selected="Deletar" name="WaterDeletePreset"/>
- <tab_container name="Water Tabs">
- <panel label="DEFINIÇÕES" name="Settings">
- <text name="BHText">
- Cor da névoa da Ãgua
- </text>
- <button label="?" name="WaterFogColorHelp"/>
- <color_swatch label="" name="WaterFogColor" tool_tip="Selecionar a cor"/>
- <text name="WaterFogDensText">
- Expoente da Densidade de névoa
- </text>
- <button label="?" left="209" name="WaterFogDensityHelp"/>
- <text name="WaterUnderWaterFogModText">
- Modificador da névoa Subaquática
- </text>
- <button label="?" left="209" name="WaterUnderWaterFogModHelp"/>
- <text name="BDensText">
- Escala da Marola de Reflexão
- </text>
- <button label="?" left="415" name="WaterNormalScaleHelp"/>
- <text name="BHText2">
- 1
- </text>
- <text name="BHText3">
- 2
- </text>
- <text name="BHText4">
- 3
- </text>
- <text name="HDText">
- Escala de Fresnel
- </text>
- <button label="?" left="415" name="WaterFresnelScaleHelp"/>
- <text name="FresnelOffsetText">
- Deslocamento de Fresnel
- </text>
- <button label="?" left="415" name="WaterFresnelOffsetHelp"/>
- <text name="DensMultText">
- Refratar a Escala para Cima
- </text>
- <button label="?" left="640" name="WaterScaleAboveHelp"/>
- <text name="WaterScaleBelowText">
- Refratar a Escala para Baixo
- </text>
- <button label="?" left="640" name="WaterScaleBelowHelp"/>
- <text name="MaxAltText">
- Multiplicador de Difusão
- </text>
- <button label="?" left="640" name="WaterBlurMultiplierHelp"/>
- </panel>
- <panel label="IMAGEM" name="Waves">
- <text name="BHText">
- Direção da Onda Maior
- </text>
- <button label="?" left="170" name="WaterWave1Help"/>
- <text name="WaterWave1DirXText">
- X
- </text>
- <text name="WaterWave1DirYText">
- Y
- </text>
- <text name="BHText2">
- Direção da Onda Pequena
- </text>
- <button label="?" left="170" name="WaterWave2Help"/>
- <text name="WaterWave2DirXText">
- X
- </text>
- <text name="WaterWave2DirYText">
- Y
- </text>
- <text name="BHText3">
- Mapa Normal
- </text>
- <button label="?" name="WaterNormalMapHelp"/>
- </panel>
- </tab_container>
-</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_web_content.xml b/indra/newview/skins/default/xui/pt/floater_web_content.xml
new file mode 100644
index 0000000000..5101579c6f
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_web_content.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_web_content" title="">
+ <layout_stack name="stack1">
+ <layout_panel name="nav_controls">
+ <button name="back" tool_tip="Navegar para trás"/>
+ <button name="forward" tool_tip="Navegar para frente"/>
+ <button name="stop" tool_tip="Parar a navegação"/>
+ <button name="reload" tool_tip="Recarregar página"/>
+ <combo_box name="address" tool_tip="Digite a URL aqui"/>
+ <icon name="media_secure_lock_flag" tool_tip="Navegação segura"/>
+ <button name="popexternal" tool_tip="Abrir a URL atual no navegador do seu computador"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_windlight_options.xml b/indra/newview/skins/default/xui/pt/floater_windlight_options.xml
deleted file mode 100644
index 22632a4ef8..0000000000
--- a/indra/newview/skins/default/xui/pt/floater_windlight_options.xml
+++ /dev/null
@@ -1,187 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="WindLight floater" title="EDITOR DE CÉU AVANÇADO">
- <text name="KeyFramePresetsText" width="130">
- Pré-definições de Céu:
- </text>
- <combo_box left_delta="130" name="WLPresetsCombo"/>
- <button label="Novo" label_selected="Novo" name="WLNewPreset"/>
- <button label="Salvar" label_selected="Salvar" left_delta="72" name="WLSavePreset"/>
- <button label="Deletar" label_selected="Deletar" left_delta="72" name="WLDeletePreset"/>
- <button label="Editor de Ciclos do Dia" label_selected="Editor de Ciclos do Dia" left_delta="84" name="WLDayCycleMenuButton" width="150"/>
- <tab_container name="WindLight Tabs">
- <panel label="ATMOSFERA" name="Atmosphere">
- <text name="BHText">
- Horizonte Azul
- </text>
- <button label="?" name="WLBlueHorizonHelp"/>
- <text name="BHText2">
- R
- </text>
- <text name="BHText3">
- G
- </text>
- <text name="BHText4">
- B
- </text>
- <text name="BHText5">
- I
- </text>
- <text name="BDensText">
- Horizonte da Neblina
- </text>
- <button label="?" name="WLHazeHorizonHelp"/>
- <text name="BDensText2">
- Densidade de Azul
- </text>
- <button label="?" name="WLBlueDensityHelp"/>
- <text name="BHText6">
- R
- </text>
- <text name="BHText7">
- G
- </text>
- <text name="BHText8">
- B
- </text>
- <text name="BHText9">
- I
- </text>
- <text name="HDText">
- Densidade da Neblina
- </text>
- <button label="?" name="WLHazeDensityHelp"/>
- <text name="DensMultText">
- Multiplicador de Densidade
- </text>
- <button label="?" left="635" name="WLDensityMultHelp"/>
- <text name="WLDistanceMultText">
- Multiplicador de Distância
- </text>
- <button label="?" left="635" name="WLDistanceMultHelp"/>
- <text name="MaxAltText">
- Altitude Máxima
- </text>
- <button label="?" left="635" name="WLMaxAltitudeHelp"/>
- </panel>
- <panel label="ILUMINAÇÃO" name="Lighting">
- <text name="SLCText">
- Cor do Sol/Lua
- </text>
- <button label="?" name="WLSunlightColorHelp"/>
- <text name="BHText">
- R
- </text>
- <text name="BHText2">
- G
- </text>
- <text name="BHText3">
- B
- </text>
- <text name="BHText4">
- I
- </text>
- <text name="TODText">
- Posição do Sol/Lua
- </text>
- <button label="?" name="WLTimeOfDayHelp"/>
- <text name="WLAmbientText">
- Ambiente
- </text>
- <button label="?" name="WLAmbientHelp"/>
- <text name="BHText5">
- R
- </text>
- <text name="BHText6">
- G
- </text>
- <text name="BHText7">
- B
- </text>
- <text name="BHText8">
- I
- </text>
- <text name="WLEastAngleText">
- Ângulo Leste
- </text>
- <button label="?" name="WLEastAngleHelp"/>
- <text name="SunGlowText">
- Brilho do Sol
- </text>
- <button label="?" name="WLSunGlowHelp"/>
- <slider label="Foco" name="WLGlowB"/>
- <slider label="Tamanho" name="WLGlowR"/>
- <text name="SceneGammaText">
- Gamma da Cena
- </text>
- <button label="?" name="WLSceneGammaHelp"/>
- <text name="WLStarText">
- Brilho da Estrela
- </text>
- <button label="?" name="WLStarBrightnessHelp"/>
- </panel>
- <panel label="NUVENS" name="Clouds">
- <text name="WLCloudColorText">
- Cor da Nuvem
- </text>
- <button label="?" name="WLCloudColorHelp"/>
- <text name="BHText">
- R
- </text>
- <text name="BHText2">
- G
- </text>
- <text name="BHText3">
- B
- </text>
- <text name="BHText4">
- I
- </text>
- <text name="WLCloudColorText2">
- Densidade/ XY da Nuvem
- </text>
- <button label="?" name="WLCloudDensityHelp"/>
- <text name="BHText5">
- X
- </text>
- <text name="BHText6">
- Y
- </text>
- <text name="BHText7">
- D
- </text>
- <text name="WLCloudCoverageText">
- Cobertura da Nuvem
- </text>
- <button label="?" name="WLCloudCoverageHelp"/>
- <text name="WLCloudScaleText">
- Escala da Nuvem
- </text>
- <button label="?" name="WLCloudScaleHelp"/>
- <text font="SansSerifSmall" name="WLCloudDetailText">
- Detalhe da Nuvem (XY/Densidade)
- </text>
- <button label="?" left="421" name="WLCloudDetailHelp"/>
- <text name="BHText8">
- X
- </text>
- <text name="BHText9">
- Y
- </text>
- <text name="BHText10">
- D
- </text>
- <text name="WLCloudScrollXText">
- Rolagem X da Nuvem
- </text>
- <button label="?" name="WLCloudScrollXHelp"/>
- <check_box label="Travar" name="WLCloudLockX"/>
- <text name="WLCloudScrollYText">
- Rolagem Y da Nuvem
- </text>
- <button label="?" name="WLCloudScrollYHelp"/>
- <check_box label="Travar" name="WLCloudLockY"/>
- <check_box label="Desenhar Nuvens Clássicas" name="DrawClassicClouds"/>
- <button label="?" left="645" name="WLClassicCloudsHelp"/>
- </panel>
- </tab_container>
-</floater>
diff --git a/indra/newview/skins/default/xui/pt/inspect_avatar.xml b/indra/newview/skins/default/xui/pt/inspect_avatar.xml
index a95d5ff31a..19244d9b27 100644
--- a/indra/newview/skins/default/xui/pt/inspect_avatar.xml
+++ b/indra/newview/skins/default/xui/pt/inspect_avatar.xml
@@ -5,13 +5,11 @@
-->
<floater name="inspect_avatar">
<string name="Subtitle">
- [IDADE]
+ [AGE]
</string>
<string name="Details">
- [PERFIL_SL]
+ [SL_PROFILE]
</string>
- <text name="user_name_small" value="Grumpity ProductEngine with a long name"/>
- <text name="user_slid" value="james.linden"/>
<text name="user_details">
This is my second life description and I really think it is great. But for some reason my description is super extra long because I like to talk a whole lot
</text>
diff --git a/indra/newview/skins/default/xui/pt/language_settings.xml b/indra/newview/skins/default/xui/pt/language_settings.xml
index e1de6ffea7..8799475ace 100644
--- a/indra/newview/skins/default/xui/pt/language_settings.xml
+++ b/indra/newview/skins/default/xui/pt/language_settings.xml
@@ -4,6 +4,7 @@
<!-- Locale Information -->
<string name="MicrosoftLocale">portuguese</string>
+ <string name="MacLocale">pt_PT.UTF-8</string>
<string name="DarwinLocale">pt_PT.UTF-8</string>
<string name="LinuxLocale">pt_PT.UTF-8</string>
diff --git a/indra/newview/skins/default/xui/pt/menu_attachment_self.xml b/indra/newview/skins/default/xui/pt/menu_attachment_self.xml
index 09060cf3ae..5b32784c32 100644
--- a/indra/newview/skins/default/xui/pt/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/pt/menu_attachment_self.xml
@@ -5,7 +5,7 @@
<menu_item_call label="Tirar" name="Detach"/>
<menu_item_call label="Sentar" name="Sit Down Here"/>
<menu_item_call label="Ficar de pé" name="Stand Up"/>
- <menu_item_call label="Trocar de look" name="Change Outfit"/>
+ <menu_item_call label="Minha aparência" name="Change Outfit"/>
<menu_item_call label="Editar meu look" name="Edit Outfit"/>
<menu_item_call label="Editar meu corpo" name="Edit My Shape"/>
<menu_item_call label="Meus amigos" name="Friends..."/>
diff --git a/indra/newview/skins/default/xui/pt/menu_avatar_self.xml b/indra/newview/skins/default/xui/pt/menu_avatar_self.xml
index 6e203d5a25..e84dcb093d 100644
--- a/indra/newview/skins/default/xui/pt/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/pt/menu_avatar_self.xml
@@ -14,6 +14,7 @@
<menu_item_call label="Camiseta" name="Self Undershirt"/>
<menu_item_call label="Roupa de baixo" name="Self Underpants"/>
<menu_item_call label="Tatuagem" name="Self Tattoo"/>
+ <menu_item_call label="Físico" name="Self Physics"/>
<menu_item_call label="Alpha" name="Self Alpha"/>
<menu_item_call label="Todas as roupas" name="All Clothes"/>
</context_menu>
@@ -21,7 +22,7 @@
<context_menu label="Tirar" name="Object Detach"/>
<menu_item_call label="Tirar tudo" name="Detach All"/>
</context_menu>
- <menu_item_call label="Trocar de look" name="Chenge Outfit"/>
+ <menu_item_call label="Minha aparência" name="Chenge Outfit"/>
<menu_item_call label="Editar meu look" name="Edit Outfit"/>
<menu_item_call label="Editar meu corpo" name="Edit My Shape"/>
<menu_item_call label="Meus amigos" name="Friends..."/>
diff --git a/indra/newview/skins/default/xui/pt/menu_bottomtray.xml b/indra/newview/skins/default/xui/pt/menu_bottomtray.xml
index 479d02512f..4598b8ab25 100644
--- a/indra/newview/skins/default/xui/pt/menu_bottomtray.xml
+++ b/indra/newview/skins/default/xui/pt/menu_bottomtray.xml
@@ -1,14 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="hide_camera_move_controls_menu">
+ <menu_item_check label="Botão Falar" name="EnableVoiceChat"/>
<menu_item_check label="Botão de gestos" name="ShowGestureButton"/>
<menu_item_check label="Botão de movimento" name="ShowMoveButton"/>
<menu_item_check label="Botão de ver" name="ShowCameraButton"/>
<menu_item_check label="Botão de fotos" name="ShowSnapshotButton"/>
- <menu_item_check label="Botão da Barra lateral" name="ShowSidebarButton"/>
<menu_item_check label="Botão Construir" name="ShowBuildButton"/>
<menu_item_check label="Botão Buscar" name="ShowSearchButton"/>
<menu_item_check label="Botão Mapa" name="ShowWorldMapButton"/>
- <menu_item_check label="Botão do Mini Mapa" name="ShowMiniMapButton"/>
+ <menu_item_check label="Botão do Mini mapa" name="ShowMiniMapButton"/>
<menu_item_call label="Cortar" name="NearbyChatBar_Cut"/>
<menu_item_call label="Copiar" name="NearbyChatBar_Copy"/>
<menu_item_call label="Colar" name="NearbyChatBar_Paste"/>
diff --git a/indra/newview/skins/default/xui/pt/menu_hide_navbar.xml b/indra/newview/skins/default/xui/pt/menu_hide_navbar.xml
index c2b063193e..5f6bd096a8 100644
--- a/indra/newview/skins/default/xui/pt/menu_hide_navbar.xml
+++ b/indra/newview/skins/default/xui/pt/menu_hide_navbar.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="hide_navbar_menu">
- <menu_item_check label="Mostrar barra de navegação" name="ShowNavbarNavigationPanel"/>
+ <menu_item_check label="Mostrar barra de navegação e de favoritos" name="ShowNavbarNavigationPanel"/>
<menu_item_check label="Mostrar barra de favoritos" name="ShowNavbarFavoritesPanel"/>
<menu_item_check label="Mostrar minibarra de localização" name="ShowMiniLocationPanel"/>
</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/pt/menu_inspect_avatar_gear.xml
index 6a511e6ab7..2b5aa7508b 100644
--- a/indra/newview/skins/default/xui/pt/menu_inspect_avatar_gear.xml
+++ b/indra/newview/skins/default/xui/pt/menu_inspect_avatar_gear.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<menu name="Gear Menu">
+<toggleable_menu name="Gear Menu">
<menu_item_call label="Ver perfil" name="view_profile"/>
<menu_item_call label="Adicionar amigo..." name="add_friend"/>
<menu_item_call label="MI" name="im"/>
@@ -11,9 +11,11 @@
<menu_item_call label="Denunciar" name="report"/>
<menu_item_call label="Congelar" name="freeze"/>
<menu_item_call label="Ejetar" name="eject"/>
+ <menu_item_call label="Chutar" name="kick"/>
+ <menu_item_call label="CSR" name="csr"/>
<menu_item_call label="Depurar texturas" name="debug"/>
<menu_item_call label="Localizar no mapa" name="find_on_map"/>
<menu_item_call label="Mais zoom" name="zoom_in"/>
<menu_item_call label="Pagar" name="pay"/>
<menu_item_call label="Compartilhar" name="share"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_inspect_object_gear.xml b/indra/newview/skins/default/xui/pt/menu_inspect_object_gear.xml
index 184db26538..7e271904e9 100644
--- a/indra/newview/skins/default/xui/pt/menu_inspect_object_gear.xml
+++ b/indra/newview/skins/default/xui/pt/menu_inspect_object_gear.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<menu name="Gear Menu">
+<toggleable_menu name="Gear Menu">
<menu_item_call label="Tocar" name="touch"/>
<menu_item_call label="Sentar" name="sit"/>
<menu_item_call label="Pagar" name="pay"/>
@@ -12,7 +12,8 @@
<menu_item_call label="Adicionar" name="add"/>
<menu_item_call label="Denunciar" name="report"/>
<menu_item_call label="Bloquear" name="block"/>
+ <menu_item_call label="Desbloquear" name="unblock"/>
<menu_item_call label="Mais zoom" name="zoom_in"/>
<menu_item_call label="Tirar" name="remove"/>
<menu_item_call label="Mais informações" name="more_info"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/pt/menu_inspect_self_gear.xml
index 7e67f4cfd4..e8fafa58a9 100644
--- a/indra/newview/skins/default/xui/pt/menu_inspect_self_gear.xml
+++ b/indra/newview/skins/default/xui/pt/menu_inspect_self_gear.xml
@@ -1,10 +1,31 @@
-<?xml version="1.0" encoding="utf-8"?>
-<menu name="Gear Menu">
- <menu_item_call label="Sentar" name="sit_down_here"/>
- <menu_item_call label="Ficar de pé" name="stand_up"/>
- <menu_item_call label="Trocar de look" name="change_outfit"/>
- <menu_item_call label="Meu perfil" name="my_profile"/>
- <menu_item_call label="Meus amigos" name="my_friends"/>
- <menu_item_call label="Meus grupos" name="my_groups"/>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Gear Menu">
+ <menu_item_call label="Sentar" name="Sit Down Here"/>
+ <menu_item_call label="Ficar de pé" name="Stand Up"/>
+ <context_menu label="Tirar" name="Take Off &gt;">
+ <context_menu label="Roupa" name="Clothes &gt;">
+ <menu_item_call label="Camisa" name="Shirt"/>
+ <menu_item_call label="Calças" name="Pants"/>
+ <menu_item_call label="Saia" name="Skirt"/>
+ <menu_item_call label="Sapatos" name="Shoes"/>
+ <menu_item_call label="Meias" name="Socks"/>
+ <menu_item_call label="Jaqueta" name="Jacket"/>
+ <menu_item_call label="Luvas" name="Gloves"/>
+ <menu_item_call label="Camiseta" name="Self Undershirt"/>
+ <menu_item_call label="Roupa de baixo" name="Self Underpants"/>
+ <menu_item_call label="Tatuagem" name="Self Tattoo"/>
+ <menu_item_call label="Alpha" name="Self Alpha"/>
+ <menu_item_call label="Todas as roupas" name="All Clothes"/>
+ </context_menu>
+ <context_menu label="HUD" name="Object Detach HUD"/>
+ <context_menu label="Separar" name="Object Detach"/>
+ <menu_item_call label="Separar tudo" name="Detach All"/>
+ </context_menu>
+ <menu_item_call label="Trocar de look" name="Chenge Outfit"/>
+ <menu_item_call label="Editar meu look" name="Edit Outfit"/>
+ <menu_item_call label="Editar meu corpo" name="Edit My Shape"/>
+ <menu_item_call label="Meus amigos" name="Friends..."/>
+ <menu_item_call label="Meus grupos" name="Groups..."/>
+ <menu_item_call label="Meu perfil" name="Profile..."/>
<menu_item_call label="Depurar texturas" name="Debug..."/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_inventory.xml b/indra/newview/skins/default/xui/pt/menu_inventory.xml
index 1b1efd3270..09e1fbf72e 100644
--- a/indra/newview/skins/default/xui/pt/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/pt/menu_inventory.xml
@@ -25,6 +25,7 @@
<menu_item_call label="Nova roupa de baixo" name="New Underpants"/>
<menu_item_call label="Nova máscara alfa" name="New Alpha Mask"/>
<menu_item_call label="Nova tatuagem" name="New Tattoo"/>
+ <menu_item_call label="Novo físico" name="New Physics"/>
</menu>
<menu label="Nova parte do corpo" name="New Body Parts">
<menu_item_call label="Nova forma" name="New Shape"/>
@@ -58,6 +59,7 @@
<menu_item_call label="Propriedades" name="Properties"/>
<menu_item_call label="Renomear" name="Rename"/>
<menu_item_call label="Copiar item UUID" name="Copy Asset UUID"/>
+ <menu_item_call label="Cortar" name="Cut"/>
<menu_item_call label="Copiar" name="Copy"/>
<menu_item_call label="Colar" name="Paste"/>
<menu_item_call label="Colar como link" name="Paste As Link"/>
@@ -82,5 +84,7 @@
<menu_item_call label="Editar" name="Wearable Edit"/>
<menu_item_call label="Adicionar" name="Wearable Add"/>
<menu_item_call label="Tirar" name="Take Off"/>
+ <menu_item_call label="Copiar para Caixa de saída do lojista" name="Merchant Copy"/>
+ <menu_item_call label="Enviar para Mercado" name="Marketplace Send"/>
<menu_item_call label="--Sem opções--" name="--no options--"/>
</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_inventory_add.xml b/indra/newview/skins/default/xui/pt/menu_inventory_add.xml
index 2723f39287..7a7ebc50af 100644
--- a/indra/newview/skins/default/xui/pt/menu_inventory_add.xml
+++ b/indra/newview/skins/default/xui/pt/menu_inventory_add.xml
@@ -4,6 +4,8 @@
<menu_item_call label="Imagem (L$[COST])..." name="Upload Image"/>
<menu_item_call label="Som (L$[COST])..." name="Upload Sound"/>
<menu_item_call label="Animação (L$[COST])..." name="Upload Animation"/>
+ <menu_item_call label="Modelar..." name="Upload Model"/>
+ <menu_item_call label="Assistente de modelagem..." name="Upload Model Wizard"/>
<menu_item_call label="Volume (L$[COST] per file)..." name="Bulk Upload"/>
<menu_item_call label="Autorizações de upload padrão" name="perm prefs"/>
</menu>
@@ -23,6 +25,7 @@
<menu_item_call label="Novas roupa de baixo" name="New Underpants"/>
<menu_item_call label="Novo alpha" name="New Alpha"/>
<menu_item_call label="Nova tatuagem" name="New Tattoo"/>
+ <menu_item_call label="Novo físico" name="New Physics"/>
</menu>
<menu label="Nova parte do corpo" name="New Body Parts">
<menu_item_call label="Nova forma" name="New Shape"/>
diff --git a/indra/newview/skins/default/xui/pt/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/pt/menu_inventory_gear_default.xml
index a3e62924ec..6faea517fe 100644
--- a/indra/newview/skins/default/xui/pt/menu_inventory_gear_default.xml
+++ b/indra/newview/skins/default/xui/pt/menu_inventory_gear_default.xml
@@ -1,8 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_gear_default">
+<toggleable_menu name="menu_gear_default">
<menu_item_call label="Nova janela de inventário" name="new_window"/>
- <menu_item_call label="Ordenar por nome" name="sort_by_name"/>
- <menu_item_call label="Ordenar por mais recente" name="sort_by_recent"/>
+ <menu_item_check label="Ordenar por nome" name="sort_by_name"/>
+ <menu_item_check label="Ordenar por mais recente" name="sort_by_recent"/>
+ <menu_item_check label="Sempre ordenar pastas por nome" name="sort_folders_by_name"/>
+ <menu_item_check label="Pastas do sistema no topo" name="sort_system_folders_to_top"/>
<menu_item_call label="Mostrar filtros" name="show_filters"/>
<menu_item_call label="Restabelecer filtros" name="reset_filters"/>
<menu_item_call label="Fechar todas as pastas" name="close_folders"/>
@@ -12,4 +14,4 @@
<menu_item_call label="Encontrar original" name="Find Original"/>
<menu_item_call label="Encontrar todos os links" name="Find All Links"/>
<menu_item_call label="Esvaziar lixeira" name="empty_trash"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_login.xml b/indra/newview/skins/default/xui/pt/menu_login.xml
index a43ac271a9..be94ad49db 100644
--- a/indra/newview/skins/default/xui/pt/menu_login.xml
+++ b/indra/newview/skins/default/xui/pt/menu_login.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu_bar name="Login Menu">
<menu label="Eu" name="File">
- <menu_item_call label="Preferências" name="Preferences..."/>
+ <menu_item_call label="Preferências..." name="Preferences..."/>
<menu_item_call label="Sair do [APP_NAME]" name="Quit"/>
</menu>
<menu label="Ajuda" name="Help">
@@ -16,7 +16,8 @@
<menu_item_call label="Definir tamanho da janela:" name="Set Window Size..."/>
<menu_item_call label="Mostrar TOS" name="TOS"/>
<menu_item_call label="Mostrar mensagem crítica" name="Critical"/>
- <menu_item_call label="Teste de navegador web" name="Web Browser Test"/>
+ <menu_item_call label="Test de Bugs de Conteúdo Web" name="Web Content Floater Debug Test"/>
+ <menu label="Configurar nível de registro em log" name="Set Logging Level"/>
<menu_item_check label="Exibir seletor da grade" name="Show Grid Picker"/>
<menu_item_call label="Exibir painel de notificações" name="Show Notifications Console"/>
</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_media_ctrl.xml b/indra/newview/skins/default/xui/pt/menu_media_ctrl.xml
new file mode 100644
index 0000000000..ac84b02870
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_media_ctrl.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="media ctrl context menu">
+ <menu_item_call label="Cortar" name="Cut"/>
+ <menu_item_call label="Cortar" name="Copy"/>
+ <menu_item_call label="Colar" name="Paste"/>
+ <menu_item_call label="Abrir o Web Inspector" name="open_webinspector"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_mini_map.xml b/indra/newview/skins/default/xui/pt/menu_mini_map.xml
index d742038e15..6a3fe55de5 100644
--- a/indra/newview/skins/default/xui/pt/menu_mini_map.xml
+++ b/indra/newview/skins/default/xui/pt/menu_mini_map.xml
@@ -3,6 +3,7 @@
<menu_item_call label="Zoom Perto" name="Zoom Close"/>
<menu_item_call label="Zoom Médio" name="Zoom Medium"/>
<menu_item_call label="Zoom Longe" name="Zoom Far"/>
+ <menu_item_call label="Zoom padrão" name="Zoom Default"/>
<menu_item_check label="Girar mapa" name="Rotate Map"/>
<menu_item_check label="Auto Center" name="Auto Center"/>
<menu_item_call label="Parar Acompanhamento" name="Stop Tracking"/>
diff --git a/indra/newview/skins/default/xui/pt/menu_mode_change.xml b/indra/newview/skins/default/xui/pt/menu_mode_change.xml
new file mode 100644
index 0000000000..314d3e409b
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_mode_change.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Mode Change">
+ <menu_item_check label="Básico" name="BasicMode"/>
+ <menu_item_check label="Avançado" name="AdvancedMode"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_model_import_gear_default.xml b/indra/newview/skins/default/xui/pt/menu_model_import_gear_default.xml
new file mode 100644
index 0000000000..079f876add
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_model_import_gear_default.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="model_menu_gear_default">
+ <menu_item_check label="Mostrar bordas" name="show_edges"/>
+ <menu_item_check label="Mostrar física" name="show_physics"/>
+ <menu_item_check label="Mostrar texturas" name="show_textures"/>
+ <menu_item_check label="Mostrar peso da pele" name="show_skin_weight"/>
+ <menu_item_check label="Mostrar posição das juntas" name="show_joint_positions"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_object.xml b/indra/newview/skins/default/xui/pt/menu_object.xml
index bf94859699..f4919e0c1f 100644
--- a/indra/newview/skins/default/xui/pt/menu_object.xml
+++ b/indra/newview/skins/default/xui/pt/menu_object.xml
@@ -16,14 +16,14 @@
<context_menu label="Anexar" name="Object Attach"/>
<context_menu label="Anexar o HUD" name="Object Attach HUD"/>
</context_menu>
- <context_menu label="Tirar" name="Remove">
+ <context_menu label="Gerenciar" name="Remove">
<menu_item_call label="Denunciar abuso" name="Report Abuse..."/>
<menu_item_call label="Bloquear" name="Object Mute"/>
<menu_item_call label="Devolver" name="Return..."/>
- <menu_item_call label="Excluir" name="Delete"/>
</context_menu>
<menu_item_call label="Pegar" name="Pie Object Take"/>
<menu_item_call label="Pegar uma cópia" name="Take Copy"/>
<menu_item_call label="Pagar" name="Pay..."/>
<menu_item_call label="Comprar" name="Buy..."/>
+ <menu_item_call label="Excluir" name="Delete"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_outfit_gear.xml b/indra/newview/skins/default/xui/pt/menu_outfit_gear.xml
index 11b3e653c6..894f1d741c 100644
--- a/indra/newview/skins/default/xui/pt/menu_outfit_gear.xml
+++ b/indra/newview/skins/default/xui/pt/menu_outfit_gear.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Gear Outfit">
+<toggleable_menu name="Gear Outfit">
<menu_item_call label="Vestir - Substituir look atual" name="wear"/>
<menu_item_call label="Vestir - Adicionar ao look atual" name="wear_add"/>
<menu_item_call label="Tirar - Tirar do look atual" name="take_off"/>
@@ -14,6 +14,7 @@
<menu_item_call label="Nova camiseta" name="New Undershirt"/>
<menu_item_call label="Novas roupa de baixo" name="New Underpants"/>
<menu_item_call label="Novo alpha" name="New Alpha"/>
+ <menu_item_call label="Novo físico" name="New Physics"/>
<menu_item_call label="Nova tatuagem" name="New Tattoo"/>
</menu>
<menu label="Nova parte do corpo" name="New Body Parts">
@@ -24,4 +25,4 @@
</menu>
<menu_item_call label="Renomear look" name="rename"/>
<menu_item_call label="Excluir visual" name="delete_outfit"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_people_nearby_view_sort.xml b/indra/newview/skins/default/xui/pt/menu_people_nearby_view_sort.xml
index 228ce46a31..0d32d58de4 100644
--- a/indra/newview/skins/default/xui/pt/menu_people_nearby_view_sort.xml
+++ b/indra/newview/skins/default/xui/pt/menu_people_nearby_view_sort.xml
@@ -1,8 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
+<toggleable_menu name="menu_group_plus">
<menu_item_check label="Ordenar por conversas mais recentes" name="sort_by_recent_speakers"/>
<menu_item_check label="Ordenar por nome" name="sort_name"/>
<menu_item_check label="Ordenar por distância" name="sort_distance"/>
<menu_item_check label="Ver ícones de pessoas" name="view_icons"/>
+ <menu_item_check label="Ver Mapa" name="view_map"/>
<menu_item_call label="Ver residentes e objetos bloqueados" name="show_blocked_list"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/pt/menu_places_gear_folder.xml
index 2059a9ed2d..7cba70a110 100644
--- a/indra/newview/skins/default/xui/pt/menu_places_gear_folder.xml
+++ b/indra/newview/skins/default/xui/pt/menu_places_gear_folder.xml
@@ -1,7 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_folder_gear">
+<toggleable_menu name="menu_folder_gear">
<menu_item_call label="Adicionar marco" name="add_landmark"/>
<menu_item_call label="Adicionar pasta" name="add_folder"/>
+ <menu_item_call label="Restaurar item" name="restore_item"/>
<menu_item_call label="Cortar" name="cut"/>
<menu_item_call label="Copiar" name="copy_folder"/>
<menu_item_call label="Colar" name="paste"/>
@@ -12,4 +13,4 @@
<menu_item_call label="Expandir todas as pastas" name="expand_all"/>
<menu_item_call label="Recolher todas as pastas" name="collapse_all"/>
<menu_item_check label="Ordenar por data" name="sort_by_date"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/pt/menu_places_gear_landmark.xml
index 52a9d13735..fec0911fcf 100644
--- a/indra/newview/skins/default/xui/pt/menu_places_gear_landmark.xml
+++ b/indra/newview/skins/default/xui/pt/menu_places_gear_landmark.xml
@@ -1,10 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_ladmark_gear">
+<toggleable_menu name="menu_ladmark_gear">
<menu_item_call label="Teletransportar" name="teleport"/>
<menu_item_call label="Mais informações" name="more_info"/>
<menu_item_call label="Mostrar no mapa" name="show_on_map"/>
<menu_item_call label="Adicionar marco" name="add_landmark"/>
<menu_item_call label="Adicionar pasta" name="add_folder"/>
+ <menu_item_call label="Restaurar item" name="restore_item"/>
<menu_item_call label="Cortar" name="cut"/>
<menu_item_call label="Copiar marco" name="copy_landmark"/>
<menu_item_call label="Copiar SLurl" name="copy_slurl"/>
@@ -15,4 +16,4 @@
<menu_item_call label="Recolher todas as pastas" name="collapse_all"/>
<menu_item_check label="Ordenar por data" name="sort_by_date"/>
<menu_item_call label="Criar destaque" name="create_pick"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_toolbars.xml b/indra/newview/skins/default/xui/pt/menu_toolbars.xml
new file mode 100644
index 0000000000..b58a1a6e4f
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_toolbars.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Toolbars Popup">
+ <menu_item_call label="Remover este botão" name="Remove button"/>
+ <menu_item_call label="Botões da barra de ferramentas..." name="Choose Buttons"/>
+ <menu_item_check label="Ãcones e rótulos" name="icons_with_text"/>
+ <menu_item_check label="Somente ícones" name="icons_only"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_viewer.xml b/indra/newview/skins/default/xui/pt/menu_viewer.xml
index dc0e2ffb64..d7d5d59a33 100644
--- a/indra/newview/skins/default/xui/pt/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/pt/menu_viewer.xml
@@ -1,62 +1,92 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu_bar name="Main Menu">
<menu label="Eu" name="Me">
- <menu_item_call label="Preferências" name="Preferences"/>
- <menu_item_call label="Meu painel" name="Manage My Account">
- <menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=pt"/>
- </menu_item_call>
- <menu_item_call label="Comprar L$" name="Buy and Sell L$"/>
- <menu_item_call label="Meu perfil" name="Profile"/>
- <menu_item_call label="Trocar de look" name="ChangeOutfit"/>
- <menu_item_check label="Meu inventário" name="Inventory"/>
- <menu_item_check label="Meu inventário" name="ShowSidetrayInventory"/>
- <menu_item_check label="Meus gestos" name="Gestures"/>
- <menu_item_check label="Minha voz" name="ShowVoice"/>
- <menu label="Meu status" name="Status">
+ <menu_item_call label="Perfil..." name="Profile"/>
+ <menu_item_call label="Aparência..." name="ChangeOutfit"/>
+ <menu_item_call label="Selecione um avatar..." name="Avatar Picker"/>
+ <menu_item_check label="Inventário..." name="Inventory"/>
+ <menu_item_call label="Nova janela de inventário" name="NewInventoryWindow"/>
+ <menu_item_call label="Lugares..." name="Places"/>
+ <menu_item_call label="Destaques..." name="Picks"/>
+ <menu_item_call label="Controles da câmera..." name="Camera Controls"/>
+ <menu label="Movimentos" name="Movement">
+ <menu_item_call label="Sentar" name="Sit Down Here"/>
+ <menu_item_check label="Voar" name="Fly"/>
+ <menu_item_check label="Correr sempre" name="Always Run"/>
+ <menu_item_call label="Parar minha animação" name="Stop Animating My Avatar"/>
+ <menu_item_call label="Andar/correr/voar..." name="Walk / run / fly"/>
+ </menu>
+ <menu label="Status" name="Status">
<menu_item_call label="Ausente" name="Set Away"/>
<menu_item_call label="Ocupado" name="Set Busy"/>
</menu>
- <menu_item_call label="Request Admin Status" name="Request Admin Options"/>
- <menu_item_call label="Sair do modo admin" name="Leave Admin Options"/>
+ <menu_item_call label="Comprar L$..." name="Buy and Sell L$"/>
+ <menu_item_call label="Caixa de saída do lojista..." name="MerchantOutbox"/>
+ <menu_item_call label="Painel da conta..." name="Manage My Account">
+ <menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=pt"/>
+ </menu_item_call>
+ <menu_item_call label="Preferências..." name="Preferences"/>
+ <menu_item_call label="Botões da barra de ferramentas..." name="Toolbars"/>
+ <menu_item_call label="Ocultar todos os controles" name="Hide UI"/>
<menu_item_call label="Sair do [APP_NAME]" name="Quit"/>
</menu>
<menu label="Comunicar" name="Communicate">
- <menu_item_call label="Meus amigos" name="My Friends"/>
- <menu_item_call label="Meus grupos" name="My Groups"/>
- <menu_item_check label="Bate-papo local" name="Nearby Chat"/>
- <menu_item_call label="Pessoas por perto" name="Active Speakers"/>
+ <menu_item_check label="Bate-papo..." name="Nearby Chat"/>
+ <menu_item_check label="Falar" name="Speak"/>
+ <menu_item_check label="Configurações de voz..." name="Nearby Voice"/>
+ <menu_item_check label="Distorção de voz..." name="ShowVoice"/>
+ <menu_item_check label="Gestos..." name="Gestures"/>
+ <menu_item_call label="Amigos" name="My Friends"/>
+ <menu_item_call label="Grupos" name="My Groups"/>
+ <menu_item_call label="Pessoas próximas" name="Active Speakers"/>
</menu>
<menu label="Mundo" name="World">
- <menu_item_check label="Mini Mapa" name="Mini-Map"/>
+ <menu_item_call label="Criar marco deste lugar" name="Create Landmark Here"/>
+ <menu_item_call label="Destinos..." name="Destinations"/>
<menu_item_check label="Mapa-múndi" name="World Map"/>
+ <menu_item_check label="Mini Mapa" name="Mini-Map"/>
+ <menu_item_check label="Busca" name="Search"/>
+ <menu_item_call label="Teletransportar para início" name="Teleport Home"/>
+ <menu_item_call label="Definir como casa" name="Set Home to Here"/>
<menu_item_call label="Foto" name="Take Snapshot"/>
- <menu_item_call label="Criar marco deste lugar" name="Create Landmark Here"/>
- <menu label="Perfil da região" name="Land">
- <menu_item_call label="Perfil da região" name="Place Profile"/>
- <menu_item_call label="Sobre terrenos" name="About Land"/>
- <menu_item_call label="Região/Propriedade" name="Region/Estate"/>
- </menu>
+ <menu_item_call label="Perfil da região" name="Place Profile"/>
+ <menu_item_call label="Sobre terrenos" name="About Land"/>
+ <menu_item_call label="Região/Propriedade" name="Region/Estate"/>
+ <menu_item_call label="Meus terrenos..." name="My Land"/>
<menu_item_call label="Comprar este terreno" name="Buy Land"/>
- <menu_item_call label="Meus terrenos" name="My Land"/>
<menu label="Mostrar" name="LandShow">
- <menu_item_check label="Controles de movimento" name="Movement Controls"/>
- <menu_item_check label="Ver controles" name="Camera Controls"/>
<menu_item_check label="Limites" name="Ban Lines"/>
<menu_item_check label="Balizas" name="beacons"/>
<menu_item_check label="Limites do imóvel" name="Property Lines"/>
<menu_item_check label="Proprietários" name="Land Owners"/>
<menu_item_check label="Coordenadas" name="Coordinates"/>
<menu_item_check label="Propriedades do lote" name="Parcel Properties"/>
+ <menu_item_check label="Menu avançado" name="Show Advanced Menu"/>
</menu>
- <menu_item_call label="Teletransportar para meu início" name="Teleport Home"/>
- <menu_item_call label="Definir como Início" name="Set Home to Here"/>
- <menu label="Sol" name="Environment Settings">
+ <menu label="Sol" name="Sun">
<menu_item_call label="Amanhecer" name="Sunrise"/>
<menu_item_call label="Meio-dia" name="Noon"/>
- <menu_item_call label="Pôr-do-Sol" name="Sunset"/>
+ <menu_item_call label="Pôr-do-sol" name="Sunset"/>
<menu_item_call label="Meia-noite" name="Midnight"/>
- <menu_item_call label="Horário da propriedade" name="Revert to Region Default"/>
- <menu_item_call label="Editor de ambiente" name="Environment Editor"/>
+ <menu_item_call label="Usar configurações da região" name="Use Region Settings"/>
+ </menu>
+ <menu label="Editor de ambientes" name="Environment Editor">
+ <menu_item_call label="Configurações do ambiente..." name="Environment Settings"/>
+ <menu label="Predefinições da água" name="Water Presets">
+ <menu_item_call label="Nova predefinição..." name="new_water_preset"/>
+ <menu_item_call label="Editar predefinição..." name="edit_water_preset"/>
+ <menu_item_call label="Excluir predefinição..." name="delete_water_preset"/>
+ </menu>
+ <menu label="Predefinições de céu" name="Sky Presets">
+ <menu_item_call label="Nova predefinição..." name="new_sky_preset"/>
+ <menu_item_call label="Editar predefinição..." name="edit_sky_preset"/>
+ <menu_item_call label="Excluir predefinição..." name="delete_sky_preset"/>
+ </menu>
+ <menu label="Predefinições do dia" name="Day Presets">
+ <menu_item_call label="Nova predefinição..." name="new_day_preset"/>
+ <menu_item_call label="Editar predefinição..." name="edit_day_preset"/>
+ <menu_item_call label="Excluir predefinição..." name="delete_day_preset"/>
+ </menu>
</menu>
</menu>
<menu label="Construir" name="BuildTools">
@@ -70,7 +100,7 @@
</menu>
<menu_item_call label="Link" name="Link"/>
<menu_item_call label="Desconectar links" name="Unlink"/>
- <menu_item_check label="Edit Linked Parts" name="Edit Linked Parts"/>
+ <menu_item_check label="Editar partes linkadas" name="Edit Linked Parts"/>
<menu label="Selecionar partes conectadas" name="Select Linked Parts">
<menu_item_call label="Selecionar próxima parte" name="Select Next Part"/>
<menu_item_call label="Selecionar parte anterior" name="Select Previous Part"/>
@@ -84,7 +114,7 @@
<menu_item_call label="Pegar" name="Menu Object Take"/>
<menu_item_call label="Pegar uma cópia" name="Take Copy"/>
<menu_item_call label="Salvar no meu inventário" name="Save Object Back to My Inventory"/>
- <menu_item_call label="Save Back to Object Contents" name="Save Object Back to Object Contents"/>
+ <menu_item_call label="Salvar objeto de volta aos conteúdos do objeto" name="Save Object Back to Object Contents"/>
<menu_item_call label="Devolver objeto" name="Return Object back to Owner"/>
</menu>
<menu label="Scripts" name="Scripts">
@@ -112,18 +142,21 @@
<menu_item_call label="Imagem (L$[COST])..." name="Upload Image"/>
<menu_item_call label="Som (L$[COST])..." name="Upload Sound"/>
<menu_item_call label="Animação (L$[COST])..." name="Upload Animation"/>
+ <menu_item_call label="Modelar..." name="Upload Model"/>
<menu_item_call label="Volume (L$[COST] por arquivo)..." name="Bulk Upload"/>
+ <menu_item_call label="Autorizações de upload padrão" name="perm prefs"/>
</menu>
+ <menu_item_call label="Desfazer" name="Undo"/>
+ <menu_item_call label="Repetir" name="Redo"/>
</menu>
<menu label="Ajuda" name="Help">
+ <menu_item_call label="Como..." name="How To"/>
<menu_item_call label="[SECOND_LIFE] Ajuda" name="Second Life Help"/>
<menu_item_call label="Denunciar abuso" name="Report Abuse"/>
<menu_item_call label="Relatar bug" name="Report Bug"/>
<menu_item_call label="Sobre [APP_NAME]" name="About Second Life"/>
- <menu_item_check label="Ativar dicas" name="Enable Hints"/>
</menu>
<menu label="Avançado" name="Advanced">
- <menu_item_call label="Parar minha animação" name="Stop Animating My Avatar"/>
<menu_item_call label="Recarregar texturas" name="Rebake Texture"/>
<menu_item_call label="Interface tamanho padrão" name="Set UI Size to Default"/>
<menu_item_call label="Definir tamanho da janela:" name="Set Window Size..."/>
@@ -131,37 +164,36 @@
<menu_item_check label="Disable Camera Constraints" name="Disable Camera Distance"/>
<menu_item_check label="Foto de alta resolução" name="HighResSnapshot"/>
<menu_item_check label="Compactar fotos para HD" name="QuietSnapshotsToDisk"/>
- <menu_item_check label="Compactar fotos para HD" name="CompressSnapshotsToDisk"/>
<menu label="Ferramentas de desempenho" name="Performance Tools">
<menu_item_call label="Medidor de lag" name="Lag Meter"/>
<menu_item_check label="Barra de estatísticas" name="Statistics Bar"/>
- <menu_item_check label="Carga de renderização de avatar" name="Avatar Rendering Cost"/>
+ <menu_item_check label="Mostrar peso do desenho para avatares" name="Avatar Rendering Cost"/>
</menu>
<menu label="Realces e visibilidade" name="Highlighting and Visibility">
<menu_item_check label="Efeito baliza piscando" name="Cheesy Beacon"/>
- <menu_item_check label="Hide Particles" name="Hide Particles"/>
+ <menu_item_check label="Esconder partículas" name="Hide Particles"/>
<menu_item_check label="Ocultar seleções" name="Hide Selected"/>
<menu_item_check label="Realçar transparentes" name="Highlight Transparent"/>
<menu_item_check label="Mostrar anexos HUD" name="Show HUD Attachments"/>
<menu_item_check label="Mostrar retículo na vista subjetiva" name="ShowCrosshairs"/>
</menu>
<menu label="Tipos de renderização" name="Rendering Types">
- <menu_item_check label="Simples" name="Simple"/>
- <menu_item_check label="Alpha" name="Alpha"/>
- <menu_item_check label="Ãrvore" name="Tree"/>
- <menu_item_check label="Avatares" name="Character"/>
- <menu_item_check label="SurfacePath" name="SurfacePath"/>
- <menu_item_check label="Céu" name="Sky"/>
- <menu_item_check label="Ãgua" name="Water"/>
- <menu_item_check label="Chão" name="Ground"/>
- <menu_item_check label="Volume" name="Volume"/>
- <menu_item_check label="Grama" name="Grass"/>
- <menu_item_check label="Nuvens" name="Clouds"/>
- <menu_item_check label="Particles" name="Particles"/>
- <menu_item_check label="Elevação" name="Bump"/>
+ <menu_item_check label="Simples" name="Rendering Type Simple"/>
+ <menu_item_check label="Alpha" name="Rendering Type Alpha"/>
+ <menu_item_check label="Ãrvore" name="Rendering Type Tree"/>
+ <menu_item_check label="Avatares" name="Rendering Type Character"/>
+ <menu_item_check label="Patch de superfície" name="Rendering Type Surface Patch"/>
+ <menu_item_check label="Céu" name="Rendering Type Sky"/>
+ <menu_item_check label="Ãgua" name="Rendering Type Water"/>
+ <menu_item_check label="Chão" name="Rendering Type Ground"/>
+ <menu_item_check label="Volume" name="Rendering Type Volume"/>
+ <menu_item_check label="Grama" name="Rendering Type Grass"/>
+ <menu_item_check label="Nuvens" name="Rendering Type Clouds"/>
+ <menu_item_check label="Partículas" name="Rendering Type Particles"/>
+ <menu_item_check label="Elevação" name="Rendering Type Bump"/>
</menu>
<menu label="Recursos de renderização" name="Rendering Features">
- <menu_item_check label="Interface" name="UI"/>
+ <menu_item_check label="Interface" name="ToggleUI"/>
<menu_item_check label="Selecionado" name="Selected"/>
<menu_item_check label="Realçado" name="Highlighted"/>
<menu_item_check label="Texturas dinâmicas" name="Dynamic Textures"/>
@@ -172,13 +204,9 @@
<menu_item_check label="Usar plugin de leitura de threads" name="Use Plugin Read Thread"/>
<menu_item_call label="Limpar cache de grupo" name="ClearGroupCache"/>
<menu_item_check label="Smoothing de mouse" name="Mouse Smoothing"/>
+ <menu_item_call label="Liberar teclas" name="Release Keys"/>
<menu label="Atalhos" name="Shortcuts">
- <menu_item_call label="Imagem (L$[COST])..." name="Upload Image"/>
- <menu_item_check label="Busca" name="Search"/>
- <menu_item_call label="Soltar objeto" name="Release Keys"/>
- <menu_item_call label="Interface tamanho padrão" name="Set UI Size to Default"/>
- <menu_item_check label="Correr sempre" name="Always Run"/>
- <menu_item_check label="Voar" name="Fly"/>
+ <menu_item_check label="Mostrar menu avançado - atalho antigo" name="Show Advanced Menu - legacy shortcut"/>
<menu_item_call label="Fechar janela" name="Close Window"/>
<menu_item_call label="Fechar todas as janelas" name="Close All Windows"/>
<menu_item_call label="Gravar fotos no HD" name="Snapshot to Disk"/>
@@ -186,17 +214,9 @@
<menu_item_check label="Flycam Joystick" name="Joystick Flycam"/>
<menu_item_call label="Visão padrão" name="Reset View"/>
<menu_item_call label="Olhar para quem fala por último" name="Look at Last Chatter"/>
- <menu label="Selecionar ferramenta de construção" name="Select Tool">
- <menu_item_call label="Ferramenta enfoque" name="Focus"/>
- <menu_item_call label="Ferramenta de movimentação" name="Move"/>
- <menu_item_call label="Ferramenta de edição" name="Edit"/>
- <menu_item_call label="Ferramenta criar" name="Create"/>
- <menu_item_call label="Ferramenta de terrenos" name="Land"/>
- </menu>
<menu_item_call label="Mais zoom" name="Zoom In"/>
<menu_item_call label="Zoom padrão" name="Zoom Default"/>
<menu_item_call label="Menos zoom" name="Zoom Out"/>
- <menu_item_check label="Exibir menu avançado" name="Show Advanced Menu"/>
</menu>
<menu_item_call label="Mostrar configurações de depuração" name="Debug Settings"/>
<menu_item_check label="Show Develop Menu" name="Debug Mode"/>
@@ -210,6 +230,7 @@
<menu_item_check label="Painel de texturas" name="Texture Category"/>
<menu_item_check label="Tempos" name="Fast Timers"/>
<menu_item_check label="Memória" name="Memory"/>
+ <menu_item_check label="Estatísticas da cena" name="Scene Statistics"/>
<menu_item_call label="Region Info to Debug Console" name="Region Info to Debug Console"/>
<menu_item_check label="Câmera:" name="Camera"/>
<menu_item_check label="Vento" name="Wind"/>
@@ -217,8 +238,12 @@
</menu>
<menu label="Show Info" name="Display Info">
<menu_item_check label="Mostrar hora" name="Show Time"/>
+ <menu_item_check label="Mostar custo do upload" name="Show Upload Cost"/>
<menu_item_check label="Dados de renderização" name="Show Render Info"/>
+ <menu_item_check label="Mostrar info da textura" name="Show Texture Info"/>
<menu_item_check label="Mostrar cor sob o cursor" name="Show Color Under Cursor"/>
+ <menu_item_check label="Mostrar memória" name="Show Memory"/>
+ <menu_item_check label="Exibir informações de memória privadas" name="Show Private Mem Info"/>
<menu_item_check label="Mostrar mudanças a objetos" name="Show Updates"/>
</menu>
<menu label="Force an Error" name="Force Errors">
@@ -236,13 +261,23 @@
<menu_item_check label="Taxa de quadros aleatória" name="Randomize Framerate"/>
<menu_item_check label="Frame Test" name="Frame Test"/>
</menu>
+ <menu label="Render Metadata" name="Render Metadata">
+ <menu_item_check label="Normais" name="Normals"/>
+ <menu_item_check label="Formas físicas" name="Physics Shapes"/>
+ <menu_item_check label="Tipo de atualização" name="Update Type"/>
+ <menu_item_check label="Dados LOD" name="LOD Info"/>
+ <menu_item_check label="Fila de construção" name="Build Queue"/>
+ <menu_item_check label="Vetores de vento" name="Wind Vectors"/>
+ <menu_item_check label="Renderizar complexidade" name="rendercomplexity"/>
+ <menu_item_check label="Bytes do anexo" name="attachment bytes"/>
+ <menu_item_check label="Esculpir" name="Sculpt"/>
+ </menu>
<menu label="Rendering" name="Rendering">
<menu_item_check label="Axes" name="Axes"/>
<menu_item_check label="Wireframe" name="Wireframe"/>
<menu_item_check label="Iluminação e sombras" name="Lighting and Shadows"/>
<menu_item_check label="Sombras da projeção do sol/lua" name="Shadows from Sun/Moon/Projectors"/>
<menu_item_check label="SSAO e sombra suave" name="SSAO and Shadow Smoothing"/>
- <menu_item_check label="Iluminação global (fase experimental)" name="Global Illumination"/>
<menu_item_check label="Máscaras alpha automáticas (adiadas)" name="Automatic Alpha Masks (deferred)"/>
<menu_item_check label="Máscaras alpha automáticas (sem adiar)" name="Automatic Alpha Masks (non-deferred)"/>
<menu_item_check label="Texturas de animação" name="Animation Textures"/>
@@ -257,37 +292,34 @@
<menu_item_call label="Drop a Packet" name="Drop a Packet"/>
</menu>
<menu_item_call label="Empurrões, trombadas e tapas" name="Bumps, Pushes &amp;amp; Hits"/>
- <menu label="Mundo" name="World">
- <menu_item_check label="Impor sobre sol regional" name="Sim Sun Override"/>
- <menu_item_check label="Efeito baliza piscando" name="Cheesy Beacon"/>
- <menu_item_check label="Fixed Weather" name="Fixed Weather"/>
- <menu_item_call label="Dump Region Object Cache" name="Dump Region Object Cache"/>
+ <menu label="Mundo" name="DevelopWorld">
+ <menu_item_check label="Impor sobre sol de simulação" name="Sim Sun Override"/>
+ <menu_item_check label="Clima fixo" name="Fixed Weather"/>
+ <menu_item_call label="Descartar cache do objeto de região" name="Dump Region Object Cache"/>
</menu>
<menu label="Interface" name="UI">
- <menu_item_call label="Teste de navegador web" name="Web Browser Test"/>
+ <menu_item_call label="Teste de mídia do navegador" name="Web Browser Test"/>
+ <menu_item_call label="Navegador de conteúdo web" name="Web Content Browser"/>
<menu_item_call label="Print Selected Object Info" name="Print Selected Object Info"/>
<menu_item_call label="Dados de memória" name="Memory Stats"/>
- <menu_item_check label="Trajeto c/ dois cliques" name="Double-ClickAuto-Pilot"/>
- <menu_item_check label="Teletransportar c/ dois cliques" name="DoubleClick Teleport"/>
+ <menu_item_check label="Console de depuração de região" name="Region Debug Console"/>
<menu_item_check label="Debug Clicks" name="Debug Clicks"/>
<menu_item_check label="Debug Mouse Events" name="Debug Mouse Events"/>
</menu>
<menu label="XUI" name="XUI">
<menu_item_call label="Recarregar cores" name="Reload Color Settings"/>
<menu_item_call label="Teste de fonte" name="Show Font Test"/>
- <menu_item_call label="Carregar de XML" name="Load from XML"/>
- <menu_item_call label="Salvar para XML" name="Save to XML"/>
<menu_item_check label="Mostrar nomes XUI" name="Show XUI Names"/>
<menu_item_call label="Enviar MIs de teste" name="Send Test IMs"/>
<menu_item_call label="Limpar cache de nomes" name="Flush Names Caches"/>
</menu>
<menu label="Avatar" name="Character">
<menu label="Grab Baked Texture" name="Grab Baked Texture">
- <menu_item_call label="Ãris" name="Iris"/>
- <menu_item_call label="Cabeça" name="Head"/>
- <menu_item_call label="Cintura acima" name="Upper Body"/>
- <menu_item_call label="Cintura para baixo" name="Lower Body"/>
- <menu_item_call label="Saia" name="Skirt"/>
+ <menu_item_call label="Ãris" name="Grab Iris"/>
+ <menu_item_call label="Cabeça" name="Grab Head"/>
+ <menu_item_call label="Cintura acima" name="Grab Upper Body"/>
+ <menu_item_call label="Cintura para baixo" name="Grab Lower Body"/>
+ <menu_item_call label="Saia" name="Grab Skirt"/>
</menu>
<menu label="Testes de personagem" name="Character Tests">
<menu_item_call label="Toggle Character Geometry" name="Toggle Character Geometry"/>
@@ -302,18 +334,28 @@
<menu_item_call label="Depurar texturas do avatar" name="Debug Avatar Textures"/>
</menu>
<menu_item_check label="Texturas HTTP" name="HTTP Textures"/>
+ <menu_item_check label="Inventário HTTP" name="HTTP Inventory"/>
+ <menu_item_call label="Habilitar Visual Leak Detector" name="Enable Visual Leak Detector"/>
<menu_item_check label="Console Window on next Run" name="Console Window"/>
- <menu_item_check label="Mostrar menu admin" name="View Admin Options"/>
+ <menu label="Configurar nível de registro em log" name="Set Logging Level">
+ <menu_item_check label="Depurar" name="Debug"/>
+ <menu_item_check label="Info" name="Info"/>
+ <menu_item_check label="Aviso" name="Warning"/>
+ <menu_item_check label="Error" name="Error"/>
+ <menu_item_check label="Nenhum" name="None"/>
+ </menu>
<menu_item_call label="Request Admin Status" name="Request Admin Options"/>
<menu_item_call label="Sair do modo admin" name="Leave Admin Options"/>
+ <menu_item_check label="Mostrar menu admin" name="View Admin Options"/>
</menu>
<menu label="Admin" name="Admin">
- <menu label="Object">
- <menu_item_call label="Pegar uma cópia" name="Take Copy"/>
- <menu_item_call label="Force Owner To Me" name="Force Owner To Me"/>
- <menu_item_call label="Force Owner Permissive" name="Force Owner Permissive"/>
+ <menu label="Objeto" name="AdminObject">
+ <menu_item_call label="Pegar uma cópia" name="Admin Take Copy"/>
+ <menu_item_call label="Forçar propriedade para mim" name="Force Owner To Me"/>
+ <menu_item_call label="Forçar permissão de proprietário" name="Force Owner Permissive"/>
<menu_item_call label="Excluir" name="Delete"/>
<menu_item_call label="Bloquear" name="Lock"/>
+ <menu_item_call label="Obter IDs dos bens" name="Get Assets IDs"/>
</menu>
<menu label="Lote" name="Parcel">
<menu_item_call label="Force Owner To Me" name="Owner To Me"/>
@@ -326,4 +368,20 @@
</menu>
<menu_item_call label="God Tools" name="God Tools"/>
</menu>
+ <menu label="Admin" name="Deprecated">
+ <menu label="Take Off Clothing" name="Take Off Clothing">
+ <menu_item_call label="Físico" name="Physics"/>
+ </menu>
+ <menu label="Ajuda" name="DeprecatedHelp">
+ <menu_item_call label="Blog oficial da Linden" name="Official Linden Blog"/>
+ <menu_item_call label="Portal de scripts" name="Scripting Portal"/>
+ <menu label="Relatar bugs" name="Bug Reporting">
+ <menu_item_call label="Monitor de problemas" name="Public Issue Tracker"/>
+ <menu_item_call label="Ajuda do monitor de problemas" name="Publc Issue Tracker Help"/>
+ <menu_item_call label="Relatório de bugs 101" name="Bug Reporing 101"/>
+ <menu_item_call label="Problemas de segurança" name="Security Issues"/>
+ <menu_item_call label="Página Wiki" name="QA Wiki"/>
+ </menu>
+ </menu>
+ </menu>
</menu_bar>
diff --git a/indra/newview/skins/default/xui/pt/menu_wearing_gear.xml b/indra/newview/skins/default/xui/pt/menu_wearing_gear.xml
index 7b6ce4d87e..75dca703cb 100644
--- a/indra/newview/skins/default/xui/pt/menu_wearing_gear.xml
+++ b/indra/newview/skins/default/xui/pt/menu_wearing_gear.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Gear Wearing">
+<toggleable_menu name="Gear Wearing">
<menu_item_call label="Editar look" name="edit"/>
<menu_item_call label="Tirar" name="takeoff"/>
-</menu>
+ <menu_item_call label="Copiar lista do look para a área de transferência" name="copy"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/pt/notifications.xml b/indra/newview/skins/default/xui/pt/notifications.xml
index 76399e966c..3b39c0f92c 100644
--- a/indra/newview/skins/default/xui/pt/notifications.xml
+++ b/indra/newview/skins/default/xui/pt/notifications.xml
@@ -72,7 +72,7 @@ Detalhes do erro: O aviso &apos;[_NAME]&apos; não foi localizado no arquivo not
</notification>
<notification name="LoginFailedNoNetwork">
Falha de conexão com o [SECOND_LIFE_GRID].
-&apos;[DIAGNOSTIC]&apos;
+ &apos;[DIAGNOSTIC]&apos;
Verifique se a conexão à internet está funcionando.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
@@ -84,6 +84,40 @@ Verifique se a conexão à internet está funcionando.
Salvar modificações?
<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Não salvar" yestext="Salvar"/>
</notification>
+ <notification name="ConfirmNoCopyToOutbox">
+ Você não possui permissão para copiar um ou mais destes itens para a Caixa de saída do lojista. Você pode movê-los ou abandoná-los.
+ <usetemplate name="okcancelbuttons" notext="Não mover item(ns)" yestext="Mover item(ns)"/>
+ </notification>
+ <notification name="OutboxFolderCreated">
+ Uma nova pasta foi criada para cada item transferido para o nível superior de sua Caixa de saída do lojista.
+ <usetemplate ignoretext="Uma nova pasta foi criada na Caixa de saída do lojista" name="okignore" yestext="OK"/>
+ </notification>
+ <notification name="OutboxImportComplete">
+ Êxito
+
+Todas as pastas foram enviadas para o Mercado com êxito.
+ <usetemplate ignoretext="Todas as pastas enviadas para o Mercado" name="okignore" yestext="OK"/>
+ </notification>
+ <notification name="OutboxImportHadErrors">
+ Algumas pastas não foram transferidas
+
+Erro ao enviar algumas pastas para o Mercado. Estas pastas ainda estão na sua Caixa de saída do lojista.
+
+Consulte o [[MARKETPLACE_IMPORTS_URL] log de erros] para mais informações.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="OutboxImportFailed">
+ Falha de transferência
+
+Nenhuma pasta enviada para o Mercado devido a um erro do sistema ou da rede. Tente novamente mais tarde.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="OutboxInitFailed">
+ Falha na inicialização do Mercado
+
+Falha na inicialização do mercado devido a um erro do sistema ou da rede. Tente novamente mais tarde.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="CompileQueueSaveText">
Houve um problema com o carregamento do texto para um script devido à seguinte razão: [REASON]. Por favor, tente novamente mais tarde.
</notification>
@@ -108,6 +142,10 @@ Por favor, selecione apenas um objeto e tente novamente.
Residentes que não são amigos não veem que você decidiu ignorar ligações e MIs deles.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="FavoritesOnLogin">
+ Nota: Ao ativar esta opção, qualquer pessoa que utilizar este computador poderá ver a sua lista de lugares preferidos.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="GrantModifyRights">
Conceder direitos de modificação a outros residentes vai autorizá-los a mudar, apagar ou pegar TODOS os seus objetos. Seja MUITO cuidadoso ao conceder esta autorização.
Deseja dar direitos de modificação a [NAME]?
@@ -326,13 +364,6 @@ Digite o nome de usuário de seu avatar.
<notification name="InvalidCredentialFormat">
Digite o nome de usuário ou o nome e sobrenome do seu avatar no campo Nome de usuário, depois entre em sua conta novamente.
</notification>
- <notification name="AddClassified">
- Os anúncios serão publicados na seção &apos;Classificados&apos; das buscas e em [http://secondlife.com/community/classifieds secondlife.com] durante uma semana.
-Escreva seu anúncio e clique em &apos;Publicar...&apos;
-Depois, decida quanto deseja pagar pelo anúncio.
-Quanto mais você pagar, mais alto será o posicionamento do seu anúncio nos classficados e nos resultados de busca das suas palavras-chave.
- <usetemplate ignoretext="Como colocar um anúncio" name="okcancelignore" notext="Cancelar" yestext="OK"/>
- </notification>
<notification name="DeleteClassified">
Apagar classificado&apos;[NAME]&apos;?
Não há reembolso por taxas já pagas.
@@ -385,6 +416,9 @@ Nota: Este procedimento limpa o cache.
<notification name="ChangeSkin">
Reinicie o [APP_NAME] para ativar a pele nova.
</notification>
+ <notification name="ChangeLanguage">
+ Reinicie o [APP_NAME] para exibir o idioma selecionado.
+ </notification>
<notification name="GoToAuctionPage">
Ir para a página do [SECOND_LIFE] para ver os detalhes do leilão ou fazer um lance?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Ir para a página"/>
@@ -474,7 +508,7 @@ Para aumentar a qualidade do vídeo, vá para Preferências &gt; Vídeo.
</notification>
<notification name="CannotCopyWarning">
Você não tem autorização para copiar os itens abaixo:
-[ITENS]
+[ITEMS]
ao dá-los, você ficará sem eles no seu inventário. Deseja realmente dar estes itens?
<usetemplate name="okcancelbuttons" notext="Não" yestext="Sim"/>
</notification>
@@ -594,6 +628,10 @@ Esperada [VALIDS]
Não pode ser encontrado bloco de dados no cabeçalho WAV:
[FILE]
</notification>
+ <notification name="SoundFileInvalidChunkSize">
+ Pedaço de arquivo WAV de tamanho errado:
+[FILE]
+ </notification>
<notification name="SoundFileInvalidTooLong">
Arquivo de áudio é muito longo (no máximo 10 segundos):
[FILE]
@@ -626,7 +664,7 @@ Esperada [VALIDS]
Incapaz de criar arquivo de saída: [FILE]
</notification>
<notification name="DoNotSupportBulkAnimationUpload">
- O [APP_NAME] ainda não faz o upload de vários arquivos de animação de uma vez.
+ O [APP_NAME] ainda não faz o upload de vários arquivos de animação no formato BVH de uma vez.
</notification>
<notification name="CannotUploadReason">
Incapaz de carregar [FILE] devido ao seguinte motivo: [REASON]
@@ -931,7 +969,7 @@ Oferecer amizade para [NAME]?
<input name="message">
[DESC] (novo)
</input>
- <button name="Offer" text="OK"/>
+ <button name="OK" text="OK"/>
<button name="Cancel" text="Cancelar"/>
</form>
</notification>
@@ -941,7 +979,7 @@ Oferecer amizade para [NAME]?
<input name="message">
[DESC] (novo)
</input>
- <button name="Offer" text="OK"/>
+ <button name="OK" text="OK"/>
<button name="Cancel" text="Cancelar"/>
</form>
</notification>
@@ -951,12 +989,12 @@ Oferecer amizade para [NAME]?
<input name="new_name">
[NAME]
</input>
- <button name="Offer" text="OK"/>
+ <button name="OK" text="OK"/>
<button name="Cancel" text="Cancelar"/>
</form>
</notification>
<notification name="RemoveFromFriends">
- Remover [NAME] da sua lista de amigos?
+ Deseja remover &lt;nolink&gt;[NAME]&lt;/nolink&gt; da sua lista de amigos?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Remover"/>
</notification>
<notification name="RemoveMultipleFromFriends">
@@ -1082,8 +1120,13 @@ Doar este terreno de [AREA] m² para o grupo &apos;[GROUP_NAME]&apos;?
<notification name="DisplaySetToSafe">
Configurações de display foram ajustadas para níveis de segurança porque você especificou -- opção de segurança.
</notification>
- <notification name="DisplaySetToRecommended">
- Configurações de display foram ajustadas para nível recomendado baseado na configuração do seu sistema.
+ <notification name="DisplaySetToRecommendedGPUChange">
+ As configurações de tela foram definidas nos níveis recomendados porque sua placa de vídeo foi alterada
+de &apos;[LAST_GPU]&apos;
+para &apos;[THIS_GPU]&apos;
+ </notification>
+ <notification name="DisplaySetToRecommendedFeatureChange">
+ As configurações de tela foram definidas nos níveis recomendados por causa de uma alteração no subsistema de renderização.
</notification>
<notification name="ErrorMessage">
[ERROR_MESSAGE]
@@ -1316,6 +1359,48 @@ Não é preciso passar para a nova versão, mas ela pode melhorar o desempenho e
Salvar na pasta Aplicativos?
<usetemplate name="okcancelbuttons" notext="Continuar" yestext="Atualizar"/>
</notification>
+ <notification name="FailedUpdateInstall">
+ Ocorreu um erro de atualização do visualizador.
+Baixe e instale a versão mais recente do visualizador em
+http://secondlife.com/download.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="FailedRequiredUpdateInstall">
+ Não foi possível instalar uma atualização necessária.
+Não será possível acessar a sua conta até que você atualize o [APP_NAME].
+
+Baixe e instale a versão mais recente do visualizador em
+http://secondlife.com/download.
+ <usetemplate name="okbutton" yestext="Sair"/>
+ </notification>
+ <notification name="UpdaterServiceNotRunning">
+ A instalação do Second Life requer uma atualização.
+
+Baixe a atualização em http://www.secondlife.com/downloads
+ou você pode instalar a instalação agora.
+ <usetemplate name="okcancelbuttons" notext="Sair do Second Life" yestext="Baixar e instalar agora"/>
+ </notification>
+ <notification name="DownloadBackgroundTip">
+ Baixamos uma atualização para a instalação do [APP_NAME].
+Versão [VERSION] [[RELEASE_NOTES_FULL_URL] sobre esta atualização]
+ <usetemplate name="okcancelbuttons" notext="Depois..." yestext="Instalar agora e reiniciar o [APP_NAME]"/>
+ </notification>
+ <notification name="DownloadBackgroundDialog">
+ Baixamos uma atualização para a instalação do [APP_NAME].
+Versão [VERSION] [[RELEASE_NOTES_FULL_URL] sobre esta atualização]
+ <usetemplate name="okcancelbuttons" notext="Depois..." yestext="Instalar agora e reiniciar o [APP_NAME]"/>
+ </notification>
+ <notification name="RequiredUpdateDownloadedVerboseDialog">
+ O software requer uma atualização que já foi baixada.
+Versão [VERSION]
+
+Para instalar a atualização, será preciso reiniciar o [APP_NAME].
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="RequiredUpdateDownloadedDialog">
+ Para instalar a atualização, será preciso reiniciar o [APP_NAME].
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="DeedObjectToGroup">
Delegar este objeto causará ao grupo:
* Receber os L$ pagos ao objeto
@@ -1360,8 +1445,7 @@ Salvar na pasta Aplicativos?
<usetemplate ignoretext="Confirmar antes de devolver objetos a seus donos" name="okcancelignore" notext="Cancelar" yestext="Retornar"/>
</notification>
<notification name="GroupLeaveConfirmMember">
- Você é atualmente um membro do grupo [GROUP].
-Sair do grupo?
+ Você é atualmente um membro do grupo
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Sair"/>
</notification>
<notification name="ConfirmKick">
@@ -1495,6 +1579,10 @@ Por favor volte mais tarde.
<button name="Cancel" text="Cancelar"/>
</form>
</notification>
+ <notification name="TooManyTeleportOffers">
+ Você fez [OFFERS] ofertas de teletransporte, porém o seu limite é [LIMIT].
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="OfferTeleportFromGod">
Convocar residente à sua localização com poderes de deus?
<form name="form">
@@ -1836,6 +1924,18 @@ Mover para o inventário o(s) item(s)?
Tem certeza que deseja sair?
<usetemplate ignoretext="Confirmar antes de sair" name="okcancelignore" notext="Não sair" yestext="Sair"/>
</notification>
+ <notification name="ConfirmRestoreToybox">
+ Essa ação irá restaurar os botões e barras de ferramenta padrão.
+
+Não é possível desfazer essa ação.
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmClearAllToybox">
+ Essa ação fará com que todos os botões voltem para a caixa de ferramentas e suas barras de ferramentas ficarão vazias.
+
+Não é possível desfazer essa ação.
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
<notification name="DeleteItems">
[QUESTION]
<usetemplate ignoretext="Confirmar antes de excluir" name="okcancelignore" notext="Cancelar" yestext="OK"/>
@@ -1916,6 +2016,10 @@ Você gostaria de deixar o modo Ocupado antes de completar esta transação?
Tem certeza de que quer apagar todo o histórico de viagens, web e buscas?
<usetemplate name="okcancelbuttons" notext="Não" yestext="OK"/>
</notification>
+ <notification name="ConfirmClearCache">
+ Tem certeza que deseja apagar o cache do visualizador?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
<notification name="ConfirmClearCookies">
Você tem certeza de que deseja limpar os cookies?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Sim"/>
@@ -1941,48 +2045,30 @@ Inclua um link para facilitar o acesso para visitantes. Teste o link na barra de
Você deseja substituir a pré-configuração salva?
<usetemplate name="okcancelbuttons" notext="Não" yestext="Sim"/>
</notification>
- <notification name="WLDeletePresetAlert">
- Você deseja apagar [SKY]?
- <usetemplate name="okcancelbuttons" notext="Não" yestext="Sim"/>
- </notification>
<notification name="WLNoEditDefault">
Você não pode editar ou excluir um padrão predefinido.
</notification>
<notification name="WLMissingSky">
Este arquivo de ciclo de dia se refere a um arquivo de céu faltando: [SKY].
</notification>
- <notification name="PPSaveEffectAlert">
- Existe efeito de Pós-Processamento. Você deseja substituí-lo?
- <usetemplate name="okcancelbuttons" notext="Não" yestext="Sim"/>
- </notification>
- <notification name="NewSkyPreset">
- Me dê o nome para o novo céu.
- <form name="form">
- <input name="message">
- Novo padrão
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Cancelar"/>
- </form>
+ <notification name="WLRegionApplyFail">
+ As configurações não podem ser aplicadas à região. Talvez sair e votlar à região resolva. Motivo: [FAIL_REASON]
</notification>
- <notification name="ExistsSkyPresetAlert">
- Este padrão já existe!
+ <notification name="EnvCannotDeleteLastDayCycleKey">
+ Impossível excluir a última chave do ciclo pois um ciclo não pode ficar vazio. Modifique a última chave em vez de tentar apagá-la, depois crie uma chave nova.
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="NewWaterPreset">
- Dê o nome para o novo padrão de água.
- <form name="form">
- <input name="message">
- Nova Apresentação
- </input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="Cancelar"/>
- </form>
+ <notification name="DayCycleTooManyKeyframes">
+ Não é possível adicionar mais chaves de quadro a este ciclo. O máximo de chaves de quadro para ciclos de dia de [SCOPE] é [MAX].
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="ExistsWaterPresetAlert">
- Este padrão já existe!
+ <notification name="EnvUpdateRate">
+ Cada configuração de ambiente só pode ser atualizada a cada [WAIT] segundos. Aguarde pelo menos isso e tente novamente.
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="WaterNoEditDefault">
- Você não pode editar ou apagar um padrão predefinido.
+ <notification name="PPSaveEffectAlert">
+ Existe efeito de Pós-Processamento. Você deseja substituí-lo?
+ <usetemplate name="okcancelbuttons" notext="Não" yestext="Sim"/>
</notification>
<notification name="ChatterBoxSessionStartError">
Não foi possível iniciar uma nova sessão bate-papo com [RECIPIENT].
@@ -2011,13 +2097,14 @@ Inclua um link para facilitar o acesso para visitantes. Teste o link na barra de
<usetemplate ignoretext="Vestir as roupas que eu criar enquanto edito minha aparência" name="okcancelignore" notext="Não" yestext="Sim"/>
</notification>
<notification name="NotAgeVerified">
- Ãrea restrita a residentes com idade comprovada. Deseja ir ao site do [SECOND_LIFE] para comprovar sua idade?
+ Você deve ter no mínimo 18 anos para acessar conteúdo e áreas adultas no Second Life. Visite nossa página de verificação de idade para confirmar que você tem mais de 18 anos.
+Isso abrirá o seu navegador.
[_URL]
<url name="url" option="0">
- https://secondlife.com/account/verification.php?lang=pt
+ https://secondlife.com/my/account/verification.php
</url>
- <usetemplate ignoretext="Ainda não comprovei minha idade" name="okcancelignore" notext="Não" yestext="Sim"/>
+ <usetemplate ignoretext="Ainda não comprovei minha idade" name="okcancelignore" notext="Cancelar" yestext="Ir para verificação de idade"/>
</notification>
<notification name="Cannot enter parcel: no payment info on file">
Ãrea restrita a residentes que já cadastraram seus dados de pagamento Deseja ir ao site do [SECOND_LIFE] para cuidar disso?
@@ -2053,10 +2140,10 @@ Inclua um link para facilitar o acesso para visitantes. Teste o link na barra de
Assunto: [SUBJECT], Mensagem: [MESSAGE]
</notification>
<notification name="FriendOnline">
- [NAME] está online
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; está online
</notification>
<notification name="FriendOffline">
- [NAME] está offline
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; está offline
</notification>
<notification name="AddSelfFriend">
Você é o máximo! Mesmo assim, não dá para adicionar a si mesmo(a) como amigo(a).
@@ -2102,6 +2189,12 @@ Ela pode afetar a digitação da senha.
<notification name="RezItemNoPermissions">
Sem permissões suficientes para criar objetos.
</notification>
+ <notification name="IMAcrossParentEstates">
+ Não é possível enviar MIs entre propriedades-pai.
+ </notification>
+ <notification name="TransferInventoryAcrossParentEstates">
+ Não é possível transferir o inventário para propriedades-pai.
+ </notification>
<notification name="UnableToLoadNotecard">
Não é possível carregar notas neste momento.
</notification>
@@ -2163,14 +2256,16 @@ Selecione só um objeto.
Seu cartão de visita foi negado.
</notification>
<notification name="TeleportToLandmark">
- Para se teletransportar para lugares como &apos;[NAME]&apos;, abra o painel &apos;Lugares&apos; à direita da tela e selecione a guia Marcos.
-Basta clicar em qualquer marco e depois clicar em &apos;Teletransportar&apos; na parte inferior da tela.
-(Também é possível clicar duas vezes no marco, ou clicar no marco com o botão direito e selecionar &apos;Teletransportar&apos;.)
+ Para se teletransportar para locais como &apos;[NAME]&apos;, clique no botão &quot;Lugares&quot;,
+ e selecione a guia Marcos na janela que é exibida. Clique em qualquer
+ marco para selecioná-lo e em seguida em &apos;Teletransportar&apos; na parte inferior da tela.
+ (Também é possível clicar duas vezes sobre o marco ou clicar com o botão direito do mouse sobre ele
+ e selecionar &apos;Teletransportar&apos;.)
</notification>
<notification name="TeleportToPerson">
- Para entrar em contato com residentes como &apos;&apos;[NAME]&apos;, abra o painel &apos;Pessoas&apos; à direita da tela.
-Selecione o residente da lista e clique em &apos;MI&apos; na parte de baixo do painel.
-(Também é possível clicar duas vezes no nome, ou clicar no nome com o botão direito e selecionar &apos;MI&apos;.)
+ Para entrar em contato com residentes como &apos;[NAME]&apos;, clique no botão &quot;Pessoas&quot;, selecione um residente na janela que é exibida e clique em &apos;MI&apos; na
+ parte inferior da janela.
+ (Também é possível clicar duas vezes no nome, ou clicar no nome com o botão direito e selecionar &apos;MI&apos;.)
</notification>
<notification name="CantSelectLandFromMultipleRegions">
Impossível selecionar terra nas fronteiras do servidor. Tente selecionar um pedaço menor de terra.
@@ -2181,14 +2276,6 @@ Selecione o residente da lista e clique em &apos;MI&apos; na parte de baixo do p
<notification name="NoContentToSearch">
Por favor, selecione ao menos um tipo de conteúdo para a busca (PG, Mature ou Adult).
</notification>
- <notification name="GroupVote">
- [NAME] propõe que você vote:
-[MESSAGE]
- <form name="form">
- <button name="VoteNow" text="Vote agora"/>
- <button name="Later" text="Depois"/>
- </form>
- </notification>
<notification name="SystemMessage">
[MESSAGE]
</notification>
@@ -2198,6 +2285,9 @@ Selecione o residente da lista e clique em &apos;MI&apos; na parte de baixo do p
<notification name="PaymentSent">
[MESSAGE]
</notification>
+ <notification name="PaymentFailure">
+ [MESSAGE]
+ </notification>
<notification name="EventNotification">
Notificação de evento:
@@ -2272,6 +2362,9 @@ Logo, não é possível voar aqui.
<notification name="NoBuild">
Esta área desativou a opção de construir. Não é possível construir ou fazer rez de objetos nesta área.
</notification>
+ <notification name="SeeAvatars">
+ Este terreno oculta os avatares e bate-papo de outro terreno. Não é possível ver residentes fora do terreno e vice-versa. O bate-papo por texto no canal 0 também está bloqueado.
+ </notification>
<notification name="ScriptsStopped">
Um administrador não permitiu scripts temporariamente nesta região.
</notification>
@@ -2362,12 +2455,20 @@ Por favor, tente novamente em alguns instantes.
Nenhum lote válido foi encontrado.
</notification>
<notification name="ObjectGiveItem">
- Um objeto chamado &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt;, de [NAME_SLURL], lhe deu este(a) [OBJECTTYPE]:
-[ITEM_SLURL]
+ Um objeto chamado &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt;, de [NAME_SLURL], obteve este(a) [OBJECTTYPE]:
+&lt;nolink&gt;[ITEM_SLURL]&lt;/nolink&gt;
<form name="form">
<button name="Keep" text="Segure"/>
<button name="Discard" text="Descarte"/>
- <button name="Mute" text="Bloquear"/>
+ <button name="Mute" text="Bloquear proprietário"/>
+ </form>
+ </notification>
+ <notification name="OwnObjectGiveItem">
+ O objeto chamado &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt;, de [NAME_SLURL], obteve este(a) [OBJECTTYPE]:
+&lt;nolink&gt;[ITEM_SLURL]&lt;/nolink&gt;
+ <form name="form">
+ <button name="Keep" text="Manter"/>
+ <button name="Discard" text="Descartar"/>
</form>
</notification>
<notification name="UserGiveItem">
@@ -2436,10 +2537,10 @@ Cada um pode ver o status do outro (definição padrão).
</form>
</notification>
<notification name="FriendshipAccepted">
- [NAME] aceitou seu convite de amizade.
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; aceitou sua oferta de amizade.
</notification>
<notification name="FriendshipDeclined">
- [NAME] recusou seu convite de amizade
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; rejeitou sua oferta de amizade.
</notification>
<notification name="FriendshipAcceptedByMe">
Oferta de amizada aceita.
@@ -2448,8 +2549,8 @@ Cada um pode ver o status do outro (definição padrão).
Oferta de amizada aceita.
</notification>
<notification name="OfferCallingCard">
- [NAME] estão te oferecendo um cartão de visita.
-Ele colocará um item de inventário, para você possa contatá-lo facilmente.
+ [NOME] está te oferecendo um cartão de visita.
+Ele será um item no seu inventário, para você possa contatá-lo facilmente.
<form name="form">
<button name="Accept" text="Aceitar"/>
<button name="Decline" text="Recusar"/>
@@ -2511,14 +2612,16 @@ Deseja aceitar?
&apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos; de [NAME]
[MESSAGE]
<form name="form">
- <button name="Ignore" text="Ignorar"/>
+ <button name="Client_Side_Mute" text="Bloquear"/>
+ <button name="Client_Side_Ignore" text="Ignorar"/>
</form>
</notification>
<notification name="ScriptDialogGroup">
&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos; de [GROUPNAME]&apos;
[MESSAGE]
<form name="form">
- <button name="Ignore" text="Ignorar"/>
+ <button name="Client_Side_Mute" text="Bloquear"/>
+ <button name="Client_Side_Ignore" text="Ignorar"/>
</form>
</notification>
<notification name="BuyLindenDollarSuccess">
@@ -2641,9 +2744,6 @@ Clique em Aceitar para atender ou em Recusar para recusar este convite. Clique
<notification name="VoiceCallGenericError">
Ocorreu um erro enquanto você tentava se conectar à conversa de voz de [VOICE_CHANNEL_NAME]. Favor tentar novamente mais tarde.
</notification>
- <notification name="ServerVersionChanged">
- Você chegou a uma região com uma versão diferente de servidor, que pode afetar o desempenho. [[URL] Consultar notas da versão.]
- </notification>
<notification name="UnsupportedCommandSLURL">
O SLurl no qual você clicou não é suportado.
</notification>
@@ -2683,6 +2783,10 @@ Para sua segurança, os SLurls serão bloqueados por alguns instantes.
Sua voz foi silenciada pelo moderador.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="UploadCostConfirmation">
+ O carregamento custa L$[PRICE]. Deseja prosseguir?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Carregar"/>
+ </notification>
<notification name="ConfirmClearTeleportHistory">
Tem certeza que deseja apagar todo o seu histórico de teletransporte?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
@@ -2694,22 +2798,52 @@ O botão será exibido quando houver espaço suficente.
<notification name="ShareNotification">
Selecione os residentes com quem compartilhar.
</notification>
+ <notification name="MeshUploadError">
+ [LABEL] não foi carregado: [MESSAGE] [IDENTIFIER]
+
+Mais detalhes no log.
+ </notification>
+ <notification name="MeshUploadPermError">
+ Erro ao solicitar permissões de upload de mesh.
+ </notification>
+ <notification name="RegionCapabilityRequestError">
+ Não foi possível obter o recurso &apos;[CAPABILITY]&apos; da região.
+ </notification>
<notification name="ShareItemsConfirmation">
- Tem certeza de que quer compartilhar os items abaixo?
+ Tem certeza de que quer compartilhar os itens abaixo?
-[ITENS]
+&lt;nolink&gt;[ITEMS]&lt;/nolink&gt;
Com os seguintes residentes:
[RESIDENTS]
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
+ <notification name="ShareFolderConfirmation">
+ Apenas uma pasta pode ser compartilhada por vez.
+
+Tem certeza de que quer compartilhar os itens abaixo?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
<notification name="ItemsShared">
Itens compartilhados.
</notification>
<notification name="DeedToGroupFail">
Ocorreu uma falha durante a doação ao grupo.
</notification>
+ <notification name="ReleaseLandThrottled">
+ O lote [PARCEL_NAME] não pode ser abandonado.
+ </notification>
+ <notification name="ReleasedLandWithReclaim">
+ O lote de [AREA] m² &apos;[PARCEL_NAME]&apos; foi liberado.
+
+Você tem [RECLAIM_PERIOD] para reivindicá-lo por L$0. Depois o lote será colocado à venda para qualquer interessado.
+ </notification>
+ <notification name="ReleasedLandNoReclaim">
+ O lote de [AREA] m² &apos;[PARCEL_NAME]&apos; foi liberado.
+
+Ele está à venda para qualquer interessado.
+ </notification>
<notification name="AvatarRezNotification">
( [EXISTENCE] segundos de vida )
O avatar de &apos;[NAME]&apos; emergiu em [TIME] segundos.
@@ -2746,9 +2880,7 @@ Avatar &apos;[NAME]&apos; sair do modo aparecer.
<notification name="NoConnect">
Detectamos um problema de conexão com [PROTOCOL] [HOSTID].
Verifique a configuração da sua rede e firewall.
- <form name="form">
- <button name="OK" text="OK"/>
- </form>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="NoVoiceConnect">
Estamos tendo problemas de conexão com o seu servidor de voz:
@@ -2757,9 +2889,7 @@ Verifique a configuração da sua rede e firewall.
Talvez não seja possível se comunicar via voz.
Verifique a configuração da sua rede e firewall.
- <form name="form">
- <button name="OK" text="OK"/>
- </form>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="AvatarRezLeftNotification">
( [EXISTENCE] segundos de vida )
@@ -2791,6 +2921,13 @@ Silenciar todos?
<notification label="Levantar-se" name="HintSit">
Para se levantar quando estiver sentado, clique em Levantar-se
</notification>
+ <notification label="Falar" name="HintSpeak">
+ Clique no botão Falar para ligar ou desligar o microfone.
+
+Clique na seta para cima para ver o painel de controles de voz.
+
+Se o botão Falar for ocultado, o recurso de voz será desabilitado.
+ </notification>
<notification label="Explore o mundo" name="HintDestinationGuide">
O Guia de Destinos traz milhares de lugares novos para você explorar e conhecer. Selecione um lugar, clique em Teletransportar e comece suas descobertas.
</notification>
@@ -2800,15 +2937,29 @@ Silenciar todos?
<notification label="Movimentar" name="HintMove">
Para andar ou correr, clique no botão Movimentar e use as setas para controlar a direção. Ou use as setas do teclado.
</notification>
+ <notification label="" name="HintMoveClick">
+ 1. Clique para andar Clique em qualquer lugar no solo para andar até o local.
+
+2. Clique e arraste para girar a exibição Clique e arraste em qualquer lugar no mundo para girar a exibição
+ </notification>
<notification label="Nome de tela" name="HintDisplayName">
Defina seu nome de tela personalizável. O nome de tele é separado do seu nome de usuário, que não pode ser modificado. Você pode mudar a visualização dos nomes de outras pessoas nas suas preferências.
</notification>
+ <notification label="Exibir" name="HintView">
+ Para mudar o ângulo de visualização, use os controles Órbita e Pan. Volte à visualização normal pressionando a tecla Escape ou começando a andar.
+ </notification>
<notification label="Inventário" name="HintInventory">
Você encontrará seus pertences no inventário. Os itens mais novos também ficam na guia Itens recentes.
</notification>
<notification label="Você tem dólares Linden!" name="HintLindenDollar">
Seu saldo de L$ está aqui. Clique em Comprar L$ para trocar mais dólares Linden.
</notification>
+ <notification name="LowMemory">
+ Seu pool de memória está baixo. Algumas funções do SL foram desativadas para evitar falhas. Encerre os outros aplicativos. Reinicie o SL se o problema persistir.
+ </notification>
+ <notification name="ForceQuitDueToLowMemory">
+ O SL será encerrado em 30 segundos devido falta de memória.
+ </notification>
<notification name="PopupAttempt">
Um pop-up foi bloqueado.
<form name="form">
@@ -2816,9 +2967,111 @@ Silenciar todos?
<button name="open" text="Abrir pop-up"/>
</form>
</notification>
- <global name="UnsupportedCPU">
- - A velocidade da sua CPU não suporta os requisitos mínimos exigidos.
- </global>
+ <notification name="SOCKS_NOT_PERMITTED">
+ O proxy SOCKS 5 &quot;[HOST]:[PORT]&quot; recusou a conexão, não permitida pelo conjunto de regras.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_CONNECT_ERROR">
+ O proxy SOCKS 5 &quot;[HOST]:[PORT]&quot; recusou a conexão. Não foi possível abrir o canal TCP.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_NOT_ACCEPTABLE">
+ O proxy SOCKS 5 &quot;[HOST]:[PORT]&quot; recusou o sistema de autenticação selecionado.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_AUTH_FAIL">
+ O proxy SOCKS 5 &quot;[HOST]:[PORT]&quot; informou que suas credenciais são inválidas.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_UDP_FWD_NOT_GRANTED">
+ O proxy SOCKS 5 &quot;[HOST]:[PORT]&quot; recusou a solicitação de UDP ASSOCIATE.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_HOST_CONNECT_FAILED">
+ Não foi possível conectar-se ao servidor de proxy SOCKS 5 &quot;[HOST]:[PORT]&quot;.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_UNKNOWN_STATUS">
+ Erro desconhecido de proxy com o servidor &quot;[HOST]:[PORT]&quot;.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_INVALID_HOST">
+ Endereço de proxy SOCKS ou porta &quot;[HOST]:[PORT]&quot; inválidos.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_BAD_CREDS">
+ Nome de usuário ou senha de SOCKS 5 inválidos.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="PROXY_INVALID_HTTP_HOST">
+ Endereço de proxy HTTP ou porta &quot;[HOST]:[PORT]&quot; inválidos.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="PROXY_INVALID_SOCKS_HOST">
+ Endereço de proxy SOCKS ou porta &quot;[HOST]:[PORT]&quot; inválidos.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ChangeProxySettings">
+ As configurações de proxy terão efeito depois que [APP_NAME] for reiniciado.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="AuthRequest">
+ O site em &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos; em &apos;[REALM]&apos; requer nome e senha.
+ <form name="form">
+ <input name="username" text="Nome de usuário"/>
+ <input name="password" text="Senha:"/>
+ <button name="ok" text="Enviar"/>
+ <button name="cancel" text="Cancelar"/>
+ </form>
+ </notification>
+ <notification label="" name="NoClassifieds">
+ É preciso usar o modo Avançado para criar e editar anúncios classificados. Desejar sair para mudar o modo? Selecione o modo na tela de login.
+ <usetemplate name="okcancelbuttons" notext="Não sair" yestext="Sair"/>
+ </notification>
+ <notification label="" name="NoGroupInfo">
+ É preciso usar o modo Avançado para criar e editar grupos. Desejar sair para mudar o modo? Selecione o modo na tela de login.
+ <usetemplate name="okcancelbuttons" notext="Não sair" yestext="Sair"/>
+ </notification>
+ <notification label="" name="NoPlaceInfo">
+ É preciso estar no modo Avançado para visualizar o perfil de um lugar. Deseja sair para mudar o modo? Selecione o modo na tela de login.
+ <usetemplate name="okcancelbuttons" notext="Não sair" yestext="Sair"/>
+ </notification>
+ <notification label="" name="NoPicks">
+ É preciso usar o modo Avançado para criar e editar Destaques. Desejar sair para mudar o modo? Selecione o modo na tela de login.
+ <usetemplate name="okcancelbuttons" notext="Não sair" yestext="Sair"/>
+ </notification>
+ <notification label="" name="NoWorldMap">
+ É preciso usar o modo Avançado para ver o mapa-múndi. Desejar sair para mudar o modo? Selecione o modo na tela de login.
+ <usetemplate name="okcancelbuttons" notext="Não sair" yestext="Sair"/>
+ </notification>
+ <notification label="" name="NoVoiceCall">
+ Ligações de voz devem ser feitas no modo Avançado. Desejar sair para mudar o modo?
+ <usetemplate name="okcancelbuttons" notext="Não sair" yestext="Sair"/>
+ </notification>
+ <notification label="" name="NoAvatarShare">
+ É preciso estar no modo Avançado para compartilhar. Desejar sair para mudar o modo?
+ <usetemplate name="okcancelbuttons" notext="Não sair" yestext="Sair"/>
+ </notification>
+ <notification label="" name="NoAvatarPay">
+ É preciso usar o modo Avançado para fazer pagamentos a outros residentes. Desejar sair para mudar o modo?
+ <usetemplate name="okcancelbuttons" notext="Não sair" yestext="Sair"/>
+ </notification>
+ <notification label="" name="NoInventory">
+ É preciso estar no modo Avançado para visualizar o inventário. Deseja sair para mudar o modo?
+ <usetemplate name="okcancelbuttons" notext="Não sair" yestext="Sair"/>
+ </notification>
+ <notification label="" name="NoAppearance">
+ É preciso usar o modo Avançado para usar o editor de visual. Deseja sair para mudar o modo?
+ <usetemplate name="okcancelbuttons" notext="Não sair" yestext="Sair"/>
+ </notification>
+ <notification label="" name="NoSearch">
+ É preciso estar no modo Avançado para fazer pesquisas. Deseja sair para mudar o modo?
+ <usetemplate name="okcancelbuttons" notext="Não sair" yestext="Sair"/>
+ </notification>
+ <notification label="" name="ConfirmHideUI">
+ Essa ação irá ocultar todos os itens de menu e botões. Para trazê-los de volta, clique em [SHORTCUT] novamente.
+ <usetemplate ignoretext="Confirmar antes de ocultar interface" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
<global name="UnsupportedGLRequirements">
Aparentemente a sua máquina não atende os requisitos de hardware do [APP_NAME]. [APP_NAME] requer placas de vídeo OpenGL com suporte a multitexturas. Se sua place de vídeo tiver este perfil, atualize o driver da placa de vídeo, assim como patches e service packs do sistema operacional.
diff --git a/indra/newview/skins/default/xui/pt/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/pt/panel_avatar_list_item.xml
index ca67125c65..b444593af8 100644
--- a/indra/newview/skins/default/xui/pt/panel_avatar_list_item.xml
+++ b/indra/newview/skins/default/xui/pt/panel_avatar_list_item.xml
@@ -21,7 +21,7 @@
<string name="FormatYears">
[COUNT]anos
</string>
- <text name="avatar_name" value="Desconhecido"/>
+ <text name="avatar_name" value="(carregando)"/>
<icon name="permission_edit_theirs_icon" tool_tip="Você pode editar os pertences deste amigo"/>
<icon name="permission_edit_mine_icon" tool_tip="Este amigo pode editar, excluir ou pegar seus pertences"/>
<icon name="permission_map_icon" tool_tip="Este amigo pode localizar você no mapa"/>
diff --git a/indra/newview/skins/default/xui/pt/panel_chiclet_bar.xml b/indra/newview/skins/default/xui/pt/panel_chiclet_bar.xml
new file mode 100644
index 0000000000..0551d9cba6
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_chiclet_bar.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="chiclet_bar">
+ <layout_stack name="toolbar_stack">
+ <layout_panel name="im_well_panel">
+ <chiclet_im_well name="im_well">
+ <button name="Unread IM messages" tool_tip="Conversas"/>
+ </chiclet_im_well>
+ </layout_panel>
+ <layout_panel name="notification_well_panel">
+ <chiclet_notification name="notification_well">
+ <button name="Unread" tool_tip="Notificações"/>
+ </chiclet_notification>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_alpha.xml b/indra/newview/skins/default/xui/pt/panel_edit_alpha.xml
index f8be9daf1b..b274945dbd 100644
--- a/indra/newview/skins/default/xui/pt/panel_edit_alpha.xml
+++ b/indra/newview/skins/default/xui/pt/panel_edit_alpha.xml
@@ -1,10 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_alpha_panel">
- <panel name="avatar_alpha_color_panel">
- <texture_picker label="Alpha inferior" name="Lower Alpha" tool_tip="Selecionar imagem"/>
- <texture_picker label="Alpha de cima" name="Upper Alpha" tool_tip="Selecionar imagem"/>
- <texture_picker label="Cabeça Alpha" name="Head Alpha" tool_tip="Selecionar imagem"/>
- <texture_picker label="Olhos Alpha" name="Eye Alpha" tool_tip="Selecionar imagem"/>
- <texture_picker label="Cabelo alpha" name="Hair Alpha" tool_tip="Selecionar imagem"/>
- </panel>
+ <scroll_container name="avatar_alpha_color_panel_scroll">
+ <panel name="avatar_alpha_color_panel">
+ <texture_picker label="Alpha inferior" name="Lower Alpha" tool_tip="Selecionar imagem"/>
+ <texture_picker label="Alpha de cima" name="Upper Alpha" tool_tip="Selecionar imagem"/>
+ <texture_picker label="Cabeça Alpha" name="Head Alpha" tool_tip="Selecionar imagem"/>
+ <texture_picker label="Olhos Alpha" name="Eye Alpha" tool_tip="Selecionar imagem"/>
+ <texture_picker label="Cabelo alpha" name="Hair Alpha" tool_tip="Selecionar imagem"/>
+ </panel>
+ </scroll_container>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_gloves.xml b/indra/newview/skins/default/xui/pt/panel_edit_gloves.xml
index a94716e659..281823d641 100644
--- a/indra/newview/skins/default/xui/pt/panel_edit_gloves.xml
+++ b/indra/newview/skins/default/xui/pt/panel_edit_gloves.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_gloves_panel">
<panel name="avatar_gloves_color_panel">
- <texture_picker label="Tecido" name="Fabric" tool_tip="Selecionar imagem"/>
+ <texture_picker label="Textura" name="Fabric" tool_tip="Selecionar imagem"/>
<color_swatch label="Cor/Tonalidade" name="Color/Tint" tool_tip="Selecionar a cor"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_jacket.xml b/indra/newview/skins/default/xui/pt/panel_edit_jacket.xml
index f555bd9ac7..5798325bd7 100644
--- a/indra/newview/skins/default/xui/pt/panel_edit_jacket.xml
+++ b/indra/newview/skins/default/xui/pt/panel_edit_jacket.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_jacket_panel">
<panel name="avatar_jacket_color_panel">
- <texture_picker label="Tecido de cima" name="Upper Fabric" tool_tip="Selecionar imagem"/>
- <texture_picker label="Tecido de baixo" name="Lower Fabric" tool_tip="Selecionar imagem"/>
+ <texture_picker label="Textura superior" name="Upper Fabric" tool_tip="Selecionar imagem"/>
+ <texture_picker label="Textura inferior" name="Lower Fabric" tool_tip="Selecionar imagem"/>
<color_swatch label="Cor/Tonalidade" name="Color/Tint" tool_tip="Selecionar a cor"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_pants.xml b/indra/newview/skins/default/xui/pt/panel_edit_pants.xml
index 67c300cc8d..18568a81a8 100644
--- a/indra/newview/skins/default/xui/pt/panel_edit_pants.xml
+++ b/indra/newview/skins/default/xui/pt/panel_edit_pants.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_pants_panel">
<panel name="avatar_pants_color_panel">
- <texture_picker label="Tecido" name="Fabric" tool_tip="Selecionar imagem"/>
+ <texture_picker label="Textura" name="Fabric" tool_tip="Selecionar imagem"/>
<color_swatch label="Cor/Tonalidade" name="Color/Tint" tool_tip="Selecionar a cor"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_physics.xml b/indra/newview/skins/default/xui/pt/panel_edit_physics.xml
new file mode 100644
index 0000000000..967aab8bc3
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_edit_physics.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_physics_panel">
+ <panel label="" name="accordion_panel">
+ <accordion name="physics_accordion">
+ <accordion_tab name="physics_breasts_updown_tab" title="Seios - movimento vertical"/>
+ <accordion_tab name="physics_breasts_inout_tab" title="Seios - decote"/>
+ <accordion_tab name="physics_breasts_leftright_tab" title="Seios - movimento lateral"/>
+ <accordion_tab name="physics_belly_tab" title="Barriga - movimento vertical"/>
+ <accordion_tab name="physics_butt_tab" title="Nádegas - movimento vertical"/>
+ <accordion_tab name="physics_butt_leftright_tab" title="Nádegas - movimento lateral"/>
+ <accordion_tab name="physics_advanced_tab" title="Parâmetros avançados"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_pick.xml b/indra/newview/skins/default/xui/pt/panel_edit_pick.xml
index 432affcf09..5eb9987e71 100644
--- a/indra/newview/skins/default/xui/pt/panel_edit_pick.xml
+++ b/indra/newview/skins/default/xui/pt/panel_edit_pick.xml
@@ -29,7 +29,7 @@
<layout_panel name="layout_panel1">
<button label="Salvar destaque" name="save_changes_btn"/>
</layout_panel>
- <layout_panel name="layout_panel1">
+ <layout_panel name="layout_panel2">
<button label="Cancelar" name="cancel_btn"/>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_profile.xml b/indra/newview/skins/default/xui/pt/panel_edit_profile.xml
index 4066842b25..0ba7382845 100644
--- a/indra/newview/skins/default/xui/pt/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/pt/panel_edit_profile.xml
@@ -25,11 +25,7 @@
<text name="display_name_label" value="Nome de tela:"/>
<text name="solo_username_label" value="Nome de usuário:"/>
<button name="set_name" tool_tip="Definir nome de tela"/>
- <text name="solo_user_name" value="Hamilton Hitchings"/>
- <text name="user_name" value="Hamilton Hitchings"/>
- <text name="user_name_small" value="Hamilton Hitchings"/>
<text name="user_label" value="Nome de usuário:"/>
- <text name="user_slid" value="hamilton.linden"/>
<panel name="lifes_images_panel">
<icon label="" name="2nd_life_edit_icon" tool_tip="Selecione uma imagem"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_shirt.xml b/indra/newview/skins/default/xui/pt/panel_edit_shirt.xml
index fb7c4c080c..c7e2b1e64c 100644
--- a/indra/newview/skins/default/xui/pt/panel_edit_shirt.xml
+++ b/indra/newview/skins/default/xui/pt/panel_edit_shirt.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_shirt_panel">
<panel name="avatar_shirt_color_panel">
- <texture_picker label="tecido" name="Fabric" tool_tip="Clique para escolher uma foto"/>
+ <texture_picker label="Textura" name="Fabric" tool_tip="Clique para escolher uma foto"/>
<color_swatch label="Cor/Matiz" name="Color/Tint" tool_tip="Clique para abrir o selecionador de cor"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_shoes.xml b/indra/newview/skins/default/xui/pt/panel_edit_shoes.xml
index d1d30cf46e..08465d09e7 100644
--- a/indra/newview/skins/default/xui/pt/panel_edit_shoes.xml
+++ b/indra/newview/skins/default/xui/pt/panel_edit_shoes.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_shoes_panel">
<panel name="avatar_shoes_color_panel">
- <texture_picker label="Tecido" name="Fabric" tool_tip="Selecionar imagem"/>
+ <texture_picker label="Textura" name="Fabric" tool_tip="Selecionar imagem"/>
<color_swatch label="Cor/Tonalidade" name="Color/Tint" tool_tip="Selecionar a cor"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_skin.xml b/indra/newview/skins/default/xui/pt/panel_edit_skin.xml
index f3d88123f2..d00aa2dc66 100644
--- a/indra/newview/skins/default/xui/pt/panel_edit_skin.xml
+++ b/indra/newview/skins/default/xui/pt/panel_edit_skin.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_skin_panel">
<panel name="avatar_skin_color_panel">
- <texture_picker label="Tatuagens na cabeça" name="Head Tattoos" tool_tip="Selecionar imagem"/>
- <texture_picker label="Tatuagem parte de cima" name="Upper Tattoos" tool_tip="Selecionar imagem"/>
- <texture_picker label="Tatuagem de baixo" name="Lower Tattoos" tool_tip="Selecionar imagem"/>
+ <texture_picker label="Cabeça" name="Head" tool_tip="Selecionar imagem"/>
+ <texture_picker label="Cintura acima" name="Upper Body" tool_tip="Selecionar imagem"/>
+ <texture_picker label="Cintura para baixo" name="Lower Body" tool_tip="Selecionar imagem"/>
</panel>
<panel name="accordion_panel">
<accordion name="wearable_accordion">
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_skirt.xml b/indra/newview/skins/default/xui/pt/panel_edit_skirt.xml
index b67cd53a83..275efba6e6 100644
--- a/indra/newview/skins/default/xui/pt/panel_edit_skirt.xml
+++ b/indra/newview/skins/default/xui/pt/panel_edit_skirt.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_skirt_panel">
<panel name="avatar_skirt_color_panel">
- <texture_picker label="Tecido" name="Fabric" tool_tip="Selecionar imagem"/>
+ <texture_picker label="Textura" name="Fabric" tool_tip="Selecionar imagem"/>
<color_swatch label="Cor/Tonalidade" name="Color/Tint" tool_tip="Selecionar a cor"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_socks.xml b/indra/newview/skins/default/xui/pt/panel_edit_socks.xml
index 405568abeb..6f4779d855 100644
--- a/indra/newview/skins/default/xui/pt/panel_edit_socks.xml
+++ b/indra/newview/skins/default/xui/pt/panel_edit_socks.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_socks_panel">
<panel name="avatar_socks_color_panel">
- <texture_picker label="Tecido" name="Fabric" tool_tip="Selecionar imagem"/>
+ <texture_picker label="Textura" name="Fabric" tool_tip="Selecionar imagem"/>
<color_swatch label="Cor/Tonalidade" name="Color/Tint" tool_tip="Selecionar a cor"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_underpants.xml b/indra/newview/skins/default/xui/pt/panel_edit_underpants.xml
index f858dc0495..c383471851 100644
--- a/indra/newview/skins/default/xui/pt/panel_edit_underpants.xml
+++ b/indra/newview/skins/default/xui/pt/panel_edit_underpants.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_underpants_panel">
<panel name="avatar_underpants_color_panel">
- <texture_picker label="Tecido" name="Fabric" tool_tip="Selecionar imagem"/>
+ <texture_picker label="Textura" name="Fabric" tool_tip="Selecionar imagem"/>
<color_swatch label="Cor/Tonalidade" name="Color/Tint" tool_tip="Selecionar a cor"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_undershirt.xml b/indra/newview/skins/default/xui/pt/panel_edit_undershirt.xml
index 9c18fc1d6c..0bf510c67f 100644
--- a/indra/newview/skins/default/xui/pt/panel_edit_undershirt.xml
+++ b/indra/newview/skins/default/xui/pt/panel_edit_undershirt.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_undershirt_panel">
<panel name="avatar_undershirt_color_panel">
- <texture_picker label="Tecido" name="Fabric" tool_tip="Selecionar imagem"/>
+ <texture_picker label="Textura" name="Fabric" tool_tip="Selecionar imagem"/>
<color_swatch label="Cor/Tonalidade" name="Color/Tint" tool_tip="Selecionar a cor"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_wearable.xml b/indra/newview/skins/default/xui/pt/panel_edit_wearable.xml
index 679bb524b4..2e3e3d6305 100644
--- a/indra/newview/skins/default/xui/pt/panel_edit_wearable.xml
+++ b/indra/newview/skins/default/xui/pt/panel_edit_wearable.xml
@@ -45,6 +45,9 @@
<string name="edit_tattoo_title">
Editando tatuagem
</string>
+ <string name="edit_physics_title">
+ Editando o físico
+ </string>
<string name="shape_desc_text">
Forma:
</string>
@@ -90,6 +93,9 @@
<string name="tattoo_desc_text">
Tatuagem:
</string>
+ <string name="physics_desc_text">
+ Físico:
+ </string>
<labeled_back_button label="Salvar" name="back_btn" tool_tip="Voltar à edição de look"/>
<text name="edit_wearable_title" value="Editando forma"/>
<panel label="Camisa" name="wearable_type_panel">
diff --git a/indra/newview/skins/default/xui/pt/panel_friends.xml b/indra/newview/skins/default/xui/pt/panel_friends.xml
deleted file mode 100644
index 34073f9ce1..0000000000
--- a/indra/newview/skins/default/xui/pt/panel_friends.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="friends">
- <string name="Multiple">
- Diversos amigos
- </string>
- <scroll_list name="friend_list" tool_tip="Aperte shift ou control enquanto clica para selecionar múltiplos amigos">
- <column name="icon_online_status" tool_tip="Status Online"/>
- <column label="Nome" name="friend_name" tool_tip="Nome"/>
- <column name="icon_visible_online" tool_tip="Amigo pode ver quando você está online"/>
- <column name="icon_visible_map" tool_tip="Amigo pode localizá-lo no mapa"/>
- <column name="icon_edit_mine" tool_tip="Amigo pode editar, apagar ou pegar seus objetos"/>
- <column name="icon_edit_theirs" tool_tip="Você pode editar os objetos deste amigo"/>
- </scroll_list>
- <button label="MI/Chamar" name="im_btn" tool_tip="Abrir sessão de Mensagem Instantânea" width="86"/>
- <button label="Perfil" name="profile_btn" tool_tip="Mostrar foto, grupos e outras informações" width="86"/>
- <button label="Teletransportar" name="offer_teleport_btn" tool_tip="Oferecer a este amigo o teletransporte para sua localização atual" width="86"/>
- <button label="Pagar" name="pay_btn" tool_tip="Dar Linden dólares (L$) a este amigo" width="86"/>
- <button label="Tirar" name="remove_btn" tool_tip="Remover esta pessoa de sua lista de amigos" width="86"/>
- <button label="Adicionar" name="add_btn" tool_tip="Oferecer amizade para um residente" width="86"/>
-</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_group_notices.xml b/indra/newview/skins/default/xui/pt/panel_group_notices.xml
index 21136d06fb..3bff1f8fb3 100644
--- a/indra/newview/skins/default/xui/pt/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/pt/panel_group_notices.xml
@@ -24,18 +24,15 @@ Cada grupo pode enviar no máximo 200 avisos/dia
<text name="lbl">
Criar notícia
</text>
- <text left="20" name="lbl3">
+ <text name="lbl3">
Assunto:
</text>
- <line_editor left_delta="61" name="create_subject" width="251"/>
- <text left="15" name="lbl4" width="60">
+ <text name="lbl4">
Mensagem:
</text>
- <text_editor left_delta="66" name="create_message" width="330"/>
- <text name="lbl5" width="68">
+ <text name="lbl5">
Anexo:
</text>
- <line_editor left_delta="74" name="create_inventory_name" width="190"/>
<text name="string">
Arrastar e soltar o item aqui para anexá-lo:
</text>
diff --git a/indra/newview/skins/default/xui/pt/panel_group_roles.xml b/indra/newview/skins/default/xui/pt/panel_group_roles.xml
index c861e29624..11a31570d1 100644
--- a/indra/newview/skins/default/xui/pt/panel_group_roles.xml
+++ b/indra/newview/skins/default/xui/pt/panel_group_roles.xml
@@ -6,8 +6,8 @@
<panel.string name="want_apply_text">
Deseja salvar essas mudanças?
</panel.string>
- <tab_container height="164" name="roles_tab_container">
- <panel height="148" label="MEMBROS" name="members_sub_tab" tool_tip="Membros">
+ <tab_container name="roles_tab_container">
+ <panel label="MEMBROS" name="members_sub_tab" tool_tip="Membros">
<panel.string name="help_text">
Você pode adicionar ou remover as funções designadas aos membros. Selecione vários membros, segurando a tecla Ctrl e clicando em seus nomes.
</panel.string>
@@ -15,15 +15,15 @@
[AREA] m²
</panel.string>
<filter_editor label="Filtrar por membro" name="filter_input"/>
- <name_list bottom_delta="-105" height="104" name="member_list">
+ <name_list name="member_list">
<name_list.columns label="Membro" name="name"/>
<name_list.columns label="Doações" name="donated"/>
<name_list.columns label="Status" name="online"/>
</name_list>
- <button label="Convidar" name="member_invite" width="165"/>
+ <button label="Convidar" name="member_invite" />
<button label="Ejetar" name="member_eject"/>
</panel>
- <panel height="148" label="CARGOS" name="roles_sub_tab">
+ <panel label="CARGOS" name="roles_sub_tab">
<panel.string name="help_text">
Cada cargo tem um nome e uma lista das funções que membros designados podem desempenhar.
Os membros podem ter um ou mais cargos.
@@ -36,7 +36,7 @@
Inv_FolderClosed
</panel.string>
<filter_editor label="Filtrar por cargo" name="filter_input"/>
- <scroll_list bottom_delta="-104" height="104" name="role_list">
+ <scroll_list name="role_list">
<scroll_list.columns label="Cargo" name="name"/>
<scroll_list.columns label="Título" name="title"/>
<scroll_list.columns label="#" name="members"/>
diff --git a/indra/newview/skins/default/xui/pt/panel_login.xml b/indra/newview/skins/default/xui/pt/panel_login.xml
index 9c8650e75e..f4af6a7108 100644
--- a/indra/newview/skins/default/xui/pt/panel_login.xml
+++ b/indra/newview/skins/default/xui/pt/panel_login.xml
@@ -11,12 +11,19 @@
<text name="username_text">
Nome de usuário:
</text>
- <line_editor label="zecazc12 or Magia Solar" name="username_edit" tool_tip="O nome de usuário que você escolheu ao fazer seu cadastro, como zecazc12 or Magia Solar"/>
+ <combo_box name="username_combo" tool_tip="O nome de usuário que você escolheu ao fazer seu cadastro, como zecazc12 or Magia Solar"/>
<text name="password_text">
Senha:
</text>
<check_box label="Lembrar senha" name="remember_check"/>
<button label="conectar" name="connect_btn"/>
+ <text name="mode_selection_text">
+ Modo:
+ </text>
+ <combo_box name="mode_combo" tool_tip="Selecione o modo. O modo Básico é mais rápido e ideal para explorar e conversar. Use o modo Avançado para acessar mais recursos.">
+ <combo_box.item label="Básico" name="Basic"/>
+ <combo_box.item label="Avançado" name="Advanced"/>
+ </combo_box>
<text name="start_location_text">
Começar em:
</text>
diff --git a/indra/newview/skins/default/xui/pt/panel_me.xml b/indra/newview/skins/default/xui/pt/panel_me.xml
index 412f75ca78..281c886bd4 100644
--- a/indra/newview/skins/default/xui/pt/panel_me.xml
+++ b/indra/newview/skins/default/xui/pt/panel_me.xml
@@ -1,7 +1,4 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Meu perfil" name="panel_me">
- <tab_container name="tabs">
- <panel label="MEU PERFIL" name="panel_profile"/>
- <panel label="MEUS DESTAQUES" name="panel_picks"/>
- </tab_container>
+ <panel label="MEUS DESTAQUES" name="panel_picks"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_media_settings_security.xml b/indra/newview/skins/default/xui/pt/panel_media_settings_security.xml
index 646969946c..e38c44d8fe 100644
--- a/indra/newview/skins/default/xui/pt/panel_media_settings_security.xml
+++ b/indra/newview/skins/default/xui/pt/panel_media_settings_security.xml
@@ -2,7 +2,8 @@
<panel label="Segurança" name="Media Settings Security">
<check_box initial_value="false" label="Acesso permitido a URLs com padrão específico" name="whitelist_enable"/>
<text name="home_url_fails_some_items_in_whitelist">
- URLs com falha de acesso na página inicial são indicados com um:
+ URLs com falha de acesso na página inicial são
+indicados com um:
</text>
<button label="Adicionar" name="whitelist_add"/>
<button label="Excluir" name="whitelist_del"/>
diff --git a/indra/newview/skins/default/xui/pt/panel_my_profile.xml b/indra/newview/skins/default/xui/pt/panel_my_profile.xml
deleted file mode 100644
index 1a28f61c2d..0000000000
--- a/indra/newview/skins/default/xui/pt/panel_my_profile.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Perfil" name="panel_profile">
- <string name="no_partner_text" value="Nenhum"/>
- <string name="no_group_text" value="Nenhum"/>
- <string name="RegisterDateFormat">
- [REG_DATE] ([AGE])
- </string>
- <layout_stack name="layout">
- <layout_panel name="profile_stack">
- <scroll_container name="profile_scroll">
- <panel name="scroll_content_panel">
- <panel name="second_life_image_panel">
- <icon label="" name="2nd_life_edit_icon" tool_tip="Clique no botão Editar para trocar a imagem"/>
- <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/>
- </panel>
- <panel name="first_life_image_panel">
- <icon label="" name="real_world_edit_icon" tool_tip="Clique no botão Editar para trocar a imagem"/>
- <text name="title_rw_descr_text" value="Mundo real:"/>
- </panel>
- <text name="title_member_text" value="Residente desde:"/>
- <text name="title_acc_status_text" value="Conta:"/>
- <text name="title_partner_text" value="Parceiro(a):"/>
- <panel name="partner_data_panel">
- <name_box initial_value="(pesquisando)" name="partner_text"/>
- </panel>
- <text name="title_groups_text" value="Grupos:"/>
- </panel>
- </scroll_container>
- </layout_panel>
- </layout_stack>
- <panel name="profile_me_buttons_panel">
- <button label="Editar perfil" name="edit_profile_btn" tool_tip="Editar dados pessoais"/>
- </panel>
-</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_navigation_bar.xml b/indra/newview/skins/default/xui/pt/panel_navigation_bar.xml
index 01930bf3b3..4fa5436805 100644
--- a/indra/newview/skins/default/xui/pt/panel_navigation_bar.xml
+++ b/indra/newview/skins/default/xui/pt/panel_navigation_bar.xml
@@ -1,18 +1,23 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="navigation_bar">
- <panel name="navigation_panel">
- <pull_button name="back_btn" tool_tip="Voltar para região anterior"/>
- <pull_button name="forward_btn" tool_tip="Avançar uma região"/>
- <button name="home_btn" tool_tip="Teletransportar para meu início"/>
- <location_input label="Onde" name="location_combo"/>
- <search_combo_box label="Busca" name="search_combo_box" tool_tip="Busca">
- <combo_editor label="Buscar no [SECOND_LIFE]" name="search_combo_editor"/>
- </search_combo_box>
- </panel>
- <favorites_bar name="favorite" tool_tip="Arraste marcos para cá para acessar seus lugares preferidos do Second Life!">
- <label name="favorites_bar_label" tool_tip="Arraste marcos para cá para acessar seus lugares preferidos do Second Life!">
- Barra Destaques
- </label>
- <chevron_button name="&gt;&gt;" tool_tip="Mostrar mais favoritos"/>
- </favorites_bar>
+ <layout_stack name="nvp_stack">
+ <layout_panel name="navigation_layout_panel">
+ <panel name="navigation_panel">
+ <pull_button name="back_btn" tool_tip="Voltar para região anterior"/>
+ <pull_button name="forward_btn" tool_tip="Avançar uma região"/>
+ <button name="home_btn" tool_tip="Teletransportar para meu início"/>
+ <location_input label="Onde" name="location_combo"/>
+ </panel>
+ </layout_panel>
+ <layout_panel name="favorites_layout_panel">
+ <favorites_bar name="favorite" tool_tip="Arraste marcos para cá para acessar seus lugares preferidos do Second Life!">
+ <label name="favorites_bar_label" tool_tip="Arraste marcos para cá para acessar seus lugares preferidos do Second Life!">
+ Barra Destaques
+ </label>
+ <more_button name="&gt;&gt;" tool_tip="Mostrar mais favoritos">
+ Mais â–¼
+ </more_button>
+ </favorites_bar>
+ </layout_panel>
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_nearby_chat.xml b/indra/newview/skins/default/xui/pt/panel_nearby_chat.xml
new file mode 100644
index 0000000000..6828d41dee
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_nearby_chat.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="nearby_chat">
+ <layout_stack name="stack">
+ <layout_panel name="translate_chat_checkbox_lp">
+ <check_box label="Traduzir bate-papo" name="translate_chat_checkbox"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_nearby_media.xml b/indra/newview/skins/default/xui/pt/panel_nearby_media.xml
index 7d1b48ad76..43bf8f9661 100644
--- a/indra/newview/skins/default/xui/pt/panel_nearby_media.xml
+++ b/indra/newview/skins/default/xui/pt/panel_nearby_media.xml
@@ -19,7 +19,7 @@
<button label="Parar tudo" name="all_nearby_media_disable_btn" tool_tip="Desligar mídias por perto"/>
<button label="Executar tudo" name="all_nearby_media_enable_btn" tool_tip="Ligar mídias por perto"/>
<button name="open_prefs_btn" tool_tip="Preferências de mídia"/>
- <button label="Mais &gt;&gt;" label_selected="Menos &lt;&lt;" name="more_btn" tool_tip="Controles avançados"/>
+ <button label="Mais &gt;&gt;" label_selected="&lt;&lt; Menos" name="more_btn" tool_tip="Controles avançados"/>
<button label="Mais &gt;&gt;" label_selected="Menos &lt;&lt;" name="less_btn" tool_tip="Controles avançados"/>
</panel>
<panel name="nearby_media_panel">
diff --git a/indra/newview/skins/default/xui/pt/panel_notes.xml b/indra/newview/skins/default/xui/pt/panel_notes.xml
deleted file mode 100644
index c15e838b34..0000000000
--- a/indra/newview/skins/default/xui/pt/panel_notes.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Anotações e Privacidade" name="panel_notes">
- <layout_stack name="layout">
- <layout_panel name="notes_stack">
- <scroll_container name="profile_scroll">
- <panel name="profile_scroll_panel">
- <text name="status_message" value="Minhas anotações privadas:"/>
- <text name="status_message2" value="Deixar esta pessoa:"/>
- <check_box label="Ver meu status" name="status_check"/>
- <check_box label="Ver minha localização no mapa" name="map_check"/>
- <check_box label="Pegar, editar ou excluir objetos meus" name="objects_check"/>
- </panel>
- </scroll_container>
- </layout_panel>
- <layout_panel name="notes_buttons_panel">
- <layout_stack name="bottom_bar_ls">
- <layout_panel name="add_friend_btn_lp">
- <button label="Adicionar amigo" name="add_friend" tool_tip="Oferecer amizade ao residente"/>
- </layout_panel>
- <layout_panel name="im_btn_lp">
- <button label="MI" name="im" tool_tip="Abrir sessão de mensagem instantânea"/>
- </layout_panel>
- <layout_panel name="call_btn_lp">
- <button label="Ligar" name="call" tool_tip="Ligar para este residente"/>
- </layout_panel>
- <layout_panel name="show_on_map_btn_lp">
- <button label="Mapa" name="show_on_map_btn" tool_tip="Exibir o residente no mapa"/>
- </layout_panel>
- <layout_panel name="teleport_btn_lp">
- <button label="Teletransportar" name="teleport" tool_tip="Oferecer teletransporte"/>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_notify_textbox.xml b/indra/newview/skins/default/xui/pt/panel_notify_textbox.xml
new file mode 100644
index 0000000000..dcd9ba1815
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_notify_textbox.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="instant_message" name="panel_notify_textbox">
+ <string name="message_max_lines_count" value="7"/>
+ <panel label="info_panel" name="info_panel">
+ <text_editor name="message" value="mensagem"/>
+ </panel>
+ <panel label="control_panel" name="control_panel">
+ <button label="Enviar" name="btn_submit"/>
+ <button label="Ignorar" name="ignore_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_outbox_inventory.xml b/indra/newview/skins/default/xui/pt/panel_outbox_inventory.xml
new file mode 100644
index 0000000000..442622035a
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_outbox_inventory.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<outbox_inventory_panel name="inventory_outbox" tool_tip="Arraste e solte os itens aqui para prepará-los para venda na frente da sua loja"/>
diff --git a/indra/newview/skins/default/xui/pt/panel_outfits_list.xml b/indra/newview/skins/default/xui/pt/panel_outfits_list.xml
index 2b2e7c1dbf..2d74e092a4 100644
--- a/indra/newview/skins/default/xui/pt/panel_outfits_list.xml
+++ b/indra/newview/skins/default/xui/pt/panel_outfits_list.xml
@@ -1,7 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="Outfits">
+ <accordion name="outfits_accordion">
+ <no_matched_tabs_text name="no_matched_outfits_msg" value="Não encontrou o que procura? Tente fazer uma [secondlife:///app/search/people/[SEARCH_TERM] Busca]."/>
+ <no_visible_tabs_text name="no_outfits_msg" value="Você ainda não tem nenhum look. Tente encontrar um na [secondlife:///app/search/groups Busca]."/>
+ </accordion>
<panel name="bottom_panel">
- <button name="options_gear_btn" tool_tip="Mostrar opções adicionais"/>
+ <menu_button name="options_gear_btn" tool_tip="Mostrar opções adicionais"/>
<button name="trash_btn" tool_tip="Excluir o look selecionado"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_people.xml b/indra/newview/skins/default/xui/pt/panel_people.xml
index e02e3998eb..f3af15b991 100644
--- a/indra/newview/skins/default/xui/pt/panel_people.xml
+++ b/indra/newview/skins/default/xui/pt/panel_people.xml
@@ -18,11 +18,13 @@ Em busca de alguém para conversar? Procure no [secondlife:///app/worldmap Mapa-
<string name="groups_filter_label" value="Filtro de grupos"/>
<string name="no_filtered_groups_msg" value="Não encontrou o que procura? Tente buscar no [secondlife:///app/search/groups/[SEARCH_TERM] Search]."/>
<string name="no_groups_msg" value="À procura de grupos interessantes? Tente fazer uma [secondlife:///app/search/groups Busca]."/>
+ <string name="MiniMapToolTipMsg" value="[REGION](Clique duas vezes para abrir o mapa, shift+arraste para a visão pan)"/>
+ <string name="AltMiniMapToolTipMsg" value="[REGION](Clique duas vezes para teletransportar, shift+arraste para a visão pan)"/>
<filter_editor label="Filtro" name="filter_input"/>
<tab_container name="tabs">
<panel label="PROXIMIDADE" name="nearby_panel">
<panel label="bottom_panel" name="bottom_panel">
- <button name="nearby_view_sort_btn" tool_tip="Opções"/>
+ <menu_button name="nearby_view_sort_btn" tool_tip="Opções"/>
<button name="add_friend_btn" tool_tip="Adicionar o residente selecionado para sua lista de amigos"/>
</panel>
</panel>
@@ -34,27 +36,27 @@ Em busca de alguém para conversar? Procure no [secondlife:///app/worldmap Mapa-
<panel label="bottom_panel" name="bottom_panel">
<layout_stack name="bottom_panel">
<layout_panel name="options_gear_btn_panel">
- <button name="friends_viewsort_btn" tool_tip="Mostrar opções adicionais"/>
+ <menu_button name="friends_viewsort_btn" tool_tip="Mostrar opções adicionais"/>
</layout_panel>
<layout_panel name="add_btn_panel">
<button name="add_btn" tool_tip="Oferecer amizade para um residente"/>
</layout_panel>
<layout_panel name="trash_btn_panel">
- <dnd_button name="trash_btn" tool_tip="Remover a pessoa selecionada da sua lista de amigos"/>
+ <dnd_button name="del_btn" tool_tip="Remover a pessoa selecionada da sua lista de amigos"/>
</layout_panel>
</layout_stack>
</panel>
</panel>
<panel label="MEUS GRUPOS" name="groups_panel">
<panel label="bottom_panel" name="bottom_panel">
- <button name="groups_viewsort_btn" tool_tip="Opções"/>
+ <menu_button name="groups_viewsort_btn" tool_tip="Opções"/>
<button name="plus_btn" tool_tip="Ingressar em um grupo/Criar novo grupo"/>
<button name="activate_btn" tool_tip="Ativar o grupo selecionado"/>
</panel>
</panel>
<panel label="RECENTE" name="recent_panel">
<panel label="bottom_panel" name="bottom_panel">
- <button name="recent_viewsort_btn" tool_tip="Opções"/>
+ <menu_button name="recent_viewsort_btn" tool_tip="Opções"/>
<button name="add_friend_btn" tool_tip="Adicionar o residente selecionado para sua lista de amigos"/>
</panel>
</panel>
@@ -64,16 +66,16 @@ Em busca de alguém para conversar? Procure no [secondlife:///app/worldmap Mapa-
<layout_panel name="view_profile_btn_lp">
<button label="Perfil" name="view_profile_btn" tool_tip="Exibir fotografia, grupos e outras informações dos residentes"/>
</layout_panel>
- <layout_panel name="chat_btn_lp">
+ <layout_panel name="im_btn_lp">
<button label="MI" name="im_btn" tool_tip="Abrir sessão de mensagem instantânea"/>
</layout_panel>
- <layout_panel name="chat_btn_lp">
+ <layout_panel name="call_btn_lp">
<button label="Ligar" name="call_btn" tool_tip="Ligar para este residente"/>
</layout_panel>
- <layout_panel name="chat_btn_lp">
+ <layout_panel name="share_btn_lp">
<button label="Compartilhar" name="share_btn" tool_tip="Compartilhar item de inventário"/>
</layout_panel>
- <layout_panel name="chat_btn_lp">
+ <layout_panel name="teleport_btn_lp">
<button label="Teletransportar" name="teleport_btn" tool_tip="Oferecer teletransporte"/>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/pt/panel_place_profile.xml b/indra/newview/skins/default/xui/pt/panel_place_profile.xml
index 7fc07483c0..8abe579702 100644
--- a/indra/newview/skins/default/xui/pt/panel_place_profile.xml
+++ b/indra/newview/skins/default/xui/pt/panel_place_profile.xml
@@ -64,6 +64,8 @@
<text name="scripts_value" value="Ligado"/>
<text name="damage_label" value="Dano:"/>
<text name="damage_value" value="Desligado"/>
+ <text name="see_avatars_label" value="Ver avatares:"/>
+ <text name="see_avatars_value" value="Desligar"/>
<button label="Sobre o terreno" name="about_land_btn"/>
</panel>
</accordion_tab>
diff --git a/indra/newview/skins/default/xui/pt/panel_places.xml b/indra/newview/skins/default/xui/pt/panel_places.xml
index 2e443bc057..69f0baf65f 100644
--- a/indra/newview/skins/default/xui/pt/panel_places.xml
+++ b/indra/newview/skins/default/xui/pt/panel_places.xml
@@ -21,10 +21,10 @@
<button label="Editar" name="edit_btn" tool_tip="Editar dados do marco"/>
</layout_panel>
<layout_panel name="overflow_btn_lp">
- <button label="▼" name="overflow_btn" tool_tip="Mostrar opções adicionais"/>
+ <menu_button label="▼" name="overflow_btn" tool_tip="Mostrar opções adicionais"/>
</layout_panel>
</layout_stack>
- <layout_stack name="bottom_bar_ls3">
+ <layout_stack name="bottom_bar_profile_ls">
<layout_panel name="profile_btn_lp">
<button label="Perfil" name="profile_btn" tool_tip="Mostrar perfil do lugar"/>
</layout_panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_postcard_message.xml b/indra/newview/skins/default/xui/pt/panel_postcard_message.xml
new file mode 100644
index 0000000000..9cde810430
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_postcard_message.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_postcard_message">
+ <text name="to_label">
+ Para:
+ </text>
+ <text name="name_label">
+ De:
+ </text>
+ <text name="subject_label">
+ Assunto:
+ </text>
+ <line_editor label="Digite aqui o assunto." name="subject_form"/>
+ <text name="msg_label">
+ Mensagem:
+ </text>
+ <text_editor name="msg_form">
+ Digite aqui a mensagem.
+ </text_editor>
+ <button label="Cancelar" name="cancel_btn"/>
+ <button label="Enviar" name="send_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_postcard_settings.xml b/indra/newview/skins/default/xui/pt/panel_postcard_settings.xml
new file mode 100644
index 0000000000..3088b9a996
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_postcard_settings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_postcard_settings">
+ <combo_box label="Resolução" name="postcard_size_combo">
+ <combo_box.item label="Janela atual" name="CurrentWindow"/>
+ <combo_box.item label="640x480" name="640x480"/>
+ <combo_box.item label="800x600" name="800x600"/>
+ <combo_box.item label="1024x768" name="1024x768"/>
+ <combo_box.item label="Customizado" name="Custom"/>
+ </combo_box>
+ <layout_stack name="postcard_image_params_ls">
+ <layout_panel name="postcard_image_size_lp">
+ <spinner label="Largura" name="postcard_snapshot_width"/>
+ <spinner label="Altura" name="postcard_snapshot_height"/>
+ <check_box label="Limitar proporções" name="postcard_keep_aspect_check"/>
+ </layout_panel>
+ <layout_panel name="postcard_image_format_quality_lp">
+ <slider label="Qualidade da imagem" name="image_quality_slider"/>
+ <text name="image_quality_level">
+ ([QLVL])
+ </text>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/pt/panel_preferences_advanced.xml
index 13cb8a444e..c72928fc35 100644
--- a/indra/newview/skins/default/xui/pt/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/pt/panel_preferences_advanced.xml
@@ -3,35 +3,29 @@
<panel.string name="aspect_ratio_text">
[NUM]:[DEN]
</panel.string>
- <panel.string name="middle_mouse">
- Botão do meio do mouse
- </panel.string>
- <slider label="Ângulo de visão" name="camera_fov"/>
- <slider label="Distância" name="camera_offset_scale"/>
- <text name="heading2">
- Posicionamento automático da:
+ <text name="Cache:">
+ Cache:
+ </text>
+ <spinner label="Cache (64 - 9984 MB)" name="cachesizespinner"/>
+ <text name="text_box5">
+ MB
+ </text>
+ <button label="Limpar cache" label_selected="Limpar cache" name="clear_cache"/>
+ <text name="Cache location">
+ Localização do cache:
</text>
- <check_box label="Construção/Edição" name="edit_camera_movement" tool_tip="Use o posicionamento automático da câmera quando entrar e sair do modo de edição"/>
- <check_box label="Aparência" name="appearance_camera_movement" tool_tip="Use o posicionamento automático da câmera quando em modo de edição"/>
- <check_box initial_value="verdadeiro" label="Barra lateral" name="appearance_sidebar_positioning" tool_tip="Usar posicionamento automático da câmera na barra lateral"/>
- <check_box label="Mostre-me em visão de mouse" name="first_person_avatar_visible"/>
- <check_box label="Teclas de seta sempre me movem" name="arrow_keys_move_avatar_check"/>
- <check_box label="Dê dois toques e pressione para correr" name="tap_tap_hold_to_run"/>
- <check_box label="Mover os lábios do avatar ao falar" name="enable_lip_sync"/>
- <check_box label="Balão de bate-papo" name="bubble_text_chat"/>
- <slider label="Opacidade" name="bubble_chat_opacity"/>
- <color_swatch name="background" tool_tip="Cor do balão de bate-papo"/>
+ <button label="Navegar" label_selected="Navegar" name="set_cache"/>
+ <button label="Localização padrão" label_selected="Localização padrão" name="default_cache_location"/>
<text name="UI Size:">
- Interface
+ Interface:
</text>
<check_box label="Mostrar erros de script" name="show_script_errors"/>
<radio_group name="show_location">
<radio_item label="Bate-papo local" name="0"/>
<radio_item label="Janelas separadas" name="1"/>
</radio_group>
- <check_box label="Tecla liga/desliga da minha voz:" name="push_to_talk_toggle_check" tool_tip="Quando em modo de alternância, pressione e solte o botão UMA vez para ligar e desligar o microfone. Quando em modo de alternância, o microfone só transmite sua voz quando o botão estiver pressionado."/>
- <line_editor label="Botão apertar e falar" name="modifier_combo"/>
- <button label="Definir tecla" name="set_voice_hotkey_button"/>
- <button label="Botão do meio do mouse" name="set_voice_middlemouse_button" tool_tip="Redefinir como botão do meio do mouse"/>
- <button label="Outros dispositivos" name="joystick_setup_button"/>
+ <check_box label="Permitir vários visualizadores" name="allow_multiple_viewer_check"/>
+ <check_box label="Mostrar grade selecionada ao entrar" name="show_grid_selection_check"/>
+ <check_box label="Exibir menu avançado" name="show_advanced_menu_check"/>
+ <check_box label="Exibir menu desenvolvedor" name="show_develop_menu_check"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml b/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml
index ea15b90628..c5a4febb0e 100644
--- a/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml
@@ -8,44 +8,10 @@
<radio_item label="Médio" name="radio2" value="1"/>
<radio_item label="Grande" name="radio3" value="2"/>
</radio_group>
- <text name="font_colors">
- Cor da fonte:
- </text>
- <color_swatch label="Você" name="user"/>
- <text name="text_box1">
- Eu
- </text>
- <color_swatch label="Outros" name="agent"/>
- <text name="text_box2">
- Outros
- </text>
- <color_swatch label="MI" name="im"/>
- <text name="text_box3">
- MI
- </text>
- <color_swatch label="Sistema" name="system"/>
- <text name="text_box4">
- Sistema
- </text>
- <color_swatch label="Erros" name="script_error"/>
- <text name="text_box5">
- Erros
- </text>
- <color_swatch label="Objetos" name="objects"/>
- <text name="text_box6">
- Objetos
- </text>
- <color_swatch label="Dono" name="owner"/>
- <text name="text_box7">
- Dono
- </text>
- <color_swatch label="URLs" name="links"/>
- <text name="text_box9">
- URLs
- </text>
<check_box initial_value="true" label="Executar animação digitada quando estiver conversando" name="play_typing_animation"/>
<check_box label="Enviar MIs por email se estiver desconectado" name="send_im_to_email"/>
<check_box label="Ativar MIs e bate-papos de texto simples" name="plain_text_chat_history"/>
+ <check_box label="Balão de bate-papo" name="bubble_text_chat"/>
<text name="show_ims_in_label">
Mostrar MIs em:
</text>
@@ -56,27 +22,12 @@
<radio_item label="Janelas separadas" name="radio" value="0"/>
<radio_item label="Guias" name="radio2" value="1"/>
</radio_group>
- <check_box label="Traduzir bate-papo automaticamente (via Google)" name="translate_chat_checkbox"/>
- <text name="translate_language_text">
- Traduzir bate-papo para:
- </text>
- <combo_box name="translate_language_combobox">
- <combo_box.item label="Padrão" name="System Default Language"/>
- <combo_box.item label="English (Inglês)" name="English"/>
- <combo_box.item label="Dansk (Dinamarquês)" name="Danish"/>
- <combo_box.item label="Deutsch (Alemão)" name="German"/>
- <combo_box.item label="Español (Espanhol)" name="Spanish"/>
- <combo_box.item label="Français (Francês)" name="French"/>
- <combo_box.item label="Italiano (Italiano)" name="Italian"/>
- <combo_box.item label="Magyar (Húngaro)" name="Hungarian"/>
- <combo_box.item label="Nederlands (Holandês)" name="Dutch"/>
- <combo_box.item label="Polski (Polonês)" name="Polish"/>
- <combo_box.item label="Português (Português)" name="Portugese"/>
- <combo_box.item label="РуÑÑкий (Russo)" name="Russian"/>
- <combo_box.item label="Türkçe (Turco)" name="Turkish"/>
- <combo_box.item label="УкраїнÑька (Ucraniano)" name="Ukrainian"/>
- <combo_box.item label="中文 (简体) (Chinês)" name="Chinese"/>
- <combo_box.item label="日本語 (Japonês)" name="Japanese"/>
- <combo_box.item label="한국어 (Coreano)" name="Korean"/>
- </combo_box>
+ <text name="disable_toast_label">
+ Ativar pop-ups de novos bate-papos:
+ </text>
+ <check_box label="Bate-papo de grupo" name="EnableGroupChatPopups" tool_tip="Exibir pop-up de bate-papos novos de grupos"/>
+ <check_box label="Bate-papos de MI" name="EnableIMChatPopups" tool_tip="Exibir pop-up de mensagens instantâneas novas"/>
+ <spinner label="Transição de avisos de bate-papos por perto:" name="nearby_toasts_lifetime"/>
+ <spinner label="Transição de avisos de bate-papos por perto:" name="nearby_toasts_fadingtime"/>
+ <button label="Configurações de tradução de bate-papo" name="ok_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_colors.xml b/indra/newview/skins/default/xui/pt/panel_preferences_colors.xml
new file mode 100644
index 0000000000..d6c6f66e37
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_preferences_colors.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Cores" name="colors_panel">
+ <text name="effects_color_textbox">
+ Meus efeitos (raio de seleção):
+ </text>
+ <color_swatch name="effect_color_swatch" tool_tip="Selecionar a cor"/>
+ <text name="font_colors">
+ Cores no bate-papo:
+ </text>
+ <text name="text_box1">
+ Eu
+ </text>
+ <text name="text_box2">
+ Outros
+ </text>
+ <text name="text_box3">
+ Objects
+ </text>
+ <text name="text_box4">
+ Sistema
+ </text>
+ <text name="text_box5">
+ Erros
+ </text>
+ <text name="text_box10">
+ Direto
+ </text>
+ <text name="text_box7">
+ Proprietário
+ </text>
+ <text name="text_box9">
+ URLs
+ </text>
+ <text name="bubble_chat">
+ Cor de fundo do nome (e do balão do bate-papo):
+ </text>
+ <color_swatch name="background" tool_tip="Selecionar cor do nome"/>
+ <slider label="Opacidade:" name="bubble_chat_opacity" tool_tip="Selecionar cor do nome"/>
+ <text name="floater_opacity">
+ Opacidade:
+ </text>
+ <slider label="Ativo:" name="active"/>
+ <slider label="Inativo:" name="inactive"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_general.xml b/indra/newview/skins/default/xui/pt/panel_preferences_general.xml
index ea618d097d..c53aa7d5f7 100644
--- a/indra/newview/skins/default/xui/pt/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/pt/panel_preferences_general.xml
@@ -11,10 +11,12 @@
<combo_box.item label="Español (Espanhol) - Beta" name="Spanish"/>
<combo_box.item label="Français (Francês) - Beta" name="French"/>
<combo_box.item label="Italiano - Beta" name="Italian"/>
- <combo_box.item label="Nederlands (Holandês) - Beta" name="Dutch"/>
<combo_box.item label="Polski (Polonês) - Beta" name="Polish"/>
<combo_box.item label="Português (Português) - Beta" name="Portugese"/>
+ <combo_box.item label="РуÑÑкий (Russo) - Beta" name="Russian"/>
+ <combo_box.item label="Türkçe (Turco) - Beta" name="Turkish"/>
<combo_box.item label="日本語 (Japonês) - Beta" name="(Japanese)"/>
+ <combo_box.item label="正體中文 (Chinês tradicional) - Beta" name="Traditional Chinese"/>
</combo_box>
<text name="language_textbox2">
(Reinicie para trocar de idioma)
@@ -48,13 +50,17 @@
<check_box label="Nomes de usuário" name="show_slids" tool_tip="Mostrar nome de usuário, como zecazc123"/>
<check_box label="Cargos do grupo" name="show_all_title_checkbox1" tool_tip="Mostrar os títulos de cargos, como membro ou diretor"/>
<check_box label="Realçar amigos" name="show_friends" tool_tip="Realçar nomes de tela de amigos"/>
- <text name="effects_color_textbox">
- Meus efeitos:
+ <check_box label="Ver nomes de tela" name="display_names_check" tool_tip="Usar nome de tela no bate-papo, MI, etc."/>
+ <text name="inworld_typing_rg_label">
+ Teclas de letras:
</text>
+ <radio_group name="inworld_typing_preference">
+ <radio_item label="Inicia o bate-papo local" name="radio_start_chat" value="1"/>
+ <radio_item label="Afeta o movimento (ex.: WASD)" name="radio_move" value="0"/>
+ </radio_group>
<text name="title_afk_text">
Entrar no modo ausente em:
</text>
- <color_swatch label="" name="effect_color_swatch" tool_tip="Clique para abrir o seletor de cores"/>
<combo_box label="Entrar no modo ausente em:" name="afk">
<combo_box.item label="2 minutos" name="item0"/>
<combo_box.item label="5 minutos" name="item1"/>
@@ -62,7 +68,6 @@
<combo_box.item label="30 minutos" name="item3"/>
<combo_box.item label="(nunca)" name="item4"/>
</combo_box>
- <check_box label="Ver nomes de tela" name="display_names_check" tool_tip="Usar nome de tela no bate-papo, MI, etc."/>
<text name="text_box3">
Mensagem do modo ocupado:
</text>
diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/pt/panel_preferences_graphics1.xml
index 912eea13b8..28e7184326 100644
--- a/indra/newview/skins/default/xui/pt/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/pt/panel_preferences_graphics1.xml
@@ -26,9 +26,22 @@ rápido
<text name="ShadersText">
Sombreadores:
</text>
+ <check_box initial_value="verdadeiro" label="Ãgua transparente" name="TransparentWater"/>
<check_box initial_value="true" label="Bump de Mapeamento e Brilho" name="BumpShiny"/>
+ <check_box initial_value="verdadeiro" label="Luzes locais" name="LocalLights"/>
<check_box initial_value="true" label="Sombreadores básicos" name="BasicShaders" tool_tip="Desabilitar esta opção poderá impedir que alguns drivers de placa de vídeo a travem."/>
<check_box initial_value="true" label="Sombreadores Atmosféricos" name="WindLightUseAtmosShaders"/>
+ <check_box initial_value="verdadeiro" label="Iluminação e sombras" name="UseLightShaders"/>
+ <check_box initial_value="verdadeiro" label="Oclusão ambiental" name="UseSSAO"/>
+ <check_box initial_value="verdadeiro" label="Profundidade" name="UseDoF"/>
+ <text name="shadows_label">
+ Sombras:
+ </text>
+ <combo_box name="ShadowDetail">
+ <combo_box.item label="Nenhum" name="0"/>
+ <combo_box.item label="Sol/Lua" name="1"/>
+ <combo_box.item label="Sol/Lua + Projetores" name="2"/>
+ </combo_box>
<text name="reflection_label">
Reflexo de água:
</text>
@@ -39,6 +52,10 @@ rápido
<combo_box.item label="Avatares e objetos" name="3"/>
<combo_box.item label="Tudo" name="4"/>
</combo_box>
+ <slider label="Físico do avatar:" name="AvatarPhysicsDetail"/>
+ <text name="AvatarPhysicsDetailText">
+ Baixo
+ </text>
<slider label="Distancia de desenho:" name="DrawDistance"/>
<text name="DrawDistanceMeterText2">
m
@@ -77,7 +94,7 @@ rápido
Baixo
</text>
<text name="AvatarRenderingText">
- Renderização de Avatar:
+ Renderização do avatar:
</text>
<check_box initial_value="true" label="Atributos do Avatar" name="AvatarImpostors"/>
<check_box initial_value="true" label="Melhoria de Hardware" name="AvatarVertexProgram"/>
diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_move.xml b/indra/newview/skins/default/xui/pt/panel_preferences_move.xml
new file mode 100644
index 0000000000..fa6f5f5851
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_preferences_move.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Movimentar" name="move_panel">
+ <slider label="Ângulo de visão" name="camera_fov"/>
+ <slider label="Distância" name="camera_offset_scale"/>
+ <text name="heading2">
+ Posicionamento automático:
+ </text>
+ <check_box label="Construir/Editar" name="edit_camera_movement" tool_tip="Use o posicionamento automático da câmera quando entrar e sair do modo de edição"/>
+ <check_box label="Aparência" name="appearance_camera_movement" tool_tip="Use o posicionamento automático da câmera quando em modo de edição"/>
+ <text name="keyboard_lbl">
+ Teclado:
+ </text>
+ <check_box label="Teclas de seta sempre me movem" name="arrow_keys_move_avatar_check"/>
+ <check_box label="Dê dois toques e pressione para correr" name="tap_tap_hold_to_run"/>
+ <text name="mouse_lbl">
+ Mouse:
+ </text>
+ <check_box label="Mostre-me em visão de mouse" name="first_person_avatar_visible"/>
+ <text name=" Mouse Sensitivity">
+ Sensibilidade do mouse:
+ </text>
+ <check_box label="Inverter" name="invert_mouse"/>
+ <text name="single_click_action_lbl">
+ Clique único no terreno:
+ </text>
+ <combo_box name="single_click_action_combo">
+ <combo_box.item label="Nenhuma ação" name="0"/>
+ <combo_box.item label="Mover para ponto clicado" name="1"/>
+ </combo_box>
+ <text name="double_click_action_lbl">
+ Clique duplo no terreno:
+ </text>
+ <combo_box name="double_click_action_combo">
+ <combo_box.item label="Nenhuma ação" name="0"/>
+ <combo_box.item label="Mover para ponto clicado" name="1"/>
+ <combo_box.item label="Teletransportar para ponto clicado" name="2"/>
+ </combo_box>
+ <button label="Outros dispositivos" name="joystick_setup_button"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/pt/panel_preferences_privacy.xml
index ba4ebdb9bf..d7fb585e35 100644
--- a/indra/newview/skins/default/xui/pt/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/pt/panel_preferences_privacy.xml
@@ -7,20 +7,25 @@
<text name="cache_size_label_l">
(Locações, imagens, web, histórico de busca)
</text>
+ <check_box label="Mostrar nos resultados de busca" name="online_searchresults"/>
<check_box label="Apenas amigos e grupos sabem que estou online" name="online_visibility"/>
<check_box label="Apenas amigos e grupos podem me chamar ou enviar MI" name="voice_call_friends_only_check"/>
<check_box label="Desligar o microfone quando terminar chamadas" name="auto_disengage_mic_check"/>
- <check_box label="Aceitar cookies" name="cookies_enabled"/>
+ <check_box label="Mostrar meus marcos preferidos na página de login (menu &apos;Começar em&apos;:)" name="favorites_on_login_check"/>
<text name="Logs:">
- Logs:
+ Registro de bate-papos:
</text>
<check_box label="Salvar logs de bate- papo das proximidades no meu computador" name="log_nearby_chat"/>
<check_box label="Salvar logs de MI no meu computador" name="log_instant_messages"/>
- <check_box label="Adicionar timestamp" name="show_timestamps_check_im"/>
+ <check_box label="Anotar horas de cada linha de bate-papo" name="show_timestamps_check_im"/>
+ <check_box label="Anotar a data ao arquivo." name="logfile_name_datestamp"/>
<text name="log_path_desc">
Localização dos logs:
</text>
<line_editor left="278" name="log_path_string" right="-20"/>
<button label="Procurar" label_selected="Procurar" name="log_path_button" width="120"/>
<button label="Lista de bloqueados" name="block_list"/>
+ <text name="block_list_label">
+ (Pessoas ou objetos que você bloqueou)
+ </text>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_setup.xml b/indra/newview/skins/default/xui/pt/panel_preferences_setup.xml
index deb8573ba3..ebbd63138a 100644
--- a/indra/newview/skins/default/xui/pt/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/pt/panel_preferences_setup.xml
@@ -1,12 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Configurações" name="Input panel">
- <text name="Mouselook:">
- Visão subjetiva:
- </text>
- <text name=" Mouse Sensitivity">
- Sensibilidade do mouse
- </text>
- <check_box label="Inverter" name="invert_mouse"/>
<text name="Network:">
Rede:
</text>
@@ -18,32 +11,26 @@
</text>
<check_box label="Personalizar porta" name="connection_port_enabled"/>
<spinner label="Número da porta:" name="connection_port"/>
- <text name="cache_size_label_l">
- Tamanho do cache
- </text>
- <text name="text_box5">
- MB
- </text>
- <text name="Cache location">
- Localização do cache:
- </text>
- <button label="Procurar" label_selected="Procurar" name="set_cache"/>
- <button label="Redefinir" label_selected="Redefinir" name="reset_cache"/>
<text name="Web:">
Web:
</text>
<radio_group name="use_external_browser">
- <radio_item label="Usar meu navegador (IE, Firefox, Safari)" name="external" tool_tip="Use o navegador incluso para consultar a ajuda, abrir links da web, etc. Uso em tela inteira não recomendado." value="1"/>
+ <radio_item label="Usar meu navegador (IE, Firefox, Safari)" name="external" tool_tip="Use o navegador incluso para consultar a ajuda, abrir links da web, etc. Uso em tela inteira não recomendado." value="true"/>
<radio_item label="Usar navegador incluso" name="internal" tool_tip="Use este navegador para consultar a ajuda, abrir links da web, etc. As janelas abrem dentro do [APP_NAME]." value=""/>
</radio_group>
<check_box initial_value="true" label="Habilitar plugins" name="browser_plugins_enabled"/>
<check_box initial_value="true" label="Aceitar cookies" name="cookies_enabled"/>
<check_box initial_value="true" label="Habilitar Javascript" name="browser_javascript_enabled"/>
<check_box initial_value="falso" label="Ativar pop-ups no navegador de mídia" name="media_popup_enabled"/>
- <check_box initial_value="false" label="Ativar web proxy" name="web_proxy_enabled"/>
- <text name="Proxy location">
- Localização do proxy:
+ <text name="Software updates:">
+ Atualizações de software:
+ </text>
+ <combo_box name="updater_service_combobox">
+ <combo_box.item label="Instalar automaticamente" name="Install_automatically"/>
+ <combo_box.item label="Baixar e instalar atualizações manualmente" name="Install_manual"/>
+ </combo_box>
+ <text name="Proxy Settings:">
+ Configurações de proxy:
</text>
- <line_editor name="web_proxy_editor" tool_tip="O nome ou endereço IP do proxy da sua preferência"/>
- <spinner label="Porta:" name="web_proxy_port"/>
+ <button label="Ajustar configurações de proxy" label_selected="Procurar" name="set_proxy"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml b/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml
index 5be07f4d1f..d910a7b812 100644
--- a/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml
@@ -1,18 +1,25 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Sons" name="Preference Media panel">
+ <panel.string name="middle_mouse">
+ Botão do meio do mouse
+ </panel.string>
<slider label="Volume principal" name="System Volume"/>
- <check_box initial_value="true" label="Silenciar ao minimizar" name="mute_when_minimized"/>
+ <check_box initial_value="true" name="mute_when_minimized"/>
+ <text name="mute_chb_label">
+ Silenciar ao minimizar
+ </text>
<slider label="Botões" name="UI Volume"/>
<slider label="Ambiente" name="Wind Volume"/>
<slider label="Efeitos sonoros" name="SFX Volume"/>
<slider label="Streaming de música" name="Music Volume"/>
- <check_box label="Ativado" name="music_enabled"/>
+ <check_box label="Ativado" name="enable_music"/>
<slider label="Mídia" name="Media Volume"/>
<check_box label="Ativado" name="enable_media"/>
<slider label="Bate-papo de voz" name="Voice Volume"/>
<check_box label="Ativado" name="enable_voice_check"/>
<check_box label="Autorizar auto-play de mídias" name="media_auto_play_btn" tool_tip="Marque esta opção para auto-executar mídias, se elas quiserem" value="true"/>
<check_box label="Tocar mídia anexada em outros avatares" name="media_show_on_others_btn" tool_tip="Desmarque esta opção para ocultar mídias anexadas em avatares por perto" value="true"/>
+ <check_box label="Tocar áudio de gestos" name="gesture_audio_play_btn" tool_tip="Selecione para ouvir o áudio de gestos" value="verdadeiro"/>
<text name="voice_chat_settings">
Configuração de bate-papo de voz
</text>
@@ -23,29 +30,11 @@
<radio_item label="Posição de câmera" name="0"/>
<radio_item label="Posição do avatar" name="1"/>
</radio_group>
+ <check_box label="Mover os lábios do avatar quando estiver falando" name="enable_lip_sync"/>
+ <check_box label="Tecla liga/desliga da minha voz:" name="push_to_talk_toggle_check" tool_tip="Quando em modo de alternância, pressione e solte o botão UMA vez para ligar e desligar o microfone. Fora do modo de alternância, o microfone só transmite sua voz enquanto o botão estiver pressionado."/>
+ <line_editor label="Botão apertar e falar" name="modifier_combo"/>
+ <button label="Definir chave" name="set_voice_hotkey_button"/>
+ <button name="set_voice_middlemouse_button" tool_tip="Redefinir como botão do meio do mouse"/>
<button label="Controles de entrada/saída" name="device_settings_btn" width="180"/>
- <panel label="Configuração dos dispositivo" name="device_settings_panel">
- <panel.string name="default_text">
- Padrão
- </panel.string>
- <panel.string name="default system device">
- Dispositivo padrão do sistema
- </panel.string>
- <panel.string name="no device">
- Nenhum
- </panel.string>
- <text name="Input">
- Entrada
- </text>
- <text name="My volume label">
- Meu volume:
- </text>
- <slider_bar initial_value="1.0" name="mic_volume_slider" tool_tip="Mude o volume usando o controle deslizante"/>
- <text name="wait_text">
- Aguarde
- </text>
- <text name="Output">
- Saída
- </text>
- </panel>
+ <panel label="Configuração dos dispositivo" name="device_settings_panel"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_profile.xml b/indra/newview/skins/default/xui/pt/panel_profile.xml
deleted file mode 100644
index e4200ae5da..0000000000
--- a/indra/newview/skins/default/xui/pt/panel_profile.xml
+++ /dev/null
@@ -1,64 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Perfil" name="panel_profile">
- <string name="CaptionTextAcctInfo">
- [ACCTTYPE]
-[PAYMENTINFO] [AGEVERIFICATION]
- </string>
- <string name="payment_update_link_url">
- http://www.secondlife.com/account/billing.php?lang=pt-BR
- </string>
- <string name="partner_edit_link_url">
- http://www.secondlife.com/account/partners.php?lang=pt
- </string>
- <string name="my_account_link_url" value="http://secondlife.com/my/account/index.php?lang=pt-BR"/>
- <string name="no_partner_text" value="Ninguém"/>
- <string name="no_group_text" value="Nenhum"/>
- <string name="RegisterDateFormat">
- [REG_DATE] ([AGE])
- </string>
- <layout_stack name="layout">
- <layout_panel name="profile_stack">
- <scroll_container name="profile_scroll">
- <panel name="profile_scroll_panel">
- <panel name="second_life_image_panel">
- <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/>
- </panel>
- <panel name="first_life_image_panel">
- <text name="title_rw_descr_text" value="Mundo real:"/>
- </panel>
- <text name="title_member_text" value="Residente desde:"/>
- <text name="title_acc_status_text" value="Conta:"/>
- <text name="title_partner_text" value="Parceiro(a):"/>
- <panel name="partner_data_panel">
- <name_box initial_value="(pesquisando)" name="partner_text"/>
- </panel>
- <text name="title_groups_text" value="Grupos:"/>
- </panel>
- </scroll_container>
- </layout_panel>
- </layout_stack>
- <layout_stack name="layout_verb_buttons">
- <layout_panel name="profile_buttons_panel">
- <layout_stack name="bottom_bar_ls">
- <layout_panel name="add_friend_btn_lp">
- <button label="Adicionar amigo" name="add_friend" tool_tip="Oferecer amizade ao residente"/>
- </layout_panel>
- <layout_panel name="im_btn_lp">
- <button label="MI" name="im" tool_tip="Abrir sessão de mensagem instantânea"/>
- </layout_panel>
- <layout_panel name="call_btn_lp">
- <button label="Ligar" name="call" tool_tip="Ligar para este residente"/>
- </layout_panel>
- <layout_panel name="chat_btn_lp">
- <button label="Teletransportar" name="teleport" tool_tip="Oferecer teletransporte"/>
- </layout_panel>
- <layout_panel name="overflow_btn_lp">
- <button label="▼" name="overflow_btn" tool_tip="Pagar ou compartilhar inventário com o residente"/>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- <layout_panel name="profile_me_buttons_panel">
- <button label="Editar perfil" name="edit_profile_btn" tool_tip="Editar dados pessoais"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_profile_view.xml b/indra/newview/skins/default/xui/pt/panel_profile_view.xml
deleted file mode 100644
index d3ec9b82bc..0000000000
--- a/indra/newview/skins/default/xui/pt/panel_profile_view.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_target_profile">
- <string name="status_online">
- Conectado
- </string>
- <string name="status_offline">
- Desconectado
- </string>
- <text name="display_name_label" value="Nome de tela:"/>
- <text name="solo_username_label" value="Nome de usuário:"/>
- <text name="status" value="Conectado"/>
- <text name="user_name_small" value="Jack oh look at me this is a super duper long name"/>
- <text name="user_name" value="Jack Linden"/>
- <button name="copy_to_clipboard" tool_tip="Copiar para área de transferência"/>
- <text name="user_label" value="Nome de usuário:"/>
- <text name="user_slid" value="jack.linden"/>
- <tab_container name="tabs">
- <panel label="PERFIL" name="panel_profile"/>
- <panel label="DESTAQUES" name="panel_picks"/>
- <panel label="ANOTAÇÕES E PRIVACIDADE" name="panel_notes"/>
- </tab_container>
-</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_region_environment.xml b/indra/newview/skins/default/xui/pt/panel_region_environment.xml
new file mode 100644
index 0000000000..79eedebe5f
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_region_environment.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Ambiente" name="panel_env_info">
+ <text name="water_settings_title">
+ Selecione as configurações de Ãgua e céu / Ciclo dos dias que todos os visitantes à sua região verão. Mais informações
+ </text>
+ <radio_group name="region_settings_radio_group">
+ <radio_item label="Usar o padrão do Second Life" name="use_sl_default_settings"/>
+ <radio_item label="Usar as seguintes configurações" name="use_my_settings"/>
+ </radio_group>
+ <panel name="user_environment_settings">
+ <text name="water_settings_title">
+ Configuração de água
+ </text>
+ <combo_box name="water_settings_preset_combo">
+ <combo_box.item label="-Selecione uma pré-configuração-" name="item0"/>
+ </combo_box>
+ <text name="sky_dayc_settings_title">
+ Ciclo céu / dia
+ </text>
+ <radio_group name="sky_dayc_settings_radio_group">
+ <radio_item label="Céu fixo" name="my_sky_settings"/>
+ <radio_item label="Ciclo dia" name="my_dayc_settings"/>
+ </radio_group>
+ <combo_box name="sky_settings_preset_combo">
+ <combo_box.item label="-Selecione uma pré-configuração-" name="item0"/>
+ </combo_box>
+ <combo_box name="dayc_settings_preset_combo">
+ <combo_box.item label="-Selecione uma pré-configuração-" name="item0"/>
+ </combo_box>
+ </panel>
+ <button label="Aplicar" name="apply_btn"/>
+ <button label="Cancelar" name="cancel_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_region_estate.xml b/indra/newview/skins/default/xui/pt/panel_region_estate.xml
index e5d394865c..6c5945aa15 100644
--- a/indra/newview/skins/default/xui/pt/panel_region_estate.xml
+++ b/indra/newview/skins/default/xui/pt/panel_region_estate.xml
@@ -23,10 +23,10 @@
<check_box label="Permitir acesso público" name="externally_visible_check"/>
<button label="?" name="externally_visible_help"/>
<text name="Only Allow">
- Restringir acesso a contas confirmardas por:
+ Permitir acesso apenas para residentes que:
</text>
- <check_box label="Dados de pagamento fornecidos" name="limit_payment" tool_tip="Banir residentes sem identificação."/>
- <check_box label="Verificação de idade" name="limit_age_verified" tool_tip="Banir residentes que não comprovaram a idade. Consulte o [SUPPORT_SITE] para saber mais."/>
+ <check_box label="Dados de pagamento constam no registro." name="limit_payment" tool_tip="Propriedade de acesso restrito a residentes que já cadastraram seus dados de pagamento Consulte o [SUPPORT_SITE] para saber mais."/>
+ <check_box label="A idade foi verificada" name="limit_age_verified" tool_tip="Residentes devem ter a idade verificada para acessar esta propriedade. Consulte o [SUPPORT_SITE] para saber mais."/>
<check_box label="Permitir conversa de voz" name="voice_chat_check"/>
<button label="?" name="voice_chat_help"/>
<check_box label="Permitir Tele-transporte direto" name="allow_direct_teleport"/>
diff --git a/indra/newview/skins/default/xui/pt/panel_region_general.xml b/indra/newview/skins/default/xui/pt/panel_region_general.xml
index e06f3c74bf..4be1cd11c0 100644
--- a/indra/newview/skins/default/xui/pt/panel_region_general.xml
+++ b/indra/newview/skins/default/xui/pt/panel_region_general.xml
@@ -25,6 +25,7 @@
<check_box label="Permitir revenda do terreno" name="allow_land_resell_check"/>
<check_box label="Permitir junção/divisão do terreno" name="allow_parcel_changes_check"/>
<check_box label="Bloquear exibição do terreno na busca" name="block_parcel_search_check" tool_tip="Permitir que as pessoas vejam esta região e seus lotes nos resultados de busca"/>
+ <check_box label="Permitir objetos mesh" name="mesh_rez_enabled_check" tool_tip="Permitir que que outras pessoas renderizem objectos mesh nessa região"/>
<spinner label="Limite do agente" name="agent_limit_spin"/>
<spinner label="Bônus de objetos" name="object_bonus_spin"/>
<text label="Maturidade" name="access_text">
diff --git a/indra/newview/skins/default/xui/pt/panel_region_terrain.xml b/indra/newview/skins/default/xui/pt/panel_region_terrain.xml
index b9b0e9d90f..74330a8946 100644
--- a/indra/newview/skins/default/xui/pt/panel_region_terrain.xml
+++ b/indra/newview/skins/default/xui/pt/panel_region_terrain.xml
@@ -7,21 +7,56 @@
nenhum
</text>
<spinner label="Altura da água" name="water_height_spin"/>
- <button label="?" name="water_height_help"/>
- <spinner label="Limite do aumento do &#10;terreno" name="terrain_raise_spin"/>
- <button label="?" name="terrain_raise_help"/>
- <spinner label="Limite mais baixo do &#10;terreno" name="terrain_lower_spin" bottom_delta="-34"/>
- <button label="?" name="terrain_lower_help"/>
- <check_box label="Usar o sol da propriedade" name="use_estate_sun_check"/>
- <button label="?" name="use_estate_sun_help"/>
- <check_box label="Sol fixo" name="fixed_sun_check"/>
- <button label="?" name="fixed_sun_help"/>
- <slider label="Fase" name="sun_hour_slider"/>
- <button label="Aplicar" name="apply_btn"/>
+ <spinner label="Limite do aumento do
+terreno" name="terrain_raise_spin"/>
+ <spinner bottom_delta="-34" label="Limite mais baixo do
+terreno" name="terrain_lower_spin"/>
+ <text name="detail_texture_text">
+ Texturas de terreno (exige arquivos .tga 512x512, 24 bit)
+ </text>
+ <text name="height_text_lbl">
+ 1 (Baixo)
+ </text>
+ <text name="height_text_lbl2">
+ 2
+ </text>
+ <text name="height_text_lbl3">
+ 3
+ </text>
+ <text name="height_text_lbl4">
+ 4 (Alto)
+ </text>
+ <text name="height_text_lbl5">
+ Intervalos de elevação de textura
+ </text>
+ <text name="height_text_lbl10">
+ Os valores representam o intervalo de mistura das texturas acima.
+ </text>
+ <text name="height_text_lbl11">
+ Em metros, o valor BAIXO é a altura MÃXIMA da Textura 1, e HIGH é a altura MÃNIMA da Textura 4.
+ </text>
+ <text name="height_text_lbl6">
+ Noroeste
+ </text>
+ <text name="height_text_lbl7">
+ Nordeste
+ </text>
+ <spinner label="Baixo" name="height_start_spin_1"/>
+ <spinner label="Baixo" name="height_start_spin_3"/>
+ <spinner label="Alto" name="height_range_spin_1"/>
+ <spinner label="Alto" name="height_range_spin_3"/>
+ <text name="height_text_lbl8">
+ Sudoeste
+ </text>
+ <text name="height_text_lbl9">
+ Sudeste
+ </text>
+ <spinner label="Baixo" name="height_start_spin_0"/>
+ <spinner label="Baixo" name="height_start_spin_2"/>
+ <spinner label="Alto" name="height_range_spin_0"/>
+ <spinner label="Alto" name="height_range_spin_2"/>
<button label="Download de terreno RAW..." name="download_raw_btn" tool_tip="Não disponível aos gerentes, somente aos proprietários."/>
- <button label="?" name="download_raw_help"/>
<button label="Upload de terreno RAW..." name="upload_raw_btn" tool_tip="Não disponível aos gerentes, somente aos proprietários."/>
- <button label="?" name="upload_raw_help"/>
- <button width="170" label="Nivelar o terreno" name="bake_terrain_btn" tool_tip="Ajustar terreno atual como o ponto médio para os limites de aumento/decréscimo"/>
- <button left="190" label="?" name="bake_terrain_help"/>
+ <button label="Nivelar o terreno" name="bake_terrain_btn" tool_tip="Ajustar terreno atual como o ponto médio para os limites de aumento/decréscimo" width="170"/>
+ <button label="Aplicar" name="apply_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_script_ed.xml b/indra/newview/skins/default/xui/pt/panel_script_ed.xml
index 6f022945c2..de02aafe2f 100644
--- a/indra/newview/skins/default/xui/pt/panel_script_ed.xml
+++ b/indra/newview/skins/default/xui/pt/panel_script_ed.xml
@@ -15,15 +15,15 @@
<panel.string name="Title">
Script: [NOME]
</panel.string>
- <text_editor name="Script Editor">
- Carregando...
- </text_editor>
- <button label="Salvar" label_selected="Salvar" name="Save_btn"/>
- <combo_box label="Inserir..." name="Insert..."/>
+ <panel.string name="external_editor_not_set">
+ Selecione um editor configurando a variável de ambiente LL_SCRIPT_EDITOR ou o ExternalEditor.
+ </panel.string>
<menu_bar name="script_menu">
<menu label="Arquivo" name="File">
<menu_item_call label="Salvar" name="Save"/>
<menu_item_call label="Reverter todas as alterações" name="Revert All Changes"/>
+ <menu_item_call label="Carregar do arquivo..." name="LoadFromFile"/>
+ <menu_item_call label="Salvar para o arquivo..." name="SaveToFile"/>
</menu>
<menu label="Editar" name="Edit">
<menu_item_call label="desfazer" name="Undo"/>
@@ -40,4 +40,10 @@
<menu_item_call label="ajuda palavra- chave..." name="Keyword Help..."/>
</menu>
</menu_bar>
+ <text_editor name="Script Editor">
+ Carregando...
+ </text_editor>
+ <combo_box label="Inserir..." name="Insert..."/>
+ <button label="Salvar" label_selected="Salvar" name="Save_btn"/>
+ <button label="Editar..." name="Edit_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_scrolling_param_base.xml b/indra/newview/skins/default/xui/pt/panel_scrolling_param_base.xml
new file mode 100644
index 0000000000..0a5a2e2572
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_scrolling_param_base.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="LLScrollingPanelParamBase">
+ <slider label="[DESC]:" name="param slider"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/pt/panel_snapshot_inventory.xml
new file mode 100644
index 0000000000..3c4bb18687
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_snapshot_inventory.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_inventory">
+ <text name="title">
+ Salvar no meu inventário
+ </text>
+ <text name="hint_lbl">
+ Salvar uma imagem em seu inventário custa L$[UPLOAD_COST]. Para salvar sua imagem como uma textura, selecione um dos formatos quadrados.
+ </text>
+ <combo_box label="Resolução" name="texture_size_combo">
+ <combo_box.item label="Janela atual" name="CurrentWindow"/>
+ <combo_box.item label="Pequeno (128x128)" name="Small(128x128)"/>
+ <combo_box.item label="Médio (256x256)" name="Medium(256x256)"/>
+ <combo_box.item label="Grande (512x512)" name="Large(512x512)"/>
+ <combo_box.item label="Customizado" name="Custom"/>
+ </combo_box>
+ <spinner label="Largura" name="inventory_snapshot_width"/>
+ <spinner label="Altura" name="inventory_snapshot_height"/>
+ <check_box label="Limitar proporções" name="inventory_keep_aspect_check"/>
+ <button label="Cancelar" name="cancel_btn"/>
+ <button label="Salvar" name="save_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_snapshot_local.xml b/indra/newview/skins/default/xui/pt/panel_snapshot_local.xml
new file mode 100644
index 0000000000..36b5b0cbe6
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_snapshot_local.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_local">
+ <text name="title">
+ Salvar no meu PC
+ </text>
+ <combo_box label="Resolução" name="local_size_combo">
+ <combo_box.item label="Janela atual" name="CurrentWindow"/>
+ <combo_box.item label="320x240" name="320x240"/>
+ <combo_box.item label="640x480" name="640x480"/>
+ <combo_box.item label="800x600" name="800x600"/>
+ <combo_box.item label="1024x768" name="1024x768"/>
+ <combo_box.item label="1280x1024" name="1280x1024"/>
+ <combo_box.item label="1600x1200" name="1600x1200"/>
+ <combo_box.item label="Customizado" name="Custom"/>
+ </combo_box>
+ <layout_stack name="local_image_params_ls">
+ <layout_panel name="local_image_size_lp">
+ <spinner label="Largura" name="local_snapshot_width"/>
+ <spinner label="Altura" name="local_snapshot_height"/>
+ <check_box label="Limitar proporções" name="local_keep_aspect_check"/>
+ </layout_panel>
+ <layout_panel name="local_image_format_quality_lp">
+ <combo_box label="Formato" name="local_format_combo">
+ <combo_box.item label="PNG (sem perda)" name="PNG"/>
+ <combo_box.item label="JPEG" name="JPEG"/>
+ <combo_box.item label="BMP (sem perda)" name="BMP"/>
+ </combo_box>
+ <slider label="Qualidade da imagem" name="image_quality_slider"/>
+ <text name="image_quality_level">
+ ([QLVL])
+ </text>
+ </layout_panel>
+ </layout_stack>
+ <button label="Cancelar" name="cancel_btn"/>
+ <flyout_button label="Salvar" name="save_btn" tool_tip="Salvar imagem em um arquivo">
+ <flyout_button.item label="Salvar" name="save_item"/>
+ <flyout_button.item label="Salvar como..." name="saveas_item"/>
+ </flyout_button>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_snapshot_options.xml b/indra/newview/skins/default/xui/pt/panel_snapshot_options.xml
new file mode 100644
index 0000000000..7f1452e992
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_snapshot_options.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_options">
+ <button label="Postar no feed do meu perfil" name="save_to_profile_btn"/>
+ <button label="E-mail" name="save_to_email_btn"/>
+ <button label="Salvar em Meu inventário (L$[AMOUNT])" name="save_to_inventory_btn"/>
+ <button label="Salvar no meu PC" name="save_to_computer_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_snapshot_postcard.xml b/indra/newview/skins/default/xui/pt/panel_snapshot_postcard.xml
new file mode 100644
index 0000000000..12a648f600
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_snapshot_postcard.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_postcard">
+ <string name="default_subject">
+ Postal do [SECOND_LIFE].
+ </string>
+ <string name="default_message">
+ Confira!
+ </string>
+ <string name="upload_message">
+ Enviando...
+ </string>
+ <text name="title">
+ E-mail
+ </text>
+ <button label="Mensagem" name="message_btn"/>
+ <button label="Configurações" name="settings_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_snapshot_profile.xml b/indra/newview/skins/default/xui/pt/panel_snapshot_profile.xml
new file mode 100644
index 0000000000..095b8fc75d
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_snapshot_profile.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_profile">
+ <text name="title">
+ Postar no feed do meu perfil
+ </text>
+ <combo_box label="Resolução" name="profile_size_combo">
+ <combo_box.item label="Janela atual" name="CurrentWindow"/>
+ <combo_box.item label="640x480" name="640x480"/>
+ <combo_box.item label="800x600" name="800x600"/>
+ <combo_box.item label="1024x768" name="1024x768"/>
+ <combo_box.item label="Customizado" name="Custom"/>
+ </combo_box>
+ <layout_stack name="profile_image_params_ls">
+ <layout_panel name="profile_image_size_lp">
+ <spinner label="Largura" name="profile_snapshot_width"/>
+ <spinner label="Altura" name="profile_snapshot_height"/>
+ <check_box label="Limitar proporções" name="profile_keep_aspect_check"/>
+ </layout_panel>
+ <layout_panel name="profile_image_metadata_lp">
+ <text name="caption_label">
+ Legenda:
+ </text>
+ <check_box initial_value="true" label="Incluir local" name="add_location_cb"/>
+ </layout_panel>
+ </layout_stack>
+ <button label="Cancelar" name="cancel_btn"/>
+ <button label="Postar" name="post_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_sound_devices.xml b/indra/newview/skins/default/xui/pt/panel_sound_devices.xml
new file mode 100644
index 0000000000..66db89f48f
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_sound_devices.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<panel label="Configuração de dispositivos" name="device_settings_panel">
+ <panel.string name="default_text">
+ Padrão
+ </panel.string>
+ <string name="name_no_device">
+ Nenhum
+ </string>
+ <string name="name_default_system_device">
+ Dispositivo padrão do sistema
+ </string>
+ <text name="Input">
+ Entrada
+ </text>
+ <text name="Output">
+ Saída
+ </text>
+ <text name="My volume label">
+ Meu volume:
+ </text>
+ <slider_bar initial_value="1.0" name="mic_volume_slider" tool_tip="Mude o volume usando o controle deslizante"/>
+ <text name="wait_text">
+ Aguarde
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_status_bar.xml b/indra/newview/skins/default/xui/pt/panel_status_bar.xml
index fbbcf0d1be..cb9a6eb757 100644
--- a/indra/newview/skins/default/xui/pt/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/pt/panel_status_bar.xml
@@ -1,11 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="status">
- <panel.string name="StatBarDaysOfWeek">
- Domingo:Segunda-feira:Terça-feira:Quarta-feira:Quinta-feira:Sexta-feira:Sábado
- </panel.string>
- <panel.string name="StatBarMonthsOfYear">
- Janeiro:Fevereiro:Março:Abril:Maio:Junho:Julho:Agosto:Setembro:Outubro:Novembro:Dezembro
- </panel.string>
<panel.string name="packet_loss_tooltip">
Perda de pacote
</panel.string>
@@ -21,9 +15,10 @@
<panel.string name="buycurrencylabel">
L$ [AMT]
</panel.string>
- <panel name="balance_bg">
- <text name="balance" tool_tip="Meu saldo" value="L$20"/>
+ <panel left="-410" name="balance_bg" width="200">
+ <text name="balance" tool_tip="Atualizar saldo de L$" value="L$20"/>
<button label="Comprar L$" name="buyL" tool_tip="Comprar mais L$"/>
+ <button label="Comprar" name="goShop" tool_tip="Abrir Mercado do Second Life" width="80"/>
</panel>
<text name="TimeText" tool_tip="Hora atual (Pacífico)">
24:00 AM PST
diff --git a/indra/newview/skins/default/xui/pt/sidepanel_inventory.xml b/indra/newview/skins/default/xui/pt/sidepanel_inventory.xml
index 11ac6c106a..7908ea5f3a 100644
--- a/indra/newview/skins/default/xui/pt/sidepanel_inventory.xml
+++ b/indra/newview/skins/default/xui/pt/sidepanel_inventory.xml
@@ -1,6 +1,27 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Coisas" name="objects panel">
<panel label="" name="sidepanel__inventory_panel">
+ <layout_stack name="inventory_layout_stack">
+ <layout_panel name="inbox_layout_panel">
+ <panel label="" name="marketplace_inbox">
+ <string name="InboxLabelWithArg">
+ Itens recebidos ([NUM])
+ </string>
+ <string name="InboxLabelNoArg">
+ Itens recebidos
+ </string>
+ <button label="Itens recebidos" name="inbox_btn"/>
+ <text name="inbox_fresh_new_count">
+ [NUM] novo(s)
+ </text>
+ <panel name="inbox_inventory_placeholder_panel" tool_tip="Arraste e solte itens para o seu inventário para usá-los">
+ <text name="inbox_inventory_placeholder">
+ As compras do marketplace serão entregues aqui.
+ </text>
+ </panel>
+ </panel>
+ </layout_panel>
+ </layout_stack>
<panel name="button_panel">
<layout_stack name="button_panel_ls">
<layout_panel name="info_btn_lp">
diff --git a/indra/newview/skins/default/xui/pt/sidepanel_task_info.xml b/indra/newview/skins/default/xui/pt/sidepanel_task_info.xml
index dd65810b22..8092e6c145 100644
--- a/indra/newview/skins/default/xui/pt/sidepanel_task_info.xml
+++ b/indra/newview/skins/default/xui/pt/sidepanel_task_info.xml
@@ -48,15 +48,9 @@
<text name="CreatorNameLabel">
Criador:
</text>
- <text name="Creator Name">
- Erica Linden
- </text>
<text name="Owner:">
Proprietário:
</text>
- <text name="Owner Name">
- Erica Linden
- </text>
<text name="Group_label">
Grupo:
</text>
diff --git a/indra/newview/skins/default/xui/pt/strings.xml b/indra/newview/skins/default/xui/pt/strings.xml
index 59c6c8f080..342a52356b 100644
--- a/indra/newview/skins/default/xui/pt/strings.xml
+++ b/indra/newview/skins/default/xui/pt/strings.xml
@@ -25,12 +25,18 @@
<string name="StartupInitializingVFS">
Iniciando VFS...
</string>
+ <string name="StartupRequireDriverUpdate">
+ Falha na inicialização dos gráficos. Atualize seu driver gráfico!
+ </string>
<string name="ProgressRestoring">
Restaurando...
</string>
<string name="ProgressChangingResolution">
Alterando a resolução...
</string>
+ <string name="Fullbright">
+ Fullbright (antigo)
+ </string>
<string name="LoginInProgress">
Fazendo login. [APP_NAME] pode parecer congelado. Por favor, aguarde.
</string>
@@ -79,6 +85,12 @@
<string name="LoginQuicktimeOK">
O QuickTime foi inicializado com sucesso.
</string>
+ <string name="LoginRequestSeedCapGrant">
+ Solicitando recursos da região...
+ </string>
+ <string name="LoginRetrySeedCapGrant">
+ Solicitando recursos da região, tentativa [NUMBER]...
+ </string>
<string name="LoginWaitingForRegionHandshake">
Aguardando handshake com a região...
</string>
@@ -107,7 +119,7 @@
A assinatura do certificado dado pelo servidor do Grid não pôde ser verificada. Contate o administrador do seu Grid.
</string>
<string name="LoginFailedNoNetwork">
- Erro de rede: Não foi possível estabelecer a conexão, verifique sua conexão de rede.
+ Erro de rede: Falha de conexão: verifique sua conexão à internet.
</string>
<string name="LoginFailed">
Falha do login.
@@ -118,6 +130,100 @@
<string name="create_account_url">
http://join.secondlife.com/index.php?lang=pt-BR
</string>
+ <string name="LoginFailedViewerNotPermitted">
+ O visualizador utilizado já não é compatível com o Second Life. Visite a página abaixo para baixar uma versão atual: http://secondlife.com/download
+
+Para saber mais, visite as perguntas frequentes abaixo: http://secondlife.com/viewer-access-faq
+ </string>
+ <string name="LoginIntermediateOptionalUpdateAvailable">
+ Existe uma versão atualizada do seu visualizador: [VERSION]
+ </string>
+ <string name="LoginFailedRequiredUpdate">
+ Atualização de visualizador obrigatória: [VERSION]
+ </string>
+ <string name="LoginFailedAlreadyLoggedIn">
+ Este agente já fez login.
+ </string>
+ <string name="LoginFailedAuthenticationFailed">
+ Desculpe! Não foi possível fazer seu login. Verifique se digitou o nome de usuário correto* (como kiki45 ou astro.física) * e senha. Verifique também que a tecla Maiúscula está desativada.
+ </string>
+ <string name="LoginFailedPasswordChanged">
+ Como medida de precaução, sua senha foi alterada. Visite sua conta em http://secondlife.com/password e responda a pergunta de segurança para mudar sua senha. Lamentamos qualquer inconveniente.
+ </string>
+ <string name="LoginFailedPasswordReset">
+ Fizemos algumas alterações a seu sistema. Você precisa selecionar outra senha. Visite sua conta em http://secondlife.com/password e responda a pergunta de segurança para mudar sua senha. Lamentamos qualquer inconveniente.
+ </string>
+ <string name="LoginFailedEmployeesOnly">
+ O Second Life está fechado para manutenção no momento. Somente funcionários podem acessá-lo. Consulte www.secondlife.com/status para as últimas atualizações.
+ </string>
+ <string name="LoginFailedPremiumOnly">
+ Logons do Second Life estão temporariamente restritos para garantir a melhor experiência possível para os usuários no mundo virtual.
+
+Pessoas com contas gratuitas não poderão acessar o Second Life no momento para dar espaço para aquelas que pagaram pelo Second Life.
+ </string>
+ <string name="LoginFailedComputerProhibited">
+ O Second Life não pode ser acessado deste computador. Se você acredita que houve algum equívoco, contate support@secondlife.com.
+ </string>
+ <string name="LoginFailedAcountSuspended">
+ Sua conta não está disponível para acesso até [TIME], horário do Pacífico nos EUA (GMT-08).
+ </string>
+ <string name="LoginFailedAccountDisabled">
+ Não é possível concluir a solicitação neste momento. Para obter mais ajuda, conte o suporte em http://secondlife.com/support. Caso você não possa mudar sua senha, ligue para (866) 476-9763.
+ </string>
+ <string name="LoginFailedTransformError">
+ Dados discrepantes detectados durante o login. Contate support@secondlife.com.
+ </string>
+ <string name="LoginFailedAccountMaintenance">
+ Sua conta está passando por um breve período de manutenção. Sua conta não está disponível para acesso até [TIME], horário do Pacífico nos EUA (GMT-08). Se você acredita que houve algum equívoco, contate support@secondlife.com.
+ </string>
+ <string name="LoginFailedPendingLogoutFault">
+ Reação à solicitação de saída foi uma falha do simulador.
+ </string>
+ <string name="LoginFailedPendingLogout">
+ O sistema está passando para o modo offline. Sua conta não está disponível para acesso até [TIME], horário do Pacífico nos EUA (GMT-08).
+ </string>
+ <string name="LoginFailedUnableToCreateSession">
+ Impossível criar sessão válida.
+ </string>
+ <string name="LoginFailedUnableToConnectToSimulator">
+ Não foi possível conectar o simulador.
+ </string>
+ <string name="LoginFailedRestrictedHours">
+ Sua conta possui acesso ao Second Life das [START] às [END], horário da costa leste dos EUA. Volte novamente durante seu horário de acesso. Se você acredita que houve algum equívoco, contate support@secondlife.com.
+ </string>
+ <string name="LoginFailedIncorrectParameters">
+ Parâmetros incorretos. Se você acredita que houve algum equívoco, contate support@secondlife.com.
+ </string>
+ <string name="LoginFailedFirstNameNotAlphanumeric">
+ O parâmetro de primeiro nome deve ser alfanumérico. Se você acredita que houve algum equívoco, contate support@secondlife.com.
+ </string>
+ <string name="LoginFailedLastNameNotAlphanumeric">
+ O parâmetro de sobrenome deve ser alfanumérico. Se você acredita que houve algum equívoco, contate support@secondlife.com.
+ </string>
+ <string name="LogoutFailedRegionGoingOffline">
+ Região passando para modo offline. Tente novamente dentro de alguns instantes.
+ </string>
+ <string name="LogoutFailedAgentNotInRegion">
+ Não há agente na região. Tente novamente dentro de alguns instantes.
+ </string>
+ <string name="LogoutFailedPendingLogin">
+ A região estava acessada por outra sessão. Tente novamente dentro de alguns instantes.
+ </string>
+ <string name="LogoutFailedLoggingOut">
+ A região estava passando para o modo offline na sessão anterior. Tente novamente dentro de alguns instantes.
+ </string>
+ <string name="LogoutFailedStillLoggingOut">
+ A região estava passando para o modo offline na sessão anterior. Tente novamente dentro de alguns instantes.
+ </string>
+ <string name="LogoutSucceeded">
+ A região passou para o modo offline na última sessão. Tente novamente dentro de alguns instantes.
+ </string>
+ <string name="LogoutFailedLogoutBegun">
+ A região inicou o modo offline. Tente novamente dentro de alguns instantes.
+ </string>
+ <string name="LoginFailedLoggingOutSession">
+ O sistema iniciou o modo offline em sua sessão anterior. Tente novamente dentro de alguns instantes.
+ </string>
<string name="AgentLostConnection">
Esta região pode estar passando por problemas. Por favor, verifique sua conexão com a internet.
</string>
@@ -185,6 +291,36 @@
Apenas um item único pode ser arrastado para este local
</string>
<string name="TooltipPrice" value="L$[AMOUNT]"/>
+ <string name="TooltipOutboxDragToWorld">
+ Não é possível fazer rez do itens em sua caixa de saída do lojista
+ </string>
+ <string name="TooltipOutboxNoTransfer">
+ Um ou mais destes objetos não podem ser vendidos ou transferidos.
+ </string>
+ <string name="TooltipOutboxNotInInventory">
+ Sua caixa de saída do lojista aceita apenas itens direto do seu inventário
+ </string>
+ <string name="TooltipOutboxWorn">
+ Você não pode colocar os itens que está vestindo na sua caixa de saída do lojista
+ </string>
+ <string name="TooltipOutboxCallingCard">
+ Não é possível colocar cartões de visita em sua caixa de saída do lojista
+ </string>
+ <string name="TooltipOutboxFolderLevels">
+ A profundidade das pastas aninhadas excede 3
+ </string>
+ <string name="TooltipOutboxTooManyFolders">
+ A contagem de subpastas na pasta de nível superior excede 20
+ </string>
+ <string name="TooltipOutboxTooManyObjects">
+ A contagem de itens na pasta de nível superior excede 200
+ </string>
+ <string name="TooltipDragOntoOwnChild">
+ Não é possível mover uma pasta para seu filho
+ </string>
+ <string name="TooltipDragOntoSelf">
+ Não é possível mover uma pasta para dentro dela mesma
+ </string>
<string name="TooltipHttpUrl">
Clique para ver a página web
</string>
@@ -426,6 +562,12 @@
<string name="symbolic folder link">
link da pasta
</string>
+ <string name="mesh">
+ mesh
+ </string>
+ <string name="AvatarEditingAppearance">
+ (Edição Aparência)
+ </string>
<string name="AvatarAway">
Distante
</string>
@@ -642,6 +784,9 @@
<string name="anim_yes_head">
Sim
</string>
+ <string name="multiple_textures">
+ Múltiplo
+ </string>
<string name="texture_loading">
Carregando...
</string>
@@ -798,6 +943,9 @@
<string name="choose_the_directory">
Selecionar pasta
</string>
+ <string name="script_files">
+ Scripts
+ </string>
<string name="AvatarSetNotAway">
deixar como ausente
</string>
@@ -855,6 +1003,9 @@
<string name="tattoo">
Tatuagem
</string>
+ <string name="physics">
+ Físico
+ </string>
<string name="invalid">
Inválido
</string>
@@ -894,6 +1045,9 @@
<string name="tattoo_not_worn">
Tatuagem não usada
</string>
+ <string name="physics_not_worn">
+ Físico não usado
+ </string>
<string name="invalid_not_worn">
inválido
</string>
@@ -942,6 +1096,9 @@
<string name="create_new_tattoo">
Criar nova tatuagem
</string>
+ <string name="create_new_physics">
+ Criar novo físico
+ </string>
<string name="create_new_invalid">
inválido
</string>
@@ -1026,6 +1183,65 @@
<string name="InventoryNoTexture">
Você não possui uma cópia desta textura no seu inventário
</string>
+ <string name="InventoryInboxNoItems">
+ Suas compras do Marketplace aparecerão aqui. Depois, você poderá arrastá-las para seu inventário para usá-las.
+ </string>
+ <string name="MarketplaceURL">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/
+ </string>
+ <string name="MarketplaceURL_CreateStore">
+ http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.4
+ </string>
+ <string name="MarketplaceURL_Dashboard">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard
+ </string>
+ <string name="MarketplaceURL_Imports">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports
+ </string>
+ <string name="MarketplaceURL_LearnMore">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more
+ </string>
+ <string name="InventoryOutboxNotMerchantTitle">
+ Qualquer um pode vender itens no Mercado.
+ </string>
+ <string name="InventoryOutboxNotMerchantTooltip"/>
+ <string name="InventoryOutboxNotMerchant">
+ Se você deseja se tornar um lojista, precisará [[MARKETPLACE_CREATE_STORE_URL] criar uma loja no Mercado].
+ </string>
+ <string name="InventoryOutboxNoItemsTitle">
+ Sua caixa de saída está vazia
+ </string>
+ <string name="InventoryOutboxNoItemsTooltip"/>
+ <string name="InventoryOutboxNoItems">
+ Arraste as pastas para estas áreas e então clique em &quot;Enviar para Mercado&quot; para listar os itens para venda no [[MARKETPLACE_DASHBOARD_URL] Mercado].
+ </string>
+ <string name="Marketplace Error None">
+ Sem erros
+ </string>
+ <string name="Marketplace Error Not Merchant">
+ Erro: antes de enviar os itens para o Mercado, é necessário que você se defina como um lojista (sem custos).
+ </string>
+ <string name="Marketplace Error Empty Folder">
+ Erro: esta pasta está vazia.
+ </string>
+ <string name="Marketplace Error Unassociated Products">
+ Erro: ocorreu uma falha ao enviar este item, pois sua conta de lojista tem muitos itens não associados a produtos. Para corrigir esse erro, faça o login no site do mercado e reduza a contagem de itens não associados.
+ </string>
+ <string name="Marketplace Error Object Limit">
+ Erro: este item contém muitos objetos. Corrija esse erro unindo os objetos em caixa para reduzir a contagem total a menos de 200.
+ </string>
+ <string name="Marketplace Error Folder Depth">
+ Erro: este item contém muitos níveis de pastas aninhadas. Reorganize-o em até 3 níveis de pastas aninhadas, no máximo.
+ </string>
+ <string name="Marketplace Error Unsellable Item">
+ Erro: este item não pode ser vendido no mercado.
+ </string>
+ <string name="Marketplace Error Internal Import">
+ Erro: ocorreu um problema com este item. Tente novamente mais tarde.
+ </string>
+ <string name="Open landmarks">
+ Marcos abertos
+ </string>
<string name="no_transfer" value="(não transferível)"/>
<string name="no_modify" value="(não modificável)"/>
<string name="no_copy" value="(não copiável)"/>
@@ -1040,7 +1256,7 @@
</string>
<string name="WornOnAttachmentPoint" value="(vestido em [ATTACHMENT_POINT])"/>
<string name="ActiveGesture" value="[GESLABEL] (ativado)"/>
- <string name="Chat" value="Bate papo"/>
+ <string name="Chat Message" value="Bate-papo:"/>
<string name="Sound" value="Som"/>
<string name="Wait" value="--- Aguarde"/>
<string name="AnimFlagStop" value="Parar animação"/>
@@ -1066,9 +1282,6 @@
<string name="InvFolder My Inventory">
Meu inventário
</string>
- <string name="InvFolder My Favorites">
- Meus favoritos
- </string>
<string name="InvFolder Library">
Biblioteca
</string>
@@ -1127,10 +1340,10 @@
Gestos
</string>
<string name="InvFolder Favorite">
- Favoritos
+ Meus favoritos
</string>
<string name="InvFolder favorite">
- Favoritos
+ Meus favoritos
</string>
<string name="InvFolder Current Outfit">
Look atual
@@ -1144,12 +1357,21 @@
<string name="InvFolder Accessories">
Acessórios
</string>
+ <string name="InvFolder Meshes">
+ Meshes:
+ </string>
<string name="InvFolder Friends">
Amigos
</string>
<string name="InvFolder All">
Tudo
</string>
+ <string name="no_attachments">
+ Nenhum anexo vestido
+ </string>
+ <string name="Attachments remain">
+ Anexos ([COUNT] slots permanecem)
+ </string>
<string name="Buy">
Comprar
</string>
@@ -1276,6 +1498,12 @@
<string name="Right Pec">
Peitoral D
</string>
+ <string name="Neck">
+ Pescoço
+ </string>
+ <string name="Avatar Center">
+ Centro do avatar
+ </string>
<string name="Invalid Attachment">
Ponto de encaixe inválido
</string>
@@ -1457,8 +1685,11 @@
<string name="Unknown">
(Desconhecido)
</string>
- <string name="SummaryForTheWeek" value="Resumo para esta semana, com início em"/>
- <string name="NextStipendDay" value="Próximo dia de salário é"/>
+ <string name="SummaryForTheWeek" value="Resumo para esta semana, com início em "/>
+ <string name="NextStipendDay" value=". Próximo dia de salário é "/>
+ <string name="GroupPlanningDate">
+ [mthnum,datetime,utc]/[day,datetime,utc]/[year,datetime,utc]
+ </string>
<string name="GroupIndividualShare" value="Grupo Divisão individualI"/>
<string name="GroupColumn" value="Grupo"/>
<string name="Balance">
@@ -1485,6 +1716,9 @@
<string name="IMTeen">
adolescente
</string>
+ <string name="Anyone">
+ qualquer um
+ </string>
<string name="RegionInfoError">
erro
</string>
@@ -1692,7 +1926,7 @@
<string name="RegionNoCovenantOtherOwner">
Não foi definido um contrato para essa Região. O terreno nesta região está sendo vendido pelo Proprietário, não pela Linden Lab. Favor contatar o Proprietário da região para detalhes de venda.
</string>
- <string name="covenant_last_modified" value="Última modificação:"/>
+ <string name="covenant_last_modified" value="Última modificação: "/>
<string name="none_text" value="(nenhum)"/>
<string name="never_text" value="(nunca)"/>
<string name="GroupOwned">
@@ -1701,6 +1935,12 @@
<string name="Public">
Público
</string>
+ <string name="LocalSettings">
+ Configurações locais
+ </string>
+ <string name="RegionSettings">
+ Configurações da região
+ </string>
<string name="ClassifiedClicksTxt">
Cliques: [TELEPORT] teletransporte, [MAP] mapa, [PROFILE] perfil
</string>
@@ -1740,11 +1980,8 @@
<string name="InvOfferGaveYou">
deu a você
</string>
- <string name="InvOfferYouDecline">
- Você recusa
- </string>
- <string name="InvOfferFrom">
- de
+ <string name="InvOfferDecline">
+ Você recusou um(a) [DESC] de &lt;nolink&gt;[NAME]&lt;/nolink&gt;.
</string>
<string name="GroupMoneyTotal">
Total
@@ -1776,6 +2013,9 @@
<string name="GroupMoneyDebits">
Débitos
</string>
+ <string name="GroupMoneyDate">
+ [weekday,datetime,utc] [mth,datetime,utc] [day,datetime,utc], [year,datetime,utc]
+ </string>
<string name="ViewerObjectContents">
Conteúdo
</string>
@@ -1825,12 +2065,6 @@ Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
<string name="accel-win-shift">
Shift+
</string>
- <string name="Esc">
- Esc
- </string>
- <string name="Home">
- Início
- </string>
<string name="FileSaved">
Arquivo salvo
</string>
@@ -1849,35 +2083,35 @@ Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
<string name="PDT">
PDT
</string>
- <string name="Forward">
- Avante
+ <string name="Direction_Forward">
+ Frente
</string>
- <string name="Left">
+ <string name="Direction_Left">
Esquerda
</string>
- <string name="Right">
+ <string name="Direction_Right">
Direita
</string>
- <string name="Back">
+ <string name="Direction_Back">
Atrás
</string>
- <string name="North">
+ <string name="Direction_North">
Norte
</string>
- <string name="South">
+ <string name="Direction_South">
Sul
</string>
- <string name="West">
+ <string name="Direction_West">
Oeste
</string>
- <string name="East">
+ <string name="Direction_East">
Leste
</string>
- <string name="Up">
- Acima
+ <string name="Direction_Up">
+ P/ cima
</string>
- <string name="Down">
- Abaixo
+ <string name="Direction_Down">
+ P/ baixo
</string>
<string name="Any Category">
Qualquer categoria
@@ -1948,6 +2182,9 @@ Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
<string name="Other">
Outros
</string>
+ <string name="Rental">
+ Aluguel
+ </string>
<string name="Any">
Qualquer
</string>
@@ -2183,6 +2420,114 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="Bulbous Nose">
Nariz em bulbo
</string>
+ <string name="Breast Physics Mass">
+ Seios - massa
+ </string>
+ <string name="Breast Physics Smoothing">
+ Seios - suavização
+ </string>
+ <string name="Breast Physics Gravity">
+ Seios - gravidade
+ </string>
+ <string name="Breast Physics Drag">
+ Seios - resistência do ar
+ </string>
+ <string name="Breast Physics InOut Max Effect">
+ Efeito máximo
+ </string>
+ <string name="Breast Physics InOut Spring">
+ Vibração
+ </string>
+ <string name="Breast Physics InOut Gain">
+ Ganho
+ </string>
+ <string name="Breast Physics InOut Damping">
+ Duração
+ </string>
+ <string name="Breast Physics UpDown Max Effect">
+ Efeito máximo
+ </string>
+ <string name="Breast Physics UpDown Spring">
+ Vibração
+ </string>
+ <string name="Breast Physics UpDown Gain">
+ Ganho
+ </string>
+ <string name="Breast Physics UpDown Damping">
+ Duração
+ </string>
+ <string name="Breast Physics LeftRight Max Effect">
+ Efeito máximo
+ </string>
+ <string name="Breast Physics LeftRight Spring">
+ Vibração
+ </string>
+ <string name="Breast Physics LeftRight Gain">
+ Ganho
+ </string>
+ <string name="Breast Physics LeftRight Damping">
+ Duração
+ </string>
+ <string name="Belly Physics Mass">
+ Barriga - massa
+ </string>
+ <string name="Belly Physics Smoothing">
+ Barriga - suavização
+ </string>
+ <string name="Belly Physics Gravity">
+ Barriga - gravidade
+ </string>
+ <string name="Belly Physics Drag">
+ Barriga - resistência do ar
+ </string>
+ <string name="Belly Physics UpDown Max Effect">
+ Efeito máximo
+ </string>
+ <string name="Belly Physics UpDown Spring">
+ Vibração
+ </string>
+ <string name="Belly Physics UpDown Gain">
+ Ganho
+ </string>
+ <string name="Belly Physics UpDown Damping">
+ Duração
+ </string>
+ <string name="Butt Physics Mass">
+ Nádegas - massa
+ </string>
+ <string name="Butt Physics Smoothing">
+ Nádegas - suavização
+ </string>
+ <string name="Butt Physics Gravity">
+ Nádegas - gravidade
+ </string>
+ <string name="Butt Physics Drag">
+ Nádegas - resistência do ar
+ </string>
+ <string name="Butt Physics UpDown Max Effect">
+ Efeito máximo
+ </string>
+ <string name="Butt Physics UpDown Spring">
+ Vibração
+ </string>
+ <string name="Butt Physics UpDown Gain">
+ Ganho
+ </string>
+ <string name="Butt Physics UpDown Damping">
+ Duração
+ </string>
+ <string name="Butt Physics LeftRight Max Effect">
+ Efeito máximo
+ </string>
+ <string name="Butt Physics LeftRight Spring">
+ Vibração
+ </string>
+ <string name="Butt Physics LeftRight Gain">
+ Ganho
+ </string>
+ <string name="Butt Physics LeftRight Damping">
+ Duração
+ </string>
<string name="Bushy Eyebrows">
Sobrancelhas grossas
</string>
@@ -2192,6 +2537,9 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="Butt Size">
Tamanho do traseiro
</string>
+ <string name="Butt Gravity">
+ Nádegas - gravidade
+ </string>
<string name="bustle skirt">
Saia armada
</string>
@@ -3383,6 +3731,9 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="LocationCtrlGeneralIconTooltip">
Região em geral
</string>
+ <string name="LocationCtrlSeeAVsTooltip">
+ Avatar visíveis e bate-papo permitido fora deste terreno
+ </string>
<string name="UpdaterWindowTitle">
[APP_NAME] Atualização
</string>
@@ -3449,6 +3800,9 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="Saved_message">
(Salvo em [LONG_TIMESTAMP])
</string>
+ <string name="IM_unblock_only_groups_friends">
+ Para visualizar esta mensagem, você deve desmarcar &quot;Apenas amigos e grupos podem me ligar ou enviar MIs&quot; em Preferências/Privacidade.
+ </string>
<string name="answered_call">
Ligação atendida
</string>
@@ -3473,6 +3827,9 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="conference-title-incoming">
Conversa com [AGENT_NAME]
</string>
+ <string name="inventory_item_offered-im">
+ Oferta de item de inventário
+ </string>
<string name="no_session_message">
(Sessão de MI inexistente)
</string>
@@ -3545,6 +3902,9 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="session_initialization_timed_out_error">
A inicialização da sessão expirou
</string>
+ <string name="Home position set.">
+ Posição inicial definida.
+ </string>
<string name="voice_morphing_url">
http://secondlife.com/landing/voicemorphing
</string>
@@ -3555,16 +3915,28 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
[NAME] lhe pagou L$ [AMOUNT]
</string>
<string name="you_paid_ldollars">
- You pagou L$[AMOUNT] por [REASON] a [NAME].
+ Você pagou L$[AMOUNT] por [REASON] a [NAME].
</string>
<string name="you_paid_ldollars_no_info">
Você acaba de pagar L$[AMOUNT].
</string>
<string name="you_paid_ldollars_no_reason">
- You pagou L$[AMOUNT] a [NAME].
+ Você pagou L$[AMOUNT] a [NAME].
</string>
<string name="you_paid_ldollars_no_name">
- You pagou L$[AMOUNT] por [REASON].
+ Você pagou L$[AMOUNT] por [REASON].
+ </string>
+ <string name="you_paid_failure_ldollars">
+ Você não pagou L$[AMOUNT] a [NAME] referentes a [REASON].
+ </string>
+ <string name="you_paid_failure_ldollars_no_info">
+ Você não pagou L$[AMOUNT].
+ </string>
+ <string name="you_paid_failure_ldollars_no_reason">
+ Você não pagou L$[AMOUNT] a [NAME].
+ </string>
+ <string name="you_paid_failure_ldollars_no_name">
+ Você não pagou L$[AMOUNT] referentes a [REASON].
</string>
<string name="for item">
por [ITEM]
@@ -3619,7 +3991,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
</string>
<string name="uploading_abuse_report">
Carregando...
-
+
Denunciar abuso
</string>
<string name="New Shape">
@@ -3667,6 +4039,9 @@ Denunciar abuso
<string name="New Tattoo">
Nova tatuagem
</string>
+ <string name="New Physics">
+ Novo físico
+ </string>
<string name="Invalid Wearable">
Item inválido
</string>
@@ -3790,6 +4165,87 @@ Denunciar abuso
<string name="Female - Wow">
Wow - feminino
</string>
+ <string name="/bow">
+ /reverência
+ </string>
+ <string name="/clap">
+ /palmas
+ </string>
+ <string name="/count">
+ /contar
+ </string>
+ <string name="/extinguish">
+ /apagar
+ </string>
+ <string name="/kmb">
+ /dane_se
+ </string>
+ <string name="/muscle">
+ /músculos
+ </string>
+ <string name="/no">
+ /não
+ </string>
+ <string name="/no!">
+ /não!
+ </string>
+ <string name="/paper">
+ /papel
+ </string>
+ <string name="/pointme">
+ /apontar_eu
+ </string>
+ <string name="/pointyou">
+ /apontar_você
+ </string>
+ <string name="/rock">
+ /pedra
+ </string>
+ <string name="/scissor">
+ /tesoura
+ </string>
+ <string name="/smoke">
+ /fumar
+ </string>
+ <string name="/stretch">
+ /alongar
+ </string>
+ <string name="/whistle">
+ /assobiar
+ </string>
+ <string name="/yes">
+ /sim
+ </string>
+ <string name="/yes!">
+ /sim!
+ </string>
+ <string name="afk">
+ ldt
+ </string>
+ <string name="dance1">
+ dança1
+ </string>
+ <string name="dance2">
+ dança2
+ </string>
+ <string name="dance3">
+ dança3
+ </string>
+ <string name="dance4">
+ dança4
+ </string>
+ <string name="dance5">
+ dança5
+ </string>
+ <string name="dance6">
+ dança6
+ </string>
+ <string name="dance7">
+ dança7
+ </string>
+ <string name="dance8">
+ dança8
+ </string>
<string name="AvatarBirthDateFormat">
[mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt]
</string>
@@ -3801,10 +4257,10 @@ Denunciar abuso
</string>
<string name="words_separator" value=","/>
<string name="server_is_down">
- Aconteceu algo inesperado, apesar de termos tentador impedir isso.
+ Aconteceu algo inesperado, apesar de termos tentado impedir isso.
- Cheque secondlifegrid.net para saber se foi detectado um problema com o serviço.
- Se o problema persisitr, cheque a configuração da sua rede e firewall.
+ Cheque secondlifegrid.net para saber se foi detectado um problema com o serviço.
+ Se o problema persistir, cheque a configuração da sua rede e firewall.
</string>
<string name="dateTimeWeekdaysNames">
Domingo:Segunda:Terça:Quarta:Quinta:Sexta:Sábado
@@ -3866,7 +4322,7 @@ Denunciar abuso
<string name="Notices">
Avisos
</string>
- <string name="Chat">
+ <string name="Chat" value="Bate papo">
Bate-papo
</string>
<string name="DeleteItems">
@@ -3878,4 +4334,552 @@ Denunciar abuso
<string name="EmptyOutfitText">
Este look não possui nenhuma peça
</string>
+ <string name="ExternalEditorNotSet">
+ Selecione um editor utilizando a configuração ExternalEditor.
+ </string>
+ <string name="ExternalEditorNotFound">
+ O editor externo especificado não foi localizado.
+Tente colocar o caminho do editor entre aspas.
+(ex. &quot;/caminho para/editor&quot; &quot;%s&quot;)
+ </string>
+ <string name="ExternalEditorCommandParseError">
+ Error ao analisar o comando do editor externo.
+ </string>
+ <string name="ExternalEditorFailedToRun">
+ Falha de execução do editor externo.
+ </string>
+ <string name="TranslationFailed">
+ Falha na tradução: [REASON]
+ </string>
+ <string name="TranslationResponseParseError">
+ Erro ao analisar resposta de tradução.
+ </string>
+ <string name="Esc">
+ Esc
+ </string>
+ <string name="Space">
+ Space
+ </string>
+ <string name="Enter">
+ Enter
+ </string>
+ <string name="Tab">
+ Tab
+ </string>
+ <string name="Ins">
+ Ins
+ </string>
+ <string name="Del">
+ Del
+ </string>
+ <string name="Backsp">
+ Backsp
+ </string>
+ <string name="Shift">
+ Shift
+ </string>
+ <string name="Ctrl">
+ Ctrl
+ </string>
+ <string name="Alt">
+ Alt
+ </string>
+ <string name="CapsLock">
+ CapsLock
+ </string>
+ <string name="Home">
+ Início
+ </string>
+ <string name="End">
+ End
+ </string>
+ <string name="PgUp">
+ PgUp
+ </string>
+ <string name="PgDn">
+ PgDn
+ </string>
+ <string name="F1">
+ F1
+ </string>
+ <string name="F2">
+ F2
+ </string>
+ <string name="F3">
+ F3
+ </string>
+ <string name="F4">
+ F4
+ </string>
+ <string name="F5">
+ F5
+ </string>
+ <string name="F6">
+ F6
+ </string>
+ <string name="F7">
+ F7
+ </string>
+ <string name="F8">
+ F8
+ </string>
+ <string name="F9">
+ F9
+ </string>
+ <string name="F10">
+ F10
+ </string>
+ <string name="F11">
+ F11
+ </string>
+ <string name="F12">
+ F12
+ </string>
+ <string name="Add">
+ Adicionar
+ </string>
+ <string name="Subtract">
+ Subtrair
+ </string>
+ <string name="Multiply">
+ Multiplicar
+ </string>
+ <string name="Divide">
+ Dividir
+ </string>
+ <string name="PAD_DIVIDE">
+ PAD_DIVIDE
+ </string>
+ <string name="PAD_LEFT">
+ PAD_LEFT
+ </string>
+ <string name="PAD_RIGHT">
+ PAD_RIGHT
+ </string>
+ <string name="PAD_DOWN">
+ PAD_DOWN
+ </string>
+ <string name="PAD_UP">
+ PAD_UP
+ </string>
+ <string name="PAD_HOME">
+ PAD_HOME
+ </string>
+ <string name="PAD_END">
+ PAD_END
+ </string>
+ <string name="PAD_PGUP">
+ PAD_PGUP
+ </string>
+ <string name="PAD_PGDN">
+ PAD_PGDN
+ </string>
+ <string name="PAD_CENTER">
+ PAD_CENTER
+ </string>
+ <string name="PAD_INS">
+ PAD_INS
+ </string>
+ <string name="PAD_DEL">
+ PAD_DEL
+ </string>
+ <string name="PAD_Enter">
+ PAD_Enter
+ </string>
+ <string name="PAD_BUTTON0">
+ PAD_BUTTON0
+ </string>
+ <string name="PAD_BUTTON1">
+ PAD_BUTTON1
+ </string>
+ <string name="PAD_BUTTON2">
+ PAD_BUTTON2
+ </string>
+ <string name="PAD_BUTTON3">
+ PAD_BUTTON3
+ </string>
+ <string name="PAD_BUTTON4">
+ PAD_BUTTON4
+ </string>
+ <string name="PAD_BUTTON5">
+ PAD_BUTTON5
+ </string>
+ <string name="PAD_BUTTON6">
+ PAD_BUTTON6
+ </string>
+ <string name="PAD_BUTTON7">
+ PAD_BUTTON7
+ </string>
+ <string name="PAD_BUTTON8">
+ PAD_BUTTON8
+ </string>
+ <string name="PAD_BUTTON9">
+ PAD_BUTTON9
+ </string>
+ <string name="PAD_BUTTON10">
+ PAD_BUTTON10
+ </string>
+ <string name="PAD_BUTTON11">
+ PAD_BUTTON11
+ </string>
+ <string name="PAD_BUTTON12">
+ PAD_BUTTON12
+ </string>
+ <string name="PAD_BUTTON13">
+ PAD_BUTTON13
+ </string>
+ <string name="PAD_BUTTON14">
+ PAD_BUTTON14
+ </string>
+ <string name="PAD_BUTTON15">
+ PAD_BUTTON15
+ </string>
+ <string name="-">
+ -
+ </string>
+ <string name="=">
+ =
+ </string>
+ <string name="`">
+ `
+ </string>
+ <string name=";">
+ ;
+ </string>
+ <string name="[">
+ [
+ </string>
+ <string name="]">
+ ]
+ </string>
+ <string name="\">
+ \
+ </string>
+ <string name="0">
+ 0
+ </string>
+ <string name="1">
+ 1
+ </string>
+ <string name="2">
+ 2
+ </string>
+ <string name="3">
+ 3
+ </string>
+ <string name="4">
+ 4
+ </string>
+ <string name="5">
+ 5
+ </string>
+ <string name="6">
+ 6
+ </string>
+ <string name="7">
+ 7
+ </string>
+ <string name="8">
+ 8
+ </string>
+ <string name="9">
+ 9
+ </string>
+ <string name="A">
+ A
+ </string>
+ <string name="B">
+ B
+ </string>
+ <string name="C">
+ C
+ </string>
+ <string name="D">
+ D
+ </string>
+ <string name="E">
+ E
+ </string>
+ <string name="F">
+ F
+ </string>
+ <string name="G">
+ G
+ </string>
+ <string name="H">
+ H
+ </string>
+ <string name="I">
+ I
+ </string>
+ <string name="J">
+ J
+ </string>
+ <string name="K">
+ K
+ </string>
+ <string name="L">
+ L
+ </string>
+ <string name="M">
+ M
+ </string>
+ <string name="N">
+ N
+ </string>
+ <string name="O">
+ O
+ </string>
+ <string name="P">
+ P
+ </string>
+ <string name="Q">
+ Q
+ </string>
+ <string name="R">
+ R
+ </string>
+ <string name="S">
+ S
+ </string>
+ <string name="T">
+ T
+ </string>
+ <string name="U">
+ U
+ </string>
+ <string name="V">
+ V
+ </string>
+ <string name="W">
+ W
+ </string>
+ <string name="X">
+ X
+ </string>
+ <string name="Y">
+ Y
+ </string>
+ <string name="Z">
+ Z
+ </string>
+ <string name="BeaconParticle">
+ Vendo balizas de partículas (azul)
+ </string>
+ <string name="BeaconPhysical">
+ Vendo balizas de objetos físicos (verde)
+ </string>
+ <string name="BeaconScripted">
+ Vendo balizas de objetos com script (vermelho)
+ </string>
+ <string name="BeaconScriptedTouch">
+ Vendo objeto com script com balizas com funcionalidade de toque (vermelho)
+ </string>
+ <string name="BeaconSound">
+ Vendo balizas de som (amarelo)
+ </string>
+ <string name="BeaconMedia">
+ Vendo balizas de mídia (branco)
+ </string>
+ <string name="ParticleHiding">
+ Ocultar partículas
+ </string>
+ <string name="Command_AboutLand_Label">
+ Sobre terrenos
+ </string>
+ <string name="Command_Appearance_Label">
+ Aparência
+ </string>
+ <string name="Command_Avatar_Label">
+ Avatar
+ </string>
+ <string name="Command_Build_Label">
+ Construir
+ </string>
+ <string name="Command_Chat_Label">
+ Bate-papo
+ </string>
+ <string name="Command_Compass_Label">
+ Bússola
+ </string>
+ <string name="Command_Destinations_Label">
+ Destinos
+ </string>
+ <string name="Command_Gestures_Label">
+ Gestos
+ </string>
+ <string name="Command_HowTo_Label">
+ Como
+ </string>
+ <string name="Command_Inventory_Label">
+ Inventário
+ </string>
+ <string name="Command_Map_Label">
+ Mapa
+ </string>
+ <string name="Command_Marketplace_Label">
+ Mercado
+ </string>
+ <string name="Command_MiniMap_Label">
+ Mini Mapa
+ </string>
+ <string name="Command_Move_Label">
+ Andar/correr/voar
+ </string>
+ <string name="Command_Outbox_Label">
+ Caixa de saída do lojista
+ </string>
+ <string name="Command_People_Label">
+ Pessoas
+ </string>
+ <string name="Command_Picks_Label">
+ Destaques
+ </string>
+ <string name="Command_Places_Label">
+ Lugares
+ </string>
+ <string name="Command_Preferences_Label">
+ Preferências
+ </string>
+ <string name="Command_Profile_Label">
+ Perfil
+ </string>
+ <string name="Command_Search_Label">
+ Buscar
+ </string>
+ <string name="Command_Snapshot_Label">
+ Foto
+ </string>
+ <string name="Command_Speak_Label">
+ Falar
+ </string>
+ <string name="Command_View_Label">
+ Controles da câmera
+ </string>
+ <string name="Command_Voice_Label">
+ Configurações de voz
+ </string>
+ <string name="Command_AboutLand_Tooltip">
+ Informações sobre o terreno que você está visitando
+ </string>
+ <string name="Command_Appearance_Tooltip">
+ Mudar seu avatar
+ </string>
+ <string name="Command_Avatar_Tooltip">
+ Escolha um avatar completo
+ </string>
+ <string name="Command_Build_Tooltip">
+ Construindo objetos e redimensionando terreno
+ </string>
+ <string name="Command_Chat_Tooltip">
+ Bater papo com pessoas próximas usando texto
+ </string>
+ <string name="Command_Compass_Tooltip">
+ Bússola
+ </string>
+ <string name="Command_Destinations_Tooltip">
+ Destinos de interesse
+ </string>
+ <string name="Command_Gestures_Tooltip">
+ Gestos para seu avatar
+ </string>
+ <string name="Command_HowTo_Tooltip">
+ Como executar tarefas comuns
+ </string>
+ <string name="Command_Inventory_Tooltip">
+ Exibir e usar seus pertences
+ </string>
+ <string name="Command_Map_Tooltip">
+ Mapa-múndi
+ </string>
+ <string name="Command_Marketplace_Tooltip">
+ Faça compras
+ </string>
+ <string name="Command_MiniMap_Tooltip">
+ Mostrar quem está aqui
+ </string>
+ <string name="Command_Move_Tooltip">
+ Movendo seu avatar
+ </string>
+ <string name="Command_Outbox_Tooltip">
+ Transferir itens para o seu mercado para venda
+ </string>
+ <string name="Command_People_Tooltip">
+ Amigos, grupos e pessoas próximas
+ </string>
+ <string name="Command_Picks_Tooltip">
+ Lugares mostrados como favoritos em seu perfil
+ </string>
+ <string name="Command_Places_Tooltip">
+ Lugares salvos
+ </string>
+ <string name="Command_Preferences_Tooltip">
+ Preferências
+ </string>
+ <string name="Command_Profile_Tooltip">
+ Edite ou visualize seu perfil
+ </string>
+ <string name="Command_Search_Tooltip">
+ Encontre lugares, eventos, pessoas
+ </string>
+ <string name="Command_Snapshot_Tooltip">
+ Tirar uma foto
+ </string>
+ <string name="Command_Speak_Tooltip">
+ Fale com pessoas próximas usando seu microfone
+ </string>
+ <string name="Command_View_Tooltip">
+ Alterar o ângulo da câmera
+ </string>
+ <string name="Command_Voice_Tooltip">
+ Controles de volume das chamadas e pessoas próximas a você no mundo virtual
+ </string>
+ <string name="Toolbar_Bottom_Tooltip">
+ atualmente na sua barra de ferramentas inferior
+ </string>
+ <string name="Toolbar_Left_Tooltip">
+ atualmente na sua barra de ferramentas esquerda
+ </string>
+ <string name="Toolbar_Right_Tooltip">
+ atualmente na sua barra de ferramentas direita
+ </string>
+ <string name="Retain%">
+ Reter%
+ </string>
+ <string name="Detail">
+ Detalhe
+ </string>
+ <string name="Better Detail">
+ Detalhamento maior
+ </string>
+ <string name="Surface">
+ Superfície
+ </string>
+ <string name="Solid">
+ Sólido
+ </string>
+ <string name="Wrap">
+ Conclusão
+ </string>
+ <string name="Preview">
+ Visualizar
+ </string>
+ <string name="Normal">
+ Normal
+ </string>
+ <string name="snapshot_quality_very_low">
+ Muito baixo
+ </string>
+ <string name="snapshot_quality_low">
+ Baixo
+ </string>
+ <string name="snapshot_quality_medium">
+ Médio
+ </string>
+ <string name="snapshot_quality_high">
+ Alto
+ </string>
+ <string name="snapshot_quality_very_high">
+ Muito alto
+ </string>
</strings>
diff --git a/indra/newview/skins/default/xui/pt/teleport_strings.xml b/indra/newview/skins/default/xui/pt/teleport_strings.xml
index 11ea0f4195..3fb77a02d2 100644
--- a/indra/newview/skins/default/xui/pt/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/pt/teleport_strings.xml
@@ -18,6 +18,10 @@ Se você continuar a receber esta mensagem, por favor consulte o [SUPPORT_SITE].
<message name="timeout_tport">
Desculpe, não foi possível para o sistema executar o teletransporte. Tente novamente dentro de alguns instantes.
</message>
+ <message name="NoHelpIslandTP">
+ Não é possível se teletransportar de volta à Ilha Welcome.
+Vá para a &apos;Ilha Welcome Pública&apos; para repetir o tutorial.
+ </message>
<message name="noaccess_tport">
Desculpe, você não tem acesso ao destino deste teletransporte.
</message>
diff --git a/indra/newview/skins/default/xui/ru/floater_aaa.xml b/indra/newview/skins/default/xui/ru/floater_aaa.xml
new file mode 100644
index 0000000000..aa18a4a4a3
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_aaa.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Test Floater" title="ТЕСТИРОВÐТЬ ОКÐО">
+ <string name="test_the_vlt">
+ Эта Ñтрока CHANGE2 извлечена.
+ </string>
+ <string name="testing_eli">
+ Проверка изменений.
+ </string>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_about.xml b/indra/newview/skins/default/xui/ru/floater_about.xml
new file mode 100644
index 0000000000..119f104906
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_about.xml
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_about" title="О [CAPITALIZED_APP_NAME]">
+ <floater.string name="AboutHeader">
+ [APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2] ([VIEWER_VERSION_3]) [BUILD_DATE] [BUILD_TIME] ([CHANNEL])
+[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]
+ </floater.string>
+ <floater.string name="AboutCompiler">
+ ИÑпользован компилÑтор [COMPILER], верÑÐ¸Ñ [COMPILER_VERSION]
+ </floater.string>
+ <floater.string name="AboutPosition">
+ Ð’Ñ‹ в точке [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] в регионе «[REGION]», раÑположенном на &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ([HOSTIP])
+[SERVER_VERSION]
+[SERVER_RELEASE_NOTES_URL]
+ </floater.string>
+ <floater.string name="AboutSystem">
+ ЦП: [CPU]
+ПамÑÑ‚ÑŒ: [MEMORY_MB] МБ
+ВерÑÐ¸Ñ ÐžÐ¡: [OS_VERSION]
+Производитель графичеÑкой платы: [GRAPHICS_CARD_VENDOR]
+ГрафичеÑÐºÐ°Ñ Ð¿Ð»Ð°Ñ‚Ð°: [GRAPHICS_CARD]
+ </floater.string>
+ <floater.string name="AboutDriver">
+ ВерÑÐ¸Ñ Ð³Ñ€Ð°Ñ„Ð¸Ñ‡ÐµÑкого драйвера Windows: [GRAPHICS_DRIVER_VERSION]
+ </floater.string>
+ <floater.string name="AboutLibs">
+ ВерÑÐ¸Ñ OpenGL: [OPENGL_VERSION]
+ВерÑÐ¸Ñ libcurl: [LIBCURL_VERSION]
+ВерÑÐ¸Ñ Ð´ÐµÐºÐ¾Ð´ÐµÑ€Ð° J2C: [J2C_VERSION]
+ВерÑÐ¸Ñ Ð´Ñ€Ð°Ð¹Ð²ÐµÑ€Ð° звука: [AUDIO_DRIVER_VERSION]
+ВерÑÐ¸Ñ Qt Webkit: [QT_WEBKIT_VERSION]
+ВерÑÐ¸Ñ Ð³Ð¾Ð»Ð¾Ñового Ñервера: [VOICE_VERSION]
+ </floater.string>
+ <floater.string name="none">
+ (нет)
+ </floater.string>
+ <floater.string name="AboutTraffic">
+ ПотерÑно пакетов: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
+ </floater.string>
+ <floater.string name="ErrorFetchingServerReleaseNotesURL">
+ Ошибка при получении URL-адреÑа заметок о выпуÑке Ñервера.
+ </floater.string>
+ <tab_container name="about_tab">
+ <panel label="Данные" name="support_panel">
+ <button label="Копировать в буфер обмена" name="copy_btn"/>
+ </panel>
+ <panel label="Создатели" name="credits_panel">
+ <text name="linden_intro">
+ Игра Second Life разработана лабораторией Lindens:
+ </text>
+ <text name="contrib_intro">
+ в напиÑании открытого кода учаÑтвовали:
+ </text>
+ <text_editor name="contrib_names">
+ ПÑевдо-Ð¸Ð¼Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¾ при запуÑке
+ </text_editor>
+ <text name="trans_intro">
+ перевод:
+ </text>
+ <text_editor name="trans_names">
+ ПÑевдо-Ð¸Ð¼Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¾ при запуÑке
+ </text_editor>
+ </panel>
+ <panel label="Лицензии" name="licenses_panel">
+ <text_editor name="credits_editor">
+ 3Dconnexion SDK (C) 1992-2007 3Dconnexion
+ APR (C) 2000-2004 The Apache Software Foundation
+ Collada DOM (C) 2005 Sony Computer Entertainment Inc.
+ cURL (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)
+ DBus/dbus-glib (C) 2002, 2003 CodeFactory AB / (C) 2003, 2004 Red Hat, Inc.
+ expat (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.
+ FreeType (C) 1996-2002, The FreeType Project (www.freetype.org).
+ GL (C) 1999-2004 Brian Paul.
+ GLOD (C) 2003-04 Jonathan Cohen, Nat Duca, Chris Niski, УниверÑитет Джона ГопкинÑа и David Luebke, Brenden Schubert, УниверÑитет Вирджинии.
+ google-perftools (c) 2005, Google Inc.
+ Havok.com(TM) (C) 1999-2001, Telekinesys Research Limited.
+ jpeg2000 (C) 2001, David Taubman, УниверÑитет Ðового Южного УÑльÑа (UNSW)
+ jpeglib (C) 1991-1998, Thomas G. Lane.
+ ogg/vorbis (C) 2001, Xiphophorus
+ OpenSSL (C) 1998-2002 The OpenSSL Project.
+ PCRE (c) 1997-2008, КембриджÑкий универÑитет
+ SDL (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
+ SSLeay (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+ xmlrpc-epi (C) 2000 Epinions, Inc.
+ zlib (C) 1995-2002 Jean-loup Gailly и Mark Adler.
+ google-perftools (c) 2005, Google Inc.
+
+ Ð’ клиенте Second Life иÑпользуетÑÑ Ñ‚ÐµÑ…Ð½Ð¾Ð»Ð¾Ð³Ð¸Ñ Havok (TM) Physics. (C) 1999-2010 Havok.com Inc. (и лицензиары компании). Ð’Ñе права защищены. Подробнее Ñм. веб-Ñайт www.havok.com.
+
+ Это программное обеÑпечение Ñодержит иÑходный код, предоÑтавленный корпорацией NVIDIA.
+
+ Ð’Ñе права защищены. Подробные ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ñм. в файле licenses.txt.
+
+ Кодирование звука Ð´Ð»Ñ Ð³Ð¾Ð»Ð¾Ñового чата: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
+ </text_editor>
+ </panel>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_about_land.xml b/indra/newview/skins/default/xui/ru/floater_about_land.xml
new file mode 100644
index 0000000000..ee74aad5cc
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_about_land.xml
@@ -0,0 +1,481 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floaterland" title="О ЗЕМЛЕ">
+ <floater.string name="maturity_icon_general">
+ &quot;Parcel_PG_Dark&quot;
+ </floater.string>
+ <floater.string name="maturity_icon_moderate">
+ &quot;Parcel_M_Dark&quot;
+ </floater.string>
+ <floater.string name="maturity_icon_adult">
+ &quot;Parcel_R_Dark&quot;
+ </floater.string>
+ <floater.string name="Minutes">
+ [MINUTES] мин
+ </floater.string>
+ <floater.string name="Minute">
+ минута
+ </floater.string>
+ <floater.string name="Seconds">
+ [SECONDS] Ñ
+ </floater.string>
+ <floater.string name="Remaining">
+ оÑталоÑÑŒ
+ </floater.string>
+ <tab_container name="landtab">
+ <panel label="ОСÐОВÐЫЕ" name="land_general_panel">
+ <panel.string name="new users only">
+ Только новые жители
+ </panel.string>
+ <panel.string name="anyone">
+ Ð’Ñе
+ </panel.string>
+ <panel.string name="area_text">
+ Площадь
+ </panel.string>
+ <panel.string name="area_size_text">
+ [AREA] м²
+ </panel.string>
+ <panel.string name="auction_id_text">
+ ID аукциона: [ID]
+ </panel.string>
+ <panel.string name="need_tier_to_modify">
+ Ð’Ñ‹ должны подтвердить покупку, чтобы изменÑÑ‚ÑŒ Ñту землю.
+ </panel.string>
+ <panel.string name="group_owned_text">
+ (СобÑтвенноÑÑ‚ÑŒ группы)
+ </panel.string>
+ <panel.string name="profile_text">
+ Профиль
+ </panel.string>
+ <panel.string name="info_text">
+ ИнформациÑ
+ </panel.string>
+ <panel.string name="public_text">
+ (публичное)
+ </panel.string>
+ <panel.string name="none_text">
+ (нет)
+ </panel.string>
+ <panel.string name="sale_pending_text">
+ (Ожидание продажи)
+ </panel.string>
+ <panel.string name="no_selection_text">
+ УчаÑток не выбран.
+ </panel.string>
+ <panel.string name="time_stamp_template">
+ [wkday,datetime,local], [day,datetime,local] [mth,datetime,local] [year,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
+ </panel.string>
+ <text name="Name:">
+ Ðазвание:
+ </text>
+ <text name="Description:">
+ ОпиÑание:
+ </text>
+ <text name="LandType">
+ Тип:
+ </text>
+ <text name="LandTypeText">
+ Материк / помеÑтье
+ </text>
+ <text name="ContentRating">
+ Рейтинг:
+ </text>
+ <text name="ContentRatingText">
+ ВзроÑлый
+ </text>
+ <text name="Owner:">
+ Владелец:
+ </text>
+ <text name="Group:">
+ Группа:
+ </text>
+ <button label="Задать" name="Set..."/>
+ <check_box label="Разрешить передачу земли группе" name="check deed" tool_tip="ДолжноÑтное лицо группы может передать Ñту землю группе Ñ ÑƒÑ‡ÐµÑ‚Ð¾Ð¼ ÑущеÑтвующего взноÑа."/>
+ <button label="Сделка" name="Deed..." tool_tip="Ð’Ñ‹ можете передать землю только еÑли вы ÑвлÑетеÑÑŒ должноÑтным лицом выбранной группы."/>
+ <check_box label="Владелец делает взноÑÑ‹ при передаче" name="check contrib" tool_tip="Когда Ð·ÐµÐ¼Ð»Ñ Ð¿ÐµÑ€ÐµÐ´Ð°ÐµÑ‚ÑÑ Ð³Ñ€ÑƒÐ¿Ð¿Ðµ, бывший владелец делает взноÑ, доÑтаточный Ð´Ð»Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¸ земли."/>
+ <text name="For Sale:">
+ Ð”Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð°Ð¶Ð¸:
+ </text>
+ <text name="Not for sale.">
+ Ðе Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð°Ð¶Ð¸
+ </text>
+ <text name="For Sale: Price L$[PRICE].">
+ Цена: L$[PRICE] (L$[PRICE_PER_SQM]/м²)
+ </text>
+ <button label="Продать землю" name="Sell Land..."/>
+ <text name="For sale to">
+ Продажа длÑ: [BUYER]
+ </text>
+ <text name="Sell with landowners objects in parcel.">
+ Объекты продаютÑÑ Ð²Ð¼ÐµÑте Ñ Ð·ÐµÐ¼Ð»ÐµÐ¹
+ </text>
+ <text name="Selling with no objects in parcel.">
+ Объекты не продаютÑÑ Ð²Ð¼ÐµÑте Ñ Ð·ÐµÐ¼Ð»ÐµÐ¹
+ </text>
+ <button label="Отменить продажу земли" label_selected="Отменить продажу земли" name="Cancel Land Sale"/>
+ <text name="Claimed:">
+ СобÑтвенноÑÑ‚ÑŒ Ñ:
+ </text>
+ <text name="DateClaimText">
+ Ð’Ñ‚ 15 Ðвг 13:47:25 2006
+ </text>
+ <text name="PriceLabel">
+ Площадь:
+ </text>
+ <text name="PriceText">
+ 4048 м²
+ </text>
+ <text name="Traffic:">
+ ПоÑещаемоÑÑ‚ÑŒ:
+ </text>
+ <text name="DwellText">
+ Загрузка...
+ </text>
+ <button label="Купить землю" name="Buy Land..."/>
+ <button label="Продать Ð´Ð»Ñ Linden" name="Linden Sale..." tool_tip="Ð—ÐµÐ¼Ð»Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° быть в ÑобÑтвенноÑти, иметь заданное Ñодержимое и не быть выÑтавленной на аукцион,"/>
+ <button label="Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ Ñкриптах" name="Scripts..."/>
+ <button label="Купить Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹" name="Buy For Group..."/>
+ <button label="Купить пропуÑк" name="Buy Pass..." tool_tip="ПропуÑк дает вам временный доÑтуп на Ñту землю."/>
+ <button label="ОтказатьÑÑ Ð¾Ñ‚ земли" name="Abandon Land..."/>
+ <button label="ПриÑвоить землю" name="Reclaim Land..."/>
+ </panel>
+ <panel label="СОГЛÐШЕÐИЕ" name="land_covenant_panel">
+ <panel.string name="can_resell">
+ ÐšÑƒÐ¿Ð»ÐµÐ½Ð½Ð°Ñ Ð² Ñтом регионе Ð·ÐµÐ¼Ð»Ñ Ð¼Ð¾Ð¶ÐµÑ‚ быть перепродана.
+ </panel.string>
+ <panel.string name="can_not_resell">
+ ÐšÑƒÐ¿Ð»ÐµÐ½Ð½Ð°Ñ Ð² Ñтом регионе Ð·ÐµÐ¼Ð»Ñ Ð½Ðµ может быть перепродана.
+ </panel.string>
+ <panel.string name="can_change">
+ ÐšÑƒÐ¿Ð»ÐµÐ½Ð½Ð°Ñ Ð² Ñтом регионе Ð·ÐµÐ¼Ð»Ñ Ð¼Ð¾Ð¶ÐµÑ‚ быть объединена или разделена.
+ </panel.string>
+ <panel.string name="can_not_change">
+ ÐšÑƒÐ¿Ð»ÐµÐ½Ð½Ð°Ñ Ð² Ñтом регионе Ð·ÐµÐ¼Ð»Ñ Ð½Ðµ может быть объединена или разделена.
+ </panel.string>
+ <text name="estate_section_lbl">
+ Землевладение:
+ </text>
+ <text name="estate_name_text">
+ материк
+ </text>
+ <text name="estate_owner_lbl">
+ Владелец:
+ </text>
+ <text name="estate_owner_text">
+ (нет)
+ </text>
+ <text_editor name="covenant_editor">
+ Ðет ÑÐ¾Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñтого землевладениÑ.
+ </text_editor>
+ <text name="covenant_timestamp_text">
+ ПоÑледние Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¡Ñ€ 31 Дек 16:00:00 1969
+ </text>
+ <text name="region_section_lbl">
+ Регион:
+ </text>
+ <text name="region_name_text">
+ Эрикавиль
+ </text>
+ <text name="region_landtype_lbl">
+ Тип:
+ </text>
+ <text name="region_landtype_text">
+ Материк / помеÑтье
+ </text>
+ <text name="region_maturity_lbl">
+ Рейтинг:
+ </text>
+ <text name="region_maturity_text">
+ ВзроÑлый
+ </text>
+ <text name="resellable_lbl">
+ Перепродажа:
+ </text>
+ <text name="resellable_clause">
+ Ð—ÐµÐ¼Ð»Ñ Ð² Ñтом регионе не может быть перепродана.
+ </text>
+ <text name="changeable_lbl">
+ Разделение:
+ </text>
+ <text name="changeable_clause">
+ Ð—ÐµÐ¼Ð»Ñ Ð² Ñтом регионе не может быть объединена или разделена.
+ </text>
+ </panel>
+ <panel label="ОБЪЕКТЫ" name="land_objects_panel">
+ <panel.string name="objects_available_text">
+ [COUNT] из [MAX] ([AVAILABLE] доÑтупно)
+ </panel.string>
+ <panel.string name="objects_deleted_text">
+ [COUNT] из [MAX] ([DELETED] будет удалено)
+ </panel.string>
+ <text name="parcel_object_bonus">
+ БонуÑный множитель Ð´Ð»Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð¾Ð²: [BONUS]
+ </text>
+ <text name="Simulator primitive usage:">
+ ЕмкоÑÑ‚ÑŒ региона:
+ </text>
+ <text name="objects_available">
+ [COUNT] из [MAX] ([AVAILABLE] доÑтупно)
+ </text>
+ <text name="Primitives parcel supports:">
+ ЕмкоÑÑ‚ÑŒ учаÑтка:
+ </text>
+ <text name="object_contrib_text">
+ [COUNT]
+ </text>
+ <text name="Primitives on parcel:">
+ ВоздейÑтвие учаÑтка:
+ </text>
+ <text name="total_objects_text">
+ [COUNT]
+ </text>
+ <text name="Owned by parcel owner:">
+ СобÑтвенноÑÑ‚ÑŒ владельца:
+ </text>
+ <text name="owner_objects_text">
+ [COUNT]
+ </text>
+ <button label="Показать" label_selected="Показать" name="ShowOwner"/>
+ <button label="Возврат" name="ReturnOwner..." tool_tip="Вернуть объекты их владельцам."/>
+ <text name="Set to group:">
+ УÑтановлено группой:
+ </text>
+ <text name="group_objects_text">
+ [COUNT]
+ </text>
+ <button label="Показать" label_selected="Показать" name="ShowGroup"/>
+ <button label="Возврат" name="ReturnGroup..." tool_tip="Вернуть объекты их владельцам."/>
+ <text name="Owned by others:">
+ СобÑтвенноÑÑ‚ÑŒ других:
+ </text>
+ <text name="other_objects_text">
+ [COUNT]
+ </text>
+ <button label="Показать" label_selected="Показать" name="ShowOther"/>
+ <button label="Возврат" name="ReturnOther..." tool_tip="Вернуть объекты их владельцам."/>
+ <text name="Selected / sat upon:">
+ Выбрано / транÑпорт:
+ </text>
+ <text name="selected_objects_text">
+ [COUNT]
+ </text>
+ <text name="Autoreturn">
+ Ðвтовозвращение объектов других жителей (в минутах, 0 – отключено):
+ </text>
+ <text name="Object Owners:">
+ Владельцы объектов:
+ </text>
+ <button name="Refresh List" tool_tip="Обновить ÑпиÑок объектов"/>
+ <button label="Вернуть объекты" name="Return objects..."/>
+ <name_list name="owner list">
+ <name_list.columns label="Тип" name="type"/>
+ <name_list.columns label="Ðазвание" name="name"/>
+ <name_list.columns label="Кол-во" name="count"/>
+ <name_list.columns label="ПоÑледний объект" name="mostrecent"/>
+ </name_list>
+ </panel>
+ <panel label="ÐÐСТРОЙКИ" name="land_options_panel">
+ <panel.string name="search_enabled_tooltip">
+ Позволить людÑм видеть учаÑток в результатах поиÑка
+ </panel.string>
+ <panel.string name="search_disabled_small_tooltip">
+ Этот параметр недоÑтупен, потому площадь учаÑтка не превышает 128 м².
+Только большие учаÑтки могут быть показаны в поиÑке.
+ </panel.string>
+ <panel.string name="search_disabled_permissions_tooltip">
+ Этот параметр недоÑтупен, потому что вы не можете изменÑÑ‚ÑŒ его на Ñтом учаÑтке.
+ </panel.string>
+ <panel.string name="mature_check_mature">
+ Умеренный контент
+ </panel.string>
+ <panel.string name="mature_check_adult">
+ Контент Ð´Ð»Ñ Ð²Ð·Ñ€Ð¾Ñлых
+ </panel.string>
+ <panel.string name="mature_check_mature_tooltip">
+ Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¸Ð»Ð¸ Ñодержимое вашего учаÑтка раÑцениваетÑÑ ÐºÐ°Ðº moderate.
+ </panel.string>
+ <panel.string name="mature_check_adult_tooltip">
+ Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¸Ð»Ð¸ Ñодержимое вашего учаÑтка раÑцениваетÑÑ ÐºÐ°Ðº adult.
+ </panel.string>
+ <panel.string name="landing_point_none">
+ (нет)
+ </panel.string>
+ <panel.string name="push_restrict_text">
+ Ðе толкать
+ </panel.string>
+ <panel.string name="push_restrict_region_text">
+ Ðе толкать (наÑтройки региона)
+ </panel.string>
+ <text name="allow_label">
+ Позволить другим жителÑм:
+ </text>
+ <text name="allow_label0">
+ Полет:
+ </text>
+ <check_box label="Ð’Ñе" name="check fly" tool_tip="ЕÑли отмечено, жители Ñмогут летать над вашей землей. ЕÑли не отметить, они Ñмогут только прилетать и пролетать мимо земли."/>
+ <text name="allow_label2">
+ СтроительÑтво:
+ </text>
+ <check_box label="Ð’Ñе" name="edit objects check"/>
+ <check_box label="Группа" name="edit group objects check"/>
+ <text name="allow_label3">
+ Проникновение объектов:
+ </text>
+ <check_box label="Ð’Ñе" name="all object entry check"/>
+ <check_box label="Группа" name="group object entry check"/>
+ <text name="allow_label4">
+ ЗапуÑкать Ñкрипты:
+ </text>
+ <check_box label="Ð’Ñе" name="check other scripts"/>
+ <check_box label="Группа" name="check group scripts"/>
+ <check_box label="БезопаÑно (нет повреждений)" name="check safe" tool_tip="ЕÑли отмечено, то Ð·ÐµÐ¼Ð»Ñ ÑчитаетÑÑ Ð±ÐµÐ·Ð¾Ð¿Ð°Ñной, отключены боевые повреждениÑ. ЕÑли не отмечено, то боевые Ð¿Ð¾Ð²Ñ€ÐµÐ¶Ð´ÐµÐ½Ð¸Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ñ‹."/>
+ <check_box label="Ðе толкать" name="PushRestrictCheck" tool_tip="Запрещает Ñкриптам функцию толканиÑ. Этот параметр может оказатьÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ñ‹Ð¼ Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´Ð¾Ñ‚Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð½ÐµÐ¶ÐµÐ»Ð°Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð³Ð¾ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð½Ð° вашей земле."/>
+ <check_box label="Показать меÑто в поиÑке (L$30/неделÑ)" name="ShowDirectoryCheck" tool_tip="Позволить людÑм видеть учаÑток в результатах поиÑка"/>
+ <combo_box name="land category with adult">
+ <combo_box.item label="Ð›ÑŽÐ±Ð°Ñ ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ" name="item0"/>
+ <combo_box.item label="МеÑто Linden" name="item1"/>
+ <combo_box.item label="ВзроÑлый" name="item2"/>
+ <combo_box.item label="ИÑкуÑÑтво и культура" name="item3"/>
+ <combo_box.item label="БизнеÑ" name="item4"/>
+ <combo_box.item label="Образование" name="item5"/>
+ <combo_box.item label="Игры" name="item6"/>
+ <combo_box.item label="МеÑта вÑтреч" name="item7"/>
+ <combo_box.item label="Ð”Ð»Ñ Ð½Ð¾Ð²Ð¸Ñ‡ÐºÐ¾Ð²" name="item8"/>
+ <combo_box.item label="Парки и природа" name="item9"/>
+ <combo_box.item label="Проживание" name="item10"/>
+ <combo_box.item label="Покупки" name="item11"/>
+ <combo_box.item label="Ðренда" name="item13"/>
+ <combo_box.item label="Другое" name="item12"/>
+ </combo_box>
+ <combo_box name="land category">
+ <combo_box.item label="Ð›ÑŽÐ±Ð°Ñ ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ" name="item0"/>
+ <combo_box.item label="МеÑто Linden" name="item1"/>
+ <combo_box.item label="ИÑкуÑÑтво и культура" name="item3"/>
+ <combo_box.item label="БизнеÑ" name="item4"/>
+ <combo_box.item label="Образование" name="item5"/>
+ <combo_box.item label="Игры" name="item6"/>
+ <combo_box.item label="МеÑта вÑтреч" name="item7"/>
+ <combo_box.item label="Ð”Ð»Ñ Ð½Ð¾Ð²Ð¸Ñ‡ÐºÐ¾Ð²" name="item8"/>
+ <combo_box.item label="Парки и природа" name="item9"/>
+ <combo_box.item label="Проживание" name="item10"/>
+ <combo_box.item label="Покупки" name="item11"/>
+ <combo_box.item label="Ðренда" name="item13"/>
+ <combo_box.item label="Другое" name="item12"/>
+ </combo_box>
+ <check_box label="Умеренный контент" name="MatureCheck" tool_tip=" "/>
+ <text name="Snapshot:">
+ Снимок:
+ </text>
+ <texture_picker name="snapshot_ctrl" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° изображениÑ"/>
+ <text name="allow_label5">
+ Ðватары Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… учаÑтков могут видеть аватары на Ñтом учаÑтке и общатьÑÑ Ñ Ð½Ð¸Ð¼Ð¸
+ </text>
+ <check_box label="Видны аватары" name="SeeAvatarsCheck" tool_tip="Ðватары Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… учаÑтков Ñмогут видеть аватары на Ñтом учаÑтке и общатьÑÑ Ñ Ð½Ð¸Ð¼Ð¸ в чате, а вы также Ñможете видеть их и общатьÑÑ Ñ Ð½Ð¸Ð¼Ð¸."/>
+ <text name="landing_point">
+ В точку телепортации: [LANDING]
+ </text>
+ <button label="Задать" label_selected="Задать" name="Set" tool_tip="УÑтановить точку телепортации, в которую будут прибывать поÑетители, СтавитÑÑ Ð² меÑте вашего аватара на Ñтом учаÑтке."/>
+ <button label="ЧиÑто" label_selected="ЧиÑто" name="Clear" tool_tip="Удалить данные о точке телепортации"/>
+ <text name="Teleport Routing: ">
+ Вариант телепортации:
+ </text>
+ <combo_box name="landing type" tool_tip="Вариант телепортации – выберите, каким образом будет производитьÑÑ Ñ‚ÐµÐ»ÐµÐ¿Ð¾Ñ€Ñ‚Ð°Ñ†Ð¸Ñ Ð½Ð° вашу землю">
+ <combo_box.item label="Ð’ черном ÑпиÑке" name="Blocked"/>
+ <combo_box.item label="В точку телепортации" name="LandingPoint"/>
+ <combo_box.item label="Ð’ любое меÑто" name="Anywhere"/>
+ </combo_box>
+ </panel>
+ <panel label="МЕДИÐ" name="land_media_panel">
+ <text name="with media:">
+ Тип:
+ </text>
+ <combo_box name="media type" tool_tip="Укажите, чем ÑвлÑетÑÑ ÑÑылка – видео, веб-Ñтраница или другое медиа"/>
+ <text name="at URL:">
+ Дом. Ñтраница:
+ </text>
+ <button label="Задать" name="set_media_url"/>
+ <text name="Description:">
+ ОпиÑание:
+ </text>
+ <line_editor name="url_description" tool_tip="ТекÑÑ‚, показываемый Ñ€Ñдом Ñ ÐºÐ½Ð¾Ð¿ÐºÐ¾Ð¹ проигрываниÑ/загрузки"/>
+ <text name="Media texture:">
+ Замена текÑтуры:
+ </text>
+ <texture_picker name="media texture" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° изображениÑ"/>
+ <text name="replace_texture_help">
+ Объект, иÑпользующий Ñту текÑтуру, будет показывать видео или веб-Ñтраницу поÑле Ð½Ð°Ð¶Ð°Ñ‚Ð¸Ñ ÐºÐ½Ð¾Ð¿ÐºÐ¸ проигрываниÑ. Щелкните на миниатюре Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° другой текÑтуры.
+ </text>
+ <check_box label="ÐвтомаÑштабирование" name="media_auto_scale" tool_tip="Ð’ результате уÑтановки Ñтого флажка контент Ð´Ð»Ñ Ñтого учаÑтка автоматичеÑки маÑштабируетÑÑ. Это проиÑходит немного медленнее и в более низком качеÑтве изображениÑ, но не требуетÑÑ Ð¼Ð°Ñштабирование и выравнивание текÑтуры."/>
+ <text name="media_size" tool_tip="Размер Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð²ÐµÐ±-медиа, по умолчанию – 0.">
+ Размер:
+ </text>
+ <spinner name="media_size_width" tool_tip="Размер Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð²ÐµÐ±-медиа, по умолчанию – 0."/>
+ <spinner name="media_size_height" tool_tip="Размер Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð²ÐµÐ±-медиа, по умолчанию – 0."/>
+ <text name="pixels">
+ пикÑ.
+ </text>
+ <text name="Options:">
+ Опции:
+ </text>
+ <check_box label="Цикл" name="media_loop" tool_tip="Проигрывать медиа в цикле. По завершении Ð¿Ñ€Ð¾Ð¸Ð³Ñ€Ñ‹Ð²Ð°Ð½Ð¸Ñ Ð¼ÐµÐ´Ð¸Ð° оно запуÑтитÑÑ Ñ Ð½Ð°Ñ‡Ð°Ð»Ð°."/>
+ </panel>
+ <panel label="ЗВУК" name="land_audio_panel">
+ <text name="MusicURL:">
+ URL музыки:
+ </text>
+ <text name="Sound:">
+ Звук:
+ </text>
+ <check_box label="Запретить звуки от жеÑтов и объектов на Ñтом учаÑтке" name="check sound local"/>
+ <text name="Avatar Sounds:">
+ Звуки аватара:
+ </text>
+ <check_box label="Ð’Ñе" name="all av sound check"/>
+ <check_box label="Группа" name="group av sound check"/>
+ <text name="Voice settings:">
+ ГолоÑ:
+ </text>
+ <check_box label="Включить голоÑ" name="parcel_enable_voice_channel"/>
+ <check_box label="Разрешить голоÑовое общение (уÑтановлено на землевладении)" name="parcel_enable_voice_channel_is_estate_disabled"/>
+ <check_box label="Запретить голоÑовое общение на Ñтом учаÑтке" name="parcel_enable_voice_channel_local"/>
+ </panel>
+ <panel label="ДОСТУП" name="land_access_panel">
+ <panel.string name="access_estate_defined">
+ (Определено на землевладении)
+ </panel.string>
+ <panel.string name="estate_override">
+ ЧаÑÑ‚ÑŒ Ñтих параметров уÑтановлена на уровне землевладениÑ
+ </panel.string>
+ <check_box label="Разрешить публичный доÑтуп (ÑнÑтие флажка приведет к Ñозданию линий запрета)" name="public_access"/>
+ <text name="Only Allow">
+ Разрешить доÑтуп только таким жителÑм:
+ </text>
+ <check_box label="ЗарегиÑтрирована Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ð± оплате [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Ð”Ð»Ñ Ð´Ð¾Ñтупа к Ñтому учаÑтку у Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° быть зарегиÑтрирована Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ð± оплате. Более Ð¿Ð¾Ð´Ñ€Ð¾Ð±Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð½Ð°Ñ…Ð¾Ð´Ð¸Ñ‚ÑÑ Ð·Ð´ÐµÑÑŒ: [SUPPORT_SITE]."/>
+ <check_box label="Подтвержден возраÑÑ‚ [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Ð”Ð»Ñ Ð´Ð¾Ñтупа к Ñтому учаÑтку житель должен подтвердить Ñвой возраÑÑ‚. Более Ð¿Ð¾Ð´Ñ€Ð¾Ð±Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð½Ð°Ñ…Ð¾Ð´Ð¸Ñ‚ÑÑ Ð·Ð´ÐµÑÑŒ: [SUPPORT_SITE]."/>
+ <check_box label="Разрешить доÑтуп группе: [GROUP]" name="GroupCheck" tool_tip="Группа уÑтанавливаетÑÑ Ð½Ð° оÑновной вкладке."/>
+ <check_box label="Продать доÑтуп:" name="PassCheck" tool_tip="Разрешить временный доÑтуп к учаÑтку."/>
+ <combo_box name="pass_combo">
+ <combo_box.item label="Ð’Ñе" name="Anyone"/>
+ <combo_box.item label="Группа" name="Group"/>
+ </combo_box>
+ <spinner label="Цена в L$:" name="PriceSpin"/>
+ <spinner label="ЧаÑÑ‹ доÑтупа:" name="HoursSpin"/>
+ <panel name="Allowed_layout_panel">
+ <text label="Ð’Ñегда разрешено" name="AllowedText">
+ Допущенные жители
+ </text>
+ <name_list name="AccessList" tool_tip="([LISTED] в ÑпиÑке, [MAX] макÑимум)"/>
+ <button label="Добавить" name="add_allowed"/>
+ <button label="Удалить" label_selected="Удалить" name="remove_allowed"/>
+ </panel>
+ <panel name="Banned_layout_panel">
+ <text label="Бан" name="BanCheck">
+ Забаненные жители
+ </text>
+ <name_list name="BannedList" tool_tip="([LISTED] в ÑпиÑке, [MAX] макÑимум)"/>
+ <button label="Добавить" name="add_banned"/>
+ <button label="Удалить" label_selected="Удалить" name="remove_banned"/>
+ </panel>
+ </panel>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_activeim.xml b/indra/newview/skins/default/xui/ru/floater_activeim.xml
new file mode 100644
index 0000000000..adfa277822
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_activeim.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_activeim" title="ÐКТИВÐОЕ СООБЩЕÐИЕ"/>
diff --git a/indra/newview/skins/default/xui/ru/floater_animation_anim_preview.xml b/indra/newview/skins/default/xui/ru/floater_animation_anim_preview.xml
new file mode 100644
index 0000000000..711afc2717
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_animation_anim_preview.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Anim Preview" title="ANIMATION.ANIM">
+ <text name="name_label">
+ Ðазвание:
+ </text>
+ <text name="description_label">
+ ОпиÑание:
+ </text>
+ <button label="Передать (L$[AMOUNT])" name="ok_btn"/>
+ <button label="Отмена" label_selected="Отмена" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_animation_bvh_preview.xml b/indra/newview/skins/default/xui/ru/floater_animation_bvh_preview.xml
new file mode 100644
index 0000000000..8ad9d8657a
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_animation_bvh_preview.xml
@@ -0,0 +1,186 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Animation Preview">
+ <floater.string name="failed_to_initialize">
+ Ðевозможно инициализировать движение
+ </floater.string>
+ <floater.string name="anim_too_long">
+ Длина файла анимации: [LENGTH] Ñ.
+
+МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° анимации: [MAX_LENGTH] Ñ.
+ </floater.string>
+ <floater.string name="failed_file_read">
+ Ðевозможно прочитать файл анимации.
+
+[STATUS]
+ </floater.string>
+ <floater.string name="E_ST_OK">
+ ОК
+ </floater.string>
+ <floater.string name="E_ST_EOF">
+ Преждевременный конец файла.
+ </floater.string>
+ <floater.string name="E_ST_NO_CONSTRAINT">
+ Ðе могу прочитать определение ограничений.
+ </floater.string>
+ <floater.string name="E_ST_NO_FILE">
+ Ðе удалоÑÑŒ открыть BVH-файл.
+ </floater.string>
+ <floater.string name="E_ST_NO_HIER">
+ Ðеправильный заголовок HIERARCHY.
+ </floater.string>
+ <floater.string name="E_ST_NO_JOINT">
+ Ðе удалоÑÑŒ найти ROOT или JOINT.
+ </floater.string>
+ <floater.string name="E_ST_NO_NAME">
+ Ðе удалоÑÑŒ получить Ð¸Ð¼Ñ JOINT.
+ </floater.string>
+ <floater.string name="E_ST_NO_OFFSET">
+ Ðе удалоÑÑŒ найти OFFSET.
+ </floater.string>
+ <floater.string name="E_ST_NO_CHANNELS">
+ Ðе удалоÑÑŒ найти CHANNELS.
+ </floater.string>
+ <floater.string name="E_ST_NO_ROTATION">
+ Ðе удалоÑÑŒ получить порÑдок вращениÑ.
+ </floater.string>
+ <floater.string name="E_ST_NO_AXIS">
+ Ðе удалоÑÑŒ получить оÑи вращениÑ.
+ </floater.string>
+ <floater.string name="E_ST_NO_MOTION">
+ Ðе удалоÑÑŒ найти MOTION.
+ </floater.string>
+ <floater.string name="E_ST_NO_FRAMES">
+ Ðе удалоÑÑŒ получить количеÑтво кадров.
+ </floater.string>
+ <floater.string name="E_ST_NO_FRAME_TIME">
+ Ðе удалоÑÑŒ получить Ð²Ñ€ÐµÐ¼Ñ ÐºÐ°Ð´Ñ€Ð°.
+ </floater.string>
+ <floater.string name="E_ST_NO_POS">
+ Ðе удалоÑÑŒ получить Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ position.
+ </floater.string>
+ <floater.string name="E_ST_NO_ROT">
+ Ðе удалоÑÑŒ получить Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ rotation.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_FILE">
+ Ðе удалоÑÑŒ открыть файл перевода.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_HEADER">
+ Ðе удалоÑÑŒ прочитать заголовок перевода.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_NAME">
+ Ðе удалоÑÑŒ прочитать имена перевода.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_IGNORE">
+ Ðе удалоÑÑŒ прочитать значение перевода ignore.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_RELATIVE">
+ Ðе удалоÑÑŒ прочитать значение перевода relative.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_OUTNAME">
+ Ðе удалоÑÑŒ прочитать значение перевода outname.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MATRIX">
+ Ðе удалоÑÑŒ прочитать матрицу перевода.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MERGECHILD">
+ Ðе удалоÑÑŒ получить Ð¸Ð¼Ñ mergechild.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MERGEPARENT">
+ Ðе удалоÑÑŒ получить Ð¸Ð¼Ñ mergeparent.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_PRIORITY">
+ Ðе удалоÑÑŒ получить значение priority.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_LOOP">
+ Ðе удалоÑÑŒ получить значение loop.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EASEIN">
+ Ðе удалоÑÑŒ получить Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ easeIn.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EASEOUT">
+ Ðе удалоÑÑŒ получить Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ easeOut.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_HAND">
+ Ðе удалоÑÑŒ получить значение hand morph.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EMOTE">
+ Ðе удалоÑÑŒ прочитать Ð¸Ð¼Ñ emote.
+ </floater.string>
+ <floater.string name="E_ST_BAD_ROOT">
+ Ðеверное Ð¸Ð¼Ñ ÐºÐ¾Ñ€Ð½ÐµÐ²Ð¾Ð³Ð¾ ÑоединениÑ, должно быть «hip».
+ </floater.string>
+ <text name="name_label">
+ Ðазвание:
+ </text>
+ <text name="description_label">
+ ОпиÑание:
+ </text>
+ <spinner label="Приоритет" name="priority" tool_tip="УправлÑет тем, как другие анимации могут перекрыватьÑÑ Ñтой"/>
+ <check_box label="Цикл" name="loop_check" tool_tip="Делает анимацию зацикленной"/>
+ <spinner label="Ðачало(%)" name="loop_in_point" tool_tip="УÑтанавливает точку возврата цикла"/>
+ <spinner label="Конец(%)" name="loop_out_point" tool_tip="УÑтанавливает точку конца цикла"/>
+ <text name="hand_label">
+ Положение пальцев
+ </text>
+ <combo_box name="hand_pose_combo" tool_tip="Контролирует положение пальцев во Ð²Ñ€ÐµÐ¼Ñ Ð°Ð½Ð¸Ð¼Ð°Ñ†Ð¸Ð¸">
+ <combo_box.item label="Разведены" name="Spread"/>
+ <combo_box.item label="РаÑÑлаблены" name="Relaxed"/>
+ <combo_box.item label="Указывают" name="PointBoth"/>
+ <combo_box.item label="Сжаты в кулак" name="Fist"/>
+ <combo_box.item label="Левые раÑÑлаблены" name="RelaxedLeft"/>
+ <combo_box.item label="Левые указывают" name="PointLeft"/>
+ <combo_box.item label="Левые в кулак" name="FistLeft"/>
+ <combo_box.item label="Правые раÑÑлаблены" name="RelaxedRight"/>
+ <combo_box.item label="Правые указывают" name="PointRight"/>
+ <combo_box.item label="Правые в кулак" name="FistRight"/>
+ <combo_box.item label="Правые в приветÑтвии" name="SaluteRight"/>
+ <combo_box.item label="Печатают" name="Typing"/>
+ <combo_box.item label="Правые «V»" name="PeaceRight"/>
+ </combo_box>
+ <text name="emote_label">
+ Выражение лица
+ </text>
+ <combo_box name="emote_combo" tool_tip="Контролирует выражение лица во Ð²Ñ€ÐµÐ¼Ñ Ð°Ð½Ð¸Ð¼Ð°Ñ†Ð¸Ð¸">
+ <item label="(нет)" name="[None]" value=""/>
+ <item label="Ðаааах" name="Aaaaah" value="Ðаааах"/>
+ <item label="БоитÑÑ" name="Afraid" value="БоитÑÑ"/>
+ <item label="ЗлитÑÑ" name="Angry" value="ЗлитÑÑ"/>
+ <item label="Широко улыбаетÑÑ" name="BigSmile" value="Широко улыбаетÑÑ"/>
+ <item label="Скучает" name="Bored" value="Скучает"/>
+ <item label="Плачет" name="Cry" value="Плачет"/>
+ <item label="Презирает" name="Disdain" value="Презирает"/>
+ <item label="СмущаетÑÑ" name="Embarrassed" value="СмущаетÑÑ"/>
+ <item label="ХмуритÑÑ" name="Frown" value="ХмуритÑÑ"/>
+ <item label="Целует" name="Kiss" value="Целует"/>
+ <item label="СмеетÑÑ" name="Laugh" value="СмеетÑÑ"/>
+ <item label="ДразнитÑÑ" name="Plllppt" value="ДразнитÑÑ"/>
+ <item label="Ðе ÑоглашаетÑÑ" name="Repulsed" value="Ðе ÑоглашаетÑÑ"/>
+ <item label="ГруÑтит" name="Sad" value="ГруÑтит"/>
+ <item label="Ðе понимает" name="Shrug" value="Ðе понимает"/>
+ <item label="УлыбаетÑÑ" name="Smile" value="УлыбаетÑÑ"/>
+ <item label="УдивлÑетÑÑ" name="Surprise" value="УдивлÑетÑÑ"/>
+ <item label="Подмигивает" name="Wink" value="Подмигивает"/>
+ <item label="БеÑпокоитÑÑ" name="Worry" value="БеÑпокоитÑÑ"/>
+ </combo_box>
+ <text name="preview_label">
+ ПроÑмотр во времÑ
+ </text>
+ <combo_box name="preview_base_anim" tool_tip="ПроÑмотр вашей анимации во Ð²Ñ€ÐµÐ¼Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð°Ð²Ð°Ñ‚Ð°Ñ€Ð¾Ð¼ дейÑтвий.">
+ <item label="СтоÑние" name="Standing" value="СтоÑние"/>
+ <item label="Ходьба" name="Walking" value="Ходьба"/>
+ <item label="Сидение" name="Sitting" value="Сидение"/>
+ <item label="Полет" name="Flying" value="Полет"/>
+ </combo_box>
+ <spinner label="Вход (Ñек.)" name="ease_in_time" tool_tip="КоличеÑтво времени (в Ñекундах) Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ð° в Ñтартовое положение"/>
+ <spinner label="Выход (Ñек.)" name="ease_out_time" tool_tip="КоличеÑтво времени (в Ñекундах) Ð´Ð»Ñ Ð²Ñ‹Ñ…Ð¾Ð´Ð° из анимации"/>
+ <button name="play_btn" tool_tip="Проиграть анимацию"/>
+ <button name="pause_btn" tool_tip="ПриоÑтановить анимацию"/>
+ <button name="stop_btn" tool_tip="ОÑтановить проигрывание анимации"/>
+ <text name="bad_animation_text">
+ Ðевозможно прочитать файл анимации.
+
+РекомендуетÑÑ Ð¸Ñпользовать BVH-файлы, ÑкÑпортированные из Poser 4.
+ </text>
+ <button label="Передать (L$[AMOUNT])" name="ok_btn"/>
+ <button label="Отмена" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_animation_preview.xml b/indra/newview/skins/default/xui/ru/floater_animation_preview.xml
new file mode 100644
index 0000000000..b7075fbf97
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_animation_preview.xml
@@ -0,0 +1,183 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Animation Preview">
+ <floater.string name="failed_to_initialize">
+ Ðевозможно инициализировать движение
+ </floater.string>
+ <floater.string name="anim_too_long">
+ Длина файла анимации: [LENGTH] Ñ.
+МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° анимации: [MAX_LENGTH] Ñ.
+ </floater.string>
+ <floater.string name="failed_file_read">
+ Ðевозможно прочитать файл анимации.
+[STATUS]
+ </floater.string>
+ <floater.string name="E_ST_OK">
+ ОК
+ </floater.string>
+ <floater.string name="E_ST_EOF">
+ Преждевременный конец файла.
+ </floater.string>
+ <floater.string name="E_ST_NO_CONSTRAINT">
+ Ðе могу прочитать определение ограничений.
+ </floater.string>
+ <floater.string name="E_ST_NO_FILE">
+ Ðе удалоÑÑŒ открыть BVH-файл.
+ </floater.string>
+ <floater.string name="E_ST_NO_HIER">
+ Ðеправильный заголовок HIERARCHY.
+ </floater.string>
+ <floater.string name="E_ST_NO_JOINT">
+ Ðе удалоÑÑŒ найти ROOT или JOINT.
+ </floater.string>
+ <floater.string name="E_ST_NO_NAME">
+ Ðе удалоÑÑŒ получить Ð¸Ð¼Ñ JOINT.
+ </floater.string>
+ <floater.string name="E_ST_NO_OFFSET">
+ Ðе удалоÑÑŒ найти OFFSET.
+ </floater.string>
+ <floater.string name="E_ST_NO_CHANNELS">
+ Ðе удалоÑÑŒ найти CHANNELS.
+ </floater.string>
+ <floater.string name="E_ST_NO_ROTATION">
+ Ðе удалоÑÑŒ получить порÑдок вращениÑ.
+ </floater.string>
+ <floater.string name="E_ST_NO_AXIS">
+ Ðе удалоÑÑŒ получить оÑи вращениÑ.
+ </floater.string>
+ <floater.string name="E_ST_NO_MOTION">
+ Ðе удалоÑÑŒ найти MOTION.
+ </floater.string>
+ <floater.string name="E_ST_NO_FRAMES">
+ Ðе удалоÑÑŒ получить количеÑтво кадров.
+ </floater.string>
+ <floater.string name="E_ST_NO_FRAME_TIME">
+ Ðе удалоÑÑŒ получить Ð²Ñ€ÐµÐ¼Ñ ÐºÐ°Ð´Ñ€Ð°.
+ </floater.string>
+ <floater.string name="E_ST_NO_POS">
+ Ðе удалоÑÑŒ получить Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ position.
+ </floater.string>
+ <floater.string name="E_ST_NO_ROT">
+ Ðе удалоÑÑŒ получить Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ rotation.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_FILE">
+ Ðе удалоÑÑŒ открыть файл перевода.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_HEADER">
+ Ðе удалоÑÑŒ прочитать заголовок перевода.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_NAME">
+ Ðе удалоÑÑŒ прочитать имена перевода.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_IGNORE">
+ Ðе удалоÑÑŒ прочитать значение перевода ignore.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_RELATIVE">
+ Ðе удалоÑÑŒ прочитать значение перевода relative.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_OUTNAME">
+ Ðе удалоÑÑŒ прочитать значение перевода outname.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MATRIX">
+ Ðе удалоÑÑŒ прочитать матрицу перевода.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MERGECHILD">
+ Ðе удалоÑÑŒ получить Ð¸Ð¼Ñ mergechild.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MERGEPARENT">
+ Ðе удалоÑÑŒ получить Ð¸Ð¼Ñ mergeparent.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_PRIORITY">
+ Ðе удалоÑÑŒ получить значение priority.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_LOOP">
+ Ðе удалоÑÑŒ получить значение loop.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EASEIN">
+ Ðе удалоÑÑŒ получить Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ easeIn.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EASEOUT">
+ Ðе удалоÑÑŒ получить Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ easeOut.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_HAND">
+ Ðе удалоÑÑŒ получить значение hand morph.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EMOTE">
+ Ðе удалоÑÑŒ прочитать Ð¸Ð¼Ñ emote.
+ </floater.string>
+ <floater.string name="E_ST_BAD_ROOT">
+ Ðеверное Ð¸Ð¼Ñ ÐºÐ¾Ñ€Ð½ÐµÐ²Ð¾Ð³Ð¾ ÑоединениÑ, должно быть «hip».
+ </floater.string>
+ <text name="name_label">
+ Ðазвание:
+ </text>
+ <text name="description_label">
+ ОпиÑание:
+ </text>
+ <spinner label="Приоритет" name="priority" tool_tip="УправлÑет тем, как другие анимации могут перекрыватьÑÑ Ñтой"/>
+ <check_box label="Цикл" name="loop_check" tool_tip="Делает анимацию зацикленной"/>
+ <spinner label="Ðачало(%)" name="loop_in_point" tool_tip="УÑтанавливает точку возврата цикла"/>
+ <spinner label="Конец(%)" name="loop_out_point" tool_tip="УÑтанавливает точку конца цикла"/>
+ <text name="hand_label">
+ Положение пальцев
+ </text>
+ <combo_box name="hand_pose_combo" tool_tip="Контролирует положение пальцев во Ð²Ñ€ÐµÐ¼Ñ Ð°Ð½Ð¸Ð¼Ð°Ñ†Ð¸Ð¸">
+ <combo_box.item label="Разведены" name="Spread"/>
+ <combo_box.item label="РаÑÑлаблены" name="Relaxed"/>
+ <combo_box.item label="Указывают" name="PointBoth"/>
+ <combo_box.item label="Сжаты в кулаки" name="Fist"/>
+ <combo_box.item label="Левые раÑÑлаблены" name="RelaxedLeft"/>
+ <combo_box.item label="Левые указывают" name="PointLeft"/>
+ <combo_box.item label="Левые в кулак" name="FistLeft"/>
+ <combo_box.item label="Правые раÑÑлаблены" name="RelaxedRight"/>
+ <combo_box.item label="Правые указывают" name="PointRight"/>
+ <combo_box.item label="Правые в кулак" name="FistRight"/>
+ <combo_box.item label="Правые в приветÑтвии" name="SaluteRight"/>
+ <combo_box.item label="Печатают" name="Typing"/>
+ <combo_box.item label="Правые «V»" name="PeaceRight"/>
+ </combo_box>
+ <text name="emote_label">
+ Выражение лица
+ </text>
+ <combo_box name="emote_combo" tool_tip="Контролирует выражение лица во Ð²Ñ€ÐµÐ¼Ñ Ð°Ð½Ð¸Ð¼Ð°Ñ†Ð¸Ð¸">
+ <item label="(нет)" name="[None]" value=""/>
+ <item label="Ðаааах" name="Aaaaah" value="Ðаааах"/>
+ <item label="БоитÑÑ" name="Afraid" value="БоитÑÑ"/>
+ <item label="ЗлитÑÑ" name="Angry" value="ЗлитÑÑ"/>
+ <item label="Широко улыбаетÑÑ" name="BigSmile" value="Широко улыбаетÑÑ"/>
+ <item label="Скучает" name="Bored" value="Скучает"/>
+ <item label="Плачет" name="Cry" value="Плачет"/>
+ <item label="Презирает" name="Disdain" value="Презирает"/>
+ <item label="СмущаетÑÑ" name="Embarrassed" value="СмущаетÑÑ"/>
+ <item label="ХмуритÑÑ" name="Frown" value="ХмуритÑÑ"/>
+ <item label="Целует" name="Kiss" value="Целует"/>
+ <item label="СмеетÑÑ" name="Laugh" value="СмеетÑÑ"/>
+ <item label="ДразнитÑÑ" name="Plllppt" value="ДразнитÑÑ"/>
+ <item label="Ðе ÑоглашаетÑÑ" name="Repulsed" value="Ðе ÑоглашаетÑÑ"/>
+ <item label="ГруÑтит" name="Sad" value="ГруÑтит"/>
+ <item label="Ðе понимает" name="Shrug" value="Ðе понимает"/>
+ <item label="УлыбаетÑÑ" name="Smile" value="УлыбаетÑÑ"/>
+ <item label="УдивлÑетÑÑ" name="Surprise" value="УдивлÑетÑÑ"/>
+ <item label="Подмигивает" name="Wink" value="Подмигивает"/>
+ <item label="БеÑпокоитÑÑ" name="Worry" value="БеÑпокоитÑÑ"/>
+ </combo_box>
+ <text name="preview_label">
+ ПроÑмотр во времÑ
+ </text>
+ <combo_box name="preview_base_anim" tool_tip="ПроÑмотр вашей анимации во Ð²Ñ€ÐµÐ¼Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð°Ð²Ð°Ñ‚Ð°Ñ€Ð¾Ð¼ дейÑтвий.">
+ <item label="СтоÑние" name="Standing" value="СтоÑние"/>
+ <item label="Ходьба" name="Walking" value="Ходьба"/>
+ <item label="Сидение" name="Sitting" value="Сидение"/>
+ <item label="Полет" name="Flying" value="Полет"/>
+ </combo_box>
+ <spinner label="Вход (Ñек.)" name="ease_in_time" tool_tip="КоличеÑтво времени (в Ñекундах) Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ð° в Ñтартовое положение"/>
+ <spinner label="Выход (Ñек.)" name="ease_out_time" tool_tip="КоличеÑтво времени (в Ñекундах) Ð´Ð»Ñ Ð²Ñ‹Ñ…Ð¾Ð´Ð° из анимации"/>
+ <button name="play_btn" tool_tip="Проиграть анимацию"/>
+ <button name="pause_btn" tool_tip="ПриоÑтановить анимацию"/>
+ <button name="stop_btn" tool_tip="ОÑтановить проигрывание анимации"/>
+ <text name="bad_animation_text">
+ Ðевозможно прочитать файл анимации.
+РекомендуетÑÑ Ð¸Ñпользовать BVH-файлы, ÑкÑпортированные из Poser 4.
+ </text>
+ <button label="Передать (L$[AMOUNT])" name="ok_btn"/>
+ <button label="Отмена" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_auction.xml b/indra/newview/skins/default/xui/ru/floater_auction.xml
new file mode 100644
index 0000000000..d84dc2e941
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_auction.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_auction" title="ÐÐЧÐТЬ ПРОДÐЖУ ЗЕМЛИ ЛИÐДЕÐОВ">
+ <floater.string name="already for sale">
+ ÐÐµÐ»ÑŒÐ·Ñ Ð²Ñ‹Ñтавить на аукцион учаÑтки, которые уже продаютÑÑ.
+ </floater.string>
+ <check_box initial_value="иÑтина" label="Ð’ÐºÐ»ÑŽÑ‡Ð°Ñ Ð¶ÐµÐ»Ñ‚ÑƒÑŽ ограду вокруг выбранного учаÑтка" name="fence_check"/>
+ <button label="Снимок" label_selected="Снимок" name="snapshot_btn"/>
+ <button label="Купить может каждый" label_selected="Купить может каждый" name="sell_to_anyone_btn"/>
+ <button label="ОчиÑтить наÑтройки" label_selected="ОчиÑтить наÑтройки" name="reset_parcel_btn"/>
+ <button label="Ðачать аукцион" label_selected="Ðачать аукцион" name="start_auction_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_avatar.xml b/indra/newview/skins/default/xui/ru/floater_avatar.xml
new file mode 100644
index 0000000000..b480af9345
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_avatar.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Avatar" title="ВЫБЕРИТЕ ÐÐ’ÐТÐР"/>
diff --git a/indra/newview/skins/default/xui/ru/floater_avatar_picker.xml b/indra/newview/skins/default/xui/ru/floater_avatar_picker.xml
new file mode 100644
index 0000000000..edcc35d2b9
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_avatar_picker.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="avatarpicker" title="ВЫБЕРИТЕ ЖИТЕЛЯ">
+ <floater.string name="not_found">
+ ТекÑÑ‚ «[TEXT]» не найден
+ </floater.string>
+ <floater.string name="no_one_near">
+ РÑдом никого нет
+ </floater.string>
+ <floater.string name="no_results">
+ Ðет результатов
+ </floater.string>
+ <floater.string name="searching">
+ ПоиÑк...
+ </floater.string>
+ <string name="Select">
+ Выбрать
+ </string>
+ <string name="Close">
+ Закрыть
+ </string>
+ <tab_container name="ResidentChooserTabs">
+ <panel label="ПоиÑк" name="SearchPanel">
+ <text name="InstructSearchResidentName">
+ Ðаберите чаÑÑ‚ÑŒ имени жителÑ:
+ </text>
+ <button label="Перейти" label_selected="Перейти" name="Find"/>
+ <scroll_list name="SearchResults">
+ <columns label="Ðазвание" name="name"/>
+ <columns label="Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ" name="username"/>
+ </scroll_list>
+ </panel>
+ <panel label="ДрузьÑ" name="FriendsPanel">
+ <text name="InstructSelectFriend">
+ Выберите жителÑ:
+ </text>
+ </panel>
+ <panel label="РÑдом Ñо мной" name="NearMePanel">
+ <text name="InstructSelectResident">
+ Выберите Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ð¿Ð¾Ð±Ð»Ð¸Ð·Ð¾Ñти:
+ </text>
+ <slider label="РаÑÑтоÑние" name="near_me_range"/>
+ <text name="meters">
+ Метров
+ </text>
+ <scroll_list name="NearMe">
+ <columns label="Ðазвание" name="name"/>
+ <columns label="Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ" name="username"/>
+ </scroll_list>
+ </panel>
+ </tab_container>
+ <button label="ОК" label_selected="ОК" name="ok_btn"/>
+ <button label="Отмена" label_selected="Отмена" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_avatar_textures.xml b/indra/newview/skins/default/xui/ru/floater_avatar_textures.xml
new file mode 100644
index 0000000000..cb39f66247
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_avatar_textures.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="avatar_texture_debug" title="ТЕКСТУРЫ ÐÐ’ÐТÐРÐ">
+ <floater.string name="InvalidAvatar">
+ ÐЕПРÐВИЛЬÐЫЙ ÐÐ’ÐТÐР
+ </floater.string>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text name="label">
+ Сброшенные
+ТекÑтуры
+ </text>
+ <text name="composite_label">
+ Сложные
+ТекÑтуры
+ </text>
+ <button label="Вывод ID на конÑоль" label_selected="Вывод" name="Dump"/>
+ <panel name="scroll_content_panel">
+ <texture_picker label="ВолоÑÑ‹" name="hair-baked"/>
+ <texture_picker label="ВолоÑÑ‹" name="hair_grain"/>
+ <texture_picker label="Ðльфа волоÑ" name="hair_alpha"/>
+ <texture_picker label="Голова" name="head-baked"/>
+ <texture_picker label="МакиÑж" name="head_bodypaint"/>
+ <texture_picker label="Ðльфа головы" name="head_alpha"/>
+ <texture_picker label="Тату головы" name="head_tattoo"/>
+ <texture_picker label="Глаза" name="eyes-baked"/>
+ <texture_picker label="Глаз" name="eyes_iris"/>
+ <texture_picker label="Ðльфа глаз" name="eyes_alpha"/>
+ <texture_picker label="ВерхнÑÑ Ñ‡Ð°ÑÑ‚ÑŒ тела" name="upper-baked"/>
+ <texture_picker label="РаÑкраÑка верхней чаÑти тела" name="upper_bodypaint"/>
+ <texture_picker label="Майка" name="upper_undershirt"/>
+ <texture_picker label="Перчатки" name="upper_gloves"/>
+ <texture_picker label="Рубашка" name="upper_shirt"/>
+ <texture_picker label="Верх пиджака" name="upper_jacket"/>
+ <texture_picker label="Ðльфа верха" name="upper_alpha"/>
+ <texture_picker label="Тату верха" name="upper_tattoo"/>
+ <texture_picker label="ÐижнÑÑ Ñ‡Ð°ÑÑ‚ÑŒ тела" name="lower-baked"/>
+ <texture_picker label="РаÑкраÑка нижней чаÑти тела" name="lower_bodypaint"/>
+ <texture_picker label="ТруÑÑ‹" name="lower_underpants"/>
+ <texture_picker label="ÐоÑки" name="lower_socks"/>
+ <texture_picker label="Обувь" name="lower_shoes"/>
+ <texture_picker label="Брюки" name="lower_pants"/>
+ <texture_picker label="Пиджак" name="lower_jacket"/>
+ <texture_picker label="Ðльфа низа" name="lower_alpha"/>
+ <texture_picker label="Тату низа" name="lower_tattoo"/>
+ <texture_picker label="Юбка" name="skirt-baked"/>
+ <texture_picker label="Юбка" name="skirt"/>
+ </panel>
+ </panel>
+ </scroll_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_beacons.xml b/indra/newview/skins/default/xui/ru/floater_beacons.xml
new file mode 100644
index 0000000000..38d257ff81
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_beacons.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="beacons" title="МЕТКИ">
+ <panel name="beacons_panel">
+ <text name="label_show">
+ Показать:
+ </text>
+ <check_box label="Метки" name="beacons"/>
+ <check_box label="ПодÑветку" name="highlights"/>
+ <text name="beacon_width_label" tool_tip="Ширина меток">
+ Ширина:
+ </text>
+ <text name="label_objects">
+ Ð”Ð»Ñ Ñтих объектов:
+ </text>
+ <check_box label="ФизичеÑкий" name="physical"/>
+ <check_box label="Скриптовые" name="scripted"/>
+ <check_box label="Только каÑание" name="touch_only"/>
+ <check_box label="ИÑточники звука" name="sounds"/>
+ <check_box label="ИÑточники чаÑтиц" name="particles"/>
+ <check_box label="ИÑточники медиа" name="moapbeacon"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_build_options.xml b/indra/newview/skins/default/xui/ru/floater_build_options.xml
new file mode 100644
index 0000000000..9dd01dc823
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_build_options.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="build options floater" title="ÐÐСТРОЙКИ СЕТКИ">
+ <floater.string name="grid_screen_text">
+ Экран
+ </floater.string>
+ <floater.string name="grid_local_text">
+ ЛокальнаÑ
+ </floater.string>
+ <floater.string name="grid_world_text">
+ Мир
+ </floater.string>
+ <floater.string name="grid_reference_text">
+ Точка отÑчета
+ </floater.string>
+ <floater.string name="grid_attachment_text">
+ ПриÑоединение
+ </floater.string>
+ <text name="grid_mode_label" tool_tip="ПрозрачноÑÑ‚ÑŒ Ñетки">
+ Режим
+ </text>
+ <combo_box name="combobox grid mode" tool_tip="Выберите тип линейки Ñетки Ð´Ð»Ñ Ñ€Ð°Ð·Ð¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð°">
+ <combo_box.item label="Ð’ÑемирнаÑ" name="World"/>
+ <combo_box.item label="Ð›Ð¾ÐºÐ°Ð»ÑŒÐ½Ð°Ñ Ñетка" name="Local"/>
+ <combo_box.item label="ÐšÐ¾Ð¾Ñ€Ð´Ð¸Ð½Ð°Ñ‚Ð½Ð°Ñ Ñетка" name="Reference"/>
+ </combo_box>
+ <spinner label="Единицы (метры)" name="GridResolution"/>
+ <spinner label="ПроÑтранÑтво (метры)" name="GridDrawSize"/>
+ <check_box label="ПривÑзывать к ÑубъÑчейкам" name="GridSubUnit"/>
+ <check_box label="Показывать плоÑкоÑÑ‚ÑŒ переÑечениÑ" name="GridCrossSection"/>
+ <text name="grid_opacity_label" tool_tip="ПрозрачноÑÑ‚ÑŒ Ñетки">
+ ПрозрачноÑÑ‚ÑŒ:
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_bulk_perms.xml b/indra/newview/skins/default/xui/ru/floater_bulk_perms.xml
new file mode 100644
index 0000000000..ccf13cf02a
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_bulk_perms.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floaterbulkperms" title="ИЗМЕÐИТЬ РÐЗРЕШЕÐИЯ ÐРИСПОЛЬЗОВÐÐИЕ КОÐТЕÐТÐ">
+ <floater.string name="nothing_to_modify_text">
+ Ð’ выбранной облаÑти нет контента, который можно изменÑÑ‚ÑŒ.
+ </floater.string>
+ <floater.string name="status_text">
+ Задание разрешений Ð´Ð»Ñ [NAME]
+ </floater.string>
+ <floater.string name="start_text">
+ Создание запроÑа на изменение разрешений...
+ </floater.string>
+ <floater.string name="done_text">
+ Выполненные запроÑÑ‹ на изменение разрешений.
+ </floater.string>
+ <icon name="icon_animation" tool_tip="ÐнимациÑ"/>
+ <icon name="icon_bodypart" tool_tip="ЧаÑти тела"/>
+ <icon name="icon_clothing" tool_tip="Одежда"/>
+ <icon name="icon_gesture" tool_tip="ЖеÑÑ‚Ñ‹"/>
+ <icon name="icon_notecard" tool_tip="Заметки"/>
+ <icon name="icon_object" tool_tip="Объекты"/>
+ <icon name="icon_script" tool_tip="Скрипты"/>
+ <icon name="icon_sound" tool_tip="Звуки"/>
+ <icon name="icon_texture" tool_tip="ТекÑтуры"/>
+ <button label="√ Ð’Ñе" name="check_all"/>
+ <button label="ОчиÑтить" label_selected="Ðет" name="check_none"/>
+ <text name="newperms">
+ Ðовые Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð½Ð° контент
+ </text>
+ <text name="GroupLabel">
+ Группа:
+ </text>
+ <check_box label="ПоделитьÑÑ" name="share_with_group"/>
+ <text name="AnyoneLabel">
+ Ð’Ñе:
+ </text>
+ <check_box label="Копировать" name="everyone_copy"/>
+ <text name="NextOwnerLabel">
+ Следующий владелец:
+ </text>
+ <check_box label="ИзменÑÑ‚ÑŒ" name="next_owner_modify"/>
+ <check_box label="Копировать" name="next_owner_copy"/>
+ <check_box initial_value="иÑтина" label="Передать" name="next_owner_transfer" tool_tip="Следующий владелец может отдать или перепродать объект"/>
+ <button label="ОК" name="apply"/>
+ <button label="Отмена" name="close"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_bumps.xml b/indra/newview/skins/default/xui/ru/floater_bumps.xml
new file mode 100644
index 0000000000..f81f728290
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_bumps.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_bumps" title="СТОЛКÐОВЕÐИЯ, ТОЛЧКИ И УДÐРЫ">
+ <floater.string name="none_detected">
+ Ðичего не обнаружено
+ </floater.string>
+ <floater.string name="bump">
+ [TIME] [NAME] ÑтолкнулÑÑ Ñ Ð²Ð°Ð¼Ð¸
+ </floater.string>
+ <floater.string name="llpushobject">
+ [TIME] [NAME] толкнул Ð²Ð°Ñ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Ñкрипта
+ </floater.string>
+ <floater.string name="selected_object_collide">
+ [TIME] [NAME] ударил Ð²Ð°Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð¾Ð¼
+ </floater.string>
+ <floater.string name="scripted_object_collide">
+ [TIME] [NAME] ударил Ð²Ð°Ñ Ñкриптовым объектом
+ </floater.string>
+ <floater.string name="physical_object_collide">
+ [TIME] [NAME] ударил Ð²Ð°Ñ Ñ„Ð¸Ð·Ð¸Ñ‡ÐµÑким объектом
+ </floater.string>
+ <floater.string name="timeStr">
+ [[hour,datetime,slt]:[min,datetime,slt]]
+ </floater.string>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_buy_contents.xml b/indra/newview/skins/default/xui/ru/floater_buy_contents.xml
new file mode 100644
index 0000000000..b1d66ae14d
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_buy_contents.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_buy_contents" title="ПОКУПКРСОДЕРЖИМОГО">
+ <floater.string name="no_copy_text">
+ (не копируетÑÑ)
+ </floater.string>
+ <floater.string name="no_modify_text">
+ (не изменÑетÑÑ)
+ </floater.string>
+ <floater.string name="no_transfer_text">
+ (не передаетÑÑ)
+ </floater.string>
+ <text name="contains_text">
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; Ñодержит:
+ </text>
+ <text name="buy_text">
+ Купить за L$[AMOUNT] у Ð¶Ð¸Ñ‚ÐµÐ»Ñ [NAME]?
+ </text>
+ <check_box label="Ðадеть одежду ÑейчаÑ" name="wear_check"/>
+ <button label="Купить" label_selected="Купить" name="buy_btn"/>
+ <button label="Отмена" label_selected="Отмена" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_buy_currency.xml b/indra/newview/skins/default/xui/ru/floater_buy_currency.xml
new file mode 100644
index 0000000000..87e8bd524e
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_buy_currency.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="buy currency" title="КУПИТЬ L$">
+ <floater.string name="buy_currency">
+ Купить L$ [LINDENS] примерно за [LOCALAMOUNT]
+ </floater.string>
+ <text name="info_need_more">
+ Вам нужно больше L$
+ </text>
+ <text name="contacting">
+ Соединение Ñ LindeX...
+ </text>
+ <text name="info_buying">
+ Купить L$
+ </text>
+ <text name="balance_label">
+ У Ð¼ÐµÐ½Ñ ÐµÑÑ‚ÑŒ
+ </text>
+ <text name="balance_amount">
+ L$ [AMT]
+ </text>
+ <text name="currency_action">
+ Я хочу купить
+ </text>
+ <text name="currency_label">
+ L$
+ </text>
+ <line_editor label="L$" name="currency_amt">
+ 1234
+ </line_editor>
+ <text name="buying_label">
+ По цене
+ </text>
+ <text name="currency_est">
+ примерно [LOCALAMOUNT]
+ </text>
+ <text name="getting_data">
+ ПодÑчет...
+ </text>
+ <text name="buy_action">
+ [ACTION]
+ </text>
+ <text name="total_label">
+ Мой новый Ð±Ð°Ð»Ð°Ð½Ñ Ð±ÑƒÐ´ÐµÑ‚
+ </text>
+ <text name="total_amount">
+ L$ [AMT]
+ </text>
+ <text name="currency_links">
+ [http://www.secondlife.com/my/account/payment_method_management.php ÑпоÑоб оплаты] | [http://www.secondlife.com/my/account/currency.php деньги]
+ </text>
+ <text name="exchange_rate_note">
+ Повторно введите Ñумму, чтобы увидеть новый обменный курÑ.
+ </text>
+ <text name="purchase_warning_repurchase">
+ Подтверждение Ñтой Ñделки приведет к покупке L$, а не объектов.
+ </text>
+ <text name="purchase_warning_notenough">
+ Ð’Ñ‹ не приобрели доÑтаточного количеÑтва L$. Увеличьте количеÑтво.
+ </text>
+ <button label="ПриобреÑти" name="buy_btn"/>
+ <button label="Отмена" name="cancel_btn"/>
+ <text name="info_cannot_buy">
+ ÐÐµÐ»ÑŒÐ·Ñ ÐºÑƒÐ¿Ð¸Ñ‚ÑŒ
+ </text>
+ <button label="Продолжить в Интернете" name="error_web"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_buy_currency_html.xml b/indra/newview/skins/default/xui/ru/floater_buy_currency_html.xml
new file mode 100644
index 0000000000..ac8ad469fb
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_buy_currency_html.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_buy_currency_html" title="КУПИТЬ Ð’ÐЛЮТУ"/>
diff --git a/indra/newview/skins/default/xui/ru/floater_buy_land.xml b/indra/newview/skins/default/xui/ru/floater_buy_land.xml
new file mode 100644
index 0000000000..907a795393
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_buy_land.xml
@@ -0,0 +1,233 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="buy land" title="КУПИТЬ ЗЕМЛЮ">
+ <floater.string name="can_resell">
+ Может быть перепродана.
+ </floater.string>
+ <floater.string name="can_not_resell">
+ Ðе может быть перепродана.
+ </floater.string>
+ <floater.string name="can_change">
+ Может быть объединена или разделена.
+ </floater.string>
+ <floater.string name="can_not_change">
+ Ðе может быть объединена или разделена.
+ </floater.string>
+ <floater.string name="cant_buy_for_group">
+ У Ð²Ð°Ñ Ð½ÐµÑ‚ прав на покупку земли Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ¹ активной группы.
+ </floater.string>
+ <floater.string name="no_land_selected">
+ Ðет выбранной земли.
+ </floater.string>
+ <floater.string name="multiple_parcels_selected">
+ Выбрано неÑколько разных учаÑтков.
+Попробуйте выбрать облаÑÑ‚ÑŒ поменьше.
+ </floater.string>
+ <floater.string name="no_permission">
+ У Ð²Ð°Ñ Ð½ÐµÑ‚ прав на покупку земли Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ¹ активной группы.
+ </floater.string>
+ <floater.string name="parcel_not_for_sale">
+ Выбранный учаÑток земли не Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð°Ð¶Ð¸.
+ </floater.string>
+ <floater.string name="group_already_owns">
+ Группа уже владеет учаÑтком.
+ </floater.string>
+ <floater.string name="you_already_own">
+ Ð’Ñ‹ уже владеете учаÑтком.
+ </floater.string>
+ <floater.string name="set_to_sell_to_other">
+ Выбранный учаÑток земли выÑтавлен на продажу Ð´Ð»Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… людей.
+ </floater.string>
+ <floater.string name="no_public_land">
+ Ð’ выбранной облаÑти нет публичных земель.
+ </floater.string>
+ <floater.string name="not_owned_by_you">
+ Выбрана землÑ, Ð¿Ñ€Ð¸Ð½Ð°Ð´Ð»ÐµÐ¶Ð°Ñ‰Ð°Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð¼Ñƒ жителю.
+Попробуйте выбрать облаÑÑ‚ÑŒ поменьше.
+ </floater.string>
+ <floater.string name="processing">
+ Обработка вашей покупки...
+
+(Ñто может занÑÑ‚ÑŒ неÑколько минут).
+ </floater.string>
+ <floater.string name="fetching_error">
+ Возникла ошибка при запроÑе информации о покупке земли.
+ </floater.string>
+ <floater.string name="buying_will">
+ Покупка Ñтой земли будет:
+ </floater.string>
+ <floater.string name="buying_for_group">
+ Покупка земли Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹ будет:
+ </floater.string>
+ <floater.string name="cannot_buy_now">
+ Ð¡ÐµÐ¹Ñ‡Ð°Ñ ÐºÑƒÐ¿Ð¸Ñ‚ÑŒ нельзÑ:
+ </floater.string>
+ <floater.string name="not_for_sale">
+ Ðе Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð°Ð¶Ð¸:
+ </floater.string>
+ <floater.string name="none_needed">
+ не требуетÑÑ
+ </floater.string>
+ <floater.string name="must_upgrade">
+ Ваш аккаунт должен быть улучшен Ð´Ð»Ñ ÑпоÑобноÑти Ð²Ð»Ð°Ð´ÐµÐ½Ð¸Ñ Ð·ÐµÐ¼Ð»ÐµÐ¹.
+ </floater.string>
+ <floater.string name="cant_own_land">
+ Ваш аккаунт позволÑет владеть землей.
+ </floater.string>
+ <floater.string name="land_holdings">
+ Вы владеете [BUYER] м² земли.
+ </floater.string>
+ <floater.string name="pay_to_for_land">
+ Заплатить продавцу [SELLER] L$[AMOUNT] за Ñту землю
+ </floater.string>
+ <floater.string name="buy_for_US">
+ Купить L$ [AMOUNT] примерно за [LOCAL_AMOUNT],
+ </floater.string>
+ <floater.string name="parcel_meters">
+ Размер учаÑтка – [AMOUNT] м²
+ </floater.string>
+ <floater.string name="premium_land">
+ Эта Ð·ÐµÐ¼Ð»Ñ â€“ премиум-клаÑÑа, и будет заÑчитана как [AMOUNT] м².
+ </floater.string>
+ <floater.string name="discounted_land">
+ Эта Ð·ÐµÐ¼Ð»Ñ Ñо Ñкидкой, и будет заÑчитана как [AMOUNT] м².
+ </floater.string>
+ <floater.string name="meters_supports_object">
+ [AMOUNT] м²
+поддерживает [AMOUNT2] объектов
+ </floater.string>
+ <floater.string name="sold_with_objects">
+ продано Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð°Ð¼Ð¸
+ </floater.string>
+ <floater.string name="sold_without_objects">
+ объекты не включены
+ </floater.string>
+ <floater.string name="info_price_string">
+ L$ [PRICE]
+(L$ [PRICE_PER_SQM]/м²)
+[SOLD_WITH_OBJECTS]
+ </floater.string>
+ <floater.string name="insufficient_land_credits">
+ Группе [GROUP] понадобитÑÑ Ð²Ñ‹Ð¿Ð»Ð°Ñ‚Ð¸Ñ‚ÑŒ доÑтаточную Ñумму Ð´Ð»Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¸ Ñтой земли, чтобы покрыть учаÑток до Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð¿Ð¾ÐºÑƒÐ¿ÐºÐ¸.
+ </floater.string>
+ <floater.string name="have_enough_lindens">
+ У Ð²Ð°Ñ ÐµÑÑ‚ÑŒ L$ [AMOUNT], которых доÑтаточно Ð´Ð»Ñ Ð¿Ð¾ÐºÑƒÐ¿ÐºÐ¸ Ñтой земли.
+ </floater.string>
+ <floater.string name="not_enough_lindens">
+ У Ð²Ð°Ñ ÐµÑÑ‚ÑŒ только L$ [AMOUNT], не хватает L$ [AMOUNT2].
+ </floater.string>
+ <floater.string name="balance_left">
+ ПоÑле покупки у Ð²Ð°Ñ Ð¾ÑтанетÑÑ L$ [AMOUNT].
+ </floater.string>
+ <floater.string name="balance_needed">
+ Вам нужно приобреÑти как минимум L$ [AMOUNT], чтобы позволить Ñебе Ñту землю.
+ </floater.string>
+ <floater.string name="no_parcel_selected">
+ (учаÑток не выбран)
+ </floater.string>
+ <text name="region_name_label">
+ Регион:
+ </text>
+ <text name="region_name_text">
+ (неизвеÑтно)
+ </text>
+ <text name="region_type_label">
+ Тип:
+ </text>
+ <text name="region_type_text">
+ (неизвеÑтно)
+ </text>
+ <text name="estate_name_label">
+ Землевладение:
+ </text>
+ <text name="estate_name_text">
+ (неизвеÑтно)
+ </text>
+ <text name="estate_owner_label">
+ Землевладелец:
+ </text>
+ <text name="estate_owner_text">
+ (неизвеÑтно)
+ </text>
+ <text name="resellable_changeable_label">
+ ÐŸÑ€Ð¸Ð¾Ð±Ñ€ÐµÑ‚ÐµÐ½Ð½Ð°Ñ Ð² Ñтом регионе землÑ:
+ </text>
+ <text name="resellable_clause">
+ Может или не может быть перепродана.
+ </text>
+ <text name="changeable_clause">
+ Может или не может быть объединена или разделена.
+ </text>
+ <text name="covenant_text">
+ Ð’Ñ‹ должны принÑÑ‚ÑŒ Ñоглашение по землевладению:
+ </text>
+ <text_editor name="covenant_editor">
+ Загрузка...
+ </text_editor>
+ <check_box label="Я принимаю Ñоглашение, определенное выше." name="agree_covenant"/>
+ <text name="info_parcel_label">
+ УчаÑток:
+ </text>
+ <text name="info_parcel">
+ Scotopteryx 138,204
+ </text>
+ <text name="info_size_label">
+ Размер:
+ </text>
+ <text name="info_size">
+ 1024 м²
+ </text>
+ <text name="info_price_label">
+ Цена:
+ </text>
+ <text name="info_price">
+ L$ 1500
+(L$ 1,1/м²)
+продано Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð°Ð¼Ð¸
+ </text>
+ <text name="info_action">
+ Покупка Ñтой земли будет:
+ </text>
+ <text name="error_message">
+ Что-то не правильно.
+ </text>
+ <button label="Перейти на Ñайт" name="error_web"/>
+ <text name="account_action">
+ Улучшить ваш аккаунт до ÑƒÑ€Ð¾Ð²Ð½Ñ Premium.
+ </text>
+ <text name="account_reason">
+ Только премиум-учаÑтники могут владеть землей.
+ </text>
+ <combo_box name="account_level">
+ <combo_box.item label="9,95 долл. СШÐ/меÑ, оплачиваетÑÑ ÐµÐ¶ÐµÐ¼ÐµÑÑчно" name="US$9.95/month,billedmonthly"/>
+ <combo_box.item label="7,50 долл. СШÐ/меÑ, оплачиваетÑÑ ÐµÐ¶ÐµÐºÐ²Ð°Ñ€Ñ‚Ð°Ð»ÑŒÐ½Ð¾" name="US$7.50/month,billedquarterly"/>
+ <combo_box.item label="6,00 долл. СШÐ/меÑ, оплачиваетÑÑ ÐµÐ¶ÐµÐ³Ð¾Ð´Ð½Ð¾" name="US$6.00/month,billedannually"/>
+ </combo_box>
+ <text name="land_use_action">
+ Увеличит вашу меÑÑчную оплату на US$ 40/меÑ.
+ </text>
+ <text name="land_use_reason">
+ Вы владеете 1309 м² земли.
+Ð’ Ñтом учаÑтке 512 м² земли.
+ </text>
+ <text name="purchase_action">
+ Заплатить жителю Joe L$ 4000 за землю
+ </text>
+ <text name="currency_reason">
+ У Ð²Ð°Ñ L$ 2100.
+ </text>
+ <text name="currency_action">
+ Покупка L$
+ </text>
+ <line_editor name="currency_amt">
+ 1000
+ </line_editor>
+ <text name="currency_est">
+ обойдетÑÑ Ð¿Ñ€Ð¸Ð¼ÐµÑ€Ð½Ð¾ в [LOCAL_AMOUNT]
+ </text>
+ <text name="currency_balance">
+ У Ð²Ð°Ñ L$ 2100.
+ </text>
+ <check_box label="Удалить [AMOUNT] м² взноÑа из группы." name="remove_contribution"/>
+ <button label="Покупка" name="buy_btn"/>
+ <button label="Отмена" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_buy_object.xml b/indra/newview/skins/default/xui/ru/floater_buy_object.xml
new file mode 100644
index 0000000000..d25f9eccc2
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_buy_object.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="contents" title="КУПИТЬ КОПИЮ ОБЪЕКТÐ">
+ <floater.string name="title_buy_text">
+ Купить
+ </floater.string>
+ <floater.string name="title_buy_copy_text">
+ Купить копию
+ </floater.string>
+ <floater.string name="no_copy_text">
+ (не копируетÑÑ)
+ </floater.string>
+ <floater.string name="no_modify_text">
+ (не изменÑетÑÑ)
+ </floater.string>
+ <floater.string name="no_transfer_text">
+ (не передаетÑÑ)
+ </floater.string>
+ <text name="contents_text">
+ Содержимое:
+ </text>
+ <text name="buy_text">
+ Купить за L$[AMOUNT] у пользователÑ:
+ </text>
+ <text name="buy_name_text">
+ [NAME]?
+ </text>
+ <button label="Купить" label_selected="Купить" name="buy_btn"/>
+ <button label="Отмена" label_selected="Отмена" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_camera.xml b/indra/newview/skins/default/xui/ru/floater_camera.xml
new file mode 100644
index 0000000000..52e7c62e06
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_camera.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="camera_floater" title="УПРÐВЛЕÐИЕ КÐМЕРОЙ">
+ <floater.string name="rotate_tooltip">
+ Повернуть камеру вокруг точки фокуÑировки
+ </floater.string>
+ <floater.string name="zoom_tooltip">
+ Приблизить/отдалить камеру отноÑительно точки фокуÑировки
+ </floater.string>
+ <floater.string name="move_tooltip">
+ ПеремеÑтить камеру вверх, вниз, влево или вправо
+ </floater.string>
+ <floater.string name="free_mode_title">
+ Смотреть на объект
+ </floater.string>
+ <panel name="controls">
+ <panel name="preset_views_list">
+ <panel_camera_item name="front_view">
+ <panel_camera_item.text name="front_view_text">
+ Вид Ñпереди
+ </panel_camera_item.text>
+ </panel_camera_item>
+ <panel_camera_item name="group_view">
+ <panel_camera_item.text name="side_view_text">
+ Вид Ñбоку
+ </panel_camera_item.text>
+ </panel_camera_item>
+ <panel_camera_item name="rear_view">
+ <panel_camera_item.text name="rear_view_text">
+ Вид Ñзади
+ </panel_camera_item.text>
+ </panel_camera_item>
+ </panel>
+ <panel name="camera_modes_list">
+ <panel_camera_item name="object_view">
+ <panel_camera_item.text name="object_view_text">
+ ОÑмотр объекта
+ </panel_camera_item.text>
+ </panel_camera_item>
+ <panel_camera_item name="mouselook_view">
+ <panel_camera_item.text name="mouselook_view_text">
+ Обзор Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ мыши
+ </panel_camera_item.text>
+ </panel_camera_item>
+ </panel>
+ <panel name="zoom">
+ <joystick_rotate name="cam_rotate_stick" tool_tip="Повернуть камеру вокруг точки фокуÑировки"/>
+ <slider_bar name="zoom_slider" tool_tip="Приблизить/отдалить камеру отноÑительно точки фокуÑировки"/>
+ <joystick_track name="cam_track_stick" tool_tip="ПеремеÑтить камеру вверх, вниз, влево или вправо"/>
+ </panel>
+ </panel>
+ <panel name="buttons">
+ <button label="" name="presets_btn" tool_tip="Стандартные наÑтройки"/>
+ <button label="" name="pan_btn" tool_tip="Вращение, приближение, Ñдвиг"/>
+ <button label="" name="avatarview_btn" tool_tip="Режимы камеры"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_chat_bar.xml b/indra/newview/skins/default/xui/ru/floater_chat_bar.xml
new file mode 100644
index 0000000000..79b7b033fb
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_chat_bar.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="chat_bar" title="ЛОКÐЛЬÐЫЙ ЧÐТ">
+ <panel name="bottom_panel">
+ <line_editor label="Щелкните здеÑÑŒ Ð´Ð»Ñ Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ." name="chat_box" tool_tip="Ðажмите Enter, чтобы Ñказать, Ctrl+Enter, чтобы прокричать"/>
+ <button name="show_nearby_chat" tool_tip="Показать/Ñкрыть лог локального чата"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_choose_group.xml b/indra/newview/skins/default/xui/ru/floater_choose_group.xml
new file mode 100644
index 0000000000..ab8350f539
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_choose_group.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="groups" title="ГРУППЫ">
+ <text name="groupdesc">
+ Выберите группу:
+ </text>
+ <button label="OK" label_selected="OK" name="OK"/>
+ <button label="Отмена" label_selected="Отмена" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_color_picker.xml b/indra/newview/skins/default/xui/ru/floater_color_picker.xml
new file mode 100644
index 0000000000..b7034bef0b
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_color_picker.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="ColorPicker" title="ВЫБОР ЦВЕТÐ">
+ <text name="r_val_text">
+ КраÑный:
+ </text>
+ <text name="g_val_text">
+ Зеленый:
+ </text>
+ <text name="b_val_text">
+ Синий:
+ </text>
+ <text name="h_val_text">
+ Оттенок:
+ </text>
+ <text name="s_val_text">
+ ÐаÑыщен.:
+ </text>
+ <text name="l_val_text">
+ ЯркоÑÑ‚ÑŒ:
+ </text>
+ <check_box label="Применить ÑейчаÑ" name="apply_immediate"/>
+ <button label="ОК" label_selected="ОК" name="select_btn"/>
+ <button label="Отмена" label_selected="Отмена" name="cancel_btn"/>
+ <text name="Current color:">
+ Текущий цвет:
+ </text>
+ <text name="(Drag below to save.)">
+ (Перетащите вниз Ð´Ð»Ñ ÑохранениÑ)
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_critical.xml b/indra/newview/skins/default/xui/ru/floater_critical.xml
new file mode 100644
index 0000000000..bc64f3a83e
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_critical.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="modal container">
+ <button label="Продолжить" label_selected="Продолжить" name="Continue"/>
+ <text name="tos_heading">
+ Внимательно прочитайте Ñледующее Ñообщение.
+ </text>
+ <text_editor name="tos_text">
+ TOS_TEXT
+ </text_editor>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_delete_env_preset.xml b/indra/newview/skins/default/xui/ru/floater_delete_env_preset.xml
new file mode 100644
index 0000000000..3303a4f4c1
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_delete_env_preset.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<floater name="Delete Env Preset" title="УДÐЛЕÐИЕ ÐÐСТРОЙКИ СРЕДЫ">
+ <string name="title_water">
+ Удалить наÑтройку воды
+ </string>
+ <string name="title_sky">
+ Удалить наÑтройку неба
+ </string>
+ <string name="title_day_cycle">
+ Удалить Ñуточный цикл
+ </string>
+ <string name="label_water">
+ ÐаÑтройка:
+ </string>
+ <string name="label_sky">
+ ÐаÑтройка:
+ </string>
+ <string name="label_day_cycle">
+ Суточный цикл:
+ </string>
+ <string name="msg_confirm_deletion">
+ ДейÑтвительно удалить выбранную наÑтройку?
+ </string>
+ <string name="msg_sky_is_referenced">
+ ÐÐµÐ»ÑŒÐ·Ñ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ наÑтройку, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¸ÑпользуетÑÑ Ð² Ñуточных циклах.
+ </string>
+ <string name="combo_label">
+ -Выбор наÑтройки-
+ </string>
+ <text name="label">
+ ÐаÑтройка:
+ </text>
+ <button label="Удалить" name="delete"/>
+ <button label="Отмена" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_destinations.xml b/indra/newview/skins/default/xui/ru/floater_destinations.xml
new file mode 100644
index 0000000000..5ba0841564
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_destinations.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Destinations" title="ПУÐКТЫ"/> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/ru/floater_display_name.xml b/indra/newview/skins/default/xui/ru/floater_display_name.xml
new file mode 100644
index 0000000000..feb8a2721f
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_display_name.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Display Name" title="СМЕÐРЭКРÐÐÐОГО ИМЕÐИ">
+ <text name="info_text">
+ ИмÑ, которое вы даете аватару, называетÑÑ Ñкранным именем. Ð’Ñ‹ можете менÑÑ‚ÑŒ его раз в неделю.
+ </text>
+ <text name="lockout_text">
+ Ð’Ñ‹ не можете менÑÑ‚ÑŒ Ñкранное Ð¸Ð¼Ñ Ð´Ð¾: [TIME].
+ </text>
+ <text name="set_name_label">
+ Ðовое Ñкранное имÑ:
+ </text>
+ <text name="name_confirm_label">
+ Ðаберите новое Ð¸Ð¼Ñ ÐµÑ‰Ðµ раз Ð´Ð»Ñ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ:
+ </text>
+ <button label="Сохранить" name="save_btn" tool_tip="Сохранить ваше новое Ñкранное имÑ"/>
+ <button label="СброÑ" name="reset_btn" tool_tip="Сменить Ñкранное Ð¸Ð¼Ñ Ð½Ð° Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ"/>
+ <button label="Отмена" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_edit_day_cycle.xml b/indra/newview/skins/default/xui/ru/floater_edit_day_cycle.xml
new file mode 100644
index 0000000000..61d708c567
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_edit_day_cycle.xml
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Edit Day cycle" title="Изменить Ñуточный цикл">
+ <string name="title_new">
+ Создать Ñуточный цикл
+ </string>
+ <string name="title_edit">
+ Изменить Ñуточный цикл
+ </string>
+ <string name="hint_new">
+ Введите Ð¸Ð¼Ñ Ñуточного цикла, задайте его параметры Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Ñлементов ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸ нажмите кнопку «Сохранить».
+ </string>
+ <string name="hint_edit">
+ Чтобы изменить Ñуточный цикл, задайте его параметры Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Ñлементов ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ð¸Ð¶Ðµ и нажмите кнопку «Сохранить».
+ </string>
+ <string name="combo_label">
+ -Выбор наÑтройки-
+ </string>
+ <text name="label">
+ Ð˜Ð¼Ñ Ð½Ð°Ñтройки:
+ </text>
+ <text name="note">
+ Примечание. ЕÑли изменить Ð¸Ð¼Ñ Ð½Ð°Ñтройки, будет Ñоздана Ð½Ð¾Ð²Ð°Ñ Ð½Ð°Ñтройка, а Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² ÑущеÑтвующей не будут Ñохранены.
+ </text>
+ <text name="hint_item1">
+ - Ð”Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½Ð°Ñтроек неба и времени выберите ÑоответÑтвующую вкладку.
+ </text>
+ <text name="hint_item2">
+ - Чтобы задать Ð²Ñ€ÐµÐ¼Ñ Ð¿ÐµÑ€ÐµÑ…Ð¾Ð´Ð¾Ð², перетаÑкивайте вкладки.
+ </text>
+ <text name="hint_item3">
+ - Скребок Ñлужит Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра Ñуточного цикла.
+ </text>
+ <panel name="day_cycle_slider_panel">
+ <multi_slider initial_value="0" name="WLTimeSlider"/>
+ <multi_slider initial_value="0" name="WLDayCycleKeys"/>
+ <button label="+ отметку" label_selected="+ отметку" name="WLAddKey"/>
+ <button label="- отметку" label_selected="- отметку" name="WLDeleteKey"/>
+ <text name="WL12am">
+ 12 ночи
+ </text>
+ <text name="WL3am">
+ 3 ночи
+ </text>
+ <text name="WL6am">
+ 6 утра
+ </text>
+ <text name="WL9amHash">
+ 9 утра
+ </text>
+ <text name="WL12pmHash">
+ 12 днÑ
+ </text>
+ <text name="WL3pm">
+ 3 днÑ
+ </text>
+ <text name="WL6pm">
+ 6 вечера
+ </text>
+ <text name="WL9pm">
+ 9 вечера
+ </text>
+ <text name="WL12am2">
+ 12 ночи
+ </text>
+ <text name="WL12amHash">
+ |
+ </text>
+ <text name="WL3amHash">
+ I
+ </text>
+ <text name="WL6amHash">
+ |
+ </text>
+ <text name="WL9amHash2">
+ I
+ </text>
+ <text name="WL12pmHash2">
+ |
+ </text>
+ <text name="WL3pmHash">
+ I
+ </text>
+ <text name="WL6pmHash">
+ |
+ </text>
+ <text name="WL9pmHash">
+ I
+ </text>
+ <text name="WL12amHash2">
+ |
+ </text>
+ </panel>
+ <text name="WLCurKeyPresetText">
+ Ðебо:
+ </text>
+ <combo_box label="Стандарт" name="WLSkyPresets"/>
+ <text name="WLCurKeyTimeText">
+ ВремÑ:
+ </text>
+ <time name="time" value="6:00"/>
+ <check_box label="УÑтановить как новый Ñуточный цикл" name="make_default_cb"/>
+ <button label="Сохранить" name="save"/>
+ <button label="Отмена" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_edit_sky_preset.xml b/indra/newview/skins/default/xui/ru/floater_edit_sky_preset.xml
new file mode 100644
index 0000000000..354120ea72
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_edit_sky_preset.xml
@@ -0,0 +1,143 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Edit Sky Preset" title="Изменить наÑтройку неба">
+ <string name="title_new">
+ Создать наÑтройку неба
+ </string>
+ <string name="title_edit">
+ Изменить наÑтройку неба
+ </string>
+ <string name="hint_new">
+ Введите Ð¸Ð¼Ñ Ð½Ð°Ñтройки, задайте ее параметры Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Ñлементов ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸ нажмите кнопку «Сохранить».
+ </string>
+ <string name="hint_edit">
+ Чтобы изменить наÑтройку неба, задайте ее параметры Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Ñлементов ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸ нажмите кнопку «Сохранить».
+ </string>
+ <string name="combo_label">
+ -Выбор наÑтройки-
+ </string>
+ <text name="hint">
+ Чтобы изменить наÑтройку, задайте ее параметры Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Ñлементов ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸ нажмите кнопку «Сохранить».
+ </text>
+ <text name="label">
+ Ð˜Ð¼Ñ Ð½Ð°Ñтройки:
+ </text>
+ <text name="note">
+ Примечание. ЕÑли изменить Ð¸Ð¼Ñ Ð½Ð°Ñтройки, будет Ñоздана Ð½Ð¾Ð²Ð°Ñ Ð½Ð°Ñтройка, а Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² ÑущеÑтвующей не будут Ñохранены.
+ </text>
+ <tab_container name="WindLight Tabs">
+ <panel label="ÐТМОСФЕРÐ" name="Atmosphere">
+ <text name="BHText">
+ Голубой горизонт
+ </text>
+ <text name="BDensText">
+ Дымка на горизонте
+ </text>
+ <text name="BDensText2">
+ ÐаÑыщенноÑÑ‚ÑŒ голубого
+ </text>
+ <text name="HDText">
+ ПлотноÑÑ‚ÑŒ дымки
+ </text>
+ <text name="DensMultText">
+ КоÑффициент плотноÑти
+ </text>
+ <text name="WLDistanceMultText">
+ КоÑффициент раÑÑтоÑниÑ
+ </text>
+ <text name="MaxAltText">
+ МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð²Ñ‹Ñота
+ </text>
+ </panel>
+ <panel label="ОСВЕЩЕÐИЕ" name="Lighting">
+ <text name="SLCText">
+ Цвет Ñолнца/луны
+ </text>
+ <text name="WLAmbientText">
+ РаÑÑеÑнное
+ </text>
+ <text name="SunGlowText">
+ СиÑние Ñолнца
+ </text>
+ <slider label="ФокуÑ" name="WLGlowB"/>
+ <slider label="Размер" name="WLGlowR"/>
+ <text name="WLStarText">
+ ЯркоÑÑ‚ÑŒ звезд
+ </text>
+ <text name="SceneGammaText">
+ Гамма-ÐºÐ¾Ñ€Ñ€ÐµÐºÑ†Ð¸Ñ Ñцены
+ </text>
+ <text name="TODText">
+ Положение Ñолнца/луны
+ </text>
+ <multi_slider initial_value="0" name="WLSunPos"/>
+ <text name="WL12amHash">
+ |
+ </text>
+ <text name="WL6amHash">
+ |
+ </text>
+ <text name="WL12pmHash2">
+ |
+ </text>
+ <text name="WL6pmHash">
+ |
+ </text>
+ <text name="WL12amHash2">
+ |
+ </text>
+ <text name="WL12am">
+ 12 ночи
+ </text>
+ <text name="WL6am">
+ 6 утра
+ </text>
+ <text name="WL12pmHash">
+ 12 днÑ
+ </text>
+ <text name="WL6pm">
+ 6 вечера
+ </text>
+ <text name="WL12am2">
+ 12 ночи
+ </text>
+ <time name="WLDayTime" value="6:00"/>
+ <text name="WLEastAngleText">
+ Смещение отн. воÑтока
+ </text>
+ </panel>
+ <panel label="ОБЛÐКÐ" name="Clouds">
+ <text name="WLCloudColorText">
+ Цвет
+ </text>
+ <text name="WLCloudColorText2">
+ Положение и плотноÑÑ‚ÑŒ
+ </text>
+ <slider label="X" name="WLCloudX"/>
+ <slider label="Y" name="WLCloudY"/>
+ <slider label="П" name="WLCloudDensity"/>
+ <text name="WLCloudCoverageText">
+ ОблачноÑÑ‚ÑŒ
+ </text>
+ <text name="WLCloudScaleText">
+ Размеры
+ </text>
+ <text name="WLCloudDetailText">
+ Детали (положение/плотноÑÑ‚ÑŒ)
+ </text>
+ <slider label="X" name="WLCloudDetailX"/>
+ <slider label="Y" name="WLCloudDetailY"/>
+ <slider label="П" name="WLCloudDetailDensity"/>
+ <text name="WLCloudScrollXText">
+ СкороÑÑ‚ÑŒ по X
+ </text>
+ <check_box label="Ðа меÑте" name="WLCloudLockX"/>
+ <text name="WLCloudScrollYText">
+ СкороÑÑ‚ÑŒ по Y
+ </text>
+ <check_box label="Ðа меÑте" name="WLCloudLockY"/>
+ </panel>
+ </tab_container>
+ <check_box label="Применить Ñту наÑтройку неба" name="make_default_cb"/>
+ <button label="Сохранить" name="save"/>
+ <button label="Отмена" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_edit_water_preset.xml b/indra/newview/skins/default/xui/ru/floater_edit_water_preset.xml
new file mode 100644
index 0000000000..f6def86380
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_edit_water_preset.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Edit Water Preset" title="Изменить наÑтройку воды">
+ <string name="title_new">
+ Создать наÑтройку воды
+ </string>
+ <string name="title_edit">
+ Изменение наÑтройки воды
+ </string>
+ <string name="hint_new">
+ Введите Ð¸Ð¼Ñ Ð½Ð°Ñтройки, задайте ее параметры Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Ñлементов ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸ нажмите кнопку «Сохранить».
+ </string>
+ <string name="hint_edit">
+ Чтобы изменить наÑтройку воды, задайте параметры Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Ñлементов ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸ нажмите кнопку «Сохранить».
+ </string>
+ <string name="combo_label">
+ -Выбор наÑтройки-
+ </string>
+ <text name="hint">
+ Чтобы изменить наÑтройку, задайте ее параметры Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Ñлементов ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸ нажмите кнопку «Сохранить».
+ </text>
+ <text name="label">
+ Ð˜Ð¼Ñ Ð½Ð°Ñтройки:
+ </text>
+ <text name="note">
+ Примечание. ЕÑли изменить Ð¸Ð¼Ñ Ð½Ð°Ñтройки, будет Ñоздана Ð½Ð¾Ð²Ð°Ñ Ð½Ð°Ñтройка, а Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² ÑущеÑтвующей не будут Ñохранены.
+ </text>
+ <panel name="panel_water_preset">
+ <text name="water_color_label">
+ Оттенок
+ </text>
+ <text name="water_fog_density_label">
+ ПрозрачноÑÑ‚ÑŒ
+ </text>
+ <text name="underwater_fog_modifier_label">
+ Изменение прозрачноÑти
+ </text>
+ <text name="BHText">
+ Ðаправление больших волн
+ </text>
+ <slider label="X" name="WaterWave1DirX"/>
+ <slider label="Y" name="WaterWave1DirY"/>
+ <text name="BDensText">
+ Степень Ð¾Ñ‚Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð·Ñ‹Ð±Ð¸
+ </text>
+ <text name="HDText">
+ Отражение
+ </text>
+ <text name="FresnelOffsetText">
+ Ð£Ð³Ð»Ð¾Ð²Ð°Ñ Ð·Ð°Ð²Ð¸ÑимоÑÑ‚ÑŒ
+ </text>
+ <text name="BHText2">
+ Ðаправление Ñ€Ñби
+ </text>
+ <slider label="X" name="WaterWave2DirX"/>
+ <slider label="Y" name="WaterWave2DirY"/>
+ <text name="DensMultText">
+ Преломление (над водой)
+ </text>
+ <text name="WaterScaleBelowText">
+ Преломление (под водой)
+ </text>
+ <text name="MaxAltText">
+ Размытие
+ </text>
+ <text name="BHText3">
+ Карта поверхноÑти
+ </text>
+ </panel>
+ <check_box label="Применить Ñту наÑтройку воды" name="make_default_cb"/>
+ <button label="Сохранить" name="save"/>
+ <button label="Отмена" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_env_settings.xml b/indra/newview/skins/default/xui/ru/floater_env_settings.xml
new file mode 100644
index 0000000000..a3e77d61de
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_env_settings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Environment Editor Floater" title="РЕДÐКТОР СРЕДЫ">
+ <floater.string name="timeStr">
+ [hour,datetime,utc]:[min,datetime,utc]
+ </floater.string>
+ <text name="EnvTimeText">
+ Ð’Ñ€ÐµÐ¼Ñ Ñуток
+ </text>
+ <text name="EnvTimeText2">
+ 12:00
+ </text>
+ <text name="EnvCloudText">
+ ОблачноÑÑ‚ÑŒ
+ </text>
+ <text name="EnvWaterColorText">
+ Цвет воды
+ </text>
+ <color_swatch name="EnvWaterColor" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° цвета"/>
+ <text name="EnvWaterFogText">
+ Водный туман
+ </text>
+ <button label="ИÑпользовать Ð²Ñ€ÐµÐ¼Ñ Ð² землевладении" name="EnvUseEstateTimeButton"/>
+ <button label="Улучшенное небо" name="EnvAdvancedSkyButton"/>
+ <button label="Ð£Ð»ÑƒÑ‡ÑˆÐµÐ½Ð½Ð°Ñ Ð²Ð¾Ð´Ð°" name="EnvAdvancedWaterButton"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_environment_settings.xml b/indra/newview/skins/default/xui/ru/floater_environment_settings.xml
new file mode 100644
index 0000000000..d752c08cbb
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_environment_settings.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Environment Editor Floater" title="ÐÐСТРОЙКИ СРЕДЫ">
+ <text name="note">
+ Приведенные ниже параметры позволÑÑŽÑ‚ наÑтроить Ñреду клиента.
+ </text>
+ <radio_group name="region_settings_radio_group">
+ <radio_item label="ИÑпользовать наÑтройки региона" name="use_region_settings"/>
+ <radio_item label="ÐаÑтроить Ñреду" name="use_my_settings"/>
+ </radio_group>
+ <panel name="user_environment_settings">
+ <text name="note">
+ Примечание. Ваши перÑональные наÑтройки не видны другим пользователÑм.
+ </text>
+ <text name="water_settings_title">
+ ÐаÑтройка воды
+ </text>
+ <combo_box name="water_settings_preset_combo">
+ <combo_box.item label="-Выбор наÑтройки-" name="item0"/>
+ </combo_box>
+ <text name="sky_dayc_settings_title">
+ Ðебо и Ñуточный цикл
+ </text>
+ <radio_group name="sky_dayc_settings_radio_group">
+ <radio_item label="Ðебо не менÑетÑÑ" name="my_sky_settings"/>
+ <radio_item label="Суточный цикл" name="my_dayc_settings"/>
+ </radio_group>
+ <combo_box name="sky_settings_preset_combo">
+ <combo_box.item label="-Выбор наÑтройки-" name="item0"/>
+ </combo_box>
+ <combo_box name="dayc_settings_preset_combo">
+ <combo_box.item label="-Выбор наÑтройки-" name="item0"/>
+ </combo_box>
+ </panel>
+ <button label="ОК" name="ok_btn"/>
+ <button label="Отмена" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_event.xml b/indra/newview/skins/default/xui/ru/floater_event.xml
new file mode 100644
index 0000000000..5c5bcc6d09
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_event.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater label="Событие" name="Event" title="СВЕДЕÐИЯ О СОБЫТИИ">
+ <floater.string name="loading_text">
+ Загрузка...
+ </floater.string>
+ <floater.string name="done_text">
+ Готово
+ </floater.string>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_fast_timers.xml b/indra/newview/skins/default/xui/ru/floater_fast_timers.xml
new file mode 100644
index 0000000000..20936b8494
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_fast_timers.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="fast_timers">
+ <string name="pause">
+ Пауза
+ </string>
+ <string name="run">
+ Бег
+ </string>
+ <button label="Пауза" name="pause_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_font_test.xml b/indra/newview/skins/default/xui/ru/floater_font_test.xml
new file mode 100644
index 0000000000..b51732d3f1
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_font_test.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="contents" title="ТЕСТ ШРИФТОВ"/>
diff --git a/indra/newview/skins/default/xui/ru/floater_gesture.xml b/indra/newview/skins/default/xui/ru/floater_gesture.xml
new file mode 100644
index 0000000000..759d81b2c6
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_gesture.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater label="МеÑта" name="gestures" title="ЖЕСТЫ">
+ <floater.string name="loading">
+ Загрузка...
+ </floater.string>
+ <floater.string name="playing">
+ (проигрываетÑÑ)
+ </floater.string>
+ <floater.string name="copy_name">
+ ÐšÐ¾Ð¿Ð¸Ñ [COPY_NAME]
+ </floater.string>
+ <scroll_list name="gesture_list">
+ <scroll_list.columns label="Ðазвание" name="name"/>
+ <scroll_list.columns label="Чат" name="trigger"/>
+ <scroll_list.columns label="Клавиша" name="shortcut"/>
+ </scroll_list>
+ <panel label="bottom_panel" name="bottom_panel">
+ <menu_button name="gear_btn" tool_tip="Дополнительные параметры"/>
+ <button name="new_gesture_btn" tool_tip="Создать новый жеÑÑ‚"/>
+ <button name="activate_btn" tool_tip="Ðктивировать/деактивировать выбранный жеÑÑ‚"/>
+ <button name="del_btn" tool_tip="Удалить Ñтот жеÑÑ‚"/>
+ </panel>
+ <button label="Изменить" name="edit_btn"/>
+ <button label="Проиграть" name="play_btn"/>
+ <button label="Стоп" name="stop_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_god_tools.xml b/indra/newview/skins/default/xui/ru/floater_god_tools.xml
new file mode 100644
index 0000000000..81329475aa
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_god_tools.xml
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="godtools floater" title="ИÐСТРУМЕÐТЫ ТВОРЦÐ">
+ <tab_container name="GodTools Tabs">
+ <panel label="Сетка" name="grid">
+ <button label="Обновить кÑш данных карты Ñтого региона" label_selected="Обновить кÑш данных карты Ñтого региона" name="Flush This Region&apos;s Map Visibility Caches"/>
+ </panel>
+ <panel label="Регион" name="region">
+ <text name="Region Name:">
+ Ðазвание региона:
+ </text>
+ <check_box label="Ð‘ÑƒÑ„ÐµÑ€Ð½Ð°Ñ Ð·Ð¾Ð½Ð°" name="check prelude" tool_tip="Сделать Ñтот регион буферной зоной"/>
+ <check_box label="Солнце на меÑте" name="check fixed sun" tool_tip="ФикÑÐ°Ñ†Ð¸Ñ Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ñолнца (как в меню «Регион/Землевладение &gt; Ландшафт»)"/>
+ <check_box label="Ð¡Ð±Ñ€Ð¾Ñ Ð´Ð¾Ð¼Ð° при телепортации" name="check reset home" tool_tip="Дом жителей, которые телепортируютÑÑ Ð¾Ñ‚Ñюда, будет там, куда они телепортируютÑÑ."/>
+ <check_box label="Видимый" name="check visible" tool_tip="Сделать регион видимым не только Ð´Ð»Ñ Ñ‚Ð²Ð¾Ñ€Ñ†Ð¾Ð²"/>
+ <check_box label="ПовреждениÑ" name="check damage" tool_tip="Сделать возможными Ð¿Ð¾Ð²Ñ€ÐµÐ¶Ð´ÐµÐ½Ð¸Ñ Ð² регионе"/>
+ <check_box label="Блокировать отÑлеживание трафика" name="block dwell" tool_tip="Выберите, чтобы Ð´Ð»Ñ Ñ€ÐµÐ³Ð¸Ð¾Ð½Ð° не отÑлеживалÑÑ Ñ‚Ñ€Ð°Ñ„Ð¸Ðº"/>
+ <check_box label="Запретить терраформирование" name="block terraform" tool_tip="Выберите, чтобы жители не могли изменÑÑ‚ÑŒ ландшафт Ñвоей земли"/>
+ <check_box label="ПеÑочница" name="is sandbox" tool_tip="Выберите, ÑвлÑетÑÑ Ð»Ð¸ Ñтот регион «пеÑочницей»"/>
+ <button label="ЗафикÑировать пределы" label_selected="ЗафикÑировать пределы" name="Bake Terrain" tool_tip="Сохранить текущий ландшафт как Ñтандартный"/>
+ <button label="Вернуть ландшафт" label_selected="Вернуть ландшафт" name="Revert Terrain" tool_tip="Заменить текущий ландшафт ландшафтом по умолчанию"/>
+ <button label="ПоменÑÑ‚ÑŒ ландшафты" label_selected="ПоменÑÑ‚ÑŒ ландшафты" name="Swap Terrain" tool_tip="ПоменÑÑ‚ÑŒ меÑтами текущий ландшафт и ландшафт по умолчанию"/>
+ <text name="estate id">
+ ИД землевладениÑ:
+ </text>
+ <text name="parent id">
+ ИД родового объекта:
+ </text>
+ <line_editor name="parentestate" tool_tip="Родовое землевладение Ð´Ð»Ñ Ñтого региона"/>
+ <text name="Grid Pos: ">
+ Полож. Ñетки:
+ </text>
+ <line_editor name="gridposx" tool_tip="Положение Ñетки по оÑи x Ð´Ð»Ñ Ñтого региона"/>
+ <line_editor name="gridposy" tool_tip="Положение Ñетки по оÑи y Ð´Ð»Ñ Ñтого региона"/>
+ <text name="Redirect to Grid: ">
+ Перенаправить на Ñетку:
+ </text>
+ <text name="billable factor text">
+ Ценовой коÑффициент:
+ </text>
+ <text name="land cost text">
+ L$ за м²:
+ </text>
+ <button label="Обновить" label_selected="Обновить" name="Refresh" tool_tip="Обновление приведенной выше информации"/>
+ <button label="Применить" label_selected="Применить" name="Apply" tool_tip="Применить вÑе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²Ñ‹ÑˆÐµ"/>
+ <button label="Выбрать регион" label_selected="Выбрать регион" name="Select Region" tool_tip="Выбор вÑего региона Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ инÑтрумента Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð»Ð°Ð½Ð´ÑˆÐ°Ñ„Ñ‚Ð°"/>
+ <button label="ÐвтоÑохранение" label_selected="ÐвтоÑохранение" name="Autosave now" tool_tip="Сохранить в каталоге автоÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ ÑоÑтоÑние в архиве Gzip"/>
+ </panel>
+ <panel label="Объекты" name="objects">
+ <panel.string name="no_target">
+ (нет перÑонажа)
+ </panel.string>
+ <text name="Region Name:">
+ Ðазвание региона:
+ </text>
+ <text name="region name">
+ УÑльÑ
+ </text>
+ <check_box label="Отключить Ñкрипты" name="disable scripts" tool_tip="Отключение вÑех Ñкриптов в Ñтом регионе"/>
+ <check_box label="Отключить ÑтолкновениÑ" name="disable collisions" tool_tip="Отключение Ñтолкновений не-агентов в Ñтом регионе"/>
+ <check_box label="Отключить физику" name="disable physics" tool_tip="Отключение вÑех физичеÑких параметров в Ñтом регионе"/>
+ <button label="Применить" label_selected="Применить" name="Apply" tool_tip="Применить вÑе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²Ñ‹ÑˆÐµ"/>
+ <button label="Задать перÑонаж" label_selected="Задать перÑонаж" name="Set Target" tool_tip="Выберите аватар-перÑонаж Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð°"/>
+ <text name="target_avatar_name">
+ (нет перÑонажа)
+ </text>
+ <button label="Удалить принадлежащие перÑонажу объекты Ñо Ñкриптами на чужой земле" label_selected="Удалить принадлежащие перÑонажу объекты Ñо Ñкриптами на чужой земле" name="Delete Target&apos;s Scripted Objects On Others Land" tool_tip="Удаление вÑех объектов Ñо Ñкриптами, принадлежащих перÑонажу, на земле, не принадлежащей перÑонажу. «Ðе копируемые» объекты будут возвращены."/>
+ <button label="Удалить принадлежащие перÑонажу объекты Ñо Ñкриптами на *вÑех* землÑÑ…" label_selected="Удалить принадлежащие перÑонажу объекты Ñо Ñкриптами на *вÑех* землÑÑ…" name="Delete Target&apos;s Scripted Objects On *Any* Land" tool_tip="Удаление вÑех объектов Ñо Ñкриптами, принадлежащих перÑонажу, в Ñтом регионе. «Ðе копируемые» объекты будут возвращены."/>
+ <button label="Удалить *ВСЕ* объекты перÑонажа" label_selected="Удалить *ВСЕ* объекты перÑонажа" name="Delete *ALL* Of Target&apos;s Objects" tool_tip="Удаление вÑех объектов, принадлежащих перÑонажу, в Ñтом регионе. «Ðе копируемые» объекты будут возвращены."/>
+ <button label="Самые активные учаÑтники Ñтолкновений" label_selected="Самые активные учаÑтники Ñтолкновений" name="Get Top Colliders" tool_tip="СпиÑок объектов, Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… наблюдаетÑÑ Ð±Ð¾Ð»ÑŒÑˆÐµ вÑего детализированных обратных вызовов"/>
+ <button label="Загрузить лучшие Ñкрипты" label_selected="Загрузить лучшие Ñкрипты" name="Get Top Scripts" tool_tip="СпиÑок объектов, в которых Ñкрипты выполнÑÑŽÑ‚ÑÑ Ð´Ð¾Ð»ÑŒÑˆÐµ вÑего"/>
+ <button label="Сводка по Ñкриптам" label_selected="Сводка по Ñкриптам" name="Scripts digest" tool_tip="СпиÑок вÑех Ñкриптов Ñ Ñ‡Ð¸Ñлом иÑпользований по каждому из них"/>
+ </panel>
+ <panel label="ЗапроÑ" name="request">
+ <text name="Destination:">
+ Пункт назначениÑ:
+ </text>
+ <combo_box name="destination">
+ <combo_box.item label="назначенный" name="item1"/>
+ <combo_box.item label="текущий регион" name="item2"/>
+ </combo_box>
+ <text name="Request:">
+ ЗапроÑ:
+ </text>
+ <combo_box name="request">
+ <combo_box.item label="учаÑтники Ñтолкновений &lt;steps&gt;" name="item1"/>
+ <combo_box.item label="Ñкрипты: &lt;count&gt;,&lt;optional pattern&gt;" name="item2"/>
+ <combo_box.item label="объекты &lt;pattern&gt;" name="item3"/>
+ <combo_box.item label="выложить &lt;asset_id&gt;" name="item4"/>
+ </combo_box>
+ <text name="Parameter:">
+ Параметр:
+ </text>
+ <button label="Ñделать запроÑ" label_selected="Сделать запроÑ" name="Make Request"/>
+ </panel>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_hardware_settings.xml b/indra/newview/skins/default/xui/ru/floater_hardware_settings.xml
new file mode 100644
index 0000000000..7400f1df3b
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_hardware_settings.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Hardware Settings Floater" title="ÐППÐРÐТÐЫЕ ÐÐСТРОЙКИ">
+ <text name="Filtering:">
+ ФильтрациÑ:
+ </text>
+ <check_box label="ÐÐ½Ð¸Ð·Ð¾Ñ‚Ñ€Ð¾Ð¿Ð½Ð°Ñ Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð°Ñ†Ð¸Ñ (медленнее, еÑли включено)" name="ani"/>
+ <text name="antialiasing label">
+ Сглаживание:
+ </text>
+ <combo_box label="Сглаживание" name="fsaa">
+ <combo_box.item label="Выключено" name="FSAADisabled"/>
+ <combo_box.item label="2x" name="2x"/>
+ <combo_box.item label="4x" name="4x"/>
+ <combo_box.item label="8x" name="8x"/>
+ <combo_box.item label="16x" name="16x"/>
+ </combo_box>
+ <text name="antialiasing restart">
+ (требуетÑÑ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿ÑƒÑк)
+ </text>
+ <spinner label="Гамма:" name="gamma"/>
+ <text name="(brightness, lower is brighter)">
+ (чем меньше, тем Ñрче. 0 – ÑркоÑÑ‚ÑŒ по умолчанию)
+ </text>
+ <text name="Enable VBO:">
+ Включить VBO:
+ </text>
+ <check_box initial_value="иÑтина" label="Включить объекты вершинных буферов OpenGL" name="vbo" tool_tip="Включение Ñтого параметра на Ñовременном оборудовании даÑÑ‚ увеличение производительноÑти. Однако на Ñтаром оборудовании Ñто может привеÑти к Ñбою приложениÑ."/>
+ <slider label="ПамÑÑ‚ÑŒ Ð´Ð»Ñ Ñ‚ÐµÐºÑтур (Мб):" name="GraphicsCardTextureMemory" tool_tip="КоличеÑтво памÑти, отводимое Ð´Ð»Ñ Ñ‚ÐµÐºÑтур. По умолчанию равно памÑти видеокарты. Уменьшение поможет увеличить производительноÑÑ‚ÑŒ, но текÑтуры могут Ñтать размытыми."/>
+ <spinner label="ДиÑÑ‚Ð°Ð½Ñ†Ð¸Ñ Ñ‚ÑƒÐ¼Ð°Ð½Ð°:" name="fog"/>
+ <button label="OK" label_selected="OK" name="OK"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_help_browser.xml b/indra/newview/skins/default/xui/ru/floater_help_browser.xml
new file mode 100644
index 0000000000..2f560340ed
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_help_browser.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_help_browser" title="ОБЗОР СПРÐВКИ">
+ <floater.string name="loading_text">
+ Загрузка...
+ </floater.string>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_how_to.xml b/indra/newview/skins/default/xui/ru/floater_how_to.xml
new file mode 100644
index 0000000000..52525e5d33
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_how_to.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_how_to" title="ПОМОЩЬ"/>
diff --git a/indra/newview/skins/default/xui/ru/floater_hud.xml b/indra/newview/skins/default/xui/ru/floater_hud.xml
new file mode 100644
index 0000000000..b05113bfe0
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_hud.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_hud" title="УЧЕБÐИК"/>
diff --git a/indra/newview/skins/default/xui/ru/floater_im_container.xml b/indra/newview/skins/default/xui/ru/floater_im_container.xml
new file mode 100644
index 0000000000..b147cfa2b3
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_im_container.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<multi_floater name="floater_im_box" title="ОБЩЕÐИЕ"/>
diff --git a/indra/newview/skins/default/xui/ru/floater_im_session.xml b/indra/newview/skins/default/xui/ru/floater_im_session.xml
new file mode 100644
index 0000000000..604d9dc6d3
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_im_session.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="panel_im">
+ <layout_stack name="im_panels">
+ <layout_panel>
+ <line_editor label="Кому" name="chat_editor"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_image_preview.xml b/indra/newview/skins/default/xui/ru/floater_image_preview.xml
new file mode 100644
index 0000000000..dbc4c32b98
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_image_preview.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Image Preview">
+ <text name="name_label">
+ Ðазвание:
+ </text>
+ <text name="description_label">
+ ОпиÑание:
+ </text>
+ <text name="preview_label">
+ Показать изображение как:
+ </text>
+ <combo_box label="Тип одежды" name="clothing_type_combo">
+ <item label="Изображение" name="Image" value="Изображение"/>
+ <item label="ВолоÑÑ‹" name="Hair" value="ВолоÑÑ‹"/>
+ <item label="ЖенÑÐºÐ°Ñ Ð³Ð¾Ð»Ð¾Ð²Ð°" name="FemaleHead" value="ЖенÑÐºÐ°Ñ Ð³Ð¾Ð»Ð¾Ð²Ð°"/>
+ <item label="ВерхнÑÑ Ñ‡Ð°ÑÑ‚ÑŒ тела женщины" name="FemaleUpperBody" value="ВерхнÑÑ Ñ‡Ð°ÑÑ‚ÑŒ тела женщины"/>
+ <item label="ÐижнÑÑ Ñ‡Ð°ÑÑ‚ÑŒ тела женщины" name="FemaleLowerBody" value="ÐижнÑÑ Ñ‡Ð°ÑÑ‚ÑŒ тела женщины"/>
+ <item label="МужÑÐºÐ°Ñ Ð³Ð¾Ð»Ð¾Ð²Ð°" name="MaleHead" value="МужÑÐºÐ°Ñ Ð³Ð¾Ð»Ð¾Ð²Ð°"/>
+ <item label="ВерхнÑÑ Ñ‡Ð°ÑÑ‚ÑŒ тела мужчины" name="MaleUpperBody" value="ВерхнÑÑ Ñ‡Ð°ÑÑ‚ÑŒ тела мужчины"/>
+ <item label="ÐижнÑÑ Ñ‡Ð°ÑÑ‚ÑŒ тела мужчины" name="MaleLowerBody" value="ÐижнÑÑ Ñ‡Ð°ÑÑ‚ÑŒ тела мужчины"/>
+ <item label="Юбка" name="Skirt" value="Юбка"/>
+ <item label="Скульптурный примитив" name="SculptedPrim" value="Скульптурный примитив"/>
+ </combo_box>
+ <text name="bad_image_text">
+ Ðевозможно прочитать изображение.
+Попробуйте Ñохранить изображение как 24-битный TGA-файл (Targa).
+ </text>
+ <check_box label="ИÑпользовать Ñжатие без потерь" name="lossless_check"/>
+ <button label="Отмена" name="cancel_btn"/>
+ <button label="Передать (L$[AMOUNT])" name="ok_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_import_collada.xml b/indra/newview/skins/default/xui/ru/floater_import_collada.xml
new file mode 100644
index 0000000000..122315cb26
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_import_collada.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Import Collada" title="Импорт Ñцены">
+ <text name="mesh count">
+ Мешей: [COUNT]
+ </text>
+ <text name="texture count">
+ ТекÑтур: [COUNT]
+ </text>
+ <text name="status">
+ СтатуÑ: [STATUS]
+ </text>
+ <button label="Отмена" name="cancel"/>
+ <button label="ОК" name="ok"/>
+ <string name="status_idle">
+ Ðеактивно
+ </string>
+ <string name="status_uploading">
+ ПередаетÑÑ [NAME]
+ </string>
+ <string name="status_creating">
+ СоздаетÑÑ Ð¾Ð±ÑŠÐµÐºÑ‚ [NAME]
+ </string>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_incoming_call.xml b/indra/newview/skins/default/xui/ru/floater_incoming_call.xml
new file mode 100644
index 0000000000..072c20147d
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_incoming_call.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="incoming call" title="ВходÑщий звонок">
+ <floater.string name="lifetime">
+ 5
+ </floater.string>
+ <floater.string name="localchat">
+ Локальный голоÑовой чат
+ </floater.string>
+ <floater.string name="anonymous">
+ анонимно
+ </floater.string>
+ <floater.string name="VoiceInviteP2P">
+ вызывает.
+ </floater.string>
+ <floater.string name="VoiceInviteAdHoc">
+ теперь учаÑтвует в групповом голоÑовом чате.
+ </floater.string>
+ <floater.string name="VoiceInviteGroup">
+ приÑоединилÑÑ (-лаÑÑŒ) к голоÑовому каналу «[GROUP]».
+ </floater.string>
+ <floater.string name="VoiceInviteQuestionGroup">
+ Хотите выйти из чата «[CURRENT_CHAT]» и приÑоединитьÑÑ Ðº звонку «[GROUP]»?
+ </floater.string>
+ <floater.string name="VoiceInviteQuestionDefault">
+ Хотите выйти из чата «[CURRENT_CHAT]» и приÑоединитьÑÑ Ðº Ñтому голоÑовому чату?
+ </floater.string>
+ <text name="question">
+ Хотите выйти из чата «[CURRENT_CHAT]» и приÑоединитьÑÑ Ðº Ñтому голоÑовому чату?
+ </text>
+ <button label="ПринÑÑ‚ÑŒ" label_selected="ПринÑÑ‚ÑŒ" name="Accept"/>
+ <button label="Отклонить" label_selected="Отклонить" name="Reject"/>
+ <button label="Ðачать IM" name="Start IM"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_inspect.xml b/indra/newview/skins/default/xui/ru/floater_inspect.xml
new file mode 100644
index 0000000000..f7bb981575
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_inspect.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="inspect" title="ИÐСПЕКТИРОВÐÐИЕ ОБЪЕКТОВ">
+ <floater.string name="timeStamp">
+ [wkday,datetime,local], [day,datetime,local] [mth,datetime,local] [year,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
+ </floater.string>
+ <scroll_list name="object_list" tool_tip="Выбор объекта из Ñтого ÑпиÑка приведет к его подÑветке">
+ <scroll_list.columns label="Ðазвание объекта" name="object_name"/>
+ <scroll_list.columns label="Ð˜Ð¼Ñ Ð²Ð»Ð°Ð´ÐµÐ»ÑŒÑ†Ð°" name="owner_name"/>
+ <scroll_list.columns label="Ð˜Ð¼Ñ ÑоздателÑ" name="creator_name"/>
+ <scroll_list.columns label="Дата ÑозданиÑ" name="creation_date"/>
+ </scroll_list>
+ <button label="Профиль владельца..." name="button owner" tool_tip="Показывает профиль владельца подÑвеченного объекта"/>
+ <button label="Профиль ÑоздателÑ..." name="button creator" tool_tip="Показывает профиль ÑÐ¾Ð·Ð´Ð°Ñ‚ÐµÐ»Ñ Ð¿Ð¾Ð´Ñвеченного объекта"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_inventory.xml b/indra/newview/skins/default/xui/ru/floater_inventory.xml
new file mode 100644
index 0000000000..35cbcf177d
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_inventory.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Inventory" title="МОЙ ИÐВЕÐТÐРЬ">
+ <panel label="Панель инвентарÑ" name="Inventory Panel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/ru/floater_inventory_item_properties.xml
new file mode 100644
index 0000000000..9021b71fe2
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_inventory_item_properties.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="item properties" title="СВОЙСТВРПРЕДМЕТÐ">
+ <floater.string name="unknown">
+ (неизвеÑтно)
+ </floater.string>
+ <floater.string name="public">
+ (публичное)
+ </floater.string>
+ <floater.string name="you_can">
+ Вы можете:
+ </floater.string>
+ <floater.string name="owner_can">
+ Владелец может:
+ </floater.string>
+ <floater.string name="acquiredDate">
+ [wkday,datetime,local], [day,datetime,local] [mth,datetime,local] [year,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
+ </floater.string>
+ <text name="LabelItemNameTitle">
+ Ðазвание:
+ </text>
+ <text name="LabelItemDescTitle">
+ ОпиÑание:
+ </text>
+ <text name="LabelCreatorTitle">
+ Создатель:
+ </text>
+ <button label="Профиль…" name="BtnCreator"/>
+ <text name="LabelOwnerTitle">
+ Владелец:
+ </text>
+ <button label="Профиль…" name="BtnOwner"/>
+ <text name="LabelAcquiredTitle">
+ Приобретено:
+ </text>
+ <text name="LabelAcquiredDate">
+ Ср 24 Май 12:50:46 2006
+ </text>
+ <text name="OwnerLabel">
+ Ð’Ñ‹:
+ </text>
+ <check_box label="Изменить" name="CheckOwnerModify"/>
+ <check_box label="Копировать" name="CheckOwnerCopy"/>
+ <check_box label="Перепродать" name="CheckOwnerTransfer"/>
+ <text name="AnyoneLabel">
+ Ð’Ñе:
+ </text>
+ <check_box label="Копировать" name="CheckEveryoneCopy"/>
+ <text name="GroupLabel">
+ Группа:
+ </text>
+ <check_box label="ПоделитьÑÑ" name="CheckShareWithGroup"/>
+ <text name="NextOwnerLabel">
+ Следующий владелец:
+ </text>
+ <check_box label="Изменить" name="CheckNextOwnerModify"/>
+ <check_box label="Копировать" name="CheckNextOwnerCopy"/>
+ <check_box label="Перепродать" name="CheckNextOwnerTransfer"/>
+ <check_box label="Ð”Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð°Ð¶Ð¸" name="CheckPurchase"/>
+ <combo_box name="combobox sale copy">
+ <combo_box.item label="Копировать" name="Copy"/>
+ <combo_box.item label="Оригинал" name="Original"/>
+ </combo_box>
+ <spinner label="Цена:" name="Edit Cost"/>
+ <text name="CurrencySymbol">
+ L$
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/ru/floater_inventory_view_finder.xml
new file mode 100644
index 0000000000..02068c57b8
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_inventory_view_finder.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Inventory Finder" title="INVENTORY_RECENT_ITEMS">
+ <check_box label="ÐнимациÑ" name="check_animation"/>
+ <check_box label="Визитки" name="check_calling_card"/>
+ <check_box label="Одежда" name="check_clothing"/>
+ <check_box label="ЖеÑÑ‚Ñ‹" name="check_gesture"/>
+ <check_box label="Закладки" name="check_landmark"/>
+ <check_box label="Меши" name="check_mesh"/>
+ <check_box label="Заметки" name="check_notecard"/>
+ <check_box label="Объекты" name="check_object"/>
+ <check_box label="Скрипты" name="check_script"/>
+ <check_box label="Звуки" name="check_sound"/>
+ <check_box label="ТекÑтуры" name="check_texture"/>
+ <check_box label="Снимки" name="check_snapshot"/>
+ <button label="Ð’Ñе" label_selected="Ð’Ñе" name="All"/>
+ <button label="Ðет" label_selected="Ðет" name="None"/>
+ <check_box label="Ð’Ñегда показывать папки" name="check_show_empty"/>
+ <check_box label="С момента выхода" name="check_since_logoff"/>
+ <text name="- OR -">
+ - ИЛИ -
+ </text>
+ <spinner label="ЧаÑов назад" name="spin_hours_ago"/>
+ <spinner label="Дней назад" name="spin_days_ago"/>
+ <button label="Закрыть" label_selected="Закрыть" name="Close"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_joystick.xml b/indra/newview/skins/default/xui/ru/floater_joystick.xml
new file mode 100644
index 0000000000..66568563da
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_joystick.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Joystick" title="КОÐФИГУРÐЦИЯ ДЖОЙСТИКÐ">
+ <floater.string name="NoDevice">
+ уÑтройÑтво не выбрано
+ </floater.string>
+ <check_box label="Вкл. джойÑтик:" name="enable_joystick"/>
+ <spinner label="Ðаложение по X" name="JoystickAxis1"/>
+ <spinner label="Ðаложение по Y" name="JoystickAxis2"/>
+ <spinner label="Ðаложение по Z" name="JoystickAxis0"/>
+ <spinner label="Ð. уклонов" name="JoystickAxis4"/>
+ <spinner label="Ð. Ñгибов" name="JoystickAxis5"/>
+ <spinner label="Ð. вращениÑ" name="JoystickAxis3"/>
+ <spinner label="Ð. маÑштабир." name="JoystickAxis6"/>
+ <check_box label="МаÑштабирование" name="ZoomDirect"/>
+ <check_box label="3D курÑор" name="Cursor3D"/>
+ <check_box label="Ðвтоуровень" name="AutoLeveling"/>
+ <text name="Control Modes:">
+ Режимы управлениÑ:
+ </text>
+ <check_box label="Ðватар" name="JoystickAvatarEnabled"/>
+ <check_box label="Стройка" name="JoystickBuildEnabled"/>
+ <check_box label="Камера" name="JoystickFlycamEnabled"/>
+ <stat_view label="Монитор джойÑтика" name="axis_view">
+ <stat_bar label="ОÑÑŒ 0" name="axis0"/>
+ <stat_bar label="ОÑÑŒ 1" name="axis1"/>
+ <stat_bar label="ОÑÑŒ 2" name="axis2"/>
+ <stat_bar label="ОÑÑŒ 3" name="axis3"/>
+ <stat_bar label="ОÑÑŒ 4" name="axis4"/>
+ <stat_bar label="ОÑÑŒ 5" name="axis5"/>
+ </stat_view>
+ <text name="XScale">
+ МаÑштаб по X
+ </text>
+ <text name="YScale">
+ МаÑштаб по Y
+ </text>
+ <text name="ZScale">
+ МаÑштаб по Z
+ </text>
+ <text name="PitchScale">
+ МаÑштаб уклона
+ </text>
+ <text name="YawScale">
+ МаÑштаб Ñгиба
+ </text>
+ <text name="RollScale">
+ МаÑштаб вращениÑ
+ </text>
+ <text name="XDeadZone">
+ ÐÐµÐ²Ð¸Ð´Ð¸Ð¼Ð°Ñ Ð·Ð¾Ð½Ð° по X
+ </text>
+ <text name="YDeadZone">
+ ÐÐµÐ²Ð¸Ð´Ð¸Ð¼Ð°Ñ Ð·Ð¾Ð½Ð° по Y
+ </text>
+ <text name="ZDeadZone">
+ ÐÐµÐ²Ð¸Ð´Ð¸Ð¼Ð°Ñ Ð·Ð¾Ð½Ð° по Z
+ </text>
+ <text name="PitchDeadZone">
+ Ðевид. зона уклона
+ </text>
+ <text name="YawDeadZone">
+ Ðевид. зона Ñгиба
+ </text>
+ <text name="RollDeadZone">
+ Ðевид. зона вращениÑ
+ </text>
+ <text name="Feathering">
+ Размывка краев
+ </text>
+ <text name="ZoomScale2">
+ МаÑштаб
+ </text>
+ <text name="ZoomDeadZone">
+ Ðевид. зона маÑшт.
+ </text>
+ <button label="Стандартные Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ SpaceNavigator" name="SpaceNavigatorDefaults"/>
+ <button label="OK" label_selected="OK" name="ok_btn"/>
+ <button label="Отмена" label_selected="Отмена" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_lagmeter.xml b/indra/newview/skins/default/xui/ru/floater_lagmeter.xml
new file mode 100644
index 0000000000..c420006a03
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_lagmeter.xml
@@ -0,0 +1,151 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_lagmeter" title="УРОВЕÐЬ ЛÐГОВ">
+ <floater.string name="max_title_msg">
+ Уровень лагов
+ </floater.string>
+ <floater.string name="max_width_px">
+ 360
+ </floater.string>
+ <floater.string name="min_title_msg">
+ Лаг
+ </floater.string>
+ <floater.string name="min_width_px">
+ 90
+ </floater.string>
+ <floater.string name="client_text_msg">
+ Клиент
+ </floater.string>
+ <floater.string name="client_frame_rate_critical_fps">
+ 10
+ </floater.string>
+ <floater.string name="client_frame_rate_warning_fps">
+ 15
+ </floater.string>
+ <floater.string name="client_frame_time_window_bg_msg">
+ Ðормально, окно в фоне
+ </floater.string>
+ <floater.string name="client_frame_time_critical_msg">
+ ЧаÑтота кадров клиента ниже [CLIENT_FRAME_RATE_CRITICAL]
+ </floater.string>
+ <floater.string name="client_frame_time_warning_msg">
+ ЧаÑтота кадров клиента от [CLIENT_FRAME_RATE_CRITICAL] до [CLIENT_FRAME_RATE_WARNING]
+ </floater.string>
+ <floater.string name="client_frame_time_normal_msg">
+ Ðормально
+ </floater.string>
+ <floater.string name="client_draw_distance_cause_msg">
+ Ð’Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð°Ñ Ð¿Ñ€Ð¸Ñ‡Ð¸Ð½Ð°: дальноÑÑ‚ÑŒ отриÑовки Ñлишком велика
+ </floater.string>
+ <floater.string name="client_texture_loading_cause_msg">
+ Ð’Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð°Ñ Ð¿Ñ€Ð¸Ñ‡Ð¸Ð½Ð°: загрузка изображений
+ </floater.string>
+ <floater.string name="client_texture_memory_cause_msg">
+ Ð’Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð°Ñ Ð¿Ñ€Ð¸Ñ‡Ð¸Ð½Ð°: Ñлишком много изображений в памÑти
+ </floater.string>
+ <floater.string name="client_complex_objects_cause_msg">
+ Ð’Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð°Ñ Ð¿Ñ€Ð¸Ñ‡Ð¸Ð½Ð°: Ñлишком много Ñложных объектов в Ñцене
+ </floater.string>
+ <floater.string name="network_text_msg">
+ Сеть
+ </floater.string>
+ <floater.string name="network_packet_loss_critical_pct">
+ 10
+ </floater.string>
+ <floater.string name="network_packet_loss_warning_pct">
+ 5
+ </floater.string>
+ <floater.string name="network_packet_loss_critical_msg">
+ Сеть терÑет более [NETWORK_PACKET_LOSS_CRITICAL]% пакетов
+ </floater.string>
+ <floater.string name="network_packet_loss_warning_msg">
+ Сеть терÑет [NETWORK_PACKET_LOSS_WARNING]–[NETWORK_PACKET_LOSS_CRITICAL]% пакетов
+ </floater.string>
+ <floater.string name="network_performance_normal_msg">
+ Ðормально
+ </floater.string>
+ <floater.string name="network_ping_critical_ms">
+ 600
+ </floater.string>
+ <floater.string name="network_ping_warning_ms">
+ 300
+ </floater.string>
+ <floater.string name="network_ping_critical_msg">
+ Пинг ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð±Ð¾Ð»ÐµÐµ [NETWORK_PING_CRITICAL] мÑ
+ </floater.string>
+ <floater.string name="network_ping_warning_msg">
+ Пинг ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ [NETWORK_PING_WARNING]–[NETWORK_PING_CRITICAL] мÑ
+ </floater.string>
+ <floater.string name="network_packet_loss_cause_msg">
+ Возможно, плохое Ñоединение, или параметр «Ширина канала» Ñлишком велик.
+ </floater.string>
+ <floater.string name="network_ping_cause_msg">
+ Возможно, плохое Ñоединение или еÑÑ‚ÑŒ работающие файлообменные программы.
+ </floater.string>
+ <floater.string name="server_text_msg">
+ Сервер
+ </floater.string>
+ <floater.string name="server_frame_rate_critical_fps">
+ 20
+ </floater.string>
+ <floater.string name="server_frame_rate_warning_fps">
+ 30
+ </floater.string>
+ <floater.string name="server_single_process_max_time_ms">
+ 20
+ </floater.string>
+ <floater.string name="server_frame_time_critical_msg">
+ ЧаÑтота кадров Ñервера ниже [SERVER_FRAME_RATE_CRITICAL]
+ </floater.string>
+ <floater.string name="server_frame_time_warning_msg">
+ ЧаÑтота кадров Ñервера [SERVER_FRAME_RATE_CRITICAL]–[SERVER_FRAME_RATE_WARNING]
+ </floater.string>
+ <floater.string name="server_frame_time_normal_msg">
+ Ðормально
+ </floater.string>
+ <floater.string name="server_physics_cause_msg">
+ Ð’Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð°Ñ Ð¿Ñ€Ð¸Ñ‡Ð¸Ð½Ð°: Ñлишком много физичеÑких объектов
+ </floater.string>
+ <floater.string name="server_scripts_cause_msg">
+ Ð’Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð°Ñ Ð¿Ñ€Ð¸Ñ‡Ð¸Ð½Ð°: Ñлишком много Ñкриптовых объектов
+ </floater.string>
+ <floater.string name="server_net_cause_msg">
+ Ð’Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð°Ñ Ð¿Ñ€Ð¸Ñ‡Ð¸Ð½Ð°: Ñлишком большой Ñетевой трафик
+ </floater.string>
+ <floater.string name="server_agent_cause_msg">
+ Ð’Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð°Ñ Ð¿Ñ€Ð¸Ñ‡Ð¸Ð½Ð°: Ñлишком много людей в регионе
+ </floater.string>
+ <floater.string name="server_images_cause_msg">
+ Ð’Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð°Ñ Ð¿Ñ€Ð¸Ñ‡Ð¸Ð½Ð°: Ñлишком много изображений
+ </floater.string>
+ <floater.string name="server_generic_cause_msg">
+ Ð’Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð°Ñ Ð¿Ñ€Ð¸Ñ‡Ð¸Ð½Ð°: Ñервер Ñильно загружен
+ </floater.string>
+ <floater.string name="smaller_label">
+ &gt;&gt;
+ </floater.string>
+ <floater.string name="bigger_label">
+ &lt;&lt;
+ </floater.string>
+ <button name="client_lagmeter" tool_tip="Уровень лагов клиента"/>
+ <text name="client">
+ Клиент
+ </text>
+ <text name="client_text">
+ Ðормально
+ </text>
+ <button name="network_lagmeter" tool_tip="Уровень лагов Ñети"/>
+ <text name="network">
+ Сеть
+ </text>
+ <text name="network_text">
+ Ðормально
+ </text>
+ <button name="server_lagmeter" tool_tip="Уровень лагов Ñервера"/>
+ <text name="server">
+ Сервер
+ </text>
+ <text name="server_text">
+ Ðормально
+ </text>
+ <button label="&gt;&gt;" name="minimize" tool_tip="Переключение размера"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_land_holdings.xml b/indra/newview/skins/default/xui/ru/floater_land_holdings.xml
new file mode 100644
index 0000000000..17d347867d
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_land_holdings.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="land holdings floater" title="МОЯ ЗЕМЛЯ">
+ <floater.string name="area_string">
+ [AREA] м²
+ </floater.string>
+ <scroll_list name="parcel list">
+ <scroll_list.columns label="УчаÑток" name="name"/>
+ <scroll_list.columns label="Регион" name="location"/>
+ <scroll_list.columns label="Тип" name="type"/>
+ <scroll_list.columns label="Площадь" name="area"/>
+ </scroll_list>
+ <button label="Телепорт" label_selected="Телепорт" name="Teleport" tool_tip="ТелепортироватьÑÑ Ð² центр Ñтой земли."/>
+ <button label="Карта" label_selected="Карта" name="Show on Map" tool_tip="Показать Ñту землю на карте мира."/>
+ <text name="contrib_label">
+ Ваши Ð²Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð² группы:
+ </text>
+ <scroll_list name="grant list">
+ <scroll_list.columns label="Группа" name="group"/>
+ <scroll_list.columns label="Площадь" name="area"/>
+ </scroll_list>
+ <text name="allowed_label">
+ Разрешенный размер владений Ð´Ð»Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ³Ð¾ плана оплат:
+ </text>
+ <text name="allowed_text">
+ [AREA] м²
+ </text>
+ <text name="current_label">
+ Текущий размер владений:
+ </text>
+ <text name="current_text">
+ [AREA] м²
+ </text>
+ <text name="available_label">
+ ДоÑтупно Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð¾Ð±Ñ€ÐµÑ‚ÐµÐ½Ð¸Ñ:
+ </text>
+ <text name="available_text">
+ [AREA] м²
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/ru/floater_live_lsleditor.xml
new file mode 100644
index 0000000000..d8047fc045
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_live_lsleditor.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="script ed float" title="СКРИПТ: СОЗДÐТЬ СКРИПТ">
+ <floater.string name="not_allowed">
+ Ð’Ñ‹ не можете проÑматривать и изменÑÑ‚ÑŒ Ñтот Ñкрипт, поÑкольку Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ выбрана ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ Â«Ð½Ðµ копируемые». Ð”Ð»Ñ Ð¿Ñ€Ð¾Ñмотра или Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñкрипта в объекте нужны полные права доÑтупа.
+ </floater.string>
+ <floater.string name="script_running">
+ ВыполнÑетÑÑ
+ </floater.string>
+ <floater.string name="Title">
+ СКРИПТ: [NAME]
+ </floater.string>
+ <button label="СброÑ" label_selected="СброÑ" name="Reset"/>
+ <check_box initial_value="иÑтина" label="ВыполнÑетÑÑ" name="running"/>
+ <check_box initial_value="иÑтина" label="Моно" name="mono"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_lsl_guide.xml b/indra/newview/skins/default/xui/ru/floater_lsl_guide.xml
new file mode 100644
index 0000000000..95a3b8b2a0
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_lsl_guide.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="script ed float" title="СПРÐВКРПО LSL">
+ <check_box label="КурÑор" name="lock_check"/>
+ <combo_box label="Блокировка" name="history_combo"/>
+ <button label="Ðазад" name="back_btn"/>
+ <button label="Вперед" name="fwd_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_map.xml b/indra/newview/skins/default/xui/ru/floater_map.xml
new file mode 100644
index 0000000000..59ceb0a773
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_map.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Map" title="МИÐИКÐРТÐ">
+ <floater.string name="ToolTipMsg">
+ [REGION](Двойной щелчок открывает карту, shift+перетÑгивание – обзор)
+ </floater.string>
+ <floater.string name="AltToolTipMsg">
+ [REGION](Двойной щелчок – телепортациÑ, shift+перетÑгивание – обзор)
+ </floater.string>
+ <floater.string name="mini_map_caption">
+ Миникарта
+ </floater.string>
+ <text label="С" name="floater_map_north">
+ С
+ </text>
+ <text label="E" name="floater_map_east">
+ E
+ </text>
+ <text label="З" name="floater_map_west">
+ З
+ </text>
+ <text label="Ю" name="floater_map_south">
+ Ю
+ </text>
+ <text label="ЮВ" name="floater_map_southeast">
+ ЮВ
+ </text>
+ <text label="СВ" name="floater_map_northeast">
+ СВ
+ </text>
+ <text label="ЮЗ" name="floater_map_southwest">
+ ЮЗ
+ </text>
+ <text label="СЗ" name="floater_map_northwest">
+ СЗ
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_media_browser.xml b/indra/newview/skins/default/xui/ru/floater_media_browser.xml
new file mode 100644
index 0000000000..d1fc105046
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_media_browser.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_about" title="БРÐУЗЕР ДЛЯ ПРОСМОТРРМЕДИÐ">
+ <floater.string name="home_page_url">
+ http://www.secondlife.com
+ </floater.string>
+ <floater.string name="support_page_url">
+ http://support.secondlife.com
+ </floater.string>
+ <layout_stack name="stack1">
+ <layout_panel name="nav_controls">
+ <button label="Ðазад" name="back"/>
+ <button label="Вперед" name="forward"/>
+ <button label="Обновить" name="reload"/>
+ <button label="Перейти" name="go"/>
+ </layout_panel>
+ <layout_panel name="time_controls">
+ <button label="назад" name="rewind"/>
+ <button label="оÑтановить" name="stop"/>
+ <button label="вперед" name="seek"/>
+ </layout_panel>
+ <layout_panel name="parcel_owner_controls">
+ <button label="Отправить текущую Ñтраницу на учаÑток" name="assign"/>
+ </layout_panel>
+ <layout_panel name="external_controls">
+ <button label="Открыть в моем браузере" name="open_browser"/>
+ <check_box label="Ð’Ñегда открывать в моем браузере" name="open_always"/>
+ <button label="Закрыть" name="close"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_media_settings.xml b/indra/newview/skins/default/xui/ru/floater_media_settings.xml
new file mode 100644
index 0000000000..1515cbb3b8
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_media_settings.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="media_settings" title="ÐÐСТРОЙКИ МЕДИÐ">
+ <button label="OK" label_selected="OK" name="OK"/>
+ <button label="Отмена" label_selected="Отмена" name="Cancel"/>
+ <button label="Применить" label_selected="Применить" name="Apply"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_mem_leaking.xml b/indra/newview/skins/default/xui/ru/floater_mem_leaking.xml
new file mode 100644
index 0000000000..7aa5c27cde
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_mem_leaking.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="MemLeak" title="ИМИТÐЦИЯ УТЕЧКИ ПÐМЯТИ">
+ <spinner label="СкороÑÑ‚ÑŒ утечки (байтов за кадр):" name="leak_speed"/>
+ <spinner label="МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÑƒÑ‚ÐµÑ‡ÐºÐ° памÑти (Мб):" name="max_leak"/>
+ <text name="total_leaked_label">
+ Ð¢ÐµÐºÑƒÑ‰Ð°Ñ ÑƒÑ‚ÐµÑ‡ÐºÐ° памÑти: [SIZE] КБ
+ </text>
+ <text name="note_label_1">
+ [NOTE1]
+ </text>
+ <text name="note_label_2">
+ [NOTE2]
+ </text>
+ <button label="Старт" name="start_btn"/>
+ <button label="Стоп" name="stop_btn"/>
+ <button label="ОÑвободить" name="release_btn"/>
+ <button label="Закрыть" name="close_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_merchant_outbox.xml b/indra/newview/skins/default/xui/ru/floater_merchant_outbox.xml
new file mode 100644
index 0000000000..332fa3b82f
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_merchant_outbox.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_merchant_outbox" title="ТОРГОВЫЕ ИСХОДЯЩИЕ">
+ <string name="OutboxFolderCount1">
+ 1 папка
+ </string>
+ <string name="OutboxFolderCountN">
+ [NUM] папки
+ </string>
+ <string name="OutboxImporting">
+ Отправка папок....
+ </string>
+ <string name="OutboxInitializing">
+ ИнициализациÑ...
+ </string>
+ <panel label="">
+ <panel>
+ <panel name="outbox_inventory_placeholder_panel">
+ <text name="outbox_inventory_placeholder_title">
+ Загрузка...
+ </text>
+ </panel>
+ </panel>
+ <panel>
+ <button label="Отправить в торговый центр" name="outbox_import_btn" tool_tip="Ð’Ñ‹Ñтавить на витрину моего магазина"/>
+ </panel>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_model_preview.xml b/indra/newview/skins/default/xui/ru/floater_model_preview.xml
new file mode 100644
index 0000000000..5bb96b8de4
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_model_preview.xml
@@ -0,0 +1,277 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Model Preview" title="ПЕРЕДÐЧРМОДЕЛИ">
+ <string name="status_idle"/>
+ <string name="status_parse_error">
+ Ошибка. Проблема при анализе файла DAE – Ñм. подробноÑти в журнале.
+ </string>
+ <string name="status_material_mismatch">
+ Ошибка. Материал модели не входит в Ñталонную модель.
+ </string>
+ <string name="status_reading_file">
+ Загрузка...
+ </string>
+ <string name="status_generating_meshes">
+ СоздаютÑÑ Ð¼ÐµÑˆÐ¸...
+ </string>
+ <string name="status_vertex_number_overflow">
+ Ошибка. ЧиÑло вершин превышает 65534. Прервано.
+ </string>
+ <string name="bad_element">
+ Ошибка: недопуÑтимый Ñлемент
+ </string>
+ <string name="high">
+ Ð’Ñ‹Ñокий
+ </string>
+ <string name="medium">
+ Средний
+ </string>
+ <string name="low">
+ Ðизкий
+ </string>
+ <string name="lowest">
+ Самый низкий
+ </string>
+ <string name="mesh_status_good">
+ ДоÑтавлено!
+ </string>
+ <string name="mesh_status_na">
+ Ð/Д
+ </string>
+ <string name="mesh_status_none">
+ Ðет
+ </string>
+ <string name="mesh_status_submesh_mismatch">
+ ОтличаетÑÑ Ñ‡Ð¸Ñло текÑтурируемых граней на уровнÑÑ… детализации.
+ </string>
+ <string name="mesh_status_mesh_mismatch">
+ ОтличаетÑÑ Ñ‡Ð¸Ñло ÑкземплÑров меша на уровнÑÑ… детализации.
+ </string>
+ <string name="mesh_status_too_many_vertices">
+ Слишком много вершин на уровне детализации.
+ </string>
+ <string name="mesh_status_missing_lod">
+ ОтÑутÑтвует необходимый уровень детализации.
+ </string>
+ <string name="mesh_status_invalid_material_list">
+ Материалы ÑƒÑ€Ð¾Ð²Ð½Ñ Ð´ÐµÑ‚Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ð¸ не входÑÑ‚ в Ñталонную модель.
+ </string>
+ <string name="layer_all">
+ Ð’Ñе
+ </string>
+ <string name="decomposing">
+ Ðнализ...
+ </string>
+ <string name="simplifying">
+ Упрощение...
+ </string>
+ <string name="tbd">
+ Позже
+ </string>
+ <panel name="left_panel">
+ <panel name="model_name_representation_panel">
+ <text name="name_label">
+ Ð˜Ð¼Ñ Ð¼Ð¾Ð´ÐµÐ»Ð¸:
+ </text>
+ <text name="model_category_label">
+ Эта модель предÑтавлÑет...
+ </text>
+ <combo_box name="model_category_combo">
+ <combo_item label="Выберите вариант..." name="Choose one"/>
+ <combo_item label="Форма аватара" name="Avatar shape"/>
+ <combo_item label="ПриÑоединение аватара" name="Avatar attachment"/>
+ <combo_item label="Подвижный объект (машина, животное)" name="Moving object (vehicle, animal)"/>
+ <combo_item label="Строительный компонент" name="Building Component"/>
+ <combo_item label="БольшаÑ, Ð½ÐµÐ¿Ð¾Ð´Ð²Ð¸Ð¶Ð½Ð°Ñ Ð¸ Ñ‚.д." name="Large, non moving etc"/>
+ <combo_item label="МалаÑ, Ð½ÐµÐ¿Ð¾Ð´Ð²Ð¸Ð¶Ð½Ð°Ñ Ð¸ Ñ‚.д." name="Smaller, non-moving etc"/>
+ <combo_item label="Ðи один из них" name="Not really any of these"/>
+ </combo_box>
+ </panel>
+ <tab_container name="import_tab">
+ <panel label="Уровень детализации" name="lod_panel" title="Уровень детализации">
+ <text initial_value="ИÑточник" name="source" value="ИÑточник"/>
+ <text initial_value="Треугольники" name="triangles" value="Треугольники"/>
+ <text initial_value="Вершины" name="vertices" value="Вершины"/>
+ <text initial_value="Ð’Ñ‹Ñокий" name="high_label" value="Ð’Ñ‹Ñокий"/>
+ <button label="Обзор..." name="lod_browse_high"/>
+ <text initial_value="0" name="high_triangles" value="0"/>
+ <text initial_value="0" name="high_vertices" value="0"/>
+ <text initial_value="Средний" name="medium_label" value="Средний"/>
+ <button label="Обзор..." name="lod_browse_medium"/>
+ <text initial_value="0" name="medium_triangles" value="0"/>
+ <text initial_value="0" name="medium_vertices" value="0"/>
+ <text initial_value="Ðизкий" name="low_label" value="Ðизкий"/>
+ <button label="Обзор..." name="lod_browse_low"/>
+ <text initial_value="0" name="low_triangles" value="0"/>
+ <text initial_value="0" name="low_vertices" value="0"/>
+ <text initial_value="Самый низкий" name="lowest_label" value="Самый низкий"/>
+ <button label="Обзор..." name="lod_browse_lowest"/>
+ <text initial_value="0" name="lowest_triangles" value="0"/>
+ <text initial_value="0" name="lowest_vertices" value="0"/>
+ <check_box label="Генерировать нормали" name="gen_normals"/>
+ <text initial_value="Угол Ñгиба:" name="crease_label" value="Угол Ñгиба:"/>
+ <spinner name="crease_angle" value="75"/>
+ </panel>
+ <panel label="Физика" name="physics_panel">
+ <panel name="physics geometry">
+ <text name="first_step_name">
+ Шаг 1. Уровень детализации
+ </text>
+ <combo_box name="physics_lod_combo" tool_tip="Уровень детализации Ð´Ð»Ñ Ñ„Ð¸Ð·Ð¸Ñ‡ÐµÑкой формы">
+ <combo_item name="choose_one">
+ Выберите вариант...
+ </combo_item>
+ <combo_item name="physics_high">
+ Ð’Ñ‹Ñокое
+ </combo_item>
+ <combo_item name="physics_medium">
+ Средний
+ </combo_item>
+ <combo_item name="physics_low">
+ Ðизкий
+ </combo_item>
+ <combo_item name="physics_lowest">
+ Самый низкий
+ </combo_item>
+ <combo_item name="load_from_file">
+ Из файла
+ </combo_item>
+ </combo_box>
+ <button label="Обзор..." name="physics_browse"/>
+ </panel>
+ <panel name="physics analysis">
+ <text name="method_label">
+ 2 Ñтап. Ðнализ
+ </text>
+ <text name="analysis_method_label">
+ Метод:
+ </text>
+ <text name="quality_label">
+ КачеÑтво:
+ </text>
+ <text name="smooth_method_label">
+ ГладкоÑÑ‚ÑŒ:
+ </text>
+ <check_box label="Закрыть отверÑтиÑ" name="Close Holes (Slow)"/>
+ <button label="Ðнализ" name="Decompose"/>
+ <button label="Отмена" name="decompose_cancel"/>
+ </panel>
+ <panel name="physics simplification">
+ <text name="second_step_label">
+ Шаг 3. Упрощение
+ </text>
+ <text name="simp_method_header">
+ Метод:
+ </text>
+ <text name="pass_method_header">
+ Проходов:
+ </text>
+ <text name="Detail Scale label">
+ МаÑштаб деталей:
+ </text>
+ <text name="Retain%_label">
+ СохранÑÑ‚ÑŒ:
+ </text>
+ <combo_box name="Combine Quality" value="1"/>
+ <button label="Упрощение" name="Simplify"/>
+ <button label="Отмена" name="simplify_cancel"/>
+ </panel>
+ <panel name="physics info">
+ <text name="results_text">
+ Результаты:
+ </text>
+ <text name="physics_triangles">
+ Треугольников: [TRIANGLES],
+ </text>
+ <text name="physics_points">
+ Вершин: [POINTS],
+ </text>
+ <text name="physics_hulls">
+ Оболочек: [HULLS]
+ </text>
+ </panel>
+ </panel>
+ <panel label="Параметры передачи" name="modifiers_panel">
+ <text name="scale_label">
+ МаÑштаб (1=не маÑштабировать):
+ </text>
+ <spinner name="import_scale" value="1.0"/>
+ <text name="dimensions_label">
+ Размеры:
+ </text>
+ <text name="import_dimensions">
+ [X] X [Y] X [Z]
+ </text>
+ <check_box label="Включить текÑтуры" name="upload_textures"/>
+ <text name="include_label">
+ Только Ð´Ð»Ñ Ð¼Ð¾Ð´ÐµÐ»ÐµÐ¹ аватаров:
+ </text>
+ <check_box label="Включить Ð²ÐµÑ ÐºÐ¾Ð¶Ð¸" name="upload_skin"/>
+ <check_box label="Включить Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ ÑуÑтавов" name="upload_joints"/>
+ <text name="pelvis_offset_label">
+ Смещение по Z (поднÑÑ‚ÑŒ или опуÑтить аватар):
+ </text>
+ <spinner name="pelvis_offset" value="0.0"/>
+ </panel>
+ </tab_container>
+ <panel name="weights_and_warning_panel">
+ <button label="РаÑÑчитать Ð²ÐµÑ Ð¸ плату" name="calculate_btn" tool_tip="РаÑÑчитать Ð²ÐµÑ Ð¸ плату"/>
+ <button label="Отмена" name="cancel_btn"/>
+ <button label="Передать" name="ok_btn" tool_tip="Передать в ÑимулÑтор"/>
+ <button label="ОчиÑтить наÑтройки и ÑброÑить форму" name="reset_btn"/>
+ <text name="upload_fee">
+ Плата за передачу: L$ [FEE]
+ </text>
+ <text name="prim_weight">
+ ВлиÑние земли: [EQ]
+ </text>
+ <text name="download_weight">
+ Загрузка: [ST]
+ </text>
+ <text name="physics_weight">
+ Физика: [PH]
+ </text>
+ <text name="server_weight">
+ Сервер: [SIM]
+ </text>
+ <text name="warning_title">
+ ПРИМЕЧÐÐИЕ.
+ </text>
+ <text name="warning_message">
+ У Ð²Ð°Ñ Ð½ÐµÑ‚ прав на передачу Ñеточных моделей. [[VURL] Узнайте, как] получить их.
+ </text>
+ <text name="status">
+ [STATUS]
+ </text>
+ </panel>
+ </panel>
+ <text name="lod_label">
+ ПроÑмотр:
+ </text>
+ <panel name="right_panel">
+ <combo_box name="preview_lod_combo" tool_tip="Уровень детализации при предварительном проÑмотре">
+ <combo_item name="high">
+ Ð’Ñ‹Ñокий
+ </combo_item>
+ <combo_item name="medium">
+ Среднее
+ </combo_item>
+ <combo_item name="low">
+ Ðизкий
+ </combo_item>
+ <combo_item name="lowest">
+ Самый низкий
+ </combo_item>
+ </combo_box>
+ <text name="label_display">
+ Показать...
+ </text>
+ <check_box label="Ребра" name="show_edges"/>
+ <check_box label="Физика" name="show_physics"/>
+ <check_box label="ТекÑтуры" name="show_textures"/>
+ <check_box label="Ð’ÐµÑ ÐºÐ¾Ð¶Ð¸" name="show_skin_weight"/>
+ <check_box label="СуÑтавы" name="show_joint_positions"/>
+ <text name="physics_explode_label">
+ ПроÑмотр разложениÑ:
+ </text>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_moveview.xml b/indra/newview/skins/default/xui/ru/floater_moveview.xml
new file mode 100644
index 0000000000..cb1fda1a1f
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_moveview.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="move_floater" title="ХОДЬБР/ БЕГ / ПОЛЕТ">
+ <string name="walk_forward_tooltip">
+ Идти вперед (нажмите Ñтрелку вверх или клавишу W)
+ </string>
+ <string name="walk_back_tooltip">
+ Идти назад (нажмите Ñтрелку вниз или клавишу S)
+ </string>
+ <string name="walk_left_tooltip">
+ Идти налево (нажмите Shift + Ñтрелку влево или клавишу A)
+ </string>
+ <string name="walk_right_tooltip">
+ Идти направо (нажмите Shift + Ñтрелку вправо или клавишу D)
+ </string>
+ <string name="run_forward_tooltip">
+ Бежать вперед (нажмите Ñтрелку вверх или клавишу W)
+ </string>
+ <string name="run_back_tooltip">
+ Бежать назад (нажмите Ñтрелку вниз или клавишу S)
+ </string>
+ <string name="run_left_tooltip">
+ Бежать налево (нажмите Shift + Ñтрелку влево или клавишу A)
+ </string>
+ <string name="run_right_tooltip">
+ Бежать направо (нажмите Shift + Ñтрелку вправо или клавишу D)
+ </string>
+ <string name="fly_forward_tooltip">
+ Лететь вперед (нажмите Ñтрелку вверх или клавишу W)
+ </string>
+ <string name="fly_back_tooltip">
+ Лететь назад (нажмите Ñтрелку вниз или клавишу S)
+ </string>
+ <string name="fly_left_tooltip">
+ Лететь налево (нажмите Shift + Ñтрелку влево или клавишу A)
+ </string>
+ <string name="fly_right_tooltip">
+ Лететь направо (нажмите Shift + Ñтрелку вправо или клавишу D)
+ </string>
+ <string name="fly_up_tooltip">
+ Лететь вверх (нажмите клавишу E)
+ </string>
+ <string name="fly_down_tooltip">
+ Лететь вниз (нажмите клавишу C)
+ </string>
+ <string name="jump_tooltip">
+ Прыгнуть (нажмите клавишу E)
+ </string>
+ <string name="crouch_tooltip">
+ ПриÑеÑÑ‚ÑŒ (нажмите клавишу C)
+ </string>
+ <string name="walk_title">
+ Ходьба
+ </string>
+ <string name="run_title">
+ Бег
+ </string>
+ <string name="fly_title">
+ Полет
+ </string>
+ <panel name="panel_actions">
+ <button name="turn left btn" tool_tip="Поворот налево (нажмите Ñтрелку влево или клавишу A)"/>
+ <joystick_slide name="move left btn" tool_tip="Идти налево (нажмите Shift + Ñтрелку влево или клавишу A)"/>
+ <button name="turn right btn" tool_tip="Поворот направо (нажмите Ñтрелку вправо или клавишу D)"/>
+ <joystick_slide name="move right btn" tool_tip="Идти направо (нажмите Shift + Ñтрелку вправо или клавишу D)"/>
+ <joystick_turn name="forward btn" tool_tip="Идти вперед (нажмите Ñтрелку вверх или клавишу W)"/>
+ <joystick_turn name="backward btn" tool_tip="Идти назад (нажмите Ñтрелку вниз или клавишу S)"/>
+ <button name="move up btn" tool_tip="Лететь вверх (нажмите клавишу E)"/>
+ <button name="move down btn" tool_tip="Лететь вниз (нажмите клавишу C)"/>
+ </panel>
+ <panel name="panel_modes">
+ <button label="" name="mode_walk_btn" tool_tip="Режим ходьбы"/>
+ <button label="" name="mode_run_btn" tool_tip="Режим бега"/>
+ <button label="" name="mode_fly_btn" tool_tip="Режим полета"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_mute_object.xml b/indra/newview/skins/default/xui/ru/floater_mute_object.xml
new file mode 100644
index 0000000000..44177acb53
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_mute_object.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="block by name" title="Ð’ ЧЕРÐЫЙ СПИСОК">
+ <text name="message">
+ ВнеÑти в черный ÑпиÑок объект:
+ </text>
+ <line_editor name="object_name">
+ Ðазвание объекта
+ </line_editor>
+ <text name="note">
+ * БлокируютÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð°, но не звуки
+ </text>
+ <button label="ОК" name="OK"/>
+ <button label="Отмена" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_my_appearance.xml b/indra/newview/skins/default/xui/ru/floater_my_appearance.xml
new file mode 100644
index 0000000000..b90d80f3fd
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_my_appearance.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_my_appearance" title="Ð’ÐЕШÐОСТЬ">
+ <panel label="Изменить внешний вид" name="main_panel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_my_inventory.xml b/indra/newview/skins/default/xui/ru/floater_my_inventory.xml
new file mode 100644
index 0000000000..534d2a5774
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_my_inventory.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_my_inventory" title="ИÐВЕÐТÐРЬ"/>
diff --git a/indra/newview/skins/default/xui/ru/floater_nearby_chat.xml b/indra/newview/skins/default/xui/ru/floater_nearby_chat.xml
new file mode 100644
index 0000000000..184c753e40
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_nearby_chat.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="nearby_chat" title="ЛОКÐЛЬÐЫЙ ЧÐТ">
+ <check_box label="Перевод чата" name="translate_chat_checkbox"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_notification.xml b/indra/newview/skins/default/xui/ru/floater_notification.xml
new file mode 100644
index 0000000000..c3e299202c
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_notification.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="notification" title="КОÐСОЛЬ УВЕДОМЛЕÐИЙ">
+ <text_editor name="payload">
+ Загрузка...
+ </text_editor>
+ <combo_box label="Ответ" name="response"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_notifications_console.xml b/indra/newview/skins/default/xui/ru/floater_notifications_console.xml
new file mode 100644
index 0000000000..bd836590e1
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_notifications_console.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="notifications_console" title="КОÐСОЛЬ УВЕДОМЛЕÐИЙ">
+ <combo_box label="Выбор типа уведомлениÑ" name="notification_types"/>
+ <button label="Добавить" name="add_notification"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_object_weights.xml b/indra/newview/skins/default/xui/ru/floater_object_weights.xml
new file mode 100644
index 0000000000..41e0118732
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_object_weights.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="object_weights" title="ДОПОЛÐИТЕЛЬÐО">
+ <floater.string name="nothing_selected" value="--"/>
+ <text name="selected_text" value="ВЫБРÐÐО"/>
+ <text name="objects" value="--"/>
+ <text name="objects_label" value="Объекты"/>
+ <text name="prims" value="--"/>
+ <text name="prims_label" value="Примитивы"/>
+ <text name="weights_of_selected_text" value="ВЕС ВЫБРÐÐÐОГО"/>
+ <text name="download" value="--"/>
+ <text name="download_label" value="Загрузить"/>
+ <text name="physics" value="--"/>
+ <text name="physics_label" value="Физика"/>
+ <text name="server" value="--"/>
+ <text name="server_label" value="Сервер"/>
+ <text name="display" value="--"/>
+ <text name="display_label" value="Показать"/>
+ <text name="land_impacts_text" value="ВОЗДЕЙСТВИЕ ÐРЗЕМЛЮ"/>
+ <text name="selected" value="--"/>
+ <text name="selected_label" value="Выбрано"/>
+ <text name="rezzed_on_land" value="--"/>
+ <text name="rezzed_on_land_label" value="Выложено на землю"/>
+ <text name="remaining_capacity" value="--"/>
+ <text name="remaining_capacity_label" value="ОÑтаток емкоÑти"/>
+ <text name="total_capacity" value="--"/>
+ <text name="total_capacity_label" value="ÐžÐ±Ñ‰Ð°Ñ ÐµÐ¼ÐºÐ¾ÑÑ‚ÑŒ"/>
+ <text name="help_SLURL" value="[secondlife:///app/help/object_weights Что Ñто такое?...]"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_openobject.xml b/indra/newview/skins/default/xui/ru/floater_openobject.xml
new file mode 100644
index 0000000000..5da308eecb
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_openobject.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="objectcontents" title="СОДЕРЖИМОЕ ОБЪЕКТÐ">
+ <text name="object_name">
+ [DESC]:
+ </text>
+ <button label="Копировать в инвентарь" label_selected="Копировать в инвентарь" name="copy_to_inventory_button"/>
+ <button label="Копировать и надеть" label_selected="Копировать и надеть" name="copy_and_wear_button"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_outfit_save_as.xml b/indra/newview/skins/default/xui/ru/floater_outfit_save_as.xml
new file mode 100644
index 0000000000..301206e473
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_outfit_save_as.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="modal container" title="СОХРÐÐИТЬ КОСТЮМ">
+ <button label="Сохранить" label_selected="Сохранить" name="Save"/>
+ <button label="Отмена" label_selected="Отмена" name="Cancel"/>
+ <text name="Save item as:">
+ Сохранить текущую одежду
+как новый коÑтюм
+ </text>
+ <line_editor name="name ed">
+ [DESC] (новый)
+ </line_editor>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_outgoing_call.xml b/indra/newview/skins/default/xui/ru/floater_outgoing_call.xml
new file mode 100644
index 0000000000..5e50a75b85
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_outgoing_call.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="outgoing call" title="ЗВОÐОК">
+ <floater.string name="lifetime">
+ 5
+ </floater.string>
+ <floater.string name="localchat">
+ Ближайший голоÑовой чат
+ </floater.string>
+ <floater.string name="anonymous">
+ анонимный
+ </floater.string>
+ <floater.string name="VoiceInviteP2P">
+ звонит.
+ </floater.string>
+ <floater.string name="VoiceInviteAdHoc">
+ приÑоединилÑÑ Ðº ÑеанÑу голоÑового чата Ñ ÐºÐ¾Ð½Ñ„ÐµÑ€ÐµÐ½Ñ†Ð¸ÐµÐ¹.
+ </floater.string>
+ <text name="connecting">
+ Подключение к [CALLEE_NAME]
+ </text>
+ <text name="calling">
+ Вызов [CALLEE_NAME]
+ </text>
+ <text name="noanswer">
+ Ðет ответа. Повторите попытку позже.
+ </text>
+ <text name="nearby">
+ Вы были отключены от [VOICE_CHANNEL_NAME]. [RECONNECT_NEARBY]
+ </text>
+ <text name="nearby_P2P_by_other">
+ Вызов завершен. [RECONNECT_NEARBY]
+ </text>
+ <text name="nearby_P2P_by_agent">
+ Вы завершили вызов. [RECONNECT_NEARBY]
+ </text>
+ <text name="leaving">
+ Выход из [CURRENT_CHAT].
+ </text>
+ <button label="Отмена" label_selected="Отмена" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_pay.xml b/indra/newview/skins/default/xui/ru/floater_pay.xml
new file mode 100644
index 0000000000..1471a7e133
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_pay.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Give Money">
+ <string name="payee_group">
+ Заплатить группе
+ </string>
+ <string name="payee_resident">
+ Заплатить жителю
+ </string>
+ <text name="payee_name">
+ Слишком длинное теÑтовое Ð¸Ð¼Ñ Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ обрезаниÑ
+ </text>
+ <button label="L$1" label_selected="L$1" name="fastpay 1"/>
+ <button label="L$5" label_selected="L$5" name="fastpay 5"/>
+ <button label="L$10" label_selected="L$10" name="fastpay 10"/>
+ <button label="L$20" label_selected="L$20" name="fastpay 20"/>
+ <text name="amount text">
+ Или введите количеÑтво:
+ </text>
+ <button label="Заплатить" label_selected="Заплатить" name="pay btn"/>
+ <button label="Отмена" label_selected="Отмена" name="cancel btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_pay_object.xml b/indra/newview/skins/default/xui/ru/floater_pay_object.xml
new file mode 100644
index 0000000000..7d2da44ac1
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_pay_object.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Give Money">
+ <string name="payee_group">
+ Заплатить группе
+ </string>
+ <string name="payee_resident">
+ Заплатить жителю
+ </string>
+ <text name="payee_name">
+ Ericacita Moostopolison
+ </text>
+ <text name="object_name_label">
+ Через объект:
+ </text>
+ <icon name="icon_object" tool_tip="Объекты"/>
+ <text name="object_name_text">
+ Мой офигенный объект Ñ Ð½ÐµÑпичеÑки длинным названием
+ </text>
+ <button label="L$1" label_selected="L$1" name="fastpay 1"/>
+ <button label="L$5" label_selected="L$5" name="fastpay 5"/>
+ <button label="L$10" label_selected="L$10" name="fastpay 10"/>
+ <button label="L$20" label_selected="L$20" name="fastpay 20"/>
+ <text name="amount text">
+ Или введите количеÑтво:
+ </text>
+ <button label="Заплатить" label_selected="Заплатить" name="pay btn"/>
+ <button label="Отмена" label_selected="Отмена" name="cancel btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_people.xml b/indra/newview/skins/default/xui/ru/floater_people.xml
new file mode 100644
index 0000000000..7abc34986a
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_people.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_people" title="ЛЮДИ">
+ <panel_container name="main_panel">
+ <panel label="Профиль группы" name="panel_group_info_sidetray"/>
+ <panel label="Черный ÑпиÑок жителей и объектов" name="panel_block_list_sidetray"/>
+ </panel_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_perm_prefs.xml b/indra/newview/skins/default/xui/ru/floater_perm_prefs.xml
new file mode 100644
index 0000000000..a704b87bd1
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_perm_prefs.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="perm prefs" title="СТÐÐДÐРТÐЫЕ РÐЗРЕШЕÐИЯ ÐРПЕРЕДÐЧУ">
+ <panel label="РазрешениÑ" name="permissions">
+ <check_box label="ПоделитьÑÑ Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð¾Ð¹" name="share_with_group"/>
+ <check_box label="Разрешить вÑем копировать" name="everyone_copy"/>
+ <text name="NextOwnerLabel">
+ Следующий владелец может:
+ </text>
+ <check_box label="изменÑÑ‚ÑŒ" name="next_owner_modify"/>
+ <check_box label="копировать" name="next_owner_copy"/>
+ <check_box initial_value="иÑтина" label="перепродавать/отдавать" name="next_owner_transfer"/>
+ </panel>
+ <button label="ОК" label_selected="ОК" name="ok"/>
+ <button label="Отмена" label_selected="Отмена" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_picks.xml b/indra/newview/skins/default/xui/ru/floater_picks.xml
new file mode 100644
index 0000000000..e0ae8d6f03
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_picks.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_picks" title="Подборка"/>
diff --git a/indra/newview/skins/default/xui/ru/floater_places.xml b/indra/newview/skins/default/xui/ru/floater_places.xml
new file mode 100644
index 0000000000..2a22a855ef
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_places.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_places" title="МЕСТÐ">
+ <panel label="МеÑта" name="main_panel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_post_process.xml b/indra/newview/skins/default/xui/ru/floater_post_process.xml
new file mode 100644
index 0000000000..ae97670548
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_post_process.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Post-Process Floater" title="ÐÐСТРОЙКИ ПОСЛЕДУЮЩЕЙ ОБРÐБОТКИ">
+ <tab_container name="Post-Process Tabs">
+ <panel label="Цветовой фильтр" name="wmiColorFilterPanel">
+ <check_box label="Вкл." name="wmiColorFilterToggle"/>
+ <text name="wmiColorFilterBrightnessText">
+ ЯркоÑÑ‚ÑŒ
+ </text>
+ <text name="wmiColorFilterSaturationText">
+ ÐаÑыщенноÑÑ‚ÑŒ
+ </text>
+ <text name="wmiColorFilterContrastText">
+ КонтраÑтноÑÑ‚ÑŒ
+ </text>
+ <text name="wmiColorFilterBaseText">
+ ОÑновной цвет контраÑтноÑти
+ </text>
+ <slider label="К" name="wmiColorFilterBaseR"/>
+ <slider label="З" name="wmiColorFilterBaseG"/>
+ <slider label="С" name="wmiColorFilterBaseB"/>
+ <slider label="И" name="wmiColorFilterBaseI"/>
+ </panel>
+ <panel label="Ðочное видение" name="wmiNightVisionPanel">
+ <check_box label="Вкл." name="wmiNightVisionToggle"/>
+ <text name="wmiNightVisionBrightMultText">
+ КоÑффициент уÑÐ¸Ð»ÐµÐ½Ð¸Ñ Ñвета
+ </text>
+ <text name="wmiNightVisionNoiseSizeText">
+ Размер иÑкажений
+ </text>
+ <text name="wmiNightVisionNoiseStrengthText">
+ МощноÑÑ‚ÑŒ иÑкажений
+ </text>
+ </panel>
+ <panel label="Ореол" name="wmiBloomPanel">
+ <check_box label="Вкл." name="wmiBloomToggle"/>
+ <text name="wmiBloomExtractText">
+ ЯркоÑÑ‚ÑŒ Ñвета
+ </text>
+ <text name="wmiBloomSizeText">
+ Размер ореола
+ </text>
+ <text name="wmiBloomStrengthText">
+ МощноÑÑ‚ÑŒ ореола
+ </text>
+ </panel>
+ <panel label="Дополнительно" name="Extras">
+ <button label="Загрузить Ñффект" label_selected="Загрузить Ñффект" name="PPLoadEffect"/>
+ <button label="Сохранить Ñффект" label_selected="Сохранить Ñффект" name="PPSaveEffect"/>
+ <line_editor label="Ðазвание Ñффекта" name="PPEffectNameEditor"/>
+ </panel>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_postcard.xml b/indra/newview/skins/default/xui/ru/floater_postcard.xml
new file mode 100644
index 0000000000..889d219511
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_postcard.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Postcard" title="ПОСЛÐТЬ СÐИМОК ПО EMAIL">
+ <floater.string name="default_subject">
+ Открытка из [SECOND_LIFE].
+ </floater.string>
+ <floater.string name="default_message">
+ Побывай здеÑÑŒ!
+ </floater.string>
+ <floater.string name="upload_message">
+ Отправка...
+ </floater.string>
+ <text name="to_label">
+ Email получателÑ:
+ </text>
+ <text name="from_label">
+ Ваш Email:
+ </text>
+ <text name="name_label">
+ Ваше имÑ:
+ </text>
+ <text name="subject_label">
+ Тема:
+ </text>
+ <line_editor label="Введите тему пиÑьма." name="subject_form"/>
+ <text name="msg_label">
+ Сообщение:
+ </text>
+ <text_editor name="msg_form">
+ Введите текÑÑ‚ пиÑьма.
+ </text_editor>
+ <button label="Отмена" name="cancel_btn"/>
+ <button label="Отправить" name="send_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_preferences.xml b/indra/newview/skins/default/xui/ru/floater_preferences.xml
new file mode 100644
index 0000000000..fc244b9d8b
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_preferences.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Preferences" title="ÐÐСТРОЙКИ">
+ <button label="ОК" label_selected="ОК" name="OK"/>
+ <button label="Отмена" label_selected="Отмена" name="Cancel"/>
+ <tab_container name="pref core">
+ <panel label="Общие" name="general"/>
+ <panel label="Графика" name="display"/>
+ <panel label="Звук и медиа" name="audio"/>
+ <panel label="Чат" name="chat"/>
+ <panel label="Движение и обзор" name="move"/>
+ <panel label="УведомлениÑ" name="msgs"/>
+ <panel label="Цвета" name="colors"/>
+ <panel label="ПриватноÑÑ‚ÑŒ" name="im"/>
+ <panel label="КонфигурациÑ" name="input"/>
+ <panel label="Дополнительно" name="advanced1"/>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_preferences_proxy.xml b/indra/newview/skins/default/xui/ru/floater_preferences_proxy.xml
new file mode 100644
index 0000000000..4eecfedf17
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_preferences_proxy.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Proxy Settings Floater" title="ÐаÑтройки прокÑи-Ñервера">
+ <check_box initial_value="ложь" label="ИÑпользовать HTTP-прокÑи Ð´Ð»Ñ Ð²ÐµÐ±-Ñтраниц" name="web_proxy_enabled"/>
+ <text name="http_proxy_label">
+ HTTP-прокÑи:
+ </text>
+ <line_editor name="web_proxy_editor" tool_tip="Ð˜Ð¼Ñ DNS или IP-Ð°Ð´Ñ€ÐµÑ HTTP-прокÑи, который Ñледует иÑпользовать."/>
+ <spinner label="Ðомер порта:" name="web_proxy_port" tool_tip="Порт HTTP-прокÑи, который Ñледует иÑпользовать."/>
+ <check_box label="ИÑпользовать Ð´Ð»Ñ Ñ‚Ñ€Ð°Ñ„Ð¸ÐºÐ° UDP прокÑи-Ñервер SOCKS 5" name="socks_proxy_enabled"/>
+ <text name="socks5_proxy_label">
+ Сервер SOCKS 5:
+ </text>
+ <line_editor name="socks_proxy_editor" tool_tip="Ð˜Ð¼Ñ DNS или IP-Ð°Ð´Ñ€ÐµÑ Ð¿Ñ€Ð¾ÐºÑи-Ñервера SOCKS 5, который Ñледует иÑпользовать."/>
+ <spinner label="Ðомер порта:" name="socks_proxy_port" tool_tip="Порт прокÑи-Ñервера SOCKS 5, который Ñледует иÑпользовать."/>
+ <text name="socks_auth_label">
+ ÐÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ SOCKS:
+ </text>
+ <radio_group name="socks5_auth_type">
+ <radio_item label="Без аутентификации" name="Socks5NoAuth" tool_tip="ÐÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð½Ð° прокÑи-Ñервере SOCKS 5 не требуетÑÑ." value="Ðет"/>
+ <radio_item label="Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ/пароль" name="Socks5UserPass" tool_tip="Ðа прокÑи-Ñервере SOCKS 5 требуетÑÑ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ (Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸ пароль)." value="UserPass"/>
+ </radio_group>
+ <text name="socks5_username_label">
+ Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ:
+ </text>
+ <text name="socks5_password_label">
+ Пароль:
+ </text>
+ <line_editor name="socks5_username" tool_tip="Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ на Ñервере SOCKS 5"/>
+ <line_editor name="socks5_password" tool_tip="Пароль Ð´Ð»Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ на Ñервере SOCKS 5"/>
+ <text name="other_proxy_label">
+ Другой прокÑи-Ñервер HTTP-трафика:
+ </text>
+ <radio_group name="other_http_proxy_type">
+ <radio_item label="Ðе иÑпользовать прокÑи" name="OtherNoProxy" tool_tip="HTTP-трафик, не ÑвÑзанный Ñ Ð²ÐµÐ±-Ñайтами, ÐЕ будет передаватьÑÑ Ð½Ð° прокÑи-Ñервер." value="Ðет"/>
+ <radio_item label="ИÑпользовать HTTP-прокÑи" name="OtherHTTPProxy" tool_tip="HTTP-трафик, не ÑвÑзанный Ñ Ð²ÐµÐ±-узлами, будет передаватьÑÑ Ñ‡ÐµÑ€ÐµÐ· наÑтроенный веб-прокÑи." value="Веб"/>
+ <radio_item label="ИÑпользовать Ñервер SOCKS 5" name="OtherSocksProxy" tool_tip="HTTP-трафик, не ÑвÑзанный Ñ Ð²ÐµÐ±-узлами, будет передаватьÑÑ Ñ‡ÐµÑ€ÐµÐ· наÑтроенный Ñервер Socks 5." value="SOCKS"/>
+ </radio_group>
+ <button label="ОК" label_selected="ОК" name="OK"/>
+ <button label="Отмена" label_selected="Отмена" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_preview_animation.xml b/indra/newview/skins/default/xui/ru/floater_preview_animation.xml
new file mode 100644
index 0000000000..22c6bc5901
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_preview_animation.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="preview_anim">
+ <floater.string name="Title">
+ ÐнимациÑ: [NAME]
+ </floater.string>
+ <text name="desc txt">
+ ОпиÑание:
+ </text>
+ <button label="Проиграть Ð´Ð»Ñ Ð²Ñех" label_selected="Стоп" name="Inworld" tool_tip="Проигрывание Ñтой анимации могут видеть другие учаÑтники"/>
+ <button label="Проиграть Ð´Ð»Ñ ÑебÑ" label_selected="Стоп" name="Locally" tool_tip="Проигрывание Ñтой анимации можете видеть только вы"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_preview_gesture.xml b/indra/newview/skins/default/xui/ru/floater_preview_gesture.xml
new file mode 100644
index 0000000000..fde2cea00e
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_preview_gesture.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="gesture_preview">
+ <floater.string name="step_anim">
+ ВоÑпроизвеÑти анимацию:
+ </floater.string>
+ <floater.string name="step_sound">
+ ВоÑпроизвеÑти звук:
+ </floater.string>
+ <floater.string name="step_chat">
+ Сказать в чат:
+ </floater.string>
+ <floater.string name="step_wait">
+ Ждать:
+ </floater.string>
+ <floater.string name="stop_txt">
+ Стоп
+ </floater.string>
+ <floater.string name="preview_txt">
+ Предварительный проÑмотр
+ </floater.string>
+ <floater.string name="none_text">
+ - Ðичего -
+ </floater.string>
+ <floater.string name="Title">
+ ЖеÑÑ‚: [NAME]
+ </floater.string>
+ <text name="desc_label">
+ ОпиÑание:
+ </text>
+ <text name="trigger_label">
+ Сигнал:
+ </text>
+ <text name="replace_text" tool_tip="Заменить Ñигнальное Ñлово Ñтими Ñловами. Ðапример, еÑли Ñигнал – «здравÑтвуйте», а заменитель – «привет», то при вводе в чат фразы «Я хотел Ñказать здравÑтвуйте» поÑвитÑÑ Â«Ð¯ хотел Ñказать привет» вмеÑте Ñ Ð¶ÐµÑтом.">
+ Заменитель:
+ </text>
+ <line_editor name="replace_editor" tool_tip="Заменить Ñигнальное Ñлово Ñтими Ñловами. Ðапример, еÑли Ñигнал – «здравÑтвуйте», а заменитель – «привет», то при вводе в чат фразы «Я хотел Ñказать здравÑтвуйте» поÑвитÑÑ Â«Ð¯ хотел Ñказать привет» вмеÑте Ñ Ð¶ÐµÑтом."/>
+ <text name="key_label">
+ ГорÑÑ‡Ð°Ñ ÐºÐ»Ð°Ð²Ð¸ÑˆÐ°:
+ </text>
+ <combo_box label="Ðет" name="modifier_combo"/>
+ <combo_box label="Ðет" name="key_combo"/>
+ <text name="library_label">
+ Библиотека:
+ </text>
+ <scroll_list name="library_list">
+ <scroll_list.rows name="action_animation" value="ÐнимациÑ"/>
+ <scroll_list.rows name="action_sound" value="Звук"/>
+ <scroll_list.rows name="action_chat" value="Чат"/>
+ <scroll_list.rows name="action_wait" value="Ожидание"/>
+ </scroll_list>
+ <button label="Добавить &gt;&gt;" name="add_btn"/>
+ <text name="steps_label">
+ Шаги:
+ </text>
+ <button label="Вверх" name="up_btn"/>
+ <button label="Вниз" name="down_btn"/>
+ <button label="Удалить" name="delete_btn"/>
+ <text name="options_text">
+ (параметры)
+ </text>
+ <radio_group name="animation_trigger_type">
+ <radio_item label="Старт" name="start"/>
+ <radio_item label="Стоп" name="stop"/>
+ </radio_group>
+ <check_box label="до Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð°Ð½Ð¸Ð¼Ð°Ñ†Ð¸Ð¸" name="wait_anim_check"/>
+ <check_box label="Ð²Ñ€ÐµÐ¼Ñ Ð² Ñекундах:" name="wait_time_check"/>
+ <text name="help_label">
+ Ð’Ñе шаги выполнÑÑŽÑ‚ÑÑ Ð¾Ð´Ð½Ð¾Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ð¾, еÑли только вы не добавите шаги ожиданиÑ.
+ </text>
+ <check_box label="Ðктивный" name="active_check" tool_tip="Ðктивные жеÑÑ‚Ñ‹ можно включить путем ввода их триггеров в чат или нажатием горÑчих клавиш. ЖеÑÑ‚Ñ‹ обычно ÑтановÑÑ‚ÑÑ Ð½ÐµÐ°ÐºÑ‚Ð¸Ð²Ð½Ñ‹Ð¼Ð¸, еÑли возникает конфликт клавиш."/>
+ <button label="Предварительный проÑмотр" name="preview_btn"/>
+ <button label="Сохранить" name="save_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_preview_notecard.xml b/indra/newview/skins/default/xui/ru/floater_preview_notecard.xml
new file mode 100644
index 0000000000..2f39d4a4a4
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_preview_notecard.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="preview notecard" title="ЗÐМЕТКÐ:">
+ <floater.string name="no_object">
+ Ðевозможно найти объект, Ñодержащий Ñту заметку.
+ </floater.string>
+ <floater.string name="not_allowed">
+ У Ð²Ð°Ñ Ð½ÐµÑ‚ прав Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра заметки.
+ </floater.string>
+ <floater.string name="Title">
+ Заметка: [NAME]
+ </floater.string>
+ <text name="desc txt">
+ ОпиÑание:
+ </text>
+ <text_editor name="Notecard Editor">
+ Загрузка...
+ </text_editor>
+ <button label="Сохранить" label_selected="Сохранить" name="Save"/>
+ <button label="Удалить" label_selected="Удалить" name="Delete"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_preview_sound.xml b/indra/newview/skins/default/xui/ru/floater_preview_sound.xml
new file mode 100644
index 0000000000..691b2f3e82
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_preview_sound.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="preview_sound">
+ <floater.string name="Title">
+ Звук: [NAME]
+ </floater.string>
+ <text name="desc txt">
+ ОпиÑание:
+ </text>
+ <button label="Проиграть Ð´Ð»Ñ Ð²Ñех" label_selected="Проиграть Ð´Ð»Ñ Ð²Ñех" name="Sound play btn" tool_tip="ВоÑпроизведение Ñтого звука могут Ñлышать другие учаÑтники"/>
+ <button label="Проиграть Ð´Ð»Ñ ÑебÑ" label_selected="Проиграть Ð´Ð»Ñ ÑебÑ" name="Sound audition btn" tool_tip="ВоÑпроизведение Ñтого звука могу Ñлышать только Ñ"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_preview_texture.xml b/indra/newview/skins/default/xui/ru/floater_preview_texture.xml
new file mode 100644
index 0000000000..c9cb87282a
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_preview_texture.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="preview_texture">
+ <floater.string name="Title">
+ ТекÑтура: [NAME]
+ </floater.string>
+ <floater.string name="Copy">
+ Копировать в инвентарь
+ </floater.string>
+ <text name="desc txt">
+ ОпиÑание:
+ </text>
+ <text name="dimensions">
+ [WIDTH]x[HEIGHT] пикÑелей
+ </text>
+ <text name="aspect_ratio">
+ Соотношение Ñторон
+ </text>
+ <combo_box name="combo_aspect_ratio" tool_tip="ПроÑмотр Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼ Ñоотношением Ñторон">
+ <combo_item name="Unconstrained">
+ Без ограничениÑ
+ </combo_item>
+ <combo_item name="1:1" tool_tip="Символ группы или профиль в реальном мире">
+ 1:1
+ </combo_item>
+ <combo_item name="4:3" tool_tip="Профиль Ð´Ð»Ñ [SECOND_LIFE]">
+ 4:3
+ </combo_item>
+ <combo_item name="10:7" tool_tip="Реклама, поиÑк и закладки">
+ 10:7
+ </combo_item>
+ <combo_item name="3:2" tool_tip="О земле">
+ 3:2
+ </combo_item>
+ <combo_item name="16:10">
+ 16:10
+ </combo_item>
+ <combo_item name="16:9" tool_tip="Профиль подборки">
+ 16:9
+ </combo_item>
+ <combo_item name="2:1">
+ 2:1
+ </combo_item>
+ </combo_box>
+ <button label="OK" name="Keep"/>
+ <button label="Удалить" name="Discard"/>
+ <button label="Сохранить как" name="save_tex_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_price_for_listing.xml b/indra/newview/skins/default/xui/ru/floater_price_for_listing.xml
new file mode 100644
index 0000000000..fd513c8cdb
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_price_for_listing.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="price_for_listing" title="ОПУБЛИКОВÐТЬ РЕКЛÐМУ">
+ <text name="explanation_text">
+ Ваша реклама будет дейÑтвительна в течение недели Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ‚Ð° публикации.
+
+ÐŸÐ¾Ð·Ð¸Ñ†Ð¸Ñ Ð¾Ð±ÑŠÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÑетÑÑ ÑƒÐ¿Ð»Ð°Ñ‡ÐµÐ½Ð½Ð¾Ð¹ за него Ñуммой.
+
+Чем выше плата за объÑвление, тем выше оно раÑположено в ÑпиÑке и тем легче его найти.
+ </text>
+ <text name="price_text">
+ Цена за объÑвление:
+ </text>
+ <text name="price_symbol">
+ L$
+ </text>
+ <button label="ОК" name="set_price_btn"/>
+ <button label="Отмена" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_publish_classified.xml b/indra/newview/skins/default/xui/ru/floater_publish_classified.xml
new file mode 100644
index 0000000000..b9e33d6e22
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_publish_classified.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="publish_classified" title="ÐŸÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ Ñ€ÐµÐºÐ»Ð°Ð¼Ñ‹">
+ <text name="explanation_text">
+ Ваша реклама будет дейÑтвительна в течение недели Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ‚Ð° публикации.
+
+Помните, оплата за рекламу не возвращаетÑÑ.
+ </text>
+ <spinner label="Цена: L$" name="price_for_listing" tool_tip="Цена за размещение." value="50"/>
+ <button label="Опубликовать" name="publish_btn"/>
+ <button label="Отмена" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_region_debug_console.xml b/indra/newview/skins/default/xui/ru/floater_region_debug_console.xml
new file mode 100644
index 0000000000..d413a0bdcc
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_region_debug_console.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="region_debug_console" title="Отладка региона"/>
diff --git a/indra/newview/skins/default/xui/ru/floater_region_info.xml b/indra/newview/skins/default/xui/ru/floater_region_info.xml
new file mode 100644
index 0000000000..011b58e385
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_region_info.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="regioninfo" title="РЕГИОÐ/ЗЕМЛЕВЛÐДЕÐИЕ"/>
diff --git a/indra/newview/skins/default/xui/ru/floater_report_abuse.xml b/indra/newview/skins/default/xui/ru/floater_report_abuse.xml
new file mode 100644
index 0000000000..6fdbdacadc
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_report_abuse.xml
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_report_abuse" title="ПОЖÐЛОВÐТЬСЯ">
+ <floater.string name="Screenshot">
+ Снимок
+ </floater.string>
+ <check_box label="ИÑпользовать Ñтот Ñнимок" name="screen_check"/>
+ <text name="reporter_title">
+ Ðвтор:
+ </text>
+ <text name="sim_title">
+ Регион:
+ </text>
+ <text name="sim_field">
+ Ðазвание региона
+ </text>
+ <text name="pos_title">
+ Координаты:
+ </text>
+ <text name="pos_field">
+ {128.1, 128.1, 15.4}
+ </text>
+ <text name="select_object_label">
+ Ðажмите кнопку, затем объект-нарушитель:
+ </text>
+ <button name="pick_btn" tool_tip="Захват объекта – определÑет объект как Ñубъект Ñтого ÑообщениÑ"/>
+ <text name="object_name_label">
+ Объект:
+ </text>
+ <text name="owner_name_label">
+ Владелец:
+ </text>
+ <combo_box name="category_combo" tool_tip="ÐšÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ â€“ выберите категорию, наиболее подходÑщую по типу нарушениÑ">
+ <combo_box.item label="Выберите категорию" name="Select_category"/>
+ <combo_box.item label="ВозраÑÑ‚ &gt; Игровой возраÑÑ‚" name="Age__Age_play"/>
+ <combo_box.item label="ВозраÑÑ‚ &gt; ВзроÑлый житель в Second Life Ð´Ð»Ñ Ð¿Ð¾Ð´Ñ€Ð¾Ñтков" name="Age__Adult_resident_on_Teen_Second_Life"/>
+ <combo_box.item label="ВозраÑÑ‚ &gt; Малолетний житель в Second Life Ð´Ð»Ñ Ð¿Ð¾Ð´Ñ€Ð¾Ñтков" name="Age__Underage_resident_outside_of_Teen_Second_Life"/>
+ <combo_box.item label="Ðападение &gt; Ð‘Ð¾ÐµÐ²Ð°Ñ Â«Ð¿ÐµÑочница»/небезопаÑÐ½Ð°Ñ Ð¾Ð±Ð»Ð°ÑÑ‚ÑŒ" name="Assault__Combat_sandbox___unsafe_area"/>
+ <combo_box.item label="Ðападение &gt; БезопаÑÐ½Ð°Ñ Ð¾Ð±Ð»Ð°ÑÑ‚ÑŒ" name="Assault__Safe_area"/>
+ <combo_box.item label="Ðападение &gt; «ПеÑочница» иÑÐ¿Ñ‹Ñ‚Ð°Ð½Ð¸Ñ Ð¾Ñ€ÑƒÐ¶Ð¸Ñ" name="Assault__Weapons_testing_sandbox"/>
+ <combo_box.item label="ÐšÐ¾Ð¼Ð¼ÐµÑ€Ñ†Ð¸Ñ &gt; Ðе удалоÑÑŒ доÑтавить продукт или уÑлугу" name="Commerce__Failure_to_deliver_product_or_service"/>
+ <combo_box.item label="РаÑкрытие &gt; Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ реальном мире" name="Disclosure__Real_world_information"/>
+ <combo_box.item label="РаÑкрытие &gt; Удаленный контроль чата" name="Disclosure__Remotely_monitoring chat"/>
+ <combo_box.item label="РаÑкрытие &gt; ИнформациÑ/чат/мгновенные ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Second Life" name="Disclosure__Second_Life_information_chat_IMs"/>
+ <combo_box.item label="Ðарушение порÑдка &gt; ÐедоброÑовеÑтное иÑпользование реÑурÑов региона" name="Disturbing_the_peace__Unfair_use_of_region_resources"/>
+ <combo_box.item label="Ðарушение порÑдка &gt; Избыточно Ñкриптовые объекты" name="Disturbing_the_peace__Excessive_scripted_objects"/>
+ <combo_box.item label="Ðарушение порÑдка &gt; РазбраÑывание объектов" name="Disturbing_the_peace__Object_littering"/>
+ <combo_box.item label="Ðарушение порÑдка &gt; ПоÑтоÑнный Ñпам" name="Disturbing_the_peace__Repetitive_spam"/>
+ <combo_box.item label="Ðарушение порÑдка &gt; ÐÐµÐ¶ÐµÐ»Ð°Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ñ€ÐµÐºÐ»Ð°Ð¼Ð°" name="Disturbing_the_peace__Unwanted_advert_spam"/>
+ <combo_box.item label="МошенничеÑтво &gt; L$" name="Fraud__L$"/>
+ <combo_box.item label="МошенничеÑтво &gt; ЗемлÑ" name="Fraud__Land"/>
+ <combo_box.item label="МошенничеÑтво &gt; «Пирамида» или «пиÑьмо ÑчаÑтьѻ" name="Fraud__Pyramid_scheme_or_chain_letter"/>
+ <combo_box.item label="МошенничеÑтво &gt; US$" name="Fraud__US$"/>
+ <combo_box.item label="БеÑпокойÑтво &gt; Ð ÐµÐºÐ»Ð°Ð¼Ð½Ð°Ñ Ñ„ÐµÑ€Ð¼Ð°/видимый Ñпам" name="Harassment__Advert_farms___visual_spam"/>
+ <combo_box.item label="БеÑпокойÑтво &gt; Клевета на отдельных лиц или группы" name="Harassment__Defaming_individuals_or_groups"/>
+ <combo_box.item label="БеÑпокойÑтво &gt; ПрепÑÑ‚Ñтвие движению" name="Harassment__Impeding_movement"/>
+ <combo_box.item label="БеÑпокойÑтво &gt; СекÑуальное домогательÑтво" name="Harassment__Sexual_harassment"/>
+ <combo_box.item label="БеÑпокойÑтво &gt; ПодÑтрекательÑтво
/призыв к нарушению лицензионного ÑоглашениÑ" name="Harassment__Solicting_inciting_others_to_violate_ToS"/>
+ <combo_box.item label="БеÑпокойÑтво &gt; ОÑкорбление Ñловом" name="Harassment__Verbal_abuse"/>
+ <combo_box.item label="ÐеприÑтойноÑÑ‚ÑŒ &gt; Откровенно оÑкорбительное Ñодержимое или поведение" name="Indecency__Broadly_offensive_content_or_conduct"/>
+ <combo_box.item label="ÐеприÑтойноÑÑ‚ÑŒ &gt; Ðекорректное Ð¸Ð¼Ñ Ð°Ð²Ð°Ñ‚Ð°Ñ€Ð°" name="Indecency__Inappropriate_avatar_name"/>
+ <combo_box.item label="ÐеприÑтойноÑÑ‚ÑŒ &gt; Ðекорректное Ñодержимое или поведение в регионе PG" name="Indecency__Mature_content_in_PG_region"/>
+ <combo_box.item label="ÐеприÑтойноÑÑ‚ÑŒ &gt; Ðекорректное Ñодержимое или поведение в регионе Moderate" name="Indecency__Inappropriate_content_in_Mature_region"/>
+ <combo_box.item label="Ðарушение прав интеллектуальной ÑобÑтвенноÑти &gt; Удаление Ñодержимого" name="Intellectual_property_infringement_Content_Removal"/>
+ <combo_box.item label="Ðарушение прав интеллектуальной ÑобÑтвенноÑти &gt; CopyBot или нарушение разрешений" name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit"/>
+ <combo_box.item label="ÐетерпимоÑÑ‚ÑŒ" name="Intolerance"/>
+ <combo_box.item label="Ð—ÐµÐ¼Ð»Ñ &gt; Злоупотребление реÑурÑами «пеÑочницы»" name="Land__Abuse_of_sandbox_resources"/>
+ <combo_box.item label="Ð—ÐµÐ¼Ð»Ñ &gt; ПоÑÑгательÑтво &gt; Объекты/текÑтуры" name="Land__Encroachment__Objects_textures"/>
+ <combo_box.item label="Ð—ÐµÐ¼Ð»Ñ &gt; ПоÑÑгательÑтво &gt; ЧаÑтицы" name="Land__Encroachment__Particles"/>
+ <combo_box.item label="Ð—ÐµÐ¼Ð»Ñ &gt; ПоÑÑгательÑтво &gt; ДеревьÑ/раÑтениÑ" name="Land__Encroachment__Trees_plants"/>
+ <combo_box.item label="Пари/азартные игры" name="Wagering_gambling"/>
+ <combo_box.item label="Другое" name="Other"/>
+ </combo_box>
+ <text name="abuser_name_title">
+ Ð˜Ð¼Ñ Ð½Ð°Ñ€ÑƒÑˆÐ¸Ñ‚ÐµÐ»Ñ:
+ </text>
+ <button label="Выбор" name="select_abuser" tool_tip="Выбор имени Ð½Ð°Ñ€ÑƒÑˆÐ¸Ñ‚ÐµÐ»Ñ Ð¸Ð· ÑпиÑка"/>
+ <text name="abuser_name_title2">
+ МеÑто нарушениÑ:
+ </text>
+ <text name="sum_title">
+ Краткое опиÑание:
+ </text>
+ <text name="dscr_title">
+ ПодробноÑти:
+ </text>
+ <text name="bug_aviso">
+ Опишите проблему макÑимально подробно
+ </text>
+ <text name="incomplete_title">
+ * Ðеполные заÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð½Ðµ будут раÑÑматриватьÑÑ
+ </text>
+ <button label="Жалоба" label_selected="Жалоба" name="send_btn"/>
+ <button label="Отмена" label_selected="Отмена" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_script_debug.xml b/indra/newview/skins/default/xui/ru/floater_script_debug.xml
new file mode 100644
index 0000000000..b91fc4e4ff
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_script_debug.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<multi_floater name="script debug floater" title="ПредупреждениÑ/ошибки Ñкриптов"/>
diff --git a/indra/newview/skins/default/xui/ru/floater_script_debug_panel.xml b/indra/newview/skins/default/xui/ru/floater_script_debug_panel.xml
new file mode 100644
index 0000000000..e70a30fa24
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_script_debug_panel.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="script" short_title="[ALL SCRIPTS]" title="[ALL SCRIPTS]"/>
diff --git a/indra/newview/skins/default/xui/ru/floater_script_limits.xml b/indra/newview/skins/default/xui/ru/floater_script_limits.xml
new file mode 100644
index 0000000000..7805eac03b
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_script_limits.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="scriptlimits" title="ИÐФОРМÐЦИЯ О СКРИПТÐÐ¥"/>
diff --git a/indra/newview/skins/default/xui/ru/floater_script_preview.xml b/indra/newview/skins/default/xui/ru/floater_script_preview.xml
new file mode 100644
index 0000000000..78cefb7aa7
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_script_preview.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="preview lsl text" title="СКРИПТ: ROTATION SCRIPT">
+ <floater.string name="Title">
+ СКРИПТ: [NAME]
+ </floater.string>
+ <text name="desc txt">
+ ОпиÑание:
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_script_queue.xml b/indra/newview/skins/default/xui/ru/floater_script_queue.xml
new file mode 100644
index 0000000000..4f2e389b19
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_script_queue.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="queue" title="СБРОСИТЬ ПРОГРЕСС">
+ <floater.string name="Starting">
+ ЗапуÑк [START] объектов (объектов: [COUNT]).
+ </floater.string>
+ <floater.string name="Done">
+ Готово.
+ </floater.string>
+ <floater.string name="Resetting">
+ СброÑ
+ </floater.string>
+ <floater.string name="Running">
+ Запущен
+ </floater.string>
+ <floater.string name="NotRunning">
+ Ðе запущен
+ </floater.string>
+ <button label="Закрыть" label_selected="Закрыть" name="close"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_script_search.xml b/indra/newview/skins/default/xui/ru/floater_script_search.xml
new file mode 100644
index 0000000000..fc040f6593
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_script_search.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="script search" title="ПОИСК В СКРИПТЕ">
+ <check_box label="Без учета региÑтра" name="case_text"/>
+ <button label="ПоиÑк" label_selected="ПоиÑк" name="search_btn"/>
+ <button label="Заменить" label_selected="Заменить" name="replace_btn"/>
+ <button label="Заменить вÑе" label_selected="Заменить вÑе" name="replace_all_btn"/>
+ <text name="txt">
+ ПоиÑк
+ </text>
+ <text name="txt2">
+ Заменить
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_search.xml b/indra/newview/skins/default/xui/ru/floater_search.xml
new file mode 100644
index 0000000000..405a6598ac
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_search.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_search" title="">
+ <floater.string name="loading_text">
+ Загрузка...
+ </floater.string>
+ <floater.string name="done_text">
+ Готово
+ </floater.string>
+ <layout_stack name="stack1">
+ <layout_panel name="browser_layout">
+ <text name="refresh_search">
+ Повторить поиÑк, чтобы показать текущий уровень творца
+ </text>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_select_key.xml b/indra/newview/skins/default/xui/ru/floater_select_key.xml
new file mode 100644
index 0000000000..99c2b9a2c4
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_select_key.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="modal container">
+ <text name="Save item as:">
+ Ðажмите клавишу Ð´Ð»Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ/Ð²Ñ‹ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ñ€ÐµÑ‡Ð¸.
+ </text>
+ <button label="Отмена" label_selected="Отмена" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_sell_land.xml b/indra/newview/skins/default/xui/ru/floater_sell_land.xml
new file mode 100644
index 0000000000..e15f761101
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_sell_land.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="sell land" title="ПРОДÐЖРЗЕМЛИ">
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text name="info_parcel_label">
+ УчаÑток:
+ </text>
+ <text name="info_parcel">
+ ÐÐЗВÐÐИЕ УЧÐСТКÐ
+ </text>
+ <text name="info_size_label">
+ Размер:
+ </text>
+ <text name="info_size">
+ [AREA] м²
+ </text>
+ <text name="info_action">
+ Чтобы продать Ñтот учаÑток:
+ </text>
+ <text name="price_label">
+ 1. Ðазначьте цену:
+ </text>
+ <text name="price_text">
+ УÑтановите уÑтраивающую Ð²Ð°Ñ Ñ†ÐµÐ½Ñƒ.
+ </text>
+ <text name="price_ld">
+ L$
+ </text>
+ <line_editor name="price">
+ 0
+ </line_editor>
+ <text name="price_per_m">
+ (L$[PER_METER] за м²)
+ </text>
+ <text name="sell_to_label">
+ 2. Продажа земли:
+ </text>
+ <text name="sell_to_text">
+ Укажите, кому будете продавать землю.
+ </text>
+ <combo_box name="sell_to">
+ <combo_box.item label="- выберите -" name="--selectone--"/>
+ <combo_box.item label="Ð’Ñе" name="Anyone"/>
+ <combo_box.item label="Конкретному жителю:" name="Specificuser:"/>
+ </combo_box>
+ <button label="Выбрать" name="sell_to_select_agent"/>
+ <text name="sell_objects_label">
+ 3. Продать объекты вмеÑте Ñ Ð·ÐµÐ¼Ð»ÐµÐ¹?
+ </text>
+ <text name="sell_objects_text">
+ Перемещаемые объекты хозÑина Ñтой земли изменÑÑ‚ владельца?
+ </text>
+ <radio_group name="sell_objects">
+ <radio_item label="Ðет, Ñохранить владение объектами" name="no"/>
+ <radio_item label="Да, продать объекты вмеÑте Ñ Ð·ÐµÐ¼Ð»ÐµÐ¹" name="yes"/>
+ </radio_group>
+ <button label="Показать объекты" name="show_objects"/>
+ <text name="nag_message_label">
+ ПОМÐИТЕ: продажи Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ.
+ </text>
+ <button label="Ð’Ñ‹Ñтавить землю на продажу" name="sell_btn"/>
+ <button label="Отмена" name="cancel_btn"/>
+ </panel>
+ </scroll_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_settings_debug.xml b/indra/newview/skins/default/xui/ru/floater_settings_debug.xml
new file mode 100644
index 0000000000..7db014ef53
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_settings_debug.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="settings_debug" title="ÐÐСТРОЙКИ ОТЛÐДКИ">
+ <radio_group name="boolean_combo">
+ <radio_item label="ИСТИÐÐ" name="TRUE" value="иÑтина"/>
+ <radio_item label="ЛОЖЬ" name="FALSE" value=""/>
+ </radio_group>
+ <color_swatch label="Цвет" name="val_color_swatch"/>
+ <spinner label="x" name="val_spinner_1"/>
+ <spinner label="x" name="val_spinner_2"/>
+ <spinner label="x" name="val_spinner_3"/>
+ <spinner label="x" name="val_spinner_4"/>
+ <button label="Ð¡Ð±Ñ€Ð¾Ñ Ð² Ñтандартное значение" name="default_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_snapshot.xml b/indra/newview/skins/default/xui/ru/floater_snapshot.xml
new file mode 100644
index 0000000000..7e88630b32
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_snapshot.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Snapshot" title="ПРОСМОТР СÐИМКÐ">
+ <floater.string name="unknown">
+ неизвеÑтно
+ </floater.string>
+ <string name="postcard_progress_str">
+ Отправка пиÑьма
+ </string>
+ <string name="profile_progress_str">
+ ПубликациÑ
+ </string>
+ <string name="inventory_progress_str">
+ Сохранение в -инвентарь
+ </string>
+ <string name="local_progress_str">
+ Сохранение на компьютере
+ </string>
+ <string name="profile_succeeded_str">
+ Изображение отправлено
+ </string>
+ <string name="postcard_succeeded_str">
+ ПиÑьмо отправлено!
+ </string>
+ <string name="inventory_succeeded_str">
+ Сохранено в инвентаре!
+ </string>
+ <string name="local_succeeded_str">
+ Сохранено на компьютере!
+ </string>
+ <string name="profile_failed_str">
+ Ðе удалоÑÑŒ передать изображение в ваш профиль.
+ </string>
+ <string name="postcard_failed_str">
+ Ðе удалоÑÑŒ отправить пиÑьмо.
+ </string>
+ <string name="inventory_failed_str">
+ Ðе удалоÑÑŒ Ñохранить в инвентаре.
+ </string>
+ <string name="local_failed_str">
+ Ðе удалоÑÑŒ Ñохранить на компьютере.
+ </string>
+ <button name="advanced_options_btn" tool_tip="Дополнительные параметры"/>
+ <text name="image_res_text">
+ [WIDTH] x [HEIGHT] пикÑ.
+ </text>
+ <text name="file_size_label">
+ [SIZE] КБ
+ </text>
+ <panel name="advanced_options_panel">
+ <text name="advanced_options_label">
+ ДОПОЛÐИТЕЛЬÐЫЕ ПÐРÐМЕТРЫ
+ </text>
+ <text name="layer_type_label">
+ Захват:
+ </text>
+ <combo_box label="Слои изображениÑ" name="layer_types">
+ <combo_box.item label="Цвета" name="Colors"/>
+ <combo_box.item label="Глубина" name="Depth"/>
+ </combo_box>
+ <check_box label="ИнтерфейÑ" name="ui_check"/>
+ <check_box label="Данные в игре" name="hud_check"/>
+ <check_box label="Стоп-кадр (полноÑкранный)" name="freeze_frame_check"/>
+ <check_box label="Ðвтообновление" name="auto_snapshot_check"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_sound_devices.xml b/indra/newview/skins/default/xui/ru/floater_sound_devices.xml
new file mode 100644
index 0000000000..fc8de858cd
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_sound_devices.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_sound_devices" title="ЗВУКОВЫЕ УСТРОЙСТВÐ">
+ <text name="voice_label">
+ ГолоÑовой чат
+ </text>
+ <check_box label="Включен" name="enable_voice"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_sound_preview.xml b/indra/newview/skins/default/xui/ru/floater_sound_preview.xml
new file mode 100644
index 0000000000..6fdb12b76b
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_sound_preview.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Sound Preview" title="SOUND.WAV">
+ <text name="name_label">
+ Ðазвание:
+ </text>
+ <text name="description_label">
+ ОпиÑание:
+ </text>
+ <button label="Передать (L$[AMOUNT])" name="ok_btn"/>
+ <button label="Отмена" label_selected="Отмена" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_stats.xml b/indra/newview/skins/default/xui/ru/floater_stats.xml
new file mode 100644
index 0000000000..b1f60c8029
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_stats.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Statistics" title="СТÐТИСТИКÐ">
+ <scroll_container name="statistics_scroll">
+ <container_view name="statistics_view">
+ <stat_view label="БазоваÑ" name="basic">
+ <stat_bar label="Кадров/Ñ" name="fps"/>
+ <stat_bar label="Ширина канала" name="bandwidth"/>
+ <stat_bar label="Потери пакетов" name="packet_loss"/>
+ <stat_bar label="Пинг" name="ping"/>
+ </stat_view>
+ <stat_view label="Дополнительно" name="advanced">
+ <stat_view label="ОтриÑовка" name="render">
+ <stat_bar label="Треугольников на кадр" name="ktrisframe"/>
+ <stat_bar label="Треугольников в Ñекунду" name="ktrissec"/>
+ <stat_bar label="Ð’Ñего объектов" name="objs"/>
+ <stat_bar label="Ðовых объектов" name="newobjs"/>
+ </stat_view>
+ <stat_view label="ТекÑтура" name="texture">
+ <stat_bar label="КоличеÑтво" name="numimagesstat"/>
+ <stat_bar label="Ðеобраб. изображений" name="numrawimagesstat"/>
+ <stat_bar label="ПамÑÑ‚ÑŒ GL" name="gltexmemstat"/>
+ <stat_bar label="Ð¤Ð¾Ñ€Ð¼Ð°Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ð¿Ð°Ð¼ÑÑ‚ÑŒ" name="formattedmemstat"/>
+ <stat_bar label="ÐÐµÑ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ð¿Ð°Ð¼ÑÑ‚ÑŒ" name="rawmemstat"/>
+ <stat_bar label="Ограничение памÑти" name="glboundmemstat"/>
+ </stat_view>
+ <stat_view label="Сеть" name="network">
+ <stat_bar label="ВходÑщие пакеты" name="packetsinstat"/>
+ <stat_bar label="ИÑходÑщие пакеты" name="packetsoutstat"/>
+ <stat_bar label="Объекты" name="objectkbitstat"/>
+ <stat_bar label="ТекÑтура" name="texturekbitstat"/>
+ <stat_bar label="Ðктив" name="assetkbitstat"/>
+ <stat_bar label="Слои" name="layerskbitstat"/>
+ <stat_bar label="ДейÑтвительный ввод" name="actualinkbitstat"/>
+ <stat_bar label="ДейÑтвительный вывод" name="actualoutkbitstat"/>
+ <stat_bar label="Ожидающие операции VFS" name="vfspendingoperations"/>
+ </stat_view>
+ </stat_view>
+ <stat_view label="СимулÑтор" name="sim">
+ <stat_bar label="Замедление времени" name="simtimedilation"/>
+ <stat_bar label="СимулÑциÑ: кадров/Ñ" name="simfps"/>
+ <stat_bar label="Физика: кадров/Ñ" name="simphysicsfps"/>
+ <stat_view label="ФизичеÑкие данные" name="physicsdetail">
+ <stat_bar label="Закрепленные объекты" name="physicspinnedtasks"/>
+ <stat_bar label="Объекты Ñ Ð½Ð¸Ð·ÐºÐ¾Ð¹ детализацией" name="physicslodtasks"/>
+ <stat_bar label="Ð’Ñ‹Ð´ÐµÐ»ÐµÐ½Ð½Ð°Ñ Ð¿Ð°Ð¼ÑÑ‚ÑŒ" name="physicsmemoryallocated"/>
+ </stat_view>
+ <stat_bar label="Обновлений агента/Ñ" name="simagentups"/>
+ <stat_bar label="ОÑновные агенты" name="simmainagents"/>
+ <stat_bar label="Дочерние агенты" name="simchildagents"/>
+ <stat_bar label="Объекты" name="simobjects"/>
+ <stat_bar label="Ðктивные объекты" name="simactiveobjects"/>
+ <stat_bar label="Ðктивные Ñкрипты" name="simactivescripts"/>
+ <stat_bar label="Ð¡Ð¾Ð±Ñ‹Ñ‚Ð¸Ñ Ñкрипта" name="simscripteps"/>
+ <stat_bar label="ВходÑщие пакеты" name="siminpps"/>
+ <stat_bar label="ИÑходÑщие пакеты" name="simoutpps"/>
+ <stat_bar label="Отложенные загрузки" name="simpendingdownloads"/>
+ <stat_bar label="Отложенные передачи" name="simpendinguploads"/>
+ <stat_bar label="Общий нераÑпакованный объем (байт)" name="simtotalunackedbytes"/>
+ <stat_view label="Ð’Ñ€ÐµÐ¼Ñ (мÑ)" name="simperf">
+ <stat_bar label="Общее Ð²Ñ€ÐµÐ¼Ñ ÐºÐ°Ð´Ñ€Ð°" name="simframemsec"/>
+ <stat_bar label="ЧиÑтое времÑ" name="simnetmsec"/>
+ <stat_bar label="Ð’Ñ€ÐµÐ¼Ñ Ð½Ð° физику" name="simsimphysicsmsec"/>
+ <stat_bar label="Ð’Ñ€ÐµÐ¼Ñ Ð½Ð° ÑимулÑцию" name="simsimothermsec"/>
+ <stat_bar label="Ð’Ñ€ÐµÐ¼Ñ Ð½Ð° клиент" name="simagentmsec"/>
+ <stat_bar label="Ð’Ñ€ÐµÐ¼Ñ Ð½Ð° изображениÑ" name="simimagesmsec"/>
+ <stat_bar label="Ð’Ñ€ÐµÐ¼Ñ Ð½Ð° Ñкрипт" name="simscriptmsec"/>
+ <stat_bar label="Резервное времÑ" name="simsparemsec"/>
+ <stat_view label="Данные времени (мÑ)" name="timedetails">
+ <stat_bar label="Шаг физики" name="simsimphysicsstepmsec"/>
+ <stat_bar label="Обновить физ. формы" name="simsimphysicsshapeupdatemsec"/>
+ <stat_bar label="Физика - прочее" name="simsimphysicsothermsec"/>
+ <stat_bar label="Ð’Ñ€ÐµÐ¼Ñ Ñна" name="simsleepmsec"/>
+ <stat_bar label="Ввод/вывод" name="simpumpiomsec"/>
+ </stat_view>
+ </stat_view>
+ </stat_view>
+ </container_view>
+ </scroll_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_sys_well.xml b/indra/newview/skins/default/xui/ru/floater_sys_well.xml
new file mode 100644
index 0000000000..b6975ac9ab
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_sys_well.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="sys_well_window" title="УВЕДОМЛЕÐИЯ">
+ <string name="title_im_well_window">
+ ОБЩЕÐИЕ
+ </string>
+ <string name="title_notification_well_window">
+ УВЕДОМЛЕÐИЯ
+ </string>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_telehub.xml b/indra/newview/skins/default/xui/ru/floater_telehub.xml
new file mode 100644
index 0000000000..799fd57b5b
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_telehub.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Explicit left edge to avoid overlapping build tools -->
+<floater name="telehub" title="ТЕЛЕХÐБ">
+ <text name="status_text_connected">
+ Телехаб подключен к объекту [OBJECT]
+ </text>
+ <text name="status_text_not_connected">
+ Телехаб не подключен.
+ </text>
+ <text name="help_text_connected">
+ Ð”Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð½Ð°Ð¶Ð¼Ð¸Ñ‚Ðµ «Отключить».
+ </text>
+ <text name="help_text_not_connected">
+ Выберите объект и нажмите «Подключить телехаб».
+ </text>
+ <button label="Подключить телехаб" name="connect_btn"/>
+ <button label="Отключить" name="disconnect_btn"/>
+ <text name="spawn_points_text">
+ Точки поÑÐ²Ð»ÐµÐ½Ð¸Ñ (позиции, а не объекты):
+ </text>
+ <button label="Добавить точку поÑвлениÑ" name="add_spawn_point_btn"/>
+ <button label="Удалить точку поÑвлениÑ" name="remove_spawn_point_btn"/>
+ <text name="spawn_point_help">
+ Выберите объект и нажмите «Добавить точку поÑвлениÑ», чтобы указать позицию.
+Затем объект можно будет перемеÑтить или удалить.
+Позиции ÑвÑзаны Ñ Ñ†ÐµÐ½Ñ‚Ñ€Ð¾Ð¼ телехаба.
+Выберите вещь в ÑпиÑке, чтобы выделить ее в мире.
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_test_layout_stacks.xml b/indra/newview/skins/default/xui/ru/floater_test_layout_stacks.xml
new file mode 100644
index 0000000000..b479d5f6d6
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_test_layout_stacks.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Test Floater" title="LAYOUTSTACK TESTS"/>
diff --git a/indra/newview/skins/default/xui/ru/floater_test_text_vertical_aligment.xml b/indra/newview/skins/default/xui/ru/floater_test_text_vertical_aligment.xml
new file mode 100644
index 0000000000..d0bd86160e
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_test_text_vertical_aligment.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Test Floater" title="ТЕСТИРОВÐТЬ ОКÐО"/>
diff --git a/indra/newview/skins/default/xui/ru/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/ru/floater_texture_ctrl.xml
new file mode 100644
index 0000000000..d55daea836
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_texture_ctrl.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="texture picker" title="ВЫБРÐТЬ: ТЕКСТУРУ">
+ <floater.string name="choose_picture">
+ Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° изображениÑ
+ </floater.string>
+ <floater.string name="pick title">
+ Выбрать:
+ </floater.string>
+ <text name="Multiple">
+ ÐеÑколько текÑтур
+ </text>
+ <text name="unknown">
+ Размер: [DIMENSIONS]
+ </text>
+ <button label="По умолчанию" label_selected="По умолчанию" name="Default"/>
+ <button label="Ðет" label_selected="Ðет" name="None"/>
+ <button label="ОчиÑтить" label_selected="ОчиÑтить" name="Blank"/>
+ <check_box initial_value="иÑтина" label="Применить ÑейчаÑ" name="apply_immediate_check"/>
+ <filter_editor label="Фильтровать текÑтуры" name="inventory search editor"/>
+ <check_box initial_value="ложь" label="Показывать папки" name="show_folders_check"/>
+ <button label="ОК" label_selected="ОК" name="Select"/>
+ <button label="Отмена" label_selected="Отмена" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_tools.xml b/indra/newview/skins/default/xui/ru/floater_tools.xml
new file mode 100644
index 0000000000..3d7d1198f0
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_tools.xml
@@ -0,0 +1,511 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="toolbox floater" short_title="ИÐСТРУМЕÐТЫ ДЛЯ СТРОИТЕЛЬСТВÐ">
+ <floater.string name="grid_screen_text">
+ Экран
+ </floater.string>
+ <floater.string name="grid_local_text">
+ ЛокальнаÑ
+ </floater.string>
+ <floater.string name="grid_world_text">
+ МироваÑ
+ </floater.string>
+ <floater.string name="grid_reference_text">
+ Точка отÑчета
+ </floater.string>
+ <floater.string name="grid_attachment_text">
+ ПриÑоединение
+ </floater.string>
+ <floater.string name="status_rotate">
+ ПеретÑгивайте цветные полоÑÑ‹ Ð´Ð»Ñ Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð°
+ </floater.string>
+ <floater.string name="status_scale">
+ Щелкните и перетащите Ð´Ð»Ñ Ñ€Ð°ÑÑ‚ÑÐ¶ÐµÐ½Ð¸Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð¾Ð¹ Ñтороны
+ </floater.string>
+ <floater.string name="status_move">
+ Перемещение: перетащить, копирование: перетащить при нажатой клавише Shift
+ </floater.string>
+ <floater.string name="status_modifyland">
+ Щелкните и удерживайте Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð·ÐµÐ¼Ð»Ð¸
+ </floater.string>
+ <floater.string name="status_camera">
+ Щелкните и перетащите Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ ÐºÐ°Ð¼ÐµÑ€Ñ‹
+ </floater.string>
+ <floater.string name="status_grab">
+ Перемещение: перетащить, подъем: нажать Ctrl, вращение: нажать Ctrl+Shift
+ </floater.string>
+ <floater.string name="status_place">
+ Щелкните Ð´Ð»Ñ ÑозданиÑ
+ </floater.string>
+ <floater.string name="status_selectland">
+ Щелкните и перетащите Ð´Ð»Ñ Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð·ÐµÐ¼Ð»Ð¸
+ </floater.string>
+ <floater.string name="status_selectcount">
+ Выбрано объектов: [OBJ_COUNT], влиÑние на землю [LAND_IMPACT]
+ </floater.string>
+ <floater.string name="status_remaining_capacity">
+ ОÑтаток емкоÑти [LAND_CAPACITY].
+ </floater.string>
+ <button name="button focus" tool_tip="ФокуÑ"/>
+ <button name="button move" tool_tip="ПеремеÑтить"/>
+ <button name="button edit" tool_tip="Изменить"/>
+ <button name="button create" tool_tip="Создать"/>
+ <button name="button land" tool_tip="ЗемлÑ"/>
+ <text name="text status">
+ Перемещение: перетащить, копирование: перетащить при нажатой клавише Shift
+ </text>
+ <radio_group name="focus_radio_group">
+ <radio_item label="Увеличение" name="radio zoom"/>
+ <radio_item label="Вращение (Ctrl)" name="radio orbit"/>
+ <radio_item label="Сдвиг (Ctrl+Shift)" name="radio pan"/>
+ </radio_group>
+ <slider_bar initial_value="0.125" name="slider zoom"/>
+ <radio_group name="move_radio_group">
+ <radio_item label="ПеремеÑтить" name="radio move"/>
+ <radio_item label="Подъем (Ctrl)" name="radio lift"/>
+ <radio_item label="Вращение (Ctrl+Shift)" name="radio spin"/>
+ </radio_group>
+ <radio_group name="edit_radio_group">
+ <radio_item label="ПеремеÑтить" name="radio position"/>
+ <radio_item label="Вращение (Ctrl)" name="radio rotate"/>
+ <radio_item label="РаÑÑ‚Ñжка (Ctrl+Shift)" name="radio stretch"/>
+ <radio_item label="Выбор грани" name="radio select face"/>
+ </radio_group>
+ <check_box label="Редактировать объединенные" name="checkbox edit linked parts"/>
+ <button label="Объединить" name="link_btn"/>
+ <button label="Разъединить" name="unlink_btn"/>
+ <text label="РаÑÑ‚Ñжка обеих Ñторон" name="checkbox uniform label">
+ РаÑÑ‚Ñжка обеих Ñторон
+ </text>
+ <check_box initial_value="иÑтина" label="РаÑÑ‚Ñгивать текÑтуры" name="checkbox stretch textures"/>
+ <check_box initial_value="иÑтина" label="ПривÑзка" name="checkbox snap to grid"/>
+ <combo_box name="combobox grid mode" tool_tip="Выберите тип линейки Ñетки Ð´Ð»Ñ Ñ€Ð°Ð·Ð¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð°">
+ <combo_box.item label="МироваÑ" name="World"/>
+ <combo_box.item label="ЛокальнаÑ" name="Local"/>
+ <combo_box.item label="Точка отÑчета" name="Reference"/>
+ </combo_box>
+ <button label="" name="Options..." tool_tip="Дополнительные параметры Ñетки"/>
+ <button name="ToolCube" tool_tip="Куб"/>
+ <button name="ToolPrism" tool_tip="Призма"/>
+ <button name="ToolPyramid" tool_tip="Пирамида"/>
+ <button name="ToolTetrahedron" tool_tip="ТетраÑдр"/>
+ <button name="ToolCylinder" tool_tip="Цилиндр"/>
+ <button name="ToolHemiCylinder" tool_tip="Полуцилиндр"/>
+ <button name="ToolCone" tool_tip="КонуÑ"/>
+ <button name="ToolHemiCone" tool_tip="ПолуконуÑ"/>
+ <button name="ToolSphere" tool_tip="Сфера"/>
+ <button name="ToolHemiSphere" tool_tip="ПолуÑфера"/>
+ <button name="ToolTorus" tool_tip="Тор"/>
+ <button name="ToolTube" tool_tip="Труба"/>
+ <button name="ToolRing" tool_tip="Кольцо"/>
+ <button name="ToolTree" tool_tip="Дерево"/>
+ <button name="ToolGrass" tool_tip="Трава"/>
+ <check_box label="Держать инÑтрумент" name="checkbox sticky"/>
+ <check_box label="Копировать выдел." name="checkbox copy selection"/>
+ <check_box initial_value="иÑтина" label="Центрир. копию" name="checkbox copy centers"/>
+ <check_box label="Повернуть копию" name="checkbox copy rotates"/>
+ <radio_group name="land_radio_group">
+ <radio_item label="Выбрать землю" name="radio select land"/>
+ <radio_item label="ВыровнÑÑ‚ÑŒ" name="radio flatten"/>
+ <radio_item label="ПоднÑÑ‚ÑŒ" name="radio raise"/>
+ <radio_item label="Ðиже" name="radio lower"/>
+ <radio_item label="Гладко" name="radio smooth"/>
+ <radio_item label="Огрубить" name="radio noise"/>
+ <radio_item label="ВоÑÑтановить" name="radio revert"/>
+ </radio_group>
+ <text name="Bulldozer:">
+ Бульдозер:
+ </text>
+ <text name="Dozer Size:">
+ Размер
+ </text>
+ <slider_bar initial_value="2.0" name="slider brush size"/>
+ <text name="Strength:">
+ Сила
+ </text>
+ <slider_bar initial_value="0.00" name="slider force"/>
+ <button label="Применить" label_selected="Применить" name="button apply to selection" tool_tip="Изменить выбранную землю"/>
+ <text name="selection_empty">
+ Ðе выбрано.
+ </text>
+ <text name="remaining_capacity">
+ [CAPACITY_STRING] [secondlife:///app/openfloater/object_weights Ð”Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ]
+ </text>
+ <tab_container name="Object Info Tabs">
+ <panel label="Общие" name="General">
+ <panel.string name="text deed continued">
+ Сделка
+ </panel.string>
+ <panel.string name="text deed">
+ Сделка
+ </panel.string>
+ <panel.string name="text modify info 1">
+ Этот объект можно изменÑÑ‚ÑŒ
+ </panel.string>
+ <panel.string name="text modify info 2">
+ Эти объекты можно изменÑÑ‚ÑŒ
+ </panel.string>
+ <panel.string name="text modify info 3">
+ Этот объект Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½ÑÑ‚ÑŒ
+ </panel.string>
+ <panel.string name="text modify info 4">
+ Эти объекты Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½ÑÑ‚ÑŒ
+ </panel.string>
+ <panel.string name="text modify warning">
+ Чтобы задать права доÑтупа, нужно выделить объект целиком
+ </panel.string>
+ <panel.string name="Cost Default">
+ Цена: L$
+ </panel.string>
+ <panel.string name="Cost Total">
+ Ð’Ñего: L$
+ </panel.string>
+ <panel.string name="Cost Per Unit">
+ Цена за: L$
+ </panel.string>
+ <panel.string name="Cost Mixed">
+ Ð¡Ð¼ÐµÑˆÐ°Ð½Ð½Ð°Ñ Ñ†ÐµÐ½Ð°
+ </panel.string>
+ <panel.string name="Sale Mixed">
+ Ð¡Ð¼ÐµÑˆÐ°Ð½Ð½Ð°Ñ Ð¿Ñ€Ð¾Ð´Ð°Ð¶Ð°
+ </panel.string>
+ <text name="Name:">
+ Ðазвание:
+ </text>
+ <text name="Description:">
+ ОпиÑание:
+ </text>
+ <text name="Creator:">
+ Создатель:
+ </text>
+ <text name="Owner:">
+ Владелец:
+ </text>
+ <text name="Group:">
+ Группа:
+ </text>
+ <name_box initial_value="Загрузка..." name="Group Name Proxy"/>
+ <button name="button set group" tool_tip="Выберите группу Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð¸ ей прав доÑтупа к объекту"/>
+ <check_box label="ПоделитьÑÑ" name="checkbox share with group" tool_tip="Позволить вÑем учаÑтникам выбранной группы получить уÑтановленные вам права на Ñтот объект. Ð”Ð»Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ñ€Ð¾Ð»ÐµÐ²Ñ‹Ñ… ограничений необходимо произвеÑти Ñделку."/>
+ <button label="Сделка" label_selected="Сделка" name="button deed" tool_tip="Ð’ результате Ñделки объект передаетÑÑ Ð³Ñ€ÑƒÐ¿Ð¿Ðµ, при Ñтом права на него будут ÑоответÑтвовать правам Ñледующего владельца. Переданный группе объект может передаватьÑÑ Ð´Ð¾Ð»Ð¶Ð½Ð¾Ñтным лицом группы."/>
+ <text name="label click action">
+ По щелчку:
+ </text>
+ <combo_box name="clickaction">
+ <combo_box.item label="КоÑнутьÑÑ (по умолчанию)" name="Touch/grab(default)"/>
+ <combo_box.item label="СеÑÑ‚ÑŒ на объект" name="Sitonobject"/>
+ <combo_box.item label="Купить объект" name="Buyobject"/>
+ <combo_box.item label="Заплатить за объект" name="Payobject"/>
+ <combo_box.item label="Открыть" name="Open"/>
+ <combo_box.item label="Увеличение" name="Zoom"/>
+ </combo_box>
+ <check_box label="Ð”Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð°Ð¶Ð¸:" name="checkbox for sale"/>
+ <combo_box name="sale type">
+ <combo_box.item label="Копировать" name="Copy"/>
+ <combo_box.item label="Контент" name="Contents"/>
+ <combo_box.item label="Оригинал" name="Original"/>
+ </combo_box>
+ <spinner label="Цена: L$" name="Edit Cost"/>
+ <check_box label="Показать в поиÑке" name="search_check" tool_tip="Показывать объект в результатах поиÑка"/>
+ <panel name="perms_build">
+ <text name="perm_modify">
+ Этот объект можно изменÑÑ‚ÑŒ
+ </text>
+ <text name="Anyone can:">
+ Ð’Ñе:
+ </text>
+ <check_box label="ПеремеÑтить" name="checkbox allow everyone move"/>
+ <check_box label="Копировать" name="checkbox allow everyone copy"/>
+ <text name="Next owner can:">
+ Следующий владелец:
+ </text>
+ <check_box label="ИзменÑÑ‚ÑŒ" name="checkbox next owner can modify"/>
+ <check_box label="Копировать" name="checkbox next owner can copy"/>
+ <check_box label="Передать" name="checkbox next owner can transfer" tool_tip="Следующий владелец может отдать или перепродать объект"/>
+ <text name="B:">
+ Ð:
+ </text>
+ <text name="O:">
+ O:
+ </text>
+ <text name="G:">
+ G:
+ </text>
+ <text name="E:">
+ Ð’:
+ </text>
+ <text name="N:">
+ С:
+ </text>
+ <text name="F:">
+ F:
+ </text>
+ </panel>
+ </panel>
+ <panel label="Объект" name="Object">
+ <check_box label="ФикÑированный" name="checkbox locked" tool_tip="Предотвращение Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð°. Обычно Ñта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð° во Ð²Ñ€ÐµÐ¼Ñ Ñтройки Ð´Ð»Ñ Ð¸Ð·Ð±ÐµÐ¶Ð°Ð½Ð¸Ñ Ð½ÐµÐ¶ÐµÐ»Ð°Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ñ… изменений."/>
+ <check_box label="ФизичеÑкий" name="Physical Checkbox Ctrl" tool_tip="ПозволÑет толкать объект. Также на объект будет воздейÑтвовать гравитациÑ."/>
+ <check_box label="Временный" name="Temporary Checkbox Ctrl" tool_tip="Приводит к автоматичеÑкому удалению объекта через минуту поÑле ÑозданиÑ."/>
+ <check_box label="Фантомный" name="Phantom Checkbox Ctrl" tool_tip="Предотвращает Ñтолкновение объекта Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼Ð¸ объектами или аватарами."/>
+ <text name="label position">
+ ÐŸÐ¾Ð·Ð¸Ñ†Ð¸Ñ (метры)
+ </text>
+ <spinner label="X" name="Pos X"/>
+ <spinner label="Y" name="Pos Y"/>
+ <spinner label="Z" name="Pos Z"/>
+ <text name="label size">
+ Размер (метры)
+ </text>
+ <spinner label="X" name="Scale X"/>
+ <spinner label="Y" name="Scale Y"/>
+ <spinner label="Z" name="Scale Z"/>
+ <text name="label rotation">
+ Поворот (градуÑÑ‹)
+ </text>
+ <spinner label="X" name="Rot X"/>
+ <spinner label="Y" name="Rot Y"/>
+ <spinner label="Z" name="Rot Z"/>
+ <combo_box name="comboBaseType">
+ <combo_box.item label="Коробка" name="Box"/>
+ <combo_box.item label="Цилиндр" name="Cylinder"/>
+ <combo_box.item label="Призма" name="Prism"/>
+ <combo_box.item label="Сфера" name="Sphere"/>
+ <combo_box.item label="Тор" name="Torus"/>
+ <combo_box.item label="Труба" name="Tube"/>
+ <combo_box.item label="Кольцо" name="Ring"/>
+ <combo_box.item label="Скульптурный" name="Sculpted"/>
+ </combo_box>
+ <text name="text cut">
+ Разрез (начало/конец)
+ </text>
+ <spinner label="B" name="cut begin"/>
+ <spinner label="Ð’" name="cut end"/>
+ <text name="text hollow">
+ ПолоÑÑ‚ÑŒ
+ </text>
+ <text name="text skew">
+ Спираль
+ </text>
+ <text name="Hollow Shape">
+ Форма полоÑти
+ </text>
+ <combo_box name="hole">
+ <combo_box.item label="По умолчанию" name="Default"/>
+ <combo_box.item label="КруглаÑ" name="Circle"/>
+ <combo_box.item label="КвадратнаÑ" name="Square"/>
+ <combo_box.item label="ТреугольнаÑ" name="Triangle"/>
+ </combo_box>
+ <text name="text twist">
+ Скручивание
+ </text>
+ <spinner label="С" name="Twist Begin"/>
+ <spinner label="E" name="Twist End"/>
+ <text name="scale_taper">
+ КонуÑный Ñрез
+ </text>
+ <text name="scale_hole">
+ Размер отверÑтиÑ
+ </text>
+ <spinner label="X" name="Taper Scale X"/>
+ <spinner label="Y" name="Taper Scale Y"/>
+ <text name="text topshear">
+ Сдвиг вершины
+ </text>
+ <spinner label="X" name="Shear X"/>
+ <spinner label="Y" name="Shear Y"/>
+ <text name="advanced_cut">
+ Разрез от центра
+ </text>
+ <text name="advanced_dimple">
+ КоничеÑкий вырез
+ </text>
+ <text name="advanced_slice">
+ ДолÑ
+ </text>
+ <spinner label="С" name="Path Limit Begin"/>
+ <spinner label="E" name="Path Limit End"/>
+ <text name="text taper2">
+ КонуÑный Ñрез
+ </text>
+ <spinner label="X" name="Taper X"/>
+ <spinner label="Y" name="Taper Y"/>
+ <text name="text radius delta">
+ РадиуÑ
+ </text>
+ <text name="text revolutions">
+ Обороты
+ </text>
+ <texture_picker label="ТекÑтура Ñкульптуры" name="sculpt texture control" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° изображениÑ"/>
+ <check_box label="Отраженное" name="sculpt mirror control" tool_tip="Отразить Ñкульптурный примитив по оÑи X"/>
+ <check_box label="Ðаизнанку" name="sculpt invert control" tool_tip="Инвертировать нормали Ñкульптурного примитива, «вывернув» его наизнанку"/>
+ <text name="label sculpt type">
+ Тип Ñтыковки
+ </text>
+ <combo_box name="sculpt type control">
+ <combo_box.item label="По Ñфере" name="Sphere"/>
+ <combo_box.item label="По тору" name="Torus"/>
+ <combo_box.item label="По плоÑкоÑти" name="Plane"/>
+ <combo_box.item label="По цилиндру" name="Cylinder"/>
+ </combo_box>
+ </panel>
+ <panel label="ОÑобенноÑти" name="Features">
+ <panel.string name="None">
+ Ðет
+ </panel.string>
+ <panel.string name="Prim">
+ Примитив
+ </panel.string>
+ <panel.string name="Convex Hull">
+ Ð¡Ð»Ð¾Ð¶Ð½Ð°Ñ Ð¾Ð±Ð¾Ð»Ð¾Ñ‡ÐºÐ°
+ </panel.string>
+ <text name="select_single">
+ Выберите только один примитив Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¾ÑобенноÑтей.
+ </text>
+ <text name="edit_object">
+ Изменение оÑобенноÑтей объекта:
+ </text>
+ <check_box label="ГибкоÑÑ‚ÑŒ" name="Flexible1D Checkbox Ctrl" tool_tip="Объект может изгибатьÑÑ Ð¿Ð¾ оÑи Z (наÑтройки на Ñтороне клиента)"/>
+ <spinner label="ÐœÑгкоÑÑ‚ÑŒ" name="FlexNumSections"/>
+ <spinner label="ГравитациÑ" name="FlexGravity"/>
+ <spinner label="ПаруÑноÑÑ‚ÑŒ" name="FlexFriction"/>
+ <spinner label="Ветер" name="FlexWind"/>
+ <spinner label="УпругоÑÑ‚ÑŒ" name="FlexTension"/>
+ <spinner label="X-дейÑтвие" name="FlexForceX"/>
+ <spinner label="Y-дейÑтвие" name="FlexForceY"/>
+ <spinner label="Z-дейÑтвие" name="FlexForceZ"/>
+ <check_box label="Свет" name="Light Checkbox Ctrl" tool_tip="Объект будет излучать Ñвет"/>
+ <color_swatch name="colorswatch" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° цвета"/>
+ <texture_picker label="" name="light texture control" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° проецируемого Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ (дейÑтвует только Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ð¾Ð¹ отложенной отриÑовкой)"/>
+ <spinner label="ИнтенÑивноÑÑ‚ÑŒ" name="Light Intensity"/>
+ <spinner label="Угол обзора" name="Light FOV"/>
+ <spinner label="РадиуÑ" name="Light Radius"/>
+ <spinner label="ФокуÑ" name="Light Focus"/>
+ <spinner label="ОÑлабление" name="Light Falloff"/>
+ <spinner label="Окружение" name="Light Ambiance"/>
+ <text name="label physicsshapetype">
+ Тип физич. формы:
+ </text>
+ <combo_box name="Physics Shape Type Combo Ctrl" tool_tip="Выберите тип физичеÑкой формы"/>
+ <combo_box name="material">
+ <combo_box.item label="Камень" name="Stone"/>
+ <combo_box.item label="Металл" name="Metal"/>
+ <combo_box.item label="Стекло" name="Glass"/>
+ <combo_box.item label="Дерево" name="Wood"/>
+ <combo_box.item label="Плоть" name="Flesh"/>
+ <combo_box.item label="ПлаÑтик" name="Plastic"/>
+ <combo_box.item label="Резина" name="Rubber"/>
+ </combo_box>
+ <spinner label="ГравитациÑ" name="Physics Gravity"/>
+ <spinner label="Трение" name="Physics Friction"/>
+ <spinner label="ПлотноÑÑ‚ÑŒ в 100 кг/м^3" name="Physics Density"/>
+ <spinner label="ВоÑÑтанавливаемоÑÑ‚ÑŒ" name="Physics Restitution"/>
+ </panel>
+ <panel label="ТекÑтура" name="Texture">
+ <panel.string name="string repeats per meter">
+ Повторений на метр
+ </panel.string>
+ <panel.string name="string repeats per face">
+ Повторений на грань
+ </panel.string>
+ <texture_picker label="ТекÑтура" name="texture control" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° изображениÑ"/>
+ <color_swatch label="Цвет" name="colorswatch" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° цвета"/>
+ <text name="color trans">
+ ПрозрачноÑÑ‚ÑŒ %
+ </text>
+ <text name="glow label">
+ Свечение
+ </text>
+ <check_box label="СобÑтв. ÑркоÑÑ‚ÑŒ" name="checkbox fullbright"/>
+ <text name="tex gen">
+ Ðаложение
+ </text>
+ <combo_box name="combobox texgen">
+ <combo_box.item label="По умолчанию" name="Default"/>
+ <combo_box.item label="Ðа плоÑкоÑÑ‚ÑŒ" name="Planar"/>
+ </combo_box>
+ <text name="label shininess">
+ БлеÑк
+ </text>
+ <combo_box name="combobox shininess">
+ <combo_box.item label="Ðет" name="None"/>
+ <combo_box.item label="Ðизко" name="Low"/>
+ <combo_box.item label="Средний" name="Medium"/>
+ <combo_box.item label="Ð’Ñ‹Ñоко" name="High"/>
+ </combo_box>
+ <text name="label bumpiness">
+ РельефноÑÑ‚ÑŒ
+ </text>
+ <combo_box name="combobox bumpiness">
+ <combo_box.item label="Ðет" name="None"/>
+ <combo_box.item label="ЯркоÑÑ‚ÑŒ" name="Brightness"/>
+ <combo_box.item label="По темному" name="Darkness"/>
+ <combo_box.item label="дерево" name="woodgrain"/>
+ <combo_box.item label="кора" name="bark"/>
+ <combo_box.item label="кирпич" name="bricks"/>
+ <combo_box.item label="ÑˆÐ°Ñ…Ð¼Ð°Ñ‚Ð½Ð°Ñ Ð´Ð¾Ñка" name="checker"/>
+ <combo_box.item label="бетон" name="concrete"/>
+ <combo_box.item label="ÑÑ‚Ð°Ñ€Ð°Ñ Ð¿Ð»Ð¸Ñ‚ÐºÐ°" name="crustytile"/>
+ <combo_box.item label="теÑаный камень" name="cutstone"/>
+ <combo_box.item label="диÑки" name="discs"/>
+ <combo_box.item label="гравий" name="gravel"/>
+ <combo_box.item label="чашка Петри" name="petridish"/>
+ <combo_box.item label="Ñайдинг" name="siding"/>
+ <combo_box.item label="ÐºÐ°Ð¼ÐµÐ½Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚ÐºÐ°" name="stonetile"/>
+ <combo_box.item label="штукатурка" name="stucco"/>
+ <combo_box.item label="приÑоÑка" name="suction"/>
+ <combo_box.item label="переплетение" name="weave"/>
+ </combo_box>
+ <check_box initial_value="ложь" label="СоглаÑование" name="checkbox planar align" tool_tip="СоглаÑование текÑтур на вÑех выбранных граних по поÑледней выбранной грани. Должно быть выбрано наложение по плоÑкоÑÑ‚Ñм."/>
+ <text name="rpt">
+ Повторов на грань
+ </text>
+ <spinner label="По горизонтали (U)" name="TexScaleU"/>
+ <check_box label="Разворот" name="checkbox flip s"/>
+ <spinner label="По вертикали (V)" name="TexScaleV"/>
+ <check_box label="Разворот" name="checkbox flip t"/>
+ <spinner label="Вращение˚" name="TexRot"/>
+ <spinner label="Повторов на метр" name="rptctrl"/>
+ <button label="Применить" label_selected="Применить" name="button apply"/>
+ <text name="tex offset">
+ Сдвиг текÑтуры
+ </text>
+ <spinner label="По горизонтали (U)" name="TexOffsetU"/>
+ <spinner label="По вертикали (V)" name="TexOffsetV"/>
+ <panel name="Add_Media">
+ <text name="media_tex">
+ Медиа
+ </text>
+ <button name="add_media" tool_tip="Добавить медиа"/>
+ <button name="delete_media" tool_tip="Удалить медиа-текÑтуру"/>
+ <button name="edit_media" tool_tip="Редактировать медиа"/>
+ <button label="ВыровнÑÑ‚ÑŒ" label_selected="ВыровнÑÑ‚ÑŒ медиа" name="button align" tool_tip="МаÑштабирование медиа-текÑтуры (Ñначала нужно загрузить)"/>
+ </panel>
+ </panel>
+ <panel label="Контент" name="Contents">
+ <button label="Создать Ñкрипт" label_selected="Создать Ñкрипт" name="button new script"/>
+ <button label="РазрешениÑ" name="button permissions"/>
+ </panel>
+ </tab_container>
+ <panel name="land info panel">
+ <text name="label_parcel_info">
+ Даные об учаÑтке
+ </text>
+ <text name="label_area_price">
+ Цена: L$[PRICE] за [AREA] м²
+ </text>
+ <text name="label_area">
+ Площадь: [AREA] м²
+ </text>
+ <button label="О земле" label_selected="О земле" name="button about land"/>
+ <check_box label="Показать владельцев" name="checkbox show owners" tool_tip="Цвет учаÑтка в завиÑимоÑти от типа владениÑ: зеленый = ваша землÑ; голубой = Ð·ÐµÐ¼Ð»Ñ Ð²Ð°ÑˆÐµÐ¹ группы; краÑный = Ñ‡ÑƒÐ¶Ð°Ñ Ð·ÐµÐ¼Ð»Ñ; желтый = Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð°Ð¶Ð¸; фиолетовый = Ð´Ð»Ñ Ð°ÑƒÐºÑ†Ð¸Ð¾Ð½Ð°; Ñерый = общаÑ"/>
+ <text name="label_parcel_modify">
+ Изменение учаÑтка
+ </text>
+ <button label="Разделить" label_selected="Разделить" name="button subdivide land"/>
+ <button label="Объединить" label_selected="Объединить" name="button join land"/>
+ <text name="label_parcel_trans">
+ ДейÑÑ‚Ð²Ð¸Ñ Ñ Ð·ÐµÐ¼Ð»ÐµÐ¹
+ </text>
+ <button label="Купить землю" label_selected="Купить землю" name="button buy land"/>
+ <button label="ОтказатьÑÑ Ð¾Ñ‚ земли" label_selected="ОтказатьÑÑ Ð¾Ñ‚ земли" name="button abandon land"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_top_objects.xml b/indra/newview/skins/default/xui/ru/floater_top_objects.xml
new file mode 100644
index 0000000000..a6ffe5c030
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_top_objects.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="top_objects" title="Лучшие объекты">
+ <floater.string name="top_scripts_title">
+ Лучшие Ñкрипты
+ </floater.string>
+ <floater.string name="top_scripts_text">
+ [COUNT] Ñкриптов длительноÑтью [TIME] мÑ
+ </floater.string>
+ <floater.string name="scripts_score_label">
+ ВремÑ
+ </floater.string>
+ <floater.string name="scripts_mono_time_label">
+ Ð’Ñ€ÐµÐ¼Ñ Ð¼Ð¾Ð½Ð¾
+ </floater.string>
+ <floater.string name="top_colliders_title">
+ Лучшие ÑтолкновениÑ
+ </floater.string>
+ <floater.string name="top_colliders_text">
+ Лучшие [COUNT] объектов, подвергающиеÑÑ Ð¿Ð¾Ñ‚ÐµÐ½Ñ†Ð¸Ð°Ð»ÑŒÐ½Ñ‹Ð¼ ÑтолкновениÑм
+ </floater.string>
+ <floater.string name="colliders_score_label">
+ Очки
+ </floater.string>
+ <floater.string name="none_descriptor">
+ Ðе найдено.
+ </floater.string>
+ <text name="title_text">
+ Загрузка...
+ </text>
+ <scroll_list name="objects_list">
+ <scroll_list.columns label="Очки" name="score"/>
+ <scroll_list.columns label="Ðазвание" name="name"/>
+ <scroll_list.columns label="Владелец" name="owner"/>
+ <scroll_list.columns label="МеÑто" name="location"/>
+ <scroll_list.columns label="ВремÑ" name="time"/>
+ <scroll_list.columns label="Ð’Ñ€ÐµÐ¼Ñ Ð¼Ð¾Ð½Ð¾" name="mono_time"/>
+ <scroll_list.columns label="URL-адреÑа" name="URLs"/>
+ </scroll_list>
+ <text name="id_text">
+ ID объекта:
+ </text>
+ <button label="Показать метку" name="show_beacon_btn"/>
+ <text name="obj_name_text">
+ Ðазвание объекта:
+ </text>
+ <button label="Фильтр" name="filter_object_btn"/>
+ <text name="owner_name_text">
+ Владелец:
+ </text>
+ <button label="Фильтр" name="filter_owner_btn"/>
+ <button label="Вернуть выбранное" name="return_selected_btn"/>
+ <button label="Вернуть вÑе" name="return_all_btn"/>
+ <button label="Отключить выбранное" name="disable_selected_btn"/>
+ <button label="Отключить вÑе" name="disable_all_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_tos.xml b/indra/newview/skins/default/xui/ru/floater_tos.xml
new file mode 100644
index 0000000000..bd72f6b308
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_tos.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="modal container">
+ <floater.string name="real_url">
+ http://secondlife.com/app/tos/
+ </floater.string>
+ <floater.string name="loading_url">
+ data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Loading %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
+ </floater.string>
+ <button label="Продолжить" label_selected="Продолжить" name="Continue"/>
+ <button label="Отмена" label_selected="Отмена" name="Cancel"/>
+ <check_box label="Я принимаю уÑÐ»Ð¾Ð²Ð¸Ñ ÐŸÐ¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÑŒÑкого ÑÐ¾Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ñ Ð¸ Политики конфиденциальноÑти" name="agree_chk"/>
+ <text name="tos_heading">
+ Внимательно прочитайте ПользовательÑкое Ñоглашение и Политику конфиденциальноÑти. Ð”Ð»Ñ Ð²Ñ…Ð¾Ð´Ð° в [SECOND_LIFE] вы должны ÑоглаÑитьÑÑ Ñ ÑƒÑловиÑми ÑоглашениÑ.
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_toybox.xml b/indra/newview/skins/default/xui/ru/floater_toybox.xml
new file mode 100644
index 0000000000..a4754ad7ab
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_toybox.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Toybox" title="КÐОПКИ ПÐÐЕЛИ ИÐСТРУМЕÐТОВ">
+ <text name="toybox label 1">
+ Добавьте или удалите кнопки, перетÑÐ³Ð¸Ð²Ð°Ñ Ð¸Ñ… на панели инÑтрументов или Ñ Ð½Ð¸Ñ….
+ </text>
+ <text name="toybox label 2">
+ Кнопки будут отображены в иÑходном виде или в виде значков, в завиÑимоÑти от наÑтроек каждой панели инÑтрументов.
+ </text>
+ <button label="ОчиÑтить вÑе панели" label_selected="ОчиÑтить вÑе панели" name="btn_clear_all"/>
+ <button label="Вернуть Ñтандартные" label_selected="Вернуть Ñтандартные" name="btn_restore_defaults"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_translation_settings.xml b/indra/newview/skins/default/xui/ru/floater_translation_settings.xml
new file mode 100644
index 0000000000..ad280a50dd
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_translation_settings.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_translation_settings" title="ÐÐСТРОЙКИ ПЕРЕВОДРЧÐТÐ">
+ <string name="bing_api_key_not_verified">
+ Bing appID не подтвержден. Повторите попытку.
+ </string>
+ <string name="google_api_key_not_verified">
+ Ключ Google API не подтвержден. Повторите попытку.
+ </string>
+ <string name="bing_api_key_verified">
+ Bing appID подтвержден.
+ </string>
+ <string name="google_api_key_verified">
+ Ключ Google API подтвержден.
+ </string>
+ <check_box label="Включить машинный перевод при чате" name="translate_chat_checkbox"/>
+ <text name="translate_language_label">
+ Переводить чат на:
+ </text>
+ <combo_box name="translate_language_combo">
+ <combo_box.item label="Ñзык ÑиÑтемы" name="System Default Language"/>
+ <combo_box.item label="английÑкий" name="English"/>
+ <combo_box.item label="датÑкий" name="Danish"/>
+ <combo_box.item label="немецкий" name="German"/>
+ <combo_box.item label="иÑпанÑкий" name="Spanish"/>
+ <combo_box.item label="французÑкий" name="French"/>
+ <combo_box.item label="итальÑнÑкий" name="Italian"/>
+ <combo_box.item label="венгерÑкий" name="Hungarian"/>
+ <combo_box.item label="нидерландÑкий" name="Dutch"/>
+ <combo_box.item label="польÑкий" name="Polish"/>
+ <combo_box.item label="португальÑкий" name="Portugese"/>
+ <combo_box.item label="руÑÑкий" name="Russian"/>
+ <combo_box.item label="турецкий" name="Turkish"/>
+ <combo_box.item label="украинÑкий" name="Ukrainian"/>
+ <combo_box.item label="китайÑкий" name="Chinese"/>
+ <combo_box.item label="ÑпонÑкий" name="Japanese"/>
+ <combo_box.item label="корейÑкий" name="Korean"/>
+ </combo_box>
+ <text name="tip">
+ Выберите ÑÐµÑ€Ð²Ð¸Ñ Ð¿ÐµÑ€ÐµÐ²Ð¾Ð´Ð°:
+ </text>
+ <radio_group name="translation_service_rg">
+ <radio_item initial_value="bing" label="Bing Translator" name="bing"/>
+ <radio_item initial_value="google" label="Google Translate" name="google"/>
+ </radio_group>
+ <text name="bing_api_key_label">
+ Bing [http://www.bing.com/developers/createapp.aspx AppID]:
+ </text>
+ <button label="Подтвердить" name="verify_bing_api_key_btn"/>
+ <text name="google_api_key_label">
+ Google [http://code.google.com/apis/language/translate/v2/getting_started.html#auth Ключ API]:
+ </text>
+ <button label="Подтвердить" name="verify_google_api_key_btn"/>
+ <text name="google_links_text">
+ [http://code.google.com/apis/language/translate/v2/pricing.html Цены] | [https://code.google.com/apis/console СтатиÑтика]
+ </text>
+ <button label="OK" name="ok_btn"/>
+ <button label="Отмена" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_url_entry.xml b/indra/newview/skins/default/xui/ru/floater_url_entry.xml
new file mode 100644
index 0000000000..59f8dd0c31
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_url_entry.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="url_entry">
+ <text name="media_label">
+ URL-Ð°Ð´Ñ€ÐµÑ Ð¼ÑƒÐ»ÑŒÑ‚Ð¸Ð¼ÐµÐ´Ð¸Ð¹Ð½Ð¾Ð³Ð¾ реÑурÑа:
+ </text>
+ <button label="ОК" name="ok_btn"/>
+ <button label="Отмена" name="cancel_btn"/>
+ <button label="ОчиÑтить" name="clear_btn"/>
+ <text name="loading_label">
+ Загрузка...
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_voice_controls.xml b/indra/newview/skins/default/xui/ru/floater_voice_controls.xml
new file mode 100644
index 0000000000..2b23086062
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_voice_controls.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_voice_controls" title="УПРÐВЛЕÐИЕ ГОЛОСОМ">
+ <string name="title_nearby">
+ ÐÐСТРОЙКИ ГОЛОСÐ
+ </string>
+ <string name="title_group">
+ ЗВОÐОК ГРУППЕ [GROUP]
+ </string>
+ <string name="title_adhoc">
+ КОÐФЕРЕÐЦИЯ
+ </string>
+ <string name="title_peer_2_peer">
+ ЗВОÐОК ПОЛЬЗОВÐТЕЛЮ [NAME]
+ </string>
+ <string name="no_one_near">
+ Ðет никого Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ‹Ð¼ голоÑом
+ </string>
+ <layout_stack name="my_call_stack">
+ <layout_panel name="my_panel">
+ <text name="user_text" value="Мой аватар:"/>
+ </layout_panel>
+ <layout_panel name="leave_call_panel">
+ <layout_stack name="voice_effect_and_leave_call_stack">
+ <layout_panel name="leave_call_btn_panel">
+ <button label="Прервать звонок" name="leave_call_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_voice_effect.xml b/indra/newview/skins/default/xui/ru/floater_voice_effect.xml
new file mode 100644
index 0000000000..1eb8a94d7a
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_voice_effect.xml
@@ -0,0 +1,159 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater label="МеÑта" name="voice_effects" title="ИЗМЕÐЕÐИЕ ГОЛОСÐ">
+ <string name="no_voice_effect">
+ (Ðет Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð³Ð¾Ð»Ð¾Ñа)
+ </string>
+ <string name="active_voice_effect">
+ (Ðктивно)
+ </string>
+ <string name="unsubscribed_voice_effect">
+ (Ðет подпиÑки)
+ </string>
+ <string name="new_voice_effect">
+ (Ðовый!)
+ </string>
+ <string name="effect_Arena">
+ Arena
+ </string>
+ <string name="effect_Beast">
+ Beast
+ </string>
+ <string name="effect_Buff">
+ Buff
+ </string>
+ <string name="effect_Buzz">
+ Buzz
+ </string>
+ <string name="effect_Camille">
+ Camille
+ </string>
+ <string name="effect_Creepy">
+ Creepy
+ </string>
+ <string name="effect_CreepyBot">
+ CreepyBot
+ </string>
+ <string name="effect_Cyber">
+ Cyber
+ </string>
+ <string name="effect_DeepBot">
+ DeepBot
+ </string>
+ <string name="effect_Demon">
+ Demon
+ </string>
+ <string name="effect_Female Elf">
+ ФеÑ
+ </string>
+ <string name="effect_Flirty">
+ Flirty
+ </string>
+ <string name="effect_Foxy">
+ Foxy
+ </string>
+ <string name="effect_Halloween 2010 Bonus">
+ БонуÑ_за_Ð¥Ñллоуин_2010
+ </string>
+ <string name="effect_Helium">
+ Helium
+ </string>
+ <string name="effect_Husky">
+ Husky
+ </string>
+ <string name="effect_Husky Whisper">
+ Хриплый шепот
+ </string>
+ <string name="effect_Intercom">
+ ВнутреннÑÑ ÑвÑзь
+ </string>
+ <string name="effect_Julia">
+ Julia
+ </string>
+ <string name="effect_Lo Lilt">
+ Ðапев
+ </string>
+ <string name="effect_Macho">
+ Macho
+ </string>
+ <string name="effect_Micro">
+ Micro
+ </string>
+ <string name="effect_Mini">
+ Mini
+ </string>
+ <string name="effect_Model">
+ Модель
+ </string>
+ <string name="effect_Nano">
+ Nano
+ </string>
+ <string name="effect_Nightmare">
+ Nightmare
+ </string>
+ <string name="effect_PopBot">
+ PopBot
+ </string>
+ <string name="effect_Rachel">
+ Rachel
+ </string>
+ <string name="effect_Radio">
+ Radio
+ </string>
+ <string name="effect_Robot">
+ Robot
+ </string>
+ <string name="effect_Roxanne">
+ Roxanne
+ </string>
+ <string name="effect_Rumble">
+ Урчание
+ </string>
+ <string name="effect_Sabrina">
+ Sabrina
+ </string>
+ <string name="effect_Samantha">
+ Samantha
+ </string>
+ <string name="effect_Sexy">
+ Sexy
+ </string>
+ <string name="effect_Shorty">
+ Shorty
+ </string>
+ <string name="effect_Smaller">
+ Меньше
+ </string>
+ <string name="effect_Sneaky">
+ Sneaky
+ </string>
+ <string name="effect_Stallion">
+ Stallion
+ </string>
+ <string name="effect_Sultry">
+ Sultry
+ </string>
+ <string name="effect_Thunder">
+ Thunder
+ </string>
+ <string name="effect_Vixen">
+ Vixen
+ </string>
+ <string name="effect_WhinyBot">
+ WhinyBot
+ </string>
+ <text name="preview_text">
+ ПроÑлушивание
+ </text>
+ <text name="status_text">
+ Запишите образец, затем щелкните, чтобы уÑлышать, как будет звучать голоÑ.
+ </text>
+ <button label="ЗапиÑÑŒ" name="record_btn" tool_tip="ЗапиÑать образец вашего голоÑа."/>
+ <button label="Стоп" name="record_stop_btn"/>
+ <text name="voice_morphing_link">
+ [[URL] ПодпиÑатьÑÑ]
+ </text>
+ <scroll_list name="voice_effect_list" tool_tip="Запишите образец вашего голоÑа, затем щелкните, чтобы проÑлушать Ñффект.">
+ <scroll_list.columns label="Ðазвание голоÑа" name="name"/>
+ <scroll_list.columns label="ИÑтекает" name="expires"/>
+ </scroll_list>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_water.xml b/indra/newview/skins/default/xui/ru/floater_water.xml
new file mode 100644
index 0000000000..5030351f5b
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_water.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Water Floater" title="РÐСШИРЕÐÐЫЙ РЕДÐКТОР ВОДЫ">
+ <floater.string name="WLDefaultWaterNames">
+ По умолчанию:глÑнец:пруд:туман:Second Plague:SNAKE!!!:Valdez
+ </floater.string>
+ <text name="KeyFramePresetsText">
+ ÐаÑтройки воды:
+ </text>
+ <button label="Создать" label_selected="Создать" name="WaterNewPreset"/>
+ <button label="Сохранить" label_selected="Сохранить" name="WaterSavePreset"/>
+ <button label="Удалить" label_selected="Удалить" name="WaterDeletePreset"/>
+ <tab_container name="Water Tabs">
+ <panel label="ÐÐСТРОЙКИ" name="Settings">
+ <text name="BHText">
+ Цвет водного тумана
+ </text>
+ <color_swatch name="WaterFogColor" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° цвета"/>
+ <text name="WaterFogDensText">
+ ПлотноÑÑ‚ÑŒ тумана
+ </text>
+ <text name="WaterUnderWaterFogModText">
+ Подводный туман
+ </text>
+ <text name="BDensText">
+ Уровень Ð¾Ñ‚Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð²Ð¾Ð»Ð½
+ </text>
+ <slider label="1" name="WaterNormalScaleX"/>
+ <slider label="2" name="WaterNormalScaleY"/>
+ <slider label="3" name="WaterNormalScaleZ"/>
+ <text name="HDText">
+ МаÑштаб ФренелÑ
+ </text>
+ <text name="FresnelOffsetText">
+ Сдвиг ФренелÑ
+ </text>
+ <text name="DensMultText">
+ Преломление над водой
+ </text>
+ <text name="WaterScaleBelowText">
+ Преломление под водой
+ </text>
+ <text name="MaxAltText">
+ КоÑффициент размытиÑ
+ </text>
+ </panel>
+ <panel label="ИЗОБРÐЖЕÐИЕ" name="Waves">
+ <text name="BHText">
+ Ðаправление больших волн
+ </text>
+ <text name="WaterWave1DirXText">
+ X
+ </text>
+ <text name="WaterWave1DirYText">
+ Y
+ </text>
+ <text name="BHText2">
+ Ðаправление маленьких волн
+ </text>
+ <text name="WaterWave2DirXText">
+ X
+ </text>
+ <text name="WaterWave2DirYText">
+ Y
+ </text>
+ <text name="BHText3">
+ Карта поверхноÑти
+ </text>
+ </panel>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_web_content.xml b/indra/newview/skins/default/xui/ru/floater_web_content.xml
new file mode 100644
index 0000000000..403ab0ef5d
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_web_content.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_web_content" title="">
+ <layout_stack name="stack1">
+ <layout_panel name="nav_controls">
+ <button name="back" tool_tip="Ðазад"/>
+ <button name="forward" tool_tip="Вперед"/>
+ <button name="stop" tool_tip="ОÑтановить"/>
+ <button name="reload" tool_tip="Обновить"/>
+ <combo_box name="address" tool_tip="Введите URL-Ð°Ð´Ñ€ÐµÑ Ñтраницы"/>
+ <icon name="media_secure_lock_flag" tool_tip="БезопаÑный проÑмотр"/>
+ <button name="popexternal" tool_tip="Открыть текущий URL-Ð°Ð´Ñ€ÐµÑ Ð² вашем браузере"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_whitelist_entry.xml b/indra/newview/skins/default/xui/ru/floater_whitelist_entry.xml
new file mode 100644
index 0000000000..811a2756fa
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_whitelist_entry.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="whitelist_entry" title="БЕЛЫЙ СПИСОК">
+ <text name="media_label">
+ Введите URL-Ð°Ð´Ñ€ÐµÑ Ð¸Ð»Ð¸ шаблон URL-адреÑа Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² ÑпиÑок разрешенных доменов
+ </text>
+ <line_editor name="whitelist_entry" tool_tip="Введите URL-Ð°Ð´Ñ€ÐµÑ Ð¸Ð»Ð¸ шаблон URL-адреÑа в белый ÑпиÑок"/>
+ <button label="OK" name="ok_btn"/>
+ <button label="Отмена" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_windlight_options.xml b/indra/newview/skins/default/xui/ru/floater_windlight_options.xml
new file mode 100644
index 0000000000..bbb37aaaa0
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_windlight_options.xml
@@ -0,0 +1,167 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="WindLight floater" title="РÐСШИРЕÐÐЫЙ РЕДÐКТОР ÐЕБÐ">
+ <floater.string name="WLDefaultSkyNames">
+ A-12AM:A-12PM:A-3AM:A-3PM:A-4.30PM:A-6AM:A-6PM:A-9AM:A-9PM:Barcelona:Blizzard:Blue Midday:Coastal Afternoon:Coastal Sunset:Default:Desert Sunset:Fine Day:Fluffy Big Clouds:Foggy:Funky Funky:Funky Funky Funky:Gelatto:Ghost:Incongruent Truths:Midday 1:Midday 2:Midday 3:Midday 4:Night:Pirate:Purple:Sailor&apos;s Delight:Sheer Sensuality
+ </floater.string>
+ <text name="KeyFramePresetsText">
+ ÐаÑтройки неба:
+ </text>
+ <button label="ÐоваÑ" label_selected="ÐоваÑ" name="WLNewPreset"/>
+ <button label="Сохранить" label_selected="Сохранить" name="WLSavePreset"/>
+ <button label="Удалить" label_selected="Удалить" name="WLDeletePreset"/>
+ <button label="Редактор Ñуточных циклов" label_selected="Редактор Ñуточных циклов" name="WLDayCycleMenuButton"/>
+ <tab_container name="WindLight Tabs">
+ <panel label="ÐТМОСФЕРÐ" name="Atmosphere">
+ <text name="BHText">
+ Голубой горизонт
+ </text>
+ <text name="BHText2">
+ R
+ </text>
+ <text name="BHText3">
+ G
+ </text>
+ <text name="BHText4">
+ B
+ </text>
+ <text name="BHText5">
+ I
+ </text>
+ <text name="BDensText">
+ Дымка на горизонте
+ </text>
+ <text name="BDensText2">
+ ÐаÑыщенноÑÑ‚ÑŒ голубого
+ </text>
+ <text name="BHText6">
+ R
+ </text>
+ <text name="BHText7">
+ G
+ </text>
+ <text name="BHText8">
+ B
+ </text>
+ <text name="BHText9">
+ I
+ </text>
+ <text name="HDText">
+ ПлотноÑÑ‚ÑŒ дымки
+ </text>
+ <text name="DensMultText">
+ КоÑффициент плотноÑти
+ </text>
+ <text name="WLDistanceMultText">
+ КоÑффициент раÑÑтоÑниÑ
+ </text>
+ <text name="MaxAltText">
+ МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð²Ñ‹Ñота
+ </text>
+ </panel>
+ <panel label="ОСВЕЩЕÐИЕ" name="Lighting">
+ <text name="SLCText">
+ Цвет Ñолнца/луны
+ </text>
+ <text name="BHText">
+ R
+ </text>
+ <text name="BHText2">
+ G
+ </text>
+ <text name="BHText3">
+ B
+ </text>
+ <text name="BHText4">
+ I
+ </text>
+ <text name="TODText">
+ Положение Ñолнца/луны
+ </text>
+ <text name="WLAmbientText">
+ РаÑÑеÑнное
+ </text>
+ <text name="BHText5">
+ R
+ </text>
+ <text name="BHText6">
+ G
+ </text>
+ <text name="BHText7">
+ B
+ </text>
+ <text name="BHText8">
+ I
+ </text>
+ <text name="WLEastAngleText">
+ Смещение отноÑительно воÑтока
+ </text>
+ <text name="SunGlowText">
+ СиÑние Ñолнца
+ </text>
+ <slider label="ФокуÑ" name="WLGlowB"/>
+ <slider label="Размер" name="WLGlowR"/>
+ <text name="SceneGammaText">
+ Гамма-ÐºÐ¾Ñ€Ñ€ÐµÐºÑ†Ð¸Ñ Ñцены
+ </text>
+ <text name="WLStarText">
+ ЯркоÑÑ‚ÑŒ звезд
+ </text>
+ </panel>
+ <panel label="ОБЛÐКÐ" name="Clouds">
+ <text name="WLCloudColorText">
+ Цвет
+ </text>
+ <text name="BHText">
+ R
+ </text>
+ <text name="BHText2">
+ G
+ </text>
+ <text name="BHText3">
+ B
+ </text>
+ <text name="BHText4">
+ I
+ </text>
+ <text name="WLCloudColorText2">
+ Положение и плотноÑÑ‚ÑŒ
+ </text>
+ <text name="BHText5">
+ X
+ </text>
+ <text name="BHText6">
+ Y
+ </text>
+ <text name="BHText7">
+ П
+ </text>
+ <text name="WLCloudCoverageText">
+ ОблачноÑÑ‚ÑŒ
+ </text>
+ <text name="WLCloudScaleText">
+ Размеры
+ </text>
+ <text name="WLCloudDetailText">
+ Ð”ÐµÑ‚Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ (положение/плотноÑÑ‚ÑŒ)
+ </text>
+ <text name="BHText8">
+ X
+ </text>
+ <text name="BHText9">
+ Y
+ </text>
+ <text name="BHText10">
+ П
+ </text>
+ <text name="WLCloudScrollXText">
+ СкороÑÑ‚ÑŒ по X
+ </text>
+ <check_box label="Ðа меÑте" name="WLCloudLockX"/>
+ <text name="WLCloudScrollYText">
+ СкороÑÑ‚ÑŒ по Y
+ </text>
+ <check_box label="Ðа меÑте" name="WLCloudLockY"/>
+ <check_box label="Создать клаÑÑичеÑкие облака" name="DrawClassicClouds"/>
+ </panel>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_window_size.xml b/indra/newview/skins/default/xui/ru/floater_window_size.xml
new file mode 100644
index 0000000000..24865a6ba5
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_window_size.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="window_size" title="РÐЗМЕР ОКÐÐ">
+ <string name="resolution_format">
+ [RES_X] x [RES_Y]
+ </string>
+ <text name="windowsize_text">
+ Задать размер окна:
+ </text>
+ <combo_box name="window_size_combo" tool_tip="ширина x выÑота">
+ <combo_box.item label="1000 x 700 (по умолчанию)" name="item0"/>
+ <combo_box.item label="1024 x 768" name="item1"/>
+ <combo_box.item label="1280 x 720 (720p)" name="item2"/>
+ <combo_box.item label="1920 x 1080 (1080p)" name="item3"/>
+ </combo_box>
+ <button label="Задать" name="set_btn"/>
+ <button label="Отмена" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_world_map.xml b/indra/newview/skins/default/xui/ru/floater_world_map.xml
new file mode 100644
index 0000000000..ef8dfe22ae
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_world_map.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="worldmap" title="КÐРТРМИРÐ">
+ <panel name="layout_panel_1">
+ <text name="events_label">
+ ОбозначениÑ
+ </text>
+ </panel>
+ <panel name="layout_panel_2">
+ <button name="Show My Location" tool_tip="Центрировать карту на позиции моего аватара"/>
+ <text name="me_label">
+ Я
+ </text>
+ <text name="person_label">
+ Люди
+ </text>
+ <text name="infohub_label">
+ Инфохаб
+ </text>
+ <text name="land_sale_label">
+ Продажа земли
+ </text>
+ <text name="auction_label">
+ Ñ Ð°ÑƒÐºÑ†Ð¸Ð¾Ð½Ð°
+ </text>
+ <text name="by_owner_label">
+ владельцем
+ </text>
+ <button name="Go Home" tool_tip="Ð¢ÐµÐ»ÐµÐ¿Ð¾Ñ€Ñ‚Ð°Ñ†Ð¸Ñ Ð´Ð¾Ð¼Ð¾Ð¹"/>
+ <text name="Home_label">
+ Дом
+ </text>
+ <text name="events_label">
+ СобытиÑ:
+ </text>
+ <text name="pg_label">
+ Общие
+ </text>
+ <check_box initial_value="иÑтина" name="events_mature_chk"/>
+ <text name="events_mature_label">
+ Умеренные
+ </text>
+ <text name="events_adult_label">
+ Ð”Ð»Ñ Ð²Ð·Ñ€Ð¾Ñлых
+ </text>
+ </panel>
+ <panel name="layout_panel_3">
+ <text name="find_on_map_label">
+ Ðайти на карте
+ </text>
+ </panel>
+ <panel name="layout_panel_4">
+ <combo_box label="Ð”Ñ€ÑƒÐ·ÑŒÑ Ð¾Ð½Ð»Ð°Ð¹Ð½" name="friend combo" tool_tip="Показать друзей на карте">
+ <combo_box.item label="Мои Ð´Ñ€ÑƒÐ·ÑŒÑ Ð¾Ð½Ð»Ð°Ð¹Ð½" name="item1"/>
+ </combo_box>
+ <combo_box label="Мои закладки" name="landmark combo" tool_tip="Показать на карте мои закладки">
+ <combo_box.item label="Мои закладки" name="item1"/>
+ </combo_box>
+ <search_editor label="Ðазвание региона" name="location" tool_tip="Введите название региона"/>
+ <button label="ПоиÑк" name="DoSearch" tool_tip="ПоиÑк региона"/>
+ <button name="Clear" tool_tip="ОчиÑтить отÑлеживание и ÑброÑить карту до Ñтандартного вида"/>
+ <text name="events_label">
+ МеÑто:
+ </text>
+ <button label="ТелепортациÑ" name="Teleport" tool_tip="Ð¢ÐµÐ»ÐµÐ¿Ð¾Ñ€Ñ‚Ð°Ñ†Ð¸Ñ Ð² выбранное меÑто"/>
+ <button label="Копировать URL SL" name="copy_slurl" tool_tip="Копировать текущее меÑто в виде URL-адреÑа SL Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² интернете."/>
+ <button label="Показать выбранное" name="Show Destination" tool_tip="Центрировать карту на выбранном меÑте"/>
+ </panel>
+ <panel name="layout_panel_5">
+ <text name="zoom_label">
+ Увеличение
+ </text>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/inspect_avatar.xml b/indra/newview/skins/default/xui/ru/inspect_avatar.xml
new file mode 100644
index 0000000000..e38ae967cc
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/inspect_avatar.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_avatar">
+ <string name="Subtitle">
+ [AGE]
+ </string>
+ <string name="Details">
+ [SL_PROFILE]
+ </string>
+ <text name="user_subtitle" value="11 меÑÑцев и 3 Ð´Ð½Ñ Ð½Ð°Ð·Ð°Ð´"/>
+ <text name="user_details">
+ Это мое опиÑание Second Life и Ñ Ð´ÑƒÐ¼Ð°ÑŽ, что оно великолепно. Ðо почему-то из-за моей любви к долгим разговорам оно оказалоÑÑŒ Ñлишком длинным
+ </text>
+ <slider name="volume_slider" tool_tip="ГромкоÑÑ‚ÑŒ голоÑа" value="0.5"/>
+ <button label="Добавить в друзьÑ" name="add_friend_btn"/>
+ <button label="IM" name="im_btn"/>
+ <button label="Профиль" name="view_profile_btn"/>
+ <panel name="moderator_panel">
+ <button label="Отключить голоÑ" name="disable_voice"/>
+ <button label="Включить голоÑ" name="enable_voice"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/inspect_group.xml b/indra/newview/skins/default/xui/ru/inspect_group.xml
new file mode 100644
index 0000000000..ca600b0a1f
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/inspect_group.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_group">
+ <string name="PrivateGroup">
+ ЧаÑÑ‚Ð½Ð°Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð°
+ </string>
+ <string name="FreeToJoin">
+ БеÑплатное вÑтупление
+ </string>
+ <string name="CostToJoin">
+ L$[AMOUNT] за вÑтупление
+ </string>
+ <string name="YouAreMember">
+ Ð’Ñ‹ учаÑтник группы
+ </string>
+ <text name="group_subtitle">
+ 123 учаÑтника
+ </text>
+ <text name="group_details">
+ Группа жителей, которые могут Ñоздавать комнату Ñ Ð»Ð¾Ñем.
+БойÑÑ Ð»Ð¾ÑÑ! БойÑÑ! И мангуÑта тоже!
+ </text>
+ <text name="group_cost">
+ L$123 за вÑтупление
+ </text>
+ <button label="Ð’Ñтупить" name="join_btn"/>
+ <button label="Покинуть" name="leave_btn"/>
+ <button label="Смотреть профиль" name="view_profile_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/inspect_object.xml b/indra/newview/skins/default/xui/ru/inspect_object.xml
new file mode 100644
index 0000000000..1a43357cd3
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/inspect_object.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_object">
+ <string name="Creator">
+ От [CREATOR]
+ </string>
+ <string name="CreatorAndOwner">
+ От [CREATOR]
+Владелец [OWNER]
+ </string>
+ <string name="Price">
+ L$[AMOUNT]
+ </string>
+ <string name="PriceFree">
+ БеÑплатно!
+ </string>
+ <string name="Touch">
+ КоÑнутьÑÑ
+ </string>
+ <string name="Sit">
+ СеÑÑ‚ÑŒ
+ </string>
+ <text name="object_creator">
+ от secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about
+владелец secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about
+ </text>
+ <text name="price_text">
+ L$30,000
+ </text>
+ <icon name="secure_browsing" tool_tip="БезопаÑный проÑмотр"/>
+ <text name="object_media_url">
+ http://www.superdupertest.com
+ </text>
+ <button label="Купить" name="buy_btn"/>
+ <button label="Заплатить" name="pay_btn"/>
+ <button label="ВзÑÑ‚ÑŒ копию" name="take_free_copy_btn"/>
+ <button label="КоÑнутьÑÑ" name="touch_btn"/>
+ <button label="СеÑÑ‚ÑŒ" name="sit_btn"/>
+ <button label="Открыто" name="open_btn"/>
+ <button label="Больше" name="more_info_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/inspect_remote_object.xml b/indra/newview/skins/default/xui/ru/inspect_remote_object.xml
new file mode 100644
index 0000000000..eec4817f02
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/inspect_remote_object.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_remote_object">
+ <text name="object_name">
+ Проверка очень длинного имени объекта. О боже, поверить не могу что Ð¸Ð¼Ñ Ñтого объекта может быть таким длинным, чеÑтно!
+ </text>
+ <text name="object_owner_label">
+ Владелец:
+ </text>
+ <text name="object_owner">
+ ДлинноеимÑаватара ДжонÑонзначитÑынджона
+ </text>
+ <text name="object_slurl">
+ http://slurl.com/Ahern/50/50/50
+ </text>
+ <button label="Карта" name="map_btn"/>
+ <button label="Заблокировать" name="block_btn"/>
+ <button label="Закрыть" name="close_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ru/menu_add_wearable_gear.xml b/indra/newview/skins/default/xui/ru/menu_add_wearable_gear.xml
new file mode 100644
index 0000000000..786e571527
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_add_wearable_gear.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Add Wearable Gear Menu">
+ <menu_item_check label="Сортировать по времени" name="sort_by_most_recent"/>
+ <menu_item_check label="Сортировать по имени" name="sort_by_name"/>
+ <menu_item_check label="Сортировать по типу" name="sort_by_type"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_attachment_other.xml b/indra/newview/skins/default/xui/ru/menu_attachment_other.xml
new file mode 100644
index 0000000000..fb1c24448b
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_attachment_other.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- *NOTE: See also menu_avatar_other.xml -->
+<context_menu name="Avatar Pie">
+ <menu_item_call label="Смотреть профиль" name="Profile..."/>
+ <menu_item_call label="Ð’ друзьÑ" name="Add Friend"/>
+ <menu_item_call label="IM" name="Send IM..."/>
+ <menu_item_call label="Звонок" name="Call"/>
+ <menu_item_call label="ПриглаÑить в группу" name="Invite..."/>
+ <menu_item_call label="Заблокировать" name="Avatar Mute"/>
+ <menu_item_call label="ПожаловатьÑÑ" name="abuse"/>
+ <menu_item_call label="Заморозить" name="Freeze..."/>
+ <menu_item_call label="Выкинуть" name="Eject..."/>
+ <menu_item_call label="Отладка текÑтур" name="Debug..."/>
+ <menu_item_call label="Приблизить" name="Zoom In"/>
+ <menu_item_call label="Заплатить" name="Pay..."/>
+ <menu_item_call label="Профиль объекта" name="Object Inspect"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_attachment_self.xml b/indra/newview/skins/default/xui/ru/menu_attachment_self.xml
new file mode 100644
index 0000000000..f241b48871
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_attachment_self.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Attachment Pie">
+ <menu_item_call label="КоÑнутьÑÑ" name="Attachment Object Touch"/>
+ <menu_item_call label="Изменить" name="Edit..."/>
+ <menu_item_call label="ОтÑоединить" name="Detach"/>
+ <menu_item_call label="СеÑÑ‚ÑŒ" name="Sit Down Here"/>
+ <menu_item_call label="Ð’Ñтать" name="Stand Up"/>
+ <menu_item_call label="Мой внешний вид" name="Change Outfit"/>
+ <menu_item_call label="Изменить коÑтюм" name="Edit Outfit"/>
+ <menu_item_call label="Изменить фигуру" name="Edit My Shape"/>
+ <menu_item_call label="Мои друзьÑ" name="Friends..."/>
+ <menu_item_call label="Мои группы" name="Groups..."/>
+ <menu_item_call label="Мой профиль" name="Profile..."/>
+ <menu_item_call label="Отладка текÑтур" name="Debug..."/>
+ <menu_item_call label="БроÑить" name="Drop"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_avatar_icon.xml b/indra/newview/skins/default/xui/ru/menu_avatar_icon.xml
new file mode 100644
index 0000000000..ac2b4be003
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_avatar_icon.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Avatar Icon Menu">
+ <menu_item_call label="Открыть профиль" name="Show Profile"/>
+ <menu_item_call label="Отправить Ñообщение..." name="Send IM"/>
+ <menu_item_call label="Добавить в друзьÑ..." name="Add Friend"/>
+ <menu_item_call label="Удалить из друзей..." name="Remove Friend"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_avatar_other.xml b/indra/newview/skins/default/xui/ru/menu_avatar_other.xml
new file mode 100644
index 0000000000..fb283c9d80
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_avatar_other.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- *NOTE: See also menu_attachment_other.xml -->
+<context_menu name="Avatar Pie">
+ <menu_item_call label="Смотреть профиль" name="Profile..."/>
+ <menu_item_call label="Ð’ друзьÑ" name="Add Friend"/>
+ <menu_item_call label="IM" name="Send IM..."/>
+ <menu_item_call label="Звонок" name="Call"/>
+ <menu_item_call label="ПриглаÑить в группу" name="Invite..."/>
+ <menu_item_call label="Заблокировать" name="Avatar Mute"/>
+ <menu_item_call label="ПожаловатьÑÑ" name="abuse"/>
+ <menu_item_call label="Заморозить" name="Freeze..."/>
+ <menu_item_call label="Выкинуть" name="Eject..."/>
+ <menu_item_call label="Отладка текÑтур" name="Debug..."/>
+ <menu_item_call label="Приблизить" name="Zoom In"/>
+ <menu_item_call label="Заплатить" name="Pay..."/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_avatar_self.xml b/indra/newview/skins/default/xui/ru/menu_avatar_self.xml
new file mode 100644
index 0000000000..b72f3dcc42
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_avatar_self.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Self Pie">
+ <menu_item_call label="СеÑÑ‚ÑŒ" name="Sit Down Here"/>
+ <menu_item_call label="Ð’Ñтать" name="Stand Up"/>
+ <context_menu label="СнÑÑ‚ÑŒ" name="Take Off &gt;">
+ <context_menu label="одежду" name="Clothes &gt;">
+ <menu_item_call label="рубашку" name="Shirt"/>
+ <menu_item_call label="брюки" name="Pants"/>
+ <menu_item_call label="юбку" name="Skirt"/>
+ <menu_item_call label="обувь" name="Shoes"/>
+ <menu_item_call label="ноÑки" name="Socks"/>
+ <menu_item_call label="пиджак" name="Jacket"/>
+ <menu_item_call label="перчатки" name="Gloves"/>
+ <menu_item_call label="майку" name="Self Undershirt"/>
+ <menu_item_call label="труÑÑ‹" name="Self Underpants"/>
+ <menu_item_call label="тату" name="Self Tattoo"/>
+ <menu_item_call label="физичеÑкие данные" name="Self Physics"/>
+ <menu_item_call label="альфа-маÑку" name="Self Alpha"/>
+ <menu_item_call label="вÑÑŽ одежду" name="All Clothes"/>
+ </context_menu>
+ <context_menu label="данные в игре" name="Object Detach HUD"/>
+ <context_menu label="ОтÑоединить" name="Object Detach"/>
+ <menu_item_call label="ОтÑоединить вÑе" name="Detach All"/>
+ </context_menu>
+ <menu_item_call label="Мой внешний вид" name="Chenge Outfit"/>
+ <menu_item_call label="Изменить коÑтюм" name="Edit Outfit"/>
+ <menu_item_call label="Изменить фигуру" name="Edit My Shape"/>
+ <menu_item_call label="Мои друзьÑ" name="Friends..."/>
+ <menu_item_call label="Мои группы" name="Groups..."/>
+ <menu_item_call label="Мой профиль" name="Profile..."/>
+ <menu_item_call label="Отладка текÑтур" name="Debug..."/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_bottomtray.xml b/indra/newview/skins/default/xui/ru/menu_bottomtray.xml
new file mode 100644
index 0000000000..fa3558945b
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_bottomtray.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="hide_camera_move_controls_menu">
+ <menu_item_check label="Кнопка разговора" name="EnableVoiceChat"/>
+ <menu_item_check label="Кнопка жеÑтов" name="ShowGestureButton"/>
+ <menu_item_check label="Кнопка движениÑ" name="ShowMoveButton"/>
+ <menu_item_check label="Кнопка камеры" name="ShowCameraButton"/>
+ <menu_item_check label="Кнопка Ñнимка" name="ShowSnapshotButton"/>
+ <menu_item_check label="Кнопка ÑтроительÑтва" name="ShowBuildButton"/>
+ <menu_item_check label="Кнопка поиÑка" name="ShowSearchButton"/>
+ <menu_item_check label="Кнопка карты" name="ShowWorldMapButton"/>
+ <menu_item_check label="Кнопка миникарты" name="ShowMiniMapButton"/>
+ <menu_item_call label="Вырезать" name="NearbyChatBar_Cut"/>
+ <menu_item_call label="Копировать" name="NearbyChatBar_Copy"/>
+ <menu_item_call label="Ð’Ñтавить" name="NearbyChatBar_Paste"/>
+ <menu_item_call label="Удалить" name="NearbyChatBar_Delete"/>
+ <menu_item_call label="Выделить вÑе" name="NearbyChatBar_Select_All"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_cof_attachment.xml b/indra/newview/skins/default/xui/ru/menu_cof_attachment.xml
new file mode 100644
index 0000000000..72d1bc52b5
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_cof_attachment.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="COF Attachment">
+ <menu_item_call label="ОтÑоединить" name="detach"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_cof_body_part.xml b/indra/newview/skins/default/xui/ru/menu_cof_body_part.xml
new file mode 100644
index 0000000000..ee0a0c70ed
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_cof_body_part.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="COF Body">
+ <menu_item_call label="Заменить" name="replace"/>
+ <menu_item_call label="Изменить" name="edit"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_cof_clothing.xml b/indra/newview/skins/default/xui/ru/menu_cof_clothing.xml
new file mode 100644
index 0000000000..bbdf4fd0d4
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_cof_clothing.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="COF Clothing">
+ <menu_item_call label="СнÑÑ‚ÑŒ" name="take_off"/>
+ <menu_item_call label="Изменить" name="edit"/>
+ <menu_item_call label="Заменить" name="replace"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_cof_gear.xml b/indra/newview/skins/default/xui/ru/menu_cof_gear.xml
new file mode 100644
index 0000000000..0332c03a04
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_cof_gear.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Gear COF">
+ <menu label="ÐÐ¾Ð²Ð°Ñ Ð¾Ð´ÐµÐ¶Ð´Ð°" name="COF.Gear.New_Clothes"/>
+ <menu label="Ðовые чаÑти тела" name="COF.Geear.New_Body_Parts"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_edit.xml b/indra/newview/skins/default/xui/ru/menu_edit.xml
new file mode 100644
index 0000000000..0dddea9c04
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_edit.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu label="Изменить" name="Edit">
+ <menu_item_call label="Отменить" name="Undo"/>
+ <menu_item_call label="Вернуть" name="Redo"/>
+ <menu_item_call label="Вырезать" name="Cut"/>
+ <menu_item_call label="Копировать" name="Copy"/>
+ <menu_item_call label="Ð’Ñтавить" name="Paste"/>
+ <menu_item_call label="Удалить" name="Delete"/>
+ <menu_item_call label="Дублировать" name="Duplicate"/>
+ <menu_item_call label="Выделить вÑе" name="Select All"/>
+ <menu_item_call label="Отменить выделение" name="Deselect"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_favorites.xml b/indra/newview/skins/default/xui/ru/menu_favorites.xml
new file mode 100644
index 0000000000..074be06ba9
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_favorites.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="Телепорт" name="Teleport To Landmark"/>
+ <menu_item_call label="Смотреть/изменить закладку" name="Landmark Open"/>
+ <menu_item_call label="Копировать URL-Ð°Ð´Ñ€ÐµÑ SL" name="Copy slurl"/>
+ <menu_item_call label="Показать на карте" name="Show On Map"/>
+ <menu_item_call label="Копировать" name="Landmark Copy"/>
+ <menu_item_call label="Ð’Ñтавить" name="Landmark Paste"/>
+ <menu_item_call label="Удалить" name="Delete"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_gesture_gear.xml b/indra/newview/skins/default/xui/ru/menu_gesture_gear.xml
new file mode 100644
index 0000000000..d0b68cefbd
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_gesture_gear.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_gesture_gear">
+ <menu_item_call label="Добавить в избранное/удалить" name="activate"/>
+ <menu_item_call label="Копировать" name="copy_gesture"/>
+ <menu_item_call label="Ð’Ñтавить" name="paste"/>
+ <menu_item_call label="Копировать UUID" name="copy_uuid"/>
+ <menu_item_call label="Сохранить в текущий коÑтюм" name="save_to_outfit"/>
+ <menu_item_call label="Изменить" name="edit_gesture"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_group_plus.xml b/indra/newview/skins/default/xui/ru/menu_group_plus.xml
new file mode 100644
index 0000000000..edd012b964
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_group_plus.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_call label="ПриÑоединитьÑÑ Ðº группе..." name="item_join"/>
+ <menu_item_call label="ÐÐ¾Ð²Ð°Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð°..." name="item_new"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_hide_navbar.xml b/indra/newview/skins/default/xui/ru/menu_hide_navbar.xml
new file mode 100644
index 0000000000..34e5f4c0e4
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_hide_navbar.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="hide_navbar_menu">
+ <menu_item_check label="Показать панель навигации и избранного" name="ShowNavbarNavigationPanel"/>
+ <menu_item_check label="Показать панель избранного" name="ShowNavbarFavoritesPanel"/>
+ <menu_item_check label="Показать мини-панель меÑтоположениÑ" name="ShowMiniLocationPanel"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_im_well_button.xml b/indra/newview/skins/default/xui/ru/menu_im_well_button.xml
new file mode 100644
index 0000000000..5a5bde61b9
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_im_well_button.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="IM Well Button Context Menu">
+ <menu_item_call label="Закрыть вÑе" name="Close All"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_imchiclet_adhoc.xml b/indra/newview/skins/default/xui/ru/menu_imchiclet_adhoc.xml
new file mode 100644
index 0000000000..8b60a585ab
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_imchiclet_adhoc.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet AdHoc Menu">
+ <menu_item_call label="Завершить ÑеанÑ" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_imchiclet_group.xml b/indra/newview/skins/default/xui/ru/menu_imchiclet_group.xml
new file mode 100644
index 0000000000..766b3847a7
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_imchiclet_group.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet Group Menu">
+ <menu_item_call label="Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ группе" name="Show Profile"/>
+ <menu_item_call label="Показать ÑеанÑ" name="Chat"/>
+ <menu_item_call label="Завершить ÑеанÑ" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_imchiclet_p2p.xml b/indra/newview/skins/default/xui/ru/menu_imchiclet_p2p.xml
new file mode 100644
index 0000000000..a33f6d5be8
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_imchiclet_p2p.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet P2P Menu">
+ <menu_item_call label="Смотреть профиль" name="Show Profile"/>
+ <menu_item_call label="Ð’ друзьÑ" name="Add Friend"/>
+ <menu_item_call label="Показать ÑеанÑ" name="Send IM"/>
+ <menu_item_call label="Завершить ÑеанÑ" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/ru/menu_inspect_avatar_gear.xml
new file mode 100644
index 0000000000..957609a7a3
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_inspect_avatar_gear.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<toggleable_menu name="Gear Menu">
+ <menu_item_call label="Смотреть профиль" name="view_profile"/>
+ <menu_item_call label="Ð’ друзьÑ" name="add_friend"/>
+ <menu_item_call label="IM" name="im"/>
+ <menu_item_call label="Звонок" name="call"/>
+ <menu_item_call label="Телепорт" name="teleport"/>
+ <menu_item_call label="ПриглаÑить в группу" name="invite_to_group"/>
+ <menu_item_call label="Заблокировать" name="block"/>
+ <menu_item_call label="Разблокировать" name="unblock"/>
+ <menu_item_call label="ПожаловатьÑÑ" name="report"/>
+ <menu_item_call label="Заморозить" name="freeze"/>
+ <menu_item_call label="Выкинуть" name="eject"/>
+ <menu_item_call label="Выкинуть" name="kick"/>
+ <menu_item_call label="Поддержка" name="csr"/>
+ <menu_item_call label="Отладка текÑтур" name="debug"/>
+ <menu_item_call label="Ðайти на карте" name="find_on_map"/>
+ <menu_item_call label="Приблизить" name="zoom_in"/>
+ <menu_item_call label="Заплатить" name="pay"/>
+ <menu_item_call label="ПоделитьÑÑ" name="share"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_inspect_object_gear.xml b/indra/newview/skins/default/xui/ru/menu_inspect_object_gear.xml
new file mode 100644
index 0000000000..30953e830b
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_inspect_object_gear.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<toggleable_menu name="Gear Menu">
+ <menu_item_call label="КоÑнутьÑÑ" name="touch"/>
+ <menu_item_call label="СеÑÑ‚ÑŒ" name="sit"/>
+ <menu_item_call label="Заплатить" name="pay"/>
+ <menu_item_call label="Купить" name="buy"/>
+ <menu_item_call label="ВзÑÑ‚ÑŒ" name="take"/>
+ <menu_item_call label="ВзÑÑ‚ÑŒ копию" name="take_copy"/>
+ <menu_item_call label="Открыть" name="open"/>
+ <menu_item_call label="Изменить" name="edit"/>
+ <menu_item_call label="Ðадеть" name="wear"/>
+ <menu_item_call label="Добавить" name="add"/>
+ <menu_item_call label="ПожаловатьÑÑ" name="report"/>
+ <menu_item_call label="Заблокировать" name="block"/>
+ <menu_item_call label="Разблокировать" name="unblock"/>
+ <menu_item_call label="Приблизить" name="zoom_in"/>
+ <menu_item_call label="Удалить" name="remove"/>
+ <menu_item_call label="Ð”Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ" name="more_info"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/ru/menu_inspect_self_gear.xml
new file mode 100644
index 0000000000..901bb615e0
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_inspect_self_gear.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Self Pie">
+ <menu_item_call label="СеÑÑ‚ÑŒ" name="Sit Down Here"/>
+ <menu_item_call label="Ð’Ñтать" name="Stand Up"/>
+ <context_menu label="СнÑÑ‚ÑŒ" name="Take Off &gt;">
+ <context_menu label="одежду" name="Clothes &gt;">
+ <menu_item_call label="рубашку" name="Shirt"/>
+ <menu_item_call label="брюки" name="Pants"/>
+ <menu_item_call label="юбку" name="Skirt"/>
+ <menu_item_call label="обувь" name="Shoes"/>
+ <menu_item_call label="ноÑки" name="Socks"/>
+ <menu_item_call label="пиджак" name="Jacket"/>
+ <menu_item_call label="перчатки" name="Gloves"/>
+ <menu_item_call label="майку" name="Self Undershirt"/>
+ <menu_item_call label="труÑÑ‹" name="Self Underpants"/>
+ <menu_item_call label="тату" name="Self Tattoo"/>
+ <menu_item_call label="альфа-маÑку" name="Self Alpha"/>
+ <menu_item_call label="вÑÑŽ одежду" name="All Clothes"/>
+ </context_menu>
+ <context_menu label="данные в игре" name="Object Detach HUD"/>
+ <context_menu label="ОтÑоединить" name="Object Detach"/>
+ <menu_item_call label="ОтÑоединить вÑе" name="Detach All"/>
+ </context_menu>
+ <menu_item_call label="Сменить коÑтюм" name="Chenge Outfit"/>
+ <menu_item_call label="Изменить коÑтюм" name="Edit Outfit"/>
+ <menu_item_call label="Изменить фигуру" name="Edit My Shape"/>
+ <menu_item_call label="Мои друзьÑ" name="Friends..."/>
+ <menu_item_call label="Мои группы" name="Groups..."/>
+ <menu_item_call label="Мой профиль" name="Profile..."/>
+ <menu_item_call label="Отладка текÑтур" name="Debug..."/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_inv_offer_chiclet.xml b/indra/newview/skins/default/xui/ru/menu_inv_offer_chiclet.xml
new file mode 100644
index 0000000000..95d162d7fe
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_inv_offer_chiclet.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="InvOfferChiclet Menu">
+ <menu_item_call label="Закрыть" name="Close"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_inventory.xml b/indra/newview/skins/default/xui/ru/menu_inventory.xml
new file mode 100644
index 0000000000..49f7281b4e
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_inventory.xml
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="ПоделитьÑÑ" name="Share"/>
+ <menu_item_call label="Купить" name="Task Buy"/>
+ <menu_item_call label="Открыть" name="Task Open"/>
+ <menu_item_call label="ВоÑпроизвеÑти" name="Task Play"/>
+ <menu_item_call label="СвойÑтва" name="Task Properties"/>
+ <menu_item_call label="Переименовать" name="Task Rename"/>
+ <menu_item_call label="Удалить" name="Task Remove"/>
+ <menu_item_call label="ОчиÑтить корзину" name="Empty Trash"/>
+ <menu_item_call label="ОчиÑтить бюро находок" name="Empty Lost And Found"/>
+ <menu_item_call label="ÐÐ¾Ð²Ð°Ñ Ð¿Ð°Ð¿ÐºÐ°" name="New Folder"/>
+ <menu_item_call label="Ðовый Ñкрипт" name="New Script"/>
+ <menu_item_call label="ÐÐ¾Ð²Ð°Ñ Ð·Ð°Ð¼ÐµÑ‚ÐºÐ°" name="New Note"/>
+ <menu_item_call label="Ðовый жеÑÑ‚" name="New Gesture"/>
+ <menu label="ÐÐ¾Ð²Ð°Ñ Ð¾Ð´ÐµÐ¶Ð´Ð°" name="New Clothes">
+ <menu_item_call label="ÐÐ¾Ð²Ð°Ñ Ñ€ÑƒÐ±Ð°ÑˆÐºÐ°" name="New Shirt"/>
+ <menu_item_call label="Ðовые брюки" name="New Pants"/>
+ <menu_item_call label="ÐÐ¾Ð²Ð°Ñ Ð¾Ð±ÑƒÐ²ÑŒ" name="New Shoes"/>
+ <menu_item_call label="Ðовые ноÑки" name="New Socks"/>
+ <menu_item_call label="Ðовый пиджак" name="New Jacket"/>
+ <menu_item_call label="ÐÐ¾Ð²Ð°Ñ ÑŽÐ±ÐºÐ°" name="New Skirt"/>
+ <menu_item_call label="Ðовые перчатки" name="New Gloves"/>
+ <menu_item_call label="ÐÐ¾Ð²Ð°Ñ Ð¼Ð°Ð¹ÐºÐ°" name="New Undershirt"/>
+ <menu_item_call label="Ðовые труÑÑ‹" name="New Underpants"/>
+ <menu_item_call label="ÐÐ¾Ð²Ð°Ñ Ð°Ð»ÑŒÑ„Ð°-маÑка" name="New Alpha Mask"/>
+ <menu_item_call label="Ðовое тату" name="New Tattoo"/>
+ <menu_item_call label="ÐÐ¾Ð²Ð°Ñ Ñ„Ð¸Ð·Ð¸ÐºÐ°" name="New Physics"/>
+ </menu>
+ <menu label="Ðовые чаÑти тела" name="New Body Parts">
+ <menu_item_call label="ÐÐ¾Ð²Ð°Ñ Ñ„Ð¸Ð³ÑƒÑ€Ð°" name="New Shape"/>
+ <menu_item_call label="ÐÐ¾Ð²Ð°Ñ ÐºÐ¾Ð¶Ð°" name="New Skin"/>
+ <menu_item_call label="Ðовые волоÑÑ‹" name="New Hair"/>
+ <menu_item_call label="Ðовые глаза" name="New Eyes"/>
+ </menu>
+ <menu label="Сменить тип" name="Change Type">
+ <menu_item_call label="По умолчанию" name="Default"/>
+ <menu_item_call label="Перчатки" name="Gloves"/>
+ <menu_item_call label="Пиджак" name="Jacket"/>
+ <menu_item_call label="Брюки" name="Pants"/>
+ <menu_item_call label="Фигура" name="Shape"/>
+ <menu_item_call label="Обувь" name="Shoes"/>
+ <menu_item_call label="Рубашка" name="Shirt"/>
+ <menu_item_call label="Юбка" name="Skirt"/>
+ <menu_item_call label="ТруÑÑ‹" name="Underpants"/>
+ <menu_item_call label="Майка" name="Undershirt"/>
+ </menu>
+ <menu_item_call label="Телепорт" name="Landmark Open"/>
+ <menu_item_call label="Открыть" name="Animation Open"/>
+ <menu_item_call label="Открыть" name="Sound Open"/>
+ <menu_item_call label="Сменить текущий коÑтюм" name="Replace Outfit"/>
+ <menu_item_call label="Добавить к текущему коÑтюму" name="Add To Outfit"/>
+ <menu_item_call label="Убрать из текущего коÑтюма" name="Remove From Outfit"/>
+ <menu_item_call label="Ðайти оригинал" name="Find Original"/>
+ <menu_item_call label="Удалить навÑегда" name="Purge Item"/>
+ <menu_item_call label="ВоÑÑтановить вещь" name="Restore Item"/>
+ <menu_item_call label="Открыть" name="Open"/>
+ <menu_item_call label="Открыть оригинал" name="Open Original"/>
+ <menu_item_call label="СвойÑтва" name="Properties"/>
+ <menu_item_call label="Переименовать" name="Rename"/>
+ <menu_item_call label="Копировать UUID актива" name="Copy Asset UUID"/>
+ <menu_item_call label="Вырезать" name="Cut"/>
+ <menu_item_call label="Копировать" name="Copy"/>
+ <menu_item_call label="Ð’Ñтавить" name="Paste"/>
+ <menu_item_call label="Ð’Ñтавить как ÑÑылку" name="Paste As Link"/>
+ <menu_item_call label="Удалить" name="Remove Link"/>
+ <menu_item_call label="Удалить" name="Delete"/>
+ <menu_item_call label="Удалить ÑиÑтемную папку" name="Delete System Folder"/>
+ <menu_item_call label="Ðачать конференцию" name="Conference Chat Folder"/>
+ <menu_item_call label="ВоÑпроизвеÑти" name="Sound Play"/>
+ <menu_item_call label="О закладке" name="About Landmark"/>
+ <menu_item_call label="Проиграть Ð´Ð»Ñ Ð²Ñех" name="Animation Play"/>
+ <menu_item_call label="Проиграть Ð´Ð»Ñ ÑебÑ" name="Animation Audition"/>
+ <menu_item_call label="Отправить IM-Ñообщение" name="Send Instant Message"/>
+ <menu_item_call label="Предложить телепортацию..." name="Offer Teleport..."/>
+ <menu_item_call label="Ðачать конференцию" name="Conference Chat"/>
+ <menu_item_call label="Ðктивировать" name="Activate"/>
+ <menu_item_call label="Деактивировать" name="Deactivate"/>
+ <menu_item_call label="Сохранить как" name="Save As"/>
+ <menu_item_call label="ОтÑоединить от ÑебÑ" name="Detach From Yourself"/>
+ <menu_item_call label="Ðадеть" name="Wearable And Object Wear"/>
+ <menu label="ПриÑоединить к" name="Attach To"/>
+ <menu label="ПриÑоединить к данным в игре" name="Attach To HUD"/>
+ <menu_item_call label="Изменить" name="Wearable Edit"/>
+ <menu_item_call label="Добавить" name="Wearable Add"/>
+ <menu_item_call label="СнÑÑ‚ÑŒ" name="Take Off"/>
+ <menu_item_call label="Копировать в «Торговые иÑходÑщие»" name="Merchant Copy"/>
+ <menu_item_call label="Отправить в торговый центр" name="Marketplace Send"/>
+ <menu_item_call label="- нет дейÑтвий -" name="--no options--"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_inventory_add.xml b/indra/newview/skins/default/xui/ru/menu_inventory_add.xml
new file mode 100644
index 0000000000..9a240c653e
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_inventory_add.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_inventory_add">
+ <menu label="Передать" name="upload">
+ <menu_item_call label="Изображение (L$[COST])..." name="Upload Image"/>
+ <menu_item_call label="Звук (L$[COST])..." name="Upload Sound"/>
+ <menu_item_call label="ÐÐ½Ð¸Ð¼Ð°Ñ†Ð¸Ñ (L$[COST])..." name="Upload Animation"/>
+ <menu_item_call label="Модель..." name="Upload Model"/>
+ <menu_item_call label="МаÑтер моделированиÑ..." name="Upload Model Wizard"/>
+ <menu_item_call label="Ð’Ñе Ñразу (L$[COST] за файл)..." name="Bulk Upload"/>
+ <menu_item_call label="УÑтановить Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð½Ð° передачу по умолчанию" name="perm prefs"/>
+ </menu>
+ <menu_item_call label="ÐÐ¾Ð²Ð°Ñ Ð¿Ð°Ð¿ÐºÐ°" name="New Folder"/>
+ <menu_item_call label="Ðовый Ñкрипт" name="New Script"/>
+ <menu_item_call label="ÐÐ¾Ð²Ð°Ñ Ð·Ð°Ð¼ÐµÑ‚ÐºÐ°" name="New Note"/>
+ <menu_item_call label="Ðовый жеÑÑ‚" name="New Gesture"/>
+ <menu label="ÐÐ¾Ð²Ð°Ñ Ð¾Ð´ÐµÐ¶Ð´Ð°" name="New Clothes">
+ <menu_item_call label="ÐÐ¾Ð²Ð°Ñ Ñ€ÑƒÐ±Ð°ÑˆÐºÐ°" name="New Shirt"/>
+ <menu_item_call label="Ðовые брюки" name="New Pants"/>
+ <menu_item_call label="ÐÐ¾Ð²Ð°Ñ Ð¾Ð±ÑƒÐ²ÑŒ" name="New Shoes"/>
+ <menu_item_call label="Ðовые ноÑки" name="New Socks"/>
+ <menu_item_call label="Ðовый пиджак" name="New Jacket"/>
+ <menu_item_call label="ÐÐ¾Ð²Ð°Ñ ÑŽÐ±ÐºÐ°" name="New Skirt"/>
+ <menu_item_call label="Ðовые перчатки" name="New Gloves"/>
+ <menu_item_call label="ÐÐ¾Ð²Ð°Ñ Ð¼Ð°Ð¹ÐºÐ°" name="New Undershirt"/>
+ <menu_item_call label="Ðовые труÑÑ‹" name="New Underpants"/>
+ <menu_item_call label="ÐÐ¾Ð²Ð°Ñ Ð°Ð»ÑŒÑ„Ð°-маÑка" name="New Alpha"/>
+ <menu_item_call label="Ðовое тату" name="New Tattoo"/>
+ <menu_item_call label="ÐÐ¾Ð²Ð°Ñ Ñ„Ð¸Ð·Ð¸ÐºÐ°" name="New Physics"/>
+ </menu>
+ <menu label="Ðовые чаÑти тела" name="New Body Parts">
+ <menu_item_call label="ÐÐ¾Ð²Ð°Ñ Ñ„Ð¸Ð³ÑƒÑ€Ð°" name="New Shape"/>
+ <menu_item_call label="ÐÐ¾Ð²Ð°Ñ ÐºÐ¾Ð¶Ð°" name="New Skin"/>
+ <menu_item_call label="Ðовые волоÑÑ‹" name="New Hair"/>
+ <menu_item_call label="Ðовые глаза" name="New Eyes"/>
+ </menu>
+</menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/ru/menu_inventory_gear_default.xml
new file mode 100644
index 0000000000..9fc0b6d44e
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_inventory_gear_default.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_gear_default">
+ <menu_item_call label="Ðовое окно инвентарÑ" name="new_window"/>
+ <menu_item_check label="Сортировать по имени" name="sort_by_name"/>
+ <menu_item_check label="Сортировать по времени" name="sort_by_recent"/>
+ <menu_item_check label="Ð’Ñегда Ñортировать папки по имени" name="sort_folders_by_name"/>
+ <menu_item_check label="Показывать ÑиÑтемные папки вверху" name="sort_system_folders_to_top"/>
+ <menu_item_call label="Показать фильтры" name="show_filters"/>
+ <menu_item_call label="СброÑить фильтры" name="reset_filters"/>
+ <menu_item_call label="Закрыть вÑе папки" name="close_folders"/>
+ <menu_item_call label="ОчиÑтить бюро находок" name="empty_lostnfound"/>
+ <menu_item_call label="Сохранить текÑтуру как" name="Save Texture As"/>
+ <menu_item_call label="ПоделитьÑÑ" name="Share"/>
+ <menu_item_call label="Ðайти оригинал" name="Find Original"/>
+ <menu_item_call label="Ðайти вÑе ÑÑылки" name="Find All Links"/>
+ <menu_item_call label="ОчиÑтить корзину" name="empty_trash"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_land.xml b/indra/newview/skins/default/xui/ru/menu_land.xml
new file mode 100644
index 0000000000..89889d7bf6
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_land.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Land Pie">
+ <menu_item_call label="О земле" name="Place Information..."/>
+ <menu_item_call label="СеÑÑ‚ÑŒ здеÑÑŒ" name="Sit Here"/>
+ <menu_item_call label="Купить Ñту землю" name="Land Buy"/>
+ <menu_item_call label="Купить пропуÑк" name="Land Buy Pass"/>
+ <menu_item_call label="СтроительÑтво" name="Create"/>
+ <menu_item_call label="Изменить ландшафт" name="Edit Terrain"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_landmark.xml b/indra/newview/skins/default/xui/ru/menu_landmark.xml
new file mode 100644
index 0000000000..24b60f9d86
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_landmark.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="landmark_overflow_menu">
+ <menu_item_call label="Копировать URL SL" name="copy"/>
+ <menu_item_call label="Удалить" name="delete"/>
+ <menu_item_call label="Создать подборку" name="pick"/>
+ <menu_item_call label="Добавить в любимые" name="add_to_favbar"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_login.xml b/indra/newview/skins/default/xui/ru/menu_login.xml
new file mode 100644
index 0000000000..93a5ffbb25
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_login.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu_bar name="Login Menu">
+ <menu label="Я" name="File">
+ <menu_item_call label="ÐаÑтройки..." name="Preferences..."/>
+ <menu_item_call label="Выход из [APP_NAME]" name="Quit"/>
+ </menu>
+ <menu label="Справка" name="Help">
+ <menu_item_call label="Справка [SECOND_LIFE]" name="Second Life Help"/>
+ <menu_item_call label="О [APP_NAME]" name="About Second Life"/>
+ </menu>
+ <menu_item_check label="Показать меню отладки" name="Show Debug Menu"/>
+ <menu label="Отладка" name="Debug">
+ <menu_item_call label="ÐаÑтройки отладки" name="Debug Settings"/>
+ <menu_item_call label="ÐаÑтройки интерфейÑа/цвета" name="UI/Color Settings"/>
+ <menu_item_call label="ПроÑмотр XUI" name="UI Preview Tool"/>
+ <menu label="ТеÑÑ‚ UI" name="UI Tests"/>
+ <menu_item_call label="Задать размер окна..." name="Set Window Size..."/>
+ <menu_item_call label="Показать лицензионное Ñоглашение" name="TOS"/>
+ <menu_item_call label="Показать Ñообщение об ошибке" name="Critical"/>
+ <menu_item_call label="ТеÑÑ‚ отладки плавающего окна Ñ Ð²ÐµÐ±-контентом" name="Web Content Floater Debug Test"/>
+ <menu label="Уровень журнала" name="Set Logging Level"/>
+ <menu_item_check label="Выбор Ñетки" name="Show Grid Picker"/>
+ <menu_item_call label="КонÑоль уведомлений" name="Show Notifications Console"/>
+ </menu>
+</menu_bar>
diff --git a/indra/newview/skins/default/xui/ru/menu_media_ctrl.xml b/indra/newview/skins/default/xui/ru/menu_media_ctrl.xml
new file mode 100644
index 0000000000..d7485b02af
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_media_ctrl.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="media ctrl context menu">
+ <menu_item_call label="Вырезать" name="Cut"/>
+ <menu_item_call label="Копировать" name="Copy"/>
+ <menu_item_call label="Ð’Ñтавить" name="Paste"/>
+ <menu_item_call label="Открыть веб-инÑпектор" name="open_webinspector"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_mini_map.xml b/indra/newview/skins/default/xui/ru/menu_mini_map.xml
new file mode 100644
index 0000000000..6b3db11609
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_mini_map.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="Близко" name="Zoom Close"/>
+ <menu_item_call label="Средне" name="Zoom Medium"/>
+ <menu_item_call label="Далеко" name="Zoom Far"/>
+ <menu_item_call label="СброÑить увеличение" name="Zoom Default"/>
+ <menu_item_check label="Вращать карту" name="Rotate Map"/>
+ <menu_item_check label="Ðвтоцентрирование" name="Auto Center"/>
+ <menu_item_call label="ОÑтановить Ñлежение" name="Stop Tracking"/>
+ <menu_item_call label="Карта мира" name="World Map"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_mode_change.xml b/indra/newview/skins/default/xui/ru/menu_mode_change.xml
new file mode 100644
index 0000000000..25d6e9af27
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_mode_change.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Mode Change">
+ <menu_item_check label="ОÑновной" name="BasicMode"/>
+ <menu_item_check label="РаÑширенный" name="AdvancedMode"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_model_import_gear_default.xml b/indra/newview/skins/default/xui/ru/menu_model_import_gear_default.xml
new file mode 100644
index 0000000000..5ae5e7dfbc
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_model_import_gear_default.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="model_menu_gear_default">
+ <menu_item_check label="Показать грани" name="show_edges"/>
+ <menu_item_check label="Показать физику" name="show_physics"/>
+ <menu_item_check label="Показать текÑтуры" name="show_textures"/>
+ <menu_item_check label="Показать Ð²ÐµÑ ÐºÐ¾Ð¶Ð¸" name="show_skin_weight"/>
+ <menu_item_check label="Показать положение Ñочленений" name="show_joint_positions"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_navbar.xml b/indra/newview/skins/default/xui/ru/menu_navbar.xml
new file mode 100644
index 0000000000..2dd0c0df36
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_navbar.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Navbar Menu">
+ <menu_item_check label="Показать координаты" name="Show Coordinates"/>
+ <menu_item_check label="Показать ÑвойÑтва учаÑтка" name="Show Parcel Properties"/>
+ <menu_item_call label="Закладка" name="Landmark"/>
+ <menu_item_call label="Вырезать" name="Cut"/>
+ <menu_item_call label="Копировать" name="Copy"/>
+ <menu_item_call label="Ð’Ñтавить" name="Paste"/>
+ <menu_item_call label="Удалить" name="Delete"/>
+ <menu_item_call label="Выделить вÑе" name="Select All"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_nearby_chat.xml b/indra/newview/skins/default/xui/ru/menu_nearby_chat.xml
new file mode 100644
index 0000000000..4b5346d083
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_nearby_chat.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="NearBy Chat Menu">
+ <menu_item_call label="Показать находÑщихÑÑ Ð½ÐµÐ¿Ð¾Ð´Ð°Ð»ÐµÐºÑƒ людей..." name="nearby_people"/>
+ <menu_item_check label="Показать блокируемый текÑÑ‚" name="muted_text"/>
+ <menu_item_check label="Показать значки друзей" name="show_buddy_icons"/>
+ <menu_item_check label="Показать имена" name="show_names"/>
+ <menu_item_check label="Показать значки и имена" name="show_icons_and_names"/>
+ <menu_item_call label="Размер шрифта" name="font_size"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_notification_well_button.xml b/indra/newview/skins/default/xui/ru/menu_notification_well_button.xml
new file mode 100644
index 0000000000..4d067e232a
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_notification_well_button.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Notification Well Button Context Menu">
+ <menu_item_call label="Закрыть вÑе" name="Close All"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_object.xml b/indra/newview/skins/default/xui/ru/menu_object.xml
new file mode 100644
index 0000000000..d6abfd12a2
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_object.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Object Pie">
+ <menu_item_call label="КоÑнутьÑÑ" name="Object Touch"/>
+ <menu_item_call label="Изменить" name="Edit..."/>
+ <menu_item_call label="СтроительÑтво" name="Build"/>
+ <menu_item_call label="Открыто" name="Open"/>
+ <menu_item_call label="СеÑÑ‚ÑŒ здеÑÑŒ" name="Object Sit"/>
+ <menu_item_call label="Ð’Ñтать" name="Object Stand Up"/>
+ <menu_item_call label="Профиль объекта" name="Object Inspect"/>
+ <menu_item_call label="Приблизить" name="Zoom In"/>
+ <context_menu label="Ðадеть" name="Put On">
+ <menu_item_call label="Ðадеть" name="Wear"/>
+ <menu_item_call label="Добавить" name="Add"/>
+ <context_menu label="ПриÑоединить" name="Object Attach"/>
+ <context_menu label="ПриÑоединить HUD" name="Object Attach HUD"/>
+ </context_menu>
+ <context_menu label="Управление" name="Remove">
+ <menu_item_call label="Жалоба" name="Report Abuse..."/>
+ <menu_item_call label="Заблокировать" name="Object Mute"/>
+ <menu_item_call label="Возврат" name="Return..."/>
+ </context_menu>
+ <menu_item_call label="ВзÑÑ‚ÑŒ" name="Pie Object Take"/>
+ <menu_item_call label="ВзÑÑ‚ÑŒ копию" name="Take Copy"/>
+ <menu_item_call label="Заплатить" name="Pay..."/>
+ <menu_item_call label="Купить" name="Buy..."/>
+ <menu_item_call label="Удалить" name="Delete"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_object_icon.xml b/indra/newview/skins/default/xui/ru/menu_object_icon.xml
new file mode 100644
index 0000000000..6229b2e72f
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_object_icon.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Object Icon Menu">
+ <menu_item_call label="Профиль объекта..." name="Object Profile"/>
+ <menu_item_call label="Блокировать..." name="Block"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_outfit_gear.xml b/indra/newview/skins/default/xui/ru/menu_outfit_gear.xml
new file mode 100644
index 0000000000..93dbd7d6a7
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_outfit_gear.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Gear Outfit">
+ <menu_item_call label="Ðадеть – Заменить текущий коÑтюм" name="wear"/>
+ <menu_item_call label="Ðадеть – Добавить к текущему коÑтюму" name="wear_add"/>
+ <menu_item_call label="СнÑÑ‚ÑŒ – Убрать из текущего коÑтюма" name="take_off"/>
+ <menu label="ÐÐ¾Ð²Ð°Ñ Ð¾Ð´ÐµÐ¶Ð´Ð°" name="New Clothes">
+ <menu_item_call label="ÐÐ¾Ð²Ð°Ñ Ñ€ÑƒÐ±Ð°ÑˆÐºÐ°" name="New Shirt"/>
+ <menu_item_call label="Ðовые брюки" name="New Pants"/>
+ <menu_item_call label="ÐÐ¾Ð²Ð°Ñ Ð¾Ð±ÑƒÐ²ÑŒ" name="New Shoes"/>
+ <menu_item_call label="Ðовые ноÑки" name="New Socks"/>
+ <menu_item_call label="Ðовый пиджак" name="New Jacket"/>
+ <menu_item_call label="ÐÐ¾Ð²Ð°Ñ ÑŽÐ±ÐºÐ°" name="New Skirt"/>
+ <menu_item_call label="Ðовые перчатки" name="New Gloves"/>
+ <menu_item_call label="ÐÐ¾Ð²Ð°Ñ Ð¼Ð°Ð¹ÐºÐ°" name="New Undershirt"/>
+ <menu_item_call label="Ðовые труÑÑ‹" name="New Underpants"/>
+ <menu_item_call label="ÐÐ¾Ð²Ð°Ñ Ð°Ð»ÑŒÑ„Ð°-маÑка" name="New Alpha"/>
+ <menu_item_call label="ÐÐ¾Ð²Ð°Ñ Ñ„Ð¸Ð·Ð¸ÐºÐ°" name="New Physics"/>
+ <menu_item_call label="Ðовое тату" name="New Tattoo"/>
+ </menu>
+ <menu label="Ðовые чаÑти тела" name="New Body Parts">
+ <menu_item_call label="ÐÐ¾Ð²Ð°Ñ Ñ„Ð¸Ð³ÑƒÑ€Ð°" name="New Shape"/>
+ <menu_item_call label="ÐÐ¾Ð²Ð°Ñ ÐºÐ¾Ð¶Ð°" name="New Skin"/>
+ <menu_item_call label="Ðовые волоÑÑ‹" name="New Hair"/>
+ <menu_item_call label="Ðовые глаза" name="New Eyes"/>
+ </menu>
+ <menu_item_call label="Переименовать коÑтюм" name="rename"/>
+ <menu_item_call label="Удалить коÑтюм" name="delete_outfit"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_outfit_tab.xml b/indra/newview/skins/default/xui/ru/menu_outfit_tab.xml
new file mode 100644
index 0000000000..46404195b9
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_outfit_tab.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Outfit">
+ <menu_item_call label="Ðадеть – Заменить текущий коÑтюм" name="wear_replace"/>
+ <menu_item_call label="Ðадеть – Добавить к текущему коÑтюму" name="wear_add"/>
+ <menu_item_call label="СнÑÑ‚ÑŒ – Убрать из текущего коÑтюма" name="take_off"/>
+ <menu_item_call label="Изменить коÑтюм" name="edit"/>
+ <menu_item_call label="Переименовать коÑтюм" name="rename"/>
+ <menu_item_call label="Удалить коÑтюм" name="delete"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_participant_list.xml b/indra/newview/skins/default/xui/ru/menu_participant_list.xml
new file mode 100644
index 0000000000..932ad5bacf
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_participant_list.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Participant List Context Menu">
+ <menu_item_check label="Сортировать по имени" name="SortByName"/>
+ <menu_item_check label="Сортировать по недавно говорившим" name="SortByRecentSpeakers"/>
+ <menu_item_call label="Открыть профиль" name="View Profile"/>
+ <menu_item_call label="Добавить в друзьÑ" name="Add Friend"/>
+ <menu_item_call label="IM" name="IM"/>
+ <menu_item_call label="Звонок" name="Call"/>
+ <menu_item_call label="ПоделитьÑÑ" name="Share"/>
+ <menu_item_call label="Заплатить" name="Pay"/>
+ <menu_item_check label="Показывать значки учаÑтников" name="View Icons"/>
+ <menu_item_check label="Блокировать голоÑ" name="Block/Unblock"/>
+ <menu_item_check label="Блокировать текÑÑ‚" name="MuteText"/>
+ <context_menu label="Параметры модератора" name="Moderator Options">
+ <menu_item_check label="Разрешить текÑтовый чат" name="AllowTextChat"/>
+ <menu_item_call label="Заглушить Ñтого учаÑтника" name="ModerateVoiceMuteSelected"/>
+ <menu_item_call label="Позволить говорить Ñтому учаÑтнику" name="ModerateVoiceUnMuteSelected"/>
+ <menu_item_call label="Заглушить вÑех" name="ModerateVoiceMute"/>
+ <menu_item_call label="Позволить говорить вÑем" name="ModerateVoiceUnmute"/>
+ </context_menu>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_people_friends_view_sort.xml b/indra/newview/skins/default/xui/ru/menu_people_friends_view_sort.xml
new file mode 100644
index 0000000000..0fa252aa99
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_people_friends_view_sort.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_group_plus">
+ <menu_item_check label="Сортировать по имени" name="sort_name"/>
+ <menu_item_check label="Сортировать по ÑтатуÑу" name="sort_status"/>
+ <menu_item_check label="Показывать значки" name="view_icons"/>
+ <menu_item_check label="Показывать разрешенные дейÑтвиÑ" name="view_permissions"/>
+ <menu_item_call label="Показать черный ÑпиÑок" name="show_blocked_list"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_people_groups.xml b/indra/newview/skins/default/xui/ru/menu_people_groups.xml
new file mode 100644
index 0000000000..e734a83ef0
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_people_groups.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_call label="ИнформациÑ" name="View Info"/>
+ <menu_item_call label="Чат" name="Chat"/>
+ <menu_item_call label="Звонок" name="Call"/>
+ <menu_item_call label="ÐктивациÑ" name="Activate"/>
+ <menu_item_call label="Покинуть" name="Leave"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_people_groups_view_sort.xml b/indra/newview/skins/default/xui/ru/menu_people_groups_view_sort.xml
new file mode 100644
index 0000000000..0358068db9
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_people_groups_view_sort.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_group_plus">
+ <menu_item_check label="Показывать значки группы" name="Display Group Icons"/>
+ <menu_item_call label="Покинуть выбранную группу" name="Leave Selected Group"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_people_nearby.xml b/indra/newview/skins/default/xui/ru/menu_people_nearby.xml
new file mode 100644
index 0000000000..ebce959044
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_people_nearby.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Avatar Context Menu">
+ <menu_item_call label="Смотреть профиль" name="View Profile"/>
+ <menu_item_call label="Ð’ друзьÑ" name="Add Friend"/>
+ <menu_item_call label="Удалить из друзей" name="Remove Friend"/>
+ <menu_item_call label="IM" name="IM"/>
+ <menu_item_call label="Звонок" name="Call"/>
+ <menu_item_call label="Карта" name="Map"/>
+ <menu_item_call label="ПоделитьÑÑ" name="Share"/>
+ <menu_item_call label="Заплатить" name="Pay"/>
+ <menu_item_check label="Черный ÑпиÑок" name="Block/Unblock"/>
+ <menu_item_call label="Предложить телепорт" name="teleport"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/ru/menu_people_nearby_multiselect.xml
new file mode 100644
index 0000000000..0e8e0d4053
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_people_nearby_multiselect.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Multi-Selected People Context Menu">
+ <menu_item_call label="Добавить в друзьÑ" name="Add Friends"/>
+ <menu_item_call label="Удалить из друзей" name="Remove Friend"/>
+ <menu_item_call label="IM" name="IM"/>
+ <menu_item_call label="Звонок" name="Call"/>
+ <menu_item_call label="ПоделитьÑÑ" name="Share"/>
+ <menu_item_call label="Заплатить" name="Pay"/>
+ <menu_item_call label="Предложить телепорт" name="teleport"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_people_nearby_view_sort.xml b/indra/newview/skins/default/xui/ru/menu_people_nearby_view_sort.xml
new file mode 100644
index 0000000000..4589815f6b
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_people_nearby_view_sort.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_group_plus">
+ <menu_item_check label="Сортировать по недавно говорившим" name="sort_by_recent_speakers"/>
+ <menu_item_check label="Сортировать по имени" name="sort_name"/>
+ <menu_item_check label="Сортировать по раÑÑтоÑнию" name="sort_distance"/>
+ <menu_item_check label="Показывать значки учаÑтников" name="view_icons"/>
+ <menu_item_check label="Смотреть карту" name="view_map"/>
+ <menu_item_call label="Показать черный ÑпиÑок жителей и объектов" name="show_blocked_list"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_people_recent_view_sort.xml b/indra/newview/skins/default/xui/ru/menu_people_recent_view_sort.xml
new file mode 100644
index 0000000000..2ac83ffe52
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_people_recent_view_sort.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_group_plus">
+ <menu_item_check label="Сортировать по времени" name="sort_most"/>
+ <menu_item_check label="Сортировать по имени" name="sort_name"/>
+ <menu_item_check label="Показывать значки людей" name="view_icons"/>
+ <menu_item_call label="Показать черный ÑпиÑок" name="show_blocked_list"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_picks.xml b/indra/newview/skins/default/xui/ru/menu_picks.xml
new file mode 100644
index 0000000000..839c7411a6
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_picks.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Picks">
+ <menu_item_call label="Данные" name="pick_info"/>
+ <menu_item_call label="Изменить" name="pick_edit"/>
+ <menu_item_call label="Телепорт" name="pick_teleport"/>
+ <menu_item_call label="Карта" name="pick_map"/>
+ <menu_item_call label="Удалить" name="pick_delete"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_picks_plus.xml b/indra/newview/skins/default/xui/ru/menu_picks_plus.xml
new file mode 100644
index 0000000000..1bc4078179
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_picks_plus.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="picks_plus_menu">
+ <menu_item_call label="ÐÐ¾Ð²Ð°Ñ Ð¿Ð¾Ð´Ð±Ð¾Ñ€ÐºÐ°" name="create_pick"/>
+ <menu_item_call label="ÐÐ¾Ð²Ð°Ñ Ñ€ÐµÐºÐ»Ð°Ð¼Ð°" name="create_classified"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_place.xml b/indra/newview/skins/default/xui/ru/menu_place.xml
new file mode 100644
index 0000000000..ee8878c131
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_place.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="place_overflow_menu">
+ <menu_item_call label="ПоÑтавить закладку" name="landmark"/>
+ <menu_item_call label="Создать подборку" name="pick"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_place_add_button.xml b/indra/newview/skins/default/xui/ru/menu_place_add_button.xml
new file mode 100644
index 0000000000..b1a38fb9eb
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_place_add_button.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_folder_gear">
+ <menu_item_call label="Добавить папку" name="add_folder"/>
+ <menu_item_call label="Добавить закладку" name="add_landmark"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/ru/menu_places_gear_folder.xml
new file mode 100644
index 0000000000..25df8c5d19
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_places_gear_folder.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_folder_gear">
+ <menu_item_call label="Добавить закладку" name="add_landmark"/>
+ <menu_item_call label="Добавить папку" name="add_folder"/>
+ <menu_item_call label="ВоÑÑтановить предмет" name="restore_item"/>
+ <menu_item_call label="Вырезать" name="cut"/>
+ <menu_item_call label="Копировать" name="copy_folder"/>
+ <menu_item_call label="Ð’Ñтавить" name="paste"/>
+ <menu_item_call label="Переименовать" name="rename"/>
+ <menu_item_call label="Удалить" name="delete"/>
+ <menu_item_call label="Открыть" name="expand"/>
+ <menu_item_call label="Закрыть" name="collapse"/>
+ <menu_item_call label="Открыть вÑе папки" name="expand_all"/>
+ <menu_item_call label="Закрыть вÑе папки" name="collapse_all"/>
+ <menu_item_check label="Сортировать по дате" name="sort_by_date"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/ru/menu_places_gear_landmark.xml
new file mode 100644
index 0000000000..b1ebd4af83
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_places_gear_landmark.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_ladmark_gear">
+ <menu_item_call label="Телепорт" name="teleport"/>
+ <menu_item_call label="Подробнее" name="more_info"/>
+ <menu_item_call label="Показать на карте" name="show_on_map"/>
+ <menu_item_call label="Добавить закладку" name="add_landmark"/>
+ <menu_item_call label="Добавить папку" name="add_folder"/>
+ <menu_item_call label="ВоÑÑтановить вещь" name="restore_item"/>
+ <menu_item_call label="Вырезать" name="cut"/>
+ <menu_item_call label="Копировать закладку" name="copy_landmark"/>
+ <menu_item_call label="Копировать URL SL" name="copy_slurl"/>
+ <menu_item_call label="Ð’Ñтавить" name="paste"/>
+ <menu_item_call label="Переименовать" name="rename"/>
+ <menu_item_call label="Удалить" name="delete"/>
+ <menu_item_call label="Развернуть вÑе папки" name="expand_all"/>
+ <menu_item_call label="Свернуть вÑе папки" name="collapse_all"/>
+ <menu_item_check label="Сортировать по дате" name="sort_by_date"/>
+ <menu_item_call label="Создать подборку" name="create_pick"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_profile_overflow.xml b/indra/newview/skins/default/xui/ru/menu_profile_overflow.xml
new file mode 100644
index 0000000000..1865fead7b
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_profile_overflow.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="profile_overflow_menu">
+ <menu_item_call label="Карта" name="show_on_map"/>
+ <menu_item_call label="Заплатить" name="pay"/>
+ <menu_item_call label="ПоделитьÑÑ" name="share"/>
+ <menu_item_call label="Заблокировать" name="block"/>
+ <menu_item_call label="Разблокировать" name="unblock"/>
+ <menu_item_call label="Выкинуть" name="kick"/>
+ <menu_item_call label="Заморозить" name="freeze"/>
+ <menu_item_call label="Разморозить" name="unfreeze"/>
+ <menu_item_call label="CSR" name="csr"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_save_outfit.xml b/indra/newview/skins/default/xui/ru/menu_save_outfit.xml
new file mode 100644
index 0000000000..88947e1433
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_save_outfit.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="save_outfit_menu">
+ <menu_item_call label="Сохранить" name="save_outfit"/>
+ <menu_item_call label="Сохранить как" name="save_as_new_outfit"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_script_chiclet.xml b/indra/newview/skins/default/xui/ru/menu_script_chiclet.xml
new file mode 100644
index 0000000000..6cacff3870
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_script_chiclet.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="ScriptChiclet Menu">
+ <menu_item_call label="Закрыть" name="Close"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_slurl.xml b/indra/newview/skins/default/xui/ru/menu_slurl.xml
new file mode 100644
index 0000000000..f02549055c
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_slurl.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="О ÑÑылке" name="about_url"/>
+ <menu_item_call label="ТелепортироватьÑÑ Ð¿Ð¾ ÑÑылке" name="teleport_to_url"/>
+ <menu_item_call label="Карта" name="show_on_map"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_teleport_history_gear.xml b/indra/newview/skins/default/xui/ru/menu_teleport_history_gear.xml
new file mode 100644
index 0000000000..332f2784b9
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_teleport_history_gear.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Teleport History Gear Context Menu">
+ <menu_item_call label="Открыть вÑе папки" name="Expand all folders"/>
+ <menu_item_call label="Закрыть вÑе папки" name="Collapse all folders"/>
+ <menu_item_call label="ОчиÑтить иÑторию телепортаций" name="Clear Teleport History"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_teleport_history_item.xml b/indra/newview/skins/default/xui/ru/menu_teleport_history_item.xml
new file mode 100644
index 0000000000..6a22fd00dc
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_teleport_history_item.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Teleport History Item Context Menu">
+ <menu_item_call label="Телепорт" name="Teleport"/>
+ <menu_item_call label="ИнформациÑ" name="More Information"/>
+ <menu_item_call label="Копировать в буфер обмена" name="CopyToClipboard"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_teleport_history_tab.xml b/indra/newview/skins/default/xui/ru/menu_teleport_history_tab.xml
new file mode 100644
index 0000000000..9b2434a310
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_teleport_history_tab.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Teleport History Item Context Menu">
+ <menu_item_call label="Открыть" name="TabOpen"/>
+ <menu_item_call label="Закрыть" name="TabClose"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_text_editor.xml b/indra/newview/skins/default/xui/ru/menu_text_editor.xml
new file mode 100644
index 0000000000..113dd85318
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_text_editor.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Text editor context menu">
+ <menu_item_call label="Вырезать" name="Cut"/>
+ <menu_item_call label="Копировать" name="Copy"/>
+ <menu_item_call label="Ð’Ñтавить" name="Paste"/>
+ <menu_item_call label="Удалить" name="Delete"/>
+ <menu_item_call label="Выделить вÑе" name="Select All"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_toolbars.xml b/indra/newview/skins/default/xui/ru/menu_toolbars.xml
new file mode 100644
index 0000000000..aa05dbc390
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_toolbars.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Toolbars Popup">
+ <menu_item_call label="Удалить Ñту кнопку" name="Remove button"/>
+ <menu_item_call label="Кнопки панели инÑтрументов..." name="Choose Buttons"/>
+ <menu_item_check label="Значки и подпиÑи" name="icons_with_text"/>
+ <menu_item_check label="Только значки" name="icons_only"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_topinfobar.xml b/indra/newview/skins/default/xui/ru/menu_topinfobar.xml
new file mode 100644
index 0000000000..76cadbe5a4
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_topinfobar.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_topinfobar">
+ <menu_item_check label="Показать координаты" name="Show Coordinates"/>
+ <menu_item_check label="Показать ÑвойÑтва учаÑтка" name="Show Parcel Properties"/>
+ <menu_item_call label="Закладка" name="Landmark"/>
+ <menu_item_call label="Копировать" name="Copy"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_url_agent.xml b/indra/newview/skins/default/xui/ru/menu_url_agent.xml
new file mode 100644
index 0000000000..0ba3ee152a
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_url_agent.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Показать профиль жителÑ" name="show_agent"/>
+ <menu_item_call label="Копировать название в буфер обмена" name="url_copy_label"/>
+ <menu_item_call label="Копировать URL-Ð°Ð´Ñ€ÐµÑ SL в буфер обмена" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_url_group.xml b/indra/newview/skins/default/xui/ru/menu_url_group.xml
new file mode 100644
index 0000000000..f25e2a7eb8
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_url_group.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Показать информацию группы" name="show_group"/>
+ <menu_item_call label="Копировать группу в буфер обмена" name="url_copy_label"/>
+ <menu_item_call label="Копировать URL-Ð°Ð´Ñ€ÐµÑ SL в буфер обмена" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_url_http.xml b/indra/newview/skins/default/xui/ru/menu_url_http.xml
new file mode 100644
index 0000000000..781211b16f
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_url_http.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Открыть веб-Ñтраницу" name="url_open"/>
+ <menu_item_call label="Открыть во внутреннем браузере" name="url_open_internal"/>
+ <menu_item_call label="Открыть во внешнем браузере" name="url_open_external"/>
+ <menu_item_call label="Копировать URL-Ð°Ð´Ñ€ÐµÑ Ð² буфер обмена" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_url_inventory.xml b/indra/newview/skins/default/xui/ru/menu_url_inventory.xml
new file mode 100644
index 0000000000..6127bf9868
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_url_inventory.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Показать вещь из инвентарÑ" name="show_item"/>
+ <menu_item_call label="Копировать название в буфер обмена" name="url_copy_label"/>
+ <menu_item_call label="Копировать URL-Ð°Ð´Ñ€ÐµÑ SL в буфер обмена" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_url_map.xml b/indra/newview/skins/default/xui/ru/menu_url_map.xml
new file mode 100644
index 0000000000..bbf64f20e9
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_url_map.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Показать на карте" name="show_on_map"/>
+ <menu_item_call label="Телепорт в меÑтоположение" name="teleport_to_location"/>
+ <menu_item_call label="Копировать URL-Ð°Ð´Ñ€ÐµÑ SL в буфер обмена" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_url_objectim.xml b/indra/newview/skins/default/xui/ru/menu_url_objectim.xml
new file mode 100644
index 0000000000..6e7800d3f5
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_url_objectim.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Показать информацию об объекте" name="show_object"/>
+ <menu_item_call label="Показать на карте" name="show_on_map"/>
+ <menu_item_call label="Телепорт в меÑтоположение объекта" name="teleport_to_object"/>
+ <menu_item_call label="Копировать название объекта в буфер обмена" name="url_copy_label"/>
+ <menu_item_call label="Копировать URL-Ð°Ð´Ñ€ÐµÑ SL в буфер обмена" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_url_parcel.xml b/indra/newview/skins/default/xui/ru/menu_url_parcel.xml
new file mode 100644
index 0000000000..84a679703a
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_url_parcel.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Показать информацию об учаÑтке" name="show_parcel"/>
+ <menu_item_call label="Показать на карте" name="show_on_map"/>
+ <menu_item_call label="Копировать URL-Ð°Ð´Ñ€ÐµÑ SL в буфер обмена" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_url_slapp.xml b/indra/newview/skins/default/xui/ru/menu_url_slapp.xml
new file mode 100644
index 0000000000..3d582ea2c5
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_url_slapp.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Выполнить команду" name="run_slapp"/>
+ <menu_item_call label="Копировать URL-Ð°Ð´Ñ€ÐµÑ SL в буфер обмена" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_url_slurl.xml b/indra/newview/skins/default/xui/ru/menu_url_slurl.xml
new file mode 100644
index 0000000000..cbceafea21
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_url_slurl.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Показать информацию о меÑте" name="show_place"/>
+ <menu_item_call label="Показать на карте" name="show_on_map"/>
+ <menu_item_call label="Телепорт в меÑтоположение" name="teleport_to_location"/>
+ <menu_item_call label="Копировать URL-Ð°Ð´Ñ€ÐµÑ SL в буфер обмена" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_url_teleport.xml b/indra/newview/skins/default/xui/ru/menu_url_teleport.xml
new file mode 100644
index 0000000000..2ecde09383
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_url_teleport.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Ð¢ÐµÐ»ÐµÐ¿Ð¾Ñ€Ñ‚Ð°Ñ†Ð¸Ñ Ð² Ñто меÑто" name="teleport"/>
+ <menu_item_call label="Показать на карте" name="show_on_map"/>
+ <menu_item_call label="Копировать URL-Ð°Ð´Ñ€ÐµÑ SL в буфер" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_viewer.xml b/indra/newview/skins/default/xui/ru/menu_viewer.xml
new file mode 100644
index 0000000000..0699314d97
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_viewer.xml
@@ -0,0 +1,459 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu_bar name="Main Menu">
+ <menu label="Я" name="Me">
+ <menu_item_call label="Профиль…" name="Profile"/>
+ <menu_item_call label="ВнешноÑÑ‚ÑŒ..." name="ChangeOutfit"/>
+ <menu_item_call label="Выберите аватар..." name="Avatar Picker"/>
+ <menu_item_check label="Инвентарь..." name="Inventory"/>
+ <menu_item_call label="Ðовое окно инвентарÑ" name="NewInventoryWindow"/>
+ <menu_item_call label="МеÑта..." name="Places"/>
+ <menu_item_call label="Подборка..." name="Picks"/>
+ <menu_item_call label="Управление камерой..." name="Camera Controls"/>
+ <menu label="Движение" name="Movement">
+ <menu_item_call label="СеÑÑ‚ÑŒ" name="Sit Down Here"/>
+ <menu_item_check label="Полет" name="Fly"/>
+ <menu_item_check label="Ð’Ñегда бегать" name="Always Run"/>
+ <menu_item_call label="ОÑтановить анимацию" name="Stop Animating My Avatar"/>
+ <menu_item_call label="Ходьба / бег / полет..." name="Walk / run / fly"/>
+ </menu>
+ <menu label="СтатуÑ" name="Status">
+ <menu_item_call label="Ðет на меÑте" name="Set Away"/>
+ <menu_item_call label="Ðе беÑпокоить" name="Set Busy"/>
+ </menu>
+ <menu_item_call label="Купить L$..." name="Buy and Sell L$"/>
+ <menu_item_call label="Торговые иÑходÑщие..." name="MerchantOutbox"/>
+ <menu_item_call label="Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ð¾Ð½Ð½Ð°Ñ Ð¿Ð°Ð½ÐµÐ»ÑŒ аккаунта..." name="Manage My Account"/>
+ <menu_item_call label="ÐаÑтройки..." name="Preferences"/>
+ <menu_item_call label="Кнопки панели инÑтрументов..." name="Toolbars"/>
+ <menu_item_call label="Скрыть вÑе Ñлементы управлениÑ" name="Hide UI"/>
+ <menu_item_call label="Выход из [APP_NAME]" name="Quit"/>
+ </menu>
+ <menu label="Общение" name="Communicate">
+ <menu_item_check label="Чат..." name="Nearby Chat"/>
+ <menu_item_check label="Говорить" name="Speak"/>
+ <menu_item_check label="ÐаÑтройки голоÑа..." name="Nearby Voice"/>
+ <menu_item_check label="Изменение голоÑа..." name="ShowVoice"/>
+ <menu_item_check label="ЖеÑÑ‚Ñ‹..." name="Gestures"/>
+ <menu_item_call label="ДрузьÑ" name="My Friends"/>
+ <menu_item_call label="Группы" name="My Groups"/>
+ <menu_item_call label="Люди неподалеку" name="Active Speakers"/>
+ </menu>
+ <menu label="Мир" name="World">
+ <menu_item_call label="Добавить закладку на Ñто меÑто" name="Create Landmark Here"/>
+ <menu_item_call label="Пункты..." name="Destinations"/>
+ <menu_item_check label="Карта мира" name="World Map"/>
+ <menu_item_check label="Миникарта" name="Mini-Map"/>
+ <menu_item_check label="ПоиÑк" name="Search"/>
+ <menu_item_call label="Ð¢ÐµÐ»ÐµÐ¿Ð¾Ñ€Ñ‚Ð°Ñ†Ð¸Ñ Ð´Ð¾Ð¼Ð¾Ð¹" name="Teleport Home"/>
+ <menu_item_call label="УÑтановить дом здеÑÑŒ" name="Set Home to Here"/>
+ <menu_item_call label="Снимок" name="Take Snapshot"/>
+ <menu_item_call label="Профиль меÑта" name="Place Profile"/>
+ <menu_item_call label="О земле" name="About Land"/>
+ <menu_item_call label="Регион/землевладение" name="Region/Estate"/>
+ <menu_item_call label="Мои владениÑ..." name="My Land"/>
+ <menu_item_call label="Купить Ñту землю" name="Buy Land"/>
+ <menu label="Показать" name="LandShow">
+ <menu_item_check label="Линии запрета" name="Ban Lines"/>
+ <menu_item_check label="Метки" name="beacons"/>
+ <menu_item_check label="Границы ÑобÑтвенноÑти" name="Property Lines"/>
+ <menu_item_check label="Владельцы земли" name="Land Owners"/>
+ <menu_item_check label="Координаты" name="Coordinates"/>
+ <menu_item_check label="СвойÑтва учаÑтка" name="Parcel Properties"/>
+ <menu_item_check label="Меню «Дополнительно»" name="Show Advanced Menu"/>
+ </menu>
+ <menu label="Солнце" name="Sun">
+ <menu_item_call label="ВоÑход" name="Sunrise"/>
+ <menu_item_call label="Полдень" name="Noon"/>
+ <menu_item_call label="Закат" name="Sunset"/>
+ <menu_item_call label="Полночь" name="Midnight"/>
+ <menu_item_call label="ИÑпользовать наÑтройки региона" name="Use Region Settings"/>
+ </menu>
+ <menu label="Редактор Ñреды" name="Environment Editor">
+ <menu_item_call label="ÐаÑтройки Ñреды..." name="Environment Settings"/>
+ <menu label="ÐаÑтройки воды" name="Water Presets">
+ <menu_item_call label="Создать наÑтройку..." name="new_water_preset"/>
+ <menu_item_call label="Изменить наÑтройку..." name="edit_water_preset"/>
+ <menu_item_call label="Удалить наÑтройку..." name="delete_water_preset"/>
+ </menu>
+ <menu label="ÐаÑтройки неба" name="Sky Presets">
+ <menu_item_call label="Создать наÑтройку..." name="new_sky_preset"/>
+ <menu_item_call label="Изменить наÑтройку..." name="edit_sky_preset"/>
+ <menu_item_call label="Удалить наÑтройку..." name="delete_sky_preset"/>
+ </menu>
+ <menu label="Суточные наÑтройки" name="Day Presets">
+ <menu_item_call label="Создать наÑтройку..." name="new_day_preset"/>
+ <menu_item_call label="Изменить наÑтройку..." name="edit_day_preset"/>
+ <menu_item_call label="Удалить наÑтройку..." name="delete_day_preset"/>
+ </menu>
+ </menu>
+ </menu>
+ <menu label="СтроительÑтво" name="BuildTools">
+ <menu_item_check label="СтроительÑтво" name="Show Build Tools"/>
+ <menu label="Выбрать инÑтрументы" name="Select Tool">
+ <menu_item_call label="ФокуÑ" name="Focus"/>
+ <menu_item_call label="Перемещение" name="Move"/>
+ <menu_item_call label="Редактирование" name="Edit"/>
+ <menu_item_call label="Создание" name="Create"/>
+ <menu_item_call label="ЗемлÑ" name="Land"/>
+ </menu>
+ <menu_item_call label="Объединить" name="Link"/>
+ <menu_item_call label="Разъединить" name="Unlink"/>
+ <menu_item_check label="Редактировать объединенные чаÑти" name="Edit Linked Parts"/>
+ <menu label="Выбрать объединенные чаÑти" name="Select Linked Parts">
+ <menu_item_call label="Выбрать Ñледующую" name="Select Next Part"/>
+ <menu_item_call label="Выбрать предыдущую" name="Select Previous Part"/>
+ <menu_item_call label="Включить Ñледующую" name="Include Next Part"/>
+ <menu_item_call label="Включить предыдущую" name="Include Previous Part"/>
+ </menu>
+ <menu_item_call label="Ð¤Ð¾ÐºÑƒÑ Ð½Ð° выбранном" name="Focus on Selection"/>
+ <menu_item_call label="Приблизить к выбранному" name="Zoom to Selection"/>
+ <menu label="Объект" name="Object">
+ <menu_item_call label="Купить" name="Menu Object Buy"/>
+ <menu_item_call label="ВзÑÑ‚ÑŒ" name="Menu Object Take"/>
+ <menu_item_call label="ВзÑÑ‚ÑŒ копию" name="Take Copy"/>
+ <menu_item_call label="Сохранить в моем инвентаре" name="Save Object Back to My Inventory"/>
+ <menu_item_call label="Сохранить в контенте объектов" name="Save Object Back to Object Contents"/>
+ <menu_item_call label="Вернуть объект" name="Return Object back to Owner"/>
+ </menu>
+ <menu label="Скрипты" name="Scripts">
+ <menu_item_call label="Перекомпилировать Ñкрипты (Mono)" name="Mono"/>
+ <menu_item_call label="Перекомпилировать Ñкрипты (LSL)" name="LSL"/>
+ <menu_item_call label="Ð¡Ð±Ñ€Ð¾Ñ Ñкриптов" name="Reset Scripts"/>
+ <menu_item_call label="ЗапуÑтить Ñкрипты" name="Set Scripts to Running"/>
+ <menu_item_call label="ОÑтановить Ñкрипты" name="Set Scripts to Not Running"/>
+ </menu>
+ <menu label="Параметры" name="Options">
+ <menu_item_check label="Показать раÑширенные разрешениÑ" name="DebugPermissions"/>
+ <menu_item_check label="Выбирать только мои объекты" name="Select Only My Objects"/>
+ <menu_item_check label="Выбирать только перемещаемые объекты" name="Select Only Movable Objects"/>
+ <menu_item_check label="Выбор близлежащих" name="Select By Surrounding"/>
+ <menu_item_check label="ВыделÑÑ‚ÑŒ контуры выбранного" name="Show Selection Outlines"/>
+ <menu_item_check label="Показывать Ñкрытые выбранные объекты" name="Show Hidden Selection"/>
+ <menu_item_check label="Показать Ñ€Ð°Ð´Ð¸ÑƒÑ Ð¾ÑÐ²ÐµÑ‰ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ñ‹Ñ…" name="Show Light Radius for Selection"/>
+ <menu_item_check label="Показать луч выбора" name="Show Selection Beam"/>
+ <menu_item_check label="ПривÑзка к Ñетке" name="Snap to Grid"/>
+ <menu_item_call label="Сдвиг к ближайшему узлу XY Ñетки" name="Snap Object XY to Grid"/>
+ <menu_item_call label="ИÑпользовать выбранное Ð´Ð»Ñ Ñетки" name="Use Selection for Grid"/>
+ <menu_item_call label="Параметры Ñетки" name="Grid Options"/>
+ </menu>
+ <menu label="Передача" name="Upload">
+ <menu_item_call label="Изображение (L$[COST])..." name="Upload Image"/>
+ <menu_item_call label="Звук (L$[COST])..." name="Upload Sound"/>
+ <menu_item_call label="ÐÐ½Ð¸Ð¼Ð°Ñ†Ð¸Ñ (L$[COST])..." name="Upload Animation"/>
+ <menu_item_call label="Модель..." name="Upload Model"/>
+ <menu_item_call label="Ð’Ñе Ñразу (L$[COST] за файл)..." name="Bulk Upload"/>
+ <menu_item_call label="УÑтановить Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð½Ð° передачу по умолчанию" name="perm prefs"/>
+ </menu>
+ <menu_item_call label="Отменить" name="Undo"/>
+ <menu_item_call label="Вернуть" name="Redo"/>
+ </menu>
+ <menu label="Справка" name="Help">
+ <menu_item_call label="ИнÑтрукции..." name="How To"/>
+ <menu_item_call label="Справка по [SECOND_LIFE]" name="Second Life Help"/>
+ <menu_item_call label="Жалоба" name="Report Abuse"/>
+ <menu_item_call label="Сообщить об ошибке" name="Report Bug"/>
+ <menu_item_call label="О [APP_NAME]" name="About Second Life"/>
+ </menu>
+ <menu label="Дополнительно" name="Advanced">
+ <menu_item_call label="Обновить текÑтуры" name="Rebake Texture"/>
+ <menu_item_call label="СброÑить размер интерфейÑа" name="Set UI Size to Default"/>
+ <menu_item_call label="Задать размер окна..." name="Set Window Size..."/>
+ <menu_item_check label="Ограничение раÑÑтоÑÐ½Ð¸Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð°" name="Limit Select Distance"/>
+ <menu_item_check label="Отключить ограничение камеры" name="Disable Camera Distance"/>
+ <menu_item_check label="Снимок выÑокого разрешениÑ" name="HighResSnapshot"/>
+ <menu_item_check label="Тихое Ñоздание Ñнимка" name="QuietSnapshotsToDisk"/>
+ <menu label="ПроизводительноÑÑ‚ÑŒ" name="Performance Tools">
+ <menu_item_call label="Запаздывание" name="Lag Meter"/>
+ <menu_item_check label="СтатиÑтика" name="Statistics Bar"/>
+ <menu_item_check label="Показать Ð²ÐµÑ Ð¾Ñ‚Ñ€Ð¸Ñовки Ð´Ð»Ñ Ð°Ð²Ð°Ñ‚Ð°Ñ€Ð¾Ð²" name="Avatar Rendering Cost"/>
+ </menu>
+ <menu label="ПодÑветка и видимоÑÑ‚ÑŒ" name="Highlighting and Visibility">
+ <menu_item_check label="Мигающий маÑк" name="Cheesy Beacon"/>
+ <menu_item_check label="Скрыть чаÑтицы" name="Hide Particles"/>
+ <menu_item_check label="Скрыть выбранное" name="Hide Selected"/>
+ <menu_item_check label="ПодÑветка прозрачного" name="Highlight Transparent"/>
+ <menu_item_check label="Показывать приÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ HUD" name="Show HUD Attachments"/>
+ <menu_item_check label="Показывать прицел при обзоре мышью" name="ShowCrosshairs"/>
+ </menu>
+ <menu label="Типы визуализации" name="Rendering Types">
+ <menu_item_check label="ПроÑтой" name="Rendering Type Simple"/>
+ <menu_item_check label="Ðльфа" name="Rendering Type Alpha"/>
+ <menu_item_check label="Дерево" name="Rendering Type Tree"/>
+ <menu_item_check label="Ðватары" name="Rendering Type Character"/>
+ <menu_item_check label="ИÑправление поверхноÑти" name="Rendering Type Surface Patch"/>
+ <menu_item_check label="Ðебо" name="Rendering Type Sky"/>
+ <menu_item_check label="Вода" name="Rendering Type Water"/>
+ <menu_item_check label="ЗемлÑ" name="Rendering Type Ground"/>
+ <menu_item_check label="Объем" name="Rendering Type Volume"/>
+ <menu_item_check label="Трава" name="Rendering Type Grass"/>
+ <menu_item_check label="Облака" name="Rendering Type Clouds"/>
+ <menu_item_check label="ЧаÑтицы" name="Rendering Type Particles"/>
+ <menu_item_check label="Рельефное" name="Rendering Type Bump"/>
+ </menu>
+ <menu label="Функции визуализации" name="Rendering Features">
+ <menu_item_check label="Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ" name="ToggleUI"/>
+ <menu_item_check label="Выбрано" name="Selected"/>
+ <menu_item_check label="Выделено" name="Highlighted"/>
+ <menu_item_check label="ДинамичеÑкие текÑтуры" name="Dynamic Textures"/>
+ <menu_item_check label="Тени от ног" name="Foot Shadows"/>
+ <menu_item_check label="Туман" name="Fog"/>
+ <menu_item_check label="Проверить данные FR" name="Test FRInfo"/>
+ <menu_item_check label="Гибкие объекты" name="Flexible Objects"/>
+ </menu>
+ <menu_item_check label="ИÑпользовать поток Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡Ð°ÐµÐ¼Ñ‹Ñ… модулей" name="Use Plugin Read Thread"/>
+ <menu_item_call label="ОчиÑтить кÑш группы" name="ClearGroupCache"/>
+ <menu_item_check label="Сглаживание мышью" name="Mouse Smoothing"/>
+ <menu_item_call label="ОÑвободить клавиши" name="Release Keys"/>
+ <menu label="ГорÑчие клавиши" name="Shortcuts">
+ <menu_item_check label="Показать меню «Дополнительно» - Ñтарое Ñочетание клавиш" name="Show Advanced Menu - legacy shortcut"/>
+ <menu_item_call label="Закрыть окно" name="Close Window"/>
+ <menu_item_call label="Закрыть вÑе окна" name="Close All Windows"/>
+ <menu_item_call label="Сохранить Ñнимок на диÑке" name="Snapshot to Disk"/>
+ <menu_item_call label="Обзор мышью" name="Mouselook"/>
+ <menu_item_check label="Обзор джойÑтиком" name="Joystick Flycam"/>
+ <menu_item_call label="Ð¡Ð±Ñ€Ð¾Ñ Ð¾Ð±Ð·Ð¾Ñ€Ð°" name="Reset View"/>
+ <menu_item_call label="Смотреть на поÑледнего говорившего" name="Look at Last Chatter"/>
+ <menu_item_call label="Приблизить" name="Zoom In"/>
+ <menu_item_call label="Стандартный маÑштаб" name="Zoom Default"/>
+ <menu_item_call label="Отодвинуть" name="Zoom Out"/>
+ </menu>
+ <menu_item_call label="Отладочные наÑтройки" name="Debug Settings"/>
+ <menu_item_check label="Показать меню разработчика" name="Debug Mode"/>
+ </menu>
+ <menu label="Разработка" name="Develop">
+ <menu label="КонÑоли" name="Consoles">
+ <menu_item_check label="КонÑоль текÑтур" name="Texture Console"/>
+ <menu_item_check label="КонÑоль отладки" name="Debug Console"/>
+ <menu_item_call label="КонÑоль уведомлений" name="Notifications"/>
+ <menu_item_check label="КонÑоль размера текÑтуры" name="Texture Size"/>
+ <menu_item_check label="КонÑоль категории текÑтуры" name="Texture Category"/>
+ <menu_item_check label="Оперативные таймеры" name="Fast Timers"/>
+ <menu_item_check label="ПамÑÑ‚ÑŒ" name="Memory"/>
+ <menu_item_check label="СтатиÑтика по Ñцене" name="Scene Statistics"/>
+ <menu_item_call label="Данные о регионе на конÑоль отладки" name="Region Info to Debug Console"/>
+ <menu_item_call label="Данны о группе на конÑоль отладки" name="Group Info to Debug Console"/>
+ <menu_item_call label="Данные о ÑпоÑобноÑÑ‚ÑÑ… на конÑоль отладки" name="Capabilities Info to Debug Console"/>
+ <menu_item_check label="Камера" name="Camera"/>
+ <menu_item_check label="Ветер" name="Wind"/>
+ <menu_item_check label="Угол обзора" name="FOV"/>
+ <menu_item_check label="Значок" name="Badge"/>
+ </menu>
+ <menu label="Показать данные" name="Display Info">
+ <menu_item_check label="Показать времÑ" name="Show Time"/>
+ <menu_item_check label="Показывать цену передачи" name="Show Upload Cost"/>
+ <menu_item_check label="Показать данные по отриÑовке" name="Show Render Info"/>
+ <menu_item_check label="Показать данные о текÑтурах" name="Show Texture Info"/>
+ <menu_item_check label="Показать матрицы" name="Show Matrices"/>
+ <menu_item_check label="Показать цвет под курÑором" name="Show Color Under Cursor"/>
+ <menu_item_check label="Показать памÑÑ‚ÑŒ" name="Show Memory"/>
+ <menu_item_check label="Показать закрытые данные о памÑти" name="Show Private Mem Info"/>
+ <menu_item_check label="Показать Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð¾Ð²" name="Show Updates"/>
+ </menu>
+ <menu label="Принудительно вызвать ошибку" name="Force Errors">
+ <menu_item_call label="Принудительно перейти в точку оÑтанова" name="Force Breakpoint"/>
+ <menu_item_call label="Принудительно вызвать ошибку LL и Ñбой" name="Force LLError And Crash"/>
+ <menu_item_call label="Принудительный неправильный доÑтуп к памÑти" name="Force Bad Memory Access"/>
+ <menu_item_call label="Принудительное зацикливание" name="Force Infinite Loop"/>
+ <menu_item_call label="Принудительный Ñбой драйвера" name="Force Driver Carsh"/>
+ <menu_item_call label="Принудительное иÑключение" name="Force Software Exception"/>
+ <menu_item_call label="Принудительно отключить клиент" name="Force Disconnect Viewer"/>
+ <menu_item_call label="Имитировать утечку памÑти" name="Memory Leaking Simulation"/>
+ </menu>
+ <menu label="ТеÑÑ‚Ñ‹ визуализации" name="Render Tests">
+ <menu_item_check label="Сдвиг камеры" name="Camera Offset"/>
+ <menu_item_check label="Ð¡Ð»ÑƒÑ‡Ð°Ð¹Ð½Ð°Ñ Ñ‡Ð°Ñтота кадров" name="Randomize Framerate"/>
+ <menu_item_check label="ПериодичеÑкое замедление кадров" name="Periodic Slow Frame"/>
+ <menu_item_check label="ТеÑÑ‚ кадров" name="Frame Test"/>
+ </menu>
+ <menu label="Визуализировать метаданные" name="Render Metadata">
+ <menu_item_check label="Рамки" name="Bounding Boxes"/>
+ <menu_item_check label="Ðормали" name="Normals"/>
+ <menu_item_check label="Октадерево" name="Octree"/>
+ <menu_item_check label="Тень от уÑеченной пирамиды" name="Shadow Frusta"/>
+ <menu_item_check label="ФизичеÑкие формы" name="Physics Shapes"/>
+ <menu_item_check label="Смыкание" name="Occlusion"/>
+ <menu_item_check label="Ð’Ð¸Ð·ÑƒÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¿Ð¾Ñ€Ñ†Ð¸Ñми" name="Render Batches"/>
+ <menu_item_check label="Тип обновлениÑ" name="Update Type"/>
+ <menu_item_check label="ÐÐ½Ð¸Ð¼Ð°Ñ†Ð¸Ñ Ñ‚ÐµÐºÑтуры" name="Texture Anim"/>
+ <menu_item_check label="Приоритет текÑтуры" name="Texture Priority"/>
+ <menu_item_check label="Площадь текÑтуры" name="Texture Area"/>
+ <menu_item_check label="Площадь грани" name="Face Area"/>
+ <menu_item_check label="Данные об уровнÑÑ… детализации" name="LOD Info"/>
+ <menu_item_check label="Очередь поÑтроителÑ" name="Build Queue"/>
+ <menu_item_check label="ОÑвещение" name="Lights"/>
+ <menu_item_check label="ÐšÐ°Ñ€ÐºÐ°Ñ Ñтолкновений" name="Collision Skeleton"/>
+ <menu_item_check label="Лучи" name="Raycast"/>
+ <menu_item_check label="ÐÐ°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð²ÐµÑ‚Ñ€Ð°" name="Wind Vectors"/>
+ <menu_item_check label="СложноÑÑ‚ÑŒ визуализации" name="rendercomplexity"/>
+ <menu_item_check label="Байты приÑоединениÑ" name="attachment bytes"/>
+ <menu_item_check label="Лепка" name="Sculpt"/>
+ </menu>
+ <menu label="ВизуализациÑ" name="Rendering">
+ <menu_item_check label="ОÑи" name="Axes"/>
+ <menu_item_check label="КаÑательный базиÑ" name="Tangent Basis"/>
+ <menu_item_call label="Ð’Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð°Ñ Ñ‚ÐµÐºÑтура в оÑнове" name="Selected Texture Info Basis"/>
+ <menu_item_check label="КаркаÑ" name="Wireframe"/>
+ <menu_item_check label="Смыкание объектов" name="Object-Object Occlusion"/>
+ <menu_item_check label="ОÑвещение и тени" name="Lighting and Shadows"/>
+ <menu_item_check label="Тени от Ñолнца, луны и прожекторов" name="Shadows from Sun/Moon/Projectors"/>
+ <menu_item_check label="SSAO и Ñглаживание теней" name="SSAO and Shadow Smoothing"/>
+ <menu_item_check label="Отладка GL" name="Debug GL"/>
+ <menu_item_check label="Отладка конвейера" name="Debug Pipeline"/>
+ <menu_item_check label="ÐвтоматичеÑкие альфа-маÑки (отложенные)" name="Automatic Alpha Masks (deferred)"/>
+ <menu_item_check label="ÐвтоматичеÑкие альфа-маÑки (не отложенные)" name="Automatic Alpha Masks (non-deferred)"/>
+ <menu_item_check label="ТекÑтуры анимаций" name="Animation Textures"/>
+ <menu_item_check label="Отключить текÑтуры" name="Disable Textures"/>
+ <menu_item_check label="ТекÑтуры в полном разрешении" name="Rull Res Textures"/>
+ <menu_item_check label="Проверить текÑтуры" name="Audit Textures"/>
+ <menu_item_check label="ÐÑ‚Ð»Ð°Ñ Ñ‚ÐµÐºÑтур (ÑкÑÐ¿ÐµÑ€Ð¸Ð¼ÐµÐ½Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ)" name="Texture Atlas"/>
+ <menu_item_check label="Ð’Ð¸Ð·ÑƒÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¿Ñ€Ð¸Ñоединенных иÑточников Ñвета" name="Render Attached Lights"/>
+ <menu_item_check label="Ð’Ð¸Ð·ÑƒÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¿Ñ€Ð¸Ñоединенных чаÑтиц" name="Render Attached Particles"/>
+ <menu_item_check label="ПарÑщие ÑветÑщиеÑÑ Ð¾Ð±ÑŠÐµÐºÑ‚Ñ‹" name="Hover Glow Objects"/>
+ </menu>
+ <menu label="Сеть" name="Network">
+ <menu_item_check label="ПриоÑтановить клиент" name="AgentPause"/>
+ <menu_item_call label="Включить журнал Ñообщений" name="Enable Message Log"/>
+ <menu_item_call label="Отключить журнал Ñообщений" name="Disable Message Log"/>
+ <menu_item_check label="СкороÑÑ‚ÑŒ интерполÑции объектов" name="Velocity Interpolate Objects"/>
+ <menu_item_check label="Прикрепить объекты Ð´Ð»Ñ Ð¸Ð½Ñ‚ÐµÑ€Ð¿Ð¾Ð»Ñции" name="Ping Interpolate Object Positions"/>
+ <menu_item_call label="ОпуÑтить пакет" name="Drop a Packet"/>
+ </menu>
+ <menu_item_call label="Дамп камеры Ñо Ñкриптами" name="Dump Scripted Camera"/>
+ <menu_item_call label="СтолкновениÑ, толчки и удары" name="Bumps, Pushes &amp;amp; Hits"/>
+ <menu label="Диктофон" name="Recorder">
+ <menu_item_call label="Ðачать воÑпроизведение" name="Start Playback"/>
+ <menu_item_call label="ОÑтановить воÑпроизведение" name="Stop Playback"/>
+ <menu_item_check label="Зациклить воÑпроизведение" name="Loop Playback"/>
+ <menu_item_call label="Ðачать запиÑÑŒ" name="Start Record"/>
+ <menu_item_call label="ОÑтановить запиÑÑŒ" name="Stop Record"/>
+ </menu>
+ <menu label="Мир" name="DevelopWorld">
+ <menu_item_check label="Перекрытие Ñолнца в ÑимулÑторе" name="Sim Sun Override"/>
+ <menu_item_check label="ÐÐµÐ¸Ð·Ð¼ÐµÐ½Ð½Ð°Ñ Ð¿Ð¾Ð³Ð¾Ð´Ð°" name="Fixed Weather"/>
+ <menu_item_call label="Вывод кÑша региональных объектов" name="Dump Region Object Cache"/>
+ </menu>
+ <menu label="Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ" name="UI">
+ <menu_item_call label="Проверка медиабраузера" name="Web Browser Test"/>
+ <menu_item_call label="Браузер Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра веб-контента" name="Web Content Browser"/>
+ <menu_item_call label="Вывод SelectMgr" name="Dump SelectMgr"/>
+ <menu_item_call label="Вывод инвентарÑ" name="Dump Inventory"/>
+ <menu_item_call label="Вывод таймеров" name="Dump Timers"/>
+ <menu_item_call label="Вывод ÑредÑтва фокуÑировки" name="Dump Focus Holder"/>
+ <menu_item_call label="Печать информации о выбранных объектах" name="Print Selected Object Info"/>
+ <menu_item_call label="Печать информации об агенте" name="Print Agent Info"/>
+ <menu_item_call label="СтатиÑтичеÑÐºÐ°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ памÑти" name="Memory Stats"/>
+ <menu_item_check label="КонÑоль отладки региона" name="Region Debug Console"/>
+ <menu_item_check label="Отладка SelectMgr" name="Debug SelectMgr"/>
+ <menu_item_check label="Отладка щелчков мышью" name="Debug Clicks"/>
+ <menu_item_check label="Отладка обзора" name="Debug Views"/>
+ <menu_item_check label="Отладка контекÑтных окон к названиÑм" name="Debug Name Tooltips"/>
+ <menu_item_check label="Отладка выполнÑемых Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ мыши дейÑтвий" name="Debug Mouse Events"/>
+ <menu_item_check label="Отладка клавиш" name="Debug Keys"/>
+ <menu_item_check label="Отладка WindowProc" name="Debug WindowProc"/>
+ </menu>
+ <menu label="XUI" name="XUI">
+ <menu_item_call label="Обновить наÑтройки цветов" name="Reload Color Settings"/>
+ <menu_item_call label="Показать проверку шрифтов" name="Show Font Test"/>
+ <menu_item_check label="Показать имена XUI" name="Show XUI Names"/>
+ <menu_item_call label="Отправить теÑтовое Ñообщение" name="Send Test IMs"/>
+ <menu_item_call label="ОчиÑтить кÑши имен" name="Flush Names Caches"/>
+ </menu>
+ <menu label="Ðватар" name="Character">
+ <menu label="Захват запеченных текÑтур" name="Grab Baked Texture">
+ <menu_item_call label="Радужка" name="Grab Iris"/>
+ <menu_item_call label="Голова" name="Grab Head"/>
+ <menu_item_call label="ВерхнÑÑ Ñ‡Ð°ÑÑ‚ÑŒ тела" name="Grab Upper Body"/>
+ <menu_item_call label="ÐижнÑÑ Ñ‡Ð°ÑÑ‚ÑŒ тела" name="Grab Lower Body"/>
+ <menu_item_call label="Юбка" name="Grab Skirt"/>
+ </menu>
+ <menu label="Проверка перÑонажа" name="Character Tests">
+ <menu_item_call label="Внешний вид в XML" name="Appearance To XML"/>
+ <menu_item_call label="Ðктивировать геометрию перÑонажа" name="Toggle Character Geometry"/>
+ <menu_item_call label="Проверка мужчины" name="Test Male"/>
+ <menu_item_call label="Проверка женщины" name="Test Female"/>
+ <menu_item_call label="Ðктивировать PG-контент" name="Toggle PG"/>
+ <menu_item_check label="Разрешить выбор аватара" name="Allow Select Avatar"/>
+ </menu>
+ <menu_item_call label="Скинуть параметры" name="Force Params to Default"/>
+ <menu_item_check label="Данные об анимации" name="Animation Info"/>
+ <menu_item_check label="ÐÐ½Ð¸Ð¼Ð°Ñ†Ð¸Ñ Ð¼ÐµÐ´Ð»ÐµÐ½Ð½Ñ‹Ñ… движений" name="Slow Motion Animations"/>
+ <menu_item_check label="Показать взглÑд" name="Show Look At"/>
+ <menu_item_check label="Показать указание" name="Show Point At"/>
+ <menu_item_check label="Отладка обновленных движений ÑуÑтавов" name="Debug Joint Updates"/>
+ <menu_item_check label="Отключить детализацию" name="Disable LOD"/>
+ <menu_item_check label="Отладка видимоÑти перÑонажа" name="Debug Character Vis"/>
+ <menu_item_check label="Показать Ñкелет" name="Show Collision Skeleton"/>
+ <menu_item_check label="Отобразить дейÑтвие агента" name="Display Agent Target"/>
+ --&gt;
+ <menu_item_call label="Вывод приÑоединений" name="Dump Attachments"/>
+ <menu_item_call label="Отладка текÑтур аватара" name="Debug Avatar Textures"/>
+ <menu_item_call label="Вывод локальных текÑтур" name="Dump Local Textures"/>
+ </menu>
+ <menu_item_check label="ТекÑтуры HTTP" name="HTTP Textures"/>
+ <menu_item_check label="Инвентарь HTTP" name="HTTP Inventory"/>
+ <menu_item_call label="Сжатие изображений" name="Compress Images"/>
+ <menu_item_call label="Включить Visual Leak Detector" name="Enable Visual Leak Detector"/>
+ <menu_item_check label="Вывод минидампа при отладке" name="Output Debug Minidump"/>
+ <menu_item_check label="Окно конÑоли при Ñледующем запуÑке" name="Console Window"/>
+ <menu label="Уровень журнала" name="Set Logging Level">
+ <menu_item_check label="Отладка" name="Debug"/>
+ <menu_item_check label="ИнформациÑ" name="Info"/>
+ <menu_item_check label="Предупреждение" name="Warning"/>
+ <menu_item_check label="Ошибка" name="Error"/>
+ <menu_item_check label="Ðет" name="None"/>
+ </menu>
+ <menu_item_call label="Ð—Ð°Ð¿Ñ€Ð¾Ñ ÑтатуÑа админиÑтратора" name="Request Admin Options"/>
+ <menu_item_call label="Выход из ÑтатуÑа админиÑтратора" name="Leave Admin Options"/>
+ <menu_item_check label="Показать меню админиÑтратора" name="View Admin Options"/>
+ </menu>
+ <menu label="ÐдминиÑтратор" name="Admin">
+ <menu label="Объект" name="AdminObject">
+ <menu_item_call label="Сделать копию" name="Admin Take Copy"/>
+ <menu_item_call label="Ðазначить Ð¼ÐµÐ½Ñ Ð²Ð»Ð°Ð´ÐµÐ»ÑŒÑ†ÐµÐ¼" name="Force Owner To Me"/>
+ <menu_item_call label="Ðазначить полноправным владельцем" name="Force Owner Permissive"/>
+ <menu_item_call label="Удалить" name="Delete"/>
+ <menu_item_call label="Ðа меÑте" name="Lock"/>
+ <menu_item_call label="Получить ID активов" name="Get Assets IDs"/>
+ </menu>
+ <menu label="УчаÑток" name="Parcel">
+ <menu_item_call label="Ðазначить ÑÐµÐ±Ñ Ð²Ð»Ð°Ð´ÐµÐ»ÑŒÑ†ÐµÐ¼" name="Owner To Me"/>
+ <menu_item_call label="Задать Ð´Ð»Ñ ÐºÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð° Linden" name="Set to Linden Content"/>
+ <menu_item_call label="ÐŸÑ€ÐµÑ‚ÐµÐ½Ð·Ð¸Ñ Ð½Ð° публичную землю" name="Claim Public Land"/>
+ </menu>
+ <menu label="Регион" name="Region">
+ <menu_item_call label="Вывод временных данных актива" name="Dump Temp Asset Data"/>
+ <menu_item_call label="Сохранить ÑоÑтоÑние региона" name="Save Region State"/>
+ </menu>
+ <menu_item_call label="ИнÑтрументы творца" name="God Tools"/>
+ </menu>
+ <menu label="ÐдминиÑтратор" name="Deprecated">
+ <menu label="ПриÑоединить объект" name="Attach Object"/>
+ <menu label="ОтÑоединить объект" name="Detach Object"/>
+ <menu label="СнÑÑ‚ÑŒ одежду" name="Take Off Clothing">
+ <menu_item_call label="Рубашка" name="Shirt"/>
+ <menu_item_call label="Брюки" name="Pants"/>
+ <menu_item_call label="Обувь" name="Shoes"/>
+ <menu_item_call label="ÐоÑки" name="Socks"/>
+ <menu_item_call label="Пиджак" name="Jacket"/>
+ <menu_item_call label="Перчатки" name="Gloves"/>
+ <menu_item_call label="Майка" name="Menu Undershirt"/>
+ <menu_item_call label="ТруÑÑ‹" name="Menu Underpants"/>
+ <menu_item_call label="Юбка" name="Skirt"/>
+ <menu_item_call label="Ðльфа" name="Alpha"/>
+ <menu_item_call label="Тату" name="Tattoo"/>
+ <menu_item_call label="Физика" name="Physics"/>
+ <menu_item_call label="Ð’ÑÑ Ð¾Ð´ÐµÐ¶Ð´Ð°" name="All Clothes"/>
+ </menu>
+ <menu label="Справка" name="DeprecatedHelp">
+ <menu_item_call label="Официальный блог Linden" name="Official Linden Blog"/>
+ <menu_item_call label="Портал Ñкриптов" name="Scripting Portal"/>
+ <menu label="Сообщение об ошибке" name="Bug Reporting">
+ <menu_item_call label="ОбщедоÑтупное ÑредÑтво отÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼" name="Public Issue Tracker"/>
+ <menu_item_call label="Справка по общедоÑтупному ÑредÑтву отÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼" name="Publc Issue Tracker Help"/>
+ <menu_item_call label="Сообщение об ошибке 101" name="Bug Reporing 101"/>
+ <menu_item_call label="Проблемы безопаÑноÑти" name="Security Issues"/>
+ <menu_item_call label="QA Wiki" name="QA Wiki"/>
+ </menu>
+ </menu>
+ </menu>
+</menu_bar>
diff --git a/indra/newview/skins/default/xui/ru/menu_wearable_list_item.xml b/indra/newview/skins/default/xui/ru/menu_wearable_list_item.xml
new file mode 100644
index 0000000000..2832e17b7d
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_wearable_list_item.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Outfit Wearable Context Menu">
+ <menu_item_call label="Заменить" name="wear_replace"/>
+ <menu_item_call label="Ðадеть" name="wear_wear"/>
+ <menu_item_call label="Добавить" name="wear_add"/>
+ <menu_item_call label="СнÑÑ‚ÑŒ / отÑоединить" name="take_off_or_detach"/>
+ <menu_item_call label="ОтÑоединить" name="detach"/>
+ <context_menu label="ПриÑоединить" name="wearable_attach_to"/>
+ <context_menu label="ПриÑоединить к данным в игре" name="wearable_attach_to_hud"/>
+ <menu_item_call label="СнÑÑ‚ÑŒ" name="take_off"/>
+ <menu_item_call label="Изменить" name="edit"/>
+ <menu_item_call label="Профиль объекта" name="object_profile"/>
+ <menu_item_call label="Показать оригинал" name="show_original"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_wearing_gear.xml b/indra/newview/skins/default/xui/ru/menu_wearing_gear.xml
new file mode 100644
index 0000000000..c2351fbfff
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_wearing_gear.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Gear Wearing">
+ <menu_item_call label="Изменить коÑтюм" name="edit"/>
+ <menu_item_call label="СнÑÑ‚ÑŒ" name="takeoff"/>
+ <menu_item_call label="Копировать ÑпиÑок коÑтюмов в буфер обмена" name="copy"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_wearing_tab.xml b/indra/newview/skins/default/xui/ru/menu_wearing_tab.xml
new file mode 100644
index 0000000000..f178b39c77
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/menu_wearing_tab.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Wearing">
+ <menu_item_call label="СнÑÑ‚ÑŒ" name="take_off"/>
+ <menu_item_call label="ОтÑоединить" name="detach"/>
+ <menu_item_call label="Изменить коÑтюм" name="edit"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ru/mime_types.xml b/indra/newview/skins/default/xui/ru/mime_types.xml
new file mode 100644
index 0000000000..7ed23b5d53
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/mime_types.xml
@@ -0,0 +1,217 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<mimetypes name="default">
+ <widgetset name="web">
+ <label name="web_label">
+ Веб-контент
+ </label>
+ <tooltip name="web_tooltip">
+ Ð’ Ñтом меÑте еÑÑ‚ÑŒ веб-контент
+ </tooltip>
+ <playtip name="web_playtip">
+ Показать веб-контент
+ </playtip>
+ </widgetset>
+ <widgetset name="movie">
+ <label name="movie_label">
+ Видео
+ </label>
+ <tooltip name="movie_tooltip">
+ ЗдеÑÑŒ еÑÑ‚ÑŒ видео
+ </tooltip>
+ <playtip name="movie_playtip">
+ Показать видео
+ </playtip>
+ </widgetset>
+ <widgetset name="image">
+ <label name="image_label">
+ Картинка
+ </label>
+ <tooltip name="image_tooltip">
+ Ð’ Ñтом меÑте еÑÑ‚ÑŒ картинка
+ </tooltip>
+ <playtip name="image_playtip">
+ Показать картинку Ð´Ð»Ñ Ñтого меÑта
+ </playtip>
+ </widgetset>
+ <widgetset name="audio">
+ <label name="audio_label">
+ Звук
+ </label>
+ <tooltip name="audio_tooltip">
+ Ð’ Ñтом меÑте еÑÑ‚ÑŒ звук
+ </tooltip>
+ <playtip name="audio_playtip">
+ ВоÑпроизвеÑти звук Ð´Ð»Ñ Ñтого меÑта
+ </playtip>
+ </widgetset>
+ <scheme name="rtsp">
+ <label name="rtsp_label">
+ Поток RealTime
+ </label>
+ </scheme>
+ <mimetype name="blank">
+ <label name="blank_label">
+ - Ðичего -
+ </label>
+ </mimetype>
+ <mimetype name="none/none">
+ <label name="none/none_label">
+ - Ðичего -
+ </label>
+ </mimetype>
+ <mimetype name="audio/*">
+ <label name="audio2_label">
+ Звук
+ </label>
+ </mimetype>
+ <mimetype name="video/*">
+ <label name="video2_label">
+ Видео
+ </label>
+ </mimetype>
+ <mimetype name="image/*">
+ <label name="image2_label">
+ Картинка
+ </label>
+ </mimetype>
+ <mimetype name="video/vnd.secondlife.qt.legacy">
+ <label name="vnd.secondlife.qt.legacy_label">
+ Видео (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="application/javascript">
+ <label name="application/javascript_label">
+ Javascript
+ </label>
+ </mimetype>
+ <mimetype name="application/ogg">
+ <label name="application/ogg_label">
+ Звук/видео Ogg
+ </label>
+ </mimetype>
+ <mimetype name="application/pdf">
+ <label name="application/pdf_label">
+ Документ PDF
+ </label>
+ </mimetype>
+ <mimetype name="application/postscript">
+ <label name="application/postscript_label">
+ Документ Postscript
+ </label>
+ </mimetype>
+ <mimetype name="application/rtf">
+ <label name="application/rtf_label">
+ Документ RTF
+ </label>
+ </mimetype>
+ <mimetype name="application/smil">
+ <label name="application/smil_label">
+ Документ SMIL
+ </label>
+ </mimetype>
+ <mimetype name="application/xhtml+xml">
+ <label name="application/xhtml+xml_label">
+ Веб-Ñтраница (XHTML)
+ </label>
+ </mimetype>
+ <mimetype name="application/x-director">
+ <label name="application/x-director_label">
+ Macromedia Director
+ </label>
+ </mimetype>
+ <mimetype name="audio/mid">
+ <label name="audio/mid_label">
+ Звук (MIDI)
+ </label>
+ </mimetype>
+ <mimetype name="audio/mpeg">
+ <label name="audio/mpeg_label">
+ Звук (MP3)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-aiff">
+ <label name="audio/x-aiff_label">
+ Звук (AIFF)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-wav">
+ <label name="audio/x-wav_label">
+ Звук (WAV)
+ </label>
+ </mimetype>
+ <mimetype name="image/bmp">
+ <label name="image/bmp_label">
+ Изображение (BMP)
+ </label>
+ </mimetype>
+ <mimetype name="image/gif">
+ <label name="image/gif_label">
+ Изображение (GIF)
+ </label>
+ </mimetype>
+ <mimetype name="image/jpeg">
+ <label name="image/jpeg_label">
+ Изображение (JPEG)
+ </label>
+ </mimetype>
+ <mimetype name="image/png">
+ <label name="image/png_label">
+ Изображение (PNG)
+ </label>
+ </mimetype>
+ <mimetype name="image/svg+xml">
+ <label name="image/svg+xml_label">
+ Изображение (SVG)
+ </label>
+ </mimetype>
+ <mimetype name="image/tiff">
+ <label name="image/tiff_label">
+ Изображение (TIFF)
+ </label>
+ </mimetype>
+ <mimetype name="text/html">
+ <label name="text/html_label">
+ Веб-Ñтраница
+ </label>
+ </mimetype>
+ <mimetype name="text/plain">
+ <label name="text/plain_label">
+ ТекÑÑ‚
+ </label>
+ </mimetype>
+ <mimetype name="text/xml">
+ <label name="text/xml_label">
+ XML
+ </label>
+ </mimetype>
+ <mimetype name="video/mpeg">
+ <label name="video/mpeg_label">
+ Видео (MPEG)
+ </label>
+ </mimetype>
+ <mimetype name="video/mp4">
+ <label name="video/mp4_label">
+ Видео (MP4)
+ </label>
+ </mimetype>
+ <mimetype name="video/quicktime">
+ <label name="video/quicktime_label">
+ Видео (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-asf">
+ <label name="video/x-ms-asf_label">
+ Видео (Windows Media ASF)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-wmv">
+ <label name="video/x-ms-wmv_label">
+ Видео (Windows Media WMV)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-msvideo">
+ <label name="video/x-msvideo_label">
+ Видео (AVI)
+ </label>
+ </mimetype>
+</mimetypes>
diff --git a/indra/newview/skins/default/xui/ru/mime_types_linux.xml b/indra/newview/skins/default/xui/ru/mime_types_linux.xml
new file mode 100644
index 0000000000..a42b0bb9cc
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/mime_types_linux.xml
@@ -0,0 +1,217 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<mimetypes name="default">
+ <widgetset name="web">
+ <label name="web_label">
+ Веб-контент
+ </label>
+ <tooltip name="web_tooltip">
+ Ð’ Ñтом меÑте еÑÑ‚ÑŒ веб-контент
+ </tooltip>
+ <playtip name="web_playtip">
+ Показать веб-контент
+ </playtip>
+ </widgetset>
+ <widgetset name="movie">
+ <label name="movie_label">
+ Видео
+ </label>
+ <tooltip name="movie_tooltip">
+ ЗдеÑÑŒ еÑÑ‚ÑŒ видео
+ </tooltip>
+ <playtip name="movie_playtip">
+ Показать видео
+ </playtip>
+ </widgetset>
+ <widgetset name="image">
+ <label name="image_label">
+ Изображение
+ </label>
+ <tooltip name="image_tooltip">
+ Ð’ Ñтом меÑте еÑÑ‚ÑŒ картинка
+ </tooltip>
+ <playtip name="image_playtip">
+ Показать картинку Ð´Ð»Ñ Ñтого меÑта
+ </playtip>
+ </widgetset>
+ <widgetset name="audio">
+ <label name="audio_label">
+ Звук
+ </label>
+ <tooltip name="audio_tooltip">
+ Ð’ Ñтом меÑте еÑÑ‚ÑŒ звук
+ </tooltip>
+ <playtip name="audio_playtip">
+ ВоÑпроизвеÑти звук Ð´Ð»Ñ Ñтого меÑта
+ </playtip>
+ </widgetset>
+ <scheme name="rtsp">
+ <label name="rtsp_label">
+ Поток RealTime
+ </label>
+ </scheme>
+ <mimetype name="blank">
+ <label name="blank_label">
+ - Ðичего -
+ </label>
+ </mimetype>
+ <mimetype name="none/none">
+ <label name="none/none_label">
+ - Ðичего -
+ </label>
+ </mimetype>
+ <mimetype name="audio/*">
+ <label name="audio2_label">
+ Звук
+ </label>
+ </mimetype>
+ <mimetype name="video/*">
+ <label name="video2_label">
+ Видео
+ </label>
+ </mimetype>
+ <mimetype name="image/*">
+ <label name="image2_label">
+ Изображение
+ </label>
+ </mimetype>
+ <mimetype name="video/vnd.secondlife.qt.legacy">
+ <label name="vnd.secondlife.qt.legacy_label">
+ Видео (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="application/javascript">
+ <label name="application/javascript_label">
+ Javascript
+ </label>
+ </mimetype>
+ <mimetype name="application/ogg">
+ <label name="application/ogg_label">
+ Звук/видео Ogg
+ </label>
+ </mimetype>
+ <mimetype name="application/pdf">
+ <label name="application/pdf_label">
+ Документ PDF
+ </label>
+ </mimetype>
+ <mimetype name="application/postscript">
+ <label name="application/postscript_label">
+ Документ Postscript
+ </label>
+ </mimetype>
+ <mimetype name="application/rtf">
+ <label name="application/rtf_label">
+ Документ RTF
+ </label>
+ </mimetype>
+ <mimetype name="application/smil">
+ <label name="application/smil_label">
+ Документ SMIL
+ </label>
+ </mimetype>
+ <mimetype name="application/xhtml+xml">
+ <label name="application/xhtml+xml_label">
+ Веб-Ñтраница (XHTML)
+ </label>
+ </mimetype>
+ <mimetype name="application/x-director">
+ <label name="application/x-director_label">
+ Macromedia Director
+ </label>
+ </mimetype>
+ <mimetype name="audio/mid">
+ <label name="audio/mid_label">
+ Звук (MIDI)
+ </label>
+ </mimetype>
+ <mimetype name="audio/mpeg">
+ <label name="audio/mpeg_label">
+ Звук (MP3)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-aiff">
+ <label name="audio/x-aiff_label">
+ Звук (AIFF)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-wav">
+ <label name="audio/x-wav_label">
+ Звук (WAV)
+ </label>
+ </mimetype>
+ <mimetype name="image/bmp">
+ <label name="image/bmp_label">
+ Изображение (BMP)
+ </label>
+ </mimetype>
+ <mimetype name="image/gif">
+ <label name="image/gif_label">
+ Изображение (GIF)
+ </label>
+ </mimetype>
+ <mimetype name="image/jpeg">
+ <label name="image/jpeg_label">
+ Изображение (JPEG)
+ </label>
+ </mimetype>
+ <mimetype name="image/png">
+ <label name="image/png_label">
+ Изображение (PNG)
+ </label>
+ </mimetype>
+ <mimetype name="image/svg+xml">
+ <label name="image/svg+xml_label">
+ Изображение (SVG)
+ </label>
+ </mimetype>
+ <mimetype name="image/tiff">
+ <label name="image/tiff_label">
+ Изображение (TIFF)
+ </label>
+ </mimetype>
+ <mimetype name="text/html">
+ <label name="text/html_label">
+ Веб-Ñтраница
+ </label>
+ </mimetype>
+ <mimetype name="text/plain">
+ <label name="text/plain_label">
+ ТекÑÑ‚
+ </label>
+ </mimetype>
+ <mimetype name="text/xml">
+ <label name="text/xml_label">
+ XML
+ </label>
+ </mimetype>
+ <mimetype name="video/mpeg">
+ <label name="video/mpeg_label">
+ Видео (MPEG)
+ </label>
+ </mimetype>
+ <mimetype name="video/mp4">
+ <label name="video/mp4_label">
+ Видео (MP4)
+ </label>
+ </mimetype>
+ <mimetype name="video/quicktime">
+ <label name="video/quicktime_label">
+ Видео (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-asf">
+ <label name="video/x-ms-asf_label">
+ Видео (Windows Media ASF)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-wmv">
+ <label name="video/x-ms-wmv_label">
+ Видео (Windows Media WMV)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-msvideo">
+ <label name="video/x-msvideo_label">
+ Видео (AVI)
+ </label>
+ </mimetype>
+</mimetypes>
diff --git a/indra/newview/skins/default/xui/ru/mime_types_mac.xml b/indra/newview/skins/default/xui/ru/mime_types_mac.xml
new file mode 100644
index 0000000000..7ed23b5d53
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/mime_types_mac.xml
@@ -0,0 +1,217 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<mimetypes name="default">
+ <widgetset name="web">
+ <label name="web_label">
+ Веб-контент
+ </label>
+ <tooltip name="web_tooltip">
+ Ð’ Ñтом меÑте еÑÑ‚ÑŒ веб-контент
+ </tooltip>
+ <playtip name="web_playtip">
+ Показать веб-контент
+ </playtip>
+ </widgetset>
+ <widgetset name="movie">
+ <label name="movie_label">
+ Видео
+ </label>
+ <tooltip name="movie_tooltip">
+ ЗдеÑÑŒ еÑÑ‚ÑŒ видео
+ </tooltip>
+ <playtip name="movie_playtip">
+ Показать видео
+ </playtip>
+ </widgetset>
+ <widgetset name="image">
+ <label name="image_label">
+ Картинка
+ </label>
+ <tooltip name="image_tooltip">
+ Ð’ Ñтом меÑте еÑÑ‚ÑŒ картинка
+ </tooltip>
+ <playtip name="image_playtip">
+ Показать картинку Ð´Ð»Ñ Ñтого меÑта
+ </playtip>
+ </widgetset>
+ <widgetset name="audio">
+ <label name="audio_label">
+ Звук
+ </label>
+ <tooltip name="audio_tooltip">
+ Ð’ Ñтом меÑте еÑÑ‚ÑŒ звук
+ </tooltip>
+ <playtip name="audio_playtip">
+ ВоÑпроизвеÑти звук Ð´Ð»Ñ Ñтого меÑта
+ </playtip>
+ </widgetset>
+ <scheme name="rtsp">
+ <label name="rtsp_label">
+ Поток RealTime
+ </label>
+ </scheme>
+ <mimetype name="blank">
+ <label name="blank_label">
+ - Ðичего -
+ </label>
+ </mimetype>
+ <mimetype name="none/none">
+ <label name="none/none_label">
+ - Ðичего -
+ </label>
+ </mimetype>
+ <mimetype name="audio/*">
+ <label name="audio2_label">
+ Звук
+ </label>
+ </mimetype>
+ <mimetype name="video/*">
+ <label name="video2_label">
+ Видео
+ </label>
+ </mimetype>
+ <mimetype name="image/*">
+ <label name="image2_label">
+ Картинка
+ </label>
+ </mimetype>
+ <mimetype name="video/vnd.secondlife.qt.legacy">
+ <label name="vnd.secondlife.qt.legacy_label">
+ Видео (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="application/javascript">
+ <label name="application/javascript_label">
+ Javascript
+ </label>
+ </mimetype>
+ <mimetype name="application/ogg">
+ <label name="application/ogg_label">
+ Звук/видео Ogg
+ </label>
+ </mimetype>
+ <mimetype name="application/pdf">
+ <label name="application/pdf_label">
+ Документ PDF
+ </label>
+ </mimetype>
+ <mimetype name="application/postscript">
+ <label name="application/postscript_label">
+ Документ Postscript
+ </label>
+ </mimetype>
+ <mimetype name="application/rtf">
+ <label name="application/rtf_label">
+ Документ RTF
+ </label>
+ </mimetype>
+ <mimetype name="application/smil">
+ <label name="application/smil_label">
+ Документ SMIL
+ </label>
+ </mimetype>
+ <mimetype name="application/xhtml+xml">
+ <label name="application/xhtml+xml_label">
+ Веб-Ñтраница (XHTML)
+ </label>
+ </mimetype>
+ <mimetype name="application/x-director">
+ <label name="application/x-director_label">
+ Macromedia Director
+ </label>
+ </mimetype>
+ <mimetype name="audio/mid">
+ <label name="audio/mid_label">
+ Звук (MIDI)
+ </label>
+ </mimetype>
+ <mimetype name="audio/mpeg">
+ <label name="audio/mpeg_label">
+ Звук (MP3)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-aiff">
+ <label name="audio/x-aiff_label">
+ Звук (AIFF)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-wav">
+ <label name="audio/x-wav_label">
+ Звук (WAV)
+ </label>
+ </mimetype>
+ <mimetype name="image/bmp">
+ <label name="image/bmp_label">
+ Изображение (BMP)
+ </label>
+ </mimetype>
+ <mimetype name="image/gif">
+ <label name="image/gif_label">
+ Изображение (GIF)
+ </label>
+ </mimetype>
+ <mimetype name="image/jpeg">
+ <label name="image/jpeg_label">
+ Изображение (JPEG)
+ </label>
+ </mimetype>
+ <mimetype name="image/png">
+ <label name="image/png_label">
+ Изображение (PNG)
+ </label>
+ </mimetype>
+ <mimetype name="image/svg+xml">
+ <label name="image/svg+xml_label">
+ Изображение (SVG)
+ </label>
+ </mimetype>
+ <mimetype name="image/tiff">
+ <label name="image/tiff_label">
+ Изображение (TIFF)
+ </label>
+ </mimetype>
+ <mimetype name="text/html">
+ <label name="text/html_label">
+ Веб-Ñтраница
+ </label>
+ </mimetype>
+ <mimetype name="text/plain">
+ <label name="text/plain_label">
+ ТекÑÑ‚
+ </label>
+ </mimetype>
+ <mimetype name="text/xml">
+ <label name="text/xml_label">
+ XML
+ </label>
+ </mimetype>
+ <mimetype name="video/mpeg">
+ <label name="video/mpeg_label">
+ Видео (MPEG)
+ </label>
+ </mimetype>
+ <mimetype name="video/mp4">
+ <label name="video/mp4_label">
+ Видео (MP4)
+ </label>
+ </mimetype>
+ <mimetype name="video/quicktime">
+ <label name="video/quicktime_label">
+ Видео (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-asf">
+ <label name="video/x-ms-asf_label">
+ Видео (Windows Media ASF)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-wmv">
+ <label name="video/x-ms-wmv_label">
+ Видео (Windows Media WMV)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-msvideo">
+ <label name="video/x-msvideo_label">
+ Видео (AVI)
+ </label>
+ </mimetype>
+</mimetypes>
diff --git a/indra/newview/skins/default/xui/ru/notifications.xml b/indra/newview/skins/default/xui/ru/notifications.xml
new file mode 100644
index 0000000000..b4692385d1
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/notifications.xml
@@ -0,0 +1,3125 @@
+<?xml version="1.0" encoding="utf-8"?>
+<notifications>
+ <global name="skipnexttime">
+ Больше не показывать
+ </global>
+ <global name="alwayschoose">
+ Ð’Ñегда выбирать Ñту опцию
+ </global>
+ <global name="implicitclosebutton">
+ Закрыть
+ </global>
+ <template name="okbutton">
+ <form>
+ <button name="OK_okbutton" text="$yestext"/>
+ </form>
+ </template>
+ <template name="okignore">
+ <form>
+ <button name="OK_okignore" text="$yestext"/>
+ </form>
+ </template>
+ <template name="okcancelbuttons">
+ <form>
+ <button name="OK_okcancelbuttons" text="$yestext"/>
+ <button name="Cancel_okcancelbuttons" text="$notext"/>
+ </form>
+ </template>
+ <template name="okcancelignore">
+ <form>
+ <button name="OK_okcancelignore" text="$yestext"/>
+ <button name="Cancel_okcancelignore" text="$notext"/>
+ </form>
+ </template>
+ <template name="okhelpbuttons">
+ <form>
+ <button name="OK_okhelpbuttons" text="$yestext"/>
+ <button name="Help" text="$helptext"/>
+ </form>
+ </template>
+ <template name="yesnocancelbuttons">
+ <form>
+ <button name="Yes" text="$yestext"/>
+ <button name="No" text="$notext"/>
+ <button name="Cancel_yesnocancelbuttons" text="$canceltext"/>
+ </form>
+ </template>
+ <notification label="ÐеизвеÑтное уведомление" name="MissingAlert">
+ Ваша верÑÐ¸Ñ [APP_NAME] не знает, как отобразить полученное уведомление. УбедитеÑÑŒ, что у Ð²Ð°Ñ ÑƒÑтановлена поÑледнÑÑ Ð²ÐµÑ€ÑÐ¸Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð°.
+
+ПодробноÑти ошибки: уведомление под названием «[_NAME]» не было найдено в notifications.xml.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="FloaterNotFound">
+ Ошибка окна: не найдены Ñледующие Ñлементы управлениÑ:
+
+[CONTROLS]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="TutorialNotFound">
+ Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð½ÐµÑ‚ доÑтупных учебников.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="GenericAlert">
+ [MESSAGE]
+ </notification>
+ <notification name="GenericAlertYesCancel">
+ [MESSAGE]
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="Да"/>
+ </notification>
+ <notification name="BadInstallation">
+ Произошла ошибка при обновлении [APP_NAME]. [http://get.secondlife.com Загрузите поÑледнюю верÑию] клиента.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="LoginFailedNoNetwork">
+ Ðе удалоÑÑŒ подключитьÑÑ Ðº [SECOND_LIFE_GRID].
+ «[DIAGNOSTIC]»
+УбедитеÑÑŒ, что подключение к интернету работает нормально.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="MessageTemplateNotFound">
+ Шаблон ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ [PATH] не найден.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="WearableSave">
+ Сохранить Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ‚ÐµÐ¿ÐµÑ€ÐµÑˆÐ½ÐµÐ¹ одежды/чаÑти тела?
+ <usetemplate canceltext="Отмена" name="yesnocancelbuttons" notext="Ðе ÑохранÑÑ‚ÑŒ" yestext="Сохранить"/>
+ </notification>
+ <notification name="ConfirmNoCopyToOutbox">
+ У Ð²Ð°Ñ Ð½ÐµÑ‚ прав на копирование Ñтих предметов в папку «Торговые иÑходÑщие». ПеремеÑтите их или оÑтавьте здеÑÑŒ.
+ <usetemplate name="okcancelbuttons" notext="Ðе перемещать предмет(Ñ‹)" yestext="ПеремеÑтить предмет(Ñ‹)"/>
+ </notification>
+ <notification name="OutboxFolderCreated">
+ Ð”Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ предмета, перенеÑенного на верхний уровень папки «Торговые иÑходÑщие», Ñоздана Ð½Ð¾Ð²Ð°Ñ Ð¿Ð°Ð¿ÐºÐ°.
+ <usetemplate ignoretext="Ð’ папке «Торговые иÑходÑщие» Ñоздана Ð½Ð¾Ð²Ð°Ñ Ð¿Ð°Ð¿ÐºÐ°" name="okignore" yestext="OK"/>
+ </notification>
+ <notification name="OutboxImportComplete">
+ УÑпешно
+
+Ð’Ñе папки уÑпешно отправлены в торговый центр.
+ <usetemplate ignoretext="Ð’Ñе папки отправлены в торговый центр" name="okignore" yestext="OK"/>
+ </notification>
+ <notification name="OutboxImportHadErrors">
+ Ðекоторые папки не перенеÑены
+
+Ошибки при отправке некоторых папок в торговый центр. Эти папки оÑталиÑÑŒ в вашей папке «Торговые иÑходÑщие».
+
+Подробнее Ñм. в [[MARKETPLACE_IMPORTS_URL] журнале ошибок].
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="OutboxImportFailed">
+ Ошибка при передаче
+
+Папки не отправлены в торговый центр из-за ошибки ÑиÑтемы или Ñети. Повторите попытку позже.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="OutboxInitFailed">
+ Ошибка инициализации торгового центра
+
+Ðе удалоÑÑŒ инициализировать торговый центр из-за ошибки ÑиÑтемы или Ñети. Повторите попытку позже.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="CompileQueueSaveText">
+ Ошибка при передаче текÑта Ñкрипта по Ñледующей причине: [REASON]. Повторите попытку позже.
+ </notification>
+ <notification name="CompileQueueSaveBytecode">
+ Ошибка при передаче Ñкомпилированного Ñкрипта по Ñледующей причине: [REASON]. Повторите попытку позже.
+ </notification>
+ <notification name="WriteAnimationFail">
+ Ошибка при запиÑи данных анимации. Повторите попытку позже.
+ </notification>
+ <notification name="UploadAuctionSnapshotFail">
+ Ошибка при передаче Ñнимка аукциона по Ñледующей причине: [REASON]
+ </notification>
+ <notification name="UnableToViewContentsMoreThanOne">
+ Ðевозможно проÑмотреть Ñодержимое неÑкольких объектов одновременно.
+Выберите один объект и повторите попытку.
+ </notification>
+ <notification name="SaveClothingBodyChanges">
+ Сохранить вÑе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² одежде/чаÑÑ‚ÑÑ… тела?
+ <usetemplate canceltext="Отмена" name="yesnocancelbuttons" notext="Ðе ÑохранÑÑ‚ÑŒ" yestext="Сохранить вÑе"/>
+ </notification>
+ <notification name="FriendsAndGroupsOnly">
+ Жители, которые не ÑвлÑÑŽÑ‚ÑÑ Ð²Ð°ÑˆÐ¸Ð¼Ð¸ друзьÑми, не будут знать, что вы игнорируете их звонки и ÑообщениÑ.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="FavoritesOnLogin">
+ Примечание. ПоÑле Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ñтой опции вÑе пользователи данного компьютера Ñмогут увидеть ÑпиÑок ваших избранных меÑÑ‚.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="GrantModifyRights">
+ ПредоÑтавление другому жителю прав на изменение позволит ему изменÑÑ‚ÑŒ, удалÑÑ‚ÑŒ или брать ЛЮБЫЕ ваши объекты. Будьте ОЧЕÐЬ оÑторожны Ñ Ð¿Ñ€ÐµÐ´Ð¾Ñтавлением такого разрешениÑ.
+Дать пользователю [NAME] права на изменение?
+ <usetemplate name="okcancelbuttons" notext="Ðет" yestext="Да"/>
+ </notification>
+ <notification name="GrantModifyRightsMultiple">
+ ПредоÑтавление другому жителю прав на изменение позволит ему изменÑÑ‚ÑŒ ЛЮБЫЕ ваши объекты. Будьте ОЧЕÐЬ оÑторожны Ñ Ð¿Ñ€ÐµÐ´Ð¾Ñтавлением такого разрешениÑ.
+Дать права на изменение выбранным жителÑм?
+ <usetemplate name="okcancelbuttons" notext="Ðет" yestext="Да"/>
+ </notification>
+ <notification name="RevokeModifyRights">
+ Отобрать у Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ [NAME] права на изменение?
+ <usetemplate name="okcancelbuttons" notext="Ðет" yestext="Да"/>
+ </notification>
+ <notification name="RevokeModifyRightsMultiple">
+ Отобрать у выбранных жителей права на изменение?
+ <usetemplate name="okcancelbuttons" notext="Ðет" yestext="Да"/>
+ </notification>
+ <notification name="UnableToCreateGroup">
+ Ðевозможно Ñоздать группу.
+[MESSAGE]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="PanelGroupApply">
+ [NEEDS_APPLY_MESSAGE]
+[WANT_APPLY_MESSAGE]
+ <usetemplate canceltext="Отмена" name="yesnocancelbuttons" notext="Игнорировать изменениÑ" yestext="Применить изменениÑ"/>
+ </notification>
+ <notification name="MustSpecifyGroupNoticeSubject">
+ Ðеобходимо указать тему Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ группового уведомлениÑ.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="AddGroupOwnerWarning">
+ Ð’Ñ‹ ÑобираетеÑÑŒ добавить учаÑтников группы в роль [ROLE_NAME].
+Удалить учаÑтников из Ñтой роли нельзÑ.
+УчаÑтники Ñами должны отказатьÑÑ Ð¾Ñ‚ нее.
+Продолжить?
+ <usetemplate ignoretext="Подтверждать перед добавлением нового владельца группы" name="okcancelignore" notext="Ðет" yestext="Да"/>
+ </notification>
+ <notification name="AssignDangerousActionWarning">
+ Ð’Ñ‹ ÑобираетеÑÑŒ добавить ÑпоÑобноÑÑ‚ÑŒ «[ACTION_NAME]» к роли «[ROLE_NAME]».
+
+ *ПРЕДУПРЕЖДЕÐИЕ*
+ Ð’Ñе учаÑтники роли Ñ Ñтой ÑпоÑобноÑтью могут приÑваивать Ñебе и вÑем другим учаÑтникам более выÑокие роли, чем у них ÑÐµÐ¹Ñ‡Ð°Ñ ÐµÑÑ‚ÑŒ, и даже подниматьÑÑ Ð´Ð¾ ÑƒÑ€Ð¾Ð²Ð½Ñ Ð²Ð»Ð°Ð´ÐµÐ»ÑŒÑ†Ð°. Прежде чем назначить Ñту ÑпоÑобноÑÑ‚ÑŒ, убедитеÑÑŒ в целеÑообразноÑти Ñтого.
+
+Добавить Ñту ÑпоÑобноÑÑ‚ÑŒ к роли «[ROLE_NAME]»?
+ <usetemplate name="okcancelbuttons" notext="Ðет" yestext="Да"/>
+ </notification>
+ <notification name="AssignDangerousAbilityWarning">
+ Ð’Ñ‹ ÑобираетеÑÑŒ добавить ÑпоÑобноÑÑ‚ÑŒ «[ACTION_NAME]» к роли «[ROLE_NAME]».
+
+ *ПРЕДУПРЕЖДЕÐИЕ*
+ Ð’Ñе учаÑтники роли Ñ Ñтой ÑпоÑобноÑтью могут приÑваивать Ñебе и вÑем другим учаÑтникам вÑе ÑпоÑобноÑти и даже подниматьÑÑ Ð´Ð¾ ÑƒÑ€Ð¾Ð²Ð½Ñ Ð²Ð»Ð°Ð´ÐµÐ»ÑŒÑ†Ð°.
+
+Добавить Ñту ÑпоÑобноÑÑ‚ÑŒ к роли «[ROLE_NAME]»?
+ <usetemplate name="okcancelbuttons" notext="Ðет" yestext="Да"/>
+ </notification>
+ <notification name="AttachmentDrop">
+ Ð’Ñ‹ ÑобираетеÑÑŒ ÑброÑить Ñвое приÑоединение.
+ Продолжить?
+ <usetemplate ignoretext="Подтверждать перед ÑброÑом приÑоединений" name="okcancelignore" notext="Ðет" yestext="Да"/>
+ </notification>
+ <notification name="JoinGroupCanAfford">
+ Ð’Ñтупление в Ñту группу Ñтоит L$[COST].
+Продолжить?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="Ð’Ñтупить"/>
+ </notification>
+ <notification name="JoinGroupNoCost">
+ Ð’Ñ‹ вÑтупаете в группу [NAME].
+Продолжить?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="Ð’Ñтупить"/>
+ </notification>
+ <notification name="JoinGroupCannotAfford">
+ Ð’Ñтупление в Ñту группу Ñтоит L$[COST].
+У Ð²Ð°Ñ Ð½Ðµ хватает L$ Ð´Ð»Ñ Ð²ÑтуплениÑ.
+ </notification>
+ <notification name="CreateGroupCost">
+ Создание Ñтой группы Ñтоит L$100.
+Ð’ группе должно быть более одного учаÑтника, иначе она будет удалена.
+ПриглаÑите учаÑтников в ближайшие 48 чаÑов.
+ <usetemplate canceltext="Отмена" name="okcancelbuttons" notext="Отмена" yestext="Создать группу за L$100"/>
+ </notification>
+ <notification name="LandBuyPass">
+ За L$[COST] вы можете находитьÑÑ Ð½Ð° Ñтой земле («[PARCEL_NAME]») в течение [TIME] чаÑов. Купить пропуÑк?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="SalePriceRestriction">
+ При продаже любому пользователю цена продажи должна быть больше L$0.
+Выберите пользователÑ, чтобы продать ему за L$0.
+ </notification>
+ <notification name="ConfirmLandSaleChange">
+ Выбранные [LAND_SIZE] м² земли выÑтавлÑÑŽÑ‚ÑÑ Ð½Ð° продажу.
+Ваша цена продажи: $[SALE_PRICE], разрешена продажа Ð´Ð»Ñ [NAME].
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmLandSaleToAnyoneChange">
+ Ð’ÐИМÐÐИЕ! При выборе «продавать кому угодно» ваша Ð·ÐµÐ¼Ð»Ñ Ñтанет доÑтупной вÑему ÑообщеÑтву [SECOND_LIFE], даже тем, кто находитÑÑ Ð½Ðµ в Ñтом регионе.
+
+Выбранные [LAND_SIZE] м² земли выÑтавлÑÑŽÑ‚ÑÑ Ð½Ð° продажу.
+Ваша цена продажи: $[SALE_PRICE], разрешена продажа Ð´Ð»Ñ [NAME].
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ReturnObjectsDeededToGroup">
+ Ð’Ñ‹ дейÑтвительно хотите вернуть вÑе объекты, переданные группе «[NAME]» на Ñтом земельном учаÑтке, обратно в инвентарь их прежних владельцев?
+
+*ПРЕДУПРЕЖДЕÐИЕ* Ð’Ñе непереноÑимые объекты, предоÑтавленные Ñтой группе, будут удалены!
+
+Объекты: [N]
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ReturnObjectsOwnedByUser">
+ Ð’Ñ‹ дейÑтвительно хотите вернуть вÑе объекты, принадлежащие жителю «[NAME]» на Ñтом земельном учаÑтке, в его инвентарь?
+
+Объекты: [N]
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ReturnObjectsOwnedBySelf">
+ Ð’Ñ‹ дейÑтвительно хотите вернуть вÑе принадлежащие вам объекты на Ñтом земельном учаÑтке в Ñвой инвентарь?
+
+Объекты: [N]
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ReturnObjectsNotOwnedBySelf">
+ Ð’Ñ‹ дейÑтвительно хотите вернуть вÑе ÐЕ принадлежащие вам объекты на Ñтом учаÑтке в инвентарь их владельцев?
+ПереноÑимые объекты, предоÑтавленные группе, будут возвращены прежним владельцам.
+
+*ПРЕДУПРЕЖДЕÐИЕ* Ð’Ñе непереноÑимые объекты, предоÑтавленные Ñтой группе, будут удалены!
+
+Объекты: [N]
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ReturnObjectsNotOwnedByUser">
+ Ð’Ñ‹ дейÑтвительно хотите вернуть вÑе объекты, ÐЕ принадлежащие пользователю [NAME], на Ñтом земельном учаÑтке, обратно в инвентарь их владельцев?
+ПереноÑимые объекты, предоÑтавленные группе, будут возвращены прежним владельцам.
+
+*ПРЕДУПРЕЖДЕÐИЕ* Ð’Ñе непереноÑимые объекты, предоÑтавленные Ñтой группе, будут удалены!
+
+Объекты: [N]
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ReturnAllTopObjects">
+ Ð’Ñ‹ дейÑтвительно хотите вернуть вÑе объекты из ÑпиÑка в инвентарь их владельцев?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="DisableAllTopObjects">
+ Ð’Ñ‹ дейÑтвительно хотите отключить вÑе объекты в Ñтом регионе?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ReturnObjectsNotOwnedByGroup">
+ Вернуть вÑе объекты на Ñтом земельном учаÑтке, ÐЕ переданные группе «[NAME]», их владельцам?
+
+Объекты: [N]
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="UnableToDisableOutsideScripts">
+ ÐÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÑŒ Ñкрипты.
+Во вÑем Ñтом регионе включены боевые повреждениÑ.
+Чтобы оружие дейÑтвовало, Ñкрипты должны выполнÑÑ‚ÑŒÑÑ.
+ </notification>
+ <notification name="MultipleFacesSelected">
+ Выбрано неÑколько граней.
+ЕÑли продолжить Ñто дейÑтвие, на каждой выбранной грани объекта будет размещено по отдельному ÑкземплÑру медиа.
+Чтобы помеÑтить медиа только на одну грань, выберите команду «Выбор грани» и щелкните нужную грань объекта, затем нажмите «Добавить».
+ <usetemplate ignoretext="Медиа будет помещено на неÑколько выбранных граней" name="okcancelignore" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="MustBeInParcel">
+ Чтобы уÑтановить точку телепортации, вы должны находитьÑÑ Ð½Ð° учаÑтке.
+ </notification>
+ <notification name="PromptRecipientEmail">
+ Введите правильный Ð°Ð´Ñ€ÐµÑ email получателÑ.
+ </notification>
+ <notification name="PromptSelfEmail">
+ Введите Ñвой Ð°Ð´Ñ€ÐµÑ email.
+ </notification>
+ <notification name="PromptMissingSubjMsg">
+ Отправить Ñнимок Ñ Ñ‚ÐµÐ¼Ð¾Ð¹ или Ñообщением по умолчанию?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ErrorProcessingSnapshot">
+ Ошибка при обработке данных Ñнимка
+ </notification>
+ <notification name="ErrorEncodingSnapshot">
+ Ошибка при кодировке Ñнимка.
+ </notification>
+ <notification name="ErrorUploadingPostcard">
+ Ошибка при отправке Ñнимка по Ñледующей причине: [REASON]
+ </notification>
+ <notification name="ErrorUploadingReportScreenshot">
+ Ошибка при передаче Ñнимка отчета по Ñледующей причине: [REASON]
+ </notification>
+ <notification name="MustAgreeToLogIn">
+ Ð”Ð»Ñ Ð²Ñ…Ð¾Ð´Ð° в [SECOND_LIFE] вы должны принÑÑ‚ÑŒ уÑÐ»Ð¾Ð²Ð¸Ñ ÐŸÐ¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÑŒÑкого ÑоглашениÑ.
+ </notification>
+ <notification name="CouldNotPutOnOutfit">
+ Ðе удалоÑÑŒ надеть коÑтюм.
+Папка коÑтюмов не Ñодержит одежды, чаÑтей тела или приÑоединений.
+ </notification>
+ <notification name="CannotWearTrash">
+ ÐÐµÐ»ÑŒÐ·Ñ Ð½Ð°Ð´ÐµÑ‚ÑŒ одежду или чаÑÑ‚ÑŒ тела, еÑли они находÑÑ‚ÑÑ Ð² корзине
+ </notification>
+ <notification name="MaxAttachmentsOnOutfit">
+ Ðе удалоÑÑŒ приÑоединить объект.
+Превышен лимит приÑоединений ([MAX_ATTACHMENTS] объектов). Сначала отÑоедините другой объект.
+ </notification>
+ <notification name="CannotWearInfoNotComplete">
+ ÐÐµÐ»ÑŒÐ·Ñ Ð½Ð°Ð´ÐµÑ‚ÑŒ Ñту вещь, так как она еще не загружена. Повторите попытку через минуту.
+ </notification>
+ <notification name="MustHaveAccountToLogIn">
+ Ðй-Ñй-Ñй! Что-то оÑталоÑÑŒ незаполненным.
+Ðеобходимо ввеÑти Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ аватара.
+
+Ð”Ð»Ñ Ð²Ñ…Ð¾Ð´Ð° в [SECOND_LIFE] нужен аккаунт. Создать его?
+ <url name="url">
+ http://join.secondlife.com/
+ </url>
+ <usetemplate name="okcancelbuttons" notext="Повторить попытку" yestext="Создать новый аккаунт"/>
+ </notification>
+ <notification name="InvalidCredentialFormat">
+ Введите Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸Ð»Ð¸ Ð¸Ð¼Ñ Ð¸ фамилию вашего аватара в поле Â«Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ», затем Ñнова войдите в программу.
+ </notification>
+ <notification name="DeleteClassified">
+ Удалить рекламу «[NAME]»?
+Плата за нее не будет возвращена.
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="DeleteMedia">
+ Ð’Ñ‹ ÑобираетеÑÑŒ удалить медиа, ÑвÑзанное Ñ Ñтой гранью.
+Продолжить?
+ <usetemplate ignoretext="Подтверждать перед удалением медиа из объекта" name="okcancelignore" notext="Ðет" yestext="Да"/>
+ </notification>
+ <notification name="ClassifiedSave">
+ Сохранить Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² рекламе [NAME]?
+ <usetemplate canceltext="Отмена" name="yesnocancelbuttons" notext="Ðе ÑохранÑÑ‚ÑŒ" yestext="Сохранить"/>
+ </notification>
+ <notification name="ClassifiedInsufficientFunds">
+ ÐедоÑтаточно денег Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñ€ÐµÐºÐ»Ð°Ð¼Ñ‹.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="DeleteAvatarPick">
+ Удалить подборку &lt;nolink&gt;[PICK]&lt;/nolink&gt;?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="DeleteOutfits">
+ Удалить выбранный коÑтюм?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="PromptGoToEventsPage">
+ Перейти на веб-Ñтраницу Ñобытий [SECOND_LIFE]?
+ <url name="url">
+ http://secondlife.com/events/
+ </url>
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="SelectProposalToView">
+ Выберите предложение Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра.
+ </notification>
+ <notification name="SelectHistoryItemToView">
+ Выберите пункт журнала Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра.
+ </notification>
+ <notification name="CacheWillClear">
+ КÑш будет очищен поÑле перезапуÑка [APP_NAME].
+ </notification>
+ <notification name="CacheWillBeMoved">
+ КÑш будет перемещен поÑле перезапуÑка [APP_NAME].
+Примечание. При Ñтом кÑш будет очищен.
+ </notification>
+ <notification name="ChangeConnectionPort">
+ ÐаÑтройки порта начнут дейÑтвовать поÑле перезапуÑка [APP_NAME].
+ </notification>
+ <notification name="ChangeSkin">
+ ÐÐ¾Ð²Ð°Ñ ÐºÐ¾Ð¶Ð° будет видна поÑле перезапуÑка [APP_NAME].
+ </notification>
+ <notification name="ChangeLanguage">
+ Смена Ñзыка вÑтупит в Ñилу поÑле перезапуÑка [APP_NAME].
+ </notification>
+ <notification name="GoToAuctionPage">
+ Перейти на веб-Ñтраницу [SECOND_LIFE], чтобы поÑмотреть подробноÑти аукциона или Ñделать Ñтавку?
+ <url name="url">
+ http://secondlife.com/auctions/auction-detail.php?id=[AUCTION_ID]
+ </url>
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="SaveChanges">
+ Сохранить изменениÑ?
+ <usetemplate canceltext="Отмена" name="yesnocancelbuttons" notext="Ðе ÑохранÑÑ‚ÑŒ" yestext="Сохранить"/>
+ </notification>
+ <notification name="GestureSaveFailedTooManySteps">
+ Ðе удалоÑÑŒ Ñохранить жеÑÑ‚.
+ЖеÑÑ‚ Ñодержит Ñлишком много Ñтапов.
+Попробуйте удалить некоторые Ñтапы и повторите Ñохранение.
+ </notification>
+ <notification name="GestureSaveFailedTryAgain">
+ Ðе удалоÑÑŒ Ñохранить жеÑÑ‚. Повторите попытку через минуту.
+ </notification>
+ <notification name="GestureSaveFailedObjectNotFound">
+ Ðе удалоÑÑŒ Ñохранить жеÑÑ‚: не найден объект или ÑвÑзанный Ñ Ð½Ð¸Ð¼ инвентарь.
+Возможно, объект находитÑÑ Ð²Ð½Ðµ допуÑтимого диапазона или удален.
+ </notification>
+ <notification name="GestureSaveFailedReason">
+ Ошибка при Ñохранении жеÑта по Ñледующей причине: [REASON]. Попробуйте Ñохранить жеÑÑ‚ через некоторое времÑ.
+ </notification>
+ <notification name="SaveNotecardFailObjectNotFound">
+ Ðе удалоÑÑŒ Ñохранить заметку: не найден объект или ÑвÑзанный Ñ Ð½Ð¸Ð¼ инвентарь.
+Возможно, объект находитÑÑ Ð²Ð½Ðµ допуÑтимого диапазона или удален.
+ </notification>
+ <notification name="SaveNotecardFailReason">
+ Ошибка при Ñохранении заметки по Ñледующей причине: [REASON]. Попробуйте Ñохранить заметку через некоторое времÑ.
+ </notification>
+ <notification name="ScriptCannotUndo">
+ Ðе удалоÑÑŒ отменить вÑе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² вашей верÑии Ñкрипта.
+Загрузить поÑледнюю Ñохраненную на Ñервере верÑию?
+(**Предупреждение** Эту операцию Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ.)
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="SaveScriptFailReason">
+ Ошибка при Ñохранении Ñкрипта по Ñледующей причине: [REASON]. Попробуйте Ñохранить Ñкрипт через некоторое времÑ.
+ </notification>
+ <notification name="SaveScriptFailObjectNotFound">
+ Ðе удалоÑÑŒ Ñохранить Ñкрипт: не найден объект, в котором он находитÑÑ.
+Возможно, объект находитÑÑ Ð²Ð½Ðµ допуÑтимого диапазона или удален.
+ </notification>
+ <notification name="SaveBytecodeFailReason">
+ Ошибка при Ñохранении Ñкомпилированного Ñкрипта по Ñледующей причине: [REASON]. Попробуйте Ñохранить Ñкрипт через некоторое времÑ.
+ </notification>
+ <notification name="StartRegionEmpty">
+ Ðй-Ñй-Ñй, ваш Ñтартовый регион не определен.
+Введите название региона в поле «МеÑто Ñтарта» или выберите в качеÑтве меÑта Ñтарта «Мое поÑледнее меÑтоположение» или «Мой дом».
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="CouldNotStartStopScript">
+ Ðе удаетÑÑ Ð·Ð°Ð¿ÑƒÑтить или оÑтановить Ñкрипт: не найден объект, в котором он находитÑÑ.
+Возможно, объект находитÑÑ Ð²Ð½Ðµ допуÑтимого диапазона или удален.
+ </notification>
+ <notification name="CannotDownloadFile">
+ Ðевозможно загрузить файл
+ </notification>
+ <notification name="CannotWriteFile">
+ Ðевозможно запиÑать файл [[FILE]]
+ </notification>
+ <notification name="UnsupportedHardware">
+ К вашему Ñведению: ваш компьютер не ÑоответÑтвует минимальным ÑиÑтемным требованиÑм [APP_NAME]. Это может привеÑти к Ñнижению производительноÑти. К Ñожалению, [SUPPORT_SITE] не оказывает техничеÑкую поддержку Ð´Ð»Ñ Ð½ÐµÐ¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÐµÐ¼Ñ‹Ñ… конфигураций ÑиÑтем.
+
+Ðайти более подробную информацию на [_URL]?
+ <url name="url">
+ http://www.secondlife.com/corporate/sysreqs.php
+ </url>
+ <usetemplate ignoretext="Оборудование моего компьютера не поддерживаетÑÑ" name="okcancelignore" notext="Ðет" yestext="Да"/>
+ </notification>
+ <notification name="UnknownGPU">
+ Ð’ вашей ÑиÑтеме уÑтановлена графичеÑÐºÐ°Ñ ÐºÐ°Ñ€Ñ‚Ð°, которую [APP_NAME] не может раÑпознать.
+Так чаÑто бывает, еÑли новое оборудование еще не было проверено на работу Ñ [APP_NAME]. Скорее вÑего, оно будет работать нормально, но, возможно, придетÑÑ Ð¾Ñ‚Ñ€ÐµÐ³ÑƒÐ»Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ параметры графики.
+(Я &gt; ÐаÑтройки &gt; Графика).
+ <form name="form">
+ <ignore name="ignore" text="Ðе удаетÑÑ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ð¸Ñ‚ÑŒ мою графичеÑкую карту"/>
+ </form>
+ </notification>
+ <notification name="DisplaySettingsNoShaders">
+ Произошел Ñбой [APP_NAME] при инициализации графичеÑкого драйвера.
+Будет уÑтановлено низкое качеÑтво графики, чтобы избежать некоторых раÑпроÑтраненных ошибок графики. При Ñтом некоторые графичеÑкие функции не будут работать.
+Рекомендуем обновить драйверы графичеÑкой карты.
+ПовыÑить качеÑтво графики можно в меню «ÐаÑтройки &gt; Графика».
+ </notification>
+ <notification name="RegionNoTerraforming">
+ В регионе [REGION] не разрешен терраформинг.
+ </notification>
+ <notification name="CannotCopyWarning">
+ У Ð²Ð°Ñ Ð½ÐµÑ‚ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð½Ð° копирование Ñледующих предметов:
+[ITEMS]
+ЕÑли вы отдадите Ñти вещи, их больше не будет в вашем инвентаре. Ð’Ñ‹ дейÑтвительно хотите предложить Ñти предметы?
+ <usetemplate name="okcancelbuttons" notext="Ðет" yestext="Да"/>
+ </notification>
+ <notification name="CannotGiveItem">
+ Ðевозможно отдать предмет из инвентарÑ.
+ </notification>
+ <notification name="TransactionCancelled">
+ Сделка отменена.
+ </notification>
+ <notification name="TooManyItems">
+ ÐÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‚ÑŒ более 42 предметов за одну переÑылку.
+ </notification>
+ <notification name="NoItems">
+ У Ð²Ð°Ñ Ð½ÐµÑ‚ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð½Ð° передачу выбранных предметов.
+ </notification>
+ <notification name="CannotCopyCountItems">
+ У Ð²Ð°Ñ Ð½ÐµÑ‚ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð½Ð° копирование [COUNT] выбранных предметов. Эти предметы иÑчезнут из вашего инвентарÑ.
+Ð’Ñ‹ дейÑтвительно хотите отдать их?
+ <usetemplate name="okcancelbuttons" notext="Ðет" yestext="Да"/>
+ </notification>
+ <notification name="CannotGiveCategory">
+ У Ð²Ð°Ñ Ð½ÐµÑ‚ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð½Ð° передачу выбранной папки.
+ </notification>
+ <notification name="FreezeAvatar">
+ Заморозить Ñтот аватар?
+У него временно иÑчезнет ÑпоÑобноÑÑ‚ÑŒ перемещатьÑÑ, говорить и взаимодейÑтвовать Ñ Ð¼Ð¸Ñ€Ð¾Ð¼.
+ <usetemplate canceltext="Отмена" name="yesnocancelbuttons" notext="Разморозить" yestext="Заморозить"/>
+ </notification>
+ <notification name="FreezeAvatarFullname">
+ Заморозить [AVATAR_NAME]?
+У него временно иÑчезнет ÑпоÑобноÑÑ‚ÑŒ перемещатьÑÑ, говорить и взаимодейÑтвовать Ñ Ð¼Ð¸Ñ€Ð¾Ð¼.
+ <usetemplate canceltext="Отмена" name="yesnocancelbuttons" notext="Разморозить" yestext="Заморозить"/>
+ </notification>
+ <notification name="EjectAvatarFullname">
+ Выкинуть [AVATAR_NAME] Ñ Ð²Ð°ÑˆÐµÐ¹ земли?
+ <usetemplate canceltext="Отмена" name="yesnocancelbuttons" notext="Выкинуть и запретить доÑтуп" yestext="Выкинуть"/>
+ </notification>
+ <notification name="EjectAvatarNoBan">
+ Выкинуть Ñтот аватар Ñ Ð²Ð°ÑˆÐµÐ¹ земли?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="Выкинуть"/>
+ </notification>
+ <notification name="EjectAvatarFullnameNoBan">
+ Выкинуть [AVATAR_NAME] Ñ Ð²Ð°ÑˆÐµÐ¹ земли?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="Выкинуть"/>
+ </notification>
+ <notification name="EjectAvatarFromGroup">
+ Ð’Ñ‹ иÑключили аватар [AVATAR_NAME] из группы [GROUP_NAME]
+ </notification>
+ <notification name="AcquireErrorTooManyObjects">
+ ОШИБКРПРИОБРЕТЕÐИЯ: выбрано Ñлишком много объектов.
+ </notification>
+ <notification name="AcquireErrorObjectSpan">
+ ОШИБКРПРИОБРЕТЕÐИЯ: объекты охватывают более одного региона.
+ПеремеÑтите вÑе приобретаемые объекты в один регион.
+ </notification>
+ <notification name="PromptGoToCurrencyPage">
+ [EXTRA]
+
+Ðайти информацию по покупке L$ на [_URL]?
+ <url name="url">
+ http://secondlife.com/app/currency/
+ </url>
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="UnableToLinkObjects">
+ Ðевозможно объединить Ñти [COUNT] объектов.
+Можно объединÑÑ‚ÑŒ не более [MAX] объектов.
+ </notification>
+ <notification name="CannotLinkIncompleteSet">
+ Можно объединÑÑ‚ÑŒ только полные наборы объектов, и Ð´Ð»Ñ Ñтого Ñледует выбрать более одного объекта.
+ </notification>
+ <notification name="CannotLinkModify">
+ Ðевозможно объединить объекты: у Ð²Ð°Ñ Ð½ÐµÑ‚ прав на изменение вÑех объектов.
+
+УбедитеÑÑŒ, что вÑе объекты разблокированы и что вы владеете вÑеми ими.
+ </notification>
+ <notification name="CannotLinkDifferentOwners">
+ Ðевозможно объединить объекты: не у вÑех объектов один владелец.
+
+УбедитеÑÑŒ, что вы владеете вÑеми выбранными объектами.
+ </notification>
+ <notification name="NoFileExtension">
+ У файла отÑутÑтвует раÑширение: «[FILE]»
+
+УбедитеÑÑŒ, что файл имеет правильное раÑширение.
+ </notification>
+ <notification name="InvalidFileExtension">
+ Ðеверное раÑширение файла [EXTENSION]
+ОжидаетÑÑ [VALIDS]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="CannotUploadSoundFile">
+ Ðе удалоÑÑŒ открыть Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð·Ð°Ð³Ñ€ÑƒÐ¶ÐµÐ½Ð½Ñ‹Ð¹ звуковой файл:
+[FILE]
+ </notification>
+ <notification name="SoundFileNotRIFF">
+ По-видимому, Ñто не файл RIFF WAVE:
+[FILE]
+ </notification>
+ <notification name="SoundFileNotPCM">
+ По-видимому, Ñто не звуковой файл PCM WAVE:
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidChannelCount">
+ Ð’ файле неправильное количеÑтво каналов (должно быть моно или Ñтерео):
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidSampleRate">
+ По-видимому, файл не имеет поддерживаемой чаÑтоты диÑкретизации (должна быть 44,1 кГц):
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidWordSize">
+ По-видимому, в файле иÑпользуетÑÑ Ð½ÐµÐ¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÐµÐ¼Ñ‹Ð¹ размер Ñлова (должен быть 8 или 16 бит):
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidHeader">
+ Ðе найден фрагмент «data» в заголовке WAV-файла:
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidChunkSize">
+ Ðеправильный размер фрагмента в WAV-файле:
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidTooLong">
+ Ðудиофайл Ñлишком длинный (макÑимум 10 Ñекунд):
+[FILE]
+ </notification>
+ <notification name="ProblemWithFile">
+ Проблема Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð¼ [FILE]:
+
+[ERROR]
+ </notification>
+ <notification name="CannotOpenTemporarySoundFile">
+ Ðе удалоÑÑŒ открыть Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи временно Ñжатый звуковой файл: [FILE]
+ </notification>
+ <notification name="UnknownVorbisEncodeFailure">
+ ÐеизвеÑÑ‚Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° кодировки Vorbis в файле: [FILE]
+ </notification>
+ <notification name="CannotEncodeFile">
+ Ðевозможно закодировать файл: [FILE]
+ </notification>
+ <notification name="CorruptedProtectedDataStore">
+ Ðевозможно ввеÑти ваши Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸ пароль. Возможно, вы изменили наÑтройки Ñети.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="CorruptResourceFile">
+ Поврежден файл реÑурÑов: [FILE]
+ </notification>
+ <notification name="UnknownResourceFileVersion">
+ ÐеизвеÑÑ‚Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ñ„Ð°Ð¹Ð»Ð° реÑурÑов Linden: [FILE]
+ </notification>
+ <notification name="UnableToCreateOutputFile">
+ Ðевозможно Ñоздать выходной файл: [FILE]
+ </notification>
+ <notification name="DoNotSupportBulkAnimationUpload">
+ [APP_NAME] пока не поддерживает маÑÑовую передачу файлов анимации формата BVH.
+ </notification>
+ <notification name="CannotUploadReason">
+ Ðевозможно передать [FILE] по Ñледующей причине: [REASON]
+Повторите попытку позже.
+ </notification>
+ <notification name="LandmarkCreated">
+ Ð’Ñ‹ добавили закладку «[LANDMARK_NAME]» в Ñвою папку [FOLDER_NAME].
+ </notification>
+ <notification name="LandmarkAlreadyExists">
+ Ðа Ñто меÑто уже поÑтавлена закладка.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="CannotCreateLandmarkNotOwner">
+ Ð’Ñ‹ не можете поÑтавить здеÑÑŒ закладку: владелец земли не разрешает Ñтого.
+ </notification>
+ <notification name="CannotRecompileSelectObjectsNoScripts">
+ Ðевозможно произвеÑти перекомпилÑцию.
+Выберите объект Ñо Ñценарием.
+ </notification>
+ <notification name="CannotRecompileSelectObjectsNoPermission">
+ Ðевозможно произвеÑти перекомпилÑцию.
+
+Выберите объекты Ñо ÑценариÑми, которые вам разрешено изменÑÑ‚ÑŒ.
+ </notification>
+ <notification name="CannotResetSelectObjectsNoScripts">
+ Ðевозможно произвеÑти ÑброÑ.
+
+Выберите объекты Ñо ÑценариÑми.
+ </notification>
+ <notification name="CannotResetSelectObjectsNoPermission">
+ Ðевозможно произвеÑти ÑброÑ.
+
+Выберите объекты Ñо ÑценариÑми, которые вам разрешено изменÑÑ‚ÑŒ.
+ </notification>
+ <notification name="CannotOpenScriptObjectNoMod">
+ Ðевозможно открыть Ñкрипт в объекте Ñ Ð·Ð°Ð¿Ñ€ÐµÑ‰ÐµÐ½Ð½Ñ‹Ð¼ изменением.
+ </notification>
+ <notification name="CannotSetRunningSelectObjectsNoScripts">
+ Ðевозможно запуÑтить Ñкрипты.
+
+Выберите объекты Ñо ÑценариÑми.
+ </notification>
+ <notification name="CannotSetRunningNotSelectObjectsNoScripts">
+ Ðевозможно оÑтановить Ñкрипты.
+
+Выберите объекты Ñо ÑценариÑми.
+ </notification>
+ <notification name="NoFrontmostFloater">
+ Ðет Ñамого переднего окна Ð´Ð»Ñ ÑохранениÑ.
+ </notification>
+ <notification name="SeachFilteredOnShortWords">
+ Ваш поиÑковый Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð±Ñ‹Ð» изменен, и Ñлишком короткие Ñлова были удалены.
+
+Выполнен поиÑк: [FINALQUERY]
+ </notification>
+ <notification name="SeachFilteredOnShortWordsEmpty">
+ Ваша поиÑÐºÐ¾Ð²Ð°Ñ Ñ„Ñ€Ð°Ð·Ð° была Ñлишком короткой. ПоиÑк не был выполнен.
+ </notification>
+ <notification name="CouldNotTeleportReason">
+ Ошибка телепортации.
+[REASON]
+ </notification>
+ <notification name="invalid_tport">
+ При запроÑе телепортации возникла проблема. Возможно, Ð´Ð»Ñ Ñ‚ÐµÐ»ÐµÐ¿Ð¾Ñ€Ñ‚Ð°Ñ†Ð¸Ð¸ придетÑÑ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð¸Ñ‚ÑŒ вход в программу.
+ЕÑли данное Ñообщение повторитÑÑ, поÑетите Ñайт [SUPPORT_SITE].
+ </notification>
+ <notification name="invalid_region_handoff">
+ При переÑечении границы региона возникла проблема. Возможно, Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÑÐµÑ‡ÐµÐ½Ð¸Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ñ‹ придетÑÑ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð¸Ñ‚ÑŒ вход в программу.
+ЕÑли данное Ñообщение повторитÑÑ, поÑетите Ñайт [SUPPORT_SITE].
+ </notification>
+ <notification name="blocked_tport">
+ Ð¢ÐµÐ»ÐµÐ¿Ð¾Ñ€Ñ‚Ð°Ñ†Ð¸Ñ ÑÐµÐ¹Ñ‡Ð°Ñ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð°. Повторите попытку позже. ЕÑли вÑе равно не удаетÑÑ Ñ‚ÐµÐ»ÐµÐ¿Ð¾Ñ€Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒÑÑ, выйдите из программы и войдите Ñнова, чтобы уÑтранить проблему.
+ </notification>
+ <notification name="nolandmark_tport">
+ СиÑтеме не удалоÑÑŒ определить пункт Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ»Ð°Ð´ÐºÐ¸.
+ </notification>
+ <notification name="timeout_tport">
+ СиÑтеме не удалоÑÑŒ выполнить подключение телепорта. Повторите попытку позже.
+ </notification>
+ <notification name="noaccess_tport">
+ У Ð²Ð°Ñ Ð½ÐµÑ‚ доÑтупа в пункт Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ñтого телепорта.
+ </notification>
+ <notification name="missing_attach_tport">
+ Ваши приÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ ÐµÑ‰Ðµ не доÑтавлены. Подождите неÑколько Ñекунд либо выйдите из программы и войдите Ñнова, прежде чем повторить попытку телепортации.
+ </notification>
+ <notification name="too_many_uploads_tport">
+ Очередь активов в данном регионе заполнена, поÑтому ваш Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° телепортацию не будет выполнен Ñвоевременно. Повторите попытку через неÑколько минут или перейдите в менее загруженный регион.
+ </notification>
+ <notification name="expired_tport">
+ СиÑтеме не удалоÑÑŒ Ñвоевременно выполнить ваш Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° телепортацию. Повторите попытку через неÑколько минут.
+ </notification>
+ <notification name="expired_region_handoff">
+ СиÑтеме не удалоÑÑŒ Ñвоевременно выполнить ваше переÑечение границы. Повторите попытку через неÑколько минут.
+ </notification>
+ <notification name="no_host">
+ Ðе удалоÑÑŒ найти точку Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ñ‚ÐµÐ»ÐµÐ¿Ð¾Ñ€Ñ‚Ð°. Возможно, пункт Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ð¾ недоÑтупен или уже не ÑущеÑтвует. Повторите попытку через неÑколько минут.
+ </notification>
+ <notification name="no_inventory_host">
+ СиÑтема Ð¸Ð½Ð²ÐµÐ½Ñ‚Ð°Ñ€Ñ ÑÐµÐ¹Ñ‡Ð°Ñ Ð½ÐµÐ´Ð¾Ñтупна.
+ </notification>
+ <notification name="CannotSetLandOwnerNothingSelected">
+ Ðевозможно назначить владельца земли:
+УчаÑток не выбран.
+ </notification>
+ <notification name="CannotSetLandOwnerMultipleRegions">
+ Ðевозможно уÑтановить владение над землей, потому что выделение захватывает неÑколько регионов. Выберите меньшую облаÑÑ‚ÑŒ и повторите попытку.
+ </notification>
+ <notification name="ForceOwnerAuctionWarning">
+ Этот учаÑток выÑтавлен на аукцион. При попытке завладеть землей аукцион будет отменен и, возможно, некоторые жители понеÑут ущерб, еÑли Ñтавки уже были Ñделаны.
+Завладеть?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="CannotContentifyNothingSelected">
+ Ðевозможно удовлетворить требование:
+УчаÑток не выбран.
+ </notification>
+ <notification name="CannotContentifyNoRegion">
+ Ðевозможно удовлетворить требование:
+Регион не выбран.
+ </notification>
+ <notification name="CannotReleaseLandNothingSelected">
+ Ðевозможно отказатьÑÑ Ð¾Ñ‚ земли:
+УчаÑток не выбран.
+ </notification>
+ <notification name="CannotReleaseLandNoRegion">
+ Ðевозможно отказатьÑÑ Ð¾Ñ‚ земли:
+Регион не найден.
+ </notification>
+ <notification name="CannotBuyLandNothingSelected">
+ Ðевозможно купить землю:
+УчаÑток не выбран.
+ </notification>
+ <notification name="CannotBuyLandNoRegion">
+ Ðевозможно купить землю:
+Ðе удаетÑÑ Ð½Ð°Ð¹Ñ‚Ð¸ регион, в котором находитÑÑ Ñта землÑ.
+ </notification>
+ <notification name="CannotCloseFloaterBuyLand">
+ ÐÐµÐ»ÑŒÐ·Ñ Ð·Ð°ÐºÑ€Ñ‹Ñ‚ÑŒ окно покупки земли, пока [APP_NAME] определÑет ÑтоимоÑÑ‚ÑŒ Ñтой транзакции.
+ </notification>
+ <notification name="CannotDeedLandNothingSelected">
+ Ðевозможно передать землю:
+УчаÑток не выбран.
+ </notification>
+ <notification name="CannotDeedLandNoGroup">
+ Ðевозможно передать землю:
+Группа не выбрана.
+ </notification>
+ <notification name="CannotDeedLandNoRegion">
+ Ðевозможно передать землю:
+Ðе удаетÑÑ Ð½Ð°Ð¹Ñ‚Ð¸ регион, в котором находитÑÑ Ñта землÑ.
+ </notification>
+ <notification name="CannotDeedLandMultipleSelected">
+ Ðевозможно передать землю:
+Выбрано неÑколько учаÑтков.
+
+Попробуйте выбрать один учаÑток.
+ </notification>
+ <notification name="CannotDeedLandWaitingForServer">
+ Ðевозможно передать землю:
+Ожидание, пока Ñервер Ñообщит о владении.
+
+Повторите попытку.
+ </notification>
+ <notification name="CannotDeedLandNoTransfer">
+ Ðевозможно передать землю:
+В регионе [REGION] не разрешена передача земли.
+ </notification>
+ <notification name="CannotReleaseLandWatingForServer">
+ Ðевозможно отказатьÑÑ Ð¾Ñ‚ земли:
+Ожидание, пока Ñервер обновит информацию об учаÑтке.
+
+Повторите попытку через неÑколько Ñекунд.
+ </notification>
+ <notification name="CannotReleaseLandSelected">
+ Ðевозможно отказатьÑÑ Ð¾Ñ‚ земли:
+Ð’Ñ‹ не владеете вÑеми выбранными учаÑтками.
+
+Выберите один учаÑток.
+ </notification>
+ <notification name="CannotReleaseLandDontOwn">
+ Ðевозможно отказатьÑÑ Ð¾Ñ‚ земли:
+У Ð²Ð°Ñ Ð½ÐµÑ‚ прав на оÑвобождение Ñтого учаÑтка.
+УчаÑтки, которыми вы владеете, показаны зеленым цветом.
+ </notification>
+ <notification name="CannotReleaseLandRegionNotFound">
+ Ðевозможно отказатьÑÑ Ð¾Ñ‚ земли:
+Ðе удаетÑÑ Ð½Ð°Ð¹Ñ‚Ð¸ регион, в котором находитÑÑ Ñта землÑ.
+ </notification>
+ <notification name="CannotReleaseLandNoTransfer">
+ Ðевозможно отказатьÑÑ Ð¾Ñ‚ земли:
+В регионе [REGION] не разрешена передача земли.
+ </notification>
+ <notification name="CannotReleaseLandPartialSelection">
+ Ðевозможно отказатьÑÑ Ð¾Ñ‚ земли:
+Чтобы оÑвободить учаÑток, нужно выбрать его целиком.
+
+Выберите веÑÑŒ учаÑток или Ñначала разделите его.
+ </notification>
+ <notification name="ReleaseLandWarning">
+ Ð’Ñ‹ ÑобираетеÑÑŒ отказатьÑÑ Ð¾Ñ‚ [AREA] м² земли.
+При оÑвобождении Ñтого учаÑтка он будет иÑключен из ваших владений, но не принеÑет вам L$.
+
+ОÑвободить Ñту землю?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="CannotDivideLandNothingSelected">
+ Ðевозможно разделить землю:
+
+УчаÑтки не выбраны.
+ </notification>
+ <notification name="CannotDivideLandPartialSelection">
+ Ðевозможно разделить землю:
+
+Выбран веÑÑŒ учаÑток.
+Попробуйте выбрать чаÑÑ‚ÑŒ учаÑтка.
+ </notification>
+ <notification name="LandDivideWarning">
+ Разделение Ñтой земли приведет к разделению учаÑтка надвое, и Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ учаÑтка можно будет задать отдельные наÑтройки. Ðекоторые наÑтройки поÑле Ñ€Ð°Ð·Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ возвращены к значениÑм по умолчанию.
+
+Разделить землю?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="CannotDivideLandNoRegion">
+ Ðевозможно разделить землю:
+Ðе удаетÑÑ Ð½Ð°Ð¹Ñ‚Ð¸ регион, в котором находитÑÑ Ñта землÑ.
+ </notification>
+ <notification name="CannotJoinLandNoRegion">
+ Ðевозможно объединить землю:
+Ðе удаетÑÑ Ð½Ð°Ð¹Ñ‚Ð¸ регион, в котором находитÑÑ Ñта землÑ.
+ </notification>
+ <notification name="CannotJoinLandNothingSelected">
+ Ðевозможно объединить землю:
+УчаÑтки не выбраны.
+ </notification>
+ <notification name="CannotJoinLandEntireParcelSelected">
+ Ðевозможно объединить землю:
+Выбран только один учаÑток.
+
+Выберите землю на обоих учаÑтках.
+ </notification>
+ <notification name="CannotJoinLandSelection">
+ Ðевозможно объединить землю:
+Следует выбрать более одного учаÑтка.
+
+Выберите землю на обоих учаÑтках.
+ </notification>
+ <notification name="JoinLandWarning">
+ Объединение земли приведет к Ñозданию одного большого учаÑтка изо вÑех учаÑтков, переÑекающих выбранный прÑмоугольник.
+ПотребуетÑÑ ÑброÑить Ð¸Ð¼Ñ Ð¸ наÑтройки нового учаÑтка.
+
+Объединить землю?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmNotecardSave">
+ Эта заметка должна быть Ñохранена до того, как предмет Ñможет быть Ñкопирован или проÑмотрен. Сохранить заметку?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmItemCopy">
+ Копировать Ñтот предмет в ваш инвентарь?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="Копировать"/>
+ </notification>
+ <notification name="ResolutionSwitchFail">
+ Ðе удалоÑÑŒ Ñменить разрешение на [RESX] Ñ… [RESY]
+ </notification>
+ <notification name="ErrorUndefinedGrasses">
+ Ошибка. Ðе определена трава: [SPECIES]
+ </notification>
+ <notification name="ErrorUndefinedTrees">
+ Ошибка. Ðе определены деревьÑ: [SPECIES]
+ </notification>
+ <notification name="CannotSaveWearableOutOfSpace">
+ Ðевозможно Ñохранить «[NAME]» в файл одежды. ОÑвободите меÑто на компьютере и Ñохраните одежду Ñнова.
+ </notification>
+ <notification name="CannotSaveToAssetStore">
+ Ðевозможно Ñохранить «[NAME]» в центральном хранилище активов.
+Обычно Ñто Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð½ÐµÐ¿Ð¾Ð»Ð°Ð´ÐºÐ°. ИÑправьте наÑтройки и Ñохраните одежду Ñнова через неÑколько минут.
+ </notification>
+ <notification name="YouHaveBeenLoggedOut">
+ Черт! Ð’Ð°Ñ Ð²Ñ‹ÐºÐ¸Ð½ÑƒÐ»Ð¾ из [SECOND_LIFE]
+ [MESSAGE]
+ <usetemplate name="okcancelbuttons" notext="Выйти" yestext="ПроÑмотреть IM и чат"/>
+ </notification>
+ <notification name="OnlyOfficerCanBuyLand">
+ Ðевозможно купить землю Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹:
+У Ð²Ð°Ñ Ð½ÐµÑ‚ прав на покупку земли Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ¹ активной группы.
+ </notification>
+ <notification label="Добавить друга" name="AddFriendWithMessage">
+ Ð”Ñ€ÑƒÐ·ÑŒÑ Ð¼Ð¾Ð³ÑƒÑ‚ давать Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¾Ñ‚ÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ñвоего Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð½Ð° карте и приема обновлений ÑтатуÑа в Ñети.
+
+Предложить дружбу жителю [NAME]?
+ <form name="form">
+ <input name="message">
+ Хочешь быть моим другом?
+ </input>
+ <button name="Offer" text="OK"/>
+ <button name="Cancel" text="Отмена"/>
+ </form>
+ </notification>
+ <notification label="Сохранить коÑтюм" name="SaveOutfitAs">
+ Сохранить текущую одежду как новый коÑтюм:
+ <form name="form">
+ <input name="message">
+ [DESC] (новый)
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Отмена"/>
+ </form>
+ </notification>
+ <notification label="Сохранить одежду?" name="SaveWearableAs">
+ Сохранить предмет в инвентаре как:
+ <form name="form">
+ <input name="message">
+ [DESC] (новый)
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Отмена"/>
+ </form>
+ </notification>
+ <notification label="Переименовать коÑтюм" name="RenameOutfit">
+ Ðовое название коÑтюма:
+ <form name="form">
+ <input name="new_name">
+ [NAME]
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Отмена"/>
+ </form>
+ </notification>
+ <notification name="RemoveFromFriends">
+ Удалить Ð¶Ð¸Ñ‚ÐµÐ»Ñ &lt;nolink&gt;[NAME]&lt;/nolink&gt; из вашего ÑпиÑка друзей?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="RemoveMultipleFromFriends">
+ Удалить неÑкольких жителей из вашего ÑпиÑка друзей?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="GodDeleteAllScriptedPublicObjectsByUser">
+ Ð’Ñ‹ дейÑтвительно хотите удалить вÑе Ñкриптовые объекты, принадлежащие
+** [AVATAR_NAME] **
+на вÑей оÑтальной земле в Ñтом ÑимулÑторе?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="GodDeleteAllScriptedObjectsByUser">
+ Ð’Ñ‹ дейÑтвительно хотите УДÐЛИТЬ ВСЕ Ñкриптовые объекты, принадлежащие
+** [AVATAR_NAME] **
+на ВСЕЙ ЗЕМЛЕ в Ñтом ÑимулÑторе?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="GodDeleteAllObjectsByUser">
+ Ð’Ñ‹ дейÑтвительно хотите УДÐЛИТЬ ВСЕ объекты (Ñкриптовые и прочие), принадлежащие
+** [AVATAR_NAME] **
+на ВСЕЙ ЗЕМЛЕ в Ñтом ÑимулÑторе?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="BlankClassifiedName">
+ Ðеобходимо указать Ð¸Ð¼Ñ Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ¹ рекламы.
+ </notification>
+ <notification name="MinClassifiedPrice">
+ СтоимоÑÑ‚ÑŒ Ñ€Ð°Ð·Ð¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ñ€ÐµÐºÐ»Ð°Ð¼Ñ‹ должна быть как минимум L$[MIN_PRICE].
+
+Введите более выÑокую цену.
+ </notification>
+ <notification name="ConfirmItemDeleteHasLinks">
+ ИмеетÑÑ ÑÑылка, ÑƒÐºÐ°Ð·Ñ‹Ð²Ð°ÑŽÑ‰Ð°Ñ ÐºÐ°Ðº минимум на один из выбранных вами предметов. ЕÑли удалить Ñтот предмет, его ÑÑылки переÑтанут работать. ÐаÑтоÑтельно рекомендуетÑÑ Ñначала удалить ÑÑылки.
+
+ДейÑтвительно удалить Ñти предметы?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteLock">
+ Как минимум один из выбранных вами предметов ÑвлÑетÑÑ Ñ„Ð¸ÐºÑированным.
+
+ДейÑтвительно удалить Ñти предметы?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteNoCopy">
+ Как минимум один из выбранных вами предметов не ÑвлÑетÑÑ ÐºÐ¾Ð¿Ð¸Ñ€ÑƒÐµÐ¼Ñ‹Ð¼.
+
+ДейÑтвительно удалить Ñти предметы?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteNoOwn">
+ Как минимум один из выбранных вами предметов не принадлежит вам.
+
+ДейÑтвительно удалить Ñти предметы?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteLockNoCopy">
+ Как минимум один объект фикÑирован.
+Как минимум один объект не копируемый.
+
+ДейÑтвительно удалить Ñти предметы?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteLockNoOwn">
+ Как минимум один объект фикÑирован.
+Вы не владеете по крайней мере одним объектом.
+
+ДейÑтвительно удалить Ñти предметы?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteNoCopyNoOwn">
+ Как минимум один объект не копируемый.
+Вы не владеете по крайней мере одним объектом.
+
+ДейÑтвительно удалить Ñти предметы?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteLockNoCopyNoOwn">
+ Как минимум один объект фикÑирован.
+Как минимум один объект не копируемый.
+Вы не владеете по крайней мере одним объектом.
+
+ДейÑтвительно удалить Ñти предметы?
+ <usetemplate name="okcancelbuttons" notext="отмена" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectTakeLock">
+ Как минимум один объект фикÑирован.
+
+ДейÑтвительно взÑÑ‚ÑŒ Ñти предметы?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectTakeNoOwn">
+ Ð’Ñ‹ не ÑвлÑетеÑÑŒ владельцем вÑех объектов, которые ÑобираетеÑÑŒ взÑÑ‚ÑŒ.
+ЕÑли продолжить, будут применены Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ñледующего владельца, которые могут ограничить вашу ÑпоÑобноÑÑ‚ÑŒ изменÑÑ‚ÑŒ или копировать Ñти объекты.
+
+ДейÑтвительно взÑÑ‚ÑŒ Ñти предметы?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectTakeLockNoOwn">
+ Как минимум один объект фикÑирован.
+Ð’Ñ‹ не ÑвлÑетеÑÑŒ владельцем вÑех объектов, которые ÑобираетеÑÑŒ взÑÑ‚ÑŒ.
+ЕÑли продолжить, будут применены Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ñледующего владельца, которые могут ограничить вашу ÑпоÑобноÑÑ‚ÑŒ изменÑÑ‚ÑŒ или копировать Ñти объекты.
+Ð’ то же Ð²Ñ€ÐµÐ¼Ñ Ð²Ñ‹ можете взÑÑ‚ÑŒ объекты, выбранные ÑейчаÑ.
+
+ДейÑтвительно взÑÑ‚ÑŒ Ñти предметы?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="CantBuyLandAcrossMultipleRegions">
+ Ðевозможно купить землю, потому что выделение охватывает неÑколько регионов.
+
+Выберите меньшую облаÑÑ‚ÑŒ и повторите попытку.
+ </notification>
+ <notification name="DeedLandToGroup">
+ ПоÑле передачи Ñтого учаÑтка группе потребуетÑÑ Ð´Ð¾Ñтаточное количеÑтво финанÑов Ð´Ð»Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¸ данной земли.
+СтоимоÑÑ‚ÑŒ покупки земли не возвращаетÑÑ Ð²Ð»Ð°Ð´ÐµÐ»ÑŒÑ†Ñƒ. ЕÑли переданный учаÑток продаетÑÑ, выручка за нее равномерно раÑпределÑетÑÑ Ð¼ÐµÐ¶Ð´Ñƒ учаÑтниками группы.
+
+Передать Ñти [AREA] м² земли группе «[GROUP_NAME]»?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="DeedLandToGroupWithContribution">
+ ПоÑле передачи Ñтого учаÑтка группе потребуетÑÑ Ð´Ð¾Ñтаточное количеÑтво финанÑов Ð´Ð»Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¸ данной земли.
+Передача будет включать одновременный земельный Ð²Ð·Ð½Ð¾Ñ Ð² группу от Ð¶Ð¸Ñ‚ÐµÐ»Ñ Â«[NAME]».
+СтоимоÑÑ‚ÑŒ покупки земли не возвращаетÑÑ Ð²Ð»Ð°Ð´ÐµÐ»ÑŒÑ†Ñƒ. ЕÑли переданный учаÑток продаетÑÑ, выручка за нее равномерно раÑпределÑетÑÑ Ð¼ÐµÐ¶Ð´Ñƒ учаÑтниками группы.
+
+Передать Ñти [AREA] м² земли группе «[GROUP_NAME]»?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="DisplaySetToSafe">
+ УÑтановлен безопаÑный уровень наÑтроек отображениÑ, так как указан параметр -safe.
+ </notification>
+ <notification name="DisplaySetToRecommendedGPUChange">
+ УÑтановлен рекомендуемый уровень наÑтроек отображениÑ, так как графичеÑÐºÐ°Ñ ÐºÐ°Ñ€Ñ‚Ð° изменена:
+Ñ Â«[LAST_GPU]»
+на «[THIS_GPU]»
+ </notification>
+ <notification name="DisplaySetToRecommendedFeatureChange">
+ УÑтановлен рекомендуемый уровень наÑтроек отображениÑ, так как подÑиÑтема визуализации изменена.
+ </notification>
+ <notification name="ErrorMessage">
+ [ERROR_MESSAGE]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="AvatarMovedDesired">
+ Требуемое вами меÑтоположение ÑÐµÐ¹Ñ‡Ð°Ñ Ð½ÐµÐ´Ð¾Ñтупно.
+Ð’Ñ‹ перемещены в ÑоÑедний регион.
+ </notification>
+ <notification name="AvatarMovedLast">
+ Ваше поÑледнее меÑтоположение ÑÐµÐ¹Ñ‡Ð°Ñ Ð½ÐµÐ´Ð¾Ñтупно.
+Ð’Ñ‹ перемещены в ÑоÑедний регион.
+ </notification>
+ <notification name="AvatarMovedHome">
+ Ваше домашнее меÑтоположение ÑÐµÐ¹Ñ‡Ð°Ñ Ð½ÐµÐ´Ð¾Ñтупно.
+Ð’Ñ‹ перемещены в ÑоÑедний регион.
+Возможно, потребуетÑÑ Ð·Ð°Ð´Ð°Ñ‚ÑŒ новое домашнее меÑтоположение.
+ </notification>
+ <notification name="ClothingLoading">
+ Ваша одежда вÑе еще загружаетÑÑ.
+Ð’Ñ‹ можете иÑпользовать [SECOND_LIFE] как обычно, другие пользователи будут видеть Ð²Ð°Ñ Ð½Ð¾Ñ€Ð¼Ð°Ð»ÑŒÐ½Ð¾.
+ <form name="form">
+ <ignore name="ignore" text="Загрузка одежды занимает значительное времÑ"/>
+ </form>
+ </notification>
+ <notification name="FirstRun">
+ УÑтановка [APP_NAME] завершена.
+
+ЕÑли вы иÑпользуете [SECOND_LIFE] впервые, Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ð° в программу вам потребуетÑÑ Ñоздать аккаунт.
+ВернутьÑÑ Ð½Ð° [http://join.secondlife.com secondlife.com] Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð°ÐºÐºÐ°ÑƒÐ½Ñ‚Ð°?
+ <usetemplate name="okcancelbuttons" notext="Продолжить" yestext="Создать аккаунт..."/>
+ </notification>
+ <notification name="LoginPacketNeverReceived">
+ Возникли неполадки при подключении. Возможно, проблема Ñ Ð²Ð°ÑˆÐ¸Ð¼ подключением к интернету или [SECOND_LIFE_GRID].
+
+Варианты ваших дейÑтвий: проверьте подключение к интернету и повторите попытку через неÑколько минут, нажмите кнопку «Справка» Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÑ…Ð¾Ð´Ð° к [SUPPORT_SITE] или кнопку «ТелепортациÑ», чтобы телепортироватьÑÑ Ð´Ð¾Ð¼Ð¾Ð¹.
+ <url name="url">
+ http://secondlife.com/support/
+ </url>
+ <form name="form">
+ <button name="OK" text="OK"/>
+ <button name="Help" text="Справка"/>
+ <button name="Teleport" text="ТелепортациÑ"/>
+ </form>
+ </notification>
+ <notification name="WelcomeChooseSex">
+ Ваш перÑонаж поÑвитÑÑ Ñ‡ÐµÑ€ÐµÐ· мгновение.
+
+Ð”Ð»Ñ Ñ…Ð¾Ð´ÑŒÐ±Ñ‹ нажимайте клавиши Ñо Ñтрелками.
+Ð’ любой момент можно нажать клавишу F1 Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ñправки или информации о [SECOND_LIFE].
+Выберите мужÑкой или женÑкий аватар. Этот выбор затем можно будет изменить.
+ <usetemplate name="okcancelbuttons" notext="Женщина" yestext="Мужчина"/>
+ </notification>
+ <notification name="CantTeleportToGrid">
+ Ðе удалоÑÑŒ телепортироватьÑÑ Ð² [SLURL]: Ñто меÑто находитÑÑ Ð½Ð° другой Ñетке ([GRID]), а не на текущей ([CURRENT_GRID]). Закройте программу и попробуйте еще раз.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="GeneralCertificateError">
+ Ðе удалоÑÑŒ подключитьÑÑ Ðº Ñерверу.
+[REASON]
+
+Тема: [SUBJECT_NAME_STRING]
+Издатель: [ISSUER_NAME_STRING]
+ДейÑтвительно Ñ: [VALID_FROM]
+ДейÑтвительно по: [VALID_TO]
+Отпечаток MD5: [SHA1_DIGEST]
+Отпечаток SHA1: [MD5_DIGEST]
+ИÑпользование ключа: [KEYUSAGE]
+РаÑширенное иÑпользование ключа: [EXTENDEDKEYUSAGE]
+Идентификатор ключа темы: [SUBJECTKEYIDENTIFIER]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="TrustCertificateError">
+ Центр Ñертификации Ð´Ð»Ñ Ñтого Ñервера неизвеÑтен.
+
+Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ Ñертификате:
+Тема: [SUBJECT_NAME_STRING]
+Издатель: [ISSUER_NAME_STRING]
+ДейÑтвительно Ñ: [VALID_FROM]
+ДейÑтвительно по: [VALID_TO]
+Отпечаток MD5: [SHA1_DIGEST]
+Отпечаток SHA1: [MD5_DIGEST]
+ИÑпользование ключа: [KEYUSAGE]
+РаÑширенное иÑпользование ключа: [EXTENDEDKEYUSAGE]
+Идентификатор ключа темы: [SUBJECTKEYIDENTIFIER]
+
+ДоверÑÑ‚ÑŒ Ñтому центру Ñертификации?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="ДоверÑÑ‚ÑŒ"/>
+ </notification>
+ <notification name="NotEnoughCurrency">
+ [NAME] L$ [PRICE] У Ð²Ð°Ñ Ð½ÐµÐ´Ð¾Ñтаточно L$ Ð´Ð»Ñ Ñтого.
+ </notification>
+ <notification name="GrantedModifyRights">
+ [NAME] дал(а) вам разрешение на редактирование Ñвоих объектов.
+ </notification>
+ <notification name="RevokedModifyRights">
+ Ваше право на изменение объектов [NAME] отозвано
+ </notification>
+ <notification name="FlushMapVisibilityCaches">
+ КÑши карт данного региона будут очищены.
+Это полезно только Ð´Ð»Ñ Ñ†ÐµÐ»ÐµÐ¹ отладки.
+(Ð’ рабочей верÑии надо подождать 5 минут, затем карта каждого Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð±ÑƒÐ´ÐµÑ‚ обновлена поÑле входа в программу.)
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="BuyOneObjectOnly">
+ ÐÐµÐ»ÑŒÐ·Ñ ÐºÑƒÐ¿Ð¸Ñ‚ÑŒ неÑколько объектов одновременно. Выберите один объект и повторите попытку.
+ </notification>
+ <notification name="OnlyCopyContentsOfSingleItem">
+ ÐÐµÐ»ÑŒÐ·Ñ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ Ñодержимое неÑкольких объектов одновременно.
+Выберите один объект и повторите попытку.
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="KickUsersFromRegion">
+ Телепортировать вÑех жителей в Ñтом регионе домой?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="EstateObjectReturn">
+ Ð’Ñ‹ дейÑтвительно хотите вернуть объекты, принадлежащие [USER_NAME]?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="InvalidTerrainBitDepth">
+ Ðе удалоÑÑŒ задать текÑтуры региона:
+у текÑтуры [TEXTURE_NUM] Ð½ÐµÐ¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð°Ñ Ð±Ð¸Ñ‚Ð¾Ð²Ð°Ñ Ð³Ð»ÑƒÐ±Ð¸Ð½Ð° [TEXTURE_BIT_DEPTH].
+
+Замените текÑтуру [TEXTURE_NUM] на 24-битное изображение размером 512x512 или меньше и Ñнова нажмите кнопку «Применить».
+ </notification>
+ <notification name="InvalidTerrainSize">
+ Ðе удалоÑÑŒ задать текÑтуры региона:
+у текÑтуры [TEXTURE_NUM] Ñлишком большой размер [TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y].
+
+Замените текÑтуру [TEXTURE_NUM] на 24-битное изображение размером 512x512 или меньше и Ñнова нажмите кнопку «Применить».
+ </notification>
+ <notification name="RawUploadStarted">
+ ÐачалаÑÑŒ передача. Она может занÑÑ‚ÑŒ до двух минут, в завиÑимоÑти от ÑкороÑти ÑоединениÑ.
+ </notification>
+ <notification name="ConfirmBakeTerrain">
+ Ð’Ñ‹ дейÑтвительно хотите зафикÑировать текущий ландшафт, Ñделать его выÑоту Ñредней точкой Ð´Ð»Ñ Ð²ÐµÑ€Ñ…Ð½ÐµÐ¹ и нижней точек ландшафта и принÑÑ‚ÑŒ по умолчанию Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸ «Вернуть»?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="MaxAllowedAgentOnRegion">
+ У Ð²Ð°Ñ Ð¼Ð¾Ð¶ÐµÑ‚ быть не более [MAX_AGENTS] допущенных жителей.
+ </notification>
+ <notification name="MaxBannedAgentsOnRegion">
+ У Ð²Ð°Ñ Ð¼Ð¾Ð¶ÐµÑ‚ быть не более [MAX_BANNED] забаненных жителей.
+ </notification>
+ <notification name="MaxAgentOnRegionBatch">
+ Ðе удалоÑÑŒ добавить [NUM_ADDED] агентов:
+превышен лимит [MAX_AGENTS] [LIST_TYPE] на [NUM_EXCESS].
+ </notification>
+ <notification name="MaxAllowedGroupsOnRegion">
+ У Ð²Ð°Ñ Ð¼Ð¾Ð¶ÐµÑ‚ быть не более [MAX_GROUPS] допущенных групп.
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="ЗафикÑировать"/>
+ </notification>
+ <notification name="MaxManagersOnRegion">
+ У Ð²Ð°Ñ Ð¼Ð¾Ð¶ÐµÑ‚ быть не более [MAX_MANAGER] менеджеров землевладениÑ.
+ </notification>
+ <notification name="OwnerCanNotBeDenied">
+ ÐÐµÐ»ÑŒÐ·Ñ Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ‚ÑŒ землевладельца в ÑпиÑок забаненных жителей его же земли.
+ </notification>
+ <notification name="CanNotChangeAppearanceUntilLoaded">
+ ÐÐµÐ»ÑŒÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½ÑÑ‚ÑŒ внешноÑÑ‚ÑŒ, пока загружаютÑÑ Ð¾Ð´ÐµÐ¶Ð´Ð° и фигура.
+ </notification>
+ <notification name="ClassifiedMustBeAlphanumeric">
+ Ðазвание вашей рекламы должно начинатьÑÑ Ñ Ð±ÑƒÐºÐ²Ñ‹ A - Z или цифры. ИÑпользовать знаки Ð¿Ñ€ÐµÐ¿Ð¸Ð½Ð°Ð½Ð¸Ñ Ð½Ðµ разрешено.
+ </notification>
+ <notification name="CantSetBuyObject">
+ Ðевозможно задать покупку объекта, потому что Ñтот объект не Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð°Ð¶Ð¸.
+Задайте продажу объекта и повторите попытку.
+ </notification>
+ <notification name="FinishedRawDownload">
+ Завершена загрузка файла ландшафта:
+[DOWNLOAD_PATH].
+ </notification>
+ <notification name="DownloadWindowsMandatory">
+ ПоÑвилаÑÑŒ Ð½Ð¾Ð²Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ [APP_NAME].
+[MESSAGE]
+Это обновление необходимо загрузить Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ [APP_NAME].
+ <usetemplate name="okcancelbuttons" notext="Выйти" yestext="Загрузить"/>
+ </notification>
+ <notification name="DownloadWindows">
+ ПоÑвилоÑÑŒ обновление Ð´Ð»Ñ [APP_NAME].
+[MESSAGE]
+УÑтанавливать Ñто обновление не обÑзательно, но рекомендуетÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð²Ñ‹ÑˆÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ñти и ÑтабильноÑти.
+ <usetemplate name="okcancelbuttons" notext="Продолжить" yestext="Загрузить"/>
+ </notification>
+ <notification name="DownloadWindowsReleaseForDownload">
+ ПоÑвилоÑÑŒ обновление Ð´Ð»Ñ [APP_NAME].
+[MESSAGE]
+УÑтанавливать Ñто обновление не обÑзательно, но рекомендуетÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð²Ñ‹ÑˆÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ñти и ÑтабильноÑти.
+ <usetemplate name="okcancelbuttons" notext="Продолжить" yestext="Загрузить"/>
+ </notification>
+ <notification name="DownloadLinuxMandatory">
+ ПоÑвилаÑÑŒ Ð½Ð¾Ð²Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ [APP_NAME].
+[MESSAGE]
+Это обновление необходимо загрузить Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ [APP_NAME].
+ <usetemplate name="okcancelbuttons" notext="Выйти" yestext="Загрузить"/>
+ </notification>
+ <notification name="DownloadLinux">
+ ПоÑвилоÑÑŒ обновление Ð´Ð»Ñ [APP_NAME].
+[MESSAGE]
+УÑтанавливать Ñто обновление не обÑзательно, но рекомендуетÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð²Ñ‹ÑˆÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ñти и ÑтабильноÑти.
+ <usetemplate name="okcancelbuttons" notext="Продолжить" yestext="Загрузить"/>
+ </notification>
+ <notification name="DownloadLinuxReleaseForDownload">
+ ПоÑвилоÑÑŒ обновление Ð´Ð»Ñ [APP_NAME].
+[MESSAGE]
+УÑтанавливать Ñто обновление не обÑзательно, но рекомендуетÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð²Ñ‹ÑˆÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ñти и ÑтабильноÑти.
+ <usetemplate name="okcancelbuttons" notext="Продолжить" yestext="Загрузить"/>
+ </notification>
+ <notification name="DownloadMacMandatory">
+ ПоÑвилаÑÑŒ Ð½Ð¾Ð²Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ [APP_NAME].
+[MESSAGE]
+Это обновление необходимо загрузить Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ [APP_NAME].
+
+Загрузить его в папку приложений?
+ <usetemplate name="okcancelbuttons" notext="Выйти" yestext="Загрузить"/>
+ </notification>
+ <notification name="DownloadMac">
+ ПоÑвилоÑÑŒ обновление Ð´Ð»Ñ [APP_NAME].
+[MESSAGE]
+УÑтанавливать Ñто обновление не обÑзательно, но рекомендуетÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð²Ñ‹ÑˆÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ñти и ÑтабильноÑти.
+
+Загрузить его в папку приложений?
+ <usetemplate name="okcancelbuttons" notext="Продолжить" yestext="Загрузить"/>
+ </notification>
+ <notification name="DownloadMacReleaseForDownload">
+ ПоÑвилоÑÑŒ обновление Ð´Ð»Ñ [APP_NAME].
+[MESSAGE]
+УÑтанавливать Ñто обновление не обÑзательно, но рекомендуетÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð²Ñ‹ÑˆÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ñти и ÑтабильноÑти.
+
+Загрузить его в папку приложений?
+ <usetemplate name="okcancelbuttons" notext="Продолжить" yestext="Загрузить"/>
+ </notification>
+ <notification name="FailedUpdateInstall">
+ Произошла ошибка при уÑтановке обновлениÑ.
+Загрузите новую верÑию программы на Ñайте
+http://secondlife.com/download.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="FailedRequiredUpdateInstall">
+ Ðе удалоÑÑŒ уÑтановить обÑзательное обновление.
+Ð’Ñ‹ не Ñможете войти в [APP_NAME], пока обновление не будет уÑтановлено.
+
+Загрузите новую верÑию программы на Ñайте
+http://secondlife.com/download.
+ <usetemplate name="okbutton" yestext="Выйти"/>
+ </notification>
+ <notification name="UpdaterServiceNotRunning">
+ ПоÑвилиÑÑŒ обÑзательные Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ¹ верÑии Second Life.
+
+Загрузите Ñто обновление на Ñайте http://www.secondlife.com/downloads
+или уÑтановите его ÑейчаÑ.
+ <usetemplate name="okcancelbuttons" notext="Выйти из Second Life" yestext="Загрузить и уÑтановить ÑейчаÑ"/>
+ </notification>
+ <notification name="DownloadBackgroundTip">
+ Загружено обновление Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ¹ верÑии [APP_NAME].
+ВерÑÐ¸Ñ [VERSION]. [[RELEASE_NOTES_FULL_URL] Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾Ð± Ñтом обновлении]
+ <usetemplate name="okcancelbuttons" notext="Позже..." yestext="УÑтановите обновление и перезапуÑтите [APP_NAME]"/>
+ </notification>
+ <notification name="DownloadBackgroundDialog">
+ Загружено обновление Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ¹ верÑии [APP_NAME].
+ВерÑÐ¸Ñ [VERSION]. [[RELEASE_NOTES_FULL_URL] Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾Ð± Ñтом обновлении]
+ <usetemplate name="okcancelbuttons" notext="Позже..." yestext="УÑтановите обновление и перезапуÑтите [APP_NAME]"/>
+ </notification>
+ <notification name="RequiredUpdateDownloadedVerboseDialog">
+ Загружено обÑзательное обновление.
+ВерÑÐ¸Ñ [VERSION]
+
+Ðеобходимо перезапуÑтить [APP_NAME] Ð´Ð»Ñ ÑƒÑтановки обновлениÑ.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="RequiredUpdateDownloadedDialog">
+ Ðеобходимо перезапуÑтить [APP_NAME] Ð´Ð»Ñ ÑƒÑтановки обновлениÑ.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="DeedObjectToGroup">
+ Ð’ результате передачи Ñтого объекта группа:
+* Получит L$ в уплату за объект
+ <usetemplate ignoretext="Подтверждать перед передачей объекта группе" name="okcancelignore" notext="Отмена" yestext="Передать"/>
+ </notification>
+ <notification name="WebLaunchExternalTarget">
+ Открыть браузер Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра Ñтого контента?
+ <usetemplate ignoretext="ЗапуÑтить браузер Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра веб-Ñтраницы" name="okcancelignore" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="WebLaunchJoinNow">
+ Перейти на [http://secondlife.com/account/ информационную панель] Ð´Ð»Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð²Ð°ÑˆÐ¸Ð¼ аккаунтом?
+ <usetemplate ignoretext="ЗапуÑтить браузер Ð´Ð»Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð°ÐºÐºÐ°ÑƒÐ½Ñ‚Ð¾Ð¼" name="okcancelignore" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="WebLaunchSecurityIssues">
+ Прочитайте на вики-Ñтранице [SECOND_LIFE] о том, как Ñообщить о проблеме Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑноÑтью.
+ <usetemplate ignoretext="ЗапуÑтить браузер Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра инÑтрукций в Ñлучае проблем Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑноÑтью" name="okcancelignore" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="WebLaunchQAWiki">
+ ПоÑетите вики-Ñтраницу вопроÑов и ответов по [SECOND_LIFE].
+ <usetemplate ignoretext="ЗапуÑтить браузер Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра вики-Ñтраницы вопроÑов и ответов" name="okcancelignore" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="WebLaunchPublicIssue">
+ ПоÑетите Ñтраницу общедоÑтупного ÑредÑтва иÑÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼ [SECOND_LIFE], на котором можно Ñообщить об ошибках и других проблемах.
+ <usetemplate ignoretext="ЗапуÑтить браузер Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¾Ð±Ñ‰ÐµÐ´Ð¾Ñтупного ÑредÑтва иÑÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼" name="okcancelignore" notext="Отмена" yestext="Перейти на Ñтраницу"/>
+ </notification>
+ <notification name="WebLaunchSupportWiki">
+ Перейти на официальный блог Linden Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра Ñвежих новоÑтей и прочей информации.
+ <usetemplate ignoretext="ЗапуÑтить браузер Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра блога" name="okcancelignore" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="WebLaunchLSLGuide">
+ Открыть руководÑтво по Ñкриптам Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ñправки?
+ <usetemplate ignoretext="ЗапуÑтить браузер Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра руководÑтва по Ñкриптам" name="okcancelignore" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="WebLaunchLSLWiki">
+ ПоÑетить портал LSL Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ñправки по Ñкриптам?
+ <usetemplate ignoretext="ЗапуÑтить браузер Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра портала LSL" name="okcancelignore" notext="Отмена" yestext="Перейти на Ñтраницу"/>
+ </notification>
+ <notification name="ReturnToOwner">
+ Ð’Ñ‹ дейÑтвительно хотите вернуть выбранные объекты их владельцам? ПереноÑимые переданные объекты будут возвращены прежним владельцам.
+
+*ПРЕДУПРЕЖДЕÐИЕ* ÐепереноÑимые переданные объекты будут удалены!
+ <usetemplate ignoretext="Подтверждать перед возвратом объектов владельцам" name="okcancelignore" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="GroupLeaveConfirmMember">
+ Ð’Ñ‹ ÑÐµÐ¹Ñ‡Ð°Ñ Ð²Ñ…Ð¾Ð´Ð¸Ñ‚Ðµ в группу &lt;nolink&gt;[GROUP]&lt;/nolink&gt;.
+Хотите покинуть группу?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmKick">
+ Ð’Ñ‹ ДЕЙСТВИТЕЛЬÐО хотите выброÑить вÑех жителей Ñ Ñетки?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="ВыброÑить вÑех жителей"/>
+ </notification>
+ <notification name="MuteLinden">
+ Заблокировать Linden нельзÑ.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="CannotStartAuctionAlreadyForSale">
+ ÐÐµÐ»ÑŒÐ·Ñ Ð²Ñ‹Ñтавить на аукцион учаÑток, который уже продаетÑÑ. Отмените продажу учаÑтка, еÑли дейÑтвительно хотите начать аукцион.
+ </notification>
+ <notification label="Ðе удалоÑÑŒ блокировать объект по имени" name="MuteByNameFailed">
+ Ð’Ñ‹ уже внеÑли Ñто Ð¸Ð¼Ñ Ð² черный ÑпиÑок.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="RemoveItemWarn">
+ Удаление Ñодержимого, Ñ…Ð¾Ñ‚Ñ Ñто и разрешено, может повредить объект. Хотите удалить Ñтот предмет?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="CantOfferCallingCard">
+ Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð½ÐµÐ²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ предложить визитку. Повторите попытку через минуту.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="CantOfferFriendship">
+ Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð½ÐµÐ²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ предложить дружбу. Повторите попытку через минуту.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="BusyModeSet">
+ УÑтановлен режим «ЗанÑт».
+Ð¡Ð¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñ‡Ð°Ñ‚Ð° и IM будут Ñкрыты. Ðа IM-ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ возвращатьÑÑ Ð·Ð°Ð´Ð°Ð½Ð½Ñ‹Ð¹ ответ в режиме «ЗанÑт». Ð’Ñе Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ñ‚ÐµÐ»ÐµÐ¿Ð¾Ñ€Ñ‚Ð°Ñ†Ð¸Ð¸ будут отклонÑÑ‚ÑŒÑÑ. Ð’Ñе Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð½Ð²ÐµÐ½Ñ‚Ð°Ñ€Ñ Ð±ÑƒÐ´ÑƒÑ‚ направлены в корзину.
+ <usetemplate ignoretext="Смена моего ÑтатуÑа на режим «ЗанÑт»" name="okignore" yestext="OK"/>
+ </notification>
+ <notification name="JoinedTooManyGroupsMember">
+ ДоÑтигнуто макÑимальное количеÑтво групп. Выйдите из другой группы, прежде чем вÑтупать в Ñту, или отклоните предложение.
+[NAME] приглаÑил(а) Ð²Ð°Ñ Ð² группу.
+ <usetemplate name="okcancelbuttons" notext="Отклонить" yestext="Ð’Ñтупить"/>
+ </notification>
+ <notification name="JoinedTooManyGroups">
+ ДоÑтигнуто макÑимальное количеÑтво групп. Выйдите из другой группы, прежде чем вÑтупать в Ñту или Ñоздавать новую группу.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="KickUser">
+ ВыброÑить Ñтого Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ñ Ñ‚Ð°ÐºÐ¸Ð¼ Ñообщением?
+ <form name="form">
+ <input name="message">
+ ÐдминиÑтратор вывел Ð²Ð°Ñ Ð¸Ð· программы.
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Отмена"/>
+ </form>
+ </notification>
+ <notification name="KickAllUsers">
+ ВыброÑить вÑех жителей, которые ÑÐµÐ¹Ñ‡Ð°Ñ ÐµÑÑ‚ÑŒ на Ñетке, Ñ Ñ‚Ð°ÐºÐ¸Ð¼ Ñообщением?
+ <form name="form">
+ <input name="message">
+ ÐдминиÑтратор вывел Ð²Ð°Ñ Ð¸Ð· программы.
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Отмена"/>
+ </form>
+ </notification>
+ <notification name="FreezeUser">
+ Заморозить Ñтого Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ñ Ñ‚Ð°ÐºÐ¸Ð¼ Ñообщением?
+ <form name="form">
+ <input name="message">
+ Ð’Ñ‹ заморожены. Ð’Ñ‹ не можете двигатьÑÑ Ð¸ беÑедовать в чате. ÐдминиÑтратор ÑвÑжетÑÑ Ñ Ð²Ð°Ð¼Ð¸ в ÑеанÑе мгновенных Ñообщений (IM).
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Отмена"/>
+ </form>
+ </notification>
+ <notification name="UnFreezeUser">
+ Разморозить Ñтого Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ñ Ñ‚Ð°ÐºÐ¸Ð¼ Ñообщением?
+ <form name="form">
+ <input name="message">
+ Вы больше не заморожены.
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Отмена"/>
+ </form>
+ </notification>
+ <notification name="SetDisplayNameSuccess">
+ Привет, [DISPLAY_NAME]!
+
+Как и в реальной жизни, должно пройти какое-то времÑ, прежде чем вÑе узнают ваше новое имÑ. Подождите неÑколько дней, пока [http://wiki.secondlife.com/wiki/Setting_your_display_name ваше Ð¸Ð¼Ñ Ð½Ðµ будет обновлено] в объектах, Ñкриптах, поиÑке и Ñ‚.д.
+ </notification>
+ <notification name="SetDisplayNameBlocked">
+ Ð’Ñ‹ не можете Ñменить Ñвое Ñкранное имÑ. ЕÑли вы Ñчитаете, что Ñто ошибка, обратитеÑÑŒ в Ñлужбу поддержки.
+ </notification>
+ <notification name="SetDisplayNameFailedLength">
+ Это Ð¸Ð¼Ñ Ñлишком длинное. Экранное Ð¸Ð¼Ñ Ð¼Ð¾Ð¶ÐµÑ‚ Ñодержать не более [LENGTH] Ñимволов.
+
+Сократите имÑ.
+ </notification>
+ <notification name="SetDisplayNameFailedGeneric">
+ Ðе удалоÑÑŒ Ñменить ваше Ñкранное имÑ. Повторите попытку позже.
+ </notification>
+ <notification name="SetDisplayNameMismatch">
+ Введенные Ñкранные имена не Ñовпадают. Введите их еще раз.
+ </notification>
+ <notification name="AgentDisplayNameUpdateThresholdExceeded">
+ Вам надо подождать, прежде чем вы Ñможете Ñменить Ñвое Ñкранное имÑ.
+
+См. http://wiki.secondlife.com/wiki/Setting_your_display_name
+
+Повторите попытку позже.
+ </notification>
+ <notification name="AgentDisplayNameSetBlocked">
+ ÐÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð´Ð°Ñ‚ÑŒ указанное вами имÑ. Оно Ñодержит запрещенное Ñлово.
+
+ Попробуйте указать другое имÑ.
+ </notification>
+ <notification name="AgentDisplayNameSetInvalidUnicode">
+ Выбранное вами Ñкранное Ð¸Ð¼Ñ Ñодержит недопуÑтимые Ñимволы.
+ </notification>
+ <notification name="AgentDisplayNameSetOnlyPunctuation">
+ Ваше Ñкранное Ð¸Ð¼Ñ ÐºÑ€Ð¾Ð¼Ðµ знаков Ð¿Ñ€ÐµÐ¿Ð¸Ð½Ð°Ð½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð¾ Ñодержать буквы.
+ </notification>
+ <notification name="DisplayNameUpdate">
+ [OLD_NAME] ([SLID]) теперь ноÑит Ð¸Ð¼Ñ [NEW_NAME].
+ </notification>
+ <notification name="OfferTeleport">
+ Предложить телепортацию к вам Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¾Ð¹ ÑообщениÑ?
+ <form name="form">
+ <input name="message">
+ ПриÑоединитьÑÑ ÐºÐ¾ мне в [REGION]
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Отмена"/>
+ </form>
+ </notification>
+ <notification name="TooManyTeleportOffers">
+ Попытка Ñделать [OFFERS] предложений телепортации, что больше лимита ([LIMIT]).
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="OfferTeleportFromGod">
+ Творец вызывает Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ðº вам?
+ <form name="form">
+ <input name="message">
+ ПриÑоединитьÑÑ ÐºÐ¾ мне в [REGION]
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Отмена"/>
+ </form>
+ </notification>
+ <notification name="TeleportFromLandmark">
+ Ð’Ñ‹ дейÑтвительно хотите телепортироватьÑÑ Ð² &lt;nolink&gt;[LOCATION]&lt;/nolink&gt;?
+ <usetemplate ignoretext="Подтверждать телепортацию на закладку" name="okcancelignore" notext="Отмена" yestext="ТелепортациÑ"/>
+ </notification>
+ <notification name="TeleportToPick">
+ ТелепортироватьÑÑ Ð² [PICK]?
+ <usetemplate ignoretext="Подтверждать телепортацию на меÑто в подборке" name="okcancelignore" notext="Отмена" yestext="ТелепортациÑ"/>
+ </notification>
+ <notification name="TeleportToClassified">
+ ТелепортироватьÑÑ Ð² [CLASSIFIED]?
+ <usetemplate ignoretext="Подтверждать телепортацию на меÑто в рекламном объÑвлении" name="okcancelignore" notext="Отмена" yestext="ТелепортациÑ"/>
+ </notification>
+ <notification name="TeleportToHistoryEntry">
+ ТелепортироватьÑÑ Ð² [HISTORY_ENTRY]?
+ <usetemplate ignoretext="Подтверждать телепортацию на меÑто в журнале" name="okcancelignore" notext="Отмена" yestext="ТелепортациÑ"/>
+ </notification>
+ <notification label="Сообщение вÑем в моем землевладении" name="MessageEstate">
+ Введите краткое объÑвление Ð´Ð»Ñ Ð²Ñех жителей, которые ÑÐµÐ¹Ñ‡Ð°Ñ Ð½Ð°Ñ…Ð¾Ð´ÑÑ‚ÑÑ Ð² вашем землевладении.
+ <form name="form">
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Отмена"/>
+ </form>
+ </notification>
+ <notification label="Изменить землевладение Linden" name="ChangeLindenEstate">
+ Ð’Ñ‹ ÑобираетеÑÑŒ изменить землевладение, которое принадлежит компании Linden (материк, Ñетку Ð´Ð»Ñ Ð¿Ð¾Ð´Ñ€Ð¾Ñтков, ориентацию и Ñ‚.д.).
+
+Это ОЧЕÐЬ ОПÐСÐО, так как Ñерьезно повлиÑет на огромное количеÑтво жителей. Ваше изменение раÑпроÑтранитÑÑ Ð½Ð° Ñ‚Ñ‹ÑÑчи регионов материка и вызовет Ñбой Ñервера.
+
+Ðачать?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification label="Изменить доÑтуп к землевладению Linden" name="ChangeLindenAccess">
+ Ð’Ñ‹ ÑобираетеÑÑŒ изменить ÑпиÑок доÑтупа к землевладению, которое принадлежит компании Linden (материк, Ñетка Ð´Ð»Ñ Ð¿Ð¾Ð´Ñ€Ð¾Ñтков, Ð¾Ñ€Ð¸ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ Ð¸ Ñ‚.д.).
+
+Это дейÑтвие ОПÐСÐО и допуÑкаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ð´Ð»Ñ ÑƒÑÑ‚Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð½Ð°Ñ€ÑƒÑˆÐµÐ½Ð¸Ñ, которое позволÑет вводить и выводить объекты и L$ из Ñетки.
+Ваше изменение раÑпроÑтранитÑÑ Ð½Ð° Ñ‚Ñ‹ÑÑчи регионов и вызовет Ñбой Ñервера.
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification label="Выбрать землевладение" name="EstateAllowedAgentAdd">
+ ВнеÑти в ÑпиÑок допущенных только Ð´Ð»Ñ Ñтого Ð·ÐµÐ¼Ð»ÐµÐ²Ð»Ð°Ð´ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ Ð´Ð»Ñ [ALL_ESTATES]?
+ <usetemplate canceltext="Отмена" name="yesnocancelbuttons" notext="Ð”Ð»Ñ Ð²Ñех землевладений" yestext="Ð”Ð»Ñ Ñтого землевладениÑ"/>
+ </notification>
+ <notification label="Выбрать землевладение" name="EstateAllowedAgentRemove">
+ Удалить из ÑпиÑка допущенных только Ð´Ð»Ñ Ñтого Ð·ÐµÐ¼Ð»ÐµÐ²Ð»Ð°Ð´ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ Ð´Ð»Ñ [ALL_ESTATES]?
+ <usetemplate canceltext="Отмена" name="yesnocancelbuttons" notext="Ð”Ð»Ñ Ð²Ñех землевладений" yestext="Ð”Ð»Ñ Ñтого землевладениÑ"/>
+ </notification>
+ <notification label="Выбрать землевладение" name="EstateAllowedGroupAdd">
+ ВнеÑти в групповой ÑпиÑок допущенных только Ð´Ð»Ñ Ñтого Ð·ÐµÐ¼Ð»ÐµÐ²Ð»Ð°Ð´ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ Ð´Ð»Ñ [ALL_ESTATES]?
+ <usetemplate canceltext="Отмена" name="yesnocancelbuttons" notext="Ð”Ð»Ñ Ð²Ñех землевладений" yestext="Ð”Ð»Ñ Ñтого землевладениÑ"/>
+ </notification>
+ <notification label="Выбрать землевладение" name="EstateAllowedGroupRemove">
+ Удалить из группового ÑпиÑка допущенных только Ð´Ð»Ñ Ñтого Ð·ÐµÐ¼Ð»ÐµÐ²Ð»Ð°Ð´ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ Ð´Ð»Ñ [ALL_ESTATES]?
+ <usetemplate canceltext="Отмена" name="yesnocancelbuttons" notext="Ð”Ð»Ñ Ð²Ñех землевладений" yestext="Ð”Ð»Ñ Ñтого землевладениÑ"/>
+ </notification>
+ <notification label="Выбрать землевладение" name="EstateBannedAgentAdd">
+ Запретить доÑтуп только Ð´Ð»Ñ Ñтого Ð·ÐµÐ¼Ð»ÐµÐ²Ð»Ð°Ð´ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ Ð´Ð»Ñ [ALL_ESTATES]?
+ <usetemplate canceltext="Отмена" name="yesnocancelbuttons" notext="Ð”Ð»Ñ Ð²Ñех землевладений" yestext="Ð”Ð»Ñ Ñтого землевладениÑ"/>
+ </notification>
+ <notification label="Выбрать землевладение" name="EstateBannedAgentRemove">
+ Удалить Ñтого Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ð¸Ð· ÑпиÑка запрета доÑтупа только Ð´Ð»Ñ Ñтого Ð·ÐµÐ¼Ð»ÐµÐ²Ð»Ð°Ð´ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ Ð´Ð»Ñ [ALL_ESTATES]?
+ <usetemplate canceltext="Отмена" name="yesnocancelbuttons" notext="Ð”Ð»Ñ Ð²Ñех землевладений" yestext="Ð”Ð»Ñ Ñтого землевладениÑ"/>
+ </notification>
+ <notification label="Выбрать землевладение" name="EstateManagerAdd">
+ Добавить менеджера только Ð´Ð»Ñ Ñтого Ð·ÐµÐ¼Ð»ÐµÐ²Ð»Ð°Ð´ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ Ð´Ð»Ñ [ALL_ESTATES]?
+ <usetemplate canceltext="Отмена" name="yesnocancelbuttons" notext="Ð”Ð»Ñ Ð²Ñех землевладений" yestext="Ð”Ð»Ñ Ñтого землевладениÑ"/>
+ </notification>
+ <notification label="Выбрать землевладение" name="EstateManagerRemove">
+ Удалить менеджера только Ð´Ð»Ñ Ñтого Ð·ÐµÐ¼Ð»ÐµÐ²Ð»Ð°Ð´ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ Ð´Ð»Ñ [ALL_ESTATES]?
+ <usetemplate canceltext="Отмена" name="yesnocancelbuttons" notext="Ð”Ð»Ñ Ð²Ñех землевладений" yestext="Ð”Ð»Ñ Ñтого землевладениÑ"/>
+ </notification>
+ <notification label="Подтвердить выбраÑывание" name="EstateKickUser">
+ ВыброÑить Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ [EVIL_USER] из Ñтого землевладениÑ?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="EstateChangeCovenant">
+ Ð’Ñ‹ дейÑтвительно хотите изменить Ñоглашение по землевладению?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="RegionEntryAccessBlocked">
+ Вам Ð½ÐµÐ»ÑŒÐ·Ñ Ð±Ñ‹Ñ‚ÑŒ в Ñтом регионе из-за вашего рейтинга зрелоÑти. Возможно, Ñто результат недоÑтатка информации, подтверждающей ваш возраÑÑ‚.
+
+УбедитеÑÑŒ, что у Ð²Ð°Ñ ÑƒÑтановлена поÑледнÑÑ Ð²ÐµÑ€ÑÐ¸Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð°, и прочитайте в Базе знаний о доÑтупе к облаÑÑ‚Ñм Ñ Ñтим рейтингом зрелоÑти.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="RegionEntryAccessBlocked_KB">
+ Вам Ð½ÐµÐ»ÑŒÐ·Ñ Ð±Ñ‹Ñ‚ÑŒ в Ñтом регионе из-за вашего рейтинга зрелоÑти.
+
+Перейти в Базу знаний и ознакомитьÑÑ Ñ Ñ€ÐµÐ¹Ñ‚Ð¸Ð½Ð³Ð°Ð¼Ð¸ зрелоÑти?
+ <url name="url">
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview
+ </url>
+ <usetemplate ignoretext="Я не могу войти в Ñтот регион из-за ограничений по рейтингу зрелоÑти" name="okcancelignore" notext="Закрыть" yestext="Перейти в Базу знаний"/>
+ </notification>
+ <notification name="RegionEntryAccessBlocked_Notify">
+ Вам Ð½ÐµÐ»ÑŒÐ·Ñ Ð±Ñ‹Ñ‚ÑŒ в Ñтом регионе из-за вашего рейтинга зрелоÑти.
+ </notification>
+ <notification name="RegionEntryAccessBlocked_Change">
+ Вам Ð½ÐµÐ»ÑŒÐ·Ñ Ð±Ñ‹Ñ‚ÑŒ в Ñтом регионе из-за вашей наÑтройки рейтинга зрелоÑти.
+
+Ð”Ð»Ñ Ð²Ñ…Ð¾Ð´Ð° в желаемый регион измените наÑтройку рейтинга зрелоÑти. ПоÑле Ñтого вам будет разрешено иÑкать и проÑматривать контент [REGIONMATURITY]. Ð”Ð»Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ñ‹ изменений выберите команды «Я &gt; ÐаÑтройки &gt; Общие».
+ <form name="form">
+ <button name="OK" text="Изменить наÑтройку"/>
+ <button name="Cancel" text="Закрыть"/>
+ <ignore name="ignore" text="Ð’Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð°Ñ Ð¼Ð½Ð¾Ð¹ наÑтройка рейтинга запрещает мне вход в регион"/>
+ </form>
+ </notification>
+ <notification name="PreferredMaturityChanged">
+ Теперь ваша наÑтройка рейтинга зрелоÑти: [RATING].
+ </notification>
+ <notification name="LandClaimAccessBlocked">
+ Ð’Ñ‹ не можете претендовать на Ñту землю из-за вашего рейтинга зрелоÑти. Возможно, Ñто результат недоÑтатка информации, подтверждающей ваш возраÑÑ‚.
+
+УбедитеÑÑŒ, что у Ð²Ð°Ñ ÑƒÑтановлена поÑледнÑÑ Ð²ÐµÑ€ÑÐ¸Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð°, и прочитайте в Базе знаний о доÑтупе к облаÑÑ‚Ñм Ñ Ñтим рейтингом зрелоÑти.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="LandClaimAccessBlocked_KB">
+ Ð’Ñ‹ не можете претендовать на Ñту землю из-за вашего рейтинга зрелоÑти.
+
+Перейти в Базу знаний и ознакомитьÑÑ Ñ Ñ€ÐµÐ¹Ñ‚Ð¸Ð½Ð³Ð°Ð¼Ð¸ зрелоÑти?
+ <url name="url">
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview
+ </url>
+ <usetemplate ignoretext="Я не могу претендовать на Ñту землю из-за ограничений по рейтингу зрелоÑти" name="okcancelignore" notext="Закрыть" yestext="Перейти в Базу знаний"/>
+ </notification>
+ <notification name="LandClaimAccessBlocked_Notify">
+ Ð’Ñ‹ не можете претендовать на Ñту землю из-за вашего рейтинга зрелоÑти.
+ </notification>
+ <notification name="LandClaimAccessBlocked_Change">
+ Ð’Ñ‹ не можете претендовать на Ñту землю из-за вашей наÑтройки рейтинга зрелоÑти.
+
+Ðажмите кнопку «Изменить наÑтройку», чтобы повыÑить Ñвой рейтинг зрелоÑти. ПоÑле Ñтого вам будет разрешено иÑкать и проÑматривать контент [REGIONMATURITY]. ЕÑли в будущем понадобитÑÑ Ð¾Ñ‚Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ Ñто изменение, выберите команды «Я &gt; ÐаÑтройки &gt; Общие».
+ <usetemplate ignoretext="Ð’Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð°Ñ Ð¼Ð½Ð¾Ð¹ наÑтройка рейтинга запрещает мне претендовать на землю" name="okcancelignore" notext="Закрыть" yestext="Изменить наÑтройку"/>
+ </notification>
+ <notification name="LandBuyAccessBlocked">
+ Ð’Ñ‹ не можете купить Ñту землю из-за вашего рейтинга зрелоÑти. Возможно, Ñто результат недоÑтатка информации, подтверждающей ваш возраÑÑ‚.
+
+УбедитеÑÑŒ, что у Ð²Ð°Ñ ÑƒÑтановлена поÑледнÑÑ Ð²ÐµÑ€ÑÐ¸Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð°, и прочитайте в Базе знаний о доÑтупе к облаÑÑ‚Ñм Ñ Ñтим рейтингом зрелоÑти.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="LandBuyAccessBlocked_KB">
+ Ð’Ñ‹ не можете купить Ñту землю из-за вашего рейтинга зрелоÑти.
+
+Перейти в Базу знаний и ознакомитьÑÑ Ñ Ñ€ÐµÐ¹Ñ‚Ð¸Ð½Ð³Ð°Ð¼Ð¸ зрелоÑти?
+ <url name="url">
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview
+ </url>
+ <usetemplate ignoretext="Я не могу купить Ñту землю из-за ограничений по рейтингу зрелоÑти" name="okcancelignore" notext="Закрыть" yestext="Перейти в Базу знаний"/>
+ </notification>
+ <notification name="LandBuyAccessBlocked_Notify">
+ Ð’Ñ‹ не можете купить Ñту землю из-за вашего рейтинга зрелоÑти.
+ </notification>
+ <notification name="LandBuyAccessBlocked_Change">
+ Ð’Ñ‹ не можете купить Ñту землю из-за выбранного вами рейтинга зрелоÑти.
+
+Ðажмите кнопку «Изменить наÑтройку», чтобы повыÑить Ñвой рейтинг зрелоÑти. ПоÑле Ñтого вам будет разрешено иÑкать и проÑматривать контент [REGIONMATURITY]. ЕÑли в будущем понадобитÑÑ Ð¾Ñ‚Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ Ñто изменение, выберите команды «Я &gt; ÐаÑтройки &gt; Общие».
+ <usetemplate ignoretext="Ð’Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð°Ñ Ð¼Ð½Ð¾Ð¹ наÑтройка рейтинга запрещает мне покупать землю" name="okcancelignore" notext="Закрыть" yestext="Изменить наÑтройку"/>
+ </notification>
+ <notification name="TooManyPrimsSelected">
+ Выбрано Ñлишком много примитивов. Выберите [MAX_PRIM_COUNT] или меньше примитивов и повторите попытку.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ProblemImportingEstateCovenant">
+ Проблема при импорте ÑÐ¾Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ñ Ð¾ землевладении.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ProblemAddingEstateManager">
+ Проблема при добавлении нового менеджера землевладениÑ. Возможно, в одном или неÑкольких землевладениÑÑ… ÑпиÑок менеджеров уже заполнен.
+ </notification>
+ <notification name="ProblemAddingEstateGeneric">
+ Проблема при добавлении в Ñтот ÑпиÑок землевладениÑ. Возможно, в одном или неÑкольких землевладениÑÑ… ÑпиÑок уже заполнен.
+ </notification>
+ <notification name="UnableToLoadNotecardAsset">
+ Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð½ÐµÐ²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ загрузить актив заметки.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="NotAllowedToViewNotecard">
+ ÐедоÑтаточно прав Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра заметки, ÑвÑзанной Ñ Ñ‚Ñ€ÐµÐ±ÑƒÐµÐ¼Ñ‹Ð¼ идентификатором актива.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="MissingNotecardAssetID">
+ Идентификатор актива Ð´Ð»Ñ Ð·Ð°Ð¼ÐµÑ‚ÐºÐ¸ отÑутÑтвует в базе данных.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="PublishClassified">
+ Помните, что плата за рекламу не возвращаетÑÑ.
+
+Опубликовать Ñто рекламное объÑвление за L$[AMOUNT]?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="SetClassifiedMature">
+ Содержит ли Ñта реклама умеренный контент?
+ <usetemplate canceltext="Отмена" name="yesnocancelbuttons" notext="Ðет" yestext="Да"/>
+ </notification>
+ <notification name="SetGroupMature">
+ Содержит ли Ñта группа умеренный контент?
+ <usetemplate canceltext="Отмена" name="yesnocancelbuttons" notext="Ðет" yestext="Да"/>
+ </notification>
+ <notification label="Подтвердить перезапуÑк" name="ConfirmRestart">
+ Ð’Ñ‹ дейÑтвительно хотите перезапуÑтить Ñтот регион через 2 минуты?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification label="Сообщение Ð´Ð»Ñ Ð²Ñех в Ñтом регионе" name="MessageRegion">
+ Введите краткое объÑвление Ð´Ð»Ñ Ð²Ñех жителей в Ñтом регионе.
+ <form name="form">
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Отмена"/>
+ </form>
+ </notification>
+ <notification label="Изменен рейтинг зрелоÑти региона" name="RegionMaturityChange">
+ Рейтинг зрелоÑти Ð´Ð»Ñ Ñтого региона будет обновлен.
+Отображение Ñтого Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½Ð° карте может занÑÑ‚ÑŒ некоторое времÑ.
+
+Ð”Ð»Ñ Ð²Ñ…Ð¾Ð´Ð° в регионы Ð´Ð»Ñ Ð²Ð·Ñ€Ð¾Ñлых у Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ быть подтвержденный аккаунт: либо Ñ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸ÐµÐ¼ возраÑта, либо Ñ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸ÐµÐ¼ оплаты.
+ </notification>
+ <notification label="ÐеÑоответÑтвие верÑии голоÑа" name="VoiceVersionMismatch">
+ Ð”Ð°Ð½Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ [APP_NAME] неÑовмеÑтима Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸ÐµÐ¹ голоÑового чата в Ñтом регионе. Ð”Ð»Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð¾Ð¹ работы голоÑового чата необходимо обновить [APP_NAME].
+ </notification>
+ <notification label="ÐÐµÐ»ÑŒÐ·Ñ ÐºÑƒÐ¿Ð¸Ñ‚ÑŒ объекты" name="BuyObjectOneOwner">
+ ÐÐµÐ»ÑŒÐ·Ñ ÐºÑƒÐ¿Ð¸Ñ‚ÑŒ объекты одновременно у разных владельцев.
+Выберите один объект и повторите попытку.
+ </notification>
+ <notification label="ÐÐµÐ»ÑŒÐ·Ñ ÐºÑƒÐ¿Ð¸Ñ‚ÑŒ Ñодержимое" name="BuyContentsOneOnly">
+ ÐÐµÐ»ÑŒÐ·Ñ ÐºÑƒÐ¿Ð¸Ñ‚ÑŒ Ñодержимое неÑкольких объектов одновременно.
+Выберите один объект и повторите попытку.
+ </notification>
+ <notification label="ÐÐµÐ»ÑŒÐ·Ñ ÐºÑƒÐ¿Ð¸Ñ‚ÑŒ Ñодержимое" name="BuyContentsOneOwner">
+ ÐÐµÐ»ÑŒÐ·Ñ ÐºÑƒÐ¿Ð¸Ñ‚ÑŒ объекты одновременно у разных владельцев.
+Выберите один объект и повторите попытку.
+ </notification>
+ <notification name="BuyOriginal">
+ Купить оригинальный объект от [OWNER] за L$[PRICE]?
+Ð’Ñ‹ Ñтанете владельцем Ñтого объекта.
+Ð’Ñ‹ Ñможете:
+ изменÑÑ‚ÑŒ: [MODIFYPERM]
+ копировать: [COPYPERM]
+ перепродавать или отдавать объект: [RESELLPERM]
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="BuyOriginalNoOwner">
+ Купить оригинальный объект за L$[PRICE]?
+Ð’Ñ‹ Ñтанете владельцем Ñтого объекта.
+Ð’Ñ‹ Ñможете:
+ изменÑÑ‚ÑŒ: [MODIFYPERM]
+ копировать: [COPYPERM]
+ перепродавать или отдавать объект: [RESELLPERM]
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="BuyCopy">
+ Купить копию от [OWNER] за L$[PRICE]?
+Объект будет Ñкопирован в ваш инвентарь.
+Ð’Ñ‹ Ñможете:
+ изменÑÑ‚ÑŒ: [MODIFYPERM]
+ копировать: [COPYPERM]
+ перепродавать или отдавать объект: [RESELLPERM]
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="BuyCopyNoOwner">
+ Купить копию за L$[PRICE]?
+Объект будет Ñкопирован в ваш инвентарь.
+Ð’Ñ‹ Ñможете:
+ изменÑÑ‚ÑŒ: [MODIFYPERM]
+ копировать: [COPYPERM]
+ перепродавать или отдавать объект: [RESELLPERM]
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="BuyContents">
+ Купить Ñодержимое от [OWNER] за L$[PRICE]?
+Оно будет Ñкопировано в ваш инвентарь.
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="BuyContentsNoOwner">
+ Купить Ñодержимое за L$[PRICE]?
+Оно будет Ñкопировано в ваш инвентарь.
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmPurchase">
+ ДейÑтвие Ñтой транзакции:
+[ACTION]
+
+ДейÑтвительно Ñовершить Ñту покупку?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmPurchasePassword">
+ ДейÑтвие Ñтой транзакции:
+[ACTION]
+
+ДейÑтвительно Ñовершить Ñту покупку?
+Введите Ñвой пароль и нажмите «OK».
+ <form name="form">
+ <button name="ConfirmPurchase" text="OK"/>
+ <button name="Cancel" text="Отмена"/>
+ </form>
+ </notification>
+ <notification name="SetPickLocation">
+ Примечание.
+Ð’Ñ‹ изменили меÑтоположение Ñтой подборки, но оÑтальные данные Ñохранили прежние значениÑ.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="MoveInventoryFromObject">
+ Вы выбрали «не копируемые» предметы.
+Они будут перемещены в ваш инвентарь, а не Ñкопированы.
+
+ПеремеÑтить предмет(Ñ‹)?
+ <usetemplate ignoretext="Предупреждать перед перемещением «не копируемых» предметов из объекта" name="okcancelignore" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="MoveInventoryFromScriptedObject">
+ Ð’Ñ‹ выбрали «не копируемые» предметы. Они будут перемещены в ваш инвентарь, а не Ñкопированы.
+Так как объект ÑвлÑетÑÑ Ñкриптовым, перемещение предметов в ваш инвентарий может вызвать ошибки Ñкрипта.
+
+ПеремеÑтить предмет(Ñ‹)?
+ <usetemplate ignoretext="Предупреждать перед перемещением «не копируемых» предметов, которые могут повредить Ñкриптовый объект" name="okcancelignore" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ClickActionNotPayable">
+ Предупреждение. Задано дейÑтвие по щелчку «Заплатить за объект», но оно будет работать, только еÑли добавлен Ñкрипт Ñ Ñобытием money().
+ <form name="form">
+ <ignore name="ignore" text="УÑтановлено дейÑтвие «Заплатить за объект» при поÑтроении объекта без Ñкрипта money()"/>
+ </form>
+ </notification>
+ <notification name="OpenObjectCannotCopy">
+ Ð’ Ñтом объекте нет вещей, которые вам разрешено копировать.
+ </notification>
+ <notification name="WebLaunchAccountHistory">
+ Перейти на [http://secondlife.com/account/ информационную панель], чтобы увидеть иÑторию аккаунта?
+ <usetemplate ignoretext="ЗапуÑтить браузер Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра иÑтории аккаунта" name="okcancelignore" notext="Отмена" yestext="Перейти на Ñтраницу"/>
+ </notification>
+ <notification name="ConfirmQuit">
+ Выйти из программы?
+ <usetemplate ignoretext="Подтверждать перед выходом" name="okcancelignore" notext="Ðе выходить" yestext="Выйти"/>
+ </notification>
+ <notification name="ConfirmRestoreToybox">
+ Это дейÑтвие приведет к воÑÑтановлению Ñтандартных кнопок и панелей инÑтрументов.
+
+Это дейÑтвие Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ.
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmClearAllToybox">
+ Это дейÑтвие возвращает вÑе кнопки в инÑтрументарий, а панели инÑтрументов ÑтановÑÑ‚ÑÑ Ð¿ÑƒÑтыми.
+
+Это дейÑтвие Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ.
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="DeleteItems">
+ [QUESTION]
+ <usetemplate ignoretext="Подтверждать перед удалением предметов" name="okcancelignore" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="HelpReportAbuseEmailLL">
+ Этот инÑтрумент Ñлужит Ð´Ð»Ñ ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾ нарушениÑÑ… [http://secondlife.com/corporate/tos.php ПользовательÑкого ÑоглашениÑ] и [http://secondlife.com/corporate/cs.php Ñтандартов ÑообщеÑтва].
+
+Ð’Ñе нарушениÑ, о которых поÑтупили такие уведомлениÑ, раÑÑледуютÑÑ Ð¸ уÑтранÑÑŽÑ‚ÑÑ.
+ </notification>
+ <notification name="HelpReportAbuseSelectCategory">
+ Выберите категорию Ð´Ð»Ñ Ñтого ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾ нарушении.
+Категории облегчают региÑтрацию и обработку уведомлений.
+ </notification>
+ <notification name="HelpReportAbuseAbuserNameEmpty">
+ Введите Ð¸Ð¼Ñ Ð½Ð°Ñ€ÑƒÑˆÐ¸Ñ‚ÐµÐ»Ñ.
+ТочноÑÑ‚ÑŒ ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð¾Ð±Ð»ÐµÐ³Ñ‡Ð°ÐµÑ‚ региÑтрацию и обработку уведомлений.
+ </notification>
+ <notification name="HelpReportAbuseAbuserLocationEmpty">
+ Укажите меÑто, в котором произошло нарушение.
+ТочноÑÑ‚ÑŒ ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð¾Ð±Ð»ÐµÐ³Ñ‡Ð°ÐµÑ‚ региÑтрацию и обработку уведомлений.
+ </notification>
+ <notification name="HelpReportAbuseSummaryEmpty">
+ Введите краткое опиÑание нарушениÑ.
+ТочноÑÑ‚ÑŒ опиÑÐ°Ð½Ð¸Ñ Ð¾Ð±Ð»ÐµÐ³Ñ‡Ð°ÐµÑ‚ региÑтрацию и обработку уведомлений.
+ </notification>
+ <notification name="HelpReportAbuseDetailsEmpty">
+ Введите подробное опиÑание нарушениÑ.
+Укажите как можно больше конкретных деталей, Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ð¸Ð¼ÐµÐ½Ð° и подробноÑти проиÑшеÑтвиÑ, о котором вы Ñообщаете.
+ТочноÑÑ‚ÑŒ опиÑÐ°Ð½Ð¸Ñ Ð¾Ð±Ð»ÐµÐ³Ñ‡Ð°ÐµÑ‚ региÑтрацию и обработку уведомлений.
+ </notification>
+ <notification name="HelpReportAbuseContainsCopyright">
+ Уважаемый житель!
+
+Ð’Ñ‹ уведомлÑете о нарушении прав интеллектуальной ÑобÑтвенноÑти. УбедитеÑÑŒ, что ваше уведомление ÑоÑтавлено правильно:
+
+(1) ПроцеÑÑ Ñ€ÐµÐ³Ð¸Ñтрации нарушениÑ. Ð’Ñ‹ можете отправить уведомление о нарушении, еÑли Ñчитаете, что какой-либо житель злоупотреблÑет ÑиÑтемой разрешений [SECOND_LIFE], например, Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ CopyBot или аналогичных инÑтрументов копированиÑ, и нарушает таким образом права интеллектуальной ÑобÑтвенноÑти. Ðаш отдел борьбы Ñ Ð½Ð°Ñ€ÑƒÑˆÐµÐ½Ð¸Ñми раÑÑледует такие Ñлучаи и принимает ÑоответÑтвующие диÑциплинарные меры к нарушителÑм [http://secondlife.com/corporate/tos.php ПользовательÑкого ÑоглашениÑ] или [http://secondlife.com/corporate/cs.php Ñтандартов ÑообщеÑтва] [SECOND_LIFE] . Однако отдел борьбы Ñ Ð½Ð°Ñ€ÑƒÑˆÐµÐ½Ð¸Ñми не раÑÑматривает проÑьбы об удалении контента из мира [SECOND_LIFE] и не отвечает на них.
+
+(2) ПроцеÑÑ DMCA или ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½Ñ‚ÐµÐ½Ñ‚Ð°. Ð”Ð»Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа об удалении контента из [SECOND_LIFE] Ñледует ОБЯЗÐТЕЛЬÐО предÑтавить дейÑтвительное уведомление о нарушении в ÑоответÑтвии Ñ Ñ‚Ñ€ÐµÐ±Ð¾Ð²Ð°Ð½Ð¸Ñми нашей [http://secondlife.com/corporate/dmca.php политики DMCA].
+
+ЕÑли вы вÑе же хотите продолжить процеÑÑ Ñ€ÐµÐ³Ð¸Ñтрации нарушениÑ, закройте Ñто окно, ÑоÑтавьте уведомление и отправьте его. При необходимоÑти выберите категорию «CopyBot или нарушение разрешений».
+
+С уважением,
+
+ÐºÐ¾Ð¼Ð¿Ð°Ð½Ð¸Ñ Linden Lab
+ </notification>
+ <notification name="FailedRequirementsCheck">
+ [FLOATER] не Ñодержит Ñледующих обÑзательных компонентов:
+[COMPONENTS]
+ </notification>
+ <notification label="Замена ÑущеÑтвующего приÑоединениÑ" name="ReplaceAttachment">
+ К Ñтой точке вашего тела уже приÑоединен другой объект.
+Заменить его выбранным объектом?
+ <form name="form">
+ <ignore name="ignore" text="Замена ÑущеÑтвующего приÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ñ‹Ð¼ предметом"/>
+ <button ignore="ЗаменÑÑ‚ÑŒ автоматичеÑки" name="Yes" text="OK"/>
+ <button ignore="Ðе заменÑÑ‚ÑŒ" name="No" text="Отмена"/>
+ </form>
+ </notification>
+ <notification label="Предупреждение о режиме «ЗанÑт»" name="BusyModePay">
+ У Ð²Ð°Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½ режим «ЗанÑт», поÑтому вы не получите никаких предметов, предлагаемых в обмен на Ñтот платеж.
+
+Хотите отключить режим «ЗанÑт» до Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ñтой транзакции?
+ <form name="form">
+ <ignore name="ignore" text="Я ÑобираюÑÑŒ заплатить за Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸Ð»Ð¸ объект, когда включен режим «ЗанÑт»"/>
+ <button ignore="Ð’Ñегда отключать режим «ЗанÑт»" name="Yes" text="OK"/>
+ <button ignore="Ðе отключать режим «ЗанÑт»" name="No" text="Отмена"/>
+ </form>
+ </notification>
+ <notification name="ConfirmDeleteProtectedCategory">
+ Папка «[FOLDERNAME]» ÑвлÑетÑÑ ÑиÑтемной. Удаление ÑиÑтемных папок может привеÑти к неÑтабильноÑти. ДейÑтвительно удалить Ñту папку?
+ <usetemplate ignoretext="Подтверждать перед удалением ÑиÑтемной папки" name="okcancelignore" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmEmptyTrash">
+ Ð’Ñ‹ дейÑтвительно хотите необратимо удалить Ñодержимое корзины?
+ <usetemplate ignoretext="Подтверждать перед опорожнением корзины инвентарÑ" name="okcancelignore" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmClearBrowserCache">
+ Ð’Ñ‹ дейÑтвительно хотите удалить журнал Ñвоих перемещений, веб-Ñтраниц и поиÑка?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmClearCache">
+ Ð’Ñ‹ дейÑтвительно хотите очиÑтить кÑш программы?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmClearCookies">
+ Ð’Ñ‹ дейÑтвительно хотите удалить файлы cookie?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="Да"/>
+ </notification>
+ <notification name="ConfirmClearMediaUrlList">
+ Ð’Ñ‹ дейÑтвительно хотите очиÑтить ÑпиÑок Ñохраненных URL-адреÑов?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="Да"/>
+ </notification>
+ <notification name="ConfirmEmptyLostAndFound">
+ Ð’Ñ‹ дейÑтвительно хотите необратимо удалить Ñодержимое Бюро находок?
+ <usetemplate ignoretext="Подтверждать перед опорожнением Бюро находок инвентарÑ" name="okcancelignore" notext="Ðет" yestext="Да"/>
+ </notification>
+ <notification name="CopySLURL">
+ Данный SLurl был Ñкопирован в буфер обмена:
+ [SLURL]
+
+Создайте ÑÑылку на него на веб-Ñтранице Ð´Ð»Ñ Ð¾Ð±Ð»ÐµÐ³Ñ‡ÐµÐ½Ð¸Ñ Ð´Ð¾Ñтупа к Ñтому меÑту или ÑамоÑтоÑтельно вÑтавьте его в адреÑную Ñтроку любого браузера.
+ <form name="form">
+ <ignore name="ignore" text="SLurl Ñкопирован в буфер обмена"/>
+ </form>
+ </notification>
+ <notification name="WLSavePresetAlert">
+ Хотите заменить Ñохраненные наÑтройки?
+ <usetemplate name="okcancelbuttons" notext="Ðет" yestext="Да"/>
+ </notification>
+ <notification name="WLNoEditDefault">
+ Ð’Ñ‹ не можете редактировать или удалÑÑ‚ÑŒ наÑтройку по умолчанию.
+ </notification>
+ <notification name="WLMissingSky">
+ Этот файл Ñуточного цикла ÑÑылаетÑÑ Ð½Ð° отÑутÑтвующий файл неба: [SKY].
+ </notification>
+ <notification name="WLRegionApplyFail">
+ Ðе удалоÑÑŒ применить наÑтройки к региону. Попробуйте покинуть регион, а затем вернутьÑÑ Ð² него. Причина неполадки: [FAIL_REASON]
+ </notification>
+ <notification name="EnvCannotDeleteLastDayCycleKey">
+ Ðевозможно удалить поÑледний ключ в Ñтом Ñуточном цикле: пуÑтой Ñуточный цикл не разрешен. Следует изменить поÑледний оÑтавшийÑÑ ÐºÐ»ÑŽÑ‡, а не удалÑÑ‚ÑŒ его и Ñоздавать новый.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="DayCycleTooManyKeyframes">
+ Ð’ Ñтот Ñуточный цикл больше Ð½ÐµÐ»ÑŒÐ·Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÑÑ‚ÑŒ ключевые кадры. Суточные циклы облаÑти [SCOPE] могут Ñодержать не больше [MAX] ключевых кадров.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="EnvUpdateRate">
+ ÐаÑтройки окружающей Ñреды региона можно обновлÑÑ‚ÑŒ не чаще, чем раз в [WAIT] Ñекунд. Подождите Ñто Ð²Ñ€ÐµÐ¼Ñ Ð¸Ð»Ð¸ дольше и повторите попытку.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="PPSaveEffectAlert">
+ СущеÑтвует Ñффект поÑÑ‚-процеÑÑинга. Заменить его?
+ <usetemplate name="okcancelbuttons" notext="Ðет" yestext="Да"/>
+ </notification>
+ <notification name="ChatterBoxSessionStartError">
+ Ðевозможно начать новый ÑÐµÐ°Ð½Ñ Ñ‡Ð°Ñ‚Ð° Ñ [RECIPIENT].
+[REASON]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ChatterBoxSessionEventError">
+ [EVENT]
+[REASON]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ForceCloseChatterBoxSession">
+ Ваш ÑÐµÐ°Ð½Ñ Ñ‡Ð°Ñ‚Ð° Ñ [NAME] будет закрыт.
+[REASON]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="Cannot_Purchase_an_Attachment">
+ Ð’Ñ‹ не можете купить объект, пока он приÑоединен.
+ </notification>
+ <notification label="О запроÑах на разрешение дебетованиÑ" name="DebitPermissionDetails">
+ ПринÑтие Ñтого запроÑа дает Ñкрипту поÑтоÑнное разрешение на ÑнÑтие Linden-долларов (L$) Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ Ñчета. Ð”Ð»Ñ Ð¾Ñ‚Ð·Ñ‹Ð²Ð° Ñтого Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð²Ð»Ð°Ð´ÐµÐ»ÐµÑ† объекта должен удалить объект или ÑброÑить Ñкрипты в нем.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="AutoWearNewClothing">
+ Ð’Ñ‹ хотите автоматичеÑки надевать Ñоздаваемую вами одежду?
+ <usetemplate ignoretext="Ðадевать одежду, Ñоздаваемую при редактировании моей внешноÑти" name="okcancelignore" notext="Ðет" yestext="Да"/>
+ </notification>
+ <notification name="NotAgeVerified">
+ ДоÑтуп к контенту и облаÑÑ‚Ñм Ð´Ð»Ñ Ð²Ð·Ñ€Ð¾Ñлых в Second Life разрешен только Ñ 18 лет. ПоÑетите нашу Ñтраницу проверки возраÑта и подтвердите, что вам уже иÑполнилоÑÑŒ 18.
+Страница будет открыта в браузере.
+
+[_URL]
+ <url name="url">
+ https://secondlife.com/my/account/verification.php
+ </url>
+ <usetemplate ignoretext="Мой возраÑÑ‚ не подтвержден" name="okcancelignore" notext="Отмена" yestext="Перейти к проверке возраÑта"/>
+ </notification>
+ <notification name="Cannot enter parcel: no payment info on file">
+ Ð”Ð»Ñ Ð¿Ð¾ÑÐµÑ‰ÐµÐ½Ð¸Ñ Ñтой облаÑти необходимо зарегиÑтрировать платеж. Перейти на веб-Ñайт [SECOND_LIFE] и ввеÑти Ñту информацию?
+
+[_URL]
+ <url name="url">
+ https://secondlife.com/account/
+ </url>
+ <usetemplate ignoretext="У Ð¼ÐµÐ½Ñ Ð½Ðµ зарегиÑтрирована Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ платежах" name="okcancelignore" notext="Ðет" yestext="Да"/>
+ </notification>
+ <notification name="MissingString">
+ Строка [STRING_NAME] отÑутÑтвует в strings.xml
+ </notification>
+ <notification name="SystemMessageTip">
+ [MESSAGE]
+ </notification>
+ <notification name="IMSystemMessageTip">
+ [MESSAGE]
+ </notification>
+ <notification name="Cancelled">
+ Отменено
+ </notification>
+ <notification name="CancelledSit">
+ ÐžÑ‚Ð¼ÐµÐ½ÐµÐ½Ð½Ð°Ñ Ð¿Ð¾Ñадка
+ </notification>
+ <notification name="CancelledAttach">
+ Отмененное приÑоединение
+ </notification>
+ <notification name="ReplacedMissingWearable">
+ ОтÑутÑÑ‚Ð²ÑƒÑŽÑ‰Ð°Ñ Ð¾Ð´ÐµÐ¶Ð´Ð°/чаÑÑ‚ÑŒ тела заменена вещью по умолчанию.
+ </notification>
+ <notification name="GroupNotice">
+ Раздел: [SUBJECT], Ñообщение: [MESSAGE]
+ </notification>
+ <notification name="FriendOnline">
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; в Ñети
+ </notification>
+ <notification name="FriendOffline">
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; не в Ñети
+ </notification>
+ <notification name="AddSelfFriend">
+ Ð’Ñ‹ лучше вÑех, но Ð½ÐµÐ»ÑŒÐ·Ñ Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ‚ÑŒ в Ð´Ñ€ÑƒÐ·ÑŒÑ ÑÐµÐ±Ñ Ñамого.
+ </notification>
+ <notification name="UploadingAuctionSnapshot">
+ Передача Ñнимков мира и веб-Ñайта...
+(Занимает около 5 мин.)
+ </notification>
+ <notification name="UploadPayment">
+ Вы заплатили L$[AMOUNT] за передачу.
+ </notification>
+ <notification name="UploadWebSnapshotDone">
+ Передача Ñнимка веб-Ñайта завершена.
+ </notification>
+ <notification name="UploadSnapshotDone">
+ Передача Ñнимка мира завершена.
+ </notification>
+ <notification name="TerrainDownloaded">
+ Загрузка Terrain.raw завершена
+ </notification>
+ <notification name="GestureMissing">
+ ЖеÑта [NAME] нет в базе данных.
+ </notification>
+ <notification name="UnableToLoadGesture">
+ Ðевозможно загрузить жеÑÑ‚ [NAME].
+ </notification>
+ <notification name="LandmarkMissing">
+ Закладки нет в базе данных.
+ </notification>
+ <notification name="UnableToLoadLandmark">
+ Ðевозможно загрузить закладку. Повторите попытку.
+ </notification>
+ <notification name="CapsKeyOn">
+ Включен режим CAPS LOCK.
+Пароль может быть введен неправильно.
+ </notification>
+ <notification name="NotecardMissing">
+ Заметки нет в базе данных.
+ </notification>
+ <notification name="NotecardNoPermissions">
+ У Ð²Ð°Ñ Ð½ÐµÑ‚ прав Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра Ñтой заметки.
+ </notification>
+ <notification name="RezItemNoPermissions">
+ ÐедоÑтаточно разрешений Ð´Ð»Ñ Ð²Ñ‹ÐºÐ»Ð°Ð´Ñ‹Ð²Ð°Ð½Ð¸Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð°.
+ </notification>
+ <notification name="IMAcrossParentEstates">
+ Ðевозможно отправить Ñообщение из одного родительÑкого Ð·ÐµÐ¼Ð»ÐµÐ²Ð»Ð°Ð´ÐµÐ½Ð¸Ñ Ð² другое.
+ </notification>
+ <notification name="TransferInventoryAcrossParentEstates">
+ Ðевозможно перенеÑти инвентарь из одного родительÑкого Ð·ÐµÐ¼Ð»ÐµÐ²Ð»Ð°Ð´ÐµÐ½Ð¸Ñ Ð² другое.
+ </notification>
+ <notification name="UnableToLoadNotecard">
+ Ðевозможно загрузить заметку.
+Повторите попытку.
+ </notification>
+ <notification name="ScriptMissing">
+ Скрипта нет в базе данных.
+ </notification>
+ <notification name="ScriptNoPermissions">
+ ÐедоÑтаточно разрешений Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра Ñкрипта.
+ </notification>
+ <notification name="UnableToLoadScript">
+ Ðевозможно загрузить Ñкрипт. Повторите попытку.
+ </notification>
+ <notification name="IncompleteInventory">
+ Ð’Ñе предлагаемое вами Ñодержимое еще не доÑтупно в данном меÑте. Попробуйте вновь предложить Ñти вещи через минуту.
+ </notification>
+ <notification name="CannotModifyProtectedCategories">
+ Защищенные категории Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½ÑÑ‚ÑŒ.
+ </notification>
+ <notification name="CannotRemoveProtectedCategories">
+ Защищенные категории Ð½ÐµÐ»ÑŒÐ·Ñ ÑƒÐ´Ð°Ð»ÑÑ‚ÑŒ.
+ </notification>
+ <notification name="UnableToBuyWhileDownloading">
+ Покупка во Ð²Ñ€ÐµÐ¼Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸ данных объекта невозможна.
+Повторите попытку.
+ </notification>
+ <notification name="UnableToLinkWhileDownloading">
+ Создание ÑвÑзи во Ð²Ñ€ÐµÐ¼Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸ данных объекта невозможно.
+Повторите попытку.
+ </notification>
+ <notification name="CannotBuyObjectsFromDifferentOwners">
+ Можно купить объекты за один раз только у одного владельца.
+Выберите один объект.
+ </notification>
+ <notification name="ObjectNotForSale">
+ Этот объект не Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð°Ð¶Ð¸.
+ </notification>
+ <notification name="EnteringGodMode">
+ Переход в режим творца, уровень [LEVEL]
+ </notification>
+ <notification name="LeavingGodMode">
+ Переход из режима творца, уровень [LEVEL]
+ </notification>
+ <notification name="CopyFailed">
+ У Ð²Ð°Ñ Ð½ÐµÑ‚ прав на копирование Ñтого предмета.
+ </notification>
+ <notification name="InventoryAccepted">
+ [NAME] получил(а) ваше предложение инвентарÑ.
+ </notification>
+ <notification name="InventoryDeclined">
+ [NAME] отклонил(а) ваше предложение инвентарÑ.
+ </notification>
+ <notification name="ObjectMessage">
+ [NAME]: [MESSAGE]
+ </notification>
+ <notification name="CallingCardAccepted">
+ Ваша визитка принÑта.
+ </notification>
+ <notification name="CallingCardDeclined">
+ Ваша визитка отклонена.
+ </notification>
+ <notification name="TeleportToLandmark">
+ Ð”Ð»Ñ Ñ‚ÐµÐ»ÐµÐ¿Ð¾Ñ€Ñ‚Ð°Ñ†Ð¸Ð¸ в другое меÑто, например «[NAME]», нажмите кнопку «МеÑта»,
+ затем в открывшемÑÑ Ð¾ÐºÐ½Ðµ выберите вкладку «Закладки». Щелкните любую
+ закладку, чтобы выбрать ее, а затем нажмите кнопку «ТелепортациÑ» внизу окна.
+ (Также можно дважды щелкнуть закладку или щелкнуть ее правой кнопкой мыши и
+ выбрать команду «ТелепортациÑ».)
+ </notification>
+ <notification name="TeleportToPerson">
+ Чтобы обратитьÑÑ Ðº жителю, например «[NAME]», нажмите кнопку «Люди», выберите Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ð² поÑвившемÑÑ Ð¾ÐºÐ½Ðµ и нажмите кнопку
+ «IM» внизу окна.
+ (Также можно дважды щелкнуть Ð¸Ð¼Ñ Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ð² ÑпиÑке или щелкнуть его правой кнопкой мыши и выбрать команду «IM».)
+ </notification>
+ <notification name="CantSelectLandFromMultipleRegions">
+ ÐÐµÐ»ÑŒÐ·Ñ Ð²Ñ‹Ð±Ñ€Ð°Ñ‚ÑŒ землю Ñ Ð¾Ð±ÐµÐ¸Ñ… Ñторон границы между Ñерверами.
+Попробуйте выбрать учаÑток поменьше.
+ </notification>
+ <notification name="SearchWordBanned">
+ Ðекоторые Ñлова иÑключены из вашего поиÑкового запроÑа из-за ограничений контента, уÑтановленных в Ñтандартах ÑообщеÑтва.
+ </notification>
+ <notification name="NoContentToSearch">
+ Выберите Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ один тип контента Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка («Общий», «Умеренный» или Â«Ð”Ð»Ñ Ð²Ð·Ñ€Ð¾Ñлых»).
+ </notification>
+ <notification name="SystemMessage">
+ [MESSAGE]
+ </notification>
+ <notification name="PaymentReceived">
+ [MESSAGE]
+ </notification>
+ <notification name="PaymentSent">
+ [MESSAGE]
+ </notification>
+ <notification name="PaymentFailure">
+ [MESSAGE]
+ </notification>
+ <notification name="EventNotification">
+ Уведомление о Ñобытии:
+
+[NAME]
+[DATE]
+ <form name="form">
+ <button name="Details" text="ПодробноÑти"/>
+ <button name="Cancel" text="Отмена"/>
+ </form>
+ </notification>
+ <notification name="TransferObjectsHighlighted">
+ Ð’Ñе объекты на Ñтом учаÑтке, которые будут переданы его покупателю, выделены цветом.
+
+* Передаваемые Ð´ÐµÑ€ÐµÐ²ÑŒÑ Ð¸ трава не выделÑÑŽÑ‚ÑÑ.
+ <form name="form">
+ <button name="Done" text="Готово"/>
+ </form>
+ </notification>
+ <notification name="DeactivatedGesturesTrigger">
+ Деактивированные жеÑÑ‚Ñ‹ Ñ Ñ‚ÐµÐ¼ же триггером:
+[NAMES]
+ </notification>
+ <notification name="NoQuickTime">
+ Ð’ вашей ÑиÑтеме не уÑтановлено программное обеÑпечение Apple QuickTime.
+Ð”Ð»Ñ Ð¿Ñ€Ð¾Ñмотра потокового медиа на учаÑтках, которые поддерживают его, перейдите на Ñайт [http://www.apple.com/quicktime QuickTime] и уÑтановите QuickTime Player.
+ </notification>
+ <notification name="NoPlugin">
+ Ðе найден медиа-плагин Ð´Ð»Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸ данных типа MIME «[MIME_TYPE]». Медиа Ñтого типа будет недоÑтупно.
+ </notification>
+ <notification name="MediaPluginFailed">
+ Ошибка Ñледующего медиа-плагина:
+ [PLUGIN]
+
+ПереуÑтановите плагин или обратитеÑÑŒ к его разработчику, еÑли ошибки возникают Ñнова.
+ <form name="form">
+ <ignore name="ignore" text="Ðе удалоÑÑŒ запуÑтить медиа-плагин"/>
+ </form>
+ </notification>
+ <notification name="OwnedObjectsReturned">
+ Принадлежащие вам объекты на выбранном земельном учаÑтке возвращены в ваш инвентарь.
+ </notification>
+ <notification name="OtherObjectsReturned">
+ Принадлежащие [NAME] объекты на выбранном земельном учаÑтке возвращены в его инвентарь.
+ </notification>
+ <notification name="OtherObjectsReturned2">
+ Принадлежащие жителю «[NAME]» объекты на выбранном земельном учаÑтке возвращены владельцу.
+ </notification>
+ <notification name="GroupObjectsReturned">
+ Переданные группе [GROUPNAME] объекты на выбранном земельном учаÑтке возвращены в инвентарь владельцев.
+ПереноÑимые переданные объекты возвращены прежним владельцам.
+ÐепереноÑимые объекты, переданные группе, удалены.
+ </notification>
+ <notification name="UnOwnedObjectsReturned">
+ Объекты на выбранном земельном учаÑтке, ÐЕ принадлежащие вам, возвращены владельцам.
+ </notification>
+ <notification name="ServerObjectMessage">
+ Сообщение от [NAME]:
+&lt;nolink&gt;[MSG]&lt;/nolink&gt;
+ </notification>
+ <notification name="NotSafe">
+ Ðа Ñтой земле разрешены повреждениÑ.
+ЗдеÑÑŒ вы можете поÑтрадать. ЕÑли вы умрете, вы будете телепортированы в ваше домашнее меÑтоположение.
+ </notification>
+ <notification name="NoFly">
+ Ð’ Ñтой облаÑти запрещены полеты.
+Ð’Ñ‹ не Ñможете здеÑÑŒ летать.
+ </notification>
+ <notification name="PushRestricted">
+ Ð’ Ñтой облаÑти запрещено толкатьÑÑ. ЗдеÑÑŒ вы не можете никого толкать, только еÑли не ÑвлÑетеÑÑŒ владельцем земли.
+ </notification>
+ <notification name="NoVoice">
+ Ð’ Ñтой облаÑти запрещен голоÑовой чат. ЗдеÑÑŒ вы не уÑлышите ничью речь.
+ </notification>
+ <notification name="NoBuild">
+ Ð’ Ñтой облаÑти запрещено ÑтроительÑтво. ЗдеÑÑŒ вы не Ñможете Ñтроить или выкладывать объекты.
+ </notification>
+ <notification name="SeeAvatars">
+ Ðа Ñтом учаÑтке аватары и текÑтовый чат Ñкрыты от другого учаÑтка. Жителей за пределами Ñтого учаÑтка не будет видно, а они не будут видеть ваÑ. Обычный текÑтовый чат на канале 0 также блокируетÑÑ.
+ </notification>
+ <notification name="ScriptsStopped">
+ ÐдминиÑтратор временно оÑтановил вÑе Ñкрипты в Ñтом регионе.
+ </notification>
+ <notification name="ScriptsNotRunning">
+ Ð’ Ñтом регионе не работают любые Ñкрипты.
+ </notification>
+ <notification name="NoOutsideScripts">
+ Ðа Ñтой земле запрещены внешние Ñкрипты.
+
+ЗдеÑÑŒ будут работать только Ñкрипты, принадлежащие владельцу земли.
+ </notification>
+ <notification name="ClaimPublicLand">
+ Ð’Ñ‹ можете претендовать на публичную землю только в регионе, в котором вы находитеÑÑŒ.
+ </notification>
+ <notification name="RegionTPAccessBlocked">
+ Вам Ð½ÐµÐ»ÑŒÐ·Ñ Ð±Ñ‹Ñ‚ÑŒ в Ñтом регионе из-за вашего рейтинга зрелоÑти. Подтвердите Ñвой возраÑÑ‚ и/или уÑтановите поÑледнюю верÑию клиента.
+
+Прочитайте в Базе знаний о доÑтупе к облаÑÑ‚Ñм Ñ Ñтим рейтингом зрелоÑти.
+ </notification>
+ <notification name="URBannedFromRegion">
+ Вы забанены в регионе.
+ </notification>
+ <notification name="NoTeenGridAccess">
+ Ваш аккаунт не может подключитьÑÑ Ðº Ñтому региону Ñетки Ð´Ð»Ñ Ð¿Ð¾Ð´Ñ€Ð¾Ñтков.
+ </notification>
+ <notification name="ImproperPaymentStatus">
+ У Ð²Ð°Ñ Ð½ÐµÑ‚ необходимого ÑтатуÑа оплаты Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ð° в Ñтот регион.
+ </notification>
+ <notification name="MustGetAgeRgion">
+ Ð”Ð»Ñ Ð²Ñ…Ð¾Ð´Ð° в Ñтот регион необходимо подтверждение возраÑта.
+ </notification>
+ <notification name="MustGetAgeParcel">
+ Ð”Ð»Ñ Ð²Ñ…Ð¾Ð´Ð° на Ñтот учаÑток необходимо подтверждение возраÑта.
+ </notification>
+ <notification name="NoDestRegion">
+ Ðе найден регион назначениÑ.
+ </notification>
+ <notification name="NotAllowedInDest">
+ Вам не разрешен доÑтуп в пункт назначениÑ.
+ </notification>
+ <notification name="RegionParcelBan">
+ ÐÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÑечь границу региона по пути на забаненный учаÑток. Выберите другой путь.
+ </notification>
+ <notification name="TelehubRedirect">
+ Вы перенаправлены на телехаб.
+ </notification>
+ <notification name="CouldntTPCloser">
+ Ðе удалоÑÑŒ телепортироватьÑÑ Ð±Ð»Ð¸Ð¶Ðµ к пункту назначениÑ.
+ </notification>
+ <notification name="TPCancelled">
+ Ð¢ÐµÐ»ÐµÐ¿Ð¾Ñ€Ñ‚Ð°Ñ†Ð¸Ñ Ð¾Ñ‚Ð¼ÐµÐ½ÐµÐ½Ð°.
+ </notification>
+ <notification name="FullRegionTryAgain">
+ Попытка входа в регион, который ÑÐµÐ¹Ñ‡Ð°Ñ Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½.
+Повторите попытку через неÑколько минут.
+ </notification>
+ <notification name="GeneralFailure">
+ Общий Ñбой.
+ </notification>
+ <notification name="RoutedWrongRegion">
+ Ðаправление в неверный регион. Повторите попытку.
+ </notification>
+ <notification name="NoValidAgentID">
+ Ðет подходÑщего идентификатора агента.
+ </notification>
+ <notification name="NoValidSession">
+ Ðет подходÑщего идентификатора ÑеанÑа.
+ </notification>
+ <notification name="NoValidCircuit">
+ Ðет подходÑщего кода канала.
+ </notification>
+ <notification name="NoValidTimestamp">
+ Ðет подходÑщей метки времени.
+ </notification>
+ <notification name="NoPendingConnection">
+ Ðевозможно Ñоздать отложенное Ñоединение.
+ </notification>
+ <notification name="InternalUsherError">
+ ВнутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ° при попытке подключить агента-провожатого.
+ </notification>
+ <notification name="NoGoodTPDestination">
+ Ðе удалоÑÑŒ найти подходÑщую точку Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ñ‚ÐµÐ»ÐµÐ¿Ð¾Ñ€Ñ‚Ð° в Ñтом регионе.
+ </notification>
+ <notification name="InternalErrorRegionResolver">
+ ВнутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ° при попытке активировать раÑÐ¿Ð¾Ð·Ð½Ð°Ð²Ð°Ñ‚ÐµÐ»Ñ Ñ€ÐµÐ³Ð¸Ð¾Ð½Ð°.
+ </notification>
+ <notification name="NoValidLanding">
+ Ðе удалоÑÑŒ найти подходÑщую точку приземлениÑ.
+ </notification>
+ <notification name="NoValidParcel">
+ Ðе удалоÑÑŒ найти подходÑщий учаÑток.
+ </notification>
+ <notification name="ObjectGiveItem">
+ Объект &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt;, которым владеет [NAME_SLURL], дал вам Ñтот [OBJECTTYPE]:
+&lt;nolink&gt;[ITEM_SLURL]&lt;/nolink&gt;
+ <form name="form">
+ <button name="Keep" text="ОÑтавить"/>
+ <button name="Discard" text="Удалить"/>
+ <button name="Mute" text="Блокировать владельца"/>
+ </form>
+ </notification>
+ <notification name="OwnObjectGiveItem">
+ Ваш объект &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; дал вам Ñтот [OBJECTTYPE]:
+&lt;nolink&gt;[ITEM_SLURL]&lt;/nolink&gt;
+ <form name="form">
+ <button name="Keep" text="ОÑтавить"/>
+ <button name="Discard" text="Удалить"/>
+ </form>
+ </notification>
+ <notification name="UserGiveItem">
+ [NAME_SLURL] дал(а) вам Ñтот [OBJECTTYPE]:
+[ITEM_SLURL]
+ <form name="form">
+ <button name="Show" text="Показать"/>
+ <button name="Discard" text="Удалить"/>
+ <button name="Mute" text="Заблокировать"/>
+ </form>
+ </notification>
+ <notification name="GodMessage">
+ [NAME]
+
+[MESSAGE]
+ </notification>
+ <notification name="JoinGroup">
+ [MESSAGE]
+ <form name="form">
+ <button name="Join" text="Ð’Ñтупить"/>
+ <button name="Decline" text="Отклонить"/>
+ <button name="Info" text="ИнформациÑ"/>
+ </form>
+ </notification>
+ <notification name="TeleportOffered">
+ [NAME_SLURL] предложил(а) телепортировать Ð²Ð°Ñ Ðº Ñебе:
+
+[MESSAGE] - [MATURITY_STR] &lt;icon&gt;[MATURITY_ICON]&lt;/icon&gt;
+ <form name="form">
+ <button name="Teleport" text="ТелепортациÑ"/>
+ <button name="Cancel" text="Отмена"/>
+ </form>
+ </notification>
+ <notification name="TeleportOfferSent">
+ Предложение телепортации отправлено [TO_NAME]
+ </notification>
+ <notification name="GotoURL">
+ [MESSAGE]
+[URL]
+ <form name="form">
+ <button name="Later" text="Позже"/>
+ <button name="GoNow..." text="Перейти ÑейчаÑ..."/>
+ </form>
+ </notification>
+ <notification name="OfferFriendship">
+ [NAME_SLURL] предлагает дружить.
+
+[MESSAGE]
+
+(По умолчанию вы будете видеть ÑÑ‚Ð°Ñ‚ÑƒÑ Ð´Ñ€ÑƒÐ³ друга.)
+ <form name="form">
+ <button name="Accept" text="ПринÑÑ‚ÑŒ"/>
+ <button name="Decline" text="Отклонить"/>
+ </form>
+ </notification>
+ <notification name="FriendshipOffered">
+ Вы предложили дружить пользователю [TO_NAME]
+ </notification>
+ <notification name="OfferFriendshipNoMessage">
+ [NAME_SLURL] предлагает дружить.
+
+(По умолчанию вы будете видеть ÑÑ‚Ð°Ñ‚ÑƒÑ Ð´Ñ€ÑƒÐ³ друга.)
+ <form name="form">
+ <button name="Accept" text="ПринÑÑ‚ÑŒ"/>
+ <button name="Decline" text="Отклонить"/>
+ </form>
+ </notification>
+ <notification name="FriendshipAccepted">
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; принÑл(а) ваше предложение дружить.
+ </notification>
+ <notification name="FriendshipDeclined">
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; отклонил(а) ваше предложение дружить.
+ </notification>
+ <notification name="FriendshipAcceptedByMe">
+ Предложение дружить принÑто.
+ </notification>
+ <notification name="FriendshipDeclinedByMe">
+ Предложение дружить отклонено.
+ </notification>
+ <notification name="OfferCallingCard">
+ [NAME] предлагает Ñвою визитку.
+При Ñтом в вашем инвентаре поÑвитÑÑ Ð·Ð°ÐºÐ»Ð°Ð´ÐºÐ° Ð´Ð»Ñ Ð±Ñ‹Ñтрой ÑвÑзи Ñ Ñтим жителем.
+ <form name="form">
+ <button name="Accept" text="ПринÑÑ‚ÑŒ"/>
+ <button name="Decline" text="Отклонить"/>
+ </form>
+ </notification>
+ <notification name="RegionRestartMinutes">
+ Этот регион будет перезапущен через [MINUTES] мин.
+ЕÑли вы оÑтанетеÑÑŒ в Ñтом регионе, вы выйдете из программы.
+ </notification>
+ <notification name="RegionRestartSeconds">
+ Этот регион будет перезапущен через [SECONDS] Ñек.
+ЕÑли вы оÑтанетеÑÑŒ в Ñтом регионе, вы выйдете из программы.
+ </notification>
+ <notification name="LoadWebPage">
+ Загрузить веб-Ñтраницу [URL]?
+
+[MESSAGE]
+
+Из объекта: &lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;, владелец: [NAME]?
+ <form name="form">
+ <button name="Gotopage" text="Перейти на Ñтраницу"/>
+ <button name="Cancel" text="Отмена"/>
+ </form>
+ </notification>
+ <notification name="FailedToFindWearableUnnamed">
+ Ðе удалоÑÑŒ найти [TYPE] в базе данных.
+ </notification>
+ <notification name="FailedToFindWearable">
+ Ðе удалоÑÑŒ найти [TYPE] Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ [DESC] в базе данных.
+ </notification>
+ <notification name="InvalidWearable">
+ Попытка надеть предмет, функцию которого программа не может раÑпознать. Обновите Ñвою верÑию [APP_NAME] Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñтим предметом.
+ </notification>
+ <notification name="ScriptQuestion">
+ Объект «&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;», владелец которого – «[NAME]», желает:
+
+[QUESTIONS]
+Это правильно?
+ <form name="form">
+ <button name="Yes" text="Да"/>
+ <button name="No" text="Ðет"/>
+ <button name="Mute" text="Заблокировать"/>
+ </form>
+ </notification>
+ <notification name="ScriptQuestionCaution">
+ Объект «&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;», владелец которого – «[NAME]», желает:
+
+[QUESTIONS]
+ЕÑли вы не доверÑете Ñтому объекту или его Ñоздателю, отклоните запроÑ.
+
+ПринÑÑ‚ÑŒ Ñтот запроÑ?
+ <form name="form">
+ <button name="Grant" text="ПринÑÑ‚ÑŒ"/>
+ <button name="Deny" text="Отклонить"/>
+ <button name="Details" text="ПодробноÑти..."/>
+ </form>
+ </notification>
+ <notification name="ScriptDialog">
+ [NAME] – «&lt;nolink&gt;[TITLE]&lt;/nolink&gt;»
+[MESSAGE]
+ <form name="form">
+ <button name="Client_Side_Mute" text="Заблокировать"/>
+ <button name="Client_Side_Ignore" text="Игнорировать"/>
+ </form>
+ </notification>
+ <notification name="ScriptDialogGroup">
+ [GROUPNAME] – «&lt;nolink&gt;[TITLE]&lt;/nolink&gt;»
+[MESSAGE]
+ <form name="form">
+ <button name="Client_Side_Mute" text="Заблокировать"/>
+ <button name="Client_Side_Ignore" text="Игнорировать"/>
+ </form>
+ </notification>
+ <notification name="BuyLindenDollarSuccess">
+ Благодарим за оплату!
+
+По окончании обработки Ð±Ð°Ð»Ð°Ð½Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ Ñчета в L$ будет обновлен. ЕÑли обработка займет более 20 мин, ваша Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ‚ быть отменена. Ð’ Ñтом Ñлучае Ñумма платежа будет запиÑана на ваш Ð±Ð°Ð»Ð°Ð½Ñ Ð² долларах СШÐ.
+
+СоÑтоÑние ваших платежей можно проверить на Ñтранице «Журнал транзакций» на вашей [http://secondlife.com/account/ информационной панели].
+ </notification>
+ <notification name="FirstOverrideKeys">
+ Ваши клавиши Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ñ‚ÐµÐ¿ÐµÑ€ÑŒ обрабатываютÑÑ Ð¾Ð±ÑŠÐµÐºÑ‚Ð¾Ð¼.
+Попробуйте иÑпользовать клавиши Ñо Ñтрелками или AWSD.
+Ð”Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… объектов (например, оружиÑ) необходимо перейти в режим обзора мышью.
+Ð”Ð»Ñ Ñтого нажмите клавишу «M».
+ </notification>
+ <notification name="FirstSandbox">
+ Это облаÑÑ‚ÑŒ-пеÑочница, в которой жители учатÑÑ ÑтроительÑтву.
+
+ПоÑтроенные вами предметы удалÑÑŽÑ‚ÑÑ Ð¿Ñ€Ð¸ вашем выходе из пеÑочницы, поÑтому не забывайте щелкать их правой кнопкой мыши и выбирать команду «ВзÑть» Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ½Ð¾Ñа ваших творений в инвентарь.
+ </notification>
+ <notification name="MaxListSelectMessage">
+ Ð’ Ñтом ÑпиÑке можно выбрать не более [MAX_SELECT] пунктов.
+ </notification>
+ <notification name="VoiceInviteP2P">
+ [NAME] приглашает Ð²Ð°Ñ Ð² голоÑовой чат.
+Ðажмите кнопку «ПринÑть» Ð´Ð»Ñ Ð¿Ñ€Ð¸ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ðº чату или «Отклонить» Ð´Ð»Ñ Ð¾Ñ‚ÐºÐ°Ð·Ð° от приглашениÑ. Ðажмите «Заблокировать» Ð´Ð»Ñ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²ÐºÐ¸ Ñтого абонента.
+ <form name="form">
+ <button name="Accept" text="ПринÑÑ‚ÑŒ"/>
+ <button name="Decline" text="Отклонить"/>
+ <button name="Mute" text="Заблокировать"/>
+ </form>
+ </notification>
+ <notification name="AutoUnmuteByIM">
+ [NAME] отправил(а) вам мгновенное Ñообщение и был(а) автоматичеÑки разблокирован(а).
+ </notification>
+ <notification name="AutoUnmuteByMoney">
+ [NAME] получил(а) деньги и был(а) автоматичеÑки разблокирован(а).
+ </notification>
+ <notification name="AutoUnmuteByInventory">
+ [NAME] предложил(а) инвентарь и был(а) автоматичеÑки разблокирован(а).
+ </notification>
+ <notification name="VoiceInviteGroup">
+ [NAME] вÑтупил(а) в голоÑовой чат Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð¾Ð¹ [GROUP].
+Ðажмите кнопку «ПринÑть» Ð´Ð»Ñ Ð¿Ñ€Ð¸ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ðº чату или «Отклонить» Ð´Ð»Ñ Ð¾Ñ‚ÐºÐ°Ð·Ð° от приглашениÑ. Ðажмите «Заблокировать» Ð´Ð»Ñ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²ÐºÐ¸ Ñтого абонента.
+ <form name="form">
+ <button name="Accept" text="ПринÑÑ‚ÑŒ"/>
+ <button name="Decline" text="Отклонить"/>
+ <button name="Mute" text="Заблокировать"/>
+ </form>
+ </notification>
+ <notification name="VoiceInviteAdHoc">
+ [NAME] вÑтупил(а) в голоÑовой чат Ñ ÐºÐ¾Ð½Ñ„ÐµÑ€ÐµÐ½Ñ†Ð¸ÐµÐ¹.
+Ðажмите кнопку «ПринÑть» Ð´Ð»Ñ Ð¿Ñ€Ð¸ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ðº чату или «Отклонить» Ð´Ð»Ñ Ð¾Ñ‚ÐºÐ°Ð·Ð° от приглашениÑ. Ðажмите «Заблокировать» Ð´Ð»Ñ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²ÐºÐ¸ Ñтого абонента.
+ <form name="form">
+ <button name="Accept" text="ПринÑÑ‚ÑŒ"/>
+ <button name="Decline" text="Отклонить"/>
+ <button name="Mute" text="Заблокировать"/>
+ </form>
+ </notification>
+ <notification name="InviteAdHoc">
+ [NAME] приглашает Ð²Ð°Ñ Ð² чат Ñ ÐºÐ¾Ð½Ñ„ÐµÑ€ÐµÐ½Ñ†Ð¸ÐµÐ¹.
+Ðажмите кнопку «ПринÑть» Ð´Ð»Ñ Ð¿Ñ€Ð¸ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ðº чату или «Отклонить» Ð´Ð»Ñ Ð¾Ñ‚ÐºÐ°Ð·Ð° от приглашениÑ. Ðажмите «Заблокировать» Ð´Ð»Ñ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²ÐºÐ¸ Ñтого абонента.
+ <form name="form">
+ <button name="Accept" text="ПринÑÑ‚ÑŒ"/>
+ <button name="Decline" text="Отклонить"/>
+ <button name="Mute" text="Заблокировать"/>
+ </form>
+ </notification>
+ <notification name="VoiceChannelFull">
+ Ð’Ñ‹ пытаетеÑÑŒ подключитьÑÑ Ðº голоÑовому чату [VOICE_CHANNEL_NAME], в котором уже доÑтигнута макÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÐµÐ¼ÐºÐ¾ÑÑ‚ÑŒ. Повторите попытку позже.
+ </notification>
+ <notification name="ProximalVoiceChannelFull">
+ ПриноÑим извинениÑ. Ð’ Ñтой облаÑти уже доÑтигнута макÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÐµÐ¼ÐºÐ¾ÑÑ‚ÑŒ голоÑовых чатов. Попробуйте иÑпользовать Ð³Ð¾Ð»Ð¾Ñ Ð² другой облаÑти.
+ </notification>
+ <notification name="VoiceChannelDisconnected">
+ Ð’Ñ‹ были отключены от [VOICE_CHANNEL_NAME]. Будет уÑтановлено подключение к локальному голоÑовому чату.
+ </notification>
+ <notification name="VoiceChannelDisconnectedP2P">
+ [VOICE_CHANNEL_NAME] завершил вызов. Будет уÑтановлено подключение к локальному голоÑовому чату.
+ </notification>
+ <notification name="P2PCallDeclined">
+ [VOICE_CHANNEL_NAME] отклонил ваш вызов. Будет уÑтановлено подключение к локальному голоÑовому чату.
+ </notification>
+ <notification name="P2PCallNoAnswer">
+ [VOICE_CHANNEL_NAME] не может принÑÑ‚ÑŒ ваш вызов. Будет уÑтановлено подключение к локальному голоÑовому чату.
+ </notification>
+ <notification name="VoiceChannelJoinFailed">
+ Ðе удалоÑÑŒ подключитьÑÑ Ðº [VOICE_CHANNEL_NAME], повторите попытку позже. Будет уÑтановлено подключение к локальному голоÑовому чату.
+ </notification>
+ <notification name="VoiceLoginRetry">
+ СоздаетÑÑ Ð³Ð¾Ð»Ð¾Ñовой канал Ð´Ð»Ñ Ð²Ð°Ñ. Создание займет не больше минуты.
+ </notification>
+ <notification name="VoiceEffectsExpired">
+ ИÑтек Ñрок дейÑÑ‚Ð²Ð¸Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ или неÑкольких типов Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð³Ð¾Ð»Ð¾Ñа, на которые вы подпиÑаны.
+[[URL] Щелкните здеÑÑŒ], чтобы обновить подпиÑку.
+ </notification>
+ <notification name="VoiceEffectsExpiredInUse">
+ ИÑтек Ñрок дейÑÑ‚Ð²Ð¸Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¾Ð³Ð¾ типа Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð³Ð¾Ð»Ð¾Ñа, применены наÑтройки вашего обычного голоÑа.
+[[URL] Щелкните здеÑÑŒ], чтобы обновить подпиÑку.
+ </notification>
+ <notification name="VoiceEffectsWillExpire">
+ Срок дейÑÑ‚Ð²Ð¸Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ или неÑкольких ваших типов Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð³Ð¾Ð»Ð¾Ñа иÑтекает через [INTERVAL] дней или раньше.
+[[URL] Щелкните здеÑÑŒ], чтобы обновить подпиÑку.
+ </notification>
+ <notification name="VoiceEffectsNew">
+ ПоÑвилиÑÑŒ новые типы Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð³Ð¾Ð»Ð¾Ñа!
+ </notification>
+ <notification name="Cannot enter parcel: not a group member">
+ Эту облаÑÑ‚ÑŒ могут поÑещать только учаÑтники определенной группы.
+ </notification>
+ <notification name="Cannot enter parcel: banned">
+ ÐÐµÐ»ÑŒÐ·Ñ Ð²Ð¾Ð¹Ñ‚Ð¸ на учаÑток, вы забанены.
+ </notification>
+ <notification name="Cannot enter parcel: not on access list">
+ ÐÐµÐ»ÑŒÐ·Ñ Ð²Ð¾Ð¹Ñ‚Ð¸ на учаÑток, Ð²Ð°Ñ Ð½ÐµÑ‚ в ÑпиÑке доÑтупа.
+ </notification>
+ <notification name="VoiceNotAllowed">
+ У Ð²Ð°Ñ Ð½ÐµÑ‚ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð½Ð° подключение к голоÑовому чату Ð´Ð»Ñ [VOICE_CHANNEL_NAME].
+ </notification>
+ <notification name="VoiceCallGenericError">
+ Ошибка при попытке Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº голоÑовому чату Ð´Ð»Ñ [VOICE_CHANNEL_NAME]. Повторите попытку позже.
+ </notification>
+ <notification name="UnsupportedCommandSLURL">
+ Щелчок на неподдерживаемом SLurl.
+ </notification>
+ <notification name="BlockedSLURL">
+ SLurl получен от ненадежного браузера и заблокирован по ÑоображениÑм безопаÑноÑти.
+ </notification>
+ <notification name="ThrottledSLURL">
+ ÐеÑколько SLurl получены от ненадежного браузера за короткое времÑ.
+Ð”Ð»Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑноÑти они будут заблокированы на неÑколько Ñекунд.
+ </notification>
+ <notification name="IMToast">
+ [MESSAGE]
+ <form name="form">
+ <button name="respondbutton" text="Ответить"/>
+ </form>
+ </notification>
+ <notification name="ConfirmCloseAll">
+ Ð’Ñ‹ дейÑтвительно хотите закрыть вÑе окна IM?
+ <usetemplate ignoretext="Подтверждать перед закрытием вÑех окон IM" name="okcancelignore" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="AttachmentSaved">
+ ПриÑоединение Ñохранено.
+ </notification>
+ <notification name="UnableToFindHelpTopic">
+ Ðевозможно найти раздел Ñправки Ð´Ð»Ñ Ñтого Ñлемента.
+ </notification>
+ <notification name="ObjectMediaFailure">
+ Ошибка Ñервера: обновление или ошибка медиа.
+«[ERROR]»
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="TextChatIsMutedByModerator">
+ Ваш текÑтовый чат заглушен модератором.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="VoiceIsMutedByModerator">
+ Ваш Ð³Ð¾Ð»Ð¾Ñ Ð·Ð°Ð³Ð»ÑƒÑˆÐµÐ½ модератором.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="UploadCostConfirmation">
+ Эта передача будет Ñтоить L$[PRICE]. Продолжить передачу?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="Передать"/>
+ </notification>
+ <notification name="ConfirmClearTeleportHistory">
+ Ð’Ñ‹ дейÑтвительно хотите удалить Ñвой журнал телепортаций?
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="BottomTrayButtonCanNotBeShown">
+ Ð’Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð°Ñ ÐºÐ½Ð¾Ð¿ÐºÐ° не может быть показана ÑейчаÑ.
+Кнопка поÑвитÑÑ, когда Ð´Ð»Ñ Ð½ÐµÐµ будет доÑтаточно меÑта.
+ </notification>
+ <notification name="ShareNotification">
+ Выберите жителей, чтобы поделитьÑÑ Ñ Ð½Ð¸Ð¼Ð¸.
+ </notification>
+ <notification name="MeshUploadError">
+ Ðе удалоÑÑŒ передать [LABEL]: [MESSAGE] [IDENTIFIER]
+
+ПодробноÑти Ñм. в файле журнала.
+ </notification>
+ <notification name="MeshUploadPermError">
+ Ошибка при запроÑе разрешений на передачу меша.
+ </notification>
+ <notification name="RegionCapabilityRequestError">
+ Ðе удаетÑÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒ возможноÑÑ‚ÑŒ региона &apos;[CAPABILITY]&apos;.
+ </notification>
+ <notification name="ShareItemsConfirmation">
+ Ð’Ñ‹ дейÑтвительно хотите поделитьÑÑ Ð¿Ñ€ÐµÐ´Ð¼ÐµÑ‚Ð°Ð¼Ð¸:
+
+&lt;nolink&gt;[ITEMS]&lt;/nolink&gt;
+
+Со Ñледующими жителÑми:
+
+[RESIDENTS]
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification name="ShareFolderConfirmation">
+ Раздать можно только одну папку за раз.
+
+Ð’Ñ‹ дейÑтвительно хотите поделитьÑÑ Ð¿Ñ€ÐµÐ´Ð¼ÐµÑ‚Ð°Ð¼Ð¸:
+
+&lt;nolink&gt;[ITEMS]&lt;/nolink&gt;
+
+Со Ñледующими жителÑми:
+
+[RESIDENTS]
+ <usetemplate name="okcancelbuttons" notext="Отмена" yestext="ОК"/>
+ </notification>
+ <notification name="ItemsShared">
+ Предметы уÑпешно розданы.
+ </notification>
+ <notification name="DeedToGroupFail">
+ Передача группе не удалаÑÑŒ.
+ </notification>
+ <notification name="ReleaseLandThrottled">
+ Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚ÐºÐ°Ð·Ð°Ñ‚ÑŒÑÑ Ð¾Ñ‚ учаÑтка «[PARCEL_NAME]».
+ </notification>
+ <notification name="ReleasedLandWithReclaim">
+ Земельный учаÑток «[PARCEL_NAME]» площадью [AREA] м² оÑвобожден.
+
+У Ð²Ð°Ñ ÐµÑÑ‚ÑŒ [RECLAIM_PERIOD] ч, чтобы вернуть его за L$0. ПоÑле Ñтого учаÑток будет выÑтавлен на Ñвободную продажу.
+ </notification>
+ <notification name="ReleasedLandNoReclaim">
+ Земельный учаÑток «[PARCEL_NAME]» площадью [AREA] м² оÑвобожден.
+
+Теперь его может купить кто угодно.
+ </notification>
+ <notification name="AvatarRezNotification">
+ ( [EXISTENCE] Ñек. жизни )
+Ðватар «[NAME]» Ñтал виден через [TIME] Ñек.
+ </notification>
+ <notification name="AvatarRezSelfBakedDoneNotification">
+ ( [EXISTENCE] Ñек. жизни )
+Ð’Ñ‹ закончили приготовление Ñвоего коÑтюма через [TIME] Ñек.
+ </notification>
+ <notification name="AvatarRezSelfBakedUpdateNotification">
+ ( [EXISTENCE] Ñек. жизни )
+Ð’Ñ‹ отправили обновление Ñвоей внешноÑти через [TIME] Ñек.
+[STATUS]
+ </notification>
+ <notification name="AvatarRezCloudNotification">
+ ( [EXISTENCE] Ñек. жизни )
+Ðватар «[NAME]» Ñтал облаком.
+ </notification>
+ <notification name="AvatarRezArrivedNotification">
+ ( [EXISTENCE] Ñек. жизни )
+Ðватар «[NAME]» поÑвилÑÑ.
+ </notification>
+ <notification name="AvatarRezLeftCloudNotification">
+ ( [EXISTENCE] Ñек. жизни )
+Ðватар «[NAME]» Ñтал облаком через [TIME] Ñек.
+ </notification>
+ <notification name="AvatarRezEnteredAppearanceNotification">
+ ( [EXISTENCE] Ñек. жизни )
+Ðватар «[NAME]» перешел в режим внешноÑти.
+ </notification>
+ <notification name="AvatarRezLeftAppearanceNotification">
+ ( [EXISTENCE] Ñек. жизни )
+Ðватар «[NAME]» вышел из режима внешноÑти.
+ </notification>
+ <notification name="NoConnect">
+ Возникли проблемы ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ иÑпользовании [PROTOCOL] [HOSTID].
+Проверьте наÑтройки Ñети и брандмауÑра.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="NoVoiceConnect">
+ Возникли проблемы ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ Ð³Ð¾Ð»Ð¾Ñовым Ñервером:
+
+[HOSTID]
+
+ГолоÑÐ¾Ð²Ð°Ñ ÑвÑзь будет недоÑтупна.
+Проверьте наÑтройки Ñети и брандмауÑра.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="AvatarRezLeftNotification">
+ ( [EXISTENCE] Ñек. жизни )
+Ðватар «[NAME]» полноÑтью загружен.
+ </notification>
+ <notification name="AvatarRezSelfBakedTextureUploadNotification">
+ ( [EXISTENCE] Ñек. жизни )
+Ð’Ñ‹ передали готовую текÑтуру [RESOLUTION] Ð´Ð»Ñ Â«[BODYREGION]» через [TIME] Ñек.
+ </notification>
+ <notification name="AvatarRezSelfBakedTextureUpdateNotification">
+ ( [EXISTENCE] Ñек. жизни )
+Ð’Ñ‹ локально обновили готовую текÑтуру [RESOLUTION] Ð´Ð»Ñ Â«[BODYREGION]» через [TIME] Ñек.
+ </notification>
+ <notification name="ConfirmLeaveCall">
+ ДейÑтвительно покинуть Ñтот разговор?
+ <usetemplate ignoretext="Подтверждать перед выходом из разговора" name="okcancelignore" notext="Ðет" yestext="Да"/>
+ </notification>
+ <notification name="ConfirmMuteAll">
+ Ð’Ñ‹ решили заглушить вÑех учаÑтников группового разговора.
+Ð’ результате будут заглушены также вÑе жители, которые приÑоединилиÑÑŒ к разговору
+позже, даже поÑле того, как вы покинули разговор.
+
+Заглушить вÑех?
+ <usetemplate ignoretext="Подтверждать перед заглушением вÑех учаÑтников группового разговора" name="okcancelignore" notext="Отмена" yestext="OK"/>
+ </notification>
+ <notification label="Чат" name="HintChat">
+ Чтобы приÑоединитьÑÑ Ðº чату, введите Ñлова в поле чата ниже.
+ </notification>
+ <notification label="Ð’Ñтать" name="HintSit">
+ Чтобы вÑтать на ноги и покинуть ÑидÑчее положение, нажмите кнопку «ВÑтать».
+ </notification>
+ <notification label="Говорить" name="HintSpeak">
+ Ðажмите кнопку «Говорить», чтобы включить или выключить микрофон.
+
+Щелкните направленную вверх Ñтрелку, чтобы открыть панель ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð³Ð¾Ð»Ð¾Ñом.
+
+При Ñкрытии кнопки «Говорить» голоÑÐ¾Ð²Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡Ð°ÐµÑ‚ÑÑ.
+ </notification>
+ <notification label="ИÑÑледование мира" name="HintDestinationGuide">
+ Путеводитель по пунктам Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ñодержит Ñ‚Ñ‹ÑÑчи новых меÑÑ‚, в которых вы можете побывать. Выберите меÑто и нажмите кнопку «ТелепортациÑ», чтобы начать иÑÑледование.
+ </notification>
+ <notification label="Ð‘Ð¾ÐºÐ¾Ð²Ð°Ñ Ð¿Ð°Ð½ÐµÐ»ÑŒ" name="HintSidePanel">
+ БыÑтрый доÑтуп к вашему инвентарю, коÑтюмам, профилю и многому другому открываетÑÑ Ð½Ð° боковой панели.
+ </notification>
+ <notification label="Перемещение" name="HintMove">
+ Чтобы пойти или побежать, откройте панель Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¸ иÑпользуйте кнопки Ñо Ñтрелками. Также можно нажимать клавиши Ñо Ñтрелками на клавиатуре.
+ </notification>
+ <notification label="" name="HintMoveClick">
+ 1. Щелкните Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÑ…Ð¾Ð´Ð°
+Щелкните какую-нибудь точку на земле, чтобы перейти в Ñто меÑто.
+
+2. Щелкните и перетащите Ð´Ð»Ñ Ð¿Ð¾Ð²Ð¾Ñ€Ð¾Ñ‚Ð° Ð¿Ð¾Ð»Ñ Ð·Ñ€ÐµÐ½Ð¸Ñ
+Щелкните любую точку в мире и перетащите ее мышью, чтобы повернуть поле зрениÑ.
+ </notification>
+ <notification label="Экранное имÑ" name="HintDisplayName">
+ Задайте здеÑÑŒ Ñвое Ñкранное имÑ. Это Ð¸Ð¼Ñ Ð¼Ð¾Ð¶Ð½Ð¾ изменÑÑ‚ÑŒ, в отличие от вашего уникального имени пользователÑ. Отображение Ð´Ð»Ñ Ð²Ð°Ñ Ð¸Ð¼ÐµÐ½ других людей можно изменить в ваших наÑтройках.
+ </notification>
+ <notification label="Камера" name="HintView">
+ Ð”Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²Ð¸Ð´Ð° из камеры иÑпользуйте инÑтрументы «Вращение» и «Сдвиг». При нажатии клавиши Esc или переходе вид из камеры возвращаетÑÑ Ðº иÑходному ÑоÑтоÑнию.
+ </notification>
+ <notification label="Инвентарь" name="HintInventory">
+ Ð’ вашем инвентаре можно иÑкать разнообразные вещи. Самые новые вещи предÑтавлены на вкладке «Ðедавние».
+ </notification>
+ <notification label="Вы получили Linden-доллары!" name="HintLindenDollar">
+ Вот ваш текущий Ð±Ð°Ð»Ð°Ð½Ñ Ð² L$. Чтобы купить еще Linden-долларов, щелкните «Купить L$».
+ </notification>
+ <notification name="LowMemory">
+ ÐедоÑтаточный размер пула памÑти. Ðекоторые функции Second Life отключены во избежание ÑÐ±Ð¾Ñ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ. Закройте другие приложениÑ. ЕÑли неполадка не иÑчезнет, перезапуÑтите SL.
+ </notification>
+ <notification name="ForceQuitDueToLowMemory">
+ Через 30 Ñекунд Second Life завершит работу: нехватка памÑти.
+ </notification>
+ <notification name="PopupAttempt">
+ Ð’Ñплывающее окно Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ.
+ <form name="form">
+ <ignore name="ignore" text="Разрешить вÑе вÑплывающие окна"/>
+ <button name="open" text="Открыть вÑплывающее окно"/>
+ </form>
+ </notification>
+ <notification name="SOCKS_NOT_PERMITTED">
+ ПрокÑи SOCKS 5 &quot;[HOST]:[PORT]&quot; отклонил попытку подключениÑ; не разрешено набором правил.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_CONNECT_ERROR">
+ ПрокÑи SOCKS 5 &quot;[HOST]:[PORT]&quot; отклонил попытку подключениÑ; не удалоÑÑŒ открыть канал TCP.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_NOT_ACCEPTABLE">
+ ПрокÑи SOCKS 5 &quot;[HOST]:[PORT]&quot; отклонил выбранную ÑиÑтему проверки подлинноÑти.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_AUTH_FAIL">
+ ПрокÑи SOCKS 5 &quot;[HOST]:[PORT]&quot; Ñообщает, что ваши учетные данные неверны.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_UDP_FWD_NOT_GRANTED">
+ ПрокÑи SOCKS 5 &quot;[HOST]:[PORT]&quot; отклонил Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð¾Ð±ÑŠÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ UDP.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_HOST_CONNECT_FAILED">
+ Ðе удалоÑÑŒ подключитьÑÑ Ðº прокÑи-Ñерверу SOCKS 5 &quot;[HOST]:[PORT]&quot;.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_UNKNOWN_STATUS">
+ ÐеизвеÑÑ‚Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° прокÑи Ñ Ñервером &quot;[HOST]:[PORT]&quot;.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_INVALID_HOST">
+ Ðеверный Ð°Ð´Ñ€ÐµÑ Ð¿Ñ€Ð¾ÐºÑи SOCKS или порт &quot;[HOST]:[PORT]&quot;.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_BAD_CREDS">
+ Ðеверное Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸Ð»Ð¸ пароль SOCKS 5.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="PROXY_INVALID_HTTP_HOST">
+ Ðеверный Ð°Ð´Ñ€ÐµÑ Ð¿Ñ€Ð¾ÐºÑи HTTP или порт &quot;[HOST]:[PORT]&quot;.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="PROXY_INVALID_SOCKS_HOST">
+ Ðеверный Ð°Ð´Ñ€ÐµÑ Ð¿Ñ€Ð¾ÐºÑи SOCKS или порт &quot;[HOST]:[PORT]&quot;.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ChangeProxySettings">
+ ÐаÑтройки прокÑи начнут дейÑтвовать поÑле перезапуÑка [APP_NAME].
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="AuthRequest">
+ Сайт по адреÑу «&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;» в царÑтве «in realm &apos;[REALM]» требует имени Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸ паролÑ.
+ <form name="form">
+ <input name="username" text="Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ"/>
+ <input name="password" text="Пароль"/>
+ <button name="ok" text="ОтоÑлать"/>
+ <button name="cancel" text="Отмена"/>
+ </form>
+ </notification>
+ <notification label="" name="NoClassifieds">
+ Создание и редактирование рекламы доÑтупно только в раÑширенном режиме. Выйти из программы и Ñменить режим? Меню Ñмены режима находитÑÑ Ð½Ð° Ñкране входа.
+ <usetemplate name="okcancelbuttons" notext="Ðе выходить" yestext="Выйти"/>
+ </notification>
+ <notification label="" name="NoGroupInfo">
+ Создание и редактирование групп доÑтупно только в раÑширенном режиме. Выйти из программы и Ñменить режим? Меню Ñмены режима находитÑÑ Ð½Ð° Ñкране входа.
+ <usetemplate name="okcancelbuttons" notext="Ðе выходить" yestext="Выйти"/>
+ </notification>
+ <notification label="" name="NoPlaceInfo">
+ ПроÑмотр Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ Ð¼ÐµÑта доÑтупен только в раÑширенном режиме. Выйти из программы и Ñменить режим? Меню Ñмены режима находитÑÑ Ð½Ð° Ñкране входа.
+ <usetemplate name="okcancelbuttons" notext="Ðе выходить" yestext="Выход"/>
+ </notification>
+ <notification label="" name="NoPicks">
+ Создание и редактирование подборки доÑтупно только в раÑширенном режиме. Выйти из программы и Ñменить режим? Меню Ñмены режима находитÑÑ Ð½Ð° Ñкране входа.
+ <usetemplate name="okcancelbuttons" notext="Ðе выходить" yestext="Выйти"/>
+ </notification>
+ <notification label="" name="NoWorldMap">
+ ПроÑмотр карты мира доÑтупен только в раÑширенном режиме. Выйти из программы и Ñменить режим? Меню Ñмены режима находитÑÑ Ð½Ð° Ñкране входа.
+ <usetemplate name="okcancelbuttons" notext="Ðе выходить" yestext="Выйти"/>
+ </notification>
+ <notification label="" name="NoVoiceCall">
+ ГолоÑовые вызовы доÑтупны только в раÑширенном режиме. Выйти из программы и Ñменить режим?
+ <usetemplate name="okcancelbuttons" notext="Ðе выходить" yestext="Выйти"/>
+ </notification>
+ <notification label="" name="NoAvatarShare">
+ Общее пользование доÑтупно только в раÑширенном режиме. Выйти из программы и Ñменить режим?
+ <usetemplate name="okcancelbuttons" notext="Ðе выходить" yestext="Выйти"/>
+ </notification>
+ <notification label="" name="NoAvatarPay">
+ Платежи другим жителÑм доÑтупны только в раÑширенном режиме. Выйти из программы и Ñменить режим?
+ <usetemplate name="okcancelbuttons" notext="Ðе выходить" yestext="Выйти"/>
+ </notification>
+ <notification label="" name="NoInventory">
+ ПроÑмотр Ð¸Ð½Ð²ÐµÐ½Ñ‚Ð°Ñ€Ñ Ð´Ð¾Ñтупен только в раÑширенном режиме. Выйти из программы и Ñменить режим?
+ <usetemplate name="okcancelbuttons" notext="Ðе выходить" yestext="Выход"/>
+ </notification>
+ <notification label="" name="NoAppearance">
+ Редактор внешнего вида доÑтупен только в раÑширенном режиме. Выйти из программы и Ñменить режим?
+ <usetemplate name="okcancelbuttons" notext="Ðе выходить" yestext="Выход"/>
+ </notification>
+ <notification label="" name="NoSearch">
+ ПоиÑк доÑтупен только в раÑширенном режиме. Выйти из программы и Ñменить режим?
+ <usetemplate name="okcancelbuttons" notext="Ðе выходить" yestext="Выход"/>
+ </notification>
+ <notification label="" name="ConfirmHideUI">
+ Это дейÑтвие приведет к Ñкрытию вÑех меню и кнопок. Чтобы вернуть их, щелкните [SHORTCUT] Ñнова.
+ <usetemplate ignoretext="Подтверждать перед Ñкрытием интерфейÑа" name="okcancelignore" notext="Отмена" yestext="OK"/>
+ </notification>
+ <global name="UnsupportedGLRequirements">
+ По-видимому, ваше оборудование не удовлетворÑет требованиÑм [APP_NAME]. Ð”Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ [APP_NAME] необходима графичеÑÐºÐ°Ñ ÐºÐ°Ñ€Ñ‚Ð° OpenGL Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¾Ð¹ мультитекÑтур. ЕÑли у Ð²Ð°Ñ ÐµÑÑ‚ÑŒ Ñ‚Ð°ÐºÐ°Ñ ÐºÐ°Ñ€Ñ‚Ð°, убедитеÑÑŒ, что уÑтановлены новейшие верÑии драйверов Ð´Ð»Ñ Ð½ÐµÐµ и пакеты обновлений и иÑÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ð¾Ð½Ð½Ð¾Ð¹ ÑиÑтемы.
+
+ЕÑли неполадки продолжаютÑÑ, поÑетите Ñайт [SUPPORT_SITE].
+ </global>
+ <global name="UnsupportedCPUAmount">
+ 796
+ </global>
+ <global name="UnsupportedRAMAmount">
+ 510
+ </global>
+ <global name="UnsupportedGPU">
+ - ГрафичеÑÐºÐ°Ñ ÐºÐ°Ñ€Ñ‚Ð° вашего компьютера не удовлетворÑет минимальным требованиÑм.
+ </global>
+ <global name="UnsupportedRAM">
+ - СиÑÑ‚ÐµÐ¼Ð½Ð°Ñ Ð¿Ð°Ð¼ÑÑ‚ÑŒ вашего компьютера не удовлетворÑет минимальным требованиÑм.
+ </global>
+ <global name="You can only set your &apos;Home Location&apos; on your land or at a mainland Infohub.">
+ ЕÑли у Ð²Ð°Ñ ÐµÑÑ‚ÑŒ учаÑток земли, вы можете Ñделать его Ñвоим домом (домашним меÑтоположением).
+ЕÑли нет, поÑмотрите на карту и найдите меÑта, подпиÑанные «Инфохаб».
+ </global>
+ <global name="You died and have been teleported to your home location">
+ Ð’Ñ‹ умерли и были телепортированы в ваше домашнее меÑтоположение.
+ </global>
+</notifications>
diff --git a/indra/newview/skins/default/xui/ru/panel_active_object_row.xml b/indra/newview/skins/default/xui/ru/panel_active_object_row.xml
new file mode 100644
index 0000000000..825f9a6229
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_active_object_row.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_activeim_row">
+ <text name="object_name">
+ Объект без имени
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/ru/panel_adhoc_control_panel.xml
new file mode 100644
index 0000000000..ae2240593d
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_adhoc_control_panel.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+ <layout_stack name="vertical_stack">
+ <layout_panel name="call_btn_panel">
+ <button label="Звонок" name="call_btn"/>
+ </layout_panel>
+ <layout_panel name="end_call_btn_panel">
+ <button label="Прервать звонок" name="end_call_btn"/>
+ </layout_panel>
+ <layout_panel name="voice_ctrls_btn_panel">
+ <button label="Управление голоÑом" name="voice_ctrls_btn"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/ru/panel_avatar_list_item.xml
new file mode 100644
index 0000000000..75e396222f
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_avatar_list_item.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="avatar_list_item">
+ <string name="FormatSeconds">
+ [COUNT] Ñ
+ </string>
+ <string name="FormatMinutes">
+ [COUNT] мин
+ </string>
+ <string name="FormatHours">
+ [COUNT] ч
+ </string>
+ <string name="FormatDays">
+ [COUNT] д
+ </string>
+ <string name="FormatWeeks">
+ [COUNT] нед
+ </string>
+ <string name="FormatMonths">
+ [COUNT] меÑ
+ </string>
+ <string name="FormatYears">
+ [COUNT] г
+ </string>
+ <text name="avatar_name" value="(загрузка)"/>
+ <text name="last_interaction" value="0 Ñ"/>
+ <icon name="permission_edit_theirs_icon" tool_tip="Ð’Ñ‹ можете изменÑÑ‚ÑŒ объекты Ñтого друга"/>
+ <icon name="permission_edit_mine_icon" tool_tip="Этот друг может изменÑÑ‚ÑŒ, удалÑÑ‚ÑŒ или брать ваши объекты"/>
+ <icon name="permission_map_icon" tool_tip="Этот друг может видеть Ð²Ð°Ñ Ð½Ð° карте"/>
+ <icon name="permission_online_icon" tool_tip="Этот друг может видеть ваш ÑÑ‚Ð°Ñ‚ÑƒÑ Ð² Ñети"/>
+ <button name="profile_btn" tool_tip="Смотреть профиль"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_avatar_tag.xml b/indra/newview/skins/default/xui/ru/panel_avatar_tag.xml
new file mode 100644
index 0000000000..03c164affd
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_avatar_tag.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="avatar_tag_notification">
+ <panel name="msg_caption">
+ <text name="sender_tag_name">
+ ТеÑтер Ðнжела
+ </text>
+ <text name="tag_time" value="23:30"/>
+ </panel>
+ <text_editor name="msg_text">
+ ШуÑтрый бурый Ð»Ð¸Ñ Ð¿ÐµÑ€ÐµÐ¿Ñ€Ñ‹Ð³Ð¸Ð²Ð°ÐµÑ‚ через ленивого пÑа.
+ </text_editor>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_block_list_sidetray.xml b/indra/newview/skins/default/xui/ru/panel_block_list_sidetray.xml
new file mode 100644
index 0000000000..214ca8bf3a
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_block_list_sidetray.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="block_list_panel">
+ <text name="title_text">
+ Черный ÑпиÑок
+ </text>
+ <scroll_list name="blocked" tool_tip="СпиÑок заблокированных жителей"/>
+ <button label="Заблокировать жителÑ" name="Block resident..." tool_tip="Выберите Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²ÐºÐ¸"/>
+ <button label="Блокировать объект по имени" name="Block object by name..." tool_tip="Выберите объект Ð´Ð»Ñ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²ÐºÐ¸ по имени"/>
+ <button label="Разблокировать" name="Unblock" tool_tip="Удалить объект или Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ð¸Ð· ÑпиÑка заблокированных"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_body_parts_list_item.xml b/indra/newview/skins/default/xui/ru/panel_body_parts_list_item.xml
new file mode 100644
index 0000000000..20a99500b6
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_body_parts_list_item.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="wearable_item">
+ <text name="item_name" value="..."/>
+ <panel name="btn_lock" tool_tip="У Ð²Ð°Ñ Ð½ÐµÑ‚ прав Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ"/>
+ <panel name="btn_edit_panel">
+ <button name="btn_edit" tool_tip="Изменить фигуру"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_bodyparts_list_button_bar.xml b/indra/newview/skins/default/xui/ru/panel_bodyparts_list_button_bar.xml
new file mode 100644
index 0000000000..f7d31813f9
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_bodyparts_list_button_bar.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="clothing_list_button_bar_panel">
+ <button label="Перейти" name="switch_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_bottomtray.xml b/indra/newview/skins/default/xui/ru/panel_bottomtray.xml
new file mode 100644
index 0000000000..ebf6c4264b
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_bottomtray.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="bottom_tray">
+ <string name="DragIndicationImageName" value="Accordion_ArrowOpened_Off"/>
+ <string name="SpeakBtnToolTip" value="Включить/выключить микрофон"/>
+ <string name="VoiceControlBtnToolTip" value="Показать/Ñкрыть панель ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð³Ð¾Ð»Ð¾Ñом"/>
+ <layout_stack name="toolbar_stack">
+ <layout_panel name="speak_panel">
+ <talk_button name="talk">
+ <speak_button label="Говорить" label_selected="Говорить" name="speak_btn"/>
+ </talk_button>
+ </layout_panel>
+ <layout_panel name="gesture_panel">
+ <gesture_combo_list label="ЖеÑÑ‚Ñ‹" name="Gesture" tool_tip="Показать/Ñкрыть жеÑÑ‚Ñ‹"/>
+ </layout_panel>
+ <layout_panel name="movement_panel">
+ <bottomtray_button label="Перемещение" name="movement_btn" tool_tip="Показать/Ñкрыть панель ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð²Ð¸Ð¶ÐµÐ½Ð¸ÐµÐ¼"/>
+ </layout_panel>
+ <layout_panel name="cam_panel">
+ <bottomtray_button label="Камера" name="camera_btn" tool_tip="Показать/Ñкрыть управление камерой"/>
+ </layout_panel>
+ <layout_panel name="snapshot_panel">
+ <bottomtray_button name="snapshots" tool_tip="Сделать Ñнимок"/>
+ </layout_panel>
+ <layout_panel name="build_btn_panel">
+ <bottomtray_button label="СтроительÑтво" name="build_btn" tool_tip="Показать/Ñкрыть инÑтрументы"/>
+ </layout_panel>
+ <layout_panel name="search_btn_panel">
+ <bottomtray_button label="ПоиÑк" name="search_btn" tool_tip="Показать/Ñкрыть поиÑк"/>
+ </layout_panel>
+ <layout_panel name="world_map_btn_panel">
+ <bottomtray_button label="Карта" name="world_map_btn" tool_tip="Показать/Ñкрыть карту мира"/>
+ </layout_panel>
+ <layout_panel name="mini_map_btn_panel">
+ <bottomtray_button label="Миникарта" name="mini_map_btn" tool_tip="Показать/Ñкрыть миникарту"/>
+ </layout_panel>
+ <layout_panel name="im_well_panel">
+ <chiclet_im_well name="im_well">
+ <button name="Unread IM messages" tool_tip="Общение"/>
+ </chiclet_im_well>
+ </layout_panel>
+ <layout_panel name="notification_well_panel">
+ <chiclet_notification name="notification_well">
+ <button name="Unread" tool_tip="УведомлениÑ"/>
+ </chiclet_notification>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_bottomtray_lite.xml b/indra/newview/skins/default/xui/ru/panel_bottomtray_lite.xml
new file mode 100644
index 0000000000..bcdff112c5
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_bottomtray_lite.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="bottom_tray_lite">
+ <layout_stack name="toolbar_stack_lite">
+ <layout_panel name="gesture_panel">
+ <gesture_combo_list label="ЖеÑÑ‚Ñ‹" name="Gesture" tool_tip="Показать/Ñкрыть жеÑÑ‚Ñ‹"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_chat_header.xml b/indra/newview/skins/default/xui/ru/panel_chat_header.xml
new file mode 100644
index 0000000000..7916bf5155
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_chat_header.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="im_header" name="im_header">
+ <text name="time_box" value="23:30"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_chiclet_bar.xml b/indra/newview/skins/default/xui/ru/panel_chiclet_bar.xml
new file mode 100644
index 0000000000..f203ecde4b
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_chiclet_bar.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="chiclet_bar">
+ <layout_stack name="toolbar_stack">
+ <layout_panel name="im_well_panel">
+ <chiclet_im_well name="im_well">
+ <button name="Unread IM messages" tool_tip="Разговоры"/>
+ </chiclet_im_well>
+ </layout_panel>
+ <layout_panel name="notification_well_panel">
+ <chiclet_notification name="notification_well">
+ <button name="Unread" tool_tip="УведомлениÑ"/>
+ </chiclet_notification>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_classified_info.xml b/indra/newview/skins/default/xui/ru/panel_classified_info.xml
new file mode 100644
index 0000000000..c7fd0ad42f
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_classified_info.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_classified_info">
+ <panel.string name="type_mature">
+ Moderate-контент
+ </panel.string>
+ <panel.string name="type_pg">
+ General-контент
+ </panel.string>
+ <panel.string name="l$_price">
+ L$[PRICE]
+ </panel.string>
+ <panel.string name="click_through_text_fmt">
+ Телепорт [TELEPORT], карта [MAP], профиль [PROFILE]
+ </panel.string>
+ <panel.string name="date_fmt">
+ [day,datetime,slt].[mthnum,datetime,slt].[year,datetime,slt]
+ </panel.string>
+ <panel.string name="auto_renew_on">
+ Включено
+ </panel.string>
+ <panel.string name="auto_renew_off">
+ Выключено
+ </panel.string>
+ <text name="title" value="Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ рекламе"/>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text_editor name="classified_name" value="[название]"/>
+ <text name="classified_location_label" value="МеÑто:"/>
+ <text_editor name="classified_location" value="[загрузка...]"/>
+ <text name="content_type_label" value="Тип контента:"/>
+ <text_editor name="content_type" value="[тип контента]"/>
+ <text name="category_label" value="КатегориÑ:"/>
+ <text_editor name="category" value="[категориÑ]"/>
+ <text name="creation_date_label" value="Дата ÑозданиÑ:"/>
+ <text_editor name="creation_date" tool_tip="Дата ÑозданиÑ" value="[дата]"/>
+ <text name="price_for_listing_label" value="СтоимоÑÑ‚ÑŒ размещениÑ:"/>
+ <text_editor name="price_for_listing" tool_tip="СтоимоÑÑ‚ÑŒ размещениÑ." value="[цена]"/>
+ <layout_stack name="descr_stack">
+ <layout_panel name="clickthrough_layout_panel">
+ <text name="click_through_label" value="Переходы:"/>
+ <text_editor name="click_through_text" tool_tip="Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ переходах" value="[переходы]"/>
+ </layout_panel>
+ <layout_panel name="price_layout_panel">
+ <text name="auto_renew_label" value="Ðвтооплата:"/>
+ <text name="auto_renew" value="Включено"/>
+ </layout_panel>
+ <layout_panel name="descr_layout_panel">
+ <text name="classified_desc_label" value="ОпиÑание:"/>
+ <text_editor name="classified_desc" value="[опиÑание]"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </scroll_container>
+ <panel name="buttons">
+ <layout_stack name="layout_stack1">
+ <layout_panel name="layout_panel1">
+ <button label="ТелепортациÑ" name="teleport_btn"/>
+ </layout_panel>
+ <layout_panel name="show_on_map_btn_lp">
+ <button label="Карта" name="show_on_map_btn"/>
+ </layout_panel>
+ <layout_panel name="edit_btn_lp">
+ <button label="Изменить" name="edit_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_clothing_list_button_bar.xml b/indra/newview/skins/default/xui/ru/panel_clothing_list_button_bar.xml
new file mode 100644
index 0000000000..cc3f7feb83
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_clothing_list_button_bar.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="clothing_list_button_bar_panel">
+ <button label="Добавить +" name="add_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_clothing_list_item.xml b/indra/newview/skins/default/xui/ru/panel_clothing_list_item.xml
new file mode 100644
index 0000000000..98d4fd8b47
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_clothing_list_item.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="wearable_item">
+ <button name="btn_delete" tool_tip="Убрать из коÑтюма"/>
+ <text name="item_name" value="..."/>
+ <panel name="btn_lock" tool_tip="У Ð²Ð°Ñ Ð½ÐµÑ‚ прав Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ"/>
+ <panel name="btn_edit_panel">
+ <button name="btn_edit" tool_tip="Изменить предметы одежды"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_cof_wearables.xml b/indra/newview/skins/default/xui/ru/panel_cof_wearables.xml
new file mode 100644
index 0000000000..9e1bc4b5c4
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_cof_wearables.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="cof_wearables">
+ <accordion name="cof_wearables_accordion">
+ <accordion_tab name="tab_clothing" title="Одежда"/>
+ <accordion_tab name="tab_attachments" title="ПриÑоединениÑ"/>
+ <accordion_tab name="tab_body_parts" title="ЧаÑти тела"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_deletable_wearable_list_item.xml b/indra/newview/skins/default/xui/ru/panel_deletable_wearable_list_item.xml
new file mode 100644
index 0000000000..762baa2052
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_deletable_wearable_list_item.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="deletable_wearable_item">
+ <button name="btn_delete" tool_tip="Убрать из коÑтюма"/>
+ <text name="item_name" value="..."/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_dummy_clothing_list_item.xml b/indra/newview/skins/default/xui/ru/panel_dummy_clothing_list_item.xml
new file mode 100644
index 0000000000..dc9d678edd
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_dummy_clothing_list_item.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="dummy_clothing_item">
+ <text name="item_name" value="..."/>
+ <panel name="btn_add_panel">
+ <button name="btn_add" tool_tip="Добавить другие вещи Ñтого типа"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_edit_alpha.xml b/indra/newview/skins/default/xui/ru/panel_edit_alpha.xml
new file mode 100644
index 0000000000..7cde4099ef
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_edit_alpha.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_alpha_panel">
+ <scroll_container name="avatar_alpha_color_panel_scroll">
+ <panel name="avatar_alpha_color_panel">
+ <texture_picker label="Ðльфа низа" name="Lower Alpha" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° изображениÑ"/>
+ <texture_picker label="Ðльфа верха" name="Upper Alpha" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° изображениÑ"/>
+ <texture_picker label="Ðльфа головы" name="Head Alpha" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° изображениÑ"/>
+ <texture_picker label="Ðльфа глаз" name="Eye Alpha" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° изображениÑ"/>
+ <texture_picker label="Ðльфа волоÑ" name="Hair Alpha" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° изображениÑ"/>
+ </panel>
+ </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_edit_classified.xml b/indra/newview/skins/default/xui/ru/panel_edit_classified.xml
new file mode 100644
index 0000000000..a2f06dbadf
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_edit_classified.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Изменить рекламу" name="panel_edit_classified">
+ <panel.string name="location_notice">
+ (будет обновлено поÑле ÑохранениÑ)
+ </panel.string>
+ <string name="publish_label">
+ Опубликовать
+ </string>
+ <string name="save_label">
+ Сохранить
+ </string>
+ <text name="title">
+ Изменить рекламу
+ </text>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <panel name="snapshot_panel">
+ <icon label="" name="edit_icon" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° изображениÑ"/>
+ </panel>
+ <text name="Name:">
+ Ðазвание:
+ </text>
+ <text name="description_label">
+ ОпиÑание:
+ </text>
+ <text name="location_label">
+ МеÑто:
+ </text>
+ <text name="classified_location">
+ загрузка...
+ </text>
+ <button label="ИÑпользовать текущее меÑто" name="set_to_curr_location_btn"/>
+ <text name="category_label" value="КатегориÑ:"/>
+ <text name="content_type_label" value="Тип контента:"/>
+ <icons_combo_box label="General-контент" name="content_type">
+ <icons_combo_box.item label="Moderate-контент" name="mature_ci" value="Mature-контент"/>
+ <icons_combo_box.item label="General-контент" name="pg_ci" value="PG-контент"/>
+ </icons_combo_box>
+ <check_box label="ÐвтоматичеÑÐºÐ°Ñ Ð¾Ð¿Ð»Ð°Ñ‚Ð° каждую неделю" name="auto_renew"/>
+ <text name="price_for_listing_label" value="СтоимоÑÑ‚ÑŒ размещениÑ:"/>
+ <spinner label="L$" name="price_for_listing" tool_tip="СтоимоÑÑ‚ÑŒ размещениÑ." value="50"/>
+ </panel>
+ </scroll_container>
+ <panel label="bottom_panel" name="bottom_panel">
+ <layout_stack name="bottom_panel_ls">
+ <layout_panel name="save_changes_btn_lp">
+ <button label="[LABEL]" name="save_changes_btn"/>
+ </layout_panel>
+ <layout_panel name="show_on_map_btn_lp">
+ <button label="Отмена" name="cancel_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_edit_eyes.xml b/indra/newview/skins/default/xui/ru/panel_edit_eyes.xml
new file mode 100644
index 0000000000..84e1204b5d
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_edit_eyes.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_eyes_panel">
+ <panel name="avatar_eye_color_panel">
+ <texture_picker label="Радужка" name="Iris" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° изображениÑ"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="eyes_main_tab" title="Глаза"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_edit_gloves.xml b/indra/newview/skins/default/xui/ru/panel_edit_gloves.xml
new file mode 100644
index 0000000000..561777745e
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_edit_gloves.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_gloves_panel">
+ <panel name="avatar_gloves_color_panel">
+ <texture_picker label="ТекÑтура" name="Fabric" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° изображениÑ"/>
+ <color_swatch label="Цвет/оттенок" name="Color/Tint" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° цвета"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="gloves_main_tab" title="Перчатки"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_edit_hair.xml b/indra/newview/skins/default/xui/ru/panel_edit_hair.xml
new file mode 100644
index 0000000000..d5e67ddf87
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_edit_hair.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_hair_panel">
+ <panel name="avatar_hair_color_panel">
+ <texture_picker label="ТекÑтура" name="Texture" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° изображениÑ"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="hair_color_tab" title="Цвет"/>
+ <accordion_tab name="hair_style_tab" title="Стиль"/>
+ <accordion_tab name="hair_eyebrows_tab" title="Брови"/>
+ <accordion_tab name="hair_facial_tab" title="ВолоÑÑ‹ на лице"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_edit_jacket.xml b/indra/newview/skins/default/xui/ru/panel_edit_jacket.xml
new file mode 100644
index 0000000000..2f5a437e69
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_edit_jacket.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_jacket_panel">
+ <panel name="avatar_jacket_color_panel">
+ <texture_picker label="ТекÑтура верха" name="Upper Fabric" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° изображениÑ"/>
+ <texture_picker label="ТекÑтура низа" name="Lower Fabric" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° изображениÑ"/>
+ <color_swatch label="Цвет/оттенок" name="Color/Tint" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° цвета"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="jacket_main_tab" title="Пиджак"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_edit_pants.xml b/indra/newview/skins/default/xui/ru/panel_edit_pants.xml
new file mode 100644
index 0000000000..4970c93801
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_edit_pants.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_pants_panel">
+ <panel name="avatar_pants_color_panel">
+ <texture_picker label="ТекÑтура" name="Fabric" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° изображениÑ"/>
+ <color_swatch label="Цвет/оттенок" name="Color/Tint" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° цвета"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="pants_main_tab" title="Брюки"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_edit_physics.xml b/indra/newview/skins/default/xui/ru/panel_edit_physics.xml
new file mode 100644
index 0000000000..da4ebb154d
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_edit_physics.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_physics_panel">
+ <panel label="" name="accordion_panel">
+ <accordion name="physics_accordion">
+ <accordion_tab name="physics_breasts_updown_tab" title="Груди прыгают"/>
+ <accordion_tab name="physics_breasts_inout_tab" title="Ложбинка между грудей"/>
+ <accordion_tab name="physics_breasts_leftright_tab" title="Груди покачиваютÑÑ"/>
+ <accordion_tab name="physics_belly_tab" title="Живот прыгает"/>
+ <accordion_tab name="physics_butt_tab" title="Ягодицы прыгают"/>
+ <accordion_tab name="physics_butt_leftright_tab" title="Ягодицы покачиваютÑÑ"/>
+ <accordion_tab name="physics_advanced_tab" title="Дополнительные параметры"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_edit_pick.xml b/indra/newview/skins/default/xui/ru/panel_edit_pick.xml
new file mode 100644
index 0000000000..6be1448ac5
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_edit_pick.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Изменить подборку" name="panel_edit_pick">
+ <panel.string name="location_notice">
+ (будет обновлено поÑле ÑохранениÑ)
+ </panel.string>
+ <text name="title">
+ Изменить подборку
+ </text>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <icon label="" name="edit_icon" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° изображениÑ"/>
+ <text name="Name:">
+ Ðазвание:
+ </text>
+ <text name="description_label">
+ ОпиÑание:
+ </text>
+ <text name="location_label">
+ МеÑто:
+ </text>
+ <text name="pick_location">
+ загрузка…
+ </text>
+ <button label="ПоÑтавить текущее меÑто" name="set_to_curr_location_btn"/>
+ </panel>
+ </scroll_container>
+ <panel label="bottom_panel" name="bottom_panel">
+ <layout_stack name="layout_stack1">
+ <layout_panel name="layout_panel1">
+ <button label="Сохранить подборку" name="save_changes_btn"/>
+ </layout_panel>
+ <layout_panel name="layout_panel2">
+ <button label="Отмена" name="cancel_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_edit_profile.xml b/indra/newview/skins/default/xui/ru/panel_edit_profile.xml
new file mode 100644
index 0000000000..e9a6a781db
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_edit_profile.xml
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Редактирование профилÑ" name="edit_profile_panel">
+ <string name="CaptionTextAcctInfo">
+ [ACCTTYPE]
+[PAYMENTINFO] [AGEVERIFICATION]
+ </string>
+ <string name="RegisterDateFormat">
+ [REG_DATE] ([AGE])
+ </string>
+ <string name="AcctTypeResident" value="Житель"/>
+ <string name="AcctTypeTrial" value="ГоÑÑ‚ÑŒ"/>
+ <string name="AcctTypeCharterMember" value="Учредитель"/>
+ <string name="AcctTypeEmployee" value="Сотрудник Linden Lab"/>
+ <string name="PaymentInfoUsed" value="ИÑпользована Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ платежах"/>
+ <string name="PaymentInfoOnFile" value="ЗарегиÑтрирована Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ платежах"/>
+ <string name="NoPaymentInfoOnFile" value="Ðе зарегиÑтрирована Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ платежах"/>
+ <string name="AgeVerified" value="ВозраÑÑ‚ проверен"/>
+ <string name="NotAgeVerified" value="ВозраÑÑ‚ не проверен"/>
+ <string name="partner_edit_link_url">
+ http://www.secondlife.com/account/partners.php?lang=en
+ </string>
+ <string name="my_account_link_url">
+ http://secondlife.com/my
+ </string>
+ <string name="no_partner_text" value="Ðет"/>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <panel name="data_panel">
+ <text name="display_name_label" value="Экранное имÑ:"/>
+ <text name="solo_username_label" value="Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ:"/>
+ <button name="set_name" tool_tip="Задать Ñкранное имÑ"/>
+ <text name="user_label" value="Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ:"/>
+ <panel name="lifes_images_panel">
+ <panel name="second_life_image_panel">
+ <text name="second_life_photo_title_text" value="[SECOND_LIFE]:"/>
+ </panel>
+ <icon label="" name="2nd_life_edit_icon" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° изображениÑ"/>
+ </panel>
+ <panel name="first_life_image_panel">
+ <text name="real_world_photo_title_text" value="Реальный мир:"/>
+ </panel>
+ <icon label="" name="real_world_edit_icon" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° изображениÑ"/>
+ <text name="title_homepage_text">
+ ДомашнÑÑ Ñтраница:
+ </text>
+ <line_editor name="homepage_edit" value="http://"/>
+ <text name="title_acc_status_text" value="Мой аккаунт:"/>
+ <text_editor name="acc_status_text" value="Житель. В файле нет информации о платежах."/>
+ <text name="my_account_link" value="[[URL] Перейти на информационную панель]"/>
+ <text name="title_partner_text" value="Мой партнер:"/>
+ <panel name="partner_data_panel">
+ <text initial_value="(получение информации)" name="partner_text"/>
+ </panel>
+ <text name="partner_edit_link" value="[[URL] Редактировать]"/>
+ </panel>
+ </panel>
+ </scroll_container>
+ <panel name="profile_me_buttons_panel">
+ <layout_stack name="bottom_panel_ls">
+ <layout_panel name="save_changes_btn_lp">
+ <button label="Сохранить изменениÑ" name="save_btn"/>
+ </layout_panel>
+ <layout_panel name="show_on_map_btn_lp">
+ <button label="Отмена" name="cancel_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_edit_shape.xml b/indra/newview/skins/default/xui/ru/panel_edit_shape.xml
new file mode 100644
index 0000000000..312ad593a1
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_edit_shape.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_shape_panel">
+ <string name="meters">
+ м
+ </string>
+ <string name="feet">
+ футов
+ </string>
+ <string name="height">
+ РоÑÑ‚:
+ </string>
+ <panel label="Рубашка" name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shape_body_tab" title="Тело"/>
+ <accordion_tab name="shape_head_tab" title="Голова"/>
+ <accordion_tab name="shape_eyes_tab" title="Глаза"/>
+ <accordion_tab name="shape_ears_tab" title="Уши"/>
+ <accordion_tab name="shape_nose_tab" title="ÐоÑ"/>
+ <accordion_tab name="shape_mouth_tab" title="Рот"/>
+ <accordion_tab name="shape_chin_tab" title="Подбородок"/>
+ <accordion_tab name="shape_torso_tab" title="ТорÑ"/>
+ <accordion_tab name="shape_legs_tab" title="Ðоги"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_edit_shirt.xml b/indra/newview/skins/default/xui/ru/panel_edit_shirt.xml
new file mode 100644
index 0000000000..d576a2cd2f
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_edit_shirt.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_shirt_panel">
+ <panel name="avatar_shirt_color_panel">
+ <texture_picker label="ТекÑтура" name="Fabric" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° изображениÑ"/>
+ <color_swatch label="Цвет/оттенок" name="Color/Tint" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° цвета"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shirt_main_tab" title="Рубашка"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_edit_shoes.xml b/indra/newview/skins/default/xui/ru/panel_edit_shoes.xml
new file mode 100644
index 0000000000..f6d7029108
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_edit_shoes.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_shoes_panel">
+ <panel name="avatar_shoes_color_panel">
+ <texture_picker label="ТекÑтура" name="Fabric" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° изображениÑ"/>
+ <color_swatch label="Цвет/оттенок" name="Color/Tint" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° цвета"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shoes_main_tab" title="Обувь"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_edit_skin.xml b/indra/newview/skins/default/xui/ru/panel_edit_skin.xml
new file mode 100644
index 0000000000..f5a5339afe
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_edit_skin.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_skin_panel">
+ <panel name="avatar_skin_color_panel">
+ <texture_picker label="Голова" name="Head" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° изображениÑ"/>
+ <texture_picker label="ВерхнÑÑ Ñ‡Ð°ÑÑ‚ÑŒ тела" name="Upper Body" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° изображениÑ"/>
+ <texture_picker label="ÐижнÑÑ Ñ‡Ð°ÑÑ‚ÑŒ тела" name="Lower Body" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° изображениÑ"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="skin_color_tab" title="Цвет кожи"/>
+ <accordion_tab name="skin_face_tab" title="ОÑобенноÑти лица"/>
+ <accordion_tab name="skin_makeup_tab" title="МакиÑж"/>
+ <accordion_tab name="skin_body_tab" title="ОÑобенноÑти тела"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_edit_skirt.xml b/indra/newview/skins/default/xui/ru/panel_edit_skirt.xml
new file mode 100644
index 0000000000..909946e577
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_edit_skirt.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_skirt_panel">
+ <panel name="avatar_skirt_color_panel">
+ <texture_picker label="ТекÑтура" name="Fabric" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° изображениÑ"/>
+ <color_swatch label="Цвет/оттенок" name="Color/Tint" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° цвета"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="skirt_main_tab" title="Юбка"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_edit_socks.xml b/indra/newview/skins/default/xui/ru/panel_edit_socks.xml
new file mode 100644
index 0000000000..2827fbc028
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_edit_socks.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_socks_panel">
+ <panel name="avatar_socks_color_panel">
+ <texture_picker label="ТекÑтура" name="Fabric" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° изображениÑ"/>
+ <color_swatch label="Цвет/оттенок" name="Color/Tint" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° цвета"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="socks_main_tab" title="ÐоÑки"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_edit_tattoo.xml b/indra/newview/skins/default/xui/ru/panel_edit_tattoo.xml
new file mode 100644
index 0000000000..874d5f8bc4
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_edit_tattoo.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_tattoo_panel">
+ <panel name="avatar_tattoo_color_panel">
+ <texture_picker label="Тату на голове" name="Head Tattoo" tool_tip="Щелкните картинку, чтобы выбрать ее"/>
+ <texture_picker label="Тату вверху" name="Upper Tattoo" tool_tip="Щелкните картинку, чтобы выбрать ее"/>
+ <texture_picker label="Тату внизу" name="Lower Tattoo" tool_tip="Щелкните картинку, чтобы выбрать ее"/>
+ <color_swatch label="Цвет/оттенок" name="Color/Tint" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° цвета"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_edit_underpants.xml b/indra/newview/skins/default/xui/ru/panel_edit_underpants.xml
new file mode 100644
index 0000000000..f2f6e5e516
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_edit_underpants.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_underpants_panel">
+ <panel name="avatar_underpants_color_panel">
+ <texture_picker label="ТекÑтура" name="Fabric" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° изображениÑ"/>
+ <color_swatch label="Цвет/оттенок" name="Color/Tint" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° цвета"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="underpants_main_tab" title="ТруÑÑ‹"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_edit_undershirt.xml b/indra/newview/skins/default/xui/ru/panel_edit_undershirt.xml
new file mode 100644
index 0000000000..6f84c6cec2
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_edit_undershirt.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_undershirt_panel">
+ <panel name="avatar_undershirt_color_panel">
+ <texture_picker label="ТекÑтура" name="Fabric" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° изображениÑ"/>
+ <color_swatch label="Цвет/оттенок" name="Color/Tint" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° цвета"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="undershirt_main_tab" title="Майка"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_edit_wearable.xml b/indra/newview/skins/default/xui/ru/panel_edit_wearable.xml
new file mode 100644
index 0000000000..79130a9c80
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_edit_wearable.xml
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Можно надеть" name="panel_edit_wearable">
+ <string name="edit_shape_title">
+ Изменение фигуры
+ </string>
+ <string name="edit_skin_title">
+ Изменение кожи
+ </string>
+ <string name="edit_hair_title">
+ Изменение волоÑ
+ </string>
+ <string name="edit_eyes_title">
+ Изменение глаз
+ </string>
+ <string name="edit_shirt_title">
+ Изменение рубашки
+ </string>
+ <string name="edit_pants_title">
+ Изменение брюк
+ </string>
+ <string name="edit_shoes_title">
+ Изменение обуви
+ </string>
+ <string name="edit_socks_title">
+ Изменение ноÑков
+ </string>
+ <string name="edit_jacket_title">
+ Изменение пиджака
+ </string>
+ <string name="edit_skirt_title">
+ Изменение юбки
+ </string>
+ <string name="edit_gloves_title">
+ Изменение перчаток
+ </string>
+ <string name="edit_undershirt_title">
+ Изменение майки
+ </string>
+ <string name="edit_underpants_title">
+ Изменение труÑов
+ </string>
+ <string name="edit_alpha_title">
+ Изменение альфа-маÑки
+ </string>
+ <string name="edit_tattoo_title">
+ Изменение тату
+ </string>
+ <string name="edit_physics_title">
+ Изменение физики
+ </string>
+ <string name="shape_desc_text">
+ Фигура:
+ </string>
+ <string name="skin_desc_text">
+ Кожа:
+ </string>
+ <string name="hair_desc_text">
+ ВолоÑÑ‹:
+ </string>
+ <string name="eyes_desc_text">
+ Глаза:
+ </string>
+ <string name="shirt_desc_text">
+ Рубашка:
+ </string>
+ <string name="pants_desc_text">
+ Брюки:
+ </string>
+ <string name="shoes_desc_text">
+ Обувь:
+ </string>
+ <string name="socks_desc_text">
+ ÐоÑки:
+ </string>
+ <string name="jacket_desc_text">
+ Пиджак:
+ </string>
+ <string name="skirt_desc_text">
+ Юбка:
+ </string>
+ <string name="gloves_desc_text">
+ Перчатки:
+ </string>
+ <string name="undershirt_desc_text">
+ Майка:
+ </string>
+ <string name="underpants_desc_text">
+ ТруÑÑ‹:
+ </string>
+ <string name="alpha_desc_text">
+ Ðльфа-маÑка:
+ </string>
+ <string name="tattoo_desc_text">
+ Тату:
+ </string>
+ <string name="physics_desc_text">
+ Физика:
+ </string>
+ <labeled_back_button label="Сохранить" name="back_btn" tool_tip="ВернутьÑÑ Ðº изменению коÑтюма"/>
+ <text name="edit_wearable_title" value="Изменение фигуры"/>
+ <panel label="Рубашка" name="wearable_type_panel">
+ <text name="description_text" value="Фигура:"/>
+ <radio_group name="sex_radio">
+ <radio_item label="" name="sex_male" tool_tip="Мужчина" value="1"/>
+ <radio_item label="" name="sex_female" tool_tip="Женщина" value="0"/>
+ </radio_group>
+ <icon name="male_icon" tool_tip="Мужчина"/>
+ <icon name="female_icon" tool_tip="Женщина"/>
+ </panel>
+ <panel name="button_panel">
+ <layout_stack name="button_panel_ls">
+ <layout_panel name="save_as_btn_lp">
+ <button label="Сохранить как" name="save_as_button"/>
+ </layout_panel>
+ <layout_panel name="revert_btn_lp">
+ <button label="Отменить изменениÑ" name="revert_button"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_group_control_panel.xml b/indra/newview/skins/default/xui/ru/panel_group_control_panel.xml
new file mode 100644
index 0000000000..2e6f3502b6
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_group_control_panel.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+ <layout_stack name="vertical_stack">
+ <layout_panel name="group_info_btn_panel">
+ <button label="Профиль группы" name="group_info_btn"/>
+ </layout_panel>
+ <layout_panel name="call_btn_panel">
+ <button label="Звонок группе" name="call_btn"/>
+ </layout_panel>
+ <layout_panel name="end_call_btn_panel">
+ <button label="Прервать звонок" name="end_call_btn"/>
+ </layout_panel>
+ <layout_panel name="voice_ctrls_btn_panel">
+ <button label="Открыть голоÑовое управление" name="voice_ctrls_btn"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_group_general.xml b/indra/newview/skins/default/xui/ru/panel_group_general.xml
new file mode 100644
index 0000000000..4d7e1c9fff
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_group_general.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Общие" name="general_tab">
+ <panel.string name="help_text">
+ Вкладка «Общие» Ñодержит общие ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ данной группе, ÑпиÑок учаÑтников, общие наÑтройки группы и параметры учаÑтников.
+Чтобы получить Ñправку, наведите курÑор мыши на параметр.
+ </panel.string>
+ <panel.string name="group_info_unchanged">
+ ÐžÐ±Ñ‰Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ группе изменена
+ </panel.string>
+ <panel.string name="incomplete_member_data_str">
+ Получение данных учаÑтника
+ </panel.string>
+ <panel name="group_info_top">
+ <texture_picker label="" name="insignia" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° изображениÑ"/>
+ <text name="prepend_founded_by">
+ ОÑнователь:
+ </text>
+ <text name="join_cost_text">
+ БеÑплатно
+ </text>
+ <button label="ПРИСОЕДИÐИТЬСЯ!" name="btn_join"/>
+ </panel>
+ <text_editor name="charter">
+ УÑтав группы
+ </text_editor>
+ <name_list name="visible_members">
+ <name_list.columns label="УчаÑтник" name="name"/>
+ <name_list.columns label="Титул" name="title"/>
+ <name_list.columns label="СтатуÑ" name="status"/>
+ </name_list>
+ <text name="my_group_settngs_label">
+ Я
+ </text>
+ <text name="active_title_label">
+ Титул:
+ </text>
+ <combo_box name="active_title" tool_tip="УÑтановить титул, который будет показан вмеÑте Ñ Ð²Ð°ÑˆÐ¸Ð¼ именем, когда Ñта группа активна."/>
+ <check_box label="Получать ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾Ñ‚ группы" name="receive_notices" tool_tip="Включите, еÑли хотите получать ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾Ñ‚ Ñтой группы. Снимите Ñтот флажок, еÑли группа шлет вам нежелательные ÑообщениÑ."/>
+ <check_box label="Показывать в моем профиле" name="list_groups_in_profile" tool_tip="Включите, еÑли хотите, чтобы группа отображалаÑÑŒ в вашем профиле"/>
+ <panel name="preferences_container">
+ <text name="group_settngs_label">
+ Группа
+ </text>
+ <check_box label="ÐžÑ‚ÐºÑ€Ñ‹Ñ‚Ð°Ñ Ñ€ÐµÐ³Ð¸ÑтрациÑ" name="open_enrollement" tool_tip="УÑтанавливаетÑÑ, еÑли в Ñтой группе можно зарегиÑтрироватьÑÑ Ð±ÐµÐ· приглашениÑ."/>
+ <check_box label="ÐŸÐ»Ð°Ñ‚Ð½Ð°Ñ Ñ€ÐµÐ³Ð¸ÑтрациÑ" name="check_enrollment_fee" tool_tip="УÑтанавливаетÑÑ, еÑли в Ñтой группе требуетÑÑ Ð¾Ð¿Ð»Ð°Ñ‚Ð° за вÑтупление."/>
+ <spinner label="L$" name="spin_enrollment_fee" tool_tip="Ðовые учаÑтники должны будут оплатить взноÑ, еÑли региÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð¿Ð»Ð°Ñ‚Ð½Ð°Ñ."/>
+ <combo_box name="group_mature_check" tool_tip="УÑтанавливает, Ñодержит ли группа информацию категории умеренной дозволенноÑти">
+ <combo_item name="select_mature">
+ - Выберите рейтинг зрелоÑти -
+ </combo_item>
+ <combo_box.item label="Умеренный контент" name="mature"/>
+ <combo_box.item label="Общий контент" name="pg"/>
+ </combo_box>
+ <check_box initial_value="иÑтина" label="Показать в поиÑке" name="show_in_group_list" tool_tip="Позволить людÑм видеть Ñту группу в результатах поиÑка"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/ru/panel_group_info_sidetray.xml
new file mode 100644
index 0000000000..d8cf1b4756
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_group_info_sidetray.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Профиль группы" name="GroupInfo">
+ <panel.string name="default_needs_apply_text">
+ ЕÑÑ‚ÑŒ неÑохраненные изменениÑ
+ </panel.string>
+ <panel.string name="want_apply_text">
+ Ð’Ñ‹ хотите Ñохранить Ñти изменениÑ?
+ </panel.string>
+ <panel.string name="group_join_btn">
+ ПриÑоединитьÑÑ (L$[AMOUNT])
+ </panel.string>
+ <panel.string name="group_join_free">
+ БеÑплатно
+ </panel.string>
+ <panel name="group_info_top">
+ <text_editor name="group_name" value="(Загрузка...)"/>
+ <line_editor label="Введите здеÑÑŒ название новой группы" name="group_name_editor"/>
+ </panel>
+ <layout_stack name="layout">
+ <layout_panel name="group_accordions">
+ <accordion name="groups_accordion">
+ <accordion_tab name="group_general_tab" title="Общие"/>
+ <accordion_tab name="group_roles_tab" title="Роли"/>
+ <accordion_tab name="group_notices_tab" title="УведомлениÑ"/>
+ <accordion_tab name="group_land_tab" title="ЗемлÑ/активы"/>
+ </accordion>
+ </layout_panel>
+ </layout_stack>
+ <layout_stack name="button_row_ls">
+ <layout_panel name="btn_chat_lp">
+ <button label="Чат" name="btn_chat"/>
+ </layout_panel>
+ <layout_panel name="call_btn_lp">
+ <button label="Звонок группе" name="btn_call" tool_tip="Звонок Ñтой группе"/>
+ </layout_panel>
+ <layout_panel name="btn_apply_lp">
+ <button label="Сохранить" label_selected="Сохранить" name="btn_apply"/>
+ <button label="Создать группу" name="btn_create" tool_tip="Создать новую группу"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_group_invite.xml b/indra/newview/skins/default/xui/ru/panel_group_invite.xml
new file mode 100644
index 0000000000..3041046041
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_group_invite.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="ПриглаÑить учаÑтника" name="invite_panel">
+ <panel.string name="confirm_invite_owner_str">
+ Ð’Ñ‹ уверены, что хотите приглаÑить новых владельцев? Это дейÑтвие Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ.
+ </panel.string>
+ <panel.string name="loading">
+ (загрузка…)
+ </panel.string>
+ <panel.string name="already_in_group">
+ ÐеÑколько выбранных жителей уже ÑоÑтоÑÑ‚ в группе. Им Ð¿Ñ€Ð¸Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ñ Ð½Ðµ были отправлены.
+ </panel.string>
+ <text name="help_text">
+ Можно выбрать неÑколько жителей Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ñ Ð² группу. Чтобы начать, щелкните «Выбрать жителей».
+ </text>
+ <button label="Выбрать жителей" name="add_button"/>
+ <name_list name="invitee_list" tool_tip="Чтобы выбрать неÑколько жителей, нажмите и удерживайте клавишу CTRL, а затем щелкните их имена"/>
+ <button label="Удалить выбранных из ÑпиÑка" name="remove_button" tool_tip="Удаление выбранных жителей из ÑпиÑка приглашенных"/>
+ <text name="role_text">
+ Выберите назначаемую им роль:
+ </text>
+ <combo_box name="role_name" tool_tip="Выберите в ÑпиÑке роли, которые вы можете назначать учаÑтникам"/>
+ <button label="Отправить приглашениÑ" name="ok_button"/>
+ <button label="Отмена" name="cancel_button"/>
+ <string name="GroupInvitation">
+ Групповое приглашение
+ </string>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_group_land_money.xml b/indra/newview/skins/default/xui/ru/panel_group_land_money.xml
new file mode 100644
index 0000000000..9235aa2f69
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_group_land_money.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Ð—ÐµÐ¼Ð»Ñ Ð¸ L$" name="land_money_tab">
+ <panel.string name="help_text">
+ ЕÑли общее количеÑтво иÑпользованной земли не превышает общий взноÑ, отобразитÑÑ Ð¿Ñ€ÐµÐ´ÑƒÐ¿Ñ€ÐµÐ¶Ð´ÐµÐ½Ð¸Ðµ.
+ </panel.string>
+ <panel.string name="cant_view_group_land_text">
+ У Ð²Ð°Ñ Ð½ÐµÑ‚ прав Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра принадлежащей группе земли
+ </panel.string>
+ <panel.string name="epmty_view_group_land_text">
+ Ðет данных
+ </panel.string>
+ <panel.string name="cant_view_group_accounting_text">
+ У Ð²Ð°Ñ Ð½ÐµÑ‚ прав Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра информации о Ñчетах группы.
+ </panel.string>
+ <panel.string name="loading_txt">
+ Загрузка...
+ </panel.string>
+ <panel.string name="land_contrib_error">
+ Ðе удаетÑÑ Ð·Ð°Ð´Ð°Ñ‚ÑŒ ваш земельный взноÑ
+ </panel.string>
+ <panel name="layout_panel_landmoney">
+ <scroll_list name="group_parcel_list">
+ <scroll_list.columns label="УчаÑток" name="name"/>
+ <scroll_list.columns label="Регион" name="location"/>
+ <scroll_list.columns label="Тип" name="type"/>
+ <scroll_list.columns label="Площадь" name="area"/>
+ <scroll_list.columns label="Скрыто" name="hidden"/>
+ </scroll_list>
+ <text name="total_contributed_land_label">
+ Общий взноÑ:
+ </text>
+ <text name="total_contributed_land_value">
+ [AREA] м²
+ </text>
+ <button label="Карта" label_selected="Карта" name="map_button"/>
+ <text name="total_land_in_use_label">
+ Ð’Ñего иÑпользуетÑÑ Ð·ÐµÐ¼Ð»Ð¸:
+ </text>
+ <text name="total_land_in_use_value">
+ [AREA] м²
+ </text>
+ <text name="land_available_label">
+ ДоÑтупно земли:
+ </text>
+ <text name="land_available_value">
+ [AREA] м²
+ </text>
+ <text name="your_contribution_label">
+ Ваш взноÑ:
+ </text>
+ <text name="your_contribution_units">
+ м²
+ </text>
+ <text name="your_contribution_max_value">
+ (макÑимум: [AMOUNT])
+ </text>
+ <text name="group_over_limit_text">
+ Ð”Ð»Ñ Ñффективного иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð·ÐµÐ¼Ð»Ð¸ нужно больше земельных кредитов
+ </text>
+ <text name="group_money_heading">
+ Группы L$
+ </text>
+ </panel>
+ <tab_container name="group_money_tab_container">
+ <panel label="ПЛÐÐИРОВÐÐИЕ" name="group_money_planning_tab">
+ <text_editor name="group_money_planning_text">
+ Загрузка...
+ </text_editor>
+ </panel>
+ <panel label="ДÐÐÐЫЕ" name="group_money_details_tab">
+ <text_editor name="group_money_details_text">
+ Загрузка...
+ </text_editor>
+ <button name="earlier_details_button" tool_tip="Ðазад"/>
+ <button name="later_details_button" tool_tip="Далее"/>
+ </panel>
+ <panel label="ПРОДÐЖИ" name="group_money_sales_tab">
+ <text_editor name="group_money_sales_text">
+ Загрузка...
+ </text_editor>
+ <button name="earlier_sales_button" tool_tip="Ðазад"/>
+ <button name="later_sales_button" tool_tip="Далее"/>
+ </panel>
+ </tab_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_group_list_item.xml b/indra/newview/skins/default/xui/ru/panel_group_list_item.xml
new file mode 100644
index 0000000000..7f000fb5a0
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_group_list_item.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="group_list_item">
+ <text name="group_name" value="ÐеизвеÑтно"/>
+ <button name="profile_btn" tool_tip="Смотреть профиль"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_group_notices.xml b/indra/newview/skins/default/xui/ru/panel_group_notices.xml
new file mode 100644
index 0000000000..8d20c4a96b
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_group_notices.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="УведомлениÑ" name="notices_tab">
+ <panel.string name="help_text">
+ Ð£Ð²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÑŽÑ‚ отправлÑÑ‚ÑŒ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¸ вложенные объекты.
+Ð£Ð²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑƒÑ‡Ð°ÑŽÑ‚ только учаÑтники групп Ñ Ñ€Ð¾Ð»Ñми, которые дают право на получение уведомлений.
+Вы можете отключить получение уведомлений на вкладке «Общие».
+ </panel.string>
+ <panel.string name="no_notices_text">
+ Ðет Ñтарых уведомлений
+ </panel.string>
+ <text name="lbl2">
+ Ð£Ð²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ñ…Ñ€Ð°Ð½ÑÑ‚ÑÑ 14 дней.
+МакÑимум 200 уведомлений ежедневно
+ </text>
+ <scroll_list name="notice_list">
+ <scroll_list.columns label="Тема" name="subject"/>
+ <scroll_list.columns label="От кого" name="from"/>
+ <scroll_list.columns label="Дата" name="date"/>
+ </scroll_list>
+ <text name="notice_list_none_found">
+ Ðе найдено
+ </text>
+ <button label="Ðовое уведомление" name="create_new_notice" tool_tip="Создать уведомление"/>
+ <button name="refresh_notices" tool_tip="Обновить ÑпиÑок уведомлений"/>
+ <panel label="Создать уведомление" name="panel_create_new_notice">
+ <text name="lbl">
+ Создать уведомление
+ </text>
+ <text name="lbl3">
+ Тема:
+ </text>
+ <text name="lbl4">
+ Сообщение:
+ </text>
+ <text name="lbl5">
+ Вложение:
+ </text>
+ <text name="string">
+ Перетащите Ñюда предмет, чтобы вложить его:
+ </text>
+ <button label="Инвентарь" name="open_inventory" tool_tip="Открыть инвентарь"/>
+ <button name="remove_attachment" tool_tip="Удалить вложение из уведомлениÑ"/>
+ <button label="ПоÑлать" label_selected="ПоÑлать" name="send_notice"/>
+ <group_drop_target name="drop_target" tool_tip="Перетащите из Ð¸Ð½Ð²ÐµÐ½Ñ‚Ð°Ñ€Ñ Ð½Ð° Ñту панель предмет, чтобы отправить его вмеÑте Ñ Ñообщением. У Ð²Ð°Ñ Ð´Ð¾Ð»Ð¶Ð½Ð¾ быть разрешение на копирование и передачу Ñтого предмета."/>
+ </panel>
+ <panel label="Смотреть Ñтарые уведомлениÑ" name="panel_view_past_notice">
+ <text name="lbl">
+ Ðрхивные уведомлениÑ
+ </text>
+ <text name="lbl2">
+ Чтобы поÑлать новое уведомление, нажмите кнопку +
+ </text>
+ <text name="lbl3">
+ Тема:
+ </text>
+ <text name="lbl4">
+ Сообщение:
+ </text>
+ <button label="Открыть вложение" name="open_attachment"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_group_notify.xml b/indra/newview/skins/default/xui/ru/panel_group_notify.xml
new file mode 100644
index 0000000000..1aee7a7f61
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_group_notify.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="instant_message" name="panel_group_notify">
+ <string name="message_max_lines_count" value="7"/>
+ <string name="subject_font" value="SANSSERIF_BIG"/>
+ <string name="date_font" value="SANSSERIF"/>
+ <panel label="заголовок" name="header">
+ <text name="title" value="Ð˜Ð¼Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð¸Ñ‚ÐµÐ»Ñ/название группы"/>
+ </panel>
+ <text_editor name="message" value="Ñообщение"/>
+ <text name="attachment" value="Вложение"/>
+ <button label="ОК" name="btn_ok"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_group_roles.xml b/indra/newview/skins/default/xui/ru/panel_group_roles.xml
new file mode 100644
index 0000000000..c57f21679f
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_group_roles.xml
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="УчаÑтники и роли" name="roles_tab">
+ <panel.string name="default_needs_apply_text">
+ ЕÑÑ‚ÑŒ неÑохраненные изменениÑ
+ </panel.string>
+ <panel.string name="want_apply_text">
+ Хотите Ñохранить изменениÑ?
+ </panel.string>
+ <tab_container name="roles_tab_container">
+ <panel label="УЧÐСТÐИКИ" name="members_sub_tab" tool_tip="УчаÑтники">
+ <panel.string name="help_text">
+ Можно добавлÑÑ‚ÑŒ или удалÑÑ‚ÑŒ роли, назначенные учаÑтникам.
+Чтобы выбрать неÑколько учаÑтников, удерживайте клавишу CTRL и
+щелкайте нужные имена.
+ </panel.string>
+ <panel.string name="donation_area">
+ [AREA] м²
+ </panel.string>
+ <filter_editor label="Фильтр учаÑтников" name="filter_input"/>
+ <name_list name="member_list">
+ <name_list.columns label="УчаÑтник" name="name"/>
+ <name_list.columns label="Вклад" name="donated"/>
+ <name_list.columns label="СтатуÑ" name="online"/>
+ </name_list>
+ <button label="ПриглаÑить" name="member_invite"/>
+ <button label="Выкинуть" name="member_eject"/>
+ </panel>
+ <panel label="РОЛИ" name="roles_sub_tab">
+ <panel.string name="help_text">
+ У ролей еÑÑ‚ÑŒ название и ÑпиÑок ÑпоÑобноÑтей,
+доÑтупных учаÑтникам. У учаÑтников может быть
+одна или неÑколько ролей. У группы может быть до 10 ролей,
+в том чиÑле роли «ВÑе» и «Владелец».
+ </panel.string>
+ <panel.string name="cant_delete_role">
+ Роли «ВÑе» и «Владелец» ÑвлÑÑŽÑ‚ÑÑ Ð¾Ñобыми и не могут быть удалены.
+ </panel.string>
+ <filter_editor label="Фильтр ролей" name="filter_input"/>
+ <scroll_list name="role_list">
+ <scroll_list.columns label="Роль" name="name"/>
+ <scroll_list.columns label="Ðазвание" name="title"/>
+ <scroll_list.columns label="#" name="members"/>
+ </scroll_list>
+ <button label="Создать роль" name="role_create"/>
+ <button label="Удалить роль" name="role_delete"/>
+ </panel>
+ <panel label="СПОСОБÐОСТИ" name="actions_sub_tab" tool_tip="Можно проÑмотреть опиÑание ÑпоÑобноÑти, а также какие учаÑтники и роли ею обладают.">
+ <panel.string name="help_text">
+ СпоÑобноÑти позволÑÑŽÑ‚ учаÑтникам, которым назначены ÑоответÑтвующие роли, выполнÑÑ‚ÑŒ оÑобые
+дейÑÑ‚Ð²Ð¸Ñ Ð² группе. ИмеетÑÑ ÑˆÐ¸Ñ€Ð¾ÐºÐ¸Ð¹ выбор ÑпоÑобноÑтей.
+ </panel.string>
+ <filter_editor label="Фильтр ÑпоÑобноÑтей" name="filter_input"/>
+ <scroll_list name="action_list" tool_tip="Выберите ÑпоÑобноÑÑ‚ÑŒ, чтобы проÑмотреть данные о ней"/>
+ </panel>
+ </tab_container>
+ <panel name="members_footer">
+ <text name="static">
+ Ðазначенные роли
+ </text>
+ <text name="static2">
+ ДоÑтупные ÑпоÑобноÑти
+ </text>
+ <scroll_list name="member_allowed_actions" tool_tip="Данные о каждой доÑтупной ÑпоÑобноÑти Ñм. на вкладке «СпоÑобноÑти»"/>
+ </panel>
+ <panel name="roles_footer">
+ <text name="static">
+ Ð˜Ð¼Ñ Ñ€Ð¾Ð»Ð¸
+ </text>
+ <text name="static3">
+ Ðазвание роли
+ </text>
+ <text name="static2">
+ ОпиÑание
+ </text>
+ <text name="static4">
+ Ðазначенные учаÑтники
+ </text>
+ <check_box label="Показывать учаÑтников" name="role_visible_in_list" tool_tip="ОпределÑет, будут ли учаÑтники Ñтой роли видны на вкладке «ОÑновные» жителÑм, которые не входÑÑ‚ в группу."/>
+ <text name="static5">
+ ДоÑтупные ÑпоÑобноÑти
+ </text>
+ <scroll_list name="role_allowed_actions" tool_tip="Данные о каждой доÑтупной ÑпоÑобноÑти Ñм. на вкладке «СпоÑобноÑти»"/>
+ </panel>
+ <panel name="actions_footer">
+ <text_editor name="action_description">
+ Это ÑпоÑобноÑÑ‚ÑŒ «ИÑключать учаÑтников из группы». Владельца может иÑключить только другой владелец.
+ </text_editor>
+ <text name="static2">
+ Роли Ñ Ñтой ÑпоÑобноÑтью
+ </text>
+ <text name="static3">
+ УчаÑтники Ñ Ñтой ÑпоÑобноÑтью
+ </text>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_im_control_panel.xml b/indra/newview/skins/default/xui/ru/panel_im_control_panel.xml
new file mode 100644
index 0000000000..2a23cdb800
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_im_control_panel.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+ <layout_stack name="button_stack">
+ <layout_panel name="view_profile_btn_panel">
+ <button label="Профиль" name="view_profile_btn"/>
+ </layout_panel>
+ <layout_panel name="add_friend_btn_panel">
+ <button label="Добавить в друзьÑ" name="add_friend_btn"/>
+ </layout_panel>
+ <layout_panel name="teleport_btn_panel">
+ <button label="ТелепортациÑ" name="teleport_btn" tool_tip="Предложить телепортацию Ñтому жителю"/>
+ </layout_panel>
+ <layout_panel name="share_btn_panel">
+ <button label="ПоделитьÑÑ" name="share_btn"/>
+ </layout_panel>
+ <layout_panel name="pay_btn_panel">
+ <button label="Заплатить" name="pay_btn"/>
+ </layout_panel>
+ <layout_panel name="call_btn_panel">
+ <button label="Звонок" name="call_btn"/>
+ </layout_panel>
+ <layout_panel name="end_call_btn_panel">
+ <button label="Завершить звонок" name="end_call_btn"/>
+ </layout_panel>
+ <layout_panel name="voice_ctrls_btn_panel">
+ <button label="Управление голоÑом" name="voice_ctrls_btn"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_instant_message.xml b/indra/newview/skins/default/xui/ru/panel_instant_message.xml
new file mode 100644
index 0000000000..cf9bc7fccb
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_instant_message.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="im_panel" name="im_panel">
+ <string name="message_max_lines_count">
+ 6
+ </string>
+ <panel label="im_header" name="im_header">
+ <text name="time_box" value="23:30"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_inventory_item.xml b/indra/newview/skins/default/xui/ru/panel_inventory_item.xml
new file mode 100644
index 0000000000..d18047fbcf
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_inventory_item.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="inventory_item">
+ <text name="item_name" value="..."/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_landmark_info.xml b/indra/newview/skins/default/xui/ru/panel_landmark_info.xml
new file mode 100644
index 0000000000..f4febd49cd
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_landmark_info.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="landmark_info">
+ <string name="title_create_landmark" value="Создать закладку"/>
+ <string name="title_edit_landmark" value="Изменить закладку"/>
+ <string name="title_landmark" value="Закладка"/>
+ <string name="not_available" value="(неизвеÑтно)"/>
+ <string name="unknown" value="(неизвеÑтно)"/>
+ <string name="public" value="(публичное)"/>
+ <string name="server_update_text">
+ Ðеобходимо обновление Ñервера, чтобы Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ñтала доÑтупна.
+ </string>
+ <string name="server_error_text">
+ Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ð± Ñтом меÑте ÑÐµÐ¹Ñ‡Ð°Ñ Ð½ÐµÐ´Ð¾Ñтупна. Повторите попытку позже.
+ </string>
+ <string name="server_forbidden_text">
+ Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ð± Ñтом меÑте недоÑтупна, поÑкольку у Ð²Ð°Ñ Ð½ÐµÑ‚ прав на ее проÑмотр. Узнайте о Ñвоих правах, ÑвÑзавшиÑÑŒ Ñ Ð²Ð»Ð°Ð´ÐµÐ»ÑŒÑ†ÐµÐ¼ учаÑтка.
+ </string>
+ <string name="acquired_date">
+ [wkday,datetime,local], [day,datetime,local] [mth,datetime,local] [year,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
+ </string>
+ <button name="back_btn" tool_tip="Ðазад"/>
+ <text name="title" value="Профиль меÑта"/>
+ <scroll_container name="place_scroll">
+ <panel name="scrolling_panel">
+ <text name="region_title" value="Образец_региона"/>
+ <text name="parcel_title" value="Пример учаÑтка, длина имени (145, 228, 26)"/>
+ <expandable_text name="description" value="Du waltz die spritz"/>
+ <text name="maturity_value" value="неизвеÑтно"/>
+ <panel name="landmark_info_panel">
+ <text name="owner_label" value="Владелец:"/>
+ <text name="creator_label" value="Создатель:"/>
+ <text name="created_label" value="Создано:"/>
+ </panel>
+ <panel name="landmark_edit_panel">
+ <text name="title_label" value="Ðазвание:"/>
+ <text name="notes_label" value="Мои заметки:"/>
+ <text name="folder_label" value="РаÑположение закладки:"/>
+ </panel>
+ </panel>
+ </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_landmarks.xml b/indra/newview/skins/default/xui/ru/panel_landmarks.xml
new file mode 100644
index 0000000000..7d684cd479
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_landmarks.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="Landmarks">
+ <accordion name="landmarks_accordion">
+ <accordion_tab name="tab_favorites" title="Избранное"/>
+ <accordion_tab name="tab_landmarks" title="Мои закладки"/>
+ <accordion_tab name="tab_inventory" title="Мой инвентарь"/>
+ <accordion_tab name="tab_library" title="Библиотека"/>
+ </accordion>
+ <panel name="bottom_panel">
+ <layout_stack name="bottom_panel">
+ <layout_panel name="options_gear_btn_panel">
+ <menu_button name="options_gear_btn" tool_tip="Показать дополнительные параметры"/>
+ </layout_panel>
+ <layout_panel name="add_btn_panel">
+ <button name="add_btn" tool_tip="Добавить новую закладку"/>
+ </layout_panel>
+ <layout_panel name="trash_btn_panel">
+ <dnd_button name="trash_btn" tool_tip="Удалить выбранную закладку"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_login.xml b/indra/newview/skins/default/xui/ru/panel_login.xml
new file mode 100644
index 0000000000..7928191fa6
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_login.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_login">
+ <panel.string name="create_account_url">
+ http://join.secondlife.com/
+ </panel.string>
+ <panel.string name="forgot_password_url">
+ http://secondlife.com/account/request.php
+ </panel.string>
+ <layout_stack name="login_widgets">
+ <layout_panel name="login">
+ <text name="username_text">
+ Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ:
+ </text>
+ <combo_box name="username_combo" tool_tip="Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ, которое вы выбрали при региÑтрации, например, «bobsmith12» или «Steller Sunshine»"/>
+ <text name="password_text">
+ Пароль:
+ </text>
+ <check_box label="Запомнить пароль" name="remember_check"/>
+ <button label="Войти" name="connect_btn"/>
+ <text name="mode_selection_text">
+ Режим:
+ </text>
+ <combo_box name="mode_combo" tool_tip="Выберите режим. ОÑновной – Ð´Ð»Ñ Ð±Ñ‹Ñтрого и проÑтого Ð¾Ð·Ð½Ð°ÐºÐ¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ñ Ð¸Ð³Ñ€Ð¾Ð¹, а также общениÑ. РаÑширенный – Ð´Ð»Ñ Ð´Ð¾Ñтупа к более широким возможноÑÑ‚Ñм.">
+ <combo_box.item label="ОÑновной" name="Basic"/>
+ <combo_box.item label="РаÑширенный" name="Advanced"/>
+ </combo_box>
+ <text name="start_location_text">
+ МеÑто Ñтарта:
+ </text>
+ <combo_box name="start_location_combo">
+ <combo_box.item label="ПоÑледнее меÑтоположение" name="MyLastLocation"/>
+ <combo_box.item label="Мой дом" name="MyHome"/>
+ <combo_box.item label="&lt;Введите название региона&gt;" name="Typeregionname"/>
+ </combo_box>
+ </layout_panel>
+ <layout_panel name="links">
+ <text name="create_new_account_text">
+ РегиÑтрациÑ
+ </text>
+ <text name="forgot_password_text">
+ Забыли Ð¸Ð¼Ñ Ð¸Ð»Ð¸ пароль?
+ </text>
+ <text name="login_help">
+ Ðужна помощь при входе?
+ </text>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_main_inventory.xml b/indra/newview/skins/default/xui/ru/panel_main_inventory.xml
new file mode 100644
index 0000000000..80a67371af
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_main_inventory.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Вещи" name="main inventory panel">
+ <panel.string name="ItemcountFetching">
+ Обнаружено [ITEM_COUNT] вещей... [FILTER]
+ </panel.string>
+ <panel.string name="ItemcountCompleted">
+ [ITEM_COUNT] вещей [FILTER]
+ </panel.string>
+ <text name="ItemcountText">
+ Вещи:
+ </text>
+ <filter_editor label="Фильтр Ð´Ð»Ñ Ð¸Ð½Ð²ÐµÐ½Ñ‚Ð°Ñ€Ñ" name="inventory search editor"/>
+ <tab_container name="inventory filter tabs">
+ <inventory_panel label="МОЙ ИÐВЕÐТÐРЬ" name="All Items"/>
+ <recent_inventory_panel label="ÐЕДÐÐ’ÐИЕ" name="Recent Items"/>
+ </tab_container>
+ <layout_stack name="bottom_panel">
+ <layout_panel name="options_gear_btn_panel">
+ <menu_button name="options_gear_btn" tool_tip="Показать дополнительные параметры"/>
+ </layout_panel>
+ <layout_panel name="add_btn_panel">
+ <button name="add_btn" tool_tip="Добавить новую вещь"/>
+ </layout_panel>
+ <layout_panel name="trash_btn_panel">
+ <dnd_button name="trash_btn" tool_tip="Удалить выбранную вещь"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_me.xml b/indra/newview/skins/default/xui/ru/panel_me.xml
new file mode 100644
index 0000000000..21a125af87
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_me.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Мой профиль" name="panel_me">
+ <panel label="МОЯ ПОДБОРКÐ" name="panel_picks"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_media_settings_general.xml b/indra/newview/skins/default/xui/ru/panel_media_settings_general.xml
new file mode 100644
index 0000000000..6dc435db20
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_media_settings_general.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Общие" name="Media Settings General">
+ <text name="home_label">
+ ДомашнÑÑ Ñтраница:
+ </text>
+ <text name="home_fails_whitelist_label">
+ (Эта Ñтраница не определена в белом ÑпиÑке)
+ </text>
+ <line_editor name="home_url" tool_tip="ДомашнÑÑ Ñтраница Ð´Ð»Ñ Ñтого медиа-иÑточника"/>
+ <text name="preview_label">
+ Предварительный проÑмотр
+ </text>
+ <text name="current_url_label">
+ Ð¢ÐµÐºÑƒÑ‰Ð°Ñ Ñтраница:
+ </text>
+ <text name="current_url" tool_tip="Ð¢ÐµÐºÑƒÑ‰Ð°Ñ Ñтраница Ð´Ð»Ñ Ñтого медиа-иÑточника" value=""/>
+ <button label="СброÑ" name="current_url_reset_btn"/>
+ <check_box initial_value="ложь" label="ÐвтоматичеÑкое зацикливание" name="auto_loop"/>
+ <check_box initial_value="ложь" label="Ð ÐµÐ°ÐºÑ†Ð¸Ñ Ð½Ð° первый щелчок" name="first_click_interact"/>
+ <check_box initial_value="ложь" label="Ðвтоувеличение" name="auto_zoom"/>
+ <check_box initial_value="ложь" label="ÐвтоматичеÑкое проигрывание" name="auto_play"/>
+ <text name="media_setting_note">
+ Примечание. Жители могут переопределÑÑ‚ÑŒ Ñту наÑтройку.
+ </text>
+ <check_box initial_value="ложь" label="ÐвтомаÑштабирование на объекте" name="auto_scale"/>
+ <text name="size_label">
+ Размер:
+ </text>
+ <text name="X_label">
+ X
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_media_settings_permissions.xml b/indra/newview/skins/default/xui/ru/panel_media_settings_permissions.xml
new file mode 100644
index 0000000000..680cba9c14
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_media_settings_permissions.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="ÐаÑтроить" name="Media settings for controls">
+ <text name="controls_label">
+ Элементы управлениÑ:
+ </text>
+ <combo_box name="controls">
+ <combo_item name="Standard">
+ Стандарт
+ </combo_item>
+ <combo_item name="Mini">
+ Минимум
+ </combo_item>
+ </combo_box>
+ <text name="owner_label">
+ Владелец
+ </text>
+ <check_box initial_value="ложь" label="Разрешить навигацию и взаимодейÑтвие" name="perms_owner_interact"/>
+ <check_box initial_value="ложь" label="Панель ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð²Ð¸Ð´Ð½Ð°" name="perms_owner_control"/>
+ <text name="group_label">
+ Группа:
+ </text>
+ <check_box initial_value="ложь" label="Разрешить навигацию и взаимодейÑтвие" name="perms_group_interact"/>
+ <check_box initial_value="ложь" label="Панель ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð²Ð¸Ð´Ð½Ð°" name="perms_group_control"/>
+ <text name="anyone_label">
+ вÑем
+ </text>
+ <check_box initial_value="ложь" label="Разрешить навигацию и взаимодейÑтвие" name="perms_anyone_interact"/>
+ <check_box initial_value="ложь" label="Панель ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð²Ð¸Ð´Ð½Ð°" name="perms_anyone_control"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_media_settings_security.xml b/indra/newview/skins/default/xui/ru/panel_media_settings_security.xml
new file mode 100644
index 0000000000..6b30dc799c
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_media_settings_security.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="БезопаÑноÑÑ‚ÑŒ" name="Media Settings Security">
+ <check_box initial_value="ложь" label="Разрешить доÑтуп к ÑÑылкам только по шаблону" name="whitelist_enable"/>
+ <text name="home_url_fails_some_items_in_whitelist">
+ Пункты, не подходÑщие Ð´Ð»Ñ Ð´Ð¾Ð¼Ð°ÑˆÐ½ÐµÐ¹ Ñтраницы, отмечены знаком:
+ </text>
+ <button label="Добавить" name="whitelist_add"/>
+ <button label="Удалить" name="whitelist_del"/>
+ <text name="home_url_fails_whitelist">
+ Внимание! ДомашнÑÑ Ñтраница, ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ð°Ñ Ð½Ð° вкладке «Общие», не входит в белый ÑпиÑок. Она будет недоÑтупна до тех пор, пока не будет внеÑена Ð¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ.
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_navigation_bar.xml b/indra/newview/skins/default/xui/ru/panel_navigation_bar.xml
new file mode 100644
index 0000000000..5e3de180f9
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_navigation_bar.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="navigation_bar">
+ <layout_stack name="nvp_stack">
+ <layout_panel name="navigation_layout_panel">
+ <panel name="navigation_panel">
+ <pull_button name="back_btn" tool_tip="ВернутьÑÑ Ð² предыдущее меÑто"/>
+ <pull_button name="forward_btn" tool_tip="Перейти в Ñледующее меÑто"/>
+ <button name="home_btn" tool_tip="Ð¢ÐµÐ»ÐµÐ¿Ð¾Ñ€Ñ‚Ð°Ñ†Ð¸Ñ Ð´Ð¾Ð¼Ð¾Ð¹"/>
+ <location_input label="МеÑто" name="location_combo"/>
+ </panel>
+ </layout_panel>
+ <layout_panel name="favorites_layout_panel">
+ <favorites_bar name="favorite" tool_tip="ПеретаÑкивайте Ñюда закладки, чтобы было удобнее переходить в любимые меÑта в Second Life!">
+ <label name="favorites_bar_label" tool_tip="ПеретаÑкивайте Ñюда закладки, чтобы было удобнее переходить в любимые меÑта в Second Life!">
+ Избранное
+ </label>
+ <more_button name="&gt;&gt;" tool_tip="Показать больше избранного">
+ Больше ▼
+ </more_button>
+ </favorites_bar>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_nearby_chat.xml b/indra/newview/skins/default/xui/ru/panel_nearby_chat.xml
new file mode 100644
index 0000000000..a8fdfde1c4
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_nearby_chat.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="nearby_chat">
+ <layout_stack name="stack">
+ <layout_panel name="translate_chat_checkbox_lp">
+ <check_box label="Переводить чат" name="translate_chat_checkbox"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/ru/panel_nearby_chat_bar.xml
new file mode 100644
index 0000000000..804ba7def7
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_nearby_chat_bar.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="chat_bar">
+ <line_editor label="Щелкните здеÑÑŒ Ð´Ð»Ñ Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ" name="chat_box" tool_tip="Ðажмите Enter, чтобы Ñказать, Ctrl+Enter, чтобы прокричать"/>
+ <button name="show_nearby_chat" tool_tip="Показать/Ñкрыть лог локального чата"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_nearby_media.xml b/indra/newview/skins/default/xui/ru/panel_nearby_media.xml
new file mode 100644
index 0000000000..3b23fc78f5
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_nearby_media.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="nearby_media">
+ <string name="media_item_count_format">
+ (%ld предметов Ñ Ð¼ÐµÐ´Ð¸Ð°)
+ </string>
+ <string name="empty_item_text">
+ &lt;пуÑто&gt;
+ </string>
+ <string name="parcel_media_name">
+ Потоковое видео на учаÑтке
+ </string>
+ <string name="parcel_audio_name">
+ Потоковый звук на учаÑтке
+ </string>
+ <string name="playing_suffix">
+ (проигрываетÑÑ)
+ </string>
+ <panel name="minimized_controls">
+ <button label="Выключить вÑе" name="all_nearby_media_disable_btn" tool_tip="Выключить вÑе ближайшее медиа"/>
+ <button label="Включить вÑе" name="all_nearby_media_enable_btn" tool_tip="Включить вÑе ближайшее медиа"/>
+ <button name="open_prefs_btn" tool_tip="Открыть наÑтройки медиа"/>
+ <button label="Больше &gt;&gt;" label_selected="&lt;&lt; Меньше" name="more_btn" tool_tip="Дополнительное управление"/>
+ </panel>
+ <panel name="nearby_media_panel">
+ <text name="nearby_media_title">
+ Ближайшее медиа
+ </text>
+ <text name="show_text">
+ Показать:
+ </text>
+ <combo_box name="show_combo">
+ <combo_box.item label="Ð’Ñе" name="All"/>
+ <combo_box.item label="Ðа Ñтом учаÑтке" name="WithinParcel"/>
+ <combo_box.item label="За пределами Ñтого учаÑтка" name="OutsideParcel"/>
+ <combo_box.item label="Ðа других аватарах" name="OnOthers"/>
+ </combo_box>
+ <scroll_list name="media_list">
+ <scroll_list.columns label="РаÑÑтоÑние" name="media_proximity"/>
+ <scroll_list.columns label="ВидимоÑÑ‚ÑŒ" name="media_visibility"/>
+ <scroll_list.columns label="КлаÑÑ" name="media_class"/>
+ <scroll_list.columns label="Ðазвание" name="media_name"/>
+ <scroll_list.columns label="Отладка" name="media_debug"/>
+ </scroll_list>
+ <panel name="media_controls_panel">
+ <layout_stack name="media_controls">
+ <layout_panel name="stop">
+ <button name="stop_btn" tool_tip="ОÑтановить выбранное медиа"/>
+ </layout_panel>
+ <layout_panel name="play">
+ <button name="play_btn" tool_tip="Проиграть выбранное медиа"/>
+ </layout_panel>
+ <layout_panel name="pause">
+ <button name="pause_btn" tool_tip="ПриоÑтановить выбранное медиа"/>
+ </layout_panel>
+ <layout_panel name="volume_slider_ctrl">
+ <slider_bar initial_value="0.5" name="volume_slider" tool_tip="ГромкоÑÑ‚ÑŒ звука выбранного медиа"/>
+ </layout_panel>
+ <layout_panel name="mute">
+ <button name="mute_btn" tool_tip="Заглушить выбранное медиа"/>
+ </layout_panel>
+ <layout_panel name="zoom">
+ <button name="zoom_btn" tool_tip="Приблизить камеру к выбранному медиа"/>
+ </layout_panel>
+ <layout_panel name="unzoom">
+ <button name="unzoom_btn" tool_tip="Отдалить камеру от выбранного медиа"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_notify_textbox.xml b/indra/newview/skins/default/xui/ru/panel_notify_textbox.xml
new file mode 100644
index 0000000000..1ac88a01b3
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_notify_textbox.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="instant_message" name="panel_notify_textbox">
+ <string name="message_max_lines_count" value="7"/>
+ <panel label="info_panel" name="info_panel">
+ <text_editor name="message" value="Ñообщение"/>
+ </panel>
+ <panel label="control_panel" name="control_panel">
+ <button label="ОтоÑлать" name="btn_submit"/>
+ <button label="Игнорировать" name="ignore_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_online_status_toast.xml b/indra/newview/skins/default/xui/ru/panel_online_status_toast.xml
new file mode 100644
index 0000000000..fdc489f375
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_online_status_toast.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="friend_online_status" name="friend_online_status"/>
diff --git a/indra/newview/skins/default/xui/ru/panel_outbox_inventory.xml b/indra/newview/skins/default/xui/ru/panel_outbox_inventory.xml
new file mode 100644
index 0000000000..0095d48af9
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_outbox_inventory.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<outbox_inventory_panel name="inventory_outbox" tool_tip="Перетащите вещи Ñюда, чтобы подготовить их Ð´Ð»Ñ Ñ€Ð°Ð·Ð¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð½Ð° витрине вашего магазина"/>
diff --git a/indra/newview/skins/default/xui/ru/panel_outfit_edit.xml b/indra/newview/skins/default/xui/ru/panel_outfit_edit.xml
new file mode 100644
index 0000000000..91c03342a7
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_outfit_edit.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Side tray Outfit Edit panel -->
+<panel name="outfit_edit">
+ <string name="No Outfit" value="Ðет коÑтюма"/>
+ <string name="unsaved_changes" value="ÐеÑохраненные изменениÑ"/>
+ <string name="now_editing" value="Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€ÑƒÐµÑ‚ÑÑ"/>
+ <panel.string name="not_available">
+ (нет)
+ </panel.string>
+ <panel.string name="unknown">
+ (неизвеÑтно)
+ </panel.string>
+ <string name="Filter.All" value="Ð’Ñе"/>
+ <string name="Filter.Clothes/Body" value="Одежда/тело"/>
+ <string name="Filter.Objects" value="Объекты"/>
+ <string name="Filter.Clothing" value="Одежда"/>
+ <string name="Filter.Bodyparts" value="ЧаÑти тела"/>
+ <string name="replace_body_part" value="Щелкните Ð´Ð»Ñ Ð·Ð°Ð¼ÐµÐ½Ñ‹ текущей фигуры"/>
+ <text name="title" value="Изменить коÑтюм"/>
+ <panel name="header_panel">
+ <panel name="outfit_name_and_status">
+ <text name="status" value="Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€ÑƒÐµÑ‚ÑÑ…"/>
+ <text name="curr_outfit_name" value="[Текущий коÑтюм]"/>
+ </panel>
+ </panel>
+ <layout_stack name="im_panels">
+ <layout_panel name="outfit_wearables_panel">
+ <layout_stack name="filter_panels">
+ <layout_panel name="add_button_and_combobox">
+ <button label="Добавить…" name="show_add_wearables_btn" tool_tip="Открыть/закрыть"/>
+ </layout_panel>
+ <layout_panel name="filter_panel">
+ <filter_editor label="Фильтр Ð´Ð»Ñ Ð½Ð¾Ñимого инвентарÑ" name="look_item_filter"/>
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+ <layout_panel name="add_wearables_panel">
+ <button label="ÐоÑÐ¸Ð¼Ð°Ñ Ð²ÐµÑ‰ÑŒ" name="plus_btn"/>
+ </layout_panel>
+ </layout_stack>
+ <panel name="no_add_wearables_button_bar">
+ <button name="shop_btn_1" tool_tip="ПоÑетите магазин Second Life. Также можно выбрать предмет надетой одежды и щелкнуть здеÑÑŒ, чтобы найти что-то похожее"/>
+ </panel>
+ <panel name="add_wearables_button_bar">
+ <button name="shop_btn_2" tool_tip="ПоÑетите магазин Second Life. Также можно выбрать предмет надетой одежды и щелкнуть здеÑÑŒ, чтобы найти что-то похожее"/>
+ </panel>
+ <panel name="save_revert_button_bar">
+ <layout_stack name="button_bar_ls">
+ <layout_panel name="save_btn_lp">
+ <button label="Сохранить" name="save_btn"/>
+ </layout_panel>
+ <layout_panel name="revert_btn_lp">
+ <button label="Отменить изменениÑ" name="revert_btn" tool_tip="ВернутьÑÑ Ðº поÑледней Ñохраненной верÑии"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/ru/panel_outfits_inventory.xml
new file mode 100644
index 0000000000..4d0e13fca2
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_outfits_inventory.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Вещи" name="Outfits">
+ <panel.string name="wear_outfit_tooltip">
+ Ðадеть выбранный коÑтюм
+ </panel.string>
+ <panel.string name="wear_items_tooltip">
+ Ðадеть выбранные вещи
+ </panel.string>
+ <tab_container name="appearance_tabs">
+ <panel label="МОИ КОСТЮМЫ" name="outfitslist_tab"/>
+ <panel label="ÐÐДЕТО" name="cof_tab"/>
+ </tab_container>
+ <panel name="bottom_panel">
+ <layout_stack name="bottom_panel_ls">
+ <layout_panel name="save_btn_lp">
+ <button label="Сохранить как" name="save_btn"/>
+ </layout_panel>
+ <layout_panel name="wear_btn_lp">
+ <button label="Ðадеть" name="wear_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_outfits_inventory_gear_default.xml b/indra/newview/skins/default/xui/ru/panel_outfits_inventory_gear_default.xml
new file mode 100644
index 0000000000..96f4b4a893
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_outfits_inventory_gear_default.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_gear_default">
+ <menu_item_call label="Сменить текущий коÑтюм" name="wear"/>
+ <menu_item_call label="Убрать из текущего коÑтюма" name="remove"/>
+ <menu_item_call label="Переименовать" name="rename"/>
+ <menu_item_call label="Удалить ÑÑылку" name="remove_link"/>
+ <menu_item_call label="Удалить коÑтюм" name="delete"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ru/panel_outfits_list.xml b/indra/newview/skins/default/xui/ru/panel_outfits_list.xml
new file mode 100644
index 0000000000..74551e4274
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_outfits_list.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="Outfits">
+ <accordion name="outfits_accordion">
+ <no_matched_tabs_text name="no_matched_outfits_msg" value="Ðе нашли того, что вам нужно? ВоÑпользуйтеÑÑŒ [secondlife:///app/search/all/[SEARCH_TERM] поиÑком]."/>
+ <no_visible_tabs_text name="no_outfits_msg" value="У Ð²Ð°Ñ Ð¿Ð¾ÐºÐ° нет никаких коÑтюмов. ВоÑпользуйтеÑÑŒ [secondlife:///app/search/all/ поиÑком]."/>
+ </accordion>
+ <panel name="bottom_panel">
+ <menu_button name="options_gear_btn" tool_tip="Показать дополнительные параметры"/>
+ <button name="trash_btn" tool_tip="Удалить выбранный коÑтюм"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_outfits_wearing.xml b/indra/newview/skins/default/xui/ru/panel_outfits_wearing.xml
new file mode 100644
index 0000000000..7ed6bf35c0
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_outfits_wearing.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="Wearing">
+ <panel name="bottom_panel">
+ <menu_button name="options_gear_btn" tool_tip="Показать дополнительные параметры"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_people.xml b/indra/newview/skins/default/xui/ru/panel_people.xml
new file mode 100644
index 0000000000..607921f2d6
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_people.xml
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Side tray panel -->
+<panel label="Люди" name="people_panel">
+ <string name="no_recent_people" value="Ðет людей, говоривших недавно. Ищете, Ñ ÐºÐµÐ¼ пообщатьÑÑ? ВоÑпользуйтеÑÑŒ [secondlife:///app/search/people поиÑком] или [secondlife:///app/worldmap картой мира]."/>
+ <string name="no_filtered_recent_people" value="Ðе нашли того, что вам нужно? ВоÑпользуйтеÑÑŒ [secondlife:///app/search/people/[SEARCH_TERM] поиÑком]."/>
+ <string name="no_one_near" value="Ðикого нет Ñ€Ñдом. Ищете, Ñ ÐºÐµÐ¼ пообщатьÑÑ? ВоÑпользуйтеÑÑŒ [secondlife:///app/search/people поиÑком] или [secondlife:///app/worldmap картой мира]."/>
+ <string name="no_one_filtered_near" value="Ðе нашли того, что вам нужно? ВоÑпользуйтеÑÑŒ [secondlife:///app/search/people/[SEARCH_TERM] поиÑком]."/>
+ <string name="no_friends_online" value="Ðет друзей онлайн"/>
+ <string name="no_friends" value="Ðет друзей"/>
+ <string name="no_friends_msg">
+ Ðайдите друзей Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ [secondlife:///app/search/people поиÑка] или добавьте жителей в Ð´Ñ€ÑƒÐ·ÑŒÑ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ правой кнопки мыши.
+Ищете, Ñ ÐºÐµÐ¼ пообщатьÑÑ? ВоÑпользуйтеÑÑŒ [secondlife:///app/worldmap картой мира].
+ </string>
+ <string name="no_filtered_friends_msg">
+ Ðе нашли того, что вам нужно? ВоÑпользуйтеÑÑŒ [secondlife:///app/search/people/[SEARCH_TERM] поиÑком].
+ </string>
+ <string name="people_filter_label" value="Фильтр Ð´Ð»Ñ Ð»ÑŽÐ´ÐµÐ¹"/>
+ <string name="groups_filter_label" value="Фильтр Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¿"/>
+ <string name="no_filtered_groups_msg" value="Ðе нашли того, что вам нужно? ВоÑпользуйтеÑÑŒ [secondlife:///app/search/groups/[SEARCH_TERM] поиÑком]."/>
+ <string name="no_groups_msg" value="Ищете группу, чтобы приÑоединитьÑÑ Ðº ней? ВоÑпользуйтеÑÑŒ [secondlife:///app/search/groups поиÑком]."/>
+ <string name="MiniMapToolTipMsg" value="[REGION](Двойной щелчок открывает карту, shift+перетÑгивание – обзор)"/>
+ <string name="AltMiniMapToolTipMsg" value="[REGION](Двойной щелчок – телепортациÑ, shift+перетÑгивание – обзор)"/>
+ <filter_editor label="Фильтр" name="filter_input"/>
+ <tab_container name="tabs">
+ <panel label="РЯДОМ" name="nearby_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <menu_button name="nearby_view_sort_btn" tool_tip="Опции"/>
+ <button name="add_friend_btn" tool_tip="Добавить выбранного Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ð² ÑпиÑок друзей"/>
+ </panel>
+ </panel>
+ <panel label="МОИ ДРУЗЬЯ" name="friends_panel">
+ <accordion name="friends_accordion">
+ <accordion_tab name="tab_online" title="Онлайн"/>
+ <accordion_tab name="tab_all" title="Ð’Ñе"/>
+ </accordion>
+ <panel label="bottom_panel" name="bottom_panel">
+ <layout_stack name="bottom_panel">
+ <layout_panel name="options_gear_btn_panel">
+ <menu_button name="friends_viewsort_btn" tool_tip="Показать дополнительные параметры"/>
+ </layout_panel>
+ <layout_panel name="add_btn_panel">
+ <button name="add_btn" tool_tip="Предложить жителю дружбу"/>
+ </layout_panel>
+ <layout_panel name="trash_btn_panel">
+ <dnd_button name="del_btn" tool_tip="Удалить выбранного Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ð¸Ð· ÑпиÑка друзей"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </panel>
+ <panel label="МОИ ГРУППЫ" name="groups_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <menu_button name="groups_viewsort_btn" tool_tip="Опции"/>
+ <button name="plus_btn" tool_tip="ПриÑоединитьÑÑ Ðº группе/Ñоздать новую группу"/>
+ <button name="activate_btn" tool_tip="Ðктивировать выбранную группу"/>
+ </panel>
+ </panel>
+ <panel label="ÐЕДÐÐ’ÐИЕ" name="recent_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <menu_button name="recent_viewsort_btn" tool_tip="Опции"/>
+ <button name="add_friend_btn" tool_tip="Добавить выбранного Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ð² ÑпиÑок друзей"/>
+ </panel>
+ </panel>
+ </tab_container>
+ <panel name="button_bar">
+ <layout_stack name="bottom_bar_ls">
+ <layout_panel name="view_profile_btn_lp">
+ <button label="Профиль" name="view_profile_btn" tool_tip="Показать изображение, группы и прочую информацию о жителе"/>
+ </layout_panel>
+ <layout_panel name="im_btn_lp">
+ <button label="IM" name="im_btn" tool_tip="Ðачать ÑÐµÐ°Ð½Ñ IM"/>
+ </layout_panel>
+ <layout_panel name="call_btn_lp">
+ <button label="Звонок" name="call_btn" tool_tip="Позвонить Ñтому жителю"/>
+ </layout_panel>
+ <layout_panel name="share_btn_lp">
+ <button label="ПоделитьÑÑ" name="share_btn" tool_tip="ПоделитьÑÑ Ð¾Ð±ÑŠÐµÐºÑ‚Ð¾Ð¼ из инвентарÑ"/>
+ </layout_panel>
+ <layout_panel name="teleport_btn_lp">
+ <button label="ТелепортациÑ" name="teleport_btn" tool_tip="Предложить телепортацию"/>
+ </layout_panel>
+ </layout_stack>
+ <layout_stack name="bottom_bar_ls1">
+ <layout_panel name="group_info_btn_lp">
+ <button label="Профиль группы" name="group_info_btn" tool_tip="Показать информацию о группе"/>
+ </layout_panel>
+ <layout_panel name="chat_btn_lp">
+ <button label="Групповой чат" name="chat_btn" tool_tip="Открыть ÑÐµÐ°Ð½Ñ Ñ‡Ð°Ñ‚Ð°"/>
+ </layout_panel>
+ <layout_panel name="group_call_btn_lp">
+ <button label="Звонок группе" name="group_call_btn" tool_tip="Позвонить Ñтой группе"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_pick_info.xml b/indra/newview/skins/default/xui/ru/panel_pick_info.xml
new file mode 100644
index 0000000000..373cf211fb
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_pick_info.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_pick_info">
+ <text name="title" value="О подборке"/>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text_editor name="pick_name" value="[название]"/>
+ <text_editor name="pick_location" value="[загрузка...]"/>
+ <text_editor name="pick_desc" value="[опиÑание]"/>
+ </panel>
+ </scroll_container>
+ <panel name="buttons">
+ <layout_stack name="layout_stack1">
+ <layout_panel name="layout_panel1">
+ <button label="Телепорт" name="teleport_btn"/>
+ </layout_panel>
+ <layout_panel name="show_on_map_btn_lp">
+ <button label="Карта" name="show_on_map_btn"/>
+ </layout_panel>
+ <layout_panel name="edit_btn_lp">
+ <button label="Изменить" name="edit_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_picks.xml b/indra/newview/skins/default/xui/ru/panel_picks.xml
new file mode 100644
index 0000000000..d6770e0eeb
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_picks.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Подборка" name="panel_picks">
+ <string name="no_picks" value="Ðет подборки"/>
+ <string name="no_classifieds" value="Ðет рекламы"/>
+ <accordion name="accordion">
+ <accordion_tab name="tab_picks" title="Подборка"/>
+ <accordion_tab name="tab_classifieds" title="Реклама"/>
+ </accordion>
+ <panel label="bottom_panel" name="edit_panel">
+ <layout_stack name="edit_panel_ls">
+ <layout_panel name="gear_menu_btn">
+ <button name="new_btn" tool_tip="Создать подборку или рекламу на Ñтом меÑте"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ <panel name="buttons_cucks">
+ <layout_stack name="buttons_cucks_ls">
+ <layout_panel name="info_btn_lp">
+ <button label="Данные" name="info_btn" tool_tip="Показать данные о подборке"/>
+ </layout_panel>
+ <layout_panel name="teleport_btn_lp">
+ <button label="ТелепортироватьÑÑ" name="teleport_btn" tool_tip="Ð¢ÐµÐ»ÐµÐ¿Ð¾Ñ€Ñ‚Ð°Ñ†Ð¸Ñ Ð² ÑоответÑтвующую облаÑÑ‚ÑŒ"/>
+ </layout_panel>
+ <layout_panel name="show_on_map_btn_lp">
+ <button label="Карта" name="show_on_map_btn" tool_tip="Показать ÑоответÑтвующую облаÑÑ‚ÑŒ на карте мира"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_place_profile.xml b/indra/newview/skins/default/xui/ru/panel_place_profile.xml
new file mode 100644
index 0000000000..b486b918ed
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_place_profile.xml
@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="place_profile">
+ <string name="on" value="Вкл."/>
+ <string name="off" value="Выкл."/>
+ <string name="anyone" value="Ð’Ñе"/>
+ <string name="available" value="доÑтупно"/>
+ <string name="allocated" value="раÑположено"/>
+ <string name="title_place" value="Профиль меÑта"/>
+ <string name="title_teleport_history" value="ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ñ‚ÐµÐ»ÐµÐ¿Ð¾Ñ€Ñ‚Ð¾Ð²"/>
+ <string name="not_available" value="(нет)"/>
+ <string name="unknown" value="(неизвеÑтно)"/>
+ <string name="public" value="(публичное)"/>
+ <string name="none_text" value="(нет)"/>
+ <string name="sale_pending_text" value="(Ожидание продажи)"/>
+ <string name="group_owned_text" value="(СобÑтвенноÑÑ‚ÑŒ группы)"/>
+ <string name="price_text" value="L$"/>
+ <string name="area_text" value="м²"/>
+ <string name="all_residents_text" value="Ð’Ñе жители"/>
+ <string name="group_text" value="Группа"/>
+ <string name="can_resell">
+ ÐŸÑ€Ð¸Ð¾Ð±Ñ€ÐµÑ‚ÐµÐ½Ð½Ð°Ñ Ð² Ñтом регионе Ð·ÐµÐ¼Ð»Ñ Ð¼Ð¾Ð¶ÐµÑ‚ быть перепродана.
+ </string>
+ <string name="can_not_resell">
+ ÐŸÑ€Ð¸Ð¾Ð±Ñ€ÐµÑ‚ÐµÐ½Ð½Ð°Ñ Ð² Ñтом регионе Ð·ÐµÐ¼Ð»Ñ Ð½Ðµ может быть перепродана.
+ </string>
+ <string name="can_change">
+ ÐŸÑ€Ð¸Ð¾Ð±Ñ€ÐµÑ‚ÐµÐ½Ð½Ð°Ñ Ð² Ñтом регионе Ð·ÐµÐ¼Ð»Ñ Ð¼Ð¾Ð¶ÐµÑ‚ быть объединена или разделена.
+ </string>
+ <string name="can_not_change">
+ ÐŸÑ€Ð¸Ð¾Ð±Ñ€ÐµÑ‚ÐµÐ½Ð½Ð°Ñ Ð² Ñтом регионе Ð·ÐµÐ¼Ð»Ñ Ð½Ðµ может быть объединена или разделена.
+ </string>
+ <string name="server_update_text">
+ Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ меÑте недоÑтупна без Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ñервера.
+ </string>
+ <string name="server_error_text">
+ Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ð± Ñтом меÑте ÑÐµÐ¹Ñ‡Ð°Ñ Ð½ÐµÐ´Ð¾Ñтупна. Повторите попытку позже.
+ </string>
+ <string name="server_forbidden_text">
+ Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ð± Ñтом меÑте недоÑтупна из-за ограничений доÑтупа. СоглаÑуйте Ñвой уровень доÑтупа Ñ Ð²Ð»Ð°Ð´ÐµÐ»ÑŒÑ†ÐµÐ¼ учаÑтка.
+ </string>
+ <string name="acquired_date">
+ [wkday,datetime,local], [day,datetime,local] [mth,datetime,local] [year,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
+ </string>
+ <button name="back_btn" tool_tip="Ðазад"/>
+ <text name="title" value="Профиль меÑта"/>
+ <scroll_container name="place_scroll">
+ <panel name="scrolling_panel">
+ <text name="region_title" value="Образец_региона"/>
+ <text name="parcel_title" value="Образец_учаÑтка, название Long (145, 228, 26)"/>
+ <expandable_text name="description" value="Du waltz die spritz"/>
+ <text name="owner_label" value="Владелец:"/>
+ <text name="owner_value" value="ÐлекÑей СверхдлинноеимÑнов"/>
+ <text name="maturity_value" value="неизвеÑтен"/>
+ <accordion name="advanced_info_accordion">
+ <accordion_tab name="parcel_characteristics_tab" title="УчаÑток">
+ <panel name="parcel_characteristics_panel">
+ <text name="rating_label" value="Рейтинг:"/>
+ <text name="rating_value" value="неизвеÑтен"/>
+ <text name="voice_label" value="ГолоÑ:"/>
+ <text name="voice_value" value="Вкл."/>
+ <text name="fly_label" value="Полет:"/>
+ <text name="fly_value" value="Вкл."/>
+ <text name="push_label" value="Толкание:"/>
+ <text name="push_value" value="Выкл."/>
+ <text name="build_label" value="СтроительÑтво:"/>
+ <text name="build_value" value="Вкл."/>
+ <text name="scripts_label" value="Скрипты:"/>
+ <text name="scripts_value" value="Вкл."/>
+ <text name="damage_label" value="ПовреждениÑ:"/>
+ <text name="damage_value" value="Выкл."/>
+ <text name="see_avatars_label" value="Видеть аватары:"/>
+ <text name="see_avatars_value" value="Выкл."/>
+ <button label="О земле" name="about_land_btn"/>
+ </panel>
+ </accordion_tab>
+ <accordion_tab name="region_information_tab" title="Регион">
+ <panel name="region_information_panel">
+ <text name="region_name_label" value="Регион:"/>
+ <text name="region_name" value="ЛоÑоÑево"/>
+ <text name="region_type_label" value="Тип:"/>
+ <text name="region_type" value="ЛоÑоÑÑŒ"/>
+ <text name="region_rating_label" value="Рейтинг:"/>
+ <text name="region_rating" value="ВзроÑлый"/>
+ <text name="region_owner_label" value="Владелец:"/>
+ <text name="region_owner" value="лоÑоÑÑŒ Ван ЛоÑоÑÑŒ очень длинное Ð¸Ð¼Ñ Ð»Ð¾ÑоÑÑŒ"/>
+ <text name="region_group_label" value="Группа:"/>
+ <text name="region_group">
+ Крепкий лоÑоÑÑŒ из ЛоÑоÑево под УÑÑ‚ÑŒ-ЛоÑоÑинÑком
+ </text>
+ <button label="Регион/землевладение" name="region_info_btn"/>
+ </panel>
+ </accordion_tab>
+ <accordion_tab name="estate_information_tab" title="Землевладение">
+ <panel name="estate_information_panel">
+ <text name="estate_name_label" value="Землевладение:"/>
+ <text name="estate_rating_label" value="Рейтинг:"/>
+ <text name="estate_owner_label" value="Владелец:"/>
+ <text name="estate_owner" value="Длина имени владельца теÑта (длинное имÑ)"/>
+ <text name="covenant_label" value="Соглашение:"/>
+ </panel>
+ </accordion_tab>
+ <accordion_tab name="sales_tab" title="Ð”Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð°Ð¶Ð¸">
+ <panel name="sales_panel">
+ <text name="sales_price_label" value="Цена:"/>
+ <text name="area_label" value="Площадь:"/>
+ <text name="traffic_label" value="ПоÑещаемоÑÑ‚ÑŒ:"/>
+ <text name="primitives_label" value="Примитивы:"/>
+ <text name="parcel_scripts_label" value="Скрипты:"/>
+ <text name="terraform_limits_label" value="Терраформирование:"/>
+ <text name="subdivide_label" value="СпоÑобноÑÑ‚ÑŒ разделениÑ/объединениÑ:"/>
+ <text name="resale_label" value="СпоÑобноÑÑ‚ÑŒ перепродажи:"/>
+ <text name="sale_to_label" value="Продажа длÑ:"/>
+ </panel>
+ </accordion_tab>
+ </accordion>
+ </panel>
+ </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_places.xml b/indra/newview/skins/default/xui/ru/panel_places.xml
new file mode 100644
index 0000000000..54837d3c0b
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_places.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="МеÑта" name="places panel">
+ <string name="landmarks_tab_title" value="МОИ ЗÐКЛÐДКИ"/>
+ <string name="teleport_history_tab_title" value="ИСТОРИЯ ТЕЛЕПОРТÐЦИЙ"/>
+ <filter_editor label="Фильтр Ð´Ð»Ñ Ð·Ð°ÐºÐ»Ð°Ð´Ð¾Ðº" name="Filter"/>
+ <panel name="button_panel">
+ <layout_stack name="bottom_bar_ls0">
+ <layout_panel name="lp1">
+ <layout_stack name="bottom_bar_ls1">
+ <layout_panel name="teleport_btn_lp">
+ <button label="ТелепортациÑ" name="teleport_btn" tool_tip="ТелепортироватьÑÑ Ð² выбранную облаÑÑ‚ÑŒ"/>
+ </layout_panel>
+ <layout_panel name="chat_btn_lp">
+ <button label="Карта" name="map_btn" tool_tip="Показать ÑоответÑтвующую облаÑÑ‚ÑŒ на карте мира"/>
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+ <layout_panel name="lp2">
+ <layout_stack name="bottom_bar_ls3">
+ <layout_panel name="edit_btn_lp">
+ <button label="Изменить" name="edit_btn" tool_tip="Редактировать информацию о закладке"/>
+ </layout_panel>
+ <layout_panel name="overflow_btn_lp">
+ <menu_button name="overflow_btn" tool_tip="Показать дополнительные параметры"/>
+ </layout_panel>
+ </layout_stack>
+ <layout_stack name="bottom_bar_profile_ls">
+ <layout_panel name="profile_btn_lp">
+ <button label="Профиль" name="profile_btn" tool_tip="Показать профиль меÑта"/>
+ </layout_panel>
+ </layout_stack>
+ <layout_stack name="bottom_bar_close_ls3">
+ <layout_panel name="close_btn_lp">
+ <button label="Закрыть" name="close_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+ </layout_stack>
+ <layout_stack name="bottom_bar_ls2">
+ <layout_panel name="save_btn_lp">
+ <button label="Сохранить" name="save_btn"/>
+ </layout_panel>
+ <layout_panel name="cancel_btn_lp">
+ <button label="Отмена" name="cancel_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_postcard_message.xml b/indra/newview/skins/default/xui/ru/panel_postcard_message.xml
new file mode 100644
index 0000000000..70587d8090
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_postcard_message.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_postcard_message">
+ <text name="to_label">
+ Кому:
+ </text>
+ <text name="name_label">
+ От:
+ </text>
+ <text name="subject_label">
+ Тема:
+ </text>
+ <line_editor label="Введите тему пиÑьма." name="subject_form"/>
+ <text name="msg_label">
+ Сообщение:
+ </text>
+ <text_editor name="msg_form">
+ Введите текÑÑ‚ пиÑьма.
+ </text_editor>
+ <button label="Отмена" name="cancel_btn"/>
+ <button label="ПоÑлать" name="send_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_postcard_settings.xml b/indra/newview/skins/default/xui/ru/panel_postcard_settings.xml
new file mode 100644
index 0000000000..dc9d59008f
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_postcard_settings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_postcard_settings">
+ <combo_box label="Размер" name="postcard_size_combo">
+ <combo_box.item label="Текущее окно" name="CurrentWindow"/>
+ <combo_box.item label="640x480" name="640x480"/>
+ <combo_box.item label="800x600" name="800x600"/>
+ <combo_box.item label="1024x768" name="1024x768"/>
+ <combo_box.item label="Задать" name="Custom"/>
+ </combo_box>
+ <layout_stack name="postcard_image_params_ls">
+ <layout_panel name="postcard_image_size_lp">
+ <spinner label="Ширина" name="postcard_snapshot_width"/>
+ <spinner label="Ð’Ñ‹Ñота" name="postcard_snapshot_height"/>
+ <check_box label="СохранÑÑ‚ÑŒ пропорции" name="postcard_keep_aspect_check"/>
+ </layout_panel>
+ <layout_panel name="postcard_image_format_quality_lp">
+ <slider label="КачеÑтво изображениÑ" name="image_quality_slider"/>
+ <text name="image_quality_level">
+ ([QLVL])
+ </text>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/ru/panel_preferences_advanced.xml
new file mode 100644
index 0000000000..7d8ee96924
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_preferences_advanced.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<panel label="Дополнительно" name="advanced">
+ <panel.string name="aspect_ratio_text">
+ [NUM]:[DEN]
+ </panel.string>
+ <text name="Cache:">
+ КÑш:
+ </text>
+ <spinner label="Размер кÑша (64 - 9984 МБ)" name="cachesizespinner"/>
+ <text name="text_box5">
+ МБ
+ </text>
+ <button label="ОчиÑтить кÑш" label_selected="ОчиÑтить кÑш" name="clear_cache"/>
+ <text name="Cache location">
+ РаÑположение кÑша:
+ </text>
+ <button label="Обзор" label_selected="Обзор" name="set_cache"/>
+ <button label="РаÑположение по умолчанию" label_selected="РаÑположение по умолчанию" name="default_cache_location"/>
+ <text name="UI Size:">
+ ИнтерфейÑ:
+ </text>
+ <check_box label="Показывать ошибки Ñкрипта в:" name="show_script_errors"/>
+ <radio_group name="show_location">
+ <radio_item label="локальном чате" name="0"/>
+ <radio_item label="отдельном окне" name="1"/>
+ </radio_group>
+ <check_box label="Разрешить работу неÑкольких клиентов" name="allow_multiple_viewer_check"/>
+ <check_box label="Выбор Ñетки при входе" name="show_grid_selection_check"/>
+ <check_box label="Показывать раÑширенное меню" name="show_advanced_menu_check"/>
+ <check_box label="Показывать меню разработчика" name="show_develop_menu_check"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_alerts.xml b/indra/newview/skins/default/xui/ru/panel_preferences_alerts.xml
new file mode 100644
index 0000000000..9d7ae546fd
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_preferences_alerts.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Ð’Ñплывающие окна" name="popups">
+ <text name="tell_me_label">
+ Сообщать мне:
+ </text>
+ <check_box label="о раÑходах и доходах" name="notify_money_change_checkbox"/>
+ <check_box label="о входе и выходе моих друзей" name="friends_online_notify_checkbox"/>
+ <text name="show_label">
+ Ð’Ñегда показывать:
+ </text>
+ <text name="dont_show_label">
+ Ðикогда не показывать:
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_chat.xml b/indra/newview/skins/default/xui/ru/panel_preferences_chat.xml
new file mode 100644
index 0000000000..a9d5569c7f
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_preferences_chat.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="ТекÑтовый чат" name="chat">
+ <text name="font_size">
+ Размер шрифта:
+ </text>
+ <radio_group name="chat_font_size">
+ <radio_item label="Мелкий" name="radio" value="0"/>
+ <radio_item label="Средний" name="radio2" value="1"/>
+ <radio_item label="Крупный" name="radio3" value="2"/>
+ </radio_group>
+ <check_box initial_value="иÑтина" label="ВоÑпроизводить анимацию ввода текÑта при общении" name="play_typing_animation"/>
+ <check_box label="ОтправлÑÑ‚ÑŒ мне ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ð¾ почте, когда Ð¼ÐµÐ½Ñ Ð½ÐµÑ‚ в Ñети" name="send_im_to_email"/>
+ <check_box label="ВеÑти журнал текÑтового IM и чата" name="plain_text_chat_history"/>
+ <check_box label="Чат в пузырьках" name="bubble_text_chat"/>
+ <text name="show_ims_in_label">
+ Показывать ÑообщениÑ:
+ </text>
+ <text name="requires_restart_label">
+ (требуетÑÑ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿ÑƒÑк)
+ </text>
+ <radio_group name="chat_window" tool_tip="Показывать IM-ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð² отдельных окнах или же в одном окне Ñ Ð½ÐµÑколькими вкладками (требуетÑÑ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿ÑƒÑк)">
+ <radio_item label="В отдельных окнах" name="radio" value="0"/>
+ <radio_item label="Ðа вкладках" name="radio2" value="1"/>
+ </radio_group>
+ <text name="disable_toast_label">
+ Включить вÑплывающие ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñ Ð½Ð¾Ð²Ñ‹Ð¼Ð¸ репликами в чате:
+ </text>
+ <check_box label="Групповой чат" name="EnableGroupChatPopups" tool_tip="Отображать вÑплывающие ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ поÑвлении Ñообщений в групповом чате"/>
+ <check_box label="ТекÑтовые чаты" name="EnableIMChatPopups" tool_tip="Отображать вÑплывающие ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ получении IM-Ñообщений"/>
+ <spinner label="Ð’Ñ€ÐµÐ¼Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð²Ñплывающих реплик:" name="nearby_toasts_lifetime"/>
+ <spinner label="Ð’Ñ€ÐµÐ¼Ñ Ð·Ð°Ñ‚ÑƒÑ…Ð°Ð½Ð¸Ñ Ð²Ñплывающих реплик:" name="nearby_toasts_fadingtime"/>
+ <button label="ÐаÑтройки перевода чата" name="ok_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_colors.xml b/indra/newview/skins/default/xui/ru/panel_preferences_colors.xml
new file mode 100644
index 0000000000..48c34fcbb2
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_preferences_colors.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Цвета" name="colors_panel">
+ <text name="effects_color_textbox">
+ Мои Ñффекты (луч выбора):
+ </text>
+ <color_swatch name="effect_color_swatch" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° цвета"/>
+ <text name="font_colors">
+ Цвета шрифтов чата:
+ </text>
+ <text name="text_box1">
+ Я
+ </text>
+ <text name="text_box2">
+ Другие
+ </text>
+ <text name="text_box3">
+ Объекты
+ </text>
+ <text name="text_box4">
+ СиÑтема
+ </text>
+ <text name="text_box5">
+ Ошибки
+ </text>
+ <text name="text_box10">
+ ПрÑмо
+ </text>
+ <text name="text_box7">
+ Владелец
+ </text>
+ <text name="text_box9">
+ URL-адреÑа
+ </text>
+ <text name="bubble_chat">
+ Цвет фона тегов имен (также Ð´Ð»Ñ Ñ‡Ð°Ñ‚Ð° в пузырьках):
+ </text>
+ <color_swatch name="background" tool_tip="Выберите цвет Ð´Ð»Ñ Ñ‚ÐµÐ³Ð¾Ð² имен"/>
+ <slider label="ВидимоÑÑ‚ÑŒ:" name="bubble_chat_opacity" tool_tip="Задайте непрозрачноÑÑ‚ÑŒ тегов имен"/>
+ <text name="floater_opacity">
+ ÐепрозрачноÑÑ‚ÑŒ окон:
+ </text>
+ <slider label="Ðктивные:" name="active"/>
+ <slider label="Ðеактивные:" name="inactive"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_general.xml b/indra/newview/skins/default/xui/ru/panel_preferences_general.xml
new file mode 100644
index 0000000000..d1bfedf2d8
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_preferences_general.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Общие" name="general_panel">
+ <text name="language_textbox">
+ Язык:
+ </text>
+ <combo_box name="language_combobox">
+ <combo_box.item label="Язык ÑиÑтемы" name="System Default Language"/>
+ <combo_box.item label="English - ÐнглийÑкий" name="English"/>
+ <combo_box.item label="Dansk – датÑкий (бета-верÑиÑ)" name="Danish"/>
+ <combo_box.item label="Deutsch – немецкий (бета-верÑиÑ)" name="Deutsch(German)"/>
+ <combo_box.item label="Español – иÑпанÑкий (бета-верÑиÑ)" name="Spanish"/>
+ <combo_box.item label="Français – французÑкий (бета-верÑиÑ)" name="French"/>
+ <combo_box.item label="Italiano – итальÑнÑкий (бета-верÑиÑ)" name="Italian"/>
+ <combo_box.item label="Polski – польÑкий (бета-верÑиÑ)" name="Polish"/>
+ <combo_box.item label="Português – португальÑкий (бета-верÑиÑ)" name="Portugese"/>
+ <combo_box.item label="РуÑÑкий (бета-верÑиÑ)" name="Russian"/>
+ <combo_box.item label="Türkçe - турецкий (бета-верÑиÑ)" name="Turkish"/>
+ <combo_box.item label="日本語 – ÑпонÑкий (бета-верÑиÑ)" name="(Japanese)"/>
+ <combo_box.item label="китайÑкий, традиционное пиÑьмо - бета-верÑиÑ" name="Traditional Chinese"/>
+ </combo_box>
+ <text name="language_textbox2">
+ (ТребуетÑÑ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿ÑƒÑк)
+ </text>
+ <text name="maturity_desired_prompt">
+ Показывать контент:
+ </text>
+ <combo_box name="maturity_desired_combobox">
+ <combo_box.item label="Общий, умеренный, Ð´Ð»Ñ Ð²Ð·Ñ€Ð¾Ñлых" name="Desired_Adult"/>
+ <combo_box.item label="Общий и умеренный" name="Desired_Mature"/>
+ <combo_box.item label="Общий" name="Desired_PG"/>
+ </combo_box>
+ <text name="start_location_textbox">
+ МеÑто Ñтарта:
+ </text>
+ <combo_box name="start_location_combo">
+ <combo_box.item label="Мое поÑледнее меÑто" name="MyLastLocation"/>
+ <combo_box.item label="Мой дом" name="MyHome"/>
+ </combo_box>
+ <check_box initial_value="иÑтина" label="Показывать на Ñкране входа" name="show_location_checkbox"/>
+ <text name="name_tags_textbox">
+ Теги имен:
+ </text>
+ <radio_group name="Name_Tag_Preference">
+ <radio_item label="Выкл." name="radio" value="0"/>
+ <radio_item label="Вкл." name="radio2" value="1"/>
+ <radio_item label="Временный показ" name="radio3" value="2"/>
+ </radio_group>
+ <check_box label="Мое имÑ" name="show_my_name_checkbox1"/>
+ <check_box label="Имена пользователей" name="show_slids" tool_tip="Показывать Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ, например, bobsmith123"/>
+ <check_box label="Титулы групп" name="show_all_title_checkbox1" tool_tip="Показывать титулы групп, например, Officer или Member"/>
+ <check_box label="ПодÑветка друзей" name="show_friends" tool_tip="ПодÑвечивать теги имен ваших друзей"/>
+ <check_box label="Экранные имена" name="display_names_check" tool_tip="Показывать Ñкранные имена в чате, IM, тегах имен и пр."/>
+ <text name="inworld_typing_rg_label">
+ Ðажатие клавиш Ñ Ð±ÑƒÐºÐ²Ð°Ð¼Ð¸:
+ </text>
+ <radio_group name="inworld_typing_preference">
+ <radio_item label="Ðачинает локальный чат" name="radio_start_chat" value="1"/>
+ <radio_item label="Приводит к перемещению (т. е. WASD)" name="radio_move" value="0"/>
+ </radio_group>
+ <text name="title_afk_text">
+ Задержка режима «Отошел»:
+ </text>
+ <combo_box label="Задержка режима «Отошел»:" name="afk">
+ <combo_box.item label="2 мин" name="item0"/>
+ <combo_box.item label="5 мин" name="item1"/>
+ <combo_box.item label="10 мин" name="item2"/>
+ <combo_box.item label="30 мин" name="item3"/>
+ <combo_box.item label="никогда" name="item4"/>
+ </combo_box>
+ <text name="text_box3">
+ Ответ в режиме «ЗанÑт»:
+ </text>
+ <text_editor name="busy_response">
+ log_in_to_change
+ </text_editor>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/ru/panel_preferences_graphics1.xml
new file mode 100644
index 0000000000..a7e826f5fc
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_preferences_graphics1.xml
@@ -0,0 +1,114 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Графика" name="Display panel">
+ <text name="QualitySpeed">
+ КачеÑтво и ÑкороÑÑ‚ÑŒ:
+ </text>
+ <text name="FasterText">
+ БыÑтрее
+ </text>
+ <text name="BetterText">
+ КачеÑтвенней
+ </text>
+ <text name="ShadersPrefText">
+ Ðизко
+ </text>
+ <text name="ShadersPrefText2">
+ Средне
+ </text>
+ <text name="ShadersPrefText3">
+ Ð’Ñ‹Ñоко
+ </text>
+ <text name="ShadersPrefText4">
+ Ультра
+ </text>
+ <panel label="Выбор графики" name="CustomGraphics Panel">
+ <text name="ShadersText">
+ Шейдеры:
+ </text>
+ <check_box initial_value="иÑтина" label="ПрозрачноÑÑ‚ÑŒ воды" name="TransparentWater"/>
+ <check_box initial_value="иÑтина" label="РельефноÑÑ‚ÑŒ и ÑиÑние" name="BumpShiny"/>
+ <check_box initial_value="иÑтина" label="Локальный Ñвет" name="LocalLights"/>
+ <check_box initial_value="иÑтина" label="Базовые шейдеры" name="BasicShaders" tool_tip="Отключение Ñтого параметра может предотвратить завиÑание некоторых видеокарт"/>
+ <check_box initial_value="иÑтина" label="ÐтмоÑферные шейдеры" name="WindLightUseAtmosShaders"/>
+ <check_box initial_value="иÑтина" label="ОÑвещение и тени" name="UseLightShaders"/>
+ <check_box initial_value="иÑтина" label="Объемный Ñвет" name="UseSSAO"/>
+ <check_box initial_value="иÑтина" label="Глубина полÑ" name="UseDoF"/>
+ <text name="shadows_label">
+ Тени:
+ </text>
+ <combo_box name="ShadowDetail">
+ <combo_box.item label="Ðет" name="0"/>
+ <combo_box.item label="Солнце/луна" name="1"/>
+ <combo_box.item label="Солнце/луна + оÑветители" name="2"/>
+ </combo_box>
+ <text name="reflection_label">
+ Вода отражает:
+ </text>
+ <combo_box name="Reflections">
+ <combo_box.item label="Минимум" name="0"/>
+ <combo_box.item label="Ландшафт и деревьÑ" name="1"/>
+ <combo_box.item label="Ð’Ñе Ñтатичные объекты" name="2"/>
+ <combo_box.item label="Ð’Ñе аватары и объекты" name="3"/>
+ <combo_box.item label="Ð’Ñе" name="4"/>
+ </combo_box>
+ <slider label="Физика аватара:" name="AvatarPhysicsDetail"/>
+ <text name="AvatarPhysicsDetailText">
+ Ðизко
+ </text>
+ <slider label="ДальноÑÑ‚ÑŒ отриÑовки:" name="DrawDistance"/>
+ <text name="DrawDistanceMeterText2">
+ м
+ </text>
+ <slider label="МакÑ. количеÑтво чаÑтиц:" name="MaxParticleCount"/>
+ <slider label="МакÑ. количеÑтво 3D-аватаров:" name="MaxNumberAvatarDrawn"/>
+ <slider label="КачеÑтво поÑтобработки:" name="RenderPostProcess"/>
+ <text name="MeshDetailText">
+ Ð”ÐµÑ‚Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¼ÐµÑˆÐ°:
+ </text>
+ <slider label="Объекты:" name="ObjectMeshDetail"/>
+ <slider label="Гибкие примитивы:" name="FlexibleMeshDetail"/>
+ <slider label="ДеревьÑ:" name="TreeMeshDetail"/>
+ <slider label="Ðватары:" name="AvatarMeshDetail"/>
+ <slider label="Ландшафт:" name="TerrainMeshDetail"/>
+ <slider label="Ðебо:" name="SkyMeshDetail"/>
+ <text name="PostProcessText">
+ Ðизко
+ </text>
+ <text name="ObjectMeshDetailText">
+ Ðизко
+ </text>
+ <text name="FlexibleMeshDetailText">
+ Ðизко
+ </text>
+ <text name="TreeMeshDetailText">
+ Ðизко
+ </text>
+ <text name="AvatarMeshDetailText">
+ Ðизко
+ </text>
+ <text name="TerrainMeshDetailText">
+ Ðизко
+ </text>
+ <text name="SkyMeshDetailText">
+ Ðизко
+ </text>
+ <text name="AvatarRenderingText">
+ ОтриÑовка аватара:
+ </text>
+ <check_box initial_value="иÑтина" label="ПлоÑкие аватары" name="AvatarImpostors"/>
+ <check_box initial_value="иÑтина" label="ÐÐ¿Ð¿Ð°Ñ€Ð°Ñ‚Ð½Ð°Ñ Ð¾Ñ‚Ñ€Ð¸Ñовка" name="AvatarVertexProgram"/>
+ <check_box initial_value="иÑтина" label="Одежда аватара" name="AvatarCloth"/>
+ <text name="TerrainDetailText">
+ Ландшафт:
+ </text>
+ <radio_group name="TerrainDetailRadio">
+ <radio_item label="Грубо" name="0"/>
+ <radio_item label="Детально" name="2"/>
+ </radio_group>
+ --&gt;
+ </panel>
+ <button label="Применить" label_selected="Применить" name="Apply"/>
+ <button label="СброÑ" name="Defaults"/>
+ <button label="Дополнительно" name="Advanced"/>
+ <button label="Ðппаратура" label_selected="Ðппаратура" name="GraphicsHardwareButton"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_move.xml b/indra/newview/skins/default/xui/ru/panel_preferences_move.xml
new file mode 100644
index 0000000000..a6e9b00f2a
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_preferences_move.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Перемещение" name="move_panel">
+ <slider label="Угол обзора" name="camera_fov"/>
+ <slider label="РаÑÑтоÑние" name="camera_offset_scale"/>
+ <text name="heading2">
+ ÐвтоматичеÑÐºÐ°Ñ ÑƒÑтановка позиции длÑ:
+ </text>
+ <check_box label="ÑозданиÑ/редактированиÑ" name="edit_camera_movement" tool_tip="ÐвтоматичеÑкое позиционирование камеры при входе в режим Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ выходе из него"/>
+ <check_box label="внешноÑти" name="appearance_camera_movement" tool_tip="ÐвтоматичеÑкое позиционирование камеры в режиме редактированиÑ"/>
+ <text name="keyboard_lbl">
+ Клавиатура:
+ </text>
+ <check_box label="Клавиши Ñо Ñтрелками вÑегда перемещают менÑ" name="arrow_keys_move_avatar_check"/>
+ <check_box label="Бег поÑле двойного Ð½Ð°Ð¶Ð°Ñ‚Ð¸Ñ ÐºÐ»Ð°Ð²Ð¸ÑˆÐ¸" name="tap_tap_hold_to_run"/>
+ <text name="mouse_lbl">
+ Мышь:
+ </text>
+ <check_box label="Показывать Ð¼ÐµÐ½Ñ Ð¿Ñ€Ð¸ обзоре мышью" name="first_person_avatar_visible"/>
+ <text name=" Mouse Sensitivity">
+ ЧувÑтвительноÑÑ‚ÑŒ мыши:
+ </text>
+ <check_box label="Инвертировать" name="invert_mouse"/>
+ <text name="single_click_action_lbl">
+ Один щелчок на земле:
+ </text>
+ <combo_box name="single_click_action_combo">
+ <combo_box.item label="Без дейÑтвиÑ" name="0"/>
+ <combo_box.item label="Перемещение в точку щелчка" name="1"/>
+ </combo_box>
+ <text name="double_click_action_lbl">
+ Двойной щелчок на земле:
+ </text>
+ <combo_box name="double_click_action_combo">
+ <combo_box.item label="Без дейÑтвиÑ" name="0"/>
+ <combo_box.item label="Перемещение в точку щелчка" name="1"/>
+ <combo_box.item label="Ð¢ÐµÐ»ÐµÐ¿Ð¾Ñ€Ñ‚Ð°Ñ†Ð¸Ñ Ð² точку щелчка" name="2"/>
+ </combo_box>
+ <button label="Другие уÑтройÑтва" name="joystick_setup_button"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/ru/panel_preferences_privacy.xml
new file mode 100644
index 0000000000..20bb839eed
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_preferences_privacy.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="КоммуникациÑ" name="im">
+ <panel.string name="log_in_to_change">
+ войти Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ
+ </panel.string>
+ <button label="ОчиÑтить журнал" name="clear_cache" tool_tip="Удалить картинку при входе, поÑледнее меÑтоположение, журнал телепортаций, кÑш веб-документов и текÑтур"/>
+ <text name="cache_size_label_l">
+ (МеÑта, картинки, Ñтраницы, журнал поиÑка)
+ </text>
+ <check_box label="Показывать Ð¼ÐµÐ½Ñ Ð² результатах поиÑка" name="online_searchresults"/>
+ <check_box label="Только Ð´Ñ€ÑƒÐ·ÑŒÑ Ð¸ группы видÑÑ‚, когда Ñ Ð½Ð° ÑвÑзи" name="online_visibility"/>
+ <check_box label="Только Ð´Ñ€ÑƒÐ·ÑŒÑ Ð¸ группы могут звонить мне и отправлÑÑ‚ÑŒ IM" name="voice_call_friends_only_check"/>
+ <check_box label="Отключать микрофон по окончании разговора" name="auto_disengage_mic_check"/>
+ <check_box label="Показывать любимые закладки при входе (в меню «МеÑто Ñтарта»)" name="favorites_on_login_check"/>
+ <text name="Logs:">
+ Журналы чатов:
+ </text>
+ <check_box label="Хранить журналы чата на компьютере" name="log_nearby_chat"/>
+ <check_box label="Хранить журналы IM на компьютере" name="log_instant_messages"/>
+ <check_box label="Метка времени в каждой Ñтроке журнала чата" name="show_timestamps_check_im"/>
+ <check_box label="Метка времени в имени файла журнала." name="logfile_name_datestamp"/>
+ <text name="log_path_desc">
+ Папка журналов:
+ </text>
+ <button label="Обзор" label_selected="Обзор" name="log_path_button"/>
+ <button label="Черный ÑпиÑок" name="block_list"/>
+ <text name="block_list_label">
+ (Люди и (или) объекты, заблокированные вами)
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_setup.xml b/indra/newview/skins/default/xui/ru/panel_preferences_setup.xml
new file mode 100644
index 0000000000..8e7fc71f0d
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_preferences_setup.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="КонфигурациÑ" name="Input panel">
+ <text name="Network:">
+ Сеть:
+ </text>
+ <text name="Maximum bandwidth">
+ МакÑ. ширина канала
+ </text>
+ <text name="text_box2">
+ Кбит/Ñ
+ </text>
+ <check_box label="Выбор порта" name="connection_port_enabled"/>
+ <spinner label="Ðомер порта:" name="connection_port"/>
+ <text name="Web:">
+ Браузер:
+ </text>
+ <radio_group name="use_external_browser">
+ <radio_item label="ИÑпользовать мой браузер (IE, Firefox, Safari)" name="external" tool_tip="Будет иÑпользоватьÑÑ Ð±Ñ€Ð°ÑƒÐ·ÐµÑ€, заданный в ÑиÑтеме по умолчанию. Ðе рекомендуетÑÑ, еÑли [APP_NAME] работает в полноÑкранном режиме." value="true"/>
+ <radio_item label="ИÑпользовать вÑтроенный браузер" name="internal" tool_tip="Ð”Ð»Ñ Ð¿Ñ€Ð¾Ñмотра Ñправки, ÑÑылок на веб-Ñтраницы и Ñ‚. д. будет иÑпользоватьÑÑ Ð²Ñтроенный браузер. Этот браузер открываетÑÑ ÐºÐ°Ðº новое окно в [APP_NAME]." value=""/>
+ </radio_group>
+ <check_box initial_value="иÑтина" label="Разрешить плагины" name="browser_plugins_enabled"/>
+ <check_box initial_value="иÑтина" label="Принимать файлы cookie" name="cookies_enabled"/>
+ <check_box initial_value="иÑтина" label="Разрешить Javascript" name="browser_javascript_enabled"/>
+ <check_box initial_value="ложь" label="Разрешить вÑплывающие окна" name="media_popup_enabled"/>
+ <text name="Software updates:">
+ ÐžÐ±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÐŸÐž:
+ </text>
+ <combo_box name="updater_service_combobox">
+ <combo_box.item label="УÑтанавливать автоматичеÑки" name="Install_automatically"/>
+ <combo_box.item label="Загружать и уÑтанавливать Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð²Ñ€ÑƒÑ‡Ð½ÑƒÑŽ" name="Install_manual"/>
+ </combo_box>
+ <text name="Proxy Settings:">
+ ÐаÑтройки прокÑи-Ñервера:
+ </text>
+ <button label="Задать наÑтройки" label_selected="Обзор" name="set_proxy"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_sound.xml b/indra/newview/skins/default/xui/ru/panel_preferences_sound.xml
new file mode 100644
index 0000000000..bf673750d2
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_preferences_sound.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Звуки" name="Preference Media panel">
+ <panel.string name="middle_mouse">
+ Ñреднюю кнопку мыши
+ </panel.string>
+ <slider label="ÐžÐ±Ñ‰Ð°Ñ Ð³Ñ€Ð¾Ð¼ÐºÐ¾ÑÑ‚ÑŒ" name="System Volume"/>
+ <check_box initial_value="иÑтина" name="mute_when_minimized"/>
+ <text name="mute_chb_label">
+ Заглушать, когда Ñвернуто
+ </text>
+ <slider label="Кнопки" name="UI Volume"/>
+ <slider label="Окружение" name="Wind Volume"/>
+ <slider label="Звуковые Ñффекты" name="SFX Volume"/>
+ <slider label="ÐŸÐ¾Ñ‚Ð¾ÐºÐ¾Ð²Ð°Ñ Ð¼ÑƒÐ·Ñ‹ÐºÐ°" name="Music Volume"/>
+ <check_box label="Включено" name="enable_music"/>
+ <slider label="Медиа" name="Media Volume"/>
+ <check_box label="Включено" name="enable_media"/>
+ <slider label="ГолоÑовой чат" name="Voice Volume"/>
+ <check_box label="Включено" name="enable_voice_check"/>
+ <check_box label="Разрешить автовоÑпроизведение медиа" name="media_auto_play_btn" tool_tip="УÑтановка флажка позволит вам автоматичеÑки воÑпроизводить медиа" value="иÑтина"/>
+ <check_box label="ВоÑпроизводить медиа, приÑоединенные к другому аватару" name="media_show_on_others_btn" tool_tip="СнÑтие флажка Ñкроет медиа, приÑоединенные к другому аватару" value="иÑтина"/>
+ <check_box label="Сопровождать жеÑÑ‚Ñ‹ звуками" name="gesture_audio_play_btn" tool_tip="УÑтановите флажок, чтобы Ñлышать звуки при жеÑтах" value="иÑтина"/>
+ <text name="voice_chat_settings">
+ ÐаÑтройки голоÑового чата
+ </text>
+ <text name="Listen from">
+ Слушать Ñ:
+ </text>
+ <radio_group name="ear_location">
+ <radio_item label="Камеры" name="0"/>
+ <radio_item label="Ðватара" name="1"/>
+ </radio_group>
+ <check_box label="Губы аватара двигаютÑÑ Ð¿Ñ€Ð¸ разговоре" name="enable_lip_sync"/>
+ <check_box label="Включать/выключать микрофон, когда Ñ Ð½Ð°Ð¶Ð¸Ð¼Ð°ÑŽ:" name="push_to_talk_toggle_check" tool_tip="Ð’ режиме Ð¿ÐµÑ€ÐµÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ ÐžÐ”ÐОКРÐТÐОЕ нажатие и отпуÑкание данной клавиши включает/выключает микрофон. ЕÑли режим Ð¿ÐµÑ€ÐµÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½, то микрофон передает голоÑ, только когда клавиша нажата."/>
+ <line_editor label="Триггер Push-to-Speak" name="modifier_combo"/>
+ <button label="Задать клавишу" name="set_voice_hotkey_button"/>
+ <button name="set_voice_middlemouse_button" tool_tip="Ð¡Ð±Ñ€Ð¾Ñ Ð½Ð° Ñреднюю кнопку мыши"/>
+ <button label="УÑтройÑтва ввода-вывода" name="device_settings_btn"/>
+ <panel label="ÐаÑтройки уÑтройÑтва" name="device_settings_panel"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/ru/panel_prim_media_controls.xml
new file mode 100644
index 0000000000..76bb6518e9
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_prim_media_controls.xml
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="MediaControls">
+ <string name="control_background_image_name">
+ Inspector_Background
+ </string>
+ <string name="skip_step">
+ 0.2
+ </string>
+ <string name="min_width">
+ 300
+ </string>
+ <string name="min_height">
+ 75
+ </string>
+ <string name="zoom_near_padding">
+ 1.0
+ </string>
+ <string name="zoom_medium_padding">
+ 1.1
+ </string>
+ <string name="zoom_far_padding">
+ 1.5
+ </string>
+ <string name="top_world_view_avoid_zone">
+ 50
+ </string>
+ <layout_stack name="progress_indicator_area">
+ <layout_panel name="media_progress_indicator">
+ <progress_bar name="media_progress_bar" tool_tip="Медиа загружаетÑÑ"/>
+ </layout_panel>
+ </layout_stack>
+ <layout_stack name="media_controls">
+ <layout_panel name="back">
+ <button name="back_btn" tool_tip="Ðазад"/>
+ </layout_panel>
+ <layout_panel name="fwd">
+ <button name="fwd_btn" tool_tip="Вперед"/>
+ </layout_panel>
+ <layout_panel name="home">
+ <button name="home_btn" tool_tip="ДомашнÑÑ Ñтраница"/>
+ </layout_panel>
+ <layout_panel name="media_stop">
+ <button name="media_stop_btn" tool_tip="ОÑтановить медиа"/>
+ </layout_panel>
+ <layout_panel name="reload">
+ <button name="reload_btn" tool_tip="Обновить"/>
+ </layout_panel>
+ <layout_panel name="stop">
+ <button name="stop_btn" tool_tip="ОÑтановить загрузку"/>
+ </layout_panel>
+ <layout_panel name="play">
+ <button name="play_btn" tool_tip="Проиграть медиа"/>
+ </layout_panel>
+ <layout_panel name="pause">
+ <button name="pause_btn" tool_tip="ПоÑтавить на паузу"/>
+ </layout_panel>
+ <layout_panel name="media_address">
+ <line_editor name="media_address_url" tool_tip="СÑылка на медиа"/>
+ <layout_stack name="media_address_url_icons">
+ <layout_panel>
+ <icon name="media_whitelist_flag" tool_tip="Включен белый ÑпиÑок"/>
+ </layout_panel>
+ <layout_panel>
+ <icon name="media_secure_lock_flag" tool_tip="БезопаÑный проÑмотр"/>
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+ <layout_panel name="media_play_position">
+ <slider_bar initial_value="0.5" name="media_play_slider" tool_tip="Выполнение проÑмотра видео"/>
+ </layout_panel>
+ <layout_panel name="skip_back">
+ <button name="skip_back_btn" tool_tip="Шаг назад"/>
+ </layout_panel>
+ <layout_panel name="skip_forward">
+ <button name="skip_forward_btn" tool_tip="Шаг вперед"/>
+ </layout_panel>
+ <layout_panel name="media_volume">
+ <button name="media_mute_button" tool_tip="Приглушить медиа"/>
+ <slider name="volume_slider" tool_tip="ГромкоÑÑ‚ÑŒ медиа"/>
+ </layout_panel>
+ <layout_panel name="zoom_frame">
+ <button name="zoom_frame_btn" tool_tip="Приблизить к медиа"/>
+ </layout_panel>
+ <layout_panel name="close">
+ <button name="close_btn" tool_tip="Отодвинуть назад"/>
+ </layout_panel>
+ <layout_panel name="new_window">
+ <button name="new_window_btn" tool_tip="Открыть ÑÑылку в браузере"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_region_covenant.xml b/indra/newview/skins/default/xui/ru/panel_region_covenant.xml
new file mode 100644
index 0000000000..706a38f110
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_region_covenant.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Соглашение" name="Covenant">
+ <panel.string name="can_resell">
+ ÐŸÑ€Ð¸Ð¾Ð±Ñ€ÐµÑ‚ÐµÐ½Ð½Ð°Ñ Ð² Ñтом регионе Ð·ÐµÐ¼Ð»Ñ Ð¼Ð¾Ð¶ÐµÑ‚ быть перепродана.
+ </panel.string>
+ <panel.string name="can_not_resell">
+ ÐŸÑ€Ð¸Ð¾Ð±Ñ€ÐµÑ‚ÐµÐ½Ð½Ð°Ñ Ð² Ñтом регионе Ð·ÐµÐ¼Ð»Ñ Ð½Ðµ может быть перепродана.
+ </panel.string>
+ <panel.string name="can_change">
+ ÐŸÑ€Ð¸Ð¾Ð±Ñ€ÐµÑ‚ÐµÐ½Ð½Ð°Ñ Ð² Ñтом регионе Ð·ÐµÐ¼Ð»Ñ Ð¼Ð¾Ð¶ÐµÑ‚ быть объединена или разделена.
+ </panel.string>
+ <panel.string name="can_not_change">
+ ÐŸÑ€Ð¸Ð¾Ð±Ñ€ÐµÑ‚ÐµÐ½Ð½Ð°Ñ Ð² Ñтом регионе Ð·ÐµÐ¼Ð»Ñ Ð½Ðµ может быть объединена или разделена.
+ </panel.string>
+ <text name="estate_section_lbl">
+ Землевладение
+ </text>
+ <text name="estate_name_lbl">
+ Ðазвание:
+ </text>
+ <text name="estate_name_text">
+ материк
+ </text>
+ <text name="estate_owner_lbl">
+ Владелец:
+ </text>
+ <text name="estate_owner_text">
+ (нет)
+ </text>
+ <text name="estate_cov_lbl">
+ Соглашение:
+ </text>
+ <text name="covenant_timestamp_text">
+ ПоÑледнее изменение: 31 Ð´ÐµÐºÐ°Ð±Ñ€Ñ 1969 г., Ñреда, 16:00:00
+ </text>
+ <text_editor name="covenant_editor">
+ Ðет ÑÐ¾Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñтого землевладениÑ.
+ </text_editor>
+ <button label="СброÑ" name="reset_covenant"/>
+ <text name="covenant_help_text">
+ Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² Ñоглашении будут показаны на вÑех учаÑтках Ñтого землевладениÑ.
+ </text>
+ <text name="covenant_instructions">
+ Перетащите Ñюда заметку, чтобы изменить Ñоглашение Ð´Ð»Ñ Ñтого землевладениÑ.
+ </text>
+ <text name="region_section_lbl">
+ Регион
+ </text>
+ <text name="region_name_lbl">
+ Ðазвание:
+ </text>
+ <text name="region_name_text">
+ Эрика
+ </text>
+ <text name="region_landtype_lbl">
+ Тип:
+ </text>
+ <text name="region_landtype_text">
+ Материк/помеÑтье
+ </text>
+ <text name="region_maturity_lbl">
+ Рейтинг:
+ </text>
+ <text name="region_maturity_text">
+ Ð”Ð»Ñ Ð²Ð·Ñ€Ð¾Ñлых
+ </text>
+ <text name="resellable_lbl">
+ Перепродажа:
+ </text>
+ <text name="resellable_clause">
+ Ð—ÐµÐ¼Ð»Ñ Ð² Ñтом регионе не может быть перепродана.
+ </text>
+ <text name="changeable_lbl">
+ Разделение:
+ </text>
+ <text name="changeable_clause">
+ Ð—ÐµÐ¼Ð»Ñ Ð² Ñтом регионе не может быть объединена или разделена.
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_region_debug.xml b/indra/newview/skins/default/xui/ru/panel_region_debug.xml
new file mode 100644
index 0000000000..c21d2d7051
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_region_debug.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Отладка" name="Debug">
+ <text name="region_text_lbl">
+ Регион:
+ </text>
+ <text name="region_text">
+ неизвеÑтно
+ </text>
+ <check_box label="Отключить Ñкрипты" name="disable_scripts_check" tool_tip="Отключить вÑе Ñкрипты в Ñтом регионе"/>
+ <check_box label="Отключить ÑтолкновениÑ" name="disable_collisions_check" tool_tip="Отключить ÑÑ‚Ð¾Ð»ÐºÐ½Ð¾Ð²ÐµÐ½Ð¸Ñ Ð½Ðµ-аватаров в Ñтом регионе"/>
+ <check_box label="Отключить физику" name="disable_physics_check" tool_tip="Выключить вÑÑŽ физику в Ñтом регионе"/>
+ <button label="Применить" name="apply_btn"/>
+ <text name="objret_text_lbl">
+ Возврат объектов
+ </text>
+ <text name="resident_text_lbl">
+ Житель:
+ </text>
+ <line_editor name="target_avatar_name">
+ (нет)
+ </line_editor>
+ <button label="Выбор" name="choose_avatar_btn"/>
+ <text name="options_text_lbl">
+ Параметры:
+ </text>
+ <check_box label="Со Ñкриптами" name="return_scripts" tool_tip="ВозвращаютÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ объекты Ñо Ñкриптами"/>
+ <check_box label="Ðа чужой земле" name="return_other_land" tool_tip="ВозвращаютÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ объекты, раÑположенные на чужой земле"/>
+ <check_box label="С каждого региона Ñтого землевладениÑ" name="return_estate_wide" tool_tip="ВозвращаютÑÑ Ð¾Ð±ÑŠÐµÐºÑ‚Ñ‹ Ñо вÑех регионов, образующих Ñто землевладение"/>
+ <button label="Возврат" name="return_btn"/>
+ <button label="Самые активные учаÑтники Ñтолкновений..." name="top_colliders_btn" tool_tip="СпиÑок объектов, Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… ÑÑ‚Ð¾Ð»ÐºÐ½Ð¾Ð²ÐµÐ½Ð¸Ñ Ð½Ð°Ð¸Ð±Ð¾Ð»ÐµÐµ вероÑтны"/>
+ <button label="СпиÑок лучших Ñкриптов..." name="top_scripts_btn" tool_tip="Объекты, в которых Ñкрипты выполнÑÑŽÑ‚ÑÑ Ð´Ð¾Ð»ÑŒÑˆÐµ вÑего"/>
+ <button label="Перезагрузить регион" name="restart_btn" tool_tip="ОтÑчитать 2 минуты и перезагрузить регион"/>
+ <button label="Отложить перезагрузку" name="cancel_restart_btn" tool_tip="Отложить перезагрузку региона на чаÑ"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_region_environment.xml b/indra/newview/skins/default/xui/ru/panel_region_environment.xml
new file mode 100644
index 0000000000..85be8f63bd
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_region_environment.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Среда" name="panel_env_info">
+ <text name="water_settings_title">
+ ÐаÑтройки воды и неба/Ñуточного цикла определÑÑŽÑ‚, каким поÑетители увидÑÑ‚ ваш регион. Дополнительно
+ </text>
+ <radio_group name="region_settings_radio_group">
+ <radio_item label="ИÑпользовать наÑтройки Second Life по умолчанию" name="use_sl_default_settings"/>
+ <radio_item label="ИÑпользовать Ñледующие наÑтройки" name="use_my_settings"/>
+ </radio_group>
+ <panel name="user_environment_settings">
+ <text name="water_settings_title">
+ ÐаÑтройка воды
+ </text>
+ <combo_box name="water_settings_preset_combo">
+ <combo_box.item label="-Выбор наÑтройки-" name="item0"/>
+ </combo_box>
+ <text name="sky_dayc_settings_title">
+ Ðебо/Ñуточный цикл
+ </text>
+ <radio_group name="sky_dayc_settings_radio_group">
+ <radio_item label="Ðебо не менÑетÑÑ" name="my_sky_settings"/>
+ <radio_item label="Суточный цикл" name="my_dayc_settings"/>
+ </radio_group>
+ <combo_box name="sky_settings_preset_combo">
+ <combo_box.item label="-Выбор наÑтройки-" name="item0"/>
+ </combo_box>
+ <combo_box name="dayc_settings_preset_combo">
+ <combo_box.item label="-Выбор наÑтройки-" name="item0"/>
+ </combo_box>
+ </panel>
+ <button label="Применить" name="apply_btn"/>
+ <button label="Отмена" name="cancel_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_region_estate.xml b/indra/newview/skins/default/xui/ru/panel_region_estate.xml
new file mode 100644
index 0000000000..93b21704bc
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_region_estate.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Землевладение" name="Estate">
+ <text name="estate_help_text">
+ Изменение параметров на Ñтой вкладке повлиÑет на вÑе регионы Ñтого землевладениÑ.
+ </text>
+ <text name="estate_text">
+ Землевладение:
+ </text>
+ <text name="estate_name">
+ (неизвеÑтно)
+ </text>
+ <text name="owner_text">
+ Землевладелец:
+ </text>
+ <text name="estate_owner">
+ (неизвеÑтно)
+ </text>
+ <check_box label="Глобальное времÑ" name="use_global_time_check"/>
+ <check_box label="ФикÑированное" name="fixed_sun_check"/>
+ <slider label="Фаза" name="sun_hour_slider"/>
+ <check_box label="Разрешить общий доÑтуп" name="externally_visible_check"/>
+ <text name="Only Allow">
+ Разрешить доÑтуп только таким жителÑм:
+ </text>
+ <check_box label="ЗарегиÑтрирована Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ð± оплате" name="limit_payment" tool_tip="Ð”Ð»Ñ Ð´Ð¾Ñтупа к Ñтому землевладению у Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° быть зарегиÑтрирована Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ð± оплате. Более Ð¿Ð¾Ð´Ñ€Ð¾Ð±Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð½Ð°Ñ…Ð¾Ð´Ð¸Ñ‚ÑÑ Ð·Ð´ÐµÑÑŒ: [SUPPORT_SITE]."/>
+ <check_box label="Подтвержден возраÑÑ‚" name="limit_age_verified" tool_tip="Ð”Ð»Ñ Ð´Ð¾Ñтупа к Ñтому землевладению житель должен подтвердить Ñвой возраÑÑ‚. Более Ð¿Ð¾Ð´Ñ€Ð¾Ð±Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð½Ð°Ñ…Ð¾Ð´Ð¸Ñ‚ÑÑ Ð·Ð´ÐµÑÑŒ: [SUPPORT_SITE]."/>
+ <check_box label="Разрешить голоÑовое общение" name="voice_chat_check"/>
+ <check_box label="Разрешить прÑмой телепорт" name="allow_direct_teleport"/>
+ <button label="Применить" name="apply_btn"/>
+ <button label="Сообщение в землевладение..." name="message_estate_btn"/>
+ <button label="Выкинуть Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ñ Ð·ÐµÐ¼Ð»ÐµÐ²Ð»Ð°Ð´ÐµÐ½Ð¸Ñ..." name="kick_user_from_estate_btn"/>
+ <text name="estate_manager_label">
+ Менеджеры землевладениÑ:
+ </text>
+ <button label="Удалить..." name="remove_estate_manager_btn"/>
+ <button label="Добавить..." name="add_estate_manager_btn"/>
+ <text name="allow_resident_label">
+ Допущенные жители:
+ </text>
+ <button label="Удалить..." name="remove_allowed_avatar_btn"/>
+ <button label="Добавить..." name="add_allowed_avatar_btn"/>
+ <text name="allow_group_label">
+ Допущенные группы:
+ </text>
+ <button label="Удалить..." name="remove_allowed_group_btn"/>
+ <button label="Добавить..." name="add_allowed_group_btn"/>
+ <text name="ban_resident_label">
+ Забаненные жители:
+ </text>
+ <button label="Удалить..." name="remove_banned_avatar_btn"/>
+ <button label="Добавить..." name="add_banned_avatar_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_region_general.xml b/indra/newview/skins/default/xui/ru/panel_region_general.xml
new file mode 100644
index 0000000000..8559be6c9e
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_region_general.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Регион" name="General">
+ <text name="region_text_lbl">
+ Регион:
+ </text>
+ <text name="region_text">
+ неизвеÑтно
+ </text>
+ <text name="version_channel_text_lbl">
+ ВерÑиÑ:
+ </text>
+ <text name="version_channel_text">
+ неизвеÑтно
+ </text>
+ <text name="region_type_lbl">
+ Тип:
+ </text>
+ <text name="region_type">
+ неизвеÑтно
+ </text>
+ <check_box label="Запретить терраформирование" name="block_terraform_check"/>
+ <check_box label="Запретить полеты" name="block_fly_check"/>
+ <check_box label="Разрешить повреждениÑ" name="allow_damage_check"/>
+ <check_box label="Запретить толкание" name="restrict_pushobject"/>
+ <check_box label="Разрешить перепродажу земли" name="allow_land_resell_check"/>
+ <check_box label="Разрешить объединение/разделение земли" name="allow_parcel_changes_check"/>
+ <check_box label="Ðе показывать землю в поиÑке" name="block_parcel_search_check" tool_tip="Отображать регион и его учаÑтки в результатах поиÑка"/>
+ <check_box label="Разрешить меши-объекты" name="mesh_rez_enabled_check" tool_tip="Разрешить жителÑм выкладывать меши в Ñтом регионе"/>
+ <spinner label="Лимит агентов" name="agent_limit_spin"/>
+ <spinner label="Льгота Ð´Ð»Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð°" name="object_bonus_spin"/>
+ <text label="ДозволенноÑÑ‚ÑŒ" name="access_text">
+ КатегориÑ:
+ </text>
+ <icons_combo_box label="Умеренный" name="access_combo">
+ <icons_combo_box.item label="Ð”Ð»Ñ Ð²Ð·Ñ€Ð¾Ñлых" name="Adult" value="42"/>
+ <icons_combo_box.item label="Умеренный" name="Mature" value="21"/>
+ <icons_combo_box.item label="Общий" name="PG" value="13"/>
+ </icons_combo_box>
+ <button label="Применить" name="apply_btn"/>
+ <button label="Телепортировать домой одного жителÑ..." name="kick_btn"/>
+ <button label="Телепортировать домой вÑех жителей..." name="kick_all_btn"/>
+ <button label="Отправить Ñообщение в регион..." name="im_btn"/>
+ <button label="Управление телехабом..." name="manage_telehub_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_region_terrain.xml b/indra/newview/skins/default/xui/ru/panel_region_terrain.xml
new file mode 100644
index 0000000000..af25565226
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_region_terrain.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Ландшафт" name="Terrain">
+ <text name="region_text_lbl">
+ Регион:
+ </text>
+ <text name="region_text">
+ неизвеÑтен
+ </text>
+ <spinner label="Уровень воды" name="water_height_spin"/>
+ <spinner label="Верх. точка ландшафта" name="terrain_raise_spin"/>
+ <spinner label="Ðиж. точка ландшафта" name="terrain_lower_spin"/>
+ <text name="detail_texture_text">
+ ТекÑтуры ландшафта (требованиÑ: 512x512, 24-битные, TGA)
+ </text>
+ <text name="height_text_lbl">
+ 1 (Ðиз)
+ </text>
+ <text name="height_text_lbl2">
+ 2
+ </text>
+ <text name="height_text_lbl3">
+ 3
+ </text>
+ <text name="height_text_lbl4">
+ 4 (Верх)
+ </text>
+ <text name="height_text_lbl5">
+ Диапазон выÑот текÑтур
+ </text>
+ <text name="height_text_lbl10">
+ Эти Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÑÑŽÑ‚ Ñтепень ÑÐ¼ÐµÑˆÐ¸Ð²Ð°Ð½Ð¸Ñ Ð½Ð°Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ñ… текÑтур.
+ </text>
+ <text name="height_text_lbl11">
+ ИзмерÑÑŽÑ‚ÑÑ Ð² метрах. Значение «Ðиз» – Ñто ÐœÐКСИМÐЛЬÐÐЯ выÑота текÑтуры â„–1, а значение «Верх» – Ñто МИÐИМÐЛЬÐÐЯ выÑота текÑтуры â„–4.
+ </text>
+ <text name="height_text_lbl6">
+ Северо-запад
+ </text>
+ <text name="height_text_lbl7">
+ Северо-воÑток
+ </text>
+ <spinner label="Ðиз" name="height_start_spin_1"/>
+ <spinner label="Ðиз" name="height_start_spin_3"/>
+ <spinner label="Верх" name="height_range_spin_1"/>
+ <spinner label="Верх" name="height_range_spin_3"/>
+ <text name="height_text_lbl8">
+ Юго-запад
+ </text>
+ <text name="height_text_lbl9">
+ Юго-воÑток
+ </text>
+ <spinner label="Ðиз" name="height_start_spin_0"/>
+ <spinner label="Ðиз" name="height_start_spin_2"/>
+ <spinner label="Верх" name="height_range_spin_0"/>
+ <spinner label="Верх" name="height_range_spin_2"/>
+ <button label="Загрузить ландшафт RAW..." name="download_raw_btn" tool_tip="ДоÑтупно только землевладельцам, не менеджерам"/>
+ <button label="Передать ландшафт RAW..." name="upload_raw_btn" tool_tip="ДоÑтупно только землевладельцам, не менеджерам"/>
+ <button label="ЗафикÑировать пределы" name="bake_terrain_btn" tool_tip="УÑтановить выÑоту ландшафта по Ñредней точке между верхней и нижней точками"/>
+ <button label="Применить" name="apply_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_region_texture.xml b/indra/newview/skins/default/xui/ru/panel_region_texture.xml
new file mode 100644
index 0000000000..c4b35a536d
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_region_texture.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="ТекÑтуры земли" name="Textures">
+ <text name="region_text_lbl">
+ Регион:
+ </text>
+ <text name="region_text">
+ неизвеÑтен
+ </text>
+ <text name="detail_texture_text">
+ ТекÑтуры ландшафта (требованиÑ: 512x512, 24-битные TGA-файлы)
+ </text>
+ <text name="height_text_lbl">
+ 1 (низ)
+ </text>
+ <text name="height_text_lbl2">
+ 2
+ </text>
+ <text name="height_text_lbl3">
+ 3
+ </text>
+ <text name="height_text_lbl4">
+ 4 (верх)
+ </text>
+ <text name="height_text_lbl5">
+ Диапазон выÑот текÑтур
+ </text>
+ <text name="height_text_lbl6">
+ Северо-запад
+ </text>
+ <text name="height_text_lbl7">
+ Северо-воÑток
+ </text>
+ <spinner label="Ðиз" name="height_start_spin_1"/>
+ <spinner label="Ðиз" name="height_start_spin_3"/>
+ <spinner label="Верх" name="height_range_spin_1"/>
+ <spinner label="Верх" name="height_range_spin_3"/>
+ <text name="height_text_lbl8">
+ Юго-запад
+ </text>
+ <text name="height_text_lbl9">
+ Юго-воÑток
+ </text>
+ <spinner label="Ðиз" name="height_start_spin_0"/>
+ <spinner label="Ðиз" name="height_start_spin_2"/>
+ <spinner label="Верх" name="height_range_spin_0"/>
+ <spinner label="Верх" name="height_range_spin_2"/>
+ <text name="height_text_lbl10">
+ Эти Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶Ð°ÑŽÑ‚ диапазон Ð¿ÐµÑ€ÐµÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð²Ñ‹ÑˆÐµÑƒÐºÐ°Ð·Ð°Ð½Ð½Ñ‹Ñ… текÑтур.
+ </text>
+ <text name="height_text_lbl11">
+ ИзмерÑетÑÑ Ð² метрах, значение «Ðиз» – Ñто ÐœÐКСИМÐЛЬÐÐЯ выÑота текÑтуры â„–1, значение «Верх» – Ñто МИÐИМÐЛЬÐÐЯ выÑота текÑтуры â„–4.
+ </text>
+ <button label="Применить" name="apply_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_script_ed.xml b/indra/newview/skins/default/xui/ru/panel_script_ed.xml
new file mode 100644
index 0000000000..05ccaeb54b
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_script_ed.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="script panel">
+ <panel.string name="loading">
+ Загрузка...
+ </panel.string>
+ <panel.string name="can_not_view">
+ Ð’Ñ‹ не можете проÑматривать и изменÑÑ‚ÑŒ Ñтот Ñкрипт, поÑкольку Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ выбрана ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ Â«Ð½Ðµ копируемые». Ð”Ð»Ñ Ð¿Ñ€Ð¾Ñмотра или Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñкрипта в объекте нужны полные права доÑтупа.
+ </panel.string>
+ <panel.string name="public_objects_can_not_run">
+ ОбщедоÑтупные объекты не могут запуÑкать Ñкрипты
+ </panel.string>
+ <panel.string name="script_running">
+ ВыполнÑетÑÑ
+ </panel.string>
+ <panel.string name="Title">
+ Скрипт: [NAME]
+ </panel.string>
+ <panel.string name="external_editor_not_set">
+ Выберите редактор, задав переменную Ñреды LL_SCRIPT_EDITOR или параметр ExternalEditor.
+ </panel.string>
+ <menu_bar name="script_menu">
+ <menu label="Файл" name="File">
+ <menu_item_call label="Сохранить" name="Save"/>
+ <menu_item_call label="Отменить вÑе изменениÑ" name="Revert All Changes"/>
+ <menu_item_call label="Загрузить из файла..." name="LoadFromFile"/>
+ <menu_item_call label="Сохранить в файл..." name="SaveToFile"/>
+ </menu>
+ <menu label="Изменить" name="Edit">
+ <menu_item_call label="Отменить" name="Undo"/>
+ <menu_item_call label="Вернуть" name="Redo"/>
+ <menu_item_call label="Вырезать" name="Cut"/>
+ <menu_item_call label="Копировать" name="Copy"/>
+ <menu_item_call label="Ð’Ñтавить" name="Paste"/>
+ <menu_item_call label="Выделить вÑе" name="Select All"/>
+ <menu_item_call label="СнÑÑ‚ÑŒ выделение" name="Deselect"/>
+ <menu_item_call label="ПоиÑк и замена..." name="Search / Replace..."/>
+ </menu>
+ <menu label="Справка" name="Help">
+ <menu_item_call label="Справка..." name="Help..."/>
+ <menu_item_call label="Справка по ключевым Ñловам..." name="Keyword Help..."/>
+ </menu>
+ </menu_bar>
+ <text_editor name="Script Editor">
+ Загрузка...
+ </text_editor>
+ <combo_box label="Ð’Ñтавить..." name="Insert..."/>
+ <button label="Сохранить" label_selected="Сохранить" name="Save_btn"/>
+ <button label="Изменить..." name="Edit_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_script_limits_my_avatar.xml b/indra/newview/skins/default/xui/ru/panel_script_limits_my_avatar.xml
new file mode 100644
index 0000000000..a06c465a2b
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_script_limits_my_avatar.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="МОЙ ÐÐ’ÐТÐР" name="script_limits_my_avatar_panel">
+ <text name="script_memory">
+ ПамÑÑ‚ÑŒ под Ñкрипты аватара
+ </text>
+ <text name="loading_text">
+ Загрузка...
+ </text>
+ <scroll_list name="scripts_list">
+ <scroll_list.columns label="Размер (КБ)" name="size"/>
+ <scroll_list.columns label="URL-адреÑа" name="urls"/>
+ <scroll_list.columns label="Ðазвание объекта" name="name"/>
+ <scroll_list.columns label="МеÑто" name="location"/>
+ </scroll_list>
+ <button label="Обновить ÑпиÑок" name="refresh_list_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_script_limits_region_memory.xml b/indra/newview/skins/default/xui/ru/panel_script_limits_region_memory.xml
new file mode 100644
index 0000000000..189e21fd2f
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_script_limits_region_memory.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="ПÐМЯТЬ РЕГИОÐÐ" name="script_limits_region_memory_panel">
+ <text name="script_memory">
+ ПамÑÑ‚ÑŒ под Ñкрипты на учаÑтке
+ </text>
+ <text name="loading_text">
+ Загрузка...
+ </text>
+ <scroll_list name="scripts_list">
+ <scroll_list.columns label="Размер (Кб)" name="size"/>
+ <scroll_list.columns label="URL-адреÑа" name="urls"/>
+ <scroll_list.columns label="Ðазвание объекта" name="name"/>
+ <scroll_list.columns label="Владелец объекта" name="owner"/>
+ <scroll_list.columns label="УчаÑток" name="parcel"/>
+ <scroll_list.columns label="МеÑто" name="location"/>
+ </scroll_list>
+ <button label="Обновить ÑпиÑок" name="refresh_list_btn"/>
+ <button label="ПодÑветить" name="highlight_btn"/>
+ <button label="Возврат" name="return_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_scrolling_param.xml b/indra/newview/skins/default/xui/ru/panel_scrolling_param.xml
new file mode 100644
index 0000000000..c25f92cb8d
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_scrolling_param.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="LLScrollingPanelParam">
+ <text name="Loading...">
+ Загрузка...
+ </text>
+ <text name="Loading...2">
+ Загрузка...
+ </text>
+ <slider label="[DESC]" name="param slider"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_scrolling_param_base.xml b/indra/newview/skins/default/xui/ru/panel_scrolling_param_base.xml
new file mode 100644
index 0000000000..fa659040ea
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_scrolling_param_base.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="LLScrollingPanelParamBase">
+ <slider label="[DESC]" name="param slider"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_side_tray.xml b/indra/newview/skins/default/xui/ru/panel_side_tray.xml
new file mode 100644
index 0000000000..10c5775291
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_side_tray.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Side tray cannot show background because it is always
+ partially on screen to hold tab buttons. -->
+<side_tray name="sidebar">
+ <sidetray_tab description="Открыть/закрыть боковую панель" name="sidebar_openclose" tab_title="Открыть/закрыть боковую панель"/>
+ <sidetray_tab description="Дом." name="sidebar_home" tab_title="Дом">
+ <panel label="дом" name="panel_home"/>
+ </sidetray_tab>
+ <sidetray_tab description="Изменение Ñвоего Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ Ð¸ подборки." name="sidebar_me" tab_title="Мой профиль">
+ <panel_container name="panel_container">
+ <panel label="Я" name="panel_me"/>
+ </panel_container>
+ </sidetray_tab>
+ <sidetray_tab description="ПоиÑк друзей, контактов и находÑщихÑÑ Ð¿Ð¾Ð±Ð»Ð¸Ð·Ð¾Ñти людей." name="sidebar_people" tab_title="Люди">
+ <panel_container name="panel_container">
+ <panel label="Профиль группы" name="panel_group_info_sidetray"/>
+ <panel label="Черный ÑпиÑок жителей и объектов" name="panel_block_list_sidetray"/>
+ </panel_container>
+ </sidetray_tab>
+ <sidetray_tab description="ПоиÑк меÑÑ‚, которые можно было бы поÑетить или которые вы уже поÑещали ранее." label="МеÑта" name="sidebar_places" tab_title="МеÑта">
+ <panel label="МеÑта" name="panel_places"/>
+ </sidetray_tab>
+ <sidetray_tab description="ПроÑмотрите Ñвой инвентарь." name="sidebar_inventory" tab_title="Мой инвентарь">
+ <panel label="Изменить инвентарь" name="sidepanel_inventory"/>
+ </sidetray_tab>
+ <sidetray_tab description="Изменение внешнего вида и текущего образа." name="sidebar_appearance" tab_title="Мой внешний вид">
+ <panel label="Изменить внешний вид" name="sidepanel_appearance"/>
+ </sidetray_tab>
+</side_tray>
diff --git a/indra/newview/skins/default/xui/ru/panel_side_tray_tab_caption.xml b/indra/newview/skins/default/xui/ru/panel_side_tray_tab_caption.xml
new file mode 100644
index 0000000000..1a260dc31f
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_side_tray_tab_caption.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="sidetray_tab_panel">
+ <text name="sidetray_tab_title" value="Ð‘Ð¾ÐºÐ¾Ð²Ð°Ñ Ð¿Ð°Ð½ÐµÐ»ÑŒ"/>
+ <button name="undock" tool_tip="ОтÑоединить"/>
+ <button name="dock" tool_tip="ПриÑоединить"/>
+ <button name="show_help" tool_tip="Показать Ñправку"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/ru/panel_snapshot_inventory.xml
new file mode 100644
index 0000000000..53a150c9f9
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_snapshot_inventory.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_inventory">
+ <text name="title">
+ Сохранить в моем инвентаре
+ </text>
+ <text name="hint_lbl">
+ Сохранение Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð² инвентаре Ñтоит L$[UPLOAD_COST]. Чтобы Ñохранить его как текÑтуру, выберите один из квадратных форматов.
+ </text>
+ <combo_box label="Размер" name="texture_size_combo">
+ <combo_box.item label="Текущее окно" name="CurrentWindow"/>
+ <combo_box.item label="Маленький (128x128)" name="Small(128x128)"/>
+ <combo_box.item label="Средний (256x256)" name="Medium(256x256)"/>
+ <combo_box.item label="Большой (512x512)" name="Large(512x512)"/>
+ <combo_box.item label="Задать" name="Custom"/>
+ </combo_box>
+ <spinner label="Ширина" name="inventory_snapshot_width"/>
+ <spinner label="Ð’Ñ‹Ñота" name="inventory_snapshot_height"/>
+ <check_box label="СохранÑÑ‚ÑŒ пропорции" name="inventory_keep_aspect_check"/>
+ <button label="Отмена" name="cancel_btn"/>
+ <button label="Сохранить" name="save_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_snapshot_local.xml b/indra/newview/skins/default/xui/ru/panel_snapshot_local.xml
new file mode 100644
index 0000000000..446b9bb2fd
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_snapshot_local.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_local">
+ <text name="title">
+ Сохранить на моем компьютере
+ </text>
+ <combo_box label="Размер" name="local_size_combo">
+ <combo_box.item label="Текущее окно" name="CurrentWindow"/>
+ <combo_box.item label="320x240" name="320x240"/>
+ <combo_box.item label="640x480" name="640x480"/>
+ <combo_box.item label="800x600" name="800x600"/>
+ <combo_box.item label="1024x768" name="1024x768"/>
+ <combo_box.item label="1280x1024" name="1280x1024"/>
+ <combo_box.item label="1600x1200" name="1600x1200"/>
+ <combo_box.item label="Задать" name="Custom"/>
+ </combo_box>
+ <layout_stack name="local_image_params_ls">
+ <layout_panel name="local_image_size_lp">
+ <spinner label="Ширина" name="local_snapshot_width"/>
+ <spinner label="Ð’Ñ‹Ñота" name="local_snapshot_height"/>
+ <check_box label="СохранÑÑ‚ÑŒ пропорции" name="local_keep_aspect_check"/>
+ </layout_panel>
+ <layout_panel name="local_image_format_quality_lp">
+ <combo_box label="Формат" name="local_format_combo">
+ <combo_box.item label="PNG (без потерь)" name="PNG"/>
+ <combo_box.item label="JPEG" name="JPEG"/>
+ <combo_box.item label="BMP (без потерь)" name="BMP"/>
+ </combo_box>
+ <slider label="КачеÑтво изображениÑ" name="image_quality_slider"/>
+ <text name="image_quality_level">
+ ([QLVL])
+ </text>
+ </layout_panel>
+ </layout_stack>
+ <button label="Отмена" name="cancel_btn"/>
+ <flyout_button label="Сохранить" name="save_btn" tool_tip="Сохранить изображение в файл">
+ <flyout_button.item label="Сохранить" name="save_item"/>
+ <flyout_button.item label="Сохранить как..." name="saveas_item"/>
+ </flyout_button>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_snapshot_options.xml b/indra/newview/skins/default/xui/ru/panel_snapshot_options.xml
new file mode 100644
index 0000000000..250a76cd21
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_snapshot_options.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_options">
+ <button label="ПомеÑтить в мой профиль" name="save_to_profile_btn"/>
+ <button label="Отправить по почте" name="save_to_email_btn"/>
+ <button label="Сохранить в моем инвентаре (L$[AMOUNT])" name="save_to_inventory_btn"/>
+ <button label="Сохранить на моем компьютере" name="save_to_computer_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_snapshot_postcard.xml b/indra/newview/skins/default/xui/ru/panel_snapshot_postcard.xml
new file mode 100644
index 0000000000..47f4caf8e3
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_snapshot_postcard.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_postcard">
+ <string name="default_subject">
+ Открытка из [SECOND_LIFE].
+ </string>
+ <string name="default_message">
+ Побывай здеÑÑŒ!
+ </string>
+ <string name="upload_message">
+ Отправка...
+ </string>
+ <text name="title">
+ Электронное пиÑьмо
+ </text>
+ <button label="Сообщение" name="message_btn"/>
+ <button label="ÐаÑтройки" name="settings_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_snapshot_profile.xml b/indra/newview/skins/default/xui/ru/panel_snapshot_profile.xml
new file mode 100644
index 0000000000..79a9ef58d0
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_snapshot_profile.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_profile">
+ <text name="title">
+ ПомеÑтить в мой профиль
+ </text>
+ <combo_box label="Размер" name="profile_size_combo">
+ <combo_box.item label="Текущее окно" name="CurrentWindow"/>
+ <combo_box.item label="640x480" name="640x480"/>
+ <combo_box.item label="800x600" name="800x600"/>
+ <combo_box.item label="1024x768" name="1024x768"/>
+ <combo_box.item label="Задать" name="Custom"/>
+ </combo_box>
+ <layout_stack name="profile_image_params_ls">
+ <layout_panel name="profile_image_size_lp">
+ <spinner label="Ширина" name="profile_snapshot_width"/>
+ <spinner label="Ð’Ñ‹Ñота" name="profile_snapshot_height"/>
+ <check_box label="СохранÑÑ‚ÑŒ пропорции" name="profile_keep_aspect_check"/>
+ </layout_panel>
+ <layout_panel name="profile_image_metadata_lp">
+ <text name="caption_label">
+ ПодпиÑÑŒ:
+ </text>
+ <check_box initial_value="true" label="Включить раÑположение" name="add_location_cb"/>
+ </layout_panel>
+ </layout_stack>
+ <button label="Отмена" name="cancel_btn"/>
+ <button label="Опубликовать" name="post_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_sound_devices.xml b/indra/newview/skins/default/xui/ru/panel_sound_devices.xml
new file mode 100644
index 0000000000..98dab288a3
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_sound_devices.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<panel label="ÐаÑтройки уÑтройÑтва" name="device_settings_panel">
+ <panel.string name="default_text">
+ По умолчанию
+ </panel.string>
+ <string name="name_no_device">
+ Ðет уÑтройÑтва
+ </string>
+ <string name="name_default_system_device">
+ СиÑтемное уÑтройÑтво по умолчанию
+ </string>
+ <text name="Input">
+ Вход
+ </text>
+ <text name="Output">
+ Выход
+ </text>
+ <text name="My volume label">
+ ÐœÐ¾Ñ Ð³Ñ€Ð¾Ð¼ÐºÐ¾ÑÑ‚ÑŒ:
+ </text>
+ <slider_bar initial_value="1.0" name="mic_volume_slider" tool_tip="Измените значение, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð¿Ð¾Ð»Ð·ÑƒÐ½Ð¾Ðº"/>
+ <text name="wait_text">
+ Подождите
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_stand_stop_flying.xml b/indra/newview/skins/default/xui/ru/panel_stand_stop_flying.xml
new file mode 100644
index 0000000000..81a2175fc3
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_stand_stop_flying.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Width and height of this panel should be synchronized with "panel_modes" in the floater_moveview.xml-->
+<panel name="panel_stand_stop_flying">
+ <button label="Ð’Ñтать" name="stand_btn" tool_tip="Щелкните здеÑÑŒ, чтобы вÑтать."/>
+ <button label="Прекратить полет" name="stop_fly_btn" tool_tip="Прекратить полет"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_status_bar.xml b/indra/newview/skins/default/xui/ru/panel_status_bar.xml
new file mode 100644
index 0000000000..9c84ff1fd8
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_status_bar.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="status">
+ <panel.string name="packet_loss_tooltip">
+ Потери пакетов
+ </panel.string>
+ <panel.string name="bandwidth_tooltip">
+ Ширина канала
+ </panel.string>
+ <panel.string name="time">
+ [hour, datetime, slt]:[min, datetime, slt] [timezone,datetime, slt]
+ </panel.string>
+ <panel.string name="timeTooltip">
+ [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]
+ </panel.string>
+ <panel.string name="buycurrencylabel">
+ L$ [AMT]
+ </panel.string>
+ <panel left="-450" name="balance_bg" width="240">
+ <text name="balance" tool_tip="Щелкните Ð´Ð»Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ баланÑа L$" value="L$20"/>
+ <button label="Купить L$" name="buyL" tool_tip="Щелкните Ð´Ð»Ñ Ð¿Ð¾ÐºÑƒÐ¿ÐºÐ¸ L$"/>
+ <button label="Торговый центр" name="goShop" tool_tip="Открыть торговый центр Second Life" width="121"/>
+ </panel>
+ <text name="TimeText" tool_tip="Текущее Ð²Ñ€ÐµÐ¼Ñ (тихоокеанÑкое)">
+ 00:00 (тихоокеанÑкое времÑ)
+ </text>
+ <button name="media_toggle_btn" tool_tip="ЗапуÑк/оÑтановка вÑех медиа (музыка, видео, веб-Ñтраницы)"/>
+ <button name="volume_btn" tool_tip="РегулÑтор громкоÑти"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_teleport_history.xml b/indra/newview/skins/default/xui/ru/panel_teleport_history.xml
new file mode 100644
index 0000000000..c457bc2269
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_teleport_history.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="Teleport History">
+ <accordion name="history_accordion">
+ <no_matched_tabs_text name="no_matched_teleports_msg" value="Ðе нашли того, что вам нужно? ВоÑпользуйтеÑÑŒ [secondlife:///app/search/places/[SEARCH_TERM] поиÑком]."/>
+ <no_visible_tabs_text name="no_teleports_msg" value="ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ñ‚ÐµÐ»ÐµÐ¿Ð¾Ñ€Ñ‚Ð¾Ð² пуÑта. ВоÑпользуйтеÑÑŒ [secondlife:///app/search/places/ поиÑком]."/>
+ <accordion_tab name="today" title="СегоднÑ"/>
+ <accordion_tab name="yesterday" title="Вчера"/>
+ <accordion_tab name="2_days_ago" title="2 Ð´Ð½Ñ Ð½Ð°Ð·Ð°Ð´"/>
+ <accordion_tab name="3_days_ago" title="3 Ð´Ð½Ñ Ð½Ð°Ð·Ð°Ð´"/>
+ <accordion_tab name="4_days_ago" title="4 Ð´Ð½Ñ Ð½Ð°Ð·Ð°Ð´"/>
+ <accordion_tab name="5_days_ago" title="5 дней назад"/>
+ <accordion_tab name="6_days_and_older" title="6 дней назад и раньше"/>
+ <accordion_tab name="1_month_and_older" title="1 меÑÑц назад и раньше"/>
+ <accordion_tab name="6_months_and_older" title="6 меÑÑцев назад и раньше"/>
+ </accordion>
+ <panel name="bottom_panel">
+ <menu_button name="gear_btn" tool_tip="Показать дополнительные параметры"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_teleport_history_item.xml b/indra/newview/skins/default/xui/ru/panel_teleport_history_item.xml
new file mode 100644
index 0000000000..90fb720068
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_teleport_history_item.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="teleport_history_item">
+ <text name="region" value="..."/>
+ <button name="profile_btn" tool_tip="Показать информацию"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_voice_effect.xml b/indra/newview/skins/default/xui/ru/panel_voice_effect.xml
new file mode 100644
index 0000000000..de0b38198f
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_voice_effect.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_voice_effect">
+ <string name="no_voice_effect">
+ Изменение голоÑа отключено
+ </string>
+ <string name="preview_voice_effects">
+ ПроÑлушать изменение голоÑа â–¶
+ </string>
+ <string name="get_voice_effects">
+ ПриобреÑти изменение голоÑа â–¶
+ </string>
+ <combo_box name="voice_effect" tool_tip="Выбор типа Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñвоего голоÑа">
+ <combo_box.item label="Изменение голоÑа отключено" name="no_voice_effect"/>
+ </combo_box>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_world_map.xml b/indra/newview/skins/default/xui/ru/panel_world_map.xml
new file mode 100644
index 0000000000..0ab8720185
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/panel_world_map.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="world_map">
+ <panel.string name="Loading">
+ Загрузка...
+ </panel.string>
+ <panel.string name="InvalidLocation">
+ Ðеправильное меÑто
+ </panel.string>
+ <panel.string name="world_map_north">
+ С
+ </panel.string>
+ <panel.string name="world_map_east">
+ Ð’
+ </panel.string>
+ <panel.string name="world_map_west">
+ З
+ </panel.string>
+ <panel.string name="world_map_south">
+ Ю
+ </panel.string>
+ <panel.string name="world_map_southeast">
+ ЮВ
+ </panel.string>
+ <panel.string name="world_map_northeast">
+ СВ
+ </panel.string>
+ <panel.string name="world_map_southwest">
+ ЮЗ
+ </panel.string>
+ <panel.string name="world_map_northwest">
+ СЗ
+ </panel.string>
+ <panel.string name="world_map_person">
+ 1 человек
+ </panel.string>
+ <panel.string name="world_map_people">
+ Людей: [NUMBER]
+ </panel.string>
+ <text label="С" name="floater_map_north">
+ С
+ </text>
+ <text label="Ð’" name="floater_map_east">
+ Ð’
+ </text>
+ <text label="З" name="floater_map_west">
+ З
+ </text>
+ <text label="Ю" name="floater_map_south">
+ Ю
+ </text>
+ <text label="ЮВ" name="floater_map_southeast">
+ ЮВ
+ </text>
+ <text label="СВ" name="floater_map_northeast">
+ СВ
+ </text>
+ <text label="ЮЗ" name="floater_map_southwest">
+ ЮЗ
+ </text>
+ <text label="СЗ" name="floater_map_northwest">
+ СЗ
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/role_actions.xml b/indra/newview/skins/default/xui/ru/role_actions.xml
new file mode 100644
index 0000000000..b6ba818abd
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/role_actions.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<role_actions>
+ <action_set description="Эти ÑпоÑобноÑти позволÑÑŽÑ‚ добавлÑÑ‚ÑŒ и удалÑÑ‚ÑŒ учаÑтников группы, а также вÑтупать в группы без приглашениÑ." name="Membership">
+ <action description="Приглашение людей в Ñту группу" longdescription="ПриглаÑите людей в группу Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ кнопки «ПриглаÑить» в разделе «Роли» на вкладке «УчаÑтники»." name="member invite" value="1"/>
+ <action description="Удаление учаÑтников из группы" longdescription="Удалите учаÑтников из группы Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ кнопки «Выкинуть» в разделе «Роли» на вкладке «УчаÑтники». Владелец может удалÑÑ‚ÑŒ вÑех, кроме другого владельца. ЕÑли вы не владелец, то удалить учаÑтника из группы можно только в том Ñлучае, еÑли ему назначена ТОЛЬКО роль «ВÑе». Чтобы удалÑÑ‚ÑŒ учаÑтников из ролей, необходима ÑпоÑобноÑÑ‚ÑŒ «Удаление учаÑтников из ролей»." name="member eject" value="2"/>
+ <action description="Включение-отключение Ñвободного вÑÑ‚ÑƒÐ¿Ð»ÐµÐ½Ð¸Ñ Ð¸ изменение платы за вÑтупление" longdescription="Включение-отключение Ñвободного вÑтуплениÑ, что обеÑпечит вÑтупление новых учаÑтников без приглашениÑ, а также изменение платы за вÑтупление в разделе «Общие»." name="member options" value="3"/>
+ </action_set>
+ <action_set description="Эти ÑпоÑобноÑти позволÑÑŽÑ‚ добавлÑÑ‚ÑŒ, удалÑÑ‚ÑŒ и изменÑÑ‚ÑŒ роли группы, добавлÑÑ‚ÑŒ и удалÑÑ‚ÑŒ учаÑтников ролей, а также назначать ролÑм ÑпоÑобноÑти." name="Roles">
+ <action description="Создание ролей" longdescription="Создавайте новые роли в разделе «Роли» на вкладке «Роли»." name="role create" value="4"/>
+ <action description="Удаление ролей" longdescription="УдалÑйте роли в разделе «Роли» на вкладке «Роли»." name="role delete" value="5"/>
+ <action description="Изменение названий, титулов, опиÑаний ролей, а также наÑтройка публичноÑти их учаÑтников" longdescription="Изменение названий, титулов, опиÑаний ролей, а также наÑтройка публичноÑти их учаÑтников. Это можно Ñделать в разделе «Роли», в нижней чаÑти вкладки «Роли» Ð´Ð»Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð¾Ð¹ роли." name="role properties" value="6"/>
+ <action description="Ðазначение учаÑтникам ролей назначающего" longdescription="Ðазначьте учаÑтникам роли в ÑпиÑке «Ðазначенные роли» (раздел «Роли» &gt; вкладка «УчаÑтники»). УчаÑтник Ñ Ñтой ÑпоÑобноÑтью может добавлÑÑ‚ÑŒ учаÑтников только той роли, в которой ÑоÑтоит он Ñам." name="role assign member limited" value="7"/>
+ <action description="Ðазначение учаÑтников любой роли" longdescription="Ðазначение учаÑтникам любой роли в ÑпиÑке «Ðазначенные роли» (раздел «Роли» &gt; вкладка «УчаÑтники»). *ПРЕДУПРЕЖДЕÐИЕ* Любой учаÑтник роли Ñ Ñтой ÑпоÑобноÑтью может назначить Ñебе (и любому другому учаÑтнику, кроме владельца) роли Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ð¼Ð¸ возможноÑÑ‚Ñми, чем он имеет, и поднÑÑ‚ÑŒÑÑ Ð¿Ñ€Ð°ÐºÑ‚Ð¸Ñ‡ÐµÑки до ÑƒÑ€Ð¾Ð²Ð½Ñ Ð²Ð»Ð°Ð´ÐµÐ»ÑŒÑ†Ð°. Прежде чем назначить Ñту ÑпоÑобноÑÑ‚ÑŒ, убедитеÑÑŒ в целеÑообразноÑти Ñтого." name="role assign member" value="8"/>
+ <action description="Удаление учаÑтников из ролей" longdescription="УдалÑйте учаÑтников из ролей в ÑпиÑке «Ðазначенные роли» (раздел «Роли» &gt; вкладка «УчаÑтники»). Владельцев удалÑÑ‚ÑŒ нельзÑ." name="role remove member" value="9"/>
+ <action description="Ðазначение и удаление ÑпоÑобноÑтей ролей" longdescription="Ðазначайте и удалÑйте ÑпоÑобноÑти Ð´Ð»Ñ Ñ€Ð¾Ð»ÐµÐ¹ в ÑпиÑке «ДоÑтупные ÑпоÑобноÑти» (раздел «Роли» &gt; вкладка «Роли»). *ПРЕДУПРЕЖДЕÐИЕ* Любой учаÑтник роли Ñ Ñ‚Ð°ÐºÐ¾Ð¹ ÑпоÑобноÑтью может назначить Ñебе (и любому другому учаÑтнику, кроме владельца) вÑе роли, потенциально поднимаÑÑÑŒ практичеÑки до ÑƒÑ€Ð¾Ð²Ð½Ñ Ð²Ð»Ð°Ð´ÐµÐ»ÑŒÑ†Ð°. Прежде чем назначить Ñту ÑпоÑобноÑÑ‚ÑŒ, убедитеÑÑŒ в целеÑообразноÑти Ñтого." name="role change actions" value="10"/>
+ </action_set>
+ <action_set description="К Ñтим ÑпоÑобноÑÑ‚Ñм отноÑитÑÑ ÑпоÑобноÑÑ‚ÑŒ изменить характер группы, в том чиÑле общедоÑтупноÑÑ‚ÑŒ, уÑтав и Ñимвол." name="Group Identity">
+ <action description="Изменение уÑтава, Ñимвола и параметра «Показать в поиÑке»" longdescription="Изменение уÑтава, Ñимвола и параметра «Показать в поиÑке». Это можно выполнить в разделе «Общие»." name="group change identity" value="11"/>
+ </action_set>
+ <action_set description="К Ñтим ÑпоÑобноÑÑ‚Ñм отноÑитÑÑ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð°, изменение и продажа земли из владений группы. Чтобы открыть окно «О земле», щелкните правой кнопкой мыши землю и выберите «О земле» либо щелкните значок «i» на панели навигации." name="Parcel Management">
+ <action description="Передача земли и покупка земли Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹" longdescription="Передача земли и покупка земли Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹. Это можно выполнить в окне «О земле» на вкладке «Общие»." name="land deed" value="12"/>
+ <action description="Отказ от земли в пользу владелицы Linden" longdescription="Отказ от земли в пользу владелицы Linden. *ПРЕДУПРЕЖДЕÐИЕ* Любой учаÑтник роли Ñ Ñтой ÑпоÑобноÑтью может отказатьÑÑ Ð¾Ñ‚ земли группы в окне «О земле» на вкладке «Общие», вернув ее во владение Linden без продажи. Прежде чем назначить Ñту ÑпоÑобноÑÑ‚ÑŒ, убедитеÑÑŒ в целеÑообразноÑти Ñтого." name="land release" value="13"/>
+ <action description="ÐаÑтройка Ñведений о продаже земли" longdescription="ÐаÑтройка Ñведений о продаже земли. *ПРЕДУПРЕЖДЕÐИЕ* Любой учаÑтник роли Ñ Ñтой ÑпоÑобноÑтью при желании может продать землю группы в окне «О земле» на вкладке «Общие». Прежде чем назначить Ñту ÑпоÑобноÑÑ‚ÑŒ, убедитеÑÑŒ в целеÑообразноÑти Ñтого." name="land set sale info" value="14"/>
+ <action description="Разделение и объединение учаÑтков" longdescription="Разделение и объединение учаÑтков. Ðеобходимо щелкнуть землю правой кнопкой мыши, выбрать пункт «Изменить ландшафт» и перемеÑтить курÑор на выбираемую землю. Чтобы выполнить разделение, выберите разделÑемый учаÑток и щелкните «Разделить». Чтобы выполнить объединение, выберите неÑколько граничащих учаÑтков и щелкните «Объединить»." name="land divide join" value="15"/>
+ </action_set>
+ <action_set description="К Ñтим ÑпоÑобноÑÑ‚Ñм отноÑитÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ðµ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ ÑƒÑ‡Ð°Ñтка и Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð½Ð°Ñтроек, поиÑк видимых каталогов, а также наÑтройки точек и вариантов телепортации." name="Parcel Identity">
+ <action description="Включение-отключение показа меÑта в результатах поиÑка и наÑтройка категории" longdescription="Включить-отключить показ меÑта в результатах поиÑка и наÑтроить категорию учаÑтка можно в окне «О земле» на вкладке «Параметры»." name="land find places" value="17"/>
+ <action description="Изменение Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ опиÑÐ°Ð½Ð¸Ñ ÑƒÑ‡Ð°Ñтка, наÑтройки «Показать меÑто в поиÑке»" longdescription="Изменение Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ опиÑÐ°Ð½Ð¸Ñ ÑƒÑ‡Ð°Ñтка, наÑтройки «Показать меÑто в поиÑке». Это можно выполнить в окне «О земле» на вкладке «Параметры»." name="land change identity" value="18"/>
+ <action description="УÑтановка конечной точки и варианта телепортации" longdescription="УчаÑтники роли Ñ Ñтой ÑпоÑобноÑтью могут уÑтановить конечную точку телепортации на учаÑтке группы, а также задать вариант телепортации Ð´Ð»Ñ ÑƒÑÐ¸Ð»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»Ñ. Это можно выполнить в окне «О земле» на вкладке «Параметры»." name="land set landing point" value="19"/>
+ </action_set>
+ <action_set description="К Ñтим ÑпоÑобноÑÑ‚Ñм отноÑитÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ðµ наÑтроек учаÑтка, в Ñ‚. ч. «Создать объекты», «Изменить ландшафт», а также наÑтройки музыки и медиа." name="Parcel Settings">
+ <action description="Изменение наÑтроек музыки и медиа" longdescription="Измените наÑтройки потоковой музыки и фильмов в окне «О земле» на вкладке «Медиа»." name="land change media" value="20"/>
+ <action description="Включение-отключение Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð»Ð°Ð½Ð´ÑˆÐ°Ñ„Ñ‚Ð°" longdescription="Включение-отключение Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð»Ð°Ð½Ð´ÑˆÐ°Ñ„Ñ‚Ð°. *ПРЕДУПРЕЖДЕÐИЕ* Выбрав параметры «О земле» &gt; вкладка «Параметры» &gt; «Изменить ландшафт», любой пользователь может изменить форму земли, а также размещать или перемещать раÑÑ‚ÐµÐ½Ð¸Ñ Linden. Прежде чем назначить Ñту ÑпоÑобноÑÑ‚ÑŒ, убедитеÑÑŒ в целеÑообразноÑти Ñтого. Изменить ландшафт можно в окне «О земле» на вкладке «Параметры»." name="land edit" value="21"/>
+ <action description="Включение-отключение различных наÑтроек «О земле &gt; Параметры»" longdescription="Ð’ окне «О земле» на вкладке «Параметры» можно включить-отключить параметр «БезопаÑно (нет повреждений)», «Полет» и разрешить другим жителÑм изменÑÑ‚ÑŒ ландшафт, ÑтроительÑтво, Ñоздавать закладки и запуÑкать Ñкрипты Ð´Ð»Ñ Ð·ÐµÐ¼Ð»Ð¸ группы." name="land options" value="22"/>
+ </action_set>
+ <action_set description="К Ñтим ÑпоÑобноÑÑ‚Ñм отноÑитÑÑ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ðµ учаÑтникам обходить Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð½Ð° учаÑтках группы." name="Parcel Powers">
+ <action description="Ð’Ñегда разрешено изменение ландшафта" longdescription="УчаÑтники роли Ñ Ñтой ÑпоÑобноÑтью могут изменÑÑ‚ÑŒ ландшафт учаÑтка группы, даже еÑли Ñто отключено в окне «О земле» на вкладке «Параметры»." name="land allow edit land" value="23"/>
+ <action description="Ð’Ñегда разрешен полет" longdescription="УчаÑтники роли Ñ Ñтой ÑпоÑобноÑтью могут летать над учаÑтком группы, даже еÑли Ñто отключено в окне «О земле» на вкладке «Параметры»." name="land allow fly" value="24"/>
+ <action description="Ð’Ñегда разрешено Ñоздавать объекты" longdescription="УчаÑтники роли Ñ Ñтой ÑпоÑобноÑтью могут Ñоздавать объекты на учаÑтке группы, даже еÑли Ñто отключено в окне «О земле» на вкладке «Параметры»." name="land allow create" value="25"/>
+ <action description="Ð’Ñегда разрешено Ñоздавать закладки" longdescription="УчаÑтники роли Ñ Ñтой ÑпоÑобноÑтью могут помеÑтить закладку на учаÑтке группы, даже еÑли Ñто отключено в окне «О земле» на вкладке «Параметры»." name="land allow landmark" value="26"/>
+ <action description="Разрешено уÑтановить дом на земле группы" longdescription="УчаÑтники роли Ñ Ñ‚Ð°ÐºÐ¾Ð¹ ÑпоÑобноÑтью могут иÑпользовать меню «Мир &gt; Закладки &gt; УÑтановить дом здеÑь» Ð´Ð»Ñ ÑƒÑ‡Ð°Ñтка, переданного Ñтой группе." name="land allow set home" value="28"/>
+ <action description="Разрешена Ð¾Ñ€Ð°Ð³Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ñобытий на земле группы" longdescription="УчаÑтники роли Ñ Ñтой ÑпоÑобноÑтью могут выбрать учаÑтки группы в качеÑтве любимого меÑта при организации ÑобытиÑ." name="land allow host event" value="41"/>
+ </action_set>
+ <action_set description="К Ñтим ÑпоÑобноÑÑ‚Ñм отноÑитÑÑ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ðµ или ограничение доÑтупа к учаÑткам группы, в Ñ‚ ч. заморозка и выбраÑывание жителей." name="Parcel Access">
+ <action description="Управление ÑпиÑками доÑтупа к учаÑтку" longdescription="УправлÑÑ‚ÑŒ ÑпиÑками доÑтупа к учаÑтку можно в окне «О земле» на вкладке «ДоÑтуп»." name="land manage allowed" value="29"/>
+ <action description="Управление ÑпиÑками запрета доÑтупа к учаÑтку" longdescription="УправлÑÑ‚ÑŒ ÑпиÑками запрета доÑтупа к учаÑтку можно в окне «О земле» на вкладке «ДоÑтуп»." name="land manage banned" value="30"/>
+ <action description="Изменение наÑтроек продажи пропуÑков на учаÑток" longdescription="Изменить наÑтройки продажи пропуÑков на учаÑток можно в окне «О земле» на вкладке «ДоÑтуп»." name="land manage passes" value="31"/>
+ <action description="ВыбраÑывание и заморозка жителей на учаÑтках" longdescription="УчаÑтники роли Ñ Ñтой ÑпоÑобноÑтью могут оперировать нежелательными жителÑми на учаÑтке группы, выбрав их правой кнопкой мыши и щелкнув «Выкинуть» или «Заморозить»." name="land admin" value="32"/>
+ </action_set>
+ <action_set description="К Ñтим ÑпоÑобноÑÑ‚Ñм отноÑитÑÑ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ðµ учаÑтникам возвращать объекты, размещать и перемещать раÑÑ‚ÐµÐ½Ð¸Ñ Linden. Это удобно при уборке разброÑанных объектов и формировании ландшафта, но Ñледует Ñоблюдать оÑторожноÑÑ‚ÑŒ, так как возврат объектов не отменÑетÑÑ." name="Parcel Content">
+ <action description="Возврат объектов группы" longdescription="Вернуть объекты, принадлежащие группе, на учаÑтки группы можно в окне «О земле» на вкладке «Объекты»." name="land return group owned" value="48"/>
+ <action description="Возврат объектов, назначенных группе" longdescription="Вернуть объекты, назначенные группе, на учаÑтки группы можно в окне «О земле» на вкладке «Объекты»." name="land return group set" value="33"/>
+ <action description="Возврат объектов, не принадлежащих группе" longdescription="Вернуть объекты, не принадлежащие группе, на учаÑтки группы можно в окне «О земле» на вкладке «Объекты»." name="land return non group" value="34"/>
+ <action description="Формирование ландшафта Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ раÑтений Linden" longdescription="СпоÑобноÑÑ‚ÑŒ формировать ландшафт и перемещать деревьÑ, раÑÑ‚ÐµÐ½Ð¸Ñ Ð¸ траву Linden. Эти вещи находÑÑ‚ÑÑ Ð² папке Ð¸Ð½Ð²ÐµÐ½Ñ‚Ð°Ñ€Ñ Â«Ð‘Ð¸Ð±Ð»Ð¸Ð¾Ñ‚ÐµÐºÐ° &gt; Объекты», либо их можно Ñоздать Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ меню «СтроительÑтво»." name="land gardening" value="35"/>
+ </action_set>
+ <action_set description="К Ñтим ÑпоÑобноÑÑ‚Ñм отноÑитÑÑ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð°, изменение и продажа объектов группы. Ð”Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸ÑпользуетÑÑ Ð²ÐºÐ»Ð°Ð´ÐºÐ° «Общие» в группе «ИнÑтрументы Ð´Ð»Ñ ÑтроительÑтва». Чтобы проÑмотреть наÑтройки, щелкните объект правой кнопкой и выберите пункт «Изменить»." name="Object Management">
+ <action description="Передача объектов группе" longdescription="Передать объекты группе можно на вкладке «Общие» в группе «ИнÑтрументы Ð´Ð»Ñ ÑтроительÑтва»." name="object deed" value="36"/>
+ <action description="Оперирование (перемещение, копирование, изменение) объектами группы" longdescription="Оперировать (перемещать, копировать, изменÑÑ‚ÑŒ) объекты группы можно на вкладке «Общие» в группе «ИнÑтрументы Ð´Ð»Ñ ÑтроительÑтва»." name="object manipulate" value="38"/>
+ <action description="Выбор объектов группы на продажу" longdescription="Выбрать объекты группы на продажу можно на вкладке «Общие» в группе «ИнÑтрументы Ð´Ð»Ñ ÑтроительÑтва»." name="object set sale" value="39"/>
+ </action_set>
+ <action_set description="Эти ÑпоÑобноÑти обÑзывают учаÑтников выплачивать задолженноÑти и дают право получать прибыли группы, а также ограничивают доÑтуп к журналу аккаунтов группы." name="Accounting">
+ <action description="Выплата задолженноÑтей и получение прибыли группы" longdescription="УчаÑтники роли Ñ Ñтой ÑпоÑобноÑтью будут автоматичеÑки выплачивать задолженноÑти и получать прибыль группы. Они будут получать чаÑÑ‚ÑŒ прибыли от продажи земель группы, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ñ€Ð°ÑпределÑетÑÑ ÐµÐ¶ÐµÐ´Ð½ÐµÐ²Ð½Ð¾, а также вноÑить плату, например, за ÑпиÑок учаÑтков." name="accounting accountable" value="40"/>
+ </action_set>
+ <action_set description="К Ñтим ÑпоÑобноÑÑ‚Ñм отноÑитÑÑ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ðµ учаÑтникам отправлÑÑ‚ÑŒ, получать и проÑматривать ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾Ñ‚ группы." name="Notices">
+ <action description="Отправка уведомлений" longdescription="УчаÑтники роли Ñ Ñтой ÑпоÑобноÑтью могут отправлÑÑ‚ÑŒ уведомлениÑ, выбрав «Группа» &gt; раздел «УведомлениÑ»." name="notices send" value="42"/>
+ <action description="Получение новых и проÑмотр Ñтарых уведомлений" longdescription="УчаÑтники роли Ñ Ñтой ÑпоÑобноÑтью могут получать новые и проÑматривать Ñтарые уведомлениÑ, выбрав «Группа» &gt; раздел «УведомлениÑ»." name="notices receive" value="43"/>
+ </action_set>
+ <action_set description="К Ñтим ÑпоÑобноÑÑ‚Ñм отноÑитÑÑ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ðµ или ограничение доÑтупа к ÑеанÑам чата и голоÑовому чату группы." name="Chat">
+ <action description="ПриÑоединение к чату группы" longdescription="УчаÑтники роли Ñ Ñтой ÑпоÑобноÑтью могут приÑоединÑÑ‚ÑŒÑÑ Ðº ÑеанÑам чата группы (текÑтового и голоÑового)." name="join group chat" value="16"/>
+ <action description="ПриÑоединение к голоÑовому чату группы" longdescription="УчаÑтники роли Ñ Ñтой ÑпоÑобноÑтью могут приÑоединÑÑ‚ÑŒÑÑ Ðº ÑеанÑам голоÑового чата группы. ПРИМЕЧÐÐИЕ. СпоÑобноÑÑ‚ÑŒ «ПриÑоединение к чату группы» необходима Ð´Ð»Ñ Ð´Ð¾Ñтупа к ÑеанÑам голоÑового чата." name="join voice chat" value="27"/>
+ <action description="Moderate-чат группы" longdescription="УчаÑтники роли Ñ Ñтой ÑпоÑобноÑтью могут контролировать доÑтуп и учаÑтие в ÑеанÑах текÑтового и голоÑового чата группы." name="moderate group chat" value="37"/>
+ </action_set>
+</role_actions>
diff --git a/indra/newview/skins/default/xui/ru/sidepanel_appearance.xml b/indra/newview/skins/default/xui/ru/sidepanel_appearance.xml
new file mode 100644
index 0000000000..a23f6134f2
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/sidepanel_appearance.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="КоÑтюмы" name="appearance panel">
+ <string name="No Outfit" value="Ðет коÑтюма"/>
+ <string name="Unsaved Changes" value="Ðе Ñохраненные изменениÑ"/>
+ <string name="Now Wearing" value="Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð½Ð°Ð´ÐµÑ‚Ð¾..."/>
+ <string name="Changing outfits" value="Смена коÑтюмов"/>
+ <panel name="panel_currentlook">
+ <button label="E" name="editappearance_btn"/>
+ <button label="O" name="openoutfit_btn"/>
+ <text name="currentlook_status">
+ (СтатуÑ)
+ </text>
+ <text name="currentlook_name">
+ Мой коÑтюм Ñ Ð¾Ñ‡ÐµÐ½ÑŒ длинным названием, например, ЛОСОСЬ
+ </text>
+ <button label="" name="edit_outfit_btn" tool_tip="Изменить коÑтюм"/>
+ </panel>
+ <filter_editor label="Фильтр Ð´Ð»Ñ ÐºÐ¾Ñтюмов" name="Filter"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/sidepanel_inventory.xml b/indra/newview/skins/default/xui/ru/sidepanel_inventory.xml
new file mode 100644
index 0000000000..c106c2de79
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/sidepanel_inventory.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Вещи" name="objects panel">
+ <panel label="" name="sidepanel__inventory_panel">
+ <layout_stack name="inventory_layout_stack">
+ <layout_panel name="inbox_layout_panel">
+ <panel label="" name="marketplace_inbox">
+ <string name="InboxLabelWithArg">
+ Полученные вещи ([NUM])
+ </string>
+ <string name="InboxLabelNoArg">
+ Полученные вещи
+ </string>
+ <button label="Полученные вещи" name="inbox_btn"/>
+ <text name="inbox_fresh_new_count">
+ Ðовых: [NUM]
+ </text>
+ <panel name="inbox_inventory_placeholder_panel" tool_tip="Перетащите вещи в ваш инвентарь Ð´Ð»Ñ Ð¸Ñ… иÑпользованиÑ">
+ <text name="inbox_inventory_placeholder">
+ Покупки из торгового центра будут доÑтавлены Ñюда.
+ </text>
+ </panel>
+ </panel>
+ </layout_panel>
+ </layout_stack>
+ <panel name="button_panel">
+ <layout_stack name="button_panel_ls">
+ <layout_panel name="info_btn_lp">
+ <button label="Профиль" name="info_btn" tool_tip="Показать профиль объекта"/>
+ </layout_panel>
+ <layout_panel name="share_btn_lp">
+ <button label="ПоделитьÑÑ" name="share_btn" tool_tip="ПоделитьÑÑ Ð²ÐµÑ‰ÑŒÑŽ из инвентарÑ"/>
+ </layout_panel>
+ <layout_panel name="shop_btn_lp">
+ <button label="Торговый центр" name="shop_btn" tool_tip="Открыть Ñтраницу торгового центра"/>
+ <button label="Ðадеть" name="wear_btn" tool_tip="Ðадеть выбранный коÑтюм"/>
+ <button label="Проиграть" name="play_btn"/>
+ <button label="Телепорт" name="teleport_btn" tool_tip="ТелепортироватьÑÑ Ð² выбранную облаÑÑ‚ÑŒ"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/sidepanel_item_info.xml b/indra/newview/skins/default/xui/ru/sidepanel_item_info.xml
new file mode 100644
index 0000000000..62095acbaf
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/sidepanel_item_info.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="item properties" title="Профиль объекта">
+ <panel.string name="unknown">
+ (неизвеÑтно)
+ </panel.string>
+ <panel.string name="public">
+ (публичное)
+ </panel.string>
+ <panel.string name="you_can">
+ Вы можете:
+ </panel.string>
+ <panel.string name="owner_can">
+ Владелец может:
+ </panel.string>
+ <panel.string name="acquiredDate">
+ [wkday,datetime,local], [day,datetime,local] [mth,datetime,local] [year,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
+ </panel.string>
+ <panel.string name="origin_inventory">
+ (инвентарь)
+ </panel.string>
+ <panel.string name="origin_inworld">
+ (в мире)
+ </panel.string>
+ <text name="title" value="Профиль объекта"/>
+ <text name="origin" value="(инвентарь)"/>
+ <scroll_container name="item_profile_scroll">
+ <panel label="" name="item_profile">
+ <text name="LabelItemNameTitle">
+ Ðазвание:
+ </text>
+ <text name="LabelItemDescTitle">
+ ОпиÑание:
+ </text>
+ <text name="LabelCreatorTitle">
+ Создатель:
+ </text>
+ <text name="LabelOwnerTitle">
+ Владелец:
+ </text>
+ <text name="LabelAcquiredTitle">
+ Приобретено:
+ </text>
+ <panel name="perms_inv">
+ <text name="perm_modify">
+ Вы можете:
+ </text>
+ <check_box label="ИзменÑÑ‚ÑŒ" name="CheckOwnerModify"/>
+ <check_box label="Копировать" name="CheckOwnerCopy"/>
+ <check_box label="Передать" name="CheckOwnerTransfer"/>
+ <text name="AnyoneLabel">
+ Ð’Ñе:
+ </text>
+ <check_box label="Копировать" name="CheckEveryoneCopy"/>
+ <text name="GroupLabel">
+ Группа:
+ </text>
+ <check_box label="ПоделитьÑÑ" name="CheckShareWithGroup" tool_tip="Позволить вÑем учаÑтникам выбранной группы получить уÑтановленные вам права на Ñтот объект. Ð”Ð»Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ñ€Ð¾Ð»ÐµÐ²Ñ‹Ñ… ограничений необходимо произвеÑти Ñделку."/>
+ <text name="NextOwnerLabel">
+ Следующий владелец:
+ </text>
+ <check_box label="ИзменÑÑ‚ÑŒ" name="CheckNextOwnerModify"/>
+ <check_box label="Копировать" name="CheckNextOwnerCopy"/>
+ <check_box label="Передать" name="CheckNextOwnerTransfer" tool_tip="Следующий владелец может отдать или перепродать объект"/>
+ </panel>
+ <check_box label="Ð”Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð°Ð¶Ð¸" name="CheckPurchase"/>
+ <combo_box name="combobox sale copy">
+ <combo_box.item label="Копировать" name="Copy"/>
+ <combo_box.item label="Оригинал" name="Original"/>
+ </combo_box>
+ <spinner label="Цена: L$" name="Edit Cost"/>
+ </panel>
+ </scroll_container>
+ <panel name="button_panel">
+ <button label="Отмена" name="cancel_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/sidepanel_task_info.xml b/indra/newview/skins/default/xui/ru/sidepanel_task_info.xml
new file mode 100644
index 0000000000..8e56dd80c0
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/sidepanel_task_info.xml
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="object properties" title="Профиль объекта">
+ <panel.string name="text deed continued">
+ Сделка
+ </panel.string>
+ <panel.string name="text deed">
+ Сделка
+ </panel.string>
+ <panel.string name="text modify info 1">
+ Этот объект можно изменÑÑ‚ÑŒ
+ </panel.string>
+ <panel.string name="text modify info 2">
+ Эти объекты можно изменÑÑ‚ÑŒ
+ </panel.string>
+ <panel.string name="text modify info 3">
+ Этот объект Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½ÑÑ‚ÑŒ
+ </panel.string>
+ <panel.string name="text modify info 4">
+ Эти объекты Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½ÑÑ‚ÑŒ
+ </panel.string>
+ <panel.string name="text modify warning">
+ Этот объект Ñодержит объединенные чаÑти
+ </panel.string>
+ <panel.string name="Cost Default">
+ Цена: L$
+ </panel.string>
+ <panel.string name="Cost Total">
+ Ð’Ñего: L$
+ </panel.string>
+ <panel.string name="Cost Per Unit">
+ Цена за: L$
+ </panel.string>
+ <panel.string name="Cost Mixed">
+ Ð¡Ð¼ÐµÑˆÐ°Ð½Ð½Ð°Ñ Ñ†ÐµÐ½Ð°
+ </panel.string>
+ <panel.string name="Sale Mixed">
+ Ð¡Ð¼ÐµÑˆÐ°Ð½Ð½Ð°Ñ Ð¿Ñ€Ð¾Ð´Ð°Ð¶Ð°
+ </panel.string>
+ <text name="title" value="Профиль объекта"/>
+ <text name="where" value="(в мире)"/>
+ <panel label="" name="properties_panel">
+ <text name="Name:">
+ Ðазвание:
+ </text>
+ <text name="Description:">
+ ОпиÑание:
+ </text>
+ <text name="CreatorNameLabel">
+ Создатель:
+ </text>
+ <text name="Owner:">
+ Владелец:
+ </text>
+ <text name="Group_label">
+ Группа:
+ </text>
+ <button name="button set group" tool_tip="Выберите группу Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð¸ ей прав доÑтупа к объекту"/>
+ <name_box initial_value="Загрузка..." name="Group Name Proxy"/>
+ <button label="Сделка" label_selected="Сделка" name="button deed" tool_tip="Ð’ результате Ñделки объект передаетÑÑ Ð³Ñ€ÑƒÐ¿Ð¿Ðµ, при Ñтом права на него будут ÑоответÑтвовать правам Ñледующего владельца. Переданный группе объект может передаватьÑÑ Ð´Ð¾Ð»Ð¶Ð½Ð¾Ñтным лицом группы."/>
+ <text name="label click action">
+ ДейÑтвие по щелчку:
+ </text>
+ <combo_box name="clickaction">
+ <combo_box.item label="КоÑнутьÑÑ (по умолчанию)" name="Touch/grab(default)"/>
+ <combo_box.item label="СеÑÑ‚ÑŒ на объект" name="Sitonobject"/>
+ <combo_box.item label="Купить объект" name="Buyobject"/>
+ <combo_box.item label="Заплатить за объект" name="Payobject"/>
+ <combo_box.item label="Открыть" name="Open"/>
+ </combo_box>
+ <panel name="perms_inv">
+ <text name="perm_modify">
+ Этот объект можно изменÑÑ‚ÑŒ
+ </text>
+ <text name="Anyone can:">
+ Ð’Ñе:
+ </text>
+ <check_box label="Копировать" name="checkbox allow everyone copy"/>
+ <check_box label="ПеремеÑтить" name="checkbox allow everyone move"/>
+ <text name="GroupLabel">
+ Группа:
+ </text>
+ <check_box label="ПоделитьÑÑ" name="checkbox share with group" tool_tip="Позволить вÑем учаÑтникам выбранной группы получить уÑтановленные вам права на Ñтот объект. Ð”Ð»Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ñ€Ð¾Ð»ÐµÐ²Ñ‹Ñ… ограничений необходимо произвеÑти Ñделку."/>
+ <text name="NextOwnerLabel">
+ Следующий владелец:
+ </text>
+ <check_box label="ИзменÑÑ‚ÑŒ" name="checkbox next owner can modify"/>
+ <check_box label="Копировать" name="checkbox next owner can copy"/>
+ <check_box label="Передать" name="checkbox next owner can transfer" tool_tip="Следующий владелец может отдать или перепродать объект"/>
+ </panel>
+ <check_box label="Ð”Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð°Ð¶Ð¸" name="checkbox for sale"/>
+ <combo_box name="sale type">
+ <combo_box.item label="Копировать" name="Copy"/>
+ <combo_box.item label="Контент" name="Contents"/>
+ <combo_box.item label="Оригинал" name="Original"/>
+ </combo_box>
+ <spinner label="Цена: L$" name="Edit Cost"/>
+ <check_box label="Показать в результатах поиÑка" name="search_check" tool_tip="Показывать объект в результатах поиÑка"/>
+ <text name="B:">
+ Ð:
+ </text>
+ <text name="O:">
+ O:
+ </text>
+ <text name="G:">
+ G:
+ </text>
+ <text name="E:">
+ Ð’:
+ </text>
+ <text name="N:">
+ С:
+ </text>
+ <text name="F:">
+ F:
+ </text>
+ </panel>
+ <panel name="button_panel">
+ <button label="Открыть" name="open_btn"/>
+ <button label="Заплатить" name="pay_btn"/>
+ <button label="Купить" name="buy_btn"/>
+ <button label="ПодробноÑти" name="details_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ru/strings.xml b/indra/newview/skins/default/xui/ru/strings.xml
new file mode 100644
index 0000000000..8dbc4f092d
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/strings.xml
@@ -0,0 +1,5024 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- This file contains strings that used to be hardcoded in the source.
+ It is only for those strings which do not belong in a floater.
+ For example, the strings used in avatar chat bubbles, and strings
+ that are returned from one component and may appear in many places-->
+<strings>
+ <string name="SECOND_LIFE">
+ Second Life
+ </string>
+ <string name="APP_NAME">
+ Second Life
+ </string>
+ <string name="CAPITALIZED_APP_NAME">
+ SECOND LIFE
+ </string>
+ <string name="SECOND_LIFE_GRID">
+ Сетка Second Life
+ </string>
+ <string name="SUPPORT_SITE">
+ Портал поддержки Second Life
+ </string>
+ <string name="StartupDetectingHardware">
+ Проверка оборудованиÑ...
+ </string>
+ <string name="StartupLoading">
+ ЗагружаетÑÑ [APP_NAME]...
+ </string>
+ <string name="StartupClearingCache">
+ ОчиÑтка кÑша...
+ </string>
+ <string name="StartupInitializingTextureCache">
+ Ð˜Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ ÐºÑша текÑтур...
+ </string>
+ <string name="StartupInitializingVFS">
+ Ð˜Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð²Ð¸Ñ€Ñ‚ÑƒÐ°Ð»ÑŒÐ½Ð¾Ð¹ файловой ÑиÑтемы...
+ </string>
+ <string name="StartupRequireDriverUpdate">
+ Ошибка инициализации графики. Обновите графичеÑкий драйвер!
+ </string>
+ <string name="ProgressRestoring">
+ ВоÑÑтановление...
+ </string>
+ <string name="ProgressChangingResolution">
+ Изменение разрешениÑ...
+ </string>
+ <string name="Fullbright">
+ СобÑÑ‚Ð²ÐµÐ½Ð½Ð°Ñ ÑркоÑÑ‚ÑŒ (уÑтаревший параметр)
+ </string>
+ <string name="LoginInProgress">
+ Вход... Может показатьÑÑ, что программа [APP_NAME] завиÑла. Ожидайте.
+ </string>
+ <string name="LoginInProgressNoFrozen">
+ Вход...
+ </string>
+ <string name="LoginAuthenticating">
+ ÐутентификациÑ
+ </string>
+ <string name="LoginMaintenance">
+ Идет обÑлуживание аккаунта...
+ </string>
+ <string name="LoginAttempt">
+ ÐŸÑ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð°Ñ Ð¿Ð¾Ð¿Ñ‹Ñ‚ÐºÐ° входа была неудачной. Вход: попытка â„– [NUMBER]
+ </string>
+ <string name="LoginPrecaching">
+ Загрузка мира...
+ </string>
+ <string name="LoginInitializingBrowser">
+ Ð˜Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð²Ñтроенного веб-браузера...
+ </string>
+ <string name="LoginInitializingMultimedia">
+ Ð˜Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¼ÑƒÐ»ÑŒÑ‚Ð¸Ð¼ÐµÐ´Ð¸Ð°...
+ </string>
+ <string name="LoginInitializingFonts">
+ Загрузка шрифтов...
+ </string>
+ <string name="LoginVerifyingCache">
+ Проверка файлов кÑша (может занÑÑ‚ÑŒ 60-90 Ñ)...
+ </string>
+ <string name="LoginProcessingResponse">
+ Обработка ответа...
+ </string>
+ <string name="LoginInitializingWorld">
+ Ð˜Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¼Ð¸Ñ€Ð°...
+ </string>
+ <string name="LoginDecodingImages">
+ Декодирование изображений...
+ </string>
+ <string name="LoginInitializingQuicktime">
+ Ð˜Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ QuickTime...
+ </string>
+ <string name="LoginQuicktimeNotFound">
+ QuickTime не найден – ошибка инициализации.
+ </string>
+ <string name="LoginQuicktimeOK">
+ УÑÐ¿ÐµÑˆÐ½Ð°Ñ Ð¸Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ QuickTime.
+ </string>
+ <string name="LoginRequestSeedCapGrant">
+ Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾Ñтей региона...
+ </string>
+ <string name="LoginRetrySeedCapGrant">
+ Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾Ñтей региона, попытка [NUMBER]...
+ </string>
+ <string name="LoginWaitingForRegionHandshake">
+ УÑтанавливаетÑÑ ÑвÑзь Ñ Ñ€ÐµÐ³Ð¸Ð¾Ð½Ð¾Ð¼...
+ </string>
+ <string name="LoginConnectingToRegion">
+ Подключение к региону...
+ </string>
+ <string name="LoginDownloadingClothing">
+ Загрузка одежды...
+ </string>
+ <string name="InvalidCertificate">
+ Сервер возвратил недейÑтвительный или поврежденный Ñертификат. ОбратитеÑÑŒ к админиÑтратору Ñетки.
+ </string>
+ <string name="CertInvalidHostname">
+ Ð”Ð»Ñ Ð´Ð¾Ñтупа к Ñерверу иÑпользовалоÑÑŒ недейÑтвительное Ð¸Ð¼Ñ ÑƒÐ·Ð»Ð°. Проверьте URL-Ð°Ð´Ñ€ÐµÑ SL или Ð¸Ð¼Ñ ÑƒÐ·Ð»Ð° в Ñетке.
+ </string>
+ <string name="CertExpired">
+ Ð¡ÑƒÐ´Ñ Ð¿Ð¾ вÑему, иÑтек Ñрок дейÑÑ‚Ð²Ð¸Ñ Ñертификата, возвращенного Ñеткой. Проверьте времÑ, уÑтановленное в ÑиÑтеме, или обратитеÑÑŒ к админиÑтратору Ñетки.
+ </string>
+ <string name="CertKeyUsage">
+ Ðе удалоÑÑŒ иÑпользовать в протоколе SSL Ñертификат, возвращенный Ñервером. ОбратитеÑÑŒ к админиÑтратору Ñетки.
+ </string>
+ <string name="CertBasicConstraints">
+ Ð’ цепочке Ñертификатов Ñерверов Ñлишком много Ñертификатов. ОбратитеÑÑŒ к админиÑтратору Ñетки.
+ </string>
+ <string name="CertInvalidSignature">
+ Ðе удалоÑÑŒ проверить подпиÑÑŒ Ñертификата, возвращенного Ñервером Ñетки. ОбратитеÑÑŒ к админиÑтратору Ñетки.
+ </string>
+ <string name="LoginFailedNoNetwork">
+ Ошибка Ñети: не удалоÑÑŒ уÑтановить Ñоединение. Проверьте подключение к Ñети.
+ </string>
+ <string name="LoginFailed">
+ Ошибка входа.
+ </string>
+ <string name="Quit">
+ Выйти
+ </string>
+ <string name="create_account_url">
+ http://join.secondlife.com/
+ </string>
+ <string name="LoginFailedViewerNotPermitted">
+ У клиента, которым вы пользуетеÑÑŒ, больше нет доÑтупа к игре Second Life. Загрузить новую верÑию клиента можно по адреÑу
+http://secondlife.com/download
+
+Дополнительные ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ñм. в разделе вопроÑов и ответов по адреÑу
+http://secondlife.com/viewer-access-faq
+ </string>
+ <string name="LoginIntermediateOptionalUpdateAvailable">
+ ДоÑтупно необÑзательное обновление клиента: [VERSION]
+ </string>
+ <string name="LoginFailedRequiredUpdate">
+ Ðеобходимо обновить клиент: [VERSION]
+ </string>
+ <string name="LoginFailedAlreadyLoggedIn">
+ С Ñтого клиента уже выполнен вход.
+ </string>
+ <string name="LoginFailedAuthenticationFailed">
+ Извините! Ðе удаетÑÑ Ð¾Ð±ÐµÑпечить ваш вход.
+УбедитеÑÑŒ, что вы правильно ввели:
+ * Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ (например, bobsmith12 или steller.sunshine)
+ * пароль
+Кроме того, убедитеÑÑŒ, что режим Caps Lock отключен.
+ </string>
+ <string name="LoginFailedPasswordChanged">
+ Ð’ качеÑтве меры предоÑторожноÑти ваш пароль изменен.
+Перейдите на Ñтраницу Ñвоего аккаунта по адреÑу http://secondlife.com/password
+и ответьте на контрольный вопроÑ, чтобы воÑÑтановить Ñвой пароль
+ПриноÑим Ð¸Ð·Ð²Ð¸Ð½ÐµÐ½Ð¸Ñ Ð·Ð° неудобÑтво.
+ </string>
+ <string name="LoginFailedPasswordReset">
+ Ð’ нашу ÑиÑтему внеÑены изменениÑ, поÑтому вам Ñледует воÑÑтановить Ñвой пароль.
+Перейдите на Ñтраницу Ñвоего аккаунта по адреÑу http://secondlife.com/password
+и ответьте на контрольный вопроÑ, чтобы воÑÑтановить Ñвой пароль
+ПриноÑим Ð¸Ð·Ð²Ð¸Ð½ÐµÐ½Ð¸Ñ Ð·Ð° неудобÑтво.
+ </string>
+ <string name="LoginFailedEmployeesOnly">
+ Сайт Second Life временно закрыт на техничеÑкое обÑлуживание.
+Ð’ данное Ð²Ñ€ÐµÐ¼Ñ Ð²Ñ…Ð¾Ð´Ð¸Ñ‚ÑŒ могут только Ñотрудники.
+Обновление ÑоÑтоÑÐ½Ð¸Ñ Ñм. на веб-Ñтранице www.secondlife.com/status.
+ </string>
+ <string name="LoginFailedPremiumOnly">
+ Вход в Second Life временно ограничен, чтобы Ñохранить наивыÑшее качеÑтво игрового мира Ð´Ð»Ñ Ñ‚ÐµÐºÑƒÑ‰Ð¸Ñ… пользователей.
+
+Ð’ Ñто Ð²Ñ€ÐµÐ¼Ñ Ñƒ пользователей Ñ Ð±ÐµÑплатными аккаунтами не будет доÑтупа к Second Life, чтобы у тех, кто заплатил, было больше меÑта.
+ </string>
+ <string name="LoginFailedComputerProhibited">
+ ÐÐµÐ»ÑŒÐ·Ñ Ð²Ñ…Ð¾Ð´Ð¸Ñ‚ÑŒ в игру Second Life на Ñтом компьютере.
+ЕÑли вы Ñчитаете, что Ñто ошибка, отправьте Ñообщение по адреÑу
+support@secondlife.com.
+ </string>
+ <string name="LoginFailedAcountSuspended">
+ Ваш аккаунт не будет доÑтупен до
+[TIME] по тихоокеанÑкому времени.
+ </string>
+ <string name="LoginFailedAccountDisabled">
+ Ð’ данное Ð²Ñ€ÐµÐ¼Ñ Ð½Ð°Ð¼ не удаетÑÑ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÑŒ ваш запроÑ.
+ОбратитеÑÑŒ за помощью в Ñлужбу поддержки Second Life по адреÑу http://secondlife.com/support.
+ЕÑли вам не удаетÑÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ Ñвой пароль, позвоните по телефону (866) 476-9763.
+ </string>
+ <string name="LoginFailedTransformError">
+ При входе обнаружена неÑоглаÑованноÑÑ‚ÑŒ данных.
+Ðапишите ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ð¾ адреÑу support@secondlife.com.
+ </string>
+ <string name="LoginFailedAccountMaintenance">
+ ВыполнÑетÑÑ Ð½ÐµÐ±Ð¾Ð»ÑŒÑˆÐ¾Ðµ обÑлуживание вашего аккаунта.
+Ваш аккаунт не будет доÑтупен до
+[TIME] по тихоокеанÑкому времени.
+ЕÑли вы Ñчитаете, что Ñто ошибка, отправьте Ñообщение по адреÑу support@secondlife.com.
+ </string>
+ <string name="LoginFailedPendingLogoutFault">
+ Ð’ ответ на Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð²Ñ‹Ñ…Ð¾Ð´Ð° ÑимулÑтор возвратил Ñообщение о Ñбое.
+ </string>
+ <string name="LoginFailedPendingLogout">
+ Ð’ ÑиÑтеме выполнÑетÑÑ Ð²Ñ‹Ñ…Ð¾Ð´ Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ аккаунта.
+Она будет недоÑтупна до
+[TIME] по тихоокеанÑкому времени.
+ </string>
+ <string name="LoginFailedUnableToCreateSession">
+ Ðе удаетÑÑ Ñоздать допуÑтимый ÑеанÑ.
+ </string>
+ <string name="LoginFailedUnableToConnectToSimulator">
+ Ðе удаетÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÑŒÑÑ Ðº ÑимулÑтору.
+ </string>
+ <string name="LoginFailedRestrictedHours">
+ Вы можете входить в Second Life только
+от [START] до [END] по тихоокеанÑкому времени.
+Заходите в Ñто времÑ.
+ЕÑли вы Ñчитаете, что Ñто ошибка, отправьте Ñообщение по адреÑу support@secondlife.com.
+ </string>
+ <string name="LoginFailedIncorrectParameters">
+ Ðеправильные параметры.
+ЕÑли вы Ñчитаете, что Ñто ошибка, отправьте Ñообщение по адреÑу support@secondlife.com.
+ </string>
+ <string name="LoginFailedFirstNameNotAlphanumeric">
+ Ð˜Ð¼Ñ Ð´Ð¾Ð»Ð¶Ð½Ð¾ ÑоÑтоÑÑ‚ÑŒ только из букв и цифр.
+ЕÑли вы Ñчитаете, что Ñто ошибка, отправьте Ñообщение по адреÑу support@secondlife.com.
+ </string>
+ <string name="LoginFailedLastNameNotAlphanumeric">
+ Ð¤Ð°Ð¼Ð¸Ð»Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° ÑоÑтоÑÑ‚ÑŒ только из букв и цифр.
+ЕÑли вы Ñчитаете, что Ñто ошибка, отправьте Ñообщение по адреÑу support@secondlife.com.
+ </string>
+ <string name="LogoutFailedRegionGoingOffline">
+ Регион переходит в автономный режим.
+Попробуйте повторно войти через минуту.
+ </string>
+ <string name="LogoutFailedAgentNotInRegion">
+ Ðгент отÑутÑтвует в регионе.
+Попробуйте повторно войти через минуту.
+ </string>
+ <string name="LogoutFailedPendingLogin">
+ Вход в регион выполнен в другом ÑеанÑе.
+Попробуйте повторно войти через минуту.
+ </string>
+ <string name="LogoutFailedLoggingOut">
+ Ð”Ð»Ñ Ñ€ÐµÐ³Ð¸Ð¾Ð½Ð° выполнен выход в предыдущем ÑеанÑе.
+Попробуйте повторно войти через минуту.
+ </string>
+ <string name="LogoutFailedStillLoggingOut">
+ Ð”Ð»Ñ Ñ€ÐµÐ³Ð¸Ð¾Ð½Ð° вÑе еще выполнÑетÑÑ Ð²Ñ‹Ñ…Ð¾Ð´ в предыдущем ÑеанÑе.
+Попробуйте повторно войти через минуту.
+ </string>
+ <string name="LogoutSucceeded">
+ Ð’ поÑледнем ÑеанÑе Ð´Ð»Ñ Ñ€ÐµÐ³Ð¸Ð¾Ð½Ð° выполнен выход.
+Попробуйте повторно войти через минуту.
+ </string>
+ <string name="LogoutFailedLogoutBegun">
+ Ð”Ð»Ñ Ñ€ÐµÐ³Ð¸Ð¾Ð½Ð° начат процеÑÑ Ð²Ñ‹Ñ…Ð¾Ð´Ð°.
+Попробуйте повторно войти через минуту.
+ </string>
+ <string name="LoginFailedLoggingOutSession">
+ Во Ð²Ñ€ÐµÐ¼Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ поÑледнего ÑеанÑа ÑиÑтема начала процедуру выхода.
+Попробуйте повторно войти через минуту.
+ </string>
+ <string name="AgentLostConnection">
+ Возможно, в Ñтом регионе возникли проблемы. Проверьте подключение к Интернету.
+ </string>
+ <string name="SavingSettings">
+ Сохранение наÑтроек...
+ </string>
+ <string name="LoggingOut">
+ ВыполнÑетÑÑ Ð²Ñ‹Ñ…Ð¾Ð´...
+ </string>
+ <string name="ShuttingDown">
+ Игра закрываетÑÑ...
+ </string>
+ <string name="YouHaveBeenDisconnected">
+ Произошло отключение от региона, в котором вы находилиÑÑŒ.
+ </string>
+ <string name="SentToInvalidRegion">
+ Ð’Ñ‹ отправлены в недейÑтвительный регион.
+ </string>
+ <string name="TestingDisconnect">
+ ТеÑтирование Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð°
+ </string>
+ <string name="TooltipPerson">
+ Человек
+ </string>
+ <string name="TooltipNoName">
+ (нет имени)
+ </string>
+ <string name="TooltipOwner">
+ Владелец:
+ </string>
+ <string name="TooltipPublic">
+ ОбщедоÑтупно
+ </string>
+ <string name="TooltipIsGroup">
+ (группа)
+ </string>
+ <string name="TooltipForSaleL$">
+ ПродаетÑÑ: L$[AMOUNT]
+ </string>
+ <string name="TooltipFlagGroupBuild">
+ Стройка в ÑоÑтаве группы
+ </string>
+ <string name="TooltipFlagNoBuild">
+ Стройка запрещена
+ </string>
+ <string name="TooltipFlagNoEdit">
+ Стройка в ÑоÑтаве группы
+ </string>
+ <string name="TooltipFlagNotSafe">
+ ÐебезопаÑно
+ </string>
+ <string name="TooltipFlagNoFly">
+ Полеты запрещены
+ </string>
+ <string name="TooltipFlagGroupScripts">
+ Скрипты Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹
+ </string>
+ <string name="TooltipFlagNoScripts">
+ Скрипты запрещены
+ </string>
+ <string name="TooltipLand">
+ ЗемлÑ:
+ </string>
+ <string name="TooltipMustSingleDrop">
+ Сюда можно перетащить только одну вещь
+ </string>
+ <string name="TooltipPrice" value="L$[AMOUNT]:"/>
+ <string name="TooltipOutboxDragToWorld">
+ ÐÐµÐ»ÑŒÐ·Ñ Ð²Ñ‹Ð»Ð¾Ð¶Ð¸Ñ‚ÑŒ предметы из папке «Торговые иÑходÑщие»
+ </string>
+ <string name="TooltipOutboxNoTransfer">
+ ЧаÑÑ‚ÑŒ Ñтих объектов Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¾Ð´Ð°Ñ‚ÑŒ или передать.
+ </string>
+ <string name="TooltipOutboxNotInInventory">
+ Ваша папка «Торговые иÑходÑщие» может получать вещи только непоÑредÑтвенно из вашего инвентарÑ
+ </string>
+ <string name="TooltipOutboxWorn">
+ ÐоÑимые предметы Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ð¾Ð¼ÐµÑтить в папку «Торговые иÑходÑщие»
+ </string>
+ <string name="TooltipOutboxCallingCard">
+ Визитки Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ð¾Ð¼ÐµÑтить в папку «Торговые иÑходÑщие»
+ </string>
+ <string name="TooltipOutboxFolderLevels">
+ Глубина Ð²Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð°Ð¿Ð¾Ðº превышает 3
+ </string>
+ <string name="TooltipOutboxTooManyFolders">
+ Ð’ папке верхнего ÑƒÑ€Ð¾Ð²Ð½Ñ Ð±Ð¾Ð»ÐµÐµ 20 подпапок
+ </string>
+ <string name="TooltipOutboxTooManyObjects">
+ Ð’ папке верхнего ÑƒÑ€Ð¾Ð²Ð½Ñ Ð±Ð¾Ð»ÐµÐµ 200 предметов
+ </string>
+ <string name="TooltipDragOntoOwnChild">
+ Папку Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÑтить в ее подпапку
+ </string>
+ <string name="TooltipDragOntoSelf">
+ Папку Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÑтить Ñаму в ÑебÑ
+ </string>
+ <string name="TooltipHttpUrl">
+ Щелкните, чтобы проÑмотреть Ñту веб-Ñтраницу
+ </string>
+ <string name="TooltipSLURL">
+ Щелкните, чтобы проÑмотреть информацию об Ñтом меÑте
+ </string>
+ <string name="TooltipAgentUrl">
+ Щелкните, чтобы проÑмотреть профиль Ñтого жителÑ
+ </string>
+ <string name="TooltipAgentInspect">
+ Узнать больше об Ñтом жителе
+ </string>
+ <string name="TooltipAgentMute">
+ Щелкните, чтобы не Ñлышать Ñтого жителÑ
+ </string>
+ <string name="TooltipAgentUnmute">
+ Щелкните, чтобы Ñлышать Ñтого жителÑ
+ </string>
+ <string name="TooltipAgentIM">
+ Щелкните, чтобы открыть личный чат Ñ Ñтим жителем
+ </string>
+ <string name="TooltipAgentPay">
+ Щелкните, чтобы заплатить жителю
+ </string>
+ <string name="TooltipAgentOfferTeleport">
+ Щелкните, чтобы предложить Ñтому жителю телепортацию
+ </string>
+ <string name="TooltipAgentRequestFriend">
+ Щелкните, чтобы предложить Ñтому жителю дружбу
+ </string>
+ <string name="TooltipGroupUrl">
+ Щелкните, чтобы проÑмотреть опиÑание группы
+ </string>
+ <string name="TooltipEventUrl">
+ Щелкните, чтобы проÑмотреть опиÑание ÑобытиÑ
+ </string>
+ <string name="TooltipClassifiedUrl">
+ Щелкните, чтобы проÑмотреть Ñту рекламу
+ </string>
+ <string name="TooltipParcelUrl">
+ Щелкните, чтобы поÑмотреть опиÑание учаÑтка
+ </string>
+ <string name="TooltipTeleportUrl">
+ Щелкните, чтобы телепортироватьÑÑ Ð² Ñто меÑто
+ </string>
+ <string name="TooltipObjectIMUrl">
+ Щелкните, открыть опиÑание Ñтого объекта
+ </string>
+ <string name="TooltipMapUrl">
+ Щелкните, чтобы поÑмотреть Ñто меÑто на карте
+ </string>
+ <string name="TooltipSLAPP">
+ Щелкните, чтобы выполнить команду secondlife://
+ </string>
+ <string name="CurrentURL" value="Текущий URL-адреÑ: [CurrentURL]"/>
+ <string name="SLurlLabelTeleport">
+ ТелепортироватьÑÑ Ð²
+ </string>
+ <string name="SLurlLabelShowOnMap">
+ Показать карту длÑ
+ </string>
+ <string name="SLappAgentMute">
+ Откл. звук
+ </string>
+ <string name="SLappAgentUnmute">
+ Вкл. звук
+ </string>
+ <string name="SLappAgentIM">
+ IM
+ </string>
+ <string name="SLappAgentPay">
+ Заплатить
+ </string>
+ <string name="SLappAgentOfferTeleport">
+ Предложить телепортацию в
+ </string>
+ <string name="SLappAgentRequestFriend">
+ Предложить дружбу
+ </string>
+ <string name="BUTTON_CLOSE_DARWIN">
+ Закрыть (⌘W)
+ </string>
+ <string name="BUTTON_CLOSE_WIN">
+ Закрыть (Ctrl+W)
+ </string>
+ <string name="BUTTON_CLOSE_CHROME">
+ Закрыть
+ </string>
+ <string name="BUTTON_RESTORE">
+ Развернуть
+ </string>
+ <string name="BUTTON_MINIMIZE">
+ Свернуть
+ </string>
+ <string name="BUTTON_TEAR_OFF">
+ Отделить
+ </string>
+ <string name="BUTTON_DOCK">
+ ПриÑоединить
+ </string>
+ <string name="BUTTON_HELP">
+ Показать Ñправку
+ </string>
+ <string name="Searching">
+ ПоиÑк...
+ </string>
+ <string name="NoneFound">
+ Ðичего не найдено.
+ </string>
+ <string name="RetrievingData">
+ Получение...
+ </string>
+ <string name="ReleaseNotes">
+ Заметки о выпуÑке
+ </string>
+ <string name="LoadingData">
+ Загрузка...
+ </string>
+ <string name="AvatarNameNobody">
+ (без имени)
+ </string>
+ <string name="AvatarNameWaiting">
+ (ожидание)
+ </string>
+ <string name="AvatarNameMultiple">
+ (неÑколько)
+ </string>
+ <string name="GroupNameNone">
+ (нет)
+ </string>
+ <string name="AvalineCaller">
+ [ORDER] абонента Avaline
+ </string>
+ <string name="AssetErrorNone">
+ Ошибок нет
+ </string>
+ <string name="AssetErrorRequestFailed">
+ Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°: Ñбой
+ </string>
+ <string name="AssetErrorNonexistentFile">
+ Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°: файл не ÑущеÑтвует
+ </string>
+ <string name="AssetErrorNotInDatabase">
+ Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°: актив не найден в базе данных
+ </string>
+ <string name="AssetErrorEOF">
+ Конец файла
+ </string>
+ <string name="AssetErrorCannotOpenFile">
+ Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ файл
+ </string>
+ <string name="AssetErrorFileNotFound">
+ Файл не найден
+ </string>
+ <string name="AssetErrorTCPTimeout">
+ Вышло Ð²Ñ€ÐµÐ¼Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð¸ файла
+ </string>
+ <string name="AssetErrorCircuitGone">
+ Обрыв в канале
+ </string>
+ <string name="AssetErrorPriceMismatch">
+ Ðе доÑтигнута договоренноÑÑ‚ÑŒ по цене между клиентом и Ñервером
+ </string>
+ <string name="AssetErrorUnknownStatus">
+ ÐеизвеÑтный ÑтатуÑ
+ </string>
+ <string name="texture">
+ текÑтуру
+ </string>
+ <string name="sound">
+ звук
+ </string>
+ <string name="calling card">
+ визитку
+ </string>
+ <string name="landmark">
+ закладку
+ </string>
+ <string name="legacy script">
+ Ñтарый Ñкрипт
+ </string>
+ <string name="clothing">
+ одежду
+ </string>
+ <string name="object">
+ объект
+ </string>
+ <string name="note card">
+ заметку
+ </string>
+ <string name="folder">
+ папку
+ </string>
+ <string name="root">
+ корневой каталог
+ </string>
+ <string name="lsl2 script">
+ Ñкрипт LSL2
+ </string>
+ <string name="lsl bytecode">
+ байт-код LSL
+ </string>
+ <string name="tga texture">
+ текÑтуру TGA
+ </string>
+ <string name="body part">
+ чаÑÑ‚ÑŒ тела
+ </string>
+ <string name="snapshot">
+ Ñнимок
+ </string>
+ <string name="lost and found">
+ найденные вещи
+ </string>
+ <string name="targa image">
+ изображение TGA
+ </string>
+ <string name="trash">
+ Ñодержимое корзины
+ </string>
+ <string name="jpeg image">
+ изображение JPEG
+ </string>
+ <string name="animation">
+ анимацию
+ </string>
+ <string name="gesture">
+ жеÑÑ‚
+ </string>
+ <string name="simstate">
+ ÑоÑтоÑние ÑимулÑции
+ </string>
+ <string name="favorite">
+ избранное
+ </string>
+ <string name="symbolic link">
+ ÑÑылку
+ </string>
+ <string name="symbolic folder link">
+ ÑÑылку на папку
+ </string>
+ <string name="mesh">
+ Ñетка
+ </string>
+ <string name="AvatarEditingAppearance">
+ (внешний вид редактируетÑÑ)
+ </string>
+ <string name="AvatarAway">
+ Ðет на меÑте
+ </string>
+ <string name="AvatarBusy">
+ Ðе беÑпокоить
+ </string>
+ <string name="AvatarMuted">
+ Ð’ черном ÑпиÑке
+ </string>
+ <string name="anim_express_afraid">
+ Страх
+ </string>
+ <string name="anim_express_anger">
+ Гнев
+ </string>
+ <string name="anim_away">
+ Ðет на меÑте
+ </string>
+ <string name="anim_backflip">
+ Сальто назад
+ </string>
+ <string name="anim_express_laugh">
+ Хохот
+ </string>
+ <string name="anim_express_toothsmile">
+ Ð¨Ð¸Ñ€Ð¾ÐºÐ°Ñ ÑƒÐ»Ñ‹Ð±ÐºÐ°
+ </string>
+ <string name="anim_blowkiss">
+ Воздушный поцелуй
+ </string>
+ <string name="anim_express_bored">
+ Скука
+ </string>
+ <string name="anim_bow">
+ Поклон
+ </string>
+ <string name="anim_clap">
+ Хлопок
+ </string>
+ <string name="anim_courtbow">
+ Учтивый поклон
+ </string>
+ <string name="anim_express_cry">
+ Плач
+ </string>
+ <string name="anim_dance1">
+ Танец 1
+ </string>
+ <string name="anim_dance2">
+ Танец 2
+ </string>
+ <string name="anim_dance3">
+ Танец 3
+ </string>
+ <string name="anim_dance4">
+ Танец 4
+ </string>
+ <string name="anim_dance5">
+ Танец 5
+ </string>
+ <string name="anim_dance6">
+ Танец 6
+ </string>
+ <string name="anim_dance7">
+ Танец 7
+ </string>
+ <string name="anim_dance8">
+ Танец 8
+ </string>
+ <string name="anim_express_disdain">
+ Презрение
+ </string>
+ <string name="anim_drink">
+ Питьё
+ </string>
+ <string name="anim_express_embarrased">
+ Смущение
+ </string>
+ <string name="anim_angry_fingerwag">
+ Погрозить пальцем
+ </string>
+ <string name="anim_fist_pump">
+ Поднимание кулака
+ </string>
+ <string name="anim_yoga_float">
+ ПарÑщий Будда
+ </string>
+ <string name="anim_express_frown">
+ ХмуроÑÑ‚ÑŒ
+ </string>
+ <string name="anim_impatient">
+ Ðетерпение
+ </string>
+ <string name="anim_jumpforjoy">
+ Прыжок радоÑти
+ </string>
+ <string name="anim_kissmybutt">
+ Поцелуй в зад
+ </string>
+ <string name="anim_express_kiss">
+ Поцелуй
+ </string>
+ <string name="anim_laugh_short">
+ Смех
+ </string>
+ <string name="anim_musclebeach">
+ ДемонÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð¼ÑƒÑкулов
+ </string>
+ <string name="anim_no_unhappy">
+ ГруÑтный отказ
+ </string>
+ <string name="anim_no_head">
+ Отказ
+ </string>
+ <string name="anim_nyanya">
+ ÐÑ-нÑ-нÑ
+ </string>
+ <string name="anim_punch_onetwo">
+ Двойка руками
+ </string>
+ <string name="anim_express_open_mouth">
+ Открывание рта
+ </string>
+ <string name="anim_peace">
+ Дружелюбие
+ </string>
+ <string name="anim_point_you">
+ Указывание на кого-то
+ </string>
+ <string name="anim_point_me">
+ Указывание на ÑебÑ
+ </string>
+ <string name="anim_punch_l">
+ Удар левой рукой
+ </string>
+ <string name="anim_punch_r">
+ Удар правой рукой
+ </string>
+ <string name="anim_rps_countdown">
+ Счет в КÐБ
+ </string>
+ <string name="anim_rps_paper">
+ КÐБ – бумага
+ </string>
+ <string name="anim_rps_rock">
+ КÐБ – камень
+ </string>
+ <string name="anim_rps_scissors">
+ КÐБ – ножницы
+ </string>
+ <string name="anim_express_repulsed">
+ Отказ
+ </string>
+ <string name="anim_kick_roundhouse_r">
+ «Вертушка»
+ </string>
+ <string name="anim_express_sad">
+ ГруÑÑ‚ÑŒ
+ </string>
+ <string name="anim_salute">
+ ПриветÑтвие
+ </string>
+ <string name="anim_shout">
+ Крик
+ </string>
+ <string name="anim_express_shrug">
+ Пожимание плечами
+ </string>
+ <string name="anim_express_smile">
+ Улыбка
+ </string>
+ <string name="anim_smoke_idle">
+ Курение не в затÑжку
+ </string>
+ <string name="anim_smoke_inhale">
+ Курение в затÑжку
+ </string>
+ <string name="anim_smoke_throw_down">
+ БроÑить Ñигарету
+ </string>
+ <string name="anim_express_surprise">
+ Удивление
+ </string>
+ <string name="anim_sword_strike_r">
+ Удар мечом
+ </string>
+ <string name="anim_angry_tantrum">
+ Ð’Ñпышка гнева
+ </string>
+ <string name="anim_express_tongue_out">
+ Показ Ñзыка
+ </string>
+ <string name="anim_hello">
+ ПриветÑтвие рукой
+ </string>
+ <string name="anim_whisper">
+ Шепот
+ </string>
+ <string name="anim_whistle">
+ СвиÑÑ‚
+ </string>
+ <string name="anim_express_wink">
+ Подмигивание
+ </string>
+ <string name="anim_wink_hollywood">
+ Подмигивание по-голливудÑки
+ </string>
+ <string name="anim_express_worry">
+ БеÑпокойÑтво
+ </string>
+ <string name="anim_yes_happy">
+ РадоÑтное ÑоглаÑие
+ </string>
+ <string name="anim_yes_head">
+ СоглаÑие
+ </string>
+ <string name="multiple_textures">
+ ÐеÑколько
+ </string>
+ <string name="texture_loading">
+ Загрузка...
+ </string>
+ <string name="worldmap_offline">
+ Ðе в Ñети
+ </string>
+ <string name="worldmap_item_tooltip_format">
+ [AREA] м² L$[PRICE]
+ </string>
+ <string name="worldmap_results_none_found">
+ Ðичего не найдено.
+ </string>
+ <string name="Ok">
+ ОК
+ </string>
+ <string name="Premature end of file">
+ Преждевременный конец файла
+ </string>
+ <string name="ST_NO_JOINT">
+ Ðе удаетÑÑ Ð½Ð°Ð¹Ñ‚Ð¸ объект ROOT или JOINT.
+ </string>
+ <string name="whisper">
+ шепчет:
+ </string>
+ <string name="shout">
+ кричит:
+ </string>
+ <string name="ringing">
+ Подключение к голоÑовому чату...
+ </string>
+ <string name="connected">
+ Подключение уÑтановлено
+ </string>
+ <string name="unavailable">
+ Ð’ Ñтом меÑте голоÑÐ¾Ð²Ð°Ñ ÑвÑзь недоÑтупна
+ </string>
+ <string name="hang_up">
+ Отключение от общего голоÑового чата
+ </string>
+ <string name="reconnect_nearby">
+ Будет уÑтановлено подключение к локальному голоÑовому чату
+ </string>
+ <string name="ScriptQuestionCautionChatGranted">
+ Объекту «[OBJECTNAME]», который принадлежит пользователю «[OWNERNAME]» и находитÑÑ Ð² [REGIONPOS] в регионе «[REGIONNAME]», предоÑтавлено разрешение: [PERMISSIONS].
+ </string>
+ <string name="ScriptQuestionCautionChatDenied">
+ Объекту «[OBJECTNAME]», который принадлежит пользователю «[OWNERNAME]» и находитÑÑ Ð² [REGIONPOS] в регионе «[REGIONNAME]», отказано в разрешении: [PERMISSIONS].
+ </string>
+ <string name="ScriptTakeMoney">
+ У Ð²Ð°Ñ Ð±ÐµÑ€ÑƒÑ‚ Linden-деньги
+ </string>
+ <string name="ActOnControlInputs">
+ ДейÑÑ‚Ð²Ð¸Ñ Ð¿Ñ€Ð¸ активации Ñлементов управлениÑ
+ </string>
+ <string name="RemapControlInputs">
+ Ðовое ÑопоÑтавление Ñлементов управлениÑ
+ </string>
+ <string name="AnimateYourAvatar">
+ Ðнимировать ваш аватар
+ </string>
+ <string name="AttachToYourAvatar">
+ Прикрепить к аватару
+ </string>
+ <string name="ReleaseOwnership">
+ ОтказатьÑÑ Ð¾Ñ‚ владениÑ, Ñделать вÑеобщим
+ </string>
+ <string name="LinkAndDelink">
+ СвÑзать или отменить ÑвÑзь Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼Ð¸ объектами
+ </string>
+ <string name="AddAndRemoveJoints">
+ Добавление и удаление ÑвÑзей Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼Ð¸ объектами
+ </string>
+ <string name="ChangePermissions">
+ Изменить разрешениÑ
+ </string>
+ <string name="TrackYourCamera">
+ Следить за камерой
+ </string>
+ <string name="ControlYourCamera">
+ УправлÑÑ‚ÑŒ камерой
+ </string>
+ <string name="NotConnected">
+ Ðет подключениÑ
+ </string>
+ <string name="SIM_ACCESS_PG">
+ Общий
+ </string>
+ <string name="SIM_ACCESS_MATURE">
+ Умеренный
+ </string>
+ <string name="SIM_ACCESS_ADULT">
+ Ð”Ð»Ñ Ð²Ð·Ñ€Ð¾Ñлых
+ </string>
+ <string name="SIM_ACCESS_DOWN">
+ Ðе в Ñети
+ </string>
+ <string name="SIM_ACCESS_MIN">
+ ÐеизвеÑтно
+ </string>
+ <string name="land_type_unknown">
+ (неизвеÑтно)
+ </string>
+ <string name="Estate / Full Region">
+ Землевладение/веÑÑŒ регион
+ </string>
+ <string name="Estate / Homestead">
+ Землевладение/помеÑтье
+ </string>
+ <string name="Mainland / Homestead">
+ Материк/помеÑтье
+ </string>
+ <string name="Mainland / Full Region">
+ Материк/веÑÑŒ регион
+ </string>
+ <string name="all_files">
+ Ð’Ñе файлы
+ </string>
+ <string name="sound_files">
+ Звуки
+ </string>
+ <string name="animation_files">
+ ÐнимациÑ
+ </string>
+ <string name="image_files">
+ ИзображениÑ
+ </string>
+ <string name="save_file_verb">
+ Сохранить
+ </string>
+ <string name="load_file_verb">
+ Загрузить
+ </string>
+ <string name="targa_image_files">
+ Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ TGA
+ </string>
+ <string name="bitmap_image_files">
+ Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ BMP
+ </string>
+ <string name="avi_movie_file">
+ Видео AVI
+ </string>
+ <string name="xaf_animation_file">
+ ÐÐ½Ð¸Ð¼Ð°Ñ†Ð¸Ñ XAF
+ </string>
+ <string name="xml_file">
+ XML-файл
+ </string>
+ <string name="raw_file">
+ RAW-файл
+ </string>
+ <string name="compressed_image_files">
+ ÐеÑжатые изображениÑ
+ </string>
+ <string name="load_files">
+ Загрузить файлы
+ </string>
+ <string name="choose_the_directory">
+ Выбрать каталог
+ </string>
+ <string name="script_files">
+ Скрипты
+ </string>
+ <string name="AvatarSetNotAway">
+ Ðа меÑте
+ </string>
+ <string name="AvatarSetAway">
+ Ðет на меÑте
+ </string>
+ <string name="AvatarSetNotBusy">
+ Ðе занÑÑ‚(а)
+ </string>
+ <string name="AvatarSetBusy">
+ Ðе беÑпокоить
+ </string>
+ <string name="shape">
+ Фигура
+ </string>
+ <string name="skin">
+ Кожа
+ </string>
+ <string name="hair">
+ ВолоÑÑ‹
+ </string>
+ <string name="eyes">
+ Глаза
+ </string>
+ <string name="shirt">
+ Рубашка
+ </string>
+ <string name="pants">
+ Брюки
+ </string>
+ <string name="shoes">
+ Обувь
+ </string>
+ <string name="socks">
+ ÐоÑки
+ </string>
+ <string name="jacket">
+ Пиджак
+ </string>
+ <string name="gloves">
+ Перчатки
+ </string>
+ <string name="undershirt">
+ Майка
+ </string>
+ <string name="underpants">
+ ТруÑÑ‹
+ </string>
+ <string name="skirt">
+ Юбка
+ </string>
+ <string name="alpha">
+ Ðльфа-маÑка
+ </string>
+ <string name="tattoo">
+ Тату
+ </string>
+ <string name="physics">
+ ФизичеÑкие данные
+ </string>
+ <string name="invalid">
+ ошибка
+ </string>
+ <string name="none">
+ нет
+ </string>
+ <string name="shirt_not_worn">
+ Рубашка не надета
+ </string>
+ <string name="pants_not_worn">
+ Брюки не надеты
+ </string>
+ <string name="shoes_not_worn">
+ Обувь не надета
+ </string>
+ <string name="socks_not_worn">
+ ÐоÑки не надеты
+ </string>
+ <string name="jacket_not_worn">
+ Пиджак не надет
+ </string>
+ <string name="gloves_not_worn">
+ Перчатки не надеты
+ </string>
+ <string name="undershirt_not_worn">
+ Майка не надета
+ </string>
+ <string name="underpants_not_worn">
+ ТруÑÑ‹ не надеты
+ </string>
+ <string name="skirt_not_worn">
+ Юбка не надета
+ </string>
+ <string name="alpha_not_worn">
+ Ðльфа-маÑка не надета
+ </string>
+ <string name="tattoo_not_worn">
+ Тату не надето
+ </string>
+ <string name="physics_not_worn">
+ Физика не учитываетÑÑ
+ </string>
+ <string name="invalid_not_worn">
+ ошибка
+ </string>
+ <string name="create_new_shape">
+ Создать фигуру
+ </string>
+ <string name="create_new_skin">
+ Создать кожу
+ </string>
+ <string name="create_new_hair">
+ Создать волоÑÑ‹
+ </string>
+ <string name="create_new_eyes">
+ Создать глаза
+ </string>
+ <string name="create_new_shirt">
+ Создать рубашку
+ </string>
+ <string name="create_new_pants">
+ Создать брюки
+ </string>
+ <string name="create_new_shoes">
+ Создать обувь
+ </string>
+ <string name="create_new_socks">
+ Создать ноÑки
+ </string>
+ <string name="create_new_jacket">
+ Создать пиджак
+ </string>
+ <string name="create_new_gloves">
+ Создать перчатки
+ </string>
+ <string name="create_new_undershirt">
+ Создать майку
+ </string>
+ <string name="create_new_underpants">
+ Создать труÑÑ‹
+ </string>
+ <string name="create_new_skirt">
+ Создать юбку
+ </string>
+ <string name="create_new_alpha">
+ Создать альфа-маÑку
+ </string>
+ <string name="create_new_tattoo">
+ Создать тату
+ </string>
+ <string name="create_new_physics">
+ Создать физику
+ </string>
+ <string name="create_new_invalid">
+ ошибка
+ </string>
+ <string name="NewWearable">
+ Создать [WEARABLE_ITEM]
+ </string>
+ <string name="next">
+ Далее
+ </string>
+ <string name="ok">
+ ОК
+ </string>
+ <string name="GroupNotifyGroupNotice">
+ Групповое уведомление
+ </string>
+ <string name="GroupNotifyGroupNotices">
+ Групповые уведомлениÑ
+ </string>
+ <string name="GroupNotifySentBy">
+ Отправитель
+ </string>
+ <string name="GroupNotifyAttached">
+ Вложение:
+ </string>
+ <string name="GroupNotifyViewPastNotices">
+ ЗдеÑÑŒ можно проÑмотреть поÑледние ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ отказатьÑÑ Ð¾Ñ‚ их получениÑ.
+ </string>
+ <string name="GroupNotifyOpenAttachment">
+ Открыть вложение
+ </string>
+ <string name="GroupNotifySaveAttachment">
+ Сохранить вложение
+ </string>
+ <string name="TeleportOffer">
+ Предложена телепортациÑ
+ </string>
+ <string name="StartUpNotifications">
+ Пока вы отÑутÑтвовали, пришли новые уведомлениÑ.
+ </string>
+ <string name="OverflowInfoChannelString">
+ Других уведомлений: %d
+ </string>
+ <string name="BodyPartsRightArm">
+ ÐŸÑ€Ð°Ð²Ð°Ñ Ñ€ÑƒÐºÐ°
+ </string>
+ <string name="BodyPartsHead">
+ Голова
+ </string>
+ <string name="BodyPartsLeftArm">
+ Ð›ÐµÐ²Ð°Ñ Ñ€ÑƒÐºÐ°
+ </string>
+ <string name="BodyPartsLeftLeg">
+ Ð›ÐµÐ²Ð°Ñ Ð½Ð¾Ð³Ð°
+ </string>
+ <string name="BodyPartsTorso">
+ ТорÑ
+ </string>
+ <string name="BodyPartsRightLeg">
+ ÐŸÑ€Ð°Ð²Ð°Ñ Ð½Ð¾Ð³Ð°
+ </string>
+ <string name="GraphicsQualityLow">
+ низкаÑ
+ </string>
+ <string name="GraphicsQualityMid">
+ ÑреднÑÑ
+ </string>
+ <string name="GraphicsQualityHigh">
+ выÑокаÑ
+ </string>
+ <string name="LeaveMouselook">
+ Ðажмите ESC, чтобы вернутьÑÑ Ðº обычному обзору
+ </string>
+ <string name="InventoryNoMatchingItems">
+ Ðе нашли того, что вам нужно? ВоÑпользуйтеÑÑŒ [secondlife:///app/search/all/[SEARCH_TERM] поиÑком].
+ </string>
+ <string name="PlacesNoMatchingItems">
+ Ðе нашли того, что вам нужно? ВоÑпользуйтеÑÑŒ [secondlife:///app/search/places/[SEARCH_TERM] поиÑком].
+ </string>
+ <string name="FavoritesNoMatchingItems">
+ Перетащите Ñюда закладку, чтобы добавить ее в ÑпиÑок избранного.
+ </string>
+ <string name="InventoryNoTexture">
+ Ð’ вашем инвентаре нет копии Ñтой текÑтуры
+ </string>
+ <string name="InventoryInboxNoItems">
+ ЗдеÑÑŒ будут показаны ваши покупки из торгового центра. Их можно будет перетащить в ваш инвентарь Ð´Ð»Ñ Ð¸ÑпользованиÑ.
+ </string>
+ <string name="MarketplaceURL">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/
+ </string>
+ <string name="MarketplaceURL_CreateStore">
+ http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.4
+ </string>
+ <string name="MarketplaceURL_Dashboard">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard
+ </string>
+ <string name="MarketplaceURL_Imports">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports
+ </string>
+ <string name="MarketplaceURL_LearnMore">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more
+ </string>
+ <string name="InventoryOutboxNotMerchantTitle">
+ Продавать вещи в торговом центре может кто угодно.
+ </string>
+ <string name="InventoryOutboxNotMerchantTooltip"/>
+ <string name="InventoryOutboxNotMerchant">
+ ЕÑли вы хотите Ñтать торговцем, [[MARKETPLACE_CREATE_STORE_URL] Ñоздайте магазин].
+ </string>
+ <string name="InventoryOutboxNoItemsTitle">
+ Ваша папка «ИÑходÑщие» пуÑта.
+ </string>
+ <string name="InventoryOutboxNoItemsTooltip"/>
+ <string name="InventoryOutboxNoItems">
+ Перетащите папки в Ñту облаÑÑ‚ÑŒ и щелкните «Отправить в торговый центр», чтобы выÑтавить их на продажу в [[MARKETPLACE_DASHBOARD_URL] Торговом центре].
+ </string>
+ <string name="Marketplace Error None">
+ Ошибок нет
+ </string>
+ <string name="Marketplace Error Not Merchant">
+ Ошибка. Прежде чем отправлÑÑ‚ÑŒ вещи в магазин, необходимо зарегиÑтрироватьÑÑ ÐºÐ°Ðº торговец (беÑплатно).
+ </string>
+ <string name="Marketplace Error Empty Folder">
+ Ошибка. Ð’ Ñтой папке нет контента.
+ </string>
+ <string name="Marketplace Error Unassociated Products">
+ Ошибка. Ðе удаетÑÑ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‚ÑŒ Ñту вещь, поÑкольку в вашем торговом аккаунте Ñлишком много вещей, не ÑвÑзанных Ñ Ð¿Ñ€Ð¾Ð´ÑƒÐºÑ‚Ð°Ð¼Ð¸. Чтобы иÑправить Ñту ошибку, войдите на веб-Ñайт торгового центра и уменьшите чиÑло Ñвоих вещей, которые ни Ñ Ñ‡ÐµÐ¼ не ÑвÑзаны.
+ </string>
+ <string name="Marketplace Error Object Limit">
+ Ошибка. Эта вещь Ñодержит Ñлишком много объектов. ИÑправьте Ñту ошибку, Ñложив объекты в коробки и уменьшив их общее чиÑло (должно быть меньше 200).
+ </string>
+ <string name="Marketplace Error Folder Depth">
+ Ошибка. Эта вещь Ñодержит Ñлишком много уровней вложенных папок. Измените Ñтруктуру так, чтобы уровней вложенных папок было не более 3.
+ </string>
+ <string name="Marketplace Error Unsellable Item">
+ Ошибка. Эту вещь Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¾Ð´Ð°Ñ‚ÑŒ в магазине.
+ </string>
+ <string name="Marketplace Error Internal Import">
+ Ошибка. Эта вещь Ñоздает проблему. Повторите попытку позже.
+ </string>
+ <string name="Open landmarks">
+ Открыть закладки
+ </string>
+ <string name="no_transfer" value="(не передаетÑÑ)"/>
+ <string name="no_modify" value="(не изменÑетÑÑ)"/>
+ <string name="no_copy" value="(не копируетÑÑ)"/>
+ <string name="worn" value="(ноÑитÑÑ)"/>
+ <string name="link" value="(ÑÑылка)"/>
+ <string name="broken_link" value="(broken_link)"/>
+ <string name="LoadingContents">
+ Загрузка Ñодержимого...
+ </string>
+ <string name="NoContents">
+ Ðет контента
+ </string>
+ <string name="WornOnAttachmentPoint" value="(где ноÑитÑÑ: [ATTACHMENT_POINT])"/>
+ <string name="ActiveGesture" value="[GESLABEL] (активно)"/>
+ <string name="PermYes">
+ Да
+ </string>
+ <string name="PermNo">
+ Ðет
+ </string>
+ <string name="Chat Message" value="Чат:"/>
+ <string name="Sound" value="Звук:"/>
+ <string name="Wait" value="--- Ждите:"/>
+ <string name="AnimFlagStop" value="ОÑтановить анимацию:"/>
+ <string name="AnimFlagStart" value="Ðачать анимацию:"/>
+ <string name="Wave" value="ПриветÑтвие рукой"/>
+ <string name="GestureActionNone" value="Ðет"/>
+ <string name="HelloAvatar" value="Привет, аватар!"/>
+ <string name="ViewAllGestures" value="ПроÑмотреть вÑе &gt;&gt;"/>
+ <string name="GetMoreGestures" value="Дополнительно &gt;&gt;"/>
+ <string name="Animations" value="ÐнимациÑ,"/>
+ <string name="Calling Cards" value="Визитки,"/>
+ <string name="Clothing" value="Одежда,"/>
+ <string name="Gestures" value="ЖеÑÑ‚Ñ‹,"/>
+ <string name="Landmarks" value="Закладки,"/>
+ <string name="Notecards" value="Заметки,"/>
+ <string name="Objects" value="Объекты,"/>
+ <string name="Scripts" value="Скрипты,"/>
+ <string name="Sounds" value="Звуки,"/>
+ <string name="Textures" value="ТекÑтуры,"/>
+ <string name="Snapshots" value="Снимки,"/>
+ <string name="No Filters" value="Ðет"/>
+ <string name="Since Logoff" value="- С момента выхода"/>
+ <string name="InvFolder My Inventory">
+ Мой инвентарь
+ </string>
+ <string name="InvFolder Library">
+ Библиотека
+ </string>
+ <string name="InvFolder Textures">
+ ТекÑтуры
+ </string>
+ <string name="InvFolder Sounds">
+ Звуки
+ </string>
+ <string name="InvFolder Calling Cards">
+ Визитки
+ </string>
+ <string name="InvFolder Landmarks">
+ Закладки
+ </string>
+ <string name="InvFolder Scripts">
+ Скрипты
+ </string>
+ <string name="InvFolder Clothing">
+ Одежда
+ </string>
+ <string name="InvFolder Objects">
+ Объекты
+ </string>
+ <string name="InvFolder Notecards">
+ Заметки
+ </string>
+ <string name="InvFolder New Folder">
+ ÐÐ¾Ð²Ð°Ñ Ð¿Ð°Ð¿ÐºÐ°
+ </string>
+ <string name="InvFolder Inventory">
+ Инвентарь
+ </string>
+ <string name="InvFolder Uncompressed Images">
+ ÐеÑжатые изображениÑ
+ </string>
+ <string name="InvFolder Body Parts">
+ ЧаÑти тела
+ </string>
+ <string name="InvFolder Trash">
+ Корзина
+ </string>
+ <string name="InvFolder Photo Album">
+ Фотоальбом
+ </string>
+ <string name="InvFolder Lost And Found">
+ Бюро находок
+ </string>
+ <string name="InvFolder Uncompressed Sounds">
+ ÐеÑжатые звуки
+ </string>
+ <string name="InvFolder Animations">
+ ÐнимациÑ
+ </string>
+ <string name="InvFolder Gestures">
+ ЖеÑÑ‚Ñ‹
+ </string>
+ <string name="InvFolder Favorite">
+ Мое избранное
+ </string>
+ <string name="InvFolder favorite">
+ Мое избранное
+ </string>
+ <string name="InvFolder Current Outfit">
+ Текущий коÑтюм
+ </string>
+ <string name="InvFolder Initial Outfits">
+ Ðачальные коÑтюмы
+ </string>
+ <string name="InvFolder My Outfits">
+ Мои коÑтюмы
+ </string>
+ <string name="InvFolder Accessories">
+ ÐкÑеÑÑуары
+ </string>
+ <string name="InvFolder Meshes">
+ Меши
+ </string>
+ <string name="InvFolder Friends">
+ ДрузьÑ
+ </string>
+ <string name="InvFolder All">
+ Ð’Ñе
+ </string>
+ <string name="no_attachments">
+ Ðет прикрепленных объектов
+ </string>
+ <string name="Attachments remain">
+ ПриÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ (оÑталоÑÑŒ гнезд: [COUNT])
+ </string>
+ <string name="Buy">
+ Купить
+ </string>
+ <string name="BuyforL$">
+ Купить за L$
+ </string>
+ <string name="Stone">
+ Камень
+ </string>
+ <string name="Metal">
+ Металл
+ </string>
+ <string name="Glass">
+ Стекло
+ </string>
+ <string name="Wood">
+ Дерево
+ </string>
+ <string name="Flesh">
+ Плоть
+ </string>
+ <string name="Plastic">
+ ПлаÑтик
+ </string>
+ <string name="Rubber">
+ Резина
+ </string>
+ <string name="Light">
+ Светлый
+ </string>
+ <string name="KBShift">
+ SHIFT
+ </string>
+ <string name="KBCtrl">
+ CTRL
+ </string>
+ <string name="Chest">
+ Грудь
+ </string>
+ <string name="Skull">
+ Череп
+ </string>
+ <string name="Left Shoulder">
+ Левое плечо
+ </string>
+ <string name="Right Shoulder">
+ Правое плечо
+ </string>
+ <string name="Left Hand">
+ Ð›ÐµÐ²Ð°Ñ ÐºÐ¸ÑÑ‚ÑŒ
+ </string>
+ <string name="Right Hand">
+ ÐŸÑ€Ð°Ð²Ð°Ñ ÐºÐ¸ÑÑ‚ÑŒ
+ </string>
+ <string name="Left Foot">
+ Ð›ÐµÐ²Ð°Ñ ÑтупнÑ
+ </string>
+ <string name="Right Foot">
+ ÐŸÑ€Ð°Ð²Ð°Ñ ÑтупнÑ
+ </string>
+ <string name="Spine">
+ Позвоночник
+ </string>
+ <string name="Pelvis">
+ Таз
+ </string>
+ <string name="Mouth">
+ Рот
+ </string>
+ <string name="Chin">
+ Подбородок
+ </string>
+ <string name="Left Ear">
+ Левое ухо
+ </string>
+ <string name="Right Ear">
+ Правое ухо
+ </string>
+ <string name="Left Eyeball">
+ Левый глаз
+ </string>
+ <string name="Right Eyeball">
+ Правый глаз
+ </string>
+ <string name="Nose">
+ ÐоÑ
+ </string>
+ <string name="R Upper Arm">
+ Правое плечо
+ </string>
+ <string name="R Forearm">
+ Правое предплечье
+ </string>
+ <string name="L Upper Arm">
+ Левое плечо
+ </string>
+ <string name="L Forearm">
+ Левое предплечье
+ </string>
+ <string name="Right Hip">
+ Правое бедро
+ </string>
+ <string name="R Upper Leg">
+ Правое колено
+ </string>
+ <string name="R Lower Leg">
+ ÐŸÑ€Ð°Ð²Ð°Ñ Ð³Ð¾Ð»ÐµÐ½ÑŒ
+ </string>
+ <string name="Left Hip">
+ Левое бедро
+ </string>
+ <string name="L Upper Leg">
+ Левое колено
+ </string>
+ <string name="L Lower Leg">
+ Ð›ÐµÐ²Ð°Ñ Ð³Ð¾Ð»ÐµÐ½ÑŒ
+ </string>
+ <string name="Stomach">
+ Живот
+ </string>
+ <string name="Left Pec">
+ Ð›ÐµÐ²Ð°Ñ Ð³Ñ€ÑƒÐ´ÑŒ
+ </string>
+ <string name="Right Pec">
+ ÐŸÑ€Ð°Ð²Ð°Ñ Ð³Ñ€ÑƒÐ´ÑŒ
+ </string>
+ <string name="Neck">
+ ШеÑ
+ </string>
+ <string name="Avatar Center">
+ Центр аватара
+ </string>
+ <string name="Invalid Attachment">
+ ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° приÑоединениÑ
+ </string>
+ <string name="YearsMonthsOld">
+ [AGEYEARS] [AGEMONTHS]
+ </string>
+ <string name="YearsOld">
+ [AGEYEARS]
+ </string>
+ <string name="MonthsOld">
+ [AGEMONTHS]
+ </string>
+ <string name="WeeksOld">
+ [AGEWEEKS]
+ </string>
+ <string name="DaysOld">
+ [AGEDAYS]
+ </string>
+ <string name="TodayOld">
+ СегоднÑ
+ </string>
+ <string name="AgeYearsA">
+ [COUNT] год
+ </string>
+ <string name="AgeYearsB">
+ [COUNT] года
+ </string>
+ <string name="AgeYearsC">
+ [COUNT] лет
+ </string>
+ <string name="AgeMonthsA">
+ [COUNT] меÑÑц
+ </string>
+ <string name="AgeMonthsB">
+ [COUNT] меÑÑца
+ </string>
+ <string name="AgeMonthsC">
+ [COUNT] меÑÑцев
+ </string>
+ <string name="AgeWeeksA">
+ [COUNT] неделÑ
+ </string>
+ <string name="AgeWeeksB">
+ [COUNT] недели
+ </string>
+ <string name="AgeWeeksC">
+ [COUNT] недель
+ </string>
+ <string name="AgeDaysA">
+ [COUNT] день
+ </string>
+ <string name="AgeDaysB">
+ [COUNT] днÑ
+ </string>
+ <string name="AgeDaysC">
+ [COUNT] дней
+ </string>
+ <string name="GroupMembersA">
+ [COUNT] учаÑтник
+ </string>
+ <string name="GroupMembersB">
+ [COUNT] учаÑтника
+ </string>
+ <string name="GroupMembersC">
+ [COUNT] учаÑтников
+ </string>
+ <string name="AcctTypeResident">
+ Житель
+ </string>
+ <string name="AcctTypeTrial">
+ ГоÑÑ‚ÑŒ
+ </string>
+ <string name="AcctTypeCharterMember">
+ Учредитель
+ </string>
+ <string name="AcctTypeEmployee">
+ Сотрудник Linden Lab
+ </string>
+ <string name="PaymentInfoUsed">
+ ЕÑÑ‚ÑŒ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ платежах
+ </string>
+ <string name="PaymentInfoOnFile">
+ ЕÑÑ‚ÑŒ зарегиÑтрир. Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ платежах
+ </string>
+ <string name="NoPaymentInfoOnFile">
+ Ðет информации о платежах
+ </string>
+ <string name="AgeVerified">
+ ВозраÑÑ‚ проверен
+ </string>
+ <string name="NotAgeVerified">
+ ВозраÑÑ‚ не проверен
+ </string>
+ <string name="Center 2">
+ В центре 2
+ </string>
+ <string name="Top Right">
+ Вверху Ñправа
+ </string>
+ <string name="Top">
+ Вверху
+ </string>
+ <string name="Top Left">
+ Вверху Ñлева
+ </string>
+ <string name="Center">
+ В центре
+ </string>
+ <string name="Bottom Left">
+ Внизу Ñлева
+ </string>
+ <string name="Bottom">
+ Внизу
+ </string>
+ <string name="Bottom Right">
+ Внизу Ñправа
+ </string>
+ <string name="CompileQueueDownloadedCompiling">
+ Загружено, компилируетÑÑ
+ </string>
+ <string name="CompileQueueScriptNotFound">
+ Скрипт не найден на Ñервере.
+ </string>
+ <string name="CompileQueueProblemDownloading">
+ Проблема при загрузке
+ </string>
+ <string name="CompileQueueInsufficientPermDownload">
+ ÐедоÑтаточно разрешений Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸ Ñкрипта.
+ </string>
+ <string name="CompileQueueInsufficientPermFor">
+ ÐедоÑтаточно разрешений длÑ
+ </string>
+ <string name="CompileQueueUnknownFailure">
+ ÐеизвеÑтный Ñбой загрузки
+ </string>
+ <string name="CompileQueueTitle">
+ Ход повторной компилÑции
+ </string>
+ <string name="CompileQueueStart">
+ Ñкомпилировать повторно
+ </string>
+ <string name="ResetQueueTitle">
+ Ход ÑброÑа
+ </string>
+ <string name="ResetQueueStart">
+ ÑброÑ
+ </string>
+ <string name="RunQueueTitle">
+ Ход запуÑка
+ </string>
+ <string name="RunQueueStart">
+ запуÑтить
+ </string>
+ <string name="NotRunQueueTitle">
+ Ход оÑтановки выполнениÑ
+ </string>
+ <string name="NotRunQueueStart">
+ прекратить выполнение
+ </string>
+ <string name="CompileSuccessful">
+ КомпилÑÑ†Ð¸Ñ ÑƒÑпешно выполнена!
+ </string>
+ <string name="CompileSuccessfulSaving">
+ КомпилÑÑ†Ð¸Ñ ÑƒÑпешно выполнена, ÑохранÑетÑÑ...
+ </string>
+ <string name="SaveComplete">
+ Сохранение завершено.
+ </string>
+ <string name="ObjectOutOfRange">
+ Скрипт (объект вне облаÑти)
+ </string>
+ <string name="GodToolsObjectOwnedBy">
+ Объект [OBJECT] Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ [OWNER]
+ </string>
+ <string name="GroupsNone">
+ нет
+ </string>
+ <string name="Group" value="(группа)"/>
+ <string name="Unknown">
+ (ÐеизвеÑтно)
+ </string>
+ <string name="SummaryForTheWeek" value="Сводка за неделю, Ð½Ð°Ñ‡Ð¸Ð½Ð°Ñ Ñ"/>
+ <string name="NextStipendDay" value="Дата очередного жалованиÑ:"/>
+ <string name="GroupPlanningDate">
+ [day,datetime,utc].[mthnum,datetime,utc].[year,datetime,utc]
+ </string>
+ <string name="GroupIndividualShare" value="Ð”Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹ ПерÑонально СовмеÑтно"/>
+ <string name="GroupColumn" value="Группа"/>
+ <string name="Balance">
+ БаланÑ
+ </string>
+ <string name="Credits">
+ РаÑход
+ </string>
+ <string name="Debits">
+ Приход
+ </string>
+ <string name="Total">
+ Итого
+ </string>
+ <string name="NoGroupDataFound">
+ Ðе найдены данные Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹
+ </string>
+ <string name="IMParentEstate">
+ родовое землевладение
+ </string>
+ <string name="IMMainland">
+ материк
+ </string>
+ <string name="IMTeen">
+ подроÑтковый
+ </string>
+ <string name="Anyone">
+ вÑе
+ </string>
+ <string name="RegionInfoError">
+ ошибка
+ </string>
+ <string name="RegionInfoAllEstatesOwnedBy">
+ вÑе Ð·ÐµÐ¼Ð»ÐµÐ²Ð»Ð°Ð´ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ [OWNER]
+ </string>
+ <string name="RegionInfoAllEstatesYouOwn">
+ вÑе ваши землевладениÑ
+ </string>
+ <string name="RegionInfoAllEstatesYouManage">
+ вÑе Ð·ÐµÐ¼Ð»ÐµÐ²Ð»Ð°Ð´ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ [OWNER], которыми вы управлÑете
+ </string>
+ <string name="RegionInfoAllowedResidents">
+ Допущенные жители: ([ALLOWEDAGENTS], не более [MAXACCESS])
+ </string>
+ <string name="RegionInfoAllowedGroups">
+ Допущенные группы: ([ALLOWEDGROUPS], не более [MAXACCESS])
+ </string>
+ <string name="ScriptLimitsParcelScriptMemory">
+ ПамÑÑ‚ÑŒ под Ñкрипты на учаÑтке
+ </string>
+ <string name="ScriptLimitsParcelsOwned">
+ УчаÑтков в ÑпиÑке: [PARCELS]
+ </string>
+ <string name="ScriptLimitsMemoryUsed">
+ ИÑпользуетÑÑ Ð¿Ð°Ð¼Ñти: [COUNT] КБ из [MAX] КБ; доÑтупно: [AVAILABLE] КБ
+ </string>
+ <string name="ScriptLimitsMemoryUsedSimple">
+ ИÑпользуетÑÑ Ð¿Ð°Ð¼Ñти: [COUNT] КБ
+ </string>
+ <string name="ScriptLimitsParcelScriptURLs">
+ URL-адреÑа Ñкрипта учаÑтков
+ </string>
+ <string name="ScriptLimitsURLsUsed">
+ ИÑпользуетÑÑ URL-адреÑов: [COUNT] из [MAX] (доÑтупно: [AVAILABLE])
+ </string>
+ <string name="ScriptLimitsURLsUsedSimple">
+ ИÑпользуетÑÑ URL-адреÑов: [COUNT]
+ </string>
+ <string name="ScriptLimitsRequestError">
+ Ошибка при запроÑе данных
+ </string>
+ <string name="ScriptLimitsRequestNoParcelSelected">
+ УчаÑток не выбран
+ </string>
+ <string name="ScriptLimitsRequestWrongRegion">
+ Ошибка. Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ Ñкрипте доÑтупны только в текущем регионе
+ </string>
+ <string name="ScriptLimitsRequestWaiting">
+ Получение данных...
+ </string>
+ <string name="ScriptLimitsRequestDontOwnParcel">
+ У Ð²Ð°Ñ Ð½ÐµÑ‚ прав Ð´Ð»Ñ Ð¸ÑÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ Ñтого учаÑтка
+ </string>
+ <string name="SITTING_ON">
+ Сидит на
+ </string>
+ <string name="ATTACH_CHEST">
+ Грудь
+ </string>
+ <string name="ATTACH_HEAD">
+ Голова
+ </string>
+ <string name="ATTACH_LSHOULDER">
+ Левое плечо
+ </string>
+ <string name="ATTACH_RSHOULDER">
+ Правое плечо
+ </string>
+ <string name="ATTACH_LHAND">
+ Ð›ÐµÐ²Ð°Ñ ÐºÐ¸ÑÑ‚ÑŒ
+ </string>
+ <string name="ATTACH_RHAND">
+ ÐŸÑ€Ð°Ð²Ð°Ñ ÐºÐ¸ÑÑ‚ÑŒ
+ </string>
+ <string name="ATTACH_LFOOT">
+ Ð›ÐµÐ²Ð°Ñ ÑтупнÑ
+ </string>
+ <string name="ATTACH_RFOOT">
+ ÐŸÑ€Ð°Ð²Ð°Ñ ÑтупнÑ
+ </string>
+ <string name="ATTACH_BACK">
+ Спина
+ </string>
+ <string name="ATTACH_PELVIS">
+ Таз
+ </string>
+ <string name="ATTACH_MOUTH">
+ Рот
+ </string>
+ <string name="ATTACH_CHIN">
+ Подбородок
+ </string>
+ <string name="ATTACH_LEAR">
+ Левое ухо
+ </string>
+ <string name="ATTACH_REAR">
+ Правое ухо
+ </string>
+ <string name="ATTACH_LEYE">
+ Левый глаз
+ </string>
+ <string name="ATTACH_REYE">
+ Правый глаз
+ </string>
+ <string name="ATTACH_NOSE">
+ ÐоÑ
+ </string>
+ <string name="ATTACH_RUARM">
+ Правое плечо
+ </string>
+ <string name="ATTACH_RLARM">
+ Правое предплечье
+ </string>
+ <string name="ATTACH_LUARM">
+ Левое плечо
+ </string>
+ <string name="ATTACH_LLARM">
+ Левое предплечье
+ </string>
+ <string name="ATTACH_RHIP">
+ Правое бедро
+ </string>
+ <string name="ATTACH_RULEG">
+ Правое колено
+ </string>
+ <string name="ATTACH_RLLEG">
+ ÐŸÑ€Ð°Ð²Ð°Ñ Ð³Ð¾Ð»ÐµÐ½ÑŒ
+ </string>
+ <string name="ATTACH_LHIP">
+ Левое бедро
+ </string>
+ <string name="ATTACH_LULEG">
+ Левое колено
+ </string>
+ <string name="ATTACH_LLLEG">
+ Ð›ÐµÐ²Ð°Ñ Ð³Ð¾Ð»ÐµÐ½ÑŒ
+ </string>
+ <string name="ATTACH_BELLY">
+ Живот
+ </string>
+ <string name="ATTACH_RPEC">
+ ÐŸÑ€Ð°Ð²Ð°Ñ Ð³Ñ€ÑƒÐ´ÑŒ
+ </string>
+ <string name="ATTACH_LPEC">
+ Ð›ÐµÐ²Ð°Ñ Ð³Ñ€ÑƒÐ´ÑŒ
+ </string>
+ <string name="ATTACH_HUD_CENTER_2">
+ Данные в игре в центре 2
+ </string>
+ <string name="ATTACH_HUD_TOP_RIGHT">
+ Данные в игре вверху Ñправа
+ </string>
+ <string name="ATTACH_HUD_TOP_CENTER">
+ Данные в игре вверху в центре
+ </string>
+ <string name="ATTACH_HUD_TOP_LEFT">
+ Данные в игре вверху Ñлева
+ </string>
+ <string name="ATTACH_HUD_CENTER_1">
+ Данные в игре в центре 1
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_LEFT">
+ Данные в игре внизу Ñлева
+ </string>
+ <string name="ATTACH_HUD_BOTTOM">
+ Данные в игре внизу
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_RIGHT">
+ Данные в игре внизу Ñправа
+ </string>
+ <string name="CursorPos">
+ Строка [LINE], Ñтолбец [COLUMN]
+ </string>
+ <string name="PanelDirCountFound">
+ Ðайдено: [COUNT]
+ </string>
+ <string name="PanelDirTimeStr">
+ [hour,datetime,slt]:[min,datetime,slt]
+ </string>
+ <string name="PanelDirEventsDateText">
+ [day,datetime,slt].[mthnum,datetime,slt]
+ </string>
+ <string name="PanelContentsTooltip">
+ Подключение к объекту
+ </string>
+ <string name="PanelContentsNewScript">
+ Ðовый Ñкрипт
+ </string>
+ <string name="BusyModeResponseDefault">
+ У адреÑата вашего ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð·Ð°Ð´Ð°Ð½ ÑÑ‚Ð°Ñ‚ÑƒÑ Â«Ðе беÑпокоить». Ваше Ñообщение вÑе равно будет отображено на панели IM Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра позже.
+ </string>
+ <string name="MuteByName">
+ (по имени)
+ </string>
+ <string name="MuteAgent">
+ (Ð´Ð»Ñ Ð¶Ð¸Ñ‚ÐµÐ»Ñ)
+ </string>
+ <string name="MuteObject">
+ (Ð´Ð»Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð°)
+ </string>
+ <string name="MuteGroup">
+ (Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹)
+ </string>
+ <string name="MuteExternal">
+ (внешний)
+ </string>
+ <string name="RegionNoCovenant">
+ Ðет ÑÐ¾Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñтого землевладениÑ.
+ </string>
+ <string name="RegionNoCovenantOtherOwner">
+ Ðет ÑÐ¾Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñтого землевладениÑ. Ð—ÐµÐ¼Ð»Ñ Ð² Ñтом землевладении продаетÑÑ ÐµÐ³Ð¾ владельцем, а не компанией Linden Lab. Чтобы узнать подробноÑти о продаже, обратитеÑÑŒ к землевладельцу.
+ </string>
+ <string name="covenant_last_modified" value="Дата поÑледнего изменениÑ:"/>
+ <string name="none_text" value="(нет)"/>
+ <string name="never_text" value="(никогда)"/>
+ <string name="GroupOwned">
+ СобÑтвенноÑÑ‚ÑŒ группы
+ </string>
+ <string name="Public">
+ ÐžÐ±Ñ‰Ð°Ñ ÑобÑтвенноÑÑ‚ÑŒ
+ </string>
+ <string name="LocalSettings">
+ Локальные наÑтройки
+ </string>
+ <string name="RegionSettings">
+ Региональные наÑтройки
+ </string>
+ <string name="ClassifiedClicksTxt">
+ Щелчки: телепорт [TELEPORT], карта [MAP], профиль [PROFILE]
+ </string>
+ <string name="ClassifiedUpdateAfterPublish">
+ (будет обновлено поÑле публикации)
+ </string>
+ <string name="NoPicksClassifiedsText">
+ Ð’Ñ‹ не Ñоздали подборки или рекламы. Ðажмите кнопку Ñо знаком «плюÑ» ниже, чтобы Ñоздать подборку или рекламу
+ </string>
+ <string name="NoAvatarPicksClassifiedsText">
+ У Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ð½ÐµÑ‚ подборки или рекламы
+ </string>
+ <string name="PicksClassifiedsLoadingText">
+ Загрузка...
+ </string>
+ <string name="MultiPreviewTitle">
+ Предварительный проÑмотр
+ </string>
+ <string name="MultiPropertiesTitle">
+ СвойÑтва
+ </string>
+ <string name="InvOfferAnObjectNamed">
+ Объект Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼
+ </string>
+ <string name="InvOfferOwnedByGroup">
+ принадлежит группе
+ </string>
+ <string name="InvOfferOwnedByUnknownGroup">
+ принадлежит извеÑтной группе
+ </string>
+ <string name="InvOfferOwnedBy">
+ принадлежит
+ </string>
+ <string name="InvOfferOwnedByUnknownUser">
+ принадлежит неизвеÑтному пользователю
+ </string>
+ <string name="InvOfferGaveYou">
+ дал(а) вам
+ </string>
+ <string name="InvOfferDecline">
+ Ð’Ñ‹ не принÑли [DESC] от Ð¶Ð¸Ñ‚ÐµÐ»Ñ &lt;nolink&gt;[NAME]&lt;/nolink&gt;.
+ </string>
+ <string name="GroupMoneyTotal">
+ Итого
+ </string>
+ <string name="GroupMoneyBought">
+ куплено
+ </string>
+ <string name="GroupMoneyPaidYou">
+ уплачено вам
+ </string>
+ <string name="GroupMoneyPaidInto">
+ уплачено в
+ </string>
+ <string name="GroupMoneyBoughtPassTo">
+ куплен пропуÑк в
+ </string>
+ <string name="GroupMoneyPaidFeeForEvent">
+ уплачено за Ñобытие
+ </string>
+ <string name="GroupMoneyPaidPrizeForEvent">
+ выплачено призовых за Ñобытие
+ </string>
+ <string name="GroupMoneyBalance">
+ БаланÑ
+ </string>
+ <string name="GroupMoneyCredits">
+ РаÑход
+ </string>
+ <string name="GroupMoneyDebits">
+ Приход
+ </string>
+ <string name="GroupMoneyDate">
+ [weekday,datetime,utc], [day,datetime,utc] [mth,datetime,utc] [year,datetime,utc]
+ </string>
+ <string name="ViewerObjectContents">
+ Контент
+ </string>
+ <string name="AcquiredItems">
+ Купленные вещи
+ </string>
+ <string name="Cancel">
+ Отмена
+ </string>
+ <string name="UploadingCosts">
+ Передача [NAME] Ñтоит L$[AMOUNT]
+ </string>
+ <string name="BuyingCosts">
+ СтоимоÑÑ‚ÑŒ покупки: L$[AMOUNT]
+ </string>
+ <string name="UnknownFileExtension">
+ ÐеизвеÑтное раÑширение файла .%s
+ОжидаютÑÑ Ñ€Ð°ÑширениÑ: WAV, TGA, BMP, JPG, JPEG или BVH
+ </string>
+ <string name="MuteObject2">
+ Заблокировать
+ </string>
+ <string name="MuteAvatar">
+ Заблокировать
+ </string>
+ <string name="UnmuteObject">
+ Разблокировать
+ </string>
+ <string name="UnmuteAvatar">
+ Разблокировать
+ </string>
+ <string name="AddLandmarkNavBarMenu">
+ Добавить в мои закладки...
+ </string>
+ <string name="EditLandmarkNavBarMenu">
+ Изменить мою закладку...
+ </string>
+ <string name="accel-mac-control">
+ ⌃
+ </string>
+ <string name="accel-mac-command">
+ ⌘
+ </string>
+ <string name="accel-mac-option">
+ ⌥
+ </string>
+ <string name="accel-mac-shift">
+ ⇧
+ </string>
+ <string name="accel-win-control">
+ CTRL+
+ </string>
+ <string name="accel-win-alt">
+ ALT+
+ </string>
+ <string name="accel-win-shift">
+ SHIFT+
+ </string>
+ <string name="FileSaved">
+ Файл Ñохранен
+ </string>
+ <string name="Receiving">
+ Получение
+ </string>
+ <string name="AM">
+ до полуднÑ
+ </string>
+ <string name="PM">
+ поÑле полуднÑ
+ </string>
+ <string name="PST">
+ ТихоокеанÑкое времÑ
+ </string>
+ <string name="PDT">
+ Летнее тихоокеанÑкое времÑ
+ </string>
+ <string name="Direction_Forward">
+ Вперед
+ </string>
+ <string name="Direction_Left">
+ Влево
+ </string>
+ <string name="Direction_Right">
+ Вправо
+ </string>
+ <string name="Direction_Back">
+ Ðазад
+ </string>
+ <string name="Direction_North">
+ Север
+ </string>
+ <string name="Direction_South">
+ Юг
+ </string>
+ <string name="Direction_West">
+ Запад
+ </string>
+ <string name="Direction_East">
+ ВоÑток
+ </string>
+ <string name="Direction_Up">
+ Вверх
+ </string>
+ <string name="Direction_Down">
+ Вниз
+ </string>
+ <string name="Any Category">
+ Ð’Ñе категории
+ </string>
+ <string name="Shopping">
+ Покупки
+ </string>
+ <string name="Land Rental">
+ Ð—ÐµÐ¼ÐµÐ»ÑŒÐ½Ð°Ñ Ñ€ÐµÐ½Ñ‚Ð°
+ </string>
+ <string name="Property Rental">
+ Ðренда имущеÑтва
+ </string>
+ <string name="Special Attraction">
+ ОÑобое Ñобытие
+ </string>
+ <string name="New Products">
+ Ðовые продукты
+ </string>
+ <string name="Employment">
+ Род занÑтий
+ </string>
+ <string name="Wanted">
+ Хочу найти
+ </string>
+ <string name="Service">
+ УÑлуги
+ </string>
+ <string name="Personal">
+ Личное Ñообщение
+ </string>
+ <string name="None">
+ Ðет
+ </string>
+ <string name="Linden Location">
+ МеÑто Linden
+ </string>
+ <string name="Adult">
+ Ð”Ð»Ñ Ð²Ð·Ñ€Ð¾Ñлых
+ </string>
+ <string name="Arts&amp;Culture">
+ ИÑкуÑÑтво и культура
+ </string>
+ <string name="Business">
+ БизнеÑ
+ </string>
+ <string name="Educational">
+ Образование
+ </string>
+ <string name="Gaming">
+ Игры
+ </string>
+ <string name="Hangout">
+ МеÑта вÑтреч
+ </string>
+ <string name="Newcomer Friendly">
+ Ð”Ð»Ñ Ð½Ð¾Ð²Ð¸Ñ‡ÐºÐ¾Ð²
+ </string>
+ <string name="Parks&amp;Nature">
+ Парки и природа
+ </string>
+ <string name="Residential">
+ Проживание
+ </string>
+ <string name="Stage">
+ СтадиÑ
+ </string>
+ <string name="Other">
+ Другое
+ </string>
+ <string name="Rental">
+ Ðренда
+ </string>
+ <string name="Any">
+ Ð’Ñе
+ </string>
+ <string name="You">
+ Ð’Ñ‹
+ </string>
+ <string name=":">
+ :
+ </string>
+ <string name=",">
+ ,
+ </string>
+ <string name="...">
+ ...
+ </string>
+ <string name="***">
+ ***
+ </string>
+ <string name="(">
+ (
+ </string>
+ <string name=")">
+ )
+ </string>
+ <string name=".">
+ .
+ </string>
+ <string name="&apos;">
+ &apos;
+ </string>
+ <string name="---">
+ ---
+ </string>
+ <string name="Multiple Media">
+ ÐеÑколько иÑточников мультимедиа
+ </string>
+ <string name="Play Media">
+ Мультимедиа – воÑпроизведение/пауза
+ </string>
+ <string name="MBCmdLineError">
+ Ошибка при анализе командной Ñтроки.
+См.: http://wiki.secondlife.com/wiki/Client_parameters
+Ошибка:
+ </string>
+ <string name="MBCmdLineUsg">
+ ИÑпользование командной Ñтроки [APP_NAME]:
+ </string>
+ <string name="MBUnableToAccessFile">
+ Приложению [APP_NAME] не удаетÑÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒ доÑтуп к нужному файлу.
+Возможно, выполнÑетÑÑ Ð½ÐµÑколько копий или в ÑиÑтеме неправильно открыт файл.
+ЕÑли Ñто Ñообщение по-прежнему будет отображатьÑÑ, перезагрузите компьютер и повторите попытку.
+ЕÑли и Ñто не поможет, возможно, придетÑÑ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð¾ уÑтановить приложение [APP_NAME].
+ </string>
+ <string name="MBFatalError">
+ ÐеуÑÑ‚Ñ€Ð°Ð½Ð¸Ð¼Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°
+ </string>
+ <string name="MBRequiresAltiVec">
+ Ð”Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ [APP_NAME] необходим процеÑÑор Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¾Ð¹ AltiVec (верÑии G4 или более поздней).
+ </string>
+ <string name="MBAlreadyRunning">
+ [APP_NAME] уже выполнÑетÑÑ.
+Поищите значок программы на панели задач.
+ЕÑли Ñто Ñообщение по-прежнему будет отображатьÑÑ, перезагрузите компьютер.
+ </string>
+ <string name="MBFrozenCrashed">
+ По-видимому, при предыдущем запуÑке Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ [APP_NAME] оно завиÑло или в нем возник Ñбой.
+Отправить отчет о Ñбое?
+ </string>
+ <string name="MBAlert">
+ Уведомление
+ </string>
+ <string name="MBNoDirectX">
+ Приложению [APP_NAME] не удаетÑÑ Ð¾Ð±Ð½Ð°Ñ€ÑƒÐ¶Ð¸Ñ‚ÑŒ DirectX 9.0b или более поздних верÑий.
+Ð’ приложении [APP_NAME] иÑпользуетÑÑ DirectX Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ Ð¾Ð±Ð¾Ñ€ÑƒÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ выÑÐ²Ð»ÐµÐ½Ð¸Ñ ÑƒÑтаревших драйверов, из-за которых может ÑнизитьÑÑ ÑтабильноÑÑ‚ÑŒ работы и быÑтродейÑтвие, а также возникнуть Ñбои. ÐаÑтоÑтельно рекомендуетÑÑ ÑƒÑтановить DirectX 9.0b, Ñ…Ð¾Ñ‚Ñ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ðµ [APP_NAME] работает и без Ñтого компонента.
+Продолжить?
+ </string>
+ <string name="MBWarning">
+ Внимание!
+ </string>
+ <string name="MBNoAutoUpdate">
+ Ð’ ОС Linux автоматичеÑкое обновление еще не реализовано.
+Загрузите новую верÑию на Ñайте www.secondlife.com.
+ </string>
+ <string name="MBRegClassFailed">
+ Ошибка RegisterClass
+ </string>
+ <string name="MBError">
+ Ошибка
+ </string>
+ <string name="MBFullScreenErr">
+ Ðевозможна работа в полноÑкранном режиме на Ñкране [WIDTH] x [HEIGHT].
+Запущено в окне.
+ </string>
+ <string name="MBDestroyWinFailed">
+ Ошибка Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ при удалении окна (Ñбой функции DestroyWindow())
+ </string>
+ <string name="MBShutdownErr">
+ Ошибка Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹
+ </string>
+ <string name="MBDevContextErr">
+ Ðе удаетÑÑ Ñоздать контекÑÑ‚ уÑтройÑтва GL
+ </string>
+ <string name="MBPixelFmtErr">
+ Ðе удаетÑÑ Ð½Ð°Ð¹Ñ‚Ð¸ подходÑщий формат пикÑелей
+ </string>
+ <string name="MBPixelFmtDescErr">
+ Ðе удаетÑÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒ опиÑание формата пикÑелей
+ </string>
+ <string name="MBTrueColorWindow">
+ Ð”Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ [APP_NAME] необходим режим True Color (32 бита).
+Задайте в наÑтройках диÑÐ¿Ð»ÐµÑ 32-битный режим цвета.
+ </string>
+ <string name="MBAlpha">
+ Ðе удаетÑÑ Ð·Ð°Ð¿ÑƒÑтить [APP_NAME] из-за отÑутÑÑ‚Ð²Ð¸Ñ Ð´Ð¾Ñтупа к 8-битному альфа-каналу. Обычно Ñта проблема возникает из-за неполадок Ñ Ð´Ñ€Ð°Ð¹Ð²ÐµÑ€Ð¾Ð¼ видеокарты.
+УÑтановите новые драйверы видеокарты.
+Также задайте Ð´Ð»Ñ Ð¼Ð¾Ð½Ð¸Ñ‚Ð¾Ñ€Ð° 32-битный режим True Color (Панель ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ &gt; Экран &gt; Параметры).
+ЕÑли Ñто Ñообщение продолжает отображатьÑÑ, обратитеÑÑŒ на Ñайт [SUPPORT_SITE].
+ </string>
+ <string name="MBPixelFmtSetErr">
+ Ðе удаетÑÑ Ð·Ð°Ð´Ð°Ñ‚ÑŒ формат пикÑелей
+ </string>
+ <string name="MBGLContextErr">
+ Ðе удаетÑÑ Ñоздать контекÑÑ‚ визуализации GL
+ </string>
+ <string name="MBGLContextActErr">
+ Ðе удаетÑÑ Ð°ÐºÑ‚Ð¸Ð²Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ контекÑÑ‚ визуализации GL
+ </string>
+ <string name="MBVideoDrvErr">
+ Ðе удаетÑÑ Ð·Ð°Ð¿ÑƒÑтить приложение [APP_NAME], поÑкольку драйверы видеокарты неправильно уÑтановлены, уÑтарели или предназначены Ð´Ð»Ñ Ð¾Ð±Ð¾Ñ€ÑƒÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ, которое не поддерживаетÑÑ. УÑтановите или переуÑтановите поÑледние драйверы видеокарты.
+ЕÑли Ñто Ñообщение продолжает отображатьÑÑ, обратитеÑÑŒ на Ñайт [SUPPORT_SITE].
+ </string>
+ <string name="5 O&apos;Clock Shadow">
+ Жидкие
+ </string>
+ <string name="All White">
+ ПолноÑтью белые
+ </string>
+ <string name="Anime Eyes">
+ Глаза как в аниме
+ </string>
+ <string name="Arced">
+ Дугой
+ </string>
+ <string name="Arm Length">
+ Длина рук
+ </string>
+ <string name="Attached">
+ Прикреплено
+ </string>
+ <string name="Attached Earlobes">
+ ПрироÑшие мочки
+ </string>
+ <string name="Back Fringe">
+ Затылок
+ </string>
+ <string name="Baggy">
+ С мешками
+ </string>
+ <string name="Bangs">
+ Челки
+ </string>
+ <string name="Beady Eyes">
+ БуÑинки
+ </string>
+ <string name="Belly Size">
+ Размер живота
+ </string>
+ <string name="Big">
+ Большой
+ </string>
+ <string name="Big Butt">
+ Большой зад
+ </string>
+ <string name="Big Hair Back">
+ Пышные волоÑÑ‹: Ñзади
+ </string>
+ <string name="Big Hair Front">
+ Пышные волоÑÑ‹: Ñпереди
+ </string>
+ <string name="Big Hair Top">
+ Пышные волоÑÑ‹: Ñверху
+ </string>
+ <string name="Big Head">
+ Ð‘Ð¾Ð»ÑŒÑˆÐ°Ñ Ð³Ð¾Ð»Ð¾Ð²Ð°
+ </string>
+ <string name="Big Pectorals">
+ Ð’Ñ‹Ð¿ÑƒÐºÐ»Ð°Ñ Ð³Ñ€ÑƒÐ´ÑŒ
+ </string>
+ <string name="Big Spikes">
+ Большие «шипы»
+ </string>
+ <string name="Black">
+ Черный
+ </string>
+ <string name="Blonde">
+ Светлый
+ </string>
+ <string name="Blonde Hair">
+ Светлые волоÑÑ‹
+ </string>
+ <string name="Blush">
+ РумÑна
+ </string>
+ <string name="Blush Color">
+ Цвет румÑн
+ </string>
+ <string name="Blush Opacity">
+ ПрозрачноÑÑ‚ÑŒ румÑн
+ </string>
+ <string name="Body Definition">
+ Тип тела
+ </string>
+ <string name="Body Fat">
+ Ð–Ð¸Ñ€Ð¾Ð²Ð°Ñ Ð¿Ñ€Ð¾Ñлойка
+ </string>
+ <string name="Body Freckles">
+ ВеÑнушки
+ </string>
+ <string name="Body Thick">
+ Полное тело
+ </string>
+ <string name="Body Thickness">
+ Полнота
+ </string>
+ <string name="Body Thin">
+ Худое тело
+ </string>
+ <string name="Bow Legged">
+ Ðоги колеÑом
+ </string>
+ <string name="Breast Buoyancy">
+ Ð’Ñ‹Ñота груди
+ </string>
+ <string name="Breast Cleavage">
+ Ложбинка между грудей
+ </string>
+ <string name="Breast Size">
+ Размер груди
+ </string>
+ <string name="Bridge Width">
+ Ширина переноÑицы
+ </string>
+ <string name="Broad">
+ ШирокаÑ
+ </string>
+ <string name="Brow Size">
+ Размер надбровных дуг
+ </string>
+ <string name="Bug Eyes">
+ Выпученные глаза
+ </string>
+ <string name="Bugged Eyes">
+ Выпученные глаза
+ </string>
+ <string name="Bulbous">
+ Картошкой
+ </string>
+ <string name="Bulbous Nose">
+ ÐÐ¾Ñ ÐºÐ°Ñ€Ñ‚Ð¾ÑˆÐºÐ¾Ð¹
+ </string>
+ <string name="Breast Physics Mass">
+ МаÑÑа груди
+ </string>
+ <string name="Breast Physics Smoothing">
+ ГладкоÑÑ‚ÑŒ груди
+ </string>
+ <string name="Breast Physics Gravity">
+ ОбвиÑлоÑÑ‚ÑŒ груди
+ </string>
+ <string name="Breast Physics Drag">
+ ÐÑродинамика груди
+ </string>
+ <string name="Breast Physics InOut Max Effect">
+ ВерхнÑÑ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ð°
+ </string>
+ <string name="Breast Physics InOut Spring">
+ УпругоÑÑ‚ÑŒ
+ </string>
+ <string name="Breast Physics InOut Gain">
+ Отклик
+ </string>
+ <string name="Breast Physics InOut Damping">
+ Затухание
+ </string>
+ <string name="Breast Physics UpDown Max Effect">
+ ВерхнÑÑ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ð°
+ </string>
+ <string name="Breast Physics UpDown Spring">
+ УпругоÑÑ‚ÑŒ
+ </string>
+ <string name="Breast Physics UpDown Gain">
+ Отклик
+ </string>
+ <string name="Breast Physics UpDown Damping">
+ Затухание
+ </string>
+ <string name="Breast Physics LeftRight Max Effect">
+ ВерхнÑÑ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ð°
+ </string>
+ <string name="Breast Physics LeftRight Spring">
+ УпругоÑÑ‚ÑŒ
+ </string>
+ <string name="Breast Physics LeftRight Gain">
+ Отклик
+ </string>
+ <string name="Breast Physics LeftRight Damping">
+ Затухание
+ </string>
+ <string name="Belly Physics Mass">
+ МаÑÑа живота
+ </string>
+ <string name="Belly Physics Smoothing">
+ ГладкоÑÑ‚ÑŒ живота
+ </string>
+ <string name="Belly Physics Gravity">
+ ОбвиÑлоÑÑ‚ÑŒ живота
+ </string>
+ <string name="Belly Physics Drag">
+ ИнертноÑÑ‚ÑŒ живота
+ </string>
+ <string name="Belly Physics UpDown Max Effect">
+ ВерхнÑÑ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ð°
+ </string>
+ <string name="Belly Physics UpDown Spring">
+ УпругоÑÑ‚ÑŒ
+ </string>
+ <string name="Belly Physics UpDown Gain">
+ Отклик
+ </string>
+ <string name="Belly Physics UpDown Damping">
+ Затухание
+ </string>
+ <string name="Butt Physics Mass">
+ МаÑÑа зада
+ </string>
+ <string name="Butt Physics Smoothing">
+ ГладкоÑÑ‚ÑŒ зада
+ </string>
+ <string name="Butt Physics Gravity">
+ ОбвиÑлоÑÑ‚ÑŒ зада
+ </string>
+ <string name="Butt Physics Drag">
+ ИнертноÑÑ‚ÑŒ зада
+ </string>
+ <string name="Butt Physics UpDown Max Effect">
+ ВерхнÑÑ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ð°
+ </string>
+ <string name="Butt Physics UpDown Spring">
+ УпругоÑÑ‚ÑŒ
+ </string>
+ <string name="Butt Physics UpDown Gain">
+ Отклик
+ </string>
+ <string name="Butt Physics UpDown Damping">
+ Затухание
+ </string>
+ <string name="Butt Physics LeftRight Max Effect">
+ ВерхнÑÑ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ð°
+ </string>
+ <string name="Butt Physics LeftRight Spring">
+ УпругоÑÑ‚ÑŒ
+ </string>
+ <string name="Butt Physics LeftRight Gain">
+ Отклик
+ </string>
+ <string name="Butt Physics LeftRight Damping">
+ Затухание
+ </string>
+ <string name="Bushy Eyebrows">
+ КуÑтиÑтые брови
+ </string>
+ <string name="Bushy Hair">
+ Пышные
+ </string>
+ <string name="Butt Size">
+ Размер зада
+ </string>
+ <string name="Butt Gravity">
+ ОбвиÑлоÑÑ‚ÑŒ зада
+ </string>
+ <string name="bustle skirt">
+ Турнюр
+ </string>
+ <string name="no bustle">
+ Без турнюра
+ </string>
+ <string name="more bustle">
+ Большой турнюр
+ </string>
+ <string name="Chaplin">
+ «Чарли Чаплин»
+ </string>
+ <string name="Cheek Bones">
+ Скулы
+ </string>
+ <string name="Chest Size">
+ Размер грудной клетки
+ </string>
+ <string name="Chin Angle">
+ Угол подбородка
+ </string>
+ <string name="Chin Cleft">
+ Ямка на подбородке
+ </string>
+ <string name="Chin Curtains">
+ ШкиперÑÐºÐ°Ñ Ð±Ð¾Ñ€Ð¾Ð´ÐºÐ°
+ </string>
+ <string name="Chin Depth">
+ Толщина подбородка
+ </string>
+ <string name="Chin Heavy">
+ Мощный подбородок
+ </string>
+ <string name="Chin In">
+ Подбородок внутрь
+ </string>
+ <string name="Chin Out">
+ Подбородок наружу
+ </string>
+ <string name="Chin-Neck">
+ Переход от подбородка к шее
+ </string>
+ <string name="Clear">
+ ЧиÑтый
+ </string>
+ <string name="Cleft">
+ Ямка
+ </string>
+ <string name="Close Set Eyes">
+ Близко поÑаженные
+ </string>
+ <string name="Closed">
+ Закрыто
+ </string>
+ <string name="Closed Back">
+ Закрыто Ñзади
+ </string>
+ <string name="Closed Front">
+ Закрыто Ñпереди
+ </string>
+ <string name="Closed Left">
+ Закрыто Ñлева
+ </string>
+ <string name="Closed Right">
+ Закрыто Ñправа
+ </string>
+ <string name="Coin Purse">
+ Кошелек Ð´Ð»Ñ Ð¼ÐµÐ»Ð¾Ñ‡Ð¸
+ </string>
+ <string name="Collar Back">
+ Вырез Ñзади
+ </string>
+ <string name="Collar Front">
+ Вырез Ñпереди
+ </string>
+ <string name="Corner Down">
+ Уголки опущены
+ </string>
+ <string name="Corner Up">
+ Уголки поднÑÑ‚Ñ‹
+ </string>
+ <string name="Creased">
+ ИзмÑтый
+ </string>
+ <string name="Crooked Nose">
+ ИÑкривленный ноÑ
+ </string>
+ <string name="Cuff Flare">
+ Манжеты
+ </string>
+ <string name="Dark">
+ Темный
+ </string>
+ <string name="Dark Green">
+ Темно-зеленый
+ </string>
+ <string name="Darker">
+ Темнее
+ </string>
+ <string name="Deep">
+ Глубоко
+ </string>
+ <string name="Default Heels">
+ Стандартные каблуки
+ </string>
+ <string name="Dense">
+ ГуÑтые
+ </string>
+ <string name="Double Chin">
+ Двойной подбородок
+ </string>
+ <string name="Downturned">
+ Вниз
+ </string>
+ <string name="Duffle Bag">
+ Больше
+ </string>
+ <string name="Ear Angle">
+ ОттопыренноÑÑ‚ÑŒ ушей
+ </string>
+ <string name="Ear Size">
+ Размер ушей
+ </string>
+ <string name="Ear Tips">
+ Кончики ушей
+ </string>
+ <string name="Egg Head">
+ ЯйцеголовоÑÑ‚ÑŒ
+ </string>
+ <string name="Eye Bags">
+ Мешки под глазами
+ </string>
+ <string name="Eye Color">
+ Цвет глаз
+ </string>
+ <string name="Eye Depth">
+ Глубина глаз
+ </string>
+ <string name="Eye Lightness">
+ СветлоÑÑ‚ÑŒ глаз
+ </string>
+ <string name="Eye Opening">
+ ОткрытоÑÑ‚ÑŒ глаз
+ </string>
+ <string name="Eye Pop">
+ Вытаращить глаз
+ </string>
+ <string name="Eye Size">
+ Размер глаз
+ </string>
+ <string name="Eye Spacing">
+ РаÑÑтоÑние между глазами
+ </string>
+ <string name="Eyebrow Arc">
+ Ð›Ð¸Ð½Ð¸Ñ Ð±Ñ€Ð¾Ð²ÐµÐ¹
+ </string>
+ <string name="Eyebrow Density">
+ ГуÑтота бровей
+ </string>
+ <string name="Eyebrow Height">
+ Ð’Ñ‹Ñота бровей
+ </string>
+ <string name="Eyebrow Points">
+ Кончики бровей
+ </string>
+ <string name="Eyebrow Size">
+ Размер бровей
+ </string>
+ <string name="Eyelash Length">
+ Длина реÑниц
+ </string>
+ <string name="Eyeliner">
+ Подводка
+ </string>
+ <string name="Eyeliner Color">
+ Цвет подводки
+ </string>
+ <string name="Eyes Bugged">
+ Выпученные глаза
+ </string>
+ <string name="Face Shear">
+ ÐŸÐµÑ€ÐµÐºÐ¾Ñ Ð»Ð¸Ñ†Ð°
+ </string>
+ <string name="Facial Definition">
+ Черты лица
+ </string>
+ <string name="Far Set Eyes">
+ Широко раÑÑтавленные глаза
+ </string>
+ <string name="Fat Lips">
+ ТолÑтые губы
+ </string>
+ <string name="Female">
+ Женщина
+ </string>
+ <string name="Fingerless">
+ Без пальцев
+ </string>
+ <string name="Fingers">
+ С пальцами
+ </string>
+ <string name="Flared Cuffs">
+ С манжетами
+ </string>
+ <string name="Flat">
+ ПлоÑкие
+ </string>
+ <string name="Flat Butt">
+ ПлоÑкий зад
+ </string>
+ <string name="Flat Head">
+ ПлоÑÐºÐ°Ñ Ð³Ð¾Ð»Ð¾Ð²Ð°
+ </string>
+ <string name="Flat Toe">
+ ПлоÑкий ноÑок
+ </string>
+ <string name="Foot Size">
+ Размер Ñтупни
+ </string>
+ <string name="Forehead Angle">
+ Ðаклон лба
+ </string>
+ <string name="Forehead Heavy">
+ Мощный лоб
+ </string>
+ <string name="Freckles">
+ ВеÑнушки
+ </string>
+ <string name="Front Fringe">
+ Челка Ñпереди
+ </string>
+ <string name="Full Back">
+ ПолноÑтью назад
+ </string>
+ <string name="Full Eyeliner">
+ Подводка полноÑтью
+ </string>
+ <string name="Full Front">
+ ПолноÑтью наперед
+ </string>
+ <string name="Full Hair Sides">
+ ВолоÑÑ‹ по бокам
+ </string>
+ <string name="Full Sides">
+ По бокам
+ </string>
+ <string name="Glossy">
+ БлеÑÑ‚Ñщие
+ </string>
+ <string name="Glove Fingers">
+ Пальцы перчаток
+ </string>
+ <string name="Glove Length">
+ Длина перчаток
+ </string>
+ <string name="Hair">
+ ВолоÑÑ‹
+ </string>
+ <string name="Hair Back">
+ ВолоÑÑ‹: Ñзади
+ </string>
+ <string name="Hair Front">
+ ВолоÑÑ‹: Ñпереди
+ </string>
+ <string name="Hair Sides">
+ ВолоÑÑ‹: по бокам
+ </string>
+ <string name="Hair Sweep">
+ ВолоÑÑ‹ на глаза
+ </string>
+ <string name="Hair Thickess">
+ Толщина волоÑ
+ </string>
+ <string name="Hair Thickness">
+ Толщина волоÑ
+ </string>
+ <string name="Hair Tilt">
+ ЗачеÑ
+ </string>
+ <string name="Hair Tilted Left">
+ Ð—Ð°Ñ‡ÐµÑ Ð½Ð°Ð·Ð°Ð´
+ </string>
+ <string name="Hair Tilted Right">
+ Ð—Ð°Ñ‡ÐµÑ Ð²Ð¿Ñ€Ð°Ð²Ð¾
+ </string>
+ <string name="Hair Volume">
+ ВолоÑÑ‹: объем
+ </string>
+ <string name="Hand Size">
+ Размер киÑти
+ </string>
+ <string name="Handlebars">
+ Длинные уÑÑ‹
+ </string>
+ <string name="Head Length">
+ Длина головы
+ </string>
+ <string name="Head Shape">
+ Форма головы
+ </string>
+ <string name="Head Size">
+ Размер головы
+ </string>
+ <string name="Head Stretch">
+ Ð’Ñ‹Ñ‚ÑнутоÑÑ‚ÑŒ головы
+ </string>
+ <string name="Heel Height">
+ Ð’Ñ‹Ñота каблука
+ </string>
+ <string name="Heel Shape">
+ Форма каблука
+ </string>
+ <string name="Height">
+ РоÑÑ‚
+ </string>
+ <string name="High">
+ Ð’Ñ‹Ñокие
+ </string>
+ <string name="High Heels">
+ Ð’Ñ‹Ñокий каблук
+ </string>
+ <string name="High Jaw">
+ ЧелюÑÑ‚ÑŒ выÑоко
+ </string>
+ <string name="High Platforms">
+ Ð’Ñ‹ÑÐ¾ÐºÐ°Ñ Ð¿Ð»Ð°Ñ‚Ñ„Ð¾Ñ€Ð¼Ð°
+ </string>
+ <string name="High and Tight">
+ Ð’Ñ‹Ñокий и плотный
+ </string>
+ <string name="Higher">
+ Выше
+ </string>
+ <string name="Hip Length">
+ Длина бедер
+ </string>
+ <string name="Hip Width">
+ Ширина бедер
+ </string>
+ <string name="In">
+ Внутрь
+ </string>
+ <string name="In Shdw Color">
+ Цвет внутренних теней
+ </string>
+ <string name="In Shdw Opacity">
+ ПрозрачноÑÑ‚ÑŒ внутр. теней
+ </string>
+ <string name="Inner Eye Corner">
+ Внутренние уголки глаз
+ </string>
+ <string name="Inner Eye Shadow">
+ Тени на внутренних уголках
+ </string>
+ <string name="Inner Shadow">
+ Внутренние тени
+ </string>
+ <string name="Jacket Length">
+ Длина пиджака
+ </string>
+ <string name="Jacket Wrinkles">
+ СмÑтый пиджак
+ </string>
+ <string name="Jaw Angle">
+ Угол челюÑти
+ </string>
+ <string name="Jaw Jut">
+ Ð’Ñ‹Ñтупание челюÑти
+ </string>
+ <string name="Jaw Shape">
+ Форма челюÑти
+ </string>
+ <string name="Join">
+ Прикрепить
+ </string>
+ <string name="Jowls">
+ Щеки
+ </string>
+ <string name="Knee Angle">
+ Угол колен
+ </string>
+ <string name="Knock Kneed">
+ Колченогие
+ </string>
+ <string name="Large">
+ Больше
+ </string>
+ <string name="Large Hands">
+ Большие киÑти
+ </string>
+ <string name="Left Part">
+ Левый пробор
+ </string>
+ <string name="Leg Length">
+ Длина ног
+ </string>
+ <string name="Leg Muscles">
+ Мышцы на ногах
+ </string>
+ <string name="Less">
+ Меньше
+ </string>
+ <string name="Less Body Fat">
+ Меньше жира
+ </string>
+ <string name="Less Curtains">
+ Меньше борода
+ </string>
+ <string name="Less Freckles">
+ Меньше веÑнушек
+ </string>
+ <string name="Less Full">
+ Менее полное
+ </string>
+ <string name="Less Gravity">
+ Меньше притÑжениÑ
+ </string>
+ <string name="Less Love">
+ Меньше
+ </string>
+ <string name="Less Muscles">
+ Меньше мышц
+ </string>
+ <string name="Less Muscular">
+ Меньше мышц
+ </string>
+ <string name="Less Rosy">
+ Меньше румÑн
+ </string>
+ <string name="Less Round">
+ Меньше округлоÑти
+ </string>
+ <string name="Less Saddle">
+ Меньше
+ </string>
+ <string name="Less Square">
+ Меньше угловатоÑти
+ </string>
+ <string name="Less Volume">
+ Меньше объема
+ </string>
+ <string name="Less soul">
+ Меньше
+ </string>
+ <string name="Lighter">
+ Светлее
+ </string>
+ <string name="Lip Cleft">
+ Ямка между губ
+ </string>
+ <string name="Lip Cleft Depth">
+ Глубина Ñмки
+ </string>
+ <string name="Lip Fullness">
+ Полнота губ
+ </string>
+ <string name="Lip Pinkness">
+ РозоватоÑÑ‚ÑŒ губ
+ </string>
+ <string name="Lip Ratio">
+ ÐŸÑ€Ð¾Ð¿Ð¾Ñ€Ñ†Ð¸Ñ Ð³ÑƒÐ±
+ </string>
+ <string name="Lip Thickness">
+ Толщина губ
+ </string>
+ <string name="Lip Width">
+ Ширина губ
+ </string>
+ <string name="Lipgloss">
+ БлеÑк губ
+ </string>
+ <string name="Lipstick">
+ Ð“ÑƒÐ±Ð½Ð°Ñ Ð¿Ð¾Ð¼Ð°Ð´Ð°
+ </string>
+ <string name="Lipstick Color">
+ Цвет помады
+ </string>
+ <string name="Long">
+ Длиннее
+ </string>
+ <string name="Long Head">
+ Ð”Ð»Ð¸Ð½Ð½Ð°Ñ Ð³Ð¾Ð»Ð¾Ð²Ð°
+ </string>
+ <string name="Long Hips">
+ Длинные бедра
+ </string>
+ <string name="Long Legs">
+ Длинные ноги
+ </string>
+ <string name="Long Neck">
+ Ð”Ð»Ð¸Ð½Ð½Ð°Ñ ÑˆÐµÑ
+ </string>
+ <string name="Long Pigtails">
+ Длинные хвоÑÑ‚Ñ‹ по бокам
+ </string>
+ <string name="Long Ponytail">
+ Длинный хвоÑÑ‚ Ñзади
+ </string>
+ <string name="Long Torso">
+ Длинный торÑ
+ </string>
+ <string name="Long arms">
+ Длинные руки
+ </string>
+ <string name="Loose Pants">
+ Свободные брюки
+ </string>
+ <string name="Loose Shirt">
+ Ð¡Ð²Ð¾Ð±Ð¾Ð´Ð½Ð°Ñ Ñ€ÑƒÐ±Ð°ÑˆÐºÐ°
+ </string>
+ <string name="Loose Sleeves">
+ Свободные рукава
+ </string>
+ <string name="Love Handles">
+ ÐžÑ‚Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð½Ð° талии
+ </string>
+ <string name="Low">
+ Ðизкие
+ </string>
+ <string name="Low Heels">
+ Ðизкий каблук
+ </string>
+ <string name="Low Jaw">
+ ЧелюÑÑ‚ÑŒ низко
+ </string>
+ <string name="Low Platforms">
+ ÐÐ¸Ð·ÐºÐ°Ñ Ð¿Ð»Ð°Ñ‚Ñ„Ð¾Ñ€Ð¼Ð°
+ </string>
+ <string name="Low and Loose">
+ Ðизкий и Ñвободный
+ </string>
+ <string name="Lower">
+ Ðиже
+ </string>
+ <string name="Lower Bridge">
+ Спинка ноÑа
+ </string>
+ <string name="Lower Cheeks">
+ Щеки ниже
+ </string>
+ <string name="Male">
+ Мужчина
+ </string>
+ <string name="Middle Part">
+ Пробор по центру
+ </string>
+ <string name="More">
+ Больше
+ </string>
+ <string name="More Blush">
+ Больше румÑн
+ </string>
+ <string name="More Body Fat">
+ Больше жира
+ </string>
+ <string name="More Curtains">
+ Больше борода
+ </string>
+ <string name="More Eyeshadow">
+ Больше теней
+ </string>
+ <string name="More Freckles">
+ Больше веÑнушек
+ </string>
+ <string name="More Full">
+ Более полное
+ </string>
+ <string name="More Gravity">
+ Большее притÑжение
+ </string>
+ <string name="More Lipstick">
+ Больше помады
+ </string>
+ <string name="More Love">
+ Больше
+ </string>
+ <string name="More Lower Lip">
+ Больше нижнÑÑ Ð³ÑƒÐ±Ð°
+ </string>
+ <string name="More Muscles">
+ Больше мышц
+ </string>
+ <string name="More Muscular">
+ Больше мышц
+ </string>
+ <string name="More Rosy">
+ Больше румÑнца
+ </string>
+ <string name="More Round">
+ Больше округлоÑти
+ </string>
+ <string name="More Saddle">
+ Больше
+ </string>
+ <string name="More Sloped">
+ Более наклонный
+ </string>
+ <string name="More Square">
+ Более квадратнаÑ
+ </string>
+ <string name="More Upper Lip">
+ Больше верхнÑÑ Ð³ÑƒÐ±Ð°
+ </string>
+ <string name="More Vertical">
+ Более вертикальный
+ </string>
+ <string name="More Volume">
+ Больше объема
+ </string>
+ <string name="More soul">
+ Больше
+ </string>
+ <string name="Moustache">
+ УÑÑ‹
+ </string>
+ <string name="Mouth Corner">
+ Угол рта
+ </string>
+ <string name="Mouth Position">
+ Положение рта
+ </string>
+ <string name="Mowhawk">
+ Ирокез
+ </string>
+ <string name="Muscular">
+ МуÑкулиÑтое
+ </string>
+ <string name="Mutton Chops">
+ Бакенбарды
+ </string>
+ <string name="Nail Polish">
+ Лак Ð´Ð»Ñ Ð½Ð¾Ð³Ñ‚ÐµÐ¹
+ </string>
+ <string name="Nail Polish Color">
+ Цвет лака
+ </string>
+ <string name="Narrow">
+ Узко
+ </string>
+ <string name="Narrow Back">
+ Узко Ñзади
+ </string>
+ <string name="Narrow Front">
+ Узкий перед
+ </string>
+ <string name="Narrow Lips">
+ Узкие губы
+ </string>
+ <string name="Natural">
+ ЕÑтеÑтвенный
+ </string>
+ <string name="Neck Length">
+ Длина шеи
+ </string>
+ <string name="Neck Thickness">
+ Толщина шеи
+ </string>
+ <string name="No Blush">
+ Без румÑн
+ </string>
+ <string name="No Eyeliner">
+ Без подводки
+ </string>
+ <string name="No Eyeshadow">
+ Без теней
+ </string>
+ <string name="No Lipgloss">
+ Без блеÑка
+ </string>
+ <string name="No Lipstick">
+ Без помады
+ </string>
+ <string name="No Part">
+ Без пробора
+ </string>
+ <string name="No Polish">
+ Без лака
+ </string>
+ <string name="No Red">
+ Ðе краÑные
+ </string>
+ <string name="No Spikes">
+ Без «шипов»
+ </string>
+ <string name="No White">
+ Ðет белого
+ </string>
+ <string name="No Wrinkles">
+ Без морщин
+ </string>
+ <string name="Normal Lower">
+ Ðиже обычного
+ </string>
+ <string name="Normal Upper">
+ Выше обычного
+ </string>
+ <string name="Nose Left">
+ ÐÐ¾Ñ Ð²Ð»ÐµÐ²Ð¾
+ </string>
+ <string name="Nose Right">
+ ÐÐ¾Ñ Ð²Ð¿Ñ€Ð°Ð²Ð¾
+ </string>
+ <string name="Nose Size">
+ Размер ноÑа
+ </string>
+ <string name="Nose Thickness">
+ Толщина ноÑа
+ </string>
+ <string name="Nose Tip Angle">
+ ЗагнутоÑÑ‚ÑŒ кончика ноÑа
+ </string>
+ <string name="Nose Tip Shape">
+ Форма кончика ноÑа
+ </string>
+ <string name="Nose Width">
+ Ширина ноÑа
+ </string>
+ <string name="Nostril Division">
+ Перегородка
+ </string>
+ <string name="Nostril Width">
+ Ширина ноздрей
+ </string>
+ <string name="Opaque">
+ Ðепрозрачный
+ </string>
+ <string name="Open">
+ Открыто
+ </string>
+ <string name="Open Back">
+ Открыто Ñзади
+ </string>
+ <string name="Open Front">
+ Открыто Ñпереди
+ </string>
+ <string name="Open Left">
+ Открыто Ñлева
+ </string>
+ <string name="Open Right">
+ Открыто Ñправа
+ </string>
+ <string name="Orange">
+ Оранжевый
+ </string>
+ <string name="Out">
+ Ðаружу
+ </string>
+ <string name="Out Shdw Color">
+ Цвет внешних теней
+ </string>
+ <string name="Out Shdw Opacity">
+ ПрозрачноÑÑ‚ÑŒ внеш. теней
+ </string>
+ <string name="Outer Eye Corner">
+ Внешние уголки глаз
+ </string>
+ <string name="Outer Eye Shadow">
+ Тени во внешних уголках
+ </string>
+ <string name="Outer Shadow">
+ Внешние тени
+ </string>
+ <string name="Overbite">
+ Глубокий прикуÑ
+ </string>
+ <string name="Package">
+ Гульфик
+ </string>
+ <string name="Painted Nails">
+ Покрашенные
+ </string>
+ <string name="Pale">
+ Бледный
+ </string>
+ <string name="Pants Crotch">
+ Шаг
+ </string>
+ <string name="Pants Fit">
+ Облегающие брюки
+ </string>
+ <string name="Pants Length">
+ Длина
+ </string>
+ <string name="Pants Waist">
+ Ð¢Ð°Ð»Ð¸Ñ Ð±Ñ€ÑŽÐº
+ </string>
+ <string name="Pants Wrinkles">
+ СмÑтоÑÑ‚ÑŒ брюк
+ </string>
+ <string name="Part">
+ Пробор
+ </string>
+ <string name="Part Bangs">
+ Челка Ñ Ð¿Ñ€Ð¾Ð±Ð¾Ñ€Ð¾Ð¼
+ </string>
+ <string name="Pectorals">
+ Грудные мышцы
+ </string>
+ <string name="Pigment">
+ ПигментациÑ
+ </string>
+ <string name="Pigtails">
+ ХвоÑÑ‚Ñ‹ по бокам
+ </string>
+ <string name="Pink">
+ Розовый
+ </string>
+ <string name="Pinker">
+ Розовее
+ </string>
+ <string name="Platform Height">
+ Ð’Ñ‹Ñота платформы
+ </string>
+ <string name="Platform Width">
+ Ширина платформы
+ </string>
+ <string name="Pointy">
+ ОÑтрые
+ </string>
+ <string name="Pointy Heels">
+ ОÑтрый каблук
+ </string>
+ <string name="Ponytail">
+ ХвоÑÑ‚ Ñзади
+ </string>
+ <string name="Poofy Skirt">
+ ÐŸÑ‹ÑˆÐ½Ð°Ñ ÑŽÐ±ÐºÐ°
+ </string>
+ <string name="Pop Left Eye">
+ Левый глаз
+ </string>
+ <string name="Pop Right Eye">
+ Правый глаз
+ </string>
+ <string name="Puffy">
+ Пухлые
+ </string>
+ <string name="Puffy Eyelids">
+ ПрипухлоÑÑ‚ÑŒ век
+ </string>
+ <string name="Rainbow Color">
+ Цвета радуги
+ </string>
+ <string name="Red Hair">
+ Рыжие волоÑÑ‹
+ </string>
+ <string name="Regular">
+ Обычное
+ </string>
+ <string name="Right Part">
+ Правый пробор
+ </string>
+ <string name="Rosy Complexion">
+ Розовое лицо
+ </string>
+ <string name="Round">
+ Круглое
+ </string>
+ <string name="Ruddiness">
+ РумÑнец
+ </string>
+ <string name="Ruddy">
+ РумÑный
+ </string>
+ <string name="Rumpled Hair">
+ Взъерошенные
+ </string>
+ <string name="Saddle Bags">
+ Галифе
+ </string>
+ <string name="Scrawny Leg">
+ Ð¡ÑƒÑ…Ð¾Ð¿Ð°Ñ€Ð°Ñ Ð½Ð¾Ð³Ð°
+ </string>
+ <string name="Separate">
+ Разделить
+ </string>
+ <string name="Shallow">
+ Мелко
+ </string>
+ <string name="Shear Back">
+ Ð¡ÐºÐ¾Ñ Ñзади
+ </string>
+ <string name="Shear Face">
+ ÐŸÐµÑ€ÐµÐºÐ¾Ñ Ð»Ð¸Ñ†Ð°
+ </string>
+ <string name="Shear Front">
+ Ð¡ÐºÐ¾Ñ Ñпереди
+ </string>
+ <string name="Shear Left Up">
+ Ð¡ÐºÐ¾Ñ Ð²Ð»ÐµÐ²Ð¾ вверх
+ </string>
+ <string name="Shear Right Up">
+ Ð¡ÐºÐ¾Ñ Ð²Ð¿Ñ€Ð°Ð²Ð¾ вверх
+ </string>
+ <string name="Sheared Back">
+ Уменьшено Ñзади
+ </string>
+ <string name="Sheared Front">
+ Уменьшено Ñпереди
+ </string>
+ <string name="Shift Left">
+ Сдвинуть влево
+ </string>
+ <string name="Shift Mouth">
+ Сдвинуть рот
+ </string>
+ <string name="Shift Right">
+ Сдвинуть вправо
+ </string>
+ <string name="Shirt Bottom">
+ Ðиз рубашки
+ </string>
+ <string name="Shirt Fit">
+ Облегание рубашки
+ </string>
+ <string name="Shirt Wrinkles">
+ ПомÑтоÑÑ‚ÑŒ рубашки
+ </string>
+ <string name="Shoe Height">
+ Ð’Ñ‹Ñота обуви
+ </string>
+ <string name="Short">
+ Ðиже
+ </string>
+ <string name="Short Arms">
+ Короткие руки
+ </string>
+ <string name="Short Legs">
+ Короткие ноги
+ </string>
+ <string name="Short Neck">
+ ÐšÐ¾Ñ€Ð¾Ñ‚ÐºÐ°Ñ ÑˆÐµÑ
+ </string>
+ <string name="Short Pigtails">
+ Короткие хвоÑÑ‚Ñ‹ по бокам
+ </string>
+ <string name="Short Ponytail">
+ Короткий хвоÑÑ‚ Ñзади
+ </string>
+ <string name="Short Sideburns">
+ Короткие баки
+ </string>
+ <string name="Short Torso">
+ Короткий торÑ
+ </string>
+ <string name="Short hips">
+ Короткие бедра
+ </string>
+ <string name="Shoulders">
+ Плечи
+ </string>
+ <string name="Side Fringe">
+ Челка набок
+ </string>
+ <string name="Sideburns">
+ Бакенбарды
+ </string>
+ <string name="Sides Hair">
+ ВолоÑÑ‹ по бокам
+ </string>
+ <string name="Sides Hair Down">
+ ВолоÑÑ‹ по бокам внизу
+ </string>
+ <string name="Sides Hair Up">
+ ВолоÑÑ‹ по бокам вверху
+ </string>
+ <string name="Skinny Neck">
+ Ð¥ÑƒÐ´Ð°Ñ ÑˆÐµÑ
+ </string>
+ <string name="Skirt Fit">
+ ÐžÐ±Ð»ÐµÐ³Ð°ÑŽÑ‰Ð°Ñ ÑŽÐ±ÐºÐ°
+ </string>
+ <string name="Skirt Length">
+ Длина юбки
+ </string>
+ <string name="Slanted Forehead">
+ Ðаклонный лоб
+ </string>
+ <string name="Sleeve Length">
+ Длина рукавов
+ </string>
+ <string name="Sleeve Looseness">
+ Ширина рукавов
+ </string>
+ <string name="Slit Back">
+ Разрез: Ñзади
+ </string>
+ <string name="Slit Front">
+ Разрез: Ñпереди
+ </string>
+ <string name="Slit Left">
+ Разрез: Ñлева
+ </string>
+ <string name="Slit Right">
+ Разрез: Ñправа
+ </string>
+ <string name="Small">
+ Меньше
+ </string>
+ <string name="Small Hands">
+ Маленькие киÑти
+ </string>
+ <string name="Small Head">
+ ÐœÐ°Ð»ÐµÐ½ÑŒÐºÐ°Ñ Ð³Ð¾Ð»Ð¾Ð²Ð°
+ </string>
+ <string name="Smooth">
+ Гладко
+ </string>
+ <string name="Smooth Hair">
+ Приглаженные
+ </string>
+ <string name="Socks Length">
+ Длина ноÑков
+ </string>
+ <string name="Soulpatch">
+ ЭÑпаньолка
+ </string>
+ <string name="Sparse">
+ Жидкие
+ </string>
+ <string name="Spiked Hair">
+ ПричеÑка «шипами»
+ </string>
+ <string name="Square">
+ Квадратный
+ </string>
+ <string name="Square Toe">
+ Квадратный ноÑок
+ </string>
+ <string name="Squash Head">
+ Голова-тыква
+ </string>
+ <string name="Stretch Head">
+ Ð’Ñ‹Ñ‚ÑнутоÑÑ‚ÑŒ головы
+ </string>
+ <string name="Sunken">
+ Впалые
+ </string>
+ <string name="Sunken Chest">
+ Ð’Ð¿Ð°Ð»Ð°Ñ Ð³Ñ€ÑƒÐ´ÑŒ
+ </string>
+ <string name="Sunken Eyes">
+ Впалые глаза
+ </string>
+ <string name="Sweep Back">
+ ЗачеÑанные назад
+ </string>
+ <string name="Sweep Forward">
+ ЗачеÑанные вперед
+ </string>
+ <string name="Tall">
+ Выше
+ </string>
+ <string name="Taper Back">
+ ÐšÐ¾Ð½ÑƒÑ Ñзади
+ </string>
+ <string name="Taper Front">
+ ÐšÐ¾Ð½ÑƒÑ Ñпереди
+ </string>
+ <string name="Thick Heels">
+ Широкий каблук
+ </string>
+ <string name="Thick Neck">
+ ТолÑÑ‚Ð°Ñ ÑˆÐµÑ
+ </string>
+ <string name="Thick Toe">
+ ТолÑтый ноÑок
+ </string>
+ <string name="Thin">
+ Тонкий
+ </string>
+ <string name="Thin Eyebrows">
+ Тонкие брови
+ </string>
+ <string name="Thin Lips">
+ Тонкие губы
+ </string>
+ <string name="Thin Nose">
+ Тонкий ноÑ
+ </string>
+ <string name="Tight Chin">
+ Тонкий подбородок
+ </string>
+ <string name="Tight Cuffs">
+ Манжеты на резинке
+ </string>
+ <string name="Tight Pants">
+ Облегающие брюки
+ </string>
+ <string name="Tight Shirt">
+ ÐžÐ±Ð»ÐµÐ³Ð°ÑŽÑ‰Ð°Ñ Ñ€ÑƒÐ±Ð°ÑˆÐºÐ°
+ </string>
+ <string name="Tight Skirt">
+ ÐžÐ±Ð»ÐµÐ³Ð°ÑŽÑ‰Ð°Ñ ÑŽÐ±ÐºÐ°
+ </string>
+ <string name="Tight Sleeves">
+ Облегающие рукава
+ </string>
+ <string name="Toe Shape">
+ Форма ноÑка
+ </string>
+ <string name="Toe Thickness">
+ Толщина ноÑка
+ </string>
+ <string name="Torso Length">
+ Длина торÑа
+ </string>
+ <string name="Torso Muscles">
+ МуÑкулиÑтоÑÑ‚ÑŒ торÑа
+ </string>
+ <string name="Torso Scrawny">
+ СухопароÑÑ‚ÑŒ торÑа
+ </string>
+ <string name="Unattached">
+ Ðе прикреплено
+ </string>
+ <string name="Uncreased">
+ Без Ñкладок
+ </string>
+ <string name="Underbite">
+ Мезиальный прикуÑ
+ </string>
+ <string name="Unnatural">
+ ÐееÑтеÑтвенный
+ </string>
+ <string name="Upper Bridge">
+ ПереноÑица
+ </string>
+ <string name="Upper Cheeks">
+ Щеки выше
+ </string>
+ <string name="Upper Chin Cleft">
+ Ямка на подбородке выше
+ </string>
+ <string name="Upper Eyelid Fold">
+ Складка верхнего века
+ </string>
+ <string name="Upturned">
+ Вверх
+ </string>
+ <string name="Very Red">
+ Очень краÑные
+ </string>
+ <string name="Waist Height">
+ Ð’Ñ‹Ñота талии
+ </string>
+ <string name="Well-Fed">
+ Упитанные
+ </string>
+ <string name="White Hair">
+ Белые волоÑÑ‹
+ </string>
+ <string name="Wide">
+ Широко
+ </string>
+ <string name="Wide Back">
+ Широко Ñзади
+ </string>
+ <string name="Wide Front">
+ Широкий перед
+ </string>
+ <string name="Wide Lips">
+ Широкие губы
+ </string>
+ <string name="Wild">
+ Безумный
+ </string>
+ <string name="Wrinkles">
+ Складки
+ </string>
+ <string name="LocationCtrlAddLandmarkTooltip">
+ Добавить в закладки
+ </string>
+ <string name="LocationCtrlEditLandmarkTooltip">
+ Изменить закладку
+ </string>
+ <string name="LocationCtrlInfoBtnTooltip">
+ ПоÑмотреть подробную информацию о текущем меÑте
+ </string>
+ <string name="LocationCtrlComboBtnTooltip">
+ ÐœÐ¾Ñ Ð¸ÑÑ‚Ð¾Ñ€Ð¸Ñ Ð¿Ð¾Ñещений
+ </string>
+ <string name="LocationCtrlForSaleTooltip">
+ Купить Ñту землю
+ </string>
+ <string name="LocationCtrlVoiceTooltip">
+ ГолоÑовое общение здеÑÑŒ недоÑтупно
+ </string>
+ <string name="LocationCtrlFlyTooltip">
+ Полеты запрещены
+ </string>
+ <string name="LocationCtrlPushTooltip">
+ ÐÐµÐ»ÑŒÐ·Ñ Ñ‚Ð¾Ð»ÐºÐ°Ñ‚ÑŒÑÑ
+ </string>
+ <string name="LocationCtrlBuildTooltip">
+ СтроительÑтво/выкладывание объектов не разрешено
+ </string>
+ <string name="LocationCtrlScriptsTooltip">
+ ЗапуÑкать Ñкрипты запрещено
+ </string>
+ <string name="LocationCtrlDamageTooltip">
+ Здоровье
+ </string>
+ <string name="LocationCtrlAdultIconTooltip">
+ ОблаÑÑ‚ÑŒ Ð´Ð»Ñ Ð²Ð·Ñ€Ð¾Ñлых
+ </string>
+ <string name="LocationCtrlModerateIconTooltip">
+ ОблаÑÑ‚ÑŒ умеренной дозволенноÑти
+ </string>
+ <string name="LocationCtrlGeneralIconTooltip">
+ ОблаÑÑ‚ÑŒ общей дозволенноÑти
+ </string>
+ <string name="LocationCtrlSeeAVsTooltip">
+ Ð’Ñе жители Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… учаÑтков могут видеть аватары и общатьÑÑ Ð² чате
+ </string>
+ <string name="UpdaterWindowTitle">
+ Обновление [APP_NAME]
+ </string>
+ <string name="UpdaterNowUpdating">
+ ОбновлÑетÑÑ [APP_NAME]...
+ </string>
+ <string name="UpdaterNowInstalling">
+ УÑтанавливаетÑÑ [APP_NAME]...
+ </string>
+ <string name="UpdaterUpdatingDescriptive">
+ Клиент [APP_NAME] обновлÑетÑÑ Ð´Ð¾ поÑледнего выпуÑка. Это может занÑÑ‚ÑŒ какое-то времÑ. ПроÑвите терпение.
+ </string>
+ <string name="UpdaterProgressBarTextWithEllipses">
+ Загрузка обновлениÑ...
+ </string>
+ <string name="UpdaterProgressBarText">
+ ЗагружаетÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ðµ
+ </string>
+ <string name="UpdaterFailDownloadTitle">
+ Ðе удалоÑÑŒ загрузить обновление
+ </string>
+ <string name="UpdaterFailUpdateDescriptive">
+ При обновлении Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ [APP_NAME] возникла ошибка. Загрузите новую верÑию на Ñайте www.secondlife.com.
+ </string>
+ <string name="UpdaterFailInstallTitle">
+ Ðе удалоÑÑŒ уÑтановить обновление
+ </string>
+ <string name="UpdaterFailStartTitle">
+ Ðе удалоÑÑŒ запуÑтить клиент
+ </string>
+ <string name="ItemsComingInTooFastFrom">
+ [APP_NAME]: Из-за Ñлишком быÑтрого поÑÑ‚ÑƒÐ¿Ð»ÐµÐ½Ð¸Ñ Ñлементов Ñ [FROM_NAME] автоматичеÑкий проÑмотр отключен на [TIME] Ñ
+ </string>
+ <string name="ItemsComingInTooFast">
+ [APP_NAME]: из-за Ñлишком быÑтрого поÑÑ‚ÑƒÐ¿Ð»ÐµÐ½Ð¸Ñ Ñлементов автоматичеÑкий проÑмотр отключен на [TIME] Ñ
+ </string>
+ <string name="IM_logging_string">
+ -- Включена региÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ñообщений IM --
+ </string>
+ <string name="IM_typing_start_string">
+ [NAME] вводит текÑÑ‚...
+ </string>
+ <string name="Unnamed">
+ (Без имени)
+ </string>
+ <string name="IM_moderated_chat_label">
+ (МодерируетÑÑ: голоÑа по умолчанию отключены)
+ </string>
+ <string name="IM_unavailable_text_label">
+ Во Ð²Ñ€ÐµÐ¼Ñ Ñтого звонка текÑтовый чат недоÑтупен.
+ </string>
+ <string name="IM_muted_text_label">
+ Ваш текÑтовый чат отключен модератором группы.
+ </string>
+ <string name="IM_default_text_label">
+ Щелкните здеÑÑŒ, чтобы Ñоздать IM-Ñообщение.
+ </string>
+ <string name="IM_to_label">
+ Кому
+ </string>
+ <string name="IM_moderator_label">
+ (Модератор)
+ </string>
+ <string name="Saved_message">
+ (Сохранено [LONG_TIMESTAMP])
+ </string>
+ <string name="IM_unblock_only_groups_friends">
+ Ð”Ð»Ñ Ð¿Ñ€Ð¾Ñмотра Ñтого ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñнимите флажок «Только Ð´Ñ€ÑƒÐ·ÑŒÑ Ð¸ группы могут звонить мне и отправлÑÑ‚ÑŒ IM» в окне «ÐаÑтройки/ПриватноÑть».
+ </string>
+ <string name="answered_call">
+ Ðа ваш звонок ответили
+ </string>
+ <string name="you_started_call">
+ Ð’Ñ‹ начали голоÑовую беÑеду
+ </string>
+ <string name="you_joined_call">
+ Ð’Ñ‹ приÑоединилиÑÑŒ к голоÑовой беÑеде
+ </string>
+ <string name="name_started_call">
+ Житель [NAME] начал голоÑовую беÑеду
+ </string>
+ <string name="ringing-im">
+ ПриÑоединение к голоÑовой беÑеде...
+ </string>
+ <string name="connected-im">
+ Соединение уÑтановлено. Выберите команду «Прервать звонок», чтобы повеÑить трубку
+ </string>
+ <string name="hang_up-im">
+ ГолоÑовой звонок прерван
+ </string>
+ <string name="answering-im">
+ СоединÑетÑÑ...
+ </string>
+ <string name="conference-title">
+ Ð¡Ð¿Ð¾Ð½Ñ‚Ð°Ð½Ð½Ð°Ñ ÐºÐ¾Ð½Ñ„ÐµÑ€ÐµÐ½Ñ†Ð¸Ñ
+ </string>
+ <string name="conference-title-incoming">
+ ÐšÐ¾Ð½Ñ„ÐµÑ€ÐµÐ½Ñ†Ð¸Ñ Ñ Ð¶Ð¸Ñ‚ÐµÐ»ÐµÐ¼ [AGENT_NAME]
+ </string>
+ <string name="inventory_item_offered-im">
+ Предложено пополнить инвентарь
+ </string>
+ <string name="share_alert">
+ ПеретаÑкивайте вещи из Ð¸Ð½Ð²ÐµÐ½Ñ‚Ð°Ñ€Ñ Ñюда
+ </string>
+ <string name="no_session_message">
+ (Ð¡ÐµÐ°Ð½Ñ IM не ÑущеÑтвует)
+ </string>
+ <string name="only_user_message">
+ Вы – единÑтвенный пользователь в Ñтом ÑеанÑе.
+ </string>
+ <string name="offline_message">
+ [NAME] не в Ñети.
+ </string>
+ <string name="invite_message">
+ Ðажмите кнопку [BUTTON NAME], чтобы учаÑтвовать в Ñтом голоÑовом чате.
+ </string>
+ <string name="muted_message">
+ Ð’Ñ‹ заблокировали Ñтого жителÑ. ЕÑли отправить ему Ñообщение, блок автоматичеÑки ÑниметÑÑ.
+ </string>
+ <string name="generic">
+ Ошибка при запроÑе. Повторите попытку.
+ </string>
+ <string name="generic_request_error">
+ Ошибка при запроÑе. Повторите попытку.
+ </string>
+ <string name="insufficient_perms_error">
+ У Ð²Ð°Ñ Ð½ÐµÐ´Ð¾Ñтаточно разрешений.
+ </string>
+ <string name="session_does_not_exist_error">
+ Ð¡ÐµÐ°Ð½Ñ Ð±Ð¾Ð»ÑŒÑˆÐµ не ÑущеÑтвует
+ </string>
+ <string name="no_ability_error">
+ У Ð²Ð°Ñ Ð½ÐµÑ‚ Ñтой ÑпоÑобноÑти.
+ </string>
+ <string name="no_ability">
+ У Ð²Ð°Ñ Ð½ÐµÑ‚ Ñтой ÑпоÑобноÑти.
+ </string>
+ <string name="not_a_mod_error">
+ Вы – не модератор ÑеанÑа.
+ </string>
+ <string name="muted">
+ Модератор группы отключил Ð´Ð»Ñ Ð²Ð°Ñ Ñ‚ÐµÐºÑтовый чат.
+ </string>
+ <string name="muted_error">
+ Модератор группы отключил Ð´Ð»Ñ Ð²Ð°Ñ Ñ‚ÐµÐºÑтовый чат.
+ </string>
+ <string name="add_session_event">
+ Ðе удаетÑÑ Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ‚ÑŒ пользователей в ÑÐµÐ°Ð½Ñ Ñ‡Ð°Ñ‚Ð° Ñ Ð¶Ð¸Ñ‚ÐµÐ»ÐµÐ¼ [RECIPIENT].
+ </string>
+ <string name="message">
+ Ðе удаетÑÑ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð¸Ñ‚ÑŒ ваше Ñообщение в ÑÐµÐ°Ð½Ñ Ñ‡Ð°Ñ‚Ð° Ñ Ð¶Ð¸Ñ‚ÐµÐ»ÐµÐ¼ [RECIPIENT].
+ </string>
+ <string name="message_session_event">
+ Ðе удаетÑÑ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð¸Ñ‚ÑŒ ваше Ñообщение в ÑÐµÐ°Ð½Ñ Ñ‡Ð°Ñ‚Ð° Ñ Ð¶Ð¸Ñ‚ÐµÐ»ÐµÐ¼ [RECIPIENT].
+ </string>
+ <string name="mute">
+ Ошибка при модерировании.
+ </string>
+ <string name="removed">
+ Ð’Ñ‹ иÑключены из группы.
+ </string>
+ <string name="removed_from_group">
+ Ð’Ñ‹ иÑключены из группы.
+ </string>
+ <string name="close_on_no_ability">
+ У Ð²Ð°Ñ Ð±Ð¾Ð»ÑŒÑˆÐµ нет возможноÑти учаÑтвовать в ÑеанÑе чата.
+ </string>
+ <string name="unread_chat_single">
+ [SOURCES] Ñказал что-то новое
+ </string>
+ <string name="unread_chat_multiple">
+ [SOURCES] Ñказал что-то новое
+ </string>
+ <string name="session_initialization_timed_out_error">
+ ИÑтекло Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð¸Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ð¸ ÑеанÑа
+ </string>
+ <string name="Home position set.">
+ Задано положение дома.
+ </string>
+ <string name="voice_morphing_url">
+ http://secondlife.com/landing/voicemorphing
+ </string>
+ <string name="paid_you_ldollars">
+ Житель [NAME] заплатил вам L$[AMOUNT] за [REASON].
+ </string>
+ <string name="paid_you_ldollars_no_reason">
+ Житель [NAME] заплатил вам L$[AMOUNT].
+ </string>
+ <string name="you_paid_ldollars">
+ Вы заплатили жителю [NAME] L$[AMOUNT] за [REASON].
+ </string>
+ <string name="you_paid_ldollars_no_info">
+ Вы заплатили L$[AMOUNT].
+ </string>
+ <string name="you_paid_ldollars_no_reason">
+ Вы заплатили жителю [NAME] L$[AMOUNT].
+ </string>
+ <string name="you_paid_ldollars_no_name">
+ Вы заплатили L$[AMOUNT] за [REASON].
+ </string>
+ <string name="you_paid_failure_ldollars">
+ Ð’Ñ‹ не Ñмогли заплатить пользователю [NAME] L$[AMOUNT]: [REASON].
+ </string>
+ <string name="you_paid_failure_ldollars_no_info">
+ Ð’Ñ‹ не Ñмогли заплатить L$[AMOUNT]
+ </string>
+ <string name="you_paid_failure_ldollars_no_reason">
+ Ð’Ñ‹ не Ñмогли заплатить пользователю [NAME] L$[AMOUNT]
+ </string>
+ <string name="you_paid_failure_ldollars_no_name">
+ Ð’Ñ‹ не Ñмогли заплатить L$[AMOUNT]: [REASON].
+ </string>
+ <string name="for item">
+ за [ITEM]
+ </string>
+ <string name="for a parcel of land">
+ за земельный учаÑток
+ </string>
+ <string name="for a land access pass">
+ за пропуÑк на землю
+ </string>
+ <string name="for deeding land">
+ за передачу земли
+ </string>
+ <string name="to create a group">
+ за Ñоздание группы
+ </string>
+ <string name="to join a group">
+ за вÑтупление в группу
+ </string>
+ <string name="to upload">
+ за передачу по Ñети
+ </string>
+ <string name="to publish a classified ad">
+ за публикацию рекламы
+ </string>
+ <string name="giving">
+ Уплата L$[AMOUNT]
+ </string>
+ <string name="uploading_costs">
+ Передача Ñтоит L$[AMOUNT]
+ </string>
+ <string name="this_costs">
+ Это Ñтоит L$[AMOUNT]
+ </string>
+ <string name="buying_selected_land">
+ Покупка выбранной земли за L$[AMOUNT]
+ </string>
+ <string name="this_object_costs">
+ Этот объект Ñтоит L$[AMOUNT]
+ </string>
+ <string name="group_role_everyone">
+ Ð’Ñе
+ </string>
+ <string name="group_role_officers">
+ ДолжноÑтные лица
+ </string>
+ <string name="group_role_owners">
+ Владельцы
+ </string>
+ <string name="group_member_status_online">
+ Ð’ Ñети
+ </string>
+ <string name="uploading_abuse_report">
+ ЗагружаетÑÑ...
+
+Жалоба
+ </string>
+ <string name="New Shape">
+ ÐÐ¾Ð²Ð°Ñ Ñ„Ð¸Ð³ÑƒÑ€Ð°
+ </string>
+ <string name="New Skin">
+ ÐÐ¾Ð²Ð°Ñ ÐºÐ¾Ð¶Ð°
+ </string>
+ <string name="New Hair">
+ Ðовые волоÑÑ‹
+ </string>
+ <string name="New Eyes">
+ Ðовые глаза
+ </string>
+ <string name="New Shirt">
+ ÐÐ¾Ð²Ð°Ñ Ñ€ÑƒÐ±Ð°ÑˆÐºÐ°
+ </string>
+ <string name="New Pants">
+ Ðовые брюки
+ </string>
+ <string name="New Shoes">
+ ÐÐ¾Ð²Ð°Ñ Ð¾Ð±ÑƒÐ²ÑŒ
+ </string>
+ <string name="New Socks">
+ Ðовые ноÑки
+ </string>
+ <string name="New Jacket">
+ Ðовый пиджак
+ </string>
+ <string name="New Gloves">
+ Ðовые перчатки
+ </string>
+ <string name="New Undershirt">
+ ÐÐ¾Ð²Ð°Ñ Ð¼Ð°Ð¹ÐºÐ°
+ </string>
+ <string name="New Underpants">
+ Ðовые труÑÑ‹
+ </string>
+ <string name="New Skirt">
+ ÐÐ¾Ð²Ð°Ñ ÑŽÐ±ÐºÐ°
+ </string>
+ <string name="New Alpha">
+ ÐÐ¾Ð²Ð°Ñ Ð°Ð»ÑŒÑ„Ð°-маÑка
+ </string>
+ <string name="New Tattoo">
+ Ðовое тату
+ </string>
+ <string name="New Physics">
+ ÐÐ¾Ð²Ð°Ñ Ñ„Ð¸Ð·Ð¸ÐºÐ°
+ </string>
+ <string name="Invalid Wearable">
+ ÐÐµÐ»ÑŒÐ·Ñ Ð½Ð¾Ñить
+ </string>
+ <string name="New Gesture">
+ Ðовый жеÑÑ‚
+ </string>
+ <string name="New Script">
+ Ðовый Ñкрипт
+ </string>
+ <string name="New Note">
+ ÐÐ¾Ð²Ð°Ñ Ð·Ð°Ð¼ÐµÑ‚ÐºÐ°
+ </string>
+ <string name="New Folder">
+ ÐÐ¾Ð²Ð°Ñ Ð¿Ð°Ð¿ÐºÐ°
+ </string>
+ <string name="Contents">
+ Контент
+ </string>
+ <string name="Gesture">
+ ЖеÑÑ‚
+ </string>
+ <string name="Male Gestures">
+ МужÑкие жеÑÑ‚Ñ‹
+ </string>
+ <string name="Female Gestures">
+ ЖенÑкие жеÑÑ‚Ñ‹
+ </string>
+ <string name="Other Gestures">
+ Прочие жеÑÑ‚Ñ‹
+ </string>
+ <string name="Speech Gestures">
+ ЖеÑÑ‚Ñ‹ в разговорах
+ </string>
+ <string name="Common Gestures">
+ Стандартные жеÑÑ‚Ñ‹
+ </string>
+ <string name="Male - Excuse me">
+ Мужчина – извинение
+ </string>
+ <string name="Male - Get lost">
+ Мужчина – ÑкройтеÑÑŒ
+ </string>
+ <string name="Male - Blow kiss">
+ Мужчина – воздушный поцелуй
+ </string>
+ <string name="Male - Boo">
+ Мужчина – фу!
+ </string>
+ <string name="Male - Bored">
+ Мужчина – Ñкука
+ </string>
+ <string name="Male - Hey">
+ Мужчина – Ñй!
+ </string>
+ <string name="Male - Laugh">
+ Мужчина – Ñмех
+ </string>
+ <string name="Male - Repulsed">
+ Мужчина – неприÑтие
+ </string>
+ <string name="Male - Shrug">
+ Мужчина – пожимает плечами
+ </string>
+ <string name="Male - Stick tougue out">
+ Мужчина – показывает Ñзык
+ </string>
+ <string name="Male - Wow">
+ Мужчина – ух ты!
+ </string>
+ <string name="Female - Chuckle">
+ Женщина – Ñмешок
+ </string>
+ <string name="Female - Cry">
+ Женщина – плач
+ </string>
+ <string name="Female - Embarrassed">
+ Женщина – Ñмущение
+ </string>
+ <string name="Female - Excuse me">
+ Женщина – извинение
+ </string>
+ <string name="Female - Get lost">
+ Женщина – ÑкройтеÑÑŒ
+ </string>
+ <string name="Female - Blow kiss">
+ Женщина – воздушный поцелуй
+ </string>
+ <string name="Female - Boo">
+ Женщина – фу!
+ </string>
+ <string name="Female - Bored">
+ Женщина – Ñкука
+ </string>
+ <string name="Female - Hey">
+ Женщина – Ñй!
+ </string>
+ <string name="Female - Hey baby">
+ Женщина – Ñй, бейби!
+ </string>
+ <string name="Female - Laugh">
+ Женщина – Ñмех
+ </string>
+ <string name="Female - Looking good">
+ Женщина – хорошо выглÑдишь
+ </string>
+ <string name="Female - Over here">
+ Женщина – Ñюда!
+ </string>
+ <string name="Female - Please">
+ Женщина – проÑьба
+ </string>
+ <string name="Female - Repulsed">
+ Женщина – неприÑтие
+ </string>
+ <string name="Female - Shrug">
+ Женщина – пожимает плечами
+ </string>
+ <string name="Female - Stick tougue out">
+ Женщина – показывает Ñзык
+ </string>
+ <string name="Female - Wow">
+ Женщина – ух ты!
+ </string>
+ <string name="/bow">
+ /поклонитьÑÑ
+ </string>
+ <string name="/clap">
+ /хлопнуть
+ </string>
+ <string name="/count">
+ /Ñчет
+ </string>
+ <string name="/extinguish">
+ /затушить
+ </string>
+ <string name="/kmb">
+ /поцелуй Ð¼ÐµÐ½Ñ Ð² зад
+ </string>
+ <string name="/muscle">
+ /Ñилач
+ </string>
+ <string name="/no">
+ /нет
+ </string>
+ <string name="/no!">
+ /нет!
+ </string>
+ <string name="/paper">
+ /бумага
+ </string>
+ <string name="/pointme">
+ /показать на ÑебÑ
+ </string>
+ <string name="/pointyou">
+ /показать на другого
+ </string>
+ <string name="/rock">
+ /камень
+ </string>
+ <string name="/scissor">
+ /ножницы
+ </string>
+ <string name="/smoke">
+ /курить
+ </string>
+ <string name="/stretch">
+ /потÑнутьÑÑ
+ </string>
+ <string name="/whistle">
+ /ÑвиÑтнуть
+ </string>
+ <string name="/yes">
+ /да
+ </string>
+ <string name="/yes!">
+ /о да!
+ </string>
+ <string name="afk">
+ отошел
+ </string>
+ <string name="dance1">
+ танец1
+ </string>
+ <string name="dance2">
+ танец2
+ </string>
+ <string name="dance3">
+ танец3
+ </string>
+ <string name="dance4">
+ танец4
+ </string>
+ <string name="dance5">
+ танец5
+ </string>
+ <string name="dance6">
+ танец6
+ </string>
+ <string name="dance7">
+ танец7
+ </string>
+ <string name="dance8">
+ танец8
+ </string>
+ <string name="AvatarBirthDateFormat">
+ [day,datetime,slt].[mthnum,datetime,slt].[year,datetime,slt]
+ </string>
+ <string name="DefaultMimeType">
+ нет/нет
+ </string>
+ <string name="texture_load_dimensions_error">
+ ÐÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð³Ñ€ÑƒÐ¶Ð°Ñ‚ÑŒ изображениÑ, размер которых превышает [WIDTH]*[HEIGHT]
+ </string>
+ <string name="words_separator" value=","/>
+ <string name="server_is_down">
+ ÐеÑÐ¼Ð¾Ñ‚Ñ€Ñ Ð½Ð° наши уÑилиÑ, что-то неожиданно пошло не так.
+
+ ОзнакомьтеÑÑŒ Ñ Ð¾Ð¿Ð¸Ñанием извеÑтных проблем в работе Ñтой Ñлужбы на Ñайте status.secondlifegrid.net.
+ ЕÑли проблемы продолжаютÑÑ, то проверьте подключение к Ñети и наÑтройки брандмауÑра.
+ </string>
+ <string name="dateTimeWeekdaysNames">
+ ВоÑкреÑенье:Понедельник:Вторник:Среда:Четверг:ПÑтница:Суббота
+ </string>
+ <string name="dateTimeWeekdaysShortNames">
+ Ð’Ñ:Пн:Ð’Ñ‚:Ср:Чт:Пт:Сб
+ </string>
+ <string name="dateTimeMonthNames">
+ Январь:Февраль:Март:Ðпрель:Май:Июнь:Июль:ÐвгуÑÑ‚:СентÑбрь:ОктÑбрь:ÐоÑбрь:Декабрь
+ </string>
+ <string name="dateTimeMonthShortNames">
+ Янв:Фев:Мар:Ðпр:Май:Июн:Июл:Ðвг:Сен:Окт:ÐоÑ:Дек
+ </string>
+ <string name="dateTimeDayFormat">
+ [MDAY]
+ </string>
+ <string name="dateTimeAM">
+ до полуднÑ
+ </string>
+ <string name="dateTimePM">
+ поÑле полуднÑ
+ </string>
+ <string name="LocalEstimateUSD">
+ [AMOUNT] US$
+ </string>
+ <string name="Membership">
+ ЧленÑтво
+ </string>
+ <string name="Roles">
+ Роли
+ </string>
+ <string name="Group Identity">
+ УдоÑтоверение группы
+ </string>
+ <string name="Parcel Management">
+ Управление учаÑтком
+ </string>
+ <string name="Parcel Identity">
+ УдоÑтоверение учаÑтка
+ </string>
+ <string name="Parcel Settings">
+ Параметры учаÑтка
+ </string>
+ <string name="Parcel Powers">
+ СпоÑобноÑти Ð´Ð»Ñ ÑƒÑ‡Ð°Ñтка
+ </string>
+ <string name="Parcel Access">
+ ДоÑтуп к учаÑтку
+ </string>
+ <string name="Parcel Content">
+ Содержимое на учаÑтке
+ </string>
+ <string name="Object Management">
+ Управление объектами
+ </string>
+ <string name="Accounting">
+ БухгалтериÑ
+ </string>
+ <string name="Notices">
+ УведомлениÑ
+ </string>
+ <string name="Chat">
+ Чат
+ </string>
+ <string name="DeleteItems">
+ Удалить выбранные объекты?
+ </string>
+ <string name="DeleteItem">
+ Удалить выбранный объект?
+ </string>
+ <string name="EmptyOutfitText">
+ Ð”Ð»Ñ Ñтого коÑтюма нет вещей
+ </string>
+ <string name="ExternalEditorNotSet">
+ Выберите редактор, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€ ExternalEditor.
+ </string>
+ <string name="ExternalEditorNotFound">
+ Ðе удаетÑÑ Ð½Ð°Ð¹Ñ‚Ð¸ указанный внешний редактор.
+Попробуйте взÑÑ‚ÑŒ путь к редактору в двойные кавычки
+(например &quot;/path to my/editor&quot; &quot;%s&quot;)
+ </string>
+ <string name="ExternalEditorCommandParseError">
+ Ошибка анализа командной Ñтроки Ð´Ð»Ñ Ð²Ð½ÐµÑˆÐ½ÐµÐ³Ð¾ редактора.
+ </string>
+ <string name="ExternalEditorFailedToRun">
+ Ðе удалоÑÑŒ запуÑтить внешний редактор.
+ </string>
+ <string name="TranslationFailed">
+ Ошибка телепортации: [REASON]
+ </string>
+ <string name="TranslationResponseParseError">
+ Ошибка при анализе ответа переводчика.
+ </string>
+ <string name="Esc">
+ ESC
+ </string>
+ <string name="Space">
+ ПРОБЕЛ
+ </string>
+ <string name="Enter">
+ ВВОД
+ </string>
+ <string name="Tab">
+ TAB
+ </string>
+ <string name="Ins">
+ INS
+ </string>
+ <string name="Del">
+ DEL
+ </string>
+ <string name="Backsp">
+ BACKSP
+ </string>
+ <string name="Shift">
+ SHIFT
+ </string>
+ <string name="Ctrl">
+ CTRL
+ </string>
+ <string name="Alt">
+ ALT
+ </string>
+ <string name="CapsLock">
+ CAPSLOCK
+ </string>
+ <string name="Left">
+ Стрелка влево
+ </string>
+ <string name="Right">
+ Стрелка вправо
+ </string>
+ <string name="Up">
+ Стрелка вверх
+ </string>
+ <string name="Down">
+ Стрелка вниз
+ </string>
+ <string name="Home">
+ HOME
+ </string>
+ <string name="End">
+ END
+ </string>
+ <string name="PgUp">
+ PgUp
+ </string>
+ <string name="PgDn">
+ PgDn
+ </string>
+ <string name="F1">
+ F1
+ </string>
+ <string name="F2">
+ F2
+ </string>
+ <string name="F3">
+ F3
+ </string>
+ <string name="F4">
+ F4
+ </string>
+ <string name="F5">
+ F5
+ </string>
+ <string name="F6">
+ F6
+ </string>
+ <string name="F7">
+ F7
+ </string>
+ <string name="F8">
+ F8
+ </string>
+ <string name="F9">
+ F9
+ </string>
+ <string name="F10">
+ F10
+ </string>
+ <string name="F11">
+ F11
+ </string>
+ <string name="F12">
+ F12
+ </string>
+ <string name="Add">
+ +
+ </string>
+ <string name="Subtract">
+ -
+ </string>
+ <string name="Multiply">
+ *
+ </string>
+ <string name="Divide">
+ /
+ </string>
+ <string name="PAD_DIVIDE">
+ PAD_DIVIDE
+ </string>
+ <string name="PAD_LEFT">
+ PAD_LEFT
+ </string>
+ <string name="PAD_RIGHT">
+ PAD_RIGHT
+ </string>
+ <string name="PAD_DOWN">
+ PAD_DOWN
+ </string>
+ <string name="PAD_UP">
+ PAD_UP
+ </string>
+ <string name="PAD_HOME">
+ PAD_HOME
+ </string>
+ <string name="PAD_END">
+ PAD_END
+ </string>
+ <string name="PAD_PGUP">
+ PAD_PGUP
+ </string>
+ <string name="PAD_PGDN">
+ PAD_PGDN
+ </string>
+ <string name="PAD_CENTER">
+ PAD_CENTER
+ </string>
+ <string name="PAD_INS">
+ PAD_INS
+ </string>
+ <string name="PAD_DEL">
+ PAD_DEL
+ </string>
+ <string name="PAD_Enter">
+ PAD_Enter
+ </string>
+ <string name="PAD_BUTTON0">
+ PAD_BUTTON0
+ </string>
+ <string name="PAD_BUTTON1">
+ PAD_BUTTON1
+ </string>
+ <string name="PAD_BUTTON2">
+ PAD_BUTTON2
+ </string>
+ <string name="PAD_BUTTON3">
+ PAD_BUTTON3
+ </string>
+ <string name="PAD_BUTTON4">
+ PAD_BUTTON4
+ </string>
+ <string name="PAD_BUTTON5">
+ PAD_BUTTON5
+ </string>
+ <string name="PAD_BUTTON6">
+ PAD_BUTTON6
+ </string>
+ <string name="PAD_BUTTON7">
+ PAD_BUTTON7
+ </string>
+ <string name="PAD_BUTTON8">
+ PAD_BUTTON8
+ </string>
+ <string name="PAD_BUTTON9">
+ PAD_BUTTON9
+ </string>
+ <string name="PAD_BUTTON10">
+ PAD_BUTTON10
+ </string>
+ <string name="PAD_BUTTON11">
+ PAD_BUTTON11
+ </string>
+ <string name="PAD_BUTTON12">
+ PAD_BUTTON12
+ </string>
+ <string name="PAD_BUTTON13">
+ PAD_BUTTON13
+ </string>
+ <string name="PAD_BUTTON14">
+ PAD_BUTTON14
+ </string>
+ <string name="PAD_BUTTON15">
+ PAD_BUTTON15
+ </string>
+ <string name="-">
+ -
+ </string>
+ <string name="=">
+ =
+ </string>
+ <string name="`">
+ `
+ </string>
+ <string name=";">
+ ;
+ </string>
+ <string name="[">
+ [
+ </string>
+ <string name="]">
+ ]
+ </string>
+ <string name="\">
+ \
+ </string>
+ <string name="0">
+ 0
+ </string>
+ <string name="1">
+ 1
+ </string>
+ <string name="2">
+ 2
+ </string>
+ <string name="3">
+ 3
+ </string>
+ <string name="4">
+ 4
+ </string>
+ <string name="5">
+ 5
+ </string>
+ <string name="6">
+ 6
+ </string>
+ <string name="7">
+ 7
+ </string>
+ <string name="8">
+ 8
+ </string>
+ <string name="9">
+ 9
+ </string>
+ <string name="A">
+ A
+ </string>
+ <string name="B">
+ B
+ </string>
+ <string name="C">
+ C
+ </string>
+ <string name="D">
+ D
+ </string>
+ <string name="E">
+ E
+ </string>
+ <string name="F">
+ F
+ </string>
+ <string name="G">
+ G
+ </string>
+ <string name="H">
+ H
+ </string>
+ <string name="I">
+ I
+ </string>
+ <string name="J">
+ J
+ </string>
+ <string name="K">
+ K
+ </string>
+ <string name="L">
+ L
+ </string>
+ <string name="M">
+ M
+ </string>
+ <string name="N">
+ N
+ </string>
+ <string name="O">
+ O
+ </string>
+ <string name="P">
+ P
+ </string>
+ <string name="Q">
+ Q
+ </string>
+ <string name="R">
+ R
+ </string>
+ <string name="S">
+ S
+ </string>
+ <string name="T">
+ T
+ </string>
+ <string name="U">
+ U
+ </string>
+ <string name="V">
+ V
+ </string>
+ <string name="W">
+ W
+ </string>
+ <string name="X">
+ X
+ </string>
+ <string name="Y">
+ Y
+ </string>
+ <string name="Z">
+ Z
+ </string>
+ <string name="BeaconParticle">
+ ПроÑмотр меток учаÑтков (Ñиние)
+ </string>
+ <string name="BeaconPhysical">
+ ПроÑмотр меток физичеÑких объектов (зеленые)
+ </string>
+ <string name="BeaconScripted">
+ ПроÑмотр меток объектов Ñо Ñкриптами (краÑные)
+ </string>
+ <string name="BeaconScriptedTouch">
+ ПроÑмотр меток объектов Ñо Ñкриптами и функцией каÑÐ°Ð½Ð¸Ñ (краÑные)
+ </string>
+ <string name="BeaconSound">
+ ПроÑмотр звуковых меток (желтые)
+ </string>
+ <string name="BeaconMedia">
+ ПроÑмотр медийных меток (белые)
+ </string>
+ <string name="ParticleHiding">
+ ЧаÑтицы Ñкрыты
+ </string>
+ <string name="Command_AboutLand_Label">
+ О земле
+ </string>
+ <string name="Command_Appearance_Label">
+ ВнешноÑÑ‚ÑŒ
+ </string>
+ <string name="Command_Avatar_Label">
+ Ðватар
+ </string>
+ <string name="Command_Build_Label">
+ СтроительÑтво
+ </string>
+ <string name="Command_Chat_Label">
+ Чат
+ </string>
+ <string name="Command_Compass_Label">
+ КомпаÑ
+ </string>
+ <string name="Command_Destinations_Label">
+ Пункты
+ </string>
+ <string name="Command_Gestures_Label">
+ ЖеÑÑ‚Ñ‹
+ </string>
+ <string name="Command_HowTo_Label">
+ ИнÑтрукции
+ </string>
+ <string name="Command_Inventory_Label">
+ Инвентарь
+ </string>
+ <string name="Command_Map_Label">
+ Карта
+ </string>
+ <string name="Command_Marketplace_Label">
+ Торговый центр
+ </string>
+ <string name="Command_MiniMap_Label">
+ Миникарта
+ </string>
+ <string name="Command_Move_Label">
+ Ходьба / бег / полет
+ </string>
+ <string name="Command_Outbox_Label">
+ Торговые иÑходÑщие
+ </string>
+ <string name="Command_People_Label">
+ Люди
+ </string>
+ <string name="Command_Picks_Label">
+ Подборка
+ </string>
+ <string name="Command_Places_Label">
+ МеÑта
+ </string>
+ <string name="Command_Preferences_Label">
+ ÐаÑтройки
+ </string>
+ <string name="Command_Profile_Label">
+ Профиль
+ </string>
+ <string name="Command_Search_Label">
+ ПоиÑк
+ </string>
+ <string name="Command_Snapshot_Label">
+ Снимок
+ </string>
+ <string name="Command_Speak_Label">
+ Говорить
+ </string>
+ <string name="Command_View_Label">
+ Управление камерой
+ </string>
+ <string name="Command_Voice_Label">
+ ÐаÑтройки голоÑа
+ </string>
+ <string name="Command_AboutLand_Tooltip">
+ Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ поÑещаемой вами земле
+ </string>
+ <string name="Command_Appearance_Tooltip">
+ Изменить аватар
+ </string>
+ <string name="Command_Avatar_Tooltip">
+ Выбор аватара
+ </string>
+ <string name="Command_Build_Tooltip">
+ ПоÑтроение объектов и формирование ландшафта
+ </string>
+ <string name="Command_Chat_Tooltip">
+ ОбменивайтеÑÑŒ текÑтовыми репликами Ñ Ð»ÑŽÐ´ÑŒÐ¼Ð¸ вокруг ваÑ
+ </string>
+ <string name="Command_Compass_Tooltip">
+ КомпаÑ
+ </string>
+ <string name="Command_Destinations_Tooltip">
+ ИнтереÑные меÑта
+ </string>
+ <string name="Command_Gestures_Tooltip">
+ ЖеÑÑ‚Ñ‹ Ð´Ð»Ñ Ð°Ð²Ð°Ñ‚Ð°Ñ€Ð°
+ </string>
+ <string name="Command_HowTo_Tooltip">
+ Выполнение типичных задач
+ </string>
+ <string name="Command_Inventory_Tooltip">
+ ПроÑмотр и иÑпользование вашего имущеÑтва
+ </string>
+ <string name="Command_Map_Tooltip">
+ Карта мира
+ </string>
+ <string name="Command_Marketplace_Tooltip">
+ Покупки
+ </string>
+ <string name="Command_MiniMap_Tooltip">
+ Показать людей поблизоÑти
+ </string>
+ <string name="Command_Move_Tooltip">
+ Перемещение аватара
+ </string>
+ <string name="Command_Outbox_Tooltip">
+ ПеренеÑти предметы в торговый центр Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð°Ð¶Ð¸
+ </string>
+ <string name="Command_People_Tooltip">
+ ДрузьÑ, группы и люди поблизоÑти
+ </string>
+ <string name="Command_Picks_Tooltip">
+ МеÑта, которые будут показаны в вашем профиле как избранное
+ </string>
+ <string name="Command_Places_Tooltip">
+ Сохраненные вами меÑта
+ </string>
+ <string name="Command_Preferences_Tooltip">
+ ÐаÑтройки
+ </string>
+ <string name="Command_Profile_Tooltip">
+ Редактирование или проÑмотр вашего профилÑ
+ </string>
+ <string name="Command_Search_Tooltip">
+ ПоиÑк меÑÑ‚, Ñобытий, людей
+ </string>
+ <string name="Command_Snapshot_Tooltip">
+ Сделать Ñнимок
+ </string>
+ <string name="Command_Speak_Tooltip">
+ Говорите Ñ Ð»ÑŽÐ´ÑŒÐ¼Ð¸ вокруг Ð²Ð°Ñ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ микрофона
+ </string>
+ <string name="Command_View_Tooltip">
+ Изменение угла камеры
+ </string>
+ <string name="Command_Voice_Tooltip">
+ Регулировка громкоÑти вызовов и разговоров Ñ Ð»ÑŽÐ´ÑŒÐ¼Ð¸ около ваÑ
+ </string>
+ <string name="Toolbar_Bottom_Tooltip">
+ ÑÐµÐ¹Ñ‡Ð°Ñ Ð½Ð° нижней панели инÑтрументов
+ </string>
+ <string name="Toolbar_Left_Tooltip">
+ ÑÐµÐ¹Ñ‡Ð°Ñ Ð½Ð° левой панели инÑтрументов
+ </string>
+ <string name="Toolbar_Right_Tooltip">
+ ÑÐµÐ¹Ñ‡Ð°Ñ Ð½Ð° правой панели инÑтрументов
+ </string>
+ <string name="Retain%">
+ ОÑтаток%
+ </string>
+ <string name="Detail">
+ ДетализациÑ
+ </string>
+ <string name="Better Detail">
+ Более детально
+ </string>
+ <string name="Surface">
+ ПоверхноÑÑ‚ÑŒ
+ </string>
+ <string name="Solid">
+ Сплошной
+ </string>
+ <string name="Wrap">
+ Оболочка
+ </string>
+ <string name="Preview">
+ Предварительный проÑмотр
+ </string>
+ <string name="Normal">
+ Ðормальный
+ </string>
+ <string name="snapshot_quality_very_low">
+ Очень низкий
+ </string>
+ <string name="snapshot_quality_low">
+ Ðизкий
+ </string>
+ <string name="snapshot_quality_medium">
+ Средний
+ </string>
+ <string name="snapshot_quality_high">
+ Ð’Ñ‹Ñокий
+ </string>
+ <string name="snapshot_quality_very_high">
+ Очень выÑокий
+ </string>
+</strings>
diff --git a/indra/newview/skins/default/xui/ru/teleport_strings.xml b/indra/newview/skins/default/xui/ru/teleport_strings.xml
new file mode 100644
index 0000000000..feff286111
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/teleport_strings.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<teleport_messages>
+ <message_set name="errors">
+ <message name="invalid_tport">
+ При запроÑе телепортации возникла проблема. Возможно, вам придетÑÑ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð¸Ñ‚ÑŒ вход перед тем, как вы Ñможете телепортироватьÑÑ.
+ЕÑли данное Ñообщение повторитÑÑ, поÑетите Ñайт [SUPPORT_SITE].
+ </message>
+ <message name="invalid_region_handoff">
+ При переÑечении границы региона возникла проблема. Возможно, вам придетÑÑ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð¸Ñ‚ÑŒ вход перед тем, как вы Ñможете перейти границу.
+ЕÑли данное Ñообщение повторитÑÑ, поÑетите Ñайт [SUPPORT_SITE].
+ </message>
+ <message name="blocked_tport">
+ Ð¢ÐµÐ»ÐµÐ¿Ð¾Ñ€Ñ‚Ð°Ñ†Ð¸Ñ ÑÐµÐ¹Ñ‡Ð°Ñ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð°. Повторите попытку позже.
+ЕÑли вам вÑе равно не удаетÑÑ Ñ‚ÐµÐ»ÐµÐ¿Ð¾Ñ€Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒÑÑ, выйдите и войдите в ÑиÑтему, чтобы уÑтранить проблему.
+ </message>
+ <message name="nolandmark_tport">
+ СиÑтеме не удалоÑÑŒ определить меÑто Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ»Ð°Ð´ÐºÐ¸.
+ </message>
+ <message name="timeout_tport">
+ СиÑтеме не удалоÑÑŒ выполнить подключение телепорта.
+Повторите попытку позже.
+ </message>
+ <message name="NoHelpIslandTP">
+ ТелепортироватьÑÑ Ð½Ð°Ð·Ð°Ð´ на ОÑтров Ð¿Ñ€Ð¸Ð±Ñ‹Ñ‚Ð¸Ñ Ð½ÐµÐ»ÑŒÐ·Ñ.
+Ð”Ð»Ñ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€ÐµÐ½Ð¸Ñ ÑƒÑ‡ÐµÐ±Ð½Ð¸ÐºÐ° перейдите на «ОÑтров Ð¿Ñ€Ð¸Ð±Ñ‹Ñ‚Ð¸Ñ - общий».
+ </message>
+ <message name="noaccess_tport">
+ У Ð²Ð°Ñ Ð½ÐµÑ‚ доÑтупа к точке Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ñтого телепорта.
+ </message>
+ <message name="missing_attach_tport">
+ Ваши приÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ ÐµÑ‰Ðµ не доÑтавлены. Подождите неÑколько Ñекунд либо выйдите и войдите в программу, прежде чем повторить попытку телепортации.
+ </message>
+ <message name="too_many_uploads_tport">
+ Очередь активов в данном регионе заполнена, поÑтому ваш Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° телепортацию не будет выполнен Ñвоевременно. Повторите попытку через неÑколько минут или перейдите в менее загруженный регион.
+ </message>
+ <message name="expired_tport">
+ СиÑтеме не удалоÑÑŒ Ñвоевременно выполнить ваш Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° телепортацию. Повторите попытку через неÑколько минут.
+ </message>
+ <message name="expired_region_handoff">
+ СиÑтеме не удалоÑÑŒ Ñвоевременно выполнить ваше переÑечение границы. Повторите попытку через неÑколько минут.
+ </message>
+ <message name="no_host">
+ Ðе удалоÑÑŒ найти точку Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ñ‚ÐµÐ»ÐµÐ¿Ð¾Ñ€Ñ‚Ð°. Возможно, назначение временно недоÑтупно или уже не ÑущеÑтвует. Повторите попытку через неÑколько минут.
+ </message>
+ <message name="no_inventory_host">
+ СиÑтема Ð¸Ð½Ð²ÐµÐ½Ñ‚Ð°Ñ€Ñ ÑÐµÐ¹Ñ‡Ð°Ñ Ð½ÐµÐ´Ð¾Ñтупна.
+ </message>
+ </message_set>
+ <message_set name="progress">
+ <message name="sending_dest">
+ Отправка по назначению.
+ </message>
+ <message name="redirecting">
+ Перенаправление в другое меÑто.
+ </message>
+ <message name="relaying">
+ Перенаправление по назначению.
+ </message>
+ <message name="sending_home">
+ Отправка запроÑа домашнего меÑтоположениÑ.
+ </message>
+ <message name="sending_landmark">
+ Отправка запроÑа меÑÑ‚Ð¾Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ»Ð°Ð´ÐºÐ¸.
+ </message>
+ <message name="completing">
+ Выполнение телепортации.
+ </message>
+ <message name="completed_from">
+ Выполнена Ñ‚ÐµÐ»ÐµÐ¿Ð¾Ñ€Ð°Ñ‚Ñ†Ð¸Ñ Ð¸Ð· [T_SLURL]
+ </message>
+ <message name="resolving">
+ Определение назначениÑ.
+ </message>
+ <message name="contacting">
+ Соединение Ñ Ð½Ð¾Ð²Ñ‹Ð¼ регионом.
+ </message>
+ <message name="arriving">
+ Прибытие…
+ </message>
+ <message name="requesting">
+ Ð—Ð°Ð¿Ñ€Ð¾Ñ Ñ‚ÐµÐ»ÐµÐ¿Ð¾Ñ€Ñ‚Ð°Ñ†Ð¸Ð¸â€¦
+ </message>
+ </message_set>
+</teleport_messages>
diff --git a/indra/newview/skins/default/xui/tr/floater_aaa.xml b/indra/newview/skins/default/xui/tr/floater_aaa.xml
new file mode 100644
index 0000000000..d663ec1a5b
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_aaa.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Test Floater" title="TEST GEZDÄ°RÄ°CÄ°SÄ°">
+ <string name="test_the_vlt">
+ Bu CHANGE2 dizesi ayıklandı.
+ </string>
+ <string name="testing_eli">
+ Sadece test amaçlı. değişiklikler.
+ </string>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_about.xml b/indra/newview/skins/default/xui/tr/floater_about.xml
new file mode 100644
index 0000000000..8fa12ea759
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_about.xml
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_about" title="[CAPITALIZED_APP_NAME] HAKKINDA">
+ <floater.string name="AboutHeader">
+ [APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2] ([VIEWER_VERSION_3]) [BUILD_DATE] [BUILD_TIME] ([CHANNEL])
+[[VIEWER_RELEASE_NOTES_URL] [Sürüm Notları]]
+ </floater.string>
+ <floater.string name="AboutCompiler">
+ [COMPILER] [COMPILER_VERSION] sürümü ile oluşturuldu
+ </floater.string>
+ <floater.string name="AboutPosition">
+ &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ([HOSTIP]) üzerinde bulunan [REGION] içerisinde [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] konumundasınız
+[SERVER_VERSION]
+[SERVER_RELEASE_NOTES_URL]
+ </floater.string>
+ <floater.string name="AboutSystem">
+ CPU: [CPU]
+Bellek: [MEMORY_MB] MB
+İşl. Sis. Sürümü: [OS_VERSION]
+Grafik Kartı Üreticisi: [GRAPHICS_CARD_VENDOR]
+Grafik Kartı: [GRAPHICS_CARD]
+ </floater.string>
+ <floater.string name="AboutDriver">
+ Windows Grafik Sürücüsü Sürümü: [GRAPHICS_DRIVER_VERSION]
+ </floater.string>
+ <floater.string name="AboutLibs">
+ OpenGL Sürümü: [OPENGL_VERSION]
+
+libcurl Sürümü: [LIBCURL_VERSION]
+J2C Kod Çözücü Sürümü: [J2C_VERSION]
+Ses Sürücüsü Sürümü: [AUDIO_DRIVER_VERSION]
+Qt Web Kit Sürümü: [QT_WEBKIT_VERSION]
+Ses Sunucusu Sürümü: [VOICE_VERSION]
+ </floater.string>
+ <floater.string name="none">
+ (hiçbiri)
+ </floater.string>
+ <floater.string name="AboutTraffic">
+ Kaybolan Paketler: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
+ </floater.string>
+ <floater.string name="ErrorFetchingServerReleaseNotesURL">
+ Sunucu sürümü notları URL&apos;si alınırken hata oluştu.
+ </floater.string>
+ <tab_container name="about_tab">
+ <panel label="Bilgi" name="support_panel">
+ <button label="Panoya Kopyala" name="copy_btn"/>
+ </panel>
+ <panel label="Katkıda Bulunanlar" name="credits_panel">
+ <text name="linden_intro">
+ Second Life, Linden&apos;lar tarafından geliştirilmiştir:
+ </text>
+ <text name="contrib_intro">
+ Açık kaynak kod katkısında bulunanlar:
+ </text>
+ <text_editor name="contrib_names">
+ Geçici Ad çalıştırma sırasında değiştirilir
+ </text_editor>
+ <text name="trans_intro">
+ Çevirileri yapanlar:
+ </text>
+ <text_editor name="trans_names">
+ Geçici Ad çalıştırma sırasında değiştirilir
+ </text_editor>
+ </panel>
+ <panel label="Lisanslar" name="licenses_panel">
+ <text_editor name="credits_editor">
+ 3Dconnexion SDK Telif Hakkı (C) 1992-2007 3Dconnexion
+ APR Telif Hakkı (C) 2000-2004 The Apache Software Foundation
+ Collada DOM Telif Hakkı 2005 Sony Computer Entertainment Inc.
+ cURL Telif Hakkı (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)
+ DBus/dbus-glib Telif Hakkı (C) 2002, 2003 CodeFactory AB / Telif Hakkı (C) 2003, 2004 Red Hat, Inc.
+ expat Telif Hakkı (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.
+ FreeType Telif Hakkı (C) 1996-2002, The FreeType Project (www.freetype.org).
+ GL Telif Hakkı (C) 1999-2004 Brian Paul.
+ GLOD Telif Hakkı (C) 2003-04 Jonathan Cohen, Nat Duca, Chris Niski, Johns Hopkins University ve David Luebke, Brenden Schubert, University of Virginia.
+ google-perftools Telif Hakkı (c) 2005, Google Inc.
+ Havok.com(TM) Telif Hakkı (C) 1999-2001, Telekinesys Research Limited.
+ jpeg2000 Telif Hakkı (C) 2001, David Taubman, The University of New South Wales (UNSW)
+ jpeglib Telif Hakkı (C) 1991-1998, Thomas G. Lane.
+ ogg/vorbis Telif Hakkı (C) 2001, Xiphophorus
+ OpenSSL Telif Hakkı (C) 1998-2002 The OpenSSL Project.
+ PCRE Telif Hakkı (c) 1997-2008 University of Cambridge
+ SDL Telif Hakkı (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
+ SSLeay Telif Hakkı (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+ xmlrpc-epi Telif Hakkı (C) 2000 Epinions, Inc.
+ zlib Telif Hakkı (C) 1995-2002 Jean-loup Gailly ve Mark Adler.
+ google-perftools Telif Hakkı (c) 2005, Google Inc.
+
+ Second Life Görüntüleyicisi Havok (TM) Fizik motorunu kullanmaktadır. (c)Telif Hakkı 1999-2010 Havok.com Inc. (ve Lisans Verenleri). Tüm Hakları Saklıdır. Ayrıntılı bilgi için bkz. www.havok.com
+
+ Bu yazılımda NVIDIA Corporation tarafından sağlanan kaynak kod yer almaktadır.
+
+ Tüm hakları saklıdır. Ayrıntılı bilgi için bkz. licenses.txt
+
+ Sesli sohbet için Ses kodlaması: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
+ </text_editor>
+ </panel>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_about_land.xml b/indra/newview/skins/default/xui/tr/floater_about_land.xml
new file mode 100644
index 0000000000..a478d347a8
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_about_land.xml
@@ -0,0 +1,481 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floaterland" title="ARAZÄ° HAKKINDA">
+ <floater.string name="maturity_icon_general">
+ &quot;Parcel_PG_Dark&quot;
+ </floater.string>
+ <floater.string name="maturity_icon_moderate">
+ &quot;Parcel_M_Dark&quot;
+ </floater.string>
+ <floater.string name="maturity_icon_adult">
+ &quot;Parcel_R_Dark&quot;
+ </floater.string>
+ <floater.string name="Minutes">
+ [MINUTES] dakika
+ </floater.string>
+ <floater.string name="Minute">
+ dakika
+ </floater.string>
+ <floater.string name="Seconds">
+ [SECONDS] saniye
+ </floater.string>
+ <floater.string name="Remaining">
+ kaldı
+ </floater.string>
+ <tab_container name="landtab">
+ <panel label="GENEL" name="land_general_panel">
+ <panel.string name="new users only">
+ Sadece Yeni Sakinler
+ </panel.string>
+ <panel.string name="anyone">
+ Herkes
+ </panel.string>
+ <panel.string name="area_text">
+ Alan
+ </panel.string>
+ <panel.string name="area_size_text">
+ [AREA] m²
+ </panel.string>
+ <panel.string name="auction_id_text">
+ Ä°hale Kimlik: [ID]
+ </panel.string>
+ <panel.string name="need_tier_to_modify">
+ Bu arazide değişiklik yapmak için satın alımınızı onaylamanız gerekir.
+ </panel.string>
+ <panel.string name="group_owned_text">
+ (Sahibi Olunan Grup)
+ </panel.string>
+ <panel.string name="profile_text">
+ Profil
+ </panel.string>
+ <panel.string name="info_text">
+ Bilgi
+ </panel.string>
+ <panel.string name="public_text">
+ (kamuya açık)
+ </panel.string>
+ <panel.string name="none_text">
+ (hiçbiri)
+ </panel.string>
+ <panel.string name="sale_pending_text">
+ (Satış Bekliyor)
+ </panel.string>
+ <panel.string name="no_selection_text">
+ Seçili parsel yok.
+ </panel.string>
+ <panel.string name="time_stamp_template">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </panel.string>
+ <text name="Name:">
+ Ad:
+ </text>
+ <text name="Description:">
+ Açıklama:
+ </text>
+ <text name="LandType">
+ Tür:
+ </text>
+ <text name="LandTypeText">
+ Anakara / Banliyö
+ </text>
+ <text name="ContentRating">
+ Seviye:
+ </text>
+ <text name="ContentRatingText">
+ YetiÅŸkin
+ </text>
+ <text name="Owner:">
+ Sahip:
+ </text>
+ <text name="Group:">
+ Grup:
+ </text>
+ <button label="Ayarla" name="Set..."/>
+ <check_box label="Gruba Devretmeye İzin Ver" name="check deed" tool_tip="Bir gurup görevlisi bu araziyi gruba devredebilir, bu nedenle grubun arazi tahsisiyle desteklenecektir."/>
+ <button label="Devret" name="Deed..." tool_tip="Sadece eğer seçilen grupta bir görevliyseniz arazi devredebilirsiniz."/>
+ <check_box label="Sahip Devirle Katkıda Bulunur" name="check contrib" tool_tip="Arazi gruba devredildiği zaman önceki sahip bunu desteklemek için yeterli miktarda arazi tahsisiyle katkıda bulunur."/>
+ <text name="For Sale:">
+ Satılık:
+ </text>
+ <text name="Not for sale.">
+ Satılık değil
+ </text>
+ <text name="For Sale: Price L$[PRICE].">
+ Fiyat: L$[PRICE] (L$[PRICE_PER_SQM]/m²)
+ </text>
+ <button label="Araziyi Sat" name="Sell Land..."/>
+ <text name="For sale to">
+ Şu Alıcıya Satılık: [BUYER]
+ </text>
+ <text name="Sell with landowners objects in parcel.">
+ Nesneler satışa dahildir
+ </text>
+ <text name="Selling with no objects in parcel.">
+ Nesneler satışa dahil değildir
+ </text>
+ <button label="Arazi Satışını İptal Et" label_selected="Arazi Satışını İptal Et" name="Cancel Land Sale"/>
+ <text name="Claimed:">
+ Alındı:
+ </text>
+ <text name="DateClaimText">
+ 15 Ağustos Salı 13:47:25 2006
+ </text>
+ <text name="PriceLabel">
+ Alan:
+ </text>
+ <text name="PriceText">
+ 4048 m²
+ </text>
+ <text name="Traffic:">
+ Trafik:
+ </text>
+ <text name="DwellText">
+ Yükleniyor...
+ </text>
+ <button label="Arazi Satın Al" name="Buy Land..."/>
+ <button label="Linden Satışı" name="Linden Sale..." tool_tip="Arazinin sahip olunması, içeriğinin ayarlanması ve ihaleye çıkmamış olması gerekir"/>
+ <button label="Komut Dosyası Bilgileri" name="Scripts..."/>
+ <button label="Grup İçin Satın Al" name="Buy For Group..."/>
+ <button label="Geçiş Hakkı Satın Al" name="Buy Pass..." tool_tip="Geçiş hakkı bu araziye geçici erişiminizi sağlar."/>
+ <button label="Araziyi Terket" name="Abandon Land..."/>
+ <button label="Araziyi Geri Kazan" name="Reclaim Land..."/>
+ </panel>
+ <panel label="SÖZLEŞME" name="land_covenant_panel">
+ <panel.string name="can_resell">
+ Bu bölgede satın alınan arazi tekrar satılabilir.
+ </panel.string>
+ <panel.string name="can_not_resell">
+ Bu bölgede satın alınan arazi tekrar satılamayabilir.
+ </panel.string>
+ <panel.string name="can_change">
+ Bu bölgede satın alınan arazi birleştirilebilir veya bölünebilir.
+ </panel.string>
+ <panel.string name="can_not_change">
+ Bu bölgede satın alınan arazi birleştirilemeyebilir veya bölünemeyebilir.
+ </panel.string>
+ <text name="estate_section_lbl">
+ Gayrimenkul:
+ </text>
+ <text name="estate_name_text">
+ anakara
+ </text>
+ <text name="estate_owner_lbl">
+ Sahip:
+ </text>
+ <text name="estate_owner_text">
+ (hiçbiri)
+ </text>
+ <text_editor name="covenant_editor">
+ Bu Gayrimenkul için Sözleşmesi yok.
+ </text_editor>
+ <text name="covenant_timestamp_text">
+ Son Değiştirme: 31 Ara, Çar 16:00:00 1969
+ </text>
+ <text name="region_section_lbl">
+ Bölge:
+ </text>
+ <text name="region_name_text">
+ EricaVille
+ </text>
+ <text name="region_landtype_lbl">
+ Tür:
+ </text>
+ <text name="region_landtype_text">
+ Anakara / Banliyö
+ </text>
+ <text name="region_maturity_lbl">
+ Seviye:
+ </text>
+ <text name="region_maturity_text">
+ YetiÅŸkin
+ </text>
+ <text name="resellable_lbl">
+ Tekrar Satış:
+ </text>
+ <text name="resellable_clause">
+ Bu bölgedeki arazi tekrar satılamayabilir.
+ </text>
+ <text name="changeable_lbl">
+ Böl:
+ </text>
+ <text name="changeable_clause">
+ Bu bölgedeki arazi birleştirilemeyebilir/bölünemeyebilir.
+ </text>
+ </panel>
+ <panel label="NESNELER" name="land_objects_panel">
+ <panel.string name="objects_available_text">
+ [COUNT] / [MAX] ([AVAILABLE]) uygun
+ </panel.string>
+ <panel.string name="objects_deleted_text">
+ [COUNT] / [MAX] ([SÄ°LÄ°NDÄ°] silinecek)
+ </panel.string>
+ <text name="parcel_object_bonus">
+ Bölge Nesne Bonusu Faktörü: [BONUS]
+ </text>
+ <text name="Simulator primitive usage:">
+ Bölge kapasitesi:
+ </text>
+ <text name="objects_available">
+ [COUNT] / [MAX] ([AVAILABLE]) uygun
+ </text>
+ <text name="Primitives parcel supports:">
+ Parsel arazi kapasitesi:
+ </text>
+ <text name="object_contrib_text">
+ [COUNT]
+ </text>
+ <text name="Primitives on parcel:">
+ Parsel arazi etkisi:
+ </text>
+ <text name="total_objects_text">
+ [COUNT]
+ </text>
+ <text name="Owned by parcel owner:">
+ Parsel sahibinin mülkiyetinde
+ </text>
+ <text name="owner_objects_text">
+ [COUNT]
+ </text>
+ <button label="Göster" label_selected="Göster" name="ShowOwner"/>
+ <button label="Ä°ade Et" name="ReturnOwner..." tool_tip="Nesneleri sahiplerine iade et."/>
+ <text name="Set to group:">
+ Gruba ayarı:
+ </text>
+ <text name="group_objects_text">
+ [COUNT]
+ </text>
+ <button label="Göster" label_selected="Göster" name="ShowGroup"/>
+ <button label="Ä°ade Et" name="ReturnGroup..." tool_tip="Nesneleri sahiplerine iade et."/>
+ <text name="Owned by others:">
+ Başkalarının mülkiyetinde:
+ </text>
+ <text name="other_objects_text">
+ [COUNT]
+ </text>
+ <button label="Göster" label_selected="Göster" name="ShowOther"/>
+ <button label="Ä°ade Et" name="ReturnOther..." tool_tip="Nesneleri sahiplerine iade et."/>
+ <text name="Selected / sat upon:">
+ Seçilen / üzerine oturulan:
+ </text>
+ <text name="selected_objects_text">
+ [COUNT]
+ </text>
+ <text name="Autoreturn">
+ Diğer Sakinlerin nesnelerini otomatik iade (dakika, kapalı için 0):
+ </text>
+ <text name="Object Owners:">
+ Nesne Sahipleri:
+ </text>
+ <button name="Refresh List" tool_tip="Nesne Listesini Yenile"/>
+ <button label="Nesneleri Ä°ade Et" name="Return objects..."/>
+ <name_list name="owner list">
+ <name_list.columns label="Tür" name="type"/>
+ <name_list.columns label="Ad" name="name"/>
+ <name_list.columns label="Sayım" name="count"/>
+ <name_list.columns label="En son" name="mostrecent"/>
+ </name_list>
+ </panel>
+ <panel label="SEÇENEKLER" name="land_options_panel">
+ <panel.string name="search_enabled_tooltip">
+ Arama sonuçlarında bu parsel görünsün
+ </panel.string>
+ <panel.string name="search_disabled_small_tooltip">
+ Bu seçenek etkin değil, çünkü bu parselin alanı 128 m² veya daha küçük.
+Sadece büyük parseller aramada görünür.
+ </panel.string>
+ <panel.string name="search_disabled_permissions_tooltip">
+ Bu seçenek etkin değil, çünkü bu parselin seçeneklerinde değişiklik yapamazsınız.
+ </panel.string>
+ <panel.string name="mature_check_mature">
+ Orta Seviyede İçerik
+ </panel.string>
+ <panel.string name="mature_check_adult">
+ Yetişkin İçeriği
+ </panel.string>
+ <panel.string name="mature_check_mature_tooltip">
+ Parsel bilgileriniz veya içeriğiniz orta olarak değerlendiriliyor.
+ </panel.string>
+ <panel.string name="mature_check_adult_tooltip">
+ Parsel bilgileriniz veya içeriğiniz yetişkin olarak değerlendiriliyor.
+ </panel.string>
+ <panel.string name="landing_point_none">
+ (hiçbiri)
+ </panel.string>
+ <panel.string name="push_restrict_text">
+ Ä°tme Yok
+ </panel.string>
+ <panel.string name="push_restrict_region_text">
+ İtme Yok (Bölge Geçersiz Kılma)
+ </panel.string>
+ <text name="allow_label">
+ Sakinlere şunun için izin ver:
+ </text>
+ <text name="allow_label0">
+ Uçma:
+ </text>
+ <check_box label="Herkes" name="check fly" tool_tip="İşaretliyse Sakinler arazinizden uçabilir. İşaretli değilse, sadece arazinize ve arazinizin üzerinde uçabilir."/>
+ <text name="allow_label2">
+ Ä°nÅŸa Et:
+ </text>
+ <check_box label="Herkes" name="edit objects check"/>
+ <check_box label="Grup" name="edit group objects check"/>
+ <text name="allow_label3">
+ Nesne GiriÅŸi:
+ </text>
+ <check_box label="Herkes" name="all object entry check"/>
+ <check_box label="Grup" name="group object entry check"/>
+ <text name="allow_label4">
+ Komut Dosyalarını Çalıştır:
+ </text>
+ <check_box label="Herkes" name="check other scripts"/>
+ <check_box label="Grup" name="check group scripts"/>
+ <check_box label="Güvenli (hasar yok)" name="check safe" tool_tip="İşaretliyse, araziyi Güvenli moda getirerek hasar çarpışmasını etkinsizleştirir İşaretli değilse hasar çarpışması etkinleşir."/>
+ <check_box label="İtme Yok" name="PushRestrictCheck" tool_tip="Komut dosyalarının itmesini önler Bu seçeneğin işaretlenmesi arazinizdeki bozucu davranışları önlemeye yardımcı olabilir."/>
+ <check_box label="Konumu Arama sonuçlarında göster (L$30/hafta)" name="ShowDirectoryCheck" tool_tip="Arama sonuçlarında bu parsel görünsün"/>
+ <combo_box name="land category with adult">
+ <combo_box.item label="Herh. Bir Kategori" name="item0"/>
+ <combo_box.item label="Linden Konumu" name="item1"/>
+ <combo_box.item label="YetiÅŸkin" name="item2"/>
+ <combo_box.item label="Sanat ve Kültür" name="item3"/>
+ <combo_box.item label="Ä°ÅŸ" name="item4"/>
+ <combo_box.item label="EÄŸitim" name="item5"/>
+ <combo_box.item label="Oyun" name="item6"/>
+ <combo_box.item label="UÄŸrak Mekan" name="item7"/>
+ <combo_box.item label="Yeni Gelenlere Yardım Sunan" name="item8"/>
+ <combo_box.item label="Park ve DoÄŸa" name="item9"/>
+ <combo_box.item label="YerleÅŸim" name="item10"/>
+ <combo_box.item label="Alışveriş" name="item11"/>
+ <combo_box.item label="Kiralık" name="item13"/>
+ <combo_box.item label="DiÄŸer" name="item12"/>
+ </combo_box>
+ <combo_box name="land category">
+ <combo_box.item label="Herh. Bir Kategori" name="item0"/>
+ <combo_box.item label="Linden Konumu" name="item1"/>
+ <combo_box.item label="Sanat ve Kültür" name="item3"/>
+ <combo_box.item label="Ä°ÅŸ" name="item4"/>
+ <combo_box.item label="EÄŸitim" name="item5"/>
+ <combo_box.item label="Oyun" name="item6"/>
+ <combo_box.item label="UÄŸrak Mekan" name="item7"/>
+ <combo_box.item label="Yeni Gelenlere Yardım Sunan" name="item8"/>
+ <combo_box.item label="Park ve DoÄŸa" name="item9"/>
+ <combo_box.item label="YerleÅŸim" name="item10"/>
+ <combo_box.item label="Alışveriş" name="item11"/>
+ <combo_box.item label="Kiralık" name="item13"/>
+ <combo_box.item label="DiÄŸer" name="item12"/>
+ </combo_box>
+ <check_box label="Orta Seviyede İçerik" name="MatureCheck" tool_tip=" "/>
+ <text name="Snapshot:">
+ Anlık Görüntü:
+ </text>
+ <texture_picker name="snapshot_ctrl" tool_tip="Bir resim seçmek için tıklayın"/>
+ <text name="allow_label5">
+ Başka parsellerdeki avatarlar bu parseldeki avatarları görebilir ve onlarla sohbet edebilir
+ </text>
+ <check_box label="Avatarları Gör" name="SeeAvatarsCheck" tool_tip="Diğer parsellerdeki avatarların bu parseldeki avatarları görmesine ve onlarla sohbet etmesine, sizin de onları görüp, onlarla sohbet etmenize imkan tanır."/>
+ <text name="landing_point">
+ İniş Noktası: [LANDING]
+ </text>
+ <button label="Ayarla" label_selected="Ayarla" name="Set" tool_tip="İniş noktasını konukların geldiği yere ayarla. avatarınızın konumunu bu parselin içine ayarlar."/>
+ <button label="Temizle" label_selected="Temizle" name="Clear" tool_tip="İniş noktasını temizle"/>
+ <text name="Teleport Routing: ">
+ Işınlama Rotası:
+ </text>
+ <combo_box name="landing type" tool_tip="Işınlama Rotası -- arazinize ışınlamaları nasıl kullanacağınızı seçin">
+ <combo_box.item label="EngellenmiÅŸ" name="Blocked"/>
+ <combo_box.item label="İniş Noktası" name="LandingPoint"/>
+ <combo_box.item label="Herhangi bir yere" name="Anywhere"/>
+ </combo_box>
+ </panel>
+ <panel label="ORTAM" name="land_media_panel">
+ <text name="with media:">
+ Tür:
+ </text>
+ <combo_box name="media type" tool_tip="URL&apos;nin bir film, web sayfası, ya da başka bir ortam olup olmadığını belirtin"/>
+ <text name="at URL:">
+ Ana Sayfa:
+ </text>
+ <button label="Ayarla" name="set_media_url"/>
+ <text name="Description:">
+ Açıklama:
+ </text>
+ <line_editor name="url_description" tool_tip="Yazılar oyna/yükle düğmesinin yanında gösterilir"/>
+ <text name="Media texture:">
+ Doku DeÄŸiÅŸtir:
+ </text>
+ <texture_picker name="media texture" tool_tip="Bir resim seçmek için tıklayın"/>
+ <text name="replace_texture_help">
+ Bu dokuyu kullanan nesneler, oynat okuna bastıktan sonra filmi veya web sayfasını gösterecektir. Farklı bir doku seçmek için pul resmi seçin.
+ </text>
+ <check_box label="Otomatik ölçekle" name="media_auto_scale" tool_tip="Bu seçeneğin işaretlenmesi bu parselin içeriğini otomatik olarak ölçeklendirecektir. Biraz yavaş ve görsel açıdan kalitesi biraz düşük olabilir, ancak başka doku ölçekleme veya ayarlama gerekmeyecektir."/>
+ <text name="media_size" tool_tip="Web ortamını oluşturmak için boyutlandır, varsayılan için 0 bırak.">
+ Büyüklük:
+ </text>
+ <spinner name="media_size_width" tool_tip="Web ortamını oluşturmak için boyutlandır, varsayılan için 0 bırak."/>
+ <spinner name="media_size_height" tool_tip="Web ortamını oluşturmak için boyutlandır, varsayılan için 0 bırak."/>
+ <text name="pixels">
+ piksel
+ </text>
+ <text name="Options:">
+ Seçenklr.:
+ </text>
+ <check_box label="Döngü" name="media_loop" tool_tip="Ortamı döngüsel olarak oynat. Ortamın oynatılması bittiğinde baştan tekrar başlayacaktır."/>
+ </panel>
+ <panel label="SES" name="land_audio_panel">
+ <text name="MusicURL:">
+ Müzik URL&apos;si:
+ </text>
+ <text name="Sound:">
+ Ses:
+ </text>
+ <check_box label="Mimik ve nesne seslerini bu parselle sınırla" name="check sound local"/>
+ <text name="Avatar Sounds:">
+ Avatar Sesleri:
+ </text>
+ <check_box label="Herkes" name="all av sound check"/>
+ <check_box label="Grup" name="group av sound check"/>
+ <text name="Voice settings:">
+ Sesli:
+ </text>
+ <check_box label="Sesi EtkinleÅŸtir" name="parcel_enable_voice_channel"/>
+ <check_box label="Sesi Etkinleştir (Gayrimenkul tarafından belirlenir)" name="parcel_enable_voice_channel_is_estate_disabled"/>
+ <check_box label="Sesi bu parselle sınırla" name="parcel_enable_voice_channel_local"/>
+ </panel>
+ <panel label="ERİŞİM" name="land_access_panel">
+ <panel.string name="access_estate_defined">
+ (Gayrimenkul tarafından tanımlanır)
+ </panel.string>
+ <panel.string name="estate_override">
+ Bu seçeneklerden biri veya daha fazlası gayrimenkul düzeyinde ayarlanır
+ </panel.string>
+ <check_box label="Kamusal Erişime İzin Ver (Bunun işaretinin kaldırılması yasaklama çizgileri oluşturacaktır)" name="public_access"/>
+ <text name="Only Allow">
+ Sadece ÅŸu Sakinlere eriÅŸim izni verin:
+ </text>
+ <check_box label="Ödeme bilgileri kayıtlı [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Sakinlerin bu parsele erişebilmesi için ödeme bilgilerinin kayıtlı olması gerekir. Daha fazla bilgi için [SUPPORT_SITE] adresini ziyaret edin."/>
+ <check_box label="Yaş doğrulaması yapılmış [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Sakinlerin bu parsele erişebilmesi için yaş doğrulamalarının yapılmış olması gerekir. Daha fazla bilgi için [SUPPORT_SITE] adresini ziyaret edin."/>
+ <check_box label="Grup EriÅŸimine Ä°zin Ver: [GROUP]" name="GroupCheck" tool_tip="Genel sekmesinde grup ayarla."/>
+ <check_box label="Geçiş haklr. şuna sat:" name="PassCheck" tool_tip="Bu parsele geçici erişim verir"/>
+ <combo_box name="pass_combo">
+ <combo_box.item label="Herkes" name="Anyone"/>
+ <combo_box.item label="Grup" name="Group"/>
+ </combo_box>
+ <spinner label="L$ olarak Fiyat:" name="PriceSpin"/>
+ <spinner label="EriÅŸim saatleri:" name="HoursSpin"/>
+ <panel name="Allowed_layout_panel">
+ <text label="Her Zaman Ä°zin Ver" name="AllowedText">
+ Ä°zin Verilen Sakinler
+ </text>
+ <name_list name="AccessList" tool_tip="([LISTED] listeli, [MAX] maksimum)"/>
+ <button label="Ekle" name="add_allowed"/>
+ <button label="Kaldır" label_selected="Kaldır" name="remove_allowed"/>
+ </panel>
+ <panel name="Banned_layout_panel">
+ <text label="Yasakla" name="BanCheck">
+ Yasaklı Sakinler
+ </text>
+ <name_list name="BannedList" tool_tip="([LISTED] listeli, [MAX] maksimum)"/>
+ <button label="Ekle" name="add_banned"/>
+ <button label="Kaldır" label_selected="Kaldır" name="remove_banned"/>
+ </panel>
+ </panel>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_activeim.xml b/indra/newview/skins/default/xui/tr/floater_activeim.xml
new file mode 100644
index 0000000000..f3f66b942f
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_activeim.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_activeim" title="ETKÄ°N AÄ°"/>
diff --git a/indra/newview/skins/default/xui/tr/floater_animation_anim_preview.xml b/indra/newview/skins/default/xui/tr/floater_animation_anim_preview.xml
new file mode 100644
index 0000000000..a63e1e107e
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_animation_anim_preview.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Anim Preview" title="ANIMATION.ANIM">
+ <text name="name_label">
+ Ad:
+ </text>
+ <text name="description_label">
+ Açıklama:
+ </text>
+ <button label="Karşıya Yükle (L$[AMOUNT])" name="ok_btn"/>
+ <button label="Ä°ptal" label_selected="Ä°ptal" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_animation_bvh_preview.xml b/indra/newview/skins/default/xui/tr/floater_animation_bvh_preview.xml
new file mode 100644
index 0000000000..f8800c674d
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_animation_bvh_preview.xml
@@ -0,0 +1,186 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Animation Preview">
+ <floater.string name="failed_to_initialize">
+ Hareket başlatılamadı
+ </floater.string>
+ <floater.string name="anim_too_long">
+ Animasyon dosyası [LENGTH] saniye uzunluğunda.
+
+Maksimum animasyon uzunluÄŸu [LENGTH] saniye.
+ </floater.string>
+ <floater.string name="failed_file_read">
+ Animasyon dosyası okunamadı.
+
+[STATUS]
+ </floater.string>
+ <floater.string name="E_ST_OK">
+ Tamam
+ </floater.string>
+ <floater.string name="E_ST_EOF">
+ Dosyanın zamanından önce sonu.
+ </floater.string>
+ <floater.string name="E_ST_NO_CONSTRAINT">
+ Kısıtlama tanımı okunamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_FILE">
+ BVH dosyası açılamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_HIER">
+ Geçersiz HİYERARŞİ üst bilgisi.
+ </floater.string>
+ <floater.string name="E_ST_NO_JOINT">
+ KÖK veya EKLEM bulunamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_NAME">
+ EKLEM adı alınamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_OFFSET">
+ OFSET bulunamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_CHANNELS">
+ KANALLAR bulunamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_ROTATION">
+ Döndürme sırası alınamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_AXIS">
+ Döndürme ekseni alınamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_MOTION">
+ HAREKET bulunamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_FRAMES">
+ kARE SAYISI alınamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_FRAME_TIME">
+ Kare zamanı alınamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_POS">
+ Konum değerleri alınamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_ROT">
+ Döndürme değerleri alınamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_FILE">
+ Çeviri dosyası açılamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_HEADER">
+ Çeviri üst bilgisi okunamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_NAME">
+ Çeviri adları okunamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_IGNORE">
+ Çeviri yoksay değeri okunamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_RELATIVE">
+ Çeviri nisbi değeri okunamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_OUTNAME">
+ Çeviri çıkış adı değeri okunamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MATRIX">
+ Çeviri matrisi okunamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MERGECHILD">
+ Birleştirme alt birim adı alınamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MERGEPARENT">
+ Birleştirme üst birim adı alınamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_PRIORITY">
+ Öncelik değerleri alınamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_LOOP">
+ Döngü (tekrar) değerleri alınamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EASEIN">
+ Easln (Yavaş Başlangıç) değerleri alınamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EASEOUT">
+ EaseOut (Yavaş Bitiş) değerleri alınamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_HAND">
+ El şekillendirme değeri alınamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EMOTE">
+ Duygu ifadesi adı okunamadı.
+ </floater.string>
+ <floater.string name="E_ST_BAD_ROOT">
+ Yanlış kök eklem adı, &quot;kalça&quot; kullanın
+ </floater.string>
+ <text name="name_label">
+ Ad:
+ </text>
+ <text name="description_label">
+ Açıklama:
+ </text>
+ <spinner label="Öncelik" name="priority" tool_tip="Bu animasyonun diğer animasyonları geçersiz kılabileceği kontrolleri"/>
+ <check_box label="Döngü" name="loop_check" tool_tip="Bu animasyonun döngülenmesini (tekrarlanmasını) sağlar"/>
+ <spinner label="İç (%)" name="loop_in_point" tool_tip="Döngünün döndüğü animasyon noktasını belirler"/>
+ <spinner label="Dış (%)" name="loop_out_point" tool_tip="Animasyonda döngünün bittiği noktayı belirler"/>
+ <text name="hand_label">
+ El DuruÅŸu
+ </text>
+ <combo_box name="hand_pose_combo" tool_tip="Ellerin animasyon sırasında neler yaptığını kontrol eder">
+ <combo_box.item label="Yayılım" name="Spread"/>
+ <combo_box.item label="Rahat" name="Relaxed"/>
+ <combo_box.item label="Her Ä°kisi de Ä°ÅŸaret Ediyor" name="PointBoth"/>
+ <combo_box.item label="Yumruk" name="Fist"/>
+ <combo_box.item label="Sol Rahat" name="RelaxedLeft"/>
+ <combo_box.item label="Sol Ä°ÅŸaret Ediyor" name="PointLeft"/>
+ <combo_box.item label="Sol Yumruk" name="FistLeft"/>
+ <combo_box.item label="SaÄŸ Rahat" name="RelaxedRight"/>
+ <combo_box.item label="SaÄŸ Ä°ÅŸaret Ediyor" name="PointRight"/>
+ <combo_box.item label="SaÄŸ Yumruk" name="FistRight"/>
+ <combo_box.item label="Sağı Selamlıyor" name="SaluteRight"/>
+ <combo_box.item label="Yazı Yazıyor" name="Typing"/>
+ <combo_box.item label="Sağ Barış" name="PeaceRight"/>
+ </combo_box>
+ <text name="emote_label">
+ Ä°fade
+ </text>
+ <combo_box name="emote_combo" tool_tip="Yüzün animasyon sırasındaki ifadesini kontrol eder">
+ <item label="(Hiçbiri)" name="[None]" value=""/>
+ <item label="Aaaaah" name="Aaaaah" value="Aaaaah"/>
+ <item label="KorkmuÅŸ" name="Afraid" value="KorkmuÅŸ"/>
+ <item label="Kızgın" name="Angry" value="Kızgın"/>
+ <item label="Yaygın Gülümseyiş" name="BigSmile" value="Yaygın Gülümseyiş"/>
+ <item label="Canı Sıkılmış" name="Bored" value="Canı Sıkılmış"/>
+ <item label="AÄŸlama" name="Cry" value="AÄŸlama"/>
+ <item label="Dudak Bükme" name="Disdain" value="Dudak Bükme"/>
+ <item label="Utanmış" name="Embarrassed" value="Utanmış"/>
+ <item label="Kaş Çatma" name="Frown" value="Kaş Çatma"/>
+ <item label="Öpücük" name="Kiss" value="Öpücük"/>
+ <item label="Gülme" name="Laugh" value="Gülme"/>
+ <item label="Kahkaha" name="Plllppt" value="Kahkaha"/>
+ <item label="TiksinmiÅŸ" name="Repulsed" value="TiksinmiÅŸ"/>
+ <item label="Üzgün" name="Sad" value="Üzgün"/>
+ <item label="Omuz Silkme" name="Shrug" value="Omuz Silkme"/>
+ <item label="Gülümseme" name="Smile" value="Gülümseme"/>
+ <item label="Sürpriz" name="Surprise" value="Sürpriz"/>
+ <item label="Göz Kırpma" name="Wink" value="Göz Kırpma"/>
+ <item label="EndiÅŸelenme" name="Worry" value="EndiÅŸelenme"/>
+ </combo_box>
+ <text name="preview_label">
+ Şu sırada önizle
+ </text>
+ <combo_box name="preview_base_anim" tool_tip="Animasyon davranışınızı avatarınız genel hareketleri yaparken test etmek için bunu kullanın.">
+ <item label="Ayakta Duruyor" name="Standing" value="Ayakta Duruyor"/>
+ <item label="Yürüyor" name="Walking" value="Yürüyor"/>
+ <item label="Oturuyor" name="Sitting" value="Oturuyor"/>
+ <item label="Uçuyor" name="Flying" value="Uçuyor"/>
+ </combo_box>
+ <spinner label="Yavaş Başlangıç (saniye)" name="ease_in_time" tool_tip="Animasyonun kaynaştığı süre (saniye olarak)"/>
+ <spinner label="Yavaş Bitiş (saniye)" name="ease_out_time" tool_tip="Animasyonun ayrıştığı süre (saniye olarak)"/>
+ <button name="play_btn" tool_tip="Animasyonunu oynat"/>
+ <button name="pause_btn" tool_tip="Animasyonunu duraklat"/>
+ <button name="stop_btn" tool_tip="Animasyo oynatmayı durdur"/>
+ <text name="bad_animation_text">
+ Animasyon dosyası okunamadı.
+
+Poser 4&apos;ten aktarılan BHV dosyalarını tavsiye ederiz.
+ </text>
+ <button label="Karşıya Yükle (L$[AMOUNT])" name="ok_btn"/>
+ <button label="Ä°ptal" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_animation_preview.xml b/indra/newview/skins/default/xui/tr/floater_animation_preview.xml
new file mode 100644
index 0000000000..f8800c674d
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_animation_preview.xml
@@ -0,0 +1,186 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Animation Preview">
+ <floater.string name="failed_to_initialize">
+ Hareket başlatılamadı
+ </floater.string>
+ <floater.string name="anim_too_long">
+ Animasyon dosyası [LENGTH] saniye uzunluğunda.
+
+Maksimum animasyon uzunluÄŸu [LENGTH] saniye.
+ </floater.string>
+ <floater.string name="failed_file_read">
+ Animasyon dosyası okunamadı.
+
+[STATUS]
+ </floater.string>
+ <floater.string name="E_ST_OK">
+ Tamam
+ </floater.string>
+ <floater.string name="E_ST_EOF">
+ Dosyanın zamanından önce sonu.
+ </floater.string>
+ <floater.string name="E_ST_NO_CONSTRAINT">
+ Kısıtlama tanımı okunamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_FILE">
+ BVH dosyası açılamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_HIER">
+ Geçersiz HİYERARŞİ üst bilgisi.
+ </floater.string>
+ <floater.string name="E_ST_NO_JOINT">
+ KÖK veya EKLEM bulunamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_NAME">
+ EKLEM adı alınamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_OFFSET">
+ OFSET bulunamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_CHANNELS">
+ KANALLAR bulunamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_ROTATION">
+ Döndürme sırası alınamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_AXIS">
+ Döndürme ekseni alınamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_MOTION">
+ HAREKET bulunamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_FRAMES">
+ kARE SAYISI alınamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_FRAME_TIME">
+ Kare zamanı alınamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_POS">
+ Konum değerleri alınamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_ROT">
+ Döndürme değerleri alınamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_FILE">
+ Çeviri dosyası açılamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_HEADER">
+ Çeviri üst bilgisi okunamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_NAME">
+ Çeviri adları okunamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_IGNORE">
+ Çeviri yoksay değeri okunamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_RELATIVE">
+ Çeviri nisbi değeri okunamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_OUTNAME">
+ Çeviri çıkış adı değeri okunamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MATRIX">
+ Çeviri matrisi okunamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MERGECHILD">
+ Birleştirme alt birim adı alınamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MERGEPARENT">
+ Birleştirme üst birim adı alınamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_PRIORITY">
+ Öncelik değerleri alınamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_LOOP">
+ Döngü (tekrar) değerleri alınamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EASEIN">
+ Easln (Yavaş Başlangıç) değerleri alınamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EASEOUT">
+ EaseOut (Yavaş Bitiş) değerleri alınamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_HAND">
+ El şekillendirme değeri alınamadı.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EMOTE">
+ Duygu ifadesi adı okunamadı.
+ </floater.string>
+ <floater.string name="E_ST_BAD_ROOT">
+ Yanlış kök eklem adı, &quot;kalça&quot; kullanın
+ </floater.string>
+ <text name="name_label">
+ Ad:
+ </text>
+ <text name="description_label">
+ Açıklama:
+ </text>
+ <spinner label="Öncelik" name="priority" tool_tip="Bu animasyonun diğer animasyonları geçersiz kılabileceği kontrolleri"/>
+ <check_box label="Döngü" name="loop_check" tool_tip="Bu animasyonun döngülenmesini (tekrarlanmasını) sağlar"/>
+ <spinner label="İç (%)" name="loop_in_point" tool_tip="Döngünün döndüğü animasyon noktasını belirler"/>
+ <spinner label="Dış (%)" name="loop_out_point" tool_tip="Animasyonda döngünün bittiği noktayı belirler"/>
+ <text name="hand_label">
+ El DuruÅŸu
+ </text>
+ <combo_box name="hand_pose_combo" tool_tip="Ellerin animasyon sırasında neler yaptığını kontrol eder">
+ <combo_box.item label="Yayılım" name="Spread"/>
+ <combo_box.item label="Rahat" name="Relaxed"/>
+ <combo_box.item label="Her Ä°kisi de Ä°ÅŸaret Ediyor" name="PointBoth"/>
+ <combo_box.item label="Yumruk" name="Fist"/>
+ <combo_box.item label="Sol Rahat" name="RelaxedLeft"/>
+ <combo_box.item label="Sol Ä°ÅŸaret Ediyor" name="PointLeft"/>
+ <combo_box.item label="Sol Yumruk" name="FistLeft"/>
+ <combo_box.item label="SaÄŸ Rahat" name="RelaxedRight"/>
+ <combo_box.item label="SaÄŸ Ä°ÅŸaret Ediyor" name="PointRight"/>
+ <combo_box.item label="SaÄŸ Yumruk" name="FistRight"/>
+ <combo_box.item label="Sağı Selamlıyor" name="SaluteRight"/>
+ <combo_box.item label="Yazı Yazıyor" name="Typing"/>
+ <combo_box.item label="Sağ Barış" name="PeaceRight"/>
+ </combo_box>
+ <text name="emote_label">
+ Ä°fade
+ </text>
+ <combo_box name="emote_combo" tool_tip="Yüzün animasyon sırasındaki ifadesini kontrol eder">
+ <item label="(Hiçbiri)" name="[None]" value=""/>
+ <item label="Aaaaah" name="Aaaaah" value="Aaaaah"/>
+ <item label="KorkmuÅŸ" name="Afraid" value="KorkmuÅŸ"/>
+ <item label="Kızgın" name="Angry" value="Kızgın"/>
+ <item label="Yaygın Gülümseyiş" name="BigSmile" value="Yaygın Gülümseyiş"/>
+ <item label="Canı Sıkılmış" name="Bored" value="Canı Sıkılmış"/>
+ <item label="AÄŸlama" name="Cry" value="AÄŸlama"/>
+ <item label="Dudak Bükme" name="Disdain" value="Dudak Bükme"/>
+ <item label="Utanmış" name="Embarrassed" value="Utanmış"/>
+ <item label="Kaş Çatma" name="Frown" value="Kaş Çatma"/>
+ <item label="Öpücük" name="Kiss" value="Öpücük"/>
+ <item label="Gülme" name="Laugh" value="Gülme"/>
+ <item label="Kahkaha" name="Plllppt" value="Kahkaha"/>
+ <item label="TiksinmiÅŸ" name="Repulsed" value="TiksinmiÅŸ"/>
+ <item label="Üzgün" name="Sad" value="Üzgün"/>
+ <item label="Omuz Silkme" name="Shrug" value="Omuz Silkme"/>
+ <item label="Gülümseme" name="Smile" value="Gülümseme"/>
+ <item label="Sürpriz" name="Surprise" value="Sürpriz"/>
+ <item label="Göz Kırpma" name="Wink" value="Göz Kırpma"/>
+ <item label="EndiÅŸelenme" name="Worry" value="EndiÅŸelenme"/>
+ </combo_box>
+ <text name="preview_label">
+ Şu sırada önizle
+ </text>
+ <combo_box name="preview_base_anim" tool_tip="Animasyon davranışınızı avatarınız genel hareketleri yaparken test etmek için bunu kullanın.">
+ <item label="Ayakta Duruyor" name="Standing" value="Ayakta Duruyor"/>
+ <item label="Yürüyor" name="Walking" value="Yürüyor"/>
+ <item label="Oturuyor" name="Sitting" value="Oturuyor"/>
+ <item label="Uçuyor" name="Flying" value="Uçuyor"/>
+ </combo_box>
+ <spinner label="Yavaş Başlangıç (saniye)" name="ease_in_time" tool_tip="Animasyonun kaynaştığı süre (saniye olarak)"/>
+ <spinner label="Yavaş Bitiş (saniye)" name="ease_out_time" tool_tip="Animasyonun ayrıştığı süre (saniye olarak)"/>
+ <button name="play_btn" tool_tip="Animasyonunu oynat"/>
+ <button name="pause_btn" tool_tip="Animasyonunu duraklat"/>
+ <button name="stop_btn" tool_tip="Animasyo oynatmayı durdur"/>
+ <text name="bad_animation_text">
+ Animasyon dosyası okunamadı.
+
+Poser 4&apos;ten aktarılan BHV dosyalarını tavsiye ederiz.
+ </text>
+ <button label="Karşıya Yükle (L$[AMOUNT])" name="ok_btn"/>
+ <button label="Ä°ptal" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_auction.xml b/indra/newview/skins/default/xui/tr/floater_auction.xml
new file mode 100644
index 0000000000..3c945a9c96
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_auction.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_auction" title="LINDEN ARAZÄ° SATIÅžINI BAÅžLAT">
+ <floater.string name="already for sale">
+ Zaten satışa çıkarılmış olan parselleri açık artırmaya sunamazsınız.
+ </floater.string>
+ <check_box initial_value="true" label="Sarı seçim çiti dahil edilsin" name="fence_check"/>
+ <button label="Anlık Görüntü" label_selected="Anlık Görüntü" name="snapshot_btn"/>
+ <button label="Herkese Sat" label_selected="Herkese Sat" name="sell_to_anyone_btn"/>
+ <button label="Ayarları Temizle" label_selected="Ayarları Temizle" name="reset_parcel_btn"/>
+ <button label="Açık Artırmayı Başlat" label_selected="Açık Artırmayı Başlat" name="start_auction_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_avatar.xml b/indra/newview/skins/default/xui/tr/floater_avatar.xml
new file mode 100644
index 0000000000..c6b14ba710
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_avatar.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Avatar" title="BİR AVATAR SEÇİN"/>
diff --git a/indra/newview/skins/default/xui/tr/floater_avatar_picker.xml b/indra/newview/skins/default/xui/tr/floater_avatar_picker.xml
new file mode 100644
index 0000000000..99c2aae5a3
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_avatar_picker.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="avatarpicker" title="SAKİNİ SEÇ">
+ <floater.string name="not_found">
+ &apos;[TEXT]&apos; bulunamadı
+ </floater.string>
+ <floater.string name="no_one_near">
+ Yakında kimse yok
+ </floater.string>
+ <floater.string name="no_results">
+ Sonuç yok
+ </floater.string>
+ <floater.string name="searching">
+ Arıyor...
+ </floater.string>
+ <string name="Select">
+ Seç
+ </string>
+ <string name="Close">
+ Kapat
+ </string>
+ <tab_container name="ResidentChooserTabs">
+ <panel label="Ara" name="SearchPanel">
+ <text name="InstructSearchResidentName">
+ Bir kişinin adının bir kısmını yazın:
+ </text>
+ <button label="Git" label_selected="Git" name="Find"/>
+ <scroll_list name="SearchResults">
+ <columns label="Ad" name="name"/>
+ <columns label="Kullanıcı Adı" name="username"/>
+ </scroll_list>
+ </panel>
+ <panel label="ArkadaÅŸlar" name="FriendsPanel">
+ <text name="InstructSelectFriend">
+ Bir kişiyi seçin:
+ </text>
+ </panel>
+ <panel label="Bana Yakın" name="NearMePanel">
+ <text name="InstructSelectResident">
+ Yakındaki bir kişiyi seçin:
+ </text>
+ <slider label="Mesafe" name="near_me_range"/>
+ <text name="meters">
+ Metre
+ </text>
+ <scroll_list name="NearMe">
+ <columns label="Ad" name="name"/>
+ <columns label="Kullanıcı Adı" name="username"/>
+ </scroll_list>
+ </panel>
+ </tab_container>
+ <button label="Tamam" label_selected="Tamam" name="ok_btn"/>
+ <button label="Ä°ptal" label_selected="Ä°ptal" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_avatar_textures.xml b/indra/newview/skins/default/xui/tr/floater_avatar_textures.xml
new file mode 100644
index 0000000000..b519cfa1a9
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_avatar_textures.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="avatar_texture_debug" title="AVATAR DOKULARI">
+ <floater.string name="InvalidAvatar">
+ GEÇERSİZ AVATAR
+ </floater.string>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text name="label">
+ Kaydeildi
+Dokular
+ </text>
+ <text name="composite_label">
+ BirleÅŸik
+Dokular
+ </text>
+ <button label="Kimlikleri Konsole Yığ" label_selected="Yığ" name="Dump"/>
+ <panel name="scroll_content_panel">
+ <texture_picker label="Saç" name="hair-baked"/>
+ <texture_picker label="Saç" name="hair_grain"/>
+ <texture_picker label="Saç Alfası" name="hair_alpha"/>
+ <texture_picker label="BaÅŸ" name="head-baked"/>
+ <texture_picker label="Makyaj" name="head_bodypaint"/>
+ <texture_picker label="Baş Alfası" name="head_alpha"/>
+ <texture_picker label="Baş Dövmesi" name="head_tattoo"/>
+ <texture_picker label="Gözler" name="eyes-baked"/>
+ <texture_picker label="Göz" name="eyes_iris"/>
+ <texture_picker label="Göz Alfası" name="eyes_alpha"/>
+ <texture_picker label="Üst Gövde" name="upper-baked"/>
+ <texture_picker label="Üst GövdeBoya" name="upper_bodypaint"/>
+ <texture_picker label="Fanila" name="upper_undershirt"/>
+ <texture_picker label="Eldivenler" name="upper_gloves"/>
+ <texture_picker label="Gömlek" name="upper_shirt"/>
+ <texture_picker label="Ãœst Ceket" name="upper_jacket"/>
+ <texture_picker label="Yüksek Alfa" name="upper_alpha"/>
+ <texture_picker label="Üst Gövde Dövmesi" name="upper_tattoo"/>
+ <texture_picker label="Alt Gövde" name="lower-baked"/>
+ <texture_picker label="Alt GövdeBoya" name="lower_bodypaint"/>
+ <texture_picker label="Külot" name="lower_underpants"/>
+ <texture_picker label="Çoraplar" name="lower_socks"/>
+ <texture_picker label="Ayakkabılar" name="lower_shoes"/>
+ <texture_picker label="Pantolon" name="lower_pants"/>
+ <texture_picker label="Ceket" name="lower_jacket"/>
+ <texture_picker label="Düşük Alfa" name="lower_alpha"/>
+ <texture_picker label="Alt Gövde Dövmesi" name="lower_tattoo"/>
+ <texture_picker label="Etek" name="skirt-baked"/>
+ <texture_picker label="Etek" name="skirt"/>
+ </panel>
+ </panel>
+ </scroll_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_beacons.xml b/indra/newview/skins/default/xui/tr/floater_beacons.xml
new file mode 100644
index 0000000000..08ebf36be5
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_beacons.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="beacons" title="Ä°ÅžARETLER">
+ <panel name="beacons_panel">
+ <text name="label_show">
+ Göster :
+ </text>
+ <check_box label="Ä°ÅŸaretler" name="beacons"/>
+ <check_box label="Vurgulananlar" name="highlights"/>
+ <text name="beacon_width_label" tool_tip="Ä°ÅŸaret geniÅŸliÄŸi">
+ GeniÅŸlik:
+ </text>
+ <text name="label_objects">
+ Bu nesneler için.
+ </text>
+ <check_box label="Fiziksel" name="physical"/>
+ <check_box label="Komut Dosyalı" name="scripted"/>
+ <check_box label="Sadece dokun" name="touch_only"/>
+ <check_box label="Ses kaynakları" name="sounds"/>
+ <check_box label="Parçacık kaynakları" name="particles"/>
+ <check_box label="Ortam kaynakları" name="moapbeacon"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_build_options.xml b/indra/newview/skins/default/xui/tr/floater_build_options.xml
new file mode 100644
index 0000000000..5e77f6b168
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_build_options.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="build options floater" title="AĞ SEÇENEKLERİ">
+ <floater.string name="grid_screen_text">
+ Ekran
+ </floater.string>
+ <floater.string name="grid_local_text">
+ Yerel
+ </floater.string>
+ <floater.string name="grid_world_text">
+ Dünya
+ </floater.string>
+ <floater.string name="grid_reference_text">
+ Referans
+ </floater.string>
+ <floater.string name="grid_attachment_text">
+ Aksesuar
+ </floater.string>
+ <text name="grid_mode_label" tool_tip="Ağ geçirgenliği">
+ Mod
+ </text>
+ <combo_box name="combobox grid mode" tool_tip="Nesneyi konumlandırmak için ağ cetvelini seçin">
+ <combo_box.item label="Dünya ağı" name="World"/>
+ <combo_box.item label="Yerel aÄŸ" name="Local"/>
+ <combo_box.item label="Referans ağı" name="Reference"/>
+ </combo_box>
+ <spinner label="Birimler (metre)" name="GridResolution"/>
+ <spinner label="Kapsamlar (metre)" name="GridDrawSize"/>
+ <check_box label="Alt birimlere geç" name="GridSubUnit"/>
+ <check_box label="Çapraz kesitleri göster" name="GridCrossSection"/>
+ <text name="grid_opacity_label" tool_tip="Ağ geçirgenliği">
+ Geçirgenlik:
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_bulk_perms.xml b/indra/newview/skins/default/xui/tr/floater_bulk_perms.xml
new file mode 100644
index 0000000000..1d929a2dd3
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_bulk_perms.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floaterbulkperms" title="İÇERİK İZİNLERİNİ DÜZENLE">
+ <floater.string name="nothing_to_modify_text">
+ Seçim içerisinde düzenlenebilir içerik yok.
+ </floater.string>
+ <floater.string name="status_text">
+ [NAME] üzerinde izinler ayarlanıyor
+ </floater.string>
+ <floater.string name="start_text">
+ İzin değişiklik talepleri başlatılıyor...
+ </floater.string>
+ <floater.string name="done_text">
+ İzin değişiklik talepleri sonlandırıldı.
+ </floater.string>
+ <icon name="icon_animation" tool_tip="Animasyon"/>
+ <icon name="icon_bodypart" tool_tip="Vücut Bölümleri"/>
+ <icon name="icon_clothing" tool_tip="Giysiler"/>
+ <icon name="icon_gesture" tool_tip="Mimikler"/>
+ <icon name="icon_notecard" tool_tip="Not Kartları"/>
+ <icon name="icon_object" tool_tip="Nesneler"/>
+ <icon name="icon_script" tool_tip="Komut Dosyaları"/>
+ <icon name="icon_sound" tool_tip="Sesler"/>
+ <icon name="icon_texture" tool_tip="Dokular"/>
+ <button label="√ Tümü" name="check_all"/>
+ <button label="Temizle" label_selected="Hiçbiri" name="check_none"/>
+ <text name="newperms">
+ Yeni İçerik İzinleri
+ </text>
+ <text name="GroupLabel">
+ Grup:
+ </text>
+ <check_box label="PaylaÅŸ" name="share_with_group"/>
+ <text name="AnyoneLabel">
+ Herkes:
+ </text>
+ <check_box label="Kopyala" name="everyone_copy"/>
+ <text name="NextOwnerLabel">
+ Sonraki sahip:
+ </text>
+ <check_box label="DeÄŸiÅŸtir" name="next_owner_modify"/>
+ <check_box label="Kopyala" name="next_owner_copy"/>
+ <check_box initial_value="true" label="Aktar" name="next_owner_transfer" tool_tip="Sonraki sahibi bu nesneyi verebilir veya tekrar satabilir"/>
+ <button label="Tamam" name="apply"/>
+ <button label="Ä°ptal" name="close"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_bumps.xml b/indra/newview/skins/default/xui/tr/floater_bumps.xml
new file mode 100644
index 0000000000..06ae3a2ec3
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_bumps.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_bumps" title="TOSLAMALAR, Ä°TMELER VE VURMALAR">
+ <floater.string name="none_detected">
+ Hiçbiri tespit edilmedi
+ </floater.string>
+ <floater.string name="bump">
+ [TIME] [NAME] size tosladı
+ </floater.string>
+ <floater.string name="llpushobject">
+ [TIME] [NAME] bir komut dosyasıyla sizi itti
+ </floater.string>
+ <floater.string name="selected_object_collide">
+ [TIME] [NAME] bir nesneyle size vurdu
+ </floater.string>
+ <floater.string name="scripted_object_collide">
+ [TIME] [NAME] komut doyalı bir nesneyle size vurdu
+ </floater.string>
+ <floater.string name="physical_object_collide">
+ [TIME] [NAME] fiziki bir nesneyle size vurdu
+ </floater.string>
+ <floater.string name="timeStr">
+ [[hour,datetime,slt]:[min,datetime,slt]]
+ </floater.string>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_buy_contents.xml b/indra/newview/skins/default/xui/tr/floater_buy_contents.xml
new file mode 100644
index 0000000000..9012189ce5
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_buy_contents.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_buy_contents" title="İÇERİĞİ SATIN AL">
+ <floater.string name="no_copy_text">
+ (kopya yok)
+ </floater.string>
+ <floater.string name="no_modify_text">
+ (deÄŸiÅŸtirme yok)
+ </floater.string>
+ <floater.string name="no_transfer_text">
+ (aktarım yok)
+ </floater.string>
+ <text name="contains_text">
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; içeriği:
+ </text>
+ <text name="buy_text">
+ L$[AMOUNT] karşılığında [NAME]&apos;den satın alınsın mı?
+ </text>
+ <check_box label="Giysiyi ÅŸimdi giy" name="wear_check"/>
+ <button label="Satın Al" label_selected="Satın Al" name="buy_btn"/>
+ <button label="Ä°ptal" label_selected="Ä°ptal" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_buy_currency.xml b/indra/newview/skins/default/xui/tr/floater_buy_currency.xml
new file mode 100644
index 0000000000..d90985dcff
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_buy_currency.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="buy currency" title="L$ SATIN AL">
+ <floater.string name="buy_currency">
+ Yaklaşık [LOCALAMOUNT] karşılığında [LINDENS] L$ satın al
+ </floater.string>
+ <text name="info_need_more">
+ Daha fazla L$&apos;na ihtiyacınız var
+ </text>
+ <text name="contacting">
+ LindeX ile bağlantı kuruluyor...
+ </text>
+ <text name="info_buying">
+ L$ Satın Al
+ </text>
+ <text name="balance_label">
+ Sahip olduÄŸum miktar:
+ </text>
+ <text name="balance_amount">
+ L$ [AMT]
+ </text>
+ <text name="currency_action">
+ Satın almak istediğim miktar:
+ </text>
+ <text name="currency_label">
+ L$
+ </text>
+ <line_editor label="L$" name="currency_amt">
+ 1234
+ </line_editor>
+ <text name="buying_label">
+ Fiyatı:
+ </text>
+ <text name="currency_est">
+ yakl. [LOCALAMOUNT]
+ </text>
+ <text name="getting_data">
+ Hesaplanıyor...
+ </text>
+ <text name="buy_action">
+ [ACTION]
+ </text>
+ <text name="total_label">
+ Bakiye param ÅŸu kadar olacak:
+ </text>
+ <text name="total_amount">
+ L$ [AMT]
+ </text>
+ <text name="currency_links">
+ [http://www.secondlife.com/my/account/payment_method_management.php ödeme yöntemi] | [http://www.secondlife.com/my/account/currency.php para birimi]
+ </text>
+ <text name="exchange_rate_note">
+ En son döviz kurunu görmek için miktarı yeniden girin.
+ </text>
+ <text name="purchase_warning_repurchase">
+ Bu satın alma işlemini teyit ettiğinizde nesne değil, L$ satın alırsınız.
+ </text>
+ <text name="purchase_warning_notenough">
+ Yeterli L$ satın almıyorsunuz. Lütfen miktarı artırın.
+ </text>
+ <button label="Şimdi Satın Al" name="buy_btn"/>
+ <button label="Ä°ptal" name="cancel_btn"/>
+ <text name="info_cannot_buy">
+ Satın Alınamıyor
+ </text>
+ <button label="Web&apos;e devam et" name="error_web"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_buy_currency_html.xml b/indra/newview/skins/default/xui/tr/floater_buy_currency_html.xml
new file mode 100644
index 0000000000..98aaf50db0
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_buy_currency_html.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_buy_currency_html" title="PARA SATIN AL"/>
diff --git a/indra/newview/skins/default/xui/tr/floater_buy_land.xml b/indra/newview/skins/default/xui/tr/floater_buy_land.xml
new file mode 100644
index 0000000000..7b43af2ea4
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_buy_land.xml
@@ -0,0 +1,233 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="buy land" title="ARAZÄ° SATIN AL">
+ <floater.string name="can_resell">
+ Tekrar satılabilir.
+ </floater.string>
+ <floater.string name="can_not_resell">
+ Tekrar satılamaz.
+ </floater.string>
+ <floater.string name="can_change">
+ Eklenebilir veya bölünebilir.
+ </floater.string>
+ <floater.string name="can_not_change">
+ Eklenemez veya bölünemez.
+ </floater.string>
+ <floater.string name="cant_buy_for_group">
+ Etkin grubunuz adına arazi satın almak için gerekli izne sahip değilsiniz.
+ </floater.string>
+ <floater.string name="no_land_selected">
+ Seçili arazi yok.
+ </floater.string>
+ <floater.string name="multiple_parcels_selected">
+ Birden fazla farklı parsel seçildi.
+Daha küçük bir alan seçmeyi deneyin.
+ </floater.string>
+ <floater.string name="no_permission">
+ Etkin grubunuz adına arazi satın almak için gerekli izne sahip değilsiniz.
+ </floater.string>
+ <floater.string name="parcel_not_for_sale">
+ Seçilen parsel satılık değil.
+ </floater.string>
+ <floater.string name="group_already_owns">
+ Parsel zaten gruba ait.
+ </floater.string>
+ <floater.string name="you_already_own">
+ Parsel zaten size ait.
+ </floater.string>
+ <floater.string name="set_to_sell_to_other">
+ Seçilen parsel başka birisine satılmak için ayrılmış.
+ </floater.string>
+ <floater.string name="no_public_land">
+ Seçilen alanda kamu arazisi yok.
+ </floater.string>
+ <floater.string name="not_owned_by_you">
+ Başka bir Sakine ait arazi seçildi.
+Daha küçük bir alan seçmeyi deneyin.
+ </floater.string>
+ <floater.string name="processing">
+ Satın alımınız işleniyor...
+
+(Bu işlem bir iki dakika sürebilir.)
+ </floater.string>
+ <floater.string name="fetching_error">
+ Arazi alma bilgileri çekilirken hata oluştu.
+ </floater.string>
+ <floater.string name="buying_will">
+ Arazinin satın alınması sonucu:
+ </floater.string>
+ <floater.string name="buying_for_group">
+ Bu arazinin grup için satın alınması sonucu:
+ </floater.string>
+ <floater.string name="cannot_buy_now">
+ Şimdi satın alamaz:
+ </floater.string>
+ <floater.string name="not_for_sale">
+ Satılık değil:
+ </floater.string>
+ <floater.string name="none_needed">
+ hiç ihtiyaç yok
+ </floater.string>
+ <floater.string name="must_upgrade">
+ Arazi sahibi olmak için hesabınızın yükseltilmesi gerekir.
+ </floater.string>
+ <floater.string name="cant_own_land">
+ Hesabınız arazi sahibi olabilir.
+ </floater.string>
+ <floater.string name="land_holdings">
+ Elinizde [BUYER] m² arazi var.
+ </floater.string>
+ <floater.string name="pay_to_for_land">
+ Bu arazi için [SELLER]&apos;e L$[AMOUNT] ödeyin
+ </floater.string>
+ <floater.string name="buy_for_US">
+ Yaklaşık [LOCAL_AMOUNT] için L$[AMOUNT] satın al,
+ </floater.string>
+ <floater.string name="parcel_meters">
+ Bu parsel [AMOUNT] m²
+ </floater.string>
+ <floater.string name="premium_land">
+ Bu parsel primlidir ve [AMOUNT] m² olarak ücretlendirilecektir.
+ </floater.string>
+ <floater.string name="discounted_land">
+ Bu parsel indirimlidir ve [AMOUNT] m² olarak ücretlendirilecektir.
+ </floater.string>
+ <floater.string name="meters_supports_object">
+ [AMOUNT] m²
+[AMOUNT2] nesneyi destekler
+ </floater.string>
+ <floater.string name="sold_with_objects">
+ nesnelerle satılır
+ </floater.string>
+ <floater.string name="sold_without_objects">
+ nesneler dahil deÄŸildir
+ </floater.string>
+ <floater.string name="info_price_string">
+ L$[PRICE]
+(L$ [PRICE_PER_SQM]/m²)
+[SOLD_WITH_OBJECTS]
+ </floater.string>
+ <floater.string name="insufficient_land_credits">
+ [GROUP] grubu, satın almanın gerçekleşmesi için bu parselin fiyatını karşılamak amacıyla yeterli miktarda arazi kullanım kredisine ihtiyaç duyacaktır.
+ </floater.string>
+ <floater.string name="have_enough_lindens">
+ L$ [AMOUNT] sahibisiniz, bu da bu araziyi almaya yeter.
+ </floater.string>
+ <floater.string name="not_enough_lindens">
+ Sadece L$ [AMOUNT] sahibisiniz, L$ [AMOUNT2] kadar daha ihtiyacınız var.
+ </floater.string>
+ <floater.string name="balance_left">
+ Satın alımdan sonra elinizde L$ [AMOUNT] kalacak.
+ </floater.string>
+ <floater.string name="balance_needed">
+ Bu araziyi alabilmek için en az L$ [AMOUNT] almanız gerekir.
+ </floater.string>
+ <floater.string name="no_parcel_selected">
+ (seçili parsel yok)
+ </floater.string>
+ <text name="region_name_label">
+ Bölge:
+ </text>
+ <text name="region_name_text">
+ (bilinmiyor)
+ </text>
+ <text name="region_type_label">
+ Tür:
+ </text>
+ <text name="region_type_text">
+ (bilinmiyor)
+ </text>
+ <text name="estate_name_label">
+ Gayrimenkul:
+ </text>
+ <text name="estate_name_text">
+ (bilinmiyor)
+ </text>
+ <text name="estate_owner_label">
+ Gayrimenkul Sahibi:
+ </text>
+ <text name="estate_owner_text">
+ (bilinmiyor)
+ </text>
+ <text name="resellable_changeable_label">
+ Bu bölgede satın alınan arazi:
+ </text>
+ <text name="resellable_clause">
+ Tekrar satılabilir veya satılamaz.
+ </text>
+ <text name="changeable_clause">
+ Eklenebilir/bölünebilir veya eklenemez/bölünemez.
+ </text>
+ <text name="covenant_text">
+ Gayrimenkul Sözleşmesini kabul etmelisiniz:
+ </text>
+ <text_editor name="covenant_editor">
+ Yükleniyor...
+ </text_editor>
+ <check_box label="Yukarıda Tanımlanan Sözleşmeyi Kabul Ediyorum." name="agree_covenant"/>
+ <text name="info_parcel_label">
+ Parsel:
+ </text>
+ <text name="info_parcel">
+ Scotopteryx 138,204
+ </text>
+ <text name="info_size_label">
+ Büyüklük:
+ </text>
+ <text name="info_size">
+ 1.024 m²
+ </text>
+ <text name="info_price_label">
+ Fiyat:
+ </text>
+ <text name="info_price">
+ L$ 1500
+(L$ 1,1/m²)
+nesnelerle satılır
+ </text>
+ <text name="info_action">
+ Arazinin satın alınması sonucu:
+ </text>
+ <text name="error_message">
+ Bir ÅŸeyler yolunda deÄŸil.
+ </text>
+ <button label="Web sitesine git" name="error_web"/>
+ <text name="account_action">
+ Ücretli üyeliğini yükselt.
+ </text>
+ <text name="account_reason">
+ Sadece ücretli üyeler arazi sahibi olabilir.
+ </text>
+ <combo_box name="account_level">
+ <combo_box.item label="US$9,95/ay, aylık fatura edilir" name="US$9.95/month,billedmonthly"/>
+ <combo_box.item label="US$7,50/ay, üç aylık fatura edilir" name="US$7.50/month,billedquarterly"/>
+ <combo_box.item label="US$6,00/ay, yıllık fatura edilir" name="US$6.00/month,billedannually"/>
+ </combo_box>
+ <text name="land_use_action">
+ Aylık arazi kullanım ücretlerinizi US$40/aya çıkarın.
+ </text>
+ <text name="land_use_reason">
+ Elinizde 1309 m² arazi var.
+Bu parsel 512 m² arazidir.
+ </text>
+ <text name="purchase_action">
+ Arazi için Joe Sakine L$ 4000 ödeme yap
+ </text>
+ <text name="currency_reason">
+ L$ 2.100&apos;ünüz var.
+ </text>
+ <text name="currency_action">
+ İlave L$ satın al
+ </text>
+ <line_editor name="currency_amt">
+ 1000
+ </line_editor>
+ <text name="currency_est">
+ yaklaşık [LOCAL_AMOUNT] için
+ </text>
+ <text name="currency_balance">
+ L$ 2.100&apos;ünüz var.
+ </text>
+ <check_box label="[AMOUNT] m² katkıyı gruptan kaldır." name="remove_contribution"/>
+ <button label="Satın Al" name="buy_btn"/>
+ <button label="Ä°ptal" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_buy_object.xml b/indra/newview/skins/default/xui/tr/floater_buy_object.xml
new file mode 100644
index 0000000000..91ef05fb29
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_buy_object.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="contents" title="NESNENÄ°N KOPYASINI SATIN AL">
+ <floater.string name="title_buy_text">
+ Satın Al
+ </floater.string>
+ <floater.string name="title_buy_copy_text">
+ Şunun bir kopyasını satın alın:
+ </floater.string>
+ <floater.string name="no_copy_text">
+ (kopya yok)
+ </floater.string>
+ <floater.string name="no_modify_text">
+ (deÄŸiÅŸtirme yok)
+ </floater.string>
+ <floater.string name="no_transfer_text">
+ (aktarım yok)
+ </floater.string>
+ <text name="contents_text">
+ İçeriği:
+ </text>
+ <text name="buy_text">
+ L$[AMOUNT] karşılığında şuradan satın alın:
+ </text>
+ <text name="buy_name_text">
+ [NAME]?
+ </text>
+ <button label="Satın Al" label_selected="Satın Al" name="buy_btn"/>
+ <button label="Ä°ptal" label_selected="Ä°ptal" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_camera.xml b/indra/newview/skins/default/xui/tr/floater_camera.xml
new file mode 100644
index 0000000000..22e2aa52c6
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_camera.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="camera_floater" title="KAMERA DENETÄ°MLERÄ°">
+ <floater.string name="rotate_tooltip">
+ Odak Etrafında Kamerayı Döndür
+ </floater.string>
+ <floater.string name="zoom_tooltip">
+ Kamerayı Odağa Yakınlaştır
+ </floater.string>
+ <floater.string name="move_tooltip">
+ Kamerayı Yukarı ve Aşağı, Sola ve Sağa Hareket Ettir
+ </floater.string>
+ <floater.string name="free_mode_title">
+ Nesneyi Göster
+ </floater.string>
+ <panel name="controls">
+ <panel name="preset_views_list">
+ <panel_camera_item name="front_view">
+ <panel_camera_item.text name="front_view_text">
+ Ön Görünüm
+ </panel_camera_item.text>
+ </panel_camera_item>
+ <panel_camera_item name="group_view">
+ <panel_camera_item.text name="side_view_text">
+ Yan Görünüm
+ </panel_camera_item.text>
+ </panel_camera_item>
+ <panel_camera_item name="rear_view">
+ <panel_camera_item.text name="rear_view_text">
+ Arkadan Görünüm
+ </panel_camera_item.text>
+ </panel_camera_item>
+ </panel>
+ <panel name="camera_modes_list">
+ <panel_camera_item name="object_view">
+ <panel_camera_item.text name="object_view_text">
+ Nesne Görünümü
+ </panel_camera_item.text>
+ </panel_camera_item>
+ <panel_camera_item name="mouselook_view">
+ <panel_camera_item.text name="mouselook_view_text">
+ Fare Üzerinden Görünüm
+ </panel_camera_item.text>
+ </panel_camera_item>
+ </panel>
+ <panel name="zoom">
+ <joystick_rotate name="cam_rotate_stick" tool_tip="Kamera odak etrafında yörüngede hareket etsin"/>
+ <slider_bar name="zoom_slider" tool_tip="Kamerayı odağa yakınlaştır"/>
+ <joystick_track name="cam_track_stick" tool_tip="Kamerayı yukarı ve aşağı, sola ve sağa hareket ettir"/>
+ </panel>
+ </panel>
+ <panel name="buttons">
+ <button label="" name="presets_btn" tool_tip="Ön Ayarlı Görünümler"/>
+ <button label="" name="pan_btn" tool_tip="Yörünge Değişimi - Yakınlaştırma - Kamerayı Çevirme"/>
+ <button label="" name="avatarview_btn" tool_tip="Kamera modları"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_chat_bar.xml b/indra/newview/skins/default/xui/tr/floater_chat_bar.xml
new file mode 100644
index 0000000000..988c845982
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_chat_bar.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="chat_bar" title="YAKINDAKÄ° SOHBET">
+ <panel name="bottom_panel">
+ <line_editor label="Sohbet etmek için buraya tıklayın." name="chat_box" tool_tip="Söylemek için Enter, bağırmak için Ctrl+Enter yapın"/>
+ <button name="show_nearby_chat" tool_tip="Yakın sohbet günlüğünü gösterir/gizler"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_choose_group.xml b/indra/newview/skins/default/xui/tr/floater_choose_group.xml
new file mode 100644
index 0000000000..1bfc772f4a
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_choose_group.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="groups" title="GRUPLAR">
+ <text name="groupdesc">
+ Bir grup seç:
+ </text>
+ <button label="Tamam" label_selected="Tamam" name="OK"/>
+ <button label="Ä°ptal" label_selected="Ä°ptal" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_color_picker.xml b/indra/newview/skins/default/xui/tr/floater_color_picker.xml
new file mode 100644
index 0000000000..c9465fff83
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_color_picker.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="ColorPicker" title="RENK SEÇİCİ">
+ <text name="r_val_text">
+ Kırmızı:
+ </text>
+ <text name="g_val_text">
+ YeÅŸil:
+ </text>
+ <text name="b_val_text">
+ Mavi:
+ </text>
+ <text name="h_val_text">
+ Ton:
+ </text>
+ <text name="s_val_text">
+ Sat:
+ </text>
+ <text name="l_val_text">
+ Par:
+ </text>
+ <check_box label="Åžimdi uygula" name="apply_immediate"/>
+ <button label="Tamam" label_selected="Tamam" name="select_btn"/>
+ <button label="Ä°ptal" label_selected="Ä°ptal" name="cancel_btn"/>
+ <text name="Current color:">
+ Geçerli renk:
+ </text>
+ <text name="(Drag below to save.)">
+ (Kaydetmek için aşağıya sürükleyin)
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_critical.xml b/indra/newview/skins/default/xui/tr/floater_critical.xml
new file mode 100644
index 0000000000..041a303bae
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_critical.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="modal container">
+ <button label="Devam Et" label_selected="Devam Et" name="Continue"/>
+ <text name="tos_heading">
+ Lütfen aşağıdaki iletiyi dikkatle okuyun.
+ </text>
+ <text_editor name="tos_text">
+ TOS_TEXT
+ </text_editor>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_delete_env_preset.xml b/indra/newview/skins/default/xui/tr/floater_delete_env_preset.xml
new file mode 100644
index 0000000000..915770f727
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_delete_env_preset.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<floater name="Delete Env Preset" title="ORTAM ÖN AYARINI SİL">
+ <string name="title_water">
+ Su Ön Ayarını Sil
+ </string>
+ <string name="title_sky">
+ Gökyüzü Ön Ayarını Sil
+ </string>
+ <string name="title_day_cycle">
+ Gün Döngüsünü Sil
+ </string>
+ <string name="label_water">
+ Ön Ayar:
+ </string>
+ <string name="label_sky">
+ Ön Ayar:
+ </string>
+ <string name="label_day_cycle">
+ Gün döngüsü:
+ </string>
+ <string name="msg_confirm_deletion">
+ Seçili ön ayarı silmek istediğinize emin misiniz?
+ </string>
+ <string name="msg_sky_is_referenced">
+ Bazı gün döngüleri tarafından başvurulan bir ön ayar kaldırılamaz.
+ </string>
+ <string name="combo_label">
+ -Bir ön ayar seçin-
+ </string>
+ <text name="label">
+ Ön Ayar:
+ </text>
+ <button label="Sil" name="delete"/>
+ <button label="Ä°ptal" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_destinations.xml b/indra/newview/skins/default/xui/tr/floater_destinations.xml
new file mode 100644
index 0000000000..4504366d63
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_destinations.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Destinations" title="HEDEF KONUMLAR"/>
diff --git a/indra/newview/skins/default/xui/tr/floater_display_name.xml b/indra/newview/skins/default/xui/tr/floater_display_name.xml
new file mode 100644
index 0000000000..e39be5a24b
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_display_name.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Display Name" title="EKRAN ADINI DEĞİŞTİR">
+ <text name="info_text">
+ Avatarınıza verdiğiniz ad, Ekran Adınız olarak değerlendirilir. Bunu haftada bir kere değiştirebilirsiniz.
+ </text>
+ <text name="lockout_text">
+ Ekran Adınızı şu saate kadar değiştiremezsiniz: [TIME].
+ </text>
+ <text name="set_name_label">
+ Yeni Ekran Adı:
+ </text>
+ <text name="name_confirm_label">
+ Onaylamak için yeni adınızı tekrar yazın:
+ </text>
+ <button label="Kaydet" name="save_btn" tool_tip="Yeni Ekran Adınızı kaydedin"/>
+ <button label="Sıfırla" name="reset_btn" tool_tip="Ekran Adını Kullanıcı Adıyla aynı yap"/>
+ <button label="Ä°ptal" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_edit_day_cycle.xml b/indra/newview/skins/default/xui/tr/floater_edit_day_cycle.xml
new file mode 100644
index 0000000000..4be1068dcc
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_edit_day_cycle.xml
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Edit Day cycle" title="Gün Döngüsünü Düzenle">
+ <string name="title_new">
+ Yeni Bir Gün Döngüsü Oluştur
+ </string>
+ <string name="title_edit">
+ Gün Döngüsünü Düzenle
+ </string>
+ <string name="hint_new">
+ Gün döngünüzü adlandırın, bunu oluşturmak için denetimleri ayarlayın ve &quot;Kaydet&quot; üzerine tıklayın.
+ </string>
+ <string name="hint_edit">
+ Gün döngünüzü düzenlemek için alttaki denetimleri ayarlayın ve &quot;Kaydet&quot; üzerine tıklayın.
+ </string>
+ <string name="combo_label">
+ -Bir ön ayar seçin-
+ </string>
+ <text name="label">
+ Ön Ayar Adı:
+ </text>
+ <text name="note">
+ Not: Ön ayarınızın adını değiştirirseniz, yeni bir ön ayar oluşturursunuz ve mevcut ön ayar değişmez.
+ </text>
+ <text name="hint_item1">
+ - Birine tıklayarak gökyüzü ayarlarını/zamanı düzenleyin.
+ </text>
+ <text name="hint_item2">
+ - Sekmelere tıklayıp sürükleyerek geçiş sürlrn. ayarlayın.
+ </text>
+ <text name="hint_item3">
+ - Gün döngünüzü önizlemek için fırçayı kullanın.
+ </text>
+ <panel name="day_cycle_slider_panel">
+ <multi_slider initial_value="0" name="WLTimeSlider"/>
+ <multi_slider initial_value="0" name="WLDayCycleKeys"/>
+ <button label="Anahtar Ekle" label_selected="Anahtar Ekle" name="WLAddKey"/>
+ <button label="Anahtarı Sil" label_selected="Anahtarı Sil" name="WLDeleteKey"/>
+ <text name="WL12am">
+ 12
+ </text>
+ <text name="WL3am">
+ 3
+ </text>
+ <text name="WL6am">
+ 6
+ </text>
+ <text name="WL9amHash">
+ 9
+ </text>
+ <text name="WL12pmHash">
+ 24
+ </text>
+ <text name="WL3pm">
+ 15
+ </text>
+ <text name="WL6pm">
+ 18
+ </text>
+ <text name="WL9pm">
+ 21
+ </text>
+ <text name="WL12am2">
+ 12
+ </text>
+ <text name="WL12amHash">
+ |
+ </text>
+ <text name="WL3amHash">
+ I
+ </text>
+ <text name="WL6amHash">
+ |
+ </text>
+ <text name="WL9amHash2">
+ I
+ </text>
+ <text name="WL12pmHash2">
+ |
+ </text>
+ <text name="WL3pmHash">
+ I
+ </text>
+ <text name="WL6pmHash">
+ |
+ </text>
+ <text name="WL9pmHash">
+ I
+ </text>
+ <text name="WL12amHash2">
+ |
+ </text>
+ </panel>
+ <text name="WLCurKeyPresetText">
+ Gökyüzü Ayarı:
+ </text>
+ <combo_box label="Ön Ayar" name="WLSkyPresets"/>
+ <text name="WLCurKeyTimeText">
+ Zaman:
+ </text>
+ <time name="time" value="6:00"/>
+ <check_box label="Bunu yeni gün döngüm yap" name="make_default_cb"/>
+ <button label="Kaydet" name="save"/>
+ <button label="Ä°ptal" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_edit_sky_preset.xml b/indra/newview/skins/default/xui/tr/floater_edit_sky_preset.xml
new file mode 100644
index 0000000000..0e9f86148d
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_edit_sky_preset.xml
@@ -0,0 +1,143 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Edit Sky Preset" title="Gökyüzü Ön Ayarını Düzenle">
+ <string name="title_new">
+ Yeni Gökyüzü Ön Ayarı Oluştur
+ </string>
+ <string name="title_edit">
+ Gökyüzü Ön Ayarını Düzenle
+ </string>
+ <string name="hint_new">
+ Ön ayarınızı adlandırın, bunu oluşturmak için denetimleri ayarlayın ve &quot;Kaydet&quot; üzerine tıklayın.
+ </string>
+ <string name="hint_edit">
+ Gökyüzü ön ayarınızı düzenlemek için denetimleri ayarlayın ve &quot;Kaydet&quot; üzerine tıklayın.
+ </string>
+ <string name="combo_label">
+ -Bir ön ayar seçin-
+ </string>
+ <text name="hint">
+ Ön ayarınızı düzenlemek için denetimleri ayarlayın, sonra &quot;Kaydet&quot; üzerine tıklayın.
+ </text>
+ <text name="label">
+ Ön Ayar Adı:
+ </text>
+ <text name="note">
+ Not: Ön ayarınızın adını değiştirirseniz, yeni bir ön ayar oluşturursunuz ve mevcut ön ayar değişmez.
+ </text>
+ <tab_container name="WindLight Tabs">
+ <panel label="ATMOSFER" name="Atmosphere">
+ <text name="BHText">
+ Mavi Ufuk
+ </text>
+ <text name="BDensText">
+ Puslu Ufuk
+ </text>
+ <text name="BDensText2">
+ Mavi YoÄŸunluÄŸu
+ </text>
+ <text name="HDText">
+ Pus YoÄŸunluÄŸu
+ </text>
+ <text name="DensMultText">
+ Yoğunluk Çarpanı
+ </text>
+ <text name="WLDistanceMultText">
+ Mesafe Çarpanı
+ </text>
+ <text name="MaxAltText">
+ Maks Ä°rtifa
+ </text>
+ </panel>
+ <panel label="AYDINLATMA" name="Lighting">
+ <text name="SLCText">
+ Güneş/Ay Rengi
+ </text>
+ <text name="WLAmbientText">
+ Ortam
+ </text>
+ <text name="SunGlowText">
+ Güneş Parlaması
+ </text>
+ <slider label="Odak" name="WLGlowB"/>
+ <slider label="Büyüklük" name="WLGlowR"/>
+ <text name="WLStarText">
+ Yıldız Parlaklığı
+ </text>
+ <text name="SceneGammaText">
+ Sahne Gaması
+ </text>
+ <text name="TODText">
+ Güneş/Ay Konumu
+ </text>
+ <multi_slider initial_value="0" name="WLSunPos"/>
+ <text name="WL12amHash">
+ |
+ </text>
+ <text name="WL6amHash">
+ |
+ </text>
+ <text name="WL12pmHash2">
+ |
+ </text>
+ <text name="WL6pmHash">
+ |
+ </text>
+ <text name="WL12amHash2">
+ |
+ </text>
+ <text name="WL12am">
+ 12
+ </text>
+ <text name="WL6am">
+ 6
+ </text>
+ <text name="WL12pmHash">
+ 24
+ </text>
+ <text name="WL6pm">
+ 18
+ </text>
+ <text name="WL12am2">
+ 12
+ </text>
+ <time name="WLDayTime" value="6:00"/>
+ <text name="WLEastAngleText">
+ Doğu Açısı
+ </text>
+ </panel>
+ <panel label="BULUTLAR" name="Clouds">
+ <text name="WLCloudColorText">
+ Bulut Rengi
+ </text>
+ <text name="WLCloudColorText2">
+ Bulut XY/YoÄŸunluÄŸu
+ </text>
+ <slider label="X" name="WLCloudX"/>
+ <slider label="Y" name="WLCloudY"/>
+ <slider label="D" name="WLCloudDensity"/>
+ <text name="WLCloudCoverageText">
+ Bulut Örtüsü
+ </text>
+ <text name="WLCloudScaleText">
+ Bulut Yüksekliği
+ </text>
+ <text name="WLCloudDetailText">
+ Bulut Ayrıntısı (XY/Yoğunluğu)
+ </text>
+ <slider label="X" name="WLCloudDetailX"/>
+ <slider label="Y" name="WLCloudDetailY"/>
+ <slider label="D" name="WLCloudDetailDensity"/>
+ <text name="WLCloudScrollXText">
+ Bulut Kaydırma X
+ </text>
+ <check_box label="Kilitle" name="WLCloudLockX"/>
+ <text name="WLCloudScrollYText">
+ Bulut Kaydırma Y
+ </text>
+ <check_box label="Kilitle" name="WLCloudLockY"/>
+ </panel>
+ </tab_container>
+ <check_box label="Bu ön ayarı yeni gökyüzü ayarım yap" name="make_default_cb"/>
+ <button label="Kaydet" name="save"/>
+ <button label="Ä°ptal" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_edit_water_preset.xml b/indra/newview/skins/default/xui/tr/floater_edit_water_preset.xml
new file mode 100644
index 0000000000..2ddee32bad
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_edit_water_preset.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Edit Water Preset" title="Su Ön Ayarını Düzenle">
+ <string name="title_new">
+ Yeni Bir Su Ön Ayarı Oluştur
+ </string>
+ <string name="title_edit">
+ Bir Su Ön Ayarını Düzenle
+ </string>
+ <string name="hint_new">
+ Ön ayarınızı adlandırın, bunu oluşturmak için denetimleri ayarlayın ve &quot;Kaydet&quot; üzerine tıklayın.
+ </string>
+ <string name="hint_edit">
+ Su ön ayarınızı düzenlemek için denetimleri ayarlayın ve &quot;Kaydet&quot; üzerine tıklayın.
+ </string>
+ <string name="combo_label">
+ -Bir ön ayar seçin-
+ </string>
+ <text name="hint">
+ Ön ayarınızı düzenlemek için denetimleri ayarlayın, sonra &quot;Kaydet&quot; üzerine tıklayın.
+ </text>
+ <text name="label">
+ Ön Ayar Adı:
+ </text>
+ <text name="note">
+ Not: Ön ayarınızın adını değiştirirseniz, yeni bir ön ayar oluşturursunuz ve mevcut ön ayar değişmez.
+ </text>
+ <panel name="panel_water_preset">
+ <text name="water_color_label">
+ Su Pus Rengi
+ </text>
+ <text name="water_fog_density_label">
+ Pus Yoğunluk Üssü
+ </text>
+ <text name="underwater_fog_modifier_label">
+ Sualtı Pus Değiştiricisi
+ </text>
+ <text name="BHText">
+ Büyük Dalga Yönü
+ </text>
+ <slider label="X" name="WaterWave1DirX"/>
+ <slider label="Y" name="WaterWave1DirY"/>
+ <text name="BDensText">
+ Yansıma Dalgacığı Ölçeği
+ </text>
+ <text name="HDText">
+ Fresnel Ölçeği
+ </text>
+ <text name="FresnelOffsetText">
+ Fresnel Dengeleyicisi
+ </text>
+ <text name="BHText2">
+ Küçük Dalga Yönü
+ </text>
+ <slider label="X" name="WaterWave2DirX"/>
+ <slider label="Y" name="WaterWave2DirY"/>
+ <text name="DensMultText">
+ Yukarıdan Kırılma Ölçeği
+ </text>
+ <text name="WaterScaleBelowText">
+ Aşağıdan Kırılma Ölçeği
+ </text>
+ <text name="MaxAltText">
+ Bulanıklaştırma Çarpanı
+ </text>
+ <text name="BHText3">
+ Normal Harita
+ </text>
+ </panel>
+ <check_box label="Bu ön ayarı yeni su ayarım yap" name="make_default_cb"/>
+ <button label="Kaydet" name="save"/>
+ <button label="Ä°ptal" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_env_settings.xml b/indra/newview/skins/default/xui/tr/floater_env_settings.xml
new file mode 100644
index 0000000000..d53629f6fe
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_env_settings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Environment Editor Floater" title="ÇEVRE DÜZENLEYİCİ">
+ <floater.string name="timeStr">
+ [hour12,datetime,utc]:[min,datetime,utc] [ampm,datetime,utc]
+ </floater.string>
+ <text name="EnvTimeText">
+ Günün Saati
+ </text>
+ <text name="EnvTimeText2">
+ 12:00 PM
+ </text>
+ <text name="EnvCloudText">
+ Bulut Örtüsü
+ </text>
+ <text name="EnvWaterColorText">
+ Su Rengi
+ </text>
+ <color_swatch name="EnvWaterColor" tool_tip="Renk seçiciyi açmak için tıklayın"/>
+ <text name="EnvWaterFogText">
+ Su Sisi
+ </text>
+ <button label="Gayrimenkul Saati Kullan" name="EnvUseEstateTimeButton"/>
+ <button label="Gelişmiş Gökyüzü" name="EnvAdvancedSkyButton"/>
+ <button label="GeliÅŸmiÅŸ Su" name="EnvAdvancedWaterButton"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_environment_settings.xml b/indra/newview/skins/default/xui/tr/floater_environment_settings.xml
new file mode 100644
index 0000000000..e702da7e1b
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_environment_settings.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Environment Editor Floater" title="ORTAM AYARLARI">
+ <text name="note">
+ Görüntüleyiciniz için ortam ayarlarını özelleştirmek isterseniz aşağıdaki seçenekleri kullanın.
+ </text>
+ <radio_group name="region_settings_radio_group">
+ <radio_item label="Bölge ayarlarını kullanın" name="use_region_settings"/>
+ <radio_item label="Ortamımı özelleştir" name="use_my_settings"/>
+ </radio_group>
+ <panel name="user_environment_settings">
+ <text name="note">
+ Not: Özel ayarlarınız diğer kullanıcılar tarafından görülmez.
+ </text>
+ <text name="water_settings_title">
+ Su Ayarı
+ </text>
+ <combo_box name="water_settings_preset_combo">
+ <combo_box.item label="-Bir ön ayar seçin-" name="item0"/>
+ </combo_box>
+ <text name="sky_dayc_settings_title">
+ Gökyüzü/Gün Dön.
+ </text>
+ <radio_group name="sky_dayc_settings_radio_group">
+ <radio_item label="Sabit gökyüzü" name="my_sky_settings"/>
+ <radio_item label="Gün döngüsü" name="my_dayc_settings"/>
+ </radio_group>
+ <combo_box name="sky_settings_preset_combo">
+ <combo_box.item label="-Bir ön ayar seçin-" name="item0"/>
+ </combo_box>
+ <combo_box name="dayc_settings_preset_combo">
+ <combo_box.item label="-Bir ön ayar seçin-" name="item0"/>
+ </combo_box>
+ </panel>
+ <button label="Tamam" name="ok_btn"/>
+ <button label="Ä°ptal" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_event.xml b/indra/newview/skins/default/xui/tr/floater_event.xml
new file mode 100644
index 0000000000..60dece124b
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_event.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater label="Etkinlik" name="Event" title="ETKÄ°NLÄ°K AYRINTILARI">
+ <floater.string name="loading_text">
+ Yükleniyor...
+ </floater.string>
+ <floater.string name="done_text">
+ Tamamlandı
+ </floater.string>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_fast_timers.xml b/indra/newview/skins/default/xui/tr/floater_fast_timers.xml
new file mode 100644
index 0000000000..5736bda45e
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_fast_timers.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="fast_timers">
+ <string name="pause">
+ Duraklat
+ </string>
+ <string name="run">
+ KoÅŸ
+ </string>
+ <button label="Duraklat" name="pause_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_font_test.xml b/indra/newview/skins/default/xui/tr/floater_font_test.xml
new file mode 100644
index 0000000000..5371d5d2a4
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_font_test.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="contents" title="FONT TESTÄ°"/>
diff --git a/indra/newview/skins/default/xui/tr/floater_gesture.xml b/indra/newview/skins/default/xui/tr/floater_gesture.xml
new file mode 100644
index 0000000000..5f5d28ad6c
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_gesture.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater label="Yerler" name="gestures" title="MÄ°MÄ°KLER">
+ <floater.string name="loading">
+ Yükleniyor...
+ </floater.string>
+ <floater.string name="playing">
+ (Oynuyor)
+ </floater.string>
+ <floater.string name="copy_name">
+ [COPY_NAME] kopyası
+ </floater.string>
+ <scroll_list name="gesture_list">
+ <scroll_list.columns label="Ad" name="name"/>
+ <scroll_list.columns label="Sohbet" name="trigger"/>
+ <scroll_list.columns label="Anahtar" name="shortcut"/>
+ </scroll_list>
+ <panel label="bottom_panel" name="bottom_panel">
+ <menu_button name="gear_btn" tool_tip="İlave seçenekler"/>
+ <button name="new_gesture_btn" tool_tip="Yeni mimik yap"/>
+ <button name="activate_btn" tool_tip="Seçilen mimiği Etkinleştir/Devre Dışı Bırak"/>
+ <button name="del_btn" tool_tip="Bu mimiÄŸi sil"/>
+ </panel>
+ <button label="Düzenle" name="edit_btn"/>
+ <button label="Oyna" name="play_btn"/>
+ <button label="Durdur" name="stop_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_god_tools.xml b/indra/newview/skins/default/xui/tr/floater_god_tools.xml
new file mode 100644
index 0000000000..26e5ebd18b
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_god_tools.xml
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="godtools floater" title="YÖNETİCİ ARAÇLARI">
+ <tab_container name="GodTools Tabs">
+ <panel label="AÄŸ" name="grid">
+ <button label="Bu Bölgenin Harita Görünürlük Önbelleklerini Temizle" label_selected="Bu Bölgenin Harita Görünürlük Önbelleklerini Temizle" name="Flush This Region&apos;s Map Visibility Caches"/>
+ </panel>
+ <panel label="Bölge" name="region">
+ <text name="Region Name:">
+ Bölge Adı:
+ </text>
+ <check_box label="Başlangıç" name="check prelude" tool_tip="Burayı başlangıç bölgesi yapmak için ayarlayın"/>
+ <check_box label="Sabit Güneş" name="check fixed sun" tool_tip="Güneş konumunu sabitleyin (Bölge/Gayrimenkul &gt; Yüzey için olduğu gibi"/>
+ <check_box label="Işınlanınca Ana Konumu Sıfırla" name="check reset home" tool_tip="Sakin ışınlanarak gittiğinde, ana konumlarını hedef konum olarak sıfırlayın."/>
+ <check_box label="Görünür" name="check visible" tool_tip="Yönetici olmayanların bölgeyi görmesi için bunu ayarlayın"/>
+ <check_box label="Hasar" name="check damage" tool_tip="Bölgede hasara imkan tanımak için bunu ayarlayın"/>
+ <check_box label="Trafik İzlemesini Engelle" name="block dwell" tool_tip="Bölgenin trafiği hesaplamaması için bunu ayarlayın"/>
+ <check_box label="Yer Şekillendirmeyi Engelle" name="block terraform" tool_tip="Kişilerin arazilerini şekillendirmesini engellemek için bunu ayarlayın"/>
+ <check_box label="Korumalı Alan" name="is sandbox" tool_tip="Bunun bir korumalı bölge olmasını açıp/kapayın"/>
+ <button label="Yüzeyi Kaydet" label_selected="Yüzeyi Kaydet" name="Bake Terrain" tool_tip="Mevcut yüzeyi varsayılan olarak kaydet"/>
+ <button label="Yüzeyi Geri Döndür" label_selected="Yüzeyi Geri Döndür" name="Revert Terrain" tool_tip="Mevcut yüzeyin yerine varsayılanı koy"/>
+ <button label="Yüzeyi Değiştir" label_selected="Yüzeyi Değiştir" name="Swap Terrain" tool_tip="Mevcut yüzeyi varsayılanla değiştir"/>
+ <text name="estate id">
+ Gayrimenkul KimliÄŸi:
+ </text>
+ <text name="parent id">
+ Ana Kimlik:
+ </text>
+ <line_editor name="parentestate" tool_tip="Burası bu bölge için ana gayrimenkuldur."/>
+ <text name="Grid Pos: ">
+ AÄŸ Konumu:
+ </text>
+ <line_editor name="gridposx" tool_tip="Burası bu bölge için ağdaki x konumudur"/>
+ <line_editor name="gridposy" tool_tip="Burası bu bölge için ağdaki y konumudur"/>
+ <text name="Redirect to Grid: ">
+ Ağa Tekrar Yönlendir:
+ </text>
+ <text name="billable factor text">
+ Faturalanabilir Çarpan:
+ </text>
+ <text name="land cost text">
+ m² başına L$:
+ </text>
+ <button label="Yenile" label_selected="Yenile" name="Refresh" tool_tip="Yukarıdaki bilgileri yenilemek için buraya tıklayın"/>
+ <button label="Uygula" label_selected="Uygula" name="Apply" tool_tip="Yukarıdaki herhangi bir değişikliği uygulamak için buraya tıklayın"/>
+ <button label="Bölge Seç" label_selected="Bölge Seç" name="Select Region" tool_tip="Arazi aracıyla tüm bölgeyi seçin"/>
+ <button label="Şimdi otomatik kaydet" label_selected="Şimdi otomatik kaydet" name="Autosave now" tool_tip="Gzip ile sıkıştırılmış halini otomatik kaydetme dizinine kaydedin"/>
+ </panel>
+ <panel label="Nesneler" name="objects">
+ <panel.string name="no_target">
+ (hedef yok)
+ </panel.string>
+ <text name="Region Name:">
+ Bölge Adı:
+ </text>
+ <text name="region name">
+ Welsh
+ </text>
+ <check_box label="Komut Dosyalarını Devre Dışı Bırak" name="disable scripts" tool_tip="Bu bölgedeki tüm komut dosyalarını devre dışı bırakmak için bunu ayarlayın"/>
+ <check_box label="Çarpışmaları Devre Dışı Bırak" name="disable collisions" tool_tip="Bu bölgedeki aracı dışı çarpışmaları devre dışı bırakmak için bunu ayarlayın"/>
+ <check_box label="Fiziği Devre Dışı Bırak" name="disable physics" tool_tip="Bu bölgedeki tüm fiziği devre dışı bırakmak için bunu ayarlayın"/>
+ <button label="Uygula" label_selected="Uygula" name="Apply" tool_tip="Yukarıdaki herhangi bir değişikliği uygulamak için buraya tıklayın"/>
+ <button label="Hedefi Ayarla" label_selected="Hedefi Ayarla" name="Set Target" tool_tip="Nesne silinmesi için hedef avatarı ayarlayın"/>
+ <text name="target_avatar_name">
+ (hedef yok)
+ </text>
+ <button label="Başkalarının Arazilerinde Hedefin Komut Dosyalı Nesnelerini Sil" label_selected="Başkalarının Arazilerinde Hedefin Komut Dosyalı Nesnelerini Sil" name="Delete Target&apos;s Scripted Objects On Others Land" tool_tip="Hedefe ait olmayan arazide hedefe ait olan tüm komut dosyalı nesneleri silin. (kopya yok) nesneler geri döndürülür."/>
+ <button label="Hedefin *Herhangi Bir* Arazideki Komut Dosyalı Nesnelerini Sil" label_selected="Hedefin *Herhangi Bir* Arazideki Komut Dosyalı Nesnelerini Sil" name="Delete Target&apos;s Scripted Objects On *Any* Land" tool_tip="Bu bölgede hedefe ait olan tüm komut dosyalı nesneleri silin. (kopya yok) nesneler geri döndürülür."/>
+ <button label="Hedefin *TÜM* Nesnelerini Sil" label_selected="Hedefin *TÜM* Nesnelerini Sil" name="Delete *ALL* Of Target&apos;s Objects" tool_tip="Bu bölgede hedefe ait olan tüm nesneleri silin. (kopya yok) nesneler geri döndürülür."/>
+ <button label="En Çok Çarpışanlar" label_selected="En Çok Çarpışanlar" name="Get Top Colliders" tool_tip="En dar fazda geri aramaları yaşayan nesnelerin listesini alır"/>
+ <button label="En Çok Komut Dsy. Çalştr." label_selected="En Çok Komut Dsy. Çalştr." name="Get Top Scripts" tool_tip="Komut dosyalarını çalıştırırken en çok zaman harcayan nesnelerin listesini alır"/>
+ <button label="Komut dosyaları özeti" label_selected="Komut dosyaları özeti" name="Scripts digest" tool_tip="Tüm komut dosyalarının ve her birinin ne kadar kullanıldığının listesini alır"/>
+ </panel>
+ <panel label="Talep" name="request">
+ <text name="Destination:">
+ Hedef Konum:
+ </text>
+ <combo_box name="destination">
+ <combo_box.item label="Seçim" name="item1"/>
+ <combo_box.item label="Aracı Bölgesi" name="item2"/>
+ </combo_box>
+ <text name="Request:">
+ Talep:
+ </text>
+ <combo_box name="request">
+ <combo_box.item label="çarpışanlar &lt;adımlar&gt;" name="item1"/>
+ <combo_box.item label="komut dosyaları &lt;sayım&gt;,&lt;opsiyonel desen&gt;" name="item2"/>
+ <combo_box.item label="nesneler &lt;desen&gt;" name="item3"/>
+ <combo_box.item label="&lt;asset_id&gt; oluÅŸtur" name="item4"/>
+ </combo_box>
+ <text name="Parameter:">
+ Parametre:
+ </text>
+ <button label="Talepte Bulun" label_selected="Talepte Bulun" name="Make Request"/>
+ </panel>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_hardware_settings.xml b/indra/newview/skins/default/xui/tr/floater_hardware_settings.xml
new file mode 100644
index 0000000000..8e056b9b0d
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_hardware_settings.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Hardware Settings Floater" title="DONANIM AYARLARI">
+ <text name="Filtering:">
+ Filtreleme:
+ </text>
+ <check_box label="Anisotropik Filtreleme (etkinken daha yavaÅŸ)" name="ani"/>
+ <text name="antialiasing label">
+ Düzgünleştirme:
+ </text>
+ <combo_box label="Antialiasing" name="fsaa">
+ <combo_box.item label="Devre dışı" name="FSAADisabled"/>
+ <combo_box.item label="2x" name="2x"/>
+ <combo_box.item label="4x" name="4x"/>
+ <combo_box.item label="8x" name="8x"/>
+ <combo_box.item label="16x" name="16x"/>
+ </combo_box>
+ <text name="antialiasing restart">
+ (görüntülemeyi eniden başlatma gerekir)
+ </text>
+ <spinner label="Gama:" name="gamma"/>
+ <text name="(brightness, lower is brighter)">
+ (0 = varsayılan parlaklık, düşük = daha parlak)
+ </text>
+ <text name="Enable VBO:">
+ VBO EtkinleÅŸtir:
+ </text>
+ <check_box initial_value="true" label="OpenGL Vertex Tampon Nesnelerini Etkinleştir" name="vbo" tool_tip="Modern donanımlarda bunun etkinleştirilmesi performans artışı sağlar. Ancak, eski donanımlardaki VBO uygulamaları yetersizdir ve etkinleştirildiğinde bilgisayarınız çökebilir."/>
+ <slider label="Doku Belleği (MB):" name="GraphicsCardTextureMemory" tool_tip="Dokular için tahsis edilecek bellek miktarı. Varsayılan değer video kartı belleğidir. Bu değerin küçültülmesi performansı artırabilir, ama ayrıca dokuları bulanıklaştırabilir."/>
+ <spinner label="Sis Mesafe Oranı:" name="fog"/>
+ <button label="Tamam" label_selected="Tamam" name="OK"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_help_browser.xml b/indra/newview/skins/default/xui/tr/floater_help_browser.xml
new file mode 100644
index 0000000000..695f838936
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_help_browser.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_help_browser" title="YARDIM TARAYICISI">
+ <floater.string name="loading_text">
+ Yükleniyor...
+ </floater.string>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_how_to.xml b/indra/newview/skins/default/xui/tr/floater_how_to.xml
new file mode 100644
index 0000000000..a42fe0b122
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_how_to.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_how_to" title="NASIL YAPILIR"/>
diff --git a/indra/newview/skins/default/xui/tr/floater_hud.xml b/indra/newview/skins/default/xui/tr/floater_hud.xml
new file mode 100644
index 0000000000..09f119bbc1
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_hud.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_hud" title="ÖĞRETİCİ"/>
diff --git a/indra/newview/skins/default/xui/tr/floater_im_container.xml b/indra/newview/skins/default/xui/tr/floater_im_container.xml
new file mode 100644
index 0000000000..4451d1d309
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_im_container.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<multi_floater name="floater_im_box" title="SOHBETLER"/>
diff --git a/indra/newview/skins/default/xui/tr/floater_im_session.xml b/indra/newview/skins/default/xui/tr/floater_im_session.xml
new file mode 100644
index 0000000000..bed08b36c6
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_im_session.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="panel_im">
+ <layout_stack name="im_panels">
+ <layout_panel>
+ <line_editor label="Kime" name="chat_editor"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_image_preview.xml b/indra/newview/skins/default/xui/tr/floater_image_preview.xml
new file mode 100644
index 0000000000..a5963bdf63
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_image_preview.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Image Preview">
+ <text name="name_label">
+ Ad:
+ </text>
+ <text name="description_label">
+ Açıklama:
+ </text>
+ <text name="preview_label">
+ Görüntüyü şu şekilde önizle:
+ </text>
+ <combo_box label="Giysi Türü" name="clothing_type_combo">
+ <item label="Görüntü" name="Image" value="Görüntü"/>
+ <item label="Saç" name="Hair" value="Saç"/>
+ <item label="Kadın Kafası" name="FemaleHead" value="Kadın Kafası"/>
+ <item label="Kadın Üst Gövde" name="FemaleUpperBody" value="Kadın Üst Gövde"/>
+ <item label="Kadın Alt Gövde" name="FemaleLowerBody" value="Kadın Alt Gövde"/>
+ <item label="Erkek Kafası" name="MaleHead" value="Erkek Kafası"/>
+ <item label="Erkek Üst Gövde" name="MaleUpperBody" value="Erkek Üst Gövde"/>
+ <item label="Erkek Alt Gövde" name="MaleLowerBody" value="Erkek Alt Gövde"/>
+ <item label="Etek" name="Skirt" value="Etek"/>
+ <item label="ÅžekillendirilmiÅŸ Prim" name="SculptedPrim" value="ÅžekillendirilmiÅŸ Prim"/>
+ </combo_box>
+ <text name="bad_image_text">
+ Görüntü okunamadı
+
+Görüntüyü 24 bit Targa .tga olarak kaydetmeyi dene.
+ </text>
+ <check_box label="Kayıpsız sıkıştırmayı kullan" name="lossless_check"/>
+ <button label="Ä°ptal" name="cancel_btn"/>
+ <button label="Karşıya Yükle (L$[AMOUNT])" name="ok_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_import_collada.xml b/indra/newview/skins/default/xui/tr/floater_import_collada.xml
new file mode 100644
index 0000000000..1e77d1b376
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_import_collada.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Import Collada" title="Sahneyi İçeri Aktar">
+ <text name="mesh count">
+ Örgüler: [COUNT]
+ </text>
+ <text name="texture count">
+ Dokular: [COUNT]
+ </text>
+ <text name="status">
+ Durum: [STATUS]
+ </text>
+ <button label="Ä°ptal" name="cancel"/>
+ <button label="Tamam" name="ok"/>
+ <string name="status_idle">
+ BoÅŸta
+ </string>
+ <string name="status_uploading">
+ [NAME] karşıya yükleniyor
+ </string>
+ <string name="status_creating">
+ [NAME] nesnesi oluÅŸturuluyor
+ </string>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_incoming_call.xml b/indra/newview/skins/default/xui/tr/floater_incoming_call.xml
new file mode 100644
index 0000000000..adb03c2dff
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_incoming_call.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="incoming call" title="Gelen arama">
+ <floater.string name="lifetime">
+ 5
+ </floater.string>
+ <floater.string name="localchat">
+ Yakındaki Sesli Sohbet
+ </floater.string>
+ <floater.string name="anonymous">
+ anonim
+ </floater.string>
+ <floater.string name="VoiceInviteP2P">
+ arıyor.
+ </floater.string>
+ <floater.string name="VoiceInviteAdHoc">
+ bir Sesli Sohbet aramasına bir konferans araması ile katıldı.
+ </floater.string>
+ <floater.string name="VoiceInviteGroup">
+ &apos;[GROUP]&apos; ses kanalına şimdi katıldı.
+ </floater.string>
+ <floater.string name="VoiceInviteQuestionGroup">
+ [CURRENT_CHAT] sohbetinden ayrılıp, &apos;[GROUP]&apos; aramasına katılmak istiyor musunuz?
+ </floater.string>
+ <floater.string name="VoiceInviteQuestionDefault">
+ [CURRENT_CHAT] sohbetinden ayrılıp, bu sesli sohbete katılmak istiyor musunuz?
+ </floater.string>
+ <text name="question">
+ [CURRENT_CHAT] sohbetinden ayrılıp, bu sesli sohbete katılmak istiyor musunuz?
+ </text>
+ <button label="Kabul Et" label_selected="Kabul Et" name="Accept"/>
+ <button label="Reddet" label_selected="Reddet" name="Reject"/>
+ <button label="AÄ° BaÅŸlat" name="Start IM"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_inspect.xml b/indra/newview/skins/default/xui/tr/floater_inspect.xml
new file mode 100644
index 0000000000..09130a31f3
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_inspect.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="inspect" title="NESNELERÄ° Ä°NCELE">
+ <floater.string name="timeStamp">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </floater.string>
+ <scroll_list name="object_list" tool_tip="SL dünyasında vurgulamak için bu listedeki bir nesneyi seçin">
+ <scroll_list.columns label="Nesne Adı" name="object_name"/>
+ <scroll_list.columns label="Sahip Adı" name="owner_name"/>
+ <scroll_list.columns label="Oluşturanın Adı" name="creator_name"/>
+ <scroll_list.columns label="OluÅŸturma Tarihi" name="creation_date"/>
+ </scroll_list>
+ <button label="Sahip Profiline Bak..." name="button owner" tool_tip="Vurgulanan nesnenin sahibinin profiline bak"/>
+ <button label="Oluşturan Profiline Bak..." name="button creator" tool_tip="Vurgulanan nesneyi ilk oluşturanın profiline bak"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_inventory.xml b/indra/newview/skins/default/xui/tr/floater_inventory.xml
new file mode 100644
index 0000000000..cfb12d4b68
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_inventory.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Inventory" title="ENVANTERÄ°M">
+ <panel label="Envanter Paneli" name="Inventory Panel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/tr/floater_inventory_item_properties.xml
new file mode 100644
index 0000000000..e49fef1f46
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_inventory_item_properties.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="item properties" title="ENVANTER ÖGESİ ÖZELLİKLERİ">
+ <floater.string name="unknown">
+ (bilinmiyor)
+ </floater.string>
+ <floater.string name="public">
+ (kamuya açık)
+ </floater.string>
+ <floater.string name="you_can">
+ Åžunu yapabilirsiniz:
+ </floater.string>
+ <floater.string name="owner_can">
+ Sahip ÅŸunu yapabilir:
+ </floater.string>
+ <floater.string name="acquiredDate">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </floater.string>
+ <text name="LabelItemNameTitle">
+ Ad:
+ </text>
+ <text name="LabelItemDescTitle">
+ Açıklama:
+ </text>
+ <text name="LabelCreatorTitle">
+ OluÅŸturan:
+ </text>
+ <button label="Profil..." name="BtnCreator"/>
+ <text name="LabelOwnerTitle">
+ Sahip:
+ </text>
+ <button label="Profil..." name="BtnOwner"/>
+ <text name="LabelAcquiredTitle">
+ Alınan:
+ </text>
+ <text name="LabelAcquiredDate">
+ 24 Mayıs Çarş 12:50:46 2006
+ </text>
+ <text name="OwnerLabel">
+ Siz:
+ </text>
+ <check_box label="Düzenle" name="CheckOwnerModify"/>
+ <check_box label="Kopyala" name="CheckOwnerCopy"/>
+ <check_box label="Tekrar Sat" name="CheckOwnerTransfer"/>
+ <text name="AnyoneLabel">
+ Herkes:
+ </text>
+ <check_box label="Kopyala" name="CheckEveryoneCopy"/>
+ <text name="GroupLabel">
+ Grup:
+ </text>
+ <check_box label="PaylaÅŸ" name="CheckShareWithGroup"/>
+ <text name="NextOwnerLabel">
+ Sonraki sahip:
+ </text>
+ <check_box label="Düzenle" name="CheckNextOwnerModify"/>
+ <check_box label="Kopyala" name="CheckNextOwnerCopy"/>
+ <check_box label="Tekrar Sat" name="CheckNextOwnerTransfer"/>
+ <check_box label="Satılık" name="CheckPurchase"/>
+ <combo_box name="combobox sale copy">
+ <combo_box.item label="Kopyala" name="Copy"/>
+ <combo_box.item label="Orijinal" name="Original"/>
+ </combo_box>
+ <spinner label="Fiyat:" name="Edit Cost"/>
+ <text name="CurrencySymbol">
+ L$
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/tr/floater_inventory_view_finder.xml
new file mode 100644
index 0000000000..9d1a556751
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_inventory_view_finder.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Inventory Finder" title="INVENTORY_RECENT_ITEMS">
+ <check_box label="Animasyon" name="check_animation"/>
+ <check_box label="Arama Kartları" name="check_calling_card"/>
+ <check_box label="Giysiler" name="check_clothing"/>
+ <check_box label="Mimikler" name="check_gesture"/>
+ <check_box label="Yer Ä°mleri" name="check_landmark"/>
+ <check_box label="Örgüler" name="check_mesh"/>
+ <check_box label="Not Kartları" name="check_notecard"/>
+ <check_box label="Nesneler" name="check_object"/>
+ <check_box label="Komut Dosyaları" name="check_script"/>
+ <check_box label="Sesler" name="check_sound"/>
+ <check_box label="Dokular" name="check_texture"/>
+ <check_box label="Anlık Görüntüler" name="check_snapshot"/>
+ <button label="Tümü" label_selected="Tümü" name="All"/>
+ <button label="Hiçbiri" label_selected="Hiçbiri" name="None"/>
+ <check_box label="Klasörleri her zaman göster" name="check_show_empty"/>
+ <check_box label="Oturum Kapandıktan Beri" name="check_since_logoff"/>
+ <text name="- OR -">
+ - VEYA -
+ </text>
+ <spinner label="Saat Önce" name="spin_hours_ago"/>
+ <spinner label="Gün Önce" name="spin_days_ago"/>
+ <button label="Kapat" label_selected="Kapat" name="Close"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_joystick.xml b/indra/newview/skins/default/xui/tr/floater_joystick.xml
new file mode 100644
index 0000000000..4a27aac3c1
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_joystick.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Joystick" title="OYUN ÇUBUĞU YAPILANDIRMA">
+ <floater.string name="NoDevice">
+ cihaz tespit edilmedi
+ </floater.string>
+ <check_box label="Oyun Çub. Etkşt:" name="enable_joystick"/>
+ <spinner label="X Eks. Haritalama" name="JoystickAxis1"/>
+ <spinner label="Y Eks. Haritalama" name="JoystickAxis2"/>
+ <spinner label="Z Eks. Haritalama" name="JoystickAxis0"/>
+ <spinner label="EÄŸim Haritalama" name="JoystickAxis4"/>
+ <spinner label="Düşey Sapma Haritalama" name="JoystickAxis5"/>
+ <spinner label="Tilt Haritalama" name="JoystickAxis3"/>
+ <spinner label="Zum Haritalama" name="JoystickAxis6"/>
+ <check_box label="DoÄŸrudan Zum" name="ZoomDirect"/>
+ <check_box label="3B İmleç" name="Cursor3D"/>
+ <check_box label="Otomatik Düzey" name="AutoLeveling"/>
+ <text name="Control Modes:">
+ Kontrol Modları:
+ </text>
+ <check_box label="Avatar" name="JoystickAvatarEnabled"/>
+ <check_box label="Ä°nÅŸa Et" name="JoystickBuildEnabled"/>
+ <check_box label="Flycam" name="JoystickFlycamEnabled"/>
+ <stat_view label="Oyun Çubuğu İzleme" name="axis_view">
+ <stat_bar label="Eksen 0" name="axis0"/>
+ <stat_bar label="Eksen 1" name="axis1"/>
+ <stat_bar label="Eksen 2" name="axis2"/>
+ <stat_bar label="Eksen 3" name="axis3"/>
+ <stat_bar label="Eksen 4" name="axis4"/>
+ <stat_bar label="Eksen 5" name="axis5"/>
+ </stat_view>
+ <text name="XScale">
+ X Ölçeği
+ </text>
+ <text name="YScale">
+ Y Ölçeği
+ </text>
+ <text name="ZScale">
+ Z Ölçeği
+ </text>
+ <text name="PitchScale">
+ Eğim Ölçeği
+ </text>
+ <text name="YawScale">
+ Düşey Sapma Ölçeği
+ </text>
+ <text name="RollScale">
+ Tilt Ölçeği
+ </text>
+ <text name="XDeadZone">
+ X Ölü Bölge
+ </text>
+ <text name="YDeadZone">
+ Y Ölü Bölge
+ </text>
+ <text name="ZDeadZone">
+ Z Ölü Bölge
+ </text>
+ <text name="PitchDeadZone">
+ Eğim Ölü Bölge
+ </text>
+ <text name="YawDeadZone">
+ Düşey Sapma Ölü Bölge
+ </text>
+ <text name="RollDeadZone">
+ Tilt Ölü Bölge
+ </text>
+ <text name="Feathering">
+ Uçlarda Rötuş
+ </text>
+ <text name="ZoomScale2">
+ Zum Ölçeği
+ </text>
+ <text name="ZoomDeadZone">
+ Zum Ölü Bölge
+ </text>
+ <button label="UzayNavigatörü Varsayılanlar" name="SpaceNavigatorDefaults"/>
+ <button label="Tamam" label_selected="Tamam" name="ok_btn"/>
+ <button label="Ä°ptal" label_selected="Ä°ptal" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_lagmeter.xml b/indra/newview/skins/default/xui/tr/floater_lagmeter.xml
new file mode 100644
index 0000000000..736c50be90
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_lagmeter.xml
@@ -0,0 +1,151 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_lagmeter" title="GECİKME ÖLÇER">
+ <floater.string name="max_title_msg">
+ Gecikme Ölçer
+ </floater.string>
+ <floater.string name="max_width_px">
+ 360
+ </floater.string>
+ <floater.string name="min_title_msg">
+ Gecikme
+ </floater.string>
+ <floater.string name="min_width_px">
+ 90
+ </floater.string>
+ <floater.string name="client_text_msg">
+ Ä°stemci
+ </floater.string>
+ <floater.string name="client_frame_rate_critical_fps">
+ 10
+ </floater.string>
+ <floater.string name="client_frame_rate_warning_fps">
+ 15
+ </floater.string>
+ <floater.string name="client_frame_time_window_bg_msg">
+ Normal, pencere alt zeminde
+ </floater.string>
+ <floater.string name="client_frame_time_critical_msg">
+ İstemci kare hızı [CLIENT_FRAME_RATE_CRITICAL] altında
+ </floater.string>
+ <floater.string name="client_frame_time_warning_msg">
+ İstemci kare hızı [CLIENT_FRAME_RATE_CRITICAL] ile [CLIENT_FRAME_RATE_WARNING] arasınad
+ </floater.string>
+ <floater.string name="client_frame_time_normal_msg">
+ Normal
+ </floater.string>
+ <floater.string name="client_draw_distance_cause_msg">
+ Muhtemel neden: Çizme mesafesi çok yüksek
+ </floater.string>
+ <floater.string name="client_texture_loading_cause_msg">
+ Muhtemel neden: Görüntüler yükleniyor
+ </floater.string>
+ <floater.string name="client_texture_memory_cause_msg">
+ Muhtemel neden: Bellekte çok fazla görüntü
+ </floater.string>
+ <floater.string name="client_complex_objects_cause_msg">
+ Muhtemel neden: Sahnede çok fazla karmaşık nesne
+ </floater.string>
+ <floater.string name="network_text_msg">
+ AÄŸ
+ </floater.string>
+ <floater.string name="network_packet_loss_critical_pct">
+ 10
+ </floater.string>
+ <floater.string name="network_packet_loss_warning_pct">
+ 5
+ </floater.string>
+ <floater.string name="network_packet_loss_critical_msg">
+ Bağlantı paketlerin % [NETWORK_PACKET_LOSS_CRITICAL]&apos;sinden fazlasını bırakıyor
+ </floater.string>
+ <floater.string name="network_packet_loss_warning_msg">
+ Bağlantı paketlerin % [NETWORK_PACKET_LOSS_WARNING]%-[NETWORK_PACKET_LOSS_CRITICAL]&apos;sini bırakıyor
+ </floater.string>
+ <floater.string name="network_performance_normal_msg">
+ Normal
+ </floater.string>
+ <floater.string name="network_ping_critical_ms">
+ 600
+ </floater.string>
+ <floater.string name="network_ping_warning_ms">
+ 300
+ </floater.string>
+ <floater.string name="network_ping_critical_msg">
+ Bağlantı ping süresi [NETWORK_PING_CRITICAL] ms.den fazla
+ </floater.string>
+ <floater.string name="network_ping_warning_msg">
+ Bağlantı ping süresi [NETWORK_PING_WARNING]-[NETWORK_PING_CRITICAL] ms
+ </floater.string>
+ <floater.string name="network_packet_loss_cause_msg">
+ Muhtemel yetersiz bağlantı veya &apos;Bant Genişliği&apos; tercihi çok yüksek.
+ </floater.string>
+ <floater.string name="network_ping_cause_msg">
+ Muhtemel yetersiz bağlantı veya dosya paylaşım uygulaması.
+ </floater.string>
+ <floater.string name="server_text_msg">
+ Sunucu
+ </floater.string>
+ <floater.string name="server_frame_rate_critical_fps">
+ 20
+ </floater.string>
+ <floater.string name="server_frame_rate_warning_fps">
+ 30
+ </floater.string>
+ <floater.string name="server_single_process_max_time_ms">
+ 20
+ </floater.string>
+ <floater.string name="server_frame_time_critical_msg">
+ Simülatör kare hızı [SERVER_FRAME_RATE_CRITICAL] altında
+ </floater.string>
+ <floater.string name="server_frame_time_warning_msg">
+ Simülatör kare hızı [SERVER_FRAME_RATE_CRITICAL] ve [SERVER_FRAME_RATE_WARNING] arasında
+ </floater.string>
+ <floater.string name="server_frame_time_normal_msg">
+ Normal
+ </floater.string>
+ <floater.string name="server_physics_cause_msg">
+ Muhtemel Neden: Çok fazla fiziki nesne
+ </floater.string>
+ <floater.string name="server_scripts_cause_msg">
+ Muhtemel Neden: Çok fazla komut dosyalı nesne
+ </floater.string>
+ <floater.string name="server_net_cause_msg">
+ Muhtemel Neden: Çok fazla ağ trafiği
+ </floater.string>
+ <floater.string name="server_agent_cause_msg">
+ Muhtemel Neden: Bölgede hareket eden çok fazla insan var
+ </floater.string>
+ <floater.string name="server_images_cause_msg">
+ Muhtemel Neden: Çok fazla görüntü hesabı
+ </floater.string>
+ <floater.string name="server_generic_cause_msg">
+ Muhtemel Neden: Simülatör yükü çok ağır
+ </floater.string>
+ <floater.string name="smaller_label">
+ &gt;&gt;
+ </floater.string>
+ <floater.string name="bigger_label">
+ &lt;&lt;
+ </floater.string>
+ <button name="client_lagmeter" tool_tip="Ä°stemci gecikme durumu"/>
+ <text name="client">
+ Ä°stemci
+ </text>
+ <text name="client_text">
+ Normal
+ </text>
+ <button name="network_lagmeter" tool_tip="AÄŸ gecikme durumu"/>
+ <text name="network">
+ AÄŸ
+ </text>
+ <text name="network_text">
+ Normal
+ </text>
+ <button name="server_lagmeter" tool_tip="Sunucu gecikme durumu"/>
+ <text name="server">
+ Sunucu
+ </text>
+ <text name="server_text">
+ Normal
+ </text>
+ <button label="&gt;&gt;" name="minimize" tool_tip="Gezdirici büyüklüğünü değiştir"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_land_holdings.xml b/indra/newview/skins/default/xui/tr/floater_land_holdings.xml
new file mode 100644
index 0000000000..a075a93c1e
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_land_holdings.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="land holdings floater" title="ARAZÄ°M">
+ <floater.string name="area_string">
+ [AREA] m²
+ </floater.string>
+ <scroll_list name="parcel list">
+ <scroll_list.columns label="Parsel" name="name"/>
+ <scroll_list.columns label="Bölge" name="location"/>
+ <scroll_list.columns label="Tür" name="type"/>
+ <scroll_list.columns label="Alan" name="area"/>
+ </scroll_list>
+ <button label="Işınla" label_selected="Işınla" name="Teleport" tool_tip="Bu arazinin merkezine ışınlama yapılsın."/>
+ <button label="Harita" label_selected="Harita" name="Show on Map" tool_tip="Bu arazi dünya haritasında gösterilsin"/>
+ <text name="contrib_label">
+ Gruplarınıza katkılar:
+ </text>
+ <scroll_list name="grant list">
+ <scroll_list.columns label="Grup" name="group"/>
+ <scroll_list.columns label="Alan" name="area"/>
+ </scroll_list>
+ <text name="allowed_label">
+ Mevcut ödeme planı kapsamında sahip olunmasına izin verilen araziler:
+ </text>
+ <text name="allowed_text">
+ [AREA] m²
+ </text>
+ <text name="current_label">
+ Åžu anda sahip olunan araziler:
+ </text>
+ <text name="current_text">
+ [AREA] m²
+ </text>
+ <text name="available_label">
+ Arazi satın alımı için kullanılabilir:
+ </text>
+ <text name="available_text">
+ [AREA] m²
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/tr/floater_live_lsleditor.xml
new file mode 100644
index 0000000000..34c3e28a0b
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_live_lsleditor.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="script ed float" title="KOMUT DOSYASI: YENÄ° KOMUT DOSYASI">
+ <floater.string name="not_allowed">
+ Bu komut dosyasını görüntüleyemez veya düzenleyemezsiniz, çünkü &quot;kopyalanamaz&quot; olarak ayarlanmıştır. Bir nesnenin içerisindeki bir komut dosyasını görüntülemek veya düzenlemek için tam izinlere ihtiyacınız var.
+ </floater.string>
+ <floater.string name="script_running">
+ Çalışıyor
+ </floater.string>
+ <floater.string name="Title">
+ KOMUT DOSYASI: [NAME]
+ </floater.string>
+ <button label="Sıfırla" label_selected="Sıfırla" name="Reset"/>
+ <check_box initial_value="true" label="Çalışıyor" name="running"/>
+ <check_box initial_value="true" label="Mono" name="mono"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_lsl_guide.xml b/indra/newview/skins/default/xui/tr/floater_lsl_guide.xml
new file mode 100644
index 0000000000..0b898d6032
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_lsl_guide.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="script ed float" title="LSL REFERANSI">
+ <check_box label="Ä°mleci izle" name="lock_check"/>
+ <combo_box label="Kilitle" name="history_combo"/>
+ <button label="Geri" name="back_btn"/>
+ <button label="Ä°leri" name="fwd_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_map.xml b/indra/newview/skins/default/xui/tr/floater_map.xml
new file mode 100644
index 0000000000..7d6c314f04
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_map.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Map" title="MÄ°NÄ°-HARÄ°TA">
+ <floater.string name="ToolTipMsg">
+ [REGION](Haritayı açmak için çift tıkla, yatay hareket için shift çek)
+ </floater.string>
+ <floater.string name="AltToolTipMsg">
+ [REGION](Işınlamak için çift tıkla, yatay hareket için shift çek)
+ </floater.string>
+ <floater.string name="mini_map_caption">
+ Mini-harita
+ </floater.string>
+ <text label="K" name="floater_map_north">
+ K
+ </text>
+ <text label="E" name="floater_map_east">
+ E
+ </text>
+ <text label="B" name="floater_map_west">
+ B
+ </text>
+ <text label="G" name="floater_map_south">
+ G
+ </text>
+ <text label="GD" name="floater_map_southeast">
+ GD
+ </text>
+ <text label="KD" name="floater_map_northeast">
+ KD
+ </text>
+ <text label="GB" name="floater_map_southwest">
+ GB
+ </text>
+ <text label="KB" name="floater_map_northwest">
+ KB
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_media_browser.xml b/indra/newview/skins/default/xui/tr/floater_media_browser.xml
new file mode 100644
index 0000000000..6cce4d59b8
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_media_browser.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_about" title="ORTAM TARAYICISI">
+ <floater.string name="home_page_url">
+ http://www.secondlife.com
+ </floater.string>
+ <floater.string name="support_page_url">
+ http://support.secondlife.com
+ </floater.string>
+ <layout_stack name="stack1">
+ <layout_panel name="nav_controls">
+ <button label="Geri" name="back"/>
+ <button label="Ä°leri" name="forward"/>
+ <button label="Yeniden Yükle" name="reload"/>
+ <button label="Git" name="go"/>
+ </layout_panel>
+ <layout_panel name="time_controls">
+ <button label="baÅŸa sar" name="rewind"/>
+ <button label="durdur" name="stop"/>
+ <button label="ileri" name="seek"/>
+ </layout_panel>
+ <layout_panel name="parcel_owner_controls">
+ <button label="Mevcut Sayfayı Parsele Gönder" name="assign"/>
+ </layout_panel>
+ <layout_panel name="external_controls">
+ <button label="Web Tarayıcımda Aç" name="open_browser"/>
+ <check_box label="Her zaman web tarayıcımda aç" name="open_always"/>
+ <button label="Kapat" name="close"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_media_settings.xml b/indra/newview/skins/default/xui/tr/floater_media_settings.xml
new file mode 100644
index 0000000000..4205a0dbef
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_media_settings.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="media_settings" title="ORTAM AYARLARI">
+ <button label="Tamam" label_selected="Tamam" name="OK"/>
+ <button label="Ä°ptal" label_selected="Ä°ptal" name="Cancel"/>
+ <button label="Uygula" label_selected="Uygula" name="Apply"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_mem_leaking.xml b/indra/newview/skins/default/xui/tr/floater_mem_leaking.xml
new file mode 100644
index 0000000000..ba87ee99a4
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_mem_leaking.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="MemLeak" title="BİR BELLEK SIZINTISI BENZETİMİNİ GERÇEKLEŞTİR">
+ <spinner label="Sızıntı Hızı (çerçeve başına bayt):" name="leak_speed"/>
+ <spinner label="Maks Sızan Bellek (MB):" name="max_leak"/>
+ <text name="total_leaked_label">
+ Geçerli sızan bellek: [SIZE] KB
+ </text>
+ <text name="note_label_1">
+ [NOTE1]
+ </text>
+ <text name="note_label_2">
+ [NOTE2]
+ </text>
+ <button label="BaÅŸla" name="start_btn"/>
+ <button label="Durdur" name="stop_btn"/>
+ <button label="Bırak" name="release_btn"/>
+ <button label="Kapat" name="close_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_merchant_outbox.xml b/indra/newview/skins/default/xui/tr/floater_merchant_outbox.xml
new file mode 100644
index 0000000000..325d1d9ed9
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_merchant_outbox.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_merchant_outbox" title="SATICI GÄ°DEN KUTUSU">
+ <string name="OutboxFolderCount1">
+ 1 klasör
+ </string>
+ <string name="OutboxFolderCountN">
+ [NUM] klasör
+ </string>
+ <string name="OutboxImporting">
+ Klasörler gönderiliyor...
+ </string>
+ <string name="OutboxInitializing">
+ Başlatılıyor...
+ </string>
+ <panel label="">
+ <panel>
+ <panel name="outbox_inventory_placeholder_panel">
+ <text name="outbox_inventory_placeholder_title">
+ Yükleniyor...
+ </text>
+ </panel>
+ </panel>
+ <panel>
+ <button label="Pazaryerine Gönder" name="outbox_import_btn" tool_tip="Pazaryeri Vitrinime Gönder"/>
+ </panel>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_model_preview.xml b/indra/newview/skins/default/xui/tr/floater_model_preview.xml
new file mode 100644
index 0000000000..0c7cabc6ea
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_model_preview.xml
@@ -0,0 +1,277 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Model Preview" title="MODELÄ° KARÅžIYA YÃœKLE">
+ <string name="status_idle"/>
+ <string name="status_parse_error">
+ Hata: Tarih ayrıştırma sorunu - ayrıntılar için günlüğe bakın.
+ </string>
+ <string name="status_material_mismatch">
+ Hata: Modelin malzemesi, referans modelin bir alt kümesi değil.
+ </string>
+ <string name="status_reading_file">
+ Yükleniyor...
+ </string>
+ <string name="status_generating_meshes">
+ Örgüler Oluşturuluyor...
+ </string>
+ <string name="status_vertex_number_overflow">
+ Hata: Köşe numarası 65534&apos;ten fazla, işlem durduruldu!
+ </string>
+ <string name="bad_element">
+ Hata: Öğe geçersiz
+ </string>
+ <string name="high">
+ Yüksek
+ </string>
+ <string name="medium">
+ Orta
+ </string>
+ <string name="low">
+ Düşük
+ </string>
+ <string name="lowest">
+ En Düşük
+ </string>
+ <string name="mesh_status_good">
+ Uygula!
+ </string>
+ <string name="mesh_status_na">
+ G/D
+ </string>
+ <string name="mesh_status_none">
+ Hiçbiri
+ </string>
+ <string name="mesh_status_submesh_mismatch">
+ Ayrıntı seviyelerinde farklı sayıda dokulanabilir yüz var.
+ </string>
+ <string name="mesh_status_mesh_mismatch">
+ Ayrıntı seviyelerinde farklı sayıda örgü örneği var.
+ </string>
+ <string name="mesh_status_too_many_vertices">
+ Ayrıntı seviyesinde fazla sayıda köşe var.
+ </string>
+ <string name="mesh_status_missing_lod">
+ Gereken ayrıntı seviyesi eksik.
+ </string>
+ <string name="mesh_status_invalid_material_list">
+ Ayrıntı seviyesi malzemeleri, referans modelin bir alt kümesi değil.
+ </string>
+ <string name="layer_all">
+ Tümü
+ </string>
+ <string name="decomposing">
+ Çözümleniyor...
+ </string>
+ <string name="simplifying">
+ BasitleÅŸtiriliyor...
+ </string>
+ <string name="tbd">
+ ileride belirlenecektir
+ </string>
+ <panel name="left_panel">
+ <panel name="model_name_representation_panel">
+ <text name="name_label">
+ Model adı:
+ </text>
+ <text name="model_category_label">
+ Bu modelin temsil ettiÄŸi...
+ </text>
+ <combo_box name="model_category_combo">
+ <combo_item label="Birini Seçin..." name="Choose one"/>
+ <combo_item label="Avatar ÅŸekli" name="Avatar shape"/>
+ <combo_item label="Avatar aksesuarı" name="Avatar attachment"/>
+ <combo_item label="Hareket eden nesne (araç, hayvan)" name="Moving object (vehicle, animal)"/>
+ <combo_item label="Bina BileÅŸeni" name="Building Component"/>
+ <combo_item label="Büyük, hareketsiz, vs." name="Large, non moving etc"/>
+ <combo_item label="Daha küçük, hareketsiz, vs." name="Smaller, non-moving etc"/>
+ <combo_item label="Bunlardan herhangi biri deÄŸil" name="Not really any of these"/>
+ </combo_box>
+ </panel>
+ <tab_container name="import_tab">
+ <panel label="Ayrıntı Seviyesi" name="lod_panel" title="Ayrıntı Seviyesi">
+ <text initial_value="Kaynak" name="source" value="Kaynak"/>
+ <text initial_value="Üçgenler" name="triangles" value="Üçgenler"/>
+ <text initial_value="Köşeler" name="vertices" value="Köşeler"/>
+ <text initial_value="Yüksek" name="high_label" value="Yüksek"/>
+ <button label="Gözat..." name="lod_browse_high"/>
+ <text initial_value="0" name="high_triangles" value="0"/>
+ <text initial_value="0" name="high_vertices" value="0"/>
+ <text initial_value="Orta" name="medium_label" value="Orta"/>
+ <button label="Gözat..." name="lod_browse_medium"/>
+ <text initial_value="0" name="medium_triangles" value="0"/>
+ <text initial_value="0" name="medium_vertices" value="0"/>
+ <text initial_value="Düşük" name="low_label" value="Düşük"/>
+ <button label="Gözat..." name="lod_browse_low"/>
+ <text initial_value="0" name="low_triangles" value="0"/>
+ <text initial_value="0" name="low_vertices" value="0"/>
+ <text initial_value="En Düşük" name="lowest_label" value="En Düşük"/>
+ <button label="Gözat..." name="lod_browse_lowest"/>
+ <text initial_value="0" name="lowest_triangles" value="0"/>
+ <text initial_value="0" name="lowest_vertices" value="0"/>
+ <check_box label="Normalleri OluÅŸtur" name="gen_normals"/>
+ <text initial_value="Kıvrım Açısı:" name="crease_label" value="Kıvrım Açısı:"/>
+ <spinner name="crease_angle" value="75"/>
+ </panel>
+ <panel label="Fizik" name="physics_panel">
+ <panel name="physics geometry">
+ <text name="first_step_name">
+ 1. Adım: Ayrıntı Seviyesi
+ </text>
+ <combo_box name="physics_lod_combo" tool_tip="Fizik şekli için kullanılacak ayrıntı">
+ <combo_item name="choose_one">
+ Birini seçin...
+ </combo_item>
+ <combo_item name="physics_high">
+ Yüksek
+ </combo_item>
+ <combo_item name="physics_medium">
+ Orta
+ </combo_item>
+ <combo_item name="physics_low">
+ Düşük
+ </combo_item>
+ <combo_item name="physics_lowest">
+ En Düşük
+ </combo_item>
+ <combo_item name="load_from_file">
+ Dosyadan
+ </combo_item>
+ </combo_box>
+ <button label="Gözat..." name="physics_browse"/>
+ </panel>
+ <panel name="physics analysis">
+ <text name="method_label">
+ 2. Adım: Çözümle
+ </text>
+ <text name="analysis_method_label">
+ Yöntem:
+ </text>
+ <text name="quality_label">
+ Kalite:
+ </text>
+ <text name="smooth_method_label">
+ Düzeltme:
+ </text>
+ <check_box label="Delikleri Kapat" name="Close Holes (Slow)"/>
+ <button label="Çözümle" name="Decompose"/>
+ <button label="Ä°ptal" name="decompose_cancel"/>
+ </panel>
+ <panel name="physics simplification">
+ <text name="second_step_label">
+ 3. Adım: Basitleştir
+ </text>
+ <text name="simp_method_header">
+ Yöntem:
+ </text>
+ <text name="pass_method_header">
+ Geçişler:
+ </text>
+ <text name="Detail Scale label">
+ Ayrıntı ölçeği:
+ </text>
+ <text name="Retain%_label">
+ Koru:
+ </text>
+ <combo_box name="Combine Quality" value="1"/>
+ <button label="BasitleÅŸtir" name="Simplify"/>
+ <button label="Ä°ptal" name="simplify_cancel"/>
+ </panel>
+ <panel name="physics info">
+ <text name="results_text">
+ Sonuçlar:
+ </text>
+ <text name="physics_triangles">
+ Üçgenler: [TRIANGLES],
+ </text>
+ <text name="physics_points">
+ Köşeler: [POINTS],
+ </text>
+ <text name="physics_hulls">
+ Gövdeler: [HULLS]
+ </text>
+ </panel>
+ </panel>
+ <panel label="Karşıya yükleme seçenekleri" name="modifiers_panel">
+ <text name="scale_label">
+ Ölçek (1=ölçekleme yok):
+ </text>
+ <spinner name="import_scale" value="1.0"/>
+ <text name="dimensions_label">
+ Boyutlar:
+ </text>
+ <text name="import_dimensions">
+ [X] X [Y] X [Z]
+ </text>
+ <check_box label="Dokuları dahil et" name="upload_textures"/>
+ <text name="include_label">
+ Sadece avatar modelleri için:
+ </text>
+ <check_box label="Dış katman ağırlığını dahil et" name="upload_skin"/>
+ <check_box label="Eklem konumlarını dahil et" name="upload_joints"/>
+ <text name="pelvis_offset_label">
+ Z kayması (avatarı kaldırmak veya indirmek için):
+ </text>
+ <spinner name="pelvis_offset" value="0.0"/>
+ </panel>
+ </tab_container>
+ <panel name="weights_and_warning_panel">
+ <button label="Ağırlıkları ve ücreti hesapla" name="calculate_btn" tool_tip="Ağırlıkları ve ücreti hesapla"/>
+ <button label="Ä°ptal" name="cancel_btn"/>
+ <button label="Karşıya Yükle" name="ok_btn" tool_tip="Simülatöre karşıya yükle"/>
+ <button label="Ayarları temizle ve formu sıfırla" name="reset_btn"/>
+ <text name="upload_fee">
+ Karşıya yükleme ücreti: L$ [FEE]
+ </text>
+ <text name="prim_weight">
+ Arazi etkisi [EQ]
+ </text>
+ <text name="download_weight">
+ Karşıdan Yükle: [ST]
+ </text>
+ <text name="physics_weight">
+ Fizik: [PH]
+ </text>
+ <text name="server_weight">
+ Sunucu: [SIM]
+ </text>
+ <text name="warning_title">
+ NOT:
+ </text>
+ <text name="warning_message">
+ Örgü modellerini karşıya yüklemeye hakkınız yok. Nasıl onaylanacağınızı [[VURL] öğrenin].
+ </text>
+ <text name="status">
+ [STATUS]
+ </text>
+ </panel>
+ </panel>
+ <text name="lod_label">
+ Önizleme:
+ </text>
+ <panel name="right_panel">
+ <combo_box name="preview_lod_combo" tool_tip="Önizleme işlemesinde görülecek ayrıntı seviyesi">
+ <combo_item name="high">
+ Yüksek
+ </combo_item>
+ <combo_item name="medium">
+ Orta
+ </combo_item>
+ <combo_item name="low">
+ Düşük
+ </combo_item>
+ <combo_item name="lowest">
+ En Düşük
+ </combo_item>
+ </combo_box>
+ <text name="label_display">
+ Ekran...
+ </text>
+ <check_box label="Kenarlar" name="show_edges"/>
+ <check_box label="Fizik" name="show_physics"/>
+ <check_box label="Dokular" name="show_textures"/>
+ <check_box label="Dış katman ağırlıkları" name="show_skin_weight"/>
+ <check_box label="Eklemler" name="show_joint_positions"/>
+ <text name="physics_explode_label">
+ Önizleme Yayılımı:
+ </text>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_moveview.xml b/indra/newview/skins/default/xui/tr/floater_moveview.xml
new file mode 100644
index 0000000000..9226218a24
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_moveview.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="move_floater" title="YÜRÜ / KOŞ / UÇ">
+ <string name="walk_forward_tooltip">
+ İleri Yürü (Yukarı Okuna veya W&apos;ye basın)
+ </string>
+ <string name="walk_back_tooltip">
+ Geri Yürü (Aşağı Okuna veya S&apos;ye basın)
+ </string>
+ <string name="walk_left_tooltip">
+ Sola Yürü (Shift + Sol Oka veya A&apos;ya basın)
+ </string>
+ <string name="walk_right_tooltip">
+ Sağa Yürü (Shift + Sağ Oka veya D&apos;ye basın)
+ </string>
+ <string name="run_forward_tooltip">
+ İleri Koş (Yukarı Okuna veya W&apos;ye basın)
+ </string>
+ <string name="run_back_tooltip">
+ Geri Koş (Aşağı Okuna veya S&apos;ye basın)
+ </string>
+ <string name="run_left_tooltip">
+ Sola Koş (Shift + Sol Oka veya A&apos;ya basın)
+ </string>
+ <string name="run_right_tooltip">
+ Sağa Koş (Shift + Sağ Oka veya D&apos;ye basın)
+ </string>
+ <string name="fly_forward_tooltip">
+ İleri Uç (Yukarı Okuna veya W&apos;ye basın)
+ </string>
+ <string name="fly_back_tooltip">
+ Geri Uç (Aşağı Okuna veya S&apos;ye basın)
+ </string>
+ <string name="fly_left_tooltip">
+ Sola Uç (Shift + Sol Oka veya A&apos;ya basın)
+ </string>
+ <string name="fly_right_tooltip">
+ Sağa Uç (Shift + Sağ Oka veya D&apos;ye basın)
+ </string>
+ <string name="fly_up_tooltip">
+ Yukarı Uç (E&apos;ye basın)
+ </string>
+ <string name="fly_down_tooltip">
+ Aşağı Uç (C&apos;ye basın)
+ </string>
+ <string name="jump_tooltip">
+ Atla (E&apos;ye basın)
+ </string>
+ <string name="crouch_tooltip">
+ Çömel (C&apos;ye basın)
+ </string>
+ <string name="walk_title">
+ Yürü
+ </string>
+ <string name="run_title">
+ KoÅŸ
+ </string>
+ <string name="fly_title">
+ Uç
+ </string>
+ <panel name="panel_actions">
+ <button name="turn left btn" tool_tip="Sola Dön (Sol Oka veya A&apos;ya basın)"/>
+ <joystick_slide name="move left btn" tool_tip="Sola Yürü (Shift + Sol Oka veya A&apos;ya basın)"/>
+ <button name="turn right btn" tool_tip="Sağa Dön (Sağ Oka veya D&apos;ye basın)"/>
+ <joystick_slide name="move right btn" tool_tip="Sağa Yürü (Shift + Sağ Oka veya D&apos;ye basın)"/>
+ <joystick_turn name="forward btn" tool_tip="İleri Yürü (Yukarı Okuna veya W&apos;ye basın)"/>
+ <joystick_turn name="backward btn" tool_tip="Geri Yürü (Aşağı Okuna veya S&apos;ye basın)"/>
+ <button name="move up btn" tool_tip="Yukarı Uç (E&apos;ye basın)"/>
+ <button name="move down btn" tool_tip="Aşağı Uç (C&apos;ye basın)"/>
+ </panel>
+ <panel name="panel_modes">
+ <button label="" name="mode_walk_btn" tool_tip="Yürüme modu"/>
+ <button label="" name="mode_run_btn" tool_tip="KoÅŸma modu"/>
+ <button label="" name="mode_fly_btn" tool_tip="Uçma modu"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_mute_object.xml b/indra/newview/skins/default/xui/tr/floater_mute_object.xml
new file mode 100644
index 0000000000..becad38a8e
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_mute_object.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="block by name" title="NESNEYİ ADINA GÖRE ENGELLE">
+ <text name="message">
+ Bir nesneyi engelle
+ </text>
+ <line_editor name="object_name">
+ Nesne adı
+ </line_editor>
+ <text name="note">
+ * Sadece nesne metnini engeller, sesleri engellemez
+ </text>
+ <button label="Tamam" name="OK"/>
+ <button label="Ä°ptal" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_my_appearance.xml b/indra/newview/skins/default/xui/tr/floater_my_appearance.xml
new file mode 100644
index 0000000000..4d71187a1f
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_my_appearance.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_my_appearance" title="GÖRÜNÜM">
+ <panel label="Görünümü Düzenle" name="main_panel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_my_inventory.xml b/indra/newview/skins/default/xui/tr/floater_my_inventory.xml
new file mode 100644
index 0000000000..8c62692a88
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_my_inventory.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_my_inventory" title="ENVANTER"/>
diff --git a/indra/newview/skins/default/xui/tr/floater_nearby_chat.xml b/indra/newview/skins/default/xui/tr/floater_nearby_chat.xml
new file mode 100644
index 0000000000..6b12ad0ef5
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_nearby_chat.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="nearby_chat" title="YAKINDAKÄ° SOHBET">
+ <check_box label="Sohbeti çevir" name="translate_chat_checkbox"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_notification.xml b/indra/newview/skins/default/xui/tr/floater_notification.xml
new file mode 100644
index 0000000000..89a56348f6
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_notification.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="notification" title="BÄ°LDÄ°RÄ°MLER KONSOLU">
+ <text_editor name="payload">
+ Yükleniyor...
+ </text_editor>
+ <combo_box label="Yanıt" name="response"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_notifications_console.xml b/indra/newview/skins/default/xui/tr/floater_notifications_console.xml
new file mode 100644
index 0000000000..e4eaf2cf9e
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_notifications_console.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="notifications_console" title="BÄ°LDÄ°RÄ°MLER KONSOLU">
+ <combo_box label="Bildirim türünü seç" name="notification_types"/>
+ <button label="Ekle" name="add_notification"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_object_weights.xml b/indra/newview/skins/default/xui/tr/floater_object_weights.xml
new file mode 100644
index 0000000000..b57943f666
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_object_weights.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="object_weights" title="GELÄ°ÅžMÄ°Åž">
+ <floater.string name="nothing_selected" value="--"/>
+ <text name="selected_text" value="SEÇİLİ"/>
+ <text name="objects" value="--"/>
+ <text name="objects_label" value="Nesneler"/>
+ <text name="prims" value="--"/>
+ <text name="prims_label" value="Primler"/>
+ <text name="weights_of_selected_text" value="SEÇİLENLERİN AĞIRLIKLARI"/>
+ <text name="download" value="--"/>
+ <text name="download_label" value="Karşıdan yükle"/>
+ <text name="physics" value="--"/>
+ <text name="physics_label" value="Fizik"/>
+ <text name="server" value="--"/>
+ <text name="server_label" value="Sunucu"/>
+ <text name="display" value="--"/>
+ <text name="display_label" value="Ekran"/>
+ <text name="land_impacts_text" value="ARAZÄ° ETKÄ°LERÄ°"/>
+ <text name="selected" value="--"/>
+ <text name="selected_label" value="Seçili"/>
+ <text name="rezzed_on_land" value="--"/>
+ <text name="rezzed_on_land_label" value="Arazide oluÅŸturulmuÅŸ"/>
+ <text name="remaining_capacity" value="--"/>
+ <text name="remaining_capacity_label" value="Kalan kapasite"/>
+ <text name="total_capacity" value="--"/>
+ <text name="total_capacity_label" value="Toplam kapasite"/>
+ <text name="help_SLURL" value="[secondlife:///app/help/object_weights Bunların tümü ne?...]"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_openobject.xml b/indra/newview/skins/default/xui/tr/floater_openobject.xml
new file mode 100644
index 0000000000..9980aee97f
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_openobject.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="objectcontents" title="NESNE İÇERİKLERİ">
+ <text name="object_name">
+ [DESC]:
+ </text>
+ <button label="Envantere Kopyala" label_selected="Envantere Kopyala" name="copy_to_inventory_button"/>
+ <button label="Kopyala ve Giy" label_selected="Kopyala ve Giy" name="copy_and_wear_button"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_outfit_save_as.xml b/indra/newview/skins/default/xui/tr/floater_outfit_save_as.xml
new file mode 100644
index 0000000000..7a9f507c93
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_outfit_save_as.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="modal container" title="DIŞ GÖRÜNÜMÜ KAYDET">
+ <button label="Kaydet" label_selected="Kaydet" name="Save"/>
+ <button label="Ä°ptal" label_selected="Ä°ptal" name="Cancel"/>
+ <text name="Save item as:">
+ Ãœzerimdekileri yeni bir
+Dış Görünüm olarak kaydet:
+ </text>
+ <line_editor name="name ed">
+ [DESC] (yeni)
+ </line_editor>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_outgoing_call.xml b/indra/newview/skins/default/xui/tr/floater_outgoing_call.xml
new file mode 100644
index 0000000000..7ba4580f4f
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_outgoing_call.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="outgoing call" title="ARIYOR">
+ <floater.string name="lifetime">
+ 5
+ </floater.string>
+ <floater.string name="localchat">
+ Yakındaki Sesli Sohbet
+ </floater.string>
+ <floater.string name="anonymous">
+ anonim
+ </floater.string>
+ <floater.string name="VoiceInviteP2P">
+ arıyor.
+ </floater.string>
+ <floater.string name="VoiceInviteAdHoc">
+ bir Sesli Sohbet aramasına bir konferans araması ile katıldı.
+ </floater.string>
+ <text name="connecting">
+ [CALLEE_NAME] bağlanıyor
+ </text>
+ <text name="calling">
+ [CALLEE_NAME] aranıyor
+ </text>
+ <text name="noanswer">
+ Cevap Yok. Lütfen daha sonra tekrar deneyin.
+ </text>
+ <text name="nearby">
+ [VOICE_CHANNEL_NAME] ile bağlantınız kesildi. [RECONNECT_NEARBY]
+ </text>
+ <text name="nearby_P2P_by_other">
+ Aramanız bitti. [RECONNECT_NEARBY]
+ </text>
+ <text name="nearby_P2P_by_agent">
+ Aramayı bitirdiniz. [RECONNECT_NEARBY]
+ </text>
+ <text name="leaving">
+ [CURRENT_CHAT] bırakılıyor.
+ </text>
+ <button label="Ä°ptal" label_selected="Ä°ptal" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_pay.xml b/indra/newview/skins/default/xui/tr/floater_pay.xml
new file mode 100644
index 0000000000..6604e5c37a
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_pay.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Give Money">
+ <string name="payee_group">
+ Gruba Öde
+ </string>
+ <string name="payee_resident">
+ Sakine Öde
+ </string>
+ <text name="payee_name">
+ Kırpmayı Kontrol İçin Test Adı Çok Uzun
+ </text>
+ <button label="L$1" label_selected="L$1" name="fastpay 1"/>
+ <button label="L$5" label_selected="L$5" name="fastpay 5"/>
+ <button label="L$10" label_selected="L$10" name="fastpay 10"/>
+ <button label="L$20" label_selected="L$20" name="fastpay 20"/>
+ <text name="amount text">
+ veya tutarı seç:
+ </text>
+ <button label="Öde" label_selected="Öde" name="pay btn"/>
+ <button label="Ä°ptal" label_selected="Ä°ptal" name="cancel btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_pay_object.xml b/indra/newview/skins/default/xui/tr/floater_pay_object.xml
new file mode 100644
index 0000000000..7772d3b101
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_pay_object.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Give Money">
+ <string name="payee_group">
+ Gruba Öde
+ </string>
+ <string name="payee_resident">
+ Sakine Öde
+ </string>
+ <text name="payee_name">
+ Ericacita Moostopolison
+ </text>
+ <text name="object_name_label">
+ Nesne yoluyla:
+ </text>
+ <icon name="icon_object" tool_tip="Nesneler"/>
+ <text name="object_name_text">
+ Harika nesnem gerçekten uzun bir adla
+ </text>
+ <button label="L$1" label_selected="L$1" name="fastpay 1"/>
+ <button label="L$5" label_selected="L$5" name="fastpay 5"/>
+ <button label="L$10" label_selected="L$10" name="fastpay 10"/>
+ <button label="L$20" label_selected="L$20" name="fastpay 20"/>
+ <text name="amount text">
+ veya tutarı seç:
+ </text>
+ <button label="Öde" label_selected="Öde" name="pay btn"/>
+ <button label="Ä°ptal" label_selected="Ä°ptal" name="cancel btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_people.xml b/indra/newview/skins/default/xui/tr/floater_people.xml
new file mode 100644
index 0000000000..94a27bff57
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_people.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_people" title="KİŞİLER">
+ <panel_container name="main_panel">
+ <panel label="Grup Profili" name="panel_group_info_sidetray"/>
+ <panel label="EngellenmiÅŸ Sakinler ve Nesneler" name="panel_block_list_sidetray"/>
+ </panel_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_perm_prefs.xml b/indra/newview/skins/default/xui/tr/floater_perm_prefs.xml
new file mode 100644
index 0000000000..669b833c26
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_perm_prefs.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="perm prefs" title="VARSAYILAN KARÅžIYA YÃœKLEME Ä°ZÄ°NLERÄ°">
+ <panel label="Ä°zinler" name="permissions">
+ <check_box label="Grupla paylaÅŸ" name="share_with_group"/>
+ <check_box label="Herkese kopyalama izni ver" name="everyone_copy"/>
+ <text name="NextOwnerLabel">
+ Sonraki sahip ÅŸunu yapabilir:
+ </text>
+ <check_box label="DeÄŸiÅŸtir" name="next_owner_modify"/>
+ <check_box label="Kopyala" name="next_owner_copy"/>
+ <check_box initial_value="true" label="Tekrar sat/Ver" name="next_owner_transfer"/>
+ </panel>
+ <button label="Tamam" label_selected="Tamam" name="ok"/>
+ <button label="Ä°ptal" label_selected="Ä°ptal" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_picks.xml b/indra/newview/skins/default/xui/tr/floater_picks.xml
new file mode 100644
index 0000000000..513a2e319a
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_picks.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_picks" title="Seçmeler"/>
diff --git a/indra/newview/skins/default/xui/tr/floater_places.xml b/indra/newview/skins/default/xui/tr/floater_places.xml
new file mode 100644
index 0000000000..4e09a699f6
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_places.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_places" title="YERLER">
+ <panel label="Yerler" name="main_panel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_post_process.xml b/indra/newview/skins/default/xui/tr/floater_post_process.xml
new file mode 100644
index 0000000000..5e419f8ffa
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_post_process.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Post-Process Floater" title="Ä°ÅžLEM SONRASI AYARLARI">
+ <tab_container name="Post-Process Tabs">
+ <panel label="Renk Filtresi" name="wmiColorFilterPanel">
+ <check_box label="EtkinleÅŸtir" name="wmiColorFilterToggle"/>
+ <text name="wmiColorFilterBrightnessText">
+ Parlaklık
+ </text>
+ <text name="wmiColorFilterSaturationText">
+ Doygunluk
+ </text>
+ <text name="wmiColorFilterContrastText">
+ Kontrast
+ </text>
+ <text name="wmiColorFilterBaseText">
+ Kontrast Baz Rengi
+ </text>
+ <slider label="R" name="wmiColorFilterBaseR"/>
+ <slider label="G" name="wmiColorFilterBaseG"/>
+ <slider label="B" name="wmiColorFilterBaseB"/>
+ <slider label="I" name="wmiColorFilterBaseI"/>
+ </panel>
+ <panel label="Gece Görüşü" name="wmiNightVisionPanel">
+ <check_box label="EtkinleÅŸtir" name="wmiNightVisionToggle"/>
+ <text name="wmiNightVisionBrightMultText">
+ Işık Yükseltme Çarpanı
+ </text>
+ <text name="wmiNightVisionNoiseSizeText">
+ Gürültü Büyüklüğü
+ </text>
+ <text name="wmiNightVisionNoiseStrengthText">
+ Gürültü Gücü
+ </text>
+ </panel>
+ <panel label="Işıma" name="wmiBloomPanel">
+ <check_box label="EtkinleÅŸtir" name="wmiBloomToggle"/>
+ <text name="wmiBloomExtractText">
+ Parlaklık Çıkarma
+ </text>
+ <text name="wmiBloomSizeText">
+ Işıma Büyüklüğü
+ </text>
+ <text name="wmiBloomStrengthText">
+ Işıma Gücü
+ </text>
+ </panel>
+ <panel label="Ekstralar" name="Extras">
+ <button label="EfektYükle" label_selected="EfektYükle" name="PPLoadEffect"/>
+ <button label="EfektKaydet" label_selected="EfektKaydet" name="PPSaveEffect"/>
+ <line_editor label="Efekt Adı" name="PPEffectNameEditor"/>
+ </panel>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_postcard.xml b/indra/newview/skins/default/xui/tr/floater_postcard.xml
new file mode 100644
index 0000000000..ef11c68afe
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_postcard.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Postcard" title="ANLIK GÖRÜNTÜYÜ E-POSTAYLA GÖNDER">
+ <floater.string name="default_subject">
+ SECOND_LIFE]&apos;dan posta kartı.
+ </floater.string>
+ <floater.string name="default_message">
+ Buna bakın!
+ </floater.string>
+ <floater.string name="upload_message">
+ Gönderiyor...
+ </floater.string>
+ <text name="to_label">
+ Alıcının E-postası:
+ </text>
+ <text name="from_label">
+ E-postanız:
+ </text>
+ <text name="name_label">
+ Adınız:
+ </text>
+ <text name="subject_label">
+ Konu:
+ </text>
+ <line_editor label="Konunuzu buraya yazın." name="subject_form"/>
+ <text name="msg_label">
+ Ä°leti:
+ </text>
+ <text_editor name="msg_form">
+ İletinizi buraya yazın.
+ </text_editor>
+ <button label="Ä°ptal" name="cancel_btn"/>
+ <button label="Gönder" name="send_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_preferences.xml b/indra/newview/skins/default/xui/tr/floater_preferences.xml
new file mode 100644
index 0000000000..edb3c19b81
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_preferences.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Preferences" title="TERCÄ°HLER">
+ <button label="Tamam" label_selected="Tamam" name="OK"/>
+ <button label="Ä°ptal" label_selected="Ä°ptal" name="Cancel"/>
+ <tab_container name="pref core">
+ <panel label="Genel" name="general"/>
+ <panel label="Grafikler" name="display"/>
+ <panel label="Ses ve Ortamlar" name="audio"/>
+ <panel label="Sohbet" name="chat"/>
+ <panel label="Hareket ve Görünümler" name="move"/>
+ <panel label="Bildirimler" name="msgs"/>
+ <panel label="Renkler" name="colors"/>
+ <panel label="Gizlilik" name="im"/>
+ <panel label="Ayarlar" name="input"/>
+ <panel label="GeliÅŸmiÅŸ" name="advanced1"/>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_preferences_proxy.xml b/indra/newview/skins/default/xui/tr/floater_preferences_proxy.xml
new file mode 100644
index 0000000000..1c462e6ebf
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_preferences_proxy.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Proxy Settings Floater" title="Proxy Ayarları">
+ <check_box initial_value="false" label="Web sayfaları için HTTP Proxy kullan" name="web_proxy_enabled"/>
+ <text name="http_proxy_label">
+ HTTP Proxy:
+ </text>
+ <line_editor name="web_proxy_editor" tool_tip="Kullanmak istediğiniz HTTP proxy&apos;nin DNS adı veya IP adresi."/>
+ <spinner label="Port numarası:" name="web_proxy_port" tool_tip="Kullanmak istediğiniz HTTP proxy&apos;nin portu."/>
+ <check_box label="UDP trafiği için SOCKS 5 Proxy kullan" name="socks_proxy_enabled"/>
+ <text name="socks5_proxy_label">
+ SOCKS 5 Proxy:
+ </text>
+ <line_editor name="socks_proxy_editor" tool_tip="Kullanmak istediğiniz SOCKS 5 proxy&apos;nin DNS adı veya IP adresi."/>
+ <spinner label="Port numarası:" name="socks_proxy_port" tool_tip="Kullanmak istediğiniz SOCKS 5 proxy&apos;nin portu."/>
+ <text name="socks_auth_label">
+ SOCKS Kimlik DoÄŸrulama:
+ </text>
+ <radio_group name="socks5_auth_type">
+ <radio_item label="Kimlik Doğrulama Yok" name="Socks5NoAuth" tool_tip="Socks5 proxy&apos;si kimlik doğrulama gerektirmiyor." value="Hiçbiri"/>
+ <radio_item label="Kullanıcı Adı/Parola" name="Socks5UserPass" tool_tip="Socks5 proxy&apos;si kullanıcı adı/parola doğrulaması gerektiriyor." value="UserPass"/>
+ </radio_group>
+ <text name="socks5_username_label">
+ Kullanıcı Adı:
+ </text>
+ <text name="socks5_password_label">
+ Parola:
+ </text>
+ <line_editor name="socks5_username" tool_tip="SOCKS 5 sunucunuzda kimlik doğrulaması yapmak için kullanılan kullanıcı adı"/>
+ <line_editor name="socks5_password" tool_tip="SOCKS 5 sunucunuzda kimlik doğrulaması yapmak için kullanılan parola"/>
+ <text name="other_proxy_label">
+ DiÄŸer HTTP trafiÄŸi proxy&apos;si:
+ </text>
+ <radio_group name="other_http_proxy_type">
+ <radio_item label="Proxy kullanılmasın" name="OtherNoProxy" tool_tip="Web dışı HTTP trafiği herhangi bir proxy&apos;ye gönderilmez." value="Hiçbiri"/>
+ <radio_item label="HTTP Proxy&apos;si kullan" name="OtherHTTPProxy" tool_tip="Web dışı HTTP trafiği yapılandırılmış web proxy&apos;si üzerinden gönderilir." value="Web"/>
+ <radio_item label="SOCKS 5 Proxy&apos;si kullan" name="OtherSocksProxy" tool_tip="Web dışı HTTP trafiği yapılandırılmış Socks 5 proxy&apos;si üzerinden gönderilir." value="Socks"/>
+ </radio_group>
+ <button label="Tamam" label_selected="Tamam" name="OK"/>
+ <button label="Ä°ptal" label_selected="Ä°ptal" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_preview_animation.xml b/indra/newview/skins/default/xui/tr/floater_preview_animation.xml
new file mode 100644
index 0000000000..23b4848333
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_preview_animation.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="preview_anim">
+ <floater.string name="Title">
+ Animasyon: [NAME]
+ </floater.string>
+ <text name="desc txt">
+ Açıklama:
+ </text>
+ <button label="SL Dünyasında Oynat" label_selected="Durdur" name="Inworld" tool_tip="Bu animasyonu başkaları görebilecek şekilde oynatın"/>
+ <button label="Yerel Olarak Oynat" label_selected="Durdur" name="Locally" tool_tip="Bu animasyonu sadece kendinizin görebileceği şekilde oynatın"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_preview_gesture.xml b/indra/newview/skins/default/xui/tr/floater_preview_gesture.xml
new file mode 100644
index 0000000000..dc6f66f657
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_preview_gesture.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="gesture_preview">
+ <floater.string name="step_anim">
+ Oynatılacak animasyon:
+ </floater.string>
+ <floater.string name="step_sound">
+ Çalınacak ses:
+ </floater.string>
+ <floater.string name="step_chat">
+ KonuÅŸulacak sohbet:
+ </floater.string>
+ <floater.string name="step_wait">
+ Bekle:
+ </floater.string>
+ <floater.string name="stop_txt">
+ Durdur
+ </floater.string>
+ <floater.string name="preview_txt">
+ Önizleme
+ </floater.string>
+ <floater.string name="none_text">
+ -- Hiçbiri --
+ </floater.string>
+ <floater.string name="Title">
+ Mimik: [NAME]
+ </floater.string>
+ <text name="desc_label">
+ Açıklama:
+ </text>
+ <text name="trigger_label">
+ Tetikleyici:
+ </text>
+ <text name="replace_text" tool_tip="Tetikleyici kelimelerinin yerine bunları koyun. Örneğin, &apos;merhaba&apos; yerine &apos;naber&apos; konulması tetikleyicisi ile &quot;merhaba demek istemiştim&quot; sohbeti &quot;naber demek istemiştim olacak ve mimik gerçekleştirilecektir!">
+ Yerine ÅŸunu koy:
+ </text>
+ <line_editor name="replace_editor" tool_tip="Tetikleyici kelimelerinin yerine bunları koyun. Örneğin, &apos;merhaba&apos; yerine &apos;naber&apos; konulması tetikleyicisi ile &quot;merhaba demek istemiştim&quot; sohbeti &quot;naber demek istemiştim olacak ve mimik gerçekleştirilecektir"/>
+ <text name="key_label">
+ Kısayol Tuşu:
+ </text>
+ <combo_box label="Hiçbiri" name="modifier_combo"/>
+ <combo_box label="Hiçbiri" name="key_combo"/>
+ <text name="library_label">
+ Kütüphane:
+ </text>
+ <scroll_list name="library_list">
+ <scroll_list.rows name="action_animation" value="Animasyon"/>
+ <scroll_list.rows name="action_sound" value="Ses"/>
+ <scroll_list.rows name="action_chat" value="Sohbet"/>
+ <scroll_list.rows name="action_wait" value="Bekle"/>
+ </scroll_list>
+ <button label="Ekle &gt;&gt;" name="add_btn"/>
+ <text name="steps_label">
+ Adımlar:
+ </text>
+ <button label="Yukarı" name="up_btn"/>
+ <button label="Aşağı" name="down_btn"/>
+ <button label="Kaldır" name="delete_btn"/>
+ <text name="options_text">
+ (seçenekler)
+ </text>
+ <radio_group name="animation_trigger_type">
+ <radio_item label="BaÅŸla" name="start"/>
+ <radio_item label="Durdur" name="stop"/>
+ </radio_group>
+ <check_box label="tüm animasyonlar bitinceye kadar" name="wait_anim_check"/>
+ <check_box label="saniye olarak zaman:" name="wait_time_check"/>
+ <text name="help_label">
+ Bekleme adımları eklemediğiniz sürece tüm adımlar aynı anda gerçekleşir.
+ </text>
+ <check_box label="Etkin" name="active_check" tool_tip="Etkin mimikleri tetiklemek için tetikleme fazları için sohbet gerçekleştirebilir veya kısayol tuşlarına basabilirsiniz. Bir anahtar bağlama ihtilafı olduğunda mimikler genellikle inaktif hale geçer."/>
+ <button label="Önizleme" name="preview_btn"/>
+ <button label="Kaydet" name="save_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_preview_notecard.xml b/indra/newview/skins/default/xui/tr/floater_preview_notecard.xml
new file mode 100644
index 0000000000..23391249d1
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_preview_notecard.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="preview notecard" title="NOT KARTI:">
+ <floater.string name="no_object">
+ Bu not kartını içeren nesne bulunamadı.
+ </floater.string>
+ <floater.string name="not_allowed">
+ Bu not kartını görüntüleme izniniz yok.
+ </floater.string>
+ <floater.string name="Title">
+ Not Kartı: [NAME]
+ </floater.string>
+ <text name="desc txt">
+ Açıklama:
+ </text>
+ <text_editor name="Notecard Editor">
+ Yükleniyor...
+ </text_editor>
+ <button label="Kaydet" label_selected="Kaydet" name="Save"/>
+ <button label="Sil" label_selected="Sil" name="Delete"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_preview_sound.xml b/indra/newview/skins/default/xui/tr/floater_preview_sound.xml
new file mode 100644
index 0000000000..50874f024a
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_preview_sound.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="preview_sound">
+ <floater.string name="Title">
+ Ses: [NAME]
+ </floater.string>
+ <text name="desc txt">
+ Açıklama:
+ </text>
+ <button label="SL Dünyasında Oynat" label_selected="SL Dünyasında Oynat" name="Sound play btn" tool_tip="Bu ses başkaların işitebileceği bir şekilde çalınsın"/>
+ <button label="Yerel Olarak Oynat" label_selected="Yerel Olarak Oynat" name="Sound audition btn" tool_tip="Bu ses sadece sizin işitebileceğiniz bir şekilde çalınsın"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_preview_texture.xml b/indra/newview/skins/default/xui/tr/floater_preview_texture.xml
new file mode 100644
index 0000000000..79e184130a
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_preview_texture.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="preview_texture">
+ <floater.string name="Title">
+ Doku: [NAME]
+ </floater.string>
+ <floater.string name="Copy">
+ Envantere Kopyala
+ </floater.string>
+ <text name="desc txt">
+ Açıklama:
+ </text>
+ <text name="dimensions">
+ [WIDTH]px x [HEIGHT]px
+ </text>
+ <text name="aspect_ratio">
+ En boy oranını önizle
+ </text>
+ <combo_box name="combo_aspect_ratio" tool_tip="Sabit en boy oranında önizle">
+ <combo_item name="Unconstrained">
+ Kısıtsız
+ </combo_item>
+ <combo_item name="1:1" tool_tip="Grup iÅŸaretleri veya Real World profili">
+ 1:1
+ </combo_item>
+ <combo_item name="4:3" tool_tip="[SECOND_LIFE] profili">
+ 4:3
+ </combo_item>
+ <combo_item name="10:7" tool_tip="Ä°lanlar ve arama listeleri, yer imleri">
+ 10:7
+ </combo_item>
+ <combo_item name="3:2" tool_tip="Arazi hakkında">
+ 3:2
+ </combo_item>
+ <combo_item name="16:10">
+ 16:10
+ </combo_item>
+ <combo_item name="16:9" tool_tip="Profil seçmeleri">
+ 16:9
+ </combo_item>
+ <combo_item name="2:1">
+ 2:1
+ </combo_item>
+ </combo_box>
+ <button label="Tamam" name="Keep"/>
+ <button label="At" name="Discard"/>
+ <button label="Farklı Kaydet" name="save_tex_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_price_for_listing.xml b/indra/newview/skins/default/xui/tr/floater_price_for_listing.xml
new file mode 100644
index 0000000000..5cdd25b64c
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_price_for_listing.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="price_for_listing" title="SERÄ° Ä°LAN YAYINLA">
+ <text name="explanation_text">
+ İlanınız yayınlandığı günden itibaren bir hafta boyunca yayında kalacaktır.
+
+İlanınızın seri ilanlar listesindeki yeri, ne kadar ödeme yapmayı seçtiğinize bağlıdır.
+
+En çok ücret ödenen ilanlar listenin tepesinde yer alır ve aramalarda daha yukarı sırada görünür.
+ </text>
+ <text name="price_text">
+ Ä°lan Ãœcreti:
+ </text>
+ <text name="price_symbol">
+ L$
+ </text>
+ <button label="Tamam" name="set_price_btn"/>
+ <button label="Ä°ptal" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_publish_classified.xml b/indra/newview/skins/default/xui/tr/floater_publish_classified.xml
new file mode 100644
index 0000000000..572892667b
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_publish_classified.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="publish_classified" title="İlan Yayınlama">
+ <text name="explanation_text">
+ Seri ilanınız yayına verildiği günden itibaren bir hafta boyunca yayında kalacaktır.
+
+Unutmayın, İlan ücretleri iade edilmez.
+ </text>
+ <spinner label="Fiyat: L$" name="price_for_listing" tool_tip="İlan ücreti." value="50"/>
+ <button label="Yayınla" name="publish_btn"/>
+ <button label="Ä°ptal" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_region_debug_console.xml b/indra/newview/skins/default/xui/tr/floater_region_debug_console.xml
new file mode 100644
index 0000000000..e2a5e8e86a
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_region_debug_console.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="region_debug_console" title="Bölge Hata Ayıklama"/>
diff --git a/indra/newview/skins/default/xui/tr/floater_region_info.xml b/indra/newview/skins/default/xui/tr/floater_region_info.xml
new file mode 100644
index 0000000000..2b2e00161b
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_region_info.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="regioninfo" title="BÖLGE/GAYRİMENKUL"/>
diff --git a/indra/newview/skins/default/xui/tr/floater_report_abuse.xml b/indra/newview/skins/default/xui/tr/floater_report_abuse.xml
new file mode 100644
index 0000000000..c5765883c4
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_report_abuse.xml
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_report_abuse" title="KÖTÜYE KULLANIM BİLDİR">
+ <floater.string name="Screenshot">
+ Anlık görüntü
+ </floater.string>
+ <check_box label="Bu anlık görüntüyü kullan" name="screen_check"/>
+ <text name="reporter_title">
+ Rapor eden:
+ </text>
+ <text name="sim_title">
+ Bölge:
+ </text>
+ <text name="sim_field">
+ Bölge Adı
+ </text>
+ <text name="pos_title">
+ Konum:
+ </text>
+ <text name="pos_field">
+ {128.1, 128.1, 15.4}
+ </text>
+ <text name="select_object_label">
+ Düğmeye, sonra da kötüye kullanılan nesneye tıklayın:
+ </text>
+ <button name="pick_btn" tool_tip="Nesne Seçici - bu raporun konusu olan nesneyi tespit edin"/>
+ <text name="object_name_label">
+ Nesne:
+ </text>
+ <text name="owner_name_label">
+ Sahip:
+ </text>
+ <combo_box name="category_combo" tool_tip="Kategori -- bu raporu en iyi tanımlayan kategoriyi seçin">
+ <combo_box.item label="Kategori seç" name="Select_category"/>
+ <combo_box.item label="Yaş &gt; Yaşı oyna" name="Age__Age_play"/>
+ <combo_box.item label="Yaş &gt; 18 Yaş Altı Second Life&apos;ında Yetişkin Sakin" name="Age__Adult_resident_on_Teen_Second_Life"/>
+ <combo_box.item label="Yaş &gt; 18 Yaş Altı Second Life&apos;ı dışında Reşit Olmayan Sakin" name="Age__Underage_resident_outside_of_Teen_Second_Life"/>
+ <combo_box.item label="Saldırı &gt; Çarpışma koruma alanı / güvensiz alan" name="Assault__Combat_sandbox___unsafe_area"/>
+ <combo_box.item label="Saldırı &gt; Güvenli alan" name="Assault__Safe_area"/>
+ <combo_box.item label="Saldırı &gt; Silah test güvenli alanı" name="Assault__Weapons_testing_sandbox"/>
+ <combo_box.item label="Ticaret &gt; Ürün veya hizmet verilemedi" name="Commerce__Failure_to_deliver_product_or_service"/>
+ <combo_box.item label="İfşa &gt; Gerçek dünya bilgileri" name="Disclosure__Real_world_information"/>
+ <combo_box.item label="Ä°fÅŸa &gt; Sohbet uzaktan izleniyor" name="Disclosure__Remotely_monitoring chat"/>
+ <combo_box.item label="Ä°fÅŸa &gt; Second Life bilgileri/sohbet/AÄ°&apos;ler" name="Disclosure__Second_Life_information_chat_IMs"/>
+ <combo_box.item label="Huzuru bozuyor &gt; bölge kaynaklarının haksız kullanımı" name="Disturbing_the_peace__Unfair_use_of_region_resources"/>
+ <combo_box.item label="Huzuru bozuyor &gt; aşırı komut dosyalı nesne" name="Disturbing_the_peace__Excessive_scripted_objects"/>
+ <combo_box.item label="Huzuru bozuyor &gt; Nesne dağıtma" name="Disturbing_the_peace__Object_littering"/>
+ <combo_box.item label="Huzuru bozuyor &gt; Tekrarlanan spam" name="Disturbing_the_peace__Repetitive_spam"/>
+ <combo_box.item label="Huzuru bozuyor &gt; İstenmeyen reklam spamı" name="Disturbing_the_peace__Unwanted_advert_spam"/>
+ <combo_box.item label="Dolandırıcılık &gt; L$" name="Fraud__L$"/>
+ <combo_box.item label="Dolandırıcılık &gt; Arazi" name="Fraud__Land"/>
+ <combo_box.item label="Dolandırıcılık &gt; Piramid planı veya zincirleme mektup" name="Fraud__Pyramid_scheme_or_chain_letter"/>
+ <combo_box.item label="Dolandırıcılık &gt; US$" name="Fraud__US$"/>
+ <combo_box.item label="Taciz &gt; reklam çiftlikleri / görsel spam" name="Harassment__Advert_farms___visual_spam"/>
+ <combo_box.item label="Taciz &gt; Kişi ya da grupları aşağılama" name="Harassment__Defaming_individuals_or_groups"/>
+ <combo_box.item label="Taciz &gt; Tehditkâr hareket" name="Harassment__Impeding_movement"/>
+ <combo_box.item label="Taciz &gt; Cinsel taciz" name="Harassment__Sexual_harassment"/>
+ <combo_box.item label="Taciz &gt; Başkalarını Hizmet Koşullarını ihlal etmeye kışkırtma/teşvik" name="Harassment__Solicting_inciting_others_to_violate_ToS"/>
+ <combo_box.item label="Taciz &gt; Sözlü istismar" name="Harassment__Verbal_abuse"/>
+ <combo_box.item label="Uygunsuzluk &gt; Genel anlamda rahatsız edici içerik veya davranış" name="Indecency__Broadly_offensive_content_or_conduct"/>
+ <combo_box.item label="Uygunsuzluk &gt; Uygunsuz avatar adı" name="Indecency__Inappropriate_avatar_name"/>
+ <combo_box.item label="Uygunsuzluk &gt; PG bölgesinde rahatsız edici içerik veya davranış" name="Indecency__Mature_content_in_PG_region"/>
+ <combo_box.item label="Uygunsuzluk &gt; Orta bölgede rahatsız edici içerik veya davranış" name="Indecency__Inappropriate_content_in_Mature_region"/>
+ <combo_box.item label="Fikri mülkiyet ihlali &gt; İçerik Silme" name="Intellectual_property_infringement_Content_Removal"/>
+ <combo_box.item label="Fikri mülkiyet ihlali &gt; CopyBot veya İzinlerin Kötüye Kullanılması" name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit"/>
+ <combo_box.item label="Tahammülsüzlük" name="Intolerance"/>
+ <combo_box.item label="Arazi &gt; Koruma alanı kaynaklarının istismarı" name="Land__Abuse_of_sandbox_resources"/>
+ <combo_box.item label="Arazi &gt; Tecavvüz &gt; Nesneler/dokular" name="Land__Encroachment__Objects_textures"/>
+ <combo_box.item label="Arazi &gt; Tecavvüz &gt; Parçacıklar" name="Land__Encroachment__Particles"/>
+ <combo_box.item label="Arazi &gt; Tecavvüz &gt; Ağaçlar/bitkiler" name="Land__Encroachment__Trees_plants"/>
+ <combo_box.item label="Bahis oynatma/kumar" name="Wagering_gambling"/>
+ <combo_box.item label="DiÄŸer" name="Other"/>
+ </combo_box>
+ <text name="abuser_name_title">
+ Kötüye kullananın adı:
+ </text>
+ <button label="Seç" name="select_abuser" tool_tip="Kötüye kullananın adını bir listeden seçin"/>
+ <text name="abuser_name_title2">
+ Kötüye Kullanma Konumu
+ </text>
+ <text name="sum_title">
+ Özet:
+ </text>
+ <text name="dscr_title">
+ Ayrıntl:
+ </text>
+ <text name="bug_aviso">
+ Mümkün olduğunca spesifik olun
+ </text>
+ <text name="incomplete_title">
+ * Eksik raporlar incelenmeyecektir
+ </text>
+ <button label="Kötüye Kullanımı Bildir" label_selected="Kötüye Kullanımı Bildir" name="send_btn"/>
+ <button label="Ä°ptal" label_selected="Ä°ptal" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_script_debug.xml b/indra/newview/skins/default/xui/tr/floater_script_debug.xml
new file mode 100644
index 0000000000..baf0aabd85
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_script_debug.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<multi_floater name="script debug floater" title="Komut Dosyası Uyarı/Hata"/>
diff --git a/indra/newview/skins/default/xui/tr/floater_script_debug_panel.xml b/indra/newview/skins/default/xui/tr/floater_script_debug_panel.xml
new file mode 100644
index 0000000000..e70a30fa24
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_script_debug_panel.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="script" short_title="[ALL SCRIPTS]" title="[ALL SCRIPTS]"/>
diff --git a/indra/newview/skins/default/xui/tr/floater_script_limits.xml b/indra/newview/skins/default/xui/tr/floater_script_limits.xml
new file mode 100644
index 0000000000..875599bde3
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_script_limits.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="scriptlimits" title="KOMUT DOSYASI BÄ°LGÄ°SÄ°"/>
diff --git a/indra/newview/skins/default/xui/tr/floater_script_preview.xml b/indra/newview/skins/default/xui/tr/floater_script_preview.xml
new file mode 100644
index 0000000000..e193f7c1af
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_script_preview.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="preview lsl text" title="KOMUT DOSYASI: DÖNDÜRME KOMUT DOSYASI">
+ <floater.string name="Title">
+ KOMUT DOSYASI: [NAME]
+ </floater.string>
+ <text name="desc txt">
+ Açıklama:
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_script_queue.xml b/indra/newview/skins/default/xui/tr/floater_script_queue.xml
new file mode 100644
index 0000000000..c1d98b717a
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_script_queue.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="queue" title="Ä°LERLEMEYÄ° SIFIRLA">
+ <floater.string name="Starting">
+ [COUNT] öğe için [START] başlatılıyor.
+ </floater.string>
+ <floater.string name="Done">
+ Tamamlandı.
+ </floater.string>
+ <floater.string name="Resetting">
+ Sıfırlanıyor
+ </floater.string>
+ <floater.string name="Running">
+ Çalışıyor
+ </floater.string>
+ <floater.string name="NotRunning">
+ Çalışmıyor
+ </floater.string>
+ <button label="Kapat" label_selected="Kapat" name="close"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_script_search.xml b/indra/newview/skins/default/xui/tr/floater_script_search.xml
new file mode 100644
index 0000000000..54b1d20c8c
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_script_search.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="script search" title="KOMUT DOSYASI ARA">
+ <check_box label="Büyük Küçük Harfe Duyarsız" name="case_text"/>
+ <button label="Ara" label_selected="Ara" name="search_btn"/>
+ <button label="DeÄŸiÅŸtir" label_selected="DeÄŸiÅŸtir" name="replace_btn"/>
+ <button label="Tümünü Değiştir" label_selected="Tümünü Değiştir" name="replace_all_btn"/>
+ <text name="txt">
+ Ara
+ </text>
+ <text name="txt2">
+ DeÄŸiÅŸtir
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_search.xml b/indra/newview/skins/default/xui/tr/floater_search.xml
new file mode 100644
index 0000000000..08c1e5162c
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_search.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_search" title="">
+ <floater.string name="loading_text">
+ Yükleniyor...
+ </floater.string>
+ <floater.string name="done_text">
+ Tamamlandı
+ </floater.string>
+ <layout_stack name="stack1">
+ <layout_panel name="browser_layout">
+ <text name="refresh_search">
+ Mevcut Yönetici seviyesini dikkate alarak aramayı yenile
+ </text>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_select_key.xml b/indra/newview/skins/default/xui/tr/floater_select_key.xml
new file mode 100644
index 0000000000..b828672ec2
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_select_key.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="modal container">
+ <text name="Save item as:">
+ Konuş düğmesi tetikleyicinizi ayarlamak için bir düğmeye basın.
+ </text>
+ <button label="Ä°ptal" label_selected="Ä°ptal" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_sell_land.xml b/indra/newview/skins/default/xui/tr/floater_sell_land.xml
new file mode 100644
index 0000000000..9bea1e120e
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_sell_land.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="sell land" title="ARAZÄ° SAT">
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text name="info_parcel_label">
+ Parsel:
+ </text>
+ <text name="info_parcel">
+ PARSEL ADI
+ </text>
+ <text name="info_size_label">
+ Büyüklük:
+ </text>
+ <text name="info_size">
+ [AREA] m²
+ </text>
+ <text name="info_action">
+ Bu parseli satmak için:
+ </text>
+ <text name="price_label">
+ 1. Fiyat belirle:
+ </text>
+ <text name="price_text">
+ Uygun bir fiyat seçin.
+ </text>
+ <text name="price_ld">
+ L$
+ </text>
+ <line_editor name="price">
+ 0
+ </line_editor>
+ <text name="price_per_m">
+ (L$[PER_METER] / m²)
+ </text>
+ <text name="sell_to_label">
+ 2. Araziyi şuna satın:
+ </text>
+ <text name="sell_to_text">
+ Herkese mi, yoksa belirli bir alıcıya mı satacağınızı seçin.
+ </text>
+ <combo_box name="sell_to">
+ <combo_box.item label="- Birini seç -" name="--selectone--"/>
+ <combo_box.item label="Herkes" name="Anyone"/>
+ <combo_box.item label="Belirli kiÅŸi:" name="Specificuser:"/>
+ </combo_box>
+ <button label="Seç" name="sell_to_select_agent"/>
+ <text name="sell_objects_label">
+ 3. Nesneler araziyle birlikte mi satılacak?
+ </text>
+ <text name="sell_objects_text">
+ Arazi sahibinin parsel üzerindeki devredilebilir nesnelerinin mülkiyeti değişecektir.
+ </text>
+ <radio_group name="sell_objects">
+ <radio_item label="Hayır, nesnelerin mülkiyetini koru" name="no"/>
+ <radio_item label="Evet, nesneleri araziyle birlikte sat" name="yes"/>
+ </radio_group>
+ <button label="Nesneleri Göster" name="show_objects"/>
+ <text name="nag_message_label">
+ UNUTMAYIN: Tüm satışlar kesindir.
+ </text>
+ <button label="Araziyi Satışa Çıkar" name="sell_btn"/>
+ <button label="Ä°ptal" name="cancel_btn"/>
+ </panel>
+ </scroll_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_settings_debug.xml b/indra/newview/skins/default/xui/tr/floater_settings_debug.xml
new file mode 100644
index 0000000000..65264c57d7
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_settings_debug.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="settings_debug" title="HATA AYIKLAMA AYARLARI">
+ <radio_group name="boolean_combo">
+ <radio_item label="TRUE" name="TRUE" value="true"/>
+ <radio_item label="FALSE" name="FALSE" value=""/>
+ </radio_group>
+ <color_swatch label="Renk" name="val_color_swatch"/>
+ <spinner label="x" name="val_spinner_1"/>
+ <spinner label="x" name="val_spinner_2"/>
+ <spinner label="x" name="val_spinner_3"/>
+ <spinner label="x" name="val_spinner_4"/>
+ <button label="Varsayılana sıfırla" name="default_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_snapshot.xml b/indra/newview/skins/default/xui/tr/floater_snapshot.xml
new file mode 100644
index 0000000000..fa51f15d16
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_snapshot.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Snapshot" title="ANLIK GÖRÜNTÜ ÖNİZLEME">
+ <floater.string name="unknown">
+ bilinmiyor
+ </floater.string>
+ <string name="postcard_progress_str">
+ E-posta Gönderiliyor
+ </string>
+ <string name="profile_progress_str">
+ Yayınlanıyor
+ </string>
+ <string name="inventory_progress_str">
+ Envantere Kaydediliyor
+ </string>
+ <string name="local_progress_str">
+ Bilgisayara Kaydediliyor
+ </string>
+ <string name="profile_succeeded_str">
+ Görüntü yüklendi
+ </string>
+ <string name="postcard_succeeded_str">
+ E-posta Gönderildi!
+ </string>
+ <string name="inventory_succeeded_str">
+ Envantere Kaydedildi!
+ </string>
+ <string name="local_succeeded_str">
+ Bilgisayara Kaydedildi!
+ </string>
+ <string name="profile_failed_str">
+ Görüntü Profil Akışınıza yüklenemedi.
+ </string>
+ <string name="postcard_failed_str">
+ E-posta gönderilemedi.
+ </string>
+ <string name="inventory_failed_str">
+ Envantere kaydedilemedi.
+ </string>
+ <string name="local_failed_str">
+ Bilgisayara kaydedilemedi.
+ </string>
+ <button name="advanced_options_btn" tool_tip="Gelişmiş seçenekler"/>
+ <text name="image_res_text">
+ [WIDTH] x [HEIGHT] px
+ </text>
+ <text name="file_size_label">
+ [SIZE] KB
+ </text>
+ <panel name="advanced_options_panel">
+ <text name="advanced_options_label">
+ GELİŞMİŞ SEÇENEKLER
+ </text>
+ <text name="layer_type_label">
+ Yakala:
+ </text>
+ <combo_box label="Görüntü Katmanları" name="layer_types">
+ <combo_box.item label="Renkler" name="Colors"/>
+ <combo_box.item label="Derinlik" name="Depth"/>
+ </combo_box>
+ <check_box label="Arayüz" name="ui_check"/>
+ <check_box label="BÃœG&apos;ler" name="hud_check"/>
+ <check_box label="Kare dondur (tam ekran)" name="freeze_frame_check"/>
+ <check_box label="Otomatik yenile" name="auto_snapshot_check"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_sound_devices.xml b/indra/newview/skins/default/xui/tr/floater_sound_devices.xml
new file mode 100644
index 0000000000..470a222d7e
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_sound_devices.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_sound_devices" title="SES CÄ°HAZLARI">
+ <text name="voice_label">
+ Sesli Sohbet
+ </text>
+ <check_box label="Etkin" name="enable_voice"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_sound_preview.xml b/indra/newview/skins/default/xui/tr/floater_sound_preview.xml
new file mode 100644
index 0000000000..1938f184b3
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_sound_preview.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Sound Preview" title="SOUND.WAV">
+ <text name="name_label">
+ Ad:
+ </text>
+ <text name="description_label">
+ Açıklama:
+ </text>
+ <button label="Karşıya Yükle (L$[AMOUNT])" name="ok_btn"/>
+ <button label="Ä°ptal" label_selected="Ä°ptal" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_stats.xml b/indra/newview/skins/default/xui/tr/floater_stats.xml
new file mode 100644
index 0000000000..17f1166c46
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_stats.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Statistics" title="Ä°STATÄ°STÄ°KLER">
+ <scroll_container name="statistics_scroll">
+ <container_view name="statistics_view">
+ <stat_view label="Temel" name="basic">
+ <stat_bar label="FPS" name="fps"/>
+ <stat_bar label="Bant geniÅŸliÄŸi" name="bandwidth"/>
+ <stat_bar label="Paket Kaybı" name="packet_loss"/>
+ <stat_bar label="Sim Pingi" name="ping"/>
+ </stat_view>
+ <stat_view label="GeliÅŸmiÅŸ" name="advanced">
+ <stat_view label="Ä°ÅŸle" name="render">
+ <stat_bar label="Çerçeve Başına Çizilen Üçgenler" name="ktrisframe"/>
+ <stat_bar label="Saniyede Bir Çizilen Üçgenler" name="ktrissec"/>
+ <stat_bar label="Toplam Nesne" name="objs"/>
+ <stat_bar label="Yeni Nesne" name="newobjs"/>
+ </stat_view>
+ <stat_view label="Doku" name="texture">
+ <stat_bar label="Sayım" name="numimagesstat"/>
+ <stat_bar label="Ham Sayım" name="numrawimagesstat"/>
+ <stat_bar label="GL BelleÄŸi" name="gltexmemstat"/>
+ <stat_bar label="Formatlanmış Bellek" name="formattedmemstat"/>
+ <stat_bar label="Ham Bellek" name="rawmemstat"/>
+ <stat_bar label="Bağlı Doku Belleği" name="glboundmemstat"/>
+ </stat_view>
+ <stat_view label="AÄŸ" name="network">
+ <stat_bar label="Gelen Paketler" name="packetsinstat"/>
+ <stat_bar label="Giden Paketler" name="packetsoutstat"/>
+ <stat_bar label="Nesneler" name="objectkbitstat"/>
+ <stat_bar label="Doku" name="texturekbitstat"/>
+ <stat_bar label="Varlık" name="assetkbitstat"/>
+ <stat_bar label="Katmanlar" name="layerskbitstat"/>
+ <stat_bar label="Gerçekte Gelen" name="actualinkbitstat"/>
+ <stat_bar label="Gerçekte Giden" name="actualoutkbitstat"/>
+ <stat_bar label="VFS Bekleyen Ä°ÅŸlemler" name="vfspendingoperations"/>
+ </stat_view>
+ </stat_view>
+ <stat_view label="Simülatör" name="sim">
+ <stat_bar label="Zaman GenleÅŸmesi" name="simtimedilation"/>
+ <stat_bar label="Sim FPS" name="simfps"/>
+ <stat_bar label="Fizik FPS" name="simphysicsfps"/>
+ <stat_view label="Fizik Ayrıntıları" name="physicsdetail">
+ <stat_bar label="SabitlenmiÅŸ Nesneler" name="physicspinnedtasks"/>
+ <stat_bar label="Düşük Ayrıntı Seviyesindeki Nesneler" name="physicslodtasks"/>
+ <stat_bar label="Ayrılan Bellek" name="physicsmemoryallocated"/>
+ </stat_view>
+ <stat_bar label="Aracı Güncelleştirmeleri/sn" name="simagentups"/>
+ <stat_bar label="Ana Aracılar" name="simmainagents"/>
+ <stat_bar label="Alt Aracılar" name="simchildagents"/>
+ <stat_bar label="Nesneler" name="simobjects"/>
+ <stat_bar label="Etkin Nesneler" name="simactiveobjects"/>
+ <stat_bar label="Etkin Komut Dosyaları" name="simactivescripts"/>
+ <stat_bar label="Komut Dosyası Etkinlikleri" name="simscripteps"/>
+ <stat_bar label="Gelen Paketler" name="siminpps"/>
+ <stat_bar label="Giden Paketler" name="simoutpps"/>
+ <stat_bar label="Bekleyen Karşıdan Yüklemeler" name="simpendingdownloads"/>
+ <stat_bar label="Bekleyen Karşıya Yüklemeler" name="simpendinguploads"/>
+ <stat_bar label="Toplam BildirilmiÅŸ Bayt" name="simtotalunackedbytes"/>
+ <stat_view label="Zaman (ms)" name="simperf">
+ <stat_bar label="Toplam Çerçeve Süresi" name="simframemsec"/>
+ <stat_bar label="Net Süre" name="simnetmsec"/>
+ <stat_bar label="Fizik Süresi" name="simsimphysicsmsec"/>
+ <stat_bar label="Simülasyon Süresi" name="simsimothermsec"/>
+ <stat_bar label="Aracı Süresi" name="simagentmsec"/>
+ <stat_bar label="Görüntü Süresi" name="simimagesmsec"/>
+ <stat_bar label="Komut Dosyası Süresi" name="simscriptmsec"/>
+ <stat_bar label="Yedek Zaman" name="simsparemsec"/>
+ <stat_view label="Zaman Ayrıntıları (ms)" name="timedetails">
+ <stat_bar label="Fizik Adımı" name="simsimphysicsstepmsec"/>
+ <stat_bar label="Fizik Şekillerini Güncelle" name="simsimphysicsshapeupdatemsec"/>
+ <stat_bar label="Fizik DiÄŸer" name="simsimphysicsothermsec"/>
+ <stat_bar label="Uyku Zamanı" name="simsleepmsec"/>
+ <stat_bar label="Pompa Giriş Çıkış" name="simpumpiomsec"/>
+ </stat_view>
+ </stat_view>
+ </stat_view>
+ </container_view>
+ </scroll_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_sys_well.xml b/indra/newview/skins/default/xui/tr/floater_sys_well.xml
new file mode 100644
index 0000000000..301d9af063
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_sys_well.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="sys_well_window" title="BÄ°LDÄ°RÄ°MLER">
+ <string name="title_im_well_window">
+ SOHBETLER
+ </string>
+ <string name="title_notification_well_window">
+ BÄ°LDÄ°RÄ°MLER
+ </string>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_telehub.xml b/indra/newview/skins/default/xui/tr/floater_telehub.xml
new file mode 100644
index 0000000000..2cdb464ed0
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_telehub.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Explicit left edge to avoid overlapping build tools -->
+<floater name="telehub" title="IÅžINLAMA Ä°STASYONU">
+ <text name="status_text_connected">
+ Işınlama istasyonu nesneye [OBJECT] bağlandı
+ </text>
+ <text name="status_text_not_connected">
+ Hiçbir ışınlama istasyonu bağlı değil
+ </text>
+ <text name="help_text_connected">
+ Çıkarmak için, Bağlantıyı Kes&apos;e tıkla.
+ </text>
+ <text name="help_text_not_connected">
+ Nesneyi seç ve Işınlama İstasyonuna Bağlan&apos;a tıkla
+ </text>
+ <button label="Işınlanma İstasyonuna Bağlan" name="connect_btn"/>
+ <button label="Bağlantıyı Kes" name="disconnect_btn"/>
+ <text name="spawn_points_text">
+ Üreme Noktaları (konumlar, nesneler değil):
+ </text>
+ <button label="Ãœreme Ekle" name="add_spawn_point_btn"/>
+ <button label="Üreme Çıkar" name="remove_spawn_point_btn"/>
+ <text name="spawn_point_help">
+ Konum belirtmek için nesneyi seç ve &quot;Üreme Ekle&quot;ye tıkla
+Daha sonra nesneyi taşıyabilir veya silebilirsiniz.
+Konumlar ışınlanma istasyonu merkezine görelidir.
+SL dünyasında vurgulamak için listedeki bir ögeyi seçin.
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_test_layout_stacks.xml b/indra/newview/skins/default/xui/tr/floater_test_layout_stacks.xml
new file mode 100644
index 0000000000..b479d5f6d6
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_test_layout_stacks.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Test Floater" title="LAYOUTSTACK TESTS"/>
diff --git a/indra/newview/skins/default/xui/tr/floater_test_text_vertical_aligment.xml b/indra/newview/skins/default/xui/tr/floater_test_text_vertical_aligment.xml
new file mode 100644
index 0000000000..fcb7d87287
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_test_text_vertical_aligment.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Test Floater" title="TEST PENCERESÄ°"/>
diff --git a/indra/newview/skins/default/xui/tr/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/tr/floater_texture_ctrl.xml
new file mode 100644
index 0000000000..4ef789f585
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_texture_ctrl.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="texture picker" title="SEÇME: DOKU">
+ <floater.string name="choose_picture">
+ Bir resim seçmek için tıklayın
+ </floater.string>
+ <floater.string name="pick title">
+ Seçme:
+ </floater.string>
+ <text name="Multiple">
+ Birden çok doku
+ </text>
+ <text name="unknown">
+ Büyüklük: [DIMENSIONS]
+ </text>
+ <button label="Varsayılan" label_selected="Varsayılan" name="Default"/>
+ <button label="Hiçbiri" label_selected="Hiçbiri" name="None"/>
+ <button label="BoÅŸ" label_selected="BoÅŸ" name="Blank"/>
+ <check_box initial_value="true" label="Åžimdi uygula" name="apply_immediate_check"/>
+ <filter_editor label="Dokuları Filtrele" name="inventory search editor"/>
+ <check_box initial_value="false" label="Klasörleri göster" name="show_folders_check"/>
+ <button label="Tamam" label_selected="Tamam" name="Select"/>
+ <button label="Ä°ptal" label_selected="Ä°ptal" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_tools.xml b/indra/newview/skins/default/xui/tr/floater_tools.xml
new file mode 100644
index 0000000000..b0c59ced42
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_tools.xml
@@ -0,0 +1,511 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="toolbox floater" short_title="İNŞA ET ARAÇLARI">
+ <floater.string name="grid_screen_text">
+ Ekran
+ </floater.string>
+ <floater.string name="grid_local_text">
+ Yerel
+ </floater.string>
+ <floater.string name="grid_world_text">
+ Dünya
+ </floater.string>
+ <floater.string name="grid_reference_text">
+ Referans
+ </floater.string>
+ <floater.string name="grid_attachment_text">
+ Aksesuar
+ </floater.string>
+ <floater.string name="status_rotate">
+ Nesneyi döndürmek için renkli bantları sürükleyin
+ </floater.string>
+ <floater.string name="status_scale">
+ Seçilen tarafı uzatmak için tıklayın ve sürükleyin
+ </floater.string>
+ <floater.string name="status_move">
+ Hareket ettirmek için sürükleyin, kopyalamak için Shift ile sürükleyin
+ </floater.string>
+ <floater.string name="status_modifyland">
+ Araziyi değiştirmek için tıklayın ve tutun
+ </floater.string>
+ <floater.string name="status_camera">
+ Kamerayı hareket ettirmek için tıklayın ve sürükleyin
+ </floater.string>
+ <floater.string name="status_grab">
+ Hareket ettirmek için sürükleyin, kaldırmak için Ctrl, döndürmek için Ctrl+Shift kullanın
+ </floater.string>
+ <floater.string name="status_place">
+ İnşa etmek için SL dünyası içine tıklayın
+ </floater.string>
+ <floater.string name="status_selectland">
+ Araziyi seçmek için tıklayın ve sürükleyin
+ </floater.string>
+ <floater.string name="status_selectcount">
+ [OBJ_COUNT] nesne seçili, [LAND_IMPACT] arazi etkisi
+ </floater.string>
+ <floater.string name="status_remaining_capacity">
+ Kalan kapasite [LAND_CAPACITY].
+ </floater.string>
+ <button name="button focus" tool_tip="Odak"/>
+ <button name="button move" tool_tip="Hareket Et"/>
+ <button name="button edit" tool_tip="Düzenle"/>
+ <button name="button create" tool_tip="OluÅŸtur"/>
+ <button name="button land" tool_tip="Arazi"/>
+ <text name="text status">
+ Hareket ettirmek için sürükleyin, kopyalamak için Shift ile sürükleyin
+ </text>
+ <radio_group name="focus_radio_group">
+ <radio_item label="Yakınlaştır" name="radio zoom"/>
+ <radio_item label="Yörünge Değişimi (Ctrl)" name="radio orbit"/>
+ <radio_item label="Kamerayı Çevir (Ctrl+Shift)" name="radio pan"/>
+ </radio_group>
+ <slider_bar initial_value="0.125" name="slider zoom"/>
+ <radio_group name="move_radio_group">
+ <radio_item label="Hareket Et" name="radio move"/>
+ <radio_item label="Kaldır (Ctrl)" name="radio lift"/>
+ <radio_item label="Çevir (Ctrl+Shift)" name="radio spin"/>
+ </radio_group>
+ <radio_group name="edit_radio_group">
+ <radio_item label="Hareket Et" name="radio position"/>
+ <radio_item label="Döndür (Ctrl)" name="radio rotate"/>
+ <radio_item label="Uzat (Ctrl+Shift)" name="radio stretch"/>
+ <radio_item label="Yüzü Seç" name="radio select face"/>
+ </radio_group>
+ <check_box label="Bağlantılıları düzenle" name="checkbox edit linked parts"/>
+ <button label="BaÄŸla" name="link_btn"/>
+ <button label="Bağlantıyı Kopar" name="unlink_btn"/>
+ <text label="Her İki Tarafı Uzat" name="checkbox uniform label">
+ Her İki Tarafı Uzat
+ </text>
+ <check_box initial_value="true" label="Dokuları Uzat" name="checkbox stretch textures"/>
+ <check_box initial_value="true" label="Yasla" name="checkbox snap to grid"/>
+ <combo_box name="combobox grid mode" tool_tip="Nesneyi konumlandırmak için ağ cetvelini seçin">
+ <combo_box.item label="Dünya" name="World"/>
+ <combo_box.item label="Yerel" name="Local"/>
+ <combo_box.item label="Referans" name="Reference"/>
+ </combo_box>
+ <button label="" name="Options..." tool_tip="İlave ağ seçeneklerine bak"/>
+ <button name="ToolCube" tool_tip="Küp"/>
+ <button name="ToolPrism" tool_tip="Prizma"/>
+ <button name="ToolPyramid" tool_tip="Piramit"/>
+ <button name="ToolTetrahedron" tool_tip="Üçgen Piramit"/>
+ <button name="ToolCylinder" tool_tip="Silindir"/>
+ <button name="ToolHemiCylinder" tool_tip="Yarı Silindir"/>
+ <button name="ToolCone" tool_tip="Koni"/>
+ <button name="ToolHemiCone" tool_tip="Yarı Koni"/>
+ <button name="ToolSphere" tool_tip="Küre"/>
+ <button name="ToolHemiSphere" tool_tip="Yarı Küre"/>
+ <button name="ToolTorus" tool_tip="Torus"/>
+ <button name="ToolTube" tool_tip="Tüp"/>
+ <button name="ToolRing" tool_tip="Halka"/>
+ <button name="ToolTree" tool_tip="Ağaç"/>
+ <button name="ToolGrass" tool_tip="Çimen"/>
+ <check_box label="Seçili Aracı tut" name="checkbox sticky"/>
+ <check_box label="Seçimi kopyala" name="checkbox copy selection"/>
+ <check_box initial_value="true" label="Kopyayı Merkezle" name="checkbox copy centers"/>
+ <check_box label="Kopyayı Döndür" name="checkbox copy rotates"/>
+ <radio_group name="land_radio_group">
+ <radio_item label="Araziyi Seç" name="radio select land"/>
+ <radio_item label="Düzleştir" name="radio flatten"/>
+ <radio_item label="Yükselt" name="radio raise"/>
+ <radio_item label="Alçalt" name="radio lower"/>
+ <radio_item label="Düzgünleştir" name="radio smooth"/>
+ <radio_item label="Pürüzlendir" name="radio noise"/>
+ <radio_item label="Geri Çevir" name="radio revert"/>
+ </radio_group>
+ <text name="Bulldozer:">
+ Buldozer:
+ </text>
+ <text name="Dozer Size:">
+ Büyüklük
+ </text>
+ <slider_bar initial_value="2.0" name="slider brush size"/>
+ <text name="Strength:">
+ Kuvvet
+ </text>
+ <slider_bar initial_value="0.00" name="slider force"/>
+ <button label="Uygula" label_selected="Uygula" name="button apply to selection" tool_tip="Seçilen araziyi değiştirin"/>
+ <text name="selection_empty">
+ Seçilen bir şey yok.
+ </text>
+ <text name="remaining_capacity">
+ [CAPACITY_STRING] [secondlife:///app/openfloater/object_weights Ek bilgi]
+ </text>
+ <tab_container name="Object Info Tabs">
+ <panel label="Genel" name="General">
+ <panel.string name="text deed continued">
+ Devret
+ </panel.string>
+ <panel.string name="text deed">
+ Devret
+ </panel.string>
+ <panel.string name="text modify info 1">
+ Bu nesneyi deÄŸiÅŸtirebilirsiniz
+ </panel.string>
+ <panel.string name="text modify info 2">
+ Bu nesneleri deÄŸiÅŸtirebilirsiniz
+ </panel.string>
+ <panel.string name="text modify info 3">
+ Bu nesneyi deÄŸiÅŸtiremezsiniz
+ </panel.string>
+ <panel.string name="text modify info 4">
+ Bu nesneleri deÄŸiÅŸtiremezsiniz
+ </panel.string>
+ <panel.string name="text modify warning">
+ İzinleri ayarlamak için tüm nesneyi seçmelisiniz
+ </panel.string>
+ <panel.string name="Cost Default">
+ Fiyat: L$
+ </panel.string>
+ <panel.string name="Cost Total">
+ Toplam Fiyat: L$
+ </panel.string>
+ <panel.string name="Cost Per Unit">
+ Birim Fiyatı: L$
+ </panel.string>
+ <panel.string name="Cost Mixed">
+ Karma Fiyat
+ </panel.string>
+ <panel.string name="Sale Mixed">
+ Karma Satış
+ </panel.string>
+ <text name="Name:">
+ Ad:
+ </text>
+ <text name="Description:">
+ Açıklama:
+ </text>
+ <text name="Creator:">
+ OluÅŸturan:
+ </text>
+ <text name="Owner:">
+ Sahip:
+ </text>
+ <text name="Group:">
+ Grup:
+ </text>
+ <name_box initial_value="Yükleniyor..." name="Group Name Proxy"/>
+ <button name="button set group" tool_tip="Bu nesnenin izinlerini paylaşmak için bir grup seçin"/>
+ <check_box label="Paylaş" name="checkbox share with group" tool_tip="Ayarlanan grubun tüm üyelerinin, bu nesne için değiştirme izinlerinizi paylaşmasına izin verir. Rol kısıtlamalarını etkinleştirmek için Devretme yapmalısınız."/>
+ <button label="Devret" label_selected="Devret" name="button deed" tool_tip="Bu nesne devredilerek verildiğinde, nesnenin sonraki sahibi için izinler geçerli olur. Grup içerisinde paylaşılan nesneler bir grup yetkilisi tarafından devredilebilir."/>
+ <text name="label click action">
+ Şu eylem için tıklayın:
+ </text>
+ <combo_box name="clickaction">
+ <combo_box.item label="Dokun (varsayılan)" name="Touch/grab(default)"/>
+ <combo_box.item label="Nesnenin üzerine otur" name="Sitonobject"/>
+ <combo_box.item label="Nesneyi satın al" name="Buyobject"/>
+ <combo_box.item label="Nesneye ödeme yap" name="Payobject"/>
+ <combo_box.item label="Aç" name="Open"/>
+ <combo_box.item label="Yakınlaştır" name="Zoom"/>
+ </combo_box>
+ <check_box label="Satılık:" name="checkbox for sale"/>
+ <combo_box name="sale type">
+ <combo_box.item label="Kopyala" name="Copy"/>
+ <combo_box.item label="İçerik" name="Contents"/>
+ <combo_box.item label="Orijinal" name="Original"/>
+ </combo_box>
+ <spinner label="Fiyat: L$" name="Edit Cost"/>
+ <check_box label="Aramada göster" name="search_check" tool_tip="Kişiler arama sonuçlarında bu nesneyi görebilsin"/>
+ <panel name="perms_build">
+ <text name="perm_modify">
+ Bu nesneyi deÄŸiÅŸtirebilirsiniz
+ </text>
+ <text name="Anyone can:">
+ Herkes:
+ </text>
+ <check_box label="Hareket Et" name="checkbox allow everyone move"/>
+ <check_box label="Kopyala" name="checkbox allow everyone copy"/>
+ <text name="Next owner can:">
+ Sonraki sahip:
+ </text>
+ <check_box label="DeÄŸiÅŸtir" name="checkbox next owner can modify"/>
+ <check_box label="Kopyala" name="checkbox next owner can copy"/>
+ <check_box label="Aktar" name="checkbox next owner can transfer" tool_tip="Sonraki sahibi bu nesneyi verebilir veya tekrar satabilir"/>
+ <text name="B:">
+ B:
+ </text>
+ <text name="O:">
+ O:
+ </text>
+ <text name="G:">
+ G:
+ </text>
+ <text name="E:">
+ E:
+ </text>
+ <text name="N:">
+ N:
+ </text>
+ <text name="F:">
+ F:
+ </text>
+ </panel>
+ </panel>
+ <panel label="Nesne" name="Object">
+ <check_box label="Kilitli" name="checkbox locked" tool_tip="Nesnenin hareket ettirilmesini veya silinmesini engeller. Arzulanmayan düzenlemelerden kaçınmak için inşa işlemleri sırasında oldukça faydalıdır."/>
+ <check_box label="Fiziksel" name="Physical Checkbox Ctrl" tool_tip="Nesnelerin itilmesine ve yerçekiminden etkilenmesine izin verir."/>
+ <check_box label="Geçici" name="Temporary Checkbox Ctrl" tool_tip="Nesnenin oluşturulduktan 1 dakika sonra silinmesine neden olur"/>
+ <check_box label="Fantom" name="Phantom Checkbox Ctrl" tool_tip="Nesnenin diğer nesneler veya avatarlarla çarpışmamasına neden olur"/>
+ <text name="label position">
+ Konum (metre)
+ </text>
+ <spinner label="X" name="Pos X"/>
+ <spinner label="Y" name="Pos Y"/>
+ <spinner label="Z" name="Pos Z"/>
+ <text name="label size">
+ Büyüklük (metre)
+ </text>
+ <spinner label="X" name="Scale X"/>
+ <spinner label="Y" name="Scale Y"/>
+ <spinner label="Z" name="Scale Z"/>
+ <text name="label rotation">
+ Dönüş (derece)
+ </text>
+ <spinner label="X" name="Rot X"/>
+ <spinner label="Y" name="Rot Y"/>
+ <spinner label="Z" name="Rot Z"/>
+ <combo_box name="comboBaseType">
+ <combo_box.item label="Kutu" name="Box"/>
+ <combo_box.item label="Silindir" name="Cylinder"/>
+ <combo_box.item label="Prizma" name="Prism"/>
+ <combo_box.item label="Küre" name="Sphere"/>
+ <combo_box.item label="Torus" name="Torus"/>
+ <combo_box.item label="Tüp" name="Tube"/>
+ <combo_box.item label="Halka" name="Ring"/>
+ <combo_box.item label="ÅžekillendirilmiÅŸ" name="Sculpted"/>
+ </combo_box>
+ <text name="text cut">
+ Yolu Kes (başlangıç/son)
+ </text>
+ <spinner label="B DÄ°KKAT" name="cut begin"/>
+ <spinner label="D - DÄ°KKAT" name="cut end"/>
+ <text name="text hollow">
+ Oyuk
+ </text>
+ <text name="text skew">
+ Çarpıt
+ </text>
+ <text name="Hollow Shape">
+ Oyuk Åžekil
+ </text>
+ <combo_box name="hole">
+ <combo_box.item label="Varsayılan" name="Default"/>
+ <combo_box.item label="Daire" name="Circle"/>
+ <combo_box.item label="Kare" name="Square"/>
+ <combo_box.item label="Üçgen" name="Triangle"/>
+ </combo_box>
+ <text name="text twist">
+ Bük (başlangıç/son)
+ </text>
+ <spinner label="B DÄ°KKAT" name="Twist Begin"/>
+ <spinner label="D - DÄ°KKAT" name="Twist End"/>
+ <text name="scale_taper">
+ Kısalt
+ </text>
+ <text name="scale_hole">
+ Delik Büyüklüğü
+ </text>
+ <spinner label="X" name="Taper Scale X"/>
+ <spinner label="Y" name="Taper Scale Y"/>
+ <text name="text topshear">
+ Üstü Kaydır
+ </text>
+ <spinner label="X" name="Shear X"/>
+ <spinner label="Y" name="Shear Y"/>
+ <text name="advanced_cut">
+ Profili Kes (başlangıç/son)
+ </text>
+ <text name="advanced_dimple">
+ Çukurlaştır (başlangıç/son)
+ </text>
+ <text name="advanced_slice">
+ Dilimle (başlangıç/son)
+ </text>
+ <spinner label="B" name="Path Limit Begin"/>
+ <spinner label="D" name="Path Limit End"/>
+ <text name="text taper2">
+ Kısalt
+ </text>
+ <spinner label="X" name="Taper X"/>
+ <spinner label="Y" name="Taper Y"/>
+ <text name="text radius delta">
+ Yarıçap
+ </text>
+ <text name="text revolutions">
+ Dönüş
+ </text>
+ <texture_picker label="Dokuyu Şekillendir" name="sculpt texture control" tool_tip="Bir resim seçmek için tıklayın"/>
+ <check_box label="Ayna" name="sculpt mirror control" tool_tip="Şekillendirilmiş primi X ekseni etrafında döndürür"/>
+ <check_box label="İçini Dışına Çıkar" name="sculpt invert control" tool_tip="Şekillendirilmiş prim normallerini tersine çevirir, iç kısmı dışarıda gösterir"/>
+ <text name="label sculpt type">
+ Dikiş türü
+ </text>
+ <combo_box name="sculpt type control">
+ <combo_box.item label="Küre" name="Sphere"/>
+ <combo_box.item label="Torus" name="Torus"/>
+ <combo_box.item label="Düzlem" name="Plane"/>
+ <combo_box.item label="Silindir" name="Cylinder"/>
+ </combo_box>
+ </panel>
+ <panel label="Özellikler" name="Features">
+ <panel.string name="None">
+ Hiçbiri
+ </panel.string>
+ <panel.string name="Prim">
+ Prim
+ </panel.string>
+ <panel.string name="Convex Hull">
+ Dışbükey Gövde
+ </panel.string>
+ <text name="select_single">
+ Özelliklerini düzenlemek için sadece bir tane ilkel öğeyi seçin.
+ </text>
+ <text name="edit_object">
+ Nesne özelliklerini düzenleyin:
+ </text>
+ <check_box label="Esnek Yol" name="Flexible1D Checkbox Ctrl" tool_tip="Nesnelerin Z ekseni etrafında esnemesine imkan tanır (sadece istemci tarafında)"/>
+ <spinner label="Yumuşaklık" name="FlexNumSections"/>
+ <spinner label="Yerçekimi" name="FlexGravity"/>
+ <spinner label="Sürükle" name="FlexFriction"/>
+ <spinner label="Rüzgar" name="FlexWind"/>
+ <spinner label="Gerilim" name="FlexTension"/>
+ <spinner label="X Kuvveti" name="FlexForceX"/>
+ <spinner label="Y Kuvveti" name="FlexForceY"/>
+ <spinner label="Z Kuvveti" name="FlexForceZ"/>
+ <check_box label="Işık" name="Light Checkbox Ctrl" tool_tip="Nesnelerin ışık yaymasına neden olur"/>
+ <color_swatch name="colorswatch" tool_tip="Renk seçiciyi açmak için tıklayın"/>
+ <texture_picker label="" name="light texture control" tool_tip="Bir projeksiyon görüntüsü seçmek için tıklayın (sadece ertelenmiş işleme etkinken geçerlidir)"/>
+ <spinner label="YoÄŸunluk" name="Light Intensity"/>
+ <spinner label="Görünüm Alanı" name="Light FOV"/>
+ <spinner label="Yarıçap" name="Light Radius"/>
+ <spinner label="Odak" name="Light Focus"/>
+ <spinner label="Işık Azalması" name="Light Falloff"/>
+ <spinner label="Ambiyans" name="Light Ambiance"/>
+ <text name="label physicsshapetype">
+ Fizik Şekil Türü:
+ </text>
+ <combo_box name="Physics Shape Type Combo Ctrl" tool_tip="Fizik şekil türünü seçin"/>
+ <combo_box name="material">
+ <combo_box.item label="TaÅŸ" name="Stone"/>
+ <combo_box.item label="Metal" name="Metal"/>
+ <combo_box.item label="Cam" name="Glass"/>
+ <combo_box.item label="AhÅŸap" name="Wood"/>
+ <combo_box.item label="Et" name="Flesh"/>
+ <combo_box.item label="Plastik" name="Plastic"/>
+ <combo_box.item label="Lastik" name="Rubber"/>
+ </combo_box>
+ <spinner label="Yerçekimi" name="Physics Gravity"/>
+ <spinner label="Sürtünme" name="Physics Friction"/>
+ <spinner label="100 kg/m3 cinsinden yoÄŸunluk" name="Physics Density"/>
+ <spinner label="Restitüsyon" name="Physics Restitution"/>
+ </panel>
+ <panel label="Doku" name="Texture">
+ <panel.string name="string repeats per meter">
+ Metrede Kaç Kez Tekrarlandığı
+ </panel.string>
+ <panel.string name="string repeats per face">
+ Bir Yüzde Kaç Kez Tekrarlandığı
+ </panel.string>
+ <texture_picker label="Doku" name="texture control" tool_tip="Bir resim seçmek için tıklayın"/>
+ <color_swatch label="Renk" name="colorswatch" tool_tip="Renk seçiciyi açmak için tıklayın"/>
+ <text name="color trans">
+ Saydamlık %
+ </text>
+ <text name="glow label">
+ Parıltı
+ </text>
+ <check_box label="Tam Parlak" name="checkbox fullbright"/>
+ <text name="tex gen">
+ EÅŸleÅŸtirme
+ </text>
+ <combo_box name="combobox texgen">
+ <combo_box.item label="Varsayılan" name="Default"/>
+ <combo_box.item label="Planar" name="Planar"/>
+ </combo_box>
+ <text name="label shininess">
+ Parıldama
+ </text>
+ <combo_box name="combobox shininess">
+ <combo_box.item label="Hiçbiri" name="None"/>
+ <combo_box.item label="Düşük" name="Low"/>
+ <combo_box.item label="Orta" name="Medium"/>
+ <combo_box.item label="Yüksek" name="High"/>
+ </combo_box>
+ <text name="label bumpiness">
+ Yumruluk
+ </text>
+ <combo_box name="combobox bumpiness">
+ <combo_box.item label="Hiçbiri" name="None"/>
+ <combo_box.item label="Parlaklık" name="Brightness"/>
+ <combo_box.item label="Koyuluk" name="Darkness"/>
+ <combo_box.item label="damarlı ahşap" name="woodgrain"/>
+ <combo_box.item label="ağaç kabuğu" name="bark"/>
+ <combo_box.item label="tuÄŸlalar" name="bricks"/>
+ <combo_box.item label="dama tahtası" name="checker"/>
+ <combo_box.item label="beton" name="concrete"/>
+ <combo_box.item label="sert çini" name="crustytile"/>
+ <combo_box.item label="kesilmiÅŸ taÅŸ" name="cutstone"/>
+ <combo_box.item label="diskler" name="discs"/>
+ <combo_box.item label="çakıl" name="gravel"/>
+ <combo_box.item label="petri kabı" name="petridish"/>
+ <combo_box.item label="dış kaplama" name="siding"/>
+ <combo_box.item label="taş çini" name="stonetile"/>
+ <combo_box.item label="stükko" name="stucco"/>
+ <combo_box.item label="vakum" name="suction"/>
+ <combo_box.item label="örgü" name="weave"/>
+ </combo_box>
+ <check_box initial_value="false" label="Planar yüzleri hizala" name="checkbox planar align" tool_tip="Tüm seçili yüzeylerdeki dokuları son seçili yüzdekiyle hizalar. Planar doku eşleştirmesi gerektirir."/>
+ <text name="rpt">
+ Tekrarlar / Yüz
+ </text>
+ <spinner label="Yatay (U)" name="TexScaleU"/>
+ <check_box label="Çevir" name="checkbox flip s"/>
+ <spinner label="Dikey (V)" name="TexScaleV"/>
+ <check_box label="Çevir" name="checkbox flip t"/>
+ <spinner label="Döndürme*" name="TexRot"/>
+ <spinner label="Tekrarlar / Metre" name="rptctrl"/>
+ <button label="Uygula" label_selected="Uygula" name="button apply"/>
+ <text name="tex offset">
+ Doku Dengeleyicisi
+ </text>
+ <spinner label="Yatay (U)" name="TexOffsetU"/>
+ <spinner label="Dikey (V)" name="TexOffsetV"/>
+ <panel name="Add_Media">
+ <text name="media_tex">
+ Ortam
+ </text>
+ <button name="add_media" tool_tip="Ortam Ekle"/>
+ <button name="delete_media" tool_tip="Bu ortam dokusunu sil"/>
+ <button name="edit_media" tool_tip="Bu Ortamı Düzenle"/>
+ <button label="Hizala" label_selected="Ortamı Hizala" name="button align" tool_tip="Ortam dokusunu hizala (önce yüklenmelidir)"/>
+ </panel>
+ </panel>
+ <panel label="İçerik" name="Contents">
+ <button label="Yeni Komut Dosyası" label_selected="Yeni Komut Dosyası" name="button new script"/>
+ <button label="Ä°zinler" name="button permissions"/>
+ </panel>
+ </tab_container>
+ <panel name="land info panel">
+ <text name="label_parcel_info">
+ Parsel Bilgisi
+ </text>
+ <text name="label_area_price">
+ Fiyat: [AREA] m² için L$[PRICE]
+ </text>
+ <text name="label_area">
+ Alan: [AREA] m²
+ </text>
+ <button label="Arazi Hakkında" label_selected="Arazi Hakkında" name="button about land"/>
+ <check_box label="Sahipleri göster" name="checkbox show owners" tool_tip="Sahip türüne göre parselleri renklendir: Yeşil = Sizin araziniz Deniz Mavisi = Grubunuzun arazisi Kırmızı = Başkalarının mülkiyetinde Sarı = Satılık Mor = Açık artırmada Gri = Kamuya açık"/>
+ <text name="label_parcel_modify">
+ Parseli DeÄŸiÅŸtir
+ </text>
+ <button label="Böl" label_selected="Böl" name="button subdivide land"/>
+ <button label="BirleÅŸtir" label_selected="BirleÅŸtir" name="button join land"/>
+ <text name="label_parcel_trans">
+ Arazi Alışverişleri
+ </text>
+ <button label="Arazi Satın Al" label_selected="Arazi Satın Al" name="button buy land"/>
+ <button label="Araziyi Terket" label_selected="Araziyi Terket" name="button abandon land"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_top_objects.xml b/indra/newview/skins/default/xui/tr/floater_top_objects.xml
new file mode 100644
index 0000000000..e726f583cc
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_top_objects.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="top_objects" title="Top Nesneler">
+ <floater.string name="top_scripts_title">
+ Top Komut Dosyaları
+ </floater.string>
+ <floater.string name="top_scripts_text">
+ [COUNT] komut tosyası toplam [TIME] ms sürüyor
+ </floater.string>
+ <floater.string name="scripts_score_label">
+ Süre
+ </floater.string>
+ <floater.string name="scripts_mono_time_label">
+ Mono Süre
+ </floater.string>
+ <floater.string name="top_colliders_title">
+ En Çok Çarpışanlar
+ </floater.string>
+ <floater.string name="top_colliders_text">
+ En çok potansiyel çarpışma yaşayan [COUNT] nesne
+ </floater.string>
+ <floater.string name="colliders_score_label">
+ Skor
+ </floater.string>
+ <floater.string name="none_descriptor">
+ Hiçbiri bulunamadı.
+ </floater.string>
+ <text name="title_text">
+ Yükleniyor...
+ </text>
+ <scroll_list name="objects_list">
+ <scroll_list.columns label="Skor" name="score"/>
+ <scroll_list.columns label="Ad" name="name"/>
+ <scroll_list.columns label="Sahip" name="owner"/>
+ <scroll_list.columns label="Konum" name="location"/>
+ <scroll_list.columns label="Süre" name="time"/>
+ <scroll_list.columns label="Mono Süre" name="mono_time"/>
+ <scroll_list.columns label="URL&apos;ler" name="URLs"/>
+ </scroll_list>
+ <text name="id_text">
+ Nesne KimliÄŸi:
+ </text>
+ <button label="İşareti Göster" name="show_beacon_btn"/>
+ <text name="obj_name_text">
+ Nesne adı:
+ </text>
+ <button label="Filtrele" name="filter_object_btn"/>
+ <text name="owner_name_text">
+ Sahip:
+ </text>
+ <button label="Filtrele" name="filter_owner_btn"/>
+ <button label="Seçileni İade Et" name="return_selected_btn"/>
+ <button label="Tümünü İade Et" name="return_all_btn"/>
+ <button label="Seçileni Devre Dışı Bırak" name="disable_selected_btn"/>
+ <button label="Tümüni Devre Dışı Bırak" name="disable_all_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_tos.xml b/indra/newview/skins/default/xui/tr/floater_tos.xml
new file mode 100644
index 0000000000..7ff0001ddd
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_tos.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="modal container">
+ <floater.string name="real_url">
+ http://secondlife.com/app/tos/
+ </floater.string>
+ <floater.string name="loading_url">
+ data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Loading %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
+ </floater.string>
+ <button label="Devam Et" label_selected="Devam Et" name="Continue"/>
+ <button label="Ä°ptal" label_selected="Ä°ptal" name="Cancel"/>
+ <check_box label="Hizmet Koşullarını ve Gizlilik Politikasını Kabul Ediyorum" name="agree_chk"/>
+ <text name="tos_heading">
+ Aşağıdaki Hizmet Koşullarını ve Gizlilik Politikasını dikkatle okuyun. [SECOND_LIFE]&apos;ta oturum açmaya devam etmek için anlaşmayı kabul etmelisiniz.
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_toybox.xml b/indra/newview/skins/default/xui/tr/floater_toybox.xml
new file mode 100644
index 0000000000..e60e176643
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_toybox.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Toybox" title="ARAÇ ÇUBUĞU DÜĞMELERİ">
+ <text name="toybox label 1">
+ Düğmeleri araç çubuklarına veya araç çubuklarından sürükleyerek ekleyin ya da kaldırın.
+ </text>
+ <text name="toybox label 2">
+ Her bir araç çubuğunun ayarına göre düğmeler gösterilir veya sadece simgeleri yer alır.
+ </text>
+ <button label="Tüm araç çubuklarını temizle" label_selected="Tüm araç çubuklarını temizle" name="btn_clear_all"/>
+ <button label="Varsayılanları geri yükle" label_selected="Varsayılanları geri yükle" name="btn_restore_defaults"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_translation_settings.xml b/indra/newview/skins/default/xui/tr/floater_translation_settings.xml
new file mode 100644
index 0000000000..33ce76bd9a
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_translation_settings.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_translation_settings" title="SOHBET ÇEVİRİSİ AYARLARI">
+ <string name="bing_api_key_not_verified">
+ Bing uygulama kimliği doğrulanmadı. Lütfen tekrar deneyin.
+ </string>
+ <string name="google_api_key_not_verified">
+ Google API anahtarı doğrulanmadı. Lütfen tekrar deneyin.
+ </string>
+ <string name="bing_api_key_verified">
+ Bing uygulama kimliği doğrulandı.
+ </string>
+ <string name="google_api_key_verified">
+ Google API anahtarı doğrulandı.
+ </string>
+ <check_box label="Sohbet ederken makine çevirisini etkinleştirin" name="translate_chat_checkbox"/>
+ <text name="translate_language_label">
+ Sohbeti şu dile çevir:
+ </text>
+ <combo_box name="translate_language_combo">
+ <combo_box.item label="Sistem Varsayılanı" name="System Default Language"/>
+ <combo_box.item label="Ä°ngilizce" name="English"/>
+ <combo_box.item label="Dansk (Danca)" name="Danish"/>
+ <combo_box.item label="Deutsch (Almanca)" name="German"/>
+ <combo_box.item label="Español (İspanyolca)" name="Spanish"/>
+ <combo_box.item label="Français (Fransızca)" name="French"/>
+ <combo_box.item label="Italiano (Ä°talyanca)" name="Italian"/>
+ <combo_box.item label="Magyar (Macarca)" name="Hungarian"/>
+ <combo_box.item label="Nederlands (Flemenkçe)" name="Dutch"/>
+ <combo_box.item label="Polski (Lehçe)" name="Polish"/>
+ <combo_box.item label="Português (Portekizce)" name="Portugese"/>
+ <combo_box.item label="РуÑÑкий (Rusça)" name="Russian"/>
+ <combo_box.item label="Türkçe (Türkçe)" name="Turkish"/>
+ <combo_box.item label="УкраїнÑька (Ukraynaca)" name="Ukrainian"/>
+ <combo_box.item label="中文 (正體) (Çince)" name="Chinese"/>
+ <combo_box.item label="日本語 (Japonca)" name="Japanese"/>
+ <combo_box.item label="한국어 (Korece)" name="Korean"/>
+ </combo_box>
+ <text name="tip">
+ Çeviri hizmetini seçin:
+ </text>
+ <radio_group name="translation_service_rg">
+ <radio_item initial_value="bing" label="Bing Çevirmeni" name="bing"/>
+ <radio_item initial_value="google" label="Google Translate" name="google"/>
+ </radio_group>
+ <text name="bing_api_key_label">
+ Bing [http://www.bing.com/developers/createapp.aspx Uygulama KimliÄŸi]:
+ </text>
+ <button label="DoÄŸrula" name="verify_bing_api_key_btn"/>
+ <text name="google_api_key_label">
+ Google [http://code.google.com/apis/language/translate/v2/getting_started.html#auth API anahtarı]:
+ </text>
+ <button label="DoÄŸrula" name="verify_google_api_key_btn"/>
+ <text name="google_links_text">
+ [http://code.google.com/apis/language/translate/v2/pricing.html Fiyatlandırma] | [https://code.google.com/apis/console İstatistikler]
+ </text>
+ <button label="Tamam" name="ok_btn"/>
+ <button label="Ä°ptal" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_url_entry.xml b/indra/newview/skins/default/xui/tr/floater_url_entry.xml
new file mode 100644
index 0000000000..54c5b047a8
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_url_entry.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="url_entry">
+ <text name="media_label">
+ Ortam URL&apos;si:
+ </text>
+ <button label="Tamam" name="ok_btn"/>
+ <button label="Ä°ptal" name="cancel_btn"/>
+ <button label="Temizle" name="clear_btn"/>
+ <text name="loading_label">
+ Yükleniyor...
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_voice_controls.xml b/indra/newview/skins/default/xui/tr/floater_voice_controls.xml
new file mode 100644
index 0000000000..5ff0804f17
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_voice_controls.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_voice_controls" title="SES DENETÄ°MLERÄ°">
+ <string name="title_nearby">
+ SES AYARLARI
+ </string>
+ <string name="title_group">
+ [GROUP] Ä°LE GRUP ARAMASI
+ </string>
+ <string name="title_adhoc">
+ KONFERANS ARAMASI
+ </string>
+ <string name="title_peer_2_peer">
+ [NAME] Ä°LE ARAMA
+ </string>
+ <string name="no_one_near">
+ Yakındaki kimsede ses etkin değil
+ </string>
+ <layout_stack name="my_call_stack">
+ <layout_panel name="my_panel">
+ <text name="user_text" value="Avatarım:"/>
+ </layout_panel>
+ <layout_panel name="leave_call_panel">
+ <layout_stack name="voice_effect_and_leave_call_stack">
+ <layout_panel name="leave_call_btn_panel">
+ <button label="Aramadan Ayrıl" name="leave_call_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_voice_effect.xml b/indra/newview/skins/default/xui/tr/floater_voice_effect.xml
new file mode 100644
index 0000000000..3534a3fe90
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_voice_effect.xml
@@ -0,0 +1,159 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater label="Yerler" name="voice_effects" title="SES ÅžEKÄ°LLENDÄ°RME">
+ <string name="no_voice_effect">
+ (Ses Åžekillendirme Yok)
+ </string>
+ <string name="active_voice_effect">
+ (Etkin)
+ </string>
+ <string name="unsubscribed_voice_effect">
+ (Abonelik Ä°ptal)
+ </string>
+ <string name="new_voice_effect">
+ (Yeni!)
+ </string>
+ <string name="effect_Arena">
+ Arena
+ </string>
+ <string name="effect_Beast">
+ Yaratık
+ </string>
+ <string name="effect_Buff">
+ Yapılı
+ </string>
+ <string name="effect_Buzz">
+ Vızıltı
+ </string>
+ <string name="effect_Camille">
+ Camille
+ </string>
+ <string name="effect_Creepy">
+ Korkutucu
+ </string>
+ <string name="effect_CreepyBot">
+ KorkutucuBot
+ </string>
+ <string name="effect_Cyber">
+ Siber
+ </string>
+ <string name="effect_DeepBot">
+ DerinBot
+ </string>
+ <string name="effect_Demon">
+ Ä°blis
+ </string>
+ <string name="effect_Female Elf">
+ DiÅŸi Cin
+ </string>
+ <string name="effect_Flirty">
+ Cilveli
+ </string>
+ <string name="effect_Foxy">
+ Alımlı
+ </string>
+ <string name="effect_Halloween 2010 Bonus">
+ Halloween_2010_Bonus
+ </string>
+ <string name="effect_Helium">
+ Helyum
+ </string>
+ <string name="effect_Husky">
+ Güçlü
+ </string>
+ <string name="effect_Husky Whisper">
+ Boğuk Fısıltı
+ </string>
+ <string name="effect_Intercom">
+ Ä°nterkom
+ </string>
+ <string name="effect_Julia">
+ Julia
+ </string>
+ <string name="effect_Lo Lilt">
+ Yavaş Mırıltı
+ </string>
+ <string name="effect_Macho">
+ Maço
+ </string>
+ <string name="effect_Micro">
+ Mikro
+ </string>
+ <string name="effect_Mini">
+ Mini
+ </string>
+ <string name="effect_Model">
+ Model
+ </string>
+ <string name="effect_Nano">
+ Nano
+ </string>
+ <string name="effect_Nightmare">
+ Kabus
+ </string>
+ <string name="effect_PopBot">
+ PopBot
+ </string>
+ <string name="effect_Rachel">
+ Rachel
+ </string>
+ <string name="effect_Radio">
+ Radyo
+ </string>
+ <string name="effect_Robot">
+ Robot
+ </string>
+ <string name="effect_Roxanne">
+ Roxanne
+ </string>
+ <string name="effect_Rumble">
+ Gurultu
+ </string>
+ <string name="effect_Sabrina">
+ Sabrina
+ </string>
+ <string name="effect_Samantha">
+ Samantha
+ </string>
+ <string name="effect_Sexy">
+ Seksi
+ </string>
+ <string name="effect_Shorty">
+ Bücür
+ </string>
+ <string name="effect_Smaller">
+ Daha Küçük
+ </string>
+ <string name="effect_Sneaky">
+ Sinsi
+ </string>
+ <string name="effect_Stallion">
+ Maskülen
+ </string>
+ <string name="effect_Sultry">
+ İhtiraslı
+ </string>
+ <string name="effect_Thunder">
+ Gök gürültüsü
+ </string>
+ <string name="effect_Vixen">
+ Çekici
+ </string>
+ <string name="effect_WhinyBot">
+ AÄŸlakBot
+ </string>
+ <text name="preview_text">
+ Önizleme için
+ </text>
+ <text name="status_text">
+ Bir örnek kaydettikten sonra sese tıklayarak nasıl olduğunu duyun.
+ </text>
+ <button label="Kaydet" name="record_btn" tool_tip="Sesinizin örneğini kaydedin."/>
+ <button label="Durdur" name="record_stop_btn"/>
+ <text name="voice_morphing_link">
+ [[URL] Hemen Abone Ol]
+ </text>
+ <scroll_list name="voice_effect_list" tool_tip="Sesinizin örneğini kaydettikten sonra önizleme için bir efekte tıklayın.">
+ <scroll_list.columns label="Ses Adı" name="name"/>
+ <scroll_list.columns label="BitiÅŸ Tarihi" name="expires"/>
+ </scroll_list>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_water.xml b/indra/newview/skins/default/xui/tr/floater_water.xml
new file mode 100644
index 0000000000..66d6c1e30d
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_water.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Water Floater" title="GELÄ°ÅžMÄ°Åž SU DÃœZENLEYÄ°CÄ°">
+ <floater.string name="WLDefaultWaterNames">
+ Varsayılan:Camsı:Havuz:çamurlu:İkinci Veba:YILAN!!!:Valdez
+ </floater.string>
+ <text name="KeyFramePresetsText">
+ Su Ön Ayarları:
+ </text>
+ <button label="Yeni" label_selected="Yeni" name="WaterNewPreset"/>
+ <button label="Kaydet" label_selected="Kaydet" name="WaterSavePreset"/>
+ <button label="Sil" label_selected="Sil" name="WaterDeletePreset"/>
+ <tab_container name="Water Tabs">
+ <panel label="AYARLAR" name="Settings">
+ <text name="BHText">
+ Su Sisi Rengi
+ </text>
+ <color_swatch name="WaterFogColor" tool_tip="Renk seçiciyi açmak için tıklayın"/>
+ <text name="WaterFogDensText">
+ Su Yoğunluk Üssü
+ </text>
+ <text name="WaterUnderWaterFogModText">
+ Sualtı Sis Değiştiricisi
+ </text>
+ <text name="BDensText">
+ Yansıma Dalgacığı Ölçeği
+ </text>
+ <slider label="1" name="WaterNormalScaleX"/>
+ <slider label="2" name="WaterNormalScaleY"/>
+ <slider label="3" name="WaterNormalScaleZ"/>
+ <text name="HDText">
+ Fresnel Ölçeği
+ </text>
+ <text name="FresnelOffsetText">
+ Fresnel Dengeleyicisi
+ </text>
+ <text name="DensMultText">
+ Yukarıdan Kırılma Ölçeği
+ </text>
+ <text name="WaterScaleBelowText">
+ Aşağıdan Kırılma Ölçeği
+ </text>
+ <text name="MaxAltText">
+ Bulanıklaştırma Çarpanı
+ </text>
+ </panel>
+ <panel label="GÖRÜNTÜ" name="Waves">
+ <text name="BHText">
+ Büyük Dalga Yönü
+ </text>
+ <text name="WaterWave1DirXText">
+ X
+ </text>
+ <text name="WaterWave1DirYText">
+ Y
+ </text>
+ <text name="BHText2">
+ Küçük Dalga Yönü
+ </text>
+ <text name="WaterWave2DirXText">
+ X
+ </text>
+ <text name="WaterWave2DirYText">
+ Y
+ </text>
+ <text name="BHText3">
+ Normal Harita
+ </text>
+ </panel>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_web_content.xml b/indra/newview/skins/default/xui/tr/floater_web_content.xml
new file mode 100644
index 0000000000..93491b80fb
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_web_content.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_web_content" title="">
+ <layout_stack name="stack1">
+ <layout_panel name="nav_controls">
+ <button name="back" tool_tip="Geri Git"/>
+ <button name="forward" tool_tip="Ä°leri Git"/>
+ <button name="stop" tool_tip="Navigasyonu durdur"/>
+ <button name="reload" tool_tip="Sayfayı tekrar yükle"/>
+ <combo_box name="address" tool_tip="URL&apos;yi buraya gir"/>
+ <icon name="media_secure_lock_flag" tool_tip="Güvenli Tarama"/>
+ <button name="popexternal" tool_tip="Mevcut URL&apos;yi masaüstü tarayıcıda aç"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_whitelist_entry.xml b/indra/newview/skins/default/xui/tr/floater_whitelist_entry.xml
new file mode 100644
index 0000000000..1a9f731af0
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_whitelist_entry.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="whitelist_entry" title="GÜVENİLENLER LİSTESİ GİRİŞİ">
+ <text name="media_label">
+ İzin verilen alan adlarının listesine eklemek için bir URL ya da URL örneği girin
+ </text>
+ <line_editor name="whitelist_entry" tool_tip="Güvenilenler Listesine eklemek için bir URL ya da URL örneği girin"/>
+ <button label="Tamam" name="ok_btn"/>
+ <button label="Ä°ptal" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_windlight_options.xml b/indra/newview/skins/default/xui/tr/floater_windlight_options.xml
new file mode 100644
index 0000000000..6c5fba374c
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_windlight_options.xml
@@ -0,0 +1,167 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="WindLight floater" title="GELİŞMİŞ GÖKYÜZÜ DÜZENLEYİCİ">
+ <floater.string name="WLDefaultSkyNames">
+ A-12:A-24:A-3:A-15:A-16.30:A-6:A-18:A-9:A-21:Barselona:Tipi:Mavi Gün Ortası:Sahilde Öğleden Sonra:Sahilde Gün Batımı:Varsayılan:Çölde Gün Batımı:Güzel Bir Gün:Kabarık Büyük Bulutlar:Sisli:Şık Şık:Şık Şık Şık:Dondurma:Hayalet:Uygunsuz Gerçekler:Gün Ortası1:Gün Ortası 2:Gün Ortası 3:Gün Ortası 4:Gece:Korsan:Mor:Denizcinin Keyfi:Saf Tensel
+ </floater.string>
+ <text name="KeyFramePresetsText">
+ Gökyüzü Ön Ayarları:
+ </text>
+ <button label="Yeni" label_selected="Yeni" name="WLNewPreset"/>
+ <button label="Kaydet" label_selected="Kaydet" name="WLSavePreset"/>
+ <button label="Sil" label_selected="Sil" name="WLDeletePreset"/>
+ <button label="Gün Döngüsü Düzenleyici" label_selected="Gün Döngüsü Düzenleyici" name="WLDayCycleMenuButton"/>
+ <tab_container name="WindLight Tabs">
+ <panel label="ATMOSFER" name="Atmosphere">
+ <text name="BHText">
+ Mavi Ufuk
+ </text>
+ <text name="BHText2">
+ R
+ </text>
+ <text name="BHText3">
+ G
+ </text>
+ <text name="BHText4">
+ B
+ </text>
+ <text name="BHText5">
+ I
+ </text>
+ <text name="BDensText">
+ Puslu Ufuk
+ </text>
+ <text name="BDensText2">
+ Mavi YoÄŸunluÄŸu
+ </text>
+ <text name="BHText6">
+ R
+ </text>
+ <text name="BHText7">
+ G
+ </text>
+ <text name="BHText8">
+ B
+ </text>
+ <text name="BHText9">
+ I
+ </text>
+ <text name="HDText">
+ Pus YoÄŸunluÄŸu
+ </text>
+ <text name="DensMultText">
+ Yoğunluk Çarpanı
+ </text>
+ <text name="WLDistanceMultText">
+ Mesafe Çarpanı
+ </text>
+ <text name="MaxAltText">
+ Maks Ä°rtifa
+ </text>
+ </panel>
+ <panel label="AYDINLATMA" name="Lighting">
+ <text name="SLCText">
+ Güneş/Ay Rengi
+ </text>
+ <text name="BHText">
+ R
+ </text>
+ <text name="BHText2">
+ G
+ </text>
+ <text name="BHText3">
+ B
+ </text>
+ <text name="BHText4">
+ I
+ </text>
+ <text name="TODText">
+ Güneş/Ay Konumu
+ </text>
+ <text name="WLAmbientText">
+ Ortam
+ </text>
+ <text name="BHText5">
+ R
+ </text>
+ <text name="BHText6">
+ G
+ </text>
+ <text name="BHText7">
+ B
+ </text>
+ <text name="BHText8">
+ I
+ </text>
+ <text name="WLEastAngleText">
+ Doğu Açısı
+ </text>
+ <text name="SunGlowText">
+ Güneş Parıltısı
+ </text>
+ <slider label="Odak" name="WLGlowB"/>
+ <slider label="Büyüklük" name="WLGlowR"/>
+ <text name="SceneGammaText">
+ Sahne Gaması
+ </text>
+ <text name="WLStarText">
+ Yıldız Parlaklığı
+ </text>
+ </panel>
+ <panel label="BULUTLAR" name="Clouds">
+ <text name="WLCloudColorText">
+ Bulut Rengi
+ </text>
+ <text name="BHText">
+ R
+ </text>
+ <text name="BHText2">
+ G
+ </text>
+ <text name="BHText3">
+ B
+ </text>
+ <text name="BHText4">
+ I
+ </text>
+ <text name="WLCloudColorText2">
+ Bulut XY/YoÄŸunluÄŸu
+ </text>
+ <text name="BHText5">
+ X
+ </text>
+ <text name="BHText6">
+ Y
+ </text>
+ <text name="BHText7">
+ D
+ </text>
+ <text name="WLCloudCoverageText">
+ Bulut Örtüsü
+ </text>
+ <text name="WLCloudScaleText">
+ Bulut Yüksekliği
+ </text>
+ <text name="WLCloudDetailText">
+ Bulut Ayrıntısı (XY/Yoğunluğu)
+ </text>
+ <text name="BHText8">
+ X
+ </text>
+ <text name="BHText9">
+ Y
+ </text>
+ <text name="BHText10">
+ D
+ </text>
+ <text name="WLCloudScrollXText">
+ Bulut Kaydırma X
+ </text>
+ <check_box label="Kilitle" name="WLCloudLockX"/>
+ <text name="WLCloudScrollYText">
+ Bulut Kaydırma Y
+ </text>
+ <check_box label="Kilitle" name="WLCloudLockY"/>
+ <check_box label="Klasik Bulutlar Çiz" name="DrawClassicClouds"/>
+ </panel>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_window_size.xml b/indra/newview/skins/default/xui/tr/floater_window_size.xml
new file mode 100644
index 0000000000..acc2cc3376
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_window_size.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="window_size" title="PENCERE BÜYÜKLÜĞÜ">
+ <string name="resolution_format">
+ [RES_X] x [RES_Y]
+ </string>
+ <text name="windowsize_text">
+ Pencere büyüklüğünü ayarla:
+ </text>
+ <combo_box name="window_size_combo" tool_tip="genişlik x yükseklik">
+ <combo_box.item label="1000 x 700 (varsayılan)" name="item0"/>
+ <combo_box.item label="1024 x 768" name="item1"/>
+ <combo_box.item label="1280 x 720 (720p)" name="item2"/>
+ <combo_box.item label="1920 x 1080 (1080p)" name="item3"/>
+ </combo_box>
+ <button label="Ayarla" name="set_btn"/>
+ <button label="Ä°ptal" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_world_map.xml b/indra/newview/skins/default/xui/tr/floater_world_map.xml
new file mode 100644
index 0000000000..e4729c2aed
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/floater_world_map.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="worldmap" title="DÃœNYA HARÄ°TASI">
+ <panel name="layout_panel_1">
+ <text name="events_label">
+ Lejand
+ </text>
+ </panel>
+ <panel name="layout_panel_2">
+ <button name="Show My Location" tool_tip="Haritanın merkezi avatarımın konumu olsun"/>
+ <text name="me_label">
+ Ben
+ </text>
+ <text name="person_label">
+ KiÅŸi
+ </text>
+ <text name="infohub_label">
+ Bilgi Ä°stasyonu
+ </text>
+ <text name="land_sale_label">
+ Arazi Satışı
+ </text>
+ <text name="auction_label">
+ arazi açık artırması
+ </text>
+ <text name="by_owner_label">
+ sahibi tarafından
+ </text>
+ <button name="Go Home" tool_tip="Ana konumuma ışınla"/>
+ <text name="Home_label">
+ Ana konum
+ </text>
+ <text name="events_label">
+ Etkinlikler:
+ </text>
+ <text name="pg_label">
+ Genel
+ </text>
+ <check_box initial_value="true" name="events_mature_chk"/>
+ <text name="events_mature_label">
+ Orta
+ </text>
+ <text name="events_adult_label">
+ YetiÅŸkin
+ </text>
+ </panel>
+ <panel name="layout_panel_3">
+ <text name="find_on_map_label">
+ Haritada Bul
+ </text>
+ </panel>
+ <panel name="layout_panel_4">
+ <combo_box label="Çevrimiçi Arkadaşlar" name="friend combo" tool_tip="Haritada arkadaşlar gösterilsin">
+ <combo_box.item label="Çevrimiçi Arkadaşlarım" name="item1"/>
+ </combo_box>
+ <combo_box label="Yer İmlerim" name="landmark combo" tool_tip="Haritada gösterilecek yer imi">
+ <combo_box.item label="Yer Ä°mlerim" name="item1"/>
+ </combo_box>
+ <search_editor label="Adlarına Göre Bölgeler" name="location" tool_tip="Bir bölgenin adını yazın"/>
+ <button label="Bul" name="DoSearch" tool_tip="Bölge ara"/>
+ <button name="Clear" tool_tip="Takip çizgilerini temizle ve haritayı sıfırla"/>
+ <text name="events_label">
+ Konum:
+ </text>
+ <button label="Işınla" name="Teleport" tool_tip="Seçilen konuma ışınla"/>
+ <button label="SLurl&apos;i Kopyala" name="copy_slurl" tool_tip="Mevcut konumu, web üzerinde kullanılması için SLurl olarak kopyalar."/>
+ <button label="Seçimi Göster" name="Show Destination" tool_tip="Haritanın merkezi seçilen konum olsun"/>
+ </panel>
+ <panel name="layout_panel_5">
+ <text name="zoom_label">
+ Yakınlaştır
+ </text>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/inspect_avatar.xml b/indra/newview/skins/default/xui/tr/inspect_avatar.xml
new file mode 100644
index 0000000000..cb3c7e9282
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/inspect_avatar.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_avatar">
+ <string name="Subtitle">
+ [AGE]
+ </string>
+ <string name="Details">
+ [SL_PROFILE]
+ </string>
+ <text name="user_subtitle" value="11 ay, 3 günlük"/>
+ <text name="user_details">
+ Second Life içerisindeki tanımım bu, harika olduğunu düşünüyorum. Ama nedense tanımım gerçekten çok uzun çünkü çok konuşmayı seviyorum.
+ </text>
+ <slider name="volume_slider" tool_tip="Ses düzeyi" value="0.5"/>
+ <button label="ArkadaÅŸ Ekle" name="add_friend_btn"/>
+ <button label="AÄ°" name="im_btn"/>
+ <button label="Profil" name="view_profile_btn"/>
+ <panel name="moderator_panel">
+ <button label="Sesi Devre Dışı Bırak" name="disable_voice"/>
+ <button label="Sesi EtkinleÅŸtir" name="enable_voice"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/inspect_group.xml b/indra/newview/skins/default/xui/tr/inspect_group.xml
new file mode 100644
index 0000000000..9b130c9ef6
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/inspect_group.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_group">
+ <string name="PrivateGroup">
+ Özel grup
+ </string>
+ <string name="FreeToJoin">
+ Katılım ücretsiz
+ </string>
+ <string name="CostToJoin">
+ Katılmak için L$[AMOUNT] gerekiyor
+ </string>
+ <string name="YouAreMember">
+ Siz üyesiniz
+ </string>
+ <text name="group_subtitle">
+ 123 üye
+ </text>
+ <text name="group_details">
+ İçinde geyik olan bir oda oluşturmakla sorumlu bir grup insan.
+Geyikten korkun! Korkun! Firavun faresinden de!
+ </text>
+ <text name="group_cost">
+ Katılmak için L$123 gerekiyor
+ </text>
+ <button label="Katıl" name="join_btn"/>
+ <button label="Ayrıl" name="leave_btn"/>
+ <button label="Profili Göster" name="view_profile_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/inspect_object.xml b/indra/newview/skins/default/xui/tr/inspect_object.xml
new file mode 100644
index 0000000000..bd09267319
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/inspect_object.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_object">
+ <string name="Creator">
+ [CREATOR] tarafından
+ </string>
+ <string name="CreatorAndOwner">
+ [CREATOR] tarafından
+Sahip [OWNER]
+ </string>
+ <string name="Price">
+ L$[AMOUNT]
+ </string>
+ <string name="PriceFree">
+ Ãœcretsiz!
+ </string>
+ <string name="Touch">
+ Dokun
+ </string>
+ <string name="Sit">
+ Otur
+ </string>
+ <text name="object_creator">
+ şunun tarafından: secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about
+sahip: secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about
+ </text>
+ <text name="price_text">
+ L$30,000
+ </text>
+ <icon name="secure_browsing" tool_tip="Güvenli Tarama"/>
+ <text name="object_media_url">
+ http://www.superdupertest.com
+ </text>
+ <button label="Satın Al" name="buy_btn"/>
+ <button label="Öde" name="pay_btn"/>
+ <button label="Kopya Al" name="take_free_copy_btn"/>
+ <button label="Dokun" name="touch_btn"/>
+ <button label="Otur" name="sit_btn"/>
+ <button label="Aç" name="open_btn"/>
+ <button label="Daha Fazla" name="more_info_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/inspect_remote_object.xml b/indra/newview/skins/default/xui/tr/inspect_remote_object.xml
new file mode 100644
index 0000000000..4b696b2ae5
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/inspect_remote_object.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_remote_object">
+ <text name="object_name">
+ Çok Uzun Test Nesne Adı Aman Tanrım bu gerçekten o kadar uzun bir nesne adı ki bu kadar uzun olduğuna inanmıyorum.
+ </text>
+ <text name="object_owner_label">
+ Sahip:
+ </text>
+ <text name="object_owner">
+ Uzunavataradı Farukkalaycigillerdendegil
+ </text>
+ <text name="object_slurl">
+ http://slurl.com/Ahern/50/50/50
+ </text>
+ <button label="Harita" name="map_btn"/>
+ <button label="Engelle" name="block_btn"/>
+ <button label="Kapat" name="close_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/tr/menu_add_wearable_gear.xml b/indra/newview/skins/default/xui/tr/menu_add_wearable_gear.xml
new file mode 100644
index 0000000000..dcb4629259
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_add_wearable_gear.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Add Wearable Gear Menu">
+ <menu_item_check label="En Sonunculara Göre Sırala" name="sort_by_most_recent"/>
+ <menu_item_check label="Ada Göre Sırala" name="sort_by_name"/>
+ <menu_item_check label="Türe Göre Sırala" name="sort_by_type"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_attachment_other.xml b/indra/newview/skins/default/xui/tr/menu_attachment_other.xml
new file mode 100644
index 0000000000..9ba214ff31
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_attachment_other.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- *NOTE: See also menu_avatar_other.xml -->
+<context_menu name="Avatar Pie">
+ <menu_item_call label="Profili Göster" name="Profile..."/>
+ <menu_item_call label="ArkadaÅŸ Ekle" name="Add Friend"/>
+ <menu_item_call label="AÄ°" name="Send IM..."/>
+ <menu_item_call label="Ara" name="Call"/>
+ <menu_item_call label="Gruba Davet Et" name="Invite..."/>
+ <menu_item_call label="Engelle" name="Avatar Mute"/>
+ <menu_item_call label="Raporla" name="abuse"/>
+ <menu_item_call label="Dondur" name="Freeze..."/>
+ <menu_item_call label="Çıkar" name="Eject..."/>
+ <menu_item_call label="Dokularda Hata Ayıkla" name="Debug..."/>
+ <menu_item_call label="Yakınlaştır" name="Zoom In"/>
+ <menu_item_call label="Öde" name="Pay..."/>
+ <menu_item_call label="Nesne Profili" name="Object Inspect"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_attachment_self.xml b/indra/newview/skins/default/xui/tr/menu_attachment_self.xml
new file mode 100644
index 0000000000..16d1e3f356
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_attachment_self.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Attachment Pie">
+ <menu_item_call label="Dokun" name="Attachment Object Touch"/>
+ <menu_item_call label="Düzenle" name="Edit..."/>
+ <menu_item_call label="Ayır" name="Detach"/>
+ <menu_item_call label="Otur" name="Sit Down Here"/>
+ <menu_item_call label="Kalk" name="Stand Up"/>
+ <menu_item_call label="Görünümüm" name="Change Outfit"/>
+ <menu_item_call label="Dış Görünümümü Düzenle" name="Edit Outfit"/>
+ <menu_item_call label="Şeklimi Düzenle" name="Edit My Shape"/>
+ <menu_item_call label="Arkadaşlarım" name="Friends..."/>
+ <menu_item_call label="Gruplarım" name="Groups..."/>
+ <menu_item_call label="Profilim" name="Profile..."/>
+ <menu_item_call label="Dokularda Hata Ayıkla" name="Debug..."/>
+ <menu_item_call label="Bırak" name="Drop"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_avatar_icon.xml b/indra/newview/skins/default/xui/tr/menu_avatar_icon.xml
new file mode 100644
index 0000000000..d3ef490735
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_avatar_icon.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Avatar Icon Menu">
+ <menu_item_call label="Profili Göster" name="Show Profile"/>
+ <menu_item_call label="Aİ Gönder..." name="Send IM"/>
+ <menu_item_call label="ArkadaÅŸ Ekle..." name="Add Friend"/>
+ <menu_item_call label="Arkadaşı Çıkar..." name="Remove Friend"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_avatar_other.xml b/indra/newview/skins/default/xui/tr/menu_avatar_other.xml
new file mode 100644
index 0000000000..7d691d2ac5
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_avatar_other.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- *NOTE: See also menu_attachment_other.xml -->
+<context_menu name="Avatar Pie">
+ <menu_item_call label="Profili Göster" name="Profile..."/>
+ <menu_item_call label="ArkadaÅŸ Ekle" name="Add Friend"/>
+ <menu_item_call label="AÄ°" name="Send IM..."/>
+ <menu_item_call label="Ara" name="Call"/>
+ <menu_item_call label="Gruba Davet Et" name="Invite..."/>
+ <menu_item_call label="Engelle" name="Avatar Mute"/>
+ <menu_item_call label="Raporla" name="abuse"/>
+ <menu_item_call label="Dondur" name="Freeze..."/>
+ <menu_item_call label="Çıkar" name="Eject..."/>
+ <menu_item_call label="Dokularda Hata Ayıkla" name="Debug..."/>
+ <menu_item_call label="Yakınlaştır" name="Zoom In"/>
+ <menu_item_call label="Öde" name="Pay..."/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_avatar_self.xml b/indra/newview/skins/default/xui/tr/menu_avatar_self.xml
new file mode 100644
index 0000000000..c520aff521
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_avatar_self.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Self Pie">
+ <menu_item_call label="Otur" name="Sit Down Here"/>
+ <menu_item_call label="Kalk" name="Stand Up"/>
+ <context_menu label="Çıkar" name="Take Off &gt;">
+ <context_menu label="Giysiler" name="Clothes &gt;">
+ <menu_item_call label="Gömlek" name="Shirt"/>
+ <menu_item_call label="Pantolon" name="Pants"/>
+ <menu_item_call label="Etek" name="Skirt"/>
+ <menu_item_call label="Ayakkabılar" name="Shoes"/>
+ <menu_item_call label="Çoraplar" name="Socks"/>
+ <menu_item_call label="Ceket" name="Jacket"/>
+ <menu_item_call label="Eldivenler" name="Gloves"/>
+ <menu_item_call label="Fanila" name="Self Undershirt"/>
+ <menu_item_call label="Külot" name="Self Underpants"/>
+ <menu_item_call label="Dövme" name="Self Tattoo"/>
+ <menu_item_call label="Fizik" name="Self Physics"/>
+ <menu_item_call label="Alfa" name="Self Alpha"/>
+ <menu_item_call label="Tüm Giysiler" name="All Clothes"/>
+ </context_menu>
+ <context_menu label="BÃœG" name="Object Detach HUD"/>
+ <context_menu label="Ayır" name="Object Detach"/>
+ <menu_item_call label="Tümünü Ayır" name="Detach All"/>
+ </context_menu>
+ <menu_item_call label="Görünümüm" name="Chenge Outfit"/>
+ <menu_item_call label="Dış Görünümümü Düzenle" name="Edit Outfit"/>
+ <menu_item_call label="Şeklimi Düzenle" name="Edit My Shape"/>
+ <menu_item_call label="Arkadaşlarım" name="Friends..."/>
+ <menu_item_call label="Gruplarım" name="Groups..."/>
+ <menu_item_call label="Profilim" name="Profile..."/>
+ <menu_item_call label="Dokularda Hata Ayıkla" name="Debug..."/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_bottomtray.xml b/indra/newview/skins/default/xui/tr/menu_bottomtray.xml
new file mode 100644
index 0000000000..f17c0f9971
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_bottomtray.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="hide_camera_move_controls_menu">
+ <menu_item_check label="Konuşma Düğmesi" name="EnableVoiceChat"/>
+ <menu_item_check label="Mimik düğmesi" name="ShowGestureButton"/>
+ <menu_item_check label="Taşıma düğmesi" name="ShowMoveButton"/>
+ <menu_item_check label="Görüntüleme düğmesi" name="ShowCameraButton"/>
+ <menu_item_check label="Anlık görüntü düğmesi" name="ShowSnapshotButton"/>
+ <menu_item_check label="İnşa Et düğmesi" name="ShowBuildButton"/>
+ <menu_item_check label="Arama düğmesi" name="ShowSearchButton"/>
+ <menu_item_check label="Harita düğmesi" name="ShowWorldMapButton"/>
+ <menu_item_check label="Mini-harita düğmesi" name="ShowMiniMapButton"/>
+ <menu_item_call label="Kes" name="NearbyChatBar_Cut"/>
+ <menu_item_call label="Kopyala" name="NearbyChatBar_Copy"/>
+ <menu_item_call label="Yapıştır" name="NearbyChatBar_Paste"/>
+ <menu_item_call label="Sil" name="NearbyChatBar_Delete"/>
+ <menu_item_call label="Tümünü Seç" name="NearbyChatBar_Select_All"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_cof_attachment.xml b/indra/newview/skins/default/xui/tr/menu_cof_attachment.xml
new file mode 100644
index 0000000000..d57c43f6c1
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_cof_attachment.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="COF Attachment">
+ <menu_item_call label="Ayır" name="detach"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_cof_body_part.xml b/indra/newview/skins/default/xui/tr/menu_cof_body_part.xml
new file mode 100644
index 0000000000..31f77d834a
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_cof_body_part.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="COF Body">
+ <menu_item_call label="DeÄŸiÅŸtir" name="replace"/>
+ <menu_item_call label="Düzenle" name="edit"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_cof_clothing.xml b/indra/newview/skins/default/xui/tr/menu_cof_clothing.xml
new file mode 100644
index 0000000000..784d809d70
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_cof_clothing.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="COF Clothing">
+ <menu_item_call label="Çıkar" name="take_off"/>
+ <menu_item_call label="Düzenle" name="edit"/>
+ <menu_item_call label="DeÄŸiÅŸtir" name="replace"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_cof_gear.xml b/indra/newview/skins/default/xui/tr/menu_cof_gear.xml
new file mode 100644
index 0000000000..f910e1fe91
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_cof_gear.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Gear COF">
+ <menu label="Yeni Giysiler" name="COF.Gear.New_Clothes"/>
+ <menu label="Yeni Vücut Bölümleri" name="COF.Geear.New_Body_Parts"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_edit.xml b/indra/newview/skins/default/xui/tr/menu_edit.xml
new file mode 100644
index 0000000000..81cd270af0
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_edit.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu label="Düzenle" name="Edit">
+ <menu_item_call label="Geri Al" name="Undo"/>
+ <menu_item_call label="Yinele" name="Redo"/>
+ <menu_item_call label="Kes" name="Cut"/>
+ <menu_item_call label="Kopyala" name="Copy"/>
+ <menu_item_call label="Yapıştır" name="Paste"/>
+ <menu_item_call label="Sil" name="Delete"/>
+ <menu_item_call label="Çoğalt" name="Duplicate"/>
+ <menu_item_call label="Tümünü Seç" name="Select All"/>
+ <menu_item_call label="Seçimi Kaldır" name="Deselect"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_favorites.xml b/indra/newview/skins/default/xui/tr/menu_favorites.xml
new file mode 100644
index 0000000000..7bb2ed1ddc
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_favorites.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="Işınla" name="Teleport To Landmark"/>
+ <menu_item_call label="Yer İmini Görüntüle/Düzenle" name="Landmark Open"/>
+ <menu_item_call label="SLurl&apos;i Kopyala" name="Copy slurl"/>
+ <menu_item_call label="Haritada Göster" name="Show On Map"/>
+ <menu_item_call label="Kopyala" name="Landmark Copy"/>
+ <menu_item_call label="Yapıştır" name="Landmark Paste"/>
+ <menu_item_call label="Sil" name="Delete"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_gesture_gear.xml b/indra/newview/skins/default/xui/tr/menu_gesture_gear.xml
new file mode 100644
index 0000000000..cb9b678fdd
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_gesture_gear.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_gesture_gear">
+ <menu_item_call label="Favorilere Ekle/Çıkar" name="activate"/>
+ <menu_item_call label="Kopyala" name="copy_gesture"/>
+ <menu_item_call label="Yapıştır" name="paste"/>
+ <menu_item_call label="UUID&apos;yi Kopyala" name="copy_uuid"/>
+ <menu_item_call label="Mevcut dış görünüme kaydet" name="save_to_outfit"/>
+ <menu_item_call label="Düzenle" name="edit_gesture"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_group_plus.xml b/indra/newview/skins/default/xui/tr/menu_group_plus.xml
new file mode 100644
index 0000000000..82cf7dcf74
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_group_plus.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_call label="Gruba Katıl..." name="item_join"/>
+ <menu_item_call label="Yeni Grup..." name="item_new"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_hide_navbar.xml b/indra/newview/skins/default/xui/tr/menu_hide_navbar.xml
new file mode 100644
index 0000000000..d1f213516b
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_hide_navbar.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="hide_navbar_menu">
+ <menu_item_check label="Gezinme ve Favoriler Çubuğunu Göster" name="ShowNavbarNavigationPanel"/>
+ <menu_item_check label="Favoriler Çubuğunu Göster" name="ShowNavbarFavoritesPanel"/>
+ <menu_item_check label="Mini Konum Çubuğunu Göster" name="ShowMiniLocationPanel"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_im_well_button.xml b/indra/newview/skins/default/xui/tr/menu_im_well_button.xml
new file mode 100644
index 0000000000..c3e559a723
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_im_well_button.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="IM Well Button Context Menu">
+ <menu_item_call label="Tümünü Kapat" name="Close All"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_imchiclet_adhoc.xml b/indra/newview/skins/default/xui/tr/menu_imchiclet_adhoc.xml
new file mode 100644
index 0000000000..0396ad8fb5
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_imchiclet_adhoc.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet AdHoc Menu">
+ <menu_item_call label="Oturumu Bitir" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_imchiclet_group.xml b/indra/newview/skins/default/xui/tr/menu_imchiclet_group.xml
new file mode 100644
index 0000000000..60a50b114e
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_imchiclet_group.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet Group Menu">
+ <menu_item_call label="Grup Bilgisi" name="Show Profile"/>
+ <menu_item_call label="Oturumu Göster" name="Chat"/>
+ <menu_item_call label="Oturumu Bitir" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_imchiclet_p2p.xml b/indra/newview/skins/default/xui/tr/menu_imchiclet_p2p.xml
new file mode 100644
index 0000000000..0ef4471088
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_imchiclet_p2p.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet P2P Menu">
+ <menu_item_call label="Profili Göster" name="Show Profile"/>
+ <menu_item_call label="ArkadaÅŸ Ekle" name="Add Friend"/>
+ <menu_item_call label="Oturumu Göster" name="Send IM"/>
+ <menu_item_call label="Oturumu Bitir" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/tr/menu_inspect_avatar_gear.xml
new file mode 100644
index 0000000000..69432e967b
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_inspect_avatar_gear.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<toggleable_menu name="Gear Menu">
+ <menu_item_call label="Profili Göster" name="view_profile"/>
+ <menu_item_call label="ArkadaÅŸ Ekle" name="add_friend"/>
+ <menu_item_call label="AÄ°" name="im"/>
+ <menu_item_call label="Ara" name="call"/>
+ <menu_item_call label="Işınla" name="teleport"/>
+ <menu_item_call label="Gruba Davet Et" name="invite_to_group"/>
+ <menu_item_call label="Engelle" name="block"/>
+ <menu_item_call label="Engellemeyi Kaldır" name="unblock"/>
+ <menu_item_call label="Raporla" name="report"/>
+ <menu_item_call label="Dondur" name="freeze"/>
+ <menu_item_call label="Çıkar" name="eject"/>
+ <menu_item_call label="Çıkar" name="kick"/>
+ <menu_item_call label="CSR" name="csr"/>
+ <menu_item_call label="Dokularda Hata Ayıkla" name="debug"/>
+ <menu_item_call label="Haritada Bul" name="find_on_map"/>
+ <menu_item_call label="Yakınlaştır" name="zoom_in"/>
+ <menu_item_call label="Öde" name="pay"/>
+ <menu_item_call label="PaylaÅŸ" name="share"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_inspect_object_gear.xml b/indra/newview/skins/default/xui/tr/menu_inspect_object_gear.xml
new file mode 100644
index 0000000000..d1d3f9ac8d
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_inspect_object_gear.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<toggleable_menu name="Gear Menu">
+ <menu_item_call label="Dokun" name="touch"/>
+ <menu_item_call label="Otur" name="sit"/>
+ <menu_item_call label="Öde" name="pay"/>
+ <menu_item_call label="Satın Al" name="buy"/>
+ <menu_item_call label="Al" name="take"/>
+ <menu_item_call label="Kopya Al" name="take_copy"/>
+ <menu_item_call label="Aç" name="open"/>
+ <menu_item_call label="Düzenle" name="edit"/>
+ <menu_item_call label="Giy" name="wear"/>
+ <menu_item_call label="Ekle" name="add"/>
+ <menu_item_call label="Raporla" name="report"/>
+ <menu_item_call label="Engelle" name="block"/>
+ <menu_item_call label="Engellemeyi Kaldır" name="unblock"/>
+ <menu_item_call label="Yakınlaştır" name="zoom_in"/>
+ <menu_item_call label="Kaldır" name="remove"/>
+ <menu_item_call label="Ek Bilgi" name="more_info"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/tr/menu_inspect_self_gear.xml
new file mode 100644
index 0000000000..0655db8196
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_inspect_self_gear.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Self Pie">
+ <menu_item_call label="Otur" name="Sit Down Here"/>
+ <menu_item_call label="Kalk" name="Stand Up"/>
+ <context_menu label="Çıkar" name="Take Off &gt;">
+ <context_menu label="Giysiler" name="Clothes &gt;">
+ <menu_item_call label="Gömlek" name="Shirt"/>
+ <menu_item_call label="Pantolon" name="Pants"/>
+ <menu_item_call label="Etek" name="Skirt"/>
+ <menu_item_call label="Ayakkabılar" name="Shoes"/>
+ <menu_item_call label="Çoraplar" name="Socks"/>
+ <menu_item_call label="Ceket" name="Jacket"/>
+ <menu_item_call label="Eldivenler" name="Gloves"/>
+ <menu_item_call label="Fanila" name="Self Undershirt"/>
+ <menu_item_call label="Külot" name="Self Underpants"/>
+ <menu_item_call label="Dövme" name="Self Tattoo"/>
+ <menu_item_call label="Alfa" name="Self Alpha"/>
+ <menu_item_call label="Tüm Giysiler" name="All Clothes"/>
+ </context_menu>
+ <context_menu label="BÃœG" name="Object Detach HUD"/>
+ <context_menu label="Ayır" name="Object Detach"/>
+ <menu_item_call label="Tümünü Ayır" name="Detach All"/>
+ </context_menu>
+ <menu_item_call label="Dış Görünümü Değiştir" name="Chenge Outfit"/>
+ <menu_item_call label="Dış Görünümümü Düzenle" name="Edit Outfit"/>
+ <menu_item_call label="Şeklimi Düzenle" name="Edit My Shape"/>
+ <menu_item_call label="Arkadaşlarım" name="Friends..."/>
+ <menu_item_call label="Gruplarım" name="Groups..."/>
+ <menu_item_call label="Profilim" name="Profile..."/>
+ <menu_item_call label="Dokularda Hata Ayıkla" name="Debug..."/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_inv_offer_chiclet.xml b/indra/newview/skins/default/xui/tr/menu_inv_offer_chiclet.xml
new file mode 100644
index 0000000000..2e2b17491a
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_inv_offer_chiclet.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="InvOfferChiclet Menu">
+ <menu_item_call label="Kapat" name="Close"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_inventory.xml b/indra/newview/skins/default/xui/tr/menu_inventory.xml
new file mode 100644
index 0000000000..170cdebd24
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_inventory.xml
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="PaylaÅŸ" name="Share"/>
+ <menu_item_call label="Satın Al" name="Task Buy"/>
+ <menu_item_call label="Aç" name="Task Open"/>
+ <menu_item_call label="Oyna" name="Task Play"/>
+ <menu_item_call label="Özellikler" name="Task Properties"/>
+ <menu_item_call label="Yeniden Adlandır" name="Task Rename"/>
+ <menu_item_call label="Sil" name="Task Remove"/>
+ <menu_item_call label="Çöpü Boşalt" name="Empty Trash"/>
+ <menu_item_call label="Kaybedip Bulduklarımı Boşalt" name="Empty Lost And Found"/>
+ <menu_item_call label="Yeni Klasör" name="New Folder"/>
+ <menu_item_call label="Yeni Komut Dosyası" name="New Script"/>
+ <menu_item_call label="Yeni Not Kartı" name="New Note"/>
+ <menu_item_call label="Yeni Mimik" name="New Gesture"/>
+ <menu label="Yeni Giysiler" name="New Clothes">
+ <menu_item_call label="Yeni Gömlek" name="New Shirt"/>
+ <menu_item_call label="Yeni Pantolon" name="New Pants"/>
+ <menu_item_call label="Yeni Ayakkabılar" name="New Shoes"/>
+ <menu_item_call label="Yeni Çoraplar" name="New Socks"/>
+ <menu_item_call label="Yeni Ceket" name="New Jacket"/>
+ <menu_item_call label="Yeni Etek" name="New Skirt"/>
+ <menu_item_call label="Yeni Eldivenler" name="New Gloves"/>
+ <menu_item_call label="Yeni Fanila" name="New Undershirt"/>
+ <menu_item_call label="Yeni Külot" name="New Underpants"/>
+ <menu_item_call label="Yeni Alfa Maskesi" name="New Alpha Mask"/>
+ <menu_item_call label="Yeni Dövme" name="New Tattoo"/>
+ <menu_item_call label="Yeni Fizik" name="New Physics"/>
+ </menu>
+ <menu label="Yeni Vücut Bölümleri" name="New Body Parts">
+ <menu_item_call label="Yeni Åžekil" name="New Shape"/>
+ <menu_item_call label="Yeni Dış Katman" name="New Skin"/>
+ <menu_item_call label="Yeni Saç" name="New Hair"/>
+ <menu_item_call label="Yeni Gözler" name="New Eyes"/>
+ </menu>
+ <menu label="Türü Değiştir" name="Change Type">
+ <menu_item_call label="Varsayılan" name="Default"/>
+ <menu_item_call label="Eldivenler" name="Gloves"/>
+ <menu_item_call label="Ceket" name="Jacket"/>
+ <menu_item_call label="Pantolon" name="Pants"/>
+ <menu_item_call label="Åžekil" name="Shape"/>
+ <menu_item_call label="Ayakkabılar" name="Shoes"/>
+ <menu_item_call label="Gömlek" name="Shirt"/>
+ <menu_item_call label="Etek" name="Skirt"/>
+ <menu_item_call label="Külot" name="Underpants"/>
+ <menu_item_call label="Fanila" name="Undershirt"/>
+ </menu>
+ <menu_item_call label="Işınla" name="Landmark Open"/>
+ <menu_item_call label="Aç" name="Animation Open"/>
+ <menu_item_call label="Aç" name="Sound Open"/>
+ <menu_item_call label="Mevcut Dış Görünümü Değiştir" name="Replace Outfit"/>
+ <menu_item_call label="Mevcut Dış Görünüme Ekle" name="Add To Outfit"/>
+ <menu_item_call label="Mevcut Dış Görünümden Kaldır" name="Remove From Outfit"/>
+ <menu_item_call label="Orijinali Bul" name="Find Original"/>
+ <menu_item_call label="Öğeyi Temizle" name="Purge Item"/>
+ <menu_item_call label="Öğeyi Geri Yükle" name="Restore Item"/>
+ <menu_item_call label="Aç" name="Open"/>
+ <menu_item_call label="Orijinali Aç" name="Open Original"/>
+ <menu_item_call label="Özellikler" name="Properties"/>
+ <menu_item_call label="Yeniden Adlandır" name="Rename"/>
+ <menu_item_call label="Varlık UUID&apos;sini Kopyala" name="Copy Asset UUID"/>
+ <menu_item_call label="Kes" name="Cut"/>
+ <menu_item_call label="Kopyala" name="Copy"/>
+ <menu_item_call label="Yapıştır" name="Paste"/>
+ <menu_item_call label="Bağlantı Olarak Yapıştır" name="Paste As Link"/>
+ <menu_item_call label="Sil" name="Remove Link"/>
+ <menu_item_call label="Sil" name="Delete"/>
+ <menu_item_call label="Sistem Klasörünü Sil" name="Delete System Folder"/>
+ <menu_item_call label="Konferans Sohbeti BaÅŸlat" name="Conference Chat Folder"/>
+ <menu_item_call label="Oyna" name="Sound Play"/>
+ <menu_item_call label="Yer İmi Hakkında" name="About Landmark"/>
+ <menu_item_call label="SL Dünyasında Oynat" name="Animation Play"/>
+ <menu_item_call label="Yerel Olarak Oynat" name="Animation Audition"/>
+ <menu_item_call label="Anlık İleti Gönder" name="Send Instant Message"/>
+ <menu_item_call label="Işınlama Teklif Et..." name="Offer Teleport..."/>
+ <menu_item_call label="Konferans Sohbeti BaÅŸlat" name="Conference Chat"/>
+ <menu_item_call label="EtkinleÅŸtir" name="Activate"/>
+ <menu_item_call label="Devre Dışı Bırak" name="Deactivate"/>
+ <menu_item_call label="Farklı Kaydet" name="Save As"/>
+ <menu_item_call label="Kendinizden Ayırın" name="Detach From Yourself"/>
+ <menu_item_call label="Giy" name="Wearable And Object Wear"/>
+ <menu label="Åžuna Ekle:" name="Attach To"/>
+ <menu label="BÃœG&apos;e Ekle" name="Attach To HUD"/>
+ <menu_item_call label="Düzenle" name="Wearable Edit"/>
+ <menu_item_call label="Ekle" name="Wearable Add"/>
+ <menu_item_call label="Çıkar" name="Take Off"/>
+ <menu_item_call label="Satıcı Giden Kutusuna Kopyala" name="Merchant Copy"/>
+ <menu_item_call label="Pazaryerine Gönder" name="Marketplace Send"/>
+ <menu_item_call label="--seçenek yok--" name="--no options--"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_inventory_add.xml b/indra/newview/skins/default/xui/tr/menu_inventory_add.xml
new file mode 100644
index 0000000000..db2a9a2c8c
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_inventory_add.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_inventory_add">
+ <menu label="Karşıya Yükle" name="upload">
+ <menu_item_call label="Görüntü (L$[COST])..." name="Upload Image"/>
+ <menu_item_call label="Ses (L$[COST])..." name="Upload Sound"/>
+ <menu_item_call label="Animasyon (L$[COST])..." name="Upload Animation"/>
+ <menu_item_call label="Model..." name="Upload Model"/>
+ <menu_item_call label="Model Sihirbazı..." name="Upload Model Wizard"/>
+ <menu_item_call label="Toplu (dosya başına L$[COST])..." name="Bulk Upload"/>
+ <menu_item_call label="Varsayılan Karşıya Yükleme İzinlerini Ayarla" name="perm prefs"/>
+ </menu>
+ <menu_item_call label="Yeni Klasör" name="New Folder"/>
+ <menu_item_call label="Yeni Komut Dosyası" name="New Script"/>
+ <menu_item_call label="Yeni Not Kartı" name="New Note"/>
+ <menu_item_call label="Yeni Mimik" name="New Gesture"/>
+ <menu label="Yeni Giysiler" name="New Clothes">
+ <menu_item_call label="Yeni Gömlek" name="New Shirt"/>
+ <menu_item_call label="Yeni Pantolon" name="New Pants"/>
+ <menu_item_call label="Yeni Ayakkabılar" name="New Shoes"/>
+ <menu_item_call label="Yeni Çoraplar" name="New Socks"/>
+ <menu_item_call label="Yeni Ceket" name="New Jacket"/>
+ <menu_item_call label="Yeni Etek" name="New Skirt"/>
+ <menu_item_call label="Yeni Eldivenler" name="New Gloves"/>
+ <menu_item_call label="Yeni Fanila" name="New Undershirt"/>
+ <menu_item_call label="Yeni Külot" name="New Underpants"/>
+ <menu_item_call label="Yeni Alfa" name="New Alpha"/>
+ <menu_item_call label="Yeni Dövme" name="New Tattoo"/>
+ <menu_item_call label="Yeni Fizik" name="New Physics"/>
+ </menu>
+ <menu label="Yeni Vücut Bölümleri" name="New Body Parts">
+ <menu_item_call label="Yeni Åžekil" name="New Shape"/>
+ <menu_item_call label="Yeni Dış Katman" name="New Skin"/>
+ <menu_item_call label="Yeni Saç" name="New Hair"/>
+ <menu_item_call label="Yeni Gözler" name="New Eyes"/>
+ </menu>
+</menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/tr/menu_inventory_gear_default.xml
new file mode 100644
index 0000000000..5f3e4e8789
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_inventory_gear_default.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_gear_default">
+ <menu_item_call label="Yeni Envanter Penceresi" name="new_window"/>
+ <menu_item_check label="Ada Göre Sırala" name="sort_by_name"/>
+ <menu_item_check label="En Sonunculara Göre Sırala" name="sort_by_recent"/>
+ <menu_item_check label="Klasörleri Her Zaman Ada Göre Sırala" name="sort_folders_by_name"/>
+ <menu_item_check label="Sistem Klasörlerini Üste Sırala" name="sort_system_folders_to_top"/>
+ <menu_item_call label="Filtreleri Göster" name="show_filters"/>
+ <menu_item_call label="Filtreleri Sıfırla" name="reset_filters"/>
+ <menu_item_call label="Tüm Klasörleri Kapat" name="close_folders"/>
+ <menu_item_call label="Kaybedip Bulduklarımı Boşalt" name="empty_lostnfound"/>
+ <menu_item_call label="Dokuyu Farklı Kaydet" name="Save Texture As"/>
+ <menu_item_call label="PaylaÅŸ" name="Share"/>
+ <menu_item_call label="Orijinali Bul" name="Find Original"/>
+ <menu_item_call label="Tüm Bağlantıları Bul" name="Find All Links"/>
+ <menu_item_call label="Çöpü Boşalt" name="empty_trash"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_land.xml b/indra/newview/skins/default/xui/tr/menu_land.xml
new file mode 100644
index 0000000000..db65f1af1e
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_land.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Land Pie">
+ <menu_item_call label="Arazi Hakkında" name="Place Information..."/>
+ <menu_item_call label="Buraya Otur" name="Sit Here"/>
+ <menu_item_call label="Bu Araziyi Satın Al" name="Land Buy"/>
+ <menu_item_call label="Geçiş Hakkı Satın Al" name="Land Buy Pass"/>
+ <menu_item_call label="Ä°nÅŸa Et" name="Create"/>
+ <menu_item_call label="Yüzeyi Düzenle" name="Edit Terrain"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_landmark.xml b/indra/newview/skins/default/xui/tr/menu_landmark.xml
new file mode 100644
index 0000000000..c68a2f6a90
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_landmark.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="landmark_overflow_menu">
+ <menu_item_call label="SLurl&apos;i Kopyala" name="copy"/>
+ <menu_item_call label="Sil" name="delete"/>
+ <menu_item_call label="Seçme Oluştur" name="pick"/>
+ <menu_item_call label="Favoriler Çubuğuna Ekle" name="add_to_favbar"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_login.xml b/indra/newview/skins/default/xui/tr/menu_login.xml
new file mode 100644
index 0000000000..f27908bf7a
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_login.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu_bar name="Login Menu">
+ <menu label="Ben" name="File">
+ <menu_item_call label="Tercihler..." name="Preferences..."/>
+ <menu_item_call label="[APP_NAME]&apos;den Çık" name="Quit"/>
+ </menu>
+ <menu label="Yardım" name="Help">
+ <menu_item_call label="[SECOND_LIFE] Yardımı" name="Second Life Help"/>
+ <menu_item_call label="[APP_NAME] Hakkında" name="About Second Life"/>
+ </menu>
+ <menu_item_check label="Hata Ayıklama Menüsünü Göster" name="Show Debug Menu"/>
+ <menu label="Hata ayıkla" name="Debug">
+ <menu_item_call label="Hata Ayıklama Ayarlarını Göster" name="Debug Settings"/>
+ <menu_item_call label="KA/Renk Ayarları" name="UI/Color Settings"/>
+ <menu_item_call label="XKA Önizleme Aracı" name="UI Preview Tool"/>
+ <menu label="KA Testleri" name="UI Tests"/>
+ <menu_item_call label="Pencere Büyüklüğünü Ayarla..." name="Set Window Size..."/>
+ <menu_item_call label="Hizmet Şartlarını Göster" name="TOS"/>
+ <menu_item_call label="Kritik İletiyi Göster" name="Critical"/>
+ <menu_item_call label="Web İçeriği Gezdiricisi Hata Ayıklama Testi" name="Web Content Floater Debug Test"/>
+ <menu label="Günlük Tutma Seviyesini Seç" name="Set Logging Level"/>
+ <menu_item_check label="Izgara Seçiciyi Göster" name="Show Grid Picker"/>
+ <menu_item_call label="Bildirimler Konsolunu Göster" name="Show Notifications Console"/>
+ </menu>
+</menu_bar>
diff --git a/indra/newview/skins/default/xui/tr/menu_media_ctrl.xml b/indra/newview/skins/default/xui/tr/menu_media_ctrl.xml
new file mode 100644
index 0000000000..8d04e645fd
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_media_ctrl.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="media ctrl context menu">
+ <menu_item_call label="Kes" name="Cut"/>
+ <menu_item_call label="Kopyala" name="Copy"/>
+ <menu_item_call label="Yapıştır" name="Paste"/>
+ <menu_item_call label="Web Inspector&apos;ı Açın" name="open_webinspector"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_mini_map.xml b/indra/newview/skins/default/xui/tr/menu_mini_map.xml
new file mode 100644
index 0000000000..9abe78931e
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_mini_map.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="Yakına Zumla" name="Zoom Close"/>
+ <menu_item_call label="Orta Zumla" name="Zoom Medium"/>
+ <menu_item_call label="UzaÄŸa Zumla" name="Zoom Far"/>
+ <menu_item_call label="Varsayılan Yakınlaştırma" name="Zoom Default"/>
+ <menu_item_check label="Haritayı Dönder" name="Rotate Map"/>
+ <menu_item_check label="Otomatik Ortala" name="Auto Center"/>
+ <menu_item_call label="Ä°zlemeyi Durdur" name="Stop Tracking"/>
+ <menu_item_call label="Dünya Haritası" name="World Map"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_mode_change.xml b/indra/newview/skins/default/xui/tr/menu_mode_change.xml
new file mode 100644
index 0000000000..678950b633
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_mode_change.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Mode Change">
+ <menu_item_check label="Temel" name="BasicMode"/>
+ <menu_item_check label="GeliÅŸmiÅŸ" name="AdvancedMode"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_model_import_gear_default.xml b/indra/newview/skins/default/xui/tr/menu_model_import_gear_default.xml
new file mode 100644
index 0000000000..51cf29a4de
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_model_import_gear_default.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="model_menu_gear_default">
+ <menu_item_check label="Kenarları göster" name="show_edges"/>
+ <menu_item_check label="Fiziki temsili göster" name="show_physics"/>
+ <menu_item_check label="Dokuları göster" name="show_textures"/>
+ <menu_item_check label="Dış katman ağırlığını göster" name="show_skin_weight"/>
+ <menu_item_check label="Eklem konumlarını göster" name="show_joint_positions"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_navbar.xml b/indra/newview/skins/default/xui/tr/menu_navbar.xml
new file mode 100644
index 0000000000..b05b816e64
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_navbar.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Navbar Menu">
+ <menu_item_check label="Koordinatları Göster" name="Show Coordinates"/>
+ <menu_item_check label="Parsel Özelliklerini Göster" name="Show Parcel Properties"/>
+ <menu_item_call label="Yer Ä°mi" name="Landmark"/>
+ <menu_item_call label="Kes" name="Cut"/>
+ <menu_item_call label="Kopyala" name="Copy"/>
+ <menu_item_call label="Yapıştır" name="Paste"/>
+ <menu_item_call label="Sil" name="Delete"/>
+ <menu_item_call label="Tümünü Seç" name="Select All"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_nearby_chat.xml b/indra/newview/skins/default/xui/tr/menu_nearby_chat.xml
new file mode 100644
index 0000000000..b76a736979
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_nearby_chat.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="NearBy Chat Menu">
+ <menu_item_call label="Yakındaki Kişileri Göster..." name="nearby_people"/>
+ <menu_item_check label="Engellenmiş Metni Göster" name="muted_text"/>
+ <menu_item_check label="Arkadaş Simgelerini Göster" name="show_buddy_icons"/>
+ <menu_item_check label="Adları Göster" name="show_names"/>
+ <menu_item_check label="Simgeleri ve Adları Göster" name="show_icons_and_names"/>
+ <menu_item_call label="Font Büyüklüğü" name="font_size"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_notification_well_button.xml b/indra/newview/skins/default/xui/tr/menu_notification_well_button.xml
new file mode 100644
index 0000000000..39c66268f5
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_notification_well_button.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Notification Well Button Context Menu">
+ <menu_item_call label="Tümünü Kapat" name="Close All"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_object.xml b/indra/newview/skins/default/xui/tr/menu_object.xml
new file mode 100644
index 0000000000..d60c68e5e9
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_object.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Object Pie">
+ <menu_item_call label="Dokun" name="Object Touch"/>
+ <menu_item_call label="Düzenle" name="Edit..."/>
+ <menu_item_call label="Ä°nÅŸa Et" name="Build"/>
+ <menu_item_call label="Aç" name="Open"/>
+ <menu_item_call label="Buraya Otur" name="Object Sit"/>
+ <menu_item_call label="Kalk" name="Object Stand Up"/>
+ <menu_item_call label="Nesne Profili" name="Object Inspect"/>
+ <menu_item_call label="Yakınlaştır" name="Zoom In"/>
+ <context_menu label="Ãœzerine Koy" name="Put On">
+ <menu_item_call label="Giy" name="Wear"/>
+ <menu_item_call label="Ekle" name="Add"/>
+ <context_menu label="Ekle" name="Object Attach"/>
+ <context_menu label="BÃœG Ekle" name="Object Attach HUD"/>
+ </context_menu>
+ <context_menu label="Yönet" name="Remove">
+ <menu_item_call label="Kötüye Kullanımı Bildir" name="Report Abuse..."/>
+ <menu_item_call label="Engelle" name="Object Mute"/>
+ <menu_item_call label="Ä°ade Et" name="Return..."/>
+ </context_menu>
+ <menu_item_call label="Al" name="Pie Object Take"/>
+ <menu_item_call label="Kopya Al" name="Take Copy"/>
+ <menu_item_call label="Öde" name="Pay..."/>
+ <menu_item_call label="Satın Al" name="Buy..."/>
+ <menu_item_call label="Sil" name="Delete"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_object_icon.xml b/indra/newview/skins/default/xui/tr/menu_object_icon.xml
new file mode 100644
index 0000000000..34a2661d8a
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_object_icon.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Object Icon Menu">
+ <menu_item_call label="Nesne Profili..." name="Object Profile"/>
+ <menu_item_call label="Engelle..." name="Block"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_outfit_gear.xml b/indra/newview/skins/default/xui/tr/menu_outfit_gear.xml
new file mode 100644
index 0000000000..d2e7e7107a
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_outfit_gear.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Gear Outfit">
+ <menu_item_call label="Giysi - Mevcut Dış Görünümü Değiştir" name="wear"/>
+ <menu_item_call label="Giysi - Mevcut Dış Görünüme Ekle" name="wear_add"/>
+ <menu_item_call label="Çıkar - Mevcut Dış Görünümden Kaldır" name="take_off"/>
+ <menu label="Yeni Giysiler" name="New Clothes">
+ <menu_item_call label="Yeni Gömlek" name="New Shirt"/>
+ <menu_item_call label="Yeni Pantolon" name="New Pants"/>
+ <menu_item_call label="Yeni Ayakkabılar" name="New Shoes"/>
+ <menu_item_call label="Yeni Çoraplar" name="New Socks"/>
+ <menu_item_call label="Yeni Ceket" name="New Jacket"/>
+ <menu_item_call label="Yeni Etek" name="New Skirt"/>
+ <menu_item_call label="Yeni Eldivenler" name="New Gloves"/>
+ <menu_item_call label="Yeni Fanila" name="New Undershirt"/>
+ <menu_item_call label="Yeni Külot" name="New Underpants"/>
+ <menu_item_call label="Yeni Alfa" name="New Alpha"/>
+ <menu_item_call label="Yeni Fizik" name="New Physics"/>
+ <menu_item_call label="Yeni Dövme" name="New Tattoo"/>
+ </menu>
+ <menu label="Yeni Vücut Bölümleri" name="New Body Parts">
+ <menu_item_call label="Yeni Åžekil" name="New Shape"/>
+ <menu_item_call label="Yeni Dış Katman" name="New Skin"/>
+ <menu_item_call label="Yeni Saç" name="New Hair"/>
+ <menu_item_call label="Yeni Gözler" name="New Eyes"/>
+ </menu>
+ <menu_item_call label="Dış Görünümü Yeniden Adlandır" name="rename"/>
+ <menu_item_call label="Dış Görünümü Sil" name="delete_outfit"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_outfit_tab.xml b/indra/newview/skins/default/xui/tr/menu_outfit_tab.xml
new file mode 100644
index 0000000000..a48529e462
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_outfit_tab.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Outfit">
+ <menu_item_call label="Giysi - Mevcut Dış Görünümü Değiştir" name="wear_replace"/>
+ <menu_item_call label="Giysi - Mevcut Dış Görünüme Ekle" name="wear_add"/>
+ <menu_item_call label="Çıkar - Mevcut Dış Görünümden Kaldır" name="take_off"/>
+ <menu_item_call label="Dış Görünümü Düzenle" name="edit"/>
+ <menu_item_call label="Dış Görünümü Yeniden Adlandır" name="rename"/>
+ <menu_item_call label="Dış Görünümü Sil" name="delete"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_participant_list.xml b/indra/newview/skins/default/xui/tr/menu_participant_list.xml
new file mode 100644
index 0000000000..1d56105e1e
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_participant_list.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Participant List Context Menu">
+ <menu_item_check label="Ada Göre Sırala" name="SortByName"/>
+ <menu_item_check label="Son Konuşanlara Göre Sırala" name="SortByRecentSpeakers"/>
+ <menu_item_call label="Profili Göster" name="View Profile"/>
+ <menu_item_call label="ArkadaÅŸ Ekle" name="Add Friend"/>
+ <menu_item_call label="AÄ°" name="IM"/>
+ <menu_item_call label="Ara" name="Call"/>
+ <menu_item_call label="PaylaÅŸ" name="Share"/>
+ <menu_item_call label="Öde" name="Pay"/>
+ <menu_item_check label="Kişi Simgelerini Göster" name="View Icons"/>
+ <menu_item_check label="Sesi Engelle" name="Block/Unblock"/>
+ <menu_item_check label="Metni Engelle" name="MuteText"/>
+ <context_menu label="Moderatör Seçenekleri" name="Moderator Options">
+ <menu_item_check label="Metin sohbetine izin ver" name="AllowTextChat"/>
+ <menu_item_call label="Bu katılımcıyı engelle" name="ModerateVoiceMuteSelected"/>
+ <menu_item_call label="Bu katılımcının engellemesini kaldır" name="ModerateVoiceUnMuteSelected"/>
+ <menu_item_call label="Herkesi engelle" name="ModerateVoiceMute"/>
+ <menu_item_call label="Herkesin engellemesini kaldır" name="ModerateVoiceUnmute"/>
+ </context_menu>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_people_friends_view_sort.xml b/indra/newview/skins/default/xui/tr/menu_people_friends_view_sort.xml
new file mode 100644
index 0000000000..404fab17e6
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_people_friends_view_sort.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_group_plus">
+ <menu_item_check label="Ada Göre Sırala" name="sort_name"/>
+ <menu_item_check label="Duruma Göre Sırala" name="sort_status"/>
+ <menu_item_check label="Kişi Simgelerini Göster" name="view_icons"/>
+ <menu_item_check label="Verilen İzinleri Göster" name="view_permissions"/>
+ <menu_item_call label="Engellenmiş Sakinleri ve Nesneleri Göster" name="show_blocked_list"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_people_groups.xml b/indra/newview/skins/default/xui/tr/menu_people_groups.xml
new file mode 100644
index 0000000000..9f2946e310
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_people_groups.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_call label="Bilgileri Görüntüle" name="View Info"/>
+ <menu_item_call label="Sohbet" name="Chat"/>
+ <menu_item_call label="Ara" name="Call"/>
+ <menu_item_call label="EtkinleÅŸtir" name="Activate"/>
+ <menu_item_call label="Ayrıl" name="Leave"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_people_groups_view_sort.xml b/indra/newview/skins/default/xui/tr/menu_people_groups_view_sort.xml
new file mode 100644
index 0000000000..a1e5ad9a50
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_people_groups_view_sort.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_group_plus">
+ <menu_item_check label="Grup Simgelerini Göster" name="Display Group Icons"/>
+ <menu_item_call label="Seçilen Gruptan Ayrıl" name="Leave Selected Group"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_people_nearby.xml b/indra/newview/skins/default/xui/tr/menu_people_nearby.xml
new file mode 100644
index 0000000000..ee859a9450
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_people_nearby.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Avatar Context Menu">
+ <menu_item_call label="Profili Göster" name="View Profile"/>
+ <menu_item_call label="ArkadaÅŸ Ekle" name="Add Friend"/>
+ <menu_item_call label="Arkadaşı Çıkar" name="Remove Friend"/>
+ <menu_item_call label="AÄ°" name="IM"/>
+ <menu_item_call label="Ara" name="Call"/>
+ <menu_item_call label="Harita" name="Map"/>
+ <menu_item_call label="PaylaÅŸ" name="Share"/>
+ <menu_item_call label="Öde" name="Pay"/>
+ <menu_item_check label="Engelle/Engeli Kaldır" name="Block/Unblock"/>
+ <menu_item_call label="Işınlama Teklif Et" name="teleport"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/tr/menu_people_nearby_multiselect.xml
new file mode 100644
index 0000000000..5c89f87906
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_people_nearby_multiselect.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Multi-Selected People Context Menu">
+ <menu_item_call label="ArkadaÅŸ Ekle" name="Add Friends"/>
+ <menu_item_call label="Arkadaşı Çıkar" name="Remove Friend"/>
+ <menu_item_call label="AÄ°" name="IM"/>
+ <menu_item_call label="Ara" name="Call"/>
+ <menu_item_call label="PaylaÅŸ" name="Share"/>
+ <menu_item_call label="Öde" name="Pay"/>
+ <menu_item_call label="Işınlama Teklif Et" name="teleport"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_people_nearby_view_sort.xml b/indra/newview/skins/default/xui/tr/menu_people_nearby_view_sort.xml
new file mode 100644
index 0000000000..0ff2111e9e
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_people_nearby_view_sort.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_group_plus">
+ <menu_item_check label="Son Konuşanlara Göre Sırala" name="sort_by_recent_speakers"/>
+ <menu_item_check label="Ada Göre Sırala" name="sort_name"/>
+ <menu_item_check label="Mesafeye Göre Sırala" name="sort_distance"/>
+ <menu_item_check label="Kişi Simgelerini Göster" name="view_icons"/>
+ <menu_item_check label="Haritayı Göster" name="view_map"/>
+ <menu_item_call label="Engellenmiş Sakinleri ve Nesneleri Göster" name="show_blocked_list"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_people_recent_view_sort.xml b/indra/newview/skins/default/xui/tr/menu_people_recent_view_sort.xml
new file mode 100644
index 0000000000..adfba50138
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_people_recent_view_sort.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_group_plus">
+ <menu_item_check label="En Sonunculara Göre Sırala" name="sort_most"/>
+ <menu_item_check label="Ada Göre Sırala" name="sort_name"/>
+ <menu_item_check label="Kişi Simgelerini Göster" name="view_icons"/>
+ <menu_item_call label="Engellenmiş Sakinleri ve Nesneleri Göster" name="show_blocked_list"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_picks.xml b/indra/newview/skins/default/xui/tr/menu_picks.xml
new file mode 100644
index 0000000000..3e5375ecc0
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_picks.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Picks">
+ <menu_item_call label="Bilgi" name="pick_info"/>
+ <menu_item_call label="Düzenle" name="pick_edit"/>
+ <menu_item_call label="Işınla" name="pick_teleport"/>
+ <menu_item_call label="Harita" name="pick_map"/>
+ <menu_item_call label="Sil" name="pick_delete"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_picks_plus.xml b/indra/newview/skins/default/xui/tr/menu_picks_plus.xml
new file mode 100644
index 0000000000..d9c4fefc97
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_picks_plus.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="picks_plus_menu">
+ <menu_item_call label="Yeni Seçme" name="create_pick"/>
+ <menu_item_call label="Yeni Ä°lan" name="create_classified"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_place.xml b/indra/newview/skins/default/xui/tr/menu_place.xml
new file mode 100644
index 0000000000..ad167a328a
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_place.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="place_overflow_menu">
+ <menu_item_call label="Yer Ä°mi Yap" name="landmark"/>
+ <menu_item_call label="Seçme Oluştur" name="pick"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_place_add_button.xml b/indra/newview/skins/default/xui/tr/menu_place_add_button.xml
new file mode 100644
index 0000000000..8e52b3f7f2
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_place_add_button.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_folder_gear">
+ <menu_item_call label="Klasör Ekle" name="add_folder"/>
+ <menu_item_call label="Yer Ä°mi Ekle" name="add_landmark"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/tr/menu_places_gear_folder.xml
new file mode 100644
index 0000000000..b3a2986160
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_places_gear_folder.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_folder_gear">
+ <menu_item_call label="Yer Ä°mi Ekle" name="add_landmark"/>
+ <menu_item_call label="Klasör Ekle" name="add_folder"/>
+ <menu_item_call label="Öğeyi Geri Yükle" name="restore_item"/>
+ <menu_item_call label="Kes" name="cut"/>
+ <menu_item_call label="Kopyala" name="copy_folder"/>
+ <menu_item_call label="Yapıştır" name="paste"/>
+ <menu_item_call label="Yeniden Adlandır" name="rename"/>
+ <menu_item_call label="Sil" name="delete"/>
+ <menu_item_call label="GeniÅŸlet" name="expand"/>
+ <menu_item_call label="Daralt" name="collapse"/>
+ <menu_item_call label="Tüm klasörleri genişlet" name="expand_all"/>
+ <menu_item_call label="Tüm klasörleri daralt" name="collapse_all"/>
+ <menu_item_check label="Tarihe Göre Sırala" name="sort_by_date"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/tr/menu_places_gear_landmark.xml
new file mode 100644
index 0000000000..939ee2c7cb
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_places_gear_landmark.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_ladmark_gear">
+ <menu_item_call label="Işınla" name="teleport"/>
+ <menu_item_call label="Ek Bilgi" name="more_info"/>
+ <menu_item_call label="Haritada Göster" name="show_on_map"/>
+ <menu_item_call label="Yer Ä°mi Ekle" name="add_landmark"/>
+ <menu_item_call label="Klasör Ekle" name="add_folder"/>
+ <menu_item_call label="Öğeyi Geri Yükle" name="restore_item"/>
+ <menu_item_call label="Kes" name="cut"/>
+ <menu_item_call label="Yer Ä°mini Kopyala" name="copy_landmark"/>
+ <menu_item_call label="SLurl&apos;i Kopyala" name="copy_slurl"/>
+ <menu_item_call label="Yapıştır" name="paste"/>
+ <menu_item_call label="Yeniden Adlandır" name="rename"/>
+ <menu_item_call label="Sil" name="delete"/>
+ <menu_item_call label="Tüm klasörleri genişlet" name="expand_all"/>
+ <menu_item_call label="Tüm klasörleri daralt" name="collapse_all"/>
+ <menu_item_check label="Tarihe Göre Sırala" name="sort_by_date"/>
+ <menu_item_call label="Seçme Oluştur" name="create_pick"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_profile_overflow.xml b/indra/newview/skins/default/xui/tr/menu_profile_overflow.xml
new file mode 100644
index 0000000000..ed60dec63a
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_profile_overflow.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="profile_overflow_menu">
+ <menu_item_call label="Harita" name="show_on_map"/>
+ <menu_item_call label="Öde" name="pay"/>
+ <menu_item_call label="PaylaÅŸ" name="share"/>
+ <menu_item_call label="Engelle" name="block"/>
+ <menu_item_call label="Engellemeyi Kaldır" name="unblock"/>
+ <menu_item_call label="Çıkar" name="kick"/>
+ <menu_item_call label="Dondur" name="freeze"/>
+ <menu_item_call label="Çöz" name="unfreeze"/>
+ <menu_item_call label="CSR" name="csr"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_save_outfit.xml b/indra/newview/skins/default/xui/tr/menu_save_outfit.xml
new file mode 100644
index 0000000000..b28488fe30
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_save_outfit.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="save_outfit_menu">
+ <menu_item_call label="Kaydet" name="save_outfit"/>
+ <menu_item_call label="Farklı Kaydet" name="save_as_new_outfit"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_script_chiclet.xml b/indra/newview/skins/default/xui/tr/menu_script_chiclet.xml
new file mode 100644
index 0000000000..7c1cefc2d1
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_script_chiclet.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="ScriptChiclet Menu">
+ <menu_item_call label="Kapat" name="Close"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_slurl.xml b/indra/newview/skins/default/xui/tr/menu_slurl.xml
new file mode 100644
index 0000000000..73ac068b26
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_slurl.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="URL Hakkında" name="about_url"/>
+ <menu_item_call label="URL&apos;ye Işınla" name="teleport_to_url"/>
+ <menu_item_call label="Harita" name="show_on_map"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_teleport_history_gear.xml b/indra/newview/skins/default/xui/tr/menu_teleport_history_gear.xml
new file mode 100644
index 0000000000..b08423be18
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_teleport_history_gear.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Teleport History Gear Context Menu">
+ <menu_item_call label="Tüm klasörleri genişlet" name="Expand all folders"/>
+ <menu_item_call label="Tüm klasörleri daralt" name="Collapse all folders"/>
+ <menu_item_call label="Işınlama Geçmişini Temizle" name="Clear Teleport History"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_teleport_history_item.xml b/indra/newview/skins/default/xui/tr/menu_teleport_history_item.xml
new file mode 100644
index 0000000000..93984162e7
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_teleport_history_item.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Teleport History Item Context Menu">
+ <menu_item_call label="Işınla" name="Teleport"/>
+ <menu_item_call label="Ek Bilgi" name="More Information"/>
+ <menu_item_call label="Panoya Kopyala" name="CopyToClipboard"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_teleport_history_tab.xml b/indra/newview/skins/default/xui/tr/menu_teleport_history_tab.xml
new file mode 100644
index 0000000000..b1e801c123
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_teleport_history_tab.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Teleport History Item Context Menu">
+ <menu_item_call label="Aç" name="TabOpen"/>
+ <menu_item_call label="Kapat" name="TabClose"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_text_editor.xml b/indra/newview/skins/default/xui/tr/menu_text_editor.xml
new file mode 100644
index 0000000000..ffbf309e84
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_text_editor.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Text editor context menu">
+ <menu_item_call label="Kes" name="Cut"/>
+ <menu_item_call label="Kopyala" name="Copy"/>
+ <menu_item_call label="Yapıştır" name="Paste"/>
+ <menu_item_call label="Sil" name="Delete"/>
+ <menu_item_call label="Tümünü Seç" name="Select All"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_toolbars.xml b/indra/newview/skins/default/xui/tr/menu_toolbars.xml
new file mode 100644
index 0000000000..c8523a6ec9
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_toolbars.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Toolbars Popup">
+ <menu_item_call label="Bu düğmeyi kaldır" name="Remove button"/>
+ <menu_item_call label="Araç çubuğu düğmeleri..." name="Choose Buttons"/>
+ <menu_item_check label="Simgeler ve etiketler" name="icons_with_text"/>
+ <menu_item_check label="Sadece simgeler" name="icons_only"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_topinfobar.xml b/indra/newview/skins/default/xui/tr/menu_topinfobar.xml
new file mode 100644
index 0000000000..d9b8d50f18
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_topinfobar.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_topinfobar">
+ <menu_item_check label="Koordinatları Göster" name="Show Coordinates"/>
+ <menu_item_check label="Parsel Özelliklerini Göster" name="Show Parcel Properties"/>
+ <menu_item_call label="Yer Ä°mi" name="Landmark"/>
+ <menu_item_call label="Kopyala" name="Copy"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_url_agent.xml b/indra/newview/skins/default/xui/tr/menu_url_agent.xml
new file mode 100644
index 0000000000..d82b52aea8
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_url_agent.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Sakin Profilini Göster" name="show_agent"/>
+ <menu_item_call label="Adı panoya kopyala" name="url_copy_label"/>
+ <menu_item_call label="SLurl&apos;yi Panoya Kopyala" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_url_group.xml b/indra/newview/skins/default/xui/tr/menu_url_group.xml
new file mode 100644
index 0000000000..40fa13b4cf
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_url_group.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Grup Bilgilerini Göster" name="show_group"/>
+ <menu_item_call label="Grubu panoya kopyala" name="url_copy_label"/>
+ <menu_item_call label="SLurl&apos;yi Panoya Kopyala" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_url_http.xml b/indra/newview/skins/default/xui/tr/menu_url_http.xml
new file mode 100644
index 0000000000..fee8eba150
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_url_http.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Web Sayfasını Aç" name="url_open"/>
+ <menu_item_call label="İnternet Tarayıcıda Aç" name="url_open_internal"/>
+ <menu_item_call label="Harici Tarayıcıda Aç" name="url_open_external"/>
+ <menu_item_call label="URL&apos;yi panoya kopyala" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_url_inventory.xml b/indra/newview/skins/default/xui/tr/menu_url_inventory.xml
new file mode 100644
index 0000000000..3b22c5afec
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_url_inventory.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Envanter Öğesini Göster" name="show_item"/>
+ <menu_item_call label="Adı panoya kopyala" name="url_copy_label"/>
+ <menu_item_call label="SLurl&apos;yi Panoya Kopyala" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_url_map.xml b/indra/newview/skins/default/xui/tr/menu_url_map.xml
new file mode 100644
index 0000000000..770e330516
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_url_map.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Haritada Göster" name="show_on_map"/>
+ <menu_item_call label="Konuma Işınla" name="teleport_to_location"/>
+ <menu_item_call label="SLurl&apos;yi Panoya Kopyala" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_url_objectim.xml b/indra/newview/skins/default/xui/tr/menu_url_objectim.xml
new file mode 100644
index 0000000000..d55e34c11c
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_url_objectim.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Nesne Bilgilerini Göster" name="show_object"/>
+ <menu_item_call label="Haritada Göster" name="show_on_map"/>
+ <menu_item_call label="Nesne Konumuna Işınla" name="teleport_to_object"/>
+ <menu_item_call label="Nesne Adını panoya kopyala" name="url_copy_label"/>
+ <menu_item_call label="SLurl&apos;yi Panoya Kopyala" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_url_parcel.xml b/indra/newview/skins/default/xui/tr/menu_url_parcel.xml
new file mode 100644
index 0000000000..eac1d743c3
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_url_parcel.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Parsel Bilgilerini Göster" name="show_parcel"/>
+ <menu_item_call label="Haritada Göster" name="show_on_map"/>
+ <menu_item_call label="SLurl&apos;yi Panoya Kopyala" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_url_slapp.xml b/indra/newview/skins/default/xui/tr/menu_url_slapp.xml
new file mode 100644
index 0000000000..a2ecfc6a48
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_url_slapp.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Bu Komutu Çalıştır" name="run_slapp"/>
+ <menu_item_call label="SLurl&apos;yi Panoya Kopyala" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_url_slurl.xml b/indra/newview/skins/default/xui/tr/menu_url_slurl.xml
new file mode 100644
index 0000000000..3f4e51b36c
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_url_slurl.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Yer Bilgilerini Göster" name="show_place"/>
+ <menu_item_call label="Haritada Göster" name="show_on_map"/>
+ <menu_item_call label="Konuma Işınla" name="teleport_to_location"/>
+ <menu_item_call label="SLurl&apos;yi Panoya Kopyala" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_url_teleport.xml b/indra/newview/skins/default/xui/tr/menu_url_teleport.xml
new file mode 100644
index 0000000000..b7035a4d8f
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_url_teleport.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Bu Konuma Işınla" name="teleport"/>
+ <menu_item_call label="Haritada Göster" name="show_on_map"/>
+ <menu_item_call label="SLurl&apos;yi Panoya Kopyala" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_viewer.xml b/indra/newview/skins/default/xui/tr/menu_viewer.xml
new file mode 100644
index 0000000000..d7b20bac4b
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_viewer.xml
@@ -0,0 +1,459 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu_bar name="Main Menu">
+ <menu label="Ben" name="Me">
+ <menu_item_call label="Profil..." name="Profile"/>
+ <menu_item_call label="Görünüm..." name="ChangeOutfit"/>
+ <menu_item_call label="Bir avatar seçin..." name="Avatar Picker"/>
+ <menu_item_check label="Envanter..." name="Inventory"/>
+ <menu_item_call label="Yeni Envanter Penceresi" name="NewInventoryWindow"/>
+ <menu_item_call label="Yerler..." name="Places"/>
+ <menu_item_call label="Favoriler..." name="Picks"/>
+ <menu_item_call label="Kamera Denetimleri..." name="Camera Controls"/>
+ <menu label="Hareket" name="Movement">
+ <menu_item_call label="Otur" name="Sit Down Here"/>
+ <menu_item_check label="Uç" name="Fly"/>
+ <menu_item_check label="Daima KoÅŸ" name="Always Run"/>
+ <menu_item_call label="Beni Anime Etmeyi Durdur" name="Stop Animating My Avatar"/>
+ <menu_item_call label="Yürü / koş / uç..." name="Walk / run / fly"/>
+ </menu>
+ <menu label="Durum" name="Status">
+ <menu_item_call label="Uzakta" name="Set Away"/>
+ <menu_item_call label="MeÅŸgul" name="Set Busy"/>
+ </menu>
+ <menu_item_call label="L$ Satın Al..." name="Buy and Sell L$"/>
+ <menu_item_call label="Satıcı Giden Kutusu..." name="MerchantOutbox"/>
+ <menu_item_call label="Hesap kontrol paneli..." name="Manage My Account"/>
+ <menu_item_call label="Tercihler..." name="Preferences"/>
+ <menu_item_call label="Araç çubuğu düğmeleri..." name="Toolbars"/>
+ <menu_item_call label="Tüm denetimleri sakla" name="Hide UI"/>
+ <menu_item_call label="[APP_NAME]&apos;den Çık" name="Quit"/>
+ </menu>
+ <menu label="Ä°letiÅŸim Kur" name="Communicate">
+ <menu_item_check label="Sohbet..." name="Nearby Chat"/>
+ <menu_item_check label="KonuÅŸ" name="Speak"/>
+ <menu_item_check label="Ses ayarları..." name="Nearby Voice"/>
+ <menu_item_check label="Ses ÅŸekillendirme..." name="ShowVoice"/>
+ <menu_item_check label="Mimikler..." name="Gestures"/>
+ <menu_item_call label="ArkadaÅŸlar" name="My Friends"/>
+ <menu_item_call label="Gruplar" name="My Groups"/>
+ <menu_item_call label="Yakındaki kişiler" name="Active Speakers"/>
+ </menu>
+ <menu label="Dünya" name="World">
+ <menu_item_call label="Bu Yeri Yer Ä°mlerine Ekle" name="Create Landmark Here"/>
+ <menu_item_call label="Hedef Konumlar..." name="Destinations"/>
+ <menu_item_check label="Dünya haritası" name="World Map"/>
+ <menu_item_check label="Mini-harita" name="Mini-Map"/>
+ <menu_item_check label="Ara" name="Search"/>
+ <menu_item_call label="Ana konuma ışınlan" name="Teleport Home"/>
+ <menu_item_call label="Ana konumu burası olarak seç" name="Set Home to Here"/>
+ <menu_item_call label="Anlık Görüntü" name="Take Snapshot"/>
+ <menu_item_call label="Profili yerleÅŸtir" name="Place Profile"/>
+ <menu_item_call label="Arazi hakkında" name="About Land"/>
+ <menu_item_call label="Bölge / Gayrimenkul" name="Region/Estate"/>
+ <menu_item_call label="Sahip olduğum arazi parçaları..." name="My Land"/>
+ <menu_item_call label="Bu araziyi satın al" name="Buy Land"/>
+ <menu label="Göster" name="LandShow">
+ <menu_item_check label="Yasaklama Çizgileri" name="Ban Lines"/>
+ <menu_item_check label="Ä°ÅŸaretler" name="beacons"/>
+ <menu_item_check label="Mülkiyet Çizgileri" name="Property Lines"/>
+ <menu_item_check label="Arazi Sahipleri" name="Land Owners"/>
+ <menu_item_check label="Koordinatlar" name="Coordinates"/>
+ <menu_item_check label="Parsel Özellikleri" name="Parcel Properties"/>
+ <menu_item_check label="Gelişmiş Menü" name="Show Advanced Menu"/>
+ </menu>
+ <menu label="Güneş" name="Sun">
+ <menu_item_call label="Gün Doğumu" name="Sunrise"/>
+ <menu_item_call label="Gün Ortası" name="Noon"/>
+ <menu_item_call label="Gün Batımı" name="Sunset"/>
+ <menu_item_call label="Gece Yarısı" name="Midnight"/>
+ <menu_item_call label="Bölge Ayarlarını Kullan" name="Use Region Settings"/>
+ </menu>
+ <menu label="Ortam Düzenleyici" name="Environment Editor">
+ <menu_item_call label="Ortam Ayarları..." name="Environment Settings"/>
+ <menu label="Su Ön Ayarları" name="Water Presets">
+ <menu_item_call label="Yeni ön ayar..." name="new_water_preset"/>
+ <menu_item_call label="Ön ayarı düzenle..." name="edit_water_preset"/>
+ <menu_item_call label="Ön ayarı sil..." name="delete_water_preset"/>
+ </menu>
+ <menu label="Gökyüzü Ön Ayarları" name="Sky Presets">
+ <menu_item_call label="Yeni ön ayar..." name="new_sky_preset"/>
+ <menu_item_call label="Ön ayarı düzenle..." name="edit_sky_preset"/>
+ <menu_item_call label="Ön ayarı sil..." name="delete_sky_preset"/>
+ </menu>
+ <menu label="Gün Ön Ayarları" name="Day Presets">
+ <menu_item_call label="Yeni ön ayar..." name="new_day_preset"/>
+ <menu_item_call label="Ön ayarı düzenle..." name="edit_day_preset"/>
+ <menu_item_call label="Ön ayarı sil..." name="delete_day_preset"/>
+ </menu>
+ </menu>
+ </menu>
+ <menu label="Ä°nÅŸa Et" name="BuildTools">
+ <menu_item_check label="Ä°nÅŸa Et" name="Show Build Tools"/>
+ <menu label="İnşa Et Aracını Seç" name="Select Tool">
+ <menu_item_call label="Odaklanma Aracı" name="Focus"/>
+ <menu_item_call label="Hareket Ettirme Aracı" name="Move"/>
+ <menu_item_call label="Düzenleme Aracı" name="Edit"/>
+ <menu_item_call label="Oluşturma Aracı" name="Create"/>
+ <menu_item_call label="Arazi Aracı" name="Land"/>
+ </menu>
+ <menu_item_call label="BaÄŸla" name="Link"/>
+ <menu_item_call label="BaÄŸlnty. Kopar" name="Unlink"/>
+ <menu_item_check label="Bağlantılı Parçaları Düzenle" name="Edit Linked Parts"/>
+ <menu label="Bağlantılı Parçaları Seç" name="Select Linked Parts">
+ <menu_item_call label="Sonraki Parçayı Seç" name="Select Next Part"/>
+ <menu_item_call label="Önceki Parçayı Seç" name="Select Previous Part"/>
+ <menu_item_call label="Sonraki Parçayı Dahil Et" name="Include Next Part"/>
+ <menu_item_call label="Önceki Parçayı Dahil Et" name="Include Previous Part"/>
+ </menu>
+ <menu_item_call label="Seçime Odaklan" name="Focus on Selection"/>
+ <menu_item_call label="Seçimi Yakınlaştır" name="Zoom to Selection"/>
+ <menu label="Nesne" name="Object">
+ <menu_item_call label="Satın Al" name="Menu Object Buy"/>
+ <menu_item_call label="Al" name="Menu Object Take"/>
+ <menu_item_call label="Kopya Al" name="Take Copy"/>
+ <menu_item_call label="Envanterime Geri Kaydet" name="Save Object Back to My Inventory"/>
+ <menu_item_call label="Nesne İçeriklerine Geri Kaydet" name="Save Object Back to Object Contents"/>
+ <menu_item_call label="Nesneyi Ä°ade Et" name="Return Object back to Owner"/>
+ </menu>
+ <menu label="Komut Dosyaları" name="Scripts">
+ <menu_item_call label="Komut Dosyalarını Tekrar Derle (Mono)" name="Mono"/>
+ <menu_item_call label="Komut Dosyalarını Tekrar Derle (LSL)" name="LSL"/>
+ <menu_item_call label="Komut Dosyalarını Sıfırla" name="Reset Scripts"/>
+ <menu_item_call label="Komut Dosyalarını Çalışıyor Olarak Ayarla" name="Set Scripts to Running"/>
+ <menu_item_call label="Komut Dosyalarını Çalışmıyor Olarak Ayarla" name="Set Scripts to Not Running"/>
+ </menu>
+ <menu label="Seçenklr." name="Options">
+ <menu_item_check label="Gelişmiş İzinleri Göster" name="DebugPermissions"/>
+ <menu_item_check label="Sadece Nesnelerimi Seç" name="Select Only My Objects"/>
+ <menu_item_check label="Sadece Hareket Ettirilebilir Nesneleri Seç" name="Select Only Movable Objects"/>
+ <menu_item_check label="Çevreleyerek Seç" name="Select By Surrounding"/>
+ <menu_item_check label="Seçim Ana Hatlarını Göster" name="Show Selection Outlines"/>
+ <menu_item_check label="Gizli Seçimi Göster" name="Show Hidden Selection"/>
+ <menu_item_check label="Seçim İçin Işık Yarı Çapını Göster" name="Show Light Radius for Selection"/>
+ <menu_item_check label="Seçim Işınını Göster" name="Show Selection Beam"/>
+ <menu_item_check label="AÄŸa Uydur" name="Snap to Grid"/>
+ <menu_item_call label="XY Nesnesini AÄŸa Uydur" name="Snap Object XY to Grid"/>
+ <menu_item_call label="Ağ İçin Seçimi Kullan" name="Use Selection for Grid"/>
+ <menu_item_call label="Ağ Seçenekleri" name="Grid Options"/>
+ </menu>
+ <menu label="Karşıya Yükle" name="Upload">
+ <menu_item_call label="Görüntü (L$[COST])..." name="Upload Image"/>
+ <menu_item_call label="Ses (L$[COST])..." name="Upload Sound"/>
+ <menu_item_call label="Animasyon (L$[COST])..." name="Upload Animation"/>
+ <menu_item_call label="Model..." name="Upload Model"/>
+ <menu_item_call label="Toplu (dosya başına L$[COST])..." name="Bulk Upload"/>
+ <menu_item_call label="Varsayılan Karşıya Yükleme İzinlerini Ayarla" name="perm prefs"/>
+ </menu>
+ <menu_item_call label="Geri Al" name="Undo"/>
+ <menu_item_call label="Yinele" name="Redo"/>
+ </menu>
+ <menu label="Yardım" name="Help">
+ <menu_item_call label="Nasıl yapılır..." name="How To"/>
+ <menu_item_call label="[SECOND_LIFE] Yardımı" name="Second Life Help"/>
+ <menu_item_call label="Kötüye Kullanımı Bildir" name="Report Abuse"/>
+ <menu_item_call label="Hata Bildir" name="Report Bug"/>
+ <menu_item_call label="[APP_NAME] Hakkında" name="About Second Life"/>
+ </menu>
+ <menu label="GeliÅŸmiÅŸ" name="Advanced">
+ <menu_item_call label="Dokuları Tekrar Kaydet" name="Rebake Texture"/>
+ <menu_item_call label="KA Büyüklüğünü Varsayılana Ayarla" name="Set UI Size to Default"/>
+ <menu_item_call label="Pencere Büyüklüğünü Ayarla..." name="Set Window Size..."/>
+ <menu_item_check label="Seçim Mesafesini Sınırla" name="Limit Select Distance"/>
+ <menu_item_check label="Kamera Kısıtlarını Devredışı Bırak" name="Disable Camera Distance"/>
+ <menu_item_check label="Yüksek Çöz. Anlık Görüntü" name="HighResSnapshot"/>
+ <menu_item_check label="Sessiz ve Animasyonsuz Anlık Görüntüleri Diske Kaydet" name="QuietSnapshotsToDisk"/>
+ <menu label="Performans Araçları" name="Performance Tools">
+ <menu_item_call label="Gecikme Ölçer" name="Lag Meter"/>
+ <menu_item_check label="İstatistik Çubuğu" name="Statistics Bar"/>
+ <menu_item_check label="Avatarlar İçin Çizim Ağırlığını Göster" name="Avatar Rendering Cost"/>
+ </menu>
+ <menu label="Vurgulama ve Görünürlük" name="Highlighting and Visibility">
+ <menu_item_check label="Yanıp Sönen İşaret" name="Cheesy Beacon"/>
+ <menu_item_check label="Parçacıkları Gizle" name="Hide Particles"/>
+ <menu_item_check label="Seçilenleri Gizle" name="Hide Selected"/>
+ <menu_item_check label="Saydamı Vurgula" name="Highlight Transparent"/>
+ <menu_item_check label="BÜG Aksesuarlarını Göster" name="Show HUD Attachments"/>
+ <menu_item_check label="Fare Üzerinden Görünüm Artı İşaretini Göster" name="ShowCrosshairs"/>
+ </menu>
+ <menu label="İşleme Türleri" name="Rendering Types">
+ <menu_item_check label="Basit" name="Rendering Type Simple"/>
+ <menu_item_check label="Alfa" name="Rendering Type Alpha"/>
+ <menu_item_check label="Ağaç" name="Rendering Type Tree"/>
+ <menu_item_check label="Avatarlar" name="Rendering Type Character"/>
+ <menu_item_check label="Yüzey Yaması" name="Rendering Type Surface Patch"/>
+ <menu_item_check label="Gökyüzü" name="Rendering Type Sky"/>
+ <menu_item_check label="Su" name="Rendering Type Water"/>
+ <menu_item_check label="Toprak" name="Rendering Type Ground"/>
+ <menu_item_check label="Hacim" name="Rendering Type Volume"/>
+ <menu_item_check label="Çimen" name="Rendering Type Grass"/>
+ <menu_item_check label="Bulutlar" name="Rendering Type Clouds"/>
+ <menu_item_check label="Parçacıklar" name="Rendering Type Particles"/>
+ <menu_item_check label="Tümsek" name="Rendering Type Bump"/>
+ </menu>
+ <menu label="İşleme Özellikleri" name="Rendering Features">
+ <menu_item_check label="KA" name="ToggleUI"/>
+ <menu_item_check label="Seçili" name="Selected"/>
+ <menu_item_check label="Vurgulanmış" name="Highlighted"/>
+ <menu_item_check label="Dinamik Dokular" name="Dynamic Textures"/>
+ <menu_item_check label="Ayak Hizası Gölgeleri" name="Foot Shadows"/>
+ <menu_item_check label="Pus" name="Fog"/>
+ <menu_item_check label="FRInfo Testi" name="Test FRInfo"/>
+ <menu_item_check label="Esnek Nesneler" name="Flexible Objects"/>
+ </menu>
+ <menu_item_check label="İş Parçacığı Okuma Eklentisini Kullan" name="Use Plugin Read Thread"/>
+ <menu_item_call label="Grup Ön Belleğini Temizle" name="ClearGroupCache"/>
+ <menu_item_check label="Fare Düzleştirme" name="Mouse Smoothing"/>
+ <menu_item_call label="Bırakma Anahtarları" name="Release Keys"/>
+ <menu label="Kısa Yollar" name="Shortcuts">
+ <menu_item_check label="Gelişmiş Menüyü Göster - eski kısayol" name="Show Advanced Menu - legacy shortcut"/>
+ <menu_item_call label="Pencereyi Kapat" name="Close Window"/>
+ <menu_item_call label="Tüm Pencereleri Kapat" name="Close All Windows"/>
+ <menu_item_call label="Diske Anlık Görüntü" name="Snapshot to Disk"/>
+ <menu_item_call label="Fare Üzerinden Görünüm" name="Mouselook"/>
+ <menu_item_check label="Oyun Çubuğu Flycam" name="Joystick Flycam"/>
+ <menu_item_call label="Görünümü Sıfırla" name="Reset View"/>
+ <menu_item_call label="Son Sohbet Edene Bak" name="Look at Last Chatter"/>
+ <menu_item_call label="Yakınlaştır" name="Zoom In"/>
+ <menu_item_call label="Varsayılan Yakınlaştırma" name="Zoom Default"/>
+ <menu_item_call label="Uzaklaştırma" name="Zoom Out"/>
+ </menu>
+ <menu_item_call label="Hata Ayıklama Ayarlarını Göster" name="Debug Settings"/>
+ <menu_item_check label="Geliştirme Menüsünü Göster" name="Debug Mode"/>
+ </menu>
+ <menu label="GeliÅŸtir" name="Develop">
+ <menu label="Konsollar" name="Consoles">
+ <menu_item_check label="Doku Konsolu" name="Texture Console"/>
+ <menu_item_check label="Hata Ayıklama Konsolu" name="Debug Console"/>
+ <menu_item_call label="Bildirimler Konsolu" name="Notifications"/>
+ <menu_item_check label="Doku Büyüklüğü Konsolu" name="Texture Size"/>
+ <menu_item_check label="Doku Kategorisi Konsolu" name="Texture Category"/>
+ <menu_item_check label="Hızlı Zamanlayıcılar" name="Fast Timers"/>
+ <menu_item_check label="Bellek" name="Memory"/>
+ <menu_item_check label="Sahne Ä°statistikleri" name="Scene Statistics"/>
+ <menu_item_call label="Hata Ayıklama Konsoluna giden Bölge Bilgisi" name="Region Info to Debug Console"/>
+ <menu_item_call label="Hata Ayıklama Konsoluna giden Grup Bilgisi" name="Group Info to Debug Console"/>
+ <menu_item_call label="Hata Ayıklama Konsoluna giden Özellikler Bilgisi" name="Capabilities Info to Debug Console"/>
+ <menu_item_check label="Kamera" name="Camera"/>
+ <menu_item_check label="Rüzgar" name="Wind"/>
+ <menu_item_check label="Görünüm Alanı" name="FOV"/>
+ <menu_item_check label="Rozet" name="Badge"/>
+ </menu>
+ <menu label="Bilgiyi Göster" name="Display Info">
+ <menu_item_check label="Zamanı Göster" name="Show Time"/>
+ <menu_item_check label="Karşıya Yükleme Maliyetini Göster" name="Show Upload Cost"/>
+ <menu_item_check label="İşleme Bilgisini Göster" name="Show Render Info"/>
+ <menu_item_check label="Doku Bilgisini Göster" name="Show Texture Info"/>
+ <menu_item_check label="Matrisleri Göster" name="Show Matrices"/>
+ <menu_item_check label="İmlecin Altındaki Rengi Göster" name="Show Color Under Cursor"/>
+ <menu_item_check label="Belleği Göster" name="Show Memory"/>
+ <menu_item_check label="Özel Bellek Bilgisini Göster" name="Show Private Mem Info"/>
+ <menu_item_check label="Nesneler İçin Güncelleştirmeleri Göster" name="Show Updates"/>
+ </menu>
+ <menu label="Bir Hatayı Zorla" name="Force Errors">
+ <menu_item_call label="Kesme Noktasını Zorla" name="Force Breakpoint"/>
+ <menu_item_call label="LLError ve Çökme Zorla" name="Force LLError And Crash"/>
+ <menu_item_call label="Hatalı Bellek Erişimini Zorla" name="Force Bad Memory Access"/>
+ <menu_item_call label="Sonsuz Döngüyü Zorla" name="Force Infinite Loop"/>
+ <menu_item_call label="Sürücü Çökmesini Zorla" name="Force Driver Carsh"/>
+ <menu_item_call label="Yazılım Özel Durumunu Zorla" name="Force Software Exception"/>
+ <menu_item_call label="Görüntüleyici Bağlantısının Kesilmesini Zorla" name="Force Disconnect Viewer"/>
+ <menu_item_call label="Bir Bellek Sızıntısı Benzetimini Gerçekleştir" name="Memory Leaking Simulation"/>
+ </menu>
+ <menu label="Ä°ÅŸleme Testleri" name="Render Tests">
+ <menu_item_check label="Kamera Kayması" name="Camera Offset"/>
+ <menu_item_check label="Çerçeve Hızını Rastgele Seç" name="Randomize Framerate"/>
+ <menu_item_check label="Düzenli Yavaş Çerçeve" name="Periodic Slow Frame"/>
+ <menu_item_check label="Çerçeve Testi" name="Frame Test"/>
+ </menu>
+ <menu label="Meta Verileri Ä°ÅŸle" name="Render Metadata">
+ <menu_item_check label="Sınırlama Kutuları" name="Bounding Boxes"/>
+ <menu_item_check label="Normaller" name="Normals"/>
+ <menu_item_check label="Gölgeleme Ağacı" name="Octree"/>
+ <menu_item_check label="Gölge Kesik Koni" name="Shadow Frusta"/>
+ <menu_item_check label="Fizik Åžekilleri" name="Physics Shapes"/>
+ <menu_item_check label="Gölgeleme" name="Occlusion"/>
+ <menu_item_check label="Toplu Ä°ÅŸleri Ä°ÅŸle" name="Render Batches"/>
+ <menu_item_check label="Güncelleştirme Türü" name="Update Type"/>
+ <menu_item_check label="Doku Animasyonu" name="Texture Anim"/>
+ <menu_item_check label="Doku Önceliği" name="Texture Priority"/>
+ <menu_item_check label="Doku Alanı" name="Texture Area"/>
+ <menu_item_check label="Yüz Alanı" name="Face Area"/>
+ <menu_item_check label="Ayrıntı Seviyesi Bilgisi" name="LOD Info"/>
+ <menu_item_check label="Ä°nÅŸa KuyruÄŸu" name="Build Queue"/>
+ <menu_item_check label="Işıklar" name="Lights"/>
+ <menu_item_check label="Çarpışma İskeleti" name="Collision Skeleton"/>
+ <menu_item_check label="Işın Yayını" name="Raycast"/>
+ <menu_item_check label="Rüzgar Vektörleri" name="Wind Vectors"/>
+ <menu_item_check label="İşleme Karmaşıklığı" name="rendercomplexity"/>
+ <menu_item_check label="Aksesuar Bayt Büyüklüğü" name="attachment bytes"/>
+ <menu_item_check label="Åžekillendir" name="Sculpt"/>
+ </menu>
+ <menu label="Ä°ÅŸleme" name="Rendering">
+ <menu_item_check label="Eksenler" name="Axes"/>
+ <menu_item_check label="Tanjant Temeli" name="Tangent Basis"/>
+ <menu_item_call label="Seçilen Doku Bilgi Temeli" name="Selected Texture Info Basis"/>
+ <menu_item_check label="Telkafes" name="Wireframe"/>
+ <menu_item_check label="Görünen Nesneler İçin Gölgeleme" name="Object-Object Occlusion"/>
+ <menu_item_check label="Işıklandırma ve Gölgeler" name="Lighting and Shadows"/>
+ <menu_item_check label="Güneş/Ay/Projektörlerden Gelen Gölgeler" name="Shadows from Sun/Moon/Projectors"/>
+ <menu_item_check label="SSAO ve Gölge Yumuşatma" name="SSAO and Shadow Smoothing"/>
+ <menu_item_check label="GL Hata Ayıklama" name="Debug GL"/>
+ <menu_item_check label="Ardışık Hata Ayıklama" name="Debug Pipeline"/>
+ <menu_item_check label="Otomatik Alfa Maskeleri (ertelenmiÅŸ)" name="Automatic Alpha Masks (deferred)"/>
+ <menu_item_check label="Otomatik Alfa Maskeleri (ertelenmemiÅŸ)" name="Automatic Alpha Masks (non-deferred)"/>
+ <menu_item_check label="Animasyon Dokuları" name="Animation Textures"/>
+ <menu_item_check label="Dokuları Devre Dışı Bırak" name="Disable Textures"/>
+ <menu_item_check label="Tam Çöz. Dokular" name="Rull Res Textures"/>
+ <menu_item_check label="Dokuları Denetle" name="Audit Textures"/>
+ <menu_item_check label="Doku Atlas (deneysel)" name="Texture Atlas"/>
+ <menu_item_check label="Eklenmiş Işıkları İşle" name="Render Attached Lights"/>
+ <menu_item_check label="Eklenmiş Parçacıkları İşle" name="Render Attached Particles"/>
+ <menu_item_check label="Parıldayan Nesneler Üzerine Gel" name="Hover Glow Objects"/>
+ </menu>
+ <menu label="AÄŸ" name="Network">
+ <menu_item_check label="Aracıyı Durdur" name="AgentPause"/>
+ <menu_item_call label="İleti Günlüğünü Etkinleştir" name="Enable Message Log"/>
+ <menu_item_call label="İleti Günlüğünü Devre Dışı Bırak" name="Disable Message Log"/>
+ <menu_item_check label="Nesnelerin Hızını İnterpole Edin" name="Velocity Interpolate Objects"/>
+ <menu_item_check label="Nesne Konumlarını Ping İle İnterpole Edin" name="Ping Interpolate Object Positions"/>
+ <menu_item_call label="Paket Bırakın" name="Drop a Packet"/>
+ </menu>
+ <menu_item_call label="Komut Dosyalı Kameranın Dökümünü Al" name="Dump Scripted Camera"/>
+ <menu_item_call label="Toslamalar, Ä°tmeler ve Vurmalar" name="Bumps, Pushes &amp;amp; Hits"/>
+ <menu label="Kaydedici" name="Recorder">
+ <menu_item_call label="Oynatmayı Başlat" name="Start Playback"/>
+ <menu_item_call label="Oynatmayı Durdur" name="Stop Playback"/>
+ <menu_item_check label="Döngü Oynatma" name="Loop Playback"/>
+ <menu_item_call label="Kaydı Başlat" name="Start Record"/>
+ <menu_item_call label="Kaydı Durdur" name="Stop Record"/>
+ </menu>
+ <menu label="Dünya" name="DevelopWorld">
+ <menu_item_check label="Sim Güneşi Geçersiz Kıl" name="Sim Sun Override"/>
+ <menu_item_check label="Sabit Hava Durumu" name="Fixed Weather"/>
+ <menu_item_call label="Bölge Nesne Önbelleğinin Dökümünü Al" name="Dump Region Object Cache"/>
+ </menu>
+ <menu label="KA" name="UI">
+ <menu_item_call label="Ortam Tarayıcı Testi" name="Web Browser Test"/>
+ <menu_item_call label="Web İçerik Tarayıcısı" name="Web Content Browser"/>
+ <menu_item_call label="SelectMgr&apos;i Dökümünü Al" name="Dump SelectMgr"/>
+ <menu_item_call label="Envanterin Dökümünü Al" name="Dump Inventory"/>
+ <menu_item_call label="Zamanlayıcıların Dökümünü Al" name="Dump Timers"/>
+ <menu_item_call label="Odaklayıcı Tutucunun Dökümünü Al" name="Dump Focus Holder"/>
+ <menu_item_call label="Seçilen Nesne Bilgisini Yazdır" name="Print Selected Object Info"/>
+ <menu_item_call label="Aracı Bilgisini Yazdır" name="Print Agent Info"/>
+ <menu_item_call label="Bellek Ä°statistikleri" name="Memory Stats"/>
+ <menu_item_check label="Bölge Hata Ayıklama Konsolu" name="Region Debug Console"/>
+ <menu_item_check label="SelectMgr İçin Hata Ayıklama" name="Debug SelectMgr"/>
+ <menu_item_check label="Tıklamalar İçin Hata Ayıklama" name="Debug Clicks"/>
+ <menu_item_check label="Görünümler için Hata Ayıklama" name="Debug Views"/>
+ <menu_item_check label="Ad Araç İpuçları İçin Hata Ayıklama" name="Debug Name Tooltips"/>
+ <menu_item_check label="Fare Etkinlikleri İçin Hata Ayıklama" name="Debug Mouse Events"/>
+ <menu_item_check label="Anahtarlar İçin Hata Ayıklama" name="Debug Keys"/>
+ <menu_item_check label="WindowProc İçin Hata Ayıklama" name="Debug WindowProc"/>
+ </menu>
+ <menu label="XUI" name="XUI">
+ <menu_item_call label="Renk Ayarlarını Tekrar Yükle" name="Reload Color Settings"/>
+ <menu_item_call label="Fon Testini Göster" name="Show Font Test"/>
+ <menu_item_check label="XUI Adlarını Göster" name="Show XUI Names"/>
+ <menu_item_call label="Test Amaçlı Aİ&apos;ler Gönder" name="Send Test IMs"/>
+ <menu_item_call label="Ad Önbelleklerini Temizle" name="Flush Names Caches"/>
+ </menu>
+ <menu label="Avatar" name="Character">
+ <menu label="KaydedilmiÅŸ Dokuyu Al" name="Grab Baked Texture">
+ <menu_item_call label="Ä°ris" name="Grab Iris"/>
+ <menu_item_call label="BaÅŸ" name="Grab Head"/>
+ <menu_item_call label="Üst Gövde" name="Grab Upper Body"/>
+ <menu_item_call label="Alt Gövde" name="Grab Lower Body"/>
+ <menu_item_call label="Etek" name="Grab Skirt"/>
+ </menu>
+ <menu label="Karakter Testleri" name="Character Tests">
+ <menu_item_call label="XML&apos;de Görünüm" name="Appearance To XML"/>
+ <menu_item_call label="Karakter Geometrisini Aç/Kapa" name="Toggle Character Geometry"/>
+ <menu_item_call label="Test ErkeÄŸi" name="Test Male"/>
+ <menu_item_call label="Test DiÅŸisi" name="Test Female"/>
+ <menu_item_call label="PG&apos;yi Aç/Kapa" name="Toggle PG"/>
+ <menu_item_check label="Avatar Seçimine İzin Ver" name="Allow Select Avatar"/>
+ </menu>
+ <menu_item_call label="Parametreleri Varsayılana Zorla" name="Force Params to Default"/>
+ <menu_item_check label="Animasyon Bilgisi" name="Animation Info"/>
+ <menu_item_check label="Yavaş Hareket Animasyonları" name="Slow Motion Animations"/>
+ <menu_item_check label="Şuraya Bak&apos;ı Göster" name="Show Look At"/>
+ <menu_item_check label="Şuraya İşaret Et&apos;i Göster" name="Show Point At"/>
+ <menu_item_check label="Eklem Güncelleştirmeleri İçin Hata Ayıklama" name="Debug Joint Updates"/>
+ <menu_item_check label="Ayrıntı Seviyesi Bilgisini Devre Dışı Bırak" name="Disable LOD"/>
+ <menu_item_check label="Debug Character Vis" name="Debug Character Vis"/>
+ <menu_item_check label="Çarpışma İskeletini Göster" name="Show Collision Skeleton"/>
+ <menu_item_check label="Aracı Hedefini Göster" name="Display Agent Target"/>
+ --&gt;
+ <menu_item_call label="Aksesuarların Dökümünü Al" name="Dump Attachments"/>
+ <menu_item_call label="Avatar Dokuları İçin Hata Ayıklama" name="Debug Avatar Textures"/>
+ <menu_item_call label="Yerel Dokuların Dökümünü Al" name="Dump Local Textures"/>
+ </menu>
+ <menu_item_check label="HTTP Dokuları" name="HTTP Textures"/>
+ <menu_item_check label="HTTP Envanteri" name="HTTP Inventory"/>
+ <menu_item_call label="Görüntüleri Sıkıştır" name="Compress Images"/>
+ <menu_item_call label="Visual Leak Detector&apos;ı Etkinleştir" name="Enable Visual Leak Detector"/>
+ <menu_item_check label="Mini Döküm Dosyası Hata Ayıklama Çıktısı" name="Output Debug Minidump"/>
+ <menu_item_check label="Sonraki Çalışmada Konsol Penceresi" name="Console Window"/>
+ <menu label="Günlük Tutma Seviyesini Seç" name="Set Logging Level">
+ <menu_item_check label="Hata ayıkla" name="Debug"/>
+ <menu_item_check label="Bilgi" name="Info"/>
+ <menu_item_check label="Uyarı" name="Warning"/>
+ <menu_item_check label="Hata" name="Error"/>
+ <menu_item_check label="Hiçbiri" name="None"/>
+ </menu>
+ <menu_item_call label="Yönetici Durumu Talep Et" name="Request Admin Options"/>
+ <menu_item_call label="Yönetici Durumundan Ayrıl" name="Leave Admin Options"/>
+ <menu_item_check label="Yönetici Menüsünü Göster" name="View Admin Options"/>
+ </menu>
+ <menu label="Yönetici" name="Admin">
+ <menu label="Nesne" name="AdminObject">
+ <menu_item_call label="Kopya Al" name="Admin Take Copy"/>
+ <menu_item_call label="Zorunlu Olarak Mülkiyetime Geçir" name="Force Owner To Me"/>
+ <menu_item_call label="Sahibin İzinlerini Zorunlu Kıl" name="Force Owner Permissive"/>
+ <menu_item_call label="Sil" name="Delete"/>
+ <menu_item_call label="Kilitle" name="Lock"/>
+ <menu_item_call label="Varlık Kimliklerini Al" name="Get Assets IDs"/>
+ </menu>
+ <menu label="Parsel" name="Parcel">
+ <menu_item_call label="Mülkiyetime Geçir" name="Owner To Me"/>
+ <menu_item_call label="Linden İçeriğine Ayarla" name="Set to Linden Content"/>
+ <menu_item_call label="Kamu Arazisi Ãœzerinde Hak Talep Et" name="Claim Public Land"/>
+ </menu>
+ <menu label="Bölge" name="Region">
+ <menu_item_call label="Geçici Varlık Verilerinin Dökümünü Al" name="Dump Temp Asset Data"/>
+ <menu_item_call label="Bölge Durumunu Kaydet" name="Save Region State"/>
+ </menu>
+ <menu_item_call label="Yönetici Araçları" name="God Tools"/>
+ </menu>
+ <menu label="Yönetici" name="Deprecated">
+ <menu label="Nesneyi Ekle" name="Attach Object"/>
+ <menu label="Nesneyi Ayır" name="Detach Object"/>
+ <menu label="Giysiyi Çıkar" name="Take Off Clothing">
+ <menu_item_call label="Gömlek" name="Shirt"/>
+ <menu_item_call label="Pantolon" name="Pants"/>
+ <menu_item_call label="Ayakkabılar" name="Shoes"/>
+ <menu_item_call label="Çoraplar" name="Socks"/>
+ <menu_item_call label="Ceket" name="Jacket"/>
+ <menu_item_call label="Eldivenler" name="Gloves"/>
+ <menu_item_call label="Fanila" name="Menu Undershirt"/>
+ <menu_item_call label="Külot" name="Menu Underpants"/>
+ <menu_item_call label="Etek" name="Skirt"/>
+ <menu_item_call label="Alfa" name="Alpha"/>
+ <menu_item_call label="Dövme" name="Tattoo"/>
+ <menu_item_call label="Fizik" name="Physics"/>
+ <menu_item_call label="Tüm Giysiler" name="All Clothes"/>
+ </menu>
+ <menu label="Yardım" name="DeprecatedHelp">
+ <menu_item_call label="Resmi Linden Blog&apos;u" name="Official Linden Blog"/>
+ <menu_item_call label="Komut Dosyası Portalı" name="Scripting Portal"/>
+ <menu label="Hata Raporlama" name="Bug Reporting">
+ <menu_item_call label="Kamuya Açık Sorun İzleyicisi" name="Public Issue Tracker"/>
+ <menu_item_call label="Kamuya Açık Sorun İzleyicisi Yardımı" name="Publc Issue Tracker Help"/>
+ <menu_item_call label="Hata Raporlama 101" name="Bug Reporing 101"/>
+ <menu_item_call label="Güvenlik Sorunları" name="Security Issues"/>
+ <menu_item_call label="Soru ve Yanıt Wiki Sayfası" name="QA Wiki"/>
+ </menu>
+ </menu>
+ </menu>
+</menu_bar>
diff --git a/indra/newview/skins/default/xui/tr/menu_wearable_list_item.xml b/indra/newview/skins/default/xui/tr/menu_wearable_list_item.xml
new file mode 100644
index 0000000000..448202df87
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_wearable_list_item.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Outfit Wearable Context Menu">
+ <menu_item_call label="DeÄŸiÅŸtir" name="wear_replace"/>
+ <menu_item_call label="Giy" name="wear_wear"/>
+ <menu_item_call label="Ekle" name="wear_add"/>
+ <menu_item_call label="Çıkar / Ayır" name="take_off_or_detach"/>
+ <menu_item_call label="Ayır" name="detach"/>
+ <context_menu label="Åžuna ekle" name="wearable_attach_to"/>
+ <context_menu label="BÃœG&apos;e Ekle" name="wearable_attach_to_hud"/>
+ <menu_item_call label="Çıkar" name="take_off"/>
+ <menu_item_call label="Düzenle" name="edit"/>
+ <menu_item_call label="Öğe Profili" name="object_profile"/>
+ <menu_item_call label="Orijinali Göster" name="show_original"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_wearing_gear.xml b/indra/newview/skins/default/xui/tr/menu_wearing_gear.xml
new file mode 100644
index 0000000000..438e580cd3
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_wearing_gear.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Gear Wearing">
+ <menu_item_call label="Dış Görünümü Düzenle" name="edit"/>
+ <menu_item_call label="Çıkar" name="takeoff"/>
+ <menu_item_call label="Dış görünüm listesini panoya kopyala" name="copy"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_wearing_tab.xml b/indra/newview/skins/default/xui/tr/menu_wearing_tab.xml
new file mode 100644
index 0000000000..9796546559
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/menu_wearing_tab.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Wearing">
+ <menu_item_call label="Çıkar" name="take_off"/>
+ <menu_item_call label="Ayır" name="detach"/>
+ <menu_item_call label="Dış Görünümü Düzenle" name="edit"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/tr/mime_types.xml b/indra/newview/skins/default/xui/tr/mime_types.xml
new file mode 100644
index 0000000000..c37f872a65
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/mime_types.xml
@@ -0,0 +1,217 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<mimetypes name="default">
+ <widgetset name="web">
+ <label name="web_label">
+ Web İçeriği
+ </label>
+ <tooltip name="web_tooltip">
+ Bu konumda Web içeriği var
+ </tooltip>
+ <playtip name="web_playtip">
+ Web içeriğini göster
+ </playtip>
+ </widgetset>
+ <widgetset name="movie">
+ <label name="movie_label">
+ Film
+ </label>
+ <tooltip name="movie_tooltip">
+ Burada oynatılacak bir film var
+ </tooltip>
+ <playtip name="movie_playtip">
+ Filmi oynat
+ </playtip>
+ </widgetset>
+ <widgetset name="image">
+ <label name="image_label">
+ Görüntü
+ </label>
+ <tooltip name="image_tooltip">
+ Bu konumda bir görüntü var
+ </tooltip>
+ <playtip name="image_playtip">
+ Bu konumdaki görüntüyü göster
+ </playtip>
+ </widgetset>
+ <widgetset name="audio">
+ <label name="audio_label">
+ Ses
+ </label>
+ <tooltip name="audio_tooltip">
+ Bu konumda ses var
+ </tooltip>
+ <playtip name="audio_playtip">
+ Bu konumdaki sesi çal
+ </playtip>
+ </widgetset>
+ <scheme name="rtsp">
+ <label name="rtsp_label">
+ Gerçek Zamanlı Akış
+ </label>
+ </scheme>
+ <mimetype name="blank">
+ <label name="blank_label">
+ - Hiçbiri -
+ </label>
+ </mimetype>
+ <mimetype name="none/none">
+ <label name="none/none_label">
+ - Hiçbiri -
+ </label>
+ </mimetype>
+ <mimetype name="audio/*">
+ <label name="audio2_label">
+ Ses
+ </label>
+ </mimetype>
+ <mimetype name="video/*">
+ <label name="video2_label">
+ Video
+ </label>
+ </mimetype>
+ <mimetype name="image/*">
+ <label name="image2_label">
+ Görüntü
+ </label>
+ </mimetype>
+ <mimetype name="video/vnd.secondlife.qt.legacy">
+ <label name="vnd.secondlife.qt.legacy_label">
+ Film (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="application/javascript">
+ <label name="application/javascript_label">
+ Javascript
+ </label>
+ </mimetype>
+ <mimetype name="application/ogg">
+ <label name="application/ogg_label">
+ Ogg Ses/Video
+ </label>
+ </mimetype>
+ <mimetype name="application/pdf">
+ <label name="application/pdf_label">
+ PDF Belgesi
+ </label>
+ </mimetype>
+ <mimetype name="application/postscript">
+ <label name="application/postscript_label">
+ Postscript Belgesi
+ </label>
+ </mimetype>
+ <mimetype name="application/rtf">
+ <label name="application/rtf_label">
+ Zengin Metin (RTF)
+ </label>
+ </mimetype>
+ <mimetype name="application/smil">
+ <label name="application/smil_label">
+ Eşzamanlı Multimedya Tümleştirme Dili (SMIL)
+ </label>
+ </mimetype>
+ <mimetype name="application/xhtml+xml">
+ <label name="application/xhtml+xml_label">
+ Web Sayfası (XHTML)
+ </label>
+ </mimetype>
+ <mimetype name="application/x-director">
+ <label name="application/x-director_label">
+ Macromedia Director
+ </label>
+ </mimetype>
+ <mimetype name="audio/mid">
+ <label name="audio/mid_label">
+ Ses (MIDI)
+ </label>
+ </mimetype>
+ <mimetype name="audio/mpeg">
+ <label name="audio/mpeg_label">
+ Ses (MP3)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-aiff">
+ <label name="audio/x-aiff_label">
+ Ses (AIFF)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-wav">
+ <label name="audio/x-wav_label">
+ Ses (WAV)
+ </label>
+ </mimetype>
+ <mimetype name="image/bmp">
+ <label name="image/bmp_label">
+ Görüntü (BMP)
+ </label>
+ </mimetype>
+ <mimetype name="image/gif">
+ <label name="image/gif_label">
+ Görüntü (GIF)
+ </label>
+ </mimetype>
+ <mimetype name="image/jpeg">
+ <label name="image/jpeg_label">
+ Görüntü (JPEG)
+ </label>
+ </mimetype>
+ <mimetype name="image/png">
+ <label name="image/png_label">
+ Görüntü (PNG)
+ </label>
+ </mimetype>
+ <mimetype name="image/svg+xml">
+ <label name="image/svg+xml_label">
+ Görüntü (SVG)
+ </label>
+ </mimetype>
+ <mimetype name="image/tiff">
+ <label name="image/tiff_label">
+ Görüntü (TIFF)
+ </label>
+ </mimetype>
+ <mimetype name="text/html">
+ <label name="text/html_label">
+ Web Sayfası
+ </label>
+ </mimetype>
+ <mimetype name="text/plain">
+ <label name="text/plain_label">
+ Metin
+ </label>
+ </mimetype>
+ <mimetype name="text/xml">
+ <label name="text/xml_label">
+ XML
+ </label>
+ </mimetype>
+ <mimetype name="video/mpeg">
+ <label name="video/mpeg_label">
+ Film (MPEG)
+ </label>
+ </mimetype>
+ <mimetype name="video/mp4">
+ <label name="video/mp4_label">
+ Film (MP4)
+ </label>
+ </mimetype>
+ <mimetype name="video/quicktime">
+ <label name="video/quicktime_label">
+ Film (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-asf">
+ <label name="video/x-ms-asf_label">
+ Film (Windows Media ASF)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-wmv">
+ <label name="video/x-ms-wmv_label">
+ Film (Windows Media WMV)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-msvideo">
+ <label name="video/x-msvideo_label">
+ Film (AVI)
+ </label>
+ </mimetype>
+</mimetypes>
diff --git a/indra/newview/skins/default/xui/tr/mime_types_linux.xml b/indra/newview/skins/default/xui/tr/mime_types_linux.xml
new file mode 100644
index 0000000000..c37f872a65
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/mime_types_linux.xml
@@ -0,0 +1,217 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<mimetypes name="default">
+ <widgetset name="web">
+ <label name="web_label">
+ Web İçeriği
+ </label>
+ <tooltip name="web_tooltip">
+ Bu konumda Web içeriği var
+ </tooltip>
+ <playtip name="web_playtip">
+ Web içeriğini göster
+ </playtip>
+ </widgetset>
+ <widgetset name="movie">
+ <label name="movie_label">
+ Film
+ </label>
+ <tooltip name="movie_tooltip">
+ Burada oynatılacak bir film var
+ </tooltip>
+ <playtip name="movie_playtip">
+ Filmi oynat
+ </playtip>
+ </widgetset>
+ <widgetset name="image">
+ <label name="image_label">
+ Görüntü
+ </label>
+ <tooltip name="image_tooltip">
+ Bu konumda bir görüntü var
+ </tooltip>
+ <playtip name="image_playtip">
+ Bu konumdaki görüntüyü göster
+ </playtip>
+ </widgetset>
+ <widgetset name="audio">
+ <label name="audio_label">
+ Ses
+ </label>
+ <tooltip name="audio_tooltip">
+ Bu konumda ses var
+ </tooltip>
+ <playtip name="audio_playtip">
+ Bu konumdaki sesi çal
+ </playtip>
+ </widgetset>
+ <scheme name="rtsp">
+ <label name="rtsp_label">
+ Gerçek Zamanlı Akış
+ </label>
+ </scheme>
+ <mimetype name="blank">
+ <label name="blank_label">
+ - Hiçbiri -
+ </label>
+ </mimetype>
+ <mimetype name="none/none">
+ <label name="none/none_label">
+ - Hiçbiri -
+ </label>
+ </mimetype>
+ <mimetype name="audio/*">
+ <label name="audio2_label">
+ Ses
+ </label>
+ </mimetype>
+ <mimetype name="video/*">
+ <label name="video2_label">
+ Video
+ </label>
+ </mimetype>
+ <mimetype name="image/*">
+ <label name="image2_label">
+ Görüntü
+ </label>
+ </mimetype>
+ <mimetype name="video/vnd.secondlife.qt.legacy">
+ <label name="vnd.secondlife.qt.legacy_label">
+ Film (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="application/javascript">
+ <label name="application/javascript_label">
+ Javascript
+ </label>
+ </mimetype>
+ <mimetype name="application/ogg">
+ <label name="application/ogg_label">
+ Ogg Ses/Video
+ </label>
+ </mimetype>
+ <mimetype name="application/pdf">
+ <label name="application/pdf_label">
+ PDF Belgesi
+ </label>
+ </mimetype>
+ <mimetype name="application/postscript">
+ <label name="application/postscript_label">
+ Postscript Belgesi
+ </label>
+ </mimetype>
+ <mimetype name="application/rtf">
+ <label name="application/rtf_label">
+ Zengin Metin (RTF)
+ </label>
+ </mimetype>
+ <mimetype name="application/smil">
+ <label name="application/smil_label">
+ Eşzamanlı Multimedya Tümleştirme Dili (SMIL)
+ </label>
+ </mimetype>
+ <mimetype name="application/xhtml+xml">
+ <label name="application/xhtml+xml_label">
+ Web Sayfası (XHTML)
+ </label>
+ </mimetype>
+ <mimetype name="application/x-director">
+ <label name="application/x-director_label">
+ Macromedia Director
+ </label>
+ </mimetype>
+ <mimetype name="audio/mid">
+ <label name="audio/mid_label">
+ Ses (MIDI)
+ </label>
+ </mimetype>
+ <mimetype name="audio/mpeg">
+ <label name="audio/mpeg_label">
+ Ses (MP3)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-aiff">
+ <label name="audio/x-aiff_label">
+ Ses (AIFF)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-wav">
+ <label name="audio/x-wav_label">
+ Ses (WAV)
+ </label>
+ </mimetype>
+ <mimetype name="image/bmp">
+ <label name="image/bmp_label">
+ Görüntü (BMP)
+ </label>
+ </mimetype>
+ <mimetype name="image/gif">
+ <label name="image/gif_label">
+ Görüntü (GIF)
+ </label>
+ </mimetype>
+ <mimetype name="image/jpeg">
+ <label name="image/jpeg_label">
+ Görüntü (JPEG)
+ </label>
+ </mimetype>
+ <mimetype name="image/png">
+ <label name="image/png_label">
+ Görüntü (PNG)
+ </label>
+ </mimetype>
+ <mimetype name="image/svg+xml">
+ <label name="image/svg+xml_label">
+ Görüntü (SVG)
+ </label>
+ </mimetype>
+ <mimetype name="image/tiff">
+ <label name="image/tiff_label">
+ Görüntü (TIFF)
+ </label>
+ </mimetype>
+ <mimetype name="text/html">
+ <label name="text/html_label">
+ Web Sayfası
+ </label>
+ </mimetype>
+ <mimetype name="text/plain">
+ <label name="text/plain_label">
+ Metin
+ </label>
+ </mimetype>
+ <mimetype name="text/xml">
+ <label name="text/xml_label">
+ XML
+ </label>
+ </mimetype>
+ <mimetype name="video/mpeg">
+ <label name="video/mpeg_label">
+ Film (MPEG)
+ </label>
+ </mimetype>
+ <mimetype name="video/mp4">
+ <label name="video/mp4_label">
+ Film (MP4)
+ </label>
+ </mimetype>
+ <mimetype name="video/quicktime">
+ <label name="video/quicktime_label">
+ Film (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-asf">
+ <label name="video/x-ms-asf_label">
+ Film (Windows Media ASF)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-wmv">
+ <label name="video/x-ms-wmv_label">
+ Film (Windows Media WMV)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-msvideo">
+ <label name="video/x-msvideo_label">
+ Film (AVI)
+ </label>
+ </mimetype>
+</mimetypes>
diff --git a/indra/newview/skins/default/xui/tr/mime_types_mac.xml b/indra/newview/skins/default/xui/tr/mime_types_mac.xml
new file mode 100644
index 0000000000..c37f872a65
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/mime_types_mac.xml
@@ -0,0 +1,217 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<mimetypes name="default">
+ <widgetset name="web">
+ <label name="web_label">
+ Web İçeriği
+ </label>
+ <tooltip name="web_tooltip">
+ Bu konumda Web içeriği var
+ </tooltip>
+ <playtip name="web_playtip">
+ Web içeriğini göster
+ </playtip>
+ </widgetset>
+ <widgetset name="movie">
+ <label name="movie_label">
+ Film
+ </label>
+ <tooltip name="movie_tooltip">
+ Burada oynatılacak bir film var
+ </tooltip>
+ <playtip name="movie_playtip">
+ Filmi oynat
+ </playtip>
+ </widgetset>
+ <widgetset name="image">
+ <label name="image_label">
+ Görüntü
+ </label>
+ <tooltip name="image_tooltip">
+ Bu konumda bir görüntü var
+ </tooltip>
+ <playtip name="image_playtip">
+ Bu konumdaki görüntüyü göster
+ </playtip>
+ </widgetset>
+ <widgetset name="audio">
+ <label name="audio_label">
+ Ses
+ </label>
+ <tooltip name="audio_tooltip">
+ Bu konumda ses var
+ </tooltip>
+ <playtip name="audio_playtip">
+ Bu konumdaki sesi çal
+ </playtip>
+ </widgetset>
+ <scheme name="rtsp">
+ <label name="rtsp_label">
+ Gerçek Zamanlı Akış
+ </label>
+ </scheme>
+ <mimetype name="blank">
+ <label name="blank_label">
+ - Hiçbiri -
+ </label>
+ </mimetype>
+ <mimetype name="none/none">
+ <label name="none/none_label">
+ - Hiçbiri -
+ </label>
+ </mimetype>
+ <mimetype name="audio/*">
+ <label name="audio2_label">
+ Ses
+ </label>
+ </mimetype>
+ <mimetype name="video/*">
+ <label name="video2_label">
+ Video
+ </label>
+ </mimetype>
+ <mimetype name="image/*">
+ <label name="image2_label">
+ Görüntü
+ </label>
+ </mimetype>
+ <mimetype name="video/vnd.secondlife.qt.legacy">
+ <label name="vnd.secondlife.qt.legacy_label">
+ Film (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="application/javascript">
+ <label name="application/javascript_label">
+ Javascript
+ </label>
+ </mimetype>
+ <mimetype name="application/ogg">
+ <label name="application/ogg_label">
+ Ogg Ses/Video
+ </label>
+ </mimetype>
+ <mimetype name="application/pdf">
+ <label name="application/pdf_label">
+ PDF Belgesi
+ </label>
+ </mimetype>
+ <mimetype name="application/postscript">
+ <label name="application/postscript_label">
+ Postscript Belgesi
+ </label>
+ </mimetype>
+ <mimetype name="application/rtf">
+ <label name="application/rtf_label">
+ Zengin Metin (RTF)
+ </label>
+ </mimetype>
+ <mimetype name="application/smil">
+ <label name="application/smil_label">
+ Eşzamanlı Multimedya Tümleştirme Dili (SMIL)
+ </label>
+ </mimetype>
+ <mimetype name="application/xhtml+xml">
+ <label name="application/xhtml+xml_label">
+ Web Sayfası (XHTML)
+ </label>
+ </mimetype>
+ <mimetype name="application/x-director">
+ <label name="application/x-director_label">
+ Macromedia Director
+ </label>
+ </mimetype>
+ <mimetype name="audio/mid">
+ <label name="audio/mid_label">
+ Ses (MIDI)
+ </label>
+ </mimetype>
+ <mimetype name="audio/mpeg">
+ <label name="audio/mpeg_label">
+ Ses (MP3)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-aiff">
+ <label name="audio/x-aiff_label">
+ Ses (AIFF)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-wav">
+ <label name="audio/x-wav_label">
+ Ses (WAV)
+ </label>
+ </mimetype>
+ <mimetype name="image/bmp">
+ <label name="image/bmp_label">
+ Görüntü (BMP)
+ </label>
+ </mimetype>
+ <mimetype name="image/gif">
+ <label name="image/gif_label">
+ Görüntü (GIF)
+ </label>
+ </mimetype>
+ <mimetype name="image/jpeg">
+ <label name="image/jpeg_label">
+ Görüntü (JPEG)
+ </label>
+ </mimetype>
+ <mimetype name="image/png">
+ <label name="image/png_label">
+ Görüntü (PNG)
+ </label>
+ </mimetype>
+ <mimetype name="image/svg+xml">
+ <label name="image/svg+xml_label">
+ Görüntü (SVG)
+ </label>
+ </mimetype>
+ <mimetype name="image/tiff">
+ <label name="image/tiff_label">
+ Görüntü (TIFF)
+ </label>
+ </mimetype>
+ <mimetype name="text/html">
+ <label name="text/html_label">
+ Web Sayfası
+ </label>
+ </mimetype>
+ <mimetype name="text/plain">
+ <label name="text/plain_label">
+ Metin
+ </label>
+ </mimetype>
+ <mimetype name="text/xml">
+ <label name="text/xml_label">
+ XML
+ </label>
+ </mimetype>
+ <mimetype name="video/mpeg">
+ <label name="video/mpeg_label">
+ Film (MPEG)
+ </label>
+ </mimetype>
+ <mimetype name="video/mp4">
+ <label name="video/mp4_label">
+ Film (MP4)
+ </label>
+ </mimetype>
+ <mimetype name="video/quicktime">
+ <label name="video/quicktime_label">
+ Film (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-asf">
+ <label name="video/x-ms-asf_label">
+ Film (Windows Media ASF)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-wmv">
+ <label name="video/x-ms-wmv_label">
+ Film (Windows Media WMV)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-msvideo">
+ <label name="video/x-msvideo_label">
+ Film (AVI)
+ </label>
+ </mimetype>
+</mimetypes>
diff --git a/indra/newview/skins/default/xui/tr/notifications.xml b/indra/newview/skins/default/xui/tr/notifications.xml
new file mode 100644
index 0000000000..6681cdac7a
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/notifications.xml
@@ -0,0 +1,3125 @@
+<?xml version="1.0" encoding="utf-8"?>
+<notifications>
+ <global name="skipnexttime">
+ Bunu bir daha gösterme
+ </global>
+ <global name="alwayschoose">
+ Her zaman bu seçeneği seç
+ </global>
+ <global name="implicitclosebutton">
+ Kapat
+ </global>
+ <template name="okbutton">
+ <form>
+ <button name="OK_okbutton" text="$yestext"/>
+ </form>
+ </template>
+ <template name="okignore">
+ <form>
+ <button name="OK_okignore" text="$yestext"/>
+ </form>
+ </template>
+ <template name="okcancelbuttons">
+ <form>
+ <button name="OK_okcancelbuttons" text="$yestext"/>
+ <button name="Cancel_okcancelbuttons" text="$notext"/>
+ </form>
+ </template>
+ <template name="okcancelignore">
+ <form>
+ <button name="OK_okcancelignore" text="$yestext"/>
+ <button name="Cancel_okcancelignore" text="$notext"/>
+ </form>
+ </template>
+ <template name="okhelpbuttons">
+ <form>
+ <button name="OK_okhelpbuttons" text="$yestext"/>
+ <button name="Help" text="$helptext"/>
+ </form>
+ </template>
+ <template name="yesnocancelbuttons">
+ <form>
+ <button name="Yes" text="$yestext"/>
+ <button name="No" text="$notext"/>
+ <button name="Cancel_yesnocancelbuttons" text="$canceltext"/>
+ </form>
+ </template>
+ <notification label="Bilinmeyen Bildirim Ä°letisi" name="MissingAlert">
+ [APP_NAME] sürümünüz alınan bildirimi nasıl görüntüleyeceğini bilmiyor. Lütfen Görüntüleyicinin en son sürümünü yüklemiş olduğunuzdan emin olun.
+
+Hata ayrıntıları: &apos;[_NAME]&apos; adlı bildirim notifications.xml içinde bulunamadı.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="FloaterNotFound">
+ Gezdirici hatası: Aşağıdaki denetimler bulunamadı:
+
+[CONTROLS]
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="TutorialNotFound">
+ Şu an için kullanılabilir bir öğretici mevcut değil.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="GenericAlert">
+ [MESSAGE]
+ </notification>
+ <notification name="GenericAlertYesCancel">
+ [MESSAGE]
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Evet"/>
+ </notification>
+ <notification name="BadInstallation">
+ [APP_NAME] güncellenirken bir hata oluştu. Lütfen Görüntüleyici&apos;nin [http://get.secondlife.com son sürümünü karşıdan yükleyin].
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="LoginFailedNoNetwork">
+ [SECOND_LIFE_GRID] ile bağlantı kurulamadı.
+ &apos;[DIAGNOSTIC]&apos;
+İnternet bağlantınızın düzgün çalıştığından emin olun.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="MessageTemplateNotFound">
+ İleti şablonu [PATH] bulunamadı.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="WearableSave">
+ Geçerli giysi/vücut bölümünde yapılan değişiklikler kaydedilsin mi?
+ <usetemplate canceltext="Ä°ptal" name="yesnocancelbuttons" notext="Kaydetme" yestext="Kaydet"/>
+ </notification>
+ <notification name="ConfirmNoCopyToOutbox">
+ Bu öğelerden bir veya daha fazlasını Satıcı Giden Kutusuna kopyalama izniniz yok. Bunları taşıyabilir veya bırakabilirsiniz.
+ <usetemplate name="okcancelbuttons" notext="Öğeleri taşıma" yestext="Öğeleri taşı"/>
+ </notification>
+ <notification name="OutboxFolderCreated">
+ Satıcı Giden Kutunuzun üst seviyesine aktardığınız her bir öğe için yeni bir klasör oluşturuldu.
+ <usetemplate ignoretext="Satıcı Giden Kutusunda yeni bir klasör oluşturuldu" name="okignore" yestext="Tamam"/>
+ </notification>
+ <notification name="OutboxImportComplete">
+ Başarılı oldu
+
+Tüm klasörler başarıyla Pazaryerine gönderildi.
+ <usetemplate ignoretext="Tüm klasörler Pazaryerine gönderildi" name="okignore" yestext="Tamam"/>
+ </notification>
+ <notification name="OutboxImportHadErrors">
+ Bazı klasörler aktarılmadı
+
+Bazı klasörler Pazaryerine gönderildiğinde hatalar meydana geldi. Bu klasörler hala Satıcı Giden Kutunuzda.
+
+Daha fazla bilgi için bkz. [[MARKETPLACE_IMPORTS_URL] hata günlüğü].
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="OutboxImportFailed">
+ Aktarım başarılamadı
+
+Bir sistem veya ağ hatası nedeniyle Pazaryerine hiçbir klasör gönderilemedi. Daha sonra tekrar deneyin.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="OutboxInitFailed">
+ Pazaryeri başlatılamadı.
+
+Bir sistem veya ağ hatası nedeniyle Pazaryeri başlatılamadı. Daha sonra tekrar deneyin.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="CompileQueueSaveText">
+ Aşağıdaki nedenden dolayı, bir komut dosyası için metin karşıya yüklenirken bir sorun oluştu: [REASON]. Lütfen daha sonra tekrar deneyin.
+ </notification>
+ <notification name="CompileQueueSaveBytecode">
+ Aşağıdaki nedenden dolayı, derlenen komut dosyası karşıya yüklenirken bir sorun oluştu: [REASON]. Lütfen daha sonra tekrar deneyin.
+ </notification>
+ <notification name="WriteAnimationFail">
+ Animasyon verileri yazılırken bir sorun oluştu. Lütfen daha sonra tekrar deneyin.
+ </notification>
+ <notification name="UploadAuctionSnapshotFail">
+ Aşağıdaki nedenden dolayı, açık arttırma anlık görüntüsü karşıya yüklenirken bir sorun oluştu: [REASON]
+ </notification>
+ <notification name="UnableToViewContentsMoreThanOne">
+ Aynı anda birden fazla öğenin içeriği görüntülenemiyor.
+Lütfen sadece bir nesne seçin ve tekrar deneyin.
+ </notification>
+ <notification name="SaveClothingBodyChanges">
+ Giysi/vücut bölümlerinde yapılan tüm değişiklikler kaydedilsin mi?
+ <usetemplate canceltext="İptal" name="yesnocancelbuttons" notext="Kaydetme" yestext="Tümünü Kaydet"/>
+ </notification>
+ <notification name="FriendsAndGroupsOnly">
+ Arkadaşınız olmayan kişiler onların çağrılarını ve anlık iletilerini yok saydığınızı bilmeyecek.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="FavoritesOnLogin">
+ Not: Bu seçeneği etkinleştirdiğinizde, bu bilgisayarı kullanan herkes en sevdiğiniz konumlar listenizi görebilecek.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="GrantModifyRights">
+ Başka bir Sakine değişiklik yapma hakkı verdiğinizde, SL dünyasında sahip olduğunuz HERHANGİ BİR nesneyi değiştirebilme, silebilme veya alabilmelerine izin vermiş olursunuz. Bu izni verirken ÇOK dikkatli olun.
+[NAME] adlı kişiye değişiklik yapma hakkı vermek istiyor musunuz?
+ <usetemplate name="okcancelbuttons" notext="Hayır" yestext="Evet"/>
+ </notification>
+ <notification name="GrantModifyRightsMultiple">
+ Başka bir Sakine değişiklik yapma hakkı verdiğinizde, SL dünyasında sahip olduğunuz HERHANGİ BİR nesneyi değiştirebilmelerine izin vermiş olursunuz. Bu izni verirken ÇOK dikkatli olun.
+Seçili Sakinlere değişiklik yapma hakkı vermek istiyor musunuz?
+ <usetemplate name="okcancelbuttons" notext="Hayır" yestext="Evet"/>
+ </notification>
+ <notification name="RevokeModifyRights">
+ [NAME] adlı kişinin değişiklik yapma hakkını iptal etmek istiyor musunuz?
+ <usetemplate name="okcancelbuttons" notext="Hayır" yestext="Evet"/>
+ </notification>
+ <notification name="RevokeModifyRightsMultiple">
+ Seçili Sakinlerin değişiklik yapma hakkını iptal etmek istiyor musunuz?
+ <usetemplate name="okcancelbuttons" notext="Hayır" yestext="Evet"/>
+ </notification>
+ <notification name="UnableToCreateGroup">
+ Grup oluşturulamıyor.
+[MESSAGE]
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="PanelGroupApply">
+ [NEEDS_APPLY_MESSAGE]
+[WANT_APPLY_MESSAGE]
+ <usetemplate canceltext="Ä°ptal" name="yesnocancelbuttons" notext="DeÄŸiÅŸiklikleri Yok Say" yestext="DeÄŸiÅŸiklikleri Uygula"/>
+ </notification>
+ <notification name="MustSpecifyGroupNoticeSubject">
+ Grup notu göndermek için bir konu belirtmelisiniz.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="AddGroupOwnerWarning">
+ Grup üyelerini [ROLE_NAME] rolüne eklemek üzeresiniz.
+Üyeler bu rolden çıkarılamaz.
+Üyeler rolden kendi istekleriyle ayrılabilir.
+Devam etmek istediÄŸinize emin misiniz?
+ <usetemplate ignoretext="Yeni bir grup Sahibi eklemeden önce doğrulama iste" name="okcancelignore" notext="Hayır" yestext="Evet"/>
+ </notification>
+ <notification name="AssignDangerousActionWarning">
+ [ROLE_NAME] rolüne &apos;[ACTION_NAME]&apos; Yeteneğini eklemek üzeresiniz.
+
+ *UYARI*
+ Bu Yeteneğe sahip olan bir Roldeki herhangi bir Üye kendisini -- ve istediği diğer üyeleri -- şu anda sahip olduklarından daha fazla güce sahip olan Rollere atayabilir, kendi güçlerini Grup Sahibininkine yakın bir güce yükseltebilir. Bu Yeteneği atamadan önce ne yaptığınızı bildiğinizden emin olun.
+
+Bu Yetenek &apos;[ROLE_NAME]&apos; rolüne eklensin mi?
+ <usetemplate name="okcancelbuttons" notext="Hayır" yestext="Evet"/>
+ </notification>
+ <notification name="AssignDangerousAbilityWarning">
+ [ROLE_NAME] rolüne &apos;[ACTION_NAME]&apos; Yeteneğini eklemek üzeresiniz.
+
+ *UYARI*
+ Bu Yeteneğe sahip olan bir Roldeki herhangi bir Üye kendisine -- ve istediği diğer üyelere -- tüm Yetenekleri atayabilir, kendi güçlerini Grup Sahibininkine yakın bir güce yükseltebilir.
+
+Bu Yetenek &apos;[ROLE_NAME]&apos; rolüne eklensin mi?
+ <usetemplate name="okcancelbuttons" notext="Hayır" yestext="Evet"/>
+ </notification>
+ <notification name="AttachmentDrop">
+ Aksesuarınızı çıkarmak üzeresiniz.
+ Devam etmek istediÄŸinize emin misiniz?
+ <usetemplate ignoretext="Aksesuarları çıkarmadan önce doğrulama iste" name="okcancelignore" notext="Hayır" yestext="Evet"/>
+ </notification>
+ <notification name="JoinGroupCanAfford">
+ Bu gruba katılmanın maliyeti: L$ [COST].
+Devam etmek istiyor musunuz?
+ <usetemplate name="okcancelbuttons" notext="İptal Et" yestext="Katıl"/>
+ </notification>
+ <notification name="JoinGroupNoCost">
+ [NAME] grubuna katılıyorsunuz.
+Devam etmek istiyor musunuz?
+ <usetemplate name="okcancelbuttons" notext="İptal Et" yestext="Katıl"/>
+ </notification>
+ <notification name="JoinGroupCannotAfford">
+ Bu gruba katılmanın maliyeti: L$ [COST].
+Bu gruba katılmak için yeterli L$&apos;na sahip değilsiniz.
+ </notification>
+ <notification name="CreateGroupCost">
+ Bu grubu oluşturmanın maliyeti: L$ 100.
+Grupların birden fazla üyeye sahip olması gereklidir, aksi takdirde grup kalıcı olarak silinir.
+Lütfen 48 saat içinde diğer üyeleri davet edin.
+ <usetemplate canceltext="İptal" name="okcancelbuttons" notext="İptal" yestext="L$ 100 ödeyerek grubu oluştur"/>
+ </notification>
+ <notification name="LandBuyPass">
+ L$ [COST] ödeyerek (&apos;[PARCEL_NAME]&apos;) arazisine [TIME] saat süreyle girebilirsiniz. Giriş hakkı satın almak istiyor musunuz?
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="SalePriceRestriction">
+ Herhangi birine satış yaparken satış fiyatı L$ 0&apos;dan daha yüksek bir değere ayarlanmalıdır.
+L$ 0 fiyatla satış yapıyorsanız lütfen satışın yapılacağı kişiyi seçin.
+ </notification>
+ <notification name="ConfirmLandSaleChange">
+ Seçili [LAND_SIZE] m² arazi satışa çıkarılmak üzere ayarlanıyor.
+Satış fiyatınız L$ [SALE_PRICE] olacak ve [NAME] için satışa açık olacaktır.
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ConfirmLandSaleToAnyoneChange">
+ DİKKAT: &apos;Herkes için satışa açık&apos; seçeneğinin tıklanması, arazinizi tüm [SECOND_LIFE] topluluğuna açık hale getirir, bu bölgede bulunmayanlar da buna dahildir.
+
+Seçili [LAND_SIZE] m² arazi satışa çıkarılmak üzere ayarlanıyor.
+Satış fiyatınız L$ [SALE_PRICE] olacak ve [NAME] için satışa açık olacaktır.
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ReturnObjectsDeededToGroup">
+ &apos;[NAME]&apos; grubuyla bu arazi parseli üzerinde paylaşılan tüm nesneleri önceki sahiplerinin envanterine iade etmek istediğinize emin misiniz?
+
+*UYARI* Bu eylem, gruba devredilen nesnelerden aktarılması mümkün olmayanları silecektir!
+
+Nesneler: [N]
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ReturnObjectsOwnedByUser">
+ &apos;[NAME]&apos; adlı Sakinin bu arazi parseli üzerinde sahip olduğu tüm nesneleri envanterlerine iade etmek istediğinize emin misiniz?
+
+Nesneler: [N]
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ReturnObjectsOwnedBySelf">
+ Bu arazi parseli üzerinde sahip olduğunuz tüm nesneleri envanterinize iade etmek istediğinize emin misiniz?
+
+Nesneler: [N]
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ReturnObjectsNotOwnedBySelf">
+ Bu arazi parseli üzerinde sizin sahip OLMADIĞINIZ tüm nesneleri kendi sahiplerinin envanterlerine iade etmek istediğinize emin misiniz?
+Bir gruba devredilen nesnelerden aktarılması mümkün olanlar önceki sahiplerine iade edilecektir.
+
+*UYARI* Bu eylem, gruba devredilen nesnelerden aktarılması mümkün olmayanları silecektir!
+
+Nesneler: [N]
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ReturnObjectsNotOwnedByUser">
+ Bu arazi parseli üzerinde [NAME] adlı kişinin sahip OLMADIĞI tüm nesneleri kendi sahiplerinin envanterlerine iade etmek istediğinize emin misiniz?
+Bir gruba devredilen nesnelerden aktarılması mümkün olanlar önceki sahiplerine iade edilecektir.
+
+*UYARI* Bu eylem, gruba devredilen nesnelerden aktarılması mümkün olmayanları silecektir!
+
+Nesneler: [N]
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ReturnAllTopObjects">
+ Listelenen tüm nesneleri kendi sahiplerinin envanterlerine iade etmek istediğinize emin misiniz?
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="DisableAllTopObjects">
+ Bu bölgedeki tüm nesneleri devre dışı bırakmak istediğinize emin misiniz?
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ReturnObjectsNotOwnedByGroup">
+ Bu arazi parseli üzerinde [NAME] grubuyla PAYLAŞILMAYAN nesneler sahiplerinin envanterine iade edilsin mi?
+
+Nesneler: [N]
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="UnableToDisableOutsideScripts">
+ Komut dosyaları devre dışı bırakılamıyor.
+Bu bölgenin tamamında hasar özelliği etkin.
+Silahların işlemesi için komut dosyalarının çalışmasına izin verilmelidir.
+ </notification>
+ <notification name="MultipleFacesSelected">
+ Şu anda birden fazla yüz seçili.
+Bu eyleme devam ederseniz, nesnenin birden fazla yüzünde ayrı ortam örnekleri ayarlanacak.
+Ortamı sadece bir yüze yerleştirmek için, Yüz Seç&apos;i seçin ve ardından nesnenin istenen yüzünü tıklayıp Ekle&apos;yi tıklatın.
+ <usetemplate ignoretext="Ortam, seçilen birden fazla yüz üzerinde ayarlanacak" name="okcancelignore" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="MustBeInParcel">
+ İniş Noktasını ayarlamak için arazi parselinin içinde duruyor olmalısınız.
+ </notification>
+ <notification name="PromptRecipientEmail">
+ Lütfen alıcı(lar) için geçerli bir e-posta adresi girin.
+ </notification>
+ <notification name="PromptSelfEmail">
+ Lütfen e-posta adresinizi girin.
+ </notification>
+ <notification name="PromptMissingSubjMsg">
+ Anlık görüntü varsayılan konu ya da iletiyle gönderilsin mi?
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ErrorProcessingSnapshot">
+ Anlık görüntü verileri işlenirken hata oluştu
+ </notification>
+ <notification name="ErrorEncodingSnapshot">
+ Anlık görüntü kodlanırken hata oluştu.
+ </notification>
+ <notification name="ErrorUploadingPostcard">
+ Aşağıdaki nedenden dolayı, anlık görüntü gönderilirken bir sorun oluştu: [REASON]
+ </notification>
+ <notification name="ErrorUploadingReportScreenshot">
+ Aşağıdaki nedenden dolayı, bir raporun ekran görüntüsü karşıya yüklenirken bir sorun oluştu: [REASON]
+ </notification>
+ <notification name="MustAgreeToLogIn">
+ [SECOND_LIFE]&apos;ta oturum açmaya devam etmek için Hizmet Sözleşmesi&apos;ni kabul etmelisiniz.
+ </notification>
+ <notification name="CouldNotPutOnOutfit">
+ Dış görünüm eklenemedi.
+Dış görünüm klasöründe hiç giysi, vücut bölümü ya da aksesuar yok.
+ </notification>
+ <notification name="CannotWearTrash">
+ Çöp kutusundaki giysileri veya vücut bölümlerini kullanamazsınız.
+ </notification>
+ <notification name="MaxAttachmentsOnOutfit">
+ Nesne eklenemedi.
+[MAX_ATTACHMENTS] nesnelik aksesuar sınırı aşıldı. Lütfen önce başka bir nesneyi çıkarın.
+ </notification>
+ <notification name="CannotWearInfoNotComplete">
+ Bu öğe henüz yüklenmediği için kullanamazsınız. Lütfen bir dakika sonra tekrar deneyin.
+ </notification>
+ <notification name="MustHaveAccountToLogIn">
+ Hata! Boş bırakılan alan(lar) var.
+Avatarınızın Kullanıcı adını girmeniz gerekmektedir.
+
+[SECOND_LIFE]&apos;a giriş yapmak için bir hesabınız olması gerekir. Şimdi bir hesap oluşturmak ister misiniz?
+ <url name="url">
+ http://join.secondlife.com/
+ </url>
+ <usetemplate name="okcancelbuttons" notext="Tekrar dene" yestext="Yeni bir hesap oluÅŸtur"/>
+ </notification>
+ <notification name="InvalidCredentialFormat">
+ Kullanıcı adı alanına Avatarınızın Kullanıcı adını ya da Ad ve Soyadını girmeniz ve yeniden oturum açmanız gerekmektedir.
+ </notification>
+ <notification name="DeleteClassified">
+ &apos;[NAME]&apos; ilanı silinsin mi?
+Ödenen ücretler iade edilmeyecektir.
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="DeleteMedia">
+ Bu yüzle ilişkili ortamı silmeyi seçtiniz.
+Devam etmek istediÄŸinize emin misiniz?
+ <usetemplate ignoretext="Bir nesneden ortam silmeden önce doğrulama iste" name="okcancelignore" notext="Hayır" yestext="Evet"/>
+ </notification>
+ <notification name="ClassifiedSave">
+ [NAME] ilanına yapılan değişiklikler kaydedilsin mi?
+ <usetemplate canceltext="Ä°ptal" name="yesnocancelbuttons" notext="Kaydetme" yestext="Kaydet"/>
+ </notification>
+ <notification name="ClassifiedInsufficientFunds">
+ İlan oluşturmak için yeterli fon yok.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="DeleteAvatarPick">
+ Seçme &lt;nolink&gt;[PICK]&lt;/nolink&gt; silinsin mi?
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="DeleteOutfits">
+ Seçili dış görünüm silinsin mi?
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="PromptGoToEventsPage">
+ [SECOND_LIFE] etkinlikleri web sayfasına gidilsin mi?
+ <url name="url">
+ http://secondlife.com/events/
+ </url>
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="SelectProposalToView">
+ Lütfen görüntülemek için bir teklif seçin.
+ </notification>
+ <notification name="SelectHistoryItemToView">
+ Lütfen görüntülemek için bir geçmiş öğesi seçin.
+ </notification>
+ <notification name="CacheWillClear">
+ Önbellek, [APP_NAME] uygulamasını yeniden başlattıktan sonra temizlenecek.
+ </notification>
+ <notification name="CacheWillBeMoved">
+ Önbellek, [APP_NAME] uygulamasını yeniden başlattıktan sonra taşınacak.
+Not: Bu işlem önbelleği temizleyecek.
+ </notification>
+ <notification name="ChangeConnectionPort">
+ Port ayarları, [APP_NAME] uygulamasını yeniden başlattıktan sonra geçerli olur.
+ </notification>
+ <notification name="ChangeSkin">
+ Yeni dış katman [APP_NAME] uygulamasını yeniden başlattıktan sonra görüntülenecek.
+ </notification>
+ <notification name="ChangeLanguage">
+ Dil değişikliği, [APP_NAME] uygulamasını yeniden başlattıktan sonra geçerli olacak.
+ </notification>
+ <notification name="GoToAuctionPage">
+ Açık arttırma detaylarını görmek veya teklif vermek için [SECOND_LIFE] web sayfasına gidilsin mi?
+ <url name="url">
+ http://secondlife.com/auctions/auction-detail.php?id=[AUCTION_ID]
+ </url>
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="SaveChanges">
+ DeÄŸiÅŸiklikler Kaydedilsin mi?
+ <usetemplate canceltext="Ä°ptal" name="yesnocancelbuttons" notext="Kaydetme" yestext="Kaydet"/>
+ </notification>
+ <notification name="GestureSaveFailedTooManySteps">
+ Mimik kaydedilemedi.
+Bu mimikte çok fazla adım var.
+Bazı adımları çıkarıp yeniden kaydetmeyi deneyin.
+ </notification>
+ <notification name="GestureSaveFailedTryAgain">
+ Mimik kaydedilemedi. Lütfen bir dakika sonra tekrar deneyin.
+ </notification>
+ <notification name="GestureSaveFailedObjectNotFound">
+ Nesne veya ilişkili nesne envanteri bulunamadığı için mimik kaydedilemedi.
+Nesne aralık dışında ya da silinmiş olabilir.
+ </notification>
+ <notification name="GestureSaveFailedReason">
+ Aşağıdaki nedenden dolayı, mimik kaydedilirken bir sorun oluştu: [REASON]. Lütfen mimiği kaydetmeyi daha sonra tekrar deneyin.
+ </notification>
+ <notification name="SaveNotecardFailObjectNotFound">
+ Nesne veya ilişkili nesne envanteri bulunamadığı için not kartı kaydedilemedi.
+Nesne aralık dışında ya da silinmiş olabilir.
+ </notification>
+ <notification name="SaveNotecardFailReason">
+ Aşağıdaki nedenden dolayı, not kartı kaydedilirken bir sorun oluştu: [REASON]. Lütfen not kartını kaydetmeyi daha sonra tekrar deneyin.
+ </notification>
+ <notification name="ScriptCannotUndo">
+ Komut dosyası sürümünüzdeki tüm değişiklikler geri alınamadı.
+Sunucunun son kaydedilmiş sürümünü yüklemek ister misiniz?
+(**Uyarı** Bu işlem geri alınamaz.)
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="SaveScriptFailReason">
+ Aşağıdaki nedenden dolayı, komut dosyası kaydedilirken bir sorun oluştu: [REASON]. Lütfen komut dosyasını kaydetmeyi daha sonra tekrar deneyin.
+ </notification>
+ <notification name="SaveScriptFailObjectNotFound">
+ İçinde olduğu nesne bulunamadığından komut dosyası kaydedilemiyor.
+Nesne aralık dışında ya da silinmiş olabilir.
+ </notification>
+ <notification name="SaveBytecodeFailReason">
+ Aşağıdaki nedenden dolayı, derlenen komut dosyası kaydedilirken bir sorun oluştu: [REASON]. Lütfen komut dosyasını kaydetmeyi daha sonra tekrar deneyin.
+ </notification>
+ <notification name="StartRegionEmpty">
+ Hata. Başlangıç Bölgeniz tanımlanmamış.
+Lütfen Başlangıç Konumu kutusuna Bölge adını yazın ya da Son Konumum veya Ana Konumumu Başlangıç Konumu olarak seçin.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="CouldNotStartStopScript">
+ Üzerinde bulunduğu nesne bulunamadığından komut dosyası başlatılamadı veya durdurulamadı.
+Nesne aralık dışında ya da silinmiş olabilir.
+ </notification>
+ <notification name="CannotDownloadFile">
+ Dosya karşıdan yüklenemiyor.
+ </notification>
+ <notification name="CannotWriteFile">
+ [[FILE]] dosyası yazılamıyor.
+ </notification>
+ <notification name="UnsupportedHardware">
+ Bilgisayarınızın [APP_NAME] uygulamasının minimum sistem gereksinimlerini karşılamadığını bildirmek durumundayız. Performans düşüklüğü yaşayabilirsiniz. Ne yazık ki, [SUPPORT_SITE] desteklenmeyen sistem yapılandırmaları için teknik destek verememektedir.
+
+Daha fazla bilgi için [_URL] adresini ziyaret etmek ister misiniz?
+ <url name="url">
+ http://www.secondlife.com/corporate/sysreqs.php
+ </url>
+ <usetemplate ignoretext="Bilgisayar donanımım desteklenmiyor" name="okcancelignore" notext="Hayır" yestext="Evet"/>
+ </notification>
+ <notification name="UnknownGPU">
+ Sisteminiz [APP_NAME] uygulamasının tanımadığı bir grafik kartı içeriyor.
+Bu durum genellikle [APP_NAME] uygulaması ile henüz denenmemiş yeni donanımlar kullanıldığında ortaya çıkar. Büyük olasılıkla bir sorun çıkmayacaktır, fakat grafik ayarlarınızı değiştirmeniz gerekebilir.
+(Ben &gt; Tercihler &gt; Grafikler).
+ <form name="form">
+ <ignore name="ignore" text="Grafik kartım tanımlanamadı."/>
+ </form>
+ </notification>
+ <notification name="DisplaySettingsNoShaders">
+ Grafik sürücüleri başlatılırken [APP_NAME] uygulaması kilitlendi.
+Sık görülen bazı sürücü hatalarından kaçınmak için Grafik Kalitesi Düşük olarak ayarlanacak. Bu işlem bazı grafik özelliklerini devre dışı bırakacak.
+Grafik kartı sürücülerinizi güncellemenizi öneririz.
+Grafik Kalitesi, Tercihler &gt; Grafikler sekmesinden yükseltilebilir.
+ </notification>
+ <notification name="RegionNoTerraforming">
+ [REGION] bölgesi yer şekillendirmeye izin vermiyor.
+ </notification>
+ <notification name="CannotCopyWarning">
+ Aşağıdaki öğeleri kopyalamak için gerekli izne sahip değilsiniz:
+[ITEMS]
+Bu öğeleri verdiğiniz takdirde envanterinizden çıkacaklar. Bu öğeleri teklif etmeyi gerçekten istiyor musunuz?
+ <usetemplate name="okcancelbuttons" notext="Hayır" yestext="Evet"/>
+ </notification>
+ <notification name="CannotGiveItem">
+ Envanter öğesi verilemiyor.
+ </notification>
+ <notification name="TransactionCancelled">
+ Ä°ÅŸlem iptal edildi.
+ </notification>
+ <notification name="TooManyItems">
+ Tek bir envanter aktarımında 42 öğeden fazlası verilemez.
+ </notification>
+ <notification name="NoItems">
+ Seçili öğeleri aktarmak için gerekli izne sahip değilsiniz.
+ </notification>
+ <notification name="CannotCopyCountItems">
+ Seçili öğelerin [COUNT] tanesini kopyalamak için gerekli izne sahip değilsiniz. Bu öğeler envanterinizden çıkacak.
+Bu öğeleri vermeyi gerçekten istiyor musunuz?
+ <usetemplate name="okcancelbuttons" notext="Hayır" yestext="Evet"/>
+ </notification>
+ <notification name="CannotGiveCategory">
+ Seçili klasörü aktarmak için gerekli izne sahip değilsiniz.
+ </notification>
+ <notification name="FreezeAvatar">
+ Bu avatar dondurulsun mu?
+Avatar geçici bir süre için hareket etme, sohbet etme veya dünya ile etkileşim kurma yeteneğini kullanamayacak.
+ <usetemplate canceltext="İptal" name="yesnocancelbuttons" notext="Çöz" yestext="Dondur"/>
+ </notification>
+ <notification name="FreezeAvatarFullname">
+ [AVATAR_NAME] dondurulsun mu?
+Avatar geçici bir süre için hareket etme, sohbet etme veya dünya ile etkileşim kurma yeteneğini kullanamayacak.
+ <usetemplate canceltext="İptal" name="yesnocancelbuttons" notext="Çöz" yestext="Dondur"/>
+ </notification>
+ <notification name="EjectAvatarFullname">
+ [AVATAR_NAME] arazinizden çıkarılsın mı?
+ <usetemplate canceltext="İptal" name="yesnocancelbuttons" notext="Çıkar ve Yasakla" yestext="Çıkar"/>
+ </notification>
+ <notification name="EjectAvatarNoBan">
+ Bu avatar arazinizden çıkarılsın mı?
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Çıkar"/>
+ </notification>
+ <notification name="EjectAvatarFullnameNoBan">
+ [AVATAR_NAME] arazinizden çıkarılsın mı?
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Çıkar"/>
+ </notification>
+ <notification name="EjectAvatarFromGroup">
+ [AVATAR_NAME] adlı kişiyi [GROUP_NAME] grubundan çıkardınız
+ </notification>
+ <notification name="AcquireErrorTooManyObjects">
+ ALMA HATASI: Çok fazla nesne seçilmiş.
+ </notification>
+ <notification name="AcquireErrorObjectSpan">
+ ALMA HATASI: Nesneler bir bölgenin kapsamı dışına yayılıyor.
+Lütfen alınacak tüm nesneleri aynı bölgeye taşıyın.
+ </notification>
+ <notification name="PromptGoToCurrencyPage">
+ [EXTRA]
+
+L$ satın alma ile ilgili bilgi edinmek için [_URL] adresine gidilsin mi?
+ <url name="url">
+ http://secondlife.com/app/currency/
+ </url>
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="UnableToLinkObjects">
+ Bu [COUNT] nesne birbirine bağlanamıyor.
+En fazla [MAX] nesneyi birbirine baÄŸlayabilirsiniz.
+ </notification>
+ <notification name="CannotLinkIncompleteSet">
+ Sadece tamamlanmış nesne kümelerini birbirine bağlayabilirsiniz ve birden fazla nesne seçmelisiniz.
+ </notification>
+ <notification name="CannotLinkModify">
+ Tüm nesneler üzerinde değişiklik yapma izniniz olmadığı için nesneler birbirine bağlanamıyor.
+
+Lütfen hiçbirinin kilitli olmadığından ve hepsine sahip olduğunuzdan emin olun.
+ </notification>
+ <notification name="CannotLinkDifferentOwners">
+ Nesnelerin hepsinin sahibi aynı olmadığı için nesneler birbirine bağlanamıyor.
+
+Lütfen seçili nesnelerin hepsine sahip olduğunuzdan emin olun.
+ </notification>
+ <notification name="NoFileExtension">
+ Aşağıdaki dosyanın dosya uzantısı yok: &apos;[FILE]&apos;
+
+Lütfen dosyanın doğru bir dosya uzantısına sahip olduğundan emin olun..
+ </notification>
+ <notification name="InvalidFileExtension">
+ Geçersiz dosya uzantısı [EXTENSION]
+Beklenen [VALIDS]
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="CannotUploadSoundFile">
+ Karşıya yüklenen ses dosyası okuma için açılamadı:
+[FILE]
+ </notification>
+ <notification name="SoundFileNotRIFF">
+ Dosya bir RIFF WAVE dosyası gibi görünmüyor:
+[FILE]
+ </notification>
+ <notification name="SoundFileNotPCM">
+ Dosya bir PCM WAVE ses dosyası gibi görünmüyor:
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidChannelCount">
+ Dosyada geçersiz sayıda kanal mevcut (mono ya da stereo olmalı):
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidSampleRate">
+ Dosya desteklenen bir örnek hızına sahip görünmüyor (44.1k olmalı):
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidWordSize">
+ Dosya desteklenen bir sözcük boyutuna sahip görünmüyor (8 veya 16 bit olmalı):
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidHeader">
+ WAV başlığında &apos;veri&apos; öbeği bulunamadı:
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidChunkSize">
+ WAV dosyasında yanlış öbek boyutu:
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidTooLong">
+ Ses dosyası çok uzun (En fazla 10 saniye olmalı):
+[FILE]
+ </notification>
+ <notification name="ProblemWithFile">
+ [FILE] dosyasında sorun oluştu:
+
+[ERROR]
+ </notification>
+ <notification name="CannotOpenTemporarySoundFile">
+ Geçici sıkıştırılmış ses dosyası yazma için açılamadı: [FILE]
+ </notification>
+ <notification name="UnknownVorbisEncodeFailure">
+ Şu dosyada bilinmeyen Vorbis kodlama arızası: [FILE]
+ </notification>
+ <notification name="CannotEncodeFile">
+ Şu dosya kodlanamıyor: [FILE]
+ </notification>
+ <notification name="CorruptedProtectedDataStore">
+ Kullanıcı adı ve şifre alanlarınızı dolduramıyoruz. Bu durum ağ ayarlarınızı değiştirdiğinizde ortaya çıkabilir.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="CorruptResourceFile">
+ Bozuk kaynak dosyası: [FILE]
+ </notification>
+ <notification name="UnknownResourceFileVersion">
+ Şu dosyada bilinmeyen Linden kaynak dosyası sürümü mevcut: [FILE]
+ </notification>
+ <notification name="UnableToCreateOutputFile">
+ Çıkış dosyası oluşturulamıyor: [FILE]
+ </notification>
+ <notification name="DoNotSupportBulkAnimationUpload">
+ [APP_NAME] şu an için BVH formatında animasyon dosyalarının toplu olarak yüklenmesini desteklemiyor.
+ </notification>
+ <notification name="CannotUploadReason">
+ Aşağıdaki nedenden dolayı [FILE] dosyası karşıya yüklenemedi: [REASON]
+Lütfen daha sonra tekrar deneyin.
+ </notification>
+ <notification name="LandmarkCreated">
+ &quot;[LANDMARK_NAME]&quot; yer imini [FOLDER_NAME] klasörünüze eklediniz.
+ </notification>
+ <notification name="LandmarkAlreadyExists">
+ Bu konum için zaten bir yer iminiz var.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="CannotCreateLandmarkNotOwner">
+ Burada bir yer imi oluşturmazsınız, çünkü arazinin sahibi buna izin vermiyor.
+ </notification>
+ <notification name="CannotRecompileSelectObjectsNoScripts">
+ &apos;Yeniden derleme&apos; gerçekleştirilemiyor.
+Komut dosyası içeren bir nesne seçin.
+ </notification>
+ <notification name="CannotRecompileSelectObjectsNoPermission">
+ &apos;Yeniden derleme&apos; gerçekleştirilemiyor.
+
+Değişiklik yapma izniniz olan komut dosyaları içeren nesneler seçin.
+ </notification>
+ <notification name="CannotResetSelectObjectsNoScripts">
+ &apos;Sıfırlama&apos; gerçekleştirilemiyor.
+
+Komut dosyası içeren nesneler seçin.
+ </notification>
+ <notification name="CannotResetSelectObjectsNoPermission">
+ &apos;Sıfırlama&apos; gerçekleştirilemiyor.
+
+Değişiklik yapma izniniz olan komut dosyaları içeren nesneler seçin.
+ </notification>
+ <notification name="CannotOpenScriptObjectNoMod">
+ Değişiklik yapma izniniz olmadığından nesne içindeki komut dosyası açılamıyor.
+ </notification>
+ <notification name="CannotSetRunningSelectObjectsNoScripts">
+ Hiçbir komut dosyası &apos;çalışır&apos; durumuna ayarlanamıyor.
+
+Komut dosyası içeren nesneler seçin.
+ </notification>
+ <notification name="CannotSetRunningNotSelectObjectsNoScripts">
+ Hiçbir komut dosyası &apos;çalışmaz&apos; durumuna ayarlanamıyor.
+
+Komut dosyası içeren nesneler seçin.
+ </notification>
+ <notification name="NoFrontmostFloater">
+ Kaydedilecek en öndeki gezdirici yok.
+ </notification>
+ <notification name="SeachFilteredOnShortWords">
+ Arama sorgunuz değiştirildi ve çok kısa olan sözcükler kaldırıldı.
+
+Arama yapılan sorgu: [FINALQUERY]
+ </notification>
+ <notification name="SeachFilteredOnShortWordsEmpty">
+ Arama terimleriniz çok kısa olduğu için arama yapılmadı.
+ </notification>
+ <notification name="CouldNotTeleportReason">
+ Işınlama başarısız.
+[REASON]
+ </notification>
+ <notification name="invalid_tport">
+ Işınlama talebiniz işlenirken bir sorunla karşılaşıldı. Işınlanabilmek için yeniden oturum açmanız gerekebilir.
+Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.
+ </notification>
+ <notification name="invalid_region_handoff">
+ Bölge değiştirme talebiniz işlenirken sorunla karşılaşıldı. Bölge değiştirmek için yeniden oturum açmanız gerekebilir.
+Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.
+ </notification>
+ <notification name="blocked_tport">
+ Üzgünüz, ışınlama şu anda engellenmiş durumda. Bir dakika sonra tekrar deneyin. Hala ışınlanamıyorsanız, sorunu çözmek için lütfen çıkış yapıp oturumu tekrar açın.
+ </notification>
+ <notification name="nolandmark_tport">
+ Üzgünüz fakat sistem yer imi hedef konumunu bulamadı.
+ </notification>
+ <notification name="timeout_tport">
+ Üzgünüz fakat sistem ışınlama bağlantısını tamamlayamadı. Bir dakika sonra tekrar deneyin.
+ </notification>
+ <notification name="noaccess_tport">
+ Üzgünüz, bu ışınlanma hedef konumuna erişim hakkına sahip değilsiniz.
+ </notification>
+ <notification name="missing_attach_tport">
+ Aksesuarlarınız henüz ulaşmadı. Işınlanmayı tekrar denemeden önce bir kaç saniye bekleyin veya çıkış yapıp oturumu tekrar açın.
+ </notification>
+ <notification name="too_many_uploads_tport">
+ Bu bölgedeki varlık sırası şu anda yoğunluktan dolayı tıkalı olduğu için ışınlanma talebiniz zamanında gerçekleştirilemeyecek. Lütfen bir kaç dakika sonra tekrar deneyin veya yoğunluğu daha az olan bir bölge seçin.
+ </notification>
+ <notification name="expired_tport">
+ Üzgünüz fakat sistem ışınlanma talebinizi zamanında tamamlayamadı. Lütfen bir kaç dakika sonra tekrar deneyin.
+ </notification>
+ <notification name="expired_region_handoff">
+ Üzgünüz fakat sistem bölge değiştirme talebinizi zamanında tamamlayamadı. Lütfen bir kaç dakika sonra tekrar deneyin.
+ </notification>
+ <notification name="no_host">
+ Işınlanma hedef konumu bulunamıyor. Hedef konumu geçici bir süre için kullanılamıyor ya da artık mevcut değil. Lütfen bir kaç dakika sonra tekrar deneyin.
+ </notification>
+ <notification name="no_inventory_host">
+ Envanter sistemi şu anda kullanılamıyor.
+ </notification>
+ <notification name="CannotSetLandOwnerNothingSelected">
+ Arazi sahibi ayarlanamıyor:
+Seçili parsel yok.
+ </notification>
+ <notification name="CannotSetLandOwnerMultipleRegions">
+ Seçim aralığı birden fazla bölgeyi kapsadığından arazi mülkiyeti alınmaya zorlanamıyor. Lütfen daha küçük bir alan seçin ve tekrar deneyin.
+ </notification>
+ <notification name="ForceOwnerAuctionWarning">
+ Bu parsel açık arttırmada. Mülkiyeti almaya zorlama açık arttırmayı iptal edecek ve açık arttırma için teklif verme başlamışsa büyük olasılıkla bazı Sakinleri mutsuz edecek.
+Mülkiyeti almaya zorlanılsın mı?
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="CannotContentifyNothingSelected">
+ İçerik eklenemedi:
+Seçili parsel yok.
+ </notification>
+ <notification name="CannotContentifyNoRegion">
+ İçerik eklenemedi:
+Seçili bölge yok.
+ </notification>
+ <notification name="CannotReleaseLandNothingSelected">
+ Arazi mülkiyeti bırakılamıyor:
+Seçili parsel yok.
+ </notification>
+ <notification name="CannotReleaseLandNoRegion">
+ Arazi mülkiyeti bırakılamıyor:
+Bölge bulunamıyor.
+ </notification>
+ <notification name="CannotBuyLandNothingSelected">
+ Arazi satın alınamıyor:
+Seçili parsel yok.
+ </notification>
+ <notification name="CannotBuyLandNoRegion">
+ Arazi satın alınamıyor:
+Arazinin içinde olduğu bölge bulunamıyor.
+ </notification>
+ <notification name="CannotCloseFloaterBuyLand">
+ [APP_NAME] bu işlemin tutarını hesaplamayı bitirmeden Arazi Satın Al penceresini kapatamazsınız.
+ </notification>
+ <notification name="CannotDeedLandNothingSelected">
+ Arazi devredilemiyor:
+Seçili parsel yok.
+ </notification>
+ <notification name="CannotDeedLandNoGroup">
+ Arazi devredilemiyor:
+Seçili Grup yok.
+ </notification>
+ <notification name="CannotDeedLandNoRegion">
+ Arazi devredilemiyor:
+Arazinin içinde olduğu bölge bulunamıyor.
+ </notification>
+ <notification name="CannotDeedLandMultipleSelected">
+ Arazi devredilemiyor:
+Birden fazla parsel seçili.
+
+Tek bir parsel seçmeyi deneyin.
+ </notification>
+ <notification name="CannotDeedLandWaitingForServer">
+ Arazi devredilemiyor:
+Sunucunun mülkiyet bilgisini bildirmesi bekleniyor.
+
+Lütfen tekrar deneyin.
+ </notification>
+ <notification name="CannotDeedLandNoTransfer">
+ Arazi devredilemiyor:
+[REGION] bölgesi arazi aktarımına izin vermiyor.
+ </notification>
+ <notification name="CannotReleaseLandWatingForServer">
+ Arazi mülkiyeti bırakılamıyor:
+Sunucunun parsel bilgilerini güncellemesi bekleniyor.
+
+Bir kaç saniye sonra tekrar deneyin.
+ </notification>
+ <notification name="CannotReleaseLandSelected">
+ Arazi mülkiyeti bırakılamıyor:
+Seçilen tüm parsellere sahip değilsiniz.
+
+Lütfen tek bir parsel seçin.
+ </notification>
+ <notification name="CannotReleaseLandDontOwn">
+ Arazi mülkiyeti bırakılamıyor:
+Bu parseli bırakma izniniz yok.
+Sahip olduğunuz parseller yeşille gösterilmiştir.
+ </notification>
+ <notification name="CannotReleaseLandRegionNotFound">
+ Arazi mülkiyeti bırakılamıyor:
+Arazinin içinde olduğu bölge bulunamıyor.
+ </notification>
+ <notification name="CannotReleaseLandNoTransfer">
+ Arazi mülkiyeti bırakılamıyor:
+[REGION] bölgesi arazi aktarımına izin vermiyor.
+ </notification>
+ <notification name="CannotReleaseLandPartialSelection">
+ Arazi mülkiyeti bırakılamıyor:
+Bırakmak için bir parselin tamamını seçmelisiniz.
+
+Parselin tamamını seçin veya önce parselinizi bölün.
+ </notification>
+ <notification name="ReleaseLandWarning">
+ [AREA] m² araziyi bırakmak üzeresiniz.
+Bu parseli bırakmak onu sahip olduğunuz arazi parçalarından çıkaracak fakat L$ kazandırmayacak.
+
+Arazi bırakılsın mı?
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="CannotDivideLandNothingSelected">
+ Arazi bölünemiyor:
+
+Seçili parsel yok.
+ </notification>
+ <notification name="CannotDivideLandPartialSelection">
+ Arazi bölünemiyor:
+
+Parselin tamamını seçtiniz.
+Parselin bir bölümünü seçmeyi deneyin.
+ </notification>
+ <notification name="LandDivideWarning">
+ Bu parseli bölmek parseli iki parçaya ayıracak ve her bir parselin kendi ayarları olacak. İşlemden sonra bazı ayarlar varsayılan durumlarına sıfırlanacak.
+
+Arazi bölünsün mü?
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="CannotDivideLandNoRegion">
+ Arazi bölünemiyor:
+Arazinin içinde olduğu bölge bulunamıyor.
+ </notification>
+ <notification name="CannotJoinLandNoRegion">
+ Arazi birleÅŸtirilemiyor:
+Arazinin içinde olduğu bölge bulunamıyor.
+ </notification>
+ <notification name="CannotJoinLandNothingSelected">
+ Arazi birleÅŸtirilemiyor:
+Seçili parsel yok.
+ </notification>
+ <notification name="CannotJoinLandEntireParcelSelected">
+ Arazi birleÅŸtirilemiyor:
+Sadece bir parsel seçtiniz.
+
+Lütfen iki parseldeki araziyi de seçin.
+ </notification>
+ <notification name="CannotJoinLandSelection">
+ Arazi birleÅŸtirilemiyor:
+Birden fazla parseli seçmelisiniz.
+
+Lütfen iki parseldeki araziyi de seçin.
+ </notification>
+ <notification name="JoinLandWarning">
+ Bu araziyi birleştirmek, seçili dikdörtgenle kesişen tüm parsellerden bir büyük parsel oluşturacak.
+Yeni parselin adını ve seçeneklerini yeniden ayarlamanız gerekecektir.
+
+Arazi birleÅŸtirilsin mi?
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ConfirmNotecardSave">
+ Öğe kopyalanmadan veya görüntülenmeden önce bu not kartının kaydedilmesi gerekiyor. Not kartı kaydedilsin mi?
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ConfirmItemCopy">
+ Bu öğe envanterinize kopyalansın mı?
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal Et" yestext="Kopyala"/>
+ </notification>
+ <notification name="ResolutionSwitchFail">
+ Çözünürlük [RESX] x [RESY] değerine değiştirilemedi.
+ </notification>
+ <notification name="ErrorUndefinedGrasses">
+ Hata: Tanımlanmamış çimler: [SPECIES]
+ </notification>
+ <notification name="ErrorUndefinedTrees">
+ Hata: Tanımlanmamış ağaçlar: [SPECIES]
+ </notification>
+ <notification name="CannotSaveWearableOutOfSpace">
+ &apos;[NAME]&apos;, giyilebilir öğe dosyasına kaydedilemiyor. Bilgisayarınızda yer açmalı ve giyilebilir öğeyi yeniden kaydetmelisiniz.
+ </notification>
+ <notification name="CannotSaveToAssetStore">
+ [NAME] ana varlık mağazasına kaydedilemedi.
+Bu genellikle geçici bir arızadır. Lütfen giyilebilir öğeyi birkaç dakika sonra yeniden özelleştirip kaydedin.
+ </notification>
+ <notification name="YouHaveBeenLoggedOut">
+ Üzgünüz. [SECOND_LIFE] oturumunuz kapandı.
+ [MESSAGE]
+ <usetemplate name="okcancelbuttons" notext="Çık" yestext="Anlık İleti ve Sohbeti Görüntüle"/>
+ </notification>
+ <notification name="OnlyOfficerCanBuyLand">
+ Grup adına arazi satın alınamıyor:
+Etkin grubunuz adına arazi satın almak için gerekli izne sahip değilsiniz.
+ </notification>
+ <notification label="ArkadaÅŸ Ekle" name="AddFriendWithMessage">
+ Arkadaşlar birbirini harita üzerinde izleme ve çevrimiçi durumları hakkında güncellemeler almak için birbirine izin verebilir.
+
+[NAME] adlı kişiye arkadaşlık teklif edilsin mi?
+ <form name="form">
+ <input name="message">
+ Arkadaşım olur musun?
+ </input>
+ <button name="Offer" text="Tamam"/>
+ <button name="Cancel" text="Ä°ptal"/>
+ </form>
+ </notification>
+ <notification label="Dış Görünümü Kaydet" name="SaveOutfitAs">
+ Üzerimdekileri yeni bir Dış Görünüm olarak kaydet:
+ <form name="form">
+ <input name="message">
+ [DESC] (yeni)
+ </input>
+ <button name="OK" text="Tamam"/>
+ <button name="Cancel" text="Ä°ptal"/>
+ </form>
+ </notification>
+ <notification label="Giyilebilir Öğeyi Kaydet" name="SaveWearableAs">
+ Öğeyi envanterime farklı kaydet:
+ <form name="form">
+ <input name="message">
+ [DESC] (yeni)
+ </input>
+ <button name="OK" text="Tamam"/>
+ <button name="Cancel" text="Ä°ptal"/>
+ </form>
+ </notification>
+ <notification label="Dış Görünümü Yeniden Adlandır" name="RenameOutfit">
+ Yeni dış görünüm adı:
+ <form name="form">
+ <input name="new_name">
+ [NAME]
+ </input>
+ <button name="OK" text="Tamam"/>
+ <button name="Cancel" text="Ä°ptal"/>
+ </form>
+ </notification>
+ <notification name="RemoveFromFriends">
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; adlı kişiyi Arkadaş Listenizden çıkarmak istiyor musunuz?
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="RemoveMultipleFromFriends">
+ Birden çok arkadaşınızı Arkadaş Listenizden çıkarmak istiyor musunuz?
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="GodDeleteAllScriptedPublicObjectsByUser">
+ Komut dosyası içeren,
+** [AVATAR_NAME] ** adlı kişiye ait tüm nesneleri
+bu simdeki diğer tüm kişilerin arazisinden silmek istediğinize emin misiniz?
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="GodDeleteAllScriptedObjectsByUser">
+ Komut dosyası içeren,
+** [AVATAR_NAME] ** adlı kişiye ait TÜM nesneleri
+bu simdeki TÃœM ARAZÄ°LERDEN SÄ°LMEK istediÄŸinize emin misiniz?
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="GodDeleteAllObjectsByUser">
+ Komut dosyası içeren veya içermeyen,
+** [AVATAR_NAME] ** adlı kişiye ait TÜM nesneleri
+bu simdeki TÃœM ARAZÄ°LERDEN SÄ°LMEK istediÄŸinize emin misiniz?
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="BlankClassifiedName">
+ İlanınız için bir ad belirtmelisiniz.
+ </notification>
+ <notification name="MinClassifiedPrice">
+ Listeleme için ödenmesi gereken tutar en az L$ [MIN_PRICE] olmalıdır.
+
+Lütfen daha yüksek bir tutar girin.
+ </notification>
+ <notification name="ConfirmItemDeleteHasLinks">
+ Seçtiğiniz öğelerden en az birinin kendisine işaret eden bağlantılı öğeler var. Bu öğeyi silerseniz, bağlantıları kalıcı olarak çalışmaz hale gelecek. Önce bağlantıları silmeniz önemle tavsiye edilir.
+
+Bu öğeleri silmek istediğinize emin misiniz?
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteLock">
+ Seçtiğiniz öğelerin en az birisi kilitli.
+
+Bu öğeleri silmek istediğinize emin misiniz?
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteNoCopy">
+ Seçtiğiniz öğelerin en az birisi kopyalanamıyor.
+
+Bu öğeleri silmek istediğinize emin misiniz?
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteNoOwn">
+ Seçtiğiniz öğelerin en az birisine sahip değilsiniz.
+
+Bu öğeleri silmek istediğinize emin misiniz?
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteLockNoCopy">
+ Nesnelerden en az biri kilitli.
+Nesnelerden en az biri kopyalanamıyor.
+
+Bu öğeleri silmek istediğinize emin misiniz?
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteLockNoOwn">
+ Nesnelerden en az biri kilitli.
+Nesnelerden en az birine sahip deÄŸilsiniz.
+
+Bu öğeleri silmek istediğinize emin misiniz?
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteNoCopyNoOwn">
+ Nesnelerden en az biri kopyalanamıyor.
+Nesnelerden en az birine sahip deÄŸilsiniz.
+
+Bu öğeleri silmek istediğinize emin misiniz?
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteLockNoCopyNoOwn">
+ Nesnelerden en az biri kilitli.
+Nesnelerden en az biri kopyalanamıyor.
+Nesnelerden en az birine sahip deÄŸilsiniz.
+
+Bu öğeleri silmek istediğinize emin misiniz?
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ConfirmObjectTakeLock">
+ Nesnelerden en az biri kilitli.
+
+Bu öğeleri almak istediğinize emin misiniz?
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ConfirmObjectTakeNoOwn">
+ Aldığınız nesnelerin hepsine sahip değilsiniz.
+Devam ederseniz, nesnelerin sonraki sahibi için geçerli olan izinler uygulanacak ve büyük olasılıkla bu nesneler üzerinde değişiklik yapma ve onları kopyalama yeteneğiniz kısıtlanacak.
+
+Bu öğeleri almak istediğinize emin misiniz?
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ConfirmObjectTakeLockNoOwn">
+ Nesnelerden en az biri kilitli.
+Aldığınız nesnelerin hepsine sahip değilsiniz.
+Devam ederseniz, nesnelerin sonraki sahibi için geçerli olan izinler uygulanacak ve büyük olasılıkla bu nesneler üzerinde değişiklik yapma ve onları kopyalama yeteneğiniz kısıtlanacak.
+Ancak, mevcut seçimi yine de alabilirsiniz.
+
+Bu öğeleri almak istediğinize emin misiniz?
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="CantBuyLandAcrossMultipleRegions">
+ Seçim aralığı birden fazla bölgeyi kapsadığından arazi satın alınamıyor.
+
+Lütfen daha küçük bir alan seçin ve tekrar deneyin.
+ </notification>
+ <notification name="DeedLandToGroup">
+ Bu parseli devrettiğinizde grubun yeterli arazi kulanım kredisine sahip olması ve elinde tutması gerekmektedir.
+Arazinin satış bedeli sahibine geri ödenmez. Devredilen bir parsel satılırsa, satış bedeli grup üyeleri arasında eşit olarak bölünür.
+
+[AREA] m²&apos;lik bu arazi &apos;[GROUP_NAME]&apos; grubuna devredilsin mi?
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="DeedLandToGroupWithContribution">
+ Bu parseli devrettiğinizde grubun yeterli arazi kulanım kredisine sahip olması ve elinde tutması gerekmektedir.
+Bu devir eş zamanlı olarak &apos;[NAME]&apos; adlı kişiden gruba arazi katkısı sağlayacaktır.
+Arazinin satış bedeli sahibine geri ödenmez. Devredilen bir parsel satılırsa, satış bedeli grup üyeleri arasında eşit olarak bölünür.
+
+[AREA] m²&apos;lik bu arazi &apos;[GROUP_NAME]&apos; grubuna devredilsin mi?
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="DisplaySetToSafe">
+ Güvenli seçeneği seçtiğiniz için görüntüleme ayarları güvenli düzeye ayarlandı.
+ </notification>
+ <notification name="DisplaySetToRecommendedGPUChange">
+ Grafik kartınız değiştiği için görüntü ayarları tavsiye edilen seviyelere ayarlandı
+önceki: &apos;[LAST_GPU]&apos;
+sonraki: &apos;[THIS_GPU]&apos;
+ </notification>
+ <notification name="DisplaySetToRecommendedFeatureChange">
+ İşleme alt sistemindeki bir değişiklik nedeniyle görüntü ayarları tavsiye edilen seviyelere ayarlandı.
+ </notification>
+ <notification name="ErrorMessage">
+ [ERROR_MESSAGE]
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="AvatarMovedDesired">
+ İstediğiniz konum şu anda kullanılamıyor.
+Yakınındaki başka bir bölgeye taşındınız.
+ </notification>
+ <notification name="AvatarMovedLast">
+ Son konumunuz şu anda kullanılamıyor.
+Yakınındaki başka bir bölgeye taşındınız.
+ </notification>
+ <notification name="AvatarMovedHome">
+ Ana konumunuz şu anda kullanılamıyor.
+Yakınındaki başka bir bölgeye taşındınız.
+Yeni bir ana konum ayarlamak isteyebilirsiniz.
+ </notification>
+ <notification name="ClothingLoading">
+ Giysileriniz hala karşıdan yükleniyor.
+[SECOND_LIFE]&apos;ı normal şekilde kullanmaya devam edebilirsiniz, diğer insanlar sizi düzgün bir şekilde görecektir.
+ <form name="form">
+ <ignore name="ignore" text="Giysilerin karşıdan yüklenmesi uzun zaman alıyor"/>
+ </form>
+ </notification>
+ <notification name="FirstRun">
+ [APP_NAME] kurulumu tamamlandı.
+
+[SECOND_LIFE]&apos;ı ilk kez kullanıyorsanız, oturum açmadan önce bir hesap oluşturmalısınız.
+Yeni bir hesap oluşturmak için [http://join.secondlife.com secondlife.com] adresine dönülsün mü?
+ <usetemplate name="okcancelbuttons" notext="Devam" yestext="Yeni Hesap..."/>
+ </notification>
+ <notification name="LoginPacketNeverReceived">
+ Bağlantıda sorun yaşıyoruz. İnternet bağlantınızda ya da [SECOND_LIFE_GRID] uygulamasında bir problem olabilir.
+
+İnternet bağlantınızı kontrol edip bir kaç dakika sonra yeniden bağlanmayı deneyebilir, [SUPPORT_SITE] sayfasına gitmek için Yardım&apos;ı tıklatabilir ya da ana konumunuza ışınlanmak için Işınla&apos;yı tıklatabilirsiniz.
+ <url name="url">
+ http://secondlife.com/support/
+ </url>
+ <form name="form">
+ <button name="OK" text="Tamam"/>
+ <button name="Help" text="Yardım"/>
+ <button name="Teleport" text="Işınla"/>
+ </form>
+ </notification>
+ <notification name="WelcomeChooseSex">
+ Karakteriniz birazdan görünecek.
+
+Yürümek için ok tuşlarını kullanın.
+Yardım almak ya da [SECOND_LIFE] hakkında daha fazla bilgi edinmek için istediğiniz zaman F1 tuşuna basın.
+Lütfen bir erkek ya da kadın avatar seçin. Fikrinizi daha sonra değiştirebilirsiniz.
+ <usetemplate name="okcancelbuttons" notext="Kadın" yestext="Erkek"/>
+ </notification>
+ <notification name="CantTeleportToGrid">
+ Geçerli ağdan ([CURRENT_GRID]) farklı bir ağ ([GRID]) üzerinde bulunduğundan [SLURL] adresine ışınlanma gerçekleştirilemedi. Lütfen görüntüleyicinizi kapatın ve tekrar deneyin.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="GeneralCertificateError">
+ Sunucu ile bağlantı kurulamadı.
+[REASON]
+
+Konu Adı: [SUBJECT_NAME_STRING]
+Verenin Adı: [ISSUER_NAME_STRING]
+Geçerlilik Başlangıcı: [VALID_FROM]
+Geçerlilik Bitişi: [VALID_TO]
+MD5 Parmak izi: [SHA1_DIGEST]
+SHA1 Parmak izi: [MD5_DIGEST]
+Anahtar Kullanımı: [KEYUSAGE]
+Uzatılmış Anahtar Kullanımı: [EXTENDEDKEYUSAGE]
+Konu Anahtarı Tanımlayıcısı: [SUBJECTKEYIDENTIFIER]
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="TrustCertificateError">
+ Bu sunucunun sertifika yetkilisi bilinmiyor.
+
+Sertifika Bilgileri:
+Konu Adı: [SUBJECT_NAME_STRING]
+Verenin Adı: [ISSUER_NAME_STRING]
+Geçerlilik Başlangıcı: [VALID_FROM]
+Geçerlilik Bitişi: [VALID_TO]
+MD5 Parmak izi: [SHA1_DIGEST]
+SHA1 Parmak izi: [MD5_DIGEST]
+Anahtar Kullanımı: [KEYUSAGE]
+Uzatılmış Anahtar Kullanımı: [EXTENDEDKEYUSAGE]
+Konu Anahtarı Tanımlayıcısı: [SUBJECTKEYIDENTIFIER]
+
+Bu yetkiliye güvenilsin mi?
+ <usetemplate name="okcancelbuttons" notext="İptal Et" yestext="Güven"/>
+ </notification>
+ <notification name="NotEnoughCurrency">
+ [NAME] [PRICE] L$ Bunu yapmaya yetecek L$&apos;nız yok.
+ </notification>
+ <notification name="GrantedModifyRights">
+ [NAME] size kendi nesnelerini düzenleme izni verdi.
+ </notification>
+ <notification name="RevokedModifyRights">
+ [NAME] adlı kişinin nesneleri üzerinde değişiklik yapma ayrıcalığınız iptal edildi.
+ </notification>
+ <notification name="FlushMapVisibilityCaches">
+ Bu işlem bu bölgedeki harita önbelleklerini temizleyecek.
+Gerçekte bu sadece hata ayıklama için işe yarar.
+(İşlem sırasında 5 dakika bekleyin, herkes yeniden oturum açtıktan sonra haritaları güncellenecektir.)
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="BuyOneObjectOnly">
+ Bir seferde birden fazla nesne satın alınamıyor. Lütfen sadece bir nesne seçin ve tekrar deneyin.
+ </notification>
+ <notification name="OnlyCopyContentsOfSingleItem">
+ Aynı anda birden fazla öğenin içeriği kopyalanamıyor.
+Lütfen sadece bir nesne seçin ve tekrar deneyin.
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="KickUsersFromRegion">
+ Bu bölgedeki tüm Sakinler ana konumlarına ışınlansın mı?
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="EstateObjectReturn">
+ [USER_NAME] kullanıcısının sahip olduğu tüm nesneleri iade etmek istediğinize emin misiniz?
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="InvalidTerrainBitDepth">
+ Bölge dokuları ayarlanamadı:
+[TEXTURE_NUM] numaralı yüzey dokusu geçersiz bir bit derinliğine ([TEXTURE_BIT_DEPTH]) sahip.
+
+[TEXTURE_NUM] numaralı dokuyu 24 bit 512x512 veya daha küçük bir resimle değiştirin ve &quot;Uygula&quot; seçeneğini yeniden tıklatın.
+ </notification>
+ <notification name="InvalidTerrainSize">
+ Bölge dokuları ayarlanamadı:
+[TEXTURE_NUM] numaralı yüzey dokusu çok büyük ([TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y]).
+
+[TEXTURE_NUM] numaralı dokuyu 24 bit 512x512 veya daha küçük bir resimle değiştirin ve &quot;Uygula&quot; seçeneğini yeniden tıklatın.
+ </notification>
+ <notification name="RawUploadStarted">
+ Karşıya yükleme başlatıldı. Bağlantı hızına bağlı olarak iki dakika kadar sürebilir.
+ </notification>
+ <notification name="ConfirmBakeTerrain">
+ Geçerli yüzeyi bu şekilde kaydetmeyi, yüzey yükseltme/alçaltma sınırları için merkez olarak kullanmayı ve &apos;Geri Çevir&apos; aracı için varsayılan olarak ayarlamayı gerçekten istiyor musunuz?
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="MaxAllowedAgentOnRegion">
+ Sadece [MAX_AGENTS] tane Ä°zin Verilen Sakin belirleyebilirsiniz.
+ </notification>
+ <notification name="MaxBannedAgentsOnRegion">
+ Sadece [MAX_BANNED] tane Yasaklı Sakin belirleyebilirsiniz.
+ </notification>
+ <notification name="MaxAgentOnRegionBatch">
+ [NUM_ADDED] aracı ekleme girişimi başarısız oldu:
+[MAX_AGENTS] [LIST_TYPE] sınırı [NUM_EXCESS] birim aşıldı.
+ </notification>
+ <notification name="MaxAllowedGroupsOnRegion">
+ Sadece [MAX_GROUPS] tane Ä°zin Verilen Grup belirleyebilirsiniz.
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal Et" yestext="Kaydet"/>
+ </notification>
+ <notification name="MaxManagersOnRegion">
+ Sadece [MAX_MANAGER] tane Gayrimenkul Yöneticisi belirleyebilirsiniz.
+ </notification>
+ <notification name="OwnerCanNotBeDenied">
+ Gayrimenkul sahibi, gayrimenkulün &apos;Yasaklı Sakin&apos; listesine eklenemez.
+ </notification>
+ <notification name="CanNotChangeAppearanceUntilLoaded">
+ Giysi ve şekil yüklenene kadar görünüm değiştirilemez.
+ </notification>
+ <notification name="ClassifiedMustBeAlphanumeric">
+ İlanınızın adı A ile Z arasında bir harfle ya da bir sayıyla başlamalıdır. Noktalama işaretleri kullanılamaz.
+ </notification>
+ <notification name="CantSetBuyObject">
+ Nesne Satın Al komutu ayarlanamadı, çünkü nesne satılık değil.
+Nesneyi satılık olarak ayarlayıp tekrar deneyin.
+ </notification>
+ <notification name="FinishedRawDownload">
+ İşlenmemiş yüzey dosyasının şu konuma karşıdan yüklenmesi tamamlandı:
+[DOWNLOAD_PATH].
+ </notification>
+ <notification name="DownloadWindowsMandatory">
+ [APP_NAME] uygulamasının yeni bir sürümü mevcut.
+[MESSAGE]
+[APP_NAME] uygulamasını kullanabilmek için bu güncellemeyi karşıdan yüklemelisiniz.
+ <usetemplate name="okcancelbuttons" notext="Çık" yestext="Karşıdan Yükle"/>
+ </notification>
+ <notification name="DownloadWindows">
+ [APP_NAME] uygulamasının güncellenmiş bir sürümü mevcut.
+[MESSAGE]
+Bu güncelleme zorunlu değil, fakat performans ve kararlılığı iyileştirmek için güncellemeyi yüklemenizi öneririz.
+ <usetemplate name="okcancelbuttons" notext="Devam" yestext="Karşıdan Yükle"/>
+ </notification>
+ <notification name="DownloadWindowsReleaseForDownload">
+ [APP_NAME] uygulamasının güncellenmiş bir sürümü mevcut.
+[MESSAGE]
+Bu güncelleme zorunlu değil, fakat performans ve kararlılığı iyileştirmek için güncellemeyi yüklemenizi öneririz.
+ <usetemplate name="okcancelbuttons" notext="Devam" yestext="Karşıdan Yükle"/>
+ </notification>
+ <notification name="DownloadLinuxMandatory">
+ [APP_NAME] uygulamasının yeni bir sürümü mevcut.
+[MESSAGE]
+[APP_NAME] uygulamasını kullanabilmek için bu güncellemeyi karşıdan yüklemelisiniz.
+ <usetemplate name="okcancelbuttons" notext="Çık" yestext="Karşıdan Yükle"/>
+ </notification>
+ <notification name="DownloadLinux">
+ [APP_NAME] uygulamasının güncellenmiş bir sürümü mevcut.
+[MESSAGE]
+Bu güncelleme zorunlu değil, fakat performans ve kararlılığı iyileştirmek için güncellemeyi yüklemenizi öneririz.
+ <usetemplate name="okcancelbuttons" notext="Devam" yestext="Karşıdan Yükle"/>
+ </notification>
+ <notification name="DownloadLinuxReleaseForDownload">
+ [APP_NAME] uygulamasının güncellenmiş bir sürümü mevcut.
+[MESSAGE]
+Bu güncelleme zorunlu değil, fakat performans ve kararlılığı iyileştirmek için güncellemeyi yüklemenizi öneririz.
+ <usetemplate name="okcancelbuttons" notext="Devam" yestext="Karşıdan Yükle"/>
+ </notification>
+ <notification name="DownloadMacMandatory">
+ [APP_NAME] uygulamasının yeni bir sürümü mevcut.
+[MESSAGE]
+[APP_NAME] uygulamasını kullanabilmek için bu güncellemeyi karşıdan yüklemelisiniz.
+
+Uygulamalar klasörünüze karşıdan yüklensin mi?
+ <usetemplate name="okcancelbuttons" notext="Çık" yestext="Karşıdan Yükle"/>
+ </notification>
+ <notification name="DownloadMac">
+ [APP_NAME] uygulamasının güncellenmiş bir sürümü mevcut.
+[MESSAGE]
+Bu güncelleme zorunlu değil, fakat performans ve kararlılığı iyileştirmek için güncellemeyi yüklemenizi öneririz.
+
+Uygulamalar klasörünüze karşıdan yüklensin mi?
+ <usetemplate name="okcancelbuttons" notext="Devam" yestext="Karşıdan Yükle"/>
+ </notification>
+ <notification name="DownloadMacReleaseForDownload">
+ [APP_NAME] uygulamasının güncellenmiş bir sürümü mevcut.
+[MESSAGE]
+Bu güncelleme zorunlu değil, fakat performans ve kararlılığı iyileştirmek için güncellemeyi yüklemenizi öneririz.
+
+Uygulamalar klasörünüze karşıdan yüklensin mi?
+ <usetemplate name="okcancelbuttons" notext="Devam" yestext="Karşıdan Yükle"/>
+ </notification>
+ <notification name="FailedUpdateInstall">
+ Görüntüleyici güncellemesi yüklenirken bir hata oluştu.
+Lütfen en son görüntüleyiciyi şu adresten karşıdan yükleyin ve kurun:
+http://secondlife.com/download.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="FailedRequiredUpdateInstall">
+ Gerekli bir güncellemeyi yükleyemedik.
+[APP_NAME] güncellenene kadar oturum açamayacaksınız.
+
+Lütfen en son görüntüleyiciyi şu adresten karşıdan yükleyin ve kurun:
+http://secondlife.com/download.
+ <usetemplate name="okbutton" yestext="Çık"/>
+ </notification>
+ <notification name="UpdaterServiceNotRunning">
+ Second Life kurulumunuz için gerekli bir güncelleme var.
+
+Bu güncellemeyi http://www.secondlife.com/downloads adresinden karşıdan yükleyebilir
+veya ÅŸimdi kurabilirsiniz.
+ <usetemplate name="okcancelbuttons" notext="Second Life&apos;tan çık" yestext="Karşıdan yükle ve şimdi kur"/>
+ </notification>
+ <notification name="DownloadBackgroundTip">
+ [APP_NAME] kurulumunuz için bir güncellemeyi karşıdan yükledik.
+Sürüm [VERSION] [[RELEASE_NOTES_FULL_URL] Bu güncelleme hakkında ayrıntılı bilgi]
+ <usetemplate name="okcancelbuttons" notext="Sonra..." yestext="Şimdi kur ve [APP_NAME] uygulamasını yeniden başlat"/>
+ </notification>
+ <notification name="DownloadBackgroundDialog">
+ [APP_NAME] kurulumunuz için bir güncellemeyi karşıdan yükledik.
+Sürüm [VERSION] [[RELEASE_NOTES_FULL_URL] Bu güncelleme hakkında ayrıntılı bilgi]
+ <usetemplate name="okcancelbuttons" notext="Sonra..." yestext="Şimdi kur ve [APP_NAME] uygulamasını yeniden başlat"/>
+ </notification>
+ <notification name="RequiredUpdateDownloadedVerboseDialog">
+ Gerekli bir yazılım güncellemesini karşıdan yükledik.
+Sürüm [VERSION]
+
+Güncellemeyi kurmak için [APP_NAME] uygulamasını yeniden başlatmalısınız.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="RequiredUpdateDownloadedDialog">
+ Güncellemeyi kurmak için [APP_NAME] uygulamasını yeniden başlatmalısınız.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="DeedObjectToGroup">
+ Bu nesnenin devredilmesi grubun şunu yapmasına sebep olacak:
+* Nesneye ödenen L$&apos;nı almasına
+ <usetemplate ignoretext="Bir nesneyi bir gruba devretmeden önce doğrulama iste" name="okcancelignore" notext="İptal Et" yestext="Devret"/>
+ </notification>
+ <notification name="WebLaunchExternalTarget">
+ Bu içeriği görüntülemek için Web tarayıcınızı açmak istiyor musunuz?
+ <usetemplate ignoretext="Bir web sayfasını görüntülemek için tarayıcımı başlat" name="okcancelignore" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="WebLaunchJoinNow">
+ Hesabınızı yönetmek için [http://secondlife.com/account/ Kontrol Paneli] adresine gidilsin mi?
+ <usetemplate ignoretext="Hesabımı yönetmek için tarayıcımı başlat" name="okcancelignore" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="WebLaunchSecurityIssues">
+ Bir güvenlik sorununun nasıl bildireceği ile ilgili ayrıntıları öğrenmek için [SECOND_LIFE] Wiki&apos;yi aç.
+ <usetemplate ignoretext="Bir Güvenlik Sorununu bildirme şeklini öğrenmek için tarayıcımı başlat" name="okcancelignore" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="WebLaunchQAWiki">
+ [SECOND_LIFE] Wiki&apos;nin Kalite Güvencesi sayfasını ziyaret edin.
+ <usetemplate ignoretext="Wiki Kalite Güvencesi sayfasını görüntülemek için tarayıcımı başlat" name="okcancelignore" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="WebLaunchPublicIssue">
+ Hataları ve diğer sorunları bildirebileceğiniz [SECOND_LIFE] Kamuya Açık Sorun Takip sayfasını ziyaret edin.
+ <usetemplate ignoretext="Kamuya Açık Sorun Takip hizmetini kullanmak için tarayıcımı başlat" name="okcancelignore" notext="İptal Et" yestext="Sayfaya git"/>
+ </notification>
+ <notification name="WebLaunchSupportWiki">
+ En son haberler ve bilgiler için Resmi Linden Blog&apos;una git.
+ <usetemplate ignoretext="Blog sayfasını görüntülemek için tarayıcımı başlat" name="okcancelignore" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="WebLaunchLSLGuide">
+ Komut dosyası yazma ile ilgili yardım almak için Komut Dosyası Yazma Kılavuzu&apos;nu açmak istiyor musunuz?
+ <usetemplate ignoretext="Komut Dosyası Yazma Kılavuzunu görüntülemek için tarayıcımı başlat" name="okcancelignore" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="WebLaunchLSLWiki">
+ Komut dosyası yazma ile ilgili yardım almak için LSL Portal&apos;ını açmak istiyor musunuz?
+ <usetemplate ignoretext="LSL Portal&apos;ını görüntülemek için tarayıcımı başlat" name="okcancelignore" notext="İptal Et" yestext="Sayfaya git"/>
+ </notification>
+ <notification name="ReturnToOwner">
+ Seçili nesneleri kendi sahiplerine iade etmek istediğinize emin misiniz? Devredilmiş nesnelerin aktarılabilenleri önceki sahiplerine iade edilecektir.
+
+*UYARI* Bu eylem, devredilmiş nesnelerin aktarılamayanlarını silecektir!
+ <usetemplate ignoretext="Nesneleri sahiplerine iade etmeden önce doğrulama iste" name="okcancelignore" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="GroupLeaveConfirmMember">
+ Şu anda &lt;nolink&gt;[GROUP]&lt;/nolink&gt; grubunun bir üyesisiniz.
+Gruptan ayrılmak istiyor musunuz?
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ConfirmKick">
+ Tüm Sakinleri GERÇEKTEN ağ dışına çıkarmak istiyor musunuz?
+ <usetemplate name="okcancelbuttons" notext="İptal Et" yestext="Tüm Sakinleri Çıkar"/>
+ </notification>
+ <notification name="MuteLinden">
+ Üzgünüz, bir Linden çalışanını engelleyemezsiniz.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="CannotStartAuctionAlreadyForSale">
+ Satılığa çıkarılmış bir parsel için açık arttırma başlatamazsınız. Açık arttırma başlatmak istediğinize eminseniz arazi satışını devre dışı bırakın.
+ </notification>
+ <notification label="Nesneyi ada göre engelleme başarısız" name="MuteByNameFailed">
+ Bu adı zaten engellediniz.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="RemoveItemWarn">
+ İzin veriliyor olsa da, içerikleri silmek nesneye zarar verebilir. Bu öğeyi silmek istiyor musunuz?
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="CantOfferCallingCard">
+ Şu anda arama kartı verilemiyor. Lütfen biraz sonra tekrar deneyin.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="CantOfferFriendship">
+ Şu anda arkadaşlık teklif edilemiyor. Lütfen biraz sonra tekrar deneyin.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="BusyModeSet">
+ Durumunuz Meşgul olarak ayarlandı.
+Sohbet ve anlık iletiler gizlenecek. Anlık iletilere Meşgul durumu için belirlediğiniz yanıt gönderilecek. Tüm ışınlanma teklifleri reddedilecek. Tüm envanter teklifleri Çöp Kutunuza gidecek.
+ <usetemplate ignoretext="Durumumu MeÅŸgul olarak deÄŸiÅŸtiriyorum" name="okignore" yestext="Tamam"/>
+ </notification>
+ <notification name="JoinedTooManyGroupsMember">
+ Maksimum grup sayısına eriştiniz. Lütfen bu gruba katılmadan önce başka bir gruptan ayrılın ya da bu teklifi reddedin.
+[NAME] sizi bir gruba üye olarak katılmaya davet etti.
+ <usetemplate name="okcancelbuttons" notext="Reddet" yestext="Katıl"/>
+ </notification>
+ <notification name="JoinedTooManyGroups">
+ Maksimum grup sayısına eriştiniz. Lütfen yeni bir gruba katılmadan ya da yeni bir grup oluşturmadan önce grupların bazılarından ayrılın.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="KickUser">
+ Bu Sakin hangi iletiyle çıkarılsın?
+ <form name="form">
+ <input name="message">
+ Bir yönetici oturumunuzu sonlandırdı.
+ </input>
+ <button name="OK" text="Tamam"/>
+ <button name="Cancel" text="Ä°ptal"/>
+ </form>
+ </notification>
+ <notification name="KickAllUsers">
+ Şu anda ağ üzerinde yer alan herkes hangi iletiyle çıkarılsın?
+ <form name="form">
+ <input name="message">
+ Bir yönetici oturumunuzu sonlandırdı.
+ </input>
+ <button name="OK" text="Tamam"/>
+ <button name="Cancel" text="Ä°ptal"/>
+ </form>
+ </notification>
+ <notification name="FreezeUser">
+ Bu Sakin hangi iletiyle dondurulsun?
+ <form name="form">
+ <input name="message">
+ Donduruldunuz. Hareket ya da sohbet edemezsiniz. Bir yönetici sizinle anlık ileti (Aİ) yoluyla iletişim kuracak.
+ </input>
+ <button name="OK" text="Tamam"/>
+ <button name="Cancel" text="Ä°ptal"/>
+ </form>
+ </notification>
+ <notification name="UnFreezeUser">
+ Bu Sakin hangi iletiyle çözülsün?
+ <form name="form">
+ <input name="message">
+ Artık dondurulmuş durumda değilsiniz.
+ </input>
+ <button name="OK" text="Tamam"/>
+ <button name="Cancel" text="Ä°ptal"/>
+ </form>
+ </notification>
+ <notification name="SetDisplayNameSuccess">
+ Merhaba [DISPLAY_NAME]!
+
+Aynı gerçek hayatta olduğu gibi, burada da herkesin yeni bir adı öğrenmesi biraz zaman alacaktır. Lütfen nesnelerde, komut dosyalarında, arama vb. hizmetlerde [http://wiki.secondlife.com/wiki/Setting_your_display_name adınızın güncellenmesi için] birkaç gün süre tanıyın.
+ </notification>
+ <notification name="SetDisplayNameBlocked">
+ Üzgünüz, ekran adınızı değiştiremezsiniz. Bunun bir hata olduğunu düşünüyorsanız, lütfen destek ekibine başvurun.
+ </notification>
+ <notification name="SetDisplayNameFailedLength">
+ Üzgünüz, bu ad çok uzun. Ekran adları maksimum [LENGTH] karakter olabilir.
+
+Lütfen daha kısa bir ad deneyin.
+ </notification>
+ <notification name="SetDisplayNameFailedGeneric">
+ Üzgünüz, ekran adınızı ayarlayamadık. Lütfen daha sonra tekrar deneyin.
+ </notification>
+ <notification name="SetDisplayNameMismatch">
+ Girdiğiniz ekran adları birbiriyle eşleşmiyor. Lütfen yeniden girin.
+ </notification>
+ <notification name="AgentDisplayNameUpdateThresholdExceeded">
+ Üzgünüz, ekran adınızı değiştirebilmeniz için biraz daha beklemeniz gerekiyor.
+
+Bkz. http://wiki.secondlife.com/wiki/Setting_your_display_name
+
+Lütfen daha sonra tekrar deneyin.
+ </notification>
+ <notification name="AgentDisplayNameSetBlocked">
+ Üzgünüz, ekran adınızı ayarlayamadık çünkü kullanılması yasak olan bir kelime içeriyor.
+
+ Lütfen başka bir ad deneyin.
+ </notification>
+ <notification name="AgentDisplayNameSetInvalidUnicode">
+ Ayarlamak istediğiniz ekran adı geçersiz karakterler içeriyor.
+ </notification>
+ <notification name="AgentDisplayNameSetOnlyPunctuation">
+ Ekran adınız noktalama işaretlerinin dışında harfler de içermelidir.
+ </notification>
+ <notification name="DisplayNameUpdate">
+ [OLD_NAME] ([SLID]) artık [NEW_NAME] olarak ayarlandı.
+ </notification>
+ <notification name="OfferTeleport">
+ Aşağıdaki iletiyle konumunuza ışınlanma teklif edilsin mi?
+ <form name="form">
+ <input name="message">
+ [REGION] bölgesinde bana katılır mısın?
+ </input>
+ <button name="OK" text="Tamam"/>
+ <button name="Cancel" text="Ä°ptal"/>
+ </form>
+ </notification>
+ <notification name="TooManyTeleportOffers">
+ [OFFERS] ışınlama teklif etmeye kalkıştınız, bu [LIMIT] sınırını aşıyor.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="OfferTeleportFromGod">
+ Sakin sizin konumunuza Yönetici Ayrıcalığı kullanılarak getirilsin mi?
+ <form name="form">
+ <input name="message">
+ [REGION] bölgesinde bana katıl
+ </input>
+ <button name="OK" text="Tamam"/>
+ <button name="Cancel" text="Ä°ptal"/>
+ </form>
+ </notification>
+ <notification name="TeleportFromLandmark">
+ &lt;nolink&gt;[LOCATION]&lt;/nolink&gt; konumuna ışınlanmak istediğinize emin misiniz?
+ <usetemplate ignoretext="Bir yer imine ışınlanma istediğimde doğrulama iste" name="okcancelignore" notext="İptal Et" yestext="Işınla"/>
+ </notification>
+ <notification name="TeleportToPick">
+ [PICK] konumuna ışınlanılsın mı?
+ <usetemplate ignoretext="Seçme sekmesindeki bir konuma ışınlanma istediğimde doğrulama iste" name="okcancelignore" notext="İptal Et" yestext="Işınla"/>
+ </notification>
+ <notification name="TeleportToClassified">
+ [CLASSIFIED] konumuna ışınlanılsın mı?
+ <usetemplate ignoretext="İlanlardaki bir konuma ışınlanma istediğimde doğrulama iste" name="okcancelignore" notext="İptal Et" yestext="Işınla"/>
+ </notification>
+ <notification name="TeleportToHistoryEntry">
+ [HISTORY_ENTRY] konumuna ışınlanılsın mı?
+ <usetemplate ignoretext="Geçmiş içinde yer alan bir konuma ışınlanma istediğimde doğrulama iste" name="okcancelignore" notext="İptal Et" yestext="Işınla"/>
+ </notification>
+ <notification label="Gayrimenkulünüzdeki herkese ileti gönderme" name="MessageEstate">
+ Şu anda gayrimenkulünüzde bulunan herkese gönderilecek kısa bir duyuru yazın.
+ <form name="form">
+ <button name="OK" text="Tamam"/>
+ <button name="Cancel" text="Ä°ptal"/>
+ </form>
+ </notification>
+ <notification label="Bir Linden Gayrimenkulünü değiştirme" name="ChangeLindenEstate">
+ Linden çalışanlarına ait bir gayrimenkulü (anakara, oryantasyon vb.) değiştirmek üzeresiniz.
+
+Bu, Sakinlerin deneyimlerini temelden etkileyebileceği için SON DERECE TEHLİKELİDİR. Anakara üzerinde, binlerce bölgeyi değiştirecek ve alan sunucusunu kesintiye uğratacaktır.
+
+Devam edilsin mi?
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification label="Linden Gayrimenkulüne Erişimi değiştirme" name="ChangeLindenAccess">
+ Linden çalışanlarına ait bir gayrimenkul (anakara, oryantasyon vb.) için erişim listesini değiştirmek üzeresiniz.
+
+Bu işlem TEHLİKELİDİR ve sadece saldırıya açık nesnelerin/L$&apos;nın ağ içine/dışına aktarılmasını sağlamak için gerçekleştirilmelidir.
+Binlerce bölgeyi değiştirecek ve alan sunucusunu kesintiye uğratacaktır.
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification label="Gayrimenkul seç" name="EstateAllowedAgentAdd">
+ Sadece bu gayrimenkul için mi izin verilenler listesine eklensin, yoksa [ALL_ESTATES] için mi?
+ <usetemplate canceltext="İptal" name="yesnocancelbuttons" notext="Tüm Gayrimenkuller" yestext="Bu Gayrimenkul"/>
+ </notification>
+ <notification label="Gayrimenkul seç" name="EstateAllowedAgentRemove">
+ Sadece bu gayrimenkul için mi izin verilenler listesinden çıkarılsın, yoksa [ALL_ESTATES] için mi?
+ <usetemplate canceltext="İptal" name="yesnocancelbuttons" notext="Tüm Gayrimenkuller" yestext="Bu Gayrimenkul"/>
+ </notification>
+ <notification label="Gayrimenkul seç" name="EstateAllowedGroupAdd">
+ Sadece bu gayrimenkul için mi izin verilen grup listesine eklensin, yoksa [ALL_ESTATES] için mi?
+ <usetemplate canceltext="İptal" name="yesnocancelbuttons" notext="Tüm Gayrimenkuller" yestext="Bu Gayrimenkul"/>
+ </notification>
+ <notification label="Gayrimenkul seç" name="EstateAllowedGroupRemove">
+ Sadece bu gayrimenkul için mi izin verilen grup listesinden çıkarılsın, yoksa [ALL_ESTATES] için mi?
+ <usetemplate canceltext="İptal" name="yesnocancelbuttons" notext="Tüm Gayrimenkuller" yestext="Bu Gayrimenkul"/>
+ </notification>
+ <notification label="Gayrimenkul seç" name="EstateBannedAgentAdd">
+ Sadece bu gayrimenkul için mi erişim engellensin, yoksa [ALL_ESTATES] için mi?
+ <usetemplate canceltext="İptal" name="yesnocancelbuttons" notext="Tüm Gayrimenkuller" yestext="Bu Gayrimenkul"/>
+ </notification>
+ <notification label="Gayrimenkul seç" name="EstateBannedAgentRemove">
+ Bu Sakin sadece bu gayrimenkul için mi yasaklı listesinden çıkarılsın, yoksa [ALL_ESTATES] için mi?
+ <usetemplate canceltext="İptal" name="yesnocancelbuttons" notext="Tüm Gayrimenkuller" yestext="Bu Gayrimenkul"/>
+ </notification>
+ <notification label="Gayrimenkul seç" name="EstateManagerAdd">
+ Sadece bu gayrimenkul için mi gayrimenkul yöneticisi olarak eklensin, yoksa [ALL_ESTATES] için mi?
+ <usetemplate canceltext="İptal" name="yesnocancelbuttons" notext="Tüm Gayrimenkuller" yestext="Bu Gayrimenkul"/>
+ </notification>
+ <notification label="Gayrimenkul seç" name="EstateManagerRemove">
+ Sadece bu gayrimenkul için mi gayrimenkul yöneticiliğinden çıkarılsın, yoksa [ALL_ESTATES] için mi?
+ <usetemplate canceltext="İptal" name="yesnocancelbuttons" notext="Tüm Gayrimenkuller" yestext="Bu Gayrimenkul"/>
+ </notification>
+ <notification label="Çıkarmayı Onayla" name="EstateKickUser">
+ [EVIL_USER] bu gayrimenkulden çıkarılsın mı?
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="EstateChangeCovenant">
+ Gayrimenkul Sözleşmesini değiştirmek istediğinize emin misiniz?
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="RegionEntryAccessBlocked">
+ Erişkinlik Seviyesi ayarlarınızdan dolayı bu Bölgeye giremezsiniz. Bu sorun yaşınızı doğrulamak için gerekli bilgilerin eksik olmasından kaynaklanabilir.
+
+Lütfen en son Görüntüleyicinin yüklü olduğunu doğrulayın ve bu erişkinlik seviyesi ile erişilecek alanlar hakkında ayrıntılı bilgi edinmek için Bilgi Bankası&apos;nı ziyaret edin.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="RegionEntryAccessBlocked_KB">
+ Erişkinlik Seviyesi ayarlarınızdan dolayı bu bölgeye giremezsiniz.
+
+Erişkinlik Seviyeleri hakkında daha fazla bilgi edinmek için Bilgi Bankası&apos;nı ziyaret etmek ister misiniz?
+ <url name="url">
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview
+ </url>
+ <usetemplate ignoretext="Erişkinlik Seviyesi ile ilgili kısıtlamalardan dolayı bu Bölgeye giremiyorum" name="okcancelignore" notext="Kapat" yestext="Bilgi Bankası&apos;na Git"/>
+ </notification>
+ <notification name="RegionEntryAccessBlocked_Notify">
+ Erişkinlik Seviyesi ayarlarınızdan dolayı bu bölgeye giremezsiniz.
+ </notification>
+ <notification name="RegionEntryAccessBlocked_Change">
+ Erişkinlik Seviyesi tercihlerinizden dolayı bu Bölgeye giremezsiniz.
+
+İstenilen bölgeye girmek için, lütfen erişkinlik Seviyesi tercihinizi değiştirin. Bu tercih [REGIONMATURITY] içerikli alanlar içinde arama yapabilmenizi ve bu alanlara erişebilmenizi sağlayacak. Değişiklikleri geri almak için, Ben &gt; Tercihler &gt; Genel sekmesine gidin.
+ <form name="form">
+ <button name="OK" text="Tercihi DeÄŸiÅŸtir"/>
+ <button name="Cancel" text="Kapat"/>
+ <ignore name="ignore" text="Seçtiğim Seviye tercihleri bir bölgeye girmemi engelliyor"/>
+ </form>
+ </notification>
+ <notification name="PreferredMaturityChanged">
+ Erişkinlik Seviyesi tercihiniz artık [RATING].
+ </notification>
+ <notification name="LandClaimAccessBlocked">
+ Erişkinlik Seviyesi ayarlarınızdan dolayı bu arazi üzerinde hak talebinde bulunamazsınız. Bu sorun yaşınızı doğrulamak için gerekli bilgilerin eksik olmasından kaynaklanabilir.
+
+Lütfen en son Görüntüleyicinin yüklü olduğunu doğrulayın ve bu erişkinlik seviyesi ile erişilecek alanlar hakkında ayrıntılı bilgi edinmek için Bilgi Bankası&apos;nı ziyaret edin.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="LandClaimAccessBlocked_KB">
+ Erişkinlik Seviyesi ayarlarınızdan dolayı bu arazi üzerinde hak talebinde bulunamazsınız.
+
+Erişkinlik Seviyeleri hakkında daha fazla bilgi edinmek için Bilgi Bankası&apos;nı ziyaret etmek ister misiniz?
+ <url name="url">
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview
+ </url>
+ <usetemplate ignoretext="Erişkinlik Seviyesi ile ilgili kısıtlandırmalardan dolayı bu Arazi üzerinde hak talebinde bulunamıyorum." name="okcancelignore" notext="Kapat" yestext="Bilgi Bankası&apos;na Git"/>
+ </notification>
+ <notification name="LandClaimAccessBlocked_Notify">
+ Erişkinlik Seviyesi ayarlarınızdan dolayı bu arazi üzerinde hak talebinde bulunamazsınız.
+ </notification>
+ <notification name="LandClaimAccessBlocked_Change">
+ Erişkinlik Seviyesi tercihinizden dolayı bu arazi üzerinde hak talebinde bulunamazsınız.
+
+Erişkinlik Seviyesi tercihinizi şimdi yükseltmek ve araziye girebilmek için &apos;Tercihi Değiştir&apos; seçeneğini tıklatabilirsiniz. Böylece [REGIONMATURITY] içerikli alanlar içinde arama yapabilecek ve bu alanlara erişebileceksiniz. İleride bu ayarı eski haline döndürmek isterseniz, Ben &gt; Tercihler &gt; Genel sekmesine gidin.
+ <usetemplate ignoretext="Seçtiğim Seviye tercihi Arazi üzerinde hak talebinde bulunmamı engelliyor" name="okcancelignore" notext="Kapat" yestext="Tercihi Değiştir"/>
+ </notification>
+ <notification name="LandBuyAccessBlocked">
+ Erişkinlik Seviyesi ayarlarınızdan dolayı bu araziyi satın alamazsınız. Bu sorun yaşınızı doğrulamak için gerekli bilgilerin eksik olmasından kaynaklanabilir.
+
+Lütfen en son Görüntüleyicinin yüklü olduğunu doğrulayın ve bu erişkinlik seviyesi ile erişilecek alanlar hakkında ayrıntılı bilgi edinmek için Bilgi Bankası&apos;nı ziyaret edin.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="LandBuyAccessBlocked_KB">
+ Erişkinlik Seviyesi ayarlarınızdan dolayı bu araziyi satın alamazsınız.
+
+Erişkinlik Seviyeleri hakkında daha fazla bilgi edinmek için Bilgi Bankası&apos;nı ziyaret etmek ister misiniz?
+ <url name="url">
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview
+ </url>
+ <usetemplate ignoretext="Erişkinlik Seviyesi ile ilgili kısıtlandırmalardan dolayı bu Araziyi satın alamıyorum" name="okcancelignore" notext="Kapat" yestext="Bilgi Bankası&apos;na Git"/>
+ </notification>
+ <notification name="LandBuyAccessBlocked_Notify">
+ Erişkinlik Seviyesi ayarlarınızdan dolayı bu araziyi satın alamazsınız.
+ </notification>
+ <notification name="LandBuyAccessBlocked_Change">
+ Erişkinlik Seviyesi tercihinizden dolayı bu araziyi satın alamazsınız.
+
+Erişkinlik Seviyesi tercihinizi şimdi yükseltmek ve araziye girebilmek için &apos;Tercihi Değiştir&apos; seçeneğini tıklatabilirsiniz. Böylece [REGIONMATURITY] içerikli alanlar içinde arama yapabilecek ve bu alanlara erişebileceksiniz. İleride bu ayarı eski haline döndürmek isterseniz, Ben &gt; Tercihler &gt; Genel sekmesine gidin.
+ <usetemplate ignoretext="Seçtiğim Seviye tercihi Araziyi satın almamı engelliyor" name="okcancelignore" notext="Kapat" yestext="Tercihi Değiştir"/>
+ </notification>
+ <notification name="TooManyPrimsSelected">
+ Çok fazla prim seçilmiş. Lütfen [MAX_PRIM_COUNT] ya da daha az prim seçin ve tekrar deneyin
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="ProblemImportingEstateCovenant">
+ Gayrimenkul sözleşmesi içeriye aktarılırken problem oluştu.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="ProblemAddingEstateManager">
+ Yeni bir gayrimenkul yöneticisi eklenirken problem oluştu. Bir veya birden fazla gayrimenkulün yönetici listesi dolu olabilir.
+ </notification>
+ <notification name="ProblemAddingEstateGeneric">
+ Bu gayrimenkul listesine eklenirken problem oluştu. Bir veya birden fazla gayrimenkulün listesi dolu olabilir.
+ </notification>
+ <notification name="UnableToLoadNotecardAsset">
+ Not kartı varlığı şu anda yüklenemedi.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="NotAllowedToViewNotecard">
+ İstenen varlık kimliği ile ilişkili not karını görüntülemek için yeterli izniniz yok.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="MissingNotecardAssetID">
+ Not kartının varlık kimliği veri tabanında yer almıyor.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="PublishClassified">
+ Hatırla: İlan ücretleri iade edilmez.
+
+Şimdi L$ [AMOUNT] ödeyerek bu ilanı yayınlamak istiyor musunuz?
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="SetClassifiedMature">
+ Bu ilan Orta Seviyede içerik barındırıyor mu?
+ <usetemplate canceltext="İptal" name="yesnocancelbuttons" notext="Hayır" yestext="Evet"/>
+ </notification>
+ <notification name="SetGroupMature">
+ Bu grup Orta Seviyede içerik barındırıyor mu?
+ <usetemplate canceltext="İptal" name="yesnocancelbuttons" notext="Hayır" yestext="Evet"/>
+ </notification>
+ <notification label="Yeniden başlatmayı onayla" name="ConfirmRestart">
+ Bu bölgeyi gerçekten 2 dakika sonra yeniden başlatmak istiyor musunuz?
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification label="Bu bölgedeki herkese ileti gönderme" name="MessageRegion">
+ Bu bölgede bulunan herkese gönderilecek kısa bir duyuru yazın.
+ <form name="form">
+ <button name="OK" text="Tamam"/>
+ <button name="Cancel" text="Ä°ptal"/>
+ </form>
+ </notification>
+ <notification label="Bölgenin Erişkinlik Seviyesi Değişti" name="RegionMaturityChange">
+ Bu bölgenin erişkinlik seviyesi güncellendi.
+Değişikliğin harita üzerine yansıtılması biraz zaman alabilir.
+
+Yetişkin bölgelerine girebilmek için, Sakinlerin yaş doğrulama ya da ödeme doğrulama yoluyla Doğrulanmış bir Hesaba sahip olmaları gerekmektedir.
+ </notification>
+ <notification label="Sesli Sohbet Sürüm Uyumsuzluğu" name="VoiceVersionMismatch">
+ [APP_NAME] uygulamasının bu sürümü bu bölgedeki Sesli Sohbet özelliği ile uyumlu değil. Sesli Sohbet özelliğinin düzgün bir şekilde çalışabilmesi için [APP_NAME] uygulamasını güncellemeniz gerekiyor.
+ </notification>
+ <notification label="Nesneler Satın Alınamıyor" name="BuyObjectOneOwner">
+ Farklı sahipleri olan nesneler aynı anda satın alınamaz.
+Lütfen sadece bir nesne seçin ve tekrar deneyin.
+ </notification>
+ <notification label="İçerikler Satın Alınamıyor" name="BuyContentsOneOnly">
+ Aynı anda birden fazla nesnenin içeriği satın alınamaz.
+Lütfen sadece bir nesne seçin ve tekrar deneyin.
+ </notification>
+ <notification label="İçerikler Satın Alınamıyor" name="BuyContentsOneOwner">
+ Farklı sahipleri olan nesneler aynı anda satın alınamaz.
+Lütfen sadece bir nesne seçin ve tekrar deneyin.
+ </notification>
+ <notification name="BuyOriginal">
+ Özgün nesne [OWNER] kullanıcısından L$ [PRICE] karşılığında satın alınsın mı?
+Nesnenin sahibi siz olacaksınız.
+Åžu iÅŸlemleri yapabileceksiniz:
+ DeÄŸiÅŸtirme: [MODIFYPERM]
+ Kopyalama: [COPYPERM]
+ Tekrar satma veya Verme: [RESELLPERM]
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="BuyOriginalNoOwner">
+ Özgün nesne L$ [PRICE] karşılığında satın alınsın mı?
+Nesnenin sahibi siz olacaksınız.
+Åžu iÅŸlemleri yapabileceksiniz:
+ DeÄŸiÅŸtirme: [MODIFYPERM]
+ Kopyalama: [COPYPERM]
+ Tekrar satma veya Verme: [RESELLPERM]
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="BuyCopy">
+ Bir kopyası [OWNER] kullanıcısından L$ [PRICE] karşılığında satın alınsın mı?
+Nesne envanterinize kopyalanacak.
+Åžu iÅŸlemleri yapabileceksiniz:
+ DeÄŸiÅŸtirme: [MODIFYPERM]
+ Kopyalama: [COPYPERM]
+ Tekrar satma veya Verme: [RESELLPERM]
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="BuyCopyNoOwner">
+ Bir kopyası L$ [PRICE] karşılığında satın alınsın mı?
+Nesne envanterinize kopyalanacak.
+Åžu iÅŸlemleri yapabileceksiniz:
+ DeÄŸiÅŸtirme: [MODIFYPERM]
+ Kopyalama: [COPYPERM]
+ Tekrar satma veya Verme: [RESELLPERM]
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="BuyContents">
+ İçerik [OWNER] kullanıcısından L$ [PRICE] karşılığında satın alınsın mı?
+İçerik envanterinize kopyalanacak.
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="BuyContentsNoOwner">
+ İçerik L$ [PRICE] karşılığında satın alınsın mı?
+İçerik envanterinize kopyalanacak.
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ConfirmPurchase">
+ Bu işlem şununla sonuçlanacak:
+[ACTION]
+
+Bu satın alma işlemine devam etmek istediğinize emin misiniz?
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ConfirmPurchasePassword">
+ Bu işlem şununla sonuçlanacak:
+[ACTION]
+
+Bu satın alma işlemine devam etmek istediğinize emin misiniz?
+Lütfen parolanızı yeniden girin ve Tamam&apos;ı tıklatın.
+ <form name="form">
+ <button name="ConfirmPurchase" text="Tamam"/>
+ <button name="Cancel" text="Ä°ptal"/>
+ </form>
+ </notification>
+ <notification name="SetPickLocation">
+ Not:
+Bu seçmenin konumunu güncellediniz fakat diğer detaylar özgün değerlerini koruyacak.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="MoveInventoryFromObject">
+ &apos;Kopyalanamayan&apos; envanter öğeleri seçtiniz.
+Bu öğeler envanterinize taşınacak, kopyalanmayacak.
+
+Envanter öğesi/öğeleri taşınsın mı?
+ <usetemplate ignoretext="Bir nesneden &apos;kopyalanamayan&apos; öğeleri taşımadan önce beni uyar" name="okcancelignore" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="MoveInventoryFromScriptedObject">
+ &apos;Kopyalanamayan&apos; envanter öğeleri seçtiniz. Bu öğeler envanterinize taşınacak, kopyalanmayacak.
+Bu nesnenin içinde komut dosyası bulunduğundan, bu öğelerin envanterinize taşınması komut dosyasının hatalı çalışmasına neden olabilir.
+
+Envanter öğesi/öğeleri taşınsın mı?
+ <usetemplate ignoretext="İçinde komut dosyası bulunan bir nesneyi parçalayabilecek &apos;kopyalanamayan&apos; öğeleri taşımadan önce beni uyar" name="okcancelignore" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ClickActionNotPayable">
+ Uyarı: &apos;Nesne için ödeme yap&apos; tıklama eylemi ayarlanmış fakat sadece bir komut dosyası bir para() olayı ile eklenirse çalışacak.
+ <form name="form">
+ <ignore name="ignore" text="Para() komut dosyası içermeyen bir nesne oluştururken &apos;Nesne için ödeme yap&apos; eylemi ayarladım"/>
+ </form>
+ </notification>
+ <notification name="OpenObjectCannotCopy">
+ Bu nesne içinde kopyalama izniniz olan bir öğe yok.
+ </notification>
+ <notification name="WebLaunchAccountHistory">
+ Hesap geçmişinizi görüntülemek için [http://secondlife.com/account/ Kontrol Paneli] adresine gitmek istiyor musunuz?
+ <usetemplate ignoretext="Hesap geçmişimi görüntülemek için tarayıcımı başlat" name="okcancelignore" notext="İptal" yestext="Sayfaya git"/>
+ </notification>
+ <notification name="ConfirmQuit">
+ Çıkmak istediğinize emin misiniz?
+ <usetemplate ignoretext="Çıkmadan önce doğrulama iste" name="okcancelignore" notext="Çıkma" yestext="Çık"/>
+ </notification>
+ <notification name="ConfirmRestoreToybox">
+ Bu eylem, varsayılan düğmelerinizi ve araç çubuklarınızı geri yükleyecek.
+
+Bu eylemi geri alamazsınız.
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ConfirmClearAllToybox">
+ Bu eylem ile tüm düğmeler araç kutusuna döner ve araç çubuklarınız boş olur.
+
+Bu eylemi geri alamazsınız.
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="DeleteItems">
+ [QUESTION]
+ <usetemplate ignoretext="Öğeleri silmeden önce doğrulama iste" name="okcancelignore" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="HelpReportAbuseEmailLL">
+ [http://secondlife.com/corporate/tos.php Hizmet Sözleşmesi] ve [http://secondlife.com/corporate/cs.php Topluluk Standartları] ihlallerini bildirmek için bu aracı kullanın.
+
+Bildirilen tüm kötüye kullanımlar incelenir ve çözüme ulaştırılır.
+ </notification>
+ <notification name="HelpReportAbuseSelectCategory">
+ Lütfen bu kötüye kullanım bildirimi için bir kategori seçin.
+Kategori seçimi, kötüye kullanım bildirimlerini dosyalamamıza ve işleme almamıza yardımcı olmaktadır.
+ </notification>
+ <notification name="HelpReportAbuseAbuserNameEmpty">
+ Lütfen kötüye kullanan kişinin adını yazın.
+Doğru değerlerin girilmesi, kötüye kullanım bildirimlerini dosyalamamıza ve işleme almamıza yardımcı olmaktadır.
+ </notification>
+ <notification name="HelpReportAbuseAbuserLocationEmpty">
+ Lütfen kötüye kullanımın gerçekleştiği konumu yazın.
+Doğru değerlerin girilmesi, kötüye kullanım bildirimlerini dosyalamamıza ve işleme almamıza yardımcı olmaktadır.
+ </notification>
+ <notification name="HelpReportAbuseSummaryEmpty">
+ Lütfen kötüye kullanımın nasıl gerçekleştiğini özetleyin.
+Doğru bir özetin girilmesi, kötüye kullanım bildirimlerini dosyalamamıza ve işleme almamıza yardımcı olmaktadır.
+ </notification>
+ <notification name="HelpReportAbuseDetailsEmpty">
+ Lütfen gerçekleşen kötüye kullanımı ayrıntılı bir şekilde anlatın.
+Bildirdiğiniz olayın ayrıntıları ve adlar dahil olmak üzere olabildiğince detaylı bilgi verin.
+Doğru bir anlatım yapılması, kötüye kullanım bildirimlerini dosyalamamıza ve işleme almamıza yardımcı olmaktadır.
+ </notification>
+ <notification name="HelpReportAbuseContainsCopyright">
+ DeÄŸerli Second Life Sakinimiz,
+
+Fikri mülkiyet ihlali konusunda bir bildirim yapıyorsunuz. Konuyu doğru bir şekilde bildirdiğinizden emin olun:
+
+(1) Kötüye Kullanımı Bildirme Süreci. Bir Second Life Sakininin, CopyBot ya da benzeri bir kopyalama aracı kullanma vb. yollarla, fikri mülkiyet haklarını ihlal edecek şekilde [SECOND_LIFE]&apos;ın verdiği izinleri kötüye kullandığını düşünüyorsanız bir kötüye kullanım bildirimi sunabilirsiniz. Kötüye Kullanımla Mücadele Ekibi [SECOND_LIFE] [http://secondlife.com/corporate/tos.php Hizmet Sözleşmesi] veya [http://secondlife.com/corporate/cs.php Topluluk Standartları] kurallarını ihlal eden davranışları inceleyecek ve uygun disiplin cezalarını verecektir. Ancak, Kötüye Kullanımla Mücadele Ekibi, içeriğin [SECOND_LIFE] ortamından kaldırılma taleplerine yanıt vermeyecektir.
+
+(2) DMCA veya İçerik Kaldırma Süreci. İçeriğin [SECOND_LIFE] ortamından kaldırılmasını talep etmek için, [http://secondlife.com/corporate/dmca.php DMCA İlkeleri]&apos;nde belirtildiği şekilde geçerli bir ihlal bildirimi sunmuş olmanız GEREKLİDİR.
+
+Kötüye kullanım bildirme sürecine devam etmek için, lütfen bu pencereyi kapatın ve bildiriminizi gönderme işlemini tamamlayın. &apos;CopyBot veya İzin İhlali&apos; kategorisini seçmeniz gerekebilir.
+
+Teşekkürler
+
+Linden Lab
+ </notification>
+ <notification name="FailedRequirementsCheck">
+ Aşağıda belirtilen gerekli bileşenler [FLOATER] içinde yok:
+[COMPONENTS]
+ </notification>
+ <notification label="Mevcut Aksesuarı Değiştir" name="ReplaceAttachment">
+ Vücudunuzdaki bu noktaya takılı bir nesne zaten mevcut.
+Bu nesneyi seçilen nesne ile değiştirmek istiyor musunuz?
+ <form name="form">
+ <ignore name="ignore" text="Mevcut aksesuarı seçilen öğe ile değiştir"/>
+ <button ignore="Otomatik Olarak DeÄŸiÅŸtir" name="Yes" text="Tamam"/>
+ <button ignore="Hiçbir Zaman Değiştirme" name="No" text="İptal"/>
+ </form>
+ </notification>
+ <notification label="Meşgul Durumu Uyarısı" name="BusyModePay">
+ Durumunuz Meşgul olarak ayarlanmış; bu da, bu ödemenin karşılığında teklif edilen hiçbir öğeyi almayacağınız anlamına gelir.
+
+Bu işlemi tamamlamadan önce Meşgul durumundan çıkmak ister misiniz?
+ <form name="form">
+ <ignore name="ignore" text="Meşgul durumundayken bir kişiye veya bir nesneye ödeme yapmak üzereyim."/>
+ <button ignore="Her zaman Meşgul durumundan çık" name="Yes" text="Tamam"/>
+ <button ignore="Hiçbir zaman Meşgul durumundan çıkma" name="No" text="İptal"/>
+ </form>
+ </notification>
+ <notification name="ConfirmDeleteProtectedCategory">
+ &apos;[FOLDERNAME]&apos; klasörü bir sistem klasörüdür. Sistem klasörlerini silmek kararsızlığa neden olabilir. Silmek istediğinize emin misiniz?
+ <usetemplate ignoretext="Bir sistem klasörünü silmeden önce doğrulama iste" name="okcancelignore" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ConfirmEmptyTrash">
+ Çöp kutunuzun içeriğini kalıcı olarak silmek istediğinize emin misiniz?
+ <usetemplate ignoretext="Envanter Çöp Kutusu klasörünü boşaltmadan önce doğrulama iste" name="okcancelignore" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ConfirmClearBrowserCache">
+ Seyahat, web ve arama geçmişinizi silmek istediğinize emin misiniz?
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ConfirmClearCache">
+ Görüntüleyici önbelleğinizi temizlemek istediğinize emin misiniz?
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ConfirmClearCookies">
+ Çerezlerinizi silmek istediğinize emin misiniz?
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Evet"/>
+ </notification>
+ <notification name="ConfirmClearMediaUrlList">
+ Kayıtlı URL adreslerinizi silmek istediğinize emin misiniz?
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Evet"/>
+ </notification>
+ <notification name="ConfirmEmptyLostAndFound">
+ Kaybedip Bulduklarım klasörünüzün içeriğini kalıcı olarak silmek istediğinize emin misiniz?
+ <usetemplate ignoretext="Kaybedip Bulduğum envanterler klasörünü boşaltmadan önce doğrulama iste" name="okcancelignore" notext="Hayır" yestext="Evet"/>
+ </notification>
+ <notification name="CopySLURL">
+ Aşağıdaki SLurl adresi panonuza kopyalandı:
+ [SLURL]
+
+Diğer kişilerin bu konuma kolayca erişmesini sağlamak için bu adrese bir web sayfası üzerinden bağlantı verin veya herhangi bir web tarayıcısının adres çubuğuna yapıştırarak önce siz deneyin.
+ <form name="form">
+ <ignore name="ignore" text="SLurl adresi panoma kopyalandı"/>
+ </form>
+ </notification>
+ <notification name="WLSavePresetAlert">
+ Kayıtlı ön ayarın üzerine yazmak istiyor musunuz?
+ <usetemplate name="okcancelbuttons" notext="Hayır" yestext="Evet"/>
+ </notification>
+ <notification name="WLNoEditDefault">
+ Varsayılan olarak ayarlanmış bir ön ayarı değiştiremez ve silemezsiniz.
+ </notification>
+ <notification name="WLMissingSky">
+ Bu gün döngüsü dosyası kayıp bir gökyüzü dosyasına başvuruda bulunuyor: [SKY].
+ </notification>
+ <notification name="WLRegionApplyFail">
+ Üzgünüz, bu ayarlar bölgeye uygulanamadı. Bölgeden ayrılmak ve sonra geri dönmek sorunu çözebilir. Gösterilen neden şuydu: [FAIL_REASON]
+ </notification>
+ <notification name="EnvCannotDeleteLastDayCycleKey">
+ Bu gün döngüsündeki son anahtar silinemedi çünkü boş bir gün döngünüz olamaz. Son kalan anahtarı silmek ve yenisini oluşturmaya kalkışmak yerine bunu değiştirmelisiniz.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="DayCycleTooManyKeyframes">
+ Bu gün döngüsüne daha fazla anahtar kare ekleyemezsiniz. [SCOPE] kapsamı gün döngüleri için maksimum anahtar kare sayısı [MAX] değerini aşamaz.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="EnvUpdateRate">
+ Ortam ayarlarınızı ancak her [WAIT] saniyede bir güncelleştirebilirsiniz. En azından bu kadar bekleyin ve tekrar deneyin.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="PPSaveEffectAlert">
+ İşlem Sonrası Efekti mevcut. Hala üzerine yazmak istiyor musunuz?
+ <usetemplate name="okcancelbuttons" notext="Hayır" yestext="Evet"/>
+ </notification>
+ <notification name="ChatterBoxSessionStartError">
+ [RECIPIENT] ile yeni bir sohbet oturumu başlatılamıyor.
+[REASON]
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="ChatterBoxSessionEventError">
+ [EVENT]
+[REASON]
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="ForceCloseChatterBoxSession">
+ [NAME] ile sürdürdüğünüz sohbet oturumunun kapatılması gerekiyor.
+[REASON]
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="Cannot_Purchase_an_Attachment">
+ Bir nesne bir avatarın üzerinde takılı iken onu satın alamazsınız.
+ </notification>
+ <notification label="Borç Alma İzni Talep Etme Hakkında" name="DebitPermissionDetails">
+ Bu talebi kabul etmek, bir komut dosyasına, hesabınızdan Linden doları (L$) alma konusunda sürekli bir izin verir. Bu izni iptal etmek için, nesne sahibi nesneyi silmeli ya da nesne içindeki komut dosyalarını yeniden ayarlamalıdır.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="AutoWearNewClothing">
+ Oluşturmak üzere olduğunuz giysiyi otomatik olarak giymek ister misiniz?
+ <usetemplate ignoretext="Görünümümü düzenlerken oluşturduğum giysiyi giy" name="okcancelignore" notext="Hayır" yestext="Evet"/>
+ </notification>
+ <notification name="NotAgeVerified">
+ Second Life içinde yetişkinlere yönelik içeriğe ve bölgelere erişmek için en az 18 yaşında olmalısınız. 18 yaşından büyük olduğunuzu onaylamak için lütfen yaş doğrulama sayfamızı ziyaret edin.
+Bu adımda web tarayıcınızın başlatılacağına dikkat edin.
+
+[_URL]
+ <url name="url">
+ https://secondlife.com/my/account/verification.php
+ </url>
+ <usetemplate ignoretext="Yaşımı doğrulatmadım" name="okcancelignore" notext="İptal" yestext="Yaş Doğrulamasına Git"/>
+ </notification>
+ <notification name="Cannot enter parcel: no payment info on file">
+ Bu alanı ziyaret edebilmek için ödeme bilgilerinizin kayıtlı olması gerekir. [SECOND_LIFE] web sitesine gitmek ve bunu ayarlamak istiyor musunuz?
+
+[_URL]
+ <url name="url">
+ https://secondlife.com/account/
+ </url>
+ <usetemplate ignoretext="Ödeme bilgilerim kayıtlı değil" name="okcancelignore" notext="Hayır" yestext="Evet"/>
+ </notification>
+ <notification name="MissingString">
+ [STRING_NAME] dizesi strings.xml dosyasında yer almıyor.
+ </notification>
+ <notification name="SystemMessageTip">
+ [MESSAGE]
+ </notification>
+ <notification name="IMSystemMessageTip">
+ [MESSAGE]
+ </notification>
+ <notification name="Cancelled">
+ Ä°ptal Edildi
+ </notification>
+ <notification name="CancelledSit">
+ Oturma Ä°ptal Edildi
+ </notification>
+ <notification name="CancelledAttach">
+ Takma Ä°ptal Edildi
+ </notification>
+ <notification name="ReplacedMissingWearable">
+ Eksik giysi/vücut bölümü varsayılan ile değiştirildi.
+ </notification>
+ <notification name="GroupNotice">
+ Konu: [SUBJECT], Ä°leti: [MESSAGE]
+ </notification>
+ <notification name="FriendOnline">
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; çevrimiçi
+ </notification>
+ <notification name="FriendOffline">
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; çevrimdışı
+ </notification>
+ <notification name="AddSelfFriend">
+ Çok iyi biri olduğunuza eminiz fakat kendinizi arkadaş olarak ekleyemezsiniz.
+ </notification>
+ <notification name="UploadingAuctionSnapshot">
+ SL dünyası içinde ve web sitesinde yer alan anlık görüntüler karşıya yükleniyor...
+(Yaklaşık 5 dakika sürecektir.)
+ </notification>
+ <notification name="UploadPayment">
+ Karşıya yüklemek için L$ [AMOUNT] ödediniz.
+ </notification>
+ <notification name="UploadWebSnapshotDone">
+ Web sitesinde yer alan anlık görüntülerin karşıya yüklenmesi tamamlandı.
+ </notification>
+ <notification name="UploadSnapshotDone">
+ SL dünyası içinde yer alan anlık görüntülerin karşıya yüklenmesi tamamlandı.
+ </notification>
+ <notification name="TerrainDownloaded">
+ Terrain.raw karşıdan yüklendi
+ </notification>
+ <notification name="GestureMissing">
+ Hmm. [NAME] mimiği veri tabanında yok.
+ </notification>
+ <notification name="UnableToLoadGesture">
+ [NAME] mimiği karşıya yüklenemiyor.
+ </notification>
+ <notification name="LandmarkMissing">
+ Yer imi veri tabanında yok.
+ </notification>
+ <notification name="UnableToLoadLandmark">
+ Yer imi karşıya yüklenemiyor. Lütfen tekrar deneyin.
+ </notification>
+ <notification name="CapsKeyOn">
+ Caps Lock tuşunuz açık.
+Parolanızı yanlış yazmanıza sebep olabilir.
+ </notification>
+ <notification name="NotecardMissing">
+ Not kartı veri tabanında yok.
+ </notification>
+ <notification name="NotecardNoPermissions">
+ Bu not kartını görüntüleme izniniz yok.
+ </notification>
+ <notification name="RezItemNoPermissions">
+ Nesneyi oluşturmak için yetersiz izin.
+ </notification>
+ <notification name="IMAcrossParentEstates">
+ Ana gayrimenkuller arasında Aİ gönderilemiyor.
+ </notification>
+ <notification name="TransferInventoryAcrossParentEstates">
+ Ana gayrimenkuller arasında envanter aktarımı yapılamıyor.
+ </notification>
+ <notification name="UnableToLoadNotecard">
+ Not kartı karşıya yüklenemiyor.
+Lütfen tekrar deneyin.
+ </notification>
+ <notification name="ScriptMissing">
+ Komut dosyası veri tabanında yok.
+ </notification>
+ <notification name="ScriptNoPermissions">
+ Komut dosyasını görüntülemek için yetersiz izin.
+ </notification>
+ <notification name="UnableToLoadScript">
+ Komut dosyası karşıya yüklenemiyor. Lütfen tekrar deneyin.
+ </notification>
+ <notification name="IncompleteInventory">
+ Teklif etmek istediğiniz içeriğin tamamı henüz yerel olarak kullanılabilir değil. Lütfen bu öğeleri bir dakika içerisinde tekrar teklif etmeyi deneyin.
+ </notification>
+ <notification name="CannotModifyProtectedCategories">
+ KorunmuÅŸ kategorileri deÄŸiÅŸtiremezsiniz.
+ </notification>
+ <notification name="CannotRemoveProtectedCategories">
+ Korunmuş kategorileri kaldıramazsınız.
+ </notification>
+ <notification name="UnableToBuyWhileDownloading">
+ Nesne verileri karşıdan yüklenirken satın alınamıyor.
+Lütfen tekrar deneyin.
+ </notification>
+ <notification name="UnableToLinkWhileDownloading">
+ Nesne verileri karşıdan yüklenirken bağlanılamıyor.
+Lütfen tekrar deneyin.
+ </notification>
+ <notification name="CannotBuyObjectsFromDifferentOwners">
+ Aynı anda sadece bir kullanıcının sahip olduğu nesneleri satın alabilirsiniz.
+Lütfen tek bir nesne seçin.
+ </notification>
+ <notification name="ObjectNotForSale">
+ Bu nesne satılık değil.
+ </notification>
+ <notification name="EnteringGodMode">
+ Yönetici ayrıcalıklarına sahip moda giriliyor, seviye [LEVEL]
+ </notification>
+ <notification name="LeavingGodMode">
+ Yönetici ayrıcalıklarına sahip moddan çıkılıyor, seviye [LEVEL]
+ </notification>
+ <notification name="CopyFailed">
+ Bunu kopyalama izniniz yok.
+ </notification>
+ <notification name="InventoryAccepted">
+ [NAME] envanter teklifinizi aldı.
+ </notification>
+ <notification name="InventoryDeclined">
+ [NAME] envanter teklifinizi reddetti.
+ </notification>
+ <notification name="ObjectMessage">
+ [NAME]: [MESSAGE]
+ </notification>
+ <notification name="CallingCardAccepted">
+ Arama kartınız kabul edildi.
+ </notification>
+ <notification name="CallingCardDeclined">
+ Arama kartınız reddedildi.
+ </notification>
+ <notification name="TeleportToLandmark">
+ &apos;[NAME]&apos; gibi konumlara ışınlanmak için &quot;Yerler&quot; düğmesine tıklayın,
+ sonra açılan pencerede Yer İmleri sekmesini seçin. Herhangi bir
+ yer iminin üzerine tıklayarak bunu seçin ve ardından pencerenin en altındaki &apos;Işınla&apos; düğmesine tıklayın.
+ (Ayrıca yer imine çift tıklayabilir veya sağ tıklayarak
+ &apos;Işınla&apos; seçimini yapabilirsiniz.)
+ </notification>
+ <notification name="TeleportToPerson">
+ &apos;[NAME]&apos; gibi sakinlerle bağlantıya geçmek için &quot;Kişiler&quot; düğmesine tıklayın, açılan pencereden bir Sakin seçin ve sonra
+ pencerenin altında &apos;Anlık İleti&quot; üzerine tıklayın.
+ (Listede adlarına çift tıklayarak veya sağ tıklayıp &quot;Anlık İleti&quot;yi seçerek de bunu yapabilirsiniz.)
+ </notification>
+ <notification name="CantSelectLandFromMultipleRegions">
+ Sunucunun sınırları dışındaki arazi seçilemez.
+Daha küçük bir arazi parçası seçmeyi deneyin.
+ </notification>
+ <notification name="SearchWordBanned">
+ Arama sorgunuzdaki bazı kelimeler Topluluk Standartları&apos;nda belirtilen içerik kısıtlamaları nedeniyle aramaya dahil edilmedi.
+ </notification>
+ <notification name="NoContentToSearch">
+ Lütfen arama yapmak için en az bir içerik türü seçin (Genel, Orta Seviye veya Yetişkin)
+ </notification>
+ <notification name="SystemMessage">
+ [MESSAGE]
+ </notification>
+ <notification name="PaymentReceived">
+ [MESSAGE]
+ </notification>
+ <notification name="PaymentSent">
+ [MESSAGE]
+ </notification>
+ <notification name="PaymentFailure">
+ [MESSAGE]
+ </notification>
+ <notification name="EventNotification">
+ Etkinlik Bildirimi
+
+[NAME]
+[DATE]
+ <form name="form">
+ <button name="Details" text="Ayrıntl"/>
+ <button name="Cancel" text="Ä°ptal"/>
+ </form>
+ </notification>
+ <notification name="TransferObjectsHighlighted">
+ Bu parsel üzerinde bulunan ve parseli satın alan kişiye aktarılacak olan tüm nesneler vurgulanmıştır.
+
+* Aktarılacak ağaç ve çimler vurgulanmamıştır.
+ <form name="form">
+ <button name="Done" text="Tamamlandı"/>
+ </form>
+ </notification>
+ <notification name="DeactivatedGesturesTrigger">
+ Aynı tetikleyiciye sahip mimikler devre dışı bırakıldı:
+[NAMES]
+ </notification>
+ <notification name="NoQuickTime">
+ Apple Quick Time yazılımı sisteminizde yüklü görünmüyor.
+Destekleyen parsellerde akış ortamını görüntülemek istiyorsanız [http://www.apple.com/quicktime QuickTime sitesine] gitmeli ve QuickTime Player&apos;ı yüklemelisiniz.
+ </notification>
+ <notification name="NoPlugin">
+ &quot;[MIME_TYPE]&quot; mime türüne uygun bir Ortam Eklentisi bulunamadı. Bu türdeki ortam dosyaları kullanılamayacak.
+ </notification>
+ <notification name="MediaPluginFailed">
+ Aşağıdaki Ortam Eklentisi arızalandı:
+ [PLUGIN]
+
+Sorun yaşamaya devam ederseniz lütfen eklentiyi yeniden yükleyin veya satıcı ile iletişim kurun.
+ <form name="form">
+ <ignore name="ignore" text="Bir Ortam Eklentisi çalıştırılamadı"/>
+ </form>
+ </notification>
+ <notification name="OwnedObjectsReturned">
+ Seçili arazi parseli üzerinde sahip olduğunuz nesneler envanterinize iade edildi.
+ </notification>
+ <notification name="OtherObjectsReturned">
+ [NAME] adlı kullanıcının sahip olduğu seçili arazi parseli üzerinde bulunan nesneler kullanıcının envanterine iade edildi.
+ </notification>
+ <notification name="OtherObjectsReturned2">
+ &apos;[NAME]&apos; adlı Sakinin sahip olduğu seçili arazi parseli üzerinde bulunan nesneler kendi sahiplerine iade edildi.
+ </notification>
+ <notification name="GroupObjectsReturned">
+ [GROUPNAME] ile paylaşılan seçili arazi parseli üzerinde bulunan nesneler kendi sahiplerinin envanterlerine iade edildi.
+Devredilmiş nesnelerin aktarılabilenleri önceki sahiplerine iade edildi.
+Gruba devredilen nesnelerden aktarılamayanlar silindi.
+ </notification>
+ <notification name="UnOwnedObjectsReturned">
+ Seçili parsel üzerinde size ait OLMAYAN nesneler kendi sahiplerine iade edildi.
+ </notification>
+ <notification name="ServerObjectMessage">
+ [NAME] adlı kişiden gelen ileti:
+&lt;nolink&gt;[MSG]&lt;/nolink&gt;
+ </notification>
+ <notification name="NotSafe">
+ Bu arazide hasar özelliği etkin.
+Burada zarar görebilirsiniz. Hayatınızı kaybederseniz ana konumunuza ışınlanacaksınız.
+ </notification>
+ <notification name="NoFly">
+ Bu alanda uçma özelliği devre dışı.
+Burada uçamazsınız.
+ </notification>
+ <notification name="PushRestricted">
+ Bu alan başkalarını dışarı itmeye izin vermiyor. Bu arazinin sahibi değilseniz başkalarını dışarı itemezsiniz.
+ </notification>
+ <notification name="NoVoice">
+ Bu alanda sesli sohbet özelliği devre dışı. Kimsenin konuşmasını duyamayacaksınız.
+ </notification>
+ <notification name="NoBuild">
+ Bu alanda inşa etme özelliği devre dışı. Burada nesne inşa edemez ve oluşturamazsınız.
+ </notification>
+ <notification name="SeeAvatars">
+ Bu parsel, avatarları ve metin sohbetini başka bir parselden saklar. Parselin dışındaki diğer sakinleri göremezsiniz, dışardakiler de sizi göremez. 0. kanaldaki normal metin sohbeti de engellenmiştir.
+ </notification>
+ <notification name="ScriptsStopped">
+ Bir yönetici bu bölgedeki komut dosyalarını geçici olarak durdurdu.
+ </notification>
+ <notification name="ScriptsNotRunning">
+ Bu bölgede hiçbir komut dosyası çalışmıyor.
+ </notification>
+ <notification name="NoOutsideScripts">
+ Bu arazide dış komut dosyaları devre dışı.
+
+Arazi sahibine ait olanlar dışında hiçbir komut dosyası çalışmayacak.
+ </notification>
+ <notification name="ClaimPublicLand">
+ İçinde bulunduğunuz Bölgede sadece kamuya ait araziler üzerinde hak talebinde bulunabilirsiniz.
+ </notification>
+ <notification name="RegionTPAccessBlocked">
+ Erişkinlik Seviyesi ayarlarınızdan dolayı bu Bölgeye giremezsiniz. Yaşınızı doğrulatmanız ve/veya en son Görüntüleyici&apos;yi yüklemeniz gerekebilir.
+
+Lütfen bu erişkinlik Seviyesi ile erişilecek alanlar hakkında ayrıntılı bilgi edinmek için Bilgi Bankası&apos;na gidin.
+ </notification>
+ <notification name="URBannedFromRegion">
+ Bu bölgeye erişiminiz yasaklandı.
+ </notification>
+ <notification name="NoTeenGridAccess">
+ Hesabınız 18 yaş altı kullanıcılar için hazırlanmış olan ağa bağlanamıyor.
+ </notification>
+ <notification name="ImproperPaymentStatus">
+ Bu bölgeye girmek için gerekli ödeme durumuna sahip değilsiniz.
+ </notification>
+ <notification name="MustGetAgeRgion">
+ Bu bölgeye girebilmek için yaş doğrulamanızın yapılmış olması gerekir.
+ </notification>
+ <notification name="MustGetAgeParcel">
+ Bu parsele girebilmek için yaş doğrulamanızın yapılmış olması gerekir.
+ </notification>
+ <notification name="NoDestRegion">
+ Seçili hedef bölge yok.
+ </notification>
+ <notification name="NotAllowedInDest">
+ Hedef konuma girme izniniz yok.
+ </notification>
+ <notification name="RegionParcelBan">
+ Bölge değiştirerek yasaklı bir parsele giriş yapamazsınız. Başka bir yol deneyin.
+ </notification>
+ <notification name="TelehubRedirect">
+ Bir ışınlanma istasyonuna yeniden yönlendirildiniz.
+ </notification>
+ <notification name="CouldntTPCloser">
+ Hedef konuma daha yakın bir bölgeye ışınlanılamadı.
+ </notification>
+ <notification name="TPCancelled">
+ Işınlanma iptal edildi.
+ </notification>
+ <notification name="FullRegionTryAgain">
+ Girmeye çalıştığınız bölge şu anda dolu.
+Lütfen biraz sonra tekrar deneyin.
+ </notification>
+ <notification name="GeneralFailure">
+ Genel arıza.
+ </notification>
+ <notification name="RoutedWrongRegion">
+ Yanlış bölgeye yönlendirildi. Lütfen tekrar deneyin.
+ </notification>
+ <notification name="NoValidAgentID">
+ Geçerli bir aracı kimliği yok.
+ </notification>
+ <notification name="NoValidSession">
+ Geçerli bir oturum kimliği yok.
+ </notification>
+ <notification name="NoValidCircuit">
+ Geçerli bir devre kodu yok.
+ </notification>
+ <notification name="NoValidTimestamp">
+ Geçerli bir zaman damgası yok.
+ </notification>
+ <notification name="NoPendingConnection">
+ Beklemedeki bağlantı oluşturulamıyor.
+ </notification>
+ <notification name="InternalUsherError">
+ Aracı öncüsüne bağlanılmaya çalışılırken dahili bir hata oluştu.
+ </notification>
+ <notification name="NoGoodTPDestination">
+ Bu bölgede iyi bir ışınlanma hedef konumu bulunamıyor.
+ </notification>
+ <notification name="InternalErrorRegionResolver">
+ Bölge çözümleyicisi etkinleştirilmeye çalışılırken dahili bir hata oluştu.
+ </notification>
+ <notification name="NoValidLanding">
+ Geçerli bir iniş noktası bulunamadı.
+ </notification>
+ <notification name="NoValidParcel">
+ Geçerli bir parsel bulunamadı.
+ </notification>
+ <notification name="ObjectGiveItem">
+ Sahibinin [NAME_SLURL] olduğu, &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; adındaki bir nesne size [OBJECTTYPE] türündeki bu nesneyi verdi:
+&lt;nolink&gt;[ITEM_SLURL]&lt;/nolink&gt;
+ <form name="form">
+ <button name="Keep" text="Sakla"/>
+ <button name="Discard" text="At"/>
+ <button name="Mute" text="Sahibi Engelle"/>
+ </form>
+ </notification>
+ <notification name="OwnObjectGiveItem">
+ &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; adındaki nesneniz size [OBJECTTYPE] türündeki bu nesneyi verdi:
+&lt;nolink&gt;[ITEM_SLURL]&lt;/nolink&gt;
+ <form name="form">
+ <button name="Keep" text="Sakla"/>
+ <button name="Discard" text="At"/>
+ </form>
+ </notification>
+ <notification name="UserGiveItem">
+ [NAME_SLURL] size [OBJECTTYPE] türündeki nesneyi verdi:
+[ITEM_SLURL]
+ <form name="form">
+ <button name="Show" text="Göster"/>
+ <button name="Discard" text="At"/>
+ <button name="Mute" text="Engelle"/>
+ </form>
+ </notification>
+ <notification name="GodMessage">
+ [NAME]
+
+[MESSAGE]
+ </notification>
+ <notification name="JoinGroup">
+ [MESSAGE]
+ <form name="form">
+ <button name="Join" text="Katıl"/>
+ <button name="Decline" text="Reddet"/>
+ <button name="Info" text="Bilgi"/>
+ </form>
+ </notification>
+ <notification name="TeleportOffered">
+ [NAME_SLURL] size kendi konumuna ışınlanmayı teklif etti:
+
+[MESSAGE] - [MATURITY_STR] &lt;icon&gt;[MATURITY_ICON]&lt;/icon&gt;
+ <form name="form">
+ <button name="Teleport" text="Işınla"/>
+ <button name="Cancel" text="Ä°ptal"/>
+ </form>
+ </notification>
+ <notification name="TeleportOfferSent">
+ Işınlanma teklifi [TO_NAME] adlı kişiye gönderildi
+ </notification>
+ <notification name="GotoURL">
+ [MESSAGE]
+[URL]
+ <form name="form">
+ <button name="Later" text="Sonra"/>
+ <button name="GoNow..." text="Åžimdi Git..."/>
+ </form>
+ </notification>
+ <notification name="OfferFriendship">
+ [NAME_SLURL] arkadaşlık teklif ediyor.
+
+[MESSAGE]
+
+(Varsayılan olarak, birbirinizin çevrimiçi olduğunu görebileceksiniz.)
+ <form name="form">
+ <button name="Accept" text="Kabul Et"/>
+ <button name="Decline" text="Reddet"/>
+ </form>
+ </notification>
+ <notification name="FriendshipOffered">
+ [TO_NAME] adlı kişiye arkadaşlık teklif ettiniz
+ </notification>
+ <notification name="OfferFriendshipNoMessage">
+ [NAME_SLURL] arkadaşlık teklif ediyor.
+
+(Varsayılan olarak, birbirinizin çevrimiçi olduğunu görebileceksiniz.)
+ <form name="form">
+ <button name="Accept" text="Kabul Et"/>
+ <button name="Decline" text="Reddet"/>
+ </form>
+ </notification>
+ <notification name="FriendshipAccepted">
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; arkadaşlık teklifinizi kabul etti.
+ </notification>
+ <notification name="FriendshipDeclined">
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; arkadaşlık teklifinizi reddetti.
+ </notification>
+ <notification name="FriendshipAcceptedByMe">
+ Arkadaşlık teklifi kabul edildi.
+ </notification>
+ <notification name="FriendshipDeclinedByMe">
+ Arkadaşlık teklifi reddedildi.
+ </notification>
+ <notification name="OfferCallingCard">
+ [NAME] size arama kartı teklif ediyor.
+Kabul ettiğiniz takdirde, bu Sakine hızlı bir şekilde Aİ gönderebilmeniz için envanterinize bir yer imi eklenecek.
+ <form name="form">
+ <button name="Accept" text="Kabul Et"/>
+ <button name="Decline" text="Reddet"/>
+ </form>
+ </notification>
+ <notification name="RegionRestartMinutes">
+ Bu bölge [MINUTES] dakika içinde yeniden başlatılacak.
+Bu bölgede kalmaya devam ederseniz oturumunuz sonlandırılacak.
+ </notification>
+ <notification name="RegionRestartSeconds">
+ Bu bölge [SECONDS] saniye içinde yeniden başlatılacak.
+Bu bölgede kalmaya devam ederseniz oturumunuz sonlandırılacak.
+ </notification>
+ <notification name="LoadWebPage">
+ [URL] web sayfası yüklensin mi?
+
+[MESSAGE]
+
+Åžu nesneden: &lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;, sahibi: [NAME]?
+ <form name="form">
+ <button name="Gotopage" text="Sayfaya git"/>
+ <button name="Cancel" text="Ä°ptal"/>
+ </form>
+ </notification>
+ <notification name="FailedToFindWearableUnnamed">
+ [TYPE] veri tabanında bulunamadı.
+ </notification>
+ <notification name="FailedToFindWearable">
+ [DESC] adlı [TYPE] veri tabanında bulunamadı.
+ </notification>
+ <notification name="InvalidWearable">
+ Giymeye çalıştığınız öğe Görüntüleyicinizin okuyamadığı bir özellik kullanıyor. Bu öğeyi giymek için lütfen [APP_NAME] sürümünüzü yükseltin.
+ </notification>
+ <notification name="ScriptQuestion">
+ &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos;, &apos;[NAME]&apos; adlı kişiye ait bir nesne, şunu yapmak istiyor:
+
+[QUESTIONS]
+Kabul ediyor musunuz?
+ <form name="form">
+ <button name="Yes" text="Evet"/>
+ <button name="No" text="Hayır"/>
+ <button name="Mute" text="Engelle"/>
+ </form>
+ </notification>
+ <notification name="ScriptQuestionCaution">
+ &apos;[NAME]&apos; adlı kişiye ait &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos; adındaki bir nesne şunu yapmak istiyor:
+
+[QUESTIONS]
+Bu nesneye ya da onu oluşturan kişiye güvenmiyorsanız, bu talebi reddetmelisiniz.
+
+Talep kabul edilsin mi?
+ <form name="form">
+ <button name="Grant" text="Kabul Et"/>
+ <button name="Deny" text="Reddet"/>
+ <button name="Details" text="Ayrıntılar..."/>
+ </form>
+ </notification>
+ <notification name="ScriptDialog">
+ [NAME] adlı kişiye ait &apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos;
+[MESSAGE]
+ <form name="form">
+ <button name="Client_Side_Mute" text="Engelle"/>
+ <button name="Client_Side_Ignore" text="Yok say"/>
+ </form>
+ </notification>
+ <notification name="ScriptDialogGroup">
+ [GROUPNAME] grubuna ait &apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos;
+[MESSAGE]
+ <form name="form">
+ <button name="Client_Side_Mute" text="Engelle"/>
+ <button name="Client_Side_Ignore" text="Yok say"/>
+ </form>
+ </notification>
+ <notification name="BuyLindenDollarSuccess">
+ Ödeme yaptığınız için teşekkürler!
+
+İşlem tamamlandığında L$ bakiyeniz güncellenecektir. İşlem 20 dakikadan daha uzun sürerse, işlem iptal edilebilir. Bu durumda ödenen miktar US$ bakiyenize iade edilecektir.
+
+Ödemenin durumunu [http://secondlife.com/account/ Kontrol Paneli] üzerinde İşlem Geçmişi sayfanızdan kontrol edebilirsiniz.
+ </notification>
+ <notification name="FirstOverrideKeys">
+ Hareket tuşlarınız şu anda bir nesnenin kontrolünde.
+Ok tuşlarını ya da AWSD tuşlarını deneyin.
+Bazı nesneleri (örneğin silahları) kullanmak için fare üzerinden görünüme geçmeniz gerekir.
+Bunu yapmak için &apos;M&apos; tuşuna basın.
+ </notification>
+ <notification name="FirstSandbox">
+ Burası korumalı bir alandır ve Sakinlerin inşa etmeyi öğrenmelerine yardımcı olmayı amaçlamaktadır.
+
+Burada inşa ettiğiniz şeyler burayı terk ettiğinizde silinir, bu sebeple sağ tıklatıp &apos;Al&apos; seçeneğini seçerek oluşturduğunuz şeyi envanterinize taşımayı unutmayın.
+ </notification>
+ <notification name="MaxListSelectMessage">
+ Bu listeden en fazla [MAX_SELECT] öğe seçebilirsiniz.
+ </notification>
+ <notification name="VoiceInviteP2P">
+ [NAME] sizi bir Sesli Sohbete davet ediyor.
+Katılmak için Kabul Et&apos;i, daveti geri çevirmek için ise Reddet&apos;i tıklatın. Arayan kişiyi engellemek için Engelle&apos;yi tıklatın.
+ <form name="form">
+ <button name="Accept" text="Kabul Et"/>
+ <button name="Decline" text="Reddet"/>
+ <button name="Mute" text="Engelle"/>
+ </form>
+ </notification>
+ <notification name="AutoUnmuteByIM">
+ [NAME] adlı kişiye bir anlık ileti gönderildi ve otomatik olarak engeli kaldırıldı.
+ </notification>
+ <notification name="AutoUnmuteByMoney">
+ [NAME] adlı kişiye para verildi ve otomatik olarak engeli kaldırıldı.
+ </notification>
+ <notification name="AutoUnmuteByInventory">
+ [NAME] adlı kişiye envanter teklif edildi ve otomatik olarak engeli kaldırıldı.
+ </notification>
+ <notification name="VoiceInviteGroup">
+ [NAME], [GROUP] grubu ile bir Sesli Sohbet&apos;e katıldı.
+Katılmak için Kabul Et&apos;i, daveti geri çevirmek için ise Reddet&apos;i tıklatın. Arayan kişiyi engellemek için Engelle&apos;yi tıklatın.
+ <form name="form">
+ <button name="Accept" text="Kabul Et"/>
+ <button name="Decline" text="Reddet"/>
+ <button name="Mute" text="Engelle"/>
+ </form>
+ </notification>
+ <notification name="VoiceInviteAdHoc">
+ [NAME] konferans yoluyla bir sesli sohbete katıldı.
+Katılmak için Kabul Et&apos;i, daveti geri çevirmek için ise Reddet&apos;i tıklatın. Arayan kişiyi engellemek için Engelle&apos;yi tıklatın.
+ <form name="form">
+ <button name="Accept" text="Kabul Et"/>
+ <button name="Decline" text="Reddet"/>
+ <button name="Mute" text="Engelle"/>
+ </form>
+ </notification>
+ <notification name="InviteAdHoc">
+ [NAME] sizi bir konferans görüşmesine davet ediyor.
+Sohbete katılmak için Kabul Et&apos;i, daveti geri çevirmek için ise Reddet&apos;i tıklatın. Arayan kişiyi engellemek için Engelle&apos;yi tıklatın.
+ <form name="form">
+ <button name="Accept" text="Kabul Et"/>
+ <button name="Decline" text="Reddet"/>
+ <button name="Mute" text="Engelle"/>
+ </form>
+ </notification>
+ <notification name="VoiceChannelFull">
+ Katılmaya çalıştığınız sesli arama [VOICE_CHANNEL_NAME] maksimum kapasitesine ulaştı. Lütfen daha sonra tekrar deneyin.
+ </notification>
+ <notification name="ProximalVoiceChannelFull">
+ Üzgünüz. Bu alan sesli sohbet için maksimum kapasitesini aştı. Lütfen başka bir alanda sesli sohbet yapmayı deneyin.
+ </notification>
+ <notification name="VoiceChannelDisconnected">
+ [VOICE_CHANNEL_NAME] ile bağlantınız kesildi. Şimdi Yakındaki bir Sesli Sohbete yeniden bağlanılacaksınız.
+ </notification>
+ <notification name="VoiceChannelDisconnectedP2P">
+ [VOICE_CHANNEL_NAME] aramayı sonlandırdı. Şimdi Yakındaki bir Sesli Sohbete yeniden bağlanılacaksınız.
+ </notification>
+ <notification name="P2PCallDeclined">
+ [VOICE_CHANNEL_NAME] aramanızı reddetti. Şimdi Yakındaki bir Sesli Sohbete yeniden bağlanılacaksınız.
+ </notification>
+ <notification name="P2PCallNoAnswer">
+ [VOICE_CHANNEL_NAME] aramanızı kabul etmek için müsait değil. Şimdi Yakındaki bir Sesli Sohbete yeniden bağlanılacaksınız.
+ </notification>
+ <notification name="VoiceChannelJoinFailed">
+ [VOICE_CHANNEL_NAME] ile bağlantı kurulamadı, lütfen daha sonra tekrar deneyin. Şimdi Yakındaki bir Sesli Sohbete yeniden bağlanılacaksınız.
+ </notification>
+ <notification name="VoiceLoginRetry">
+ Sizin için bir ses kanalı oluşturuyoruz. Bu işlem bir dakika kadar sürebilir.
+ </notification>
+ <notification name="VoiceEffectsExpired">
+ Abone olduğunuz Ses Şekillerinden birinin ya da daha fazlasının süresi dolmuş.
+Aboneliğinizi yenilemek için [[URL] burayı tıklatın].
+ </notification>
+ <notification name="VoiceEffectsExpiredInUse">
+ Etkin Ses Şeklinin süresi dolmuş, normal ses ayarlarınız uygulandı.
+Aboneliğinizi yenilemek için [[URL] burayı tıklatın].
+ </notification>
+ <notification name="VoiceEffectsWillExpire">
+ Abone olduğunuz Ses Şekillerinden birinin ya da daha fazlasının süresi [INTERVAL] gün içinde dolacak.
+Aboneliğinizi yenilemek için [[URL] burayı tıklatın].
+ </notification>
+ <notification name="VoiceEffectsNew">
+ Yeni Ses Şekilleri kullanılabilir!
+ </notification>
+ <notification name="Cannot enter parcel: not a group member">
+ Sadece belli bir grubun üyeleri bu alanı ziyaret edebilir.
+ </notification>
+ <notification name="Cannot enter parcel: banned">
+ Parsele giriş yapamazsınız, erişiminiz yasaklandı.
+ </notification>
+ <notification name="Cannot enter parcel: not on access list">
+ Parsele giriş yapamazsınız, erişim listesinde yer almıyorsunuz.
+ </notification>
+ <notification name="VoiceNotAllowed">
+ [VOICE_CHANNEL_NAME] kanalındaki sesli sohbete bağlanmak için gerekli izne sahip değilsiniz.
+ </notification>
+ <notification name="VoiceCallGenericError">
+ [VOICE_CHANNEL_NAME] kanalındaki sesli sohbete bağlanmaya çalışılırken bir hata oluştu. Lütfen daha sonra tekrar deneyin.
+ </notification>
+ <notification name="UnsupportedCommandSLURL">
+ Tıklattığınız SLurl desteklenmiyor.
+ </notification>
+ <notification name="BlockedSLURL">
+ Güvenilmeyen bir tarayıcıdan bir SLurl alındı ve güvenliğiniz için engellendi.
+ </notification>
+ <notification name="ThrottledSLURL">
+ Güvenilmeyen bir tarayıcıdan kısa bir süre içinde birden fazla SLurl alındı.
+Güvenliğiniz için birkaç saniye engellenecek.
+ </notification>
+ <notification name="IMToast">
+ [MESSAGE]
+ <form name="form">
+ <button name="respondbutton" text="Yanıtla"/>
+ </form>
+ </notification>
+ <notification name="ConfirmCloseAll">
+ Tüm Anlık İletileri kapatmak istediğinize emin misiniz?
+ <usetemplate ignoretext="Tüm Anlık İletileri kapatmadan önce doğrulama iste." name="okcancelignore" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification name="AttachmentSaved">
+ Aksesuar kaydedildi.
+ </notification>
+ <notification name="UnableToFindHelpTopic">
+ Bu öğe için yardım başlığı bulunamıyor.
+ </notification>
+ <notification name="ObjectMediaFailure">
+ Sunucu Hatası: Ortam güncelleme ya da alma başarısız oldu.
+&apos;[ERROR]&apos;
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="TextChatIsMutedByModerator">
+ Yazılı sohbetiniz moderatör tarafından engellendi.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="VoiceIsMutedByModerator">
+ Sesli sohbetiniz moderatör tarafından engellendi.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="UploadCostConfirmation">
+ Bu karşıya yükleme işleminin maliyeti L$[PRICE] olacak, karşıya yüklemeye devam etmek istiyor musunuz?
+ <usetemplate name="okcancelbuttons" notext="İptal" yestext="Karşıya Yükle"/>
+ </notification>
+ <notification name="ConfirmClearTeleportHistory">
+ Işınlanma geçmişinizi silmek istediğinize emin misiniz?
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="BottomTrayButtonCanNotBeShown">
+ Seçilen düğme şu anda gösterilemiyor.
+Yeterli yer olduğunda düğme gösterilecek.
+ </notification>
+ <notification name="ShareNotification">
+ Paylaşılacak sakinleri seç.
+ </notification>
+ <notification name="MeshUploadError">
+ [LABEL] karşıya yüklenemedi: [MESSAGE] [IDENTIFIER]
+
+Ayrıntılar için günlük dosyasına bakın.
+ </notification>
+ <notification name="MeshUploadPermError">
+ Karşıya örgü yükleme izinleri talep edilirken hata oluştu.
+ </notification>
+ <notification name="RegionCapabilityRequestError">
+ Bölge özelliği &apos;[CAPABILITY]&apos; alınamadı.
+ </notification>
+ <notification name="ShareItemsConfirmation">
+ Aşağıdaki öğeleri paylaşmak istediğinize emin misiniz?
+
+&lt;nolink&gt;[ITEMS]&lt;/nolink&gt;
+
+Paylaşmanın yapılacağı Sakinler:
+
+[RESIDENTS]
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ShareFolderConfirmation">
+ Bir defada sadece bir klasör paylaşılabilir.
+
+Aşağıdaki öğeleri paylaşmak istediğinize emin misiniz?
+
+&lt;nolink&gt;[ITEMS]&lt;/nolink&gt;
+
+Paylaşmanın yapılacağı Second Life Sakinleri:
+
+[RESIDENTS]
+ <usetemplate name="okcancelbuttons" notext="Ä°ptal" yestext="Tamam"/>
+ </notification>
+ <notification name="ItemsShared">
+ Öğeler başarılı bir şekilde paylaşıldı.
+ </notification>
+ <notification name="DeedToGroupFail">
+ Gruba devretme başarısız oldu.
+ </notification>
+ <notification name="ReleaseLandThrottled">
+ [PARCEL_NAME] parseli ÅŸu anda terkedilemez.
+ </notification>
+ <notification name="ReleasedLandWithReclaim">
+ [AREA] m² alana sahip &apos;[PARCEL_NAME]&apos; parseli serbest bırakıldı.
+
+Başkalarına satışa çıkarılmadan önce L$0 karşılığında geri almak için [RECLAIM_PERIOD] saat süreniz olacak.
+ </notification>
+ <notification name="ReleasedLandNoReclaim">
+ [AREA] m² alana sahip &apos;[PARCEL_NAME]&apos; parseli serbest bırakıldı.
+
+Artık herkes tarafından satın alınabilir.
+ </notification>
+ <notification name="AvatarRezNotification">
+ ( [EXISTENCE] saniyedir hayatta )
+&apos;[NAME]&apos; adlı avatar [TIME] saniye sonra bulut şeklinden kurtuldu.
+ </notification>
+ <notification name="AvatarRezSelfBakedDoneNotification">
+ ( [EXISTENCE] saniyedir hayatta )
+Dış görünümünüzün kaydedilmesi [TIME] saniye sonra tamamlandı.
+ </notification>
+ <notification name="AvatarRezSelfBakedUpdateNotification">
+ ( [EXISTENCE] saniyedir hayatta )
+[TIME] saniye sonra görünümünüzün bir güncellemesini gönderdiniz.
+[STATUS]
+ </notification>
+ <notification name="AvatarRezCloudNotification">
+ ( [EXISTENCE] saniyedir hayatta )
+&apos;[NAME]&apos; adlı avatar bulut şekline döndü.
+ </notification>
+ <notification name="AvatarRezArrivedNotification">
+ ( [EXISTENCE] saniyedir hayatta )
+&apos;[NAME]&apos; adlı avatar göründü.
+ </notification>
+ <notification name="AvatarRezLeftCloudNotification">
+ ( [EXISTENCE] saniyedir hayatta )
+&apos;[NAME]&apos; adlı avatar bulut şeklinde [TIME] saniye göründükten sonra ayrıldı.
+ </notification>
+ <notification name="AvatarRezEnteredAppearanceNotification">
+ ( [EXISTENCE] saniyedir hayatta )
+&apos;[NAME]&apos; adlı avatar görünüm moduna girdi.
+ </notification>
+ <notification name="AvatarRezLeftAppearanceNotification">
+ ( [EXISTENCE] saniyedir hayatta )
+&apos;[NAME]&apos; adlı avatar görünüm modundan çıktı.
+ </notification>
+ <notification name="NoConnect">
+ [PROTOCOL] [HOSTID] kullanarak bağlantı kurma konusunda sorun yaşıyoruz.
+Lütfen ağ ve güvenlik duvarı ayarlarınızı kontrol edin.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="NoVoiceConnect">
+ Ses sunucunuz ile bağlantı kurma konusunda sorun yaşıyoruz.
+
+[HOSTID]
+
+Ses bağlantıları kullanılamayacak.
+Lütfen ağ ve güvenlik duvarı ayarlarınızı kontrol edin.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="AvatarRezLeftNotification">
+ ( [EXISTENCE] saniyedir hayatta )
+&apos;[NAME]&apos; adlı avatar tam olarak yüklenmiş bir şekilde ayrıldı.
+ </notification>
+ <notification name="AvatarRezSelfBakedTextureUploadNotification">
+ ( [EXISTENCE] saniyedir hayatta )
+ &apos;[BODYREGION]&apos; için [RESOLUTION] çözünürlükte kaydedilmiş bir dokuyu [TIME] saniye sonra karşıya yüklediniz.
+ </notification>
+ <notification name="AvatarRezSelfBakedTextureUpdateNotification">
+ ( [EXISTENCE] saniyedir hayatta )
+ &apos;[BODYREGION]&apos; için [RESOLUTION] çözünürlükte kaydedilmiş bir dokuyu [TIME] saniye sonra yerel olarak güncellediniz.
+ </notification>
+ <notification name="ConfirmLeaveCall">
+ Bu aramadan çıkmak istediğinize emin misiniz?
+ <usetemplate ignoretext="Aramadan çıkmadan önce doğrulama iste" name="okcancelignore" notext="Hayır" yestext="Evet"/>
+ </notification>
+ <notification name="ConfirmMuteAll">
+ Bir grup aramasındaki tüm katılımcıları engellemeyi seçtiniz.
+Bu, siz aramadan çıktıktan sonra bile, aramaya daha sonra katılacak tüm sakinlerin
+engellenmesine yol açacak.
+
+Herkes engellensin mi?
+ <usetemplate ignoretext="Bir grup aramasındaki tüm katılımcıları engellemeden önce doğrulama iste" name="okcancelignore" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <notification label="Sohbet" name="HintChat">
+ Sohbete katılmak için aşağıdaki sohbet alanına yazın.
+ </notification>
+ <notification label="AyaÄŸa Kalk" name="HintSit">
+ Ayağa kalkmak ve oturur konumdan çıkmak için Ayağa Kalk düğmesini tıklatın.
+ </notification>
+ <notification label="KonuÅŸ" name="HintSpeak">
+ Mikrofonunuzu açıp kapatmak için Konuş düğmesini tıklatın.
+
+Ses kontrol panelini görmek için yukarı ok tuşunu tıklatın.
+
+Konuş düğmesinin gizlenmesi ses özelliğini devre dışı bırakır.
+ </notification>
+ <notification label="Dünyayı Keşfet" name="HintDestinationGuide">
+ Hedef Kılavuzu, keşfedecek binlerce yeni yer barındırır. Bir konum seçin ve keşfetmeye başlamak için Işınla&apos;yı tıklatın.
+ </notification>
+ <notification label="Yan Panel" name="HintSidePanel">
+ Envanterinize, dış görünümünüze, profillerinize ve daha fazlasına hızlı erişim için yan paneli kullanın.
+ </notification>
+ <notification label="Hareket Et" name="HintMove">
+ Yürümek ya da koşmak için Hareket Panelini açın ve gezmek için yön oklarını tıklatın. Klavyenizdeki ok tuşlarını da kullanabilirsiniz.
+ </notification>
+ <notification label="" name="HintMoveClick">
+ 1. Yürümek için tıklayın
+Zemindeki herhangi bir noktaya gitmek için orayı tıklatın.
+
+2. Görünümü Döndürmek için Tıklatın ve Sürükleyin
+Görünümünüzü döndürmek için dünya üzerindeki herhangi bir yeri tıklatın ve sürükleyin.
+ </notification>
+ <notification label="Ekran Adı" name="HintDisplayName">
+ Özelleştirebileceğiniz ekran adını burada ayarlayın. Ekran Adı, benzersiz ve değiştirilemeyen kullanıcı adınıza ek olarak kullanılır. Diğer insanların adlarını nasıl gördüğünüzü tercihlerinizden değiştirebilirsiniz.
+ </notification>
+ <notification label="Görünüm" name="HintView">
+ Kamera görünümünüzü değiştirmek için Yörünge Değişimi ve Kamerayı Çevirme denetimlerini kullanın. Escape tuşuna basarak ya da yürüyerek görünümü sıfırlayın.
+ </notification>
+ <notification label="Envanter" name="HintInventory">
+ Öğeleri bulmak için envanterinize bakın. Yeni eklenen öğeler Son Eklenenler sekmesinden kolayca bulunabilir.
+ </notification>
+ <notification label="Linden Dolarınız var!" name="HintLindenDollar">
+ L$ hesabınızın mevcut bakiyesini buradan görebilirsiniz. Daha fazla Linden Doları satın almak için L$ Satın Al&apos;ı tıklatın.
+ </notification>
+ <notification name="LowMemory">
+ Bellek havuzunuz yetersiz. Çökmeyi önlemek için SL&apos;nin bazı işlevleri devre dışı bırakıldı. Lütfen diğer uygulamaları kapatın. Bu durum devam ederse SL&apos;yi yeniden başlatın.
+ </notification>
+ <notification name="ForceQuitDueToLowMemory">
+ Yetersiz bellek nedeniyle SL 30 saniye içerisinde kapanacak.
+ </notification>
+ <notification name="PopupAttempt">
+ Açılır bir pencerenin açılması engellendi.
+ <form name="form">
+ <ignore name="ignore" text="Tüm açılır pencerelere izin ver"/>
+ <button name="open" text="Açılır pencereyi aç"/>
+ </form>
+ </notification>
+ <notification name="SOCKS_NOT_PERMITTED">
+ SOCKS 5 proxy&apos;si &quot;[HOST]:[PORT]&quot; bağlantıyı reddetti; kural kümesi izin vermiyor.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="SOCKS_CONNECT_ERROR">
+ SOCKS 5 proxy&apos;si &quot;[HOST]:[PORT]&quot; bağlantıyı reddetti, TCP kanalını açamadı.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="SOCKS_NOT_ACCEPTABLE">
+ SOCKS 5 proxy&apos;si &quot;[HOST]:[PORT]&quot; seçilen kimlik doğrulama sistemini reddetti.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="SOCKS_AUTH_FAIL">
+ SOCKS 5 proxy&apos;si &quot;[HOST]:[PORT]&quot; kimlik bilgilerinizin geçersiz olduğunu bildirdi.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="SOCKS_UDP_FWD_NOT_GRANTED">
+ SOCKS 5 proxy&apos;si &quot;[HOST]:[PORT]&quot; UDP iliÅŸkilendirme talebini reddetti.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="SOCKS_HOST_CONNECT_FAILED">
+ SOCKS 5 proxy sunucusu &quot;[HOST]:[PORT]&quot; ile bağlantı kurulamadı.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="SOCKS_UNKNOWN_STATUS">
+ &quot;[HOST]:[PORT]&quot; sunucusu ile bilinmeyen proxy hatası.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="SOCKS_INVALID_HOST">
+ Geçersiz SOCKS proxy adresi veya &quot;[HOST]:[PORT]&quot; portu.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="SOCKS_BAD_CREDS">
+ Geçersiz SOCKS 5 kullanıcı adı veya parolası.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="PROXY_INVALID_HTTP_HOST">
+ Geçersiz HTTP proxy adresi veya &quot;[HOST]:[PORT]&quot; portu.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="PROXY_INVALID_SOCKS_HOST">
+ Geçersiz SOCKS proxy adresi veya &quot;[HOST]:[PORT]&quot; portu.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="ChangeProxySettings">
+ Proxy ayarları [APP_NAME] uygulamasını yeniden başlattıktan sonra geçerli olur.
+ <usetemplate name="okbutton" yestext="Tamam"/>
+ </notification>
+ <notification name="AuthRequest">
+ &apos;[REALM]&apos; erişim alanında &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos; üzerinde bulunan site bir kullanıcı adı ve parola gerektiriyor.
+ <form name="form">
+ <input name="username" text="Kullanıcı Adı"/>
+ <input name="password" text="Parola"/>
+ <button name="ok" text="Gönder"/>
+ <button name="cancel" text="Ä°ptal Et"/>
+ </form>
+ </notification>
+ <notification label="" name="NoClassifieds">
+ İlan oluşturma ve düzenleme sadece Gelişmiş modda kullanılabilir. Uygulamadan çıkıp, mod değiştirmek ister misiniz? Mod seçici oturum açma ekranında bulunabilir.
+ <usetemplate name="okcancelbuttons" notext="Çıkma" yestext="Çık"/>
+ </notification>
+ <notification label="" name="NoGroupInfo">
+ Grup oluşturma ve düzenleme sadece Gelişmiş modda kullanılabilir. Uygulamadan çıkıp, mod değiştirmek ister misiniz? Mod seçici oturum açma ekranında bulunabilir.
+ <usetemplate name="okcancelbuttons" notext="Çıkma" yestext="Çık"/>
+ </notification>
+ <notification label="" name="NoPlaceInfo">
+ Yer profili görüntülemesi sadece Gelişmiş modda kullanılabilir. Uygulamadan çıkıp, mod değiştirmek ister misiniz? Mod seçici oturum açma ekranında bulunabilir.
+ <usetemplate name="okcancelbuttons" notext="Çıkma" yestext="Çık"/>
+ </notification>
+ <notification label="" name="NoPicks">
+ Seçmeleri oluşturma ve düzenleme sadece Gelişmiş modda kullanılabilir. Uygulamadan çıkıp, mod değiştirmek ister misiniz? Mod seçici oturum açma ekranında bulunabilir.
+ <usetemplate name="okcancelbuttons" notext="Çıkma" yestext="Çık"/>
+ </notification>
+ <notification label="" name="NoWorldMap">
+ Dünya haritasının görüntülenmesi sadece Gelişmiş modda kullanılabilir. Uygulamadan çıkıp, mod değiştirmek ister misiniz? Mod seçici oturum açma ekranında bulunabilir.
+ <usetemplate name="okcancelbuttons" notext="Çıkma" yestext="Çık"/>
+ </notification>
+ <notification label="" name="NoVoiceCall">
+ Sesli aramalar sadece Gelişmiş modda kullanılabilir. Oturumunuzu kapatıp, mod değiştirmek ister misiniz?
+ <usetemplate name="okcancelbuttons" notext="Çıkma" yestext="Çık"/>
+ </notification>
+ <notification label="" name="NoAvatarShare">
+ Paylaşma sadece Gelişmiş modda kullanılabilir. Oturumunuzu kapatıp, mod değiştirmek ister misiniz?
+ <usetemplate name="okcancelbuttons" notext="Çıkma" yestext="Çık"/>
+ </notification>
+ <notification label="" name="NoAvatarPay">
+ Diğer sakinlere ödeme yapma sadece Gelişmiş modda kullanılabilir. Oturumunuzu kapatıp, mod değiştirmek ister misiniz?
+ <usetemplate name="okcancelbuttons" notext="Çıkma" yestext="Çık"/>
+ </notification>
+ <notification label="" name="NoInventory">
+ Envanter görüntülemesi sadece Gelişmiş modda kullanılabilir. Oturumunuzu kapatıp, mod değiştirmek ister misiniz?
+ <usetemplate name="okcancelbuttons" notext="Çıkma" yestext="Çık"/>
+ </notification>
+ <notification label="" name="NoAppearance">
+ Görünüm düzenleyici sadece Gelişmiş modda kullanılabilir. Oturumunuzu kapatıp, mod değiştirmek ister misiniz?
+ <usetemplate name="okcancelbuttons" notext="Çıkma" yestext="Çık"/>
+ </notification>
+ <notification label="" name="NoSearch">
+ Arama sadece Gelişmiş modda kullanılabilir. Oturumunuzu kapatıp, mod değiştirmek ister misiniz?
+ <usetemplate name="okcancelbuttons" notext="Çıkma" yestext="Çık"/>
+ </notification>
+ <notification label="" name="ConfirmHideUI">
+ Bu eylem tüm menü öğelerini ve düğmelerini gizler. Bunları geri almak için [SHORTCUT] üzerine tekrar tıklayın.
+ <usetemplate ignoretext="KA&apos;ni gizlemeden önce onayla" name="okcancelignore" notext="İptal" yestext="Tamam"/>
+ </notification>
+ <global name="UnsupportedGLRequirements">
+ [APP_NAME] uygulaması için gerekli donanım gereksinimlerine sahip olmadığınız görünüyor. [APP_NAME] çoklu doku desteği sunan bir OpenGL grafik kartı gerektiriyor. Eğer grafik kartınız bu özellikteyse, grafik kartınızın en son sürücülerine ve işletim sisteminiz için gerekli Service Pack ve yamalara sahip olup olmadığınızı kontrol etmeyi deneyebilirsiniz.
+
+Sorun yaşamaya devam ederseniz, lütfen [SUPPORT_SITE] bölümünü ziyaret edin.
+ </global>
+ <global name="UnsupportedCPUAmount">
+ 796
+ </global>
+ <global name="UnsupportedRAMAmount">
+ 510
+ </global>
+ <global name="UnsupportedGPU">
+ - Grafik kartınız minimum gereksinimleri karşılamıyor.
+ </global>
+ <global name="UnsupportedRAM">
+ - Sistem belleğiniz minimum gereksinimleri karşılamıyor.
+ </global>
+ <global name="You can only set your &apos;Home Location&apos; on your land or at a mainland Infohub.">
+ Bir arazi parçasına sahipseniz burayı ana konumunuz olarak ayarlayabilirsiniz.
+Bir araziye sahip değilseniz, Harita&apos;ya bakıp &quot;Bilgi İstasyonu&quot; olarak işaretlenen yerleri bulabilirsiniz.
+ </global>
+ <global name="You died and have been teleported to your home location">
+ Hayatınızı kaybettiniz ve ana konumunuza ışınlandınız.
+ </global>
+</notifications>
diff --git a/indra/newview/skins/default/xui/tr/panel_active_object_row.xml b/indra/newview/skins/default/xui/tr/panel_active_object_row.xml
new file mode 100644
index 0000000000..b03ce3ebe5
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_active_object_row.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_activeim_row">
+ <text name="object_name">
+ Ä°simsiz Nesne
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/tr/panel_adhoc_control_panel.xml
new file mode 100644
index 0000000000..602818de94
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_adhoc_control_panel.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+ <layout_stack name="vertical_stack">
+ <layout_panel name="call_btn_panel">
+ <button label="Ara" name="call_btn"/>
+ </layout_panel>
+ <layout_panel name="end_call_btn_panel">
+ <button label="Aramadan Ayrıl" name="end_call_btn"/>
+ </layout_panel>
+ <layout_panel name="voice_ctrls_btn_panel">
+ <button label="Ses Denetimleri" name="voice_ctrls_btn"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/tr/panel_avatar_list_item.xml
new file mode 100644
index 0000000000..7542778aca
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_avatar_list_item.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="avatar_list_item">
+ <string name="FormatSeconds">
+ [COUNT]sn
+ </string>
+ <string name="FormatMinutes">
+ [COUNT]dk
+ </string>
+ <string name="FormatHours">
+ [COUNT]sa
+ </string>
+ <string name="FormatDays">
+ [COUNT]gn
+ </string>
+ <string name="FormatWeeks">
+ [COUNT]hf
+ </string>
+ <string name="FormatMonths">
+ [COUNT]ay
+ </string>
+ <string name="FormatYears">
+ [COUNT]yl
+ </string>
+ <text name="avatar_name" value="(yükleniyor)"/>
+ <text name="last_interaction" value="0sn"/>
+ <icon name="permission_edit_theirs_icon" tool_tip="Bu arkadaşınızın nesnelerini düzenleyebilirsiniz"/>
+ <icon name="permission_edit_mine_icon" tool_tip="Bu arkadaşınız nesnelerinizi düzenleyebilir, silebilir veya alabilir"/>
+ <icon name="permission_map_icon" tool_tip="Bu arkadaşınız haritada sizi bulabilir"/>
+ <icon name="permission_online_icon" tool_tip="Bu arkadaşınız çevrimiçi olduğunuzda sizi görebilir"/>
+ <button name="profile_btn" tool_tip="Profili göster"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_avatar_tag.xml b/indra/newview/skins/default/xui/tr/panel_avatar_tag.xml
new file mode 100644
index 0000000000..81e04379a1
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_avatar_tag.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="avatar_tag_notification">
+ <panel name="msg_caption">
+ <text name="sender_tag_name">
+ Angela Tester
+ </text>
+ <text name="tag_time" value="23:30"/>
+ </panel>
+ <text_editor name="msg_text">
+ Hızlı kahverengi tilki tembel köpeğin üzerinden atlıyor.
+ </text_editor>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_block_list_sidetray.xml b/indra/newview/skins/default/xui/tr/panel_block_list_sidetray.xml
new file mode 100644
index 0000000000..0464b7ec07
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_block_list_sidetray.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="block_list_panel">
+ <text name="title_text">
+ Listeyi Engelle
+ </text>
+ <scroll_list name="blocked" tool_tip="Åžu anda engellenmiÅŸ olan Sakinler listesi"/>
+ <button label="Kişiyi engelle" name="Block resident..." tool_tip="Engellenecek bir Sakin seç"/>
+ <button label="Nesneyi ada göre engelle" name="Block object by name..." tool_tip="Ada göre engellenecek bir nesne seç"/>
+ <button label="Engellemeyi Kaldır" name="Unblock" tool_tip="Engelleme listesinden Sakini veya nesneyi kaldır"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_body_parts_list_item.xml b/indra/newview/skins/default/xui/tr/panel_body_parts_list_item.xml
new file mode 100644
index 0000000000..f991c3b688
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_body_parts_list_item.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="wearable_item">
+ <text name="item_name" value="..."/>
+ <panel name="btn_lock" tool_tip="Düzenleme izniniz yok"/>
+ <panel name="btn_edit_panel">
+ <button name="btn_edit" tool_tip="Bu şekli düzenle"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_bodyparts_list_button_bar.xml b/indra/newview/skins/default/xui/tr/panel_bodyparts_list_button_bar.xml
new file mode 100644
index 0000000000..6c2478cdb7
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_bodyparts_list_button_bar.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="clothing_list_button_bar_panel">
+ <button label="DeÄŸiÅŸtir" name="switch_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_bottomtray.xml b/indra/newview/skins/default/xui/tr/panel_bottomtray.xml
new file mode 100644
index 0000000000..26118d8b39
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_bottomtray.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="bottom_tray">
+ <string name="DragIndicationImageName" value="Accordion_ArrowOpened_Off"/>
+ <string name="SpeakBtnToolTip" value="Mikrofonu açar/kapatır"/>
+ <string name="VoiceControlBtnToolTip" value="Ses kontrol panelini gösterir/gizler"/>
+ <layout_stack name="toolbar_stack">
+ <layout_panel name="speak_panel">
+ <talk_button name="talk">
+ <speak_button label="KonuÅŸ" label_selected="KonuÅŸ" name="speak_btn"/>
+ </talk_button>
+ </layout_panel>
+ <layout_panel name="gesture_panel">
+ <gesture_combo_list label="Mimik" name="Gesture" tool_tip="Mimikleri gösterir/gizler"/>
+ </layout_panel>
+ <layout_panel name="movement_panel">
+ <bottomtray_button label="Hareket Et" name="movement_btn" tool_tip="Hareket kontrollerini gösterir/gizler"/>
+ </layout_panel>
+ <layout_panel name="cam_panel">
+ <bottomtray_button label="Görünüm" name="camera_btn" tool_tip="Kamera kontrollerini gösterir/gizler"/>
+ </layout_panel>
+ <layout_panel name="snapshot_panel">
+ <bottomtray_button name="snapshots" tool_tip="Anlık görüntü al"/>
+ </layout_panel>
+ <layout_panel name="build_btn_panel">
+ <bottomtray_button label="İnşa Et" name="build_btn" tool_tip="İnşa Et Aracını gösterir/gizler"/>
+ </layout_panel>
+ <layout_panel name="search_btn_panel">
+ <bottomtray_button label="Ara" name="search_btn" tool_tip="Aramayı gösterir/gizler"/>
+ </layout_panel>
+ <layout_panel name="world_map_btn_panel">
+ <bottomtray_button label="Harita" name="world_map_btn" tool_tip="Dünya Haritasını gösterir/gizler"/>
+ </layout_panel>
+ <layout_panel name="mini_map_btn_panel">
+ <bottomtray_button label="Mini-Harita" name="mini_map_btn" tool_tip="Mini Haritayı gösterir/gizler"/>
+ </layout_panel>
+ <layout_panel name="im_well_panel">
+ <chiclet_im_well name="im_well">
+ <button name="Unread IM messages" tool_tip="Sohbetler"/>
+ </chiclet_im_well>
+ </layout_panel>
+ <layout_panel name="notification_well_panel">
+ <chiclet_notification name="notification_well">
+ <button name="Unread" tool_tip="Bildirimler"/>
+ </chiclet_notification>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_bottomtray_lite.xml b/indra/newview/skins/default/xui/tr/panel_bottomtray_lite.xml
new file mode 100644
index 0000000000..5d7006af2f
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_bottomtray_lite.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="bottom_tray_lite">
+ <layout_stack name="toolbar_stack_lite">
+ <layout_panel name="gesture_panel">
+ <gesture_combo_list label="Mimik" name="Gesture" tool_tip="Mimikleri gösterir/gizler"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_chat_header.xml b/indra/newview/skins/default/xui/tr/panel_chat_header.xml
new file mode 100644
index 0000000000..7916bf5155
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_chat_header.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="im_header" name="im_header">
+ <text name="time_box" value="23:30"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_chiclet_bar.xml b/indra/newview/skins/default/xui/tr/panel_chiclet_bar.xml
new file mode 100644
index 0000000000..a1e8190bbc
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_chiclet_bar.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="chiclet_bar">
+ <layout_stack name="toolbar_stack">
+ <layout_panel name="im_well_panel">
+ <chiclet_im_well name="im_well">
+ <button name="Unread IM messages" tool_tip="Sohbetler"/>
+ </chiclet_im_well>
+ </layout_panel>
+ <layout_panel name="notification_well_panel">
+ <chiclet_notification name="notification_well">
+ <button name="Unread" tool_tip="Bildirimler"/>
+ </chiclet_notification>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_classified_info.xml b/indra/newview/skins/default/xui/tr/panel_classified_info.xml
new file mode 100644
index 0000000000..d412a03e32
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_classified_info.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_classified_info">
+ <panel.string name="type_mature">
+ Orta
+ </panel.string>
+ <panel.string name="type_pg">
+ Genel İçerik
+ </panel.string>
+ <panel.string name="l$_price">
+ L$[PRICE]
+ </panel.string>
+ <panel.string name="click_through_text_fmt">
+ [TELEPORT] ışınlama, [MAP] harita, [PROFILE] profil
+ </panel.string>
+ <panel.string name="date_fmt">
+ [mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt]
+ </panel.string>
+ <panel.string name="auto_renew_on">
+ Etkin
+ </panel.string>
+ <panel.string name="auto_renew_off">
+ Devre dışı
+ </panel.string>
+ <text name="title" value="Ä°lan Bilgisi"/>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text_editor name="classified_name" value="[ad]"/>
+ <text name="classified_location_label" value="Konum:"/>
+ <text_editor name="classified_location" value="[yükleniyor...]"/>
+ <text name="content_type_label" value="İçerik Türü:"/>
+ <text_editor name="content_type" value="[içerik türü]"/>
+ <text name="category_label" value="Kategori:"/>
+ <text_editor name="category" value="[kategori]"/>
+ <text name="creation_date_label" value="OluÅŸturma tarihi:"/>
+ <text_editor name="creation_date" tool_tip="OluÅŸturma tarihi" value="[tarih]"/>
+ <text name="price_for_listing_label" value="İlan ücreti:"/>
+ <text_editor name="price_for_listing" tool_tip="İlan ücreti." value="[ücret]"/>
+ <layout_stack name="descr_stack">
+ <layout_panel name="clickthrough_layout_panel">
+ <text name="click_through_label" value="Tıklamalar:"/>
+ <text_editor name="click_through_text" tool_tip="Tıklama verileri" value="[tıklamalar]"/>
+ </layout_panel>
+ <layout_panel name="price_layout_panel">
+ <text name="auto_renew_label" value="Otomatik yenileme:"/>
+ <text name="auto_renew" value="Etkin"/>
+ </layout_panel>
+ <layout_panel name="descr_layout_panel">
+ <text name="classified_desc_label" value="Açıklama:"/>
+ <text_editor name="classified_desc" value="[açıklama]"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </scroll_container>
+ <panel name="buttons">
+ <layout_stack name="layout_stack1">
+ <layout_panel name="layout_panel1">
+ <button label="Işınla" name="teleport_btn"/>
+ </layout_panel>
+ <layout_panel name="show_on_map_btn_lp">
+ <button label="Harita" name="show_on_map_btn"/>
+ </layout_panel>
+ <layout_panel name="edit_btn_lp">
+ <button label="Düzenle" name="edit_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_clothing_list_button_bar.xml b/indra/newview/skins/default/xui/tr/panel_clothing_list_button_bar.xml
new file mode 100644
index 0000000000..bb5930ee79
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_clothing_list_button_bar.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="clothing_list_button_bar_panel">
+ <button label="Ekle +" name="add_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_clothing_list_item.xml b/indra/newview/skins/default/xui/tr/panel_clothing_list_item.xml
new file mode 100644
index 0000000000..e60e291ee8
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_clothing_list_item.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="wearable_item">
+ <button name="btn_delete" tool_tip="Dış görünümden çıkar"/>
+ <text name="item_name" value="..."/>
+ <panel name="btn_lock" tool_tip="Düzenleme izniniz yok"/>
+ <panel name="btn_edit_panel">
+ <button name="btn_edit" tool_tip="Bu giyilebilir ögeyi düzenle"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_cof_wearables.xml b/indra/newview/skins/default/xui/tr/panel_cof_wearables.xml
new file mode 100644
index 0000000000..7d70177553
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_cof_wearables.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="cof_wearables">
+ <accordion name="cof_wearables_accordion">
+ <accordion_tab name="tab_clothing" title="Giysiler"/>
+ <accordion_tab name="tab_attachments" title="Aksesuarlar"/>
+ <accordion_tab name="tab_body_parts" title="Vücut Bölümleri"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_deletable_wearable_list_item.xml b/indra/newview/skins/default/xui/tr/panel_deletable_wearable_list_item.xml
new file mode 100644
index 0000000000..47703136b0
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_deletable_wearable_list_item.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="deletable_wearable_item">
+ <button name="btn_delete" tool_tip="Dış görünümden çıkar"/>
+ <text name="item_name" value="..."/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_dummy_clothing_list_item.xml b/indra/newview/skins/default/xui/tr/panel_dummy_clothing_list_item.xml
new file mode 100644
index 0000000000..28e034a357
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_dummy_clothing_list_item.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="dummy_clothing_item">
+ <text name="item_name" value="..."/>
+ <panel name="btn_add_panel">
+ <button name="btn_add" tool_tip="Bu türden ilave öğeler ekle"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_edit_alpha.xml b/indra/newview/skins/default/xui/tr/panel_edit_alpha.xml
new file mode 100644
index 0000000000..e3ba806b0d
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_edit_alpha.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_alpha_panel">
+ <scroll_container name="avatar_alpha_color_panel_scroll">
+ <panel name="avatar_alpha_color_panel">
+ <texture_picker label="Düşük Alfa" name="Lower Alpha" tool_tip="Bir resim seçmek için tıklayın"/>
+ <texture_picker label="Yüksek Alfa" name="Upper Alpha" tool_tip="Bir resim seçmek için tıklayın"/>
+ <texture_picker label="Baş Alfası" name="Head Alpha" tool_tip="Bir resim seçmek için tıklayın"/>
+ <texture_picker label="Göz Alfası" name="Eye Alpha" tool_tip="Bir resim seçmek için tıklayın"/>
+ <texture_picker label="Saç Alfası" name="Hair Alpha" tool_tip="Bir resim seçmek için tıklayın"/>
+ </panel>
+ </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_edit_classified.xml b/indra/newview/skins/default/xui/tr/panel_edit_classified.xml
new file mode 100644
index 0000000000..7584b754f1
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_edit_classified.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="İlanı Düzenle" name="panel_edit_classified">
+ <panel.string name="location_notice">
+ (kaydedildikten sonra güncelleştirilir)
+ </panel.string>
+ <string name="publish_label">
+ Yayınla
+ </string>
+ <string name="save_label">
+ Kaydet
+ </string>
+ <text name="title">
+ İlanı Düzenle
+ </text>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <panel name="snapshot_panel">
+ <icon label="" name="edit_icon" tool_tip="Bir görüntü seçmek için tıklayın"/>
+ </panel>
+ <text name="Name:">
+ Başlık:
+ </text>
+ <text name="description_label">
+ Açıklama:
+ </text>
+ <text name="location_label">
+ Konum:
+ </text>
+ <text name="classified_location">
+ yükleniyor...
+ </text>
+ <button label="Geçerli Konuma Ayarla" name="set_to_curr_location_btn"/>
+ <text name="category_label" value="Kategori:"/>
+ <text name="content_type_label" value="İçerik türü:"/>
+ <icons_combo_box label="Genel İçerik" name="content_type">
+ <icons_combo_box.item label="Orta Seviyede İçerik" name="mature_ci" value="Orta Seviyede"/>
+ <icons_combo_box.item label="Genel İçerik" name="pg_ci" value="PG"/>
+ </icons_combo_box>
+ <check_box label="Her hafta otomatik yenile" name="auto_renew"/>
+ <text name="price_for_listing_label" value="İlan ücreti:"/>
+ <spinner label="L$" name="price_for_listing" tool_tip="İlan ücreti." value="50"/>
+ </panel>
+ </scroll_container>
+ <panel label="bottom_panel" name="bottom_panel">
+ <layout_stack name="bottom_panel_ls">
+ <layout_panel name="save_changes_btn_lp">
+ <button label="[LABEL]" name="save_changes_btn"/>
+ </layout_panel>
+ <layout_panel name="show_on_map_btn_lp">
+ <button label="Ä°ptal" name="cancel_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_edit_eyes.xml b/indra/newview/skins/default/xui/tr/panel_edit_eyes.xml
new file mode 100644
index 0000000000..42f62b6bbe
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_edit_eyes.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_eyes_panel">
+ <panel name="avatar_eye_color_panel">
+ <texture_picker label="İris" name="Iris" tool_tip="Bir resim seçmek için tıklayın"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="eyes_main_tab" title="Gözler"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_edit_gloves.xml b/indra/newview/skins/default/xui/tr/panel_edit_gloves.xml
new file mode 100644
index 0000000000..be89e94bbf
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_edit_gloves.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_gloves_panel">
+ <panel name="avatar_gloves_color_panel">
+ <texture_picker label="Doku" name="Fabric" tool_tip="Bir resim seçmek için tıklayın"/>
+ <color_swatch label="Renk/Ton" name="Color/Tint" tool_tip="Renk seçiciyi açmak için tıklayın"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="gloves_main_tab" title="Eldivenler"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_edit_hair.xml b/indra/newview/skins/default/xui/tr/panel_edit_hair.xml
new file mode 100644
index 0000000000..f33a6d6402
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_edit_hair.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_hair_panel">
+ <panel name="avatar_hair_color_panel">
+ <texture_picker label="Doku" name="Texture" tool_tip="Bir resim seçmek için tıklayın"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="hair_color_tab" title="Renk"/>
+ <accordion_tab name="hair_style_tab" title="Stil"/>
+ <accordion_tab name="hair_eyebrows_tab" title="KaÅŸlar"/>
+ <accordion_tab name="hair_facial_tab" title="Yüz"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_edit_jacket.xml b/indra/newview/skins/default/xui/tr/panel_edit_jacket.xml
new file mode 100644
index 0000000000..10bc4278db
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_edit_jacket.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_jacket_panel">
+ <panel name="avatar_jacket_color_panel">
+ <texture_picker label="Üst Doku" name="Upper Fabric" tool_tip="Bir resim seçmek için tıklayın"/>
+ <texture_picker label="Alt Doku" name="Lower Fabric" tool_tip="Bir resim seçmek için tıklayın"/>
+ <color_swatch label="Renk/Ton" name="Color/Tint" tool_tip="Renk seçiciyi açmak için tıklayın"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="jacket_main_tab" title="Ceket"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_edit_pants.xml b/indra/newview/skins/default/xui/tr/panel_edit_pants.xml
new file mode 100644
index 0000000000..06e1b7b4ab
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_edit_pants.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_pants_panel">
+ <panel name="avatar_pants_color_panel">
+ <texture_picker label="Doku" name="Fabric" tool_tip="Bir resim seçmek için tıklayın"/>
+ <color_swatch label="Renk/Ton" name="Color/Tint" tool_tip="Renk seçiciyi açmak için tıklayın"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="pants_main_tab" title="Pantolon"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_edit_physics.xml b/indra/newview/skins/default/xui/tr/panel_edit_physics.xml
new file mode 100644
index 0000000000..98dbfd8e42
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_edit_physics.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_physics_panel">
+ <panel label="" name="accordion_panel">
+ <accordion name="physics_accordion">
+ <accordion_tab name="physics_breasts_updown_tab" title="Göğüs Hoplaması"/>
+ <accordion_tab name="physics_breasts_inout_tab" title="Göğüs Çatalı"/>
+ <accordion_tab name="physics_breasts_leftright_tab" title="Göğüs Sallanması"/>
+ <accordion_tab name="physics_belly_tab" title="Göbek Hoplaması"/>
+ <accordion_tab name="physics_butt_tab" title="Popo Hoplaması"/>
+ <accordion_tab name="physics_butt_leftright_tab" title="Popo Sallanması"/>
+ <accordion_tab name="physics_advanced_tab" title="GeliÅŸmiÅŸ Parametreler"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_edit_pick.xml b/indra/newview/skins/default/xui/tr/panel_edit_pick.xml
new file mode 100644
index 0000000000..98b02d27df
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_edit_pick.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Favori Düzenle" name="panel_edit_pick">
+ <panel.string name="location_notice">
+ (kaydedildikten sonra güncelleştirilir)
+ </panel.string>
+ <text name="title">
+ Seçme Düzenle
+ </text>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <icon label="" name="edit_icon" tool_tip="Bir görüntü seçmek için tıklayın"/>
+ <text name="Name:">
+ Başlık:
+ </text>
+ <text name="description_label">
+ Açıklama:
+ </text>
+ <text name="location_label">
+ Konum:
+ </text>
+ <text name="pick_location">
+ yükleniyor...
+ </text>
+ <button label="Geçerli Konuma Ayarla" name="set_to_curr_location_btn"/>
+ </panel>
+ </scroll_container>
+ <panel label="bottom_panel" name="bottom_panel">
+ <layout_stack name="layout_stack1">
+ <layout_panel name="layout_panel1">
+ <button label="Seçme Kaydet" name="save_changes_btn"/>
+ </layout_panel>
+ <layout_panel name="layout_panel2">
+ <button label="Ä°ptal" name="cancel_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_edit_profile.xml b/indra/newview/skins/default/xui/tr/panel_edit_profile.xml
new file mode 100644
index 0000000000..21f4e419bc
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_edit_profile.xml
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Profil Düzenlemesi" name="edit_profile_panel">
+ <string name="CaptionTextAcctInfo">
+ [ACCTTYPE]
+[PAYMENTINFO] [AGEVERIFICATION]
+ </string>
+ <string name="RegisterDateFormat">
+ [REG_DATE] ([AGE])
+ </string>
+ <string name="AcctTypeResident" value="Sakin"/>
+ <string name="AcctTypeTrial" value="Deneme"/>
+ <string name="AcctTypeCharterMember" value="Ayrıcalıklı Üye"/>
+ <string name="AcctTypeEmployee" value="Linden Lab Çalışanı"/>
+ <string name="PaymentInfoUsed" value="Kullanılan Ödeme Bilgisi"/>
+ <string name="PaymentInfoOnFile" value="Dosyadaki Ödeme Bilgisi"/>
+ <string name="NoPaymentInfoOnFile" value="Dosyada Ödeme Bilgisi Yok"/>
+ <string name="AgeVerified" value="Yaşı Doğrulanmış"/>
+ <string name="NotAgeVerified" value="Yaşı Doğrulanmamış"/>
+ <string name="partner_edit_link_url">
+ http://www.secondlife.com/account/partners.php?lang=en
+ </string>
+ <string name="my_account_link_url">
+ http://secondlife.com/my
+ </string>
+ <string name="no_partner_text" value="Hiçbiri"/>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <panel name="data_panel">
+ <text name="display_name_label" value="Ekran Adı:"/>
+ <text name="solo_username_label" value="Kullanıcı Adı:"/>
+ <button name="set_name" tool_tip="Ekran Adını Ayarla"/>
+ <text name="user_label" value="Kullanıcı Adı:"/>
+ <panel name="lifes_images_panel">
+ <panel name="second_life_image_panel">
+ <text name="second_life_photo_title_text" value="[SECOND_LIFE]:"/>
+ </panel>
+ <icon label="" name="2nd_life_edit_icon" tool_tip="Bir görüntü seçmek için tıklayın"/>
+ </panel>
+ <panel name="first_life_image_panel">
+ <text name="real_world_photo_title_text" value="Gerçek Dünya:"/>
+ </panel>
+ <icon label="" name="real_world_edit_icon" tool_tip="Bir görüntü seçmek için tıklayın"/>
+ <text name="title_homepage_text">
+ Ana sayfa:
+ </text>
+ <line_editor name="homepage_edit" value="http://"/>
+ <text name="title_acc_status_text" value="Hesabım:"/>
+ <text_editor name="acc_status_text" value="Sakin. Dosyada ödeme bilgisi yok."/>
+ <text name="my_account_link" value="[[URL] Kontrol Panelime Git]"/>
+ <text name="title_partner_text" value="Partnerim:"/>
+ <panel name="partner_data_panel">
+ <text initial_value="(alınıyor)" name="partner_text"/>
+ </panel>
+ <text name="partner_edit_link" value="[[URL] Düzenle]"/>
+ </panel>
+ </panel>
+ </scroll_container>
+ <panel name="profile_me_buttons_panel">
+ <layout_stack name="bottom_panel_ls">
+ <layout_panel name="save_changes_btn_lp">
+ <button label="DeÄŸiÅŸiklikleri Kaydet" name="save_btn"/>
+ </layout_panel>
+ <layout_panel name="show_on_map_btn_lp">
+ <button label="Ä°ptal" name="cancel_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_edit_shape.xml b/indra/newview/skins/default/xui/tr/panel_edit_shape.xml
new file mode 100644
index 0000000000..57cd9aca75
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_edit_shape.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_shape_panel">
+ <string name="meters">
+ Metre
+ </string>
+ <string name="feet">
+ Ayak
+ </string>
+ <string name="height">
+ Boy:
+ </string>
+ <panel label="Gömlek" name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shape_body_tab" title="Beden"/>
+ <accordion_tab name="shape_head_tab" title="BaÅŸ"/>
+ <accordion_tab name="shape_eyes_tab" title="Gözler"/>
+ <accordion_tab name="shape_ears_tab" title="Kulaklar"/>
+ <accordion_tab name="shape_nose_tab" title="Burun"/>
+ <accordion_tab name="shape_mouth_tab" title="Ağız"/>
+ <accordion_tab name="shape_chin_tab" title="Çene"/>
+ <accordion_tab name="shape_torso_tab" title="Gövde"/>
+ <accordion_tab name="shape_legs_tab" title="Bacaklar"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_edit_shirt.xml b/indra/newview/skins/default/xui/tr/panel_edit_shirt.xml
new file mode 100644
index 0000000000..2dd417afc6
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_edit_shirt.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_shirt_panel">
+ <panel name="avatar_shirt_color_panel">
+ <texture_picker label="Doku" name="Fabric" tool_tip="Bir resim seçmek için tıklayın"/>
+ <color_swatch label="Renk/Ton" name="Color/Tint" tool_tip="Renk seçiciyi açmak için tıklayın"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shirt_main_tab" title="Gömlek"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_edit_shoes.xml b/indra/newview/skins/default/xui/tr/panel_edit_shoes.xml
new file mode 100644
index 0000000000..34acb414b0
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_edit_shoes.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_shoes_panel">
+ <panel name="avatar_shoes_color_panel">
+ <texture_picker label="Doku" name="Fabric" tool_tip="Bir resim seçmek için tıklayın"/>
+ <color_swatch label="Renk/Ton" name="Color/Tint" tool_tip="Renk seçiciyi açmak için tıklayın"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shoes_main_tab" title="Ayakkabılar"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_edit_skin.xml b/indra/newview/skins/default/xui/tr/panel_edit_skin.xml
new file mode 100644
index 0000000000..fdf75100ed
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_edit_skin.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_skin_panel">
+ <panel name="avatar_skin_color_panel">
+ <texture_picker label="Baş" name="Head" tool_tip="Bir resim seçmek için tıklayın"/>
+ <texture_picker label="Üst gövde" name="Upper Body" tool_tip="Bir resim seçmek için tıklayın"/>
+ <texture_picker label="Alt gövde" name="Lower Body" tool_tip="Bir resim seçmek için tıklayın"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="skin_color_tab" title="Dış Katman Rengi"/>
+ <accordion_tab name="skin_face_tab" title="Yüz Ayrıntısı"/>
+ <accordion_tab name="skin_makeup_tab" title="Makyaj"/>
+ <accordion_tab name="skin_body_tab" title="Vücut Ayrıntısı"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_edit_skirt.xml b/indra/newview/skins/default/xui/tr/panel_edit_skirt.xml
new file mode 100644
index 0000000000..2099013fe1
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_edit_skirt.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_skirt_panel">
+ <panel name="avatar_skirt_color_panel">
+ <texture_picker label="Doku" name="Fabric" tool_tip="Bir resim seçmek için tıklayın"/>
+ <color_swatch label="Renk/Ton" name="Color/Tint" tool_tip="Renk seçiciyi açmak için tıklayın"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="skirt_main_tab" title="Etek"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_edit_socks.xml b/indra/newview/skins/default/xui/tr/panel_edit_socks.xml
new file mode 100644
index 0000000000..d386814d31
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_edit_socks.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_socks_panel">
+ <panel name="avatar_socks_color_panel">
+ <texture_picker label="Doku" name="Fabric" tool_tip="Bir resim seçmek için tıklayın"/>
+ <color_swatch label="Renk/Ton" name="Color/Tint" tool_tip="Renk seçiciyi açmak için tıklayın"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="socks_main_tab" title="Çoraplar"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_edit_tattoo.xml b/indra/newview/skins/default/xui/tr/panel_edit_tattoo.xml
new file mode 100644
index 0000000000..7f5590a485
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_edit_tattoo.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_tattoo_panel">
+ <panel name="avatar_tattoo_color_panel">
+ <texture_picker label="Baş Dövmesi" name="Head Tattoo" tool_tip="Bir resim seçmek için tıklayın"/>
+ <texture_picker label="Üst Gövde Dövmesi" name="Upper Tattoo" tool_tip="Bir resim seçmek için tıklayın"/>
+ <texture_picker label="Alt Gövde Dövmesi" name="Lower Tattoo" tool_tip="Bir resim seçmek için tıklayın"/>
+ <color_swatch label="Renk/Ton" name="Color/Tint" tool_tip="Renk seçiciyi açmak için tıklayın"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_edit_underpants.xml b/indra/newview/skins/default/xui/tr/panel_edit_underpants.xml
new file mode 100644
index 0000000000..ed003e1adf
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_edit_underpants.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_underpants_panel">
+ <panel name="avatar_underpants_color_panel">
+ <texture_picker label="Doku" name="Fabric" tool_tip="Bir resim seçmek için tıklayın"/>
+ <color_swatch label="Renk/Ton" name="Color/Tint" tool_tip="Renk seçiciyi açmak için tıklayın"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="underpants_main_tab" title="Külot"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_edit_undershirt.xml b/indra/newview/skins/default/xui/tr/panel_edit_undershirt.xml
new file mode 100644
index 0000000000..e0a0be8abb
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_edit_undershirt.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_undershirt_panel">
+ <panel name="avatar_undershirt_color_panel">
+ <texture_picker label="Doku" name="Fabric" tool_tip="Bir resim seçmek için tıklayın"/>
+ <color_swatch label="Renk/Ton" name="Color/Tint" tool_tip="Renk Seçiciyi açmak için tıklayın"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="undershirt_main_tab" title="Fanila"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_edit_wearable.xml b/indra/newview/skins/default/xui/tr/panel_edit_wearable.xml
new file mode 100644
index 0000000000..7a4a09aaed
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_edit_wearable.xml
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Giyilebilir" name="panel_edit_wearable">
+ <string name="edit_shape_title">
+ Şekil Düzenleniyor
+ </string>
+ <string name="edit_skin_title">
+ Dış Katman Düzenleniyor
+ </string>
+ <string name="edit_hair_title">
+ Saç Düzenleniyor
+ </string>
+ <string name="edit_eyes_title">
+ Gözler Düzenleniyor
+ </string>
+ <string name="edit_shirt_title">
+ Gömlek Düzenleniyor
+ </string>
+ <string name="edit_pants_title">
+ Pantolon Düzenleniyor
+ </string>
+ <string name="edit_shoes_title">
+ Ayakkabılar Düzenleniyor
+ </string>
+ <string name="edit_socks_title">
+ Çoraplar Düzenleniyor
+ </string>
+ <string name="edit_jacket_title">
+ Ceket Düzenleniyor
+ </string>
+ <string name="edit_skirt_title">
+ Etek Düzenleniyor
+ </string>
+ <string name="edit_gloves_title">
+ Eldivenler Düzenleniyor
+ </string>
+ <string name="edit_undershirt_title">
+ Fanila Düzenleniyor
+ </string>
+ <string name="edit_underpants_title">
+ Külot Düzenleniyor
+ </string>
+ <string name="edit_alpha_title">
+ Alfa Maskesi Düzenleniyor
+ </string>
+ <string name="edit_tattoo_title">
+ Dövme Düzenleniyor
+ </string>
+ <string name="edit_physics_title">
+ Fizik Düzenleniyor
+ </string>
+ <string name="shape_desc_text">
+ Åžekil:
+ </string>
+ <string name="skin_desc_text">
+ Dış Katman:
+ </string>
+ <string name="hair_desc_text">
+ Saç:
+ </string>
+ <string name="eyes_desc_text">
+ Gözler:
+ </string>
+ <string name="shirt_desc_text">
+ Gömlek:
+ </string>
+ <string name="pants_desc_text">
+ Pantolon:
+ </string>
+ <string name="shoes_desc_text">
+ Ayakkabılar:
+ </string>
+ <string name="socks_desc_text">
+ Çoraplar:
+ </string>
+ <string name="jacket_desc_text">
+ Ceket:
+ </string>
+ <string name="skirt_desc_text">
+ Etek:
+ </string>
+ <string name="gloves_desc_text">
+ Eldivenler:
+ </string>
+ <string name="undershirt_desc_text">
+ Fanila:
+ </string>
+ <string name="underpants_desc_text">
+ Külot:
+ </string>
+ <string name="alpha_desc_text">
+ Alfa Maskesi:
+ </string>
+ <string name="tattoo_desc_text">
+ Dövme:
+ </string>
+ <string name="physics_desc_text">
+ Fizik:
+ </string>
+ <labeled_back_button label="Kaydet" name="back_btn" tool_tip="Dış Görünümü Düzenlemeye Dön"/>
+ <text name="edit_wearable_title" value="Şekil Düzenleniyor"/>
+ <panel label="Gömlek" name="wearable_type_panel">
+ <text name="description_text" value="Åžekil:"/>
+ <radio_group name="sex_radio">
+ <radio_item label="" name="sex_male" tool_tip="Erkek" value="1"/>
+ <radio_item label="" name="sex_female" tool_tip="Kadın" value="0"/>
+ </radio_group>
+ <icon name="male_icon" tool_tip="Erkek"/>
+ <icon name="female_icon" tool_tip="Kadın"/>
+ </panel>
+ <panel name="button_panel">
+ <layout_stack name="button_panel_ls">
+ <layout_panel name="save_as_btn_lp">
+ <button label="Farklı Kaydet" name="save_as_button"/>
+ </layout_panel>
+ <layout_panel name="revert_btn_lp">
+ <button label="DeÄŸiÅŸiklikleri Geri Al" name="revert_button"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_group_control_panel.xml b/indra/newview/skins/default/xui/tr/panel_group_control_panel.xml
new file mode 100644
index 0000000000..58bb68a5c3
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_group_control_panel.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+ <layout_stack name="vertical_stack">
+ <layout_panel name="group_info_btn_panel">
+ <button label="Grup Profili" name="group_info_btn"/>
+ </layout_panel>
+ <layout_panel name="call_btn_panel">
+ <button label="Grubu Ara" name="call_btn"/>
+ </layout_panel>
+ <layout_panel name="end_call_btn_panel">
+ <button label="Aramadan Ayrıl" name="end_call_btn"/>
+ </layout_panel>
+ <layout_panel name="voice_ctrls_btn_panel">
+ <button label="Ses Denetimlerini Aç" name="voice_ctrls_btn"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_group_general.xml b/indra/newview/skins/default/xui/tr/panel_group_general.xml
new file mode 100644
index 0000000000..0462026249
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_group_general.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Genel" name="general_tab">
+ <panel.string name="help_text">
+ Genel sekmesinde bu grup hakkında genel bilgiler, üyelerin listesi, genel Grup Tercihleri ve üye seçenekleri yer alır.
+
+Daha fazla yardım edinmek için farenizi seçeneklerin üzerine getirin.
+ </panel.string>
+ <panel.string name="group_info_unchanged">
+ Genel grup bilgileri deÄŸiÅŸti
+ </panel.string>
+ <panel.string name="incomplete_member_data_str">
+ Üye verileri alınıyor
+ </panel.string>
+ <panel name="group_info_top">
+ <texture_picker label="" name="insignia" tool_tip="Bir resim seçmek için tıklayın"/>
+ <text name="prepend_founded_by">
+ Kurucu:
+ </text>
+ <text name="join_cost_text">
+ Ãœcretsiz
+ </text>
+ <button label="ŞİMDİ KATIL!" name="btn_join"/>
+ </panel>
+ <text_editor name="charter">
+ Grup Bildirgesi
+ </text_editor>
+ <name_list name="visible_members">
+ <name_list.columns label="Ãœye" name="name"/>
+ <name_list.columns label="Başlık" name="title"/>
+ <name_list.columns label="Durum" name="status"/>
+ </name_list>
+ <text name="my_group_settngs_label">
+ Ben
+ </text>
+ <text name="active_title_label">
+ Başlığım:
+ </text>
+ <combo_box name="active_title" tool_tip="Bu grup etkin olduğunda avatarınızın ad etiketinde görünecek başlığı belirler."/>
+ <check_box label="Grup bildirimleri al" name="receive_notices" tool_tip="Bu gruptan Bildirim almak isteyip istemediğinizi belirler. Bu grup size istemediğiniz bildirimler yolluyorsa bu kutudaki işareti kaldırın."/>
+ <check_box label="Profilimde göster" name="list_groups_in_profile" tool_tip="Bu grubu profilinizde göstermeyi isteyip istemediğinizi belirler"/>
+ <panel name="preferences_container">
+ <text name="group_settngs_label">
+ Grup
+ </text>
+ <check_box label="Herkes katılabilir" name="open_enrollement" tool_tip="Bu grubun davet edilmeden yeni üyelerin katılmasına imkan tanıyıp tanımayacağını belirler."/>
+ <check_box label="Katılma ücreti" name="check_enrollment_fee" tool_tip="Bu gruba katılmak için bir kayıt ücretinin gerekip gerekmeyeceğini belirler"/>
+ <spinner label="L$" name="spin_enrollment_fee" tool_tip="Kayıt Ücreti işaretlendiğinde yeni üyeler gruba katılmak için bu ücreti ödemelidir."/>
+ <combo_box name="group_mature_check" tool_tip="Grubunuzun Orta seviyede içeriğe sahip olup olmadığını belirler">
+ <combo_item name="select_mature">
+ - Erişkinlik seviyesini seçin -
+ </combo_item>
+ <combo_box.item label="Orta Seviyede İçerik" name="mature"/>
+ <combo_box.item label="Genel İçerik" name="pg"/>
+ </combo_box>
+ <check_box initial_value="true" label="Aramada göster" name="show_in_group_list" tool_tip="Kişiler arama sonuçlarında bu grubu görebilsin"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/tr/panel_group_info_sidetray.xml
new file mode 100644
index 0000000000..32f39da490
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_group_info_sidetray.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Grup Profili" name="GroupInfo">
+ <panel.string name="default_needs_apply_text">
+ KaydedilmemiÅŸ deÄŸiÅŸiklikler var
+ </panel.string>
+ <panel.string name="want_apply_text">
+ Bu deÄŸiÅŸiklikleri kaydetmek istiyor musunuz?
+ </panel.string>
+ <panel.string name="group_join_btn">
+ Katıl (L$[AMOUNT])
+ </panel.string>
+ <panel.string name="group_join_free">
+ Ãœcretsiz
+ </panel.string>
+ <panel name="group_info_top">
+ <text_editor name="group_name" value="(yükleniyor...)"/>
+ <line_editor label="Grup adınızı buraya girin" name="group_name_editor"/>
+ </panel>
+ <layout_stack name="layout">
+ <layout_panel name="group_accordions">
+ <accordion name="groups_accordion">
+ <accordion_tab name="group_general_tab" title="Genel"/>
+ <accordion_tab name="group_roles_tab" title="Roller"/>
+ <accordion_tab name="group_notices_tab" title="Bildirimler"/>
+ <accordion_tab name="group_land_tab" title="Arazi/Varlıklar"/>
+ </accordion>
+ </layout_panel>
+ </layout_stack>
+ <layout_stack name="button_row_ls">
+ <layout_panel name="btn_chat_lp">
+ <button label="Sohbet" name="btn_chat"/>
+ </layout_panel>
+ <layout_panel name="call_btn_lp">
+ <button label="Grup Araması" name="btn_call" tool_tip="Bu grubu ara"/>
+ </layout_panel>
+ <layout_panel name="btn_apply_lp">
+ <button label="Kaydet" label_selected="Kaydet" name="btn_apply"/>
+ <button label="Grup OluÅŸtur" name="btn_create" tool_tip="Yeni bir Grup oluÅŸtur"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_group_invite.xml b/indra/newview/skins/default/xui/tr/panel_group_invite.xml
new file mode 100644
index 0000000000..9b0c7f799a
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_group_invite.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Bir Ãœyeyi Davet Et" name="invite_panel">
+ <panel.string name="confirm_invite_owner_str">
+ Yeni sahipler davet etmek istediğinize emin misiniz? Bu eylem geri döndürülemez!
+ </panel.string>
+ <panel.string name="loading">
+ (yükleniyor...)
+ </panel.string>
+ <panel.string name="already_in_group">
+ Seçtiğiniz bazı Sakinler zaten grupta yer alıyor, bu yüzden bunlara davetiye gönderilmedi.
+ </panel.string>
+ <text name="help_text">
+ Grubunuza davet etmek için birden fazla Sakin seçebilirsiniz. Başlamak için &quot;Sakin Seçiciyi Aç&quot; üzerine tıklayın.
+ </text>
+ <button label="Sakin Seçiciyi Aç" name="add_button"/>
+ <name_list name="invitee_list" tool_tip="Ctrl tuşunu basılı tutun ve seçmek istediğiniz Sakinlerin adlarına tıklayın"/>
+ <button label="Seçilenleri Listeden Çıkar" name="remove_button" tool_tip="Yukarıda seçilen Sakinleri davet listesinden çıkarır"/>
+ <text name="role_text">
+ Onları hala Role atayacağınızı seçin:
+ </text>
+ <combo_box name="role_name" tool_tip="Üyeleri atamanıza izin verilen Roller listesinden seçin"/>
+ <button label="Davetiye Gönder" name="ok_button"/>
+ <button label="Ä°ptal" name="cancel_button"/>
+ <string name="GroupInvitation">
+ Grup Davetiyesi
+ </string>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_group_land_money.xml b/indra/newview/skins/default/xui/tr/panel_group_land_money.xml
new file mode 100644
index 0000000000..e9112a862b
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_group_land_money.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Arazi ve L$" name="land_money_tab">
+ <panel.string name="help_text">
+ Kullanılan Toplam Arazi, Toplam Katkı&apos;dan daha az veya buna eşit oluncaya kadar bir uyarı görünür.
+ </panel.string>
+ <panel.string name="cant_view_group_land_text">
+ Grupların sahip olduğu araziyi görme izniniz yok
+ </panel.string>
+ <panel.string name="epmty_view_group_land_text">
+ GiriÅŸ yok
+ </panel.string>
+ <panel.string name="cant_view_group_accounting_text">
+ Grubun muhasebe bilgilerini görme izniniz yok.
+ </panel.string>
+ <panel.string name="loading_txt">
+ Yükleniyor...
+ </panel.string>
+ <panel.string name="land_contrib_error">
+ Arazi katkınız ayarlanamıyor
+ </panel.string>
+ <panel name="layout_panel_landmoney">
+ <scroll_list name="group_parcel_list">
+ <scroll_list.columns label="Parsel" name="name"/>
+ <scroll_list.columns label="Bölge" name="location"/>
+ <scroll_list.columns label="Tür" name="type"/>
+ <scroll_list.columns label="Alan" name="area"/>
+ <scroll_list.columns label="Saklı" name="hidden"/>
+ </scroll_list>
+ <text name="total_contributed_land_label">
+ Toplam katkı:
+ </text>
+ <text name="total_contributed_land_value">
+ [AREA] m²
+ </text>
+ <button label="Harita" label_selected="Harita" name="map_button"/>
+ <text name="total_land_in_use_label">
+ Kullanılan toplam arazi:
+ </text>
+ <text name="total_land_in_use_value">
+ [AREA] m²
+ </text>
+ <text name="land_available_label">
+ Kullanılabilir arazi:
+ </text>
+ <text name="land_available_value">
+ [AREA] m²
+ </text>
+ <text name="your_contribution_label">
+ Katkınız:
+ </text>
+ <text name="your_contribution_units">
+ m²
+ </text>
+ <text name="your_contribution_max_value">
+ ([AMOUNT] maks)
+ </text>
+ <text name="group_over_limit_text">
+ Kullanılan alanı desteklemek için daha fazla arazi kredisi lazım
+ </text>
+ <text name="group_money_heading">
+ Grup L$
+ </text>
+ </panel>
+ <tab_container name="group_money_tab_container">
+ <panel label="PLANLAMA" name="group_money_planning_tab">
+ <text_editor name="group_money_planning_text">
+ Yükleniyor...
+ </text_editor>
+ </panel>
+ <panel label="AYRINTILAR" name="group_money_details_tab">
+ <text_editor name="group_money_details_text">
+ Yükleniyor...
+ </text_editor>
+ <button name="earlier_details_button" tool_tip="Geri"/>
+ <button name="later_details_button" tool_tip="Sonraki"/>
+ </panel>
+ <panel label="SATIÅžLAR" name="group_money_sales_tab">
+ <text_editor name="group_money_sales_text">
+ Yükleniyor...
+ </text_editor>
+ <button name="earlier_sales_button" tool_tip="Geri"/>
+ <button name="later_sales_button" tool_tip="Sonraki"/>
+ </panel>
+ </tab_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_group_list_item.xml b/indra/newview/skins/default/xui/tr/panel_group_list_item.xml
new file mode 100644
index 0000000000..2bc597f2fa
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_group_list_item.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="group_list_item">
+ <text name="group_name" value="Bilinmiyor"/>
+ <button name="profile_btn" tool_tip="Profili göster"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_group_notices.xml b/indra/newview/skins/default/xui/tr/panel_group_notices.xml
new file mode 100644
index 0000000000..179b5fff69
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_group_notices.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Bildirimler" name="notices_tab">
+ <panel.string name="help_text">
+ Bildirimler ile bir ileti ve opsiyonel olarak eklenmiş bir öğe gönderebilirsiniz.
+Bildirimler sadece Bildirim alma imkanına sahip olan Rollerdeki grup üyelerine gider.
+Genel sekmesinde Bildirimleri kapatabilirsiniz.
+ </panel.string>
+ <panel.string name="no_notices_text">
+ Eski bildirimler mevcut deÄŸil
+ </panel.string>
+ <text name="lbl2">
+ Bildirimler 14 gün boyunca saklanır.
+Günde grup başına maksimum sınır 200&apos;dür
+ </text>
+ <scroll_list name="notice_list">
+ <scroll_list.columns label="Konu" name="subject"/>
+ <scroll_list.columns label="Kimden" name="from"/>
+ <scroll_list.columns label="Tarih" name="date"/>
+ </scroll_list>
+ <text name="notice_list_none_found">
+ Bildirim yok
+ </text>
+ <button label="Yeni Bildirim" name="create_new_notice" tool_tip="Yeni bir bildirim oluÅŸtur"/>
+ <button name="refresh_notices" tool_tip="Bildirimler listesini yenile"/>
+ <panel label="Yeni Bildirim OluÅŸtur" name="panel_create_new_notice">
+ <text name="lbl">
+ Bildirim OluÅŸtur
+ </text>
+ <text name="lbl3">
+ Konu:
+ </text>
+ <text name="lbl4">
+ Ä°leti:
+ </text>
+ <text name="lbl5">
+ Ekle:
+ </text>
+ <text name="string">
+ Bir öğeyi eklemek için buraya sürükleyin ve bırakın:
+ </text>
+ <button label="Envanter" name="open_inventory" tool_tip="Envanteri Aç"/>
+ <button name="remove_attachment" tool_tip="Bildiriminizden aksesuarı kaldır"/>
+ <button label="Gönder" label_selected="Gönder" name="send_notice"/>
+ <group_drop_target name="drop_target" tool_tip="Bu bildirimle bir envanter öğesini göndermek için öğeyi bu hedef kutuya sürükleyin. Öğeyi eklemek için kopyalama ve aktarma iznine sahip olmalısınız."/>
+ </panel>
+ <panel label="Eski Bildirimi Göster" name="panel_view_past_notice">
+ <text name="lbl">
+ ArÅŸivlenmiÅŸ Bildirim
+ </text>
+ <text name="lbl2">
+ Yeni bir bildirim göndermek için + düğmesine tıklayın
+ </text>
+ <text name="lbl3">
+ Konu:
+ </text>
+ <text name="lbl4">
+ Ä°leti:
+ </text>
+ <button label="Aksesuarı Aç" name="open_attachment"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_group_notify.xml b/indra/newview/skins/default/xui/tr/panel_group_notify.xml
new file mode 100644
index 0000000000..bcc5482daa
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_group_notify.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="instant_message" name="panel_group_notify">
+ <string name="message_max_lines_count" value="7"/>
+ <string name="subject_font" value="SANSSERIF_BIG"/>
+ <string name="date_font" value="SANSSERIF"/>
+ <panel label="başlık" name="header">
+ <text name="title" value="Gönderici Adı / Grup Adı"/>
+ </panel>
+ <text_editor name="message" value="ileti"/>
+ <text name="attachment" value="Aksesuar"/>
+ <button label="Tamam" name="btn_ok"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_group_roles.xml b/indra/newview/skins/default/xui/tr/panel_group_roles.xml
new file mode 100644
index 0000000000..fb03107da8
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_group_roles.xml
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Ãœyeler ve Roller" name="roles_tab">
+ <panel.string name="default_needs_apply_text">
+ KaydedilmemiÅŸ deÄŸiÅŸiklikler var
+ </panel.string>
+ <panel.string name="want_apply_text">
+ DeÄŸiÅŸikliklerinizi kaydetmek istiyor musunuz?
+ </panel.string>
+ <tab_container name="roles_tab_container">
+ <panel label="ÃœYELER" name="members_sub_tab" tool_tip="Ãœyeler">
+ <panel.string name="help_text">
+ Üyelere atanmış Rolleri ekleyebilir veya kaldırabilirsiniz.
+Ctrl tuşuna basıp adlarına tıklayarak birden fazla Üye seçebilirsiniz.
+ </panel.string>
+ <panel.string name="donation_area">
+ [AREA] m²
+ </panel.string>
+ <filter_editor label="Ãœyeleri Filtrele" name="filter_input"/>
+ <name_list name="member_list">
+ <name_list.columns label="Ãœye" name="name"/>
+ <name_list.columns label="Bağış" name="donated"/>
+ <name_list.columns label="Durum" name="online"/>
+ </name_list>
+ <button label="Davet Et" name="member_invite"/>
+ <button label="Çıkar" name="member_eject"/>
+ </panel>
+ <panel label="ROLLER" name="roles_sub_tab">
+ <panel.string name="help_text">
+ Roller, birer başlığa ve Üyelerin gerçekleştirmesine izin verilen Yetenekler listesine sahiptir.
+ Bir Üye bir veya daha fazla sayıda Role ait olabilir.
+ Bir grupta 10&apos;a kadar Rol olabilir, buna Herkes ve Sahip Rolü de dahildir.
+ </panel.string>
+ <panel.string name="cant_delete_role">
+ &apos;Herkes&apos; ve &apos;Sahipler&apos; Rolleri özeldir, silinemez.
+ </panel.string>
+ <filter_editor label="Rolleri Filtrele" name="filter_input"/>
+ <scroll_list name="role_list">
+ <scroll_list.columns label="Rol" name="name"/>
+ <scroll_list.columns label="Başlık" name="title"/>
+ <scroll_list.columns label="#" name="members"/>
+ </scroll_list>
+ <button label="Yeni Rol" name="role_create"/>
+ <button label="Rolü Sil" name="role_delete"/>
+ </panel>
+ <panel label="YETENEKLER" name="actions_sub_tab" tool_tip="Bir Yeteneğin Açıklamasını ve bu Yeteneğe hangi Rollerin ve Üyelerin sahip olabileceğini görebilirsiniz.">
+ <panel.string name="help_text">
+ Yetenekler sayesinde Rollerle ilişkili Üyeler bu grup içerisinde belirli şeyler yapabilir.
+ Yeteneklerin kapsamı oldukça geniştir.
+ </panel.string>
+ <filter_editor label="Yetenekleri Filtrele" name="filter_input"/>
+ <scroll_list name="action_list" tool_tip="Bir Yeteneği seçerek daha çok ayrıntı görebilirsiniz"/>
+ </panel>
+ </tab_container>
+ <panel name="members_footer">
+ <text name="static">
+ Atanmış Roller
+ </text>
+ <text name="static2">
+ Ä°zin Verilen Yetenekler
+ </text>
+ <scroll_list name="member_allowed_actions" tool_tip="İzin verilen her bir yeteneğin ayrıntıları için yetenekler sekmesine bakın"/>
+ </panel>
+ <panel name="roles_footer">
+ <text name="static">
+ Rol Adı
+ </text>
+ <text name="static3">
+ Rol Başlığı
+ </text>
+ <text name="static2">
+ Açıklama
+ </text>
+ <text name="static4">
+ Atanmış Üyeler
+ </text>
+ <check_box label="Üyeleri göster" name="role_visible_in_list" tool_tip="Bu rolün üyelerinin, Genel sekmesinde grup dışındaki kişilere görünüp görünmeyeceğini ayarlar."/>
+ <text name="static5">
+ Ä°zin Verilen Yetenekler
+ </text>
+ <scroll_list name="role_allowed_actions" tool_tip="İzin verilen her bir yeteneğin ayrıntıları için yetenekler sekmesine bakın"/>
+ </panel>
+ <panel name="actions_footer">
+ <text_editor name="action_description">
+ Bu Yetenek &apos;Bu Gruptan Üye Çıkarma&apos;dır. Bir Sahibi sadece başka bir Sahip çıkartabilir.
+ </text_editor>
+ <text name="static2">
+ Bu yeteneÄŸe sahip Roller
+ </text>
+ <text name="static3">
+ Bu yeteneÄŸe sahip Ãœyeler
+ </text>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_im_control_panel.xml b/indra/newview/skins/default/xui/tr/panel_im_control_panel.xml
new file mode 100644
index 0000000000..aebdc6b48d
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_im_control_panel.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+ <layout_stack name="button_stack">
+ <layout_panel name="view_profile_btn_panel">
+ <button label="Profil" name="view_profile_btn"/>
+ </layout_panel>
+ <layout_panel name="add_friend_btn_panel">
+ <button label="ArkadaÅŸ Ekle" name="add_friend_btn"/>
+ </layout_panel>
+ <layout_panel name="teleport_btn_panel">
+ <button label="Işınla" name="teleport_btn" tool_tip="Bu kişiyi ışınlamayı teklif et"/>
+ </layout_panel>
+ <layout_panel name="share_btn_panel">
+ <button label="PaylaÅŸ" name="share_btn"/>
+ </layout_panel>
+ <layout_panel name="pay_btn_panel">
+ <button label="Öde" name="pay_btn"/>
+ </layout_panel>
+ <layout_panel name="call_btn_panel">
+ <button label="Ara" name="call_btn"/>
+ </layout_panel>
+ <layout_panel name="end_call_btn_panel">
+ <button label="Aramayı Bitir" name="end_call_btn"/>
+ </layout_panel>
+ <layout_panel name="voice_ctrls_btn_panel">
+ <button label="Ses Denetimleri" name="voice_ctrls_btn"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_instant_message.xml b/indra/newview/skins/default/xui/tr/panel_instant_message.xml
new file mode 100644
index 0000000000..cf9bc7fccb
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_instant_message.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="im_panel" name="im_panel">
+ <string name="message_max_lines_count">
+ 6
+ </string>
+ <panel label="im_header" name="im_header">
+ <text name="time_box" value="23:30"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_inventory_item.xml b/indra/newview/skins/default/xui/tr/panel_inventory_item.xml
new file mode 100644
index 0000000000..d18047fbcf
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_inventory_item.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="inventory_item">
+ <text name="item_name" value="..."/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_landmark_info.xml b/indra/newview/skins/default/xui/tr/panel_landmark_info.xml
new file mode 100644
index 0000000000..2cad753f25
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_landmark_info.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="landmark_info">
+ <string name="title_create_landmark" value="Yer Ä°mi OluÅŸtur"/>
+ <string name="title_edit_landmark" value="Yer İmini Düzenle"/>
+ <string name="title_landmark" value="Yer Ä°mi"/>
+ <string name="not_available" value="(G/D)"/>
+ <string name="unknown" value="(bilinmiyor)"/>
+ <string name="public" value="(kamuya açık)"/>
+ <string name="server_update_text">
+ Sunucu güncelleştirmesi olmadan yer bilgisi mevcut olmaz.
+ </string>
+ <string name="server_error_text">
+ Bu konum hakkında şu anda bilgi mevcut değil, lütfen daha sonra tekrar deneyin.
+ </string>
+ <string name="server_forbidden_text">
+ Erişim kısıtlamaları nedeniyle bu konum hakkında bilgiye erişilemiyor. Lütfen parsel sahibi nezdinde izinlerinizi kontrol edin.
+ </string>
+ <string name="acquired_date">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </string>
+ <button name="back_btn" tool_tip="Geri"/>
+ <text name="title" value="Profili YerleÅŸtir"/>
+ <scroll_container name="place_scroll">
+ <panel name="scrolling_panel">
+ <text name="region_title" value="Örnek Bölge"/>
+ <text name="parcel_title" value="Örnek Parsel, Uzun Ad (145, 228, 26)"/>
+ <expandable_text name="description" value="Du waltz die spritz"/>
+ <text name="maturity_value" value="bilinmiyor"/>
+ <panel name="landmark_info_panel">
+ <text name="owner_label" value="Sahip:"/>
+ <text name="creator_label" value="OluÅŸturan:"/>
+ <text name="created_label" value="OluÅŸturuldu:"/>
+ </panel>
+ <panel name="landmark_edit_panel">
+ <text name="title_label" value="Başlık:"/>
+ <text name="notes_label" value="Notlarım:"/>
+ <text name="folder_label" value="Yer imi konumu:"/>
+ </panel>
+ </panel>
+ </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_landmarks.xml b/indra/newview/skins/default/xui/tr/panel_landmarks.xml
new file mode 100644
index 0000000000..d40d0c1543
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_landmarks.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="Landmarks">
+ <accordion name="landmarks_accordion">
+ <accordion_tab name="tab_favorites" title="Favoriler çubuğu"/>
+ <accordion_tab name="tab_landmarks" title="Yer Ä°mlerim"/>
+ <accordion_tab name="tab_inventory" title="Envanterim"/>
+ <accordion_tab name="tab_library" title="Kütüphane"/>
+ </accordion>
+ <panel name="bottom_panel">
+ <layout_stack name="bottom_panel">
+ <layout_panel name="options_gear_btn_panel">
+ <menu_button name="options_gear_btn" tool_tip="İlave seçenekleri göster"/>
+ </layout_panel>
+ <layout_panel name="add_btn_panel">
+ <button name="add_btn" tool_tip="Yeni yer imi ekle"/>
+ </layout_panel>
+ <layout_panel name="trash_btn_panel">
+ <dnd_button name="trash_btn" tool_tip="Seçilen yer imini sil"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_login.xml b/indra/newview/skins/default/xui/tr/panel_login.xml
new file mode 100644
index 0000000000..acd6aa1921
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_login.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_login">
+ <panel.string name="create_account_url">
+ http://join.secondlife.com/
+ </panel.string>
+ <panel.string name="forgot_password_url">
+ http://secondlife.com/account/request.php
+ </panel.string>
+ <layout_stack name="login_widgets">
+ <layout_panel name="login">
+ <text name="username_text">
+ Kullanıcı Adı:
+ </text>
+ <combo_box name="username_combo" tool_tip="Kaydolduğunuzda seçtiğiniz kullanıcı adı, örn. mustafayalcin12 veya Faruk Gungoren"/>
+ <text name="password_text">
+ Parola:
+ </text>
+ <check_box label="Parolayı hatırla" name="remember_check"/>
+ <button label="Oturum Aç" name="connect_btn"/>
+ <text name="mode_selection_text">
+ Mod:
+ </text>
+ <combo_box name="mode_combo" tool_tip="Modunuzu seçin. Hızlı, kolay keşif yapmak ve sohbet için Temel seçimini yapın. Daha fazla özelliğe erişmek için Gelişmiş seçimini yapın.">
+ <combo_box.item label="Temel" name="Basic"/>
+ <combo_box.item label="GeliÅŸmiÅŸ" name="Advanced"/>
+ </combo_box>
+ <text name="start_location_text">
+ Buradan baÅŸla:
+ </text>
+ <combo_box name="start_location_combo">
+ <combo_box.item label="Son konumum" name="MyLastLocation"/>
+ <combo_box.item label="Ana Konumum" name="MyHome"/>
+ <combo_box.item label="&lt;Bölge adını girin&gt;" name="Typeregionname"/>
+ </combo_box>
+ </layout_panel>
+ <layout_panel name="links">
+ <text name="create_new_account_text">
+ Kaydolun
+ </text>
+ <text name="forgot_password_text">
+ Kullanıcı adınızı veya parolanızı mı unuttunuz?
+ </text>
+ <text name="login_help">
+ Oturum açarken yardım mı gerekiyor?
+ </text>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_main_inventory.xml b/indra/newview/skins/default/xui/tr/panel_main_inventory.xml
new file mode 100644
index 0000000000..c69fb39130
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_main_inventory.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="EÅŸyalar" name="main inventory panel">
+ <panel.string name="ItemcountFetching">
+ [ITEM_COUNT] Öge Alınıyor... [FILTER]
+ </panel.string>
+ <panel.string name="ItemcountCompleted">
+ [ITEM_COUNT] Öge [FILTER]
+ </panel.string>
+ <text name="ItemcountText">
+ Ögeler:
+ </text>
+ <filter_editor label="Envanteri Filtrele" name="inventory search editor"/>
+ <tab_container name="inventory filter tabs">
+ <inventory_panel label="ENVANTERÄ°M" name="All Items"/>
+ <recent_inventory_panel label="SON" name="Recent Items"/>
+ </tab_container>
+ <layout_stack name="bottom_panel">
+ <layout_panel name="options_gear_btn_panel">
+ <menu_button name="options_gear_btn" tool_tip="İlave seçenekleri göster"/>
+ </layout_panel>
+ <layout_panel name="add_btn_panel">
+ <button name="add_btn" tool_tip="Yeni öge ekle"/>
+ </layout_panel>
+ <layout_panel name="trash_btn_panel">
+ <dnd_button name="trash_btn" tool_tip="Seçilen öğeyi sil"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_me.xml b/indra/newview/skins/default/xui/tr/panel_me.xml
new file mode 100644
index 0000000000..4b911c9ce6
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_me.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Profilim" name="panel_me">
+ <panel label="SEÇMELERİM" name="panel_picks"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_media_settings_general.xml b/indra/newview/skins/default/xui/tr/panel_media_settings_general.xml
new file mode 100644
index 0000000000..89e78b75de
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_media_settings_general.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Genel" name="Media Settings General">
+ <text name="home_label">
+ Ana Sayfa:
+ </text>
+ <text name="home_fails_whitelist_label">
+ (Bu sayfa belirtilen izin verilenler listesinden geçmez)
+ </text>
+ <line_editor name="home_url" tool_tip="Bu ortam kaynağının ana sayfası"/>
+ <text name="preview_label">
+ Önizleme
+ </text>
+ <text name="current_url_label">
+ Mevcut Sayfa:
+ </text>
+ <text name="current_url" tool_tip="Bu ortam kaynağının şu anki sayfası" value=""/>
+ <button label="Sıfırla" name="current_url_reset_btn"/>
+ <check_box initial_value="false" label="Otomatik Tekrarla" name="auto_loop"/>
+ <check_box initial_value="false" label="İlk Tıklama Etkileşimleri" name="first_click_interact"/>
+ <check_box initial_value="false" label="Otomatik Zumla" name="auto_zoom"/>
+ <check_box initial_value="false" label="Ortamı Otomatik Oynat" name="auto_play"/>
+ <text name="media_setting_note">
+ Not: Sakinler bu ayarı geçersiz kılabilir
+ </text>
+ <check_box initial_value="false" label="Nesne Yüzünde Ortamı Otomatik Ölçekle" name="auto_scale"/>
+ <text name="size_label">
+ Büyüklük:
+ </text>
+ <text name="X_label">
+ X
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_media_settings_permissions.xml b/indra/newview/skins/default/xui/tr/panel_media_settings_permissions.xml
new file mode 100644
index 0000000000..6c0b14a889
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_media_settings_permissions.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Özelleştir" name="Media settings for controls">
+ <text name="controls_label">
+ Denetimler:
+ </text>
+ <combo_box name="controls">
+ <combo_item name="Standard">
+ Standart
+ </combo_item>
+ <combo_item name="Mini">
+ Mini
+ </combo_item>
+ </combo_box>
+ <text name="owner_label">
+ Sahip
+ </text>
+ <check_box initial_value="false" label="Gezinme ve EtkileÅŸime Ä°zin Ver" name="perms_owner_interact"/>
+ <check_box initial_value="false" label="Denetim Çubuğunu Göster" name="perms_owner_control"/>
+ <text name="group_label">
+ Grup:
+ </text>
+ <check_box initial_value="false" label="Gezinme ve EtkileÅŸime Ä°zin Ver" name="perms_group_interact"/>
+ <check_box initial_value="false" label="Denetim Çubuğunu Göster" name="perms_group_control"/>
+ <text name="anyone_label">
+ Herkes
+ </text>
+ <check_box initial_value="false" label="Gezinme ve EtkileÅŸime Ä°zin Ver" name="perms_anyone_interact"/>
+ <check_box initial_value="false" label="Denetim Çubuğunu Göster" name="perms_anyone_control"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_media_settings_security.xml b/indra/newview/skins/default/xui/tr/panel_media_settings_security.xml
new file mode 100644
index 0000000000..da3ca1bd29
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_media_settings_security.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Güvenlik" name="Media Settings Security">
+ <check_box initial_value="false" label="Sadece Belirlenen URL Desenlerine EriÅŸime Ä°zin Ver" name="whitelist_enable"/>
+ <text name="home_url_fails_some_items_in_whitelist">
+ Ana sayfanın başarısız olduğu girişler işaretli:
+ </text>
+ <button label="Ekle" name="whitelist_add"/>
+ <button label="Sil" name="whitelist_del"/>
+ <text name="home_url_fails_whitelist">
+ Uyarı: Genel sekmesinde belirtilen ana sayfa bu beyaz listede yer almıyor. Geçerli bir giriş ekleninceye kadar devre dışı bırakıldı.
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_navigation_bar.xml b/indra/newview/skins/default/xui/tr/panel_navigation_bar.xml
new file mode 100644
index 0000000000..8d43e3fb5a
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_navigation_bar.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="navigation_bar">
+ <layout_stack name="nvp_stack">
+ <layout_panel name="navigation_layout_panel">
+ <panel name="navigation_panel">
+ <pull_button name="back_btn" tool_tip="Önceki konuma geri git"/>
+ <pull_button name="forward_btn" tool_tip="Bir konum ileri git"/>
+ <button name="home_btn" tool_tip="Ana konumuma ışınla"/>
+ <location_input label="Konum" name="location_combo"/>
+ </panel>
+ </layout_panel>
+ <layout_panel name="favorites_layout_panel">
+ <favorites_bar name="favorite" tool_tip="Second Life içerisinde sık kullandığınız yerlere hızla erişmek için Yer İmlerini buraya sürükleyin!">
+ <label name="favorites_bar_label" tool_tip="Second Life içerisinde sık kullandığınız yerlere hızla erişmek için Yer İmlerini buraya sürükleyin!">
+ Favoriler Çubuğu
+ </label>
+ <more_button name="&gt;&gt;" tool_tip="Favorilerimden daha çok göster">
+ Daha Fazla â–¼
+ </more_button>
+ </favorites_bar>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_nearby_chat.xml b/indra/newview/skins/default/xui/tr/panel_nearby_chat.xml
new file mode 100644
index 0000000000..d238388b0e
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_nearby_chat.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="nearby_chat">
+ <layout_stack name="stack">
+ <layout_panel name="translate_chat_checkbox_lp">
+ <check_box label="Sohbeti çevir" name="translate_chat_checkbox"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/tr/panel_nearby_chat_bar.xml
new file mode 100644
index 0000000000..fd954475ac
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_nearby_chat_bar.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="chat_bar">
+ <line_editor label="Sohbet etmek için buraya tıklayın." name="chat_box" tool_tip="Söylemek için Enter, bağırmak için Ctrl+Enter yapın"/>
+ <button name="show_nearby_chat" tool_tip="yakın sohbet günlüğünü gösterir/gizler"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_nearby_media.xml b/indra/newview/skins/default/xui/tr/panel_nearby_media.xml
new file mode 100644
index 0000000000..a654b2ac14
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_nearby_media.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="nearby_media">
+ <string name="media_item_count_format">
+ (%d ortamı ögesi)
+ </string>
+ <string name="empty_item_text">
+ &lt;boÅŸ&gt;
+ </string>
+ <string name="parcel_media_name">
+ Parsel Akış Ortamı
+ </string>
+ <string name="parcel_audio_name">
+ Parsel Akış Sesi
+ </string>
+ <string name="playing_suffix">
+ (oynatılıyor)
+ </string>
+ <panel name="minimized_controls">
+ <button label="Tümünü Durdur" name="all_nearby_media_disable_btn" tool_tip="Tüm yakın ortamları kapat"/>
+ <button label="Tümünü Başlat" name="all_nearby_media_enable_btn" tool_tip="Tüm yakın ortamları aç"/>
+ <button name="open_prefs_btn" tool_tip="Ortam tercihlerini getirir"/>
+ <button label="Daha Fazla &gt;&gt;" label_selected="&lt;&lt; Daha Az" name="more_btn" tool_tip="GeliÅŸmiÅŸ Kontroller"/>
+ </panel>
+ <panel name="nearby_media_panel">
+ <text name="nearby_media_title">
+ Yakındaki Ortamlar
+ </text>
+ <text name="show_text">
+ Göster :
+ </text>
+ <combo_box name="show_combo">
+ <combo_box.item label="Tümü" name="All"/>
+ <combo_box.item label="Bu Parseldeki" name="WithinParcel"/>
+ <combo_box.item label="Bu Parselin Dışında" name="OutsideParcel"/>
+ <combo_box.item label="DiÄŸer Avatarlarda" name="OnOthers"/>
+ </combo_box>
+ <scroll_list name="media_list">
+ <scroll_list.columns label="Yakınlık" name="media_proximity"/>
+ <scroll_list.columns label="Görünür" name="media_visibility"/>
+ <scroll_list.columns label="Sınıf" name="media_class"/>
+ <scroll_list.columns label="Ad" name="media_name"/>
+ <scroll_list.columns label="Hata ayıkla" name="media_debug"/>
+ </scroll_list>
+ <panel name="media_controls_panel">
+ <layout_stack name="media_controls">
+ <layout_panel name="stop">
+ <button name="stop_btn" tool_tip="Seçilen ortamı durdur"/>
+ </layout_panel>
+ <layout_panel name="play">
+ <button name="play_btn" tool_tip="Seçilen ortamı oynat"/>
+ </layout_panel>
+ <layout_panel name="pause">
+ <button name="pause_btn" tool_tip="Seçilen ortamı duraklat"/>
+ </layout_panel>
+ <layout_panel name="volume_slider_ctrl">
+ <slider_bar initial_value="0.5" name="volume_slider" tool_tip="Seçilen ortamı için ses düzeyi"/>
+ </layout_panel>
+ <layout_panel name="mute">
+ <button name="mute_btn" tool_tip="Seçilen ortamda ses sustur"/>
+ </layout_panel>
+ <layout_panel name="zoom">
+ <button name="zoom_btn" tool_tip="Seçilen ortama yakınlaştır"/>
+ </layout_panel>
+ <layout_panel name="unzoom">
+ <button name="unzoom_btn" tool_tip="Seçilen ortamdan uzaklaştır"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_notify_textbox.xml b/indra/newview/skins/default/xui/tr/panel_notify_textbox.xml
new file mode 100644
index 0000000000..b893da2a71
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_notify_textbox.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="instant_message" name="panel_notify_textbox">
+ <string name="message_max_lines_count" value="7"/>
+ <panel label="info_panel" name="info_panel">
+ <text_editor name="message" value="ileti"/>
+ </panel>
+ <panel label="control_panel" name="control_panel">
+ <button label="Gönder" name="btn_submit"/>
+ <button label="Yok say" name="ignore_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_online_status_toast.xml b/indra/newview/skins/default/xui/tr/panel_online_status_toast.xml
new file mode 100644
index 0000000000..fdc489f375
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_online_status_toast.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="friend_online_status" name="friend_online_status"/>
diff --git a/indra/newview/skins/default/xui/tr/panel_outbox_inventory.xml b/indra/newview/skins/default/xui/tr/panel_outbox_inventory.xml
new file mode 100644
index 0000000000..a947eee150
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_outbox_inventory.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<outbox_inventory_panel name="inventory_outbox" tool_tip="Öğeleri vitrininizde satışa hazırlamak için sürükleyip buraya bırakın"/>
diff --git a/indra/newview/skins/default/xui/tr/panel_outfit_edit.xml b/indra/newview/skins/default/xui/tr/panel_outfit_edit.xml
new file mode 100644
index 0000000000..00cd49abcd
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_outfit_edit.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Side tray Outfit Edit panel -->
+<panel name="outfit_edit">
+ <string name="No Outfit" value="Dış Görünüm Yok"/>
+ <string name="unsaved_changes" value="KaydedilmemiÅŸ DeÄŸiÅŸiklikler"/>
+ <string name="now_editing" value="Şimdi Düzenleniyor"/>
+ <panel.string name="not_available">
+ (G/D)
+ </panel.string>
+ <panel.string name="unknown">
+ (bilinmiyor)
+ </panel.string>
+ <string name="Filter.All" value="Tümü"/>
+ <string name="Filter.Clothes/Body" value="Giysiler/Gövde"/>
+ <string name="Filter.Objects" value="Nesneler"/>
+ <string name="Filter.Clothing" value="Giysiler"/>
+ <string name="Filter.Bodyparts" value="Vücut bölümleri"/>
+ <string name="replace_body_part" value="Mevcut şeklinizi değiştirmek için tıklayın"/>
+ <text name="title" value="Dış Görünümü Düzenle"/>
+ <panel name="header_panel">
+ <panel name="outfit_name_and_status">
+ <text name="status" value="Şimdi düzenleniyor..."/>
+ <text name="curr_outfit_name" value="[Mevcut Dış Görünüm]"/>
+ </panel>
+ </panel>
+ <layout_stack name="im_panels">
+ <layout_panel name="outfit_wearables_panel">
+ <layout_stack name="filter_panels">
+ <layout_panel name="add_button_and_combobox">
+ <button label="Daha Fazla Ekle..." name="show_add_wearables_btn" tool_tip="Aç/Kapa"/>
+ </layout_panel>
+ <layout_panel name="filter_panel">
+ <filter_editor label="Giyilebilirler Envanterini Filtrele" name="look_item_filter"/>
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+ <layout_panel name="add_wearables_panel">
+ <button label="Ögeyi Giy" name="plus_btn"/>
+ </layout_panel>
+ </layout_stack>
+ <panel name="no_add_wearables_button_bar">
+ <button name="shop_btn_1" tool_tip="SL Pazarını Ziyaret Et. Ayrıca giymekte olduğunuz bir şeyi de seçebilir ve buraya tıklayarak benzer şeylere bakabilirsiniz"/>
+ </panel>
+ <panel name="add_wearables_button_bar">
+ <button name="shop_btn_2" tool_tip="SL Pazarını Ziyaret Et. Ayrıca giymekte olduğunuz bir şeyi de seçebilir ve buraya tıklayarak benzer şeylere bakabilirsiniz"/>
+ </panel>
+ <panel name="save_revert_button_bar">
+ <layout_stack name="button_bar_ls">
+ <layout_panel name="save_btn_lp">
+ <button label="Kaydet" name="save_btn"/>
+ </layout_panel>
+ <layout_panel name="revert_btn_lp">
+ <button label="Değişiklikleri Geri Al" name="revert_btn" tool_tip="Son kaydedilen versiyona dön"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/tr/panel_outfits_inventory.xml
new file mode 100644
index 0000000000..550f7ebf10
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_outfits_inventory.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="EÅŸyalar" name="Outfits">
+ <panel.string name="wear_outfit_tooltip">
+ Seçilen dış görünümü giy
+ </panel.string>
+ <panel.string name="wear_items_tooltip">
+ Seçilen öğeleri giy
+ </panel.string>
+ <tab_container name="appearance_tabs">
+ <panel label="DIŞ GÖRÜNÜMLERİM" name="outfitslist_tab"/>
+ <panel label="GÄ°YÄ°LEN" name="cof_tab"/>
+ </tab_container>
+ <panel name="bottom_panel">
+ <layout_stack name="bottom_panel_ls">
+ <layout_panel name="save_btn_lp">
+ <button label="Farklı Kaydet" name="save_btn"/>
+ </layout_panel>
+ <layout_panel name="wear_btn_lp">
+ <button label="Giy" name="wear_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_outfits_inventory_gear_default.xml b/indra/newview/skins/default/xui/tr/panel_outfits_inventory_gear_default.xml
new file mode 100644
index 0000000000..d222f1a6e3
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_outfits_inventory_gear_default.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_gear_default">
+ <menu_item_call label="Mevcut Dış Görünümü Değiştir" name="wear"/>
+ <menu_item_call label="Mevcut Dış Görünümden Kaldır" name="remove"/>
+ <menu_item_call label="Yeniden Adlandır" name="rename"/>
+ <menu_item_call label="Bağlantıyı Kaldır" name="remove_link"/>
+ <menu_item_call label="Dış Görünümü Sil" name="delete"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/tr/panel_outfits_list.xml b/indra/newview/skins/default/xui/tr/panel_outfits_list.xml
new file mode 100644
index 0000000000..60a3576d84
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_outfits_list.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="Outfits">
+ <accordion name="outfits_accordion">
+ <no_matched_tabs_text name="no_matched_outfits_msg" value="Aradığınızı bulamadınız mı? [secondlife:///app/search/all/[SEARCH_TERM] Arama] yapmayı deneyin."/>
+ <no_visible_tabs_text name="no_outfits_msg" value="Henüz herhangi bir dış görünümünüz yok. Try [secondlife:///app/search/all/ Arama] yapmayı deneyin"/>
+ </accordion>
+ <panel name="bottom_panel">
+ <menu_button name="options_gear_btn" tool_tip="İlave seçenekleri göster"/>
+ <button name="trash_btn" tool_tip="Seçili dış görünümü sil"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_outfits_wearing.xml b/indra/newview/skins/default/xui/tr/panel_outfits_wearing.xml
new file mode 100644
index 0000000000..462926738f
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_outfits_wearing.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="Wearing">
+ <panel name="bottom_panel">
+ <menu_button name="options_gear_btn" tool_tip="İlave seçenekleri göster"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_people.xml b/indra/newview/skins/default/xui/tr/panel_people.xml
new file mode 100644
index 0000000000..1a1e53bac2
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_people.xml
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Side tray panel -->
+<panel label="KiÅŸiler" name="people_panel">
+ <string name="no_recent_people" value="Yakın zamanlı kişi yok. Birlikte takılacak kişiler mi arıyorsunuz? [secondlife:///app/search/people Arayı] veya [secondlife:///app/worldmap Dünya Haritasını] deneyin."/>
+ <string name="no_filtered_recent_people" value="Aradığınızı bulamadınız mı? [secondlife:///app/search/people/[SEARCH_TERM] Ara] deneyin."/>
+ <string name="no_one_near" value="Yakında kimse yok. Birlikte takılacak kişiler mi arıyorsunuz? [secondlife:///app/search/people Arayın] veya [secondlife:///app/worldmap Dünya Haritasını] deneyin."/>
+ <string name="no_one_filtered_near" value="Aradığınızı bulamadınız mı? [secondlife:///app/search/people/[SEARCH_TERM] Ara] deneyin."/>
+ <string name="no_friends_online" value="Çevrimiçi arkadaş yok"/>
+ <string name="no_friends" value="ArkadaÅŸ yok"/>
+ <string name="no_friends_msg">
+ [secondlife:///app/search/people Ara] kullanarak arkadaş bulun veya arkadaş olarak eklemek için bir Sakin üzerine sağ tıklayın.
+Birlikte takılacak kişiler mi arıyorsunuz? [secondlife:///app/worldmap Dünya Haritasını] deneyin.
+ </string>
+ <string name="no_filtered_friends_msg">
+ Aradığınızı bulamadınız mı? [secondlife:///app/search/people/[SEARCH_TERM] Ara] deneyin.
+ </string>
+ <string name="people_filter_label" value="KiÅŸileri Filtrele"/>
+ <string name="groups_filter_label" value="Grupları Filtrele"/>
+ <string name="no_filtered_groups_msg" value="Aradığınızı bulamadınız mı? [secondlife:///app/search/groups/[SEARCH_TERM] Ara] deneyin."/>
+ <string name="no_groups_msg" value="Katılacak Gruplar mı arıyorsunuz? [secondlife:///app/search/groups Ara] deneyin."/>
+ <string name="MiniMapToolTipMsg" value="[REGION](Haritayı açmak için çift tıkla, yatay hareket için shift çek)"/>
+ <string name="AltMiniMapToolTipMsg" value="[REGION](Işınlamak için çift tıkla, yatay hareket için shift çek)"/>
+ <filter_editor label="Filtrele" name="filter_input"/>
+ <tab_container name="tabs">
+ <panel label="YAKIN" name="nearby_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <menu_button name="nearby_view_sort_btn" tool_tip="Seçenklr."/>
+ <button name="add_friend_btn" tool_tip="Seçilen Sakini arkadaş listene ekle"/>
+ </panel>
+ </panel>
+ <panel label="ARKADAÅžLARIM" name="friends_panel">
+ <accordion name="friends_accordion">
+ <accordion_tab name="tab_online" title="Çevrimiçi"/>
+ <accordion_tab name="tab_all" title="Tümü"/>
+ </accordion>
+ <panel label="bottom_panel" name="bottom_panel">
+ <layout_stack name="bottom_panel">
+ <layout_panel name="options_gear_btn_panel">
+ <menu_button name="friends_viewsort_btn" tool_tip="İlave seçenekleri göster"/>
+ </layout_panel>
+ <layout_panel name="add_btn_panel">
+ <button name="add_btn" tool_tip="Bir Sakine arkadaşlık öner"/>
+ </layout_panel>
+ <layout_panel name="trash_btn_panel">
+ <dnd_button name="del_btn" tool_tip="Seçilen kişiyi arkadaş Listenden çıkar"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </panel>
+ <panel label="GRUPLARIM" name="groups_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <menu_button name="groups_viewsort_btn" tool_tip="Seçenklr."/>
+ <button name="plus_btn" tool_tip="Gruba katıl/yeni grup oluştur"/>
+ <button name="activate_btn" tool_tip="Seçilen grubu etkinleştir"/>
+ </panel>
+ </panel>
+ <panel label="SON" name="recent_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <menu_button name="recent_viewsort_btn" tool_tip="Seçenklr."/>
+ <button name="add_friend_btn" tool_tip="Seçilen Sakini arkadaş listene ekle"/>
+ </panel>
+ </panel>
+ </tab_container>
+ <panel name="button_bar">
+ <layout_stack name="bottom_bar_ls">
+ <layout_panel name="view_profile_btn_lp">
+ <button label="Profil" name="view_profile_btn" tool_tip="Resim, grup ve diğer Sakin bilgilerini göster"/>
+ </layout_panel>
+ <layout_panel name="im_btn_lp">
+ <button label="Aİ" name="im_btn" tool_tip="Anlık ileti oturumu aç"/>
+ </layout_panel>
+ <layout_panel name="call_btn_lp">
+ <button label="Ara" name="call_btn" tool_tip="Bu Sakini ara"/>
+ </layout_panel>
+ <layout_panel name="share_btn_lp">
+ <button label="Paylaş" name="share_btn" tool_tip="Bir envanter öğesini paylaş"/>
+ </layout_panel>
+ <layout_panel name="teleport_btn_lp">
+ <button label="Işınla" name="teleport_btn" tool_tip="Işınlama teklif et"/>
+ </layout_panel>
+ </layout_stack>
+ <layout_stack name="bottom_bar_ls1">
+ <layout_panel name="group_info_btn_lp">
+ <button label="Grup Profili" name="group_info_btn" tool_tip="Grup bilgilerini göster"/>
+ </layout_panel>
+ <layout_panel name="chat_btn_lp">
+ <button label="Grup Sohbeti" name="chat_btn" tool_tip="Sohbet oturumu aç"/>
+ </layout_panel>
+ <layout_panel name="group_call_btn_lp">
+ <button label="Grup Araması" name="group_call_btn" tool_tip="Bu grubu ara"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_pick_info.xml b/indra/newview/skins/default/xui/tr/panel_pick_info.xml
new file mode 100644
index 0000000000..f2bbfac232
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_pick_info.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_pick_info">
+ <text name="title" value="Seçme Bilgileri"/>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text_editor name="pick_name" value="[ad]"/>
+ <text_editor name="pick_location" value="[yükleniyor...]"/>
+ <text_editor name="pick_desc" value="[açıklama]"/>
+ </panel>
+ </scroll_container>
+ <panel name="buttons">
+ <layout_stack name="layout_stack1">
+ <layout_panel name="layout_panel1">
+ <button label="Işınla" name="teleport_btn"/>
+ </layout_panel>
+ <layout_panel name="show_on_map_btn_lp">
+ <button label="Harita" name="show_on_map_btn"/>
+ </layout_panel>
+ <layout_panel name="edit_btn_lp">
+ <button label="Düzenle" name="edit_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_picks.xml b/indra/newview/skins/default/xui/tr/panel_picks.xml
new file mode 100644
index 0000000000..26beac7854
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_picks.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Favorilerim" name="panel_picks">
+ <string name="no_picks" value="Seçme Yok"/>
+ <string name="no_classifieds" value="Ä°lan Yok"/>
+ <accordion name="accordion">
+ <accordion_tab name="tab_picks" title="Seçmelerim"/>
+ <accordion_tab name="tab_classifieds" title="Ä°lanlar"/>
+ </accordion>
+ <panel label="bottom_panel" name="edit_panel">
+ <layout_stack name="edit_panel_ls">
+ <layout_panel name="gear_menu_btn">
+ <button name="new_btn" tool_tip="Mevcut konumda yeni bir seçme veya ilan oluşturun"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ <panel name="buttons_cucks">
+ <layout_stack name="buttons_cucks_ls">
+ <layout_panel name="info_btn_lp">
+ <button label="Bilgi" name="info_btn" tool_tip="Seçme bilgilerini göster"/>
+ </layout_panel>
+ <layout_panel name="teleport_btn_lp">
+ <button label="Işınla" name="teleport_btn" tool_tip="İlişkili alana ışınlanın"/>
+ </layout_panel>
+ <layout_panel name="show_on_map_btn_lp">
+ <button label="Harita" name="show_on_map_btn" tool_tip="İlişkili alanı Dünya Haritasında göster"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_place_profile.xml b/indra/newview/skins/default/xui/tr/panel_place_profile.xml
new file mode 100644
index 0000000000..f42cde0ace
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_place_profile.xml
@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="place_profile">
+ <string name="on" value="Açık"/>
+ <string name="off" value="Kapalı"/>
+ <string name="anyone" value="Herkes"/>
+ <string name="available" value="kullanılabilir"/>
+ <string name="allocated" value="tahsis edilen"/>
+ <string name="title_place" value="Profili YerleÅŸtir"/>
+ <string name="title_teleport_history" value="Işınlanma Geçmişi"/>
+ <string name="not_available" value="(G/D)"/>
+ <string name="unknown" value="(bilinmiyor)"/>
+ <string name="public" value="(kamuya açık)"/>
+ <string name="none_text" value="(hiçbiri)"/>
+ <string name="sale_pending_text" value="(Satış Bekliyor)"/>
+ <string name="group_owned_text" value="(Sahibi Olunan Grup)"/>
+ <string name="price_text" value="L$"/>
+ <string name="area_text" value="m²"/>
+ <string name="all_residents_text" value="Tüm Second Life Sakinleri"/>
+ <string name="group_text" value="Grup"/>
+ <string name="can_resell">
+ Bu bölgede satın alınan arazi tekrar satılabilir.
+ </string>
+ <string name="can_not_resell">
+ Bu bölgede satın alınan arazi tekrar satılamayabilir.
+ </string>
+ <string name="can_change">
+ Bu bölgede satın alınan arazi birleştirilebilir veya bölünebilir.
+ </string>
+ <string name="can_not_change">
+ Bu bölgede satın alınan arazi birleştirilemeyebilir veya bölünemeyebilir.
+ </string>
+ <string name="server_update_text">
+ Sunucu güncelleştirmesi olmadan yer bilgisi mevcut olmaz.
+ </string>
+ <string name="server_error_text">
+ Bu konum hakkında şu anda bilgi mevcut değil, lütfen daha sonra tekrar deneyin.
+ </string>
+ <string name="server_forbidden_text">
+ Erişim kısıtlamaları nedeniyle bu konum hakkında bilgiye erişilemiyor. Lütfen parsel sahibi nezdinde izinlerinizi kontrol edin.
+ </string>
+ <string name="acquired_date">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </string>
+ <button name="back_btn" tool_tip="Geri"/>
+ <text name="title" value="Profili YerleÅŸtir"/>
+ <scroll_container name="place_scroll">
+ <panel name="scrolling_panel">
+ <text name="region_title" value="Örnek Bölge"/>
+ <text name="parcel_title" value="Örnek Parsel, Uzun Ad (145, 228, 26)"/>
+ <expandable_text name="description" value="Du waltz die spritz"/>
+ <text name="owner_label" value="Sahip:"/>
+ <text name="owner_value" value="Alex Superduperlongenamenton"/>
+ <text name="maturity_value" value="bilinmiyor"/>
+ <accordion name="advanced_info_accordion">
+ <accordion_tab name="parcel_characteristics_tab" title="Parsel">
+ <panel name="parcel_characteristics_panel">
+ <text name="rating_label" value="Seviye:"/>
+ <text name="rating_value" value="bilinmiyor"/>
+ <text name="voice_label" value="Sesli:"/>
+ <text name="voice_value" value="Açık"/>
+ <text name="fly_label" value="Uçma:"/>
+ <text name="fly_value" value="Açık"/>
+ <text name="push_label" value="Ä°tme:"/>
+ <text name="push_value" value="Kapalı"/>
+ <text name="build_label" value="Ä°nÅŸa Et:"/>
+ <text name="build_value" value="Açık"/>
+ <text name="scripts_label" value="Komut Dosyaları:"/>
+ <text name="scripts_value" value="Açık"/>
+ <text name="damage_label" value="Hasar:"/>
+ <text name="damage_value" value="Kapalı"/>
+ <text name="see_avatars_label" value="Avatarları Gör:"/>
+ <text name="see_avatars_value" value="Kapalı"/>
+ <button label="Arazi Hakkında" name="about_land_btn"/>
+ </panel>
+ </accordion_tab>
+ <accordion_tab name="region_information_tab" title="Bölge">
+ <panel name="region_information_panel">
+ <text name="region_name_label" value="Bölge:"/>
+ <text name="region_name" value="Geyik arazisi"/>
+ <text name="region_type_label" value="Tür:"/>
+ <text name="region_type" value="Geyik"/>
+ <text name="region_rating_label" value="Seviye:"/>
+ <text name="region_rating" value="YetiÅŸkin"/>
+ <text name="region_owner_label" value="Sahip:"/>
+ <text name="region_owner" value="geyik Can Geyik ekstra uzun ad geyik"/>
+ <text name="region_group_label" value="Grup:"/>
+ <text name="region_group">
+ Geyik Şehrinin Güçlü Geyiği soundvillemoose
+ </text>
+ <button label="Bölge/Gayrimenkul" name="region_info_btn"/>
+ </panel>
+ </accordion_tab>
+ <accordion_tab name="estate_information_tab" title="Gayrimenkul">
+ <panel name="estate_information_panel">
+ <text name="estate_name_label" value="Gayrimenkul:"/>
+ <text name="estate_rating_label" value="Seviye:"/>
+ <text name="estate_owner_label" value="Sahip:"/>
+ <text name="estate_owner" value="Sahip adının uzunluğu uzun adla deneniyor"/>
+ <text name="covenant_label" value="Sözleşme:"/>
+ </panel>
+ </accordion_tab>
+ <accordion_tab name="sales_tab" title="Satılık">
+ <panel name="sales_panel">
+ <text name="sales_price_label" value="Fiyat:"/>
+ <text name="area_label" value="Alan:"/>
+ <text name="traffic_label" value="Trafik:"/>
+ <text name="primitives_label" value="Temel öğeler:"/>
+ <text name="parcel_scripts_label" value="Komut Dosyaları:"/>
+ <text name="terraform_limits_label" value="Yer ÅŸekillendirme limitleri:"/>
+ <text name="subdivide_label" value="Bölme/Katma yeteneği:"/>
+ <text name="resale_label" value="Tekrar Satış yeteneği:"/>
+ <text name="sale_to_label" value="Şu Alıcıya Satılık:"/>
+ </panel>
+ </accordion_tab>
+ </accordion>
+ </panel>
+ </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_places.xml b/indra/newview/skins/default/xui/tr/panel_places.xml
new file mode 100644
index 0000000000..c2a3acf9c5
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_places.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Yerler" name="places panel">
+ <string name="landmarks_tab_title" value="YER Ä°MLERÄ°M"/>
+ <string name="teleport_history_tab_title" value="IŞINLAMA GEÇMİŞİ"/>
+ <filter_editor label="Yerlerimi Filtrele" name="Filter"/>
+ <panel name="button_panel">
+ <layout_stack name="bottom_bar_ls0">
+ <layout_panel name="lp1">
+ <layout_stack name="bottom_bar_ls1">
+ <layout_panel name="teleport_btn_lp">
+ <button label="Işınla" name="teleport_btn" tool_tip="Seçilen alana ışınla"/>
+ </layout_panel>
+ <layout_panel name="chat_btn_lp">
+ <button label="Harita" name="map_btn" tool_tip="İlişkili alanı Dünya Haritasında göster"/>
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+ <layout_panel name="lp2">
+ <layout_stack name="bottom_bar_ls3">
+ <layout_panel name="edit_btn_lp">
+ <button label="Düzenle" name="edit_btn" tool_tip="Yer imi bilgisini düzenle"/>
+ </layout_panel>
+ <layout_panel name="overflow_btn_lp">
+ <menu_button name="overflow_btn" tool_tip="İlave seçenekleri göster"/>
+ </layout_panel>
+ </layout_stack>
+ <layout_stack name="bottom_bar_profile_ls">
+ <layout_panel name="profile_btn_lp">
+ <button label="Profil" name="profile_btn" tool_tip="Yer profilini göster"/>
+ </layout_panel>
+ </layout_stack>
+ <layout_stack name="bottom_bar_close_ls3">
+ <layout_panel name="close_btn_lp">
+ <button label="Kapat" name="close_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+ </layout_stack>
+ <layout_stack name="bottom_bar_ls2">
+ <layout_panel name="save_btn_lp">
+ <button label="Kaydet" name="save_btn"/>
+ </layout_panel>
+ <layout_panel name="cancel_btn_lp">
+ <button label="Ä°ptal" name="cancel_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_postcard_message.xml b/indra/newview/skins/default/xui/tr/panel_postcard_message.xml
new file mode 100644
index 0000000000..2361f4c1c3
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_postcard_message.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_postcard_message">
+ <text name="to_label">
+ Kime:
+ </text>
+ <text name="name_label">
+ Kimden:
+ </text>
+ <text name="subject_label">
+ Konu:
+ </text>
+ <line_editor label="Konunuzu buraya yazın." name="subject_form"/>
+ <text name="msg_label">
+ Ä°leti:
+ </text>
+ <text_editor name="msg_form">
+ İletinizi buraya yazın.
+ </text_editor>
+ <button label="Ä°ptal" name="cancel_btn"/>
+ <button label="Gönder" name="send_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_postcard_settings.xml b/indra/newview/skins/default/xui/tr/panel_postcard_settings.xml
new file mode 100644
index 0000000000..bce0b21b9a
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_postcard_settings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_postcard_settings">
+ <combo_box label="Çözünürlük" name="postcard_size_combo">
+ <combo_box.item label="Mevcut Pencere" name="CurrentWindow"/>
+ <combo_box.item label="640x480" name="640x480"/>
+ <combo_box.item label="800x600" name="800x600"/>
+ <combo_box.item label="1024x768" name="1024x768"/>
+ <combo_box.item label="Özel" name="Custom"/>
+ </combo_box>
+ <layout_stack name="postcard_image_params_ls">
+ <layout_panel name="postcard_image_size_lp">
+ <spinner label="GeniÅŸlik" name="postcard_snapshot_width"/>
+ <spinner label="Yükseklik" name="postcard_snapshot_height"/>
+ <check_box label="Oranları koru" name="postcard_keep_aspect_check"/>
+ </layout_panel>
+ <layout_panel name="postcard_image_format_quality_lp">
+ <slider label="Görüntü kalitesi" name="image_quality_slider"/>
+ <text name="image_quality_level">
+ ([QLVL])
+ </text>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/tr/panel_preferences_advanced.xml
new file mode 100644
index 0000000000..770cdc6efd
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_preferences_advanced.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<panel label="GeliÅŸmiÅŸ" name="advanced">
+ <panel.string name="aspect_ratio_text">
+ [NUM]:[DEN]
+ </panel.string>
+ <text name="Cache:">
+ Önbellek:
+ </text>
+ <spinner label="Önbellek boyutu (64-9984 MB)" name="cachesizespinner"/>
+ <text name="text_box5">
+ MB
+ </text>
+ <button label="Önbelleği Sil" label_selected="Önbelleği Sil" name="clear_cache"/>
+ <text name="Cache location">
+ Önbellek konumu:
+ </text>
+ <button label="Gözat" label_selected="Gözat" name="set_cache"/>
+ <button label="Varsayılan Konum" label_selected="Varsayılan Konum" name="default_cache_location"/>
+ <text name="UI Size:">
+ KA büyüklüğü:
+ </text>
+ <check_box label="Şuradaki komut dosyası hatalarını göster:" name="show_script_errors"/>
+ <radio_group name="show_location">
+ <radio_item label="Yakındaki sohbet" name="0"/>
+ <radio_item label="Ayrı pencere" name="1"/>
+ </radio_group>
+ <check_box label="Birden Çok Görüntüleyiciye İzin Ver" name="allow_multiple_viewer_check"/>
+ <check_box label="Oturum açarken Ağ Seçimini göster" name="show_grid_selection_check"/>
+ <check_box label="Gelişmiş Menüyü Göster" name="show_advanced_menu_check"/>
+ <check_box label="Geliştirici Menüsünü Göster" name="show_develop_menu_check"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_preferences_alerts.xml b/indra/newview/skins/default/xui/tr/panel_preferences_alerts.xml
new file mode 100644
index 0000000000..46a4793c53
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_preferences_alerts.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Açılır Uyarılar" name="popups">
+ <text name="tell_me_label">
+ Bana söyle:
+ </text>
+ <check_box label="L$ harcadığımda veya aldığımda" name="notify_money_change_checkbox"/>
+ <check_box label="Arkadaşlarım oturum açtığında veya kapattığında" name="friends_online_notify_checkbox"/>
+ <text name="show_label">
+ Daima göster:
+ </text>
+ <text name="dont_show_label">
+ Asla gösterme:
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_preferences_chat.xml b/indra/newview/skins/default/xui/tr/panel_preferences_chat.xml
new file mode 100644
index 0000000000..9caf95a122
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_preferences_chat.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Metin Sohbeti" name="chat">
+ <text name="font_size">
+ Font büyüklüğü:
+ </text>
+ <radio_group name="chat_font_size">
+ <radio_item label="Küçük" name="radio" value="0"/>
+ <radio_item label="Orta" name="radio2" value="1"/>
+ <radio_item label="Büyük" name="radio3" value="2"/>
+ </radio_group>
+ <check_box initial_value="true" label="Sohbet sırasında yazma animasyonunu oynat" name="play_typing_animation"/>
+ <check_box label="Çevrimdışı olduğunda Aİ&apos;ler e-posta ile bana gönderilsin" name="send_im_to_email"/>
+ <check_box label="Düz metin Aİ&apos;ler ve sohbet geçmişini etkinleştir" name="plain_text_chat_history"/>
+ <check_box label="Balon Sohbeti" name="bubble_text_chat"/>
+ <text name="show_ims_in_label">
+ Aİ&apos;leri şurada göster:
+ </text>
+ <text name="requires_restart_label">
+ (tekrar baÅŸlatma gerekir)
+ </text>
+ <radio_group name="chat_window" tool_tip="Anlık İletileri ayrı gezdiricilerde veya çoklu sekmelere sahip tek bir gezdiricide gösterin (tekrar başlatma gerekir)">
+ <radio_item label="Ayrı Pencereler" name="radio" value="0"/>
+ <radio_item label="Sekmeler" name="radio2" value="1"/>
+ </radio_group>
+ <text name="disable_toast_label">
+ Gelen sohbet için açılır pencereleri etkinleştir:
+ </text>
+ <check_box label="Grup Sohbetleri" name="EnableGroupChatPopups" tool_tip="Bir Grup Sohbet iletisi gönderildiğinde açılır pencereleri görmek için işaretle"/>
+ <check_box label="Aİ Sohbetleri" name="EnableIMChatPopups" tool_tip="Bir anlık ileti geldiğinde açılır pencereleri görmek için işaretle"/>
+ <spinner label="Yakındaki sohbet iletilerinin vurgulanma süresi:" name="nearby_toasts_lifetime"/>
+ <spinner label="Yakındaki sohbet iletilerinin sönme süresi:" name="nearby_toasts_fadingtime"/>
+ <button label="Sohbet Çevirisi Ayarları" name="ok_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_preferences_colors.xml b/indra/newview/skins/default/xui/tr/panel_preferences_colors.xml
new file mode 100644
index 0000000000..f6e9d0948c
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_preferences_colors.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Renkler" name="colors_panel">
+ <text name="effects_color_textbox">
+ Efektlerim (seçim ışını):
+ </text>
+ <color_swatch name="effect_color_swatch" tool_tip="Renk Seçiciyi açmak için tıklayın"/>
+ <text name="font_colors">
+ Sohbet font renkleri:
+ </text>
+ <text name="text_box1">
+ Ben
+ </text>
+ <text name="text_box2">
+ DiÄŸerleri
+ </text>
+ <text name="text_box3">
+ Nesneler
+ </text>
+ <text name="text_box4">
+ Sistem
+ </text>
+ <text name="text_box5">
+ Hatalar
+ </text>
+ <text name="text_box10">
+ DoÄŸrudan
+ </text>
+ <text name="text_box7">
+ Sahip
+ </text>
+ <text name="text_box9">
+ URL&apos;ler
+ </text>
+ <text name="bubble_chat">
+ Ad etiketinin arka plan rengi (ayrıca Balon Sohbeti de etkiler):
+ </text>
+ <color_swatch name="background" tool_tip="Ad etiketi rengini seç"/>
+ <slider label="Geçirgenlik:" name="bubble_chat_opacity" tool_tip="Ad etiketi geçirgenliğini seç"/>
+ <text name="floater_opacity">
+ Gezdirici Geçirgenliği:
+ </text>
+ <slider label="Etkin:" name="active"/>
+ <slider label="Etkin deÄŸil:" name="inactive"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_preferences_general.xml b/indra/newview/skins/default/xui/tr/panel_preferences_general.xml
new file mode 100644
index 0000000000..4a48b1588c
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_preferences_general.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Genel" name="general_panel">
+ <text name="language_textbox">
+ Dil:
+ </text>
+ <combo_box name="language_combobox">
+ <combo_box.item label="Sistem varsayılanı" name="System Default Language"/>
+ <combo_box.item label="English (Ä°ngilizce)" name="English"/>
+ <combo_box.item label="Dansk (Danca) - Beta" name="Danish"/>
+ <combo_box.item label="Deutsch (Almanca) - Beta" name="Deutsch(German)"/>
+ <combo_box.item label="Español (İspanyolca) - Beta" name="Spanish"/>
+ <combo_box.item label="Français (Fransızca) - Beta" name="French"/>
+ <combo_box.item label="Italiano (Ä°talyanca) - Beta" name="Italian"/>
+ <combo_box.item label="Polski (Lehçe) - Beta" name="Polish"/>
+ <combo_box.item label="Português (Portekizce) - Beta" name="Portugese"/>
+ <combo_box.item label="РуÑÑкий (Rusça) - Beta" name="Russian"/>
+ <combo_box.item label="Türkçe - Beta" name="Turkish"/>
+ <combo_box.item label="日本語 (Japonca) - Beta" name="(Japanese)"/>
+ <combo_box.item label="正體中文 (Geleneksel Çince) - Beta" name="Traditional Chinese"/>
+ </combo_box>
+ <text name="language_textbox2">
+ (Yeniden baÅŸlatma gerekir)
+ </text>
+ <text name="maturity_desired_prompt">
+ Seviyelndrl. içeriğe erişim istiyorum::
+ </text>
+ <combo_box name="maturity_desired_combobox">
+ <combo_box.item label="Genel, Orta, YetiÅŸkin" name="Desired_Adult"/>
+ <combo_box.item label="Genel ve Orta" name="Desired_Mature"/>
+ <combo_box.item label="Genel" name="Desired_PG"/>
+ </combo_box>
+ <text name="start_location_textbox">
+ Standart konum:
+ </text>
+ <combo_box name="start_location_combo">
+ <combo_box.item label="Son konumum" name="MyLastLocation"/>
+ <combo_box.item label="Ana Konumum" name="MyHome"/>
+ </combo_box>
+ <check_box initial_value="true" label="Oturumu açarken göster" name="show_location_checkbox"/>
+ <text name="name_tags_textbox">
+ Ad etiketleri:
+ </text>
+ <radio_group name="Name_Tag_Preference">
+ <radio_item label="Kapalı" name="radio" value="0"/>
+ <radio_item label="Açık" name="radio2" value="1"/>
+ <radio_item label="Kısaca göster" name="radio3" value="2"/>
+ </radio_group>
+ <check_box label="Adım" name="show_my_name_checkbox1"/>
+ <check_box label="Kullanıcı adları" name="show_slids" tool_tip="Kullanıcı adını göster, bobsmith123 gibi"/>
+ <check_box label="Grup unvanları" name="show_all_title_checkbox1" tool_tip="Grup unvanlarını göster, Görevli veya Üye gibi"/>
+ <check_box label="Arkadaşları vurgula" name="show_friends" tool_tip="Arkadaşlarının ad etiketlerini vurgula"/>
+ <check_box label="Ekran Adlarını Görüntüle" name="display_names_check" tool_tip="Sohbet, Aİ, ad etiketleri, vb.de ekran adlarını kullanmak için işaretle"/>
+ <text name="inworld_typing_rg_label">
+ Basılacak harf tuşları:
+ </text>
+ <radio_group name="inworld_typing_preference">
+ <radio_item label="Yerel sohbet baÅŸlat" name="radio_start_chat" value="1"/>
+ <radio_item label="Hareketi etkiler (yani WASD)" name="radio_move" value="0"/>
+ </radio_group>
+ <text name="title_afk_text">
+ Uzakta süre sonu:
+ </text>
+ <combo_box label="Uzakta süre sonu:" name="afk">
+ <combo_box.item label="2 dakika" name="item0"/>
+ <combo_box.item label="5 dakika" name="item1"/>
+ <combo_box.item label="10 dakika" name="item2"/>
+ <combo_box.item label="30 dakika" name="item3"/>
+ <combo_box.item label="asla" name="item4"/>
+ </combo_box>
+ <text name="text_box3">
+ Meşgul durumu cevabı:
+ </text>
+ <text_editor name="busy_response">
+ log_in_to_change
+ </text_editor>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/tr/panel_preferences_graphics1.xml
new file mode 100644
index 0000000000..ddb83ffc69
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_preferences_graphics1.xml
@@ -0,0 +1,114 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Grafikler" name="Display panel">
+ <text name="QualitySpeed">
+ Kalite ve hız:
+ </text>
+ <text name="FasterText">
+ Daha hızlı
+ </text>
+ <text name="BetterText">
+ Daha iyi
+ </text>
+ <text name="ShadersPrefText">
+ Düşük
+ </text>
+ <text name="ShadersPrefText2">
+ Orta
+ </text>
+ <text name="ShadersPrefText3">
+ Yüksek
+ </text>
+ <text name="ShadersPrefText4">
+ Ultra
+ </text>
+ <panel label="ÖzelGrafikler" name="CustomGraphics Panel">
+ <text name="ShadersText">
+ Gölgelendiriciler:
+ </text>
+ <check_box initial_value="true" label="Saydam Su" name="TransparentWater"/>
+ <check_box initial_value="true" label="Tümsek eşleme ve parlaklık" name="BumpShiny"/>
+ <check_box initial_value="true" label="Yerel Işıklar" name="LocalLights"/>
+ <check_box initial_value="true" label="Temel gölgeleyiciler" name="BasicShaders" tool_tip="Bu seçeneğin devre dışı bırakılması bazı grafik kartlarının sürücülerinin kilitlenmesini önleyebilir"/>
+ <check_box initial_value="true" label="Atmosferik gölgeleyiciler" name="WindLightUseAtmosShaders"/>
+ <check_box initial_value="true" label="Işıklandırma ve Gölgeler" name="UseLightShaders"/>
+ <check_box initial_value="true" label="Ortam Gölgeleme" name="UseSSAO"/>
+ <check_box initial_value="true" label="Alan DerinliÄŸi" name="UseDoF"/>
+ <text name="shadows_label">
+ Gölgeler:
+ </text>
+ <combo_box name="ShadowDetail">
+ <combo_box.item label="Hiçbiri" name="0"/>
+ <combo_box.item label="Güneş/Ay" name="1"/>
+ <combo_box.item label="Güneş/Ay + Projektörler" name="2"/>
+ </combo_box>
+ <text name="reflection_label">
+ Su Yansımaları:
+ </text>
+ <combo_box name="Reflections">
+ <combo_box.item label="Minimal" name="0"/>
+ <combo_box.item label="Yüzey ve ağaçlar" name="1"/>
+ <combo_box.item label="Tüm statik nesneler" name="2"/>
+ <combo_box.item label="Tüm avatarlar ve nesneler" name="3"/>
+ <combo_box.item label="Her ÅŸey" name="4"/>
+ </combo_box>
+ <slider label="Avatar Fzk. Özlk.:" name="AvatarPhysicsDetail"/>
+ <text name="AvatarPhysicsDetailText">
+ Düşük
+ </text>
+ <slider label="Mesafeyi çiz:" name="DrawDistance"/>
+ <text name="DrawDistanceMeterText2">
+ m
+ </text>
+ <slider label="Maks. parçacık sayısı:" name="MaxParticleCount"/>
+ <slider label="Düşük gr. özl. olmayan mks. avatar:" name="MaxNumberAvatarDrawn"/>
+ <slider label="Son iÅŸleme kalitesi:" name="RenderPostProcess"/>
+ <text name="MeshDetailText">
+ Örgü detayı:
+ </text>
+ <slider label="Nesneler:" name="ObjectMeshDetail"/>
+ <slider label="Esnek primler:" name="FlexibleMeshDetail"/>
+ <slider label="Ağaçlar:" name="TreeMeshDetail"/>
+ <slider label="Avatarlar:" name="AvatarMeshDetail"/>
+ <slider label="Yüzey:" name="TerrainMeshDetail"/>
+ <slider label="Gökyüzü:" name="SkyMeshDetail"/>
+ <text name="PostProcessText">
+ Düşük
+ </text>
+ <text name="ObjectMeshDetailText">
+ Düşük
+ </text>
+ <text name="FlexibleMeshDetailText">
+ Düşük
+ </text>
+ <text name="TreeMeshDetailText">
+ Düşük
+ </text>
+ <text name="AvatarMeshDetailText">
+ Düşük
+ </text>
+ <text name="TerrainMeshDetailText">
+ Düşük
+ </text>
+ <text name="SkyMeshDetailText">
+ Düşük
+ </text>
+ <text name="AvatarRenderingText">
+ Avatar Ä°ÅŸleme:
+ </text>
+ <check_box initial_value="true" label="Düşük grafik özellikli avatarlar" name="AvatarImpostors"/>
+ <check_box initial_value="true" label="Donanım ile kaplama" name="AvatarVertexProgram"/>
+ <check_box initial_value="true" label="Avatar giysisi" name="AvatarCloth"/>
+ <text name="TerrainDetailText">
+ Yüzey detayı:
+ </text>
+ <radio_group name="TerrainDetailRadio">
+ <radio_item label="Düşük" name="0"/>
+ <radio_item label="Yüksek" name="2"/>
+ </radio_group>
+ --&gt;
+ </panel>
+ <button label="Uygula" label_selected="Uygula" name="Apply"/>
+ <button label="Sıfırla" name="Defaults"/>
+ <button label="GeliÅŸmiÅŸ" name="Advanced"/>
+ <button label="Donanım" label_selected="Donanım" name="GraphicsHardwareButton"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_preferences_move.xml b/indra/newview/skins/default/xui/tr/panel_preferences_move.xml
new file mode 100644
index 0000000000..c35eaec9c3
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_preferences_move.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Hareket Et" name="move_panel">
+ <slider label="Gröünüm açısı" name="camera_fov"/>
+ <slider label="Mesafe" name="camera_offset_scale"/>
+ <text name="heading2">
+ Şunun için otomatik konum:
+ </text>
+ <check_box label="İnşa Et/Düzenle" name="edit_camera_movement" tool_tip="Düzenleme moduna girerken ve düzenleme modundan çıkarken otomatik kamera konumunu kullanın"/>
+ <check_box label="Görünüm" name="appearance_camera_movement" tool_tip="Düzenleme modundayken otomatik kamera konumunu kullan"/>
+ <text name="keyboard_lbl">
+ Klavye:
+ </text>
+ <check_box label="Ok tuşları beni her zaman hareket ettirir" name="arrow_keys_move_avatar_check"/>
+ <check_box label="Koşmak için iki kez dokun ve tut" name="tap_tap_hold_to_run"/>
+ <text name="mouse_lbl">
+ Fare:
+ </text>
+ <check_box label="Fare üzerinden görünümde beni göster" name="first_person_avatar_visible"/>
+ <text name=" Mouse Sensitivity">
+ Fare üzerinden görünümde fare hassasiyeti
+ </text>
+ <check_box label="Tersine çevir" name="invert_mouse"/>
+ <text name="single_click_action_lbl">
+ Arazi üzerine tek tıklama:
+ </text>
+ <combo_box name="single_click_action_combo">
+ <combo_box.item label="Eylem yok" name="0"/>
+ <combo_box.item label="Tıklanan noktaya hareket et" name="1"/>
+ </combo_box>
+ <text name="double_click_action_lbl">
+ Arazi üzerine çift tıklama:
+ </text>
+ <combo_box name="double_click_action_combo">
+ <combo_box.item label="Eylem yok" name="0"/>
+ <combo_box.item label="Tıklanan noktaya hareket et" name="1"/>
+ <combo_box.item label="Tıklanan noktaya ışınla" name="2"/>
+ </combo_box>
+ <button label="Diğer Aygıtlar" name="joystick_setup_button"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/tr/panel_preferences_privacy.xml
new file mode 100644
index 0000000000..9111594979
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_preferences_privacy.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Ä°letiÅŸim" name="im">
+ <panel.string name="log_in_to_change">
+ değiştirmek için oturum açın
+ </panel.string>
+ <button label="Geçmişi Temizle" name="clear_cache" tool_tip="Oturum açma görüntüsünü, son konumu, ışınlama geçmişini, web ve dokulama önbelleğini temizleyin."/>
+ <text name="cache_size_label_l">
+ (Konumlar, görüntüler, web, arama geçmişi)
+ </text>
+ <check_box label="Arama sonuçlarında beni göster" name="online_searchresults"/>
+ <check_box label="Çevrimiçi olduğumu sadece arkadaşlar ve gruplar bilsin" name="online_visibility"/>
+ <check_box label="Sadece arkadaşlar ve gruplar beni arasın veya Aİ göndersin" name="voice_call_friends_only_check"/>
+ <check_box label="Aramaları sonlandırırken mikrofonu kapat" name="auto_disengage_mic_check"/>
+ <check_box label="Oturum Açarken Favori Yer İmlerimi Göster (&apos;Buradan başla&apos; menüsünden)" name="favorites_on_login_check"/>
+ <text name="Logs:">
+ Sohbet Günlükleri:
+ </text>
+ <check_box label="Yakındaki sohbet günlüklerini bilgisayarımda göster" name="log_nearby_chat"/>
+ <check_box label="Aİ günlüklerini bilgisayarıma kaydet" name="log_instant_messages"/>
+ <check_box label="Sohbet günlüğünde her satıra zaman damgası eklensin" name="show_timestamps_check_im"/>
+ <check_box label="Günlük dosyası adına tarih damgası eklensin." name="logfile_name_datestamp"/>
+ <text name="log_path_desc">
+ Günlüklerin konumu:
+ </text>
+ <button label="Gözat" label_selected="Gözat" name="log_path_button"/>
+ <button label="Listeyi engelle" name="block_list"/>
+ <text name="block_list_label">
+ (EngellediÄŸiniz KiÅŸiler ve/veya Nesneler)
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_preferences_setup.xml b/indra/newview/skins/default/xui/tr/panel_preferences_setup.xml
new file mode 100644
index 0000000000..9d03d9b01d
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_preferences_setup.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Ayarlar" name="Input panel">
+ <text name="Network:">
+ AÄŸ:
+ </text>
+ <text name="Maximum bandwidth">
+ Maksimum bant geniÅŸliÄŸi
+ </text>
+ <text name="text_box2">
+ kbps
+ </text>
+ <check_box label="Özel port" name="connection_port_enabled"/>
+ <spinner label="Port numarası:" name="connection_port"/>
+ <text name="Web:">
+ Web:
+ </text>
+ <radio_group name="use_external_browser">
+ <radio_item label="Tarayıcımı kullan (IE, Firefox, Safari)" name="external" tool_tip="Yardım, web bağlantıları vs. için sistemin varsayılan web tarayıcısını kullanın. Tam ekran çalıştırılıyorsa tavsiye edilmez." value="true"/>
+ <radio_item label="Yerleşik tarayıcıyı kullan" name="internal" tool_tip="Yardım, web bağlantıları vs. için dahili web tarayıcısını kullanın. Bu tarayıcı [APP_NAME] içerisinde yeni bir pencere olarak açılır." value=""/>
+ </radio_group>
+ <check_box initial_value="true" label="Eklentileri etkinleÅŸtir" name="browser_plugins_enabled"/>
+ <check_box initial_value="true" label="Çerezleri kabul et" name="cookies_enabled"/>
+ <check_box initial_value="true" label="Javascript&apos;i etkinleÅŸtir" name="browser_javascript_enabled"/>
+ <check_box initial_value="false" label="Ortam tarayıcısı açılır pencerelerini etkinleştir" name="media_popup_enabled"/>
+ <text name="Software updates:">
+ Yazılım güncelleştirmeleri:
+ </text>
+ <combo_box name="updater_service_combobox">
+ <combo_box.item label="Otomatik olarak kurulsun" name="Install_automatically"/>
+ <combo_box.item label="Güncelleştirmeler manuel olarak karşıdan yüklensin ve kurulsun" name="Install_manual"/>
+ </combo_box>
+ <text name="Proxy Settings:">
+ Proxy Ayarları:
+ </text>
+ <button label="Proxy ayarlarını yap" label_selected="Gözat" name="set_proxy"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_preferences_sound.xml b/indra/newview/skins/default/xui/tr/panel_preferences_sound.xml
new file mode 100644
index 0000000000..9256f1d324
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_preferences_sound.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Sesler" name="Preference Media panel">
+ <panel.string name="middle_mouse">
+ Orta Fare
+ </panel.string>
+ <slider label="Ana ses düzeyi" name="System Volume"/>
+ <check_box initial_value="true" name="mute_when_minimized"/>
+ <text name="mute_chb_label">
+ Küçültüldüğünde sustur
+ </text>
+ <slider label="Düğmeler" name="UI Volume"/>
+ <slider label="Ortam" name="Wind Volume"/>
+ <slider label="Ses Efektleri" name="SFX Volume"/>
+ <slider label="Müzik akışı" name="Music Volume"/>
+ <check_box label="Etkin" name="enable_music"/>
+ <slider label="Ortam" name="Media Volume"/>
+ <check_box label="Etkin" name="enable_media"/>
+ <slider label="Sesli Sohbet" name="Voice Volume"/>
+ <check_box label="Etkin" name="enable_voice_check"/>
+ <check_box label="Ortamı otomatik oynatmaya izin ver" name="media_auto_play_btn" tool_tip="istiyorsa ortamı otomatik oynatmak için bunu işaretleyin" value="true"/>
+ <check_box label="Diğer avatarlara eklenen ortamı oynat" name="media_show_on_others_btn" tool_tip="Yakınlardaki diğer avatarlara eklenen ortamı gizlemek için bunun işaretini kaldırın" value="true"/>
+ <check_box label="Mimiklere ses eşlik etsin" name="gesture_audio_play_btn" tool_tip="Mimiklerle beraber ses duymak için bunu işaretleyin" value="true"/>
+ <text name="voice_chat_settings">
+ Sesli Sohbet Ayarları
+ </text>
+ <text name="Listen from">
+ Åžuradan dinle:
+ </text>
+ <radio_group name="ear_location">
+ <radio_item label="Kamera konumu" name="0"/>
+ <radio_item label="Avatar konumu" name="1"/>
+ </radio_group>
+ <check_box label="Konuşurken avatar dudaklarını hareket ettir" name="enable_lip_sync"/>
+ <check_box label="Aşağıdaki düğmeye bastığımda konuşmayı aç/kapat:" name="push_to_talk_toggle_check" tool_tip="Toggle (dönüşümlü) modda mikrofonunuzu açıp kapatmak için tetikleyici tuşuna BİR KERE basıp bırakın. Toggle (dönüşümlü) modda değilken mikrofonunuz sadece tetikleyici tuş basılı tutulurken sesinizi yayınlar."/>
+ <line_editor label="Bas-KonuÅŸ tetikleyici" name="modifier_combo"/>
+ <button label="TuÅŸ Ayarla" name="set_voice_hotkey_button"/>
+ <button name="set_voice_middlemouse_button" tool_tip="Orta Fare Düğmesine Sıfırla"/>
+ <button label="Giriş/Çıkış cihazları" name="device_settings_btn"/>
+ <panel label="Cihaz Ayarları" name="device_settings_panel"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/tr/panel_prim_media_controls.xml
new file mode 100644
index 0000000000..0433d03450
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_prim_media_controls.xml
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="MediaControls">
+ <string name="control_background_image_name">
+ Inspector_Background
+ </string>
+ <string name="skip_step">
+ 0.2
+ </string>
+ <string name="min_width">
+ 300
+ </string>
+ <string name="min_height">
+ 75
+ </string>
+ <string name="zoom_near_padding">
+ 1.0
+ </string>
+ <string name="zoom_medium_padding">
+ 1.1
+ </string>
+ <string name="zoom_far_padding">
+ 1.5
+ </string>
+ <string name="top_world_view_avoid_zone">
+ 50
+ </string>
+ <layout_stack name="progress_indicator_area">
+ <layout_panel name="media_progress_indicator">
+ <progress_bar name="media_progress_bar" tool_tip="Ortam Yükleniyor"/>
+ </layout_panel>
+ </layout_stack>
+ <layout_stack name="media_controls">
+ <layout_panel name="back">
+ <button name="back_btn" tool_tip="Geri Git"/>
+ </layout_panel>
+ <layout_panel name="fwd">
+ <button name="fwd_btn" tool_tip="Ä°leri Git"/>
+ </layout_panel>
+ <layout_panel name="home">
+ <button name="home_btn" tool_tip="Ana sayfa"/>
+ </layout_panel>
+ <layout_panel name="media_stop">
+ <button name="media_stop_btn" tool_tip="Ortamı durdur"/>
+ </layout_panel>
+ <layout_panel name="reload">
+ <button name="reload_btn" tool_tip="Yeniden Yükle"/>
+ </layout_panel>
+ <layout_panel name="stop">
+ <button name="stop_btn" tool_tip="Yüklemeyi durdur"/>
+ </layout_panel>
+ <layout_panel name="play">
+ <button name="play_btn" tool_tip="Ortamı oynat"/>
+ </layout_panel>
+ <layout_panel name="pause">
+ <button name="pause_btn" tool_tip="Ortamı duraklat"/>
+ </layout_panel>
+ <layout_panel name="media_address">
+ <line_editor name="media_address_url" tool_tip="Ortam URL&apos;si"/>
+ <layout_stack name="media_address_url_icons">
+ <layout_panel>
+ <icon name="media_whitelist_flag" tool_tip="Beyaz Liste etkin"/>
+ </layout_panel>
+ <layout_panel>
+ <icon name="media_secure_lock_flag" tool_tip="Güvenli Tarama"/>
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+ <layout_panel name="media_play_position">
+ <slider_bar initial_value="0.5" name="media_play_slider" tool_tip="Filmi oynatma ilerlemesi"/>
+ </layout_panel>
+ <layout_panel name="skip_back">
+ <button name="skip_back_btn" tool_tip="Geriletme"/>
+ </layout_panel>
+ <layout_panel name="skip_forward">
+ <button name="skip_forward_btn" tool_tip="Ä°lerletme"/>
+ </layout_panel>
+ <layout_panel name="media_volume">
+ <button name="media_mute_button" tool_tip="Bu Ortamı Sustur"/>
+ <slider name="volume_slider" tool_tip="Ortam Volümü"/>
+ </layout_panel>
+ <layout_panel name="zoom_frame">
+ <button name="zoom_frame_btn" tool_tip="Ortama yakınlaştır"/>
+ </layout_panel>
+ <layout_panel name="close">
+ <button name="close_btn" tool_tip="Geri Zumla"/>
+ </layout_panel>
+ <layout_panel name="new_window">
+ <button name="new_window_btn" tool_tip="URL&apos;yi Tarayıcıda Aç"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_region_covenant.xml b/indra/newview/skins/default/xui/tr/panel_region_covenant.xml
new file mode 100644
index 0000000000..5c46365aea
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_region_covenant.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Sözleşme" name="Covenant">
+ <panel.string name="can_resell">
+ Bu bölgede satın alınan arazi tekrar satılabilir.
+ </panel.string>
+ <panel.string name="can_not_resell">
+ Bu bölgede satın alınan arazi tekrar satılamayabilir.
+ </panel.string>
+ <panel.string name="can_change">
+ Bu bölgede satın alınan arazi birleştirilebilir veya bölünebilir.
+ </panel.string>
+ <panel.string name="can_not_change">
+ Bu bölgede satın alınan arazi birleştirilemeyebilir veya bölünemeyebilir.
+ </panel.string>
+ <text name="estate_section_lbl">
+ Gayrimenkul
+ </text>
+ <text name="estate_name_lbl">
+ Ad:
+ </text>
+ <text name="estate_name_text">
+ anakara
+ </text>
+ <text name="estate_owner_lbl">
+ Sahip:
+ </text>
+ <text name="estate_owner_text">
+ (hiçbiri)
+ </text>
+ <text name="estate_cov_lbl">
+ Sözleşme:
+ </text>
+ <text name="covenant_timestamp_text">
+ Son Değiştirme: 31 Ara, Çar 16:00:00 1969
+ </text>
+ <text_editor name="covenant_editor">
+ Bu Gayrimenkul için Sözleşmesi yok.
+ </text_editor>
+ <button label="Sıfırla" name="reset_covenant"/>
+ <text name="covenant_help_text">
+ Sözleşmede yapılan değişiklikler gayrimenkul içerisindeki tüm parsellerde gösterilir.
+ </text>
+ <text name="covenant_instructions">
+ Bu gayrimenkul için Sözleşmeyi değiştirmek amacıyla bir not kartını sürükleyin ve bırakın.
+ </text>
+ <text name="region_section_lbl">
+ Bölge
+ </text>
+ <text name="region_name_lbl">
+ Ad:
+ </text>
+ <text name="region_name_text">
+ Erica
+ </text>
+ <text name="region_landtype_lbl">
+ Tür:
+ </text>
+ <text name="region_landtype_text">
+ Anakara / Banliyö
+ </text>
+ <text name="region_maturity_lbl">
+ Seviye:
+ </text>
+ <text name="region_maturity_text">
+ YetiÅŸkin
+ </text>
+ <text name="resellable_lbl">
+ Tekrar Satış:
+ </text>
+ <text name="resellable_clause">
+ Bu bölgedeki arazi tekrar satılamayabilir.
+ </text>
+ <text name="changeable_lbl">
+ Böl:
+ </text>
+ <text name="changeable_clause">
+ Bu bölgedeki arazi birleştirilemeyebilir/bölünemeyebilir.
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_region_debug.xml b/indra/newview/skins/default/xui/tr/panel_region_debug.xml
new file mode 100644
index 0000000000..6e15e0f6f6
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_region_debug.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Hata ayıkla" name="Debug">
+ <text name="region_text_lbl">
+ Bölge:
+ </text>
+ <text name="region_text">
+ bilinmiyor
+ </text>
+ <check_box label="Komut Dosyalarını Devre Dışı Bırak" name="disable_scripts_check" tool_tip="Bu bölgedeki tüm komut dosyalarını devre dışı bırak"/>
+ <check_box label="Çarpışmaları Devre Dışı Bırak" name="disable_collisions_check" tool_tip="Bu bölgedeki avatar dışı çarpışmaları devre dışı bırak"/>
+ <check_box label="Fiziği Devre Dışı Bırak" name="disable_physics_check" tool_tip="Bu bölgedeki tüm fiziği devre dışı bırak"/>
+ <button label="Uygula" name="apply_btn"/>
+ <text name="objret_text_lbl">
+ Nesne Ä°adesi
+ </text>
+ <text name="resident_text_lbl">
+ Sakin:
+ </text>
+ <line_editor name="target_avatar_name">
+ (hiçbiri)
+ </line_editor>
+ <button label="Seç" name="choose_avatar_btn"/>
+ <text name="options_text_lbl">
+ Seçenklr.:
+ </text>
+ <check_box label="Komut dosyaları ile" name="return_scripts" tool_tip="Sadece komut dosyaları olan nesneler iade edilsin"/>
+ <check_box label="Başkasına ait arazi üzerinde" name="return_other_land" tool_tip="Sadece başkasına ait arazi üzerinde olan nesneler iade edilsin"/>
+ <check_box label="Bu gayrimenkulu oluşturan bölgelerin tümünde" name="return_estate_wide" tool_tip="Bu gayrimenkulu oluşturan bölgelerin tümündeki nesneler iade edilsin"/>
+ <button label="Ä°ade Et" name="return_btn"/>
+ <button label="En Çok Çarpışanlar..." name="top_colliders_btn" tool_tip="En çok potansiyel çarpışma yaşayan nesnelerin listesi"/>
+ <button label="En Çok Komut Dsy. Çalştr...." name="top_scripts_btn" tool_tip="Komut dosyalarını çalıştırırken en çok zaman harcayan nesnelerin listesi"/>
+ <button label="Bölgeyi Yeniden Başlat" name="restart_btn" tool_tip="2 dakikalık bir geri sayımdan sonra bölgeyi yeniden başlat"/>
+ <button label="Yeniden Başlatmayı Ertele" name="cancel_restart_btn" tool_tip="Bölgenin yeniden başlatılmasını 1 saat ertele"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_region_environment.xml b/indra/newview/skins/default/xui/tr/panel_region_environment.xml
new file mode 100644
index 0000000000..058ea91b70
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_region_environment.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Ortam" name="panel_env_info">
+ <text name="water_settings_title">
+ Bölgenize gelen tüm ziyaretçilerin görmesini istediğiniz Su ve Gökyüzü/Gündüz Döngüsü Ayarlarını seçin. Ek bilgi
+ </text>
+ <radio_group name="region_settings_radio_group">
+ <radio_item label="Second Life varsayılanını kullan" name="use_sl_default_settings"/>
+ <radio_item label="Aşağıdaki ayarları kullan" name="use_my_settings"/>
+ </radio_group>
+ <panel name="user_environment_settings">
+ <text name="water_settings_title">
+ Su Ayarı
+ </text>
+ <combo_box name="water_settings_preset_combo">
+ <combo_box.item label="-Bir ön ayar seçin-" name="item0"/>
+ </combo_box>
+ <text name="sky_dayc_settings_title">
+ Gökyüzü/Gün Dön.
+ </text>
+ <radio_group name="sky_dayc_settings_radio_group">
+ <radio_item label="Sabit gökyüzü" name="my_sky_settings"/>
+ <radio_item label="Gün döngüsü" name="my_dayc_settings"/>
+ </radio_group>
+ <combo_box name="sky_settings_preset_combo">
+ <combo_box.item label="-Bir ön ayar seçin-" name="item0"/>
+ </combo_box>
+ <combo_box name="dayc_settings_preset_combo">
+ <combo_box.item label="-Bir ön ayar seçin-" name="item0"/>
+ </combo_box>
+ </panel>
+ <button label="Uygula" name="apply_btn"/>
+ <button label="Ä°ptal" name="cancel_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_region_estate.xml b/indra/newview/skins/default/xui/tr/panel_region_estate.xml
new file mode 100644
index 0000000000..f1df13df61
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_region_estate.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Gayrimenkul" name="Estate">
+ <text name="estate_help_text">
+ Bu sekmedeki ayarlarda yapılan değişiklikler gayrimenkul içerisindeki tüm bölgeleri etkiler.
+ </text>
+ <text name="estate_text">
+ Gayrimenkul:
+ </text>
+ <text name="estate_name">
+ (bilinmiyor)
+ </text>
+ <text name="owner_text">
+ Gayrimenkul sahibi:
+ </text>
+ <text name="estate_owner">
+ (bilinmiyor)
+ </text>
+ <check_box label="Küresel Saati Kullan" name="use_global_time_check"/>
+ <check_box label="Sabit Güneş" name="fixed_sun_check"/>
+ <slider label="Faz" name="sun_hour_slider"/>
+ <check_box label="Kamusal EriÅŸime Ä°zin Ver" name="externally_visible_check"/>
+ <text name="Only Allow">
+ Sadece ÅŸu Sakinlere eriÅŸim izni verin:
+ </text>
+ <check_box label="Ödeme bilgileri kayıtlı" name="limit_payment" tool_tip="Sakinlerin bu gayrimenkule erişebilmesi için ödeme bilgilerinin kayıtlı olması gerekir. Daha fazla bilgi için [SUPPORT_SITE] adresini ziyaret edin."/>
+ <check_box label="Yaş doğrulaması yapılmış" name="limit_age_verified" tool_tip="Sakinlerin bu gayrimenkule erişebilmesi için yaş doğrulamalarının yapılmış olması gerekir. Daha fazla bilgi için [SUPPORT_SITE] adresini ziyaret edin."/>
+ <check_box label="Sesli Sohbete Ä°zin Ver" name="voice_chat_check"/>
+ <check_box label="Doğrudan Işınlamaya İzin Ver" name="allow_direct_teleport"/>
+ <button label="Uygula" name="apply_btn"/>
+ <button label="Gayrimenkule İleti Gönder..." name="message_estate_btn"/>
+ <button label="Sakinlerini Gayrimenkulden Çıkar..." name="kick_user_from_estate_btn"/>
+ <text name="estate_manager_label">
+ Gayrimenkul Yöneticileri:
+ </text>
+ <button label="Kaldır..." name="remove_estate_manager_btn"/>
+ <button label="Ekle..." name="add_estate_manager_btn"/>
+ <text name="allow_resident_label">
+ Ä°zin verilen Sakinler:
+ </text>
+ <button label="Kaldır..." name="remove_allowed_avatar_btn"/>
+ <button label="Ekle..." name="add_allowed_avatar_btn"/>
+ <text name="allow_group_label">
+ Ä°zin verilen Gruplar:
+ </text>
+ <button label="Kaldır..." name="remove_allowed_group_btn"/>
+ <button label="Ekle..." name="add_allowed_group_btn"/>
+ <text name="ban_resident_label">
+ Yasaklı Sakinler:
+ </text>
+ <button label="Kaldır..." name="remove_banned_avatar_btn"/>
+ <button label="Ekle..." name="add_banned_avatar_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_region_general.xml b/indra/newview/skins/default/xui/tr/panel_region_general.xml
new file mode 100644
index 0000000000..37da0f2cca
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_region_general.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Bölge" name="General">
+ <text name="region_text_lbl">
+ Bölge:
+ </text>
+ <text name="region_text">
+ bilinmiyor
+ </text>
+ <text name="version_channel_text_lbl">
+ Sürüm:
+ </text>
+ <text name="version_channel_text">
+ bilinmiyor
+ </text>
+ <text name="region_type_lbl">
+ Tür:
+ </text>
+ <text name="region_type">
+ bilinmiyor
+ </text>
+ <check_box label="Yer Åžekillendirmeyi Engelle" name="block_terraform_check"/>
+ <check_box label="Uçmayı Engelle" name="block_fly_check"/>
+ <check_box label="Hasara Ä°zin Ver" name="allow_damage_check"/>
+ <check_box label="İtmeyi Kısıtla" name="restrict_pushobject"/>
+ <check_box label="Arazinin Tekrar Satışına İzin Ver" name="allow_land_resell_check"/>
+ <check_box label="Arazinin Birleşmesine/Bölünmesine İzin Ver" name="allow_parcel_changes_check"/>
+ <check_box label="Aramada Arazinin Gösterilmesini Engelle" name="block_parcel_search_check" tool_tip="Arama sonuçlarında bu bölge ve parselleri görünsün"/>
+ <check_box label="Örgü Nesnelere İzin Ver" name="mesh_rez_enabled_check" tool_tip="Bu bölgede insanların örgü nesneleri oluşturmasına izin verilsin"/>
+ <spinner label="Aracı Limiti" name="agent_limit_spin"/>
+ <spinner label="Nesne Bonusu" name="object_bonus_spin"/>
+ <text label="EriÅŸkinlik" name="access_text">
+ Seviye:
+ </text>
+ <icons_combo_box label="Orta" name="access_combo">
+ <icons_combo_box.item label="YetiÅŸkin" name="Adult" value="42"/>
+ <icons_combo_box.item label="Orta" name="Mature" value="21"/>
+ <icons_combo_box.item label="Genel" name="PG" value="13"/>
+ </icons_combo_box>
+ <button label="Uygula" name="apply_btn"/>
+ <button label="Bir Sakini Ana Konuma Işınla..." name="kick_btn"/>
+ <button label="Tüm Sakinleri Ana Konuma Işınla..." name="kick_all_btn"/>
+ <button label="Bölgeye İleti Gönder..." name="im_btn"/>
+ <button label="Işınlanma İstasyonu Yönet..." name="manage_telehub_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_region_terrain.xml b/indra/newview/skins/default/xui/tr/panel_region_terrain.xml
new file mode 100644
index 0000000000..3226ee008e
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_region_terrain.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Yüzey" name="Terrain">
+ <text name="region_text_lbl">
+ Bölge:
+ </text>
+ <text name="region_text">
+ bilinmiyor
+ </text>
+ <spinner label="Su Yüksekliği" name="water_height_spin"/>
+ <spinner label="Yüzey Yükslt. Limiti" name="terrain_raise_spin"/>
+ <spinner label="Yüzey Alçatma Limiti" name="terrain_lower_spin"/>
+ <text name="detail_texture_text">
+ Yüzey Dokuları (512x512, 24 bit .tga dosyalar gerektirir)
+ </text>
+ <text name="height_text_lbl">
+ 1 (Düşük)
+ </text>
+ <text name="height_text_lbl2">
+ 2
+ </text>
+ <text name="height_text_lbl3">
+ 3
+ </text>
+ <text name="height_text_lbl4">
+ 4 (Yüksek)
+ </text>
+ <text name="height_text_lbl5">
+ Doku Yükselti Aralıkları
+ </text>
+ <text name="height_text_lbl10">
+ Bu değerler yukarıdaki dokular için karışım aralığını temsil eder.
+ </text>
+ <text name="height_text_lbl11">
+ Metre cinsinden olan bu değerler için, DÜŞÜK değer 1. Dokunun MAKSİMUM yüksekliği, YÜKSEK değer ise 4. Dokunun MİNİMUM yüksekliğidir.
+ </text>
+ <text name="height_text_lbl6">
+ Kuzeybatı
+ </text>
+ <text name="height_text_lbl7">
+ KuzeydoÄŸu
+ </text>
+ <spinner label="Düşük" name="height_start_spin_1"/>
+ <spinner label="Düşük" name="height_start_spin_3"/>
+ <spinner label="Yüksek" name="height_range_spin_1"/>
+ <spinner label="Yüksek" name="height_range_spin_3"/>
+ <text name="height_text_lbl8">
+ Güneybatı
+ </text>
+ <text name="height_text_lbl9">
+ Güneydoğu
+ </text>
+ <spinner label="Düşük" name="height_start_spin_0"/>
+ <spinner label="Düşük" name="height_start_spin_2"/>
+ <spinner label="Yüksek" name="height_range_spin_0"/>
+ <spinner label="Yüksek" name="height_range_spin_2"/>
+ <button label="Ham yüzeyi indir..." name="download_raw_btn" tool_tip="Sadece gayrimenkul sahipleri kullanabilir, yöneticiler kullanamaz"/>
+ <button label="Ham yüzeyi karşıya yükle..." name="upload_raw_btn" tool_tip="Sadece gayrimenkul sahipleri kullanabilir, yöneticiler kullanamaz"/>
+ <button label="Yüzeyi Kaydet" name="bake_terrain_btn" tool_tip="Yükseltme/alçaltma limitleri için mevcut yüzeyi orta nokta olarak ayarla"/>
+ <button label="Uygula" name="apply_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_region_texture.xml b/indra/newview/skins/default/xui/tr/panel_region_texture.xml
new file mode 100644
index 0000000000..fd7ca2a893
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_region_texture.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Zemin Dokuları" name="Textures">
+ <text name="region_text_lbl">
+ Bölge:
+ </text>
+ <text name="region_text">
+ bilinmiyor
+ </text>
+ <text name="detail_texture_text">
+ Yüzey Dokuları (512x512, 24 bit .tga dosyalar gerektirir)
+ </text>
+ <text name="height_text_lbl">
+ 1 (Düşük)
+ </text>
+ <text name="height_text_lbl2">
+ 2
+ </text>
+ <text name="height_text_lbl3">
+ 3
+ </text>
+ <text name="height_text_lbl4">
+ 4 (Yüksek)
+ </text>
+ <text name="height_text_lbl5">
+ Doku Yükselti Aralıkları
+ </text>
+ <text name="height_text_lbl6">
+ Kuzeybatı
+ </text>
+ <text name="height_text_lbl7">
+ KuzeydoÄŸu
+ </text>
+ <spinner label="Düşük" name="height_start_spin_1"/>
+ <spinner label="Düşük" name="height_start_spin_3"/>
+ <spinner label="Yüksek" name="height_range_spin_1"/>
+ <spinner label="Yüksek" name="height_range_spin_3"/>
+ <text name="height_text_lbl8">
+ Güneybatı
+ </text>
+ <text name="height_text_lbl9">
+ Güneydoğu
+ </text>
+ <spinner label="Düşük" name="height_start_spin_0"/>
+ <spinner label="Düşük" name="height_start_spin_2"/>
+ <spinner label="Yüksek" name="height_range_spin_0"/>
+ <spinner label="Yüksek" name="height_range_spin_2"/>
+ <text name="height_text_lbl10">
+ Bu değerler yukarıdaki dokular için karışım aralığını temsil eder.
+ </text>
+ <text name="height_text_lbl11">
+ Metre cinsinden olan bu değerler için, DÜŞÜK değer 1. Dokunun MAKSİMUM yüksekliği, YÜKSEK değer ise 4. Dokunun MİNİMUM yüksekliğidir.
+ </text>
+ <button label="Uygula" name="apply_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_script_ed.xml b/indra/newview/skins/default/xui/tr/panel_script_ed.xml
new file mode 100644
index 0000000000..7aa1da6fb2
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_script_ed.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="script panel">
+ <panel.string name="loading">
+ Yükleniyor...
+ </panel.string>
+ <panel.string name="can_not_view">
+ Bu komut dosyasını görüntüleyemez veya düzenleyemezsiniz, çünkü &quot;kopyalanamaz&quot; olarak ayarlanmıştır. Bir nesnenin içerisindeki bir komut dosyasını görüntülemek veya düzenlemek için tam izinlere ihtiyacınız var.
+ </panel.string>
+ <panel.string name="public_objects_can_not_run">
+ Kamuya Açık Nesneler komut dosyalarını çalıştıramaz
+ </panel.string>
+ <panel.string name="script_running">
+ Çalışıyor
+ </panel.string>
+ <panel.string name="Title">
+ Komut Dosyası: [NAME]
+ </panel.string>
+ <panel.string name="external_editor_not_set">
+ Ortam değişkeni LL_SCRIPT_EDITOR&apos;ü ayarlayarak veya ExternalEditor ayarını yaparak bir düzenleyici seçin.
+ </panel.string>
+ <menu_bar name="script_menu">
+ <menu label="Dosya" name="File">
+ <menu_item_call label="Kaydet" name="Save"/>
+ <menu_item_call label="Tüm Değişiklikleri Geri Çevir" name="Revert All Changes"/>
+ <menu_item_call label="Dosyadan yükle..." name="LoadFromFile"/>
+ <menu_item_call label="Dosyaya kaydet..." name="SaveToFile"/>
+ </menu>
+ <menu label="Düzenle" name="Edit">
+ <menu_item_call label="Geri Al" name="Undo"/>
+ <menu_item_call label="Yinele" name="Redo"/>
+ <menu_item_call label="Kes" name="Cut"/>
+ <menu_item_call label="Kopyala" name="Copy"/>
+ <menu_item_call label="Yapıştır" name="Paste"/>
+ <menu_item_call label="Tümünü Seç" name="Select All"/>
+ <menu_item_call label="Seçimi Kaldır" name="Deselect"/>
+ <menu_item_call label="Ara / DeÄŸiÅŸtir..." name="Search / Replace..."/>
+ </menu>
+ <menu label="Yardım" name="Help">
+ <menu_item_call label="Yardım..." name="Help..."/>
+ <menu_item_call label="Anahtar Sözcük Yardımı..." name="Keyword Help..."/>
+ </menu>
+ </menu_bar>
+ <text_editor name="Script Editor">
+ Yükleniyor...
+ </text_editor>
+ <combo_box label="Ekle..." name="Insert..."/>
+ <button label="Kaydet" label_selected="Kaydet" name="Save_btn"/>
+ <button label="Düzenle..." name="Edit_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_script_limits_my_avatar.xml b/indra/newview/skins/default/xui/tr/panel_script_limits_my_avatar.xml
new file mode 100644
index 0000000000..c821dc45c1
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_script_limits_my_avatar.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="AVATARIM" name="script_limits_my_avatar_panel">
+ <text name="script_memory">
+ Avatar Komut Dosyası Kullanımı
+ </text>
+ <text name="loading_text">
+ Yükleniyor...
+ </text>
+ <scroll_list name="scripts_list">
+ <scroll_list.columns label="Büyüklük (kb)" name="size"/>
+ <scroll_list.columns label="URL&apos;ler" name="urls"/>
+ <scroll_list.columns label="Nesne Adı" name="name"/>
+ <scroll_list.columns label="Konum" name="location"/>
+ </scroll_list>
+ <button label="Listeyi Yenile" name="refresh_list_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_script_limits_region_memory.xml b/indra/newview/skins/default/xui/tr/panel_script_limits_region_memory.xml
new file mode 100644
index 0000000000..2994aba39b
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_script_limits_region_memory.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="BÖLGE BELLEĞİ" name="script_limits_region_memory_panel">
+ <text name="script_memory">
+ Parsel Komut Dosyası Belleği
+ </text>
+ <text name="loading_text">
+ Yükleniyor...
+ </text>
+ <scroll_list name="scripts_list">
+ <scroll_list.columns label="Büyüklük (kb)" name="size"/>
+ <scroll_list.columns label="URL&apos;ler" name="urls"/>
+ <scroll_list.columns label="Nesne Adı" name="name"/>
+ <scroll_list.columns label="Nesne Sahibi" name="owner"/>
+ <scroll_list.columns label="Parsel" name="parcel"/>
+ <scroll_list.columns label="Konum" name="location"/>
+ </scroll_list>
+ <button label="Listeyi Yenile" name="refresh_list_btn"/>
+ <button label="Vurgula" name="highlight_btn"/>
+ <button label="Ä°ade Et" name="return_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_scrolling_param.xml b/indra/newview/skins/default/xui/tr/panel_scrolling_param.xml
new file mode 100644
index 0000000000..aabdc7358b
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_scrolling_param.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="LLScrollingPanelParam">
+ <text name="Loading...">
+ Yükleniyor...
+ </text>
+ <text name="Loading...2">
+ Yükleniyor...
+ </text>
+ <slider label="[DESC]" name="param slider"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_scrolling_param_base.xml b/indra/newview/skins/default/xui/tr/panel_scrolling_param_base.xml
new file mode 100644
index 0000000000..fa659040ea
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_scrolling_param_base.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="LLScrollingPanelParamBase">
+ <slider label="[DESC]" name="param slider"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_side_tray.xml b/indra/newview/skins/default/xui/tr/panel_side_tray.xml
new file mode 100644
index 0000000000..97bca38a50
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_side_tray.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Side tray cannot show background because it is always
+ partially on screen to hold tab buttons. -->
+<side_tray name="sidebar">
+ <sidetray_tab description="Yan Çubuğu Aç/Kapa." name="sidebar_openclose" tab_title="Yan Çubuğu Aç/Kapa"/>
+ <sidetray_tab description="Ana konum." name="sidebar_home" tab_title="Ana konum">
+ <panel label="ana konum" name="panel_home"/>
+ </sidetray_tab>
+ <sidetray_tab description="Kamuya açık profilinizi ve Favorilerinizi düzenleyin." name="sidebar_me" tab_title="Profilim">
+ <panel_container name="panel_container">
+ <panel label="Ben" name="panel_me"/>
+ </panel_container>
+ </sidetray_tab>
+ <sidetray_tab description="Yakındaki arkadaşlarınızı, irtibatları ve kişileri bulun." name="sidebar_people" tab_title="Kişiler">
+ <panel_container name="panel_container">
+ <panel label="Grup Profili" name="panel_group_info_sidetray"/>
+ <panel label="EngellenmiÅŸ Sakinler ve Nesneler" name="panel_block_list_sidetray"/>
+ </panel_container>
+ </sidetray_tab>
+ <sidetray_tab description="Gitmek istediğiniz yerleri ve daha önce uğradığınız yerleri bulun." label="Yerler" name="sidebar_places" tab_title="Yerler">
+ <panel label="Yerler" name="panel_places"/>
+ </sidetray_tab>
+ <sidetray_tab description="Envanterinize göz atın." name="sidebar_inventory" tab_title="Envanterim">
+ <panel label="Envanteri Düzenle" name="sidepanel_inventory"/>
+ </sidetray_tab>
+ <sidetray_tab description="Görünümünüzü değiştirin." name="sidebar_appearance" tab_title="Görünümüm">
+ <panel label="Görünümü Düzenle" name="sidepanel_appearance"/>
+ </sidetray_tab>
+</side_tray>
diff --git a/indra/newview/skins/default/xui/tr/panel_side_tray_tab_caption.xml b/indra/newview/skins/default/xui/tr/panel_side_tray_tab_caption.xml
new file mode 100644
index 0000000000..b9c39ef8cb
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_side_tray_tab_caption.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="sidetray_tab_panel">
+ <text name="sidetray_tab_title" value="Yan Panel"/>
+ <button name="undock" tool_tip="Ayır"/>
+ <button name="dock" tool_tip="YerleÅŸtir"/>
+ <button name="show_help" tool_tip="Yardımı Göster"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/tr/panel_snapshot_inventory.xml
new file mode 100644
index 0000000000..e3b22c639a
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_snapshot_inventory.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_inventory">
+ <text name="title">
+ Envanterime Kaydet
+ </text>
+ <text name="hint_lbl">
+ Bir görüntüyü envanterinize kaydetmenin maliyeti L$[UPLOAD_COST] olur. Görüntünüzü bir doku olarak kaydetmek için kare formatlardan birini seçin.
+ </text>
+ <combo_box label="Çözünürlük" name="texture_size_combo">
+ <combo_box.item label="Mevcut Pencere" name="CurrentWindow"/>
+ <combo_box.item label="Küçük (128x128)" name="Small(128x128)"/>
+ <combo_box.item label="Orta (256x256)" name="Medium(256x256)"/>
+ <combo_box.item label="Büyük (512x512)" name="Large(512x512)"/>
+ <combo_box.item label="Özel" name="Custom"/>
+ </combo_box>
+ <spinner label="GeniÅŸlik" name="inventory_snapshot_width"/>
+ <spinner label="Yükseklik" name="inventory_snapshot_height"/>
+ <check_box label="Oranları koru" name="inventory_keep_aspect_check"/>
+ <button label="Ä°ptal" name="cancel_btn"/>
+ <button label="Kaydet" name="save_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_snapshot_local.xml b/indra/newview/skins/default/xui/tr/panel_snapshot_local.xml
new file mode 100644
index 0000000000..87d7677d73
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_snapshot_local.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_local">
+ <text name="title">
+ Bilgisayarıma Kaydet
+ </text>
+ <combo_box label="Çözünürlük" name="local_size_combo">
+ <combo_box.item label="Mevcut Pencere" name="CurrentWindow"/>
+ <combo_box.item label="320x240" name="320x240"/>
+ <combo_box.item label="640x480" name="640x480"/>
+ <combo_box.item label="800x600" name="800x600"/>
+ <combo_box.item label="1024x768" name="1024x768"/>
+ <combo_box.item label="1280x1024" name="1280x1024"/>
+ <combo_box.item label="1600x1200" name="1600x1200"/>
+ <combo_box.item label="Özel" name="Custom"/>
+ </combo_box>
+ <layout_stack name="local_image_params_ls">
+ <layout_panel name="local_image_size_lp">
+ <spinner label="GeniÅŸlik" name="local_snapshot_width"/>
+ <spinner label="Yükseklik" name="local_snapshot_height"/>
+ <check_box label="Oranları koru" name="local_keep_aspect_check"/>
+ </layout_panel>
+ <layout_panel name="local_image_format_quality_lp">
+ <combo_box label="Format" name="local_format_combo">
+ <combo_box.item label="PNG (Kayıpsız)" name="PNG"/>
+ <combo_box.item label="JPEG" name="JPEG"/>
+ <combo_box.item label="BMP (Kayıpsız)" name="BMP"/>
+ </combo_box>
+ <slider label="Görüntü kalitesi" name="image_quality_slider"/>
+ <text name="image_quality_level">
+ ([QLVL])
+ </text>
+ </layout_panel>
+ </layout_stack>
+ <button label="Ä°ptal" name="cancel_btn"/>
+ <flyout_button label="Kaydet" name="save_btn" tool_tip="Görüntüyü bir dosyaya kaydet">
+ <flyout_button.item label="Kaydet" name="save_item"/>
+ <flyout_button.item label="Farklı Kaydet..." name="saveas_item"/>
+ </flyout_button>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_snapshot_options.xml b/indra/newview/skins/default/xui/tr/panel_snapshot_options.xml
new file mode 100644
index 0000000000..fd2e85fce5
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_snapshot_options.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_options">
+ <button label="Profil Akışımda Yayınla" name="save_to_profile_btn"/>
+ <button label="E-posta" name="save_to_email_btn"/>
+ <button label="Envanterime Kaydet (L$[AMOUNT])" name="save_to_inventory_btn"/>
+ <button label="Bilgisayarıma Kaydet" name="save_to_computer_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_snapshot_postcard.xml b/indra/newview/skins/default/xui/tr/panel_snapshot_postcard.xml
new file mode 100644
index 0000000000..e999678a0d
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_snapshot_postcard.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_postcard">
+ <string name="default_subject">
+ SECOND_LIFE]&apos;dan posta kartı.
+ </string>
+ <string name="default_message">
+ Buna bakın!
+ </string>
+ <string name="upload_message">
+ Gönderiyor...
+ </string>
+ <text name="title">
+ E-posta
+ </text>
+ <button label="Ä°leti" name="message_btn"/>
+ <button label="Ayarlar" name="settings_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_snapshot_profile.xml b/indra/newview/skins/default/xui/tr/panel_snapshot_profile.xml
new file mode 100644
index 0000000000..334fd52a48
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_snapshot_profile.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_snapshot_profile">
+ <text name="title">
+ Profil Akışımda Yayınla
+ </text>
+ <combo_box label="Çözünürlük" name="profile_size_combo">
+ <combo_box.item label="Mevcut Pencere" name="CurrentWindow"/>
+ <combo_box.item label="640x480" name="640x480"/>
+ <combo_box.item label="800x600" name="800x600"/>
+ <combo_box.item label="1024x768" name="1024x768"/>
+ <combo_box.item label="Özel" name="Custom"/>
+ </combo_box>
+ <layout_stack name="profile_image_params_ls">
+ <layout_panel name="profile_image_size_lp">
+ <spinner label="GeniÅŸlik" name="profile_snapshot_width"/>
+ <spinner label="Yükseklik" name="profile_snapshot_height"/>
+ <check_box label="Oranları koru" name="profile_keep_aspect_check"/>
+ </layout_panel>
+ <layout_panel name="profile_image_metadata_lp">
+ <text name="caption_label">
+ Resim yazısı:
+ </text>
+ <check_box initial_value="true" label="Konumu dahil et" name="add_location_cb"/>
+ </layout_panel>
+ </layout_stack>
+ <button label="Ä°ptal" name="cancel_btn"/>
+ <button label="Yayınla" name="post_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_sound_devices.xml b/indra/newview/skins/default/xui/tr/panel_sound_devices.xml
new file mode 100644
index 0000000000..982ef2ea3b
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_sound_devices.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<panel label="Cihaz Ayarları" name="device_settings_panel">
+ <panel.string name="default_text">
+ Varsayılan
+ </panel.string>
+ <string name="name_no_device">
+ Cihaz Yok
+ </string>
+ <string name="name_default_system_device">
+ Varsayılan Sistem Cihazı
+ </string>
+ <text name="Input">
+ Girdi
+ </text>
+ <text name="Output">
+ Çıktı
+ </text>
+ <text name="My volume label">
+ Ses düzeyim:
+ </text>
+ <slider_bar initial_value="1.0" name="mic_volume_slider" tool_tip="Bu kaydırıcıyı kullanarak ses düzeyini değiştirin"/>
+ <text name="wait_text">
+ Lütfen bekleyin
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_stand_stop_flying.xml b/indra/newview/skins/default/xui/tr/panel_stand_stop_flying.xml
new file mode 100644
index 0000000000..91d07a3b0c
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_stand_stop_flying.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Width and height of this panel should be synchronized with "panel_modes" in the floater_moveview.xml-->
+<panel name="panel_stand_stop_flying">
+ <button label="Ayağa Kalk" name="stand_btn" tool_tip="Kalkmak için buraya tıklayın."/>
+ <button label="Uçmayı Durdur" name="stop_fly_btn" tool_tip="Uçmayı durdur"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_status_bar.xml b/indra/newview/skins/default/xui/tr/panel_status_bar.xml
new file mode 100644
index 0000000000..178cbda4a2
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_status_bar.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="status">
+ <panel.string name="packet_loss_tooltip">
+ Paket Kaybı
+ </panel.string>
+ <panel.string name="bandwidth_tooltip">
+ Bant geniÅŸliÄŸi
+ </panel.string>
+ <panel.string name="time">
+ [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]
+ </panel.string>
+ <panel.string name="timeTooltip">
+ [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]
+ </panel.string>
+ <panel.string name="buycurrencylabel">
+ L$ [AMT]
+ </panel.string>
+ <panel left="-425" name="balance_bg" width="215">
+ <text name="balance" tool_tip="L$ bakiyenizi yenilemek için buraya tıklayın" value="L$20"/>
+ <button label="L$ Satın Al" name="buyL" tool_tip="Daha fazla L$ satın almak için tıklayın"/>
+ <button label="Alışveriş yap" name="goShop" tool_tip="Second Life Pazaryeri Aç" width="95"/>
+ </panel>
+ <text name="TimeText" tool_tip="Geçerli zaman (Pasifik)">
+ 24:00 AM PST
+ </text>
+ <button name="media_toggle_btn" tool_tip="Tüm Ortam Öğelerini Başlat/Durdur (Müzik, Video, Web sayfaları)"/>
+ <button name="volume_btn" tool_tip="Küresel Ses Kontrolü"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_teleport_history.xml b/indra/newview/skins/default/xui/tr/panel_teleport_history.xml
new file mode 100644
index 0000000000..f5b1175029
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_teleport_history.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="Teleport History">
+ <accordion name="history_accordion">
+ <no_matched_tabs_text name="no_matched_teleports_msg" value="Aradığınızı bulamadınız mı? [secondlife:///app/search/places/[SEARCH_TERM] Arama] ile bulmayı deneyin."/>
+ <no_visible_tabs_text name="no_teleports_msg" value="Işınlanma geçmişi boş. [secondlife:///app/search/places/ Arama] yapmayı deneyin."/>
+ <accordion_tab name="today" title="Bugün"/>
+ <accordion_tab name="yesterday" title="Dün"/>
+ <accordion_tab name="2_days_ago" title="2 gün önce"/>
+ <accordion_tab name="3_days_ago" title="3 gün önce"/>
+ <accordion_tab name="4_days_ago" title="4 gün önce"/>
+ <accordion_tab name="5_days_ago" title="5 gün önce"/>
+ <accordion_tab name="6_days_and_older" title="6 gün önce ve daha eski"/>
+ <accordion_tab name="1_month_and_older" title="1 ay önce ve daha eski"/>
+ <accordion_tab name="6_months_and_older" title="6 ay önce ve daha eski"/>
+ </accordion>
+ <panel name="bottom_panel">
+ <menu_button name="gear_btn" tool_tip="İlave seçenekleri göster"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_teleport_history_item.xml b/indra/newview/skins/default/xui/tr/panel_teleport_history_item.xml
new file mode 100644
index 0000000000..a3a5c70c7e
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_teleport_history_item.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="teleport_history_item">
+ <text name="region" value="..."/>
+ <button name="profile_btn" tool_tip="Envanter bilgilerini göster"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_voice_effect.xml b/indra/newview/skins/default/xui/tr/panel_voice_effect.xml
new file mode 100644
index 0000000000..b46833d7e6
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_voice_effect.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_voice_effect">
+ <string name="no_voice_effect">
+ Ses Şekillendirme Kapalı
+ </string>
+ <string name="preview_voice_effects">
+ Ses Şekillendirme Önizleme ▶
+ </string>
+ <string name="get_voice_effects">
+ Ses Åžekillendirmeyi EtkinleÅŸtir â–¶
+ </string>
+ <combo_box name="voice_effect" tool_tip="Sesinizi değiştirmek için bir Ses Şekli seçin">
+ <combo_box.item label="Ses Şekillendirme Kapalı" name="no_voice_effect"/>
+ </combo_box>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_world_map.xml b/indra/newview/skins/default/xui/tr/panel_world_map.xml
new file mode 100644
index 0000000000..5595c13a7c
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/panel_world_map.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="world_map">
+ <panel.string name="Loading">
+ Yükleniyor...
+ </panel.string>
+ <panel.string name="InvalidLocation">
+ Geçersiz Konum
+ </panel.string>
+ <panel.string name="world_map_north">
+ K
+ </panel.string>
+ <panel.string name="world_map_east">
+ D
+ </panel.string>
+ <panel.string name="world_map_west">
+ B
+ </panel.string>
+ <panel.string name="world_map_south">
+ G
+ </panel.string>
+ <panel.string name="world_map_southeast">
+ GD
+ </panel.string>
+ <panel.string name="world_map_northeast">
+ KD
+ </panel.string>
+ <panel.string name="world_map_southwest">
+ GB
+ </panel.string>
+ <panel.string name="world_map_northwest">
+ KB
+ </panel.string>
+ <panel.string name="world_map_person">
+ 1 kiÅŸi
+ </panel.string>
+ <panel.string name="world_map_people">
+ [NUMBER] kiÅŸi
+ </panel.string>
+ <text label="K" name="floater_map_north">
+ K
+ </text>
+ <text label="D" name="floater_map_east">
+ D
+ </text>
+ <text label="B" name="floater_map_west">
+ B
+ </text>
+ <text label="G" name="floater_map_south">
+ G
+ </text>
+ <text label="GD" name="floater_map_southeast">
+ GD
+ </text>
+ <text label="KD" name="floater_map_northeast">
+ KD
+ </text>
+ <text label="GB" name="floater_map_southwest">
+ GB
+ </text>
+ <text label="KB" name="floater_map_northwest">
+ KB
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/role_actions.xml b/indra/newview/skins/default/xui/tr/role_actions.xml
new file mode 100644
index 0000000000..655ac64172
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/role_actions.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<role_actions>
+ <action_set description="Bu Yetenekler arasında gruba Üye ekleme ve çıkarma ile davetiye olmadan yeni Üyelerin katılmasına imkan tanıma yer alır." name="Membership">
+ <action description="Kişileri Bu Gruba Davet Et" longdescription="Roller bölümü &gt; Üyeler sekmesindeki &quot;Davet Et&quot; düğmesini kullanarak Kişileri Bu Gruba davet et" name="member invite" value="1"/>
+ <action description="Üyeleri Bu Gruptan Çıkar" longdescription="Roller bölümü &gt; Üyeler sekmesindeki &quot;Çıkar&quot; düğmesini kullanarak Üyeleri Bu Gruptan çıkar. Bir Sahip, başka bir Sahip dışında herkesi çıkartabilir. Eğer bir Sahip değilseniz, bir Üyenin bir gruptan çıkarılmasının tek yolu, Herkes Rolünde olmaları ve başka hiçbir Rolde OLMAMALARIDIR. Üyeleri Rollerden çıkarmak için, &quot;Üyeleri Rollerden Çıkar&quot; Yeteneğine sahip olmalısınız." name="member eject" value="2"/>
+ <action description="&quot;Katılıma Açık&quot; için Aç/Kapa yapın ve &quot;Kayıt Ücretini&quot; değiştirin" longdescription="Yeni üyelerin davetiye olmadan katılmasına imkan tanımak amacıyla &quot;Katılıma Açık&quot; için Aç/Kapa yapın ve Genel bölümünde &quot;Kayıt Ücretini&quot; değiştirin" name="member options" value="3"/>
+ </action_set>
+ <action_set description="Bu Yetenekler arasında grup Rolleri ekleme, kaldırma ve değiştirme; Rollere Üye ekleme ve kaldırma ile Rollere Yetenek atama imkanları yer alır." name="Roles">
+ <action description="Yeni Roller Oluştur" longdescription="Roller bölümü &gt; Roller sekmesinde yeni Roller oluşturun." name="role create" value="4"/>
+ <action description="Rolleri Silin" longdescription="Roller bölümü &gt; Roller sekmesinde Rolleri silin." name="role delete" value="5"/>
+ <action description="Rol adlarını, başlıklarını, açıklamalarını ve Rol üyelerinin kamuyla paylaşılıp paylaşılmadığını değiştirin" longdescription="Rol adlarını, başlıklarını, açıklamalarını ve Rol üyelerinin kamuyla paylaşılıp paylaşılmadığını değiştirin. Bu işlem, bir Rol seçtikten sonra Roller bölümü &gt; Roller sekmesinin altında yapılır." name="role properties" value="6"/>
+ <action description="Üyeleri Atayan Rollerine Atama" longdescription="Üyeleri Atanmış Roller listesindeki Rollere atayın (Roller bölümü &gt; Üyeler sekmesi). Bu Yeteneğe sahip bir Üye, sadece atayanın zaten olduğu bir Role Üye ekleyebilir." name="role assign member limited" value="7"/>
+ <action description="Üyelere Herhangi bir Role Atama" longdescription="Üyeleri Atanmış Roller listesindeki Herhangi Bir Role atayın (Roller bölümü &gt; Üyeler sekmesi). *UYARI* Bu Yeteneğe sahip olan bir Roldeki herhangi bir Üye kendisini -- ve başka herhangi bir Sahip olmayan Üyeyi -- şu anda sahip olduklarından daha fazla güce sahip olan Rollere atayabilir, kendi güçlerini Grup Sahibininkine yakın bir güce yükseltebilir. Bu Yeteneği atamadan önce ne yaptığınızı bildiğinizden emin olun." name="role assign member" value="8"/>
+ <action description="Üyeleri Rollerden Çıkarma" longdescription="Üyeleri Atanmış Roller listesindeki Rollerden çıkartın (Roller bölümü &gt; Üyeler sekmesi). Sahipler çıkartılamaz." name="role remove member" value="9"/>
+ <action description="Rollere Yetenek Atama ve Kaldırma" longdescription="İzin Verilen Yetenekler listesindeki her bir Rol için Rollere Yetenek Atayın ve Kaldırın ((Roller bölümü &gt; Üyeler sekmesi). *UYARI* Bu Yeteneğe sahip olan bir Roldeki herhangi bir Üye kendisine -- ve diğer tüm Sahip olmayan Üyelere -- tüm Yetenekleri atayabilir, kendi güçlerini Grup Sahibininkine yakın bir güce yükseltebilir. Bu Yeteneği atamadan önce ne yaptığınızı bildiğinizden emin olun." name="role change actions" value="10"/>
+ </action_set>
+ <action_set description="Bu Yetenekler arasında grubun kimliğini değiştirme imkanları bulunmaktadır: Örneğin bilgilerin kamuya açıklığı, grup bildirgesi ve işaretleri." name="Group Identity">
+ <action description="Grup Bildirgesini, İşaretlerini ve &quot;Aramada gösterilsin&quot; ayarını değiştirme" longdescription="Grup Bildirgesini, İşaretlerini ve &quot;Aramada gösterilsin&quot; ayarını değiştirin. Bu işlem Genel bölümde yapılır." name="group change identity" value="11"/>
+ </action_set>
+ <action_set description="Bu Yetenekler arasında grubun sahip olduğu arazileri devretme, değiştirme ve satma imkanları vardır. Arazi Hakkında penceresine gitmek için, zemine sağ tıklayın ve &quot;Arazi Hakkında&quot; seçimini yapın ya da Gezinme Çubuğunda &quot;i&quot; simgesine tıklayın." name="Parcel Management">
+ <action description="Arazi devretme ve grup için arazi satın alma" longdescription="Arazi devredin ve grup için arazi satın alın. Bu işlem Arazi Hakkında &gt; Genel sekmesinde yapılır." name="land deed" value="12"/>
+ <action description="Vali Linden&apos;e arazi terketme" longdescription="Vali Linden&apos;e arazi terkedin. *UYARI* Bu Yeteneğe sahip bir Roldeki herhangi bir Üye, Arazi Hakkında &gt; Genel sekmesinde grubun sahip olduğu araziyi terkedebilir ve bir satış olmaksızın bunu Linden mülkiyetine geçirebilir. Bu Yeteneği atamadan önce ne yaptığınızı bildiğinizden emin olun." name="land release" value="13"/>
+ <action description="Araziyi satışa çıkarma" longdescription="Araziyi satışa çıkarın. *UYARI* Bu Yeteneğe sahip bir Roldeki herhangi bir Üye, Arazi Hakkında &gt; Genel sekmesinde grubun sahip olduğu arazileri istedikleri gibi satabilir! Bu Yeteneği atamadan önce ne yaptığınızı bildiğinizden emin olun." name="land set sale info" value="14"/>
+ <action description="Parselleri bölme ve birleştirme" longdescription="Parselleri bölün ve birleştirin. Bunu yapmak için zemine sağ tıklayın, &quot;Yüzeyi Düzenle&quot; seçimini yapın ve farenizi arazi üzerinde sürükleyerek bir seçim yapın. Araziyi bölmek için, bölmek istediğiniz araziyi seçin ve &quot;Böl&quot; üzerine tıklayın. Birleştirmek için, birbirine komşu iki veya daha fazla sayıda parsel seçin ve &quot;Birleştir&quot; üzerine tıklayın." name="land divide join" value="15"/>
+ </action_set>
+ <action_set description="Bu yetenekler arasında parsel adını ve yayınlama ayarlarını, Bul dizinindeki görünürlük ile iniş noktası ve TP yönlendirme seçeneklerini değiştirme imkanları yer alır." name="Parcel Identity">
+ <action description="&apos;Konumu Arama Sonuçlarında Göster&apos; seçeneğini Aç/Kapa ve kategoriyi ayarla" longdescription="Arazi Hakkında &gt; Seçenekler sekmesinden &apos;Konumu Arama Sonuçlarında Göster&apos; seçeneğini Açın/Kapayın ve parsel kategorisini ayarlayın." name="land find places" value="17"/>
+ <action description="Parsel adını, açıklamasını ve &quot;Konumu Arama Sonuçlarında Göster&quot; ayarlarını değiştir" longdescription="Parsel adını, açıklamasını ve &quot;Konumu Arama Sonuçlarında Göster&quot; ayarlarını değiştirin. Bu işlem Arazi Hakkında &gt; Seçenekler sekmesinde yapılır." name="land change identity" value="18"/>
+ <action description="İniş noktasını ve ışınlama yönlendirmesini ayarlayın" longdescription="Bir grubun sahip olduğu parsel üzerinde, bu Yeteneğe sahip olan bir Roldeki Üyeler gelen ışınlanmaların varacağı iniş noktasını ve daha fazla kontrol için ışınlama yönlendirmesini ayarlayabilirler. Bu işlem Arazi Hakkında &gt; Seçenekler sekmesinde yapılır." name="land set landing point" value="19"/>
+ </action_set>
+ <action_set description="Bu Yeteneklere &apos;Nesneleri Oluştur&apos;, &apos;Yüzeyi Düzenle&apos;, müzik ve ortam ayarları gibi parsel seçeneklerini etkileyen güçler de dahildir." name="Parcel Settings">
+ <action description="Müziği &amp; ortam ayarlarını değiştir" longdescription="Akış müziğini ve film ayarlarını Arazi Hakkında &gt; Ortam sekmesinden değiştirin." name="land change media" value="20"/>
+ <action description="&apos;Yüzeyi Düzenle&apos; seçeneğini Aç/Kapa" longdescription="&apos;Yüzeyi Düzenle&apos; seçeneğini açın/kapatın. *UYARI* Arazi Hakkında &gt; Seçenekler sekmesi &gt; Yüzeyi Düzenle seçeneği, herhangi bir kişinin arazinizin şeklini değiştirmesine, Linden bitkileri yerleştirmesine ve bu bitkilerin yerlerini değiştirmesine izin verir. Bu Yeteneği atamadan önce ne yaptığınızı bildiğinizden emin olun. Yüzey düzenleme seçeneği Arazi Hakkında &gt; Seçenekler sekmesinden açılıp kapanır." name="land edit" value="21"/>
+ <action description="Arazi Hakkında &gt; Seçenekler sekmesindeki çeşitli ayarları Aç/Kapa" longdescription="&apos;Güvenli (hasar yok)&apos;, &apos;Uç&apos; ve diğer Second Life Sakinlerinin &apos;Yüzeyi Düzenle&apos;, &apos;İnşa Et&apos;, &apos;Yer İmleri Oluştur&apos; ve &apos;Komut Dosyalarını Çalıştır&apos; yeteneklerini grubun sahip olduğu arazi üzerinde kullanmalarına izin verme tercihini Arazi Hakkında &gt; Seçenekler sekmesinden açın/kapayın." name="land options" value="22"/>
+ </action_set>
+ <action_set description="Bu Yeteneklere Üyelerin grubun sahip olduğu parseller üzerindeki kısıtlamaları geçmesine izin veren güçler de dahildir." name="Parcel Powers">
+ <action description="&apos;Yüzeyi Düzenle&apos; yeteneğine her zaman izin ver" longdescription="Bu Yeteneğe sahip olan bir Roldeki Üyeler, Arazi Hakkında &gt; Seçenekler sekmesinde kapalı olsa da grubun sahip olduğu parsel üzerinde yüzey düzenleme yapabilir." name="land allow edit land" value="23"/>
+ <action description="&apos;Uç&apos; yeteneğine her zaman izin ver" longdescription="Bu Yeteneğe sahip olan bir Roldeki Üyeler, Arazi Hakkında &gt; Seçenekler sekmesinde kapalı olsa da grubun sahip olduğu parsel üzerinde uçabilir." name="land allow fly" value="24"/>
+ <action description="&apos;Nesneleri Oluştur&apos; yeteneğine her zaman izin ver" longdescription="Bu Yeteneğe sahip olan bir Roldeki Üyeler, Arazi Hakkında &gt; Seçenekler sekmesinde kapalı olsa da grubun sahip olduğu parsel üzerinde nesne oluşturabilirler." name="land allow create" value="25"/>
+ <action description="&apos;Yer İmi Oluştur&apos; yeteneğine her zaman izin ver" longdescription="Bu Yeteneğe sahip olan bir Roldeki Üyeler, Arazi Hakkında &gt; Seçenekler sekmesinde kapalı olsa da grubun sahip olduğu parsel üzerinde yer imi oluşturabilirler." name="land allow landmark" value="26"/>
+ <action description="Grup arazisi üzerinde &apos;Ana Konumu Burası Olarak Seç&apos; yeteneğine izin ver" longdescription="Bu Yeteneğe sahip olan bir Roldeki Üyeler, bu gruba devrediilmiş bir parsel üzerinde Dünya menüsü &gt; Yer imleri &gt; Ana Konumu Burası Olarak Seç seçeneğini kullanabilirler." name="land allow set home" value="28"/>
+ <action description="Grup arazisi üzerinde &apos;Etkinliğe Ev Sahipliği Yap&apos; yeteneğine izin ver" longdescription="Bu Yeteneğe sahip bir Roldeki Üyeler bir etkinliğe ev sahipliği yapmak için grubun sahip olduğu parselleri mekan olarak seçebilirler." name="land allow host event" value="41"/>
+ </action_set>
+ <action_set description="Bu Yeteneklere, grubun sahip olduğu parsellere erişime izin verme veya buralara erişimi yasaklama ve Second Life Sakinlerini dondurma veya parselden dışarı çıkarma da dahildir." name="Parcel Access">
+ <action description="Parselin Erişim listelerini yönet" longdescription="Parselin Erişim listelerini Arazi Hakkında &gt; Erişim sekmesinden yönetin." name="land manage allowed" value="29"/>
+ <action description="Parselin Yasaklama listelerini yönet" longdescription="Parselin Yasaklama listelerini Arazi Hakkında &gt; Erişim sekmesinden yönetin." name="land manage banned" value="30"/>
+ <action description="Parselin &apos;Geçiş haklr. şuna sat&apos; ayarlarını değiştir" longdescription="Parselin &apos;Geçiş haklr. şuna sat&apos; ayarlarını Arazi Hakkında &gt; Erişim sekmesinden değiştirin." name="land manage passes" value="31"/>
+ <action description="Parsel üzerindeki Second Life Sakinlerini dışarı çıkar veya dondur" longdescription="Bu Yeteneğe sahip olan bir Roldeki Üyeler, grubun sahip olduğu bir parsel üzerinde olmasını istemedikleri bir Second Life sakininin üzerini sağ tıklatıp &apos;Dışarı Çıkar&apos; veya &apos;Dondur&apos;u seçebilirler." name="land admin" value="32"/>
+ </action_set>
+ <action_set description="Bu Yeteneklere üyelerin nesneleri iade etmelerine, Linden bitkilerini yerleştirmelerine ve bu bitkilerin yerlerini değiştirmelerine izin veren güçler de dahildir. Bu özellik, Üyelerin çöpleri temizlemeleri ve bahçe düzenlemesi yapmaları için kullanışlıdır; fakat dikkatle kullanılmalıdır, çünkü nesneleri iade etmenin geri alınma imkanı yoktur." name="Parcel Content">
+ <action description="Grubun sahip olduğu nesneleri iade et" longdescription="Grubun sahip olduğu parseller üzerinde grubun sahip olduğu nesneleri Arazi Hakkında &gt; Nesneler sekmesinden iade edin." name="land return group owned" value="48"/>
+ <action description="Gruba ayrılan nesneleri iade et" longdescription="Grubun sahip olduğu parseller üzerinde gruba ayrılan nesneleri Arazi Hakkında &gt; Nesneler sekmesinden iade edin." name="land return group set" value="33"/>
+ <action description="Gruba ait olmayan nesneleri iade et" longdescription="Grubun sahip olduğu parseller üzerinde gruba ait olmayan nesneleri Arazi Hakkında &gt; Nesneler sekmesinden iade edin." name="land return non group" value="34"/>
+ <action description="Linden bitkilerini kullanarak bahçe düzenleme" longdescription="Linden ağaçlarını, bitkilerini ve çimleri yerleştirerek veya yerlerini değiştirerek bahçe düzenleme yeteneği. Bu öğeler envanterinizin Kütüphane &gt; Nesneler klasörü içinde bulunabilir veya İnşa Et menüsünden oluşturulabilir." name="land gardening" value="35"/>
+ </action_set>
+ <action_set description="Bu Yeteneklere grubun sahip olduğu nesneleri devretme, değiştirme ve satma güçleri de dahildir. Bu değişiklikler İnşa Et Araçları &gt; Genel sekmesinden yapılabilir. Bir nesneyi sağ tıklatıp Düzenle&apos;yi seçerek ayarlarını görebilirsiniz." name="Object Management">
+ <action description="Nesneleri gruba devret" longdescription="Nesneleri İnşa Et Araçları &gt; Genel sekmesinden gruba devredin." name="object deed" value="36"/>
+ <action description="Grubun sahip olduğu nesneleri kullan (taşı, kopyala, değiştir)" longdescription="Grubun sahip olduğu nesneleri, İnşa Et Araçları &gt; Genel sekmesi üzerinden kullanın (taşıyın, kopyalayın, değiştirin)." name="object manipulate" value="38"/>
+ <action description="Grubun sahip olduğu nesneleri satışa çıkar" longdescription="Grubun sahip olduğu nesneleri İnşa Et Araçları &gt; Genel sekmesinden satışa çıkarın." name="object set sale" value="39"/>
+ </action_set>
+ <action_set description="Bu Yeteneklere Üyelerin grup borçlarını ödemesini ve grup kâr paylarını almasını sağlayan ve grup hesabının geçmiş bilgilerine erişimi sınırlandıran güçler de dahildir." name="Accounting">
+ <action description="Grup borçlarını öde ve grup kâr paylarını al" longdescription="Bu Yeteneğe sahip bir Roldeki Üyeler otomatik olarak grup borçlarını ödeyecek ve grup kâr paylarını alacaktır. Bu da grubun sahip olduğu arazi satışlarından kendilerine düşen ve günlük olarak dağıtılan ksımı alacakları gibi parsel için ilan verme ücreti gibi masraflara da katkıda bulunacakları anlamına gelir." name="accounting accountable" value="40"/>
+ </action_set>
+ <action_set description="Bu Yeteneklere Üyelerin grup Bildirimlerini gönderme, alma ve görüntüleme imkanı tanıyan güçler de dahildir." name="Notices">
+ <action description="Bildirimleri Gönder" longdescription="Bu Yeteneğe sahip bir Roldeki Üyeler Grup &gt; Bildirimler bölümünden Bildirimleri gönderebilir." name="notices send" value="42"/>
+ <action description="Bildirimleri Al ve eski Bildirimleri görüntüle" longdescription="Bu Yeteneğe sahip bir Roldeki Üyeler Bildirim alabilir ve Grup &gt; Bildirimler bölümündeki eski Bildirimleri görüntüleyebilir." name="notices receive" value="43"/>
+ </action_set>
+ <action_set description="Bu Yetenekler arasında grup sohbet oturumlarına ve grup sesli sohbetlerine izin verme veya bunları kısıtlama yetkileri de dahildir." name="Chat">
+ <action description="Grup Sohbetine Katıl" longdescription="Bu Yeteneğe sahip bir Roldeki Üyeler yazılı ve sesli grup sohbet oturumlarına katılabilir." name="join group chat" value="16"/>
+ <action description="Grup Sesli Sohbetine Katıl" longdescription="Bu Yeteneğe sahip bir Roldeki Üyeler grup sesli sohbet oturumlarına katılabilir. NOT: Sesli sohbet oturumuna erişim için Grup Sohbetine Katıl yeteneği gereklidir." name="join voice chat" value="27"/>
+ <action description="Grup Sohbetini Yönet" longdescription="Bu Yeteneğe sahip bir Roldeki Üyeler grup sesli ve yazılı sohbet oturumlarına errişimi ve katılımı kontrol edebilir." name="moderate group chat" value="37"/>
+ </action_set>
+</role_actions>
diff --git a/indra/newview/skins/default/xui/tr/sidepanel_appearance.xml b/indra/newview/skins/default/xui/tr/sidepanel_appearance.xml
new file mode 100644
index 0000000000..b632f21cf5
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/sidepanel_appearance.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Dış Görünümler" name="appearance panel">
+ <string name="No Outfit" value="Dış Görünüm Yok"/>
+ <string name="Unsaved Changes" value="KaydedilmemiÅŸ deÄŸiÅŸiklikler"/>
+ <string name="Now Wearing" value="Åžimdi giyiyor..."/>
+ <string name="Changing outfits" value="Dış görünümler değiştiriliyor"/>
+ <panel name="panel_currentlook">
+ <button label="E" name="editappearance_btn"/>
+ <button label="O" name="openoutfit_btn"/>
+ <text name="currentlook_status">
+ (Durum)
+ </text>
+ <text name="currentlook_name">
+ MOOSE gibi gerçekten Uzun bir Adla Dış Görünümüm
+ </text>
+ <button label="" name="edit_outfit_btn" tool_tip="Bu dış görünümü düzenle"/>
+ </panel>
+ <filter_editor label="Dış Görünümleri Filtrele" name="Filter"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/sidepanel_inventory.xml b/indra/newview/skins/default/xui/tr/sidepanel_inventory.xml
new file mode 100644
index 0000000000..938b5a76d8
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/sidepanel_inventory.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="EÅŸyalar" name="objects panel">
+ <panel label="" name="sidepanel__inventory_panel">
+ <layout_stack name="inventory_layout_stack">
+ <layout_panel name="inbox_layout_panel">
+ <panel label="" name="marketplace_inbox">
+ <string name="InboxLabelWithArg">
+ Alınan öğeler ([NUM])
+ </string>
+ <string name="InboxLabelNoArg">
+ Alınan öğeler
+ </string>
+ <button label="Alınan öğeler" name="inbox_btn"/>
+ <text name="inbox_fresh_new_count">
+ [NUM] yeni
+ </text>
+ <panel name="inbox_inventory_placeholder_panel" tool_tip="Öğeleri kullanmak için bunları sürükleyin ve envanterinize bırakın">
+ <text name="inbox_inventory_placeholder">
+ Pazaryerinden satın alınan öğeler buraya teslim edilir.
+ </text>
+ </panel>
+ </panel>
+ </layout_panel>
+ </layout_stack>
+ <panel name="button_panel">
+ <layout_stack name="button_panel_ls">
+ <layout_panel name="info_btn_lp">
+ <button label="Profil" name="info_btn" tool_tip="Nesne profilini göster"/>
+ </layout_panel>
+ <layout_panel name="share_btn_lp">
+ <button label="Paylaş" name="share_btn" tool_tip="Bir envanter öğesini paylaş"/>
+ </layout_panel>
+ <layout_panel name="shop_btn_lp">
+ <button label="Alışveriş yap" name="shop_btn" tool_tip="Pazaryeri web sayfasını aç"/>
+ <button label="Giy" name="wear_btn" tool_tip="Seçilen dış görünümü giy"/>
+ <button label="Oyna" name="play_btn"/>
+ <button label="Işınla" name="teleport_btn" tool_tip="Seçilen alana ışınla"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/sidepanel_item_info.xml b/indra/newview/skins/default/xui/tr/sidepanel_item_info.xml
new file mode 100644
index 0000000000..81291a431c
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/sidepanel_item_info.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="item properties" title="Öğe Profili">
+ <panel.string name="unknown">
+ (bilinmiyor)
+ </panel.string>
+ <panel.string name="public">
+ (kamuya açık)
+ </panel.string>
+ <panel.string name="you_can">
+ Åžunu yapabilirsiniz:
+ </panel.string>
+ <panel.string name="owner_can">
+ Sahip ÅŸunu yapabilir:
+ </panel.string>
+ <panel.string name="acquiredDate">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </panel.string>
+ <panel.string name="origin_inventory">
+ (Envanter)
+ </panel.string>
+ <panel.string name="origin_inworld">
+ (SL Dünyası)
+ </panel.string>
+ <text name="title" value="Öğe Profili"/>
+ <text name="origin" value="(Envanter)"/>
+ <scroll_container name="item_profile_scroll">
+ <panel label="" name="item_profile">
+ <text name="LabelItemNameTitle">
+ Ad:
+ </text>
+ <text name="LabelItemDescTitle">
+ Açıklama:
+ </text>
+ <text name="LabelCreatorTitle">
+ OluÅŸturan:
+ </text>
+ <text name="LabelOwnerTitle">
+ Sahip:
+ </text>
+ <text name="LabelAcquiredTitle">
+ Alınan:
+ </text>
+ <panel name="perms_inv">
+ <text name="perm_modify">
+ Åžunu yapabilirsiniz:
+ </text>
+ <check_box label="DeÄŸiÅŸtir" name="CheckOwnerModify"/>
+ <check_box label="Kopyala" name="CheckOwnerCopy"/>
+ <check_box label="Aktar" name="CheckOwnerTransfer"/>
+ <text name="AnyoneLabel">
+ Herkes:
+ </text>
+ <check_box label="Kopyala" name="CheckEveryoneCopy"/>
+ <text name="GroupLabel">
+ Grup:
+ </text>
+ <check_box label="Paylaş" name="CheckShareWithGroup" tool_tip="Ayarlanan grubun tüm üyelerinin, bu nesne için değiştirme izinlerinizi paylaşmasına izin verir. Rol kısıtlamalarını etkinleştirmek için Devretme yapmalısınız."/>
+ <text name="NextOwnerLabel">
+ Sonraki sahip:
+ </text>
+ <check_box label="DeÄŸiÅŸtir" name="CheckNextOwnerModify"/>
+ <check_box label="Kopyala" name="CheckNextOwnerCopy"/>
+ <check_box label="Aktar" name="CheckNextOwnerTransfer" tool_tip="Sonraki sahibi bu nesneyi verebilir veya tekrar satabilir"/>
+ </panel>
+ <check_box label="Satılık" name="CheckPurchase"/>
+ <combo_box name="combobox sale copy">
+ <combo_box.item label="Kopyala" name="Copy"/>
+ <combo_box.item label="Orijinal" name="Original"/>
+ </combo_box>
+ <spinner label="Fiyat: L$" name="Edit Cost"/>
+ </panel>
+ </scroll_container>
+ <panel name="button_panel">
+ <button label="Ä°ptal" name="cancel_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/sidepanel_task_info.xml b/indra/newview/skins/default/xui/tr/sidepanel_task_info.xml
new file mode 100644
index 0000000000..2fa6281f05
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/sidepanel_task_info.xml
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="object properties" title="Nesne Profili">
+ <panel.string name="text deed continued">
+ Devret
+ </panel.string>
+ <panel.string name="text deed">
+ Devret
+ </panel.string>
+ <panel.string name="text modify info 1">
+ Bu nesneyi deÄŸiÅŸtirebilirsiniz
+ </panel.string>
+ <panel.string name="text modify info 2">
+ Bu nesneleri deÄŸiÅŸtirebilirsiniz
+ </panel.string>
+ <panel.string name="text modify info 3">
+ Bu nesneyi deÄŸiÅŸtiremezsiniz
+ </panel.string>
+ <panel.string name="text modify info 4">
+ Bu nesneleri deÄŸiÅŸtiremezsiniz
+ </panel.string>
+ <panel.string name="text modify warning">
+ Bu nesne bağlantılı parçalara sahip
+ </panel.string>
+ <panel.string name="Cost Default">
+ Fiyat: L$
+ </panel.string>
+ <panel.string name="Cost Total">
+ Toplam Fiyat: L$
+ </panel.string>
+ <panel.string name="Cost Per Unit">
+ Birim Fiyatı: L$
+ </panel.string>
+ <panel.string name="Cost Mixed">
+ Karma Fiyat
+ </panel.string>
+ <panel.string name="Sale Mixed">
+ Karma Satış
+ </panel.string>
+ <text name="title" value="Nesne Profili"/>
+ <text name="where" value="(SL Dünyası)"/>
+ <panel label="" name="properties_panel">
+ <text name="Name:">
+ Ad:
+ </text>
+ <text name="Description:">
+ Açıklama:
+ </text>
+ <text name="CreatorNameLabel">
+ OluÅŸturan:
+ </text>
+ <text name="Owner:">
+ Sahip:
+ </text>
+ <text name="Group_label">
+ Grup:
+ </text>
+ <button name="button set group" tool_tip="Bu nesnenin izinlerini paylaşmak için bir grup seçin"/>
+ <name_box initial_value="Yükleniyor..." name="Group Name Proxy"/>
+ <button label="Devret" label_selected="Devret" name="button deed" tool_tip="Bu nesne devredilerek verildiğinde, nesnenin sonraki sahibi için izinler geçerli olur. Grup içerisinde paylaşılan nesneler bir grup yetkilisi tarafından devredilebilir."/>
+ <text name="label click action">
+ Şu eylem için tıklayın:
+ </text>
+ <combo_box name="clickaction">
+ <combo_box.item label="Dokun (varsayılan)" name="Touch/grab(default)"/>
+ <combo_box.item label="Nesnenin üzerine otur" name="Sitonobject"/>
+ <combo_box.item label="Nesneyi satın al" name="Buyobject"/>
+ <combo_box.item label="Nesneye ödeme yap" name="Payobject"/>
+ <combo_box.item label="Aç" name="Open"/>
+ </combo_box>
+ <panel name="perms_inv">
+ <text name="perm_modify">
+ Bu nesneyi deÄŸiÅŸtirebilirsiniz
+ </text>
+ <text name="Anyone can:">
+ Herkes:
+ </text>
+ <check_box label="Kopyala" name="checkbox allow everyone copy"/>
+ <check_box label="Hareket Et" name="checkbox allow everyone move"/>
+ <text name="GroupLabel">
+ Grup:
+ </text>
+ <check_box label="Paylaş" name="checkbox share with group" tool_tip="Ayarlanan grubun tüm üyelerinin, bu nesne için değiştirme izinlerinizi paylaşmasına izin verir. Rol kısıtlamalarını etkinleştirmek için Devretme yapmalısınız."/>
+ <text name="NextOwnerLabel">
+ Sonraki sahip:
+ </text>
+ <check_box label="DeÄŸiÅŸtir" name="checkbox next owner can modify"/>
+ <check_box label="Kopyala" name="checkbox next owner can copy"/>
+ <check_box label="Aktar" name="checkbox next owner can transfer" tool_tip="Sonraki sahibi bu nesneyi verebilir veya tekrar satabilir"/>
+ </panel>
+ <check_box label="Satılık" name="checkbox for sale"/>
+ <combo_box name="sale type">
+ <combo_box.item label="Kopyala" name="Copy"/>
+ <combo_box.item label="İçerik" name="Contents"/>
+ <combo_box.item label="Orijinal" name="Original"/>
+ </combo_box>
+ <spinner label="Fiyat: L$" name="Edit Cost"/>
+ <check_box label="Aramada göster" name="search_check" tool_tip="Kişiler arama sonuçlarında bu nesneyi görebilsin"/>
+ <text name="B:">
+ B:
+ </text>
+ <text name="O:">
+ O:
+ </text>
+ <text name="G:">
+ G:
+ </text>
+ <text name="E:">
+ E:
+ </text>
+ <text name="N:">
+ N:
+ </text>
+ <text name="F:">
+ F:
+ </text>
+ </panel>
+ <panel name="button_panel">
+ <button label="Aç" name="open_btn"/>
+ <button label="Öde" name="pay_btn"/>
+ <button label="Satın Al" name="buy_btn"/>
+ <button label="Ayrıntl" name="details_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/tr/strings.xml b/indra/newview/skins/default/xui/tr/strings.xml
new file mode 100644
index 0000000000..2a4e2c20a7
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/strings.xml
@@ -0,0 +1,5025 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- This file contains strings that used to be hardcoded in the source.
+ It is only for those strings which do not belong in a floater.
+ For example, the strings used in avatar chat bubbles, and strings
+ that are returned from one component and may appear in many places-->
+<strings>
+ <string name="SECOND_LIFE">
+ Second Life
+ </string>
+ <string name="APP_NAME">
+ Second Life
+ </string>
+ <string name="CAPITALIZED_APP_NAME">
+ SECOND LIFE
+ </string>
+ <string name="SECOND_LIFE_GRID">
+ Second Life Ağı
+ </string>
+ <string name="SUPPORT_SITE">
+ Second Life Destek Portalı
+ </string>
+ <string name="StartupDetectingHardware">
+ Donanım saptanıyor...
+ </string>
+ <string name="StartupLoading">
+ [APP_NAME] yükleniyor...
+ </string>
+ <string name="StartupClearingCache">
+ Önbellek temizleniyor...
+ </string>
+ <string name="StartupInitializingTextureCache">
+ Doku önbelleği başlatılıyor...
+ </string>
+ <string name="StartupInitializingVFS">
+ VFS Başlatılıyor...
+ </string>
+ <string name="StartupRequireDriverUpdate">
+ Grafik başlatma başarılamadı. Lütfen grafik sürücünüzü güncelleştirin!
+ </string>
+ <string name="ProgressRestoring">
+ Geri yükleniyor...
+ </string>
+ <string name="ProgressChangingResolution">
+ Çözünürlük değiştiriliyor...
+ </string>
+ <string name="Fullbright">
+ Tam parlak (eski)
+ </string>
+ <string name="LoginInProgress">
+ Oturum açılıyor. [APP_NAME] kilitlenmiş görünebilir. Lütfen bekleyin.
+ </string>
+ <string name="LoginInProgressNoFrozen">
+ Oturum açılıyor...
+ </string>
+ <string name="LoginAuthenticating">
+ Kimlik doğrulaması yapılıyor
+ </string>
+ <string name="LoginMaintenance">
+ Hesap bakımı yapılıyor...
+ </string>
+ <string name="LoginAttempt">
+ Önceki oturum açma girişimi başarılamadı. Oturum açılıyor, [NUMBER]. girişim.
+ </string>
+ <string name="LoginPrecaching">
+ Dünya yükleniyor...
+ </string>
+ <string name="LoginInitializingBrowser">
+ Katıştırılmış web tarayıcısı başlatılıyor...
+ </string>
+ <string name="LoginInitializingMultimedia">
+ Multimedya başlatılıyor...
+ </string>
+ <string name="LoginInitializingFonts">
+ Fontlar yükleniyor...
+ </string>
+ <string name="LoginVerifyingCache">
+ Önbellek dosyaları doğrulanıyor (60-90 saniye zaman alabilir)...
+ </string>
+ <string name="LoginProcessingResponse">
+ Yanıt işleniyor...
+ </string>
+ <string name="LoginInitializingWorld">
+ Dünya başlatılıyor...
+ </string>
+ <string name="LoginDecodingImages">
+ Görüntülerin kodu çözülüyor...
+ </string>
+ <string name="LoginInitializingQuicktime">
+ QuickTime Başlatılıyor...
+ </string>
+ <string name="LoginQuicktimeNotFound">
+ QuickTime bulunamadı - başlatılamadı.
+ </string>
+ <string name="LoginQuicktimeOK">
+ QuickTime başarıyla başlatıldı.
+ </string>
+ <string name="LoginRequestSeedCapGrant">
+ Bölge özellikleri talep ediliyor...
+ </string>
+ <string name="LoginRetrySeedCapGrant">
+ Bölge özellikleri talep ediliyor: [NUMBER]. girişim...
+ </string>
+ <string name="LoginWaitingForRegionHandshake">
+ Bölge el sıkışması bekleniyor...
+ </string>
+ <string name="LoginConnectingToRegion">
+ Bölgeye bağlanılıyor...
+ </string>
+ <string name="LoginDownloadingClothing">
+ Giysiler karşıdan yükleniyor...
+ </string>
+ <string name="InvalidCertificate">
+ Sunucu geçersiz veya bozuk bir sertifika döndürdü. Lütfen Ağ yöneticisine başvurun.
+ </string>
+ <string name="CertInvalidHostname">
+ Sunucuya erişmek için geçersiz bir ana bilgisayar adı kullanıldı, lütfen SLURL veya Ağ ana bilgisayar adınızı kontrol edin.
+ </string>
+ <string name="CertExpired">
+ Ağ tarafından döndürülen sertifikanın süresi sona ermiş görünüyor. Lütfen sistem saatinizi kontrol edin veya Ağ yöneticinize başvurun.
+ </string>
+ <string name="CertKeyUsage">
+ Sunucu tarafından döndürülen sertifika SSL için kullanılamadı. Lütfen Ağ yöneticinize başvurun.
+ </string>
+ <string name="CertBasicConstraints">
+ Sunucunun Sertifika zincirinde çok fazla sertifika vardı. Lütfen Ağ yöneticinize başvurun.
+ </string>
+ <string name="CertInvalidSignature">
+ Ağ sunucusu tarafından döndürülen sertifika imzası doğrulanamadı. Lütfen Ağ yöneticinize başvurun.
+ </string>
+ <string name="LoginFailedNoNetwork">
+ Ağ hatası: Bağlantı kurulamadı, lütfen ağ bağlantınızı kontrol edin.
+ </string>
+ <string name="LoginFailed">
+ Oturum açılamadı.
+ </string>
+ <string name="Quit">
+ Çık
+ </string>
+ <string name="create_account_url">
+ http://join.secondlife.com/
+ </string>
+ <string name="LoginFailedViewerNotPermitted">
+ Kullandığınız görüntüleyici ile artık Second Life&apos;a erişemezsiniz. Yeni bir görüntüleyiciyi karşıdan yüklemek için lütfen şu sayfayı ziyaret edin:
+http://secondlife.com/download
+
+Daha fazla bilgi edinmek için asağıdaki SSS sayfamızı ziyaret edin:
+http://secondlife.com/viewer-access-faq
+ </string>
+ <string name="LoginIntermediateOptionalUpdateAvailable">
+ Opsiyonel görüntüleyici güncelleştirmesi mevcut: [VERSION]
+ </string>
+ <string name="LoginFailedRequiredUpdate">
+ Gerekli görüntüleyici güncelleştirmesi: [VERSION]
+ </string>
+ <string name="LoginFailedAlreadyLoggedIn">
+ Bu aracı zaten oturum açmış durumda.
+ </string>
+ <string name="LoginFailedAuthenticationFailed">
+ Üzgünüz! Oturumunuzu açamadık.
+Lütfen şunları doğru girdiğinizi kontrol edin:
+ * Kullanıcı adı (mustafayalcin12 veya faruk.gungoren gibi)
+ * Parola:
+Ayrıca lütfen Caps Lock tuşuna basmadığınıza emin olun.
+ </string>
+ <string name="LoginFailedPasswordChanged">
+ Güvenlik önlemi olarak parolanız değiştirildi.
+Lütfen hesap sayfanıza gidin: http://secondlife.com/password
+ve parolanızı sıfırlamak için güvenlik sorusunu yanıtlayın.
+Bu sorun için özür dileriz.
+ </string>
+ <string name="LoginFailedPasswordReset">
+ Sistemimizde bazı değişiklikler yaptık, parolanızı sıfırlamanız gerekecek.
+Lütfen hesap sayfanıza gidin: http://secondlife.com/password
+ve parolanızı sıfırlamak için güvenlik sorusunu yanıtlayın.
+Bu sorun için özür dileriz.
+ </string>
+ <string name="LoginFailedEmployeesOnly">
+ Second Life bakım amacıyla geçici olarak kapatıldı.
+Şu anda sadece çalışanlar oturum açabilir.
+Güncelleştirmeler için www.secondlife.com/status adresini kontrol edin.
+ </string>
+ <string name="LoginFailedPremiumOnly">
+ Second Life üzerindeki aktif kullanıcıların olası en iyi deneyimi yaşamasını sağlamak için, oturum açılması geçici olarak kısıtlanmıştır.
+
+Second Life için ödeme yapmış olan kişilere öncelik tanımak amacıyla, ücretsiz hesaplara sahip kişiler bu süre içerisinde Second Life&apos;a erişemeyecekler.
+ </string>
+ <string name="LoginFailedComputerProhibited">
+ Second Life&apos;a bu bilgisayardan eriÅŸemezsiniz.
+Bunun bir hata olduğunu düşünüyorsanız, lütfen şu adrese başvurun:
+support@secondlife.com.
+ </string>
+ <string name="LoginFailedAcountSuspended">
+ Hesabınıza şu zamana kadar erişemeyeceksiniz:
+Pasifik Saati ile [TIME].
+ </string>
+ <string name="LoginFailedAccountDisabled">
+ Talebinizi şu anda tamamlayamıyoruz.
+Lütfen yardım almak için Second Life destek bölümüne başvurun: http://secondlife.com/support
+Eğer parolanızı değiştiremiyorsanız, lütfen şu numarayı arayın: (866) 476-9763.
+ </string>
+ <string name="LoginFailedTransformError">
+ Oturum açılması sırasında veri tutarsızlığı saptandı.
+Lütfen şu adrese başvurun: support@secondlife.com
+ </string>
+ <string name="LoginFailedAccountMaintenance">
+ Hesabınızda küçük çaplı bir bakım işlemi sürüyor.
+Hesabınıza şu zamana kadar erişemeyeceksiniz:
+Pasifik Saati ile [TIME].
+Bunun bir hata olduğunu düşünüyorsanız, lütfen şu adrese başvurun: support@secondlife.com
+ </string>
+ <string name="LoginFailedPendingLogoutFault">
+ Oturum kapatma talebi simülatörden bir hata yanıtı gelmesine neden oldu.
+ </string>
+ <string name="LoginFailedPendingLogout">
+ Sistem şu anda oturumunuzu sonlandırıyor.
+Hesabınıza şu zamana kadar erişemeyeceksiniz:
+Pasifik Saati ile [TIME].
+ </string>
+ <string name="LoginFailedUnableToCreateSession">
+ Geçerli bir oturum oluşturulamadı.
+ </string>
+ <string name="LoginFailedUnableToConnectToSimulator">
+ Bir simülatöre bağlanılamadı.
+ </string>
+ <string name="LoginFailedRestrictedHours">
+ Hesabınız Second Life&apos;a sadece
+Pasifik Saati ile [START] ve [END] arasında erişebilir.
+Lütfen bu saatler arasında tekrar uğrayın.
+Bunun bir hata olduğunu düşünüyorsanız, lütfen şu adrese başvurun: support@secondlife.com
+ </string>
+ <string name="LoginFailedIncorrectParameters">
+ Yanlış parametreler.
+Bunun bir hata olduğunu düşünüyorsanız, lütfen şu adrese başvurun: support@secondlife.com
+ </string>
+ <string name="LoginFailedFirstNameNotAlphanumeric">
+ Ad parametresi alfasayısal olmalıdır.
+Bunun bir hata olduğunu düşünüyorsanız, lütfen şu adrese başvurun: support@secondlife.com
+ </string>
+ <string name="LoginFailedLastNameNotAlphanumeric">
+ Soyadı parametresi alfasayısal olmalıdır.
+Bunun bir hata olduğunu düşünüyorsanız, lütfen şu adrese başvurun: support@secondlife.com
+ </string>
+ <string name="LogoutFailedRegionGoingOffline">
+ Bölge şu anda çevrimdışı oluyor.
+Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.
+ </string>
+ <string name="LogoutFailedAgentNotInRegion">
+ Aracı bölgede değil.
+Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.
+ </string>
+ <string name="LogoutFailedPendingLogin">
+ Bu bölge başka bir oturum açmaktaydı.
+Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.
+ </string>
+ <string name="LogoutFailedLoggingOut">
+ Bu bölge önceki oturumu sonlandırmaktaydı.
+Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.
+ </string>
+ <string name="LogoutFailedStillLoggingOut">
+ Bu bölge hala bir önceki oturumu sonlandırma işlemini sürdürüyor.
+Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.
+ </string>
+ <string name="LogoutSucceeded">
+ Bu bölge son oturumu sonlandırdı.
+Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.
+ </string>
+ <string name="LogoutFailedLogoutBegun">
+ Bölge oturumu sonlandırma işlemini başlattı.
+Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.
+ </string>
+ <string name="LoginFailedLoggingOutSession">
+ Sistem son oturumunuzu sonlandırma işlemini başlattı.
+Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.
+ </string>
+ <string name="AgentLostConnection">
+ Bu bölgede sorun yaşanıyor olabilir. Lütfen İnternet bağlantınızı kontrol edin.
+ </string>
+ <string name="SavingSettings">
+ Ayarlarınız kaydediliyor...
+ </string>
+ <string name="LoggingOut">
+ Oturum kapatılıyor...
+ </string>
+ <string name="ShuttingDown">
+ Kapatılıyor...
+ </string>
+ <string name="YouHaveBeenDisconnected">
+ Bulunduğunuz bölgeyle bağlantınız kesildi.
+ </string>
+ <string name="SentToInvalidRegion">
+ Geçersiz bir bölgeye gönderildiniz.
+ </string>
+ <string name="TestingDisconnect">
+ Görüntüleyici bağlantısının kesilmesi test ediliyor
+ </string>
+ <string name="TooltipPerson">
+ KiÅŸi
+ </string>
+ <string name="TooltipNoName">
+ (adsız)
+ </string>
+ <string name="TooltipOwner">
+ Sahip:
+ </string>
+ <string name="TooltipPublic">
+ Kamuya Açık
+ </string>
+ <string name="TooltipIsGroup">
+ (Grup)
+ </string>
+ <string name="TooltipForSaleL$">
+ Satılık: L$[AMOUNT]
+ </string>
+ <string name="TooltipFlagGroupBuild">
+ Grup İnşası
+ </string>
+ <string name="TooltipFlagNoBuild">
+ Ä°nÅŸa Edilemez
+ </string>
+ <string name="TooltipFlagNoEdit">
+ Grup İnşası
+ </string>
+ <string name="TooltipFlagNotSafe">
+ Güvenli Değil
+ </string>
+ <string name="TooltipFlagNoFly">
+ Uçamaz
+ </string>
+ <string name="TooltipFlagGroupScripts">
+ Grup Komut Dosyaları
+ </string>
+ <string name="TooltipFlagNoScripts">
+ Komut Dosyası Yok
+ </string>
+ <string name="TooltipLand">
+ Arazi:
+ </string>
+ <string name="TooltipMustSingleDrop">
+ Buraya sadece bir öğe sürüklenebilir.
+ </string>
+ <string name="TooltipPrice" value="L$[AMOUNT]:"/>
+ <string name="TooltipOutboxDragToWorld">
+ Satıcı giden kutunuzda öğeler oluşturamazsınız
+ </string>
+ <string name="TooltipOutboxNoTransfer">
+ Bu nesnelerden bir veya daha fazlası satılamaz veya aktarılamaz.
+ </string>
+ <string name="TooltipOutboxNotInInventory">
+ Satıcı giden kutunuza sadece doğrudan kendi envanterinizden öğeler koyabilirsiniz
+ </string>
+ <string name="TooltipOutboxWorn">
+ Giymekte olduğunuz öğeleri Satıcı giden kutunuza koyamazsınız.
+ </string>
+ <string name="TooltipOutboxCallingCard">
+ Satıcı giden kutunuza arama kartları koyamazsınız
+ </string>
+ <string name="TooltipOutboxFolderLevels">
+ İç içe geçmiş klasörlerin derinliği üçü geçiyor
+ </string>
+ <string name="TooltipOutboxTooManyFolders">
+ Üst seviyedeki klasördeki alt klasör sayısı 20&apos;yi geçiyor
+ </string>
+ <string name="TooltipOutboxTooManyObjects">
+ Üst seviyedeki klasördeki öğe sayısı 200&apos;ü geçiyor
+ </string>
+ <string name="TooltipDragOntoOwnChild">
+ Bir klasörü alt klasörüne taşıyamazsınız
+ </string>
+ <string name="TooltipDragOntoSelf">
+ Bir klasörü kendi içine taşıyamazsınız
+ </string>
+ <string name="TooltipHttpUrl">
+ Bu web sayfasını görmek için tıklayın
+ </string>
+ <string name="TooltipSLURL">
+ Bu konumun bilgisini görmek için tıklayın
+ </string>
+ <string name="TooltipAgentUrl">
+ Bu Sakinin profilini görmek için tıklayın
+ </string>
+ <string name="TooltipAgentInspect">
+ Bu Sakin hakkında daha fazla bilgi öğrenin
+ </string>
+ <string name="TooltipAgentMute">
+ Bu Sakini engellemek için tıklayın
+ </string>
+ <string name="TooltipAgentUnmute">
+ Bu Sakinin engellemesini kaldırmak için tıklayın
+ </string>
+ <string name="TooltipAgentIM">
+ Bu Sakine Aİ göndermek için tıklayın
+ </string>
+ <string name="TooltipAgentPay">
+ Bu Sakine ödeme yapmak için tıklayın
+ </string>
+ <string name="TooltipAgentOfferTeleport">
+ Bu Sakine bir ışınlama talebi teklif etmek için tıklayın
+ </string>
+ <string name="TooltipAgentRequestFriend">
+ Bu Sakine bir arkadaşlık talebi teklif etmek için tıklayın
+ </string>
+ <string name="TooltipGroupUrl">
+ Bu grubun açıklamasını görmek için tıklayın
+ </string>
+ <string name="TooltipEventUrl">
+ Bu etkinliğin açıklamasını görmek için tıklayın
+ </string>
+ <string name="TooltipClassifiedUrl">
+ Bu ilanı görmek için tıklayın
+ </string>
+ <string name="TooltipParcelUrl">
+ Bu parselin açıklamasını görmek için tıklayın
+ </string>
+ <string name="TooltipTeleportUrl">
+ Bu konuma ışınlama yapmak için tıklayın
+ </string>
+ <string name="TooltipObjectIMUrl">
+ Bu nesnenin açıklamasını görmek için tıklayın
+ </string>
+ <string name="TooltipMapUrl">
+ Bu konumu bir haritada görmek için tıklayın
+ </string>
+ <string name="TooltipSLAPP">
+ secondlife:// komutunu çalıştırmak için tıklayın
+ </string>
+ <string name="CurrentURL" value="Geçerli URL: [CurrentURL]"/>
+ <string name="SLurlLabelTeleport">
+ Şuraya ışınla:
+ </string>
+ <string name="SLurlLabelShowOnMap">
+ Şunun için Harita göster:
+ </string>
+ <string name="SLappAgentMute">
+ Engelle
+ </string>
+ <string name="SLappAgentUnmute">
+ Engellemeyi kaldır
+ </string>
+ <string name="SLappAgentIM">
+ AÄ°
+ </string>
+ <string name="SLappAgentPay">
+ Öde
+ </string>
+ <string name="SLappAgentOfferTeleport">
+ Şuraya Işınlama Teklif Et:
+ </string>
+ <string name="SLappAgentRequestFriend">
+ Arkadaşlık Talebi
+ </string>
+ <string name="BUTTON_CLOSE_DARWIN">
+ Kapat (⌘W)
+ </string>
+ <string name="BUTTON_CLOSE_WIN">
+ Kapat (Ctrl+W)
+ </string>
+ <string name="BUTTON_CLOSE_CHROME">
+ Kapat
+ </string>
+ <string name="BUTTON_RESTORE">
+ Geri Yükle
+ </string>
+ <string name="BUTTON_MINIMIZE">
+ Simge Durumuna Küçült
+ </string>
+ <string name="BUTTON_TEAR_OFF">
+ Böl
+ </string>
+ <string name="BUTTON_DOCK">
+ YerleÅŸtir
+ </string>
+ <string name="BUTTON_HELP">
+ Yardımı Göster
+ </string>
+ <string name="Searching">
+ Arıyor...
+ </string>
+ <string name="NoneFound">
+ Hiçbiri bulunamadı.
+ </string>
+ <string name="RetrievingData">
+ Alınıyor...
+ </string>
+ <string name="ReleaseNotes">
+ Sürüm Notları
+ </string>
+ <string name="LoadingData">
+ Yükleniyor...
+ </string>
+ <string name="AvatarNameNobody">
+ (hiçbiri)
+ </string>
+ <string name="AvatarNameWaiting">
+ (bekliyor)
+ </string>
+ <string name="AvatarNameMultiple">
+ (birden çok)
+ </string>
+ <string name="GroupNameNone">
+ (hiçbiri)
+ </string>
+ <string name="AvalineCaller">
+ Avaline Arayanı [ORDER]
+ </string>
+ <string name="AssetErrorNone">
+ Hata yok
+ </string>
+ <string name="AssetErrorRequestFailed">
+ Varlık talebi: başarısız oldu
+ </string>
+ <string name="AssetErrorNonexistentFile">
+ Varlık talebi: var olmayan dosya
+ </string>
+ <string name="AssetErrorNotInDatabase">
+ Varlık talebi: veri tabanında varlık bulunamadı
+ </string>
+ <string name="AssetErrorEOF">
+ Dosya sonu
+ </string>
+ <string name="AssetErrorCannotOpenFile">
+ Dosya açılamadı
+ </string>
+ <string name="AssetErrorFileNotFound">
+ Dosya bulunamadı
+ </string>
+ <string name="AssetErrorTCPTimeout">
+ Dosya aktarımı zaman aşımı
+ </string>
+ <string name="AssetErrorCircuitGone">
+ Devre yok
+ </string>
+ <string name="AssetErrorPriceMismatch">
+ Görüntüleyici ile sunucu fiyatta anlaşmadı
+ </string>
+ <string name="AssetErrorUnknownStatus">
+ Bilinmeyen durum
+ </string>
+ <string name="texture">
+ doku
+ </string>
+ <string name="sound">
+ ses
+ </string>
+ <string name="calling card">
+ arama kartı
+ </string>
+ <string name="landmark">
+ yer imi
+ </string>
+ <string name="legacy script">
+ eski komut dosyası
+ </string>
+ <string name="clothing">
+ giysi
+ </string>
+ <string name="object">
+ nesne
+ </string>
+ <string name="note card">
+ not kartı
+ </string>
+ <string name="folder">
+ klasör
+ </string>
+ <string name="root">
+ kök
+ </string>
+ <string name="lsl2 script">
+ LSL2 komut dosyası
+ </string>
+ <string name="lsl bytecode">
+ LSL bayt kodu
+ </string>
+ <string name="tga texture">
+ tga dokusu
+ </string>
+ <string name="body part">
+ vücut bölümü
+ </string>
+ <string name="snapshot">
+ anlık görüntü
+ </string>
+ <string name="lost and found">
+ Kaybedip Bulduklarım
+ </string>
+ <string name="targa image">
+ targa görüntüsü
+ </string>
+ <string name="trash">
+ Çöp
+ </string>
+ <string name="jpeg image">
+ jpeg görüntüsü
+ </string>
+ <string name="animation">
+ animasyon
+ </string>
+ <string name="gesture">
+ mimik
+ </string>
+ <string name="simstate">
+ sim durumu
+ </string>
+ <string name="favorite">
+ favori
+ </string>
+ <string name="symbolic link">
+ bağlantı
+ </string>
+ <string name="symbolic folder link">
+ klasör bağlantısı
+ </string>
+ <string name="mesh">
+ örgü
+ </string>
+ <string name="AvatarEditingAppearance">
+ (Görünümü Düzenliyor)
+ </string>
+ <string name="AvatarAway">
+ Uzakta
+ </string>
+ <string name="AvatarBusy">
+ MeÅŸgul
+ </string>
+ <string name="AvatarMuted">
+ EngellenmiÅŸ
+ </string>
+ <string name="anim_express_afraid">
+ KorkmuÅŸ
+ </string>
+ <string name="anim_express_anger">
+ Kızgın
+ </string>
+ <string name="anim_away">
+ Uzakta
+ </string>
+ <string name="anim_backflip">
+ Geriye salto
+ </string>
+ <string name="anim_express_laugh">
+ İçten Kahkaha
+ </string>
+ <string name="anim_express_toothsmile">
+ Büyük Gülümseme
+ </string>
+ <string name="anim_blowkiss">
+ Öpücük Atma
+ </string>
+ <string name="anim_express_bored">
+ Canı Sıkılmış
+ </string>
+ <string name="anim_bow">
+ Selamlama
+ </string>
+ <string name="anim_clap">
+ Alkış
+ </string>
+ <string name="anim_courtbow">
+ Reverans
+ </string>
+ <string name="anim_express_cry">
+ AÄŸlama
+ </string>
+ <string name="anim_dance1">
+ Dans 1
+ </string>
+ <string name="anim_dance2">
+ Dans 2
+ </string>
+ <string name="anim_dance3">
+ Dans 3
+ </string>
+ <string name="anim_dance4">
+ Dans 4
+ </string>
+ <string name="anim_dance5">
+ Dans 5
+ </string>
+ <string name="anim_dance6">
+ Dans 6
+ </string>
+ <string name="anim_dance7">
+ Dans 7
+ </string>
+ <string name="anim_dance8">
+ Dans 8
+ </string>
+ <string name="anim_express_disdain">
+ Dudak Bükme
+ </string>
+ <string name="anim_drink">
+ İçme
+ </string>
+ <string name="anim_express_embarrased">
+ Utanmış
+ </string>
+ <string name="anim_angry_fingerwag">
+ Ä°ÅŸaret Etme
+ </string>
+ <string name="anim_fist_pump">
+ Yumruk Sallama
+ </string>
+ <string name="anim_yoga_float">
+ Uçan Yoga
+ </string>
+ <string name="anim_express_frown">
+ Kaş Çatma
+ </string>
+ <string name="anim_impatient">
+ Sabırsız
+ </string>
+ <string name="anim_jumpforjoy">
+ Sevinçten Zıplama
+ </string>
+ <string name="anim_kissmybutt">
+ Kıçımı Öp
+ </string>
+ <string name="anim_express_kiss">
+ Öpücük
+ </string>
+ <string name="anim_laugh_short">
+ Gülme
+ </string>
+ <string name="anim_musclebeach">
+ Muscle Beach
+ </string>
+ <string name="anim_no_unhappy">
+ Hayır (Mutsuz)
+ </string>
+ <string name="anim_no_head">
+ Hayır
+ </string>
+ <string name="anim_nyanya">
+ Ha-ha-ha
+ </string>
+ <string name="anim_punch_onetwo">
+ PeÅŸpeÅŸe Ä°ki Yumruk
+ </string>
+ <string name="anim_express_open_mouth">
+ Ağız Açık
+ </string>
+ <string name="anim_peace">
+ Barış
+ </string>
+ <string name="anim_point_you">
+ Diğerini Göster
+ </string>
+ <string name="anim_point_me">
+ Kendini Göster
+ </string>
+ <string name="anim_punch_l">
+ Sola Yumruk At
+ </string>
+ <string name="anim_punch_r">
+ SaÄŸa Yumruk At
+ </string>
+ <string name="anim_rps_countdown">
+ RPS sayımı
+ </string>
+ <string name="anim_rps_paper">
+ RPS kağıdı
+ </string>
+ <string name="anim_rps_rock">
+ RPS kayası
+ </string>
+ <string name="anim_rps_scissors">
+ RPS makası
+ </string>
+ <string name="anim_express_repulsed">
+ TiksinmiÅŸ
+ </string>
+ <string name="anim_kick_roundhouse_r">
+ Döner Tekme
+ </string>
+ <string name="anim_express_sad">
+ Üzgün
+ </string>
+ <string name="anim_salute">
+ Selam
+ </string>
+ <string name="anim_shout">
+ Bağırma
+ </string>
+ <string name="anim_express_shrug">
+ Omuz Silkme
+ </string>
+ <string name="anim_express_smile">
+ Gülümseme
+ </string>
+ <string name="anim_smoke_idle">
+ Duman Tüttürme
+ </string>
+ <string name="anim_smoke_inhale">
+ Duman Çekme
+ </string>
+ <string name="anim_smoke_throw_down">
+ Yere Ä°zmarit Atma
+ </string>
+ <string name="anim_express_surprise">
+ Sürpriz
+ </string>
+ <string name="anim_sword_strike_r">
+ Kılıç Darbesi
+ </string>
+ <string name="anim_angry_tantrum">
+ Öfke Nöbeti
+ </string>
+ <string name="anim_express_tongue_out">
+ Dil Çıkarma
+ </string>
+ <string name="anim_hello">
+ El Sallama
+ </string>
+ <string name="anim_whisper">
+ Fısıldama
+ </string>
+ <string name="anim_whistle">
+ Islık Çalma
+ </string>
+ <string name="anim_express_wink">
+ Göz Kırpma
+ </string>
+ <string name="anim_wink_hollywood">
+ Göz Kırpma (Hollywood)
+ </string>
+ <string name="anim_express_worry">
+ EndiÅŸelenme
+ </string>
+ <string name="anim_yes_happy">
+ Evet (Mutlu)
+ </string>
+ <string name="anim_yes_head">
+ Evet
+ </string>
+ <string name="multiple_textures">
+ Birden Çok
+ </string>
+ <string name="texture_loading">
+ Yükleniyor...
+ </string>
+ <string name="worldmap_offline">
+ Çevrimdışı
+ </string>
+ <string name="worldmap_item_tooltip_format">
+ [AREA] m² L$[PRICE]
+ </string>
+ <string name="worldmap_results_none_found">
+ Hiçbiri bulunamadı.
+ </string>
+ <string name="Ok">
+ Tamam
+ </string>
+ <string name="Premature end of file">
+ Dosyanın zamanından önce sonu
+ </string>
+ <string name="ST_NO_JOINT">
+ KÖK veya EKLEM bulunamıyor.
+ </string>
+ <string name="whisper">
+ fısıldar:
+ </string>
+ <string name="shout">
+ bağırır:
+ </string>
+ <string name="ringing">
+ SL dünyası içindeki Sesli Sohbete bağlanılıyor...
+ </string>
+ <string name="connected">
+ Bağlı
+ </string>
+ <string name="unavailable">
+ Geçerli konumunuzda ses mevcut değil
+ </string>
+ <string name="hang_up">
+ SL dünyası içindeki Sesli Sohbet ile bağlantı kesildi
+ </string>
+ <string name="reconnect_nearby">
+ Şimdi Yakındaki bir Sesli Sohbete yeniden bağlanılacaksınız.
+ </string>
+ <string name="ScriptQuestionCautionChatGranted">
+ &apos;[OWNERNAME]&apos; adlı kişiye ait, [REGIONPOS] üzerinde [REGIONNAME] içerisinde bulunan &apos;[OBJECTNAME]&apos; nesnesine şunu yapma izni verildi: [PERMISSIONS].
+ </string>
+ <string name="ScriptQuestionCautionChatDenied">
+ &apos;[OWNERNAME]&apos; adlı kişiye ait, [REGIONPOS] üzerinde [REGIONNAME] içerisinde bulunan &apos;[OBJECTNAME]&apos; nesnesine şunu yapma izni verilmedi: [PERMISSIONS].
+ </string>
+ <string name="ScriptTakeMoney">
+ Sizden Linden dolar (L$) almak
+ </string>
+ <string name="ActOnControlInputs">
+ Denetim girişlerinizle ilgili eylem gerçekleştirmek
+ </string>
+ <string name="RemapControlInputs">
+ Denetim girişleriniz için yeniden eşleme yapmak
+ </string>
+ <string name="AnimateYourAvatar">
+ Avatarınızı canlandırmak
+ </string>
+ <string name="AttachToYourAvatar">
+ Avatarınıza eklemek
+ </string>
+ <string name="ReleaseOwnership">
+ Mülkiyeti bırakmak ve kamuya açık hale gelmek
+ </string>
+ <string name="LinkAndDelink">
+ Başka nesnelerle bağlantı kurmak veya koparmak
+ </string>
+ <string name="AddAndRemoveJoints">
+ Başka nesnelerle eklem eklemek ve kaldırmak
+ </string>
+ <string name="ChangePermissions">
+ Ä°zinlerini deÄŸiÅŸtirmek
+ </string>
+ <string name="TrackYourCamera">
+ Kameranızı takip etmek
+ </string>
+ <string name="ControlYourCamera">
+ Kameranızı kontrol etmek
+ </string>
+ <string name="NotConnected">
+ Bağlı Değil
+ </string>
+ <string name="SIM_ACCESS_PG">
+ Genel
+ </string>
+ <string name="SIM_ACCESS_MATURE">
+ Orta
+ </string>
+ <string name="SIM_ACCESS_ADULT">
+ YetiÅŸkin
+ </string>
+ <string name="SIM_ACCESS_DOWN">
+ Çevrimdışı
+ </string>
+ <string name="SIM_ACCESS_MIN">
+ Bilinmiyor
+ </string>
+ <string name="land_type_unknown">
+ (bilinmiyor)
+ </string>
+ <string name="Estate / Full Region">
+ Gayrimenkul / Tam Bölge
+ </string>
+ <string name="Estate / Homestead">
+ Gayrimenkul / Banliyö
+ </string>
+ <string name="Mainland / Homestead">
+ Anakara / Banliyö
+ </string>
+ <string name="Mainland / Full Region">
+ Anakara / Tam Bölge
+ </string>
+ <string name="all_files">
+ Tüm Dosyalar
+ </string>
+ <string name="sound_files">
+ Sesler
+ </string>
+ <string name="animation_files">
+ Animasyonlar
+ </string>
+ <string name="image_files">
+ Görüntüler
+ </string>
+ <string name="save_file_verb">
+ Kaydet
+ </string>
+ <string name="load_file_verb">
+ Yükle
+ </string>
+ <string name="targa_image_files">
+ Targa Görüntüleri
+ </string>
+ <string name="bitmap_image_files">
+ Bitmap Görüntüler
+ </string>
+ <string name="avi_movie_file">
+ AVI Film Dosyası
+ </string>
+ <string name="xaf_animation_file">
+ XAF Animasyon Dosyası
+ </string>
+ <string name="xml_file">
+ XML Dosyası
+ </string>
+ <string name="raw_file">
+ Ham Dosya
+ </string>
+ <string name="compressed_image_files">
+ Sıkıştırılmış Görüntüler
+ </string>
+ <string name="load_files">
+ Dosyalar Yükle
+ </string>
+ <string name="choose_the_directory">
+ Dizin Seç
+ </string>
+ <string name="script_files">
+ Komut Dosyaları
+ </string>
+ <string name="AvatarSetNotAway">
+ Uzakta DeÄŸil
+ </string>
+ <string name="AvatarSetAway">
+ Uzakta
+ </string>
+ <string name="AvatarSetNotBusy">
+ MeÅŸgul DeÄŸil
+ </string>
+ <string name="AvatarSetBusy">
+ MeÅŸgul
+ </string>
+ <string name="shape">
+ Åžekil
+ </string>
+ <string name="skin">
+ Dış Katman
+ </string>
+ <string name="hair">
+ Saç
+ </string>
+ <string name="eyes">
+ Gözler
+ </string>
+ <string name="shirt">
+ Gömlek
+ </string>
+ <string name="pants">
+ Pantolon
+ </string>
+ <string name="shoes">
+ Ayakkabılar
+ </string>
+ <string name="socks">
+ Çoraplar
+ </string>
+ <string name="jacket">
+ Ceket
+ </string>
+ <string name="gloves">
+ Eldivenler
+ </string>
+ <string name="undershirt">
+ Fanila
+ </string>
+ <string name="underpants">
+ Külot
+ </string>
+ <string name="skirt">
+ Etek
+ </string>
+ <string name="alpha">
+ Alfa
+ </string>
+ <string name="tattoo">
+ Dövme
+ </string>
+ <string name="physics">
+ Fizik
+ </string>
+ <string name="invalid">
+ geçersiz
+ </string>
+ <string name="none">
+ hiçbiri
+ </string>
+ <string name="shirt_not_worn">
+ Giyilmemiş gömlek
+ </string>
+ <string name="pants_not_worn">
+ GiyilmemiÅŸ pantolon
+ </string>
+ <string name="shoes_not_worn">
+ Giyilmemiş ayakkabılar
+ </string>
+ <string name="socks_not_worn">
+ Giyilmemiş çoraplar
+ </string>
+ <string name="jacket_not_worn">
+ GiyilmemiÅŸ ceket
+ </string>
+ <string name="gloves_not_worn">
+ GiyilmemiÅŸ eldivenler
+ </string>
+ <string name="undershirt_not_worn">
+ GiyilmemiÅŸ fanila
+ </string>
+ <string name="underpants_not_worn">
+ Giyilmemiş külot
+ </string>
+ <string name="skirt_not_worn">
+ GiyilmemiÅŸ etek
+ </string>
+ <string name="alpha_not_worn">
+ GiyilmemiÅŸ alfa
+ </string>
+ <string name="tattoo_not_worn">
+ Giyilmemiş dövme
+ </string>
+ <string name="physics_not_worn">
+ GiyilmemiÅŸ fizik
+ </string>
+ <string name="invalid_not_worn">
+ geçersiz
+ </string>
+ <string name="create_new_shape">
+ Yeni ÅŸekil oluÅŸtur
+ </string>
+ <string name="create_new_skin">
+ Yeni dış katman oluştur
+ </string>
+ <string name="create_new_hair">
+ Yeni saç oluştur
+ </string>
+ <string name="create_new_eyes">
+ Yeni gözler oluştur
+ </string>
+ <string name="create_new_shirt">
+ Yeni gömlek oluştur
+ </string>
+ <string name="create_new_pants">
+ Yeni pantolon oluÅŸtur
+ </string>
+ <string name="create_new_shoes">
+ Yeni ayakkabılar oluştur
+ </string>
+ <string name="create_new_socks">
+ Yeni çoraplar oluştur
+ </string>
+ <string name="create_new_jacket">
+ Yeni ceket oluÅŸtur
+ </string>
+ <string name="create_new_gloves">
+ Yeni eldivenler oluÅŸtur
+ </string>
+ <string name="create_new_undershirt">
+ Yeni fanila oluÅŸtur
+ </string>
+ <string name="create_new_underpants">
+ Yeni külot oluştur
+ </string>
+ <string name="create_new_skirt">
+ Yeni etek oluÅŸtur
+ </string>
+ <string name="create_new_alpha">
+ Yeni alfa oluÅŸtur
+ </string>
+ <string name="create_new_tattoo">
+ Yeni dövme oluştur
+ </string>
+ <string name="create_new_physics">
+ Yeni fizik oluÅŸtur
+ </string>
+ <string name="create_new_invalid">
+ geçersiz
+ </string>
+ <string name="NewWearable">
+ Yeni [WEARABLE_ITEM]
+ </string>
+ <string name="next">
+ Sonraki
+ </string>
+ <string name="ok">
+ Tamam
+ </string>
+ <string name="GroupNotifyGroupNotice">
+ Grup Bildirimi
+ </string>
+ <string name="GroupNotifyGroupNotices">
+ Grup Bildirimleri
+ </string>
+ <string name="GroupNotifySentBy">
+ Gönderen:
+ </string>
+ <string name="GroupNotifyAttached">
+ EklenmiÅŸ:
+ </string>
+ <string name="GroupNotifyViewPastNotices">
+ Burada eski bildirimleri görüntüleyin veya bu iletilerin alınmasını iptal edin.
+ </string>
+ <string name="GroupNotifyOpenAttachment">
+ Aksesuarı Aç
+ </string>
+ <string name="GroupNotifySaveAttachment">
+ Aksesuarı Kaydet
+ </string>
+ <string name="TeleportOffer">
+ Işınlama teklifi
+ </string>
+ <string name="StartUpNotifications">
+ Siz yokken yeni bildirimler geldi.
+ </string>
+ <string name="OverflowInfoChannelString">
+ %d ilave bildiriminiz var
+ </string>
+ <string name="BodyPartsRightArm">
+ SaÄŸ Kol
+ </string>
+ <string name="BodyPartsHead">
+ BaÅŸ
+ </string>
+ <string name="BodyPartsLeftArm">
+ Sol Kol
+ </string>
+ <string name="BodyPartsLeftLeg">
+ Sol Bacak
+ </string>
+ <string name="BodyPartsTorso">
+ Gövde
+ </string>
+ <string name="BodyPartsRightLeg">
+ SaÄŸ Bacak
+ </string>
+ <string name="GraphicsQualityLow">
+ Düşük
+ </string>
+ <string name="GraphicsQualityMid">
+ Orta
+ </string>
+ <string name="GraphicsQualityHigh">
+ Yüksek
+ </string>
+ <string name="LeaveMouselook">
+ Dünya Görünümüne dönmek için ESC&apos;e basın
+ </string>
+ <string name="InventoryNoMatchingItems">
+ Aradığınızı bulamadınız mı? [secondlife:///app/search/all/[SEARCH_TERM] Arama] ile bulmayı deneyin.
+ </string>
+ <string name="PlacesNoMatchingItems">
+ Aradığınızı bulamadınız mı? [secondlife:///app/search/places/[SEARCH_TERM] Arama] ile bulmayı deneyin.
+ </string>
+ <string name="FavoritesNoMatchingItems">
+ Bir yer imini favorilerinize eklemek için buraya sürükleyin.
+ </string>
+ <string name="InventoryNoTexture">
+ Envanterinizde bu dokunun kopyası yok
+ </string>
+ <string name="InventoryInboxNoItems">
+ Pazaryerinda satın aldıklarınız burada görünecektir. Bunları kullanmak için envanterinize sürükleyebilirsiniz.
+ </string>
+ <string name="MarketplaceURL">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/
+ </string>
+ <string name="MarketplaceURL_CreateStore">
+ http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.4
+ </string>
+ <string name="MarketplaceURL_Dashboard">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard
+ </string>
+ <string name="MarketplaceURL_Imports">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports
+ </string>
+ <string name="MarketplaceURL_LearnMore">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more
+ </string>
+ <string name="InventoryOutboxNotMerchantTitle">
+ Pazaryerinde herkes öğe satabilir.
+ </string>
+ <string name="InventoryOutboxNotMerchantTooltip"/>
+ <string name="InventoryOutboxNotMerchant">
+ Eğer bir satıcı olmak istiyorsanız, [Pazaryerinde [MARKETPLACE_CREATE_STORE_URL] bir mağaza açmanız gerekir].
+ </string>
+ <string name="InventoryOutboxNoItemsTitle">
+ Giden kutunuz boÅŸ.
+ </string>
+ <string name="InventoryOutboxNoItemsTooltip"/>
+ <string name="InventoryOutboxNoItems">
+ Bu alana klasörleri sürükleyin ve bunları [[MARKETPLACE_DASHBOARD_URL] Pazaryerinde] satılık olarak duyurmak için &quot;Pazaryerine Gönder&quot; üzerine tıklayın.
+ </string>
+ <string name="Marketplace Error None">
+ Hata yok
+ </string>
+ <string name="Marketplace Error Not Merchant">
+ Hata: Öğeleri Pazaryerine göndermeden önce kendinizi bir satıcı olarak belirlemelisiniz (ücretsizdir).
+ </string>
+ <string name="Marketplace Error Empty Folder">
+ Hata: Bu klasörün içeriği boş.
+ </string>
+ <string name="Marketplace Error Unassociated Products">
+ Hata: Bu öğe karşıya yüklenemedi çünkü satıcı hesabınızda ürünlerle ilişkisiz çok fazla öğe mevcut. Bu hatayı düzeltmek için Pazaryeri web sitesine oturum açın ve ilişkisiz öğe sayınızı azaltın.
+ </string>
+ <string name="Marketplace Error Object Limit">
+ Hata: Bu öğe çok fazla nesne içeriyor. Bu hatayı düzeltmek için nesneleri birlikte kutulara yerleştirerek, toplam nesne sayısını 200&apos;ün altına düşürün.
+ </string>
+ <string name="Marketplace Error Folder Depth">
+ Hata: Bu öğede çok fazla iç içe geçmiş klasör seviyesi var. Bunu tekrar düzenleyerek maksimum 3 iç içe geçmiş klasör seviyesine indirin.
+ </string>
+ <string name="Marketplace Error Unsellable Item">
+ Hata: Bu öğe Pazaryerinde satılamaz.
+ </string>
+ <string name="Marketplace Error Internal Import">
+ Hata: Bu öğede bir sorun var. Daha sonra tekrar deneyin.
+ </string>
+ <string name="Open landmarks">
+ Açık yer imleri
+ </string>
+ <string name="no_transfer" value="(aktarım yok)"/>
+ <string name="no_modify" value="(deÄŸiÅŸtirme yok)"/>
+ <string name="no_copy" value="(kopya yok)"/>
+ <string name="worn" value="(giyilmiÅŸ)"/>
+ <string name="link" value="(bağlantı)"/>
+ <string name="broken_link" value="(broken_link)"/>
+ <string name="LoadingContents">
+ İçerik yükleniyor...
+ </string>
+ <string name="NoContents">
+ İçerik yok
+ </string>
+ <string name="WornOnAttachmentPoint" value="([ATTACHMENT_POINT] üzerinde giyilmiş)"/>
+ <string name="ActiveGesture" value="[GESLABEL] (etkin)"/>
+ <string name="PermYes">
+ Evet
+ </string>
+ <string name="PermNo">
+ Hayır
+ </string>
+ <string name="Chat Message" value="Sohbet:"/>
+ <string name="Sound" value="Ses:"/>
+ <string name="Wait" value="--- Bekleyin:"/>
+ <string name="AnimFlagStop" value="Animasyonu Durdur:"/>
+ <string name="AnimFlagStart" value="Animasyonu BaÅŸlat:"/>
+ <string name="Wave" value="El Sallama"/>
+ <string name="GestureActionNone" value="Hiçbiri"/>
+ <string name="HelloAvatar" value="Merhaba avatar!"/>
+ <string name="ViewAllGestures" value="Tümünü Göster &gt;&gt;"/>
+ <string name="GetMoreGestures" value="Ä°lave Al &gt;&gt;"/>
+ <string name="Animations" value="Animasyonlar,"/>
+ <string name="Calling Cards" value="Arama Kartları,"/>
+ <string name="Clothing" value="Giysiler,"/>
+ <string name="Gestures" value="Mimikler,"/>
+ <string name="Landmarks" value="Yer Ä°mleri,"/>
+ <string name="Notecards" value="Not Kartları,"/>
+ <string name="Objects" value="Nesneler,"/>
+ <string name="Scripts" value="Komut Dosyaları,"/>
+ <string name="Sounds" value="Sesler,"/>
+ <string name="Textures" value="Dokular,"/>
+ <string name="Snapshots" value="Anlık Görüntüler,"/>
+ <string name="No Filters" value="Hayır"/>
+ <string name="Since Logoff" value="- Oturum Kapandıktan Beri"/>
+ <string name="InvFolder My Inventory">
+ Envanterim
+ </string>
+ <string name="InvFolder Library">
+ Kütüphane
+ </string>
+ <string name="InvFolder Textures">
+ Dokular
+ </string>
+ <string name="InvFolder Sounds">
+ Sesler
+ </string>
+ <string name="InvFolder Calling Cards">
+ Arama Kartları
+ </string>
+ <string name="InvFolder Landmarks">
+ Yer Ä°mleri
+ </string>
+ <string name="InvFolder Scripts">
+ Komut Dosyaları
+ </string>
+ <string name="InvFolder Clothing">
+ Giysiler
+ </string>
+ <string name="InvFolder Objects">
+ Nesneler
+ </string>
+ <string name="InvFolder Notecards">
+ Not Kartları
+ </string>
+ <string name="InvFolder New Folder">
+ Yeni Klasör
+ </string>
+ <string name="InvFolder Inventory">
+ Envanter
+ </string>
+ <string name="InvFolder Uncompressed Images">
+ Sıkıştırılmamış Görüntüler
+ </string>
+ <string name="InvFolder Body Parts">
+ Vücut Bölümleri
+ </string>
+ <string name="InvFolder Trash">
+ Çöp
+ </string>
+ <string name="InvFolder Photo Album">
+ Fotoğraf Albümü
+ </string>
+ <string name="InvFolder Lost And Found">
+ Kaybedip Bulduklarım
+ </string>
+ <string name="InvFolder Uncompressed Sounds">
+ Sıkıştırılmamış Sesler
+ </string>
+ <string name="InvFolder Animations">
+ Animasyonlar
+ </string>
+ <string name="InvFolder Gestures">
+ Mimikler
+ </string>
+ <string name="InvFolder Favorite">
+ Favorilerim
+ </string>
+ <string name="InvFolder favorite">
+ Favorilerim
+ </string>
+ <string name="InvFolder Current Outfit">
+ Mevcut Dış Görünüm
+ </string>
+ <string name="InvFolder Initial Outfits">
+ Başlangıçtakı Dış Görünümler
+ </string>
+ <string name="InvFolder My Outfits">
+ Benim Dış Görünümlerim
+ </string>
+ <string name="InvFolder Accessories">
+ Aksesuarlar
+ </string>
+ <string name="InvFolder Meshes">
+ Örgüler
+ </string>
+ <string name="InvFolder Friends">
+ ArkadaÅŸlar
+ </string>
+ <string name="InvFolder All">
+ Tümü
+ </string>
+ <string name="no_attachments">
+ Giyilen aksesuar yok
+ </string>
+ <string name="Attachments remain">
+ Aksesuarlar ([COUNT] yuva mevcut)
+ </string>
+ <string name="Buy">
+ Satın Al
+ </string>
+ <string name="BuyforL$">
+ L$&apos;a Satın Al
+ </string>
+ <string name="Stone">
+ TaÅŸ
+ </string>
+ <string name="Metal">
+ Metal
+ </string>
+ <string name="Glass">
+ Cam
+ </string>
+ <string name="Wood">
+ AhÅŸap
+ </string>
+ <string name="Flesh">
+ Et
+ </string>
+ <string name="Plastic">
+ Plastik
+ </string>
+ <string name="Rubber">
+ Lastik
+ </string>
+ <string name="Light">
+ Işık
+ </string>
+ <string name="KBShift">
+ Shift
+ </string>
+ <string name="KBCtrl">
+ Ctrl
+ </string>
+ <string name="Chest">
+ Göğüs
+ </string>
+ <string name="Skull">
+ Kafatası
+ </string>
+ <string name="Left Shoulder">
+ Sol Omuz
+ </string>
+ <string name="Right Shoulder">
+ SaÄŸ Omuz
+ </string>
+ <string name="Left Hand">
+ Sol El
+ </string>
+ <string name="Right Hand">
+ SaÄŸ El
+ </string>
+ <string name="Left Foot">
+ Sol Ayak
+ </string>
+ <string name="Right Foot">
+ SaÄŸ Ayak
+ </string>
+ <string name="Spine">
+ Omurga
+ </string>
+ <string name="Pelvis">
+ LeÄŸen KemiÄŸi
+ </string>
+ <string name="Mouth">
+ Ağız
+ </string>
+ <string name="Chin">
+ Çene
+ </string>
+ <string name="Left Ear">
+ Sol Kulak
+ </string>
+ <string name="Right Ear">
+ SaÄŸ Kulak
+ </string>
+ <string name="Left Eyeball">
+ Sol Göz Küresi
+ </string>
+ <string name="Right Eyeball">
+ Sağ Göz Küresi
+ </string>
+ <string name="Nose">
+ Burun
+ </string>
+ <string name="R Upper Arm">
+ SaÄŸ Ãœst Kol
+ </string>
+ <string name="R Forearm">
+ Sağ Ön Kol
+ </string>
+ <string name="L Upper Arm">
+ Sol Ãœst Kol
+ </string>
+ <string name="L Forearm">
+ Sol Ön Kol
+ </string>
+ <string name="Right Hip">
+ Sağ Kalça
+ </string>
+ <string name="R Upper Leg">
+ SaÄŸ Ãœst Bacak
+ </string>
+ <string name="R Lower Leg">
+ SaÄŸ Alt Bacak
+ </string>
+ <string name="Left Hip">
+ Sol Kalça
+ </string>
+ <string name="L Upper Leg">
+ Sol Ãœst Bacak
+ </string>
+ <string name="L Lower Leg">
+ Sol Alt Bacak
+ </string>
+ <string name="Stomach">
+ Karın
+ </string>
+ <string name="Left Pec">
+ Sol Göğüs
+ </string>
+ <string name="Right Pec">
+ Sağ Göğüs
+ </string>
+ <string name="Neck">
+ Boyun
+ </string>
+ <string name="Avatar Center">
+ Avatar Merkezi
+ </string>
+ <string name="Invalid Attachment">
+ Geçersiz Aksesuar Noktası
+ </string>
+ <string name="YearsMonthsOld">
+ [AGEYEARS] [AGEMONTHS]&apos;lık
+ </string>
+ <string name="YearsOld">
+ [AGEYEARS] yaşında
+ </string>
+ <string name="MonthsOld">
+ [AGEMONTHS]&apos;lık
+ </string>
+ <string name="WeeksOld">
+ [AGEWEEKS]&apos;lık
+ </string>
+ <string name="DaysOld">
+ [AGEDAYS]&apos;lük
+ </string>
+ <string name="TodayOld">
+ Bugün katıldı
+ </string>
+ <string name="AgeYearsA">
+ [COUNT] yıl
+ </string>
+ <string name="AgeYearsB">
+ [COUNT] yıl
+ </string>
+ <string name="AgeYearsC">
+ [COUNT] yıl
+ </string>
+ <string name="AgeMonthsA">
+ [COUNT] ay
+ </string>
+ <string name="AgeMonthsB">
+ [COUNT] ay
+ </string>
+ <string name="AgeMonthsC">
+ [COUNT] ay
+ </string>
+ <string name="AgeWeeksA">
+ [COUNT] hafta
+ </string>
+ <string name="AgeWeeksB">
+ [COUNT] hafta
+ </string>
+ <string name="AgeWeeksC">
+ [COUNT] hafta
+ </string>
+ <string name="AgeDaysA">
+ [COUNT] gün
+ </string>
+ <string name="AgeDaysB">
+ [COUNT] gün
+ </string>
+ <string name="AgeDaysC">
+ [COUNT] gün
+ </string>
+ <string name="GroupMembersA">
+ [COUNT] üye
+ </string>
+ <string name="GroupMembersB">
+ [COUNT] üye
+ </string>
+ <string name="GroupMembersC">
+ [COUNT] üye
+ </string>
+ <string name="AcctTypeResident">
+ Sakin
+ </string>
+ <string name="AcctTypeTrial">
+ Deneme
+ </string>
+ <string name="AcctTypeCharterMember">
+ Ayrıcalıklı Üye
+ </string>
+ <string name="AcctTypeEmployee">
+ Linden Lab Çalışanı
+ </string>
+ <string name="PaymentInfoUsed">
+ Kullanılan Ödeme Bilgisi
+ </string>
+ <string name="PaymentInfoOnFile">
+ Dosyadaki Ödeme Bilgisi
+ </string>
+ <string name="NoPaymentInfoOnFile">
+ Dosyada Ödeme Bilgisi Yok
+ </string>
+ <string name="AgeVerified">
+ Yaşı Doğrulanmış
+ </string>
+ <string name="NotAgeVerified">
+ Yaşı Doğrulanmamış
+ </string>
+ <string name="Center 2">
+ 2. Merkez
+ </string>
+ <string name="Top Right">
+ SaÄŸ Ãœst
+ </string>
+ <string name="Top">
+ Ãœst
+ </string>
+ <string name="Top Left">
+ Sol Ãœst
+ </string>
+ <string name="Center">
+ Merkez
+ </string>
+ <string name="Bottom Left">
+ Sol Alt
+ </string>
+ <string name="Bottom">
+ Alt
+ </string>
+ <string name="Bottom Right">
+ SaÄŸ Alt
+ </string>
+ <string name="CompileQueueDownloadedCompiling">
+ Karşıdan yüklendi, şimdi derleniyor
+ </string>
+ <string name="CompileQueueScriptNotFound">
+ Komut dosyası sunucuda bulunamadı.
+ </string>
+ <string name="CompileQueueProblemDownloading">
+ Karşıdan yüklenirken sorun oluştu
+ </string>
+ <string name="CompileQueueInsufficientPermDownload">
+ Komut dosyasını karşıdan yüklemek için yeterli izin yok.
+ </string>
+ <string name="CompileQueueInsufficientPermFor">
+ Şunun için yeterli izin yok:
+ </string>
+ <string name="CompileQueueUnknownFailure">
+ Karşıdan yüklerken bilinmeyen hata
+ </string>
+ <string name="CompileQueueTitle">
+ Tekrar Derleme Ä°lerlemesi
+ </string>
+ <string name="CompileQueueStart">
+ tekrar derle
+ </string>
+ <string name="ResetQueueTitle">
+ Sıfırlama İlerlemesi
+ </string>
+ <string name="ResetQueueStart">
+ sıfırla
+ </string>
+ <string name="RunQueueTitle">
+ Çalışan Süreçlerin İlerlemesini Ayarla
+ </string>
+ <string name="RunQueueStart">
+ çalıştırmayı ayarla
+ </string>
+ <string name="NotRunQueueTitle">
+ Çalışmayan Süreçlerin İlerlemesini Ayarla
+ </string>
+ <string name="NotRunQueueStart">
+ çalıştırmamayı ayarla
+ </string>
+ <string name="CompileSuccessful">
+ Derleme başarılı oldu!
+ </string>
+ <string name="CompileSuccessfulSaving">
+ Derleme başarılı, kaydediliyor...
+ </string>
+ <string name="SaveComplete">
+ Kaydetme tamamlandı.
+ </string>
+ <string name="ObjectOutOfRange">
+ Komut dosyası (nesne kapsam dışı)
+ </string>
+ <string name="GodToolsObjectOwnedBy">
+ [OWNER] mülkiyetindeki [OBJECT] nesnesi
+ </string>
+ <string name="GroupsNone">
+ hiçbiri
+ </string>
+ <string name="Group" value="(grup)"/>
+ <string name="Unknown">
+ (Bilinmiyor)
+ </string>
+ <string name="SummaryForTheWeek" value="Bu haftanın özeti, şu tarihten itibaren:"/>
+ <string name="NextStipendDay" value="Sonraki ödeme günü şudur:"/>
+ <string name="GroupPlanningDate">
+ [mthnum,datetime,utc]/[day,datetime,utc]/[year,datetime,utc]
+ </string>
+ <string name="GroupIndividualShare" value="Grup Bireysel Pay"/>
+ <string name="GroupColumn" value="Grup"/>
+ <string name="Balance">
+ Bakiye
+ </string>
+ <string name="Credits">
+ Katkıda Bulunanlar
+ </string>
+ <string name="Debits">
+ Borçlar
+ </string>
+ <string name="Total">
+ Toplam
+ </string>
+ <string name="NoGroupDataFound">
+ Bu grup için grup verisi bulunamadı
+ </string>
+ <string name="IMParentEstate">
+ ana gayrimenkul
+ </string>
+ <string name="IMMainland">
+ anakara
+ </string>
+ <string name="IMTeen">
+ on sekiz yaş altı
+ </string>
+ <string name="Anyone">
+ herkes
+ </string>
+ <string name="RegionInfoError">
+ hata
+ </string>
+ <string name="RegionInfoAllEstatesOwnedBy">
+ [OWNER] mülkiyetindeki tüm gayrimenkuller
+ </string>
+ <string name="RegionInfoAllEstatesYouOwn">
+ sahip olduğunuz tüm gayrimenkuller
+ </string>
+ <string name="RegionInfoAllEstatesYouManage">
+ [OWNER] adına yönettiğiniz tüm gayrimenkuller
+ </string>
+ <string name="RegionInfoAllowedResidents">
+ Ä°zin verilen Sakinler: ([ALLOWEDAGENTS], maks [MAXACCESS])
+ </string>
+ <string name="RegionInfoAllowedGroups">
+ Ä°zin verilen gruplar: ([ALLOWEDGROUPS], maks [MAXACCESS])
+ </string>
+ <string name="ScriptLimitsParcelScriptMemory">
+ Parsel Komut Dosyası Belleği
+ </string>
+ <string name="ScriptLimitsParcelsOwned">
+ Listelenen Parseller: [PARCELS]
+ </string>
+ <string name="ScriptLimitsMemoryUsed">
+ Kullanılan bellek: [COUNT] kb / [MAX] kb içerisinden; [AVAILABLE] kb serbest
+ </string>
+ <string name="ScriptLimitsMemoryUsedSimple">
+ Kullanılan bellek: [COUNT] kb
+ </string>
+ <string name="ScriptLimitsParcelScriptURLs">
+ Parsel Komut Dosyası URL&apos;leri
+ </string>
+ <string name="ScriptLimitsURLsUsed">
+ Kullanılan URL&apos;ler: [COUNT] / [MAX] içerisinden; [AVAILABLE] serbest
+ </string>
+ <string name="ScriptLimitsURLsUsedSimple">
+ Kullanılan URL&apos;ler: [COUNT]
+ </string>
+ <string name="ScriptLimitsRequestError">
+ Bilgi talep edilirken hata oluÅŸtu
+ </string>
+ <string name="ScriptLimitsRequestNoParcelSelected">
+ Seçili Parsel Yok
+ </string>
+ <string name="ScriptLimitsRequestWrongRegion">
+ Hata: Komut dosyası bilgisi sadece mevcut bölgenizde geçerli
+ </string>
+ <string name="ScriptLimitsRequestWaiting">
+ Bilgiler alınıyor...
+ </string>
+ <string name="ScriptLimitsRequestDontOwnParcel">
+ Bu parseli inceleme izniniz yok
+ </string>
+ <string name="SITTING_ON">
+ Ãœzerinde Oturuyor
+ </string>
+ <string name="ATTACH_CHEST">
+ Göğüs
+ </string>
+ <string name="ATTACH_HEAD">
+ BaÅŸ
+ </string>
+ <string name="ATTACH_LSHOULDER">
+ Sol Omuz
+ </string>
+ <string name="ATTACH_RSHOULDER">
+ SaÄŸ Omuz
+ </string>
+ <string name="ATTACH_LHAND">
+ Sol El
+ </string>
+ <string name="ATTACH_RHAND">
+ SaÄŸ El
+ </string>
+ <string name="ATTACH_LFOOT">
+ Sol Ayak
+ </string>
+ <string name="ATTACH_RFOOT">
+ SaÄŸ Ayak
+ </string>
+ <string name="ATTACH_BACK">
+ Geri
+ </string>
+ <string name="ATTACH_PELVIS">
+ LeÄŸen KemiÄŸi
+ </string>
+ <string name="ATTACH_MOUTH">
+ Ağız
+ </string>
+ <string name="ATTACH_CHIN">
+ Çene
+ </string>
+ <string name="ATTACH_LEAR">
+ Sol Kulak
+ </string>
+ <string name="ATTACH_REAR">
+ SaÄŸ Kulak
+ </string>
+ <string name="ATTACH_LEYE">
+ Sol Göz
+ </string>
+ <string name="ATTACH_REYE">
+ Sağ Göz
+ </string>
+ <string name="ATTACH_NOSE">
+ Burun
+ </string>
+ <string name="ATTACH_RUARM">
+ Sol Ãœst Kol
+ </string>
+ <string name="ATTACH_RLARM">
+ SaÄŸ Alt Kol
+ </string>
+ <string name="ATTACH_LUARM">
+ Sol Ãœst Kol
+ </string>
+ <string name="ATTACH_LLARM">
+ Sol Alt Kol
+ </string>
+ <string name="ATTACH_RHIP">
+ Sağ Kalça
+ </string>
+ <string name="ATTACH_RULEG">
+ SaÄŸ Ãœst Bacak
+ </string>
+ <string name="ATTACH_RLLEG">
+ SaÄŸ Alt Bacak
+ </string>
+ <string name="ATTACH_LHIP">
+ Sol Kalça
+ </string>
+ <string name="ATTACH_LULEG">
+ Sol Ãœst Bacak
+ </string>
+ <string name="ATTACH_LLLEG">
+ Sol Alt Bacak
+ </string>
+ <string name="ATTACH_BELLY">
+ Göbek
+ </string>
+ <string name="ATTACH_RPEC">
+ Sağ Göğüs
+ </string>
+ <string name="ATTACH_LPEC">
+ Sol Göğüs
+ </string>
+ <string name="ATTACH_HUD_CENTER_2">
+ BÃœG 2. Merkez
+ </string>
+ <string name="ATTACH_HUD_TOP_RIGHT">
+ BÃœG SaÄŸ Ãœst
+ </string>
+ <string name="ATTACH_HUD_TOP_CENTER">
+ BÃœG Merkez Ãœst
+ </string>
+ <string name="ATTACH_HUD_TOP_LEFT">
+ BÃœG Sol Ãœst
+ </string>
+ <string name="ATTACH_HUD_CENTER_1">
+ BÃœG 1. Merkez
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_LEFT">
+ BÃœG Sol Alt
+ </string>
+ <string name="ATTACH_HUD_BOTTOM">
+ BÃœG Alt
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_RIGHT">
+ BÃœG SaÄŸ Alt
+ </string>
+ <string name="CursorPos">
+ Satır [LINE], Sütun [COLUMN]
+ </string>
+ <string name="PanelDirCountFound">
+ [COUNT] bulundu
+ </string>
+ <string name="PanelDirTimeStr">
+ [hour,datetime,slt]:[min,datetime,slt]
+ </string>
+ <string name="PanelDirEventsDateText">
+ [mthnum,datetime,slt]/[day,datetime,slt]
+ </string>
+ <string name="PanelContentsTooltip">
+ Nesnenin içeriği
+ </string>
+ <string name="PanelContentsNewScript">
+ Yeni Komut Dosyası
+ </string>
+ <string name="BusyModeResponseDefault">
+ İleti gönderdiğiniz Sakin &apos;meşgul modu&apos;nda, bu da rahatsız edilmek istemediği anlamına geliyor. İletiniz daha sonra incelenmesi için kendisine ait Aİ panelinde gösterilecektir.
+ </string>
+ <string name="MuteByName">
+ (Adına göre)
+ </string>
+ <string name="MuteAgent">
+ (Sakin)
+ </string>
+ <string name="MuteObject">
+ (Nesne)
+ </string>
+ <string name="MuteGroup">
+ (Grup)
+ </string>
+ <string name="MuteExternal">
+ (Harici)
+ </string>
+ <string name="RegionNoCovenant">
+ Bu Gayrimenkul için Sözleşmesi yok.
+ </string>
+ <string name="RegionNoCovenantOtherOwner">
+ Bu Gayrimenkul için Sözleşmesi yok. Bu gayrimenkul üzerindeki arazi Linden Lab. değil, Gayrimenkul sahibi tarafından satılmaktadır. Satış ayrıntılarını öğrenmek için lütfen Gayrimenkul Sahibiyle bağlantıya geçin.
+ </string>
+ <string name="covenant_last_modified" value="Son DeÄŸiÅŸtirildiÄŸi Tarih:"/>
+ <string name="none_text" value="(hiçbiri)"/>
+ <string name="never_text" value="(asla)"/>
+ <string name="GroupOwned">
+ Sahibi Olunan Grup
+ </string>
+ <string name="Public">
+ Kamuya Açık
+ </string>
+ <string name="LocalSettings">
+ Yerel Ayarlar
+ </string>
+ <string name="RegionSettings">
+ Bölge Ayarları
+ </string>
+ <string name="ClassifiedClicksTxt">
+ Tıklamalar: [TELEPORT] ışınlama, [MAP] harita, [PROFILE] profil
+ </string>
+ <string name="ClassifiedUpdateAfterPublish">
+ (yayınlandıktan sonra güncelleştirilir)
+ </string>
+ <string name="NoPicksClassifiedsText">
+ Herhangi bir Seçme veya İlan oluşturmadınız. Bir Seçme veya İlan oluşturmak için aşağıdaki Artı düğmesine tıklayın.
+ </string>
+ <string name="NoAvatarPicksClassifiedsText">
+ Kullanıcının herhangi bir seçmesi veya ilanı yok
+ </string>
+ <string name="PicksClassifiedsLoadingText">
+ Yükleniyor...
+ </string>
+ <string name="MultiPreviewTitle">
+ Önizleme
+ </string>
+ <string name="MultiPropertiesTitle">
+ Özellikler
+ </string>
+ <string name="InvOfferAnObjectNamed">
+ Åžu ada sahip bir nesne:
+ </string>
+ <string name="InvOfferOwnedByGroup">
+ grubun sahip olduÄŸu:
+ </string>
+ <string name="InvOfferOwnedByUnknownGroup">
+ bilinmeyen grubun sahip olduÄŸu:
+ </string>
+ <string name="InvOfferOwnedBy">
+ sahibi:
+ </string>
+ <string name="InvOfferOwnedByUnknownUser">
+ bilinmeyen bir kullanıcının sahip olduğu:
+ </string>
+ <string name="InvOfferGaveYou">
+ size verdi:
+ </string>
+ <string name="InvOfferDecline">
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; tarafından gönderilen [DESC]&apos;i reddettiniz.
+ </string>
+ <string name="GroupMoneyTotal">
+ Toplam
+ </string>
+ <string name="GroupMoneyBought">
+ alınan:
+ </string>
+ <string name="GroupMoneyPaidYou">
+ size ödenen:
+ </string>
+ <string name="GroupMoneyPaidInto">
+ şuraya ödenen:
+ </string>
+ <string name="GroupMoneyBoughtPassTo">
+ şuraya geçiş hakkı alınan:
+ </string>
+ <string name="GroupMoneyPaidFeeForEvent">
+ etkinlik için ödenen ücret:
+ </string>
+ <string name="GroupMoneyPaidPrizeForEvent">
+ etkinlik için verilen ödül:
+ </string>
+ <string name="GroupMoneyBalance">
+ Bakiye
+ </string>
+ <string name="GroupMoneyCredits">
+ Katkıda Bulunanlar
+ </string>
+ <string name="GroupMoneyDebits">
+ Borçlar
+ </string>
+ <string name="GroupMoneyDate">
+ [weekday,datetime,utc] [mth,datetime,utc] [day,datetime,utc], [year,datetime,utc]
+ </string>
+ <string name="ViewerObjectContents">
+ İçerik
+ </string>
+ <string name="AcquiredItems">
+ Alınan Öğeler
+ </string>
+ <string name="Cancel">
+ Ä°ptal
+ </string>
+ <string name="UploadingCosts">
+ [NAME] için karşıya yükleme maliyeti: L$ [AMOUNT]
+ </string>
+ <string name="BuyingCosts">
+ Bunu satın almanın maliyeti: L$ [AMOUNT]
+ </string>
+ <string name="UnknownFileExtension">
+ Bilinmeyen dosya uzantısı .%s
+.wav, .tga, .bmp, .jpg, .jpeg veya .bvh bekleniyordu
+ </string>
+ <string name="MuteObject2">
+ Engelle
+ </string>
+ <string name="MuteAvatar">
+ Engelle
+ </string>
+ <string name="UnmuteObject">
+ Engellemeyi Kaldır
+ </string>
+ <string name="UnmuteAvatar">
+ Engellemeyi Kaldır
+ </string>
+ <string name="AddLandmarkNavBarMenu">
+ Yer Ä°mlerime Ekle...
+ </string>
+ <string name="EditLandmarkNavBarMenu">
+ Yer İmimi Düzenle...
+ </string>
+ <string name="accel-mac-control">
+ ⌃
+ </string>
+ <string name="accel-mac-command">
+ ⌘
+ </string>
+ <string name="accel-mac-option">
+ ⌥
+ </string>
+ <string name="accel-mac-shift">
+ ⇧
+ </string>
+ <string name="accel-win-control">
+ Ctrl+
+ </string>
+ <string name="accel-win-alt">
+ Alt+
+ </string>
+ <string name="accel-win-shift">
+ Shift+
+ </string>
+ <string name="FileSaved">
+ Dosya Kaydedildi
+ </string>
+ <string name="Receiving">
+ Alınıyor
+ </string>
+ <string name="AM">
+ ÖÖ
+ </string>
+ <string name="PM">
+ ÖS
+ </string>
+ <string name="PST">
+ PST
+ </string>
+ <string name="PDT">
+ PDT
+ </string>
+ <string name="Direction_Forward">
+ Ä°leri
+ </string>
+ <string name="Direction_Left">
+ Sol
+ </string>
+ <string name="Direction_Right">
+ SaÄŸ
+ </string>
+ <string name="Direction_Back">
+ Geri
+ </string>
+ <string name="Direction_North">
+ Kuzey
+ </string>
+ <string name="Direction_South">
+ Güney
+ </string>
+ <string name="Direction_West">
+ Batı
+ </string>
+ <string name="Direction_East">
+ DoÄŸu
+ </string>
+ <string name="Direction_Up">
+ Yukarı
+ </string>
+ <string name="Direction_Down">
+ Aşağı
+ </string>
+ <string name="Any Category">
+ Herh. Bir Kategori
+ </string>
+ <string name="Shopping">
+ Alışveriş
+ </string>
+ <string name="Land Rental">
+ Arazi Kiralama
+ </string>
+ <string name="Property Rental">
+ Mülk Kiralama
+ </string>
+ <string name="Special Attraction">
+ Özel Atraksiyon
+ </string>
+ <string name="New Products">
+ Yeni Ürünler
+ </string>
+ <string name="Employment">
+ Ä°stihdam
+ </string>
+ <string name="Wanted">
+ Arananlar
+ </string>
+ <string name="Service">
+ Hizmet
+ </string>
+ <string name="Personal">
+ KiÅŸisel
+ </string>
+ <string name="None">
+ Renksiz
+ </string>
+ <string name="Linden Location">
+ Linden Konumu
+ </string>
+ <string name="Adult">
+ YetiÅŸkin
+ </string>
+ <string name="Arts&amp;Culture">
+ Sanat ve Kültür
+ </string>
+ <string name="Business">
+ Ä°ÅŸ
+ </string>
+ <string name="Educational">
+ EÄŸitim
+ </string>
+ <string name="Gaming">
+ Oyun
+ </string>
+ <string name="Hangout">
+ UÄŸrak Mekan
+ </string>
+ <string name="Newcomer Friendly">
+ Yeni Gelenlere Yardım Sunan
+ </string>
+ <string name="Parks&amp;Nature">
+ Park ve DoÄŸa
+ </string>
+ <string name="Residential">
+ YerleÅŸim
+ </string>
+ <string name="Stage">
+ Sahne
+ </string>
+ <string name="Other">
+ DiÄŸer
+ </string>
+ <string name="Rental">
+ Kiralık
+ </string>
+ <string name="Any">
+ Herhangi
+ </string>
+ <string name="You">
+ Siz
+ </string>
+ <string name=":">
+ :
+ </string>
+ <string name=",">
+ ,
+ </string>
+ <string name="...">
+ ...
+ </string>
+ <string name="***">
+ ***
+ </string>
+ <string name="(">
+ (
+ </string>
+ <string name=")">
+ )
+ </string>
+ <string name=".">
+ .
+ </string>
+ <string name="&apos;">
+ &apos;
+ </string>
+ <string name="---">
+ ---
+ </string>
+ <string name="Multiple Media">
+ Birden Çok Ortam
+ </string>
+ <string name="Play Media">
+ Ortamı Oynat/Durdur
+ </string>
+ <string name="MBCmdLineError">
+ Komut satırı ayrıştırılırken bir hata oluştu.
+Lütfen bakınız: http://wiki.secondlife.com/wiki/Client_parameters
+Hata:
+ </string>
+ <string name="MBCmdLineUsg">
+ [APP_NAME] Komut satırı kullanımı:
+ </string>
+ <string name="MBUnableToAccessFile">
+ [APP_NAME] ihtiyaç duyduğu bir dosyaya erişemiyor.
+
+Bunun nedeni bir şekilde birden fazla kopyanın çalışıyor olması veya sisteminizin, bir dosyanın açık olduğunu sanması olabilir.
+Bu iletiyi görmeye devam ederseniz, bilgisayarınızı yeniden başlatın ve tekrar deneyin.
+Sorun devam ederse [APP_NAME] uygulamasını tümüyle kaldırmanız ve tekrar yüklemeniz gerekebilir.
+ </string>
+ <string name="MBFatalError">
+ Önemli Hata
+ </string>
+ <string name="MBRequiresAltiVec">
+ [APP_NAME], AltiVec (G4 veya üzeri) bir işlemciye ihtiyaç duyuyor.
+ </string>
+ <string name="MBAlreadyRunning">
+ [APP_NAME] zaten çalışıyor.
+Programın simge durumuna küçültülmüş bir kopyası için görev çubuğunuza bakın.
+Bu iletiyi görmeye devam ederseniz, bilgisayarınızı tekrar başlatın.
+ </string>
+ <string name="MBFrozenCrashed">
+ [APP_NAME] uygulaması bir önceki çalıştırmada kilitlenmiş görünüyor.
+Bir kilitlenme raporu göndermek ister misiniz?
+ </string>
+ <string name="MBAlert">
+ Bildirim
+ </string>
+ <string name="MBNoDirectX">
+ [APP_NAME], DirectX 9.0b veya üzerini saptayamıyor.
+[APP_NAME], kararlılık problemleri, kötü performans ve çökmelere neden olabilecek donanım ve/veya süresi geçmiş sürücüleri saptamak için DirectX kullanır. [APP_NAME] uygulamasını bu olmadan da çalıştırmanız mümkündür, ancak DirectX 9.0b ile çalıştırmanızı kuvvetle tavsiye ederiz.
+
+Devam etmek istiyor musunuz?
+ </string>
+ <string name="MBWarning">
+ Uyarı
+ </string>
+ <string name="MBNoAutoUpdate">
+ Linux için henüz otomatik güncelleştirme uygulanmamıştır.
+Lütfen www.secondlife.com adresinden son sürümü karşıdan yükleyin.
+ </string>
+ <string name="MBRegClassFailed">
+ RegisterClass başarısız oldu
+ </string>
+ <string name="MBError">
+ Hata
+ </string>
+ <string name="MBFullScreenErr">
+ [WIDTH] x [HEIGHT] çözünürlüğünde tam ekran çalıştırma yapılamıyor.
+Pencerede çalışıyor.
+ </string>
+ <string name="MBDestroyWinFailed">
+ Pencere yok edilirken Kapatma Hatası oluştu (DestroyWindow() başarısız oldu)
+ </string>
+ <string name="MBShutdownErr">
+ Kapatma Hatası
+ </string>
+ <string name="MBDevContextErr">
+ GL cihazı içeriği oluşturulamıyor
+ </string>
+ <string name="MBPixelFmtErr">
+ Uygun piksel formatı bulunamadı
+ </string>
+ <string name="MBPixelFmtDescErr">
+ Piksel formatı açıklaması alınamıyor
+ </string>
+ <string name="MBTrueColorWindow">
+ [APP_NAME] uygulamasının çalışması için Gerçek Renk (32 bit) gerekiyor.
+Lütfen bilgisayarınızın ekran ayarlarına gidin ve renk modunu 32 bit olarak ayarlayın.
+ </string>
+ <string name="MBAlpha">
+ [APP_NAME] çalışamıyor çünkü 8 bit bir alfa kanalı alamıyor. Bunun nedeni genellikle video kartı sürücü sorunlarıdır.
+Lütfen en yeni video sürücülerinin yüklü olduğuna emin olun.
+Ayrıca Denetim Masaları &gt; Ekran &gt; Ayarlar içerisinde ekranınız için Gerçek Renk (32 bit) ayarı yapıldığına emin olun.
+Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.
+ </string>
+ <string name="MBPixelFmtSetErr">
+ Piksel formatı ayarlanamıyor
+ </string>
+ <string name="MBGLContextErr">
+ GL işlemi bağlamı oluşturulamıyor
+ </string>
+ <string name="MBGLContextActErr">
+ GL işlemi bağlamı etkinleştirilemiyor
+ </string>
+ <string name="MBVideoDrvErr">
+ [APP_NAME] çalışamıyor çünkü video kartı sürücüleriniz düzgün yüklenemedi, süresi geçmiş durumda veya desteklenmeyen donanımlar için geliştirilmiş. Lütfen en yeni video kartı sürücülerine sahip olduğunuza emin olun; en yeni sürücüler mevcutsa da bunları tekrar yüklemeyi deneyin.
+
+Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.
+ </string>
+ <string name="5 O&apos;Clock Shadow">
+ Bir Günlük Sakal
+ </string>
+ <string name="All White">
+ Tümü Beyaz
+ </string>
+ <string name="Anime Eyes">
+ Anime Gözler
+ </string>
+ <string name="Arced">
+ Yay Åžeklinde
+ </string>
+ <string name="Arm Length">
+ Kol UzunluÄŸu
+ </string>
+ <string name="Attached">
+ BitiÅŸik
+ </string>
+ <string name="Attached Earlobes">
+ Kafaya BitiÅŸik Kulak Memeleri
+ </string>
+ <string name="Back Fringe">
+ Arka Perçem
+ </string>
+ <string name="Baggy">
+ Torbalı
+ </string>
+ <string name="Bangs">
+ Kahküller
+ </string>
+ <string name="Beady Eyes">
+ Boncuk Gözler
+ </string>
+ <string name="Belly Size">
+ Göbek Büyüklüğü
+ </string>
+ <string name="Big">
+ Büyük
+ </string>
+ <string name="Big Butt">
+ Büyük Kıç
+ </string>
+ <string name="Big Hair Back">
+ Kabarık Saç: Arkada
+ </string>
+ <string name="Big Hair Front">
+ Kabarık Saç: Önde
+ </string>
+ <string name="Big Hair Top">
+ Kabarık Saç: Tepede
+ </string>
+ <string name="Big Head">
+ Büyük Kafa
+ </string>
+ <string name="Big Pectorals">
+ Büyük Göğüs Kasları
+ </string>
+ <string name="Big Spikes">
+ Büyük Dik Kısımlar
+ </string>
+ <string name="Black">
+ Siyah
+ </string>
+ <string name="Blonde">
+ Sarışın
+ </string>
+ <string name="Blonde Hair">
+ Sarı Saç
+ </string>
+ <string name="Blush">
+ Allık
+ </string>
+ <string name="Blush Color">
+ Allık Rengi
+ </string>
+ <string name="Blush Opacity">
+ Allık Geçirgenliği
+ </string>
+ <string name="Body Definition">
+ Vücut Tanımı
+ </string>
+ <string name="Body Fat">
+ Vücut Yağı
+ </string>
+ <string name="Body Freckles">
+ Vücut Çilleri
+ </string>
+ <string name="Body Thick">
+ Kalın Vücut
+ </string>
+ <string name="Body Thickness">
+ Vücut Kalınlığı
+ </string>
+ <string name="Body Thin">
+ İnce Vücut
+ </string>
+ <string name="Bow Legged">
+ Çarpık Bacaklı
+ </string>
+ <string name="Breast Buoyancy">
+ Göğüs Kalkıklığı
+ </string>
+ <string name="Breast Cleavage">
+ Göğüs Çatalı
+ </string>
+ <string name="Breast Size">
+ Göğüs Büyüklüğü
+ </string>
+ <string name="Bridge Width">
+ Burun KemiÄŸi GeniÅŸliÄŸi
+ </string>
+ <string name="Broad">
+ GeniÅŸ
+ </string>
+ <string name="Brow Size">
+ Alın Genişliği
+ </string>
+ <string name="Bug Eyes">
+ Patlak Gözlü
+ </string>
+ <string name="Bugged Eyes">
+ Patlak Gözlü
+ </string>
+ <string name="Bulbous">
+ Patates Burunlu
+ </string>
+ <string name="Bulbous Nose">
+ Patates Burunlu
+ </string>
+ <string name="Breast Physics Mass">
+ Göğüs Kütlesi
+ </string>
+ <string name="Breast Physics Smoothing">
+ Göğüs Düzleştirme
+ </string>
+ <string name="Breast Physics Gravity">
+ Göğüs Yerçekimi
+ </string>
+ <string name="Breast Physics Drag">
+ Göğüs Direnci
+ </string>
+ <string name="Breast Physics InOut Max Effect">
+ Maks Etki
+ </string>
+ <string name="Breast Physics InOut Spring">
+ Yaylanma
+ </string>
+ <string name="Breast Physics InOut Gain">
+ Kazanç
+ </string>
+ <string name="Breast Physics InOut Damping">
+ Sönüm
+ </string>
+ <string name="Breast Physics UpDown Max Effect">
+ Maks Etki
+ </string>
+ <string name="Breast Physics UpDown Spring">
+ Yaylanma
+ </string>
+ <string name="Breast Physics UpDown Gain">
+ Kazanç
+ </string>
+ <string name="Breast Physics UpDown Damping">
+ Sönüm
+ </string>
+ <string name="Breast Physics LeftRight Max Effect">
+ Maks Etki
+ </string>
+ <string name="Breast Physics LeftRight Spring">
+ Yaylanma
+ </string>
+ <string name="Breast Physics LeftRight Gain">
+ Kazanç
+ </string>
+ <string name="Breast Physics LeftRight Damping">
+ Sönüm
+ </string>
+ <string name="Belly Physics Mass">
+ Göbek Kütlesi
+ </string>
+ <string name="Belly Physics Smoothing">
+ Göbek Düzleştirme
+ </string>
+ <string name="Belly Physics Gravity">
+ Göbek Yerçekimi
+ </string>
+ <string name="Belly Physics Drag">
+ Göbek Direnci
+ </string>
+ <string name="Belly Physics UpDown Max Effect">
+ Maks Etki
+ </string>
+ <string name="Belly Physics UpDown Spring">
+ Yaylanma
+ </string>
+ <string name="Belly Physics UpDown Gain">
+ Kazanç
+ </string>
+ <string name="Belly Physics UpDown Damping">
+ Sönüm
+ </string>
+ <string name="Butt Physics Mass">
+ Kıç Kütlesi
+ </string>
+ <string name="Butt Physics Smoothing">
+ Kıç Düzleştirme
+ </string>
+ <string name="Butt Physics Gravity">
+ Kıç Yerçekimi
+ </string>
+ <string name="Butt Physics Drag">
+ Kıç Direnci
+ </string>
+ <string name="Butt Physics UpDown Max Effect">
+ Maks Etki
+ </string>
+ <string name="Butt Physics UpDown Spring">
+ Yaylanma
+ </string>
+ <string name="Butt Physics UpDown Gain">
+ Kazanç
+ </string>
+ <string name="Butt Physics UpDown Damping">
+ Sönüm
+ </string>
+ <string name="Butt Physics LeftRight Max Effect">
+ Maks Etki
+ </string>
+ <string name="Butt Physics LeftRight Spring">
+ Yaylanma
+ </string>
+ <string name="Butt Physics LeftRight Gain">
+ Kazanç
+ </string>
+ <string name="Butt Physics LeftRight Damping">
+ Sönüm
+ </string>
+ <string name="Bushy Eyebrows">
+ Gür Kaşlar
+ </string>
+ <string name="Bushy Hair">
+ Gür Saç
+ </string>
+ <string name="Butt Size">
+ Kıç Büyüklüğü
+ </string>
+ <string name="Butt Gravity">
+ Kıç Yerçekimi
+ </string>
+ <string name="bustle skirt">
+ Tarlatanlı Etek
+ </string>
+ <string name="no bustle">
+ Tarlatansız
+ </string>
+ <string name="more bustle">
+ Çok Tarlatanlı
+ </string>
+ <string name="Chaplin">
+ Chaplin pantalon
+ </string>
+ <string name="Cheek Bones">
+ Elmacık Kemikleri
+ </string>
+ <string name="Chest Size">
+ Göğüs Büyüklüğü
+ </string>
+ <string name="Chin Angle">
+ Çene Açısı
+ </string>
+ <string name="Chin Cleft">
+ Çene Çukuru
+ </string>
+ <string name="Chin Curtains">
+ Lincoln Sakal
+ </string>
+ <string name="Chin Depth">
+ Çene Derinliği
+ </string>
+ <string name="Chin Heavy">
+ Geniş Çene
+ </string>
+ <string name="Chin In">
+ Çene İçeri
+ </string>
+ <string name="Chin Out">
+ Çene Dışarı
+ </string>
+ <string name="Chin-Neck">
+ Çene-Boyun
+ </string>
+ <string name="Clear">
+ Temizle
+ </string>
+ <string name="Cleft">
+ Çukur
+ </string>
+ <string name="Close Set Eyes">
+ Yakın Gözler
+ </string>
+ <string name="Closed">
+ Kapalı
+ </string>
+ <string name="Closed Back">
+ Arkası Kapalı
+ </string>
+ <string name="Closed Front">
+ Önü Kapalı
+ </string>
+ <string name="Closed Left">
+ Solu Kapalı
+ </string>
+ <string name="Closed Right">
+ Sağı Kapalı
+ </string>
+ <string name="Coin Purse">
+ Para Cüzdanı
+ </string>
+ <string name="Collar Back">
+ Yaka Arkası
+ </string>
+ <string name="Collar Front">
+ Yaka Önü
+ </string>
+ <string name="Corner Down">
+ Köşesi Aşağıda
+ </string>
+ <string name="Corner Up">
+ Köşesi Yukarıda
+ </string>
+ <string name="Creased">
+ Kırışık
+ </string>
+ <string name="Crooked Nose">
+ Yamuk Burun
+ </string>
+ <string name="Cuff Flare">
+ Geniş Paça
+ </string>
+ <string name="Dark">
+ Karanlık
+ </string>
+ <string name="Dark Green">
+ Koyu YeÅŸil
+ </string>
+ <string name="Darker">
+ Daha Koyu
+ </string>
+ <string name="Deep">
+ Derin
+ </string>
+ <string name="Default Heels">
+ Varsayılan Topuklar
+ </string>
+ <string name="Dense">
+ YoÄŸun
+ </string>
+ <string name="Double Chin">
+ Çift Çene
+ </string>
+ <string name="Downturned">
+ Aşağı Dönük
+ </string>
+ <string name="Duffle Bag">
+ Spor Çanta
+ </string>
+ <string name="Ear Angle">
+ Kulak Açısı
+ </string>
+ <string name="Ear Size">
+ Kulak Büyüklüğü
+ </string>
+ <string name="Ear Tips">
+ Kulak Uçları
+ </string>
+ <string name="Egg Head">
+ Yumurta Kafa
+ </string>
+ <string name="Eye Bags">
+ Göz Altı Torbaları
+ </string>
+ <string name="Eye Color">
+ Göz Rengi
+ </string>
+ <string name="Eye Depth">
+ Gözün İçeri Çöküklüğü
+ </string>
+ <string name="Eye Lightness">
+ Göz Parlaklığı
+ </string>
+ <string name="Eye Opening">
+ Göz Açıklığı
+ </string>
+ <string name="Eye Pop">
+ Gözlerin Dışarı Çıkıklığı
+ </string>
+ <string name="Eye Size">
+ Göz Büyüklüğü
+ </string>
+ <string name="Eye Spacing">
+ Gözlerin Aralığı
+ </string>
+ <string name="Eyebrow Arc">
+ KaÅŸ Kavisi
+ </string>
+ <string name="Eyebrow Density">
+ Kaş Kalınlığı
+ </string>
+ <string name="Eyebrow Height">
+ Kaş Yüksekliği
+ </string>
+ <string name="Eyebrow Points">
+ Kaş Yapısı
+ </string>
+ <string name="Eyebrow Size">
+ Kaş Büyüklüğü
+ </string>
+ <string name="Eyelash Length">
+ Kirpik UzunluÄŸu
+ </string>
+ <string name="Eyeliner">
+ Göz Kalemi
+ </string>
+ <string name="Eyeliner Color">
+ Göz Kalemi Rengi
+ </string>
+ <string name="Eyes Bugged">
+ Patlak Gözler
+ </string>
+ <string name="Face Shear">
+ Dikey Yüz Kaydırma
+ </string>
+ <string name="Facial Definition">
+ Yüz İfadesi
+ </string>
+ <string name="Far Set Eyes">
+ Ayrık Gözler
+ </string>
+ <string name="Fat Lips">
+ Kalın Dudaklar
+ </string>
+ <string name="Female">
+ Kadın
+ </string>
+ <string name="Fingerless">
+ Parmaksız
+ </string>
+ <string name="Fingers">
+ Parmaklar
+ </string>
+ <string name="Flared Cuffs">
+ Geniş Paçalar
+ </string>
+ <string name="Flat">
+ Düz
+ </string>
+ <string name="Flat Butt">
+ Düz Kıç
+ </string>
+ <string name="Flat Head">
+ Düz Kafa
+ </string>
+ <string name="Flat Toe">
+ Düz Ayak Ucu
+ </string>
+ <string name="Foot Size">
+ Ayak Büyüklüğü
+ </string>
+ <string name="Forehead Angle">
+ Alın Açısı
+ </string>
+ <string name="Forehead Heavy">
+ Belirgin Alın
+ </string>
+ <string name="Freckles">
+ Çiller
+ </string>
+ <string name="Front Fringe">
+ Ön Perçem
+ </string>
+ <string name="Full Back">
+ Arkası Düz
+ </string>
+ <string name="Full Eyeliner">
+ Çift Taraflı Göz Kalemi
+ </string>
+ <string name="Full Front">
+ Önü Düz
+ </string>
+ <string name="Full Hair Sides">
+ Saçlar Yanda
+ </string>
+ <string name="Full Sides">
+ Saçlar Yanda
+ </string>
+ <string name="Glossy">
+ Parlak
+ </string>
+ <string name="Glove Fingers">
+ Eldiven Parmakları
+ </string>
+ <string name="Glove Length">
+ Eldiven UzunluÄŸu
+ </string>
+ <string name="Hair">
+ Saç
+ </string>
+ <string name="Hair Back">
+ Saç: Arka
+ </string>
+ <string name="Hair Front">
+ Saç: Ön
+ </string>
+ <string name="Hair Sides">
+ Saç: Yanlar
+ </string>
+ <string name="Hair Sweep">
+ Saçı Yana Tarama
+ </string>
+ <string name="Hair Thickess">
+ Saç Kalınlığı
+ </string>
+ <string name="Hair Thickness">
+ Saç Kalınlığı
+ </string>
+ <string name="Hair Tilt">
+ Saç Eğimi
+ </string>
+ <string name="Hair Tilted Left">
+ Sola Eğimli Saç
+ </string>
+ <string name="Hair Tilted Right">
+ Sağa Eğimli Saç
+ </string>
+ <string name="Hair Volume">
+ Saç: Hacim
+ </string>
+ <string name="Hand Size">
+ El Büyüklüğü
+ </string>
+ <string name="Handlebars">
+ Gidon tipi
+ </string>
+ <string name="Head Length">
+ Kafa UzunluÄŸu
+ </string>
+ <string name="Head Shape">
+ Kafa Åžekli
+ </string>
+ <string name="Head Size">
+ Kafa Büyüklüğü
+ </string>
+ <string name="Head Stretch">
+ Kafayı Uzatma
+ </string>
+ <string name="Heel Height">
+ Topuk Yüksekliği
+ </string>
+ <string name="Heel Shape">
+ Topuk Åžekli
+ </string>
+ <string name="Height">
+ Yükseklik
+ </string>
+ <string name="High">
+ Yüksek
+ </string>
+ <string name="High Heels">
+ Yüksek Topuklar
+ </string>
+ <string name="High Jaw">
+ Ayrık
+ </string>
+ <string name="High Platforms">
+ Yüksek Topuklu
+ </string>
+ <string name="High and Tight">
+ Düşük
+ </string>
+ <string name="Higher">
+ Daha Yüksek
+ </string>
+ <string name="Hip Length">
+ Kalça Uzunluğu
+ </string>
+ <string name="Hip Width">
+ Kalça Genişliği
+ </string>
+ <string name="In">
+ İçeri
+ </string>
+ <string name="In Shdw Color">
+ İç Gölge Rengi
+ </string>
+ <string name="In Shdw Opacity">
+ İç Gölge Opaklığı
+ </string>
+ <string name="Inner Eye Corner">
+ Gözün İç Köşesi
+ </string>
+ <string name="Inner Eye Shadow">
+ İç Göz Gölgesi
+ </string>
+ <string name="Inner Shadow">
+ İç Gölge
+ </string>
+ <string name="Jacket Length">
+ Ceket UzunluÄŸu
+ </string>
+ <string name="Jacket Wrinkles">
+ Ceket Kırışıklıkları
+ </string>
+ <string name="Jaw Angle">
+ Çenenin Boyuna Uzaklığı
+ </string>
+ <string name="Jaw Jut">
+ Alt Çene Uzunluğu
+ </string>
+ <string name="Jaw Shape">
+ Çene Kemiği Genişliği
+ </string>
+ <string name="Join">
+ BirleÅŸik
+ </string>
+ <string name="Jowls">
+ Avurtlar
+ </string>
+ <string name="Knee Angle">
+ Diz Açısı
+ </string>
+ <string name="Knock Kneed">
+ Çarpık Bacaklı
+ </string>
+ <string name="Large">
+ Büyük
+ </string>
+ <string name="Large Hands">
+ Büyük Eller
+ </string>
+ <string name="Left Part">
+ Sola Ayırma
+ </string>
+ <string name="Leg Length">
+ Bacak UzunluÄŸu
+ </string>
+ <string name="Leg Muscles">
+ Bacak Kasları
+ </string>
+ <string name="Less">
+ Daha Az
+ </string>
+ <string name="Less Body Fat">
+ Daha Az Vücut Yağı
+ </string>
+ <string name="Less Curtains">
+ Daha Az Lincoln Sakal
+ </string>
+ <string name="Less Freckles">
+ Daha Az Çil
+ </string>
+ <string name="Less Full">
+ Daha Az Dolgun
+ </string>
+ <string name="Less Gravity">
+ Dik Göğüs
+ </string>
+ <string name="Less Love">
+ Daha Ä°nce Bel
+ </string>
+ <string name="Less Muscles">
+ Daha Az Kas
+ </string>
+ <string name="Less Muscular">
+ Daha Az Kaslı
+ </string>
+ <string name="Less Rosy">
+ Daha Az Pembe
+ </string>
+ <string name="Less Round">
+ Daha Az Yuvarlak
+ </string>
+ <string name="Less Saddle">
+ Basensiz
+ </string>
+ <string name="Less Square">
+ Daha Az Küt
+ </string>
+ <string name="Less Volume">
+ Daha Az Hacim
+ </string>
+ <string name="Less soul">
+ Daha az ruh
+ </string>
+ <string name="Lighter">
+ Daha Hafif
+ </string>
+ <string name="Lip Cleft">
+ Dudak Çukuru
+ </string>
+ <string name="Lip Cleft Depth">
+ Dudak Çukuru Derinliği
+ </string>
+ <string name="Lip Fullness">
+ Dudak DolgunluÄŸu
+ </string>
+ <string name="Lip Pinkness">
+ Dudak PembeliÄŸi
+ </string>
+ <string name="Lip Ratio">
+ Dudak Oranı
+ </string>
+ <string name="Lip Thickness">
+ Dudak Kalınlığı
+ </string>
+ <string name="Lip Width">
+ Dudak GeniÅŸliÄŸi
+ </string>
+ <string name="Lipgloss">
+ Dudak Parlatıcısı
+ </string>
+ <string name="Lipstick">
+ Ruj
+ </string>
+ <string name="Lipstick Color">
+ Ruj Rengi
+ </string>
+ <string name="Long">
+ Uzun
+ </string>
+ <string name="Long Head">
+ Uzun Kafa
+ </string>
+ <string name="Long Hips">
+ Yüksek kalça
+ </string>
+ <string name="Long Legs">
+ Uzun Bacaklar
+ </string>
+ <string name="Long Neck">
+ Uzun Boyun
+ </string>
+ <string name="Long Pigtails">
+ Yandan Uzun Kuyruk
+ </string>
+ <string name="Long Ponytail">
+ Uzun AtkuyruÄŸu
+ </string>
+ <string name="Long Torso">
+ Uzun Gövde
+ </string>
+ <string name="Long arms">
+ Uzun kollar
+ </string>
+ <string name="Loose Pants">
+ Bol Pantolon
+ </string>
+ <string name="Loose Shirt">
+ Bol Gömlek
+ </string>
+ <string name="Loose Sleeves">
+ Bol Kollu
+ </string>
+ <string name="Love Handles">
+ Bel Kalınlığı
+ </string>
+ <string name="Low">
+ Düşük
+ </string>
+ <string name="Low Heels">
+ Alçak Topuklar
+ </string>
+ <string name="Low Jaw">
+ BitiÅŸik
+ </string>
+ <string name="Low Platforms">
+ Alçak Topuklu
+ </string>
+ <string name="Low and Loose">
+ Yüksek
+ </string>
+ <string name="Lower">
+ Daha Alçak
+ </string>
+ <string name="Lower Bridge">
+ Alt Burun KemiÄŸi
+ </string>
+ <string name="Lower Cheeks">
+ Daha Alçak Yanaklar
+ </string>
+ <string name="Male">
+ Erkek
+ </string>
+ <string name="Middle Part">
+ Ortadan Ayırma
+ </string>
+ <string name="More">
+ Daha Fazla
+ </string>
+ <string name="More Blush">
+ Daha Fazla Allık
+ </string>
+ <string name="More Body Fat">
+ Daha Fazla Vücut Yağı
+ </string>
+ <string name="More Curtains">
+ Daha Çok Lincoln Sakal
+ </string>
+ <string name="More Eyeshadow">
+ Daha Fazla Göz Farı
+ </string>
+ <string name="More Freckles">
+ Daha Çok Çil
+ </string>
+ <string name="More Full">
+ Daha Dolgun
+ </string>
+ <string name="More Gravity">
+ Sarkık Göğüs
+ </string>
+ <string name="More Lipstick">
+ Daha Çok Ruj
+ </string>
+ <string name="More Love">
+ Daha Kalın Bel
+ </string>
+ <string name="More Lower Lip">
+ Daha Dolgun Alt Dudak
+ </string>
+ <string name="More Muscles">
+ Daha Çok Kas
+ </string>
+ <string name="More Muscular">
+ Daha Kaslı
+ </string>
+ <string name="More Rosy">
+ Daha Pembe
+ </string>
+ <string name="More Round">
+ Daha Yuvarlak
+ </string>
+ <string name="More Saddle">
+ Basenli
+ </string>
+ <string name="More Sloped">
+ Daha EÄŸimli
+ </string>
+ <string name="More Square">
+ Daha Küt
+ </string>
+ <string name="More Upper Lip">
+ Daha Dolgun Ãœst Dudak
+ </string>
+ <string name="More Vertical">
+ Daha Dikey
+ </string>
+ <string name="More Volume">
+ Daha Hacimli
+ </string>
+ <string name="More soul">
+ Daha çok ruh
+ </string>
+ <string name="Moustache">
+ Bıyık
+ </string>
+ <string name="Mouth Corner">
+ Ağız Köşesi
+ </string>
+ <string name="Mouth Position">
+ Ağzın Konumu
+ </string>
+ <string name="Mowhawk">
+ Mowhawk Saçı
+ </string>
+ <string name="Muscular">
+ Kaslı
+ </string>
+ <string name="Mutton Chops">
+ GeniÅŸ Favori
+ </string>
+ <string name="Nail Polish">
+ Tırnak Cilası
+ </string>
+ <string name="Nail Polish Color">
+ Tırnak Cilası Rengi
+ </string>
+ <string name="Narrow">
+ Dar
+ </string>
+ <string name="Narrow Back">
+ Arkası Dar
+ </string>
+ <string name="Narrow Front">
+ Önü Dar
+ </string>
+ <string name="Narrow Lips">
+ Küçük Dudaklar
+ </string>
+ <string name="Natural">
+ DoÄŸal
+ </string>
+ <string name="Neck Length">
+ Boyun UzunluÄŸu
+ </string>
+ <string name="Neck Thickness">
+ Boyun Kalınlığı
+ </string>
+ <string name="No Blush">
+ Allık Yok
+ </string>
+ <string name="No Eyeliner">
+ Göz Kalemi Yok
+ </string>
+ <string name="No Eyeshadow">
+ Göz Farı Yok
+ </string>
+ <string name="No Lipgloss">
+ Dudak Parlatıcısı Yok
+ </string>
+ <string name="No Lipstick">
+ Ruj Yok
+ </string>
+ <string name="No Part">
+ Ayırma Yok
+ </string>
+ <string name="No Polish">
+ Cila Yok
+ </string>
+ <string name="No Red">
+ Kırmızı Yok
+ </string>
+ <string name="No Spikes">
+ DikleÅŸtirme Yok
+ </string>
+ <string name="No White">
+ Beyaz Yok
+ </string>
+ <string name="No Wrinkles">
+ Kırışıklık Yok
+ </string>
+ <string name="Normal Lower">
+ Normal Alt
+ </string>
+ <string name="Normal Upper">
+ Normal Ãœst
+ </string>
+ <string name="Nose Left">
+ Sola EÄŸimli Burun
+ </string>
+ <string name="Nose Right">
+ SaÄŸa EÄŸimli Burun
+ </string>
+ <string name="Nose Size">
+ Burun Büyüklüğü
+ </string>
+ <string name="Nose Thickness">
+ Burun Kalınlığı
+ </string>
+ <string name="Nose Tip Angle">
+ Burun Ucu Açısı
+ </string>
+ <string name="Nose Tip Shape">
+ Burun Ucu Åžekli
+ </string>
+ <string name="Nose Width">
+ Burun GeniÅŸliÄŸi
+ </string>
+ <string name="Nostril Division">
+ Burun Deliği Ayrımı
+ </string>
+ <string name="Nostril Width">
+ Burun DeliÄŸi GeniÅŸliÄŸi
+ </string>
+ <string name="Opaque">
+ Opak
+ </string>
+ <string name="Open">
+ Aç
+ </string>
+ <string name="Open Back">
+ Arkayı Aç
+ </string>
+ <string name="Open Front">
+ Önü Aç
+ </string>
+ <string name="Open Left">
+ Solu Aç
+ </string>
+ <string name="Open Right">
+ Sağı Aç
+ </string>
+ <string name="Orange">
+ Turuncu
+ </string>
+ <string name="Out">
+ Dışarı
+ </string>
+ <string name="Out Shdw Color">
+ Dış Gölge Rengi
+ </string>
+ <string name="Out Shdw Opacity">
+ Dış Gölge Opaklığı
+ </string>
+ <string name="Outer Eye Corner">
+ Gözün Dış Köşesi
+ </string>
+ <string name="Outer Eye Shadow">
+ Dış Göz Gölgesi
+ </string>
+ <string name="Outer Shadow">
+ Dış Gölge
+ </string>
+ <string name="Overbite">
+ Öne Doğru
+ </string>
+ <string name="Package">
+ Apış Arası Şişkinliği
+ </string>
+ <string name="Painted Nails">
+ Ojeli Tırnaklar
+ </string>
+ <string name="Pale">
+ Soluk
+ </string>
+ <string name="Pants Crotch">
+ Pantolon Ağı
+ </string>
+ <string name="Pants Fit">
+ Pantolon Oturması
+ </string>
+ <string name="Pants Length">
+ Pantolon UzunluÄŸu
+ </string>
+ <string name="Pants Waist">
+ Pantolon Bel Ölçüsü
+ </string>
+ <string name="Pants Wrinkles">
+ Pantolon Kırışıklıkları
+ </string>
+ <string name="Part">
+ Ayırma
+ </string>
+ <string name="Part Bangs">
+ Ayrılmış Kahküller
+ </string>
+ <string name="Pectorals">
+ Göğüs Kasları
+ </string>
+ <string name="Pigment">
+ Pigment
+ </string>
+ <string name="Pigtails">
+ Yan Kuyruklar
+ </string>
+ <string name="Pink">
+ Pembe
+ </string>
+ <string name="Pinker">
+ Daha Pembe
+ </string>
+ <string name="Platform Height">
+ Topuk Yüksekliği
+ </string>
+ <string name="Platform Width">
+ Topuk GeniÅŸliÄŸi
+ </string>
+ <string name="Pointy">
+ Dar
+ </string>
+ <string name="Pointy Heels">
+ Sivri Topuklar
+ </string>
+ <string name="Ponytail">
+ AtkuyruÄŸu
+ </string>
+ <string name="Poofy Skirt">
+ Kabarık Etek
+ </string>
+ <string name="Pop Left Eye">
+ Sol Gözü Dışarı Çıkar
+ </string>
+ <string name="Pop Right Eye">
+ Sağ Gözü Dışarı Çıkar
+ </string>
+ <string name="Puffy">
+ ÅžiÅŸkin
+ </string>
+ <string name="Puffy Eyelids">
+ Şişkin Göz Kapakları
+ </string>
+ <string name="Rainbow Color">
+ Gökkuşağı Rengi
+ </string>
+ <string name="Red Hair">
+ Kırmızı Saç
+ </string>
+ <string name="Regular">
+ Normal
+ </string>
+ <string name="Right Part">
+ Sağa Ayırma
+ </string>
+ <string name="Rosy Complexion">
+ Kırmızı Yanaklı
+ </string>
+ <string name="Round">
+ Yuvarlak
+ </string>
+ <string name="Ruddiness">
+ Kırmızılık
+ </string>
+ <string name="Ruddy">
+ Kırmızı
+ </string>
+ <string name="Rumpled Hair">
+ Dağınık Saç
+ </string>
+ <string name="Saddle Bags">
+ Basen GeniÅŸliÄŸi
+ </string>
+ <string name="Scrawny Leg">
+ Sıska Bacak
+ </string>
+ <string name="Separate">
+ Ayrık
+ </string>
+ <string name="Shallow">
+ Sığ
+ </string>
+ <string name="Shear Back">
+ Arka DolgunluÄŸu
+ </string>
+ <string name="Shear Face">
+ Yüzü Dikey Kaydır
+ </string>
+ <string name="Shear Front">
+ Ön Dolgunluğu
+ </string>
+ <string name="Shear Left Up">
+ Solu Yukarı Kaydır
+ </string>
+ <string name="Shear Right Up">
+ Sağı Yukarı Kaydır
+ </string>
+ <string name="Sheared Back">
+ Arkası Dolgun
+ </string>
+ <string name="Sheared Front">
+ Önü Dolgun
+ </string>
+ <string name="Shift Left">
+ Sola Kaydır
+ </string>
+ <string name="Shift Mouth">
+ Ağzı Kaydırma
+ </string>
+ <string name="Shift Right">
+ Sağa Kaydır
+ </string>
+ <string name="Shirt Bottom">
+ Gömlek Eteği
+ </string>
+ <string name="Shirt Fit">
+ Gömlek Boyu
+ </string>
+ <string name="Shirt Wrinkles">
+ Gömlek Kırışıklıkları
+ </string>
+ <string name="Shoe Height">
+ Ayakkabı Yüksekliği
+ </string>
+ <string name="Short">
+ Kısa
+ </string>
+ <string name="Short Arms">
+ Kısa Kollar
+ </string>
+ <string name="Short Legs">
+ Kısa Bacaklar
+ </string>
+ <string name="Short Neck">
+ Kısa Boyun
+ </string>
+ <string name="Short Pigtails">
+ Yandan Kısa Kuyruk
+ </string>
+ <string name="Short Ponytail">
+ Kısa Atkuyruğu
+ </string>
+ <string name="Short Sideburns">
+ Kısa Favoriler
+ </string>
+ <string name="Short Torso">
+ Kısa Gövde
+ </string>
+ <string name="Short hips">
+ Düşük kalça
+ </string>
+ <string name="Shoulders">
+ Omuzlar
+ </string>
+ <string name="Side Fringe">
+ Yan Perçem
+ </string>
+ <string name="Sideburns">
+ Favoriler
+ </string>
+ <string name="Sides Hair">
+ Yan Saçlar
+ </string>
+ <string name="Sides Hair Down">
+ Aşağı Doğru Yan Saç
+ </string>
+ <string name="Sides Hair Up">
+ Yukarı Doğru Yan Saç
+ </string>
+ <string name="Skinny Neck">
+ Ä°nce Boyun
+ </string>
+ <string name="Skirt Fit">
+ Etek Boyu
+ </string>
+ <string name="Skirt Length">
+ Etek UzunluÄŸu
+ </string>
+ <string name="Slanted Forehead">
+ Eğimli Alın
+ </string>
+ <string name="Sleeve Length">
+ Kol UzunluÄŸu
+ </string>
+ <string name="Sleeve Looseness">
+ Kol BolluÄŸu
+ </string>
+ <string name="Slit Back">
+ Yırtmaç: Geri
+ </string>
+ <string name="Slit Front">
+ Yırtmaç: Ön
+ </string>
+ <string name="Slit Left">
+ Yırtmaç: Sol
+ </string>
+ <string name="Slit Right">
+ Yırtmaç: Sağ
+ </string>
+ <string name="Small">
+ Küçük
+ </string>
+ <string name="Small Hands">
+ Küçük Eller
+ </string>
+ <string name="Small Head">
+ Küçük Kafa
+ </string>
+ <string name="Smooth">
+ Düz
+ </string>
+ <string name="Smooth Hair">
+ Düz Saç
+ </string>
+ <string name="Socks Length">
+ Çorap Uzunluğu
+ </string>
+ <string name="Soulpatch">
+ Dudak Altı Sakal
+ </string>
+ <string name="Sparse">
+ Seyrek
+ </string>
+ <string name="Spiked Hair">
+ Dikleştirilmiş Saç
+ </string>
+ <string name="Square">
+ GeniÅŸ
+ </string>
+ <string name="Square Toe">
+ Küt Burunlu
+ </string>
+ <string name="Squash Head">
+ Kafayı Bastır
+ </string>
+ <string name="Stretch Head">
+ Kafayı Uzat
+ </string>
+ <string name="Sunken">
+ Çökük
+ </string>
+ <string name="Sunken Chest">
+ Çökük Göğüs
+ </string>
+ <string name="Sunken Eyes">
+ Çökük Gözler
+ </string>
+ <string name="Sweep Back">
+ Arkaya Tarama
+ </string>
+ <string name="Sweep Forward">
+ Öne Tarama
+ </string>
+ <string name="Tall">
+ Uzun
+ </string>
+ <string name="Taper Back">
+ Arkası Kısa
+ </string>
+ <string name="Taper Front">
+ Önü Kısa
+ </string>
+ <string name="Thick Heels">
+ Kalın Topuklar
+ </string>
+ <string name="Thick Neck">
+ Kalın Boyun
+ </string>
+ <string name="Thick Toe">
+ Kalın Ayak Ucu
+ </string>
+ <string name="Thin">
+ Ä°nce
+ </string>
+ <string name="Thin Eyebrows">
+ Ä°nce KaÅŸlar
+ </string>
+ <string name="Thin Lips">
+ Ä°nce Dudaklar
+ </string>
+ <string name="Thin Nose">
+ Ä°nce Burun
+ </string>
+ <string name="Tight Chin">
+ Çift Çene
+ </string>
+ <string name="Tight Cuffs">
+ Dar Paçalar
+ </string>
+ <string name="Tight Pants">
+ Dar Pantolon
+ </string>
+ <string name="Tight Shirt">
+ Dar Gömlek
+ </string>
+ <string name="Tight Skirt">
+ Dar Etek
+ </string>
+ <string name="Tight Sleeves">
+ Dar Kollu
+ </string>
+ <string name="Toe Shape">
+ Ayakkabu Burnu Åžekli
+ </string>
+ <string name="Toe Thickness">
+ Ayakkabu Burnu Kalınlığı
+ </string>
+ <string name="Torso Length">
+ Gövde Uzunluğu
+ </string>
+ <string name="Torso Muscles">
+ Gövde Kasları
+ </string>
+ <string name="Torso Scrawny">
+ Sıska Gövde
+ </string>
+ <string name="Unattached">
+ Ayrık
+ </string>
+ <string name="Uncreased">
+ BuruÅŸuk olmayan
+ </string>
+ <string name="Underbite">
+ Geriye DoÄŸru
+ </string>
+ <string name="Unnatural">
+ DoÄŸal Olmayan
+ </string>
+ <string name="Upper Bridge">
+ Ãœst Burun KemiÄŸi
+ </string>
+ <string name="Upper Cheeks">
+ Ãœst Yanaklar
+ </string>
+ <string name="Upper Chin Cleft">
+ Üst Çene Çukuru
+ </string>
+ <string name="Upper Eyelid Fold">
+ Üst Göz Kapağı Kıvrımı
+ </string>
+ <string name="Upturned">
+ Yukarı dönük
+ </string>
+ <string name="Very Red">
+ Çok Kırmızı
+ </string>
+ <string name="Waist Height">
+ Bel Yüksekliği
+ </string>
+ <string name="Well-Fed">
+ Dolgun
+ </string>
+ <string name="White Hair">
+ Beyaz Saç
+ </string>
+ <string name="Wide">
+ GeniÅŸ
+ </string>
+ <string name="Wide Back">
+ GeniÅŸ Arka
+ </string>
+ <string name="Wide Front">
+ Geniş Ön
+ </string>
+ <string name="Wide Lips">
+ GeniÅŸ Dudaklar
+ </string>
+ <string name="Wild">
+ Çılgın
+ </string>
+ <string name="Wrinkles">
+ Kırışıklıklar
+ </string>
+ <string name="LocationCtrlAddLandmarkTooltip">
+ Yer Ä°mlerime Ekle
+ </string>
+ <string name="LocationCtrlEditLandmarkTooltip">
+ Yer İmimi Düzenle
+ </string>
+ <string name="LocationCtrlInfoBtnTooltip">
+ Geçerli konum hakkında daha fazla bilgi gör
+ </string>
+ <string name="LocationCtrlComboBtnTooltip">
+ Konum geçmişim
+ </string>
+ <string name="LocationCtrlForSaleTooltip">
+ Bu araziyi satın al
+ </string>
+ <string name="LocationCtrlVoiceTooltip">
+ Ses burada kullanılamaz
+ </string>
+ <string name="LocationCtrlFlyTooltip">
+ Uçmaya izin verilmiyor
+ </string>
+ <string name="LocationCtrlPushTooltip">
+ Ä°tme yok
+ </string>
+ <string name="LocationCtrlBuildTooltip">
+ Nesne inşa etmeye/düşürmeye izin verilmiyor
+ </string>
+ <string name="LocationCtrlScriptsTooltip">
+ Komut dosyalarına izin verilmiyor
+ </string>
+ <string name="LocationCtrlDamageTooltip">
+ Sağlık
+ </string>
+ <string name="LocationCtrlAdultIconTooltip">
+ Yetişkin Bölgesi
+ </string>
+ <string name="LocationCtrlModerateIconTooltip">
+ Orta Bölge
+ </string>
+ <string name="LocationCtrlGeneralIconTooltip">
+ Genel Bölge
+ </string>
+ <string name="LocationCtrlSeeAVsTooltip">
+ Bu parselin dışında avatarlar görünür durumda ve sohbete izin veriliyor
+ </string>
+ <string name="UpdaterWindowTitle">
+ [APP_NAME] Güncelleştirme
+ </string>
+ <string name="UpdaterNowUpdating">
+ [APP_NAME] güncelleştiriliyor...
+ </string>
+ <string name="UpdaterNowInstalling">
+ [APP_NAME] yükleniyor...
+ </string>
+ <string name="UpdaterUpdatingDescriptive">
+ [APP_NAME] Görüntüleyiciniz en son sürüme güncelleştiriliyor. Bu biraz zaman alabilir, bu nedenle sabırlı olun.
+ </string>
+ <string name="UpdaterProgressBarTextWithEllipses">
+ Güncelleştirme karşıdan yükleniyor...
+ </string>
+ <string name="UpdaterProgressBarText">
+ Güncelleştirme karşıdan yükleniyor
+ </string>
+ <string name="UpdaterFailDownloadTitle">
+ Güncelleştirmenin karşıdan yüklenmesi başarılamadı
+ </string>
+ <string name="UpdaterFailUpdateDescriptive">
+ [APP_NAME] güncellenirken bir hata oluştu. Lütfen www.secondlife.com adresinden son sürümü karşıdan yükleyin.
+ </string>
+ <string name="UpdaterFailInstallTitle">
+ Güncelleştirmenin yüklenmesi başarılamadı
+ </string>
+ <string name="UpdaterFailStartTitle">
+ Görüntüleyici başlatılamadı
+ </string>
+ <string name="ItemsComingInTooFastFrom">
+ [APP_NAME]: [FROM_NAME]&apos;den öğeler çok hızlı geliyor, [TIME] saniye boyunca otomatik ön izleme devre dışı bırakıldı
+ </string>
+ <string name="ItemsComingInTooFast">
+ [APP_NAME]: Öğeler çok hızlı geliyor, [TIME] saniye boyunca otomatik ön izleme devre dışı bırakıldı
+ </string>
+ <string name="IM_logging_string">
+ -- Anlık ileti günlük tutulması etkin --
+ </string>
+ <string name="IM_typing_start_string">
+ [NAME] yazıyor...
+ </string>
+ <string name="Unnamed">
+ (Ä°simsiz)
+ </string>
+ <string name="IM_moderated_chat_label">
+ (Yönetilen: Varsayılan durumda sesler kapalı)
+ </string>
+ <string name="IM_unavailable_text_label">
+ Bu aramada metin sohbeti kullanılamaz.
+ </string>
+ <string name="IM_muted_text_label">
+ Bir Grup Moderatörü tarafından metin sohbetiniz devre dışı bırakıldı.
+ </string>
+ <string name="IM_default_text_label">
+ Anlık ileti göndermek için buraya tıklayın.
+ </string>
+ <string name="IM_to_label">
+ Kime
+ </string>
+ <string name="IM_moderator_label">
+ (Moderatör)
+ </string>
+ <string name="Saved_message">
+ (Kaydedildi [LONG_TIMESTAMP])
+ </string>
+ <string name="IM_unblock_only_groups_friends">
+ Bu mesajı görmek için Tercihler/Gizlilik&apos;de &apos;Sadece arkadaşlar ve gruplar beni arasın veya Aİ göndersin&apos; seçeneğinin işaretini kaldırmalısınız.
+ </string>
+ <string name="answered_call">
+ Aramanız yanıtlandı
+ </string>
+ <string name="you_started_call">
+ Bir sesli arama başlattınız
+ </string>
+ <string name="you_joined_call">
+ Sesli aramaya katıldınız
+ </string>
+ <string name="name_started_call">
+ [NAME] bir sesli arama başlattı
+ </string>
+ <string name="ringing-im">
+ Sesli aramaya katılınılıyor...
+ </string>
+ <string name="connected-im">
+ Bağlandı, kapatmak için Aramadan Çık üzerine tıklayın
+ </string>
+ <string name="hang_up-im">
+ Sesli aramadan çıkıldı
+ </string>
+ <string name="answering-im">
+ Bağlanıyor...
+ </string>
+ <string name="conference-title">
+ Özel Konferans
+ </string>
+ <string name="conference-title-incoming">
+ [AGENT_NAME] ile konferans
+ </string>
+ <string name="inventory_item_offered-im">
+ Teklif edilen envanter öğesi:
+ </string>
+ <string name="share_alert">
+ Envanterinizden buraya öğeler sürükleyin
+ </string>
+ <string name="no_session_message">
+ (AÄ° Oturumu Mevcut DeÄŸil)
+ </string>
+ <string name="only_user_message">
+ Bu oturumdaki tek kullanıcısınız.
+ </string>
+ <string name="offline_message">
+ [NAME] çevrim dışı.
+ </string>
+ <string name="invite_message">
+ Bu sesli sohbeti kabul etmek/bağlanmak için [BUTTON NAME] düğmesine tıklayın.
+ </string>
+ <string name="muted_message">
+ Bu Sakini engellediniz. Bir ileti gönderdiğinizde engelleme otomatik olarak kaldırılır.
+ </string>
+ <string name="generic">
+ Talep gönderilirken hata oluştu, lütfen daha sonra tekrar deneyin.
+ </string>
+ <string name="generic_request_error">
+ Talep gönderilirken hata oluştu, lütfen daha sonra tekrar deneyin.
+ </string>
+ <string name="insufficient_perms_error">
+ Yeterli izne sahip deÄŸilsiniz.
+ </string>
+ <string name="session_does_not_exist_error">
+ Bu oturum artık mevcut değil.
+ </string>
+ <string name="no_ability_error">
+ Bu yeteneÄŸe sahip deÄŸilsiniz.
+ </string>
+ <string name="no_ability">
+ Bu yeteneÄŸe sahip deÄŸilsiniz.
+ </string>
+ <string name="not_a_mod_error">
+ Bir oturum moderatörü değilsiniz.
+ </string>
+ <string name="muted">
+ Bir grup moderatörü metin sohbetinizi devre dışı bıraktı.
+ </string>
+ <string name="muted_error">
+ Bir grup moderatörü metin sohbetinizi devre dışı bıraktı.
+ </string>
+ <string name="add_session_event">
+ [RECIPIENT] ile sohbet oturumuna kullanıcı eklenemiyor.
+ </string>
+ <string name="message">
+ İletiniz [RECIPIENT] ile sohbet oturumuna gönderilemedi.
+ </string>
+ <string name="message_session_event">
+ İletiniz [RECIPIENT] ile sohbet oturumuna gönderilemedi.
+ </string>
+ <string name="mute">
+ Yönetme sırasında hata oluştu.
+ </string>
+ <string name="removed">
+ Gruptan çıkarıldınız.
+ </string>
+ <string name="removed_from_group">
+ Gruptan çıkarıldınız.
+ </string>
+ <string name="close_on_no_ability">
+ Sohbet oturumunda bulunma yeteneğine artık sahip değilsiniz.
+ </string>
+ <string name="unread_chat_single">
+ [SOURCES] yeni bir şey söyledi
+ </string>
+ <string name="unread_chat_multiple">
+ [SOURCES] yeni bir şey söyledi
+ </string>
+ <string name="session_initialization_timed_out_error">
+ Oturum başlatılması zaman aşımına uğradı.
+ </string>
+ <string name="Home position set.">
+ Ana konum ayarlandı.
+ </string>
+ <string name="voice_morphing_url">
+ http://secondlife.com/landing/voicemorphing
+ </string>
+ <string name="paid_you_ldollars">
+ [NAME] size [REASON] L$[AMOUNT] ödedi.
+ </string>
+ <string name="paid_you_ldollars_no_reason">
+ [NAME] size L$[AMOUNT] ödedi.
+ </string>
+ <string name="you_paid_ldollars">
+ [NAME]&apos;e [REASON] L$[AMOUNT] ödediniz.
+ </string>
+ <string name="you_paid_ldollars_no_info">
+ L$[AMOUNT] ödediniz.
+ </string>
+ <string name="you_paid_ldollars_no_reason">
+ [NAME]&apos;e L$[AMOUNT] ödediniz.
+ </string>
+ <string name="you_paid_ldollars_no_name">
+ [REASON] L$[AMOUNT] ödediniz.
+ </string>
+ <string name="you_paid_failure_ldollars">
+ [REASON] [NAME]&apos;e L$[AMOUNT] ödeyemediniz.
+ </string>
+ <string name="you_paid_failure_ldollars_no_info">
+ L$[AMOUNT] ödeyemediniz.
+ </string>
+ <string name="you_paid_failure_ldollars_no_reason">
+ [NAME]&apos;e L$[AMOUNT] ödeyemediniz.
+ </string>
+ <string name="you_paid_failure_ldollars_no_name">
+ [REASON] L$[AMOUNT] ödeyemediniz.
+ </string>
+ <string name="for item">
+ [ITEM] için.
+ </string>
+ <string name="for a parcel of land">
+ bir arazi parseli için.
+ </string>
+ <string name="for a land access pass">
+ bir arazi erişim hakkı için
+ </string>
+ <string name="for deeding land">
+ arazi devretmek için
+ </string>
+ <string name="to create a group">
+ bir grup oluşturmak için
+ </string>
+ <string name="to join a group">
+ bir grupa katılmak için
+ </string>
+ <string name="to upload">
+ karşıya yüklemek için
+ </string>
+ <string name="to publish a classified ad">
+ bir ilan yayınlamak için
+ </string>
+ <string name="giving">
+ L$ [AMOUNT] veriliyor
+ </string>
+ <string name="uploading_costs">
+ Karşıya yüklemenin maliyeti: L$ [AMOUNT]
+ </string>
+ <string name="this_costs">
+ Bunun maliyeti: L$ [AMOUNT]
+ </string>
+ <string name="buying_selected_land">
+ L$ [AMOUNT] karşılığında seçilen arazi satın alınıyor
+ </string>
+ <string name="this_object_costs">
+ Bu nesnenin maliyeti: L$ [AMOUNT]
+ </string>
+ <string name="group_role_everyone">
+ Herkes
+ </string>
+ <string name="group_role_officers">
+ Yetkililer
+ </string>
+ <string name="group_role_owners">
+ Sahipler
+ </string>
+ <string name="group_member_status_online">
+ Çevrimiçi
+ </string>
+ <string name="uploading_abuse_report">
+ Kötüye Kullanım Bildirimi Karşıya Yükleniyor...
+ </string>
+ <string name="New Shape">
+ Yeni Åžekil
+ </string>
+ <string name="New Skin">
+ Yeni Dış Katman
+ </string>
+ <string name="New Hair">
+ Yeni Saç
+ </string>
+ <string name="New Eyes">
+ Yeni Gözler
+ </string>
+ <string name="New Shirt">
+ Yeni Gömlek
+ </string>
+ <string name="New Pants">
+ Yeni Pantolon
+ </string>
+ <string name="New Shoes">
+ Yeni Ayakkabılar
+ </string>
+ <string name="New Socks">
+ Yeni Çoraplar
+ </string>
+ <string name="New Jacket">
+ Yeni Ceket
+ </string>
+ <string name="New Gloves">
+ Yeni Eldivenler
+ </string>
+ <string name="New Undershirt">
+ Yeni Fanila
+ </string>
+ <string name="New Underpants">
+ Yeni Külot
+ </string>
+ <string name="New Skirt">
+ Yeni Etek
+ </string>
+ <string name="New Alpha">
+ Yeni Alfa
+ </string>
+ <string name="New Tattoo">
+ Yeni Dövme
+ </string>
+ <string name="New Physics">
+ Yeni Fizik
+ </string>
+ <string name="Invalid Wearable">
+ Geçersiz Giyilebilir
+ </string>
+ <string name="New Gesture">
+ Yeni Mimik
+ </string>
+ <string name="New Script">
+ Yeni Komut Dosyası
+ </string>
+ <string name="New Note">
+ Yeni Not
+ </string>
+ <string name="New Folder">
+ Yeni Klasör
+ </string>
+ <string name="Contents">
+ İçerik
+ </string>
+ <string name="Gesture">
+ Mimik
+ </string>
+ <string name="Male Gestures">
+ Erkek Mimikleri
+ </string>
+ <string name="Female Gestures">
+ Kadın Mimikleri
+ </string>
+ <string name="Other Gestures">
+ DiÄŸer Mimikler
+ </string>
+ <string name="Speech Gestures">
+ KonuÅŸma Mimikleri
+ </string>
+ <string name="Common Gestures">
+ Favori Mimikler
+ </string>
+ <string name="Male - Excuse me">
+ Erkek - Afedersiniz
+ </string>
+ <string name="Male - Get lost">
+ Erkek - Ä°ÅŸine bak
+ </string>
+ <string name="Male - Blow kiss">
+ Erkek - Öpücük gönderme
+ </string>
+ <string name="Male - Boo">
+ Erkek - Yuh çekme
+ </string>
+ <string name="Male - Bored">
+ Erkek - Canı sıkılmış
+ </string>
+ <string name="Male - Hey">
+ Erkek - Hey
+ </string>
+ <string name="Male - Laugh">
+ Erkek - Gülme
+ </string>
+ <string name="Male - Repulsed">
+ Erkek - TiksinmiÅŸ
+ </string>
+ <string name="Male - Shrug">
+ Erkek - Omuz Silkme
+ </string>
+ <string name="Male - Stick tougue out">
+ Erkek - Dil çıkarma
+ </string>
+ <string name="Male - Wow">
+ Erkek - Vay be
+ </string>
+ <string name="Female - Chuckle">
+ Kadın - Kıkırdama
+ </string>
+ <string name="Female - Cry">
+ Kadın - Ağlama
+ </string>
+ <string name="Female - Embarrassed">
+ Kadın - Utanmış
+ </string>
+ <string name="Female - Excuse me">
+ Kadın - Afedersiniz
+ </string>
+ <string name="Female - Get lost">
+ Kadın - İşine bak
+ </string>
+ <string name="Female - Blow kiss">
+ Kadın - Öpücük gönderme
+ </string>
+ <string name="Female - Boo">
+ Kadın - Yuh çekme
+ </string>
+ <string name="Female - Bored">
+ Kadın - Canı sıkılmış
+ </string>
+ <string name="Female - Hey">
+ Kadın - Hey
+ </string>
+ <string name="Female - Hey baby">
+ Kadın - Hey bebek
+ </string>
+ <string name="Female - Laugh">
+ Kadın - Gülme
+ </string>
+ <string name="Female - Looking good">
+ Kadın - Yakışıklı
+ </string>
+ <string name="Female - Over here">
+ Kadın - Buraya baksana
+ </string>
+ <string name="Female - Please">
+ Kadın - Lütfen
+ </string>
+ <string name="Female - Repulsed">
+ Kadın - Tiksinmiş
+ </string>
+ <string name="Female - Shrug">
+ Kadın - Omuz Silkme
+ </string>
+ <string name="Female - Stick tougue out">
+ Kadın - Dil çıkarma
+ </string>
+ <string name="Female - Wow">
+ Kadın - Vay be
+ </string>
+ <string name="/bow">
+ /selamlama
+ </string>
+ <string name="/clap">
+ /alkış
+ </string>
+ <string name="/count">
+ /sayım
+ </string>
+ <string name="/extinguish">
+ /söndürme
+ </string>
+ <string name="/kmb">
+ /hib
+ </string>
+ <string name="/muscle">
+ /kas
+ </string>
+ <string name="/no">
+ /hayır
+ </string>
+ <string name="/no!">
+ /hayır!
+ </string>
+ <string name="/paper">
+ /kağıt
+ </string>
+ <string name="/pointme">
+ /beni göster
+ </string>
+ <string name="/pointyou">
+ /seni göster
+ </string>
+ <string name="/rock">
+ /kaya
+ </string>
+ <string name="/scissor">
+ /makas
+ </string>
+ <string name="/smoke">
+ /duman
+ </string>
+ <string name="/stretch">
+ /uzatma
+ </string>
+ <string name="/whistle">
+ /ıslık
+ </string>
+ <string name="/yes">
+ /evet
+ </string>
+ <string name="/yes!">
+ /evet!
+ </string>
+ <string name="afk">
+ kbd
+ </string>
+ <string name="dance1">
+ dans1
+ </string>
+ <string name="dance2">
+ dans2
+ </string>
+ <string name="dance3">
+ dans3
+ </string>
+ <string name="dance4">
+ dans4
+ </string>
+ <string name="dance5">
+ dans5
+ </string>
+ <string name="dance6">
+ dans6
+ </string>
+ <string name="dance7">
+ dans7
+ </string>
+ <string name="dance8">
+ dans8
+ </string>
+ <string name="AvatarBirthDateFormat">
+ [mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt]
+ </string>
+ <string name="DefaultMimeType">
+ hiçbiri/hiçbiri
+ </string>
+ <string name="texture_load_dimensions_error">
+ [WIDTH]*[HEIGHT] çözünürlüğünden büyük görüntüler yüklenemez
+ </string>
+ <string name="words_separator" value=","/>
+ <string name="server_is_down">
+ Tüm çabalarımıza rağmen beklenmeyen bir hata meydana geldi.
+
+ Hizmetle ilişkili bilinen bir sorun olup olmadığını görmek için lütfen status.secondlifegrid.net adresine bakın.
+ Sorun yaşamaya devam ederseniz lütfen ağınızın ve güvenlik duvarınızın ayarlarına bakın.
+ </string>
+ <string name="dateTimeWeekdaysNames">
+ Pazar:Pazartesi:Salı:Çarşamba:Perşembe:Cuma:Cumartesi
+ </string>
+ <string name="dateTimeWeekdaysShortNames">
+ Paz:Pzt:Sal:Çar:Per:Cum:Cmt
+ </string>
+ <string name="dateTimeMonthNames">
+ Ocak:Şubat:Mart:Nisan:Mayıs:Haziran:Temmuz:Ağustos:Eylül:Ekim:Kasım:Aralık
+ </string>
+ <string name="dateTimeMonthShortNames">
+ Oca:Åžub:Mar:Nis:May:Haz:Tem:AÄŸu:Eyl:Eki:Kas:Ara
+ </string>
+ <string name="dateTimeDayFormat">
+ [MDAY]
+ </string>
+ <string name="dateTimeAM">
+ ÖÖ
+ </string>
+ <string name="dateTimePM">
+ ÖS
+ </string>
+ <string name="LocalEstimateUSD">
+ US$ [AMOUNT]
+ </string>
+ <string name="Membership">
+ Ãœyelik
+ </string>
+ <string name="Roles">
+ Roller
+ </string>
+ <string name="Group Identity">
+ Grup KimliÄŸi
+ </string>
+ <string name="Parcel Management">
+ Parsel Yönetimi
+ </string>
+ <string name="Parcel Identity">
+ Parsel KimliÄŸi
+ </string>
+ <string name="Parcel Settings">
+ Parsel Ayarları
+ </string>
+ <string name="Parcel Powers">
+ Parsel Güçleri
+ </string>
+ <string name="Parcel Access">
+ Parsel EriÅŸimi
+ </string>
+ <string name="Parcel Content">
+ Parsel İçeriği
+ </string>
+ <string name="Object Management">
+ Nesne Yönetimi
+ </string>
+ <string name="Accounting">
+ Muhasebe
+ </string>
+ <string name="Notices">
+ Bildirimler
+ </string>
+ <string name="Chat">
+ Sohbet
+ </string>
+ <string name="DeleteItems">
+ Seçili öğeler silinsin mi?
+ </string>
+ <string name="DeleteItem">
+ Seçili öğe silinsin mi?
+ </string>
+ <string name="EmptyOutfitText">
+ Bu dış görünümde herhangi bir öğe yok
+ </string>
+ <string name="ExternalEditorNotSet">
+ ExternalEditor ayarını kullanarak bir düzenleyici seçin.
+ </string>
+ <string name="ExternalEditorNotFound">
+ Belirttiğiniz harici düzenleyici bulunamadı.
+Düzenleyici yolunu çift tırnakla çevrelemeyi deneyin.
+(örn. &quot;/yolum/duzenleyici&quot; &quot;%s&quot;)
+ </string>
+ <string name="ExternalEditorCommandParseError">
+ Harici düzenleyici komutu ayrıştırılırken hata oluştu.
+ </string>
+ <string name="ExternalEditorFailedToRun">
+ Harici düzenleyici çalışmadı.
+ </string>
+ <string name="TranslationFailed">
+ Çeviri başarılamadı: [REASON]
+ </string>
+ <string name="TranslationResponseParseError">
+ Çeviri yanıtı ayrıştırılırken hata meydana geldi.
+ </string>
+ <string name="Esc">
+ Esc
+ </string>
+ <string name="Space">
+ BoÅŸluk
+ </string>
+ <string name="Enter">
+ Enter
+ </string>
+ <string name="Tab">
+ Sekme
+ </string>
+ <string name="Ins">
+ Ins
+ </string>
+ <string name="Del">
+ Del
+ </string>
+ <string name="Backsp">
+ Geri tuÅŸu
+ </string>
+ <string name="Shift">
+ Shift
+ </string>
+ <string name="Ctrl">
+ Ctrl
+ </string>
+ <string name="Alt">
+ Alt
+ </string>
+ <string name="CapsLock">
+ CapsLock
+ </string>
+ <string name="Left">
+ Sol
+ </string>
+ <string name="Right">
+ SaÄŸ
+ </string>
+ <string name="Up">
+ Yukarı
+ </string>
+ <string name="Down">
+ Aşağı
+ </string>
+ <string name="Home">
+ Home
+ </string>
+ <string name="End">
+ End
+ </string>
+ <string name="PgUp">
+ PgUp
+ </string>
+ <string name="PgDn">
+ PgDn
+ </string>
+ <string name="F1">
+ F1
+ </string>
+ <string name="F2">
+ F2
+ </string>
+ <string name="F3">
+ F3
+ </string>
+ <string name="F4">
+ F4
+ </string>
+ <string name="F5">
+ F5
+ </string>
+ <string name="F6">
+ F6
+ </string>
+ <string name="F7">
+ F7
+ </string>
+ <string name="F8">
+ F8
+ </string>
+ <string name="F9">
+ F9
+ </string>
+ <string name="F10">
+ F10
+ </string>
+ <string name="F11">
+ F11
+ </string>
+ <string name="F12">
+ F12
+ </string>
+ <string name="Add">
+ Ekle
+ </string>
+ <string name="Subtract">
+ Çıkar
+ </string>
+ <string name="Multiply">
+ Çarp
+ </string>
+ <string name="Divide">
+ Böl
+ </string>
+ <string name="PAD_DIVIDE">
+ PAD_DIVIDE
+ </string>
+ <string name="PAD_LEFT">
+ PAD_LEFT
+ </string>
+ <string name="PAD_RIGHT">
+ PAD_RIGHT
+ </string>
+ <string name="PAD_DOWN">
+ PAD_DOWN
+ </string>
+ <string name="PAD_UP">
+ PAD_UP
+ </string>
+ <string name="PAD_HOME">
+ PAD_HOME
+ </string>
+ <string name="PAD_END">
+ PAD_END
+ </string>
+ <string name="PAD_PGUP">
+ PAD_PGUP
+ </string>
+ <string name="PAD_PGDN">
+ PAD_PGDN
+ </string>
+ <string name="PAD_CENTER">
+ PAD_CENTER
+ </string>
+ <string name="PAD_INS">
+ PAD_INS
+ </string>
+ <string name="PAD_DEL">
+ PAD_DEL
+ </string>
+ <string name="PAD_Enter">
+ PAD_Enter
+ </string>
+ <string name="PAD_BUTTON0">
+ PAD_BUTTON0
+ </string>
+ <string name="PAD_BUTTON1">
+ PAD_BUTTON1
+ </string>
+ <string name="PAD_BUTTON2">
+ PAD_BUTTON2
+ </string>
+ <string name="PAD_BUTTON3">
+ PAD_BUTTON3
+ </string>
+ <string name="PAD_BUTTON4">
+ PAD_BUTTON4
+ </string>
+ <string name="PAD_BUTTON5">
+ PAD_BUTTON5
+ </string>
+ <string name="PAD_BUTTON6">
+ PAD_BUTTON6
+ </string>
+ <string name="PAD_BUTTON7">
+ PAD_BUTTON7
+ </string>
+ <string name="PAD_BUTTON8">
+ PAD_BUTTON8
+ </string>
+ <string name="PAD_BUTTON9">
+ PAD_BUTTON9
+ </string>
+ <string name="PAD_BUTTON10">
+ PAD_BUTTON10
+ </string>
+ <string name="PAD_BUTTON11">
+ PAD_BUTTON11
+ </string>
+ <string name="PAD_BUTTON12">
+ PAD_BUTTON12
+ </string>
+ <string name="PAD_BUTTON13">
+ PAD_BUTTON13
+ </string>
+ <string name="PAD_BUTTON14">
+ PAD_BUTTON14
+ </string>
+ <string name="PAD_BUTTON15">
+ PAD_BUTTON15
+ </string>
+ <string name="-">
+ -
+ </string>
+ <string name="=">
+ =
+ </string>
+ <string name="`">
+ `
+ </string>
+ <string name=";">
+ ;
+ </string>
+ <string name="[">
+ [
+ </string>
+ <string name="]">
+ ]
+ </string>
+ <string name="\">
+ \
+ </string>
+ <string name="0">
+ 0
+ </string>
+ <string name="1">
+ 1
+ </string>
+ <string name="2">
+ 2
+ </string>
+ <string name="3">
+ 3
+ </string>
+ <string name="4">
+ 4
+ </string>
+ <string name="5">
+ 5
+ </string>
+ <string name="6">
+ 6
+ </string>
+ <string name="7">
+ 7
+ </string>
+ <string name="8">
+ 8
+ </string>
+ <string name="9">
+ 9
+ </string>
+ <string name="A">
+ A
+ </string>
+ <string name="B">
+ B
+ </string>
+ <string name="C">
+ C
+ </string>
+ <string name="D">
+ D
+ </string>
+ <string name="E">
+ E
+ </string>
+ <string name="F">
+ F
+ </string>
+ <string name="G">
+ G
+ </string>
+ <string name="H">
+ H
+ </string>
+ <string name="I">
+ I
+ </string>
+ <string name="J">
+ J
+ </string>
+ <string name="K">
+ K
+ </string>
+ <string name="L">
+ L
+ </string>
+ <string name="M">
+ M
+ </string>
+ <string name="N">
+ N
+ </string>
+ <string name="O">
+ O
+ </string>
+ <string name="P">
+ P
+ </string>
+ <string name="Q">
+ Q
+ </string>
+ <string name="R">
+ R
+ </string>
+ <string name="S">
+ S
+ </string>
+ <string name="T">
+ T
+ </string>
+ <string name="U">
+ U
+ </string>
+ <string name="V">
+ V
+ </string>
+ <string name="W">
+ W
+ </string>
+ <string name="X">
+ X
+ </string>
+ <string name="Y">
+ Y
+ </string>
+ <string name="Z">
+ Z
+ </string>
+ <string name="BeaconParticle">
+ Parçacık işaretleri gösteriliyor (mavi)
+ </string>
+ <string name="BeaconPhysical">
+ Fiziksel nesne işaretleri gösteriliyor (yeşil)
+ </string>
+ <string name="BeaconScripted">
+ Komut dosyalı nesne işaretleri gösteriliyor (kırmızı)
+ </string>
+ <string name="BeaconScriptedTouch">
+ Dokunma işlevli komut dosyalı nesne işaretleri gösteriliyor (kırmızı)
+ </string>
+ <string name="BeaconSound">
+ Ses işaretleri gösteriliyor (sarı)
+ </string>
+ <string name="BeaconMedia">
+ Ortam işaretleri gösteriliyor (beyaz)
+ </string>
+ <string name="ParticleHiding">
+ Parçacıklar Gizleniyor
+ </string>
+ <string name="Command_AboutLand_Label">
+ Arazi hakkında
+ </string>
+ <string name="Command_Appearance_Label">
+ Görünüm
+ </string>
+ <string name="Command_Avatar_Label">
+ Avatar
+ </string>
+ <string name="Command_Build_Label">
+ Ä°nÅŸa Et
+ </string>
+ <string name="Command_Chat_Label">
+ Sohbet
+ </string>
+ <string name="Command_Compass_Label">
+ Pusula
+ </string>
+ <string name="Command_Destinations_Label">
+ Hedef Konum
+ </string>
+ <string name="Command_Gestures_Label">
+ Mimikler
+ </string>
+ <string name="Command_HowTo_Label">
+ Nasıl yapılır
+ </string>
+ <string name="Command_Inventory_Label">
+ Envanter
+ </string>
+ <string name="Command_Map_Label">
+ Harita
+ </string>
+ <string name="Command_Marketplace_Label">
+ Pazaryeri
+ </string>
+ <string name="Command_MiniMap_Label">
+ Mini-harita
+ </string>
+ <string name="Command_Move_Label">
+ Yürü / koş / uç
+ </string>
+ <string name="Command_Outbox_Label">
+ Satıcı giden kutusu
+ </string>
+ <string name="Command_People_Label">
+ KiÅŸiler
+ </string>
+ <string name="Command_Picks_Label">
+ Seçmeler
+ </string>
+ <string name="Command_Places_Label">
+ Yerler
+ </string>
+ <string name="Command_Preferences_Label">
+ Tercihler
+ </string>
+ <string name="Command_Profile_Label">
+ Profil
+ </string>
+ <string name="Command_Search_Label">
+ Ara
+ </string>
+ <string name="Command_Snapshot_Label">
+ Anlık görüntü
+ </string>
+ <string name="Command_Speak_Label">
+ KonuÅŸ
+ </string>
+ <string name="Command_View_Label">
+ Kamera denetimleri
+ </string>
+ <string name="Command_Voice_Label">
+ Ses ayarları
+ </string>
+ <string name="Command_AboutLand_Tooltip">
+ Ziyaret ettiÄŸiniz araziyle ilgili bilgi
+ </string>
+ <string name="Command_Appearance_Tooltip">
+ Avatarınızı değiştirin
+ </string>
+ <string name="Command_Avatar_Tooltip">
+ Eksiksiz bir avatar seçin
+ </string>
+ <string name="Command_Build_Tooltip">
+ Nesneler oluşturma ve yüzeyi şekillendirme
+ </string>
+ <string name="Command_Chat_Tooltip">
+ Metin kullanarak yakındaki kişilerle sohbet etmek
+ </string>
+ <string name="Command_Compass_Tooltip">
+ Pusula
+ </string>
+ <string name="Command_Destinations_Tooltip">
+ Ä°lgilendiÄŸiniz hedef konumlar
+ </string>
+ <string name="Command_Gestures_Tooltip">
+ Avatarınız için mimikler
+ </string>
+ <string name="Command_HowTo_Tooltip">
+ Genel görevleri nasıl yapacağınız
+ </string>
+ <string name="Command_Inventory_Tooltip">
+ Eşyalarınızı görüntüleyin ve kullanın
+ </string>
+ <string name="Command_Map_Tooltip">
+ Dünya haritası
+ </string>
+ <string name="Command_Marketplace_Tooltip">
+ Alışveriş yap
+ </string>
+ <string name="Command_MiniMap_Tooltip">
+ Yakındaki kişileri göster
+ </string>
+ <string name="Command_Move_Tooltip">
+ Avatarınızı hareket ettirmek
+ </string>
+ <string name="Command_Outbox_Tooltip">
+ Satmak amacıyla Pazaryerinize öğeler taşıyın
+ </string>
+ <string name="Command_People_Tooltip">
+ Arkadaşlar, gruplar ve yakındaki kişiler
+ </string>
+ <string name="Command_Picks_Tooltip">
+ Profilinizde favori olarak gösterilecek yerler
+ </string>
+ <string name="Command_Places_Tooltip">
+ KaydettiÄŸiniz yerler
+ </string>
+ <string name="Command_Preferences_Tooltip">
+ Tercihler
+ </string>
+ <string name="Command_Profile_Tooltip">
+ Profilinizi düzenleyin veya görüntüleyin
+ </string>
+ <string name="Command_Search_Tooltip">
+ Yerler, etkinlikler ve kiÅŸiler bulmak
+ </string>
+ <string name="Command_Snapshot_Tooltip">
+ Resim çekin
+ </string>
+ <string name="Command_Speak_Tooltip">
+ Mikrofonunuzu kullanarak yakındaki kişilerle konuşun
+ </string>
+ <string name="Command_View_Tooltip">
+ Kamera açısını değiştirmek
+ </string>
+ <string name="Command_Voice_Tooltip">
+ Aramalar ve SL dünyası içinde size yakın kişiler için ses denetimleri
+ </string>
+ <string name="Toolbar_Bottom_Tooltip">
+ şu anda alt araç çubuğunuzda
+ </string>
+ <string name="Toolbar_Left_Tooltip">
+ şu anda sol araç çubuğunuzda
+ </string>
+ <string name="Toolbar_Right_Tooltip">
+ şu anda sağ araç çubuğunuzda
+ </string>
+ <string name="Retain%">
+ Koru %
+ </string>
+ <string name="Detail">
+ Ayrıntı
+ </string>
+ <string name="Better Detail">
+ Daha İyi Ayrıntı
+ </string>
+ <string name="Surface">
+ Yüzey
+ </string>
+ <string name="Solid">
+ Katı
+ </string>
+ <string name="Wrap">
+ Sar
+ </string>
+ <string name="Preview">
+ Önizleme
+ </string>
+ <string name="Normal">
+ Normal
+ </string>
+ <string name="snapshot_quality_very_low">
+ Çok Düşük
+ </string>
+ <string name="snapshot_quality_low">
+ Düşük
+ </string>
+ <string name="snapshot_quality_medium">
+ Orta
+ </string>
+ <string name="snapshot_quality_high">
+ Yüksek
+ </string>
+ <string name="snapshot_quality_very_high">
+ Çok Yüksek
+ </string>
+</strings>
diff --git a/indra/newview/skins/default/xui/tr/teleport_strings.xml b/indra/newview/skins/default/xui/tr/teleport_strings.xml
new file mode 100644
index 0000000000..62aaaf671f
--- /dev/null
+++ b/indra/newview/skins/default/xui/tr/teleport_strings.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<teleport_messages>
+ <message_set name="errors">
+ <message name="invalid_tport">
+ Işınlama talebiniz işlenirken bir sorunla karşılaşıldı. Işınlanabilmek için yeniden oturum açmanız gerekebilir.
+Bu mesajı almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.
+ </message>
+ <message name="invalid_region_handoff">
+ Bölge değiştirme talebiniz işlenirken sorunla karşılaşıldı. Bölge geçebilmek için yeniden oturum açmanız gerekebilir.
+Bu mesajı almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne başvurun.
+ </message>
+ <message name="blocked_tport">
+ Üzgünüz, ışınlama şu anda engellenmiş durumda. Bir dakika sonra tekrar deneyin.
+Hala ışınlanamıyorsanız, sorunu çözmek için lütfen çıkış yapıp oturumu tekrar açın.
+ </message>
+ <message name="nolandmark_tport">
+ Üzgünüz fakat sistem yer imi hedef konumunu bulamadı.
+ </message>
+ <message name="timeout_tport">
+ Üzgünüz fakat sistem ışınlama bağlantısını tamamlayamadı.
+Bir dakika sonra tekrar deneyin.
+ </message>
+ <message name="NoHelpIslandTP">
+ Karşılama Ada&apos;sına geri ışınlanamazsınız.
+Öğreticiyi tekrarlamak için &apos;Karşılama Ada&apos;sı Kamusal Alanı&apos;na gidin.
+ </message>
+ <message name="noaccess_tport">
+ Üzgünüz, bu ışınlanma hedef konumuna erişim hakkına sahip değilsiniz.
+ </message>
+ <message name="missing_attach_tport">
+ Aksesuarlarınız henüz ulaşmadı. Işınlanmayı tekrar denemeden önce bir kaç saniye bekleyin veya çıkış yapıp oturumu tekrar açın.
+ </message>
+ <message name="too_many_uploads_tport">
+ Bu bölgedeki varlık sırası şu anda yoğunluktan dolayı tıkalı olduğu için ışınlanma talebiniz zamanında gerçekleştirilemeyecek. Lütfen bir kaç dakika sonra tekrar deneyin veya yoğunluğu daha az olan bir bölge seçin.
+ </message>
+ <message name="expired_tport">
+ Üzgünüz fakat sistem ışınlanma talebinizi zamanında tamamlayamadı. Lütfen bir kaç dakika sonra tekrar deneyin.
+ </message>
+ <message name="expired_region_handoff">
+ Üzgünüz fakat sistem bölge değiştirme talebinizi zamanında tamamlayamadı. Lütfen bir kaç dakika sonra tekrar deneyin.
+ </message>
+ <message name="no_host">
+ Işınlanma hedef konumu bulunamıyor. Hedef konumu geçici bir süre için kullanılamıyor ya da artık mevcut değil. Lütfen bir kaç dakika sonra tekrar deneyin.
+ </message>
+ <message name="no_inventory_host">
+ Envanter sistemi şu anda kullanılamıyor.
+ </message>
+ </message_set>
+ <message_set name="progress">
+ <message name="sending_dest">
+ Hedef konuma gönderiliyor.
+ </message>
+ <message name="redirecting">
+ Farklı konuma tekrar yönlendiriliyor.
+ </message>
+ <message name="relaying">
+ Hedefe aktarılıyor.
+ </message>
+ <message name="sending_home">
+ Ana konum talebi gönderiliyor.
+ </message>
+ <message name="sending_landmark">
+ Yer imi konumu talebi gönderiliyor.
+ </message>
+ <message name="completing">
+ Işınlanma tamamlanıyor.
+ </message>
+ <message name="completed_from">
+ [T_SLURL] konumundan ışınlanma tamamlandı.
+ </message>
+ <message name="resolving">
+ Hedef konum çözümleniyor.
+ </message>
+ <message name="contacting">
+ Yeni bölgeye bağlanılıyor.
+ </message>
+ <message name="arriving">
+ Konuma varılıyor...
+ </message>
+ <message name="requesting">
+ Işınlanma talep ediliyor...
+ </message>
+ </message_set>
+</teleport_messages>
diff --git a/indra/newview/skins/default/xui/zh/floater_aaa.xml b/indra/newview/skins/default/xui/zh/floater_aaa.xml
new file mode 100644
index 0000000000..0d110c0456
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_aaa.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Test Floater" title="測試浮動視窗">
+ <string name="test_the_vlt">
+ This string CHANGE2 is extracted.
+ </string>
+ <string name="testing_eli">
+ 這åªæ˜¯æ¸¬è©¦ - 變更。
+ </string>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_about.xml b/indra/newview/skins/default/xui/zh/floater_about.xml
new file mode 100644
index 0000000000..7e19c124a1
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_about.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_about" title="關於 [CAPITALIZED_APP_NAME]">
+ <floater.string name="AboutHeader">
+ [APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2] ([VIEWER_VERSION_3]) [BUILD_DATE] [BUILD_TIME] ([CHANNEL])
+[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]
+ </floater.string>
+ <floater.string name="AboutCompiler">
+ Built with [COMPILER] version [COMPILER_VERSION]
+ </floater.string>
+ <floater.string name="AboutPosition">
+ You are at [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] in [REGION] located at &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ([HOSTIP])
+[SERVER_VERSION]
+[SERVER_RELEASE_NOTES_URL]
+ </floater.string>
+ <floater.string name="AboutSystem">
+ CPU:[CPU]
+記憶體:[MEMORY_MB] MB
+作業系統版本:[OS_VERSION]
+顯示å¡ä¾›æ‡‰å•†ï¼š[GRAPHICS_CARD_VENDOR]
+顯示å¡ï¼š[GRAPHICS_CARD]
+ </floater.string>
+ <floater.string name="AboutDriver">
+ Windows Graphics Driver Version: [GRAPHICS_DRIVER_VERSION]
+ </floater.string>
+ <floater.string name="AboutLibs">
+ OpenGL Version: [OPENGL_VERSION]
+
+libcurl 版本: [LIBCURL_VERSION]
+J2C 解碼器版本: [J2C_VERSION]
+音效驅動程å¼ç‰ˆæœ¬ï¼š [AUDIO_DRIVER_VERSION]
+Qt Webkit 版本: [QT_WEBKIT_VERSION]
+語音伺æœå™¨ç‰ˆæœ¬ï¼š [VOICE_VERSION]
+ </floater.string>
+ <floater.string name="none">
+ (無)
+ </floater.string>
+ <floater.string name="AboutTraffic">
+ å°åŒ…æ失:[PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
+ </floater.string>
+ <tab_container name="about_tab">
+ <panel label="資訊" name="support_panel">
+ <button label="覆製到剪貼簿" name="copy_btn"/>
+ </panel>
+ <panel label="Credits" name="credits_panel">
+ <text_editor name="credits_editor">
+ Second Life is brought to you by ..., and many others.
+
+Thank you to the following Residents for helping to ensure that this is the best version yet: ..., and many others.
+
+
+
+
+&quot;The work goes on, the cause endures, the hope still lives, and the dreams shall never die&quot; - Edward Kennedy
+ </text_editor>
+ </panel>
+ <panel label="Licenses" name="licenses_panel">
+ <text_editor name="credits_editor">
+ 3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion
+APR Copyright (C) 2000-2004 The Apache Software Foundation
+cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)
+DBus/dbus-glib Copyright (C) 2002, 2003 CodeFactory AB / Copyright (C) 2003, 2004 Red Hat, Inc.
+expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.
+FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org).
+GL Copyright (C) 1999-2004 Brian Paul.
+google-perftools Copyright (c) 2005, Google Inc.
+Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.
+jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)
+jpeglib Copyright (C) 1991-1998, Thomas G. Lane.
+ogg/vorbis Copyright (C) 2001, Xiphophorus
+OpenSSL Copyright (C) 1998-2002 The OpenSSL Project.
+Pth Copyright (C) 1999-2006 Ralf S. Engelschall &lt;rse@gnu.org&gt;
+SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
+SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
+zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler.
+google-perftools Copyright (c) 2005, Google Inc.
+
+All rights reserved. See licenses.txt for details.
+
+語音èŠå¤©éŸ³é »ç·¨ç¢¼ï¼šPolycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
+ </text_editor>
+ </panel>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_about_land.xml b/indra/newview/skins/default/xui/zh/floater_about_land.xml
new file mode 100644
index 0000000000..2568d492f0
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_about_land.xml
@@ -0,0 +1,478 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floaterland" title="關於土地">
+ <floater.string name="maturity_icon_general">
+ &quot;Parcel_PG_Dark&quot;
+ </floater.string>
+ <floater.string name="maturity_icon_moderate">
+ &quot;Parcel_M_Dark&quot;
+ </floater.string>
+ <floater.string name="maturity_icon_adult">
+ &quot;Parcel_R_Dark&quot;
+ </floater.string>
+ <floater.string name="Minutes">
+ [MINUTES] minutes
+ </floater.string>
+ <floater.string name="Minute">
+ minute
+ </floater.string>
+ <floater.string name="Seconds">
+ [SECONDS] seconds
+ </floater.string>
+ <floater.string name="Remaining">
+ remaining
+ </floater.string>
+ <tab_container name="landtab">
+ <panel label="一般" name="land_general_panel">
+ <panel.string name="new users only">
+ New Residents only
+ </panel.string>
+ <panel.string name="anyone">
+ Anyone
+ </panel.string>
+ <panel.string name="area_text">
+ å€åŸŸ
+ </panel.string>
+ <panel.string name="area_size_text">
+ [AREA] m²
+ </panel.string>
+ <panel.string name="auction_id_text">
+ Auction ID: [ID]
+ </panel.string>
+ <panel.string name="need_tier_to_modify">
+ You must approve your purchase to modify this land.
+ </panel.string>
+ <panel.string name="group_owned_text">
+ (群組所æ“有)
+ </panel.string>
+ <panel.string name="profile_text">
+ 檔案
+ </panel.string>
+ <panel.string name="info_text">
+ 資訊
+ </panel.string>
+ <panel.string name="public_text">
+ (公開)
+ </panel.string>
+ <panel.string name="none_text">
+ (無)
+ </panel.string>
+ <panel.string name="sale_pending_text">
+ (Sale Pending)
+ </panel.string>
+ <panel.string name="no_selection_text">
+ No parcel selected.
+ </panel.string>
+ <panel.string name="time_stamp_template">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </panel.string>
+ <text name="Name:">
+ å稱:
+ </text>
+ <text name="Description:">
+ æ述:
+ </text>
+ <text name="LandType">
+ 類型:
+ </text>
+ <text name="LandTypeText">
+ Mainland / Homestead
+ </text>
+ <text name="ContentRating">
+ 分級:
+ </text>
+ <text name="ContentRatingText">
+ 完全æˆäºº
+ </text>
+ <text name="Owner:">
+ æ“有者:
+ </text>
+ <text name="Group:">
+ 群組:
+ </text>
+ <button label="設定" name="Set..."/>
+ <check_box label="å…許讓渡給群組" name="check deed" tool_tip="A group officer can deed this land to the group, so it will be supported by the group&apos;s land allocation."/>
+ <button label="讓渡" name="Deed..." tool_tip="You may only deed land if you are an officer in the selected group."/>
+ <check_box label="Owner Makes Contribution With Deed" name="check contrib" tool_tip="When the land is deeded to the group, the former owner contributes enough land allocation to support it."/>
+ <text name="For Sale:">
+ 出售:
+ </text>
+ <text name="Not for sale.">
+ ä¸å‡ºå”®
+ </text>
+ <text name="For Sale: Price L$[PRICE].">
+ Price: L$[PRICE] (L$[PRICE_PER_SQM]/m²)
+ </text>
+ <button label="出售土地" name="Sell Land..."/>
+ <text name="For sale to">
+ 出售給:[BUYER]
+ </text>
+ <text name="Sell with landowners objects in parcel.">
+ Objects included in sale
+ </text>
+ <text name="Selling with no objects in parcel.">
+ Objects not included in sale
+ </text>
+ <button label="Cancel Land Sale" label_selected="Cancel Land Sale" name="Cancel Land Sale"/>
+ <text name="Claimed:">
+ Claimed:
+ </text>
+ <text name="DateClaimText">
+ Tue Aug 15 13:47:25 2006
+ </text>
+ <text name="PriceLabel">
+ é¢ç©ï¼š
+ </text>
+ <text name="PriceText">
+ 4048 m²
+ </text>
+ <text name="Traffic:">
+ æµé‡ï¼š
+ </text>
+ <text name="DwellText">
+ 0
+ </text>
+ <button label="購買土地" name="Buy Land..."/>
+ <button label="腳本資訊" name="Scripts..."/>
+ <button label="為群組購買" name="Buy For Group..."/>
+ <button label="購買通行權" name="Buy Pass..." tool_tip="通行權å…許你暫時å¯å‡ºå…¥é€™å¡ŠåœŸåœ°ã€‚"/>
+ <button label="放棄土地" name="Abandon Land..."/>
+ <button label="Reclaim Land" name="Reclaim Land..."/>
+ <button label="Linden Sale" name="Linden Sale..." tool_tip="Land must be owned, set content, and not already for auction."/>
+ </panel>
+ <panel label="契約" name="land_covenant_panel">
+ <panel.string name="can_resell">
+ Purchased land in this region may be resold.
+ </panel.string>
+ <panel.string name="can_not_resell">
+ Purchased land in this region may not be resold.
+ </panel.string>
+ <panel.string name="can_change">
+ Purchased land in this region may be joined or subdivided.
+ </panel.string>
+ <panel.string name="can_not_change">
+ Purchased land in this region may not be joined or subdivided.
+ </panel.string>
+ <text name="estate_section_lbl">
+ 領地:
+ </text>
+ <text name="estate_name_text">
+ mainland
+ </text>
+ <text name="estate_owner_lbl">
+ æ“有者:
+ </text>
+ <text name="estate_owner_text">
+ (無)
+ </text>
+ <text_editor name="covenant_editor">
+ There is no Covenant provided for this Estate.
+ </text_editor>
+ <text name="covenant_timestamp_text">
+ Last Modified Wed Dec 31 16:00:00 1969
+ </text>
+ <text name="region_section_lbl">
+ 地å€ï¼š
+ </text>
+ <text name="region_name_text">
+ EricaVille
+ </text>
+ <text name="region_landtype_lbl">
+ 類型:
+ </text>
+ <text name="region_landtype_text">
+ Mainland / Homestead
+ </text>
+ <text name="region_maturity_lbl">
+ 分級:
+ </text>
+ <text name="region_maturity_text">
+ 完全æˆäºº
+ </text>
+ <text name="resellable_lbl">
+ Resale:
+ </text>
+ <text name="resellable_clause">
+ Land in this region may not be resold.
+ </text>
+ <text name="changeable_lbl">
+ Subdivide:
+ </text>
+ <text name="changeable_clause">
+ Land in this region may not be joined/subdivided.
+ </text>
+ </panel>
+ <panel label="物件" name="land_objects_panel">
+ <panel.string name="objects_available_text">
+ [COUNT] out of [MAX] ([AVAILABLE] available)
+ </panel.string>
+ <panel.string name="objects_deleted_text">
+ [COUNT] out of [MAX] ([DELETED] will be deleted)
+ </panel.string>
+ <text name="parcel_object_bonus">
+ Region Object Bonus Factor: [BONUS]
+ </text>
+ <text name="Simulator primitive usage:">
+ 幾何元件使用:
+ </text>
+ <text name="objects_available">
+ 使用 [MAX] 中的 [COUNT] (剩餘 [AVAILABLE] å¯ç”¨ï¼‰
+ </text>
+ <text name="Primitives parcel supports:">
+ 地段所æ供的幾何元件數:
+ </text>
+ <text name="object_contrib_text">
+ [COUNT]
+ </text>
+ <text name="Primitives on parcel:">
+ 地段上的幾何元件數:
+ </text>
+ <text name="total_objects_text">
+ [COUNT]
+ </text>
+ <text name="Owned by parcel owner:">
+ 地段æ“有者所æ“有:
+ </text>
+ <text name="owner_objects_text">
+ [COUNT]
+ </text>
+ <button label="顯示" label_selected="顯示" name="ShowOwner"/>
+ <button label="退回" name="ReturnOwner..." tool_tip="退回物件給它們的æ“有者。"/>
+ <text name="Set to group:">
+ 設定群組:
+ </text>
+ <text name="group_objects_text">
+ [COUNT]
+ </text>
+ <button label="顯示" label_selected="顯示" name="ShowGroup"/>
+ <button label="退回" name="ReturnGroup..." tool_tip="退回物件給它們的æ“有者。"/>
+ <text name="Owned by others:">
+ 其他人所æ“有:
+ </text>
+ <text name="other_objects_text">
+ [COUNT]
+ </text>
+ <button label="顯示" label_selected="顯示" name="ShowOther"/>
+ <button label="退回" name="ReturnOther..." tool_tip="退回物件給它們的æ“有者。"/>
+ <text name="Selected / sat upon:">
+ Selected / sat upon:
+ </text>
+ <text name="selected_objects_text">
+ [COUNT]
+ </text>
+ <text name="Autoreturn">
+ Auto return other Residents&apos; objects (minutes, 0 for off):
+ </text>
+ <text name="Object Owners:">
+ 物件æ“有者:
+ </text>
+ <button name="Refresh List" tool_tip="刷新物件清單"/>
+ <button label="退回物件" name="Return objects..."/>
+ <name_list name="owner list">
+ <name_list.columns label="Type" name="type"/>
+ <name_list.columns label="å稱" name="name"/>
+ <name_list.columns label="Count" name="count"/>
+ <name_list.columns label="Most Recent" name="mostrecent"/>
+ </name_list>
+ </panel>
+ <panel label="é¸é …" name="land_options_panel">
+ <panel.string name="search_enabled_tooltip">
+ 讓其他人å¯ä»¥åœ¨æœå°‹çµæžœä¸­çœ‹åˆ°é€™å¡Šåœ°æ®µ
+ </panel.string>
+ <panel.string name="search_disabled_small_tooltip">
+ This option is disabled because this parcel&apos;s area is 128 m² or smaller.
+Only large parcels can be listed in search.
+ </panel.string>
+ <panel.string name="search_disabled_permissions_tooltip">
+ 這個é¸é …已關閉因為你ä¸èƒ½ä¿®æ”¹é€™å€‹åœ°æ®µçš„é¸é …。
+ </panel.string>
+ <panel.string name="mature_check_mature">
+ é©åº¦æˆäººå…§å®¹
+ </panel.string>
+ <panel.string name="mature_check_adult">
+ 完全æˆäººå…§å®¹
+ </panel.string>
+ <panel.string name="mature_check_mature_tooltip">
+ Your parcel information or content is considered moderate.
+ </panel.string>
+ <panel.string name="mature_check_adult_tooltip">
+ Your parcel information or content is considered adult.
+ </panel.string>
+ <panel.string name="landing_point_none">
+ (無)
+ </panel.string>
+ <panel.string name="push_restrict_text">
+ ç¦æ­¢æŽ¨æ’ž
+ </panel.string>
+ <panel.string name="push_restrict_region_text">
+ ç¦æ­¢æŽ¨æ’žï¼ˆåœ°å€è¨­å®šè¦†è“‹ï¼‰
+ </panel.string>
+ <text name="allow_label">
+ å…許其他居民去:
+ </text>
+ <check_box label="編輯地形" name="edit land check" tool_tip="若勾é¸å‰‡ä»»ä½•äººå°‡å¯ä»¥è®Šå½¢ä½ çš„土地,最好是ä¿æŒæœªå‹¾é¸ï¼Œå› ç‚ºä½ éš¨æ™‚å¯ä»¥ç·¨è¼¯è®Šæ›´ä½ çš„土地。"/>
+ <check_box label="飛行" name="check fly" tool_tip="逤勾é¸å‰‡å±…æ°‘å¯ä»¥åœ¨ä½ é£›è¡Œï¼Œä¸ç„¶å°±åªèƒ½ç”±å¤–é¢é£›å…¥æˆ–飛越你的土地。"/>
+ <text name="allow_label2">
+ 建造:
+ </text>
+ <check_box label="任何人" name="edit objects check"/>
+ <check_box label="群組" name="edit group objects check"/>
+ <text name="allow_label3">
+ 物件進入:
+ </text>
+ <check_box label="任何人" name="all object entry check"/>
+ <check_box label="群組" name="group object entry check"/>
+ <text name="allow_label4">
+ 執行腳本:
+ </text>
+ <check_box label="任何人" name="check other scripts"/>
+ <check_box label="群組" name="check group scripts"/>
+ <text name="land_options_label">
+ 土地é¸é …:
+ </text>
+ <check_box label="安全(無傷害)" name="check safe" tool_tip="若勾é¸å‰‡è¨­æ‡‰åœŸåœ°ç‚ºå®‰å…¨çš„,傷害性的戰鬥將被關閉。清除勾é¸å¾Œæ‰èƒ½é€²è¡Œå‚·å®³æ€§çš„戰鬥。"/>
+ <check_box label="ç¦æ­¢æŽ¨æ’ž" name="PushRestrictCheck" tool_tip="防止使用腳本推撞。勾é¸é€™å€‹é¸é …å°‡å¯ä»¥æœ‰æ•ˆé˜²æ­¢ä½ åœŸåœ°ä¸Šçš„破壞行為。"/>
+ <check_box label="將地點刊登顯示在æœå°‹ä¸­ï¼ˆL$30 / æ¯é€±ï¼‰" name="ShowDirectoryCheck" tool_tip="讓其他人å¯ä»¥åœ¨æœå°‹çµæžœä¸­çœ‹åˆ°é€™å¡Šåœ°æ®µ"/>
+ <combo_box name="land category with adult">
+ <combo_box.item label="任何類別" name="item0"/>
+ <combo_box.item label="Linden Location" name="item1"/>
+ <combo_box.item label="完全æˆäºº" name="item2"/>
+ <combo_box.item label="è—術與文化" name="item3"/>
+ <combo_box.item label="商業" name="item4"/>
+ <combo_box.item label="教育" name="item5"/>
+ <combo_box.item label="éŠæˆ²" name="item6"/>
+ <combo_box.item label="èšæœƒæ‰€" name="item7"/>
+ <combo_box.item label="新手å‹å–„" name="item8"/>
+ <combo_box.item label="公園與自然" name="item9"/>
+ <combo_box.item label="ä½å®…" name="item10"/>
+ <combo_box.item label="採購" name="item11"/>
+ <combo_box.item label="Rental" name="item13"/>
+ <combo_box.item label="Other" name="item12"/>
+ </combo_box>
+ <combo_box name="land category">
+ <combo_box.item label="任何類別" name="item0"/>
+ <combo_box.item label="Linden Location" name="item1"/>
+ <combo_box.item label="è—術與文化" name="item3"/>
+ <combo_box.item label="商業" name="item4"/>
+ <combo_box.item label="教育" name="item5"/>
+ <combo_box.item label="éŠæˆ²" name="item6"/>
+ <combo_box.item label="èšæœƒæ‰€" name="item7"/>
+ <combo_box.item label="新手å‹å–„" name="item8"/>
+ <combo_box.item label="公園與自然" name="item9"/>
+ <combo_box.item label="ä½å®…" name="item10"/>
+ <combo_box.item label="採購" name="item11"/>
+ <combo_box.item label="Rental" name="item13"/>
+ <combo_box.item label="Other" name="item12"/>
+ </combo_box>
+ <check_box label="é©åº¦æˆäººå…§å®¹" name="MatureCheck" tool_tip=" "/>
+ <text name="Snapshot:">
+ 快照:
+ </text>
+ <texture_picker name="snapshot_ctrl" tool_tip="點擊以挑é¸åœ–åƒ"/>
+ <text name="landing_point">
+ 登陸點:[LANDING]
+ </text>
+ <button label="設定" label_selected="設定" name="Set" tool_tip="Sets the landing point where visitors arrive. Sets to your avatar&apos;s location inside this parcel."/>
+ <button label="清除" label_selected="清除" name="Clear" tool_tip="清除登陸點"/>
+ <text name="Teleport Routing: ">
+ 瞬間傳é€è·¯å¾‘:
+ </text>
+ <combo_box name="landing type" tool_tip="Teleport Routing -- select how to handle teleports onto your land">
+ <combo_box.item label="Blocked" name="Blocked"/>
+ <combo_box.item label="Landing Point" name="LandingPoint"/>
+ <combo_box.item label="Anywhere" name="Anywhere"/>
+ </combo_box>
+ </panel>
+ <panel label="MEDIA" name="land_media_panel">
+ <text name="with media:">
+ 類型:
+ </text>
+ <combo_box name="media type" tool_tip="Specify if the URL is a movie, web page, or other media"/>
+ <text name="at URL:">
+ 首é ï¼š
+ </text>
+ <button label="設定" name="set_media_url"/>
+ <text name="Description:">
+ æ述:
+ </text>
+ <line_editor name="url_description" tool_tip="Text displayed next to play/load button"/>
+ <text name="Media texture:">
+ å–代æ質:
+ </text>
+ <texture_picker name="media texture" tool_tip="點擊以挑é¸åœ–åƒ"/>
+ <text name="replace_texture_help">
+ Objects using this texture will show the movie or web page after you click the play arrow. Select the thumbnail to choose a different texture.
+ </text>
+ <check_box label="自動縮放" name="media_auto_scale" tool_tip="Checking this option will scale the content for this parcel automatically. It may be slightly slower and lower quality visually but no other texture scaling or alignment will be required."/>
+ <text name="media_size" tool_tip="Size to render Web media, leave 0 for default.">
+ 尺寸:
+ </text>
+ <spinner name="media_size_width" tool_tip="Size to render Web media, leave 0 for default."/>
+ <spinner name="media_size_height" tool_tip="Size to render Web media, leave 0 for default."/>
+ <text name="pixels">
+ åƒç´ 
+ </text>
+ <text name="Options:">
+ é¸é …:
+ </text>
+ <check_box label="Loop" name="media_loop" tool_tip="Play media in a loop. When the media has finished playing, it will restart from the beginning."/>
+ </panel>
+ <panel label="è²éŸ³" name="land_audio_panel">
+ <text name="MusicURL:">
+ 音樂 URL:
+ </text>
+ <text name="Sound:">
+ è²éŸ³ï¼š
+ </text>
+ <check_box label="Restrict gesture and object sounds to this parcel" name="check sound local"/>
+ <text name="Voice settings:">
+ Voice:
+ </text>
+ <check_box label="Enable Voice" name="parcel_enable_voice_channel"/>
+ <check_box label="Enable Voice (established by the Estate)" name="parcel_enable_voice_channel_is_estate_disabled"/>
+ <check_box label="Restrict Voice to this parcel" name="parcel_enable_voice_channel_local"/>
+ </panel>
+ <panel label="ACCESS" name="land_access_panel">
+ <panel.string name="access_estate_defined">
+ (Defined by the Estate)
+ </panel.string>
+ <panel.string name="allow_public_access">
+ Allow Public Access ([MATURITY]) (Note: Unchecking this will create ban lines)
+ </panel.string>
+ <panel.string name="estate_override">
+ One or more of these options is set at the estate level
+ </panel.string>
+ <text name="Limit access to this parcel to:">
+ 出入此地段
+ </text>
+ <text name="Only Allow">
+ Restrict Access to Residents verified by:
+ </text>
+ <check_box label="Payment Information on File [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Ban unidentified Residents."/>
+ <check_box label="年齡驗證 [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Ban Residents who have not verified their age. See the [SUPPORT_SITE] for more information."/>
+ <check_box label="å…許出入的群組:[GROUP]" name="GroupCheck" tool_tip="設定群組於一般é ç±¤ã€‚"/>
+ <check_box label="出售通行權給:" name="PassCheck" tool_tip="å…許暫時出入這個地段"/>
+ <combo_box name="pass_combo">
+ <combo_box.item label="Anyone" name="Anyone"/>
+ <combo_box.item label="群組" name="Group"/>
+ </combo_box>
+ <spinner label="Price in L$:" name="PriceSpin"/>
+ <spinner label="Hours of access:" name="HoursSpin"/>
+ <panel name="Allowed_layout_panel">
+ <text label="Always Allow" name="AllowedText">
+ Allowed Residents
+ </text>
+ <name_list name="AccessList" tool_tip="([LISTED] listed, [MAX] max)"/>
+ <button label="添加" name="add_allowed"/>
+ <button label="移除" label_selected="移除" name="remove_allowed"/>
+ </panel>
+ <panel name="Banned_layout_panel">
+ <text label="ç¦æ­¢" name="BanCheck">
+ 被å°éŽ–çš„å±…æ°‘
+ </text>
+ <name_list name="BannedList" tool_tip="([LISTED] listed, [MAX] max)"/>
+ <button label="添加" name="add_banned"/>
+ <button label="移除" label_selected="移除" name="remove_banned"/>
+ </panel>
+ </panel>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_activeim.xml b/indra/newview/skins/default/xui/zh/floater_activeim.xml
new file mode 100644
index 0000000000..93017bf5b2
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_activeim.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_activeim" title="ACTIVE IM"/>
diff --git a/indra/newview/skins/default/xui/zh/floater_animation_preview.xml b/indra/newview/skins/default/xui/zh/floater_animation_preview.xml
new file mode 100644
index 0000000000..c5e2eac446
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_animation_preview.xml
@@ -0,0 +1,186 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Animation Preview">
+ <floater.string name="failed_to_initialize">
+ Failed to initialize motion
+ </floater.string>
+ <floater.string name="anim_too_long">
+ Animation file is [LENGTH] seconds in length.
+
+Maximum animation length is [MAX_LENGTH] seconds.
+ </floater.string>
+ <floater.string name="failed_file_read">
+ 無法讀å–動作檔。
+
+[STATUS]
+ </floater.string>
+ <floater.string name="E_ST_OK">
+ 確定
+ </floater.string>
+ <floater.string name="E_ST_EOF">
+ Premature end of file.
+ </floater.string>
+ <floater.string name="E_ST_NO_CONSTRAINT">
+ Cannot read constraint definition.
+ </floater.string>
+ <floater.string name="E_ST_NO_FILE">
+ 無法開啟 BVH 檔案。
+ </floater.string>
+ <floater.string name="E_ST_NO_HIER">
+ Invalid HIERARCHY header.
+ </floater.string>
+ <floater.string name="E_ST_NO_JOINT">
+ Cannot find ROOT or JOINT.
+ </floater.string>
+ <floater.string name="E_ST_NO_NAME">
+ Cannot get JOINT name.
+ </floater.string>
+ <floater.string name="E_ST_NO_OFFSET">
+ 無法尋找ä½ç§»ã€‚
+ </floater.string>
+ <floater.string name="E_ST_NO_CHANNELS">
+ Cannot find CHANNELS.
+ </floater.string>
+ <floater.string name="E_ST_NO_ROTATION">
+ Cannot get rotation order.
+ </floater.string>
+ <floater.string name="E_ST_NO_AXIS">
+ Cannot get rotation axis.
+ </floater.string>
+ <floater.string name="E_ST_NO_MOTION">
+ Cannot find MOTION.
+ </floater.string>
+ <floater.string name="E_ST_NO_FRAMES">
+ Cannot get number of frames.
+ </floater.string>
+ <floater.string name="E_ST_NO_FRAME_TIME">
+ Cannot get frame time.
+ </floater.string>
+ <floater.string name="E_ST_NO_POS">
+ Cannot get position values.
+ </floater.string>
+ <floater.string name="E_ST_NO_ROT">
+ Cannot get rotation values.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_FILE">
+ Cannot open translation file.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_HEADER">
+ Cannot read translation header.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_NAME">
+ Cannot read translation names.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_IGNORE">
+ Cannot read translation ignore value.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_RELATIVE">
+ Cannot read translation relative value.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_OUTNAME">
+ Cannot read translation outname value.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MATRIX">
+ Cannot read translation matrix.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MERGECHILD">
+ Cannot get mergechild name.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MERGEPARENT">
+ Cannot get mergeparent name.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_PRIORITY">
+ Cannot get priority value.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_LOOP">
+ Cannot get loop value.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EASEIN">
+ Cannot get easeIn values.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EASEOUT">
+ Cannot get easeOut values.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_HAND">
+ Cannot get hand morph value.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EMOTE">
+ Cannot read emote name.
+ </floater.string>
+ <floater.string name="E_ST_BAD_ROOT">
+ Incorrect root joint name, use &quot;hip&quot;.
+ </floater.string>
+ <text name="name_label">
+ å稱:
+ </text>
+ <text name="description_label">
+ æ述:
+ </text>
+ <spinner label="優先度" name="priority" tool_tip="Controls which other animations can be overridden by this animation"/>
+ <check_box label="Loop" name="loop_check" tool_tip="Makes this animation loop"/>
+ <spinner label="In(%)" name="loop_in_point" tool_tip="Sets point in animation that looping returns to"/>
+ <spinner label="Out(%)" name="loop_out_point" tool_tip="Sets point in animation that ends a loop"/>
+ <text name="hand_label">
+ Hand Pose
+ </text>
+ <combo_box name="hand_pose_combo" tool_tip="Controls what hands do during animation">
+ <combo_box.item label="Spread" name="Spread"/>
+ <combo_box.item label="Relaxed" name="Relaxed"/>
+ <combo_box.item label="Point Both" name="PointBoth"/>
+ <combo_box.item label="Fist" name="Fist"/>
+ <combo_box.item label="Relaxed Left" name="RelaxedLeft"/>
+ <combo_box.item label="Point Left" name="PointLeft"/>
+ <combo_box.item label="Fist Left" name="FistLeft"/>
+ <combo_box.item label="Relaxed Right" name="RelaxedRight"/>
+ <combo_box.item label="Point Right" name="PointRight"/>
+ <combo_box.item label="Fist Right" name="FistRight"/>
+ <combo_box.item label="Salute Right" name="SaluteRight"/>
+ <combo_box.item label="Typing" name="Typing"/>
+ <combo_box.item label="Peace Right" name="PeaceRight"/>
+ </combo_box>
+ <text name="emote_label">
+ Expression
+ </text>
+ <combo_box name="emote_combo" tool_tip="Controls what face does during animation">
+ <item label="(無)" name="[None]" value=""/>
+ <item label="Aaaaah" name="Aaaaah" value="Aaaaah"/>
+ <item label="Afraid" name="Afraid" value="Afraid"/>
+ <item label="Angry" name="Angry" value="Angry"/>
+ <item label="Big Smile" name="BigSmile" value="Big Smile"/>
+ <item label="Bored" name="Bored" value="Bored"/>
+ <item label="Cry" name="Cry" value="Cry"/>
+ <item label="Disdain" name="Disdain" value="Disdain"/>
+ <item label="Embarrassed" name="Embarrassed" value="Embarrassed"/>
+ <item label="Frown" name="Frown" value="Frown"/>
+ <item label="Kiss" name="Kiss" value="Kiss"/>
+ <item label="Laugh" name="Laugh" value="Laugh"/>
+ <item label="Plllppt" name="Plllppt" value="Plllppt"/>
+ <item label="Repulsed" name="Repulsed" value="Repulsed"/>
+ <item label="Sad" name="Sad" value="Sad"/>
+ <item label="Shrug" name="Shrug" value="Shrug"/>
+ <item label="Smile" name="Smile" value="Smile"/>
+ <item label="Surprise" name="Surprise" value="Surprise"/>
+ <item label="Wink" name="Wink" value="Wink"/>
+ <item label="Worry" name="Worry" value="Worry"/>
+ </combo_box>
+ <text name="preview_label">
+ Preview while
+ </text>
+ <combo_box name="preview_base_anim" tool_tip="Use this to test your animation behavior while your avatar performs common actions.">
+ <item label="Standing" name="Standing" value="Standing"/>
+ <item label="Walking" name="Walking" value="Walking"/>
+ <item label="Sitting" name="Sitting" value="Sitting"/>
+ <item label="飛行" name="Flying" value="飛行"/>
+ </combo_box>
+ <spinner label="淡入(秒)" name="ease_in_time" tool_tip="Amount of time (in seconds) over which animations blends in"/>
+ <spinner label="淡出(秒)" name="ease_out_time" tool_tip="Amount of time (in seconds) over which animations blends out"/>
+ <button name="play_btn" tool_tip="播放你的動作"/>
+ <button name="pause_btn" tool_tip="æš«åœä½ çš„å‹•åš"/>
+ <button name="stop_btn" tool_tip="Stop animation playback"/>
+ <text name="bad_animation_text">
+ Unable to read animation file.
+
+We recommend BVH files exported from Poser 4.
+ </text>
+ <button label="上傳(L$[AMOUNT])" name="ok_btn"/>
+ <button label="å–消" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_auction.xml b/indra/newview/skins/default/xui/zh/floater_auction.xml
new file mode 100644
index 0000000000..b1862bc582
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_auction.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_auction" title="START LINDEN LAND SALE">
+ <floater.string name="already for sale">
+ You cannot auction parcels which are already for sale.
+ </floater.string>
+ <check_box initial_value="true" label="Include yellow selection fence" name="fence_check"/>
+ <button label="Snapshot" label_selected="Snapshot" name="snapshot_btn"/>
+ <button label="Sell to Anyone" label_selected="Sell to Anyone" name="sell_to_anyone_btn"/>
+ <button label="清除設定" label_selected="清除設定" name="reset_parcel_btn"/>
+ <button label="Start Auction" label_selected="Start Auction" name="start_auction_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_avatar_picker.xml b/indra/newview/skins/default/xui/zh/floater_avatar_picker.xml
new file mode 100644
index 0000000000..7e2d74c728
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_avatar_picker.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="avatarpicker" title="挑é¸å±…æ°‘">
+ <floater.string name="not_found">
+ &apos;[TEXT]&apos; not found
+ </floater.string>
+ <floater.string name="no_one_near">
+ No one near
+ </floater.string>
+ <floater.string name="no_results">
+ No results
+ </floater.string>
+ <floater.string name="searching">
+ æœå°‹ä¸­...
+ </floater.string>
+ <string name="Select">
+ é¸æ“‡
+ </string>
+ <string name="Close">
+ 關閉
+ </string>
+ <tab_container name="ResidentChooserTabs">
+ <panel label="æœå°‹" name="SearchPanel">
+ <text name="InstructSearchResidentName">
+ Type part of a person&apos;s name:
+ </text>
+ <button label="Go" label_selected="Go" name="Find"/>
+ <scroll_list name="SearchResults">
+ <columns label="å稱" name="name"/>
+ <columns label="使用者å稱" name="username"/>
+ </scroll_list>
+ </panel>
+ <panel label="朋å‹" name="FriendsPanel">
+ <text name="InstructSelectFriend">
+ é¸æ“‡ä¸€å€‹äººï¼š
+ </text>
+ </panel>
+ <panel label="接近我" name="NearMePanel">
+ <text name="InstructSelectResident">
+ é¸æ“‡ä¸€å€‹é™„近的人:
+ </text>
+ <slider label="範åœ" name="near_me_range"/>
+ <text name="meters">
+ 公尺
+ </text>
+ <scroll_list name="NearMe">
+ <columns label="å稱" name="name"/>
+ <columns label="使用者å稱" name="username"/>
+ </scroll_list>
+ </panel>
+ </tab_container>
+ <button label="確定" label_selected="確定" name="ok_btn"/>
+ <button label="å–消" label_selected="å–消" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_avatar_textures.xml b/indra/newview/skins/default/xui/zh/floater_avatar_textures.xml
new file mode 100644
index 0000000000..36dae7c798
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_avatar_textures.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="avatar_texture_debug" title="化身æ質">
+ <floater.string name="InvalidAvatar">
+ INVALID AVATAR
+ </floater.string>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text name="label">
+ Baked
+Textures
+ </text>
+ <text name="composite_label">
+ Composite
+Textures
+ </text>
+ <button label="Dump IDs to Console" label_selected="Dump" name="Dump"/>
+ <panel name="scroll_content_panel">
+ <texture_picker label="é ­é«®" name="hair-baked"/>
+ <texture_picker label="é ­é«®" name="hair_grain"/>
+ <texture_picker label="é ­é«®åŠé€æ˜Ž" name="hair_alpha"/>
+ <texture_picker label="頭部" name="head-baked"/>
+ <texture_picker label="化å¦" name="head_bodypaint"/>
+ <texture_picker label="頭部åŠé€æ˜Ž" name="head_alpha"/>
+ <texture_picker label="頭部刺é’" name="head_tattoo"/>
+ <texture_picker label="眼ç›" name="eyes-baked"/>
+ <texture_picker label="眼ç›" name="eyes_iris"/>
+ <texture_picker label="眼ç›åŠé€æ˜Ž" name="eyes_alpha"/>
+ <texture_picker label="上åŠèº«åŠé€æ˜Ž" name="upper-baked"/>
+ <texture_picker label="上åŠèº«èº«é«”部ä½" name="upper_bodypaint"/>
+ <texture_picker label="內衣" name="upper_undershirt"/>
+ <texture_picker label="手套" name="upper_gloves"/>
+ <texture_picker label="襯衫" name="upper_shirt"/>
+ <texture_picker label="上åŠèº«å¤¾å…‹" name="upper_jacket"/>
+ <texture_picker label="上åŠèº«åŠé€æ˜Ž" name="upper_alpha"/>
+ <texture_picker label="上åŠèº«åˆºé’" name="upper_tattoo"/>
+ <texture_picker label="下åŠèº«" name="lower-baked"/>
+ <texture_picker label="下åŠèº«èº«é«”部ä½" name="lower_bodypaint"/>
+ <texture_picker label="內褲" name="lower_underpants"/>
+ <texture_picker label="襪å­" name="lower_socks"/>
+ <texture_picker label="éž‹å­" name="lower_shoes"/>
+ <texture_picker label="褲å­" name="lower_pants"/>
+ <texture_picker label="夾克" name="lower_jacket"/>
+ <texture_picker label="下åŠèº«åŠé€æ˜Ž" name="lower_alpha"/>
+ <texture_picker label="下åŠèº«åˆºé’" name="lower_tattoo"/>
+ <texture_picker label="裙å­" name="skirt-baked"/>
+ <texture_picker label="裙å­" name="skirt"/>
+ </panel>
+ </panel>
+ </scroll_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_beacons.xml b/indra/newview/skins/default/xui/zh/floater_beacons.xml
new file mode 100644
index 0000000000..1613b23e75
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_beacons.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="beacons" title="BEACONS">
+ <panel name="beacons_panel">
+ <text name="label_show">
+ Show :
+ </text>
+ <check_box label="Beacons" name="beacons"/>
+ <check_box label="Highlights" name="highlights"/>
+ <text name="beacon_width_label" tool_tip="Beacon width">
+ Width:
+ </text>
+ <text name="label_objects">
+ For these objects:
+ </text>
+ <check_box label="Physical" name="physical"/>
+ <check_box label="Scripted" name="scripted"/>
+ <check_box label="Touch only" name="touch_only"/>
+ <check_box label="Sound sources" name="sounds"/>
+ <check_box label="Particle sources" name="particles"/>
+ <check_box label="Media sources" name="moapbeacon"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_build_options.xml b/indra/newview/skins/default/xui/zh/floater_build_options.xml
new file mode 100644
index 0000000000..b9d3b6b849
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_build_options.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="build options floater" title="格線é¸é …">
+ <spinner label="格線單ä½ï¼ˆå…¬å°ºï¼‰" name="GridResolution"/>
+ <spinner label="Grid Extents (meters)" name="GridDrawSize"/>
+ <check_box label="貼齊至å­å–®ä½" name="GridSubUnit"/>
+ <check_box label="View cross-sections" name="GridCrossSection"/>
+ <text name="grid_opacity_label" tool_tip="格線ä¸é€æ˜Žåº¦">
+ ä¸é€æ˜Žåº¦ï¼š
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_bulk_perms.xml b/indra/newview/skins/default/xui/zh/floater_bulk_perms.xml
new file mode 100644
index 0000000000..660710fb7b
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_bulk_perms.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floaterbulkperms" title="編輯內容物權é™">
+ <floater.string name="nothing_to_modify_text">
+ é¸æ“‡æœªåŒ…å«å¯ç·¨è¼¯çš„內容物。
+ </floater.string>
+ <floater.string name="status_text">
+ 設定權é™æ–¼ [NAME]
+ </floater.string>
+ <floater.string name="start_text">
+ 開始進行權é™è®Šæ›´è¦æ±‚...
+ </floater.string>
+ <floater.string name="done_text">
+ 權é™è®Šæ›´è¦æ±‚已完æˆã€‚
+ </floater.string>
+ <icon name="icon_animation" tool_tip="動作"/>
+ <icon name="icon_bodypart" tool_tip="身體部ä½"/>
+ <icon name="icon_clothing" tool_tip="æœè£"/>
+ <icon name="icon_gesture" tool_tip="姿勢"/>
+ <icon name="icon_notecard" tool_tip="記事å¡"/>
+ <icon name="icon_object" tool_tip="物件"/>
+ <icon name="icon_script" tool_tip="腳本"/>
+ <icon name="icon_sound" tool_tip="è²éŸ³"/>
+ <icon name="icon_texture" tool_tip="æ質"/>
+ <button label="√ 全部" name="check_all"/>
+ <button label="清除" label_selected="無" name="check_none"/>
+ <text name="newperms">
+ 新內容物權é™
+ </text>
+ <text name="GroupLabel">
+ 群組:
+ </text>
+ <check_box label="分享" name="share_with_group"/>
+ <text name="AnyoneLabel">
+ 任何人:
+ </text>
+ <check_box label="覆製" name="everyone_copy"/>
+ <text name="NextOwnerLabel">
+ 下一個æ“有者:
+ </text>
+ <check_box label="修改" name="next_owner_modify"/>
+ <check_box label="覆製" name="next_owner_copy"/>
+ <check_box initial_value="true" label="轉移" name="next_owner_transfer" tool_tip="下一個æ“有者能é€å‡ºæˆ–轉售這個物件"/>
+ <button label="確定" name="apply"/>
+ <button label="å–消" name="close"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_bumps.xml b/indra/newview/skins/default/xui/zh/floater_bumps.xml
new file mode 100644
index 0000000000..2d76a9f831
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_bumps.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_bumps" title="碰撞ã€æŽ¨æ“ èˆ‡æ‰“æ“Š">
+ <floater.string name="none_detected">
+ 未åµæ¸¬åˆ°
+ </floater.string>
+ <floater.string name="bump">
+ [TIME] [NAME] 碰撞你
+ </floater.string>
+ <floater.string name="llpushobject">
+ [TIME] [NAME] 以腳本推撞你
+ </floater.string>
+ <floater.string name="selected_object_collide">
+ [TIME] [NAME] 以物件擊中你
+ </floater.string>
+ <floater.string name="scripted_object_collide">
+ [TIME] [NAME] 以腳本物件擊中你
+ </floater.string>
+ <floater.string name="physical_object_collide">
+ [TIME] [NAME] 以物ç†ç‰©ä»¶æ“Šä¸­ä½ 
+ </floater.string>
+ <floater.string name="timeStr">
+ [[hour,datetime,slt]:[min,datetime,slt]]
+ </floater.string>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_buy_contents.xml b/indra/newview/skins/default/xui/zh/floater_buy_contents.xml
new file mode 100644
index 0000000000..44d3394a52
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_buy_contents.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_buy_contents" title="BUY CONTENTS">
+ <floater.string name="no_copy_text">
+ (no copy)
+ </floater.string>
+ <floater.string name="no_modify_text">
+ (no modify)
+ </floater.string>
+ <floater.string name="no_transfer_text">
+ (no transfer)
+ </floater.string>
+ <text name="contains_text">
+ [NAME] contains:
+ </text>
+ <text name="buy_text">
+ Buy for L$[AMOUNT] from [NAME]?
+ </text>
+ <check_box label="ç«‹å³ç©¿ä¸Šæœè£" name="wear_check"/>
+ <button label="購買" label_selected="購買" name="buy_btn"/>
+ <button label="å–消" label_selected="å–消" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_buy_currency.xml b/indra/newview/skins/default/xui/zh/floater_buy_currency.xml
new file mode 100644
index 0000000000..9f6591faf9
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_buy_currency.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="buy currency" title="購買 L$">
+ <floater.string name="buy_currency">
+ Buy L$ [LINDENS] for approx. [LOCALAMOUNT]
+ </floater.string>
+ <text name="info_need_more">
+ 你需è¦æ›´å¤š L$
+ </text>
+ <text name="contacting">
+ è¯æŽ¥åˆ° LindeX 中...
+ </text>
+ <text name="info_buying">
+ 購買 L$
+ </text>
+ <text name="balance_label">
+ 我有
+ </text>
+ <text name="balance_amount">
+ L$ [AMT]
+ </text>
+ <text name="currency_action">
+ 我想購買
+ </text>
+ <text name="currency_label">
+ L$
+ </text>
+ <line_editor label="L$" name="currency_amt">
+ 1234
+ </line_editor>
+ <text name="buying_label">
+ 以此價格
+ </text>
+ <text name="currency_est">
+ approx. [LOCALAMOUNT]
+ </text>
+ <text name="getting_data">
+ Estimating...
+ </text>
+ <text name="buy_action">
+ [ACTION]
+ </text>
+ <text name="total_label">
+ 我的帳戶餘é¡å°‡ç‚º
+ </text>
+ <text name="total_amount">
+ L$ [AMT]
+ </text>
+ <text name="currency_links">
+ [http://www.secondlife.com/my/account/payment_method_management.php payment method] | [http://www.secondlife.com/my/account/currency.php currency]
+ </text>
+ <text name="exchange_rate_note">
+ Re-enter amount to see the latest exchange rate.
+ </text>
+ <text name="purchase_warning_repurchase">
+ Confirming this purchase only buys L$, not the object.
+ </text>
+ <text name="purchase_warning_notenough">
+ 你並未購買足夠的林登幣,請先添加一些數é‡ã€‚
+ </text>
+ <button label="ç«‹å³è³¼è²·" name="buy_btn"/>
+ <button label="å–消" name="cancel_btn"/>
+ <text name="info_cannot_buy">
+ 無法購買
+ </text>
+ <button label="繼續到網é " name="error_web"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_buy_currency_html.xml b/indra/newview/skins/default/xui/zh/floater_buy_currency_html.xml
new file mode 100644
index 0000000000..ec700ad7af
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_buy_currency_html.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_buy_currency_html" title="購買貨幣"/>
diff --git a/indra/newview/skins/default/xui/zh/floater_buy_land.xml b/indra/newview/skins/default/xui/zh/floater_buy_land.xml
new file mode 100644
index 0000000000..336d14747d
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_buy_land.xml
@@ -0,0 +1,233 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="buy land" title="購買土地">
+ <floater.string name="can_resell">
+ May be resold.
+ </floater.string>
+ <floater.string name="can_not_resell">
+ May not be resold.
+ </floater.string>
+ <floater.string name="can_change">
+ May be joined or subdivided.
+ </floater.string>
+ <floater.string name="can_not_change">
+ May not be joined or subdivided.
+ </floater.string>
+ <floater.string name="cant_buy_for_group">
+ You do not have permission to buy land for your active group.
+ </floater.string>
+ <floater.string name="no_land_selected">
+ 無土地被é¸æ“‡ã€‚
+ </floater.string>
+ <floater.string name="multiple_parcels_selected">
+ Multiple different parcels selected.
+Try selecting a smaller area.
+ </floater.string>
+ <floater.string name="no_permission">
+ You do not have permission to buy land for your active group.
+ </floater.string>
+ <floater.string name="parcel_not_for_sale">
+ 所é¸æ“‡çš„地段ä¸å‡ºå”®ã€‚.
+ </floater.string>
+ <floater.string name="group_already_owns">
+ 這個群組已æ“有這個地段。
+ </floater.string>
+ <floater.string name="you_already_own">
+ 你已經æ“有這個地段。
+ </floater.string>
+ <floater.string name="set_to_sell_to_other">
+ The selected parcel is set to sell to another party.
+ </floater.string>
+ <floater.string name="no_public_land">
+ The selected area has no public land.
+ </floater.string>
+ <floater.string name="not_owned_by_you">
+ Land owned by another Resident is selected.
+Try selecting a smaller area.
+ </floater.string>
+ <floater.string name="processing">
+ Processing your purchase...
+
+(éŽç¨‹é€™å°‡æœƒèŠ±è²»ä¸€åˆ°å…©åˆ†é˜ï¼‰
+ </floater.string>
+ <floater.string name="fetching_error">
+ There has been an error while fetching land buying information.
+ </floater.string>
+ <floater.string name="buying_will">
+ Buying this land will:
+ </floater.string>
+ <floater.string name="buying_for_group">
+ Buying land for group will:
+ </floater.string>
+ <floater.string name="cannot_buy_now">
+ Cannot buy now:
+ </floater.string>
+ <floater.string name="not_for_sale">
+ ä¸å‡ºå”®ï¼š
+ </floater.string>
+ <floater.string name="none_needed">
+ none needed
+ </floater.string>
+ <floater.string name="must_upgrade">
+ 你的帳戶必須è¦å‡ç´šæ‰èƒ½æ“有土地。
+ </floater.string>
+ <floater.string name="cant_own_land">
+ 你的帳戶能æ“有土地。
+ </floater.string>
+ <floater.string name="land_holdings">
+ ä½ æŒæœ‰ [BUYER] m² 土地。
+ </floater.string>
+ <floater.string name="pay_to_for_land">
+ Pay L$ [AMOUNT] to [SELLER] for this land
+ </floater.string>
+ <floater.string name="buy_for_US">
+ Buy L$ [AMOUNT] for approx. [LOCAL_AMOUNT],
+ </floater.string>
+ <floater.string name="parcel_meters">
+ 這個地段為 [AMOUNT] m²
+ </floater.string>
+ <floater.string name="premium_land">
+ This land is premium, and will charge as [AMOUNT] m².
+ </floater.string>
+ <floater.string name="discounted_land">
+ This land is discounted, and will charge as [AMOUNT] m².
+ </floater.string>
+ <floater.string name="meters_supports_object">
+ [AMOUNT] m²
+supports [AMOUNT2] objects
+ </floater.string>
+ <floater.string name="sold_with_objects">
+ sold with objects
+ </floater.string>
+ <floater.string name="sold_without_objects">
+ objects not included
+ </floater.string>
+ <floater.string name="info_price_string">
+ L$ [PRICE]
+(L$ [PRICE_PER_SQM]/m²)
+[SOLD_WITH_OBJECTS]
+ </floater.string>
+ <floater.string name="insufficient_land_credits">
+ The group [GROUP] will need sufficient contributed land use credits to cover this parcel before the purchase will complete.
+ </floater.string>
+ <floater.string name="have_enough_lindens">
+ You have L$ [AMOUNT], which is enough to buy this land.
+ </floater.string>
+ <floater.string name="not_enough_lindens">
+ You have only L$ [AMOUNT], and need L$ [AMOUNT2] more.
+ </floater.string>
+ <floater.string name="balance_left">
+ After the purchase, you will have L$ [AMOUNT] left.
+ </floater.string>
+ <floater.string name="balance_needed">
+ You need to buy at least L$ [AMOUNT] to afford this land.
+ </floater.string>
+ <floater.string name="no_parcel_selected">
+ (無地段被é¸æ“‡ï¼‰
+ </floater.string>
+ <text name="region_name_label">
+ 地å€ï¼š
+ </text>
+ <text name="region_name_text">
+ (未知)
+ </text>
+ <text name="region_type_label">
+ 類型:
+ </text>
+ <text name="region_type_text">
+ (未知)
+ </text>
+ <text name="estate_name_label">
+ 領地:
+ </text>
+ <text name="estate_name_text">
+ (未知)
+ </text>
+ <text name="estate_owner_label">
+ 領地æ“有者:
+ </text>
+ <text name="estate_owner_text">
+ (未知)
+ </text>
+ <text name="resellable_changeable_label">
+ Purchased land in this region:
+ </text>
+ <text name="resellable_clause">
+ May or may not be resold.
+ </text>
+ <text name="changeable_clause">
+ May or may not be joined or subdivided.
+ </text>
+ <text name="covenant_text">
+ You must agree to the Estate Covenant:
+ </text>
+ <text_editor name="covenant_editor">
+ 載入中...
+ </text_editor>
+ <check_box label="I Agree to the Covenant Defined Above." name="agree_covenant"/>
+ <text name="info_parcel_label">
+ 地段:
+ </text>
+ <text name="info_parcel">
+ Scotopteryx 138,204
+ </text>
+ <text name="info_size_label">
+ 尺寸:
+ </text>
+ <text name="info_size">
+ 1024 m²
+ </text>
+ <text name="info_price_label">
+ 價格:
+ </text>
+ <text name="info_price">
+ L$ 1500
+(L$ 1.1/m²)
+sold with objects
+ </text>
+ <text name="info_action">
+ Buying this land will:
+ </text>
+ <text name="error_message">
+ Something ain&apos;t right.
+ </text>
+ <button label="å‰å¾€ç¶²ç«™" name="error_web"/>
+ <text name="account_action">
+ Upgrade you to premium membership.
+ </text>
+ <text name="account_reason">
+ Only premimum members may own land.
+ </text>
+ <combo_box name="account_level">
+ <combo_box.item label="US$9.95/month, billed monthly" name="US$9.95/month,billedmonthly"/>
+ <combo_box.item label="US$7.50/month, billed quarterly" name="US$7.50/month,billedquarterly"/>
+ <combo_box.item label="US$6.00/month, billed annually" name="US$6.00/month,billedannually"/>
+ </combo_box>
+ <text name="land_use_action">
+ Increase your monthly land use fees to US$ 40/month.
+ </text>
+ <text name="land_use_reason">
+ You hold 1309 m² of land.
+This parcel is 512 m² of land.
+ </text>
+ <text name="purchase_action">
+ Pay Joe Resident L$ 4000 for the land
+ </text>
+ <text name="currency_reason">
+ You have L$ 2,100.
+ </text>
+ <text name="currency_action">
+ Buy additional L$
+ </text>
+ <line_editor name="currency_amt">
+ 1000
+ </line_editor>
+ <text name="currency_est">
+ for approx. [LOCAL_AMOUNT]
+ </text>
+ <text name="currency_balance">
+ You have L$ 2,100.
+ </text>
+ <check_box label="Remove [AMOUNT] m² of contribution from group." name="remove_contribution"/>
+ <button label="Purchase" name="buy_btn"/>
+ <button label="å–消" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_buy_object.xml b/indra/newview/skins/default/xui/zh/floater_buy_object.xml
new file mode 100644
index 0000000000..507e482766
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_buy_object.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="contents" title="購買物件副本">
+ <floater.string name="title_buy_text">
+ 購買
+ </floater.string>
+ <floater.string name="title_buy_copy_text">
+ Buy a copy of
+ </floater.string>
+ <floater.string name="no_copy_text">
+ (no copy)
+ </floater.string>
+ <floater.string name="no_modify_text">
+ (no modify)
+ </floater.string>
+ <floater.string name="no_transfer_text">
+ (no transfer)
+ </floater.string>
+ <text name="contents_text">
+ Contains:
+ </text>
+ <text name="buy_text">
+ Buy for L$[AMOUNT] from:
+ </text>
+ <text name="buy_name_text">
+ [NAME]?
+ </text>
+ <button label="購買" label_selected="購買" name="buy_btn"/>
+ <button label="å–消" label_selected="å–消" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_camera.xml b/indra/newview/skins/default/xui/zh/floater_camera.xml
new file mode 100644
index 0000000000..b75474340c
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_camera.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="camera_floater">
+ <floater.string name="rotate_tooltip">
+ Rotate Camera Around Focus
+ </floater.string>
+ <floater.string name="zoom_tooltip">
+ Zoom Camera Towards Focus
+ </floater.string>
+ <floater.string name="move_tooltip">
+ Move Camera Up and Down, Left and Right
+ </floater.string>
+ <floater.string name="free_mode_title">
+ 視角物件
+ </floater.string>
+ <panel name="controls">
+ <panel name="preset_views_list">
+ <panel_camera_item name="front_view">
+ <panel_camera_item.text name="front_view_text">
+ å‰è¦–視角
+ </panel_camera_item.text>
+ </panel_camera_item>
+ <panel_camera_item name="group_view">
+ <panel_camera_item.text name="side_view_text">
+ å´è¦–視角
+ </panel_camera_item.text>
+ </panel_camera_item>
+ <panel_camera_item name="rear_view">
+ <panel_camera_item.text name="rear_view_text">
+ 後視視角
+ </panel_camera_item.text>
+ </panel_camera_item>
+ </panel>
+ <panel name="camera_modes_list">
+ <panel_camera_item name="object_view">
+ <panel_camera_item.text name="object_view_text">
+ 物件視角
+ </panel_camera_item.text>
+ </panel_camera_item>
+ <panel_camera_item name="mouselook_view">
+ <panel_camera_item.text name="mouselook_view_text">
+ 第一人稱視角
+ </panel_camera_item.text>
+ </panel_camera_item>
+ </panel>
+ <panel name="zoom">
+ <joystick_rotate name="cam_rotate_stick" tool_tip="Orbit camera around focus"/>
+ <slider_bar name="zoom_slider" tool_tip="Zoom camera toward focus"/>
+ <joystick_track name="cam_track_stick" tool_tip="移動æ”影機上下左å³"/>
+ </panel>
+ </panel>
+ <panel name="buttons">
+ <button label="" name="presets_btn" tool_tip="é è¨­è¦–角"/>
+ <button label="" name="pan_btn" tool_tip="Orbit Zoom Pan"/>
+ <button label="" name="avatarview_btn" tool_tip="æ”影機模å¼"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_choose_group.xml b/indra/newview/skins/default/xui/zh/floater_choose_group.xml
new file mode 100644
index 0000000000..9977bfc828
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_choose_group.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="groups" title="群組">
+ <text name="groupdesc">
+ é¸æ“‡ä¸€å€‹ç¾¤çµ„:
+ </text>
+ <button label="確定" label_selected="確定" name="OK"/>
+ <button label="å–消" label_selected="å–消" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_color_picker.xml b/indra/newview/skins/default/xui/zh/floater_color_picker.xml
new file mode 100644
index 0000000000..a7ac78e419
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_color_picker.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="ColorPicker" title="é¡è‰²æŒ‘é¸å™¨">
+ <text name="r_val_text">
+ 紅色:
+ </text>
+ <text name="g_val_text">
+ 綠色:
+ </text>
+ <text name="b_val_text">
+ è—色:
+ </text>
+ <text name="h_val_text">
+ Hue:
+ </text>
+ <text name="s_val_text">
+ Sat:
+ </text>
+ <text name="l_val_text">
+ Lum:
+ </text>
+ <check_box label="ç«‹å³å¥—用" name="apply_immediate"/>
+ <button label="確定" label_selected="確定" name="select_btn"/>
+ <button label="å–消" label_selected="å–消" name="cancel_btn"/>
+ <text name="Current color:">
+ ç›®å‰é¡è‰²ï¼š
+ </text>
+ <text name="(Drag below to save.)">
+ (Drag below to save)
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_critical.xml b/indra/newview/skins/default/xui/zh/floater_critical.xml
new file mode 100644
index 0000000000..7d08fe8af2
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_critical.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="modal container">
+ <button label="繼續" label_selected="繼續" name="Continue"/>
+ <text name="tos_heading">
+ 請仔細閱讀下列的訊æ¯ã€‚
+ </text>
+ <text_editor name="tos_text">
+ TOS_TEXT
+ </text_editor>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_display_name.xml b/indra/newview/skins/default/xui/zh/floater_display_name.xml
new file mode 100644
index 0000000000..01b5088794
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_display_name.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Display Name" title="變更顯示å稱">
+ <text name="info_text">
+ The name you give your avatar is called your Display Name. You can change it once a week.
+ </text>
+ <text name="lockout_text">
+ You cannot change your Display Name until: [TIME].
+ </text>
+ <text name="set_name_label">
+ 新顯示å稱:
+ </text>
+ <text name="name_confirm_label">
+ Type your new name again to confirm:
+ </text>
+ <button label="儲存" name="save_btn" tool_tip="儲存你的新顯示å稱"/>
+ <button label="é‡è¨­" name="reset_btn" tool_tip="Make Display Name the same as Username"/>
+ <button label="å–消" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_env_settings.xml b/indra/newview/skins/default/xui/zh/floater_env_settings.xml
new file mode 100644
index 0000000000..534ee7f0d0
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_env_settings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Environment Editor Floater" title="ENVIRONMENT EDITOR">
+ <floater.string name="timeStr">
+ [hour12,datetime,utc]:[min,datetime,utc] [ampm,datetime,utc]
+ </floater.string>
+ <text name="EnvTimeText">
+ Time of Day
+ </text>
+ <text name="EnvTimeText2">
+ 12:00 PM
+ </text>
+ <text name="EnvCloudText">
+ Cloud Cover
+ </text>
+ <text name="EnvWaterColorText">
+ 水色
+ </text>
+ <color_swatch name="EnvWaterColor" tool_tip="Click to open color picker"/>
+ <text name="EnvWaterFogText">
+ 水霧
+ </text>
+ <button label="Use Estate Time" name="EnvUseEstateTimeButton"/>
+ <button label="進階天空" name="EnvAdvancedSkyButton"/>
+ <button label="進階水文" name="EnvAdvancedWaterButton"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_event.xml b/indra/newview/skins/default/xui/zh/floater_event.xml
new file mode 100644
index 0000000000..349b5717f2
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_event.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater label="Event" name="Event" title="EVENT DETAILS">
+ <floater.string name="loading_text">
+ 載入中...
+ </floater.string>
+ <floater.string name="done_text">
+ Done
+ </floater.string>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_font_test.xml b/indra/newview/skins/default/xui/zh/floater_font_test.xml
new file mode 100644
index 0000000000..ec83c51eb3
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_font_test.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="contents" title="字型測試"/>
diff --git a/indra/newview/skins/default/xui/zh/floater_gesture.xml b/indra/newview/skins/default/xui/zh/floater_gesture.xml
new file mode 100644
index 0000000000..a809cf085c
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_gesture.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater label="地點" name="gestures" title="姿勢">
+ <floater.string name="loading">
+ 載入中...
+ </floater.string>
+ <floater.string name="playing">
+ (播放中)
+ </floater.string>
+ <floater.string name="copy_name">
+ Copy of [COPY_NAME]
+ </floater.string>
+ <scroll_list name="gesture_list">
+ <scroll_list.columns label="å稱" name="name"/>
+ <scroll_list.columns label="èŠå¤©" name="trigger"/>
+ <scroll_list.columns label="Key" name="shortcut"/>
+ </scroll_list>
+ <panel label="bottom_panel" name="bottom_panel">
+ <menu_button name="gear_btn" tool_tip="更多é¸é …"/>
+ <button name="new_gesture_btn" tool_tip="製作新姿勢e"/>
+ <button name="activate_btn" tool_tip="Activate/Deactivate selected gesture"/>
+ <button name="del_btn" tool_tip="刪除這個姿勢"/>
+ </panel>
+ <button label="編輯" name="edit_btn"/>
+ <button label="播放" name="play_btn"/>
+ <button label="åœæ­¢" name="stop_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_god_tools.xml b/indra/newview/skins/default/xui/zh/floater_god_tools.xml
new file mode 100644
index 0000000000..448113bf74
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_god_tools.xml
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="godtools floater" title="神之工具">
+ <tab_container name="GodTools Tabs">
+ <panel label="網格" name="grid">
+ <button label="刷新這個地å€çš„地圖å¯è¦–å¿«å–" label_selected="刷新這個地å€çš„地圖å¯è¦–å¿«å–" name="Flush This Region&apos;s Map Visibility Caches"/>
+ </panel>
+ <panel label="地å€" name="region">
+ <text name="Region Name:">
+ 地å€å稱:
+ </text>
+ <check_box label="Prelude" name="check prelude" tool_tip="Set this to make the region a prelude"/>
+ <check_box label="固定太陽" name="check fixed sun" tool_tip="Fix the sun position (like in Region/Estate &gt; Terrain"/>
+ <check_box label="Reset Home On Teleport" name="check reset home" tool_tip="When Resident teleports out, reset their home to the destination position."/>
+ <check_box label="Visible" name="check visible" tool_tip="Set this to make the region visible to non-gods"/>
+ <check_box label="傷害" name="check damage" tool_tip="Set this to enable damage in this region"/>
+ <check_box label="阻止æµé‡è¿½è¹¤" name="block dwell" tool_tip="Set this to make the region not compute traffic"/>
+ <check_box label="阻止變形" name="block terraform" tool_tip="Set this to disallow people terraforming their land"/>
+ <check_box label="沙盒" name="is sandbox" tool_tip="Toggle whether this is a sandbox region"/>
+ <button label="Bake Terrain" label_selected="Bake Terrain" name="Bake Terrain" tool_tip="儲存目å‰çš„地形為é è¨­"/>
+ <button label="Revert Terrain" label_selected="Revert Terrain" name="Revert Terrain" tool_tip="Replace the current terrain with default"/>
+ <button label="Swap Terrain" label_selected="Swap Terrain" name="Swap Terrain" tool_tip="Swap current terrain with default"/>
+ <text name="estate id">
+ 領地 ID:
+ </text>
+ <text name="parent id">
+ Parent ID:
+ </text>
+ <line_editor name="parentestate" tool_tip="This is the parent estate for this region"/>
+ <text name="Grid Pos: ">
+ 網格ä½ç½®ï¼š
+ </text>
+ <line_editor name="gridposx" tool_tip="This is the grid x position for this region"/>
+ <line_editor name="gridposy" tool_tip="This is the grid y position for this region"/>
+ <text name="Redirect to Grid: ">
+ Redirect to Grid:
+ </text>
+ <text name="billable factor text">
+ Billable Factor:
+ </text>
+ <text name="land cost text">
+ L$ per m²:
+ </text>
+ <button label="é‡æ–°æ•´ç†" label_selected="é‡æ–°æ•´ç†" name="Refresh" tool_tip="Click here to refresh the above information"/>
+ <button label="套用" label_selected="套用" name="Apply" tool_tip="點擊此處以接å—套用上述變更"/>
+ <button label="é¸æ“‡åœ°å€" label_selected="é¸æ“‡åœ°å€" name="Select Region" tool_tip="Select the whole region with the land tool"/>
+ <button label="ç«‹å³è‡ªå‹•å„²å­˜" label_selected="ç«‹å³è‡ªå‹•å„²å­˜" name="Autosave now" tool_tip="Save gzipped state to autosave directory"/>
+ </panel>
+ <panel label="物件" name="objects">
+ <panel.string name="no_target">
+ (無目標)
+ </panel.string>
+ <text name="Region Name:">
+ 地å€å稱:
+ </text>
+ <text name="region name">
+ Welsh
+ </text>
+ <check_box label="關閉腳本" name="disable scripts" tool_tip="關閉這個地å€ç¾åœ¨çš„全部腳本"/>
+ <check_box label="Disable Collisions" name="disable collisions" tool_tip="Set this to disable non-agent collisions in this region"/>
+ <check_box label="Disable Physics" name="disable physics" tool_tip="Set this to disable all physics in this region"/>
+ <button label="套用" label_selected="套用" name="Apply" tool_tip="Click here to apply any changes from above"/>
+ <button label="Set Target" label_selected="Set Target" name="Set Target" tool_tip="Set the target avatar for object deletion"/>
+ <text name="target_avatar_name">
+ (無目標)
+ </text>
+ <button label="Delete Target&apos;s Scripted Objects On Others Land" label_selected="Delete Target&apos;s Scripted Objects On Others Land" name="Delete Target&apos;s Scripted Objects On Others Land" tool_tip="Delete all scripted objects owned by the target on land not owned by the target. (no copy) objects will be returned."/>
+ <button label="Delete Target&apos;s Scripted Objects On *Any* Land" label_selected="Delete Target&apos;s Scripted Objects On *Any* Land" name="Delete Target&apos;s Scripted Objects On *Any* Land" tool_tip="Delete all scripted objects owned by the target in this region. (no copy) objects will be returned."/>
+ <button label="Delete *ALL* Of Target&apos;s Objects" label_selected="Delete *ALL* Of Target&apos;s Objects" name="Delete *ALL* Of Target&apos;s Objects" tool_tip="Delete all objects owned by the target in this region. (no copy) objects will be returned."/>
+ <button label="Get Top Colliders" label_selected="Get Top Colliders" name="Get Top Colliders" tool_tip="Gets list of objects experiencing the most narrowphase callbacks"/>
+ <button label="Get Top Scripts" label_selected="Get Top Scripts" name="Get Top Scripts" tool_tip="Gets list of objects spending the most time running scripts"/>
+ <button label="Scripts digest" label_selected="Scripts digest" name="Scripts digest" tool_tip="Gets a list of all scripts and number of occurences of each"/>
+ </panel>
+ <panel label="Request" name="request">
+ <text name="Destination:">
+ Destination:
+ </text>
+ <combo_box name="destination">
+ <combo_box.item label="Selection" name="item1"/>
+ <combo_box.item label="Agent Region" name="item2"/>
+ </combo_box>
+ <text name="Request:">
+ Request:
+ </text>
+ <combo_box name="request">
+ <combo_box.item label="colliders &lt;steps&gt;" name="item1"/>
+ <combo_box.item label="scripts &lt;count&gt;,&lt;optional pattern&gt;" name="item2"/>
+ <combo_box.item label="objects &lt;pattern&gt;" name="item3"/>
+ <combo_box.item label="rez &lt;asset_id&gt;" name="item4"/>
+ </combo_box>
+ <text name="Parameter:">
+ Parameter:
+ </text>
+ <button label="Make Request" label_selected="Make Request" name="Make Request"/>
+ </panel>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_hardware_settings.xml b/indra/newview/skins/default/xui/zh/floater_hardware_settings.xml
new file mode 100644
index 0000000000..1465dcb256
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_hardware_settings.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Hardware Settings Floater" title="硬體設定">
+ <text name="Filtering:">
+ Filtering:
+ </text>
+ <check_box label="Anisotropic Filtering (slower when enabled)" name="ani"/>
+ <text name="Antialiasing:">
+ Antialiasing:
+ </text>
+ <combo_box label="Antialiasing" name="fsaa">
+ <combo_box.item label="Disabled" name="FSAADisabled"/>
+ <combo_box.item label="2x" name="2x"/>
+ <combo_box.item label="4x" name="4x"/>
+ <combo_box.item label="8x" name="8x"/>
+ <combo_box.item label="16x" name="16x"/>
+ </combo_box>
+ <text name="antialiasing restart">
+ (須é‡æ–°å•Ÿå‹•ç€è¦½å™¨ï¼‰
+ </text>
+ <spinner label="Gamma:" name="gamma"/>
+ <text name="(brightness, lower is brighter)">
+ (0 = default brightness, lower = brighter)
+ </text>
+ <text name="Enable VBO:">
+ Enable VBO:
+ </text>
+ <check_box initial_value="true" label="Enable OpenGL Vertex Buffer Objects" name="vbo" tool_tip="Enabling this on modern hardware gives a performance gain. However, older hardware often has poor implementations of VBOs and you may get crashes when this is enabled."/>
+ <slider label="æ質記憶體(MB):" name="GraphicsCardTextureMemory" tool_tip="Amount of memory to allocate for textures. Defaults to video card memory. Reducing this may improve performance but may also make textures blurry."/>
+ <spinner label="Fog Distance Ratio:" name="fog"/>
+ <button label="確定" label_selected="確定" name="OK"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_help_browser.xml b/indra/newview/skins/default/xui/zh/floater_help_browser.xml
new file mode 100644
index 0000000000..e605d5f19c
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_help_browser.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_help_browser" title="幫助ç€è¦½å™¨">
+ <floater.string name="loading_text">
+ 載入中...
+ </floater.string>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_hud.xml b/indra/newview/skins/default/xui/zh/floater_hud.xml
new file mode 100644
index 0000000000..a788961e95
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_hud.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_hud" title="教學"/>
diff --git a/indra/newview/skins/default/xui/zh/floater_im_container.xml b/indra/newview/skins/default/xui/zh/floater_im_container.xml
new file mode 100644
index 0000000000..2d66c659fe
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_im_container.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<multi_floater name="floater_im_box" title="交談"/>
diff --git a/indra/newview/skins/default/xui/zh/floater_im_session.xml b/indra/newview/skins/default/xui/zh/floater_im_session.xml
new file mode 100644
index 0000000000..e8db97560e
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_im_session.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="panel_im">
+ <layout_stack name="im_panels">
+ <layout_panel>
+ <line_editor label="To" name="chat_editor"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_image_preview.xml b/indra/newview/skins/default/xui/zh/floater_image_preview.xml
new file mode 100644
index 0000000000..1260601f90
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_image_preview.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Image Preview">
+ <text name="name_label">
+ å稱:
+ </text>
+ <text name="description_label">
+ æ述:
+ </text>
+ <text name="preview_label">
+ é è¦½åœ–åƒç‚ºï¼š
+ </text>
+ <combo_box label="æœè£é¡žåž‹" name="clothing_type_combo">
+ <item label="圖åƒ" name="Image" value="圖åƒ"/>
+ <item label="é ­é«®" name="Hair" value="é ­é«®"/>
+ <item label="女性頭部" name="FemaleHead" value="女性頭部"/>
+ <item label="女性上åŠèº«" name="FemaleUpperBody" value="女性上åŠèº«"/>
+ <item label="女性下åŠèº«" name="FemaleLowerBody" value="女性下åŠèº«"/>
+ <item label="男性頭部" name="MaleHead" value="男性頭部"/>
+ <item label="男性上åŠèº«" name="MaleUpperBody" value="男性上åŠèº«"/>
+ <item label="男性下åŠèº«" name="MaleLowerBody" value="男性下åŠèº«"/>
+ <item label="裙å­" name="Skirt" value="裙å­"/>
+ <item label="雕刻的幾何元件" name="SculptedPrim" value="雕刻的幾何元件"/>
+ </combo_box>
+ <text name="bad_image_text">
+ 無法讀å–圖åƒã€‚
+
+請嘗試儲存圖åƒç‚º 24 ä½å…ƒ Targa(.tga)格å¼ã€‚
+ </text>
+ <check_box label="Use lossless compression" name="lossless_check"/>
+ <button label="å–消" name="cancel_btn"/>
+ <button label="上傳(L$[AMOUNT])" name="ok_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_incoming_call.xml b/indra/newview/skins/default/xui/zh/floater_incoming_call.xml
new file mode 100644
index 0000000000..a0f31fa11f
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_incoming_call.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="incoming call" title="來電">
+ <floater.string name="lifetime">
+ 5
+ </floater.string>
+ <floater.string name="localchat">
+ 附近的音èŠå¤©
+ </floater.string>
+ <floater.string name="anonymous">
+ 匿å
+ </floater.string>
+ <floater.string name="VoiceInviteP2P">
+ 通話中。
+ </floater.string>
+ <floater.string name="VoiceInviteAdHoc">
+ 已加訴入會議交談中的語音èŠå¤©ã€‚
+ </floater.string>
+ <floater.string name="VoiceInviteGroup">
+ 剛加入 &apos;[GROUP]&apos; 語音頻é“。
+ </floater.string>
+ <floater.string name="VoiceInviteQuestionGroup">
+ Would you like to leave [CURRENT_CHAT] and join the call with &apos;[GROUP]&apos;?
+ </floater.string>
+ <floater.string name="VoiceInviteQuestionDefault">
+ Do you want to leave [CURRENT_CHAT] and join this voice chat?
+ </floater.string>
+ <text name="question">
+ Do you want to leave [CURRENT_CHAT] and join this voice chat?
+ </text>
+ <button label="接å—" label_selected="接å—" name="Accept"/>
+ <button label="拒絕" label_selected="拒絕" name="Reject"/>
+ <button label="開始 IM" name="Start IM"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_inspect.xml b/indra/newview/skins/default/xui/zh/floater_inspect.xml
new file mode 100644
index 0000000000..ea3d9d0c3e
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_inspect.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="inspect" title="INSPECT OBJECTS">
+ <floater.string name="timeStamp">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </floater.string>
+ <scroll_list name="object_list" tool_tip="Select an object from this list to highlight it in-world">
+ <scroll_list.columns label="物件å稱" name="object_name"/>
+ <scroll_list.columns label="æ“有者å稱" name="owner_name"/>
+ <scroll_list.columns label="創造者å稱" name="creator_name"/>
+ <scroll_list.columns label="創造日期" name="creation_date"/>
+ </scroll_list>
+ <button label="察看æ“有者檔案..." name="button owner" tool_tip="See profile of the highlighted object&apos;s owner"/>
+ <button label="察看創造者檔案..." name="button creator" tool_tip="See profile of the highlighted object&apos;s original creator"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_inventory.xml b/indra/newview/skins/default/xui/zh/floater_inventory.xml
new file mode 100644
index 0000000000..da4619c964
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_inventory.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Inventory" title="我的收ç´å€">
+ <panel label="收ç´å€é¢æ¿" name="Inventory Panel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/zh/floater_inventory_item_properties.xml
new file mode 100644
index 0000000000..a41be7ef9a
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_inventory_item_properties.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="item properties" title="收ç´å€ç‰©å“屬性">
+ <floater.string name="unknown">
+ (未知)
+ </floater.string>
+ <floater.string name="public">
+ (公開)
+ </floater.string>
+ <floater.string name="you_can">
+ ä½ å¯ä»¥ï¼š
+ </floater.string>
+ <floater.string name="owner_can">
+ æ“有者å¯ä»¥ï¼š
+ </floater.string>
+ <floater.string name="acquiredDate">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </floater.string>
+ <text name="LabelItemNameTitle">
+ å稱:
+ </text>
+ <text name="LabelItemDescTitle">
+ æ述:
+ </text>
+ <text name="LabelCreatorTitle">
+ 創造者:
+ </text>
+ <button label="檔案..." name="BtnCreator"/>
+ <text name="LabelOwnerTitle">
+ æ“有者:
+ </text>
+ <button label="檔案..." name="BtnOwner"/>
+ <text name="LabelAcquiredTitle">
+ Acquired:
+ </text>
+ <text name="LabelAcquiredDate">
+ Wed May 24 12:50:46 2006
+ </text>
+ <text name="OwnerLabel">
+ 你:
+ </text>
+ <check_box label="編輯" name="CheckOwnerModify"/>
+ <check_box label="覆製" name="CheckOwnerCopy"/>
+ <check_box label="轉售" name="CheckOwnerTransfer"/>
+ <text name="AnyoneLabel">
+ 任何人:
+ </text>
+ <check_box label="覆製" name="CheckEveryoneCopy"/>
+ <text name="GroupLabel">
+ 群組:
+ </text>
+ <check_box label="分享" name="CheckShareWithGroup"/>
+ <text name="NextOwnerLabel">
+ 下一個æ“有者:
+ </text>
+ <check_box label="編輯" name="CheckNextOwnerModify"/>
+ <check_box label="覆製" name="CheckNextOwnerCopy"/>
+ <check_box label="轉售" name="CheckNextOwnerTransfer"/>
+ <check_box label="出售" name="CheckPurchase"/>
+ <combo_box name="combobox sale copy">
+ <combo_box.item label="副本" name="Copy"/>
+ <combo_box.item label="原件" name="Original"/>
+ </combo_box>
+ <spinner label="價格:" name="Edit Cost"/>
+ <text name="CurrencySymbol">
+ L$
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/zh/floater_inventory_view_finder.xml
new file mode 100644
index 0000000000..d698edf5e5
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_inventory_view_finder.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Inventory Finder" title="最近_收ç´å€_物å“">
+ <check_box label="動作" name="check_animation"/>
+ <check_box label="å片" name="check_calling_card"/>
+ <check_box label="æœè£" name="check_clothing"/>
+ <check_box label="姿勢" name="check_gesture"/>
+ <check_box label="地標" name="check_landmark"/>
+ <check_box label="記事å¡" name="check_notecard"/>
+ <check_box label="Objects" name="check_object"/>
+ <check_box label="腳本" name="check_script"/>
+ <check_box label="Sounds" name="check_sound"/>
+ <check_box label="æ質" name="check_texture"/>
+ <check_box label="Snapshots" name="check_snapshot"/>
+ <button label="全部" label_selected="全部" name="All"/>
+ <button label="ç„¡" label_selected="ç„¡" name="None"/>
+ <check_box label="Always show folders" name="check_show_empty"/>
+ <check_box label="Since Logoff" name="check_since_logoff"/>
+ <text name="- OR -">
+ - 或 -
+ </text>
+ <spinner label="å°æ™‚å‰" name="spin_hours_ago"/>
+ <spinner label="天å‰" name="spin_days_ago"/>
+ <button label="關閉" label_selected="關閉" name="Close"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_joystick.xml b/indra/newview/skins/default/xui/zh/floater_joystick.xml
new file mode 100644
index 0000000000..1721f7cd1e
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_joystick.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Joystick" title="JOYSTICK CONFIGURATION">
+ <floater.string name="NoDevice">
+ 未åµæ¸¬åˆ°è¨­å‚™
+ </floater.string>
+ <check_box label="Enable Joystick:" name="enable_joystick"/>
+ <spinner label="X Axis Mapping" name="JoystickAxis1"/>
+ <spinner label="Y Axis Mapping" name="JoystickAxis2"/>
+ <spinner label="Z Axis Mapping" name="JoystickAxis0"/>
+ <spinner label="Pitch Mapping" name="JoystickAxis4"/>
+ <spinner label="Yaw Mapping" name="JoystickAxis5"/>
+ <spinner label="Roll Mapping" name="JoystickAxis3"/>
+ <spinner label="Zoom Mapping" name="JoystickAxis6"/>
+ <check_box label="Direct Zoom" name="ZoomDirect"/>
+ <check_box label="3D Cursor" name="Cursor3D"/>
+ <check_box label="Auto Level" name="AutoLeveling"/>
+ <text name="Control Modes:">
+ Control Modes:
+ </text>
+ <check_box label="化身" name="JoystickAvatarEnabled"/>
+ <check_box label="建造" name="JoystickBuildEnabled"/>
+ <check_box label="Flycam" name="JoystickFlycamEnabled"/>
+ <stat_view label="Joystick Monitor" name="axis_view">
+ <stat_bar label="Axis 0" name="axis0"/>
+ <stat_bar label="Axis 1" name="axis1"/>
+ <stat_bar label="Axis 2" name="axis2"/>
+ <stat_bar label="Axis 3" name="axis3"/>
+ <stat_bar label="Axis 4" name="axis4"/>
+ <stat_bar label="Axis 5" name="axis5"/>
+ </stat_view>
+ <text name="XScale">
+ X Scale
+ </text>
+ <text name="YScale">
+ Y Scale
+ </text>
+ <text name="ZScale">
+ Z Scale
+ </text>
+ <text name="PitchScale">
+ Pitch Scale
+ </text>
+ <text name="YawScale">
+ Yaw Scale
+ </text>
+ <text name="RollScale">
+ Roll Scale
+ </text>
+ <text name="XDeadZone">
+ X Dead Zone
+ </text>
+ <text name="YDeadZone">
+ Y Dead Zone
+ </text>
+ <text name="ZDeadZone">
+ Z Dead Zone
+ </text>
+ <text name="PitchDeadZone">
+ Pitch Dead Zone
+ </text>
+ <text name="YawDeadZone">
+ Yaw Dead Zone
+ </text>
+ <text name="RollDeadZone">
+ Roll Dead Zone
+ </text>
+ <text name="Feathering">
+ Feathering
+ </text>
+ <text name="ZoomScale2">
+ Zoom Scale
+ </text>
+ <text name="ZoomDeadZone">
+ Zoom Dead Zone
+ </text>
+ <button label="SpaceNavigator Defaults" name="SpaceNavigatorDefaults"/>
+ <button label="確定" label_selected="確定" name="ok_btn"/>
+ <button label="å–消" label_selected="å–消" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_lagmeter.xml b/indra/newview/skins/default/xui/zh/floater_lagmeter.xml
new file mode 100644
index 0000000000..6e58e7332f
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_lagmeter.xml
@@ -0,0 +1,151 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_lagmeter" title="LAG 測é‡å™¨">
+ <floater.string name="max_title_msg">
+ Lag 測é‡å™¨
+ </floater.string>
+ <floater.string name="max_width_px">
+ 360
+ </floater.string>
+ <floater.string name="min_title_msg">
+ Lag
+ </floater.string>
+ <floater.string name="min_width_px">
+ 90
+ </floater.string>
+ <floater.string name="client_text_msg">
+ 客戶端
+ </floater.string>
+ <floater.string name="client_frame_rate_critical_fps">
+ 10
+ </floater.string>
+ <floater.string name="client_frame_rate_warning_fps">
+ 15
+ </floater.string>
+ <floater.string name="client_frame_time_window_bg_msg">
+ Normal, window in background
+ </floater.string>
+ <floater.string name="client_frame_time_critical_msg">
+ Client frame rate below [CLIENT_FRAME_RATE_CRITICAL]
+ </floater.string>
+ <floater.string name="client_frame_time_warning_msg">
+ Client frame rate between [CLIENT_FRAME_RATE_CRITICAL] and [CLIENT_FRAME_RATE_WARNING]
+ </floater.string>
+ <floater.string name="client_frame_time_normal_msg">
+ 正常
+ </floater.string>
+ <floater.string name="client_draw_distance_cause_msg">
+ Possible cause: Draw distance set too high
+ </floater.string>
+ <floater.string name="client_texture_loading_cause_msg">
+ Possible cause: Images loading
+ </floater.string>
+ <floater.string name="client_texture_memory_cause_msg">
+ Possible cause: Too many images in memory
+ </floater.string>
+ <floater.string name="client_complex_objects_cause_msg">
+ Possible cause: Too many complex objects in scene
+ </floater.string>
+ <floater.string name="network_text_msg">
+ 網路
+ </floater.string>
+ <floater.string name="network_packet_loss_critical_pct">
+ 10
+ </floater.string>
+ <floater.string name="network_packet_loss_warning_pct">
+ 5
+ </floater.string>
+ <floater.string name="network_packet_loss_critical_msg">
+ Connection is dropping over [NETWORK_PACKET_LOSS_CRITICAL]% of packets
+ </floater.string>
+ <floater.string name="network_packet_loss_warning_msg">
+ Connection is dropping [NETWORK_PACKET_LOSS_WARNING]%-[NETWORK_PACKET_LOSS_CRITICAL]% of packets
+ </floater.string>
+ <floater.string name="network_performance_normal_msg">
+ 正常
+ </floater.string>
+ <floater.string name="network_ping_critical_ms">
+ 600
+ </floater.string>
+ <floater.string name="network_ping_warning_ms">
+ 300
+ </floater.string>
+ <floater.string name="network_ping_critical_msg">
+ Connection ping time is over [NETWORK_PING_CRITICAL] ms
+ </floater.string>
+ <floater.string name="network_ping_warning_msg">
+ Connection ping time is [NETWORK_PING_WARNING]-[NETWORK_PING_CRITICAL] ms
+ </floater.string>
+ <floater.string name="network_packet_loss_cause_msg">
+ Possible bad connection or &apos;Bandwidth&apos; pref too high.
+ </floater.string>
+ <floater.string name="network_ping_cause_msg">
+ Possible bad connection or file-sharing app.
+ </floater.string>
+ <floater.string name="server_text_msg">
+ 伺æœå™¨
+ </floater.string>
+ <floater.string name="server_frame_rate_critical_fps">
+ 20
+ </floater.string>
+ <floater.string name="server_frame_rate_warning_fps">
+ 30
+ </floater.string>
+ <floater.string name="server_single_process_max_time_ms">
+ 20
+ </floater.string>
+ <floater.string name="server_frame_time_critical_msg">
+ 模擬器 framerate 低於 [SERVER_FRAME_RATE_CRITICAL]
+ </floater.string>
+ <floater.string name="server_frame_time_warning_msg">
+ 模擬器 framerate 介於 [SERVER_FRAME_RATE_CRITICAL] 與 [SERVER_FRAME_RATE_WARNING] 之間
+ </floater.string>
+ <floater.string name="server_frame_time_normal_msg">
+ 正常
+ </floater.string>
+ <floater.string name="server_physics_cause_msg">
+ å¯èƒ½åŽŸå› ï¼šå¤ªå¤šç‰©ç†ç‰©ä»¶
+ </floater.string>
+ <floater.string name="server_scripts_cause_msg">
+ å¯èƒ½åŽŸå› ï¼šå¤ªå¤šè…³æœ¬ç‰©ä»¶
+ </floater.string>
+ <floater.string name="server_net_cause_msg">
+ å¯èƒ½åŽŸå› ï¼šå¤ªå¤šç¶²è·¯æµé‡
+ </floater.string>
+ <floater.string name="server_agent_cause_msg">
+ å¯èƒ½åŽŸå› ï¼šåœ°å€æœ‰å¤ªå¤šç§»å‹•çš„人
+ </floater.string>
+ <floater.string name="server_images_cause_msg">
+ å¯èƒ½åŽŸå› ï¼šå¤ªå¤šåœ–åƒè¨ˆç®—
+ </floater.string>
+ <floater.string name="server_generic_cause_msg">
+ å¯èƒ½åŽŸå› ï¼šæ¨¡æ“¬å™¨è² è¼‰éŽé‡
+ </floater.string>
+ <floater.string name="smaller_label">
+ &gt;&gt;
+ </floater.string>
+ <floater.string name="bigger_label">
+ &lt;&lt;
+ </floater.string>
+ <button name="client_lagmeter" tool_tip="客戶端 lag 狀態"/>
+ <text name="client">
+ 客戶端
+ </text>
+ <text name="client_text">
+ 正常
+ </text>
+ <button name="network_lagmeter" tool_tip="網路 lag 狀態"/>
+ <text name="network">
+ 網路
+ </text>
+ <text name="network_text">
+ 正常
+ </text>
+ <button name="server_lagmeter" tool_tip="伺æœå™¨ lag 狀態"/>
+ <text name="server">
+ 伺æœå™¨
+ </text>
+ <text name="server_text">
+ 正常
+ </text>
+ <button label="&gt;&gt;" name="minimize" tool_tip="切æ›æµ®å‹•è¦–窗尺寸"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_land_holdings.xml b/indra/newview/skins/default/xui/zh/floater_land_holdings.xml
new file mode 100644
index 0000000000..1d172f63e1
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_land_holdings.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="land holdings floater" title="我的土地">
+ <floater.string name="area_string">
+ [AREA] m²
+ </floater.string>
+ <scroll_list name="parcel list">
+ <scroll_list.columns label="地段" name="name"/>
+ <scroll_list.columns label="地å€" name="location"/>
+ <scroll_list.columns label="é¡žåž‹" name="type"/>
+ <scroll_list.columns label="å€åŸŸ" name="area"/>
+ </scroll_list>
+ <button label="瞬間傳é€" label_selected="瞬間傳é€" name="Teleport" tool_tip="瞬間傳é€åˆ°é€™åœŸåœ°çš„中央。"/>
+ <button label="地圖" label_selected="地圖" name="Show on Map" tool_tip="將這塊土地顯示在世界地圖上。"/>
+ <text name="contrib_label">
+ Contributions to your groups:
+ </text>
+ <scroll_list name="grant list">
+ <scroll_list.columns label="群組" name="group"/>
+ <scroll_list.columns label="å€åŸŸ" name="area"/>
+ </scroll_list>
+ <text name="allowed_label">
+ Allowed land holdings at current payment plan:
+ </text>
+ <text name="allowed_text">
+ [AREA] m²
+ </text>
+ <text name="current_label">
+ Current land holdings:
+ </text>
+ <text name="current_text">
+ [AREA] m²
+ </text>
+ <text name="available_label">
+ Available for land purchases:
+ </text>
+ <text name="available_text">
+ [AREA] m²
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/zh/floater_live_lsleditor.xml
new file mode 100644
index 0000000000..fe61c312ed
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_live_lsleditor.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="script ed float" title="腳本: 新腳本">
+ <floater.string name="not_allowed">
+ You can not view or edit this script, since it has been set as &quot;no copy&quot;. You need full permissions to view or edit a script inside an object.
+ </floater.string>
+ <floater.string name="script_running">
+ 執行中
+ </floater.string>
+ <floater.string name="Title">
+ 腳本:[NAME]
+ </floater.string>
+ <button label="é‡è¨­" label_selected="é‡è¨­" name="Reset"/>
+ <check_box initial_value="true" label="執行中" name="running"/>
+ <check_box initial_value="true" label="Mono" name="mono"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_lsl_guide.xml b/indra/newview/skins/default/xui/zh/floater_lsl_guide.xml
new file mode 100644
index 0000000000..e5c3c47827
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_lsl_guide.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="script ed float" title="LSL REFERENCE">
+ <check_box label="Follow cursor" name="lock_check"/>
+ <combo_box label="Lock" name="history_combo"/>
+ <button label="Back" name="back_btn"/>
+ <button label="Forward" name="fwd_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_map.xml b/indra/newview/skins/default/xui/zh/floater_map.xml
new file mode 100644
index 0000000000..b535ef0074
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_map.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Map" title="">
+ <floater.string name="ToolTipMsg">
+ [REGION](Double-click to open Map, shift-drag to pan)
+ </floater.string>
+ <floater.string name="AltToolTipMsg">
+ [REGION](Double-click to teleport, shift-drag to pan)
+ </floater.string>
+ <floater.string name="mini_map_caption">
+ MINIMAP
+ </floater.string>
+ <text label="N" name="floater_map_north">
+ N
+ </text>
+ <text label="E" name="floater_map_east">
+ E
+ </text>
+ <text label="W" name="floater_map_west">
+ W
+ </text>
+ <text label="S" name="floater_map_south">
+ S
+ </text>
+ <text label="SE" name="floater_map_southeast">
+ SE
+ </text>
+ <text label="NE" name="floater_map_northeast">
+ NE
+ </text>
+ <text label="SW" name="floater_map_southwest">
+ SW
+ </text>
+ <text label="NW" name="floater_map_northwest">
+ NW
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_media_browser.xml b/indra/newview/skins/default/xui/zh/floater_media_browser.xml
new file mode 100644
index 0000000000..6e75016fad
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_media_browser.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_about" title="媒體劉覽器">
+ <floater.string name="home_page_url">
+ http://www.secondlife.com
+ </floater.string>
+ <floater.string name="support_page_url">
+ http://support.secondlife.com
+ </floater.string>
+ <layout_stack name="stack1">
+ <layout_panel name="nav_controls">
+ <button label="å‘後" name="back"/>
+ <button label="å‘å‰" name="forward"/>
+ <button label="é‡è¼‰" name="reload"/>
+ <button label="Go" name="go"/>
+ </layout_panel>
+ <layout_panel name="time_controls">
+ <button label="rewind" name="rewind"/>
+ <button label="åœæ­¢" name="stop"/>
+ <button label="å‘å‰" name="seek"/>
+ </layout_panel>
+ <layout_panel name="parcel_owner_controls">
+ <button label="é€å‡ºç›®å‰é é¢åˆ°åœ°æ®µ" name="assign"/>
+ </layout_panel>
+ <layout_panel name="external_controls">
+ <button label="在我的網é ç€è¦½å™¨ä¸­é–‹å•Ÿ" name="open_browser"/>
+ <check_box label="總是在我的網é ç€è¦½å™¨ä¸­é–‹å•Ÿ" name="open_always"/>
+ <button label="關閉" name="close"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_media_settings.xml b/indra/newview/skins/default/xui/zh/floater_media_settings.xml
new file mode 100644
index 0000000000..f42c0af3d9
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_media_settings.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="media_settings" title="MEDIA SETTINGS">
+ <button label="確定" label_selected="確定" name="OK"/>
+ <button label="å–消" label_selected="å–消" name="Cancel"/>
+ <button label="套用" label_selected="套用" name="Apply"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_mem_leaking.xml b/indra/newview/skins/default/xui/zh/floater_mem_leaking.xml
new file mode 100644
index 0000000000..93c1b58df6
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_mem_leaking.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="MemLeak" title="SIMULATE A MEMORY LEAK">
+ <spinner label="Leaking Speed (bytes per frame):" name="leak_speed"/>
+ <spinner label="Max Leaked Memory (MB):" name="max_leak"/>
+ <text name="total_leaked_label">
+ Current leaked memory: [SIZE] KB
+ </text>
+ <text name="note_label_1">
+ [NOTE1]
+ </text>
+ <text name="note_label_2">
+ [NOTE2]
+ </text>
+ <button label="Start" name="start_btn"/>
+ <button label="åœæ­¢" name="stop_btn"/>
+ <button label="Release" name="release_btn"/>
+ <button label="關閉" name="close_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_moveview.xml b/indra/newview/skins/default/xui/zh/floater_moveview.xml
new file mode 100644
index 0000000000..e1155bdf34
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_moveview.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="move_floater">
+ <string name="walk_forward_tooltip">
+ Walk Forward (press Up Arrow or W)
+ </string>
+ <string name="walk_back_tooltip">
+ Walk Backwards (press Down Arrow or S)
+ </string>
+ <string name="walk_left_tooltip">
+ Walk left (press Shift + Left Arrow or A)
+ </string>
+ <string name="walk_right_tooltip">
+ Walk right (press Shift + Right Arrow or D)
+ </string>
+ <string name="run_forward_tooltip">
+ Run Forward (press Up Arrow or W)
+ </string>
+ <string name="run_back_tooltip">
+ Run Backwards (press Down Arrow or S)
+ </string>
+ <string name="run_left_tooltip">
+ Run left (press Shift + Left Arrow or A)
+ </string>
+ <string name="run_right_tooltip">
+ Run right (press Shift + Right Arrow or D)
+ </string>
+ <string name="fly_forward_tooltip">
+ å‘å‰é£›ï¼ˆæŒ‰ä¸‹å‘上箭頭或 W éµï¼‰
+ </string>
+ <string name="fly_back_tooltip">
+ å‘後飛(按下å‘下箭頭或 S éµï¼‰
+ </string>
+ <string name="fly_left_tooltip">
+ å‘左飛(按下 Shift 加上左方å‘éµæˆ–者是按 A éµï¼‰
+ </string>
+ <string name="fly_right_tooltip">
+ å‘å³é£›ï¼ˆæŒ‰ä¸‹ Shift 加上å³æ–¹å‘éµæˆ–者是按 D éµï¼‰
+ </string>
+ <string name="fly_up_tooltip">
+ å‘上飛(按下 E éµï¼‰
+ </string>
+ <string name="fly_down_tooltip">
+ å‘下飛(按下 C éµï¼‰
+ </string>
+ <string name="jump_tooltip">
+ è·³èºï¼ˆæŒ‰ä¸‹ E éµï¼‰
+ </string>
+ <string name="crouch_tooltip">
+ 蹲下(按下 C éµï¼‰
+ </string>
+ <string name="walk_title">
+ 行走
+ </string>
+ <string name="run_title">
+ è·‘æ­¥
+ </string>
+ <string name="fly_title">
+ 飛行
+ </string>
+ <panel name="panel_actions">
+ <button name="turn left btn" tool_tip="左轉(按下左方å‘éµæˆ–按 A éµï¼‰"/>
+ <joystick_slide name="move left btn" tool_tip="å‘左走(按下 Shift 加左方å‘éµæˆ–按 A éµï¼‰"/>
+ <button name="turn right btn" tool_tip="å³è½‰ï¼ˆæŒ‰ä¸‹å³æ–¹å‘éµæˆ–按 D éµï¼‰"/>
+ <joystick_slide name="move right btn" tool_tip="å‘å³èµ°ï¼ˆæŒ‰ä¸‹ Shift 加å³æ–¹å‘éµæˆ–按 D éµï¼‰"/>
+ <joystick_turn name="forward btn" tool_tip="å‘å‰èµ°ï¼ˆæŒ‰å‘上方å‘éµæˆ–按 W éµï¼‰"/>
+ <joystick_turn name="backward btn" tool_tip="å‘後退(按å‘下方å‘éµæˆ–按 S éµï¼‰"/>
+ <button name="move up btn" tool_tip="å‘上飛(按下 E éµï¼‰"/>
+ <button name="move down btn" tool_tip="å‘下飛(按下 C 建)"/>
+ </panel>
+ <panel name="panel_modes">
+ <button label="" name="mode_walk_btn" tool_tip="行走模å¼"/>
+ <button label="" name="mode_run_btn" tool_tip="跑步模å¼"/>
+ <button label="" name="mode_fly_btn" tool_tip="飛行模å¼"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_mute_object.xml b/indra/newview/skins/default/xui/zh/floater_mute_object.xml
new file mode 100644
index 0000000000..606e061395
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_mute_object.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="block by name" title="ä¾å稱å°éŽ–物件">
+ <text name="message">
+ Block an object:
+ </text>
+ <line_editor name="object_name">
+ 物件å稱
+ </line_editor>
+ <text name="note">
+ * Only blocks object text, not sounds
+ </text>
+ <button label="確定" name="OK"/>
+ <button label="å–消" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_nearby_chat.xml b/indra/newview/skins/default/xui/zh/floater_nearby_chat.xml
new file mode 100644
index 0000000000..38a5dab523
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_nearby_chat.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="nearby_chat" title="附近的èŠå¤©">
+ <check_box label="Translate chat" name="translate_chat_checkbox"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_notification.xml b/indra/newview/skins/default/xui/zh/floater_notification.xml
new file mode 100644
index 0000000000..1e0e207fb0
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_notification.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="notification" title="通知控制å°">
+ <text_editor name="payload">
+ 載入中...
+ </text_editor>
+ <combo_box label="回應" name="response"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_notifications_console.xml b/indra/newview/skins/default/xui/zh/floater_notifications_console.xml
new file mode 100644
index 0000000000..3478761b0b
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_notifications_console.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="notifications_console" title="通知控制å°">
+ <combo_box label="é¸æ“‡é€šçŸ¥é¡žåž‹" name="notification_types"/>
+ <button label="添加" name="add_notification"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_openobject.xml b/indra/newview/skins/default/xui/zh/floater_openobject.xml
new file mode 100644
index 0000000000..61ac3cb1fc
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_openobject.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="objectcontents" title="物件內容">
+ <text name="object_name">
+ [DESC]:
+ </text>
+ <button label="覆製到收ç´å€" label_selected="覆製到收ç´å€" name="copy_to_inventory_button"/>
+ <button label="覆製且穿上" label_selected="覆製且穿上" name="copy_and_wear_button"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_outfit_save_as.xml b/indra/newview/skins/default/xui/zh/floater_outfit_save_as.xml
new file mode 100644
index 0000000000..a557e1c2e3
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_outfit_save_as.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="modal container" title="儲存è£æ‰®">
+ <button label="儲存" label_selected="儲存" name="Save"/>
+ <button label="å–消" label_selected="å–消" name="Cancel"/>
+ <text name="Save item as:">
+ 儲存我正在穿的為新è£æ‰®ï¼š
+ </text>
+ <line_editor name="name ed">
+ [DESC] (新)
+ </line_editor>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_outgoing_call.xml b/indra/newview/skins/default/xui/zh/floater_outgoing_call.xml
new file mode 100644
index 0000000000..63da47f4de
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_outgoing_call.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="outgoing call" title="CALLING">
+ <floater.string name="lifetime">
+ 5
+ </floater.string>
+ <floater.string name="localchat">
+ 附近的語音èŠå¤©
+ </floater.string>
+ <floater.string name="anonymous">
+ 匿å
+ </floater.string>
+ <floater.string name="VoiceInviteP2P">
+ 通話中。
+ </floater.string>
+ <floater.string name="VoiceInviteAdHoc">
+ has joined a Voice Chat call with a conference chat.
+ </floater.string>
+ <text name="connecting">
+ Connecting to [CALLEE_NAME]
+ </text>
+ <text name="calling">
+ Calling [CALLEE_NAME]
+ </text>
+ <text name="noanswer">
+ 無應答,請ç¨å€™å†è©¦ã€‚
+ </text>
+ <text name="nearby">
+ You have been disconnected from [VOICE_CHANNEL_NAME]. [RECONNECT_NEARBY]
+ </text>
+ <text name="nearby_P2P_by_other">
+ Your call has ended. [RECONNECT_NEARBY]
+ </text>
+ <text name="nearby_P2P_by_agent">
+ You have ended the call. [RECONNECT_NEARBY]
+ </text>
+ <text name="leaving">
+ Leaving [CURRENT_CHAT].
+ </text>
+ <button label="å–消" label_selected="å–消" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_pay.xml b/indra/newview/skins/default/xui/zh/floater_pay.xml
new file mode 100644
index 0000000000..0a823cd82e
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_pay.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Give Money">
+ <string name="payee_group">
+ 支付群組
+ </string>
+ <string name="payee_resident">
+ 支付居民
+ </string>
+ <text name="payee_name">
+ Test Name That Is Extremely Long To Check Clipping
+ </text>
+ <button label="L$1" label_selected="L$1" name="fastpay 1"/>
+ <button label="L$5" label_selected="L$5" name="fastpay 5"/>
+ <button label="L$10" label_selected="L$10" name="fastpay 10"/>
+ <button label="L$20" label_selected="L$20" name="fastpay 20"/>
+ <text name="amount text">
+ 或,é¸æ“‡ä¸€å€‹é‡‘é¡ï¼š
+ </text>
+ <button label="支付" label_selected="支付" name="pay btn"/>
+ <button label="å–消" label_selected="å–消" name="cancel btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_pay_object.xml b/indra/newview/skins/default/xui/zh/floater_pay_object.xml
new file mode 100644
index 0000000000..39259524d7
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_pay_object.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Give Money">
+ <string name="payee_group">
+ 支付群組
+ </string>
+ <string name="payee_resident">
+ 支付居民
+ </string>
+ <text name="payee_name">
+ Ericacita Moostopolison
+ </text>
+ <text name="object_name_label">
+ 經由物件:
+ </text>
+ <icon name="icon_object" tool_tip="物件"/>
+ <text name="object_name_text">
+ My awesome object with a really damn long name
+ </text>
+ <button label="L$1" label_selected="L$1" name="fastpay 1"/>
+ <button label="L$5" label_selected="L$5" name="fastpay 5"/>
+ <button label="L$10" label_selected="L$10" name="fastpay 10"/>
+ <button label="L$20" label_selected="L$20" name="fastpay 20"/>
+ <text name="amount text">
+ 或者,é¸æ“‡ä¸€å€‹é‡‘é¡ï¼š
+ </text>
+ <button label="支付" label_selected="支付" name="pay btn"/>
+ <button label="å–消" label_selected="å–消" name="cancel btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_perm_prefs.xml b/indra/newview/skins/default/xui/zh/floater_perm_prefs.xml
new file mode 100644
index 0000000000..498848ee56
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_perm_prefs.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="perm prefs" title="é è¨­ä¸Šå‚³æ¬Šé™">
+ <panel label="權é™" name="permissions">
+ <check_box label="與群組分享" name="share_with_group"/>
+ <check_box label="å…許任何人覆製" name="everyone_copy"/>
+ <text name="NextOwnerLabel">
+ 下一個æ“有者å¯ä»¥ï¼š
+ </text>
+ <check_box label="修改" name="next_owner_modify"/>
+ <check_box label="覆製" name="next_owner_copy"/>
+ <check_box initial_value="true" label="轉售 / é€äºº" name="next_owner_transfer"/>
+ </panel>
+ <button label="確定" label_selected="確定" name="ok"/>
+ <button label="å–消" label_selected="å–消" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_post_process.xml b/indra/newview/skins/default/xui/zh/floater_post_process.xml
new file mode 100644
index 0000000000..0972c6dfa6
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_post_process.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Post-Process Floater" title="POST-PROCESS SETTINGS">
+ <tab_container name="Post-Process Tabs">
+ <panel label="Color Filter" name="wmiColorFilterPanel">
+ <check_box label="Enable" name="wmiColorFilterToggle"/>
+ <text name="wmiColorFilterBrightnessText">
+ Brightness
+ </text>
+ <text name="wmiColorFilterSaturationText">
+ Saturation
+ </text>
+ <text name="wmiColorFilterContrastText">
+ Contrast
+ </text>
+ <text name="wmiColorFilterBaseText">
+ Contrast Base Color
+ </text>
+ <slider label="R" name="wmiColorFilterBaseR"/>
+ <slider label="G" name="wmiColorFilterBaseG"/>
+ <slider label="B" name="wmiColorFilterBaseB"/>
+ <slider label="I" name="wmiColorFilterBaseI"/>
+ </panel>
+ <panel label="Night Vision" name="wmiNightVisionPanel">
+ <check_box label="Enable" name="wmiNightVisionToggle"/>
+ <text name="wmiNightVisionBrightMultText">
+ Light Amplification Multiple
+ </text>
+ <text name="wmiNightVisionNoiseSizeText">
+ Noise Size
+ </text>
+ <text name="wmiNightVisionNoiseStrengthText">
+ Noise Strength
+ </text>
+ </panel>
+ <panel label="Bloom" name="wmiBloomPanel">
+ <check_box label="Enable" name="wmiBloomToggle"/>
+ <text name="wmiBloomExtractText">
+ Luminosity Extraction
+ </text>
+ <text name="wmiBloomSizeText">
+ Bloom Size
+ </text>
+ <text name="wmiBloomStrengthText">
+ Bloom Strength
+ </text>
+ </panel>
+ <panel label="Extras" name="Extras">
+ <button label="LoadEffect" label_selected="LoadEffect" name="PPLoadEffect"/>
+ <button label="SaveEffect" label_selected="SaveEffect" name="PPSaveEffect"/>
+ <line_editor label="效果å稱" name="PPEffectNameEditor"/>
+ </panel>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_postcard.xml b/indra/newview/skins/default/xui/zh/floater_postcard.xml
new file mode 100644
index 0000000000..6f6b75f468
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_postcard.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Postcard" title="EMAIL SNAPSHOT">
+ <floater.string name="default_subject">
+ Postcard from [SECOND_LIFE].
+ </floater.string>
+ <floater.string name="default_message">
+ Check this out!
+ </floater.string>
+ <floater.string name="upload_message">
+ 傳é€ä¸­...
+ </floater.string>
+ <text name="to_label">
+ 收件人電å­éƒµä»¶åœ°å€ï¼š
+ </text>
+ <text name="from_label">
+ ä½ çš„é›»å­éƒµä»¶åœ°å€ï¼š
+ </text>
+ <text name="name_label">
+ ä½ çš„å稱:
+ </text>
+ <text name="subject_label">
+ 主旨:
+ </text>
+ <line_editor label="在此輸入你的主旨。" name="subject_form"/>
+ <text name="msg_label">
+ 訓æ¯ï¼š
+ </text>
+ <text_editor name="msg_form">
+ 在此輸入你的訊æ¯ã€‚
+ </text_editor>
+ <button label="å–消" name="cancel_btn"/>
+ <button label="é€å‡º" name="send_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_preferences.xml b/indra/newview/skins/default/xui/zh/floater_preferences.xml
new file mode 100644
index 0000000000..396a4893e0
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_preferences.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Preferences" title="å好設定">
+ <button label="確定" label_selected="確定" name="OK"/>
+ <button label="å–消" label_selected="å–消" name="Cancel"/>
+ <tab_container name="pref core">
+ <panel label="一般" name="general"/>
+ <panel label="圖形" name="display"/>
+ <panel label="è²éŸ³èˆ‡åª’é«”" name="audio"/>
+ <panel label="èŠå¤©" name="chat"/>
+ <panel label="移動與視角" name="move"/>
+ <panel label="通知" name="msgs"/>
+ <panel label="é¡è‰²" name="colors"/>
+ <panel label="éš±ç§" name="im"/>
+ <panel label="設定" name="input"/>
+ <panel label="進階" name="advanced1"/>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_preview_animation.xml b/indra/newview/skins/default/xui/zh/floater_preview_animation.xml
new file mode 100644
index 0000000000..c435ddc0bd
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_preview_animation.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="preview_anim">
+ <floater.string name="Title">
+ 動作: [NAME]
+ </floater.string>
+ <text name="desc txt">
+ æ述:
+ </text>
+ <button label="播放於虛擬世界" label_selected="åœæ­¢" name="Anim play btn" tool_tip="Play this animation so that others can see it"/>
+ <button label="播放於本地" label_selected="åœæ­¢" name="Anim audition btn" tool_tip="Play this animation so that only you can see it"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_preview_gesture.xml b/indra/newview/skins/default/xui/zh/floater_preview_gesture.xml
new file mode 100644
index 0000000000..ad49370423
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_preview_gesture.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="gesture_preview">
+ <floater.string name="step_anim">
+ Animation to play:
+ </floater.string>
+ <floater.string name="step_sound">
+ Sound to play:
+ </floater.string>
+ <floater.string name="step_chat">
+ Chat to say:
+ </floater.string>
+ <floater.string name="step_wait">
+ Wait:
+ </floater.string>
+ <floater.string name="stop_txt">
+ åœæ­¢
+ </floater.string>
+ <floater.string name="preview_txt">
+ é è¦½
+ </floater.string>
+ <floater.string name="none_text">
+ -- ç„¡ --
+ </floater.string>
+ <floater.string name="Title">
+ Gesture: [NAME]
+ </floater.string>
+ <text name="desc_label">
+ æ述:
+ </text>
+ <text name="trigger_label">
+ Trigger:
+ </text>
+ <text name="replace_text" tool_tip="Replace the trigger word(s) with these words. For example, trigger &apos;hello&apos; replace with &apos;howdy&apos; will turn the chat &apos;I wanted to say hello&apos; into &apos;I wanted to say howdy&apos; as well as playing the gesture!">
+ Replace with:
+ </text>
+ <line_editor name="replace_editor" tool_tip="Replace the trigger word(s) with these words. For example, trigger &apos;hello&apos; replace with &apos;howdy&apos; will turn the chat &apos;I wanted to say hello&apos; into &apos;I wanted to say howdy&apos; as well as playing the gesture"/>
+ <text name="key_label">
+ Shortcut Key:
+ </text>
+ <combo_box label="ç„¡" name="modifier_combo"/>
+ <combo_box label="ç„¡" name="key_combo"/>
+ <text name="library_label">
+ 資æºåº«ï¼š
+ </text>
+ <scroll_list name="library_list">
+ <scroll_list.rows name="action_animation" value="動作"/>
+ <scroll_list.rows name="action_sound" value="è²éŸ³"/>
+ <scroll_list.rows name="action_chat" value="èŠå¤©"/>
+ <scroll_list.rows name="action_wait" value="等待"/>
+ </scroll_list>
+ <button label="添加 &gt;&gt;" name="add_btn"/>
+ <text name="steps_label">
+ Steps:
+ </text>
+ <button label="Up" name="up_btn"/>
+ <button label="Down" name="down_btn"/>
+ <button label="移除" name="delete_btn"/>
+ <text name="options_text">
+ (é¸é …)
+ </text>
+ <radio_group name="animation_trigger_type">
+ <radio_item label="開始" name="start"/>
+ <radio_item label="åœæ­¢" name="stop"/>
+ </radio_group>
+ <check_box label="直到動作çµæŸã€‚" name="wait_anim_check"/>
+ <check_box label="time in seconds:" name="wait_time_check"/>
+ <text name="help_label">
+ All steps happen simultaneously, unless you add wait steps.
+ </text>
+ <check_box label="Active" name="active_check" tool_tip="Active gestures can be triggered by chatting their trigger phrases or pressing their hot keys. Gestures usually become inactive when there is a key binding conflict."/>
+ <button label="é è¦½" name="preview_btn"/>
+ <button label="儲存" name="save_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_preview_notecard.xml b/indra/newview/skins/default/xui/zh/floater_preview_notecard.xml
new file mode 100644
index 0000000000..9447939801
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_preview_notecard.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="preview notecard" title="記事å¡ï¼š">
+ <floater.string name="no_object">
+ 未發ç¾ç‰©ä»¶åŒ…å«æ­¤è¨˜äº‹å¡ã€‚
+ </floater.string>
+ <floater.string name="not_allowed">
+ 你並沒有權é™åŽ»å¯Ÿçœ‹æ­¤è¨˜äº‹å¡ã€‚
+ </floater.string>
+ <floater.string name="Title">
+ 記事å¡ï¼š [NAME]
+ </floater.string>
+ <text name="desc txt">
+ æ述:
+ </text>
+ <text_editor name="Notecard Editor">
+ 載入中...
+ </text_editor>
+ <button label="儲存" label_selected="儲存" name="Save"/>
+ <button label="刪除" label_selected="刪除" name="Delete"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_preview_sound.xml b/indra/newview/skins/default/xui/zh/floater_preview_sound.xml
new file mode 100644
index 0000000000..46844349de
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_preview_sound.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="preview_sound">
+ <floater.string name="Title">
+ è²éŸ³ï¼š [NAME]
+ </floater.string>
+ <text name="desc txt">
+ æ述:
+ </text>
+ <button label="播放於虛擬世界" label_selected="播放於虛擬世界" name="Sound play btn" tool_tip="Play this sound so that others can hear it"/>
+ <button label="播放於本地" label_selected="播放於本地" name="Sound audition btn" tool_tip="Play this sound so that only you can hear it"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_preview_texture.xml b/indra/newview/skins/default/xui/zh/floater_preview_texture.xml
new file mode 100644
index 0000000000..02e26cea24
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_preview_texture.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="preview_texture">
+ <floater.string name="Title">
+ æ質:[NAME]
+ </floater.string>
+ <floater.string name="Copy">
+ 覆製到收ç´å€
+ </floater.string>
+ <text name="desc txt">
+ æ述:
+ </text>
+ <text name="dimensions">
+ [WIDTH]px x [HEIGHT]px
+ </text>
+ <text name="aspect_ratio">
+ Preview aspect ratio
+ </text>
+ <combo_box name="combo_aspect_ratio" tool_tip="Preview at a fixed aspect ratio">
+ <combo_item name="Unconstrained">
+ Unconstrained
+ </combo_item>
+ <combo_item name="1:1" tool_tip="Group insignia or Real World profile">
+ 1:1
+ </combo_item>
+ <combo_item name="4:3" tool_tip="[SECOND_LIFE] 檔案">
+ 4:3
+ </combo_item>
+ <combo_item name="10:7" tool_tip="Classifieds and search listings, landmarks">
+ 10:7
+ </combo_item>
+ <combo_item name="3:2" tool_tip="關於土地">
+ 3:2
+ </combo_item>
+ <combo_item name="16:10">
+ 16:10
+ </combo_item>
+ <combo_item name="16:9" tool_tip="Profile picks">
+ 16:9
+ </combo_item>
+ <combo_item name="2:1">
+ 2:1
+ </combo_item>
+ </combo_box>
+ <button label="確定" name="Keep"/>
+ <button label="Discard" name="Discard"/>
+ <button label="å¦å­˜" name="save_tex_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_publish_classified.xml b/indra/newview/skins/default/xui/zh/floater_publish_classified.xml
new file mode 100644
index 0000000000..5f0ffea182
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_publish_classified.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="publish_classified" title="Publishing Classified">
+ <text name="explanation_text">
+ Your classified ad will run for one week from the date it is published.
+
+Remember, Classified fees are non-refundable.
+ </text>
+ <spinner label="價格: L$" name="price_for_listing" tool_tip="刊登費用。" value="50"/>
+ <button label="發布" name="publish_btn"/>
+ <button label="å–消" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_region_debug_console.xml b/indra/newview/skins/default/xui/zh/floater_region_debug_console.xml
new file mode 100644
index 0000000000..4ff2a3fc79
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_region_debug_console.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="region_debug_console" title="地å€é™¤éŒ¯"/>
diff --git a/indra/newview/skins/default/xui/zh/floater_region_info.xml b/indra/newview/skins/default/xui/zh/floater_region_info.xml
new file mode 100644
index 0000000000..0e4879f555
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_region_info.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="regioninfo" title="åœ°å€ / 領地"/>
diff --git a/indra/newview/skins/default/xui/zh/floater_report_abuse.xml b/indra/newview/skins/default/xui/zh/floater_report_abuse.xml
new file mode 100644
index 0000000000..436f5cdcc5
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_report_abuse.xml
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_report_abuse" title="舉報濫用">
+ <floater.string name="Screenshot">
+ å¿«ç…§
+ </floater.string>
+ <check_box label="使用這張快照" name="screen_check"/>
+ <text name="reporter_title">
+ 舉報者:
+ </text>
+ <text name="sim_title">
+ 地å€ï¼š
+ </text>
+ <text name="sim_field">
+ 地å€å稱
+ </text>
+ <text name="pos_title">
+ Position:
+ </text>
+ <text name="pos_field">
+ {128.1, 128.1, 15.4}
+ </text>
+ <text name="select_object_label">
+ Click the button, then the abusive object:
+ </text>
+ <button name="pick_btn" tool_tip="Object Picker - Identify an object as the subject of this report"/>
+ <text name="object_name_label">
+ 物件:
+ </text>
+ <text name="owner_name_label">
+ æ“有者:
+ </text>
+ <combo_box name="category_combo" tool_tip="Category -- select the category that best describes this report">
+ <combo_box.item label="é¸æ“‡é¡žåˆ¥" name="Select_category"/>
+ <combo_box.item label="Age &gt; Age play" name="Age__Age_play"/>
+ <combo_box.item label="Age &gt; Adult Resident on Teen Second Life" name="Age__Adult_resident_on_Teen_Second_Life"/>
+ <combo_box.item label="Age &gt; Underage Resident outside of Teen Second Life" name="Age__Underage_resident_outside_of_Teen_Second_Life"/>
+ <combo_box.item label="Assault &gt; Combat sandbox / unsafe area" name="Assault__Combat_sandbox___unsafe_area"/>
+ <combo_box.item label="Assault &gt; Safe area" name="Assault__Safe_area"/>
+ <combo_box.item label="Assault &gt; Weapons testing sandbox" name="Assault__Weapons_testing_sandbox"/>
+ <combo_box.item label="Commerce &gt; Failure to deliver product or service" name="Commerce__Failure_to_deliver_product_or_service"/>
+ <combo_box.item label="Disclosure &gt; Real world information" name="Disclosure__Real_world_information"/>
+ <combo_box.item label="Disclosure &gt; Remotely monitoring chat" name="Disclosure__Remotely_monitoring chat"/>
+ <combo_box.item label="Disclosure &gt; Second Life information/chat/IMs" name="Disclosure__Second_Life_information_chat_IMs"/>
+ <combo_box.item label="Disturbing the peace &gt; Unfair use of region resources" name="Disturbing_the_peace__Unfair_use_of_region_resources"/>
+ <combo_box.item label="Disturbing the peace &gt; Excessive scripted objects" name="Disturbing_the_peace__Excessive_scripted_objects"/>
+ <combo_box.item label="Disturbing the peace &gt; Object littering" name="Disturbing_the_peace__Object_littering"/>
+ <combo_box.item label="Disturbing the peace &gt; Repetitive spam" name="Disturbing_the_peace__Repetitive_spam"/>
+ <combo_box.item label="Disturbing the peace &gt; Unwanted advert spam" name="Disturbing_the_peace__Unwanted_advert_spam"/>
+ <combo_box.item label="Fraud &gt; L$" name="Fraud__L$"/>
+ <combo_box.item label="Fraud &gt; Land" name="Fraud__Land"/>
+ <combo_box.item label="Fraud &gt; Pyramid scheme or chain letter" name="Fraud__Pyramid_scheme_or_chain_letter"/>
+ <combo_box.item label="Fraud &gt; US$" name="Fraud__US$"/>
+ <combo_box.item label="Harassment &gt; Advert farms / visual spam" name="Harassment__Advert_farms___visual_spam"/>
+ <combo_box.item label="Harassment &gt; Defaming individuals or groups" name="Harassment__Defaming_individuals_or_groups"/>
+ <combo_box.item label="Harassment &gt; Impeding movement" name="Harassment__Impeding_movement"/>
+ <combo_box.item label="Harassment &gt; Sexual harassment" name="Harassment__Sexual_harassment"/>
+ <combo_box.item label="Harassment &gt; Solicting/inciting others to violate ToS" name="Harassment__Solicting_inciting_others_to_violate_ToS"/>
+ <combo_box.item label="Harassment &gt; Verbal abuse" name="Harassment__Verbal_abuse"/>
+ <combo_box.item label="Indecency &gt; Broadly offensive content or conduct" name="Indecency__Broadly_offensive_content_or_conduct"/>
+ <combo_box.item label="Indecency &gt; Inappropriate avatar name" name="Indecency__Inappropriate_avatar_name"/>
+ <combo_box.item label="Indecency &gt; Inappropriate content or conduct in a PG region" name="Indecency__Mature_content_in_PG_region"/>
+ <combo_box.item label="Indecency &gt; Inappropriate content or conduct in a Moderate region" name="Indecency__Inappropriate_content_in_Mature_region"/>
+ <combo_box.item label="Intellectual property infringement &gt; Content Removal" name="Intellectual_property_infringement_Content_Removal"/>
+ <combo_box.item label="Intellectual property infringement &gt; CopyBot or Permissions Exploit" name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit"/>
+ <combo_box.item label="Intolerance" name="Intolerance"/>
+ <combo_box.item label="Land &gt; Abuse of sandbox resources" name="Land__Abuse_of_sandbox_resources"/>
+ <combo_box.item label="Land &gt; Encroachment &gt; Objects/textures" name="Land__Encroachment__Objects_textures"/>
+ <combo_box.item label="Land &gt; Encroachment &gt; Particles" name="Land__Encroachment__Particles"/>
+ <combo_box.item label="Land &gt; Encroachment &gt; Trees/plants" name="Land__Encroachment__Trees_plants"/>
+ <combo_box.item label="Wagering/gambling" name="Wagering_gambling"/>
+ <combo_box.item label="其他" name="Other"/>
+ </combo_box>
+ <text name="abuser_name_title">
+ 濫用者å稱:
+ </text>
+ <button label="é¸æ“‡" name="select_abuser" tool_tip="Select the name of the abuser from a list"/>
+ <text name="abuser_name_title2">
+ 濫用ä½ç½®ï¼š
+ </text>
+ <text name="sum_title">
+ 摘è¦ï¼š
+ </text>
+ <text name="dscr_title">
+ 細節:
+ </text>
+ <text name="bug_aviso">
+ Please be as specific as possible
+ </text>
+ <text name="incomplete_title">
+ * Incomplete reports won&apos;t be investigated
+ </text>
+ <button label="舉報濫用" label_selected="舉報濫用" name="send_btn"/>
+ <button label="å–消" label_selected="å–消" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_script_debug.xml b/indra/newview/skins/default/xui/zh/floater_script_debug.xml
new file mode 100644
index 0000000000..5b3500c018
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_script_debug.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<multi_floater name="script debug floater" title="腳本 警告/錯誤"/>
diff --git a/indra/newview/skins/default/xui/zh/floater_script_debug_panel.xml b/indra/newview/skins/default/xui/zh/floater_script_debug_panel.xml
new file mode 100644
index 0000000000..e70a30fa24
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_script_debug_panel.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="script" short_title="[ALL SCRIPTS]" title="[ALL SCRIPTS]"/>
diff --git a/indra/newview/skins/default/xui/zh/floater_script_limits.xml b/indra/newview/skins/default/xui/zh/floater_script_limits.xml
new file mode 100644
index 0000000000..7cd2c8e6c6
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_script_limits.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="scriptlimits" title="腳本資訊"/>
diff --git a/indra/newview/skins/default/xui/zh/floater_script_preview.xml b/indra/newview/skins/default/xui/zh/floater_script_preview.xml
new file mode 100644
index 0000000000..c3d05402c0
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_script_preview.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="preview lsl text" title="SCRIPT: ROTATION SCRIPT">
+ <floater.string name="Title">
+ 腳本:[NAME]
+ </floater.string>
+ <text name="desc txt">
+ æ述:
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_script_queue.xml b/indra/newview/skins/default/xui/zh/floater_script_queue.xml
new file mode 100644
index 0000000000..ff02946d86
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_script_queue.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="queue" title="RESET PROGRESS">
+ <floater.string name="Starting">
+ Starting [START] of [COUNT] items.
+ </floater.string>
+ <floater.string name="Done">
+ Done.
+ </floater.string>
+ <floater.string name="Resetting">
+ é‡è¨­ä¸­
+ </floater.string>
+ <floater.string name="Running">
+ 執行中
+ </floater.string>
+ <floater.string name="NotRunning">
+ éžåŸ·è¡Œä¸­
+ </floater.string>
+ <button label="關閉" label_selected="關閉" name="close"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_script_search.xml b/indra/newview/skins/default/xui/zh/floater_script_search.xml
new file mode 100644
index 0000000000..400ef4be81
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_script_search.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="script search" title="腳本æœå°‹">
+ <check_box label="Case Insensitive" name="case_text"/>
+ <button label="æœå°‹" label_selected="æœå°‹" name="search_btn"/>
+ <button label="å–代" label_selected="å–代" name="replace_btn"/>
+ <button label="全部å–代" label_selected="全部å–代" name="replace_all_btn"/>
+ <text name="txt">
+ æœå°‹
+ </text>
+ <text name="txt2">
+ å–代
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_search.xml b/indra/newview/skins/default/xui/zh/floater_search.xml
new file mode 100644
index 0000000000..bb693b7a70
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_search.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_search" title="尋找">
+ <floater.string name="loading_text">
+ 載入中...
+ </floater.string>
+ <floater.string name="done_text">
+ Done
+ </floater.string>
+ <layout_stack name="stack1">
+ <layout_panel name="browser_layout">
+ <text name="refresh_search">
+ Redo search to reflect current God level
+ </text>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_select_key.xml b/indra/newview/skins/default/xui/zh/floater_select_key.xml
new file mode 100644
index 0000000000..c1661635f1
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_select_key.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="modal container">
+ <text name="Save item as:">
+ Press a key to set your Speak button trigger.
+ </text>
+ <button label="å–消" label_selected="å–消" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_sell_land.xml b/indra/newview/skins/default/xui/zh/floater_sell_land.xml
new file mode 100644
index 0000000000..19580c99a1
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_sell_land.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="sell land" title="出售土地">
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text name="info_parcel_label">
+ 地段:
+ </text>
+ <text name="info_parcel">
+ 地段å稱
+ </text>
+ <text name="info_size_label">
+ 尺寸:
+ </text>
+ <text name="info_size">
+ [AREA] m²
+ </text>
+ <text name="info_action">
+ To sell this parcel:
+ </text>
+ <text name="price_label">
+ 1. Set a price:
+ </text>
+ <text name="price_text">
+ Choose an appropriate price.
+ </text>
+ <text name="price_ld">
+ L$
+ </text>
+ <line_editor name="price">
+ 0
+ </line_editor>
+ <text name="price_per_m">
+ (L$[PER_METER] per m²)
+ </text>
+ <text name="sell_to_label">
+ 2. Sell the land to:
+ </text>
+ <text name="sell_to_text">
+ Choose whether to sell to anyone or a particular buyer.
+ </text>
+ <combo_box name="sell_to">
+ <combo_box.item label="- é¸æ“‡ä¸€å€‹ -" name="--selectone--"/>
+ <combo_box.item label="任何人" name="Anyone"/>
+ <combo_box.item label="指定人:" name="Specificuser:"/>
+ </combo_box>
+ <button label="é¸æ“‡" name="sell_to_select_agent"/>
+ <text name="sell_objects_label">
+ 3. Sell the objects with the land?
+ </text>
+ <text name="sell_objects_text">
+ Land owner&apos;s transferable objects on parcel will change ownership.
+ </text>
+ <radio_group name="sell_objects">
+ <radio_item label="No, keep ownership of objects" name="no"/>
+ <radio_item label="Yes, sell objects with land" name="yes"/>
+ </radio_group>
+ <button label="顯示物件" name="show_objects"/>
+ <text name="nag_message_label">
+ REMEMBER: All sales are final.
+ </text>
+ <button label="Set Land For Sale" name="sell_btn"/>
+ <button label="å–消" name="cancel_btn"/>
+ </panel>
+ </scroll_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_settings_debug.xml b/indra/newview/skins/default/xui/zh/floater_settings_debug.xml
new file mode 100644
index 0000000000..56a31bc292
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_settings_debug.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="settings_debug" title="除錯設定">
+ <radio_group name="boolean_combo">
+ <radio_item label="TRUE" name="TRUE" value="true"/>
+ <radio_item label="FALSE" name="FALSE" value=""/>
+ </radio_group>
+ <color_swatch label="é¡è‰²" name="val_color_swatch"/>
+ <spinner label="x" name="val_spinner_1"/>
+ <spinner label="x" name="val_spinner_2"/>
+ <spinner label="x" name="val_spinner_3"/>
+ <spinner label="x" name="val_spinner_4"/>
+ <button label="回復至é è¨­å€¼" name="default_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_snapshot.xml b/indra/newview/skins/default/xui/zh/floater_snapshot.xml
new file mode 100644
index 0000000000..9edc19969f
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_snapshot.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Snapshot" title="SNAPSHOT PREVIEW">
+ <floater.string name="unknown">
+ 未知
+ </floater.string>
+ <radio_group label="Snapshot type" name="snapshot_type_radio">
+ <radio_item label="Email" name="postcard"/>
+ <radio_item label="我的收ç´å€ï¼ˆL$[AMOUNT])" name="texture"/>
+ <radio_item label="Save to my computer" name="local"/>
+ </radio_group>
+ <text name="file_size_label">
+ [SIZE] KB
+ </text>
+ <button label="é€å‡º" name="send_btn"/>
+ <button label="儲存(L$[AMOUNT])" name="upload_btn"/>
+ <flyout_button label="儲存" name="save_btn" tool_tip="儲存圖åƒåˆ°æª”案">
+ <flyout_button.item label="儲存" name="save_item"/>
+ <flyout_button.item label="å¦å­˜..." name="saveas_item"/>
+ </flyout_button>
+ <button label="更多" name="more_btn" tool_tip="進階é¸é …"/>
+ <button label="æ›´å°‘" name="less_btn" tool_tip="進階é¸é …"/>
+ <button label="å–消" name="discard_btn"/>
+ <text name="type_label2">
+ 尺寸
+ </text>
+ <text name="format_label">
+ Format
+ </text>
+ <combo_box label="Resolution" name="postcard_size_combo">
+ <combo_box.item label="ç›®å‰è¦–窗" name="CurrentWindow"/>
+ <combo_box.item label="640x480" name="640x480"/>
+ <combo_box.item label="800x600" name="800x600"/>
+ <combo_box.item label="1024x768" name="1024x768"/>
+ <combo_box.item label="自訂" name="Custom"/>
+ </combo_box>
+ <combo_box label="Resolution" name="texture_size_combo">
+ <combo_box.item label="ç›®å‰è¦–窗" name="CurrentWindow"/>
+ <combo_box.item label="Small (128x128)" name="Small(128x128)"/>
+ <combo_box.item label="Medium (256x256)" name="Medium(256x256)"/>
+ <combo_box.item label="Large (512x512)" name="Large(512x512)"/>
+ <combo_box.item label="自訂" name="Custom"/>
+ </combo_box>
+ <combo_box label="Resolution" name="local_size_combo">
+ <combo_box.item label="ç›®å‰è¦–窗" name="CurrentWindow"/>
+ <combo_box.item label="320x240" name="320x240"/>
+ <combo_box.item label="640x480" name="640x480"/>
+ <combo_box.item label="800x600" name="800x600"/>
+ <combo_box.item label="1024x768" name="1024x768"/>
+ <combo_box.item label="1280x1024" name="1280x1024"/>
+ <combo_box.item label="1600x1200" name="1600x1200"/>
+ <combo_box.item label="Custom" name="Custom"/>
+ </combo_box>
+ <combo_box label="Format" name="local_format_combo">
+ <combo_box.item label="PNG" name="PNG"/>
+ <combo_box.item label="JPEG" name="JPEG"/>
+ <combo_box.item label="BMP" name="BMP"/>
+ </combo_box>
+ <spinner label="Width" name="snapshot_width"/>
+ <spinner label="Height" name="snapshot_height"/>
+ <check_box label="Constrain proportions" name="keep_aspect_check"/>
+ <slider label="圖åƒå“質" name="image_quality_slider"/>
+ <text name="layer_type_label">
+ Capture:
+ </text>
+ <combo_box label="圖層" name="layer_types">
+ <combo_box.item label="Colors" name="Colors"/>
+ <combo_box.item label="Depth" name="Depth"/>
+ </combo_box>
+ <check_box label="Interface" name="ui_check"/>
+ <check_box label="HUDs" name="hud_check"/>
+ <check_box label="Keep open after saving" name="keep_open_check"/>
+ <check_box label="å‡çµæ¡†æž¶ï¼ˆå…¨èž¢å¹•ï¼‰" name="freeze_frame_check"/>
+ <check_box label="Auto-refresh" name="auto_snapshot_check"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_sound_preview.xml b/indra/newview/skins/default/xui/zh/floater_sound_preview.xml
new file mode 100644
index 0000000000..c942ba1cfb
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_sound_preview.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Sound Preview" title="SOUND.WAV">
+ <text name="name_label">
+ å稱:
+ </text>
+ <text name="description_label">
+ æ述:
+ </text>
+ <button label="上傳(L$[AMOUNT])" name="ok_btn"/>
+ <button label="å–消" label_selected="å–消" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_stats.xml b/indra/newview/skins/default/xui/zh/floater_stats.xml
new file mode 100644
index 0000000000..582572d0e2
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_stats.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Statistics" title="統計">
+ <scroll_container name="statistics_scroll">
+ <container_view name="statistics_view">
+ <stat_view label="基本" name="basic">
+ <stat_bar label="FPS" name="fps"/>
+ <stat_bar label="頻寬" name="bandwidth"/>
+ <stat_bar label="å°åŒ…æ失" name="packet_loss"/>
+ <stat_bar label="Ping Sim" name="ping"/>
+ </stat_view>
+ <stat_view label="進階" name="advanced">
+ <stat_view label="Render" name="render">
+ <stat_bar label="KTris Drawn" name="ktrisframe"/>
+ <stat_bar label="KTris Drawn" name="ktrissec"/>
+ <stat_bar label="物件總計" name="objs"/>
+ <stat_bar label="新物件" name="newobjs"/>
+ </stat_view>
+ <stat_view label="æ質" name="texture">
+ <stat_bar label="計數" name="numimagesstat"/>
+ <stat_bar label="Raw Count" name="numrawimagesstat"/>
+ <stat_bar label="GL Mem" name="gltexmemstat"/>
+ <stat_bar label="Formatted Mem" name="formattedmemstat"/>
+ <stat_bar label="Raw Mem" name="rawmemstat"/>
+ <stat_bar label="Bound Mem" name="glboundmemstat"/>
+ </stat_view>
+ <stat_view label="網路" name="network">
+ <stat_bar label="Packets In" name="packetsinstat"/>
+ <stat_bar label="Packets Out" name="packetsoutstat"/>
+ <stat_bar label="物件" name="objectkbitstat"/>
+ <stat_bar label="æ質" name="texturekbitstat"/>
+ <stat_bar label="資產" name="assetkbitstat"/>
+ <stat_bar label="Layers" name="layerskbitstat"/>
+ <stat_bar label="Actual In" name="actualinkbitstat"/>
+ <stat_bar label="Actual Out" name="actualoutkbitstat"/>
+ <stat_bar label="VFS Pending Ops" name="vfspendingoperations"/>
+ </stat_view>
+ </stat_view>
+ <stat_view label="模擬器" name="sim">
+ <stat_bar label="Time Dilation" name="simtimedilation"/>
+ <stat_bar label="Sim FPS" name="simfps"/>
+ <stat_bar label="Physics FPS" name="simphysicsfps"/>
+ <stat_view label="Physics Details" name="physicsdetail">
+ <stat_bar label="Pinned Objects" name="physicspinnedtasks"/>
+ <stat_bar label="Low LOD Objects" name="physicslodtasks"/>
+ <stat_bar label="記憶體é…ç½®" name="physicsmemoryallocated"/>
+ </stat_view>
+ <stat_bar label="Agent Updates/Sec" name="simagentups"/>
+ <stat_bar label="Main Agents" name="simmainagents"/>
+ <stat_bar label="Child Agents" name="simchildagents"/>
+ <stat_bar label="物件" name="simobjects"/>
+ <stat_bar label="Active Objects" name="simactiveobjects"/>
+ <stat_bar label="Active Scripts" name="simactivescripts"/>
+ <stat_bar label="腳本事件" name="simscripteps"/>
+ <stat_bar label="進入å°åŒ…" name="siminpps"/>
+ <stat_bar label="出去å°åŒ…" name="simoutpps"/>
+ <stat_bar label="擱置下載" name="simpendingdownloads"/>
+ <stat_bar label="擱置上傳" name="simpendinguploads"/>
+ <stat_bar label="Total Unacked Bytes" name="simtotalunackedbytes"/>
+ <stat_view label="Time (ms)" name="simperf">
+ <stat_bar label="Total Frame Time" name="simframemsec"/>
+ <stat_bar label="Net Time" name="simnetmsec"/>
+ <stat_bar label="Physics Time" name="simsimphysicsmsec"/>
+ <stat_bar label="Simulation Time" name="simsimothermsec"/>
+ <stat_bar label="Agent Time" name="simagentmsec"/>
+ <stat_bar label="Images Time" name="simimagesmsec"/>
+ <stat_bar label="腳本時間" name="simscriptmsec"/>
+ </stat_view>
+ </stat_view>
+ </container_view>
+ </scroll_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_sys_well.xml b/indra/newview/skins/default/xui/zh/floater_sys_well.xml
new file mode 100644
index 0000000000..fd27e944ac
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_sys_well.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="sys_well_window" title="通知">
+ <string name="title_im_well_window">
+ CONVERSATIONS
+ </string>
+ <string name="title_notification_well_window">
+ 通知
+ </string>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_telehub.xml b/indra/newview/skins/default/xui/zh/floater_telehub.xml
new file mode 100644
index 0000000000..b4c9f3ab29
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_telehub.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Explicit left edge to avoid overlapping build tools -->
+<floater name="telehub" title="TELEHUB">
+ <text name="status_text_connected">
+ Telehub connected to object [OBJECT]
+ </text>
+ <text name="status_text_not_connected">
+ No telehub connected.
+ </text>
+ <text name="help_text_connected">
+ To remove, click Disconnect.
+ </text>
+ <text name="help_text_not_connected">
+ Select object and click Connect Telehub.
+ </text>
+ <button label="Connect Telehub" name="connect_btn"/>
+ <button label="Disconnect" name="disconnect_btn"/>
+ <text name="spawn_points_text">
+ Spawn Points (positions, not objects):
+ </text>
+ <button label="Add Spawn" name="add_spawn_point_btn"/>
+ <button label="Remove Spawn" name="remove_spawn_point_btn"/>
+ <text name="spawn_point_help">
+ Select object and click &quot;Add Spawn&quot; to specify position.
+You can then move or delete the object.
+Positions are relative to the telehub center.
+Select an item in list to highlight it inworld.
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/zh/floater_texture_ctrl.xml
new file mode 100644
index 0000000000..01586ac153
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_texture_ctrl.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="texture picker" title="PICK: TEXTURE">
+ <floater.string name="choose_picture">
+ 點擊以挑é¸åœ–åƒ
+ </floater.string>
+ <floater.string name="pick title">
+ Pick:
+ </floater.string>
+ <text name="Multiple">
+ Multiple textures
+ </text>
+ <text name="unknown">
+ 尺寸:[DIMENSIONS]
+ </text>
+ <button label="é è¨­" label_selected="é è¨­" name="Default"/>
+ <button label="ç„¡" label_selected="ç„¡" name="None"/>
+ <button label="Blank" label_selected="Blank" name="Blank"/>
+ <check_box initial_value="true" label="ç«‹å³å¥—用" name="apply_immediate_check"/>
+ <filter_editor label="æ質éŽæ¿¾å™¨" name="inventory search editor"/>
+ <check_box initial_value="false" label="顯示資料夾" name="show_folders_check"/>
+ <button label="確定" label_selected="確定" name="Select"/>
+ <button label="å–消" label_selected="å–消" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_tools.xml b/indra/newview/skins/default/xui/zh/floater_tools.xml
new file mode 100644
index 0000000000..2db98eb3d7
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_tools.xml
@@ -0,0 +1,499 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="toolbox floater" short_title="建造工具">
+ <floater.string name="status_rotate">
+ Drag colored bands to rotate object
+ </floater.string>
+ <floater.string name="status_scale">
+ Click and drag to stretch selected side
+ </floater.string>
+ <floater.string name="status_move">
+ Drag to move, shift-drag to copy
+ </floater.string>
+ <floater.string name="status_modifyland">
+ Click and hold to modify land
+ </floater.string>
+ <floater.string name="status_camera">
+ Click and drag to move camera
+ </floater.string>
+ <floater.string name="status_grab">
+ Drag to move, Ctrl to lift, Ctrl+Shift to rotate
+ </floater.string>
+ <floater.string name="status_place">
+ Click inworld to build
+ </floater.string>
+ <floater.string name="status_selectland">
+ Click and drag to select land
+ </floater.string>
+ <floater.string name="grid_screen_text">
+ Screen
+ </floater.string>
+ <floater.string name="grid_local_text">
+ Local
+ </floater.string>
+ <floater.string name="grid_world_text">
+ World
+ </floater.string>
+ <floater.string name="grid_reference_text">
+ Reference
+ </floater.string>
+ <floater.string name="grid_attachment_text">
+ Attachment
+ </floater.string>
+ <button name="button focus" tool_tip="èšç„¦"/>
+ <button name="button move" tool_tip="移動"/>
+ <button name="button edit" tool_tip="編輯"/>
+ <button name="button create" tool_tip="創造"/>
+ <button name="button land" tool_tip="土地"/>
+ <text name="text status">
+ Drag to move, shift-drag to copy
+ </text>
+ <radio_group name="focus_radio_group">
+ <radio_item label="縮放" name="radio zoom"/>
+ <radio_item label="環繞(Ctrl)" name="radio orbit"/>
+ <radio_item label="平移(Ctrl+Shift)" name="radio pan"/>
+ </radio_group>
+ <slider_bar initial_value="0.125" name="slider zoom"/>
+ <radio_group name="move_radio_group">
+ <radio_item label="移動" name="radio move"/>
+ <radio_item label="舉起(Ctrl)" name="radio lift"/>
+ <radio_item label="Spin (Ctrl+Shift)" name="radio spin"/>
+ </radio_group>
+ <radio_group name="edit_radio_group">
+ <radio_item label="移動" name="radio position"/>
+ <radio_item label="旋轉(Ctrl)" name="radio rotate"/>
+ <radio_item label="伸展(Ctrl+Shift)" name="radio stretch"/>
+ <radio_item label="é¸æ“‡é¢" name="radio select face"/>
+ </radio_group>
+ <check_box label="編輯è¯çµéƒ¨åˆ†" name="checkbox edit linked parts"/>
+ <button label="è¯çµ" name="link_btn"/>
+ <button label="å–消è¯çµ" name="unlink_btn"/>
+ <text name="RenderingCost" tool_tip="Shows the rendering cost calculated for this object">
+ þ: [COUNT]
+ </text>
+ <text label="åŒæ™‚伸展兩å´" name="checkbox uniform label">
+ åŒæ™‚伸展兩å´
+ </text>
+ <check_box initial_value="true" label="伸展æ質" name="checkbox stretch textures"/>
+ <check_box initial_value="true" label="貼齊格線" name="checkbox snap to grid"/>
+ <combo_box name="combobox grid mode" tool_tip="é¸æ“‡ç‰©ä»¶å®šä½åƒè€ƒçš„格線尺度類型">
+ <combo_box.item label="世界格線" name="World"/>
+ <combo_box.item label="地方格線" name="Local"/>
+ <combo_box.item label="åƒè€ƒæ ¼ç·š" name="Reference"/>
+ </combo_box>
+ <button name="Options..." tool_tip="察看更多格線é¸é …"/>
+ <button name="ToolCube" tool_tip="Cube"/>
+ <button name="ToolPrism" tool_tip="Prism"/>
+ <button name="ToolPyramid" tool_tip="Pyramid"/>
+ <button name="ToolTetrahedron" tool_tip="Tetrahedron"/>
+ <button name="ToolCylinder" tool_tip="Cylinder"/>
+ <button name="ToolHemiCylinder" tool_tip="Hemicylinder"/>
+ <button name="ToolCone" tool_tip="Cone"/>
+ <button name="ToolHemiCone" tool_tip="Hemicone"/>
+ <button name="ToolSphere" tool_tip="Sphere"/>
+ <button name="ToolHemiSphere" tool_tip="Hemisphere"/>
+ <button name="ToolTorus" tool_tip="Torus"/>
+ <button name="ToolTube" tool_tip="Tube"/>
+ <button name="ToolRing" tool_tip="Ring"/>
+ <button name="ToolTree" tool_tip="Tree"/>
+ <button name="ToolGrass" tool_tip="Grass"/>
+ <check_box label="ä¿æŒå·²é¸æ“‡çš„工具" name="checkbox sticky"/>
+ <check_box label="覆製é¸æ“‡" name="checkbox copy selection"/>
+ <check_box initial_value="true" label="Center Copy" name="checkbox copy centers"/>
+ <check_box label="Rotate Copy" name="checkbox copy rotates"/>
+ <radio_group name="land_radio_group">
+ <radio_item label="é¸æ“‡åœŸåœ°" name="radio select land"/>
+ <radio_item label="攤平" name="radio flatten"/>
+ <radio_item label="æ高" name="radio raise"/>
+ <radio_item label="é™ä½Ž" name="radio lower"/>
+ <radio_item label="平滑" name="radio smooth"/>
+ <radio_item label="ç²—ç³™" name="radio noise"/>
+ <radio_item label="還原" name="radio revert"/>
+ </radio_group>
+ <text name="Bulldozer:">
+ 推土機:
+ </text>
+ <text name="Dozer Size:">
+ 尺寸
+ </text>
+ <slider_bar initial_value="2.0" name="slider brush size"/>
+ <text name="Strength:">
+ 力é“
+ </text>
+ <slider_bar initial_value="0.00" name="slider force"/>
+ <button label="套用" label_selected="套用" name="button apply to selection" tool_tip="修改所é¸æ“‡çš„土地"/>
+ <text name="obj_count">
+ 物件: [COUNT]
+ </text>
+ <text name="prim_count">
+ 幾何元件: [COUNT]
+ </text>
+ <tab_container name="Object Info Tabs">
+ <panel label="一般" name="General">
+ <panel.string name="text deed continued">
+ 讓渡
+ </panel.string>
+ <panel.string name="text deed">
+ 讓渡
+ </panel.string>
+ <panel.string name="text modify info 1">
+ 你能修改這個物件
+ </panel.string>
+ <panel.string name="text modify info 2">
+ 你能修改這些物件
+ </panel.string>
+ <panel.string name="text modify info 3">
+ ä½ ä¸èƒ½ä¿®æ”¹é€™å€‹ç‰©ä»¶
+ </panel.string>
+ <panel.string name="text modify info 4">
+ ä½ ä¸èƒ½ä¿®æ”¹é€™äº›ç‰©ä»¶
+ </panel.string>
+ <panel.string name="text modify warning">
+ ä½ å¿…é ˆé¸å–整個物件以設定權é™
+ </panel.string>
+ <panel.string name="Cost Default">
+ 價格: L$
+ </panel.string>
+ <panel.string name="Cost Total">
+ 總價: L$
+ </panel.string>
+ <panel.string name="Cost Per Unit">
+ 單價æ¯å€‹ï¼š L$
+ </panel.string>
+ <panel.string name="Cost Mixed">
+ Mixed Price
+ </panel.string>
+ <panel.string name="Sale Mixed">
+ Mixed Sale
+ </panel.string>
+ <text name="Name:">
+ å稱:
+ </text>
+ <text name="Description:">
+ æ述:
+ </text>
+ <text name="Creator:">
+ 創造者:
+ </text>
+ <text name="Owner:">
+ æ“有者:
+ </text>
+ <text name="Group:">
+ 群組:
+ </text>
+ <name_box initial_value="載入中..." name="Group Name Proxy"/>
+ <button name="button set group" tool_tip="é¸æ“‡ä¸€å€‹ç¾¤çµ„以分享這物件權é™"/>
+ <check_box label="分享" name="checkbox share with group" tool_tip="Allow all members of the set group to share your modify permissions for this object. You must Deed to enable role restrictions."/>
+ <button label="讓渡" label_selected="讓渡" name="button deed" tool_tip="Deeding gives this item away with next owner permissions. Group shared objects can be deeded by a group officer."/>
+ <text name="label click action">
+ 點擊以:
+ </text>
+ <combo_box name="clickaction">
+ <combo_box.item label="觸碰(é è¨­ï¼‰" name="Touch/grab(default)"/>
+ <combo_box.item label="å在物件上" name="Sitonobject"/>
+ <combo_box.item label="購買物件" name="Buyobject"/>
+ <combo_box.item label="支付物件" name="Payobject"/>
+ <combo_box.item label="é–‹å•Ÿ" name="Open"/>
+ <combo_box.item label="縮放" name="Zoom"/>
+ </combo_box>
+ <check_box label="出售:" name="checkbox for sale"/>
+ <combo_box name="sale type">
+ <combo_box.item label="副本" name="Copy"/>
+ <combo_box.item label="內容" name="Contents"/>
+ <combo_box.item label="原件" name="Original"/>
+ </combo_box>
+ <spinner label="價格: L$" name="Edit Cost"/>
+ <check_box label="顯示在æœå°‹ä¸­" name="search_check" tool_tip="讓其他人å¯ä»¥åœ¨æœå°‹çµæžœä¸­çœ‹åˆ°é€™ç‰©ä»¶"/>
+ <panel name="perms_build">
+ <text name="perm_modify">
+ ä½ å¯ä»¥ä¿®æ”¹é€™å€‹ç‰©ä»¶
+ </text>
+ <text name="Anyone can:">
+ 任何人:
+ </text>
+ <check_box label="移動" name="checkbox allow everyone move"/>
+ <check_box label="覆製" name="checkbox allow everyone copy"/>
+ <text name="Next owner can:">
+ 下一個æ“有者:
+ </text>
+ <check_box label="修改" name="checkbox next owner can modify"/>
+ <check_box label="覆製" name="checkbox next owner can copy"/>
+ <check_box label="轉移" name="checkbox next owner can transfer" tool_tip="下一個æ“有者å¯ä»¥é€äººæˆ–轉售這個物件"/>
+ <text name="B:">
+ B:
+ </text>
+ <text name="O:">
+ O:
+ </text>
+ <text name="G:">
+ G:
+ </text>
+ <text name="E:">
+ E:
+ </text>
+ <text name="N:">
+ N:
+ </text>
+ <text name="F:">
+ F:
+ </text>
+ </panel>
+ </panel>
+ <panel label="物件" name="Object">
+ <check_box label="鎖定" name="checkbox locked" tool_tip="é é˜²ç‰©ä»¶è¢«ç§»å‹•æˆ–刪除,最常使用的狀æ³æ˜¯åœ¨å»ºé€ éŽç¨‹ä¸­é¿å…被æ„外的編輯。"/>
+ <check_box label="物ç†æ€§" name="Physical Checkbox Ctrl" tool_tip="å…許物件被推撞與å—é‡åŠ›å½±éŸ¿"/>
+ <check_box label="暫時性" name="Temporary Checkbox Ctrl" tool_tip="使物件在建造後的一分é˜è‡ªå‹•åˆªé™¤"/>
+ <check_box label="幻影性" name="Phantom Checkbox Ctrl" tool_tip="使物件ä¸æœƒèˆ‡å…¶ä»–物件或化身產生碰撞"/>
+ <text name="label position">
+ ä½ç½®ï¼ˆå…¬å°ºï¼‰
+ </text>
+ <spinner label="X" name="Pos X"/>
+ <spinner label="Y" name="Pos Y"/>
+ <spinner label="Z" name="Pos Z"/>
+ <text name="label size">
+ 尺寸(公尺)
+ </text>
+ <spinner label="X" name="Scale X"/>
+ <spinner label="Y" name="Scale Y"/>
+ <spinner label="Z" name="Scale Z"/>
+ <text name="label rotation">
+ 旋轉(角度)
+ </text>
+ <spinner label="X" name="Rot X"/>
+ <spinner label="Y" name="Rot Y"/>
+ <spinner label="Z" name="Rot Z"/>
+ <combo_box name="comboBaseType">
+ <combo_box.item label="Box" name="Box"/>
+ <combo_box.item label="Cylinder" name="Cylinder"/>
+ <combo_box.item label="Prism" name="Prism"/>
+ <combo_box.item label="Sphere" name="Sphere"/>
+ <combo_box.item label="Torus" name="Torus"/>
+ <combo_box.item label="Tube" name="Tube"/>
+ <combo_box.item label="Ring" name="Ring"/>
+ <combo_box.item label="Sculpted" name="Sculpted"/>
+ </combo_box>
+ <combo_box name="material">
+ <combo_box.item label="石頭" name="Stone"/>
+ <combo_box.item label="金屬" name="Metal"/>
+ <combo_box.item label="玻璃" name="Glass"/>
+ <combo_box.item label="木頭" name="Wood"/>
+ <combo_box.item label="肌肉" name="Flesh"/>
+ <combo_box.item label="塑膠" name="Plastic"/>
+ <combo_box.item label="橡膠" name="Rubber"/>
+ </combo_box>
+ <text name="text cut">
+ Path Cut (begin/end)
+ </text>
+ <spinner label="B" name="cut begin"/>
+ <spinner label="E" name="cut end"/>
+ <text name="text hollow">
+ 中空
+ </text>
+ <text name="text skew">
+ Skew
+ </text>
+ <text name="Hollow Shape">
+ 中空形狀
+ </text>
+ <combo_box name="hole">
+ <combo_box.item label="é è¨­" name="Default"/>
+ <combo_box.item label="Circle" name="Circle"/>
+ <combo_box.item label="Square" name="Square"/>
+ <combo_box.item label="Triangle" name="Triangle"/>
+ </combo_box>
+ <text name="text twist">
+ Twist (begin/end)
+ </text>
+ <spinner label="B" name="Twist Begin"/>
+ <spinner label="E" name="Twist End"/>
+ <text name="scale_taper">
+ Taper
+ </text>
+ <text name="scale_hole">
+ 洞尺寸
+ </text>
+ <spinner label="X" name="Taper Scale X"/>
+ <spinner label="Y" name="Taper Scale Y"/>
+ <text name="text topshear">
+ Top Shear
+ </text>
+ <spinner label="X" name="Shear X"/>
+ <spinner label="Y" name="Shear Y"/>
+ <text name="advanced_cut">
+ Profile Cut (begin/end)
+ </text>
+ <text name="advanced_dimple">
+ Dimple (begin/end)
+ </text>
+ <text name="advanced_slice">
+ Slice (begin/end)
+ </text>
+ <spinner label="B" name="Path Limit Begin"/>
+ <spinner label="E" name="Path Limit End"/>
+ <text name="text taper2">
+ Taper
+ </text>
+ <spinner label="X" name="Taper X"/>
+ <spinner label="Y" name="Taper Y"/>
+ <text name="text radius delta">
+ Radius
+ </text>
+ <text name="text revolutions">
+ Revolutions
+ </text>
+ <texture_picker label="Sculpt Texture" name="sculpt texture control" tool_tip="點擊以挑é¸åœ–åƒ"/>
+ <check_box label="Mirror" name="sculpt mirror control" tool_tip="Flips sculpted prim along the X axis"/>
+ <check_box label="Inside-out" name="sculpt invert control" tool_tip="Inverts the sculpted prims normals, making it appear inside-out"/>
+ <text name="label sculpt type">
+ Stitching type
+ </text>
+ <combo_box name="sculpt type control">
+ <combo_box.item label="(無)" name="None"/>
+ <combo_box.item label="Sphere" name="Sphere"/>
+ <combo_box.item label="Torus" name="Torus"/>
+ <combo_box.item label="Plane" name="Plane"/>
+ <combo_box.item label="Cylinder" name="Cylinder"/>
+ </combo_box>
+ </panel>
+ <panel label="特性" name="Features">
+ <text name="select_single">
+ åªèƒ½é¸æ“‡ä¸€å€‹å¹¾ä½•å…ƒä»¶åŽ»ç·¨è¼¯ç´°ç¯€ã€‚
+ </text>
+ <text name="edit_object">
+ 編輯物件特性:
+ </text>
+ <check_box label="彈性路徑" name="Flexible1D Checkbox Ctrl" tool_tip="Allows object to flex about the Z axis (Client-side only)"/>
+ <spinner label="柔軟" name="FlexNumSections"/>
+ <spinner label="é‡åŠ›" name="FlexGravity"/>
+ <spinner label="拖曳" name="FlexFriction"/>
+ <spinner label="風力" name="FlexWind"/>
+ <spinner label="張力" name="FlexTension"/>
+ <spinner label="強制 X 軸" name="FlexForceX"/>
+ <spinner label="強制 Y 軸" name="FlexForceY"/>
+ <spinner label="強制 Z 軸" name="FlexForceZ"/>
+ <check_box label="å…‰æº" name="Light Checkbox Ctrl" tool_tip="導致物件發光"/>
+ <color_swatch name="colorswatch" tool_tip="點擊以開啟é¡è‰²æŒ‘é¸å™¨"/>
+ <texture_picker label="" name="light texture control" tool_tip="Click to choose a projection image (only has effect with deferred rendering enabled)"/>
+ <spinner label="強度" name="Light Intensity"/>
+ <spinner label="FOV" name="Light FOV"/>
+ <spinner label="åŠå¾‘" name="Light Radius"/>
+ <spinner label="Focus" name="Light Focus"/>
+ <spinner label="衰減" name="Light Falloff"/>
+ <spinner label="Ambiance" name="Light Ambiance"/>
+ </panel>
+ <panel label="æ質" name="Texture">
+ <panel.string name="string repeats per meter">
+ æ¯å…¬å°ºé‡è¦†æ¬¡æ•¸
+ </panel.string>
+ <panel.string name="string repeats per face">
+ æ¯ä¸€é¢é‡è¦†æ¬¡æ•¸
+ </panel.string>
+ <texture_picker label="æ質" name="texture control" tool_tip="點擊以挑é¸åœ–åƒ"/>
+ <color_swatch label="é¡è‰²" name="colorswatch" tool_tip="點擊以開啟é¡è‰²æŒ‘é¸å™¨"/>
+ <text name="color trans">
+ é€æ˜Žåº¦ %
+ </text>
+ <text name="glow label">
+ 光暈
+ </text>
+ <check_box label="全亮" name="checkbox fullbright"/>
+ <text name="tex gen">
+ 映射方å¼
+ </text>
+ <combo_box name="combobox texgen">
+ <combo_box.item label="é è¨­" name="Default"/>
+ <combo_box.item label="å¹³é¢" name="Planar"/>
+ </combo_box>
+ <text name="label shininess">
+ 光澤
+ </text>
+ <combo_box name="combobox shininess">
+ <combo_box.item label="ç„¡" name="None"/>
+ <combo_box.item label="低" name="Low"/>
+ <combo_box.item label="中" name="Medium"/>
+ <combo_box.item label="高" name="High"/>
+ </combo_box>
+ <text name="label bumpiness">
+ 凹凸貼圖
+ </text>
+ <combo_box name="combobox bumpiness">
+ <combo_box.item label="ç„¡" name="None"/>
+ <combo_box.item label="Brightness" name="Brightness"/>
+ <combo_box.item label="Darkness" name="Darkness"/>
+ <combo_box.item label="woodgrain" name="woodgrain"/>
+ <combo_box.item label="bark" name="bark"/>
+ <combo_box.item label="bricks" name="bricks"/>
+ <combo_box.item label="checker" name="checker"/>
+ <combo_box.item label="concrete" name="concrete"/>
+ <combo_box.item label="crustytile" name="crustytile"/>
+ <combo_box.item label="cutstone" name="cutstone"/>
+ <combo_box.item label="discs" name="discs"/>
+ <combo_box.item label="gravel" name="gravel"/>
+ <combo_box.item label="petridish" name="petridish"/>
+ <combo_box.item label="siding" name="siding"/>
+ <combo_box.item label="stonetile" name="stonetile"/>
+ <combo_box.item label="stucco" name="stucco"/>
+ <combo_box.item label="suction" name="suction"/>
+ <combo_box.item label="weave" name="weave"/>
+ </combo_box>
+ <check_box initial_value="false" label="å°é½Šå¹³é¢" name="checkbox planar align" tool_tip="以最後所é¸æ“‡çš„é¢ç‚ºåŸºæº–,å°é½Šå…¨éƒ¨æ‰€é¸æ“‡çš„é¢ä¸Šçš„æ質。這必須使用平é¢æ質映射方å¼ã€‚"/>
+ <text name="rpt">
+ é‡è¦†æ¬¡æ•¸ / é¢
+ </text>
+ <spinner label="水平(U)" name="TexScaleU"/>
+ <check_box label="翻轉" name="checkbox flip s"/>
+ <spinner label="垂直(V)" name="TexScaleV"/>
+ <check_box label="翻轉" name="checkbox flip t"/>
+ <spinner label="旋轉˚" name="TexRot"/>
+ <spinner label="é‡è¦†æ¬¡æ•¸ / 公尺" name="rptctrl"/>
+ <button label="套用" label_selected="套用" name="button apply"/>
+ <text name="tex offset">
+ æ質ä½ç§»
+ </text>
+ <spinner label="水平(U)" name="TexOffsetU"/>
+ <spinner label="垂直(V)" name="TexOffsetV"/>
+ <panel name="Add_Media">
+ <text name="media_tex">
+ 媒體
+ </text>
+ <button name="add_media" tool_tip="添加媒體"/>
+ <button name="delete_media" tool_tip="刪除這個媒體æ質"/>
+ <button name="edit_media" tool_tip="編輯這個媒體"/>
+ <button label="å°é½Š" label_selected="å°é½Šåª’é«”" name="button align" tool_tip="å°é½Šåª’é«”æ質(須先載入)"/>
+ </panel>
+ </panel>
+ <panel label="內容" name="Contents">
+ <button label="新腳本" label_selected="新腳本" name="button new script"/>
+ <button label="權é™" name="button permissions"/>
+ </panel>
+ </tab_container>
+ <panel name="land info panel">
+ <text name="label_parcel_info">
+ 地段資訊
+ </text>
+ <text name="label_area_price">
+ 價格: L$[PRICE] 購買 [AREA] m²
+ </text>
+ <text name="label_area">
+ é¢ç©ï¼š [AREA] m²
+ </text>
+ <button label="關於土地" label_selected="關於土地" name="button about land"/>
+ <check_box label="顯示æ“有者" name="checkbox show owners" tool_tip="Colorize the parcels according to the type of owner:
+
+綠色 = 你的土地
+æ°´è— = 你群組的土地
+紅色 = 其他人所有
+黃色 = 出售
+紫色 = æ‹è³£
+ç°è‰² = 公有地"/>
+ <text name="label_parcel_modify">
+ 修改地段
+ </text>
+ <button label="分割" label_selected="分割" name="button subdivide land"/>
+ <button label="åˆä½µ" label_selected="åˆä½µ" name="button join land"/>
+ <text name="label_parcel_trans">
+ 土地交易
+ </text>
+ <button label="購買土地" label_selected="購買土地" name="button buy land"/>
+ <button label="放棄土地" label_selected="放棄土地" name="button abandon land"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_top_objects.xml b/indra/newview/skins/default/xui/zh/floater_top_objects.xml
new file mode 100644
index 0000000000..0e7e0c5b1a
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_top_objects.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="top_objects" title="Top Objects">
+ <floater.string name="top_scripts_title">
+ Top Scripts
+ </floater.string>
+ <floater.string name="top_scripts_text">
+ [COUNT] scripts taking a total of [TIME] ms
+ </floater.string>
+ <floater.string name="scripts_score_label">
+ Time
+ </floater.string>
+ <floater.string name="scripts_mono_time_label">
+ Mono Time
+ </floater.string>
+ <floater.string name="top_colliders_title">
+ Top Colliders
+ </floater.string>
+ <floater.string name="top_colliders_text">
+ Top [COUNT] objects experiencing many potential collisions
+ </floater.string>
+ <floater.string name="colliders_score_label">
+ ç©åˆ†
+ </floater.string>
+ <floater.string name="none_descriptor">
+ 未發ç¾ã€‚
+ </floater.string>
+ <text name="title_text">
+ 載入中...
+ </text>
+ <scroll_list name="objects_list">
+ <scroll_list.columns label="ç©åˆ†" name="score"/>
+ <scroll_list.columns label="å稱" name="name"/>
+ <scroll_list.columns label="æ“有者" name="owner"/>
+ <scroll_list.columns label="ä½ç½®" name="location"/>
+ <scroll_list.columns label="Time" name="time"/>
+ <scroll_list.columns label="Mono Time" name="mono_time"/>
+ <scroll_list.columns label="URLs" name="URLs"/>
+ </scroll_list>
+ <text name="id_text">
+ 物件 ID:
+ </text>
+ <button label="顯示指標" name="show_beacon_btn"/>
+ <text name="obj_name_text">
+ 物件å稱:
+ </text>
+ <button label="éŽæ¿¾å™¨" name="filter_object_btn"/>
+ <text name="owner_name_text">
+ æ“有者:
+ </text>
+ <button label="éŽæ¿¾å™¨" name="filter_owner_btn"/>
+ <button label="退回所é¸æ“‡çš„" name="return_selected_btn"/>
+ <button label="全部退回" name="return_all_btn"/>
+ <button label="關閉所é¸æ“‡çš„" name="disable_selected_btn"/>
+ <button label="全部關閉" name="disable_all_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_tos.xml b/indra/newview/skins/default/xui/zh/floater_tos.xml
new file mode 100644
index 0000000000..5f9e16afe1
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_tos.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="modal container">
+ <floater.string name="real_url">
+ http://secondlife.com/app/tos/
+ </floater.string>
+ <floater.string name="loading_url">
+ data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Loading %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
+ </floater.string>
+ <button label="繼續" label_selected="繼續" name="Continue"/>
+ <button label="å–消" label_selected="å–消" name="Cancel"/>
+ <check_box label="我åŒæ„接å—æœå‹™æ¢æ¬¾åŠéš±ç§æ”¿ç­–" name="agree_chk"/>
+ <text name="tos_heading">
+ 請謹慎閱讀以下的æœå‹™æ¢æ¬¾åŠéš±ç§æ”¿ç­–。è¦ç¹¼çºŒç™»å…¥åˆ° [SECOND_LIFE],你必須接å—這些å”議。
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_url_entry.xml b/indra/newview/skins/default/xui/zh/floater_url_entry.xml
new file mode 100644
index 0000000000..9e3f3cd47d
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_url_entry.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="url_entry">
+ <text name="media_label">
+ 媒體 URL:
+ </text>
+ <button label="確定" name="ok_btn"/>
+ <button label="å–消" name="cancel_btn"/>
+ <button label="清除" name="clear_btn"/>
+ <text name="loading_label">
+ 載入中...
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_voice_controls.xml b/indra/newview/skins/default/xui/zh/floater_voice_controls.xml
new file mode 100644
index 0000000000..24b7efea4f
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_voice_controls.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_voice_controls" title="語音控制">
+ <string name="title_nearby">
+ 附近的語音
+ </string>
+ <string name="title_group">
+ 與 [GROUP] 進行群組通話
+ </string>
+ <string name="title_adhoc">
+ 會議通話
+ </string>
+ <string name="title_peer_2_peer">
+ 與 [NAME] 進行通話
+ </string>
+ <string name="no_one_near">
+ 附近沒有一人開啟語音
+ </string>
+ <layout_stack name="my_call_stack">
+ <layout_panel name="my_panel">
+ <text name="user_text" value="我的化身:"/>
+ </layout_panel>
+ <layout_panel name="leave_call_panel">
+ <layout_stack name="voice_effect_and_leave_call_stack">
+ <layout_panel name="leave_call_btn_panel">
+ <button label="çµæŸé€šè©±" name="leave_call_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_voice_effect.xml b/indra/newview/skins/default/xui/zh/floater_voice_effect.xml
new file mode 100644
index 0000000000..36efe20b65
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_voice_effect.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater label="地點" name="voice_effects" title="語音變è²">
+ <string name="no_voice_effect">
+ (No Voice Morph)
+ </string>
+ <string name="active_voice_effect">
+ (Active)
+ </string>
+ <string name="unsubscribed_voice_effect">
+ (Unsubscribed)
+ </string>
+ <string name="new_voice_effect">
+ (New!)
+ </string>
+ <text name="preview_text">
+ To Preview
+ </text>
+ <text name="status_text">
+ Record a sample, then click on a voice to hear how it will sound.
+ </text>
+ <button label="Record" name="record_btn" tool_tip="Record a sample of your voice."/>
+ <button label="åœæ­¢" name="record_stop_btn"/>
+ <text name="voice_morphing_link">
+ [[URL] Subscribe Now]
+ </text>
+ <scroll_list name="voice_effect_list" tool_tip="Record a sample of your voice, then click an effect to preview.">
+ <scroll_list.columns label="語音å稱" name="name"/>
+ <scroll_list.columns label="éŽæœŸ" name="expires"/>
+ </scroll_list>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_water.xml b/indra/newview/skins/default/xui/zh/floater_water.xml
new file mode 100644
index 0000000000..5fb57272af
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_water.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Water Floater" title="進階水文編輯器">
+ <floater.string name="WLDefaultWaterNames">
+ Default:Glassy:Pond:Murky:Second Plague:SNAKE!!!:Valdez
+ </floater.string>
+ <text name="KeyFramePresetsText">
+ Water Presets:
+ </text>
+ <button label="新增" label_selected="新增" name="WaterNewPreset"/>
+ <button label="儲存" label_selected="儲存" name="WaterSavePreset"/>
+ <button label="刪除" label_selected="刪除" name="WaterDeletePreset"/>
+ <tab_container name="Water Tabs">
+ <panel label="設定" name="Settings">
+ <text name="BHText">
+ Water Fog Color
+ </text>
+ <color_swatch name="WaterFogColor" tool_tip="點擊以開啟é¡è‰²æŒ‘é¸å™¨"/>
+ <text name="WaterFogDensText">
+ Fog Density Exponent
+ </text>
+ <text name="WaterUnderWaterFogModText">
+ Underwater Fog Modifier
+ </text>
+ <text name="BDensText">
+ Reflection Wavelet Scale
+ </text>
+ <slider label="1" name="WaterNormalScaleX"/>
+ <slider label="2" name="WaterNormalScaleY"/>
+ <slider label="3" name="WaterNormalScaleZ"/>
+ <text name="HDText">
+ Fresnel Scale
+ </text>
+ <text name="FresnelOffsetText">
+ Fresnel Offset
+ </text>
+ <text name="DensMultText">
+ Refract Scale Above
+ </text>
+ <text name="WaterScaleBelowText">
+ Refract Scale Below
+ </text>
+ <text name="MaxAltText">
+ Blur Multiplier
+ </text>
+ </panel>
+ <panel label="圖åƒ" name="Waves">
+ <text name="BHText">
+ Big Wave Direction
+ </text>
+ <text name="WaterWave1DirXText">
+ X
+ </text>
+ <text name="WaterWave1DirYText">
+ Y
+ </text>
+ <text name="BHText2">
+ Little Wave Direction
+ </text>
+ <text name="WaterWave2DirXText">
+ X
+ </text>
+ <text name="WaterWave2DirYText">
+ Y
+ </text>
+ <text name="BHText3">
+ 正常地圖
+ </text>
+ </panel>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_web_content.xml b/indra/newview/skins/default/xui/zh/floater_web_content.xml
new file mode 100644
index 0000000000..be6bf8bb27
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_web_content.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_web_content" title="">
+ <layout_stack name="stack1">
+ <layout_panel name="nav_controls">
+ <button name="back" tool_tip="å‘後導覽"/>
+ <button name="forward" tool_tip="å‘å‰å°Žè¦½"/>
+ <button name="stop" tool_tip="åœæ­¢å°Žè¦½"/>
+ <button name="reload" tool_tip="é‡è¼‰é é¢"/>
+ <combo_box name="address" tool_tip="在此輸入 URL ä½ç½®"/>
+ <icon name="media_secure_lock_flag" tool_tip="加密的ç€è¦½"/>
+ <button name="popexternal" tool_tip="在你的桌é¢ç€è¦½å™¨ä¸­é–‹å•Ÿç›®å‰çš„ URL ä½å€"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_whitelist_entry.xml b/indra/newview/skins/default/xui/zh/floater_whitelist_entry.xml
new file mode 100644
index 0000000000..967e36ead7
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_whitelist_entry.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="whitelist_entry" title="許å¯çš„項目清單">
+ <text name="media_label">
+ 輸入一個 URL ä½å€æˆ– URL æ ¼å¼ä»¥æ·»åŠ åˆ°å…許的網域清單中
+ </text>
+ <line_editor name="whitelist_entry" tool_tip="輸入一個 URL ä½å€æˆ– URL æ ¼å¼åˆ°ç™½åå–®"/>
+ <button label="確定" name="ok_btn"/>
+ <button label="å–消" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_windlight_options.xml b/indra/newview/skins/default/xui/zh/floater_windlight_options.xml
new file mode 100644
index 0000000000..383e35d50d
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_windlight_options.xml
@@ -0,0 +1,167 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="WindLight floater" title="進階天空編輯器">
+ <floater.string name="WLDefaultSkyNames">
+ A-12AM:A-12PM:A-3AM:A-3PM:A-4.30PM:A-6AM:A-6PM:A-9AM:A-9PM:Barcelona:Blizzard:Blue Midday:Coastal Afternoon:Coastal Sunset:Default:Desert Sunset:Fine Day:Fluffy Big Clouds:Foggy:Funky Funky:Funky Funky Funky:Gelatto:Ghost:Incongruent Truths:Midday 1:Midday 2:Midday 3:Midday 4:Night:Pirate:Purple:Sailor&apos;s Delight:Sheer Sensuality
+ </floater.string>
+ <text name="KeyFramePresetsText">
+ 天空é è¨­å€¼ï¼š
+ </text>
+ <button label="新增" label_selected="新增" name="WLNewPreset"/>
+ <button label="儲存" label_selected="儲存" name="WLSavePreset"/>
+ <button label="刪除" label_selected="刪除" name="WLDeletePreset"/>
+ <button label="日循環編輯器" label_selected="日循環編輯器" name="WLDayCycleMenuButton"/>
+ <tab_container name="WindLight Tabs">
+ <panel label="大氣" name="Atmosphere">
+ <text name="BHText">
+ è—天水平線
+ </text>
+ <text name="BHText2">
+ R
+ </text>
+ <text name="BHText3">
+ G
+ </text>
+ <text name="BHText4">
+ B
+ </text>
+ <text name="BHText5">
+ I
+ </text>
+ <text name="BDensText">
+ 陰霾水平線
+ </text>
+ <text name="BDensText2">
+ è—天密度
+ </text>
+ <text name="BHText6">
+ R
+ </text>
+ <text name="BHText7">
+ G
+ </text>
+ <text name="BHText8">
+ B
+ </text>
+ <text name="BHText9">
+ I
+ </text>
+ <text name="HDText">
+ 陰霾密度
+ </text>
+ <text name="DensMultText">
+ 密度å€å¢ž
+ </text>
+ <text name="WLDistanceMultText">
+ è·é›¢å€å¢ž
+ </text>
+ <text name="MaxAltText">
+ 最大高度
+ </text>
+ </panel>
+ <panel label="照明" name="Lighting">
+ <text name="SLCText">
+ æ—¥ï¼æœˆ é¡è‰²
+ </text>
+ <text name="BHText">
+ R
+ </text>
+ <text name="BHText2">
+ G
+ </text>
+ <text name="BHText3">
+ B
+ </text>
+ <text name="BHText4">
+ I
+ </text>
+ <text name="TODText">
+ æ—¥ï¼æœˆ ä½ç½®
+ </text>
+ <text name="WLAmbientText">
+ 環境
+ </text>
+ <text name="BHText5">
+ R
+ </text>
+ <text name="BHText6">
+ G
+ </text>
+ <text name="BHText7">
+ B
+ </text>
+ <text name="BHText8">
+ I
+ </text>
+ <text name="WLEastAngleText">
+ æ±å‡è§’度
+ </text>
+ <text name="SunGlowText">
+ 太陽光è¼
+ </text>
+ <slider label="焦點" name="WLGlowB"/>
+ <slider label="尺寸" name="WLGlowR"/>
+ <text name="SceneGammaText">
+ 場景 Gamma 值
+ </text>
+ <text name="WLStarText">
+ 星空é‡åº¦
+ </text>
+ </panel>
+ <panel label="雲彩" name="Clouds">
+ <text name="WLCloudColorText">
+ 雲彩é¡è‰²
+ </text>
+ <text name="BHText">
+ R
+ </text>
+ <text name="BHText2">
+ G
+ </text>
+ <text name="BHText3">
+ B
+ </text>
+ <text name="BHText4">
+ I
+ </text>
+ <text name="WLCloudColorText2">
+ 雲彩 XY 軸 / 密度
+ </text>
+ <text name="BHText5">
+ X
+ </text>
+ <text name="BHText6">
+ Y
+ </text>
+ <text name="BHText7">
+ D
+ </text>
+ <text name="WLCloudCoverageText">
+ 雲彩覆蓋
+ </text>
+ <text name="WLCloudScaleText">
+ 雲彩è¦æ¨¡
+ </text>
+ <text name="WLCloudDetailText">
+ 雲彩細節(XY 軸 / 密度)
+ </text>
+ <text name="BHText8">
+ X
+ </text>
+ <text name="BHText9">
+ Y
+ </text>
+ <text name="BHText10">
+ D
+ </text>
+ <text name="WLCloudScrollXText">
+ 雲彩 X 滾軸
+ </text>
+ <check_box label="鎖定" name="WLCloudLockX"/>
+ <text name="WLCloudScrollYText">
+ 雲彩 Y 滾軸
+ </text>
+ <check_box label="鎖定" name="WLCloudLockY"/>
+ <check_box label="æ繪傳統雲彩" name="DrawClassicClouds"/>
+ </panel>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_window_size.xml b/indra/newview/skins/default/xui/zh/floater_window_size.xml
new file mode 100644
index 0000000000..54b72afccc
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_window_size.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="window_size" title="視窗尺寸大å°">
+ <string name="resolution_format">
+ [RES_X] x [RES_Y]
+ </string>
+ <text name="windowsize_text">
+ 設定視窗尺寸大å°ï¼š
+ </text>
+ <combo_box name="window_size_combo" tool_tip="寬度 x 高度">
+ <combo_box.item label="1000 x 700 (é è¨­ï¼‰" name="item0"/>
+ <combo_box.item label="1024 x 768" name="item1"/>
+ <combo_box.item label="1280 x 720 (720p)" name="item2"/>
+ <combo_box.item label="1920 x 1080 (1080p)" name="item3"/>
+ </combo_box>
+ <button label="設定" name="set_btn"/>
+ <button label="å–消" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/floater_world_map.xml b/indra/newview/skins/default/xui/zh/floater_world_map.xml
new file mode 100644
index 0000000000..6ac6fb76b7
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/floater_world_map.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="worldmap" title="世界地圖">
+ <panel name="layout_panel_1">
+ <text name="events_label">
+ 圖例
+ </text>
+ </panel>
+ <panel name="layout_panel_2">
+ <button name="Show My Location" tool_tip="以我的化身所在ä½ç½®å±…中地圖"/>
+ <text name="me_label">
+ 自己
+ </text>
+ <text name="person_label">
+ 人
+ </text>
+ <text name="infohub_label">
+ 資訊中心
+ </text>
+ <text name="land_sale_label">
+ 土地出售
+ </text>
+ <text name="auction_label">
+ 土地æ‹è³£
+ </text>
+ <text name="by_owner_label">
+ ä¾æ“有者
+ </text>
+ <button name="Go Home" tool_tip="瞬間傳é€åˆ°æˆ‘的家ä½ç½®"/>
+ <text name="Home_label">
+ 家
+ </text>
+ <text name="events_label">
+ 事件:
+ </text>
+ <text name="pg_label">
+ 一般普級
+ </text>
+ <check_box initial_value="true" name="events_mature_chk"/>
+ <text name="events_mature_label">
+ é©åº¦æˆäºº
+ </text>
+ <text name="events_adult_label">
+ 完全æˆäºº
+ </text>
+ </panel>
+ <panel name="layout_panel_3">
+ <text name="find_on_map_label">
+ 在地圖上發ç¾
+ </text>
+ </panel>
+ <panel name="layout_panel_4">
+ <combo_box label="線上的朋å‹" name="friend combo" tool_tip="顯示朋å‹åœ¨åœ°åœ–上">
+ <combo_box.item label="我線上的朋å‹" name="item1"/>
+ </combo_box>
+ <combo_box label="我的地標" name="landmark combo" tool_tip="將地標ä½ç½®é¡¯ç¤ºåœ¨åœ°åœ–上">
+ <combo_box.item label="我的地標" name="item1"/>
+ </combo_box>
+ <search_editor label="地å€ä¾å稱" name="location" tool_tip="輸入一個地å€çš„å稱"/>
+ <button label="尋找" name="DoSearch" tool_tip="æœå°‹åœ°å€"/>
+ <button name="Clear" tool_tip="Clear tracking lines and reset map"/>
+ <text name="events_label">
+ ä½ç½®ï¼š
+ </text>
+ <button label="瞬間傳é€" name="Teleport" tool_tip="瞬間傳é€åˆ°æ‰€é¸çš„ä½ç½®"/>
+ <button label="覆製 SLurl" name="copy_slurl" tool_tip="Copies current location as SLurl to be used on the web."/>
+ <button label="Show Selection" name="Show Destination" tool_tip="Center map on selected location"/>
+ </panel>
+ <panel name="layout_panel_5">
+ <text name="zoom_label">
+ Zoom
+ </text>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/inspect_avatar.xml b/indra/newview/skins/default/xui/zh/inspect_avatar.xml
new file mode 100644
index 0000000000..02e81983a6
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/inspect_avatar.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_avatar">
+ <string name="Subtitle">
+ [AGE]
+ </string>
+ <string name="Details">
+ [SL_PROFILE]
+ </string>
+ <text name="user_subtitle" value="11 Months, 3 days old"/>
+ <text name="user_details">
+ This is my second life description and I really think it is great. But for some reason my description is super extra long because I like to talk a whole lot
+ </text>
+ <slider name="volume_slider" tool_tip="Voice volume" value="0.5"/>
+ <button label="加為朋å‹" name="add_friend_btn"/>
+ <button label="IM" name="im_btn"/>
+ <button label="檔案" name="view_profile_btn"/>
+ <panel name="moderator_panel">
+ <button label="Disable Voice" name="disable_voice"/>
+ <button label="Enable Voice" name="enable_voice"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/inspect_group.xml b/indra/newview/skins/default/xui/zh/inspect_group.xml
new file mode 100644
index 0000000000..ac331be203
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/inspect_group.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_group">
+ <string name="PrivateGroup">
+ ç§äººç¾¤çµ„
+ </string>
+ <string name="FreeToJoin">
+ å…費加入
+ </string>
+ <string name="CostToJoin">
+ 花費 L$[AMOUNT] 加入
+ </string>
+ <string name="YouAreMember">
+ 你是æˆå“¡
+ </string>
+ <text name="group_subtitle">
+ 123 members
+ </text>
+ <text name="group_details">
+ A group of folks charged with creating a room with a moose.
+Fear the moose! Fear it! And the mongoose too!
+ </text>
+ <text name="group_cost">
+ L$123 to join
+ </text>
+ <button label="加入" name="join_btn"/>
+ <button label="退出" name="leave_btn"/>
+ <button label="察看檔案" name="view_profile_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/inspect_object.xml b/indra/newview/skins/default/xui/zh/inspect_object.xml
new file mode 100644
index 0000000000..58091b3aef
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/inspect_object.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_object">
+ <string name="Creator">
+ By [CREATOR]
+ </string>
+ <string name="CreatorAndOwner">
+ By [CREATOR]
+Owner [OWNER]
+ </string>
+ <string name="Price">
+ L$[AMOUNT]
+ </string>
+ <string name="PriceFree">
+ Free!
+ </string>
+ <string name="Touch">
+ Touch
+ </string>
+ <string name="Sit">
+ Sit
+ </string>
+ <text name="object_creator">
+ by secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about
+owner secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about
+ </text>
+ <text name="price_text">
+ L$30,000
+ </text>
+ <icon name="secure_browsing" tool_tip="Secure Browsing"/>
+ <text name="object_media_url">
+ http://www.superdupertest.com
+ </text>
+ <button label="購買" name="buy_btn"/>
+ <button label="支付" name="pay_btn"/>
+ <button label="å–得副本" name="take_free_copy_btn"/>
+ <button label="Touch" name="touch_btn"/>
+ <button label="Sit" name="sit_btn"/>
+ <button label="Open" name="open_btn"/>
+ <button label="More" name="more_info_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/inspect_remote_object.xml b/indra/newview/skins/default/xui/zh/inspect_remote_object.xml
new file mode 100644
index 0000000000..bed19d6d78
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/inspect_remote_object.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_remote_object">
+ <text name="object_name">
+ Test Object Name That Is Really Long OMG so long I can&apos;t believe how long the name of this object is, I mean really.
+ </text>
+ <text name="object_owner_label">
+ æ“有者:
+ </text>
+ <text name="object_owner">
+ Longavatarname Johnsonlongstonnammer
+ </text>
+ <text name="object_slurl">
+ http://slurl.com/Ahern/50/50/50
+ </text>
+ <button label="地圖" name="map_btn"/>
+ <button label="å°éŽ–" name="block_btn"/>
+ <button label="關閉" name="close_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/zh/menu_add_wearable_gear.xml b/indra/newview/skins/default/xui/zh/menu_add_wearable_gear.xml
new file mode 100644
index 0000000000..3c8c3e4a31
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_add_wearable_gear.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Add Wearable Gear Menu">
+ <menu_item_check label="ä¾æœ€è¿‘排åº" name="sort_by_most_recent"/>
+ <menu_item_check label="ä¾å稱排åº" name="sort_by_name"/>
+ <menu_item_check label="ä¾é¡žåž‹æŽ’åº" name="sort_by_type"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_attachment_other.xml b/indra/newview/skins/default/xui/zh/menu_attachment_other.xml
new file mode 100644
index 0000000000..885c4b9add
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_attachment_other.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- *NOTE: See also menu_avatar_other.xml -->
+<context_menu name="Avatar Pie">
+ <menu_item_call label="察看檔案" name="Profile..."/>
+ <menu_item_call label="加為朋å‹" name="Add Friend"/>
+ <menu_item_call label="IM" name="Send IM..."/>
+ <menu_item_call label="通話" name="Call"/>
+ <menu_item_call label="邀請加入群組" name="Invite..."/>
+ <menu_item_call label="å°éŽ–" name="Avatar Mute"/>
+ <menu_item_call label="回報" name="abuse"/>
+ <menu_item_call label="å‡çµ" name="Freeze..."/>
+ <menu_item_call label="踢出" name="Eject..."/>
+ <menu_item_call label="æ質除錯" name="Debug..."/>
+ <menu_item_call label="放大" name="Zoom In"/>
+ <menu_item_call label="支付" name="Pay..."/>
+ <menu_item_call label="物件檔案" name="Object Inspect"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_attachment_self.xml b/indra/newview/skins/default/xui/zh/menu_attachment_self.xml
new file mode 100644
index 0000000000..1911a1aeff
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_attachment_self.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Attachment Pie">
+ <menu_item_call label="Touch" name="Attachment Object Touch"/>
+ <menu_item_call label="編輯" name="Edit..."/>
+ <menu_item_call label="å¸ä¸‹" name="Detach"/>
+ <menu_item_call label="å下" name="Sit Down Here"/>
+ <menu_item_call label="èµ·ç«‹" name="Stand Up"/>
+ <menu_item_call label="我的外觀" name="Change Outfit"/>
+ <menu_item_call label="編輯我的è£æ‰®" name="Edit Outfit"/>
+ <menu_item_call label="編輯我的體形" name="Edit My Shape"/>
+ <menu_item_call label="我的朋å‹" name="Friends..."/>
+ <menu_item_call label="我的群組" name="Groups..."/>
+ <menu_item_call label="我的檔案" name="Profile..."/>
+ <menu_item_call label="æ質除錯" name="Debug..."/>
+ <menu_item_call label="丟棄" name="Drop"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_avatar_icon.xml b/indra/newview/skins/default/xui/zh/menu_avatar_icon.xml
new file mode 100644
index 0000000000..ef0986a13b
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_avatar_icon.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Avatar Icon Menu">
+ <menu_item_call label="察看檔案" name="Show Profile"/>
+ <menu_item_call label="é€å‡º IM..." name="Send IM"/>
+ <menu_item_call label="加為朋å‹..." name="Add Friend"/>
+ <menu_item_call label="移除朋å‹..." name="Remove Friend"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_avatar_other.xml b/indra/newview/skins/default/xui/zh/menu_avatar_other.xml
new file mode 100644
index 0000000000..260571eb54
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_avatar_other.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- *NOTE: See also menu_attachment_other.xml -->
+<context_menu name="Avatar Pie">
+ <menu_item_call label="察看檔案" name="Profile..."/>
+ <menu_item_call label="加為朋å‹" name="Add Friend"/>
+ <menu_item_call label="IM" name="Send IM..."/>
+ <menu_item_call label="通話" name="Call"/>
+ <menu_item_call label="邀請加入群組" name="Invite..."/>
+ <menu_item_call label="Block" name="Avatar Mute"/>
+ <menu_item_call label="回報" name="abuse"/>
+ <menu_item_call label="å‡çµ" name="Freeze..."/>
+ <menu_item_call label="踢出" name="Eject..."/>
+ <menu_item_call label="æ質除錯" name="Debug..."/>
+ <menu_item_call label="Zoom In" name="Zoom In"/>
+ <menu_item_call label="支付" name="Pay..."/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_avatar_self.xml b/indra/newview/skins/default/xui/zh/menu_avatar_self.xml
new file mode 100644
index 0000000000..d516e3ab58
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_avatar_self.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Self Pie">
+ <menu_item_call label="å下" name="Sit Down Here"/>
+ <menu_item_call label="èµ·ç«‹" name="Stand Up"/>
+ <context_menu label="脫下" name="Take Off &gt;">
+ <context_menu label="è¡£æœ" name="Clothes &gt;">
+ <menu_item_call label="襯衫" name="Shirt"/>
+ <menu_item_call label="褲å­" name="Pants"/>
+ <menu_item_call label="裙å­" name="Skirt"/>
+ <menu_item_call label="éž‹å­" name="Shoes"/>
+ <menu_item_call label="襪å­" name="Socks"/>
+ <menu_item_call label="夾克" name="Jacket"/>
+ <menu_item_call label="手套" name="Gloves"/>
+ <menu_item_call label="內衣" name="Self Undershirt"/>
+ <menu_item_call label="內褲" name="Self Underpants"/>
+ <menu_item_call label="刺é’" name="Self Tattoo"/>
+ <menu_item_call label="Physics" name="Self Physics"/>
+ <menu_item_call label="åŠé€æ˜Ž" name="Self Alpha"/>
+ <menu_item_call label="全部衣æœ" name="All Clothes"/>
+ </context_menu>
+ <context_menu label="HUD" name="Object Detach HUD"/>
+ <context_menu label="å¸ä¸‹" name="Object Detach"/>
+ <menu_item_call label="全部å¸ä¸‹" name="Detach All"/>
+ </context_menu>
+ <menu_item_call label="我的外觀" name="Chenge Outfit"/>
+ <menu_item_call label="編輯我è£æ‰®" name="Edit Outfit"/>
+ <menu_item_call label="編輯我的體形" name="Edit My Shape"/>
+ <menu_item_call label="我的朋å‹" name="Friends..."/>
+ <menu_item_call label="我的群組" name="Groups..."/>
+ <menu_item_call label="我的檔案" name="Profile..."/>
+ <menu_item_call label="æ質除錯" name="Debug..."/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_bottomtray.xml b/indra/newview/skins/default/xui/zh/menu_bottomtray.xml
new file mode 100644
index 0000000000..a00aa7cd35
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_bottomtray.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="hide_camera_move_controls_menu">
+ <menu_item_check label="講話按鈕" name="EnableVoiceChat"/>
+ <menu_item_check label="姿勢按鈕" name="ShowGestureButton"/>
+ <menu_item_check label="移動按鈕" name="ShowMoveButton"/>
+ <menu_item_check label="視角按鈕" name="ShowCameraButton"/>
+ <menu_item_check label="快照按鈕" name="ShowSnapshotButton"/>
+ <menu_item_check label="建造按鈕" name="ShowBuildButton"/>
+ <menu_item_check label="æœå°‹æŒ‰éˆ•" name="ShowSearchButton"/>
+ <menu_item_check label="地圖按鈕" name="ShowWorldMapButton"/>
+ <menu_item_check label="迷你地圖按鈕" name="ShowMiniMapButton"/>
+ <menu_item_call label="剪下" name="NearbyChatBar_Cut"/>
+ <menu_item_call label="覆製" name="NearbyChatBar_Copy"/>
+ <menu_item_call label="貼上" name="NearbyChatBar_Paste"/>
+ <menu_item_call label="刪除" name="NearbyChatBar_Delete"/>
+ <menu_item_call label="å…¨é¸" name="NearbyChatBar_Select_All"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_cof_attachment.xml b/indra/newview/skins/default/xui/zh/menu_cof_attachment.xml
new file mode 100644
index 0000000000..876fef16df
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_cof_attachment.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="COF Attachment">
+ <menu_item_call label="å¸ä¸‹" name="detach"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_cof_body_part.xml b/indra/newview/skins/default/xui/zh/menu_cof_body_part.xml
new file mode 100644
index 0000000000..d06207b19d
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_cof_body_part.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="COF Body">
+ <menu_item_call label="å–代" name="replace"/>
+ <menu_item_call label="編輯" name="edit"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_cof_clothing.xml b/indra/newview/skins/default/xui/zh/menu_cof_clothing.xml
new file mode 100644
index 0000000000..300ff47b12
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_cof_clothing.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="COF Clothing">
+ <menu_item_call label="脫下" name="take_off"/>
+ <menu_item_call label="編輯" name="edit"/>
+ <menu_item_call label="å–代" name="replace"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_cof_gear.xml b/indra/newview/skins/default/xui/zh/menu_cof_gear.xml
new file mode 100644
index 0000000000..cd069f9601
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_cof_gear.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Gear COF">
+ <menu label="æ–°è¡£æœ" name="COF.Gear.New_Clothes"/>
+ <menu label="新身體部ä½" name="COF.Geear.New_Body_Parts"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_edit.xml b/indra/newview/skins/default/xui/zh/menu_edit.xml
new file mode 100644
index 0000000000..d6eb87a6b0
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_edit.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu label="編輯" name="Edit">
+ <menu_item_call label="復原" name="Undo"/>
+ <menu_item_call label="é‡åš" name="Redo"/>
+ <menu_item_call label="剪下" name="Cut"/>
+ <menu_item_call label="覆製" name="Copy"/>
+ <menu_item_call label="貼上" name="Paste"/>
+ <menu_item_call label="刪除" name="Delete"/>
+ <menu_item_call label="覆製貼上" name="Duplicate"/>
+ <menu_item_call label="å…¨é¸" name="Select All"/>
+ <menu_item_call label="å–消é¸æ“‡" name="Deselect"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_favorites.xml b/indra/newview/skins/default/xui/zh/menu_favorites.xml
new file mode 100644
index 0000000000..c60bebd3dc
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_favorites.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="瞬間傳é€" name="Teleport To Landmark"/>
+ <menu_item_call label="察看 / 編輯 地標" name="Landmark Open"/>
+ <menu_item_call label="覆製 SLurl" name="Copy slurl"/>
+ <menu_item_call label="顯示在地圖上" name="Show On Map"/>
+ <menu_item_call label="覆製" name="Landmark Copy"/>
+ <menu_item_call label="貼上" name="Landmark Paste"/>
+ <menu_item_call label="刪除" name="Delete"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_gesture_gear.xml b/indra/newview/skins/default/xui/zh/menu_gesture_gear.xml
new file mode 100644
index 0000000000..a331c47a6e
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_gesture_gear.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_gesture_gear">
+ <menu_item_call label="由我的最愛中 添加/移除" name="activate"/>
+ <menu_item_call label="覆製" name="copy_gesture"/>
+ <menu_item_call label="貼上" name="paste"/>
+ <menu_item_call label="覆製 UUID" name="copy_uuid"/>
+ <menu_item_call label="儲存到目å‰è£æ‰®" name="save_to_outfit"/>
+ <menu_item_call label="編輯" name="edit_gesture"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_group_plus.xml b/indra/newview/skins/default/xui/zh/menu_group_plus.xml
new file mode 100644
index 0000000000..d4a5a69104
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_group_plus.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_call label="加入群組..." name="item_join"/>
+ <menu_item_call label="新群組..." name="item_new"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_hide_navbar.xml b/indra/newview/skins/default/xui/zh/menu_hide_navbar.xml
new file mode 100644
index 0000000000..dbb8ececaa
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_hide_navbar.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="hide_navbar_menu">
+ <menu_item_check label="顯示導覽列" name="ShowNavbarNavigationPanel"/>
+ <menu_item_check label="顯示最愛列" name="ShowNavbarFavoritesPanel"/>
+ <menu_item_check label="顯示迷你ä½ç½®åˆ—" name="ShowMiniLocationPanel"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_im_well_button.xml b/indra/newview/skins/default/xui/zh/menu_im_well_button.xml
new file mode 100644
index 0000000000..4b9b4b2758
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_im_well_button.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="IM Well Button Context Menu">
+ <menu_item_call label="全部關閉" name="Close All"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_imchiclet_adhoc.xml b/indra/newview/skins/default/xui/zh/menu_imchiclet_adhoc.xml
new file mode 100644
index 0000000000..85417d554e
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_imchiclet_adhoc.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet AdHoc Menu">
+ <menu_item_call label="çµæŸæœƒè©±" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_imchiclet_group.xml b/indra/newview/skins/default/xui/zh/menu_imchiclet_group.xml
new file mode 100644
index 0000000000..4664fcb027
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_imchiclet_group.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet Group Menu">
+ <menu_item_call label="群組資訊" name="Show Profile"/>
+ <menu_item_call label="顯示會話" name="Chat"/>
+ <menu_item_call label="çµæŸæœƒè©±" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_imchiclet_p2p.xml b/indra/newview/skins/default/xui/zh/menu_imchiclet_p2p.xml
new file mode 100644
index 0000000000..636bdaae09
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_imchiclet_p2p.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet P2P Menu">
+ <menu_item_call label="察看檔案" name="Show Profile"/>
+ <menu_item_call label="加為朋å‹" name="Add Friend"/>
+ <menu_item_call label="顯示會話" name="Send IM"/>
+ <menu_item_call label="çµæŸæœƒè©±" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/zh/menu_inspect_avatar_gear.xml
new file mode 100644
index 0000000000..7385764e4c
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_inspect_avatar_gear.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<toggleable_menu name="Gear Menu">
+ <menu_item_call label="察看檔案" name="view_profile"/>
+ <menu_item_call label="加為朋å‹" name="add_friend"/>
+ <menu_item_call label="IM" name="im"/>
+ <menu_item_call label="通話" name="call"/>
+ <menu_item_call label="瞬間傳é€" name="teleport"/>
+ <menu_item_call label="邀請加入群組" name="invite_to_group"/>
+ <menu_item_call label="Block" name="block"/>
+ <menu_item_call label="Unblock" name="unblock"/>
+ <menu_item_call label="回報" name="report"/>
+ <menu_item_call label="å‡çµ" name="freeze"/>
+ <menu_item_call label="踢出" name="eject"/>
+ <menu_item_call label="踢出" name="kick"/>
+ <menu_item_call label="CSR" name="csr"/>
+ <menu_item_call label="æ質除錯" name="debug"/>
+ <menu_item_call label="在地圖上尋找" name="find_on_map"/>
+ <menu_item_call label="Zoom In" name="zoom_in"/>
+ <menu_item_call label="支付" name="pay"/>
+ <menu_item_call label="分享" name="share"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_inspect_object_gear.xml b/indra/newview/skins/default/xui/zh/menu_inspect_object_gear.xml
new file mode 100644
index 0000000000..94ab82b8a9
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_inspect_object_gear.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<toggleable_menu name="Gear Menu">
+ <menu_item_call label="觸碰" name="touch"/>
+ <menu_item_call label="å下" name="sit"/>
+ <menu_item_call label="Pay" name="pay"/>
+ <menu_item_call label="購買" name="buy"/>
+ <menu_item_call label="å–å¾—" name="take"/>
+ <menu_item_call label="å–得副本" name="take_copy"/>
+ <menu_item_call label="é–‹å•Ÿ" name="open"/>
+ <menu_item_call label="編輯" name="edit"/>
+ <menu_item_call label="穿上" name="wear"/>
+ <menu_item_call label="添加" name="add"/>
+ <menu_item_call label="回報" name="report"/>
+ <menu_item_call label="Block" name="block"/>
+ <menu_item_call label="Zoom In" name="zoom_in"/>
+ <menu_item_call label="移除" name="remove"/>
+ <menu_item_call label="更多資訊" name="more_info"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/zh/menu_inspect_self_gear.xml
new file mode 100644
index 0000000000..1c75705743
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_inspect_self_gear.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Self Pie">
+ <menu_item_call label="å下" name="Sit Down Here"/>
+ <menu_item_call label="èµ·ç«‹" name="Stand Up"/>
+ <context_menu label="脫下" name="Take Off &gt;">
+ <context_menu label="è¡£æœ" name="Clothes &gt;">
+ <menu_item_call label="襯衫" name="Shirt"/>
+ <menu_item_call label="褲å­" name="Pants"/>
+ <menu_item_call label="裙å­" name="Skirt"/>
+ <menu_item_call label="éž‹å­" name="Shoes"/>
+ <menu_item_call label="襪å­" name="Socks"/>
+ <menu_item_call label="夾克" name="Jacket"/>
+ <menu_item_call label="手套" name="Gloves"/>
+ <menu_item_call label="內衣" name="Self Undershirt"/>
+ <menu_item_call label="內褲" name="Self Underpants"/>
+ <menu_item_call label="刺é’" name="Self Tattoo"/>
+ <menu_item_call label="åŠé€æ˜Ž" name="Self Alpha"/>
+ <menu_item_call label="全部衣æœ" name="All Clothes"/>
+ </context_menu>
+ <context_menu label="HUD" name="Object Detach HUD"/>
+ <context_menu label="å¸ä¸‹" name="Object Detach"/>
+ <menu_item_call label="全部å¸ä¸‹" name="Detach All"/>
+ </context_menu>
+ <menu_item_call label="變更è£æ‰®" name="Chenge Outfit"/>
+ <menu_item_call label="編輯我的è£æ‰®" name="Edit Outfit"/>
+ <menu_item_call label="編輯我的體形" name="Edit My Shape"/>
+ <menu_item_call label="我的朋å‹" name="Friends..."/>
+ <menu_item_call label="我的群組" name="Groups..."/>
+ <menu_item_call label="我的檔案" name="Profile..."/>
+ <menu_item_call label="æ質除錯" name="Debug..."/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_inv_offer_chiclet.xml b/indra/newview/skins/default/xui/zh/menu_inv_offer_chiclet.xml
new file mode 100644
index 0000000000..577e5988f8
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_inv_offer_chiclet.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="InvOfferChiclet Menu">
+ <menu_item_call label="關閉" name="Close"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_inventory.xml b/indra/newview/skins/default/xui/zh/menu_inventory.xml
new file mode 100644
index 0000000000..87d769af0d
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_inventory.xml
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="分享" name="Share"/>
+ <menu_item_call label="購買" name="Task Buy"/>
+ <menu_item_call label="é–‹å•Ÿ" name="Task Open"/>
+ <menu_item_call label="播放" name="Task Play"/>
+ <menu_item_call label="屬性" name="Task Properties"/>
+ <menu_item_call label="æ›´å" name="Task Rename"/>
+ <menu_item_call label="刪除" name="Task Remove"/>
+ <menu_item_call label="清空垃圾筒" name="Empty Trash"/>
+ <menu_item_call label="清空 Lost And Found" name="Empty Lost And Found"/>
+ <menu_item_call label="新資料夾" name="New Folder"/>
+ <menu_item_call label="新腳本" name="New Script"/>
+ <menu_item_call label="新記事å¡" name="New Note"/>
+ <menu_item_call label="新姿勢" name="New Gesture"/>
+ <menu label="æ–°è¡£æœ" name="New Clothes">
+ <menu_item_call label="新襯衫" name="New Shirt"/>
+ <menu_item_call label="新褲å­" name="New Pants"/>
+ <menu_item_call label="æ–°éž‹å­" name="New Shoes"/>
+ <menu_item_call label="新襪å­" name="New Socks"/>
+ <menu_item_call label="新夾克" name="New Jacket"/>
+ <menu_item_call label="新裙å­" name="New Skirt"/>
+ <menu_item_call label="新手套" name="New Gloves"/>
+ <menu_item_call label="新內衣" name="New Undershirt"/>
+ <menu_item_call label="新內褲" name="New Underpants"/>
+ <menu_item_call label="æ–°åŠé€æ˜Žé®ç½©" name="New Alpha Mask"/>
+ <menu_item_call label="新刺é’" name="New Tattoo"/>
+ <menu_item_call label="新身體物ç†" name="New Physics"/>
+ </menu>
+ <menu label="新身體部ä½" name="New Body Parts">
+ <menu_item_call label="新體形" name="New Shape"/>
+ <menu_item_call label="新皮膚" name="New Skin"/>
+ <menu_item_call label="æ–°é ­é«®" name="New Hair"/>
+ <menu_item_call label="新眼ç›" name="New Eyes"/>
+ </menu>
+ <menu label="變更類型" name="Change Type">
+ <menu_item_call label="é è¨­" name="Default"/>
+ <menu_item_call label="手套" name="Gloves"/>
+ <menu_item_call label="夾克" name="Jacket"/>
+ <menu_item_call label="褲å­" name="Pants"/>
+ <menu_item_call label="體形" name="Shape"/>
+ <menu_item_call label="éž‹å­" name="Shoes"/>
+ <menu_item_call label="襯衫" name="Shirt"/>
+ <menu_item_call label="裙å­" name="Skirt"/>
+ <menu_item_call label="內褲" name="Underpants"/>
+ <menu_item_call label="內衣" name="Undershirt"/>
+ </menu>
+ <menu_item_call label="瞬間傳é€" name="Landmark Open"/>
+ <menu_item_call label="é–‹å•Ÿ" name="Animation Open"/>
+ <menu_item_call label="é–‹å•Ÿ" name="Sound Open"/>
+ <menu_item_call label="å–代目å‰çš„è£æ‰®" name="Replace Outfit"/>
+ <menu_item_call label="添加到目å‰è£æ‰®" name="Add To Outfit"/>
+ <menu_item_call label="由目å‰çš„è£æ‰®ç§»é™¤" name="Remove From Outfit"/>
+ <menu_item_call label="尋找原件" name="Find Original"/>
+ <menu_item_call label="清空物å“" name="Purge Item"/>
+ <menu_item_call label="æ¢å¾©ç‰©å“" name="Restore Item"/>
+ <menu_item_call label="é–‹å•Ÿ" name="Open"/>
+ <menu_item_call label="開啟原件" name="Open Original"/>
+ <menu_item_call label="屬性" name="Properties"/>
+ <menu_item_call label="æ›´å" name="Rename"/>
+ <menu_item_call label="覆製資產 UUID" name="Copy Asset UUID"/>
+ <menu_item_call label="覆製" name="Copy"/>
+ <menu_item_call label="貼上" name="Paste"/>
+ <menu_item_call label="Paste As Link" name="Paste As Link"/>
+ <menu_item_call label="刪除" name="Remove Link"/>
+ <menu_item_call label="刪除" name="Delete"/>
+ <menu_item_call label="刪除系統資料夾" name="Delete System Folder"/>
+ <menu_item_call label="Start Conference Chat" name="Conference Chat Folder"/>
+ <menu_item_call label="播放" name="Sound Play"/>
+ <menu_item_call label="添加地標" name="About Landmark"/>
+ <menu_item_call label="播放於虛擬世界" name="Animation Play"/>
+ <menu_item_call label="播放於本地" name="Animation Audition"/>
+ <menu_item_call label="é€å‡ºå³æ™‚訊æ¯" name="Send Instant Message"/>
+ <menu_item_call label="發給瞬間傳é€è«‹æ±‚..." name="Offer Teleport..."/>
+ <menu_item_call label="開始會議交談" name="Conference Chat"/>
+ <menu_item_call label="Activate" name="Activate"/>
+ <menu_item_call label="Deactivate" name="Deactivate"/>
+ <menu_item_call label="å¦å­˜" name="Save As"/>
+ <menu_item_call label="Detach From Yourself" name="Detach From Yourself"/>
+ <menu_item_call label="Wear" name="Wearable And Object Wear"/>
+ <menu label="Attach To" name="Attach To"/>
+ <menu label="Attach To HUD" name="Attach To HUD"/>
+ <menu_item_call label="編輯" name="Wearable Edit"/>
+ <menu_item_call label="添加" name="Wearable Add"/>
+ <menu_item_call label="脫下" name="Take Off"/>
+ <menu_item_call label="-- ç„¡é¸é … --" name="--no options--"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_inventory_add.xml b/indra/newview/skins/default/xui/zh/menu_inventory_add.xml
new file mode 100644
index 0000000000..a0fc060e27
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_inventory_add.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_inventory_add">
+ <menu label="上傳" name="upload">
+ <menu_item_call label="圖åƒï¼ˆL$[COST])..." name="Upload Image"/>
+ <menu_item_call label="è²éŸ³ï¼ˆL$[COST])..." name="Upload Sound"/>
+ <menu_item_call label="動作(L$[COST])..." name="Upload Animation"/>
+ <menu_item_call label="大批(L$[COST] æ¯æª”案)..." name="Bulk Upload"/>
+ <menu_item_call label="設定é è¨­ä¸Šå‚³æ¬Šé™" name="perm prefs"/>
+ </menu>
+ <menu_item_call label="新資料夾" name="New Folder"/>
+ <menu_item_call label="新腳本" name="New Script"/>
+ <menu_item_call label="新記事å¡" name="New Note"/>
+ <menu_item_call label="新姿勢" name="New Gesture"/>
+ <menu label="æ–°è¡£æœ" name="New Clothes">
+ <menu_item_call label="新襯衫" name="New Shirt"/>
+ <menu_item_call label="新褲å­" name="New Pants"/>
+ <menu_item_call label="æ–°éž‹å­" name="New Shoes"/>
+ <menu_item_call label="新襪å­" name="New Socks"/>
+ <menu_item_call label="新夾克" name="New Jacket"/>
+ <menu_item_call label="新裙å­" name="New Skirt"/>
+ <menu_item_call label="新手套" name="New Gloves"/>
+ <menu_item_call label="新內衣" name="New Undershirt"/>
+ <menu_item_call label="新內褲" name="New Underpants"/>
+ <menu_item_call label="æ–°åŠé€æ˜Ž" name="New Alpha"/>
+ <menu_item_call label="新刺é’" name="New Tattoo"/>
+ <menu_item_call label="新身體物ç†" name="New Physics"/>
+ </menu>
+ <menu label="新身體部ä½" name="New Body Parts">
+ <menu_item_call label="新體形" name="New Shape"/>
+ <menu_item_call label="新皮膚" name="New Skin"/>
+ <menu_item_call label="æ–°é ­é«®" name="New Hair"/>
+ <menu_item_call label="新眼ç›" name="New Eyes"/>
+ </menu>
+</menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/zh/menu_inventory_gear_default.xml
new file mode 100644
index 0000000000..8ad0e7324f
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_inventory_gear_default.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_gear_default">
+ <menu_item_call label="新收ç´å€è¦–窗" name="new_window"/>
+ <menu_item_check label="ä¾å稱排åº" name="sort_by_name"/>
+ <menu_item_check label="ä¾æœ€è¿‘排åº" name="sort_by_recent"/>
+ <menu_item_check label="總是由å稱排åºè³‡æ–™å¤¾" name="sort_folders_by_name"/>
+ <menu_item_check label="系統資料夾排åºåˆ°æœ€ä¸Šæ–¹" name="sort_system_folders_to_top"/>
+ <menu_item_call label="顯示éŽæ¿¾å™¨" name="show_filters"/>
+ <menu_item_call label="é‡è¨­éŽæ¿¾å™¨" name="reset_filters"/>
+ <menu_item_call label="關閉全部資料夾" name="close_folders"/>
+ <menu_item_call label="清空 Lost and Found" name="empty_lostnfound"/>
+ <menu_item_call label="儲存æ質為" name="Save Texture As"/>
+ <menu_item_call label="分享" name="Share"/>
+ <menu_item_call label="尋找原件" name="Find Original"/>
+ <menu_item_call label="尋找全部è¯çµ" name="Find All Links"/>
+ <menu_item_call label="清空垃圾筒" name="empty_trash"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_land.xml b/indra/newview/skins/default/xui/zh/menu_land.xml
new file mode 100644
index 0000000000..84941d138c
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_land.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Land Pie">
+ <menu_item_call label="關於土地" name="Place Information..."/>
+ <menu_item_call label="å在此處" name="Sit Here"/>
+ <menu_item_call label="購買這塊土地" name="Land Buy"/>
+ <menu_item_call label="購買通行權" name="Land Buy Pass"/>
+ <menu_item_call label="建造" name="Create"/>
+ <menu_item_call label="編輯地形" name="Edit Terrain"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_landmark.xml b/indra/newview/skins/default/xui/zh/menu_landmark.xml
new file mode 100644
index 0000000000..7372b223cf
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_landmark.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="landmark_overflow_menu">
+ <menu_item_call label="覆製 SLurl" name="copy"/>
+ <menu_item_call label="刪除" name="delete"/>
+ <menu_item_call label="建立精é¸åœ°é»ž" name="pick"/>
+ <menu_item_call label="添加到最愛列" name="add_to_favbar"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_login.xml b/indra/newview/skins/default/xui/zh/menu_login.xml
new file mode 100644
index 0000000000..d6bf34c66e
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_login.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu_bar name="Login Menu">
+ <menu label="自己" name="File">
+ <menu_item_call label="å好設定" name="Preferences..."/>
+ <menu_item_call label="çµæŸé€€å‡º [APP_NAME]" name="Quit"/>
+ </menu>
+ <menu label="幫助" name="Help">
+ <menu_item_call label="[SECOND_LIFE] 幫助" name="Second Life Help"/>
+ <menu_item_call label="關於 [APP_NAME]" name="About Second Life"/>
+ </menu>
+ <menu_item_check label="顯示除錯é¸å–®" name="Show Debug Menu"/>
+ <menu label="除錯" name="Debug">
+ <menu_item_call label="顯示除錯設定" name="Debug Settings"/>
+ <menu_item_call label="UI / é¡è‰² 設定" name="UI/Color Settings"/>
+ <menu_item_call label="XUI é è¦½å·¥å…·" name="UI Preview Tool"/>
+ <menu label="UI 測試" name="UI Tests"/>
+ <menu_item_call label="設定視窗尺寸大å°..." name="Set Window Size..."/>
+ <menu_item_call label="顯示 TOS" name="TOS"/>
+ <menu_item_call label="顯示嚴é‡è¨Šæ¯" name="Critical"/>
+ <menu_item_call label="媒體ç€è¦½å™¨æ¸¬è©¦" name="Web Browser Test"/>
+ <menu_item_call label="網é å…§å®¹æµ®å‹•è¦–窗測試" name="Web Content Floater Test"/>
+ <menu_item_check label="顯示網格挑é¸å™¨" name="Show Grid Picker"/>
+ <menu_item_call label="顯示通知控制å°" name="Show Notifications Console"/>
+ </menu>
+</menu_bar>
diff --git a/indra/newview/skins/default/xui/zh/menu_media_ctrl.xml b/indra/newview/skins/default/xui/zh/menu_media_ctrl.xml
new file mode 100644
index 0000000000..2ec95aa4f9
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_media_ctrl.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="media ctrl context menu">
+ <menu_item_call label="剪下" name="Cut"/>
+ <menu_item_call label="覆製" name="Copy"/>
+ <menu_item_call label="貼上" name="Paste"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_mini_map.xml b/indra/newview/skins/default/xui/zh/menu_mini_map.xml
new file mode 100644
index 0000000000..24bc6355c7
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_mini_map.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="Zoom Close" name="Zoom Close"/>
+ <menu_item_call label="Zoom Medium" name="Zoom Medium"/>
+ <menu_item_call label="Zoom Far" name="Zoom Far"/>
+ <menu_item_call label="Zoom Default" name="Zoom Default"/>
+ <menu_item_check label="旋轉地圖" name="Rotate Map"/>
+ <menu_item_check label="自動居中" name="Auto Center"/>
+ <menu_item_call label="åœæ­¢è¿½è¹¤" name="Stop Tracking"/>
+ <menu_item_call label="世界地圖" name="World Map"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_navbar.xml b/indra/newview/skins/default/xui/zh/menu_navbar.xml
new file mode 100644
index 0000000000..69df4929f2
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_navbar.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Navbar Menu">
+ <menu_item_check label="顯示座標" name="Show Coordinates"/>
+ <menu_item_check label="顯示地段屬性" name="Show Parcel Properties"/>
+ <menu_item_call label="地標" name="Landmark"/>
+ <menu_item_call label="剪下" name="Cut"/>
+ <menu_item_call label="覆製" name="Copy"/>
+ <menu_item_call label="貼上" name="Paste"/>
+ <menu_item_call label="刪除" name="Delete"/>
+ <menu_item_call label="å…¨é¸" name="Select All"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_nearby_chat.xml b/indra/newview/skins/default/xui/zh/menu_nearby_chat.xml
new file mode 100644
index 0000000000..cad462eebb
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_nearby_chat.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="NearBy Chat Menu">
+ <menu_item_call label="顯示附近的人..." name="nearby_people"/>
+ <menu_item_check label="Show Blocked Text" name="muted_text"/>
+ <menu_item_check label="Show Buddy Icons" name="show_buddy_icons"/>
+ <menu_item_check label="Show Names" name="show_names"/>
+ <menu_item_check label="Show Icons and Names" name="show_icons_and_names"/>
+ <menu_item_call label="字型尺寸" name="font_size"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_notification_well_button.xml b/indra/newview/skins/default/xui/zh/menu_notification_well_button.xml
new file mode 100644
index 0000000000..b629f73584
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_notification_well_button.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Notification Well Button Context Menu">
+ <menu_item_call label="全部關閉" name="Close All"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_object.xml b/indra/newview/skins/default/xui/zh/menu_object.xml
new file mode 100644
index 0000000000..ed41a4f0bf
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_object.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Object Pie">
+ <menu_item_call label="觸碰" name="Object Touch"/>
+ <menu_item_call label="編輯" name="Edit..."/>
+ <menu_item_call label="建造" name="Build"/>
+ <menu_item_call label="é–‹å•Ÿ" name="Open"/>
+ <menu_item_call label="å下" name="Object Sit"/>
+ <menu_item_call label="èµ·ç«‹" name="Object Stand Up"/>
+ <menu_item_call label="物件檔案" name="Object Inspect"/>
+ <menu_item_call label="Zoom In" name="Zoom In"/>
+ <context_menu label="穿上" name="Put On">
+ <menu_item_call label="穿上" name="Wear"/>
+ <menu_item_call label="添加" name="Add"/>
+ <context_menu label="Attach" name="Object Attach"/>
+ <context_menu label="Attach HUD" name="Object Attach HUD"/>
+ </context_menu>
+ <context_menu label="管ç†" name="Remove">
+ <menu_item_call label="舉報濫用" name="Report Abuse..."/>
+ <menu_item_call label="å°éŽ–" name="Object Mute"/>
+ <menu_item_call label="退回" name="Return..."/>
+ </context_menu>
+ <menu_item_call label="å–å¾—" name="Pie Object Take"/>
+ <menu_item_call label="å–得副本" name="Take Copy"/>
+ <menu_item_call label="支付" name="Pay..."/>
+ <menu_item_call label="購買" name="Buy..."/>
+ <menu_item_call label="刪除" name="Delete"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_object_icon.xml b/indra/newview/skins/default/xui/zh/menu_object_icon.xml
new file mode 100644
index 0000000000..d27e75b830
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_object_icon.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Object Icon Menu">
+ <menu_item_call label="物件檔案..." name="Object Profile"/>
+ <menu_item_call label="Block..." name="Block"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_outfit_gear.xml b/indra/newview/skins/default/xui/zh/menu_outfit_gear.xml
new file mode 100644
index 0000000000..90704fee65
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_outfit_gear.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Gear Outfit">
+ <menu_item_call label="穿上 ï¼ å–代目å‰è£æ‰®" name="wear"/>
+ <menu_item_call label="穿上 ï¼ æ·»åŠ åˆ°ç›®å‰è£æ‰®" name="wear_add"/>
+ <menu_item_call label="脫下 ï¼ ç”±ç›®å‰è£æ‰®ç§»é™¤" name="take_off"/>
+ <menu label="æ–°è¡£æœ" name="New Clothes">
+ <menu_item_call label="新襯衫" name="New Shirt"/>
+ <menu_item_call label="新褲å­" name="New Pants"/>
+ <menu_item_call label="æ–°éž‹å­" name="New Shoes"/>
+ <menu_item_call label="新襪å­" name="New Socks"/>
+ <menu_item_call label="新夾克" name="New Jacket"/>
+ <menu_item_call label="新裙å­" name="New Skirt"/>
+ <menu_item_call label="新手套" name="New Gloves"/>
+ <menu_item_call label="新內衣" name="New Undershirt"/>
+ <menu_item_call label="新內褲" name="New Underpants"/>
+ <menu_item_call label="æ–°åŠé€æ˜Ž" name="New Alpha"/>
+ <menu_item_call label="新身體物ç†" name="New Physics"/>
+ <menu_item_call label="新刺é’" name="New Tattoo"/>
+ </menu>
+ <menu label="新身體部ä½" name="New Body Parts">
+ <menu_item_call label="新體形" name="New Shape"/>
+ <menu_item_call label="新皮膚" name="New Skin"/>
+ <menu_item_call label="æ–°é ­é«®" name="New Hair"/>
+ <menu_item_call label="新眼ç›" name="New Eyes"/>
+ </menu>
+ <menu_item_call label="è£æ‰®æ›´å" name="rename"/>
+ <menu_item_call label="刪除è£æ‰®" name="delete_outfit"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_outfit_tab.xml b/indra/newview/skins/default/xui/zh/menu_outfit_tab.xml
new file mode 100644
index 0000000000..a4614710f4
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_outfit_tab.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Outfit">
+ <menu_item_call label="穿上 ï¼ å–代目å‰è£æ‰®" name="wear_replace"/>
+ <menu_item_call label="穿上 ï¼ æ·»åŠ åˆ°ç›®å‰è£æ‰®" name="wear_add"/>
+ <menu_item_call label="脫下 ï¼ ç”±ç›®å‰è£æ‰®ç§»é™¤" name="take_off"/>
+ <menu_item_call label="編輯è£æ‰®" name="edit"/>
+ <menu_item_call label="è£æ‰®æ›´å" name="rename"/>
+ <menu_item_call label="刪除è£æ‰®" name="delete"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_participant_list.xml b/indra/newview/skins/default/xui/zh/menu_participant_list.xml
new file mode 100644
index 0000000000..81ae6e4e85
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_participant_list.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Participant List Context Menu">
+ <menu_item_check label="ä¾å稱排åº" name="SortByName"/>
+ <menu_item_check label="Sort by Recent Speakers" name="SortByRecentSpeakers"/>
+ <menu_item_call label="察看檔案" name="View Profile"/>
+ <menu_item_call label="加為朋å‹" name="Add Friend"/>
+ <menu_item_call label="IM" name="IM"/>
+ <menu_item_call label="通話" name="Call"/>
+ <menu_item_call label="分享" name="Share"/>
+ <menu_item_call label="支付" name="Pay"/>
+ <menu_item_check label="察看人群圖示" name="View Icons"/>
+ <menu_item_check label="Block Voice" name="Block/Unblock"/>
+ <menu_item_check label="Block Text" name="MuteText"/>
+ <context_menu label="Moderator Options" name="Moderator Options">
+ <menu_item_check label="Allow text chat" name="AllowTextChat"/>
+ <menu_item_call label="Mute this participant" name="ModerateVoiceMuteSelected"/>
+ <menu_item_call label="Unmute this participant" name="ModerateVoiceUnMuteSelected"/>
+ <menu_item_call label="Mute everyone" name="ModerateVoiceMute"/>
+ <menu_item_call label="Unmute everyone" name="ModerateVoiceUnmute"/>
+ </context_menu>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_people_friends_view_sort.xml b/indra/newview/skins/default/xui/zh/menu_people_friends_view_sort.xml
new file mode 100644
index 0000000000..59854faeec
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_people_friends_view_sort.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_group_plus">
+ <menu_item_check label="ä¾å稱排åº" name="sort_name"/>
+ <menu_item_check label="ä¾ç‹€æ…‹æŽ’åº" name="sort_status"/>
+ <menu_item_check label="察看人群圖示" name="view_icons"/>
+ <menu_item_check label="察看許å¯æ¬Šé™" name="view_permissions"/>
+ <menu_item_call label="顯示被å°éŽ–的居民與物件" name="show_blocked_list"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_people_groups.xml b/indra/newview/skins/default/xui/zh/menu_people_groups.xml
new file mode 100644
index 0000000000..1d78c1de0a
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_people_groups.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_call label="察看資訊" name="View Info"/>
+ <menu_item_call label="èŠå¤©" name="Chat"/>
+ <menu_item_call label="通話" name="Call"/>
+ <menu_item_call label="Activate" name="Activate"/>
+ <menu_item_call label="Leave" name="Leave"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_people_groups_view_sort.xml b/indra/newview/skins/default/xui/zh/menu_people_groups_view_sort.xml
new file mode 100644
index 0000000000..1be5c69b94
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_people_groups_view_sort.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_group_plus">
+ <menu_item_check label="顯示群組圖示" name="Display Group Icons"/>
+ <menu_item_call label="脫離所é¸æ“‡çš„群組" name="Leave Selected Group"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_people_nearby.xml b/indra/newview/skins/default/xui/zh/menu_people_nearby.xml
new file mode 100644
index 0000000000..9faa35001c
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_people_nearby.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Avatar Context Menu">
+ <menu_item_call label="察看檔案" name="View Profile"/>
+ <menu_item_call label="加為朋å‹" name="Add Friend"/>
+ <menu_item_call label="Remove Friend" name="Remove Friend"/>
+ <menu_item_call label="IM" name="IM"/>
+ <menu_item_call label="通話" name="Call"/>
+ <menu_item_call label="地圖" name="Map"/>
+ <menu_item_call label="分享" name="Share"/>
+ <menu_item_call label="支付" name="Pay"/>
+ <menu_item_check label="Block/Unblock" name="Block/Unblock"/>
+ <menu_item_call label="發給瞬間傳é€è«‹æ±‚" name="teleport"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/zh/menu_people_nearby_multiselect.xml
new file mode 100644
index 0000000000..1380e0b307
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_people_nearby_multiselect.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Multi-Selected People Context Menu">
+ <menu_item_call label="加為朋å‹" name="Add Friends"/>
+ <menu_item_call label="移除朋å‹" name="Remove Friend"/>
+ <menu_item_call label="IM" name="IM"/>
+ <menu_item_call label="通話" name="Call"/>
+ <menu_item_call label="分享" name="Share"/>
+ <menu_item_call label="支付" name="Pay"/>
+ <menu_item_call label="發給瞬間傳é€è«‹æ±‚" name="teleport"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_people_nearby_view_sort.xml b/indra/newview/skins/default/xui/zh/menu_people_nearby_view_sort.xml
new file mode 100644
index 0000000000..a7f5c74b82
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_people_nearby_view_sort.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_group_plus">
+ <menu_item_check label="ä¾æœ€è¿‘說話者排åº" name="sort_by_recent_speakers"/>
+ <menu_item_check label="ä¾å稱排åº" name="sort_name"/>
+ <menu_item_check label="ä¾è·é›¢æŽ’åº" name="sort_distance"/>
+ <menu_item_check label="察看人群圖示" name="view_icons"/>
+ <menu_item_call label="顯示笨å°éŽ–的居民與物件" name="show_blocked_list"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_people_recent_view_sort.xml b/indra/newview/skins/default/xui/zh/menu_people_recent_view_sort.xml
new file mode 100644
index 0000000000..5b6e7335d6
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_people_recent_view_sort.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_group_plus">
+ <menu_item_check label="ä¾æœ€è¿‘排åº" name="sort_most"/>
+ <menu_item_check label="ä¾å稱排åº" name="sort_name"/>
+ <menu_item_check label="察看人群圖示" name="view_icons"/>
+ <menu_item_call label="顯示被å°éŽ–的居民與物件" name="show_blocked_list"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_picks.xml b/indra/newview/skins/default/xui/zh/menu_picks.xml
new file mode 100644
index 0000000000..2e88ac2d39
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_picks.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Picks">
+ <menu_item_call label="資訊" name="pick_info"/>
+ <menu_item_call label="編輯" name="pick_edit"/>
+ <menu_item_call label="瞬間傳é€" name="pick_teleport"/>
+ <menu_item_call label="地圖" name="pick_map"/>
+ <menu_item_call label="刪除" name="pick_delete"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_picks_plus.xml b/indra/newview/skins/default/xui/zh/menu_picks_plus.xml
new file mode 100644
index 0000000000..e962bd90d5
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_picks_plus.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="picks_plus_menu">
+ <menu_item_call label="æ–°ç²¾é¸åœ°é»ž" name="create_pick"/>
+ <menu_item_call label="New Classified" name="create_classified"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_place.xml b/indra/newview/skins/default/xui/zh/menu_place.xml
new file mode 100644
index 0000000000..3733baf119
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_place.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="place_overflow_menu">
+ <menu_item_call label="製作一個地標" name="landmark"/>
+ <menu_item_call label="建立精é¸åœ°é»ž" name="pick"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_place_add_button.xml b/indra/newview/skins/default/xui/zh/menu_place_add_button.xml
new file mode 100644
index 0000000000..95f8917234
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_place_add_button.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_folder_gear">
+ <menu_item_call label="添加資料夾" name="add_folder"/>
+ <menu_item_call label="添加地標" name="add_landmark"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/zh/menu_places_gear_folder.xml
new file mode 100644
index 0000000000..7f4144d14d
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_places_gear_folder.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_folder_gear">
+ <menu_item_call label="添加地標" name="add_landmark"/>
+ <menu_item_call label="添加資料夾" name="add_folder"/>
+ <menu_item_call label="還原物å“" name="restore_item"/>
+ <menu_item_call label="剪下" name="cut"/>
+ <menu_item_call label="覆製" name="copy_folder"/>
+ <menu_item_call label="貼上" name="paste"/>
+ <menu_item_call label="æ›´å" name="rename"/>
+ <menu_item_call label="刪除" name="delete"/>
+ <menu_item_call label="展開" name="expand"/>
+ <menu_item_call label="摺疊" name="collapse"/>
+ <menu_item_call label="展開全部資料夾" name="expand_all"/>
+ <menu_item_call label="摺疊全部資料夾" name="collapse_all"/>
+ <menu_item_check label="ä¾æ—¥æœŸæŽ’åº" name="sort_by_date"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/zh/menu_places_gear_landmark.xml
new file mode 100644
index 0000000000..f23d970b78
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_places_gear_landmark.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_ladmark_gear">
+ <menu_item_call label="瞬間傳é€" name="teleport"/>
+ <menu_item_call label="更多資訊" name="more_info"/>
+ <menu_item_call label="顯示在地圖上" name="show_on_map"/>
+ <menu_item_call label="添加地標" name="add_landmark"/>
+ <menu_item_call label="添加資料夾" name="add_folder"/>
+ <menu_item_call label="還原物å“" name="restore_item"/>
+ <menu_item_call label="剪下" name="cut"/>
+ <menu_item_call label="覆製地標" name="copy_landmark"/>
+ <menu_item_call label="覆製 SLurl" name="copy_slurl"/>
+ <menu_item_call label="貼上" name="paste"/>
+ <menu_item_call label="æ›´å" name="rename"/>
+ <menu_item_call label="刪除" name="delete"/>
+ <menu_item_call label="展開全部資料夾" name="expand_all"/>
+ <menu_item_call label="摺疊全部資料夾" name="collapse_all"/>
+ <menu_item_check label="ä¾æ—¥æœŸæŽ’åº" name="sort_by_date"/>
+ <menu_item_call label="建立精é¸åœ°é»ž" name="create_pick"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_profile_overflow.xml b/indra/newview/skins/default/xui/zh/menu_profile_overflow.xml
new file mode 100644
index 0000000000..ca637ae54d
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_profile_overflow.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="profile_overflow_menu">
+ <menu_item_call label="地圖" name="show_on_map"/>
+ <menu_item_call label="支付" name="pay"/>
+ <menu_item_call label="分享" name="share"/>
+ <menu_item_call label="Block" name="block"/>
+ <menu_item_call label="Unblock" name="unblock"/>
+ <menu_item_call label="踢出" name="kick"/>
+ <menu_item_call label="å‡çµ" name="freeze"/>
+ <menu_item_call label="解å‡" name="unfreeze"/>
+ <menu_item_call label="CSR" name="csr"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_save_outfit.xml b/indra/newview/skins/default/xui/zh/menu_save_outfit.xml
new file mode 100644
index 0000000000..7884df5b01
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_save_outfit.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="save_outfit_menu">
+ <menu_item_call label="儲存" name="save_outfit"/>
+ <menu_item_call label="å¦å­˜" name="save_as_new_outfit"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_script_chiclet.xml b/indra/newview/skins/default/xui/zh/menu_script_chiclet.xml
new file mode 100644
index 0000000000..e9817dd2bc
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_script_chiclet.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="ScriptChiclet Menu">
+ <menu_item_call label="關閉" name="Close"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_slurl.xml b/indra/newview/skins/default/xui/zh/menu_slurl.xml
new file mode 100644
index 0000000000..2cea18105a
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_slurl.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="關於 URL" name="about_url"/>
+ <menu_item_call label="瞬間傳é€åˆ° URL" name="teleport_to_url"/>
+ <menu_item_call label="地圖" name="show_on_map"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_teleport_history_gear.xml b/indra/newview/skins/default/xui/zh/menu_teleport_history_gear.xml
new file mode 100644
index 0000000000..d188840588
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_teleport_history_gear.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Teleport History Gear Context Menu">
+ <menu_item_call label="展開全部資料夾" name="Expand all folders"/>
+ <menu_item_call label="摺疊全部資料夾" name="Collapse all folders"/>
+ <menu_item_call label="清除瞬間傳é€æ­·å²ç´€éŒ„" name="Clear Teleport History"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_teleport_history_item.xml b/indra/newview/skins/default/xui/zh/menu_teleport_history_item.xml
new file mode 100644
index 0000000000..c636e108ad
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_teleport_history_item.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Teleport History Item Context Menu">
+ <menu_item_call label="瞬間傳é€" name="Teleport"/>
+ <menu_item_call label="更多資訊" name="More Information"/>
+ <menu_item_call label="覆製到剪貼簿" name="CopyToClipboard"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_teleport_history_tab.xml b/indra/newview/skins/default/xui/zh/menu_teleport_history_tab.xml
new file mode 100644
index 0000000000..f9107a96ed
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_teleport_history_tab.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Teleport History Item Context Menu">
+ <menu_item_call label="é–‹å•Ÿ" name="TabOpen"/>
+ <menu_item_call label="關閉" name="TabClose"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_text_editor.xml b/indra/newview/skins/default/xui/zh/menu_text_editor.xml
new file mode 100644
index 0000000000..c25f5128c3
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_text_editor.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Text editor context menu">
+ <menu_item_call label="剪下" name="Cut"/>
+ <menu_item_call label="覆製" name="Copy"/>
+ <menu_item_call label="貼上" name="Paste"/>
+ <menu_item_call label="刪除" name="Delete"/>
+ <menu_item_call label="å…¨é¸" name="Select All"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_topinfobar.xml b/indra/newview/skins/default/xui/zh/menu_topinfobar.xml
new file mode 100644
index 0000000000..debaafaa10
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_topinfobar.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_topinfobar">
+ <menu_item_check label="顯示座標" name="Show Coordinates"/>
+ <menu_item_check label="顯示地段屬性" name="Show Parcel Properties"/>
+ <menu_item_call label="地標" name="Landmark"/>
+ <menu_item_call label="覆製" name="Copy"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_url_agent.xml b/indra/newview/skins/default/xui/zh/menu_url_agent.xml
new file mode 100644
index 0000000000..592bb6561e
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_url_agent.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="顯示居民檔案" name="show_agent"/>
+ <menu_item_call label="覆製å稱到剪貼簿" name="url_copy_label"/>
+ <menu_item_call label="覆製 SLurl 到剪貼簿" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_url_group.xml b/indra/newview/skins/default/xui/zh/menu_url_group.xml
new file mode 100644
index 0000000000..de97bb731f
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_url_group.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="顯示群組資訊" name="show_group"/>
+ <menu_item_call label="覆製群組到剪貼簿" name="url_copy_label"/>
+ <menu_item_call label="覆製 SLurl 到剪貼簿" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_url_http.xml b/indra/newview/skins/default/xui/zh/menu_url_http.xml
new file mode 100644
index 0000000000..cf953576f3
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_url_http.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="開啟網é " name="url_open"/>
+ <menu_item_call label="Open in Internal Browser" name="url_open_internal"/>
+ <menu_item_call label="Open in External Browser" name="url_open_external"/>
+ <menu_item_call label="Copy URL to clipboard" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_url_inventory.xml b/indra/newview/skins/default/xui/zh/menu_url_inventory.xml
new file mode 100644
index 0000000000..8eaea68c6f
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_url_inventory.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="顯示收ç´å€ç‰©å“" name="show_item"/>
+ <menu_item_call label="覆製å稱到剪貼簿" name="url_copy_label"/>
+ <menu_item_call label="覆製 SLurl 到剪貼簿" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_url_map.xml b/indra/newview/skins/default/xui/zh/menu_url_map.xml
new file mode 100644
index 0000000000..fbda20fd2f
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_url_map.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="顯示在地圖上" name="show_on_map"/>
+ <menu_item_call label="瞬間傳é€åˆ°ä½ç½®" name="teleport_to_location"/>
+ <menu_item_call label="覆製 SLurl 到剪貼簿" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_url_objectim.xml b/indra/newview/skins/default/xui/zh/menu_url_objectim.xml
new file mode 100644
index 0000000000..b344b21c62
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_url_objectim.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="顯示物件資訊" name="show_object"/>
+ <menu_item_call label="顯示在地圖上" name="show_on_map"/>
+ <menu_item_call label="瞬間傳é€åˆ°ç‰©ä»¶ä½ç½®" name="teleport_to_object"/>
+ <menu_item_call label="覆製物件å稱到剪貼簿" name="url_copy_label"/>
+ <menu_item_call label="覆製 SLurl 到剪貼簿" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_url_parcel.xml b/indra/newview/skins/default/xui/zh/menu_url_parcel.xml
new file mode 100644
index 0000000000..330c28238f
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_url_parcel.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="顯示地段資訊" name="show_parcel"/>
+ <menu_item_call label="顯示在地圖上" name="show_on_map"/>
+ <menu_item_call label="覆製 SLurl 到剪貼簿" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_url_slapp.xml b/indra/newview/skins/default/xui/zh/menu_url_slapp.xml
new file mode 100644
index 0000000000..afc15ce13c
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_url_slapp.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Run This Command" name="run_slapp"/>
+ <menu_item_call label="覆製 SLurl 到剪貼簿" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_url_slurl.xml b/indra/newview/skins/default/xui/zh/menu_url_slurl.xml
new file mode 100644
index 0000000000..2fb247f250
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_url_slurl.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="顯示地點資訊" name="show_place"/>
+ <menu_item_call label="顯示在地圖上" name="show_on_map"/>
+ <menu_item_call label="瞬間傳é€åˆ°ä½ç½®" name="teleport_to_location"/>
+ <menu_item_call label="覆製 SLurl 到剪貼簿" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_url_teleport.xml b/indra/newview/skins/default/xui/zh/menu_url_teleport.xml
new file mode 100644
index 0000000000..e3e4b4716d
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_url_teleport.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="瞬間傳é€åˆ°é€™å€‹ä½ç½®" name="teleport"/>
+ <menu_item_call label="顯示在地圖上" name="show_on_map"/>
+ <menu_item_call label="覆製 SLurl 到剪貼簿" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_viewer.xml b/indra/newview/skins/default/xui/zh/menu_viewer.xml
new file mode 100644
index 0000000000..b6bb79bcbc
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_viewer.xml
@@ -0,0 +1,416 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu_bar name="Main Menu">
+ <menu label="自己" name="Me">
+ <menu_item_call label="å好設定" name="Preferences"/>
+ <menu_item_call label="我的塗鴉牆" name="Manage My Account"/>
+ <menu_item_call label="購買 L$" name="Buy and Sell L$"/>
+ <menu_item_call label="我的個人檔案" name="Profile"/>
+ <menu_item_call label="我的外觀" name="ChangeOutfit"/>
+ <menu_item_check label="我的庫存" name="Inventory"/>
+ <menu_item_check label="我的庫存" name="ShowSidetrayInventory"/>
+ <menu_item_check label="我的姿勢" name="Gestures"/>
+ <menu_item_check label="我的è²éŸ³" name="ShowVoice"/>
+ <menu label="移動" name="Movement">
+ <menu_item_call label="å下" name="Sit Down Here"/>
+ <menu_item_check label="飛行" name="Fly"/>
+ <menu_item_check label="總是奔跑" name="Always Run"/>
+ <menu_item_call label="åœæ­¢æˆ‘身上的動作" name="Stop Animating My Avatar"/>
+ </menu>
+ <menu label="我的狀態" name="Status">
+ <menu_item_call label="離開" name="Set Away"/>
+ <menu_item_call label="忙碌" name="Set Busy"/>
+ </menu>
+ <menu_item_call label="çµæŸé€€å‡º [APP_NAME]" name="Quit"/>
+ </menu>
+ <menu label="æºé€š" name="Communicate">
+ <menu_item_call label="我的朋å‹" name="My Friends"/>
+ <menu_item_call label="我的群組" name="My Groups"/>
+ <menu_item_check label="附近的èŠå¤©" name="Nearby Chat"/>
+ <menu_item_call label="附近的人群" name="Active Speakers"/>
+ </menu>
+ <menu label="世界" name="World">
+ <menu_item_check label="迷你地圖" name="Mini-Map"/>
+ <menu_item_check label="世界地圖" name="World Map"/>
+ <menu_item_check label="æœå°‹" name="Search"/>
+ <menu_item_call label="æ‹æ”å¿«ç…§" name="Take Snapshot"/>
+ <menu_item_call label="將此處記下地標" name="Create Landmark Here"/>
+ <menu_item_separator/>
+ <menu_item_call label="地點檔案" name="Place Profile"/>
+ <menu_item_call label="關於土地" name="About Land"/>
+ <menu_item_call label="åœ°å€ / 領地" name="Region/Estate"/>
+ <menu_item_call label="購買這塊土地" name="Buy Land"/>
+ <menu_item_call label="我的土地" name="My Land"/>
+ <menu label="顯示" name="LandShow">
+ <menu_item_check label="移動控制" name="Movement Controls"/>
+ <menu_item_check label="視角控制" name="Camera Controls"/>
+ <menu_item_check label="ç¦è¶Šç·š" name="Ban Lines"/>
+ <menu_item_check label="指標" name="beacons"/>
+ <menu_item_check label="土地邊界" name="Property Lines"/>
+ <menu_item_check label="地主" name="Land Owners"/>
+ <menu_item_check label="座標" name="Coordinates"/>
+ <menu_item_check label="地段屬性" name="Parcel Properties"/>
+ <menu_item_check label="進階é¸å–®" name="Show Advanced Menu"/>
+ </menu>
+ <menu_item_call label="瞬間瞬間傳é€å›žå®¶" name="Teleport Home"/>
+ <menu_item_call label="設定家在此處" name="Set Home to Here"/>
+ <menu label="太陽" name="Sun">
+ <menu_item_call label="日出" name="Sunrise"/>
+ <menu_item_call label="中åˆ" name="Noon"/>
+ <menu_item_call label="æ—¥è½" name="Sunset"/>
+ <menu_item_call label="åˆå¤œ" name="Midnight"/>
+ <menu_item_call label="領地時間" name="Revert to Region Default"/>
+ <menu_item_call label="環境編輯器" name="Environment Editor"/>
+ </menu>
+ </menu>
+ <menu label="建造" name="BuildTools">
+ <menu_item_check label="建造" name="Show Build Tools"/>
+ <menu label="é¸æ“‡å»ºé€ å·¥å…·" name="Select Tool">
+ <menu_item_call label="èšç„¦å·¥å…·" name="Focus"/>
+ <menu_item_call label="移動工具" name="Move"/>
+ <menu_item_call label="編輯工具" name="Edit"/>
+ <menu_item_call label="創造工具" name="Create"/>
+ <menu_item_call label="土地工具" name="Land"/>
+ </menu>
+ <menu_item_call label="è¯çµ" name="Link"/>
+ <menu_item_call label="å–消è¯çµ" name="Unlink"/>
+ <menu_item_check label="編輯è¯çµéƒ¨ä½" name="Edit Linked Parts"/>
+ <menu label="é¸æ“‡è¯çµéƒ¨ä½" name="Select Linked Parts">
+ <menu_item_call label="é¸æ“‡ä¸‹ä¸€éƒ¨ä½" name="Select Next Part"/>
+ <menu_item_call label="é¸æ“‡ä¸Šä¸€éƒ¨ä½" name="Select Previous Part"/>
+ <menu_item_call label="包括下一部ä½" name="Include Next Part"/>
+ <menu_item_call label="包括上一部ä½" name="Include Previous Part"/>
+ </menu>
+ <menu_item_call label="èšç„¦æ–¼æ‰€é¸éƒ¨ä½" name="Focus on Selection"/>
+ <menu_item_call label="縮放至所é¸éƒ¨ä½" name="Zoom to Selection"/>
+ <menu label="物件" name="Object">
+ <menu_item_call label="購買" name="Menu Object Buy"/>
+ <menu_item_call label="å–å¾—" name="Menu Object Take"/>
+ <menu_item_call label="å–得副本" name="Take Copy"/>
+ <menu_item_call label="回存到我的收ç´å€" name="Save Object Back to My Inventory"/>
+ <menu_item_call label="回存到物件內容" name="Save Object Back to Object Contents"/>
+ <menu_item_call label="退回物件" name="Return Object back to Owner"/>
+ </menu>
+ <menu label="腳本" name="Scripts">
+ <menu_item_call label="é‡æ–°ç·¨è­¯è…³æœ¬ï¼ˆMono)" name="Mono"/>
+ <menu_item_call label="é‡æ–°ç·¨è­¯è…³æœ¬ï¼ˆLSL)" name="LSL"/>
+ <menu_item_call label="é‡è¨­è…³æœ¬" name="Reset Scripts"/>
+ <menu_item_call label="設定腳本為執行中" name="Set Scripts to Running"/>
+ <menu_item_call label="設定腳本為éžåŸ·è¡Œä¸­" name="Set Scripts to Not Running"/>
+ </menu>
+ <menu label="é¸é …" name="Options">
+ <menu_item_check label="顯示進階權é™" name="DebugPermissions"/>
+ <menu_item_check label="åªé¸å–我的物件" name="Select Only My Objects"/>
+ <menu_item_check label="åªé¸å–å¯ç§»å‹•çš„物件" name="Select Only Movable Objects"/>
+ <menu_item_check label="Select By Surrounding" name="Select By Surrounding"/>
+ <menu_item_check label="Show Selection Outlines" name="Show Selection Outlines"/>
+ <menu_item_check label="Show Hidden Selection" name="Show Hidden Selection"/>
+ <menu_item_check label="Show Light Radius for Selection" name="Show Light Radius for Selection"/>
+ <menu_item_check label="Show Selection Beam" name="Show Selection Beam"/>
+ <menu_item_check label="貼齊格線" name="Snap to Grid"/>
+ <menu_item_call label="貼齊物件 XY 軸到格線" name="Snap Object XY to Grid"/>
+ <menu_item_call label="Use Selection for Grid" name="Use Selection for Grid"/>
+ <menu_item_call label="格線é¸é …" name="Grid Options"/>
+ </menu>
+ <menu label="上傳" name="Upload">
+ <menu_item_call label="圖åƒï¼ˆL$[COST])..." name="Upload Image"/>
+ <menu_item_call label="è²éŸ³ï¼ˆL$[COST])..." name="Upload Sound"/>
+ <menu_item_call label="動作(L$[COST])..." name="Upload Animation"/>
+ <menu_item_call label="大é‡ä¸Šå‚³ï¼ˆæ¯æª”案 L$[COST] )..." name="Bulk Upload"/>
+ <menu_item_call label="設定é è¨­ä¸Šå‚³æ¬Šé™" name="perm prefs"/>
+ </menu>
+ <menu_item_call label="復原" name="Undo"/>
+ <menu_item_call label="é‡åš" name="Redo"/>
+ </menu>
+ <menu label="幫助" name="Help">
+ <menu_item_call label="[SECOND_LIFE] 幫助" name="Second Life Help"/>
+ <menu_item_check label="啟用æ示" name="Enable Hints"/>
+ <menu_item_call label="舉報濫用" name="Report Abuse"/>
+ <menu_item_call label="回報臭蟲" name="Report Bug"/>
+ <menu_item_call label="關於 [APP_NAME]" name="About Second Life"/>
+ </menu>
+ <menu label="進階" name="Advanced">
+ <menu_item_call label="Rebake Textures" name="Rebake Texture"/>
+ <menu_item_call label="設定使用者界é¢å¤§å°è‡³é è¨­å€¼" name="Set UI Size to Default"/>
+ <menu_item_call label="設定視窗尺寸大å°..." name="Set Window Size..."/>
+ <menu_item_check label="é™åˆ¶é¸æ“‡è·é›¢" name="Limit Select Distance"/>
+ <menu_item_check label="Disable Camera Constraints" name="Disable Camera Distance"/>
+ <menu_item_check label="高解æžåº¦å¿«ç…§" name="HighResSnapshot"/>
+ <menu_item_check label="éœéŸ³æ‹æ”快照到硬碟" name="QuietSnapshotsToDisk"/>
+ <menu_item_check label="壓縮快照存到硬碟" name="CompressSnapshotsToDisk"/>
+ <menu label="效能工具" name="Performance Tools">
+ <menu_item_call label="Lag Meter" name="Lag Meter"/>
+ <menu_item_check label="統計列" name="Statistics Bar"/>
+ <menu_item_check label="Show Avatar Rendering Cost" name="Avatar Rendering Cost"/>
+ </menu>
+ <menu label="高亮顯示與å¯è¦‹åº¦" name="Highlighting and Visibility">
+ <menu_item_check label="Cheesy Beacon" name="Cheesy Beacon"/>
+ <menu_item_check label="éš±è—ç²’å­æ•ˆæžœ" name="Hide Particles"/>
+ <menu_item_check label="éš±è—所é¸æ“‡çš„" name="Hide Selected"/>
+ <menu_item_check label="高亮顯示é€æ˜Žç‰©ä»¶" name="Highlight Transparent"/>
+ <menu_item_check label="顯示 HUD 附件" name="Show HUD Attachments"/>
+ <menu_item_check label="顯示第一人稱視角準星" name="ShowCrosshairs"/>
+ </menu>
+ <menu label="Rendering Types" name="Rendering Types">
+ <menu_item_check label="ç°¡å–®" name="Rendering Type Simple"/>
+ <menu_item_check label="åŠé€æ˜Ž" name="Rendering Type Alpha"/>
+ <menu_item_check label="樹木" name="Rendering Type Tree"/>
+ <menu_item_check label="化身" name="Rendering Type Character"/>
+ <menu_item_check label="地表" name="Rendering Type Surface Patch"/>
+ <menu_item_check label="天空" name="Rendering Type Sky"/>
+ <menu_item_check label="æ°´æ–‡" name="Rendering Type Water"/>
+ <menu_item_check label="地é¢" name="Rendering Type Ground"/>
+ <menu_item_check label="é«”ç©" name="Rendering Type Volume"/>
+ <menu_item_check label="è‰åœ°" name="Rendering Type Grass"/>
+ <menu_item_check label="雲彩" name="Rendering Type Clouds"/>
+ <menu_item_check label="ç²’å­æ•ˆæžœ" name="Rendering Type Particles"/>
+ <menu_item_check label="碰撞" name="Rendering Type Bump"/>
+ </menu>
+ <menu label="Rendering Features" name="Rendering Features">
+ <menu_item_check label="UI" name="ToggleUI"/>
+ <menu_item_check label="Selected" name="Selected"/>
+ <menu_item_check label="Highlighted" name="Highlighted"/>
+ <menu_item_check label="Dynamic Textures" name="Dynamic Textures"/>
+ <menu_item_check label="腳步陰影" name="Foot Shadows"/>
+ <menu_item_check label="霧氣" name="Fog"/>
+ <menu_item_check label="Test FRInfo" name="Test FRInfo"/>
+ <menu_item_check label="彈性物件" name="Flexible Objects"/>
+ </menu>
+ <menu_item_check label="使用外å¦è®€å–ç·’" name="Use Plugin Read Thread"/>
+ <menu_item_call label="清除群組快å–資料" name="ClearGroupCache"/>
+ <menu_item_check label="滑鼠平滑移動" name="Mouse Smoothing"/>
+ <menu label="快速éµ" name="Shortcuts">
+ <menu_item_call label="釋出按éµ" name="Release Keys"/>
+ <menu_item_check label="顯示進階é¸å–® ï¼ èˆŠç‰ˆæ·å¾‘" name="Show Advanced Menu - legacy shortcut"/>
+ <menu_item_call label="關閉視窗" name="Close Window"/>
+ <menu_item_call label="關閉全部視窗" name="Close All Windows"/>
+ <menu_item_call label="æ‹æ”快照到硬碟" name="Snapshot to Disk"/>
+ <menu_item_call label="第一人稱視角" name="Mouselook"/>
+ <menu_item_check label="Joystick Flycam" name="Joystick Flycam"/>
+ <menu_item_call label="é‡è¨­è¦–角" name="Reset View"/>
+ <menu_item_call label="注視上一ä½èŠå¤©è€…" name="Look at Last Chatter"/>
+ <menu_item_call label="Zoom In" name="Zoom In"/>
+ <menu_item_call label="Zoom Default" name="Zoom Default"/>
+ <menu_item_call label="Zoom Out" name="Zoom Out"/>
+ </menu>
+ <menu_item_call label="顯示除錯設定" name="Debug Settings"/>
+ <menu_item_check label="顯示開發é¸å–®" name="Debug Mode"/>
+ </menu>
+ <menu label="開發" name="Develop">
+ <menu label="控制å°" name="Consoles">
+ <menu_item_check label="æ質控制å°" name="Texture Console"/>
+ <menu_item_check label="除錯控制å°" name="Debug Console"/>
+ <menu_item_call label="通知控制å°" name="Notifications"/>
+ <menu_item_check label="æ質尺寸控制å°" name="Texture Size"/>
+ <menu_item_check label="æ質分類控制å°" name="Texture Category"/>
+ <menu_item_check label="快速碼錶" name="Fast Timers"/>
+ <menu_item_check label="記憶體" name="Memory"/>
+ <menu_item_call label="地å€è³‡è¨Šå‚³è‡³é™¤éŒ¯æŽ§åˆ¶å°" name="Region Info to Debug Console"/>
+ <menu_item_call label="群組資訊至除錯控制å°" name="Group Info to Debug Console"/>
+ <menu_item_call label="Capabilities Info to Debug Console" name="Capabilities Info to Debug Console"/>
+ <menu_item_check label="æ”影機" name="Camera"/>
+ <menu_item_check label="風力" name="Wind"/>
+ <menu_item_check label="FOV" name="FOV"/>
+ <menu_item_check label="Badge" name="Badge"/>
+ </menu>
+ <menu label="顯示資訊" name="Display Info">
+ <menu_item_check label="顯示時間" name="Show Time"/>
+ <menu_item_check label="Show Render Info" name="Show Render Info"/>
+ <menu_item_check label="顯示æ質資訊" name="Show Texture Info"/>
+ <menu_item_check label="Show Matrices" name="Show Matrices"/>
+ <menu_item_check label="Show Color Under Cursor" name="Show Color Under Cursor"/>
+ <menu_item_check label="顯示記憶體" name="Show Memory"/>
+ <menu_item_check label="顯示更新到物件" name="Show Updates"/>
+ </menu>
+ <menu label="強制錯誤" name="Force Errors">
+ <menu_item_call label="強制中斷點" name="Force Breakpoint"/>
+ <menu_item_call label="強制腳本錯誤並崩潰" name="Force LLError And Crash"/>
+ <menu_item_call label="強制ä¸è‰¯çš„記憶體存å–" name="Force Bad Memory Access"/>
+ <menu_item_call label="強制無é™è¿´åœˆ" name="Force Infinite Loop"/>
+ <menu_item_call label="強制驅動程å¼å´©æ½°" name="Force Driver Carsh"/>
+ <menu_item_call label="強制軟體例外異常" name="Force Software Exception"/>
+ <menu_item_call label="強制ç€è¦½å™¨æ–·ç·š" name="Force Disconnect Viewer"/>
+ <menu_item_call label="模擬記憶體ä¸è¶³" name="Memory Leaking Simulation"/>
+ </menu>
+ <menu label="Render Tests" name="Render Tests">
+ <menu_item_check label="æ”影機ä½ç§»" name="Camera Offset"/>
+ <menu_item_check label="Randomize Framerate" name="Randomize Framerate"/>
+ <menu_item_check label="Periodic Slow Frame" name="Periodic Slow Frame"/>
+ <menu_item_check label="Frame Test" name="Frame Test"/>
+ </menu>
+ <menu label="Render Metadata" name="Render Metadata">
+ <menu_item_check label="Bounding Boxes" name="Bounding Boxes"/>
+ <menu_item_check label="Octree" name="Octree"/>
+ <menu_item_check label="Shadow Frusta" name="Shadow Frusta"/>
+ <menu_item_check label="Occlusion" name="Occlusion"/>
+ <menu_item_check label="Render Batches" name="Render Batches"/>
+ <menu_item_check label="Update Type" name="Update Type"/>
+ <menu_item_check label="Texture Anim" name="Texture Anim"/>
+ <menu_item_check label="Texture Priority" name="Texture Priority"/>
+ <menu_item_check label="Texture Area" name="Texture Area"/>
+ <menu_item_check label="Face Area" name="Face Area"/>
+ <menu_item_check label="Lights" name="Lights"/>
+ <menu_item_check label="Collision Skeleton" name="Collision Skeleton"/>
+ <menu_item_check label="Raycast" name="Raycast"/>
+ </menu>
+ <menu label="Rendering" name="Rendering">
+ <menu_item_check label="Axes" name="Axes"/>
+ <menu_item_check label="Tangent Basis" name="Tangent Basis"/>
+ <menu_item_call label="Selected Texture Info Basis" name="Selected Texture Info Basis"/>
+ <menu_item_check label="Wireframe" name="Wireframe"/>
+ <menu_item_check label="Object-Object Occlusion" name="Object-Object Occlusion"/>
+ <menu_item_check label="Framebuffer Objects" name="Framebuffer Objects"/>
+ <menu_item_check label="Lighting and Shadows" name="Lighting and Shadows"/>
+ <menu_item_check label="Shadows from Sun/Moon/Projectors" name="Shadows from Sun/Moon/Projectors"/>
+ <menu_item_check label="SSAO and Shadow Smoothing" name="SSAO and Shadow Smoothing"/>
+ <menu_item_check label="Global Illumination (experimental)" name="Global Illumination"/>
+ <menu_item_check label="GL 除錯" name="Debug GL"/>
+ <menu_item_check label="管線除錯" name="Debug Pipeline"/>
+ <menu_item_check label="自動åŠé€æ˜Žé®ç½©ï¼ˆéžå»¶ï¼‰" name="Automatic Alpha Masks (deferred)"/>
+ <menu_item_check label="自動åŠé€æ˜Žé®ç½©ï¼ˆéžéžå»¶ï¼‰" name="Automatic Alpha Masks (non-deferred)"/>
+ <menu_item_check label="Animation Textures" name="Animation Textures"/>
+ <menu_item_check label="關閉æ質" name="Disable Textures"/>
+ <menu_item_check label="Full Res Textures" name="Rull Res Textures"/>
+ <menu_item_check label="Audit Textures" name="Audit Textures"/>
+ <menu_item_check label="Texture Atlas (experimental)" name="Texture Atlas"/>
+ <menu_item_check label="Render Attached Lights" name="Render Attached Lights"/>
+ <menu_item_check label="Render Attached Particles" name="Render Attached Particles"/>
+ <menu_item_check label="Hover Glow Objects" name="Hover Glow Objects"/>
+ </menu>
+ <menu label="網路" name="Network">
+ <menu_item_check label="Pause Agent" name="AgentPause"/>
+ <menu_item_call label="Enable Message Log" name="Enable Message Log"/>
+ <menu_item_call label="Disable Message Log" name="Disable Message Log"/>
+ <menu_item_check label="Velocity Interpolate Objects" name="Velocity Interpolate Objects"/>
+ <menu_item_check label="Ping Interpolate Object Positions" name="Ping Interpolate Object Positions"/>
+ <menu_item_call label="Drop a Packet" name="Drop a Packet"/>
+ </menu>
+ <menu_item_call label="Dump Scripted Camera" name="Dump Scripted Camera"/>
+ <menu_item_call label="碰撞ã€æŽ¨æ“ èˆ‡æ‰“æ“Š" name="Bumps, Pushes &amp;amp; Hits"/>
+ <menu label="錄製器" name="Recorder">
+ <menu_item_call label="開始播放" name="Start Playback"/>
+ <menu_item_call label="åœæ­¢æ’­æ”¾" name="Stop Playback"/>
+ <menu_item_check label="循環播放" name="Loop Playback"/>
+ <menu_item_call label="開始錄製" name="Start Record"/>
+ <menu_item_call label="åœæ­¢éŒ„製" name="Stop Record"/>
+ </menu>
+ <menu label="世界" name="DevelopWorld">
+ <menu_item_check label="模擬器太陽設定覆蓋" name="Sim Sun Override"/>
+ <menu_item_check label="固定天氣" name="Fixed Weather"/>
+ <menu_item_call label="傾å°åœ°å€ç‰©ä»¶å¿«å–" name="Dump Region Object Cache"/>
+ </menu>
+ <menu label="UI" name="UI">
+ <menu_item_call label="測試媒體ç€è¦½å™¨" name="Web Browser Test"/>
+ <menu_item_call label="網é å…§å®¹ç€è¦½å™¨" name="Web Content Browser"/>
+ <menu_item_call label="Dump SelectMgr" name="Dump SelectMgr"/>
+ <menu_item_call label="傾å°æ”¶ç´å€" name="Dump Inventory"/>
+ <menu_item_call label="傾å°ç¢¼éŒ¶" name="Dump Timers"/>
+ <menu_item_call label="Dump Focus Holder" name="Dump Focus Holder"/>
+ <menu_item_call label="Print Selected Object Info" name="Print Selected Object Info"/>
+ <menu_item_call label="Print Agent Info" name="Print Agent Info"/>
+ <menu_item_call label="計憶體狀態" name="Memory Stats"/>
+ <menu_item_check label="Region Debug Console" name="Region Debug Console"/>
+ <menu_item_check label="Debug SelectMgr" name="Debug SelectMgr"/>
+ <menu_item_check label="Debug Clicks" name="Debug Clicks"/>
+ <menu_item_check label="視角除錯" name="Debug Views"/>
+ <menu_item_check label="Debug Name Tooltips" name="Debug Name Tooltips"/>
+ <menu_item_check label="滑鼠事件除錯" name="Debug Mouse Events"/>
+ <menu_item_check label="按éµé™¤éŒ¯" name="Debug Keys"/>
+ <menu_item_check label="Debug WindowProc" name="Debug WindowProc"/>
+ </menu>
+ <menu label="XUI" name="XUI">
+ <menu_item_call label="é‡æ–°è¼‰å…¥é¡è‰²è¨­å®š" name="Reload Color Settings"/>
+ <menu_item_call label="顯示字型測試" name="Show Font Test"/>
+ <menu_item_check label="顯示 XUI å稱" name="Show XUI Names"/>
+ <menu_item_call label="é€å‡ºæ¸¬è©¦ IMs" name="Send Test IMs"/>
+ <menu_item_call label="æ²–æ´—å稱快å–資料" name="Flush Names Caches"/>
+ </menu>
+ <menu label="化身" name="Character">
+ <menu label="Grab Baked Texture" name="Grab Baked Texture">
+ <menu_item_call label="Iris" name="Grab Iris"/>
+ <menu_item_call label="頭部" name="Grab Head"/>
+ <menu_item_call label="Upper Body" name="Grab Upper Body"/>
+ <menu_item_call label="Lower Body" name="Grab Lower Body"/>
+ <menu_item_call label="裙å­" name="Grab Skirt"/>
+ </menu>
+ <menu label="Character Tests" name="Character Tests">
+ <menu_item_call label="Appearance To XML" name="Appearance To XML"/>
+ <menu_item_call label="Toggle Character Geometry" name="Toggle Character Geometry"/>
+ <menu_item_call label="男性測試" name="Test Male"/>
+ <menu_item_call label="女性測試" name="Test Female"/>
+ <menu_item_call label="PG 切æ›" name="Toggle PG"/>
+ <menu_item_check label="å…許é¸æ“‡åŒ–身" name="Allow Select Avatar"/>
+ </menu>
+ <menu_item_call label="強制åƒæ•¸ç‚ºé è¨­å€¼" name="Force Params to Default"/>
+ <menu_item_check label="動作資訊" name="Animation Info"/>
+ <menu_item_check label="慢動作" name="Slow Motion Animations"/>
+ <menu_item_check label="顯示注視在" name="Show Look At"/>
+ <menu_item_check label="顯示指å‘在" name="Show Point At"/>
+ <menu_item_check label="Debug Joint Updates" name="Debug Joint Updates"/>
+ <menu_item_check label="Disable LOD" name="Disable LOD"/>
+ <menu_item_check label="Debug Character Vis" name="Debug Character Vis"/>
+ <menu_item_check label="Show Collision Skeleton" name="Show Collision Skeleton"/>
+ <menu_item_check label="Display Agent Target" name="Display Agent Target"/>
+ --&gt;
+ <menu_item_call label="Dump Attachments" name="Dump Attachments"/>
+ <menu_item_call label="Debug Avatar Textures" name="Debug Avatar Textures"/>
+ <menu_item_call label="Dump Local Textures" name="Dump Local Textures"/>
+ </menu>
+ <menu_item_check label="HTTP æ質" name="HTTP Textures"/>
+ <menu_item_call label="Compress Images" name="Compress Images"/>
+ <menu_item_check label="Output Debug Minidump" name="Output Debug Minidump"/>
+ <menu_item_check label="Console Window on next Run" name="Console Window"/>
+ <menu_item_call label="Request Admin Status" name="Request Admin Options"/>
+ <menu_item_call label="Leave Admin Status" name="Leave Admin Options"/>
+ <menu_item_check label="Show Admin Menu" name="View Admin Options"/>
+ </menu>
+ <menu label="Admin" name="Admin">
+ <menu label="Object" name="AdminObject">
+ <menu_item_call label="å–得副本" name="Admin Take Copy"/>
+ <menu_item_call label="強制æ“有者為我" name="Force Owner To Me"/>
+ <menu_item_call label="Force Owner Permissive" name="Force Owner Permissive"/>
+ <menu_item_call label="刪除" name="Delete"/>
+ <menu_item_call label="Lock" name="Lock"/>
+ <menu_item_call label="Get Assets IDs" name="Get Assets IDs"/>
+ </menu>
+ <menu label="地段" name="Parcel">
+ <menu_item_call label="強制æ“有者為我" name="Owner To Me"/>
+ <menu_item_call label="Set to Linden Content" name="Set to Linden Content"/>
+ <menu_item_call label="Claim Public Land" name="Claim Public Land"/>
+ </menu>
+ <menu label="地å€" name="Region">
+ <menu_item_call label="Dump Temp Asset Data" name="Dump Temp Asset Data"/>
+ <menu_item_call label="Save Region State" name="Save Region State"/>
+ </menu>
+ <menu_item_call label="God Tools" name="God Tools"/>
+ </menu>
+ <menu label="Admin" name="Deprecated">
+ <menu label="Attach Object" name="Attach Object"/>
+ <menu label="Detach Object" name="Detach Object"/>
+ <menu label="脫下æœè£" name="Take Off Clothing">
+ <menu_item_call label="襯衫" name="Shirt"/>
+ <menu_item_call label="褲å­" name="Pants"/>
+ <menu_item_call label="éž‹å­" name="Shoes"/>
+ <menu_item_call label="襪å­" name="Socks"/>
+ <menu_item_call label="夾克" name="Jacket"/>
+ <menu_item_call label="手套" name="Gloves"/>
+ <menu_item_call label="內衣" name="Menu Undershirt"/>
+ <menu_item_call label="內褲" name="Menu Underpants"/>
+ <menu_item_call label="裙å­" name="Skirt"/>
+ <menu_item_call label="åŠé€æ˜Ž" name="Alpha"/>
+ <menu_item_call label="刺é’" name="Tattoo"/>
+ <menu_item_call label="身體物ç†" name="Physics"/>
+ <menu_item_call label="全部衣æœ" name="All Clothes"/>
+ </menu>
+ <menu label="幫助" name="DeprecatedHelp">
+ <menu_item_call label="林登官方部è½æ ¼" name="Official Linden Blog"/>
+ <menu_item_call label="Scripting Portal" name="Scripting Portal"/>
+ <menu label="臭蟲回報" name="Bug Reporting">
+ <menu_item_call label="Public Issue Tracker" name="Public Issue Tracker"/>
+ <menu_item_call label="Public Issue Tracker Help" name="Publc Issue Tracker Help"/>
+ <menu_item_call label="臭蟲回報 101" name="Bug Reporing 101"/>
+ <menu_item_call label="Security Issues" name="Security Issues"/>
+ <menu_item_call label="QA Wiki" name="QA Wiki"/>
+ </menu>
+ </menu>
+ </menu>
+</menu_bar>
diff --git a/indra/newview/skins/default/xui/zh/menu_wearable_list_item.xml b/indra/newview/skins/default/xui/zh/menu_wearable_list_item.xml
new file mode 100644
index 0000000000..2eea314dd8
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_wearable_list_item.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Outfit Wearable Context Menu">
+ <menu_item_call label="å–代" name="wear_replace"/>
+ <menu_item_call label="Wear" name="wear_wear"/>
+ <menu_item_call label="添加" name="wear_add"/>
+ <menu_item_call label="Take Off / Detach" name="take_off_or_detach"/>
+ <menu_item_call label="å¸ä¸‹" name="detach"/>
+ <context_menu label="Attach to" name="wearable_attach_to"/>
+ <context_menu label="Attach to HUD" name="wearable_attach_to_hud"/>
+ <menu_item_call label="脫下" name="take_off"/>
+ <menu_item_call label="編輯" name="edit"/>
+ <menu_item_call label="物å“檔案" name="object_profile"/>
+ <menu_item_call label="顯示原件" name="show_original"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_wearing_gear.xml b/indra/newview/skins/default/xui/zh/menu_wearing_gear.xml
new file mode 100644
index 0000000000..d9f4acb27b
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_wearing_gear.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Gear Wearing">
+ <menu_item_call label="編輯è£æ‰®" name="edit"/>
+ <menu_item_call label="脫下" name="takeoff"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_wearing_tab.xml b/indra/newview/skins/default/xui/zh/menu_wearing_tab.xml
new file mode 100644
index 0000000000..c7d2853995
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/menu_wearing_tab.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Wearing">
+ <menu_item_call label="脫下" name="take_off"/>
+ <menu_item_call label="å¸ä¸‹" name="detach"/>
+ <menu_item_call label="編輯è£æ‰®" name="edit"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/zh/mime_types.xml b/indra/newview/skins/default/xui/zh/mime_types.xml
new file mode 100644
index 0000000000..8ac1bf6920
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/mime_types.xml
@@ -0,0 +1,217 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<mimetypes name="default">
+ <widgetset name="web">
+ <label name="web_label">
+ 網é å…§å®¹
+ </label>
+ <tooltip name="web_tooltip">
+ 這ä½ç½®æœ‰ç¶²é å…§å®¹
+ </tooltip>
+ <playtip name="web_playtip">
+ 顯示網é å…§å®¹
+ </playtip>
+ </widgetset>
+ <widgetset name="movie">
+ <label name="movie_label">
+ 影片
+ </label>
+ <tooltip name="movie_tooltip">
+ 沒有影片å¯ä»¥æ’­æ”¾
+ </tooltip>
+ <playtip name="movie_playtip">
+ 播放影片
+ </playtip>
+ </widgetset>
+ <widgetset name="image">
+ <label name="image_label">
+ 圖åƒ
+ </label>
+ <tooltip name="image_tooltip">
+ 有一個圖åƒåœ¨æ­¤ä½ç½®
+ </tooltip>
+ <playtip name="image_playtip">
+ 察看這個ä½ç½®çš„圖åƒ
+ </playtip>
+ </widgetset>
+ <widgetset name="audio">
+ <label name="audio_label">
+ 音頻
+ </label>
+ <tooltip name="audio_tooltip">
+ 有一個音頻在此ä½ç½®
+ </tooltip>
+ <playtip name="audio_playtip">
+ 播放這個硾的音頻
+ </playtip>
+ </widgetset>
+ <scheme name="rtsp">
+ <label name="rtsp_label">
+ å³æ™‚串æµ
+ </label>
+ </scheme>
+ <mimetype name="blank">
+ <label name="blank_label">
+ - ç„¡ -
+ </label>
+ </mimetype>
+ <mimetype name="none/none">
+ <label name="none/none_label">
+ - ç„¡ -
+ </label>
+ </mimetype>
+ <mimetype name="audio/*">
+ <label name="audio2_label">
+ 音頻
+ </label>
+ </mimetype>
+ <mimetype name="video/*">
+ <label name="video2_label">
+ 視頻
+ </label>
+ </mimetype>
+ <mimetype name="image/*">
+ <label name="image2_label">
+ 圖åƒ
+ </label>
+ </mimetype>
+ <mimetype name="video/vnd.secondlife.qt.legacy">
+ <label name="vnd.secondlife.qt.legacy_label">
+ 視頻(QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="application/javascript">
+ <label name="application/javascript_label">
+ Javascript
+ </label>
+ </mimetype>
+ <mimetype name="application/ogg">
+ <label name="application/ogg_label">
+ Ogg 音頻/視頻
+ </label>
+ </mimetype>
+ <mimetype name="application/pdf">
+ <label name="application/pdf_label">
+ PDF 文件
+ </label>
+ </mimetype>
+ <mimetype name="application/postscript">
+ <label name="application/postscript_label">
+ Postscript 文件
+ </label>
+ </mimetype>
+ <mimetype name="application/rtf">
+ <label name="application/rtf_label">
+ Rich Text (RTF)
+ </label>
+ </mimetype>
+ <mimetype name="application/smil">
+ <label name="application/smil_label">
+ åŒæ­¥å¤šåª’體整åˆèªžè¨€ï¼ˆSMIL)
+ </label>
+ </mimetype>
+ <mimetype name="application/xhtml+xml">
+ <label name="application/xhtml+xml_label">
+ é¸é …(XHTML)
+ </label>
+ </mimetype>
+ <mimetype name="application/x-director">
+ <label name="application/x-director_label">
+ Macromedia Director
+ </label>
+ </mimetype>
+ <mimetype name="audio/mid">
+ <label name="audio/mid_label">
+ 音頻(MIDI)
+ </label>
+ </mimetype>
+ <mimetype name="audio/mpeg">
+ <label name="audio/mpeg_label">
+ 音頻(MP3)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-aiff">
+ <label name="audio/x-aiff_label">
+ 音頻(AIFF)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-wav">
+ <label name="audio/x-wav_label">
+ 音頻(WAV)
+ </label>
+ </mimetype>
+ <mimetype name="image/bmp">
+ <label name="image/bmp_label">
+ 圖åƒï¼ˆBMP)
+ </label>
+ </mimetype>
+ <mimetype name="image/gif">
+ <label name="image/gif_label">
+ 圖åƒï¼ˆGIF)
+ </label>
+ </mimetype>
+ <mimetype name="image/jpeg">
+ <label name="image/jpeg_label">
+ 圖åƒï¼ˆJPEG)
+ </label>
+ </mimetype>
+ <mimetype name="image/png">
+ <label name="image/png_label">
+ 圖åƒï¼ˆPNG)
+ </label>
+ </mimetype>
+ <mimetype name="image/svg+xml">
+ <label name="image/svg+xml_label">
+ 圖åƒï¼ˆSVG)
+ </label>
+ </mimetype>
+ <mimetype name="image/tiff">
+ <label name="image/tiff_label">
+ 圖åƒï¼ˆTIFF)
+ </label>
+ </mimetype>
+ <mimetype name="text/html">
+ <label name="text/html_label">
+ é¸é …
+ </label>
+ </mimetype>
+ <mimetype name="text/plain">
+ <label name="text/plain_label">
+ 文字
+ </label>
+ </mimetype>
+ <mimetype name="text/xml">
+ <label name="text/xml_label">
+ XML
+ </label>
+ </mimetype>
+ <mimetype name="video/mpeg">
+ <label name="video/mpeg_label">
+ 視頻(MPEG)
+ </label>
+ </mimetype>
+ <mimetype name="video/mp4">
+ <label name="video/mp4_label">
+ 視頻(MP4)
+ </label>
+ </mimetype>
+ <mimetype name="video/quicktime">
+ <label name="video/quicktime_label">
+ 視頻(QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-asf">
+ <label name="video/x-ms-asf_label">
+ 視頻(Windows Media ASF)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-wmv">
+ <label name="video/x-ms-wmv_label">
+ 視頻(Windows Media WMV)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-msvideo">
+ <label name="video/x-msvideo_label">
+ 視頻(AVI)
+ </label>
+ </mimetype>
+</mimetypes>
diff --git a/indra/newview/skins/default/xui/zh/mime_types_linux.xml b/indra/newview/skins/default/xui/zh/mime_types_linux.xml
new file mode 100644
index 0000000000..90f17b841c
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/mime_types_linux.xml
@@ -0,0 +1,217 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<mimetypes name="default">
+ <widgetset name="web">
+ <label name="web_label">
+ 網é å…§å®¹
+ </label>
+ <tooltip name="web_tooltip">
+ This location has Web content
+ </tooltip>
+ <playtip name="web_playtip">
+ 顯示網é å…§å®¹
+ </playtip>
+ </widgetset>
+ <widgetset name="movie">
+ <label name="movie_label">
+ 影片
+ </label>
+ <tooltip name="movie_tooltip">
+ 沒有影片å¯ä»¥æ’­æ”¾
+ </tooltip>
+ <playtip name="movie_playtip">
+ 播放影片
+ </playtip>
+ </widgetset>
+ <widgetset name="image">
+ <label name="image_label">
+ 圖åƒ
+ </label>
+ <tooltip name="image_tooltip">
+ There is an image at this location
+ </tooltip>
+ <playtip name="image_playtip">
+ 察看這個ä½ç½®çš„圖åƒ
+ </playtip>
+ </widgetset>
+ <widgetset name="audio">
+ <label name="audio_label">
+ 音頻
+ </label>
+ <tooltip name="audio_tooltip">
+ 有一個音頻在此ä½ç½®
+ </tooltip>
+ <playtip name="audio_playtip">
+ 播放這個ä½ç½®çš„音頻
+ </playtip>
+ </widgetset>
+ <scheme name="rtsp">
+ <label name="rtsp_label">
+ å³æ™‚串æµ
+ </label>
+ </scheme>
+ <mimetype name="blank">
+ <label name="blank_label">
+ - ç„¡ -
+ </label>
+ </mimetype>
+ <mimetype name="none/none">
+ <label name="none/none_label">
+ - ç„¡ -
+ </label>
+ </mimetype>
+ <mimetype name="audio/*">
+ <label name="audio2_label">
+ 音頻
+ </label>
+ </mimetype>
+ <mimetype name="video/*">
+ <label name="video2_label">
+ 影片
+ </label>
+ </mimetype>
+ <mimetype name="image/*">
+ <label name="image2_label">
+ 圖åƒ
+ </label>
+ </mimetype>
+ <mimetype name="video/vnd.secondlife.qt.legacy">
+ <label name="vnd.secondlife.qt.legacy_label">
+ 視頻(QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="application/javascript">
+ <label name="application/javascript_label">
+ Javascript
+ </label>
+ </mimetype>
+ <mimetype name="application/ogg">
+ <label name="application/ogg_label">
+ Ogg 音頻/視頻
+ </label>
+ </mimetype>
+ <mimetype name="application/pdf">
+ <label name="application/pdf_label">
+ PDF 文件
+ </label>
+ </mimetype>
+ <mimetype name="application/postscript">
+ <label name="application/postscript_label">
+ Postscript 文件
+ </label>
+ </mimetype>
+ <mimetype name="application/rtf">
+ <label name="application/rtf_label">
+ Rich Text (RTF)
+ </label>
+ </mimetype>
+ <mimetype name="application/smil">
+ <label name="application/smil_label">
+ Synchronized Multimedia Integration Language (SMIL)
+ </label>
+ </mimetype>
+ <mimetype name="application/xhtml+xml">
+ <label name="application/xhtml+xml_label">
+ é¸é …(XHTML)
+ </label>
+ </mimetype>
+ <mimetype name="application/x-director">
+ <label name="application/x-director_label">
+ Macromedia Director
+ </label>
+ </mimetype>
+ <mimetype name="audio/mid">
+ <label name="audio/mid_label">
+ 音頻(MIDI)
+ </label>
+ </mimetype>
+ <mimetype name="audio/mpeg">
+ <label name="audio/mpeg_label">
+ 音頻(MP3)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-aiff">
+ <label name="audio/x-aiff_label">
+ 音頻(AIFF)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-wav">
+ <label name="audio/x-wav_label">
+ 音頻(WAV)
+ </label>
+ </mimetype>
+ <mimetype name="image/bmp">
+ <label name="image/bmp_label">
+ 圖åƒï¼ˆBMP)
+ </label>
+ </mimetype>
+ <mimetype name="image/gif">
+ <label name="image/gif_label">
+ 圖åƒï¼ˆGIF)
+ </label>
+ </mimetype>
+ <mimetype name="image/jpeg">
+ <label name="image/jpeg_label">
+ 圖åƒï¼ˆJPEG)
+ </label>
+ </mimetype>
+ <mimetype name="image/png">
+ <label name="image/png_label">
+ 圖åƒï¼ˆPNG)
+ </label>
+ </mimetype>
+ <mimetype name="image/svg+xml">
+ <label name="image/svg+xml_label">
+ 圖åƒï¼ˆSVG)
+ </label>
+ </mimetype>
+ <mimetype name="image/tiff">
+ <label name="image/tiff_label">
+ 圖åƒï¼ˆTIFF)
+ </label>
+ </mimetype>
+ <mimetype name="text/html">
+ <label name="text/html_label">
+ é¸é …
+ </label>
+ </mimetype>
+ <mimetype name="text/plain">
+ <label name="text/plain_label">
+ 文字
+ </label>
+ </mimetype>
+ <mimetype name="text/xml">
+ <label name="text/xml_label">
+ XML
+ </label>
+ </mimetype>
+ <mimetype name="video/mpeg">
+ <label name="video/mpeg_label">
+ 視頻(MPEG)
+ </label>
+ </mimetype>
+ <mimetype name="video/mp4">
+ <label name="video/mp4_label">
+ 視頻(MP4)
+ </label>
+ </mimetype>
+ <mimetype name="video/quicktime">
+ <label name="video/quicktime_label">
+ 視頻(QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-asf">
+ <label name="video/x-ms-asf_label">
+ 視頻(Windows Media ASF)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-wmv">
+ <label name="video/x-ms-wmv_label">
+ 視頻(Windows Media WMV)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-msvideo">
+ <label name="video/x-msvideo_label">
+ 視頻(AVI)
+ </label>
+ </mimetype>
+</mimetypes>
diff --git a/indra/newview/skins/default/xui/zh/mime_types_mac.xml b/indra/newview/skins/default/xui/zh/mime_types_mac.xml
new file mode 100644
index 0000000000..b8105c145c
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/mime_types_mac.xml
@@ -0,0 +1,217 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<mimetypes name="default">
+ <widgetset name="web">
+ <label name="web_label">
+ 網é å…§å®¹
+ </label>
+ <tooltip name="web_tooltip">
+ 這個ä½ç½®æœ‰ç¶²é å…§å®¹
+ </tooltip>
+ <playtip name="web_playtip">
+ 顯示網é å…§å®¹
+ </playtip>
+ </widgetset>
+ <widgetset name="movie">
+ <label name="movie_label">
+ 影片
+ </label>
+ <tooltip name="movie_tooltip">
+ 沒有影片å¯ä»¥æ’­æ”¾
+ </tooltip>
+ <playtip name="movie_playtip">
+ 播放影片
+ </playtip>
+ </widgetset>
+ <widgetset name="image">
+ <label name="image_label">
+ 圖åƒ
+ </label>
+ <tooltip name="image_tooltip">
+ 有一個圖åƒåœ¨æ­¤ä½ç½®
+ </tooltip>
+ <playtip name="image_playtip">
+ 察看在此ä½ç½®çš„圖åƒ
+ </playtip>
+ </widgetset>
+ <widgetset name="audio">
+ <label name="audio_label">
+ 音頻
+ </label>
+ <tooltip name="audio_tooltip">
+ 有一個音頻在此ä½ç½®
+ </tooltip>
+ <playtip name="audio_playtip">
+ 播放在此ä½ç½®çš„音頻
+ </playtip>
+ </widgetset>
+ <scheme name="rtsp">
+ <label name="rtsp_label">
+ å³æ™‚串æµ
+ </label>
+ </scheme>
+ <mimetype name="blank">
+ <label name="blank_label">
+ - ç„¡ -
+ </label>
+ </mimetype>
+ <mimetype name="none/none">
+ <label name="none/none_label">
+ - ç„¡ -
+ </label>
+ </mimetype>
+ <mimetype name="audio/*">
+ <label name="audio2_label">
+ 音頻
+ </label>
+ </mimetype>
+ <mimetype name="video/*">
+ <label name="video2_label">
+ 視頻
+ </label>
+ </mimetype>
+ <mimetype name="image/*">
+ <label name="image2_label">
+ 圖åƒ
+ </label>
+ </mimetype>
+ <mimetype name="video/vnd.secondlife.qt.legacy">
+ <label name="vnd.secondlife.qt.legacy_label">
+ 視頻 (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="application/javascript">
+ <label name="application/javascript_label">
+ Javascript
+ </label>
+ </mimetype>
+ <mimetype name="application/ogg">
+ <label name="application/ogg_label">
+ OGG 音頻/視頻
+ </label>
+ </mimetype>
+ <mimetype name="application/pdf">
+ <label name="application/pdf_label">
+ PDF 文件
+ </label>
+ </mimetype>
+ <mimetype name="application/postscript">
+ <label name="application/postscript_label">
+ Postscript 文件
+ </label>
+ </mimetype>
+ <mimetype name="application/rtf">
+ <label name="application/rtf_label">
+ Rich Text (RTF)
+ </label>
+ </mimetype>
+ <mimetype name="application/smil">
+ <label name="application/smil_label">
+ åŒæ­¥å¤šåª’體整åˆèªžè¨€ï¼ˆSMIL)
+ </label>
+ </mimetype>
+ <mimetype name="application/xhtml+xml">
+ <label name="application/xhtml+xml_label">
+ 網é ï¼ˆXHTML)
+ </label>
+ </mimetype>
+ <mimetype name="application/x-director">
+ <label name="application/x-director_label">
+ Macromedia Director
+ </label>
+ </mimetype>
+ <mimetype name="audio/mid">
+ <label name="audio/mid_label">
+ 音頻 (MIDI)
+ </label>
+ </mimetype>
+ <mimetype name="audio/mpeg">
+ <label name="audio/mpeg_label">
+ 音頻(MP3)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-aiff">
+ <label name="audio/x-aiff_label">
+ 音頻(AIFF)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-wav">
+ <label name="audio/x-wav_label">
+ 音頻(WAV)
+ </label>
+ </mimetype>
+ <mimetype name="image/bmp">
+ <label name="image/bmp_label">
+ 圖åƒï¼ˆBMP)
+ </label>
+ </mimetype>
+ <mimetype name="image/gif">
+ <label name="image/gif_label">
+ 圖åƒï¼ˆGIF)
+ </label>
+ </mimetype>
+ <mimetype name="image/jpeg">
+ <label name="image/jpeg_label">
+ 圖åƒï¼ˆJPEG)
+ </label>
+ </mimetype>
+ <mimetype name="image/png">
+ <label name="image/png_label">
+ 圖åƒï¼ˆPNG)
+ </label>
+ </mimetype>
+ <mimetype name="image/svg+xml">
+ <label name="image/svg+xml_label">
+ 圖åƒï¼ˆSVG)
+ </label>
+ </mimetype>
+ <mimetype name="image/tiff">
+ <label name="image/tiff_label">
+ 圖åƒï¼ˆTIFF)
+ </label>
+ </mimetype>
+ <mimetype name="text/html">
+ <label name="text/html_label">
+ 網é 
+ </label>
+ </mimetype>
+ <mimetype name="text/plain">
+ <label name="text/plain_label">
+ 文字
+ </label>
+ </mimetype>
+ <mimetype name="text/xml">
+ <label name="text/xml_label">
+ XML
+ </label>
+ </mimetype>
+ <mimetype name="video/mpeg">
+ <label name="video/mpeg_label">
+ 視頻(MPEG)
+ </label>
+ </mimetype>
+ <mimetype name="video/mp4">
+ <label name="video/mp4_label">
+ 視頻(MP4)
+ </label>
+ </mimetype>
+ <mimetype name="video/quicktime">
+ <label name="video/quicktime_label">
+ 視頻(QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-asf">
+ <label name="video/x-ms-asf_label">
+ 視頻(Windows Media ASF)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-wmv">
+ <label name="video/x-ms-wmv_label">
+ 視頻(Windows Media WMV)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-msvideo">
+ <label name="video/x-msvideo_label">
+ 視頻(AVI)
+ </label>
+ </mimetype>
+</mimetypes>
diff --git a/indra/newview/skins/default/xui/zh/notifications.xml b/indra/newview/skins/default/xui/zh/notifications.xml
new file mode 100644
index 0000000000..3fa8ff3f78
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/notifications.xml
@@ -0,0 +1,2952 @@
+<?xml version="1.0" encoding="utf-8"?>
+<notifications>
+ <global name="skipnexttime">
+ ä¸å†é¡¯ç¤ºæ­¤æ醒
+ </global>
+ <global name="alwayschoose">
+ 總是é¸å–這個é¸é …
+ </global>
+ <global name="implicitclosebutton">
+ 關閉
+ </global>
+ <template name="okbutton">
+ <form>
+ <button name="OK_okbutton" text="$yestext"/>
+ </form>
+ </template>
+ <template name="okignore">
+ <form>
+ <button name="OK_okignore" text="$yestext"/>
+ </form>
+ </template>
+ <template name="okcancelbuttons">
+ <form>
+ <button name="OK_okcancelbuttons" text="$yestext"/>
+ <button name="Cancel_okcancelbuttons" text="$notext"/>
+ </form>
+ </template>
+ <template name="okcancelignore">
+ <form>
+ <button name="OK_okcancelignore" text="$yestext"/>
+ <button name="Cancel_okcancelignore" text="$notext"/>
+ </form>
+ </template>
+ <template name="okhelpbuttons">
+ <form>
+ <button name="OK_okhelpbuttons" text="$yestext"/>
+ <button name="Help" text="$helptext"/>
+ </form>
+ </template>
+ <template name="yesnocancelbuttons">
+ <form>
+ <button name="Yes" text="$yestext"/>
+ <button name="No" text="$notext"/>
+ <button name="Cancel_yesnocancelbuttons" text="$canceltext"/>
+ </form>
+ </template>
+ <notification label="未知的通知訊æ¯" name="MissingAlert">
+ Your version of [APP_NAME] does not know how to display the notification it just received. Please verify that you have the latest Viewer installed.
+
+Error details: The notification called &apos;[_NAME]&apos; was not found in notifications.xml.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="FloaterNotFound">
+ Floater error: Could not find the following controls:
+
+[CONTROLS]
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="TutorialNotFound">
+ No tutorial is currently available.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="GenericAlert">
+ [MESSAGE]
+ </notification>
+ <notification name="GenericAlertYesCancel">
+ [MESSAGE]
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="是"/>
+ </notification>
+ <notification name="BadInstallation">
+ An error occurred while updating [APP_NAME]. Please [http://get.secondlife.com download the latest version] of the Viewer.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="LoginFailedNoNetwork">
+ 無法連接到[SECOND_LIFE_GRID].
+ &apos;[DIAGNOSTIC]&apos;
+請確定你的網際網路是正常é‹ä½œçš„。
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="MessageTemplateNotFound">
+ Message Template [PATH] not found.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="WearableSave">
+ 除存變更到目å‰çš„è¡£æœ/身體部ä½ï¼Ÿ
+ <usetemplate canceltext="å–消" name="yesnocancelbuttons" notext="ä¸è¦å„²å­˜" yestext="儲存"/>
+ </notification>
+ <notification name="CompileQueueSaveText">
+ There was a problem uploading the text for a script due to the following reason: [REASON]. Please try again later.
+ </notification>
+ <notification name="CompileQueueSaveBytecode">
+ There was a problem uploading the compiled script due to the following reason: [REASON]. Please try again later.
+ </notification>
+ <notification name="WriteAnimationFail">
+ There was a problem writing animation data. Please try again later.
+ </notification>
+ <notification name="UploadAuctionSnapshotFail">
+ There was a problem uploading the auction snapshot due to the following reason: [REASON]
+ </notification>
+ <notification name="UnableToViewContentsMoreThanOne">
+ Unable to view the contents of more than one item at a time.
+Please select only one object and try again.
+ </notification>
+ <notification name="SaveClothingBodyChanges">
+ 儲存全部æœè£æˆ–身體部ä½çš„變更?
+ <usetemplate canceltext="å–消" name="yesnocancelbuttons" notext="ä¸è¦å„²å­˜" yestext="全部儲存"/>
+ </notification>
+ <notification name="FriendsAndGroupsOnly">
+ Non-friends won&apos;t know that you&apos;ve choosen to ignore their calls and instant messages.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="FavoritesOnLogin">
+ Note: When you turn on this option, anyone who uses this computer can see your list of favorite locations.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="GrantModifyRights">
+ Granting modify rights to another Resident allows them to change, delete or take ANY objects you may have in-world. Be VERY careful when handing out this permission.
+Do you want to grant modify rights for [NAME]?
+ <usetemplate name="okcancelbuttons" notext="No" yestext="是"/>
+ </notification>
+ <notification name="GrantModifyRightsMultiple">
+ Granting modify rights to another Resident allows them to change ANY objects you may have in-world. Be VERY careful when handing out this permission.
+Do you want to grant modify rights for the selected Residents?
+ <usetemplate name="okcancelbuttons" notext="å¦" yestext="是"/>
+ </notification>
+ <notification name="RevokeModifyRights">
+ Do you want to revoke modify rights for [NAME]?
+ <usetemplate name="okcancelbuttons" notext="å¦" yestext="是"/>
+ </notification>
+ <notification name="RevokeModifyRightsMultiple">
+ Do you want to revoke modify rights for the selected Residents?
+ <usetemplate name="okcancelbuttons" notext="å¦" yestext="是"/>
+ </notification>
+ <notification name="UnableToCreateGroup">
+ 無法建立新群組。
+[MESSAGE]
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="PanelGroupApply">
+ [NEEDS_APPLY_MESSAGE]
+[WANT_APPLY_MESSAGE]
+ <usetemplate canceltext="å–消" name="yesnocancelbuttons" notext="忽視變更" yestext="套用變更"/>
+ </notification>
+ <notification name="MustSpecifyGroupNoticeSubject">
+ 你必須指定一個主旨以é€å‡ºç¾¤çµ„通知。
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="AddGroupOwnerWarning">
+ You are about to add group members to the role of [ROLE_NAME].
+Members cannot be removed from that role.
+The members must resign from the role themselves.
+Are you sure you want to continue?
+ <usetemplate ignoretext="在我添加一個新的群組æ“有者å‰ç¢ºèª" name="okcancelignore" notext="å¦" yestext="是"/>
+ </notification>
+ <notification name="AssignDangerousActionWarning">
+ You are about to add the Ability &apos;[ACTION_NAME]&apos; to the Role &apos;[ROLE_NAME]&apos;.
+
+ *WARNING*
+ Any Member in a Role with this Ability can assign themselves -- and any other member -- to Roles that have more powers than they currently have, potentially elevating themselves to near-Owner power. Be sure you know what you&apos;re doing before assigning this Ability.
+
+Add this Ability to &apos;[ROLE_NAME]&apos;?
+ <usetemplate name="okcancelbuttons" notext="å¦" yestext="是"/>
+ </notification>
+ <notification name="AssignDangerousAbilityWarning">
+ You are about to add the Ability &apos;[ACTION_NAME]&apos; to the Role &apos;[ROLE_NAME]&apos;.
+
+ *WARNING*
+ Any Member in a Role with this Ability can assign themselves -- and any other member -- all Abilities, elevating themselves to near-Owner power.
+
+Add this Ability to &apos;[ROLE_NAME]&apos;?
+ <usetemplate name="okcancelbuttons" notext="å¦" yestext="是"/>
+ </notification>
+ <notification name="AttachmentDrop">
+ You are about to drop your attachment.
+ Are you sure you want to continue?
+ <usetemplate ignoretext="在丟下附件å‰ç¢ºèª" name="okcancelignore" notext="å¦" yestext="是"/>
+ </notification>
+ <notification name="JoinGroupCanAfford">
+ 加入此群組須花費 L$[COST]。
+你確定è¦ç¹¼çºŒå—Žï¼Ÿ
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="加入"/>
+ </notification>
+ <notification name="JoinGroupNoCost">
+ You are joining group [NAME].
+Do you wish to proceed?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="加入"/>
+ </notification>
+ <notification name="JoinGroupCannotAfford">
+ Joining this group costs L$[COST].
+You do not have enough L$ to join this group.
+ </notification>
+ <notification name="CreateGroupCost">
+ Creating this group will cost L$100.
+Groups need more than one member, or they are deleted forever.
+Please invite members within 48 hours.
+ <usetemplate canceltext="å–消" name="okcancelbuttons" notext="å–消" yestext="花費 L$100 建立群組"/>
+ </notification>
+ <notification name="LandBuyPass">
+ For L$[COST] you can enter this land (&apos;[PARCEL_NAME]&apos;) for [TIME] hours. Buy a pass?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="SalePriceRestriction">
+ Sale price must be set to more than L$0 if selling to anyone.
+Please select an individual to sell to if selling for L$0.
+ </notification>
+ <notification name="ConfirmLandSaleChange">
+ The selected [LAND_SIZE] m² land is being set for sale.
+Your selling price will be L$[SALE_PRICE] and will be authorized for sale to [NAME].
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmLandSaleToAnyoneChange">
+ ATTENTION: Clicking &apos;sell to anyone&apos; makes your land available to the entire [SECOND_LIFE] community, even those not in this region.
+
+The selected [LAND_SIZE] m² land is being set for sale.
+Your selling price will be L$[SALE_PRICE] and will be authorized for sale to [NAME].
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="ReturnObjectsDeededToGroup">
+ Are you sure you want to return all objects shared with the group &apos;[NAME]&apos; on this parcel of land back to their previous owner&apos;s inventory?
+
+*WARNING* This will delete the non-transferable objects deeded to the group!
+
+Objects: [N]
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="ReturnObjectsOwnedByUser">
+ Are you sure you want to return all objects owned by the Resident &apos;[NAME]&apos; on this parcel of land back to their inventory?
+
+Objects: [N]
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="ReturnObjectsOwnedBySelf">
+ Are you sure you want to return all objects owned by you on this parcel of land back to your inventory?
+
+Objects: [N]
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="ReturnObjectsNotOwnedBySelf">
+ Are you sure you want to return all objects NOT owned by you on this parcel of land back to their owner&apos;s inventory?
+Transferable objects deeded to a group will be returned to their previous owners.
+
+*WARNING* This will delete the non-transferable objects deeded to the group!
+
+Objects: [N]
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="ReturnObjectsNotOwnedByUser">
+ Are you sure you want to return all objects NOT owned by [NAME] on this parcel of land back to their owner&apos;s inventory?
+Transferable objects deeded to a group will be returned to their previous owners.
+
+*WARNING* This will delete the non-transferable objects deeded to the group!
+
+Objects: [N]
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="ReturnAllTopObjects">
+ Are you sure you want to return all listed objects back to their owner&apos;s inventory?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="DisableAllTopObjects">
+ Are you sure you want to disable all objects in this region?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="ReturnObjectsNotOwnedByGroup">
+ Return the objects on this parcel of land that are NOT shared with the group [NAME] back to their owners?
+
+Objects: [N]
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="UnableToDisableOutsideScripts">
+ Can not disable scripts.
+This entire region is damage enabled.
+Scripts must be allowed to run for weapons to work.
+ </notification>
+ <notification name="MultipleFacesSelected">
+ Multiple faces are currently selected.
+If you continue this action, separate instances of media will be set on multiple faces of the object.
+To place the media on only one face, choose Select Face and click on the desired face of that object then click Add.
+ <usetemplate ignoretext="Media will be set on multiple selected faces" name="okcancelignore" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="MustBeInParcel">
+ You must be standing inside the land parcel to set its Landing Point.
+ </notification>
+ <notification name="PromptRecipientEmail">
+ Please enter a valid email address for the recipient(s).
+ </notification>
+ <notification name="PromptSelfEmail">
+ Please enter your email address.
+ </notification>
+ <notification name="PromptMissingSubjMsg">
+ Email snapshot with the default subject or message?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="ErrorProcessingSnapshot">
+ Error processing snapshot data
+ </notification>
+ <notification name="ErrorEncodingSnapshot">
+ Error encoding snapshot.
+ </notification>
+ <notification name="ErrorUploadingPostcard">
+ There was a problem sending a snapshot due to the following reason: [REASON]
+ </notification>
+ <notification name="ErrorUploadingReportScreenshot">
+ There was a problem uploading a report screenshot due to the following reason: [REASON]
+ </notification>
+ <notification name="MustAgreeToLogIn">
+ You must agree to the Terms of Service to continue logging into [SECOND_LIFE].
+ </notification>
+ <notification name="CouldNotPutOnOutfit">
+ Could not put on outfit.
+The outfit folder contains no clothing, body parts, or attachments.
+ </notification>
+ <notification name="CannotWearTrash">
+ You can not wear clothes or body parts that are in the trash
+ </notification>
+ <notification name="MaxAttachmentsOnOutfit">
+ Could not attach object.
+Exceeds the attachments limit of [MAX_ATTACHMENTS] objects. Please detach another object first.
+ </notification>
+ <notification name="CannotWearInfoNotComplete">
+ You can not wear that item because it has not yet loaded. Please try again in a minute.
+ </notification>
+ <notification name="MustHaveAccountToLogIn">
+ Oops! Something was left blank.
+You need to enter the Username name of your avatar.
+
+You need an account to enter [SECOND_LIFE]. Would you like to create one now?
+ <url name="url">
+ http://join.secondlife.com/
+ </url>
+ <usetemplate name="okcancelbuttons" notext="å†è©¦ä¸€æ¬¡" yestext="創造新帳戶"/>
+ </notification>
+ <notification name="InvalidCredentialFormat">
+ You need to enter either the Username or both the First and Last name of your avatar into the Username field, then login again.
+ </notification>
+ <notification name="DeleteClassified">
+ Delete classified &apos;[NAME]&apos;?
+There is no reimbursement for fees paid.
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="DeleteMedia">
+ You have selected to delete the media associated with this face.
+Are you sure you want to continue?
+ <usetemplate ignoretext="在我由一個部件中刪除媒體å‰ç¢ºèª" name="okcancelignore" notext="å¦" yestext="是"/>
+ </notification>
+ <notification name="ClassifiedSave">
+ Save changes to classified [NAME]?
+ <usetemplate canceltext="å–消" name="yesnocancelbuttons" notext="ä¸è¦å„²å­˜" yestext="儲存"/>
+ </notification>
+ <notification name="ClassifiedInsufficientFunds">
+ Insufficient funds to create classified.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="DeleteAvatarPick">
+ Delete pick &lt;nolink&gt;[PICK]&lt;/nolink&gt;?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="DeleteOutfits">
+ 刪除所é¸æ“‡çš„è£æ‰®ï¼Ÿ
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="PromptGoToEventsPage">
+ å‰å¾€ [SECOND_LIFE] 事件網é ï¼Ÿ
+ <url name="url">
+ http://secondlife.com/events/
+ </url>
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="SelectProposalToView">
+ Please select a proposal to view.
+ </notification>
+ <notification name="SelectHistoryItemToView">
+ è«‹é¸æ“‡ä¸€å€‹æ­·å²ç´€éŒ„物å“去察看。
+ </notification>
+ <notification name="CacheWillClear">
+ 當你é‡æ–°å•Ÿå‹• [APP_NAME] 後快å–資料將會被清除。
+ </notification>
+ <notification name="CacheWillBeMoved">
+ 當你é‡æ–°å•Ÿå‹• [APP_NAME] 後快å–資料將被移動。
+注æ„:這將會清除快å–資料。
+ </notification>
+ <notification name="ChangeConnectionPort">
+ Port settings take effect after you restart [APP_NAME].
+ </notification>
+ <notification name="ChangeSkin">
+ The new skin will appear after you restart [APP_NAME].
+ </notification>
+ <notification name="ChangeLanguage">
+ Changing language will take effect after you restart [APP_NAME].
+ </notification>
+ <notification name="GoToAuctionPage">
+ å‰å¾€ [SECOND_LIFE] 網é åŽ»å¯Ÿçœ‹æ‹è³£ç´°ç¯€æˆ–下標?
+ <url name="url">
+ http://secondlife.com/auctions/auction-detail.php?id=[AUCTION_ID]
+ </url>
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="SaveChanges">
+ Save Changes?
+ <usetemplate canceltext="å–消" name="yesnocancelbuttons" notext="ä¸è¦å„²å­˜" yestext="儲存"/>
+ </notification>
+ <notification name="GestureSaveFailedTooManySteps">
+ Gesture save failed.
+This gesture has too many steps.
+Try removing some steps, then save again.
+ </notification>
+ <notification name="GestureSaveFailedTryAgain">
+ Gesture save failed. Please try again in a minute.
+ </notification>
+ <notification name="GestureSaveFailedObjectNotFound">
+ Could not save gesture because the object or the associated object inventory could not be found.
+The object may be out of range or may have been deleted.
+ </notification>
+ <notification name="GestureSaveFailedReason">
+ There was a problem saving a gesture due to the following reason: [REASON]. Please try resaving the gesture later.
+ </notification>
+ <notification name="SaveNotecardFailObjectNotFound">
+ Could not save notecard because the object or the associated object inventory could not be found.
+The object may be out of range or may have been deleted.
+ </notification>
+ <notification name="SaveNotecardFailReason">
+ There was a problem saving a notecard due to the following reason: [REASON]. Please try re-saving the notecard later.
+ </notification>
+ <notification name="ScriptCannotUndo">
+ Could not undo all changes in your version of the script.
+Would you like to load the server&apos;s last saved version?
+(**Warning** This operation cannot be undone.)
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="SaveScriptFailReason">
+ There was a problem saving a script due to the following reason: [REASON]. Please try re-saving the script later.
+ </notification>
+ <notification name="SaveScriptFailObjectNotFound">
+ Could not save the script because the object it is in could not be found.
+The object may be out of range or may have been deleted.
+ </notification>
+ <notification name="SaveBytecodeFailReason">
+ There was a problem saving a compiled script due to the following reason: [REASON]. Please try re-saving the script later.
+ </notification>
+ <notification name="StartRegionEmpty">
+ Oops, Your Start Region is not defined.
+Please type the Region name in Start Location box or choose My Last Location or My Home as your Start Location.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="CouldNotStartStopScript">
+ Could not start or stop the script because the object it is on could not be found.
+The object may be out of range or may have been deleted.
+ </notification>
+ <notification name="CannotDownloadFile">
+ Unable to download file
+ </notification>
+ <notification name="CannotWriteFile">
+ Unable to write file [[FILE]]
+ </notification>
+ <notification name="UnsupportedHardware">
+ Just so you know, your computer does not meet [APP_NAME]&apos;s minimum system requirements. You may experience poor performance. Unfortunately, the [SUPPORT_SITE] can&apos;t provide technical support for unsupported system configurations.
+
+Visit [_URL] for more information?
+ <url name="url">
+ http://www.secondlife.com/corporate/sysreqs.php
+ </url>
+ <usetemplate ignoretext="我的電腦硬體並ä¸æ”¯æ´" name="okcancelignore" notext="å¦" yestext="是"/>
+ </notification>
+ <notification name="UnknownGPU">
+ Your system contains a graphics card that [APP_NAME] doesn&apos;t recognize.
+This is often the case with new hardware that hasn&apos;t been tested yet with [APP_NAME]. It will probably be ok, but you may need to adjust your graphics settings.
+(Me &gt; Preferences &gt; Graphics).
+ <form name="form">
+ <ignore name="ignore" text="我的顯示å¡ç„¡æ³•è¾¨è­˜"/>
+ </form>
+ </notification>
+ <notification name="DisplaySettingsNoShaders">
+ [APP_NAME] crashed while initializing graphics drivers.
+Graphics Quality will be set to Low to avoid some common driver errors. This will disable some graphics features.
+We recommend updating your graphics card drivers.
+Graphics Quality can be raised in Preferences &gt; Graphics.
+ </notification>
+ <notification name="RegionNoTerraforming">
+ 這個 [REGION] 地å€ä¸¦ä¸å…許變更地形。
+ </notification>
+ <notification name="CannotCopyWarning">
+ You do not have permission to copy the following items:
+[ITEMS]
+and will lose it from your inventory if you give it away. Do you really want to offer these items?
+ <usetemplate name="okcancelbuttons" notext="å¦" yestext="是"/>
+ </notification>
+ <notification name="CannotGiveItem">
+ 無法給予收ç´å€ç‰©å“。
+ </notification>
+ <notification name="TransactionCancelled">
+ 交易已å–消。
+ </notification>
+ <notification name="TooManyItems">
+ Cannot give more than 42 items in a single inventory transfer.
+ </notification>
+ <notification name="NoItems">
+ You do not have permission to transfer the selected items.
+ </notification>
+ <notification name="CannotCopyCountItems">
+ You do not have permission to copy [COUNT] of the selected items. You will lose these items from your inventory.
+Do you really want to give these items?
+ <usetemplate name="okcancelbuttons" notext="å¦" yestext="是"/>
+ </notification>
+ <notification name="CannotGiveCategory">
+ You do not have permission to transfer the selected folder.
+ </notification>
+ <notification name="FreezeAvatar">
+ å‡çµé€™ä½åŒ–身?
+他將暫時無法移動ã€èŠå¤©æˆ–這個世界互動。
+ <usetemplate canceltext="å–消" name="yesnocancelbuttons" notext="解å‡" yestext="å‡çµ"/>
+ </notification>
+ <notification name="FreezeAvatarFullname">
+ å‡çµ [AVATAR_NAME]?
+他將暫時無法移動ã€èŠå¤©æˆ–這個世界互動。
+ <usetemplate canceltext="å–消" name="yesnocancelbuttons" notext="解å‡" yestext="å‡çµ"/>
+ </notification>
+ <notification name="EjectAvatarFullname">
+ 將 [AVATAR_NAME] 由你的土地踢出?
+ <usetemplate canceltext="å–消" name="yesnocancelbuttons" notext="踢出並å°éŽ–" yestext="踢出"/>
+ </notification>
+ <notification name="EjectAvatarNoBan">
+ 將這一個化身由你的土地踢出?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="踢出"/>
+ </notification>
+ <notification name="EjectAvatarFullnameNoBan">
+ 將 [AVATAR_NAME] 由你的土地踢出?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="踢出"/>
+ </notification>
+ <notification name="EjectAvatarFromGroup">
+ 你已將 [AVATAR_NAME] 由群組 [GROUP_NAME] 中踢出
+ </notification>
+ <notification name="AcquireErrorTooManyObjects">
+ å–得錯誤:太多物件被é¸å–。
+ </notification>
+ <notification name="AcquireErrorObjectSpan">
+ ACQUIRE ERROR: Objects span more than one region.
+Please move all objects to be acquired onto the same region.
+ </notification>
+ <notification name="PromptGoToCurrencyPage">
+ [EXTRA]
+
+Go to [_URL] for information on purchasing L$?
+ <url name="url">
+ http://secondlife.com/app/currency/
+ </url>
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="UnableToLinkObjects">
+ Unable to link these [COUNT] objects.
+You can link a maximum of [MAX] objects.
+ </notification>
+ <notification name="CannotLinkIncompleteSet">
+ You can only link complete sets of objects, and must select more than one object.
+ </notification>
+ <notification name="CannotLinkModify">
+ Unable to link because you don&apos;t have modify permission on all the objects.
+
+Please make sure none are locked, and that you own all of them.
+ </notification>
+ <notification name="CannotLinkDifferentOwners">
+ Unable to link because not all of the objects have the same owner.
+
+Please make sure you own all of the selected objects.
+ </notification>
+ <notification name="NoFileExtension">
+ No file extension for the file: &apos;[FILE]&apos;
+
+Please make sure the file has a correct file extension.
+ </notification>
+ <notification name="InvalidFileExtension">
+ Invalid file extension [EXTENSION]
+Expected [VALIDS]
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="CannotUploadSoundFile">
+ Couldn&apos;t open uploaded sound file for reading:
+[FILE]
+ </notification>
+ <notification name="SoundFileNotRIFF">
+ File does not appear to be a RIFF WAVE file:
+[FILE]
+ </notification>
+ <notification name="SoundFileNotPCM">
+ File does not appear to be a PCM WAVE audio file:
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidChannelCount">
+ File has invalid number of channels (must be mono or stereo):
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidSampleRate">
+ File does not appear to be a supported sample rate (must be 44.1k):
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidWordSize">
+ File does not appear to be a supported word size (must be 8 or 16 bit):
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidHeader">
+ Could not find &apos;data&apos; chunk in WAV header:
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidChunkSize">
+ Wrong chunk size in WAV file:
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidTooLong">
+ 音頻檔太長(最大值 10 秒):
+[FILE]
+ </notification>
+ <notification name="ProblemWithFile">
+ Problem with file [FILE]:
+
+[ERROR]
+ </notification>
+ <notification name="CannotOpenTemporarySoundFile">
+ Couldn&apos;t open temporary compressed sound file for writing: [FILE]
+ </notification>
+ <notification name="UnknownVorbisEncodeFailure">
+ Unknown Vorbis encode failure on: [FILE]
+ </notification>
+ <notification name="CannotEncodeFile">
+ Unable to encode file: [FILE]
+ </notification>
+ <notification name="CorruptedProtectedDataStore">
+ We can&apos;t fill in your username and password. This may happen when you change network setup
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="CorruptResourceFile">
+ Corrupt resource file: [FILE]
+ </notification>
+ <notification name="UnknownResourceFileVersion">
+ Unknown Linden resource file version in file: [FILE]
+ </notification>
+ <notification name="UnableToCreateOutputFile">
+ Unable to create output file: [FILE]
+ </notification>
+ <notification name="DoNotSupportBulkAnimationUpload">
+ [APP_NAME] does not currently support bulk upload of animation files.
+ </notification>
+ <notification name="CannotUploadReason">
+ Unable to upload [FILE] due to the following reason: [REASON]
+Please try again later.
+ </notification>
+ <notification name="LandmarkCreated">
+ 你已經添加 &quot;[LANDMARK_NAME]&quot; 到你的 [FOLDER_NAME] 資料夾。
+ </notification>
+ <notification name="LandmarkAlreadyExists">
+ 你已經有這個ä½ç½®çš„地標。
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="CannotCreateLandmarkNotOwner">
+ ä½ ä¸èƒ½å‰µé€ åœ°æ¨™ï¼Œå› ç‚ºåœ°ä¸»ä¸¦ä¸å…許你這樣åšã€‚
+ </notification>
+ <notification name="CannotRecompileSelectObjectsNoScripts">
+ Not able to perform &apos;recompilation&apos;.
+Select an object with a script.
+ </notification>
+ <notification name="CannotRecompileSelectObjectsNoPermission">
+ Not able to perform &apos;recompilation&apos;.
+
+Select objects with scripts that you have permission to modify.
+ </notification>
+ <notification name="CannotResetSelectObjectsNoScripts">
+ Not able to perform &apos;reset&apos;.
+
+Select objects with scripts.
+ </notification>
+ <notification name="CannotResetSelectObjectsNoPermission">
+ Not able to perform &apos;reset&apos;.
+
+Select objects with scripts that you have permission to modify.
+ </notification>
+ <notification name="CannotOpenScriptObjectNoMod">
+ Unable to open script in object without modify permissions.
+ </notification>
+ <notification name="CannotSetRunningSelectObjectsNoScripts">
+ Not able to set any scripts to &apos;running&apos;.
+
+Select objects with scripts.
+ </notification>
+ <notification name="CannotSetRunningNotSelectObjectsNoScripts">
+ Unable to set any scripts to &apos;not running&apos;.
+
+Select objects with scripts.
+ </notification>
+ <notification name="NoFrontmostFloater">
+ No frontmost floater to save.
+ </notification>
+ <notification name="SeachFilteredOnShortWords">
+ Your search query was modified and the words that were too short were removed.
+
+Searched for: [FINALQUERY]
+ </notification>
+ <notification name="SeachFilteredOnShortWordsEmpty">
+ Your search terms were too short so no search was performed.
+ </notification>
+ <notification name="CouldNotTeleportReason">
+ 瞬間傳é€å¤±æ•—。
+[REASON]
+ </notification>
+ <notification name="invalid_tport">
+ Problem encountered processing your teleport request. You may need to log back in before you can teleport.
+If you continue to get this message, please check the [SUPPORT_SITE].
+ </notification>
+ <notification name="invalid_region_handoff">
+ Problem encountered processing your region crossing. You may need to log back in before you can cross regions.
+If you continue to get this message, please check the [SUPPORT_SITE].
+ </notification>
+ <notification name="blocked_tport">
+ Sorry, teleport is currently blocked. Try again in a moment. If you still cannot teleport, please log out and log back in to resolve the problem.
+ </notification>
+ <notification name="nolandmark_tport">
+ Sorry, but system was unable to locate landmark destination.
+ </notification>
+ <notification name="timeout_tport">
+ Sorry, but system was unable to complete the teleport connection. Try again in a moment.
+ </notification>
+ <notification name="noaccess_tport">
+ Sorry, you do not have access to that teleport destination.
+ </notification>
+ <notification name="missing_attach_tport">
+ Your attachments have not arrived yet. Try waiting for a few more seconds or log out and back in again before attempting to teleport.
+ </notification>
+ <notification name="too_many_uploads_tport">
+ The asset queue in this region is currently clogged so your teleport request will not be able to succeed in a timely manner. Please try again in a few minutes or go to a less busy area.
+ </notification>
+ <notification name="expired_tport">
+ Sorry, but the system was unable to complete your teleport request in a timely fashion. Please try again in a few minutes.
+ </notification>
+ <notification name="expired_region_handoff">
+ Sorry, but the system was unable to complete your region crossing in a timely fashion. Please try again in a few minutes.
+ </notification>
+ <notification name="no_host">
+ Unable to find teleport destination. The destination may be temporarily unavailable or no longer exists. Please try again in a few minutes.
+ </notification>
+ <notification name="no_inventory_host">
+ 收ç´å€åŠŸèƒ½ç›®å‰ç„¡æ³•ä½¿ç”¨ã€‚
+ </notification>
+ <notification name="CannotSetLandOwnerNothingSelected">
+ 無法設定土地æ“有者:
+無地段被é¸å–。
+ </notification>
+ <notification name="CannotSetLandOwnerMultipleRegions">
+ Unable to force land ownership because selection spans multiple regions. Please select a smaller area and try again.
+ </notification>
+ <notification name="ForceOwnerAuctionWarning">
+ This parcel is up for auction. Forcing ownership will cancel the auction and potentially make some Residents unhappy if bidding has begun.
+Force ownership?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="CannotContentifyNothingSelected">
+ Unable to contentify:
+No parcel selected.
+ </notification>
+ <notification name="CannotContentifyNoRegion">
+ Unable to contentify:
+No region selected.
+ </notification>
+ <notification name="CannotReleaseLandNothingSelected">
+ 無法放棄土地:
+無地段被é¸æ“‡ã€‚
+ </notification>
+ <notification name="CannotReleaseLandNoRegion">
+ 無法放棄土地:
+無法尋找地å€ã€‚
+ </notification>
+ <notification name="CannotBuyLandNothingSelected">
+ 無法購買土地:
+無地段被é¸æ“‡ã€‚
+ </notification>
+ <notification name="CannotBuyLandNoRegion">
+ Unable to buy land:
+Cannot find the region this land is in.
+ </notification>
+ <notification name="CannotCloseFloaterBuyLand">
+ You cannot close the Buy Land window until [APP_NAME] estimates the price of this transaction.
+ </notification>
+ <notification name="CannotDeedLandNothingSelected">
+ 無法讓渡土地:
+無地段被é¸å–。
+ </notification>
+ <notification name="CannotDeedLandNoGroup">
+ 無法讓渡土地:
+無群組被é¸å–。
+ </notification>
+ <notification name="CannotDeedLandNoRegion">
+ 無法讓渡土地:
+無法發ç¾é€™å¡ŠåœŸåœ°æ‰€åœ¨çš„地å€ã€‚
+ </notification>
+ <notification name="CannotDeedLandMultipleSelected">
+ 無法讓渡土地:
+複數地段被é¸å–。
+
+請試著é¸å–單一地段。
+ </notification>
+ <notification name="CannotDeedLandWaitingForServer">
+ 無法讓渡土地:
+等候伺æœå™¨å ±å‘Šæ“有權。
+
+è«‹å†è©¦ä¸€æ¬¡ã€‚
+ </notification>
+ <notification name="CannotDeedLandNoTransfer">
+ 無法讓渡土地:
+æ­¤ [REGION] 地å€ä¸¦ä¸å…許土地轉移。
+ </notification>
+ <notification name="CannotReleaseLandWatingForServer">
+ 無法放棄土地:
+等候伺æœå™¨æ›´æ–°åœ°æ®µè³‡è¨Šã€‚
+
+è«‹ç¨å¾Œå¹¾ç§’å†è©¦ä¸€æ¬¡ã€‚
+ </notification>
+ <notification name="CannotReleaseLandSelected">
+ 無法放棄土地:
+你並ä½æ“有所é¸æ“‡çš„全部土地。
+
+è«‹é¸æ“‡ä¸€å€‹å–®ä¸€åœ°æ®µã€‚
+ </notification>
+ <notification name="CannotReleaseLandDontOwn">
+ 無法放棄土地:
+你並沒有權é™åŽ»é‡‹å‡ºé€™å€‹åœ°æ®µã€‚
+你所æ“有的地段將呈ç¾ç¶ è‰²ã€‚
+ </notification>
+ <notification name="CannotReleaseLandRegionNotFound">
+ 無法放棄土地:
+無法發ç¾é€™å¿«åœŸåœ°æ‰€åœ¨çš„地å€ã€‚
+ </notification>
+ <notification name="CannotReleaseLandNoTransfer">
+ 無法放棄土地:
+æ­¤ [REGION] 地å€ä¸¦ä¸è¨±åœŸåœ°è½‰ç§»ã€‚
+ </notification>
+ <notification name="CannotReleaseLandPartialSelection">
+ 無法放棄土地:
+ä½ å¿…é ˆé¸å–一整個地段以釋出它。
+
+é¸å–一整個地段,或先進行分割。
+ </notification>
+ <notification name="ReleaseLandWarning">
+ 你釋出約 [AREA] m² é¢ç©åœŸåœ°ã€‚
+釋出個地段將會由你所æŒæœ‰çš„土地中移除,但ä¸æœƒçµ¦äºˆä»»ä½• L$。
+
+你確定è¦é‡‹å‡ºé€™å¡ŠåœŸåœ°ï¼Ÿ
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="CannotDivideLandNothingSelected">
+ 無法分割土地:
+
+無地段被é¸å–。
+ </notification>
+ <notification name="CannotDivideLandPartialSelection">
+ 無法分割土地:
+
+ä½ ç¾åœ¨é¸å–整個地段。
+請試著é¸å–其中部分地段。
+ </notification>
+ <notification name="LandDivideWarning">
+ 分割土地會將佌地段一分為二,æ¯ä¸€å€‹åœ°æ®µå°‡éƒ½å„自有其設定。 在這個æ“作之後,一些設定值將會回復到é è¨­å€¼ã€‚
+
+進行分割土地?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="CannotDivideLandNoRegion">
+ 無法分割土地:
+無法發ç¾é€™å¡ŠåœŸåœ°æ‰€åœ¨çš„地å€ã€‚
+ </notification>
+ <notification name="CannotJoinLandNoRegion">
+ 無法åˆä½µåœŸåœ°ï¼š
+無法發ç¾é€™å¡ŠåœŸåœ°æ‰€åœ¨çš„地å€ã€‚
+ </notification>
+ <notification name="CannotJoinLandNothingSelected">
+ 無法åˆä½µåœŸåœ°ï¼š
+無地段被é¸å–。
+ </notification>
+ <notification name="CannotJoinLandEntireParcelSelected">
+ 無法åˆä½µåœŸåœ°ï¼š
+ä½ åªæœ‰é¸å–一個地段。
+
+請跨越兩個地段é¸å–土地。
+ </notification>
+ <notification name="CannotJoinLandSelection">
+ 無法åˆä½µåœŸåœ°ï¼š
+ä½ å¿…é ˆé¸å–超éŽä¸€å€‹åœ°æ®µã€‚
+
+請跨越兩個地段é¸å–土地。
+ </notification>
+ <notification name="JoinLandWarning">
+ åˆä½µåœŸåœ°å°‡æœƒåœ¨é¸å–的全部地段範åœè£¡ç”¢ç”Ÿä¸€å€‹å·¨å¤§çš„地段。
+你將會需è¦é‡è¨­é€™å€‹æ–°åœ°æ®µçš„å稱與設定é¸é …。
+
+進行土地åˆä½µï¼Ÿ
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmNotecardSave">
+ 在物å“能被覆製或察看å‰ï¼Œé€™è¨˜äº‹å¡å¿…須先進行儲存。儲存記事å¡ï¼Ÿ
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmItemCopy">
+ 覆製這個物å“到你的收ç´å€ï¼Ÿ
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="覆製"/>
+ </notification>
+ <notification name="ResolutionSwitchFail">
+ Failed to switch resolution to [RESX] by [RESY]
+ </notification>
+ <notification name="ErrorUndefinedGrasses">
+ Error: Undefined grasses: [SPECIES]
+ </notification>
+ <notification name="ErrorUndefinedTrees">
+ Error: Undefined trees: [SPECIES]
+ </notification>
+ <notification name="CannotSaveWearableOutOfSpace">
+ Unable to save &apos;[NAME]&apos; to wearable file. You will need to free up some space on your computer and save the wearable again.
+ </notification>
+ <notification name="CannotSaveToAssetStore">
+ Unable to save [NAME] to central asset store.
+This is usually a temporary failure. Please customize and save the wearable again in a few minutes.
+ </notification>
+ <notification name="YouHaveBeenLoggedOut">
+ Darn. You have been logged out of [SECOND_LIFE]
+ [MESSAGE]
+ <usetemplate name="okcancelbuttons" notext="çµæŸé€€å‡º" yestext="View IM &amp; Chat"/>
+ </notification>
+ <notification name="OnlyOfficerCanBuyLand">
+ Unable to buy land for the group:
+You do not have permission to buy land for your active group.
+ </notification>
+ <notification label="加為朋å‹" name="AddFriendWithMessage">
+ Friends can give permissions to track each other on the map and receive online status updates.
+
+Offer friendship to [NAME]?
+ <form name="form">
+ <input name="message">
+ 你願æ„æˆç‚ºæˆ‘的朋å‹å—Žï¼Ÿ
+ </input>
+ <button name="Offer" text="確定"/>
+ <button name="Cancel" text="å–消"/>
+ </form>
+ </notification>
+ <notification label="儲存è£æ‰®" name="SaveOutfitAs">
+ 儲存我正在穿的為新è£æ‰®ï¼š
+ <form name="form">
+ <input name="message">
+ [DESC] (新)
+ </input>
+ <button name="OK" text="確定"/>
+ <button name="Cancel" text="å–消"/>
+ </form>
+ </notification>
+ <notification label="Save Wearable" name="SaveWearableAs">
+ 儲存物å“到我的收ç´å€ç‚ºï¼š
+ <form name="form">
+ <input name="message">
+ [DESC] (新)
+ </input>
+ <button name="OK" text="確定"/>
+ <button name="Cancel" text="å–消"/>
+ </form>
+ </notification>
+ <notification label="è£æ‰®æ›´å" name="RenameOutfit">
+ æ–°è£æ‰®å稱:
+ <form name="form">
+ <input name="new_name">
+ [NAME]
+ </input>
+ <button name="OK" text="確定"/>
+ <button name="Cancel" text="å–消"/>
+ </form>
+ </notification>
+ <notification name="RemoveFromFriends">
+ Do you want to remove &lt;nolink&gt;[NAME]&lt;/nolink&gt; from your Friends List?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="RemoveMultipleFromFriends">
+ 你確定è¦ç”±æœ‹å‹æ¸…單中移除多個朋å‹å—Žï¼Ÿ
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="GodDeleteAllScriptedPublicObjectsByUser">
+ Are you sure you want to delete all scripted objects owned by
+** [AVATAR_NAME] **
+on all others land in this sim?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="GodDeleteAllScriptedObjectsByUser">
+ Are you sure you want to DELETE ALL scripted objects owned by
+** [AVATAR_NAME] **
+on ALL LAND in this sim?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="GodDeleteAllObjectsByUser">
+ Are you sure you want to DELETE ALL objects (scripted or not) owned by
+** [AVATAR_NAME] **
+on ALL LAND in this sim?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="BlankClassifiedName">
+ You must specify a name for your classified.
+ </notification>
+ <notification name="MinClassifiedPrice">
+ Price to pay for listing must be at least L$[MIN_PRICE].
+
+Please enter a higher price.
+ </notification>
+ <notification name="ConfirmItemDeleteHasLinks">
+ At least one of the items you has link items that point to it. If you delete this item, its links will permanently stop working. It is strongly advised to delete the links first.
+
+Are you sure you want to delete these items?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteLock">
+ At least one of the items you have selected is locked.
+
+Are you sure you want to delete these items?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteNoCopy">
+ At least one of the items you have selected is not copyable.
+
+Are you sure you want to delete these items?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteNoOwn">
+ You do not own least one of the items you have selected.
+
+Are you sure you want to delete these items?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteLockNoCopy">
+ At least one object is locked.
+At least one object is not copyable.
+
+Are you sure you want to delete these items?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteLockNoOwn">
+ At least one object is locked.
+You do not own least one object.
+
+Are you sure you want to delete these items?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteNoCopyNoOwn">
+ At least one object is not copyable.
+You do not own least one object.
+
+Are you sure you want to delete these items?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteLockNoCopyNoOwn">
+ At least one object is locked.
+At least one object is not copyable.
+You do not own least one object.
+
+Are you sure you want to delete these items?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmObjectTakeLock">
+ At least one object is locked.
+
+Are you sure you want to take these items?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmObjectTakeNoOwn">
+ You do not own all of the objects you are taking.
+If you continue, next owner permissions will be applied and possibly restrict your ability to modify or copy them.
+
+Are you sure you want to take these items?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmObjectTakeLockNoOwn">
+ At least one object is locked.
+You do not own all of the objects you are taking.
+If you continue, next owner permissions will be applied and possibly restrict your ability to modify or copy them.
+However, you can take the current selection.
+
+Are you sure you want to take these items?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="CantBuyLandAcrossMultipleRegions">
+ Unable to buy land because selection spans multiple regions.
+
+Please select a smaller area and try again.
+ </notification>
+ <notification name="DeedLandToGroup">
+ By deeding this parcel, the group will be required to have and maintain sufficient land use credits.
+The purchase price of the land is not refunded to the owner. If a deeded parcel is sold, the sale price will be divided evenly among group members.
+
+Deed this [AREA] m² of land to the group &apos;[GROUP_NAME]&apos;?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="DeedLandToGroupWithContribution">
+ By deeding this parcel, the group will be required to have and maintain sufficient land use credits.
+The deed will include a simultaneous land contribution to the group from &apos;[NAME]&apos;.
+The purchase price of the land is not refunded to the owner. If a deeded parcel is sold, the sale price will be divided evenly among group members.
+
+Deed this [AREA] m² of land to the group &apos;[GROUP_NAME]&apos;?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="DisplaySetToSafe">
+ Display settings have been set to safe levels because you have specified the -safe option.
+ </notification>
+ <notification name="DisplaySetToRecommended">
+ Display settings have been set to recommended levels based on your system configuration.
+ </notification>
+ <notification name="ErrorMessage">
+ [ERROR_MESSAGE]
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="AvatarMovedDesired">
+ Your desired location is not currently available.
+You have been moved into a nearby region.
+ </notification>
+ <notification name="AvatarMovedLast">
+ Your last location is not currently available.
+You have been moved into a nearby region.
+ </notification>
+ <notification name="AvatarMovedHome">
+ Your home location is not currently available.
+You have been moved into a nearby region.
+You may want to set a new home location.
+ </notification>
+ <notification name="ClothingLoading">
+ ä½ çš„æœè£ä»åœ¨ä¸‹è¼‰ä¸­ã€‚
+ä½ å¯ä»¥æ­£å¸¸ä½¿ç”¨ [SECOND_LIFE],而且其他人看到你也是正常的。
+ <form name="form">
+ <ignore name="ignore" text="æœè£èŠ±å¤ªå¤šæ™‚間下載"/>
+ </form>
+ </notification>
+ <notification name="FirstRun">
+ [APP_NAME] 安è£å®Œæˆã€‚
+
+If this is your first time using [SECOND_LIFE], you will need to create an account before you can log in.
+Return to [http://join.secondlife.com secondlife.com] to create a new account?
+ <usetemplate name="okcancelbuttons" notext="繼續" yestext="新帳戶..."/>
+ </notification>
+ <notification name="LoginPacketNeverReceived">
+ We&apos;re having trouble connecting. There may be a problem with your Internet connection or the [SECOND_LIFE_GRID].
+
+You can either check your Internet connection and try again in a few minutes, click Help to view the [SUPPORT_SITE], or click Teleport to attempt to teleport home.
+ <url name="url">
+ http://secondlife.com/support/
+ </url>
+ <form name="form">
+ <button name="OK" text="確定"/>
+ <button name="Help" text="幫助"/>
+ <button name="Teleport" text="瞬間傳é€"/>
+ </form>
+ </notification>
+ <notification name="WelcomeChooseSex">
+ Your character will appear in a moment.
+
+Use arrow keys to walk.
+Press the F1 key at any time for help or to learn more about [SECOND_LIFE].
+Please choose the male or female avatar. You can change your mind later.
+ <usetemplate name="okcancelbuttons" notext="女性" yestext="男性"/>
+ </notification>
+ <notification name="CantTeleportToGrid">
+ Could not teleport to [SLURL] as it&apos;s on a different grid ([GRID]) than the current grid ([CURRENT_GRID]). Please close your viewer and try again.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="GeneralCertificateError">
+ 無法連接到伺æœå™¨ã€‚
+[REASON]
+
+SubjectName: [SUBJECT_NAME_STRING]
+IssuerName: [ISSUER_NAME_STRING]
+Valid From: [VALID_FROM]
+Valid To: [VALID_TO]
+MD5 Fingerprint: [SHA1_DIGEST]
+SHA1 Fingerprint: [MD5_DIGEST]
+Key Usage: [KEYUSAGE]
+Extended Key Usage: [EXTENDEDKEYUSAGE]
+Subject Key Identifier: [SUBJECTKEYIDENTIFIER]
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="TrustCertificateError">
+ The certification authority for this server is not known.
+
+Certificate Information:
+SubjectName: [SUBJECT_NAME_STRING]
+IssuerName: [ISSUER_NAME_STRING]
+Valid From: [VALID_FROM]
+Valid To: [VALID_TO]
+MD5 Fingerprint: [SHA1_DIGEST]
+SHA1 Fingerprint: [MD5_DIGEST]
+Key Usage: [KEYUSAGE]
+Extended Key Usage: [EXTENDEDKEYUSAGE]
+Subject Key Identifier: [SUBJECTKEYIDENTIFIER]
+
+Would you like to trust this authority?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="Trust"/>
+ </notification>
+ <notification name="NotEnoughCurrency">
+ [NAME] L$ [PRICE] You don&apos;t have enough L$ to do that.
+ </notification>
+ <notification name="GrantedModifyRights">
+ [NAME] has given you permission to edit their objects.
+ </notification>
+ <notification name="RevokedModifyRights">
+ Your privilege to modify [NAME]&apos;s objects has been revoked
+ </notification>
+ <notification name="FlushMapVisibilityCaches">
+ This will flush the map caches on this region.
+This is really only useful for debugging.
+(In production, wait 5 minutes, then everyone&apos;s map will update after they relog.)
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="BuyOneObjectOnly">
+ Unable to buy more than one object at a time. Please select only one object and try again.
+ </notification>
+ <notification name="OnlyCopyContentsOfSingleItem">
+ Unable to copy the contents of more than one item at a time.
+Please select only one object and try again.
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="KickUsersFromRegion">
+ 確定è¦å¼·åˆ¶çž¬é–“傳é€é€™åœ°å€æ‰€æœ‰å±…民回家?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="EstateObjectReturn">
+ Are you sure you want to return objects owned by [USER_NAME]?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="InvalidTerrainBitDepth">
+ Couldn&apos;t set region textures:
+Terrain texture [TEXTURE_NUM] has an invalid bit depth of [TEXTURE_BIT_DEPTH].
+
+Replace texture [TEXTURE_NUM] with a 24-bit 512x512 or smaller image then click &quot;Apply&quot; again.
+ </notification>
+ <notification name="InvalidTerrainSize">
+ Couldn&apos;t set region textures:
+Terrain texture [TEXTURE_NUM] is too large at [TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y].
+
+Replace texture [TEXTURE_NUM] with a 24-bit 512x512 or smaller image then click &quot;Apply&quot; again.
+ </notification>
+ <notification name="RawUploadStarted">
+ 上傳開始。將會花費約兩分é˜ï¼Œé€™å–決於你的連線速度。
+ </notification>
+ <notification name="ConfirmBakeTerrain">
+ Do you really want to bake the current terrain, make it the center for terrain raise/lower limits and the default for the &apos;Revert&apos; tool?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="MaxAllowedAgentOnRegion">
+ You can only have [MAX_AGENTS] Allowed Residents.
+ </notification>
+ <notification name="MaxBannedAgentsOnRegion">
+ ä½ åªå¯ä»¥æœ‰æœ€å¤š [MAX_BANNED] ä½è¢«å°éŽ–的居民。
+ </notification>
+ <notification name="MaxAgentOnRegionBatch">
+ Failure while attempting to add [NUM_ADDED] agents:
+Exceeds the [MAX_AGENTS] [LIST_TYPE] limit by [NUM_EXCESS].
+ </notification>
+ <notification name="MaxAllowedGroupsOnRegion">
+ You can only have [MAX_GROUPS] Allowed Groups.
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="Bake"/>
+ </notification>
+ <notification name="MaxManagersOnRegion">
+ ä½ åªå¯ä»¥æœ‰æœ€å¤š [MAX_MANAGER] ä½é ˜åœ°ç¶“ç†ã€‚
+ </notification>
+ <notification name="OwnerCanNotBeDenied">
+ 無法添加領地æ“有者到領地的 &apos;被å°éŽ–çš„å±…æ°‘&apos; å單中。
+ </notification>
+ <notification name="CanNotChangeAppearanceUntilLoaded">
+ 無法變更外觀,直到æœè£èˆ‡é«”形下載完畢。
+ </notification>
+ <notification name="ClassifiedMustBeAlphanumeric">
+ The name of your classified must start with a letter from A to Z or a number. No punctuation is allowed.
+ </notification>
+ <notification name="CantSetBuyObject">
+ Can&apos;t set Buy Object, because the object is not for sale.
+Please set the object for sale and try again.
+ </notification>
+ <notification name="FinishedRawDownload">
+ Finished download of raw terrain file to:
+[DOWNLOAD_PATH].
+ </notification>
+ <notification name="DownloadWindowsMandatory">
+ 一個新版本的 [APP_NAME] 已經å¯ç”¨ã€‚
+[MESSAGE]
+你必須下載這個更新以使用 [APP_NAME]。
+ <usetemplate name="okcancelbuttons" notext="çµæŸé€€å‡º" yestext="下載"/>
+ </notification>
+ <notification name="DownloadWindows">
+ 一個 [APP_NAME] æ›´æ–°éŽçš„版本已經å¯ç”¨ã€‚
+[MESSAGE]
+這個更新並éžå¼·åˆ¶æ›´æ–°ï¼Œä½†æˆ‘們建議你安è£ä»¥å¢žå¼·æ•ˆèƒ½åŠç©©å®šæ€§ã€‚
+ <usetemplate name="okcancelbuttons" notext="繼續" yestext="下載"/>
+ </notification>
+ <notification name="DownloadWindowsReleaseForDownload">
+ An updated version of [APP_NAME] is available.
+[MESSAGE]
+This update is not required, but we suggest you install it to improve performance and stability.
+ <usetemplate name="okcancelbuttons" notext="繼續" yestext="下載"/>
+ </notification>
+ <notification name="DownloadLinuxMandatory">
+ A new version of [APP_NAME] is available.
+[MESSAGE]
+You must download this update to use [APP_NAME].
+ <usetemplate name="okcancelbuttons" notext="çµæŸé€€å‡º" yestext="下載"/>
+ </notification>
+ <notification name="DownloadLinux">
+ An updated version of [APP_NAME] is available.
+[MESSAGE]
+This update is not required, but we suggest you install it to improve performance and stability.
+ <usetemplate name="okcancelbuttons" notext="繼續" yestext="下載"/>
+ </notification>
+ <notification name="DownloadLinuxReleaseForDownload">
+ An updated version of [APP_NAME] is available.
+[MESSAGE]
+This update is not required, but we suggest you install it to improve performance and stability.
+ <usetemplate name="okcancelbuttons" notext="繼續" yestext="下載"/>
+ </notification>
+ <notification name="DownloadMacMandatory">
+ A new version of [APP_NAME] is available.
+[MESSAGE]
+You must download this update to use [APP_NAME].
+
+Download to your Applications folder?
+ <usetemplate name="okcancelbuttons" notext="çµæŸé€€å‡º" yestext="下載"/>
+ </notification>
+ <notification name="DownloadMac">
+ An updated version of [APP_NAME] is available.
+[MESSAGE]
+This update is not required, but we suggest you install it to improve performance and stability.
+
+Download to your Applications folder?
+ <usetemplate name="okcancelbuttons" notext="繼續" yestext="下載"/>
+ </notification>
+ <notification name="DownloadMacReleaseForDownload">
+ An updated version of [APP_NAME] is available.
+[MESSAGE]
+This update is not required, but we suggest you install it to improve performance and stability.
+
+Download to your Applications folder?
+ <usetemplate name="okcancelbuttons" notext="繼續" yestext="下載"/>
+ </notification>
+ <notification name="FailedUpdateInstall">
+ An error occurred installing the viewer update.
+Please download and install the latest viewer from
+http://secondlife.com/download.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="FailedRequiredUpdateInstall">
+ We were unable to install a required update.
+You will be unable to log in until [APP_NAME] has been updated.
+
+Please download and install the latest viewer from
+http://secondlife.com/download.
+ <usetemplate name="okbutton" yestext="çµæŸé€€å‡º"/>
+ </notification>
+ <notification name="UpdaterServiceNotRunning">
+ There is a required update for your Second Life Installation.
+
+You may download this update from http://www.secondlife.com/downloads
+or you can install it now.
+ <usetemplate name="okcancelbuttons" notext="çµæŸé€€å‡ºç¬¬äºŒäººç”Ÿ" yestext="ç«‹å³ä¸‹è¼‰åŠå®‰è£"/>
+ </notification>
+ <notification name="DownloadBackgroundTip">
+ We have downloaded an update to your [APP_NAME] installation.
+Version [VERSION] [[RELEASE_NOTES_FULL_URL] Information about this update]
+ <usetemplate name="okcancelbuttons" notext="ç¨å€™..." yestext="ç«‹å³å®‰è£åŠé‡æ–°å•Ÿå‹• [APP_NAME]"/>
+ </notification>
+ <notification name="DownloadBackgroundDialog">
+ We have downloaded an update to your [APP_NAME] installation.
+Version [VERSION] [[RELEASE_NOTES_FULL_URL] Information about this update]
+ <usetemplate name="okcancelbuttons" notext="梢候..." yestext="ç«‹å³å®‰è£åŠé‡æ–°å•Ÿå‹• [APP_NAME]"/>
+ </notification>
+ <notification name="RequiredUpdateDownloadedVerboseDialog">
+ We have downloaded a required software update.
+Version [VERSION]
+
+We must restart [APP_NAME] to install the update.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="RequiredUpdateDownloadedDialog">
+ 我門必須é‡æ–°å•Ÿå‹• [APP_NAME] 以安è£æ›´æ–°ã€‚
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="DeedObjectToGroup">
+ Deeding this object will cause the group to:
+* Receive L$ paid into the object
+ <usetemplate ignoretext="在我讓渡一個物件給群組å‰ç¢ºèª" name="okcancelignore" notext="å–消" yestext="讓渡"/>
+ </notification>
+ <notification name="WebLaunchExternalTarget">
+ 你確定è¦é–‹å•Ÿç¶²é ç€è¦½å™¨åŽ»å¯Ÿçœ‹é€™å€‹å…§å®¹ï¼Ÿ
+ <usetemplate ignoretext="啟動我的網é ç€è¦½å™¨åŽ»å¯Ÿçœ‹ç¶²é " name="okcancelignore" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="WebLaunchJoinNow">
+ å‰å¾€ä½ çš„[http://secondlife.com/account/ 塗鴉牆]以進行管ç†ä½ çš„帳戶?
+ <usetemplate ignoretext="啟動我的ç€è¦½å™¨ä»¥ç®¡ç†æˆ‘的帳戶" name="okcancelignore" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="WebLaunchSecurityIssues">
+ Visit the [SECOND_LIFE] Wiki for details of how to report a security issue.
+ <usetemplate ignoretext="開啟我的網é ç€è¦½å™¨ä»¥å­¸ç¿’如何回報一個安全性的議題" name="okcancelignore" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="WebLaunchQAWiki">
+ 拜訪 [SECOND_LIFE] å•èˆ‡ç­”維基。
+ <usetemplate ignoretext="開啟我的網é ç€è¦½å™¨åŽ»å¯Ÿçœ‹å•èˆ‡ç­”維基" name="okcancelignore" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="WebLaunchPublicIssue">
+ 拜訪 [SECOND_LIFE] 公共議題追蹤,那裡你將å¯ä»¥å›žå ±è‡­èŸ²èˆ‡å…¶ä»–議題。
+ <usetemplate ignoretext="開啟我的網é ç€è¦½å™¨ä»¥ä½¿ç”¨å…¬å…±è­°é¡Œè¿½è¹¤ã€‚" name="okcancelignore" notext="å–消" yestext="å‰å¾€é é¢"/>
+ </notification>
+ <notification name="WebLaunchSupportWiki">
+ å‰å¾€æž—登官方部è½æ ¼ï¼Œä»¥å–得最新的新èžèˆ‡è³‡è¨Šã€‚
+ <usetemplate ignoretext="開啟我的網é ç€è¦½å™¨ä»¥å¯Ÿçœ‹éƒ¨è½æ ¼" name="okcancelignore" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="WebLaunchLSLGuide">
+ ä½ è¦é–‹å•Ÿè…³æœ¬æ’°å¯«æŒ‡å¼•ä»¥å¹«åŠ©ä½ é–‹ç™¼è…³æœ¬å—Žï¼Ÿ
+ <usetemplate ignoretext="開啟我的網é ç€è¦½å™¨ä»¥å¯Ÿçœ‹è…³æœ¬æ’°å¯«æŒ‡å¼•" name="okcancelignore" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="WebLaunchLSLWiki">
+ ä½ è¦æ‹œè¨ª LSL å…¥å£ä»¥å–得腳本設計的幫助嗎?
+ <usetemplate ignoretext="開啟我的網é ç€è¦½å™¨ä»¥å¯Ÿçœ‹ LSL å…¥å£" name="okcancelignore" notext="å–消" yestext="å‰å¾€é é¢"/>
+ </notification>
+ <notification name="ReturnToOwner">
+ 你確定è¦é€€å›žæ‰€é¸æ“‡çš„物件給它們的æ“有者嗎? å¯è½‰ç§»ä¸¦è®“渡的物件將會退回給它們的å‰ä¸€ä½æ“有者。
+
+*警告* éžå¯è½‰ç§»ä¸¦è®“渡的物件將會被刪除!
+ <usetemplate ignoretext="在我退回物件給它們的æ“有者å‰ç¢ºèª" name="okcancelignore" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="GroupLeaveConfirmMember">
+ ä½ ç›®å‰æ˜¯ &lt;nolink&gt;[GROUP]&lt;/nolink&gt; 群組的æˆå“¡ã€‚
+是å¦è¦é›¢é–‹ç¾¤çµ„?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmKick">
+ 你確定è¦è¸¢å‡ºé€™ç¶²æ ¼å…§çš„全部居民?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="踢出全部居民"/>
+ </notification>
+ <notification name="MuteLinden">
+ Sorry, you cannot block a Linden.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="CannotStartAuctionAlreadyForSale">
+ You cannot start an auction on a parcel which is already set for sale. Disable the land sale if you are sure you want to start an auction.
+ </notification>
+ <notification label="Block object by name failed" name="MuteByNameFailed">
+ You already have blocked this name.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="RemoveItemWarn">
+ Though permitted, deleting contents may damage the object. Do you want to delete that item?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="CantOfferCallingCard">
+ Cannot offer a calling card at this time. Please try again in a moment.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="CantOfferFriendship">
+ Cannot offer friendship at this time. Please try again in a moment.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="BusyModeSet">
+ Busy mode is set.
+Chat and instant messages will be hidden. Instant messages will get your Busy mode response. All teleportation offers will be declined. All inventory offers will go to your Trash.
+ <usetemplate ignoretext="我變更我的狀態為忙碌模å¼" name="okignore" yestext="確定"/>
+ </notification>
+ <notification name="JoinedTooManyGroupsMember">
+ You have reached your maximum number of groups. Please leave another group before joining this one, or decline the offer.
+[NAME] has invited you to join a group as a member.
+ <usetemplate name="okcancelbuttons" notext="è¬çµ•" yestext="加入"/>
+ </notification>
+ <notification name="JoinedTooManyGroups">
+ You have reached your maximum number of groups. Please leave some group before joining or creating a new one.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="KickUser">
+ 踢出這個居民並留給他什麼訊æ¯ï¼Ÿ
+ <form name="form">
+ <input name="message">
+ An administrator has logged you off.
+ </input>
+ <button name="OK" text="確定"/>
+ <button name="Cancel" text="å–消"/>
+ </form>
+ </notification>
+ <notification name="KickAllUsers">
+ Kick everyone currently on the grid with what message?
+ <form name="form">
+ <input name="message">
+ An administrator has logged you off.
+ </input>
+ <button name="OK" text="確定"/>
+ <button name="Cancel" text="å–消"/>
+ </form>
+ </notification>
+ <notification name="FreezeUser">
+ å‡çµé€™ä½å±…民時åŒæ™‚留下什麼訊æ¯ï¼Ÿ
+ <form name="form">
+ <input name="message">
+ 你已經被å‡çµäº†ã€‚ä½ å°‡ä¸èƒ½ç§»å‹•æˆ–èŠå¤©ã€‚管ç†å“¡å°‡æœƒä»¥å³æ™‚訊æ¯è¯ç¹«ä½ ï¼ˆIM)。
+ </input>
+ <button name="OK" text="確定"/>
+ <button name="Cancel" text="å–消"/>
+ </form>
+ </notification>
+ <notification name="UnFreezeUser">
+ 將這ä½å±…民解å‡ä¸¦åŒæ™‚留下什麼訊æ¯ï¼Ÿ
+ <form name="form">
+ <input name="message">
+ You are no longer frozen.
+ </input>
+ <button name="OK" text="確定"/>
+ <button name="Cancel" text="å–消"/>
+ </form>
+ </notification>
+ <notification name="SetDisplayNameSuccess">
+ Hi [DISPLAY_NAME]!
+
+Just like in real life, it takes a while for everyone to learn about a new name. Please allow several days for [http://wiki.secondlife.com/wiki/Setting_your_display_name your name to update] in objects, scripts, search, etc.
+ </notification>
+ <notification name="SetDisplayNameBlocked">
+ 抱歉,你ä¸å¯ä»¥è®Šæ›´ä½ çš„顯示å稱。如果你覺得這是錯誤,請連繫支æ´å» å•†ã€‚
+ </notification>
+ <notification name="SetDisplayNameFailedLength">
+ 抱歉,這å稱太長。顯示å稱最大長度為 [LENGTH] 字元。
+
+請嘗試短一些的å稱。
+ </notification>
+ <notification name="SetDisplayNameFailedGeneric">
+ Sorry, we could not set your display name. Please try again later.
+ </notification>
+ <notification name="SetDisplayNameMismatch">
+ The display names you entered do not match. Please re-enter.
+ </notification>
+ <notification name="AgentDisplayNameUpdateThresholdExceeded">
+ Sorry, you have to wait longer before you can change your display name.
+
+See http://wiki.secondlife.com/wiki/Setting_your_display_name
+
+Please try again later.
+ </notification>
+ <notification name="AgentDisplayNameSetBlocked">
+ Sorry, we could not set your requested name because it contains a banned word.
+
+ Please try a different name.
+ </notification>
+ <notification name="AgentDisplayNameSetInvalidUnicode">
+ The display name you wish to set contains invalid characters.
+ </notification>
+ <notification name="AgentDisplayNameSetOnlyPunctuation">
+ Your display name must contain letters other than punctuation.
+ </notification>
+ <notification name="DisplayNameUpdate">
+ [OLD_NAME] ([SLID]) is now known as [NEW_NAME].
+ </notification>
+ <notification name="OfferTeleport">
+ Offer a teleport to your location with the following message?
+ <form name="form">
+ <input name="message">
+ 加入我到 [REGION]
+ </input>
+ <button name="OK" text="確定"/>
+ <button name="Cancel" text="å–消"/>
+ </form>
+ </notification>
+ <notification name="OfferTeleportFromGod">
+ God summon Resident to your location?
+ <form name="form">
+ <input name="message">
+ Join me in [REGION]
+ </input>
+ <button name="OK" text="確定"/>
+ <button name="Cancel" text="å–消"/>
+ </form>
+ </notification>
+ <notification name="TeleportFromLandmark">
+ Are you sure you want to teleport to &lt;nolink&gt;[LOCATION]&lt;/nolink&gt;?
+ <usetemplate ignoretext="Confirm that I want to teleport to a landmark" name="okcancelignore" notext="å–消" yestext="瞬間傳é€"/>
+ </notification>
+ <notification name="TeleportToPick">
+ 瞬間傳é€åˆ° [PICK]?
+ <usetemplate ignoretext="確èªæˆ‘è¦çž¬é–“傳é€åˆ°ç²¾é¸åœ°é»žçš„所在ä½ç½®" name="okcancelignore" notext="å–消" yestext="瞬間傳é€"/>
+ </notification>
+ <notification name="TeleportToClassified">
+ 瞬間傳é€åˆ° [CLASSIFIED]?
+ <usetemplate ignoretext="確èªæˆ‘è¦çž¬é–“傳é€åˆ°å€‹äººå»£å‘Šçš„所在ä½ç½®" name="okcancelignore" notext="å–消" yestext="瞬間傳é€"/>
+ </notification>
+ <notification name="TeleportToHistoryEntry">
+ 瞬間傳é€åˆ° [HISTORY_ENTRY]?
+ <usetemplate ignoretext="確èªæˆ‘è¦çž¬é–“傳é€åˆ°æ­·å²ç´€éŒ„中的ä½ç½®" name="okcancelignore" notext="å–消" yestext="瞬間傳é€"/>
+ </notification>
+ <notification label="é€å‡ºè¨Šæ¯çµ¦ä½ é ˜åœ°å…§çš„æ¯ä¸€å€‹äºº" name="MessageEstate">
+ Type a short announcement which will be sent to everyone currently in your estate.
+ <form name="form">
+ <button name="OK" text="確定"/>
+ <button name="Cancel" text="å–消"/>
+ </form>
+ </notification>
+ <notification label="Change Linden Estate" name="ChangeLindenEstate">
+ You are about to change a Linden owned estate (mainland, teen grid, orientation, etc.).
+
+This is EXTREMELY DANGEROUS because it can fundamentally affect the Resident experience. On the mainland, it will change thousands of regions and make the spaceserver hiccup.
+
+Proceed?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification label="Change Linden Estate Access" name="ChangeLindenAccess">
+ You are about to change the access list for a Linden owned estate (mainland, teen grid, orientation, etc.).
+
+This is DANGEROUS and should only be done to invoke the hack allowing objects/L$ to be transfered in/out of a grid.
+It will change thousands of regions and make the spaceserver hiccup.
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification label="é¸æ“‡é ˜åœ°" name="EstateAllowedAgentAdd">
+ Add to allowed list for this estate only or for [ALL_ESTATES]?
+ <usetemplate canceltext="å–消" name="yesnocancelbuttons" notext="全部領地" yestext="這個領地"/>
+ </notification>
+ <notification label="é¸æ“‡é ˜åœ°" name="EstateAllowedAgentRemove">
+ Remove from allowed list for this estate only or for [ALL_ESTATES]?
+ <usetemplate canceltext="å–消" name="yesnocancelbuttons" notext="全部領地" yestext="這個領地"/>
+ </notification>
+ <notification label="é¸æ“‡é ˜åœ°" name="EstateAllowedGroupAdd">
+ Add to group allowed list for this estate only or for [ALL_ESTATES]?
+ <usetemplate canceltext="å–消" name="yesnocancelbuttons" notext="全部領地" yestext="這個領地"/>
+ </notification>
+ <notification label="é¸æ“‡é ˜åœ°" name="EstateAllowedGroupRemove">
+ Remove from group allowed list for this estate only or [ALL_ESTATES]?
+ <usetemplate canceltext="å–消" name="yesnocancelbuttons" notext="全部領地" yestext="這個領地"/>
+ </notification>
+ <notification label="é¸æ“‡é ˜åœ°" name="EstateBannedAgentAdd">
+ Deny access for this estate only or for [ALL_ESTATES]?
+ <usetemplate canceltext="å–消" name="yesnocancelbuttons" notext="全部領地" yestext="這個領地"/>
+ </notification>
+ <notification label="é¸æ“‡é ˜åœ°" name="EstateBannedAgentRemove">
+ Remove this Resident from the ban list for access for this estate only or for [ALL_ESTATES]?
+ <usetemplate canceltext="å–消" name="yesnocancelbuttons" notext="全部領地" yestext="這個領地"/>
+ </notification>
+ <notification label="é¸æ“‡é ˜åœ°" name="EstateManagerAdd">
+ Add estate manager for this estate only or for [ALL_ESTATES]?
+ <usetemplate canceltext="å–消" name="yesnocancelbuttons" notext="全部領地" yestext="這個領地"/>
+ </notification>
+ <notification label="é¸æ“‡é ˜åœ°" name="EstateManagerRemove">
+ Remove estate manager for this estate only or for [ALL_ESTATES]?
+ <usetemplate canceltext="å–消" name="yesnocancelbuttons" notext="全部領地" yestext="這個領地"/>
+ </notification>
+ <notification label="確èªè¸¢å‡º" name="EstateKickUser">
+ 將 [EVIL_USER] 由這領地踢出?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="EstateChangeCovenant">
+ Are you sure you want to change the Estate Covenant?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="RegionEntryAccessBlocked">
+ You are not allowed in that Region due to your maturity Rating. This may be a result of a lack of information validating your age.
+
+Please verify you have the latest Viewer installed, and go to the Knowledge Base for details on accessing areas with this maturity rating.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="RegionEntryAccessBlocked_KB">
+ You are not allowed in that region due to your maturity Rating.
+
+Go to the Knowledge Base for more information about maturity Ratings?
+ <url name="url">
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview
+ </url>
+ <usetemplate ignoretext="I can&apos;t enter this Region, due to restrictions of the maturity Rating" name="okcancelignore" notext="關閉" yestext="Go to Knowledge Base"/>
+ </notification>
+ <notification name="RegionEntryAccessBlocked_Notify">
+ You are not allowed in that region due to your maturity Rating.
+ </notification>
+ <notification name="RegionEntryAccessBlocked_Change">
+ You are not allowed in that Region due to your maturity Rating preference.
+
+To enter the desired region, please change your maturity Rating preference. This will allow you to search for and access [REGIONMATURITY] content. To undo any changes, go to Me &gt; Preferences &gt; General.
+ <form name="form">
+ <button name="OK" text="Change Preference"/>
+ <button name="Cancel" text="Close"/>
+ <ignore name="ignore" text="My chosen Rating preference prevents me from entering a Region"/>
+ </form>
+ </notification>
+ <notification name="PreferredMaturityChanged">
+ Your maturity Rating preference is now [RATING].
+ </notification>
+ <notification name="LandClaimAccessBlocked">
+ You cannot claim this land due to your maturity Rating. This may be a result of a lack of information validating your age.
+
+Please verify you have the latest Viewer installed, and go to the Knowledge Base for details on accessing areas with this maturity rating.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="LandClaimAccessBlocked_KB">
+ You cannot claim this land due to your maturity Rating.
+
+Go to the Knowledge Base for more information about maturity Ratings?
+ <url name="url">
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview
+ </url>
+ <usetemplate ignoretext="I can&apos;t claim this Land, due to restrictions of the maturity Rating" name="okcancelignore" notext="關閉" yestext="Go to Knowledge Base"/>
+ </notification>
+ <notification name="LandClaimAccessBlocked_Notify">
+ You cannot claim this land due to your maturity Rating.
+ </notification>
+ <notification name="LandClaimAccessBlocked_Change">
+ You cannot claim this land due to your maturity Rating preference.
+
+You can click &apos;Change Preference&apos; to raise your maturity Rating preference now and allow you to enter. You will be able to search and access [REGIONMATURITY] content from now on. If you later want to change this setting back, go to Me &gt; Preferences &gt; General.
+ <usetemplate ignoretext="My chosen Rating preference prevents me from claiming Land" name="okcancelignore" notext="關閉" yestext="Change Preference"/>
+ </notification>
+ <notification name="LandBuyAccessBlocked">
+ You cannot buy this land due to your maturity Rating. This may be a result of a lack of information validating your age.
+
+Please verify you have the latest Viewer installed, and go to the Knowledge Base for details on accessing areas with this maturity rating.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="LandBuyAccessBlocked_KB">
+ You cannot buy this land due to your maturity Rating.
+
+Go to the Knowledge Base for more information about maturity Ratings?
+ <url name="url">
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview
+ </url>
+ <usetemplate ignoretext="I can&apos;t buy this Land, due to restrictions of the maturity Rating" name="okcancelignore" notext="關閉" yestext="Go to Knowledge Base"/>
+ </notification>
+ <notification name="LandBuyAccessBlocked_Notify">
+ You cannot buy this land due to your maturity Rating.
+ </notification>
+ <notification name="LandBuyAccessBlocked_Change">
+ You cannot buy this land due to your maturity Rating preference.
+
+You can click &apos;Change Preference&apos; to raise your maturity Rating preference now and allow you to enter. You will be able to search and access [REGIONMATURITY] content from now on. If you later want to change this setting back, go to Me &gt; Preferences &gt; General.
+ <usetemplate ignoretext="My chosen Rating preference prevents me from buying Land" name="okcancelignore" notext="關閉" yestext="變更å好設定"/>
+ </notification>
+ <notification name="TooManyPrimsSelected">
+ There are too many prims selected. Please select [MAX_PRIM_COUNT] or fewer prims and try again
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="ProblemImportingEstateCovenant">
+ Problem importing estate covenant.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="ProblemAddingEstateManager">
+ Problems adding a new estate manager. One or more estates may have a full manager list.
+ </notification>
+ <notification name="ProblemAddingEstateGeneric">
+ Problems adding to this estate list. One or more estates may have a full list.
+ </notification>
+ <notification name="UnableToLoadNotecardAsset">
+ Unable to load notecard&apos;s asset at this time.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="NotAllowedToViewNotecard">
+ Insufficient permissions to view notecard associated with asset ID requested.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="MissingNotecardAssetID">
+ Asset ID for notecard is missing from database.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="PublishClassified">
+ Remember: Classified ad fees are non-refundable.
+
+Publish this classified now for L$[AMOUNT]?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="SetClassifiedMature">
+ Does this classified contain Moderate content?
+ <usetemplate canceltext="å–消" name="yesnocancelbuttons" notext="å¦" yestext="是"/>
+ </notification>
+ <notification name="SetGroupMature">
+ 這個群組將包å«é©åº¦æˆäººå…§å®¹ï¼Ÿ
+ <usetemplate canceltext="å–消" name="yesnocancelbuttons" notext="å¦" yestext="是"/>
+ </notification>
+ <notification label="Confirm restart" name="ConfirmRestart">
+ Do you really want to restart this region in 2 minutes?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification label="Message everyone in this region" name="MessageRegion">
+ Type a short announcement which will be sent to everyone in this region.
+ <form name="form">
+ <button name="OK" text="確定"/>
+ <button name="Cancel" text="å–消"/>
+ </form>
+ </notification>
+ <notification label="Changed Region Maturity" name="RegionMaturityChange">
+ The maturity rating for this region has been updated.
+It may take some time for the change to be reflected on the map.
+
+To enter Adult regions, Residents must be Account Verified, either by age-verification or payment-verification.
+ </notification>
+ <notification label="Voice Version Mismatch" name="VoiceVersionMismatch">
+ This version of [APP_NAME] is not compatible with the Voice Chat feature in this region. In order for Voice Chat to function correctly you will need to update [APP_NAME].
+ </notification>
+ <notification label="無法購買物件" name="BuyObjectOneOwner">
+ Cannot buy objects from different owners at the same time.
+Please select only one object and try again.
+ </notification>
+ <notification label="無法購買內容物" name="BuyContentsOneOnly">
+ Unable to buy the contents of more than one object at a time.
+Please select only one object and try again.
+ </notification>
+ <notification label="無法購買內容物" name="BuyContentsOneOwner">
+ Cannot buy objects from different owners at the same time.
+Please select only one object and try again.
+ </notification>
+ <notification name="BuyOriginal">
+ Buy original object from [OWNER] for L$[PRICE]?
+You will become the owner of this object.
+You will be able to:
+ Modify: [MODIFYPERM]
+ Copy: [COPYPERM]
+ Resell or Give Away: [RESELLPERM]
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="BuyOriginalNoOwner">
+ Buy original object for L$[PRICE]?
+You will become the owner of this object.
+You will be able to:
+ Modify: [MODIFYPERM]
+ Copy: [COPYPERM]
+ Resell or Give Away: [RESELLPERM]
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="BuyCopy">
+ Buy a copy from [OWNER] for L$[PRICE]?
+The object will be copied to your inventory.
+You will be able to:
+ Modify: [MODIFYPERM]
+ Copy: [COPYPERM]
+ Resell or Give Away: [RESELLPERM]
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="BuyCopyNoOwner">
+ Buy a copy for L$[PRICE]?
+The object will be copied to your inventory.
+You will be able to:
+ Modify: [MODIFYPERM]
+ Copy: [COPYPERM]
+ Resell or Give Away: [RESELLPERM]
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="BuyContents">
+ Buy contents from [OWNER] for L$[PRICE]?
+They will be copied to your inventory.
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="BuyContentsNoOwner">
+ Buy contents for L$[PRICE]?
+They will be copied to your inventory.
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmPurchase">
+ This transaction will:
+[ACTION]
+
+Are you sure you want to proceed with this purchase?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmPurchasePassword">
+ This transaction will:
+[ACTION]
+
+Are you sure you want to proceed with this purchase?
+Please re-enter your password and click OK.
+ <form name="form">
+ <button name="ConfirmPurchase" text="確定"/>
+ <button name="Cancel" text="å–消"/>
+ </form>
+ </notification>
+ <notification name="SetPickLocation">
+ Note:
+You have updated the location of this pick but the other details will retain their original values.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="MoveInventoryFromObject">
+ You have selected &apos;no copy&apos; inventory items.
+These items will be moved to your inventory, not copied.
+
+Move the inventory item(s)?
+ <usetemplate ignoretext="Warn me before I move &apos;no-copy&apos; items from an object" name="okcancelignore" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="MoveInventoryFromScriptedObject">
+ You have selected &apos;no copy&apos; inventory items. These items will be moved to your inventory, not copied.
+Because this object is scripted, moving these items to your inventory may cause the script to malfunction.
+
+Move the inventory item(s)?
+ <usetemplate ignoretext="Warn me before I move &apos;no-copy&apos; items which might break a scripted object" name="okcancelignore" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="ClickActionNotPayable">
+ Warning: The &apos;Pay object&apos; click action has been set, but it will only work if a script is added with a money() event.
+ <form name="form">
+ <ignore name="ignore" text="I set the action &apos;Pay object&apos; when building an object without a money() script"/>
+ </form>
+ </notification>
+ <notification name="OpenObjectCannotCopy">
+ There are no items in this object that you are allowed to copy.
+ </notification>
+ <notification name="WebLaunchAccountHistory">
+ å‰å¾€ä½ çš„[http://secondlife.com/account/ 塗鴉牆]以察看你的帳戶歷å²ç´€éŒ„?
+ <usetemplate ignoretext="啟動我的ç€è¦½å™¨ä»¥å¯Ÿçœ‹æˆ‘的帳戶歷å²ç´€éŒ„" name="okcancelignore" notext="å–消" yestext="å‰å¾€é é¢"/>
+ </notification>
+ <notification name="ConfirmQuit">
+ 你確定你è¦çµæŸé€€å‡ºï¼Ÿ
+ <usetemplate ignoretext="當我çµæŸé€€å‡ºæ™‚進行確èª" name="okcancelignore" notext="ä¸è¦çµæŸé€€å‡º" yestext="çµæŸé€€å‡º"/>
+ </notification>
+ <notification name="DeleteItems">
+ [QUESTION]
+ <usetemplate ignoretext="刪除物å“å‰ç¢ºèª" name="okcancelignore" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="HelpReportAbuseEmailLL">
+ Use this tool to report violations of the [http://secondlife.com/corporate/tos.php Terms of Service] and [http://secondlife.com/corporate/cs.php Community Standards].
+
+All reported abuses are investigated and resolved.
+ </notification>
+ <notification name="HelpReportAbuseSelectCategory">
+ Please select a category for this abuse report.
+Selecting a category helps us file and process abuse reports.
+ </notification>
+ <notification name="HelpReportAbuseAbuserNameEmpty">
+ Please enter the name of the abuser.
+Entering an accurate value helps us file and process abuse reports.
+ </notification>
+ <notification name="HelpReportAbuseAbuserLocationEmpty">
+ Please enter the location where the abuse took place.
+Entering an accurate value helps us file and process abuse reports.
+ </notification>
+ <notification name="HelpReportAbuseSummaryEmpty">
+ Please enter a summary of the abuse that took place.
+Entering an accurate summary helps us file and process abuse reports.
+ </notification>
+ <notification name="HelpReportAbuseDetailsEmpty">
+ Please enter a detailed description of the abuse that took place.
+Be as specific as you can, including names and the details of the incident you are reporting.
+Entering an accurate description helps us file and process abuse reports.
+ </notification>
+ <notification name="HelpReportAbuseContainsCopyright">
+ Dear Resident,
+
+You appear to be reporting intellectual property infringement. Please make sure you are reporting it correctly:
+
+(1) The Abuse Process. You may submit an abuse report if you believe a Resident is exploiting the [SECOND_LIFE] permissions system, for example, by using CopyBot or similar copying tools, to infringe intellectual property rights. The Abuse Team investigates and issues appropriate disciplinary action for behavior that violates the [SECOND_LIFE] [http://secondlife.com/corporate/tos.php Terms of Service] or [http://secondlife.com/corporate/cs.php Community Standards]. However, the Abuse Team does not handle and will not respond to requests to remove content from the [SECOND_LIFE] world.
+
+(2) The DMCA or Content Removal Process. To request removal of content from [SECOND_LIFE], you MUST submit a valid notification of infringement as provided in our [http://secondlife.com/corporate/dmca.php DMCA Policy].
+
+If you still wish to continue with the abuse process, please close this window and finish submitting your report. You may need to select the specific category &apos;CopyBot or Permissions Exploit&apos;.
+
+Thank you,
+
+Linden Lab
+ </notification>
+ <notification name="FailedRequirementsCheck">
+ The following required components are missing from [FLOATER]:
+[COMPONENTS]
+ </notification>
+ <notification label="å–代ç¾æœ‰çš„附件" name="ReplaceAttachment">
+ There is already an object attached to this point on your body.
+Do you want to replace it with the selected object?
+ <form name="form">
+ <ignore name="ignore" text="以所é¸æ“‡çš„物å“å–代ç¾æœ‰çš„附加物"/>
+ <button ignore="自動å–代" name="Yes" text="確定"/>
+ <button ignore="絕ä¸å–代" name="No" text="å–消"/>
+ </form>
+ </notification>
+ <notification label="忙碌模å¼è­¦å‘Š" name="BusyModePay">
+ You are in Busy Mode, which means you will not receive any items offered in exchange for this payment.
+
+Would you like to leave Busy Mode before completing this transaction?
+ <form name="form">
+ <ignore name="ignore" text="當我在忙碌模å¼æ™‚,將è¦æ”¯ä»˜é‡‘錢或給他人物件"/>
+ <button ignore="總是離開忙碌模å¼" name="Yes" text="確定"/>
+ <button ignore="絕ä¸é›¢é–‹å¿™ç¢Œæ¨¡å¼" name="No" text="å–消"/>
+ </form>
+ </notification>
+ <notification name="ConfirmDeleteProtectedCategory">
+ 資料夾 &apos;[FOLDERNAME]&apos; 是系統資料夾。刪除系統資料夾將導致ä¸ç©©å®šã€‚你確定你è¦åˆªé™¤å®ƒï¼Ÿ
+ <usetemplate ignoretext="在我刪除系統資料夾å‰ç¢ºèª" name="okcancelignore" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmEmptyTrash">
+ 你確定你è¦å°ä½ åžƒåœ¾ç­’中的內容進行刪除?
+ <usetemplate ignoretext="在我清空收ç´å€åžƒåœ¾ç­’資料夾å‰ç¢ºèª" name="okcancelignore" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmClearBrowserCache">
+ 你確定è¦åˆªé™¤ä½ çš„æ—…è¡Œã€ç¶²é åŠæœå°‹æ­·å²ç´€éŒ„嗎?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmClearCookies">
+ 你確定è¦æ¸…除你的 cookies 嗎?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="是"/>
+ </notification>
+ <notification name="ConfirmClearMediaUrlList">
+ 你確定è¦æ¸…除你所儲存的 Url 清單嗎?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="是"/>
+ </notification>
+ <notification name="ConfirmEmptyLostAndFound">
+ 你確定你è¦é€²è¡Œåˆªé™¤æ‰€æœ‰ Lost And Found 資料夾中的內容?
+ <usetemplate ignoretext="在我清空收ç´å€ä¸­çš„ Lost And Found 資料夾å‰é€²è¡Œç¢ºèª" name="okcancelignore" notext="å¦" yestext="是"/>
+ </notification>
+ <notification name="CopySLURL">
+ 下列的 SLurl ä½ç½®å·²ç¶“覆製到你的剪貼簿上:
+ [SLURL]
+
+Link to this from a web page to give others easy access to this location, or try it out yourself by pasting it into the address bar of any web browser.
+ <form name="form">
+ <ignore name="ignore" text="SLurl 已經覆製到我的剪貼簿。"/>
+ </form>
+ </notification>
+ <notification name="WLSavePresetAlert">
+ ä½ è¦è¦†å¯«å·²å„²å­˜çš„é è¨­é…置嗎?
+ <usetemplate name="okcancelbuttons" notext="å¦" yestext="是"/>
+ </notification>
+ <notification name="WLDeletePresetAlert">
+ ä½ è¦åˆªé™¤ [SKY]?
+ <usetemplate name="okcancelbuttons" notext="å¦" yestext="是"/>
+ </notification>
+ <notification name="WLNoEditDefault">
+ You cannot edit or delete a default preset.
+ </notification>
+ <notification name="WLMissingSky">
+ This day cycle file references a missing sky file: [SKY].
+ </notification>
+ <notification name="PPSaveEffectAlert">
+ PostProcess Effect exists. Do you still wish overwrite it?
+ <usetemplate name="okcancelbuttons" notext="å¦" yestext="是"/>
+ </notification>
+ <notification name="NewSkyPreset">
+ Give me a name for the new sky.
+ <form name="form">
+ <input name="message">
+ æ–°é è¨­é…é…ç½®
+ </input>
+ <button name="OK" text="確定"/>
+ <button name="Cancel" text="å–消"/>
+ </form>
+ </notification>
+ <notification name="ExistsSkyPresetAlert">
+ Preset already exists!
+ </notification>
+ <notification name="NewWaterPreset">
+ Give me a name for the new water preset.
+ <form name="form">
+ <input name="message">
+ New Preset
+ </input>
+ <button name="OK" text="確定"/>
+ <button name="Cancel" text="å–消"/>
+ </form>
+ </notification>
+ <notification name="ExistsWaterPresetAlert">
+ Preset already exists!
+ </notification>
+ <notification name="WaterNoEditDefault">
+ You cannot edit or delete a default preset.
+ </notification>
+ <notification name="ChatterBoxSessionStartError">
+ 無法開始一個與 [RECIPIENT] 他的新èŠå¤©æœƒè©±ã€‚
+[REASON]
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="ChatterBoxSessionEventError">
+ [EVENT]
+[REASON]
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="ForceCloseChatterBoxSession">
+ 你與 [NAME] çš„èŠå¤©æœƒè©±å¿…須關閉。
+[REASON]
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="Cannot_Purchase_an_Attachment">
+ You can&apos;t buy an object while it is attached.
+ </notification>
+ <notification label="About Requests for the Debit Permission" name="DebitPermissionDetails">
+ Granting this request gives a script ongoing permission to take Linden dollars (L$) from your account. To revoke this permission, the object owner must delete the object or reset the scripts in the object.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="AutoWearNewClothing">
+ ä½ è¦è‡ªå‹•ç©¿ä¸Šä½ æ‰€å‰µé€ çš„æœè£å—Žï¼Ÿ
+ <usetemplate ignoretext="編輯外觀時能穿上我所創造的æœè£" name="okcancelignore" notext="å¦" yestext="是"/>
+ </notification>
+ <notification name="NotAgeVerified">
+ You must be age-verified to visit this area. Do you want to go to the [SECOND_LIFE] website and verify your age?
+
+[_URL]
+ <url name="url">
+ https://secondlife.com/account/verification.php
+ </url>
+ <usetemplate ignoretext="I have not verified my age" name="okcancelignore" notext="å¦" yestext="是"/>
+ </notification>
+ <notification name="Cannot enter parcel: no payment info on file">
+ You must have payment information on file to visit this area. Do you want to go to the [SECOND_LIFE] website and set this up?
+
+[_URL]
+ <url name="url">
+ https://secondlife.com/account/
+ </url>
+ <usetemplate ignoretext="I lack payment information on file" name="okcancelignore" notext="å¦" yestext="是"/>
+ </notification>
+ <notification name="MissingString">
+ The string [STRING_NAME] is missing from strings.xml
+ </notification>
+ <notification name="SystemMessageTip">
+ [MESSAGE]
+ </notification>
+ <notification name="IMSystemMessageTip">
+ [MESSAGE]
+ </notification>
+ <notification name="Cancelled">
+ å·²å–消
+ </notification>
+ <notification name="CancelledSit">
+ å–消å下
+ </notification>
+ <notification name="CancelledAttach">
+ å–消貼上
+ </notification>
+ <notification name="ReplacedMissingWearable">
+ Replaced missing clothing/body part with default.
+ </notification>
+ <notification name="GroupNotice">
+ Topic: [SUBJECT], Message: [MESSAGE]
+ </notification>
+ <notification name="FriendOnline">
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; 上線
+ </notification>
+ <notification name="FriendOffline">
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; 離線
+ </notification>
+ <notification name="AddSelfFriend">
+ Although you&apos;re very nice, you can&apos;t add yourself as a friend.
+ </notification>
+ <notification name="UploadingAuctionSnapshot">
+ Uploading in-world and web site snapshots...
+(Takes about 5 minutes.)
+ </notification>
+ <notification name="UploadPayment">
+ 你支付 L$[AMOUNT] 上傳。
+ </notification>
+ <notification name="UploadWebSnapshotDone">
+ Web site snapshot upload done.
+ </notification>
+ <notification name="UploadSnapshotDone">
+ In-world snapshot upload done
+ </notification>
+ <notification name="TerrainDownloaded">
+ 地形 .raw 檔已下載
+ </notification>
+ <notification name="GestureMissing">
+ 嗯,姿勢 [NAME] 在資料庫中éºå¤±ã€‚
+ </notification>
+ <notification name="UnableToLoadGesture">
+ 無法載入姿勢 [NAME]。
+ </notification>
+ <notification name="LandmarkMissing">
+ 資料庫中的地標éºå¤±ã€‚
+ </notification>
+ <notification name="UnableToLoadLandmark">
+ 無法載入地標,請å†è©¦ä¸€æ¬¡ã€‚
+ </notification>
+ <notification name="CapsKeyOn">
+ 你的大寫éµå·²å•Ÿç”¨ã€‚
+這將å¯èƒ½æœƒå½±éŸ¿åˆ°ä½ è¼¸å…¥çš„密碼。
+ </notification>
+ <notification name="NotecardMissing">
+ 記事å¡åœ¨è³‡æ–™åº«ä¸­éºå¤±ã€‚
+ </notification>
+ <notification name="NotecardNoPermissions">
+ 你並沒有權é™åŽ»å¯Ÿçœ‹é€™å€‹è¨˜äº‹å¡ã€‚
+ </notification>
+ <notification name="RezItemNoPermissions">
+ 產生物件時發生權é™è¡çªã€‚
+ </notification>
+ <notification name="UnableToLoadNotecard">
+ 無法載入記事å¡ã€‚
+è«‹å†è©¦ä¸€æ¬¡ã€‚
+ </notification>
+ <notification name="ScriptMissing">
+ 腳本在資料庫中éºå¤±ã€‚
+ </notification>
+ <notification name="ScriptNoPermissions">
+ 察看腳本時發生權é™è¡çªã€‚
+ </notification>
+ <notification name="UnableToLoadScript">
+ 無法載入腳本。請å†è©¦ä¸€æ¬¡ã€‚
+ </notification>
+ <notification name="IncompleteInventory">
+ The complete contents you are offering are not yet locally available. Please try offering those items again in a minute.
+ </notification>
+ <notification name="CannotModifyProtectedCategories">
+ You cannot modify protected categories.
+ </notification>
+ <notification name="CannotRemoveProtectedCategories">
+ You cannot remove protected categories.
+ </notification>
+ <notification name="UnableToBuyWhileDownloading">
+ Unable to buy while downloading object data.
+Please try again.
+ </notification>
+ <notification name="UnableToLinkWhileDownloading">
+ Unable to link while downloading object data.
+Please try again.
+ </notification>
+ <notification name="CannotBuyObjectsFromDifferentOwners">
+ You can only buy objects from one owner at a time.
+Please select a single object.
+ </notification>
+ <notification name="ObjectNotForSale">
+ 這物件ä¸å‡ºå”®ã€‚
+ </notification>
+ <notification name="EnteringGodMode">
+ 進入神之模å¼ä¸­ï¼Œç­‰ç´š [LEVEL]
+ </notification>
+ <notification name="LeavingGodMode">
+ ç¾åœ¨é›¢é–‹ç¥žä¹‹æ¨¡å¼ï¼Œç­‰ç´š [LEVEL]
+ </notification>
+ <notification name="CopyFailed">
+ 你並沒有權é™åŽ»è¦†è£½é€™å€‹ã€‚
+ </notification>
+ <notification name="InventoryAccepted">
+ [NAME] 接收到你æ供的收ç´å€ç‰©å“。
+ </notification>
+ <notification name="InventoryDeclined">
+ [NAME] è¬çµ•ä½ æ供的收ç´å€ç‰©å“。
+ </notification>
+ <notification name="ObjectMessage">
+ [NAME]: [MESSAGE]
+ </notification>
+ <notification name="CallingCardAccepted">
+ ä½ çš„å片已被接å—。
+ </notification>
+ <notification name="CallingCardDeclined">
+ ä½ çš„å片已被拒絕。
+ </notification>
+ <notification name="TeleportToLandmark">
+ You can teleport to locations like &apos;[NAME]&apos; by opening the Places panel on the right side of your screen, and then select the Landmarks tab.
+Click on any landmark to select it, then click &apos;Teleport&apos; at the bottom of the panel.
+(You can also double-click on the landmark, or right-click it and choose &apos;Teleport&apos;.)
+ </notification>
+ <notification name="TeleportToPerson">
+ You can contact Residents like &apos;[NAME]&apos; by opening the People panel on the right side of your screen.
+Select the Resident from the list, then click &apos;IM&apos; at the bottom of the panel.
+(You can also double-click on their name in the list, or right-click and choose &apos;IM&apos;).
+ </notification>
+ <notification name="CantSelectLandFromMultipleRegions">
+ Can&apos;t select land across server boundaries.
+Try selecting a smaller piece of land.
+ </notification>
+ <notification name="SearchWordBanned">
+ Some terms in your search query were excluded due to content restrictions as clarified in the Community Standards.
+ </notification>
+ <notification name="NoContentToSearch">
+ Please select at least one type of content to search (General, Moderate, or Adult).
+ </notification>
+ <notification name="SystemMessage">
+ [MESSAGE]
+ </notification>
+ <notification name="PaymentReceived">
+ [MESSAGE]
+ </notification>
+ <notification name="PaymentSent">
+ [MESSAGE]
+ </notification>
+ <notification name="EventNotification">
+ 活動通知:
+
+[NAME]
+[DATE]
+ <form name="form">
+ <button name="Details" text="細節"/>
+ <button name="Cancel" text="å–消"/>
+ </form>
+ </notification>
+ <notification name="TransferObjectsHighlighted">
+ All objects on this parcel that will transfer to the purchaser of this parcel are now highlighted.
+
+* Trees and grasses that will transfer are not highlighted.
+ <form name="form">
+ <button name="Done" text="Done"/>
+ </form>
+ </notification>
+ <notification name="DeactivatedGesturesTrigger">
+ Deactivated gestures with same trigger:
+[NAMES]
+ </notification>
+ <notification name="NoQuickTime">
+ Apple&apos;s QuickTime software does not appear to be installed on your system.
+If you want to view streaming media on parcels that support it you should go to the [http://www.apple.com/quicktime QuickTime site] and install the QuickTime Player.
+ </notification>
+ <notification name="NoPlugin">
+ No Media Plugin was found to handle the &quot;[MIME_TYPE]&quot; mime type. Media of this type will be unavailable.
+ </notification>
+ <notification name="MediaPluginFailed">
+ The following Media Plugin has failed:
+ [PLUGIN]
+
+Please re-install the plugin or contact the vendor if you continue to experience problems.
+ <form name="form">
+ <ignore name="ignore" text="A Media Plugin fails to run"/>
+ </form>
+ </notification>
+ <notification name="OwnedObjectsReturned">
+ The objects you own on the selected parcel of land have been returned back to your inventory.
+ </notification>
+ <notification name="OtherObjectsReturned">
+ The objects on the selected parcel of land that is owned by [NAME] have been returned to his or her inventory.
+ </notification>
+ <notification name="OtherObjectsReturned2">
+ The objects on the selected parcel of land owned by the Resident &apos;[NAME]&apos; have been returned to their owner.
+ </notification>
+ <notification name="GroupObjectsReturned">
+ The objects on the selected parcel of land shared with the group [GROUPNAME] have been returned back to their owner&apos;s inventory.
+Transferable deeded objects have been returned to their previous owners.
+Non-transferable objects that are deeded to the group have been deleted.
+ </notification>
+ <notification name="UnOwnedObjectsReturned">
+ The objects on the selected parcel that are NOT owned by you have been returned to their owners.
+ </notification>
+ <notification name="ServerObjectMessage">
+ Message from [NAME]:
+&lt;nolink&gt;[MSG]&lt;/nolink&gt;
+ </notification>
+ <notification name="NotSafe">
+ This land has damage enabled.
+You can be hurt here. If you die, you will be teleported to your home location.
+ </notification>
+ <notification name="NoFly">
+ 這å€åŸŸé—œé–‰ä¸¦ç¦æ­¢é£›è¡Œã€‚
+ä½ ä¸èƒ½åœ¨æ­¤è™•é£›è¡Œã€‚
+ </notification>
+ <notification name="PushRestricted">
+ This area does not allow pushing. You can&apos;t push others here unless you own the land.
+ </notification>
+ <notification name="NoVoice">
+ This area has voice chat disabled. You won&apos;t be able to hear anyone talking.
+ </notification>
+ <notification name="NoBuild">
+ This area has building disabled. You can&apos;t build or rez objects here.
+ </notification>
+ <notification name="ScriptsStopped">
+ An administrator has temporarily stopped scripts in this region.
+ </notification>
+ <notification name="ScriptsNotRunning">
+ This region is not running any scripts.
+ </notification>
+ <notification name="NoOutsideScripts">
+ This land has outside scripts disabled.
+
+No scripts will work here except those belonging to the land owner.
+ </notification>
+ <notification name="ClaimPublicLand">
+ You can only claim public land in the Region you&apos;re in.
+ </notification>
+ <notification name="RegionTPAccessBlocked">
+ You aren&apos;t allowed in that Region due to your maturity Rating. You may need to validate your age and/or install the latest Viewer.
+
+Please go to the Knowledge Base for details on accessing areas with this maturity Rating.
+ </notification>
+ <notification name="URBannedFromRegion">
+ You are banned from the region.
+ </notification>
+ <notification name="NoTeenGridAccess">
+ Your account cannot connect to this teen grid region.
+ </notification>
+ <notification name="ImproperPaymentStatus">
+ You do not have proper payment status to enter this region.
+ </notification>
+ <notification name="MustGetAgeRgion">
+ 你必須通éŽå¹´é½¡èªè­‰ä»¥é€²å…¥é€™åœ°å€ã€‚
+ </notification>
+ <notification name="MustGetAgeParcel">
+ 你必須通éŽå¹´é½¡é©—證以進入這地段。
+ </notification>
+ <notification name="NoDestRegion">
+ 無目的地地å€ç™¼ç¾ã€‚
+ </notification>
+ <notification name="NotAllowedInDest">
+ You are not allowed into the destination.
+ </notification>
+ <notification name="RegionParcelBan">
+ Cannot region cross into banned parcel. Try another way.
+ </notification>
+ <notification name="TelehubRedirect">
+ You have been redirected to a telehub.
+ </notification>
+ <notification name="CouldntTPCloser">
+ Could not teleport closer to destination.
+ </notification>
+ <notification name="TPCancelled">
+ 瞬間傳é€å·²å–消。
+ </notification>
+ <notification name="FullRegionTryAgain">
+ The region you are attempting to enter is currently full.
+Please try again in a few moments.
+ </notification>
+ <notification name="GeneralFailure">
+ 一般故障。
+ </notification>
+ <notification name="RoutedWrongRegion">
+ 路由導å‘到錯誤地å€ã€‚è«‹å†è©¦ä¸€æ¬¡ã€‚
+ </notification>
+ <notification name="NoValidAgentID">
+ No valid agent id.
+ </notification>
+ <notification name="NoValidSession">
+ No valid session id.
+ </notification>
+ <notification name="NoValidCircuit">
+ No valid circuit code.
+ </notification>
+ <notification name="NoValidTimestamp">
+ No valid timestamp.
+ </notification>
+ <notification name="NoPendingConnection">
+ Unable to create pending connection.
+ </notification>
+ <notification name="InternalUsherError">
+ Internal error attempting to connect agent usher.
+ </notification>
+ <notification name="NoGoodTPDestination">
+ Unable to find a good teleport destination in this region.
+ </notification>
+ <notification name="InternalErrorRegionResolver">
+ Internal error attempting to activate region resolver.
+ </notification>
+ <notification name="NoValidLanding">
+ A valid landing point could not be found.
+ </notification>
+ <notification name="NoValidParcel">
+ No valid parcel could be found.
+ </notification>
+ <notification name="ObjectGiveItem">
+ An object named &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; owned by [NAME_SLURL] has given you this [OBJECTTYPE]:
+[ITEM_SLURL]
+ <form name="form">
+ <button name="Keep" text="Keep"/>
+ <button name="Discard" text="Discard"/>
+ <button name="Mute" text="Block"/>
+ </form>
+ </notification>
+ <notification name="UserGiveItem">
+ [NAME_SLURL] has given you this [OBJECTTYPE]:
+[ITEM_SLURL]
+ <form name="form">
+ <button name="Show" text="Show"/>
+ <button name="Discard" text="Discard"/>
+ <button name="Mute" text="Block"/>
+ </form>
+ </notification>
+ <notification name="GodMessage">
+ [NAME]
+
+[MESSAGE]
+ </notification>
+ <notification name="JoinGroup">
+ [MESSAGE]
+ <form name="form">
+ <button name="Join" text="加入"/>
+ <button name="Decline" text="è¬çµ•"/>
+ <button name="Info" text="資訊"/>
+ </form>
+ </notification>
+ <notification name="TeleportOffered">
+ [NAME_SLURL] has offered to teleport you to their location:
+
+[MESSAGE] - [MATURITY_STR] &lt;icon&gt;[MATURITY_ICON]&lt;/icon&gt;
+ <form name="form">
+ <button name="Teleport" text="瞬間傳é€"/>
+ <button name="Cancel" text="å–消"/>
+ </form>
+ </notification>
+ <notification name="TeleportOfferSent">
+ Teleport offer sent to [TO_NAME]
+ </notification>
+ <notification name="GotoURL">
+ [MESSAGE]
+[URL]
+ <form name="form">
+ <button name="Later" text="ç¨å€™"/>
+ <button name="GoNow..." text="ç«‹å³å‰å¾€..."/>
+ </form>
+ </notification>
+ <notification name="OfferFriendship">
+ [NAME_SLURL] is offering friendship.
+
+[MESSAGE]
+
+(By default, you will be able to see each other&apos;s online status.)
+ <form name="form">
+ <button name="Accept" text="接å—"/>
+ <button name="Decline" text="è¬çµ•"/>
+ </form>
+ </notification>
+ <notification name="FriendshipOffered">
+ You have offered friendship to [TO_NAME]
+ </notification>
+ <notification name="OfferFriendshipNoMessage">
+ [NAME_SLURL] is offering friendship.
+
+(By default, you will be able to see each other&apos;s online status.)
+ <form name="form">
+ <button name="Accept" text="接å—"/>
+ <button name="Decline" text="è¬çµ•"/>
+ </form>
+ </notification>
+ <notification name="FriendshipAccepted">
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; accepted your friendship offer.
+ </notification>
+ <notification name="FriendshipDeclined">
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; è¬çµ•ä½ çš„交å‹é‚€è«‹ã€‚
+ </notification>
+ <notification name="FriendshipAcceptedByMe">
+ 交å‹é‚€è«‹è¢«æŽ¥å—。
+ </notification>
+ <notification name="FriendshipDeclinedByMe">
+ 交å‹é‚€è«‹è¢«è¬çµ•ã€‚
+ </notification>
+ <notification name="OfferCallingCard">
+ [NAME] is offering their calling card.
+This will add a bookmark in your inventory so you can quickly IM this Resident.
+ <form name="form">
+ <button name="Accept" text="接å—"/>
+ <button name="Decline" text="è¬çµ•"/>
+ </form>
+ </notification>
+ <notification name="RegionRestartMinutes">
+ This region will restart in [MINUTES] minutes.
+If you stay in this region you will be logged out.
+ </notification>
+ <notification name="RegionRestartSeconds">
+ This region will restart in [SECONDS] seconds.
+If you stay in this region you will be logged out.
+ </notification>
+ <notification name="LoadWebPage">
+ è¼‰å…¥ç¶²é  [URL]?
+
+[MESSAGE]
+
+From object: &lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;, owner: [NAME]?
+ <form name="form">
+ <button name="Gotopage" text="å‰å¾€é é¢"/>
+ <button name="Cancel" text="å–消"/>
+ </form>
+ </notification>
+ <notification name="FailedToFindWearableUnnamed">
+ Failed to find [TYPE] in database.
+ </notification>
+ <notification name="FailedToFindWearable">
+ Failed to find [TYPE] named [DESC] in database.
+ </notification>
+ <notification name="InvalidWearable">
+ The item you are trying to wear uses a feature that your Viewer can&apos;t read. Please upgrade your version of [APP_NAME] to wear this item.
+ </notification>
+ <notification name="ScriptQuestion">
+ &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos;, an object owned by &apos;[NAME]&apos;, would like to:
+
+[QUESTIONS]
+Is this OK?
+ <form name="form">
+ <button name="Yes" text="是"/>
+ <button name="No" text="å¦"/>
+ <button name="Mute" text="Block"/>
+ </form>
+ </notification>
+ <notification name="ScriptQuestionCaution">
+ An object named &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos;, owned by &apos;[NAME]&apos; would like to:
+
+[QUESTIONS]
+If you do not trust this object and its creator, you should deny the request.
+
+Grant this request?
+ <form name="form">
+ <button name="Grant" text="Grant"/>
+ <button name="Deny" text="Deny"/>
+ <button name="Details" text="細節..."/>
+ </form>
+ </notification>
+ <notification name="ScriptDialog">
+ [NAME]&apos;s &apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos;
+[MESSAGE]
+ <form name="form">
+ <button name="Ignore" text="忽視"/>
+ </form>
+ </notification>
+ <notification name="ScriptDialogGroup">
+ [GROUPNAME]&apos;s &apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos;
+[MESSAGE]
+ <form name="form">
+ <button name="Ignore" text="忽視"/>
+ </form>
+ </notification>
+ <notification name="BuyLindenDollarSuccess">
+ Thank you for your payment!
+
+Your L$ balance will be updated when processing completes. If processing takes more than 20 mins, your transaction may be cancelled. In that case, the purchase amount will be credited to your US$ balance.
+
+The status of your payment can be checked on your Transaction History page on your [http://secondlife.com/account/ Dashboard]
+ </notification>
+ <notification name="FirstOverrideKeys">
+ Your movement keys are now being handled by an object.
+Try the arrow keys or AWSD to see what they do.
+Some objects (like guns) require you to go into mouselook to use them.
+Press &apos;M&apos; to do this.
+ </notification>
+ <notification name="FirstSandbox">
+ This is a sandbox area, and is meant to help Residents learn how to build.
+
+Things you build here will be deleted after you leave, so don&apos;t forget to right-click and choose &apos;Take&apos; to move your creation to your Inventory.
+ </notification>
+ <notification name="MaxListSelectMessage">
+ You may only select up to [MAX_SELECT] items from this list.
+ </notification>
+ <notification name="VoiceInviteP2P">
+ [NAME] is inviting you to a Voice Chat call.
+Click Accept to join the call or Decline to decline the invitation. Click Block to block this caller.
+ <form name="form">
+ <button name="Accept" text="接å—"/>
+ <button name="Decline" text="è¬çµ•"/>
+ <button name="Mute" text="Block"/>
+ </form>
+ </notification>
+ <notification name="AutoUnmuteByIM">
+ [NAME] was sent an instant message and has been automatically unblocked.
+ </notification>
+ <notification name="AutoUnmuteByMoney">
+ [NAME] was given money and has been automatically unblocked.
+ </notification>
+ <notification name="AutoUnmuteByInventory">
+ [NAME] was offered inventory and has been automatically unblocked.
+ </notification>
+ <notification name="VoiceInviteGroup">
+ [NAME] has joined a Voice Chat call with the group [GROUP].
+Click Accept to join the call or Decline to decline the invitation. Click Block to block this caller.
+ <form name="form">
+ <button name="Accept" text="接å—"/>
+ <button name="Decline" text="è¬çµ•"/>
+ <button name="Mute" text="Block"/>
+ </form>
+ </notification>
+ <notification name="VoiceInviteAdHoc">
+ [NAME] has joined a voice chat call with a conference chat.
+Click Accept to join the call or Decline to decline the invitation. Click Block to block this caller.
+ <form name="form">
+ <button name="Accept" text="接å—"/>
+ <button name="Decline" text="è¬çµ•"/>
+ <button name="Mute" text="Block"/>
+ </form>
+ </notification>
+ <notification name="InviteAdHoc">
+ [NAME] is inviting you to a conference chat.
+Click Accept to join the chat or Decline to decline the invitation. Click Block to block this caller.
+ <form name="form">
+ <button name="Accept" text="接å—"/>
+ <button name="Decline" text="è¬çµ•"/>
+ <button name="Mute" text="Block"/>
+ </form>
+ </notification>
+ <notification name="VoiceChannelFull">
+ The voice call you are trying to join, [VOICE_CHANNEL_NAME], has reached maximum capacity. Please try again later.
+ </notification>
+ <notification name="ProximalVoiceChannelFull">
+ We&apos;re sorry. This area has reached maximum capacity for voice conversations. Please try to use voice in another area.
+ </notification>
+ <notification name="VoiceChannelDisconnected">
+ You have been disconnected from [VOICE_CHANNEL_NAME]. You will now be reconnected to Nearby Voice Chat.
+ </notification>
+ <notification name="VoiceChannelDisconnectedP2P">
+ [VOICE_CHANNEL_NAME] has ended the call. You will now be reconnected to Nearby Voice Chat.
+ </notification>
+ <notification name="P2PCallDeclined">
+ [VOICE_CHANNEL_NAME] has declined your call. You will now be reconnected to Nearby Voice Chat.
+ </notification>
+ <notification name="P2PCallNoAnswer">
+ [VOICE_CHANNEL_NAME] is not available to take your call. You will now be reconnected to Nearby Voice Chat.
+ </notification>
+ <notification name="VoiceChannelJoinFailed">
+ Failed to connect to [VOICE_CHANNEL_NAME], please try again later. You will now be reconnected to Nearby Voice Chat.
+ </notification>
+ <notification name="VoiceLoginRetry">
+ We are creating a voice channel for you. This may take up to one minute.
+ </notification>
+ <notification name="VoiceEffectsExpired">
+ One or more of your subscribed Voice Morphs has expired.
+[[URL] Click here] to renew your subscription.
+ </notification>
+ <notification name="VoiceEffectsExpiredInUse">
+ The active Voice Morph has expired, your normal voice settings have been applied.
+[[URL] Click here] to renew your subscription.
+ </notification>
+ <notification name="VoiceEffectsWillExpire">
+ One or more of your Voice Morphs will expire in less than [INTERVAL] days.
+[[URL] Click here] to renew your subscription.
+ </notification>
+ <notification name="VoiceEffectsNew">
+ New Voice Morphs are available!
+ </notification>
+ <notification name="Cannot enter parcel: not a group member">
+ Only members of a certain group can visit this area.
+ </notification>
+ <notification name="Cannot enter parcel: banned">
+ Cannot enter parcel, you have been banned.
+ </notification>
+ <notification name="Cannot enter parcel: not on access list">
+ Cannot enter parcel, you are not on the access list.
+ </notification>
+ <notification name="VoiceNotAllowed">
+ You do not have permission to connect to voice chat for [VOICE_CHANNEL_NAME].
+ </notification>
+ <notification name="VoiceCallGenericError">
+ An error has occurred while trying to connect to voice chat for [VOICE_CHANNEL_NAME]. Please try again later.
+ </notification>
+ <notification name="UnsupportedCommandSLURL">
+ 你所點擊的 SLurl ä½ç½®ä¸¦ä¸è¢«æ”¯æ´ã€‚
+ </notification>
+ <notification name="BlockedSLURL">
+ A SLurl was received from an untrusted browser and has been blocked for your security.
+ </notification>
+ <notification name="ThrottledSLURL">
+ Multiple SLurls were received from an untrusted browser within a short period.
+They will be blocked for a few seconds for your security.
+ </notification>
+ <notification name="IMToast">
+ [MESSAGE]
+ <form name="form">
+ <button name="respondbutton" text="回應"/>
+ </form>
+ </notification>
+ <notification name="ConfirmCloseAll">
+ 你確定è¦é—œé–‰å…¨éƒ¨ IMs å°è©±è¦–窗?
+ <usetemplate ignoretext="在我關閉全部的 IMs å°è©±è¦–窗å‰ç¢ºèªã€‚" name="okcancelignore" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="AttachmentSaved">
+ 附件已儲存。
+ </notification>
+ <notification name="UnableToFindHelpTopic">
+ Unable to find the help topic for this element.
+ </notification>
+ <notification name="ObjectMediaFailure">
+ Server Error: Media update or get failed.
+&apos;[ERROR]&apos;
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="TextChatIsMutedByModerator">
+ Your text chat has been muted by moderator.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="VoiceIsMutedByModerator">
+ Your voice has been muted by moderator.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="ConfirmClearTeleportHistory">
+ Are you sure you want to delete your teleport history?
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="BottomTrayButtonCanNotBeShown">
+ Selected button can not be shown right now.
+The button will be shown when there is enough space for it.
+ </notification>
+ <notification name="ShareNotification">
+ Select residents to share with.
+ </notification>
+ <notification name="ShareItemsConfirmation">
+ Are you sure you want to share the following items:
+
+&lt;nolink&gt;[ITEMS]&lt;/nolink&gt;
+
+With the following Residents:
+
+[RESIDENTS]
+ <usetemplate name="okcancelbuttons" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification name="ItemsShared">
+ 物å“å·²æˆåŠŸåˆ†äº«ã€‚
+ </notification>
+ <notification name="DeedToGroupFail">
+ 讓渡給群組失敗。
+ </notification>
+ <notification name="AvatarRezNotification">
+ ( [EXISTENCE] seconds alive )
+Avatar &apos;[NAME]&apos; declouded after [TIME] seconds.
+ </notification>
+ <notification name="AvatarRezSelfBakedDoneNotification">
+ ( [EXISTENCE] seconds alive )
+You finished baking your outfit after [TIME] seconds.
+ </notification>
+ <notification name="AvatarRezSelfBakedUpdateNotification">
+ ( [EXISTENCE] seconds alive )
+You sent out an update of your appearance after [TIME] seconds.
+[STATUS]
+ </notification>
+ <notification name="AvatarRezCloudNotification">
+ ( [EXISTENCE] seconds alive )
+Avatar &apos;[NAME]&apos; became cloud.
+ </notification>
+ <notification name="AvatarRezArrivedNotification">
+ ( [EXISTENCE] seconds alive )
+Avatar &apos;[NAME]&apos; appeared.
+ </notification>
+ <notification name="AvatarRezLeftCloudNotification">
+ ( [EXISTENCE] seconds alive )
+Avatar &apos;[NAME]&apos; left after [TIME] seconds as cloud.
+ </notification>
+ <notification name="AvatarRezEnteredAppearanceNotification">
+ ( [EXISTENCE] seconds alive )
+Avatar &apos;[NAME]&apos; entered appearance mode.
+ </notification>
+ <notification name="AvatarRezLeftAppearanceNotification">
+ ( [EXISTENCE] seconds alive )
+Avatar &apos;[NAME]&apos; left appearance mode.
+ </notification>
+ <notification name="NoConnect">
+ We&apos;re having trouble connecting using [PROTOCOL] [HOSTID].
+Please check your network and firewall setup.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="NoVoiceConnect">
+ We&apos;re having trouble connecting to your voice server:
+
+[HOSTID]
+
+Voice communications will not be available.
+Please check your network and firewall setup.
+ <usetemplate name="okbutton" yestext="確定"/>
+ </notification>
+ <notification name="AvatarRezLeftNotification">
+ ( [EXISTENCE] seconds alive )
+Avatar &apos;[NAME]&apos; left as fully loaded.
+ </notification>
+ <notification name="AvatarRezSelfBakedTextureUploadNotification">
+ ( [EXISTENCE] seconds alive )
+You uploaded a [RESOLUTION] baked texture for &apos;[BODYREGION]&apos; after [TIME] seconds.
+ </notification>
+ <notification name="AvatarRezSelfBakedTextureUpdateNotification">
+ ( [EXISTENCE] seconds alive )
+You locally updated a [RESOLUTION] baked texture for &apos;[BODYREGION]&apos; after [TIME] seconds.
+ </notification>
+ <notification name="ConfirmLeaveCall">
+ 你確定è¦é›¢é–‹é€™æ®µé€šè©±ï¼Ÿ
+ <usetemplate ignoretext="我çµæŸé€šè©±å‰é€²è¡Œç¢ºèª" name="okcancelignore" notext="å¦" yestext="是"/>
+ </notification>
+ <notification name="ConfirmMuteAll">
+ You have selected to mute all participants in a group call.
+This will also cause all residents that later join the call to be
+muted, even after you have left the call.
+
+Mute everyone?
+ <usetemplate ignoretext="在我å°æ‰€æœ‰ç¾¤çµ„通話的åƒèˆ‡è€…予以éœéŸ³å‰ç¢ºèª" name="okcancelignore" notext="å–消" yestext="確定"/>
+ </notification>
+ <notification label="èŠå¤©" name="HintChat">
+ To join the conversation, type into the chat field below.
+ </notification>
+ <notification label="Stand" name="HintSit">
+ To stand up and exit the sitting position, click the Stand button.
+ </notification>
+ <notification label="Speak" name="HintSpeak">
+ Click the Speak button to turn your microphone on and off.
+
+Click on the up arrow to see the voice control panel.
+
+Hiding the Speak button will disable the voice feature.
+ </notification>
+ <notification label="探索世界" name="HintDestinationGuide">
+ The Destination Guide contains thousands of new places to discover. Select a location and choose Teleport to start exploring.
+ </notification>
+ <notification label="å´é‚Šæ¬„" name="HintSidePanel">
+ Get quick access to your inventory, outfits, profiles and more in the side panel.
+ </notification>
+ <notification label="移動" name="HintMove">
+ To walk or run, open the Move Panel and use the directional arrows to navigate. You can also use the directional keys on your keyboard.
+ </notification>
+ <notification label="" name="HintMoveClick">
+ 1. Click to Walk
+Click anywhere on the ground to walk to that spot.
+
+2. Click and Drag to Rotate View
+Click and drag anywhere on the world to rotate your view
+ </notification>
+ <notification label="顯示å稱" name="HintDisplayName">
+ Set your customizable display name here. This is in addition to your unique username, which can&apos;t be changed. You can change how you see other people&apos;s names in your preferences.
+ </notification>
+ <notification label="View" name="HintView">
+ To change your camera view, use the Orbit and Pan controls. Reset your view by pressing Escape or walking.
+ </notification>
+ <notification label="收ç´å€" name="HintInventory">
+ Check your inventory to find items. Newest items can be easily found in the Recent tab.
+ </notification>
+ <notification label="你得到林登幣!" name="HintLindenDollar">
+ Here&apos;s your current balance of L$. Click Buy L$ to purchase more Linden Dollars.
+ </notification>
+ <notification name="PopupAttempt">
+ 一個çªé¡¯å¼è¦–窗開啟時被阻擋。
+ <form name="form">
+ <ignore name="ignore" text="啟用全部的çªé¡¯å¼è¦–窗"/>
+ <button name="open" text="é–‹å•Ÿçªé¡¯å¼è¦–窗"/>
+ </form>
+ </notification>
+ <notification name="AuthRequest">
+ The site at &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos; in realm &apos;[REALM]&apos; requires a user name and password.
+ <form name="form">
+ <input name="username" text="User Name"/>
+ <input name="password" text="Password"/>
+ <button name="ok" text="Submit"/>
+ <button name="cancel" text="å–消"/>
+ </form>
+ </notification>
+ <notification label="" name="ModeChange">
+ 改變劉覽器模å¼è¦æ±‚ä½ å¿…é ˆçµæŸé€€å‡ºä¸¦é‡æ–°å•Ÿå‹•ã€‚
+ <usetemplate name="okcancelbuttons" notext="ä¸è¦çµæŸé€€å‡º" yestext="çµæŸé€€å‡º"/>
+ </notification>
+ <notification label="" name="NoClassifieds">
+ Creation and editing of Classifieds is only available in Advanced mode. Would you like to quit and change modes? The mode selector can be found on the login screen.
+ <usetemplate name="okcancelbuttons" notext="ä¸è¦çµæŸé€€å‡º" yestext="çµæŸé€€å‡º"/>
+ </notification>
+ <notification label="" name="NoGroupInfo">
+ Creation and editing of Groups is only available in Advanced mode. Would you like to quit and change modes? The mode selector can be found on the login screen.
+ <usetemplate name="okcancelbuttons" notext="ä¸è¦çµæŸé€€å‡º" yestext="çµæŸé€€å‡º"/>
+ </notification>
+ <notification label="" name="NoPicks">
+ Creation and editing of Picks is only available in Advanced mode. Would you like to quit and change modes? The mode selector can be found on the login screen.
+ <usetemplate name="okcancelbuttons" notext="ä¸è¦çµæŸé€€å‡º" yestext="çµæŸé€€å‡º"/>
+ </notification>
+ <notification label="" name="NoWorldMap">
+ Viewing of the world map is only available in Advanced mode. Would you like to quit and change modes? The mode selector can be found on the login screen.
+ <usetemplate name="okcancelbuttons" notext="ä¸è¦çµæŸé€€å‡º" yestext="çµæŸé€€å‡º"/>
+ </notification>
+ <notification label="" name="NoVoiceCall">
+ Voice calls are only available in Advanced mode. Would you like to logout and change modes?
+ <usetemplate name="okcancelbuttons" notext="ä¸è¦çµæŸé€€å‡º" yestext="çµæŸé€€å‡º"/>
+ </notification>
+ <notification label="" name="NoAvatarShare">
+ Sharing is only available in Advanced mode. Would you like to logout and change modes?
+ <usetemplate name="okcancelbuttons" notext="ä¸è¦çµæŸé€€å‡º" yestext="çµæŸé€€å‡º"/>
+ </notification>
+ <notification label="" name="NoAvatarPay">
+ Paying other residents is only available in Advanced mode. Would you like to logout and change modes?
+ <usetemplate name="okcancelbuttons" notext="ä¸è¦çµæŸé€€å‡º" yestext="çµæŸé€€å‡º"/>
+ </notification>
+ <global name="UnsupportedCPU">
+ - ä½ çš„ CPU é‹ç®—速度未é”到系統最低é…å‚™è¦æ±‚。
+ </global>
+ <global name="UnsupportedGLRequirements">
+ You do not appear to have the proper hardware requirements for [APP_NAME]. [APP_NAME] requires an OpenGL graphics card that has multitexture support. If this is the case, you may want to make sure that you have the latest drivers for your graphics card, and service packs and patches for your operating system.
+
+If you continue to have problems, please visit the [SUPPORT_SITE].
+ </global>
+ <global name="UnsupportedCPUAmount">
+ 796
+ </global>
+ <global name="UnsupportedRAMAmount">
+ 510
+ </global>
+ <global name="UnsupportedGPU">
+ - 你的顯示å¡æœªé”系統最低é…å‚™è¦æ±‚。
+ </global>
+ <global name="UnsupportedRAM">
+ - 你的系統記憶體å¡æœªé”系統最低é…å‚™è¦æ±‚。
+ </global>
+ <global name="You can only set your &apos;Home Location&apos; on your land or at a mainland Infohub.">
+ 若你æ“有一塊土地,你å¯ä»¥æ¨™è¨˜å®ƒæˆç‚ºä½ çš„家的ä½ç½®ã€‚
+或者,你å¯ä»¥å¯Ÿçœ‹åœ°åœ–尋找標記為 &quot;資訊中心&quot; 的地方。
+ </global>
+ <global name="You died and have been teleported to your home location">
+ 你已經死亡並且被瞬間傳é€å›žä½ çš„家的ä½ç½®ã€‚
+ </global>
+</notifications>
diff --git a/indra/newview/skins/default/xui/zh/panel_active_object_row.xml b/indra/newview/skins/default/xui/zh/panel_active_object_row.xml
new file mode 100644
index 0000000000..42a4aa9e85
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_active_object_row.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_activeim_row">
+ <text name="object_name">
+ 未命å物件
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/zh/panel_adhoc_control_panel.xml
new file mode 100644
index 0000000000..7d16ac4129
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_adhoc_control_panel.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+ <layout_stack name="vertical_stack">
+ <layout_panel name="call_btn_panel">
+ <button label="通話" name="call_btn"/>
+ </layout_panel>
+ <layout_panel name="end_call_btn_panel">
+ <button label="離開通話" name="end_call_btn"/>
+ </layout_panel>
+ <layout_panel name="voice_ctrls_btn_panel">
+ <button label="語音控制" name="voice_ctrls_btn"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/zh/panel_avatar_list_item.xml
new file mode 100644
index 0000000000..eccb938f15
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_avatar_list_item.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="avatar_list_item">
+ <string name="FormatSeconds">
+ [COUNT]s
+ </string>
+ <string name="FormatMinutes">
+ [COUNT]m
+ </string>
+ <string name="FormatHours">
+ [COUNT]h
+ </string>
+ <string name="FormatDays">
+ [COUNT]d
+ </string>
+ <string name="FormatWeeks">
+ [COUNT]w
+ </string>
+ <string name="FormatMonths">
+ [COUNT]mon
+ </string>
+ <string name="FormatYears">
+ [COUNT]y
+ </string>
+ <text name="avatar_name" value="(載入)"/>
+ <text name="last_interaction" value="0s"/>
+ <icon name="permission_edit_theirs_icon" tool_tip="ä½ ä¸èƒ½ç·¨è¼¯é€™ä½æœ‹å‹çš„物件"/>
+ <icon name="permission_edit_mine_icon" tool_tip="這ä½æœ‹å‹èƒ½ç·¨è¼¯ã€åˆªé™¤æˆ–å–得你的物件"/>
+ <icon name="permission_map_icon" tool_tip="這ä½æœ‹å‹èƒ½åœ¨åœ°åœ–上找到你的ä½ç½®"/>
+ <icon name="permission_online_icon" tool_tip="這ä½æœ‹å‹ç•¶ä½ ä¸Šç·šèƒ½çœ‹åˆ°è¨Šæ¯"/>
+ <button name="profile_btn" tool_tip="察看檔案"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_avatar_tag.xml b/indra/newview/skins/default/xui/zh/panel_avatar_tag.xml
new file mode 100644
index 0000000000..fd91ea97d1
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_avatar_tag.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="avatar_tag_notification">
+ <panel name="msg_caption">
+ <text name="sender_tag_name">
+ Angela Tester
+ </text>
+ <text name="tag_time" value="23:30"/>
+ </panel>
+ <text_editor name="msg_text">
+ The quick brown fox jumps over the lazy dog.
+ </text_editor>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_block_list_sidetray.xml b/indra/newview/skins/default/xui/zh/panel_block_list_sidetray.xml
new file mode 100644
index 0000000000..1dfa024138
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_block_list_sidetray.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="block_list_panel">
+ <text name="title_text">
+ å°éŽ–清單
+ </text>
+ <scroll_list name="blocked" tool_tip="ç›®å‰å°éŽ–的居民清單"/>
+ <button label="å°éŽ–他人" name="Block resident..." tool_tip="挑é¸ä¸€ä½å±…民以進行å°éŽ–"/>
+ <button label="ä¾å稱å°éŽ–物件" name="Block object by name..." tool_tip="ä¾å稱挑é¸ä¸€å€‹ç‰©ä»¶é€²è¡Œå°éŽ–"/>
+ <button label="解除å°éŽ–" name="Unblock" tool_tip="將居民或物件由å°éŽ–清單中移除"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_body_parts_list_item.xml b/indra/newview/skins/default/xui/zh/panel_body_parts_list_item.xml
new file mode 100644
index 0000000000..550868e5e5
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_body_parts_list_item.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="wearable_item">
+ <text name="item_name" value="..."/>
+ <panel name="btn_lock" tool_tip="你並沒有權é™é€²è¡Œç·¨è¼¯"/>
+ <panel name="btn_edit_panel">
+ <button name="btn_edit" tool_tip="編輯這個體形"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_bodyparts_list_button_bar.xml b/indra/newview/skins/default/xui/zh/panel_bodyparts_list_button_bar.xml
new file mode 100644
index 0000000000..5e269fcd09
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_bodyparts_list_button_bar.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="clothing_list_button_bar_panel">
+ <button label="Switch" name="switch_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_bottomtray.xml b/indra/newview/skins/default/xui/zh/panel_bottomtray.xml
new file mode 100644
index 0000000000..734b83e6cc
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_bottomtray.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="bottom_tray">
+ <string name="DragIndicationImageName" value="Accordion_ArrowOpened_Off"/>
+ <string name="SpeakBtnToolTip" value="Turns microphone on/off"/>
+ <string name="VoiceControlBtnToolTip" value="顯示 / éš±è— èªžéŸ³æŽ§åˆ¶æ¿"/>
+ <layout_stack name="toolbar_stack">
+ <layout_panel name="speak_panel">
+ <talk_button name="talk">
+ <speak_button label="Speak" label_selected="Speak" name="speak_btn"/>
+ </talk_button>
+ </layout_panel>
+ <layout_panel name="gesture_panel">
+ <gesture_combo_list label="姿勢" name="Gesture" tool_tip="顯示 / éš±è— å§¿å‹¢"/>
+ </layout_panel>
+ <layout_panel name="movement_panel">
+ <bottomtray_button label="移動" name="movement_btn" tool_tip="顯示 / éš±è— ç§»å‹•æŽ§åˆ¶"/>
+ </layout_panel>
+ <layout_panel name="cam_panel">
+ <bottomtray_button label="視角" name="camera_btn" tool_tip="顯示 / éš±è— æ”影機控制"/>
+ </layout_panel>
+ <layout_panel name="snapshot_panel">
+ <bottomtray_button name="snapshots" tool_tip="æ‹æ”å¿«ç…§"/>
+ </layout_panel>
+ <layout_panel name="build_btn_panel">
+ <bottomtray_button label="建造" name="build_btn" tool_tip="顯示 / éš±è— å»ºé€ å·¥å…·"/>
+ </layout_panel>
+ <layout_panel name="search_btn_panel">
+ <bottomtray_button label="æœå°‹" name="search_btn" tool_tip="顯示 / éš±è— æœå°‹"/>
+ </layout_panel>
+ <layout_panel name="world_map_btn_panel">
+ <bottomtray_button label="地圖" name="world_map_btn" tool_tip="顯示 / éš±è— ä¸–ç•Œåœ°åœ–"/>
+ </layout_panel>
+ <layout_panel name="mini_map_btn_panel">
+ <bottomtray_button label="迷你地圖" name="mini_map_btn" tool_tip="顯示 / éš±è— è¿·ä½ åœ°åœ–"/>
+ </layout_panel>
+ <layout_panel name="im_well_panel">
+ <chiclet_im_well name="im_well">
+ <button name="Unread IM messages" tool_tip="Conversations"/>
+ </chiclet_im_well>
+ </layout_panel>
+ <layout_panel name="notification_well_panel">
+ <chiclet_notification name="notification_well">
+ <button name="Unread" tool_tip="通知"/>
+ </chiclet_notification>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_bottomtray_lite.xml b/indra/newview/skins/default/xui/zh/panel_bottomtray_lite.xml
new file mode 100644
index 0000000000..9833e9ef8b
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_bottomtray_lite.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="bottom_tray_lite">
+ <layout_stack name="toolbar_stack_lite">
+ <layout_panel name="gesture_panel">
+ <gesture_combo_list label="姿勢" name="Gesture" tool_tip="顯示 / éš±è— å§¿å‹¢"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_chat_header.xml b/indra/newview/skins/default/xui/zh/panel_chat_header.xml
new file mode 100644
index 0000000000..7916bf5155
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_chat_header.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="im_header" name="im_header">
+ <text name="time_box" value="23:30"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_classified_info.xml b/indra/newview/skins/default/xui/zh/panel_classified_info.xml
new file mode 100644
index 0000000000..cf3113ef1c
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_classified_info.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_classified_info">
+ <panel.string name="type_mature">
+ é©åº¦æˆäºº
+ </panel.string>
+ <panel.string name="type_pg">
+ 一般普級內容
+ </panel.string>
+ <panel.string name="l$_price">
+ L$[PRICE]
+ </panel.string>
+ <panel.string name="click_through_text_fmt">
+ [TELEPORT] 瞬間傳é€ï¼Œ[MAP] 地圖,[PROFILE] 檔案
+ </panel.string>
+ <panel.string name="date_fmt">
+ [mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt]
+ </panel.string>
+ <panel.string name="auto_renew_on">
+ Enabled
+ </panel.string>
+ <panel.string name="auto_renew_off">
+ Disabled
+ </panel.string>
+ <text name="title" value="Classified Info"/>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text_editor name="classified_name" value="[name]"/>
+ <text name="classified_location_label" value="ä½ç½®ï¼š"/>
+ <text_editor name="classified_location" value="[loading...]"/>
+ <text name="content_type_label" value="Content Type:"/>
+ <text_editor name="content_type" value="[content type]"/>
+ <text name="category_label" value="Category:"/>
+ <text_editor name="category" value="[category]"/>
+ <text name="creation_date_label" value="Creation date:"/>
+ <text_editor name="creation_date" tool_tip="Creation date" value="[date]"/>
+ <text name="price_for_listing_label" value="Price for listing:"/>
+ <text_editor name="price_for_listing" tool_tip="Price for listing." value="[price]"/>
+ <layout_stack name="descr_stack">
+ <layout_panel name="clickthrough_layout_panel">
+ <text name="click_through_label" value="Clicks:"/>
+ <text_editor name="click_through_text" tool_tip="Click through data" value="[clicks]"/>
+ </layout_panel>
+ <layout_panel name="price_layout_panel">
+ <text name="auto_renew_label" value="Auto renew:"/>
+ <text name="auto_renew" value="Enabled"/>
+ </layout_panel>
+ <layout_panel name="descr_layout_panel">
+ <text name="classified_desc_label" value="æ述:"/>
+ <text_editor name="classified_desc" value="[description]"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </scroll_container>
+ <panel name="buttons">
+ <layout_stack name="layout_stack1">
+ <layout_panel name="layout_panel1">
+ <button label="瞬間傳é€" name="teleport_btn"/>
+ </layout_panel>
+ <layout_panel name="show_on_map_btn_lp">
+ <button label="地圖" name="show_on_map_btn"/>
+ </layout_panel>
+ <layout_panel name="edit_btn_lp">
+ <button label="編輯" name="edit_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_clothing_list_button_bar.xml b/indra/newview/skins/default/xui/zh/panel_clothing_list_button_bar.xml
new file mode 100644
index 0000000000..ba63dada76
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_clothing_list_button_bar.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="clothing_list_button_bar_panel">
+ <button label="添加 +" name="add_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_clothing_list_item.xml b/indra/newview/skins/default/xui/zh/panel_clothing_list_item.xml
new file mode 100644
index 0000000000..1185336a2d
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_clothing_list_item.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="wearable_item">
+ <button name="btn_delete" tool_tip="ç”±è£æ‰®ç§»é™¤"/>
+ <text name="item_name" value="..."/>
+ <panel name="btn_lock" tool_tip="你並沒有權é™åŽ»ç·¨è¼¯"/>
+ <panel name="btn_edit_panel">
+ <button name="btn_edit" tool_tip="Edit this wearable"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_cof_wearables.xml b/indra/newview/skins/default/xui/zh/panel_cof_wearables.xml
new file mode 100644
index 0000000000..309ab1c0d4
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_cof_wearables.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="cof_wearables">
+ <accordion name="cof_wearables_accordion">
+ <accordion_tab name="tab_clothing" title="æœè£"/>
+ <accordion_tab name="tab_attachments" title="Attachments"/>
+ <accordion_tab name="tab_body_parts" title="身體部ä½"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_deletable_wearable_list_item.xml b/indra/newview/skins/default/xui/zh/panel_deletable_wearable_list_item.xml
new file mode 100644
index 0000000000..a9e65419c2
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_deletable_wearable_list_item.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="deletable_wearable_item">
+ <button name="btn_delete" tool_tip="ç”±è£æ‰®ç§»é™¤"/>
+ <text name="item_name" value="..."/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_dummy_clothing_list_item.xml b/indra/newview/skins/default/xui/zh/panel_dummy_clothing_list_item.xml
new file mode 100644
index 0000000000..6377bf4135
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_dummy_clothing_list_item.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="dummy_clothing_item">
+ <text name="item_name" value="..."/>
+ <panel name="btn_add_panel">
+ <button name="btn_add" tool_tip="添加更多物å“到這個類型"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_alpha.xml b/indra/newview/skins/default/xui/zh/panel_edit_alpha.xml
new file mode 100644
index 0000000000..eda4e99a13
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_edit_alpha.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_alpha_panel">
+ <scroll_container name="avatar_alpha_color_panel_scroll">
+ <panel name="avatar_alpha_color_panel">
+ <texture_picker label="下åŠèº«åŠé€æ˜Ž" name="Lower Alpha" tool_tip="點擊以挑é¸åœ–åƒ"/>
+ <texture_picker label="上åŠèº«åŠé€æ˜Ž" name="Upper Alpha" tool_tip="點擊以挑é¸åœ–åƒ"/>
+ <texture_picker label="頭部åŠé€æ˜Ž" name="Head Alpha" tool_tip="點擊以挑é¸åœ–åƒ"/>
+ <texture_picker label="眼ç›åŠé€æ˜Ž" name="Eye Alpha" tool_tip="點擊以挑é¸åœ–åƒ"/>
+ <texture_picker label="é ­é«®åŠé€æ˜Ž" name="Hair Alpha" tool_tip="點擊以挑é¸åœ–åƒ"/>
+ </panel>
+ </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_classified.xml b/indra/newview/skins/default/xui/zh/panel_edit_classified.xml
new file mode 100644
index 0000000000..f12701c981
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_edit_classified.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Edit Classified" name="panel_edit_classified">
+ <panel.string name="location_notice">
+ (儲存後將會更新)
+ </panel.string>
+ <string name="publish_label">
+ Publish
+ </string>
+ <string name="save_label">
+ 儲存
+ </string>
+ <text name="title">
+ Edit Classified
+ </text>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <panel name="snapshot_panel">
+ <icon label="" name="edit_icon" tool_tip="點擊以é¸æ“‡åœ–åƒ"/>
+ </panel>
+ <text name="Name:">
+ Title:
+ </text>
+ <text name="description_label">
+ æ述:
+ </text>
+ <text name="location_label">
+ ä½ç½®ï¼š
+ </text>
+ <text name="classified_location">
+ 載入中...
+ </text>
+ <button label="Set to Current Location" name="set_to_curr_location_btn"/>
+ <text name="category_label" value="Category:"/>
+ <text name="content_type_label" value="Content type:"/>
+ <icons_combo_box label="一般普級內容" name="content_type">
+ <icons_combo_box.item label="é©åº¦æˆäººå…§å®¹" name="mature_ci" value="Mature"/>
+ <icons_combo_box.item label="一般普級內容" name="pg_ci" value="PG"/>
+ </icons_combo_box>
+ <check_box label="Auto renew each week" name="auto_renew"/>
+ <text name="price_for_listing_label" value="Price for listing:"/>
+ <spinner label="L$" name="price_for_listing" tool_tip="Price for listing." value="50"/>
+ </panel>
+ </scroll_container>
+ <panel label="bottom_panel" name="bottom_panel">
+ <layout_stack name="bottom_panel_ls">
+ <layout_panel name="save_changes_btn_lp">
+ <button label="[LABEL]" name="save_changes_btn"/>
+ </layout_panel>
+ <layout_panel name="show_on_map_btn_lp">
+ <button label="å–消" name="cancel_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_eyes.xml b/indra/newview/skins/default/xui/zh/panel_edit_eyes.xml
new file mode 100644
index 0000000000..40dd61971a
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_edit_eyes.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_eyes_panel">
+ <panel name="avatar_eye_color_panel">
+ <texture_picker label="Iris" name="Iris" tool_tip="點擊以挑é¸åœ–åƒ"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="eyes_main_tab" title="眼ç›"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_gloves.xml b/indra/newview/skins/default/xui/zh/panel_edit_gloves.xml
new file mode 100644
index 0000000000..7b39e33a9b
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_edit_gloves.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_gloves_panel">
+ <panel name="avatar_gloves_color_panel">
+ <texture_picker label="æ質" name="Fabric" tool_tip="點擊以挑é¸åœ–åƒ"/>
+ <color_swatch label="Color/Tint" name="Color/Tint" tool_tip="Click to open color picker"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="gloves_main_tab" title="手套"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_hair.xml b/indra/newview/skins/default/xui/zh/panel_edit_hair.xml
new file mode 100644
index 0000000000..a7440093bc
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_edit_hair.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_hair_panel">
+ <panel name="avatar_hair_color_panel">
+ <texture_picker label="æ質" name="Texture" tool_tip="點擊以挑é¸åœ–åƒ"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="hair_color_tab" title="é¡è‰²"/>
+ <accordion_tab name="hair_style_tab" title="Style"/>
+ <accordion_tab name="hair_eyebrows_tab" title="Eyebrows"/>
+ <accordion_tab name="hair_facial_tab" title="Facial"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_jacket.xml b/indra/newview/skins/default/xui/zh/panel_edit_jacket.xml
new file mode 100644
index 0000000000..dcef070e2e
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_edit_jacket.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_jacket_panel">
+ <panel name="avatar_jacket_color_panel">
+ <texture_picker label="上åŠèº«æ質" name="Upper Fabric" tool_tip="點擊以挑é¸åœ–åƒ"/>
+ <texture_picker label="下åŠèº«æ質" name="Lower Fabric" tool_tip="點擊以挑é¸åœ–åƒ"/>
+ <color_swatch label="Color/Tint" name="Color/Tint" tool_tip="Click to open color picker"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="jacket_main_tab" title="夾克"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_pants.xml b/indra/newview/skins/default/xui/zh/panel_edit_pants.xml
new file mode 100644
index 0000000000..01b875f1bd
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_edit_pants.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_pants_panel">
+ <panel name="avatar_pants_color_panel">
+ <texture_picker label="æ質" name="Fabric" tool_tip="點擊以挑é¸åœ–åƒ"/>
+ <color_swatch label="Color/Tint" name="Color/Tint" tool_tip="點擊以開啟é¡è‰²æŒ‘é¸å™¨"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="pants_main_tab" title="褲å­"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_physics.xml b/indra/newview/skins/default/xui/zh/panel_edit_physics.xml
new file mode 100644
index 0000000000..26fedb59be
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_edit_physics.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_physics_panel">
+ <panel label="" name="accordion_panel">
+ <accordion name="physics_accordion">
+ <accordion_tab name="physics_breasts_updown_tab" title="乳房彈性"/>
+ <accordion_tab name="physics_breasts_inout_tab" title="ä¹³æºæ·±æ·º"/>
+ <accordion_tab name="physics_breasts_leftright_tab" title="乳房æ–擺"/>
+ <accordion_tab name="physics_belly_tab" title="腹部彈性"/>
+ <accordion_tab name="physics_butt_tab" title="臀部彈性"/>
+ <accordion_tab name="physics_butt_leftright_tab" title="臀部æ–擺"/>
+ <accordion_tab name="physics_advanced_tab" title="進階åƒæ•¸"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_pick.xml b/indra/newview/skins/default/xui/zh/panel_edit_pick.xml
new file mode 100644
index 0000000000..6ac7226185
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_edit_pick.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="編輯精é¸åœ°é»ž" name="panel_edit_pick">
+ <panel.string name="location_notice">
+ (將在儲存後更新)
+ </panel.string>
+ <text name="title">
+ 編輯精é¸åœ°é»ž
+ </text>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <icon label="" name="edit_icon" tool_tip="點擊以é¸æ“‡åœ–åƒ"/>
+ <text name="Name:">
+ 標題:
+ </text>
+ <text name="description_label">
+ æ述:
+ </text>
+ <text name="location_label">
+ ä½ç½®ï¼š
+ </text>
+ <text name="pick_location">
+ 載入中...
+ </text>
+ <button label="設定為目å‰ä½ç½®" name="set_to_curr_location_btn"/>
+ </panel>
+ </scroll_container>
+ <panel label="bottom_panel" name="bottom_panel">
+ <layout_stack name="layout_stack1">
+ <layout_panel name="layout_panel1">
+ <button label="儲存精é¸åœ°é»ž" name="save_changes_btn"/>
+ </layout_panel>
+ <layout_panel name="layout_panel1">
+ <button label="å–消" name="cancel_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_profile.xml b/indra/newview/skins/default/xui/zh/panel_edit_profile.xml
new file mode 100644
index 0000000000..7734c3a417
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_edit_profile.xml
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="檔案編輯" name="edit_profile_panel">
+ <string name="CaptionTextAcctInfo">
+ [ACCTTYPE]
+[PAYMENTINFO] [AGEVERIFICATION]
+ </string>
+ <string name="RegisterDateFormat">
+ [REG_DATE] ([AGE])
+ </string>
+ <string name="AcctTypeResident" value="Resident"/>
+ <string name="AcctTypeTrial" value="Trial"/>
+ <string name="AcctTypeCharterMember" value="Charter Member"/>
+ <string name="AcctTypeEmployee" value="Linden Lab Employee"/>
+ <string name="PaymentInfoUsed" value="Payment Info Used"/>
+ <string name="PaymentInfoOnFile" value="Payment Info On File"/>
+ <string name="NoPaymentInfoOnFile" value="No Payment Info On File"/>
+ <string name="AgeVerified" value="Age-verified"/>
+ <string name="NotAgeVerified" value="Not Age-verified"/>
+ <string name="partner_edit_link_url">
+ http://www.secondlife.com/account/partners.php?lang=en
+ </string>
+ <string name="my_account_link_url">
+ http://secondlife.com/my
+ </string>
+ <string name="no_partner_text" value="ç„¡"/>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <panel name="data_panel">
+ <text name="display_name_label" value="顯示å稱:"/>
+ <text name="solo_username_label" value="使用者å稱:"/>
+ <button name="set_name" tool_tip="設定顯示å稱"/>
+ <text name="user_label" value="使用者å稱:"/>
+ <panel name="lifes_images_panel">
+ <panel name="second_life_image_panel">
+ <text name="second_life_photo_title_text" value="[SECOND_LIFE]:"/>
+ </panel>
+ <icon label="" name="2nd_life_edit_icon" tool_tip="點擊以é¸æ“‡åœ–åƒ"/>
+ </panel>
+ <panel name="first_life_image_panel">
+ <text name="real_world_photo_title_text" value="真實世界:"/>
+ </panel>
+ <icon label="" name="real_world_edit_icon" tool_tip="點擊以é¸æ“‡åœ–åƒ"/>
+ <text name="title_homepage_text">
+ 首é ï¼š
+ </text>
+ <line_editor name="homepage_edit" value="http://"/>
+ <text name="title_acc_status_text" value="我的帳戶:"/>
+ <text_editor name="acc_status_text" value="Resident. No payment info on file."/>
+ <text name="my_account_link" value="[[URL] å‰å¾€æˆ‘的塗鴉牆]"/>
+ <text name="title_partner_text" value="我的é…å¶ï¼š"/>
+ <panel name="partner_data_panel">
+ <text initial_value="(retrieving)" name="partner_text"/>
+ </panel>
+ <text name="partner_edit_link" value="[[URL] 編輯]"/>
+ </panel>
+ </panel>
+ </scroll_container>
+ <panel name="profile_me_buttons_panel">
+ <layout_stack name="bottom_panel_ls">
+ <layout_panel name="save_changes_btn_lp">
+ <button label="儲存變更" name="save_btn"/>
+ </layout_panel>
+ <layout_panel name="show_on_map_btn_lp">
+ <button label="å–消" name="cancel_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_shape.xml b/indra/newview/skins/default/xui/zh/panel_edit_shape.xml
new file mode 100644
index 0000000000..f249100786
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_edit_shape.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_shape_panel">
+ <string name="meters">
+ 公尺
+ </string>
+ <string name="feet">
+ 英呎
+ </string>
+ <string name="height">
+ 身高:
+ </string>
+ <panel label="襯衫" name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shape_body_tab" title="身體"/>
+ <accordion_tab name="shape_head_tab" title="頭部"/>
+ <accordion_tab name="shape_eyes_tab" title="眼ç›"/>
+ <accordion_tab name="shape_ears_tab" title="耳朵"/>
+ <accordion_tab name="shape_nose_tab" title="é¼»å­"/>
+ <accordion_tab name="shape_mouth_tab" title="嘴巴"/>
+ <accordion_tab name="shape_chin_tab" title="下巴"/>
+ <accordion_tab name="shape_torso_tab" title="軀幹"/>
+ <accordion_tab name="shape_legs_tab" title="腿部"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_shirt.xml b/indra/newview/skins/default/xui/zh/panel_edit_shirt.xml
new file mode 100644
index 0000000000..f8ff76aa9b
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_edit_shirt.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_shirt_panel">
+ <panel name="avatar_shirt_color_panel">
+ <texture_picker label="æ質" name="Fabric" tool_tip="點擊以挑é¸åœ–åƒ"/>
+ <color_swatch label="Color/Tint" name="Color/Tint" tool_tip="點擊以開啟é¡è‰²æŒ‘é¸å™¨"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shirt_main_tab" title="襯衫"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_shoes.xml b/indra/newview/skins/default/xui/zh/panel_edit_shoes.xml
new file mode 100644
index 0000000000..97e43f5753
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_edit_shoes.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_shoes_panel">
+ <panel name="avatar_shoes_color_panel">
+ <texture_picker label="æ質" name="Fabric" tool_tip="點擊以挑é¸åœ–åƒ"/>
+ <color_swatch label="é¡è‰²/色調" name="Color/Tint" tool_tip="點擊以開啟é¡è‰²æŒ‘é¸å™¨"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shoes_main_tab" title="éž‹å­"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_skin.xml b/indra/newview/skins/default/xui/zh/panel_edit_skin.xml
new file mode 100644
index 0000000000..fdd6d05ca5
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_edit_skin.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_skin_panel">
+ <panel name="avatar_skin_color_panel">
+ <texture_picker label="Head Tattoos" name="Head Tattoos" tool_tip="點擊以挑é¸åœ–åƒ"/>
+ <texture_picker label="Upper Tattoos" name="Upper Tattoos" tool_tip="點擊以挑é¸åœ–åƒ"/>
+ <texture_picker label="Lower Tattoos" name="Lower Tattoos" tool_tip="點擊以挑é¸åœ–åƒ"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="skin_color_tab" title="Skin Color"/>
+ <accordion_tab name="skin_face_tab" title="Face Detail"/>
+ <accordion_tab name="skin_makeup_tab" title="Makeup"/>
+ <accordion_tab name="skin_body_tab" title="Body Detail"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_skirt.xml b/indra/newview/skins/default/xui/zh/panel_edit_skirt.xml
new file mode 100644
index 0000000000..10432c16b1
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_edit_skirt.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_skirt_panel">
+ <panel name="avatar_skirt_color_panel">
+ <texture_picker label="æ質" name="Fabric" tool_tip="點擊以挑é¸åœ–åƒ"/>
+ <color_swatch label="Color/Tint" name="Color/Tint" tool_tip="點擊以開啟é¡è‰²æŒ‘é¸å™¨"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="skirt_main_tab" title="裙å­"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_socks.xml b/indra/newview/skins/default/xui/zh/panel_edit_socks.xml
new file mode 100644
index 0000000000..6727781740
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_edit_socks.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_socks_panel">
+ <panel name="avatar_socks_color_panel">
+ <texture_picker label="æ質" name="Fabric" tool_tip="點擊以挑é¸åœ–åƒ"/>
+ <color_swatch label="Color/Tint" name="Color/Tint" tool_tip="點擊以開啟é¡è‰²æŒ‘é¸å™¨"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="socks_main_tab" title="襪å­"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_tattoo.xml b/indra/newview/skins/default/xui/zh/panel_edit_tattoo.xml
new file mode 100644
index 0000000000..1b34a0e0ee
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_edit_tattoo.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_tattoo_panel">
+ <panel name="avatar_tattoo_color_panel">
+ <texture_picker label="頭部刺é’" name="Head Tattoo" tool_tip="點擊以挑é¸åœ–åƒ"/>
+ <texture_picker label="上åŠèº«åˆºé’" name="Upper Tattoo" tool_tip="點擊以挑é¸ç…§ç‰‡"/>
+ <texture_picker label="下åŠèº«åˆºé’" name="Lower Tattoo" tool_tip="點擊以挑é¸åœ–åƒ"/>
+ <color_swatch label="Color/Tint" name="Color/Tint" tool_tip="點擊以開啟é¡è‰²æŒ‘é¸å™¨"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_underpants.xml b/indra/newview/skins/default/xui/zh/panel_edit_underpants.xml
new file mode 100644
index 0000000000..15cae8d233
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_edit_underpants.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_underpants_panel">
+ <panel name="avatar_underpants_color_panel">
+ <texture_picker label="æ質" name="Fabric" tool_tip="點擊以挑é¸åœ–åƒ"/>
+ <color_swatch label="Color/Tint" name="Color/Tint" tool_tip="Click to open color picker"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="underpants_main_tab" title="內褲"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_undershirt.xml b/indra/newview/skins/default/xui/zh/panel_edit_undershirt.xml
new file mode 100644
index 0000000000..486175eb64
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_edit_undershirt.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_undershirt_panel">
+ <panel name="avatar_undershirt_color_panel">
+ <texture_picker label="æ質" name="Fabric" tool_tip="點擊以挑é¸åœ–åƒ"/>
+ <color_swatch label="Color/Tint" name="Color/Tint" tool_tip="Click to open Color Picker"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="undershirt_main_tab" title="內衣"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_edit_wearable.xml b/indra/newview/skins/default/xui/zh/panel_edit_wearable.xml
new file mode 100644
index 0000000000..066b1fd389
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_edit_wearable.xml
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Wearable" name="panel_edit_wearable">
+ <string name="edit_shape_title">
+ Editing Shape
+ </string>
+ <string name="edit_skin_title">
+ Editing Skin
+ </string>
+ <string name="edit_hair_title">
+ Editing Hair
+ </string>
+ <string name="edit_eyes_title">
+ Editing Eyes
+ </string>
+ <string name="edit_shirt_title">
+ Editing Shirt
+ </string>
+ <string name="edit_pants_title">
+ Editing Pants
+ </string>
+ <string name="edit_shoes_title">
+ Editing Shoes
+ </string>
+ <string name="edit_socks_title">
+ Editing Socks
+ </string>
+ <string name="edit_jacket_title">
+ Editing Jacket
+ </string>
+ <string name="edit_skirt_title">
+ Editing Skirt
+ </string>
+ <string name="edit_gloves_title">
+ Editing Gloves
+ </string>
+ <string name="edit_undershirt_title">
+ Editing Undershirt
+ </string>
+ <string name="edit_underpants_title">
+ Editing Underpants
+ </string>
+ <string name="edit_alpha_title">
+ åŠé€æ˜Žé®ç½©ç·¨è¼¯ä¸­
+ </string>
+ <string name="edit_tattoo_title">
+ 刺é’編輯中
+ </string>
+ <string name="edit_physics_title">
+ 身體物ç†ç·¨è¼¯ä¸­
+ </string>
+ <string name="shape_desc_text">
+ 體形:
+ </string>
+ <string name="skin_desc_text">
+ 皮膚:
+ </string>
+ <string name="hair_desc_text">
+ 頭髮:
+ </string>
+ <string name="eyes_desc_text">
+ 眼ç›ï¼š
+ </string>
+ <string name="shirt_desc_text">
+ 襯衫:
+ </string>
+ <string name="pants_desc_text">
+ 褲å­ï¼š
+ </string>
+ <string name="shoes_desc_text">
+ éž‹å­ï¼š
+ </string>
+ <string name="socks_desc_text">
+ 襪å­ï¼š
+ </string>
+ <string name="jacket_desc_text">
+ 夾克:
+ </string>
+ <string name="skirt_desc_text">
+ 裙å­ï¼š
+ </string>
+ <string name="gloves_desc_text">
+ 手套:
+ </string>
+ <string name="undershirt_desc_text">
+ 內衣:
+ </string>
+ <string name="underpants_desc_text">
+ 內褲:
+ </string>
+ <string name="alpha_desc_text">
+ åŠé€æ˜Žé®ç½©ï¼š
+ </string>
+ <string name="tattoo_desc_text">
+ 刺é’:
+ </string>
+ <string name="physics_desc_text">
+ 身體物ç†ï¼š
+ </string>
+ <labeled_back_button label="儲存" name="back_btn" tool_tip="回到編輯è£æ‰®"/>
+ <text name="edit_wearable_title" value="體形編輯中"/>
+ <panel label="襯衫" name="wearable_type_panel">
+ <text name="description_text" value="體形:"/>
+ <radio_group name="sex_radio">
+ <radio_item label="" name="sex_male" tool_tip="男性" value="1"/>
+ <radio_item label="" name="sex_female" tool_tip="女性" value="0"/>
+ </radio_group>
+ <icon name="male_icon" tool_tip="男性"/>
+ <icon name="female_icon" tool_tip="女性"/>
+ </panel>
+ <panel name="button_panel">
+ <layout_stack name="button_panel_ls">
+ <layout_panel name="save_as_btn_lp">
+ <button label="å¦å­˜" name="save_as_button"/>
+ </layout_panel>
+ <layout_panel name="revert_btn_lp">
+ <button label="復原變更" name="revert_button"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_group_control_panel.xml b/indra/newview/skins/default/xui/zh/panel_group_control_panel.xml
new file mode 100644
index 0000000000..3915e80d43
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_group_control_panel.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+ <layout_stack name="vertical_stack">
+ <layout_panel name="group_info_btn_panel">
+ <button label="群組檔案" name="group_info_btn"/>
+ </layout_panel>
+ <layout_panel name="call_btn_panel">
+ <button label="群組通話" name="call_btn"/>
+ </layout_panel>
+ <layout_panel name="end_call_btn_panel">
+ <button label="çµæŸé€šè©±" name="end_call_btn"/>
+ </layout_panel>
+ <layout_panel name="voice_ctrls_btn_panel">
+ <button label="開啟語音控制" name="voice_ctrls_btn"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_group_general.xml b/indra/newview/skins/default/xui/zh/panel_group_general.xml
new file mode 100644
index 0000000000..55cbf5a617
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_group_general.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="一般" name="general_tab">
+ <panel.string name="help_text">
+ The General tab contains general information about this group, a list of members, general Group Preferences and member options.
+
+Hover your mouse over the options for more help.
+ </panel.string>
+ <panel.string name="group_info_unchanged">
+ 一般群組資訊已經被變更
+ </panel.string>
+ <panel.string name="incomplete_member_data_str">
+ Retrieving member data
+ </panel.string>
+ <panel name="group_info_top">
+ <texture_picker label="" name="insignia" tool_tip="點擊以挑é¸åœ–åƒ"/>
+ <text name="prepend_founded_by">
+ 創辦人:
+ </text>
+ <text name="join_cost_text">
+ å…è²»
+ </text>
+ <button label="ç¾åœ¨å°±åŠ å…¥!!" name="btn_join"/>
+ </panel>
+ <text_editor name="charter">
+ 群組è¦ç« 
+ </text_editor>
+ <name_list name="visible_members">
+ <name_list.columns label="æˆå“¡" name="name"/>
+ <name_list.columns label="頭銜" name="title"/>
+ <name_list.columns label="狀態" name="status"/>
+ </name_list>
+ <text name="my_group_settngs_label">
+ 自己
+ </text>
+ <text name="active_title_label">
+ 我的頭銜:
+ </text>
+ <combo_box name="active_title" tool_tip="Sets the title that appears in your avatar&apos;s name tag when this group is active."/>
+ <check_box label="接å—群組通知" name="receive_notices" tool_tip="Sets whether you want to receive Notices from this group. Uncheck this box if this group is spamming you."/>
+ <check_box label="顯示在我的檔案中" name="list_groups_in_profile" tool_tip="Sets whether you want to show this group in your profile"/>
+ <panel name="preferences_container">
+ <text name="group_settngs_label">
+ 群組
+ </text>
+ <check_box label="任何人都å¯ä»¥åŠ å…¥" name="open_enrollement" tool_tip="Sets whether this group allows new members to join without being invited."/>
+ <check_box label="加入費用" name="check_enrollment_fee" tool_tip="Sets whether to require an enrollment fee to join the group"/>
+ <spinner label="L$" name="spin_enrollment_fee" tool_tip="New members must pay this fee to join the group when Enrollment Fee is checked."/>
+ <combo_box name="group_mature_check" tool_tip="Sets whether your group contains information rated as Moderate">
+ <combo_item name="select_mature">
+ - é¸æ“‡å…§å®¹åˆ†ç´š -
+ </combo_item>
+ <combo_box.item label="é©åº¦æˆäººå…§å®¹" name="mature"/>
+ <combo_box.item label="一般普級內容" name="pg"/>
+ </combo_box>
+ <check_box initial_value="true" label="顯示在æœå°‹ä¸­" name="show_in_group_list" tool_tip="讓其他人å¯ä»¥åœ¨æœå°‹çµæžœä¸­çœ‹åˆ°é€™å€‹ç¾¤çµ„"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/zh/panel_group_info_sidetray.xml
new file mode 100644
index 0000000000..db01edcdb3
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_group_info_sidetray.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="群組檔案" name="GroupInfo">
+ <panel.string name="default_needs_apply_text">
+ 變更未儲存
+ </panel.string>
+ <panel.string name="want_apply_text">
+ ä½ è¦å„²å­˜é€™äº›è®Šæ›´å—Žï¼Ÿ
+ </panel.string>
+ <panel.string name="group_join_btn">
+ 加入(L$[AMOUNT])
+ </panel.string>
+ <panel.string name="group_join_free">
+ å…è²»
+ </panel.string>
+ <panel name="group_info_top">
+ <text_editor name="group_name" value="(載入中...)"/>
+ <line_editor label="在此輸入你的新群組å稱" name="group_name_editor"/>
+ </panel>
+ <layout_stack name="layout">
+ <layout_panel name="group_accordions">
+ <accordion name="groups_accordion">
+ <accordion_tab name="group_general_tab" title="一般"/>
+ <accordion_tab name="group_roles_tab" title="角色"/>
+ <accordion_tab name="group_notices_tab" title="通知"/>
+ <accordion_tab name="group_land_tab" title="土地 / 資產"/>
+ </accordion>
+ </layout_panel>
+ </layout_stack>
+ <layout_stack name="button_row_ls">
+ <layout_panel name="btn_chat_lp">
+ <button label="èŠå¤©" name="btn_chat"/>
+ </layout_panel>
+ <layout_panel name="call_btn_lp">
+ <button label="群組通話" name="btn_call" tool_tip="與此群組進行通話"/>
+ </layout_panel>
+ <layout_panel name="btn_apply_lp">
+ <button label="儲存" label_selected="儲存" name="btn_apply"/>
+ <button label="創造群組" name="btn_create" tool_tip="創造一個新群組"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_group_invite.xml b/indra/newview/skins/default/xui/zh/panel_group_invite.xml
new file mode 100644
index 0000000000..07dcb2303e
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_group_invite.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="邀請一個æˆå“¡" name="invite_panel">
+ <panel.string name="confirm_invite_owner_str">
+ Are you sure you want to invite new owner(s)? This action is permanent!
+ </panel.string>
+ <panel.string name="loading">
+ (載入中...)
+ </panel.string>
+ <panel.string name="already_in_group">
+ Some Residents you chose are already in the group, and so were not sent an invitation.
+ </panel.string>
+ <text name="help_text">
+ You can select multiple Residents to invite to your group. Click &apos;Open Resident Chooser&apos; to start.
+ </text>
+ <button label="é–‹å•Ÿå±…æ°‘é¸æ“‡è¦–窗" name="add_button"/>
+ <name_list name="invitee_list" tool_tip="Hold the Ctrl key and click Resident names to multi-select"/>
+ <button label="Remove Selected from List" name="remove_button" tool_tip="Removes the Residents selected above from the invite list"/>
+ <text name="role_text">
+ Choose what Role to assign them to:
+ </text>
+ <combo_box name="role_name" tool_tip="Choose from the list of Roles you are allowed to assign members to"/>
+ <button label="é€å‡ºé‚€è«‹" name="ok_button"/>
+ <button label="å–消" name="cancel_button"/>
+ <string name="GroupInvitation">
+ 群組邀請
+ </string>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_group_land_money.xml b/indra/newview/skins/default/xui/zh/panel_group_land_money.xml
new file mode 100644
index 0000000000..5ac7410c8b
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_group_land_money.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Land &amp; L$" name="land_money_tab">
+ <panel.string name="help_text">
+ A warning appears until the Total Land in Use is less than or = to the Total Contribution.
+ </panel.string>
+ <panel.string name="cant_view_group_land_text">
+ You don&apos;t have permission to view group owned land
+ </panel.string>
+ <panel.string name="epmty_view_group_land_text">
+ 沒有項目
+ </panel.string>
+ <panel.string name="cant_view_group_accounting_text">
+ You don&apos;t have permission to view the group&apos;s accounting information.
+ </panel.string>
+ <panel.string name="loading_txt">
+ 載入中...
+ </panel.string>
+ <panel.string name="land_contrib_error">
+ 無法設定你的土地æç»
+ </panel.string>
+ <panel name="layout_panel_landmoney">
+ <scroll_list name="group_parcel_list">
+ <scroll_list.columns label="地段" name="name"/>
+ <scroll_list.columns label="地å€" name="location"/>
+ <scroll_list.columns label="é¡žåž‹" name="type"/>
+ <scroll_list.columns label="å€åŸŸ" name="area"/>
+ <scroll_list.columns label="éš±è—" name="hidden"/>
+ </scroll_list>
+ <text name="total_contributed_land_label">
+ Total contribution:
+ </text>
+ <text name="total_contributed_land_value">
+ [AREA] m²
+ </text>
+ <button label="地圖" label_selected="地圖" name="map_button"/>
+ <text name="total_land_in_use_label">
+ Total land in use:
+ </text>
+ <text name="total_land_in_use_value">
+ [AREA] m²
+ </text>
+ <text name="land_available_label">
+ Land available:
+ </text>
+ <text name="land_available_value">
+ [AREA] m²
+ </text>
+ <text name="your_contribution_label">
+ ä½ çš„æç»ï¼š
+ </text>
+ <text name="your_contribution_units">
+ m²
+ </text>
+ <text name="your_contribution_max_value">
+ ([AMOUNT] 最大)
+ </text>
+ <text name="group_over_limit_text">
+ More land credits are needed to support land in use
+ </text>
+ <text name="group_money_heading">
+ 群組 L$
+ </text>
+ </panel>
+ <tab_container name="group_money_tab_container">
+ <panel label="PLANNING" name="group_money_planning_tab">
+ <text_editor name="group_money_planning_text">
+ 載入中...
+ </text_editor>
+ </panel>
+ <panel label="細節" name="group_money_details_tab">
+ <text_editor name="group_money_details_text">
+ 載入中...
+ </text_editor>
+ <button name="earlier_details_button" tool_tip="Back"/>
+ <button name="later_details_button" tool_tip="Next"/>
+ </panel>
+ <panel label="銷售" name="group_money_sales_tab">
+ <text_editor name="group_money_sales_text">
+ 載入中...
+ </text_editor>
+ <button name="earlier_sales_button" tool_tip="Back"/>
+ <button name="later_sales_button" tool_tip="Next"/>
+ </panel>
+ </tab_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_group_list_item.xml b/indra/newview/skins/default/xui/zh/panel_group_list_item.xml
new file mode 100644
index 0000000000..175293cdf7
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_group_list_item.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="group_list_item">
+ <text name="group_name" value="未知"/>
+ <button name="profile_btn" tool_tip="察看檔案"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_group_notices.xml b/indra/newview/skins/default/xui/zh/panel_group_notices.xml
new file mode 100644
index 0000000000..26273dd9ce
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_group_notices.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="通知" name="notices_tab">
+ <panel.string name="help_text">
+ Notices let you send a message and an optionally attached item.
+Notices only go to group members in Roles with the ability to receive Notices.
+You can turn off Notices on the General tab.
+ </panel.string>
+ <panel.string name="no_notices_text">
+ 沒有éŽåŽ»çš„通知
+ </panel.string>
+ <text name="lbl2">
+ 通知ä¿ç•™ 14 天。
+æ¯å€‹ç¾¤çµ„一天最多 200 則
+ </text>
+ <scroll_list name="notice_list">
+ <scroll_list.columns label="主旨" name="subject"/>
+ <scroll_list.columns label="ç”±" name="from"/>
+ <scroll_list.columns label="日期" name="date"/>
+ </scroll_list>
+ <text name="notice_list_none_found">
+ 沒發ç¾ã€‚
+ </text>
+ <button label="新通知" name="create_new_notice" tool_tip="建立一個新通知"/>
+ <button name="refresh_notices" tool_tip="Refresh list of notices"/>
+ <panel label="建立新通知" name="panel_create_new_notice">
+ <text name="lbl">
+ 建立一個通知
+ </text>
+ <text name="lbl3">
+ 主旨:
+ </text>
+ <text name="lbl4">
+ 訊æ¯ï¼š
+ </text>
+ <text name="lbl5">
+ 附件:
+ </text>
+ <text name="string">
+ 將物å“拖曳並丟於此處以添加為附件:
+ </text>
+ <button label="收ç´å€" name="open_inventory" tool_tip="開啟收ç´å€"/>
+ <button name="remove_attachment" tool_tip="由你的通知移除附件"/>
+ <button label="é€å‡º" label_selected="é€å‡º" name="send_notice"/>
+ <group_drop_target name="drop_target" tool_tip="Drag an inventory item onto this target box to send it with this notice. You must have permission to copy and transfer the item in order to attach it."/>
+ </panel>
+ <panel label="察看éŽåŽ»çš„通知" name="panel_view_past_notice">
+ <text name="lbl">
+ 存檔的通知
+ </text>
+ <text name="lbl2">
+ è¦é€å‡ºä¸€å€‹æ–°é€šçŸ¥ï¼Œé»žæ“Š + 按鈕
+ </text>
+ <text name="lbl3">
+ 主旨:
+ </text>
+ <text name="lbl4">
+ 訊æ¯ï¼š
+ </text>
+ <button label="開啟附件" name="open_attachment"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_group_notify.xml b/indra/newview/skins/default/xui/zh/panel_group_notify.xml
new file mode 100644
index 0000000000..00462d8b0b
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_group_notify.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="å³æ™‚訊æ¯" name="panel_group_notify">
+ <string name="message_max_lines_count" value="7"/>
+ <string name="subject_font" value="SANSSERIF_BIG"/>
+ <string name="date_font" value="SANSSERIF"/>
+ <panel label="header" name="header">
+ <text name="title" value="Sender Name / Group Name"/>
+ </panel>
+ <text_editor name="message" value="訊æ¯"/>
+ <text name="attachment" value="Attachment"/>
+ <button label="確定" name="btn_ok"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_group_roles.xml b/indra/newview/skins/default/xui/zh/panel_group_roles.xml
new file mode 100644
index 0000000000..cf5fc26d14
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_group_roles.xml
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="æˆå“¡èˆ‡è§’色" name="roles_tab">
+ <panel.string name="default_needs_apply_text">
+ 未儲存的設定
+ </panel.string>
+ <panel.string name="want_apply_text">
+ ä½ è¦å„²å­˜ä½ çš„變更嗎?
+ </panel.string>
+ <tab_container name="roles_tab_container">
+ <panel label="æˆå“¡" name="members_sub_tab" tool_tip="æˆå“¡">
+ <panel.string name="help_text">
+ ä½ å¯ä»¥æ·»åŠ æˆ–移除一個角色指派給æˆå“¡ã€‚
+é¸è²¬å¤šå€‹æˆå“¡æ™‚åŒæ™‚按著 Ctrl éµä¸”
+使用滑鼠左éµé»žæ“Šä»–們的å字。
+ </panel.string>
+ <panel.string name="donation_area">
+ [AREA] m²
+ </panel.string>
+ <filter_editor label="æˆå“¡éŽæ¿¾å™¨" name="filter_input"/>
+ <name_list name="member_list">
+ <name_list.columns label="æˆå“¡" name="name"/>
+ <name_list.columns label="æ款" name="donated"/>
+ <name_list.columns label="狀態" name="online"/>
+ </name_list>
+ <button label="邀請" name="member_invite"/>
+ <button label="踢出" name="member_eject"/>
+ </panel>
+ <panel label="角色" name="roles_sub_tab">
+ <panel.string name="help_text">
+ Roles have a title and an allowed list of Abilities
+that Members can perform. Members can belong to
+one or more Roles. A group can have up to 10 Roles,
+including the Everyone and Owner Roles.
+ </panel.string>
+ <panel.string name="cant_delete_role">
+ The &apos;Everyone&apos; and &apos;Owners&apos; Roles are special and can&apos;t be deleted.
+ </panel.string>
+ <filter_editor label="角色éŽæ¿¾å™¨" name="filter_input"/>
+ <scroll_list name="role_list">
+ <scroll_list.columns label="角色" name="name"/>
+ <scroll_list.columns label="頭銜" name="title"/>
+ <scroll_list.columns label="#" name="members"/>
+ </scroll_list>
+ <button label="新角色" name="role_create"/>
+ <button label="刪除角色" name="role_delete"/>
+ </panel>
+ <panel label="能力" name="actions_sub_tab" tool_tip="You can view an Ability&apos;s Description and which Roles and Members can execute the Ability.">
+ <panel.string name="help_text">
+ Abilities allow Members in Roles to do specific
+things in this group. There&apos;s a broad variety of Abilities.
+ </panel.string>
+ <filter_editor label="能力éŽæ¿¾å™¨" name="filter_input"/>
+ <scroll_list name="action_list" tool_tip="Select an Ability to view more details"/>
+ </panel>
+ </tab_container>
+ <panel name="members_footer">
+ <text name="static">
+ 指派角色
+ </text>
+ <text name="static2">
+ å…許的能力
+ </text>
+ <scroll_list name="member_allowed_actions" tool_tip="想瞭解有關於å…許的能力的細節請查閱能力é ç±¤"/>
+ </panel>
+ <panel name="roles_footer">
+ <text name="static">
+ 角色å稱
+ </text>
+ <text name="static3">
+ 角色頭銜
+ </text>
+ <text name="static2">
+ æè¿°
+ </text>
+ <text name="static4">
+ 指派角色
+ </text>
+ <check_box label="Reveal members" name="role_visible_in_list" tool_tip="Sets whether members of this role are visible in the General tab to people outside of the group."/>
+ <text name="static5">
+ å…許的能力
+ </text>
+ <scroll_list name="role_allowed_actions" tool_tip="想瞭解有關於æ¯ä¸€é …å…許的能力的細節請查閱能力é ç±¤"/>
+ </panel>
+ <panel name="actions_footer">
+ <text_editor name="action_description">
+ This Ability is &apos;Eject Members from this Group&apos;. Only an Owner can eject another Owner.
+ </text_editor>
+ <text name="static2">
+ 有此能力的角色
+ </text>
+ <text name="static3">
+ 有此能力的æˆå“¡
+ </text>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_im_control_panel.xml b/indra/newview/skins/default/xui/zh/panel_im_control_panel.xml
new file mode 100644
index 0000000000..703182e04d
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_im_control_panel.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+ <layout_stack name="button_stack">
+ <layout_panel name="view_profile_btn_panel">
+ <button label="檔案" name="view_profile_btn"/>
+ </layout_panel>
+ <layout_panel name="add_friend_btn_panel">
+ <button label="加為朋å‹" name="add_friend_btn"/>
+ </layout_panel>
+ <layout_panel name="teleport_btn_panel">
+ <button label="瞬間傳é€" name="teleport_btn" tool_tip="Offer to teleport this person"/>
+ </layout_panel>
+ <layout_panel name="share_btn_panel">
+ <button label="分享" name="share_btn"/>
+ </layout_panel>
+ <layout_panel name="pay_btn_panel">
+ <button label="支付" name="pay_btn"/>
+ </layout_panel>
+ <layout_panel name="call_btn_panel">
+ <button label="通話" name="call_btn"/>
+ </layout_panel>
+ <layout_panel name="end_call_btn_panel">
+ <button label="çµæŸé€šè©±" name="end_call_btn"/>
+ </layout_panel>
+ <layout_panel name="voice_ctrls_btn_panel">
+ <button label="語音控制" name="voice_ctrls_btn"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_instant_message.xml b/indra/newview/skins/default/xui/zh/panel_instant_message.xml
new file mode 100644
index 0000000000..cf9bc7fccb
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_instant_message.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="im_panel" name="im_panel">
+ <string name="message_max_lines_count">
+ 6
+ </string>
+ <panel label="im_header" name="im_header">
+ <text name="time_box" value="23:30"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_inventory_item.xml b/indra/newview/skins/default/xui/zh/panel_inventory_item.xml
new file mode 100644
index 0000000000..d18047fbcf
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_inventory_item.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="inventory_item">
+ <text name="item_name" value="..."/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_landmark_info.xml b/indra/newview/skins/default/xui/zh/panel_landmark_info.xml
new file mode 100644
index 0000000000..d86ba7bc7c
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_landmark_info.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="landmark_info">
+ <string name="title_create_landmark" value="創造地標"/>
+ <string name="title_edit_landmark" value="編輯地標"/>
+ <string name="title_landmark" value="地標"/>
+ <string name="not_available" value="(N\A)"/>
+ <string name="unknown" value="(未知)"/>
+ <string name="public" value="(公開)"/>
+ <string name="server_update_text">
+ Place information not available without server update.
+ </string>
+ <string name="server_error_text">
+ Information about this location is unavailable at this time, please try again later.
+ </string>
+ <string name="server_forbidden_text">
+ Information about this location is unavailable due to access restrictions. Please check your permissions with the parcel owner.
+ </string>
+ <string name="acquired_date">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </string>
+ <button name="back_btn" tool_tip="Back"/>
+ <text name="title" value="地點檔案"/>
+ <scroll_container name="place_scroll">
+ <panel name="scrolling_panel">
+ <text name="region_title" value="SampleRegion"/>
+ <text name="parcel_title" value="SampleParcel, Name Long (145, 228, 26)"/>
+ <expandable_text name="description" value="Du waltz die spritz"/>
+ <text name="maturity_value" value="未知"/>
+ <panel name="landmark_info_panel">
+ <text name="owner_label" value="æ“有者:"/>
+ <text name="creator_label" value="創造者:"/>
+ <text name="created_label" value="創造於:"/>
+ </panel>
+ <panel name="landmark_edit_panel">
+ <text name="title_label" value="Title:"/>
+ <text name="notes_label" value="My notes:"/>
+ <text name="folder_label" value="地標ä½ç½®ï¼š"/>
+ </panel>
+ </panel>
+ </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_landmarks.xml b/indra/newview/skins/default/xui/zh/panel_landmarks.xml
new file mode 100644
index 0000000000..eea406170a
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_landmarks.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="Landmarks">
+ <accordion name="landmarks_accordion">
+ <accordion_tab name="tab_favorites" title="最愛列"/>
+ <accordion_tab name="tab_landmarks" title="我的地標"/>
+ <accordion_tab name="tab_inventory" title="我的收ç´å€"/>
+ <accordion_tab name="tab_library" title="資æºåº«"/>
+ </accordion>
+ <panel name="bottom_panel">
+ <layout_stack name="bottom_panel">
+ <layout_panel name="options_gear_btn_panel">
+ <menu_button name="options_gear_btn" tool_tip="顯示é¡å¤–é¸é …"/>
+ </layout_panel>
+ <layout_panel name="add_btn_panel">
+ <button name="add_btn" tool_tip="添加新地標"/>
+ </layout_panel>
+ <layout_panel name="trash_btn_panel">
+ <dnd_button name="trash_btn" tool_tip="移除所é¸æ“‡çš„地標"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_login.xml b/indra/newview/skins/default/xui/zh/panel_login.xml
new file mode 100644
index 0000000000..b227fbcfc8
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_login.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_login">
+ <panel.string name="create_account_url">
+ http://join.secondlife.com/
+ </panel.string>
+ <panel.string name="forgot_password_url">
+ http://secondlife.com/account/request.php
+ </panel.string>
+ <layout_stack name="login_widgets">
+ <layout_panel name="login">
+ <text name="username_text">
+ 使用者å稱:
+ </text>
+ <combo_box name="username_combo" tool_tip="使用者å稱是你註冊時所挑é¸çš„,åƒæ˜¯ bobsmith12 或 Steller Sunshine"/>
+ <text name="password_text">
+ 密碼:
+ </text>
+ <check_box label="記ä½å¯†ç¢¼ï¼š" name="remember_check"/>
+ <button label="登入" name="connect_btn"/>
+ <text name="mode_selection_text">
+ 模å¼ï¼š
+ </text>
+ <combo_box name="mode_combo" tool_tip="è«‹é¸æ“‡ä½ çš„模å¼ã€‚é¸ç”¨åŸºæœ¬æ¨¡å¼å¯ä»¥å¿«é€Ÿã€ç°¡å–®åœ°æŽ¢ç´¢èˆ‡èŠå¤©ï¼›é¸ç”¨é€²éšŽæ¨¡å¼å‰‡å¯ä»¥ä½¿ç”¨æ›´å¤šåŠŸèƒ½ã€‚">
+ <combo_box.item label="基本" name="Basic"/>
+ <combo_box.item label="進階" name="Advanced"/>
+ </combo_box>
+ <text name="start_location_text">
+ 開始地點:
+ </text>
+ <combo_box name="start_location_combo">
+ <combo_box.item label="我上一次ä½ç½®" name="MyLastLocation"/>
+ <combo_box.item label="我的家" name="MyHome"/>
+ <combo_box.item label="&lt; 請輸入地å€å稱 &gt;" name="Typeregionname"/>
+ </combo_box>
+ </layout_panel>
+ <layout_panel name="links">
+ <text name="create_new_account_text">
+ 註冊
+ </text>
+ <text name="forgot_password_text">
+ 忘記你的使用者å稱或密碼?
+ </text>
+ <text name="login_help">
+ 登入時需è¦å¹«åŠ©ï¼Ÿ
+ </text>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_main_inventory.xml b/indra/newview/skins/default/xui/zh/panel_main_inventory.xml
new file mode 100644
index 0000000000..53ecf3eb19
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_main_inventory.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="事物" name="main inventory panel">
+ <panel.string name="ItemcountFetching">
+ Fetching [ITEM_COUNT] Items... [FILTER]
+ </panel.string>
+ <panel.string name="ItemcountCompleted">
+ [ITEM_COUNT] ç‰©å“ [FILTER]
+ </panel.string>
+ <text name="ItemcountText">
+ 物å“:
+ </text>
+ <filter_editor label="收ç´å€éŽæ¿¾å™¨" name="inventory search editor"/>
+ <tab_container name="inventory filter tabs">
+ <inventory_panel label="我的收ç´å€" name="All Items"/>
+ <recent_inventory_panel label="最近" name="Recent Items"/>
+ </tab_container>
+ <layout_stack name="bottom_panel">
+ <layout_panel name="options_gear_btn_panel">
+ <menu_button name="options_gear_btn" tool_tip="顯示é¡å¤–é¸é …"/>
+ </layout_panel>
+ <layout_panel name="add_btn_panel">
+ <button name="add_btn" tool_tip="添加新物å“"/>
+ </layout_panel>
+ <layout_panel name="trash_btn_panel">
+ <dnd_button name="trash_btn" tool_tip="移除所é¸æ“‡çš„物å“"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_me.xml b/indra/newview/skins/default/xui/zh/panel_me.xml
new file mode 100644
index 0000000000..a236dfc17a
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_me.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="我的檔案" name="panel_me">
+ <tab_container name="tabs">
+ <panel label="我的檔案" name="panel_profile"/>
+ <panel label="我的精é¸åœ°é»ž" name="panel_picks"/>
+ </tab_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_media_settings_general.xml b/indra/newview/skins/default/xui/zh/panel_media_settings_general.xml
new file mode 100644
index 0000000000..321c003acd
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_media_settings_general.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="一般" name="Media Settings General">
+ <text name="home_label">
+ 首é ï¼š
+ </text>
+ <text name="home_fails_whitelist_label">
+ (This page does not pass the specified whitelist)
+ </text>
+ <line_editor name="home_url" tool_tip="The home page for this media source"/>
+ <text name="preview_label">
+ é è¦½
+ </text>
+ <text name="current_url_label">
+ ç›®å‰é é¢ï¼š
+ </text>
+ <text name="current_url" tool_tip="The current page for this media source" value=""/>
+ <button label="é‡è¨­" name="current_url_reset_btn"/>
+ <check_box initial_value="false" label="Auto Loop" name="auto_loop"/>
+ <check_box initial_value="false" label="First Click Interacts" name="first_click_interact"/>
+ <check_box initial_value="false" label="自動縮放" name="auto_zoom"/>
+ <check_box initial_value="false" label="自動播放媒體" name="auto_play"/>
+ <text name="media_setting_note">
+ Note: Residents can override this setting
+ </text>
+ <check_box initial_value="false" label="Auto Scale Media on Face of Object" name="auto_scale"/>
+ <text name="size_label">
+ 尺寸:
+ </text>
+ <text name="X_label">
+ X
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_media_settings_permissions.xml b/indra/newview/skins/default/xui/zh/panel_media_settings_permissions.xml
new file mode 100644
index 0000000000..173edc76f6
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_media_settings_permissions.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="自訂" name="Media settings for controls">
+ <text name="controls_label">
+ 控制:
+ </text>
+ <combo_box name="controls">
+ <combo_item name="Standard">
+ 標準
+ </combo_item>
+ <combo_item name="Mini">
+ è¿·ä½ 
+ </combo_item>
+ </combo_box>
+ <text name="owner_label">
+ æ“有者
+ </text>
+ <check_box initial_value="false" label="å…許導航與互動" name="perms_owner_interact"/>
+ <check_box initial_value="false" label="顯示控制列" name="perms_owner_control"/>
+ <text name="group_label">
+ 群組:
+ </text>
+ <check_box initial_value="false" label="å…許導航與互動" name="perms_group_interact"/>
+ <check_box initial_value="false" label="顯示控制列" name="perms_group_control"/>
+ <text name="anyone_label">
+ 任何人
+ </text>
+ <check_box initial_value="false" label="å…許導航與互動" name="perms_anyone_interact"/>
+ <check_box initial_value="false" label="顯示控制列" name="perms_anyone_control"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_media_settings_security.xml b/indra/newview/skins/default/xui/zh/panel_media_settings_security.xml
new file mode 100644
index 0000000000..aaaf6bfb94
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_media_settings_security.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Security" name="Media Settings Security">
+ <check_box initial_value="false" label="Only Allow Access to Specified URL patterns" name="whitelist_enable"/>
+ <text name="home_url_fails_some_items_in_whitelist">
+ Entries that the home page fails against are marked:
+ </text>
+ <button label="添加" name="whitelist_add"/>
+ <button label="刪除" name="whitelist_del"/>
+ <text name="home_url_fails_whitelist">
+ Warning: the home page specified in the General tab fails to pass this whitelist. It has been disabled until a valid entry has been added.
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_navigation_bar.xml b/indra/newview/skins/default/xui/zh/panel_navigation_bar.xml
new file mode 100644
index 0000000000..60a5767d09
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_navigation_bar.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="navigation_bar">
+ <panel name="navigation_panel">
+ <pull_button name="back_btn" tool_tip="å‰å¾€ä¸Šä¸€å€‹ä½ç½®"/>
+ <pull_button name="forward_btn" tool_tip="å‰å¾€ä¸‹ä¸€å€‹ä½ç½®"/>
+ <button name="home_btn" tool_tip="瞬間傳é€åˆ°æˆ‘家的ä½ç½®"/>
+ <location_input label="ä½ç½®" name="location_combo"/>
+ <search_combo_box label="æœå°‹" name="search_combo_box" tool_tip="æœå°‹">
+ <combo_editor label="æœå°‹ [SECOND_LIFE]" name="search_combo_editor"/>
+ </search_combo_box>
+ </panel>
+ <favorites_bar name="favorite" tool_tip="拖曳傳é€åœ°æ¨™åˆ°æ­¤ä»¥ä¾¿è®“你在第二人生中能快速傳é€åˆ°ä½ æœ€æ„›çš„地點!!">
+ <label name="favorites_bar_label" tool_tip="拖曳傳é€åœ°æ¨™åˆ°æ­¤ä»¥ä¾¿è®“你在第二人生中能快速傳é€åˆ°ä½ æœ€æ„›çš„地點!!">
+ 最愛列
+ </label>
+ <chevron_button name="&gt;&gt;" tool_tip="顯示更多我的最愛"/>
+ </favorites_bar>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/zh/panel_nearby_chat_bar.xml
new file mode 100644
index 0000000000..3cabfcfaba
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_nearby_chat_bar.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="chat_bar">
+ <line_editor label="點擊此處開始èŠå¤©ã€‚" name="chat_box" tool_tip="按下 Enter éµä¾†èªªæˆ–按下 Ctrl+Enter 來喊å«"/>
+ <button name="show_nearby_chat" tool_tip="顯示 / éš±è— é™„è¿‘çš„èŠå¤©ç´€éŒ„"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_nearby_media.xml b/indra/newview/skins/default/xui/zh/panel_nearby_media.xml
new file mode 100644
index 0000000000..6a4b5fcf35
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_nearby_media.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="nearby_media">
+ <string name="media_item_count_format">
+ (%ld media items)
+ </string>
+ <string name="empty_item_text">
+ &lt;empty&gt;
+ </string>
+ <string name="parcel_media_name">
+ 地段串æµåª’é«”
+ </string>
+ <string name="parcel_audio_name">
+ 地段串æµéŸ³æ¨‚
+ </string>
+ <string name="playing_suffix">
+ (播放中)
+ </string>
+ <panel name="minimized_controls">
+ <button label="全部åœæ­¢" name="all_nearby_media_disable_btn" tool_tip="關閉附近全部的媒體"/>
+ <button label="全部開始" name="all_nearby_media_enable_btn" tool_tip="開啟附近全部的媒體"/>
+ <button name="open_prefs_btn" tool_tip="Bring up media prefs"/>
+ <button label="更多 &gt;&gt;" label_selected="&lt;&lt; 更少" name="more_btn" tool_tip="進階控制"/>
+ </panel>
+ <panel name="nearby_media_panel">
+ <text name="nearby_media_title">
+ 附近媒體
+ </text>
+ <text name="show_text">
+ 顯示:
+ </text>
+ <combo_box name="show_combo">
+ <combo_box.item label="全部" name="All"/>
+ <combo_box.item label="在此地段內" name="WithinParcel"/>
+ <combo_box.item label="在此地段外部" name="OutsideParcel"/>
+ <combo_box.item label="在其他化身身上" name="OnOthers"/>
+ </combo_box>
+ <scroll_list name="media_list">
+ <scroll_list.columns label="Proximity" name="media_proximity"/>
+ <scroll_list.columns label="Visible" name="media_visibility"/>
+ <scroll_list.columns label="Class" name="media_class"/>
+ <scroll_list.columns label="å稱" name="media_name"/>
+ <scroll_list.columns label="除錯" name="media_debug"/>
+ </scroll_list>
+ <panel name="media_controls_panel">
+ <layout_stack name="media_controls">
+ <layout_panel name="stop">
+ <button name="stop_btn" tool_tip="åœæ­¢æ‰€é¸æ“‡åª’é«”"/>
+ </layout_panel>
+ <layout_panel name="play">
+ <button name="play_btn" tool_tip="播放所é¸æ“‡çš„媒體"/>
+ </layout_panel>
+ <layout_panel name="pause">
+ <button name="pause_btn" tool_tip="æš«åœæ‰€é¸æ“‡çš„媒體"/>
+ </layout_panel>
+ <layout_panel name="volume_slider_ctrl">
+ <slider_bar initial_value="0.5" name="volume_slider" tool_tip="所é¸æ“‡çš„媒體之音頻音é‡"/>
+ </layout_panel>
+ <layout_panel name="mute">
+ <button name="mute_btn" tool_tip="éœéŸ³æ‰€é¸æ“‡çš„媒體音頻"/>
+ </layout_panel>
+ <layout_panel name="zoom">
+ <button name="zoom_btn" tool_tip="Zoom into selected media"/>
+ </layout_panel>
+ <layout_panel name="unzoom">
+ <button name="unzoom_btn" tool_tip="Zoom back from selected media"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_notify_textbox.xml b/indra/newview/skins/default/xui/zh/panel_notify_textbox.xml
new file mode 100644
index 0000000000..01a8210338
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_notify_textbox.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="å³æ™‚訊æ¯" name="panel_notify_textbox">
+ <string name="message_max_lines_count" value="7"/>
+ <panel label="info_panel" name="info_panel">
+ <text_editor name="message" value="訊æ¯"/>
+ </panel>
+ <panel label="control_panel" name="control_panel">
+ <button label="æ交" name="btn_submit"/>
+ <button label="忽視" name="ignore_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_online_status_toast.xml b/indra/newview/skins/default/xui/zh/panel_online_status_toast.xml
new file mode 100644
index 0000000000..a5d3afccb9
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_online_status_toast.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="朋å‹_上線_狀態" name="friend_online_status"/>
diff --git a/indra/newview/skins/default/xui/zh/panel_outfit_edit.xml b/indra/newview/skins/default/xui/zh/panel_outfit_edit.xml
new file mode 100644
index 0000000000..263106d13a
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_outfit_edit.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Side tray Outfit Edit panel -->
+<panel name="outfit_edit">
+ <string name="No Outfit" value="ç„¡è£æ‰®"/>
+ <string name="unsaved_changes" value="變更未儲存"/>
+ <string name="now_editing" value="ç¾åœ¨ç·¨è¼¯ä¸­"/>
+ <panel.string name="not_available">
+ (N\A)
+ </panel.string>
+ <panel.string name="unknown">
+ (未知)
+ </panel.string>
+ <string name="Filter.All" value="全部"/>
+ <string name="Filter.Clothes/Body" value="è¡£æœ / 身體"/>
+ <string name="Filter.Objects" value="物件"/>
+ <string name="Filter.Clothing" value="æœè£"/>
+ <string name="Filter.Bodyparts" value="身體部ä½"/>
+ <string name="replace_body_part" value="點擊以å–代你ç¾å­˜çš„體形"/>
+ <text name="title" value="編輯è£æ‰®"/>
+ <panel name="header_panel">
+ <panel name="outfit_name_and_status">
+ <text name="status" value="ç¾åœ¨ç·¨è¼¯ä¸­..."/>
+ <text name="curr_outfit_name" value="[Current Outfit]"/>
+ </panel>
+ </panel>
+ <layout_stack name="im_panels">
+ <layout_panel name="outfit_wearables_panel">
+ <layout_stack name="filter_panels">
+ <layout_panel name="add_button_and_combobox">
+ <button label="添加更多..." name="show_add_wearables_btn" tool_tip="開啟 / 關閉"/>
+ </layout_panel>
+ <layout_panel name="filter_panel">
+ <filter_editor label="收ç´å€å¯ç©¿è‘—éŽæ¿¾å™¨" name="look_item_filter"/>
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+ <layout_panel name="add_wearables_panel">
+ <button label="穿上物å“" name="plus_btn"/>
+ </layout_panel>
+ </layout_stack>
+ <panel name="no_add_wearables_button_bar">
+ <button name="shop_btn_1" tool_tip="Visit the SL Marketplace. You can also select something you are wearing, then click here to see more things like it"/>
+ </panel>
+ <panel name="add_wearables_button_bar">
+ <button name="shop_btn_2" tool_tip="Visit the SL Marketplace. You can also select something you are wearing, then click here to see more things like it"/>
+ </panel>
+ <panel name="save_revert_button_bar">
+ <layout_stack name="button_bar_ls">
+ <layout_panel name="save_btn_lp">
+ <button label="儲存" name="save_btn"/>
+ </layout_panel>
+ <layout_panel name="revert_btn_lp">
+ <button label="復原變更" name="revert_btn" tool_tip="Revert to last saved version"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/zh/panel_outfits_inventory.xml
new file mode 100644
index 0000000000..d9718d8294
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_outfits_inventory.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="事物" name="Outfits">
+ <panel.string name="wear_outfit_tooltip">
+ 穿上所é¸æ“‡çš„è£æ‰®
+ </panel.string>
+ <panel.string name="wear_items_tooltip">
+ Wear selected items
+ </panel.string>
+ <tab_container name="appearance_tabs">
+ <panel label="我的è£æ‰®" name="outfitslist_tab"/>
+ <panel label="WEARING" name="cof_tab"/>
+ </tab_container>
+ <panel name="bottom_panel">
+ <layout_stack name="bottom_panel_ls">
+ <layout_panel name="save_btn_lp">
+ <button label="å¦å­˜" name="save_btn"/>
+ </layout_panel>
+ <layout_panel name="wear_btn_lp">
+ <button label="Wear" name="wear_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_outfits_inventory_gear_default.xml b/indra/newview/skins/default/xui/zh/panel_outfits_inventory_gear_default.xml
new file mode 100644
index 0000000000..92ec774f9b
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_outfits_inventory_gear_default.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_gear_default">
+ <menu_item_call label="å–代目å‰çš„è£æ‰®" name="wear"/>
+ <menu_item_call label="由目å‰çš„è£æ‰®ç§»é™¤" name="remove"/>
+ <menu_item_call label="æ›´å" name="rename"/>
+ <menu_item_call label="移除è¯çµ" name="remove_link"/>
+ <menu_item_call label="刪除è£æ‰®" name="delete"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/zh/panel_outfits_list.xml b/indra/newview/skins/default/xui/zh/panel_outfits_list.xml
new file mode 100644
index 0000000000..a4b041469b
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_outfits_list.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="Outfits">
+ <panel name="bottom_panel">
+ <menu_button name="options_gear_btn" tool_tip="顯示é¡å¤–é¸é …"/>
+ <button name="trash_btn" tool_tip="刪除所é¸æ“‡çš„è£æ‰®"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_outfits_wearing.xml b/indra/newview/skins/default/xui/zh/panel_outfits_wearing.xml
new file mode 100644
index 0000000000..693cdcdeca
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_outfits_wearing.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="Wearing">
+ <panel name="bottom_panel">
+ <menu_button name="options_gear_btn" tool_tip="顯示é¡å¤–é¸é …"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_people.xml b/indra/newview/skins/default/xui/zh/panel_people.xml
new file mode 100644
index 0000000000..9c265622fa
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_people.xml
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Side tray panel -->
+<panel label="人群" name="people_panel">
+ <string name="no_recent_people" value="No recent people. Looking for people to hang out with? Try [secondlife:///app/search/people Search] or the [secondlife:///app/worldmap World Map]."/>
+ <string name="no_filtered_recent_people" value="Didn&apos;t find what you&apos;re looking for? Try [secondlife:///app/search/people/[SEARCH_TERM] Search]."/>
+ <string name="no_one_near" value="No one nearby. Looking for people to hang out with? Try [secondlife:///app/search/people Search] or the [secondlife:///app/worldmap World Map]."/>
+ <string name="no_one_filtered_near" value="Didn&apos;t find what you&apos;re looking for? Try [secondlife:///app/search/people/[SEARCH_TERM] Search]."/>
+ <string name="no_friends_online" value="無朋å‹ä¸Šç·š"/>
+ <string name="no_friends" value="無朋å‹"/>
+ <string name="no_friends_msg">
+ Find friends using [secondlife:///app/search/people Search] or right-click on a Resident to add them as a friend.
+Looking for people to hang out with? Try the [secondlife:///app/worldmap World Map].
+ </string>
+ <string name="no_filtered_friends_msg">
+ Didn&apos;t find what you&apos;re looking for? Try [secondlife:///app/search/people/[SEARCH_TERM] Search].
+ </string>
+ <string name="people_filter_label" value="人員éŽæ¿¾å™¨"/>
+ <string name="groups_filter_label" value="群組éŽæ¿¾å™¨"/>
+ <string name="no_filtered_groups_msg" value="沒有發ç¾ä½ è¦æ‰¾çš„嗎?何ä¸è©¦è©¦ [secondlife:///app/search/groups/[SEARCH_TERM] æœå°‹]。"/>
+ <string name="no_groups_msg" value="想找尋群組加入嗎?何ä¸è©¦è©¦ [secondlife:///app/search/groups æœå°‹]。"/>
+ <string name="MiniMapToolTipMsg" value="[REGION](雙擊以開啟地圖,按下 shift éµæ‹–曳來平移)"/>
+ <string name="AltMiniMapToolTipMsg" value="[REGION](雙擊以瞬間傳é€ï¼ŒæŒ‰ä¸‹ shift éµæ‹–曳來平移)"/>
+ <filter_editor label="éŽæ¿¾å™¨" name="filter_input"/>
+ <tab_container name="tabs">
+ <panel label="附近" name="nearby_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <menu_button name="nearby_view_sort_btn" tool_tip="é¸é …"/>
+ <button name="add_friend_btn" tool_tip="添加已é¸æ“‡çš„居民到Ad你的朋å‹æ¸…å–®"/>
+ </panel>
+ </panel>
+ <panel label="我的朋å‹" name="friends_panel">
+ <accordion name="friends_accordion">
+ <accordion_tab name="tab_online" title="上線"/>
+ <accordion_tab name="tab_all" title="全部"/>
+ </accordion>
+ <panel label="bottom_panel" name="bottom_panel">
+ <layout_stack name="bottom_panel">
+ <layout_panel name="options_gear_btn_panel">
+ <menu_button name="friends_viewsort_btn" tool_tip="顯示é¡å¤–é¸é …"/>
+ </layout_panel>
+ <layout_panel name="add_btn_panel">
+ <button name="add_btn" tool_tip="å‘å±…æ°‘æ出加為好å‹é‚€è«‹"/>
+ </layout_panel>
+ <layout_panel name="trash_btn_panel">
+ <dnd_button name="del_btn" tool_tip="由你的朋å‹æ¸…單移除所é¸æ“‡çš„人"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </panel>
+ <panel label="我的群組" name="groups_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <menu_button name="groups_viewsort_btn" tool_tip="é¸é …"/>
+ <button name="plus_btn" tool_tip="加入群組/創立新群組"/>
+ <button name="activate_btn" tool_tip="啟用所é¸æ“‡çš„群組"/>
+ </panel>
+ </panel>
+ <panel label="最近" name="recent_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <menu_button name="recent_viewsort_btn" tool_tip="é¸é …"/>
+ <button name="add_friend_btn" tool_tip="添加所é¸çš„居民到你的朋å‹æ¸…å–®"/>
+ </panel>
+ </panel>
+ </tab_container>
+ <panel name="button_bar">
+ <layout_stack name="bottom_bar_ls">
+ <layout_panel name="view_profile_btn_lp">
+ <button label="檔案" name="view_profile_btn" tool_tip="顯示圖片ã€ç¾¤çµ„與其他居民資訊"/>
+ </layout_panel>
+ <layout_panel name="chat_btn_lp">
+ <button label="IM" name="im_btn" tool_tip="é–‹å•Ÿå³æ™‚訊æ¯æœƒè©±"/>
+ </layout_panel>
+ <layout_panel name="chat_btn_lp">
+ <button label="通話" name="call_btn" tool_tip="與此居民進行通話"/>
+ </layout_panel>
+ <layout_panel name="chat_btn_lp">
+ <button label="分享" name="share_btn" tool_tip="分享一個收ç´å€ç‰©å“"/>
+ </layout_panel>
+ <layout_panel name="chat_btn_lp">
+ <button label="瞬間傳é€" name="teleport_btn" tool_tip="發給瞬間傳é€è«‹æ±‚"/>
+ </layout_panel>
+ </layout_stack>
+ <layout_stack name="bottom_bar_ls1">
+ <layout_panel name="group_info_btn_lp">
+ <button label="群組檔案" name="group_info_btn" tool_tip="顯示群組資訊"/>
+ </layout_panel>
+ <layout_panel name="chat_btn_lp">
+ <button label="群組èŠå¤©" name="chat_btn" tool_tip="é–‹å•ŸèŠå¤©æœƒè©±"/>
+ </layout_panel>
+ <layout_panel name="group_call_btn_lp">
+ <button label="群組通話" name="group_call_btn" tool_tip="與此群組進行通話"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_pick_info.xml b/indra/newview/skins/default/xui/zh/panel_pick_info.xml
new file mode 100644
index 0000000000..cd4cdbf999
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_pick_info.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_pick_info">
+ <text name="title" value="ç²¾é¸åœ°é»žè³‡è¨Š"/>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text_editor name="pick_name" value="[name]"/>
+ <text_editor name="pick_location" value="[loading...]"/>
+ <text_editor name="pick_desc" value="[description]"/>
+ </panel>
+ </scroll_container>
+ <panel name="buttons">
+ <layout_stack name="layout_stack1">
+ <layout_panel name="layout_panel1">
+ <button label="瞬間傳é€" name="teleport_btn"/>
+ </layout_panel>
+ <layout_panel name="show_on_map_btn_lp">
+ <button label="地圖" name="show_on_map_btn"/>
+ </layout_panel>
+ <layout_panel name="edit_btn_lp">
+ <button label="編輯" name="edit_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_picks.xml b/indra/newview/skins/default/xui/zh/panel_picks.xml
new file mode 100644
index 0000000000..15733b71b0
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_picks.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="ç²¾é¸åœ°é»ž" name="panel_picks">
+ <string name="no_picks" value="ç„¡ç²¾é¸åœ°é»ž"/>
+ <string name="no_classifieds" value="No Classifieds"/>
+ <accordion name="accordion">
+ <accordion_tab name="tab_picks" title="ç²¾é¸åœ°é»ž"/>
+ <accordion_tab name="tab_classifieds" title="Classifieds"/>
+ </accordion>
+ <panel label="bottom_panel" name="edit_panel">
+ <layout_stack name="edit_panel_ls">
+ <layout_panel name="gear_menu_btn">
+ <button name="new_btn" tool_tip="以目å‰ä½ç½®å»ºç«‹æ–°çš„ç²¾é¸åœ°é»žæˆ–個人廣告"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ <panel name="buttons_cucks">
+ <layout_stack name="buttons_cucks_ls">
+ <layout_panel name="info_btn_lp">
+ <button label="資訊" name="info_btn" tool_tip="顯示精é¸åœ°é»žè³‡è¨Š"/>
+ </layout_panel>
+ <layout_panel name="teleport_btn_lp">
+ <button label="瞬間傳é€" name="teleport_btn" tool_tip="瞬間傳é€åˆ°çš„å€åŸŸ"/>
+ </layout_panel>
+ <layout_panel name="show_on_map_btn_lp">
+ <button label="地圖" name="show_on_map_btn" tool_tip="在世界地圖上顯示相å°æ‡‰çš„å€åŸŸ"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_place_profile.xml b/indra/newview/skins/default/xui/zh/panel_place_profile.xml
new file mode 100644
index 0000000000..1772b65434
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_place_profile.xml
@@ -0,0 +1,116 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="place_profile">
+ <string name="on" value="On"/>
+ <string name="off" value="Off"/>
+ <string name="anyone" value="Anyone"/>
+ <string name="available" value="available"/>
+ <string name="allocated" value="已分é…"/>
+ <string name="title_place" value="地點檔案"/>
+ <string name="title_teleport_history" value="瞬間傳é€æ­·å²ç´€éŒ„"/>
+ <string name="not_available" value="(N\A)"/>
+ <string name="unknown" value="(未知)"/>
+ <string name="public" value="(公開)"/>
+ <string name="none_text" value="(無)"/>
+ <string name="sale_pending_text" value="(擱置銷售)"/>
+ <string name="group_owned_text" value="(群組所æ“有)"/>
+ <string name="price_text" value="L$"/>
+ <string name="area_text" value="m²"/>
+ <string name="all_residents_text" value="全部居民"/>
+ <string name="group_text" value="群組"/>
+ <string name="can_resell">
+ 購買這地å€çš„土地å…許轉售。
+ </string>
+ <string name="can_not_resell">
+ 購買這地å€çš„土地ä¸å…許轉售。
+ </string>
+ <string name="can_change">
+ 購買這地å€çš„土地å…許進行åˆä½µæˆ–分割。
+ </string>
+ <string name="can_not_change">
+ 購買這地å€çš„土地ä¸å…許進行åˆä½µæˆ–分割。
+ </string>
+ <string name="server_update_text">
+ 地點資訊因無伺æœå™¨æ›´æ–°æ•…無法æ供。
+ </string>
+ <string name="server_error_text">
+ Information about this location is unavailable at this time, please try again later.
+ </string>
+ <string name="server_forbidden_text">
+ Information about this location is unavailable due to access restrictions. Please check your permissions with the parcel owner.
+ </string>
+ <string name="acquired_date">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </string>
+ <button name="back_btn" tool_tip="返回"/>
+ <text name="title" value="地點檔案"/>
+ <scroll_container name="place_scroll">
+ <panel name="scrolling_panel">
+ <text name="region_title" value="SampleRegion"/>
+ <text name="parcel_title" value="SampleParcel, Name Long (145, 228, 26)"/>
+ <expandable_text name="description" value="Du waltz die spritz"/>
+ <text name="owner_label" value="æ“有者:"/>
+ <text name="owner_value" value="Alex Superduperlongenamenton"/>
+ <text name="maturity_value" value="未知"/>
+ <accordion name="advanced_info_accordion">
+ <accordion_tab name="parcel_characteristics_tab" title="地段">
+ <panel name="parcel_characteristics_panel">
+ <text name="rating_label" value="分級:"/>
+ <text name="rating_value" value="未知"/>
+ <text name="voice_label" value="語音:"/>
+ <text name="voice_value" value="On"/>
+ <text name="fly_label" value="飛行:"/>
+ <text name="fly_value" value="On"/>
+ <text name="push_label" value="推撞:"/>
+ <text name="push_value" value="Off"/>
+ <text name="build_label" value="建造:"/>
+ <text name="build_value" value="On"/>
+ <text name="scripts_label" value="腳本:"/>
+ <text name="scripts_value" value="On"/>
+ <text name="damage_label" value="傷害:"/>
+ <text name="damage_value" value="Off"/>
+ <button label="關於土地" name="about_land_btn"/>
+ </panel>
+ </accordion_tab>
+ <accordion_tab name="region_information_tab" title="地å€">
+ <panel name="region_information_panel">
+ <text name="region_name_label" value="地å€ï¼š"/>
+ <text name="region_name" value="Mooseland"/>
+ <text name="region_type_label" value="類型:"/>
+ <text name="region_type" value="Moose"/>
+ <text name="region_rating_label" value="分級:"/>
+ <text name="region_rating" value="完全æˆäºº"/>
+ <text name="region_owner_label" value="æ“有者:"/>
+ <text name="region_owner" value="moose Van Moose extra long name moose"/>
+ <text name="region_group_label" value="群組:"/>
+ <text name="region_group">
+ The Mighty Moose of mooseville soundvillemoose
+ </text>
+ <button label="åœ°å€ / 領地" name="region_info_btn"/>
+ </panel>
+ </accordion_tab>
+ <accordion_tab name="estate_information_tab" title="領地">
+ <panel name="estate_information_panel">
+ <text name="estate_name_label" value="領地:"/>
+ <text name="estate_rating_label" value="分級:"/>
+ <text name="estate_owner_label" value="æ“有者:"/>
+ <text name="estate_owner" value="Testing owner name length with long name"/>
+ <text name="covenant_label" value="契約:"/>
+ </panel>
+ </accordion_tab>
+ <accordion_tab name="sales_tab" title="出售">
+ <panel name="sales_panel">
+ <text name="sales_price_label" value="價格:"/>
+ <text name="area_label" value="é¢ç©ï¼š"/>
+ <text name="traffic_label" value="æµé‡ï¼š"/>
+ <text name="primitives_label" value="幾何元件:"/>
+ <text name="parcel_scripts_label" value="腳本:"/>
+ <text name="terraform_limits_label" value="土地變形é™åˆ¶ï¼š"/>
+ <text name="subdivide_label" value="分割土地/åˆä½µåœŸåœ°èƒ½åŠ›ï¼š"/>
+ <text name="resale_label" value="轉售能力:"/>
+ <text name="sale_to_label" value="出售給:"/>
+ </panel>
+ </accordion_tab>
+ </accordion>
+ </panel>
+ </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_places.xml b/indra/newview/skins/default/xui/zh/panel_places.xml
new file mode 100644
index 0000000000..8ac464271e
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_places.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="地點" name="places panel">
+ <string name="landmarks_tab_title" value="我的地標"/>
+ <string name="teleport_history_tab_title" value="瞬間傳é€æ­·å²ç´€éŒ„"/>
+ <filter_editor label="我的地點éŽæ¿¾å™¨" name="Filter"/>
+ <panel name="button_panel">
+ <layout_stack name="bottom_bar_ls0">
+ <layout_panel name="lp1">
+ <layout_stack name="bottom_bar_ls1">
+ <layout_panel name="teleport_btn_lp">
+ <button label="瞬間傳é€" name="teleport_btn" tool_tip="瞬間傳é€åˆ°æ‰€é¸æ“‡çš„å€åŸŸ"/>
+ </layout_panel>
+ <layout_panel name="chat_btn_lp">
+ <button label="地圖" name="map_btn" tool_tip="在世界地圖上顯示相å°æ‡‰çš„å€åŸŸ"/>
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+ <layout_panel name="lp2">
+ <layout_stack name="bottom_bar_ls3">
+ <layout_panel name="edit_btn_lp">
+ <button label="編輯" name="edit_btn" tool_tip="編輯地標資訊"/>
+ </layout_panel>
+ <layout_panel name="overflow_btn_lp">
+ <menu_button name="overflow_btn" tool_tip="顯示é¡å¤–é¸é …"/>
+ </layout_panel>
+ </layout_stack>
+ <layout_stack name="bottom_bar_ls3">
+ <layout_panel name="profile_btn_lp">
+ <button label="檔案" name="profile_btn" tool_tip="顯示地點檔案"/>
+ </layout_panel>
+ </layout_stack>
+ <layout_stack name="bottom_bar_close_ls3">
+ <layout_panel name="close_btn_lp">
+ <button label="關閉" name="close_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+ </layout_stack>
+ <layout_stack name="bottom_bar_ls2">
+ <layout_panel name="save_btn_lp">
+ <button label="儲存" name="save_btn"/>
+ </layout_panel>
+ <layout_panel name="cancel_btn_lp">
+ <button label="å–消" name="cancel_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/zh/panel_preferences_advanced.xml
new file mode 100644
index 0000000000..c5dce10d63
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_preferences_advanced.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<panel label="進階" name="advanced">
+ <panel.string name="aspect_ratio_text">
+ [NUM]:[DEN]
+ </panel.string>
+ <text name="UI Size:">
+ 使用者界é¢å°ºå¯¸ï¼š
+ </text>
+ <check_box label="顯示腳本錯誤訊æ¯æ–¼ï¼š" name="show_script_errors"/>
+ <radio_group name="show_location">
+ <radio_item label="附近的èŠå¤©ä¸­" name="0"/>
+ <radio_item label="分開的視窗中" name="1"/>
+ </radio_group>
+ <check_box label="å…許åŒæ™‚執行多個ç€è¦½å™¨" name="allow_multiple_viewer_check"/>
+ <check_box label="登入時顯示網格é¸æ“‡" name="show_grid_selection_check"/>
+ <check_box label="顯示進階é¸å–®" name="show_advanced_menu_check"/>
+ <check_box label="顯示開發é¸å–®" name="show_develop_menu_check"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_alerts.xml b/indra/newview/skins/default/xui/zh/panel_preferences_alerts.xml
new file mode 100644
index 0000000000..94eb3c1389
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_preferences_alerts.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="çªé¡¯å¼è¦–窗" name="popups">
+ <text name="tell_me_label">
+ 告訴我:
+ </text>
+ <check_box label="當我花費或å–å¾— L$" name="notify_money_change_checkbox"/>
+ <check_box label="當我的朋å‹ä¸Šç·šæˆ–離線" name="friends_online_notify_checkbox"/>
+ <text name="show_label">
+ 總是顯示:
+ </text>
+ <text name="dont_show_label">
+ 絕ä¸é¡¯ç¤ºï¼š
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_chat.xml b/indra/newview/skins/default/xui/zh/panel_preferences_chat.xml
new file mode 100644
index 0000000000..738c77fd08
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_preferences_chat.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="文字èŠå¤©" name="chat">
+ <text name="font_size">
+ 字型尺寸:
+ </text>
+ <radio_group name="chat_font_size">
+ <radio_item label="å°" name="radio" value="0"/>
+ <radio_item label="中" name="radio2" value="1"/>
+ <radio_item label="大" name="radio3" value="2"/>
+ </radio_group>
+ <check_box initial_value="true" label="èŠå¤©æ™‚播放打字動作" name="play_typing_animation"/>
+ <check_box label="當我離線時將收到的 IM 訊æ¯éƒµå¯„給我" name="send_im_to_email"/>
+ <check_box label="啟用純本文 IM 與èŠå¤©æ­·å²ç´€éŒ„" name="plain_text_chat_history"/>
+ <check_box label="èŠå¤©æ³¡æ³¡" name="bubble_text_chat"/>
+ <text name="show_ims_in_label">
+ 顯示 IMs 於:
+ </text>
+ <text name="requires_restart_label">
+ (須é‡æ–°å•Ÿå‹•ï¼‰
+ </text>
+ <radio_group name="chat_window" tool_tip="顯示你的å³æ™‚訊æ¯åœ¨åˆ†é–‹çš„浮動視窗,或是使用很多é ç±¤çš„單一浮動視窗(須é‡æ–°å•Ÿå‹•ï¼‰">
+ <radio_item label="分開視窗" name="radio" value="0"/>
+ <radio_item label="é ç±¤" name="radio2" value="1"/>
+ </radio_group>
+ <text name="disable_toast_label">
+ 啟用傳入èŠå¤©çš„çªé¡¯ç¤ºè¦–窗:
+ </text>
+ <check_box label="群組èŠå¤©" name="EnableGroupChatPopups" tool_tip="當群組èŠå¤©è¨Šæ¯æŠµé”時查看çªé¡¯å¼è¦–窗"/>
+ <check_box label="IM èŠå¤©" name="EnableIMChatPopups" tool_tip="當å³æ™‚訊æ¯æŠµé”時查看çªé¡¯å¼è¦–窗"/>
+ <spinner label="Nearby chat toasts life time:" name="nearby_toasts_lifetime"/>
+ <spinner label="Nearby chat toasts fading time:" name="nearby_toasts_fadingtime"/>
+ <text name="translate_chb_label">
+ èŠå¤©æ™‚使用機器自動進行翻譯
+ </text>
+ <text name="translate_language_text">
+ èŠå¤©ç¿»è­¯ç‚ºï¼š
+ </text>
+ <combo_box name="translate_language_combobox">
+ <combo_box.item label="系統é è¨­" name="System Default Language"/>
+ <combo_box.item label="English" name="English"/>
+ <combo_box.item label="Dansk (Danish)" name="Danish"/>
+ <combo_box.item label="Deutsch (German)" name="German"/>
+ <combo_box.item label="Español (Spanish)" name="Spanish"/>
+ <combo_box.item label="Français (French)" name="French"/>
+ <combo_box.item label="Italiano (Italian)" name="Italian"/>
+ <combo_box.item label="Magyar (Hungarian)" name="Hungarian"/>
+ <combo_box.item label="Nederlands (Dutch)" name="Dutch"/>
+ <combo_box.item label="Polski (Polish)" name="Polish"/>
+ <combo_box.item label="Português (Portuguese)" name="Portugese"/>
+ <combo_box.item label="РуÑÑкий (Russian)" name="Russian"/>
+ <combo_box.item label="Türkçe (Turkish)" name="Turkish"/>
+ <combo_box.item label="УкраїнÑька (Ukrainian)" name="Ukrainian"/>
+ <combo_box.item label="中文 (正體) (Chinese)" name="Chinese"/>
+ <combo_box.item label="日本語 (Japanese)" name="Japanese"/>
+ <combo_box.item label="한국어 (Korean)" name="Korean"/>
+ </combo_box>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_colors.xml b/indra/newview/skins/default/xui/zh/panel_preferences_colors.xml
new file mode 100644
index 0000000000..8d92eadd20
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_preferences_colors.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="é¡è‰²" name="colors_panel">
+ <text name="effects_color_textbox">
+ 我的效果(é¸æ“‡æŒ‡æ¨™ï¼‰ï¼š
+ </text>
+ <color_swatch name="effect_color_swatch" tool_tip="點擊以開啟é¡è‰²æŒ‘é¸å™¨"/>
+ <text name="font_colors">
+ èŠå¤©å­—åž‹é¡è‰²ï¼š
+ </text>
+ <text name="text_box1">
+ 自己
+ </text>
+ <text name="text_box2">
+ 其他人
+ </text>
+ <text name="text_box3">
+ 物件
+ </text>
+ <text name="text_box4">
+ 系統
+ </text>
+ <text name="text_box5">
+ 錯誤
+ </text>
+ <text name="text_box7">
+ æ“有者
+ </text>
+ <text name="text_box9">
+ URLs
+ </text>
+ <text name="bubble_chat">
+ å稱標籤背景色(亦會影響èŠå¤©æ³¡æ³¡ï¼‰ï¼š
+ </text>
+ <color_swatch name="background" tool_tip="挑é¸å稱標籤é¡è‰²"/>
+ <slider label="ä¸é€æ˜Žåº¦ï¼š" name="bubble_chat_opacity" tool_tip="挑é¸å稱標籤ä¸é€æ˜Žåº¦"/>
+ <text name="floater_opacity">
+ 浮動視窗ä¸é€æ˜Žåº¦ï¼š
+ </text>
+ <slider label="啟用:" name="active"/>
+ <slider label="åœç”¨ï¼š" name="inactive"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_general.xml b/indra/newview/skins/default/xui/zh/panel_preferences_general.xml
new file mode 100644
index 0000000000..6827fab6e6
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_preferences_general.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="一般" name="general_panel">
+ <text name="language_textbox">
+ 語言:
+ </text>
+ <combo_box name="language_combobox">
+ <combo_box.item label="系統é è¨­" name="System Default Language"/>
+ <combo_box.item label="English (英語)" name="English"/>
+ <combo_box.item label="Dansk (丹麥語) - Beta" name="Danish"/>
+ <combo_box.item label="Deutsch (德語) - Beta" name="Deutsch(German)"/>
+ <combo_box.item label="Español (西ç­ç‰™èªžï¼‰ - Beta" name="Spanish"/>
+ <combo_box.item label="Français (法語) - Beta" name="French"/>
+ <combo_box.item label="Italiano (義大利語) - Beta" name="Italian"/>
+ <combo_box.item label="Polski (波蘭語) - Beta" name="Polish"/>
+ <combo_box.item label="Português (葡è„牙語) - Beta" name="Portugese"/>
+ <combo_box.item label="日本語 (日語) - Beta" name="(Japanese)"/>
+ </combo_box>
+ <text name="language_textbox2">
+ (須é‡æ–°å•Ÿå‹•ï¼‰
+ </text>
+ <text name="maturity_desired_prompt">
+ 我想è¦èƒ½é€²å‡ºå…§å®¹åˆ†ç´šçš„地å€ç‚ºï¼š
+ </text>
+ <combo_box name="maturity_desired_combobox">
+ <combo_box.item label="一般普級,é©åº¦æˆäººï¼Œå®Œå…¨æˆäºº" name="Desired_Adult"/>
+ <combo_box.item label="一般普級與é©åº¦æˆäºº" name="Desired_Mature"/>
+ <combo_box.item label="一般普級" name="Desired_PG"/>
+ </combo_box>
+ <text name="start_location_textbox">
+ 開始ä½ç½®ï¼š
+ </text>
+ <combo_box name="start_location_combo">
+ <combo_box.item label="我上一次ä½ç½®" name="MyLastLocation"/>
+ <combo_box.item label="我的家" name="MyHome"/>
+ </combo_box>
+ <check_box initial_value="true" label="登入時顯示" name="show_location_checkbox"/>
+ <text name="name_tags_textbox">
+ å稱標籤:
+ </text>
+ <radio_group name="Name_Tag_Preference">
+ <radio_item label="Off" name="radio" value="0"/>
+ <radio_item label="On" name="radio2" value="1"/>
+ <radio_item label="簡短顯示" name="radio3" value="2"/>
+ </radio_group>
+ <check_box label="我的åå­—" name="show_my_name_checkbox1"/>
+ <check_box label="使用者å稱" name="show_slids" tool_tip="顯示使用者åç¨±ï¼Œå°±åƒ bobsmith123 這類的"/>
+ <check_box label="群組頭銜" name="show_all_title_checkbox1" tool_tip="顯示群組頭銜,åƒæ˜¯ Officer 或æˆå“¡"/>
+ <check_box label="高亮標示朋å‹" name="show_friends" tool_tip="高亮顯示你朋å‹çš„å稱標籤"/>
+ <check_box label="察看顯示å稱" name="display_names_check" tool_tip="Check to use display names in chat, IM, name tags, etc."/>
+ <text name="inworld_typing_rg_label">
+ 按下字æ¯éµï¼š
+ </text>
+ <radio_group name="inworld_typing_preference">
+ <radio_item label="開始本地èŠå¤©" name="radio_start_chat" value="1"/>
+ <radio_item label="影響移動(例如 WASDéµï¼‰" name="radio_move" value="0"/>
+ </radio_group>
+ <text name="title_afk_text">
+ 離開逾時設定:
+ </text>
+ <combo_box label="離開逾時設定:" name="afk">
+ <combo_box.item label="2 分é˜" name="item0"/>
+ <combo_box.item label="5 分é˜" name="item1"/>
+ <combo_box.item label="10 分é˜" name="item2"/>
+ <combo_box.item label="30 分é˜" name="item3"/>
+ <combo_box.item label="絕ä¸" name="item4"/>
+ </combo_box>
+ <text name="text_box3">
+ 忙碌模å¼å›žæ‡‰ï¼š
+ </text>
+ <text_editor name="busy_response">
+ log_in_to_change
+ </text_editor>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/zh/panel_preferences_graphics1.xml
new file mode 100644
index 0000000000..874fb6b218
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_preferences_graphics1.xml
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="圖形" name="Display panel">
+ <text name="QualitySpeed">
+ å“質與速度:
+ </text>
+ <text name="FasterText">
+ 最快
+ </text>
+ <text name="BetterText">
+ 最佳
+ </text>
+ <text name="ShadersPrefText">
+ 低
+ </text>
+ <text name="ShadersPrefText2">
+ 中
+ </text>
+ <text name="ShadersPrefText3">
+ 高
+ </text>
+ <text name="ShadersPrefText4">
+ 超高
+ </text>
+ <panel label="自訂圖形" name="CustomGraphics Panel">
+ <text name="ShadersText">
+ 著色器:
+ </text>
+ <check_box initial_value="true" label="清澈é€æ˜Žçš„æ°´" name="TransparentWater"/>
+ <check_box initial_value="true" label="凹凸映射與光澤效果" name="BumpShiny"/>
+ <check_box initial_value="true" label="基本著色" name="BasicShaders" tool_tip="關閉此一é¸é …å¯èƒ½é¿å…部分顯示å¡é©…動程å¼æ毀當機"/>
+ <check_box initial_value="true" label="大氣著色" name="WindLightUseAtmosShaders"/>
+ <text name="reflection_label">
+ æ°´æ–‡å射:
+ </text>
+ <combo_box name="Reflections">
+ <combo_box.item label="最å°" name="0"/>
+ <combo_box.item label="地形與樹木" name="1"/>
+ <combo_box.item label="全部éœæ…‹ç‰©ä»¶" name="2"/>
+ <combo_box.item label="全部化身與物件" name="3"/>
+ <combo_box.item label="一切" name="4"/>
+ </combo_box>
+ <slider label="化身物ç†ï¼š" name="AvatarPhysicsDetail"/>
+ <text name="AvatarPhysicsDetailText">
+ 低
+ </text>
+ <slider label="æ繪è·é›¢ï¼š" name="DrawDistance"/>
+ <text name="DrawDistanceMeterText2">
+ m
+ </text>
+ <slider label="最大粒å­æ•ˆæžœæ•¸é‡ï¼š" name="MaxParticleCount"/>
+ <slider label="Max. # of non-impostor avatars:" name="MaxNumberAvatarDrawn"/>
+ <slider label="後製å“質:" name="RenderPostProcess"/>
+ <text name="MeshDetailText">
+ 網é¢ç´°ç¯€ï¼š
+ </text>
+ <slider label="物件:" name="ObjectMeshDetail"/>
+ <slider label="彈性幾何元件:" name="FlexibleMeshDetail"/>
+ <slider label="樹木:" name="TreeMeshDetail"/>
+ <slider label="化身:" name="AvatarMeshDetail"/>
+ <slider label="地形:" name="TerrainMeshDetail"/>
+ <slider label="天空:" name="SkyMeshDetail"/>
+ <text name="PostProcessText">
+ 低
+ </text>
+ <text name="ObjectMeshDetailText">
+ 低
+ </text>
+ <text name="FlexibleMeshDetailText">
+ 低
+ </text>
+ <text name="TreeMeshDetailText">
+ 低
+ </text>
+ <text name="AvatarMeshDetailText">
+ 低
+ </text>
+ <text name="TerrainMeshDetailText">
+ 低
+ </text>
+ <text name="SkyMeshDetailText">
+ 低
+ </text>
+ <text name="AvatarRenderingText">
+ Avatar Rendering:
+ </text>
+ <check_box initial_value="true" label="Avatar impostors" name="AvatarImpostors"/>
+ <check_box initial_value="true" label="Hardware skinning" name="AvatarVertexProgram"/>
+ <check_box initial_value="true" label="化身衣æœ" name="AvatarCloth"/>
+ <text name="TerrainDetailText">
+ 地形細節:
+ </text>
+ <radio_group name="TerrainDetailRadio">
+ <radio_item label="低" name="0"/>
+ <radio_item label="高" name="2"/>
+ </radio_group>
+ --&gt;
+ </panel>
+ <button label="套用" label_selected="套用" name="Apply"/>
+ <button label="é‡è¨­" name="Defaults"/>
+ <button label="進階" name="Advanced"/>
+ <button label="硬體" label_selected="硬體" name="GraphicsHardwareButton"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_move.xml b/indra/newview/skins/default/xui/zh/panel_preferences_move.xml
new file mode 100644
index 0000000000..ce176b1e3c
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_preferences_move.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="移動" name="move_panel">
+ <slider label="視角" name="camera_fov"/>
+ <slider label="è·é›¢" name="camera_offset_scale"/>
+ <text name="heading2">
+ 自動ä½ç§»ï¼š
+ </text>
+ <check_box label="建造 / 編輯" name="edit_camera_movement" tool_tip="使用進入或離開編輯模å¼æ™‚自動調整æ”影機ä½ç½®åŠŸèƒ½"/>
+ <check_box label="編輯外觀" name="appearance_camera_movement" tool_tip="使用編輯模å¼æ™‚自動調整æ”影機ä½ç½®åŠŸèƒ½"/>
+ <check_box initial_value="true" label="å´é‚Šæ¬„" name="appearance_sidebar_positioning" tool_tip="使用開啟å´é‚Šæ¬„時自動調整æ”影機ä½ç½®åŠŸèƒ½"/>
+ <check_box label="將我顯示於第一人稱視角中" name="first_person_avatar_visible"/>
+ <text name=" Mouse Sensitivity">
+ 第一人稱視角滑鼠æ•æ„Ÿåº¦ï¼š
+ </text>
+ <check_box label="å轉" name="invert_mouse"/>
+ <check_box label="總是使用方å‘éµç§»å‹•" name="arrow_keys_move_avatar_check"/>
+ <check_box label="連點按ä½å¾Œè·‘æ­¥" name="tap_tap_hold_to_run"/>
+ <check_box label="雙擊以:" name="double_click_chkbox"/>
+ <radio_group name="double_click_action">
+ <radio_item label="瞬間傳é€" name="radio_teleport"/>
+ <radio_item label="自動導航駕駛" name="radio_autopilot"/>
+ </radio_group>
+ <button label="其他設備" name="joystick_setup_button"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/zh/panel_preferences_privacy.xml
new file mode 100644
index 0000000000..07fdfd87e3
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_preferences_privacy.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="æºé€š" name="im">
+ <panel.string name="log_in_to_change">
+ 登入以改變
+ </panel.string>
+ <button label="清除歷å²ç´€éŒ„" name="clear_cache" tool_tip="清除登入圖åƒã€æœ€å¾Œä½ç½®ã€çž¬é–“傳é€ç´€éŒ„ã€ç¶²é åŠæ質快å–"/>
+ <text name="cache_size_label_l">
+ (ä½ç½®ã€åœ–åƒã€ç¶²é ã€æœå°‹çš„æ­·å²ç´€éŒ„)
+ </text>
+ <check_box label="將我顯示在æœå°‹çš„çµæžœä¸­" name="online_searchresults"/>
+ <check_box label="åªæœ‰æˆ‘的朋å‹å’Œç¾¤çµ„知é“我上線" name="online_visibility"/>
+ <check_box label="åªæœ‰æˆ‘的朋å‹å’Œç¾¤çµ„å¯ä»¥ IM 或與我通話。" name="voice_call_friends_only_check"/>
+ <check_box label="當通話çµæŸæ™‚關閉麥克風" name="auto_disengage_mic_check"/>
+ <check_box label="登入時顯示我最愛的地標ä½ç½®ï¼ˆç¶“ç”± &apos;開始於&apos; 的下拉å¼é¸å–®ï¼‰" name="favorites_on_login_check"/>
+ <text name="Logs:">
+ èŠå¤©ç´€éŒ„:
+ </text>
+ <check_box label="儲存附近的èŠå¤©ç´€éŒ„到我的電腦" name="log_nearby_chat"/>
+ <check_box label="儲存 IM 紀錄到我的電腦中" name="log_instant_messages"/>
+ <check_box label="添加時間戳記到èŠå¤©ç´€éŒ„çš„æ¯ä¸€è¡Œ" name="show_timestamps_check_im"/>
+ <check_box label="添加時間戳記到紀錄檔檔å。" name="logfile_name_datestamp"/>
+ <text name="log_path_desc">
+ ä½ç½®ç´€éŒ„:
+ </text>
+ <button label="ç€è¦½" label_selected="ç€è¦½" name="log_path_button"/>
+ <button label="å°éŽ–清單" name="block_list"/>
+ <text name="block_list_label">
+ (你所å°éŽ–的人 åŠ/或 物件)
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_setup.xml b/indra/newview/skins/default/xui/zh/panel_preferences_setup.xml
new file mode 100644
index 0000000000..efefb92df6
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_preferences_setup.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="設定" name="Input panel">
+ <text name="Network:">
+ 網路:
+ </text>
+ <text name="Maximum bandwidth">
+ 最大頻寬
+ </text>
+ <text name="text_box2">
+ kbps
+ </text>
+ <check_box label="自訂埠" name="connection_port_enabled"/>
+ <spinner label="埠號:" name="connection_port"/>
+ <text name="cache_size_label_l">
+ å¿«å–尺寸
+ </text>
+ <text name="text_box5">
+ MB
+ </text>
+ <text name="Cache location">
+ å¿«å–ä½ç½®ï¼š
+ </text>
+ <button label="ç€è¦½" label_selected="ç€è¦½" name="set_cache"/>
+ <button label="" label_selected="é‡è¨­" name="reset_cache"/>
+ <text name="Web:">
+ 網é ï¼š
+ </text>
+ <radio_group name="use_external_browser">
+ <radio_item label="使用我的網é ç€è¦½å™¨ï¼ˆä¾‹å¦‚ IE, Firefox, Safari)" name="external" tool_tip="Use the default system web browser for help, web links, etc. Not recommended if running full screen." value="1"/>
+ <radio_item label="使用內建網é ç€è¦½å™¨" name="internal" tool_tip="Use the built-in web browser for help, web links, etc. This browser opens as a new window inside [APP_NAME]." value=""/>
+ </radio_group>
+ <check_box initial_value="true" label="啟用外掛" name="browser_plugins_enabled"/>
+ <check_box initial_value="true" label="æŽ¥å— cookies" name="cookies_enabled"/>
+ <check_box initial_value="true" label="啟用 Javascript" name="browser_javascript_enabled"/>
+ <check_box initial_value="false" label="啟用媒體ç€è¦½çš„çªé¡¯å¼è¦–窗" name="media_popup_enabled"/>
+ <check_box initial_value="false" label="啟用網é ä»£ç†ä¼ºæœå™¨" name="web_proxy_enabled"/>
+ <text name="Proxy location">
+ 代ç†ä¼ºæœå™¨ä½ç½®ï¼š
+ </text>
+ <line_editor name="web_proxy_editor" tool_tip="The name or IP address of the proxy you would like to use"/>
+ <spinner label="埠號:" name="web_proxy_port"/>
+ <text name="Software updates:">
+ 軟體更新:
+ </text>
+ <combo_box name="updater_service_combobox">
+ <combo_box.item label="自動安è£" name="Install_automatically"/>
+ <combo_box.item label="手動下載åŠå®‰è£" name="Install_manual"/>
+ </combo_box>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_sound.xml b/indra/newview/skins/default/xui/zh/panel_preferences_sound.xml
new file mode 100644
index 0000000000..3280b9357b
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_preferences_sound.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="è²éŸ³" name="Preference Media panel">
+ <panel.string name="middle_mouse">
+ Middle Mouse
+ </panel.string>
+ <slider label="主音é‡" name="System Volume"/>
+ <check_box initial_value="true" name="mute_when_minimized"/>
+ <text name="mute_chb_label">
+ 最å°åŒ–時éœéŸ³
+ </text>
+ <slider label="按éµéŸ³" name="UI Volume"/>
+ <slider label="環境音" name="Wind Volume"/>
+ <slider label="音效" name="SFX Volume"/>
+ <slider label="串æµéŸ³æ¨‚" name="Music Volume"/>
+ <check_box label="已啟用" name="enable_music"/>
+ <slider label="媒體" name="Media Volume"/>
+ <check_box label="已啟用" name="enable_media"/>
+ <slider label="語音èŠå¤©" name="Voice Volume"/>
+ <check_box label="已啟用" name="enable_voice_check"/>
+ <check_box label="å…許媒體自動播放" name="media_auto_play_btn" tool_tip="若你想è¦ï¼Œå¯ä»¥å‹¾é¸é€™å€‹å…許媒體自動播放" value="true"/>
+ <check_box label="播放附加到其他化身身上的媒體" name="media_show_on_others_btn" tool_tip="Uncheck this to hide media attached to other avatars nearby" value="true"/>
+ <text name="voice_chat_settings">
+ 語音èŠå¤©è¨­å®š
+ </text>
+ <text name="Listen from">
+ 傾è½ä½ç½®ï¼š
+ </text>
+ <radio_group name="ear_location">
+ <radio_item label="æ”影機ä½ç½®" name="0"/>
+ <radio_item label="化身ä½ç½®" name="1"/>
+ </radio_group>
+ <check_box label="說話時åŒæ­¥ç§»å‹•åŒ–身嘴唇" name="enable_lip_sync"/>
+ <check_box label="Toggle speak on/off when I press:" name="push_to_talk_toggle_check" tool_tip="When in toggle mode, press and release the trigger key ONCE to switch your microphone on or off. When not in toggle mode, the microphone broadcasts your voice only while the trigger is being held down."/>
+ <line_editor label="Push-to-Speak trigger" name="modifier_combo"/>
+ <button label="設定按éµ" name="set_voice_hotkey_button"/>
+ <button name="set_voice_middlemouse_button" tool_tip="é‡è¨­æ»‘鼠中éµæŒ‰éˆ•"/>
+ <button label="輸入 / 輸出設備" name="device_settings_btn"/>
+ <panel label="設備設定" name="device_settings_panel">
+ <panel.string name="default_text">
+ é è¨­
+ </panel.string>
+ <panel.string name="default system device">
+ é è¨­ç³»çµ±è¨­å‚™
+ </panel.string>
+ <panel.string name="no device">
+ 無設備
+ </panel.string>
+ <text name="Input">
+ 輸入
+ </text>
+ <text name="My volume label">
+ 我的音é‡ï¼š
+ </text>
+ <slider_bar initial_value="1.0" name="mic_volume_slider" tool_tip="Change the volume using this slider"/>
+ <text name="wait_text">
+ è«‹ç¨å€™
+ </text>
+ <text name="Output">
+ 輸出
+ </text>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/zh/panel_prim_media_controls.xml
new file mode 100644
index 0000000000..df1a1b73a1
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_prim_media_controls.xml
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="MediaControls">
+ <string name="control_background_image_name">
+ Inspector_Background
+ </string>
+ <string name="skip_step">
+ 0.2
+ </string>
+ <string name="min_width">
+ 300
+ </string>
+ <string name="min_height">
+ 75
+ </string>
+ <string name="zoom_near_padding">
+ 1.0
+ </string>
+ <string name="zoom_medium_padding">
+ 1.1
+ </string>
+ <string name="zoom_far_padding">
+ 1.5
+ </string>
+ <string name="top_world_view_avoid_zone">
+ 50
+ </string>
+ <layout_stack name="progress_indicator_area">
+ <layout_panel name="media_progress_indicator">
+ <progress_bar name="media_progress_bar" tool_tip="Media is Loading"/>
+ </layout_panel>
+ </layout_stack>
+ <layout_stack name="media_controls">
+ <layout_panel name="back">
+ <button name="back_btn" tool_tip="Navigate back"/>
+ </layout_panel>
+ <layout_panel name="fwd">
+ <button name="fwd_btn" tool_tip="Navigate forward"/>
+ </layout_panel>
+ <layout_panel name="home">
+ <button name="home_btn" tool_tip="首é "/>
+ </layout_panel>
+ <layout_panel name="media_stop">
+ <button name="media_stop_btn" tool_tip="åœæ­¢åª’é«”"/>
+ </layout_panel>
+ <layout_panel name="reload">
+ <button name="reload_btn" tool_tip="é‡æ–°è¼‰å…¥"/>
+ </layout_panel>
+ <layout_panel name="stop">
+ <button name="stop_btn" tool_tip="åœæ­¢è¼‰å…¥"/>
+ </layout_panel>
+ <layout_panel name="play">
+ <button name="play_btn" tool_tip="播放媒體"/>
+ </layout_panel>
+ <layout_panel name="pause">
+ <button name="pause_btn" tool_tip="æš«åœåª’é«”"/>
+ </layout_panel>
+ <layout_panel name="media_address">
+ <line_editor name="media_address_url" tool_tip="媒體網å€"/>
+ <layout_stack name="media_address_url_icons">
+ <layout_panel>
+ <icon name="media_whitelist_flag" tool_tip="白å單已啟用"/>
+ </layout_panel>
+ <layout_panel>
+ <icon name="media_secure_lock_flag" tool_tip="Secured Browsing"/>
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+ <layout_panel name="media_play_position">
+ <slider_bar initial_value="0.5" name="media_play_slider" tool_tip="Movie play progress"/>
+ </layout_panel>
+ <layout_panel name="skip_back">
+ <button name="skip_back_btn" tool_tip="Step back"/>
+ </layout_panel>
+ <layout_panel name="skip_forward">
+ <button name="skip_forward_btn" tool_tip="Step forward"/>
+ </layout_panel>
+ <layout_panel name="media_volume">
+ <button name="media_mute_button" tool_tip="Mute This Media"/>
+ <slider name="volume_slider" tool_tip="Media Volume"/>
+ </layout_panel>
+ <layout_panel name="zoom_frame">
+ <button name="zoom_frame_btn" tool_tip="Zoom into media"/>
+ </layout_panel>
+ <layout_panel name="close">
+ <button name="close_btn" tool_tip="Zoom Back"/>
+ </layout_panel>
+ <layout_panel name="new_window">
+ <button name="new_window_btn" tool_tip="Open URL in browser"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_region_covenant.xml b/indra/newview/skins/default/xui/zh/panel_region_covenant.xml
new file mode 100644
index 0000000000..ad94c4c7e9
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_region_covenant.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="契約" name="Covenant">
+ <panel.string name="can_resell">
+ Purchased land in this region may be resold.
+ </panel.string>
+ <panel.string name="can_not_resell">
+ Purchased land in this region may not be resold.
+ </panel.string>
+ <panel.string name="can_change">
+ Purchased land in this region may be joined or subdivided.
+ </panel.string>
+ <panel.string name="can_not_change">
+ Purchased land in this region may not be joined or subdivided.
+ </panel.string>
+ <text name="estate_section_lbl">
+ 領地
+ </text>
+ <text name="estate_name_lbl">
+ å稱:
+ </text>
+ <text name="estate_name_text">
+ mainland
+ </text>
+ <text name="estate_owner_lbl">
+ æ“有者:
+ </text>
+ <text name="estate_owner_text">
+ (無)
+ </text>
+ <text name="estate_cov_lbl">
+ 契約:
+ </text>
+ <text name="covenant_timestamp_text">
+ Last Modified Wed Dec 31 16:00:00 1969
+ </text>
+ <text_editor name="covenant_editor">
+ There is no Covenant provided for this Estate.
+ </text_editor>
+ <button label="é‡è¨­" name="reset_covenant"/>
+ <text name="covenant_help_text">
+ Changes to the covenant will show on all parcels in the estate.
+ </text>
+ <text name="covenant_instructions">
+ Drag and drop a notecard to change the Covenant for this estate.
+ </text>
+ <text name="region_section_lbl">
+ 地å€
+ </text>
+ <text name="region_name_lbl">
+ å稱:
+ </text>
+ <text name="region_name_text">
+ Erica
+ </text>
+ <text name="region_landtype_lbl">
+ 類型:
+ </text>
+ <text name="region_landtype_text">
+ Mainland / Homestead
+ </text>
+ <text name="region_maturity_lbl">
+ 分級:
+ </text>
+ <text name="region_maturity_text">
+ 完全æˆäºº
+ </text>
+ <text name="resellable_lbl">
+ 轉售:
+ </text>
+ <text name="resellable_clause">
+ 這地å€çš„土地ä¸èƒ½è½‰å”®ã€‚
+ </text>
+ <text name="changeable_lbl">
+ 分割:
+ </text>
+ <text name="changeable_clause">
+ 這地å€çš„土地ä¸èƒ½åˆä½µæˆ–分割。
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_region_debug.xml b/indra/newview/skins/default/xui/zh/panel_region_debug.xml
new file mode 100644
index 0000000000..ed5e6e9d2c
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_region_debug.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="除錯" name="Debug">
+ <text name="region_text_lbl">
+ 地å€ï¼š
+ </text>
+ <text name="region_text">
+ 未知
+ </text>
+ <check_box label="關閉腳本" name="disable_scripts_check" tool_tip="關閉這個地å€ç¾åœ¨çš„全部腳本"/>
+ <check_box label="關閉碰撞" name="disable_collisions_check" tool_tip="關閉這個地å€ç¾åœ¨çš„éžåŒ–身碰撞"/>
+ <check_box label="關閉物ç†" name="disable_physics_check" tool_tip="關閉這個地å€ç¾åœ¨çš„全部物ç†"/>
+ <button label="套用" name="apply_btn"/>
+ <text name="objret_text_lbl">
+ 物件退回
+ </text>
+ <text name="resident_text_lbl">
+ 居民:
+ </text>
+ <line_editor name="target_avatar_name">
+ (無)
+ </line_editor>
+ <button label="é¸æ“‡" name="choose_avatar_btn"/>
+ <text name="options_text_lbl">
+ é¸é …:
+ </text>
+ <check_box label="包å«æœ‰è…³æœ¬" name="return_scripts" tool_tip="åªé€€å›žåŒ…å«è…³æœ¬çš„物件"/>
+ <check_box label="ä½æ–¼å…¶ä»–人土地上" name="return_other_land" tool_tip="åªé€€å›žç‰©ä»¶åœ¨å±¬æ–¼æŸå€‹å…¶ä»–人土地上的物件"/>
+ <check_box label="於這個領地內的æ¯ä¸€å€‹åœ°å€" name="return_estate_wide" tool_tip="退回這個領地內全部地å€ä¸­æ¨™è¨˜ç‚ºä»–的物件"/>
+ <button label="退回" name="return_btn"/>
+ <button label="å–得最常碰撞的物件..." name="top_colliders_btn" tool_tip="æ¢åˆ—出目å‰é‹ä½œä¸­æœ€å¸¸ç¢°æ’žçš„物件清單"/>
+ <button label="å–得最耗能腳本..." name="top_scripts_btn" tool_tip="æ¢åˆ—出目å‰é‹ä½œä¸­æœ€è€—能的腳本清單"/>
+ <button label="地å€é‡æ–°å•Ÿå‹•" name="restart_btn" tool_tip="給予兩分é˜å€’數計時並é‡æ–°å•Ÿå‹•"/>
+ <button label="延é²é‡æ–°å•Ÿå‹•" name="cancel_restart_btn" tool_tip="延é²åœ°å€é‡æ–°å•Ÿå‹•ä¸€å°æ™‚"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_region_estate.xml b/indra/newview/skins/default/xui/zh/panel_region_estate.xml
new file mode 100644
index 0000000000..efa3be2f51
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_region_estate.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="領地" name="Estate">
+ <text name="estate_help_text">
+ 變更此夜籤中的設定會影響這個領地內的全部地å€è¨­å®šã€‚
+ </text>
+ <text name="estate_text">
+ 領地:
+ </text>
+ <text name="estate_name">
+ (未知)
+ </text>
+ <text name="owner_text">
+ 領地æ“有者:
+ </text>
+ <text name="estate_owner">
+ (未知)
+ </text>
+ <check_box label="Use Global Time" name="use_global_time_check"/>
+ <check_box label="固定太陽" name="fixed_sun_check"/>
+ <slider label="Phase" name="sun_hour_slider"/>
+ <check_box label="å…許公開出入" name="externally_visible_check"/>
+ <text name="Only Allow">
+ Restrict Access to accounts verified by:
+ </text>
+ <check_box label="Payment Information on File" name="limit_payment" tool_tip="Ban unidentified Residents"/>
+ <check_box label="年齡驗證" name="limit_age_verified" tool_tip="Ban Residents who have not verified their age. See the [SUPPORT_SITE] for more information."/>
+ <check_box label="å…許語音èŠå¤©" name="voice_chat_check"/>
+ <check_box label="å…許直接瞬間傳é€" name="allow_direct_teleport"/>
+ <button label="套用" name="apply_btn"/>
+ <button label="é€å‡ºè¨Šæ¯åˆ°é ˜åœ°..." name="message_estate_btn"/>
+ <button label="由領地將居民踢出..." name="kick_user_from_estate_btn"/>
+ <text name="estate_manager_label">
+ 領地管ç†å“¡ï¼š
+ </text>
+ <button label="移除..." name="remove_estate_manager_btn"/>
+ <button label="添加..." name="add_estate_manager_btn"/>
+ <text name="allow_resident_label">
+ å…許的居民:
+ </text>
+ <button label="移除..." name="remove_allowed_avatar_btn"/>
+ <button label="添加..." name="add_allowed_avatar_btn"/>
+ <text name="allow_group_label">
+ å…許的群組:
+ </text>
+ <button label="移除..." name="remove_allowed_group_btn"/>
+ <button label="添加..." name="add_allowed_group_btn"/>
+ <text name="ban_resident_label">
+ 被å°éŽ–的居民:
+ </text>
+ <button label="移除..." name="remove_banned_avatar_btn"/>
+ <button label="添加..." name="add_banned_avatar_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_region_general.xml b/indra/newview/skins/default/xui/zh/panel_region_general.xml
new file mode 100644
index 0000000000..a441b8898d
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_region_general.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="地å€" name="General">
+ <text name="region_text_lbl">
+ 地å€ï¼š
+ </text>
+ <text name="region_text">
+ 未知
+ </text>
+ <text name="version_channel_text_lbl">
+ 版本:
+ </text>
+ <text name="version_channel_text">
+ 未知
+ </text>
+ <text name="region_type_lbl">
+ 類型:
+ </text>
+ <text name="region_type">
+ 未知
+ </text>
+ <check_box label="阻止變形" name="block_terraform_check"/>
+ <check_box label="阻止飛行" name="block_fly_check"/>
+ <check_box label="å…許傷害" name="allow_damage_check"/>
+ <check_box label="é™åˆ¶æŽ¨æ’ž" name="restrict_pushobject"/>
+ <check_box label="å…許土地轉售" name="allow_land_resell_check"/>
+ <check_box label="å…許土地 åˆä½µ/分割" name="allow_parcel_changes_check"/>
+ <check_box label="阻擋土地顯示於æœå°‹ä¸­" name="block_parcel_search_check" tool_tip="讓其他人å¯ä»¥åœ¨æœå°‹çµæžœä¸­çœ‹åˆ°é€™å€‹åœ°å€èˆ‡å…¶ä¸­çš„地段"/>
+ <spinner label="人數上é™" name="agent_limit_spin"/>
+ <spinner label="Object Bonus" name="object_bonus_spin"/>
+ <text label="Maturity" name="access_text">
+ 分級:
+ </text>
+ <icons_combo_box label="é©åº¦æˆäºº" name="access_combo">
+ <icons_combo_box.item label="完全æˆäºº" name="Adult" value="42"/>
+ <icons_combo_box.item label="é©åº¦æˆäºº" name="Mature" value="21"/>
+ <icons_combo_box.item label="一般普級" name="PG" value="13"/>
+ </icons_combo_box>
+ <button label="套用" name="apply_btn"/>
+ <button label="強制瞬間傳é€ä¸€å€‹å±…民回家..." name="kick_btn"/>
+ <button label="強制瞬間傳é€æ‰€æœ‰å±…民回家..." name="kick_all_btn"/>
+ <button label="é€å‡ºè¨Šæ¯åˆ°åœ°å€..." name="im_btn"/>
+ <button label="管ç†çž¬é–“傳é€ä¸­å¿ƒ..." name="manage_telehub_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_region_terrain.xml b/indra/newview/skins/default/xui/zh/panel_region_terrain.xml
new file mode 100644
index 0000000000..7cae8fe8cf
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_region_terrain.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="地形" name="Terrain">
+ <text name="region_text_lbl">
+ 地å€ï¼š
+ </text>
+ <text name="region_text">
+ 未知
+ </text>
+ <spinner label="水文高度" name="water_height_spin"/>
+ <spinner label="地形æå‡é™åˆ¶" name="terrain_raise_spin"/>
+ <spinner label="地形é™ä½Žé™åˆ¶" name="terrain_lower_spin"/>
+ <check_box label="使用領地的太陽設定" name="use_estate_sun_check"/>
+ <check_box label="固定太陽" name="fixed_sun_check"/>
+ <slider label="Phase" name="sun_hour_slider"/>
+ <button label="套用" name="apply_btn"/>
+ <button label="下載 RAW 地形..." name="download_raw_btn" tool_tip="åªå…許領地æ“有者而éžç®¡ç†è€…進行æ“作"/>
+ <button label="上傳 RAW 地形檔..." name="upload_raw_btn" tool_tip="åªå…許領地æ“有者而éžç®¡ç†è€…進行æ“作"/>
+ <button label="Bake Terrain" name="bake_terrain_btn" tool_tip="Set current terrain as mid-point for raise/lower limits"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_region_texture.xml b/indra/newview/skins/default/xui/zh/panel_region_texture.xml
new file mode 100644
index 0000000000..7b6152121f
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_region_texture.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="地é¢æ質" name="Textures">
+ <text name="region_text_lbl">
+ 地å€ï¼š
+ </text>
+ <text name="region_text">
+ 未知
+ </text>
+ <text name="detail_texture_text">
+ 地形æ質(須 512x512,24 ä½å…ƒ .tga 檔格å¼ï¼‰
+ </text>
+ <text name="height_text_lbl">
+ 1 (Low)
+ </text>
+ <text name="height_text_lbl2">
+ 2
+ </text>
+ <text name="height_text_lbl3">
+ 3
+ </text>
+ <text name="height_text_lbl4">
+ 4 (High)
+ </text>
+ <text name="height_text_lbl5">
+ Texture Elevation Ranges
+ </text>
+ <text name="height_text_lbl6">
+ Northwest
+ </text>
+ <text name="height_text_lbl7">
+ Northeast
+ </text>
+ <spinner label="Low" name="height_start_spin_1"/>
+ <spinner label="Low" name="height_start_spin_3"/>
+ <spinner label="High" name="height_range_spin_1"/>
+ <spinner label="High" name="height_range_spin_3"/>
+ <text name="height_text_lbl8">
+ Southwest
+ </text>
+ <text name="height_text_lbl9">
+ Southeast
+ </text>
+ <spinner label="Low" name="height_start_spin_0"/>
+ <spinner label="Low" name="height_start_spin_2"/>
+ <spinner label="High" name="height_range_spin_0"/>
+ <spinner label="High" name="height_range_spin_2"/>
+ <text name="height_text_lbl10">
+ These values represent the blend range for the textures above.
+ </text>
+ <text name="height_text_lbl11">
+ Measured in meters, the LOW value is the MAXIMUM height of Texture #1, and the HIGH value is the MINIMUM height of Texture #4.
+ </text>
+ <button label="套用" name="apply_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_script_ed.xml b/indra/newview/skins/default/xui/zh/panel_script_ed.xml
new file mode 100644
index 0000000000..cc2b0fc673
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_script_ed.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="script panel">
+ <panel.string name="loading">
+ 載入中...
+ </panel.string>
+ <panel.string name="can_not_view">
+ ä½ ä¸èƒ½å¯Ÿçœ‹æˆ–編輯此腳本,自從它被設定為 &quot;no copy&quot; 後。你需è¦å®Œæ•´æ¬Šé™åŽ»å¯Ÿçœ‹æˆ–編輯有包å«è…³æœ¬åœ¨å…§çš„物件。
+ </panel.string>
+ <panel.string name="public_objects_can_not_run">
+ 公開物件ä¸èƒ½åŸ·è¡Œè…³æœ¬
+ </panel.string>
+ <panel.string name="script_running">
+ 執行中
+ </panel.string>
+ <panel.string name="Title">
+ 腳本:[NAME]
+ </panel.string>
+ <panel.string name="external_editor_not_set">
+ 由環境變數設定 LL_SCRIPT_EDITOR 或是 ExternalEditor 設定來é¸æ“‡ä¸€å€‹ç·¨è¼¯å™¨ã€‚
+ </panel.string>
+ <menu_bar name="script_menu">
+ <menu label="檔案" name="File">
+ <menu_item_call label="儲存" name="Save"/>
+ <menu_item_call label="還原全部變更" name="Revert All Changes"/>
+ </menu>
+ <menu label="編輯" name="Edit">
+ <menu_item_call label="復原" name="Undo"/>
+ <menu_item_call label="é‡åš" name="Redo"/>
+ <menu_item_call label="剪下" name="Cut"/>
+ <menu_item_call label="覆製" name="Copy"/>
+ <menu_item_call label="貼上" name="Paste"/>
+ <menu_item_call label="å…¨é¸" name="Select All"/>
+ <menu_item_call label="å–消é¸æ“‡" name="Deselect"/>
+ <menu_item_call label="æœå°‹ / å–代..." name="Search / Replace..."/>
+ </menu>
+ <menu label="幫助" name="Help">
+ <menu_item_call label="幫助..." name="Help..."/>
+ <menu_item_call label="é—œéµå­—幫助..." name="Keyword Help..."/>
+ </menu>
+ </menu_bar>
+ <text_editor name="Script Editor">
+ 載入中...
+ </text_editor>
+ <combo_box label="æ’å…¥..." name="Insert..."/>
+ <button label="儲存" label_selected="儲存" name="Save_btn"/>
+ <button label="編輯..." name="Edit_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_script_limits_my_avatar.xml b/indra/newview/skins/default/xui/zh/panel_script_limits_my_avatar.xml
new file mode 100644
index 0000000000..32cc2f9a5d
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_script_limits_my_avatar.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="我的化身" name="script_limits_my_avatar_panel">
+ <text name="script_memory">
+ Avatar Script Usage
+ </text>
+ <text name="loading_text">
+ 載入中...
+ </text>
+ <scroll_list name="scripts_list">
+ <scroll_list.columns label="尺寸(kb)" name="size"/>
+ <scroll_list.columns label="URLs" name="urls"/>
+ <scroll_list.columns label="物件å稱" name="name"/>
+ <scroll_list.columns label="ä½ç½®" name="location"/>
+ </scroll_list>
+ <button label="Refresh List" name="refresh_list_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_script_limits_region_memory.xml b/indra/newview/skins/default/xui/zh/panel_script_limits_region_memory.xml
new file mode 100644
index 0000000000..950abbfb4c
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_script_limits_region_memory.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="地å€è¨˜æ†¶é«”" name="script_limits_region_memory_panel">
+ <text name="script_memory">
+ 地段腳本記憶體
+ </text>
+ <text name="loading_text">
+ 載入中...
+ </text>
+ <scroll_list name="scripts_list">
+ <scroll_list.columns label="尺寸(kb)" name="size"/>
+ <scroll_list.columns label="URLs" name="urls"/>
+ <scroll_list.columns label="物件å稱" name="name"/>
+ <scroll_list.columns label="物件æ“有者" name="owner"/>
+ <scroll_list.columns label="地段" name="parcel"/>
+ <scroll_list.columns label="ä½ç½®" name="location"/>
+ </scroll_list>
+ <button label="Refresh List" name="refresh_list_btn"/>
+ <button label="Highlight" name="highlight_btn"/>
+ <button label="退回" name="return_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_scrolling_param.xml b/indra/newview/skins/default/xui/zh/panel_scrolling_param.xml
new file mode 100644
index 0000000000..bc29058f77
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_scrolling_param.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="LLScrollingPanelParam">
+ <text name="Loading...">
+ 載入中...
+ </text>
+ <text name="Loading...2">
+ 載入中...
+ </text>
+ <slider label="[DESC]" name="param slider"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_scrolling_param_base.xml b/indra/newview/skins/default/xui/zh/panel_scrolling_param_base.xml
new file mode 100644
index 0000000000..fa659040ea
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_scrolling_param_base.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="LLScrollingPanelParamBase">
+ <slider label="[DESC]" name="param slider"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_side_tray.xml b/indra/newview/skins/default/xui/zh/panel_side_tray.xml
new file mode 100644
index 0000000000..e5c7deb7d6
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_side_tray.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Side tray cannot show background because it is always
+ partially on screen to hold tab buttons. -->
+<side_tray name="sidebar">
+ <sidetray_tab description="å´é‚Šæ¬„切æ›ã€‚" name="sidebar_openclose" tab_title="å´é‚Šæ¬„切æ›"/>
+ <sidetray_tab description="首é ã€‚" name="sidebar_home" tab_title="首é ">
+ <panel label="首é " name="panel_home"/>
+ </sidetray_tab>
+ <sidetray_tab description="編輯你的公開檔案åŠç²¾é¸åœ°é»žã€‚" name="sidebar_me" tab_title="我的檔案">
+ <panel_container name="panel_container">
+ <panel label="自己" name="panel_me"/>
+ </panel_container>
+ </sidetray_tab>
+ <sidetray_tab description="Find your friends, contacts and people nearby." name="sidebar_people" tab_title="人群">
+ <panel_container name="panel_container">
+ <panel label="群組檔案" name="panel_group_info_sidetray"/>
+ <panel label="Blocked Residents &amp; Objects" name="panel_block_list_sidetray"/>
+ </panel_container>
+ </sidetray_tab>
+ <sidetray_tab description="Find places to go and places you&apos;ve visited before." label="地點" name="sidebar_places" tab_title="地點">
+ <panel label="地點" name="panel_places"/>
+ </sidetray_tab>
+ <sidetray_tab description="ç€è¦½ä½ çš„收ç´å€ã€‚" name="sidebar_inventory" tab_title="我的收ç´å€">
+ <panel label="編輯收ç´å€" name="sidepanel_inventory"/>
+ </sidetray_tab>
+ <sidetray_tab description="變更你的外觀與目å‰æ¨£è²Œã€‚" name="sidebar_appearance" tab_title="我的外觀">
+ <panel label="編輯外觀" name="sidepanel_appearance"/>
+ </sidetray_tab>
+</side_tray>
diff --git a/indra/newview/skins/default/xui/zh/panel_side_tray_tab_caption.xml b/indra/newview/skins/default/xui/zh/panel_side_tray_tab_caption.xml
new file mode 100644
index 0000000000..cdd79da30c
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_side_tray_tab_caption.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="sidetray_tab_panel">
+ <text name="sidetray_tab_title" value="å´é‚Šæ¬„"/>
+ <button name="undock" tool_tip="ä¸åœæ³Šå›ºå®š"/>
+ <button name="dock" tool_tip="åœæ³Šå›ºå®š"/>
+ <button name="show_help" tool_tip="顯示幫助"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_stand_stop_flying.xml b/indra/newview/skins/default/xui/zh/panel_stand_stop_flying.xml
new file mode 100644
index 0000000000..1dd3acef5d
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_stand_stop_flying.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Width and height of this panel should be synchronized with "panel_modes" in the floater_moveview.xml-->
+<panel name="panel_stand_stop_flying">
+ <button label="站立" name="stand_btn" tool_tip="點擊此處起立。"/>
+ <button label="åœæ­¢é£›è¡Œ" name="stop_fly_btn" tool_tip="åœæ­¢é£›è¡Œ"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_status_bar.xml b/indra/newview/skins/default/xui/zh/panel_status_bar.xml
new file mode 100644
index 0000000000..808e14f3c3
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_status_bar.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="status">
+ <panel.string name="packet_loss_tooltip">
+ å°åŒ…æ失
+ </panel.string>
+ <panel.string name="bandwidth_tooltip">
+ 頻寬
+ </panel.string>
+ <panel.string name="time">
+ [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]
+ </panel.string>
+ <panel.string name="timeTooltip">
+ [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]
+ </panel.string>
+ <panel.string name="buycurrencylabel">
+ L$ [AMT]
+ </panel.string>
+ <panel name="balance_bg">
+ <text name="balance" tool_tip="點擊以é‡æ–°æ›´æ–°ä½ çš„ L$ 帳戶餘é¡" value="L$20"/>
+ <button label="購買 L$" name="buyL" tool_tip="點擊以購買更多 L$"/>
+ </panel>
+ <text name="TimeText" tool_tip="ç›®å‰æ™‚å€ï¼ˆå¤ªå¹³æ´‹ï¼‰">
+ 24:00 AM PST
+ </text>
+ <button name="media_toggle_btn" tool_tip="開始 / åœæ­¢å…¨éƒ¨åª’體(音樂ã€å½±ç‰‡ã€ç¶²é ï¼‰"/>
+ <button name="volume_btn" tool_tip="全域音é‡æŽ§åˆ¶"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_teleport_history.xml b/indra/newview/skins/default/xui/zh/panel_teleport_history.xml
new file mode 100644
index 0000000000..a2a63db000
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_teleport_history.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="Teleport History">
+ <accordion name="history_accordion">
+ <no_matched_tabs_text name="no_matched_teleports_msg" value="沒有發ç¾ä½ è¦æ‰¾çš„嗎?試試 [secondlife:///app/search/places/[SEARCH_TERM] æœå°‹]。"/>
+ <no_visible_tabs_text name="no_teleports_msg" value="瞬間傳é€ç´€éŒ„是空白的。試試 [secondlife:///app/search/places/ Search]。"/>
+ <accordion_tab name="today" title="今天"/>
+ <accordion_tab name="yesterday" title="昨天"/>
+ <accordion_tab name="2_days_ago" title="å‰å¤©"/>
+ <accordion_tab name="3_days_ago" title="三天å‰"/>
+ <accordion_tab name="4_days_ago" title="四天å‰"/>
+ <accordion_tab name="5_days_ago" title="五天å‰"/>
+ <accordion_tab name="6_days_and_older" title="六天å‰æˆ–æ›´ä¹…"/>
+ <accordion_tab name="1_month_and_older" title="一個月或更久"/>
+ <accordion_tab name="6_months_and_older" title="åŠå¹´å‰æˆ–æ›´ä¹…"/>
+ </accordion>
+ <panel name="bottom_panel">
+ <menu_button name="gear_btn" tool_tip="顯示é¡å¤–é¸é …"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_teleport_history_item.xml b/indra/newview/skins/default/xui/zh/panel_teleport_history_item.xml
new file mode 100644
index 0000000000..c251994906
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_teleport_history_item.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="teleport_history_item">
+ <text name="region" value="..."/>
+ <button name="profile_btn" tool_tip="顯示物å“資訊"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_voice_effect.xml b/indra/newview/skins/default/xui/zh/panel_voice_effect.xml
new file mode 100644
index 0000000000..6c8a452014
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_voice_effect.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_voice_effect">
+ <string name="no_voice_effect">
+ 關閉變è²æ•ˆæžœ
+ </string>
+ <string name="preview_voice_effects">
+ é è¦½è®Šè²æ•ˆæžœ â–¶
+ </string>
+ <string name="get_voice_effects">
+ å–得變è²æ•ˆæžœ â–¶
+ </string>
+ <combo_box name="voice_effect" tool_tip="é¸å–一個變è²æ•ˆæžœä¾†æ”¹è®Šä½ çš„è²éŸ³">
+ <combo_box.item label="關閉變è²æ•ˆæžœ" name="no_voice_effect"/>
+ </combo_box>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_world_map.xml b/indra/newview/skins/default/xui/zh/panel_world_map.xml
new file mode 100644
index 0000000000..b5aa659bf0
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_world_map.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="world_map">
+ <panel.string name="Loading">
+ 載入中...
+ </panel.string>
+ <panel.string name="InvalidLocation">
+ 無效的ä½ç½®
+ </panel.string>
+ <panel.string name="world_map_north">
+ N
+ </panel.string>
+ <panel.string name="world_map_east">
+ E
+ </panel.string>
+ <panel.string name="world_map_west">
+ W
+ </panel.string>
+ <panel.string name="world_map_south">
+ S
+ </panel.string>
+ <panel.string name="world_map_southeast">
+ SE
+ </panel.string>
+ <panel.string name="world_map_northeast">
+ NE
+ </panel.string>
+ <panel.string name="world_map_southwest">
+ SW
+ </panel.string>
+ <panel.string name="world_map_northwest">
+ NW
+ </panel.string>
+ <panel.string name="world_map_person">
+ 1 person
+ </panel.string>
+ <panel.string name="world_map_people">
+ [NUMBER] people
+ </panel.string>
+ <text label="N" name="floater_map_north">
+ N
+ </text>
+ <text label="E" name="floater_map_east">
+ E
+ </text>
+ <text label="W" name="floater_map_west">
+ W
+ </text>
+ <text label="S" name="floater_map_south">
+ S
+ </text>
+ <text label="SE" name="floater_map_southeast">
+ SE
+ </text>
+ <text label="NE" name="floater_map_northeast">
+ NE
+ </text>
+ <text label="SW" name="floater_map_southwest">
+ SW
+ </text>
+ <text label="NW" name="floater_map_northwest">
+ NW
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/role_actions.xml b/indra/newview/skins/default/xui/zh/role_actions.xml
new file mode 100644
index 0000000000..32bf0d22d8
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/role_actions.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<role_actions>
+ <action_set description="These Abilities include powers to add and remove group Members, and allow new Members to join without an invitation." name="Membership">
+ <action description="邀請他人加入這個群組" longdescription="邀請他人加入這個群組,請按下於角色å€æ®µä¸­çš„æˆå“¡é ç±¤ä¸­çš„ &apos;邀請&apos; 按鈕。" name="member invite" value="1"/>
+ <action description="將會員由這個群組中踢出" longdescription="Eject Members from this Group using the &apos;Eject&apos; button in the Roles section &gt; Members tab. An Owner can eject anyone except another Owner. If you&apos;re not an Owner, a Member can be ejected from a group if, and only if, they&apos;re only in the Everyone Role, and NO other Roles. To remove Members from Roles, you need to have the &apos;Remove Members from Roles&apos; Ability." name="member eject" value="2"/>
+ <action description="Toggle &apos;Open Enrollment&apos; and change &apos;Enrollment fee&apos;" longdescription="Toggle &apos;Open Enrollment&apos; to let new Members join without an invitation, and change the &apos;Enrollment fee&apos; in the General section." name="member options" value="3"/>
+ </action_set>
+ <action_set description="These Abilities include powers to add, remove, and change group Roles, add and remove Members in Roles, and assign Abilities to Roles." name="Roles">
+ <action description="創立一個新角色" longdescription="創立一個新角色於角色å€æ®µ &gt; 角色é ç±¤ã€‚" name="role create" value="4"/>
+ <action description="刪除角色" longdescription="Delete Roles in the Roles section &gt; Roles tab." name="role delete" value="5"/>
+ <action description="Change Role names, titles, descriptions, and whether Role members are publicly revealed" longdescription="Change Role names, titles, descriptions, and whether Role members are publicly revealed. This is done at the bottom of the the Roles section &gt; Roles tab after selecting a Role." name="role properties" value="6"/>
+ <action description="Assign Members to Assigner&apos;s Roles" longdescription="Assign Members to Roles in the list of Assigned Roles (Roles section &gt; Members tab). A Member with this Ability can only add Members to a Role that the assigner is already in." name="role assign member limited" value="7"/>
+ <action description="Assign Members to Any Role" longdescription="Assign Members to Any Role in the list of Assigned Roles (Roles section &gt; Members tab). *WARNING* Any Member in a Role with this Ability can assign themselves--and any other non-Owner Member--to Roles that have more powers than they currently have, potentially elevating themselves to near-Owner power. Be sure you know what you&apos;re doing before assigning this Ability." name="role assign member" value="8"/>
+ <action description="由角色中移除æˆå“¡" longdescription="Remove Members from Roles in the list of Assigned Roles (Roles section &gt; Members tab). Owners can&apos;t be removed." name="role remove member" value="9"/>
+ <action description="Assign and Remove Abilities in Roles" longdescription="Assign and Remove Abilities for each Role in the list of Allowed Abilities (Roles section &gt; Roles tab). *WARNING* Any Member in a Role with this Ability can assign themselves--and any other non-Owner Member--all Abilities, potentially elevating themselves to near-Owner power. Be sure you know what you&apos;re doing before assigning this Ability." name="role change actions" value="10"/>
+ </action_set>
+ <action_set description="These Abilities include powers to modify this group&apos;s identity, such as changing public visibility, charter, and insignia." name="Group Identity">
+ <action description="Change Charter, Insignia, and &apos;Show in search&apos;" longdescription="Change Charter, Insignia, and &apos;Show in search&apos;. This is done in the General section." name="group change identity" value="11"/>
+ </action_set>
+ <action_set description="These Abilities include powers to deed, modify, and sell land in this group&apos;s land holdings. To get to the About Land window, right-click the ground and select &apos;About Land&apos;, or click the &apos;i&apos; icon in the Navigation Bar." name="Parcel Management">
+ <action description="讓渡土地或購買土地給群組" longdescription="Deed land and buy land for group. This is done in About Land &gt; General tab." name="land deed" value="12"/>
+ <action description="Abandon land to Governor Linden" longdescription="Abandon land to Governor Linden. *WARNING* Any Member in a Role with this Ability can abandon group-owned land in About Land &gt; General tab, reverting it to Linden ownership without a sale! Be sure you know what you&apos;re doing before assigning this Ability." name="land release" value="13"/>
+ <action description="Set land for sale info" longdescription="Set land for sale info. *WARNING* Any Member in a Role with this Ability can sell group-owned land in About Land &gt; General tab as they wish! Be sure you know what you&apos;re doing before assigning this Ability." name="land set sale info" value="14"/>
+ <action description="Subdivide and join parcels" longdescription="Subdivide and join parcels. This is done by right-clicking the ground, &apos;Edit Terrain&apos;, and dragging your mouse on the land to make a selection. To subdivide, select what you want to split and click &apos;Subdivide&apos;. To join, select two or more contiguous parcels and click &apos;Join&apos;." name="land divide join" value="15"/>
+ </action_set>
+ <action_set description="These Abilities include powers to change the parcel name and publish settings, Find directory visibility, and landing point &amp; TP routing options." name="Parcel Identity">
+ <action description="Toggle &apos;Show Place in Search&apos; and set category" longdescription="Toggle &apos;Show Place in Search&apos; and setting a parcel&apos;s category in About Land &gt; Options tab." name="land find places" value="17"/>
+ <action description="Change parcel name, description, and &apos;Show Place in Search&apos; settings" longdescription="Change parcel name, description, and &apos;Show Place in Search&apos; settings. This is done in About Land &gt; Options tab." name="land change identity" value="18"/>
+ <action description="Set landing point and set teleport routing" longdescription="On a group-owned parcel, Members in a Role with this Ability can set a landing point to specify where incoming teleports arrive, and also set teleport routing for further control. This is done in About Land &gt; Options tab." name="land set landing point" value="19"/>
+ </action_set>
+ <action_set description="These Abilities include powers which affect parcel options, such as &apos;Create Objects&apos;, &apos;Edit Terrain&apos;, and music &amp; media settings." name="Parcel Settings">
+ <action description="Change music &amp; media settings" longdescription="Change streaming music and movie settings in About Land &gt; Media tab." name="land change media" value="20"/>
+ <action description="Toggle &apos;Edit Terrain&apos;" longdescription="Toggle &apos;Edit Terrain&apos;. *WARNING* About Land &gt; Options tab &gt; Edit Terrain allows anyone to terraform your land&apos;s shape, and place and move Linden plants. Be sure you know what you&apos;re doing before assigning this Ability. Editing terrain is toggled in About Land &gt; Options tab." name="land edit" value="21"/>
+ <action description="Toggle various About Land &gt; Options settings" longdescription="Toggle &apos;Safe (no damage)&apos;, &apos;Fly&apos;, and allow other Residents to: &apos;Edit Terrain&apos;, &apos;Build&apos;, &apos;Create Landmarks&apos;, and &apos;Run Scripts&apos; on group-owned land in About Land &gt; Options tab." name="land options" value="22"/>
+ </action_set>
+ <action_set description="These Abilities include powers which allow Members to bypass restrictions on group-owned parcels." name="Parcel Powers">
+ <action description="Always allow &apos;Edit Terrain&apos;" longdescription="Members in a Role with this Ability can edit terrain on a group-owned parcel, even if it&apos;s turned off in About Land &gt; Options tab." name="land allow edit land" value="23"/>
+ <action description="Always allow &apos;Fly&apos;" longdescription="Members in a Role with this Ability can fly on a group-owned parcel, even if it&apos;s turned off in About Land &gt; Options tab." name="land allow fly" value="24"/>
+ <action description="Always allow &apos;Create Objects&apos;" longdescription="Members in a Role with this Ability can create objects on a group-owned parcel, even if it&apos;s turned off in About Land &gt; Options tab." name="land allow create" value="25"/>
+ <action description="總是å…許 &apos;創造地標&apos;" longdescription="Members in a Role with this Ability can landmark a group-owned parcel, even if it&apos;s turned off in About Land &gt; Options tab." name="land allow landmark" value="26"/>
+ <action description="Allow &apos;Set Home to Here&apos; on group land" longdescription="Members in a Role with this Ability can use World menu &gt; Landmarks &gt; Set Home to Here on a parcel deeded to this group." name="land allow set home" value="28"/>
+ <action description="Allow &apos;Event Hosting&apos; on group land" longdescription="Members in a Role with this Ability can select group owned parcels as venus when hosting an event." name="land allow host event" value="41"/>
+ </action_set>
+ <action_set description="These Abilities include powers to allow or restrict access to group-owned parcels, including freezing and ejecting Residents." name="Parcel Access">
+ <action description="Manage parcel Access lists" longdescription="Manage parcel Access lists in About Land &gt; Access tab." name="land manage allowed" value="29"/>
+ <action description="Manage parcel Ban lists" longdescription="Manage parcel Ban lists in About Land &gt; Access tab." name="land manage banned" value="30"/>
+ <action description="Change parcel &apos;Sell passes to&apos; settings" longdescription="Change parcel &apos;Sell passes to&apos; settings in About Land &gt; Access tab." name="land manage passes" value="31"/>
+ <action description="將地段內的居民踢出åŠå‡çµ" longdescription="Members in a Role with this Ability can handle an unwelcome Resident on a group-owned parcel by right-clicking them, then selecting &apos;Eject&apos; or &apos;Freeze&apos;." name="land admin" value="32"/>
+ </action_set>
+ <action_set description="These Abilities include powers to allow members to return objects and place and move Linden plants. This is useful for Members to clean up litter and do landscaping, but it should also be used with care, because there&apos;s no undo for returning objects." name="Parcel Content">
+ <action description="Return objects owned by group" longdescription="Return objects on group-owned parcels that are owned by the group in About Land &gt; Objects tab." name="land return group owned" value="48"/>
+ <action description="Return objects set to group" longdescription="Return objects on group-owned parcels that are set to the group in About Land &gt; Objects tab." name="land return group set" value="33"/>
+ <action description="退回éžç¾¤çµ„物件" longdescription="Return objects on group-owned parcels that are non-group in About Land &gt; Objects tab." name="land return non group" value="34"/>
+ <action description="Landscaping using Linden plants" longdescription="Landscaping ability to place and move Linden trees, plants, and grasses. These items can be found in your inventory&apos;s Library &gt; Objects folder, or they can be created via the Build menu." name="land gardening" value="35"/>
+ </action_set>
+ <action_set description="These Abilities include powers to deed, modify, and sell group-owned objects. These changes are done in the Build Tools &gt; General tab. Right-click an object and Edit to see its settings." name="Object Management">
+ <action description="讓渡物件給群組" longdescription="Deed objects to group in the Build Tools &gt; General tab." name="object deed" value="36"/>
+ <action description="Manipulate (move, copy, modify) group-owned objects" longdescription="Manipulate (move, copy, modify) group-owned objects in the Build Tools &gt; General tab." name="object manipulate" value="38"/>
+ <action description="Set group-owned objects for sale" longdescription="Set group-owned objects for sale in the Build Tools &gt; General tab." name="object set sale" value="39"/>
+ </action_set>
+ <action_set description="These Abilities include powers which require Members to pay group liabilities and receive group dividends, and restrict access to group account history." name="Accounting">
+ <action description="Pay group liabilities and receive group dividends" longdescription="Members in a Role with this Ability will automatically pay group liabilities and receive group dividends. This means they will receive a portion of group-owned land sales which are distributed daily, as well as contribute towards things like parcel listing fees." name="accounting accountable" value="40"/>
+ </action_set>
+ <action_set description="These Abilities include powers to allow Members to send, receive, and view group Notices." name="Notices">
+ <action description="é€å‡ºé€šçŸ¥" longdescription="Members in a Role with this Ability can send Notices via the Group &gt; Notices section." name="notices send" value="42"/>
+ <action description="接收通知與察看éŽåŽ»é€šçŸ¥" longdescription="Members in a Role with this Ability can receive Notices and view past Notices in Group &gt; Notices section." name="notices receive" value="43"/>
+ </action_set>
+ <action_set description="These Abilities include powers to allow or restrict access to group chat sessions and group voice chat." name="Chat">
+ <action description="加入群組èŠå¤©" longdescription="Members in a Role with this Ability can join group chat sessions, for text and voice." name="join group chat" value="16"/>
+ <action description="加入群組語音èŠå¤©" longdescription="Members in a Role with this Ability can join group voice chat sessions. NOTE: The Join Group Chat ability is required to access the voice chat session." name="join voice chat" value="27"/>
+ <action description="é©åº¦æˆäººå…§å®¹çš„群組èŠå¤©" longdescription="Members in a Role with this Ability can control access and participation in group voice and text chat sessions." name="moderate group chat" value="37"/>
+ </action_set>
+</role_actions>
diff --git a/indra/newview/skins/default/xui/zh/sidepanel_appearance.xml b/indra/newview/skins/default/xui/zh/sidepanel_appearance.xml
new file mode 100644
index 0000000000..7d8a502594
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/sidepanel_appearance.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="è£æ‰®" name="appearance panel">
+ <string name="No Outfit" value="ç„¡è£æ‰®"/>
+ <string name="Unsaved Changes" value="變更未儲存"/>
+ <string name="Now Wearing" value="ç¾åœ¨ç©¿ä¸Š..."/>
+ <string name="Changing outfits" value="變更è£æ‰®"/>
+ <panel name="panel_currentlook">
+ <button label="E" name="editappearance_btn"/>
+ <button label="O" name="openoutfit_btn"/>
+ <text name="currentlook_status">
+ (狀態)
+ </text>
+ <text name="currentlook_name">
+ MyOutfit With a really Long Name like MOOSE
+ </text>
+ <button label="" name="edit_outfit_btn" tool_tip="編輯這è£æ‰®"/>
+ </panel>
+ <filter_editor label="è£æ‰®éŽæ¿¾å™¨" name="Filter"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/sidepanel_inventory.xml b/indra/newview/skins/default/xui/zh/sidepanel_inventory.xml
new file mode 100644
index 0000000000..7abe95a402
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/sidepanel_inventory.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="事物" name="objects panel">
+ <panel label="" name="sidepanel__inventory_panel">
+ <panel name="button_panel">
+ <layout_stack name="button_panel_ls">
+ <layout_panel name="info_btn_lp">
+ <button label="檔案" name="info_btn" tool_tip="顯示物件檔案"/>
+ </layout_panel>
+ <layout_panel name="share_btn_lp">
+ <button label="分享" name="share_btn" tool_tip="Share an inventory item"/>
+ </layout_panel>
+ <layout_panel name="shop_btn_lp">
+ <button label="Shop" name="shop_btn" tool_tip="Open Marketplace webpage"/>
+ <button label="穿上" name="wear_btn" tool_tip="穿上所é¸æ“‡çš„è£æ‰®"/>
+ <button label="播放" name="play_btn"/>
+ <button label="瞬間傳é€" name="teleport_btn" tool_tip="瞬間傳é€åˆ°æ‰€é¸çš„å€åŸŸ"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/sidepanel_item_info.xml b/indra/newview/skins/default/xui/zh/sidepanel_item_info.xml
new file mode 100644
index 0000000000..adc815fb4b
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/sidepanel_item_info.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="item properties" title="物å“檔案">
+ <panel.string name="unknown">
+ (未知)
+ </panel.string>
+ <panel.string name="public">
+ (公開)
+ </panel.string>
+ <panel.string name="you_can">
+ ä½ å¯ä»¥ï¼š
+ </panel.string>
+ <panel.string name="owner_can">
+ æ“有者å¯ä»¥ï¼š
+ </panel.string>
+ <panel.string name="acquiredDate">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </panel.string>
+ <panel.string name="origin_inventory">
+ (收ç´å€ï¼‰
+ </panel.string>
+ <panel.string name="origin_inworld">
+ (Inworld)
+ </panel.string>
+ <text name="title" value="物å“檔案"/>
+ <text name="origin" value="(收ç´å€ï¼‰"/>
+ <scroll_container name="item_profile_scroll">
+ <panel label="" name="item_profile">
+ <text name="LabelItemNameTitle">
+ å稱:
+ </text>
+ <text name="LabelItemDescTitle">
+ æ述:
+ </text>
+ <text name="LabelCreatorTitle">
+ 創造者:
+ </text>
+ <text name="LabelOwnerTitle">
+ æ“有者:
+ </text>
+ <text name="LabelAcquiredTitle">
+ å–得於:
+ </text>
+ <panel name="perms_inv">
+ <text name="perm_modify">
+ ä½ å¯ä»¥ï¼š
+ </text>
+ <check_box label="修改" name="CheckOwnerModify"/>
+ <check_box label="覆製" name="CheckOwnerCopy"/>
+ <check_box label="轉移" name="CheckOwnerTransfer"/>
+ <text name="AnyoneLabel">
+ 任何人:
+ </text>
+ <check_box label="覆製" name="CheckEveryoneCopy"/>
+ <text name="GroupLabel">
+ 群組:
+ </text>
+ <check_box label="分享" name="CheckShareWithGroup" tool_tip="Allow all members of the set group to share your modify permissions for this object. You must Deed to enable role restrictions."/>
+ <text name="NextOwnerLabel">
+ 下一個æ“有者:
+ </text>
+ <check_box label="修改" name="CheckNextOwnerModify"/>
+ <check_box label="覆製" name="CheckNextOwnerCopy"/>
+ <check_box label="轉移" name="CheckNextOwnerTransfer" tool_tip="Next owner can give away or resell this object"/>
+ </panel>
+ <check_box label="出售" name="CheckPurchase"/>
+ <combo_box name="combobox sale copy">
+ <combo_box.item label="副本" name="Copy"/>
+ <combo_box.item label="原件" name="Original"/>
+ </combo_box>
+ <spinner label="價格: L$" name="Edit Cost"/>
+ </panel>
+ </scroll_container>
+ <panel name="button_panel">
+ <button label="å–消" name="cancel_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/sidepanel_task_info.xml b/indra/newview/skins/default/xui/zh/sidepanel_task_info.xml
new file mode 100644
index 0000000000..3d46e52726
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/sidepanel_task_info.xml
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="object properties" title="物件檔案">
+ <panel.string name="text deed continued">
+ 讓渡
+ </panel.string>
+ <panel.string name="text deed">
+ 讓渡
+ </panel.string>
+ <panel.string name="text modify info 1">
+ ä½ å¯ä»¥ä¿®æ”¹é€™å€‹ç‰©ä»¶
+ </panel.string>
+ <panel.string name="text modify info 2">
+ ä½ å¯ä»¥ä¿®æ”¹é€™äº›ç‰©ä»¶
+ </panel.string>
+ <panel.string name="text modify info 3">
+ ä½ ä¸å¯ä»¥ä¿®æ”¹é€™å€‹ç‰©ä»¶
+ </panel.string>
+ <panel.string name="text modify info 4">
+ ä½ ä¸å¯ä»¥ä¿®æ”¹é€™äº›ç‰©ä»¶
+ </panel.string>
+ <panel.string name="text modify warning">
+ 這個物件有è¯çµåˆ°å…¶ä»–部分
+ </panel.string>
+ <panel.string name="Cost Default">
+ 價格: L$
+ </panel.string>
+ <panel.string name="Cost Total">
+ 總價: L$
+ </panel.string>
+ <panel.string name="Cost Per Unit">
+ 單價: L$
+ </panel.string>
+ <panel.string name="Cost Mixed">
+ æ··åˆåƒ¹æ ¼
+ </panel.string>
+ <panel.string name="Sale Mixed">
+ æ··åˆéŠ·å”®
+ </panel.string>
+ <text name="title" value="物件檔案"/>
+ <text name="where" value="(Inworld)"/>
+ <panel label="" name="properties_panel">
+ <text name="Name:">
+ å稱:
+ </text>
+ <text name="Description:">
+ æ述:
+ </text>
+ <text name="CreatorNameLabel">
+ 創造者:
+ </text>
+ <text name="Owner:">
+ æ“有者:
+ </text>
+ <text name="Group_label">
+ 群組:
+ </text>
+ <button name="button set group" tool_tip="é¸æ“‡ä¸€å€‹ç¾¤çµ„以分享這個物件的權é™"/>
+ <name_box initial_value="載入中..." name="Group Name Proxy"/>
+ <button label="讓渡" label_selected="讓渡" name="button deed" tool_tip="Deeding gives this item away with next owner permissions. Group shared objects can be deeded by a group officer."/>
+ <text name="label click action">
+ 點擊以:
+ </text>
+ <combo_box name="clickaction">
+ <combo_box.item label="觸碰(é è¨­ï¼‰" name="Touch/grab(default)"/>
+ <combo_box.item label="å在物件上" name="Sitonobject"/>
+ <combo_box.item label="購買物件" name="Buyobject"/>
+ <combo_box.item label="支付物件" name="Payobject"/>
+ <combo_box.item label="é–‹å•Ÿ" name="Open"/>
+ </combo_box>
+ <panel name="perms_inv">
+ <text name="perm_modify">
+ 你能修改這個物件
+ </text>
+ <text name="Anyone can:">
+ 任何人:
+ </text>
+ <check_box label="覆製" name="checkbox allow everyone copy"/>
+ <check_box label="移動" name="checkbox allow everyone move"/>
+ <text name="GroupLabel">
+ 群組:
+ </text>
+ <check_box label="分享" name="checkbox share with group" tool_tip="Allow all members of the set group to share your modify permissions for this object. You must Deed to enable role restrictions."/>
+ <text name="NextOwnerLabel">
+ 下一個æ“有者:
+ </text>
+ <check_box label="修改" name="checkbox next owner can modify"/>
+ <check_box label="覆製" name="checkbox next owner can copy"/>
+ <check_box label="轉移" name="checkbox next owner can transfer" tool_tip="下一個æ“有者å¯ä»¥é€å‡ºæˆ–轉售這個物件"/>
+ </panel>
+ <check_box label="出售" name="checkbox for sale"/>
+ <combo_box name="sale type">
+ <combo_box.item label="副本" name="Copy"/>
+ <combo_box.item label="內容" name="Contents"/>
+ <combo_box.item label="原件" name="Original"/>
+ </combo_box>
+ <spinner label="價格: L$" name="Edit Cost"/>
+ <check_box label="顯示在æœå°‹ä¸­" name="search_check" tool_tip="讓其他人å¯ä»¥åœ¨æœå°‹çµæžœä¸­å¯Ÿçœ‹åˆ°æ­¤ç‰©ä»¶"/>
+ <text name="B:">
+ B:
+ </text>
+ <text name="O:">
+ O:
+ </text>
+ <text name="G:">
+ G:
+ </text>
+ <text name="E:">
+ E:
+ </text>
+ <text name="N:">
+ N:
+ </text>
+ <text name="F:">
+ F:
+ </text>
+ </panel>
+ <panel name="button_panel">
+ <button label="é–‹å•Ÿ" name="open_btn"/>
+ <button label="支付" name="pay_btn"/>
+ <button label="購買" name="buy_btn"/>
+ <button label="細節" name="details_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/zh/strings.xml b/indra/newview/skins/default/xui/zh/strings.xml
new file mode 100644
index 0000000000..6dbe44d32e
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/strings.xml
@@ -0,0 +1,4454 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- This file contains strings that used to be hardcoded in the source.
+ It is only for those strings which do not belong in a floater.
+ For example, the strings used in avatar chat bubbles, and strings
+ that are returned from one component and may appear in many places-->
+<strings>
+ <string name="SECOND_LIFE">
+ 第二人生
+ </string>
+ <string name="APP_NAME">
+ 第二人生
+ </string>
+ <string name="CAPITALIZED_APP_NAME">
+ 第二人生
+ </string>
+ <string name="SECOND_LIFE_GRID">
+ 第二人生網格
+ </string>
+ <string name="SUPPORT_SITE">
+ 第二人生支æ´å…¥å£
+ </string>
+ <string name="StartupDetectingHardware">
+ 硬體åµæ¸¬ä¸­...
+ </string>
+ <string name="StartupLoading">
+ [APP_NAME] 載入中...
+ </string>
+ <string name="StartupClearingCache">
+ å¿«å–清除中...
+ </string>
+ <string name="StartupInitializingTextureCache">
+ æ質快å–åˆå§‹åŒ–中...
+ </string>
+ <string name="StartupInitializingVFS">
+ VFS åˆå§‹åŒ–中...
+ </string>
+ <string name="ProgressRestoring">
+ 回存中...
+ </string>
+ <string name="ProgressChangingResolution">
+ 變更解æžåº¦...
+ </string>
+ <string name="Fullbright">
+ 全亮(舊版)
+ </string>
+ <string name="LoginInProgress">
+ 登入中。[APP_NAME] å¯èƒ½å‡ºç¾å‡çµç‹€æ…‹ã€‚è«‹è€å¿ƒç¨ç­‰ã€‚
+ </string>
+ <string name="LoginInProgressNoFrozen">
+ 登入中...
+ </string>
+ <string name="LoginAuthenticating">
+ 身份驗證中
+ </string>
+ <string name="LoginMaintenance">
+ 進行帳戶維護...
+ </string>
+ <string name="LoginAttempt">
+ å…ˆå‰ä¼åœ–嘗試登入失敗。ç¾ç™»å…¥ä¸­ï¼Œå˜—試 [NUMBER]
+ </string>
+ <string name="LoginPrecaching">
+ 世界載入中...
+ </string>
+ <string name="LoginInitializingBrowser">
+ 內嵌å¼ç¶²é ç€è¦½å™¨åˆå§‹åŒ–中...
+ </string>
+ <string name="LoginInitializingMultimedia">
+ 多媒體åˆå§‹åŒ–中...
+ </string>
+ <string name="LoginInitializingFonts">
+ 字型載入中...
+ </string>
+ <string name="LoginVerifyingCache">
+ 驗證快å–檔案(約需 60-90 秒左å³ï¼‰...
+ </string>
+ <string name="LoginProcessingResponse">
+ 回應處ç†ä¸­...
+ </string>
+ <string name="LoginInitializingWorld">
+ 世界åˆå§‹åŒ–中...
+ </string>
+ <string name="LoginDecodingImages">
+ 圖åƒè§£ç¢¼ä¸­...
+ </string>
+ <string name="LoginInitializingQuicktime">
+ QuickTime åˆå§‹åŒ–中...
+ </string>
+ <string name="LoginQuicktimeNotFound">
+ QuickTime æœªç™¼ç¾ - 無法進行åˆå§‹åŒ–。
+ </string>
+ <string name="LoginQuicktimeOK">
+ QuickTime å·²æˆåŠŸåˆå§‹åŒ–。
+ </string>
+ <string name="LoginWaitingForRegionHandshake">
+ 地å€äº¤æ¡ç­‰å¾…中...
+ </string>
+ <string name="LoginConnectingToRegion">
+ 地å€è¯çµä¸­...
+ </string>
+ <string name="LoginDownloadingClothing">
+ æœè£ä¸‹è¼‰ä¸­...
+ </string>
+ <string name="InvalidCertificate">
+ 伺æœå™¨å›žå‚³ä¸€å€‹ç„¡æ•ˆæžœæ壞的憑證。請連繫網格管ç†è€…。
+ </string>
+ <string name="CertInvalidHostname">
+ An invalid hostname was used to access the server, please check your SLURL or Grid hostname.
+ </string>
+ <string name="CertExpired">
+ The certificate returned by the Grid appears to be expired. Please check your system clock, or contact your Grid administrator.
+ </string>
+ <string name="CertKeyUsage">
+ The certificate returned by the server could not be used for SSL. Please contact your Grid administrator.
+ </string>
+ <string name="CertBasicConstraints">
+ Too many certificates were in the servers Certificate chain. Please contact your Grid administrator.
+ </string>
+ <string name="CertInvalidSignature">
+ The certificate signature returned by the Grid server could not be verified. Please contact your Grid administrator.
+ </string>
+ <string name="LoginFailedNoNetwork">
+ Network Error: Could not establish connection, please check your network connection.
+ </string>
+ <string name="LoginFailed">
+ 登入失敗。
+ </string>
+ <string name="Quit">
+ çµæŸé€€å‡º
+ </string>
+ <string name="create_account_url">
+ http://join.secondlife.com/
+ </string>
+ <string name="AgentLostConnection">
+ 這個地å€å¯èƒ½é­é‡å•é¡Œï¼Œè«‹æª¢æŸ¥ä½ çš„網路連線。
+ </string>
+ <string name="SavingSettings">
+ 你的設定儲存中...
+ </string>
+ <string name="LoggingOut">
+ 登出中...
+ </string>
+ <string name="ShuttingDown">
+ 關閉中...
+ </string>
+ <string name="YouHaveBeenDisconnected">
+ 你已經被所在的地å€ä¸­æ–·è¯çµã€‚
+ </string>
+ <string name="SentToInvalidRegion">
+ 你被傳é€åˆ°ä¸€å€‹ç„¡æ•ˆçš„地å€ã€‚
+ </string>
+ <string name="TestingDisconnect">
+ 測試ç€è¦½å™¨æ–·ç·š
+ </string>
+ <string name="TooltipPerson">
+ 人
+ </string>
+ <string name="TooltipNoName">
+ (無å稱)
+ </string>
+ <string name="TooltipOwner">
+ æ“有者:
+ </string>
+ <string name="TooltipPublic">
+ 公開
+ </string>
+ <string name="TooltipIsGroup">
+ (群組)
+ </string>
+ <string name="TooltipForSaleL$">
+ 出售: L$[AMOUNT]
+ </string>
+ <string name="TooltipFlagGroupBuild">
+ 群組建造
+ </string>
+ <string name="TooltipFlagNoBuild">
+ ç¦æ­¢å»ºé€ 
+ </string>
+ <string name="TooltipFlagNoEdit">
+ 群組建造
+ </string>
+ <string name="TooltipFlagNotSafe">
+ éžå®‰å…¨
+ </string>
+ <string name="TooltipFlagNoFly">
+ ç¦æ­¢é£›è¡Œ
+ </string>
+ <string name="TooltipFlagGroupScripts">
+ 群組腳本
+ </string>
+ <string name="TooltipFlagNoScripts">
+ ç¦æ­¢è…³æœ¬
+ </string>
+ <string name="TooltipLand">
+ 土地:
+ </string>
+ <string name="TooltipMustSingleDrop">
+ åªæœ‰ä¸€å€‹ç‰©å“å¯ä»¥è¢«æ‹–曳到此處
+ </string>
+ <string name="TooltipPrice" value="L$[AMOUNT]:"/>
+ <string name="TooltipHttpUrl">
+ 點擊以察看這個網é 
+ </string>
+ <string name="TooltipSLURL">
+ 點擊以察看這個ä½ç½®è³‡è¨Š
+ </string>
+ <string name="TooltipAgentUrl">
+ 點擊以察看這個居民檔案
+ </string>
+ <string name="TooltipAgentInspect">
+ 瞭解更多有關這個居民
+ </string>
+ <string name="TooltipAgentMute">
+ 點擊以å°éŽ–這ä½å±…æ°‘
+ </string>
+ <string name="TooltipAgentUnmute">
+ 點擊以解除å°éŽ–這ä½å±…æ°‘
+ </string>
+ <string name="TooltipAgentIM">
+ 點擊開始 IM 這ä½å±…æ°‘
+ </string>
+ <string name="TooltipAgentPay">
+ 點擊以支付這ä½å±…æ°‘
+ </string>
+ <string name="TooltipAgentOfferTeleport">
+ 點擊以é€å‡ºçž¬é–“傳é€é‚€è«‹çµ¦é€™ä½å±…æ°‘
+ </string>
+ <string name="TooltipAgentRequestFriend">
+ 點擊以é€å‡ºäº¤å‹é‚€è«‹çµ¦é€™ä½å±…æ°‘
+ </string>
+ <string name="TooltipGroupUrl">
+ 點擊以察看這個群組的æè¿°
+ </string>
+ <string name="TooltipEventUrl">
+ 點擊以察看這個活動的æè¿°
+ </string>
+ <string name="TooltipClassifiedUrl">
+ Click to view this classified
+ </string>
+ <string name="TooltipParcelUrl">
+ 點擊以察看這個地段的æè¿°
+ </string>
+ <string name="TooltipTeleportUrl">
+ 點擊以傳é€åˆ°é€™å€‹ä½ç½®
+ </string>
+ <string name="TooltipObjectIMUrl">
+ 點擊以察看這個物件的æè¿°
+ </string>
+ <string name="TooltipMapUrl">
+ 點擊以察看此處在地圖上的ä½ç½®
+ </string>
+ <string name="TooltipSLAPP">
+ 點擊以執行 secondlife:// 指令
+ </string>
+ <string name="CurrentURL" value="ç›®å‰ç¶²å€ï¼š[CurrentURL]"/>
+ <string name="SLurlLabelTeleport">
+ 瞬間傳é€åˆ°
+ </string>
+ <string name="SLurlLabelShowOnMap">
+ 顯示地圖為了
+ </string>
+ <string name="SLappAgentMute">
+ å°éŽ–
+ </string>
+ <string name="SLappAgentUnmute">
+ 解除å°éŽ–
+ </string>
+ <string name="SLappAgentIM">
+ IM
+ </string>
+ <string name="SLappAgentPay">
+ 支付
+ </string>
+ <string name="SLappAgentOfferTeleport">
+ 發給瞬間傳é€è«‹æ±‚到
+ </string>
+ <string name="SLappAgentRequestFriend">
+ 交å‹è¦æ±‚
+ </string>
+ <string name="BUTTON_CLOSE_DARWIN">
+ 關閉(⌘W)
+ </string>
+ <string name="BUTTON_CLOSE_WIN">
+ 關閉(Ctrl+W)
+ </string>
+ <string name="BUTTON_CLOSE_CHROME">
+ 關閉
+ </string>
+ <string name="BUTTON_RESTORE">
+ 還原
+ </string>
+ <string name="BUTTON_MINIMIZE">
+ 最å°åŒ–
+ </string>
+ <string name="BUTTON_TEAR_OFF">
+ 脫下
+ </string>
+ <string name="BUTTON_DOCK">
+ åœæ³Šå›ºå®š
+ </string>
+ <string name="BUTTON_HELP">
+ 顯示幫助
+ </string>
+ <string name="Searching">
+ æœå°‹ä¸­...
+ </string>
+ <string name="NoneFound">
+ 未發ç¾ã€‚
+ </string>
+ <string name="RetrievingData">
+ 檢索...
+ </string>
+ <string name="ReleaseNotes">
+ 釋出版本說明
+ </string>
+ <string name="LoadingData">
+ 載入中...
+ </string>
+ <string name="AvatarNameNobody">
+ (沒有人)
+ </string>
+ <string name="AvatarNameWaiting">
+ (等待中)
+ </string>
+ <string name="AvatarNameMultiple">
+ (多個)
+ </string>
+ <string name="GroupNameNone">
+ (無)
+ </string>
+ <string name="AvalineCaller">
+ Avaline Caller [ORDER]
+ </string>
+ <string name="AssetErrorNone">
+ 無錯誤
+ </string>
+ <string name="AssetErrorRequestFailed">
+ 資產請求:失敗
+ </string>
+ <string name="AssetErrorNonexistentFile">
+ 資產è¦æ±‚:éžå·²å­˜åœ¨æª”案
+ </string>
+ <string name="AssetErrorNotInDatabase">
+ 資產è¦æ±‚:資產並未發ç¾æ–¼è³‡æ–™åº«ä¸­
+ </string>
+ <string name="AssetErrorEOF">
+ 檔案çµå°¾
+ </string>
+ <string name="AssetErrorCannotOpenFile">
+ 無法開啟檔案
+ </string>
+ <string name="AssetErrorFileNotFound">
+ 檔案未發ç¾
+ </string>
+ <string name="AssetErrorTCPTimeout">
+ 檔案傳輸逾時
+ </string>
+ <string name="AssetErrorCircuitGone">
+ Circuit gone
+ </string>
+ <string name="AssetErrorPriceMismatch">
+ Viewer and server do not agree on price
+ </string>
+ <string name="AssetErrorUnknownStatus">
+ 未知狀態
+ </string>
+ <string name="texture">
+ æ質
+ </string>
+ <string name="sound">
+ è²éŸ³
+ </string>
+ <string name="calling card">
+ å片
+ </string>
+ <string name="landmark">
+ 地標
+ </string>
+ <string name="legacy script">
+ 舊版腳本
+ </string>
+ <string name="clothing">
+ æœè£
+ </string>
+ <string name="object">
+ 物件
+ </string>
+ <string name="note card">
+ 記事å¡
+ </string>
+ <string name="folder">
+ 資料夾
+ </string>
+ <string name="root">
+ root
+ </string>
+ <string name="lsl2 script">
+ LSL2 script
+ </string>
+ <string name="lsl bytecode">
+ LSL bytecode
+ </string>
+ <string name="tga texture">
+ tga æ質
+ </string>
+ <string name="body part">
+ 身體部ä½
+ </string>
+ <string name="snapshot">
+ å¿«ç…§
+ </string>
+ <string name="lost and found">
+ Lost and Found
+ </string>
+ <string name="targa image">
+ targa 圖åƒ
+ </string>
+ <string name="trash">
+ 垃圾桶
+ </string>
+ <string name="jpeg image">
+ jpeg 圖åƒ
+ </string>
+ <string name="animation">
+ 動作
+ </string>
+ <string name="gesture">
+ 姿勢
+ </string>
+ <string name="simstate">
+ 模擬器狀態
+ </string>
+ <string name="favorite">
+ 我的最愛
+ </string>
+ <string name="symbolic link">
+ è¯çµ
+ </string>
+ <string name="symbolic folder link">
+ 資料夾è¯çµ
+ </string>
+ <string name="AvatarEditingAppearance">
+ (外觀編輯中)
+ </string>
+ <string name="AvatarAway">
+ 離開
+ </string>
+ <string name="AvatarBusy">
+ 忙碌
+ </string>
+ <string name="AvatarMuted">
+ å°éŽ–çš„
+ </string>
+ <string name="anim_express_afraid">
+ 害怕
+ </string>
+ <string name="anim_express_anger">
+ 生氣
+ </string>
+ <string name="anim_away">
+ Away
+ </string>
+ <string name="anim_backflip">
+ Backflip
+ </string>
+ <string name="anim_express_laugh">
+ Belly Laugh
+ </string>
+ <string name="anim_express_toothsmile">
+ BigSmile
+ </string>
+ <string name="anim_blowkiss">
+ Blow Kiss
+ </string>
+ <string name="anim_express_bored">
+ ç„¡èŠ
+ </string>
+ <string name="anim_bow">
+ Bow
+ </string>
+ <string name="anim_clap">
+ æ‹æ‰‹
+ </string>
+ <string name="anim_courtbow">
+ Court Bow
+ </string>
+ <string name="anim_express_cry">
+ å“­æ³£
+ </string>
+ <string name="anim_dance1">
+ Dance 1
+ </string>
+ <string name="anim_dance2">
+ Dance 2
+ </string>
+ <string name="anim_dance3">
+ Dance 3
+ </string>
+ <string name="anim_dance4">
+ Dance 4
+ </string>
+ <string name="anim_dance5">
+ Dance 5
+ </string>
+ <string name="anim_dance6">
+ Dance 6
+ </string>
+ <string name="anim_dance7">
+ Dance 7
+ </string>
+ <string name="anim_dance8">
+ Dance 8
+ </string>
+ <string name="anim_express_disdain">
+ Disdain
+ </string>
+ <string name="anim_drink">
+ Drink
+ </string>
+ <string name="anim_express_embarrased">
+ Embarrassed
+ </string>
+ <string name="anim_angry_fingerwag">
+ Finger Wag
+ </string>
+ <string name="anim_fist_pump">
+ Fist Pump
+ </string>
+ <string name="anim_yoga_float">
+ Floating Yoga
+ </string>
+ <string name="anim_express_frown">
+ Frown
+ </string>
+ <string name="anim_impatient">
+ Impatient
+ </string>
+ <string name="anim_jumpforjoy">
+ Jump For Joy
+ </string>
+ <string name="anim_kissmybutt">
+ Kiss My Butt
+ </string>
+ <string name="anim_express_kiss">
+ 親å»
+ </string>
+ <string name="anim_laugh_short">
+ 笑
+ </string>
+ <string name="anim_musclebeach">
+ Muscle Beach
+ </string>
+ <string name="anim_no_unhappy">
+ ä¸ï¼ˆä¸å¿«æ¨‚)
+ </string>
+ <string name="anim_no_head">
+ ä¸
+ </string>
+ <string name="anim_nyanya">
+ Nya-nya-nya
+ </string>
+ <string name="anim_punch_onetwo">
+ One-Two Punch
+ </string>
+ <string name="anim_express_open_mouth">
+ Open Mouth
+ </string>
+ <string name="anim_peace">
+ Peace
+ </string>
+ <string name="anim_point_you">
+ Point at Other
+ </string>
+ <string name="anim_point_me">
+ Point at Self
+ </string>
+ <string name="anim_punch_l">
+ Punch Left
+ </string>
+ <string name="anim_punch_r">
+ Punch Right
+ </string>
+ <string name="anim_rps_countdown">
+ RPS count
+ </string>
+ <string name="anim_rps_paper">
+ RPS paper
+ </string>
+ <string name="anim_rps_rock">
+ RPS rock
+ </string>
+ <string name="anim_rps_scissors">
+ RPS scissors
+ </string>
+ <string name="anim_express_repulsed">
+ Repulsed
+ </string>
+ <string name="anim_kick_roundhouse_r">
+ Roundhouse Kick
+ </string>
+ <string name="anim_express_sad">
+ 傷心
+ </string>
+ <string name="anim_salute">
+ 敬禮
+ </string>
+ <string name="anim_shout">
+ Shout
+ </string>
+ <string name="anim_express_shrug">
+ Shrug
+ </string>
+ <string name="anim_express_smile">
+ 微笑
+ </string>
+ <string name="anim_smoke_idle">
+ Smoke Idle
+ </string>
+ <string name="anim_smoke_inhale">
+ Smoke Inhale
+ </string>
+ <string name="anim_smoke_throw_down">
+ Smoke Throw Down
+ </string>
+ <string name="anim_express_surprise">
+ 驚喜
+ </string>
+ <string name="anim_sword_strike_r">
+ Sword Strike
+ </string>
+ <string name="anim_angry_tantrum">
+ Tantrum
+ </string>
+ <string name="anim_express_tongue_out">
+ TongueOut
+ </string>
+ <string name="anim_hello">
+ Wave
+ </string>
+ <string name="anim_whisper">
+ 耳語
+ </string>
+ <string name="anim_whistle">
+ å¹å£å“¨
+ </string>
+ <string name="anim_express_wink">
+ 眨眼
+ </string>
+ <string name="anim_wink_hollywood">
+ 眨眼(好èŠå¡¢ï¼‰
+ </string>
+ <string name="anim_express_worry">
+ 擔心
+ </string>
+ <string name="anim_yes_happy">
+ 是(快樂)
+ </string>
+ <string name="anim_yes_head">
+ 是
+ </string>
+ <string name="texture_loading">
+ 載入中...
+ </string>
+ <string name="worldmap_offline">
+ 離線
+ </string>
+ <string name="worldmap_item_tooltip_format">
+ [AREA] m² L$[PRICE]
+ </string>
+ <string name="worldmap_results_none_found">
+ 沒有發ç¾ã€‚
+ </string>
+ <string name="Ok">
+ 確定
+ </string>
+ <string name="Premature end of file">
+ Premature end of file
+ </string>
+ <string name="ST_NO_JOINT">
+ Can&apos;t find ROOT or JOINT.
+ </string>
+ <string name="whisper">
+ 低語:
+ </string>
+ <string name="shout">
+ å¶å–Šï¼š
+ </string>
+ <string name="ringing">
+ è¯æŽ¥åˆ°è™›æ“¬ä¸–界的語音功能中...
+ </string>
+ <string name="connected">
+ å·²è¯æŽ¥
+ </string>
+ <string name="unavailable">
+ 語音èŠå¤©åŠŸèƒ½æ–¼ä½ ç›®å‰æ‰€åœ¨çš„ä½ç½®ç„¡æ³•ä½¿ç”¨
+ </string>
+ <string name="hang_up">
+ 虛擬世界中的語音èŠå¤©ä¸­æ–·
+ </string>
+ <string name="reconnect_nearby">
+ ç¾åœ¨ä½ å°‡é‡æ–°è¯æŽ¥åˆ°é™„近的語音èŠå¤©
+ </string>
+ <string name="ScriptQuestionCautionChatGranted">
+ &apos;[OBJECTNAME]&apos;, an object owned by &apos;[OWNERNAME]&apos;, located in [REGIONNAME] at [REGIONPOS], has been granted permission to: [PERMISSIONS].
+ </string>
+ <string name="ScriptQuestionCautionChatDenied">
+ &apos;[OBJECTNAME]&apos;, an object owned by &apos;[OWNERNAME]&apos;, located in [REGIONNAME] at [REGIONPOS], has been denied permission to: [PERMISSIONS].
+ </string>
+ <string name="ScriptTakeMoney">
+ 由你身上拿走林登幣(L$)
+ </string>
+ <string name="ActOnControlInputs">
+ Act on your control inputs
+ </string>
+ <string name="RemapControlInputs">
+ Remap your control inputs
+ </string>
+ <string name="AnimateYourAvatar">
+ Animate your avatar
+ </string>
+ <string name="AttachToYourAvatar">
+ Attach to your avatar
+ </string>
+ <string name="ReleaseOwnership">
+ Release ownership and become public
+ </string>
+ <string name="LinkAndDelink">
+ Link and delink from other objects
+ </string>
+ <string name="AddAndRemoveJoints">
+ Add and remove joints with other objects
+ </string>
+ <string name="ChangePermissions">
+ 變更它的權é™
+ </string>
+ <string name="TrackYourCamera">
+ 追蹤你的æ”影機
+ </string>
+ <string name="ControlYourCamera">
+ 控制你的æ”影機
+ </string>
+ <string name="NotConnected">
+ 未è¯æŽ¥
+ </string>
+ <string name="SIM_ACCESS_PG">
+ 一般普級
+ </string>
+ <string name="SIM_ACCESS_MATURE">
+ é©åº¦æˆäºº
+ </string>
+ <string name="SIM_ACCESS_ADULT">
+ 完全æˆäºº
+ </string>
+ <string name="SIM_ACCESS_DOWN">
+ 離線
+ </string>
+ <string name="SIM_ACCESS_MIN">
+ 未知
+ </string>
+ <string name="land_type_unknown">
+ (未知)
+ </string>
+ <string name="Estate / Full Region">
+ 領地 / 完整地å€
+ </string>
+ <string name="Estate / Homestead">
+ 領地 / 家園
+ </string>
+ <string name="Mainland / Homestead">
+ 大陸 / 家園
+ </string>
+ <string name="Mainland / Full Region">
+ 大陸 / 完整地å€
+ </string>
+ <string name="all_files">
+ 全部檔案
+ </string>
+ <string name="sound_files">
+ è²éŸ³
+ </string>
+ <string name="animation_files">
+ 動作
+ </string>
+ <string name="image_files">
+ 圖åƒ
+ </string>
+ <string name="save_file_verb">
+ 儲存
+ </string>
+ <string name="load_file_verb">
+ 載入
+ </string>
+ <string name="targa_image_files">
+ Targa 圖åƒ
+ </string>
+ <string name="bitmap_image_files">
+ Bitmap 圖åƒ
+ </string>
+ <string name="avi_movie_file">
+ AVI 視頻檔案
+ </string>
+ <string name="xaf_animation_file">
+ XAF Anim File
+ </string>
+ <string name="xml_file">
+ XML 檔案
+ </string>
+ <string name="raw_file">
+ RAW 檔案
+ </string>
+ <string name="compressed_image_files">
+ 壓縮的圖åƒ
+ </string>
+ <string name="load_files">
+ 載入檔案
+ </string>
+ <string name="choose_the_directory">
+ é¸æ“‡ç›®éŒ„
+ </string>
+ <string name="AvatarSetNotAway">
+ éžé›¢é–‹
+ </string>
+ <string name="AvatarSetAway">
+ 離開
+ </string>
+ <string name="AvatarSetNotBusy">
+ éžå¿™ç¢Œ
+ </string>
+ <string name="AvatarSetBusy">
+ 忙碌
+ </string>
+ <string name="shape">
+ 體形
+ </string>
+ <string name="skin">
+ 皮膚
+ </string>
+ <string name="hair">
+ é ­é«®
+ </string>
+ <string name="eyes">
+ 眼ç›
+ </string>
+ <string name="shirt">
+ 襯衫
+ </string>
+ <string name="pants">
+ 褲å­
+ </string>
+ <string name="shoes">
+ éž‹å­
+ </string>
+ <string name="socks">
+ 襪å­
+ </string>
+ <string name="jacket">
+ 夾克
+ </string>
+ <string name="gloves">
+ 手套
+ </string>
+ <string name="undershirt">
+ 內衣
+ </string>
+ <string name="underpants">
+ 內褲
+ </string>
+ <string name="skirt">
+ 裙å­
+ </string>
+ <string name="alpha">
+ åŠé€æ˜Ž
+ </string>
+ <string name="tattoo">
+ 刺é’
+ </string>
+ <string name="physics">
+ 身體物ç†
+ </string>
+ <string name="invalid">
+ 無效
+ </string>
+ <string name="none">
+ ç„¡
+ </string>
+ <string name="shirt_not_worn">
+ 襯衫未穿
+ </string>
+ <string name="pants_not_worn">
+ 褲å­æœªç©¿
+ </string>
+ <string name="shoes_not_worn">
+ éž‹å­æœªç©¿
+ </string>
+ <string name="socks_not_worn">
+ 襪å­æœªç©¿
+ </string>
+ <string name="jacket_not_worn">
+ 夾克未穿
+ </string>
+ <string name="gloves_not_worn">
+ 手套未穿
+ </string>
+ <string name="undershirt_not_worn">
+ 內衣未穿
+ </string>
+ <string name="underpants_not_worn">
+ 內褲未穿
+ </string>
+ <string name="skirt_not_worn">
+ 裙å­æœªç©¿
+ </string>
+ <string name="alpha_not_worn">
+ åŠé€æ˜Žæœªç©¿
+ </string>
+ <string name="tattoo_not_worn">
+ 刺é’未穿
+ </string>
+ <string name="physics_not_worn">
+ 身體物ç†æœªç©¿
+ </string>
+ <string name="invalid_not_worn">
+ 無效
+ </string>
+ <string name="create_new_shape">
+ 創造新體形
+ </string>
+ <string name="create_new_skin">
+ 創造新皮膚
+ </string>
+ <string name="create_new_hair">
+ 創造新頭髮
+ </string>
+ <string name="create_new_eyes">
+ 創造新眼ç›
+ </string>
+ <string name="create_new_shirt">
+ 創造新襯衫
+ </string>
+ <string name="create_new_pants">
+ 創造新褲å­
+ </string>
+ <string name="create_new_shoes">
+ 創造新鞋å­
+ </string>
+ <string name="create_new_socks">
+ 創造新襪å­
+ </string>
+ <string name="create_new_jacket">
+ 創造新夾克
+ </string>
+ <string name="create_new_gloves">
+ 創造新手套
+ </string>
+ <string name="create_new_undershirt">
+ 創造新內衣
+ </string>
+ <string name="create_new_underpants">
+ 創造新內褲
+ </string>
+ <string name="create_new_skirt">
+ 創造新裙å­
+ </string>
+ <string name="create_new_alpha">
+ 創造新åŠé€æ˜Ž
+ </string>
+ <string name="create_new_tattoo">
+ 創造新刺é’
+ </string>
+ <string name="create_new_physics">
+ 創造新身體物ç†
+ </string>
+ <string name="create_new_invalid">
+ 無效
+ </string>
+ <string name="NewWearable">
+ æ–° [WEARABLE_ITEM]
+ </string>
+ <string name="next">
+ 下一個
+ </string>
+ <string name="ok">
+ 確定
+ </string>
+ <string name="GroupNotifyGroupNotice">
+ 群組通知
+ </string>
+ <string name="GroupNotifyGroupNotices">
+ 群組通知
+ </string>
+ <string name="GroupNotifySentBy">
+ é€å‡ºç”±
+ </string>
+ <string name="GroupNotifyAttached">
+ Attached:
+ </string>
+ <string name="GroupNotifyViewPastNotices">
+ View past notices or opt-out of receiving these messages here.
+ </string>
+ <string name="GroupNotifyOpenAttachment">
+ Open Attachment
+ </string>
+ <string name="GroupNotifySaveAttachment">
+ Save Attachment
+ </string>
+ <string name="TeleportOffer">
+ Teleport offering
+ </string>
+ <string name="StartUpNotifications">
+ 當你離開時有新的通知é€é”。
+ </string>
+ <string name="OverflowInfoChannelString">
+ 你有約 %d 通知
+ </string>
+ <string name="BodyPartsRightArm">
+ å³è‡‚
+ </string>
+ <string name="BodyPartsHead">
+ 頭部
+ </string>
+ <string name="BodyPartsLeftArm">
+ 左臂
+ </string>
+ <string name="BodyPartsLeftLeg">
+ 左腿
+ </string>
+ <string name="BodyPartsTorso">
+ 軀幹
+ </string>
+ <string name="BodyPartsRightLeg">
+ å³è…¿
+ </string>
+ <string name="GraphicsQualityLow">
+ 低
+ </string>
+ <string name="GraphicsQualityMid">
+ 中
+ </string>
+ <string name="GraphicsQualityHigh">
+ 高
+ </string>
+ <string name="LeaveMouselook">
+ 按下 ESC éµå›žå¾©åˆ°ä¸–界的視角
+ </string>
+ <string name="InventoryNoMatchingItems">
+ 沒有發ç¾ä½ æƒ³è¦æ‰¾çš„嗎?試試 [secondlife:///app/search/all/[SEARCH_TERM] æœå°‹]。
+ </string>
+ <string name="PlacesNoMatchingItems">
+ 沒有發ç¾ä½ æƒ³è¦æ‰¾çš„嗎?試試 [secondlife:///app/search/places/[SEARCH_TERM] æœå°‹]。
+ </string>
+ <string name="FavoritesNoMatchingItems">
+ Drag a landmark here to add it to your favorites.
+ </string>
+ <string name="InventoryNoTexture">
+ You do not have a copy of this texture in your inventory
+ </string>
+ <string name="no_transfer" value="(ç¦æ­¢è½‰è®“)"/>
+ <string name="no_modify" value="(ç¦æ­¢ä¿®æ”¹ï¼‰"/>
+ <string name="no_copy" value="(ç¦æ­¢è¤‡è£½ï¼‰"/>
+ <string name="worn" value="(已穿)"/>
+ <string name="link" value="(è¯çµï¼‰"/>
+ <string name="broken_link" value="(æ壞的è¯çµï¼‰"/>
+ <string name="LoadingContents">
+ 內容載入中...
+ </string>
+ <string name="NoContents">
+ 無內容
+ </string>
+ <string name="WornOnAttachmentPoint" value="(已穿 [ATTACHMENT_POINT])"/>
+ <string name="ActiveGesture" value="[GESLABEL] (active)"/>
+ <string name="PermYes">
+ 是
+ </string>
+ <string name="PermNo">
+ å¦
+ </string>
+ <string name="Chat Message" value="èŠå¤©ï¼š"/>
+ <string name="Sound" value="è²éŸ³ï¼š"/>
+ <string name="Wait" value="--- 等待:"/>
+ <string name="AnimFlagStop" value="åœæ­¢å‹•ä½œï¼š"/>
+ <string name="AnimFlagStart" value="開始動作:"/>
+ <string name="Wave" value="Wave"/>
+ <string name="GestureActionNone" value="ç„¡"/>
+ <string name="HelloAvatar" value="Hello, avatar!"/>
+ <string name="ViewAllGestures" value="察看全部 &gt;&gt;"/>
+ <string name="GetMoreGestures" value="å–得更多 &gt;&gt;"/>
+ <string name="Animations" value="動作,"/>
+ <string name="Calling Cards" value="å片,"/>
+ <string name="Clothing" value="æœè£,"/>
+ <string name="Gestures" value="姿勢,"/>
+ <string name="Landmarks" value="地標,"/>
+ <string name="Notecards" value="記事å¡,"/>
+ <string name="Objects" value="物件,"/>
+ <string name="Scripts" value="腳本,"/>
+ <string name="Sounds" value="è²éŸ³,"/>
+ <string name="Textures" value="æ質,"/>
+ <string name="Snapshots" value="å¿«ç…§,"/>
+ <string name="No Filters" value="No"/>
+ <string name="Since Logoff" value="- 自上次登出"/>
+ <string name="InvFolder My Inventory">
+ 我的收ç´å€
+ </string>
+ <string name="InvFolder My Favorites">
+ 我的最愛
+ </string>
+ <string name="InvFolder Library">
+ 資æºåº«
+ </string>
+ <string name="InvFolder Textures">
+ æ質
+ </string>
+ <string name="InvFolder Sounds">
+ è²éŸ³
+ </string>
+ <string name="InvFolder Calling Cards">
+ å片
+ </string>
+ <string name="InvFolder Landmarks">
+ 地標
+ </string>
+ <string name="InvFolder Scripts">
+ 腳本
+ </string>
+ <string name="InvFolder Clothing">
+ æœè£
+ </string>
+ <string name="InvFolder Objects">
+ 物件
+ </string>
+ <string name="InvFolder Notecards">
+ 記事å¡
+ </string>
+ <string name="InvFolder New Folder">
+ 新資料夾
+ </string>
+ <string name="InvFolder Inventory">
+ 收ç´å€
+ </string>
+ <string name="InvFolder Uncompressed Images">
+ Uncompressed Images
+ </string>
+ <string name="InvFolder Body Parts">
+ 身體部ä½
+ </string>
+ <string name="InvFolder Trash">
+ 垃圾桶
+ </string>
+ <string name="InvFolder Photo Album">
+ 相簿
+ </string>
+ <string name="InvFolder Lost And Found">
+ Lost And Found
+ </string>
+ <string name="InvFolder Uncompressed Sounds">
+ 無壓縮è²éŸ³
+ </string>
+ <string name="InvFolder Animations">
+ 動作
+ </string>
+ <string name="InvFolder Gestures">
+ 姿勢
+ </string>
+ <string name="InvFolder Favorite">
+ 我的最愛
+ </string>
+ <string name="InvFolder favorite">
+ 我的最愛
+ </string>
+ <string name="InvFolder Current Outfit">
+ ç›®å‰è£æ‰®
+ </string>
+ <string name="InvFolder Initial Outfits">
+ åˆå§‹è£æ‰®
+ </string>
+ <string name="InvFolder My Outfits">
+ 我的è£æ‰®
+ </string>
+ <string name="InvFolder Accessories">
+ é…件
+ </string>
+ <string name="InvFolder Friends">
+ 朋å‹
+ </string>
+ <string name="InvFolder All">
+ 全部
+ </string>
+ <string name="Buy">
+ 購買
+ </string>
+ <string name="BuyforL$">
+ Buy for L$
+ </string>
+ <string name="Stone">
+ 石頭
+ </string>
+ <string name="Metal">
+ 金屬
+ </string>
+ <string name="Glass">
+ 玻璃
+ </string>
+ <string name="Wood">
+ 木頭
+ </string>
+ <string name="Flesh">
+ 肌肉
+ </string>
+ <string name="Plastic">
+ 塑膠
+ </string>
+ <string name="Rubber">
+ 橡膠
+ </string>
+ <string name="Light">
+ Light
+ </string>
+ <string name="KBShift">
+ Shift
+ </string>
+ <string name="KBCtrl">
+ Ctrl
+ </string>
+ <string name="Chest">
+ 胸部
+ </string>
+ <string name="Skull">
+ 頭顱
+ </string>
+ <string name="Left Shoulder">
+ 左肩
+ </string>
+ <string name="Right Shoulder">
+ å³è‚©
+ </string>
+ <string name="Left Hand">
+ 左手
+ </string>
+ <string name="Right Hand">
+ å³æ‰‹
+ </string>
+ <string name="Left Foot">
+ 左腳
+ </string>
+ <string name="Right Foot">
+ å³è…³
+ </string>
+ <string name="Spine">
+ 脊椎
+ </string>
+ <string name="Pelvis">
+ 骨盆
+ </string>
+ <string name="Mouth">
+ 嘴
+ </string>
+ <string name="Chin">
+ 下巴
+ </string>
+ <string name="Left Ear">
+ 左耳
+ </string>
+ <string name="Right Ear">
+ å³è€³
+ </string>
+ <string name="Left Eyeball">
+ 左眼çƒ
+ </string>
+ <string name="Right Eyeball">
+ å³çœ¼çƒ
+ </string>
+ <string name="Nose">
+ é¼»å­
+ </string>
+ <string name="R Upper Arm">
+ å³ä¸Šè‡‚
+ </string>
+ <string name="R Forearm">
+ å³å‰è‡‚
+ </string>
+ <string name="L Upper Arm">
+ 左上臂
+ </string>
+ <string name="L Forearm">
+ å·¦å‰è‡‚
+ </string>
+ <string name="Right Hip">
+ å³è‡€
+ </string>
+ <string name="R Upper Leg">
+ å³å¤§è…¿
+ </string>
+ <string name="R Lower Leg">
+ å³å°è…¿
+ </string>
+ <string name="Left Hip">
+ 左臀
+ </string>
+ <string name="L Upper Leg">
+ 左大腿
+ </string>
+ <string name="L Lower Leg">
+ å·¦å°è…¿
+ </string>
+ <string name="Stomach">
+ 腹肌
+ </string>
+ <string name="Left Pec">
+ 左胸肌
+ </string>
+ <string name="Right Pec">
+ å³èƒ¸è‚Œ
+ </string>
+ <string name="Invalid Attachment">
+ 無效的附件è¯æŽ¥é»ž
+ </string>
+ <string name="YearsMonthsOld">
+ [AGEYEARS] [AGEMONTHS] old
+ </string>
+ <string name="YearsOld">
+ [AGEYEARS] old
+ </string>
+ <string name="MonthsOld">
+ [AGEMONTHS] old
+ </string>
+ <string name="WeeksOld">
+ [AGEWEEKS] old
+ </string>
+ <string name="DaysOld">
+ [AGEDAYS] old
+ </string>
+ <string name="TodayOld">
+ 今日剛加入
+ </string>
+ <string name="AgeYearsA">
+ [COUNT] å¹´
+ </string>
+ <string name="AgeYearsB">
+ [COUNT] å¹´
+ </string>
+ <string name="AgeYearsC">
+ [COUNT] å¹´
+ </string>
+ <string name="AgeMonthsA">
+ [COUNT] 月
+ </string>
+ <string name="AgeMonthsB">
+ [COUNT] 月
+ </string>
+ <string name="AgeMonthsC">
+ [COUNT] 月
+ </string>
+ <string name="AgeWeeksA">
+ [COUNT] 週
+ </string>
+ <string name="AgeWeeksB">
+ [COUNT] 週
+ </string>
+ <string name="AgeWeeksC">
+ [COUNT] 週
+ </string>
+ <string name="AgeDaysA">
+ [COUNT] 天
+ </string>
+ <string name="AgeDaysB">
+ [COUNT] 天
+ </string>
+ <string name="AgeDaysC">
+ [COUNT] 天
+ </string>
+ <string name="GroupMembersA">
+ [COUNT] æˆå“¡
+ </string>
+ <string name="GroupMembersB">
+ [COUNT] æˆå“¡
+ </string>
+ <string name="GroupMembersC">
+ [COUNT] æˆå“¡
+ </string>
+ <string name="AcctTypeResident">
+ å±…æ°‘
+ </string>
+ <string name="AcctTypeTrial">
+ Trial
+ </string>
+ <string name="AcctTypeCharterMember">
+ Charter Member
+ </string>
+ <string name="AcctTypeEmployee">
+ 林登實驗室員工
+ </string>
+ <string name="PaymentInfoUsed">
+ Payment Info Used
+ </string>
+ <string name="PaymentInfoOnFile">
+ Payment Info On File
+ </string>
+ <string name="NoPaymentInfoOnFile">
+ No Payment Info On File
+ </string>
+ <string name="AgeVerified">
+ 已年齡驗證
+ </string>
+ <string name="NotAgeVerified">
+ 未年齡驗證
+ </string>
+ <string name="Center 2">
+ 中央 2
+ </string>
+ <string name="Top Right">
+ å³ä¸Š
+ </string>
+ <string name="Top">
+ 上方
+ </string>
+ <string name="Top Left">
+ 左上
+ </string>
+ <string name="Center">
+ 中央
+ </string>
+ <string name="Bottom Left">
+ 左下
+ </string>
+ <string name="Bottom">
+ 下方
+ </string>
+ <string name="Bottom Right">
+ å³ä¸‹
+ </string>
+ <string name="CompileQueueDownloadedCompiling">
+ 已下載,ç¾åœ¨é€²è¡Œç·¨è­¯ä¸­
+ </string>
+ <string name="CompileQueueScriptNotFound">
+ 伺æœå™¨ä¸Šæœªç™¼ç¾è…³æœ¬ã€‚
+ </string>
+ <string name="CompileQueueProblemDownloading">
+ å•é¡Œä¸‹è¼‰ä¸­
+ </string>
+ <string name="CompileQueueInsufficientPermDownload">
+ Insufficient permissions to download a script.
+ </string>
+ <string name="CompileQueueInsufficientPermFor">
+ Insufficient permissions for
+ </string>
+ <string name="CompileQueueUnknownFailure">
+ Unknown failure to download
+ </string>
+ <string name="CompileQueueTitle">
+ é‡æ–°ç·¨è­¯é€²åº¦
+ </string>
+ <string name="CompileQueueStart">
+ é‡æ–°ç·¨è­¯
+ </string>
+ <string name="ResetQueueTitle">
+ é‡è¨­é€²åº¦
+ </string>
+ <string name="ResetQueueStart">
+ é‡è¨­
+ </string>
+ <string name="RunQueueTitle">
+ 設定執行中程åº
+ </string>
+ <string name="RunQueueStart">
+ 設為執行中
+ </string>
+ <string name="NotRunQueueTitle">
+ 設定éžåŸ·è¡Œä¸­ç¨‹åº
+ </string>
+ <string name="NotRunQueueStart">
+ 設為éžåŸ·è¡Œä¸­
+ </string>
+ <string name="CompileSuccessful">
+ 編譯æˆåŠŸ!!
+ </string>
+ <string name="CompileSuccessfulSaving">
+ 編譯æˆåŠŸï¼Œå„²å­˜ä¸­...
+ </string>
+ <string name="SaveComplete">
+ 儲存完畢。
+ </string>
+ <string name="ObjectOutOfRange">
+ 腳本(物件超出範åœï¼‰
+ </string>
+ <string name="GodToolsObjectOwnedBy">
+ 物件 [OBJECT] 為 [OWNER] 所æ“有
+ </string>
+ <string name="GroupsNone">
+ ç„¡
+ </string>
+ <string name="Group" value="(群組)"/>
+ <string name="Unknown">
+ (未知)
+ </string>
+ <string name="SummaryForTheWeek" value="Summary for this week, beginning on"/>
+ <string name="NextStipendDay" value="下一個發薪日為"/>
+ <string name="GroupIndividualShare" value="Group Individual Share"/>
+ <string name="GroupColumn" value="群組"/>
+ <string name="Balance">
+ Balance
+ </string>
+ <string name="Credits">
+ Credits
+ </string>
+ <string name="Debits">
+ Debits
+ </string>
+ <string name="Total">
+ Total
+ </string>
+ <string name="NoGroupDataFound">
+ 無群組資料發ç¾
+ </string>
+ <string name="IMParentEstate">
+ parent estate
+ </string>
+ <string name="IMMainland">
+ mainland
+ </string>
+ <string name="IMTeen">
+ teen
+ </string>
+ <string name="RegionInfoError">
+ error
+ </string>
+ <string name="RegionInfoAllEstatesOwnedBy">
+ [OWNER] 所æ“有的的全部領地
+ </string>
+ <string name="RegionInfoAllEstatesYouOwn">
+ 你所æ“有的全部領地
+ </string>
+ <string name="RegionInfoAllEstatesYouManage">
+ all estates that you manage for [OWNER]
+ </string>
+ <string name="RegionInfoAllowedResidents">
+ Allowed Residents: ([ALLOWEDAGENTS], max [MAXACCESS])
+ </string>
+ <string name="RegionInfoAllowedGroups">
+ å…許的群群組:([ALLOWEDGROUPS],最大 [MAXACCESS])
+ </string>
+ <string name="ScriptLimitsParcelScriptMemory">
+ 地段腳本記憶體
+ </string>
+ <string name="ScriptLimitsParcelsOwned">
+ 地段清單:[PARCELS]
+ </string>
+ <string name="ScriptLimitsMemoryUsed">
+ 計憶體用é‡ï¼šä½¿ç”¨ [MAX] kb 中的 [COUNT] kb ;剩餘 [AVAILABLE] kb å¯ç”¨
+ </string>
+ <string name="ScriptLimitsMemoryUsedSimple">
+ 記憶體用é‡ï¼š[COUNT] kb
+ </string>
+ <string name="ScriptLimitsParcelScriptURLs">
+ 地段腳本 URLs
+ </string>
+ <string name="ScriptLimitsURLsUsed">
+ URLs used: [COUNT] out of [MAX]; [AVAILABLE] available
+ </string>
+ <string name="ScriptLimitsURLsUsedSimple">
+ URLs used: [COUNT]
+ </string>
+ <string name="ScriptLimitsRequestError">
+ Error requesting information
+ </string>
+ <string name="ScriptLimitsRequestNoParcelSelected">
+ 無地段被é¸æ“‡
+ </string>
+ <string name="ScriptLimitsRequestWrongRegion">
+ Error: script information is only available in your current region
+ </string>
+ <string name="ScriptLimitsRequestWaiting">
+ Retrieving information...
+ </string>
+ <string name="ScriptLimitsRequestDontOwnParcel">
+ You do not have permission to examine this parcel
+ </string>
+ <string name="SITTING_ON">
+ å在
+ </string>
+ <string name="ATTACH_CHEST">
+ 胸部
+ </string>
+ <string name="ATTACH_HEAD">
+ 頭部
+ </string>
+ <string name="ATTACH_LSHOULDER">
+ 左肩
+ </string>
+ <string name="ATTACH_RSHOULDER">
+ å³è‚©
+ </string>
+ <string name="ATTACH_LHAND">
+ 左手
+ </string>
+ <string name="ATTACH_RHAND">
+ å³æ‰‹
+ </string>
+ <string name="ATTACH_LFOOT">
+ 左腳
+ </string>
+ <string name="ATTACH_RFOOT">
+ å³è…³
+ </string>
+ <string name="ATTACH_BACK">
+ 背部
+ </string>
+ <string name="ATTACH_PELVIS">
+ 骨盆
+ </string>
+ <string name="ATTACH_MOUTH">
+ 嘴巴
+ </string>
+ <string name="ATTACH_CHIN">
+ 下巴
+ </string>
+ <string name="ATTACH_LEAR">
+ 左耳
+ </string>
+ <string name="ATTACH_REAR">
+ å³è€³
+ </string>
+ <string name="ATTACH_LEYE">
+ 左眼
+ </string>
+ <string name="ATTACH_REYE">
+ å³çœ¼
+ </string>
+ <string name="ATTACH_NOSE">
+ é¼»å­
+ </string>
+ <string name="ATTACH_RUARM">
+ å³ä¸Šè‡‚
+ </string>
+ <string name="ATTACH_RLARM">
+ å³å‰è‡‚
+ </string>
+ <string name="ATTACH_LUARM">
+ 左上臂
+ </string>
+ <string name="ATTACH_LLARM">
+ å·¦å‰è‡‚
+ </string>
+ <string name="ATTACH_RHIP">
+ å³è‡€
+ </string>
+ <string name="ATTACH_RULEG">
+ å³å¤§è…¿
+ </string>
+ <string name="ATTACH_RLLEG">
+ å³å°è…¿
+ </string>
+ <string name="ATTACH_LHIP">
+ 左臀
+ </string>
+ <string name="ATTACH_LULEG">
+ 左大腿
+ </string>
+ <string name="ATTACH_LLLEG">
+ å·¦å°è…¿
+ </string>
+ <string name="ATTACH_BELLY">
+ 腹部
+ </string>
+ <string name="ATTACH_RPEC">
+ å³èƒ¸è‚Œ
+ </string>
+ <string name="ATTACH_LPEC">
+ 左胸肌
+ </string>
+ <string name="ATTACH_HUD_CENTER_2">
+ HUD Center 2
+ </string>
+ <string name="ATTACH_HUD_TOP_RIGHT">
+ HUD Top Right
+ </string>
+ <string name="ATTACH_HUD_TOP_CENTER">
+ HUD Top Center
+ </string>
+ <string name="ATTACH_HUD_TOP_LEFT">
+ HUD Top Left
+ </string>
+ <string name="ATTACH_HUD_CENTER_1">
+ HUD Center 1
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_LEFT">
+ HUD Bottom Left
+ </string>
+ <string name="ATTACH_HUD_BOTTOM">
+ HUD Bottom
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_RIGHT">
+ HUD Bottom Right
+ </string>
+ <string name="CursorPos">
+ Line [LINE], Column [COLUMN]
+ </string>
+ <string name="PanelDirCountFound">
+ [COUNT] found
+ </string>
+ <string name="PanelDirTimeStr">
+ [hour12,datetime,slt]:[min,datetime,slt] [ampm,datetime,slt]
+ </string>
+ <string name="PanelDirEventsDateText">
+ [mthnum,datetime,slt]/[day,datetime,slt]
+ </string>
+ <string name="PanelContentsTooltip">
+ 物件的內容
+ </string>
+ <string name="PanelContentsNewScript">
+ 新腳本
+ </string>
+ <string name="BusyModeResponseDefault">
+ 你傳é€è¨Šæ¯çš„å±…æ°‘ç›®å‰è™•æ–¼å¿™ç¢Œæ¨¡å¼ä¸­ï¼Œé€™æ„味著他è¦æ±‚ä¸è¢«æ‰“擾。你所傳的訊æ¯ä»å°‡æœƒç•™å­˜ä¸¦é¡¯ç¤ºæ–¼ IM é¢æ¿ä¸Šä¾›ä»–ç¨å¾Œæ™‚查閱。
+ </string>
+ <string name="MuteByName">
+ (由å稱)
+ </string>
+ <string name="MuteAgent">
+ (居民)
+ </string>
+ <string name="MuteObject">
+ (物件)
+ </string>
+ <string name="MuteGroup">
+ (群組)
+ </string>
+ <string name="MuteExternal">
+ (外部)
+ </string>
+ <string name="RegionNoCovenant">
+ 此領地未æ供任何契約è¦æ±‚。
+ </string>
+ <string name="RegionNoCovenantOtherOwner">
+ There is no Covenant provided for this Estate. The land on this estate is being sold by the Estate owner, not Linden Lab. Please contact the Estate Owner for sales details.
+ </string>
+ <string name="covenant_last_modified" value="最後修改於:"/>
+ <string name="none_text" value="(無)"/>
+ <string name="never_text" value="(絕ä¸ï¼‰"/>
+ <string name="GroupOwned">
+ 群組所æ“有
+ </string>
+ <string name="Public">
+ 公開
+ </string>
+ <string name="ClassifiedClicksTxt">
+ Clicks: [TELEPORT] teleport, [MAP] map, [PROFILE] profile
+ </string>
+ <string name="ClassifiedUpdateAfterPublish">
+ (將於發布後自動更新)
+ </string>
+ <string name="NoPicksClassifiedsText">
+ You haven&apos;t created any Picks or Classifieds. Click the Plus button below to create a Pick or Classified.
+ </string>
+ <string name="NoAvatarPicksClassifiedsText">
+ 使用者無精é¸åœ°é»žæˆ–個人廣告
+ </string>
+ <string name="PicksClassifiedsLoadingText">
+ 載入中...
+ </string>
+ <string name="MultiPreviewTitle">
+ é è¦½
+ </string>
+ <string name="MultiPropertiesTitle">
+ 屬性
+ </string>
+ <string name="InvOfferAnObjectNamed">
+ An object named
+ </string>
+ <string name="InvOfferOwnedByGroup">
+ 群組所æ“有
+ </string>
+ <string name="InvOfferOwnedByUnknownGroup">
+ 由一個未知的群組所æ“有
+ </string>
+ <string name="InvOfferOwnedBy">
+ owned by
+ </string>
+ <string name="InvOfferOwnedByUnknownUser">
+ owned by an unknown user
+ </string>
+ <string name="InvOfferGaveYou">
+ gave you
+ </string>
+ <string name="InvOfferDecline">
+ You decline [DESC] from &lt;nolink&gt;[NAME]&lt;/nolink&gt;.
+ </string>
+ <string name="GroupMoneyTotal">
+ Total
+ </string>
+ <string name="GroupMoneyBought">
+ bought
+ </string>
+ <string name="GroupMoneyPaidYou">
+ paid you
+ </string>
+ <string name="GroupMoneyPaidInto">
+ paid into
+ </string>
+ <string name="GroupMoneyBoughtPassTo">
+ bought pass to
+ </string>
+ <string name="GroupMoneyPaidFeeForEvent">
+ paid fee for event
+ </string>
+ <string name="GroupMoneyPaidPrizeForEvent">
+ paid prize for event
+ </string>
+ <string name="GroupMoneyBalance">
+ Balance
+ </string>
+ <string name="GroupMoneyCredits">
+ Credits
+ </string>
+ <string name="GroupMoneyDebits">
+ Debits
+ </string>
+ <string name="ViewerObjectContents">
+ Contents
+ </string>
+ <string name="AcquiredItems">
+ Acquired Items
+ </string>
+ <string name="Cancel">
+ å–消
+ </string>
+ <string name="UploadingCosts">
+ 花費 L$ [AMOUNT] 上傳 [NAME]
+ </string>
+ <string name="BuyingCosts">
+ 花費 L$ [AMOUNT] 購買這個
+ </string>
+ <string name="UnknownFileExtension">
+ 未知的副檔å .%s
+é æœŸç‚º .wav, .tga, .bmp, .jpg, .jpeg, or .bvh 類型
+ </string>
+ <string name="MuteObject2">
+ Block
+ </string>
+ <string name="MuteAvatar">
+ Block
+ </string>
+ <string name="UnmuteObject">
+ Unblock
+ </string>
+ <string name="UnmuteAvatar">
+ Unblock
+ </string>
+ <string name="AddLandmarkNavBarMenu">
+ 添加到我的地標...
+ </string>
+ <string name="EditLandmarkNavBarMenu">
+ 編輯我的地標...
+ </string>
+ <string name="accel-mac-control">
+ ⌃
+ </string>
+ <string name="accel-mac-command">
+ ⌘
+ </string>
+ <string name="accel-mac-option">
+ ⌥
+ </string>
+ <string name="accel-mac-shift">
+ ⇧
+ </string>
+ <string name="accel-win-control">
+ Ctrl+
+ </string>
+ <string name="accel-win-alt">
+ Alt+
+ </string>
+ <string name="accel-win-shift">
+ Shift+
+ </string>
+ <string name="FileSaved">
+ 檔案已儲存
+ </string>
+ <string name="Receiving">
+ 接收中
+ </string>
+ <string name="AM">
+ AM
+ </string>
+ <string name="PM">
+ PM
+ </string>
+ <string name="PST">
+ PST
+ </string>
+ <string name="PDT">
+ PDT
+ </string>
+ <string name="Direction_Forward">
+ å‘å‰
+ </string>
+ <string name="Direction_Left">
+ å‘å·¦
+ </string>
+ <string name="Direction_Right">
+ å‘å³
+ </string>
+ <string name="Direction_Back">
+ å‘後
+ </string>
+ <string name="Direction_North">
+ 北
+ </string>
+ <string name="Direction_South">
+ å—
+ </string>
+ <string name="Direction_West">
+ 西
+ </string>
+ <string name="Direction_East">
+ æ±
+ </string>
+ <string name="Direction_Up">
+ å‘上
+ </string>
+ <string name="Direction_Down">
+ å‘下
+ </string>
+ <string name="Any Category">
+ 任何類別
+ </string>
+ <string name="Shopping">
+ 採購
+ </string>
+ <string name="Land Rental">
+ Land Rental
+ </string>
+ <string name="Property Rental">
+ Property Rental
+ </string>
+ <string name="Special Attraction">
+ Special Attraction
+ </string>
+ <string name="New Products">
+ New Products
+ </string>
+ <string name="Employment">
+ Employment
+ </string>
+ <string name="Wanted">
+ Wanted
+ </string>
+ <string name="Service">
+ Service
+ </string>
+ <string name="Personal">
+ Personal
+ </string>
+ <string name="None">
+ ç„¡
+ </string>
+ <string name="Linden Location">
+ Linden Location
+ </string>
+ <string name="Adult">
+ 完全æˆäºº
+ </string>
+ <string name="Arts&amp;Culture">
+ è—術與文化
+ </string>
+ <string name="Business">
+ 商業
+ </string>
+ <string name="Educational">
+ 教育
+ </string>
+ <string name="Gaming">
+ éŠæˆ²
+ </string>
+ <string name="Hangout">
+ èšæœƒæ‰€
+ </string>
+ <string name="Newcomer Friendly">
+ 新手å‹å–„
+ </string>
+ <string name="Parks&amp;Nature">
+ 公園與自然
+ </string>
+ <string name="Residential">
+ ä½å®…
+ </string>
+ <string name="Stage">
+ Stage
+ </string>
+ <string name="Other">
+ Other
+ </string>
+ <string name="Rental">
+ Rental
+ </string>
+ <string name="Any">
+ Any
+ </string>
+ <string name="You">
+ ä½ 
+ </string>
+ <string name=":">
+ :
+ </string>
+ <string name=",">
+ ,
+ </string>
+ <string name="...">
+ ...
+ </string>
+ <string name="***">
+ ***
+ </string>
+ <string name="(">
+ (
+ </string>
+ <string name=")">
+ )
+ </string>
+ <string name=".">
+ .
+ </string>
+ <string name="&apos;">
+ &apos;
+ </string>
+ <string name="---">
+ ---
+ </string>
+ <string name="Multiple Media">
+ 多媒體
+ </string>
+ <string name="Play Media">
+ 播放ï¼æš«åœ 媒體
+ </string>
+ <string name="MBCmdLineError">
+ 解æžå‘½ä»¤åˆ—時發ç¾éŒ¯èª¤ã€‚
+è«‹åƒé–±ï¼š http://wiki.secondlife.com/wiki/Client_parameters
+錯誤:
+ </string>
+ <string name="MBCmdLineUsg">
+ [APP_NAME] 命令列用法:
+ </string>
+ <string name="MBUnableToAccessFile">
+ [APP_NAME] 無法存å–它所需è¦çš„檔案。
+
+This can be because you somehow have multiple copies running, or your system incorrectly thinks a file is open.
+If this message persists, restart your computer and try again.
+If it continues to persist, you may need to completely uninstall [APP_NAME] and reinstall it.
+ </string>
+ <string name="MBFatalError">
+ 致命錯誤
+ </string>
+ <string name="MBRequiresAltiVec">
+ [APP_NAME] requires a processor with AltiVec (G4 or later).
+ </string>
+ <string name="MBAlreadyRunning">
+ [APP_NAME] 已經在執行中。
+請檢查你的工作列裡是å¦æœ‰å…¶ä»–最å°åŒ–的相åŒç¨‹å¼ã€‚
+如果這個訊æ¯æŒçºŒå‡ºç¾ï¼Œè«‹é‡æ–°å•Ÿå‹•ä½ çš„電腦。
+ </string>
+ <string name="MBFrozenCrashed">
+ [APP_NAME] appears to have frozen or crashed on the previous run.
+Would you like to send a crash report?
+ </string>
+ <string name="MBAlert">
+ 通知
+ </string>
+ <string name="MBNoDirectX">
+ [APP_NAME] is unable to detect DirectX 9.0b or greater.
+[APP_NAME] uses DirectX to detect hardware and/or outdated drivers that can cause stability problems, poor performance and crashes. While you can run [APP_NAME] without it, we highly recommend running with DirectX 9.0b.
+
+Do you wish to continue?
+ </string>
+ <string name="MBWarning">
+ 警告
+ </string>
+ <string name="MBNoAutoUpdate">
+ Automatic updating is not yet implemented for Linux.
+Please download the latest version from www.secondlife.com.
+ </string>
+ <string name="MBRegClassFailed">
+ RegisterClass failed
+ </string>
+ <string name="MBError">
+ 錯誤
+ </string>
+ <string name="MBFullScreenErr">
+ 無法執行全螢幕於 [WIDTH] x [HEIGHT].
+執行於視窗中。
+ </string>
+ <string name="MBDestroyWinFailed">
+ Shutdown Error while destroying window (DestroyWindow() failed)
+ </string>
+ <string name="MBShutdownErr">
+ Shutdown Error
+ </string>
+ <string name="MBDevContextErr">
+ Can&apos;t make GL device context
+ </string>
+ <string name="MBPixelFmtErr">
+ Can&apos;t find suitable pixel format
+ </string>
+ <string name="MBPixelFmtDescErr">
+ Can&apos;t get pixel format description
+ </string>
+ <string name="MBTrueColorWindow">
+ [APP_NAME] requires True Color (32-bit) to run.
+Please go to your computer&apos;s display settings and set the color mode to 32-bit.
+ </string>
+ <string name="MBAlpha">
+ [APP_NAME] is unable to run because it can&apos;t get an 8 bit alpha channel. Usually this is due to video card driver issues.
+Please make sure you have the latest video card drivers installed.
+Also be sure your monitor is set to True Color (32-bit) in Control Panels &gt; Display &gt; Settings.
+If you continue to receive this message, contact the [SUPPORT_SITE].
+ </string>
+ <string name="MBPixelFmtSetErr">
+ 無法設定åƒç´ æ ¼å¼
+ </string>
+ <string name="MBGLContextErr">
+ Can&apos;t create GL rendering context
+ </string>
+ <string name="MBGLContextActErr">
+ Can&apos;t activate GL rendering context
+ </string>
+ <string name="MBVideoDrvErr">
+ [APP_NAME] is unable to run because your video card drivers did not install properly, are out of date, or are for unsupported hardware. Please make sure you have the latest video card drivers and even if you do have the latest, try reinstalling them.
+
+If you continue to receive this message, contact the [SUPPORT_SITE].
+ </string>
+ <string name="5 O&apos;Clock Shadow">
+ 5 O&apos;Clock Shadow
+ </string>
+ <string name="All White">
+ 全白
+ </string>
+ <string name="Anime Eyes">
+ Anime Eyes
+ </string>
+ <string name="Arced">
+ Arced
+ </string>
+ <string name="Arm Length">
+ Arm Length
+ </string>
+ <string name="Attached">
+ Attached
+ </string>
+ <string name="Attached Earlobes">
+ Attached Earlobes
+ </string>
+ <string name="Back Fringe">
+ Back Fringe
+ </string>
+ <string name="Baggy">
+ Baggy
+ </string>
+ <string name="Bangs">
+ Bangs
+ </string>
+ <string name="Beady Eyes">
+ Beady Eyes
+ </string>
+ <string name="Belly Size">
+ Belly Size
+ </string>
+ <string name="Big">
+ Big
+ </string>
+ <string name="Big Butt">
+ Big Butt
+ </string>
+ <string name="Big Hair Back">
+ Big Hair: Back
+ </string>
+ <string name="Big Hair Front">
+ Big Hair: Front
+ </string>
+ <string name="Big Hair Top">
+ Big Hair: Top
+ </string>
+ <string name="Big Head">
+ Big Head
+ </string>
+ <string name="Big Pectorals">
+ Big Pectorals
+ </string>
+ <string name="Big Spikes">
+ Big Spikes
+ </string>
+ <string name="Black">
+ Black
+ </string>
+ <string name="Blonde">
+ Blonde
+ </string>
+ <string name="Blonde Hair">
+ Blonde Hair
+ </string>
+ <string name="Blush">
+ Blush
+ </string>
+ <string name="Blush Color">
+ Blush Color
+ </string>
+ <string name="Blush Opacity">
+ Blush Opacity
+ </string>
+ <string name="Body Definition">
+ Body Definition
+ </string>
+ <string name="Body Fat">
+ Body Fat
+ </string>
+ <string name="Body Freckles">
+ Body Freckles
+ </string>
+ <string name="Body Thick">
+ Body Thick
+ </string>
+ <string name="Body Thickness">
+ Body Thickness
+ </string>
+ <string name="Body Thin">
+ Body Thin
+ </string>
+ <string name="Bow Legged">
+ Bow Legged
+ </string>
+ <string name="Breast Buoyancy">
+ Breast Buoyancy
+ </string>
+ <string name="Breast Cleavage">
+ Breast Cleavage
+ </string>
+ <string name="Breast Size">
+ Breast Size
+ </string>
+ <string name="Bridge Width">
+ Bridge Width
+ </string>
+ <string name="Broad">
+ Broad
+ </string>
+ <string name="Brow Size">
+ Brow Size
+ </string>
+ <string name="Bug Eyes">
+ Bug Eyes
+ </string>
+ <string name="Bugged Eyes">
+ Bugged Eyes
+ </string>
+ <string name="Bulbous">
+ Bulbous
+ </string>
+ <string name="Bulbous Nose">
+ Bulbous Nose
+ </string>
+ <string name="Breast Physics Mass">
+ Breast Mass
+ </string>
+ <string name="Breast Physics Smoothing">
+ Breast Smoothing
+ </string>
+ <string name="Breast Physics Gravity">
+ Breast Gravity
+ </string>
+ <string name="Breast Physics Drag">
+ Breast Drag
+ </string>
+ <string name="Breast Physics InOut Max Effect">
+ Max Effect
+ </string>
+ <string name="Breast Physics InOut Spring">
+ Spring
+ </string>
+ <string name="Breast Physics InOut Gain">
+ Gain
+ </string>
+ <string name="Breast Physics InOut Damping">
+ Damping
+ </string>
+ <string name="Breast Physics UpDown Max Effect">
+ Max Effect
+ </string>
+ <string name="Breast Physics UpDown Spring">
+ Spring
+ </string>
+ <string name="Breast Physics UpDown Gain">
+ Gain
+ </string>
+ <string name="Breast Physics UpDown Damping">
+ Damping
+ </string>
+ <string name="Breast Physics LeftRight Max Effect">
+ Max Effect
+ </string>
+ <string name="Breast Physics LeftRight Spring">
+ Spring
+ </string>
+ <string name="Breast Physics LeftRight Gain">
+ Gain
+ </string>
+ <string name="Breast Physics LeftRight Damping">
+ Damping
+ </string>
+ <string name="Belly Physics Mass">
+ Belly Mass
+ </string>
+ <string name="Belly Physics Smoothing">
+ Belly Smoothing
+ </string>
+ <string name="Belly Physics Gravity">
+ Belly Gravity
+ </string>
+ <string name="Belly Physics Drag">
+ Belly Drag
+ </string>
+ <string name="Belly Physics UpDown Max Effect">
+ Max Effect
+ </string>
+ <string name="Belly Physics UpDown Spring">
+ Spring
+ </string>
+ <string name="Belly Physics UpDown Gain">
+ Gain
+ </string>
+ <string name="Belly Physics UpDown Damping">
+ Damping
+ </string>
+ <string name="Butt Physics Mass">
+ Butt Mass
+ </string>
+ <string name="Butt Physics Smoothing">
+ Butt Smoothing
+ </string>
+ <string name="Butt Physics Gravity">
+ Butt Gravity
+ </string>
+ <string name="Butt Physics Drag">
+ Butt Drag
+ </string>
+ <string name="Butt Physics UpDown Max Effect">
+ Max Effect
+ </string>
+ <string name="Butt Physics UpDown Spring">
+ Spring
+ </string>
+ <string name="Butt Physics UpDown Gain">
+ Gain
+ </string>
+ <string name="Butt Physics UpDown Damping">
+ Damping
+ </string>
+ <string name="Butt Physics LeftRight Max Effect">
+ Max Effect
+ </string>
+ <string name="Butt Physics LeftRight Spring">
+ Spring
+ </string>
+ <string name="Butt Physics LeftRight Gain">
+ Gain
+ </string>
+ <string name="Butt Physics LeftRight Damping">
+ Damping
+ </string>
+ <string name="Bushy Eyebrows">
+ Bushy Eyebrows
+ </string>
+ <string name="Bushy Hair">
+ Bushy Hair
+ </string>
+ <string name="Butt Size">
+ Butt Size
+ </string>
+ <string name="Butt Gravity">
+ Butt Gravity
+ </string>
+ <string name="bustle skirt">
+ Bustle Skirt
+ </string>
+ <string name="no bustle">
+ No Bustle
+ </string>
+ <string name="more bustle">
+ More Bustle
+ </string>
+ <string name="Chaplin">
+ Chaplin
+ </string>
+ <string name="Cheek Bones">
+ Cheek Bones
+ </string>
+ <string name="Chest Size">
+ Chest Size
+ </string>
+ <string name="Chin Angle">
+ 下巴角度
+ </string>
+ <string name="Chin Cleft">
+ Chin Cleft
+ </string>
+ <string name="Chin Curtains">
+ Chin Curtains
+ </string>
+ <string name="Chin Depth">
+ Chin Depth
+ </string>
+ <string name="Chin Heavy">
+ Chin Heavy
+ </string>
+ <string name="Chin In">
+ Chin In
+ </string>
+ <string name="Chin Out">
+ Chin Out
+ </string>
+ <string name="Chin-Neck">
+ Chin-Neck
+ </string>
+ <string name="Clear">
+ 清除
+ </string>
+ <string name="Cleft">
+ Cleft
+ </string>
+ <string name="Close Set Eyes">
+ Close Set Eyes
+ </string>
+ <string name="Closed">
+ Closed
+ </string>
+ <string name="Closed Back">
+ Closed Back
+ </string>
+ <string name="Closed Front">
+ Closed Front
+ </string>
+ <string name="Closed Left">
+ Closed Left
+ </string>
+ <string name="Closed Right">
+ Closed Right
+ </string>
+ <string name="Coin Purse">
+ Coin Purse
+ </string>
+ <string name="Collar Back">
+ Collar Back
+ </string>
+ <string name="Collar Front">
+ Collar Front
+ </string>
+ <string name="Corner Down">
+ Corner Down
+ </string>
+ <string name="Corner Up">
+ Corner Up
+ </string>
+ <string name="Creased">
+ Creased
+ </string>
+ <string name="Crooked Nose">
+ Crooked Nose
+ </string>
+ <string name="Cuff Flare">
+ Cuff Flare
+ </string>
+ <string name="Dark">
+ Dark
+ </string>
+ <string name="Dark Green">
+ Dark Green
+ </string>
+ <string name="Darker">
+ Darker
+ </string>
+ <string name="Deep">
+ Deep
+ </string>
+ <string name="Default Heels">
+ Default Heels
+ </string>
+ <string name="Dense">
+ Dense
+ </string>
+ <string name="Double Chin">
+ Double Chin
+ </string>
+ <string name="Downturned">
+ Downturned
+ </string>
+ <string name="Duffle Bag">
+ Duffle Bag
+ </string>
+ <string name="Ear Angle">
+ Ear Angle
+ </string>
+ <string name="Ear Size">
+ Ear Size
+ </string>
+ <string name="Ear Tips">
+ Ear Tips
+ </string>
+ <string name="Egg Head">
+ Egg Head
+ </string>
+ <string name="Eye Bags">
+ Eye Bags
+ </string>
+ <string name="Eye Color">
+ Eye Color
+ </string>
+ <string name="Eye Depth">
+ Eye Depth
+ </string>
+ <string name="Eye Lightness">
+ Eye Lightness
+ </string>
+ <string name="Eye Opening">
+ Eye Opening
+ </string>
+ <string name="Eye Pop">
+ Eye Pop
+ </string>
+ <string name="Eye Size">
+ Eye Size
+ </string>
+ <string name="Eye Spacing">
+ Eye Spacing
+ </string>
+ <string name="Eyebrow Arc">
+ Eyebrow Arc
+ </string>
+ <string name="Eyebrow Density">
+ Eyebrow Density
+ </string>
+ <string name="Eyebrow Height">
+ Eyebrow Height
+ </string>
+ <string name="Eyebrow Points">
+ Eyebrow Points
+ </string>
+ <string name="Eyebrow Size">
+ Eyebrow Size
+ </string>
+ <string name="Eyelash Length">
+ Eyelash Length
+ </string>
+ <string name="Eyeliner">
+ Eyeliner
+ </string>
+ <string name="Eyeliner Color">
+ Eyeliner Color
+ </string>
+ <string name="Eyes Bugged">
+ Eyes Bugged
+ </string>
+ <string name="Face Shear">
+ Face Shear
+ </string>
+ <string name="Facial Definition">
+ Facial Definition
+ </string>
+ <string name="Far Set Eyes">
+ Far Set Eyes
+ </string>
+ <string name="Fat Lips">
+ Fat Lips
+ </string>
+ <string name="Female">
+ Female
+ </string>
+ <string name="Fingerless">
+ Fingerless
+ </string>
+ <string name="Fingers">
+ Fingers
+ </string>
+ <string name="Flared Cuffs">
+ Flared Cuffs
+ </string>
+ <string name="Flat">
+ Flat
+ </string>
+ <string name="Flat Butt">
+ Flat Butt
+ </string>
+ <string name="Flat Head">
+ Flat Head
+ </string>
+ <string name="Flat Toe">
+ Flat Toe
+ </string>
+ <string name="Foot Size">
+ Foot Size
+ </string>
+ <string name="Forehead Angle">
+ Forehead Angle
+ </string>
+ <string name="Forehead Heavy">
+ Forehead Heavy
+ </string>
+ <string name="Freckles">
+ Freckles
+ </string>
+ <string name="Front Fringe">
+ Front Fringe
+ </string>
+ <string name="Full Back">
+ Full Back
+ </string>
+ <string name="Full Eyeliner">
+ Full Eyeliner
+ </string>
+ <string name="Full Front">
+ Full Front
+ </string>
+ <string name="Full Hair Sides">
+ Full Hair Sides
+ </string>
+ <string name="Full Sides">
+ Full Sides
+ </string>
+ <string name="Glossy">
+ Glossy
+ </string>
+ <string name="Glove Fingers">
+ Glove Fingers
+ </string>
+ <string name="Glove Length">
+ Glove Length
+ </string>
+ <string name="Hair">
+ é ­é«®
+ </string>
+ <string name="Hair Back">
+ Hair: Back
+ </string>
+ <string name="Hair Front">
+ Hair: Front
+ </string>
+ <string name="Hair Sides">
+ Hair: Sides
+ </string>
+ <string name="Hair Sweep">
+ Hair Sweep
+ </string>
+ <string name="Hair Thickess">
+ Hair Thickness
+ </string>
+ <string name="Hair Thickness">
+ Hair Thickness
+ </string>
+ <string name="Hair Tilt">
+ Hair Tilt
+ </string>
+ <string name="Hair Tilted Left">
+ Hair Tilted Left
+ </string>
+ <string name="Hair Tilted Right">
+ Hair Tilted Right
+ </string>
+ <string name="Hair Volume">
+ Hair: Volume
+ </string>
+ <string name="Hand Size">
+ Hand Size
+ </string>
+ <string name="Handlebars">
+ Handlebars
+ </string>
+ <string name="Head Length">
+ Head Length
+ </string>
+ <string name="Head Shape">
+ Head Shape
+ </string>
+ <string name="Head Size">
+ Head Size
+ </string>
+ <string name="Head Stretch">
+ Head Stretch
+ </string>
+ <string name="Heel Height">
+ Heel Height
+ </string>
+ <string name="Heel Shape">
+ Heel Shape
+ </string>
+ <string name="Height">
+ Height
+ </string>
+ <string name="High">
+ High
+ </string>
+ <string name="High Heels">
+ High Heels
+ </string>
+ <string name="High Jaw">
+ High Jaw
+ </string>
+ <string name="High Platforms">
+ High Platforms
+ </string>
+ <string name="High and Tight">
+ High and Tight
+ </string>
+ <string name="Higher">
+ Higher
+ </string>
+ <string name="Hip Length">
+ Hip Length
+ </string>
+ <string name="Hip Width">
+ Hip Width
+ </string>
+ <string name="In">
+ In
+ </string>
+ <string name="In Shdw Color">
+ Inner Shadow Color
+ </string>
+ <string name="In Shdw Opacity">
+ Inner Shadow Opacity
+ </string>
+ <string name="Inner Eye Corner">
+ Inner Eye Corner
+ </string>
+ <string name="Inner Eye Shadow">
+ Inner Eye Shadow
+ </string>
+ <string name="Inner Shadow">
+ Inner Shadow
+ </string>
+ <string name="Jacket Length">
+ Jacket Length
+ </string>
+ <string name="Jacket Wrinkles">
+ Jacket Wrinkles
+ </string>
+ <string name="Jaw Angle">
+ Jaw Angle
+ </string>
+ <string name="Jaw Jut">
+ Jaw Jut
+ </string>
+ <string name="Jaw Shape">
+ Jaw Shape
+ </string>
+ <string name="Join">
+ Join
+ </string>
+ <string name="Jowls">
+ Jowls
+ </string>
+ <string name="Knee Angle">
+ Knee Angle
+ </string>
+ <string name="Knock Kneed">
+ Knock Kneed
+ </string>
+ <string name="Large">
+ Large
+ </string>
+ <string name="Large Hands">
+ Large Hands
+ </string>
+ <string name="Left Part">
+ Left Part
+ </string>
+ <string name="Leg Length">
+ Leg Length
+ </string>
+ <string name="Leg Muscles">
+ Leg Muscles
+ </string>
+ <string name="Less">
+ Less
+ </string>
+ <string name="Less Body Fat">
+ Less Body Fat
+ </string>
+ <string name="Less Curtains">
+ Less Curtains
+ </string>
+ <string name="Less Freckles">
+ Less Freckles
+ </string>
+ <string name="Less Full">
+ Less Full
+ </string>
+ <string name="Less Gravity">
+ Less Gravity
+ </string>
+ <string name="Less Love">
+ Less Love
+ </string>
+ <string name="Less Muscles">
+ Less Muscles
+ </string>
+ <string name="Less Muscular">
+ Less Muscular
+ </string>
+ <string name="Less Rosy">
+ Less Rosy
+ </string>
+ <string name="Less Round">
+ Less Round
+ </string>
+ <string name="Less Saddle">
+ Less Saddle
+ </string>
+ <string name="Less Square">
+ Less Square
+ </string>
+ <string name="Less Volume">
+ Less Volume
+ </string>
+ <string name="Less soul">
+ Less soul
+ </string>
+ <string name="Lighter">
+ Lighter
+ </string>
+ <string name="Lip Cleft">
+ Lip Cleft
+ </string>
+ <string name="Lip Cleft Depth">
+ Lip Cleft Depth
+ </string>
+ <string name="Lip Fullness">
+ Lip Fullness
+ </string>
+ <string name="Lip Pinkness">
+ Lip Pinkness
+ </string>
+ <string name="Lip Ratio">
+ Lip Ratio
+ </string>
+ <string name="Lip Thickness">
+ Lip Thickness
+ </string>
+ <string name="Lip Width">
+ Lip Width
+ </string>
+ <string name="Lipgloss">
+ Lipgloss
+ </string>
+ <string name="Lipstick">
+ Lipstick
+ </string>
+ <string name="Lipstick Color">
+ Lipstick Color
+ </string>
+ <string name="Long">
+ Long
+ </string>
+ <string name="Long Head">
+ Long Head
+ </string>
+ <string name="Long Hips">
+ Long Hips
+ </string>
+ <string name="Long Legs">
+ Long Legs
+ </string>
+ <string name="Long Neck">
+ Long Neck
+ </string>
+ <string name="Long Pigtails">
+ Long Pigtails
+ </string>
+ <string name="Long Ponytail">
+ Long Ponytail
+ </string>
+ <string name="Long Torso">
+ Long Torso
+ </string>
+ <string name="Long arms">
+ Long arms
+ </string>
+ <string name="Loose Pants">
+ Loose Pants
+ </string>
+ <string name="Loose Shirt">
+ Loose Shirt
+ </string>
+ <string name="Loose Sleeves">
+ Loose Sleeves
+ </string>
+ <string name="Love Handles">
+ Love Handles
+ </string>
+ <string name="Low">
+ Low
+ </string>
+ <string name="Low Heels">
+ Low Heels
+ </string>
+ <string name="Low Jaw">
+ Low Jaw
+ </string>
+ <string name="Low Platforms">
+ Low Platforms
+ </string>
+ <string name="Low and Loose">
+ Low and Loose
+ </string>
+ <string name="Lower">
+ Lower
+ </string>
+ <string name="Lower Bridge">
+ Lower Bridge
+ </string>
+ <string name="Lower Cheeks">
+ Lower Cheeks
+ </string>
+ <string name="Male">
+ 男性
+ </string>
+ <string name="Middle Part">
+ Middle Part
+ </string>
+ <string name="More">
+ 更多
+ </string>
+ <string name="More Blush">
+ More Blush
+ </string>
+ <string name="More Body Fat">
+ More Body Fat
+ </string>
+ <string name="More Curtains">
+ More Curtains
+ </string>
+ <string name="More Eyeshadow">
+ More Eyeshadow
+ </string>
+ <string name="More Freckles">
+ More Freckles
+ </string>
+ <string name="More Full">
+ More Full
+ </string>
+ <string name="More Gravity">
+ More Gravity
+ </string>
+ <string name="More Lipstick">
+ More Lipstick
+ </string>
+ <string name="More Love">
+ More Love
+ </string>
+ <string name="More Lower Lip">
+ More Lower Lip
+ </string>
+ <string name="More Muscles">
+ More Muscles
+ </string>
+ <string name="More Muscular">
+ More Muscular
+ </string>
+ <string name="More Rosy">
+ More Rosy
+ </string>
+ <string name="More Round">
+ More Round
+ </string>
+ <string name="More Saddle">
+ More Saddle
+ </string>
+ <string name="More Sloped">
+ More Sloped
+ </string>
+ <string name="More Square">
+ More Square
+ </string>
+ <string name="More Upper Lip">
+ More Upper Lip
+ </string>
+ <string name="More Vertical">
+ More Vertical
+ </string>
+ <string name="More Volume">
+ More Volume
+ </string>
+ <string name="More soul">
+ More soul
+ </string>
+ <string name="Moustache">
+ Moustache
+ </string>
+ <string name="Mouth Corner">
+ Mouth Corner
+ </string>
+ <string name="Mouth Position">
+ Mouth Position
+ </string>
+ <string name="Mowhawk">
+ Mowhawk
+ </string>
+ <string name="Muscular">
+ Muscular
+ </string>
+ <string name="Mutton Chops">
+ Mutton Chops
+ </string>
+ <string name="Nail Polish">
+ Nail Polish
+ </string>
+ <string name="Nail Polish Color">
+ Nail Polish Color
+ </string>
+ <string name="Narrow">
+ Narrow
+ </string>
+ <string name="Narrow Back">
+ Narrow Back
+ </string>
+ <string name="Narrow Front">
+ Narrow Front
+ </string>
+ <string name="Narrow Lips">
+ Narrow Lips
+ </string>
+ <string name="Natural">
+ Natural
+ </string>
+ <string name="Neck Length">
+ Neck Length
+ </string>
+ <string name="Neck Thickness">
+ Neck Thickness
+ </string>
+ <string name="No Blush">
+ No Blush
+ </string>
+ <string name="No Eyeliner">
+ No Eyeliner
+ </string>
+ <string name="No Eyeshadow">
+ No Eyeshadow
+ </string>
+ <string name="No Lipgloss">
+ No Lipgloss
+ </string>
+ <string name="No Lipstick">
+ No Lipstick
+ </string>
+ <string name="No Part">
+ No Part
+ </string>
+ <string name="No Polish">
+ No Polish
+ </string>
+ <string name="No Red">
+ No Red
+ </string>
+ <string name="No Spikes">
+ No Spikes
+ </string>
+ <string name="No White">
+ No White
+ </string>
+ <string name="No Wrinkles">
+ No Wrinkles
+ </string>
+ <string name="Normal Lower">
+ Normal Lower
+ </string>
+ <string name="Normal Upper">
+ Normal Upper
+ </string>
+ <string name="Nose Left">
+ Nose Left
+ </string>
+ <string name="Nose Right">
+ Nose Right
+ </string>
+ <string name="Nose Size">
+ Nose Size
+ </string>
+ <string name="Nose Thickness">
+ Nose Thickness
+ </string>
+ <string name="Nose Tip Angle">
+ Nose Tip Angle
+ </string>
+ <string name="Nose Tip Shape">
+ Nose Tip Shape
+ </string>
+ <string name="Nose Width">
+ Nose Width
+ </string>
+ <string name="Nostril Division">
+ Nostril Division
+ </string>
+ <string name="Nostril Width">
+ Nostril Width
+ </string>
+ <string name="Opaque">
+ Opaque
+ </string>
+ <string name="Open">
+ Open
+ </string>
+ <string name="Open Back">
+ Open Back
+ </string>
+ <string name="Open Front">
+ Open Front
+ </string>
+ <string name="Open Left">
+ Open Left
+ </string>
+ <string name="Open Right">
+ Open Right
+ </string>
+ <string name="Orange">
+ Orange
+ </string>
+ <string name="Out">
+ Out
+ </string>
+ <string name="Out Shdw Color">
+ Outer Shadow Color
+ </string>
+ <string name="Out Shdw Opacity">
+ Outer Shadow Opacity
+ </string>
+ <string name="Outer Eye Corner">
+ Outer Eye Corner
+ </string>
+ <string name="Outer Eye Shadow">
+ Outer Eye Shadow
+ </string>
+ <string name="Outer Shadow">
+ Outer Shadow
+ </string>
+ <string name="Overbite">
+ Overbite
+ </string>
+ <string name="Package">
+ Package
+ </string>
+ <string name="Painted Nails">
+ Painted Nails
+ </string>
+ <string name="Pale">
+ Pale
+ </string>
+ <string name="Pants Crotch">
+ Pants Crotch
+ </string>
+ <string name="Pants Fit">
+ Pants Fit
+ </string>
+ <string name="Pants Length">
+ Pants Length
+ </string>
+ <string name="Pants Waist">
+ Pants Waist
+ </string>
+ <string name="Pants Wrinkles">
+ Pants Wrinkles
+ </string>
+ <string name="Part">
+ Part
+ </string>
+ <string name="Part Bangs">
+ Part Bangs
+ </string>
+ <string name="Pectorals">
+ Pectorals
+ </string>
+ <string name="Pigment">
+ Pigment
+ </string>
+ <string name="Pigtails">
+ Pigtails
+ </string>
+ <string name="Pink">
+ Pink
+ </string>
+ <string name="Pinker">
+ Pinker
+ </string>
+ <string name="Platform Height">
+ Platform Height
+ </string>
+ <string name="Platform Width">
+ Platform Width
+ </string>
+ <string name="Pointy">
+ Pointy
+ </string>
+ <string name="Pointy Heels">
+ Pointy Heels
+ </string>
+ <string name="Ponytail">
+ Ponytail
+ </string>
+ <string name="Poofy Skirt">
+ Poofy Skirt
+ </string>
+ <string name="Pop Left Eye">
+ Pop Left Eye
+ </string>
+ <string name="Pop Right Eye">
+ Pop Right Eye
+ </string>
+ <string name="Puffy">
+ Puffy
+ </string>
+ <string name="Puffy Eyelids">
+ Puffy Eyelids
+ </string>
+ <string name="Rainbow Color">
+ Rainbow Color
+ </string>
+ <string name="Red Hair">
+ Red Hair
+ </string>
+ <string name="Regular">
+ Regular
+ </string>
+ <string name="Right Part">
+ Right Part
+ </string>
+ <string name="Rosy Complexion">
+ Rosy Complexion
+ </string>
+ <string name="Round">
+ Round
+ </string>
+ <string name="Ruddiness">
+ Ruddiness
+ </string>
+ <string name="Ruddy">
+ Ruddy
+ </string>
+ <string name="Rumpled Hair">
+ Rumpled Hair
+ </string>
+ <string name="Saddle Bags">
+ Saddle Bags
+ </string>
+ <string name="Scrawny Leg">
+ Scrawny Leg
+ </string>
+ <string name="Separate">
+ Separate
+ </string>
+ <string name="Shallow">
+ Shallow
+ </string>
+ <string name="Shear Back">
+ Shear Back
+ </string>
+ <string name="Shear Face">
+ Shear Face
+ </string>
+ <string name="Shear Front">
+ Shear Front
+ </string>
+ <string name="Shear Left Up">
+ Shear Left Up
+ </string>
+ <string name="Shear Right Up">
+ Shear Right Up
+ </string>
+ <string name="Sheared Back">
+ Sheared Back
+ </string>
+ <string name="Sheared Front">
+ Sheared Front
+ </string>
+ <string name="Shift Left">
+ Shift Left
+ </string>
+ <string name="Shift Mouth">
+ Shift Mouth
+ </string>
+ <string name="Shift Right">
+ Shift Right
+ </string>
+ <string name="Shirt Bottom">
+ Shirt Bottom
+ </string>
+ <string name="Shirt Fit">
+ Shirt Fit
+ </string>
+ <string name="Shirt Wrinkles">
+ Shirt Wrinkles
+ </string>
+ <string name="Shoe Height">
+ Shoe Height
+ </string>
+ <string name="Short">
+ Short
+ </string>
+ <string name="Short Arms">
+ Short Arms
+ </string>
+ <string name="Short Legs">
+ Short Legs
+ </string>
+ <string name="Short Neck">
+ Short Neck
+ </string>
+ <string name="Short Pigtails">
+ Short Pigtails
+ </string>
+ <string name="Short Ponytail">
+ Short Ponytail
+ </string>
+ <string name="Short Sideburns">
+ Short Sideburns
+ </string>
+ <string name="Short Torso">
+ Short Torso
+ </string>
+ <string name="Short hips">
+ Short hips
+ </string>
+ <string name="Shoulders">
+ Shoulders
+ </string>
+ <string name="Side Fringe">
+ Side Fringe
+ </string>
+ <string name="Sideburns">
+ Sideburns
+ </string>
+ <string name="Sides Hair">
+ Sides Hair
+ </string>
+ <string name="Sides Hair Down">
+ Sides Hair Down
+ </string>
+ <string name="Sides Hair Up">
+ Sides Hair Up
+ </string>
+ <string name="Skinny Neck">
+ Skinny Neck
+ </string>
+ <string name="Skirt Fit">
+ Skirt Fit
+ </string>
+ <string name="Skirt Length">
+ Skirt Length
+ </string>
+ <string name="Slanted Forehead">
+ Slanted Forehead
+ </string>
+ <string name="Sleeve Length">
+ Sleeve Length
+ </string>
+ <string name="Sleeve Looseness">
+ Sleeve Looseness
+ </string>
+ <string name="Slit Back">
+ Slit: Back
+ </string>
+ <string name="Slit Front">
+ Slit: Front
+ </string>
+ <string name="Slit Left">
+ Slit: Left
+ </string>
+ <string name="Slit Right">
+ Slit: Right
+ </string>
+ <string name="Small">
+ Small
+ </string>
+ <string name="Small Hands">
+ Small Hands
+ </string>
+ <string name="Small Head">
+ Small Head
+ </string>
+ <string name="Smooth">
+ Smooth
+ </string>
+ <string name="Smooth Hair">
+ Smooth Hair
+ </string>
+ <string name="Socks Length">
+ Socks Length
+ </string>
+ <string name="Soulpatch">
+ Soulpatch
+ </string>
+ <string name="Sparse">
+ Sparse
+ </string>
+ <string name="Spiked Hair">
+ Spiked Hair
+ </string>
+ <string name="Square">
+ Square
+ </string>
+ <string name="Square Toe">
+ Square Toe
+ </string>
+ <string name="Squash Head">
+ Squash Head
+ </string>
+ <string name="Stretch Head">
+ Stretch Head
+ </string>
+ <string name="Sunken">
+ Sunken
+ </string>
+ <string name="Sunken Chest">
+ Sunken Chest
+ </string>
+ <string name="Sunken Eyes">
+ Sunken Eyes
+ </string>
+ <string name="Sweep Back">
+ Sweep Back
+ </string>
+ <string name="Sweep Forward">
+ Sweep Forward
+ </string>
+ <string name="Tall">
+ Tall
+ </string>
+ <string name="Taper Back">
+ Taper Back
+ </string>
+ <string name="Taper Front">
+ Taper Front
+ </string>
+ <string name="Thick Heels">
+ Thick Heels
+ </string>
+ <string name="Thick Neck">
+ Thick Neck
+ </string>
+ <string name="Thick Toe">
+ Thick Toe
+ </string>
+ <string name="Thin">
+ Thin
+ </string>
+ <string name="Thin Eyebrows">
+ Thin Eyebrows
+ </string>
+ <string name="Thin Lips">
+ Thin Lips
+ </string>
+ <string name="Thin Nose">
+ Thin Nose
+ </string>
+ <string name="Tight Chin">
+ Tight Chin
+ </string>
+ <string name="Tight Cuffs">
+ Tight Cuffs
+ </string>
+ <string name="Tight Pants">
+ Tight Pants
+ </string>
+ <string name="Tight Shirt">
+ Tight Shirt
+ </string>
+ <string name="Tight Skirt">
+ Tight Skirt
+ </string>
+ <string name="Tight Sleeves">
+ Tight Sleeves
+ </string>
+ <string name="Toe Shape">
+ Toe Shape
+ </string>
+ <string name="Toe Thickness">
+ Toe Thickness
+ </string>
+ <string name="Torso Length">
+ Torso Length
+ </string>
+ <string name="Torso Muscles">
+ Torso Muscles
+ </string>
+ <string name="Torso Scrawny">
+ Torso Scrawny
+ </string>
+ <string name="Unattached">
+ Unattached
+ </string>
+ <string name="Uncreased">
+ Uncreased
+ </string>
+ <string name="Underbite">
+ Underbite
+ </string>
+ <string name="Unnatural">
+ Unnatural
+ </string>
+ <string name="Upper Bridge">
+ Upper Bridge
+ </string>
+ <string name="Upper Cheeks">
+ Upper Cheeks
+ </string>
+ <string name="Upper Chin Cleft">
+ Upper Chin Cleft
+ </string>
+ <string name="Upper Eyelid Fold">
+ Upper Eyelid Fold
+ </string>
+ <string name="Upturned">
+ Upturned
+ </string>
+ <string name="Very Red">
+ Very Red
+ </string>
+ <string name="Waist Height">
+ Waist Height
+ </string>
+ <string name="Well-Fed">
+ Well-Fed
+ </string>
+ <string name="White Hair">
+ White Hair
+ </string>
+ <string name="Wide">
+ Wide
+ </string>
+ <string name="Wide Back">
+ Wide Back
+ </string>
+ <string name="Wide Front">
+ Wide Front
+ </string>
+ <string name="Wide Lips">
+ Wide Lips
+ </string>
+ <string name="Wild">
+ Wild
+ </string>
+ <string name="Wrinkles">
+ Wrinkles
+ </string>
+ <string name="LocationCtrlAddLandmarkTooltip">
+ 添加到我的地標
+ </string>
+ <string name="LocationCtrlEditLandmarkTooltip">
+ 編輯我的地標
+ </string>
+ <string name="LocationCtrlInfoBtnTooltip">
+ 察看更多關於目å‰ä½ç½®çš„資訊
+ </string>
+ <string name="LocationCtrlComboBtnTooltip">
+ 我的ä½ç½®æ­·å²ç´€éŒ„
+ </string>
+ <string name="LocationCtrlForSaleTooltip">
+ 購買這塊土地
+ </string>
+ <string name="LocationCtrlVoiceTooltip">
+ 此地並ä¸å…許語音
+ </string>
+ <string name="LocationCtrlFlyTooltip">
+ ä¸å…許飛行
+ </string>
+ <string name="LocationCtrlPushTooltip">
+ ç¦æ­¢æŽ¨æ’ž
+ </string>
+ <string name="LocationCtrlBuildTooltip">
+ 建造ï¼ä¸Ÿæ£„ 物件ä¸è¢«å…許
+ </string>
+ <string name="LocationCtrlScriptsTooltip">
+ 腳本ä¸è¢«å…許
+ </string>
+ <string name="LocationCtrlDamageTooltip">
+ å¥åº·
+ </string>
+ <string name="LocationCtrlAdultIconTooltip">
+ 完全æˆäººåœ°å€
+ </string>
+ <string name="LocationCtrlModerateIconTooltip">
+ é©åº¦æˆäººåœ°å€
+ </string>
+ <string name="LocationCtrlGeneralIconTooltip">
+ 一般普級地å€
+ </string>
+ <string name="UpdaterWindowTitle">
+ [APP_NAME] æ›´æ–°
+ </string>
+ <string name="UpdaterNowUpdating">
+ [APP_NAME] ç¾æ›´æ–°ä¸­...
+ </string>
+ <string name="UpdaterNowInstalling">
+ [APP_NAME] 安è£ä¸­...
+ </string>
+ <string name="UpdaterUpdatingDescriptive">
+ Your [APP_NAME] Viewer is being updated to the latest release. This may take some time, so please be patient.
+ </string>
+ <string name="UpdaterProgressBarTextWithEllipses">
+ 更新下載中...
+ </string>
+ <string name="UpdaterProgressBarText">
+ 更新下載
+ </string>
+ <string name="UpdaterFailDownloadTitle">
+ å¤è¼‰æ›´æ–°å¤±æ•—
+ </string>
+ <string name="UpdaterFailUpdateDescriptive">
+ An error occurred while updating [APP_NAME]. Please download the latest version from www.secondlife.com.
+ </string>
+ <string name="UpdaterFailInstallTitle">
+ 安è£æ›´æ–°å¤±æ•—
+ </string>
+ <string name="UpdaterFailStartTitle">
+ å•Ÿå‹•ç€è¦½å™¨å¤±æ•—
+ </string>
+ <string name="ItemsComingInTooFastFrom">
+ [APP_NAME]: Items coming in too fast from [FROM_NAME], automatic preview disabled for [TIME] seconds
+ </string>
+ <string name="ItemsComingInTooFast">
+ [APP_NAME]: Items coming in too fast, automatic preview disabled for [TIME] seconds
+ </string>
+ <string name="IM_logging_string">
+ -- Instant message logging enabled --
+ </string>
+ <string name="IM_typing_start_string">
+ [NAME] 正在輸入...
+ </string>
+ <string name="Unnamed">
+ (未命å)
+ </string>
+ <string name="IM_moderated_chat_label">
+ (Moderated: Voices off by default)
+ </string>
+ <string name="IM_unavailable_text_label">
+ Text chat is not available for this call.
+ </string>
+ <string name="IM_muted_text_label">
+ Your text chat has been disabled by a Group Moderator.
+ </string>
+ <string name="IM_default_text_label">
+ 點擊此處以傳é€å³æ™‚訊æ¯ã€‚
+ </string>
+ <string name="IM_to_label">
+ 至
+ </string>
+ <string name="IM_moderator_label">
+ (Moderator)
+ </string>
+ <string name="Saved_message">
+ (Saved [LONG_TIMESTAMP])
+ </string>
+ <string name="answered_call">
+ Your call has been answered
+ </string>
+ <string name="you_started_call">
+ You started a voice call
+ </string>
+ <string name="you_joined_call">
+ You joined the voice call
+ </string>
+ <string name="name_started_call">
+ [NAME] started a voice call
+ </string>
+ <string name="ringing-im">
+ 加入語音通話...
+ </string>
+ <string name="connected-im">
+ Connected, click Leave Call to hang up
+ </string>
+ <string name="hang_up-im">
+ 離開語音通話
+ </string>
+ <string name="answering-im">
+ è¯æŽ¥ä¸­...
+ </string>
+ <string name="conference-title">
+ Ad-hoc Conference
+ </string>
+ <string name="conference-title-incoming">
+ Conference with [AGENT_NAME]
+ </string>
+ <string name="inventory_item_offered-im">
+ Inventory item offered
+ </string>
+ <string name="share_alert">
+ Drag items from inventory here
+ </string>
+ <string name="no_session_message">
+ (IM 會話ä¸å­˜åœ¨ï¼‰
+ </string>
+ <string name="only_user_message">
+ You are the only user in this session.
+ </string>
+ <string name="offline_message">
+ [NAME] 離線。
+ </string>
+ <string name="invite_message">
+ Click the [BUTTON NAME] button to accept/connect to this voice chat.
+ </string>
+ <string name="muted_message">
+ You have blocked this Resident. Sending a message will automatically unblock them.
+ </string>
+ <string name="generic">
+ Error making request, please try again later.
+ </string>
+ <string name="generic_request_error">
+ Error making request, please try again later.
+ </string>
+ <string name="insufficient_perms_error">
+ You do not have sufficient permissions.
+ </string>
+ <string name="session_does_not_exist_error">
+ 此會話ä¸å†å­˜åœ¨
+ </string>
+ <string name="no_ability_error">
+ 你並ä¸å…·æœ‰é€™å€‹èƒ½åŠ›ã€‚
+ </string>
+ <string name="no_ability">
+ 你並ä¸å…·æœ‰é€™å€‹èƒ½åŠ›ã€‚
+ </string>
+ <string name="not_a_mod_error">
+ You are not a session moderator.
+ </string>
+ <string name="muted">
+ A group moderator disabled your text chat.
+ </string>
+ <string name="muted_error">
+ A group moderator disabled your text chat.
+ </string>
+ <string name="add_session_event">
+ Unable to add users to chat session with [RECIPIENT].
+ </string>
+ <string name="message">
+ Unable to send your message to the chat session with [RECIPIENT].
+ </string>
+ <string name="message_session_event">
+ Unable to send your message to the chat session with [RECIPIENT].
+ </string>
+ <string name="mute">
+ Error while moderating.
+ </string>
+ <string name="removed">
+ 你已經由群組中被移除。
+ </string>
+ <string name="removed_from_group">
+ 你已經由群組中被移除。
+ </string>
+ <string name="close_on_no_ability">
+ You no longer have the ability to be in the chat session.
+ </string>
+ <string name="unread_chat_single">
+ [SOURCES] has said something new
+ </string>
+ <string name="unread_chat_multiple">
+ [SOURCES] have said something new
+ </string>
+ <string name="session_initialization_timed_out_error">
+ The session initialization is timed out
+ </string>
+ <string name="voice_morphing_url">
+ http://secondlife.com/landing/voicemorphing
+ </string>
+ <string name="paid_you_ldollars">
+ [NAME] paid you L$[AMOUNT] [REASON].
+ </string>
+ <string name="paid_you_ldollars_no_reason">
+ [NAME] paid you L$[AMOUNT].
+ </string>
+ <string name="you_paid_ldollars">
+ You paid [NAME] L$[AMOUNT] [REASON].
+ </string>
+ <string name="you_paid_ldollars_no_info">
+ You paid L$[AMOUNT].
+ </string>
+ <string name="you_paid_ldollars_no_reason">
+ You paid [NAME] L$[AMOUNT].
+ </string>
+ <string name="you_paid_ldollars_no_name">
+ You paid L$[AMOUNT] [REASON].
+ </string>
+ <string name="for item">
+ for [ITEM]
+ </string>
+ <string name="for a parcel of land">
+ for a parcel of land
+ </string>
+ <string name="for a land access pass">
+ for a land access pass
+ </string>
+ <string name="for deeding land">
+ for deeding land
+ </string>
+ <string name="to create a group">
+ 以創造群組
+ </string>
+ <string name="to join a group">
+ 以加入群組
+ </string>
+ <string name="to upload">
+ 以上傳
+ </string>
+ <string name="to publish a classified ad">
+ to publish a classified ad
+ </string>
+ <string name="giving">
+ Giving L$ [AMOUNT]
+ </string>
+ <string name="uploading_costs">
+ 上傳花費 L$ [AMOUNT]
+ </string>
+ <string name="this_costs">
+ This costs L$ [AMOUNT]
+ </string>
+ <string name="buying_selected_land">
+ Buying selected land for L$ [AMOUNT]
+ </string>
+ <string name="this_object_costs">
+ This object costs L$ [AMOUNT]
+ </string>
+ <string name="group_role_everyone">
+ 任何人
+ </string>
+ <string name="group_role_officers">
+ Officers
+ </string>
+ <string name="group_role_owners">
+ æ“有者
+ </string>
+ <string name="group_member_status_online">
+ 上線
+ </string>
+ <string name="uploading_abuse_report">
+ 上傳中...
+
+舉報濫用
+ </string>
+ <string name="New Shape">
+ 新體形
+ </string>
+ <string name="New Skin">
+ 新皮膚
+ </string>
+ <string name="New Hair">
+ æ–°é ­é«®
+ </string>
+ <string name="New Eyes">
+ 新眼ç›
+ </string>
+ <string name="New Shirt">
+ 新襯衫
+ </string>
+ <string name="New Pants">
+ 新褲å­
+ </string>
+ <string name="New Shoes">
+ æ–°éž‹å­
+ </string>
+ <string name="New Socks">
+ 新襪å­
+ </string>
+ <string name="New Jacket">
+ 新夾克
+ </string>
+ <string name="New Gloves">
+ 新手套
+ </string>
+ <string name="New Undershirt">
+ 新內衣
+ </string>
+ <string name="New Underpants">
+ 新內褲
+ </string>
+ <string name="New Skirt">
+ 新裙å­
+ </string>
+ <string name="New Alpha">
+ æ–°åŠé€æ˜Ž
+ </string>
+ <string name="New Tattoo">
+ 新刺é’
+ </string>
+ <string name="New Physics">
+ 新身體物ç†
+ </string>
+ <string name="Invalid Wearable">
+ 無效的å¯ç©¿è£æ‰®
+ </string>
+ <string name="New Gesture">
+ 新姿勢
+ </string>
+ <string name="New Script">
+ 新腳本
+ </string>
+ <string name="New Note">
+ 新記事å¡
+ </string>
+ <string name="New Folder">
+ 新資料夾
+ </string>
+ <string name="Contents">
+ 內容
+ </string>
+ <string name="Gesture">
+ 姿勢
+ </string>
+ <string name="Male Gestures">
+ 男性姿勢
+ </string>
+ <string name="Female Gestures">
+ 女性姿勢
+ </string>
+ <string name="Other Gestures">
+ 其他姿勢
+ </string>
+ <string name="Speech Gestures">
+ 演說姿勢
+ </string>
+ <string name="Common Gestures">
+ 一般姿勢
+ </string>
+ <string name="Male - Excuse me">
+ Male - Excuse me
+ </string>
+ <string name="Male - Get lost">
+ Male - Get lost
+ </string>
+ <string name="Male - Blow kiss">
+ Male - Blow kiss
+ </string>
+ <string name="Male - Boo">
+ Male - Boo
+ </string>
+ <string name="Male - Bored">
+ Male - Bored
+ </string>
+ <string name="Male - Hey">
+ Male - Hey
+ </string>
+ <string name="Male - Laugh">
+ Male - Laugh
+ </string>
+ <string name="Male - Repulsed">
+ Male - Repulsed
+ </string>
+ <string name="Male - Shrug">
+ Male - Shrug
+ </string>
+ <string name="Male - Stick tougue out">
+ Male - Stick tougue out
+ </string>
+ <string name="Male - Wow">
+ Male - Wow
+ </string>
+ <string name="Female - Chuckle">
+ Female - Chuckle
+ </string>
+ <string name="Female - Cry">
+ Female - Cry
+ </string>
+ <string name="Female - Embarrassed">
+ Female - Embarrassed
+ </string>
+ <string name="Female - Excuse me">
+ Female - Excuse me
+ </string>
+ <string name="Female - Get lost">
+ Female - Get lost
+ </string>
+ <string name="Female - Blow kiss">
+ Female - Blow kiss
+ </string>
+ <string name="Female - Boo">
+ Female - Boo
+ </string>
+ <string name="Female - Bored">
+ Female - Bored
+ </string>
+ <string name="Female - Hey">
+ Female - Hey
+ </string>
+ <string name="Female - Hey baby">
+ Female - Hey baby
+ </string>
+ <string name="Female - Laugh">
+ Female - Laugh
+ </string>
+ <string name="Female - Looking good">
+ Female - Looking good
+ </string>
+ <string name="Female - Over here">
+ Female - Over here
+ </string>
+ <string name="Female - Please">
+ Female - Please
+ </string>
+ <string name="Female - Repulsed">
+ Female - Repulsed
+ </string>
+ <string name="Female - Shrug">
+ Female - Shrug
+ </string>
+ <string name="Female - Stick tougue out">
+ Female - Stick tougue out
+ </string>
+ <string name="Female - Wow">
+ Female - Wow
+ </string>
+ <string name="AvatarBirthDateFormat">
+ [mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt]
+ </string>
+ <string name="DefaultMimeType">
+ ç„¡/ç„¡
+ </string>
+ <string name="texture_load_dimensions_error">
+ 無法載入圖åƒå¤§æ–¼ [WIDTH]*[HEIGHT]
+ </string>
+ <string name="words_separator" value=","/>
+ <string name="server_is_down">
+ Despite our best efforts, something unexpected has gone wrong.
+
+ Please check status.secondlifegrid.net to see if there is a known problem with the service.
+ If you continue to experience problems, please check your network and firewall setup.
+ </string>
+ <string name="dateTimeWeekdaysNames">
+ Sunday:Monday:Tuesday:Wednesday:Thursday:Friday:Saturday
+ </string>
+ <string name="dateTimeWeekdaysShortNames">
+ Sun:Mon:Tue:Wed:Thu:Fri:Sat
+ </string>
+ <string name="dateTimeMonthNames">
+ January:February:March:April:May:June:July:August:September:October:November:December
+ </string>
+ <string name="dateTimeMonthShortNames">
+ Jan:Feb:Mar:Apr:May:Jun:Jul:Aug:Sep:Oct:Nov:Dec
+ </string>
+ <string name="dateTimeDayFormat">
+ [MDAY]
+ </string>
+ <string name="dateTimeAM">
+ AM
+ </string>
+ <string name="dateTimePM">
+ PM
+ </string>
+ <string name="LocalEstimateUSD">
+ US$ [AMOUNT]
+ </string>
+ <string name="Membership">
+ æˆå“¡è³‡æ ¼
+ </string>
+ <string name="Roles">
+ 角色
+ </string>
+ <string name="Group Identity">
+ Group Identity
+ </string>
+ <string name="Parcel Management">
+ 地段管ç†
+ </string>
+ <string name="Parcel Identity">
+ Parcel Identity
+ </string>
+ <string name="Parcel Settings">
+ 地段設定
+ </string>
+ <string name="Parcel Powers">
+ Parcel Powers
+ </string>
+ <string name="Parcel Access">
+ Parcel Access
+ </string>
+ <string name="Parcel Content">
+ Parcel Content
+ </string>
+ <string name="Object Management">
+ 物件管ç†
+ </string>
+ <string name="Accounting">
+ 會計
+ </string>
+ <string name="Notices">
+ 通知
+ </string>
+ <string name="Chat">
+ èŠå¤©
+ </string>
+ <string name="DeleteItems">
+ 刪除所é¸å–的物å“?
+ </string>
+ <string name="DeleteItem">
+ 刪除所é¸å–的物å“?
+ </string>
+ <string name="EmptyOutfitText">
+ 沒有任何物å“在這個è£æ‰®å…§
+ </string>
+ <string name="ExternalEditorNotSet">
+ é¸æ“‡ä¸€å€‹ç·¨è¼¯å™¨ä½¿ç”¨ ExternalEditor 設定。
+ </string>
+ <string name="ExternalEditorNotFound">
+ Cannot find the external editor you specified.
+Try enclosing path to the editor with double quotes.
+(e.g. &quot;/path to my/editor&quot; &quot;%s&quot;)
+ </string>
+ <string name="ExternalEditorCommandParseError">
+ Error parsing the external editor command.
+ </string>
+ <string name="ExternalEditorFailedToRun">
+ 執行外部編輯器失敗。
+ </string>
+ <string name="Esc">
+ Esc
+ </string>
+ <string name="Space">
+ Space
+ </string>
+ <string name="Enter">
+ Enter
+ </string>
+ <string name="Tab">
+ Tab
+ </string>
+ <string name="Ins">
+ Ins
+ </string>
+ <string name="Del">
+ Del
+ </string>
+ <string name="Backsp">
+ Backsp
+ </string>
+ <string name="Shift">
+ Shift
+ </string>
+ <string name="Ctrl">
+ Ctrl
+ </string>
+ <string name="Alt">
+ Alt
+ </string>
+ <string name="CapsLock">
+ CapsLock
+ </string>
+ <string name="Left">
+ Left
+ </string>
+ <string name="Right">
+ Right
+ </string>
+ <string name="Up">
+ Up
+ </string>
+ <string name="Down">
+ Down
+ </string>
+ <string name="Home">
+ Home
+ </string>
+ <string name="End">
+ End
+ </string>
+ <string name="PgUp">
+ PgUp
+ </string>
+ <string name="PgDn">
+ PgDn
+ </string>
+ <string name="F1">
+ F1
+ </string>
+ <string name="F2">
+ F2
+ </string>
+ <string name="F3">
+ F3
+ </string>
+ <string name="F4">
+ F4
+ </string>
+ <string name="F5">
+ F5
+ </string>
+ <string name="F6">
+ F6
+ </string>
+ <string name="F7">
+ F7
+ </string>
+ <string name="F8">
+ F8
+ </string>
+ <string name="F9">
+ F9
+ </string>
+ <string name="F10">
+ F10
+ </string>
+ <string name="F11">
+ F11
+ </string>
+ <string name="F12">
+ F12
+ </string>
+ <string name="Add">
+ Add
+ </string>
+ <string name="Subtract">
+ Subtract
+ </string>
+ <string name="Multiply">
+ Multiply
+ </string>
+ <string name="Divide">
+ Divide
+ </string>
+ <string name="PAD_DIVIDE">
+ PAD_DIVIDE
+ </string>
+ <string name="PAD_LEFT">
+ PAD_LEFT
+ </string>
+ <string name="PAD_RIGHT">
+ PAD_RIGHT
+ </string>
+ <string name="PAD_DOWN">
+ PAD_DOWN
+ </string>
+ <string name="PAD_UP">
+ PAD_UP
+ </string>
+ <string name="PAD_HOME">
+ PAD_HOME
+ </string>
+ <string name="PAD_END">
+ PAD_END
+ </string>
+ <string name="PAD_PGUP">
+ PAD_PGUP
+ </string>
+ <string name="PAD_PGDN">
+ PAD_PGDN
+ </string>
+ <string name="PAD_CENTER">
+ PAD_CENTER
+ </string>
+ <string name="PAD_INS">
+ PAD_INS
+ </string>
+ <string name="PAD_DEL">
+ PAD_DEL
+ </string>
+ <string name="PAD_Enter">
+ PAD_Enter
+ </string>
+ <string name="PAD_BUTTON0">
+ PAD_BUTTON0
+ </string>
+ <string name="PAD_BUTTON1">
+ PAD_BUTTON1
+ </string>
+ <string name="PAD_BUTTON2">
+ PAD_BUTTON2
+ </string>
+ <string name="PAD_BUTTON3">
+ PAD_BUTTON3
+ </string>
+ <string name="PAD_BUTTON4">
+ PAD_BUTTON4
+ </string>
+ <string name="PAD_BUTTON5">
+ PAD_BUTTON5
+ </string>
+ <string name="PAD_BUTTON6">
+ PAD_BUTTON6
+ </string>
+ <string name="PAD_BUTTON7">
+ PAD_BUTTON7
+ </string>
+ <string name="PAD_BUTTON8">
+ PAD_BUTTON8
+ </string>
+ <string name="PAD_BUTTON9">
+ PAD_BUTTON9
+ </string>
+ <string name="PAD_BUTTON10">
+ PAD_BUTTON10
+ </string>
+ <string name="PAD_BUTTON11">
+ PAD_BUTTON11
+ </string>
+ <string name="PAD_BUTTON12">
+ PAD_BUTTON12
+ </string>
+ <string name="PAD_BUTTON13">
+ PAD_BUTTON13
+ </string>
+ <string name="PAD_BUTTON14">
+ PAD_BUTTON14
+ </string>
+ <string name="PAD_BUTTON15">
+ PAD_BUTTON15
+ </string>
+ <string name="-">
+ -
+ </string>
+ <string name="=">
+ =
+ </string>
+ <string name="`">
+ `
+ </string>
+ <string name=";">
+ ;
+ </string>
+ <string name="[">
+ [
+ </string>
+ <string name="]">
+ ]
+ </string>
+ <string name="\">
+ \
+ </string>
+ <string name="0">
+ 0
+ </string>
+ <string name="1">
+ 1
+ </string>
+ <string name="2">
+ 2
+ </string>
+ <string name="3">
+ 3
+ </string>
+ <string name="4">
+ 4
+ </string>
+ <string name="5">
+ 5
+ </string>
+ <string name="6">
+ 6
+ </string>
+ <string name="7">
+ 7
+ </string>
+ <string name="8">
+ 8
+ </string>
+ <string name="9">
+ 9
+ </string>
+ <string name="A">
+ A
+ </string>
+ <string name="B">
+ B
+ </string>
+ <string name="C">
+ C
+ </string>
+ <string name="D">
+ D
+ </string>
+ <string name="E">
+ E
+ </string>
+ <string name="F">
+ F
+ </string>
+ <string name="G">
+ G
+ </string>
+ <string name="H">
+ H
+ </string>
+ <string name="I">
+ I
+ </string>
+ <string name="J">
+ J
+ </string>
+ <string name="K">
+ K
+ </string>
+ <string name="L">
+ L
+ </string>
+ <string name="M">
+ M
+ </string>
+ <string name="N">
+ N
+ </string>
+ <string name="O">
+ O
+ </string>
+ <string name="P">
+ P
+ </string>
+ <string name="Q">
+ Q
+ </string>
+ <string name="R">
+ R
+ </string>
+ <string name="S">
+ S
+ </string>
+ <string name="T">
+ T
+ </string>
+ <string name="U">
+ U
+ </string>
+ <string name="V">
+ V
+ </string>
+ <string name="W">
+ W
+ </string>
+ <string name="X">
+ X
+ </string>
+ <string name="Y">
+ Y
+ </string>
+ <string name="Z">
+ Z
+ </string>
+ <string name="BeaconParticle">
+ Viewing particle beacons (blue)
+ </string>
+ <string name="BeaconPhysical">
+ Viewing physical object beacons (green)
+ </string>
+ <string name="BeaconScripted">
+ Viewing scripted object beacons (red)
+ </string>
+ <string name="BeaconScriptedTouch">
+ Viewing scripted object with touch function beacons (red)
+ </string>
+ <string name="BeaconSound">
+ Viewing sound beacons (yellow)
+ </string>
+ <string name="BeaconMedia">
+ Viewing media beacons (white)
+ </string>
+ <string name="ParticleHiding">
+ Hiding Particles
+ </string>
+</strings>
diff --git a/indra/newview/skins/default/xui/zh/teleport_strings.xml b/indra/newview/skins/default/xui/zh/teleport_strings.xml
new file mode 100644
index 0000000000..bfdb107810
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/teleport_strings.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<teleport_messages>
+ <message_set name="errors">
+ <message name="invalid_tport">
+ Problem encountered processing your teleport request. You may need to log back in before you can teleport.
+如果你æŒçºŒå¾—到此訊æ¯ï¼Œè«‹æŸ¥é–± [SUPPORT_SITE]。
+ </message>
+ <message name="invalid_region_handoff">
+ Problem encountered processing your region crossing. You may need to log back in before you can cross regions.
+如果你æŒçºŒå¾—到此訊æ¯ï¼Œè«‹æŸ¥é–± [SUPPORT_SITE]。
+ </message>
+ <message name="blocked_tport">
+ 抱歉,目å‰çž¬é–“傳é€å·²è¢«é˜»æ“‹ã€‚è«‹ç¨å¾Œå†è©¦ã€‚
+如果你ä»ç„¡æ³•é€²è¡Œçž¬é–“傳é€ï¼Œè«‹ç™»å‡ºå¾Œé‡æ–°å…¥ä¾†è§£æ±ºæ­¤ä¸€å•é¡Œã€‚
+ </message>
+ <message name="nolandmark_tport">
+ 抱歉,ä¸éŽç³»çµ±ç„¡æ³•æ‰¾åˆ°åœ°æ¨™æ‰€åœ¨ç›®çš„地。
+ </message>
+ <message name="timeout_tport">
+ 抱歉,ä¸éŽç³»çµ±ç„¡æ³•å®Œæˆçž¬é–“傳é€çš„è¯æŽ¥ã€‚
+è«‹ç¨å¾Œå†è©¦ã€‚
+ </message>
+ <message name="NoHelpIslandTP">
+ 您ä¸èƒ½çž¬é—´è½¬ç§»å›žâ€œæ´åŠ©å²›â€ã€‚
+去“公共æ´åŠ©å²›â€é‡å¤æ‚¨çš„教程。
+ </message>
+ <message name="noaccess_tport">
+ 抱歉,你並沒有權é™é€²å…¥è¦çž¬é–“傳é€çš„目的地。
+ </message>
+ <message name="missing_attach_tport">
+ Your attachments have not arrived yet. Try waiting for a few more seconds or log out and back in again before attempting to teleport.
+ </message>
+ <message name="too_many_uploads_tport">
+ The asset queue in this region is currently clogged so your teleport request will not be able to succeed in a timely manner. Please try again in a few minutes or go to a less busy area.
+ </message>
+ <message name="expired_tport">
+ Sorry, but the system was unable to complete your teleport request in a timely fashion. Please try again in a few minutes.
+ </message>
+ <message name="expired_region_handoff">
+ Sorry, but the system was unable to complete your region crossing in a timely fashion. Please try again in a few minutes.
+ </message>
+ <message name="no_host">
+ Unable to find teleport destination. The destination may be temporarily unavailable or no longer exists. Please try again in a few minutes.
+ </message>
+ <message name="no_inventory_host">
+ 收ç´å€åŠŸèƒ½ç›®å‰ç„¡æ³•ä½¿ç”¨ã€‚
+ </message>
+ </message_set>
+ <message_set name="progress">
+ <message name="sending_dest">
+ Sending to destination.
+ </message>
+ <message name="redirecting">
+ é‡æ–°å°Žå‘至ä¸åŒä½ç½®ã€‚
+ </message>
+ <message name="relaying">
+ Relaying to destination.
+ </message>
+ <message name="sending_home">
+ é€å‡ºå®¶ä½ç½®çš„è¦æ±‚。
+ </message>
+ <message name="sending_landmark">
+ 地標ä½ç½®è¦æ±‚瞬間傳é€ä¸­ã€‚
+ </message>
+ <message name="completing">
+ 瞬間傳é€å®Œæˆã€‚
+ </message>
+ <message name="completed_from">
+ ç”± [T_SLURL] 瞬間傳é€å®Œæˆã€‚
+ </message>
+ <message name="resolving">
+ 目的地解決中。
+ </message>
+ <message name="contacting">
+ è¯ç¹«åˆ°æ–°çš„地å€ã€‚
+ </message>
+ <message name="arriving">
+ 抵é”中...
+ </message>
+ <message name="requesting">
+ 瞬間傳é€è¦æ±‚中...
+ </message>
+ </message_set>
+</teleport_messages>
diff --git a/indra/newview/skins/paths.xml b/indra/newview/skins/paths.xml
index e6d68488ea..3c0da041c7 100644
--- a/indra/newview/skins/paths.xml
+++ b/indra/newview/skins/paths.xml
@@ -1,4 +1,4 @@
-<paths>
+<paths>
<directory>
<subdir>xui</subdir>
<subdir>en</subdir>
diff --git a/indra/newview/tests/gpus_results.txt b/indra/newview/tests/gpus_results.txt
new file mode 100644
index 0000000000..68e2e688cb
--- /dev/null
+++ b/indra/newview/tests/gpus_results.txt
@@ -0,0 +1,1726 @@
+GPU String Supported? Class Recognizer
+------------------------------------------------------------------------------------------------------ ----------- ----- ------------------------------------
+ATI NO MATCH
+ATI 3D-Analyze unsupported 0 ATI 3D-Analyze
+ATI ASUS A9xxx supported 1 ATI ASUS A9xxx
+ATI ASUS AH24xx supported 1 ATI ASUS AH24xx
+ATI ASUS AH26xx supported 3 ATI ASUS AH26xx
+ATI ASUS AH34xx supported 1 ATI ASUS AH34xx
+ATI ASUS AH36xx supported 3 ATI ASUS AH36xx
+ATI ASUS AH46xx supported 3 ATI ASUS AH46xx
+ATI ASUS AX3xx supported 1 ATI ASUS AX3xx
+ATI ASUS AX5xx supported 1 ATI ASUS AX5xx
+ATI ASUS AX8xx supported 2 ATI ASUS AX8xx
+ATI ASUS EAH38xx supported 3 ATI ASUS EAH38xx
+ATI ASUS EAH43xx supported 1 ATI ASUS EAH43xx
+ATI ASUS EAH45xx supported 1 ATI ASUS EAH45xx
+ATI ASUS EAH48xx supported 3 ATI ASUS EAH48xx
+ATI ASUS EAH57xx supported 3 ATI ASUS EAH57xx
+ATI ASUS EAH58xx supported 3 ATI ASUS EAH58xx
+ATI ASUS X1xxx supported 3 ATI ASUS Radeon X1xxx
+ATI All-in-Wonder 9xxx supported 1 ATI All-in-Wonder 9xxx
+ATI All-in-Wonder HD supported 1 ATI All-in-Wonder HD
+ATI All-in-Wonder PCI-E supported 1 ATI All-in-Wonder PCI-E
+ATI All-in-Wonder X1800 supported 3 ATI All-in-Wonder X1800
+ATI All-in-Wonder X1900 supported 3 ATI All-in-Wonder X1900
+ATI All-in-Wonder X600 supported 1 ATI All-in-Wonder X600
+ATI All-in-Wonder X800 supported 2 ATI All-in-Wonder X800
+ATI Diamond X1xxx supported 1 ATI Radeon X1xxx
+ATI Display Adapter supported 0 ATI Display Adapter
+ATI FireGL supported 0 ATI FireGL
+ATI FireGL 5200 supported 0 ATI FireGL
+ATI FireGL 5xxx supported 0 ATI FireGL
+ATI FireMV supported 0 ATI FireMV
+ATI Generic unsupported 0 ATI Generic
+ATI Hercules 9800 supported 1 ATI Hercules 9800
+ATI IGP 340M unsupported 0 ATI IGP 340M
+ATI M52 supported 1 ATI M52
+ATI M54 supported 1 ATI M54
+ATI M56 supported 1 ATI M56
+ATI M71 supported 1 ATI M71
+ATI M72 supported 1 ATI M72
+ATI M76 supported 3 ATI M76
+ATI Mobility Radeon supported 0 ATI Radeon
+ATI Mobility Radeon 7xxx supported 0 ATI Mobility Radeon 7xxx
+ATI Mobility Radeon 9600 supported 0 ATI Mobility Radeon 9600
+ATI Mobility Radeon 9700 supported 1 ATI Mobility Radeon 9700
+ATI Mobility Radeon 9800 supported 1 ATI Mobility Radeon 9800
+ATI Mobility Radeon HD 2300 supported 1 ATI Mobility Radeon HD 2300
+ATI Mobility Radeon HD 2400 supported 1 ATI Mobility Radeon HD 2400
+ATI Mobility Radeon HD 2600 supported 3 ATI Mobility Radeon HD 2600
+ATI Mobility Radeon HD 2700 supported 3 ATI Mobility Radeon HD 2700
+ATI Mobility Radeon HD 3400 supported 2 ATI Mobility Radeon HD 3400
+ATI Mobility Radeon HD 3600 supported 3 ATI Mobility Radeon HD 3600
+ATI Mobility Radeon HD 3800 supported 3 ATI Mobility Radeon HD 3800
+ATI Mobility Radeon HD 4200 supported 2 ATI Mobility Radeon HD 4200
+ATI Mobility Radeon HD 4300 supported 2 ATI Mobility Radeon HD 4300
+ATI Mobility Radeon HD 4500 supported 3 ATI Mobility Radeon HD 4500
+ATI Mobility Radeon HD 4600 supported 3 ATI Mobility Radeon HD 4600
+ATI Mobility Radeon HD 4800 supported 3 ATI Mobility Radeon HD 4800
+ATI Mobility Radeon HD 5400 supported 3 ATI Mobility Radeon HD 5400
+ATI Mobility Radeon HD 5600 supported 3 ATI Mobility Radeon HD 5600
+ATI Mobility Radeon X1xxx supported 1 ATI Radeon X1xxx
+ATI Mobility Radeon X2xxx supported 1 ATI Radeon X2xxx
+ATI Mobility Radeon X3xx supported 0 ATI Radeon X300
+ATI Mobility Radeon X6xx supported 1 ATI Radeon X600
+ATI Mobility Radeon X7xx supported 1 ATI Radeon X700
+ATI Mobility Radeon Xxxx supported 0 ATI Radeon
+ATI RV380 supported 0 ATI RV380
+ATI RV530 supported 1 ATI RV530
+ATI Radeon 2100 supported 0 ATI Radeon 2100
+ATI Radeon 3000 supported 0 ATI Radeon 3000
+ATI Radeon 3100 supported 1 ATI Radeon 3100
+ATI Radeon 7000 supported 0 ATI Radeon 7xxx
+ATI Radeon 7xxx supported 0 ATI Radeon 7xxx
+ATI Radeon 8xxx supported 0 ATI Radeon 8xxx
+ATI Radeon 9000 supported 0 ATI Radeon 9000
+ATI Radeon 9100 supported 0 ATI Radeon 9100
+ATI Radeon 9200 supported 0 ATI Radeon 9200
+ATI Radeon 9500 supported 0 ATI Radeon 9500
+ATI Radeon 9600 supported 0 ATI Radeon 9600
+ATI Radeon 9700 supported 1 ATI Radeon 9700
+ATI Radeon 9800 supported 1 ATI Radeon 9800
+ATI Radeon HD 2300 supported 0 ATI Radeon HD 2300
+ATI Radeon HD 2400 supported 1 ATI Radeon HD 2400
+ATI Radeon HD 2600 supported 2 ATI Radeon HD 2600
+ATI Radeon HD 2900 supported 3 ATI Radeon HD 2900
+ATI Radeon HD 3000 supported 0 ATI Radeon HD 3000
+ATI Radeon HD 3100 supported 1 ATI Radeon HD 3100
+ATI Radeon HD 3200 supported 1 ATI Radeon HD 3200
+ATI Radeon HD 3300 supported 1 ATI Radeon HD 3300
+ATI Radeon HD 3400 supported 1 ATI Radeon HD 3400
+ATI Radeon HD 3600 supported 3 ATI Radeon HD 3600
+ATI Radeon HD 3800 supported 3 ATI Radeon HD 3800
+ATI Radeon HD 4200 supported 1 ATI Radeon HD 4200
+ATI Radeon HD 4300 supported 1 ATI Radeon HD 4300
+ATI Radeon HD 4500 supported 3 ATI Radeon HD 4500
+ATI Radeon HD 4600 supported 3 ATI Radeon HD 4600
+ATI Radeon HD 4700 supported 3 ATI Radeon HD 4700
+ATI Radeon HD 4800 supported 3 ATI Radeon HD 4800
+ATI Radeon HD 5400 supported 3 ATI Radeon HD 5400
+ATI Radeon HD 5500 supported 3 ATI Radeon HD 5500
+ATI Radeon HD 5600 supported 3 ATI Radeon HD 5600
+ATI Radeon HD 5700 supported 3 ATI Radeon HD 5700
+ATI Radeon HD 5800 supported 3 ATI Radeon HD 5800
+ATI Radeon HD 5900 supported 3 ATI Radeon HD 5900
+ATI Radeon HD 6200 supported 3 ATI Radeon HD 6200
+ATI Radeon HD 6300 supported 3 ATI Radeon HD 6300
+ATI Radeon HD 6500 supported 3 ATI Radeon HD 6500
+ATI Radeon HD 6800 supported 3 ATI Radeon HD 6800
+ATI Radeon HD 6900 supported 3 ATI Radeon HD 6900
+ATI Radeon OpenGL unsupported 0 ATI Radeon OpenGL
+ATI Radeon RV250 supported 0 ATI Radeon RV250
+ATI Radeon RV600 supported 1 ATI Radeon RV600
+ATI Radeon RX9550 supported 1 ATI Radeon RX9550
+ATI Radeon VE unsupported 0 ATI Radeon VE
+ATI Radeon X1000 supported 1 ATI Radeon X1xxx
+ATI Radeon X1200 supported 1 ATI Radeon X1xxx
+ATI Radeon X1300 supported 1 ATI Radeon X13xx
+ATI Radeon X13xx supported 1 ATI Radeon X13xx
+ATI Radeon X1400 supported 1 ATI Radeon X1xxx
+ATI Radeon X1500 supported 2 ATI Radeon X15xx
+ATI Radeon X1600 supported 2 ATI Radeon X16xx
+ATI Radeon X16xx supported 2 ATI Radeon X16xx
+ATI Radeon X1700 supported 2 ATI Radeon X17xx
+ATI Radeon X1800 supported 3 ATI Radeon X18xx
+ATI Radeon X1900 supported 3 ATI Radeon X19xx
+ATI Radeon X19xx supported 3 ATI Radeon X19xx
+ATI Radeon X1xxx supported 1 ATI Radeon X1xxx
+ATI Radeon X300 supported 0 ATI Radeon X300
+ATI Radeon X500 supported 0 ATI Radeon X500
+ATI Radeon X600 supported 1 ATI Radeon X600
+ATI Radeon X700 supported 1 ATI Radeon X700
+ATI Radeon X7xx supported 1 ATI Radeon X700
+ATI Radeon X800 supported 2 ATI Radeon X800
+ATI Radeon Xpress supported 0 ATI Radeon Xpress
+ATI Rage 128 supported 0 ATI Rage 128
+ATI Technologies Inc. supported 0 ATI Technologies
+ATI Technologies Inc. x86 supported 0 ATI Technologies
+ATI Technologies Inc. x86/SSE2 supported 0 ATI Technologies
+ATI Technologies Inc. (Vista) ATI Mobility Radeon HD 5730 supported 3 ATI Mobility Radeon HD 5700
+ATI Technologies Inc. 128MB ATI Radeon X1300 x86/SSE2 supported 1 ATI Radeon X13xx
+ATI Technologies Inc. 256MB ATI Radeon X1300PRO x86/SSE2 supported 1 ATI Radeon X13xx
+ATI Technologies Inc. AMD 760G supported 1 ATI 760G/Radeon 3000
+ATI Technologies Inc. AMD 760G (Microsoft WDDM 1.1) supported 1 ATI 760G/Radeon 3000
+ATI Technologies Inc. AMD 780L supported 1 ATI 780L/Radeon 3000
+ATI Technologies Inc. AMD FirePro 2270 supported 1 ATI FirePro 2000
+ATI Technologies Inc. AMD M860G with ATI Mobility Radeon 4100 supported 1 ATI Mobility Radeon 4100
+ATI Technologies Inc. AMD M880G with ATI Mobility Radeon HD 4200 supported 2 ATI Mobility Radeon HD 4200
+ATI Technologies Inc. AMD M880G with ATI Mobility Radeon HD 4250 supported 2 ATI Mobility Radeon HD 4200
+ATI Technologies Inc. AMD RADEON HD 6350 supported 3 ATI Radeon HD 6300
+ATI Technologies Inc. AMD RADEON HD 6450 supported 3 ATI Radeon HD 6400
+ATI Technologies Inc. AMD RADEON HD 6670 supported 3 ATI Radeon HD 6600
+ATI Technologies Inc. AMD Radeon 6600M and 6700M Series supported 0 ATI Technologies
+ATI Technologies Inc. AMD Radeon HD 6200 series Graphics supported 3 ATI Radeon HD 6200
+ATI Technologies Inc. AMD Radeon HD 6250 Graphics supported 3 ATI Radeon HD 6200
+ATI Technologies Inc. AMD Radeon HD 6290 Graphics supported 3 ATI Radeon HD 6200
+ATI Technologies Inc. AMD Radeon HD 6300 series Graphics supported 3 ATI Radeon HD 6300
+ATI Technologies Inc. AMD Radeon HD 6300M Series supported 3 ATI Radeon HD 6300
+ATI Technologies Inc. AMD Radeon HD 6310 Graphics supported 3 ATI Radeon HD 6300
+ATI Technologies Inc. AMD Radeon HD 6310M supported 3 ATI Radeon HD 6300
+ATI Technologies Inc. AMD Radeon HD 6330M supported 3 ATI Radeon HD 6300
+ATI Technologies Inc. AMD Radeon HD 6350 supported 3 ATI Radeon HD 6300
+ATI Technologies Inc. AMD Radeon HD 6370M supported 3 ATI Radeon HD 6300
+ATI Technologies Inc. AMD Radeon HD 6400M Series supported 3 ATI Radeon HD 64xx
+ATI Technologies Inc. AMD Radeon HD 6450 supported 3 ATI Radeon HD 6400
+ATI Technologies Inc. AMD Radeon HD 6470M supported 3 ATI Radeon HD 64xx
+ATI Technologies Inc. AMD Radeon HD 6490M supported 3 ATI Radeon HD 64xx
+ATI Technologies Inc. AMD Radeon HD 6500 Series supported 3 ATI Radeon HD 6500
+ATI Technologies Inc. AMD Radeon HD 6500M Series supported 3 ATI Radeon HD 65xx
+ATI Technologies Inc. AMD Radeon HD 6500M/5600/5700 Series supported 3 ATI Radeon HD 65xx
+ATI Technologies Inc. AMD Radeon HD 6530M supported 3 ATI Radeon HD 65xx
+ATI Technologies Inc. AMD Radeon HD 6550M supported 3 ATI Radeon HD 65xx
+ATI Technologies Inc. AMD Radeon HD 6570 supported 3 ATI Radeon HD 6500
+ATI Technologies Inc. AMD Radeon HD 6570M supported 3 ATI Radeon HD 65xx
+ATI Technologies Inc. AMD Radeon HD 6570M/5700 Series supported 3 ATI Radeon HD 65xx
+ATI Technologies Inc. AMD Radeon HD 6600 Series supported 3 ATI Radeon HD 6600
+ATI Technologies Inc. AMD Radeon HD 6600M Series supported 3 ATI Radeon HD 66xx
+ATI Technologies Inc. AMD Radeon HD 6630M supported 3 ATI Radeon HD 66xx
+ATI Technologies Inc. AMD Radeon HD 6650M supported 3 ATI Radeon HD 66xx
+ATI Technologies Inc. AMD Radeon HD 6670 supported 3 ATI Radeon HD 6600
+ATI Technologies Inc. AMD Radeon HD 6700 Series supported 3 ATI Radeon HD 6700
+ATI Technologies Inc. AMD Radeon HD 6750 supported 3 ATI Radeon HD 6700
+ATI Technologies Inc. AMD Radeon HD 6750M supported 3 ATI Radeon HD 6700
+ATI Technologies Inc. AMD Radeon HD 6770 supported 3 ATI Radeon HD 6700
+ATI Technologies Inc. AMD Radeon HD 6770M supported 3 ATI Radeon HD 6700
+ATI Technologies Inc. AMD Radeon HD 6800 Series supported 3 ATI Radeon HD 6800
+ATI Technologies Inc. AMD Radeon HD 6800M Series supported 3 ATI Radeon HD 6800
+ATI Technologies Inc. AMD Radeon HD 6850 supported 3 ATI Radeon HD 6800
+ATI Technologies Inc. AMD Radeon HD 6850M supported 3 ATI Radeon HD 6800
+ATI Technologies Inc. AMD Radeon HD 6870 supported 3 ATI Radeon HD 6800
+ATI Technologies Inc. AMD Radeon HD 6870M supported 3 ATI Radeon HD 6800
+ATI Technologies Inc. AMD Radeon HD 6900 Series supported 3 ATI Radeon HD 6900
+ATI Technologies Inc. AMD Radeon HD 6900M Series supported 3 ATI Radeon HD 6900
+ATI Technologies Inc. AMD Radeon HD 6970M supported 3 ATI Radeon HD 6900
+ATI Technologies Inc. AMD Radeon HD 6990 supported 3 ATI Radeon HD 6900
+ATI Technologies Inc. AMD Radeon(TM) HD 6470M supported 3 ATI Radeon HD 64xx
+ATI Technologies Inc. AMD Radeon(TM) HD 6480G supported 3 ATI Radeon HD 64xx
+ATI Technologies Inc. AMD Radeon(TM) HD 6520G supported 3 ATI Radeon HD 65xx
+ATI Technologies Inc. AMD Radeon(TM) HD 6620G supported 3 ATI Radeon HD 66xx
+ATI Technologies Inc. AMD Radeon(TM) HD 6630M supported 3 ATI Radeon HD 66xx
+ATI Technologies Inc. ASUS 5870 Eyefinity 6 supported 0 ATI Technologies
+ATI Technologies Inc. ASUS A9550 Series supported 1 ATI ASUS A9xxx
+ATI Technologies Inc. ASUS AH2600 Series supported 3 ATI ASUS AH26xx
+ATI Technologies Inc. ASUS AH3450 Series supported 1 ATI ASUS AH34xx
+ATI Technologies Inc. ASUS AH3650 Series supported 3 ATI ASUS AH36xx
+ATI Technologies Inc. ASUS AH4650 Series supported 3 ATI ASUS AH46xx
+ATI Technologies Inc. ASUS ARES supported 3 ATI ASUS ARES
+ATI Technologies Inc. ASUS EAH2900 Series supported 3 ATI ASUS EAH29xx
+ATI Technologies Inc. ASUS EAH3450 Series supported 1 ATI ASUS AH34xx
+ATI Technologies Inc. ASUS EAH3650 Series supported 3 ATI ASUS AH36xx
+ATI Technologies Inc. ASUS EAH4350 series supported 1 ATI ASUS EAH43xx
+ATI Technologies Inc. ASUS EAH4550 series supported 1 ATI ASUS EAH45xx
+ATI Technologies Inc. ASUS EAH4650 series supported 3 ATI ASUS AH46xx
+ATI Technologies Inc. ASUS EAH4670 series supported 3 ATI ASUS AH46xx
+ATI Technologies Inc. ASUS EAH4750 Series supported 0 ATI Technologies
+ATI Technologies Inc. ASUS EAH4770 Series supported 0 ATI Technologies
+ATI Technologies Inc. ASUS EAH4770 series supported 0 ATI Technologies
+ATI Technologies Inc. ASUS EAH4850 series supported 3 ATI ASUS EAH48xx
+ATI Technologies Inc. ASUS EAH5450 Series supported 0 ATI Technologies
+ATI Technologies Inc. ASUS EAH5550 Series supported 0 ATI Technologies
+ATI Technologies Inc. ASUS EAH5570 series supported 0 ATI Technologies
+ATI Technologies Inc. ASUS EAH5670 Series supported 0 ATI Technologies
+ATI Technologies Inc. ASUS EAH5750 Series supported 3 ATI ASUS EAH57xx
+ATI Technologies Inc. ASUS EAH5770 Series supported 3 ATI ASUS EAH57xx
+ATI Technologies Inc. ASUS EAH5830 Series supported 3 ATI ASUS EAH58xx
+ATI Technologies Inc. ASUS EAH5850 Series supported 3 ATI ASUS EAH58xx
+ATI Technologies Inc. ASUS EAH5870 Series supported 3 ATI ASUS EAH58xx
+ATI Technologies Inc. ASUS EAH5970 Series supported 0 ATI Technologies
+ATI Technologies Inc. ASUS EAH6450 Series supported 3 ATI ASUS EAH6xxx
+ATI Technologies Inc. ASUS EAH6570 Series supported 3 ATI ASUS EAH6xxx
+ATI Technologies Inc. ASUS EAH6670 Series supported 3 ATI ASUS EAH6xxx
+ATI Technologies Inc. ASUS EAH6850 Series supported 3 ATI ASUS EAH6xxx
+ATI Technologies Inc. ASUS EAH6870 Series supported 3 ATI ASUS EAH6xxx
+ATI Technologies Inc. ASUS EAH6950 Series supported 3 ATI ASUS EAH6xxx
+ATI Technologies Inc. ASUS EAH6970 Series supported 3 ATI ASUS EAH6xxx
+ATI Technologies Inc. ASUS EAHG4670 series supported 0 ATI Technologies
+ATI Technologies Inc. ASUS Extreme AX600 Series supported 0 ATI Technologies
+ATI Technologies Inc. ASUS Extreme AX600XT-TD supported 0 ATI Technologies
+ATI Technologies Inc. ASUS X1300 Series x86/SSE2 supported 3 ATI ASUS Radeon X1xxx
+ATI Technologies Inc. ASUS X1550 Series supported 3 ATI ASUS Radeon X1xxx
+ATI Technologies Inc. ASUS X1950 Series x86/SSE2 supported 3 ATI ASUS Radeon X1xxx
+ATI Technologies Inc. ASUS X800 Series supported 0 ATI Technologies
+ATI Technologies Inc. ASUS X850 Series supported 0 ATI Technologies
+ATI Technologies Inc. ATI All-in-Wonder HD supported 1 ATI All-in-Wonder HD
+ATI Technologies Inc. ATI FirePro 2260 supported 1 ATI FirePro 2000
+ATI Technologies Inc. ATI FirePro 2450 supported 1 ATI FirePro 2000
+ATI Technologies Inc. ATI FirePro M5800 supported 3 ATI FirePro M5800
+ATI Technologies Inc. ATI FirePro M7740 supported 3 ATI FirePro M7740
+ATI Technologies Inc. ATI FirePro M7820 supported 3 ATI FirePro M7820
+ATI Technologies Inc. ATI FirePro V3700 (FireGL) supported 0 ATI FireGL
+ATI Technologies Inc. ATI FirePro V3800 supported 1 ATI FirePro 3000
+ATI Technologies Inc. ATI FirePro V4800 supported 2 ATI FirePro 4000
+ATI Technologies Inc. ATI FirePro V4800 (FireGL) supported 0 ATI FireGL
+ATI Technologies Inc. ATI FirePro V5800 supported 3 ATI FirePro 5000
+ATI Technologies Inc. ATI FirePro V7800 supported 3 ATI FirePro 7000
+ATI Technologies Inc. ATI MOBILITY RADEON 9600/9700 Series supported 1 ATI Mobility Radeon 9700
+ATI Technologies Inc. ATI MOBILITY RADEON 9XXX x86/SSE2 supported 0 ATI Technologies
+ATI Technologies Inc. ATI MOBILITY RADEON HD 2300 supported 1 ATI Mobility Radeon HD 2300
+ATI Technologies Inc. ATI MOBILITY RADEON HD 3450 supported 2 ATI Mobility Radeon HD 3400
+ATI Technologies Inc. ATI MOBILITY RADEON HD 3650 supported 3 ATI Mobility Radeon HD 3600
+ATI Technologies Inc. ATI MOBILITY RADEON X1600 supported 2 ATI Radeon X16xx
+ATI Technologies Inc. ATI MOBILITY RADEON X2300 supported 1 ATI Radeon X2xxx
+ATI Technologies Inc. ATI MOBILITY RADEON X2300 HD x86/SSE2 supported 1 ATI Radeon X2xxx
+ATI Technologies Inc. ATI MOBILITY RADEON X2300 x86/MMX/3DNow!/SSE2 supported 1 ATI Radeon X2xxx
+ATI Technologies Inc. ATI MOBILITY RADEON X2300 x86/SSE2 supported 1 ATI Radeon X2xxx
+ATI Technologies Inc. ATI MOBILITY RADEON X300 supported 0 ATI Radeon X300
+ATI Technologies Inc. ATI MOBILITY RADEON X600 supported 1 ATI Radeon X600
+ATI Technologies Inc. ATI MOBILITY RADEON X700 supported 1 ATI Radeon X700
+ATI Technologies Inc. ATI MOBILITY RADEON XPRESS 200 supported 0 ATI Radeon Xpress
+ATI Technologies Inc. ATI Mobility FireGL V5700 supported 1 ATI FireGL 5xxx
+ATI Technologies Inc. ATI Mobility Radeon 4100 supported 1 ATI Mobility Radeon 4100
+ATI Technologies Inc. ATI Mobility Radeon Graphics supported 0 ATI Technologies
+ATI Technologies Inc. ATI Mobility Radeon HD 2300 supported 1 ATI Mobility Radeon HD 2300
+ATI Technologies Inc. ATI Mobility Radeon HD 2400 supported 1 ATI Mobility Radeon HD 2400
+ATI Technologies Inc. ATI Mobility Radeon HD 2400 XT supported 1 ATI Mobility Radeon HD 2400
+ATI Technologies Inc. ATI Mobility Radeon HD 2600 supported 3 ATI Mobility Radeon HD 2600
+ATI Technologies Inc. ATI Mobility Radeon HD 2600 XT supported 3 ATI Mobility Radeon HD 2600
+ATI Technologies Inc. ATI Mobility Radeon HD 2700 supported 3 ATI Mobility Radeon HD 2700
+ATI Technologies Inc. ATI Mobility Radeon HD 3400 Series supported 2 ATI Mobility Radeon HD 3400
+ATI Technologies Inc. ATI Mobility Radeon HD 3410 supported 2 ATI Mobility Radeon HD 3400
+ATI Technologies Inc. ATI Mobility Radeon HD 3430 supported 2 ATI Mobility Radeon HD 3400
+ATI Technologies Inc. ATI Mobility Radeon HD 3450 supported 2 ATI Mobility Radeon HD 3400
+ATI Technologies Inc. ATI Mobility Radeon HD 3470 supported 2 ATI Mobility Radeon HD 3400
+ATI Technologies Inc. ATI Mobility Radeon HD 3470 Hybrid X2 supported 2 ATI Mobility Radeon HD 3400
+ATI Technologies Inc. ATI Mobility Radeon HD 3650 supported 3 ATI Mobility Radeon HD 3600
+ATI Technologies Inc. ATI Mobility Radeon HD 3670 supported 3 ATI Mobility Radeon HD 3600
+ATI Technologies Inc. ATI Mobility Radeon HD 4200 supported 2 ATI Mobility Radeon HD 4200
+ATI Technologies Inc. ATI Mobility Radeon HD 4200 Series supported 2 ATI Mobility Radeon HD 4200
+ATI Technologies Inc. ATI Mobility Radeon HD 4225 supported 2 ATI Mobility Radeon HD 4200
+ATI Technologies Inc. ATI Mobility Radeon HD 4225 Series supported 2 ATI Mobility Radeon HD 4200
+ATI Technologies Inc. ATI Mobility Radeon HD 4250 supported 2 ATI Mobility Radeon HD 4200
+ATI Technologies Inc. ATI Mobility Radeon HD 4250 Graphics supported 2 ATI Mobility Radeon HD 4200
+ATI Technologies Inc. ATI Mobility Radeon HD 4250 Series supported 2 ATI Mobility Radeon HD 4200
+ATI Technologies Inc. ATI Mobility Radeon HD 4270 supported 2 ATI Mobility Radeon HD 4200
+ATI Technologies Inc. ATI Mobility Radeon HD 4300 Series supported 2 ATI Mobility Radeon HD 4300
+ATI Technologies Inc. ATI Mobility Radeon HD 4300/4500 Series supported 2 ATI Mobility Radeon HD 4300
+ATI Technologies Inc. ATI Mobility Radeon HD 4330 supported 2 ATI Mobility Radeon HD 4300
+ATI Technologies Inc. ATI Mobility Radeon HD 4330 Series supported 2 ATI Mobility Radeon HD 4300
+ATI Technologies Inc. ATI Mobility Radeon HD 4350 supported 2 ATI Mobility Radeon HD 4300
+ATI Technologies Inc. ATI Mobility Radeon HD 4350 Series supported 2 ATI Mobility Radeon HD 4300
+ATI Technologies Inc. ATI Mobility Radeon HD 4500 Series supported 3 ATI Mobility Radeon HD 4500
+ATI Technologies Inc. ATI Mobility Radeon HD 4500/5100 Series supported 3 ATI Mobility Radeon HD 4500
+ATI Technologies Inc. ATI Mobility Radeon HD 4530 supported 3 ATI Mobility Radeon HD 4500
+ATI Technologies Inc. ATI Mobility Radeon HD 4530 Series supported 3 ATI Mobility Radeon HD 4500
+ATI Technologies Inc. ATI Mobility Radeon HD 4550 supported 3 ATI Mobility Radeon HD 4500
+ATI Technologies Inc. ATI Mobility Radeon HD 4570 supported 3 ATI Mobility Radeon HD 4500
+ATI Technologies Inc. ATI Mobility Radeon HD 4600 Series supported 3 ATI Mobility Radeon HD 4600
+ATI Technologies Inc. ATI Mobility Radeon HD 4650 supported 3 ATI Mobility Radeon HD 4600
+ATI Technologies Inc. ATI Mobility Radeon HD 4650 Series supported 3 ATI Mobility Radeon HD 4600
+ATI Technologies Inc. ATI Mobility Radeon HD 4670 supported 3 ATI Mobility Radeon HD 4600
+ATI Technologies Inc. ATI Mobility Radeon HD 4830 Series supported 3 ATI Mobility Radeon HD 4800
+ATI Technologies Inc. ATI Mobility Radeon HD 4850 supported 3 ATI Mobility Radeon HD 4800
+ATI Technologies Inc. ATI Mobility Radeon HD 4870 supported 3 ATI Mobility Radeon HD 4800
+ATI Technologies Inc. ATI Mobility Radeon HD 5000 supported 0 ATI Technologies
+ATI Technologies Inc. ATI Mobility Radeon HD 5000 Series supported 0 ATI Technologies
+ATI Technologies Inc. ATI Mobility Radeon HD 5145 supported 3 ATI Mobility Radeon HD 5100
+ATI Technologies Inc. ATI Mobility Radeon HD 5165 supported 3 ATI Mobility Radeon HD 5100
+ATI Technologies Inc. ATI Mobility Radeon HD 530v supported 1 ATI Mobility Radeon HD 530v
+ATI Technologies Inc. ATI Mobility Radeon HD 5400 Series supported 3 ATI Mobility Radeon HD 5400
+ATI Technologies Inc. ATI Mobility Radeon HD 540v supported 2 ATI Mobility Radeon HD 540v
+ATI Technologies Inc. ATI Mobility Radeon HD 5430 supported 3 ATI Mobility Radeon HD 5400
+ATI Technologies Inc. ATI Mobility Radeon HD 5450 supported 3 ATI Mobility Radeon HD 5400
+ATI Technologies Inc. ATI Mobility Radeon HD 5450 Series supported 3 ATI Mobility Radeon HD 5400
+ATI Technologies Inc. ATI Mobility Radeon HD 545v supported 2 ATI Mobility Radeon HD 545v
+ATI Technologies Inc. ATI Mobility Radeon HD 5470 supported 3 ATI Mobility Radeon HD 5400
+ATI Technologies Inc. ATI Mobility Radeon HD 550v supported 2 ATI Mobility Radeon HD 550v
+ATI Technologies Inc. ATI Mobility Radeon HD 5600/5700 Series supported 3 ATI Mobility Radeon HD 5600
+ATI Technologies Inc. ATI Mobility Radeon HD 560v supported 2 ATI Mobility Radeon HD 560v
+ATI Technologies Inc. ATI Mobility Radeon HD 5650 supported 3 ATI Mobility Radeon HD 5600
+ATI Technologies Inc. ATI Mobility Radeon HD 5700 Series supported 3 ATI Mobility Radeon HD 5700
+ATI Technologies Inc. ATI Mobility Radeon HD 5730 supported 3 ATI Mobility Radeon HD 5700
+ATI Technologies Inc. ATI Mobility Radeon HD 5800 Series supported 3 ATI Radeon HD 5800
+ATI Technologies Inc. ATI Mobility Radeon HD 5830 Series supported 3 ATI Radeon HD 5800
+ATI Technologies Inc. ATI Mobility Radeon HD 5850 supported 3 ATI Radeon HD 5800
+ATI Technologies Inc. ATI Mobility Radeon HD 5870 supported 3 ATI Radeon HD 5800
+ATI Technologies Inc. ATI Mobility Radeon HD 6300 series supported 3 ATI Mobility Radeon HD 6300
+ATI Technologies Inc. ATI Mobility Radeon HD 6370 supported 3 ATI Mobility Radeon HD 6300
+ATI Technologies Inc. ATI Mobility Radeon HD 6470M supported 3 ATI Mobility Radeon HD 6400M
+ATI Technologies Inc. ATI Mobility Radeon HD 6550 supported 3 ATI Mobility Radeon HD 6500M
+ATI Technologies Inc. ATI Mobility Radeon HD 6570 supported 3 ATI Mobility Radeon HD 6500M
+ATI Technologies Inc. ATI Mobility Radeon X1300 supported 1 ATI Radeon X13xx
+ATI Technologies Inc. ATI Mobility Radeon X1300 x86/MMX/3DNow!/SSE2 supported 1 ATI Radeon X13xx
+ATI Technologies Inc. ATI Mobility Radeon X1300 x86/SSE2 supported 1 ATI Radeon X13xx
+ATI Technologies Inc. ATI Mobility Radeon X1350 supported 1 ATI Radeon X13xx
+ATI Technologies Inc. ATI Mobility Radeon X1350 x86/SSE2 supported 1 ATI Radeon X13xx
+ATI Technologies Inc. ATI Mobility Radeon X1400 supported 1 ATI Radeon X1xxx
+ATI Technologies Inc. ATI Mobility Radeon X1400 x86/SSE2 supported 1 ATI Radeon X1xxx
+ATI Technologies Inc. ATI Mobility Radeon X1600 supported 2 ATI Radeon X16xx
+ATI Technologies Inc. ATI Mobility Radeon X1600 x86/SSE2 supported 2 ATI Radeon X16xx
+ATI Technologies Inc. ATI Mobility Radeon X1700 x86/SSE2 supported 2 ATI Radeon X17xx
+ATI Technologies Inc. ATI Mobility Radeon X2300 supported 1 ATI Radeon X2xxx
+ATI Technologies Inc. ATI Mobility Radeon X2300 (Omega 3.8.442) supported 1 ATI Radeon X2xxx
+ATI Technologies Inc. ATI Mobility Radeon X2300 x86 supported 1 ATI Radeon X2xxx
+ATI Technologies Inc. ATI Mobility Radeon X2300 x86/MMX/3DNow!/SSE2 supported 1 ATI Radeon X2xxx
+ATI Technologies Inc. ATI Mobility Radeon X2300 x86/SSE2 supported 1 ATI Radeon X2xxx
+ATI Technologies Inc. ATI Mobility Radeon X2500 supported 1 ATI Radeon X2xxx
+ATI Technologies Inc. ATI Mobility Radeon X2500 x86/SSE2 supported 1 ATI Radeon X2xxx
+ATI Technologies Inc. ATI Mobility Radeon. HD 530v supported 1 ATI Mobility Radeon HD 530v
+ATI Technologies Inc. ATI Mobility Radeon. HD 5470 supported 3 ATI Mobility Radeon HD 5400
+ATI Technologies Inc. ATI RADEON HD 3200 T25XX by CAMILO supported 1 ATI Radeon HD 3200
+ATI Technologies Inc. ATI RADEON XPRESS 1100 supported 0 ATI Radeon Xpress
+ATI Technologies Inc. ATI RADEON XPRESS 1100 x86/SSE2 supported 0 ATI Radeon Xpress
+ATI Technologies Inc. ATI RADEON XPRESS 200 Series supported 0 ATI Radeon Xpress
+ATI Technologies Inc. ATI RADEON XPRESS 200 Series x86/SSE2 supported 0 ATI Radeon Xpress
+ATI Technologies Inc. ATI RADEON XPRESS 200M SERIES supported 0 ATI Radeon Xpress
+ATI Technologies Inc. ATI Radeon supported 0 ATI Technologies
+ATI Technologies Inc. ATI Radeon 2100 supported 0 ATI Radeon 2100
+ATI Technologies Inc. ATI Radeon 2100 (Microsoft - WDDM) supported 0 ATI Radeon 2100
+ATI Technologies Inc. ATI Radeon 2100 Graphics supported 0 ATI Radeon 2100
+ATI Technologies Inc. ATI Radeon 3000 supported 0 ATI Radeon 3000
+ATI Technologies Inc. ATI Radeon 3000 Graphics supported 0 ATI Radeon 3000
+ATI Technologies Inc. ATI Radeon 3100 Graphics supported 1 ATI Radeon 3100
+ATI Technologies Inc. ATI Radeon 5xxx series supported 3 ATI Radeon 5xxx
+ATI Technologies Inc. ATI Radeon 9550 / X1050 Series supported 0 ATI Radeon 9500
+ATI Technologies Inc. ATI Radeon 9550 / X1050 Series x86/MMX/3DNow!/SSE supported 0 ATI Radeon 9500
+ATI Technologies Inc. ATI Radeon 9550 / X1050 Series x86/SSE2 supported 0 ATI Radeon 9500
+ATI Technologies Inc. ATI Radeon 9550 / X1050 Series(Microsoft - WDDM) supported 0 ATI Radeon 9500
+ATI Technologies Inc. ATI Radeon 9600 / X1050 Series supported 0 ATI Radeon 9600
+ATI Technologies Inc. ATI Radeon 9600/9550/X1050 Series supported 0 ATI Radeon 9600
+ATI Technologies Inc. ATI Radeon BA Prototype OpenGL Engine supported 0 ATI Technologies
+ATI Technologies Inc. ATI Radeon BB Prototype OpenGL Engine supported 0 ATI Technologies
+ATI Technologies Inc. ATI Radeon Broadway XT Prototype OpenGL Engine supported 0 ATI Technologies
+ATI Technologies Inc. ATI Radeon Cedar PRO Prototype OpenGL Engine supported 2 AMD CEDAR (HD 5450)
+ATI Technologies Inc. ATI Radeon Cypress PRO Prototype OpenGL Engine supported 3 AMD CYPRESS (HD 5800)
+ATI Technologies Inc. ATI Radeon Graphics Processor supported 0 ATI Technologies
+ATI Technologies Inc. ATI Radeon HD 2200 Graphics supported 0 ATI Technologies
+ATI Technologies Inc. ATI Radeon HD 2350 supported 0 ATI Radeon HD 2300
+ATI Technologies Inc. ATI Radeon HD 2400 supported 1 ATI Radeon HD 2400
+ATI Technologies Inc. ATI Radeon HD 2400 OpenGL Engine supported 1 ATI Radeon HD 2400
+ATI Technologies Inc. ATI Radeon HD 2400 PRO supported 1 ATI Radeon HD 2400
+ATI Technologies Inc. ATI Radeon HD 2400 PRO AGP supported 1 ATI Radeon HD 2400
+ATI Technologies Inc. ATI Radeon HD 2400 Pro supported 1 ATI Radeon HD 2400
+ATI Technologies Inc. ATI Radeon HD 2400 Series supported 1 ATI Radeon HD 2400
+ATI Technologies Inc. ATI Radeon HD 2400 XT supported 1 ATI Radeon HD 2400
+ATI Technologies Inc. ATI Radeon HD 2400 XT OpenGL Engine supported 1 ATI Radeon HD 2400
+ATI Technologies Inc. ATI Radeon HD 2600 OpenGL Engine supported 2 ATI Radeon HD 2600
+ATI Technologies Inc. ATI Radeon HD 2600 PRO supported 2 ATI Radeon HD 2600
+ATI Technologies Inc. ATI Radeon HD 2600 PRO OpenGL Engine supported 2 ATI Radeon HD 2600
+ATI Technologies Inc. ATI Radeon HD 2600 Pro supported 2 ATI Radeon HD 2600
+ATI Technologies Inc. ATI Radeon HD 2600 Series supported 2 ATI Radeon HD 2600
+ATI Technologies Inc. ATI Radeon HD 2600 XT supported 2 ATI Radeon HD 2600
+ATI Technologies Inc. ATI Radeon HD 2900 GT supported 3 ATI Radeon HD 2900
+ATI Technologies Inc. ATI Radeon HD 2900 XT supported 3 ATI Radeon HD 2900
+ATI Technologies Inc. ATI Radeon HD 3200 Graphics supported 1 ATI Radeon HD 3200
+ATI Technologies Inc. ATI Radeon HD 3300 Graphics supported 1 ATI Radeon HD 3300
+ATI Technologies Inc. ATI Radeon HD 3400 Series supported 1 ATI Radeon HD 3400
+ATI Technologies Inc. ATI Radeon HD 3450 supported 1 ATI Radeon HD 3400
+ATI Technologies Inc. ATI Radeon HD 3450 - Dell Optiplex supported 1 ATI Radeon HD 3400
+ATI Technologies Inc. ATI Radeon HD 3470 supported 1 ATI Radeon HD 3400
+ATI Technologies Inc. ATI Radeon HD 3470 - Dell Optiplex supported 1 ATI Radeon HD 3400
+ATI Technologies Inc. ATI Radeon HD 3550 supported 1 ATI Radeon HD 3500
+ATI Technologies Inc. ATI Radeon HD 3600 Series supported 3 ATI Radeon HD 3600
+ATI Technologies Inc. ATI Radeon HD 3650 supported 3 ATI Radeon HD 3600
+ATI Technologies Inc. ATI Radeon HD 3650 AGP supported 3 ATI Radeon HD 3600
+ATI Technologies Inc. ATI Radeon HD 3730 supported 3 ATI Radeon HD 3700
+ATI Technologies Inc. ATI Radeon HD 3800 Series supported 3 ATI Radeon HD 3800
+ATI Technologies Inc. ATI Radeon HD 3850 supported 3 ATI Radeon HD 3800
+ATI Technologies Inc. ATI Radeon HD 3850 AGP supported 3 ATI Radeon HD 3800
+ATI Technologies Inc. ATI Radeon HD 3870 supported 3 ATI Radeon HD 3800
+ATI Technologies Inc. ATI Radeon HD 3870 X2 supported 3 ATI Radeon HD 3800
+ATI Technologies Inc. ATI Radeon HD 4200 supported 1 ATI Radeon HD 4200
+ATI Technologies Inc. ATI Radeon HD 4250 supported 1 ATI Radeon HD 4200
+ATI Technologies Inc. ATI Radeon HD 4250 Graphics supported 1 ATI Radeon HD 4200
+ATI Technologies Inc. ATI Radeon HD 4270 supported 1 ATI Radeon HD 4200
+ATI Technologies Inc. ATI Radeon HD 4290 supported 1 ATI Radeon HD 4200
+ATI Technologies Inc. ATI Radeon HD 4290 (Engineering Sample) supported 1 ATI Radeon HD 4200
+ATI Technologies Inc. ATI Radeon HD 4300 Series supported 1 ATI Radeon HD 4300
+ATI Technologies Inc. ATI Radeon HD 4300/4500 Series supported 1 ATI Radeon HD 4300
+ATI Technologies Inc. ATI Radeon HD 4350 supported 1 ATI Radeon HD 4300
+ATI Technologies Inc. ATI Radeon HD 4350 (Microsoft WDDM 1.1) supported 1 ATI Radeon HD 4300
+ATI Technologies Inc. ATI Radeon HD 4450 supported 1 ATI Radeon HD 4400
+ATI Technologies Inc. ATI Radeon HD 4500 Series supported 3 ATI Radeon HD 4500
+ATI Technologies Inc. ATI Radeon HD 4550 supported 3 ATI Radeon HD 4500
+ATI Technologies Inc. ATI Radeon HD 4600 Series supported 3 ATI Radeon HD 4600
+ATI Technologies Inc. ATI Radeon HD 4650 supported 3 ATI Radeon HD 4600
+ATI Technologies Inc. ATI Radeon HD 4670 supported 3 ATI Radeon HD 4600
+ATI Technologies Inc. ATI Radeon HD 4670 OpenGL Engine supported 3 ATI Radeon HD 4600
+ATI Technologies Inc. ATI Radeon HD 4700 Series supported 3 ATI Radeon HD 4700
+ATI Technologies Inc. ATI Radeon HD 4720 supported 3 ATI Radeon HD 4700
+ATI Technologies Inc. ATI Radeon HD 4730 supported 3 ATI Radeon HD 4700
+ATI Technologies Inc. ATI Radeon HD 4730 Series supported 3 ATI Radeon HD 4700
+ATI Technologies Inc. ATI Radeon HD 4750 supported 3 ATI Radeon HD 4700
+ATI Technologies Inc. ATI Radeon HD 4770 supported 3 ATI Radeon HD 4700
+ATI Technologies Inc. ATI Radeon HD 4800 Series supported 3 ATI Radeon HD 4800
+ATI Technologies Inc. ATI Radeon HD 4850 supported 3 ATI Radeon HD 4800
+ATI Technologies Inc. ATI Radeon HD 4850 OpenGL Engine supported 3 ATI Radeon HD 4800
+ATI Technologies Inc. ATI Radeon HD 4850 Series supported 3 ATI Radeon HD 4800
+ATI Technologies Inc. ATI Radeon HD 4870 supported 3 ATI Radeon HD 4800
+ATI Technologies Inc. ATI Radeon HD 4870 OpenGL Engine supported 3 ATI Radeon HD 4800
+ATI Technologies Inc. ATI Radeon HD 4870 X2 supported 3 ATI Radeon HD 4800
+ATI Technologies Inc. ATI Radeon HD 5400 Series supported 3 ATI Radeon HD 5400
+ATI Technologies Inc. ATI Radeon HD 5450 supported 3 ATI Radeon HD 5400
+ATI Technologies Inc. ATI Radeon HD 5470 supported 3 ATI Radeon HD 5400
+ATI Technologies Inc. ATI Radeon HD 5500 Series supported 3 ATI Radeon HD 5500
+ATI Technologies Inc. ATI Radeon HD 5570 supported 3 ATI Radeon HD 5500
+ATI Technologies Inc. ATI Radeon HD 5600 Series supported 3 ATI Radeon HD 5600
+ATI Technologies Inc. ATI Radeon HD 5600/5700 supported 3 ATI Radeon HD 5600
+ATI Technologies Inc. ATI Radeon HD 5630 supported 3 ATI Radeon HD 5600
+ATI Technologies Inc. ATI Radeon HD 5670 supported 3 ATI Radeon HD 5600
+ATI Technologies Inc. ATI Radeon HD 5670 OpenGL Engine supported 3 ATI Radeon HD 5600
+ATI Technologies Inc. ATI Radeon HD 5700 Series supported 3 ATI Radeon HD 5700
+ATI Technologies Inc. ATI Radeon HD 5750 supported 3 ATI Radeon HD 5700
+ATI Technologies Inc. ATI Radeon HD 5750 OpenGL Engine supported 3 ATI Radeon HD 5700
+ATI Technologies Inc. ATI Radeon HD 5770 supported 3 ATI Radeon HD 5700
+ATI Technologies Inc. ATI Radeon HD 5770 OpenGL Engine supported 3 ATI Radeon HD 5700
+ATI Technologies Inc. ATI Radeon HD 5800 Series supported 3 ATI Radeon HD 5800
+ATI Technologies Inc. ATI Radeon HD 5850 supported 3 ATI Radeon HD 5800
+ATI Technologies Inc. ATI Radeon HD 5870 supported 3 ATI Radeon HD 5800
+ATI Technologies Inc. ATI Radeon HD 5870 OpenGL Engine supported 3 ATI Radeon HD 5800
+ATI Technologies Inc. ATI Radeon HD 5900 Series supported 3 ATI Radeon HD 5900
+ATI Technologies Inc. ATI Radeon HD 5970 supported 3 ATI Radeon HD 5900
+ATI Technologies Inc. ATI Radeon HD 6230 supported 3 ATI Radeon HD 6200
+ATI Technologies Inc. ATI Radeon HD 6250 supported 3 ATI Radeon HD 6200
+ATI Technologies Inc. ATI Radeon HD 6350 supported 3 ATI Radeon HD 6300
+ATI Technologies Inc. ATI Radeon HD 6390 supported 3 ATI Radeon HD 6300
+ATI Technologies Inc. ATI Radeon HD 6490M OpenGL Engine supported 3 ATI Radeon HD 6400
+ATI Technologies Inc. ATI Radeon HD 6510 supported 3 ATI Radeon HD 6500
+ATI Technologies Inc. ATI Radeon HD 6570M supported 3 ATI Radeon HD 6500
+ATI Technologies Inc. ATI Radeon HD 6630M OpenGL Engine supported 3 ATI Radeon HD 6600
+ATI Technologies Inc. ATI Radeon HD 6750 supported 3 ATI Radeon HD 6700
+ATI Technologies Inc. ATI Radeon HD 6750M OpenGL Engine supported 3 ATI Radeon HD 6700
+ATI Technologies Inc. ATI Radeon HD 6770 supported 3 ATI Radeon HD 6700
+ATI Technologies Inc. ATI Radeon HD 6770M OpenGL Engine supported 3 ATI Radeon HD 6700
+ATI Technologies Inc. ATI Radeon HD 6800 Series supported 3 ATI Radeon HD 6800
+ATI Technologies Inc. ATI Radeon HD 6970M OpenGL Engine supported 3 ATI Radeon HD 6900
+ATI Technologies Inc. ATI Radeon HD3750 supported 3 ATI Radeon HD 3700
+ATI Technologies Inc. ATI Radeon HD4300/HD4500 series supported 1 ATI Radeon HD 4300
+ATI Technologies Inc. ATI Radeon HD4670 supported 3 ATI Radeon HD 4600
+ATI Technologies Inc. ATI Radeon Juniper LE Prototype OpenGL Engine supported 3 AMD JUNIPER (HD 5700)
+ATI Technologies Inc. ATI Radeon RV710 Prototype OpenGL Engine supported 1 AMD RV710 (HD 4300)
+ATI Technologies Inc. ATI Radeon RV730 Prototype OpenGL Engine supported 3 AMD RV730 (HD 4600)
+ATI Technologies Inc. ATI Radeon RV770 Prototype OpenGL Engine supported 3 AMD RV770 (HD 4800)
+ATI Technologies Inc. ATI Radeon RV790 Prototype OpenGL Engine supported 3 AMD RV790 (HD 4800)
+ATI Technologies Inc. ATI Radeon Redwood PRO Prototype OpenGL Engine supported 3 AMD REDWOOD (HD 5500/5600)
+ATI Technologies Inc. ATI Radeon Redwood XT Prototype OpenGL Engine supported 3 AMD REDWOOD (HD 5500/5600)
+ATI Technologies Inc. ATI Radeon Whistler PRO/LP Prototype OpenGL Engine supported 0 ATI Technologies
+ATI Technologies Inc. ATI Radeon X1050 supported 1 ATI Radeon X1xxx
+ATI Technologies Inc. ATI Radeon X1050 Series supported 1 ATI Radeon X1xxx
+ATI Technologies Inc. ATI Radeon X1200 supported 1 ATI Radeon X1xxx
+ATI Technologies Inc. ATI Radeon X1200 Series supported 1 ATI Radeon X1xxx
+ATI Technologies Inc. ATI Radeon X1200 Series x86/MMX/3DNow!/SSE2 supported 1 ATI Radeon X1xxx
+ATI Technologies Inc. ATI Radeon X1250 supported 1 ATI Radeon X1xxx
+ATI Technologies Inc. ATI Radeon X1250 x86/MMX/3DNow!/SSE2 supported 1 ATI Radeon X1xxx
+ATI Technologies Inc. ATI Radeon X1270 supported 1 ATI Radeon X1xxx
+ATI Technologies Inc. ATI Radeon X1270 x86/MMX/3DNow!/SSE2 supported 1 ATI Radeon X1xxx
+ATI Technologies Inc. ATI Radeon X1300/X1550 Series supported 1 ATI Radeon X13xx
+ATI Technologies Inc. ATI Radeon X1550 Series supported 2 ATI Radeon X15xx
+ATI Technologies Inc. ATI Radeon X1600 OpenGL Engine supported 2 ATI Radeon X16xx
+ATI Technologies Inc. ATI Radeon X1900 OpenGL Engine supported 3 ATI Radeon X19xx
+ATI Technologies Inc. ATI Radeon X1950 GT supported 3 ATI Radeon X19xx
+ATI Technologies Inc. ATI Radeon X300/X550/X1050 Series supported 0 ATI Radeon X300
+ATI Technologies Inc. ATI Radeon Xpress 1100 supported 0 ATI Radeon Xpress
+ATI Technologies Inc. ATI Radeon Xpress 1150 supported 0 ATI Radeon Xpress
+ATI Technologies Inc. ATI Radeon Xpress 1150 x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon Xpress
+ATI Technologies Inc. ATI Radeon Xpress 1200 supported 0 ATI Radeon Xpress
+ATI Technologies Inc. ATI Radeon Xpress 1200 Series supported 0 ATI Radeon Xpress
+ATI Technologies Inc. ATI Radeon Xpress 1200 Series x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon Xpress
+ATI Technologies Inc. ATI Radeon Xpress 1200 x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon Xpress
+ATI Technologies Inc. ATI Radeon Xpress 1250 supported 0 ATI Radeon Xpress
+ATI Technologies Inc. ATI Radeon Xpress 1250 x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon Xpress
+ATI Technologies Inc. ATI Radeon Xpress 1250 x86/SSE2 supported 0 ATI Radeon Xpress
+ATI Technologies Inc. ATI Radeon Xpress Series supported 0 ATI Radeon Xpress
+ATI Technologies Inc. ATI Radeon Xpress Series x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon Xpress
+ATI Technologies Inc. ATI Yamaha HD 9000 supported 0 ATI Technologies
+ATI Technologies Inc. ATi RS880M supported 1 ATI RS880M
+ATI Technologies Inc. Carte graphique VGA standard supported 0 ATI Technologies
+ATI Technologies Inc. Diamond Radeon X1550 Series supported 2 ATI Radeon X15xx
+ATI Technologies Inc. EG JUNIPER supported 3 AMD JUNIPER (HD 5700)
+ATI Technologies Inc. EG PARK supported 3 AMD PARK
+ATI Technologies Inc. FireGL V3100 Pentium 4 (SSE2) supported 0 ATI FireGL
+ATI Technologies Inc. FireMV 2400 PCI DDR x86 supported 0 ATI FireMV
+ATI Technologies Inc. FireMV 2400 PCI DDR x86/SSE2 supported 0 ATI FireMV
+ATI Technologies Inc. GeCube Radeon X1550 supported 2 ATI Radeon X15xx
+ATI Technologies Inc. GeForce 9600 GT x86/SSE2 supported 2 ATI Geforce 9600 GT
+ATI Technologies Inc. Geforce 9500 GT supported 2 ATI Geforce 9500 GT
+ATI Technologies Inc. Geforce 9500GT supported 2 ATI Geforce 9500 GT
+ATI Technologies Inc. Geforce 9800 GT supported 2 ATI Geforce 9800 GT
+ATI Technologies Inc. HD3730 supported 0 ATI Technologies
+ATI Technologies Inc. HIGHTECH EXCALIBUR RADEON 9550SE Series supported 0 ATI Radeon 9500
+ATI Technologies Inc. HIGHTECH EXCALIBUR X700 PRO supported 0 ATI Technologies
+ATI Technologies Inc. M21 x86/MMX/3DNow!/SSE2 supported 0 ATI Technologies
+ATI Technologies Inc. M76M supported 3 ATI M76
+ATI Technologies Inc. MOBILITY RADEON 7500 DDR x86/SSE2 supported 0 ATI Mobility Radeon 7xxx
+ATI Technologies Inc. MOBILITY RADEON 9000 DDR x86/SSE2 supported 0 ATI Radeon 9000
+ATI Technologies Inc. MOBILITY RADEON 9000 IGPRADEON 9100 IGP DDR x86/SSE2 supported 0 ATI Radeon 9000
+ATI Technologies Inc. MOBILITY RADEON 9100 IGP DDR x86/SSE2 supported 0 ATI Radeon 9100
+ATI Technologies Inc. MOBILITY RADEON 9600 x86/SSE2 supported 0 ATI Mobility Radeon 9600
+ATI Technologies Inc. MOBILITY RADEON 9700 x86/SSE2 supported 1 ATI Mobility Radeon 9700
+ATI Technologies Inc. MOBILITY RADEON X300 x86/SSE2 supported 0 ATI Radeon X300
+ATI Technologies Inc. MOBILITY RADEON X600 x86/SSE2 supported 1 ATI Radeon X600
+ATI Technologies Inc. MOBILITY RADEON X700 SE x86 supported 1 ATI Radeon X700
+ATI Technologies Inc. MOBILITY RADEON X700 x86/SSE2 supported 1 ATI Radeon X700
+ATI Technologies Inc. MOBILITY RADEON Xpress 200 Series SW TCL x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon Xpress
+ATI Technologies Inc. MSI RX9550SE supported 1 ATI Radeon RX9550
+ATI Technologies Inc. MSI Radeon X1550 Series supported 2 ATI Radeon X15xx
+ATI Technologies Inc. Mobility Radeon HD 6000 series supported 0 ATI Technologies
+ATI Technologies Inc. Mobility Radeon X2300 HD supported 1 ATI Radeon X2xxx
+ATI Technologies Inc. Mobility Radeon X2300 HD x86/SSE2 supported 1 ATI Radeon X2xxx
+ATI Technologies Inc. RADEON 7000 DDR x86/MMX/3DNow!/SSE supported 0 ATI Radeon 7xxx
+ATI Technologies Inc. RADEON 7000 DDR x86/SSE2 supported 0 ATI Radeon 7xxx
+ATI Technologies Inc. RADEON 7500 DDR x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon 7xxx
+ATI Technologies Inc. RADEON 7500 DDR x86/SSE2 supported 0 ATI Radeon 7xxx
+ATI Technologies Inc. RADEON 9100 IGP DDR x86/SSE2 supported 0 ATI Radeon 9100
+ATI Technologies Inc. RADEON 9200 DDR x86/MMX/3DNow!/SSE supported 0 ATI Radeon 9200
+ATI Technologies Inc. RADEON 9200 DDR x86/SSE2 supported 0 ATI Radeon 9200
+ATI Technologies Inc. RADEON 9200 PRO DDR x86/MMX/3DNow!/SSE supported 0 ATI Radeon 9200
+ATI Technologies Inc. RADEON 9200 Series DDR x86/MMX/3DNow!/SSE supported 0 ATI Radeon 9200
+ATI Technologies Inc. RADEON 9200 Series DDR x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon 9200
+ATI Technologies Inc. RADEON 9200 Series DDR x86/SSE supported 0 ATI Radeon 9200
+ATI Technologies Inc. RADEON 9200 Series DDR x86/SSE2 supported 0 ATI Radeon 9200
+ATI Technologies Inc. RADEON 9200SE DDR x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon 9200
+ATI Technologies Inc. RADEON 9200SE DDR x86/SSE2 supported 0 ATI Radeon 9200
+ATI Technologies Inc. RADEON 9250/9200 Series DDR x86/MMX/3DNow!/SSE supported 0 ATI Radeon 9200
+ATI Technologies Inc. RADEON 9250/9200 Series DDR x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon 9200
+ATI Technologies Inc. RADEON 9250/9200 Series DDR x86/SSE2 supported 0 ATI Radeon 9200
+ATI Technologies Inc. RADEON 9500 supported 0 ATI Radeon 9500
+ATI Technologies Inc. RADEON 9550 x86/SSE2 supported 0 ATI Radeon 9500
+ATI Technologies Inc. RADEON 9600 SERIES supported 0 ATI Radeon 9600
+ATI Technologies Inc. RADEON 9600 SERIES x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon 9600
+ATI Technologies Inc. RADEON 9600 SERIES x86/SSE2 supported 0 ATI Radeon 9600
+ATI Technologies Inc. RADEON 9600 TX x86/SSE2 supported 0 ATI Radeon 9600
+ATI Technologies Inc. RADEON 9600 x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon 9600
+ATI Technologies Inc. RADEON 9600 x86/SSE2 supported 0 ATI Radeon 9600
+ATI Technologies Inc. RADEON 9700 PRO x86/MMX/3DNow!/SSE supported 1 ATI Radeon 9700
+ATI Technologies Inc. RADEON 9800 PRO supported 1 ATI Radeon 9800
+ATI Technologies Inc. RADEON 9800 x86/SSE2 supported 1 ATI Radeon 9800
+ATI Technologies Inc. RADEON IGP 340M DDR x86/SSE2 unsupported 0 ATI IGP 340M
+ATI Technologies Inc. RADEON X300 Series x86/SSE2 supported 0 ATI Radeon X300
+ATI Technologies Inc. RADEON X300 x86/SSE2 supported 0 ATI Radeon X300
+ATI Technologies Inc. RADEON X300/X550 Series x86/SSE2 supported 0 ATI Radeon X300
+ATI Technologies Inc. RADEON X550 x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon X500
+ATI Technologies Inc. RADEON X550 x86/SSE2 supported 0 ATI Radeon X500
+ATI Technologies Inc. RADEON X600 Series supported 1 ATI Radeon X600
+ATI Technologies Inc. RADEON X600 x86/SSE2 supported 1 ATI Radeon X600
+ATI Technologies Inc. RADEON X600/X550 Series supported 1 ATI Radeon X600
+ATI Technologies Inc. RADEON X700 PRO x86/SSE2 supported 1 ATI Radeon X700
+ATI Technologies Inc. RADEON X800 SE x86/MMX/3DNow!/SSE2 supported 2 ATI Radeon X800
+ATI Technologies Inc. RADEON X800 XT supported 2 ATI Radeon X800
+ATI Technologies Inc. RADEON X800GT supported 2 ATI Radeon X800
+ATI Technologies Inc. RADEON XPRESS 200 Series SW TCL x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon Xpress
+ATI Technologies Inc. RADEON XPRESS 200 Series SW TCL x86/SSE2 supported 0 ATI Radeon Xpress
+ATI Technologies Inc. RADEON XPRESS 200 Series x86/SSE2 supported 0 ATI Radeon Xpress
+ATI Technologies Inc. RADEON XPRESS 200M Series SW TCL x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon Xpress
+ATI Technologies Inc. RADEON XPRESS 200M Series SW TCL x86/SSE2 supported 0 ATI Radeon Xpress
+ATI Technologies Inc. RADEON XPRESS 200M Series x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon Xpress
+ATI Technologies Inc. RADEON XPRESS 200M Series x86/SSE2 supported 0 ATI Radeon Xpress
+ATI Technologies Inc. RADEON XPRESS Series x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon Xpress
+ATI Technologies Inc. RADEON XPRESS Series x86/SSE2 supported 0 ATI Radeon Xpress
+ATI Technologies Inc. RS740 supported 0 ATI Technologies
+ATI Technologies Inc. RS780C supported 0 AMD RS780 (HD 3200)
+ATI Technologies Inc. RS780M supported 0 AMD RS780 (HD 3200)
+ATI Technologies Inc. RS880 supported 1 AMD RS880 (HD 4200)
+ATI Technologies Inc. RV410 Pro x86/SSE2 supported 1 ATI RV410 (X700)
+ATI Technologies Inc. RV790 supported 3 AMD RV790 (HD 4800)
+ATI Technologies Inc. Radeon (TM) HD 6470M supported 0 ATI Technologies
+ATI Technologies Inc. Radeon (TM) HD 6490M supported 0 ATI Technologies
+ATI Technologies Inc. Radeon (TM) HD 6750M supported 0 ATI Technologies
+ATI Technologies Inc. Radeon (TM) HD 6770M supported 0 ATI Technologies
+ATI Technologies Inc. Radeon (TM) HD 6850M supported 0 ATI Technologies
+ATI Technologies Inc. Radeon 7000 DDR x86/SSE supported 0 ATI Radeon 7xxx
+ATI Technologies Inc. Radeon 7000 DDR x86/SSE2 supported 0 ATI Radeon 7xxx
+ATI Technologies Inc. Radeon 7000 SDR x86/SSE2 supported 0 ATI Radeon 7xxx
+ATI Technologies Inc. Radeon 7500 DDR x86/SSE2 supported 0 ATI Radeon 7xxx
+ATI Technologies Inc. Radeon 9000 DDR x86/SSE2 supported 0 ATI Radeon 9000
+ATI Technologies Inc. Radeon DDR x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon DDR
+ATI Technologies Inc. Radeon DDR x86/SSE supported 0 ATI Radeon DDR
+ATI Technologies Inc. Radeon DDR x86/SSE2 supported 0 ATI Radeon DDR
+ATI Technologies Inc. Radeon HD 6310 supported 3 ATI Radeon HD 6300
+ATI Technologies Inc. Radeon HD 6470M supported 3 ATI Radeon HD 6400
+ATI Technologies Inc. Radeon HD 6490M supported 3 ATI Radeon HD 6400
+ATI Technologies Inc. Radeon HD 6800 Series supported 3 ATI Radeon HD 6800
+ATI Technologies Inc. Radeon SDR x86/SSE2 supported 0 ATI Technologies
+ATI Technologies Inc. Radeon X1300 Series supported 1 ATI Radeon X13xx
+ATI Technologies Inc. Radeon X1300 Series x86/MMX/3DNow!/SSE2 supported 1 ATI Radeon X13xx
+ATI Technologies Inc. Radeon X1300 Series x86/SSE2 supported 1 ATI Radeon X13xx
+ATI Technologies Inc. Radeon X1300/X1550 Series supported 1 ATI Radeon X13xx
+ATI Technologies Inc. Radeon X1300/X1550 Series x86/SSE2 supported 1 ATI Radeon X13xx
+ATI Technologies Inc. Radeon X1550 64-bit (Microsoft - WDDM) supported 2 ATI Radeon X15xx
+ATI Technologies Inc. Radeon X1550 Series supported 2 ATI Radeon X15xx
+ATI Technologies Inc. Radeon X1550 Series x86/SSE2 supported 2 ATI Radeon X15xx
+ATI Technologies Inc. Radeon X1600 supported 2 ATI Radeon X16xx
+ATI Technologies Inc. Radeon X1600 Pro / X1300XT x86/MMX/3DNow!/SSE2 supported 2 ATI Radeon X16xx
+ATI Technologies Inc. Radeon X1600 Series supported 2 ATI Radeon X16xx
+ATI Technologies Inc. Radeon X1600 Series x86/SSE2 supported 2 ATI Radeon X16xx
+ATI Technologies Inc. Radeon X1600/1650 Series supported 2 ATI Radeon X16xx
+ATI Technologies Inc. Radeon X1600/X1650 Series supported 2 ATI Radeon X16xx
+ATI Technologies Inc. Radeon X1650 Series supported 2 ATI Radeon X16xx
+ATI Technologies Inc. Radeon X1650 Series x86/MMX/3DNow!/SSE2 supported 2 ATI Radeon X16xx
+ATI Technologies Inc. Radeon X1650 Series x86/SSE2 supported 2 ATI Radeon X16xx
+ATI Technologies Inc. Radeon X1900 Series x86/MMX/3DNow!/SSE2 supported 3 ATI Radeon X19xx
+ATI Technologies Inc. Radeon X1950 Pro supported 3 ATI Radeon X19xx
+ATI Technologies Inc. Radeon X1950 Pro x86/MMX/3DNow!/SSE2 supported 3 ATI Radeon X19xx
+ATI Technologies Inc. Radeon X1950 Series supported 3 ATI Radeon X19xx
+ATI Technologies Inc. Radeon X1950 Series (Microsoft - WDDM) supported 3 ATI Radeon X19xx
+ATI Technologies Inc. Radeon X300/X550/X1050 Series supported 0 ATI Radeon X300
+ATI Technologies Inc. Radeon X550/X700 Series supported 0 ATI Radeon X500
+ATI Technologies Inc. Radeon X550XTX x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon X500
+ATI Technologies Inc. SAPPHIRE RADEON X300SE supported 0 ATI Radeon X300
+ATI Technologies Inc. SAPPHIRE RADEON X300SE x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon X300
+ATI Technologies Inc. SAPPHIRE RADEON X300SE x86/SSE2 supported 0 ATI Radeon X300
+ATI Technologies Inc. SAPPHIRE Radeon X1550 Series supported 2 ATI Radeon X15xx
+ATI Technologies Inc. SAPPHIRE Radeon X1550 Series x86/MMX/3DNow!/SSE2 supported 2 ATI Radeon X15xx
+ATI Technologies Inc. SAPPHIRE Radeon X1550 Series x86/SSE2 supported 2 ATI Radeon X15xx
+ATI Technologies Inc. SAPPHIRE Radeon X1550 x86/SSE2 supported 2 ATI Radeon X15xx
+ATI Technologies Inc. Sapphire Radeon HD 3730 supported 3 ATI Radeon HD 3700
+ATI Technologies Inc. Sapphire Radeon HD 3750 supported 3 ATI Radeon HD 3700
+ATI Technologies Inc. Standard VGA Graphics Adapter supported 0 ATI Technologies
+ATI Technologies Inc. Tul, RADEON X600 PRO supported 0 ATI Technologies
+ATI Technologies Inc. Tul, RADEON X600 PRO x86/SSE2 supported 0 ATI Technologies
+ATI Technologies Inc. Tul, RADEON X700 PRO supported 0 ATI Technologies
+ATI Technologies Inc. Tul, RADEON X700 PRO x86/MMX/3DNow!/SSE2 supported 0 ATI Technologies
+ATI Technologies Inc. VisionTek Radeon 4350 supported 0 ATI Technologies
+ATI Technologies Inc. VisionTek Radeon X1550 Series supported 2 ATI Radeon X15xx
+ATI Technologies Inc. WRESTLER 9802 supported 0 ATI Technologies
+ATI Technologies Inc. WRESTLER 9803 supported 0 ATI Technologies
+ATI Technologies Inc. XFX Radeon HD 4570 supported 3 ATI Radeon HD 4500
+ATI Technologies Inc. Yamaha ATI HD 9000da/s supported 0 ATI Technologies
+ATI Technologies Inc. Yamaha ATI HD 9000da/s 2048 supported 0 ATI Technologies
+Advanced Micro Devices, Inc. Mesa DRI R600 (RS780 9612) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 supported 0 AMD RS780 (HD 3200)
+Advanced Micro Devices, Inc. Mesa DRI R600 (RS880 9710) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 supported 1 AMD RS880 (HD 4200)
+Advanced Micro Devices, Inc. Mesa DRI R600 (RS880 9712) 20090101 TCL supported 1 AMD RS880 (HD 4200)
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV610 94C1) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 supported 1 AMD RV610 (HD 2400)
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV610 94C9) 20090101 x86/MMX/SSE2 TCL DRI2 supported 1 AMD RV610 (HD 2400)
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV620 95C4) 20090101 x86/MMX/SSE2 TCL DRI2 supported 1 AMD RV620 (HD 3400)
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV620 95C5) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 supported 1 AMD RV620 (HD 3400)
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV620 95C5) 20090101 x86/MMX/SSE2 TCL DRI2 supported 1 AMD RV620 (HD 3400)
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV635 9596) 20090101 x86/MMX+/3DNow!+/SSE TCL DRI2 supported 3 AMD RV635 (HD 3600)
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV670 9505) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 supported 3 AMD RV670 (HD 3800)
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV670 9505) 20090101 x86/MMX/SSE2 TCL DRI2 supported 3 AMD RV670 (HD 3800)
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV710 9552) 20090101 x86/MMX/SSE2 TCL DRI2 supported 1 AMD RV710 (HD 4300)
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV730 9490) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 supported 3 AMD RV730 (HD 4600)
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV730 9490) 20090101 x86/MMX/SSE2 TCL DRI2 supported 3 AMD RV730 (HD 4600)
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV730 9498) 20090101 TCL DRI2 supported 3 AMD RV730 (HD 4600)
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV770 9440) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 supported 3 AMD RV770 (HD 4800)
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV770 9442) 20090101 x86/MMX/SSE2 TCL DRI2 supported 3 AMD RV770 (HD 4800)
+Alex Mohr GL Hijacker! NO MATCH
+Apple Software Renderer unsupported 0 Apple Software Renderer
+DRI R300 Project Mesa DRI R300 (RS400 5954) 20090101 x86/MMX+/3DNow!+/SSE2 NO-TCL DRI2 supported 1 ATI R300 (9700)
+DRI R300 Project Mesa DRI R300 (RS400 5975) 20090101 x86/MMX+/3DNow!+/SSE2 NO-TCL DRI2 supported 1 ATI R300 (9700)
+DRI R300 Project Mesa DRI R300 (RS400 5A62) 20090101 x86/MMX/SSE2 NO-TCL DRI2 supported 1 ATI R300 (9700)
+DRI R300 Project Mesa DRI R300 (RS600 7941) 20090101 x86/MMX/SSE2 NO-TCL unsupported 0 ATI RS600 (Xpress 3200)
+DRI R300 Project Mesa DRI R300 (RS690 791F) 20090101 x86/MMX+/3DNow!+/SSE2 NO-TCL DRI2 supported 1 ATI R300 (9700)
+DRI R300 Project Mesa DRI R300 (RV350 4151) 20090101 AGP 4x x86/MMX+/3DNow!+/SSE TCL supported 0 ATI RV350 (9600)
+DRI R300 Project Mesa DRI R300 (RV350 4153) 20090101 AGP 8x x86/MMX+/3DNow!+/SSE TCL supported 0 ATI RV350 (9600)
+DRI R300 Project Mesa DRI R300 (RV380 3150) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 supported 0 ATI RV380
+DRI R300 Project Mesa DRI R300 (RV380 3150) 20090101 x86/MMX/SSE2 TCL DRI2 supported 0 ATI RV380
+DRI R300 Project Mesa DRI R300 (RV380 5B60) 20090101 x86/MMX/SSE2 TCL DRI2 supported 0 ATI RV380
+DRI R300 Project Mesa DRI R300 (RV380 5B62) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 supported 0 ATI RV380
+DRI R300 Project Mesa DRI R300 (RV515 7145) 20090101 x86/MMX/SSE2 TCL DRI2 supported 1 ATI RV515
+DRI R300 Project Mesa DRI R300 (RV515 7146) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 supported 1 ATI RV515
+DRI R300 Project Mesa DRI R300 (RV515 7146) 20090101 x86/MMX/SSE2 TCL DRI2 supported 1 ATI RV515
+DRI R300 Project Mesa DRI R300 (RV515 7149) 20090101 x86/MMX/SSE2 TCL DRI2 supported 1 ATI RV515
+DRI R300 Project Mesa DRI R300 (RV515 714A) 20090101 x86/MMX/SSE2 TCL supported 1 ATI RV515
+DRI R300 Project Mesa DRI R300 (RV515 714A) 20090101 x86/MMX/SSE2 TCL DRI2 supported 1 ATI RV515
+DRI R300 Project Mesa DRI R300 (RV530 71C4) 20090101 x86/MMX/SSE2 TCL DRI2 supported 1 ATI RV530
+GPU_CLASS_UNKNOWN NO MATCH
+Humper 3D-Analyze v2.3 - http://www.tommti-systems.com supported 0 Humper
+Humper Chromium supported 0 Humper
+Imagination Technologies PowerVR SGX545 NO MATCH
+Intel NO MATCH
+Intel HD Graphics Family supported 2 Intel HD Graphics
+Intel 3D-Analyze v2.2 - http://www.tommti-systems.com NO MATCH
+Intel 3D-Analyze v2.3 - http://www.tommti-systems.com NO MATCH
+Intel 4 Series Internal Chipset NO MATCH
+Intel 830M unsupported 0 Intel 830M
+Intel 845G unsupported 0 Intel 845G
+Intel 855GM unsupported 0 Intel 855GM
+Intel 865G unsupported 0 Intel 865G
+Intel 915G unsupported 0 Intel 915G
+Intel 915GM unsupported 0 Intel 915GM
+Intel 945G supported 0 Intel 945G
+Intel 945GM supported 0 Intel 945GM
+Intel 950 supported 0 Intel 950
+Intel 965 supported 0 Intel 965
+Intel B43 Express Chipset NO MATCH
+Intel Bear Lake unsupported 0 Intel Bear Lake
+Intel Broadwater unsupported 0 Intel Broadwater
+Intel Brookdale unsupported 0 Intel Brookdale
+Intel Cantiga unsupported 0 Intel Cantiga
+Intel EMGD on PowerVR SGX535 NO MATCH
+Intel Eaglelake supported 0 Intel Eaglelake
+Intel Familia Mobile 45 Express Chipset (Microsoft Corporation - WDDM 1.1) NO MATCH
+Intel G33 unsupported 0 Intel G33
+Intel G41 supported 0 Intel G41
+Intel G41 Express Chipset supported 0 Intel G41
+Intel G45 supported 0 Intel G45
+Intel G45/G43 Express Chipset supported 0 Intel G45
+Intel Graphics Media Accelerator HD supported 0 Intel Graphics Media HD
+Intel HD Graphics supported 2 Intel HD Graphics
+Intel HD Graphics 100 supported 2 Intel HD Graphics
+Intel HD Graphics 200 supported 2 Intel HD Graphics
+Intel HD Graphics 200 BR-1101-00SH supported 2 Intel HD Graphics
+Intel HD Graphics 200 BR-1101-00SJ supported 2 Intel HD Graphics
+Intel HD Graphics 200 BR-1101-00SK supported 2 Intel HD Graphics
+Intel HD Graphics 200 BR-1101-01M5 supported 2 Intel HD Graphics
+Intel HD Graphics 200 BR-1101-01M6 supported 2 Intel HD Graphics
+Intel HD Graphics BR-1004-01Y1 supported 2 Intel HD Graphics
+Intel HD Graphics BR-1006-0364 supported 2 Intel HD Graphics
+Intel HD Graphics BR-1006-0365 supported 2 Intel HD Graphics
+Intel HD Graphics BR-1006-0366 supported 2 Intel HD Graphics
+Intel HD Graphics BR-1007-02G4 supported 2 Intel HD Graphics
+Intel HD Graphics BR-1101-04SY supported 2 Intel HD Graphics
+Intel HD Graphics BR-1101-04SZ supported 2 Intel HD Graphics
+Intel HD Graphics BR-1101-04T0 supported 2 Intel HD Graphics
+Intel HD Graphics BR-1101-04T9 supported 2 Intel HD Graphics
+Intel HD Graphics Family supported 2 Intel HD Graphics
+Intel HD Graphics Family BR-1012-00Y8 supported 2 Intel HD Graphics
+Intel HD Graphics Family BR-1012-00YF supported 2 Intel HD Graphics
+Intel HD Graphics Family BR-1012-00ZD supported 2 Intel HD Graphics
+Intel HD Graphics Family BR-1102-00ML supported 2 Intel HD Graphics
+Intel Inc. Intel GMA 900 OpenGL Engine NO MATCH
+Intel Inc. Intel GMA 950 OpenGL Engine supported 0 Intel 950
+Intel Inc. Intel GMA X3100 OpenGL Engine supported 0 Intel X3100
+Intel Inc. Intel HD Graphics 3000 OpenGL Engine supported 2 Intel HD Graphics
+Intel Inc. Intel HD Graphics OpenGL Engine supported 2 Intel HD Graphics
+Intel Inc. Intel HD xxxx OpenGL Engine NO MATCH
+Intel Intel 845G unsupported 0 Intel 845G
+Intel Intel 855GM unsupported 0 Intel 855GM
+Intel Intel 865G unsupported 0 Intel 865G
+Intel Intel 915G unsupported 0 Intel 915G
+Intel Intel 915GM unsupported 0 Intel 915GM
+Intel Intel 945G supported 0 Intel 945G
+Intel Intel 945GM supported 0 Intel 945GM
+Intel Intel 965/963 Graphics Media Accelerator supported 0 Intel 965
+Intel Intel Bear Lake B unsupported 0 Intel Bear Lake
+Intel Intel Broadwater G unsupported 0 Intel Broadwater
+Intel Intel Brookdale-G unsupported 0 Intel Brookdale
+Intel Intel Calistoga NO MATCH
+Intel Intel Cantiga unsupported 0 Intel Cantiga
+Intel Intel Eaglelake supported 0 Intel Eaglelake
+Intel Intel Generic Renderer NO MATCH
+Intel Intel Grantsdale-G NO MATCH
+Intel Intel HD Graphics 3000 supported 2 Intel HD Graphics
+Intel Intel Lakeport NO MATCH
+Intel Intel Montara-GM unsupported 0 Intel Montara
+Intel Intel Pineview Platform supported 0 Intel Pineview
+Intel Intel Springdale-G unsupported 0 Intel Springdale
+Intel Mobile - famiglia Express Chipset 45 (Microsoft Corporation - WDDM 1.1) NO MATCH
+Intel Mobile 4 Series supported 0 Intel Mobile 4 Series
+Intel Mobile 4 Series Express Chipset Family supported 0 Intel Mobile 4 Series
+Intel Mobile 45 Express Chipset Family NO MATCH
+Intel Mobile 45 Express Chipset Family (Microsoft Corporation - WDDM 1.1) NO MATCH
+Intel Mobile HD Graphics supported 2 Intel HD Graphics
+Intel Mobile Intel(R) 4 Series Express Chipset Family supported 0 Intel Mobile 4 Series
+Intel Mobile SandyBridge HD Graphics supported 2 Intel HD Graphics
+Intel Montara unsupported 0 Intel Montara
+Intel Pineview supported 0 Intel Pineview
+Intel Q45/Q43 Express Chipset NO MATCH
+Intel Royal BNA Driver NO MATCH
+Intel SandyBridge HD Graphics supported 2 Intel HD Graphics
+Intel SandyBridge HD Graphics BR-1006-00V8 supported 2 Intel HD Graphics
+Intel Springdale unsupported 0 Intel Springdale
+Intel X3100 supported 0 Intel X3100
+Intergraph wcgdrv 06.05.06.18 NO MATCH
+Intergraph wcgdrv 06.06.00.35 NO MATCH
+LegendgrafiX Mobile 945 Express C/TitaniumGL/GAC/D3D ACCELERATION/6x86/1 THREADs | http://Legendgra... NO MATCH
+LegendgrafiX NVIDIA GeForce GT 430/TitaniumGL/GAC/D3D ACCELERATION/6x86/1 THREADs | http://Legendgr... supported 3 NVIDIA GT 430M
+Linden Lab Headless NO MATCH
+Matrox unsupported 0 Matrox
+Mesa unsupported 0 Mesa
+Mesa Project Software Rasterizer unsupported 0 Mesa
+NVIDIA /PCI/SSE2 NO MATCH
+NVIDIA /PCI/SSE2/3DNOW! NO MATCH
+NVIDIA 205 supported 0 NVIDIA G 205M
+NVIDIA 210 supported 1 NVIDIA G 210
+NVIDIA 310 supported 2 NVIDIA G 310M
+NVIDIA 310M supported 2 NVIDIA G 310M
+NVIDIA 315 supported 2 NVIDIA G 315
+NVIDIA 315M supported 2 NVIDIA G 315
+NVIDIA 320M supported 2 NVIDIA G 320M
+NVIDIA C51 supported 0 NVIDIA C51
+NVIDIA Corporation GeForce GT 230/PCI/SSE2 supported 2 NVIDIA GT 230M
+NVIDIA Corporation GeForce GTX 285/PCI/SSE2 supported 3 NVIDIA GTX 285
+NVIDIA D10M2-20/PCI/SSE2 NO MATCH
+NVIDIA D10P1-25/PCI/SSE2 NO MATCH
+NVIDIA D10P1-25/PCI/SSE2/3DNOW! NO MATCH
+NVIDIA D10P1-30/PCI/SSE2 NO MATCH
+NVIDIA D10P2-50/PCI/SSE2 NO MATCH
+NVIDIA D11M2-30/PCI/SSE2 NO MATCH
+NVIDIA D12-P1-35/PCI/SSE2 NO MATCH
+NVIDIA D12U-15/PCI/SSE2 NO MATCH
+NVIDIA D13M1-40/PCI/SSE2 NO MATCH
+NVIDIA D13P1-40/PCI/SSE2 NO MATCH
+NVIDIA D13P1-40/PCI/SSE2/3DNOW! NO MATCH
+NVIDIA D13U-10/PCI/SSE2 NO MATCH
+NVIDIA D13U/PCI/SSE2 NO MATCH
+NVIDIA D9M supported 1 NVIDIA D9M
+NVIDIA D9M-20/PCI/SSE2 supported 1 NVIDIA D9M
+NVIDIA Entry Graphics/PCI/SSE2 NO MATCH
+NVIDIA Entry Graphics/PCI/SSE2/3DNOW! NO MATCH
+NVIDIA G 102M supported 0 NVIDIA G102M
+NVIDIA G 103M supported 0 NVIDIA G103M
+NVIDIA G 105M supported 0 NVIDIA G105M
+NVIDIA G 110M supported 0 NVIDIA G 110M
+NVIDIA G100 supported 0 NVIDIA G100
+NVIDIA G102M supported 0 NVIDIA G102M
+NVIDIA G103M supported 0 NVIDIA G103M
+NVIDIA G105M supported 0 NVIDIA G105M
+NVIDIA G210 supported 1 NVIDIA G 210
+NVIDIA G210M supported 1 NVIDIA G 210
+NVIDIA G70/PCI/SSE2 NO MATCH
+NVIDIA G72 supported 1 NVIDIA G72
+NVIDIA G73 supported 1 NVIDIA G73
+NVIDIA G84 supported 2 NVIDIA G84
+NVIDIA G86 supported 3 NVIDIA G86
+NVIDIA G92 supported 3 NVIDIA G92
+NVIDIA G92-200/PCI/SSE2 supported 0 NVIDIA G 200
+NVIDIA G94 supported 3 NVIDIA G94
+NVIDIA G96/PCI/SSE2 NO MATCH
+NVIDIA G98/PCI/SSE2 NO MATCH
+NVIDIA G98/PCI/SSE2/3DNOW! NO MATCH
+NVIDIA GT 120 supported 2 NVIDIA GT 120M
+NVIDIA GT 130 supported 2 NVIDIA GT 130M
+NVIDIA GT 130M supported 2 NVIDIA GT 130M
+NVIDIA GT 140 supported 2 NVIDIA GT 140M
+NVIDIA GT 150 supported 2 NVIDIA GT 150M
+NVIDIA GT 160M supported 2 NVIDIA GT 160M
+NVIDIA GT 220 supported 2 NVIDIA GT 220M
+NVIDIA GT 220/PCI/SSE2 supported 2 NVIDIA GT 220M
+NVIDIA GT 220/PCI/SSE2/3DNOW! supported 2 NVIDIA GT 220M
+NVIDIA GT 230 supported 2 NVIDIA GT 230M
+NVIDIA GT 230M supported 2 NVIDIA GT 230M
+NVIDIA GT 240 supported 2 NVIDIA GT 240M
+NVIDIA GT 240M supported 2 NVIDIA GT 240M
+NVIDIA GT 250M supported 2 NVIDIA GT 250M
+NVIDIA GT 260M supported 2 NVIDIA GT 260M
+NVIDIA GT 320 supported 2 NVIDIA G 320M
+NVIDIA GT 320M supported 2 NVIDIA G 320M
+NVIDIA GT 330 supported 3 NVIDIA GT 330M
+NVIDIA GT 330M supported 3 NVIDIA GT 330M
+NVIDIA GT 340 supported 2 NVIDIA GT 340M
+NVIDIA GT 420 supported 2 NVIDIA GT 420M
+NVIDIA GT 430 supported 3 NVIDIA GT 430M
+NVIDIA GT 440 supported 3 NVIDIA GT 440M
+NVIDIA GT 450 supported 3 NVIDIA GT 450M
+NVIDIA GT 520 supported 3 NVIDIA GT 520M
+NVIDIA GT 540 supported 3 NVIDIA GT 540M
+NVIDIA GT 540M supported 3 NVIDIA GT 540M
+NVIDIA GT-120 supported 2 NVIDIA GT 120
+NVIDIA GT200/PCI/SSE2 supported 0 NVIDIA G 200
+NVIDIA GTS 150 supported 2 NVIDIA GT 150M
+NVIDIA GTS 240 supported 3 NVIDIA GTS 240
+NVIDIA GTS 250 supported 3 NVIDIA GTS 250
+NVIDIA GTS 350M supported 3 NVIDIA GTS 350M
+NVIDIA GTS 360 supported 3 NVIDIA GTS 360
+NVIDIA GTS 360M supported 3 NVIDIA GTS 360M
+NVIDIA GTS 450 supported 3 NVIDIA GTS 450
+NVIDIA GTX 260 supported 3 NVIDIA GTX 260
+NVIDIA GTX 260M supported 3 NVIDIA GTX 260
+NVIDIA GTX 270 supported 3 NVIDIA GTX 270
+NVIDIA GTX 280 supported 3 NVIDIA GTX 280
+NVIDIA GTX 285 supported 3 NVIDIA GTX 285
+NVIDIA GTX 290 supported 3 NVIDIA GTX 290
+NVIDIA GTX 460 supported 3 NVIDIA GTX 460
+NVIDIA GTX 460M supported 3 NVIDIA GTX 460M
+NVIDIA GTX 465 supported 3 NVIDIA GTX 465
+NVIDIA GTX 470 supported 3 NVIDIA GTX 470
+NVIDIA GTX 470M supported 3 NVIDIA GTX 470M
+NVIDIA GTX 480 supported 3 NVIDIA GTX 480
+NVIDIA GTX 480M supported 3 NVIDIA GTX 480M
+NVIDIA GTX 550 Ti supported 3 NVIDIA GTX 550
+NVIDIA GTX 560 supported 3 NVIDIA GTX 560
+NVIDIA GTX 560 Ti supported 3 NVIDIA GTX 560
+NVIDIA GTX 570 supported 3 NVIDIA GTX 570
+NVIDIA GTX 580 supported 3 NVIDIA GTX 580
+NVIDIA GTX 590 supported 3 NVIDIA GTX 590
+NVIDIA GeForce NO MATCH
+NVIDIA GeForce 2 supported 0 NVIDIA GeForce 2
+NVIDIA GeForce 205/PCI/SSE2 supported 2 NVIDIA 205
+NVIDIA GeForce 210 supported 2 NVIDIA 210
+NVIDIA GeForce 210/PCI/SSE2 supported 2 NVIDIA 210
+NVIDIA GeForce 210/PCI/SSE2/3DNOW! supported 2 NVIDIA 210
+NVIDIA GeForce 3 supported 0 NVIDIA GeForce 3
+NVIDIA GeForce 305M/PCI/SSE2 supported 1 NVIDIA 305M
+NVIDIA GeForce 310/PCI/SSE2 supported 3 NVIDIA 310
+NVIDIA GeForce 310/PCI/SSE2/3DNOW! supported 3 NVIDIA 310
+NVIDIA GeForce 310M/PCI/SSE2 supported 1 NVIDIA 310M
+NVIDIA GeForce 315/PCI/SSE2 supported 3 NVIDIA 315
+NVIDIA GeForce 315/PCI/SSE2/3DNOW! supported 3 NVIDIA 315
+NVIDIA GeForce 315M/PCI/SSE2 supported 2 NVIDIA 315M
+NVIDIA GeForce 320M/PCI/SSE2 supported 2 NVIDIA 320M
+NVIDIA GeForce 4 Go supported 0 NVIDIA GeForce 4
+NVIDIA GeForce 4 MX supported 0 NVIDIA GeForce 4
+NVIDIA GeForce 4 Ti supported 0 NVIDIA GeForce 4
+NVIDIA GeForce 405/PCI/SSE2 supported 1 NVIDIA G 405
+NVIDIA GeForce 410M/PCI/SSE2 supported 1 NVIDIA G 410M
+NVIDIA GeForce 6100 supported 0 NVIDIA G100
+NVIDIA GeForce 6100 nForce 400/PCI/SSE2/3DNOW! supported 0 NVIDIA G100
+NVIDIA GeForce 6100 nForce 405/PCI/SSE2 supported 0 NVIDIA G100
+NVIDIA GeForce 6100 nForce 405/PCI/SSE2/3DNOW! supported 0 NVIDIA G100
+NVIDIA GeForce 6100 nForce 420/PCI/SSE2/3DNOW! supported 0 NVIDIA G100
+NVIDIA GeForce 6100 nForce 430/PCI/SSE2/3DNOW! supported 0 NVIDIA G100
+NVIDIA GeForce 6100/PCI/SSE2/3DNOW! supported 0 NVIDIA G100
+NVIDIA GeForce 6150 LE/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 6100
+NVIDIA GeForce 6150/PCI/SSE2 supported 0 NVIDIA GeForce 6100
+NVIDIA GeForce 6150/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 6100
+NVIDIA GeForce 6150SE nForce 430/PCI/SSE2 supported 0 NVIDIA GeForce 6100
+NVIDIA GeForce 6150SE nForce 430/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 6100
+NVIDIA GeForce 6150SE/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 6100
+NVIDIA GeForce 6200 supported 0 NVIDIA G 200
+NVIDIA GeForce 6200 A-LE/AGP/SSE/3DNOW! supported 0 NVIDIA G 200
+NVIDIA GeForce 6200 A-LE/AGP/SSE2 supported 0 NVIDIA G 200
+NVIDIA GeForce 6200 A-LE/AGP/SSE2/3DNOW! supported 0 NVIDIA G 200
+NVIDIA GeForce 6200 LE/PCI/SSE2 supported 0 NVIDIA G 200
+NVIDIA GeForce 6200 LE/PCI/SSE2/3DNOW! supported 0 NVIDIA G 200
+NVIDIA GeForce 6200 TurboCache(TM)/PCI/SSE2 supported 0 NVIDIA G 200
+NVIDIA GeForce 6200 TurboCache(TM)/PCI/SSE2/3DNOW! supported 0 NVIDIA G 200
+NVIDIA GeForce 6200/AGP/SSE/3DNOW! supported 0 NVIDIA G 200
+NVIDIA GeForce 6200/AGP/SSE2 supported 0 NVIDIA G 200
+NVIDIA GeForce 6200/AGP/SSE2/3DNOW! supported 0 NVIDIA G 200
+NVIDIA GeForce 6200/PCI/SSE/3DNOW! supported 0 NVIDIA G 200
+NVIDIA GeForce 6200/PCI/SSE2 supported 0 NVIDIA G 200
+NVIDIA GeForce 6200/PCI/SSE2/3DNOW! supported 0 NVIDIA G 200
+NVIDIA GeForce 6200SE TurboCache(TM)/PCI/SSE2/3DNOW! supported 0 NVIDIA G 200
+NVIDIA GeForce 6500 supported 0 NVIDIA GeForce 6500
+NVIDIA GeForce 6500/PCI/SSE2 supported 0 NVIDIA GeForce 6500
+NVIDIA GeForce 6600 supported 1 NVIDIA GeForce 6600
+NVIDIA GeForce 6600 GT/AGP/SSE/3DNOW! supported 1 NVIDIA GeForce 6600
+NVIDIA GeForce 6600 GT/AGP/SSE2 supported 1 NVIDIA GeForce 6600
+NVIDIA GeForce 6600 GT/PCI/SSE/3DNOW! supported 1 NVIDIA GeForce 6600
+NVIDIA GeForce 6600 GT/PCI/SSE2 supported 1 NVIDIA GeForce 6600
+NVIDIA GeForce 6600 GT/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 6600
+NVIDIA GeForce 6600 LE/PCI/SSE2 supported 1 NVIDIA GeForce 6600
+NVIDIA GeForce 6600/AGP/SSE/3DNOW! supported 1 NVIDIA GeForce 6600
+NVIDIA GeForce 6600/AGP/SSE2 supported 1 NVIDIA GeForce 6600
+NVIDIA GeForce 6600/AGP/SSE2/3DNOW! supported 1 NVIDIA GeForce 6600
+NVIDIA GeForce 6600/PCI/SSE2 supported 1 NVIDIA GeForce 6600
+NVIDIA GeForce 6600/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 6600
+NVIDIA GeForce 6700 supported 2 NVIDIA GeForce 6700
+NVIDIA GeForce 6800 supported 2 NVIDIA GeForce 6800
+NVIDIA GeForce 6800 GS/PCI/SSE2 supported 2 NVIDIA GeForce 6800
+NVIDIA GeForce 6800 GS/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce 6800
+NVIDIA GeForce 6800 GT/AGP/SSE2 supported 2 NVIDIA GeForce 6800
+NVIDIA GeForce 6800 GT/PCI/SSE2 supported 2 NVIDIA GeForce 6800
+NVIDIA GeForce 6800 XT/AGP/SSE2 supported 2 NVIDIA GeForce 6800
+NVIDIA GeForce 6800 XT/PCI/SSE2 supported 2 NVIDIA GeForce 6800
+NVIDIA GeForce 6800 XT/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce 6800
+NVIDIA GeForce 6800/PCI/SSE2 supported 2 NVIDIA GeForce 6800
+NVIDIA GeForce 6800/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce 6800
+NVIDIA GeForce 7000 supported 0 NVIDIA GeForce 7000
+NVIDIA GeForce 7000M supported 0 NVIDIA GeForce 7000
+NVIDIA GeForce 7000M / nForce 610M/PCI/SSE2 supported 0 NVIDIA GeForce 7000
+NVIDIA GeForce 7000M / nForce 610M/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 7000
+NVIDIA GeForce 7025 / NVIDIA nForce 630a/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 7000
+NVIDIA GeForce 7025 / nForce 630a/PCI/SSE2 supported 0 NVIDIA GeForce 7000
+NVIDIA GeForce 7025 / nForce 630a/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 7000
+NVIDIA GeForce 7050 / NVIDIA nForce 610i/PCI/SSE2 supported 0 NVIDIA GeForce 7000
+NVIDIA GeForce 7050 / NVIDIA nForce 620i/PCI/SSE2 supported 0 NVIDIA GeForce 7000
+NVIDIA GeForce 7050 / nForce 610i/PCI/SSE2 supported 0 NVIDIA GeForce 7000
+NVIDIA GeForce 7050 / nForce 620i/PCI/SSE2 supported 0 NVIDIA GeForce 7000
+NVIDIA GeForce 7050 PV / NVIDIA nForce 630a/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 7000
+NVIDIA GeForce 7050 PV / nForce 630a/PCI/SSE2 supported 0 NVIDIA GeForce 7000
+NVIDIA GeForce 7050 PV / nForce 630a/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 7000
+NVIDIA GeForce 7050 SE / NVIDIA nForce 630a/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 7000
+NVIDIA GeForce 7100 supported 0 NVIDIA G100
+NVIDIA GeForce 7100 / NVIDIA nForce 620i/PCI/SSE2 supported 0 NVIDIA G100
+NVIDIA GeForce 7100 / NVIDIA nForce 630i/PCI/SSE2 supported 0 NVIDIA G100
+NVIDIA GeForce 7100 / nForce 630i/PCI/SSE2 supported 0 NVIDIA G100
+NVIDIA GeForce 7100 GS/PCI/SSE2 supported 0 NVIDIA G100
+NVIDIA GeForce 7100 GS/PCI/SSE2/3DNOW! supported 0 NVIDIA G100
+NVIDIA GeForce 7150M / nForce 630M/PCI/SSE2 supported 0 NVIDIA GeForce 7100
+NVIDIA GeForce 7150M / nForce 630M/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 7100
+NVIDIA GeForce 7300 supported 1 NVIDIA GeForce 7300
+NVIDIA GeForce 7300 GS/PCI/SSE2 supported 1 NVIDIA GeForce 7300
+NVIDIA GeForce 7300 GS/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 7300
+NVIDIA GeForce 7300 GT/AGP/SSE2 supported 1 NVIDIA GeForce 7300
+NVIDIA GeForce 7300 GT/AGP/SSE2/3DNOW! supported 1 NVIDIA GeForce 7300
+NVIDIA GeForce 7300 GT/PCI/SSE2 supported 1 NVIDIA GeForce 7300
+NVIDIA GeForce 7300 GT/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 7300
+NVIDIA GeForce 7300 LE/PCI/SSE2 supported 1 NVIDIA GeForce 7300
+NVIDIA GeForce 7300 LE/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 7300
+NVIDIA GeForce 7300 SE/7200 GS/PCI/SSE2 supported 0 NVIDIA G 200
+NVIDIA GeForce 7300 SE/7200 GS/PCI/SSE2/3DNOW! supported 0 NVIDIA G 200
+NVIDIA GeForce 7300 SE/PCI/SSE2 supported 1 NVIDIA GeForce 7300
+NVIDIA GeForce 7300 SE/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 7300
+NVIDIA GeForce 7350 LE/PCI/SSE2 supported 1 NVIDIA GeForce 7300
+NVIDIA GeForce 7500 supported 1 NVIDIA GeForce 7500
+NVIDIA GeForce 7500 LE/PCI/SSE2 supported 1 NVIDIA GeForce 7500
+NVIDIA GeForce 7500 LE/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 7500
+NVIDIA GeForce 7600 supported 2 NVIDIA GeForce 7600
+NVIDIA GeForce 7600 GS/AGP/SSE2 supported 2 NVIDIA GeForce 7600
+NVIDIA GeForce 7600 GS/AGP/SSE2/3DNOW! supported 2 NVIDIA GeForce 7600
+NVIDIA GeForce 7600 GS/PCI/SSE2 supported 2 NVIDIA GeForce 7600
+NVIDIA GeForce 7600 GS/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce 7600
+NVIDIA GeForce 7600 GT/AGP/SSE/3DNOW! supported 2 NVIDIA GeForce 7600
+NVIDIA GeForce 7600 GT/AGP/SSE2 supported 2 NVIDIA GeForce 7600
+NVIDIA GeForce 7600 GT/PCI/SSE2 supported 2 NVIDIA GeForce 7600
+NVIDIA GeForce 7600 GT/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce 7600
+NVIDIA GeForce 7650 GS/PCI/SSE2 supported 2 NVIDIA GeForce 7600
+NVIDIA GeForce 7800 supported 2 NVIDIA GeForce 7800
+NVIDIA GeForce 7800 GS/AGP/SSE2 supported 2 NVIDIA GeForce 7800
+NVIDIA GeForce 7800 GS/AGP/SSE2/3DNOW! supported 2 NVIDIA GeForce 7800
+NVIDIA GeForce 7800 GT/PCI/SSE2 supported 2 NVIDIA GeForce 7800
+NVIDIA GeForce 7800 GT/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce 7800
+NVIDIA GeForce 7800 GTX/PCI/SSE2 supported 2 NVIDIA GeForce 7800
+NVIDIA GeForce 7800 GTX/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce 7800
+NVIDIA GeForce 7900 supported 2 NVIDIA GeForce 7900
+NVIDIA GeForce 7900 GS/PCI/SSE2 supported 2 NVIDIA GeForce 7900
+NVIDIA GeForce 7900 GS/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce 7900
+NVIDIA GeForce 7900 GT/GTO/PCI/SSE2 supported 2 NVIDIA GeForce 7900
+NVIDIA GeForce 7900 GT/GTO/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce 7900
+NVIDIA GeForce 7900 GT/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce 7900
+NVIDIA GeForce 7900 GTX/PCI/SSE2 supported 2 NVIDIA GeForce 7900
+NVIDIA GeForce 7950 GT/PCI/SSE2 supported 2 NVIDIA GeForce 7900
+NVIDIA GeForce 7950 GT/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce 7900
+NVIDIA GeForce 8100 supported 0 NVIDIA G100
+NVIDIA GeForce 8100 / nForce 720a/PCI/SSE2/3DNOW! supported 0 NVIDIA G100
+NVIDIA GeForce 8200 supported 0 NVIDIA G 200
+NVIDIA GeForce 8200/PCI/SSE2 supported 0 NVIDIA G 200
+NVIDIA GeForce 8200/PCI/SSE2/3DNOW! supported 0 NVIDIA G 200
+NVIDIA GeForce 8200M supported 0 NVIDIA G 200
+NVIDIA GeForce 8200M G/PCI/SSE2 supported 0 NVIDIA G 200
+NVIDIA GeForce 8200M G/PCI/SSE2/3DNOW! supported 0 NVIDIA G 200
+NVIDIA GeForce 8300 supported 1 NVIDIA GeForce 8300
+NVIDIA GeForce 8300 GS/PCI/SSE2 supported 1 NVIDIA GeForce 8300
+NVIDIA GeForce 8400 supported 1 NVIDIA GeForce 8400
+NVIDIA GeForce 8400 GS/PCI/SSE/3DNOW! supported 1 NVIDIA GeForce 8400
+NVIDIA GeForce 8400 GS/PCI/SSE2 supported 1 NVIDIA GeForce 8400
+NVIDIA GeForce 8400 GS/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 8400
+NVIDIA GeForce 8400/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 8400
+NVIDIA GeForce 8400GS/PCI/SSE2 supported 1 NVIDIA GeForce 8400
+NVIDIA GeForce 8400GS/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 8400
+NVIDIA GeForce 8400M supported 1 NVIDIA GeForce 8400M
+NVIDIA GeForce 8400M G/PCI/SSE2 supported 1 NVIDIA GeForce 8400M
+NVIDIA GeForce 8400M G/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 8400M
+NVIDIA GeForce 8400M GS/PCI/SSE2 supported 1 NVIDIA GeForce 8400M
+NVIDIA GeForce 8400M GS/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 8400M
+NVIDIA GeForce 8400M GT/PCI/SSE2 supported 1 NVIDIA GeForce 8400M
+NVIDIA GeForce 8500 supported 3 NVIDIA GeForce 8500
+NVIDIA GeForce 8500 GT/PCI/SSE2 supported 3 NVIDIA GeForce 8500
+NVIDIA GeForce 8500 GT/PCI/SSE2/3DNOW! supported 3 NVIDIA GeForce 8500
+NVIDIA GeForce 8600 supported 3 NVIDIA GeForce 8600
+NVIDIA GeForce 8600 GS/PCI/SSE2 supported 3 NVIDIA GeForce 8600
+NVIDIA GeForce 8600 GS/PCI/SSE2/3DNOW! supported 3 NVIDIA GeForce 8600
+NVIDIA GeForce 8600 GT/PCI/SSE2 supported 3 NVIDIA GeForce 8600
+NVIDIA GeForce 8600 GT/PCI/SSE2/3DNOW! supported 3 NVIDIA GeForce 8600
+NVIDIA GeForce 8600 GTS/PCI/SSE2 supported 3 NVIDIA GeForce 8600
+NVIDIA GeForce 8600 GTS/PCI/SSE2/3DNOW! supported 3 NVIDIA GeForce 8600
+NVIDIA GeForce 8600GS/PCI/SSE2 supported 3 NVIDIA GeForce 8600
+NVIDIA GeForce 8600M supported 1 NVIDIA GeForce 8600M
+NVIDIA GeForce 8600M GS/PCI/SSE2 supported 1 NVIDIA GeForce 8600M
+NVIDIA GeForce 8600M GS/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 8600M
+NVIDIA GeForce 8600M GT/PCI/SSE2 supported 1 NVIDIA GeForce 8600M
+NVIDIA GeForce 8700 supported 3 NVIDIA GeForce 8700
+NVIDIA GeForce 8700M supported 3 NVIDIA GeForce 8700M
+NVIDIA GeForce 8700M GT/PCI/SSE2 supported 3 NVIDIA GeForce 8700M
+NVIDIA GeForce 8800 supported 3 NVIDIA GeForce 8800
+NVIDIA GeForce 8800 GS/PCI/SSE2 supported 3 NVIDIA GeForce 8800
+NVIDIA GeForce 8800 GT/PCI/SSE2 supported 3 NVIDIA GeForce 8800
+NVIDIA GeForce 8800 GT/PCI/SSE2/3DNOW! supported 3 NVIDIA GeForce 8800
+NVIDIA GeForce 8800 GTS 512/PCI/SSE2 supported 3 NVIDIA GeForce 8800
+NVIDIA GeForce 8800 GTS 512/PCI/SSE2/3DNOW! supported 3 NVIDIA GeForce 8800
+NVIDIA GeForce 8800 GTS/PCI/SSE2 supported 3 NVIDIA GeForce 8800
+NVIDIA GeForce 8800 GTS/PCI/SSE2/3DNOW! supported 3 NVIDIA GeForce 8800
+NVIDIA GeForce 8800 GTX/PCI/SSE2 supported 3 NVIDIA GeForce 8800
+NVIDIA GeForce 8800 Ultra/PCI/SSE2 supported 3 NVIDIA GeForce 8800
+NVIDIA GeForce 8800M GTS/PCI/SSE2 supported 3 NVIDIA GeForce 8800M
+NVIDIA GeForce 8800M GTX/PCI/SSE2 supported 3 NVIDIA GeForce 8800M
+NVIDIA GeForce 9100 supported 0 NVIDIA G100
+NVIDIA GeForce 9100/PCI/SSE2 supported 0 NVIDIA G100
+NVIDIA GeForce 9100/PCI/SSE2/3DNOW! supported 0 NVIDIA G100
+NVIDIA GeForce 9100M supported 0 NVIDIA G100M
+NVIDIA GeForce 9100M G/PCI/SSE2 supported 0 NVIDIA G100M
+NVIDIA GeForce 9100M G/PCI/SSE2/3DNOW! supported 0 NVIDIA G100M
+NVIDIA GeForce 9200 supported 0 NVIDIA G 200
+NVIDIA GeForce 9200/PCI/SSE2 supported 0 NVIDIA G 200
+NVIDIA GeForce 9200/PCI/SSE2/3DNOW! supported 0 NVIDIA G 200
+NVIDIA GeForce 9200M GE/PCI/SSE2 supported 0 NVIDIA G 200
+NVIDIA GeForce 9200M GS/PCI/SSE2 supported 0 NVIDIA G 200
+NVIDIA GeForce 9300 supported 1 NVIDIA GeForce 9300
+NVIDIA GeForce 9300 / nForce 730i/PCI/SSE2 supported 1 NVIDIA GeForce 9300
+NVIDIA GeForce 9300 GE/PCI/SSE2 supported 1 NVIDIA GeForce 9300
+NVIDIA GeForce 9300 GE/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 9300
+NVIDIA GeForce 9300 GS/PCI/SSE2 supported 1 NVIDIA GeForce 9300
+NVIDIA GeForce 9300 GS/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 9300
+NVIDIA GeForce 9300 SE/PCI/SSE2 supported 1 NVIDIA GeForce 9300
+NVIDIA GeForce 9300M supported 1 NVIDIA GeForce 9300M
+NVIDIA GeForce 9300M G/PCI/SSE2 supported 1 NVIDIA GeForce 9300M
+NVIDIA GeForce 9300M G/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 9300M
+NVIDIA GeForce 9300M GS/PCI/SSE2 supported 1 NVIDIA GeForce 9300M
+NVIDIA GeForce 9300M GS/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 9300M
+NVIDIA GeForce 9400 supported 1 NVIDIA GeForce 9400
+NVIDIA GeForce 9400 GT/PCI/SSE2 supported 1 NVIDIA GeForce 9400
+NVIDIA GeForce 9400 GT/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 9400
+NVIDIA GeForce 9400/PCI/SSE2 supported 1 NVIDIA GeForce 9400
+NVIDIA GeForce 9400M supported 1 NVIDIA GeForce 9400M
+NVIDIA GeForce 9400M G/PCI/SSE2 supported 1 NVIDIA GeForce 9400M
+NVIDIA GeForce 9400M/PCI/SSE2 supported 1 NVIDIA GeForce 9400M
+NVIDIA GeForce 9500 supported 2 NVIDIA GeForce 9500
+NVIDIA GeForce 9500 GS/PCI/SSE2 supported 2 NVIDIA GeForce 9500
+NVIDIA GeForce 9500 GS/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce 9500
+NVIDIA GeForce 9500 GT/PCI/SSE2 supported 2 NVIDIA GeForce 9500
+NVIDIA GeForce 9500 GT/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce 9500
+NVIDIA GeForce 9500M supported 2 NVIDIA GeForce 9500M
+NVIDIA GeForce 9500M GS/PCI/SSE2 supported 2 NVIDIA GeForce 9500M
+NVIDIA GeForce 9600 supported 2 NVIDIA GeForce 9600
+NVIDIA GeForce 9600 GS/PCI/SSE2 supported 2 NVIDIA GeForce 9600
+NVIDIA GeForce 9600 GSO 512/PCI/SSE2 supported 2 NVIDIA GeForce 9600
+NVIDIA GeForce 9600 GSO/PCI/SSE2 supported 2 NVIDIA GeForce 9600
+NVIDIA GeForce 9600 GSO/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce 9600
+NVIDIA GeForce 9600 GT/PCI/SSE2 supported 2 NVIDIA GeForce 9600
+NVIDIA GeForce 9600 GT/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce 9600
+NVIDIA GeForce 9600M supported 3 NVIDIA GeForce 9600M
+NVIDIA GeForce 9600M GS/PCI/SSE2 supported 3 NVIDIA GeForce 9600M
+NVIDIA GeForce 9600M GT/PCI/SSE2 supported 3 NVIDIA GeForce 9600M
+NVIDIA GeForce 9650M GT/PCI/SSE2 supported 2 NVIDIA GeForce 9600
+NVIDIA GeForce 9700M supported 2 NVIDIA GeForce 9700M
+NVIDIA GeForce 9700M GT/PCI/SSE2 supported 2 NVIDIA GeForce 9700M
+NVIDIA GeForce 9700M GTS/PCI/SSE2 supported 2 NVIDIA GeForce 9700M
+NVIDIA GeForce 9800 supported 3 NVIDIA GeForce 9800
+NVIDIA GeForce 9800 GT/PCI/SSE2 supported 3 NVIDIA GeForce 9800
+NVIDIA GeForce 9800 GT/PCI/SSE2/3DNOW! supported 3 NVIDIA GeForce 9800
+NVIDIA GeForce 9800 GTX+/PCI/SSE2 supported 3 NVIDIA GeForce 9800
+NVIDIA GeForce 9800 GTX+/PCI/SSE2/3DNOW! supported 3 NVIDIA GeForce 9800
+NVIDIA GeForce 9800 GTX/9800 GTX+/PCI/SSE2 supported 3 NVIDIA GeForce 9800
+NVIDIA GeForce 9800 GTX/PCI/SSE2 supported 3 NVIDIA GeForce 9800
+NVIDIA GeForce 9800 GX2/PCI/SSE2 supported 3 NVIDIA GeForce 9800
+NVIDIA GeForce 9800M supported 3 NVIDIA GeForce 9800M
+NVIDIA GeForce 9800M GS/PCI/SSE2 supported 3 NVIDIA GeForce 9800M
+NVIDIA GeForce 9800M GT/PCI/SSE2 supported 3 NVIDIA GeForce 9800M
+NVIDIA GeForce 9800M GTS/PCI/SSE2 supported 3 NVIDIA GeForce 9800M
+NVIDIA GeForce FX 5100 supported 0 NVIDIA G100
+NVIDIA GeForce FX 5100/AGP/SSE/3DNOW! supported 0 NVIDIA G100
+NVIDIA GeForce FX 5200 supported 0 NVIDIA G 200
+NVIDIA GeForce FX 5200/AGP/SSE supported 0 NVIDIA G 200
+NVIDIA GeForce FX 5200/AGP/SSE/3DNOW! supported 0 NVIDIA G 200
+NVIDIA GeForce FX 5200/AGP/SSE2 supported 0 NVIDIA G 200
+NVIDIA GeForce FX 5200/AGP/SSE2/3DNOW! supported 0 NVIDIA G 200
+NVIDIA GeForce FX 5200/PCI/SSE2 supported 0 NVIDIA G 200
+NVIDIA GeForce FX 5200/PCI/SSE2/3DNOW! supported 0 NVIDIA G 200
+NVIDIA GeForce FX 5200LE/AGP/SSE2 supported 0 NVIDIA G 200
+NVIDIA GeForce FX 5500 supported 0 NVIDIA GeForce FX 5500
+NVIDIA GeForce FX 5500/AGP/SSE/3DNOW! supported 0 NVIDIA GeForce FX 5500
+NVIDIA GeForce FX 5500/AGP/SSE2 supported 0 NVIDIA GeForce FX 5500
+NVIDIA GeForce FX 5500/AGP/SSE2/3DNOW! supported 0 NVIDIA GeForce FX 5500
+NVIDIA GeForce FX 5500/PCI/SSE2 supported 0 NVIDIA GeForce FX 5500
+NVIDIA GeForce FX 5500/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce FX 5500
+NVIDIA GeForce FX 5600 supported 0 NVIDIA GeForce FX 5600
+NVIDIA GeForce FX 5600/AGP/SSE2 supported 0 NVIDIA GeForce FX 5600
+NVIDIA GeForce FX 5600/AGP/SSE2/3DNOW! supported 0 NVIDIA GeForce FX 5600
+NVIDIA GeForce FX 5600XT/AGP/SSE2/3DNOW! supported 0 NVIDIA GeForce FX 5600
+NVIDIA GeForce FX 5700 supported 1 NVIDIA GeForce FX 5700
+NVIDIA GeForce FX 5700/AGP/SSE/3DNOW! supported 1 NVIDIA GeForce FX 5700
+NVIDIA GeForce FX 5700LE/AGP/SSE supported 1 NVIDIA GeForce FX 5700
+NVIDIA GeForce FX 5700LE/AGP/SSE/3DNOW! supported 1 NVIDIA GeForce FX 5700
+NVIDIA GeForce FX 5800 supported 1 NVIDIA GeForce FX 5800
+NVIDIA GeForce FX 5900 supported 1 NVIDIA GeForce FX 5900
+NVIDIA GeForce FX 5900/AGP/SSE2 supported 1 NVIDIA GeForce FX 5900
+NVIDIA GeForce FX 5900XT/AGP/SSE2 supported 1 NVIDIA GeForce FX 5900
+NVIDIA GeForce FX Go5100 supported 0 NVIDIA G100
+NVIDIA GeForce FX Go5100/AGP/SSE2 supported 0 NVIDIA G100
+NVIDIA GeForce FX Go5200 supported 0 NVIDIA G 200
+NVIDIA GeForce FX Go5200/AGP/SSE2 supported 0 NVIDIA G 200
+NVIDIA GeForce FX Go5300 supported 0 NVIDIA GeForce FX Go5300
+NVIDIA GeForce FX Go5600 supported 0 NVIDIA GeForce FX Go5600
+NVIDIA GeForce FX Go5600/AGP/SSE2 supported 0 NVIDIA GeForce FX Go5600
+NVIDIA GeForce FX Go5650/AGP/SSE2 supported 0 NVIDIA GeForce FX Go5600
+NVIDIA GeForce FX Go5700 supported 1 NVIDIA GeForce FX Go5700
+NVIDIA GeForce FX Go5700/AGP/SSE2 supported 1 NVIDIA GeForce FX Go5700
+NVIDIA GeForce FX Go5xxx/AGP/SSE2 supported 0 NVIDIA GeForce FX Go5xxx
+NVIDIA GeForce G 103M/PCI/SSE2 supported 0 NVIDIA G103M
+NVIDIA GeForce G 103M/PCI/SSE2/3DNOW! supported 0 NVIDIA G103M
+NVIDIA GeForce G 105M/PCI/SSE2 supported 0 NVIDIA G105M
+NVIDIA GeForce G 110M/PCI/SSE2 supported 0 NVIDIA G 110M
+NVIDIA GeForce G100/PCI/SSE2 supported 0 NVIDIA G100
+NVIDIA GeForce G100/PCI/SSE2/3DNOW! supported 0 NVIDIA G100
+NVIDIA GeForce G102M/PCI/SSE2 supported 0 NVIDIA G102M
+NVIDIA GeForce G105M/PCI/SSE2 supported 0 NVIDIA G105M
+NVIDIA GeForce G200/PCI/SSE2 supported 0 NVIDIA G 200
+NVIDIA GeForce G205M/PCI/SSE2 supported 0 NVIDIA G 205M
+NVIDIA GeForce G210/PCI/SSE2 supported 1 NVIDIA G 210
+NVIDIA GeForce G210/PCI/SSE2/3DNOW! supported 1 NVIDIA G 210
+NVIDIA GeForce G210M/PCI/SSE2 supported 1 NVIDIA G 210
+NVIDIA GeForce G310M/PCI/SSE2 supported 2 NVIDIA G 310M
+NVIDIA GeForce GT 120/PCI/SSE2 supported 2 NVIDIA GT 120M
+NVIDIA GeForce GT 120/PCI/SSE2/3DNOW! supported 2 NVIDIA GT 120M
+NVIDIA GeForce GT 120M/PCI/SSE2 supported 1 NVIDIA G 120M
+NVIDIA GeForce GT 130M/PCI/SSE2 supported 2 NVIDIA GT 130M
+NVIDIA GeForce GT 140/PCI/SSE2 supported 2 NVIDIA GT 140M
+NVIDIA GeForce GT 220/PCI/SSE2 supported 2 NVIDIA GT 220M
+NVIDIA GeForce GT 220/PCI/SSE2/3DNOW! supported 2 NVIDIA GT 220M
+NVIDIA GeForce GT 220M/PCI/SSE2 supported 2 NVIDIA GT 220M
+NVIDIA GeForce GT 230/PCI/SSE2 supported 2 NVIDIA GT 230M
+NVIDIA GeForce GT 230M/PCI/SSE2 supported 2 NVIDIA GT 230M
+NVIDIA GeForce GT 240 supported 2 NVIDIA GT 240M
+NVIDIA GeForce GT 240/PCI/SSE2 supported 2 NVIDIA GT 240M
+NVIDIA GeForce GT 240/PCI/SSE2/3DNOW! supported 2 NVIDIA GT 240M
+NVIDIA GeForce GT 240M/PCI/SSE2 supported 2 NVIDIA GT 240M
+NVIDIA GeForce GT 320/PCI/SSE2 supported 2 NVIDIA G 320M
+NVIDIA GeForce GT 320M/PCI/SSE2 supported 2 NVIDIA G 320M
+NVIDIA GeForce GT 325M/PCI/SSE2 supported 0 NVIDIA GT 325M
+NVIDIA GeForce GT 330/PCI/SSE2 supported 3 NVIDIA GT 330M
+NVIDIA GeForce GT 330/PCI/SSE2/3DNOW! supported 3 NVIDIA GT 330M
+NVIDIA GeForce GT 330M/PCI/SSE2 supported 3 NVIDIA GT 330M
+NVIDIA GeForce GT 335M/PCI/SSE2 supported 1 NVIDIA GT 335M
+NVIDIA GeForce GT 340/PCI/SSE2 supported 2 NVIDIA GT 340M
+NVIDIA GeForce GT 340/PCI/SSE2/3DNOW! supported 2 NVIDIA GT 340M
+NVIDIA GeForce GT 415M/PCI/SSE2 supported 2 NVIDIA GT 415M
+NVIDIA GeForce GT 420/PCI/SSE2 supported 2 NVIDIA GT 420M
+NVIDIA GeForce GT 420M/PCI/SSE2 supported 2 NVIDIA GT 420M
+NVIDIA GeForce GT 425M/PCI/SSE2 supported 3 NVIDIA GT 425M
+NVIDIA GeForce GT 430/PCI/SSE2 supported 3 NVIDIA GT 430M
+NVIDIA GeForce GT 430/PCI/SSE2/3DNOW! supported 3 NVIDIA GT 430M
+NVIDIA GeForce GT 435M/PCI/SSE2 supported 3 NVIDIA GT 435M
+NVIDIA GeForce GT 440/PCI/SSE2 supported 3 NVIDIA GT 440M
+NVIDIA GeForce GT 440/PCI/SSE2/3DNOW! supported 3 NVIDIA GT 440M
+NVIDIA GeForce GT 445M/PCI/SSE2 supported 3 NVIDIA GT 445M
+NVIDIA GeForce GT 520/PCI/SSE2 supported 3 NVIDIA GT 520M
+NVIDIA GeForce GT 520/PCI/SSE2/3DNOW! supported 3 NVIDIA GT 520M
+NVIDIA GeForce GT 520M/PCI/SSE2 supported 3 NVIDIA GT 520M
+NVIDIA GeForce GT 525M/PCI/SSE2 supported 3 NVIDIA GT 520M
+NVIDIA GeForce GT 530/PCI/SSE2 supported 3 NVIDIA GT 530M
+NVIDIA GeForce GT 530/PCI/SSE2/3DNOW! supported 3 NVIDIA GT 530M
+NVIDIA GeForce GT 540M/PCI/SSE2 supported 3 NVIDIA GT 540M
+NVIDIA GeForce GT 545/PCI/SSE2 supported 3 NVIDIA GT 540M
+NVIDIA GeForce GT 550M/PCI/SSE2 supported 3 NVIDIA GT 550M
+NVIDIA GeForce GT 555M/PCI/SSE2 supported 3 NVIDIA GT 555M
+NVIDIA GeForce GTS 150/PCI/SSE2 supported 2 NVIDIA GT 150M
+NVIDIA GeForce GTS 160M/PCI/SSE2 supported 2 NVIDIA GTS 160M
+NVIDIA GeForce GTS 240/PCI/SSE2 supported 3 NVIDIA GTS 240
+NVIDIA GeForce GTS 250/PCI/SSE2 supported 3 NVIDIA GTS 250
+NVIDIA GeForce GTS 250/PCI/SSE2/3DNOW! supported 3 NVIDIA GTS 250
+NVIDIA GeForce GTS 250M/PCI/SSE2 supported 3 NVIDIA GTS 250
+NVIDIA GeForce GTS 350M/PCI/SSE2 supported 3 NVIDIA GTS 350M
+NVIDIA GeForce GTS 360M/PCI/SSE2 supported 3 NVIDIA GTS 360M
+NVIDIA GeForce GTS 450/PCI/SSE2 supported 3 NVIDIA GTS 450
+NVIDIA GeForce GTS 450/PCI/SSE2/3DNOW! supported 3 NVIDIA GTS 450
+NVIDIA GeForce GTS 455/PCI/SSE2 supported 3 NVIDIA GTS 450
+NVIDIA GeForce GTX 260/PCI/SSE2 supported 3 NVIDIA GTX 260
+NVIDIA GeForce GTX 260/PCI/SSE2/3DNOW! supported 3 NVIDIA GTX 260
+NVIDIA GeForce GTX 260M/PCI/SSE2 supported 3 NVIDIA GTX 260
+NVIDIA GeForce GTX 275/PCI/SSE2 supported 3 NVIDIA GTX 275
+NVIDIA GeForce GTX 275/PCI/SSE2/3DNOW! supported 3 NVIDIA GTX 275
+NVIDIA GeForce GTX 280 supported 3 NVIDIA GTX 280
+NVIDIA GeForce GTX 280/PCI/SSE2 supported 3 NVIDIA GTX 280
+NVIDIA GeForce GTX 280M/PCI/SSE2 supported 3 NVIDIA GTX 280
+NVIDIA GeForce GTX 285 supported 3 NVIDIA GTX 285
+NVIDIA GeForce GTX 285/PCI/SSE2 supported 3 NVIDIA GTX 285
+NVIDIA GeForce GTX 295/PCI/SSE2 supported 3 NVIDIA GTX 295
+NVIDIA GeForce GTX 460 SE/PCI/SSE2 supported 3 NVIDIA GTX 460
+NVIDIA GeForce GTX 460 SE/PCI/SSE2/3DNOW! supported 3 NVIDIA GTX 460
+NVIDIA GeForce GTX 460/PCI/SSE2 supported 3 NVIDIA GTX 460
+NVIDIA GeForce GTX 460/PCI/SSE2/3DNOW! supported 3 NVIDIA GTX 460
+NVIDIA GeForce GTX 460M/PCI/SSE2 supported 3 NVIDIA GTX 460M
+NVIDIA GeForce GTX 465/PCI/SSE2 supported 3 NVIDIA GTX 465
+NVIDIA GeForce GTX 465/PCI/SSE2/3DNOW! supported 3 NVIDIA GTX 465
+NVIDIA GeForce GTX 470/PCI/SSE2 supported 3 NVIDIA GTX 470
+NVIDIA GeForce GTX 470/PCI/SSE2/3DNOW! supported 3 NVIDIA GTX 470
+NVIDIA GeForce GTX 480/PCI/SSE2 supported 3 NVIDIA GTX 480
+NVIDIA GeForce GTX 550 Ti/PCI/SSE2 supported 3 NVIDIA GTX 550
+NVIDIA GeForce GTX 550 Ti/PCI/SSE2/3DNOW! supported 3 NVIDIA GTX 550
+NVIDIA GeForce GTX 560 Ti/PCI/SSE2 supported 3 NVIDIA GTX 560
+NVIDIA GeForce GTX 560 Ti/PCI/SSE2/3DNOW! supported 3 NVIDIA GTX 560
+NVIDIA GeForce GTX 560/PCI/SSE2 supported 3 NVIDIA GTX 560
+NVIDIA GeForce GTX 560/PCI/SSE2/3DNOW! supported 3 NVIDIA GTX 560
+NVIDIA GeForce GTX 560M/PCI/SSE2 supported 3 NVIDIA GTX 560
+NVIDIA GeForce GTX 570/PCI/SSE2 supported 3 NVIDIA GTX 570
+NVIDIA GeForce GTX 570/PCI/SSE2/3DNOW! supported 3 NVIDIA GTX 570
+NVIDIA GeForce GTX 580/PCI/SSE2 supported 3 NVIDIA GTX 580
+NVIDIA GeForce GTX 580/PCI/SSE2/3DNOW! supported 3 NVIDIA GTX 580
+NVIDIA GeForce GTX 580M/PCI/SSE2 supported 3 NVIDIA GTX 580M
+NVIDIA GeForce GTX 590/PCI/SSE2 supported 3 NVIDIA GTX 590
+NVIDIA GeForce Go 6 supported 1 NVIDIA GeForce Go 6
+NVIDIA GeForce Go 6100 supported 0 NVIDIA G100
+NVIDIA GeForce Go 6100/PCI/SSE2 supported 0 NVIDIA G100
+NVIDIA GeForce Go 6100/PCI/SSE2/3DNOW! supported 0 NVIDIA G100
+NVIDIA GeForce Go 6150/PCI/SSE2 supported 0 NVIDIA GeForce Go 6100
+NVIDIA GeForce Go 6150/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce Go 6100
+NVIDIA GeForce Go 6200 supported 0 NVIDIA G 200
+NVIDIA GeForce Go 6200/PCI/SSE2 supported 0 NVIDIA G 200
+NVIDIA GeForce Go 6400 supported 1 NVIDIA GeForce Go 6400
+NVIDIA GeForce Go 6400/PCI/SSE2 supported 1 NVIDIA GeForce Go 6400
+NVIDIA GeForce Go 6600 supported 1 NVIDIA GeForce Go 6600
+NVIDIA GeForce Go 6600/PCI/SSE2 supported 1 NVIDIA GeForce Go 6600
+NVIDIA GeForce Go 6800 supported 1 NVIDIA GeForce Go 6800
+NVIDIA GeForce Go 6800 Ultra/PCI/SSE2 supported 1 NVIDIA GeForce Go 6800
+NVIDIA GeForce Go 6800/PCI/SSE2 supported 1 NVIDIA GeForce Go 6800
+NVIDIA GeForce Go 7200 supported 0 NVIDIA G 200
+NVIDIA GeForce Go 7200/PCI/SSE2 supported 0 NVIDIA G 200
+NVIDIA GeForce Go 7200/PCI/SSE2/3DNOW! supported 0 NVIDIA G 200
+NVIDIA GeForce Go 7300 supported 1 NVIDIA GeForce Go 7300
+NVIDIA GeForce Go 7300/PCI/SSE2 supported 1 NVIDIA GeForce Go 7300
+NVIDIA GeForce Go 7300/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce Go 7300
+NVIDIA GeForce Go 7400 supported 1 NVIDIA GeForce Go 7400
+NVIDIA GeForce Go 7400/PCI/SSE2 supported 1 NVIDIA GeForce Go 7400
+NVIDIA GeForce Go 7400/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce Go 7400
+NVIDIA GeForce Go 7600 supported 2 NVIDIA GeForce Go 7600
+NVIDIA GeForce Go 7600/PCI/SSE2 supported 2 NVIDIA GeForce Go 7600
+NVIDIA GeForce Go 7600/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce Go 7600
+NVIDIA GeForce Go 7700 supported 2 NVIDIA GeForce Go 7700
+NVIDIA GeForce Go 7700/PCI/SSE2 supported 2 NVIDIA GeForce Go 7700
+NVIDIA GeForce Go 7800 supported 2 NVIDIA GeForce Go 7800
+NVIDIA GeForce Go 7800 GTX/PCI/SSE2 supported 2 NVIDIA GeForce Go 7800
+NVIDIA GeForce Go 7900 supported 2 NVIDIA GeForce Go 7900
+NVIDIA GeForce Go 7900 GS/PCI/SSE2 supported 2 NVIDIA GeForce Go 7900
+NVIDIA GeForce Go 7900 GTX/PCI/SSE2 supported 2 NVIDIA GeForce Go 7900
+NVIDIA GeForce Go 7950 GTX/PCI/SSE2 supported 2 NVIDIA GeForce Go 7900
+NVIDIA GeForce PCX supported 0 NVIDIA GeForce PCX
+NVIDIA GeForce2 GTS/AGP/SSE supported 0 NVIDIA GeForce 2
+NVIDIA GeForce2 MX/AGP/3DNOW! supported 0 NVIDIA GeForce 2
+NVIDIA GeForce2 MX/AGP/SSE/3DNOW! supported 0 NVIDIA GeForce 2
+NVIDIA GeForce2 MX/AGP/SSE2 supported 0 NVIDIA GeForce 2
+NVIDIA GeForce2 MX/PCI/SSE2 supported 0 NVIDIA GeForce 2
+NVIDIA GeForce3/AGP/SSE/3DNOW! supported 0 NVIDIA GeForce 3
+NVIDIA GeForce3/AGP/SSE2 supported 0 NVIDIA GeForce 3
+NVIDIA GeForce4 420 Go 32M/AGP/SSE2 supported 0 NVIDIA GeForce 4
+NVIDIA GeForce4 420 Go 32M/AGP/SSE2/3DNOW! supported 0 NVIDIA GeForce 4
+NVIDIA GeForce4 420 Go 32M/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 4
+NVIDIA GeForce4 420 Go/AGP/SSE2 supported 0 NVIDIA GeForce 4
+NVIDIA GeForce4 440 Go 64M/AGP/SSE2/3DNOW! supported 0 NVIDIA GeForce 4
+NVIDIA GeForce4 440 Go/AGP/SSE2 supported 0 NVIDIA GeForce 4
+NVIDIA GeForce4 460 Go/AGP/SSE2 supported 0 NVIDIA GeForce 4
+NVIDIA GeForce4 MX 4000/AGP/SSE/3DNOW! supported 0 NVIDIA GeForce 4
+NVIDIA GeForce4 MX 4000/AGP/SSE2 supported 0 NVIDIA GeForce 4
+NVIDIA GeForce4 MX 4000/PCI/3DNOW! supported 0 NVIDIA GeForce 4
+NVIDIA GeForce4 MX 4000/PCI/SSE/3DNOW! supported 0 NVIDIA GeForce 4
+NVIDIA GeForce4 MX 4000/PCI/SSE2 supported 0 NVIDIA GeForce 4
+NVIDIA GeForce4 MX 420/AGP/SSE/3DNOW! supported 0 NVIDIA GeForce 4
+NVIDIA GeForce4 MX 420/AGP/SSE2 supported 0 NVIDIA GeForce 4
+NVIDIA GeForce4 MX 440 with AGP8X/AGP/SSE2 supported 0 NVIDIA GeForce 4
+NVIDIA GeForce4 MX 440/AGP/SSE2 supported 0 NVIDIA GeForce 4
+NVIDIA GeForce4 MX 440/AGP/SSE2/3DNOW! supported 0 NVIDIA GeForce 4
+NVIDIA GeForce4 MX 440SE with AGP8X/AGP/SSE2 supported 0 NVIDIA GeForce 4
+NVIDIA GeForce4 MX Integrated GPU/AGP/SSE/3DNOW! supported 0 NVIDIA GeForce 4
+NVIDIA GeForce4 Ti 4200 with AGP8X/AGP/SSE supported 0 NVIDIA G 200
+NVIDIA GeForce4 Ti 4200/AGP/SSE/3DNOW! supported 0 NVIDIA G 200
+NVIDIA GeForce4 Ti 4400/AGP/SSE2 supported 0 NVIDIA GeForce 4
+NVIDIA Generic NO MATCH
+NVIDIA ION LE/PCI/SSE2 supported 2 NVIDIA ION
+NVIDIA ION/PCI/SSE2 supported 2 NVIDIA ION
+NVIDIA ION/PCI/SSE2/3DNOW! supported 2 NVIDIA ION
+NVIDIA MCP61/PCI/SSE2 supported 1 NVIDIA MCP61
+NVIDIA MCP61/PCI/SSE2/3DNOW! supported 1 NVIDIA MCP61
+NVIDIA MCP73/PCI/SSE2 supported 1 NVIDIA MCP73
+NVIDIA MCP79MH/PCI/SSE2 supported 1 NVIDIA MCP79
+NVIDIA MCP79MX/PCI/SSE2 supported 1 NVIDIA MCP79
+NVIDIA MCP7A-O/PCI/SSE2 supported 1 NVIDIA MCP7A
+NVIDIA MCP7A-S/PCI/SSE2 supported 1 NVIDIA MCP7A
+NVIDIA MCP89-EPT/PCI/SSE2 NO MATCH
+NVIDIA N10M-GE1/PCI/SSE2 supported 1 NVIDIA N10
+NVIDIA N10P-GE1/PCI/SSE2 supported 1 NVIDIA N10
+NVIDIA N10P-GV2/PCI/SSE2 supported 1 NVIDIA N10
+NVIDIA N11M-GE1/PCI/SSE2 NO MATCH
+NVIDIA N11M-GE2/PCI/SSE2 NO MATCH
+NVIDIA N12E-GS-A1/PCI/SSE2 NO MATCH
+NVIDIA N12P-GVR-B-A1/PCI/SSE2 NO MATCH
+NVIDIA N13M-GE1-B-A1/PCI/SSE2 NO MATCH
+NVIDIA N13P-GL-A1/PCI/SSE2 NO MATCH
+NVIDIA NB9M-GE/PCI/SSE2 supported 1 NVIDIA NB9M
+NVIDIA NB9M-GE1/PCI/SSE2 supported 1 NVIDIA NB9M
+NVIDIA NB9M-GS/PCI/SSE2 supported 1 NVIDIA NB9M
+NVIDIA NB9M-NS/PCI/SSE2 supported 1 NVIDIA NB9M
+NVIDIA NB9P-GE1/PCI/SSE2 supported 2 NVIDIA NB9P
+NVIDIA NB9P-GS/PCI/SSE2 supported 2 NVIDIA NB9P
+NVIDIA NV17/AGP/3DNOW! supported 0 NVIDIA NV17
+NVIDIA NV17/AGP/SSE2 supported 0 NVIDIA NV17
+NVIDIA NV34 supported 0 NVIDIA NV34
+NVIDIA NV35 supported 0 NVIDIA NV35
+NVIDIA NV36/AGP/SSE/3DNOW! supported 1 NVIDIA NV36
+NVIDIA NV36/AGP/SSE2 supported 1 NVIDIA NV36
+NVIDIA NV41/PCI/SSE2 supported 1 NVIDIA NV41
+NVIDIA NV43 supported 1 NVIDIA NV43
+NVIDIA NV43/PCI/SSE2 supported 1 NVIDIA NV43
+NVIDIA NV44 supported 1 NVIDIA NV44
+NVIDIA NV44/AGP/SSE2 supported 1 NVIDIA NV44
+NVIDIA NVIDIA GeForce 210 OpenGL Engine supported 2 NVIDIA 210
+NVIDIA NVIDIA GeForce 320M OpenGL Engine supported 2 NVIDIA 320M
+NVIDIA NVIDIA GeForce 7300 GT OpenGL Engine supported 1 NVIDIA GeForce 7300
+NVIDIA NVIDIA GeForce 7600 GT OpenGL Engine supported 2 NVIDIA GeForce 7600
+NVIDIA NVIDIA GeForce 8600M GT OpenGL Engine supported 1 NVIDIA GeForce 8600M
+NVIDIA NVIDIA GeForce 8800 GS OpenGL Engine supported 3 NVIDIA GeForce 8800
+NVIDIA NVIDIA GeForce 8800 GT OpenGL Engine supported 3 NVIDIA GeForce 8800
+NVIDIA NVIDIA GeForce 9400 OpenGL Engine supported 1 NVIDIA GeForce 9400
+NVIDIA NVIDIA GeForce 9400M OpenGL Engine supported 1 NVIDIA GeForce 9400M
+NVIDIA NVIDIA GeForce 9500 GT OpenGL Engine supported 2 NVIDIA GeForce 9500
+NVIDIA NVIDIA GeForce 9600M GT OpenGL Engine supported 3 NVIDIA GeForce 9600M
+NVIDIA NVIDIA GeForce GT 120 OpenGL Engine supported 2 NVIDIA GT 120M
+NVIDIA NVIDIA GeForce GT 130 OpenGL Engine supported 2 NVIDIA GT 130M
+NVIDIA NVIDIA GeForce GT 220 OpenGL Engine supported 2 NVIDIA GT 220M
+NVIDIA NVIDIA GeForce GT 230M OpenGL Engine supported 2 NVIDIA GT 230M
+NVIDIA NVIDIA GeForce GT 240M OpenGL Engine supported 2 NVIDIA GT 240M
+NVIDIA NVIDIA GeForce GT 330M OpenGL Engine supported 3 NVIDIA GT 330M
+NVIDIA NVIDIA GeForce GT 420M OpenGL Engine supported 2 NVIDIA GT 420M
+NVIDIA NVIDIA GeForce GT 425M OpenGL Engine supported 3 NVIDIA GT 425M
+NVIDIA NVIDIA GeForce GT 430 OpenGL Engine supported 3 NVIDIA GT 430M
+NVIDIA NVIDIA GeForce GT 440 OpenGL Engine supported 3 NVIDIA GT 440M
+NVIDIA NVIDIA GeForce GT 540M OpenGL Engine supported 3 NVIDIA GT 540M
+NVIDIA NVIDIA GeForce GTS 240 OpenGL Engine supported 3 NVIDIA GTS 240
+NVIDIA NVIDIA GeForce GTS 250 OpenGL Engine supported 3 NVIDIA GTS 250
+NVIDIA NVIDIA GeForce GTS 450 OpenGL Engine supported 3 NVIDIA GTS 450
+NVIDIA NVIDIA GeForce GTX 285 OpenGL Engine supported 3 NVIDIA GTX 285
+NVIDIA NVIDIA GeForce GTX 460 OpenGL Engine supported 3 NVIDIA GTX 460
+NVIDIA NVIDIA GeForce GTX 460M OpenGL Engine supported 3 NVIDIA GTX 460M
+NVIDIA NVIDIA GeForce GTX 465 OpenGL Engine supported 3 NVIDIA GTX 465
+NVIDIA NVIDIA GeForce GTX 470 OpenGL Engine supported 3 NVIDIA GTX 470
+NVIDIA NVIDIA GeForce GTX 480 OpenGL Engine supported 3 NVIDIA GTX 480
+NVIDIA NVIDIA GeForce Pre-Release GF108 ES OpenGL Engine NO MATCH
+NVIDIA NVIDIA GeForce Pre-Release ION OpenGL Engine supported 2 NVIDIA ION
+NVIDIA NVIDIA GeForce Pre-Release MCP7A-J-DC OpenGL Engine supported 1 NVIDIA MCP7A
+NVIDIA NVIDIA GeForce4 OpenGL Engine supported 0 NVIDIA GeForce 4
+NVIDIA NVIDIA NV34MAP OpenGL Engine supported 0 NVIDIA NV34
+NVIDIA NVIDIA Quadro 4000 OpenGL Engine supported 3 NVIDIA Quadro 4000
+NVIDIA NVIDIA Quadro FX 4800 OpenGL Engine supported 3 NVIDIA Quadro FX 4800
+NVIDIA NVS 2100M/PCI/SSE2 supported 0 NVIDIA G100M
+NVIDIA NVS 300/PCI/SSE2 supported 0 NVIDIA Quadro NVS
+NVIDIA NVS 3100M/PCI/SSE2 supported 0 NVIDIA G100M
+NVIDIA NVS 4100/PCI/SSE2/3DNOW! supported 0 NVIDIA G100
+NVIDIA NVS 4200M/PCI/SSE2 supported 0 NVIDIA G 200
+NVIDIA NVS 5100M/PCI/SSE2 supported 0 NVIDIA G100M
+NVIDIA PCI NO MATCH
+NVIDIA Quadro 1000M/PCI/SSE2 supported 0 NVIDIA G100
+NVIDIA Quadro 2000/PCI/SSE2 supported 0 NVIDIA G 200
+NVIDIA Quadro 2000M/PCI/SSE2 supported 0 NVIDIA G 200
+NVIDIA Quadro 3000M/PCI/SSE2 supported 3 NVIDIA Quadro 3000M
+NVIDIA Quadro 4000 supported 3 NVIDIA Quadro 4000
+NVIDIA Quadro 4000 OpenGL Engine supported 3 NVIDIA Quadro 4000
+NVIDIA Quadro 4000/PCI/SSE2 supported 3 NVIDIA Quadro 4000
+NVIDIA Quadro 4000M/PCI/SSE2 supported 3 NVIDIA Quadro 4000M
+NVIDIA Quadro 5000/PCI/SSE2 supported 3 NVIDIA Quadro 50x0 M
+NVIDIA Quadro 5000M/PCI/SSE2 supported 3 NVIDIA Quadro 50x0 M
+NVIDIA Quadro 600 supported 2 NVIDIA Quadro 600
+NVIDIA Quadro 600/PCI/SSE2 supported 2 NVIDIA Quadro 600
+NVIDIA Quadro 600/PCI/SSE2/3DNOW! supported 2 NVIDIA Quadro 600
+NVIDIA Quadro 6000 supported 3 NVIDIA Quadro 6000
+NVIDIA Quadro 6000/PCI/SSE2 supported 3 NVIDIA Quadro 6000
+NVIDIA Quadro CX/PCI/SSE2 supported 3 NVIDIA Quadro CX
+NVIDIA Quadro DCC supported 0 NVIDIA Quadro DCC
+NVIDIA Quadro FX supported 1 NVIDIA Quadro FX
+NVIDIA Quadro FX 1100/AGP/SSE2 supported 0 NVIDIA G100
+NVIDIA Quadro FX 1400/PCI/SSE2 supported 2 NVIDIA Quadro 400
+NVIDIA Quadro FX 1500 supported 1 NVIDIA Quadro FX
+NVIDIA Quadro FX 1500/PCI/SSE2 supported 1 NVIDIA Quadro FX
+NVIDIA Quadro FX 1500M/PCI/SSE2 supported 1 NVIDIA Quadro FX 1500M
+NVIDIA Quadro FX 1600M/PCI/SSE2 supported 2 NVIDIA Quadro 600
+NVIDIA Quadro FX 1700 supported 1 NVIDIA Quadro FX
+NVIDIA Quadro FX 1700M/PCI/SSE2 supported 1 NVIDIA Quadro FX
+NVIDIA Quadro FX 1800 supported 1 NVIDIA Quadro FX
+NVIDIA Quadro FX 1800/PCI/SSE2 supported 1 NVIDIA Quadro FX
+NVIDIA Quadro FX 1800M/PCI/SSE2 supported 1 NVIDIA Quadro FX
+NVIDIA Quadro FX 2500M/PCI/SSE2 supported 2 NVIDIA Quadro FX 2500M
+NVIDIA Quadro FX 2700M/PCI/SSE2 supported 3 NVIDIA Quadro FX 2700M
+NVIDIA Quadro FX 2800M/PCI/SSE2 supported 3 NVIDIA Quadro FX 2800M
+NVIDIA Quadro FX 3400 supported 2 NVIDIA Quadro 400
+NVIDIA Quadro FX 3450 supported 1 NVIDIA Quadro FX
+NVIDIA Quadro FX 3450/4000 SDI/PCI/SSE2 supported 2 NVIDIA Quadro 400
+NVIDIA Quadro FX 3500 supported 2 NVIDIA Quadro FX 3500
+NVIDIA Quadro FX 3500M/PCI/SSE2 supported 2 NVIDIA Quadro FX 3500
+NVIDIA Quadro FX 360M/PCI/SSE2 supported 1 NVIDIA Quadro FX
+NVIDIA Quadro FX 370 supported 1 NVIDIA Quadro FX
+NVIDIA Quadro FX 370/PCI/SSE2 supported 1 NVIDIA Quadro FX
+NVIDIA Quadro FX 3700 supported 3 NVIDIA Quadro FX 3700
+NVIDIA Quadro FX 3700M/PCI/SSE2 supported 3 NVIDIA Quadro FX 3700
+NVIDIA Quadro FX 370M/PCI/SSE2 supported 1 NVIDIA Quadro FX
+NVIDIA Quadro FX 3800 supported 3 NVIDIA Quadro FX 3800
+NVIDIA Quadro FX 3800M/PCI/SSE2 supported 3 NVIDIA Quadro FX 3800
+NVIDIA Quadro FX 4500 supported 3 NVIDIA Quadro FX 4500
+NVIDIA Quadro FX 4600 supported 2 NVIDIA Quadro 600
+NVIDIA Quadro FX 4800 supported 3 NVIDIA Quadro FX 4800
+NVIDIA Quadro FX 4800/PCI/SSE2 supported 3 NVIDIA Quadro FX 4800
+NVIDIA Quadro FX 540/PCI/SSE2/3DNOW! supported 1 NVIDIA Quadro FX
+NVIDIA Quadro FX 560 supported 1 NVIDIA Quadro FX
+NVIDIA Quadro FX 560/PCI/SSE2 supported 1 NVIDIA Quadro FX
+NVIDIA Quadro FX 5600 supported 2 NVIDIA Quadro 600
+NVIDIA Quadro FX 570 supported 1 NVIDIA Quadro FX
+NVIDIA Quadro FX 570/PCI/SSE2 supported 1 NVIDIA Quadro FX
+NVIDIA Quadro FX 570M/PCI/SSE2 supported 1 NVIDIA Quadro FX
+NVIDIA Quadro FX 580/PCI/SSE2 supported 1 NVIDIA Quadro FX
+NVIDIA Quadro FX 770M/PCI/SSE2 supported 2 NVIDIA Quadro FX 770M
+NVIDIA Quadro FX 880M supported 3 NVIDIA Quadro FX 880M
+NVIDIA Quadro FX 880M/PCI/SSE2 supported 3 NVIDIA Quadro FX 880M
+NVIDIA Quadro FX Go700/AGP/SSE2 supported 1 NVIDIA Quadro FX
+NVIDIA Quadro NVS supported 0 NVIDIA Quadro NVS
+NVIDIA Quadro NVS 110M/PCI/SSE2 supported 0 NVIDIA G 110M
+NVIDIA Quadro NVS 130M/PCI/SSE2 supported 0 NVIDIA Quadro NVS 1xxM
+NVIDIA Quadro NVS 135M/PCI/SSE2 supported 0 NVIDIA Quadro NVS 1xxM
+NVIDIA Quadro NVS 140M/PCI/SSE2 supported 0 NVIDIA Quadro NVS 1xxM
+NVIDIA Quadro NVS 150M/PCI/SSE2 supported 0 NVIDIA Quadro NVS 1xxM
+NVIDIA Quadro NVS 160M/PCI/SSE2 supported 0 NVIDIA Quadro NVS 1xxM
+NVIDIA Quadro NVS 210S/PCI/SSE2/3DNOW! supported 1 NVIDIA G 210
+NVIDIA Quadro NVS 285/PCI/SSE2 supported 0 NVIDIA Quadro NVS
+NVIDIA Quadro NVS 290/PCI/SSE2 supported 0 NVIDIA Quadro NVS
+NVIDIA Quadro NVS 295/PCI/SSE2 supported 0 NVIDIA Quadro NVS
+NVIDIA Quadro NVS 320M/PCI/SSE2 supported 2 NVIDIA G 320M
+NVIDIA Quadro NVS 55/280 PCI/PCI/SSE2 supported 0 NVIDIA Quadro NVS
+NVIDIA Quadro NVS/PCI/SSE2 supported 0 NVIDIA Quadro NVS
+NVIDIA Quadro PCI-E Series/PCI/SSE2/3DNOW! NO MATCH
+NVIDIA Quadro VX 200/PCI/SSE2 supported 0 NVIDIA G 200
+NVIDIA Quadro/AGP/SSE2 NO MATCH
+NVIDIA Quadro2 supported 0 NVIDIA Quadro2
+NVIDIA Quadro4 supported 0 NVIDIA Quadro4
+NVIDIA Quadro4 750 XGL/AGP/SSE2 supported 0 NVIDIA Quadro4
+NVIDIA RIVA TNT unsupported 0 NVIDIA RIVA TNT
+NVIDIA RIVA TNT2/AGP/SSE2 unsupported 0 NVIDIA RIVA TNT
+NVIDIA RIVA TNT2/PCI/3DNOW! unsupported 0 NVIDIA RIVA TNT
+NVIDIA Tesla C2050/PCI/SSE2 supported 0 NVIDIA G 205M
+NVIDIA nForce unsupported 0 NVIDIA nForce
+NVIDIA nForce 730a/PCI/SSE2 unsupported 0 NVIDIA nForce
+NVIDIA nForce 730a/PCI/SSE2/3DNOW! unsupported 0 NVIDIA nForce
+NVIDIA nForce 750a SLI/PCI/SSE2 unsupported 0 NVIDIA nForce
+NVIDIA nForce 750a SLI/PCI/SSE2/3DNOW! unsupported 0 NVIDIA nForce
+NVIDIA nForce 760i SLI/PCI/SSE2 unsupported 0 NVIDIA nForce
+NVIDIA nForce 780a SLI/PCI/SSE2/3DNOW! unsupported 0 NVIDIA nForce
+NVIDIA nForce 980a/780a SLI/PCI/SSE2 unsupported 0 NVIDIA nForce
+NVIDIA nForce 980a/780a SLI/PCI/SSE2/3DNOW! unsupported 0 NVIDIA nForce
+NVIDIA unknown board/AGP/SSE2 unsupported 0 NVIDIA Generic
+NVIDIA unknown board/PCI/SSE2 unsupported 0 NVIDIA Generic
+NVIDIA unknown board/PCI/SSE2/3DNOW! unsupported 0 NVIDIA Generic
+Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5670 OpenGL Engine supported 3 ATI Radeon HD 5600
+Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5750 OpenGL Engine supported 3 ATI Radeon HD 5700
+Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5770 OpenGL Engine supported 3 ATI Radeon HD 5700
+Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6490M OpenGL Engine supported 3 ATI Radeon HD 6400
+Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6750M OpenGL Engine supported 3 ATI Radeon HD 6700
+Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6770M OpenGL Engine supported 3 ATI Radeon HD 6700
+Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6970M OpenGL Engine supported 3 ATI Radeon HD 6900
+Parallels and Intel Inc. 3D-Analyze v2.3 - http://www.tommti-systems.com NO MATCH
+Parallels and Intel Inc. Parallels using Intel HD Graphics 3000 OpenGL Engine supported 2 Intel HD Graphics
+Parallels and NVIDIA Parallels using NVIDIA GeForce 320M OpenGL Engine supported 2 NVIDIA 320M
+Parallels and NVIDIA Parallels using NVIDIA GeForce 9400 OpenGL Engine supported 1 NVIDIA GeForce 9400
+Parallels and NVIDIA Parallels using NVIDIA GeForce GT 120 OpenGL Engine supported 2 NVIDIA GT 120M
+Parallels and NVIDIA Parallels using NVIDIA GeForce GT 330M OpenGL Engine supported 3 NVIDIA GT 330M
+Radeon RV350 on Gallium supported 0 ATI RV350 (9600)
+S3 NO MATCH
+S3 Fire GL2 NO MATCH
+S3 Graphics VIA/S3G UniChrome IGP/MMX/K3D unsupported 0 S3
+S3 Graphics VIA/S3G UniChrome IGP/MMX/SSE unsupported 0 S3
+S3 Graphics VIA/S3G UniChrome Pro IGP/MMX/SSE unsupported 0 S3
+S3 Graphics, Incorporated ProSavage/Twister unsupported 0 S3
+S3 Graphics, Incorporated S3 Graphics Chrome9 HC unsupported 0 S3
+S3 Graphics, Incorporated S3 Graphics DeltaChrome unsupported 0 S3
+S3 Graphics, Incorporated VIA Chrome9 HC IGP unsupported 0 S3
+SiS unsupported 0 SiS
+SiS 650/M650 VGA unsupported 0 SiS
+SiS 661 VGA unsupported 0 SiS
+SiS 662 VGA unsupported 0 SiS
+SiS 741 VGA unsupported 0 SiS
+SiS 760 VGA unsupported 0 SiS
+SiS 761GX VGA unsupported 0 SiS
+SiS Mirage Graphics3 unsupported 0 SiS
+SiS Xabre VGA unsupported 0 SiS
+Trident unsupported 0 Trident
+Tungsten Graphics unsupported 0 Tungsten Graphics
+Tungsten Graphics, Inc Mesa DRI 865G GEM 20091221 2009Q4 x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI 865G GEM 20100330 DEVELOPMENT x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI 915G GEM 20091221 2009Q4 x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI 915G GEM 20100330 DEVELOPMENT x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI 915GM GEM 20090712 2009Q2 RC3 x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI 915GM GEM 20091221 2009Q4 x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI 915GM GEM 20100330 DEVELOPMENT x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI 945G unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI 945G GEM 20091221 2009Q4 x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI 945G GEM 20100330 DEVELOPMENT unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI 945G GEM 20100330 DEVELOPMENT x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI 945GM GEM 20090712 2009Q2 RC3 x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI 945GM GEM 20091221 2009Q4 x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI 945GM GEM 20100328 2010Q1 x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI 945GM GEM 20100330 DEVELOPMENT x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI 945GME x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI 945GME 20061017 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI 945GME GEM 20090712 2009Q2 RC3 x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI 945GME GEM 20091221 2009Q4 x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI 945GME GEM 20100330 DEVELOPMENT x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI 965GM GEM 20090326 2009Q1 RC2 x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI 965GM GEM 20090712 2009Q2 RC3 x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI 965GM GEM 20091221 2009Q4 x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI 965GM GEM 20100330 DEVELOPMENT x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI G33 20061017 x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI G33 GEM 20090712 2009Q2 RC3 x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI G33 GEM 20091221 2009Q4 x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI G41 GEM 20091221 2009Q4 x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI G41 GEM 20100330 DEVELOPMENT x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI GMA500 20081116 - 5.0.1.0046 x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI IGD GEM 20091221 2009Q4 x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI IGD GEM 20100330 DEVELOPMENT unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI IGD GEM 20100330 DEVELOPMENT x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI IGDNG_D GEM 20091221 2009Q4 x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI Ironlake Desktop GEM 20100330 DEVELOPMENT x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI Ironlake Mobile GEM 20100330 DEVELOPMENT x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset 20080716 x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20090712 2009Q2 RC3 x86/MMX... unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20091221 2009Q4 x86/MMX/SSE2 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20100328 2010Q1 unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20100330 DEVELOPMENT unsupported 0 Mesa
+Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20100330 DEVELOPMENT x86/MM... unsupported 0 Mesa
+Tungsten Graphics, Inc. Mesa DRI R200 (RV250 4C66) 20090101 x86/MMX/SSE2 TCL DRI2 unsupported 0 Mesa
+Tungsten Graphics, Inc. Mesa DRI R200 (RV280 5964) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 unsupported 0 Mesa
+VIA unsupported 0 VIA
+VMware, Inc. Gallium 0.3 on SVGA3D; build: RELEASE; NO MATCH
+VMware, Inc. Gallium 0.4 on SVGA3D; build: DEBUG; mutex: MSVC Intrinsics NO MATCH
+VMware, Inc. Gallium 0.4 on SVGA3D; build: RELEASE; NO MATCH
+VMware, Inc. Gallium 0.4 on i915 (chipset: 945GM) NO MATCH
+VMware, Inc. Gallium 0.4 on llvmpipe NO MATCH
+VMware, Inc. Gallium 0.4 on softpipe NO MATCH
+X.Org Gallium 0.4 on AMD BARTS supported 3 AMD BARTS (HD 6800)
+X.Org Gallium 0.4 on AMD CEDAR supported 2 AMD CEDAR (HD 5450)
+X.Org Gallium 0.4 on AMD HEMLOCK supported 3 AMD HEMLOCK (HD 5970)
+X.Org Gallium 0.4 on AMD JUNIPER supported 3 AMD JUNIPER (HD 5700)
+X.Org Gallium 0.4 on AMD PALM NO MATCH
+X.Org Gallium 0.4 on AMD REDWOOD supported 3 AMD REDWOOD (HD 5500/5600)
+X.Org Gallium 0.4 on AMD RS780 supported 0 AMD RS780 (HD 3200)
+X.Org Gallium 0.4 on AMD RS880 supported 1 AMD RS880 (HD 4200)
+X.Org Gallium 0.4 on AMD RV610 supported 1 AMD RV610 (HD 2400)
+X.Org Gallium 0.4 on AMD RV620 supported 1 AMD RV620 (HD 3400)
+X.Org Gallium 0.4 on AMD RV630 supported 2 AMD RV630 (HD 2600)
+X.Org Gallium 0.4 on AMD RV635 supported 3 AMD RV635 (HD 3600)
+X.Org Gallium 0.4 on AMD RV710 supported 1 AMD RV710 (HD 4300)
+X.Org Gallium 0.4 on AMD RV730 supported 3 AMD RV730 (HD 4600)
+X.Org Gallium 0.4 on AMD RV740 supported 3 AMD RV740 (HD 4700)
+X.Org Gallium 0.4 on AMD RV770 supported 3 AMD RV770 (HD 4800)
+X.Org R300 Project Gallium 0.4 on ATI R300 supported 1 ATI R300 (9700)
+X.Org R300 Project Gallium 0.4 on ATI R350 supported 1 ATI R350 (9800)
+X.Org R300 Project Gallium 0.4 on ATI R420 supported 1 ATI R300 (9700)
+X.Org R300 Project Gallium 0.4 on ATI R580 supported 3 ATI R580 (X1900)
+X.Org R300 Project Gallium 0.4 on ATI RC410 unsupported 0 ATI RC410 (Xpress 200)
+X.Org R300 Project Gallium 0.4 on ATI RS480 unsupported 0 ATI RS48x (Xpress 200x)
+X.Org R300 Project Gallium 0.4 on ATI RS482 unsupported 0 ATI RS48x (Xpress 200x)
+X.Org R300 Project Gallium 0.4 on ATI RS600 unsupported 0 ATI RS600 (Xpress 3200)
+X.Org R300 Project Gallium 0.4 on ATI RS690 supported 1 ATI R300 (9700)
+X.Org R300 Project Gallium 0.4 on ATI RS740 supported 1 ATI R300 (9700)
+X.Org R300 Project Gallium 0.4 on ATI RV350 supported 0 ATI RV350 (9600)
+X.Org R300 Project Gallium 0.4 on ATI RV370 supported 0 ATI RV370 (X300)
+X.Org R300 Project Gallium 0.4 on ATI RV410 supported 1 ATI RV410 (X700)
+X.Org R300 Project Gallium 0.4 on ATI RV515 supported 1 ATI RV515
+X.Org R300 Project Gallium 0.4 on ATI RV530 supported 1 ATI RV530
+X.Org R300 Project Gallium 0.4 on ATI RV560 supported 1 ATI R300 (9700)
+X.Org R300 Project Gallium 0.4 on ATI RV570 supported 3 ATI RV570 (X1900 GT/PRO)
+X.Org R300 Project Gallium 0.4 on R420 supported 1 ATI R300 (9700)
+X.Org R300 Project Gallium 0.4 on R580 supported 3 ATI R580 (X1900)
+X.Org R300 Project Gallium 0.4 on RC410 unsupported 0 ATI RC410 (Xpress 200)
+X.Org R300 Project Gallium 0.4 on RS480 unsupported 0 ATI RS48x (Xpress 200x)
+X.Org R300 Project Gallium 0.4 on RS482 unsupported 0 ATI RS48x (Xpress 200x)
+X.Org R300 Project Gallium 0.4 on RS600 unsupported 0 ATI RS600 (Xpress 3200)
+X.Org R300 Project Gallium 0.4 on RS690 supported 1 ATI R300 (9700)
+X.Org R300 Project Gallium 0.4 on RS740 supported 1 ATI R300 (9700)
+X.Org R300 Project Gallium 0.4 on RV350 supported 0 ATI RV350 (9600)
+X.Org R300 Project Gallium 0.4 on RV370 supported 0 ATI RV370 (X300)
+X.Org R300 Project Gallium 0.4 on RV410 supported 1 ATI RV410 (X700)
+X.Org R300 Project Gallium 0.4 on RV515 supported 1 ATI RV515
+X.Org R300 Project Gallium 0.4 on RV530 supported 1 ATI RV530
+XGI unsupported 0 XGI
+nouveau Gallium 0.4 on NV31 NO MATCH
+nouveau Gallium 0.4 on NV34 NO MATCH
+nouveau Gallium 0.4 on NV36 NO MATCH
+nouveau Gallium 0.4 on NV43 NO MATCH
+nouveau Gallium 0.4 on NV44 NO MATCH
+nouveau Gallium 0.4 on NV46 NO MATCH
+nouveau Gallium 0.4 on NV49 NO MATCH
+nouveau Gallium 0.4 on NV4A NO MATCH
+nouveau Gallium 0.4 on NV4B NO MATCH
+nouveau Gallium 0.4 on NV4C NO MATCH
+nouveau Gallium 0.4 on NV4E NO MATCH
+nouveau Gallium 0.4 on NV50 NO MATCH
+nouveau Gallium 0.4 on NV63 NO MATCH
+nouveau Gallium 0.4 on NV67 NO MATCH
+nouveau Gallium 0.4 on NV84 NO MATCH
+nouveau Gallium 0.4 on NV86 NO MATCH
+nouveau Gallium 0.4 on NV92 NO MATCH
+nouveau Gallium 0.4 on NV94 NO MATCH
+nouveau Gallium 0.4 on NV96 NO MATCH
+nouveau Gallium 0.4 on NV98 NO MATCH
+nouveau Gallium 0.4 on NVA0 NO MATCH
+nouveau Gallium 0.4 on NVA3 NO MATCH
+nouveau Gallium 0.4 on NVA5 NO MATCH
+nouveau Gallium 0.4 on NVA8 NO MATCH
+nouveau Gallium 0.4 on NVAA NO MATCH
+nouveau Gallium 0.4 on NVAC NO MATCH
diff --git a/indra/newview/tests/gpus_seen.txt b/indra/newview/tests/gpus_seen.txt
new file mode 100644
index 0000000000..570f92a9b0
--- /dev/null
+++ b/indra/newview/tests/gpus_seen.txt
@@ -0,0 +1,2422 @@
+ATI
+ATI 3D-Analyze
+ATI ASUS A9xxx
+ATI ASUS AH24xx
+ATI ASUS AH26xx
+ATI ASUS AH34xx
+ATI ASUS AH36xx
+ATI ASUS AH46xx
+ATI ASUS AX3xx
+ATI ASUS AX5xx
+ATI ASUS AX8xx
+ATI ASUS EAH38xx
+ATI ASUS EAH43xx
+ATI ASUS EAH45xx
+ATI ASUS EAH48xx
+ATI ASUS EAH57xx
+ATI ASUS EAH58xx
+ATI ASUS X1xxx
+ATI All-in-Wonder 9xxx
+ATI All-in-Wonder HD
+ATI All-in-Wonder PCI-E
+ATI All-in-Wonder X1800
+ATI All-in-Wonder X1900
+ATI All-in-Wonder X600
+ATI All-in-Wonder X800
+ATI Diamond X1xxx
+ATI Display Adapter
+ATI FireGL
+ATI FireGL 5200
+ATI FireGL 5xxx
+ATI FireMV
+ATI Generic
+ATI Hercules 9800
+ATI IGP 340M
+ATI M52
+ATI M54
+ATI M56
+ATI M71
+ATI M72
+ATI M76
+ATI Mobility Radeon
+ATI Mobility Radeon 7xxx
+ATI Mobility Radeon 9600
+ATI Mobility Radeon 9700
+ATI Mobility Radeon 9800
+ATI Mobility Radeon HD 2300
+ATI Mobility Radeon HD 2400
+ATI Mobility Radeon HD 2600
+ATI Mobility Radeon HD 2700
+ATI Mobility Radeon HD 3400
+ATI Mobility Radeon HD 3600
+ATI Mobility Radeon HD 3800
+ATI Mobility Radeon HD 4200
+ATI Mobility Radeon HD 4300
+ATI Mobility Radeon HD 4500
+ATI Mobility Radeon HD 4600
+ATI Mobility Radeon HD 4800
+ATI Mobility Radeon HD 5400
+ATI Mobility Radeon HD 5600
+ATI Mobility Radeon X1xxx
+ATI Mobility Radeon X2xxx
+ATI Mobility Radeon X3xx
+ATI Mobility Radeon X6xx
+ATI Mobility Radeon X7xx
+ATI Mobility Radeon Xxxx
+ATI RV380
+ATI RV530
+ATI Radeon 2100
+ATI Radeon 3000
+ATI Radeon 3100
+ATI Radeon 7000
+ATI Radeon 7xxx
+ATI Radeon 8xxx
+ATI Radeon 9000
+ATI Radeon 9100
+ATI Radeon 9200
+ATI Radeon 9500
+ATI Radeon 9600
+ATI Radeon 9700
+ATI Radeon 9800
+ATI Radeon HD 2300
+ATI Radeon HD 2400
+ATI Radeon HD 2600
+ATI Radeon HD 2900
+ATI Radeon HD 3000
+ATI Radeon HD 3100
+ATI Radeon HD 3200
+ATI Radeon HD 3300
+ATI Radeon HD 3400
+ATI Radeon HD 3600
+ATI Radeon HD 3800
+ATI Radeon HD 4200
+ATI Radeon HD 4300
+ATI Radeon HD 4500
+ATI Radeon HD 4600
+ATI Radeon HD 4700
+ATI Radeon HD 4800
+ATI Radeon HD 5400
+ATI Radeon HD 5500
+ATI Radeon HD 5600
+ATI Radeon HD 5700
+ATI Radeon HD 5800
+ATI Radeon HD 5900
+ATI Radeon HD 6200
+ATI Radeon HD 6300
+ATI Radeon HD 6500
+ATI Radeon HD 6800
+ATI Radeon HD 6900
+ATI Radeon OpenGL
+ATI Radeon RV250
+ATI Radeon RV600
+ATI Radeon RX9550
+ATI Radeon VE
+ATI Radeon X1000
+ATI Radeon X1200
+ATI Radeon X1300
+ATI Radeon X13xx
+ATI Radeon X1400
+ATI Radeon X1500
+ATI Radeon X1600
+ATI Radeon X16xx
+ATI Radeon X1700
+ATI Radeon X1800
+ATI Radeon X1900
+ATI Radeon X19xx
+ATI Radeon X1xxx
+ATI Radeon X300
+ATI Radeon X500
+ATI Radeon X600
+ATI Radeon X700
+ATI Radeon X7xx
+ATI Radeon X800
+ATI Radeon Xpress
+ATI Rage 128
+ATI Technologies Inc.
+ATI Technologies Inc. x86
+ATI Technologies Inc. x86/SSE2
+ATI Technologies Inc. x86/SSE2
+ATI Technologies Inc. (Vista) ATI Mobility Radeon HD 5730
+ATI Technologies Inc. 128MB ATI Radeon X1300 x86/SSE2
+ATI Technologies Inc. 256MB ATI Radeon X1300PRO x86/SSE2
+ATI Technologies Inc. AMD 760G
+ATI Technologies Inc. AMD 760G
+ATI Technologies Inc. AMD 760G (Microsoft WDDM 1.1)
+ATI Technologies Inc. AMD 780L
+ATI Technologies Inc. AMD FirePro 2270
+ATI Technologies Inc. AMD M860G with ATI Mobility Radeon 4100
+ATI Technologies Inc. AMD M860G with ATI Mobility Radeon 4100
+ATI Technologies Inc. AMD M880G with ATI Mobility Radeon HD 4200
+ATI Technologies Inc. AMD M880G with ATI Mobility Radeon HD 4200
+ATI Technologies Inc. AMD M880G with ATI Mobility Radeon HD 4250
+ATI Technologies Inc. AMD M880G with ATI Mobility Radeon HD 4250
+ATI Technologies Inc. AMD RADEON HD 6350
+ATI Technologies Inc. AMD RADEON HD 6450
+ATI Technologies Inc. AMD RADEON HD 6450
+ATI Technologies Inc. AMD RADEON HD 6670
+ATI Technologies Inc. AMD Radeon 6600M and 6700M Series
+ATI Technologies Inc. AMD Radeon HD 6200 series Graphics
+ATI Technologies Inc. AMD Radeon HD 6200 series Graphics
+ATI Technologies Inc. AMD Radeon HD 6250 Graphics
+ATI Technologies Inc. AMD Radeon HD 6250 Graphics
+ATI Technologies Inc. AMD Radeon HD 6290 Graphics
+ATI Technologies Inc. AMD Radeon HD 6300 series Graphics
+ATI Technologies Inc. AMD Radeon HD 6300 series Graphics
+ATI Technologies Inc. AMD Radeon HD 6300M Series
+ATI Technologies Inc. AMD Radeon HD 6300M Series
+ATI Technologies Inc. AMD Radeon HD 6310 Graphics
+ATI Technologies Inc. AMD Radeon HD 6310 Graphics
+ATI Technologies Inc. AMD Radeon HD 6310M
+ATI Technologies Inc. AMD Radeon HD 6310M
+ATI Technologies Inc. AMD Radeon HD 6330M
+ATI Technologies Inc. AMD Radeon HD 6330M
+ATI Technologies Inc. AMD Radeon HD 6350
+ATI Technologies Inc. AMD Radeon HD 6370M
+ATI Technologies Inc. AMD Radeon HD 6370M
+ATI Technologies Inc. AMD Radeon HD 6400M Series
+ATI Technologies Inc. AMD Radeon HD 6400M Series
+ATI Technologies Inc. AMD Radeon HD 6450
+ATI Technologies Inc. AMD Radeon HD 6450
+ATI Technologies Inc. AMD Radeon HD 6470M
+ATI Technologies Inc. AMD Radeon HD 6470M
+ATI Technologies Inc. AMD Radeon HD 6490M
+ATI Technologies Inc. AMD Radeon HD 6490M
+ATI Technologies Inc. AMD Radeon HD 6500 Series
+ATI Technologies Inc. AMD Radeon HD 6500M Series
+ATI Technologies Inc. AMD Radeon HD 6500M/5600/5700 Series
+ATI Technologies Inc. AMD Radeon HD 6500M/5600/5700 Series
+ATI Technologies Inc. AMD Radeon HD 6530M
+ATI Technologies Inc. AMD Radeon HD 6530M
+ATI Technologies Inc. AMD Radeon HD 6550M
+ATI Technologies Inc. AMD Radeon HD 6550M
+ATI Technologies Inc. AMD Radeon HD 6570
+ATI Technologies Inc. AMD Radeon HD 6570
+ATI Technologies Inc. AMD Radeon HD 6570M
+ATI Technologies Inc. AMD Radeon HD 6570M
+ATI Technologies Inc. AMD Radeon HD 6570M/5700 Series
+ATI Technologies Inc. AMD Radeon HD 6570M/5700 Series
+ATI Technologies Inc. AMD Radeon HD 6600 Series
+ATI Technologies Inc. AMD Radeon HD 6600M Series
+ATI Technologies Inc. AMD Radeon HD 6630M
+ATI Technologies Inc. AMD Radeon HD 6650M
+ATI Technologies Inc. AMD Radeon HD 6650M
+ATI Technologies Inc. AMD Radeon HD 6670
+ATI Technologies Inc. AMD Radeon HD 6670
+ATI Technologies Inc. AMD Radeon HD 6700 Series
+ATI Technologies Inc. AMD Radeon HD 6700 Series
+ATI Technologies Inc. AMD Radeon HD 6750
+ATI Technologies Inc. AMD Radeon HD 6750
+ATI Technologies Inc. AMD Radeon HD 6750M
+ATI Technologies Inc. AMD Radeon HD 6750M
+ATI Technologies Inc. AMD Radeon HD 6770
+ATI Technologies Inc. AMD Radeon HD 6770
+ATI Technologies Inc. AMD Radeon HD 6770M
+ATI Technologies Inc. AMD Radeon HD 6800 Series
+ATI Technologies Inc. AMD Radeon HD 6800 Series
+ATI Technologies Inc. AMD Radeon HD 6800M Series
+ATI Technologies Inc. AMD Radeon HD 6850
+ATI Technologies Inc. AMD Radeon HD 6850M
+ATI Technologies Inc. AMD Radeon HD 6850M
+ATI Technologies Inc. AMD Radeon HD 6870
+ATI Technologies Inc. AMD Radeon HD 6870
+ATI Technologies Inc. AMD Radeon HD 6870M
+ATI Technologies Inc. AMD Radeon HD 6870M
+ATI Technologies Inc. AMD Radeon HD 6900 Series
+ATI Technologies Inc. AMD Radeon HD 6900 Series
+ATI Technologies Inc. AMD Radeon HD 6900M Series
+ATI Technologies Inc. AMD Radeon HD 6970M
+ATI Technologies Inc. AMD Radeon HD 6970M
+ATI Technologies Inc. AMD Radeon HD 6990
+ATI Technologies Inc. AMD Radeon HD 6990
+ATI Technologies Inc. AMD Radeon(TM) HD 6470M
+ATI Technologies Inc. AMD Radeon(TM) HD 6470M
+ATI Technologies Inc. AMD Radeon(TM) HD 6470M
+ATI Technologies Inc. AMD Radeon(TM) HD 6480G
+ATI Technologies Inc. AMD Radeon(TM) HD 6520G
+ATI Technologies Inc. AMD Radeon(TM) HD 6620G
+ATI Technologies Inc. AMD Radeon(TM) HD 6630M
+ATI Technologies Inc. ASUS 5870 Eyefinity 6
+ATI Technologies Inc. ASUS A9550 Series
+ATI Technologies Inc. ASUS AH2600 Series
+ATI Technologies Inc. ASUS AH3450 Series
+ATI Technologies Inc. ASUS AH3650 Series
+ATI Technologies Inc. ASUS AH3650 Series
+ATI Technologies Inc. ASUS AH4650 Series
+ATI Technologies Inc. ASUS ARES
+ATI Technologies Inc. ASUS ARES
+ATI Technologies Inc. ASUS EAH2900 Series
+ATI Technologies Inc. ASUS EAH3450 Series
+ATI Technologies Inc. ASUS EAH3450 Series
+ATI Technologies Inc. ASUS EAH3650 Series
+ATI Technologies Inc. ASUS EAH3650 Series
+ATI Technologies Inc. ASUS EAH4350 series
+ATI Technologies Inc. ASUS EAH4350 series
+ATI Technologies Inc. ASUS EAH4550 series
+ATI Technologies Inc. ASUS EAH4550 series
+ATI Technologies Inc. ASUS EAH4650 series
+ATI Technologies Inc. ASUS EAH4670 series
+ATI Technologies Inc. ASUS EAH4670 series
+ATI Technologies Inc. ASUS EAH4750 Series
+ATI Technologies Inc. ASUS EAH4770 Series
+ATI Technologies Inc. ASUS EAH4770 Series
+ATI Technologies Inc. ASUS EAH4770 series
+ATI Technologies Inc. ASUS EAH4770 series
+ATI Technologies Inc. ASUS EAH4850 series
+ATI Technologies Inc. ASUS EAH5450 Series
+ATI Technologies Inc. ASUS EAH5450 Series
+ATI Technologies Inc. ASUS EAH5550 Series
+ATI Technologies Inc. ASUS EAH5550 Series
+ATI Technologies Inc. ASUS EAH5570 series
+ATI Technologies Inc. ASUS EAH5570 series
+ATI Technologies Inc. ASUS EAH5670 Series
+ATI Technologies Inc. ASUS EAH5670 Series
+ATI Technologies Inc. ASUS EAH5750 Series
+ATI Technologies Inc. ASUS EAH5750 Series
+ATI Technologies Inc. ASUS EAH5770 Series
+ATI Technologies Inc. ASUS EAH5770 Series
+ATI Technologies Inc. ASUS EAH5830 Series
+ATI Technologies Inc. ASUS EAH5850 Series
+ATI Technologies Inc. ASUS EAH5850 Series
+ATI Technologies Inc. ASUS EAH5870 Series
+ATI Technologies Inc. ASUS EAH5870 Series
+ATI Technologies Inc. ASUS EAH5970 Series
+ATI Technologies Inc. ASUS EAH5970 Series
+ATI Technologies Inc. ASUS EAH6450 Series
+ATI Technologies Inc. ASUS EAH6570 Series
+ATI Technologies Inc. ASUS EAH6670 Series
+ATI Technologies Inc. ASUS EAH6850 Series
+ATI Technologies Inc. ASUS EAH6850 Series
+ATI Technologies Inc. ASUS EAH6870 Series
+ATI Technologies Inc. ASUS EAH6870 Series
+ATI Technologies Inc. ASUS EAH6950 Series
+ATI Technologies Inc. ASUS EAH6950 Series
+ATI Technologies Inc. ASUS EAH6970 Series
+ATI Technologies Inc. ASUS EAH6970 Series
+ATI Technologies Inc. ASUS EAHG4670 series
+ATI Technologies Inc. ASUS Extreme AX600 Series
+ATI Technologies Inc. ASUS Extreme AX600 Series
+ATI Technologies Inc. ASUS Extreme AX600XT-TD
+ATI Technologies Inc. ASUS Extreme AX600XT-TD
+ATI Technologies Inc. ASUS X1300 Series x86/SSE2
+ATI Technologies Inc. ASUS X1550 Series
+ATI Technologies Inc. ASUS X1950 Series x86/SSE2
+ATI Technologies Inc. ASUS X800 Series
+ATI Technologies Inc. ASUS X800 Series
+ATI Technologies Inc. ASUS X850 Series
+ATI Technologies Inc. ATI All-in-Wonder HD
+ATI Technologies Inc. ATI FirePro 2260
+ATI Technologies Inc. ATI FirePro 2260
+ATI Technologies Inc. ATI FirePro 2450
+ATI Technologies Inc. ATI FirePro M5800
+ATI Technologies Inc. ATI FirePro M5800
+ATI Technologies Inc. ATI FirePro M7740
+ATI Technologies Inc. ATI FirePro M7740
+ATI Technologies Inc. ATI FirePro M7820
+ATI Technologies Inc. ATI FirePro M7820
+ATI Technologies Inc. ATI FirePro V3700 (FireGL)
+ATI Technologies Inc. ATI FirePro V3800
+ATI Technologies Inc. ATI FirePro V4800
+ATI Technologies Inc. ATI FirePro V4800 (FireGL)
+ATI Technologies Inc. ATI FirePro V5800
+ATI Technologies Inc. ATI FirePro V7800
+ATI Technologies Inc. ATI MOBILITY RADEON 9600/9700 Series
+ATI Technologies Inc. ATI MOBILITY RADEON 9XXX x86/SSE2
+ATI Technologies Inc. ATI MOBILITY RADEON 9XXX x86/SSE2
+ATI Technologies Inc. ATI MOBILITY RADEON HD 2300
+ATI Technologies Inc. ATI MOBILITY RADEON HD 3450
+ATI Technologies Inc. ATI MOBILITY RADEON HD 3650
+ATI Technologies Inc. ATI MOBILITY RADEON X1600
+ATI Technologies Inc. ATI MOBILITY RADEON X1600
+ATI Technologies Inc. ATI MOBILITY RADEON X2300
+ATI Technologies Inc. ATI MOBILITY RADEON X2300
+ATI Technologies Inc. ATI MOBILITY RADEON X2300 HD x86/SSE2
+ATI Technologies Inc. ATI MOBILITY RADEON X2300 x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. ATI MOBILITY RADEON X2300 x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. ATI MOBILITY RADEON X2300 x86/SSE2
+ATI Technologies Inc. ATI MOBILITY RADEON X300
+ATI Technologies Inc. ATI MOBILITY RADEON X300
+ATI Technologies Inc. ATI MOBILITY RADEON X600
+ATI Technologies Inc. ATI MOBILITY RADEON X700
+ATI Technologies Inc. ATI MOBILITY RADEON XPRESS 200
+ATI Technologies Inc. ATI MOBILITY RADEON XPRESS 200
+ATI Technologies Inc. ATI Mobility FireGL V5700
+ATI Technologies Inc. ATI Mobility FireGL V5700
+ATI Technologies Inc. ATI Mobility Radeon 4100
+ATI Technologies Inc. ATI Mobility Radeon 4100
+ATI Technologies Inc. ATI Mobility Radeon Graphics
+ATI Technologies Inc. ATI Mobility Radeon Graphics
+ATI Technologies Inc. ATI Mobility Radeon HD 2300
+ATI Technologies Inc. ATI Mobility Radeon HD 2300
+ATI Technologies Inc. ATI Mobility Radeon HD 2400
+ATI Technologies Inc. ATI Mobility Radeon HD 2400
+ATI Technologies Inc. ATI Mobility Radeon HD 2400 XT
+ATI Technologies Inc. ATI Mobility Radeon HD 2400 XT
+ATI Technologies Inc. ATI Mobility Radeon HD 2600
+ATI Technologies Inc. ATI Mobility Radeon HD 2600
+ATI Technologies Inc. ATI Mobility Radeon HD 2600 XT
+ATI Technologies Inc. ATI Mobility Radeon HD 2700
+ATI Technologies Inc. ATI Mobility Radeon HD 2700
+ATI Technologies Inc. ATI Mobility Radeon HD 3400 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 3400 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 3410
+ATI Technologies Inc. ATI Mobility Radeon HD 3430
+ATI Technologies Inc. ATI Mobility Radeon HD 3430
+ATI Technologies Inc. ATI Mobility Radeon HD 3450
+ATI Technologies Inc. ATI Mobility Radeon HD 3450
+ATI Technologies Inc. ATI Mobility Radeon HD 3470
+ATI Technologies Inc. ATI Mobility Radeon HD 3470
+ATI Technologies Inc. ATI Mobility Radeon HD 3470 Hybrid X2
+ATI Technologies Inc. ATI Mobility Radeon HD 3650
+ATI Technologies Inc. ATI Mobility Radeon HD 3650
+ATI Technologies Inc. ATI Mobility Radeon HD 3670
+ATI Technologies Inc. ATI Mobility Radeon HD 4200
+ATI Technologies Inc. ATI Mobility Radeon HD 4200
+ATI Technologies Inc. ATI Mobility Radeon HD 4200 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 4200 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 4225
+ATI Technologies Inc. ATI Mobility Radeon HD 4225 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 4225 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 4250
+ATI Technologies Inc. ATI Mobility Radeon HD 4250
+ATI Technologies Inc. ATI Mobility Radeon HD 4250 Graphics
+ATI Technologies Inc. ATI Mobility Radeon HD 4250 Graphics
+ATI Technologies Inc. ATI Mobility Radeon HD 4250 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 4270
+ATI Technologies Inc. ATI Mobility Radeon HD 4300 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 4300 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 4300/4500 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 4300/4500 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 4330
+ATI Technologies Inc. ATI Mobility Radeon HD 4330
+ATI Technologies Inc. ATI Mobility Radeon HD 4330 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 4350
+ATI Technologies Inc. ATI Mobility Radeon HD 4350 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 4350 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 4500 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 4500 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 4500/5100 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 4500/5100 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 4530
+ATI Technologies Inc. ATI Mobility Radeon HD 4530
+ATI Technologies Inc. ATI Mobility Radeon HD 4530 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 4530 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 4550
+ATI Technologies Inc. ATI Mobility Radeon HD 4550
+ATI Technologies Inc. ATI Mobility Radeon HD 4570
+ATI Technologies Inc. ATI Mobility Radeon HD 4570
+ATI Technologies Inc. ATI Mobility Radeon HD 4600 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 4600 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 4650
+ATI Technologies Inc. ATI Mobility Radeon HD 4650
+ATI Technologies Inc. ATI Mobility Radeon HD 4650 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 4650 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 4670
+ATI Technologies Inc. ATI Mobility Radeon HD 4670
+ATI Technologies Inc. ATI Mobility Radeon HD 4830 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 4850
+ATI Technologies Inc. ATI Mobility Radeon HD 4870
+ATI Technologies Inc. ATI Mobility Radeon HD 4870
+ATI Technologies Inc. ATI Mobility Radeon HD 5000
+ATI Technologies Inc. ATI Mobility Radeon HD 5000
+ATI Technologies Inc. ATI Mobility Radeon HD 5000 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 5000 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 5145
+ATI Technologies Inc. ATI Mobility Radeon HD 5145
+ATI Technologies Inc. ATI Mobility Radeon HD 5165
+ATI Technologies Inc. ATI Mobility Radeon HD 5165
+ATI Technologies Inc. ATI Mobility Radeon HD 530v
+ATI Technologies Inc. ATI Mobility Radeon HD 530v
+ATI Technologies Inc. ATI Mobility Radeon HD 5400 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 5400 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 540v
+ATI Technologies Inc. ATI Mobility Radeon HD 5430
+ATI Technologies Inc. ATI Mobility Radeon HD 5430
+ATI Technologies Inc. ATI Mobility Radeon HD 5450
+ATI Technologies Inc. ATI Mobility Radeon HD 5450
+ATI Technologies Inc. ATI Mobility Radeon HD 5450 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 5450 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 545v
+ATI Technologies Inc. ATI Mobility Radeon HD 545v
+ATI Technologies Inc. ATI Mobility Radeon HD 5470
+ATI Technologies Inc. ATI Mobility Radeon HD 5470
+ATI Technologies Inc. ATI Mobility Radeon HD 550v
+ATI Technologies Inc. ATI Mobility Radeon HD 550v
+ATI Technologies Inc. ATI Mobility Radeon HD 5600/5700 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 5600/5700 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 560v
+ATI Technologies Inc. ATI Mobility Radeon HD 5650
+ATI Technologies Inc. ATI Mobility Radeon HD 5650
+ATI Technologies Inc. ATI Mobility Radeon HD 5700 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 5700 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 5730
+ATI Technologies Inc. ATI Mobility Radeon HD 5730
+ATI Technologies Inc. ATI Mobility Radeon HD 5800 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 5800 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 5830 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 5850
+ATI Technologies Inc. ATI Mobility Radeon HD 5850
+ATI Technologies Inc. ATI Mobility Radeon HD 5870
+ATI Technologies Inc. ATI Mobility Radeon HD 5870
+ATI Technologies Inc. ATI Mobility Radeon HD 6300 series
+ATI Technologies Inc. ATI Mobility Radeon HD 6300 series
+ATI Technologies Inc. ATI Mobility Radeon HD 6370
+ATI Technologies Inc. ATI Mobility Radeon HD 6370
+ATI Technologies Inc. ATI Mobility Radeon HD 6470M
+ATI Technologies Inc. ATI Mobility Radeon HD 6550
+ATI Technologies Inc. ATI Mobility Radeon HD 6550
+ATI Technologies Inc. ATI Mobility Radeon HD 6570
+ATI Technologies Inc. ATI Mobility Radeon HD 6570
+ATI Technologies Inc. ATI Mobility Radeon X1300
+ATI Technologies Inc. ATI Mobility Radeon X1300
+ATI Technologies Inc. ATI Mobility Radeon X1300 x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. ATI Mobility Radeon X1300 x86/SSE2
+ATI Technologies Inc. ATI Mobility Radeon X1300 x86/SSE2
+ATI Technologies Inc. ATI Mobility Radeon X1350
+ATI Technologies Inc. ATI Mobility Radeon X1350 x86/SSE2
+ATI Technologies Inc. ATI Mobility Radeon X1400
+ATI Technologies Inc. ATI Mobility Radeon X1400
+ATI Technologies Inc. ATI Mobility Radeon X1400 x86/SSE2
+ATI Technologies Inc. ATI Mobility Radeon X1400 x86/SSE2
+ATI Technologies Inc. ATI Mobility Radeon X1600
+ATI Technologies Inc. ATI Mobility Radeon X1600
+ATI Technologies Inc. ATI Mobility Radeon X1600 x86/SSE2
+ATI Technologies Inc. ATI Mobility Radeon X1600 x86/SSE2
+ATI Technologies Inc. ATI Mobility Radeon X1700 x86/SSE2
+ATI Technologies Inc. ATI Mobility Radeon X2300
+ATI Technologies Inc. ATI Mobility Radeon X2300
+ATI Technologies Inc. ATI Mobility Radeon X2300 (Omega 3.8.442)
+ATI Technologies Inc. ATI Mobility Radeon X2300 x86
+ATI Technologies Inc. ATI Mobility Radeon X2300 x86
+ATI Technologies Inc. ATI Mobility Radeon X2300 x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. ATI Mobility Radeon X2300 x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. ATI Mobility Radeon X2300 x86/SSE2
+ATI Technologies Inc. ATI Mobility Radeon X2300 x86/SSE2
+ATI Technologies Inc. ATI Mobility Radeon X2500
+ATI Technologies Inc. ATI Mobility Radeon X2500
+ATI Technologies Inc. ATI Mobility Radeon X2500 x86/SSE2
+ATI Technologies Inc. ATI Mobility Radeon. HD 530v
+ATI Technologies Inc. ATI Mobility Radeon. HD 530v
+ATI Technologies Inc. ATI Mobility Radeon. HD 5470
+ATI Technologies Inc. ATI Mobility Radeon. HD 5470
+ATI Technologies Inc. ATI RADEON HD 3200 T25XX by CAMILO
+ATI Technologies Inc. ATI RADEON XPRESS 1100
+ATI Technologies Inc. ATI RADEON XPRESS 1100 x86/SSE2
+ATI Technologies Inc. ATI RADEON XPRESS 200 Series
+ATI Technologies Inc. ATI RADEON XPRESS 200 Series
+ATI Technologies Inc. ATI RADEON XPRESS 200 Series x86/SSE2
+ATI Technologies Inc. ATI RADEON XPRESS 200M SERIES
+ATI Technologies Inc. ATI Radeon
+ATI Technologies Inc. ATI Radeon 2100
+ATI Technologies Inc. ATI Radeon 2100
+ATI Technologies Inc. ATI Radeon 2100 (Microsoft - WDDM)
+ATI Technologies Inc. ATI Radeon 2100 Graphics
+ATI Technologies Inc. ATI Radeon 3000
+ATI Technologies Inc. ATI Radeon 3000
+ATI Technologies Inc. ATI Radeon 3000 Graphics
+ATI Technologies Inc. ATI Radeon 3000 Graphics
+ATI Technologies Inc. ATI Radeon 3100 Graphics
+ATI Technologies Inc. ATI Radeon 3100 Graphics
+ATI Technologies Inc. ATI Radeon 5xxx series
+ATI Technologies Inc. ATI Radeon 9550 / X1050 Series
+ATI Technologies Inc. ATI Radeon 9550 / X1050 Series x86/MMX/3DNow!/SSE
+ATI Technologies Inc. ATI Radeon 9550 / X1050 Series x86/SSE2
+ATI Technologies Inc. ATI Radeon 9550 / X1050 Series(Microsoft - WDDM)
+ATI Technologies Inc. ATI Radeon 9600 / X1050 Series
+ATI Technologies Inc. ATI Radeon 9600/9550/X1050 Series
+ATI Technologies Inc. ATI Radeon BA Prototype OpenGL Engine
+ATI Technologies Inc. ATI Radeon BB Prototype OpenGL Engine
+ATI Technologies Inc. ATI Radeon Broadway XT Prototype OpenGL Engine
+ATI Technologies Inc. ATI Radeon Cedar PRO Prototype OpenGL Engine
+ATI Technologies Inc. ATI Radeon Cypress PRO Prototype OpenGL Engine
+ATI Technologies Inc. ATI Radeon Graphics Processor
+ATI Technologies Inc. ATI Radeon Graphics Processor
+ATI Technologies Inc. ATI Radeon HD 2200 Graphics
+ATI Technologies Inc. ATI Radeon HD 2350
+ATI Technologies Inc. ATI Radeon HD 2400
+ATI Technologies Inc. ATI Radeon HD 2400
+ATI Technologies Inc. ATI Radeon HD 2400 OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 2400 OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 2400 PRO
+ATI Technologies Inc. ATI Radeon HD 2400 PRO AGP
+ATI Technologies Inc. ATI Radeon HD 2400 Pro
+ATI Technologies Inc. ATI Radeon HD 2400 Pro
+ATI Technologies Inc. ATI Radeon HD 2400 Series
+ATI Technologies Inc. ATI Radeon HD 2400 Series
+ATI Technologies Inc. ATI Radeon HD 2400 XT
+ATI Technologies Inc. ATI Radeon HD 2400 XT
+ATI Technologies Inc. ATI Radeon HD 2400 XT OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 2400 XT OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 2600 OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 2600 PRO
+ATI Technologies Inc. ATI Radeon HD 2600 PRO OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 2600 PRO OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 2600 Pro
+ATI Technologies Inc. ATI Radeon HD 2600 Pro
+ATI Technologies Inc. ATI Radeon HD 2600 Series
+ATI Technologies Inc. ATI Radeon HD 2600 XT
+ATI Technologies Inc. ATI Radeon HD 2600 XT
+ATI Technologies Inc. ATI Radeon HD 2900 GT
+ATI Technologies Inc. ATI Radeon HD 2900 XT
+ATI Technologies Inc. ATI Radeon HD 3200 Graphics
+ATI Technologies Inc. ATI Radeon HD 3200 Graphics
+ATI Technologies Inc. ATI Radeon HD 3300 Graphics
+ATI Technologies Inc. ATI Radeon HD 3400 Series
+ATI Technologies Inc. ATI Radeon HD 3400 Series
+ATI Technologies Inc. ATI Radeon HD 3450
+ATI Technologies Inc. ATI Radeon HD 3450
+ATI Technologies Inc. ATI Radeon HD 3450 - Dell Optiplex
+ATI Technologies Inc. ATI Radeon HD 3450 - Dell Optiplex
+ATI Technologies Inc. ATI Radeon HD 3470
+ATI Technologies Inc. ATI Radeon HD 3470 - Dell Optiplex
+ATI Technologies Inc. ATI Radeon HD 3550
+ATI Technologies Inc. ATI Radeon HD 3550
+ATI Technologies Inc. ATI Radeon HD 3600 Series
+ATI Technologies Inc. ATI Radeon HD 3600 Series
+ATI Technologies Inc. ATI Radeon HD 3650
+ATI Technologies Inc. ATI Radeon HD 3650
+ATI Technologies Inc. ATI Radeon HD 3650 AGP
+ATI Technologies Inc. ATI Radeon HD 3730
+ATI Technologies Inc. ATI Radeon HD 3800 Series
+ATI Technologies Inc. ATI Radeon HD 3800 Series
+ATI Technologies Inc. ATI Radeon HD 3850
+ATI Technologies Inc. ATI Radeon HD 3850
+ATI Technologies Inc. ATI Radeon HD 3850 AGP
+ATI Technologies Inc. ATI Radeon HD 3870
+ATI Technologies Inc. ATI Radeon HD 3870
+ATI Technologies Inc. ATI Radeon HD 3870 X2
+ATI Technologies Inc. ATI Radeon HD 4200
+ATI Technologies Inc. ATI Radeon HD 4200
+ATI Technologies Inc. ATI Radeon HD 4250
+ATI Technologies Inc. ATI Radeon HD 4250
+ATI Technologies Inc. ATI Radeon HD 4250 Graphics
+ATI Technologies Inc. ATI Radeon HD 4250 Graphics
+ATI Technologies Inc. ATI Radeon HD 4270
+ATI Technologies Inc. ATI Radeon HD 4270
+ATI Technologies Inc. ATI Radeon HD 4290
+ATI Technologies Inc. ATI Radeon HD 4290
+ATI Technologies Inc. ATI Radeon HD 4290 (Engineering Sample)
+ATI Technologies Inc. ATI Radeon HD 4300 Series
+ATI Technologies Inc. ATI Radeon HD 4300 Series
+ATI Technologies Inc. ATI Radeon HD 4300/4500 Series
+ATI Technologies Inc. ATI Radeon HD 4300/4500 Series
+ATI Technologies Inc. ATI Radeon HD 4350
+ATI Technologies Inc. ATI Radeon HD 4350
+ATI Technologies Inc. ATI Radeon HD 4350 (Microsoft WDDM 1.1)
+ATI Technologies Inc. ATI Radeon HD 4450
+ATI Technologies Inc. ATI Radeon HD 4450
+ATI Technologies Inc. ATI Radeon HD 4500 Series
+ATI Technologies Inc. ATI Radeon HD 4550
+ATI Technologies Inc. ATI Radeon HD 4550
+ATI Technologies Inc. ATI Radeon HD 4600 Series
+ATI Technologies Inc. ATI Radeon HD 4600 Series
+ATI Technologies Inc. ATI Radeon HD 4650
+ATI Technologies Inc. ATI Radeon HD 4650
+ATI Technologies Inc. ATI Radeon HD 4670
+ATI Technologies Inc. ATI Radeon HD 4670
+ATI Technologies Inc. ATI Radeon HD 4670 OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 4670 OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 4700 Series
+ATI Technologies Inc. ATI Radeon HD 4700 Series
+ATI Technologies Inc. ATI Radeon HD 4720
+ATI Technologies Inc. ATI Radeon HD 4720
+ATI Technologies Inc. ATI Radeon HD 4730
+ATI Technologies Inc. ATI Radeon HD 4730
+ATI Technologies Inc. ATI Radeon HD 4730 Series
+ATI Technologies Inc. ATI Radeon HD 4730 Series
+ATI Technologies Inc. ATI Radeon HD 4750
+ATI Technologies Inc. ATI Radeon HD 4770
+ATI Technologies Inc. ATI Radeon HD 4770
+ATI Technologies Inc. ATI Radeon HD 4800 Series
+ATI Technologies Inc. ATI Radeon HD 4800 Series
+ATI Technologies Inc. ATI Radeon HD 4850
+ATI Technologies Inc. ATI Radeon HD 4850
+ATI Technologies Inc. ATI Radeon HD 4850 OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 4850 OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 4850 Series
+ATI Technologies Inc. ATI Radeon HD 4870
+ATI Technologies Inc. ATI Radeon HD 4870
+ATI Technologies Inc. ATI Radeon HD 4870 OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 4870 X2
+ATI Technologies Inc. ATI Radeon HD 4870 X2
+ATI Technologies Inc. ATI Radeon HD 5400 Series
+ATI Technologies Inc. ATI Radeon HD 5400 Series
+ATI Technologies Inc. ATI Radeon HD 5450
+ATI Technologies Inc. ATI Radeon HD 5450
+ATI Technologies Inc. ATI Radeon HD 5470
+ATI Technologies Inc. ATI Radeon HD 5500 Series
+ATI Technologies Inc. ATI Radeon HD 5500 Series
+ATI Technologies Inc. ATI Radeon HD 5570
+ATI Technologies Inc. ATI Radeon HD 5570
+ATI Technologies Inc. ATI Radeon HD 5600 Series
+ATI Technologies Inc. ATI Radeon HD 5600 Series
+ATI Technologies Inc. ATI Radeon HD 5600/5700
+ATI Technologies Inc. ATI Radeon HD 5630
+ATI Technologies Inc. ATI Radeon HD 5670
+ATI Technologies Inc. ATI Radeon HD 5670
+ATI Technologies Inc. ATI Radeon HD 5670 OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 5670 OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 5700 Series
+ATI Technologies Inc. ATI Radeon HD 5700 Series
+ATI Technologies Inc. ATI Radeon HD 5750
+ATI Technologies Inc. ATI Radeon HD 5750
+ATI Technologies Inc. ATI Radeon HD 5750 OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 5750 OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 5770
+ATI Technologies Inc. ATI Radeon HD 5770
+ATI Technologies Inc. ATI Radeon HD 5770 OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 5770 OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 5800 Series
+ATI Technologies Inc. ATI Radeon HD 5800 Series
+ATI Technologies Inc. ATI Radeon HD 5850
+ATI Technologies Inc. ATI Radeon HD 5850
+ATI Technologies Inc. ATI Radeon HD 5870
+ATI Technologies Inc. ATI Radeon HD 5870 OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 5870 OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 5900 Series
+ATI Technologies Inc. ATI Radeon HD 5900 Series
+ATI Technologies Inc. ATI Radeon HD 5970
+ATI Technologies Inc. ATI Radeon HD 6230
+ATI Technologies Inc. ATI Radeon HD 6230
+ATI Technologies Inc. ATI Radeon HD 6250
+ATI Technologies Inc. ATI Radeon HD 6250
+ATI Technologies Inc. ATI Radeon HD 6350
+ATI Technologies Inc. ATI Radeon HD 6390
+ATI Technologies Inc. ATI Radeon HD 6490M OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 6490M OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 6510
+ATI Technologies Inc. ATI Radeon HD 6510
+ATI Technologies Inc. ATI Radeon HD 6570M
+ATI Technologies Inc. ATI Radeon HD 6570M
+ATI Technologies Inc. ATI Radeon HD 6630M OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 6750
+ATI Technologies Inc. ATI Radeon HD 6750M OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 6750M OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 6770
+ATI Technologies Inc. ATI Radeon HD 6770
+ATI Technologies Inc. ATI Radeon HD 6770M OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 6770M OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 6800 Series
+ATI Technologies Inc. ATI Radeon HD 6970M OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 6970M OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD3750
+ATI Technologies Inc. ATI Radeon HD4300/HD4500 series
+ATI Technologies Inc. ATI Radeon HD4300/HD4500 series
+ATI Technologies Inc. ATI Radeon HD4670
+ATI Technologies Inc. ATI Radeon HD4670
+ATI Technologies Inc. ATI Radeon Juniper LE Prototype OpenGL Engine
+ATI Technologies Inc. ATI Radeon RV710 Prototype OpenGL Engine
+ATI Technologies Inc. ATI Radeon RV730 Prototype OpenGL Engine
+ATI Technologies Inc. ATI Radeon RV770 Prototype OpenGL Engine
+ATI Technologies Inc. ATI Radeon RV790 Prototype OpenGL Engine
+ATI Technologies Inc. ATI Radeon RV790 Prototype OpenGL Engine
+ATI Technologies Inc. ATI Radeon Redwood PRO Prototype OpenGL Engine
+ATI Technologies Inc. ATI Radeon Redwood XT Prototype OpenGL Engine
+ATI Technologies Inc. ATI Radeon Whistler PRO/LP Prototype OpenGL Engine
+ATI Technologies Inc. ATI Radeon X1050
+ATI Technologies Inc. ATI Radeon X1050 Series
+ATI Technologies Inc. ATI Radeon X1200
+ATI Technologies Inc. ATI Radeon X1200
+ATI Technologies Inc. ATI Radeon X1200 Series
+ATI Technologies Inc. ATI Radeon X1200 Series
+ATI Technologies Inc. ATI Radeon X1200 Series x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. ATI Radeon X1200 Series x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. ATI Radeon X1250
+ATI Technologies Inc. ATI Radeon X1250
+ATI Technologies Inc. ATI Radeon X1250 x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. ATI Radeon X1270
+ATI Technologies Inc. ATI Radeon X1270
+ATI Technologies Inc. ATI Radeon X1270 x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. ATI Radeon X1270 x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. ATI Radeon X1300/X1550 Series
+ATI Technologies Inc. ATI Radeon X1550 Series
+ATI Technologies Inc. ATI Radeon X1550 Series
+ATI Technologies Inc. ATI Radeon X1600 OpenGL Engine
+ATI Technologies Inc. ATI Radeon X1600 OpenGL Engine
+ATI Technologies Inc. ATI Radeon X1900 OpenGL Engine
+ATI Technologies Inc. ATI Radeon X1900 OpenGL Engine
+ATI Technologies Inc. ATI Radeon X1950 GT
+ATI Technologies Inc. ATI Radeon X300/X550/X1050 Series
+ATI Technologies Inc. ATI Radeon X300/X550/X1050 Series
+ATI Technologies Inc. ATI Radeon Xpress 1100
+ATI Technologies Inc. ATI Radeon Xpress 1150
+ATI Technologies Inc. ATI Radeon Xpress 1150
+ATI Technologies Inc. ATI Radeon Xpress 1150 x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. ATI Radeon Xpress 1200
+ATI Technologies Inc. ATI Radeon Xpress 1200
+ATI Technologies Inc. ATI Radeon Xpress 1200 Series
+ATI Technologies Inc. ATI Radeon Xpress 1200 Series
+ATI Technologies Inc. ATI Radeon Xpress 1200 Series x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. ATI Radeon Xpress 1200 Series x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. ATI Radeon Xpress 1200 x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. ATI Radeon Xpress 1250
+ATI Technologies Inc. ATI Radeon Xpress 1250
+ATI Technologies Inc. ATI Radeon Xpress 1250 x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. ATI Radeon Xpress 1250 x86/SSE2
+ATI Technologies Inc. ATI Radeon Xpress Series
+ATI Technologies Inc. ATI Radeon Xpress Series
+ATI Technologies Inc. ATI Radeon Xpress Series x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. ATI Yamaha HD 9000
+ATI Technologies Inc. ATi RS880M
+ATI Technologies Inc. ATi RS880M
+ATI Technologies Inc. Carte graphique VGA standard
+ATI Technologies Inc. Diamond Radeon X1550 Series
+ATI Technologies Inc. EG JUNIPER
+ATI Technologies Inc. EG PARK
+ATI Technologies Inc. FireGL V3100 Pentium 4 (SSE2)
+ATI Technologies Inc. FireMV 2400 PCI DDR x86
+ATI Technologies Inc. FireMV 2400 PCI DDR x86/SSE2
+ATI Technologies Inc. FireMV 2400 PCI DDR x86/SSE2
+ATI Technologies Inc. GeCube Radeon X1550
+ATI Technologies Inc. GeForce 9600 GT x86/SSE2
+ATI Technologies Inc. Geforce 9500 GT
+ATI Technologies Inc. Geforce 9500GT
+ATI Technologies Inc. Geforce 9800 GT
+ATI Technologies Inc. HD3730
+ATI Technologies Inc. HIGHTECH EXCALIBUR RADEON 9550SE Series
+ATI Technologies Inc. HIGHTECH EXCALIBUR X700 PRO
+ATI Technologies Inc. M21 x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. M76M
+ATI Technologies Inc. MOBILITY RADEON 7500 DDR x86/SSE2
+ATI Technologies Inc. MOBILITY RADEON 7500 DDR x86/SSE2
+ATI Technologies Inc. MOBILITY RADEON 9000 DDR x86/SSE2
+ATI Technologies Inc. MOBILITY RADEON 9000 DDR x86/SSE2
+ATI Technologies Inc. MOBILITY RADEON 9000 IGPRADEON 9100 IGP DDR x86/SSE2
+ATI Technologies Inc. MOBILITY RADEON 9100 IGP DDR x86/SSE2
+ATI Technologies Inc. MOBILITY RADEON 9600 x86/SSE2
+ATI Technologies Inc. MOBILITY RADEON 9600 x86/SSE2
+ATI Technologies Inc. MOBILITY RADEON 9700 x86/SSE2
+ATI Technologies Inc. MOBILITY RADEON X300 x86/SSE2
+ATI Technologies Inc. MOBILITY RADEON X300 x86/SSE2
+ATI Technologies Inc. MOBILITY RADEON X600 x86/SSE2
+ATI Technologies Inc. MOBILITY RADEON X600 x86/SSE2
+ATI Technologies Inc. MOBILITY RADEON X700 SE x86
+ATI Technologies Inc. MOBILITY RADEON X700 x86/SSE2
+ATI Technologies Inc. MOBILITY RADEON X700 x86/SSE2
+ATI Technologies Inc. MOBILITY RADEON Xpress 200 Series SW TCL x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. MSI RX9550SE
+ATI Technologies Inc. MSI Radeon X1550 Series
+ATI Technologies Inc. Mobility Radeon HD 6000 series
+ATI Technologies Inc. Mobility Radeon X2300 HD
+ATI Technologies Inc. Mobility Radeon X2300 HD
+ATI Technologies Inc. Mobility Radeon X2300 HD x86/SSE2
+ATI Technologies Inc. Mobility Radeon X2300 HD x86/SSE2
+ATI Technologies Inc. RADEON 7000 DDR x86/MMX/3DNow!/SSE
+ATI Technologies Inc. RADEON 7000 DDR x86/SSE2
+ATI Technologies Inc. RADEON 7500 DDR x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. RADEON 7500 DDR x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. RADEON 7500 DDR x86/SSE2
+ATI Technologies Inc. RADEON 9100 IGP DDR x86/SSE2
+ATI Technologies Inc. RADEON 9200 DDR x86/MMX/3DNow!/SSE
+ATI Technologies Inc. RADEON 9200 DDR x86/SSE2
+ATI Technologies Inc. RADEON 9200 PRO DDR x86/MMX/3DNow!/SSE
+ATI Technologies Inc. RADEON 9200 Series DDR x86/MMX/3DNow!/SSE
+ATI Technologies Inc. RADEON 9200 Series DDR x86/MMX/3DNow!/SSE
+ATI Technologies Inc. RADEON 9200 Series DDR x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. RADEON 9200 Series DDR x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. RADEON 9200 Series DDR x86/SSE
+ATI Technologies Inc. RADEON 9200 Series DDR x86/SSE
+ATI Technologies Inc. RADEON 9200 Series DDR x86/SSE2
+ATI Technologies Inc. RADEON 9200 Series DDR x86/SSE2
+ATI Technologies Inc. RADEON 9200SE DDR x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. RADEON 9200SE DDR x86/SSE2
+ATI Technologies Inc. RADEON 9250/9200 Series DDR x86/MMX/3DNow!/SSE
+ATI Technologies Inc. RADEON 9250/9200 Series DDR x86/MMX/3DNow!/SSE
+ATI Technologies Inc. RADEON 9250/9200 Series DDR x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. RADEON 9250/9200 Series DDR x86/SSE2
+ATI Technologies Inc. RADEON 9250/9200 Series DDR x86/SSE2
+ATI Technologies Inc. RADEON 9500
+ATI Technologies Inc. RADEON 9550 x86/SSE2
+ATI Technologies Inc. RADEON 9600 SERIES
+ATI Technologies Inc. RADEON 9600 SERIES x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. RADEON 9600 SERIES x86/SSE2
+ATI Technologies Inc. RADEON 9600 TX x86/SSE2
+ATI Technologies Inc. RADEON 9600 TX x86/SSE2
+ATI Technologies Inc. RADEON 9600 x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. RADEON 9600 x86/SSE2
+ATI Technologies Inc. RADEON 9600 x86/SSE2
+ATI Technologies Inc. RADEON 9700 PRO x86/MMX/3DNow!/SSE
+ATI Technologies Inc. RADEON 9800 PRO
+ATI Technologies Inc. RADEON 9800 x86/SSE2
+ATI Technologies Inc. RADEON IGP 340M DDR x86/SSE2
+ATI Technologies Inc. RADEON IGP 340M DDR x86/SSE2
+ATI Technologies Inc. RADEON X300 Series x86/SSE2
+ATI Technologies Inc. RADEON X300 x86/SSE2
+ATI Technologies Inc. RADEON X300 x86/SSE2
+ATI Technologies Inc. RADEON X300/X550 Series x86/SSE2
+ATI Technologies Inc. RADEON X300/X550 Series x86/SSE2
+ATI Technologies Inc. RADEON X550 x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. RADEON X550 x86/SSE2
+ATI Technologies Inc. RADEON X600 Series
+ATI Technologies Inc. RADEON X600 x86/SSE2
+ATI Technologies Inc. RADEON X600 x86/SSE2
+ATI Technologies Inc. RADEON X600/X550 Series
+ATI Technologies Inc. RADEON X700 PRO x86/SSE2
+ATI Technologies Inc. RADEON X800 SE x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. RADEON X800 XT
+ATI Technologies Inc. RADEON X800GT
+ATI Technologies Inc. RADEON XPRESS 200 Series SW TCL x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. RADEON XPRESS 200 Series SW TCL x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. RADEON XPRESS 200 Series SW TCL x86/SSE2
+ATI Technologies Inc. RADEON XPRESS 200 Series SW TCL x86/SSE2
+ATI Technologies Inc. RADEON XPRESS 200 Series x86/SSE2
+ATI Technologies Inc. RADEON XPRESS 200M Series SW TCL x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. RADEON XPRESS 200M Series SW TCL x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. RADEON XPRESS 200M Series SW TCL x86/SSE2
+ATI Technologies Inc. RADEON XPRESS 200M Series SW TCL x86/SSE2
+ATI Technologies Inc. RADEON XPRESS 200M Series x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. RADEON XPRESS 200M Series x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. RADEON XPRESS 200M Series x86/SSE2
+ATI Technologies Inc. RADEON XPRESS Series x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. RADEON XPRESS Series x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. RADEON XPRESS Series x86/SSE2
+ATI Technologies Inc. RADEON XPRESS Series x86/SSE2
+ATI Technologies Inc. RS740
+ATI Technologies Inc. RS780C
+ATI Technologies Inc. RS780M
+ATI Technologies Inc. RS780M
+ATI Technologies Inc. RS880
+ATI Technologies Inc. RS880
+ATI Technologies Inc. RV410 Pro x86/SSE2
+ATI Technologies Inc. RV790
+ATI Technologies Inc. RV790
+ATI Technologies Inc. Radeon (TM) HD 6470M
+ATI Technologies Inc. Radeon (TM) HD 6470M
+ATI Technologies Inc. Radeon (TM) HD 6490M
+ATI Technologies Inc. Radeon (TM) HD 6490M
+ATI Technologies Inc. Radeon (TM) HD 6750M
+ATI Technologies Inc. Radeon (TM) HD 6770M
+ATI Technologies Inc. Radeon (TM) HD 6770M
+ATI Technologies Inc. Radeon (TM) HD 6850M
+ATI Technologies Inc. Radeon 7000 DDR x86/SSE
+ATI Technologies Inc. Radeon 7000 DDR x86/SSE2
+ATI Technologies Inc. Radeon 7000 SDR x86/SSE2
+ATI Technologies Inc. Radeon 7500 DDR x86/SSE2
+ATI Technologies Inc. Radeon 7500 DDR x86/SSE2
+ATI Technologies Inc. Radeon 9000 DDR x86/SSE2
+ATI Technologies Inc. Radeon DDR x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. Radeon DDR x86/SSE
+ATI Technologies Inc. Radeon DDR x86/SSE2
+ATI Technologies Inc. Radeon HD 6310
+ATI Technologies Inc. Radeon HD 6310
+ATI Technologies Inc. Radeon HD 6470M
+ATI Technologies Inc. Radeon HD 6490M
+ATI Technologies Inc. Radeon HD 6800 Series
+ATI Technologies Inc. Radeon HD 6800 Series
+ATI Technologies Inc. Radeon SDR x86/SSE2
+ATI Technologies Inc. Radeon SDR x86/SSE2
+ATI Technologies Inc. Radeon X1300 Series
+ATI Technologies Inc. Radeon X1300 Series x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. Radeon X1300 Series x86/SSE2
+ATI Technologies Inc. Radeon X1300/X1550 Series
+ATI Technologies Inc. Radeon X1300/X1550 Series
+ATI Technologies Inc. Radeon X1300/X1550 Series x86/SSE2
+ATI Technologies Inc. Radeon X1550 64-bit (Microsoft - WDDM)
+ATI Technologies Inc. Radeon X1550 Series
+ATI Technologies Inc. Radeon X1550 Series x86/SSE2
+ATI Technologies Inc. Radeon X1600
+ATI Technologies Inc. Radeon X1600 Pro / X1300XT x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. Radeon X1600 Series
+ATI Technologies Inc. Radeon X1600 Series x86/SSE2
+ATI Technologies Inc. Radeon X1600/1650 Series
+ATI Technologies Inc. Radeon X1600/X1650 Series
+ATI Technologies Inc. Radeon X1650 Series
+ATI Technologies Inc. Radeon X1650 Series
+ATI Technologies Inc. Radeon X1650 Series x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. Radeon X1650 Series x86/SSE2
+ATI Technologies Inc. Radeon X1650 Series x86/SSE2
+ATI Technologies Inc. Radeon X1900 Series x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. Radeon X1950 Pro
+ATI Technologies Inc. Radeon X1950 Pro x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. Radeon X1950 Series
+ATI Technologies Inc. Radeon X1950 Series (Microsoft - WDDM)
+ATI Technologies Inc. Radeon X300/X550/X1050 Series
+ATI Technologies Inc. Radeon X550/X700 Series
+ATI Technologies Inc. Radeon X550XTX x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. SAPPHIRE RADEON X300SE
+ATI Technologies Inc. SAPPHIRE RADEON X300SE
+ATI Technologies Inc. SAPPHIRE RADEON X300SE x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. SAPPHIRE RADEON X300SE x86/SSE2
+ATI Technologies Inc. SAPPHIRE Radeon X1550 Series
+ATI Technologies Inc. SAPPHIRE Radeon X1550 Series x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. SAPPHIRE Radeon X1550 Series x86/SSE2
+ATI Technologies Inc. SAPPHIRE Radeon X1550 x86/SSE2
+ATI Technologies Inc. Sapphire Radeon HD 3730
+ATI Technologies Inc. Sapphire Radeon HD 3730
+ATI Technologies Inc. Sapphire Radeon HD 3750
+ATI Technologies Inc. Standard VGA Graphics Adapter
+ATI Technologies Inc. Standard VGA Graphics Adapter
+ATI Technologies Inc. Tul, RADEON X600 PRO
+ATI Technologies Inc. Tul, RADEON X600 PRO x86/SSE2
+ATI Technologies Inc. Tul, RADEON X700 PRO
+ATI Technologies Inc. Tul, RADEON X700 PRO x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. VisionTek Radeon 4350
+ATI Technologies Inc. VisionTek Radeon 4350
+ATI Technologies Inc. VisionTek Radeon X1550 Series
+ATI Technologies Inc. WRESTLER 9802
+ATI Technologies Inc. WRESTLER 9803
+ATI Technologies Inc. XFX Radeon HD 4570
+ATI Technologies Inc. Yamaha ATI HD 9000da/s
+ATI Technologies Inc. Yamaha ATI HD 9000da/s 2048
+Advanced Micro Devices, Inc. Mesa DRI R600 (RS780 9612) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2
+Advanced Micro Devices, Inc. Mesa DRI R600 (RS880 9710) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2
+Advanced Micro Devices, Inc. Mesa DRI R600 (RS880 9712) 20090101 TCL
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV610 94C1) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV610 94C9) 20090101 x86/MMX/SSE2 TCL DRI2
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV620 95C4) 20090101 x86/MMX/SSE2 TCL DRI2
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV620 95C5) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV620 95C5) 20090101 x86/MMX/SSE2 TCL DRI2
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV635 9596) 20090101 x86/MMX+/3DNow!+/SSE TCL DRI2
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV670 9505) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV670 9505) 20090101 x86/MMX/SSE2 TCL DRI2
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV710 9552) 20090101 x86/MMX/SSE2 TCL DRI2
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV730 9490) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV730 9490) 20090101 x86/MMX/SSE2 TCL DRI2
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV730 9498) 20090101 TCL DRI2
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV770 9440) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV770 9442) 20090101 x86/MMX/SSE2 TCL DRI2
+Alex Mohr GL Hijacker!
+Apple Software Renderer
+DRI R300 Project Mesa DRI R300 (RS400 5954) 20090101 x86/MMX+/3DNow!+/SSE2 NO-TCL DRI2
+DRI R300 Project Mesa DRI R300 (RS400 5975) 20090101 x86/MMX+/3DNow!+/SSE2 NO-TCL DRI2
+DRI R300 Project Mesa DRI R300 (RS400 5A62) 20090101 x86/MMX/SSE2 NO-TCL DRI2
+DRI R300 Project Mesa DRI R300 (RS600 7941) 20090101 x86/MMX/SSE2 NO-TCL
+DRI R300 Project Mesa DRI R300 (RS690 791F) 20090101 x86/MMX+/3DNow!+/SSE2 NO-TCL DRI2
+DRI R300 Project Mesa DRI R300 (RV350 4151) 20090101 AGP 4x x86/MMX+/3DNow!+/SSE TCL
+DRI R300 Project Mesa DRI R300 (RV350 4153) 20090101 AGP 8x x86/MMX+/3DNow!+/SSE TCL
+DRI R300 Project Mesa DRI R300 (RV380 3150) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2
+DRI R300 Project Mesa DRI R300 (RV380 3150) 20090101 x86/MMX/SSE2 TCL DRI2
+DRI R300 Project Mesa DRI R300 (RV380 5B60) 20090101 x86/MMX/SSE2 TCL DRI2
+DRI R300 Project Mesa DRI R300 (RV380 5B60) 20090101 x86/MMX/SSE2 TCL DRI2
+DRI R300 Project Mesa DRI R300 (RV380 5B62) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2
+DRI R300 Project Mesa DRI R300 (RV515 7145) 20090101 x86/MMX/SSE2 TCL DRI2
+DRI R300 Project Mesa DRI R300 (RV515 7146) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2
+DRI R300 Project Mesa DRI R300 (RV515 7146) 20090101 x86/MMX/SSE2 TCL DRI2
+DRI R300 Project Mesa DRI R300 (RV515 7149) 20090101 x86/MMX/SSE2 TCL DRI2
+DRI R300 Project Mesa DRI R300 (RV515 714A) 20090101 x86/MMX/SSE2 TCL
+DRI R300 Project Mesa DRI R300 (RV515 714A) 20090101 x86/MMX/SSE2 TCL DRI2
+DRI R300 Project Mesa DRI R300 (RV530 71C4) 20090101 x86/MMX/SSE2 TCL DRI2
+GPU_CLASS_UNKNOWN
+Humper 3D-Analyze v2.3 - http://www.tommti-systems.com
+Humper Chromium
+Humper Chromium
+Imagination Technologies PowerVR SGX545
+Intel
+Intel HD Graphics Family
+Intel HD Graphics Family
+Intel 3D-Analyze v2.2 - http://www.tommti-systems.com
+Intel 3D-Analyze v2.3 - http://www.tommti-systems.com
+Intel 3D-Analyze v2.3 - http://www.tommti-systems.com
+Intel 4 Series Internal Chipset
+Intel 4 Series Internal Chipset
+Intel 830M
+Intel 845G
+Intel 855GM
+Intel 865G
+Intel 915G
+Intel 915GM
+Intel 945G
+Intel 945GM
+Intel 950
+Intel 965
+Intel B43 Express Chipset
+Intel B43 Express Chipset
+Intel Bear Lake
+Intel Broadwater
+Intel Brookdale
+Intel Cantiga
+Intel EMGD on PowerVR SGX535
+Intel Eaglelake
+Intel Familia Mobile 45 Express Chipset (Microsoft Corporation - WDDM 1.1)
+Intel Familia Mobile 45 Express Chipset (Microsoft Corporation - WDDM 1.1)
+Intel G33
+Intel G41
+Intel G41 Express Chipset
+Intel G41 Express Chipset
+Intel G45
+Intel G45/G43 Express Chipset
+Intel G45/G43 Express Chipset
+Intel Graphics Media Accelerator HD
+Intel Graphics Media Accelerator HD
+Intel HD Graphics
+Intel HD Graphics
+Intel HD Graphics 100
+Intel HD Graphics 200
+Intel HD Graphics 200 BR-1101-00SH
+Intel HD Graphics 200 BR-1101-00SJ
+Intel HD Graphics 200 BR-1101-00SK
+Intel HD Graphics 200 BR-1101-01M5
+Intel HD Graphics 200 BR-1101-01M6
+Intel HD Graphics BR-1004-01Y1
+Intel HD Graphics BR-1004-01Y1
+Intel HD Graphics BR-1006-0364
+Intel HD Graphics BR-1006-0365
+Intel HD Graphics BR-1006-0366
+Intel HD Graphics BR-1007-02G4
+Intel HD Graphics BR-1101-04SY
+Intel HD Graphics BR-1101-04SZ
+Intel HD Graphics BR-1101-04T0
+Intel HD Graphics BR-1101-04T9
+Intel HD Graphics Family
+Intel HD Graphics Family
+Intel HD Graphics Family BR-1012-00Y8
+Intel HD Graphics Family BR-1012-00YF
+Intel HD Graphics Family BR-1012-00ZD
+Intel HD Graphics Family BR-1102-00ML
+Intel Inc. Intel GMA 900 OpenGL Engine
+Intel Inc. Intel GMA 900 OpenGL Engine
+Intel Inc. Intel GMA 950 OpenGL Engine
+Intel Inc. Intel GMA 950 OpenGL Engine
+Intel Inc. Intel GMA X3100 OpenGL Engine
+Intel Inc. Intel GMA X3100 OpenGL Engine
+Intel Inc. Intel HD Graphics 3000 OpenGL Engine
+Intel Inc. Intel HD Graphics 3000 OpenGL Engine
+Intel Inc. Intel HD Graphics OpenGL Engine
+Intel Inc. Intel HD Graphics OpenGL Engine
+Intel Inc. Intel HD xxxx OpenGL Engine
+Intel Intel 845G
+Intel Intel 845G
+Intel Intel 855GM
+Intel Intel 855GM
+Intel Intel 865G
+Intel Intel 865G
+Intel Intel 915G
+Intel Intel 915G
+Intel Intel 915GM
+Intel Intel 915GM
+Intel Intel 945G
+Intel Intel 945G
+Intel Intel 945GM
+Intel Intel 945GM
+Intel Intel 965/963 Graphics Media Accelerator
+Intel Intel 965/963 Graphics Media Accelerator
+Intel Intel Bear Lake B
+Intel Intel Bear Lake B
+Intel Intel Broadwater G
+Intel Intel Brookdale-G
+Intel Intel Brookdale-G
+Intel Intel Calistoga
+Intel Intel Cantiga
+Intel Intel Cantiga
+Intel Intel Eaglelake
+Intel Intel Eaglelake
+Intel Intel Generic Renderer
+Intel Intel Grantsdale-G
+Intel Intel Grantsdale-G
+Intel Intel HD Graphics 3000
+Intel Intel Lakeport
+Intel Intel Montara-GM
+Intel Intel Pineview Platform
+Intel Intel Pineview Platform
+Intel Intel Springdale-G
+Intel Mobile - famiglia Express Chipset 45 (Microsoft Corporation - WDDM 1.1)
+Intel Mobile 4 Series
+Intel Mobile 4 Series Express Chipset Family
+Intel Mobile 4 Series Express Chipset Family
+Intel Mobile 45 Express Chipset Family
+Intel Mobile 45 Express Chipset Family (Microsoft Corporation - WDDM 1.1)
+Intel Mobile 45 Express Chipset Family (Microsoft Corporation - WDDM 1.1)
+Intel Mobile HD Graphics
+Intel Mobile HD Graphics
+Intel Mobile Intel(R) 4 Series Express Chipset Family
+Intel Mobile SandyBridge HD Graphics
+Intel Montara
+Intel Pineview
+Intel Q45/Q43 Express Chipset
+Intel Q45/Q43 Express Chipset
+Intel Royal BNA Driver
+Intel Royal BNA Driver
+Intel SandyBridge HD Graphics
+Intel SandyBridge HD Graphics BR-1006-00V8
+Intel Springdale
+Intel X3100
+Intergraph wcgdrv 06.05.06.18
+Intergraph wcgdrv 06.06.00.35
+Intergraph wcgdrv 06.06.00.35
+LegendgrafiX Mobile 945 Express C/TitaniumGL/GAC/D3D ACCELERATION/6x86/1 THREADs | http://LegendgrafiX.tk
+LegendgrafiX NVIDIA GeForce GT 430/TitaniumGL/GAC/D3D ACCELERATION/6x86/1 THREADs | http://LegendgrafiX.tk
+Linden Lab Headless
+Matrox
+Mesa
+Mesa Project Software Rasterizer
+Mesa Project Software Rasterizer
+NVIDIA /PCI/SSE2
+NVIDIA /PCI/SSE2
+NVIDIA /PCI/SSE2/3DNOW!
+NVIDIA /PCI/SSE2/3DNOW!
+NVIDIA 205
+NVIDIA 210
+NVIDIA 310
+NVIDIA 310M
+NVIDIA 315
+NVIDIA 315M
+NVIDIA 320M
+NVIDIA C51
+NVIDIA Corporation GeForce GT 230/PCI/SSE2
+NVIDIA Corporation GeForce GTX 285/PCI/SSE2
+NVIDIA D10M2-20/PCI/SSE2
+NVIDIA D10M2-20/PCI/SSE2
+NVIDIA D10P1-25/PCI/SSE2
+NVIDIA D10P1-25/PCI/SSE2
+NVIDIA D10P1-25/PCI/SSE2/3DNOW!
+NVIDIA D10P1-30/PCI/SSE2
+NVIDIA D10P2-50/PCI/SSE2
+NVIDIA D11M2-30/PCI/SSE2
+NVIDIA D12-P1-35/PCI/SSE2
+NVIDIA D12U-15/PCI/SSE2
+NVIDIA D13M1-40/PCI/SSE2
+NVIDIA D13P1-40/PCI/SSE2
+NVIDIA D13P1-40/PCI/SSE2
+NVIDIA D13P1-40/PCI/SSE2/3DNOW!
+NVIDIA D13U-10/PCI/SSE2
+NVIDIA D13U/PCI/SSE2
+NVIDIA D13U/PCI/SSE2
+NVIDIA D9M
+NVIDIA D9M-20/PCI/SSE2
+NVIDIA Entry Graphics/PCI/SSE2
+NVIDIA Entry Graphics/PCI/SSE2
+NVIDIA Entry Graphics/PCI/SSE2/3DNOW!
+NVIDIA Entry Graphics/PCI/SSE2/3DNOW!
+NVIDIA G 102M
+NVIDIA G 103M
+NVIDIA G 105M
+NVIDIA G 110M
+NVIDIA G100
+NVIDIA G102M
+NVIDIA G103M
+NVIDIA G105M
+NVIDIA G210
+NVIDIA G210M
+NVIDIA G70/PCI/SSE2
+NVIDIA G72
+NVIDIA G73
+NVIDIA G84
+NVIDIA G86
+NVIDIA G92
+NVIDIA G92-200/PCI/SSE2
+NVIDIA G94
+NVIDIA G96/PCI/SSE2
+NVIDIA G96/PCI/SSE2
+NVIDIA G98/PCI/SSE2
+NVIDIA G98/PCI/SSE2
+NVIDIA G98/PCI/SSE2/3DNOW!
+NVIDIA GT 120
+NVIDIA GT 130
+NVIDIA GT 130M
+NVIDIA GT 140
+NVIDIA GT 150
+NVIDIA GT 160M
+NVIDIA GT 220
+NVIDIA GT 220/PCI/SSE2
+NVIDIA GT 220/PCI/SSE2
+NVIDIA GT 220/PCI/SSE2/3DNOW!
+NVIDIA GT 220/PCI/SSE2/3DNOW!
+NVIDIA GT 230
+NVIDIA GT 230M
+NVIDIA GT 240
+NVIDIA GT 240M
+NVIDIA GT 250M
+NVIDIA GT 260M
+NVIDIA GT 320
+NVIDIA GT 320M
+NVIDIA GT 330
+NVIDIA GT 330M
+NVIDIA GT 340
+NVIDIA GT 420
+NVIDIA GT 430
+NVIDIA GT 440
+NVIDIA GT 450
+NVIDIA GT 520
+NVIDIA GT 540
+NVIDIA GT 540M
+NVIDIA GT-120
+NVIDIA GT200/PCI/SSE2
+NVIDIA GTS 150
+NVIDIA GTS 240
+NVIDIA GTS 250
+NVIDIA GTS 350M
+NVIDIA GTS 360
+NVIDIA GTS 360M
+NVIDIA GTS 450
+NVIDIA GTX 260
+NVIDIA GTX 260M
+NVIDIA GTX 270
+NVIDIA GTX 280
+NVIDIA GTX 285
+NVIDIA GTX 290
+NVIDIA GTX 460
+NVIDIA GTX 460M
+NVIDIA GTX 465
+NVIDIA GTX 470
+NVIDIA GTX 470M
+NVIDIA GTX 480
+NVIDIA GTX 480M
+NVIDIA GTX 550 Ti
+NVIDIA GTX 560
+NVIDIA GTX 560 Ti
+NVIDIA GTX 570
+NVIDIA GTX 580
+NVIDIA GTX 590
+NVIDIA GeForce
+NVIDIA GeForce 2
+NVIDIA GeForce 205/PCI/SSE2
+NVIDIA GeForce 205/PCI/SSE2
+NVIDIA GeForce 210
+NVIDIA GeForce 210/PCI/SSE2
+NVIDIA GeForce 210/PCI/SSE2
+NVIDIA GeForce 210/PCI/SSE2/3DNOW!
+NVIDIA GeForce 210/PCI/SSE2/3DNOW!
+NVIDIA GeForce 3
+NVIDIA GeForce 305M/PCI/SSE2
+NVIDIA GeForce 305M/PCI/SSE2
+NVIDIA GeForce 310/PCI/SSE2
+NVIDIA GeForce 310/PCI/SSE2
+NVIDIA GeForce 310/PCI/SSE2/3DNOW!
+NVIDIA GeForce 310/PCI/SSE2/3DNOW!
+NVIDIA GeForce 310M/PCI/SSE2
+NVIDIA GeForce 310M/PCI/SSE2
+NVIDIA GeForce 315/PCI/SSE2
+NVIDIA GeForce 315/PCI/SSE2
+NVIDIA GeForce 315/PCI/SSE2/3DNOW!
+NVIDIA GeForce 315/PCI/SSE2/3DNOW!
+NVIDIA GeForce 315M/PCI/SSE2
+NVIDIA GeForce 315M/PCI/SSE2
+NVIDIA GeForce 320M/PCI/SSE2
+NVIDIA GeForce 4 Go
+NVIDIA GeForce 4 MX
+NVIDIA GeForce 4 Ti
+NVIDIA GeForce 405/PCI/SSE2
+NVIDIA GeForce 405/PCI/SSE2
+NVIDIA GeForce 410M/PCI/SSE2
+NVIDIA GeForce 6100
+NVIDIA GeForce 6100 nForce 400/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6100 nForce 400/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6100 nForce 405/PCI/SSE2
+NVIDIA GeForce 6100 nForce 405/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6100 nForce 405/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6100 nForce 420/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6100 nForce 420/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6100 nForce 430/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6100 nForce 430/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6100/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6100/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6150 LE/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6150 LE/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6150/PCI/SSE2
+NVIDIA GeForce 6150/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6150/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6150SE nForce 430/PCI/SSE2
+NVIDIA GeForce 6150SE nForce 430/PCI/SSE2
+NVIDIA GeForce 6150SE nForce 430/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6150SE nForce 430/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6150SE/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6150SE/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6200
+NVIDIA GeForce 6200 A-LE/AGP/SSE/3DNOW!
+NVIDIA GeForce 6200 A-LE/AGP/SSE2
+NVIDIA GeForce 6200 A-LE/AGP/SSE2/3DNOW!
+NVIDIA GeForce 6200 LE/PCI/SSE2
+NVIDIA GeForce 6200 LE/PCI/SSE2
+NVIDIA GeForce 6200 LE/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6200 TurboCache(TM)/PCI/SSE2
+NVIDIA GeForce 6200 TurboCache(TM)/PCI/SSE2
+NVIDIA GeForce 6200 TurboCache(TM)/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6200/AGP/SSE/3DNOW!
+NVIDIA GeForce 6200/AGP/SSE/3DNOW!
+NVIDIA GeForce 6200/AGP/SSE2
+NVIDIA GeForce 6200/AGP/SSE2
+NVIDIA GeForce 6200/AGP/SSE2/3DNOW!
+NVIDIA GeForce 6200/PCI/SSE/3DNOW!
+NVIDIA GeForce 6200/PCI/SSE2
+NVIDIA GeForce 6200/PCI/SSE2
+NVIDIA GeForce 6200/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6200/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6200SE TurboCache(TM)/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6500
+NVIDIA GeForce 6500/PCI/SSE2
+NVIDIA GeForce 6500/PCI/SSE2
+NVIDIA GeForce 6600
+NVIDIA GeForce 6600 GT/AGP/SSE/3DNOW!
+NVIDIA GeForce 6600 GT/AGP/SSE2
+NVIDIA GeForce 6600 GT/AGP/SSE2
+NVIDIA GeForce 6600 GT/PCI/SSE/3DNOW!
+NVIDIA GeForce 6600 GT/PCI/SSE2
+NVIDIA GeForce 6600 GT/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6600 GT/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6600 LE/PCI/SSE2
+NVIDIA GeForce 6600/AGP/SSE/3DNOW!
+NVIDIA GeForce 6600/AGP/SSE2
+NVIDIA GeForce 6600/AGP/SSE2/3DNOW!
+NVIDIA GeForce 6600/PCI/SSE2
+NVIDIA GeForce 6600/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6700
+NVIDIA GeForce 6800
+NVIDIA GeForce 6800 GS/PCI/SSE2
+NVIDIA GeForce 6800 GS/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6800 GT/AGP/SSE2
+NVIDIA GeForce 6800 GT/PCI/SSE2
+NVIDIA GeForce 6800 XT/AGP/SSE2
+NVIDIA GeForce 6800 XT/PCI/SSE2
+NVIDIA GeForce 6800 XT/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6800/PCI/SSE2
+NVIDIA GeForce 6800/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7000
+NVIDIA GeForce 7000M
+NVIDIA GeForce 7000M / nForce 610M/PCI/SSE2
+NVIDIA GeForce 7000M / nForce 610M/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7000M / nForce 610M/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7025 / NVIDIA nForce 630a/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7025 / NVIDIA nForce 630a/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7025 / nForce 630a/PCI/SSE2
+NVIDIA GeForce 7025 / nForce 630a/PCI/SSE2
+NVIDIA GeForce 7025 / nForce 630a/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7025 / nForce 630a/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7050 / NVIDIA nForce 610i/PCI/SSE2
+NVIDIA GeForce 7050 / NVIDIA nForce 610i/PCI/SSE2
+NVIDIA GeForce 7050 / NVIDIA nForce 620i/PCI/SSE2
+NVIDIA GeForce 7050 / nForce 610i/PCI/SSE2
+NVIDIA GeForce 7050 / nForce 610i/PCI/SSE2
+NVIDIA GeForce 7050 / nForce 620i/PCI/SSE2
+NVIDIA GeForce 7050 / nForce 620i/PCI/SSE2
+NVIDIA GeForce 7050 PV / NVIDIA nForce 630a/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7050 PV / NVIDIA nForce 630a/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7050 PV / nForce 630a/PCI/SSE2
+NVIDIA GeForce 7050 PV / nForce 630a/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7050 SE / NVIDIA nForce 630a/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7100
+NVIDIA GeForce 7100 / NVIDIA nForce 620i/PCI/SSE2
+NVIDIA GeForce 7100 / NVIDIA nForce 620i/PCI/SSE2
+NVIDIA GeForce 7100 / NVIDIA nForce 630i/PCI/SSE2
+NVIDIA GeForce 7100 / NVIDIA nForce 630i/PCI/SSE2
+NVIDIA GeForce 7100 / nForce 630i/PCI/SSE2
+NVIDIA GeForce 7100 / nForce 630i/PCI/SSE2
+NVIDIA GeForce 7100 GS/PCI/SSE2
+NVIDIA GeForce 7100 GS/PCI/SSE2
+NVIDIA GeForce 7100 GS/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7100 GS/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7150M / nForce 630M/PCI/SSE2
+NVIDIA GeForce 7150M / nForce 630M/PCI/SSE2
+NVIDIA GeForce 7150M / nForce 630M/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7150M / nForce 630M/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7300
+NVIDIA GeForce 7300 GS/PCI/SSE2
+NVIDIA GeForce 7300 GS/PCI/SSE2
+NVIDIA GeForce 7300 GS/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7300 GS/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7300 GT/AGP/SSE2
+NVIDIA GeForce 7300 GT/AGP/SSE2/3DNOW!
+NVIDIA GeForce 7300 GT/PCI/SSE2
+NVIDIA GeForce 7300 GT/PCI/SSE2
+NVIDIA GeForce 7300 GT/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7300 GT/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7300 LE/PCI/SSE2
+NVIDIA GeForce 7300 LE/PCI/SSE2
+NVIDIA GeForce 7300 LE/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7300 LE/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7300 SE/7200 GS/PCI/SSE2
+NVIDIA GeForce 7300 SE/7200 GS/PCI/SSE2
+NVIDIA GeForce 7300 SE/7200 GS/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7300 SE/7200 GS/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7300 SE/PCI/SSE2
+NVIDIA GeForce 7300 SE/PCI/SSE2
+NVIDIA GeForce 7300 SE/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7300 SE/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7350 LE/PCI/SSE2
+NVIDIA GeForce 7350 LE/PCI/SSE2
+NVIDIA GeForce 7500
+NVIDIA GeForce 7500 LE/PCI/SSE2
+NVIDIA GeForce 7500 LE/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7600
+NVIDIA GeForce 7600 GS/AGP/SSE2
+NVIDIA GeForce 7600 GS/AGP/SSE2/3DNOW!
+NVIDIA GeForce 7600 GS/PCI/SSE2
+NVIDIA GeForce 7600 GS/PCI/SSE2
+NVIDIA GeForce 7600 GS/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7600 GS/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7600 GT/AGP/SSE/3DNOW!
+NVIDIA GeForce 7600 GT/AGP/SSE2
+NVIDIA GeForce 7600 GT/PCI/SSE2
+NVIDIA GeForce 7600 GT/PCI/SSE2
+NVIDIA GeForce 7600 GT/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7650 GS/PCI/SSE2
+NVIDIA GeForce 7800
+NVIDIA GeForce 7800 GS/AGP/SSE2
+NVIDIA GeForce 7800 GS/AGP/SSE2/3DNOW!
+NVIDIA GeForce 7800 GT/PCI/SSE2
+NVIDIA GeForce 7800 GT/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7800 GTX/PCI/SSE2
+NVIDIA GeForce 7800 GTX/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7800 GTX/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7900
+NVIDIA GeForce 7900 GS/PCI/SSE2
+NVIDIA GeForce 7900 GS/PCI/SSE2
+NVIDIA GeForce 7900 GS/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7900 GT/GTO/PCI/SSE2
+NVIDIA GeForce 7900 GT/GTO/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7900 GT/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7900 GT/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7900 GTX/PCI/SSE2
+NVIDIA GeForce 7950 GT/PCI/SSE2
+NVIDIA GeForce 7950 GT/PCI/SSE2/3DNOW!
+NVIDIA GeForce 8100
+NVIDIA GeForce 8100 / nForce 720a/PCI/SSE2/3DNOW!
+NVIDIA GeForce 8200
+NVIDIA GeForce 8200/PCI/SSE2
+NVIDIA GeForce 8200/PCI/SSE2
+NVIDIA GeForce 8200/PCI/SSE2/3DNOW!
+NVIDIA GeForce 8200/PCI/SSE2/3DNOW!
+NVIDIA GeForce 8200M
+NVIDIA GeForce 8200M G/PCI/SSE2
+NVIDIA GeForce 8200M G/PCI/SSE2
+NVIDIA GeForce 8200M G/PCI/SSE2/3DNOW!
+NVIDIA GeForce 8200M G/PCI/SSE2/3DNOW!
+NVIDIA GeForce 8300
+NVIDIA GeForce 8300 GS/PCI/SSE2
+NVIDIA GeForce 8300 GS/PCI/SSE2
+NVIDIA GeForce 8400
+NVIDIA GeForce 8400 GS/PCI/SSE/3DNOW!
+NVIDIA GeForce 8400 GS/PCI/SSE2
+NVIDIA GeForce 8400 GS/PCI/SSE2
+NVIDIA GeForce 8400 GS/PCI/SSE2/3DNOW!
+NVIDIA GeForce 8400 GS/PCI/SSE2/3DNOW!
+NVIDIA GeForce 8400/PCI/SSE2/3DNOW!
+NVIDIA GeForce 8400GS/PCI/SSE2
+NVIDIA GeForce 8400GS/PCI/SSE2
+NVIDIA GeForce 8400GS/PCI/SSE2/3DNOW!
+NVIDIA GeForce 8400GS/PCI/SSE2/3DNOW!
+NVIDIA GeForce 8400M
+NVIDIA GeForce 8400M G/PCI/SSE2
+NVIDIA GeForce 8400M G/PCI/SSE2
+NVIDIA GeForce 8400M G/PCI/SSE2/3DNOW!
+NVIDIA GeForce 8400M G/PCI/SSE2/3DNOW!
+NVIDIA GeForce 8400M GS/PCI/SSE2
+NVIDIA GeForce 8400M GS/PCI/SSE2
+NVIDIA GeForce 8400M GS/PCI/SSE2/3DNOW!
+NVIDIA GeForce 8400M GS/PCI/SSE2/3DNOW!
+NVIDIA GeForce 8400M GT/PCI/SSE2
+NVIDIA GeForce 8400M GT/PCI/SSE2
+NVIDIA GeForce 8500
+NVIDIA GeForce 8500 GT/PCI/SSE2
+NVIDIA GeForce 8500 GT/PCI/SSE2
+NVIDIA GeForce 8500 GT/PCI/SSE2/3DNOW!
+NVIDIA GeForce 8500 GT/PCI/SSE2/3DNOW!
+NVIDIA GeForce 8600
+NVIDIA GeForce 8600 GS/PCI/SSE2
+NVIDIA GeForce 8600 GS/PCI/SSE2
+NVIDIA GeForce 8600 GS/PCI/SSE2/3DNOW!
+NVIDIA GeForce 8600 GT/PCI/SSE2
+NVIDIA GeForce 8600 GT/PCI/SSE2
+NVIDIA GeForce 8600 GT/PCI/SSE2/3DNOW!
+NVIDIA GeForce 8600 GT/PCI/SSE2/3DNOW!
+NVIDIA GeForce 8600 GTS/PCI/SSE2
+NVIDIA GeForce 8600 GTS/PCI/SSE2/3DNOW!
+NVIDIA GeForce 8600GS/PCI/SSE2
+NVIDIA GeForce 8600GS/PCI/SSE2
+NVIDIA GeForce 8600M
+NVIDIA GeForce 8600M GS/PCI/SSE2
+NVIDIA GeForce 8600M GS/PCI/SSE2/3DNOW!
+NVIDIA GeForce 8600M GT/PCI/SSE2
+NVIDIA GeForce 8600M GT/PCI/SSE2
+NVIDIA GeForce 8700
+NVIDIA GeForce 8700M
+NVIDIA GeForce 8700M GT/PCI/SSE2
+NVIDIA GeForce 8700M GT/PCI/SSE2
+NVIDIA GeForce 8800
+NVIDIA GeForce 8800 GS/PCI/SSE2
+NVIDIA GeForce 8800 GT/PCI/SSE2
+NVIDIA GeForce 8800 GT/PCI/SSE2
+NVIDIA GeForce 8800 GT/PCI/SSE2/3DNOW!
+NVIDIA GeForce 8800 GT/PCI/SSE2/3DNOW!
+NVIDIA GeForce 8800 GTS 512/PCI/SSE2
+NVIDIA GeForce 8800 GTS 512/PCI/SSE2/3DNOW!
+NVIDIA GeForce 8800 GTS/PCI/SSE2
+NVIDIA GeForce 8800 GTS/PCI/SSE2
+NVIDIA GeForce 8800 GTS/PCI/SSE2/3DNOW!
+NVIDIA GeForce 8800 GTX/PCI/SSE2
+NVIDIA GeForce 8800 Ultra/PCI/SSE2
+NVIDIA GeForce 8800M GTS/PCI/SSE2
+NVIDIA GeForce 8800M GTS/PCI/SSE2
+NVIDIA GeForce 8800M GTX/PCI/SSE2
+NVIDIA GeForce 8800M GTX/PCI/SSE2
+NVIDIA GeForce 9100
+NVIDIA GeForce 9100/PCI/SSE2
+NVIDIA GeForce 9100/PCI/SSE2
+NVIDIA GeForce 9100/PCI/SSE2/3DNOW!
+NVIDIA GeForce 9100M
+NVIDIA GeForce 9100M G/PCI/SSE2
+NVIDIA GeForce 9100M G/PCI/SSE2
+NVIDIA GeForce 9100M G/PCI/SSE2/3DNOW!
+NVIDIA GeForce 9200
+NVIDIA GeForce 9200/PCI/SSE2
+NVIDIA GeForce 9200/PCI/SSE2
+NVIDIA GeForce 9200/PCI/SSE2/3DNOW!
+NVIDIA GeForce 9200/PCI/SSE2/3DNOW!
+NVIDIA GeForce 9200M GE/PCI/SSE2
+NVIDIA GeForce 9200M GE/PCI/SSE2
+NVIDIA GeForce 9200M GS/PCI/SSE2
+NVIDIA GeForce 9200M GS/PCI/SSE2
+NVIDIA GeForce 9300
+NVIDIA GeForce 9300 / nForce 730i/PCI/SSE2
+NVIDIA GeForce 9300 GE/PCI/SSE2
+NVIDIA GeForce 9300 GE/PCI/SSE2
+NVIDIA GeForce 9300 GE/PCI/SSE2/3DNOW!
+NVIDIA GeForce 9300 GE/PCI/SSE2/3DNOW!
+NVIDIA GeForce 9300 GS/PCI/SSE2
+NVIDIA GeForce 9300 GS/PCI/SSE2
+NVIDIA GeForce 9300 GS/PCI/SSE2/3DNOW!
+NVIDIA GeForce 9300 GS/PCI/SSE2/3DNOW!
+NVIDIA GeForce 9300 SE/PCI/SSE2
+NVIDIA GeForce 9300M
+NVIDIA GeForce 9300M G/PCI/SSE2
+NVIDIA GeForce 9300M G/PCI/SSE2
+NVIDIA GeForce 9300M G/PCI/SSE2/3DNOW!
+NVIDIA GeForce 9300M GS/PCI/SSE2
+NVIDIA GeForce 9300M GS/PCI/SSE2
+NVIDIA GeForce 9300M GS/PCI/SSE2/3DNOW!
+NVIDIA GeForce 9400
+NVIDIA GeForce 9400 GT/PCI/SSE2
+NVIDIA GeForce 9400 GT/PCI/SSE2
+NVIDIA GeForce 9400 GT/PCI/SSE2/3DNOW!
+NVIDIA GeForce 9400 GT/PCI/SSE2/3DNOW!
+NVIDIA GeForce 9400/PCI/SSE2
+NVIDIA GeForce 9400M
+NVIDIA GeForce 9400M G/PCI/SSE2
+NVIDIA GeForce 9400M G/PCI/SSE2
+NVIDIA GeForce 9400M/PCI/SSE2
+NVIDIA GeForce 9400M/PCI/SSE2
+NVIDIA GeForce 9500
+NVIDIA GeForce 9500 GS/PCI/SSE2
+NVIDIA GeForce 9500 GS/PCI/SSE2
+NVIDIA GeForce 9500 GS/PCI/SSE2/3DNOW!
+NVIDIA GeForce 9500 GT/PCI/SSE2
+NVIDIA GeForce 9500 GT/PCI/SSE2
+NVIDIA GeForce 9500 GT/PCI/SSE2/3DNOW!
+NVIDIA GeForce 9500 GT/PCI/SSE2/3DNOW!
+NVIDIA GeForce 9500M
+NVIDIA GeForce 9500M GS/PCI/SSE2
+NVIDIA GeForce 9500M GS/PCI/SSE2
+NVIDIA GeForce 9600
+NVIDIA GeForce 9600 GS/PCI/SSE2
+NVIDIA GeForce 9600 GSO 512/PCI/SSE2
+NVIDIA GeForce 9600 GSO/PCI/SSE2
+NVIDIA GeForce 9600 GSO/PCI/SSE2/3DNOW!
+NVIDIA GeForce 9600 GSO/PCI/SSE2/3DNOW!
+NVIDIA GeForce 9600 GT/PCI/SSE2
+NVIDIA GeForce 9600 GT/PCI/SSE2
+NVIDIA GeForce 9600 GT/PCI/SSE2/3DNOW!
+NVIDIA GeForce 9600 GT/PCI/SSE2/3DNOW!
+NVIDIA GeForce 9600M
+NVIDIA GeForce 9600M GS/PCI/SSE2
+NVIDIA GeForce 9600M GS/PCI/SSE2
+NVIDIA GeForce 9600M GT/PCI/SSE2
+NVIDIA GeForce 9600M GT/PCI/SSE2
+NVIDIA GeForce 9650M GT/PCI/SSE2
+NVIDIA GeForce 9650M GT/PCI/SSE2
+NVIDIA GeForce 9700M
+NVIDIA GeForce 9700M GT/PCI/SSE2
+NVIDIA GeForce 9700M GTS/PCI/SSE2
+NVIDIA GeForce 9700M GTS/PCI/SSE2
+NVIDIA GeForce 9800
+NVIDIA GeForce 9800 GT/PCI/SSE2
+NVIDIA GeForce 9800 GT/PCI/SSE2
+NVIDIA GeForce 9800 GT/PCI/SSE2/3DNOW!
+NVIDIA GeForce 9800 GT/PCI/SSE2/3DNOW!
+NVIDIA GeForce 9800 GTX+/PCI/SSE2
+NVIDIA GeForce 9800 GTX+/PCI/SSE2
+NVIDIA GeForce 9800 GTX+/PCI/SSE2/3DNOW!
+NVIDIA GeForce 9800 GTX/9800 GTX+/PCI/SSE2
+NVIDIA GeForce 9800 GTX/9800 GTX+/PCI/SSE2
+NVIDIA GeForce 9800 GTX/PCI/SSE2
+NVIDIA GeForce 9800 GX2/PCI/SSE2
+NVIDIA GeForce 9800M
+NVIDIA GeForce 9800M GS/PCI/SSE2
+NVIDIA GeForce 9800M GS/PCI/SSE2
+NVIDIA GeForce 9800M GT/PCI/SSE2
+NVIDIA GeForce 9800M GT/PCI/SSE2
+NVIDIA GeForce 9800M GTS/PCI/SSE2
+NVIDIA GeForce 9800M GTS/PCI/SSE2
+NVIDIA GeForce FX 5100
+NVIDIA GeForce FX 5100/AGP/SSE/3DNOW!
+NVIDIA GeForce FX 5200
+NVIDIA GeForce FX 5200/AGP/SSE
+NVIDIA GeForce FX 5200/AGP/SSE/3DNOW!
+NVIDIA GeForce FX 5200/AGP/SSE/3DNOW!
+NVIDIA GeForce FX 5200/AGP/SSE2
+NVIDIA GeForce FX 5200/AGP/SSE2
+NVIDIA GeForce FX 5200/AGP/SSE2/3DNOW!
+NVIDIA GeForce FX 5200/PCI/SSE2
+NVIDIA GeForce FX 5200/PCI/SSE2/3DNOW!
+NVIDIA GeForce FX 5200LE/AGP/SSE2
+NVIDIA GeForce FX 5500
+NVIDIA GeForce FX 5500/AGP/SSE/3DNOW!
+NVIDIA GeForce FX 5500/AGP/SSE2
+NVIDIA GeForce FX 5500/AGP/SSE2
+NVIDIA GeForce FX 5500/AGP/SSE2/3DNOW!
+NVIDIA GeForce FX 5500/AGP/SSE2/3DNOW!
+NVIDIA GeForce FX 5500/PCI/SSE2
+NVIDIA GeForce FX 5500/PCI/SSE2
+NVIDIA GeForce FX 5500/PCI/SSE2/3DNOW!
+NVIDIA GeForce FX 5500/PCI/SSE2/3DNOW!
+NVIDIA GeForce FX 5600
+NVIDIA GeForce FX 5600/AGP/SSE2
+NVIDIA GeForce FX 5600/AGP/SSE2
+NVIDIA GeForce FX 5600/AGP/SSE2/3DNOW!
+NVIDIA GeForce FX 5600XT/AGP/SSE2/3DNOW!
+NVIDIA GeForce FX 5700
+NVIDIA GeForce FX 5700/AGP/SSE/3DNOW!
+NVIDIA GeForce FX 5700LE/AGP/SSE
+NVIDIA GeForce FX 5700LE/AGP/SSE/3DNOW!
+NVIDIA GeForce FX 5800
+NVIDIA GeForce FX 5900
+NVIDIA GeForce FX 5900/AGP/SSE2
+NVIDIA GeForce FX 5900XT/AGP/SSE2
+NVIDIA GeForce FX Go5100
+NVIDIA GeForce FX Go5100/AGP/SSE2
+NVIDIA GeForce FX Go5200
+NVIDIA GeForce FX Go5200/AGP/SSE2
+NVIDIA GeForce FX Go5200/AGP/SSE2
+NVIDIA GeForce FX Go5300
+NVIDIA GeForce FX Go5600
+NVIDIA GeForce FX Go5600/AGP/SSE2
+NVIDIA GeForce FX Go5600/AGP/SSE2
+NVIDIA GeForce FX Go5650/AGP/SSE2
+NVIDIA GeForce FX Go5700
+NVIDIA GeForce FX Go5700/AGP/SSE2
+NVIDIA GeForce FX Go5xxx/AGP/SSE2
+NVIDIA GeForce FX Go5xxx/AGP/SSE2
+NVIDIA GeForce G 103M/PCI/SSE2
+NVIDIA GeForce G 103M/PCI/SSE2
+NVIDIA GeForce G 103M/PCI/SSE2/3DNOW!
+NVIDIA GeForce G 105M/PCI/SSE2
+NVIDIA GeForce G 105M/PCI/SSE2
+NVIDIA GeForce G 110M/PCI/SSE2
+NVIDIA GeForce G 110M/PCI/SSE2
+NVIDIA GeForce G100/PCI/SSE2
+NVIDIA GeForce G100/PCI/SSE2
+NVIDIA GeForce G100/PCI/SSE2/3DNOW!
+NVIDIA GeForce G100/PCI/SSE2/3DNOW!
+NVIDIA GeForce G102M/PCI/SSE2
+NVIDIA GeForce G102M/PCI/SSE2
+NVIDIA GeForce G105M/PCI/SSE2
+NVIDIA GeForce G105M/PCI/SSE2
+NVIDIA GeForce G200/PCI/SSE2
+NVIDIA GeForce G200/PCI/SSE2
+NVIDIA GeForce G205M/PCI/SSE2
+NVIDIA GeForce G205M/PCI/SSE2
+NVIDIA GeForce G210/PCI/SSE2
+NVIDIA GeForce G210/PCI/SSE2
+NVIDIA GeForce G210/PCI/SSE2/3DNOW!
+NVIDIA GeForce G210/PCI/SSE2/3DNOW!
+NVIDIA GeForce G210M/PCI/SSE2
+NVIDIA GeForce G210M/PCI/SSE2
+NVIDIA GeForce G310M/PCI/SSE2
+NVIDIA GeForce GT 120/PCI/SSE2
+NVIDIA GeForce GT 120/PCI/SSE2
+NVIDIA GeForce GT 120/PCI/SSE2/3DNOW!
+NVIDIA GeForce GT 120M/PCI/SSE2
+NVIDIA GeForce GT 130M/PCI/SSE2
+NVIDIA GeForce GT 130M/PCI/SSE2
+NVIDIA GeForce GT 140/PCI/SSE2
+NVIDIA GeForce GT 140/PCI/SSE2
+NVIDIA GeForce GT 220/PCI/SSE2
+NVIDIA GeForce GT 220/PCI/SSE2
+NVIDIA GeForce GT 220/PCI/SSE2/3DNOW!
+NVIDIA GeForce GT 220/PCI/SSE2/3DNOW!
+NVIDIA GeForce GT 220M/PCI/SSE2
+NVIDIA GeForce GT 220M/PCI/SSE2
+NVIDIA GeForce GT 230/PCI/SSE2
+NVIDIA GeForce GT 230/PCI/SSE2
+NVIDIA GeForce GT 230M/PCI/SSE2
+NVIDIA GeForce GT 230M/PCI/SSE2
+NVIDIA GeForce GT 240
+NVIDIA GeForce GT 240/PCI/SSE2
+NVIDIA GeForce GT 240/PCI/SSE2
+NVIDIA GeForce GT 240/PCI/SSE2/3DNOW!
+NVIDIA GeForce GT 240/PCI/SSE2/3DNOW!
+NVIDIA GeForce GT 240M/PCI/SSE2
+NVIDIA GeForce GT 240M/PCI/SSE2
+NVIDIA GeForce GT 320/PCI/SSE2
+NVIDIA GeForce GT 320M/PCI/SSE2
+NVIDIA GeForce GT 320M/PCI/SSE2
+NVIDIA GeForce GT 325M/PCI/SSE2
+NVIDIA GeForce GT 330/PCI/SSE2
+NVIDIA GeForce GT 330/PCI/SSE2
+NVIDIA GeForce GT 330/PCI/SSE2/3DNOW!
+NVIDIA GeForce GT 330M/PCI/SSE2
+NVIDIA GeForce GT 330M/PCI/SSE2
+NVIDIA GeForce GT 335M/PCI/SSE2
+NVIDIA GeForce GT 335M/PCI/SSE2
+NVIDIA GeForce GT 340/PCI/SSE2
+NVIDIA GeForce GT 340/PCI/SSE2
+NVIDIA GeForce GT 340/PCI/SSE2/3DNOW!
+NVIDIA GeForce GT 340/PCI/SSE2/3DNOW!
+NVIDIA GeForce GT 415M/PCI/SSE2
+NVIDIA GeForce GT 415M/PCI/SSE2
+NVIDIA GeForce GT 420/PCI/SSE2
+NVIDIA GeForce GT 420/PCI/SSE2
+NVIDIA GeForce GT 420M/PCI/SSE2
+NVIDIA GeForce GT 420M/PCI/SSE2
+NVIDIA GeForce GT 425M/PCI/SSE2
+NVIDIA GeForce GT 425M/PCI/SSE2
+NVIDIA GeForce GT 430/PCI/SSE2
+NVIDIA GeForce GT 430/PCI/SSE2
+NVIDIA GeForce GT 430/PCI/SSE2/3DNOW!
+NVIDIA GeForce GT 430/PCI/SSE2/3DNOW!
+NVIDIA GeForce GT 435M/PCI/SSE2
+NVIDIA GeForce GT 435M/PCI/SSE2
+NVIDIA GeForce GT 440/PCI/SSE2
+NVIDIA GeForce GT 440/PCI/SSE2
+NVIDIA GeForce GT 440/PCI/SSE2/3DNOW!
+NVIDIA GeForce GT 440/PCI/SSE2/3DNOW!
+NVIDIA GeForce GT 445M/PCI/SSE2
+NVIDIA GeForce GT 445M/PCI/SSE2
+NVIDIA GeForce GT 520/PCI/SSE2
+NVIDIA GeForce GT 520/PCI/SSE2/3DNOW!
+NVIDIA GeForce GT 520M/PCI/SSE2
+NVIDIA GeForce GT 520M/PCI/SSE2
+NVIDIA GeForce GT 525M/PCI/SSE2
+NVIDIA GeForce GT 525M/PCI/SSE2
+NVIDIA GeForce GT 530/PCI/SSE2
+NVIDIA GeForce GT 530/PCI/SSE2/3DNOW!
+NVIDIA GeForce GT 540M/PCI/SSE2
+NVIDIA GeForce GT 540M/PCI/SSE2
+NVIDIA GeForce GT 545/PCI/SSE2
+NVIDIA GeForce GT 550M/PCI/SSE2
+NVIDIA GeForce GT 550M/PCI/SSE2
+NVIDIA GeForce GT 555M/PCI/SSE2
+NVIDIA GeForce GT 555M/PCI/SSE2
+NVIDIA GeForce GTS 150/PCI/SSE2
+NVIDIA GeForce GTS 150/PCI/SSE2
+NVIDIA GeForce GTS 160M/PCI/SSE2
+NVIDIA GeForce GTS 160M/PCI/SSE2
+NVIDIA GeForce GTS 240/PCI/SSE2
+NVIDIA GeForce GTS 240/PCI/SSE2
+NVIDIA GeForce GTS 250/PCI/SSE2
+NVIDIA GeForce GTS 250/PCI/SSE2
+NVIDIA GeForce GTS 250/PCI/SSE2/3DNOW!
+NVIDIA GeForce GTS 250/PCI/SSE2/3DNOW!
+NVIDIA GeForce GTS 250M/PCI/SSE2
+NVIDIA GeForce GTS 350M/PCI/SSE2
+NVIDIA GeForce GTS 350M/PCI/SSE2
+NVIDIA GeForce GTS 360M/PCI/SSE2
+NVIDIA GeForce GTS 360M/PCI/SSE2
+NVIDIA GeForce GTS 450/PCI/SSE2
+NVIDIA GeForce GTS 450/PCI/SSE2
+NVIDIA GeForce GTS 450/PCI/SSE2/3DNOW!
+NVIDIA GeForce GTS 450/PCI/SSE2/3DNOW!
+NVIDIA GeForce GTS 455/PCI/SSE2
+NVIDIA GeForce GTX 260/PCI/SSE2
+NVIDIA GeForce GTX 260/PCI/SSE2
+NVIDIA GeForce GTX 260/PCI/SSE2/3DNOW!
+NVIDIA GeForce GTX 260/PCI/SSE2/3DNOW!
+NVIDIA GeForce GTX 260M/PCI/SSE2
+NVIDIA GeForce GTX 260M/PCI/SSE2
+NVIDIA GeForce GTX 275/PCI/SSE2
+NVIDIA GeForce GTX 275/PCI/SSE2
+NVIDIA GeForce GTX 275/PCI/SSE2/3DNOW!
+NVIDIA GeForce GTX 280
+NVIDIA GeForce GTX 280/PCI/SSE2
+NVIDIA GeForce GTX 280M/PCI/SSE2
+NVIDIA GeForce GTX 285
+NVIDIA GeForce GTX 285/PCI/SSE2
+NVIDIA GeForce GTX 285/PCI/SSE2
+NVIDIA GeForce GTX 285/PCI/SSE2
+NVIDIA GeForce GTX 295/PCI/SSE2
+NVIDIA GeForce GTX 295/PCI/SSE2
+NVIDIA GeForce GTX 460 SE/PCI/SSE2
+NVIDIA GeForce GTX 460 SE/PCI/SSE2
+NVIDIA GeForce GTX 460 SE/PCI/SSE2/3DNOW!
+NVIDIA GeForce GTX 460 SE/PCI/SSE2/3DNOW!
+NVIDIA GeForce GTX 460/PCI/SSE2
+NVIDIA GeForce GTX 460/PCI/SSE2
+NVIDIA GeForce GTX 460/PCI/SSE2/3DNOW!
+NVIDIA GeForce GTX 460/PCI/SSE2/3DNOW!
+NVIDIA GeForce GTX 460M/PCI/SSE2
+NVIDIA GeForce GTX 460M/PCI/SSE2
+NVIDIA GeForce GTX 465/PCI/SSE2
+NVIDIA GeForce GTX 465/PCI/SSE2
+NVIDIA GeForce GTX 465/PCI/SSE2/3DNOW!
+NVIDIA GeForce GTX 465/PCI/SSE2/3DNOW!
+NVIDIA GeForce GTX 470/PCI/SSE2
+NVIDIA GeForce GTX 470/PCI/SSE2
+NVIDIA GeForce GTX 470/PCI/SSE2/3DNOW!
+NVIDIA GeForce GTX 480/PCI/SSE2
+NVIDIA GeForce GTX 550 Ti/PCI/SSE2
+NVIDIA GeForce GTX 550 Ti/PCI/SSE2
+NVIDIA GeForce GTX 550 Ti/PCI/SSE2/3DNOW!
+NVIDIA GeForce GTX 550 Ti/PCI/SSE2/3DNOW!
+NVIDIA GeForce GTX 560 Ti/PCI/SSE2
+NVIDIA GeForce GTX 560 Ti/PCI/SSE2
+NVIDIA GeForce GTX 560 Ti/PCI/SSE2/3DNOW!
+NVIDIA GeForce GTX 560 Ti/PCI/SSE2/3DNOW!
+NVIDIA GeForce GTX 560/PCI/SSE2
+NVIDIA GeForce GTX 560/PCI/SSE2
+NVIDIA GeForce GTX 560/PCI/SSE2/3DNOW!
+NVIDIA GeForce GTX 560M/PCI/SSE2
+NVIDIA GeForce GTX 570/PCI/SSE2
+NVIDIA GeForce GTX 570/PCI/SSE2
+NVIDIA GeForce GTX 570/PCI/SSE2/3DNOW!
+NVIDIA GeForce GTX 570/PCI/SSE2/3DNOW!
+NVIDIA GeForce GTX 580/PCI/SSE2
+NVIDIA GeForce GTX 580/PCI/SSE2
+NVIDIA GeForce GTX 580/PCI/SSE2/3DNOW!
+NVIDIA GeForce GTX 580/PCI/SSE2/3DNOW!
+NVIDIA GeForce GTX 580M/PCI/SSE2
+NVIDIA GeForce GTX 590/PCI/SSE2
+NVIDIA GeForce GTX 590/PCI/SSE2
+NVIDIA GeForce Go 6
+NVIDIA GeForce Go 6100
+NVIDIA GeForce Go 6100/PCI/SSE2
+NVIDIA GeForce Go 6100/PCI/SSE2/3DNOW!
+NVIDIA GeForce Go 6100/PCI/SSE2/3DNOW!
+NVIDIA GeForce Go 6150/PCI/SSE2
+NVIDIA GeForce Go 6150/PCI/SSE2/3DNOW!
+NVIDIA GeForce Go 6150/PCI/SSE2/3DNOW!
+NVIDIA GeForce Go 6200
+NVIDIA GeForce Go 6200/PCI/SSE2
+NVIDIA GeForce Go 6400
+NVIDIA GeForce Go 6400/PCI/SSE2
+NVIDIA GeForce Go 6400/PCI/SSE2
+NVIDIA GeForce Go 6600
+NVIDIA GeForce Go 6600/PCI/SSE2
+NVIDIA GeForce Go 6600/PCI/SSE2
+NVIDIA GeForce Go 6800
+NVIDIA GeForce Go 6800 Ultra/PCI/SSE2
+NVIDIA GeForce Go 6800 Ultra/PCI/SSE2
+NVIDIA GeForce Go 6800/PCI/SSE2
+NVIDIA GeForce Go 7200
+NVIDIA GeForce Go 7200/PCI/SSE2
+NVIDIA GeForce Go 7200/PCI/SSE2/3DNOW!
+NVIDIA GeForce Go 7300
+NVIDIA GeForce Go 7300/PCI/SSE2
+NVIDIA GeForce Go 7300/PCI/SSE2
+NVIDIA GeForce Go 7300/PCI/SSE2/3DNOW!
+NVIDIA GeForce Go 7400
+NVIDIA GeForce Go 7400/PCI/SSE2
+NVIDIA GeForce Go 7400/PCI/SSE2
+NVIDIA GeForce Go 7400/PCI/SSE2/3DNOW!
+NVIDIA GeForce Go 7600
+NVIDIA GeForce Go 7600/PCI/SSE2
+NVIDIA GeForce Go 7600/PCI/SSE2
+NVIDIA GeForce Go 7600/PCI/SSE2/3DNOW!
+NVIDIA GeForce Go 7600/PCI/SSE2/3DNOW!
+NVIDIA GeForce Go 7700
+NVIDIA GeForce Go 7700/PCI/SSE2
+NVIDIA GeForce Go 7800
+NVIDIA GeForce Go 7800 GTX/PCI/SSE2
+NVIDIA GeForce Go 7900
+NVIDIA GeForce Go 7900 GS/PCI/SSE2
+NVIDIA GeForce Go 7900 GS/PCI/SSE2
+NVIDIA GeForce Go 7900 GTX/PCI/SSE2
+NVIDIA GeForce Go 7950 GTX/PCI/SSE2
+NVIDIA GeForce PCX
+NVIDIA GeForce2 GTS/AGP/SSE
+NVIDIA GeForce2 MX/AGP/3DNOW!
+NVIDIA GeForce2 MX/AGP/SSE/3DNOW!
+NVIDIA GeForce2 MX/AGP/SSE2
+NVIDIA GeForce2 MX/AGP/SSE2
+NVIDIA GeForce2 MX/PCI/SSE2
+NVIDIA GeForce3/AGP/SSE/3DNOW!
+NVIDIA GeForce3/AGP/SSE2
+NVIDIA GeForce4 420 Go 32M/AGP/SSE2
+NVIDIA GeForce4 420 Go 32M/AGP/SSE2/3DNOW!
+NVIDIA GeForce4 420 Go 32M/PCI/SSE2/3DNOW!
+NVIDIA GeForce4 420 Go/AGP/SSE2
+NVIDIA GeForce4 440 Go 64M/AGP/SSE2/3DNOW!
+NVIDIA GeForce4 440 Go/AGP/SSE2
+NVIDIA GeForce4 460 Go/AGP/SSE2
+NVIDIA GeForce4 MX 4000/AGP/SSE/3DNOW!
+NVIDIA GeForce4 MX 4000/AGP/SSE/3DNOW!
+NVIDIA GeForce4 MX 4000/AGP/SSE2
+NVIDIA GeForce4 MX 4000/AGP/SSE2
+NVIDIA GeForce4 MX 4000/PCI/3DNOW!
+NVIDIA GeForce4 MX 4000/PCI/SSE/3DNOW!
+NVIDIA GeForce4 MX 4000/PCI/SSE2
+NVIDIA GeForce4 MX 420/AGP/SSE/3DNOW!
+NVIDIA GeForce4 MX 420/AGP/SSE2
+NVIDIA GeForce4 MX 440 with AGP8X/AGP/SSE2
+NVIDIA GeForce4 MX 440 with AGP8X/AGP/SSE2
+NVIDIA GeForce4 MX 440/AGP/SSE2
+NVIDIA GeForce4 MX 440/AGP/SSE2
+NVIDIA GeForce4 MX 440/AGP/SSE2/3DNOW!
+NVIDIA GeForce4 MX 440SE with AGP8X/AGP/SSE2
+NVIDIA GeForce4 MX 440SE with AGP8X/AGP/SSE2
+NVIDIA GeForce4 MX Integrated GPU/AGP/SSE/3DNOW!
+NVIDIA GeForce4 MX Integrated GPU/AGP/SSE/3DNOW!
+NVIDIA GeForce4 Ti 4200 with AGP8X/AGP/SSE
+NVIDIA GeForce4 Ti 4200/AGP/SSE/3DNOW!
+NVIDIA GeForce4 Ti 4400/AGP/SSE2
+NVIDIA Generic
+NVIDIA ION LE/PCI/SSE2
+NVIDIA ION LE/PCI/SSE2
+NVIDIA ION/PCI/SSE2
+NVIDIA ION/PCI/SSE2
+NVIDIA ION/PCI/SSE2/3DNOW!
+NVIDIA ION/PCI/SSE2/3DNOW!
+NVIDIA MCP61/PCI/SSE2
+NVIDIA MCP61/PCI/SSE2
+NVIDIA MCP61/PCI/SSE2/3DNOW!
+NVIDIA MCP61/PCI/SSE2/3DNOW!
+NVIDIA MCP73/PCI/SSE2
+NVIDIA MCP73/PCI/SSE2
+NVIDIA MCP79MH/PCI/SSE2
+NVIDIA MCP79MH/PCI/SSE2
+NVIDIA MCP79MX/PCI/SSE2
+NVIDIA MCP79MX/PCI/SSE2
+NVIDIA MCP7A-O/PCI/SSE2
+NVIDIA MCP7A-O/PCI/SSE2
+NVIDIA MCP7A-S/PCI/SSE2
+NVIDIA MCP89-EPT/PCI/SSE2
+NVIDIA MCP89-EPT/PCI/SSE2
+NVIDIA N10M-GE1/PCI/SSE2
+NVIDIA N10M-GE1/PCI/SSE2
+NVIDIA N10P-GE1/PCI/SSE2
+NVIDIA N10P-GE1/PCI/SSE2
+NVIDIA N10P-GV2/PCI/SSE2
+NVIDIA N10P-GV2/PCI/SSE2
+NVIDIA N11M-GE1/PCI/SSE2
+NVIDIA N11M-GE1/PCI/SSE2
+NVIDIA N11M-GE2/PCI/SSE2
+NVIDIA N11M-GE2/PCI/SSE2
+NVIDIA N12E-GS-A1/PCI/SSE2
+NVIDIA N12P-GVR-B-A1/PCI/SSE2
+NVIDIA N13M-GE1-B-A1/PCI/SSE2
+NVIDIA N13P-GL-A1/PCI/SSE2
+NVIDIA NB9M-GE/PCI/SSE2
+NVIDIA NB9M-GE/PCI/SSE2
+NVIDIA NB9M-GE1/PCI/SSE2
+NVIDIA NB9M-GE1/PCI/SSE2
+NVIDIA NB9M-GS/PCI/SSE2
+NVIDIA NB9M-GS/PCI/SSE2
+NVIDIA NB9M-NS/PCI/SSE2
+NVIDIA NB9M-NS/PCI/SSE2
+NVIDIA NB9P-GE1/PCI/SSE2
+NVIDIA NB9P-GE1/PCI/SSE2
+NVIDIA NB9P-GS/PCI/SSE2
+NVIDIA NV17/AGP/3DNOW!
+NVIDIA NV17/AGP/SSE2
+NVIDIA NV17/AGP/SSE2
+NVIDIA NV34
+NVIDIA NV35
+NVIDIA NV36/AGP/SSE/3DNOW!
+NVIDIA NV36/AGP/SSE2
+NVIDIA NV41/PCI/SSE2
+NVIDIA NV43
+NVIDIA NV43/PCI/SSE2
+NVIDIA NV44
+NVIDIA NV44/AGP/SSE2
+NVIDIA NVIDIA GeForce 210 OpenGL Engine
+NVIDIA NVIDIA GeForce 210 OpenGL Engine
+NVIDIA NVIDIA GeForce 320M OpenGL Engine
+NVIDIA NVIDIA GeForce 320M OpenGL Engine
+NVIDIA NVIDIA GeForce 7300 GT OpenGL Engine
+NVIDIA NVIDIA GeForce 7300 GT OpenGL Engine
+NVIDIA NVIDIA GeForce 7600 GT OpenGL Engine
+NVIDIA NVIDIA GeForce 8600M GT OpenGL Engine
+NVIDIA NVIDIA GeForce 8600M GT OpenGL Engine
+NVIDIA NVIDIA GeForce 8800 GS OpenGL Engine
+NVIDIA NVIDIA GeForce 8800 GS OpenGL Engine
+NVIDIA NVIDIA GeForce 8800 GT OpenGL Engine
+NVIDIA NVIDIA GeForce 8800 GT OpenGL Engine
+NVIDIA NVIDIA GeForce 9400 OpenGL Engine
+NVIDIA NVIDIA GeForce 9400 OpenGL Engine
+NVIDIA NVIDIA GeForce 9400M OpenGL Engine
+NVIDIA NVIDIA GeForce 9400M OpenGL Engine
+NVIDIA NVIDIA GeForce 9500 GT OpenGL Engine
+NVIDIA NVIDIA GeForce 9600M GT OpenGL Engine
+NVIDIA NVIDIA GeForce 9600M GT OpenGL Engine
+NVIDIA NVIDIA GeForce GT 120 OpenGL Engine
+NVIDIA NVIDIA GeForce GT 120 OpenGL Engine
+NVIDIA NVIDIA GeForce GT 130 OpenGL Engine
+NVIDIA NVIDIA GeForce GT 130 OpenGL Engine
+NVIDIA NVIDIA GeForce GT 220 OpenGL Engine
+NVIDIA NVIDIA GeForce GT 230M OpenGL Engine
+NVIDIA NVIDIA GeForce GT 240M OpenGL Engine
+NVIDIA NVIDIA GeForce GT 330M OpenGL Engine
+NVIDIA NVIDIA GeForce GT 330M OpenGL Engine
+NVIDIA NVIDIA GeForce GT 420M OpenGL Engine
+NVIDIA NVIDIA GeForce GT 425M OpenGL Engine
+NVIDIA NVIDIA GeForce GT 430 OpenGL Engine
+NVIDIA NVIDIA GeForce GT 430 OpenGL Engine
+NVIDIA NVIDIA GeForce GT 440 OpenGL Engine
+NVIDIA NVIDIA GeForce GT 540M OpenGL Engine
+NVIDIA NVIDIA GeForce GTS 240 OpenGL Engine
+NVIDIA NVIDIA GeForce GTS 250 OpenGL Engine
+NVIDIA NVIDIA GeForce GTS 250 OpenGL Engine
+NVIDIA NVIDIA GeForce GTS 450 OpenGL Engine
+NVIDIA NVIDIA GeForce GTS 450 OpenGL Engine
+NVIDIA NVIDIA GeForce GTX 285 OpenGL Engine
+NVIDIA NVIDIA GeForce GTX 460 OpenGL Engine
+NVIDIA NVIDIA GeForce GTX 460 OpenGL Engine
+NVIDIA NVIDIA GeForce GTX 460M OpenGL Engine
+NVIDIA NVIDIA GeForce GTX 465 OpenGL Engine
+NVIDIA NVIDIA GeForce GTX 470 OpenGL Engine
+NVIDIA NVIDIA GeForce GTX 480 OpenGL Engine
+NVIDIA NVIDIA GeForce GTX 480 OpenGL Engine
+NVIDIA NVIDIA GeForce Pre-Release GF108 ES OpenGL Engine
+NVIDIA NVIDIA GeForce Pre-Release ION OpenGL Engine
+NVIDIA NVIDIA GeForce Pre-Release ION OpenGL Engine
+NVIDIA NVIDIA GeForce Pre-Release MCP7A-J-DC OpenGL Engine
+NVIDIA NVIDIA GeForce4 OpenGL Engine
+NVIDIA NVIDIA NV34MAP OpenGL Engine
+NVIDIA NVIDIA Quadro 4000 OpenGL Engine
+NVIDIA NVIDIA Quadro 4000 OpenGL Engine
+NVIDIA NVIDIA Quadro FX 4800 OpenGL Engine
+NVIDIA NVS 2100M/PCI/SSE2
+NVIDIA NVS 2100M/PCI/SSE2
+NVIDIA NVS 300/PCI/SSE2
+NVIDIA NVS 300/PCI/SSE2
+NVIDIA NVS 3100M/PCI/SSE2
+NVIDIA NVS 3100M/PCI/SSE2
+NVIDIA NVS 4100/PCI/SSE2/3DNOW!
+NVIDIA NVS 4200M/PCI/SSE2
+NVIDIA NVS 4200M/PCI/SSE2
+NVIDIA NVS 5100M/PCI/SSE2
+NVIDIA NVS 5100M/PCI/SSE2
+NVIDIA PCI
+NVIDIA Quadro 1000M/PCI/SSE2
+NVIDIA Quadro 2000/PCI/SSE2
+NVIDIA Quadro 2000/PCI/SSE2
+NVIDIA Quadro 2000M/PCI/SSE2
+NVIDIA Quadro 3000M/PCI/SSE2
+NVIDIA Quadro 4000
+NVIDIA Quadro 4000 OpenGL Engine
+NVIDIA Quadro 4000/PCI/SSE2
+NVIDIA Quadro 4000/PCI/SSE2
+NVIDIA Quadro 4000M/PCI/SSE2
+NVIDIA Quadro 5000/PCI/SSE2
+NVIDIA Quadro 5000/PCI/SSE2
+NVIDIA Quadro 5000M/PCI/SSE2
+NVIDIA Quadro 600
+NVIDIA Quadro 600/PCI/SSE2
+NVIDIA Quadro 600/PCI/SSE2
+NVIDIA Quadro 600/PCI/SSE2/3DNOW!
+NVIDIA Quadro 6000
+NVIDIA Quadro 6000/PCI/SSE2
+NVIDIA Quadro CX/PCI/SSE2
+NVIDIA Quadro DCC
+NVIDIA Quadro FX
+NVIDIA Quadro FX 1100/AGP/SSE2
+NVIDIA Quadro FX 1400/PCI/SSE2
+NVIDIA Quadro FX 1400/PCI/SSE2
+NVIDIA Quadro FX 1500
+NVIDIA Quadro FX 1500/PCI/SSE2
+NVIDIA Quadro FX 1500M/PCI/SSE2
+NVIDIA Quadro FX 1600M/PCI/SSE2
+NVIDIA Quadro FX 1600M/PCI/SSE2
+NVIDIA Quadro FX 1700
+NVIDIA Quadro FX 1700M/PCI/SSE2
+NVIDIA Quadro FX 1800
+NVIDIA Quadro FX 1800/PCI/SSE2
+NVIDIA Quadro FX 1800M/PCI/SSE2
+NVIDIA Quadro FX 2500M/PCI/SSE2
+NVIDIA Quadro FX 2500M/PCI/SSE2
+NVIDIA Quadro FX 2700M/PCI/SSE2
+NVIDIA Quadro FX 2700M/PCI/SSE2
+NVIDIA Quadro FX 2800M/PCI/SSE2
+NVIDIA Quadro FX 2800M/PCI/SSE2
+NVIDIA Quadro FX 3400
+NVIDIA Quadro FX 3450
+NVIDIA Quadro FX 3450/4000 SDI/PCI/SSE2
+NVIDIA Quadro FX 3500
+NVIDIA Quadro FX 3500M/PCI/SSE2
+NVIDIA Quadro FX 360M/PCI/SSE2
+NVIDIA Quadro FX 370
+NVIDIA Quadro FX 370/PCI/SSE2
+NVIDIA Quadro FX 3700
+NVIDIA Quadro FX 3700M/PCI/SSE2
+NVIDIA Quadro FX 3700M/PCI/SSE2
+NVIDIA Quadro FX 370M/PCI/SSE2
+NVIDIA Quadro FX 3800
+NVIDIA Quadro FX 3800M/PCI/SSE2
+NVIDIA Quadro FX 3800M/PCI/SSE2
+NVIDIA Quadro FX 4500
+NVIDIA Quadro FX 4600
+NVIDIA Quadro FX 4800
+NVIDIA Quadro FX 4800/PCI/SSE2
+NVIDIA Quadro FX 540/PCI/SSE2/3DNOW!
+NVIDIA Quadro FX 560
+NVIDIA Quadro FX 560/PCI/SSE2
+NVIDIA Quadro FX 5600
+NVIDIA Quadro FX 570
+NVIDIA Quadro FX 570/PCI/SSE2
+NVIDIA Quadro FX 570M/PCI/SSE2
+NVIDIA Quadro FX 580/PCI/SSE2
+NVIDIA Quadro FX 580/PCI/SSE2
+NVIDIA Quadro FX 770M/PCI/SSE2
+NVIDIA Quadro FX 770M/PCI/SSE2
+NVIDIA Quadro FX 880M
+NVIDIA Quadro FX 880M/PCI/SSE2
+NVIDIA Quadro FX 880M/PCI/SSE2
+NVIDIA Quadro FX Go700/AGP/SSE2
+NVIDIA Quadro NVS
+NVIDIA Quadro NVS 110M/PCI/SSE2
+NVIDIA Quadro NVS 110M/PCI/SSE2
+NVIDIA Quadro NVS 130M/PCI/SSE2
+NVIDIA Quadro NVS 135M/PCI/SSE2
+NVIDIA Quadro NVS 135M/PCI/SSE2
+NVIDIA Quadro NVS 140M/PCI/SSE2
+NVIDIA Quadro NVS 140M/PCI/SSE2
+NVIDIA Quadro NVS 150M/PCI/SSE2
+NVIDIA Quadro NVS 150M/PCI/SSE2
+NVIDIA Quadro NVS 160M/PCI/SSE2
+NVIDIA Quadro NVS 160M/PCI/SSE2
+NVIDIA Quadro NVS 210S/PCI/SSE2/3DNOW!
+NVIDIA Quadro NVS 285/PCI/SSE2
+NVIDIA Quadro NVS 285/PCI/SSE2
+NVIDIA Quadro NVS 290/PCI/SSE2
+NVIDIA Quadro NVS 290/PCI/SSE2
+NVIDIA Quadro NVS 295/PCI/SSE2
+NVIDIA Quadro NVS 320M/PCI/SSE2
+NVIDIA Quadro NVS 320M/PCI/SSE2
+NVIDIA Quadro NVS 55/280 PCI/PCI/SSE2
+NVIDIA Quadro NVS/PCI/SSE2
+NVIDIA Quadro PCI-E Series/PCI/SSE2/3DNOW!
+NVIDIA Quadro VX 200/PCI/SSE2
+NVIDIA Quadro VX 200/PCI/SSE2
+NVIDIA Quadro/AGP/SSE2
+NVIDIA Quadro/AGP/SSE2
+NVIDIA Quadro2
+NVIDIA Quadro4
+NVIDIA Quadro4 750 XGL/AGP/SSE2
+NVIDIA RIVA TNT
+NVIDIA RIVA TNT2/AGP/SSE2
+NVIDIA RIVA TNT2/PCI/3DNOW!
+NVIDIA Tesla C2050/PCI/SSE2
+NVIDIA nForce
+NVIDIA nForce 730a/PCI/SSE2
+NVIDIA nForce 730a/PCI/SSE2/3DNOW!
+NVIDIA nForce 750a SLI/PCI/SSE2
+NVIDIA nForce 750a SLI/PCI/SSE2/3DNOW!
+NVIDIA nForce 760i SLI/PCI/SSE2
+NVIDIA nForce 780a SLI/PCI/SSE2/3DNOW!
+NVIDIA nForce 980a/780a SLI/PCI/SSE2
+NVIDIA nForce 980a/780a SLI/PCI/SSE2/3DNOW!
+NVIDIA unknown board/AGP/SSE2
+NVIDIA unknown board/PCI/SSE2
+NVIDIA unknown board/PCI/SSE2/3DNOW!
+Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5670 OpenGL Engine
+Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5670 OpenGL Engine
+Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5750 OpenGL Engine
+Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5750 OpenGL Engine
+Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5770 OpenGL Engine
+Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5770 OpenGL Engine
+Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6490M OpenGL Engine
+Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6490M OpenGL Engine
+Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6750M OpenGL Engine
+Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6750M OpenGL Engine
+Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6770M OpenGL Engine
+Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6970M OpenGL Engine
+Parallels and Intel Inc. 3D-Analyze v2.3 - http://www.tommti-systems.com
+Parallels and Intel Inc. Parallels using Intel HD Graphics 3000 OpenGL Engine
+Parallels and Intel Inc. Parallels using Intel HD Graphics 3000 OpenGL Engine
+Parallels and NVIDIA Parallels using NVIDIA GeForce 320M OpenGL Engine
+Parallels and NVIDIA Parallels using NVIDIA GeForce 320M OpenGL Engine
+Parallels and NVIDIA Parallels using NVIDIA GeForce 9400 OpenGL Engine
+Parallels and NVIDIA Parallels using NVIDIA GeForce GT 120 OpenGL Engine
+Parallels and NVIDIA Parallels using NVIDIA GeForce GT 120 OpenGL Engine
+Parallels and NVIDIA Parallels using NVIDIA GeForce GT 330M OpenGL Engine
+Parallels and NVIDIA Parallels using NVIDIA GeForce GT 330M OpenGL Engine
+Radeon RV350 on Gallium
+S3
+S3 Fire GL2
+S3 Graphics VIA/S3G UniChrome IGP/MMX/K3D
+S3 Graphics VIA/S3G UniChrome IGP/MMX/SSE
+S3 Graphics VIA/S3G UniChrome Pro IGP/MMX/SSE
+S3 Graphics VIA/S3G UniChrome Pro IGP/MMX/SSE
+S3 Graphics, Incorporated ProSavage/Twister
+S3 Graphics, Incorporated S3 Graphics Chrome9 HC
+S3 Graphics, Incorporated S3 Graphics Chrome9 HC
+S3 Graphics, Incorporated S3 Graphics DeltaChrome
+S3 Graphics, Incorporated S3 Graphics DeltaChrome
+S3 Graphics, Incorporated VIA Chrome9 HC IGP
+S3 Graphics, Incorporated VIA Chrome9 HC IGP
+SiS
+SiS 650/M650 VGA
+SiS 661 VGA
+SiS 661 VGA
+SiS 662 VGA
+SiS 741 VGA
+SiS 760 VGA
+SiS 760 VGA
+SiS 761GX VGA
+SiS 761GX VGA
+SiS Mirage Graphics3
+SiS Mirage Graphics3
+SiS Xabre VGA
+Trident
+Tungsten Graphics
+Tungsten Graphics, Inc Mesa DRI 865G GEM 20091221 2009Q4 x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI 865G GEM 20100330 DEVELOPMENT x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI 915G GEM 20091221 2009Q4 x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI 915G GEM 20100330 DEVELOPMENT x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI 915GM GEM 20090712 2009Q2 RC3 x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI 915GM GEM 20091221 2009Q4 x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI 915GM GEM 20100330 DEVELOPMENT x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI 915GM GEM 20100330 DEVELOPMENT x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI 945G
+Tungsten Graphics, Inc Mesa DRI 945G GEM 20091221 2009Q4 x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI 945G GEM 20100330 DEVELOPMENT
+Tungsten Graphics, Inc Mesa DRI 945G GEM 20100330 DEVELOPMENT x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI 945GM GEM 20090712 2009Q2 RC3 x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI 945GM GEM 20091221 2009Q4 x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI 945GM GEM 20100328 2010Q1 x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI 945GM GEM 20100330 DEVELOPMENT x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI 945GM GEM 20100330 DEVELOPMENT x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI 945GME x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI 945GME 20061017
+Tungsten Graphics, Inc Mesa DRI 945GME GEM 20090712 2009Q2 RC3 x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI 945GME GEM 20091221 2009Q4 x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI 945GME GEM 20100330 DEVELOPMENT x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI 945GME GEM 20100330 DEVELOPMENT x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI 965GM GEM 20090326 2009Q1 RC2 x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI 965GM GEM 20090712 2009Q2 RC3 x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI 965GM GEM 20091221 2009Q4 x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI 965GM GEM 20091221 2009Q4 x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI 965GM GEM 20100330 DEVELOPMENT x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI 965GM GEM 20100330 DEVELOPMENT x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI G33 20061017 x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI G33 GEM 20090712 2009Q2 RC3 x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI G33 GEM 20091221 2009Q4 x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI G33 GEM 20091221 2009Q4 x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI G41 GEM 20091221 2009Q4 x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI G41 GEM 20100330 DEVELOPMENT x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI GMA500 20081116 - 5.0.1.0046 x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI IGD GEM 20091221 2009Q4 x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI IGD GEM 20100330 DEVELOPMENT
+Tungsten Graphics, Inc Mesa DRI IGD GEM 20100330 DEVELOPMENT x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI IGDNG_D GEM 20091221 2009Q4 x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI Ironlake Desktop GEM 20100330 DEVELOPMENT x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI Ironlake Mobile GEM 20100330 DEVELOPMENT x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset
+Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset 20080716 x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20090712 2009Q2 RC3 x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20091221 2009Q4 x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20091221 2009Q4 x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20100328 2010Q1
+Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20100330 DEVELOPMENT
+Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20100330 DEVELOPMENT x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20100330 DEVELOPMENT x86/MMX/SSE2
+Tungsten Graphics, Inc. Mesa DRI R200 (RV250 4C66) 20090101 x86/MMX/SSE2 TCL DRI2
+Tungsten Graphics, Inc. Mesa DRI R200 (RV280 5964) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2
+VIA
+VMware, Inc. Gallium 0.3 on SVGA3D; build: RELEASE;
+VMware, Inc. Gallium 0.3 on SVGA3D; build: RELEASE;
+VMware, Inc. Gallium 0.4 on SVGA3D; build: DEBUG; mutex: MSVC Intrinsics
+VMware, Inc. Gallium 0.4 on SVGA3D; build: RELEASE;
+VMware, Inc. Gallium 0.4 on i915 (chipset: 945GM)
+VMware, Inc. Gallium 0.4 on i915 (chipset: 945GM)
+VMware, Inc. Gallium 0.4 on llvmpipe
+VMware, Inc. Gallium 0.4 on llvmpipe
+VMware, Inc. Gallium 0.4 on softpipe
+VMware, Inc. Gallium 0.4 on softpipe
+X.Org Gallium 0.4 on AMD BARTS
+X.Org Gallium 0.4 on AMD BARTS
+X.Org Gallium 0.4 on AMD CEDAR
+X.Org Gallium 0.4 on AMD CEDAR
+X.Org Gallium 0.4 on AMD HEMLOCK
+X.Org Gallium 0.4 on AMD JUNIPER
+X.Org Gallium 0.4 on AMD JUNIPER
+X.Org Gallium 0.4 on AMD PALM
+X.Org Gallium 0.4 on AMD REDWOOD
+X.Org Gallium 0.4 on AMD REDWOOD
+X.Org Gallium 0.4 on AMD RS780
+X.Org Gallium 0.4 on AMD RS780
+X.Org Gallium 0.4 on AMD RS880
+X.Org Gallium 0.4 on AMD RS880
+X.Org Gallium 0.4 on AMD RV610
+X.Org Gallium 0.4 on AMD RV610
+X.Org Gallium 0.4 on AMD RV620
+X.Org Gallium 0.4 on AMD RV620
+X.Org Gallium 0.4 on AMD RV630
+X.Org Gallium 0.4 on AMD RV630
+X.Org Gallium 0.4 on AMD RV635
+X.Org Gallium 0.4 on AMD RV635
+X.Org Gallium 0.4 on AMD RV710
+X.Org Gallium 0.4 on AMD RV710
+X.Org Gallium 0.4 on AMD RV730
+X.Org Gallium 0.4 on AMD RV730
+X.Org Gallium 0.4 on AMD RV740
+X.Org Gallium 0.4 on AMD RV740
+X.Org Gallium 0.4 on AMD RV770
+X.Org R300 Project Gallium 0.4 on ATI R300
+X.Org R300 Project Gallium 0.4 on ATI R350
+X.Org R300 Project Gallium 0.4 on ATI R420
+X.Org R300 Project Gallium 0.4 on ATI R580
+X.Org R300 Project Gallium 0.4 on ATI R580
+X.Org R300 Project Gallium 0.4 on ATI RC410
+X.Org R300 Project Gallium 0.4 on ATI RC410
+X.Org R300 Project Gallium 0.4 on ATI RS480
+X.Org R300 Project Gallium 0.4 on ATI RS482
+X.Org R300 Project Gallium 0.4 on ATI RS482
+X.Org R300 Project Gallium 0.4 on ATI RS600
+X.Org R300 Project Gallium 0.4 on ATI RS690
+X.Org R300 Project Gallium 0.4 on ATI RS690
+X.Org R300 Project Gallium 0.4 on ATI RS740
+X.Org R300 Project Gallium 0.4 on ATI RV350
+X.Org R300 Project Gallium 0.4 on ATI RV350
+X.Org R300 Project Gallium 0.4 on ATI RV370
+X.Org R300 Project Gallium 0.4 on ATI RV370
+X.Org R300 Project Gallium 0.4 on ATI RV410
+X.Org R300 Project Gallium 0.4 on ATI RV410
+X.Org R300 Project Gallium 0.4 on ATI RV515
+X.Org R300 Project Gallium 0.4 on ATI RV515
+X.Org R300 Project Gallium 0.4 on ATI RV530
+X.Org R300 Project Gallium 0.4 on ATI RV530
+X.Org R300 Project Gallium 0.4 on ATI RV560
+X.Org R300 Project Gallium 0.4 on ATI RV570
+X.Org R300 Project Gallium 0.4 on ATI RV570
+X.Org R300 Project Gallium 0.4 on R420
+X.Org R300 Project Gallium 0.4 on R580
+X.Org R300 Project Gallium 0.4 on RC410
+X.Org R300 Project Gallium 0.4 on RS480
+X.Org R300 Project Gallium 0.4 on RS482
+X.Org R300 Project Gallium 0.4 on RS600
+X.Org R300 Project Gallium 0.4 on RS690
+X.Org R300 Project Gallium 0.4 on RS740
+X.Org R300 Project Gallium 0.4 on RV350
+X.Org R300 Project Gallium 0.4 on RV370
+X.Org R300 Project Gallium 0.4 on RV410
+X.Org R300 Project Gallium 0.4 on RV515
+X.Org R300 Project Gallium 0.4 on RV530
+XGI
+nouveau Gallium 0.4 on NV31
+nouveau Gallium 0.4 on NV34
+nouveau Gallium 0.4 on NV34
+nouveau Gallium 0.4 on NV36
+nouveau Gallium 0.4 on NV43
+nouveau Gallium 0.4 on NV44
+nouveau Gallium 0.4 on NV46
+nouveau Gallium 0.4 on NV46
+nouveau Gallium 0.4 on NV49
+nouveau Gallium 0.4 on NV4A
+nouveau Gallium 0.4 on NV4A
+nouveau Gallium 0.4 on NV4B
+nouveau Gallium 0.4 on NV4B
+nouveau Gallium 0.4 on NV4C
+nouveau Gallium 0.4 on NV4E
+nouveau Gallium 0.4 on NV50
+nouveau Gallium 0.4 on NV63
+nouveau Gallium 0.4 on NV67
+nouveau Gallium 0.4 on NV84
+nouveau Gallium 0.4 on NV84
+nouveau Gallium 0.4 on NV86
+nouveau Gallium 0.4 on NV86
+nouveau Gallium 0.4 on NV92
+nouveau Gallium 0.4 on NV92
+nouveau Gallium 0.4 on NV94
+nouveau Gallium 0.4 on NV94
+nouveau Gallium 0.4 on NV96
+nouveau Gallium 0.4 on NV96
+nouveau Gallium 0.4 on NV98
+nouveau Gallium 0.4 on NV98
+nouveau Gallium 0.4 on NVA0
+nouveau Gallium 0.4 on NVA0
+nouveau Gallium 0.4 on NVA3
+nouveau Gallium 0.4 on NVA5
+nouveau Gallium 0.4 on NVA5
+nouveau Gallium 0.4 on NVA8
+nouveau Gallium 0.4 on NVA8
+nouveau Gallium 0.4 on NVAA
+nouveau Gallium 0.4 on NVAA
+nouveau Gallium 0.4 on NVAC
+nouveau Gallium 0.4 on NVAC
diff --git a/indra/newview/tests/llcapabilitylistener_test.cpp b/indra/newview/tests/llcapabilitylistener_test.cpp
index 9da851ffc4..2ad08dc1f3 100644
--- a/indra/newview/tests/llcapabilitylistener_test.cpp
+++ b/indra/newview/tests/llcapabilitylistener_test.cpp
@@ -72,7 +72,7 @@ struct TestCapabilityProvider: public LLCapabilityProvider
{
mCaps[cap] = url;
}
- LLHost getHost() const { return mHost; }
+ const LLHost& getHost() const { return mHost; }
std::string getDescription() const { return "TestCapabilityProvider"; }
LLHost mHost;
@@ -114,6 +114,7 @@ namespace tut
regionListener("testCapabilityListener", NULL, provider, LLUUID(), LLUUID()),
regionPump(regionListener.getCapAPI())
{
+ LLCurl::initClass();
provider.setCapability("good", server + "capability-test");
provider.setCapability("fail", server + "fail");
}
diff --git a/indra/newview/tests/lldir_stub.cpp b/indra/newview/tests/lldir_stub.cpp
new file mode 100644
index 0000000000..18cf4e7419
--- /dev/null
+++ b/indra/newview/tests/lldir_stub.cpp
@@ -0,0 +1,62 @@
+/**
+ * @file lldir_stub.cpp
+ * @brief stub class to allow unit testing
+ *
+ * $LicenseInfo:firstyear=2009&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+// Use me only if you need to stub out some helper functions, not if you e.g. need sane numbers from countFilesInDir
+
+LLDir::LLDir() {}
+LLDir::~LLDir() {}
+BOOL LLDir::deleteFilesInDir(const std::string &dirname, const std::string &mask) { return true; }
+void LLDir::setChatLogsDir(const std::string &path) {}
+void LLDir::setPerAccountChatLogsDir(const std::string &first, const std::string &last) {}
+void LLDir::setLindenUserDir(const std::string &first, const std::string &last) {}
+void LLDir::setSkinFolder(const std::string &skin_folder) {}
+bool LLDir::setCacheDir(const std::string &path) { return true; }
+void LLDir::dumpCurrentDirectories() {}
+
+class LLDir_stub : public LLDir
+{
+public:
+ LLDir_stub() {}
+ ~LLDir_stub() {}
+
+ /*virtual*/ void initAppDirs(const std::string &app_name) {}
+
+ /*virtual*/ std::string getCurPath() { return "CUR_PATH_FROM_LLDIR"; }
+ /*virtual*/ U32 countFilesInDir(const std::string &dirname, const std::string &mask) { return 42; }
+ /*virtual*/ BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname, BOOL wrap) { fname = fname + "_NEXT"; return false; }
+ /*virtual*/ void getRandomFileInDir(const std::string &dirname, const std::string &mask, std::string &fname) { fname = "RANDOM_FILE"; }
+ /*virtual*/ BOOL fileExists(const std::string &filename) const { return false; }
+};
+
+LLDir_stub gDirUtil;
+
+LLDir* gDirUtilp = &gDirUtil;
+
+std::string LLDir::getExpandedFilename(ELLPath loc, const std::string& subdir, const std::string& filename) const
+{
+ return subdir + " --- " + filename + " --- expanded!";
+}
+
diff --git a/indra/newview/tests/llglslshader_stub.cpp b/indra/newview/tests/llglslshader_stub.cpp
new file mode 100644
index 0000000000..8947a632c8
--- /dev/null
+++ b/indra/newview/tests/llglslshader_stub.cpp
@@ -0,0 +1,39 @@
+/**
+ * @file llglslshader_stub.cpp
+ * @brief stub class to allow unit testing
+ *
+ * $LicenseInfo:firstyear=2009&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llglslshader.h"
+
+void LLGLSLShader::uniform1f(const std::string& uniform, F32 num)
+{
+}
+
+void LLGLSLShader::uniform3fv(const std::string& uniform, U32 count, const GLfloat *v)
+{
+}
+
+void LLGLSLShader::uniform4fv(U32 index, U32 count, const GLfloat* v)
+{
+}
diff --git a/indra/newview/tests/lllogininstance_test.cpp b/indra/newview/tests/lllogininstance_test.cpp
index b902c7ab09..9e321db889 100644
--- a/indra/newview/tests/lllogininstance_test.cpp
+++ b/indra/newview/tests/lllogininstance_test.cpp
@@ -40,6 +40,7 @@
#if defined(LL_WINDOWS)
#pragma warning(disable: 4355) // using 'this' in base-class ctor initializer expr
+#pragma warning(disable: 4702) // disable 'unreachable code' so we can safely use skip().
#endif
// Constants
@@ -68,6 +69,7 @@ static bool gDisconnectCalled = false;
#include "../llviewerwindow.h"
void LLViewerWindow::setShowProgress(BOOL show) {}
+LLProgressView * LLViewerWindow::getProgressView(void) const { return 0; }
LLViewerWindow* gViewerWindow;
@@ -181,10 +183,45 @@ void LLUIColorTable::saveUserSettings(void)const {}
//-----------------------------------------------------------------------------
#include "../llversioninfo.h"
-const std::string &LLVersionInfo::getVersionAndChannel() { return VIEWERLOGIN_VERSION_CHANNEL; }
+const std::string &LLVersionInfo::getChannelAndVersion() { return VIEWERLOGIN_VERSION_CHANNEL; }
const std::string &LLVersionInfo::getChannel() { return VIEWERLOGIN_CHANNEL; }
//-----------------------------------------------------------------------------
+#include "../llappviewer.h"
+void LLAppViewer::forceQuit(void) {}
+LLAppViewer * LLAppViewer::sInstance = 0;
+
+//-----------------------------------------------------------------------------
+#include "llnotificationsutil.h"
+LLNotificationPtr LLNotificationsUtil::add(const std::string& name,
+ const LLSD& substitutions,
+ const LLSD& payload,
+ boost::function<void (const LLSD&, const LLSD&)> functor) { return LLNotificationPtr((LLNotification*)0); }
+
+
+//-----------------------------------------------------------------------------
+#include "llupdaterservice.h"
+
+std::string const & LLUpdaterService::pumpName(void)
+{
+ static std::string wakka = "wakka wakka wakka";
+ return wakka;
+}
+bool LLUpdaterService::updateReadyToInstall(void) { return false; }
+void LLUpdaterService::initialize(const std::string& protocol_version,
+ const std::string& url,
+ const std::string& path,
+ const std::string& channel,
+ const std::string& version) {}
+
+void LLUpdaterService::setCheckPeriod(unsigned int seconds) {}
+void LLUpdaterService::startChecking(bool install_if_ready) {}
+void LLUpdaterService::stopChecking() {}
+bool LLUpdaterService::isChecking() { return false; }
+LLUpdaterService::eUpdaterState LLUpdaterService::getState() { return INITIAL; }
+std::string LLUpdaterService::updatedVersion() { return ""; }
+
+//-----------------------------------------------------------------------------
#include "llnotifications.h"
#include "llfloaterreg.h"
static std::string gTOSType;
@@ -198,6 +235,12 @@ LLFloater* LLFloaterReg::showInstance(const std::string& name, const LLSD& key,
return NULL;
}
+//----------------------------------------------------------------------------
+#include "../llprogressview.h"
+void LLProgressView::setText(std::string const &){}
+void LLProgressView::setPercent(float){}
+void LLProgressView::setMessage(std::string const &){}
+
//-----------------------------------------------------------------------------
// LLNotifications
class MockNotifications : public LLNotificationsInterface
@@ -435,6 +478,8 @@ namespace tut
template<> template<>
void lllogininstance_object::test<3>()
{
+ skip();
+
set_test_name("Test Mandatory Update User Accepts");
// Part 1 - Mandatory Update, with User accepts response.
@@ -462,6 +507,8 @@ namespace tut
template<> template<>
void lllogininstance_object::test<4>()
{
+ skip();
+
set_test_name("Test Mandatory Update User Decline");
// Test connect with update needed.
diff --git a/indra/newview/tests/llpipeline_stub.cpp b/indra/newview/tests/llpipeline_stub.cpp
new file mode 100644
index 0000000000..ad112cbf6a
--- /dev/null
+++ b/indra/newview/tests/llpipeline_stub.cpp
@@ -0,0 +1,32 @@
+/**
+ * @file llpipeline_stub.cpp
+ * @brief stub class to allow unit testing
+ *
+ * $LicenseInfo:firstyear=2009&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+class LLPipeline
+{
+public: BOOL canUseWindLightShaders() const;
+};
+BOOL LLPipeline::canUseWindLightShaders() const {return TRUE;}
+LLPipeline gPipeline;
diff --git a/indra/newview/tests/llremoteparcelrequest_test.cpp b/indra/newview/tests/llremoteparcelrequest_test.cpp
index a6c1f69c82..ed66066b0a 100644
--- a/indra/newview/tests/llremoteparcelrequest_test.cpp
+++ b/indra/newview/tests/llremoteparcelrequest_test.cpp
@@ -1,134 +1,134 @@
-/**
- * @file llremoteparcelrequest_test.cpp
- * @author Brad Kittenbrink <brad@lindenlab.com>
- *
- * $LicenseInfo:firstyear=2010&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#include "linden_common.h"
-
-#include "../test/lltut.h"
-
-#include "../llremoteparcelrequest.h"
-
-#include "../llagent.h"
-#include "message.h"
-
-namespace {
- LLControlGroup s_saved_settings("dummy_settings");
- const LLUUID TEST_PARCEL_ID("11111111-1111-1111-1111-111111111111");
-}
-
-LLCurl::Responder::Responder() { }
-LLCurl::Responder::~Responder() { }
-void LLCurl::Responder::error(U32,std::string const &) { }
-void LLCurl::Responder::result(LLSD const &) { }
-void LLCurl::Responder::errorWithContent(U32 status,std::string const &,LLSD const &) { }
-void LLCurl::Responder::completedRaw(U32 status, std::string const &, LLChannelDescriptors const &,boost::shared_ptr<LLBufferArray> const &) { }
-void LLCurl::Responder::completed(U32 status, std::string const &, LLSD const &) { }
-void LLCurl::Responder::completedHeader(U32 status, std::string const &, LLSD const &) { }
-void LLMessageSystem::getF32(char const *,char const *,F32 &,S32) { }
-void LLMessageSystem::getU8(char const *,char const *,U8 &,S32) { }
-void LLMessageSystem::getS32(char const *,char const *,S32 &,S32) { }
-void LLMessageSystem::getString(char const *,char const *, std::string &,S32) { }
-void LLMessageSystem::getUUID(char const *,char const *, LLUUID & out_id,S32)
-{
- out_id = TEST_PARCEL_ID;
-}
-void LLMessageSystem::nextBlock(char const *) { }
-void LLMessageSystem::addUUID(char const *,LLUUID const &) { }
-void LLMessageSystem::addUUIDFast(char const *,LLUUID const &) { }
-void LLMessageSystem::nextBlockFast(char const *) { }
-void LLMessageSystem::newMessage(char const *) { }
-LLMessageSystem * gMessageSystem;
-char * _PREHASH_AgentID;
-char * _PREHASH_AgentData;
-LLAgent gAgent;
-LLAgent::LLAgent() : mAgentAccess(s_saved_settings) { }
-LLAgent::~LLAgent() { }
-void LLAgent::sendReliableMessage(void) { }
-LLUUID gAgentSessionID;
-LLUUID gAgentID;
-LLUIColor::LLUIColor(void) { }
-LLAgentAccess::LLAgentAccess(LLControlGroup & settings) : mSavedSettings(settings) { }
-LLControlGroup::LLControlGroup(std::string const & name) : LLInstanceTracker<LLControlGroup, std::string>(name) { }
-LLControlGroup::~LLControlGroup(void) { }
-
-namespace tut
-{
- struct TestObserver : public LLRemoteParcelInfoObserver {
- TestObserver() : mProcessed(false) { }
-
- virtual void processParcelInfo(const LLParcelData& parcel_data)
- {
- mProcessed = true;
- }
-
- virtual void setParcelID(const LLUUID& parcel_id) { }
-
- virtual void setErrorStatus(U32 status, const std::string& reason) { }
-
- bool mProcessed;
- };
-
- struct RemoteParcelRequestData
- {
- RemoteParcelRequestData()
- {
- }
- };
-
- typedef test_group<RemoteParcelRequestData> remoteparcelrequest_t;
- typedef remoteparcelrequest_t::object remoteparcelrequest_object_t;
- tut::remoteparcelrequest_t tut_remoteparcelrequest("LLRemoteParcelRequest");
-
- template<> template<>
- void remoteparcelrequest_object_t::test<1>()
- {
- set_test_name("observer pointer");
-
- boost::scoped_ptr<TestObserver> observer(new TestObserver());
-
- LLRemoteParcelInfoProcessor & processor = LLRemoteParcelInfoProcessor::instance();
- processor.addObserver(LLUUID(TEST_PARCEL_ID), observer.get());
-
- processor.processParcelInfoReply(gMessageSystem, NULL);
-
- ensure(observer->mProcessed);
- }
-
- template<> template<>
- void remoteparcelrequest_object_t::test<2>()
- {
- set_test_name("CHOP-220: dangling observer pointer");
-
- LLRemoteParcelInfoObserver * observer = new TestObserver();
-
- LLRemoteParcelInfoProcessor & processor = LLRemoteParcelInfoProcessor::instance();
- processor.addObserver(LLUUID(TEST_PARCEL_ID), observer);
-
- delete observer;
- observer = NULL;
-
- processor.processParcelInfoReply(gMessageSystem, NULL);
- }
-}
+/**
+ * @file llremoteparcelrequest_test.cpp
+ * @author Brad Kittenbrink <brad@lindenlab.com>
+ *
+ * $LicenseInfo:firstyear=2010&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+
+#include "../test/lltut.h"
+
+#include "../llremoteparcelrequest.h"
+
+#include "../llagent.h"
+#include "message.h"
+#include "llurlentry.h"
+
+namespace {
+ const LLUUID TEST_PARCEL_ID("11111111-1111-1111-1111-111111111111");
+}
+
+LLCurl::Responder::Responder() { }
+LLCurl::Responder::~Responder() { }
+void LLCurl::Responder::error(U32,std::string const &) { }
+void LLCurl::Responder::result(LLSD const &) { }
+void LLCurl::Responder::errorWithContent(U32 status,std::string const &,LLSD const &) { }
+void LLCurl::Responder::completedRaw(U32 status, std::string const &, LLChannelDescriptors const &,boost::shared_ptr<LLBufferArray> const &) { }
+void LLCurl::Responder::completed(U32 status, std::string const &, LLSD const &) { }
+void LLCurl::Responder::completedHeader(U32 status, std::string const &, LLSD const &) { }
+void LLMessageSystem::getF32(char const *,char const *,F32 &,S32) { }
+void LLMessageSystem::getU8(char const *,char const *,U8 &,S32) { }
+void LLMessageSystem::getS32(char const *,char const *,S32 &,S32) { }
+void LLMessageSystem::getString(char const *,char const *, std::string &,S32) { }
+void LLMessageSystem::getUUID(char const *,char const *, LLUUID & out_id,S32)
+{
+ out_id = TEST_PARCEL_ID;
+}
+void LLMessageSystem::nextBlock(char const *) { }
+void LLMessageSystem::addUUID(char const *,LLUUID const &) { }
+void LLMessageSystem::addUUIDFast(char const *,LLUUID const &) { }
+void LLMessageSystem::nextBlockFast(char const *) { }
+void LLMessageSystem::newMessage(char const *) { }
+LLMessageSystem * gMessageSystem;
+char const* const _PREHASH_AgentID = 0; // never dereferenced during this test
+char const* const _PREHASH_AgentData = 0; // never dereferenced during this test
+LLAgent gAgent;
+LLAgent::LLAgent() : mAgentAccess(NULL) { }
+LLAgent::~LLAgent() { }
+void LLAgent::sendReliableMessage(void) { }
+LLUUID gAgentSessionID;
+LLUUID gAgentID;
+LLUIColor::LLUIColor(void) { }
+LLControlGroup::LLControlGroup(std::string const & name) : LLInstanceTracker<LLControlGroup, std::string>(name) { }
+LLControlGroup::~LLControlGroup(void) { }
+void LLUrlEntryParcel::processParcelInfo(const LLUrlEntryParcel::LLParcelData& parcel_data) { }
+
+namespace tut
+{
+ struct TestObserver : public LLRemoteParcelInfoObserver {
+ TestObserver() : mProcessed(false) { }
+
+ virtual void processParcelInfo(const LLParcelData& parcel_data)
+ {
+ mProcessed = true;
+ }
+
+ virtual void setParcelID(const LLUUID& parcel_id) { }
+
+ virtual void setErrorStatus(U32 status, const std::string& reason) { }
+
+ bool mProcessed;
+ };
+
+ struct RemoteParcelRequestData
+ {
+ RemoteParcelRequestData()
+ {
+ }
+ };
+
+ typedef test_group<RemoteParcelRequestData> remoteparcelrequest_t;
+ typedef remoteparcelrequest_t::object remoteparcelrequest_object_t;
+ tut::remoteparcelrequest_t tut_remoteparcelrequest("LLRemoteParcelRequest");
+
+ template<> template<>
+ void remoteparcelrequest_object_t::test<1>()
+ {
+ set_test_name("observer pointer");
+
+ boost::scoped_ptr<TestObserver> observer(new TestObserver());
+
+ LLRemoteParcelInfoProcessor & processor = LLRemoteParcelInfoProcessor::instance();
+ processor.addObserver(LLUUID(TEST_PARCEL_ID), observer.get());
+
+ processor.processParcelInfoReply(gMessageSystem, NULL);
+
+ ensure(observer->mProcessed);
+ }
+
+ template<> template<>
+ void remoteparcelrequest_object_t::test<2>()
+ {
+ set_test_name("CHOP-220: dangling observer pointer");
+
+ LLRemoteParcelInfoObserver * observer = new TestObserver();
+
+ LLRemoteParcelInfoProcessor & processor = LLRemoteParcelInfoProcessor::instance();
+ processor.addObserver(LLUUID(TEST_PARCEL_ID), observer);
+
+ delete observer;
+ observer = NULL;
+
+ processor.processParcelInfoReply(gMessageSystem, NULL);
+ }
+}
diff --git a/indra/newview/tests/llsechandler_basic_test.cpp b/indra/newview/tests/llsechandler_basic_test.cpp
index daa10819fc..0235400976 100644
--- a/indra/newview/tests/llsechandler_basic_test.cpp
+++ b/indra/newview/tests/llsechandler_basic_test.cpp
@@ -86,6 +86,9 @@ std::string LLControlGroup::getString(const std::string& name)
return "";
}
+// Stub for --no-verify-ssl-cert
+BOOL LLControlGroup::getBOOL(const std::string& name) { return FALSE; }
+
LLSD LLCredential::getLoginParams()
{
LLSD result = LLSD::emptyMap();
diff --git a/indra/newview/tests/llsimplestat_test.cpp b/indra/newview/tests/llsimplestat_test.cpp
new file mode 100644
index 0000000000..b556941f4a
--- /dev/null
+++ b/indra/newview/tests/llsimplestat_test.cpp
@@ -0,0 +1,580 @@
+/**
+ * @file llsimplestats_test.cpp
+ * @date 2010-10-22
+ * @brief Test cases for some of llsimplestat.h
+ *
+ * $LicenseInfo:firstyear=2010&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+
+#include <tut/tut.hpp>
+
+#include "lltut.h"
+#include "../llsimplestat.h"
+#include "llsd.h"
+#include "llmath.h"
+
+// @brief Used as a pointer cast type to get access to LLSimpleStatCounter
+class TutStatCounter: public LLSimpleStatCounter
+{
+public:
+ TutStatCounter(); // Not defined
+ ~TutStatCounter(); // Not defined
+ void operator=(const TutStatCounter &); // Not defined
+
+ void setRawCount(U32 c) { mCount = c; }
+ U32 getRawCount() const { return mCount; }
+};
+
+
+namespace tut
+{
+ struct stat_counter_index
+ {};
+ typedef test_group<stat_counter_index> stat_counter_index_t;
+ typedef stat_counter_index_t::object stat_counter_index_object_t;
+ tut::stat_counter_index_t tut_stat_counter_index("stat_counter_test");
+
+ // Testing LLSimpleStatCounter's external interface
+ template<> template<>
+ void stat_counter_index_object_t::test<1>()
+ {
+ LLSimpleStatCounter c1;
+ ensure("Initialized counter is zero", (0 == c1.getCount()));
+
+ ensure("Counter increment return is 1", (1 == ++c1));
+ ensure("Counter increment return is 2", (2 == ++c1));
+
+ ensure("Current counter is 2", (2 == c1.getCount()));
+
+ c1.reset();
+ ensure("Counter is 0 after reset", (0 == c1.getCount()));
+
+ ensure("Counter increment return is 1", (1 == ++c1));
+ }
+
+ // Testing LLSimpleStatCounter's internal state
+ template<> template<>
+ void stat_counter_index_object_t::test<2>()
+ {
+ LLSimpleStatCounter c1;
+ TutStatCounter * tc1 = (TutStatCounter *) &c1;
+
+ ensure("Initialized private counter is zero", (0 == tc1->getRawCount()));
+
+ ++c1;
+ ++c1;
+
+ ensure("Current private counter is 2", (2 == tc1->getRawCount()));
+
+ c1.reset();
+ ensure("Raw counter is 0 after reset", (0 == tc1->getRawCount()));
+ }
+
+ // Testing LLSimpleStatCounter's wrapping behavior
+ template<> template<>
+ void stat_counter_index_object_t::test<3>()
+ {
+ LLSimpleStatCounter c1;
+ TutStatCounter * tc1 = (TutStatCounter *) &c1;
+
+ tc1->setRawCount(U32_MAX);
+ ensure("Initialized private counter is zero", (U32_MAX == c1.getCount()));
+
+ ensure("Increment of max value wraps to 0", (0 == ++c1));
+ }
+
+ // Testing LLSimpleStatMMM's external behavior
+ template<> template<>
+ void stat_counter_index_object_t::test<4>()
+ {
+ LLSimpleStatMMM<> m1;
+ typedef LLSimpleStatMMM<>::Value lcl_float;
+ lcl_float zero(0);
+
+ // Freshly-constructed
+ ensure("Constructed MMM<> has 0 count", (0 == m1.getCount()));
+ ensure("Constructed MMM<> has 0 min", (zero == m1.getMin()));
+ ensure("Constructed MMM<> has 0 max", (zero == m1.getMax()));
+ ensure("Constructed MMM<> has 0 mean no div-by-zero", (zero == m1.getMean()));
+
+ // Single insert
+ m1.record(1.0);
+ ensure("Single insert MMM<> has 1 count", (1 == m1.getCount()));
+ ensure("Single insert MMM<> has 1.0 min", (1.0 == m1.getMin()));
+ ensure("Single insert MMM<> has 1.0 max", (1.0 == m1.getMax()));
+ ensure("Single insert MMM<> has 1.0 mean", (1.0 == m1.getMean()));
+
+ // Second insert
+ m1.record(3.0);
+ ensure("2nd insert MMM<> has 2 count", (2 == m1.getCount()));
+ ensure("2nd insert MMM<> has 1.0 min", (1.0 == m1.getMin()));
+ ensure("2nd insert MMM<> has 3.0 max", (3.0 == m1.getMax()));
+ ensure_approximately_equals("2nd insert MMM<> has 2.0 mean", m1.getMean(), lcl_float(2.0), 1);
+
+ // Third insert
+ m1.record(5.0);
+ ensure("3rd insert MMM<> has 3 count", (3 == m1.getCount()));
+ ensure("3rd insert MMM<> has 1.0 min", (1.0 == m1.getMin()));
+ ensure("3rd insert MMM<> has 5.0 max", (5.0 == m1.getMax()));
+ ensure_approximately_equals("3rd insert MMM<> has 3.0 mean", m1.getMean(), lcl_float(3.0), 1);
+
+ // Fourth insert
+ m1.record(1000000.0);
+ ensure("4th insert MMM<> has 4 count", (4 == m1.getCount()));
+ ensure("4th insert MMM<> has 1.0 min", (1.0 == m1.getMin()));
+ ensure("4th insert MMM<> has 100000.0 max", (1000000.0 == m1.getMax()));
+ ensure_approximately_equals("4th insert MMM<> has 250002.0 mean", m1.getMean(), lcl_float(250002.0), 1);
+
+ // Reset
+ m1.reset();
+ ensure("Reset MMM<> has 0 count", (0 == m1.getCount()));
+ ensure("Reset MMM<> has 0 min", (zero == m1.getMin()));
+ ensure("Reset MMM<> has 0 max", (zero == m1.getMax()));
+ ensure("Reset MMM<> has 0 mean no div-by-zero", (zero == m1.getMean()));
+ }
+
+ // Testing LLSimpleStatMMM's response to large values
+ template<> template<>
+ void stat_counter_index_object_t::test<5>()
+ {
+ LLSimpleStatMMM<> m1;
+ typedef LLSimpleStatMMM<>::Value lcl_float;
+ lcl_float zero(0);
+
+ // Insert overflowing values
+ const lcl_float bignum(F32_MAX / 2);
+
+ m1.record(bignum);
+ m1.record(bignum);
+ m1.record(bignum);
+ m1.record(bignum);
+ m1.record(bignum);
+ m1.record(bignum);
+ m1.record(bignum);
+ m1.record(zero);
+
+ ensure("Overflowed MMM<> has 8 count", (8 == m1.getCount()));
+ ensure("Overflowed MMM<> has 0 min", (zero == m1.getMin()));
+ ensure("Overflowed MMM<> has huge max", (bignum == m1.getMax()));
+ ensure("Overflowed MMM<> has fetchable mean", (1.0 == m1.getMean() || true));
+ // We should be infinte but not interested in proving the IEEE standard here.
+ LLSD sd1(m1.getMean());
+ // std::cout << "Thingy: " << m1.getMean() << " and as LLSD: " << sd1 << std::endl;
+ ensure("Overflowed MMM<> produces LLSDable Real", (sd1.isReal()));
+ }
+
+ // Testing LLSimpleStatMMM<F32>'s external behavior
+ template<> template<>
+ void stat_counter_index_object_t::test<6>()
+ {
+ LLSimpleStatMMM<F32> m1;
+ typedef LLSimpleStatMMM<F32>::Value lcl_float;
+ lcl_float zero(0);
+
+ // Freshly-constructed
+ ensure("Constructed MMM<F32> has 0 count", (0 == m1.getCount()));
+ ensure("Constructed MMM<F32> has 0 min", (zero == m1.getMin()));
+ ensure("Constructed MMM<F32> has 0 max", (zero == m1.getMax()));
+ ensure("Constructed MMM<F32> has 0 mean no div-by-zero", (zero == m1.getMean()));
+
+ // Single insert
+ m1.record(1.0);
+ ensure("Single insert MMM<F32> has 1 count", (1 == m1.getCount()));
+ ensure("Single insert MMM<F32> has 1.0 min", (1.0 == m1.getMin()));
+ ensure("Single insert MMM<F32> has 1.0 max", (1.0 == m1.getMax()));
+ ensure("Single insert MMM<F32> has 1.0 mean", (1.0 == m1.getMean()));
+
+ // Second insert
+ m1.record(3.0);
+ ensure("2nd insert MMM<F32> has 2 count", (2 == m1.getCount()));
+ ensure("2nd insert MMM<F32> has 1.0 min", (1.0 == m1.getMin()));
+ ensure("2nd insert MMM<F32> has 3.0 max", (3.0 == m1.getMax()));
+ ensure_approximately_equals("2nd insert MMM<F32> has 2.0 mean", m1.getMean(), lcl_float(2.0), 1);
+
+ // Third insert
+ m1.record(5.0);
+ ensure("3rd insert MMM<F32> has 3 count", (3 == m1.getCount()));
+ ensure("3rd insert MMM<F32> has 1.0 min", (1.0 == m1.getMin()));
+ ensure("3rd insert MMM<F32> has 5.0 max", (5.0 == m1.getMax()));
+ ensure_approximately_equals("3rd insert MMM<F32> has 3.0 mean", m1.getMean(), lcl_float(3.0), 1);
+
+ // Fourth insert
+ m1.record(1000000.0);
+ ensure("4th insert MMM<F32> has 4 count", (4 == m1.getCount()));
+ ensure("4th insert MMM<F32> has 1.0 min", (1.0 == m1.getMin()));
+ ensure("4th insert MMM<F32> has 1000000.0 max", (1000000.0 == m1.getMax()));
+ ensure_approximately_equals("4th insert MMM<F32> has 250002.0 mean", m1.getMean(), lcl_float(250002.0), 1);
+
+ // Reset
+ m1.reset();
+ ensure("Reset MMM<F32> has 0 count", (0 == m1.getCount()));
+ ensure("Reset MMM<F32> has 0 min", (zero == m1.getMin()));
+ ensure("Reset MMM<F32> has 0 max", (zero == m1.getMax()));
+ ensure("Reset MMM<F32> has 0 mean no div-by-zero", (zero == m1.getMean()));
+ }
+
+ // Testing LLSimpleStatMMM's response to large values
+ template<> template<>
+ void stat_counter_index_object_t::test<7>()
+ {
+ LLSimpleStatMMM<F32> m1;
+ typedef LLSimpleStatMMM<F32>::Value lcl_float;
+ lcl_float zero(0);
+
+ // Insert overflowing values
+ const lcl_float bignum(F32_MAX / 2);
+
+ m1.record(bignum);
+ m1.record(bignum);
+ m1.record(bignum);
+ m1.record(bignum);
+ m1.record(bignum);
+ m1.record(bignum);
+ m1.record(bignum);
+ m1.record(zero);
+
+ ensure("Overflowed MMM<F32> has 8 count", (8 == m1.getCount()));
+ ensure("Overflowed MMM<F32> has 0 min", (zero == m1.getMin()));
+ ensure("Overflowed MMM<F32> has huge max", (bignum == m1.getMax()));
+ ensure("Overflowed MMM<F32> has fetchable mean", (1.0 == m1.getMean() || true));
+ // We should be infinte but not interested in proving the IEEE standard here.
+ LLSD sd1(m1.getMean());
+ // std::cout << "Thingy: " << m1.getMean() << " and as LLSD: " << sd1 << std::endl;
+ ensure("Overflowed MMM<F32> produces LLSDable Real", (sd1.isReal()));
+ }
+
+ // Testing LLSimpleStatMMM<F64>'s external behavior
+ template<> template<>
+ void stat_counter_index_object_t::test<8>()
+ {
+ LLSimpleStatMMM<F64> m1;
+ typedef LLSimpleStatMMM<F64>::Value lcl_float;
+ lcl_float zero(0);
+
+ // Freshly-constructed
+ ensure("Constructed MMM<F64> has 0 count", (0 == m1.getCount()));
+ ensure("Constructed MMM<F64> has 0 min", (zero == m1.getMin()));
+ ensure("Constructed MMM<F64> has 0 max", (zero == m1.getMax()));
+ ensure("Constructed MMM<F64> has 0 mean no div-by-zero", (zero == m1.getMean()));
+
+ // Single insert
+ m1.record(1.0);
+ ensure("Single insert MMM<F64> has 1 count", (1 == m1.getCount()));
+ ensure("Single insert MMM<F64> has 1.0 min", (1.0 == m1.getMin()));
+ ensure("Single insert MMM<F64> has 1.0 max", (1.0 == m1.getMax()));
+ ensure("Single insert MMM<F64> has 1.0 mean", (1.0 == m1.getMean()));
+
+ // Second insert
+ m1.record(3.0);
+ ensure("2nd insert MMM<F64> has 2 count", (2 == m1.getCount()));
+ ensure("2nd insert MMM<F64> has 1.0 min", (1.0 == m1.getMin()));
+ ensure("2nd insert MMM<F64> has 3.0 max", (3.0 == m1.getMax()));
+ ensure_approximately_equals("2nd insert MMM<F64> has 2.0 mean", m1.getMean(), lcl_float(2.0), 1);
+
+ // Third insert
+ m1.record(5.0);
+ ensure("3rd insert MMM<F64> has 3 count", (3 == m1.getCount()));
+ ensure("3rd insert MMM<F64> has 1.0 min", (1.0 == m1.getMin()));
+ ensure("3rd insert MMM<F64> has 5.0 max", (5.0 == m1.getMax()));
+ ensure_approximately_equals("3rd insert MMM<F64> has 3.0 mean", m1.getMean(), lcl_float(3.0), 1);
+
+ // Fourth insert
+ m1.record(1000000.0);
+ ensure("4th insert MMM<F64> has 4 count", (4 == m1.getCount()));
+ ensure("4th insert MMM<F64> has 1.0 min", (1.0 == m1.getMin()));
+ ensure("4th insert MMM<F64> has 1000000.0 max", (1000000.0 == m1.getMax()));
+ ensure_approximately_equals("4th insert MMM<F64> has 250002.0 mean", m1.getMean(), lcl_float(250002.0), 1);
+
+ // Reset
+ m1.reset();
+ ensure("Reset MMM<F64> has 0 count", (0 == m1.getCount()));
+ ensure("Reset MMM<F64> has 0 min", (zero == m1.getMin()));
+ ensure("Reset MMM<F64> has 0 max", (zero == m1.getMax()));
+ ensure("Reset MMM<F64> has 0 mean no div-by-zero", (zero == m1.getMean()));
+ }
+
+ // Testing LLSimpleStatMMM's response to large values
+ template<> template<>
+ void stat_counter_index_object_t::test<9>()
+ {
+ LLSimpleStatMMM<F64> m1;
+ typedef LLSimpleStatMMM<F64>::Value lcl_float;
+ lcl_float zero(0);
+
+ // Insert overflowing values
+ const lcl_float bignum(F64_MAX / 2);
+
+ m1.record(bignum);
+ m1.record(bignum);
+ m1.record(bignum);
+ m1.record(bignum);
+ m1.record(bignum);
+ m1.record(bignum);
+ m1.record(bignum);
+ m1.record(zero);
+
+ ensure("Overflowed MMM<F64> has 8 count", (8 == m1.getCount()));
+ ensure("Overflowed MMM<F64> has 0 min", (zero == m1.getMin()));
+ ensure("Overflowed MMM<F64> has huge max", (bignum == m1.getMax()));
+ ensure("Overflowed MMM<F64> has fetchable mean", (1.0 == m1.getMean() || true));
+ // We should be infinte but not interested in proving the IEEE standard here.
+ LLSD sd1(m1.getMean());
+ // std::cout << "Thingy: " << m1.getMean() << " and as LLSD: " << sd1 << std::endl;
+ ensure("Overflowed MMM<F64> produces LLSDable Real", (sd1.isReal()));
+ }
+
+ // Testing LLSimpleStatMMM<U64>'s external behavior
+ template<> template<>
+ void stat_counter_index_object_t::test<10>()
+ {
+ LLSimpleStatMMM<U64> m1;
+ typedef LLSimpleStatMMM<U64>::Value lcl_int;
+ lcl_int zero(0);
+
+ // Freshly-constructed
+ ensure("Constructed MMM<U64> has 0 count", (0 == m1.getCount()));
+ ensure("Constructed MMM<U64> has 0 min", (zero == m1.getMin()));
+ ensure("Constructed MMM<U64> has 0 max", (zero == m1.getMax()));
+ ensure("Constructed MMM<U64> has 0 mean no div-by-zero", (zero == m1.getMean()));
+
+ // Single insert
+ m1.record(1);
+ ensure("Single insert MMM<U64> has 1 count", (1 == m1.getCount()));
+ ensure("Single insert MMM<U64> has 1 min", (1 == m1.getMin()));
+ ensure("Single insert MMM<U64> has 1 max", (1 == m1.getMax()));
+ ensure("Single insert MMM<U64> has 1 mean", (1 == m1.getMean()));
+
+ // Second insert
+ m1.record(3);
+ ensure("2nd insert MMM<U64> has 2 count", (2 == m1.getCount()));
+ ensure("2nd insert MMM<U64> has 1 min", (1 == m1.getMin()));
+ ensure("2nd insert MMM<U64> has 3 max", (3 == m1.getMax()));
+ ensure("2nd insert MMM<U64> has 2 mean", (2 == m1.getMean()));
+
+ // Third insert
+ m1.record(5);
+ ensure("3rd insert MMM<U64> has 3 count", (3 == m1.getCount()));
+ ensure("3rd insert MMM<U64> has 1 min", (1 == m1.getMin()));
+ ensure("3rd insert MMM<U64> has 5 max", (5 == m1.getMax()));
+ ensure("3rd insert MMM<U64> has 3 mean", (3 == m1.getMean()));
+
+ // Fourth insert
+ m1.record(U64L(1000000000000));
+ ensure("4th insert MMM<U64> has 4 count", (4 == m1.getCount()));
+ ensure("4th insert MMM<U64> has 1 min", (1 == m1.getMin()));
+ ensure("4th insert MMM<U64> has 1000000000000ULL max", (U64L(1000000000000) == m1.getMax()));
+ ensure("4th insert MMM<U64> has 250000000002ULL mean", (U64L( 250000000002) == m1.getMean()));
+
+ // Reset
+ m1.reset();
+ ensure("Reset MMM<U64> has 0 count", (0 == m1.getCount()));
+ ensure("Reset MMM<U64> has 0 min", (zero == m1.getMin()));
+ ensure("Reset MMM<U64> has 0 max", (zero == m1.getMax()));
+ ensure("Reset MMM<U64> has 0 mean no div-by-zero", (zero == m1.getMean()));
+ }
+
+ // Testing LLSimpleStatMMM's response to large values
+ template<> template<>
+ void stat_counter_index_object_t::test<11>()
+ {
+ LLSimpleStatMMM<U64> m1;
+ typedef LLSimpleStatMMM<U64>::Value lcl_int;
+ lcl_int zero(0);
+
+ // Insert overflowing values
+ const lcl_int bignum(U64L(0xffffffffffffffff) / 2);
+
+ m1.record(bignum);
+ m1.record(bignum);
+ m1.record(bignum);
+ m1.record(bignum);
+ m1.record(bignum);
+ m1.record(bignum);
+ m1.record(bignum);
+ m1.record(zero);
+
+ ensure("Overflowed MMM<U64> has 8 count", (8 == m1.getCount()));
+ ensure("Overflowed MMM<U64> has 0 min", (zero == m1.getMin()));
+ ensure("Overflowed MMM<U64> has huge max", (bignum == m1.getMax()));
+ ensure("Overflowed MMM<U64> has fetchable mean", (zero == m1.getMean() || true));
+ }
+
+ // Testing LLSimpleStatCounter's merge() method
+ template<> template<>
+ void stat_counter_index_object_t::test<12>()
+ {
+ LLSimpleStatCounter c1;
+ LLSimpleStatCounter c2;
+
+ ++c1;
+ ++c1;
+ ++c1;
+ ++c1;
+
+ ++c2;
+ ++c2;
+ c2.merge(c1);
+
+ ensure_equals("4 merged into 2 results in 6", 6, c2.getCount());
+
+ ensure_equals("Source of merge is undamaged", 4, c1.getCount());
+ }
+
+ // Testing LLSimpleStatMMM's merge() method
+ template<> template<>
+ void stat_counter_index_object_t::test<13>()
+ {
+ LLSimpleStatMMM<> m1;
+ LLSimpleStatMMM<> m2;
+
+ m1.record(3.5);
+ m1.record(4.5);
+ m1.record(5.5);
+ m1.record(6.5);
+
+ m2.record(5.0);
+ m2.record(7.0);
+ m2.record(9.0);
+
+ m2.merge(m1);
+
+ ensure_equals("Count after merge (p1)", 7, m2.getCount());
+ ensure_approximately_equals("Min after merge (p1)", F32(3.5), m2.getMin(), 22);
+ ensure_approximately_equals("Max after merge (p1)", F32(9.0), m2.getMax(), 22);
+ ensure_approximately_equals("Mean after merge (p1)", F32(41.000/7.000), m2.getMean(), 22);
+
+
+ ensure_equals("Source count of merge is undamaged (p1)", 4, m1.getCount());
+ ensure_approximately_equals("Source min of merge is undamaged (p1)", F32(3.5), m1.getMin(), 22);
+ ensure_approximately_equals("Source max of merge is undamaged (p1)", F32(6.5), m1.getMax(), 22);
+ ensure_approximately_equals("Source mean of merge is undamaged (p1)", F32(5.0), m1.getMean(), 22);
+
+ m2.reset();
+
+ m2.record(-22.0);
+ m2.record(-1.0);
+ m2.record(30.0);
+
+ m2.merge(m1);
+
+ ensure_equals("Count after merge (p2)", 7, m2.getCount());
+ ensure_approximately_equals("Min after merge (p2)", F32(-22.0), m2.getMin(), 22);
+ ensure_approximately_equals("Max after merge (p2)", F32(30.0), m2.getMax(), 22);
+ ensure_approximately_equals("Mean after merge (p2)", F32(27.000/7.000), m2.getMean(), 22);
+
+ }
+
+ // Testing LLSimpleStatMMM's merge() method when src contributes nothing
+ template<> template<>
+ void stat_counter_index_object_t::test<14>()
+ {
+ LLSimpleStatMMM<> m1;
+ LLSimpleStatMMM<> m2;
+
+ m2.record(5.0);
+ m2.record(7.0);
+ m2.record(9.0);
+
+ m2.merge(m1);
+
+ ensure_equals("Count after merge (p1)", 3, m2.getCount());
+ ensure_approximately_equals("Min after merge (p1)", F32(5.0), m2.getMin(), 22);
+ ensure_approximately_equals("Max after merge (p1)", F32(9.0), m2.getMax(), 22);
+ ensure_approximately_equals("Mean after merge (p1)", F32(7.000), m2.getMean(), 22);
+
+ ensure_equals("Source count of merge is undamaged (p1)", 0, m1.getCount());
+ ensure_approximately_equals("Source min of merge is undamaged (p1)", F32(0), m1.getMin(), 22);
+ ensure_approximately_equals("Source max of merge is undamaged (p1)", F32(0), m1.getMax(), 22);
+ ensure_approximately_equals("Source mean of merge is undamaged (p1)", F32(0), m1.getMean(), 22);
+
+ m2.reset();
+
+ m2.record(-22.0);
+ m2.record(-1.0);
+
+ m2.merge(m1);
+
+ ensure_equals("Count after merge (p2)", 2, m2.getCount());
+ ensure_approximately_equals("Min after merge (p2)", F32(-22.0), m2.getMin(), 22);
+ ensure_approximately_equals("Max after merge (p2)", F32(-1.0), m2.getMax(), 22);
+ ensure_approximately_equals("Mean after merge (p2)", F32(-11.5), m2.getMean(), 22);
+ }
+
+ // Testing LLSimpleStatMMM's merge() method when dst contributes nothing
+ template<> template<>
+ void stat_counter_index_object_t::test<15>()
+ {
+ LLSimpleStatMMM<> m1;
+ LLSimpleStatMMM<> m2;
+
+ m1.record(5.0);
+ m1.record(7.0);
+ m1.record(9.0);
+
+ m2.merge(m1);
+
+ ensure_equals("Count after merge (p1)", 3, m2.getCount());
+ ensure_approximately_equals("Min after merge (p1)", F32(5.0), m2.getMin(), 22);
+ ensure_approximately_equals("Max after merge (p1)", F32(9.0), m2.getMax(), 22);
+ ensure_approximately_equals("Mean after merge (p1)", F32(7.000), m2.getMean(), 22);
+
+ ensure_equals("Source count of merge is undamaged (p1)", 3, m1.getCount());
+ ensure_approximately_equals("Source min of merge is undamaged (p1)", F32(5.0), m1.getMin(), 22);
+ ensure_approximately_equals("Source max of merge is undamaged (p1)", F32(9.0), m1.getMax(), 22);
+ ensure_approximately_equals("Source mean of merge is undamaged (p1)", F32(7.0), m1.getMean(), 22);
+
+ m1.reset();
+ m2.reset();
+
+ m1.record(-22.0);
+ m1.record(-1.0);
+
+ m2.merge(m1);
+
+ ensure_equals("Count after merge (p2)", 2, m2.getCount());
+ ensure_approximately_equals("Min after merge (p2)", F32(-22.0), m2.getMin(), 22);
+ ensure_approximately_equals("Max after merge (p2)", F32(-1.0), m2.getMax(), 22);
+ ensure_approximately_equals("Mean after merge (p2)", F32(-11.5), m2.getMean(), 22);
+ }
+
+ // Testing LLSimpleStatMMM's merge() method when neither dst nor src contributes
+ template<> template<>
+ void stat_counter_index_object_t::test<16>()
+ {
+ LLSimpleStatMMM<> m1;
+ LLSimpleStatMMM<> m2;
+
+ m2.merge(m1);
+
+ ensure_equals("Count after merge (p1)", 0, m2.getCount());
+ ensure_approximately_equals("Min after merge (p1)", F32(0), m2.getMin(), 22);
+ ensure_approximately_equals("Max after merge (p1)", F32(0), m2.getMax(), 22);
+ ensure_approximately_equals("Mean after merge (p1)", F32(0), m2.getMean(), 22);
+
+ ensure_equals("Source count of merge is undamaged (p1)", 0, m1.getCount());
+ ensure_approximately_equals("Source min of merge is undamaged (p1)", F32(0), m1.getMin(), 22);
+ ensure_approximately_equals("Source max of merge is undamaged (p1)", F32(0), m1.getMax(), 22);
+ ensure_approximately_equals("Source mean of merge is undamaged (p1)", F32(0), m1.getMean(), 22);
+ }
+}
diff --git a/indra/newview/tests/llsky_stub.cpp b/indra/newview/tests/llsky_stub.cpp
new file mode 100644
index 0000000000..241d740635
--- /dev/null
+++ b/indra/newview/tests/llsky_stub.cpp
@@ -0,0 +1,37 @@
+/**
+ * @file llsky_stub.cpp
+ * @brief stub class to allow unit testing
+ *
+ * $LicenseInfo:firstyear=2009&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+class LLSky
+{
+public:
+ void setOverrideSun(BOOL override);
+ void setSunDirection(const LLVector3 &sun_direction, const LLVector3 &sun_ang_velocity);
+};
+
+void LLSky::setOverrideSun(BOOL override) {}
+void LLSky::setSunDirection(const LLVector3 &sun_direction, const LLVector3 &sun_ang_velocity) {}
+
+LLSky gSky;
diff --git a/indra/newview/tests/lltranslate_test.cpp b/indra/newview/tests/lltranslate_test.cpp
new file mode 100644
index 0000000000..10e37fae97
--- /dev/null
+++ b/indra/newview/tests/lltranslate_test.cpp
@@ -0,0 +1,345 @@
+/**
+ * @file lltranslate_test.cpp
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+
+#include "../test/lltut.h"
+#include "../lltranslate.h"
+#include "../llversioninfo.h"
+#include "../llviewercontrol.h"
+
+#include "llbufferstream.h"
+#include "lltrans.h"
+#include "llui.h"
+
+static const std::string GOOGLE_VALID_RESPONSE1 =
+"{\
+ \"data\": {\
+ \"translations\": [\
+ {\
+ \"translatedText\": \"привет\",\
+ \"detectedSourceLanguage\": \"es\"\
+ }\
+ ]\
+ }\
+}";
+
+static const std::string GOOGLE_VALID_RESPONSE2 =
+"{\
+ \"data\": {\
+ \"translations\": [\
+ {\
+ \"translatedText\": \"привет\"\
+ }\
+ ]\
+ }\
+}\
+";
+
+static const std::string GOOGLE_VALID_RESPONSE3 =
+"{\
+ \"error\": {\
+ \"errors\": [\
+ {\
+ \"domain\": \"global\",\
+ \"reason\": \"invalid\",\
+ \"message\": \"Invalid Value\"\
+ }\
+ ],\
+ \"code\": 400,\
+ \"message\": \"Invalid Value\"\
+ }\
+}";
+
+static const std::string BING_VALID_RESPONSE1 =
+"<string xmlns=\"http://schemas.microsoft.com/2003/10/Serialization/\">Привет</string>";
+
+static const std::string BING_VALID_RESPONSE2 =
+"<html><body><h1>Argument Exception</h1><p>Method: Translate()</p><p>Parameter: </p>\
+<p>Message: 'from' must be a valid language</p><code></code>\
+<p>message id=3743.V2_Rest.Translate.58E8454F</p></body></html>";
+
+static const std::string BING_VALID_RESPONSE3 =
+"<html><body><h1>Argument Exception</h1><p>Method: Translate()</p>\
+<p>Parameter: appId</p><p>Message: Invalid appId&#xD;\nParameter name: appId</p>\
+<code></code><p>message id=3737.V2_Rest.Translate.56016759</p></body></html>";
+
+namespace tut
+{
+ class translate_test
+ {
+ protected:
+ void test_translation(
+ LLTranslationAPIHandler& handler,
+ int status, const std::string& resp,
+ const std::string& exp_trans, const std::string& exp_lang, const std::string& exp_err)
+ {
+ std::string translation, detected_lang, err_msg;
+ bool rc = handler.parseResponse(status, resp, translation, detected_lang, err_msg);
+ ensure_equals("rc", rc, (status == 200));
+ ensure_equals("err_msg", err_msg, exp_err);
+ ensure_equals("translation", translation, exp_trans);
+ ensure_equals("detected_lang", detected_lang, exp_lang);
+ }
+
+ LLGoogleTranslationHandler mGoogle;
+ LLBingTranslationHandler mBing;
+ };
+
+ typedef test_group<translate_test> translate_test_group_t;
+ typedef translate_test_group_t::object translate_test_object_t;
+ tut::translate_test_group_t tut_translate("LLTranslate");
+
+ template<> template<>
+ void translate_test_object_t::test<1>()
+ {
+ test_translation(mGoogle, 200, GOOGLE_VALID_RESPONSE1, "привет", "es", "");
+ }
+
+ template<> template<>
+ void translate_test_object_t::test<2>()
+ {
+ test_translation(mGoogle, 200, GOOGLE_VALID_RESPONSE2, "привет", "", "");
+ }
+
+ template<> template<>
+ void translate_test_object_t::test<3>()
+ {
+ test_translation(mGoogle, 400, GOOGLE_VALID_RESPONSE3, "", "", "Invalid Value");
+ }
+
+ template<> template<>
+ void translate_test_object_t::test<4>()
+ {
+ test_translation(mGoogle, 400,
+ "",
+ "", "", "* Line 1, Column 1\n Syntax error: value, object or array expected.\n");
+ }
+
+ template<> template<>
+ void translate_test_object_t::test<5>()
+ {
+ test_translation(mGoogle, 400,
+ "[]",
+ "", "", "");
+ }
+
+ template<> template<>
+ void translate_test_object_t::test<6>()
+ {
+ test_translation(mGoogle, 400,
+ "{\"oops\": \"invalid\"}",
+ "", "", "");
+ }
+
+ template<> template<>
+ void translate_test_object_t::test<7>()
+ {
+ test_translation(mGoogle, 400,
+ "{\"data\": {}}",
+ "", "", "");
+ }
+
+ template<> template<>
+ void translate_test_object_t::test<8>()
+ {
+ test_translation(mGoogle, 400,
+ "{\"data\": { \"translations\": [ {} ] }}",
+ "", "", "");
+ }
+
+ template<> template<>
+ void translate_test_object_t::test<9>()
+ {
+ test_translation(mGoogle, 400,
+ "{\"data\": { \"translations\": [ { \"translatedTextZZZ\": \"привет\", \"detectedSourceLanguageZZZ\": \"es\" } ] }}",
+ "", "", "");
+ }
+
+ template<> template<>
+ void translate_test_object_t::test<10>()
+ {
+ test_translation(mBing, 200, BING_VALID_RESPONSE1, "Привет", "", "");
+ }
+
+ template<> template<>
+ void translate_test_object_t::test<11>()
+ {
+ test_translation(mBing, 400, BING_VALID_RESPONSE2, "", "", "'from' must be a valid language");
+ }
+
+ template<> template<>
+ void translate_test_object_t::test<12>()
+ {
+ test_translation(mBing, 400, BING_VALID_RESPONSE3, "", "", "Invalid appId\nParameter name: appId");
+ }
+
+ template<> template<>
+ void translate_test_object_t::test<13>()
+ {
+ test_translation(mBing, 200,
+ "Привет</string>",
+ "Привет", "", "");
+ }
+
+ template<> template<>
+ void translate_test_object_t::test<14>()
+ {
+ test_translation(mBing, 200,
+ "<string xmlns=\"http://schemas.microsoft.com/2003/10/Serialization/\">Привет",
+ "Привет", "", "");
+ }
+
+ template<> template<>
+ void translate_test_object_t::test<15>()
+ {
+ test_translation(mBing, 200,
+ "Привет",
+ "Привет", "", "");
+ }
+
+ template<> template<>
+ void translate_test_object_t::test<16>()
+ {
+ test_translation(mBing, 400,
+ "Message: some error</p>",
+ "", "", "some error");
+ }
+
+ template<> template<>
+ void translate_test_object_t::test<17>()
+ {
+ test_translation(mBing, 400,
+ "Message: some error",
+ "", "", "some error");
+ }
+
+ template<> template<>
+ void translate_test_object_t::test<18>()
+ {
+ test_translation(mBing, 400,
+ "some error</p>",
+ "", "", "some error");
+ }
+
+ template<> template<>
+ void translate_test_object_t::test<19>()
+ {
+ test_translation(mBing, 400,
+ "some error",
+ "", "", "some error");
+ }
+
+ template<> template<>
+ void translate_test_object_t::test<20>()
+ {
+ std::string url;
+ mBing.getTranslateURL(url, "en", "es", "hi");
+ ensure_equals("bing URL", url,
+ "http://api.microsofttranslator.com/v2/Http.svc/Translate?appId=dummy&text=hi&to=es&from=en");
+ }
+
+ template<> template<>
+ void translate_test_object_t::test<21>()
+ {
+ std::string url;
+ mBing.getTranslateURL(url, "", "es", "hi");
+ ensure_equals("bing URL", url,
+ "http://api.microsofttranslator.com/v2/Http.svc/Translate?appId=dummy&text=hi&to=es");
+ }
+
+ template<> template<>
+ void translate_test_object_t::test<22>()
+ {
+ std::string url;
+ mGoogle.getTranslateURL(url, "en", "es", "hi");
+ ensure_equals("google URL", url,
+ "https://www.googleapis.com/language/translate/v2?key=dummy&q=hi&target=es&source=en");
+ }
+
+ template<> template<>
+ void translate_test_object_t::test<23>()
+ {
+ std::string url;
+ mGoogle.getTranslateURL(url, "", "es", "hi");
+ ensure_equals("google URL", url,
+ "https://www.googleapis.com/language/translate/v2?key=dummy&q=hi&target=es");
+ }
+}
+
+//== Misc stubs ===============================================================
+LLControlGroup gSavedSettings("test");
+
+std::string LLUI::getLanguage() { return "en"; }
+std::string LLTrans::getString(const std::string &xml_desc, const LLStringUtil::format_map_t& args) { return "dummy"; }
+
+LLControlGroup::LLControlGroup(const std::string& name) : LLInstanceTracker<LLControlGroup, std::string>(name) {}
+std::string LLControlGroup::getString(const std::string& name) { return "dummy"; }
+LLControlGroup::~LLControlGroup() {}
+
+namespace boost {
+ void intrusive_ptr_add_ref(LLCurl::Responder*) {}
+ void intrusive_ptr_release(LLCurl::Responder*) {}
+}
+
+LLCurl::Responder::Responder() {}
+void LLCurl::Responder::completedHeader(U32, std::string const&, LLSD const&) {}
+void LLCurl::Responder::completedRaw(U32, const std::string&, const LLChannelDescriptors&, const LLIOPipe::buffer_ptr_t& buffer) {}
+void LLCurl::Responder::completed(U32, std::string const&, LLSD const&) {}
+void LLCurl::Responder::error(U32, std::string const&) {}
+void LLCurl::Responder::errorWithContent(U32, std::string const&, LLSD const&) {}
+void LLCurl::Responder::result(LLSD const&) {}
+LLCurl::Responder::~Responder() {}
+
+void LLHTTPClient::get(const std::string&, const LLSD&, ResponderPtr, const LLSD&, const F32) {}
+void LLHTTPClient::get(const std::string&, boost::intrusive_ptr<LLCurl::Responder>, const LLSD&, const F32) {}
+
+LLBufferStream::LLBufferStream(const LLChannelDescriptors& channels, LLBufferArray* buffer)
+: std::iostream(&mStreamBuf), mStreamBuf(channels, buffer) {}
+LLBufferStream::~LLBufferStream() {}
+
+LLBufferStreamBuf::LLBufferStreamBuf(const LLChannelDescriptors&, LLBufferArray*) {}
+#if( LL_WINDOWS || __GNUC__ > 2)
+LLBufferStreamBuf::pos_type LLBufferStreamBuf::seekoff(
+ off_type off,
+ std::ios::seekdir way,
+ std::ios::openmode which)
+#else
+streampos LLBufferStreamBuf::seekoff(
+ streamoff off,
+ std::ios::seekdir way,
+ std::ios::openmode which)
+#endif
+{ return 0; }
+int LLBufferStreamBuf::sync() {return 0;}
+int LLBufferStreamBuf::underflow() {return 0;}
+int LLBufferStreamBuf::overflow(int) {return 0;}
+LLBufferStreamBuf::~LLBufferStreamBuf() {}
+
+S32 LLVersionInfo::getBuild() { return 0; }
+const std::string& LLVersionInfo::getChannel() {static std::string dummy; return dummy;}
+S32 LLVersionInfo::getMajor() { return 0; }
+S32 LLVersionInfo::getMinor() { return 0; }
+S32 LLVersionInfo::getPatch() { return 0; }
diff --git a/indra/newview/tests/llversioninfo_test.cpp b/indra/newview/tests/llversioninfo_test.cpp
index 8855a24ead..398d8f16ed 100644
--- a/indra/newview/tests/llversioninfo_test.cpp
+++ b/indra/newview/tests/llversioninfo_test.cpp
@@ -51,15 +51,15 @@ namespace tut
mShortVersion = stream.str();
stream.str("");
- stream << mVersion
+ stream << LL_CHANNEL
<< " "
- << LL_CHANNEL;
+ << mVersion;
mVersionAndChannel = stream.str();
stream.str("");
- stream << mVersion
+ stream << mResetChannel
<< " "
- << mResetChannel;
+ << mVersion;
mResetVersionAndChannel = stream.str();
}
std::string mResetChannel;
@@ -99,7 +99,7 @@ namespace tut
LLVersionInfo::getShortVersion(),
mShortVersion);
ensure_equals("Version and channel String",
- LLVersionInfo::getVersionAndChannel(),
+ LLVersionInfo::getChannelAndVersion(),
mVersionAndChannel);
LLVersionInfo::resetChannel(mResetChannel);
@@ -108,7 +108,7 @@ namespace tut
mResetChannel);
ensure_equals("Reset Version and channel String",
- LLVersionInfo::getVersionAndChannel(),
+ LLVersionInfo::getChannelAndVersion(),
mResetVersionAndChannel);
}
}
diff --git a/indra/newview/tests/llviewerassetstats_test.cpp b/indra/newview/tests/llviewerassetstats_test.cpp
new file mode 100644
index 0000000000..3faddc13c1
--- /dev/null
+++ b/indra/newview/tests/llviewerassetstats_test.cpp
@@ -0,0 +1,984 @@
+/**
+ * @file llviewerassetstats_tut.cpp
+ * @date 2010-10-28
+ * @brief Test cases for some of newview/llviewerassetstats.cpp
+ *
+ * $LicenseInfo:firstyear=2010&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+
+#include <tut/tut.hpp>
+#include <iostream>
+
+#include "lltut.h"
+#include "../llviewerassetstats.h"
+#include "lluuid.h"
+#include "llsdutil.h"
+#include "llregionhandle.h"
+
+static const char * all_keys[] =
+{
+ "duration",
+ "fps",
+ "get_other",
+ "get_texture_temp_http",
+ "get_texture_temp_udp",
+ "get_texture_non_temp_http",
+ "get_texture_non_temp_udp",
+ "get_wearable_udp",
+ "get_sound_udp",
+ "get_gesture_udp"
+};
+
+static const char * resp_keys[] =
+{
+ "get_other",
+ "get_texture_temp_http",
+ "get_texture_temp_udp",
+ "get_texture_non_temp_http",
+ "get_texture_non_temp_udp",
+ "get_wearable_udp",
+ "get_sound_udp",
+ "get_gesture_udp"
+};
+
+static const char * sub_keys[] =
+{
+ "dequeued",
+ "enqueued",
+ "resp_count",
+ "resp_max",
+ "resp_min",
+ "resp_mean"
+};
+
+static const char * mmm_resp_keys[] =
+{
+ "fps"
+};
+
+static const char * mmm_sub_keys[] =
+{
+ "count",
+ "max",
+ "min",
+ "mean"
+};
+
+static const LLUUID region1("4e2d81a3-6263-6ffe-ad5c-8ce04bee07e8");
+static const LLUUID region2("68762cc8-b68b-4e45-854b-e830734f2d4a");
+static const U64 region1_handle(0x0000040000003f00ULL);
+static const U64 region2_handle(0x0000030000004200ULL);
+static const std::string region1_handle_str("0000040000003f00");
+static const std::string region2_handle_str("0000030000004200");
+
+#if 0
+static bool
+is_empty_map(const LLSD & sd)
+{
+ return sd.isMap() && 0 == sd.size();
+}
+
+static bool
+is_single_key_map(const LLSD & sd, const std::string & key)
+{
+ return sd.isMap() && 1 == sd.size() && sd.has(key);
+}
+#endif
+
+static bool
+is_double_key_map(const LLSD & sd, const std::string & key1, const std::string & key2)
+{
+ return sd.isMap() && 2 == sd.size() && sd.has(key1) && sd.has(key2);
+}
+
+static bool
+is_no_stats_map(const LLSD & sd)
+{
+ return is_double_key_map(sd, "duration", "regions");
+}
+
+static bool
+is_single_slot_array(const LLSD & sd, U64 region_handle)
+{
+ U32 grid_x(0), grid_y(0);
+ grid_from_region_handle(region_handle, &grid_x, &grid_y);
+
+ return (sd.isArray() &&
+ 1 == sd.size() &&
+ sd[0].has("grid_x") &&
+ sd[0].has("grid_y") &&
+ sd[0]["grid_x"].isInteger() &&
+ sd[0]["grid_y"].isInteger() &&
+ grid_x == sd[0]["grid_x"].asInteger() &&
+ grid_y == sd[0]["grid_y"].asInteger());
+}
+
+static bool
+is_double_slot_array(const LLSD & sd, U64 region_handle1, U64 region_handle2)
+{
+ U32 grid_x1(0), grid_y1(0);
+ U32 grid_x2(0), grid_y2(0);
+ grid_from_region_handle(region_handle1, &grid_x1, &grid_y1);
+ grid_from_region_handle(region_handle2, &grid_x2, &grid_y2);
+
+ return (sd.isArray() &&
+ 2 == sd.size() &&
+ sd[0].has("grid_x") &&
+ sd[0].has("grid_y") &&
+ sd[0]["grid_x"].isInteger() &&
+ sd[0]["grid_y"].isInteger() &&
+ sd[1].has("grid_x") &&
+ sd[1].has("grid_y") &&
+ sd[1]["grid_x"].isInteger() &&
+ sd[1]["grid_y"].isInteger() &&
+ ((grid_x1 == sd[0]["grid_x"].asInteger() &&
+ grid_y1 == sd[0]["grid_y"].asInteger() &&
+ grid_x2 == sd[1]["grid_x"].asInteger() &&
+ grid_y2 == sd[1]["grid_y"].asInteger()) ||
+ (grid_x1 == sd[1]["grid_x"].asInteger() &&
+ grid_y1 == sd[1]["grid_y"].asInteger() &&
+ grid_x2 == sd[0]["grid_x"].asInteger() &&
+ grid_y2 == sd[0]["grid_y"].asInteger())));
+}
+
+static LLSD
+get_region(const LLSD & sd, U64 region_handle1)
+{
+ U32 grid_x(0), grid_y(0);
+ grid_from_region_handle(region_handle1, &grid_x, &grid_y);
+
+ for (LLSD::array_const_iterator it(sd["regions"].beginArray());
+ sd["regions"].endArray() != it;
+ ++it)
+ {
+ if ((*it).has("grid_x") &&
+ (*it).has("grid_y") &&
+ (*it)["grid_x"].isInteger() &&
+ (*it)["grid_y"].isInteger() &&
+ (*it)["grid_x"].asInteger() == grid_x &&
+ (*it)["grid_y"].asInteger() == grid_y)
+ {
+ return *it;
+ }
+ }
+ return LLSD();
+}
+
+namespace tut
+{
+ struct tst_viewerassetstats_index
+ {};
+ typedef test_group<tst_viewerassetstats_index> tst_viewerassetstats_index_t;
+ typedef tst_viewerassetstats_index_t::object tst_viewerassetstats_index_object_t;
+ tut::tst_viewerassetstats_index_t tut_tst_viewerassetstats_index("tst_viewerassetstats_test");
+
+ // Testing free functions without global stats allocated
+ template<> template<>
+ void tst_viewerassetstats_index_object_t::test<1>()
+ {
+ // Check that helpers aren't bothered by missing global stats
+ ensure("Global gViewerAssetStatsMain should be NULL", (NULL == gViewerAssetStatsMain));
+
+ LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_TEXTURE, false, false);
+
+ LLViewerAssetStatsFF::record_dequeue_main(LLViewerAssetType::AT_TEXTURE, false, false);
+
+ LLViewerAssetStatsFF::record_response_main(LLViewerAssetType::AT_GESTURE, false, false, 12300000ULL);
+ }
+
+ // Create a non-global instance and check the structure
+ template<> template<>
+ void tst_viewerassetstats_index_object_t::test<2>()
+ {
+ ensure("Global gViewerAssetStatsMain should be NULL", (NULL == gViewerAssetStatsMain));
+
+ LLViewerAssetStats * it = new LLViewerAssetStats();
+
+ ensure("Global gViewerAssetStatsMain should still be NULL", (NULL == gViewerAssetStatsMain));
+
+ LLSD sd_full = it->asLLSD(false);
+
+ // Default (NULL) region ID doesn't produce LLSD results so should
+ // get an empty map back from output
+ ensure("Stat-less LLSD initially", is_no_stats_map(sd_full));
+
+ // Once the region is set, we will get a response even with no data collection
+ it->setRegion(region1_handle);
+ sd_full = it->asLLSD(false);
+ ensure("Correct single-key LLSD map root", is_double_key_map(sd_full, "duration", "regions"));
+ ensure("Correct single-slot LLSD array regions", is_single_slot_array(sd_full["regions"], region1_handle));
+
+ LLSD sd = sd_full["regions"][0];
+
+ delete it;
+
+ // Check the structure of the LLSD
+ for (int i = 0; i < LL_ARRAY_SIZE(all_keys); ++i)
+ {
+ std::string line = llformat("Has '%s' key", all_keys[i]);
+ ensure(line, sd.has(all_keys[i]));
+ }
+
+ for (int i = 0; i < LL_ARRAY_SIZE(resp_keys); ++i)
+ {
+ for (int j = 0; j < LL_ARRAY_SIZE(sub_keys); ++j)
+ {
+ std::string line = llformat("Key '%s' has '%s' key", resp_keys[i], sub_keys[j]);
+ ensure(line, sd[resp_keys[i]].has(sub_keys[j]));
+ }
+ }
+
+ for (int i = 0; i < LL_ARRAY_SIZE(mmm_resp_keys); ++i)
+ {
+ for (int j = 0; j < LL_ARRAY_SIZE(mmm_sub_keys); ++j)
+ {
+ std::string line = llformat("Key '%s' has '%s' key", mmm_resp_keys[i], mmm_sub_keys[j]);
+ ensure(line, sd[mmm_resp_keys[i]].has(mmm_sub_keys[j]));
+ }
+ }
+ }
+
+ // Create a non-global instance and check some content
+ template<> template<>
+ void tst_viewerassetstats_index_object_t::test<3>()
+ {
+ LLViewerAssetStats * it = new LLViewerAssetStats();
+ it->setRegion(region1_handle);
+
+ LLSD sd = it->asLLSD(false);
+ ensure("Correct single-key LLSD map root", is_double_key_map(sd, "regions", "duration"));
+ ensure("Correct single-slot LLSD array regions", is_single_slot_array(sd["regions"], region1_handle));
+ sd = sd[0];
+
+ delete it;
+
+ // Check a few points on the tree for content
+ ensure("sd[get_texture_temp_http][dequeued] is 0", (0 == sd["get_texture_temp_http"]["dequeued"].asInteger()));
+ ensure("sd[get_sound_udp][resp_min] is 0", (0.0 == sd["get_sound_udp"]["resp_min"].asReal()));
+ }
+
+ // Create a global instance and verify free functions do something useful
+ template<> template<>
+ void tst_viewerassetstats_index_object_t::test<4>()
+ {
+ gViewerAssetStatsMain = new LLViewerAssetStats();
+ LLViewerAssetStatsFF::set_region_main(region1_handle);
+
+ LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_TEXTURE, false, false);
+ LLViewerAssetStatsFF::record_dequeue_main(LLViewerAssetType::AT_TEXTURE, false, false);
+
+ LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_BODYPART, false, false);
+ LLViewerAssetStatsFF::record_dequeue_main(LLViewerAssetType::AT_BODYPART, false, false);
+
+ LLSD sd = gViewerAssetStatsMain->asLLSD(false);
+ ensure("Correct single-key LLSD map root", is_double_key_map(sd, "regions", "duration"));
+ ensure("Correct single-slot LLSD array regions", is_single_slot_array(sd["regions"], region1_handle));
+ sd = sd["regions"][0];
+
+ // Check a few points on the tree for content
+ ensure("sd[get_texture_non_temp_udp][enqueued] is 1", (1 == sd["get_texture_non_temp_udp"]["enqueued"].asInteger()));
+ ensure("sd[get_texture_temp_udp][enqueued] is 0", (0 == sd["get_texture_temp_udp"]["enqueued"].asInteger()));
+ ensure("sd[get_texture_non_temp_http][enqueued] is 0", (0 == sd["get_texture_non_temp_http"]["enqueued"].asInteger()));
+ ensure("sd[get_texture_temp_http][enqueued] is 0", (0 == sd["get_texture_temp_http"]["enqueued"].asInteger()));
+ ensure("sd[get_gesture_udp][dequeued] is 0", (0 == sd["get_gesture_udp"]["dequeued"].asInteger()));
+
+ // Reset and check zeros...
+ // Reset leaves current region in place
+ gViewerAssetStatsMain->reset();
+ sd = gViewerAssetStatsMain->asLLSD(false)["regions"][region1_handle_str];
+
+ delete gViewerAssetStatsMain;
+ gViewerAssetStatsMain = NULL;
+
+ ensure("sd[get_texture_non_temp_udp][enqueued] is reset", (0 == sd["get_texture_non_temp_udp"]["enqueued"].asInteger()));
+ ensure("sd[get_gesture_udp][dequeued] is reset", (0 == sd["get_gesture_udp"]["dequeued"].asInteger()));
+ }
+
+ // Create two global instances and verify no interactions
+ template<> template<>
+ void tst_viewerassetstats_index_object_t::test<5>()
+ {
+ gViewerAssetStatsThread1 = new LLViewerAssetStats();
+ gViewerAssetStatsMain = new LLViewerAssetStats();
+ LLViewerAssetStatsFF::set_region_main(region1_handle);
+
+ LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_TEXTURE, false, false);
+ LLViewerAssetStatsFF::record_dequeue_main(LLViewerAssetType::AT_TEXTURE, false, false);
+
+ LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_BODYPART, false, false);
+ LLViewerAssetStatsFF::record_dequeue_main(LLViewerAssetType::AT_BODYPART, false, false);
+
+ LLSD sd = gViewerAssetStatsThread1->asLLSD(false);
+ ensure("Other collector is empty", is_no_stats_map(sd));
+ sd = gViewerAssetStatsMain->asLLSD(false);
+ ensure("Correct single-key LLSD map root", is_double_key_map(sd, "regions", "duration"));
+ ensure("Correct single-slot LLSD array regions", is_single_slot_array(sd["regions"], region1_handle));
+ sd = sd["regions"][0];
+
+ // Check a few points on the tree for content
+ ensure("sd[get_texture_non_temp_udp][enqueued] is 1", (1 == sd["get_texture_non_temp_udp"]["enqueued"].asInteger()));
+ ensure("sd[get_texture_temp_udp][enqueued] is 0", (0 == sd["get_texture_temp_udp"]["enqueued"].asInteger()));
+ ensure("sd[get_texture_non_temp_http][enqueued] is 0", (0 == sd["get_texture_non_temp_http"]["enqueued"].asInteger()));
+ ensure("sd[get_texture_temp_http][enqueued] is 0", (0 == sd["get_texture_temp_http"]["enqueued"].asInteger()));
+ ensure("sd[get_gesture_udp][dequeued] is 0", (0 == sd["get_gesture_udp"]["dequeued"].asInteger()));
+
+ // Reset and check zeros...
+ // Reset leaves current region in place
+ gViewerAssetStatsMain->reset();
+ sd = gViewerAssetStatsMain->asLLSD(false)["regions"][0];
+
+ delete gViewerAssetStatsMain;
+ gViewerAssetStatsMain = NULL;
+ delete gViewerAssetStatsThread1;
+ gViewerAssetStatsThread1 = NULL;
+
+ ensure("sd[get_texture_non_temp_udp][enqueued] is reset", (0 == sd["get_texture_non_temp_udp"]["enqueued"].asInteger()));
+ ensure("sd[get_gesture_udp][dequeued] is reset", (0 == sd["get_gesture_udp"]["dequeued"].asInteger()));
+ }
+
+ // Check multiple region collection
+ template<> template<>
+ void tst_viewerassetstats_index_object_t::test<6>()
+ {
+ gViewerAssetStatsMain = new LLViewerAssetStats();
+
+ LLViewerAssetStatsFF::set_region_main(region1_handle);
+
+ LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_TEXTURE, false, false);
+ LLViewerAssetStatsFF::record_dequeue_main(LLViewerAssetType::AT_TEXTURE, false, false);
+
+ LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_BODYPART, false, false);
+ LLViewerAssetStatsFF::record_dequeue_main(LLViewerAssetType::AT_BODYPART, false, false);
+
+ LLViewerAssetStatsFF::set_region_main(region2_handle);
+
+ LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_GESTURE, false, false);
+ LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_GESTURE, false, false);
+ LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_GESTURE, false, false);
+ LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_GESTURE, false, false);
+
+ LLSD sd = gViewerAssetStatsMain->asLLSD(false);
+
+ // std::cout << sd << std::endl;
+
+ ensure("Correct double-key LLSD map root", is_double_key_map(sd, "duration", "regions"));
+ ensure("Correct double-slot LLSD array regions", is_double_slot_array(sd["regions"], region1_handle, region2_handle));
+ LLSD sd1 = get_region(sd, region1_handle);
+ LLSD sd2 = get_region(sd, region2_handle);
+ ensure("Region1 is present in results", sd1.isMap());
+ ensure("Region2 is present in results", sd2.isMap());
+
+ // Check a few points on the tree for content
+ ensure_equals("sd1[get_texture_non_temp_udp][enqueued] is 1", sd1["get_texture_non_temp_udp"]["enqueued"].asInteger(), 1);
+ ensure_equals("sd1[get_texture_temp_udp][enqueued] is 0", sd1["get_texture_temp_udp"]["enqueued"].asInteger(), 0);
+ ensure_equals("sd1[get_texture_non_temp_http][enqueued] is 0", sd1["get_texture_non_temp_http"]["enqueued"].asInteger(), 0);
+ ensure_equals("sd1[get_texture_temp_http][enqueued] is 0", sd1["get_texture_temp_http"]["enqueued"].asInteger(), 0);
+ ensure_equals("sd1[get_gesture_udp][dequeued] is 0", sd1["get_gesture_udp"]["dequeued"].asInteger(), 0);
+
+ // Check a few points on the tree for content
+ ensure("sd2[get_gesture_udp][enqueued] is 4", (4 == sd2["get_gesture_udp"]["enqueued"].asInteger()));
+ ensure("sd2[get_gesture_udp][dequeued] is 0", (0 == sd2["get_gesture_udp"]["dequeued"].asInteger()));
+ ensure("sd2[get_texture_non_temp_udp][enqueued] is 0", (0 == sd2["get_texture_non_temp_udp"]["enqueued"].asInteger()));
+
+ // Reset and check zeros...
+ // Reset leaves current region in place
+ gViewerAssetStatsMain->reset();
+ sd = gViewerAssetStatsMain->asLLSD(false);
+ ensure("Correct single-key LLSD map root", is_double_key_map(sd, "regions", "duration"));
+ ensure("Correct single-slot LLSD array regions (p2)", is_single_slot_array(sd["regions"], region2_handle));
+ sd2 = sd["regions"][0];
+
+ delete gViewerAssetStatsMain;
+ gViewerAssetStatsMain = NULL;
+
+ ensure("sd2[get_texture_non_temp_udp][enqueued] is reset", (0 == sd2["get_texture_non_temp_udp"]["enqueued"].asInteger()));
+ ensure("sd2[get_gesture_udp][enqueued] is reset", (0 == sd2["get_gesture_udp"]["enqueued"].asInteger()));
+ }
+
+ // Check multiple region collection jumping back-and-forth between regions
+ template<> template<>
+ void tst_viewerassetstats_index_object_t::test<7>()
+ {
+ gViewerAssetStatsMain = new LLViewerAssetStats();
+
+ LLViewerAssetStatsFF::set_region_main(region1_handle);
+
+ LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_TEXTURE, false, false);
+ LLViewerAssetStatsFF::record_dequeue_main(LLViewerAssetType::AT_TEXTURE, false, false);
+
+ LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_BODYPART, false, false);
+ LLViewerAssetStatsFF::record_dequeue_main(LLViewerAssetType::AT_BODYPART, false, false);
+
+ LLViewerAssetStatsFF::set_region_main(region2_handle);
+
+ LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_GESTURE, false, false);
+ LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_GESTURE, false, false);
+ LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_GESTURE, false, false);
+ LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_GESTURE, false, false);
+
+ LLViewerAssetStatsFF::set_region_main(region1_handle);
+
+ LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_TEXTURE, true, true);
+ LLViewerAssetStatsFF::record_dequeue_main(LLViewerAssetType::AT_TEXTURE, true, true);
+
+ LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_BODYPART, false, false);
+ LLViewerAssetStatsFF::record_dequeue_main(LLViewerAssetType::AT_BODYPART, false, false);
+
+ LLViewerAssetStatsFF::set_region_main(region2_handle);
+
+ LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_GESTURE, false, false);
+ LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_GESTURE, false, false);
+ LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_GESTURE, false, false);
+ LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_GESTURE, false, false);
+
+ LLSD sd = gViewerAssetStatsMain->asLLSD(false);
+
+ ensure("Correct double-key LLSD map root", is_double_key_map(sd, "duration", "regions"));
+ ensure("Correct double-slot LLSD array regions", is_double_slot_array(sd["regions"], region1_handle, region2_handle));
+ LLSD sd1 = get_region(sd, region1_handle);
+ LLSD sd2 = get_region(sd, region2_handle);
+ ensure("Region1 is present in results", sd1.isMap());
+ ensure("Region2 is present in results", sd2.isMap());
+
+ // Check a few points on the tree for content
+ ensure("sd1[get_texture_non_temp_udp][enqueued] is 1", (1 == sd1["get_texture_non_temp_udp"]["enqueued"].asInteger()));
+ ensure("sd1[get_texture_temp_udp][enqueued] is 0", (0 == sd1["get_texture_temp_udp"]["enqueued"].asInteger()));
+ ensure("sd1[get_texture_non_temp_http][enqueued] is 0", (0 == sd1["get_texture_non_temp_http"]["enqueued"].asInteger()));
+ ensure("sd1[get_texture_temp_http][enqueued] is 1", (1 == sd1["get_texture_temp_http"]["enqueued"].asInteger()));
+ ensure("sd1[get_gesture_udp][dequeued] is 0", (0 == sd1["get_gesture_udp"]["dequeued"].asInteger()));
+
+ // Check a few points on the tree for content
+ ensure("sd2[get_gesture_udp][enqueued] is 8", (8 == sd2["get_gesture_udp"]["enqueued"].asInteger()));
+ ensure("sd2[get_gesture_udp][dequeued] is 0", (0 == sd2["get_gesture_udp"]["dequeued"].asInteger()));
+ ensure("sd2[get_texture_non_temp_udp][enqueued] is 0", (0 == sd2["get_texture_non_temp_udp"]["enqueued"].asInteger()));
+
+ // Reset and check zeros...
+ // Reset leaves current region in place
+ gViewerAssetStatsMain->reset();
+ sd = gViewerAssetStatsMain->asLLSD(false);
+ ensure("Correct single-key LLSD map root", is_double_key_map(sd, "duration", "regions"));
+ ensure("Correct single-slot LLSD array regions (p2)", is_single_slot_array(sd["regions"], region2_handle));
+ sd2 = get_region(sd, region2_handle);
+ ensure("Region2 is present in results", sd2.isMap());
+
+ delete gViewerAssetStatsMain;
+ gViewerAssetStatsMain = NULL;
+
+ ensure_equals("sd2[get_texture_non_temp_udp][enqueued] is reset", sd2["get_texture_non_temp_udp"]["enqueued"].asInteger(), 0);
+ ensure_equals("sd2[get_gesture_udp][enqueued] is reset", sd2["get_gesture_udp"]["enqueued"].asInteger(), 0);
+ }
+
+ // Non-texture assets ignore transport and persistence flags
+ template<> template<>
+ void tst_viewerassetstats_index_object_t::test<8>()
+ {
+ gViewerAssetStatsThread1 = new LLViewerAssetStats();
+ gViewerAssetStatsMain = new LLViewerAssetStats();
+ LLViewerAssetStatsFF::set_region_main(region1_handle);
+
+ LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_TEXTURE, false, false);
+ LLViewerAssetStatsFF::record_dequeue_main(LLViewerAssetType::AT_TEXTURE, false, false);
+
+ LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_BODYPART, false, false);
+ LLViewerAssetStatsFF::record_dequeue_main(LLViewerAssetType::AT_BODYPART, false, false);
+
+ LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_BODYPART, false, true);
+ LLViewerAssetStatsFF::record_dequeue_main(LLViewerAssetType::AT_BODYPART, false, true);
+
+ LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_BODYPART, true, false);
+ LLViewerAssetStatsFF::record_dequeue_main(LLViewerAssetType::AT_BODYPART, true, false);
+
+ LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_BODYPART, true, true);
+ LLViewerAssetStatsFF::record_dequeue_main(LLViewerAssetType::AT_BODYPART, true, true);
+
+ LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_LSL_BYTECODE, false, false);
+
+ LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_LSL_BYTECODE, false, true);
+
+ LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_LSL_BYTECODE, true, false);
+
+ LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+
+ LLSD sd = gViewerAssetStatsThread1->asLLSD(false);
+ ensure("Other collector is empty", is_no_stats_map(sd));
+ sd = gViewerAssetStatsMain->asLLSD(false);
+ ensure("Correct single-key LLSD map root", is_double_key_map(sd, "regions", "duration"));
+ ensure("Correct single-slot LLSD array regions", is_single_slot_array(sd["regions"], region1_handle));
+ sd = get_region(sd, region1_handle);
+ ensure("Region1 is present in results", sd.isMap());
+
+ // Check a few points on the tree for content
+ ensure("sd[get_gesture_udp][enqueued] is 0", (0 == sd["get_gesture_udp"]["enqueued"].asInteger()));
+ ensure("sd[get_gesture_udp][dequeued] is 0", (0 == sd["get_gesture_udp"]["dequeued"].asInteger()));
+
+ ensure("sd[get_wearable_udp][enqueued] is 4", (4 == sd["get_wearable_udp"]["enqueued"].asInteger()));
+ ensure("sd[get_wearable_udp][dequeued] is 4", (4 == sd["get_wearable_udp"]["dequeued"].asInteger()));
+
+ ensure("sd[get_other][enqueued] is 4", (4 == sd["get_other"]["enqueued"].asInteger()));
+ ensure("sd[get_other][dequeued] is 0", (0 == sd["get_other"]["dequeued"].asInteger()));
+
+ // Reset and check zeros...
+ // Reset leaves current region in place
+ gViewerAssetStatsMain->reset();
+ sd = get_region(gViewerAssetStatsMain->asLLSD(false), region1_handle);
+ ensure("Region1 is present in results", sd.isMap());
+
+ delete gViewerAssetStatsMain;
+ gViewerAssetStatsMain = NULL;
+ delete gViewerAssetStatsThread1;
+ gViewerAssetStatsThread1 = NULL;
+
+ ensure_equals("sd[get_texture_non_temp_udp][enqueued] is reset", sd["get_texture_non_temp_udp"]["enqueued"].asInteger(), 0);
+ ensure_equals("sd[get_gesture_udp][dequeued] is reset", sd["get_gesture_udp"]["dequeued"].asInteger(), 0);
+ }
+
+
+ // LLViewerAssetStats::merge() basic functions work
+ template<> template<>
+ void tst_viewerassetstats_index_object_t::test<9>()
+ {
+ LLViewerAssetStats s1;
+ LLViewerAssetStats s2;
+
+ s1.setRegion(region1_handle);
+ s2.setRegion(region1_handle);
+
+ s1.recordGetServiced(LLViewerAssetType::AT_TEXTURE, true, true, 5000000);
+ s1.recordGetServiced(LLViewerAssetType::AT_TEXTURE, true, true, 6000000);
+ s1.recordGetServiced(LLViewerAssetType::AT_TEXTURE, true, true, 8000000);
+ s1.recordGetServiced(LLViewerAssetType::AT_TEXTURE, true, true, 7000000);
+ s1.recordGetServiced(LLViewerAssetType::AT_TEXTURE, true, true, 9000000);
+
+ s2.recordGetServiced(LLViewerAssetType::AT_TEXTURE, true, true, 2000000);
+ s2.recordGetServiced(LLViewerAssetType::AT_TEXTURE, true, true, 3000000);
+ s2.recordGetServiced(LLViewerAssetType::AT_TEXTURE, true, true, 4000000);
+
+ s2.merge(s1);
+
+ LLSD s2_llsd = get_region(s2.asLLSD(false), region1_handle);
+ ensure("Region1 is present in results", s2_llsd.isMap());
+
+ ensure_equals("count after merge", s2_llsd["get_texture_temp_http"]["resp_count"].asInteger(), 8);
+ ensure_approximately_equals("min after merge", s2_llsd["get_texture_temp_http"]["resp_min"].asReal(), 2.0, 22);
+ ensure_approximately_equals("max after merge", s2_llsd["get_texture_temp_http"]["resp_max"].asReal(), 9.0, 22);
+ ensure_approximately_equals("max after merge", s2_llsd["get_texture_temp_http"]["resp_mean"].asReal(), 5.5, 22);
+ }
+
+ // LLViewerAssetStats::merge() basic functions work without corrupting source data
+ template<> template<>
+ void tst_viewerassetstats_index_object_t::test<10>()
+ {
+ LLViewerAssetStats s1;
+ LLViewerAssetStats s2;
+
+ s1.setRegion(region1_handle);
+ s1.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s1.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s1.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s1.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+
+ s1.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s1.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s1.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s1.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+
+ s1.recordGetServiced(LLViewerAssetType::AT_LSL_BYTECODE, true, true, 23289200);
+ s1.recordGetServiced(LLViewerAssetType::AT_LSL_BYTECODE, true, true, 282900);
+
+
+ s2.setRegion(region2_handle);
+ s2.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+
+ s2.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+
+ s2.recordGetServiced(LLViewerAssetType::AT_LSL_BYTECODE, true, true, 6500000);
+ s2.recordGetServiced(LLViewerAssetType::AT_LSL_BYTECODE, true, true, 10000);
+
+ {
+ s2.merge(s1);
+
+ LLSD src = s1.asLLSD(false);
+ LLSD dst = s2.asLLSD(false);
+
+ ensure_equals("merge src has single region", src["regions"].size(), 1);
+ ensure_equals("merge dst has dual regions", dst["regions"].size(), 2);
+
+ // Remove time stamps, they're a problem
+ src.erase("duration");
+ src["regions"][0].erase("duration");
+ dst.erase("duration");
+ dst["regions"][0].erase("duration");
+ dst["regions"][1].erase("duration");
+
+ LLSD s1_llsd = get_region(src, region1_handle);
+ ensure("Region1 is present in src", s1_llsd.isMap());
+ LLSD s2_llsd = get_region(dst, region1_handle);
+ ensure("Region1 is present in dst", s2_llsd.isMap());
+
+ ensure("result from src is in dst", llsd_equals(s1_llsd, s2_llsd));
+ }
+
+ s1.setRegion(region1_handle);
+ s2.setRegion(region1_handle);
+ s1.reset();
+ s2.reset();
+
+ s1.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s1.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s1.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s1.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+
+ s1.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s1.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s1.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s1.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+
+ s1.recordGetServiced(LLViewerAssetType::AT_LSL_BYTECODE, true, true, 23289200);
+ s1.recordGetServiced(LLViewerAssetType::AT_LSL_BYTECODE, true, true, 282900);
+
+
+ s2.setRegion(region1_handle);
+ s2.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+
+ s2.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+
+ s2.recordGetServiced(LLViewerAssetType::AT_LSL_BYTECODE, true, true, 6500000);
+ s2.recordGetServiced(LLViewerAssetType::AT_LSL_BYTECODE, true, true, 10000);
+
+ {
+ s2.merge(s1);
+
+ LLSD src = s1.asLLSD(false);
+ LLSD dst = s2.asLLSD(false);
+
+ ensure_equals("merge src has single region (p2)", src["regions"].size(), 1);
+ ensure_equals("merge dst has single region (p2)", dst["regions"].size(), 1);
+
+ // Remove time stamps, they're a problem
+ src.erase("duration");
+ src["regions"][0].erase("duration");
+ dst.erase("duration");
+ dst["regions"][0].erase("duration");
+
+ LLSD s1_llsd = get_region(src, region1_handle);
+ ensure("Region1 is present in src", s1_llsd.isMap());
+ LLSD s2_llsd = get_region(dst, region1_handle);
+ ensure("Region1 is present in dst", s2_llsd.isMap());
+
+ ensure_equals("src counts okay (enq)", s1_llsd["get_other"]["enqueued"].asInteger(), 4);
+ ensure_equals("src counts okay (deq)", s1_llsd["get_other"]["dequeued"].asInteger(), 4);
+ ensure_equals("src resp counts okay", s1_llsd["get_other"]["resp_count"].asInteger(), 2);
+ ensure_approximately_equals("src respmin okay", s1_llsd["get_other"]["resp_min"].asReal(), 0.2829, 20);
+ ensure_approximately_equals("src respmax okay", s1_llsd["get_other"]["resp_max"].asReal(), 23.2892, 20);
+
+ ensure_equals("dst counts okay (enq)", s2_llsd["get_other"]["enqueued"].asInteger(), 12);
+ ensure_equals("src counts okay (deq)", s2_llsd["get_other"]["dequeued"].asInteger(), 11);
+ ensure_equals("dst resp counts okay", s2_llsd["get_other"]["resp_count"].asInteger(), 4);
+ ensure_approximately_equals("dst respmin okay", s2_llsd["get_other"]["resp_min"].asReal(), 0.010, 20);
+ ensure_approximately_equals("dst respmax okay", s2_llsd["get_other"]["resp_max"].asReal(), 23.2892, 20);
+ }
+ }
+
+
+ // Maximum merges are interesting when one side contributes nothing
+ template<> template<>
+ void tst_viewerassetstats_index_object_t::test<11>()
+ {
+ LLViewerAssetStats s1;
+ LLViewerAssetStats s2;
+
+ s1.setRegion(region1_handle);
+ s1.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s1.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s1.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s1.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+
+ s1.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s1.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s1.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s1.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+
+ // Want to test negative numbers here but have to work in U64
+ s1.recordGetServiced(LLViewerAssetType::AT_LSL_BYTECODE, true, true, 0);
+ s1.recordGetServiced(LLViewerAssetType::AT_LSL_BYTECODE, true, true, 0);
+ s1.recordGetServiced(LLViewerAssetType::AT_LSL_BYTECODE, true, true, 0);
+
+ s2.setRegion(region1_handle);
+ s2.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+
+ s2.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+
+ {
+ s2.merge(s1);
+
+ LLSD src = s1.asLLSD(false);
+ LLSD dst = s2.asLLSD(false);
+
+ ensure_equals("merge src has single region", src["regions"].size(), 1);
+ ensure_equals("merge dst has single region", dst["regions"].size(), 1);
+
+ // Remove time stamps, they're a problem
+ src.erase("duration");
+ src["regions"][0].erase("duration");
+ dst.erase("duration");
+ dst["regions"][0].erase("duration");
+
+ LLSD s2_llsd = get_region(dst, region1_handle);
+ ensure("Region1 is present in dst", s2_llsd.isMap());
+
+ ensure_equals("dst counts come from src only", s2_llsd["get_other"]["resp_count"].asInteger(), 3);
+
+ ensure_approximately_equals("dst maximum with count 0 does not contribute to merged maximum",
+ s2_llsd["get_other"]["resp_max"].asReal(), F64(0.0), 20);
+ }
+
+ // Other way around
+ s1.setRegion(region1_handle);
+ s2.setRegion(region1_handle);
+ s1.reset();
+ s2.reset();
+
+ s1.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s1.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s1.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s1.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+
+ s1.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s1.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s1.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s1.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+
+ // Want to test negative numbers here but have to work in U64
+ s1.recordGetServiced(LLViewerAssetType::AT_LSL_BYTECODE, true, true, 0);
+ s1.recordGetServiced(LLViewerAssetType::AT_LSL_BYTECODE, true, true, 0);
+ s1.recordGetServiced(LLViewerAssetType::AT_LSL_BYTECODE, true, true, 0);
+
+ s2.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+
+ s2.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+
+ {
+ s1.merge(s2);
+
+ LLSD src = s2.asLLSD(false);
+ LLSD dst = s1.asLLSD(false);
+
+ ensure_equals("merge src has single region", src["regions"].size(), 1);
+ ensure_equals("merge dst has single region", dst["regions"].size(), 1);
+
+ // Remove time stamps, they're a problem
+ src.erase("duration");
+ src["regions"][0].erase("duration");
+ dst.erase("duration");
+ dst["regions"][0].erase("duration");
+
+ LLSD s2_llsd = get_region(dst, region1_handle);
+ ensure("Region1 is present in dst", s2_llsd.isMap());
+
+ ensure_equals("dst counts come from src only (flipped)", s2_llsd["get_other"]["resp_count"].asInteger(), 3);
+
+ ensure_approximately_equals("dst maximum with count 0 does not contribute to merged maximum (flipped)",
+ s2_llsd["get_other"]["resp_max"].asReal(), F64(0.0), 20);
+ }
+ }
+
+ // Minimum merges are interesting when one side contributes nothing
+ template<> template<>
+ void tst_viewerassetstats_index_object_t::test<12>()
+ {
+ LLViewerAssetStats s1;
+ LLViewerAssetStats s2;
+
+ s1.setRegion(region1_handle);
+ s1.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s1.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s1.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s1.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+
+ s1.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s1.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s1.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s1.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+
+ s1.recordGetServiced(LLViewerAssetType::AT_LSL_BYTECODE, true, true, 3800000);
+ s1.recordGetServiced(LLViewerAssetType::AT_LSL_BYTECODE, true, true, 2700000);
+ s1.recordGetServiced(LLViewerAssetType::AT_LSL_BYTECODE, true, true, 2900000);
+
+ s2.setRegion(region1_handle);
+ s2.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+
+ s2.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+
+ {
+ s2.merge(s1);
+
+ LLSD src = s1.asLLSD(false);
+ LLSD dst = s2.asLLSD(false);
+
+ ensure_equals("merge src has single region", src["regions"].size(), 1);
+ ensure_equals("merge dst has single region", dst["regions"].size(), 1);
+
+ // Remove time stamps, they're a problem
+ src.erase("duration");
+ src["regions"][0].erase("duration");
+ dst.erase("duration");
+ dst["regions"][0].erase("duration");
+
+ LLSD s2_llsd = get_region(dst, region1_handle);
+ ensure("Region1 is present in dst", s2_llsd.isMap());
+
+ ensure_equals("dst counts come from src only", s2_llsd["get_other"]["resp_count"].asInteger(), 3);
+
+ ensure_approximately_equals("dst minimum with count 0 does not contribute to merged minimum",
+ s2_llsd["get_other"]["resp_min"].asReal(), F64(2.7), 20);
+ }
+
+ // Other way around
+ s1.setRegion(region1_handle);
+ s2.setRegion(region1_handle);
+ s1.reset();
+ s2.reset();
+
+ s1.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s1.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s1.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s1.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+
+ s1.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s1.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s1.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s1.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+
+ s1.recordGetServiced(LLViewerAssetType::AT_LSL_BYTECODE, true, true, 3800000);
+ s1.recordGetServiced(LLViewerAssetType::AT_LSL_BYTECODE, true, true, 2700000);
+ s1.recordGetServiced(LLViewerAssetType::AT_LSL_BYTECODE, true, true, 2900000);
+
+ s2.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetEnqueued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+
+ s2.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+ s2.recordGetDequeued(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
+
+ {
+ s1.merge(s2);
+
+ LLSD src = s2.asLLSD(false);
+ LLSD dst = s1.asLLSD(false);
+
+ ensure_equals("merge src has single region", src["regions"].size(), 1);
+ ensure_equals("merge dst has single region", dst["regions"].size(), 1);
+
+ // Remove time stamps, they're a problem
+ src.erase("duration");
+ src["regions"][0].erase("duration");
+ dst.erase("duration");
+ dst["regions"][0].erase("duration");
+
+ LLSD s2_llsd = get_region(dst, region1_handle);
+ ensure("Region1 is present in dst", s2_llsd.isMap());
+
+ ensure_equals("dst counts come from src only (flipped)", s2_llsd["get_other"]["resp_count"].asInteger(), 3);
+
+ ensure_approximately_equals("dst minimum with count 0 does not contribute to merged minimum (flipped)",
+ s2_llsd["get_other"]["resp_min"].asReal(), F64(2.7), 20);
+ }
+ }
+
+}
diff --git a/indra/newview/tests/llviewerhelputil_test.cpp b/indra/newview/tests/llviewerhelputil_test.cpp
index b425b50c8b..710881d811 100644
--- a/indra/newview/tests/llviewerhelputil_test.cpp
+++ b/indra/newview/tests/llviewerhelputil_test.cpp
@@ -73,11 +73,9 @@ static void substitute_string(std::string &input, const std::string &search, con
}
#include "../llagent.h"
-LLAgent::LLAgent() : mAgentAccess(gSavedSettings) { }
+LLAgent::LLAgent() : mAgentAccess(NULL) { }
LLAgent::~LLAgent() { }
bool LLAgent::isGodlike() const { return FALSE; }
-LLAgentAccess::LLAgentAccess(LLControlGroup& settings) : mSavedSettings(settings) { }
-LLUIColor::LLUIColor() {}
LLAgent gAgent;
diff --git a/indra/newview/tests/llviewernetwork_test.cpp b/indra/newview/tests/llviewernetwork_test.cpp
index dd7761475e..3c89b64d52 100644
--- a/indra/newview/tests/llviewernetwork_test.cpp
+++ b/indra/newview/tests/llviewernetwork_test.cpp
@@ -164,7 +164,7 @@ namespace tut
std::string("https://secondlife.com/helpers/"));
ensure_equals("Agni login page is correct",
grid[GRID_LOGIN_PAGE_VALUE].asString(),
- std::string("http://secondlife.com/app/login/"));
+ std::string("http://viewer-login.agni.lindenlab.com/"));
ensure("Agni is a favorite",
grid.has(GRID_IS_FAVORITE_VALUE));
ensure("Agni is a system grid",
@@ -208,7 +208,7 @@ namespace tut
std::string("https://secondlife.com/helpers/"));
ensure_equals("Agni login page the same after grid file",
grid[GRID_LOGIN_PAGE_VALUE].asString(),
- std::string("http://secondlife.com/app/login/"));
+ std::string("http://viewer-login.agni.lindenlab.com/"));
ensure("Agni still a favorite after grid file",
grid.has(GRID_IS_FAVORITE_VALUE));
ensure("Agni system grid still set after grid file",
@@ -310,7 +310,7 @@ namespace tut
std::string("http://aditi-secondlife.webdev.lindenlab.com/helpers/"));
ensure_equals("Override known grid login uri: login page is not set",
grid[GRID_LOGIN_PAGE_VALUE].asString(),
- std::string("http://secondlife.com/app/login/"));
+ std::string("http://viewer-login.agni.lindenlab.com/"));
// Override with loginuri
// override custom grid
@@ -359,7 +359,7 @@ namespace tut
std::string("https://my.helper.uri/mycustomhelpers"));
ensure_equals("Override known grid helper uri: login page is not changed",
grid[GRID_LOGIN_PAGE_VALUE].asString(),
- std::string("http://secondlife.com/app/login/"));
+ std::string("http://viewer-login.agni.lindenlab.com/"));
// Override with helperuri
// override custom grid
@@ -451,9 +451,9 @@ namespace tut
ensure_equals("getHelperURI", LLGridManager::getInstance()->getHelperURI(),
std::string("https://secondlife.com/helpers/"));
ensure_equals("getLoginPage", LLGridManager::getInstance()->getLoginPage(),
- std::string("http://secondlife.com/app/login/"));
+ std::string("http://viewer-login.agni.lindenlab.com/"));
ensure_equals("getLoginPage2", LLGridManager::getInstance()->getLoginPage("util.agni.lindenlab.com"),
- std::string("http://secondlife.com/app/login/"));
+ std::string("http://viewer-login.agni.lindenlab.com/"));
ensure("Is Agni a production grid", LLGridManager::getInstance()->isInProductionGrid());
std::vector<std::string> uris;
LLGridManager::getInstance()->getLoginURIs(uris);
diff --git a/indra/newview/tests/llviewershadermgr_stub.cpp b/indra/newview/tests/llviewershadermgr_stub.cpp
new file mode 100644
index 0000000000..18eff72f3c
--- /dev/null
+++ b/indra/newview/tests/llviewershadermgr_stub.cpp
@@ -0,0 +1,50 @@
+/**
+ * @file llglslshader_stub.cpp
+ * @brief stub class to allow unit testing
+ *
+ * $LicenseInfo:firstyear=2009&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "../llviewershadermgr.h"
+
+LLShaderMgr::LLShaderMgr() {}
+LLShaderMgr::~LLShaderMgr() {}
+
+LLViewerShaderMgr::LLViewerShaderMgr() {}
+LLViewerShaderMgr::~LLViewerShaderMgr() {}
+
+LLViewerShaderMgr* stub_instance = NULL;
+
+LLViewerShaderMgr* LLViewerShaderMgr::instance() {
+ if(NULL == stub_instance)
+ {
+ stub_instance = new LLViewerShaderMgr();
+ }
+
+ return stub_instance;
+}
+LLViewerShaderMgr::shader_iter fake_iter;
+LLViewerShaderMgr::shader_iter LLViewerShaderMgr::beginShaders() const {return fake_iter;}
+LLViewerShaderMgr::shader_iter LLViewerShaderMgr::endShaders() const {return fake_iter;}
+
+void LLViewerShaderMgr::updateShaderUniforms(LLGLSLShader* shader) {return;}
+std::string LLViewerShaderMgr::getShaderDirPrefix() {return "SHADER_DIR_PREFIX-";}
diff --git a/indra/newview/tests/llwlanimator_stub.cpp b/indra/newview/tests/llwlanimator_stub.cpp
new file mode 100644
index 0000000000..f5e15b2e7b
--- /dev/null
+++ b/indra/newview/tests/llwlanimator_stub.cpp
@@ -0,0 +1,29 @@
+/**
+ * @file llwlanimator_stub.cpp
+ * @brief stub class to allow unit testing
+ *
+ * $LicenseInfo:firstyear=2009&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+LLWLAnimator::LLWLAnimator(void) {}
+void LLWLAnimator::update(LLWLParamSet& set) {}
+void LLWLAnimator::setTrack(std::map<F32, LLWLParamKey>& track, F32 dayRate, F64 dayTime, bool run) {}
diff --git a/indra/newview/tests/llwldaycycle_stub.cpp b/indra/newview/tests/llwldaycycle_stub.cpp
new file mode 100644
index 0000000000..a7bc9a7b83
--- /dev/null
+++ b/indra/newview/tests/llwldaycycle_stub.cpp
@@ -0,0 +1,52 @@
+/**
+ * @file llwldaycycle_stub.cpp
+ * @brief stub class to allow unit testing
+ *
+ * $LicenseInfo:firstyear=2009&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+LLWLDayCycle::LLWLDayCycle(void)
+{
+}
+
+LLWLDayCycle::~LLWLDayCycle(void)
+{
+}
+
+bool LLWLDayCycle::getKeytime(LLWLParamKey keyFrame, F32& keyTime)
+{
+ keyTime = 0.5;
+ return true;
+}
+
+bool LLWLDayCycle::removeKeyframe(F32 time)
+{
+ return true;
+}
+
+void LLWLDayCycle::loadDayCycleFromFile(const std::string& fileName)
+{
+}
+
+void LLWLDayCycle::removeReferencesTo(const LLWLParamKey &keyframe)
+{
+}
diff --git a/indra/newview/tests/llwlparammanager_test.cpp b/indra/newview/tests/llwlparammanager_test.cpp
new file mode 100644
index 0000000000..be0dc9fd0c
--- /dev/null
+++ b/indra/newview/tests/llwlparammanager_test.cpp
@@ -0,0 +1,271 @@
+/**
+ * @file llwlparammanager_test.cpp
+ * @brief LLWLParamManager tests
+ *
+ * $LicenseInfo:firstyear=2009&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+// Precompiled headers
+#include "../llviewerprecompiledheaders.h"
+
+// Class to test
+#include "../llwlparammanager.h"
+
+// Dependencies
+#include "linden_common.h"
+
+// TUT header
+#include "lltut.h"
+
+// Stubs
+#include "llwldaycycle_stub.cpp"
+#include "llwlparamset_stub.cpp"
+#include "llwlanimator_stub.cpp"
+#include "llglslshader_stub.cpp"
+#include "lldir_stub.cpp"
+#include "llsky_stub.cpp"
+#include "llpipeline_stub.cpp"
+#include "llviewershadermgr_stub.cpp"
+
+void assert_glerror(void) {}
+LLViewerCamera::LLViewerCamera() {}
+void LLViewerCamera::setView(F32 vertical_fov_rads) {}
+std::string LLTrans::getString(const std::string &xml_desc, const LLStringUtil::format_map_t& args) { return std::string(""); }
+
+char* curl_unescape(const char* c_str, int length)
+{
+ char* copy = new char[length+4];
+ memcpy(copy, c_str, length);
+ copy[length+0] = 'E';
+ copy[length+1] = 'S';
+ copy[length+2] = 'C';
+ copy[length+3] = '\0';
+ return copy;
+}
+void curl_free(void* p) {delete[] ((char*)p);}
+char* curl_escape(const char* c_str, int length) {
+ char* copy = new char[length+6];
+ memcpy(copy, c_str, length);
+ copy[length+0] = 'U';
+ copy[length+1] = 'N';
+ copy[length+2] = 'E';
+ copy[length+3] = 'S';
+ copy[length+4] = 'C';
+ copy[length+5] = '\0';
+ return copy;
+}
+
+namespace tut
+{
+ // Main Setup
+ struct LLWLParamManagerFixture
+ {
+ class LLWLParamManagerTest
+ {
+ };
+
+ LLWLParamManager* mTestManager;
+
+ LLWLParamManagerFixture()
+ : mTestManager(LLWLParamManager::getInstance())
+ {
+ }
+
+ ~LLWLParamManagerFixture()
+ {
+ }
+ };
+ typedef test_group<LLWLParamManagerFixture> factory;
+ typedef factory::object object;
+ factory tf("LLWLParamManager test");
+
+ // Tests
+ template<> template<>
+ void object::test<1>()
+ {
+ try
+ {
+ std::string preset =
+ "<llsd>\
+ <map>\
+ <key>ambient</key>\
+ <array>\
+ <real>1.0499999523162842</real>\
+ <real>1.0499999523162842</real>\
+ <real>1.0499999523162842</real>\
+ <real>0.34999999403953552</real>\
+ </array>\
+ <key>blue_density</key>\
+ <array>\
+ <real>0.2447581488182351</real>\
+ <real>0.44872328639030457</real>\
+ <real>0.75999999046325684</real>\
+ <real>0.38000004053115788</real>\
+ </array>\
+ <key>blue_horizon</key>\
+ <array>\
+ <real>0.49548382097675159</real>\
+ <real>0.49548381382419748</real>\
+ <real>0.63999999284744291</real>\
+ <real>0.31999999642372146</real>\
+ </array>\
+ <key>cloud_color</key>\
+ <array>\
+ <real>0.40999999165535073</real>\
+ <real>0.40999999165535073</real>\
+ <real>0.40999999165535073</real>\
+ <real>0.40999999165535073</real>\
+ </array>\
+ <key>cloud_pos_density1</key>\
+ <array>\
+ <real>1.6884100437164307</real>\
+ <real>0.52609699964523315</real>\
+ <real>0.99999999999999289</real>\
+ <real>1</real>\
+ </array>\
+ <key>cloud_pos_density2</key>\
+ <array>\
+ <real>1.6884100437164307</real>\
+ <real>0.52609699964523315</real>\
+ <real>0.125</real>\
+ <real>1</real>\
+ </array>\
+ <key>cloud_scale</key>\
+ <array>\
+ <real>0.4199999868869746</real>\
+ <real>0</real>\
+ <real>0</real>\
+ <real>1</real>\
+ </array>\
+ <key>cloud_scroll_rate</key>\
+ <array>\
+ <real>10.199999809265137</real>\
+ <real>10.01099967956543</real>\
+ </array>\
+ <key>cloud_shadow</key>\
+ <array>\
+ <real>0.26999998092651367</real>\
+ <real>0</real>\
+ <real>0</real>\
+ <real>1</real>\
+ </array>\
+ <key>density_multiplier</key>\
+ <array>\
+ <real>0.00017999998817685818</real>\
+ <real>0</real>\
+ <real>0</real>\
+ <real>1</real>\
+ </array>\
+ <key>distance_multiplier</key>\
+ <array>\
+ <real>0.80000001192093606</real>\
+ <real>0</real>\
+ <real>0</real>\
+ <real>1</real>\
+ </array>\
+ <key>east_angle</key>\
+ <real>0</real>\
+ <key>enable_cloud_scroll</key>\
+ <array>\
+ <boolean>1</boolean>\
+ <boolean>1</boolean>\
+ </array>\
+ <key>gamma</key>\
+ <array>\
+ <real>1</real>\
+ <real>0</real>\
+ <real>0</real>\
+ <real>1</real>\
+ </array>\
+ <key>glow</key>\
+ <array>\
+ <real>5</real>\
+ <real>0.0010000000474974513</real>\
+ <real>-0.47999998927116394</real>\
+ <real>1</real>\
+ </array>\
+ <key>haze_density</key>\
+ <array>\
+ <real>0.69999998807907104</real>\
+ <real>0</real>\
+ <real>0</real>\
+ <real>1</real>\
+ </array>\
+ <key>haze_horizon</key>\
+ <array>\
+ <real>0.18999999761581243</real>\
+ <real>0.19915600121021271</real>\
+ <real>0.19915600121021271</real>\
+ <real>1</real>\
+ </array>\
+ <key>lightnorm</key>\
+ <array>\
+ <real>0</real>\
+ <real>0.70710659027099609</real>\
+ <real>-0.70710694789886475</real>\
+ <real>0</real>\
+ </array>\
+ <key>max_y</key>\
+ <array>\
+ <real>1605</real>\
+ <real>0</real>\
+ <real>0</real>\
+ <real>1</real>\
+ </array>\
+ <key>preset_num</key>\
+ <integer>22</integer>\
+ <key>star_brightness</key>\
+ <real>0</real>\
+ <key>sun_angle</key>\
+ <real>2.3561947345733643</real>\
+ <key>sunlight_color</key>\
+ <array>\
+ <real>0.73421055078505759</real>\
+ <real>0.78157895803450828</real>\
+ <real>0.89999997615813498</real>\
+ <real>0.29999998211860301</real>\
+ </array>\
+ </map>\
+ </llsd>";
+
+ std::stringstream preset_stream(preset);
+ mTestManager->loadPresetFromXML(LLWLParamKey("test1", LLWLParamKey::SCOPE_LOCAL), preset_stream);
+ LLWLParamSet dummy;
+ ensure("Couldn't get ParamSet after loading it", mTestManager->getParamSet(LLWLParamKey("test1", LLWLParamKey::SCOPE_LOCAL), dummy));
+ }
+ catch (...)
+ {
+ fail("loadPresetFromXML test crashed!");
+ }
+ }
+
+ template<> template<>
+ void object::test<2>()
+ {
+ mTestManager->propagateParameters();
+ ensure_equals("Wrong value from getDomeOffset()", mTestManager->getDomeOffset(), 0.96f);
+ ensure_equals("Wrong value from getDomeRadius()", mTestManager->getDomeRadius(), 15000.f);
+ ensure_equals("Wrong value from getLightDir()", mTestManager->getLightDir(), LLVector4(-0,0,1,0));
+ ensure_equals("Wrong value from getClampedLightDir()", mTestManager->getClampedLightDir(), LLVector4(-0,0,1,0));
+ ensure_equals("Wrong value from getRotatedLightDir()", mTestManager->getRotatedLightDir(), LLVector4(0,0,0,1));
+ }
+}
diff --git a/indra/newview/tests/llwlparamset_stub.cpp b/indra/newview/tests/llwlparamset_stub.cpp
new file mode 100644
index 0000000000..ccb99db475
--- /dev/null
+++ b/indra/newview/tests/llwlparamset_stub.cpp
@@ -0,0 +1,41 @@
+/**
+ * @file llwlparamset_stub.cpp
+ * @brief stub class to allow unit testing
+ *
+ * $LicenseInfo:firstyear=2009&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+LLWLParamSet::LLWLParamSet(void)
+{
+}
+
+void LLWLParamSet::updateCloudScrolling()
+{
+}
+
+void LLWLParamSet::set(const std::string& name, const LLVector4& val)
+{
+}
+
+void LLWLParamSet::update(LLGLSLShader *shader) const
+{
+}
diff --git a/indra/newview/tests/llworldmap_test.cpp b/indra/newview/tests/llworldmap_test.cpp
index b976ac5ea9..acc6e814bc 100644
--- a/indra/newview/tests/llworldmap_test.cpp
+++ b/indra/newview/tests/llworldmap_test.cpp
@@ -25,13 +25,16 @@
* $/LicenseInfo$
*/
-// Precompiled header: almost always required for newview cpp files
-#include "../llviewerprecompiledheaders.h"
-// Class to test
-#include "../llworldmap.h"
// Dependencies
-#include "../llviewerimagelist.h"
+#include "linden_common.h"
+#include "llapr.h"
+#include "llsingleton.h"
+#include "lltrans.h"
+#include "lluistring.h"
+#include "../llviewertexture.h"
#include "../llworldmapmessage.h"
+// Class to test
+#include "../llworldmap.h"
// Tut header
#include "../test/lltut.h"
@@ -44,34 +47,29 @@
// * A simulator for a class can be implemented here. Please comment and document thoroughly.
// Stub image calls
-LLViewerImageList::LLViewerImageList() { }
-LLViewerImageList::~LLViewerImageList() { }
-LLViewerImageList gImageList;
-LLViewerImage* LLViewerImageList::getImage(const LLUUID &image_id,
- BOOL usemipmaps,
- BOOL level_immediate,
- LLGLint internal_format,
- LLGLenum primary_format,
- LLHost request_from_host)
-{ return NULL; }
-void LLViewerImage::setBoostLevel(S32 level) { }
-void LLImageGL::setAddressMode(LLTexUnit::eTextureAddressMode mode) { }
+void LLViewerTexture::setBoostLevel(S32 ) { }
+void LLViewerTexture::setAddressMode(LLTexUnit::eTextureAddressMode ) { }
+LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTexture(const LLUUID&, BOOL, LLViewerTexture::EBoostLevel, S8,
+ LLGLint, LLGLenum, LLHost ) { return NULL; }
// Stub related map calls
LLWorldMapMessage::LLWorldMapMessage() { }
LLWorldMapMessage::~LLWorldMapMessage() { }
void LLWorldMapMessage::sendItemRequest(U32 type, U64 handle) { }
void LLWorldMapMessage::sendMapBlockRequest(U16 min_x, U16 min_y, U16 max_x, U16 max_y, bool return_nonexistent) { }
+
LLWorldMipmap::LLWorldMipmap() { }
LLWorldMipmap::~LLWorldMipmap() { }
void LLWorldMipmap::reset() { }
void LLWorldMipmap::dropBoostLevels() { }
void LLWorldMipmap::equalizeBoostLevels() { }
-LLPointer<LLViewerImage> LLWorldMipmap::getObjectsTile(U32 grid_x, U32 grid_y, S32 level, bool load)
-{ return NULL; }
+LLPointer<LLViewerFetchedTexture> LLWorldMipmap::getObjectsTile(U32 grid_x, U32 grid_y, S32 level, bool load) { return NULL; }
// Stub other stuff
-BOOL gPacificDaylightTime;
+std::string LLTrans::getString(const std::string &, const LLStringUtil::format_map_t& ) { return std::string("test_trans"); }
+void LLUIString::updateResult() const { }
+void LLUIString::setArg(const std::string& , const std::string& ) { }
+void LLUIString::assign(const std::string& ) { }
// End Stubbing
// -------------------------------------------------------------------------------------------
@@ -237,7 +235,7 @@ namespace tut
// Test 9 : setLandForSaleImage() / getLandForSaleImage()
LLUUID id;
mSim->setLandForSaleImage(id);
- LLPointer<LLViewerImage> image = mSim->getLandForSaleImage();
+ LLPointer<LLViewerFetchedTexture> image = mSim->getLandForSaleImage();
ensure("LLSimInfo::getLandForSaleImage() test failed", image.isNull());
// Test 10 : isPG()
mSim->setAccess(SIM_ACCESS_PG);
@@ -370,7 +368,7 @@ namespace tut
}
// Test 7 : getObjectsTile()
try {
- LLPointer<LLViewerImage> image = mWorld->getObjectsTile((U32)(X_WORLD_TEST/REGION_WIDTH_METERS), (U32)(Y_WORLD_TEST/REGION_WIDTH_METERS), 1);
+ LLPointer<LLViewerFetchedTexture> image = mWorld->getObjectsTile((U32)(X_WORLD_TEST/REGION_WIDTH_METERS), (U32)(Y_WORLD_TEST/REGION_WIDTH_METERS), 1);
ensure("LLWorldMap::getObjectsTile() failed", image.isNull());
} catch (...) {
fail("LLWorldMap::getObjectsTile() test failed with exception");
diff --git a/indra/newview/tests/llworldmipmap_test.cpp b/indra/newview/tests/llworldmipmap_test.cpp
index 54887ae219..e7ef017760 100644
--- a/indra/newview/tests/llworldmipmap_test.cpp
+++ b/indra/newview/tests/llworldmipmap_test.cpp
@@ -25,12 +25,12 @@
* $/LicenseInfo$
*/
-// Precompiled header: almost always required for newview cpp files
-#include "../llviewerprecompiledheaders.h"
+// Dependencies
+#include "linden_common.h"
+#include "../llviewertexture.h"
+#include "../llviewercontrol.h"
// Class to test
#include "../llworldmipmap.h"
-// Dependencies
-#include "../llviewerimagelist.h"
// Tut header
#include "../test/lltut.h"
@@ -42,19 +42,14 @@
// * Do not make any assumption as to how those classes or methods work (i.e. don't copy/paste code)
// * A simulator for a class can be implemented here. Please comment and document thoroughly.
-LLViewerImageList::LLViewerImageList() { }
-LLViewerImageList::~LLViewerImageList() { }
-
-LLViewerImageList gImageList;
+void LLViewerTexture::setBoostLevel(S32 ) { }
+LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTextureFromUrl(const std::string&, BOOL, LLViewerTexture::EBoostLevel, S8,
+ LLGLint, LLGLenum, const LLUUID& ) { return NULL; }
-LLViewerImage* LLViewerImageList::getImageFromUrl(const std::string& url,
- BOOL usemipmaps,
- BOOL level_immediate,
- LLGLint internal_format,
- LLGLenum primary_format,
- const LLUUID& force_id)
-{ return NULL; }
-void LLViewerImage::setBoostLevel(S32 level) { }
+LLControlGroup::LLControlGroup(const std::string& name) : LLInstanceTracker<LLControlGroup, std::string>(name) { }
+LLControlGroup::~LLControlGroup() { }
+std::string LLControlGroup::getString(const std::string& ) { return std::string("test_url"); }
+LLControlGroup gSavedSettings("test_settings");
// End Stubbing
// -------------------------------------------------------------------------------------------
@@ -105,9 +100,9 @@ namespace tut
{
S32 level = mMap->scaleToLevel(0.0);
ensure("scaleToLevel() test 1 failed", level == LLWorldMipmap::MAP_LEVELS);
- level = mMap->scaleToLevel(LLWorldMipmap::MAP_TILE_SIZE);
+ level = mMap->scaleToLevel((F32)LLWorldMipmap::MAP_TILE_SIZE);
ensure("scaleToLevel() test 2 failed", level == 1);
- level = mMap->scaleToLevel(10 * LLWorldMipmap::MAP_TILE_SIZE);
+ level = mMap->scaleToLevel(10.f * LLWorldMipmap::MAP_TILE_SIZE);
ensure("scaleToLevel() test 3 failed", level == 1);
}
// Test 2 : globalToMipmap()
diff --git a/indra/newview/tests/llxmlrpclistener_test.cpp b/indra/newview/tests/llxmlrpclistener_test.cpp
index 4d5df1043e..711c2a3d51 100644
--- a/indra/newview/tests/llxmlrpclistener_test.cpp
+++ b/indra/newview/tests/llxmlrpclistener_test.cpp
@@ -40,8 +40,10 @@
#include "llevents.h"
#include "lleventfilter.h"
#include "llsd.h"
+#include "llhost.h"
#include "llcontrol.h"
#include "tests/wrapllerrs.h"
+#include "tests/commtest.h"
LLControlGroup gSavedSettings("Global");
@@ -54,7 +56,8 @@ namespace tut
{
data():
pumps(LLEventPumps::instance()),
- uri("http://127.0.0.1:8000")
+ uri(std::string("http://") +
+ LLHost("127.0.0.1", commtest_data::getport("PORT")).getString())
{
// These variables are required by machinery used by
// LLXMLRPCTransaction. The values reflect reality for this test
@@ -145,7 +148,7 @@ namespace tut
pumps.obtain("LLXMLRPCTransaction").post(request);
// Set the timer
F32 timeout(10);
- watchdog.eventAfter(timeout, LLSD().insert("timeout", 0));
+ watchdog.eventAfter(timeout, LLSD().with("timeout", 0));
// and pump "mainloop" until we get something, whether from
// LLXMLRPCListener or from the watchdog filter.
LLTimer timer;
@@ -182,7 +185,7 @@ namespace tut
pumps.obtain("LLXMLRPCTransaction").post(request);
// Set the timer
F32 timeout(10);
- watchdog.eventAfter(timeout, LLSD().insert("timeout", 0));
+ watchdog.eventAfter(timeout, LLSD().with("timeout", 0));
// and pump "mainloop" until we get something, whether from
// LLXMLRPCListener or from the watchdog filter.
LLTimer timer;
@@ -218,7 +221,7 @@ namespace tut
pumps.obtain("LLXMLRPCTransaction").post(request);
// Set the timer
F32 timeout(10);
- watchdog.eventAfter(timeout, LLSD().insert("timeout", 0));
+ watchdog.eventAfter(timeout, LLSD().with("timeout", 0));
// and pump "mainloop" until we get something, whether from
// LLXMLRPCListener or from the watchdog filter.
LLTimer timer;
diff --git a/indra/newview/tests/test_llxmlrpc_peer.py b/indra/newview/tests/test_llxmlrpc_peer.py
index aeebb0cfd1..281b72a058 100644
--- a/indra/newview/tests/test_llxmlrpc_peer.py
+++ b/indra/newview/tests/test_llxmlrpc_peer.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/env python
"""\
@file test_llxmlrpc_peer.py
@author Nat Goodspeed
@@ -37,7 +37,7 @@ from SimpleXMLRPCServer import SimpleXMLRPCServer
mydir = os.path.dirname(__file__) # expected to be .../indra/newview/tests/
sys.path.insert(0, os.path.join(mydir, os.pardir, os.pardir, "lib", "python"))
sys.path.insert(1, os.path.join(mydir, os.pardir, os.pardir, "llmessage", "tests"))
-from testrunner import run, debug
+from testrunner import freeport, run, debug
class TestServer(SimpleXMLRPCServer):
def _dispatch(self, method, params):
@@ -66,11 +66,16 @@ class TestServer(SimpleXMLRPCServer):
# Suppress error output as well
pass
-class ServerRunner(Thread):
- def run(self):
- server = TestServer(('127.0.0.1', 8000))
- debug("Starting XMLRPC server...\n")
- server.serve_forever()
-
if __name__ == "__main__":
- sys.exit(run(server=ServerRunner(name="xmlrpc"), *sys.argv[1:]))
+ # Instantiate a TestServer on the first free port in the specified port
+ # range. Doing this inline is better than in a daemon thread: if it blows
+ # up here, we'll get a traceback. If it blew up in some other thread, the
+ # traceback would get eaten and we'd run the subject test program anyway.
+ xmlrpcd, port = freeport(xrange(8000, 8020),
+ lambda port: TestServer(('127.0.0.1', port)))
+ # Pass the selected port number to the subject test program via the
+ # environment. We don't want to impose requirements on the test program's
+ # command-line parsing -- and anyway, for C++ integration tests, that's
+ # performed in TUT code rather than our own.
+ os.environ["PORT"] = str(port)
+ sys.exit(run(server=Thread(name="xmlrpc", target=xmlrpcd.serve_forever), *sys.argv[1:]))
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index 1bc118139f..9bf755c8f8 100644
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -1,34 +1,37 @@
-#!/usr/bin/python
-# @file viewer_manifest.py
-# @author Ryan Williams
-# @brief Description of all installer viewer files, and methods for packaging
-# them into installers for all supported platforms.
-#
-# $LicenseInfo:firstyear=2006&license=viewerlgpl$
-# Second Life Viewer Source Code
-# Copyright (C) 2010, Linden Research, Inc.
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation;
-# version 2.1 of the License only.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-#
-# Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
-# $/LicenseInfo$
+#!/usr/bin/env python
+"""\
+@file viewer_manifest.py
+@author Ryan Williams
+@brief Description of all installer viewer files, and methods for packaging
+ them into installers for all supported platforms.
+
+$LicenseInfo:firstyear=2006&license=viewerlgpl$
+Second Life Viewer Source Code
+Copyright (C) 2006-2011, Linden Research, Inc.
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation;
+version 2.1 of the License only.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+$/LicenseInfo$
+"""
import sys
import os.path
import re
import tarfile
import time
+import random
viewer_dir = os.path.dirname(__file__)
# add llmanifest library to our path so we don't have to muck with PYTHONPATH
sys.path.append(os.path.join(viewer_dir, '../lib/python/indra/util'))
@@ -60,6 +63,32 @@ class ViewerManifest(LLManifest):
# include the entire shaders directory recursively
self.path("shaders")
+ # include the extracted list of contributors
+ contributor_names = self.extract_names("../../doc/contributions.txt")
+ self.put_in_file(contributor_names, "contributors.txt")
+ self.file_list.append(["../../doc/contributions.txt",self.dst_path_of("contributors.txt")])
+ # include the extracted list of translators
+ translator_names = self.extract_names("../../doc/translations.txt")
+ self.put_in_file(translator_names, "translators.txt")
+ self.file_list.append(["../../doc/translations.txt",self.dst_path_of("translators.txt")])
+ # include the list of Lindens (if any)
+ # see https://wiki.lindenlab.com/wiki/Generated_Linden_Credits
+ linden_names_path = os.getenv("LINDEN_CREDITS")
+ if linden_names_path :
+ try:
+ linden_file = open(linden_names_path,'r')
+ # all names should be one line, but the join below also converts to a string
+ linden_names = ', '.join(linden_file.readlines())
+ self.put_in_file(linden_names, "lindens.txt")
+ linden_file.close()
+ print "Linden names extracted from '%s'" % linden_names_path
+ self.file_list.append([linden_names_path,self.dst_path_of("lindens.txt")])
+ except IOError:
+ print "No Linden names found at '%s', using built-in list" % linden_names_path
+ pass
+ else :
+ print "No 'LINDEN_CREDITS' specified in environment, using built-in list"
+
# ... and the entire windlight directory
self.path("windlight")
self.end_prefix("app_settings")
@@ -112,6 +141,16 @@ class ViewerManifest(LLManifest):
# Files in the newview/ directory
self.path("gpu_table.txt")
+ # The summary.json file gets left in the base checkout dir by
+ # build.sh. It's only created for a build.sh build, therefore we
+ # have to check whether it exists. :-P
+ summary_json = "summary.json"
+ summary_json_path = os.path.join(os.pardir, os.pardir, summary_json)
+ if os.path.exists(os.path.join(self.get_src_prefix(), summary_json_path)):
+ self.path(summary_json_path, summary_json)
+ else:
+ print "No %s" % os.path.join(self.get_src_prefix(), summary_json_path)
+
def login_channel(self):
"""Channel reported for login and upgrade purposes ONLY;
used for A/B testing"""
@@ -131,6 +170,21 @@ class ViewerManifest(LLManifest):
def channel_lowerword(self):
return self.channel_oneword().lower()
+ def icon_path(self):
+ icon_path="icons/"
+ channel_type=self.channel_lowerword()
+ if channel_type == 'release' \
+ or channel_type == 'development' \
+ :
+ icon_path += channel_type
+ elif channel_type == 'betaviewer' :
+ icon_path += 'beta'
+ elif re.match('project.*',channel_type) :
+ icon_path += 'project'
+ else :
+ icon_path += 'test'
+ return icon_path
+
def flags_list(self):
""" Convenience function that returns the command-line flags
for the grid"""
@@ -162,6 +216,28 @@ class ViewerManifest(LLManifest):
return " ".join((channel_flags, grid_flags, setting_flags)).strip()
+ def extract_names(self,src):
+ try:
+ contrib_file = open(src,'r')
+ except IOError:
+ print "Failed to open '%s'" % src
+ raise
+ lines = contrib_file.readlines()
+ contrib_file.close()
+
+ # All lines up to and including the first blank line are the file header; skip them
+ lines.reverse() # so that pop will pull from first to last line
+ while not re.match("\s*$", lines.pop()) :
+ pass # do nothing
+
+ # A line that starts with a non-whitespace character is a name; all others describe contributions, so collect the names
+ names = []
+ for line in lines :
+ if re.match("\S", line) :
+ names.append(line.rstrip())
+ # It's not fair to always put the same people at the head of the list
+ random.shuffle(names)
+ return ', '.join(names)
class WindowsManifest(ViewerManifest):
def final_exe(self):
@@ -219,22 +295,25 @@ class WindowsManifest(ViewerManifest):
else:
print "Doesn't exist:", src
- def enable_crt_manifest_check(self):
- if self.is_packaging_viewer():
- WindowsManifest.copy_action = WindowsManifest.test_msvcrt_and_copy_action
+ ### DISABLED MANIFEST CHECKING for vs2010. we may need to reenable this
+ # shortly. If this hasn't been reenabled by the 2.9 viewer release then it
+ # should be deleted -brad
+ #def enable_crt_manifest_check(self):
+ # if self.is_packaging_viewer():
+ # WindowsManifest.copy_action = WindowsManifest.test_msvcrt_and_copy_action
- def enable_no_crt_manifest_check(self):
- if self.is_packaging_viewer():
- WindowsManifest.copy_action = WindowsManifest.test_for_no_msvcrt_manifest_and_copy_action
+ #def enable_no_crt_manifest_check(self):
+ # if self.is_packaging_viewer():
+ # WindowsManifest.copy_action = WindowsManifest.test_for_no_msvcrt_manifest_and_copy_action
- def disable_manifest_check(self):
- if self.is_packaging_viewer():
- del WindowsManifest.copy_action
+ #def disable_manifest_check(self):
+ # if self.is_packaging_viewer():
+ # del WindowsManifest.copy_action
def construct(self):
super(WindowsManifest, self).construct()
- self.enable_crt_manifest_check()
+ #self.enable_crt_manifest_check()
if self.is_packaging_viewer():
# Find secondlife-bin.exe in the 'configuration' dir, then rename it to the result of final_exe.
@@ -245,33 +324,40 @@ class WindowsManifest(ViewerManifest):
'llplugin', 'slplugin', self.args['configuration'], "slplugin.exe"),
"slplugin.exe")
- self.disable_manifest_check()
+ #self.disable_manifest_check()
self.path(src="../viewer_components/updater/scripts/windows/update_install.bat", dst="update_install.bat")
-
# Get shared libs from the shared libs staging directory
if self.prefix(src=os.path.join(os.pardir, 'sharedlibs', self.args['configuration']),
dst=""):
- self.enable_crt_manifest_check()
-
- # Get kdu dll, continue if missing.
- try:
- self.path('llkdu.dll', dst='llkdu.dll')
- except RuntimeError:
- print "Skipping llkdu.dll"
-
+ #self.enable_crt_manifest_check()
+
# Get llcommon and deps. If missing assume static linkage and continue.
try:
self.path('llcommon.dll')
self.path('libapr-1.dll')
self.path('libaprutil-1.dll')
self.path('libapriconv-1.dll')
+
except RuntimeError, err:
print err.message
print "Skipping llcommon.dll (assuming llcommon was linked statically)"
- self.disable_manifest_check()
+ #self.disable_manifest_check()
+
+ # Mesh 3rd party libs needed for auto LOD and collada reading
+ try:
+ if self.args['configuration'].lower() == 'debug':
+ self.path("libcollada14dom22-d.dll")
+ else:
+ self.path("libcollada14dom22.dll")
+
+ self.path("glod.dll")
+ except RuntimeError, err:
+ print err.message
+ print "Skipping COLLADA and GLOD libraries (assumming linked statically)"
+
# Get fmod dll, continue if missing
try:
@@ -288,13 +374,11 @@ class WindowsManifest(ViewerManifest):
# These need to be installed as a SxS assembly, currently a 'private' assembly.
# See http://msdn.microsoft.com/en-us/library/ms235291(VS.80).aspx
if self.args['configuration'].lower() == 'debug':
- self.path("msvcr80d.dll")
- self.path("msvcp80d.dll")
- self.path("Microsoft.VC80.DebugCRT.manifest")
+ self.path("msvcr100d.dll")
+ self.path("msvcp100d.dll")
else:
- self.path("msvcr80.dll")
- self.path("msvcp80.dll")
- self.path("Microsoft.VC80.CRT.manifest")
+ self.path("msvcr100.dll")
+ self.path("msvcp100.dll")
# Vivox runtimes
self.path("SLVoice.exe")
@@ -304,6 +388,10 @@ class WindowsManifest(ViewerManifest):
self.path("zlib1.dll")
self.path("vivoxplatform.dll")
self.path("vivoxoal.dll")
+
+ # Security
+ self.path("ssleay32.dll")
+ self.path("libeay32.dll")
# For google-perftools tcmalloc allocator.
try:
@@ -320,11 +408,8 @@ class WindowsManifest(ViewerManifest):
self.path("featuretable.txt")
self.path("featuretable_xp.txt")
- # For use in crash reporting (generates minidumps)
- self.path("dbghelp.dll")
+ #self.enable_no_crt_manifest_check()
- self.enable_no_crt_manifest_check()
-
# Media plugins - QuickTime
if self.prefix(src='../media_plugins/quicktime/%s' % self.args['configuration'], dst="llplugin"):
self.path("media_plugin_quicktime.dll")
@@ -336,13 +421,13 @@ class WindowsManifest(ViewerManifest):
self.end_prefix()
# winmm.dll shim
- if self.prefix(src='../media_plugins/winmmshim/%s' % self.args['configuration'], dst="llplugin"):
+ if self.prefix(src='../media_plugins/winmmshim/%s' % self.args['configuration'], dst=""):
self.path("winmm.dll")
self.end_prefix()
if self.args['configuration'].lower() == 'debug':
- if self.prefix(src=os.path.join(os.pardir, os.pardir, 'libraries', 'i686-win32', 'lib', 'debug'),
+ if self.prefix(src=os.path.join(os.pardir, 'packages', 'lib', 'debug'),
dst="llplugin"):
self.path("libeay32.dll")
self.path("qtcored4.dll")
@@ -373,7 +458,7 @@ class WindowsManifest(ViewerManifest):
self.end_prefix()
else:
- if self.prefix(src=os.path.join(os.pardir, os.pardir, 'libraries', 'i686-win32', 'lib', 'release'),
+ if self.prefix(src=os.path.join(os.pardir, 'packages', 'lib', 'release'),
dst="llplugin"):
self.path("libeay32.dll")
self.path("qtcore4.dll")
@@ -404,14 +489,15 @@ class WindowsManifest(ViewerManifest):
self.end_prefix()
- self.disable_manifest_check()
+ #self.disable_manifest_check()
# pull in the crash logger and updater from other projects
# tag:"crash-logger" here as a cue to the exporter
self.path(src='../win_crash_logger/%s/windows-crash-logger.exe' % self.args['configuration'],
dst="win_crash_logger.exe")
- self.path(src='../win_updater/%s/windows-updater.exe' % self.args['configuration'],
- dst="updater.exe")
+# For CHOP-397, windows updater no longer used.
+# self.path(src='../win_updater/%s/windows-updater.exe' % self.args['configuration'],
+# dst="updater.exe")
if not self.is_packaging_viewer():
self.package_file = "copied_deps"
@@ -488,10 +574,10 @@ class WindowsManifest(ViewerManifest):
grid_vars_template = """
OutFile "%(installer_file)s"
!define INSTFLAGS "%(flags)s"
- !define INSTNAME "SecondLifeViewer2"
- !define SHORTCUT "Second Life Viewer 2"
+ !define INSTNAME "SecondLifeViewer"
+ !define SHORTCUT "Second Life Viewer"
!define URLNAME "secondlife"
- Caption "Second Life ${VERSION}"
+ Caption "Second Life"
"""
else:
# beta grid viewer
@@ -572,7 +658,7 @@ class DarwinManifest(ViewerManifest):
self.path("Info-SecondLife.plist", dst="Info.plist")
# copy additional libs in <bundle>/Contents/MacOS/
- self.path("../../libraries/universal-darwin/lib_release/libndofdev.dylib", dst="MacOS/libndofdev.dylib")
+ self.path("../packages/lib/release/libndofdev.dylib", dst="Resources/libndofdev.dylib")
self.path("../viewer_components/updater/scripts/darwin/update_install", "MacOS/update_install")
@@ -588,12 +674,11 @@ class DarwinManifest(ViewerManifest):
self.path("featuretable_mac.txt")
self.path("SecondLife.nib")
- # If we are not using the default channel, use the 'Firstlook
- # icon' to show that it isn't a stable release.
- if self.default_channel() and self.default_grid():
+ icon_path = self.icon_path()
+ if self.prefix(src=icon_path, dst="") :
self.path("secondlife.icns")
- else:
- self.path("secondlife_firstlook.icns", "secondlife.icns")
+ self.end_prefix(icon_path)
+
self.path("SecondLife.nib")
# Translations
@@ -614,41 +699,40 @@ class DarwinManifest(ViewerManifest):
self.path("uk.lproj")
self.path("zh-Hans.lproj")
- # SLVoice and vivox lols
- self.path("vivox-runtime/universal-darwin/libsndfile.dylib", "libsndfile.dylib")
- self.path("vivox-runtime/universal-darwin/libvivoxoal.dylib", "libvivoxoal.dylib")
- self.path("vivox-runtime/universal-darwin/libortp.dylib", "libortp.dylib")
- self.path("vivox-runtime/universal-darwin/libvivoxsdk.dylib", "libvivoxsdk.dylib")
- self.path("vivox-runtime/universal-darwin/libvivoxplatform.dylib", "libvivoxplatform.dylib")
- self.path("vivox-runtime/universal-darwin/SLVoice", "SLVoice")
-
- libdir = "../../libraries/universal-darwin/lib_release"
+ libdir = "../packages/lib/release"
dylibs = {}
- # need to get the kdu dll from any of the build directories as well
- for lib in "llkdu", "llcommon":
- libfile = "lib%s.dylib" % lib
- try:
- self.path(self.find_existing_file(os.path.join(os.pardir,
- lib,
- self.args['configuration'],
- libfile),
- os.path.join(libdir, libfile)),
- dst=libfile)
- except RuntimeError:
- print "Skipping %s" % libfile
- dylibs[lib] = False
- else:
- dylibs[lib] = True
+ # Need to get the llcommon dll from any of the build directories as well
+ lib = "llcommon"
+ libfile = "lib%s.dylib" % lib
+ try:
+ self.path(self.find_existing_file(os.path.join(os.pardir,
+ lib,
+ self.args['configuration'],
+ libfile),
+ os.path.join(libdir, libfile)),
+ dst=libfile)
+ except RuntimeError:
+ print "Skipping %s" % libfile
+ dylibs[lib] = False
+ else:
+ dylibs[lib] = True
if dylibs["llcommon"]:
- for libfile in ("libapr-1.0.3.7.dylib",
- "libaprutil-1.0.3.8.dylib",
- "libexpat.0.5.0.dylib",
+ for libfile in ("libapr-1.0.dylib",
+ "libaprutil-1.0.dylib",
+ "libexpat.1.5.2.dylib",
"libexception_handler.dylib",
+ "libGLOD.dylib",
+ "libcollada14dom.dylib"
):
self.path(os.path.join(libdir, libfile), libfile)
+ # SLVoice and vivox lols
+ for libfile in ('libsndfile.dylib', 'libvivoxoal.dylib', 'libortp.dylib', \
+ 'libvivoxsdk.dylib', 'libvivoxplatform.dylib', 'SLVoice') :
+ self.path(os.path.join(libdir, libfile), libfile)
+
try:
# FMOD for sound
self.path(self.args['configuration'] + "/libfmodwrapper.dylib", "libfmodwrapper.dylib")
@@ -668,10 +752,12 @@ class DarwinManifest(ViewerManifest):
mac_updater_res_path = self.dst_path_of("mac-updater.app/Contents/Resources")
slplugin_res_path = self.dst_path_of("SLPlugin.app/Contents/Resources")
for libfile in ("libllcommon.dylib",
- "libapr-1.0.3.7.dylib",
- "libaprutil-1.0.3.8.dylib",
- "libexpat.0.5.0.dylib",
+ "libapr-1.0.dylib",
+ "libaprutil-1.0.dylib",
+ "libexpat.1.5.2.dylib",
"libexception_handler.dylib",
+ "libGLOD.dylib",
+ "libcollada14dom.dylib"
):
target_lib = os.path.join('../../..', libfile)
self.run_command("ln -sf %(target)r %(link)r" %
@@ -691,7 +777,7 @@ class DarwinManifest(ViewerManifest):
if self.prefix(src="", dst="llplugin"):
self.path("../media_plugins/quicktime/" + self.args['configuration'] + "/media_plugin_quicktime.dylib", "media_plugin_quicktime.dylib")
self.path("../media_plugins/webkit/" + self.args['configuration'] + "/media_plugin_webkit.dylib", "media_plugin_webkit.dylib")
- self.path("../../libraries/universal-darwin/lib_release/libllqtwebkit.dylib", "libllqtwebkit.dylib")
+ self.path("../packages/lib/release/libllqtwebkit.dylib", "libllqtwebkit.dylib")
self.end_prefix("llplugin")
@@ -712,8 +798,14 @@ class DarwinManifest(ViewerManifest):
{ 'viewer_binary' : self.dst_path_of('Contents/MacOS/Second Life')})
+ def copy_finish(self):
+ # Force executable permissions to be set for scripts
+ # see CHOP-223 and http://mercurial.selenic.com/bts/issue1802
+ for script in 'Contents/MacOS/update_install',:
+ self.run_command("chmod +x %r" % os.path.join(self.get_dst_prefix(), script))
+
def package_finish(self):
- channel_standin = 'Second Life Viewer 2' # hah, our default channel is not usable on its own
+ channel_standin = 'Second Life Viewer' # hah, our default channel is not usable on its own
if not self.default_channel():
channel_standin = self.channel()
@@ -767,9 +859,7 @@ class DarwinManifest(ViewerManifest):
# will use the release .DS_Store, and will look broken.
# - Ambroff 2008-08-20
dmg_template = os.path.join(
- 'installers',
- 'darwin',
- '%s-dmg' % "".join(self.channel_unique().split()).lower())
+ 'installers', 'darwin', '%s-dmg' % self.channel_lowerword())
if not os.path.exists (self.src_path_of(dmg_template)):
dmg_template = os.path.join ('installers', 'darwin', 'release-dmg')
@@ -802,7 +892,7 @@ class DarwinManifest(ViewerManifest):
self.run_command('SetFile -a V %r' % pathname)
# Create the alias file (which is a resource file) from the .r
- self.run_command('rez %r -o %r' %
+ self.run_command('Rez %r -o %r' %
(self.src_path_of("installers/darwin/release-dmg/Applications-alias.r"),
os.path.join(volpath, "Applications")))
@@ -825,7 +915,6 @@ class LinuxManifest(ViewerManifest):
def construct(self):
super(LinuxManifest, self).construct()
self.path("licenses-linux.txt","licenses.txt")
- self.path("res/ll_icon.png","secondlife_icon.png")
if self.prefix("linux_tools", dst=""):
self.path("client-readme.txt","README-linux.txt")
self.path("client-readme-voice.txt","README-linux-voice.txt")
@@ -851,6 +940,15 @@ class LinuxManifest(ViewerManifest):
# recurse
self.end_prefix("res-sdl")
+ # Get the icons based on the channel
+ icon_path = self.icon_path()
+ if self.prefix(src=icon_path, dst="") :
+ self.path("secondlife_256.png","secondlife_icon.png")
+ if self.prefix(src="",dst="res-sdl") :
+ self.path("secondlife_256.BMP","ll_icon.BMP")
+ self.end_prefix("res-sdl")
+ self.end_prefix(icon_path)
+
self.path("../viewer_components/updater/scripts/linux/update_install", "bin/update_install")
# plugins
@@ -866,6 +964,12 @@ class LinuxManifest(ViewerManifest):
self.path("featuretable_linux.txt")
+ def copy_finish(self):
+ # Force executable permissions to be set for scripts
+ # see CHOP-223 and http://mercurial.selenic.com/bts/issue1802
+ for script in 'secondlife', 'bin/update_install':
+ self.run_command("chmod +x %r" % os.path.join(self.get_dst_prefix(), script))
+
def package_finish(self):
if 'installer_name' in self.args:
installer_name = self.args['installer_name']
@@ -920,36 +1024,46 @@ class Linux_i686Manifest(LinuxManifest):
def construct(self):
super(Linux_i686Manifest, self).construct()
- # install either the libllkdu we just built, or a prebuilt one, in
- # decreasing order of preference. for linux package, this goes to bin/
- try:
- self.path(self.find_existing_file('../llkdu/libllkdu.so',
- '../../libraries/i686-linux/lib_release_client/libllkdu.so'),
- dst='bin/libllkdu.so')
- except:
- print "Skipping libllkdu.so - not found"
-
- if self.prefix("../../libraries/i686-linux/lib_release_client", dst="lib"):
+ if self.prefix("../packages/lib/release", dst="lib"):
+ self.path("libapr-1.so")
self.path("libapr-1.so.0")
+ self.path("libapr-1.so.0.4.2")
+ self.path("libaprutil-1.so")
self.path("libaprutil-1.so.0")
- self.path("libbreakpad_client.so.0.0.0", "libbreakpad_client.so.0")
- self.path("libdb-4.2.so")
- self.path("libcrypto.so.0.9.7")
- self.path("libexpat.so.1")
- self.path("libssl.so.0.9.7")
- self.path("libuuid.so.1")
+ self.path("libaprutil-1.so.0.3.10")
+ self.path("libbreakpad_client.so.0.0.0")
+ self.path("libbreakpad_client.so.0")
+ self.path("libbreakpad_client.so")
+ self.path("libcollada14dom.so")
+ self.path("libdb-5.1.so")
+ self.path("libdb-5.so")
+ self.path("libdb.so")
+ self.path("libcrypto.so.1.0.0")
+ self.path("libexpat.so.1.5.2")
+ self.path("libssl.so.1.0.0")
+ self.path("libglod.so")
+ self.path("libminizip.so")
+ self.path("libuuid.so")
+ self.path("libuuid.so.16")
+ self.path("libuuid.so.16.0.22")
+ self.path("libSDL-1.2.so.0.11.3")
self.path("libSDL-1.2.so.0")
- self.path("libELFIO.so")
- self.path("libopenjpeg.so.1.3.0", "libopenjpeg.so.1.3")
+ self.path("libdirectfb-1.4.so.5.0.4")
+ self.path("libdirectfb-1.4.so.5")
+ self.path("libfusion-1.4.so.5.0.4")
+ self.path("libfusion-1.4.so.5")
+ self.path("libdirect-1.4.so.5.0.4")
+ self.path("libdirect-1.4.so.5")
+ self.path("libopenjpeg.so.1.4.0")
+ self.path("libopenjpeg.so.1")
+ self.path("libopenjpeg.so")
self.path("libalut.so")
self.path("libopenal.so", "libopenal.so.1")
self.path("libopenal.so", "libvivoxoal.so.1") # vivox's sdk expects this soname
- try:
- self.path("libkdu.so")
- pass
- except:
- print "Skipping libkdu.so - not found"
- pass
+ self.path("libfontconfig.so.1.4.4")
+ self.path("libtcmalloc.so", "libtcmalloc.so") #formerly called google perf tools
+ self.path("libtcmalloc.so.0", "libtcmalloc.so.0") #formerly called google perf tools
+ self.path("libtcmalloc.so.0.1.0", "libtcmalloc.so.0.1.0") #formerly called google perf tools
try:
self.path("libfmod-3.75.so")
pass
@@ -959,10 +1073,10 @@ class Linux_i686Manifest(LinuxManifest):
self.end_prefix("lib")
# Vivox runtimes
- if self.prefix(src="vivox-runtime/i686-linux", dst="bin"):
+ if self.prefix(src="../packages/lib/release", dst="bin"):
self.path("SLVoice")
self.end_prefix()
- if self.prefix(src="vivox-runtime/i686-linux", dst="lib"):
+ if self.prefix(src="../packages/lib/release", dst="lib"):
self.path("libortp.so")
self.path("libsndfile.so.1")
#self.path("libvivoxoal.so.1") # no - we'll re-use the viewer's own OpenAL lib
@@ -970,6 +1084,11 @@ class Linux_i686Manifest(LinuxManifest):
self.path("libvivoxplatform.so")
self.end_prefix("lib")
+ if self.args['buildtype'].lower() == 'release' and self.is_packaging_viewer():
+ print "* Going strip-crazy on the packaged binaries, since this is a RELEASE build"
+ self.run_command("find %(d)r/bin %(d)r/lib -type f \\! -name update_install | xargs --no-run-if-empty strip -S" % {'d': self.get_dst_prefix()} ) # makes some small assumptions about our packaged dir structure
+
+
class Linux_x86_64Manifest(LinuxManifest):
def construct(self):
super(Linux_x86_64Manifest, self).construct()
diff --git a/indra/test/CMakeLists.txt b/indra/test/CMakeLists.txt
index 66c78a86c4..328ab4ca51 100644
--- a/indra/test/CMakeLists.txt
+++ b/indra/test/CMakeLists.txt
@@ -4,7 +4,6 @@ project (test)
include(00-Common)
include(LLCommon)
-include(LLDatabase)
include(LLInventory)
include(LLMath)
include(LLMessage)
@@ -27,11 +26,12 @@ include_directories(
${LLXML_INCLUDE_DIRS}
${LSCRIPT_INCLUDE_DIRS}
${GOOGLEMOCK_INCLUDE_DIRS}
+ ${TUT_INCLUDE_DIR}
)
set(test_SOURCE_FILES
io.cpp
-# llapp_tut.cpp # Temporarily removed until thread issues can be solved
+ llapp_tut.cpp
llblowfish_tut.cpp
llbuffer_tut.cpp
lldoubledispatch_tut.cpp
@@ -52,8 +52,6 @@ set(test_SOURCE_FILES
llservicebuilder_tut.cpp
llstreamtools_tut.cpp
lltemplatemessagebuilder_tut.cpp
- lltimestampcache_tut.cpp
- lltranscode_tut.cpp
lltut.cpp
lluuidhashmap_tut.cpp
message_tut.cpp
@@ -75,12 +73,6 @@ if (NOT WINDOWS)
)
endif (NOT WINDOWS)
-if (NOT DARWIN)
- list(APPEND test_SOURCE_FILES
- lldatabase_tut.cpp
- )
-endif (NOT DARWIN)
-
set_source_files_properties(${test_HEADER_FILES}
PROPERTIES HEADER_FILE_ONLY TRUE)
@@ -99,7 +91,6 @@ target_link_libraries(test
${LLCOMMON_LIBRARIES}
${EXPAT_LIBRARIES}
${GOOGLEMOCK_LIBRARIES}
- ${APRICONV_LIBRARIES}
${PTHREAD_LIBRARY}
${WINDOWS_LIBRARIES}
${BOOST_PROGRAM_OPTIONS_LIBRARY}
@@ -118,38 +109,28 @@ endif (WINDOWS)
get_target_property(TEST_EXE test LOCATION)
-SET_TEST_PATH(LD_LIBRARY_PATH)
-LL_TEST_COMMAND(command "${LD_LIBRARY_PATH}"
- "${TEST_EXE}" "--output=${CMAKE_CURRENT_BINARY_DIR}/cpp_test_results.txt" "--touch=${CMAKE_CURRENT_BINARY_DIR}/cpp_tests_ok.txt")
+SET_TEST_PATH(DYLD_LIBRARY_PATH)
+
+LL_TEST_COMMAND(command
+ "${DYLD_LIBRARY_PATH}"
+ "${TEST_EXE}"
+ "--output=${CMAKE_CURRENT_BINARY_DIR}/cpp_test_results.txt"
+ "--touch=${CMAKE_CURRENT_BINARY_DIR}/cpp_tests_ok.txt")
+
ADD_CUSTOM_COMMAND(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/cpp_tests_ok.txt
COMMAND ${command}
DEPENDS test
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
COMMENT "C++ unit tests"
- )
+ )
set(test_results ${CMAKE_CURRENT_BINARY_DIR}/cpp_tests_ok.txt)
-if (EXISTS /etc/debian_version_FAIL)
- # The Python tests have all kinds of wacky non-portable assumptions
- # built in.
-
- add_custom_command(
- OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/py_tests_ok.txt
- COMMAND ${PYTHON_EXECUTABLE}
- ARGS
- ${CMAKE_CURRENT_SOURCE_DIR}/test.py
- --mode=static
- --output=${CMAKE_CURRENT_BINARY_DIR}/py_test_results.txt
- --touch=${CMAKE_CURRENT_BINARY_DIR}/py_tests_ok.txt
- --mode=static
- DEPENDS test.py
- WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
- COMMENT "Python unit tests"
- )
-
- list(APPEND test_results ${CMAKE_CURRENT_BINARY_DIR}/py_tests_ok.txt)
-endif (EXISTS /etc/debian_version_FAIL)
-
-add_custom_target(tests_ok ALL DEPENDS ${test_results})
+# This should cause the test executable to be built, but not
+# run if LL_TESTS is disabled. This will hopefully keep the
+# tests up to date with any code changes changes even if
+# developers choose to disable LL_TESTS.
+if (LL_TESTS)
+ add_custom_target(tests_ok ALL DEPENDS ${test_results})
+endif (LL_TESTS)
diff --git a/indra/test/io.cpp b/indra/test/io.cpp
index c06c1b153b..ce747f667d 100644
--- a/indra/test/io.cpp
+++ b/indra/test/io.cpp
@@ -909,7 +909,7 @@ namespace tut
pipe_and_pump_fitness()
{
- LLFrameTimer::updateFrameTime();
+ LLFrameTimer::updateFrameTime();
apr_pool_create(&mPool, NULL);
mPump = new LLPumpIO(mPool);
mSocket = LLSocket::create(
diff --git a/indra/test/llapp_tut.cpp b/indra/test/llapp_tut.cpp
new file mode 100644
index 0000000000..aa5c0672e6
--- /dev/null
+++ b/indra/test/llapp_tut.cpp
@@ -0,0 +1,162 @@
+/**
+ * @file llapp_tut.cpp
+ * @author Phoenix
+ * @date 2006-09-12
+ *
+ * $LicenseInfo:firstyear=2006&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2006-2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include <tut/tut.hpp>
+
+#include "linden_common.h"
+#include "llapp.h"
+#include "lltut.h"
+
+
+namespace tut
+{
+ struct application
+ {
+ class LLTestApp : public LLApp
+ {
+ public:
+ virtual bool init() { return true; }
+ virtual bool cleanup() { return true; }
+ virtual bool mainLoop() { return true; }
+ };
+ LLTestApp* mApp;
+ application()
+ {
+ mApp = new LLTestApp;
+ }
+ ~application()
+ {
+ delete mApp;
+ }
+ };
+
+ typedef test_group<application> application_t;
+ typedef application_t::object application_object_t;
+ tut::application_t tut_application("application");
+
+ template<> template<>
+ void application_object_t::test<1>()
+ {
+ LLSD defaults;
+ defaults["template"] = "../../../scripts/messages/message_template.msg";
+ defaults["configdir"] = ".";
+ defaults["datadir"] = "data";
+ mApp->setOptionData(LLApp::PRIORITY_DEFAULT, defaults);
+
+ LLSD datadir_sd = mApp->getOption("datadir");
+ ensure_equals("data type", datadir_sd.type(), LLSD::TypeString);
+ ensure_equals(
+ "data value", datadir_sd.asString(), std::string("data"));
+ }
+
+ template<> template<>
+ void application_object_t::test<2>()
+ {
+ const int ARGC = 13;
+ const char* ARGV[ARGC] =
+ {
+ "", // argv[0] is usually the application name
+ "-crashcount",
+ "2",
+ "-space",
+ "spaceserver.grid.lindenlab.com",
+ "-db_host",
+ "localhost",
+ "--allowlslhttprequests",
+ "-asset-uri",
+ "http://test.lindenlab.com/assets",
+ "-data",
+ "127.0.0.1",
+ "--smtp"
+ };
+ bool ok = mApp->parseCommandOptions(ARGC, const_cast<char**>(ARGV));
+ ensure("command line parsed", ok);
+ ensure_equals(
+ "crashcount", mApp->getOption("crashcount").asInteger(), 2);
+ ensure_equals(
+ "space",
+ mApp->getOption("space").asString(),
+ std::string("spaceserver.grid.lindenlab.com"));
+ ensure_equals(
+ "db_host",
+ mApp->getOption("db_host").asString(),
+ std::string("localhost"));
+ ensure("allowlshlttprequests", mApp->getOption("smtp"));
+ ensure_equals(
+ "asset-uri",
+ mApp->getOption("asset-uri").asString(),
+ std::string("http://test.lindenlab.com/assets"));
+ ensure_equals(
+ "data",
+ mApp->getOption("data").asString(),
+ std::string("127.0.0.1"));
+ ensure("smtp", mApp->getOption("smtp"));
+ }
+
+ template<> template<>
+ void application_object_t::test<3>()
+ {
+ const int ARGC = 4;
+ const char* ARGV[ARGC] =
+ {
+ "", // argv[0] is usually the application name
+ "crashcount",
+ "2",
+ "--space"
+ };
+ bool ok = mApp->parseCommandOptions(ARGC, const_cast<char**>(ARGV));
+ ensure("command line parse failure", !ok);
+ }
+
+ template<> template<>
+ void application_object_t::test<4>()
+ {
+ const int ARGC = 4;
+ const char* ARGV[ARGC] =
+ {
+ "", // argv[0] is usually the application name
+ "--crashcount",
+ "2",
+ "space"
+ };
+ bool ok = mApp->parseCommandOptions(ARGC, const_cast<char**>(ARGV));
+ ensure("command line parse failure", !ok);
+ }
+
+
+ template<> template<>
+ void application_object_t::test<5>()
+ {
+ LLSD options;
+ options["boolean-test"] = true;
+ mApp->setOptionData(LLApp::PRIORITY_GENERAL_CONFIGURATION, options);
+ ensure("bool set", mApp->getOption("boolean-test").asBoolean());
+ options["boolean-test"] = false;
+ mApp->setOptionData(LLApp::PRIORITY_RUNTIME_OVERRIDE, options);
+ ensure("bool unset", !mApp->getOption("boolean-test").asBoolean());
+ }
+}
diff --git a/indra/test/llevents_tut.cpp b/indra/test/llevents_tut.cpp
index 57e22bbb56..4699bb1827 100644
--- a/indra/test/llevents_tut.cpp
+++ b/indra/test/llevents_tut.cpp
@@ -54,686 +54,730 @@
using boost::assign::list_of;
+#ifdef LL_LINUX
+#define CATCH_MISSED_LINUX_EXCEPTION(exception, threw) \
+catch (const std::runtime_error& ex) \
+{ \
+ /* This clause is needed on Linux, on the viewer side, because the */ \
+ /* exception isn't caught by the clause above. Warn the user... */ \
+ std::cerr << "Failed to catch " << typeid(ex).name() << std::endl; \
+ /* But if the expected exception was thrown, allow the test to */ \
+ /* succeed anyway. Not sure how else to handle this odd case. */ \
+ /* This approach is also used in llsdmessage_test.cpp. */ \
+ if (std::string(typeid(ex).name()) == typeid(exception).name()) \
+ { \
+ threw = ex.what(); \
+ /*std::cout << ex.what() << std::endl;*/ \
+ } \
+ else \
+ { \
+ /* We don't even recognize this exception. Let it propagate */ \
+ /* out to TUT to fail the test. */ \
+ throw; \
+ } \
+} \
+catch (...) \
+{ \
+ std::cerr << "Utterly failed to catch expected exception " << #exception << "!" << \
+ std::endl; \
+ /* This indicates a problem in the test that should be addressed. */ \
+ throw; \
+}
+
+#else // LL_LINUX
+#define CATCH_MISSED_LINUX_EXCEPTION(exception, threw) \
+ /* Not needed on other platforms */
+#endif // LL_LINUX
+
template<typename T>
-T make(const T& value) { return value; }
+T make(const T& value)
+{
+ return value;
+}
/*****************************************************************************
-* tut test group
-*****************************************************************************/
+ * tut test group
+ *****************************************************************************/
namespace tut
{
- struct events_data
- {
- events_data():
- pumps(LLEventPumps::instance()),
- listener0("first"),
- listener1("second")
- {}
- LLEventPumps& pumps;
- Listener listener0;
- Listener listener1;
-
- void check_listener(const std::string& desc, const Listener& listener, LLSD::Integer got)
- {
- ensure_equals(STRINGIZE(listener << ' ' << desc),
- listener.getLastEvent().asInteger(), got);
- }
- };
- typedef test_group<events_data> events_group;
- typedef events_group::object events_object;
- tut::events_group evgr("events");
-
- template<> template<>
- void events_object::test<1>()
- {
- set_test_name("basic operations");
- // Now there's a static constructor in llevents.cpp that registers on
- // the "mainloop" pump to call LLEventPumps::flush().
- // Actually -- having to modify this to track the statically-
- // constructed pumps in other TUT modules in this giant monolithic test
- // executable isn't such a hot idea.
-// ensure_equals("initial pump", pumps.mPumpMap.size(), 1);
- size_t initial_pumps(pumps.mPumpMap.size());
- LLEventPump& per_frame(pumps.obtain("per-frame"));
- ensure_equals("first explicit pump", pumps.mPumpMap.size(), initial_pumps+1);
- // Verify that per_frame was instantiated as an LLEventStream.
- ensure("LLEventStream leaf class", dynamic_cast<LLEventStream*>(&per_frame));
- ensure("enabled", per_frame.enabled());
- // Trivial test, but posting an event to an EventPump with no
- // listeners should not blow up. The test is relevant because defining
- // a boost::signal with a non-void return signature, using the default
- // combiner, blows up if there are no listeners. This is because the
- // default combiner is defined to return the value returned by the
- // last listener, which is meaningless if there were no listeners.
- per_frame.post(0);
- LLBoundListener connection = listener0.listenTo(per_frame);
- ensure("connected", connection.connected());
- ensure("not blocked", ! connection.blocked());
- per_frame.post(1);
- check_listener("received", listener0, 1);
- { // block the connection
- LLEventPump::Blocker block(connection);
- ensure("blocked", connection.blocked());
- per_frame.post(2);
- check_listener("not updated", listener0, 1);
- } // unblock
- ensure("unblocked", ! connection.blocked());
- per_frame.post(3);
- check_listener("unblocked", listener0, 3);
- LLBoundListener sameConnection = per_frame.getListener(listener0.getName());
- ensure("still connected", sameConnection.connected());
- ensure("still not blocked", ! sameConnection.blocked());
- { // block it again
- LLEventPump::Blocker block(sameConnection);
- ensure("re-blocked", sameConnection.blocked());
- per_frame.post(4);
- check_listener("re-blocked", listener0, 3);
- } // unblock
- bool threw = false;
- try
- {
- // NOTE: boost::bind() saves its arguments by VALUE! If you pass
- // an object instance rather than a pointer, you'll end up binding
- // to an internal copy of that instance! Use boost::ref() to
- // capture a reference instead.
- per_frame.listen(listener0.getName(), // note bug, dup name
- boost::bind(&Listener::call, boost::ref(listener1), _1));
- }
- catch (const LLEventPump::DupListenerName& e)
- {
- threw = true;
- ensure_equals(e.what(),
- std::string("DupListenerName: "
- "Attempt to register duplicate listener name '") +
- listener0.getName() +
- "' on " + typeid(per_frame).name() + " '" + per_frame.getName() + "'");
- }
- ensure("threw DupListenerName", threw);
- // do it right this time
- listener1.listenTo(per_frame);
- per_frame.post(5);
- check_listener("got", listener0, 5);
- check_listener("got", listener1, 5);
- per_frame.enable(false);
- per_frame.post(6);
- check_listener("didn't get", listener0, 5);
- check_listener("didn't get", listener1, 5);
- per_frame.enable();
- per_frame.post(7);
- check_listener("got", listener0, 7);
- check_listener("got", listener1, 7);
- per_frame.stopListening(listener0.getName());
- ensure("disconnected 0", ! connection.connected());
- ensure("disconnected 1", ! sameConnection.connected());
- per_frame.post(8);
- check_listener("disconnected", listener0, 7);
- check_listener("still connected", listener1, 8);
- per_frame.stopListening(listener1.getName());
- per_frame.post(9);
- check_listener("disconnected", listener1, 8);
- }
-
- template<> template<>
- void events_object::test<2>()
- {
- set_test_name("callstop() returning true");
- LLEventPump& per_frame(pumps.obtain("per-frame"));
- listener0.reset(0);
- listener1.reset(0);
- LLBoundListener bound0 = listener0.listenTo(per_frame, &Listener::callstop);
- LLBoundListener bound1 = listener1.listenTo(per_frame, &Listener::call,
- // after listener0
- make<LLEventPump::NameList>(list_of(listener0.getName())));
- ensure("enabled", per_frame.enabled());
- ensure("connected 0", bound0.connected());
- ensure("unblocked 0", ! bound0.blocked());
- ensure("connected 1", bound1.connected());
- ensure("unblocked 1", ! bound1.blocked());
- per_frame.post(1);
- check_listener("got", listener0, 1);
- // Because listener0.callstop() returns true, control never reaches listener1.call().
- check_listener("got", listener1, 0);
- }
-
- bool chainEvents(Listener& someListener, const LLSD& event)
- {
- // Make this call so we can watch for side effects for test purposes.
- someListener.call(event);
- // This function represents a recursive event chain -- or some other
- // scenario in which an event handler raises additional events.
- int value = event.asInteger();
- if (value)
- {
- LLEventPumps::instance().obtain("login").post(value - 1);
- }
- return false;
- }
-
- template<> template<>
- void events_object::test<3>()
- {
- set_test_name("LLEventQueue delayed action");
- // This access is NOT legal usage: we can do it only because we're
- // hacking private for test purposes. Normally we'd either compile in
- // a particular name, or (later) edit a config file.
- pumps.mQueueNames.insert("login");
- LLEventPump& login(pumps.obtain("login"));
- // The "mainloop" pump is special: posting on that implicitly calls
- // LLEventPumps::flush(), which in turn should flush our "login"
- // LLEventQueue.
- LLEventPump& mainloop(pumps.obtain("mainloop"));
- ensure("LLEventQueue leaf class", dynamic_cast<LLEventQueue*>(&login));
- listener0.listenTo(login);
- listener0.reset(0);
- login.post(1);
- check_listener("waiting for queued event", listener0, 0);
- mainloop.post(LLSD());
- check_listener("got queued event", listener0, 1);
- login.stopListening(listener0.getName());
- // Verify that when an event handler posts a new event on the same
- // LLEventQueue, it doesn't get processed in the same flush() call --
- // it waits until the next flush() call.
- listener0.reset(17);
- login.listen("chainEvents", boost::bind(chainEvents, boost::ref(listener0), _1));
- login.post(1);
- check_listener("chainEvents(1) not yet called", listener0, 17);
- mainloop.post(LLSD());
- check_listener("chainEvents(1) called", listener0, 1);
- mainloop.post(LLSD());
- check_listener("chainEvents(0) called", listener0, 0);
- mainloop.post(LLSD());
- check_listener("chainEvents(-1) not called", listener0, 0);
- login.stopListening("chainEvents");
- }
-
- template<> template<>
- void events_object::test<4>()
- {
- set_test_name("explicitly-instantiated LLEventStream");
- // Explicitly instantiate an LLEventStream, and verify that it
- // self-registers with LLEventPumps
- size_t registered = pumps.mPumpMap.size();
- size_t owned = pumps.mOurPumps.size();
- LLEventPump* localInstance;
- {
- LLEventStream myEventStream("stream");
- localInstance = &myEventStream;
- LLEventPump& stream(pumps.obtain("stream"));
- ensure("found named LLEventStream instance", &stream == localInstance);
- ensure_equals("registered new instance", pumps.mPumpMap.size(), registered + 1);
- ensure_equals("explicit instance not owned", pumps.mOurPumps.size(), owned);
- } // destroy myEventStream -- should unregister
- ensure_equals("destroyed instance unregistered", pumps.mPumpMap.size(), registered);
- ensure_equals("destroyed instance not owned", pumps.mOurPumps.size(), owned);
- LLEventPump& stream(pumps.obtain("stream"));
- ensure("new LLEventStream instance", &stream != localInstance);
- ensure_equals("obtain()ed instance registered", pumps.mPumpMap.size(), registered + 1);
- ensure_equals("obtain()ed instance owned", pumps.mOurPumps.size(), owned + 1);
- }
-
- template<> template<>
- void events_object::test<5>()
- {
- set_test_name("stopListening()");
- LLEventPump& login(pumps.obtain("login"));
- listener0.listenTo(login);
- login.stopListening(listener0.getName());
- // should not throw because stopListening() should have removed name
- listener0.listenTo(login, &Listener::callstop);
- LLBoundListener wrong = login.getListener("bogus");
- ensure("bogus connection disconnected", ! wrong.connected());
- ensure("bogus connection blocked", wrong.blocked());
- }
-
- template<> template<>
- void events_object::test<6>()
- {
- set_test_name("chaining LLEventPump instances");
- LLEventPump& upstream(pumps.obtain("upstream"));
- // One potentially-useful construct is to chain LLEventPumps together.
- // Among other things, this allows you to turn subsets of listeners on
- // and off in groups.
- LLEventPump& filter0(pumps.obtain("filter0"));
- LLEventPump& filter1(pumps.obtain("filter1"));
- upstream.listen(filter0.getName(),
- boost::bind(&LLEventPump::post, boost::ref(filter0), _1));
- upstream.listen(filter1.getName(),
- boost::bind(&LLEventPump::post, boost::ref(filter1), _1));
- listener0.listenTo(filter0);
- listener1.listenTo(filter1);
- listener0.reset(0);
- listener1.reset(0);
- upstream.post(1);
- check_listener("got unfiltered", listener0, 1);
- check_listener("got unfiltered", listener1, 1);
- filter0.enable(false);
- upstream.post(2);
- check_listener("didn't get filtered", listener0, 1);
- check_listener("got filtered", listener1, 2);
- }
-
- template<> template<>
- void events_object::test<7>()
- {
- set_test_name("listener dependency order");
- typedef LLEventPump::NameList NameList;
- typedef Collect::StringList StringList;
- LLEventPump& button(pumps.obtain("button"));
- Collect collector;
- button.listen("Mary",
- boost::bind(&Collect::add, boost::ref(collector), "Mary", _1),
- // state that "Mary" must come after "checked"
- make<NameList>(list_of("checked")));
- button.listen("checked",
- boost::bind(&Collect::add, boost::ref(collector), "checked", _1),
- // "checked" must come after "spot"
- make<NameList>(list_of("spot")));
- button.listen("spot",
- boost::bind(&Collect::add, boost::ref(collector), "spot", _1));
- button.post(1);
- ensure_equals(collector.result, make<StringList>(list_of("spot")("checked")("Mary")));
- collector.clear();
- button.stopListening("Mary");
- button.listen("Mary",
- boost::bind(&Collect::add, boost::ref(collector), "Mary", _1),
- LLEventPump::empty, // no after dependencies
- // now "Mary" must come before "spot"
- make<NameList>(list_of("spot")));
- button.post(2);
- ensure_equals(collector.result, make<StringList>(list_of("Mary")("spot")("checked")));
- collector.clear();
- button.stopListening("spot");
- std::string threw;
- try
- {
- button.listen("spot",
- boost::bind(&Collect::add, boost::ref(collector), "spot", _1),
- // after "Mary" and "checked" -- whoops!
- make<NameList>(list_of("Mary")("checked")));
- }
- catch (const LLEventPump::Cycle& e)
- {
- threw = e.what();
-// std::cout << "Caught: " << e.what() << '\n';
- }
- // Obviously the specific wording of the exception text can
- // change; go ahead and change the test to match.
- // Establish that it contains:
- // - the name and runtime type of the LLEventPump
- ensure_contains("LLEventPump type", threw, typeid(button).name());
- ensure_contains("LLEventPump name", threw, "'button'");
- // - the name of the new listener that caused the problem
- ensure_contains("new listener name", threw, "'spot'");
- // - a synopsis of the problematic dependencies.
- ensure_contains("cyclic dependencies", threw,
- "\"Mary\" -> before (\"spot\")");
- ensure_contains("cyclic dependencies", threw,
- "after (\"spot\") -> \"checked\"");
- ensure_contains("cyclic dependencies", threw,
- "after (\"Mary\", \"checked\") -> \"spot\"");
- button.listen("yellow",
- boost::bind(&Collect::add, boost::ref(collector), "yellow", _1),
- make<NameList>(list_of("checked")));
- button.listen("shoelaces",
- boost::bind(&Collect::add, boost::ref(collector), "shoelaces", _1),
- make<NameList>(list_of("checked")));
- button.post(3);
- ensure_equals(collector.result, make<StringList>(list_of("Mary")("checked")("yellow")("shoelaces")));
- collector.clear();
- threw.clear();
- try
- {
- button.listen("of",
- boost::bind(&Collect::add, boost::ref(collector), "of", _1),
- make<NameList>(list_of("shoelaces")),
- make<NameList>(list_of("yellow")));
- }
- catch (const LLEventPump::OrderChange& e)
- {
- threw = e.what();
-// std::cout << "Caught: " << e.what() << '\n';
- }
- // Same remarks about the specific wording of the exception. Just
- // ensure that it contains enough information to clarify the
- // problem and what must be done to resolve it.
- ensure_contains("LLEventPump type", threw, typeid(button).name());
- ensure_contains("LLEventPump name", threw, "'button'");
- ensure_contains("new listener name", threw, "'of'");
- ensure_contains("prev listener name", threw, "'yellow'");
- ensure_contains("old order", threw, "was: Mary, checked, yellow, shoelaces");
- ensure_contains("new order", threw, "now: Mary, checked, shoelaces, of, yellow");
- button.post(4);
- ensure_equals(collector.result, make<StringList>(list_of("Mary")("checked")("yellow")("shoelaces")));
- }
-
- template<> template<>
- void events_object::test<8>()
- {
- set_test_name("tweaked and untweaked LLEventPump instance names");
- { // nested scope
- // Hand-instantiate an LLEventStream...
- LLEventStream bob("bob");
- bool threw = false;
- try
- {
- // then another with a duplicate name.
- LLEventStream bob2("bob");
- }
- catch (const LLEventPump::DupPumpName& /*e*/)
- {
- threw = true;
-// std::cout << "Caught: " << e.what() << '\n';
- }
- ensure("Caught DupPumpName", threw);
- } // delete first 'bob'
- LLEventStream bob("bob"); // should work, previous one unregistered
- LLEventStream bob1("bob", true); // allowed to tweak name
- ensure_equals("tweaked LLEventStream name", bob1.getName(), "bob1");
- std::vector< boost::shared_ptr<LLEventStream> > streams;
- for (int i = 2; i <= 10; ++i)
- {
- streams.push_back(boost::shared_ptr<LLEventStream>(new LLEventStream("bob", true)));
- }
- ensure_equals("last tweaked LLEventStream name", streams.back()->getName(), "bob10");
- }
-
- // Define a function that accepts an LLListenerOrPumpName
- void eventSource(const LLListenerOrPumpName& listener)
- {
- // Pretend that some time has elapsed. Call listener immediately.
- listener(17);
- }
-
- template<> template<>
- void events_object::test<9>()
- {
- set_test_name("LLListenerOrPumpName");
- // Passing a boost::bind() expression to LLListenerOrPumpName
- listener0.reset(0);
- eventSource(boost::bind(&Listener::call, boost::ref(listener0), _1));
- check_listener("got by listener", listener0, 17);
- // Passing a string LLEventPump name to LLListenerOrPumpName
- listener0.reset(0);
- LLEventStream random("random");
- listener0.listenTo(random);
- eventSource("random");
- check_listener("got by pump name", listener0, 17);
- bool threw = false;
- try
- {
- LLListenerOrPumpName empty;
- empty(17);
- }
- catch (const LLListenerOrPumpName::Empty&)
- {
- threw = true;
- }
- ensure("threw Empty", threw);
- }
-
- class TempListener: public Listener
- {
- public:
- TempListener(const std::string& name, bool& liveFlag):
- Listener(name),
- mLiveFlag(liveFlag)
- {
- mLiveFlag = true;
- }
-
- virtual ~TempListener()
- {
- mLiveFlag = false;
- }
-
- private:
- bool& mLiveFlag;
- };
-
- template<> template<>
- void events_object::test<10>()
- {
- set_test_name("listen(boost::bind(...TempListener...))");
- // listen() can't do anything about a plain TempListener instance:
- // it's not managed with shared_ptr, nor is it an LLEventTrackable subclass
- bool live = false;
- LLEventPump& heaptest(pumps.obtain("heaptest"));
- LLBoundListener connection;
- {
- TempListener tempListener("temp", live);
- ensure("TempListener constructed", live);
- connection = heaptest.listen(tempListener.getName(),
- boost::bind(&Listener::call,
- boost::ref(tempListener),
- _1));
- heaptest.post(1);
- check_listener("received", tempListener, 1);
- } // presumably this will make newListener go away?
- // verify that
- ensure("TempListener destroyed", ! live);
- // This is the case against which we can't defend. Don't even try to
- // post to heaptest -- that would engage Undefined Behavior.
- // Cautiously inspect connection...
- ensure("misleadingly connected", connection.connected());
- // then disconnect by hand.
- heaptest.stopListening("temp");
- }
-
- template<> template<>
- void events_object::test<11>()
- {
- set_test_name("listen(boost::bind(...weak_ptr...))");
- // listen() detecting weak_ptr<TempListener> in boost::bind() object
- bool live = false;
- LLEventPump& heaptest(pumps.obtain("heaptest"));
- LLBoundListener connection;
- ensure("default state", ! connection.connected());
- {
- boost::shared_ptr<TempListener> newListener(new TempListener("heap", live));
- newListener->reset();
- ensure("TempListener constructed", live);
- connection = heaptest.listen(newListener->getName(),
- boost::bind(&Listener::call, weaken(newListener), _1));
- ensure("new connection", connection.connected());
- heaptest.post(1);
- check_listener("received", *newListener, 1);
- } // presumably this will make newListener go away?
- // verify that
- ensure("TempListener destroyed", ! live);
- ensure("implicit disconnect", ! connection.connected());
- // now just make sure we don't blow up trying to access a freed object!
- heaptest.post(2);
- }
-
- template<> template<>
- void events_object::test<12>()
- {
- set_test_name("listen(boost::bind(...shared_ptr...))");
-/*==========================================================================*|
- // DISABLED because I've made this case produce a compile error.
- // Following the error leads the disappointed dev to a comment
- // instructing her to use the weaken() function to bind a weak_ptr<T>
- // instead of binding a shared_ptr<T>, and explaining why. I know of
- // no way to use TUT to code a repeatable test in which the expected
- // outcome is a compile error. The interested reader is invited to
- // uncomment this block and build to see for herself.
-
- // listen() detecting shared_ptr<TempListener> in boost::bind() object
- bool live = false;
- LLEventPump& heaptest(pumps.obtain("heaptest"));
- LLBoundListener connection;
- std::string listenerName("heap");
- ensure("default state", ! connection.connected());
- {
- boost::shared_ptr<TempListener> newListener(new TempListener(listenerName, live));
- ensure_equals("use_count", newListener.use_count(), 1);
- newListener->reset();
- ensure("TempListener constructed", live);
- connection = heaptest.listen(newListener->getName(),
- boost::bind(&Listener::call, newListener, _1));
- ensure("new connection", connection.connected());
- ensure_equals("use_count", newListener.use_count(), 2);
- heaptest.post(1);
- check_listener("received", *newListener, 1);
- } // this should make newListener go away...
- // Unfortunately, the fact that we've bound a shared_ptr by value into
- // our LLEventPump means that copy will keep the referenced object alive.
- ensure("TempListener still alive", live);
- ensure("still connected", connection.connected());
- // disconnecting explicitly should delete the TempListener...
- heaptest.stopListening(listenerName);
+struct events_data
+{
+ events_data() :
+ pumps(LLEventPumps::instance()),
+ listener0("first"),
+ listener1("second")
+ {
+ }
+ LLEventPumps& pumps;
+ Listener listener0;
+ Listener listener1;
+
+ void check_listener(const std::string& desc, const Listener& listener, LLSD::Integer got)
+ {
+ ensure_equals(STRINGIZE(listener << ' ' << desc),
+ listener.getLastEvent().asInteger(), got);
+ }
+};
+typedef test_group<events_data> events_group;
+typedef events_group::object events_object;
+tut::events_group evgr("events");
+
+template<> template<>
+void events_object::test<1>()
+{
+ set_test_name("basic operations");
+ // Now there's a static constructor in llevents.cpp that registers on
+ // the "mainloop" pump to call LLEventPumps::flush().
+ // Actually -- having to modify this to track the statically-
+ // constructed pumps in other TUT modules in this giant monolithic test
+ // executable isn't such a hot idea.
+ // ensure_equals("initial pump", pumps.mPumpMap.size(), 1);
+ size_t initial_pumps(pumps.mPumpMap.size());
+ LLEventPump& per_frame(pumps.obtain("per-frame"));
+ ensure_equals("first explicit pump", pumps.mPumpMap.size(), initial_pumps + 1);
+ // Verify that per_frame was instantiated as an LLEventStream.
+ ensure("LLEventStream leaf class", dynamic_cast<LLEventStream*> (&per_frame));
+ ensure("enabled", per_frame.enabled());
+ // Trivial test, but posting an event to an EventPump with no
+ // listeners should not blow up. The test is relevant because defining
+ // a boost::signal with a non-void return signature, using the default
+ // combiner, blows up if there are no listeners. This is because the
+ // default combiner is defined to return the value returned by the
+ // last listener, which is meaningless if there were no listeners.
+ per_frame.post(0);
+ LLBoundListener connection = listener0.listenTo(per_frame);
+ ensure("connected", connection.connected());
+ ensure("not blocked", !connection.blocked());
+ per_frame.post(1);
+ check_listener("received", listener0, 1);
+ { // block the connection
+ LLEventPump::Blocker block(connection);
+ ensure("blocked", connection.blocked());
+ per_frame.post(2);
+ check_listener("not updated", listener0, 1);
+ } // unblock
+ ensure("unblocked", !connection.blocked());
+ per_frame.post(3);
+ check_listener("unblocked", listener0, 3);
+ LLBoundListener sameConnection = per_frame.getListener(listener0.getName());
+ ensure("still connected", sameConnection.connected());
+ ensure("still not blocked", !sameConnection.blocked());
+ { // block it again
+ LLEventPump::Blocker block(sameConnection);
+ ensure("re-blocked", sameConnection.blocked());
+ per_frame.post(4);
+ check_listener("re-blocked", listener0, 3);
+ } // unblock
+ std::string threw;
+ try
+ {
+ // NOTE: boost::bind() saves its arguments by VALUE! If you pass
+ // an object instance rather than a pointer, you'll end up binding
+ // to an internal copy of that instance! Use boost::ref() to
+ // capture a reference instead.
+ per_frame.listen(listener0.getName(), // note bug, dup name
+ boost::bind(&Listener::call, boost::ref(listener1), _1));
+ }
+ catch (const LLEventPump::DupListenerName& e)
+ {
+ threw = e.what();
+ }
+ CATCH_MISSED_LINUX_EXCEPTION(LLEventPump::DupListenerName, threw)
+ ensure_equals(threw,
+ std::string("DupListenerName: "
+ "Attempt to register duplicate listener name '") +
+ listener0.getName() + "' on " + typeid(per_frame).name() +
+ " '" + per_frame.getName() + "'");
+ // do it right this time
+ listener1.listenTo(per_frame);
+ per_frame.post(5);
+ check_listener("got", listener0, 5);
+ check_listener("got", listener1, 5);
+ per_frame.enable(false);
+ per_frame.post(6);
+ check_listener("didn't get", listener0, 5);
+ check_listener("didn't get", listener1, 5);
+ per_frame.enable();
+ per_frame.post(7);
+ check_listener("got", listener0, 7);
+ check_listener("got", listener1, 7);
+ per_frame.stopListening(listener0.getName());
+ ensure("disconnected 0", ! connection.connected());
+ ensure("disconnected 1", ! sameConnection.connected());
+ per_frame.post(8);
+ check_listener("disconnected", listener0, 7);
+ check_listener("still connected", listener1, 8);
+ per_frame.stopListening(listener1.getName());
+ per_frame.post(9);
+ check_listener("disconnected", listener1, 8);
+}
+
+template<> template<>
+void events_object::test<2>()
+{
+ set_test_name("callstop() returning true");
+ LLEventPump& per_frame(pumps.obtain("per-frame"));
+ listener0.reset(0);
+ listener1.reset(0);
+ LLBoundListener bound0 = listener0.listenTo(per_frame, &Listener::callstop);
+ LLBoundListener bound1 = listener1.listenTo(per_frame, &Listener::call,
+ // after listener0
+ make<LLEventPump::NameList>(list_of(listener0.getName())));
+ ensure("enabled", per_frame.enabled());
+ ensure("connected 0", bound0.connected());
+ ensure("unblocked 0", !bound0.blocked());
+ ensure("connected 1", bound1.connected());
+ ensure("unblocked 1", !bound1.blocked());
+ per_frame.post(1);
+ check_listener("got", listener0, 1);
+ // Because listener0.callstop() returns true, control never reaches listener1.call().
+ check_listener("got", listener1, 0);
+}
+
+bool chainEvents(Listener& someListener, const LLSD& event)
+{
+ // Make this call so we can watch for side effects for test purposes.
+ someListener.call(event);
+ // This function represents a recursive event chain -- or some other
+ // scenario in which an event handler raises additional events.
+ int value = event.asInteger();
+ if (value)
+ {
+ LLEventPumps::instance().obtain("login").post(value - 1);
+ }
+ return false;
+}
+
+template<> template<>
+void events_object::test<3>()
+{
+ set_test_name("LLEventQueue delayed action");
+ // This access is NOT legal usage: we can do it only because we're
+ // hacking private for test purposes. Normally we'd either compile in
+ // a particular name, or (later) edit a config file.
+ pumps.mQueueNames.insert("login");
+ LLEventPump& login(pumps.obtain("login"));
+ // The "mainloop" pump is special: posting on that implicitly calls
+ // LLEventPumps::flush(), which in turn should flush our "login"
+ // LLEventQueue.
+ LLEventPump& mainloop(pumps.obtain("mainloop"));
+ ensure("LLEventQueue leaf class", dynamic_cast<LLEventQueue*> (&login));
+ listener0.listenTo(login);
+ listener0.reset(0);
+ login.post(1);
+ check_listener("waiting for queued event", listener0, 0);
+ mainloop.post(LLSD());
+ check_listener("got queued event", listener0, 1);
+ login.stopListening(listener0.getName());
+ // Verify that when an event handler posts a new event on the same
+ // LLEventQueue, it doesn't get processed in the same flush() call --
+ // it waits until the next flush() call.
+ listener0.reset(17);
+ login.listen("chainEvents", boost::bind(chainEvents, boost::ref(listener0), _1));
+ login.post(1);
+ check_listener("chainEvents(1) not yet called", listener0, 17);
+ mainloop.post(LLSD());
+ check_listener("chainEvents(1) called", listener0, 1);
+ mainloop.post(LLSD());
+ check_listener("chainEvents(0) called", listener0, 0);
+ mainloop.post(LLSD());
+ check_listener("chainEvents(-1) not called", listener0, 0);
+ login.stopListening("chainEvents");
+}
+
+template<> template<>
+void events_object::test<4>()
+{
+ set_test_name("explicitly-instantiated LLEventStream");
+ // Explicitly instantiate an LLEventStream, and verify that it
+ // self-registers with LLEventPumps
+ size_t registered = pumps.mPumpMap.size();
+ size_t owned = pumps.mOurPumps.size();
+ LLEventPump* localInstance;
+ {
+ LLEventStream myEventStream("stream");
+ localInstance = &myEventStream;
+ LLEventPump& stream(pumps.obtain("stream"));
+ ensure("found named LLEventStream instance", &stream == localInstance);
+ ensure_equals("registered new instance", pumps.mPumpMap.size(), registered + 1);
+ ensure_equals("explicit instance not owned", pumps.mOurPumps.size(), owned);
+ } // destroy myEventStream -- should unregister
+ ensure_equals("destroyed instance unregistered", pumps.mPumpMap.size(), registered);
+ ensure_equals("destroyed instance not owned", pumps.mOurPumps.size(), owned);
+ LLEventPump& stream(pumps.obtain("stream"));
+ ensure("new LLEventStream instance", &stream != localInstance);
+ ensure_equals("obtain()ed instance registered", pumps.mPumpMap.size(), registered + 1);
+ ensure_equals("obtain()ed instance owned", pumps.mOurPumps.size(), owned + 1);
+}
+
+template<> template<>
+void events_object::test<5>()
+{
+ set_test_name("stopListening()");
+ LLEventPump& login(pumps.obtain("login"));
+ listener0.listenTo(login);
+ login.stopListening(listener0.getName());
+ // should not throw because stopListening() should have removed name
+ listener0.listenTo(login, &Listener::callstop);
+ LLBoundListener wrong = login.getListener("bogus");
+ ensure("bogus connection disconnected", !wrong.connected());
+ ensure("bogus connection blocked", wrong.blocked());
+}
+
+template<> template<>
+void events_object::test<6>()
+{
+ set_test_name("chaining LLEventPump instances");
+ LLEventPump& upstream(pumps.obtain("upstream"));
+ // One potentially-useful construct is to chain LLEventPumps together.
+ // Among other things, this allows you to turn subsets of listeners on
+ // and off in groups.
+ LLEventPump& filter0(pumps.obtain("filter0"));
+ LLEventPump& filter1(pumps.obtain("filter1"));
+ upstream.listen(filter0.getName(), boost::bind(&LLEventPump::post, boost::ref(filter0), _1));
+ upstream.listen(filter1.getName(), boost::bind(&LLEventPump::post, boost::ref(filter1), _1));
+ listener0.listenTo(filter0);
+ listener1.listenTo(filter1);
+ listener0.reset(0);
+ listener1.reset(0);
+ upstream.post(1);
+ check_listener("got unfiltered", listener0, 1);
+ check_listener("got unfiltered", listener1, 1);
+ filter0.enable(false);
+ upstream.post(2);
+ check_listener("didn't get filtered", listener0, 1);
+ check_listener("got filtered", listener1, 2);
+}
+
+template<> template<>
+void events_object::test<7>()
+{
+ set_test_name("listener dependency order");
+ typedef LLEventPump::NameList NameList;
+ typedef Collect::StringList StringList;
+ LLEventPump& button(pumps.obtain("button"));
+ Collect collector;
+ button.listen("Mary",
+ boost::bind(&Collect::add, boost::ref(collector), "Mary", _1),
+ // state that "Mary" must come after "checked"
+ make<NameList> (list_of("checked")));
+ button.listen("checked",
+ boost::bind(&Collect::add, boost::ref(collector), "checked", _1),
+ // "checked" must come after "spot"
+ make<NameList> (list_of("spot")));
+ button.listen("spot",
+ boost::bind(&Collect::add, boost::ref(collector), "spot", _1));
+ button.post(1);
+ ensure_equals(collector.result, make<StringList>(list_of("spot")("checked")("Mary")));
+ collector.clear();
+ button.stopListening("Mary");
+ button.listen("Mary",
+ boost::bind(&Collect::add, boost::ref(collector), "Mary", _1),
+ LLEventPump::empty, // no after dependencies
+ // now "Mary" must come before "spot"
+ make<NameList>(list_of("spot")));
+ button.post(2);
+ ensure_equals(collector.result, make<StringList>(list_of("Mary")("spot")("checked")));
+ collector.clear();
+ button.stopListening("spot");
+ std::string threw;
+ try
+ {
+ button.listen("spot",
+ boost::bind(&Collect::add, boost::ref(collector), "spot", _1),
+ // after "Mary" and "checked" -- whoops!
+ make<NameList>(list_of("Mary")("checked")));
+ }
+ catch (const LLEventPump::Cycle& e)
+ {
+ threw = e.what();
+ // std::cout << "Caught: " << e.what() << '\n';
+ }
+ CATCH_MISSED_LINUX_EXCEPTION(LLEventPump::Cycle, threw)
+ // Obviously the specific wording of the exception text can
+ // change; go ahead and change the test to match.
+ // Establish that it contains:
+ // - the name and runtime type of the LLEventPump
+ ensure_contains("LLEventPump type", threw, typeid(button).name());
+ ensure_contains("LLEventPump name", threw, "'button'");
+ // - the name of the new listener that caused the problem
+ ensure_contains("new listener name", threw, "'spot'");
+ // - a synopsis of the problematic dependencies.
+ ensure_contains("cyclic dependencies", threw,
+ "\"Mary\" -> before (\"spot\")");
+ ensure_contains("cyclic dependencies", threw,
+ "after (\"spot\") -> \"checked\"");
+ ensure_contains("cyclic dependencies", threw,
+ "after (\"Mary\", \"checked\") -> \"spot\"");
+ button.listen("yellow",
+ boost::bind(&Collect::add, boost::ref(collector), "yellow", _1),
+ make<NameList>(list_of("checked")));
+ button.listen("shoelaces",
+ boost::bind(&Collect::add, boost::ref(collector), "shoelaces", _1),
+ make<NameList>(list_of("checked")));
+ button.post(3);
+ ensure_equals(collector.result, make<StringList>(list_of("Mary")("checked")("yellow")("shoelaces")));
+ collector.clear();
+ threw.clear();
+ try
+ {
+ button.listen("of",
+ boost::bind(&Collect::add, boost::ref(collector), "of", _1),
+ make<NameList>(list_of("shoelaces")),
+ make<NameList>(list_of("yellow")));
+ }
+ catch (const LLEventPump::OrderChange& e)
+ {
+ threw = e.what();
+ // std::cout << "Caught: " << e.what() << '\n';
+ }
+ CATCH_MISSED_LINUX_EXCEPTION(LLEventPump::OrderChange, threw)
+ // Same remarks about the specific wording of the exception. Just
+ // ensure that it contains enough information to clarify the
+ // problem and what must be done to resolve it.
+ ensure_contains("LLEventPump type", threw, typeid(button).name());
+ ensure_contains("LLEventPump name", threw, "'button'");
+ ensure_contains("new listener name", threw, "'of'");
+ ensure_contains("prev listener name", threw, "'yellow'");
+ // std::cout << "Thrown Exception: " << threw << std::endl;
+ ensure_contains("old order", threw, "was: Mary, checked, yellow, shoelaces");
+ ensure_contains("new order", threw, "now: Mary, checked, shoelaces, of, yellow");
+ button.post(4);
+ ensure_equals(collector.result, make<StringList>(list_of("Mary")("checked")("yellow")("shoelaces")));
+}
+
+template<> template<>
+void events_object::test<8>()
+{
+ set_test_name("tweaked and untweaked LLEventPump instance names");
+ { // nested scope
+ // Hand-instantiate an LLEventStream...
+ LLEventStream bob("bob");
+ std::string threw;
+ try
+ {
+ // then another with a duplicate name.
+ LLEventStream bob2("bob");
+ }
+ catch (const LLEventPump::DupPumpName& e)
+ {
+ threw = e.what();
+ // std::cout << "Caught: " << e.what() << '\n';
+ }
+ CATCH_MISSED_LINUX_EXCEPTION(LLEventPump::DupPumpName, threw)
+ ensure("Caught DupPumpName", !threw.empty());
+ } // delete first 'bob'
+ LLEventStream bob("bob"); // should work, previous one unregistered
+ LLEventStream bob1("bob", true);// allowed to tweak name
+ ensure_equals("tweaked LLEventStream name", bob1.getName(), "bob1");
+ std::vector<boost::shared_ptr<LLEventStream> > streams;
+ for (int i = 2; i <= 10; ++i)
+ {
+ streams.push_back(boost::shared_ptr<LLEventStream>(new LLEventStream("bob", true)));
+ }
+ ensure_equals("last tweaked LLEventStream name", streams.back()->getName(), "bob10");
+}
+
+// Define a function that accepts an LLListenerOrPumpName
+void eventSource(const LLListenerOrPumpName& listener)
+{
+ // Pretend that some time has elapsed. Call listener immediately.
+ listener(17);
+}
+
+template<> template<>
+void events_object::test<9>()
+{
+ set_test_name("LLListenerOrPumpName");
+ // Passing a boost::bind() expression to LLListenerOrPumpName
+ listener0.reset(0);
+ eventSource(boost::bind(&Listener::call, boost::ref(listener0), _1));
+ check_listener("got by listener", listener0, 17);
+ // Passing a string LLEventPump name to LLListenerOrPumpName
+ listener0.reset(0);
+ LLEventStream random("random");
+ listener0.listenTo(random);
+ eventSource("random");
+ check_listener("got by pump name", listener0, 17);
+ std::string threw;
+ try
+ {
+ LLListenerOrPumpName empty;
+ empty(17);
+ }
+ catch (const LLListenerOrPumpName::Empty& e)
+ {
+ threw = e.what();
+ }
+ CATCH_MISSED_LINUX_EXCEPTION(LLListenerOrPumpName::Empty, threw)
+
+ ensure("threw Empty", !threw.empty());
+}
+
+class TempListener: public Listener
+{
+public:
+ TempListener(const std::string& name, bool& liveFlag) :
+ Listener(name), mLiveFlag(liveFlag)
+ {
+ mLiveFlag = true;
+ }
+
+ virtual ~TempListener()
+ {
+ mLiveFlag = false;
+ }
+
+private:
+ bool& mLiveFlag;
+};
+
+template<> template<>
+void events_object::test<10>()
+{
+ set_test_name("listen(boost::bind(...TempListener...))");
+ // listen() can't do anything about a plain TempListener instance:
+ // it's not managed with shared_ptr, nor is it an LLEventTrackable subclass
+ bool live = false;
+ LLEventPump& heaptest(pumps.obtain("heaptest"));
+ LLBoundListener connection;
+ {
+ TempListener tempListener("temp", live);
+ ensure("TempListener constructed", live);
+ connection = heaptest.listen(tempListener.getName(),
+ boost::bind(&Listener::call,
+ boost::ref(tempListener),
+ _1));
+ heaptest.post(1);
+ check_listener("received", tempListener, 1);
+ } // presumably this will make newListener go away?
+ // verify that
+ ensure("TempListener destroyed", !live);
+ // This is the case against which we can't defend. Don't even try to
+ // post to heaptest -- that would engage Undefined Behavior.
+ // Cautiously inspect connection...
+ ensure("misleadingly connected", connection.connected());
+ // then disconnect by hand.
+ heaptest.stopListening("temp");
+}
+
+template<> template<>
+void events_object::test<11>()
+{
+ set_test_name("listen(boost::bind(...weak_ptr...))");
+ // listen() detecting weak_ptr<TempListener> in boost::bind() object
+ bool live = false;
+ LLEventPump& heaptest(pumps.obtain("heaptest"));
+ LLBoundListener connection;
+ ensure("default state", !connection.connected());
+ {
+ boost::shared_ptr<TempListener> newListener(new TempListener("heap", live));
+ newListener->reset();
+ ensure("TempListener constructed", live);
+ connection = heaptest.listen(newListener->getName(),
+ boost::bind(&Listener::call,
+ weaken(newListener),
+ _1));
+ ensure("new connection", connection.connected());
+ heaptest.post(1);
+ check_listener("received", *newListener, 1);
+ } // presumably this will make newListener go away?
+ // verify that
+ ensure("TempListener destroyed", !live);
+ ensure("implicit disconnect", !connection.connected());
+ // now just make sure we don't blow up trying to access a freed object!
+ heaptest.post(2);
+}
+
+template<> template<>
+void events_object::test<12>()
+{
+ set_test_name("listen(boost::bind(...shared_ptr...))");
+ /*==========================================================================*|
+ // DISABLED because I've made this case produce a compile error.
+ // Following the error leads the disappointed dev to a comment
+ // instructing her to use the weaken() function to bind a weak_ptr<T>
+ // instead of binding a shared_ptr<T>, and explaining why. I know of
+ // no way to use TUT to code a repeatable test in which the expected
+ // outcome is a compile error. The interested reader is invited to
+ // uncomment this block and build to see for herself.
+
+ // listen() detecting shared_ptr<TempListener> in boost::bind() object
+ bool live = false;
+ LLEventPump& heaptest(pumps.obtain("heaptest"));
+ LLBoundListener connection;
+ std::string listenerName("heap");
+ ensure("default state", !connection.connected());
+ {
+ boost::shared_ptr<TempListener> newListener(new TempListener(listenerName, live));
+ ensure_equals("use_count", newListener.use_count(), 1);
+ newListener->reset();
+ ensure("TempListener constructed", live);
+ connection = heaptest.listen(newListener->getName(),
+ boost::bind(&Listener::call, newListener, _1));
+ ensure("new connection", connection.connected());
+ ensure_equals("use_count", newListener.use_count(), 2);
+ heaptest.post(1);
+ check_listener("received", *newListener, 1);
+ } // this should make newListener go away...
+ // Unfortunately, the fact that we've bound a shared_ptr by value into
+ // our LLEventPump means that copy will keep the referenced object alive.
+ ensure("TempListener still alive", live);
+ ensure("still connected", connection.connected());
+ // disconnecting explicitly should delete the TempListener...
+ heaptest.stopListening(listenerName);
#if 0 // however, in my experience, it does not. I don't know why not.
- // Ah: on 2009-02-19, Frank Mori Hess, author of the Boost.Signals2
- // library, stated on the boost-users mailing list:
- // http://www.nabble.com/Re%3A--signals2--review--The-review-of-the-signals2-library-(formerly-thread_safe_signals)-begins-today%2C-Nov-1st-p22102367.html
- // "It will get destroyed eventually. The signal cleans up its slot
- // list little by little during connect/invoke. It doesn't immediately
- // remove disconnected slots from the slot list since other threads
- // might be using the same slot list concurrently. It might be
- // possible to make it immediately reset the shared_ptr owning the
- // slot though, leaving an empty shared_ptr in the slot list, since
- // that wouldn't invalidate any iterators."
- ensure("TempListener destroyed", ! live);
- ensure("implicit disconnect", ! connection.connected());
+ // Ah: on 2009-02-19, Frank Mori Hess, author of the Boost.Signals2
+ // library, stated on the boost-users mailing list:
+ // http://www.nabble.com/Re%3A--signals2--review--The-review-of-the-signals2-library-(formerly-thread_safe_signals)-begins-today%2C-Nov-1st-p22102367.html
+ // "It will get destroyed eventually. The signal cleans up its slot
+ // list little by little during connect/invoke. It doesn't immediately
+ // remove disconnected slots from the slot list since other threads
+ // might be using the same slot list concurrently. It might be
+ // possible to make it immediately reset the shared_ptr owning the
+ // slot though, leaving an empty shared_ptr in the slot list, since
+ // that wouldn't invalidate any iterators."
+ ensure("TempListener destroyed", ! live);
+ ensure("implicit disconnect", ! connection.connected());
#endif // 0
- // now just make sure we don't blow up trying to access a freed object!
- heaptest.post(2);
+ // now just make sure we don't blow up trying to access a freed object!
+ heaptest.post(2);
|*==========================================================================*/
- }
-
- class TempTrackableListener: public TempListener, public LLEventTrackable
- {
- public:
- TempTrackableListener(const std::string& name, bool& liveFlag):
- TempListener(name, liveFlag)
- {}
- };
-
- template<> template<>
- void events_object::test<13>()
- {
- set_test_name("listen(boost::bind(...TempTrackableListener ref...))");
- bool live = false;
- LLEventPump& heaptest(pumps.obtain("heaptest"));
- LLBoundListener connection;
- {
- TempTrackableListener tempListener("temp", live);
- ensure("TempTrackableListener constructed", live);
- connection = heaptest.listen(tempListener.getName(),
- boost::bind(&TempTrackableListener::call,
- boost::ref(tempListener), _1));
- heaptest.post(1);
- check_listener("received", tempListener, 1);
- } // presumably this will make tempListener go away?
- // verify that
- ensure("TempTrackableListener destroyed", ! live);
- ensure("implicit disconnect", ! connection.connected());
- // now just make sure we don't blow up trying to access a freed object!
- heaptest.post(2);
- }
-
- template<> template<>
- void events_object::test<14>()
- {
- set_test_name("listen(boost::bind(...TempTrackableListener pointer...))");
- bool live = false;
- LLEventPump& heaptest(pumps.obtain("heaptest"));
- LLBoundListener connection;
- {
- TempTrackableListener* newListener(new TempTrackableListener("temp", live));
- ensure("TempTrackableListener constructed", live);
- connection = heaptest.listen(newListener->getName(),
- boost::bind(&TempTrackableListener::call,
- newListener, _1));
- heaptest.post(1);
- check_listener("received", *newListener, 1);
- // explicitly destroy newListener
- delete newListener;
- }
- // verify that
- ensure("TempTrackableListener destroyed", ! live);
- ensure("implicit disconnect", ! connection.connected());
- // now just make sure we don't blow up trying to access a freed object!
- heaptest.post(2);
- }
-
- template<> template<>
- void events_object::test<15>()
- {
- // This test ensures that using an LLListenerWrapper subclass doesn't
- // block Boost.Signals2 from recognizing a bound LLEventTrackable
- // subclass.
- set_test_name("listen(llwrap<LLLogListener>(boost::bind(...TempTrackableListener ref...)))");
- bool live = false;
- LLEventPump& heaptest(pumps.obtain("heaptest"));
- LLBoundListener connection;
- {
- TempTrackableListener tempListener("temp", live);
- ensure("TempTrackableListener constructed", live);
- connection = heaptest.listen(tempListener.getName(),
- llwrap<LLLogListener>(
- boost::bind(&TempTrackableListener::call,
- boost::ref(tempListener), _1)));
- heaptest.post(1);
- check_listener("received", tempListener, 1);
- } // presumably this will make tempListener go away?
- // verify that
- ensure("TempTrackableListener destroyed", ! live);
- ensure("implicit disconnect", ! connection.connected());
- // now just make sure we don't blow up trying to access a freed object!
- heaptest.post(2);
- }
-
- class TempSharedListener: public TempListener,
- public boost::enable_shared_from_this<TempSharedListener>
- {
- public:
- TempSharedListener(const std::string& name, bool& liveFlag):
- TempListener(name, liveFlag)
- {}
- };
-
- template<> template<>
- void events_object::test<16>()
- {
- set_test_name("listen(boost::bind(...TempSharedListener ref...))");
+}
+
+class TempTrackableListener: public TempListener, public LLEventTrackable
+{
+public:
+TempTrackableListener(const std::string& name, bool& liveFlag):
+ TempListener(name, liveFlag)
+{}
+};
+
+template<> template<>
+void events_object::test<13>()
+{
+set_test_name("listen(boost::bind(...TempTrackableListener ref...))");
+bool live = false;
+LLEventPump& heaptest(pumps.obtain("heaptest"));
+LLBoundListener connection;
+{
+ TempTrackableListener tempListener("temp", live);
+ ensure("TempTrackableListener constructed", live);
+ connection = heaptest.listen(tempListener.getName(),
+ boost::bind(&TempTrackableListener::call,
+ boost::ref(tempListener), _1));
+ heaptest.post(1);
+ check_listener("received", tempListener, 1);
+} // presumably this will make tempListener go away?
+// verify that
+ensure("TempTrackableListener destroyed", ! live);
+ensure("implicit disconnect", ! connection.connected());
+// now just make sure we don't blow up trying to access a freed object!
+heaptest.post(2);
+}
+
+template<> template<>
+void events_object::test<14>()
+{
+set_test_name("listen(boost::bind(...TempTrackableListener pointer...))");
+bool live = false;
+LLEventPump& heaptest(pumps.obtain("heaptest"));
+LLBoundListener connection;
+{
+ TempTrackableListener* newListener(new TempTrackableListener("temp", live));
+ ensure("TempTrackableListener constructed", live);
+ connection = heaptest.listen(newListener->getName(),
+ boost::bind(&TempTrackableListener::call,
+ newListener, _1));
+ heaptest.post(1);
+ check_listener("received", *newListener, 1);
+ // explicitly destroy newListener
+ delete newListener;
+}
+// verify that
+ensure("TempTrackableListener destroyed", ! live);
+ensure("implicit disconnect", ! connection.connected());
+// now just make sure we don't blow up trying to access a freed object!
+heaptest.post(2);
+}
+
+template<> template<>
+void events_object::test<15>()
+{
+// This test ensures that using an LLListenerWrapper subclass doesn't
+// block Boost.Signals2 from recognizing a bound LLEventTrackable
+// subclass.
+set_test_name("listen(llwrap<LLLogListener>(boost::bind(...TempTrackableListener ref...)))");
+bool live = false;
+LLEventPump& heaptest(pumps.obtain("heaptest"));
+LLBoundListener connection;
+{
+ TempTrackableListener tempListener("temp", live);
+ ensure("TempTrackableListener constructed", live);
+ connection = heaptest.listen(tempListener.getName(),
+ llwrap<LLLogListener>(
+ boost::bind(&TempTrackableListener::call,
+ boost::ref(tempListener), _1)));
+ heaptest.post(1);
+ check_listener("received", tempListener, 1);
+} // presumably this will make tempListener go away?
+// verify that
+ensure("TempTrackableListener destroyed", ! live);
+ensure("implicit disconnect", ! connection.connected());
+// now just make sure we don't blow up trying to access a freed object!
+heaptest.post(2);
+}
+
+class TempSharedListener: public TempListener,
+public boost::enable_shared_from_this<TempSharedListener>
+{
+public:
+TempSharedListener(const std::string& name, bool& liveFlag):
+ TempListener(name, liveFlag)
+{}
+};
+
+template<> template<>
+void events_object::test<16>()
+{
+ set_test_name("listen(boost::bind(...TempSharedListener ref...))");
#if 0
- bool live = false;
- LLEventPump& heaptest(pumps.obtain("heaptest"));
- LLBoundListener connection;
- {
- // We MUST have at least one shared_ptr to an
- // enable_shared_from_this subclass object before
- // shared_from_this() can work.
- boost::shared_ptr<TempSharedListener>
- tempListener(new TempSharedListener("temp", live));
- ensure("TempSharedListener constructed", live);
- // However, we're not passing either the shared_ptr or its
- // corresponding weak_ptr -- instead, we're passing a reference to
- // the TempSharedListener.
+bool live = false;
+LLEventPump& heaptest(pumps.obtain("heaptest"));
+LLBoundListener connection;
+{
+ // We MUST have at least one shared_ptr to an
+ // enable_shared_from_this subclass object before
+ // shared_from_this() can work.
+ boost::shared_ptr<TempSharedListener>
+ tempListener(new TempSharedListener("temp", live));
+ ensure("TempSharedListener constructed", live);
+ // However, we're not passing either the shared_ptr or its
+ // corresponding weak_ptr -- instead, we're passing a reference to
+ // the TempSharedListener.
/*==========================================================================*|
- std::cout << "Capturing const ref" << std::endl;
- const boost::enable_shared_from_this<TempSharedListener>& cref(*tempListener);
- std::cout << "Capturing const ptr" << std::endl;
- const boost::enable_shared_from_this<TempSharedListener>* cp(&cref);
- std::cout << "Capturing non-const ptr" << std::endl;
- boost::enable_shared_from_this<TempSharedListener>* p(const_cast<boost::enable_shared_from_this<TempSharedListener>*>(cp));
- std::cout << "Capturing shared_from_this()" << std::endl;
- boost::shared_ptr<TempSharedListener> sp(p->shared_from_this());
- std::cout << "Capturing weak_ptr" << std::endl;
- boost::weak_ptr<TempSharedListener> wp(weaken(sp));
- std::cout << "Binding weak_ptr" << std::endl;
+ std::cout << "Capturing const ref" << std::endl;
+ const boost::enable_shared_from_this<TempSharedListener>& cref(*tempListener);
+ std::cout << "Capturing const ptr" << std::endl;
+ const boost::enable_shared_from_this<TempSharedListener>* cp(&cref);
+ std::cout << "Capturing non-const ptr" << std::endl;
+ boost::enable_shared_from_this<TempSharedListener>* p(const_cast<boost::enable_shared_from_this<TempSharedListener>*>(cp));
+ std::cout << "Capturing shared_from_this()" << std::endl;
+ boost::shared_ptr<TempSharedListener> sp(p->shared_from_this());
+ std::cout << "Capturing weak_ptr" << std::endl;
+ boost::weak_ptr<TempSharedListener> wp(weaken(sp));
+ std::cout << "Binding weak_ptr" << std::endl;
|*==========================================================================*/
- connection = heaptest.listen(tempListener->getName(),
- boost::bind(&TempSharedListener::call, *tempListener, _1));
- heaptest.post(1);
- check_listener("received", *tempListener, 1);
- } // presumably this will make tempListener go away?
- // verify that
- ensure("TempSharedListener destroyed", ! live);
- ensure("implicit disconnect", ! connection.connected());
- // now just make sure we don't blow up trying to access a freed object!
- heaptest.post(2);
+ connection = heaptest.listen(tempListener->getName(),
+ boost::bind(&TempSharedListener::call, *tempListener, _1));
+ heaptest.post(1);
+ check_listener("received", *tempListener, 1);
+} // presumably this will make tempListener go away?
+// verify that
+ensure("TempSharedListener destroyed", ! live);
+ensure("implicit disconnect", ! connection.connected());
+// now just make sure we don't blow up trying to access a freed object!
+heaptest.post(2);
#endif // 0
- }
+}
} // namespace tut
diff --git a/indra/test/llhttpclient_tut.cpp b/indra/test/llhttpclient_tut.cpp
index 03759001ae..4b4046632c 100644
--- a/indra/test/llhttpclient_tut.cpp
+++ b/indra/test/llhttpclient_tut.cpp
@@ -40,6 +40,7 @@
#include "llhttpclient.h"
#include "llformat.h"
#include "llpipeutil.h"
+#include "llproxy.h"
#include "llpumpio.h"
#include "llsdhttpserver.h"
@@ -85,9 +86,10 @@ namespace tut
HTTPClientTestData()
{
apr_pool_create(&mPool, NULL);
+ LLCurl::initClass(false);
mServerPump = new LLPumpIO(mPool);
mClientPump = new LLPumpIO(mPool);
-
+
LLHTTPClient::setPump(*mClientPump);
}
@@ -95,6 +97,7 @@ namespace tut
{
delete mServerPump;
delete mClientPump;
+ LLProxy::cleanupClass();
apr_pool_destroy(mPool);
}
diff --git a/indra/test/llsd_new_tut.cpp b/indra/test/llsd_new_tut.cpp
index dd93b36f04..f928a1bad0 100644
--- a/indra/test/llsd_new_tut.cpp
+++ b/indra/test/llsd_new_tut.cpp
@@ -5,7 +5,7 @@
*
* $LicenseInfo:firstyear=2006&license=viewerlgpl$
* Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
+ * Copyright (C) 2006-2011, Linden Research, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -25,6 +25,7 @@
* $/LicenseInfo$
*/
+#define LLSD_DEBUG_INFO
#include <tut/tut.hpp>
#include "linden_common.h"
#include "lltut.h"
@@ -32,6 +33,19 @@
#include "llsdtraits.h"
#include "llstring.h"
+#if LL_WINDOWS
+#include <float.h>
+namespace
+{
+ int fpclassify(double x)
+ {
+ return _fpclass(x);
+ }
+}
+#else
+using std::fpclassify;
+#endif
+
namespace tut
{
class SDCleanupCheck
@@ -39,11 +53,11 @@ namespace tut
private:
U32 mOutstandingAtStart;
public:
- SDCleanupCheck() : mOutstandingAtStart(LLSD::outstandingCount()) { }
+ SDCleanupCheck() : mOutstandingAtStart(llsd::outstandingCount()) { }
~SDCleanupCheck()
{
ensure_equals("SDCleanupCheck",
- LLSD::outstandingCount(), mOutstandingAtStart);
+ llsd::outstandingCount(), mOutstandingAtStart);
}
};
@@ -57,12 +71,12 @@ namespace tut
SDAllocationCheck(const std::string& message, int expectedAllocations)
: mMessage(message),
mExpectedAllocations(expectedAllocations),
- mAllocationAtStart(LLSD::allocationCount())
+ mAllocationAtStart(llsd::allocationCount())
{ }
~SDAllocationCheck()
{
ensure_equals(mMessage + " SDAllocationCheck",
- LLSD::allocationCount() - mAllocationAtStart,
+ llsd::allocationCount() - mAllocationAtStart,
mExpectedAllocations);
}
};
@@ -218,19 +232,16 @@ namespace tut
}
else
{
-// TODO: Fix on windows....
-#ifndef LL_WINDOWS
-# if !defined(fpclassify) && __GNUC__ >= 3
-# define FPCLASSIFY_NAMESPACE std::
-# else
-# define FPCLASSIFY_NAMESPACE
-# endif
- int left = FPCLASSIFY_NAMESPACE fpclassify(v.asReal());
- int right = FPCLASSIFY_NAMESPACE fpclassify(eReal);
+ int left = fpclassify(v.asReal());
+ int right = fpclassify(eReal);
ensure_equals(s+" to real", left, right);
- ensure_equals(s+" to string", v.asString(), eString);
-#endif
+ // ensure_equals(s+" to string", v.asString(), eString);
+ // I've commented this check out, since there doesn't
+ // seem to be uniform string representation for NaN on
+ // all platforms. For example, on my Ubuntu 8.10 laptop
+ // with libc 2.11.1, sqrt(-1.0) will return '-nan', not
+ // 'nan'.
}
}
@@ -742,6 +753,78 @@ namespace tut
LLSD w = v;
w = "nice day";
}
+
+ {
+ SDAllocationCheck check("shared values test for threaded work", 9);
+
+ //U32 start_llsd_count = llsd::outstandingCount();
+
+ LLSD m = LLSD::emptyMap();
+
+ m["one"] = 1;
+ m["two"] = 2;
+ m["one_copy"] = m["one"]; // 3 (m, "one" and "two")
+
+ m["undef_one"] = LLSD();
+ m["undef_two"] = LLSD();
+ m["undef_one_copy"] = m["undef_one"];
+
+ { // Ensure first_array gets freed to avoid counting it
+ LLSD first_array = LLSD::emptyArray();
+ first_array.append(1.0f);
+ first_array.append(2.0f);
+ first_array.append(3.0f); // 7
+
+ m["array"] = first_array;
+ m["array_clone"] = first_array;
+ m["array_copy"] = m["array"]; // 7
+ }
+
+ m["string_one"] = "string one value";
+ m["string_two"] = "string two value";
+ m["string_one_copy"] = m["string_one"]; // 9
+
+ //U32 llsd_object_count = llsd::outstandingCount();
+ //std::cout << "Using " << (llsd_object_count - start_llsd_count) << " LLSD objects" << std::endl;
+
+ //m.dumpStats();
+ }
+
+ {
+ SDAllocationCheck check("shared values test for threaded work", 9);
+
+ //U32 start_llsd_count = LLSD::outstandingCount();
+
+ LLSD m = LLSD::emptyMap();
+
+ m["one"] = 1;
+ m["two"] = 2;
+ m["one_copy"] = m["one"]; // 3 (m, "one" and "two")
+
+ m["undef_one"] = LLSD();
+ m["undef_two"] = LLSD();
+ m["undef_one_copy"] = m["undef_one"];
+
+ { // Ensure first_array gets freed to avoid counting it
+ LLSD first_array = LLSD::emptyArray();
+ first_array.append(1.0f);
+ first_array.append(2.0f);
+ first_array.append(3.0f); // 7
+
+ m["array"] = first_array;
+ m["array_clone"] = first_array;
+ m["array_copy"] = m["array"]; // 7
+ }
+
+ m["string_one"] = "string one value";
+ m["string_two"] = "string two value";
+ m["string_one_copy"] = m["string_one"]; // 9
+
+ //U32 llsd_object_count = LLSD::outstandingCount();
+ //std::cout << "Using " << (llsd_object_count - start_llsd_count) << " LLSD objects" << std::endl;
+
+ //m.dumpStats();
+ }
}
template<> template<>
@@ -769,4 +852,3 @@ namespace tut
test serializations
*/
}
-
diff --git a/indra/test/llsdmessagebuilder_tut.cpp b/indra/test/llsdmessagebuilder_tut.cpp
index cc6f78decd..be0692557a 100644
--- a/indra/test/llsdmessagebuilder_tut.cpp
+++ b/indra/test/llsdmessagebuilder_tut.cpp
@@ -33,6 +33,7 @@
#include "llsdmessagebuilder.h"
#include "llsdmessagereader.h"
#include "llsdtraits.h"
+#include "llmath.h"
#include "llquaternion.h"
#include "u64.h"
#include "v3dmath.h"
@@ -86,17 +87,17 @@ namespace tut
return createTemplateBlock(_PREHASH_Test0, type, size, block);
}
- static LLMessageBlock* createTemplateBlock(char* name, const EMsgVariableType type = MVT_NULL, const S32 size = 0, EMsgBlockType block = MBT_VARIABLE)
+ static LLMessageBlock* createTemplateBlock(const char* name, const EMsgVariableType type = MVT_NULL, const S32 size = 0, EMsgBlockType block = MBT_VARIABLE)
{
LLMessageBlock* result = new LLMessageBlock(name, block);
if(type != MVT_NULL)
{
- result->addVariable(_PREHASH_Test0, type, size);
+ result->addVariable(const_cast<char*>(_PREHASH_Test0), type, size);
}
return result;
}
- static LLTemplateMessageBuilder* defaultTemplateBuilder(LLMessageTemplate& messageTemplate, char* name = _PREHASH_Test0)
+ static LLTemplateMessageBuilder* defaultTemplateBuilder(LLMessageTemplate& messageTemplate, char* name = const_cast<char*>(_PREHASH_Test0))
{
templateNameMap[_PREHASH_TestMessage] = &messageTemplate;
LLTemplateMessageBuilder* builder = new LLTemplateMessageBuilder(templateNameMap);
diff --git a/indra/test/lltemplatemessagebuilder_tut.cpp b/indra/test/lltemplatemessagebuilder_tut.cpp
index 09beb53869..6e1c82bb24 100644
--- a/indra/test/lltemplatemessagebuilder_tut.cpp
+++ b/indra/test/lltemplatemessagebuilder_tut.cpp
@@ -31,6 +31,7 @@
#include "llapr.h"
#include "llmessagetemplate.h"
+#include "llmath.h"
#include "llquaternion.h"
#include "lltemplatemessagebuilder.h"
#include "lltemplatemessagereader.h"
@@ -75,7 +76,7 @@ namespace tut
static LLMessageBlock* defaultBlock(const EMsgVariableType type = MVT_NULL, const S32 size = 0, EMsgBlockType block = MBT_VARIABLE)
{
- return createBlock(_PREHASH_Test0, type, size, block);
+ return createBlock(const_cast<char*>(_PREHASH_Test0), type, size, block);
}
static LLMessageBlock* createBlock(char* name, const EMsgVariableType type = MVT_NULL, const S32 size = 0, EMsgBlockType block = MBT_VARIABLE)
@@ -83,12 +84,12 @@ namespace tut
LLMessageBlock* result = new LLMessageBlock(name, block);
if(type != MVT_NULL)
{
- result->addVariable(_PREHASH_Test0, type, size);
+ result->addVariable(const_cast<char*>(_PREHASH_Test0), type, size);
}
return result;
}
- static LLTemplateMessageBuilder* defaultBuilder(LLMessageTemplate& messageTemplate, char* name = _PREHASH_Test0)
+ static LLTemplateMessageBuilder* defaultBuilder(LLMessageTemplate& messageTemplate, char* name = const_cast<char*>(_PREHASH_Test0))
{
nameMap[_PREHASH_TestMessage] = &messageTemplate;
LLTemplateMessageBuilder* builder = new LLTemplateMessageBuilder(nameMap);
@@ -403,11 +404,11 @@ namespace tut
// build template: Test0 before Test1
LLMessageTemplate messageTemplate = defaultTemplate();
- messageTemplate.addBlock(createBlock(_PREHASH_Test0, MVT_U32, 4, MBT_SINGLE));
- messageTemplate.addBlock(createBlock(_PREHASH_Test1, MVT_U32, 4, MBT_SINGLE));
+ messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test0), MVT_U32, 4, MBT_SINGLE));
+ messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test1), MVT_U32, 4, MBT_SINGLE));
// build message: 1st declared block var == 0xaaaa, 2nd declared block var == 0xbbbb
- LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate, _PREHASH_Test0);
+ LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate, const_cast<char*>(_PREHASH_Test0));
builder->addU32(_PREHASH_Test0, 0xaaaa);
builder->nextBlock(_PREHASH_Test1);
builder->addU32(_PREHASH_Test0, 0xbbbb);
@@ -416,11 +417,11 @@ namespace tut
// build template: Test1 before Test0
messageTemplate = defaultTemplate();
- messageTemplate.addBlock(createBlock(_PREHASH_Test1, MVT_U32, 4, MBT_SINGLE));
- messageTemplate.addBlock(createBlock(_PREHASH_Test0, MVT_U32, 4, MBT_SINGLE));
+ messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test1), MVT_U32, 4, MBT_SINGLE));
+ messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test0), MVT_U32, 4, MBT_SINGLE));
// build message: 1st declared block var == 0xaaaa, 2nd declared block var == 0xbbbb
- builder = defaultBuilder(messageTemplate, _PREHASH_Test1);
+ builder = defaultBuilder(messageTemplate, const_cast<char*>(_PREHASH_Test1));
builder->addU32(_PREHASH_Test0, 0xaaaa);
builder->nextBlock(_PREHASH_Test0);
builder->addU32(_PREHASH_Test0, 0xbbbb);
@@ -443,11 +444,11 @@ namespace tut
// build template: Test0 before Test1
LLMessageTemplate messageTemplate = defaultTemplate();
- messageTemplate.addBlock(createBlock(_PREHASH_Test0, MVT_U32, 4, MBT_SINGLE));
- messageTemplate.addBlock(createBlock(_PREHASH_Test1, MVT_U32, 4, MBT_SINGLE));
+ messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test0), MVT_U32, 4, MBT_SINGLE));
+ messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test1), MVT_U32, 4, MBT_SINGLE));
// build message: 1st declared block var == 0xaaaa, 2nd declared block var == 0xbbbb
- LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate, _PREHASH_Test0);
+ LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate, const_cast<char*>(_PREHASH_Test0));
builder->addU32(_PREHASH_Test0, 0xaaaa);
builder->nextBlock(_PREHASH_Test1);
builder->addU32(_PREHASH_Test0, 0xbbbb);
@@ -455,7 +456,7 @@ namespace tut
delete builder;
// build message: 1st declared block var == 0xaaaa, 2nd declared block var == 0xbbbb
- builder = defaultBuilder(messageTemplate, _PREHASH_Test1);
+ builder = defaultBuilder(messageTemplate, const_cast<char*>(_PREHASH_Test1));
builder->addU32(_PREHASH_Test0, 0xbbbb);
builder->nextBlock(_PREHASH_Test0);
builder->addU32(_PREHASH_Test0, 0xaaaa);
@@ -478,21 +479,21 @@ namespace tut
// Build template: Test0 only
LLMessageTemplate messageTemplate = defaultTemplate();
- messageTemplate.addBlock(createBlock(_PREHASH_Test0, MVT_U32, 4, MBT_SINGLE));
+ messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test0), MVT_U32, 4, MBT_SINGLE));
// Build message
- LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate, _PREHASH_Test0);
+ LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate, const_cast<char*>(_PREHASH_Test0));
builder->addU32(_PREHASH_Test0, 0xaaaa);
bufferSize1 = builder->buildMessage(buffer1, MAX_BUFFER_SIZE, 0);
delete builder;
// Build template: Test0 before Test1
messageTemplate = defaultTemplate();
- messageTemplate.addBlock(createBlock(_PREHASH_Test0, MVT_U32, 4, MBT_SINGLE));
- messageTemplate.addBlock(createBlock(_PREHASH_Test1, MVT_U32, 4, MBT_SINGLE));
+ messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test0), MVT_U32, 4, MBT_SINGLE));
+ messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test1), MVT_U32, 4, MBT_SINGLE));
// Build message
- builder = defaultBuilder(messageTemplate, _PREHASH_Test0);
+ builder = defaultBuilder(messageTemplate, const_cast<char*>(_PREHASH_Test0));
builder->addU32(_PREHASH_Test0, 0xaaaa);
builder->nextBlock(_PREHASH_Test1);
builder->addU32(_PREHASH_Test0, 0xbbbb);
@@ -511,8 +512,8 @@ namespace tut
U32 inTest00 = 0, inTest01 = 1, inTest1 = 2;
U32 outTest00, outTest01, outTest1;
LLMessageTemplate messageTemplate = defaultTemplate();
- messageTemplate.addBlock(createBlock(_PREHASH_Test0, MVT_U32, 4));
- messageTemplate.addBlock(createBlock(_PREHASH_Test1, MVT_U32, 4));
+ messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test0), MVT_U32, 4));
+ messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test1), MVT_U32, 4));
LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate);
builder->addU32(_PREHASH_Test0, inTest00);
builder->nextBlock(_PREHASH_Test0);
@@ -536,15 +537,15 @@ namespace tut
U32 inTest = 1, outTest;
LLMessageTemplate messageTemplate = defaultTemplate();
messageTemplate.addBlock(
- createBlock(_PREHASH_Test0, MVT_U32, 4, MBT_SINGLE));
- messageTemplate.addBlock(createBlock(_PREHASH_Test1, MVT_U32, 4));
+ createBlock(const_cast<char*>(_PREHASH_Test0), MVT_U32, 4, MBT_SINGLE));
+ messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test1), MVT_U32, 4));
LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate);
builder->addU32(_PREHASH_Test0, inTest);
LLTemplateMessageReader* reader = setReader(messageTemplate, builder);
reader->getU32(_PREHASH_Test0, _PREHASH_Test0, outTest);
- S32 blockCount = reader->getNumberOfBlocks(_PREHASH_Test1);
+ S32 blockCount = reader->getNumberOfBlocks(const_cast<char*>(_PREHASH_Test1));
ensure_equals("Ensure block count", blockCount, 0);
ensure_equals("Ensure Test0", inTest, outTest);
delete reader;
@@ -556,7 +557,7 @@ namespace tut
{
// build template
LLMessageTemplate messageTemplate = defaultTemplate();
- messageTemplate.addBlock(createBlock(_PREHASH_Test0, MVT_U32, 4));
+ messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test0), MVT_U32, 4));
// build message
LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate);
@@ -881,7 +882,7 @@ namespace tut
delete builder;
// add block to reader template
- messageTemplate.addBlock(createBlock(_PREHASH_Test1, MVT_U32, 4, MBT_SINGLE));
+ messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test1), MVT_U32, 4, MBT_SINGLE));
// read message value and default value
numberMap[1] = &messageTemplate;
@@ -914,7 +915,7 @@ namespace tut
delete builder;
// add variable block to reader template
- messageTemplate.addBlock(createBlock(_PREHASH_Test1, MVT_U32, 4));
+ messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test1), MVT_U32, 4));
// read message value and check block repeat count
numberMap[1] = &messageTemplate;
@@ -947,7 +948,7 @@ namespace tut
delete builder;
// add variable block to reader template
- messageTemplate.addBlock(createBlock(_PREHASH_Test1, MVT_VARIABLE, 4,
+ messageTemplate.addBlock(createBlock(const_cast<char*>(_PREHASH_Test1), MVT_VARIABLE, 4,
MBT_SINGLE));
// read message value and default string
diff --git a/indra/test/lltut.cpp b/indra/test/lltut.cpp
index da7031b52a..c43a8f0c7d 100644
--- a/indra/test/lltut.cpp
+++ b/indra/test/lltut.cpp
@@ -34,6 +34,7 @@
#include "llformat.h"
#include "llsd.h"
#include "lluri.h"
+#include "stringize.h"
namespace tut
{
@@ -144,6 +145,10 @@ namespace tut
}
return;
}
+ default:
+ // should never get here, but compiler produces warning if we
+ // don't cover this case, and at Linden warnings are fatal.
+ throw failure(STRINGIZE("invalid type field " << actual.type()));
}
}
diff --git a/indra/test/test.cpp b/indra/test/test.cpp
index ffdb0cb976..e58e7293fb 100644
--- a/indra/test/test.cpp
+++ b/indra/test/test.cpp
@@ -37,6 +37,7 @@
#include "linden_common.h"
#include "llerrorcontrol.h"
#include "lltut.h"
+#include "stringize.h"
#include "apr_pools.h"
#include "apr_getopt.h"
@@ -53,6 +54,22 @@
#include <gtest/gtest.h>
#endif
+#if LL_MSVC
+#pragma warning (push)
+#pragma warning (disable : 4702) // warning C4702: unreachable code
+#endif
+#include <boost/iostreams/tee.hpp>
+#include <boost/iostreams/stream.hpp>
+#if LL_MSVC
+#pragma warning (pop)
+#endif
+
+#include <boost/scoped_ptr.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/make_shared.hpp>
+#include <boost/foreach.hpp>
+#include <boost/lambda/lambda.hpp>
+
namespace tut
{
std::string sSourceDir;
@@ -69,8 +86,24 @@ public:
mPassedTests(0),
mFailedTests(0),
mSkippedTests(0),
- mStream(stream)
+ // By default, capture a shared_ptr to std::cout, with a no-op "deleter"
+ // so that destroying the shared_ptr makes no attempt to delete std::cout.
+ mStream(boost::shared_ptr<std::ostream>(&std::cout, boost::lambda::_1))
{
+ if (stream)
+ {
+ // We want a boost::iostreams::tee_device that will stream to two
+ // std::ostreams.
+ typedef boost::iostreams::tee_device<std::ostream, std::ostream> TeeDevice;
+ // More than that, though, we want an actual stream using that
+ // device.
+ typedef boost::iostreams::stream<TeeDevice> TeeStream;
+ // Allocate and assign in two separate steps, per Herb Sutter.
+ // (Until we turn on C++11 support, have to wrap *stream with
+ // boost::ref() due to lack of perfect forwarding.)
+ boost::shared_ptr<std::ostream> pstream(new TeeStream(std::cout, boost::ref(*stream)));
+ mStream = pstream;
+ }
}
~LLTestCallback()
@@ -83,18 +116,21 @@ public:
}
virtual void group_started(const std::string& name) {
- std::cout << "Unit test group_started name=" << name << std::endl;
+ *mStream << "Unit test group_started name=" << name << std::endl;
}
virtual void group_completed(const std::string& name) {
- std::cout << "Unit test group_completed name=" << name << std::endl;
+ *mStream << "Unit test group_completed name=" << name << std::endl;
}
virtual void test_completed(const tut::test_result& tr)
{
++mTotalTests;
std::ostringstream out;
- out << "[" << tr.group << ", " << tr.test << "] ";
+ out << "[" << tr.group << ", " << tr.test;
+ if (! tr.name.empty())
+ out << ": " << tr.name;
+ out << "] ";
switch(tr.result)
{
case tut::test_result::ok:
@@ -123,56 +159,43 @@ public:
break;
default:
++mFailedTests;
- out << "unknown";
+ out << "unknown (tr.result == " << tr.result << ")";
}
if(mVerboseMode || (tr.result != tut::test_result::ok))
{
+ *mStream << out.str();
if(!tr.message.empty())
{
- out << ": '" << tr.message << "'";
- }
- if (mStream)
- {
- *mStream << out.str() << std::endl;
+ *mStream << ": '" << tr.message << "'";
}
-
- std::cout << out.str() << std::endl;
- }
- }
-
- virtual void run_completed()
- {
- if (mStream)
- {
- run_completed_(*mStream);
+ *mStream << std::endl;
}
- run_completed_(std::cout);
}
virtual int getFailedTests() const { return mFailedTests; }
- virtual void run_completed_(std::ostream &stream)
+ virtual void run_completed()
{
- stream << "\tTotal Tests:\t" << mTotalTests << std::endl;
- stream << "\tPassed Tests:\t" << mPassedTests;
+ *mStream << "\tTotal Tests:\t" << mTotalTests << std::endl;
+ *mStream << "\tPassed Tests:\t" << mPassedTests;
if (mPassedTests == mTotalTests)
{
- stream << "\tYAY!! \\o/";
+ *mStream << "\tYAY!! \\o/";
}
- stream << std::endl;
+ *mStream << std::endl;
if (mSkippedTests > 0)
{
- stream << "\tSkipped known failures:\t" << mSkippedTests
+ *mStream << "\tSkipped known failures:\t" << mSkippedTests
<< std::endl;
}
if(mFailedTests > 0)
{
- stream << "*********************************" << std::endl;
- stream << "Failed Tests:\t" << mFailedTests << std::endl;
- stream << "Please report or fix the problem." << std::endl;
- stream << "*********************************" << std::endl;
+ *mStream << "*********************************" << std::endl;
+ *mStream << "Failed Tests:\t" << mFailedTests << std::endl;
+ *mStream << "Please report or fix the problem." << std::endl;
+ *mStream << "*********************************" << std::endl;
}
}
@@ -182,7 +205,7 @@ protected:
int mPassedTests;
int mFailedTests;
int mSkippedTests;
- std::ostream *mStream;
+ boost::shared_ptr<std::ostream> mStream;
};
// TeamCity specific class which emits service messages
@@ -192,84 +215,111 @@ class LLTCTestCallback : public LLTestCallback
{
public:
LLTCTestCallback(bool verbose_mode, std::ostream *stream) :
- LLTestCallback(verbose_mode, stream),
- mTCStream()
+ LLTestCallback(verbose_mode, stream)
{
}
~LLTCTestCallback()
{
- }
+ }
virtual void group_started(const std::string& name) {
LLTestCallback::group_started(name);
- mTCStream << "\n##teamcity[testSuiteStarted name='" << name << "']" << std::endl;
+ std::cout << "\n##teamcity[testSuiteStarted name='" << escape(name) << "']" << std::endl;
}
virtual void group_completed(const std::string& name) {
LLTestCallback::group_completed(name);
- mTCStream << "##teamcity[testSuiteFinished name='" << name << "']" << std::endl;
+ std::cout << "##teamcity[testSuiteFinished name='" << escape(name) << "']" << std::endl;
}
virtual void test_completed(const tut::test_result& tr)
{
+ std::string testname(STRINGIZE(tr.group << "." << tr.test));
+ if (! tr.name.empty())
+ {
+ testname.append(":");
+ testname.append(tr.name);
+ }
+ testname = escape(testname);
+
+ // Sadly, tut::callback doesn't give us control at test start; have to
+ // backfill start message into TC output.
+ std::cout << "##teamcity[testStarted name='" << testname << "']" << std::endl;
+
+ // now forward call to base class so any output produced there is in
+ // the right TC context
LLTestCallback::test_completed(tr);
switch(tr.result)
{
case tut::test_result::ok:
- mTCStream << "##teamcity[testStarted name='" << tr.group << "." << tr.test << "']" << std::endl;
- mTCStream << "##teamcity[testFinished name='" << tr.group << "." << tr.test << "']" << std::endl;
break;
+
case tut::test_result::fail:
- mTCStream << "##teamcity[testStarted name='" << tr.group << "." << tr.test << "']" << std::endl;
- mTCStream << "##teamcity[testFailed name='" << tr.group << "." << tr.test << "' message='" << tr.message << "']" << std::endl;
- mTCStream << "##teamcity[testFinished name='" << tr.group << "." << tr.test << "']" << std::endl;
- break;
case tut::test_result::ex:
- mTCStream << "##teamcity[testStarted name='" << tr.group << "." << tr.test << "']" << std::endl;
- mTCStream << "##teamcity[testFailed name='" << tr.group << "." << tr.test << "' message='" << tr.message << "']" << std::endl;
- mTCStream << "##teamcity[testFinished name='" << tr.group << "." << tr.test << "']" << std::endl;
- break;
case tut::test_result::warn:
- mTCStream << "##teamcity[testStarted name='" << tr.group << "." << tr.test << "']" << std::endl;
- mTCStream << "##teamcity[testFailed name='" << tr.group << "." << tr.test << "' message='" << tr.message << "']" << std::endl;
- mTCStream << "##teamcity[testFinished name='" << tr.group << "." << tr.test << "']" << std::endl;
- break;
case tut::test_result::term:
- mTCStream << "##teamcity[testStarted name='" << tr.group << "." << tr.test << "']" << std::endl;
- mTCStream << "##teamcity[testFailed name='" << tr.group << "." << tr.test << "' message='" << tr.message << "']" << std::endl;
- mTCStream << "##teamcity[testFinished name='" << tr.group << "." << tr.test << "']" << std::endl;
+ std::cout << "##teamcity[testFailed name='" << testname
+ << "' message='" << escape(tr.message) << "']" << std::endl;
break;
+
case tut::test_result::skip:
- mTCStream << "##teamcity[testStarted name='" << tr.group << "." << tr.test << "']" << std::endl;
- mTCStream << "##teamcity[testIgnored name='" << tr.group << "." << tr.test << "']" << std::endl;
- mTCStream << "##teamcity[testFinished name='" << tr.group << "." << tr.test << "']" << std::endl;
+ std::cout << "##teamcity[testIgnored name='" << testname << "']" << std::endl;
break;
+
default:
break;
}
+ std::cout << "##teamcity[testFinished name='" << testname << "']" << std::endl;
}
- virtual void run_completed()
+ static std::string escape(const std::string& str)
{
- LLTestCallback::run_completed();
-
- // dump the TC reporting results to cout
- tc_run_completed_(std::cout);
- }
-
- virtual void tc_run_completed_(std::ostream &stream)
- {
-
- // dump the TC reporting results to cout
- stream << mTCStream.str() << std::endl;
+ // Per http://confluence.jetbrains.net/display/TCD65/Build+Script+Interaction+with+TeamCity#BuildScriptInteractionwithTeamCity-ServiceMessages
+ std::string result;
+ BOOST_FOREACH(char c, str)
+ {
+ switch (c)
+ {
+ case '\'':
+ result.append("|'");
+ break;
+ case '\n':
+ result.append("|n");
+ break;
+ case '\r':
+ result.append("|r");
+ break;
+/*==========================================================================*|
+ // These are not possible 'char' values from a std::string.
+ case '\u0085': // next line
+ result.append("|x");
+ break;
+ case '\u2028': // line separator
+ result.append("|l");
+ break;
+ case '\u2029': // paragraph separator
+ result.append("|p");
+ break;
+|*==========================================================================*/
+ case '|':
+ result.append("||");
+ break;
+ case '[':
+ result.append("|[");
+ break;
+ case ']':
+ result.append("|]");
+ break;
+ default:
+ result.push_back(c);
+ break;
+ }
+ }
+ return result;
}
-
-protected:
- std::ostringstream mTCStream;
-
};
@@ -359,7 +409,7 @@ int main(int argc, char **argv)
apr_getopt_t* os = NULL;
if(APR_SUCCESS != apr_getopt_init(&os, pool, argc, argv))
{
- std::cerr << "Unable to pool" << std::endl;
+ std::cerr << "apr_getopt_init() failed" << std::endl;
return 1;
}
@@ -373,7 +423,7 @@ int main(int argc, char **argv)
apr_status_t apr_err;
const char* opt_arg = NULL;
int opt_id = 0;
- std::ofstream *output = NULL;
+ boost::scoped_ptr<std::ofstream> output;
const char *touch = NULL;
while(true)
@@ -403,7 +453,7 @@ int main(int argc, char **argv)
verbose_mode = true;
break;
case 'o':
- output = new std::ofstream;
+ output.reset(new std::ofstream);
output->open(opt_arg);
break;
case 's': // --sourcedir
@@ -437,11 +487,11 @@ int main(int argc, char **argv)
LLTestCallback* mycallback;
if (getenv("TEAMCITY_PROJECT_NAME"))
{
- mycallback = new LLTCTestCallback(verbose_mode, output);
+ mycallback = new LLTCTestCallback(verbose_mode, output.get());
}
else
{
- mycallback = new LLTestCallback(verbose_mode, output);
+ mycallback = new LLTestCallback(verbose_mode, output.get());
}
tut::runner.get().set_callback(mycallback);
@@ -463,12 +513,6 @@ int main(int argc, char **argv)
std::cin.get();
}
- if (output)
- {
- output->close();
- delete output;
- }
-
if (touch && success)
{
std::ofstream s;
diff --git a/indra/test/test_llmanifest.py b/indra/test/test_llmanifest.py
index 89c36f95dd..a97abbc6ee 100644
--- a/indra/test/test_llmanifest.py
+++ b/indra/test/test_llmanifest.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/env python
"""
@file test_llmanifest.py
@author Ryan Williams
diff --git a/indra/test_apps/llplugintest/CMakeLists.txt b/indra/test_apps/llplugintest/CMakeLists.txt
index b4043b0fd9..1211bb7e5a 100644
--- a/indra/test_apps/llplugintest/CMakeLists.txt
+++ b/indra/test_apps/llplugintest/CMakeLists.txt
@@ -1,5 +1,4 @@
# -*- cmake -*-
-
project(llplugintest)
include(00-Common)
@@ -379,8 +378,8 @@ endif (DARWIN OR WINDOWS)
if (DARWIN)
add_custom_command(TARGET llmediaplugintest POST_BUILD
- COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib_release/libllqtwebkit.dylib ${PLUGINS_DESTINATION_DIR}
- DEPENDS ${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib_release/libllqtwebkit.dylib
+ COMMAND ${CMAKE_COMMAND} -E copy ${ARCH_PREBUILT_DIRS_RELEASE}/libllqtwebkit.dylib ${PLUGINS_DESTINATION_DIR}
+ DEPENDS ${ARCH_PREBUILT_DIRS_RELEASE}/libllqtwebkit.dylib
)
endif (DARWIN)
@@ -389,7 +388,7 @@ if(WINDOWS)
# Plugin test library deploy
#
# Debug config runtime files required for the plugin test mule
- set(plugintest_debug_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/debug")
+ set(plugintest_debug_src_dir "${ARCH_PREBUILT_DIRS_DEBUG}")
set(plugintest_debug_files
libeay32.dll
libglib-2.0-0.dll
@@ -412,7 +411,7 @@ if(WINDOWS)
set(plugin_test_targets ${plugin_test_targets} ${out_targets})
# Debug config runtime files required for the plugin test mule (Qt image format plugins)
- set(plugintest_debug_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/debug/imageformats")
+ set(plugintest_debug_src_dir "${ARCH_PREBUILT_DIRS_DEBUG}/imageformats")
set(plugintest_debug_files
qgifd4.dll
qicod4.dll
@@ -430,7 +429,7 @@ if(WINDOWS)
set(plugin_test_targets ${plugin_test_targets} ${out_targets})
# Debug config runtime files required for the plugin test mule (Qt codec plugins)
- set(plugintest_debug_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/debug/codecs")
+ set(plugintest_debug_src_dir "${ARCH_PREBUILT_DIRS_DEBUG}/codecs")
set(plugintest_debug_files
qcncodecsd4.dll
qjpcodecsd4.dll
@@ -446,7 +445,7 @@ if(WINDOWS)
set(plugin_test_targets ${plugin_test_targets} ${out_targets})
# Release & ReleaseDebInfo config runtime files required for the plugin test mule
- set(plugintest_release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/release")
+ set(plugintest_release_src_dir "${ARCH_PREBUILT_DIRS_RELEASE}")
set(plugintest_release_files
libeay32.dll
libglib-2.0-0.dll
@@ -478,7 +477,7 @@ if(WINDOWS)
set(plugin_test_targets ${plugin_test_targets} ${out_targets})
# Release & ReleaseDebInfo config runtime files required for the plugin test mule (Qt image format plugins)
- set(plugintest_release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/release/imageformats")
+ set(plugintest_release_src_dir "${ARCH_PREBUILT_DIRS_RELEASE}/imageformats")
set(plugintest_release_files
qgif4.dll
qico4.dll
@@ -504,7 +503,7 @@ if(WINDOWS)
set(plugin_test_targets ${plugin_test_targets} ${out_targets})
# Release & ReleaseDebInfo config runtime files required for the plugin test mule (Qt codec plugins)
- set(plugintest_release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/release/codecs")
+ set(plugintest_release_src_dir "${ARCH_PREBUILT_DIRS_RELEASE}/codecs")
set(plugintest_release_files
qcncodecs4.dll
qjpcodecs4.dll
diff --git a/indra/test_apps/llplugintest/llmediaplugintest.cpp b/indra/test_apps/llplugintest/llmediaplugintest.cpp
index 873fa23db8..884b00f0cc 100644
--- a/indra/test_apps/llplugintest/llmediaplugintest.cpp
+++ b/indra/test_apps/llplugintest/llmediaplugintest.cpp
@@ -4,7 +4,7 @@
*
* $LicenseInfo:firstyear=2008&license=viewerlgpl$
* Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
+ * Copyright (C) 2011, Linden Research, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -1620,7 +1620,7 @@ mediaPanel* LLMediaPluginTest::addMediaPanel( std::string url )
std::string user_data_path = std::string( cwd ) + "/";
#endif
media_source->setUserDataPath(user_data_path);
- media_source->init( launcher_name, plugin_name, false );
+ media_source->init( launcher_name, user_data_path, plugin_name, false );
media_source->setDisableTimeout(mDisableTimeout);
// make a new panel and save parameters
@@ -1860,7 +1860,7 @@ mediaPanel* LLMediaPluginTest::replaceMediaPanel( mediaPanel* panel, std::string
#endif
media_source->setUserDataPath(user_data_path);
- media_source->init( launcher_name, plugin_name, false );
+ media_source->init( launcher_name, user_data_path, plugin_name, false );
media_source->setDisableTimeout(mDisableTimeout);
// make a new panel and save parameters
@@ -2154,6 +2154,10 @@ void LLMediaPluginTest::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent e
}
break;
+ case MEDIA_EVENT_NAVIGATE_ERROR_PAGE:
+ std::cerr << "Media event: MEDIA_EVENT_NAVIGATE_ERROR_PAGE, uri is: " << self->getClickURL() << std::endl;
+ break;
+
case MEDIA_EVENT_CLICK_LINK_HREF:
{
std::cerr << "Media event: MEDIA_EVENT_CLICK_LINK_HREF, uri is " << self->getClickURL() << ", target is " << self->getClickTarget() << std::endl;
@@ -2220,6 +2224,27 @@ void LLMediaPluginTest::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent e
<< ", height = " << self->getGeometryHeight()
<< std::endl;
break;
+
+ case MEDIA_EVENT_AUTH_REQUEST:
+ {
+ //std::cerr << "Media event: MEDIA_EVENT_AUTH_REQUEST, url " << self->getAuthURL() ", realm " << self->getAuthRealm() << std::endl;
+
+ // TODO: display an auth dialog
+ self->sendAuthResponse(false, "", "");
+ }
+ break;
+
+ case MEDIA_EVENT_LINK_HOVERED:
+ {
+ std::cerr << "Media event: MEDIA_EVENT_LINK_HOVERED, hover text is: " << self->getHoverText() << std::endl;
+ }
+ break;
+
+ default:
+ {
+ std::cerr << "Media event: <unknown>, code is: " << int(event) << std::endl;
+ }
+ break;
}
}
diff --git a/indra/tools/vstool/VSTool.csproj b/indra/tools/vstool/VSTool.csproj
index 24f1031f81..7f431e85c7 100644
--- a/indra/tools/vstool/VSTool.csproj
+++ b/indra/tools/vstool/VSTool.csproj
@@ -1,4 +1,5 @@
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
<PropertyGroup>
<ProjectType>Local</ProjectType>
<ProductVersion>8.0.50727</ProductVersion>
@@ -25,6 +26,8 @@
</FileUpgradeFlags>
<UpgradeBackupLocation>
</UpgradeBackupLocation>
+ <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+ <OldToolsVersion>2.0</OldToolsVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<OutputPath>.\</OutputPath>
diff --git a/indra/tools/vstool/VSTool.exe b/indra/tools/vstool/VSTool.exe
index 6d1497d5e5..8be428614e 100755
--- a/indra/tools/vstool/VSTool.exe
+++ b/indra/tools/vstool/VSTool.exe
Binary files differ
diff --git a/indra/tools/vstool/VSTool.sln b/indra/tools/vstool/VSTool.sln
index 8859671802..21e3d75971 100644
--- a/indra/tools/vstool/VSTool.sln
+++ b/indra/tools/vstool/VSTool.sln
@@ -1,5 +1,5 @@
-Microsoft Visual Studio Solution File, Format Version 9.00
-# Visual Studio 2005
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VSTool", "VSTool.csproj", "{96943E2D-1373-4617-A117-D0F997A94919}"
EndProject
Global
diff --git a/indra/tools/vstool/main.cs b/indra/tools/vstool/main.cs
index cc268d59d9..cc73261e30 100644
--- a/indra/tools/vstool/main.cs
+++ b/indra/tools/vstool/main.cs
@@ -550,6 +550,11 @@ namespace VSTool
case "10.00":
version = "VC90";
break;
+
+ case "11.00":
+ version = "VC100";
+ break;
+
default:
throw new ApplicationException("Unknown .sln version: " + format);
}
@@ -585,6 +590,11 @@ namespace VSTool
case "VC90":
progid = "VisualStudio.DTE.9.0";
break;
+
+ case "VC100":
+ progid = "VisualStudio.DTE.10.0";
+ break;
+
default:
throw new ApplicationException("Can't handle VS version: " + version);
}
diff --git a/indra/viewer_components/login/CMakeLists.txt b/indra/viewer_components/login/CMakeLists.txt
index fe64926da6..7720619df3 100644
--- a/indra/viewer_components/login/CMakeLists.txt
+++ b/indra/viewer_components/login/CMakeLists.txt
@@ -9,13 +9,11 @@ endif(LL_TESTS)
include(LLCommon)
include(LLMath)
include(LLXML)
-include(Pth)
include_directories(
${LLCOMMON_INCLUDE_DIRS}
${LLMATH_INCLUDE_DIRS}
${LLXML_INCLUDE_DIRS}
- ${PTH_INCLUDE_DIRS}
)
set(login_SOURCE_FILES
@@ -42,7 +40,6 @@ target_link_libraries(lllogin
${LLCOMMON_LIBRARIES}
${LLMATH_LIBRARIES}
${LLXML_LIBRARIES}
- ${PTH_LIBRARIES}
)
if(LL_TESTS)
@@ -50,11 +47,5 @@ if(LL_TESTS)
lllogin.cpp
)
- set_source_files_properties(
- lllogin.cpp
- PROPERTIES
- LL_TEST_ADDITIONAL_LIBRARIES "${PTH_LIBRARIES}"
- )
-
LL_ADD_PROJECT_UNIT_TESTS(lllogin "${lllogin_TEST_SOURCE_FILES}")
endif(LL_TESTS)
diff --git a/indra/viewer_components/login/lllogin.cpp b/indra/viewer_components/login/lllogin.cpp
index 651d803e0d..d480b63094 100644
--- a/indra/viewer_components/login/lllogin.cpp
+++ b/indra/viewer_components/login/lllogin.cpp
@@ -178,6 +178,8 @@ void LLLogin::Impl::login_(LLCoros::self& self, std::string uri, LLSD login_para
request["uri"] = uri;
request["reply"] = replyPump.getName();
rewrittenURIs = postAndWait(self, request, srv_pump_name, filter);
+ // EXP-772: If rewrittenURIs fail, try original URI as a fallback.
+ rewrittenURIs.append(uri);
} // we no longer need the filter
LLEventPump& xmlrpcPump(LLEventPumps::instance().obtain("LLXMLRPCTransaction"));
diff --git a/indra/viewer_components/updater/CMakeLists.txt b/indra/viewer_components/updater/CMakeLists.txt
index 0e288bb496..ef82290b47 100644
--- a/indra/viewer_components/updater/CMakeLists.txt
+++ b/indra/viewer_components/updater/CMakeLists.txt
@@ -17,8 +17,8 @@ include_directories(
${LLCOMMON_INCLUDE_DIRS}
${LLMESSAGE_INCLUDE_DIRS}
${LLPLUGIN_INCLUDE_DIRS}
- ${LLVFS_INCLUDE_DIRS}
- ${CURL_INCLUDE_DIRS}
+ ${LLVFS_INCLUDE_DIRS}
+ ${CURL_INCLUDE_DIRS}
)
set(updater_service_SOURCE_FILES
@@ -51,7 +51,7 @@ target_link_libraries(llupdaterservice
${LLCOMMON_LIBRARIES}
${LLMESSAGE_LIBRARIES}
${LLPLUGIN_LIBRARIES}
- ${LLVFS_LIBRARIES}
+ ${LLVFS_LIBRARIES}
)
if(LL_TESTS)
diff --git a/indra/viewer_components/updater/llupdatedownloader.cpp b/indra/viewer_components/updater/llupdatedownloader.cpp
index c17a50e242..19ac418e9e 100644
--- a/indra/viewer_components/updater/llupdatedownloader.cpp
+++ b/indra/viewer_components/updater/llupdatedownloader.cpp
@@ -24,19 +24,22 @@
*/
#include "linden_common.h"
+
+#include "llupdatedownloader.h"
+
#include <stdexcept>
#include <boost/format.hpp>
#include <boost/lexical_cast.hpp>
#include <curl/curl.h>
#include "lldir.h"
+#include "llevents.h"
#include "llfile.h"
#include "llmd5.h"
#include "llsd.h"
#include "llsdserialize.h"
#include "llthread.h"
-#include "llupdatedownloader.h"
#include "llupdaterservice.h"
-
+#include "llcurl.h"
class LLUpdateDownloader::Implementation:
public LLThread
@@ -45,18 +48,25 @@ public:
Implementation(LLUpdateDownloader::Client & client);
~Implementation();
void cancel(void);
- void download(LLURI const & uri, std::string const & hash);
+ void download(LLURI const & uri,
+ std::string const & hash,
+ std::string const & updateVersion,
+ bool required);
bool isDownloading(void);
size_t onHeader(void * header, size_t size);
size_t onBody(void * header, size_t size);
+ int onProgress(double downloadSize, double bytesDownloaded);
void resume(void);
+ void setBandwidthLimit(U64 bytesPerSecond);
private:
+ curl_off_t mBandwidthLimit;
bool mCancelled;
LLUpdateDownloader::Client & mClient;
CURL * mCurl;
LLSD mDownloadData;
llofstream mDownloadStream;
+ unsigned char mDownloadPercent;
std::string mDownloadRecordPath;
curl_slist * mHeaderList;
@@ -113,9 +123,12 @@ void LLUpdateDownloader::cancel(void)
}
-void LLUpdateDownloader::download(LLURI const & uri, std::string const & hash)
+void LLUpdateDownloader::download(LLURI const & uri,
+ std::string const & hash,
+ std::string const & updateVersion,
+ bool required)
{
- mImplementation->download(uri, hash);
+ mImplementation->download(uri, hash, updateVersion, required);
}
@@ -131,6 +144,12 @@ void LLUpdateDownloader::resume(void)
}
+void LLUpdateDownloader::setBandwidthLimit(U64 bytesPerSecond)
+{
+ mImplementation->setBandwidthLimit(bytesPerSecond);
+}
+
+
// LLUpdateDownloader::Implementation
//-----------------------------------------------------------------------------
@@ -149,14 +168,27 @@ namespace {
size_t bytes = blockSize * blocks;
return reinterpret_cast<LLUpdateDownloader::Implementation *>(downloader)->onHeader(data, bytes);
}
+
+
+ int progress_callback(void * downloader,
+ double dowloadTotal,
+ double downloadNow,
+ double uploadTotal,
+ double uploadNow)
+ {
+ return reinterpret_cast<LLUpdateDownloader::Implementation *>(downloader)->
+ onProgress(dowloadTotal, downloadNow);
+ }
}
LLUpdateDownloader::Implementation::Implementation(LLUpdateDownloader::Client & client):
LLThread("LLUpdateDownloader"),
+ mBandwidthLimit(0),
mCancelled(false),
mClient(client),
mCurl(0),
+ mDownloadPercent(0),
mHeaderList(0)
{
CURLcode code = curl_global_init(CURL_GLOBAL_ALL); // Just in case.
@@ -166,13 +198,19 @@ LLUpdateDownloader::Implementation::Implementation(LLUpdateDownloader::Client &
LLUpdateDownloader::Implementation::~Implementation()
{
- if(isDownloading()) {
+ if(isDownloading())
+ {
cancel();
shutdown();
- } else {
+ }
+ else
+ {
; // No op.
}
- if(mCurl) curl_easy_cleanup(mCurl);
+ if(mCurl)
+ {
+ LLCurl::deleteEasyHandle(mCurl);
+ }
}
@@ -182,12 +220,17 @@ void LLUpdateDownloader::Implementation::cancel(void)
}
-void LLUpdateDownloader::Implementation::download(LLURI const & uri, std::string const & hash)
+void LLUpdateDownloader::Implementation::download(LLURI const & uri,
+ std::string const & hash,
+ std::string const & updateVersion,
+ bool required)
{
if(isDownloading()) mClient.downloadError("download in progress");
mDownloadRecordPath = downloadMarkerPath();
mDownloadData = LLSD();
+ mDownloadData["required"] = required;
+ mDownloadData["update_version"] = updateVersion;
try {
startDownloading(uri, hash);
} catch(DownloadError const & e) {
@@ -233,12 +276,18 @@ void LLUpdateDownloader::Implementation::resume(void)
resumeDownloading(fileStatus.st_size);
} else if(!validateDownload()) {
LLFile::remove(filePath);
- download(LLURI(mDownloadData["url"].asString()), mDownloadData["hash"].asString());
+ download(LLURI(mDownloadData["url"].asString()),
+ mDownloadData["hash"].asString(),
+ mDownloadData["update_version"].asString(),
+ mDownloadData["required"].asBoolean());
} else {
mClient.downloadComplete(mDownloadData);
}
} else {
- download(LLURI(mDownloadData["url"].asString()), mDownloadData["hash"].asString());
+ download(LLURI(mDownloadData["url"].asString()),
+ mDownloadData["hash"].asString(),
+ mDownloadData["update_version"].asString(),
+ mDownloadData["required"].asBoolean());
}
} catch(DownloadError & e) {
mClient.downloadError(e.what());
@@ -246,6 +295,20 @@ void LLUpdateDownloader::Implementation::resume(void)
}
+void LLUpdateDownloader::Implementation::setBandwidthLimit(U64 bytesPerSecond)
+{
+ if((mBandwidthLimit != bytesPerSecond) && isDownloading() && !mDownloadData["required"].asBoolean()) {
+ llassert(mCurl != 0);
+ mBandwidthLimit = bytesPerSecond;
+ CURLcode code = curl_easy_setopt(mCurl, CURLOPT_MAX_RECV_SPEED_LARGE, &mBandwidthLimit);
+ if(code != CURLE_OK) LL_WARNS("UpdateDownload") <<
+ "unable to change dowload bandwidth" << LL_ENDL;
+ } else {
+ mBandwidthLimit = bytesPerSecond;
+ }
+}
+
+
size_t LLUpdateDownloader::Implementation::onHeader(void * buffer, size_t size)
{
char const * headerPtr = reinterpret_cast<const char *> (buffer);
@@ -290,6 +353,30 @@ size_t LLUpdateDownloader::Implementation::onBody(void * buffer, size_t size)
}
+int LLUpdateDownloader::Implementation::onProgress(double downloadSize, double bytesDownloaded)
+{
+ int downloadPercent = static_cast<int>(100. * (bytesDownloaded / downloadSize));
+ if(downloadPercent > mDownloadPercent) {
+ mDownloadPercent = downloadPercent;
+
+ LLSD event;
+ event["pump"] = LLUpdaterService::pumpName();
+ LLSD payload;
+ payload["type"] = LLSD(LLUpdaterService::PROGRESS);
+ payload["download_size"] = downloadSize;
+ payload["bytes_downloaded"] = bytesDownloaded;
+ event["payload"] = payload;
+ LLEventPumps::instance().obtain("mainlooprepeater").post(event);
+
+ LL_INFOS("UpdateDownload") << "progress event " << payload << LL_ENDL;
+ } else {
+ ; // Keep events to a reasonalbe number.
+ }
+
+ return 0;
+}
+
+
void LLUpdateDownloader::Implementation::run(void)
{
CURLcode code = curl_easy_perform(mCurl);
@@ -325,9 +412,12 @@ void LLUpdateDownloader::Implementation::run(void)
void LLUpdateDownloader::Implementation::initializeCurlGet(std::string const & url, bool processHeader)
{
- if(mCurl == 0) {
- mCurl = curl_easy_init();
- } else {
+ if(mCurl == 0)
+ {
+ mCurl = LLCurl::newEasyHandle();
+ }
+ else
+ {
curl_easy_reset(mCurl);
}
@@ -343,6 +433,14 @@ void LLUpdateDownloader::Implementation::initializeCurlGet(std::string const & u
}
throwOnCurlError(curl_easy_setopt(mCurl, CURLOPT_HTTPGET, true));
throwOnCurlError(curl_easy_setopt(mCurl, CURLOPT_URL, url.c_str()));
+ throwOnCurlError(curl_easy_setopt(mCurl, CURLOPT_PROGRESSFUNCTION, &progress_callback));
+ throwOnCurlError(curl_easy_setopt(mCurl, CURLOPT_PROGRESSDATA, this));
+ throwOnCurlError(curl_easy_setopt(mCurl, CURLOPT_NOPROGRESS, false));
+ // if it's a required update set the bandwidth limit to 0 (unlimited)
+ curl_off_t limit = mDownloadData["required"].asBoolean() ? 0 : mBandwidthLimit;
+ throwOnCurlError(curl_easy_setopt(mCurl, CURLOPT_MAX_RECV_SPEED_LARGE, limit));
+
+ mDownloadPercent = 0;
}
diff --git a/indra/viewer_components/updater/llupdatedownloader.h b/indra/viewer_components/updater/llupdatedownloader.h
index 1b3d7480fd..0d635640cf 100644
--- a/indra/viewer_components/updater/llupdatedownloader.h
+++ b/indra/viewer_components/updater/llupdatedownloader.h
@@ -52,7 +52,10 @@ public:
void cancel(void);
// Start a new download.
- void download(LLURI const & uri, std::string const & hash);
+ void download(LLURI const & uri,
+ std::string const & hash,
+ std::string const & updateVersion,
+ bool required=false);
// Returns true if a download is in progress.
bool isDownloading(void);
@@ -60,6 +63,9 @@ public:
// Resume a partial download.
void resume(void);
+ // Set a limit on the dowload rate.
+ void setBandwidthLimit(U64 bytesPerSecond);
+
private:
boost::shared_ptr<Implementation> mImplementation;
};
@@ -76,6 +82,7 @@ public:
// url - source (remote) location
// hash - the md5 sum that should match the installer file.
// path - destination (local) location
+ // required - boolean indicating if this is a required update.
// size - the size of the installer in bytes
virtual void downloadComplete(LLSD const & data) = 0;
diff --git a/indra/viewer_components/updater/llupdateinstaller.cpp b/indra/viewer_components/updater/llupdateinstaller.cpp
index 6e69bcf28b..c7b70c2de8 100644
--- a/indra/viewer_components/updater/llupdateinstaller.cpp
+++ b/indra/viewer_components/updater/llupdateinstaller.cpp
@@ -28,7 +28,13 @@
#include "llapr.h"
#include "llprocesslauncher.h"
#include "llupdateinstaller.h"
-#include "lldir.h"
+#include "lldir.h"
+
+
+#if defined(LL_WINDOWS)
+#pragma warning(disable: 4702) // disable 'unreachable code' so we can use lexical_cast (really!).
+#endif
+#include <boost/lexical_cast.hpp>
namespace {
@@ -47,7 +53,10 @@ namespace {
}
-int ll_install_update(std::string const & script, std::string const & updatePath, LLInstallScriptMode mode)
+int ll_install_update(std::string const & script,
+ std::string const & updatePath,
+ bool required,
+ LLInstallScriptMode mode)
{
std::string actualScriptPath;
switch(mode) {
@@ -73,6 +82,7 @@ int ll_install_update(std::string const & script, std::string const & updatePath
launcher.setExecutable(actualScriptPath);
launcher.addArgument(updatePath);
launcher.addArgument(ll_install_failed_marker_path().c_str());
+ launcher.addArgument(boost::lexical_cast<std::string>(required));
int result = launcher.launch();
launcher.orphan();
diff --git a/indra/viewer_components/updater/llupdateinstaller.h b/indra/viewer_components/updater/llupdateinstaller.h
index 6ce08ce6fa..fe5b1d19b5 100644
--- a/indra/viewer_components/updater/llupdateinstaller.h
+++ b/indra/viewer_components/updater/llupdateinstaller.h
@@ -42,9 +42,10 @@ enum LLInstallScriptMode {
// that the current application terminate once this function is called.
//
int ll_install_update(
- std::string const & script, // Script to execute.
- std::string const & updatePath, // Path to update file.
- LLInstallScriptMode mode=LL_COPY_INSTALL_SCRIPT_TO_TEMP); // Run in place or copy to temp?
+ std::string const & script, // Script to execute.
+ std::string const & updatePath, // Path to update file.
+ bool required, // Is the update required.
+ LLInstallScriptMode mode=LL_COPY_INSTALL_SCRIPT_TO_TEMP); // Run in place or copy to temp?
//
diff --git a/indra/viewer_components/updater/llupdaterservice.cpp b/indra/viewer_components/updater/llupdaterservice.cpp
index cc60eaead2..2e18218667 100644
--- a/indra/viewer_components/updater/llupdaterservice.cpp
+++ b/indra/viewer_components/updater/llupdaterservice.cpp
@@ -25,10 +25,11 @@
#include "linden_common.h"
+#include "llupdaterservice.h"
+
#include "llupdatedownloader.h"
#include "llevents.h"
#include "lltimer.h"
-#include "llupdaterservice.h"
#include "llupdatechecker.h"
#include "llupdateinstaller.h"
#include "llversionviewer.h"
@@ -98,6 +99,8 @@ class LLUpdaterServiceImpl :
LLUpdaterService::app_exit_callback_t mAppExitCallback;
+ LLUpdaterService::eUpdaterState mState;
+
LOG_CLASS(LLUpdaterServiceImpl);
public:
@@ -111,12 +114,15 @@ public:
const std::string& version);
void setCheckPeriod(unsigned int seconds);
+ void setBandwidthLimit(U64 bytesPerSecond);
void startChecking(bool install_if_ready);
void stopChecking();
bool isChecking();
+ LLUpdaterService::eUpdaterState getState();
void setAppExitCallback(LLUpdaterService::app_exit_callback_t aecb) { mAppExitCallback = aecb;}
+ std::string updatedVersion(void);
bool checkForInstall(bool launchInstaller); // Test if a local install is ready.
bool checkForResume(); // Test for resumeable d/l.
@@ -138,7 +144,10 @@ public:
bool onMainLoop(LLSD const & event);
private:
+ std::string mNewVersion;
+
void restartTimer(unsigned int seconds);
+ void setState(LLUpdaterService::eUpdaterState state);
void stopTimer();
};
@@ -149,7 +158,8 @@ LLUpdaterServiceImpl::LLUpdaterServiceImpl() :
mIsDownloading(false),
mCheckPeriod(0),
mUpdateChecker(*this),
- mUpdateDownloader(*this)
+ mUpdateDownloader(*this),
+ mState(LLUpdaterService::INITIAL)
{
}
@@ -183,6 +193,11 @@ void LLUpdaterServiceImpl::setCheckPeriod(unsigned int seconds)
mCheckPeriod = seconds;
}
+void LLUpdaterServiceImpl::setBandwidthLimit(U64 bytesPerSecond)
+{
+ mUpdateDownloader.setBandwidthLimit(bytesPerSecond);
+}
+
void LLUpdaterServiceImpl::startChecking(bool install_if_ready)
{
if(mUrl.empty() || mChannel.empty() || mVersion.empty())
@@ -201,10 +216,16 @@ void LLUpdaterServiceImpl::startChecking(bool install_if_ready)
if(!mIsDownloading)
{
+ setState(LLUpdaterService::CHECKING_FOR_UPDATE);
+
// Checking can only occur during the mainloop.
// reset the timer to 0 so that the next mainloop event
// triggers a check;
restartTimer(0);
+ }
+ else
+ {
+ setState(LLUpdaterService::DOWNLOADING);
}
}
}
@@ -222,6 +243,8 @@ void LLUpdaterServiceImpl::stopChecking()
mUpdateDownloader.cancel();
mIsDownloading = false;
}
+
+ setState(LLUpdaterService::TERMINAL);
}
bool LLUpdaterServiceImpl::isChecking()
@@ -229,6 +252,16 @@ bool LLUpdaterServiceImpl::isChecking()
return mIsChecking;
}
+LLUpdaterService::eUpdaterState LLUpdaterServiceImpl::getState()
+{
+ return mState;
+}
+
+std::string LLUpdaterServiceImpl::updatedVersion(void)
+{
+ return mNewVersion;
+}
+
bool LLUpdaterServiceImpl::checkForInstall(bool launchInstaller)
{
bool foundInstall = false; // return true if install is found.
@@ -266,10 +299,13 @@ bool LLUpdaterServiceImpl::checkForInstall(bool launchInstaller)
{
if(launchInstaller)
{
+ setState(LLUpdaterService::INSTALLING);
+
LLFile::remove(update_marker_path());
int result = ll_install_update(install_script_path(),
update_info["path"].asString(),
+ update_info["required"].asBoolean(),
install_script_mode());
if((result == 0) && mAppExitCallback)
@@ -304,6 +340,7 @@ bool LLUpdaterServiceImpl::checkForResume()
if(download_info["current_version"].asString() == ll_get_version())
{
mIsDownloading = true;
+ mNewVersion = download_info["update_version"].asString();
mUpdateDownloader.resume();
result = true;
}
@@ -324,6 +361,7 @@ void LLUpdaterServiceImpl::error(std::string const & message)
{
if(mIsChecking)
{
+ setState(LLUpdaterService::TEMPORARY_ERROR);
restartTimer(mCheckPeriod);
}
}
@@ -333,8 +371,10 @@ void LLUpdaterServiceImpl::optionalUpdate(std::string const & newVersion,
std::string const & hash)
{
stopTimer();
+ mNewVersion = newVersion;
mIsDownloading = true;
- mUpdateDownloader.download(uri, hash);
+ setState(LLUpdaterService::DOWNLOADING);
+ mUpdateDownloader.download(uri, hash, newVersion, false);
}
void LLUpdaterServiceImpl::requiredUpdate(std::string const & newVersion,
@@ -342,8 +382,10 @@ void LLUpdaterServiceImpl::requiredUpdate(std::string const & newVersion,
std::string const & hash)
{
stopTimer();
+ mNewVersion = newVersion;
mIsDownloading = true;
- mUpdateDownloader.download(uri, hash);
+ setState(LLUpdaterService::DOWNLOADING);
+ mUpdateDownloader.download(uri, hash, newVersion, true);
}
void LLUpdaterServiceImpl::upToDate(void)
@@ -352,6 +394,8 @@ void LLUpdaterServiceImpl::upToDate(void)
{
restartTimer(mCheckPeriod);
}
+
+ setState(LLUpdaterService::UP_TO_DATE);
}
void LLUpdaterServiceImpl::downloadComplete(LLSD const & data)
@@ -367,8 +411,12 @@ void LLUpdaterServiceImpl::downloadComplete(LLSD const & data)
event["pump"] = LLUpdaterService::pumpName();
LLSD payload;
payload["type"] = LLSD(LLUpdaterService::DOWNLOAD_COMPLETE);
+ payload["required"] = data["required"];
+ payload["version"] = mNewVersion;
event["payload"] = payload;
LLEventPumps::instance().obtain("mainlooprepeater").post(event);
+
+ setState(LLUpdaterService::TERMINAL);
}
void LLUpdaterServiceImpl::downloadError(std::string const & message)
@@ -390,6 +438,8 @@ void LLUpdaterServiceImpl::downloadError(std::string const & message)
payload["message"] = message;
event["payload"] = payload;
LLEventPumps::instance().obtain("mainlooprepeater").post(event);
+
+ setState(LLUpdaterService::FAILURE);
}
void LLUpdaterServiceImpl::restartTimer(unsigned int seconds)
@@ -397,11 +447,33 @@ void LLUpdaterServiceImpl::restartTimer(unsigned int seconds)
LL_INFOS("UpdaterService") << "will check for update again in " <<
seconds << " seconds" << LL_ENDL;
mTimer.start();
- mTimer.setTimerExpirySec(seconds);
+ mTimer.setTimerExpirySec((F32)seconds);
LLEventPumps::instance().obtain("mainloop").listen(
sListenerName, boost::bind(&LLUpdaterServiceImpl::onMainLoop, this, _1));
}
+void LLUpdaterServiceImpl::setState(LLUpdaterService::eUpdaterState state)
+{
+ if(state != mState)
+ {
+ mState = state;
+
+ LLSD event;
+ event["pump"] = LLUpdaterService::pumpName();
+ LLSD payload;
+ payload["type"] = LLSD(LLUpdaterService::STATE_CHANGE);
+ payload["state"] = state;
+ event["payload"] = payload;
+ LLEventPumps::instance().obtain("mainlooprepeater").post(event);
+
+ LL_INFOS("UpdaterService") << "setting state to " << state << LL_ENDL;
+ }
+ else
+ {
+ ; // State unchanged; noop.
+ }
+}
+
void LLUpdaterServiceImpl::stopTimer()
{
mTimer.stop();
@@ -417,6 +489,12 @@ bool LLUpdaterServiceImpl::onMainLoop(LLSD const & event)
// Check for failed install.
if(LLFile::isfile(ll_install_failed_marker_path()))
{
+ int requiredValue = 0;
+ {
+ llifstream stream(ll_install_failed_marker_path());
+ stream >> requiredValue;
+ if(stream.fail()) requiredValue = 0;
+ }
// TODO: notify the user.
llinfos << "found marker " << ll_install_failed_marker_path() << llendl;
llinfos << "last install attempt failed" << llendl;
@@ -424,11 +502,15 @@ bool LLUpdaterServiceImpl::onMainLoop(LLSD const & event)
LLSD event;
event["type"] = LLSD(LLUpdaterService::INSTALL_ERROR);
+ event["required"] = LLSD(requiredValue);
LLEventPumps::instance().obtain(LLUpdaterService::pumpName()).post(event);
+
+ setState(LLUpdaterService::TERMINAL);
}
else
{
mUpdateChecker.check(mProtocolVersion, mUrl, mPath, mChannel, mVersion);
+ setState(LLUpdaterService::CHECKING_FOR_UPDATE);
}
}
else
@@ -449,6 +531,11 @@ std::string const & LLUpdaterService::pumpName(void)
return name;
}
+bool LLUpdaterService::updateReadyToInstall(void)
+{
+ return LLFile::isfile(update_marker_path());
+}
+
LLUpdaterService::LLUpdaterService()
{
if(gUpdater.expired())
@@ -480,6 +567,11 @@ void LLUpdaterService::setCheckPeriod(unsigned int seconds)
{
mImpl->setCheckPeriod(seconds);
}
+
+void LLUpdaterService::setBandwidthLimit(U64 bytesPerSecond)
+{
+ mImpl->setBandwidthLimit(bytesPerSecond);
+}
void LLUpdaterService::startChecking(bool install_if_ready)
{
@@ -496,11 +588,21 @@ bool LLUpdaterService::isChecking()
return mImpl->isChecking();
}
+LLUpdaterService::eUpdaterState LLUpdaterService::getState()
+{
+ return mImpl->getState();
+}
+
void LLUpdaterService::setImplAppExitCallback(LLUpdaterService::app_exit_callback_t aecb)
{
return mImpl->setAppExitCallback(aecb);
}
+std::string LLUpdaterService::updatedVersion(void)
+{
+ return mImpl->updatedVersion();
+}
+
std::string const & ll_get_version(void) {
static std::string version("");
diff --git a/indra/viewer_components/updater/llupdaterservice.h b/indra/viewer_components/updater/llupdaterservice.h
index 752a6f834b..450f19c1c6 100644
--- a/indra/viewer_components/updater/llupdaterservice.h
+++ b/indra/viewer_components/updater/llupdaterservice.h
@@ -43,12 +43,28 @@ public:
// Name of the event pump through which update events will be delivered.
static std::string const & pumpName(void);
+ // Returns true if an update has been completely downloaded and is now ready to install.
+ static bool updateReadyToInstall(void);
+
// Type codes for events posted by this service. Stored the event's 'type' element.
- enum eUpdateEvent {
+ enum eUpdaterEvent {
INVALID,
DOWNLOAD_COMPLETE,
DOWNLOAD_ERROR,
- INSTALL_ERROR
+ INSTALL_ERROR,
+ PROGRESS,
+ STATE_CHANGE
+ };
+
+ enum eUpdaterState {
+ INITIAL,
+ CHECKING_FOR_UPDATE,
+ TEMPORARY_ERROR,
+ DOWNLOADING,
+ INSTALLING,
+ UP_TO_DATE,
+ TERMINAL,
+ FAILURE
};
LLUpdaterService();
@@ -61,10 +77,12 @@ public:
const std::string& version);
void setCheckPeriod(unsigned int seconds);
+ void setBandwidthLimit(U64 bytesPerSecond);
void startChecking(bool install_if_ready = false);
void stopChecking();
bool isChecking();
+ eUpdaterState getState();
typedef boost::function<void (void)> app_exit_callback_t;
template <typename F>
@@ -73,6 +91,11 @@ public:
app_exit_callback_t aecb = callable;
setImplAppExitCallback(aecb);
}
+
+ // If an update is or has been downloaded, this method will return the
+ // version string for that update. An empty string will be returned
+ // otherwise.
+ std::string updatedVersion(void);
private:
boost::shared_ptr<LLUpdaterServiceImpl> mImpl;
diff --git a/indra/viewer_components/updater/scripts/darwin/update_install b/indra/viewer_components/updater/scripts/darwin/update_install
index b174b3570a..e7f36dc5a3 100644
--- a/indra/viewer_components/updater/scripts/darwin/update_install
+++ b/indra/viewer_components/updater/scripts/darwin/update_install
@@ -5,5 +5,6 @@
# to a marker file which should be created if the installer fails.q
#
-open ../Resources/mac-updater.app --args -dmg "$1" -name "Second Life Viewer 2" -marker "$2"
+cd "$(dirname "$0")"
+(../Resources/mac-updater.app/Contents/MacOS/mac-updater -dmg "$1" -name "Second Life Viewer"; if [ $? -ne 0 ]; then echo $3 >> "$2"; fi;) &
exit 0
diff --git a/indra/viewer_components/updater/scripts/linux/update_install b/indra/viewer_components/updater/scripts/linux/update_install
index fef5ef7d09..e0505a9f72 100644
--- a/indra/viewer_components/updater/scripts/linux/update_install
+++ b/indra/viewer_components/updater/scripts/linux/update_install
@@ -1,10 +1,10 @@
#! /bin/bash
-INSTALL_DIR=$(cd "$(dirname $0)/.." ; pwd)
-export LD_LIBRARY_PATH=$INSTALL_DIR/lib
-bin/linux-updater.bin --file "$1" --dest "$INSTALL_DIR" --name "Second Life Viewer 2" --stringsdir "$INSTALL_DIR/skins/default/xui/en" --stringsfile "strings.xml"
+INSTALL_DIR=$(cd "$(dirname "$0")/.." ; pwd)
+export LD_LIBRARY_PATH="$INSTALL_DIR/lib"
+bin/linux-updater.bin --file "$1" --dest "$INSTALL_DIR" --name "Second Life Viewer" --stringsdir "$INSTALL_DIR/skins/default/xui/en" --stringsfile "strings.xml"
if [ $? -ne 0 ]
- then touch $2
+ then echo $3 >> "$2"
fi
-rm -f $1
+rm -f "$1"
diff --git a/indra/viewer_components/updater/scripts/windows/update_install.bat b/indra/viewer_components/updater/scripts/windows/update_install.bat
index 42e148a707..96687226a8 100644
--- a/indra/viewer_components/updater/scripts/windows/update_install.bat
+++ b/indra/viewer_components/updater/scripts/windows/update_install.bat
@@ -1,3 +1,3 @@
start /WAIT %1 /SKIP_DIALOGS
-IF ERRORLEVEL 1 ECHO %ERRORLEVEL% > %2
+IF ERRORLEVEL 1 ECHO %3 > %2
DEL %1
diff --git a/indra/viewer_components/updater/tests/llupdaterservice_test.cpp b/indra/viewer_components/updater/tests/llupdaterservice_test.cpp
index 04ed4e6364..e19d5724f1 100644
--- a/indra/viewer_components/updater/tests/llupdaterservice_test.cpp
+++ b/indra/viewer_components/updater/tests/llupdaterservice_test.cpp
@@ -1,199 +1,194 @@
-/**
- * @file llupdaterservice_test.cpp
- * @brief Tests of llupdaterservice.cpp.
- *
- * $LicenseInfo:firstyear=2010&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-// Precompiled header
-#include "linden_common.h"
-// associated header
-#include "../llupdaterservice.h"
-#include "../llupdatechecker.h"
-#include "../llupdatedownloader.h"
-#include "../llupdateinstaller.h"
-
-#include "../../../test/lltut.h"
-//#define DEBUG_ON
-#include "../../../test/debug.h"
-
-#include "llevents.h"
-#include "lldir.h"
-
-/*****************************************************************************
-* MOCK'd
-*****************************************************************************/
-LLUpdateChecker::LLUpdateChecker(LLUpdateChecker::Client & client)
-{}
-void LLUpdateChecker::check(std::string const & protocolVersion, std::string const & hostUrl,
- std::string const & servicePath, std::string channel, std::string version)
-{}
-LLUpdateDownloader::LLUpdateDownloader(Client & ) {}
-void LLUpdateDownloader::download(LLURI const & , std::string const &){}
-
-class LLDir_Mock : public LLDir
-{
- void initAppDirs(const std::string &app_name,
- const std::string& app_read_only_data_dir = "") {}
- U32 countFilesInDir(const std::string &dirname, const std::string &mask)
- {
- return 0;
- }
-
- BOOL getNextFileInDir(const std::string &dirname,
- const std::string &mask,
- std::string &fname)
- {
- return false;
- }
- void getRandomFileInDir(const std::string &dirname,
- const std::string &mask,
- std::string &fname) {}
- std::string getCurPath() { return ""; }
- BOOL fileExists(const std::string &filename) const { return false; }
- std::string getLLPluginLauncher() { return ""; }
- std::string getLLPluginFilename(std::string base_name) { return ""; }
-
-} gDirUtil;
-LLDir* gDirUtilp = &gDirUtil;
-LLDir::LLDir() {}
-LLDir::~LLDir() {}
-S32 LLDir::deleteFilesInDir(const std::string &dirname,
- const std::string &mask)
-{ return 0; }
-
-void LLDir::setChatLogsDir(const std::string &path){}
-void LLDir::setPerAccountChatLogsDir(const std::string &username){}
-void LLDir::setLindenUserDir(const std::string &username){}
-void LLDir::setSkinFolder(const std::string &skin_folder){}
-bool LLDir::setCacheDir(const std::string &path){ return true; }
-void LLDir::dumpCurrentDirectories() {}
-
-std::string LLDir::getExpandedFilename(ELLPath location,
- const std::string &filename) const
-{
- return "";
-}
-
-std::string LLUpdateDownloader::downloadMarkerPath(void)
-{
- return "";
-}
-
-void LLUpdateDownloader::resume(void) {}
-void LLUpdateDownloader::cancel(void) {}
-
-int ll_install_update(std::string const &, std::string const &, LLInstallScriptMode)
-{
- return 0;
-}
-
-std::string const & ll_install_failed_marker_path()
-{
- static std::string wubba;
- return wubba;
-}
-
-/*
-#pragma warning(disable: 4273)
-llus_mock_llifstream::llus_mock_llifstream(const std::string& _Filename,
- ios_base::openmode _Mode,
- int _Prot) :
- std::basic_istream<char,std::char_traits< char > >(NULL,true)
-{}
-
-llus_mock_llifstream::~llus_mock_llifstream() {}
-bool llus_mock_llifstream::is_open() const {return true;}
-void llus_mock_llifstream::close() {}
-*/
-
-/*****************************************************************************
-* TUT
-*****************************************************************************/
-namespace tut
-{
- struct llupdaterservice_data
- {
- llupdaterservice_data() :
- pumps(LLEventPumps::instance()),
- test_url("dummy_url"),
- test_channel("dummy_channel"),
- test_version("dummy_version")
- {}
- LLEventPumps& pumps;
- std::string test_url;
- std::string test_channel;
- std::string test_version;
- };
-
- typedef test_group<llupdaterservice_data> llupdaterservice_group;
- typedef llupdaterservice_group::object llupdaterservice_object;
- llupdaterservice_group llupdaterservicegrp("LLUpdaterService");
-
- template<> template<>
- void llupdaterservice_object::test<1>()
- {
- DEBUG;
- LLUpdaterService updater;
- bool got_usage_error = false;
- try
- {
- updater.startChecking();
- }
- catch(LLUpdaterService::UsageError)
- {
- got_usage_error = true;
- }
- ensure("Caught start before params", got_usage_error);
- }
-
- template<> template<>
- void llupdaterservice_object::test<2>()
- {
- DEBUG;
- LLUpdaterService updater;
- bool got_usage_error = false;
- try
- {
- updater.initialize("1.0",test_url, "update" ,test_channel, test_version);
- updater.startChecking();
- updater.initialize("1.0", "other_url", "update", test_channel, test_version);
- }
- catch(LLUpdaterService::UsageError)
- {
- got_usage_error = true;
- }
- ensure("Caught params while running", got_usage_error);
- }
-
- template<> template<>
- void llupdaterservice_object::test<3>()
- {
- DEBUG;
- LLUpdaterService updater;
- updater.initialize("1.0", test_url, "update", test_channel, test_version);
- updater.startChecking();
- ensure(updater.isChecking());
- updater.stopChecking();
- ensure(!updater.isChecking());
- }
-}
+/**
+ * @file llupdaterservice_test.cpp
+ * @brief Tests of llupdaterservice.cpp.
+ *
+ * $LicenseInfo:firstyear=2010&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+// Precompiled header
+#include "linden_common.h"
+// associated header
+#include "../llupdaterservice.h"
+#include "../llupdatechecker.h"
+#include "../llupdatedownloader.h"
+#include "../llupdateinstaller.h"
+
+#include "../../../test/lltut.h"
+//#define DEBUG_ON
+#include "../../../test/debug.h"
+
+#include "llevents.h"
+#include "lldir.h"
+
+/*****************************************************************************
+* MOCK'd
+*****************************************************************************/
+LLUpdateChecker::LLUpdateChecker(LLUpdateChecker::Client & client)
+{}
+void LLUpdateChecker::check(std::string const & protocolVersion, std::string const & hostUrl,
+ std::string const & servicePath, std::string channel, std::string version)
+{}
+LLUpdateDownloader::LLUpdateDownloader(Client & ) {}
+void LLUpdateDownloader::download(LLURI const & , std::string const &, std::string const &, bool){}
+
+class LLDir_Mock : public LLDir
+{
+ void initAppDirs(const std::string &app_name,
+ const std::string& app_read_only_data_dir = "") {}
+ U32 countFilesInDir(const std::string &dirname, const std::string &mask)
+ {
+ return 0;
+ }
+
+ void getRandomFileInDir(const std::string &dirname,
+ const std::string &mask,
+ std::string &fname) {}
+ std::string getCurPath() { return ""; }
+ BOOL fileExists(const std::string &filename) const { return false; }
+ std::string getLLPluginLauncher() { return ""; }
+ std::string getLLPluginFilename(std::string base_name) { return ""; }
+
+} gDirUtil;
+LLDir* gDirUtilp = &gDirUtil;
+LLDir::LLDir() {}
+LLDir::~LLDir() {}
+S32 LLDir::deleteFilesInDir(const std::string &dirname,
+ const std::string &mask)
+{ return 0; }
+
+void LLDir::setChatLogsDir(const std::string &path){}
+void LLDir::setPerAccountChatLogsDir(const std::string &username){}
+void LLDir::setLindenUserDir(const std::string &username){}
+void LLDir::setSkinFolder(const std::string &skin_folder){}
+bool LLDir::setCacheDir(const std::string &path){ return true; }
+void LLDir::dumpCurrentDirectories() {}
+
+std::string LLDir::getExpandedFilename(ELLPath location,
+ const std::string &filename) const
+{
+ return "";
+}
+
+std::string LLUpdateDownloader::downloadMarkerPath(void)
+{
+ return "";
+}
+
+void LLUpdateDownloader::resume(void) {}
+void LLUpdateDownloader::cancel(void) {}
+void LLUpdateDownloader::setBandwidthLimit(U64 bytesPerSecond) {}
+
+int ll_install_update(std::string const &, std::string const &, bool, LLInstallScriptMode)
+{
+ return 0;
+}
+
+std::string const & ll_install_failed_marker_path()
+{
+ static std::string wubba;
+ return wubba;
+}
+
+/*
+#pragma warning(disable: 4273)
+llus_mock_llifstream::llus_mock_llifstream(const std::string& _Filename,
+ ios_base::openmode _Mode,
+ int _Prot) :
+ std::basic_istream<char,std::char_traits< char > >(NULL,true)
+{}
+
+llus_mock_llifstream::~llus_mock_llifstream() {}
+bool llus_mock_llifstream::is_open() const {return true;}
+void llus_mock_llifstream::close() {}
+*/
+
+/*****************************************************************************
+* TUT
+*****************************************************************************/
+namespace tut
+{
+ struct llupdaterservice_data
+ {
+ llupdaterservice_data() :
+ pumps(LLEventPumps::instance()),
+ test_url("dummy_url"),
+ test_channel("dummy_channel"),
+ test_version("dummy_version")
+ {}
+ LLEventPumps& pumps;
+ std::string test_url;
+ std::string test_channel;
+ std::string test_version;
+ };
+
+ typedef test_group<llupdaterservice_data> llupdaterservice_group;
+ typedef llupdaterservice_group::object llupdaterservice_object;
+ llupdaterservice_group llupdaterservicegrp("LLUpdaterService");
+
+ template<> template<>
+ void llupdaterservice_object::test<1>()
+ {
+ DEBUG;
+ LLUpdaterService updater;
+ bool got_usage_error = false;
+ try
+ {
+ updater.startChecking();
+ }
+ catch(LLUpdaterService::UsageError)
+ {
+ got_usage_error = true;
+ }
+ ensure("Caught start before params", got_usage_error);
+ }
+
+ template<> template<>
+ void llupdaterservice_object::test<2>()
+ {
+ DEBUG;
+ LLUpdaterService updater;
+ bool got_usage_error = false;
+ try
+ {
+ updater.initialize("1.0",test_url, "update" ,test_channel, test_version);
+ updater.startChecking();
+ updater.initialize("1.0", "other_url", "update", test_channel, test_version);
+ }
+ catch(LLUpdaterService::UsageError)
+ {
+ got_usage_error = true;
+ }
+ ensure("Caught params while running", got_usage_error);
+ }
+
+ template<> template<>
+ void llupdaterservice_object::test<3>()
+ {
+ DEBUG;
+ LLUpdaterService updater;
+ updater.initialize("1.0", test_url, "update", test_channel, test_version);
+ updater.startChecking();
+ ensure(updater.isChecking());
+ updater.stopChecking();
+ ensure(!updater.isChecking());
+ }
+}
diff --git a/indra/win_crash_logger/CMakeLists.txt b/indra/win_crash_logger/CMakeLists.txt
index 990dc6783e..5329c89554 100644
--- a/indra/win_crash_logger/CMakeLists.txt
+++ b/indra/win_crash_logger/CMakeLists.txt
@@ -89,4 +89,4 @@ if (WINDOWS)
)
endif (WINDOWS)
-ll_deploy_sharedlibs_command(windows-crash-logger) \ No newline at end of file
+ll_deploy_sharedlibs_command(windows-crash-logger)
diff --git a/indra/win_crash_logger/StdAfx.h b/indra/win_crash_logger/StdAfx.h
index ce70fe2994..35976658ac 100644
--- a/indra/win_crash_logger/StdAfx.h
+++ b/indra/win_crash_logger/StdAfx.h
@@ -38,7 +38,6 @@
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
-
// Windows Header Files:
#include <windows.h>
diff --git a/indra/win_crash_logger/llcrashloggerwindows.cpp b/indra/win_crash_logger/llcrashloggerwindows.cpp
index 354b7e6cc3..36d988ead7 100644
--- a/indra/win_crash_logger/llcrashloggerwindows.cpp
+++ b/indra/win_crash_logger/llcrashloggerwindows.cpp
@@ -34,7 +34,6 @@
#include "boost/tokenizer.hpp"
-#include "dbghelp.h"
#include "indra_constants.h" // CRASH_BEHAVIOR_ASK, CRASH_SETTING_NAME
#include "llerror.h"
#include "llfile.h"
@@ -297,6 +296,7 @@ void LLCrashLoggerWindows::gatherPlatformSpecificFiles()
bool LLCrashLoggerWindows::mainLoop()
{
+ llinfos << "CrashSubmitBehavior is " << mCrashBehavior << llendl;
// Note: parent hwnd is 0 (the desktop). No dlg proc. See Petzold (5th ed) HexCalc example, Chapter 11, p529
// win_crash_logger.rc has been edited by hand.
@@ -309,6 +309,7 @@ bool LLCrashLoggerWindows::mainLoop()
if (mCrashBehavior == CRASH_BEHAVIOR_ALWAYS_SEND)
{
+ llinfos << "Showing crash report submit progress window." << llendl;
ShowWindow(gHwndProgress, SW_SHOW );
sendCrashLogs();
}
@@ -355,7 +356,7 @@ bool LLCrashLoggerWindows::mainLoop()
void LLCrashLoggerWindows::updateApplication(const std::string& message)
{
- LLCrashLogger::updateApplication();
+ LLCrashLogger::updateApplication(message);
if(!message.empty()) show_progress(message);
update_messages();
}
@@ -369,8 +370,6 @@ bool LLCrashLoggerWindows::cleanup()
sleep_and_pump_messages(3);
}
PostQuitMessage(0);
+ commonCleanup();
return true;
}
-
-
-
diff --git a/indra/win_crash_logger/llcrashloggerwindows.h b/indra/win_crash_logger/llcrashloggerwindows.h
index 24c564457c..5c45a998b3 100644
--- a/indra/win_crash_logger/llcrashloggerwindows.h
+++ b/indra/win_crash_logger/llcrashloggerwindows.h
@@ -41,7 +41,6 @@ public:
virtual void updateApplication(const std::string& message = LLStringUtil::null);
virtual bool cleanup();
virtual void gatherPlatformSpecificFiles();
- //void annotateCallStack();
void setHandle(HINSTANCE hInst) { mhInst = hInst; }
private:
void ProcessDlgItemText(HWND hWnd, int nIDDlgItem);
diff --git a/indra/win_crash_logger/win_crash_logger.cpp b/indra/win_crash_logger/win_crash_logger.cpp
index 5c22053317..8e916ae437 100644
--- a/indra/win_crash_logger/win_crash_logger.cpp
+++ b/indra/win_crash_logger/win_crash_logger.cpp
@@ -24,51 +24,30 @@
* $/LicenseInfo$
*/
-// win_crash_logger.cpp : Defines the entry point for the application.
-//
-
-// Must be first include, precompiled headers.
#include "linden_common.h"
-
#include "stdafx.h"
-
#include <stdlib.h>
-
#include "llcrashloggerwindows.h"
-
-
-//
-// Implementation
-//
-
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
- llinfos << "Starting crash reporter" << llendl;
+ llinfos << "Starting crash reporter." << llendl;
LLCrashLoggerWindows app;
app.setHandle(hInstance);
- bool ok = app.init();
- if(!ok)
+ app.parseCommandOptions(__argc, __argv);
+
+ if (! app.init())
{
llwarns << "Unable to initialize application." << llendl;
return -1;
}
- // Run the application main loop
- if(!LLApp::isQuitting()) app.mainLoop();
-
- if (!app.isError())
- {
- //
- // We don't want to do cleanup here if the error handler got called -
- // the assumption is that the error handler is responsible for doing
- // app cleanup if there was a problem.
- //
- app.cleanup();
- }
+ app.mainLoop();
+ app.cleanup();
+ llinfos << "Crash reporter finished normally." << llendl;
return 0;
}